ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYWE3MjQKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNjcgQEAKK2FjbG9jYWwubTQKK2F1dG9tNHRlLmNhY2hlCitjb25maWcuaAorY29uZmlnLmguaW4KK2NvbmZpZy5oLW5ldworY29uZmlnLmxvZworY29uZmlnLnN0YXR1cworY29uZmlnLmd1ZXNzCitjb25maWcuc3ViCitjb25maWcucnBhdGgKK2NvbmZpZ3VyZQorbGlidG9vbAorc3RhbXAtaAorc3RhbXAtaC5pbgorc3RhbXAtaDEKK2dzdC1lbGVtZW50LWNoZWNrLSoubTQKK2x0bWFpbi5zaAorbWlzc2luZworbWtpbnN0YWxsZGlycworY29tcGlsZQoraW5zdGFsbC1zaAorZGVwY29tcAorYXV0b3JlZ2VuLnNoCitBQk9VVC1OTFMKKy9JTlNUQUxMCitfc3RkaW50LmgKK2dzdC1wbHVnaW5zLWdvb2QtKi50YXIuKgorLmRpcnN0YW1wCisKKy9tNAorCisuZGVwcworLmxpYnMKKyoubG8KKyoubGEKKyoubworTWFrZWZpbGUuaW4KK01ha2VmaWxlCisqfgorKi5zd3AKKyouZ2M/PworCisvbTQKKworL2V4dC9kdi9zbXB0ZV90ZXN0CisvZ3N0L211bHRpZmlsZS90ZXN0LXNwbGl0bXV4LXBhcnQtcmVhZGVyCisvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS5oCisKK3RtcC1vcmMuYworKm9yYy5oCisKKy90ZXN0cy9leGFtcGxlcy9qYWNrL2phY2tfY2xpZW50CisKK0J1aWxkCisqLnVzZXIKKyouc3VvCisqLmlwY2gKKyouc2RmCisqLm9wZW5zZGYKKyouRFNfU3RvcmUKKworL3Rlc3QtZHJpdmVyCisqLmxvZworKi50cnMKKworL2J1aWxkCisvc3VicHJvamVjdHMKZGlmZiAtLWdpdCBhLy5naXRtb2R1bGVzIGIvLmdpdG1vZHVsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU0NmNmNQotLS0gL2Rldi9udWxsCisrKyBiLy5naXRtb2R1bGVzCkBAIC0wLDAgKzEsMyBAQAorW3N1Ym1vZHVsZSAiY29tbW9uIl0KKyAgICAgICAgcGF0aCA9IGNvbW1vbgorICAgICAgICB1cmwgPSBodHRwczovL2Fub25naXQuZnJlZWRlc2t0b3Aub3JnL2dpdC9nc3RyZWFtZXIvY29tbW9uLmdpdApkaWZmIC0tZ2l0IGEvQVVUSE9SUyBiL0FVVEhPUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNlZjVhMwotLS0gL2Rldi9udWxsCisrKyBiL0FVVEhPUlMKQEAgLTAsMCArMSwyMSBAQAorRXJpayBXYWx0aGluc2VuIDxvbWVnYUB0ZW1wbGUtYmFwdGlzdC5jb20+CitNYXR0IEhvd2VsbCA8bWhvd2VsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CitCcmVudCBCcmFkYnVybiA8YmJyYWRidXJuQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK1dpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BjaGVsbG8uYmU+CitSaWNoYXJkIEJvdWx0b24gPHJpY2hhcmRAdGFydGFydXMub3JnPgorWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CitEYXZpZCBJLiBMZWhuIDxkbGVobkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CitDaHJpcyBFbWVyc29uIDxjaHJpc0B0YXJ0YXJ1cy5vcmc+CitKZW5zIFRoaWVsZSA8a2FybWVAdW5mb3JnZXR0YWJsZS5jb20+CitUaG9tYXMgTnliZXJnIDx0aG9tYXNAY29kZWZhY3Rvcnkuc2U+CitCYXN0aWVuIE5vY2VyYSA8aGFkZXNzQGhhZGVzcy5uZXQ+CitDaHJpc3RpYW4gRnJlZHJpayBLYWxhZ2VyIFNjaGFsbGVyIDxVcmFldXNAbGludXhyaXNpbmcub3JnPgorVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CitBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CitDYW1lcm9uIEh1dGNoaXNvbiA8Y2FtaEB4ZG5hLm5ldD4KK0RhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorQmVuamFtaW4gT3R0ZSA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CitSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CitKdWxpZW4gTU9VVFRFIDxqdWxpZW5AbW91dHRlLm5ldD4KK0phbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorQXJ3ZWQgdi4gTWVya2F0eiA8di5tZXJrYXR6QGdteC5uZXQ+CmRpZmYgLS1naXQgYS9DT1BZSU5HIGIvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWRkMzBhCi0tLSAvZGV2L251bGwKKysrIGIvQ09QWUlORwpAQCAtMCwwICsxLDUwNCBAQAorCQkgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLjEsIEZlYnJ1YXJ5IDE5OTkKKworIENvcHlyaWdodCAoQykgMTk5MSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworW1RoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIExlc3NlciBHUEwuICBJdCBhbHNvIGNvdW50cworIGFzIHRoZSBzdWNjZXNzb3Igb2YgdGhlIEdOVSBMaWJyYXJ5IFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGhlbmNlCisgdGhlIHZlcnNpb24gbnVtYmVyIDIuMS5dCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlcyBhcmUgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlCitmcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuCisKKyAgVGhpcyBsaWNlbnNlLCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gc29tZQorc3BlY2lhbGx5IGRlc2lnbmF0ZWQgc29mdHdhcmUgcGFja2FnZXMtLXR5cGljYWxseSBsaWJyYXJpZXMtLW9mIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCBvdGhlciBhdXRob3JzIHdobyBkZWNpZGUgdG8gdXNlIGl0LiAgWW91CitjYW4gdXNlIGl0IHRvbywgYnV0IHdlIHN1Z2dlc3QgeW91IGZpcnN0IHRoaW5rIGNhcmVmdWxseSBhYm91dCB3aGV0aGVyCit0aGlzIGxpY2Vuc2Ugb3IgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgdGhlIGJldHRlcgorc3RyYXRlZ3kgdG8gdXNlIGluIGFueSBwYXJ0aWN1bGFyIGNhc2UsIGJhc2VkIG9uIHRoZSBleHBsYW5hdGlvbnMgYmVsb3cuCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20gb2YgdXNlLAorbm90IHByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdAoreW91IGhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZQorZm9yIHRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCk7IHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldAoraXQgaWYgeW91IHdhbnQgaXQ7IHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIGFuZCB1c2UgcGllY2VzIG9mCitpdCBpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGFyZSBpbmZvcm1lZCB0aGF0IHlvdSBjYW4gZG8KK3RoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCitkaXN0cmlidXRvcnMgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZXNlCityaWdodHMuICBUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IKK3lvdSBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnkgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcworb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoreW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQorY29kZS4gIElmIHlvdSBsaW5rIG90aGVyIGNvZGUgd2l0aCB0aGUgbGlicmFyeSwgeW91IG11c3QgcHJvdmlkZQorY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzLCBzbyB0aGF0IHRoZXkgY2FuIHJlbGluayB0aGVtCit3aXRoIHRoZSBsaWJyYXJ5IGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCByZWNvbXBpbGluZworaXQuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIGEgdHdvLXN0ZXAgbWV0aG9kOiAoMSkgd2UgY29weXJpZ2h0IHRoZQorbGlicmFyeSwgYW5kICgyKSB3ZSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlLCB3aGljaCBnaXZlcyB5b3UgbGVnYWwKK3Blcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgorCisgIFRvIHByb3RlY3QgZWFjaCBkaXN0cmlidXRvciwgd2Ugd2FudCB0byBtYWtlIGl0IHZlcnkgY2xlYXIgdGhhdAordGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSBmcmVlIGxpYnJhcnkuICBBbHNvLCBpZiB0aGUgbGlicmFyeSBpcworbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHRoZSByZWNpcGllbnRzIHNob3VsZCBrbm93Cit0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwgdmVyc2lvbiwgc28gdGhhdCB0aGUgb3JpZ2luYWwKK2F1dGhvcidzIHJlcHV0YXRpb24gd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgcHJvYmxlbXMgdGhhdCBtaWdodCBiZQoraW50cm9kdWNlZCBieSBvdGhlcnMuCisMCisgIEZpbmFsbHksIHNvZnR3YXJlIHBhdGVudHMgcG9zZSBhIGNvbnN0YW50IHRocmVhdCB0byB0aGUgZXhpc3RlbmNlIG9mCithbnkgZnJlZSBwcm9ncmFtLiAgV2Ugd2lzaCB0byBtYWtlIHN1cmUgdGhhdCBhIGNvbXBhbnkgY2Fubm90CitlZmZlY3RpdmVseSByZXN0cmljdCB0aGUgdXNlcnMgb2YgYSBmcmVlIHByb2dyYW0gYnkgb2J0YWluaW5nIGEKK3Jlc3RyaWN0aXZlIGxpY2Vuc2UgZnJvbSBhIHBhdGVudCBob2xkZXIuICBUaGVyZWZvcmUsIHdlIGluc2lzdCB0aGF0CithbnkgcGF0ZW50IGxpY2Vuc2Ugb2J0YWluZWQgZm9yIGEgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBtdXN0IGJlCitjb25zaXN0ZW50IHdpdGggdGhlIGZ1bGwgZnJlZWRvbSBvZiB1c2Ugc3BlY2lmaWVkIGluIHRoaXMgbGljZW5zZS4KKworICBNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZQorb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIGxpY2Vuc2UsIHRoZSBHTlUgTGVzc2VyCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIGNlcnRhaW4gZGVzaWduYXRlZCBsaWJyYXJpZXMsIGFuZAoraXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBXZSB1c2UKK3RoaXMgbGljZW5zZSBmb3IgY2VydGFpbiBsaWJyYXJpZXMgaW4gb3JkZXIgdG8gcGVybWl0IGxpbmtpbmcgdGhvc2UKK2xpYnJhcmllcyBpbnRvIG5vbi1mcmVlIHByb2dyYW1zLgorCisgIFdoZW4gYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIGEgbGlicmFyeSwgd2hldGhlciBzdGF0aWNhbGx5IG9yIHVzaW5nCithIHNoYXJlZCBsaWJyYXJ5LCB0aGUgY29tYmluYXRpb24gb2YgdGhlIHR3byBpcyBsZWdhbGx5IHNwZWFraW5nIGEKK2NvbWJpbmVkIHdvcmssIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeS4gIFRoZSBvcmRpbmFyeQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0aGVyZWZvcmUgcGVybWl0cyBzdWNoIGxpbmtpbmcgb25seSBpZiB0aGUKK2VudGlyZSBjb21iaW5hdGlvbiBmaXRzIGl0cyBjcml0ZXJpYSBvZiBmcmVlZG9tLiAgVGhlIExlc3NlciBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBwZXJtaXRzIG1vcmUgbGF4IGNyaXRlcmlhIGZvciBsaW5raW5nIG90aGVyIGNvZGUgd2l0aAordGhlIGxpYnJhcnkuCisKKyAgV2UgY2FsbCB0aGlzIGxpY2Vuc2UgdGhlICJMZXNzZXIiIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYmVjYXVzZSBpdAorZG9lcyBMZXNzIHRvIHByb3RlY3QgdGhlIHVzZXIncyBmcmVlZG9tIHRoYW4gdGhlIG9yZGluYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlLiAgSXQgYWxzbyBwcm92aWRlcyBvdGhlciBmcmVlIHNvZnR3YXJlIGRldmVsb3BlcnMgTGVzcworb2YgYW4gYWR2YW50YWdlIG92ZXIgY29tcGV0aW5nIG5vbi1mcmVlIHByb2dyYW1zLiAgVGhlc2UgZGlzYWR2YW50YWdlcworYXJlIHRoZSByZWFzb24gd2UgdXNlIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtYW55CitsaWJyYXJpZXMuICBIb3dldmVyLCB0aGUgTGVzc2VyIGxpY2Vuc2UgcHJvdmlkZXMgYWR2YW50YWdlcyBpbiBjZXJ0YWluCitzcGVjaWFsIGNpcmN1bXN0YW5jZXMuCisKKyAgRm9yIGV4YW1wbGUsIG9uIHJhcmUgb2NjYXNpb25zLCB0aGVyZSBtYXkgYmUgYSBzcGVjaWFsIG5lZWQgdG8KK2VuY291cmFnZSB0aGUgd2lkZXN0IHBvc3NpYmxlIHVzZSBvZiBhIGNlcnRhaW4gbGlicmFyeSwgc28gdGhhdCBpdCBiZWNvbWVzCithIGRlLWZhY3RvIHN0YW5kYXJkLiAgVG8gYWNoaWV2ZSB0aGlzLCBub24tZnJlZSBwcm9ncmFtcyBtdXN0IGJlCithbGxvd2VkIHRvIHVzZSB0aGUgbGlicmFyeS4gIEEgbW9yZSBmcmVxdWVudCBjYXNlIGlzIHRoYXQgYSBmcmVlCitsaWJyYXJ5IGRvZXMgdGhlIHNhbWUgam9iIGFzIHdpZGVseSB1c2VkIG5vbi1mcmVlIGxpYnJhcmllcy4gIEluIHRoaXMKK2Nhc2UsIHRoZXJlIGlzIGxpdHRsZSB0byBnYWluIGJ5IGxpbWl0aW5nIHRoZSBmcmVlIGxpYnJhcnkgdG8gZnJlZQorc29mdHdhcmUgb25seSwgc28gd2UgdXNlIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICBJbiBvdGhlciBjYXNlcywgcGVybWlzc2lvbiB0byB1c2UgYSBwYXJ0aWN1bGFyIGxpYnJhcnkgaW4gbm9uLWZyZWUKK3Byb2dyYW1zIGVuYWJsZXMgYSBncmVhdGVyIG51bWJlciBvZiBwZW9wbGUgdG8gdXNlIGEgbGFyZ2UgYm9keSBvZgorZnJlZSBzb2Z0d2FyZS4gIEZvciBleGFtcGxlLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgR05VIEMgTGlicmFyeSBpbgorbm9uLWZyZWUgcHJvZ3JhbXMgZW5hYmxlcyBtYW55IG1vcmUgcGVvcGxlIHRvIHVzZSB0aGUgd2hvbGUgR05VCitvcGVyYXRpbmcgc3lzdGVtLCBhcyB3ZWxsIGFzIGl0cyB2YXJpYW50LCB0aGUgR05VL0xpbnV4IG9wZXJhdGluZworc3lzdGVtLgorCisgIEFsdGhvdWdoIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBMZXNzIHByb3RlY3RpdmUgb2YgdGhlCit1c2VycycgZnJlZWRvbSwgaXQgZG9lcyBlbnN1cmUgdGhhdCB0aGUgdXNlciBvZiBhIHByb2dyYW0gdGhhdCBpcworbGlua2VkIHdpdGggdGhlIExpYnJhcnkgaGFzIHRoZSBmcmVlZG9tIGFuZCB0aGUgd2hlcmV3aXRoYWwgdG8gcnVuCit0aGF0IHByb2dyYW0gdXNpbmcgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5LgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LiAgUGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEKKyJ3b3JrIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlCitmb3JtZXIgY29udGFpbnMgY29kZSBkZXJpdmVkIGZyb20gdGhlIGxpYnJhcnksIHdoZXJlYXMgdGhlIGxhdHRlciBtdXN0CitiZSBjb21iaW5lZCB3aXRoIHRoZSBsaWJyYXJ5IGluIG9yZGVyIHRvIHJ1bi4KKwwKKwkJICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgYXBwbGllcyB0byBhbnkgc29mdHdhcmUgbGlicmFyeSBvciBvdGhlcgorcHJvZ3JhbSB3aGljaCBjb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3IKK290aGVyIGF1dGhvcml6ZWQgcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKK3RoaXMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4KK0VhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCisgIEEgImxpYnJhcnkiIG1lYW5zIGEgY29sbGVjdGlvbiBvZiBzb2Z0d2FyZSBmdW5jdGlvbnMgYW5kL29yIGRhdGEKK3ByZXBhcmVkIHNvIGFzIHRvIGJlIGNvbnZlbmllbnRseSBsaW5rZWQgd2l0aCBhcHBsaWNhdGlvbiBwcm9ncmFtcworKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSkgdG8gZm9ybSBleGVjdXRhYmxlcy4KKworICBUaGUgIkxpYnJhcnkiLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHNvZnR3YXJlIGxpYnJhcnkgb3Igd29yaword2hpY2ggaGFzIGJlZW4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlc2UgdGVybXMuICBBICJ3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSIgbWVhbnMgZWl0aGVyIHRoZSBMaWJyYXJ5IG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIKK2NvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgTGlicmFyeSBvciBhCitwb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkCitzdHJhaWdodGZvcndhcmRseSBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzCitpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKQorCisgICJTb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhIGxpYnJhcnksIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zCithbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZAoraW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uCithbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCisgIEFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIGEgcHJvZ3JhbSB1c2luZyB0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tCitzdWNoIGEgcHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkCitvbiB0aGUgTGlicmFyeSAoaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yCit3cml0aW5nIGl0KS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgTGlicmFyeSBkb2VzCithbmQgd2hhdCB0aGUgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIExpYnJhcnkgZG9lcy4KKyAgCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncworY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQKK3lvdSBjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuCithcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdAorYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkKK3dhcnJhbnR5OyBhbmQgZGlzdHJpYnV0ZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlCitMaWJyYXJ5LgorCisgIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksCithbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhCitmZWUuCisMCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFRoZSBtb2RpZmllZCB3b3JrIG11c3QgaXRzZWxmIGJlIGEgc29mdHdhcmUgbGlicmFyeS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIHRoZSBmaWxlcyBtb2RpZmllZCB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KKyAgICBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGQpIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQorICAgIHRhYmxlIG9mIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB0aGF0IHVzZXMKKyAgICB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5CisgICAgaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCisgICAgaW4gdGhlIGV2ZW50IGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBzdWNoIGZ1bmN0aW9uIG9yCisgICAgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKKyAgICBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCisKKyAgICAoRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcworICAgIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKKyAgICBhcHBsaWNhdGlvbi4gIFRoZXJlZm9yZSwgU3Vic2VjdGlvbiAyZCByZXF1aXJlcyB0aGF0IGFueQorICAgIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0CisgICAgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKKyAgICByb290IGZ1bmN0aW9uIG11c3Qgc3RpbGwgY29tcHV0ZSBzcXVhcmUgcm9vdHMuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBMaWJyYXJ5LAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCitpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeQord2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbwordGhpcywgeW91IG11c3QgYWx0ZXIgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlLCBzbwordGhhdCB0aGV5IHJlZmVyIHRvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAoraW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZQorb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzIGFwcGVhcmVkLCB0aGVuIHlvdSBjYW4gc3BlY2lmeQordGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSAgRG8gbm90IG1ha2UgYW55IG90aGVyIGNoYW5nZSBpbgordGhlc2Ugbm90aWNlcy4KKwwKKyAgT25jZSB0aGlzIGNoYW5nZSBpcyBtYWRlIGluIGEgZ2l2ZW4gY29weSwgaXQgaXMgaXJyZXZlcnNpYmxlIGZvcgordGhhdCBjb3B5LCBzbyB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBhbGwKK3N1YnNlcXVlbnQgY29waWVzIGFuZCBkZXJpdmF0aXZlIHdvcmtzIG1hZGUgZnJvbSB0aGF0IGNvcHkuCisKKyAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4geW91IHdpc2ggdG8gY29weSBwYXJ0IG9mIHRoZSBjb2RlIG9mCit0aGUgTGlicmFyeSBpbnRvIGEgcHJvZ3JhbSB0aGF0IGlzIG5vdCBhIGxpYnJhcnkuCisKKyAgNC4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhIHBvcnRpb24gb3IKK2Rlcml2YXRpdmUgb2YgaXQsIHVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtCit1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhY2NvbXBhbnkKK2l0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSwgd2hpY2gKK211c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgorCisgIElmIGRpc3RyaWJ1dGlvbiBvZiBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Citmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZQorc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50IHRvCitkaXN0cmlidXRlIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorCisgIDUuIEEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIG5vIGRlcml2YXRpdmUgb2YgYW55IHBvcnRpb24gb2YgdGhlCitMaWJyYXJ5LCBidXQgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIHRoZSBMaWJyYXJ5IGJ5IGJlaW5nIGNvbXBpbGVkIG9yCitsaW5rZWQgd2l0aCBpdCwgaXMgY2FsbGVkIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5Ii4gIFN1Y2ggYQord29yaywgaW4gaXNvbGF0aW9uLCBpcyBub3QgYSBkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnksIGFuZAordGhlcmVmb3JlIGZhbGxzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICBIb3dldmVyLCBsaW5raW5nIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5CitjcmVhdGVzIGFuIGV4ZWN1dGFibGUgdGhhdCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnkgKGJlY2F1c2UgaXQKK2NvbnRhaW5zIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5KSwgcmF0aGVyIHRoYW4gYSAid29yayB0aGF0IHVzZXMgdGhlCitsaWJyYXJ5Ii4gIFRoZSBleGVjdXRhYmxlIGlzIHRoZXJlZm9yZSBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KK1NlY3Rpb24gNiBzdGF0ZXMgdGVybXMgZm9yIGRpc3RyaWJ1dGlvbiBvZiBzdWNoIGV4ZWN1dGFibGVzLgorCisgIFdoZW4gYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHVzZXMgbWF0ZXJpYWwgZnJvbSBhIGhlYWRlciBmaWxlCit0aGF0IGlzIHBhcnQgb2YgdGhlIExpYnJhcnksIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgbWF5IGJlIGEKK2Rlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSBldmVuIHRob3VnaCB0aGUgc291cmNlIGNvZGUgaXMgbm90LgorV2hldGhlciB0aGlzIGlzIHRydWUgaXMgZXNwZWNpYWxseSBzaWduaWZpY2FudCBpZiB0aGUgd29yayBjYW4gYmUKK2xpbmtlZCB3aXRob3V0IHRoZSBMaWJyYXJ5LCBvciBpZiB0aGUgd29yayBpcyBpdHNlbGYgYSBsaWJyYXJ5LiAgVGhlCit0aHJlc2hvbGQgZm9yIHRoaXMgdG8gYmUgdHJ1ZSBpcyBub3QgcHJlY2lzZWx5IGRlZmluZWQgYnkgbGF3LgorCisgIElmIHN1Y2ggYW4gb2JqZWN0IGZpbGUgdXNlcyBvbmx5IG51bWVyaWNhbCBwYXJhbWV0ZXJzLCBkYXRhCitzdHJ1Y3R1cmUgbGF5b3V0cyBhbmQgYWNjZXNzb3JzLCBhbmQgc21hbGwgbWFjcm9zIGFuZCBzbWFsbCBpbmxpbmUKK2Z1bmN0aW9ucyAodGVuIGxpbmVzIG9yIGxlc3MgaW4gbGVuZ3RoKSwgdGhlbiB0aGUgdXNlIG9mIHRoZSBvYmplY3QKK2ZpbGUgaXMgdW5yZXN0cmljdGVkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgbGVnYWxseSBhIGRlcml2YXRpdmUKK3dvcmsuICAoRXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGlzIG9iamVjdCBjb2RlIHBsdXMgcG9ydGlvbnMgb2YgdGhlCitMaWJyYXJ5IHdpbGwgc3RpbGwgZmFsbCB1bmRlciBTZWN0aW9uIDYuKQorCisgIE90aGVyd2lzZSwgaWYgdGhlIHdvcmsgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5LCB5b3UgbWF5CitkaXN0cmlidXRlIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gNi4KK0FueSBleGVjdXRhYmxlcyBjb250YWluaW5nIHRoYXQgd29yayBhbHNvIGZhbGwgdW5kZXIgU2VjdGlvbiA2LAord2hldGhlciBvciBub3QgdGhleSBhcmUgbGlua2VkIGRpcmVjdGx5IHdpdGggdGhlIExpYnJhcnkgaXRzZWxmLgorDAorICA2LiBBcyBhbiBleGNlcHRpb24gdG8gdGhlIFNlY3Rpb25zIGFib3ZlLCB5b3UgbWF5IGFsc28gY29tYmluZSBvcgorbGluayBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGEKK3dvcmsgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCit1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB0aGUgdGVybXMgcGVybWl0Cittb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgZm9yIHRoZSBjdXN0b21lcidzIG93biB1c2UgYW5kIHJldmVyc2UKK2VuZ2luZWVyaW5nIGZvciBkZWJ1Z2dpbmcgc3VjaCBtb2RpZmljYXRpb25zLgorCisgIFlvdSBtdXN0IGdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgd29yayB0aGF0IHRoZQorTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZSBjb3ZlcmVkIGJ5Cit0aGlzIExpY2Vuc2UuICBZb3UgbXVzdCBzdXBwbHkgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmIHRoZSB3b3JrCitkdXJpbmcgZXhlY3V0aW9uIGRpc3BsYXlzIGNvcHlyaWdodCBub3RpY2VzLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQorY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIExpYnJhcnkgYW1vbmcgdGhlbSwgYXMgd2VsbCBhcyBhIHJlZmVyZW5jZQorZGlyZWN0aW5nIHRoZSB1c2VyIHRvIHRoZSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIEFsc28sIHlvdSBtdXN0IGRvIG9uZQorb2YgdGhlc2UgdGhpbmdzOgorCisgICAgYSkgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcKKyAgICBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlIGZvciB0aGUgTGlicmFyeSBpbmNsdWRpbmcgd2hhdGV2ZXIKKyAgICBjaGFuZ2VzIHdlcmUgdXNlZCBpbiB0aGUgd29yayAod2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlcgorICAgIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUpOyBhbmQsIGlmIHRoZSB3b3JrIGlzIGFuIGV4ZWN1dGFibGUgbGlua2VkCisgICAgd2l0aCB0aGUgTGlicmFyeSwgd2l0aCB0aGUgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSAid29yayB0aGF0CisgICAgdXNlcyB0aGUgTGlicmFyeSIsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUKKyAgICB1c2VyIGNhbiBtb2RpZnkgdGhlIExpYnJhcnkgYW5kIHRoZW4gcmVsaW5rIHRvIHByb2R1Y2UgYSBtb2RpZmllZAorICAgIGV4ZWN1dGFibGUgY29udGFpbmluZyB0aGUgbW9kaWZpZWQgTGlicmFyeS4gIChJdCBpcyB1bmRlcnN0b29kCisgICAgdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlCisgICAgTGlicmFyeSB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSBhYmxlIHRvIHJlY29tcGlsZSB0aGUgYXBwbGljYXRpb24KKyAgICB0byB1c2UgdGhlIG1vZGlmaWVkIGRlZmluaXRpb25zLikKKworICAgIGIpIFVzZSBhIHN1aXRhYmxlIHNoYXJlZCBsaWJyYXJ5IG1lY2hhbmlzbSBmb3IgbGlua2luZyB3aXRoIHRoZQorICAgIExpYnJhcnkuICBBIHN1aXRhYmxlIG1lY2hhbmlzbSBpcyBvbmUgdGhhdCAoMSkgdXNlcyBhdCBydW4gdGltZSBhCisgICAgY29weSBvZiB0aGUgbGlicmFyeSBhbHJlYWR5IHByZXNlbnQgb24gdGhlIHVzZXIncyBjb21wdXRlciBzeXN0ZW0sCisgICAgcmF0aGVyIHRoYW4gY29weWluZyBsaWJyYXJ5IGZ1bmN0aW9ucyBpbnRvIHRoZSBleGVjdXRhYmxlLCBhbmQgKDIpCisgICAgd2lsbCBvcGVyYXRlIHByb3Blcmx5IHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCBpZgorICAgIHRoZSB1c2VyIGluc3RhbGxzIG9uZSwgYXMgbG9uZyBhcyB0aGUgbW9kaWZpZWQgdmVyc2lvbiBpcworICAgIGludGVyZmFjZS1jb21wYXRpYmxlIHdpdGggdGhlIHZlcnNpb24gdGhhdCB0aGUgd29yayB3YXMgbWFkZSB3aXRoLgorCisgICAgYykgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQKKyAgICBsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZSB0aGUgc2FtZSB1c2VyIHRoZSBtYXRlcmlhbHMKKyAgICBzcGVjaWZpZWQgaW4gU3Vic2VjdGlvbiA2YSwgYWJvdmUsIGZvciBhIGNoYXJnZSBubyBtb3JlCisgICAgdGhhbiB0aGUgY29zdCBvZiBwZXJmb3JtaW5nIHRoaXMgZGlzdHJpYnV0aW9uLgorCisgICAgZCkgSWYgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKKyAgICBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgYWJvdmUKKyAgICBzcGVjaWZpZWQgbWF0ZXJpYWxzIGZyb20gdGhlIHNhbWUgcGxhY2UuCisKKyAgICBlKSBWZXJpZnkgdGhhdCB0aGUgdXNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlc2UKKyAgICBtYXRlcmlhbHMgb3IgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IHNlbnQgdGhpcyB1c2VyIGEgY29weS4KKworICBGb3IgYW4gZXhlY3V0YWJsZSwgdGhlIHJlcXVpcmVkIGZvcm0gb2YgdGhlICJ3b3JrIHRoYXQgdXNlcyB0aGUKK0xpYnJhcnkiIG11c3QgaW5jbHVkZSBhbnkgZGF0YSBhbmQgdXRpbGl0eSBwcm9ncmFtcyBuZWVkZWQgZm9yCityZXByb2R1Y2luZyB0aGUgZXhlY3V0YWJsZSBmcm9tIGl0LiAgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwKK3RoZSBtYXRlcmlhbHMgdG8gYmUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzCitub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IKK2NvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KK3doaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMKK3RoZSBleGVjdXRhYmxlLgorCisgIEl0IG1heSBoYXBwZW4gdGhhdCB0aGlzIHJlcXVpcmVtZW50IGNvbnRyYWRpY3RzIHRoZSBsaWNlbnNlCityZXN0cmljdGlvbnMgb2Ygb3RoZXIgcHJvcHJpZXRhcnkgbGlicmFyaWVzIHRoYXQgZG8gbm90IG5vcm1hbGx5CithY2NvbXBhbnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTdWNoIGEgY29udHJhZGljdGlvbiBtZWFucyB5b3UgY2Fubm90Cit1c2UgYm90aCB0aGVtIGFuZCB0aGUgTGlicmFyeSB0b2dldGhlciBpbiBhbiBleGVjdXRhYmxlIHRoYXQgeW91CitkaXN0cmlidXRlLgorDAorICA3LiBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5IHNpZGUtYnktc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQorZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZAorbGlicmFyeSwgcHJvdmlkZWQgdGhhdCB0aGUgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGJhc2VkIG9uCit0aGUgTGlicmFyeSBhbmQgb2YgdGhlIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBpcyBvdGhlcndpc2UKK3Blcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yaworICAgIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkKKyAgICBmYWNpbGl0aWVzLiAgVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAgICBTZWN0aW9ucyBhYm92ZS4KKworICAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0CisgICAgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKKyAgICB3aGVyZSB0byBmaW5kIHRoZSBhY2NvbXBhbnlpbmcgdW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCisKKyAgOC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUKK3RoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55CithdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91cgorcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLAorb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcwordGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIExpYnJhcnkgb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlLCBsaW5rIHdpdGggb3IgbW9kaWZ5IHRoZSBMaWJyYXJ5CitzdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoCit0aGlzIExpY2Vuc2UuCisMCisgIDExLiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkgYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueQorcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvIGFwcGx5LAorYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworICAxMi4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBMaWJyYXJ5IGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBMaWJyYXJ5IHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkCithbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywKK3NvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cworZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYKK3dyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEzLiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldwordmVyc2lvbnMgb2YgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgorU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAorYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5CitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKKyJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKK2xpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorDAorICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCit3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcworY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKK2RlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKK29mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCithbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KK1dBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCitFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgorT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKK0tJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKK0xJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCitUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KK1dSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCitBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQorRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKK0xJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKK1JFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCitGQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCitTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICitEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKK2V2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZS4gIFlvdSBjYW4gZG8gc28gYnkgcGVybWl0dGluZworcmVkaXN0cmlidXRpb24gdW5kZXIgdGhlc2UgdGVybXMgKG9yLCBhbHRlcm5hdGl2ZWx5LCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCitvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KKworICBUbyBhcHBseSB0aGVzZSB0ZXJtcywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgbGlicmFyeS4gIEl0IGlzCitzYWZlc3QgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlCisiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIGxpYnJhcnkncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKKyAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKKworCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cgYi9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxNDg0NgotLS0gL2Rldi9udWxsCisrKyBiL0NoYW5nZUxvZwpAQCAtMCwwICsxLDEzMDUwNSBAQAorPT09IHJlbGVhc2UgMS4xMi4wID09PQorCisyMDE3LTA1LTA0ICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0Bjb2F4aW9uLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSAgcmVsZWFzaW5nIDEuMTIuMAorCisyMDE3LTA1LTA0IDEzOjQ3OjIwICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9lbC5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTctMDUtMDIgMTA6MzI6MzAgKzA5MDAgIFNldW5naGEgWWFuZyA8c2gueWFuZ0BsZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBjcmFzaCBvbiBtc3Mgc3RyZWFtIGNhdXNlZCBieSBpbnZhbGlkIHN0c2QgZW50cnkgYWNjZXNzCisJICBTaW5jZSBtc3MgaGFzIG5vIG1vb3YsIGRlZmF1bHQgc3RzZCBlbnRyeSBzaG91bGQgYmUgY3JlYXRlZCB3aXRoIG1lZGlhLWNhcHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgyMDQyCisKKz09PSByZWxlYXNlIDEuMTEuOTEgPT09CisKKzIwMTctMDQtMjcgMTc6Mjk6NTggKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdnB4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiBtZXNvbi5idWlsZDoKKwkgIFJlbGVhc2UgMS4xMS45MQorCisyMDE3LTA0LTI3IDE1OjU4OjQ3ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZnVyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDE3LTA0LTI3IDE1OjI4OjAyICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9MSU5HVUFTOgorCSogcG8vZWwucG86CisJKiBwby9mdXIucG86CisJICBwbzogVXBkYXRlIHRyYW5zbGF0aW9ucworCisyMDE3LTA0LTI3IDEyOjU2OjI3ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IERvbid0IGNyYXNoIGluIGRlYnVnIG91dHB1dCBpZiBzdHJlYW09PU5VTEwKKwkgIFRoYXQgY2FzZSBpcyBjb3JyZWN0bHkgaGFuZGxlZCBiZWxvdyBidXQgbm90IGluIHRoZSBkZWJ1ZyBvdXRwdXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgxMjcwCisKKzIwMTctMDQtMjUgMTc6MTE6MjcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRG9uJ3QgcGVyZm9ybSBzZWVrcyB3aXRoIGluY29uc2lzdGVudCBzZWVrIHZhbHVlcworCSAgSWYgZ3N0X3NlZ21lbnRfZG9fc2VlaygpIGZhaWxzLCB3ZSBzaG91bGRuJ3QgdHJ5IHNlZWtpbmcgb24gdGhhdAorCSAgcmVzdWx0aW5nIHNlZ21lbnQgYnV0IGp1c3QgZXJyb3Igb3V0LiBDcmFzaGVzIGZ1cnRoZXIgZG93biB0aGUgbGluZQorCSAgb3RoZXJ3aXNlLgorCisyMDE3LTA0LTI0IDIwOjI3OjQ5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNjBhZWVmNiB0byA0OGE1ZDg1CisKKzIwMTctMDQtMjQgMTc6MzE6MDQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHRlc3RzOiBydHAtcGF5bG9hZGluZzogYWRkIHRlc3QgZm9yIHJ0cGgyNjRkZXBheSBhdmMvYnl0ZS1zdHJlYW0gb3V0cHV0CisJICBNYWtlIHN1cmUgYXZjIG91dHB1dCBkb2Vzbid0IGNvbnRhaW4gU1BTL1BQUyBpbmxpbmUsIGJ1dAorCSAgYnl0ZS1zdHJlYW0gb3V0cHV0IGRvZXMuCisKKzIwMTctMDQtMjQgMTc6Mjk6MzcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICBydHBoMjY0ZGVwYXk6IGRvbid0IGluc2VydCBTUFMvUFBTIGlubGluZSBmb3IgQVZDIG91dHB1dAorCSAgU1BTL1BQUyBhcmUgaW4gdGhlIGNhcHMgaW4gdGhpcyBjYXNlIGFuZCBzaG91bGRuJ3QgYmUgaW4KKwkgIHRoZSBzdHJlYW0gZGF0YS4KKworMjAxNy0wNC0yMSAxOTowOToxNCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogQ2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzcycgcHJvdmlkZV9jbG9jaygpIGltcGxlbWVudGF0aW9uCisJICBJZiBubyBjbG9jayB3YXMgcHJvdmlkZWQgZGlyZWN0bHkgYnkgcnRzcHNyYy4gVGhpcyBiZWhhdmlvdXIgd2FzIHJlbW92ZWQKKwkgIGJ5IGY4MDEzNDg3YzkxYTZmZmM1NTJhNGIyNWFhMWE3MGYwYmQ1Mzc3ZjggYW5kIHJlc3VsdHMgaW4gcnRzcHNyYyBub3QKKwkgIHByb3ZpZGluZyB0aGUgc3lzdGVtIGNsb2NrIHZpYSB0aGUgcnRwaml0dGVyYnVmZmVyLgorCSAgQXMgYSByZXN1bHQsIGlmIGFub3RoZXIgZWxlbWVudCBsaWtlIGFuIGF1ZGlvIHNpbmssIHByb3ZpZGVzIGEgY2xvY2ssCisJICB0aGUgcGlwZWxpbmUgd291bGQgc2VsZWN0IHRoYXQgKHdoZW4gZ29pbmcgdG8gUEFVU0VEL1BMQVlJTkcgYWdhaW4gbGF0ZXIpLgorCSAgQXVkaW8gY2xvY2tzIHVzdWFsbHkgZG9uJ3QgcHJvZ3Jlc3MgaW4gUEFVU0VELCBhbmQgdGh1cyBvdXIgbGl2ZSBzb3VyY2UKKwkgIHdvbid0IGJlIGFibGUgdG8gdXNlIHRoZSBjbG9jayB0byBwcm9kdWNlIGRhdGEsIG1ha2luZyB0aGUgc2luayBuZXZlcgorCSAgcHJlcm9sbCBhbmQgZXZlcnl0aGluZyBpcyBzdHVjay4KKworMjAxNy0wNC0yMCAxMToyMjoxNSArMDIwMCAgSsO8cmdlbiBTYWNocyA8anVlcmdlbi5zYWNoc0BtZXR6LWNlLmRlPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJlc2V0IHNhbXBsZV9kZXNjcmlwdGlvbl9pZCB0byBkZWZhdWx0CisJICBGaXhlcyBzdHJlYW0gd2hlcmUgc2FtcGxlX2Rlc2NyaXB0aW9uX2lkIGlzIHNwZWNpZmllZCBpbiB0aGUgdGZoZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3ODMzNworCisyMDE3LTA0LTIwIDEzOjE2OjI0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXhzaW5rOiBEb24ndCB1c2UgYW4gZXhwbGljaXQgbmFtZSBmb3IgcmVxdWVzdGluZyBhdWRpbyBwYWRzCisJICAuLi4gdW5sZXNzIHRoZSBtdXhlciB1c2VzIHRoZSBzYW1lIGF1ZGlvIHBhZCB0ZW1wbGF0ZSBuYW1lIGFzCisJICBzcGxpdG11eHNpbmsuIFdlIGNhbid0IHJlcXVlc3QgYSBwYWQgY2FsbGVkICJhdWRpb18wIiBvbiBhIG11eGVyIHRoYXQKKwkgIHdhbnRzIHBhZHMgdG8gYmUgInNpbmtfJWQiLgorCisyMDE3LTAyLTIzIDA5OjMxOjM2ICswOTAwICBDaGFuZ0JvayBDaGFlIDxjaGFuZ2Jvay5jaGVhQGdtYWlsLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IHJlbW92ZSBkdXBsaWNhdGVkIHNlZ21lbnQgaW5pdGlhbGl6YXRpb24KKwkgIEl0J3MgYWxzbyBkb25lIGluIGdzdF9mbHZfZGVtdXhfY2xlYW51cCgpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3OTEwNgorCisyMDE3LTA0LTIwIDIwOjE3OjM1ICsxMDAwICBYYXZpZXIgQ2xhZXNzZW5zIDx4YXZpZXIuY2xhZXNzZW5zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IENvcnJlY3RseSBjYXRjaCBGTFVTSCBldmVudHMgaW4gcHJvYmVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY3NDk4CisKKzIwMTctMDQtMTkgMTI6Mjg6MTIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIFJldmVydCAicnRwYmluOiBwaXBlbGluZSBnZXRzIGFuIEVPUyB3aGVuIGFueSBydHBzb3VyY2VzIGJ5ZXMiCisJICBUaGlzIHJldmVydHMgY29tbWl0IGVlZWEyYTdmZTg4YTE3YjE1MzE4ZDViNmFlNmUxOTBiMmY3NzcwMzAuCisJICBJdCBicmVha3MgRU9TIGluIHNvbWUgc2VuZGVyIHBpcGVsaW5lcywgc2VlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczMjE4I2MyMAorCisyMDE3LTA0LTE0IDE3OjAxOjQ5ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFJlc2V0IGFkYXB0ZXIgaW4gbW9yZSBkaXNjb250aW51aXR5IGNhc2VzCisJICBJbiBwdXNoIG1vZGUgd2UgcHJvY2VzcyBhcyBtdWNoIGFzIHBvc3NpYmxlIGluIHRoZSBhZGFwdGVyLiBXaGVuIHdlIHJlY2VpdmUKKwkgIGEgRElTQ09OVCBidWZmZXIgd2hpY2ggd2UgY2FuJ3QgbWF0Y2ggdG8gYW4gYWN0dWFsIHNhbXBsZSAoYmFzZWQgb24gdGhlIGV4aXN0aW5nCisJICBzYW1wbGUgdGFibGUpIGFuZCB0aGVyZSBpcyBzdGlsbCBkYXRhIHJlbWFpbmluZyBpbiB0aGUgaW5jb21pbmcgYWRhcHRlcix0aGVyZSBpcworCSAgb25lIG9mIHR3byBjYXNlcyBoYXBwZW5pbmc6CisJICAxKSBXZSBhcmUgZG9pbmcgcmV2ZXJzZSBwbGF5YmFjaywgaW4gd2hpY2ggY2FzZSB3ZSBzaG91bGQgZmx1c2ggb3V0IGFsbCBwZW5kaW5nCisJICBkYXRhCisJICAyKSBXZSBoYXZlIGxlZnRvdmVyIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgaW5jb21pbmcgYnVmZmVyLi4uIHdoaWNoIHdlIGNhbid0IGRvCisJICBhbnl0aGluZyBhYm91dC4KKwkgIEZvciB0aGUgc2Vjb25kIGNhc2UsIG1ha2Ugc3VyZSB3ZSBmbHVzaCBvdXQgdGhlIHJlbWFpbmluZyBkYXRhIHNvIHRoYXQgd2UgY2FuIHN0YXJ0CisJICBwYXJzaW5nIGFnYWluIGZyb20gc2NyYXRjaC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03ODEzMTkKKworMjAxNy0wNC0xNCAxMDo1Njo0MSArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogVXNlIEdTVF9FTEVNRU5UX0VSUk9SX1dJVEhfREVUQUlMUworCSAgQWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBrbm93IHRoZSBleGFjdCBzdGF0dXMgY29kZSB0aGF0IHdhcyByZXR1cm5lZAorCSAgYnkgdGhlIHNlcnZlciBpbiBhIHByb2dyYW1tYXRpYyBmYXNoaW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc4MTMwNAorCisyMDE3LTA0LTE2IDE4OjQ3OjU2ICswOTAwICBTZXVuZ2hhIFlhbmcgPHNoLnlhbmdAbGdlLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBGaXggbGVhayBvbiBRdERlbXV4U3RyZWFtU3RzZEVudHJ5CisJICBGaXggdW5pdCB0ZXN0IGZhaWx1cmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03ODEzNjIKKworMjAxNy0wNC0xNCAxMzozODo1MyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSogZ3N0L2lzb21wNC9hdG9tcy5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IEZpeCB0aW1lc2NhbGUgb2YgdGltZWNvZGUgdHJhY2tzCisJICBUaGV5IHNob3VsZCBoYXZlIGlkZWFsbHkgdGhlIHNhbWUgdGltZXNjYWxlIG9mIHRoZSB2aWRlbyB0cmFjaywgd2hpY2ggd2UKKwkgIGNhbid0IGd1YXJhbnRlZSBoZXJlIGFzIGluIHRoZW9yeSB0aW1lY29kZSBjb25maWd1cmF0aW9uIGFuZCB2aWRlbworCSAgZnJhbWVyYXRlIGNvdWxkIGJlIGRpZmZlcmVudC4gSG93ZXZlciB3ZSBzaG91bGQgc2V0IGEgY29ycmVjdCB0aW1lc2NhbGUKKwkgIGJhc2VkIG9uIHRoZSBmcmFtZXJhdGUgZ2l2ZW4gaW4gdGhlIHRpbWVjb2RlIGNvbmZpZ3VyYXRpb24sIGFuZCBub3QganVzdAorCSAgdXNlIHRoZSBmcmFtZXJhdGUgbnVtZXJhdG9yLgorCisyMDE3LTA0LTEzIDEzOjI1OjA2ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFByb3Blcmx5IHJlc2V0IGRlbXV4ZXIgd2hlbiBhbGwgc3RyZWFtcyBhcmUgRU9TCisJICBNYWtlIHN1cmUgb2Zmc2V0IGFuZCBuZWVkZWRieXRlcyBhcmUgcHJvcGVybHkgcmVzZXR0ZWQgd2hlbiBhbGwKKwkgIHN0cmVhbXMgYXJlIEVPUyBpbiBwdXNoLW1vZGUuCisJICBBdm9pZHMgY2FzZXMgd2hlbiBzb21lIGRhdGEgbWlnaHQgc3RpbGwgYmUgcHVzaGVkIGJ5IHVwc3RyZWFtIChiZWNhdXNlCisJICBpdCBkaWRuJ3QgeWV0IHNlZSB0aGUgcmVzdWx0aW5nIEdTVF9GTE9XX0VPUyB5ZXQpIGFuZCBxdGRlbXV4IGdldHMKKwkgIGNvbXBsZXRlbHkgbG9zdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03ODEyNjYKKworMjAxNy0wNC0xMyAwODowMDozMCArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBNYWtlIG1vcmUgdXNhZ2Ugb2YgZXJyb3IgbWFjcm8KKwkgIEFuZCBtYWtlIHN1cmUgd2UgYWN0dWFsbHkgdXNlIHRoZSBwcm92aWRlZCBzb3VwX21zZyBhcmd1bWVudCBpbiB0aGUgbWFjcm8KKworMjAxNy0wNC0xMiAxODo0Njo1MyArMDUzMCAgTmlyYmhlZWsgQ2hhdWhhbiA8bmlyYmhlZWtAY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvbWVzb24uYnVpbGQ6CisJICBtZXNvbjogUHJpbnQgbWVzc2FnZSB3aGVuIGRpc2FibGluZyB0YWdsaWIgb24gTVNWQworCisyMDE3LTA0LTEyIDEzOjI2OjU5ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogRG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSBwYWQtPmxhc3RfYnVmCisJICBidWYgaXMgdGhlIGN1cnJlbnQgcGFkLT5sYXN0X2J1ZiB2YWx1ZS4gSWYgZXZlciBpdCBnZXRzIGNvcGllZC91bnJlZmZlZCwKKwkgIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRvIHdyaXRlIGJhY2sgdGhlIG5ldyAgcG9pbnRlciB0byB0aGUgbGFzdF9idWYKKwkgIHZhcmlhYmxlLgorCSAgRml4ZXMgdXNpbmcgd3JvbmcgcG9pbnRlciB2YWx1ZXMgaW4gdGhlIGNhc2Ugb2YgZGVjcmFzaW5nIERUUyB2YWx1ZQorCisyMDE3LTA0LTEyIDExOjMzOjA1ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSAgdGVzdHM6IEFkZCB2cDllbmMgdG8gZ2l0aWdub3JlCisKKzIwMTctMDQtMTEgMTM6NDE6NDggKzAyMDAgIErDvHJnZW4gU2FjaHMgPGp1ZXJnZW4uc2FjaHNAbWV0ei1jZS5kZT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXg6IHNhbXBsZSBkZXNjcmlwdGlvbiBpbmRleCBvdmVycmlkZSBpbiB0ZmhkIG5vdCBldmFsdWF0ZWQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzgzMzcKKworMjAxNy0wNC0xMiAxMTowMzoyNCArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBBZGQgb3V0LW9mLWJvdW5kIGNoZWNrCisJICBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVhZCBpbnZhbGlkIG1lbW9yeQorCisyMDE2LTA0LTI3IDEyOjE3OjM3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogbW92ZSBwYXJzaW5nIG9mIHRraGQgb3V0IG9mIHN0c2QgZW50cnkgbG9vcAorCSAgSXQgbmVlZHMgb25seSB0byBiZSByZWFkIG9uY2UuCisKKzIwMTYtMDQtMDcgMTI6MjM6MzUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBjaGVjayBmb3IgYSBkaWZmZXJlbnQgc3RzZCBlbnRyeSBiZWZvcmUgcHVzaGluZyBhIHNhbXBsZQorCSAgQmVmb3JlIHB1c2hpbmcgYSBzYW1wbGUsIGNoZWNrIGlmIHRoZXJlIHdhcyBhIGNoYW5nZSBpbiB0aGUgY3VycmVudAorCSAgc3RzZCBlbnRyeS4gVGhpcyBwYXRjaCBhbHNvIGFzc3VtZXMgdGhhdCB0aGUgZmlyc3Qgc3RzZCBlbnRyeSBpcworCSAgdXNlZCBhcyBkZWZhdWx0IGZvciB0aGUgZmlyc3Qgc2FtcGxlLiBJdCBtaWdodCBjYXVzZSBhbiB1bmVlZGVkCisJICBjYXBzIHJlbmVnb3RpYXRpb24gd2hlbiB0aGlzIGlzbid0IHRoZSBjYXNlLgorCisyMDE2LTA0LTA2IDEyOjU1OjE4IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcGFyc2UgYWxsIHN0c2QgZW50cmllcworCSAgc3RzZCBjYW4gaGF2ZSBtdWx0aXBsZSBmb3JtYXQgZW50cmllcywgcGFyc2UgdGhlbSBhbGwuCisJICBUaGlzIGlzIHJlcXVpcmVkIHRvIHBsYXkgRFZCIERBU0ggcHJvZmlsZSB0aGF0IHVzZXMgbXVsdGlwbGUgZW50cmllcworCSAgdG8gaWRlbnRpZnkgdGhlIGRpZmZlcmVudCBhdmFpbGFibGUgYml0cmF0ZXMvb3B0aW9ucyBvbiBkYXNoIHN0cmVhbXMKKwkgIFRoZSBzdHJlYW0gZm9ybWF0LXNwZWNpZmljIGRhdGEgaXMgbm90IHN0b3JlZCBpbnRvIFF0RGVtdXhTdHJlYW1TdHNkRW50cnkKKworMjAxNi0wNC0wNSAxNDozNDowMCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJld29yayBzdHNkIHNhbXBsZSBlbnRyaWVzIGFjY2VzcworCSAgSW5zdGVhZCBvZiB1c2luZyB0aGUgc3RzZCBhcyBhIGJhc2UgcG9pbnRlciwgdXNlIHRoZSBhY3R1YWwgc3RzZAorCSAgZW50cnkgYXMgdGhlIHN0c2QgY2FuIGhhdmUgbXVsdGlwbGUgZW50cmllcy4gVGhpcyBpcyByYXJlbHkgdXNlZAorCSAgZm9yIGZpbGUgcGxheWJhY2sgYnV0IGlzIGEgcG9zc2libGUgcHJvZmlsZSB3aXRoIGluIERWQiBEQVNIIHNwZWNzLgorCSAgVGhpcyBzdGlsbCBkb2Vzbid0IHN1cHBvcnQgc3RzZCB3aXRoIG11bHRpcGxlIGVudHJpZXMgYnV0IG1ha2VzIGl0CisJICBlYXNpZXIgdG8gZG8gc28uCisKKzIwMTYtMDQtMDUgMTg6MDA6MTAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBnZXQgc3RzZCBjaGlsZCBieSBpbmRleCBpbnN0ZWFkIG9mIHR5cGUKKwkgIFRoZXJlIG1pZ2h0IGJlIG11bHRpcGxlIGNoaWxkcmVuIHdpdGggdGhlIHNhbWUgdHlwZQorCisyMDE3LTA0LTA3IDE2OjMzOjE4ICswMzAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBydHguYzoKKwkgIHRlc3RzL2NoZWNrL3J0cHJ0eDogYWRkIGNoZWNrcyBmb3IgcnRwcnR4cXVldWUncyBtYXgtc2l6ZS17dGltZSxwYWNrZXRzfSBwcm9wZXJ0aWVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgwODY3CisKKzIwMTctMDQtMDQgMTc6MzM6MzEgKzAzMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHF1ZXVlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhxdWV1ZS5oOgorCSAgcnRwcnR4cXVldWU6IGltcGxlbWVudCBoYW5kbGluZyBvZiB0aGUgbWF4LXNpemUtdGltZSBwcm9wZXJ0eQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc4MDg2NworCisyMDE3LTA0LTEwIDIzOjQ5OjA2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBhdXRvZ2VuLnNoOgorCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDM5YWMyZjUgdG8gNjBhZWVmNgorCisyMDE3LTA0LTEwIDA4OjU2OjAwICswMDAwICBUb2RvciBUb21vdiA8dG9kb3IudG9tb3ZAbGluYXJvLm9yZz4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJvYmplY3Q6IENvcHkgdGltZXN0YW1wIHdoZW4gaW1wb3J0aW5nIGJ1ZmZlcnMKKwkgIFRoaXMgaXMgbmVlZGVkIGZvciBWNEwyX09VVFBVVCBpbnRlcmZhY2UsIGFuZCBpcyBoYXJtbGVzcyBvZgorCSAgVjRMMl9DQVBUVVJFIGludGVyZmFjZXMuIFRoaXMgd2lsbCBmaXggdGltZXN0YW1wIGluIGNhc2VzIGxpa2U6CisJICB2NGwyc3JjIGlvLW1vZGU9ZG1hYnVmICEgdjRsMnZpZGVvTmVuYyBvdXRwdXQtaW8tbW9kZT1kbWFidWYtaW1wb3J0ICEgIC4uLgorCSAgU2FtZSBhcHBseSBmb3IgdXNlcnB0ci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03ODExMTkKKworMjAxNy0wNC0xMCAxNTo1NTozMCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IEZpeCBsYXN0X2R0cyB0cmFja2luZyBmb3IgcmF3IGF1ZGlvIGFuZCBzaW1pbGFyIGZvcm1hdHMKKwkgIEFjY3VtdWxhdGUgdGhlIGR1cmF0aW9ucyBkaXJlY3RseSBhbmQgZG9uJ3Qgc2NhbGUgeWV0IGFub3RoZXIgdGltZSBieQorCSAgdGhlIG51bWJlciBvZiBzYW1wbGVzLgorCisyMDE3LTA0LTA3IDEwOjQ4OjUwICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc3BsaXRtdXguYzoKKwkgIHRlc3RzOiBmaXggbGVhayBpbiBzcGxpdG11eCB0ZXN0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgxMDI1CisKKzIwMTctMDQtMDcgMTU6Mjk6NDMgKzA4MDAgIEx5b24gV2FuZyA8bHlvbi53YW5nQG54cC5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYzoKKwkgIHNjYWxldGVtcG86IFNjYWxlIEdBUCBldmVudCB0aW1lc3RhbXAgYW5kIGR1cmF0aW9uIGxpa2UgZm9yIGJ1ZmZlcnMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03ODEwMDgKKworMjAxNy0wMi0xNyAxMDowMTowOCAtMDMwMCAgVGhpYmF1bHQgU2F1bmllciA8dGhpYmF1bHQuc2F1bmllckBvc2cuc2Ftc3VuZy5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmg6CisJICB2NGwyZGVjOiBGaXggcmFjZSB3aGVuIGdvaW5nIGZyb20gUEFVU0VEIHRvIFJFQURZCisJICBSdW5uaW5nIGBnc3QtdmFsaWRhdGUtbGF1bmNoZXIgLXQgdmFsaWRhdGUuZmlsZS5wbGF5YmFjay5jaGFuZ2Vfc3RhdGVfaW50ZW5zaXZlLnZvcmJpc192cDhfMV93ZWJtYAorCSAgb24gb2Ryb2lkIFhVNCAoczVwLW1mYyB2NGwyIGRyaXZlcikgb2Z0ZW4gbGVhZHMgdG86CisJICBFUlJPUjouLi9zdWJwcm9qZWN0cy9nc3QtcGx1Z2lucy1nb29kL3N5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOjIxNTpnc3RfdjRsMl92aWRlb19kZWNfc3RvcDogYXNzZXJ0aW9uIGZhaWxlZDogKGdfYXRvbWljX2ludF9nZXQgKCZzZWxmLT5wcm9jZXNzaW5nKSA9PSBGQUxTRSkKKwkgIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBmb2xsb3dpbmcgcmFjZSBoYXBwZW5zOgorCSAgLSBUMDogTWFpbiB0aHJlYWQKKwkgIC0gVDE6IFVwc3RyZWFtIHN0cmVhbWluZyB0aHJlYWQKKwkgIC0gVDIuIHY0bDJkZWMgcHJvY2Vzc2luZyB0aHJlYWQpCisJICBbVGhlIGRlY29kZXIgaXMgaW4gUEFVU0VEIHN0YXRlXQorCSAgVDAuIFRoZSB2YWxpZGF0ZSBzY2VuYXJpbyBydW5zIGBFeGVjdXRpbmcgKDM2LzQwKSBzZXQtc3RhdGU6IHN0YXRlPW51bGwgcmVwZWF0PTQwYAorCSAgVDEtIFRoZSBkZWNvZGVyIGhhbmRsZXMgYSBmcmFtZQorCSAgVDItIEEgZGVjb2RlZCBmcmFtZSBpcyBwdXNoIGRvd25zdHJlYW0KKwkgIFQyLSBEb3duc3RyZWFtIHJldHVybnMgRkxVU0hJTkcgYXMgaXQgaXMgYWxyZWFkeSBmbHVzaGluZyBjaGFuZ2luZyBzdGF0ZQorCSAgVDItIFRoZSBkZWNvZGVyIHN0b3BzIGl0cyBwcm9jZXNzaW5nIHRocmVhZCBhbmQgc2V0cyBgLT5wcm9jZXNzaW5nID0gRkFMU0VgCisJICBUMS0gVGhlIGRlY29kZXIgaGFuZGxlcyBhbm90aGVyIGZyYW1lCisJICBUMS0gYC0+cHJvY2Vzc2AgaXMgRkFMU0Ugc28gdGhlIGRlY29kZXIgcmVzdGFydHMgaXRzIHN0cmVhbWluZyB0aHJlYWQKKwkgIFQwLSBJbiB2NGwyZGVjLT4gc3RvcCB0aGUgcHJvY2Vzc2luZyB0aHJlYWQgaXMgc3RvcHBlZAorCSAgTk9URTogQXQgdGhpcyBwb2ludCB0aGUgcHJvY2Vzc2luZyB0aHJlYWQgbG9vcCBuZXZlciBzdGFydGVkLgorCSAgVDAtIGFzc2VydGlvbiBmYWlsZWQ6IChnX2F0b21pY19pbnRfZ2V0ICgmc2VsZi0+cHJvY2Vzc2luZykgPT0gRkFMU0UpCisJICBIZXJlIEkgYW0gcmVtb3ZpbmcgdGhlIHdob2xlIC0+cHJvY2Vzc2luZyBsb2dpYyB0byBiYXNlIGl0IGFsbCBvbiB0aGUKKwkgIEdzdFRhc2sgc3RhdGUgdG8gYXZvaWQgZHVwbGljYXRpbmcgdGhlIGtub3dsZWRnZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Nzg4MzAKKworPT09IHJlbGVhc2UgMS4xMS45MCA9PT0KKworMjAxNy0wNC0wNyAxNjozMTo1NiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIG1lc29uLmJ1aWxkOgorCSAgUmVsZWFzZSAxLjExLjkwCisKKzIwMTctMDQtMDcgMTU6MTg6MTEgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2hyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisKKzIwMTctMDQtMDcgMTU6MDY6MzAgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL2VsLnBvOgorCSAgcG86IFVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAxNy0wNC0wNiAxMjowMTowMCArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IHN0cmVhbWxpbmUgYW5kIGltcHJvdmUgQXVkaW9TcGVjaWZpY0NvbmZpZyBwYXJzaW5nCisJICBBdWRpb1NwZWNpZmlnQ29uZmlnIGlzIHVzZWQgaW4gYSB2YXJpZXR5IG9mIEFBQyBzdHJlYW1zIGJ1dCB3YXMKKwkgIGJlaW5nIHBhcnNlZCBkaWZmZXJlbnRseS4gSW5zdGVhZCwgbWFrZSBldmVyeW9uZSB1c2UgdGhlIHNhbWUgcGFyc2luZy4KKwkgICogUmVtb3ZlIHVudXNlZCAnYml0cycgZmllbGQgKGl0IHdhcyBhbHdheXMgc2V0IHRvIDAgaWYgcHJlc2VudCkKKwkgICogQWRkIHByb3BlciBHQUNvbmZpZyBwYXJzaW5nICh0byBrbm93IHRoZSAgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIGZyYW1lCisJICBpZiBwcmVzZW50KS4KKwkgIEZpeGVzIHdyb25nIHJhdGUvY2hhbm5lbHMgY29uZmlndXJhdGlvbiBpbiBzdHJlYW1zIGNvbWluZyBmcm9tIHF0ZGVtdXgKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03ODA5NjYKKworMjAxNy0wNC0wNSAwOTo0NjozMSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogRml4IDMyYml0IG9ubHkgcHJpbnRmIGZvcm1hdAorCSAgVGhlIHByZXZpb3VzIHBhdGNoIHdhcyB1c2luZyAlbGx1IGZvciA2NGJpdHMgcHJpbnRmLCB3aGljaCBpcyAzMmJpdAorCSAgc3BlY2lmaWMuIFdlIGFsc28gdHJhY2UgdGhlIGxhdGVuY3kgaW4gdGltZSBodW1hbiByZWFkYWJsZSBmb3JtIG5vdy4KKworMjAxNi0wMy0xNiAxNjoyMjo0OCArMDEwMCAgUGhpbGlwcCBaYWJlbCA8cC56YWJlbEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogc2V0IHN0cmVhbXBhcm0gZm9yIG91dHB1dHMgdGhhdCBzdXBwb3J0IGl0CisJICBXaXRob3V0IGEgc3BlY2lmaWVkIGZyYW1lcmF0ZSBmcm9tIHRoZSBzaW5rLCB0aGUgZGVjb2RlciBmcmFtZSBpbnRlcnZhbAorCSAgc2hvdWxkIGJlIHNldCB1c2luZyB0aGUgZnJhbWVyYXRlIG9mIHRoZSBlbmNvZGVkIHZpZGVvIHN0cmVhbS4KKwkgIFRoZXJlZm9yZSwgdGhlIHY0bDJvYmplY3Qgc2hvdWxkIGJlIGFibGUgdG8gY2hhbmdlIHRoZSBmcmFtZXJhdGUgb24gdGhlCisJICBvdXRwdXQgaWYgdGhlIFY0TDIgZGV2aWNlIGFjY2VwdHMgaXQuCisJICBUaGlzIGlzIGFsc28gbmVjZXNzYXJ5IGZvciBtZW0ybWVtIGVuY29kZXJzIHNvIHRoYXQgdGhlaXIgYml0cmF0ZQorCSAgY2FsY3VsYXRpb24gY29kZSBtYXkgd29yayBjb3JyZWN0bHkgYW5kIHRoZXkgbWF5IHJlcG9ydCB0aGUgY29ycmVjdAorCSAgZnJhbWUgZHVyYXRpb24gb24gdGhlIGNhcHR1cmUgcXVldWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc5NDY2CisKKzIwMTYtMDMtMTYgMTY6MjQ6NTUgKzAxMDAgIFBoaWxpcHAgWmFiZWwgPHAuemFiZWxAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBvbmx5IHNldCBsYXRlbmN5IGlmIHRoZSBmcmFtZSBkdXJhdGlvbiBpcyB2YWxpZAorCSAgSWYgdGhlIGR1cmF0aW9uIG9mIHRoZSB2NGwyb2JqZWN0IGlzIEdTVF9DTE9DS19USU1FX05PTkUsIGJlY2F1c2UgdGhlCisJICBzaW5rIGRpZCBub3Qgc3BlY2lmeSBhIGZyYW1lcmF0ZSBpbiB0aGUgY2FwcyBhbmQgdGhlIGRyaXZlciBhY2NlcHRzIHRoZQorCSAgZnJhbWVyYXRlLCB0aGUgZGVjb2RlciBlbGVtZW50IHVzZXMgR1NUX0NMT0NLX1RJTUVfTk9ORSB0byBjYWxjdWxhdGUgYW5kCisJICBzZXQgdGhlIGVsZW1lbnQgbGF0ZW5jeS4KKwkgIFdoaWxlIHRoaXMgaXMgYSBidWcgb2YgdGhlIGNhcHR1cmUgZHJpdmVyLCB0aGUgZGVjb2RlciBlbGVtZW50IHNob3VsZAorCSAgbm90IHVzZSB0aGUgaW52YWxpZCBkdXJhdGlvbiB0byBjYWxjdWxhdGUgYSBsYXRlbmN5LCBidXQgcHJpbnQgYSB3YXJuaW5nCisJICBpbnN0ZWFkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3OTQ2NgorCisyMDE2LTExLTIzIDEyOjE3OjU1IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMnNpbms6IEJsb2NrIGluIHByZXJvbGxfd2FpdCBvbiB1bmxvY2sKKwkgIFRoZSBjb3JyZWN0IGJlaGF2aW91ciBvZiBhbnl0aGluZyBzdHVjayBpbiB0aGUgLT5yZW5kZXIoKSBmdW5jdGlvbgorCSAgYmV0d2VlbiAtPnVubG9jaygpIGFuZCAtPnVubG9ja19zdG9wKCkgaXMgdG8gY2FsbAorCSAgZ3N0X2Jhc2Vfc2lua193YWl0X3ByZXJvbGwoKSBhbmQgb25seSByZXR1cm4gYW4gZXJyb3IgaWYgdGhpcyByZXR1cm5zIGFuCisJICBlcnJvciwgb3RoZXJ3aXNlLCBpdCBtdXN0IGNvbnRpbnVlIHdoZXJlIGl0IGxlZnQgb2ZmIQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NDk0NQorCisyMDE3LTA0LTA1IDE1OjU1OjIwICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDlkZWMuYzoKKwkgIHZwOWRlYzogQWRkIHdhcm5pbmdzIGZvciB1bnN1cHBvcnRlZCBmcmFtZSBmb3JtYXRzCisJICBBdCBsZWFzdCBvdXRwdXQgYW4gZWxlbWVudCB3YXJuaW5nIG9uIHRoZSBidXMgd2hlbiB3ZQorCSAgZW5jb3VudGVyIGEgZnJhbWUgZm9ybWF0IEdTdHJlYW1lciBkb2Vzbid0IGN1cnJlbnRseSBzdXBwb3J0LgorCisyMDE3LTA0LTA0IDE3OjU1OjEzICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogSGFuZGxlIFBhcmFtZXRyaWMgU3RlcmVvIHdpdGggSEUtQUFDKHYyKQorCSAgQWNjb3JkaW5nIHRvIElTTy9JRUM6MTQ0OTYtMjoyMDA5ICwgaW4gdGhlIGNhc2Ugb2YgSEUtQUFDdjIgKGF1ZGlvT2JqZWNUeXBlCisJICAyOSkgcGFyYW1ldHJpYyBzdGVyZW8gaXMgdXNlZCAoYSBzaW5nbGUgbW9ubyB0cmFjayBpcyB1c2VkIGFuZCB0aGVuCisJICB0cmFuc2Zvcm1hdGlvbnMgYXJlIGFwcGxpZWQgdG8gaXQgdG8gcHJvdmlkZSBhIHN0ZXJlbyBvdXRwdXQpLgorCSAgV2UgdGhlcmVmb3JlIHJlcG9ydCB0d28gY2hhbm5lbHMgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgb25lIHJlcG9ydGVkCisJICBpbiB0aGUgYXVkaW9DaGFubmVsQ29uZmlndXJhdGlvbi4KKwkgIEZpeGVzIHRoZSB2YXJpb3VzIGlzc3VlcyB3aGVyZSBhIGRlbXV4ZXIgd291bGQgcmVwb3J0IHR3byBjaGFubmVscywgYnV0CisJICB0aGVuIHRoZSBwYXJzZXIgd291bGQgc2F5IHRoZXJlJ3Mgb25seSBvbmUgY2hhbm5lbCwgYW5kIHRoZW4gdGhlIGRlY29kZXIKKwkgIHdvdWxkIG91dHB1dCB0d28gY2hhbm5lbHMuCisKKzIwMTctMDQtMDQgMTU6MjI6MjUgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBTaW1wbGlmeSBidWZmZXIgcmVmY291bnRpbmcgaW4gYWRkX2J1ZmZlcigpIGFuZCByZW1vdmUgdW5uZWVkZWQgTlVMTCBjaGVja3MKKworMjAxNy0wNC0wNCAxNTowODozMyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IFNlbGVjdCB0aGUgYmVzdCBwYWQgYmFzZWQgb24gdGhlIGNhY2hlZCBsYXN0X2J1ZiBpZiBhbnkKKwkgIGxhc3RfYnVmIGlzIHRoZSBvbmUgd2UncmUgZ29pbmcgdG8gd3JpdGUgbmV4dCwgbm90IGJ1Zi4gQXMgc3VjaCB3ZQorCSAgc2hvdWxkIGNoZWNrIHRpbWVzdGFtcHMgYWdhaW5zdCB0aGF0IG9uZSBpZiB0aGVyZSBpcyBvbmUgdG8gc2VsZWN0IHRoZQorCSAgZWFybGllc3QgcGFkLgorCSAgQWxzbyByZW1lbWJlciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBhZCBpbiB0aGUgdmVyeSBiZWdpbm5pbmcgd2hlbgorCSAgc3RvcmluZyB0aGUgZmlyc3QgbGFzdF9idWYuCisJICBUaGlzIGJvdGggc29sdmVzIHNvbWUgZWRnZSBjYXNlcyB3aGVyZSBub3QgdGhlIGNvcnJlY3QgbmV4dCBwYWQgd2FzCisJICBzZWxlY3RlZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0YXJnZXQgaW50ZXJsZWF2ZS4KKworMjAxNy0wNC0wNCAxNTowNzo0MCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IEVycm9yIG91dCBpbW1lZGlhdGVseSBpZiBhIHRpbWVjb2RlIGlzIHRvIGJlIHdyaXR0ZW4gYnV0IGRvd25zdHJlYW0gcmV0dXJuIG5vdC1PSworCisyMDE3LTA0LTAzIDExOjM0OjQ5ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFVwZGF0ZSB2YXJpYWJsZXMgYmVmb3JlIGVhcmx5IGV4aXQKKwkgIFRoaXMgaXMgYW4gdXBkYXRlIG9mIGQ3OGQ1ODk2MjcyZDc4ZGY0MWU2OTZmYWM5MjllN2RmYjNiYjNkZmEKKwkgIFdlIHN0aWxsIGV4aXQgYXMgZWFybHkgYXMgcG9zc2libGUgaW4gY2FzZSBvZiBub24tb2svbm9uLXVubGlua2VkIGNvbWJpbmVkCisJICBmbG93LCBidXQgd2UgZmlyc3QgbWFrZSBzdXJlIHRoYXQgd2UgdXBkYXRlIHRoZSBpbnRlcm5hbCBwb3NpdGlvbiB2YXJpYWJsZXMuCisJICBUaGlzIGVuc3VyZXMgdGhhdCBpZiB1cHN0cmVhbXMgImlnbm9yZXMiIHRoZSBmbG93IHJldHVybiAoYW5kIGNhcnJpZXMgb24gcHVzaGluZyksCisJICB3ZSBkb24ndCBlbmQgdXAgcHJvY2Vzc2luZyBkYXRhIHdpdGggY29tcGxldGVseSBib2d1cyB2YXJpYWJsZXMvcG9zaXRpb25zLgorCisyMDE3LTAzLTI0IDAwOjExOjEzICsxMzAwICBEb3VnbGFzIEJhZ25hbGwgPGRvdWdsYXNAaGFsby5nZW4ubno+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuaDoKKwkgIGludGVybGVhdmU6IGF2b2lkIHVzaW5nIHVuaW5pdGlhbGlzZWQgb3JkZXJpbmdfbWFwCisJICBJZiBzZWxmLT5jaGFubmVsX3Bvc2l0aW9ucyA9PSBOVUxMICh3aGljaCBzZWVtcyB1bmxpa2VseSksCisJICBzZWxmLT5kZWZhdWx0X2NoYW5uZWxzX29yZGVyaW5nX21hcCB3aWxsIGJlIHVzZWQgdW5pbnRpYWxpc2VkLgorCSAgV2UgYXZvaWQgdGhhdCBieSBrZWVwaW5nIHRyYWNrIG9mIHRoZSBjaGFubmVsX21hc2ssIHdoaWNoIGlzIHNldCB3aGVuCisJICB0aGUgb3JkZXJpbmcgbWFwIGlzIGluaXRpYWxpc2VkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc4MDMzMQorCisyMDE3LTAzLTIzIDIzOjU2OjMxICsxMzAwICBEb3VnbGFzIEJhZ25hbGwgPGRvdWdsYXNAaGFsby5nZW4ubno+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkgIGludGVybGVhdmU6IGRvbid0IG92ZXJmbG93IGNoYW5uZWwgbWFwIHdpdGggPjY0IGNoYW5uZWxzCisJICBXaGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gNjQgY2hhbm5lbHMsIHdlIGRvbid0IHdhbnQgdG8gZXhjZWVkIHRoZQorCSAgYm91bmRzIG9mIHRoZSBvcmRlcmluZ19tYXAgYnVmZmVyLCBhbmQgaW4gdGhlc2UgY2FzZXMgd2UgZG9uJ3Qgd2FudCB0bworCSAgcmVtcGEgYXQgYWxsLiBIZXJlIHdlIGF2b2lkIGRvaW5nIHRoYXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgwMzMxCisKKzIwMTctMDMtMjggMTQ6MjM6MTYgLTAzMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAb3NnLnNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9tZXNvbi5idWlsZDoKKwkgIG1lc29uOiBVc2UgZ2V0X3BrZ2NvbmZpZ192YXJpYWJsZSBpbnN0ZWFkIG9mIGNhbGxpbmcgcGtnLWNvbmZpZyBvdXJzZWxmCisJICBJdCBpcyBhdmFsYWlibGUgaW4gbWVzb24gMC4zNiB3aGljaCBpcyBub3cgYXJlIHJlcXVpcmVtZW50CisKKzIwMTctMDMtMjggMTQ6MjI6NDEgLTAzMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAb3NnLnNhbXN1bmcuY29tPgorCisJKiBwa2djb25maWcvZ3N0cmVhbWVyLXBsdWdpbnMtZ29vZC5wYy5pbjoKKwkqIHBrZ2NvbmZpZy9tZXNvbi5idWlsZDoKKwkgIHBrZ2NvbmZpZzogRG8gbm90IGV2ZXIgYnVpbGQgYW4gaW5zdGFsbGVkIC5wYyBmaWxlCisKKzIwMTctMDMtMjggMTE6MTU6NTMgLTAzMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAb3NnLnNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9tZXNvbi5idWlsZDoKKwkgIG1lc29uOiB0ZXN0OiBGaXggZW52aXJvbm1lbnQgb2JqZWN0IHVzYWdlCisKKzIwMTctMDMtMjggMTE6MTQ6NDcgLTAzMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAb3NnLnNhbXN1bmcuY29tPgorCisJKiBtZXNvbi5idWlsZDoKKwkqIHBrZ2NvbmZpZy9nc3RyZWFtZXItcGx1Z2lucy1nb29kLnBjLmluOgorCSogcGtnY29uZmlnL21lc29uLmJ1aWxkOgorCSAgcGtnY29uZmlnOiBHZW5lcmF0ZSB0aGUgcGtnLWNvbmZpZyB3aXRoIG1lc29uIHRvbworCisyMDE3LTAzLTI3IDIxOjUyOjAwICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEluIGdhcCBtb2RlLCBjb25zaWRlciB0aGUgbWRhdCBvZmZzZXQgd2hlbiBjYWxjdWxhdGluZyB0aGUgcmVtYWluaW5nIG1kYXQgc2l6ZQorCSAgVGhlIG1kYXQgZ2VuZXJhbGx5IGRvZXMgbm90IHN0YXJ0IGF0IG9mZnNldCAwLCB3ZSBoYXZlIHRvIGluY2x1ZGUgdGhlCisJICBzaXplIG9mIHRoZSBtb29mIGFuZCB3aGF0ZXZlciBlbHNlIHdhcyBpbiBmcm9udCBvZiB0aGUgbWRhdC4KKworMjAxNy0wMy0yNyAxMTo0MzozMSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9hdG9tc3JlY292ZXJ5LmM6CisJICBhdG9tc3JlY292ZXJ5OiBFcnJvciBvdXQgd2hlbiBmc2VlaygpIGZhaWxzIGluc3RlYWQgb2Ygc2lsZW50bHkgaWdub3JpbmcKKwkgIENJRCAxNDAzMjYyCisKKzIwMTctMDMtMjMgMjI6MTM6MDUgKzAxMDAgIENhcmxvcyBSYWZhZWwgR2lhbmkgPGR2QHBzZXVkb3Rlcm1pbmFsLm9yZz4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogQWxzbyBhZGQgdmlkZW9tZXRhIGlmIHRoZXJlIGlzIHBhZGRpbmcgdG8gdGhlIHJpZ2h0IGFuZCBib3R0b20KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03ODA0NzgKKworMjAxNy0wMy0yMSAxMjo1NDoyNyArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IGZpeCBvdXRwdXQgc2VnbWVudCBhbmQgYnVmZmVyIERUUyB0byBjb3JyZXNwb25kIHRvIHRoZSBmbGF0dGVuZWQgUFRTCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgwMzQ3CisKKzIwMTctMDMtMjMgMTc6NTM6MTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBSZW1vdmUgc29tZSB1bnVzZWQgdmFyaWFibGVzCisKKzIwMTctMDMtMjMgMTU6MDE6MTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBSZW1vdmUgYSBjb3VwbGUgb2YgdW5uZWVkZWQgbGV2ZWxzIG9mIGluZGVudGF0aW9uCisKKzIwMTctMDMtMjIgMTg6MTg6NDAgKzAwMDAgIEVucmlxdWUgT2Nhw7FhIEdvbnrDoWxleiA8ZW9jYW5oYUBpZ2FsaWEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGRpc3Rpbmd1aXNoIFRGRFQgd2l0aCB2YWx1ZSAwIGZyb20gbm8gVEZEVCBhdCBhbGwKKwkgIFRGRFRzIHdpdGggdGltZSAwIGFyZSBiZWluZyBpZ25vcmVkIHNpbmNlIGNvbW1pdCAxZmMzZDQyZi4gVGhleSdyZQorCSAgbWlzdGFrZW4gd2l0aCB0aGUgY2FzZSBvZiBub3QgaGF2aW5nIFRGRFQsIGJ1dCB0aG9zZSB0d28gY2FzZXMKKwkgIG11c3QgYmUgZGlzdGluZ3Vpc2hlZCBpbiBzb21lIHdheS4KKwkgIFRoaXMgcGF0Y2ggcGFzc2VzIGFuIGV4dHJhIGJvb2xlYW4gZmxhZyB3aGVuIHRoZSBURkRUIGlzIHByZXNlbnQuCisJICBUaGlzIGlzIG5vdyB0aGUgY29uZGl0aW9uIGJlaW5nIGV2YWx1YXRlZCwgaW5zdGVhZCBvZiBjaGVja2luZyBmb3IKKwkgIDAgdGltZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03ODA0MTAKKworMjAxNy0wMy0yMiAxOToxNTowOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IFJlc2V0IGN1cnJlbnQgY2h1bmsgYWZ0ZXIgd3JpdGluZyBvdXQgdGltZWNvZGUKKwkgIElmIHdlIGhhdmUgbXVsdGlwbGUgdHJhY2tzIHdpdGggdGltZWNvZGVzLCBvciBpdCdzIG5vdCB0aGUgZmlyc3QgdHJhY2sKKwkgIHRoYXQgaGFzIHRpbWVjb2Rlcywgb3Igbm90IHRoZSBmaXJzdCBidWZmZXIsIHdlIGFscmVhZHkgc3RhcnRlZCBhIGNodW5rCisJICBmb3IgbWVkaWEgZGF0YS4gV2Ugbm93IG5lZWQgdG8gImNsb3NlIiB0aGF0IGNodW5rIGJlY2F1c2Ugd2Ugd3JvdGUgZGF0YQorCSAgZm9yIHRoZSB0aW1lY29kZSB0cmFjayBhbmQgYSBuZXcgY2h1bmsgaGFzIHRvIGJlIHN0YXJ0ZWQgZm9yIHRoZQorCSAgb3JpZ2luYWwgdHJhY2sgdGhlIG5leHQgdGltZSBpdCBoYXMgZGF0YS4KKworMjAxNy0wMy0yMiAxODo1Mjo1MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5oOgorCSAgcXRtdXg6IERvIHRpbWVjb2RlIGhhbmRsaW5nIHBlciB0cmFjaywgbm90IHBlciBtdXhlciBpbnN0YW5jZQorCSAgVGhlcmUgY291bGQgYmUgbXVsdGlwbGUgdmlkZW8gdHJhY2tzIHdpdGggdGltZWNvZGVzLgorCisyMDE3LTAzLTIyIDAwOjM4OjUxICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIHF0ZGVtdXg6IG1hdHJvc2thZGVtdXg6IElnbm9yZSByZXBlYXRlZCBzZWVrIGV2ZW50cworCSAgU2ltaWxhciB0byB3aGF0IHdhcyBkb25lIGluIGFkYXB0aXZlZGVtdXgsIGlnbm9yZSBzZWVrCisJICBldmVudHMgd2UndmUgYWxyZWFkeSBoYW5kbGVkIC0gc3VjaCBhcyB3aGVuIHRoZXkgYXJlIHJlY2VpdmVkCisJICBvbiBldmVyeSBzcmNwYWQgb2YgZmlsZXMgd2l0aCBsb3RzIG9mIHN0cmVhbXMuCisKKzIwMTctMDMtMjEgMTQ6NTU6MzIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4Lmg6CisJICBkYXNoZGVtdXg6IFVwZGF0ZSBtZGF0bGVmdCBmcm9tIG92ZXJhbGwgbWRhdHNpemUgYW5kIG9mZnNldCB3aGVuIG9ic2VydmluZyBhIGdhcAorCSAgT3RoZXJ3aXNlIG1kYXRsZWZ0IHdpbGwgaGF2ZSBhIHZhbHVlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgaW5pdGlhbAorCSAgbWRhdHNpemUgbWludXMgdGhlIHBhcnRzIG9mIHRoZSBzdHJlYW0gdGhhdCB3ZSBzYXcsIHdoaWNoIGlzIG5vdAorCSAgaW5jbHVkaW5nIGFsbCB0aGUgcGFydHMgb2YgdGhlIHN0cmVhbSB0aGF0IG1pZ2h0J3ZlIGJlZW4gc2tpcHBlZC4KKworMjAxNy0wMy0yMCAxNzowMzozMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIGRvY3M6IHVwZGF0ZSB0d28gcmVmZXJlbmNlcyB0byB0aGUgcmVtb3ZlZCAnbWFkJyBwbHVnaW4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzYxNDAKKworMjAxNy0wMy0yMCAxMjowMzoyOSArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cXVldWUuYzoKKwkgIHJ0cHJ0eHF1ZXVlOiBhZGQgYmFzaWMgZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZSBwaXBlbGluZXMKKwkgIE1vc3RseSBleHBsYWluaW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gcnRwcnR4cXVldWUgYW5kIHJ0cHJ0eHNlbmQuCisKKzIwMTctMDMtMTcgMjA6NTg6MjggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvbWVzb24uYnVpbGQ6CisJICB2NGwyOiBGaXggbWVzb24gcGx1Z2luIHNoYXJlZCBvYmplY3QgbmFtZQorCSAgSXQgZGlkbid0IG1hdGNoIGJldHdlZW4gQXV0b01ha2UgYW5kIE1lc29uLCBhbmQgdGhlIE1lc29uIG5hbWUKKwkgIGRpZG4ndCBtYXRoIHRoZSBwbHVnaW4gbmFtZSAodmlkZW80bGludXgyKS4KKworMjAxNy0wMy0xNiAxODoyMDo1NCArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5jOgorCSAgcnRwcnR4cmVjZWl2ZTogZml4IGV4YW1wbGUgcGlwZWxpbmVzIGFuZCBpbXByb3ZlIHRoZSBkb2N1bWVudGF0aW9uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcxMzgzCisKKzIwMTctMDMtMTcgMTQ6MTA6NDAgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuaDoKKwkgIGZsYWNwYXJzZTogZml4IHBsYXliYWNrIGlmIHNhbXBsZSBudW1iZXIgZG9lcyBub3Qgc3RhcnQgYXQgMAorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCAyOWI4MDc2ODVkM2M5NjJiYmU4YWZlMzUxYzVkY2E5N2Q1OWViNWUwLCB3aGlsZQorCSAgZml4aW5nIHRoZSBvcmlnaW5hbCBicmVha2luZyB0ZXN0cy9jaGVjay9waXBlbGluZXMvZmxhY2RlYy4KKworMjAxNy0wMy0xNyAxMTozMDowNCArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5oOgorCSAgUmV2ZXJ0ICJmbGFjcGFyc2U6IGZpeCBwbGF5YmFjayBpZiBzYW1wbGUgbnVtYmVyIGRvZXMgbm90IHN0YXJ0IGF0IDAiCisJICBUaGlzIGJyZWFrcyBnc3QtdmFsaWRhdGUgb24gdGhlIGJ1aWxkIHNlcnZlciAodGhvdWdoIG5vdCBsb2NhbGx5KSwKKwkgIGFuZCBhIHVuaXQgdGVzdCwgYW5kIEkgY2FuJ3QgcnVuIHVuaXQgdGVzdHMgcmlnaHQgbm93IGZvciBzb21lCisJICB1bnJlbGF0ZWQgcmVhc29uLgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCAwNzQ3YjU2ZjhlN2Y0NzMxZDY3ZjhkMTNhNGJkYzQ1M2RkZTBmZGY3LgorCisyMDE3LTAzLTE2IDE3OjQ0OjQxICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBwcmludCB0aGUgY29ycmVjdCB2YXJpYWJsZSBpbiBkZWJ1ZyBzdGF0ZW1lbnQKKwkgIFRoaXMgZGVidWcgc3RhdGVtZW50IGlzIG1lYW50IHRvIHByaW50IHRoZSB0aW1lIHNpbmNlIHRoZSBsYXN0IChlYXJseSkKKwkgIFJUQ1AgdHJhbnNtaXNzaW9uLCBub3QgdGhlIGxhc3QgcmVndWxhciBSVENQIHRyYW5zbWlzc2lvbiAod2hpY2ggYWxzbworCSAgaGFwcGVucyB0byBiZSBzZXQgYSBmZXcgbGluZXMgYWJvdmUgdG8gY3VycmVudF90aW1lLCBzbyB0aGUgZGVidWcgb3V0cHV0CisJICBpcyBqdXN0IGNvbmZ1c2luZykKKworMjAxNy0wMy0xNiAxNzo0MjoyNyArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSAgcnRwcnR4c2VuZDogY29udmVydCBMT0cgbWVzc2FnZSB0byBUUkFDRQorCSAgVGhpcyBpcyBwcmludGVkIHRvbyBvZnRlbiAoZm9yIGV2ZXJ5IGNoYWluZWQgYnVmZmVyISkgYW5kIGp1c3QgY2x1dHRlcnMgdGhlIGxvZ3MuCisKKzIwMTctMDMtMTYgMTQ6NTg6NDUgKzAxMDAgIE1pZ3VlbCBQYXLDrXMgRMOtYXogPG1wYXJpc2RpYXpAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cHNvdXJjZTogZml4IHdhcm5pbmcgbWVzc2FnZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc4MDEwNQorCisyMDE3LTAzLTE2IDEzOjU0OjU0ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmg6CisJICBmbGFjcGFyc2U6IGZpeCBwbGF5YmFjayBpZiBzYW1wbGUgbnVtYmVyIGRvZXMgbm90IHN0YXJ0IGF0IDAKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Nzc3MzgKKworMjAxNy0wMy0xNSAxODo1ODo1NSArMDEwMCAgTWlndWVsIFBhcsOtcyBEw61heiA8bXBhcmlzZGlhekBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBydHBzb3VyY2U6IGdldCBjbG9jay1yYXRlIGZyb20gcHQgaWYgbmVlZGVkIHRvIGdlbmVyYXRlIFNSCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgwMTA1CisKKzIwMTctMDMtMTYgMTM6NTI6NDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogSW5jbHVkZSBHU3RyZWFtZXIgc291cGh0dHBzcmMgdmVyc2lvbiBpbiBkZWZhdWx0IFVzZXItQWdlbnQgc3RyaW5nCisKKzIwMTctMDMtMTYgMDA6NDE6NDQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICBydHBoMjY0ZGVwYXk6IGZpeCBjcmFzaCB3aXRoIGVtcHR5IHNwcm9wcy1wYXJhbWV0ZXJzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgwMDQwCisKKzIwMTctMDMtMTEgMjE6MjA6NDAgLTA4MDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzYW50b3NAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zcmVjb3ZlcnkuYzoKKwkqIGdzdC9pc29tcDQvYXRvbXNyZWNvdmVyeS5oOgorCSAgYXRvbXNyZWNvdmVyeTogYWxzbyBoYW5kbGUgZXh0cmEgYXRvbXMgYWZ0ZXIgJ21kaWEnIGluIGEgJ3RyYWsnCisJICBUYWtlIGludG8gYWNjb3VudCB0aGUgYXRvbXMgYXQgdGhlIGVuZCBvZiB0aGUgJ3RyYWsnIGF0b20gd2hlbgorCSAgcmVjb3ZlcmluZyBpdC4gU28gdGhhdCBpdHMgc2l6ZSAoYWxyZWFkeSBjb21wdXRlZCBhbmQgYWRkZWQgaW4gdGhlIHRyYWsKKwkgIHNpemUpIGlzbid0IG1ha2luZyBvZmZzZXRzIHdyb25nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MTQ3OAorCisyMDE3LTAzLTExIDEyOjU2OjMzIC0wODAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc2FudG9zQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGF2b2lkIGZhbGx0aHJvdWdoIHRvIG1vb3ZyZWNvdmVyeSBmYWlsdXJlIHNlY3Rpb24KKwkgIFJldHVybiBiZWZvcmUgdGhhdCB0byBwcmVzZXJ2ZSBvdXIgc3VjY2Vzc2Z1bGwgcmVzdWx0cywgb3RoZXJ3aXNlIG5vCisJICBtb292IHJlY292ZXJ5IGluZm9ybWF0aW9uIHdvdWxkIGJlIHdyaXR0ZW4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzE0NzgKKworMjAxNy0wMy0xMSAxMjoyNzoyOCAtMDgwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NhbnRvc0BnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXNyZWNvdmVyeS5jOgorCSAgYXRvbXNyZWNvdmVyeTogZXhwZWN0IG1vcmUgYXRvbSB0eXBlcyBhdCB0aGUgaGVhZGVycworCSAgU2tpcCBtb3JlIGF0b21zIGF0IHRoZSBoZWFkZXIgdW50aWwgaXQgZmluZHMgdGhlICdtZGF0JyB0byBjb250aW51ZSB0aGUKKwkgIG1vb3YgcmVjb3ZlcnkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzE0NzgKKworMjAxNy0wMy0xNCAxNjo0MjoyNSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogTWFrZWZpbGUuYW06CisJKiBjb25maWd1cmUuYWM6CisJKiB0ZXN0cy9leGFtcGxlcy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3B1bHNlLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9leGFtcGxlcy9wdWxzZS9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3B1bHNlL3B1bHNlLmM6CisJICBwdWxzZSBleGFtcGxlOiBSZW1vdmUKKwkgIFRoYXQgZXhhbXBsZSBvbmx5IHRlc3RlZCB0aGUgcHJvcGVydHkgcHJvYmUgaW50ZXJmYWNlLCB3aGljaCBoYXMgYmVlbiByZW1vdmVkLgorCSAgVGhlIHNhbWUga2luZCBvZiB0aGluZyBjYW4gbm93IGJlIGRvbmUgd2l0aCB0aGUgZ2VuZXJpYyBnc3QtZGV2aWNlLW1vbml0b3IgdG9vbC4KKworMjAxNy0wMy0xNCAxNjozODowMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSAgdjRsMjogUmVtb3ZlIHVudXNlZCBtYWNybworCisyMDE3LTAzLTE0IDE2OjM1OjI1IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyOiBSZW1vdmUgdW51c2VkIGRlZmluaXRpb25zCisKKzIwMTctMDMtMTQgMTA6MTA6MTkgKzAxMDAgIEVtZXJpYyBHcmFuZ2UgPGVncmFuZ2VAZ29wcm8uY29tPgorCisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eG1hcC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuYzoKKwkgIHF0bXV4OiBhZGQgQ2luZUZvcm0gc3VwcG9ydAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc4MDAyNAorCisyMDE3LTAzLTE0IDE1OjA5OjQ0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogT25seSBjcmVhdGUgbmV3IGNodW5rcyBpZiB3ZSBoYXZlIG1vcmUgdGhhbiBhIHNpbmdsZSBzdHJlYW0KKwkgIFRoZXJlJ3Mgbm8gcG9pbnQgaW4gY3JlYXRpbmcgbXVsdGlwbGUgY2h1bmtzIG90aGVyd2lzZSwgaXQgb25seSB3YXN0ZXMKKwkgIHNvbWUgYnl0ZXMgZm9yIHN0b3JpbmcgdGhlIGNodW5rIG9mZnNldHMuCisKKzIwMTctMDMtMTQgMTA6MDk6NDYgKzAxMDAgIEVtZXJpYyBHcmFuZ2UgPGVncmFuZ2VAZ29wcm8uY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFkZCBTMTZMIHN1cHBvcnQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03ODAwMjIKKworMjAxNy0wMy0xNCAxNTo0ODowOCArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwbGl0bXV4LmM6CisJICBzcGxpdG11eCB0ZXN0OiBVc2UgcGFzc2VkIGZpcnN0L2xhc3QgdGltZXN0YW1wcworCSAgRG9uJ3QgaGFyZC1jb2RlIHRoZSBleHBlY3RlZCB0aW1lc3RhbXAgcmFuZ2UsIHVzZSB0aGUKKwkgIHZhbHVlcyB0aGUgY2FsbGVyIGlzIHBhc3NpbmcgaW4uCisKKzIwMTctMDMtMTIgMTE6NDI6MjUgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJICBBZGQgb2xkIHBsdWdpbiBuYW1lcyB0byBjcnVmdCBsaXN0CisJICBUaGlzIHdpbGwgaGVscCBmaXhpbmcgdW5pbnN0YWxsZWQgc2V0dXAuIEFsc28gZml4IG1pc3NpbmcgcGF0aAorCSAgY29ycmVjdGlvbiBpbiBvbmUgb2YgdGhlIHBsdWdpbiB4bWwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc5MzQ0CisKKzIwMTYtMTItMTUgMTI6Mzg6NDAgKzAxMDAgIE1pY2hhZWwgRHV0a2EgPG1haWxAbWljaGFlbC1kdXRrYS5kZT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmM6CisJICBydHBoMjY0ZGVwYXksIHJ0cGgyNjVkZXBheTogcmVtb3ZlIHN0cmF5IGdfZGVidWcoKQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3OTg1OAorCisyMDE3LTAzLTEwIDExOjI0OjE0ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGluaXQgZm91cmNjCisJICBJbml0aWFsaXplIHRoZSBmb3VyY2MgdG8gMCBzbyB0aGF0IHdlIGNhbiBkZXRlY3QgZmFpbHVyZSBsYXRlci4KKworMjAxNy0wMy0wOCAyMjo1MDo1MiAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2xpbWl0ZXIuYzoKKwkgIHRlc3RzOiBBZGQgbWlzc2luZyBMREFERCBmb3IgbGlibSBpbiB0ZXN0cyB1c2luZyBtYXRoLmgKKwkgIEFsc28sIHJlbW92ZSB0aGUgbWF0aC5oIGluY2x1ZGUgZm9yIHRoZSBvbmUgdGhhdCBqdXN0IHByZW50ZW5kIHRvIG5lZWQKKwkgIGl0LgorCisyMDE3LTAzLTA4IDIyOjE1OjQ2IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICBGaXggc2hvdXQyIHBsdWdpbiBkb2MgZ2VuZXJhdGlvbgorCSAgSW4gdGhlIHByZXZpb3VzIHBhdGNoLCB3ZSBhbHNvIHJlbmFtZWQgc2hvdXQyc2VuZCB0byBzaG91dDIsIHNvIGl0IGRvZXMKKwkgIG5vdCBjbGFzaCB3aXRoIGl0J3MgZmVhdHVyZS4gVGhvdWdoIHdlIGZvcmdvdCB0byByZW5hbWUgaXQgaW4gdGhlIGRvYworCSAgcmVmZXJlbmNlLiBUaGlzIHBhdGNoIGFsc28gYWRkIGEgY3J1ZnQgZGV0ZWN0aW9uIG9uIHRoZSB4bWwgdGhhdCBtYWRlIG1lCisJICBtaXNzIHRoaXMgZXJyb3IuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc5MzQ0CisKKzIwMTctMDMtMDQgMTA6NTI6NDcgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0Mi54bWw6CisJKiBleHQvcHVsc2UvTWFrZWZpbGUuYW06CisJKiBleHQvcHVsc2UvbWVzb24uYnVpbGQ6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSogZXh0L3NvdXAvTWFrZWZpbGUuYW06CisJKiBleHQvc291cC9tZXNvbi5idWlsZDoKKwkqIHN5cy9vc3M0L01ha2VmaWxlLmFtOgorCSAgRml4IHBsdWdpbiBmaWxlbmFtZXMgdG8gbWF0Y2ggcGx1Z2luIG5hbWVzCisJICAtIGxpYmdzdHB1bHNlLnNvIGJlY29tZXMgbGliZ3N0cHVsc2VhdWRpby5zbworCSAgLSBsaWJnc3Rzb3VwaHR0cHNyYy5zbyBiZWNvbWVzIGxpYmdzdHNvdXAuc28KKwkgIC0gbGliZ3N0b3NzNGF1ZGlvLnNvIGJlY29tZXMgbGliZ3N0b3NzNC5zbworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3OTM0NAorCisyMDE3LTAzLTA4IDE2OjAxOjAyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJICBxdG11eDogRnJlZSBFRFRTIGluc3RlYWQgb2YganVzdCBjbGVhcmluZyBpdCBhbmQgc2V0dGluZyBpdCB0byBOVUxMCisKKzIwMTctMDMtMDggMTU6Mjc6MzIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBGaXggc29tZSBtZW1vcnkgbGVha3MgcmVsYXRlZCB0byB0aW1lY29kZSB0cmFja3MKKworMjAxNy0wMy0wNCAwMDozNDo0NCArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwbGl0bXV4LmM6CisJICBzcGxpdG11eDogQWRkIHVuaXQgdGVzdCBmb3IgcmV2ZXJzZSBwbGF5YmFjaworCSAgRW5zdXJlIHRoYXQgcmV2ZXJzZSBwbGF5YmFjayB3b3JrcyBhbmQgZ2VuZXJhdGVzIHRoZSByYW5nZQorCSAgb2YgdGltZXN0YW1wcyAoMC0zcykgd2UgZXhwZWN0LCBpbiBtb25vdG9uaWNhbGx5IGRlc2NlbmRpbmcgb3JkZXIuCisKKzIwMTctMDItMjggMTE6NTA6NDUgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c3JjLmM6CisJICBzcGxpdG11eHNyYzogRml4IHJldmVyc2UgcGxheWJhY2sKKwkgIEZpeCB0aGUgY2hlY2sgZm9yIHdoZXRoZXIgdGhlIHN0YXJ0IHRpbWUgb2YgdGhlIHNlZ21lbnQgaGFzCisJICBiZWVuIHJlYWNoZWQgd2hlbiBwbGF5aW5nIGluIHJldmVyc2UuIE90aGVyd2lzZSwgcGxheWJhY2sKKwkgIHN0b3BzIGFmdGVyIHJlYWNoaW5nIHRoZSBzdGFydCBvZiBhbnkgZmlsZSBwYXJ0LCBpbnN0ZWFkIG9mCisJICBjb250aW51aW5nIHVudGlsIGFsbCBwYXJ0cyB3aXRoaW4gdGhlIHNlZ21lbnQgaGF2ZSBwbGF5ZWQKKworMjAxNy0wMi0yMiAwMzowMTozMSArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRG9uJ3QgbG9zZSBjcnlwdG8gaW5mbyBvbiBhIG5ldyBtb29mCisJICBXZSBwYXJzZSB0aGUgbmV4dCBtb29mIGluIGFkdmFuY2Ugb2YgaGF2aW5nIHB1c2hlZAorCSAgYWxsIHNhbXBsZXMgZnJvbSB0aGUgcHJldmlvdXMgb25lIGluIHNvbWUgY2FzZXMsIGFuZAorCSAgd2UnbGwgc3RpbGwgbmVlZCB0aGUgY3J5cHRvIGluZm8gZnJvbSB0aGUgcHJldmlvdXMKKwkgIGZyYWdtZW50IHNvIGtlZXAgYXJvdW5kIGFueSB1bnVzZWQgY3J5cHRvIGluZm8gZW50cmllcworCSAgd2hlbiBhZGRpbmcgbmV3IG9uZXMKKworMjAxNy0wMi0yNyAxMzo1NTo1OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSogZ3N0L2lzb21wNC9hdG9tcy5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IFVwZGF0ZSBtb2RpZmljYXRpb24gdGltZXMgd2hlbiBzZW5kaW5nIHRoZSBtb292CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc5NDIyCisKKzIwMTctMDMtMDEgMTY6MTE6NDcgLTA4MDAgIE1pY2hhZWwgU21pdGggPG1scnNtaXRoQGdtYWlsLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5oOgorCSAgc2JjcGFyc2U6IEZpeCB1cCB2YWx1ZXMgZm9yIGFsbG9jYXRpb24gZW51bWVyYXRpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc5Mzg5CisKKzIwMTctMDItMjggMTM6MTA6NTAgKzAyMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHJlY2VpdmUuYzoKKwkgIHJ0cHJ0eHJlY2VpdmU6IGZpeCBwb3RlbnRpYWwgbGVhayBvZiBvbGQsIHVuYXNzb2NpYXRlZCwgYXNzb2NpYXRpb24gcmVxdWVzdHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjI1NjAKKworMjAxNy0wMi0yOCAxNTo0NzoyMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IERvbid0IGluY3JlbWVudCAtMSAvIHVuc2V0IGluZGljZXMKKwkgIENJRCAxMzk4NTQ1CisKKzIwMTctMDItMjggMTU6MjA6MzEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogUHJvdGVjdCBhZ2FpbnN0IE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSBmb3Igc3RyZWFtcyB3aXRob3V0IGNhcHMKKwkgIENJRCAxMzYzMzMyCisKKzIwMTctMDItMjggMTI6NTc6MDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSAgcnRwaDI2M3BheTogRnJlZSBtYWMgb24gZXJyb3JzCisJICBDSUQgMTIxMjE0OQorCisyMDE3LTAyLTI4IDEyOjQ1OjI0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSAgcnRwdm9yYmlzcGF5OiBBZGQgbWlzc2luZyBicmVhayB0byBmb3IgbG9vcAorCisyMDE3LTAyLTI4IDExOjAyOjU0ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIGNoZWNrOiBGaXggc3BsaXRtdXggdGVzdCBDRkxBR1MKKwkgIE5lZWRzIHRvIGtub3cgd2hlcmUgdGhlIGdzdGFwcCBoZWFkZXJzIGFyZQorCisyMDE3LTAyLTI3IDIxOjAyOjUxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBjb21waWxhdGlvbiB3aXRoIGdjYyA3CisJICBxdGRlbXV4LmM6IEluIGZ1bmN0aW9uIOKAmHF0ZGVtdXhfcGFyc2Vfc2FtcGxlc+KAmToKKwkgIHF0ZGVtdXguYzo4NDUwOjM5OiBlcnJvcjog4oCYKuKAmSBpbiBib29sZWFuIGNvbnRleHQsIHN1Z2dlc3Qg4oCYJibigJkgaW5zdGVhZCBbLVdlcnJvcj1pbnQtaW4tYm9vbC1jb250ZXh0XQorCSAgaWYgKHN0cmVhbS0+c2FtcGxlc19wZXJfZnJhbWUgKiBzdHJlYW0tPmJ5dGVzX3Blcl9mcmFtZSkgeworCSAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5efn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKKzIwMTctMDItMjcgMjE6MDE6MjMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIG1wZWdhdWRpb3BhcnNlOiBGaXggY29tcGlsYXRpb24gd2l0aCBnY2MgNworCSAgZ3N0bXBlZ2F1ZGlvcGFyc2UuYzogSW4gZnVuY3Rpb24g4oCYZ3N0X21wZWdfYXVkaW9fcGFyc2VfcmVzZXTigJk6CisJICBnc3RtcGVnYXVkaW9wYXJzZS5jOjIwOTozOiBlcnJvcjog4oCYbWVtc2V04oCZIHVzZWQgd2l0aCBsZW5ndGggZXF1YWwgdG8gbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGhvdXQgbXVsdGlwbGljYXRpb24gYnkgZWxlbWVudCBzaXplIFstV2Vycm9yPW1lbXNldC1lbHQtc2l6ZV0KKwkgIG1lbXNldCAobXAzcGFyc2UtPnhpbmdfc2Vla190YWJsZV9pbnZlcnNlLCAwLCAyNTYpOworCSAgXn5+fn5+CisJICBnc3RtcGVnYXVkaW9wYXJzZS5jOiBJbiBmdW5jdGlvbiDigJhnc3RfbXBlZ19hdWRpb19wYXJzZV9oYW5kbGVfZmlyc3RfZnJhbWXigJk6CisJICBnc3RtcGVnYXVkaW9wYXJzZS5jOjk1MTo3OiBlcnJvcjog4oCYbWVtc2V04oCZIHVzZWQgd2l0aCBsZW5ndGggZXF1YWwgdG8gbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGhvdXQgbXVsdGlwbGljYXRpb24gYnkgZWxlbWVudCBzaXplIFstV2Vycm9yPW1lbXNldC1lbHQtc2l6ZV0KKwkgIG1lbXNldCAobXAzcGFyc2UtPnhpbmdfc2Vla190YWJsZV9pbnZlcnNlLCAwLCAyNTYpOworCSAgXn5+fn5+CisKKzIwMTctMDItMjcgMTk6MzE6MzkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJICBydHB2b3JiaXNwYXk6IFdoZW4gZ2V0dGluZyBuZXcgaGVhZGVycywgcmVwbGFjZSB0aGUgb2xkIHZlcnNpb24gb2YgdGhlbQorCSAgVGhpcyBwcmV2ZW50cyBzdG9yaW5nIGFuIGluZmluaXRlIGFtb3VudCBvZiBlLmcuIGNvbW1lbnQgaGVhZGVycyBpZiB0aGV5CisJICBjb21lIHdpdGhvdXQgYSBuZXcgaW5pdGlhbGl6YXRpb24gaGVhZGVyIGluIGZyb250IG9mIHRoZW0uIFRoZXJlIGNhbgorCSAgb25seSBiZSBvbmUgaGVhZGVyIG9mIGVhY2ggdHlwZS4KKworMjAxNy0wMi0yNyAxOToyNTozNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSAgcnRwLXBheWxvYWRpbmc6IEFkZCBuZXcgdGVzdCBmb3IgVm9yYmlzIHJlbmVnb3RpYXRpb24KKwkgIENoZWNrIGlmIGVuY29kaW5nLCBwYXlsb2FkaW5nLCBkZXBheWxvYWRpbmcgYW5kIGRlY29kaW5nIHdvcmtzIGlmIHRoZQorCSAgc3RyZWFtIGNvbmZpZ3VyYXRpb24gKGFuZCB0aHVzIHRoZSBoZWFkZXJzKSBjaGFuZ2UuCisKKzIwMTctMDItMjcgMTk6MjQ6MDcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJICB2b3JiaXNwYXk6IE9ubHkgcmVwbGFjZSBoZWFkZXJzIHdoZW4gcmVjZWl2aW5nIGEgbmV3IGNvbmZpZyBoZWFkZXIKKwkgIElmIHdlIGFsc28gcmVwbGFjZSBhbGwgaGVhZGVycyB3aGVuIHJlY2VpdmluZyBhbnkgcG9zc2libHkgZm9sbG93aW5nCisJICBjb21tZW50cyBoZWFkZXIsIHdlIHdvdWxkIHRocm93IGF3YXkgdGhlIGNvbmZpZyBoZWFkZXIgYmVmb3JlIGJlaW5nIGFibGUKKwkgIHRvIG1ha2UgdXNlIG9mIGl0LgorCisyMDE3LTAyLTIzIDEyOjExOjE1ICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwbGl0bXV4LmM6CisJICB0ZXN0czogc3BsaXRtdXg6IGFkZCB1bml0IHRlc3QgZm9yIGNvbnRlbnQgd2l0aCBzcGFyc2Ugc3RyZWFtcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MTA4NgorCisyMDE3LTAyLTIyIDExOjIzOjE5ICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4cGFydHJlYWRlci5jOgorCSAgc3BsaXRtdXhwYXJ0cmVhZGVyOiBpZ25vcmUgc3BhcnNlIHN0cmVhbXMgd2hlbiBjYWxjdWxhdGluZyB0aGUgZW5kIG9mZnNldCBvZiBhIHBhcnQKKwkgIEEgc3BhcnNlIHN0cmVhbSdzIGVuZGluZyB0aW1lc3RhbXAgY2FuIGJlIGNvbnNpZGVyYWJseSBzbWFsbGVyCisJICB0aGFuIHRoZSBlbmRpbmcgdGltZXN0YW1wcyBvZiB0aGUgb3RoZXIgc3RyZWFtcywgd2hpY2ggY2FuIGxlYWQKKwkgIHRvIHNraXBwaW5nIGNvbnNpZGVyYWJsZSB0aW1lIGZyb20gdGhlIG5leHQgcGFydC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjEwODYKKworMjAxNy0wMi0yMiAxMToyMTowNiArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuYzoKKwkgIHNwbGl0bXV4cGFydHJlYWRlcjogaWRlbnRpZnkgc3BhcnNlIHN0cmVhbXMKKworMjAxNy0wMi0yNSAyMTo0NzowMyAtMDMwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBwY21hcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBwY211cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkb3JpZW50LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkb3JpZW50Lmg6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmg6CisJICBVcGRhdGUgRWRnYXJkIExpbWEncyBlbWFpbAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3OTIzMAorCisyMDE3LTAyLTA4IDEzOjM2OjAwICswMDAwICBBbmRyZXcgPG5pZmlnYXNlQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgcnRwaml0dGVyYnVmZmVyOiBEb24ndCBhbHdheXMgcmVzZXQgUFRTIHRvIDAgYWZ0ZXIgYSBnYXAKKwkgIEluIGZ1bmN0aW9uIHJ0cF9qaXR0ZXJfYnVmZmVyX2NhbGN1bGF0ZV9wdHM6IElmIGdhcCBpbiBpbmNvbWluZyBSVFAKKwkgIHRpbWVzdGFtcHMgaXMgbW9yZSB0aGFuICgzICogamJ1Zi0+Y2xvY2tfcmF0ZSkgd2UgY2FsbAorCSAgcnRwX2ppdHRlcl9idWZmZXJfcmVzZXRfc2tldyB3aGljaCByZXNldHMgcHRzIHRvIDAuIFNvIGNvbXBvbmVudHMgZG93bgorCSAgdGhlIHBpcGVsaW5lIChwbGF5ZXMsIG1peGVycykganVzdCBza2lwIGZyYW1lcy9zYW1wbGVzIHVudGlsIHB0cyBiZWNvbWVzCisJICBlcXVhbCB0byBwdHMgYmVmb3JlIGdhcC4KKwkgIEluIHZlcnNpb24gMS4xMC4yIGFuZCBiZWZvcmUgdGhpcyBjaGVja2luZyB3YXMgYnlwYXNzZWQgZm9yIHBhY2tldHMgd2l0aAorCSAgImVzdGltYXRlZCBkdHMiLCBhbmQgZ2FwcyB3ZXJlIGhhbmRsZWQgY29ycmVjdGx5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3ODM0MQorCisyMDE3LTAyLTI0IDE1OjU5OjQxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBtZXNvbi5idWlsZDoKKwkgIG1lc29uOiBVcGRhdGUgdmVyc2lvbgorCisyMDE3LTAyLTI0IDE1OjM3OjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisKKz09PSByZWxlYXNlIDEuMTEuMiA9PT0KKworMjAxNy0wMi0yNCAxNTowNzoyMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdnB4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJICBSZWxlYXNlIDEuMTEuMgorCisyMDE3LTAyLTI0IDEyOjUwOjIxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDE3LTAyLTI0IDEyOjQ0OjU4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9lbC5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTctMDItMTAgMjA6NTA6MTcgKzA5MDAgIFNldW5naGEgWWFuZyA8c2gueWFuZ0BsZ2UuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IEV4dHJhY3QgcmVkaXJlY3Rpb24gdXJpIG9uIGxpYnNvdXAncyByZXN0YXJ0ZWQgY2FsbGJhY2sKKwkgIExldCBsaWJzb3VwIGhhbmRsZSByZWRpcmVjdGlvbiBhdXRvbWF0aWNhbGx5LgorCSAgQW5kIHRoZW4sIHRvIGZpZ3VyZSBvdXQgcmVkaXJlY3Rpb24gdXJpLCBleHRyYWN0IGl0IG9uICJyZXN0YXJ0ZWQiCisJICBjYWxsYmFjayB3aGljaCB3aWxsIGJlIGZpcmVkIGJlZm9yZSBzb3VwX3Nlc3Npb25fc2VuZCgpIGlzIHJldHVybmVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3ODQyOAorCisyMDE3LTAxLTAyIDE5OjI5OjA0IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IFVwZGF0ZSBpbWFnZSBzaXplIHdoZW4gZXh0cmFwb2xhdGluZworCSAgVXBkYXRlIHRoZSBpbWFnZSBzaXplIGFjY29yZGluZyB0aGUgYW1vdW50IG9mIGRhdGEgd2UgYXJlIGdvaW5nIHRvCisJICByZWFkL3dyaXRlLiBUaGlzIHdvcmthcm91bmQgYnVncyBpbiBkcml2ZXIgd2hlcmUgdGhlIHNpemVpbWFnZSBwcm92aWRlZAorCSAgYnkgVFJZL1NfRk1UIHJlcHJlc2VudCB0aGUgYnVmZmVyIGxlbmd0aCAobWF4aW11bSBzaXplKSByYXRoZXIgdGhlbiB0aGUgZXhwZWN0ZWQKKwkgIGJ5dGVzdXNlZCAoYnVmZmVyIHNpemUpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NTU2NAorCisyMDE3LTAyLTE3IDE1OjUwOjMyIC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IGZpeCB0eXBvIGluIF9hY3F1aXJlX2Zvcm1hdCgpIGVycm9yIG1lc3NhZ2VzCisJICBGaXhlczoKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Nzg4MTUKKworMjAxNy0wMi0wNyAxNzoyNzo1NiArMDEwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgdGVzdHM6IG1hdHJvc2thbXV4LCBxdG11eDogZG9uJ3QgYWRkIGNvZGVjX2RhdGEgYnVmZmVycyB0byB0ZW1wbGF0ZSBjYXBzCisJICBzdHJlYW1oZWFkZXIgYW5kIGNvZGVjX2RhdGEgYnVmZmVycyBmaWVsZHMgYXJlIG9ubHkgbWVhbnQgdG8gYmUKKwkgIGluIHRoZSBuZWdvdGlhdGVkIGNhcHMsIG5vdCB0aGUgdGVtcGxhdGUgY2Fwcy4KKwkgIEZpeGVzIGZhbHNlLXBvc2l0aXZlIGxlYWtzIG9mIHRob3NlIGJ1ZmZlcnMgZGV0ZWN0ZWQgYnkgdGhlIGxlYWtzCisJICB0cmFjZXIsIGFzIHRlbXBsYXRlIGNhcHMgYXJlIHN0YXRpYywgYW5kIHdlIGRlY2lkZWQgdG8gbm90IGluY2x1ZGUKKwkgIGNvZGUgaW4gZ3N0cmVhbWVyIGNvcmUgdG8gaGFuZGxlIHRoaXMgdW51c3VhbCBjYXNlIG9mIHRlbXBsYXRlIGNhcHMKKwkgIGhhdmluZyBidWZmZXJzIGluIHRoZW0uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY4NzYyCisKKzIwMTctMDItMDkgMTI6NDY6NTQgKzAwMDAgIEpvY2hlbiBIZW5uZWJlcmcgPGpoQGhlbm5lYmVyZy1zeXN0ZW1kZXNpZ24uY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSAgcnRwdm9yYmlzcGF5OiBVcGRhdGUgYW5kIHNlbmQgb3V0IGhlYWRlcnMgd2hlbiBuZXcgaGVhZGVycyBhcmUgcmVjZWl2ZWQKKwkgIFRoZSBwYXlsb2FkZXIgbmVlZHMgdG8gcmVzZXQgYW5kIHVwZGF0ZSB0aGUgdm9yYmlzIGNvbmZpZyBkYXRhIHdoaWNoIGlzCisJICBwdXNoZWQgb24gdGhlIG5ldHdvcmsgaWYgaXQgcmVjZWl2ZXMgbmV3IGhlYWRlcnMsIG9yIGF0IGxlYXN0LCBpdCBtYXkKKwkgIGhhdmUgdG8gZG8gc28uCisJICBXaXRob3V0IHRoaXMsIHRoZSBzdHJlYW0gY29uZmlndXJhdGlvbiBjb3VsZCBjaGFuZ2Ugd2l0aG91dCB0aGUKKwkgIHBheWxvYWRlciBzZW5kaW5nIHRoZSBuZXcgY29uZmlndXJhdGlvbiB0byB0aGUgb3RoZXIgc2lkZS4KKworMjAxNy0wMi0xNSAxNDo0ODo1OCAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmg6CisJICBzcGxpdG11eHNpbms6IENoYW5nZSBmaWxlcyBvbiBpbmNvbXBhdGlibGUgY2FwcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MTc2MQorCisyMDE3LTAyLTE1IDE2OjM1OjAxIC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXhzaW5rOiBSZXNldCByZWFkeV9mb3Jfb3V0cHV0IG9uIHN0YXRlIGNoYW5nZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MTc2MQorCisyMDE3LTAyLTE1IDE1OjA5OjA2IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSAgc3BsaXRtdXhzaW5rOiBSZW1vdmUgdW51c2VkIG5leHRfbWF4X291dF9ydW5uaW5nX3RpbWUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjE3NjEKKworMjAxNy0wMi0xNSAxNTowNzozMiAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmg6CisJICBzcGxpdG11eHNpbms6IFJlbW92ZSB1bnVzZWQgbXV4ZWRfb3V0X3RpbWUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjE3NjEKKworMjAxNy0wMi0xNyAxMzowNzowNSArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgUmV2ZXJ0ICJxdGRlbXV4OiBBbHdheXMgc25hcCB0byB0aGUgc3RhcnQgb2YgdGhlIGtleWZyYW1lIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCAxMDc5MDJlYzUxNGJkODI2YWEyOWQyMjk4MTA3ZTJjMDkxZTFjNzc5LgorCSAgVGhpcyBjb21taXQgaW50ZW5kZWQgdG8gZW5zdXJlIHRoYXQga2V5ZnJhbWUgc2Vla3MgbGFuZCBhdCB0aGUKKwkgIHN0YXJ0IHRpbWVzdGFtcCBvZiBhIGtleWZyYW1lLCByYXRoZXIgdGhhbiBpbiB0aGUgbWlkZGxlIG9mIG9uZSwKKwkgIGJ1dCB0aGV5IGNhdXNlIHRyb3VibGUgb24gZmlsZXMgd2l0aCBzcGFyc2Ugc3RyZWFtcywgb3Igd2l0aAorCSAgSlBFRyAnY292ZXIgYXJ0JyB0cmFja3MgdGhhdCBoYXZlIG9ubHkgb25lIG9yIGEgZmV3IEpQRUcgc2FtcGxlcworCSAgd2l0aCB2ZXJ5IGxvbmcgZHVyYXRpb25zLgorCSAgVGhhdCdzIHN0aWxsIGRlc2lyYWJsZSBmb3IgZG9pbmcgc2VhbWxlc3MgY3V0dGluZyBvZiB2aWRlb3MsCisJICBidXQgbmVlZHMgYSByZXRoaW5rIGZvciBpbXBsZW1lbnRhdGlvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Nzg2OTAKKworMjAxNy0wMi0xNyAwMToyMjoxMSArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9lY2hvLmg6CisJICBhdWRpb2Z4L2VjaG86IGFkZGVkIHN1cnJvdW5kLWRlbGF5IGFuZCBzdXJyb3VuZC1tYXNrCisJICBBZGQgYSBuZXcgYm9vbGVhbiBzdXJyb3VuZC1kZWxheSBwcm9wZXJ0eSB0aGF0IG1ha2VzCisJICBhdWRpb2VjaG8ganVzdCBhcHBseSBhIGRlbGF5IHRvIGNlcnRhaW4gY2hhbm5lbHMgdG8gY3JlYXRlCisJICBhIHN1cnJvdW5kIGVmZmVjdCwgcmF0aGVyIHRoYW4gYW4gZWNobyBvbiBhbGwKKwkgIGNoYW5uZWxzLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHVwbWl4aW5nIGZyb20gc3RlcmVvIC0gZm9yIGV4YW1wbGUuCisJICBBZGQgYSBzdXJyb3VuZC1tYXNrIHByb3BlcnR5IHRvIGNvbnRyb2wgd2hpY2ggY2hhbm5lbHMKKwkgIGFyZSBjb25zaWRlcmVkIHN1cnJvdW5kIHNvdW5kIGNoYW5uZWxzIHdoZW4gYWRkaW5nIGEKKwkgIGRlbGF5IHdpdGggc3Vycm91bmQtZGVsYXkgPSB0cnVlCisJICBPcmlnaW5hbCBwYXRjaCBmcm9tIEpvY2hlbiBIZW5uZWJlcmcgPGpoQGhlbm5lYmVyZy1zeXN0ZW1kZXNpZ24uY29tPgorCisyMDE3LTAyLTE1IDAwOjEzOjMwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBVc2UgSVBfTVVMVElDQVNUX0FMTCBmb3IgZmlsdGVyaW5nIElQdjQgcGFja2V0cyBpZiBhdmFpbGFibGUKKwkgIFRoaXMgZ29lcyBhcm91bmQgdGhlIGluZWZmaWNpZW50IGNvbnRyb2wgbWVzc2FnZSBiYXNlZCBmaWx0ZXJpbmcgYW5kCisJICBkb2VzIGFsbCB0aGUgZmlsdGVyaW5nIGtlcm5lbC1zaWRlLiBVbmZvcnR1bmF0ZWx5IHRoaXMgaXMgTGludXgtb25seSBhbmQKKwkgIHRoZXJlIGlzIG5vIElQdjYgdmFyaWFudCBvZiBpdCAoeWV0KS4KKworMjAxNy0wMi0xNCAxOTo1MzozMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogTWFrZWZpbGUuYW06CisJICBtZXNvbjogZGlzdCBtZXNvbiBidWlsZCBmaWxlcworCSAgU2hpcCBtZXNvbiBidWlsZCBmaWxlcyBpbiB0YXJiYWxscywgc28gcGVvcGxlIHdobyB1c2UgdGFyYmFsbHMKKwkgIGluIHRoZWlyIGJ1aWxkcyBjYW4gc3RhcnQgcGxheWluZyB3aXRoIG1lc29uIGFscmVhZHkuCisKKzIwMTctMDItMTAgMTA6NTM6MDUgKzAxMDAgIFPDuHJlbiBKdXVsIDx6cG9uLmRrQGdtYWlsLmNvbT4KKworCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pY3lkZW11eC5jOgorCSAgaWN5ZGVtdXg6IHJlc2V0IHRhZ3Mgb24gZW1wdHkgdmFsdWUKKwkgIFNvbWUgcmFkaW8gc3RyZWFtcyB1c2VzIFN0cmVhbVRpdGxlPScnIHRvIHJlc2V0IHRoZSB0aXRsZSBhZnRlciBhCisJICB0cmFjayBzdG9wcGVkIHBsYXlpbmcsIGUuZy4gd2hpbGUgdGhlIGhvc3QgdGFsa3MgYmV0d2VlbiB0cmFja3Mgb3IKKwkgIGR1cmluZyBuZXdzIHNlZ21lbnRzLgorCSAgVGhpcyBjaGFuZ2UgZm9yY2VzIGFuIGVtcHR5IHRhZyBvYmplY3QgdG8gYmUgZGlzdHJpYnV0ZWQgaWYKKwkgIFN0cmVhbVRpdGxlIG9yIFN0cmVhbVVybCBpcyByZWNlaXZlZCB3aXRoIGVtcHR5IHZhbHVlLCB0aHVzIGFsbG93aW5nCisJICBkb3duc3RyZWFtIGVsZW1lbnRzIHRvIGdldCBub3RpZmllZCBhYm91dCB0aGlzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3ODQzNworCisyMDE3LTAyLTEzIDExOjE3OjI1ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBQcm9wZXJseSBub3RpZnkgbWlzc2luZyBlbGVtZW50cworCSAgSWYgdGhlIHNydHAgZWxlbWVudHMgYXJlIG5vdCBwcmVzZW50LCBwb3N0IGEgbWVzc2FnZSBvbiB0aGUgYnVzCisJICBpbmZvcm1pbmcgYWJvdXQgdGhlIG1pc3NpbmcgcGx1Z2lucy4KKworMjAxNy0wMi0xMCAxMDozMjo1NyAtMDMwMCAgSnVhbiBQYWJsbyBVZ2FydGUgPHVnYXJ0ZUBlbmRsZXNzbS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IG1hcmsgc2luZ2xldG9uIGNhcHMgYXMgIm1heSBiZSBsZWFrZWQiIG9iamVjdHMuCisJICBTZXQgTUFZX0JFX0xFQUtFRCBmbGFnIG9uIHN0YXRpYyBwYWRzIHJldHVybmVkIGJ5IGdzdF92NGwyX29iamVjdF9nZXRfKl9jYXBzKCkKKwkgIGZ1bmN0aW9ucy4gTWFkZSBmdW5jdGlvbnMgdGhyZWFkIHNhZmUgYnkgdXNpbmcgZ19vbmNlX2luaXRbZW50ZXJ8bGVhdmVdCisJICBmdW50aW9ucy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Nzg0NTMKKworMjAxNy0wMi0wOSAxNDoxODozMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogUmVtb3ZlIG5vdyB1bnVzZWQgZG9uZSBsYWJlbAorCisyMDE3LTAyLTA5IDEyOjU1OjMyICswMTAwICBOaWNrIEthbGxlbiA8bmlja2thbGxlbkBtZS5jb20+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IGRvIG5vdCBjYWNoZSBjYXBzCisJICBVcHN0cmVhbSBlbGVtZW50cyBsaWtlIHZpZGVvZmxpcCBjYW4gdHJhbnNmb3JtIGNhcHMsIHN1Y2ggYXMgY2hhbmdpbmcgd2lkdGggYW5kIGhlaWdodC4KKwkgIFdoZW4gYW4gaW1hZ2VmcmVlemUgZG93bnN0cmVhbSByZWNlaXZlcyBhbiBBQ0NFUFRfQ0FQUyBxdWVyeSBpdCB3aWxsIE5PVyByZXR1cm4KKwkgIGFsbCBjYXBzIHRoYXQgaXQgY2FuIGFjY2VwdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzgzODkKKworMjAxNy0wMi0wOSAxMToyOTo0MyArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBBZGQgYSBjb21tZW50IGFib3V0IGhvdyBhdG9tX3RyYWtfc2V0X2Vsc3RfZW50cnkoKSB3b3JrcworCisyMDE0LTA4LTIyIDA5OjU1OjQzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5jOgorCSAgcXRkZW11eDogZGVtb3RlIHNvbWUgbG9nIG1lc3NhZ2VzIHRvIFRSQUNFIGxldmVsCisJICBEb24ndCBzcGFtIGRlYnVnIGxvZyB3aXRoIHVuaW50ZXJlc3Rpbmcgc3R1ZmYuCisKKzIwMTctMDItMDggMTc6MjQ6MjYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvYXRvbXMuaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBDbGVhciBlZGl0IGxpc3RzIGV2ZXJ5IHRpbWUgd2UgcmVjYWxjdWxhdGUgdGhlbQorCSAgV2UgcmVjYWxjdWxhdGUgdGhlbSwgc28gYW55IG9sZCBpbmZvcm1hdGlvbiBoYXMgdG8gYmUgZm9yZ290dGVuLgorCSAgT3RoZXJ3aXNlIHdlIHdyaXRlIGludmFsaWQgZWRpdCBsaXN0cyB3aGVuIHdyaXRpbmcgaGVhZGVycyBtdWx0aXBsZQorCSAgdGltZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc4MzMwCisKKzIwMTctMDItMDcgMTM6MTA6MTggKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4cGFydHJlYWRlci5jOgorCSAgc3BsaXRtdXhzcmM6IEFsbG93IGZvciBidWZmZXJzIGJlZm9yZSB0aGUgc2VnbWVudCB3aGVuIG1lYXN1cmluZworCSAgVXNlZCBzaWduZWQgY2FsY3VsYXRpb25zIHdoZW4gbWVhc3VyaW5nIHRoZSBtYXhfdHMgb2YgYW4gaW5wdXQKKwkgIGZyYWdtZW50LCBzbyBhcyB0byBjYWxjdWxhdGUgdGhlIGNvcnJlY3QgZHVyYXRpb24gYW5kIG9mZnNldAorCSAgd2hlbiBidWZmZXJzIGhhdmUgdGltZXN0YW1wcyBwcmVjZWRpbmcgdGhlaXIgc2VnbWVudAorCisyMDE3LTAyLTAyIDEyOjU1OjI1ICswMTAwICBNaWd1ZWwgUGFyw61zIETDrWF6IDxtcGFyaXNkaWF6QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIHJ0cHNlc3Npb246IHJlbGF0ZSByZWNlaXZlZCBGSVJzIGFuZCBQTElzIHRvIHNvdXJjZQorCSAgVGhpcyBpcyBuZWVkZWQgaW4gb3JkZXIgdG86CisJICAtIEF2b2lkIGlnbm9yaW5nIHJlcXVlc3RzIGZvciBkaWZmZXJlbnQgbWVkaWEgc291cmNlcy4KKwkgIC0gQWRkIFNTUkMgZmllbGQgaW4gdGhlIEdzdEZvcmNlS2V5VW5pdCBldmVudC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzgwMTMKKworMjAxNy0wMS0zMCAyMDoyMDowOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBzYW5pdHkgY2hlY2sgbnVtYmVyIG9mIHNlZ21lbnRzIGluIGVkaXQgbGlzdAorCSAgRml4ZXMgY3Jhc2ggd2l0aCBmdXp6ZWQgZmlsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Nzc5NDAKKworMjAxNy0wMS0wMiAyMjoxNjozOSArMDkwMCAgU2V1bmdoYSBZYW5nIDxzaC55YW5nQGxnZS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogU2tpcCBzZWVraW5nIHF1ZXJ5IGlmIHVwc3RyZWFtIGZvcm1hdCBpcyB0aW1lCisJICBEb24ndCBuZWVkIHRvIHF1ZXJ5aW5nIGJ5dGUtZm9ybWF0IHNlZWtpbmcgZm9yIHRpbWUtZm9ybWF0CisJICB1cHN0cmVhbSBjYXNlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc2NzE1CisKKzIwMTYtMTItMDEgMTI6NDc6MDggKzA5MDAgIFNldW5naGEgWWFuZyA8c2gueWFuZ0BsZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFVzZSB1cHN0cmVhbSdzIFN0cmVhbUZsYWdzIGlmIHRoZXJlIGFyZQorCSAgV2hlbiBtdWx0aXBsZSBkZW11eGVyJ3MgYXJlIHVzZWQsIHVwc3RyZWFtIG1pZ2h0IHdhbnQgdG8gaW5kaWNhdGUKKwkgIGRlZmF1bHQgc3RyZWFtcyB1c2luZyBHU1RfU1RSRUFNX0ZMQUdfe1NFTEVDVCwgVU5TRUxFQ1R9CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NDQwCisKKzIwMTctMDEtMjcgMTY6MTQ6MTYgKzAyMDAgIFZpdmlhIE5pa29sYWlkb3UgPHZpdmlhQHRvb2xzb25haXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJICBxdG11eDogVGltZWNvZGUgdHJhY2sgZml4ZXMgZm9yIFNUU0QgZW50cnkKKwkgIFRoZSBuX2ZyYW1lcyBmaWVsZCAoZnJhbWVzIHBlciBzZWNvbmQpIHNob3VsZCBmb2xsb3cgdGhlIG5vbWluYWwgZnJhbWUKKwkgIHJhdGUgZm9yIGRyb3AtZnJhbWUgdGltZWNvZGVzLgorCSAgQWxzbywgdGhlIHRyYWsncyB0aW1lc2NhbGUgKGFuZCBkdXJhdGlvbiwgYWNjb3JkaW5nbHkpIHNob3VsZCBmb2xsb3cgdGhlCisJICBTVFNEIGVudHJ5J3MgdGltZXNjYWxlIGFuZCBmcmFtZSBkdXJhdGlvbiAoZnBzX24gYW5kIGZwc19kIGFjY29yZGluZ2x5KSwKKwkgIG5vdCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Nzc4MzIKKworMjAxNy0wMS0xOSAxMTowODoxMSArMDEwMCAgQXJuYXVkIFZyYWMgPGF2cmFjQGZyZWVib3guZnI+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogcmV0cnkgcmVxdWVzdCBvbiBlYXJseSB0ZXJtaW5hdGlvbiBmcm9tIHRoZSBzZXJ2ZXIKKwkgIEZpeCBhIHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBieSBjb21taXQgMTgzNjk1YzYxYTU0ZjEgKHJlZmFjdG9yIHRvIHVzZQorCSAgU291cCdzIHN5bmMgQVBJKS4gVGhlIGNvZGUgcHJldmlvdXNseSBhdHRlbXB0ZWQgdG8gcmVjb25uZWN0IHdoZW4gdGhlCisJICBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIGVhcmx5LCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBzdHJlYW0gd2FzIHB1dAorCSAgaW4gcGF1c2UgZm9yIHNvbWUgdGltZS4KKwkgIFJlaW50cm9kdWNlIHRoaXMgZmVhdHVyZSBieSBjaGVja2luZyBpZiBFT1MgaXMgcmVjZWl2ZWQgYmVmb3JlIHRoZQorCSAgZXhwZWN0ZWQgY29udGVudCBzaXplIGlzIGRvd25sb2FkZWQuIEluIHRoaXMgY2FzZSwgZG8gdGhlIHJlcXVlc3QKKwkgIHN0YXJ0aW5nIGF0IHRoZSBwcmV2aW91cyByZWFkIHBvc2l0aW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NjcyMAorCisyMDE3LTAxLTEwIDA5OjQwOjU2IC0wNzAwICBNYXR0IFN0YXBsZXMgPHN0YXBsZXMyNTVAZ21haWwuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaW5kX3N0cmVhbV9ieV9jaGFubmVsIHNob3VsZCBpZ25vcmUgdW5jb25maWd1cmVkIHN0cmVhbXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzcxMDEKKworMjAxNy0wMS0yNSAxODo0MzowMCArMDAwMCAgQnJlbmRhbiBTaGFua3MgPGJyZW5kYW4uc2hhbmtzQHRlcmFkZWsuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogRml4IGRlYnVnIHR5cG8gYW5kIHJlbW92ZSBtaXNsZWFkaW5nIHdhcm5pbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzczNjIKKworMjAxNy0wMS0yNSAyMDo1NjoyNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLmM6CisJICBydHA6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgaW4gZXhhbXBsZQorCSAgY2xpZW50LVBDTUEuYzo4NDoyMjogd2FybmluZzogdW51c2VkIHZhcmlhYmxlICdpc3JjJyBbLVd1bnVzZWQtdmFyaWFibGVdCisJICBHT2JqZWN0ICpzZXNzaW9uLCAqaXNyYywgKm9zcmM7CisJICBeCisKKzIwMTctMDEtMDkgMTE6MzI6MzUgKzA1MzAgIFJhaHVsIEJlZGFya2FyIDxyYWh1bC5iZWRhcmthckBpbWd0ZWMuY29tPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBjaGVjayBmb3Igbm90IE5VTEwgYmVmb3JlIGNsZWFyaW5nIGFkYXB0ZXIKKwkgIEluIGNhc2Ugd2F2cGFyc2UgcmVjZWl2ZXMgYSBtYW51YWxseSBpbmplY3RlZCBGTFVTSF9TVE9QIGV2ZW50CisJICB3aGlsZSBvcGVyYXRpbmcgaW4gcHVsbCBtb2RlIHdlIGdldCBjcml0aWNhbHMgYmVjYXVzZSB3ZSdkIHRyeQorCSAgdG8gY2xlYXIgYSBOVUxMIGFkYXB0ZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc3MTIzCisKKzIwMTctMDEtMjQgMTk6MjM6NDQgLTAzMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAb3NnLnNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9tZXNvbi5idWlsZDoKKwkgIG1lc29uOiBQcm9wZXJseSB1c2UgJzonIGZvciBkZWZpbmluZyBrZXl3b3JkcworCisyMDE3LTAxLTE3IDE2OjQxOjU4ICswMTAwICBKZWFuLUNocmlzdG9waGUgVHJvdGluIDxqZWFuLWNocmlzdG9waGUudHJvdGluQHN0LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogcmVmZXJlbmNlIG1lbW9yeSBiZWZvcmUgdGhlIGJ1ZmZlciBpcyBxdWV1ZWQKKwkgIEluIGdzdF92NGwyX2FsbG9jYXRvcl9xYnVmKCksIHRoZSBtZW1vcnkgaXMgcmVmZXJlbmNlZCBhZnRlciB0aGUKKwkgIGJ1ZmZlciBpcyBxdWV1ZWQuIE9uY2UgcXVldWVkIChWSURJT0NfUUJVRiksIHRoZSBidWZmZXIgbWlnaHQgYmUgaGFuZGxlZAorCSAgYnkgdGhlIFY0TDIgZHJpdmVyIChlLmcuIGRlY29kZWQpIGFuZCBkZXF1ZXVlZCAoZ3N0X3Y0bDJfYWxsb2NhdG9yX2RxYnVmKSwKKwkgIHRocm91Z2ggYSBkaWZmZXJlbnQgdGhyZWFkLCBiZWZvcmUgdGhlIG1lbW9yeSBpcyByZWZlcmVuY2VkIChnc3RfbWVtb3J5X3JlZikuCisJICBJbiB0aGlzIGNhc2UsIGluIGdzdF92NGwyX2FsbG9jYXRvcl9kcWJ1ZigpLCB0aGUgbWVtb3J5IGlzIHVucmVmZXJlbmNlZAorCSAgKGdzdF9tZW1vcnlfdW5yZWYpIGJlZm9yZSBoYXZpbmcgYmVlbiByZWZlcmVuY2VkOiB0aGUgbWVtb3J5IHJlZmNvdW50CisJICByZWFjaGVzIDAsIGFuZCB0aGUgbWVtb3J5IGlzIGZyZWVkLgorCSAgU28sIHRvIGF2b2lkIHRoaXMgY3Jvc3NpbmcgY2FzZSwgaW4gZ3N0X3Y0bDJfYWxsb2NhdG9yX3FidWYoKSwgdGhlCisJICBtZW1vcnkgc2hhbGwgYmUgcmVmZXJlbmNlZCBiZWZvcmUgdGhlIGJ1ZmZlciBpcyBxdWV1ZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc3Mzk5CisKKzIwMTctMDEtMjQgMTc6NTk6NTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkgIHF0bXV4OiBPbmx5IHdyaXRlIDQgYnl0ZSB6ZXJvIHBhZGRpbmcgdG8gdGhlIFZpZGVvIFNhbXBsZSBEZXNjcmlwdGlvbiBpbiBNT1YKKwkgIEZvciBNUDQgdGhpcyBpcyBub3QgZGVmaW5lZCwgYW5kIGl0IGFjdHVhbGx5IGJyZWFrcyB0aGluZ3MgZm9yIE1TRSBpbgorCSAgQ2hyb21lIGlmIHdlIGRvIHRoaXMuIEZvciBNT1YgdGhpcyBpcyByZXF1aXJlZCBieSBzb21lIGJyb2tlbiBzb2Z0d2FyZQorCSAgYnV0IHRoZSBvZmZpY2lhbCBzcGVjaWZpY2F0aW9uIHNheXMgaXQncyBvcHRpb25hbDoKKwkgIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJyYXJ5L2NvbnRlbnQvZG9jdW1lbnRhdGlvbi9RdWlja1RpbWUvUVRGRi9RVEZGQ2hhcDMvcXRmZjMuaHRtbAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NzU0MAorCisyMDE3LTAxLTAyIDEzOjQyOjA0ICswMTAwICBTYW50aWFnbyBDYXJvdC1OZW1lc2lvIDxzY2Fyb3RAdHdpbGlvLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgcnRwc3RhdHM6IEtlZXAgbnVtYmVyIG9mIG5hY2tzIHNlbnQvcmVjZWl2ZWQgcGVyIHNvdXJjZQorCSAgQ3VycmVudGx5LCB0aGUgbmFjayBwYWNrZXRzIHNlbnQgb3IgcmVjZWl2ZWQgYXJlIGtlcHQgYXQgc2Vzc2lvbiBsZXZlbCwKKwkgIHdoaWNoIG1ha2VzIGl0IGltcG9zc2libGUgdG8gZGlzdGluZ3Vpc2ggaG93IG1hbnkgb2YgdGhlc2UgcGFja2FnZXMgd2VyZQorCSAgc2VudC9yZWNlaXZlZCBwZXIgc3NyYyB3aGVuIHNldmVyYWwgc291cmNlcyBhcmUgaW4gdGhlIHNhbWUgc2Vzc2lvbi4gVGhpcworCSAgcGF0Y2ggaXMgYWxpZ25lZCB3aXRoIHRoZSBodHRwczovL3d3dy53My5vcmcvVFIvd2VicnRjLXN0YXRzLyNkb20tcnRjcnRwc3RyZWFtc3RhdHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzY3MTQKKworMjAxNi0xMi0wOCAxNTo1OTozMyArMDEwMCAgSm9uYXMgSG9sbWJlcmcgPGpvbmFzaGdAYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSAgcnRwaDI2NXBheTogRml4IGhhbmRsaW5nIG9mIGNvbmZpZy1pbnRlcnZhbAorCSAgSW5zZXJ0IFZQUy9TUFMvUFBTIGJlZm9yZSB0aGUgZmlyc3QgTkFMIHVuaXQgY29udGFpbmluZyBhbiBJLWZyYW1lIGluIGFuCisJICBhY2Nlc3MgdW5pdCBvbmx5LiBJZiBhbiBhY2Nlc3MgdW5pdCBjb25zaXN0cyBvZiBzZXZlcmFsIHN1Y2ggTkFMIHVuaXRzCisJICAodGlsZXMpIFZQUy9TUFMvUFBTIHNob3VsZCBvbmx5IGJlIGluc2VydGVkIGJlZm9yZSB0aGUgZmlyc3Qgb2YgdGhlbSBzbworCSAgdGhhdCBwYXJhbWV0ZXJzIGFyZSBvbmx5IHVwZGF0ZWQgYmV0d2VlbiBmcmFtZXMuCisJICBEbyBub3QgaW5zZXJ0IFZQUy9TUFMvUFBTIGJlZm9yZSBQLWZyYW1lcyB3aGVuIGNvbmZpZy1pbnRlcnZhbCBpcyAtMS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzU4MTcKKworMjAxNy0wMS0xOSAxMjoyOTo0NCArMDEwMCAgQXJuYXVkIFZyYWMgPGF2cmFjQGZyZWVib3guZnI+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogcmVwb3J0IGEgdXNlZnVsIGVycm9yIG1lc3NhZ2Ugd2hlbiBzb3VwX3Nlc3Npb25fc2VuZCBmYWlscworCSAgVGhpcyBoZWxwcyB0byB1bmRlcnN0YW5kIGNhc2VzIHdoZXJlIGxpYnNvdXAgZG9lc24ndCBzZXQgdGhlIG1lc3NhZ2UKKwkgIHN0YXR1cyBjb2RlIGFmdGVyIHJ1bm5pbmcgc291cF9zZXNzaW9uX3NlbmQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc3MjIyCisKKzIwMTctMDEtMTkgMTE6MDU6MDAgKzAxMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IHByb3Blcmx5IGNoZWNrIHRoYXQgc2VlayByYW5nZSB3YXMgcmVzcGVjdGVkCisJICBUaGlzIGNoZWNrIG11c3QgYmUgZG9uZSBvbmx5IHdoZW4gd2UgYXJlIHN1cmUgdGhlIHJlcXVlc3Qgd2FzCisJICBzdWNjZXNzZnVsbHkgc2VudC4gc291cF9zZXNzaW9uX3NlbmQoKSBtaWdodCBmYWlsIHdpdGhvdXQgc2V0dGluZyB0aGUKKwkgIHN0YXR1cyBjb2RlLiBJbiB0aGlzIGNhc2Ugc3RhdHVzIGNvZGUgaXMgMCBzbyB3ZSB3b3VsZCBvbmx5IGNhdGNoIHRoZQorCSAgZXJyb3IgYWZ0ZXIgdGhlIHNlZWsgcmFuZ2UgY2hlY2suIEluIHRoaXMgY2FzZSB3ZSB3b3VsZCByZXBvcnQgYW4gZXJyb3IKKwkgIHNheWluZyB0aGF0IHRoZSBzZWVrIHJhbmdlIHdhcyBub3QgcmVzcGVjdGVkLCBpbnN0ZWFkIG9mIHJlcG9ydGluZyB0aGUKKwkgIHVuZGVybHlpbmcgZXJyb3IgdGhhdCB0cmlnZ2VyZWQgdGhlIHNvdXBfc2Vzc2lvbl9zZW5kKCkgZmFpbHVyZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL2F0dGFjaG1lbnQuY2dpP2J1Z2lkPTc3NzIyMgorCisyMDE3LTAxLTA5IDIxOjA0OjUxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zm92ZXJsYXkuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zm92ZXJsYXkuaDoKKwkgIGdka3BpeGJ1Zm92ZXJsYXk6IGFkZCBhIHBvc2l0aW9uaW5nIGNvZWZmaWNpZW50IHBhaXIKKwkgIC4uLiBzbyBhcyB0byBhbGxvdyBvbmUgY2xlYXJseSBkZWZpbmVkIChhYnNvbHV0ZSkgcG9zaXRpb25pbmcgbW9kZQorCSAgdGhhdCBjYW4gY2F0ZXIgZm9yIGEgdmFyaWV0eSBvZiBhYnNvbHV0ZSBidXQgYWxzbyByZWxhdGl2ZSBwb3NpdGlvbmluZworCSAgd2l0aCByZXNwZWN0IHRvIGVkZ2Ugb3IgY2VudGVyLgorCisyMDE3LTAxLTIxIDIwOjQ4OjIyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zm92ZXJsYXkuYzoKKwkgIGdka3BpeGJ1Zm92ZXJsYXk6IHVwZGF0ZSBjb21wb3NpdGlvbiBpbiBfYmVmb3JlX3RyYW5zZm9ybQorCSAgLi4uIHNpbmNlIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIHBhc3N0aHJvdWdoIG1vZGUgZm9yIGJ1ZmZlciBwcmVwYXJhdGlvbiBiZWZvcmUKKwkgIGNhbGxpbmcgaW50byBfdHJhbnNmb3JtX2lwLgorCisyMDE3LTAxLTA3IDIwOjExOjEzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zm92ZXJsYXkuYzoKKwkgIGdka3BpeGJ1Zm92ZXJsYXk6IGhhbmRsZSBzZXR0aW5nIE5VTEwgZ2RrcGl4YnVmCisJICAuLi4gd2hpY2ggaXMgYSBjbGVhcmVyIHdheSB0byBjbGVhciBhbnkgY3VycmVudCBvdmVybGF5LCBvdGhlciB0aGFuCisJICBmaWRkbGluZyB3aXRoIGFscGhhIG9yIHBvc2l0aW9uaW5nIHByb3BlcnRpZXMgdG8gbWFrZSBpdCB2aXJ0dWFsbHkgZ28gYXdheS4KKworMjAxNy0wMS0yMCAxNzoxNjoxMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IFN0b3AgcmVhZGluZyBhIG5jZHQgc3ViLXRhZyBpZiBpdCBnb2VzIGJlaGluZCB0aGUgc3Vycm91bmRpbmcgdGFnCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc3NTMyCisKKzIwMTctMDEtMjAgMDc6NTg6MjYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBGaXggdmFyaW91cyBvdXQgb2YgYm91bmRzIHJlYWRzIHdoZW4gcGFyc2luZyBuY2R0IHRhZ3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Nzc1MDAKKworMjAxNy0wMS0xOSAxMzo0Njo1OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBJbmNyZW1lbnQgY3VycmVudCBzdHRzIGluZGV4IHdoZW5ldmVyIHdlIGZpbmlzaGVkIG9uZSBzdHRzIGVudHJ5CisJICBPdGhlcndpc2Ugd2UgY291bGQgcmVhZCBtb3JlIGNodW5rcyB0aGFuIHRoZXJlIGFyZSBhdmFpbGFibGUsIGRvaW5nIGFuCisJICBvdXQgb2YgYm91bmRzIHJlYWQgYW5kIHBvdGVudGlhbGx5IGNyYXNoLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NzQ2OQorCisyMDE3LTAxLTE5IDEzOjI1OjUzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIFJldmVydCAicXRkZW11eDogSW5jcmVtZW50IGN1cnJlbnQgc3R0cyBpbmRleCBpbiBhbGwgY29kZSBwYXRocyBhZnRlciByZWFkaW5nIG9uZSBjaHVuayIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgOTlkNWQ3NTcwZDBiNTNkYWQzYmM4ZWI2NTNiMTMyMGVlNDIyYWFjZS4gSXQgYnJva2UKKwkgIHBsYXliYWNrIG9mIHZhcmlvdXMgdmFsaWQgZmlsZXMuCisKKzIwMTctMDEtMTkgMDc6NTI6MzMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogSW5jcmVtZW50IGN1cnJlbnQgc3R0cyBpbmRleCBpbiBhbGwgY29kZSBwYXRocyBhZnRlciByZWFkaW5nIG9uZSBjaHVuaworCSAgT3RoZXJ3aXNlIHdlIGNvdWxkIHJlYWQgbW9yZSBjaHVua3MgdGhhbiB0aGVyZSBhcmUgYXZhaWxhYmxlLCBkb2luZyBhbgorCSAgb3V0IG9mIGJvdW5kcyByZWFkIGFuZCBwb3RlbnRpYWxseSBjcmFzaC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Nzc0NjkKKworMjAxNy0wMS0xOSAwODozNzozNyArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBJbml0aWFsaXplIHJldHVybiB2YXJpYWJsZQorCSAgSW4gdGhlIG5vcm1hbCB1c2UtY2FzZSB3ZSB3b3VsZCBlbmQgdXAgd2l0aCByZXQgYmVpbmcgdW5pdGlhbGl6ZWQKKwkgIGNhdXNpbmcgaGF2b2MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc3MjIyCisKKzIwMTctMDEtMTMgMTI6Mjc6NDAgKzAwMDAgIERhdmlkIFdhcm1hbiA8ZHdhcm1hbkBtYW5nbGViaXQub3JnPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGF2b2lkIFhNUCB0YWcgcGFyc2luZyBmYXRhbCBlcnJvci4KKwkgIHF0ZGVtdXhfaGFuZGxlX3htcF90YWdsaXN0KCkgcmVxdWlyZXMgYSB3cml0YWJsZSB0YWdsaXN0LAorCSAgYnV0IHF0ZGVtdXgtPnRhZ19saXN0IGNhbiBiZWNvbWUgbm9uLXdyaXRhYmxlLCBzcGVjaWZpY2FsbHkKKwkgIGFmdGVyIHNlbmRpbmcgZ2xvYmFsIHRhZ3MgKHF0ZGVtdXguYzo5NTgpLCB3aGljaCBhZGRzIGEKKwkgIHNlY29uZCByZWZlcmVuY2UuICBFbnN1cmUgdGhlIGxpc3QgaXMgbWFkZSB3cml0YWJsZSBiZWZvcmUKKwkgIGNhbGxpbmcgKG1ha2Vfd3JpdGFibGUgd2lsbCBjb3B5IHRoZSBsaXN0IGlmIG5lY2Vzc2FyeSkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY2MTc3CisKKzIwMTYtMDUtMzEgMTM6MTc6NDUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzYW50b3NAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJld29yayB0YWdsaXN0IGhhbmRsaW5nCisJICBLZWVwIHRhZ2xpc3QgYXJvdW5kIGR1cmluZyBlbGVtZW50IGV4aXN0YW5jZSB0byBhdm9pZCBoYXZpbmcgdG8KKwkgIGNyZWF0ZSBpdCBhdCBkaWZmZXJlbnQgcGxhY2VzIGJlZm9yZSB1c2FnZS4gTWFrZXMgY29kZSBzaW1wbGVyIHRvIGhhbmRsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjYxNzcKKworMjAxNy0wMS0xNiAxMTo1ODowMiArMDEwMCAgQXJuYXVkIFZyYWMgPGF2cmFjQGZyZWVib3guZnI+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IG1ha2UgZmxvdyByZXR1cm4gdmFsdWVzIGhhbmRsaW5nIGNsZWFyZXIKKwkgIFRoZSBmbG93IHJldHVybiB2YWx1ZXMgd2FzIHN0b3JlZCBpbiB0aGUgZWxlbWVudCBiZWZvcmUgYmVjYXVzZSB0aGUKKwkgIHJlc3VsdCBoYWQgdG8gYmUgc2V0IGZyb20gY2FsbGJhY2tzLiBUaGlzIGlzIG5vdCB0aGUgY2FzZSBhbnltb3JlLCB3ZQorCSAgY2FuIHJldHVybiB0aGUgZmxvdyByZXN1bHQgZGlyZWN0bHkgZnJvbSBmdW5jdGlvbnMsIG1ha2luZyB0aGUgY29kZQorCSAgZWFzaWVyIHRvIHVuZGVyc3RhbmQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc3MjIyCisKKzIwMTctMDEtMTMgMTY6NDA6NDMgKzAxMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IHByb3Blcmx5IHRyYWNrIHJlZGlyZWN0aW9ucworCSAgVGhlIGN1cnJlbnQgY29kZSBjb25maWd1cmVzIGxpYnNvdXAgdG8gaGFuZGxlIHJlZGlyZWN0aW9ucworCSAgdHJhbnNwYXJlbnRseSwgd2l0aG91dCBpbmZvcm1pbmcgdGhlIGNhbGxlciwgdGh1cyBwcmV2ZW50aW5nIHRoZSBlbGVtZW50CisJICB0byByZWNvcmQgdGhlIHJlZGlyZWN0IGNvZGUgYW5kIGxvY2F0aW9uIHVyaS4KKwkgIEZpeCB0aGlzIGJ5IGFsd2F5cyBzZXR0aW5nIHRoZSBTT1VQX01FU1NBR0VfTk9fUkVESVJFQ1QsIHByZXZlbnRpbmcKKwkgIGxpYnNvdXAgZnJvbSBoYW5kbGluZyB0aGUgcmVkaXJlY3Rpb24uIFdoZW4gd2UgcmVjZWl2ZSBhIHJlZGlyZWN0aW9uCisJICByZXF1ZXN0IGFuZCBsaWJzb3VwIGNhbiBzYWZlbHkgaGFuZGxlIGl0LCByZXR1cm4gYSBjdXN0b20gZXJyb3Igd2hpY2gKKwkgIHRyaWdnZXJzIGEgcmV0cnkgd2l0aCB0aGUgbmV3IFVSSS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzcyMjIKKworMjAxNy0wMS0xNyAxMDo1MzozOSArMDEwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eG1hcC5jOgorCSAgcXRtdXg6IGFkZCA0NDQ0IGFuZCA0NDQ0eHEgdmFyaWFudHMgdG8gdmlkZW8veC1wcm9yZXMgcGFkIHRlbXBsYXRlIGNhcHMKKwkgIFRoZXkgYXJlIGhhbmRsZWQgc2luY2UgY29tbWl0IDdiNTY1NDc1YmY1NTFjNTNiOGVlZDQ2ZjcwODZmM2IzNzJmMWY2YzQKKwkgIChxdDogQWRkIHN1cHBvcnQgZm9yIFByb1JlcyA0NDQ0IFhRKS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzczNzcKKworMjAxNy0wMS0xNyAxMDo0ODo1NyArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkgIG1hdHJvc2thOiBRdWlldCBhIFdBUk4gd2hlbiBwYXJzaW5nIHB1c2ggbW9kZQorCSAgVGhpcyB3YXJuaW5nIHdhcyBub2lzeSB3aGVuIHJldHVybmluZyBFT1MsIHdoaWNoIGlzCisJICBqdXN0IHVzZWQgdG8gaW5kaWNhdGUgbW9yZSBkYXRhIGlzIG5lZWRlZCBmcm9tIHVwc3RyZWFtLgorCisyMDE3LTAxLTE2IDE0OjUwOjIyICswMTAwICBHZW9yZyBMaXBwaXRzY2ggPGdsaXBwaXRzY2hAdG9vbHNvbmFpci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBEb24ndCB3cml0ZSBTeW5jIFNhbXBsZSBBdG9tIGZvciBQcm9SZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzczMzEKKworMjAxNS0wMS0yOCAwODo1ODoyNiArMDEwMCAgRW5yaWNvIEpvcm5zIDxlam9AcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmg6CisJICB2NGwyOiBSZW1vdmUgdXNhZ2UgYW5kIGRlZmluaXRpb24gb2YgTE9HX0NBUFMgbWFjcm8KKwkgIFVubGlrZSBmb3JtZXIgZGVmaW5pdGlvbnMgb2YgTE9HX0NBUFMsIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHNpbXBseQorCSAgZXhwYW5kcyB0byBHU1RfREVCVUdfT0JKRUNULiBUaGUgTE9HX0NBUFMgbWFjcm8gaXMgcmFyZWx5IHVzZWQgYW5kIG1vc3QKKwkgIHVzZXMgZHVwbGljYXRlIGFscmVhZHkgZXhpc3RpbmcgR1NUX0RFQlVHX09CSkVDVCBsaW5lcy4gVGhlcmVmb3JlLCB0aGUKKwkgIGNhcHMgYXJlIG9mdGVuIHByaW50ZWQgdHdpY2Ugd2hpY2ggdW5uZWNlc3NhcmlseSBjbHV0dGVycyB0aGUgZGVidWcgbG9nLgorCSAgUmVwbGFjZSBMT0dfQ0FQUyBjYWxscyB3aXRoIEdTVF9ERUJVR19PQkpFQ1QsIHJlbW92ZSBMT0dfQ0FQUyBjYWxscywgYW5kCisJICBkZWxldGUgdGhlIGRlZmluaXRpb24gb2YgTE9HX0NBUFMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc2ODk5CisKKzIwMTctMDEtMTYgMTU6NDA6NDMgKzAxMDAgIEplYW4tQ2hyaXN0b3BoZSBUcm90aW4gPGplYW4tY2hyaXN0b3BoZS50cm90aW5Ac3QuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IHJlbW92ZSBkdXBsaWNhdGVkIGxpbmUgb2YgY29kZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NzMzMAorCisyMDE3LTAxLTE2IDE1OjE3OjE1ICswMTAwICBKZWFuLUNocmlzdG9waGUgVHJvdGluIDxqZWFuLWNocmlzdG9waGUudHJvdGluQHN0LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogZml4IG1lbW9yeSB0eXBlIGluIGFsbG9jYXRvciBwcm9iZQorCSAgVGhlIGJ1ZmZlciBtZW1vcnkgdHlwZSBwcm92aWRlZCB0byB0aGUgVklESU9DX0NSRUFURV9CVUZTIGlvY3RsIHNoYWxsCisJICBiZSBzZXQgd2l0aCB0aGUgdmFsdWUgKCJtZW1vcnkiKSBnaXZlbiBhcyBpbnB1dCBwYXJhbWV0ZXIgb2YgdGhlCisJICBnc3RfdjRsMl9hbGxvY2F0b3JfcHJvYmUoKSBmdW5jdGlvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzczMjcKKworMjAxNy0wMS0xNCAxNToyNzoxOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogZml4IG90aGVyIGljb24gY291bnRlciBjaGVjaworCSAgSXQncyBuZXZlciBnb2luZyB0byBiZSAwIGlmIHdlIGZpcnN0IGluY3JlbWVudCBhbmQgdGhlbiBjaGVjay4KKworMjAxNy0wMS0xNCAxNToxNjo1MyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBib2xkbHkgYXNzdW1lIHRoYXQgZmlyc3QgJ2NvdnInIGltYWdlIGlzIHRoZSBmcm9udCBjb3ZlcgorCisyMDE3LTAxLTE0IDE1OjA5OjA3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGV4dHJhY3QgY292ZXIgYXJ0IGltYWdlcyBpbnRvIEdTVF9UQUdfSU1BR0Ugbm90IFBSRVZJRVdfSU1BR0UKKwkgIFRoZXNlIGFyZSB1c3VhbGx5IG11Y2ggYmlnZ2VyIHRoYW4gaWNvbiBzaXplIGFuZCByZXF1aXJlZCBieQorCSAgaVR1bmVzIHRvIGJlIGNlcnRhaW4gZmFpcmx5IGxhcmdlIHNpemVzLiBJbiBxdG11eCBpdCBpcyBhbHNvCisJICB0aGUgSU1BR0UgdGFncyB3aGljaCB3ZSB3cml0ZSBvdXQgYXMgJ2NvdnInIGF0b21zLgorCisyMDE3LTAxLTE0IDE1OjA1OjM2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBhbHNvIHNldCBQSUNUVVJFIHRhZyB3aWR0aCBhbmQgaGVpZ2h0IGlmIGF2YWlsYWJsZQorCisyMDE3LTAxLTE0IDE0OjU4OjUyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBmaXggZW5jb2RlciBpbml0IGVycm9yIHdpdGggc29tZSBHU1RfVEFHX1BSRVZJRVdfSU1BR0VzCisJICBUaGUgZW5jb2RlciBmYWlscyB0byBpbml0aWFsaXNlIHdoZW4gd2UgdHJ5IHRvIHNldCBHU1RfVEFHX1BSRVZJRVdfSU1BR0VzCisJICBzZW50IHRvIHVzZSBieSBxdGRlbXV4IGZyb20gaVR1bmVzLWdlbmVyYXRlZCBtNGEgZmlsZXMuIFdlIHNob3VsZAorCSAgbm90IGp1c3QgYmxpbmRseSB0cmFuc2xhdGUgdGhlIFBSRVZJRVcgdGFnIHRvIGZpbGUgaWNvbiBpbWFnZSB0eXBlcywKKwkgIGJ1dCBjaGVjayBpZiB0aGUgc3BlY2lmaWMgY29uZGl0aW9ucyByZXF1aXJlZCBhcmUgbWV0IChpLmUuIGltYWdlCisJICB0eXBlIDEgbXVzdCBiZSBhIDMyeDMyIFBORyBpY29uLCBhbmQgd2hhdCB3ZSdyZSBnZXR0aW5nIGlzIDUwMHg1MDApLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3Njk2MgorCisyMDE3LTAxLTEzIDEyOjM5OjAwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBtZXNvbi5idWlsZDoKKwkgIG1lc29uOiBidW1wIHZlcnNpb24KKworMjAxNi0xMi0yMiAxNzo0MDo0MCArMDIwMCAgVml2aWEgTmlrb2xhaWRvdSA8dml2aWFAdG9vbHNvbmFpci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSAgc3BsaXRtdXhzaW5rOiBBZGQgb3B0aW9uIGZvciB0aW1lY29kZS1iYXNlZCBzcGxpdAorCSAgSWYgdGhpcyBvcHRpb24gaXMgZ2l2ZW4sIGl0IHdpbGwgY2FsY3VsYXRlIHRoZSBuZXh0IHNwbGl0IHBvaW50IGJhc2VkIG9uCisJICB0aW1lY29kZSBkaWZmZXJlbmNlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NDIwOQorCisyMDE3LTAxLTEzIDAwOjAxOjA2ICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IERvbid0IHJlc2V0IHJlcXVlc3QgcGFkIG51bWJlcmluZyBhY3Jvc3MgdXNlcworCSAgV2hlbiByZXNldCwgZG9uJ3QgcmVzdGFydCByZXF1ZXN0IHBhZCBudW1iZXJpbmdzLCBhcworCSAgcmVxdWVzdCBwYWRzIGNhbiBzdXJ2aXZlIGFjcm9zcyBzdGF0ZSBjaGFuZ2VzLiBPbmx5CisJICByZXN0YXJ0IGF0IDAgaWYgYWxsIHJlcXVlc3QgcGFkcyBhcmUgaGFuZGVkIGJhY2sgZmlyc3QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc3MTc0CisKKzIwMTctMDEtMTEgMTg6NTI6MjggKzAxMDAgIE1hdGhpZXUgRHVwb25jaGVsbGUgPG1hdGhpZXUuZHVwb25jaGVsbGVAb3BlbmNyZWVkLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cXVldWUuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHF1ZXVlLmg6CisJICBydHhxdWV1ZTogRXhwb3NlIGJhc2ljIHN0YXRpc3RpY3MgYXMgcHJvcGVydGllcy4KKwkgIFN0YXRpc3RpY3MgYWJvdXQgdGhlIHRvdGFsIG51bWJlciBvZiByZXRyYW5zbWlzc2lvbiByZXF1ZXN0cworCSAgYW5kIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHJldHJhbnNtaXR0ZWQgcGFja2V0cyBjYW4gYmUgaGVscGZ1bAorCSAgYXQgYXBwbGljYXRpb24tbGV2ZWwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc3MTgyCisKKzIwMTctMDEtMTIgMTc6NDU6MzUgKzAxMDAgIEF1csOpbGllbiBaYW5lbGxpIDxhdXJlbGllbi56YW5lbGxpQHBhcnJvdC5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBzaW1wbGlmeSB2aWRlby94LWgyNjQgY2FwcyBoYW5kbGluZworCSAgJ3N0cmVhbS1mb3JtYXQnIGFuZCAnYWxpZ25tZW50JyBhcmUgZGVmaW5lZCBpbiBwYWQgdGVtcGxhdGUgY2FwcyBzbworCSAgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayB0aGVtIGFnYWluIGhlcmUuIEFsc28gcmVtb3ZlIGJpdHJhdGUgcGFyc2luZyBmcm9tCisJICBjYXBzIGFzIGJpdHJhdGUgaW4gY2FwcyBkb2Vzbid0IG1ha2Ugc2Vuc2UgYnV0IGZyb20gdGFncywgd2hpY2ggaXMKKwkgIGFjdHVhbGx5IHRoZSBjYXNlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NzE4MQorCisyMDE2LTEyLTA4IDE3OjAyOjIyICswMTAwICBBdXLDqWxpZW4gWmFuZWxsaSA8YXVyZWxpZW4uemFuZWxsaUBwYXJyb3QuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogYWRkIGJhc2ljIEhFVkMvSC4yNjUgbXV4aW5nIHN1cHBvcnQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzY3NTIKKworMjAxNy0wMS0xMSAxODoyOTowNSArMDEwMCAgR2VvcmcgTGlwcGl0c2NoIDxnbGlwcGl0c2NoQHRvb2xzb25haXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogQ2FsY3VsYXRlIGNsZWFuIGFwZXJ0dXJlIHNpemUKKwkgIENhbGN1bGF0ZSBjbGVhbiBhcGVydHVyZSBkaW1lbnNpb25zIGJ5IGZpcnN0IGd1ZXNzaW5nCisJICBkaXNwbGF5IGFzcGVjdCByYXRpbyBiYXNlZCBvbiBwaXhlbCBhc3BlY3QgcmF0aW8gYW5kCisJICBmcmFtZSBzaXplLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NzEwMAorCisyMDE3LTAxLTEwIDE4OjE5OjU1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmM6CisJICBxdG11eDogV3JpdGUgdGFwdCBhdG9tIGZvciBNT1YgZmlsZXMgaWYgUEFSIG5vdCAxLzEKKwkgIE5lZWRlZCBmb3IgUXVpY2tUaW1lIDcgdG8gcHJvcGVybHkgcGxheSBmaWxlcy4KKwkgIEFsc28gd3JpdGUgdGhlIGNsYXAgYXRvbSBmb3IgTU9WIGZpbGVzIGFsd2F5cywgbm90IG9ubHkgd2hlbiBQcm9SZXMgaXMKKwkgIHVzZWQgYXMgYSB2aWRlbyBjb2RlYy4gSXQncyBtYW5kYXRvcnkgZm9yIE1PVi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzcxMDAKKworMjAxNy0wMS0xMiAxNjozMjo0NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjExLjEgPT09CisKKzIwMTctMDEtMTIgMTU6MzE6MDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnNpZ25hbHM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdnB4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJICBSZWxlYXNlIDEuMTEuMQorCisyMDE3LTAxLTEyIDE0OjM4OjU1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDE3LTAxLTEyIDE0OjM2OjIyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9lbC5wbzoKKwkqIHBvL2hyLnBvOgorCSogcG8vaWQucG86CisJKiBwby96aF9DTi5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTctMDEtMTEgMTc6NTM6MzIgLTA4MDAgIEFuZHJlIE1jQ3VyZHkgPGFybWNjdXJkeUBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZnJlZSBzZXFoIGFmdGVyIGNhbGxpbmcgcXRkZW11eF9wYXJzZV9zdnEzX3N0c2RfZGF0YSgpCisJICBUaGUgc2VxaCBidWZmZXIgYWxsb2NhdGVkIGluIHF0ZGVtdXhfcGFyc2Vfc3ZxM19zdHNkX2RhdGEoKSBuZWVkcyB0bworCSAgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciBhZnRlciB1c2UuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc3MTU3CisJICBTaWduZWQtb2ZmLWJ5OiBBbmRyZSBNY0N1cmR5IDxhcm1jY3VyZHlAZ21haWwuY29tPgorCisyMDE3LTAxLTEwIDE2OjAxOjM1ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBpc29tcDQ6IERvbid0IHNwYW0gZGVidWcgbG9nIHdpdGgga25vbncvcGFkZGluZyBhdG9tcworCSAgT25seSBvdXRwdXQgV0FSTklORyBtZXNzYWdlcyBmb3IgYXRvbXMgd2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlCisJICBpbnN0ZWFkIG9mIGZvciBwYWRkaW5nL2tub3duIGF0b21zIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55IHByb2Nlc3NpbmcKKwkgIG9uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc3MDk1CisKKzIwMTctMDEtMDkgMTk6MDU6MTAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY2RlcGF5LmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICBGaXggaW5kZW50YXRpb24KKworMjAxNy0wMS0wOSAxOTowNDowNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICB0ZXN0czogcnRwaml0dGVyYnVmZmVyOiBmaXggY29tcGlsZXIgd2FybmluZyBkdWUgdG8gYzk5LWlzbQorCSAgcnRwaml0dGVyYnVmZmVyLmM6NTkyOjM6IGVycm9yOiDigJhmb3LigJkgbG9vcCBpbml0aWFsIGRlY2xhcmF0aW9ucyBhcmUgb25seSBhbGxvd2VkIGluIEM5OSBtb2RlCisKKzIwMTYtMTEtMTEgMTQ6MzE6MDMgKzExMDAgIE1hdHRoZXcgV2F0ZXJzIDxtYXR0aGV3QGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2RldGVjdC5jOgorCSAgYXV0b2RldGVjdDogYnJpbmcgdGhlIGVsZW1lbnQgc3RhdGUgZG93biBhZnRlciBzdWNjZXNzCisJICBPdGhlcndpc2Ugc29tZSBtZXNzYWdlcyB0aGF0IGFyZSBlbWl0dGVkIGJ5IHRoZSBlbGVtZW50IG9uIE5VTEwtPlJFQURZCisJICB3aWxsIG5vdCByZWFjaCB0aGUgYXBwbGljYXRpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY0OTQ3CisKKzIwMTctMDEtMDggMDE6MTM6MzIgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogV3JpdGUgdGZkdCBhdG9tIGludG8gZnJhZ21lbnRlZCBmaWxlcy4KKwkgIFRoZSBEQVNIIHNwZWMgcmVxdWlyZXMgdGhhdCB0ZmR0IGF0b21zIGJlIHByZXNlbnQsIHNvCisJICB3cml0ZSBvbmUgb3V0LiBJU08vSUVDIDIzMDA5LTE6MjAxNCA2LjMuNC4yCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA4MjIxCisKKzIwMTctMDEtMDcgMjM6NTU6NDIgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IERvbid0IHJlc2V0IG91dHB1dCB0aW1lc3RhbXBzIHdoZW4gbm8gdGZkdAorCSAgSWYgYSBmcmFnbWVudGVkIHN0cmVhbSBkb2Vzbid0IGhhdmUgYSB0ZmR0LCBkb24ndAorCSAgcmVzZXQgdGhlIG91dHB1dCB0aW1lc3RhbXBzIGF0IGVhY2ggZnJhZ21lbnQgYm91bmRhcnkKKwkgIGJ5IGVycm9uZW91c2x5IHVzaW5nIHRoZSBkZWZhdWx0IHZhbHVlIG9mIDAuIEludHJvZHVjZWQKKwkgIGJ5IGNvbW1pdCA2OWZjNDgKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTQyMzAKKworMjAxNi0xMi0xNiAxNjo1MTo0OCAtMDMwMCAgVGhpYmF1bHQgU2F1bmllciA8dGhpYmF1bHQuc2F1bmllckBvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC92cHgvbWVzb24uYnVpbGQ6CisJKiBnc3QvZXF1YWxpemVyL21lc29uLmJ1aWxkOgorCSogZ3N0L2lzb21wNC9tZXNvbi5idWlsZDoKKwkqIG1lc29uLmJ1aWxkOgorCSAgbWVzb246IEluc3RhbGwgcHJlc2V0cyBmaWxlcworCisyMDE3LTAxLTAzIDEwOjEyOjMwICswNTMwICBHYXJpbWEgR2F1ciA8Z2FyaW1hLmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggc29tZSBjYXBzIGxlYWtzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy8vc2hvd19idWcuY2dpP2lkPTc3Njc4OQorCisyMDE2LTEyLTIyIDE3OjM0OjA4ICswMjAwICBWaXZpYSBOaWtvbGFpZG91IDx2aXZpYUBhaGlydS5ldT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkgIHNwbGl0bXV4c2luazogUmV0dXJuIGEgYmluIHdpdGggYSAibG9jYXRpb24iIHByb3BlcnR5IGFzIGEgc2luaworCSAgU3BsaXRtdXhzaW5rIG1pZ2h0IGJlIGNhbGxlZCB3aXRoIGEgY3VzdG9tIGJpbiBhcyBhIHNpbmsuIElmIGl0IGhhcyBhCisJICAibG9jYXRpb24iIHByb3BlcnR5LCBpdCBjYW4gYmUgdXNlZC4KKworMjAxNi0xMS0xOCAyMjo0MjoxOCArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSAgc3BsaXRtdXg6IFJld3JpdGUgYnVmZmVyIGNvbGxlY3Rpb24gYW5kIHNjaGVkdWxpbmcKKwkgIE1ham9ybHkgY2hhbmdlIHRoZSB3YXkgdGhhdCBzcGxpdG11eHNpbmsgY29sbGVjdHMKKwkgIGluY29taW5nIGRhdGEgYW5kIHNlbmRzIGl0IHRvIHRoZSBvdXRwdXQsIHNvIHRoYXQgaXQKKwkgIG1ha2VzIGFsbCBkZWNpc2lvbnMgYWJvdXQgd2hlbiAvIHdoZXJlIHRvIHNwbGl0IGZpbGVzCisJICBvbiB0aGUgaW5wdXQgc2lkZS4KKwkgIFVzZSBzZXBhcmF0ZSBxdWV1ZXMgZm9yIGVhY2ggc3RyZWFtLCBzbyB0aGV5IGNhbiBiZQorCSAgZ3Jvd24gaW5kaXZpZHVhbGx5IGFuZCBrZXB0IGFzIHNtYWxsIGFzIHBvc3NpYmxlLgorCSAgVGhpcyByZW1vdmVzIHJhY2luZXNzIEkgb2JzZXJ2ZWQgd2hlcmUgc29tZXRpbWVzCisJICBzb21lIGRhdGEgd291bGQgZW5kIHVwIHB1dCBpbiBhIGRpZmZlcmVudCBvdXRwdXQgZmlsZQorCSAgb3ZlciBtdWx0aXBsZSBydW5zIHdpdGggdGhlIHNhbWUgaW5wdXQuCisJICBBbHNvIGZpeGVzIGhhbmdzIHdpdGggaW5wdXQgcXVldWVzIGdldHRpbmcgZnVsbAorCSAgYW5kIGNhdXNpbmcgbXV4aW5nIHRvIHN0YWxsIG91dC4KKworMjAxNi0xMS0xNyAyMzo0MDoyNyArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc3BsaXRtdXguYzoKKwkgIHNwbGl0bXV4c2luazogQWRkIGZvcm1hdC1sb2NhdGlvbi1mdWxsIHNpZ25hbAorCSAgQWRkIGEgbmV3IHNpZ25hbCBmb3IgZm9ybWF0dGluZyB0aGUgZmlsZW5hbWUsIHdoaWNoIHJlY2VpdmVzCisJICBhIEdzdFNhbXBsZSBjb250YWluaW5nIHRoZSBmaXJzdCBidWZmZXIgZnJvbSB0aGUgcmVmZXJlbmNlCisJICBzdHJlYW0gdGhhdCB3aWxsIGJlIG11eGVkIGludG8gdGhhdCBmaWxlLgorCSAgVXNlZnVsIGZvciBjcmVhdGluZyBmaWxlbmFtZXMgdGhhdCBhcmUgYmFzZWQgb24gdGhlCisJICBydW5uaW5nIHRpbWUgb3Igb3RoZXIgYXR0cmlidXRlcyBvZiB0aGUgYnVmZmVyLgorCSAgVG8gbWFrZSBpdCB3b3JrLCBvcGVuaW5nIG9mIGZpbGVzIGFuZCBzZXR0aW5nIGZpbGVuYW1lcyBpcworCSAgbm93IGRlZmVycmVkIHVudGlsIHRoZXJlIGlzIHNvbWUgZGF0YSB0byB3cml0ZSB0byBpdCwKKwkgIHdoaWNoIGFsc28gcmVxdWlyZXMgc29tZSBjaGFuZ2VzIHRvIGhvdyBhc3luYyBzdGF0ZSBjaGFuZ2VzCisJICBhbmQgZ2FwIGV2ZW50cyBhcmUgaGFuZGxlZC4KKworMjAxNi0xMi0zMSAwMTo1NDowMSArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWx3YXlzIHNuYXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBrZXlmcmFtZQorCSAgV2hlbiBwZXJmb3JtaW5nIGEga2V5LXVuaXQgc2VlaywgYWx3YXlzIHNuYXAgdG8gdGhlIHN0YXJ0IHRzCisJICBvZiB0aGUga2V5ZnJhbWUgYnVmZmVyIHdlIGxhbmRlZCBvbiBzbyB0aGF0IHRoZSBrZXlmcmFtZSBpcworCSAgZW50aXJlbHkgd2l0aGluIHRoZSByZXN1bHRpbmcgb3V0Z29pbmcgc2VnbWVudC4gVGhhdCBzZWVtcworCSAgdGhlIG1vc3Qgc2Vuc2libGUgcmVzdWx0LCBzaW5jZSB0aGUgdXNlciByZXF1ZXN0ZWQgc25hcHBpbmcKKwkgIHRvIHRoZSBrZXlmcmFtZSBwb3NpdGlvbi4KKworMjAxNi0xMi0zMSAwMTo0ODowNCArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogT21pdCBjc2xnX3NoaWZ0IHdoZW4gc25hcHBpbmcgc2Vla3MKKwkgIFNlZ21lbnRzIHRpbWVzIGFuZCBzZWVrIHJlcXVlc3RzIGFyZSBzdG9yZWQgYW5kIGhhbmRsZWQKKwkgIGluIHJhdyAnUFRTJyB0aW1lLCB3aXRob3V0IHRoZSBjc2xnX3NoaWZ0IC0gd2hpY2ggb25seSBhcHBsaWVzCisJICB0byBvdXRnb2luZyBzYW1wbGVzLiBPbWl0IHRoZSBjc2xnX3NoaWZ0IHBvcnRpb24gd2hlbgorCSAgZXh0cmFjdGluZyBQVFMgdG8gY29tcGFyZSBmb3IgaW50ZXJuYWwgc2VlayBzbmFwcy4KKwkgIElmIHRoZSBjc2xnX3NoaWZ0IGlzIGluY2x1ZGVkLCB0aGVuIGtleWZyYW1lK3NuYXAtYmVmb3JlIHNlZWtzCisJICBnZW5lcmF0ZSBhIHNlZ21lbnQgc3RhcnQvc3RvcCB0aW1lIHRoYXQgYWxyZWFkeSBpbmNsdWRlcyB0aGUKKwkgIGNzbGdfc2hpZnQsIGFuZCBpdCdzIHRoZW4gYWRkZWQgYSAybmQgdGltZSwgY2F1c2luZyB0aGUKKwkgIGZpcnN0IGJ1ZmZlcihzKSB0byBoYXZlIHRpbWVzdGFtcHMgdGhhdCBhcmUgb3V0IG9mIHNlZ21lbnQuCisKKzIwMTYtMTItMzAgMjI6MzE6MzggKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJICBxdG11eDogUmVtb3ZlIGJvZ3VzIGNoZWNrIGluIGF0b21fc3RzY19hZGRfbmV3X2VudHJ5KCkKKwkgIFJlbW92ZSBhbiBvbGQgY2hlY2sgZnJvbSBhdG9tX3N0c2NfYWRkX25ld19lbnRyeSgpIHRoYXQKKwkgIGV4dGVuZHMgdGhlIGxhc3QgZW50cnkgaW4gdGhlIFNUU0MgaWYgdGhlIHNhbXBsZXMgcGVyIGNodW5rCisJICBtYXRjaGVzLCBhcyB0aGUgbmV3IGludGVybGVhdmUgbWVyZ2luZyBsb2dpYyByZXF1aXJlcyB0aGF0CisJICB0aGUgZmluYWwgZW50cnkgYnkgdXBkYXRlYWJsZS4gVGhlcmUncyBhbHJlYWR5IGNvZGUKKwkgIGJlbG93IHdoaWNoIHNpbXBseSBtZXJnZXMgdGhlIGZpbmFsIGVudHJ5IGludG8gdGhlIHByZXZpb3VzCisJICBvbmUgd2hlbiBuZWVkZWQsIHNvIHJlbHkgb24gdGhhdCBpbnN0ZWFkLgorCSAgRml4ZXMgYXNzZXJ0cyBsaWtlOgorCSAgRVJST1I6YXRvbXMuYzoyOTQwOmF0b21fc3RzY191cGRhdGVfZW50cnk6IGFzc2VydGlvbiBmYWlsZWQ6CisJICAoYXRvbV9hcnJheV9pbmRleCAoJnN0c2MtPmVudHJpZXMsIGxlbiAtIDEpLmZpcnN0X2NodW5rID09IGZpcnN0X2NodW5rKQorCisyMDE2LTA0LTI0IDIxOjM4OjUxICswOTAwICBTZXVuZ2hhIFlhbmcgPHNoLnlhbmdAbGdlLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBGaXgga2V5X3RpbWUgaW4gZ3N0X3F0ZGVtdXhfYWRqdXN0X3NlZWsoKQorCSAgdGltZSBpbiBzZWdtZW50IHNob3VsZCBiZSBQVFMgYmFzZWQgKG5vdCBEVFMpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NTQ5OAorCisyMDE2LTEyLTI4IDIyOjQ5OjI3ICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhwYXJ0cmVhZGVyLmg6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c3JjLmM6CisJICBzcGxpdG11eHNyYzogUGFzcyBzZWVrIGZsYWdzIHdoZW4gYWN0aXZhdGluZy4KKwkgIFBhc3MgYWxsIHNlZWsgZmxhZ3Mgd2hlbiBhY3RpdmF0aW5nIGEgcGFydAorCSAgYmFzZWQgb24gYSBzZWVrLCBzbyB0aGF0IFNOQVAgZmxhZ3MgYXJlIHByZXNlcnZlZC4KKworMjAxNi0xMS0yNiAwMToxMzoxOSArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhwYXJ0cmVhZGVyLmM6CisJICBzcGxpdG11eDogRml4IGEgc21hbGwgcmFjZSBpbiB0aGUgc3BsaXRtdXhzcmMKKwkgIE1ha2Ugc3VyZSB0aGUgc3RhdGUgb2YgdGhlIHBhcnNlciBpcyBzZXQgdG8KKwkgIGNvbGxlY3Rpbmcgc3RyZWFtcyBiZWZvcmUgY2hhaW5pbmcgdXAgdG8gdGhlCisJICBwYXJlbnQgY2hhbmdlX3N0YXRlKCkgbWV0aG9kLCB0byBjbG9zZSBhCisJICBzbWFsbCB3aW5kb3cgdGhhdCBjYW4gY2F1c2UgcGxheWJhY2sgdG8KKwkgIG5ldmVyIGNvbW1lbmNlLgorCisyMDE3LTAxLTAyIDE1OjA2OjMzICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hbXJwYXJzZS5jOgorCSAgY2hlY2s6IFJlbW92ZSBkZWFkIGNvZGUKKworMjAxNi0xMi0zMSAwOTo1MjoyNSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuaDoKKwkgIG11bHRpZmlsZXNpbms6IHJlZmFjdG9yIG1heF9maWxlcyBoYW5kbGluZyBhIGJpdAorCSAgVXNlIEdRdWV1ZSBpbnN0ZWFkIG9mIGEgR1NMaXN0IHNvIHdlIGRvbid0IGhhdmUgdG8gdHJhdmVyc2UKKwkgIHRoZSB3aG9sZSBsaXN0IHRvIGFwcGVuZCBzb21ldGhpbmcgZXZlcnkgdGltZS4gQW5kIGl0IGFsc28KKwkgIGtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gaXQgZm9yIHVzLgorCSAgQWRkIGEgZnVuY3Rpb24gdG8gYWRkIGZpbGVuYW1lcyB0byB0aGUgbGlzdCBvZiBvbGQgZmlsZXMgYW5kCisJICB1c2UgaXQgaW4gbW9yZSBwbGFjZXMsIHNvIHRoYXQgbWVtb3J5IGRvZXNuJ3QgYnVpbGQgdXAgaW4KKwkgIG90aGVyIG1vZGVzIGVpdGhlciBpZiBubyBtYXhfZmlsZXMgbGltaXQgaXMgc3BlY2lmaWVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2Njk5MQorCisyMDE2LTA1LTI5IDE3OjIxOjQ3ICswMTAwICBVcnN1bGEgTWFwbGVodXJzdCA8dXJzdWxhQGthbmdhdHJvbml4LmNvLnVrPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIG11bHRpZmlsZXNpbms6IGRvbid0IGxlYWsgbWVtb3J5IHdoZW4gbm8gbWF4LWZpbGVzIGxpbWl0IGlzIHNldAorCSAgVGVjaG5pY2FsbHkgd2Ugd2VyZW4ndCBsZWFraW5nIHRoZSBtZW1vcnksIGp1c3Qgc3RvcmluZyBpdCBpbnRlcm5hbGx5CisJICBhbmQgbmV2ZXIgdXNpbmcgaXQgdW50aWwgdGhlIGVsZW1lbnQgaXMgZnJlZWQuIEJ1dCB3ZSdkIHN0aWxsIHVzZSBtb3JlCisJICBhbmQgbW9yZSBtZW1vcnkgb3ZlciB0aW1lLCBzbyB0aGlzIGlzIG5vdCBnb29kIG92ZXIgbG9uZ2VyIHBlcmlvZHMKKwkgIG9mIHRpbWUuIE9ubHkga2VlcCB0cmFjayBvZiBmaWxlcyBpZiB0aGVyZSdzIGFjdHVhbGx5IGEgbGltaXQgc2V0LAorCSAgc28gdGhhdCB3ZSB3aWxsIHBydW5lIHRoZSBsaXN0IGZyb20gdGltZSB0byB0aW1lLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2Njk5MQorCisyMDE2LTEyLTI5IDEyOjM5OjIwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogYWRqdXN0IHNlZ21lbnQgc3RvcCBmb3IgS0VZX1VOSVQgbmVnYXRpdmUgcmF0ZSBzZWVraW5nCisKKzIwMTYtMTItMjkgMTI6MjU6MzUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBpbXBsZW1lbnQgcHVsbCBtb2RlIFNOQVAgZmxhZyBzZWVraW5nCisKKzIwMTYtMTItMjkgMTE6MjY6MzMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHR3ZWFrIEtFWV9VTklUIFNOQVAgc2VlayBoYW5kbGluZworCSAgUHJldmlvdXNseSwgc2Vla2luZyB0byBwb3NpdGlvbiB5IHdoZXJlIHkgaXMgKHN0cmljdGx5KSB3aXRoaW4gYSBrZXlmcmFtZQorCSAgd291bGQgc2VlayB0byB0aGF0IGtleWZyYW1lIGJvdGggd2l0aCBTTkFQX0JFRk9SRSBhbmQgU05BUF9BRlRFUiwKKwkgIHdoZXJlIHRoZSBsYXR0ZXIgaXMgbm93IGFkanVzdGVkIHRvIHJlYWxseSBzbmFwIHRvIHRoZSBuZXh0IGtleWZyYW1lLgorCisyMDE2LTEyLTI4IDEzOjIzOjExICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBjb3JyZWN0bHkgcGVyZm9ybSBwdWxsIG1vZGUgS0VZX1VOSVQgc2Vla2luZworCSAgUmF0aGVyIGFtYXppbmdseSAoYW5kIGVxdWFsbHkgdW5ub3RpY2VkKSwga2V5dW5pdCBzZWVraW5nIHJlc3VsdGVkIGluIHNlZ21lbnRzCisJICB3aGVyZSBzdGFydCAhPSB0aW1lICh3aGljaCBpcyBib2d1cyBmb3Igc2ltcGxlIGF2aSB0aW1lbGluZSkuICBTbywgcHJvcGVybHkKKwkgIGFkanVzdCB0aGUgc2VnbWVudCAoc3RhcnQpIHJhdGhlciB0aGFuIGZpZGRsaW5nIHdpdGggc2VnbWVudCB0aW1lIChvbmx5KS4KKworMjAxNi0xMi0yOCAxMzowNDo1NCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogcmVzdG9yZSBjb25zaWRlcmluZyBvZiBwdWxsIG1vZGUgS0VZX1VOSVQgc2Vla2luZworCSAgLi4uIGJ5IHVzaW5nIHRoZSBvcmlnaW5hbCBzZWVrIGV2ZW50J3MgZmxhZ3MgcmF0aGVyIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcKKwkgIHNlZ21lbnQgZmxhZ3MsIHdoaWNoIGRvIG5vdCBoYXZlIHN1Y2ggY291bnRlcnBhcnQgZmxhZ3MgKGFuZAorCSAgZG8gbm8gbG9uZ2VyIGhhdmUgdGhlbSBjb3ZlcnRseSBzbmVha2luZyBpbiBub3dhZGF5cykuCisKKzIwMTUtMDUtMDggMTI6NDQ6MDEgKzAyMDAgIE5pY29sYSBNdXJpbm8gPG5pY29sYS5tdXJpbm9AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogb25seSBkcm9wIGFjdHVhbCBzdHJlYW1oZWFkZXIgYnVmZmVycyB3aXRoIHhpcGggY29kZWNzCisJICBXaXRoIFhpcGggY29kZWNzIHRoZSBzdHJlYW0gaGVhZGVyIGJ1ZmZlcnMgYXJlIGJvdGggaW4gdGhlIGNhcHMgYW5kIGFyZQorCSAgdXN1YWxseSBhbHNvIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBpbnB1dCBzdHJlYW0sIGJ1dCBpdCdzIHBlcmZlY3RseQorCSAgcG9zc2libGUgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGRvZXMgbm90IGhhdmUgdGhlIHN0cmVhbSBoZWFkZXIgYnVmZmVycworCSAgaW5saW5lIGluIHRoZSBkYXRhLiBNYXRyb3NrYW11eCB3b3VsZCBkcm9wIHRoZSBmaXJzdCBOIGJ1ZmZlcnMgYXNzdW1pbmcKKwkgIHRoZXkncmUgc3RyZWFtIGhlYWRlcnMsIGJ1dCB0aGlzIG1lYW50IGl0IHdvdWxkIGRyb3AgYWN0dWFsIHBheWxvYWQgZGF0YQorCSAgd2hlbiB0aGUgc3RyZWFtIGRpZG4ndCBjb250YWluIHRoZSBzdHJlYW0gaGVhZGVycyBpbmxpbmUuIEZpeCB0aGlzIGJ5CisJICBvbmx5IGRyb3BwaW5nIGxlYWRpbmcgYnVmZmVycyBpZiB0aGV5J3JlIGZsYWdnZWQgYXMgc3RyZWFtIGhlYWRlcnMuIFRoaXMKKwkgIGZpeGVzIGlzc3VlcyB3aXRoIHN0cmVhbXMgdGhhdCBhcmUgYmVpbmcgdGFwcGVkIGludG8gYWZ0ZXIgc3RyZWFtaW5nCisJICBoYXMgc3RhcnRlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDkwOTgKKworMjAxNi0xMi0yMSAxNzo0Mzo1OCArMDEwMCAgTmljb2xhIE11cmlubyA8bmljb2xhLm11cmlub0BnbWFpbC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6CisJICBtYXRyb3NrYW11eDogYWRqdXN0IHVuaXQgdGVzdCB0byBtb2RpZmllZCBiZWhhdmlvdXIKKwkgIE5vdyBtYXRyb3NrYW11eCBtYXJrIGFsbCBwYWNrZXRzIG9mIGF1ZGlvLW9ubHkgc3RyZWFtcyBhcyBrZXlmcmFtZXMgc28KKwkgIGluIHRlc3RfYmxvY2tfZ3JvdXAgYWZ0ZXIgcHVzaGluZyB0aGUgdGVzdCBhdWRpbyBkYXRhIDQgYnVmZmVycyBhcmUgcHJvZHVjZWQKKwkgIGFuZCBub3QgbW9yZSAyLiBUaGUgbGFzdCBidWZmZXIgaXMgdGhlIG9yaWdpbmFsIGRhdGEgYW5kIG11c3QgbWF0Y2ggd2l0aCB3aGF0CisJICBwdXNoZWQuIFRoZSByZW1haW5pbmcgb25lcyBhcmUgbWF0cm9za2FtdXggaGVhZGVycworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NDY5NgorCisyMDE2LTA1LTMwIDAxOjE1OjMxICswMjAwICBOaWNvbGEgTXVyaW5vIDxuaWNvbGEubXVyaW5vQGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IG1hcmsgYWxsIHBhY2tldHMgb2YgYXVkaW8tb25seSBzdHJlYW1zIGFzIGtleWZyYW1lcworCSAgVGhpcyBoZWxwcyB3aXRoIHN0cmVhbWluZyBhdWRpby1vbmx5IHN0cmVhbXMgdmlhIG11bHRpZmRzaW5rLAorCSAgdGNwc2VydmVyc2luayBhbmQgc3VjaC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTQ2OTYKKworMjAxNS0wMy0yOCAxODoxNTozNiArMDEwMCAgTmljb2xhIE11cmlubyA8bmljb2xhLm11cmlub0BnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBhZGQgRzcyMiBhdWRpbyBzdXBwb3J0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ2NTc0CisKKzIwMTYtMTItMTMgMTE6MTE6MDcgKzA5MDAgIFdvbmNodWwgTGVlIDx3b25jaHVsLmxlZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdXBkc3JjOiBBZGQgdG8gam9pbiBtdWx0aXBsZSBtdWx0aWNhc3QgaW50ZXJmYWNlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NjAzMAorCisyMDE1LTAzLTI1IDEzOjUxOjMwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGtsdmRlcGF5LmM6CisJICBydHBrbHZkZXBheTogYWRkIHRoZSBTUEFSU0UgZmxhZyB0byB0aGUgb3V0Z29pbmcgc3RyZWFtLXN0YXJ0IGV2ZW50CisKKzIwMTYtMTItMTQgMTQ6Mzc6NDUgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBtYW5hZ2VyOiBwbGFjZSBjb250ZW50IGJlZm9yZSBTaW5jZS12ZXJzaW9uIEFQSSBtYXJrZXIKKwkgIEF2b2lkcyBjb25mdXNpbmcgdGhlIHBhcnNlcgorCisyMDE2LTEyLTE0IDE0OjE2OjUzIC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmM6CisJICBzaG91dDI6IGZpeCA0MDQgaW4gcGFja2FnZSBvcmlnaW4KKworMjAxNi0xMi0xNCAyMTo0NToxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBDaGVjayBpZiB3ZSBoYXZlIGVub3VnaCBkYXRhIGF2YWlsYWJsZSB3aGVuIHBhcnNpbmcgZWRpdCBsaXN0cworCSAgQWxzbyBjb25zdW1lIHRoZSBkYXRhIGVudHJ5IGJ5IGVudHJ5IHRvIGdldCBjb21wbGljYXRlZCBpbmRleGluZyBvdXQgb2YKKwkgIHRoZSBjb2RlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NjEwNworCisyMDE2LTEyLTE0IDE5OjE1OjAzICswMTAwICBWw61jdG9yIE1hbnVlbCBKw6FxdWV6IExlYWwgPHZqYXF1ZXpAaWdhbGlhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRG9uJ3QgY2hlY2sgc2l6ZSBpbiBhIG5vbi1saXN0IHZhbHVlCisJICBBZnRlciBjb21taXQgMWVhOTczNWEgSSBzZWUgdGhlc2UgZXJyb3Igd2hpbGUgdXNpbmcgdGhlIHdlYmNhbQorCSAgaW50ZWdyYXRlZCBpbiBteSBsYXB0b3A6CisJICBHU3RyZWFtZXItQ1JJVElDQUwgKio6IGdzdF92YWx1ZV9saXN0X2dldF9zaXplOiBhc3NlcnRpb24gJ0dTVF9WQUxVRV9IT0xEU19MSVNUICh2YWx1ZSknIGZhaWxlZAorCSAgVGhlIGlzc3VlIGlzIGdzdF92NGwyc3JjX3ZhbHVlX3NpbXBsaWZ5KCkgd2FzIGRvaW5nIGl0cyBqb2Igb2YKKwkgIGdlbmVyYXRpbmcgYSBzaW5nbGUgdmFsdWUsIHJhdGhlciB0aGFuIHRoZSBvcmlnaW5hbCBsaXN0LiBUaGF0IHdoeSwKKwkgIHdoZW4gZ2V0dGluZyB0aGUgbGlzdCBzaXplLCBhIGNyaXRpY2FsIHdhcm5pbmcgd2FzIHJhaXNlZC4KKwkgIFRoaXMgcGF0Y2ggdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBjb21waWxlciBvcHRpbWl6YXRpb25zIHRvIHZlcmlmeQorCSAgZmlyc3QgaWYgdGhlIGxpc3Qgd2FzIHNpbXBsaWZpZWQsIHRodXMgdXNlIGl0IGRpcmVjdGx5LCBvdGhlcndpc2UsCisJICBpZiBpdCBpcyBhIGxpc3QsIHZlcmlmeSBpdHMgc2l6ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzYxMDYKKworMjAxNi0xMi0xNCAxMDozOToxMiArMDEwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHRlc3RzL2ppdHRlcmJ1ZmZlcjogTWFqb3IgcmVmYWN0b3JpbmcgYW5kIGNsZWFudXBzCisJICAqIENoYW5nZWQgUENNVS0+VEVTVCBmb3IgY29tbW9uIG1hY3JvcworCSAgKiBDaGFuZ2VkIHZlcmlmeS1mdW5jdGlvbnMgKGxvc3QgJiBydHgpIGludG8gbWFjcm9zLgorCSAgKiBSZW1vdmUgb3B0aW9uIHRvIGFkZCBtYXJrZXItYml0IGZvciB0ZXN0LWJ1ZmZlcnMgKG5vdCB1c2VkIGFueXdoZXJlKQorCSAgKiBBZGQgbmV3IHB1c2hfdGVzdF9idWZmZXIgZnVuY3Rpb24gdGhhdCBtYWtlcyBzdXJlIHRoZXJlIGFyZSBjb3JyZWxhdGlvbgorCSAgYmV0d2VlbiBkdHMgYW5kIHRoZSB0aW1lIG9uIHRoZSBjbG9jay4gKGNsYXNzaWMgdGVzdC1taXN0YWtlKQorCSAgKiBFc3RhYmxpc2hlZCBhIGdlbmVyaWMgc3RhcnRpbmctcG9pbnQgZm9yIHRlc3RzIHdpdGggdGhlCisJICBjb25zdHJ1Y3RfZGV0ZXJtaW5pc3RpY19pbml0aWFsX3N0YXRlIGZ1bmN0aW9uIGFuZCB1c2UgaXQgd2hlcmUKKwkgIGFwcGxpY2FibGUsIHdoaWNoIHJlbW92ZXMgbG90cyBvZiAiYm9pbGVycGxhdGUiIGV2ZXJ5d2hlcmUuCisJICAqIEFkZCBiYXNpYyBsb3N0LWV2ZW50IHRlc3QKKwkgICogUmVtb3ZlIGFzIG11Y2ggIm1hZ2ljIGNvbnN0YW50cyIgYXMgcG9zc2libGUuCisJICAqIFJlbW92ZSAzIHRlc3RzIHRoYXQgbm8gbG9uZ2VyIGFyZSB0ZXN0aW5nIGFueXRoaW5nIHRoYXQgb3RoZXJzIGRvbid0LAorCSAgYW5kIHdhcyBjb21wbGV0ZWx5IHVubWFpbnRhaW5hYmxlLgorCSAgKiBSZW1vdmUgdW5uZWNlc3NhcnkgdXNlIG9mIHRoZSB0ZXN0Y2xvY2sKKwkgICogVmVyaWZ5IGVhY2ggdGVzdCBpcyB0ZXN0aW5nIHdoYXQgaXQgYWN0dWFsbHkgc2F5cyBpdCBkb2VzIChhbmQgbW9kaWZ5CisJICB3aGVyZSBpdCBkb2Vzbid0KQorCSAgSW4gZ2VuZXJhbCwgbWFrZSB0aGUgdGVzdHMgbXVjaCBzbWFsbGVyLCBiZXR0ZXIsIG1vcmUgbWFpbnRhaW5hYmxlIGFuZAorCSAgcmVhZGFibGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0NDA5CisKKzIwMTYtMTItMTQgMDk6NTQ6MTEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIC5naXRpZ25vcmU6CisJKiBNYWtlZmlsZS5hbToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIFJlbW92ZSBnZW5lcmF0ZWQgLnNwZWMgZmlsZQorCSAgTGlrZWx5IGV4dHJlbWVseSBiaXRyb3R0ZW4sIGFuZCB3ZSBzaG91bGQgbm90IHNoaXAgdGhpcyBhbnl3YXkuCisKKzIwMTYtMTItMTQgMTA6MTU6MTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQ2hlY2sgdGhhdCB0aGUgWGlUaCBzaXplIGlzIGJpZyBlbm91Z2gKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzU3OTQKKworMjAxNi0xMi0wOSAyMDoyNzo1MyArMDkwMCAgSGVla3lvdW5nIFNlbyA8aGVla3lvdW5nLnNlb0BsZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IENoZWNrIG5vZGUgbGVuZ3RoIG9mIHZpZGVvIHNhbXBsZSBkZXNjcmlwdGlvbgorCSAgQWRkIGNoZWNrIGZvciBub2RlIGxlbmd0aCBvZiB2aWRlbyBzYW1wbGUgZGVzY3JpcHRpb24gYW5kIGl0cyBmaWVsZHMgYW5kCisJICBmb3IgdGhlIFhpVGggYXRvbS4KKwkgIEFsc28gdW5pZnkgdGhlIGNvZGUgYSBiaXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1Nzk0CisKKzIwMTYtMTItMDggMTg6NTA6NTIgKzA5MDAgIEhlZWt5b3VuZyBTZW8gPGhlZWt5b3VuZy5zZW9AbGdlLmNvbT4KKworCSogZ3N0L2lzb21wNC9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRW5hYmxlIHh2aWQvbXAyIGNvZGVjIHN1cHBvcnQKKwkgIEFkZCBzdXBwb3J0IGZvciB4dmlkIHZpZGVvIGFuZCBtcDIgYXVkaW8sIGFkZCBtMnYxIGZvdXJjYy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzU3OTQKKworMjAxNi0xMi0xMyAyMjozMjo0NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cDlkZXBheS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBydHguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZwOWVuYy5jOgorCSAgZ3N0OiBEb24ndCBkZWNsYXJlIHZhcmlhYmxlcyBpbnNpZGUgdGhlIGZvciBsb29wIGhlYWRlcgorCSAgVGhpcyBpcyBhIEM5OSBmZWF0dXJlLgorCisyMDE2LTEyLTExIDEzOjI3OjI3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9meC9nc3RzY2FsZXRlbXBvLmM6CisJICBzY2FsZXRlbXBvOiBFbnN1cmUgdG8gcmVpbml0IGJ1ZmZlcnMgd2hlbmV2ZXIgdGhleSB3ZXJlIG5vdCBhbGxvY2F0ZWQgeWV0CisJICBUaGF0IGlzLCB3aGVuZXZlciB3ZSBnbyB0aHJvdWdoIHN0YXJ0L3N0b3Agd2UgaGF2ZSB0byBlbnN1cmUgdGhhdCBvbiB0aGUKKwkgIG5leHQgb3Bwb3J0dW5pdHkgdGhlIGJ1ZmZlcnMgYXJlIHJlYWxsb2NhdGVkIGFnYWluLiBPdGhlcndpc2UgdGhlCisJICBidWZmZXJzIG1pZ2h0IGJlIE5VTEwgYmVjYXVzZSB0aGUgZWxlbWVudCB3YXMgcmV1c2VkIHdpdGggdGhlIHNhbWUKKwkgIGNvbmZpZ3VyYXRpb24gYXMgYmVmb3JlIChpLmUuIHNldF9jYXBzKCkgd291bGRuJ3QgaGF2ZSByZWluaXRlZCB0aGUKKwkgIGJ1ZmZlcnMpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NTg5OAorCisyMDE2LTEyLTEwIDEyOjUyOjE4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBkb2NzL2Rlc2lnbi9NYWtlZmlsZS5hbToKKwkqIGRvY3MvZGVzaWduL2Rlc2lnbi1ydHBhdXhpbGlhcnkudHh0OgorCSogZG9jcy9kZXNpZ24vZGVzaWduLXJ0cGNvbGxpc2lvbi50eHQ6CisJKiBkb2NzL2Rlc2lnbi9kZXNpZ24tcnRwcmV0cmFuc21pc3Npb24udHh0OgorCSAgZG9jczogZGVzaWduOiByZW1vdmUsIG1vdmVkIHRvIGdzdC1kb2NzCisKKzIwMTYtMTItMDkgMTc6MTc6MzUgLTAzMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRzYXVuaWVyQGdub21lLm9yZz4KKworCSogbWVzb24uYnVpbGQ6CisJICBtZXNvbjogU3VwcG9ydCBidWlsZGluZyB3aXRob3V0IEdzdCBkZWJ1ZworCisyMDE2LTEyLTA5IDE3OjU1OjM5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSogZ3N0L2ZseC9nc3RmbHhkZWMuaDoKKwkgIGZseGRlYzogT25seSBzZW5kIFNFR01FTlQgZXZlbnRzIGFmdGVyIENBUFMKKwkgIEkuZS4sIGRvbid0IGp1c3QgZm9yd2FyZCB0aGUgZXZlbnQgYnV0IGRlbGF5IGl0IGlmIHdlIGRvbid0IGhhdmUgY2FwcyBvbgorCSAgdGhlIHNyY3BhZCB5ZXQuCisKKzIwMTYtMTItMDkgMTc6NDk6NDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJICBmbHhkZWM6IFVucmVmIGFuZCB1bm1hcCBidWZmZXJzIGluIGFsbCBjb2RlIHBhdGhzIGFzIG5lZWRlZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NTg4OAorCisyMDE2LTEyLTA2IDE3OjQyOjMxICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuQG9zZy5zYW1zdW5nLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRG9uJ3Qgc2V0IGVtcHR5IGludGVybGFjZS1tb2RlIGxpc3QKKwkgIElmIGZvciBzb21lIHJlYXNvbiB3ZSBmYWlsIHRvIHByb2JlIGZvcm1hdHMgKGFsbCB0cnlfZm10IGNhbGxzIGZhaWwsIGZvcgorCSAgZXhhbXBsZSksIHRoaXMgaXMgbm90IGEgY3JpdGljYWwgZXJyb3IsIGJ1dCB3ZSBlbmQgdXAgd2l0aCBhbiBlbXB0eSBsaXN0CisJICBvZiBpbnRlcmxhY2UgbW9kZXMuIFRoaXMgY2F1c2VzIGFsbCBzdWJzZXF1ZW50IG5lZ290aWF0aW9uIHRvIGZhaWwuCisJICBUaGlzIHBhdGNoIGZpeGVzIGludGVybGFjZS1tb2RlIHNldHRpbmcgdG8gYmUgc2tpcHBlZCBpZiB3ZSBmYWlsZWQgdG8KKwkgIGRldGVjdCBhbnkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NzAyCisKKzIwMTYtMTItMDcgMTc6MjI6MjIgKzA1MzAgIEdhcmltYSBHYXVyIDxnYXJpbWEuZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYzoKKwkgIG1vbm9zY29wZTogVW5yZWYgYWxsb2NhdGlvbiBxdWVyeSBhZnRlciBmaW5pc2hlZCB3aXRoIGl0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NzUyCisKKzIwMTYtMTItMDYgMDc6NDg6NDcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJICBmbHhkZWM6IEFsbG9jYXRlIDAtaW5pdGlhbGl6ZWQgbWVtb3J5IGZvciB0aGUgZGVjb2RlZCBmcmFtZQorCSAgT3RoZXJ3aXNlIHdlIG1pZ2h0IGxlYWsgYXJiaXRyYXJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIHVuaW5pdGlhbGl6ZWQKKwkgIG1lbW9yeSBpZiBub3QgZXZlcnkgcGl4ZWwgaXMgd3JpdHRlbi4KKwkgIGh0dHBzOi8vc2NhcnliZWFzdHNlY3VyaXR5LmJsb2dzcG90LmdyLzIwMTYvMTIvMWRheXMtMGRheXMtcG9jcy1tb3JlLWdzdHJlYW1lci1mbGljLmh0bWwKKworMjAxNi0xMi0wNSAwNzo1NzoxOSAtMDcwMCAgTWF0dCBTdGFwbGVzIDxzdGFwbGVzMjU1QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogRml4IHNlc3Npb24gY2xlYW51cCB3aGVuIGhhbmRsaW5nIHJlZGlyZWN0IG9uIFBMQVkKKwkgIFJlZGlyZWN0IG9uIFBMQVkgd2Fzbid0IGRvaW5nIHRoZSBuZWNlc3Nhcnkgc2Vzc2lvbiBjbGVhbnVwLiBGaXhlZCBieQorCSAgcmVtb3ZpbmcgY29kZSBmcm9tIGdzdF9ydHNwc3JjX3NlbmQgdGhhdCBjaGFuZ2VkIHRoZSBzdGF0ZSB2YXJhYmxlIHVwb24KKwkgIGVuY291bnRlcmluZyBhIHJlZGlyZWN0LiBCZXR0ZXIgdG8gbGV0IHRoZSByZWRpcmVjdCBoYW5kbGVycyBpbgorCSAgZ3N0X3J0c3BzcmNfcmV0cmlldmVfc2RwIGFuZCBnc3RfcnRzcHNyY19wbGF5IGRvIHRoZWlyIG93bgorCSAgc3RhdGUtZGVwZW5kZW50IGNsZWFudXAuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NTQzCisKKzIwMTYtMDktMDcgMTY6MTA6MjcgKzAzMDAgIEFsZWl4IENvbmNoaWxsbyBGbGFxdWUgPGFsZWl4QG9ibG9uZy5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGFsd2F5cyBzZW5kIHRlYXJkb3duIHJlcXVlc3QKKwkgIEFsbG93IENNRF9DTE9TRSB0byBjYW5jZWwgYWxsIGNvbW1hbmRzIG5vdCBvbmx5IENNRF9QQVVTRQorCSAgYW5kIGlnbm9yZSBDTURfV0FJVCB3aGlsZSBjbG9zaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0ODM2MAorCisyMDE2LTEyLTAzIDA4OjE5OjI3ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBSRUFETUU6CisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZjk4MGZkOSB0byAzOWFjMmY1CisKKzIwMTYtMTItMDEgMTc6MDg6MDkgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IERvbid0IGxlYWsgZHVwbGljYXRlIGl0ZW1zCisJICBXaGVuIHByb3ZpZGluZyBpdGVtcyB3aXRoIGEgc2VxbnVtLCB0aGVyZSBpcyBhICh2ZXJ5IHNtYWxsKSBwcm9iYWJpbGl0eQorCSAgdGhhdCBhbiBlbGVtZW50IHdpdGggdGhlIHNhbWUgc2VxbnVtIGFscmVhZHkgZXhpc3RzLiBEb24ndCBmb3JnZXQKKwkgIHRvIGZyZWUgdGhhdCBpdGVtIGlmIGl0IHdhc24ndCBpbnNlcnRlZC4KKwkgIEFuZCBhdm9pZCByZXR1cm5pbmcgdW5kZWZpbmVkIHZhbHVlcyB3aGVuIGRlYWxpbmcgd2l0aCBkdXBsaWNhdGUgaXRlbXMKKworMjAxNi0xMi0wMSAxMToyMzowMiArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBTYW5pdGl6ZSB1bmtub3duIGNvZGVjIGNhcHMKKwkgIFdlIG1pZ2h0IGhhdmUgbm9uLXByaW50YWJsZSBjaGFyYWN0ZXJzIGluIHRoZSB1bmtub3duIGZvdXJjYywgcmVwbGFjZQorCSAgdGhlbSB3aXRoICdfJywgaW4gdGhlIHNhbWUgd2F5IHdlIGRvIGl0IGZvciB1bmtub3duIHRhZ3MuCisKKzIwMTYtMTItMDEgMjA6MDQ6MjggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBGcmVlIHZwcnAgY2h1bmsgYWxzbyBpZiBpdCBleGlzdGVkIGJ1dCB3ZSBtYWRlIG5vIHVzZSBvZiBpdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NTQ3OQorCisyMDE2LTEyLTAxIDE3OjM4OjMzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thZGVtdXg6IEZpeCBtZW1vcnkgbGVhayB3aGVuIHBhcnNpbmcgYXR0YWNobWVudHMKKwkgIGdzdF90YWdfaW1hZ2VfZGF0YV90b19pbWFnZV9zYW1wbGUoKSBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGUKKwkgIHBhc3NlZCBtZW1vcnksIHNvIGRvbid0IHNldCBpdCB0byBOVUxMIHRvIGFsbG93IHVzIHRvIGZyZWUgaXQgbGF0ZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NDcyCisKKzIwMTYtMTItMDEgMTQ6NTY6MTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWF0cm9za2FkZW11eDogVW5pZnkgemxpYi9iemlwMiBkZWNvbXByZXNzIGxvb3BzIHdpdGggdGhlIG9uZXMgZnJvbSBxdGRlbXV4CisJICBFc3BlY2lhbGx5LCBzaW1wbGlmeSB0aGUgY29kZSBhIGJpdC4KKworMjAxNi0xMi0wMSAxNDo0MTo0OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBJbmNyZWFzZSBpbmZsYXRlIGJ1ZmZlciBpbiBiaWdnZXIgc3RlcHMKKwkgIDEwMjQgYnl0ZXMgaXMgcXVpdGUgc21hbGwsIGxldCdzIGRvIDQwOTYgYnl0ZXMgKG9yIG9uZSBwYWdlKS4KKwkgIEFsc28gcmVtb3ZlIHJlZHVuZGFudCBpZiwgd2UncmUgYWx3YXlzIGluIHRoYXQgY2FzZSB3aGVuIGdldHRpbmcgaGVyZS4KKworMjAxNi0xMi0wMSAxNDozMDo0OSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBFbnN1cmUgdGhhdCBzaXplIG9mIHRoZSBwYXNwIGF0b20gaXMgYXMgbXVjaCBhcyB3ZSBuZWVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NDU1CisKKzIwMTYtMTItMDEgMTQ6MzA6MTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRnJlZSBjb21wcmVzc2VkIG1vb3Ygbm9kZSBhbmQgaXQncyBjb3JyZXNwb25kaW5nIGRlY29tcHJlc3NlZCBkYXRhCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NDU1CisKKzIwMTYtMTItMDEgMTQ6Mjk6MjEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQ2hlY2sgc2l6ZSBvZiBjb21wcmVzc2VkIE1PT1YgaGVhZGVyIGFnYWluc3QgYXZhaWxhYmxlIGRhdGEKKwkgIEFuZCBhY3R1YWxseSByZWFkIHRoZSBzaXplIG9mIHRoZSBjbXZkIGF0b20gZnJvbSB0aGUgcmlnaHQgcG9zaXRpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NDU1CisKKzIwMTYtMTItMDEgMTQ6Mjc6NTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IHpsaWIgaW5mbGF0ZSBsb29wCisJICBIYW5kbGUgZXJyb3JzIGNsZWFubHksIGRlYWxsb2NhdGUgYWxsIG1lbW9yeSBhbmQgcmV0dXJuIHRoZSBhY3R1YWwgc2l6ZQorCSAgb2YgdGhlIGluZmxhdGVkIGRhdGEuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NDU1CisKKzIwMTYtMTItMDEgMTM6Mzg6MTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBNYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggZGF0YSBpbiB0aGUgY29kZWNfZGF0YSB0byBiZSBhYmxlIHRvIHBhcnNlIGl0CisJICBBbHNvIGVycm9yIG91dCBjbGVhbmx5IGlmIG1hcHBpbmcgdGhlIGJ1ZmZlciBmYWlsZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NDUwCisKKzIwMTYtMTItMDEgMTM6MzI6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IG91dCBvZiBib3VuZHMgcmVhZCBpbiB0YWcgcGFyc2luZyBjb2RlCisJICBXZSBjYW4ndCBzaW1wbHkgYXNzdW1lIHRoYXQgdGhlIGxlbmd0aCBvZiB0aGUgdGFnIHZhbHVlIGFzIGdpdmVuCisJICBpbnNpZGUgdGhlIHN0cmVhbSBpcyBjb3JyZWN0IGJ1dCBzaG91bGQgYWxzbyBjaGVjayBhZ2FpbnN0IHRoZSBhbW91bnQgb2YKKwkgIGRhdGEgd2UgaGF2ZSBhY3R1YWxseSBhdmFpbGFibGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NDUxCisKKzIwMTYtMTItMDEgMTU6MDY6MDYgKzA1MzAgIEdhcmltYSBHYXVyIDxnYXJpbWEuZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjZGVwYXkuYzoKKwkgIHJ0cDogRml4IHNvbWUgbWVtb3J5IGxlYWtzIGluIHVzYWdlIG9mIGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcygpCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1MDcxCisKKzIwMTYtMTEtMzAgMTc6NTY6MDIgKzAyMDAgIFZpdmlhIE5pa29sYWlkb3UgPHZpdmlhQGFoaXJ1LmV1PgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFJlYWQgaW50ZXJsYWNpbmcgaW5mb3JtYXRpb24gZnJvbSAnZmllbCcgYXRvbQorCSAgUmVhZCBpbnRlcmxhY2luZyBhbmQgVEZGL0JGRiBpbmZvcm1hdGlvbiBmcm9tIHRoZSAnZmllbCcgYXRvbSBhbmQgcGFzcyBpdAorCSAgaW50byB0aGUgY2FwcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NTQxNAorCisyMDE2LTExLTI5IDEzOjU1OjQwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBjb21waWxlciB3YXJuaW5nCisJICBxdGRlbXV4LmM6IEluIGZ1bmN0aW9uIOKAmHF0ZGVtdXhfcGFyc2VfdHJha+KAmToKKwkgIHF0ZGVtdXguYzoxMDE4NDozODogZXJyb3I6IGZvcm1hdCDigJglbHXigJkgZXhwZWN0cyBhcmd1bWVudCBvZiB0eXBlIOKAmGxvbmcgdW5zaWduZWQgaW504oCZLCBidXQgYXJndW1lbnQgOSBoYXMgdHlwZSDigJhnaW50IHtha2EgY29uc3QgaW50feKAmSBbLVdlcnJvcj1mb3JtYXQ9XQorCSAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIkZvdW5kIGpwZWc6IGxlbiAldSwgbmVlZCAlbHUiLCBsZW4sCisJICBeCisKKzIwMTYtMTEtMjggMTM6NDU6MjQgLTA4MDAgIFNjb3R0IEQgUGhpbGxpcHMgPHNjb3R0LmQucGhpbGxpcHNAaW50ZWwuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IENoYW5nZSBvZmZfdCB0eXBlIHRvIGdpbnQKKwkgIG9mZl90IGlzIGEgc2lnbmVkIGludGVnZXIgdHlwZSBwcm92aWRlZCBieSBzeXMvdHlwZXMuaCBvbiBwb3NpeCBzeXN0ZW1zLgorCSAgUmVwbGFjZSB3aXRoIGdpbnQgZm9yIGJ1aWxkaW5nIG9uIG5vbi1wb3NpeCBzeXN0ZW1zIChsaWtlIHdpbmRvd3MpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NTI4NworCisyMDE2LTExLTIyIDIxOjAwOjI1IC0wODAwICBTY290dCBEIFBoaWxsaXBzIDxzY290dC5kLnBoaWxsaXBzQGludGVsLmNvbT4KKworCSogbWVzb24uYnVpbGQ6CisJICBtZXNvbjogYWRkIGxpYm0gdG8gaGFzX2Z1bmN0aW9uIGNoZWNrcworCSAgVGhlIGZ1bmN0aW9ucyBmcm9tIG1hdGguaCBtYXkgYmUgaW1wbGVtZW50ZWQgaW4gbGlibS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ4NzYKKworMjAxNi0xMC0yNyAyMzowMjozNyArMDUzMCAgTmlyYmhlZWsgQ2hhdWhhbiA8bmlyYmhlZWtAY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvbWVzb24uYnVpbGQ6CisJICBSZXZlcnQgIm1lc29uOiBkdiBwbHVnaW4gbm93IHdvcmtzIG9uIE1TVkMiCisJICBUaGlzIHJldmVydHMgY29tbWl0IDA1YTg5NjEzZmVmZjcwY2ZmNDE2MzY3ZjVhYTgwN2ExZDVjNjhiNjMuCisJICBMZXQncyBub3QgcHV0IGluIHN0dWZmIHRoYXQgbmVlZHMgdW5yZWxlYXNlZCBNZXNvbi4gVGhpcyBjYW4gZ28gaW4KKwkgIGZvciB0aGUgbmV4dCBjeWNsZS4KKworMjAxNi0xMS0yOCAxMzo1MTo0MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IEVuc3VyZSB0aGF0IHRhZ3MgYXJlIHZhbGlkIFVURi04IGJlZm9yZSBhZGRpbmcgdGhlbSB0byB0aGUgdGFnbGlzdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NTIxOQorCisyMDE2LTExLTI4IDEyOjIyOjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJICBtdWx0aXBhcnRkZW11eDogUG9zdCBhbiBlcnJvciBtZXNzYWdlIG9uIHRoZSBidXMgaWYgd2UgZ290IEVPUyB3aXRob3V0IGhhdmluZyBhZGRlZCBhbnkgcGFkcworCisyMDE2LTExLTI4IDEyOjAwOjA5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IEhhbmRsZSBub24tVVRGOCBoZWFkZXJzIGFuZCBlcnJvciByZWFzb25zIG1vcmUgZ3JhY2VmdWxseQorCSAgRXNwZWNpYWxseSBkb24ndCBwdXQgdGhlbSBpbnRvIEdzdFN0cnVjdHVyZXMgaW4gb25lIHdheSBvciBhbm90aGVyLCBqdXN0CisJICBpZ25vcmUgdGhlbSBvciBlcnJvciBvdXQgY2xlYW5seSBkZXBlbmRpbmcgb24gdGhlIGltcG9ydGFuY2Ugb2YgdGhlaXIKKwkgIGNvbnRlbnQuCisKKzIwMTYtMTEtMjggMDk6MzA6MjUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSAgdnJhd3BheTogRXJyb3Igb3V0IGNsZWFubHkgaWYgbWFwcGluZyB0aGUgdmlkZW8gZnJhbWUgZmFpbHMKKwkgIEluc3RlYWQgb2YgbGF0ZXIgZGVyZWZlcmVuY2luZyBOVUxMIGFuZCBjcmFzaGluZy4KKworMjAxNi0xMS0yNyAxMToxNDoxMyArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSAgcnRwcnR4c2VuZDogVXBkYXRlIHN0YXRpc3RpY3MgYmVmb3JlIHB1c2hpbmcKKwkgIElmIGFuIGVsZW1lbnQgcXVlcmllcyB0aGUgbnVtYmVyIG9mIHJldHJhbnNtaXNzaW9uIGJ1ZmZlcnMgcHVzaGVkCisJICAqd2hpbGUqIHRoZSBwdXNoIGlzIHN0aWxsIHRha2luZyBwbGFjZSAoYW5kIGJlZm9yZSB0aGUgb2JqZWN0IGxvY2sKKwkgIGlzIHRha2VuIGp1c3QgYWZ0ZXIpIGl0IHdvdWxkIGVuZCB1cCB3aXRoIHRoZSB3cm9uZyBzdGF0aXN0aWMKKwkgIGJlaW5nIHJlcG9ydGVkLgorCSAgSW5jcmVtZW50IGl0IGp1c3QgYmVmb3JlIHRoZSBwdXNoLCBhdm9pZHMgcmFjZXMgd2hlbiBnZXR0aW5nIHN0YXRpc3RpY3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njg3MjMKKworMjAxNi0xMS0yNiAxMToyMDo1MSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogLmdpdG1vZHVsZXM6CisJICBjb21tb246IHVzZSBodHRwcyBwcm90b2NvbCBmb3IgY29tbW9uIHN1Ym1vZHVsZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NTExMAorCisyMDE2LTA3LTI4IDE4OjUxOjI0ICswMjAwICBQaGlsaXBwIFphYmVsIDxwLnphYmVsQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgZ3N0djRsMmJ1ZmZlcnBvb2w6IGxvY2sgZmx1c2hfc3RvcCBhZ2FpbnN0IHJlZ3VsYXIgcWJ1ZgorCSAgVGhlc2UgY2FuIGJlIGNhbGxlZCBmcm9tIGRpZmZlcmVudCB0aHJlYWRzIGFuZCBib3RoIG1hbmlwdWxhdGUgdGhlCisJICBwb29sLT5idWZmZXJzIGFycmF5LiBMb2NrIHRoZW0gcHJvcGVybHkgYW5kIGxldCBmbHVzaF9zdG9wIG1vdmUgdGhlCisJICBhcnJheSBjb250ZW50cyBpbnRvIGEgdGVtcG9yYXJ5IGFycmF5IG9uIHRoZSBzdGFjayB0byBhdm9pZCBoYXZpbmcKKwkgIHRvIGNhbGwgcmVsZWFzZV9idWZmZXIgdW5kZXIgdGhlIG9iamVjdCBsb2NrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NTAxNQorCisyMDE2LTExLTI0IDE0OjI1OjIyICswMTAwICBQaGlsaXBwIFphYmVsIDxwLnphYmVsQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgZ3N0djRsMmJ1ZmZlcnBvb2w6IHJlbW92ZSBjcml0aWNhbCBlcnJvciBtZXNzYWdlIHdoZW4gcHJvY2VzcyBpcyBjYWxsZWQgb24gYW4gaW5hY3RpdmUgcG9vbAorCSAgSWYgdGhlIHBvb2wgaXMgaW5hY3RpdmUsIGl0IGlzIGd1YXJhbnRlZWQgdG8gYWxzbyBiZSBmbHVzaGluZywgc28gdGhlCisJICBmb2xsb3dpbmcgY2hlY2sgd2lsbCByZXR1cm4gR1NUX0ZMT1dfRkxVU0hJTkcgYW55d2F5LgorCSAgVGhpcyBjYW4gaGFwcGVuIGlmIGEgdjRsMnNyYyBpcyBibG9ja2luZyBvbiBEUUJVRiBpbiBjcmVhdGUgYW5kIGlzIHNlbnQKKwkgIGFuIEVPUyBldmVudCBvbiBhbm90aGVyIHRocmVhZC4gSW4gdGhhdCBjYXNlIHRoZSBwb29sIGlzIHNldCB0bworCSAgZmx1c2hpbmcvaW5hY3RpdmUgd2l0aG91dCBsb2NraW5nLCB0aGUgdjRsMnNyYyBpcyB1bmJsb2NrZWQsIGFuZCBtYXkKKwkgIGNhbGwgcG9vbF9wcm9jZXNzIHdpdGggYSB2YWxpZCBidWZmZXIgb24gdGhlIGFscmVhZHkgaW5hY3RpdmUgcG9vbC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzUwMTQKKworMjAxNi0xMS0yNCAxNDo0MTo1MiArMDEwMCAgUGhpbGlwcCBaYWJlbCA8cC56YWJlbEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMnNyYzogcmVsZWFzZSBidWZmZXIgaWYgY3JlYXRlIGZhaWxzCisJICBnc3RfYmFzZV9zcmNfZ2V0X3JhbmdlIGRvZXMgbm90IGV4cGVjdCBhIGJ1ZmZlciB0byBiZSByZXR1cm5lZCBpbgorCSAgdGhlIGVycm9yIGNhc2UsIHNvIHdlIGFyZSBsZWFraW5nIGEgcmVmZXJlbmNlIGhlcmUgaWYgY3JlYXRlIGZhaWxzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NTAxNAorCisyMDE2LTExLTIzIDE4OjM0OjA0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogSGFuZGxlIGNyZWF0ZV9zZXNzaW9uKCkgcmV0dXJuaW5nIE5VTEwgaW4gYnVuZGxlIGNvZGUKKwkgIENJRCAxMzk0NDkyLgorCisyMDE2LTExLTIyIDE2OjQyOjU1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogTWFrZSBzdXJlIHRvIG9ubHkgY2hhbmdlIERUUyBvZiB3cml0YWJsZSBidWZmZXJzCisJICBBbmQgdHJpdmlhbCBjbGVhbnVwCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0ODQwCisKKzIwMTYtMTEtMjIgMTY6NDI6MjYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBFcnJvciBvdXQgbXVjaCBlYXJsaWVyIGlmIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBQVFMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ4NDAKKworMjAxNi0xMS0yMiAxNjoxODo0MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IE9ubHkgdXNlIGJ1ZmZlciBkdXJhdGlvbnMgaWYgdGhleSBhcmUgYWN0dWFsbHkgdmFsaWQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ4NDAKKworMjAxNi0xMS0yMiAxNTo1OToxOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IFJldmVydCBjb21taXRzIHRoYXQgc2V0IERUUyBhbmQgZHVyYXRpb24gb24gYnVmZmVycyB1bmNvbmRpdGlvbmFsbHkKKwkgIDM5ZjdlNTIyNjZmZGUzYjNjMDM1ZTIyY2JjYmIyYmIxZmEyMDdiMTcgd2FzIHNldHRpbmcgdGhlIGJ1ZmZlciBkdXJhdGlvbgorCSAgdG8gMCBpZiBpcyBub3QgdmFsaWQsIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhpcyBpcyAidGhlIGxhc3QiCisJICBidWZmZXIgYW5kIG5vIG90aGVycyBhcmUgY29taW5nIG5leHQuIFRoaXMgaXMgd3JvbmcsIGxhc3RfYnVmIGlzIHRoZQorCSAgcHJldmlvdXMgYnVmZmVyIGFuZCBub3QgdGhlIHZlcnkgbGFzdCBvbmUuCisJICA0ZTNjMTNjODdjMjU4YzljOTVlMjIxN2QzMmFiMzE0ZDEyYjVmZmZjIHdhcyBzZXR0aW5nIERUUyB0byAwIGlmIHRoZXJlCisJICB3YXMgbm9uZS4gVGhpcyB3aWxsIHNldCBEVFMgdG8gMCBmb3IgYWxsIGUuZy4gYXVkaW8gc3RyZWFtcywgY29tcGxldGVseQorCSAgbWVzc2luZyB1cCBjYWxjdWxhdGlvbnMgaWYgc3RyZWFtcyBkb24ndCBzdGFydCBhdCAwLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NDg0MAorCisyMDE2LTExLTIyIDE1OjU4OjM3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogT25seSB3cml0ZSAiZ2FwIiBlZGl0IGxpc3QgaWYgdGhlcmUgaXMgYSBub24temVybyBnYXAKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ4NDAKKworMjAxNi0xMS0yMyAwNzowOTowNiArMTEwMCAgTWF0dGhldyBXYXRlcnMgPG1hdHRoZXdAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZmx4L2ZseF9jb2xvci5jOgorCSogZ3N0L2ZseC9mbHhfZm10Lmg6CisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSogZ3N0L2ZseC9nc3RmbHhkZWMuaDoKKwkgIGZseGRlYzogcmV3cml0ZSBsb2dpYyBiYXNlZCBvbiBHc3RCeXRlUmVhZGVyL1dyaXRlcgorCSAgU29sdmVzIG92ZXJyZWFkaW5nL3dyaXRpbmcgdGhlIGdpdmVuIGFycmF5cyBhbmQgd2lsbCBlcnJvciBvdXQgaWYgdGhlCisJICBzdHJlYW1zIGFza3MgdG8gZG8gdGhhdC4KKwkgIEFsc28gZG9lcyBtb3JlIGVycm9yIGNoZWNraW5nIHRoYXQgdGhlIHN0cmVhbSBpcyB2YWxpZCBhbmQgd29uJ3QKKwkgIG92ZXJydW4gYW55IGFsbG9jYXRlZCBhcnJheXMuICBBbHNvIG1pdGlnYXRlIGludGVnZXIgb3ZlcmZsb3cgZXJyb3JzCisJICBjYWxjdWxhdGluZyBhbGxvY2F0aW9uIHNpemVzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NDg1OQorCisyMDE2LTExLTIzIDExOjIwOjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSAgZmx4ZGVjOiBEb24ndCB1bnJlZigpIHBhcmVudCBpbiB0aGUgY2hhaW4gZnVuY3Rpb24KKwkgIFdlIGRvbid0IG93biB0aGUgcmVmZXJlbmNlIGhlcmUsIGl0IGlzIG93bmVkIGJ5IHRoZSBjYWxsZXIgYW5kIGdpdmVuIHRvCisJICB1cyBmb3IgdGhlIHNjb3BlIG9mIHRoaXMgZnVuY3Rpb24uIExlZnRvdmVyIG1pc3Rha2UgZnJvbSAwLjEwIHBvcnRpbmcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0ODk3CisKKzIwMTYtMTEtMjIgMjA6MzM6MjkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC92cHgvZ3N0dnB4ZGVjLmM6CisJICB2cHhkZWM6IGxpYnZweCdzIHJlbGVhc2UgYnVmZmVyIGlzIHNvbWV0aW1lcyBjYWxsZWQgd2l0aCBmYi0+cHJpdj09TlVMTAorCSAgRG9uJ3QgYXNzZXJ0IG9uIHRoaXMgYnV0IGp1c3QgaWdub3JlIHRoZXNlIGNhc2VzLgorCisyMDE2LTExLTIyIDIwOjI0OjU5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IEZpeCBjbHVzdGVyIHNlYXJjaGluZyBpZiB3ZSBzZWFyY2ggbXVsdGlwbGUgdGltZXMgaW4gb25lIGNodW5rCisJICBBZnRlciBmaW5kaW5nIGEgY2x1c3RlciBpZCBpbiB0aGUgYnl0ZSByZWFkZXIsIHdlIHNraXAgYWhlYWQgdGhlIHJlYWRlcgorCSAgcG9zaXRpb24gYnkgb25lIGZ1cnRoZXIgYnl0ZSB0byBiZSBhYmxlIHRvIGNvbnRpbnVlIHNlYXJjaGluZyBmcm9tIHRoZXJlCisJICBpbnNpZGUgdGhlIHNhbWUgY2h1bmsgaWYgdGhlIGNsdXN0ZXIgY2FuZGlkYXRlIHdhcyBhIGZhbHNlIHBvc2l0aXZlLgorCSAgV2UgaGF2ZSB0byBhY2NvbW9kYXRlIGZvciB0aGF0IGFkZGl0aW9uYWwgYnl0ZSB3aGVuIHJlc3VtaW5nIHRoZSBzZWFyY2gsCisJICBvdGhlcndpc2UgYWxsIGZvbGxvd2luZyBwdWxscyBhcmUgb2ZmLWJ5LW9uZSBmb3IgZXZlcnkgcmVzdW1lIGFuZCB3ZSBydW4KKwkgIGludG8gYW4gYXNzZXJ0aW9uLgorCisyMDE2LTExLTIyIDIwOjAxOjIwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJICBtYXRyb3NrYTogQWRkIHNpemUgY2hlY2tzIHRvIHRoZSBwYXJzaW5nIG9mIEZMQUMgaGVhZGVycworCisyMDE2LTExLTIyIDIzOjQ2OjAwICsxMTAwICBNYXR0aGV3IFdhdGVycyA8bWF0dGhld0BjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJICBmbHhkZWM6IGZpeCBzb21lIHdhcm5pbmdzIGNvbXBhcmluZyB1bnNpZ25lZCA8IDAKKwkgIGJmNDNmNDRmY2ZhZGE1ZWM0YTNjZTYwY2IzNzQzNDA0ODZmZTlmYWMgd2FzIGNvbXBhcmluZyBhbiB1bnNpZ25lZAorCSAgZXhwcmVzc2lvbiB0byBiZSA8IDAgd2hpY2ggd2FzIGFsd2F5cyBmYWxzZS4KKwkgIGdzdGZseGRlYy5jOiBJbiBmdW5jdGlvbiDigJhmbHhfZGVjb2RlX2JydW7igJk6CisJICBnc3RmbHhkZWMuYzozMjI6MzM6IHdhcm5pbmc6IGNvbXBhcmlzb24gb2YgdW5zaWduZWQgZXhwcmVzc2lvbiA8IDAgaXMgYWx3YXlzIGZhbHNlIFstV3R5cGUtbGltaXRzXQorCSAgaWYgKChnbG9uZykgcm93IC0gY291bnQgPCAwKSB7CisJICBeCisJICBnc3RmbHhkZWMuYzozMzI6MzM6IHdhcm5pbmc6IGNvbXBhcmlzb24gb2YgdW5zaWduZWQgZXhwcmVzc2lvbiA8IDAgaXMgYWx3YXlzIGZhbHNlIFstV3R5cGUtbGltaXRzXQorCSAgaWYgKChnbG9uZykgcm93IC0gY291bnQgPCAwKSB7CisJICBeCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0ODM0CisKKzIwMTYtMTEtMjEgMTY6MTc6MzEgKzAyMDAgIFZpdmlhIE5pa29sYWlkb3UgPHZpdmlhQGFoaXJ1LmV1PgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogRW5hYmxlIHVwIHRvIDE2IHVucG9zaXRpb25lZCByYXcgYXVkaW8gY2hhbm5lbHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ3ODkKKworMjAxNi0xMS0yMiAxOTowNTowMCArMTEwMCAgTWF0dGhldyBXYXRlcnMgPG1hdHRoZXdAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSAgZmx4ZGVjOiBhZGQgc29tZSB3cml0ZSBib3VuZHMgY2hlY2tpbmcKKwkgIFdpdGhvdXQgY2hlY2tpbmcgdGhlIGJvdW5kcyBvZiB0aGUgZnJhbWUgd2UgYXJlIHdyaXRpbmcgaW50bywgd2UgY2FuCisJICB3cml0ZSBvZmYgdGhlIGVuZCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLgorCSAgaHR0cHM6Ly9zY2FyeWJlYXN0c2VjdXJpdHkuYmxvZ3Nwb3QuZGsvMjAxNi8xMS8wZGF5LWV4cGxvaXQtYWR2YW5jaW5nLWV4cGxvaXRhdGlvbi5odG1sCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0ODM0CisKKzIwMTYtMTEtMjEgMTU6MjU6MjMgKzAwMDAgIERhdmlkIEV2YW5zIDxiYmNyZGRhdmVAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEJlIHN1cmUgbm90IHRvIHJlYWQgb2ZmIGVuZCBvZiBGTEFDIGRmTGEgYm94CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczNzEyCisKKzIwMTYtMTEtMjEgMTE6NDg6NTggKzAxMDAgIE5pY29sYSBNdXJpbm8gPG5pY29sYS5tdXJpbm9AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGFkZCBzdXBwb3J0IGZvciBza2lwcGluZyBpbnZhbGlkIGRhdGEgaW4gcHVzaCBtb2RlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0NTY2CisKKzIwMTYtMTEtMjEgMTE6NDg6MjkgKzAxMDAgIE5pY29sYSBNdXJpbm8gPG5pY29sYS5tdXJpbm9AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYXBhcnNlOiBhZGQgc3VwcG9ydCBmb3Igc2tpcHBpbmcgaW52YWxpZCBkYXRhCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0NTY2CisKKzIwMTYtMTEtMTggMTc6MDA6NTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IE1vdmUgdG8gbmV3IGhlbHBlciBmdW5jdGlvbiB0byBwYXJzZSBhdXRoZW50aWNhdGlvbiByZXNwb25zZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ0MTYKKworMjAxNi0xMS0yMCAxNDoxMjoxNiArMDEwMCAgY2hyaXN0b3BoZWN2ciA8c3RlZmFuc2F0QHRlbGVuZXQuYmU+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IHdyb25nIGNvbXBpbGVyIHdhcm5pbmcgd2l0aCBnY2MgNi4yCisJICB8IC4uLy4uLy4uL2dpdC9nc3QvaXNvbXA0L3F0ZGVtdXguYzogSW4gZnVuY3Rpb24gJ3F0ZGVtdXhfcGFyc2VfdHJlZSc6CisJICB8IC4uLy4uLy4uL2dpdC9nc3QvaXNvbXA0L3F0ZGVtdXguYzoxMDIyNDoyNDogZXJyb3I6ICdzaXplJyBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24gWy1XZXJyb3I9bWF5YmUtdW5pbml0aWFsaXplZF0KKwkgIHwgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZTsKKwkgIHwgICAgICAgICAgICAgICAgICAgICAgICAgXn4KKwkgIHwgLi4vLi4vLi4vZ2l0L2dzdC9pc29tcDQvcXRkZW11eC5jOjEwMTk3OjI1OiBub3RlOiAnc2l6ZScgd2FzIGRlY2xhcmVkIGhlcmUKKwkgIHwgICAgICAgICAgICAgICAgICBndWludDMyIHNpemUsIHRhZzsKKwkgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIF5+fn4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ3NDcKKworMjAxNi0xMS0yMCAxNjoxNTowNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogTWFrZWZpbGUuYW06CisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9NQU5JRkVTVDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIHdpbjMyOiByZW1vdmUgY29waWVzIG9mIGdlbmVyYXRlZCBoZWFkZXJzCisKKzIwMTYtMTEtMjAgMTM6MTQ6MDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIGF2aWRlbXV4OiBFbnN1cmUgdGhhdCByYXcgdmlkZW8gaGF2ZSBwcm9wZXJseSBhbGlnbmVkIGJ1ZmZlcnMKKwkgIFRoYXQgaXMsIGFsaWduZWQgdG8gdG8gMzIgYnl0ZXMgZm9yIHZpZGVvLiBGaXhlcyBjcmFzaGVzIGlmIHRoZSByYXcKKwkgIGJ1ZmZlcnMgYXJlIHBhc3NlZCB0byBTSU1EIHByb2Nlc3NpbmcgZnVuY3Rpb25zLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NDQyOAorCisyMDE2LTExLTIwIDEzOjA4OjI3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEVuc3VyZSB0aGF0IHJhdyBhdWRpbyBhbmQgdmlkZW8gaGF2ZSBwcm9wZXJseSBhbGlnbmVkIGJ1ZmZlcnMKKwkgIFRoYXQgaXMsIGFsaWduZWQgdG8gdGhlIGJhc2ljIHR5cGUgZm9yIGF1ZGlvIGFuZCB0byAzMiBieXRlcyBmb3IgdmlkZW8uCisJICBGaXhlcyBjcmFzaGVzIGlmIHRoZSByYXcgYnVmZmVycyBhcmUgcGFzc2VkIHRvIFNJTUQgcHJvY2Vzc2luZyBmdW5jdGlvbnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0NDI4CisKKzIwMTYtMTEtMTQgMTQ6NDQ6MTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBBbHdheXMgd3JpdGUgZWRpdCBsaXN0cyBmb3IgdGhlIHRyYWNrcyB0byBnaXZlIGEgbW9yZSBhY2N1cmF0ZSBkdXJhdGlvbgorCSAgQWx3YXlzIHdyaXRlIGFuIGVkaXQgbGlzdCBmb3IgdGhlIHdob2xlIHRyYWNrLiBJbiBnZW5lcmFsIHRoaXMgaXMgbm90CisJICBuZWNlc3NhcnkgZXhjZXB0IGZvciB0aGUgY2FzZSBvZiBoYXZpbmcgYSBnYXAgb3IgRFRTIGFkanVzdG1lbnQgYnV0CisJICBpdCBhbGxvd3MgdG8gZ2l2ZSB0aGUgd2hvbGUgdHJhY2sncyBkdXJhdGlvbiBpbiB0aGUgdXN1YWxseSBtb3JlCisJICBhY2N1cmF0ZSBtZWRpYSB0aW1lc2NhbGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0NDAzCisKKzIwMTYtMTEtMTggMjI6NDU6NDUgKzA5MDAgIFNldW5naGEgWWFuZyA8c2gueWFuZ0BsZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFJlbW92ZSB1c2VsZXNzIHJldHVybiB2YXJpYWJsZQorCSAgcXRkZW11eF9leHBvc2Vfc3RyZWFtcygpIHJldHVybnMgZmxvdyBlcnJvciBpbW1lZGlhdGVseSwgaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisJICBTbywgdGhlIHZhcmlhYmxlIGZvciB0aGUgZmxvdyByZXR1cm4gaXMgbm90IG5lZWRlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ2NzQKKworMjAxNi0xMS0xNyAxMzo1OTo0OCArMDAwMCAgRGF2aWQgRXZhbnMgPGJiY3JkZGF2ZUBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvZm91cmNjLmg6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9kdW1wLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmM6CisJICBxdGRlbXV4OiBBZGQgc3VwcG9ydCBmb3IgRkxBQyBlbmNhcHN1bGF0ZWQgaW4gSVNPQk1GRgorCSAgQXMgZGVmaW5lZCBieQorCSAgaHR0cHM6Ly9naXQueGlwaC5vcmcvP3A9ZmxhYy5naXQ7YT1ibG9iX3BsYWluO2Y9ZG9jL2lzb2ZsYWMudHh0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczNzEyCisKKzIwMTYtMTEtMTcgMTk6NTk6NTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBNYXJrIHBhZCBhcyBuZWVkaW5nIHJlY29uZmlndXJhdGlvbiBhZ2FpbiBpZiBpdCBmYWlsZWQKKwkgIEFuZCByZXR1cm4gRkxVU0hJTkcgaW5zdGVhZCBvZiBOT1RfTkVHT1RJQVRFRCBvbiBmbHVzaGluZyBwYWRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NDYyMworCisyMDE2LTExLTE3IDE5OjU5OjI2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSAgbW9ub3Njb3BlOiBNYXJrIHBhZCBhcyBuZWVkaW5nIHJlY29uZmlndXJhdGlvbiBhZ2FpbiBpZiBpdCBmYWlsZWQKKwkgIEFuZCByZXR1cm4gRkxVU0hJTkcgaW5zdGVhZCBvZiBOT1RfTkVHT1RJQVRFRCBvbiBmbHVzaGluZyBwYWRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NDYyMworCisyMDE2LTExLTE3IDE5OjU4OjUyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBNYXJrIHBhZCBhcyBuZWVkaW5nIHJlY29uZmlndXJhdGlvbiBhZ2FpbiBpZiByZWNvbmZpZ3VyYXRpb24gZmFpbGVkCisJICBBbmQgY29uc2lkZXIgbmVnb3RpYXRpb24gZmFpbHVyZXMgb24gZmx1c2hpbmcgcGFkcyBhcyBGTFVTSElORywgbm90IGFzCisJICBOT1RfTkVHT1RJQVRFRC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ2MjMKKworMjAxNi0xMS0xNyAxOTo1NjoyMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJICBkdmRlYzogRml4IGhhbmRsaW5nIG9mIG5lZ290aWF0aW9uIGZhaWx1cmVzCisJICBSZXR1cm4gTk9UX05FR09USUFURUQgaWYgc2VuZGluZyB0aGUgY2FwcyBldmVudCBmYWlscywgb3IgRkxVU0hJTkcgaWYKKwkgIHRoZSBwYWQgd2FzIGZsdXNoaW5nIGF0IHRoYXQgcG9pbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0NjIzCisKKzIwMTYtMTEtMTcgMTc6MTY6MjYgLTA4MDAgIFNjb3R0IEQgUGhpbGxpcHMgPHNjb3R0LmQucGhpbGxpcHNAaW50ZWwuY29tPgorCisJKiBtZXNvbi5idWlsZDoKKwkgIG1lc29uOiBhZGRfZ2xvYmFsX2FyZ3VtZW50cyAtPiBhZGRfcHJvamVjdF9hcmd1bWVudHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ2NTYKKworMjAxNi0xMS0xNiAxMDo1Mzo1MSArMDUzMCAgVmlub2QgS2VzdGkgPHZpbm9ka2VzdGlAeWFob28uY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXhzaW5rOiBwYWQgcmVxdWVzdCBmYWlscyBmb3IgZmx2bXV4CisJICBzcGxpdG11eHNpbmsgcmVxdWVzdHMgcGFkIGZyb20gZWxlbWVudCB1c2luZyBwYWQgdGVtcGxhdGUgbGlrZSAidmlkZW9fJXUiLCAiYXVkaW9fJXUiIGFuZCAic2lua18lZCIuIFRoaXMgaXMgdHJ1ZSBmb3IgbW9zdCBvZiB0aGUgbXV4ZXJzLgorCSAgQnV0IHNwbGl0bXV4c2luayBub3QgYWJsZSB0byByZXF1ZXN0IHBhZCB0byBmbHZtdXggYXMgZmx2bXV4IGhhcyAiYXVkaW8iIGFuZCAidmlkZW8iIGFzIHBhZCB0ZW1wbGF0ZXMuCisJICBmaXg6IHNwbGl0bXV4c2luayBzaG91bGQgZmFsbGJhY2sgdG8gImF1ZGlvIiBhbmQgICJ2aWRlbyIgd2hlbiB0ZW1wbGF0ZSBub3QgZm91bmQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0NTA3CisKKzIwMTYtMTEtMTcgMTA6MjQ6MjggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSAgbWF0cm9za2FwYXJzZTogQWRkIHJlbWFpbmluZyByZWxldmFudCBwYXJ0cyBmcm9tIGEzYTU1MzA1IHRvIHRoZSBwYXJzZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ1NjYKKworMjAxNi0xMS0xNiAyMjozOTowMSArMDEwMCAgTmljb2xhIE11cmlubyA8bmljb2xhLm11cmlub0BnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSAgbWF0cm9za2FwYXJzZTogaWdub3JlIHBhcnNpbmcgZXJyb3JzIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUKKwkgIFRoaXMgaXMgdGhlIHNhbWUgY2hhbmdlIGFzIGEzYTU1MzA1IGZvciB0aGUgcGFyc2VyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NDU2NgorCisyMDE2LTExLTE2IDA4OjU2OjM0ICswMTAwICBQaGlsaXBwZSBOb3JtYW5kIDxwaGlsbkBpZ2FsaWEuY29tPgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnNpZ25hbHM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYnVuZGxlLmM6CisJKiB0ZXN0cy9jaGVjay9tZXNvbi5idWlsZDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC8uZ2l0aWdub3JlOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1ydHBidW5kbGUuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItcnRwYnVuZGxlLmM6CisJICBydHBiaW46IHJlY2VpdmUgYnVuZGxlIHN1cHBvcnQKKwkgIEEgbmV3IHNpZ25hbCBuYW1lZCBvbi1idW5kbGVkLXNzcmMgaXMgcHJvdmlkZWQgYW5kIGNhbiBiZQorCSAgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gdG8gcmVkaXJlY3QgYSBzdHJlYW0gdG8gYSBkaWZmZXJlbnQKKwkgIEdzdFJ0cFNlc3Npb24gb3IgdG8ga2VlcCB0aGUgUlRYIHN0cmVhbSBncm91cGVkIHdpdGhpbiB0aGUKKwkgIEdzdFJ0cFNlc3Npb24gb2YgdGhlIHNhbWUgbWVkaWEgdHlwZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzI3NDAKKworMjAxNi0xMS0xNSAxNjo1MjozOSArMDUzMCAgVmlub2QgS2VzdGkgPHZpbm9ka2VzdGlAeWFob28uY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogYXNzZXJ0aW9uIHdoaWxlIGNvbnZlcnRpbmcgQURUUyBzdHJlYW0gdG8gUkFXCisJICBhYWNwYXJzZSByZXNpemVzIGlucHV0IGJ1ZmZlciB3aGlsZSBjb252ZXJ0aW5nIEFEVFMgc3RyZWFtIHRvIFJBVywKKwkgIER1cmluZyBidWZmZXIgcmVzaXplIGJ1ZmZlciB3cml0ZSBwZXJtaXNzaW9uIGlzIG5vdCBjaGVja2VkLgorCSAgVGhpcyB0aHJvd3MgZ3N0X2J1ZmZlcl9pc193cml0YWJsZSBhc3NlcnRpb24gYW5kIGxlYWRzIHRvIEFWIHN5bmMgaXNzdWUgc29tZSB0aW1lcy4KKwkgIEl0IGlzIGNvcnJlY3RlZCBieSBtYWtpbmcgYnVmZmVyIHdyaXRlYWJsZSB1c2luZyBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQxMjkKKworMjAxNi0xMS0xNSAyMToxNzo1MSArMDkwMCAgU2V1bmdoYSBZYW5nIDxzaC55YW5nQGxnZS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRG9uJ3QgbW9kaWZ5IHVwc3RyZWFtIFRJTUUgc2VnbWVudAorCSAgVElNRSBzZWdtZW50IGltcGxpZXMgdGhhdCBzdHJlYW0vcnVubmluZyB0aW1lIGlzIGJlaW5nIGhhbmRsZWQgYnkgdXBzdHJlYW0uCisJICBTbywgd2Ugc2hvdWxkbid0IG92ZXJyaWRlIGl0IHdpdGhvdXQgYW55IGNsdWUuCisJICBUaGlzIHBhdGNoIGlzIGZvciBmaXhpbmcgc2VlayBpbiBEQVNIIHN0cmVhbWluZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQxOTYKKworMjAxNi0xMS0xNCAyMjozMzoyNyArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bkBvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGNvbmZpZy5oLm1lc29uOgorCSAgbWVzb246IEFkZCBkZWZpbmUgZm9yIHY0bDItcHJvYmUgY29uZmlnIG9wdGlvbgorCisyMDE2LTExLTE0IDE3OjM3OjUxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkgIGRlaW50ZXJsZWF2ZTogUmVzZXQgY2FwcyBhY2N1bXVsYXRvciB0byBBTlkgd2hlbiByZXN5bmNpbmcgdGhlIGFkYXB0ZXIsIG5vdCBFTVBUWQorCSAgVGhlIGFjY3VtdWxhdG9yIGlzIGZpbGxlZCBieSBpbnRlcnNlY3Rpbmcgd2l0aCBhbGwgdGhlIHBhZCBjYXBzLCBhcyBzdWNoCisJICBpdCBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggQU5ZIChsaWtlIGl0IGlzIGJlZm9yZSB0aGUgaXRlcmF0aW9uIGlzCisJICBzdGFydGVkKSBhbmQgbm90IHRvIEVNUFRZLgorCSAgRml4ZXMgdGhlIENBUFMgcXVlcnkgYWx3YXlzIHJldHVybmluZyBFTVBUWSBjYXBzIHdoZW4gcmVzeW5jaW5nIGhhcHBlbmVkCisJICBkdXJpbmcgdGhlIHF1ZXJ5LCBlLmcuIGJlY2F1c2UgcGFkcyB3ZXJlIGFkZGVkL3JlbW92ZWQuCisKKzIwMTYtMTEtMTQgMTI6MTM6MTQgKzAxMDAgIFBldHIgS3VsaGF2eSA8YnJhaW5Aamlrb3MuY3o+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IHJlbW92ZSByZWR1bmRhbnQgc2FkZHIgdW5yZWYKKwkgIFRoZSBnX29iamVjdF91bnJlZiAoc2FkZHIpIGJlZm9yZSByZWNlaXZpbmcgbWVzc2FnZSBzZWVtcyB0byBiZSByZWR1bmRhbnQgYXMgaXQKKwkgIGlzIGRvbmUganVzdCBiZWZvcmUganVtcGluZyB0byByZXRyeQorCSAgVGhvdWdoIG5vdCBkaXJlY3RseSByZWxhdGVkLCBwYXJ0IG9mCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcyODQxCisKKzIwMTYtMTEtMTIgMjM6MzQ6MjMgKzAxMDAgIFBldHIgS3VsaGF2eSA8YnJhaW5Aamlrb3MuY3o+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IHJlY2VpdmUgY29udHJvbCBtZXNzYWdlcyBvbmx5IGluIG11bHRpY2FzdAorCSAgQ29udHJvbCBtZXNzYWdlcyBhcmUgdXNlZCBvbmx5IGluIG11bHRpY2FzdCBtb2RlIC0gdG8gZGV0ZWN0IGlmIHRoZSBkZXN0aW5hdGlvbgorCSAgYWRkcmVzcyBpcyBub3Qgb3VycyBhbmQgcG9zc2libHkgZHJvcCB0aGUgcGFja2V0LiBIb3dldmVyIGluIG5vbi1tdWx0aWNhc3QKKwkgIG1vZGVzIHRoZSBtZXNzYWdlcyBhcmUgc3RpbGwgYWxsb2NhdGVkIGFuZCBmcmVlZCBldmVuIGlmIG5vdCB1c2VkLiBUaGVyZWZvcmUKKwkgIHJlcXVlc3QgY29udHJvbCBtZXNzYWdlcyBmcm9tIGdfc29ja2V0X3JlY2VpdmVfbWVzc2FnZSgpIG9ubHkgaW4gbXVsdGljYXN0CisJICBtb2RlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3Mjg0MQorCisyMDE2LTExLTExIDEwOjQ1OjAxIC0wODAwICBTY290dCBEIFBoaWxsaXBzIDxzY290dC5kLnBoaWxsaXBzQGludGVsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgVXNlIGludGVybWVkaWF0ZSBndWludCB3aGVuIGhhbmRsaW5nIEdzdFZpZGVvTXVsdGl2aWV3RmxhZ3MKKwkgIFRoZSB1bmRlcmx5aW5nIGludGVnZXIgdHlwZSBvZiB0aGUgZW51bSBHc3RWaWRlb011bHRpdmlld0ZsYWdzIGlzCisJICBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGFuZCBtYXkgbm90IGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyBndWludC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQyOTMKKworMjAxNi0xMS0xMSAxMDo0NDoxOCAtMDgwMCAgU2NvdHQgRCBQaGlsbGlwcyA8c2NvdHQuZC5waGlsbGlwc0BpbnRlbC5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRmaWxlc3JjLmM6CisJICBzcGxpdGZpbGVzcmM6IHVwZGF0ZSB1cmlfZ2V0X3R5cGUgdG8gbWF0Y2ggdGhlIHByb3RvdHlwZSBpbiBHc3RVUklIYW5kbGVySW50ZXJmYWNlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0MjkzCisKKzIwMTYtMTAtMjYgMjI6Mzc6MzQgLTA3MDAgIFNjb3R0IEQgUGhpbGxpcHMgPHNjb3R0LmQucGhpbGxpcHNAaW50ZWwuY29tPgorCisJKiBtZXNvbi5idWlsZDoKKwkgIG1lc29uOiBkb24ndCBhZGRfZ2xvYmFsX2FyZ3VtZW50cyB3aGVuIGJlaW5nIGJ1aWx0IGFzIGEgc3VicHJvamVjdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MzU2OAorCisyMDE2LTEwLTIxIDE1OjQ5OjM2ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmg6CisJICBmbGFjcGFyc2U6IGZpeCBoZWFkZXIgcmV3cml0aW5nIGJlaW5nIGlnbm9yZWQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mjc4MDIKKworMjAxNi0xMS0wOSAwNjoyNToyNyArMDAwMCAgU2VhbiBEdUJvaXMgPHNlYW5Ac2lvYnVkLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4Lmg6CisJICBmbHZtdXg6IEFkZCBtZXRhZGF0YWNyZWF0b3IgcHJvcGVydHkKKwkgIEFsbG93IHVzZXJzIHRvIHNldCBtZXRhZGF0YWNyZWF0b3IgdmFsdWUgaW4gdGhlIG1ldGEgcGFja2V0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0MTMxCisKKzIwMTYtMTEtMDEgMTk6NTY6MzYgKzAyMDAgIFZpdmlhIE5pa29sYWlkb3UgPHZpdmlhQHRvb2xzb25haXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuaDoKKwkgIHNwbGl0bXV4c2luazogVXNlIGZpcnN0IGJ1ZmZlciBUUyBhcyBtdXggc3RhcnQgdGltZQorCSAgRG8gbm90IHVzZSBsYXN0IGJ1ZmZlciBUUyArIGJ1ZmZlciBkdXJhdGlvbiBiZWNhdXNlIGJ1ZmZlciBkdXJhdGlvbgorCSAgbWlnaHQgYmUgaW5hY2N1cmF0ZSwgZXNwZWNpYWxseSBmb3IgZnJhbWUgcmF0ZXMgbGlrZSAzMGZwcyB3aGVyZSBhCisJICByb3VuZGluZyBlcnJvciBpcyBvYnNlcnZlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzM3ODUKKworMjAxNi0xMS0wMyAxNTowMzo1OSArMDEwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBmaXggdGltZXItcmV1c2UgYnVnCisJICBXaGVuIGRvaW5nIHJ0eCwgdGhlIGppdHRlcmJ1ZmZlciB3aWxsIGFsd2F5cyBhZGQgYW4gcnR4LXRpbWVyIGZvciB0aGUgbmV4dAorCSAgc2VxdWVuY2UgbnVtYmVyLgorCSAgSW4gdGhlIGNhc2Ugb2YgdGhlIHBhY2tldCBjb3JyZXNwb25kaW5nIHRvIHRoYXQgc2VxdWVuY2UgbnVtYmVyIGFycml2aW5nLAorCSAgdGhhdCBzYW1lIHRpbWVyIHdpbGwgYmUgcmV1c2VkLCBhbmQgc2ltcGx5IG1vdmVkIG9uIHRvIHdhaXQgZm9yIHRoZQorCSAgZm9sbG93aW5nIHNlcXVlbmNlIG51bWJlciBldGMuCisJICBPbmNlIGFuIHJ0eC10aW1lciBleHBpcmVzIChhZnRlciBhbGwgcmV0cmllcyksIGl0IHdpbGwgYmUgcmVzY2hlZHVsZWQgYXMKKwkgIGEgbG9zdC10aW1lciBpbnN0ZWFkIGZvciB0aGUgc2FtZSBzZXF1ZW5jZSBudW1iZXIuCisJICBOb3csIGlmIHRoaXMgcGFydGljdWxhciBzZXF1ZW5jZS1udW1iZXIgbm93IGFycml2ZXMgKGFmdGVyIHRoZSB0aW1lciBoYXMKKwkgIGJlY29tZSBhIGxvc3QtdGltZXIpLCB0aGUgcmV1c2UgbWVjaGFuaXNtICpzaG91bGQqIG5vdyBzZXQgYSBuZXcKKwkgIHJ0eC10aW1lciBmb3IgdGhlIG5leHQgc2VxdWVuY2UgbnVtYmVyLCBidXQgdGhlIGJ1ZyBpcyB0aGF0IGl0IGRvZXMKKwkgIG5vdCBjaGFuZ2UgdGhlIHRpbWVyLXR5cGUsIGFuZCBoZW5jZSBzY2hlZHVsZXMgYSBsb3N0LXRpbWVyIGZvciB0aGF0CisJICBmb2xsb3dpbmcgc2VxdWVuY2UgbnVtYmVyLCB3aXRoIHRoZSByZXN1bHQgdGhhdCB5b3Ugd2lsbCBoYXZlIGEgdmVyeQorCSAgZWFybHkgbG9zdC1ldmVudCBmb3IgYSBwYWNrZXQgdGhhdCBtaWdodCBzdGlsbCBhcnJpdmUsIGFuZCB5b3Ugd2lsbAorCSAgbmV2ZXIgYmUgYWJsZSB0byBzZW5kIGFueSBydHggZm9yIHRoaXMgcGFja2V0LgorCSAgRm91bmQgYnkgRXJsZW5kIEdyYWZmIC0gZXJsZW5kQHBleGlwLmNvbQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3Mzg5MQorCisyMDE2LTEwLTA5IDE1OjU5OjA1ICswMjAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBmaXggbG9zdC1ldmVudCB1c2luZyBkdHMgaW5zdGVhZCBvZiBwdHMKKwkgIFRoZSBsb3N0LWV2ZW50IHdhcyB1c2luZyBhIGRpZmZlcmVudCB0aW1lLWRvbWFpbiAoZHRzKSB0aGFuIHRoZSBvdXRnb2luZworCSAgYnVmZmVycyAocHRzKS4gR2l2ZW4gY2VydGFpbiBuZXR3b3JrLWNvbmRpdGlvbnMgdGhlc2UgdHdvIHdvdWxkIGJlY29tZQorCSAgc3VmZmljaWVudGx5IGRpZmZlcmVudCBhbmQgdGhlIGxvc3QtZXZlbnQgY29udGFpbmVkIHRpbWVzdGFtcC9kdXJhdGlvbgorCSAgdGhhdCB3YXMgcmVhbGx5IHdyb25nLiBBcyBhbiBleGFtcGxlIEdzdEF1ZGlvRGVjb2RlciBjb3VsZCBwcm9kdWNlCisJICBhIHN0cmVhbSB0aGF0IGp1bXBzIGJhY2sgYW5kIGZvcnRoIGluIHRpbWUgYWZ0ZXIgcmVjZWl2aW5nIGEgbG9zdC1ldmVudC4KKwkgIFRoZSBwcmV2aW91cyBiZWhhdmlvciBjYWxjdWxhdGVkIHRoZSBwdHMgKGJhc2VkIG9uIHRoZSBydHB0aW1lKSBpbnNpZGUgdGhlCisJICBydHBfaml0dGVyX2J1ZmZlcl9pbnNlcnQgZnVuY3Rpb24sIGJ1dCBub3cgdGhpcyBmdW5jdGlvbmFsaXR5IGhhcyBiZWVuCisJICByZWZhY3RvcmVkIGludG8gYSBuZXcgZnVuY3Rpb24gcnRwX2ppdHRlcl9idWZmZXJfY2FsY3VsYXRlX3B0cyB0aGF0IGlzCisJICBjYWxsZWQgbXVjaCBlYXJsaWVyIGluIHRoZSBfY2hhaW4gZnVuY3Rpb24gdG8gbWFrZSBwdHMgYXZhaWxhYmxlIHRvCisJICB2YXJpb3VzIGNhbGN1bGF0aW9ucyB0aGF0IHdyb25nbHkgdXNlZCBkdHMgcHJldmlvdXNseQorCSAgKGxpa2UgdGhlIGxvc3QtZXZlbnQpLgorCSAgVGhlcmUgYXJlIGhvd2V2ZXIgdHdvIGNhbGN1bGF0aW9ucyB3aGVyZSB1c2luZyBkdHMgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvCisJICBkbzogY2FsY3VsYXRpbmcgdGhlIHJlY2VpdmUtaml0dGVyIGFuZCB0aGUgcnR4LXJvdW5kLXRyaXAtdGltZSwgd2hlcmUgdGhlCisJICBhcnJpdmFsIHRpbWUgb2YgdGhlIGJ1ZmZlciBmcm9tIHRoZSBuZXR3b3JrIGlzIHRoZSByaWdodCBtZXRyaWMKKwkgIChhbmQgaXMgd2hhdCBkdHMgaW4gZmFjdCBpcyB0b2RheSkuCisJICBUaGUgcGF0Y2ggYWxzbyBhZGRzIHR3byB0ZXN0cyByZWdhcmRpbmcgQi1mcmFtZXMgb3IgdGhlCisJICDigJxydHB0aW1lLWdvaW5nLWJhY2t3YXJkc+KAnS1zY2VuYXJpbywgYXMgdGhlcmUgd2VyZSBzb21lIGNvbmNlcm5zIHRoYXQgdGhpcworCSAgcGF0Y2ggbWlnaHQgYnJlYWsgdGhpcyBiZWhhdmlvciAod2hpY2ggdGhlIHRlc3RzIHNob3dzIGl0IGRvZXMgbm90KS4KKworMjAxNi0xMS0wMyAxNjozMzo1MyArMDEwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBmaXggYnVnIGluIHJlc2NoZWR1bGVfdGltZXIKKwkgIFRoZSBuZXcgdGltZW91dCBpcyBhbHdheXMgZ29pbmcgdG8gYmUgKHRpbWVvdXQgKyBkZWxheSksIGhvd2V2ZXIsIHRoZQorCSAgb2xkIGJlaGF2aW9yIGNvbXBhcmVkIHRoZSBjdXJyZW50IHRpbWVvdXQgdG8ganVzdCAodGltZW91dCksIGJhc2ljYWxseQorCSAgYmVpbmcgKGRlbGF5KSBvZmYuCisJICBUaGlzIHdvdWxkIGhhcHBlbiBpZiBydHgtZGVsYXkgPT0gcnR4LXJldHJ5LXRpbWVvdXQsIHdpdGggdGhlIHJlc3VsdCB0aGF0CisJICBhIHNlY29uZCBydHggYXR0ZW1wdCBmb3IgYW55IGJ1ZmZlcnMgd291bGQgYmUgc2NoZWR1bGVkIGltbWVkaWF0ZWx5IGluc3RlYWQKKwkgIG9mIGFmdGVyIHJ0eC1kZWxheSBtcy4KKwkgIFNpbXBseSBjYWxjdWxhdGUgKG5ld190aW1lb3V0ID0gdGltZW91dCArIGRlbGF5KSBhbmQgdGhlbiB1c2UgdGhhdCBpbnN0ZWFkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MzkwNQorCisyMDE2LTExLTAzIDEzOjI3OjUxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYXJzZS5jOgorCSogdGVzdHMvZmlsZXMvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9maWxlcy9hdWRpb3Rlc3RzcmMud2F2OgorCSAgdGVzdHM6IHdhdnBhcnNlOiBhZGQgdGVzdCBmb3IgcHJvY2Vzc2luZyBhbiBhY3R1YWwgLndhdiBmaWxlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczODYxCisKKzIwMTYtMTEtMDMgMTI6MzQ6NTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IERvbid0IHNldCBjYXBzIHRvIE5VTEwgYWZ0ZXIgc2V0dGluZyB0aGVtIG9uIHRoZSBzcmNwYWQKKwkgIFdlIHdvdWxkIGxpa2UgdG8gY2hlY2sgbGF0ZXIgb24gRU9TIGlmIHdlIGZvdW5kIGEga25vd24gc3RyZWFtIHR5cGUgb3IKKwkgIG5vdCwgdG8gcG9zc2libHkgcG9zdCBhbiBlcnJvciBtZXNzYWdlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3Mzg2MQorCisyMDE2LTExLTAyIDE0OjMzOjI4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogRG9uJ3QgZGVyZWYgTlVMTCBwYWRzIGluIGRlYnVnIG91dHB1dAorCSAgVGhhdCB0ZW5kcyB0byBjcmFzaC4KKworMjAxNi0xMS0wMiAxMTo0NjowNyArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgaXNvbXA0OiBEb24ndCB1c2UgZ3N0X3ZpZGVvX2NvbG9yaW1ldHJ5X3RvX3N0cmluZ19mdWxsKCkKKwkgIFRoZSBBUEkgd2FzIHJldmVydGVkLiBKdXN0IHVzZSB0aGUgcGxhaW4KKwkgIGdzdF92aWRlb19jb2xvcmltZXRyeV90b19zdHJpbmcoKSBmdW5jdGlvbi4KKworMjAxNi0xMS0wMiAxMTowMDoxMyArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IEZpeCBHT2JqZWN0IHdhcm5pbmdzIG9uIHNodXRkb3duLgorCSAgQ29tbWl0IDgzZTcxOCBhZGRlZCBhIHBhZCB0ZW1wbGF0ZSB0byBzcGxpdG11eCByZXF1ZXN0CisJICBwYWRzLCB3aGljaCBtZWFucyB0aGF0IEdzdEVsZW1lbnQgbm93IHJlbGVhc2VzIHRoZSBwYWRzIG9uCisJICBkaXNwb3NlLCBidXQgYWZ0ZXIgaGF2aW5nIHJlbW92ZWQgYWxsIGVsZW1lbnRzIGluIHRoZSBiaW4KKwkgIGFuZCB1bmxpbmtlZCB0aGVtLiBNYWtlIHN1cmUgd2UgY2FuIGhhbmRsZSBjbGVhbnVwIGluIHRoYXQgY2FzZQorCSAgd2l0aG91dCB0aHJvd2luZyBhc3NlcnRpb25zLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3Mzc4NAorCisyMDE2LTExLTAyIDAyOjI1OjUxICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNyYy5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNyYy5oOgorCSAgc3BsaXRtdXhzcmM6IFN0b3JlIHNlZWsgc2VxbnVtIGFuZCBzZW5kIGl0IG9uIEVPUyAvIHNlZ21lbnQgZXZlbnRzLgorCSAgR0VTIHJlbGllcyBvbiB0aGUgRU9TIGV2ZW50IGhhdmluZyB0aGUgc2VxbnVtIG9mIHRoZSBzZWVrIHRoYXQKKwkgIGNhdXNlZCBpdC4KKworMjAxNi0xMS0wMiAwMjoyNTowMCArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYzoKKwkgIHNwbGl0bXV4c3JjOiBGb3J3YXJkIGEgbm90LWxpbmtlZCBlcnJvciBvbiB0aGUgYnVzCisJICBIYW5kbGUgbm90LWxpbmtlZCBhcyBmb3Igb3RoZXIgZmF0YWwgZXJyb3JzIGFuZCBwb3N0IGl0CisJICBvbnRvIHRoZSBidXMgc28gdGhlIGFwcCBrbm93cworCisyMDE2LTExLTAxIDIxOjAwOjE1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBjb21waWxlciB3YXJuaW5nCisJICBxdGRlbXV4LmM6IEluIGZ1bmN0aW9uIOKAmHF0ZGVtdXhfcGFyc2VfdHJlZeKAmToKKwkgIHF0ZGVtdXguYzoxMDEzOToxNjogZXJyb3I6IOKAmGNvbG9yX3RhYmxlX2lk4oCZIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbiBbLVdlcnJvcj1tYXliZS11bmluaXRpYWxpemVkXQorCSAgaWYgKGNvbG9yX3RhYmxlX2lkICE9IDApIHsKKwkgIF4KKwkgIHF0ZGVtdXguYzoxMDEyMToxOTogbm90ZTog4oCYY29sb3JfdGFibGVfaWTigJkgd2FzIGRlY2xhcmVkIGhlcmUKKwkgIGd1aW50MTYgY29sb3JfdGFibGVfaWQ7CisJICBefn5+fn5+fn5+fn5+fgorCisyMDE2LTEwLTIwIDE3OjQwOjU5ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogVXNlIGEgZGVmYXVsdCBpbnRlcmxlYXZlIG9mIDI1MG1zIGZvciBhbGwgY29kZWNzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczMjE3CisKKzIwMTYtMTAtMTkgMTQ6MzM6MzMgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBVc2UgYSBkZWZhdWx0IGludGVybGVhdmUgd2hlbiBQcm9SZXMgaXMgdXNlZAorCSAgVGhlIFByb1JlcyBndWlkZWxpbmVzIHN1Z2dlc3QgYW4gaW50ZXJsZWF2ZSBvZiAwLjVzIGlzIGNvbW1vbiwgYnV0CisJICBzcGVjaWZpZXMgdGhhdCBmb3IgUHJvUmVzIGF0IG1vc3QgMk1CIChmb3IgU0QpIGFuZCA0TUIgKGZvciBIRCkgc2hvdWxkCisJICBiZSB1c2VkIHBlciBjaHVuay4KKwkgIEl0IG1pZ2h0IGFsc28gbWFrZSBzZW5zZSB0byB1c2Ugc2ltaWxhciBudW1iZXJzIGluIGdlbmVyYWwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczMjE3CisKKzIwMTYtMTAtMTkgMTQ6MjU6MjggKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBBbGxvdyBjb25maWd1cmluZyB0aGUgaW50ZXJsZWF2ZSBzaXplIGluIGJ5dGVzL3RpbWUKKwkgIFByZXZpb3VzbHkgd2Ugd2VyZSBzd2l0Y2hpbmcgZnJvbSBvbmUgY2h1bmsgdG8gYW5vdGhlciBvbiBldmVyeSBzaW5nbGUKKwkgIGJ1ZmZlci4gVGhpcyB3YXN0ZXMgc29tZSBzcGFjZSBpbiB0aGUgaGVhZGVycyBhbmQsIGRlcGVuZGluZyBvbiB0aGUKKwkgIHNvZnR3YXJlLCBtaWdodCBkZXBlbmQgaW4gbW9yZSByZWFkcyAoZS5nLiBpZiB0aGUgc29mdHdhcmUgaXMgcmVhZGluZworCSAgbXVsdGlwbGUgc2FtcGxlcyBpbiBvbmUgZ28gaWYgdGhleSdyZSBpbiB0aGUgc2FtZSBjaHVuaykuCisJICBUaGUgUHJvUmVzIGd1aWRlbGluZXMgc3VnZ2VzdCBhbiBpbnRlcmxlYXZlIG9mIDAuNXMgaXMgY29tbW9uLCBidXQKKwkgIHNwZWNpZmllcyB0aGF0IGZvciBQcm9SZXMgYXQgbW9zdCAyTUIgKGZvciBTRCkgYW5kIDRNQiAoZm9yIEhEKSBzaG91bGQKKwkgIGJlIHVzZWQgcGVyIGNodW5rLiBUaGlzIHdpbGwgYmUgaGFuZGxlZCBpbiBhIGZvbGxvdy11cCBjb21taXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczMjE3CisKKzIwMTYtMDktMzAgMTg6MjI6MjcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBTZXQgY29tcHJlc3NvciBuYW1lLCBob3Jpem9udGFsL3ZlcnRpY2FsIHJlc29sdXRpb24gYW5kIGRlcHRoIGZvciBQcm9SZXMKKwkgIFRoaXMgaXMgYWxzbyByZXF1aXJlZCBieSBzb21lIHNvZnR3YXJlIHRvIGhhbmRsZSBQcm9SZXMgZmlsZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5MDQ4CisKKzIwMTYtMDktMzAgMTg6MDU6MzggKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZm91cmNjLmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0OiBBZGQgc3VwcG9ydCBmb3IgUHJvUmVzIDQ0NDQgWFEKKwkgIEFuZCBhbHNvIDQ0NDQgaW4gdGhlIG11eGVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTA0OAorCisyMDE2LTA5LTMwIDE3OjU4OjM3ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmM6CisJICBxdG11eDogV3JpdGUgJ2NsYXAnIGF0b20gZm9yIFByb1JlcworCSAgSXQncyByZXF1aXJlZCBmb3IgUHJvUmVzIHRvIHdvcmsgd2l0aCBvdGhlciBzb2Z0d2FyZS4KKwkgIEl0IGlzIGFsc28gaW4gdGhlIE1QNCBzdGFuZGFyZCwgYnV0IGludmVudGluZyB2YWx1ZXMgaGVyZSBzZWVtcyBhIGJpdAorCSAgdHJpY2t5IGZvciB0aGUgZ2VuZXJhbCBjYXNlIGFuZCBpdCBkb2VzIG5vdCByZWFsbHkgZ2l2ZSBhbnkgZXh0cmEKKwkgIGluZm9ybWF0aW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTA0OAorCisyMDE2LTA5LTMwIDA5OjU1OjU4ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFJlYWQgY29sb3JpbWV0cnkgaW5mb3JtYXRpb24gZnJvbSBjb2xyIGF0b20gaWYgYXZhaWxhYmxlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcyMTgxCisKKzIwMTYtMDktMjkgMjE6NTY6MTggKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvYXRvbXMuaDoKKwkqIGdzdC9pc29tcDQvZm91cmNjLmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogQWx3YXlzIHdyaXRlIGNvbHIgYXRvbSB3aXRoIHRoZSBjb2xvcmltZXRyeSBpbmZvcm1hdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MjE4MQorCisyMDE2LTA5LTI5IDE4OjE2OjE4ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogRml4IHdyaXRpbmcgb2YgdGhlICdmaWVsJyBleHRlbnNpb24gYXRvbQorCSAgVGhpcyB3YXMgYWxzbyB3cm9uZyBmb3IgSlBFRzIwMDAuIEFsc28gd3JpdGUgaXQgZm9yIGFsbCBNT1YgZmlsZXMgYW5kCisJICBKUEVHMjAwMCwgbm90IG9ubHkgZm9yIFByb1Jlcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjkwNDgKKworMjAxNi0wOS0yOSAxNzo0MDoyMyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSAgcXRtdXg6IFdyaXRlIDQgYnl0ZXMgb2YgemVyb2VzIGF0IHRoZSBlbmQgb2YgdGhlIHNhbXBsZSBkZXNjcmlwdGlvbiBleHRlbnNpb25zCisJICBUaGlzIGlzIHdvcmtpbmcgYXJvdW5kIHNvbWUgYnJva2VuIHNvZnR3YXJlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTA0OAorCisyMDE2LTA5LTI4IDIwOjU1OjI0ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJICBhdG9tczogJ3Bhc3AnIGF0b20gaXMgYWxzbyBwYXJ0IG9mIE1QNCwgd3JpdGUgaXQgYWx3YXlzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5MDQ4CisKKzIwMTYtMDctMTEgMTk6MzA6MTIgKzAzMDAgIFZpdmlhIE5pa29sYWlkb3UgPHZpdmlhQGFoaXJ1LmV1PgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IFdyaXRlIGFkZGl0aW9uYWwgYXRvbXMgZm9yIHByb3JlcyB2aWRlbworCSAgVGhlc2UgcmVxdWlyZWQgYXRvbXMgYXJlOiBjb2xvcmltZXRyeSwgZmllbGQgaW5mb3JtYXRpb24sIHNwYXRpYWwvdGVtcG9yYWwKKwkgIHF1YWxpdHksIGFuZCB2ZW5kb3IuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5MDQ4CisKKzIwMTQtMDYtMTYgMTc6MjA6MzIgKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW4uc2VsbmVzQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkgIHJ0cGgyNjNkZXBheTogRG9uJ3QgZHJvcCBtb2RlIGIgcGFja2V0cyB3aXRoIHBpY3R1cmUgc3RhcnQgY29kZQorCSAgU29tZSBidWdneSBwYXlsb2FkZXJzLCBlLmcuIHJ0cGgyNjNwYXksIG1heSB1c2UgbW9kZSBCIGZvciBwYWNrZXRzCisJICB0aGF0IHN0YXJ0cyB3aXRoIGEgcGljdHVyZSAob3IgR09CKSBzdGFydCBjb2RlIGFsdGhvdWdoIGl0J3Mgbm90CisJICBhbGxvd2VkLiBMZXQncyBiZSBuaWNlIGFuZCBub3QgZHJvcCB0aGVzZSBwYWNrZXRzL2ZyYW1lcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzM1MTYKKworMjAxNi0wNi0yMiAxMzo1OTozNSArMDIwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBoMjYzLmM6CisJICBydHBoMjYzcHBheTogRml4IGNhcHMgbGVhaworCSAgRml4IGxlYWtpbmcgY2FwcyB3aGVuIGRvd25zdHJlYW0gaGFzIG5vdC1maXhlZCBjYXBzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MzUxNQorCisyMDE2LTEwLTI2IDE2OjQyOjE5ICswMjAwICBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJICBydHBoMjYzcGF5OiBGaXggaW5kZW50YXRpb24KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzM1MTQKKworMjAxNi0xMC0xOCAxMTozNTo1OCArMDIwMCAgU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSAgcnRwaDI2M3BheTogVXNlIEdTVF9UUkFDRV9PQkpFQ1QgZm9yIGxvZ2dpbmcgYml0c3RyZWFtIHBhcnNpbmcKKwkgIEJ1bXAgdGhlIGJpdHN0cmVhbSBwYXJzaW5nIHRvIFRSQUNFIGxvZyBsZXZlbCBzbyBpdCBkb2Vzbid0IGZsb29kIHRoZQorCSAgb3V0cHV0IHdoZW4gdHJ5aW5nIHRvIHJlYWQgdGhlIG1vcmUgdXNlZnVsIERFQlVHIGFuZCBMT0cgbWVzc2FnZXMuCisJICBBbHNvIHVzZSBHU1RfREVCVUdfT0JKRUNUIGluc3RlYWQgb2YgR1NUX0RFQlVHIGluIHZhcmlvdXMgcGxhY2VzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczNTE0CisKKzIwMTYtMTAtMTggMTE6MDk6MTAgKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgIHJ0cGgyNjNwYXk6IEZpeCBsZWFrIGZvciBCLWZyYWdtZW50cworCSAgQWx0b3VnaCBjb21taXRzIDZhMTZiZTcsIDY0ZjlkMDggYW5kIDBjN2UzYTggZml4ZWQgc29tZSBpc3N1ZXMgdGhleQorCSAgaW50cm9kdWNlZCBvdGhlcnMuIFRoaXMgcGF0Y2ggZml4ZXMgdGhlIGxlYWsgb2Ygb25lIG1hY3JvYmxvY2sgZm9yIGV2ZXJ5CisJICBCIGZyYWdtZW50LgorCSAgTWFjcm9ibG9jayBzdHJ1Y3R1cmVzIG11c3Qgbm90IGJlIGZyZWVkIGltbWVkaWF0ZWx5IGFmdGVyIGZpbmRpbmcgdGhlCisJICBib3VuZGFyaWVzIGFzIHRoZXkgYXJlIHN0b3JlZCBhbmQgdXNlZCBsYXRlci4gSG93ZXZlciB0aGUgaW5pdGFsIGR1bW15CisJICBzdHJ1Y3R1cmUgKHVzZWQgZm9yIGZpbmRpbmcgdGhlIGZpcnN0IGJvdW5kYXJ5KSBtdXN0IGJlIGZyZWVkLgorCSAgQ0lEICMxMjEyMTU2CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczNTEyCisKKzIwMTYtMTAtMjAgMTM6MTQ6MTMgKzAyMDAgIEFsZWphbmRybyBHLiBDYXN0cm8gPGFsZXhAaWdhbGlhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwYmluOiBhdm9pZCBnZW5lcmF0aW5nIGVycm9ycyB3aGVuIHJ0Y3AgbWVzc2FnZXMgYXJlIGVtcHR5IGFuZCBjaGVjayB0aGUgcXVldWUgaXMgbm90IGVtcHR5CisJICBBZGQgYSBjaGVjayB0byB2ZXJpZnkgYWxsIHRoZSBvdXRwdXQgYnVmZmVycyB3ZXJlIGVtcHR5IGZvciB0aGUKKwkgIHNlc3Npb24gaW4gYSB0aW1vdXQgYW5kIGxvZyBhbiBlcnJvci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzMyNjkKKworMjAxNi0xMC0yNiAxMzoyMToyOSArMDIwMCAgQWxlamFuZHJvIEcuIENhc3RybyA8YWxleEBpZ2FsaWEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBiaW46IHBpcGVsaW5lIGdldHMgYW4gRU9TIHdoZW4gYW55IHJ0cHNvdXJjZXMgYnllcworCSAgSW5zdGVhZCBvZiBzZW5kaW5nIEVPUyB3aGVuIGEgc291cmNlIGJ5ZXMgd2UgaGF2ZSB0byB3YWl0IGZvcgorCSAgYWxsIHRoZSBzb3VyY2VzIHRvIGJlIGdvbmUsIHdoaWNoIG1lYW5zIHRoZXkgYWxyZWFkeSBzZW50IEJZRSBhbmQKKwkgIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSBzZXNzaW9uLiBXZSBub3cgaGFuZGxlIHRoZSBFT1MgaW4gdGhlIHJ0Y3AKKwkgIGxvb3AgY2hlY2tpbmcgdGhlIGFtb3VudCBvZiBzb3VyY2VzIGluIHRoZSBzZXNzaW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MzIxOAorCisyMDE2LTEwLTIxIDE3OjMxOjAwICswMDAwICBNYXR0IFN0YXBsZXMgPHN0YXBsZXMyNTVAZ21haWwuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBBbHNvIGhhbmRsZSByZWRpcmVjdCBvbiBQTEFZCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcyNjEwCisKKzIwMTYtMDgtMzAgMTA6MjQ6NDMgKzAyMDAgIFBldHIgS3VsaGF2eSA8YnJhaW5Aamlrb3MuY3o+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGFsbG93IG1pc3NpbmcgY29udHJvbCBhdHRyaWJ1dGUgaW4gY2FzZSBvZiBhIHNpbmdsZSBzdHJlYW0KKwkgIEltcHJvdmUgUkZDMjMyNiAtIGNoYXB0ZXIgQy4zIGNvbXBhdGliaWxpdHk6CisJICBJbiBjYXNlIGp1c3QgYSBzaW5nbGUgc3RyZWFtIGlzIHNwZWNpZmllZCBpbiBTRFAgYW5kIHRoZSBjb250cm9sIGF0dHJpYnV0ZQorCSAgaXMgbWlzc2luZyBkbyBub3QgZHJvcCB0aGUgc3RyZWFtIGJ1dCByYXRoZXIgYXNzdW1lICJhPWNvbnRyb2w6KiIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzA1NjgKKworMjAxNi0xMC0wOCAxODoxMToxNyArMDIwMCAgV2lsbGlhbSBNYW5sZXkgPHdpbGxAd2lsbGlhbW1hbmxleS5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuYzoKKwkgIHY0bDI6IFdhcm4sIGRvbid0IGFzc2VydCBpZiB2NGwgZ2l2ZXMgdXMgYSBidWZmZXIgd2l0aCBhIHRvbyBsYXJnZSBzaXplCisJICBJJ3ZlIHNlZW4gcHJvYmxlbXMgd2hlcmUgdGhlIGBieXRlc3VzZWRgIGZpZWxkIG9mIGB2NGwyX2J1ZmZlcmAgd291bGQgYmUKKwkgIGEgc2lsbHkgbnVtYmVyIGNhdXNpbmcgdGhlIGxhdGVyIGNhbGwgdG86CisJICBnc3RfbWVtb3J5X3Jlc2l6ZSAoZ3JvdXAtPm1lbVtpXSwgMCwgZ3JvdXAtPnBsYW5lc1tpXS5ieXRlc3VzZWQpOworCSAgdG8gcmVzdWx0IGluIHRoaXMgZXJyb3IgdG8gYmUgcHJpbnRlZDoKKwkgIChwdWxzZXZpZGVvOjExKTogR1N0cmVhbWVyLUNSSVRJQ0FMICoqOiBnc3RfbWVtb3J5X3Jlc2l6ZTogYXNzZXJ0aW9uICdzaXplICsgbWVtLT5vZmZzZXQgKyBvZmZzZXQgPD0gbWVtLT5tYXhzaXplJyBmYWlsZWQKKwkgIGJlc2lkZXMgY2F1c2luZyB3aG8ta25vd3Mgd2hhdCBvdGhlciBwcm9ibGVtcy4KKwkgIFdlIG1ha2UgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGJ1ZmZlciBoYXMgc3RpbGwgYmVlbiBkZXF1ZXVlZCBjb3JyZWN0bHkKKwkgIHNvIGp1c3QgY2xhbXAgdG8gYSB2YWxpZCBzaXplIHNvIGRvd25zdHJlYW0gZWxlbWVudHMgd29uJ3QgZW5kIHVwIGluCisJICB1bmRlZmluZWQgYmVoYXZpb3VyLgorCSAgVGhlIGludmFsaWQgYHY0bDJfYnVmZmVyYCBJIHNhdyBmcm9tIG15IGNhcHR1cmUgZGV2aWNlIHdhczoKKwkgIGJ1ZmZlciA9IHsKKwkgIGluZGV4ID0gMCwKKwkgIHR5cGUgPSAxLAorCSAgYnl0ZXN1c2VkID0gNTM0NzQ4OTI4LCAvLyA8LSBJbnZhbGlkCisJICBmbGFncyA9IDgyNjAsIC8vIFY0TDJfQlVGX0ZMQUdfVElNRVNUQU1QX01PTk9UT05JQyB8IFY0TDJfQlVGX0ZMQUdfRVJST1IgfCBWNEwyX0JVRl9GTEFHX0RPTkUKKwkgIGZpZWxkID0gMDEzMzAsIC8vIDwtIEludmFsaWQKKwkgIHRpbWVzdGFtcCA9IHsKKwkgIHR2X3NlYyA9IDAsCisJICB0dl91c2VjID0gMAorCSAgfSwKKwkgIHRpbWVjb2RlID0geworCSAgdHlwZSA9IDAsCisJICBmbGFncyA9IDAsCisJICBmcmFtZXMgPSAwICdcMDAwJywKKwkgIHNlY29uZHMgPSAwICdcMDAwJywKKwkgIG1pbnV0ZXMgPSAwICdcMDAwJywKKwkgIGhvdXJzID0gMCAnXDAwMCcsCisJICB1c2VyYml0cyA9ICJcMDAwXDAwMFwwMDAiCisJICB9LAorCSAgc2VxdWVuY2UgPSAwLAorCSAgbWVtb3J5ID0gMiwKKwkgIG0gPSB7CisJICBvZmZzZXQgPSAzNTM3MjE5NTg0LAorCSAgdXNlcnB0ciA9IDE0MDcwNjY2NTgzNjU0NCwgLy8gQ291bGQgYmUgbm9uc2Vuc2UsIG5vdCBzdXJlCisJICBwbGFuZXMgPSAweDdmZjhkMmQ1YjAwMCwKKwkgIGZkID0gLTc1Nzc0NzcxMgorCSAgfSwKKwkgIGxlbmd0aCA9IDI3NjQ4MDAsCisJICByZXNlcnZlZDIgPSAwLAorCSAgcmVzZXJ2ZWQgPSAwCisJICB9CisJICBUaGlzIGlzIGZyb20gZ2RiIHdpdGggbXkgb3duIGFubm90YXRpb25zIGFkZGVkLgorCSAgVGhpcyB3YXMgd2l0aCBnc3QtcGx1Z2lucy1nb29kIDEuOC4xLCBhIE1hZ2V3ZWxsIFhJMTAwRFVTQi1IRE1JIHZpZGVvCisJICBjYXB0dXJlIGRldmljZSBhbmQga2VybmVsIDMuMTMgdXNpbmcgYSBkb2RneSBIRE1JIGNhYmxlIHdoaWNoIGlzIGdyZWF0IGF0CisJICBicmVha2luZyBIRE1JIGNhcHR1cmUgZGV2aWNlcy4gIEknbSB1c2luZyBpby1tb2RlPXVzZXJwdHIgYW5kIGhhdmUgYnVpbHQKKwkgIGdzdC1wbHVnaW5zLWdvb2Qgd2l0aG91dCBsaWJ2NGwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5NzY1CisKKzIwMTYtMTAtMjAgMjA6NDE6MDcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBVc2UgYSBiZXR0ZXIgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIG1vdmllIGhlYWRlciB0aW1lc2NhbGUKKwkgIFRha2UgdGhlIG1heGltdW0gdmlkZW8gdGltZXNjYWxlLCBvciBpZiBubyB2aWRlbyB0cmFjayBpcyBwcmVzZW50IHRoZQorCSAgcHJldmlvdXMgdmFsdWUgb2YgMTgwMC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjkwNDEKKworMjAxNi0xMC0yMCAyMDowNzoxOSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IEJlIG1vcmUgY2xldmVyIHdpdGggdGhlIGRlZmF1bHQgdmlkZW8gdHJhY2sgdGltZXNjYWxlCisJICBVc2UgdGhlIG51bWJlciBvZiBtaWxsaWZyYW1lcyBwZXIgc2Vjb25kIGZvciBpbnRlZ3JhbCBhbmQgZHJvcC1mcmFtZQorCSAgZnJhbWVyYXRlcywgYXMgc3VnZ2VzdGVkIGJ5IHRoZSBRVCBmaWxlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGFuZCBvdGhlcgorCSAgcGxhY2VzLiBXZSBhbHJlYWR5IGRpZCB0aGF0IGZvciBpbnRlZ3JhbCBmcmFtZXJhdGVzIGJlZm9yZSwgYnV0IG5vdCBmb3IKKwkgIGRyb3AtZnJhbWUgZnJhbWVyYXRlcy4gVGhpcyBub3cga2VlcHMgcHJlY2lzaW9uIGJldHRlci4KKwkgIEZvciBhbGwgb3RoZXIgZnJhbWVyYXRlcywgY2hlY2sgaWYgaXQncyBjbG9zZSB0byBhIHdlbGwta25vd24gZnJhbWVyYXRlCisJICBhbmQgdXNlIHRoYXQgaW5zdGVhZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjkwNDEKKworMjAxNi0xMC0xMCAxMzowMDowMSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZXh0cmFjdCBpbnRlcmxhY2VkIGluZm9ybWF0aW9uIGZyb20ganBlZyB2aWRlbworCSAgVGhpcyBpbmZvcm1hdGlvbiBpcyBoaWRkZW4gaW4gYSBzbWFsbCBjaHVuayBvZiBkYXRhLgorCSAgRm9ybWF0IGZvdW5kIGF0IGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9zdGFuZGFyZHMvcXRmZi0yMDAxLnBkZiwKKwkgIHBhZ2UgOTIsICJWaWRlbyBTYW1wbGUgRGVzY3JpcHRpb24iLCB1bmRlciB0YWJsZSAzLjEuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY3NzcxCisKKzIwMTYtMTAtMjYgMTI6NDY6MjggKzA1MzAgIEphZ2FkaXNoIDxqYWdhZGlzaGthbWF0aGtAZ21haWwuY29tPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmM6CisJICBnZGtwaXhidWZvdmVybGF5OiBGaXhpbmcgeCBhbmQgeSBvZmZzZXQgY29tcHV0YXRpb24KKwkgIFdoaWxlIGNvbXB1dGluZyB0aGUgeCBhbmQgeSBvZmZzZXRzLCBpdCdzIHRoZSB2aWRlbyByZXNvbHV0aW9uIGFuZAorCSAgcmVzaXplZCBvdmVybGF5IHJlc29sdXRpb24gdG8gYmUgdXNlZCBpbnN0ZWFkIG9mIGFjdHVhbCBvdmVybGF5IGltYWdlCisJICByZXNvbHR1aW9uLiBEdWUgdG8gdGhpcywgdGhlIG92ZXJsYXkgaW1hZ2UgdXNlZCB0byBnZXQgd3JvbmdseSBvdmVybGF5ZWQKKwkgIGluIHVuZGVzaXJlZCBsb2NhdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NzI5MgorCisyMDE2LTExLTAxIDE4OjA5OjAwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBtZXNvbi5idWlsZDoKKwkgIG1lc29uOiB1cGRhdGUgdmVyc2lvbgorCisyMDE2LTEwLTI0IDE2OjU2OjMxICswMDAwICBFbnJpcXVlIE9jYcOxYSBHb256w6FsZXogPGVvY2FuaGFAaWdhbGlhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBVc2UgdGhlIHRmZHQgZGVjb2RlIHRpbWUgb24gYnl0ZSBzdHJlYW1zIHdoZW4gaXQncyBzaWduaWZpY2FudGx5IGRpZmZlcmVudCB0aGFuIHRoZSB0aW1lIGluIHRoZSBsYXN0IHNhbXBsZQorCSAgV2UgY29uc2lkZXIgdGhlcmUncyBhIHNpZm5pZmljYW50IGRpZmZlcmVuY2Ugd2hlbiBpdCdzIGxhcmdlciB0aGFuIG9uIHNlY29uZAorCSAgb3IgdGhhbiBoYWxmIHRoZSBkdXJhdGlvbiBvZiB0aGUgbGFzdCBwcm9jZXNzZWQgZnJhZ21lbnQgaW4gY2FzZSB0aGUgbGF0dGVyIGlzCisJICBsYXJnZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU0MjMwCisKKz09PSByZWxlYXNlIDEuMTEuMCA9PT0KKworMjAxNi0xMS0wMSAxODo1MzoxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjEwLjAgPT09CisKKzIwMTYtMTEtMDEgMTc6NTc6NDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjEwLjAKKworMjAxNi0xMS0wMSAxNzo0NzozMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxNi0xMS0wMSAxNzo0MTo1MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vZWwucG86CisJICBwbzogVXBkYXRlIHRyYW5zbGF0aW9ucworCisyMDE2LTEwLTI3IDEyOjAxOjU1ICswMjAwICBUb2JpYXMgU2NobmVpZGVyIDx0b2JpYXMuc2NobmVpZGVyQHZvaWNlaW50ZXJjb25uZWN0LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBmaXggZXh0cmEtY29udHJvbHMgbGVhaworCSAgR3N0IHN0cnVjdCB2NGwyb2JqZWN0LT5leHRyYV9jb250cm9scyBpcyBjcmVhdGVkIGlmIHVzZXIgc2V0cyBhcHByb3ByaWF0ZQorCSAgb3B0aW9uIGJ1dCBpdCBpcyBub3QgZnJlZWQgb24gZGVzdHJ1Y3Rpb24gb2YgdjRsMm9iamVjdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzM1ODAKKworMjAxNi0xMC0zMSAxODowMDowNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmg6CisJICBSZXZlcnQgInNvdXBodHRwc3JjOiByZWR1Y2UgcmVhZGluZyBsYXRlbmN5IGJ5IHVzaW5nIG5vbi1ibG9ja2luZyByZWFkIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCA4ODE2NzY0MTEyNDA4NzY2ODg5YzhiNjgwYTNhZjUxMTE1ZGY0YmY1LgorCSAgSXQgY2F1c2VzIGlzc3VlcyB3aXRoIHRoZSB0aW1lb3V0cywgYW5kIGNhdXNlcyBjb25uZWN0aW9ucyB0byBiZSBjbG9zZWQKKwkgIHdpdGhvdXQgYWN0dWFsIHJlYXNvbi4gTmVlZHMgZnVydGhlciBpbnZlc3RpZ2F0aW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MzUwOQorCisyMDE2LTEwLTMxIDA5OjAwOjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBEb24ndCB0cnkgdG8gYWRkIHNyY3BhZCBpZiB3ZSBkb24ndCBrbm93IHZhbGlkIGNhcHMgeWV0CisJICBPdGhlcndpc2Ugd2UnbGwgcnVuIGludG8gYW4gYXNzZXJ0aW9uIG9uIHNwZWNpYWxseSBjcmFmdGVkIGZpbGVzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MzY0MworCisyMDE2LTEwLTI3IDExOjIzOjUxICswNTMwICBOaXJiaGVlayBDaGF1aGFuIDxuaXJiaGVla0BjZW50cmljdWxhci5jb20+CisKKwkqIG1lc29uLmJ1aWxkOgorCSAgbWVzb246IFJlbW92ZSB1c2VsZXNzbHkgZHVwbGljYXRlZCBkZXAgY2hlY2tzCisJICBUaGVzZSBjaGVja3MgYXJlIGRvbmUgaW5zaWRlIHRoZSBtZXNvbi5idWlsZCBmaWxlcyBmb3IgZWFjaCBwbHVnaW4uCisKKzIwMTYtMTAtMjcgMTE6MjI6NTkgKzA1MzAgIE5pcmJoZWVrIENoYXVoYW4gPG5pcmJoZWVrQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L21lc29uLmJ1aWxkOgorCSAgbWVzb246IGR2IHBsdWdpbiBub3cgd29ya3Mgb24gTVNWQworCSAgTmVlZHMgYSBNZXNvbiBwYXRjaCB0byBmaWx0ZXIgb3V0IHRoZSB1c2VsZXNzIC1scHRocmVhZAorCSAgaHR0cHM6Ly9naXRodWIuY29tL21lc29uYnVpbGQvbWVzb24vcHVsbC85NjIKKworMjAxNi0xMC0yNyAxNDowMzo0OCArMDIwMCAgQnJhbmtvIFN1YmFzaWMgPGJyYW5rb0BheGlzLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGFsbG93IHJlc29sdXRpb25zIGFib3ZlIDQwOTYKKwkgIE1vZGlmeSB0aGUgY2FwcyBzdHJpbmcgdG8gYWxsb3cgd2lkdGggYW5kIGhlaWdodCBncmVhdGVyIHRoYW4gNDA5Ni4KKwkgIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmVzdHJpY3QgaXQgc2luY2UgdGhlIG1hdHJvc2thIGZvcm1hdCBhbGxvd3MgdGhlCisJICB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcyB0byBiZSB1cCB0byBlaWdodCBieXRlcyBsb25nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MzU4MgorCisyMDE2LTEwLTIzIDE3OjIzOjEwIC0wNzAwICBTY290dCBEIFBoaWxsaXBzIDxzY290dC5kLnBoaWxsaXBzQGludGVsLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogQ2hlY2sgZm9yIEdfUExBVEZPUk1fV0lOMzIgZm9yIHByZXNlbmNlIG9mIGlwaV9zcGVjX2Rlc3QKKwkgIEdfT1NfV0lOMzIgaXMgb25seSBzZXQgd2hlbiBub3QgYnVpbGRpbmcgd2l0aCBjeWd3aW4sIGJ1dAorCSAgaXBpX3NwZWNfZGVzdCBpcyBtaXNzaW5nIGJvdGggd2l0aCBhbmQgd2l0aG91dCBjeWd3aW4uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczMTE0CisKKzIwMTYtMTAtMjYgMDg6NTE6NDAgKzAyMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IHJlc2V0IHJlYWRfcG9zaXRpb24gd2hlbiByZWFkaW5nIGZhaWxzCisJICBzb3VwaHR0cHNyYyBtYWludGFpbnMgdHdvIHZhcmlhYmxlcyBmb3IgdGhlIHBvc2l0aW9uOgorCSAgKiAncmVxdWVzdF9wb3NpdGlvbicgaXMgd2hlcmUgd2Ugd2FudCB0byBiZQorCSAgKiAncmVhZF9wb3NpdGlvbicgaXMgd2hlcmUgd2UgYXJlCisJICBEdXJpbmcgTm9ybWFsIG9wZXJhdGlvbnMgYm90aCBhcmUgdXBkYXRlZCBpbiBzeW5jIHdoZW4gZGF0YSBhcnJpdmVzLiBBIHNlZWsKKwkgIGNoYW5nZXMgJ3JlcXVlc3RfcG9zaXRpb24nIGJ1dCBub3QgJ3JlYWRfcG9zaXRpb24nLgorCSAgV2hlbiB0aGUgdHdvIHBvc2l0aW9ucyBnZXQgb3V0IG9mIHN5bmMsIHRoZW4gYSBuZXcgcmVxdWVzdCBpcyBzZW5kIGFuZCB0aGUKKwkgICdSYW5nZScgaGVhZGVyIGlzIGFkanVzdGVkIHRvIHRoZSBjdXJyZW50ICdyZXF1ZXN0X3Bvc2l0aW9uJy4KKwkgIFdpdGhvdXQgdGhpcyBwYXRjaCwgaWYgcmVhZGluZyBmYWlscywgdGhlbiB0aGUgc291cmNlIGlzIGRlc3Ryb3llZC4gVGhpcworCSAgdHJpZ2dlcnMgYSBuZXcgcmVxdWVzdCwgYnV0IHRoZSByYW5nZSByZW1haW5zIHVuY2hhbmdlZC4gQXMgYSByZXN1bHQsIHRoZQorCSAgb2xkIHJhbmdlIGlzIHVzZWQgYW5kIG9sZCBkYXRhIHdpbGwgYmUgcmVhZC4KKwkgIENoYW5naW5nIHRoZSAncmVhZF9wb3NpdGlvbicgdG8gLTEgbWFrZXMgaXQgZXhwbGljaXRseSBkaWZmZXJlbnQgZnJvbQorCSAgJ3JlcXVlc3RfcG9zaXRpb24nIGFuZCBhcyBhIHJlc3VsdCB0aGUgJ1JhbmdlJyBoZWFkZXIgaXMgdXBkYXRlZCBjb3JyZWN0bHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczNTA5CisKKzIwMTYtMTAtMjUgMDg6NTQ6MzQgLTA3MDAgIFNjb3R0IEQgUGhpbGxpcHMgPHNjb3R0LmQucGhpbGxpcHNAaW50ZWwuY29tPgorCisJKiBtZXNvbi5idWlsZDoKKwkgIG1lc29uOiBEb24ndCBkZXBlbmQgb24gZ3N0cmVhbWVyLWNoZWNrLTEuMCBvbiB3aW5kb3dzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczMTE0CisKKzIwMTYtMTAtMjUgMTU6MjQ6MjAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcmVzZXQgY29ubmVjdGlvbiBpbmZvIHRvIG5vbi1mbHVzaGluZyB3aGVuIGNsb3NpbmcKKwkgIFRoaXMgc29sdmVzIGEgaGFuZ2luZyBtYWlubG9vcCBpbiBmb2xsb3dpbmcgc2NlbmFyaW86CisJICAqIGNvbm5lY3QgdG8gc291cmNlCisJICAqIG5ldHdvcmsvc2VydmVyIGRyb3BzCisJICAqIHBpcGVsaW5lIHNldCB0byBOVUxMIChhbmQgY29ubmVjdGlvbiB0byBmbHVzaGluZyBhcyBwYXJ0KQorCSAgKiBwaXBlbGluZSBzZXQgdG8gUEFVU0VEL1BMQVlJTkcgKGNvbm5lY3Rpb24gdG8gbm9uLWZsdXNoaW5nLCBidXQgbm90IHJlY29yZGVkKQorCSAgKiBbY29ubmVjdGluZyBzdGlsbCBub3QgcG9zc2libGVdCisJICAqIHBpcGVsaW5lIHNldCB0byBOVUxMID0+IG1haW5sb29wIGhhbmdzIChzaW5jZSBubyBhY3R1YWwgZmx1c2hpbmcgaXMgZG9uZSkKKworMjAxNi0xMC0yNiAxNDozMjo0OCArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSAgc3BsaXRtdXhzaW5rOiBPbmx5IGFsbG93IG9uZSB2aWRlbyByZXF1ZXN0IHBhZAorCSAgVGhlIHBhY2luZyBvZiB0aGUgb3ZlcmFsbCBtdXhpbmcgaXMgY29udHJvbGxlZAorCSAgYnkgdGhlIHZpZGVvIEdPUHMgYXJyaXZpbmcsIHNvIHdlIGNhbiBvbmx5IGhhbmRsZQorCSAgMSB2aWRlbyBzdHJlYW0sIGFuZCB0aGUgcmVxdWVzdCBwYWQgaXMgbmFtZWQgYWNjb3JkaW5nbHkuCisJICBJZ25vcmUgYSByZXF1ZXN0IGZvciBhIDJuZCB2aWRlbyBwYWQgaWYgdGhlcmUncyBhbHJlYWR5CisJICBhbiBhY3RpdmUgb25lLgorCisyMDE2LTEwLTI2IDExOjU5OjMyICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkgIHNwbGl0bXV4c2luazogVGFrZSBvd25lcnNoaXAgb2YgZmxvYXRpbmcgcmVmcworCSAgc2luayB0aGUgZmxvYXRpbmcgcmVmIHdoZW4gaGFuZGVkIGEgbXV4ZXIgb3Igc2luayB0byB1c2Ugc28KKwkgIHdlIGNsZWFybHkgdGFrZSBvd25lcnNoaXAuCisKKzIwMTYtMTAtMjUgMTQ6NTE6NTIgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXhzaW5rOiBTZXQgY2hpbGQgZWxlbWVudHMgdG8gTlVMTCB3aGVuIHJlbW92aW5nLgorCSAgTWFrZSBzdXJlIHRoYXQgZWxlbWVudHMgYXJlIGluIHRoZSBOVUxMIHN0YXRlIHdoZW4gcmVtb3ZpbmcuCisJICBGaXhlcyBjcml0aWNhbCB3YXJuaW5ncyB3aGVuIGVycm9ycyBvY2N1ciBlYXJseSBvbiBpbiBzdGFydGluZyB1cC4KKworMjAxNi0xMC0yNSAxNDo1MDo1MyArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IFNldCBwYWQgdGVtcGxhdGUgb24gcmVxdWVzdCBzaW5rIHBhZHMKKwkgIEVuc3VyZSB0aGF0IHRoZSBnaG9zdCBwYWQgcmV0dXJuZWQgYXMgYSByZXF1ZXN0IHBhZAorCSAgaGFzIHRoZSB0ZW1wbGF0ZSB0aGF0IHdhcyByZXF1ZXN0ZWQKKworMjAxNi0xMC0yNSAxMDo1MDo0NyArMDUzMCAgTmlyYmhlZWsgQ2hhdWhhbiA8bmlyYmhlZWtAY2VudHJpY3VsYXIuY29tPgorCisJKiBtZXNvbi5idWlsZDoKKwkqIHRlc3RzL2NoZWNrL21lc29uLmJ1aWxkOgorCSAgUmV2ZXJ0ICJtZXNvbjogbW92ZSBnc3RyZWFtZXItY2hlY2stMS4wIGRlcGVuZGVuY3kgdG8gdGVzdHMvY2hlY2siCisJICBUaGlzIHJldmVydHMgY29tbWl0IDQ2NjMyNjk0NjYyYjk2ZmRkYjg0OGExZjIwOTFhMjE1YjI4YTJkMzUuCisJICBEb2VzIG5vdCBhY3R1YWxseSB3b3JrLiBTZWU6CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczMTE0I2MzMQorCisyMDE2LTA2LTA4IDExOjI0OjM3IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IEFzc3VtZSBQVFMgaXMgRFRTIHdoZW4gUFRTIGlzIG1pc3NpbmcKKwkgIFRoaXMgZml4ZXMgaXNzdWUgZm9yIGVuY29kZXJzIHRoYXQgb25seSBzZXRzIHRoZSBEVFMuIFdlIGFzc3VtZSB0aGF0CisJICB0aGVyZSB3YXMgbm8gcmUtb3JkZXJpbmcgd2hlbiB0aGF0IGhhcHBlbnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyMjA3CisKKzIwMTYtMTAtMjQgMDA6MzQ6MTUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL21lc29uLmJ1aWxkOgorCSAgbWVzb246IGZpeCBidWlsZCBvdXRzaWRlIG9mIGdzdC1hbGwKKworMjAxNi0xMC0yMSAwMDo0Mjo1NCAtMDcwMCAgU2NvdHQgRCBQaGlsbGlwcyA8c2NvdHQuZC5waGlsbGlwc0BpbnRlbC5jb20+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9tZXNvbi5idWlsZDoKKwkgIG1lc29uOiBkaXJlY3Rzb3VuZDogQWRkIG9sZTMyIGxpYnJhcnkgZGVwZW5kZW5jeQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MzExNAorCisyMDE2LTEwLTIxIDAwOjQyOjE4IC0wNzAwICBTY290dCBEIFBoaWxsaXBzIDxzY290dC5kLnBoaWxsaXBzQGludGVsLmNvbT4KKworCSogbWVzb24uYnVpbGQ6CisJKiB0ZXN0cy9jaGVjay9tZXNvbi5idWlsZDoKKwkgIG1lc29uOiBtb3ZlIGdzdHJlYW1lci1jaGVjay0xLjAgZGVwZW5kZW5jeSB0byB0ZXN0cy9jaGVjaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MzExNAorCisyMDE2LTEwLTIwIDIyOjA4OjE0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb21peGVyLmM6CisJICB0ZXN0czogdmlkZW9taXhlcjogZGlzYWJsZSByYWN5IGZsdXNoX3N0YXJ0X2ZsdXNoX3N0b3AgdGVzdAorCSAgSXQncyBiZWVuIGJyb2tlbiBmb3IgeWVhcnMsIGFuZCBpdCdzIHVubGlrZWx5IGl0IHdpbGwgZXZlcgorCSAgYmUgZml4ZWQgZm9yIGNvbGxlY3RwYWRzL3ZpZGVvbWl4ZXIgbm93IHRoYXQgdGhlcmUncyBjb21wb3NpdG9yCisJICB3aGljaCB3b3JrcyBmaW5lLiBTbyBsZXQncyBkaXNhYmxlIGl0LCBzaW5jZSBhbGwgaXQgZG9lcworCSAgaXMgdGhhdCBpdCBjcmVhdGVzIG5vaXNlIHRoYXQgZGlzdHJhY3RzIGZyb20gb3RoZXIgZmFpbHVyZXMuCisJICBBbHNvIHNlZSB0aGUgY29ycmVzcG9uZGluZyBhZGRlciBidWcgYXMgaXQgZmFpbGVkIGluIHRoZSBzYW1lIHdheToKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDg4OTEKKworMjAxNi0xMC0wOSAxNjo1NjoxMCArMDIwMCAgSmFuIEFsZXhhbmRlciBTdGVmZmVucyAoaGVmdGlnKSA8amFuLnN0ZWZmZW5zQGdtYWlsLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkgIHRlc3RzOiBGaXggc291cGh0dHBzcmMgdGVzdHMgd2l0aG91dCBDS19GT1JLPW5vCisJICBJdCBzZWVtcyB0aGF0IHRoZSBmb3JrZWQgcHJvY2Vzc2VzIGFsbCBhdHRlbXB0IHRvIGhhbmRsZSB0aGUgbGlzdGVuaW5nCisJICBzb2NrZXQgZnJvbSB0aGUgc2VydmVyLCBhbmQgb25seSBvbmUgaGFzIHRvIHNodXRkb3duIHRoZSBzb2NrZXQgdG8gYnJlYWsKKwkgIHRoZSBzZXJ2ZXIgY29tcGxldGVseS4KKwkgIENyZWF0ZSBhIG5ldyBzZXJ2ZXIgaW5zaWRlIGVhY2ggdGVzdCB0byBhdm9pZCB0aGlzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MjY1NgorCisyMDE2LTEwLTA5IDE1OjIzOjUxICswMjAwICBKYW4gQWxleGFuZGVyIFN0ZWZmZW5zIChoZWZ0aWcpIDxqYW4uc3RlZmZlbnNAZ21haWwuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgdGVzdHM6IEZpeCBsZXZlbCB0ZXN0IGluIENLX0ZPUks9bm8gbW9kZQorCSAgVGhlIHRlc3RzIGFjY3VtdWxhdGUgYnVmZmVycyBpbiBHc3RDaGVjaydzIGJ1ZmZlcnMgbGlzdCwgYW5kIHRoZSBsaXN0IGlzCisJICBub3QgKGNvbnNpc3RlbnRseSkgcmVzZXQgYmV0d2VlbiB0ZXN0cy4gRG8gdGhhdCBhbmQgcmVtb3ZlIHRoZSBub3cKKwkgIGNvbmZsaWN0aW5nIHVucmVmcyBmb3Igb3V0YnVmZmVycy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzI2NDQKKworMjAxNi0xMC0wNyAxMzowNDoyNyArMDUzMCAgR2F1cmF2IEd1cHRhIDxnLmd1cHRhQHNhbXN1bmcuY29tPgorCisJKiBzeXMvd2F2ZWZvcm0vZ3N0d2F2ZWZvcm1zaW5rLmM6CisJICB3YXZlZm9ybXNpbms6IEZpeCBNZW1vcnkgbGVhayB1c2luZyBHU1RfUFRSX0ZPUk1BVAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MjQ5NworCisyMDE2LTEwLTE4IDEyOjIzOjQyICswNTMwICBOaXJiaGVlayBDaGF1aGFuIDxuaXJiaGVla0BjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tb25vc2NvcGUvbWVzb24uYnVpbGQ6CisJICBtZXNvbjogQWRkIG1pc3NpbmcgZ3N0YXVkaW8gZGVwIHRvIG1vbm9zY29wZQorCSAgSW4gZmlsZSBpbmNsdWRlZCBmcm9tIC4uL3N1YnByb2plY3RzL2dzdC1wbHVnaW5zLWdvb2QvZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYzo0MjowOgorCSAgLi4vc3VicHJvamVjdHMvZ3N0LXBsdWdpbnMtYmFzZS9nc3QtbGlicy9nc3QvYXVkaW8vYXVkaW8uaDoyNjozOTogZmF0YWwgZXJyb3I6IGdzdC9hdWRpby9hdWRpby1lbnVtdHlwZXMuaDogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorCSAgI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby1lbnVtdHlwZXMuaD4KKwkgIF4KKwkgIGNvbXBpbGF0aW9uIHRlcm1pbmF0ZWQuCisJICBodHRwczovL2NpLmdzdHJlYW1lci5uZXQvam9iL0dTdHJlYW1lci1tYXN0ZXItbWVzb24vMjcxL2NvbnNvbGUKKworMjAxNi0xMC0xNiAwMjoxODoyMiArMDUzMCAgTmlyYmhlZWsgQ2hhdWhhbiA8bmlyYmhlZWtAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL21lc29uLmJ1aWxkOgorCSAgbWVzb246IEFkZCBtaXNzaW5nIHBidXRpbHMgZGVwZW5kZW5jeSB0byBtdWx0aWZpbGUKKwkgIEZvdW5kIHZpYSB0aGUgSmVua2lucyBDSToKKwkgIEZBSUxFRDogc3VicHJvamVjdHMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZUBzaGEvZ3N0c3BsaXRtdXhzaW5rLmMubworCSAgWy4uLl0KKwkgIEluIGZpbGUgaW5jbHVkZWQgZnJvbSAuLi9zdWJwcm9qZWN0cy9nc3QtcGx1Z2lucy1nb29kL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmg6MjQ6MCwKKwkgIGZyb20gLi4vc3VicHJvamVjdHMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOjU5OgorCSAgLi4vc3VicHJvamVjdHMvZ3N0LXBsdWdpbnMtYmFzZS9nc3QtbGlicy9nc3QvcGJ1dGlscy9wYnV0aWxzLmg6MzA6NDM6IGZhdGFsIGVycm9yOiBnc3QvcGJ1dGlscy9wYnV0aWxzLWVudW10eXBlcy5oOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisJICAjaW5jbHVkZSA8Z3N0L3BidXRpbHMvcGJ1dGlscy1lbnVtdHlwZXMuaD4KKwkgIF4KKwkgIGNvbXBpbGF0aW9uIHRlcm1pbmF0ZWQuCisJICBodHRwczovL2NpLmdzdHJlYW1lci5uZXQvam9iL0dTdHJlYW1lci1tYXN0ZXItbWVzb24vMjYzL2NvbnNvbGUKKworMjAxNi0xMC0xNSAyMjoxMTowOCArMDUzMCAgTmlyYmhlZWsgQ2hhdWhhbiA8bmlyYmhlZWtAY2VudHJpY3VsYXIuY29tPgorCisJKiBtZXNvbi5idWlsZDoKKwkgIG1lc29uOiBEb24ndCBzZXQgY19zdGQgdG8gZ251OTkKKwkgIFVzZSB0aGUgZGVmYXVsdCBmb3IgZWFjaCBjb21waWxlciBvbiBldmVyeSBwbGF0Zm9ybSBpbnN0ZWFkLiBUaGlzCisJICBpbXByb3ZlcyBvdXIgY29tcGF0aWJpbGl0eSB3aXRoIGNvbXBpbGVycyB0aGF0IGRvbid0IGhhdmUgZ251OTkgYXMKKwkgIGEgY19zdGQuCisKKzIwMTYtMTAtMDQgMTg6MDQ6MTEgLTAzMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAb3NnLnNhbXN1bmcuY29tPgorCisJKiBtZXNvbi5idWlsZDoKKwkqIHRlc3RzL2NoZWNrL2dldHBsdWdpbnNkaXI6CisJKiB0ZXN0cy9jaGVjay9tZXNvbi5idWlsZDoKKwkgIG1lc29uOiBNYWtlIHVzZSBvZiBuZXcgZW52aXJvbm1lbnQgb2JqZWN0IGFuZCBzZXQgcGx1Z2luIHBhdGggdG8gYnVpbGRkaXIKKwkgIFdvcmthcm91bmQgc291cmNlX3Jvb3QgYmVpbmcgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIGFsbCBwcm9qZWN0cyBpbiB0aGUgc3VicHJvamVjdAorCSAgY2FzZSBhbmQgcmVtb3ZlIG5vdyB1bm5lZWRlZCBnZXRwbHVnaW5zZGlyCisJICBCdW1wIG1lc29uIHJlcXVpcmVtZW50IHRvIDAuMzUKKworMjAxNi0xMC0wNiAxMToxNTo1NCArMDUzMCAgR2F1cmF2IEd1cHRhIDxnLmd1cHRhQHNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LXJ0cGF1eC5jOgorCSAgdGVzdHM6IEZpeCBtZW1vcnkgbGVhayBpbiB0ZXN0IHJ0cGF1eCB0ZXN0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcyNDk2CisKKzIwMTYtMTAtMDMgMTE6Mjc6NTQgKzA1MzAgIE5pcmJoZWVrIENoYXVoYW4gPG5pcmJoZWVrQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogRm9yd2FyZCBsYXRlbmN5IHF1ZXJpZXMgdG8gdXBzdHJlYW0KKwkgIFdpdGhvdXQgdGhpcywgbGF0ZW5jeSBxdWVyaWVzIHRvIGltYWdlZnJlZXplIHdpbGwgZmFpbC4KKworMjAxNi0wOS0zMCAxMTozNTozOSAtMDMwMCAgVGhpYmF1bHQgU2F1bmllciA8dGhpYmF1bHQuc2F1bmllckBvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGhvb2tzL3ByZS1jb21taXQuaG9vazoKKwkqIG1lc29uLmJ1aWxkOgorCSogdGVzdHMvY2hlY2svZ2V0cGx1Z2luc2RpcjoKKwkgIG1lc29uOiBTZXR1cCBwcmUgY29tbWl0IGhvb2sgYW5kIGZpeCBnZXRwbHVnaW5zZGlyIGZvciBzdGFuZGFsb25lIGNhc2UKKworMjAxNi0wOS0yOSAwNDo1NToxNCArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYzoKKwkgIHNwbGl0bXV4c3JjOiBIYW5kbGUgc3RvcCBwb2ludCBmcm9tIHNlZ21lbnQKKwkgIElmIHRoZSBzZWVrIHN0b3AgcG9pbnQgKG9yIHN0YXJ0LCBkdXJpbmcgcmV2ZXJzZSBwbGF5KQorCSAgd2FzIHdpdGhpbiB0aGUgc2VnbWVudCB3ZSBqdXN0IGZpbmlzaGVkLCBnbyBFT1MgaW1tZWRpYXRlbHkKKwkgIGluc3RlYWQgb2YgcHJvY2VlZGluZyB0aHJvdWdoIGFsbCBvdGhlciBwYXJ0cyBhbmQgc2VuZGluZworCSAgMCBsZW5ndGggc2Vla3MgdG8gdGhlbS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzIxMzgKKworMjAxNi0wOS0yOSAwMzoyMToyNiArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYzoKKwkgIHNwbGl0bXV4c3JjOiBEcm9wIGxvY2sgc2h1dHRpbmcgZG93biBwYWRzCisJICBBdm9pZCBhIHNwb3JhZGljIGRlYWRsb2NrIG9uIHNodXRkb3duIGJ5IGRyb3BwaW5nCisJICB0aGUgc3BsaXRtdXggbG9jayBhcm91bmQgcGFkIHNodXRkb3duCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcyMTM4CisKKzIwMTYtMDktMjkgMDI6NDc6MzYgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4cGFydHJlYWRlci5jOgorCSAgc3BsaXRtdXhzcmM6IEZpeCBleHRyYSB1bnJlZiBoYW5kbGluZyBxdWVyaWVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcyMTM4CisKKzIwMTYtMDktMjkgMDQ6NTA6MjUgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4cGFydHJlYWRlci5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuaDoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYzoKKwkgIHNwbGl0bXV4c3JjOiBBdm9pZCBzdGFsbCB3aGVuIHBhcnRzIGdldCBvdXQgb2Ygc3luYworCSAgV2hlbiBvbmUgcGFydCBtb3ZlcyBhaGVhZCBvZiB0aGUgb3RoZXJzIC0gZHVlIHRvIGV4Y2Vzc2l2ZQorCSAgZG93bnN0cmVhbSBxdWV1ZWluZywgb3IgcmVhbGx5IHNtYWxsIGlucHV0IGZpbGVzIC0gdGhlbgorCSAgd2UgY2FuIGVuZCB1cCBhY3RpdmF0aW5nIHBhcnRzIG1vcmUgdGhhbiBvbmNlLiBUaGF0IGNhbiBsZWFkIHRvCisJICBlZmZlY3RzIGxpa2Ugc2h1dHRpbmcgZG93biBwYWQgdGFza3MgcHJlbWF0dXJlbHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcyMTM4CisKKzIwMTYtMDktMzAgMTE6NDE6MTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIG1lc29uLmJ1aWxkOgorCSAgbWVzb246IHVwZGF0ZSB2ZXJzaW9uCisKKz09PSByZWxlYXNlIDEuOS45MCA9PT0KKworMjAxNi0wOS0zMCAxMzowMjoxOSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdnB4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDEuOS45MAorCisyMDE2LTA5LTMwIDEyOjE3OjI2ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDE2LTA5LTMwIDExOjQzOjU0ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9lbC5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTYtMDktMzAgMTM6MjI6MzIgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW5Ab3NnLnNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvdGFnc2NoZWNraW5nLmM6CisJICB0ZXN0czogRml4IHRhZ3NjaGVja2luZyBmYWlsdXJlIGR1ZSB0byBtaXNzaW5nIFBUUworCSAgcXRtdXggbm93IG5lZWRzIHRoZSBQVFMgKGNvbW1pdCBhOTkzODgzYjcpLCBzbyBsZXQncyBtYWtlIHN1cmUgd2UKKwkgIHByb2R1Y2Ugb25lIHdpdGggb3VyIGJ1ZmZlcnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcyMjI4CisKKzIwMTYtMDktMjggMjM6MDM6NTggKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBEb24ndCBjYWxjdWxhdGUgUFRTIG9mZnNldCBhbmQgRFRTIHdpdGggR1NUX0NMT0NLX1RJTUVfTk9ORQorCSAgSnVzdCBlcnJvciBvdXQgaWYgdGhlcmUgaXMgbm8gdmFsaWQgUFRTLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MjE0MworCisyMDE2LTA5LTI5IDE3OjM3OjI4ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuYzoKKwkgIHF0ZGVtdXg6IEFkZCBKUEVHMjAwMCBpaGRyIGF0b20gdG8gdGhlIGxpc3Qgb2Yga25vd24gb25lcworCSAgT3RoZXJ3aXNlIHF0ZGVtdXggaXMgYWx3YXlzIGdvaW5nIHRvIGNvbXBsYWluIGFib3V0IGl0IGJlaW5nIHVua25vd24uCisKKzIwMTYtMDktMjkgMTA6MTk6NTYgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBBbHdheXMgd3JpdGUgdGhlIGRlZmF1bHQgZnJhbWUgZHVyYXRpb24gZm9yIFZQOC85IHRvbworCSAgVGhlIFdlYk0gc3BlYyBhbGxvd3MgdGhpcyBub3csIGFuZCBpdCBhbGxvd3MgdXMgdG8gZ3Vlc3MgYSBmcmFtZXJhdGUuCisJICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MjE0MSBhbmQKKwkgIGFsc28gaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1NDM3OQorCisyMDE2LTA5LTI3IDE1OjI2OjE5IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuYzoKKwkgIHJ0cGgyNls0NV1kZXBheTogRG9uJ3QgaGFuZGxlIE5BTHMgaW5zaWRlIFNUQVAgdW5pdHMgdHdpY2UKKwkgIFRoZXkndmUgYWxyZWFkeSBiZWVuIGhhbmRsZWQgYmVmb3JlIHB1c2hpbmcgdGhlbSBpbnRvIHRoZSBhZGFwdGVyLgorCisyMDE2LTA5LTI3IDEyOjM5OjEyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9tZXNvbi5idWlsZDoKKwkgIG1lc29uOiB0ZXN0czogZml4IHZwOCBhdmFpbGFiaWxpdHkgY2hlY2tzCisJICBUaG9zZSB2YXJpYWJsZXMgYXJlIG5vdCBkZWZpbmVkIGlmIHZwOCB3YXMgbm90IGZvdW5kLgorCisyMDE2LTA5LTI3IDEwOjIzOjM4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIFJldmVydCAibXVsdGlmaWxlc2luazogc3RyZWFtbGluZSB0aGUgZmlsZS1zd2l0Y2ggY29kZSBhIGJpdCIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgZjFjZWFhYjAyZjNmNTU3ZTIzYjc3YjE0NzcxYTU3NTc4OGY5MmJiNC4KKwkgIFRoaXMgYnJva2UgYXRvbWljIGZpbGUgd3JpdGVzIGluICJidWZmZXIiIG1vZGUuIEl0IGRpZCBtYWtlCisJICBzdXJlIHRoYXQgYW55IHN0cmVhbWhlYWRlcnMgYXJlIHByZXBlbmRlZCB0byBlYWNoIGZpbGUgaW4KKwkgIGJ1ZmZlciBtb2RlIGFzIHdlbGwsIGJ1dCB0aGF0J3Mgbm90IHJlYWxseSBuZWVkZWQgaW4gcHJhY3RpY2UsCisJICB3aGVyZWFzIGF0b21pYyBmaWxlIHdyaXRlcyBhcmUsIHNvIGxldCdzIHJlc3RvcmUgdGhlIHN0YXR1cworCSAgcXVvIGFudGUgZm9yIG5vdyBzaW5jZSB0aGlzIHdhcyBwcmltYXJpbHkgYSBjb2RlIGNsZWFudXAgYW55d2F5LAorCSAgYW5kIGlmIGFueW9uZSBuZWVkcyB0byBzdHJlYW1oZWFkZXJzIGluIGJ1ZmZlciBtb2RlIHRvbyB0aGV5CisJICBjYW4gbWFrZSBhIHBhdGNoIHRvIGltcGxlbWVudCB0aGF0IGRpZmZlcmVudGx5LiBSZS1pbXBsZW1lbnRpbmcKKwkgIHRoZSBhdG9taWMgd3JpdGVzIGluIHRoZSBlbGVtZW50IGFsc28gc2VlbXMgd2F5IHRvbyBtdWNoIHdvcmsuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY2OTkwCisKKzIwMTYtMDktMjcgMTA6MjI6NTcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgUmV2ZXJ0ICJtdWx0aWZpbGVzaW5rOiBjbG9zZSBmaWxlIG9uIHdyaXRlIGVycm9yIHdpdGggbmV4dC1maWxlIG1vZGUgaXMgc2V0IHRvIGJ1ZmZlciIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgODRlNDQxZDI2ODVjZjIyM2QzNDhhOTViZTBjNWJhNjkzYmJmNjYyNC4KKwkgIFRoaXMgd2lsbCBubyBsb25nZXIgYmUgbmVlZGVkIG9uY2Ugd2UgcmV2ZXJ0IGYxY2VhYWIwMi4KKworMjAxNi0wOS0yNiAxMzoyMjoyOSAtMDMwMCAgVGhpYmF1bHQgU2F1bmllciA8dGhpYmF1bHQuc2F1bmllckBvc2cuc2Ftc3VuZy5jb20+CisKKwkqIHRlc3RzL2NoZWNrL21lc29uLmJ1aWxkOgorCSAgbWVzb246IEFkZCBnc3QtcGx1Z2lucy1iYXNlIHBsdWdpbnMgZGlyZWN0b3JpZXMgdG8gYmUgdXNlZCBieSB0ZXN0cworCisyMDE2LTA5LTI2IDE0OjMwOjAwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdnB4L21lc29uLmJ1aWxkOgorCSogbWVzb24uYnVpbGQ6CisJKiB0ZXN0cy9jaGVjay9nZXRwbHVnaW5zZGlyOgorCSogdGVzdHMvY2hlY2svbWVzb24uYnVpbGQ6CisJICBtZXNvbjogYWRkIHVuaXQgdGVzdHMKKwkgIE9ubHkgd29ya3MgcHJvcGVybHkgaW4gYW4gaW5zdGFsbGVkIHNldHVwIGN1cnJlbnRseSwgbW9zdAorCSAgbGlrZWx5IHdvbid0IHdvcmsgd2l0aCBhIHN1YnByb2plY3RzIHNldHVwIHlldC4KKworMjAxNi0wOS0yNCAwOTozNjoyNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogbWVzb24uYnVpbGQ6CisJKiBwby9tZXNvbi5idWlsZDoKKwkgIG1lc29uOiBob29rIHVwIHRyYW5zbGF0aW9ucworCisyMDE2LTA5LTA4IDE3OjMwOjQxICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuQGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2VzcmM6IERvbid0IG5lZ290aWF0ZSB0byBsZXNzIHRoYW4gdHdvIHNlZ21lbnRzCisJICBHc3RBdWRpb1JpbmdCdWZmZXIgZG9lc24ndCBuZWVkcyB1cyB0byBoYXZlIGF0IGxlYXN0IDIgc2VnbWVudHMuIFdlIG1ha2UKKwkgIHN1cmUgdGhhdCBpZiBvdXIgYnVmZmVyIHBhcmFtZXRlcnMgYXJlIHN1Y2ggdGhhdCB0aGUgbWF4bGVuZ3RoIGlzIG5vdCBhdAorCSAgbGVhc3QgMnggZnJhZ3NpemUsIHdlIHN0aWxsIHJlcXVlc3QgdGhlIHJpbmdidWZmZXIgdG8ga2VlcCB0aGF0IG11Y2gKKwkgIHNwYWNlIHNvIGl0IGNvbnRpbnVlcyB0byB3b3JrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MDQ0NgorCisyMDE2LTA5LTI0IDIzOjIyOjAxICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuQGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5oOgorCSAgcnRwc2JjcGF5OiBGaXggdGltZXN0YW1waW5nCisJICBXZSB3ZXJlIGp1c3QgcGlja2luZyB0aGUgdGltZXN0YW1wIG9mIHRoZSBsYXN0IGJ1ZmZlciBwdXNoZWQgaW50byBvdXIKKwkgIGFkYXB0ZXIgYmVmb3JlIHdlIGhhZCBlbm91Z2ggZGF0YSB0byBwdXNoIG91dC4KKwkgIFRoaXMgZml4ZXMgdGhpbmdzIHRvIGZpZ3VyZSBvdXQgaG93IGxhcmdlIGVhY2ggZnJhbWUgaXMgYW5kIHdoYXQKKwkgIGR1cmF0aW9uIGl0IGNvdmVycywgc28gd2UgY2FuIHNldCBib3RoIHRoZSB0aW1lc3RhbXAgYW5kIGR1cmF0aW9uCisJICBjb3JyZWN0bHkuCisJICBBbHNvIGFkZHMgc29tZSBESVNDT05UIGhhbmRsaW5nLgorCisyMDE2LTA3LTEyIDE4OjE0OjUyICswMjAwICBHZW9yZyBMaXBwaXRzY2ggPGdsaXBwaXRzY2hAdG9vbHNvbmFpci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBGaXggZm91cmNjIGZvciBQcm9SZXMgUHJveHkKKwkgIFRoaXMgaXMgYXBjbywgYWNjb3JkaW5nIHRvCisJICBodHRwczovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9QXBwbGVfUHJvUmVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5MDQ4CisKKzIwMTYtMDktMTggMjA6NTU6MzEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC92cHgvbWVzb24uYnVpbGQ6CisJICBtZXNvbjogZml4IGJ1aWxkIHdpdGggdnB4IDEuMy54CisJICB2cHggPj0gMS40LjAgaXMgb3B0aW9uYWwKKworMjAxNi0wOS0xNSAxODoxOTozNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogVXNlIG5ldyBiaW4gc3VwcHJlc3NlZCBmbGFncyBBUEkgZm9yIG1hbmFnaW5nIHRoZSBlbGVtZW50IGZsYWdzCisKKzIwMTYtMDktMTUgMDk6NTI6MzEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5jOgorCSogZ3N0L3J0cC9kYm9vbGh1ZmYuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkgIGV4dCwgZ3N0OiBmaXggaW5kZW50YXRpb24KKworMjAxNi0wOS0xNSAwOTo1MjoxNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZmx2bXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBoMjYzLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHNlc3Npb24uYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHZwOS5jOgorCSAgdGVzdHM6IGZpeCBpbmRlbnRhdGlvbgorCisyMDE2LTA4LTExIDExOjA0OjIyIC0wNjAwICBUaG9tYXMgQmx1ZW1lbCA8dGJsdWVtZWxAY29udHJvbDQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogRml4IGNhbGN1bGF0aW5nIG5leHRfc2VxbnVtIHdoZW4gZHJvcHBpbmcgb2xkIGJ1ZmZlcnMgZnJvbSBhIGZ1bGwgcXVldWUuCisJICBGaXhlcyBjYWxjdWxhdGluZyB0aGUgbmV4dCBzZXF1ZW5jZSBudW1iZXIgd2hlbiBhIElURU1fVFlQRV9MT1NUIHdpdGggbW9yZSB0aGFuIG9uZQorCSAgZGVmaW5pdGVseSBsb3N0IHBhY2tldHMgaXMgZW5jb3VudGVyZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5NzU3CisKKzIwMTYtMDgtMTEgMjM6MDc6NDQgKzAyMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogaW1wcm92ZWQgcnR4LXJ0dCBhdmVyYWdpbmcKKwkgIFRoZSBiYXNpYyBpZGVhIGlzIHRoaXM6CisJICAxLiBGb3IgKmxhcmdlciogcnR4LXJ0dCwgd2VpZ2ggYSBuZXcgbWVhc3VyZW1lbnQgYXMgYmVmb3JlCisJICAyLiBGb3IgKnNtYWxsZXIqIHJ0eC1ydHQsIGJlIGEgYml0IG1vcmUgY29uc2VydmF0aXZlIGFuZCB3ZWlnaCBhIGJpdCBsZXNzCisJICAzLiBGb3IgdmVyeSBsYXJnZSBtZWFzdXJlbWVudHMsIGNvbnNpZGVyIHRoZW0gIm91dGxpZXJzIgorCSAgYW5kIGNvdW50IHRoZW0gYSBsb3QgbGVzcworCSAgVGhlIGlkZWEgYmVpbmcgdGhhdCByZWR1Y2luZyB0aGUgcnR4LXJ0dCBpcyBtdWNoIG1vcmUgaGFybWZ1bCB0aGVuCisJICBpbmNyZWFzaW5nIGl0LCBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIGJlIHVuZGVyZXN0aW1hdGluZyB0aGUgcnR0IG9mIHRoZQorCSAgbmV0d29yaywgYW5kIHdoZW4gdXNpbmcgdGhpcyBudW1iZXIgdG8gZXN0aW1hdGUgdGhlIGxhdGVuY3kgeW91IG5lZWQgZm9yCisJICB5b3Ugaml0dGVyYnVmZmVyLCB5b3Ugd291bGQgcmF0aGVyIHdhbnQgaXQgdG8gYmUgYSBiaXQgbGFyZ2VyIHRoZW4gYSBiaXQKKwkgIHNtYWxsZXIsIHBvdGVudGlhbGx5IGxvc2luZyBydHgtcGFja2V0cy4gVGhlICJvdXRsaWVyLWRldGVjdG9yIiBpcyB0aGVyZQorCSAgdG8gcHJldmVudCBhIHNpbmdsZSBza2V3ZWQgbWVhc3VyZW1lbnQgdG8gYWZmZWN0IHRoZSBvdXRjb21lIHRvbyBtdWNoLgorCSAgT24gd2lyZWxlc3MgbmV0d29ya3MsIHRoZXNlIGFyZSBzdXJwcmlzaW5nbHkgY29tbW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTc2OAorCisyMDE2LTA4LTA1IDEyOjUxOjU5ICswMjAwICBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogRGV0ZWN0IHdoZXRoZXIgdG8gYXNzdW1lIGVxdWlkaXN0YW50IHNwYWNpbmcgd2hlbiBsb3NzCisJICBBc3N1bWluZyBlcXVpZGlzdGFudCBwYWNrZXQgc3BhY2luZyB3aGVuIHRoYXQncyBub3QgdHJ1ZSBsZWFkcyB0byBtb3JlCisJICBsb3NzIHRoYW4gbmVjZXNzYXJ5IGluIHRoZSBjYXNlIG9mIHJlb3JkZXJpbmcgYW5kIGppdHRlci4gVHlwaWNhbGx5IHRoaXMKKwkgIGlzIHRydWUgZm9yIHZpZGVvIHdoZXJlIG9uZSBmcmFtZSBvZnRlbiBjb25zaXN0cyBvZiBtdWx0aXBsZSBwYWNrZXRzCisJICB3aXRoIHRoZSBzYW1lIHJ0cCB0aW1lc3RhbXAuIEluIHRoaXMgY2FzZSBpdCdzIGJldHRlciB0byBhc3N1bWUgdGhhdCB0aGUKKwkgIG1pc3NpbmcgcGFja2V0cyBoYXZlIHRoZSBzYW1lIHRpbWVzdGFtcCBhcyB0aGUgbGFzdCByZWNlaXZlZCBwYWNrZXQsIHNvCisJICB0aGF0IHRoZSBzY2hlZHVsZWQgbG9zdCB0aW1lciBkb2VzIG5vdCB0aW1lIG91dCB0b28gZWFybHkgY2F1c2luZyB0aGUKKwkgIHBhY2tldHMgdG8gYmUgY29uc2lkZXJlZCBsb3N0IGV2ZW4gdGhvdWdoIHRoZXkgbWF5IGFycml2ZSBpbiB0aW1lLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTc2OAorCisyMDE2LTA3LTI3IDEwOjM5OjUwICswMjAwICBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogRG9uJ3QgcmVxdWVzdCBydHggaWYgJ25vdycgaXMgcGFzdCByZXRyeSBwZXJpb2QKKwkgIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2NoZWR1bGUgYW5vdGhlciBFWFBFQ1RFRCB0aW1lciBpZiB3ZSdyZSBhbHJlYWR5CisJICBwYXN0IHRoZSByZXRyeSBwZXJpb2QuIFVuZGVyIG5vcm1hbCBvcGVyYXRpb24gdGhpcyB3b24ndCBoYXBwZW4sIGJ1dCBpZgorCSAgdGhlcmUgYXJlIG1vcmUgdGltZXJzIHRoYW4gdGhlIGppdHRlcmJ1ZmZlciBpcyBhYmxlIHRvIHByb2Nlc3MgaW4KKwkgIHJlYWwtdGltZSwgc2NoZWR1bGluZyBtb3JlIHRpbWVycyB3aWxsIGp1c3QgbWFrZSB0aGUgc2l0dWF0aW9uIHdvcnNlLgorCSAgSW5zdGVhZCwgY29uc2lkZXIgdGhpcyBwYWNrZXQgYXMgbG9zdCBhbmQgbW92ZSBvbi4gVGhpcyBzY2VuYXJpbyBjYW4KKwkgIG9jY3VyIHdpdGggaGlnaCBsb3NzIHJhdGUsIGxvdyBydHQgYW5kIGhpZ2ggY29uZmlndXJlZCBsYXRlbmN5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTc2OAorCisyMDE2LTA3LTI2IDE4OjAxOjQ4ICswMjAwICBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogRml4IGxvc3QgZHVyYXRpb24gd2hlbiBnYXAgYWZ0ZXIgbG9zdCB0aW1lcgorCSAgVGhpcyBwYXRjaCBmaXhlcyBhbiBpc3N1ZSB3aXRoIHRoZSBlc3RpbWF0ZWQgZ2FwIGR1cmF0aW9uIHdoZW4gdGhlcmUgaXMKKwkgIGEgZ2FwIGltbWVkaWF0ZWx5IGFmdGVyIGEgbG9zdCB0aW1lciBoYXMgYmVlbiBwcm9jZXNzZWQuIFByZXZpb3VzbHkKKwkgIHRoZXJlIHdhcyBhIGRpc2NyZXBhbmN5IGJldGVlbiB0aGUgZ2FwIGluIHNlcW51bSBhbmQgZ2FwIGluIGR0cyB3aGljaAorCSAgd291bGQgY2F1c2Ugd3JvbmcgY2FsY3VsYXRlZCBkdXJhdGlvbi4gVGhlIGlzc3VlIHdvdWxkIG9ubHkgYmUgc2VlbiB3aXRoCisJICByZXRyYW5taXNzaW9uIGVuYWJsZWQgc2luY2Ugd2hlbiBpdCdzIGRpc2FibGVkIGxvc3QgdGltZXJzIGFyZSBvbmx5CisJICBjcmVhdGVkIHdoZW4gYSBwYWNrZXQgaXMgcmVjZWl2ZWQgYW5kIHRoZSBhY3R1YWwgZ2FwIGxlbmd0aCBhbmQgbGFzdCBkdHMKKwkgIGlzIGtub3duLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTc2OAorCisyMDE2LTA3LTE5IDAxOjExOjU4ICswMjAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBFeHBvc2UgcnR4LWRlYWRsaW5lIGFzIGEgcHJvcGVydHkKKwkgIFRoZSBkZWZhdWx0IC0xIGdpdmVzIHRoZSBvbGQgYmVoYXZpb3IuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5NzY4CisKKzIwMTYtMDgtMTEgMTI6MDI6MTkgKzAyMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogSW1wcm92ZWQgZXhwZWN0ZWQtdGltZXIgaGFuZGxpbmcgd2hlbiBnYXAgPiAwCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5NzY4CisKKzIwMTYtMDgtMTEgMTE6NTE6NTAgKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBNYWpvciBpbXByb3ZlbWVudHMgZm9yIFJUWCBzdGF0cworCSAgU3RhdHMgc2hvdWxkIGFsc28gYmUgY29sbGVjdGVkIGZvciB1bnN1Y2Nlc3NmdWwgcGFja2V0cy4KKwkgIHJ0eC1ydHQgaXMgdmVyeSBpbXBvcnRhbnQgZm9yIGRldGVybWluaW5nIHRoZSBuZWNlc3NhcnkgY29uZmlndXJlZAorCSAgbGF0ZW5jeSBvbiB0aGUgaml0dGVyYnVmZmVyLiBJdCdzIGVzcGVjaWFsbHkgaW1wb3J0YW50IHRvIGJlIGFibGUgdG8KKwkgIGluY3JlYXNlIHRoZSBsYXRlbmN5IHdoZW4gcmV0cmFuc21pdHRlZCBwYWNrZXRzIGFycml2ZSB0b28gbGF0ZSBhbmQgYXJlCisJICBjb25zaWRlcmVkIGxvc3QuIFRoaXMgcGF0Y2ggaW5jbHVkZXMgdGhlc2UgbGF0ZSBwYWNrZXRzIGluIHRoZQorCSAgY2FsY3VsYXRpb24gb2YgdGhlIHZhcmlvdXMgcnR4IHN0YXRzLCBtYWtpbmcgdGhlbSBtb3JlIGNvcnJlY3QgYW5kCisJICB1c2VmdWwuCisJICBBbHNvIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBvcmlnaW5hbCBwYWNrZXQgYXJyaXZlcyBhZnRlciBhIE5BQ0sgaXMgc2VudCwKKwkgIHRoZSByZWNlaXZlZCBSVFggcGFja2V0IHNob3VsZCB1cGRhdGUgdGhlIHN0YXRzIHNpbmNlIGl0IHByb3ZpZGVzIHVzZWZ1bAorCSAgaW5mb3JtYXRpb24gYWJvdXQgUlRULgorCSAgVGhlIFJUVCBpcyBvbmx5IHVwZGF0ZWQgaWYgYW5kIG9ubHkgaWYgYWxsIHJlcXVlc3RlZCByZXRyYW5taXNzaW9ucyBhcmUKKwkgIHJlY2VpdmVkLiBUaGF0IHdheSB0aGUgUlRUIGlzIGd1YXJhbnRlZWQgdG8gbWFrZSBzZW5zZS4gSWYgbm90IHdlIGRvbid0CisJICBrbm93IHdoaWNoIHJlcXVlc3QgdGhlIHBhY2tldCBpcyBhIHJlc3BvbnNlIHRvIGFuZCB0aGUgUlRUIG1heSBiZSBib2d1cy4KKwkgIEEgY29uc2VxdWVuY2Ugb2YgdGhpcyBwYXRjaCBpcyB0aGF0IFJUVCBpcyBub3QgdXBkYXRlZCBmb3IgYSByZXF1ZXN0CisJICB3aGVuIG9uZSBvZiB0aGUgUlRYIHBhY2tldHMgZm9yIHRoYXQgc2VxbnVtIGlzIGxvc3QsIGJ1dCB0aGF0IHNpbmNlCisJICBtZWFzdXJlZCBSVFQgd2lsbCBiZSBtb3JlIGFjY3VyYXRlLgorCSAgVGhlIGltcGxlbWVudGF0aW9uIHN0b3JlIHRoZSBSVFggaW5mb3JtYXRpb24gZnJvbSB0aGUgdGltZWQgb3V0IHRpbWVycworCSAgYW5kIHVzZSB0aGlzIHdoZW4gdGhlIHJldHJhbnNtaXR0ZWQgcGFja2V0IGFycml2ZXMuIEZvciBwZXJmb3JtYW5jZQorCSAgdGhlc2UgdGltZXJzIGFyZSBzdG9yZWQgc2VwYXJhdGVseSBmcm9tIHRoZSAibm9ybWFsIiB0aW1lcnMgaW4gb3JkZXIgdG8KKwkgIG5vdCBpbXBhY3QgcGVyZm9ybWFuY2UgKHNlZSBhdHRhY2hlZCBwZXJmb3JtYW5jZSB0ZXN0KS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njk3NjgKKworMjAxNi0wOC0xMSAxMTowMjo0NCArMDIwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBBZGQgYW5kIGV4cG9zZSBtb3JlIHN0YXRzIGFuZCBpbmNyZWFzZSB0ZXN0aW5nIG9mIGl0CisJICBBZGQgbnVtLXB1c2hlZCBhbmQgbnVtLWxvc3QuCisJICBFeHBvc2UgbnVtLWxhdGUsIG51bS1kdXBsaWNhdGVzIGFuZCBhdmctaml0dGVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTc2OAorCisyMDE2LTA3LTA3IDEwOjIwOjAyICswMjAwICBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5jOgorCSAgcnR4cmVjZWl2ZTogU2V0IGJ1ZmZlciBmbGFnIGZvciByZXRyYW5zbWl0dGVkIHBhY2tldHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njk3NjgKKworMjAxNi0wNy0wOSAyMzo0Nzo0MSArMDIwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogT3B0aW9uIHRvIGRpc2FibGUgcnR4LWRlbGF5LXJlb3JkZXIKKwkgIFdoZW4gZGlzYWJsZWQgd2UgY2FuIHNhdmUgc29tZSBpdGVyYXRpb25zIG92ZXIgdGltZXJzLgorCSAgVGhlcmUgaXMgcHJvYmFibHkgYW4gYXJndW1lbnQgZm9yIHJ0eC1kZWxheS1yZW9yZGVyIHRvIGV4aXN0LCBidXQKKwkgIGZvciBub3JtYWwgb3BlcmF0aW9ucywgaGFuZGxpbmcgaml0dGVyIChyZW9yZGVyaW5nKSBpcyBzb21ldGhpbmcgYQorCSAgaml0dGVyYnVmZmVyIHNob3VsZCBkbywgYW5kIHRoaXMgdmFyaWFibGUgZmVlbHMgbGlrZSBmdW5jdGlvbmFsaXR5IHRoYXQKKwkgIGlzIG5vdCAiaW4tc3luYyIgd2l0aCB3aGF0IHRoZSBqaXR0ZXJidWZmZXIgaXMgdHJ5aW5nIHRvIGFjaGlldmUuCisJICBFeGFtcGxlOiBZb3UgaGF2ZSA1MG1zIGppdHRlciBvbiB5b3VyIG5ldHdvcmssIGFuZCBhcmUgcmVjZWl2aW5nCisJICBhdWRpbyBwYWNrZXRzIHdpdGggMTBtcyBkdXJhdGlvbnMuIEFuIGF1ZGlvIHBhY2tldCBzaG91bGQgbm90IGJlCisJICBjb25zaWRlcmVkIGxhdGUgdW50aWwgaXRzIHJ0eC10aW1lb3V0IGhhcyBleHBpcmVkIChhbmQgaGVuY2UgYSBydHgtZXZlbnQKKwkgIGlzIHNlbnQpLCBidXQgd2l0aCBydHgtZGVsYXktcmVvcmRlciwgZXZlbnRzIHdpbGwgYmUgc2VudCBwcmV0dHkgbXVjaAorCSAgYWxsIHRoZSB0aW1lIGR1ZSB0byB0aGUgaml0dGVyIG9uIHRoZSBuZXR3b3JrLgorCSAgUG9pbnQgYmVpbmc6IFRoZSBqaXR0ZXJidWZmZXIgc2hvdWxkIGFkYXB0IGl0cyBzaXplIHRvIHRoZSBtZWFzdXJlZCBuZXR3b3JrCisJICBqaXR0ZXIsIGFuZCB0aGVuIHJ0eC1kZWxheS1yZW9yZGVyIG5lZWRzIHRvIGFkYXB0IGFzIHdlbGwsIG9yIHNpbXBseQorCSAgZ2V0IG91dCBvZiB0aGUgd2F5IGFuZCBsZXQgdGhlIG90aGVyIChiZXR0ZXIpIHJ0eC1tZWNoYW5pc21zIGRvIHRoZWlyIGpvYi4KKwkgIEFsc28gY2hhbmdlIGZpbmRfdGltZXIgdG8gb25seSB1c2Ugc2VxbnVtIGFzIGFuIGFyZ3VtZW50LCBzaW5jZSB0aGVyZQorCSAgd2lsbCBvbmx5IGV2ZXIgYmUgb25lIHRpbWVyIHBlciBzZXFudW0gYXQgYW55IGdpdmVuIHRpbWUuIEluIHRoZQorCSAgb25lIGNhc2Ugd2hlcmUgdGhlIHR5cGUgbWF0dGVycywgdGhlIGNhbGxlciBzaW1wbHkgY2hlY2tzIHRoZSB0eXBlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTc2OAorCisyMDE2LTA5LTE0IDA5OjU4OjQxIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgIHJ0cGgyNjNwYXk6IEZpeCBkb3VibGUgZnJlZSBmcm9tIGNvdmVyaXR5CisJICBDSUQgIzEzNzI4ODcKKworMjAxNi0wOS0xNCAwOTo1ODozNyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJICBydHBoMjYzcGF5OiBJbmRlbnQgYXMgcGVyIGdzdC1pbmRlbnQKKworMjAxNi0wOS0xNCAxMTozMDo0MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBEZXBlbmQgb24gZ3N0cmVhbWVyIDEuOS4yLjEKKworMjAxNi0wOS0xNCAxMDoxNzowMiArMDkwMCAgV29uY2h1bCBMZWUgPHdvbmNodWwubGVlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9kZXRlY3QuYzoKKwkgIGF1dG9kZXRlY3Q6IFVzZSBnc3RfYmluX3NldF9zdXBwcmVzc2VkX2ZsYWdzKCkgQVBJCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcxMzk1CisKKzIwMTYtMDktMDkgMTU6MzY6MTIgKzAyMDAgIFRob21hcyBTY2hldWVybWFubiA8VGhvbWFzLlNjaGV1ZXJtYW5uQGJhcmNvLmNvbT4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvY2xpZW50LmM6CisJICBqYWNrOiBGaXggcGlwZWxpbmUgaGFuZyB3aGVuIGphY2sgY2hhbmdlcyBzYW1wbGUgcmF0ZSBvciBidWZmZXIgc2l6ZQorCSAgSWYgamFja2QgY2hhbmdlcyB0aGUgYnVmZmVyIHNpemUgb3Igc2FtcGxlIHJhdGUsIGphY2thdWRpb3NpbmsgaGFuZ3MKKwkgIGFuZCBjYW4ndCBiZSBzdG9wcGVkLiBUaGlzIGFsc28gaGFwcGVucyBpZiBqYWNrIGlzIGNvbmZpZ3VyZWQgYXMgc2xhdmUKKwkgIGFuZCBhIGdzdHJlYW1lciBwaXBlbGluZSBpcyBzdGFydGVkIG9uIHRoZSBzbGF2ZSBtYWNoaW5lIHdoaWxlIHRoZSBqYWNrCisJICBtYXN0ZXIgaXNuJ3QgcnVubmluZyB5ZXQuIElmIHRoZSB0aGUgamFjayBtYXN0ZXIgaXMgc3RhcnRlZCBpdCBjaGFuZ2VzCisJICB0aGUgYnVmZmVyIHNpemUgLyBzYW1wbGUgcmF0ZSBhbmQgamFja2F1ZGlvc2luayBjYW4ndCBiZSBzdG9wcGVkLgorCSAgVGhpcyBmaXggY2FsbHMgamFja19zaHV0ZG93bl9jYiB3aGVuIGphY2tfc2FtcGxlX3JhdGVfY2Igb3IKKwkgIGphY2tfYnVmZmVyX3NpemVfY2IgaXMgY2FsbGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MTI3MgorCisyMDE2LTA5LTEyIDIwOjA4OjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBGaXggZmllbGQgb3JkZXJpbmcgZm9yIHJldmVyc2UgcGxheWJhY2sKKwkgIEFuZCBhY3R1YWxseSBjYWxjdWxhdGUgdGhlIGZpZWxkIGR1cmF0aW9uIGluc3RlYWQgb2YgYSBmcmFtZSBkdXJhdGlvbiBzbworCSAgdGhhdCB3ZSBjYW4gcHJvcGVybHkgdGltZXN0YW1wIG91dHB1dCBmcmFtZXMgaW4gZmllbGRzPWFsbCBtb2RlLgorCSAgVGhpcyBpcyBwcm9iYWJseSBzdGlsbCBicm9rZW4gZm9yIHJldmVyc2UgcGxheWJhY2sgaW4gdGVsZWNpbmUgbW9kZS4KKworMjAxNi0wOS0xMiAwOTowMjowMCArMDAwMCAgVGhvbWFzIEtsYXVzbmVyIDx0a0BnaWdhLm9yLmF0PgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBGaXggY29tcGlsYXRpb24gb24gTmV0QlNECisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcxMjc4CisKKzIwMTYtMDktMTAgMjA6NTE6MTAgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBhdXRvZ2VuLnNoOgorCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGIxOGQ4MjAgdG8gZjk4MGZkOQorCisyMDE2LTA5LTA5IDE0OjAyOjI1ICswMjAwICBYYWJpZXIgUm9kcmlndWV6IENhbHZhciA8Y2FsdmFyaXNAaWdhbGlhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBvZmZzZXQgaXMgaXJyZWxldmFudCB3aGVuIG5vIGNyeXB0byBpbmZvCisJICBDYXVzZSBsYXRlciBpdCB3aWxsIHRyeSB0byB1c2UgdGhlIGNyeXB0byBpbmZvIGFycmF5IHRvIGdldCBhbiBpbmRleCBhbmQKKwkgIGF0dGFjaCBvbiBvZiB0aGUgcG9zaXRpb25zIGFzIGJ1ZmZlcidzIGNyeXB0byBpbmZvLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MDk1MQorCisyMDE2LTA5LTEwIDA5OjUzOjU3ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogYXV0b2dlbi5zaDoKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBmNDljNTVlIHRvIGIxOGQ4MjAKKworMjAxNi0wOS0wNyAxNTozMzozMCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vTWFrZWZpbGUuYW06CisJICBvc3hhdWRpbzogRGlzdHJpYnV0ZSBkZXZpY2UgcHJvdmlkZXIgZmlsZXMKKwkgIFRob3NlIHdoZXJlIG1pc3NpbmcgdGhlIHRoZSBkZXYgcmVsZWFzZSB0YXJiYWxscyBmb3IgMS45LjIgd2hpY2gKKwkgIHByZXZlbnRlZCBidWlsZGluZyBmcm9tIHRhcmJhbGwgb24gT1NYIHBsYXRmb3JtCisKKzIwMTYtMDktMDYgMDk6NDk6MzkgKzAyMDAgIFhhYmllciBSb2RyaWd1ZXogQ2FsdmFyIDxjYWx2YXJpc0BpZ2FsaWEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBjcmFzaCB3aXRoIG5vIGNlbmMgYXV4IG9mZnNldAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MDk1MQorCisyMDE2LTA5LTA1IDA5OjM5OjMzICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IHBhcnNlIGEgYml0IG1vcmUgb2YgdGhlIGh1bW9uZ291cyBMT0FTIGRhdGEKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjkyNzgKKworMjAxNi0wOS0wNSAwOTozOTowOCArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBtYWtlIGl0IGNsZWFyIHdoZW4gYSBwb3RlbnRpYWwgTE9BUyBmcmFtZSBpcyBub3Qgb25lCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5Mjc4CisKKzIwMTYtMDktMDUgMDk6Mzg6MjYgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogYWRkIGEgZmV3IGNvbW1lbnRzIHRvIGFuY2hvciBwYXJzaW5nIHRvIHRoZSBzcGVjCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5Mjc4CisKKzIwMTYtMDktMDUgMDk6Mzc6MDIgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmg6CisJICBhYWNwYXJzZTogaW1wcm92ZSBjaGFubmVsL3JhdGUgaGFuZGxpbmcKKwkgIEtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgcGFyc2VkIGNoYW5uZWxzL3JhdGUgZmllbGRzIHNvIHRoZXkgY2FuIGJlCisJICB1c2VkIGV2ZW4gaWYgdGhlIGVsZW1lbnQgd2FzIG5vdCB5ZXQgY29uZmlndXJlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjkyNzgKKworMjAxNi0wOS0wNSAwOTozNTo1MyArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBmaXggdmFybGVuZ3RoIG51bWJlciByZWFkaW5nIGFzIHBlciBzcGVjCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5Mjc4CisKKzIwMTYtMDktMDUgMDk6MzU6MDIgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogc3RyaXAgdW5lZWRlZCBzdGF0aWMgYXJyYXlzIHNsYWNrCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5Mjc4CisKKzIwMTYtMDctMTggMTk6MTg6NTggLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5oOgorCSAgcnRwbXA0YWRlcGF5OiBPbmx5IGRlY2xhcmUgYSBzdHJlYW0gdG8gYmUgZnJhbWVkIG9uY2UgYSBtYXJrZXIgYml0IGhhcyBiZWVuIHNlZW4KKwkgIFRoaXMgbWF5IGNhdXNlIGEgZmV3IHBhY2tldHMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSBwYXJzZXIsIGJ1dCBpdCdzCisJICBiZXR0ZXIgdGhhbiBuZXZlciBwdXNoaW5nIG91dCBidWZmZXJzIGZyb20gYSBzbGlnaHRseSBicm9rZW4gc3RyZWFtCisJICB3aGVyZSBubyBtYXJrZXIgYml0cyBhcmUgc2V0LgorCisyMDE2LTA5LTA2IDE0OjI1OjQyICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSAgZHZkZW11eDogRml4IHRpbWVzdGFtcGluZyBpbiByZXZlcnNlIHBsYXliYWNrIG1vZGUKKwkgIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgcmlnaHQgbm93IGlmIGFmdGVyIGEgZGVtdXhlciB0aGF0IHN1cHBvcnRzIHJldmVyc2UKKwkgIHBsYXliYWNrLCBlLmcuIHdpdGggRFYgY29udGFpbmVyIGluc2lkZSBBVkkgY29udGFpbmVyLgorCisyMDE2LTA5LTA1IDEyOjIzOjU0IC0wMzAwICBUaGliYXVsdCBTYXVuaWVyIDx0aGliYXVsdC5zYXVuaWVyQG9zZy5zYW1zdW5nLmNvbT4KKworCSogbWVzb24uYnVpbGQ6CisJICBtZXNvbjogQnVtcCB2ZXJzaW9uIHRvIDEuOS4yCisKKzIwMTUtMDYtMjYgMjA6MTM6MTcgKzAyMDAgIE1hdGhpZXUgRHVwb25jaGVsbGUgPG1hdGhpZXUuZHVwb25jaGVsbGVAb3BlbmNyZWVkLmNvbT4KKworCSogZ3N0L2lzb21wNC9Hc3RRVE11eC5wcnM6CisJKiBnc3QvaXNvbXA0L01ha2VmaWxlLmFtOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IEltcGxlbWVudCB0aGUgcHJlc2V0IGludGVyZmFjZS4KKwkgICsgQW5kIHByb3ZpZGUgYSAieW91dHViZSIgcHJlc2V0LCB3aGljaCBiYXNlZCBvbgorCSAgaHR0cHM6Ly9zdXBwb3J0Lmdvb2dsZS5jb20veW91dHViZS9hbnN3ZXIvMTcyMjE3MSBzZXRzCisJICBmYXN0c3RhcnQgdG8gVHJ1ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTE1NTkKKworMjAxNi0wOS0wMSAxMjoyNzozNSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjkuMiA9PT0KKworMjAxNi0wOS0wMSAxMjoyNzoxNSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS45LjIKKworMjAxNi0wOS0wMSAxMToyMzozMyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTYtMDktMDEgMTA6NTk6NTEgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2V4YW1wbGVzL2VxdWFsaXplci9kZW1vLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1vc3NzcmMuYzoKKwkgIHRlc3RzL2V4YW1wbGVzOiAjZGVmaW5lIEdES19ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisJICBXZSB1c2UgZ2RrX2NhaXJvX2NyZWF0ZSgpIHdoaWNoIGlzIGRlcHJlY2F0ZWQgc2luY2UgMy4yMi4KKworMjAxNi0wOC0zMSAwNTo1MDo0NCArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9NYWtlZmlsZS5hbToKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5oOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSAgb3N4dmlkZW86IFJlbW92ZSBRdWlja1RpbWUgcmVmZXJlbmNlcy4KKwkgIFF1aWNrVGltZS5oIGlzIG5vIGxvbmdlciBhdmFpbGFibGUgb24gT1MgWCAxMC4xMiAoU2llcnJhKSwKKwkgIGFuZCBib3RoIHRoZSBoZWFkZXIgYW5kIHRoZSBmcmFtZXdvcmsgc2VlbSB1bm5lY2Vzc2FyeQorCSAgZm9yIGNvbXBpbGF0aW9uIC0gYXQgbGVhc3QgYXMgb2YgMTAuMTEgKEVsIENhcGl0YW4pLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MDUyNgorCisyMDE2LTA4LTE5IDExOjExOjAzIC0wNzAwICBUaGliYXVsdCBTYXVuaWVyIDx0aGliYXVsdC5zYXVuaWVyQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZmRlYy5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2RlYnVndXRpbHMvcm5kYnVmZmVyc2l6ZS5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIFVzZSB0aGUgbmV3IEFQSSB0byBwb3N0IGZsb3cgRVJST1IgbWVzc2FnZXMgb24gdGhlIGJ1cworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MDE1OAorCisyMDE2LTA4LTI2IDIxOjMyOjA3ICswMjAwICBKb3NlcCBUb3JyYSA8bjc3MGdhbGF4eUBnbWFpbC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJICBnaXRpZ25vcmU6IGlnbm9yZSBxdGRlbXV4LCBydHBoMjYxIGFuZCBydHB2cDkgdGVzdHMKKworMjAxNi0wOC0yNiAyMToyMjoxNiArMDIwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiB1c2UgR1NUX05FVF9MSUJTIGluc3RlYWQgb2YgaGFyZGNvZGVkIC1sZ3N0bmV0CisJICBGaXhlcyBidWlsZCBpbiBPU1ggd2hlbiBydW5uaW5nICdtYWtlIGNoZWNrJyBpbiBnc3QtdW5pbnN0YWxsZWQuCisKKzIwMTYtMDgtMjYgMjE6MTQ6NDcgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHRlc3RzOiByZW1vdmUgYSB3cm9uZyAnY29uc3QnIHNwZWNpZmllcgorCSAgRml4ZXMgImVycm9yOiBkdXBsaWNhdGUgJ2NvbnN0JyBkZWNsYXJhdGlvbiBzcGVjaWZpZXIiCisKKzIwMTYtMDgtMjYgMjE6MTE6NTkgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBidWlsZDogc2lsZW5jZSBlcnJvciBhYm91dCBwdGhyZWFkIGZvciAnbWFrZSBjaGVjaycgaW4gb3N4CisJICBGaXhlcyAiY2xhbmc6IGVycm9yOiBhcmd1bWVudCB1bnVzZWQgZHVyaW5nIGNvbXBpbGF0aW9uOiAnLXB0aHJlYWQnIgorCisyMDE2LTA4LTI2IDIwOjMxOjEwICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHZwOWVuYzogRml4IGJ1aWxkIG9mIHVuaXQgdGVzdCBieSBsZXR0aW5nIGl0IGxpbmsgdG8gbGliZ3N0dmlkZW8KKworMjAxNi0wOC0yNiAxMjowNjozNSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkgIFJldmVydCAicnRwbXV4OiBmaXggUFJPUF9USU1FU1RBTVBfT0ZGU0VUIHJhbmdlIHByb2JsZW1zIgorCSAgVGhpcyBicm9rZSBBUEksIHNvIHdlIG5lZWQgYSBiZXR0ZXIgc29sdXRpb24hCisJICBUaGlzIHJldmVydHMgY29tbWl0IGM3NTc5ZDMxYTZlOWQ3ODhlOTRiODMyNTgzMDkwNjNkMGFhZTQ4MWUuCisKKzIwMTYtMDYtMDggMTU6MDY6MjggKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOWRlcGF5LmM6CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHZwOS5jOgorCSAgcnRwdnA5ZGVwYXk6IFN1cHBvcnQgZmxleGlibGUgbW9kZQorCisyMDE2LTA2LTA2IDE3OjAzOjM2ICswMjAwICBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdnA5ZW5jLmM6CisJICB2cDllbmM6IEZpeCBsZWFrIG9mIHZweF9pbWFnZV90CisKKzIwMTYtMDUtMDYgMTM6MzM6MjIgKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGgyNjMuYzoKKwkgIHJ0cGgyNjNwZGVwYXk6IERvbid0IHRyeSB0byBwdXNoIGVtcHR5IGZyYW1lCisJICBJZiB0aGUgcmVzdWx0IG9mIGRlcGF5bG9hZGluZyBpcyBhbiBlbXB0eSBmcmFtZSwganVzdCBkcm9wIGl0LiBUaGlzIGlzCisJICBsaWtlbHkgdGhlIHJlc3VsdCBvZiBhIGJ1Z2d5IHBheWxvYWRlci4KKworMjAxNi0wNS0wNiAxNjowNjo1MyArMDIwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5oOgorCSAgcnRwbXV4OiBmaXggUFJPUF9USU1FU1RBTVBfT0ZGU0VUIHJhbmdlIHByb2JsZW1zCisJICBJdCBjb3VsZCBub3Qgc2V0IHRoZSBvZmZzZXQgZm9yIHRoZSBmdWxsIGd1aW50MzIgcmFuZ2UuCisKKzIwMTYtMDUtMDYgMDk6NDQ6NDIgKzAyMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgIHJ0cGJpbjogaW50cm9kdWNlIG1heC1zdHJlYW1zIHByb3BlcnR5CisJICBUbyBiZSBhYmxlIHRvIGNhcCB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgc3RyZWFtcyBmb3Igb25lIHNlc3Npb24uCisJICBUaGlzIGlzIHVzZWZ1bCBmb3IgcHJldmVudGluZyBEb1MgYXR0YWNrcywgd2hlcmUgYSBzZW5kZXIgY2FuIGNoYW5nZQorCSAgU1NSQyBmb3IgZXZlcnkgYnVmZmVyLCBlZmZlY3RpdmVseSBicmluZ2luZyBydHBiaW4gdG8gYSBoYWx0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MDI5MgorCisyMDE2LTAzLTMxIDAwOjEwOjQ5ICswMjAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291cmNlOiByZW9yZGVyZWQgcGFja2V0cyBhcmUgdmVyeSBub3JtYWwsIGFuZCBzaG91bGQgbm90IGJlIGEgd2FybmluZworCisyMDE2LTAyLTA1IDE0OjE5OjI1ICswMTAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGRlZ3JhZGUgZ193YXJuaW5nIHRvIEdTVF9FUlJPUgorCSAgU28gd2UgZG9uJ3QgYmxvdyB1cCB3aGlsZSBpbnZlc3RpZ2F0aW5nCisKKzIwMTYtMDItMDQgMTQ6MTY6NDAgKzAxMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGgyNjMuYzoKKwkgIHJ0cGgyNjNwZGVwYXk6IEZpeCBwaWN0dXJlIGhlYWRlciBmb3Igbm9uLXdyaXRhYmxlIHBheWxvYWQKKwkgIFVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucyBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCgpIHJldHVybnMgYSBjb3B5IG9mCisJICB0aGUgcGF5bG9hZC4gSW4gdGhpcyBjYXNlIHRoZSBwYXlsb2FkIG1vZGlmaWNhdGlvbnMgd2lsbCBub3QgYWZmZWN0IHRoZQorCSAgcnRwIGJ1ZmZlci4gU28gaW5zdGVhZCBvZiBtb2RpZnlpbmcgdGhlIHBheWxvYWQgYnVmZmVyIGRpcmVjdGx5IHdlCisJICBzaG91bGQgbW9kaWZ5IHRoZSBidWZmZXIgdGhhdCBhY3R1YWxseSBnZXRzIHB1c2hlZCBvbiB0aGUgYWRhcHRlci4KKworMjAxNS0xMS0xOSAxMTo1MDo0NyArMDEwMCAgU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2MWRlcGF5LmM6CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGgyNjEuYzoKKwkgIHJ0cGgyNjFkZXBheTogRml4IGNoZWNrIG9mIHZhbGlkIHBheWxvYWQgbGVuZ3RoCisJICBQYWNrZXRzIHdpdGggbm8gSC4yNjEgcGF5bG9hZCBzaG91bGQgYmUgZHJvcHBlZCB0byBhdm9pZCBpbnZhbGlkCisJICB3cml0ZS9yZWFkcy4KKworMjAxNS0xMS0wOSAxMDowNjoyMSArMDEwMCAgU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaDI2My5jOgorCSAgcnRwaDI2M3BheTogRml4IGRvdWJsZSBmcmVlLCBpbnZhbGlkIHJlYWRzIGFuZCBsZWFrCisKKzIwMTQtMDYtMzAgMTU6NDM6NTggKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBzYW5pdHkgY2hlY2sgUlRUIGJlZm9yZSBpZ25vcmluZyBQTEkvRklSCisKKzIwMTQtMDYtMzAgMTU6MDc6NDUgKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBoYW5kbGUgc2RlcyBtZXNzYWdlcyB3aXRoIG5vbi11dGY4IG1vcmUgZ3JhY2VmdWxseQorCisyMDE0LTA2LTE3IDA4OjUyOjUwICswMjAwICBTdGlhbiBTZWxuZXMgPHN0aWFuLnNlbG5lc0BnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSAgcnRwaDI2M3BheTogY2hhbmdlIGxvZyBsZXZlbCBvbiBiaXRzdHJlYW0gcGFyc2luZyBtZXNzYWdlcworCisyMDE2LTA3LTA3IDExOjEzOjE4ICswMjAwICBNaWtoYWlsIEZsdWRrb3YgPG1pc2hhQHBleGlwLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwcnR4LmM6CisJICB0ZXN0cy9ydHBydHg6IHJlZmFjdG9yIHRoZSB0ZXN0cyB0byB1c2UgZ3N0aGFybmVzcworCSAgVGhlIGZ1bmN0aW9uYWxpdHkgb2YgYWxsIHRoZSB0ZXN0cyB3YXMga2VwdCBleGFjdGx5IHRoZSBzYW1lLiBTb21lIHRlc3RzCisJICB3ZXJlIHJlbmFtZWQ6CisJICB0ZXN0X3B1c2hfZm9yd2FyZF9zZXEgLT4gdGVzdF9ydHhzZW5kX3J0eHJlY2VpdmUKKwkgIHRlc3RfZHJvcF9vbmVfc2VuZGVyIC0+IHRlc3RfcnR4c2VuZF9ydHhyZWNlaXZlX3dpdGhfcGFja2V0X2xvc3MKKwkgIHRlc3RfZHJvcF9tdWx0aXBsZV9zZW5kZXIgLT4gdGVzdF9tdWx0aV9ydHhzZW5kX3J0eHJlY2VpdmVfd2l0aF9wYWNrZXRfbG9zcworCSAgdGVzdF9ydHhyZWNlaXZlX2RhdGFfcmVjb25zdHJ1Y3Rpb24gd2FzIHRlc3RpbmcgdGhhdCByZXRyYW5zbWl0dGVkCisJICBidWZmZXIgcHJvZHVjZWQgYnkgcnR4c2VuZCB3YXMgY29ycmVjdGx5IHRyYW5zZm9ybWVkIHRvIHRoZSBvcmlnaW5hbAorCSAgYnVmZmVyIGJ5IHJ0eHJlY2VpdmUuIE5vdyB3ZSBhcmUgY2hlY2tpbmcgZm9yIHRoaXMgaW4gYWxsIHRoZSB0ZXN0cworCSAgd2hlcmUgYm90aCBydHhzZW5kICYgcnR4cmVjZWl2ZSBhcmUgaW52b2x2ZWQuIFRoYXQncyB3aHkgdGhlIHRlc3Qgd2FzCisJICByZW1vdmVkLgorCisyMDE2LTA4LTI1IDE1OjUyOjM2ICswMjAwICBKb25hcyBIb2xtYmVyZyA8am9uYXNoZ0BheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1cGF5LmM6CisJICBydHBoMjY1cGF5OiBTZXQgUlRQIG1hcmtlciBiaXQKKwkgIFNldCB0aGUgUlRQIG1hcmtlciBiaXQgb24gdGhlIGxhc3QgUlRQIHBhY2tldCBvZiBhbiBILjI2NSBhY2Nlc3MgdW5pdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzAzOTQKKworMjAxNi0wNy0yNiAxOTozOTo1OCArMDIwMCAgWGFiaWVyIFJvZHJpZ3VleiBDYWx2YXIgPGNhbHZhcmlzQGlnYWxpYS5jb20+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuaDoKKwkgIHZpZGVvZmxpcDogYWRkZWQgR3N0VmlkZW9EaXJlY3Rpb24gaW50ZXJmYWNlCisJICBJdCBpbXBsZW1lbnRzIG5vdyB0aGlzIGludGVyZmFjZSB3aXRoIGl0cyB2aWRlby1kaXJlY3Rpb24KKwkgIHByb3BlcnR5LiBWYWx1ZXMgYXJlIGNoYW5nZWQgdG8gR3N0VmlkZW9PcmllbnRhdGlvbk1ldGhvZCBidXQgdGhleSBoYXZlCisJICB0aGUgc2FtZSB2YWx1ZSB0aGFuIHRoZSBvcmlnaW5hbHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY4Njg3CisKKzIwMTUtMTEtMDYgMTA6Mzk6MTYgKzAxMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgZ3N0cnRwc2Vzc2lvbjogcmVmYWN0b3IgZHVwbGljYXRlIGNvZGUgaW50byBhIGZ1bmN0aW9uCisJICBMZXNzIGNvZGUsIGVhc2llciB0byByZWFkLCBtb3JlIGNvbnNpc3RlbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcwMjkzCisKKzIwMTYtMDgtMjMgMTc6MDY6NDQgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogZml4IHR5cG8gaW4gbWF4LW1pc29yZGVyLXRpbWUgcHJvcGVydHkgbmFtZQorCisyMDE2LTA4LTIyIDAwOjA1OjUyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXhzaW5rOiBmaXggcHJpbnRmIGZvcm1hdCBjb21waWxlciB3YXJuaW5nIGluIGRlYnVnIG1lc3NhZ2UKKwkgIE9uIDMyLWJpdCB4ODY6IGdzdHNwbGl0bXV4c2luay5jOjk2NjozMTogd2FybmluZzogZm9ybWF0IOKAmCV14oCZIGV4cGVjdHMKKwkgIGFyZ3VtZW50IG9mIHR5cGUg4oCYdW5zaWduZWQgaW504oCZLCBidXQgYXJndW1lbnQgOSBoYXMgdHlwZQorCSAg4oCYZ3VpbnQ2NCB7YWthIGxvbmcgbG9uZyB1bnNpZ25lZCBpbnR94oCZCisKKzIwMTYtMDgtMTIgMjE6MTI6MzAgKzA1MzAgIE5pcmJoZWVrIENoYXVoYW4gPG5pcmJoZWVrQGNlbnRyaWN1bGFyLmNvbT4KKworCSogLmdpdGlnbm9yZToKKwkqIGNvbmZpZy5oLm1lc29uOgorCSogZXh0L2NhaXJvL21lc29uLmJ1aWxkOgorCSogZXh0L2R2L21lc29uLmJ1aWxkOgorCSogZXh0L2ZsYWMvbWVzb24uYnVpbGQ6CisJKiBleHQvZ2RrX3BpeGJ1Zi9tZXNvbi5idWlsZDoKKwkqIGV4dC9qYWNrL21lc29uLmJ1aWxkOgorCSogZXh0L2pwZWcvbWVzb24uYnVpbGQ6CisJKiBleHQvbGlicG5nL21lc29uLmJ1aWxkOgorCSogZXh0L21lc29uLmJ1aWxkOgorCSogZXh0L3B1bHNlL21lc29uLmJ1aWxkOgorCSogZXh0L3Nob3V0Mi9tZXNvbi5idWlsZDoKKwkqIGV4dC9zb3VwL21lc29uLmJ1aWxkOgorCSogZXh0L3NwZWV4L21lc29uLmJ1aWxkOgorCSogZXh0L3RhZ2xpYi9tZXNvbi5idWlsZDoKKwkqIGV4dC92cHgvbWVzb24uYnVpbGQ6CisJKiBleHQvd2F2cGFjay9tZXNvbi5idWlsZDoKKwkqIGdzdC9hbHBoYS9tZXNvbi5idWlsZDoKKwkqIGdzdC9hcGV0YWcvbWVzb24uYnVpbGQ6CisJKiBnc3QvYXVkaW9meC9tZXNvbi5idWlsZDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvbWVzb24uYnVpbGQ6CisJKiBnc3QvYXVwYXJzZS9tZXNvbi5idWlsZDoKKwkqIGdzdC9hdXRvZGV0ZWN0L21lc29uLmJ1aWxkOgorCSogZ3N0L2F2aS9tZXNvbi5idWlsZDoKKwkqIGdzdC9jdXR0ZXIvbWVzb24uYnVpbGQ6CisJKiBnc3QvZGVidWd1dGlscy9tZXNvbi5idWlsZDoKKwkqIGdzdC9kZWludGVybGFjZS9tZXNvbi5idWlsZDoKKwkqIGdzdC9kdG1mL21lc29uLmJ1aWxkOgorCSogZ3N0L2VmZmVjdHYvbWVzb24uYnVpbGQ6CisJKiBnc3QvZXF1YWxpemVyL21lc29uLmJ1aWxkOgorCSogZ3N0L2Zsdi9tZXNvbi5idWlsZDoKKwkqIGdzdC9mbHgvbWVzb24uYnVpbGQ6CisJKiBnc3QvZ29vbS9tZXNvbi5idWlsZDoKKwkqIGdzdC9nb29tMmsxL21lc29uLmJ1aWxkOgorCSogZ3N0L2ljeWRlbXV4L21lc29uLmJ1aWxkOgorCSogZ3N0L2lkM2RlbXV4L21lc29uLmJ1aWxkOgorCSogZ3N0L2ltYWdlZnJlZXplL21lc29uLmJ1aWxkOgorCSogZ3N0L2ludGVybGVhdmUvbWVzb24uYnVpbGQ6CisJKiBnc3QvaXNvbXA0L21lc29uLmJ1aWxkOgorCSogZ3N0L2xhdy9tZXNvbi5idWlsZDoKKwkqIGdzdC9sZXZlbC9tZXNvbi5idWlsZDoKKwkqIGdzdC9tYXRyb3NrYS9tZXNvbi5idWlsZDoKKwkqIGdzdC9tZXNvbi5idWlsZDoKKwkqIGdzdC9tb25vc2NvcGUvbWVzb24uYnVpbGQ6CisJKiBnc3QvbXVsdGlmaWxlL21lc29uLmJ1aWxkOgorCSogZ3N0L211bHRpcGFydC9tZXNvbi5idWlsZDoKKwkqIGdzdC9yZXBsYXlnYWluL21lc29uLmJ1aWxkOgorCSogZ3N0L3J0cC9tZXNvbi5idWlsZDoKKwkqIGdzdC9ydHBtYW5hZ2VyL21lc29uLmJ1aWxkOgorCSogZ3N0L3J0c3AvbWVzb24uYnVpbGQ6CisJKiBnc3Qvc2hhcGV3aXBlL21lc29uLmJ1aWxkOgorCSogZ3N0L3NtcHRlL21lc29uLmJ1aWxkOgorCSogZ3N0L3NwZWN0cnVtL21lc29uLmJ1aWxkOgorCSogZ3N0L3VkcC9tZXNvbi5idWlsZDoKKwkqIGdzdC92aWRlb2JveC9tZXNvbi5idWlsZDoKKwkqIGdzdC92aWRlb2Nyb3AvbWVzb24uYnVpbGQ6CisJKiBnc3QvdmlkZW9maWx0ZXIvbWVzb24uYnVpbGQ6CisJKiBnc3QvdmlkZW9taXhlci9tZXNvbi5idWlsZDoKKwkqIGdzdC93YXZlbmMvbWVzb24uYnVpbGQ6CisJKiBnc3Qvd2F2cGFyc2UvbWVzb24uYnVpbGQ6CisJKiBnc3QveTRtL21lc29uLmJ1aWxkOgorCSogbWVzb24uYnVpbGQ6CisJKiBtZXNvbl9vcHRpb25zLnR4dDoKKwkqIHN5cy9kaXJlY3Rzb3VuZC9tZXNvbi5idWlsZDoKKwkqIHN5cy9tZXNvbi5idWlsZDoKKwkqIHN5cy92NGwyL21lc29uLmJ1aWxkOgorCSogc3lzL3hpbWFnZS9tZXNvbi5idWlsZDoKKwkqIHRlc3RzL2NoZWNrL21lc29uLmJ1aWxkOgorCSogdGVzdHMvbWVzb24uYnVpbGQ6CisJICBBZGQgc3VwcG9ydCBmb3IgTWVzb24gYXMgYWx0ZXJuYXRpdmUvcGFyYWxsZWwgYnVpbGQgc3lzdGVtCisJICBodHRwczovL2dpdGh1Yi5jb20vbWVzb25idWlsZC9tZXNvbgorCSAgV2l0aCBjb250cmlidXRpb25zIGZyb206CisJICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCSAgSnVzc2kgUGFra2FuZW4gPGpwYWtrYW5lQGdtYWlsLmNvbT4gKG9yaWdpbmFsIHBvcnQpCisJICBIaWdobGlnaHRzIG9mIHRoZSBmZWF0dXJlcyBwcm92aWRlZCBhcmU6CisJICAqIEZhc3RlciBidWlsZHMgb24gTGludXggKH40MC01MCUgZmFzdGVyKQorCSAgKiBUaGUgYWJpbGl0eSB0byBidWlsZCB3aXRoIE1TVkMgb24gV2luZG93cworCSAgKiBHZW5lcmF0ZSBWaXN1YWwgU3R1ZGlvIHByb2plY3QgZmlsZXMKKwkgICogR2VuZXJhdGUgWENvZGUgcHJvamVjdCBmaWxlcworCSAgKiBNdWNoIGZhc3RlciBidWlsZHMgb24gV2luZG93cyAob24tcGFyIHdpdGggTGludXgpCisJICAqIFNlcmlvdXNseSBmYXN0IGNvbmZpZ3VyZSBhbmQgYnVpbGRpbmcgb24gZW1iZWRkZWQKKwkgIC4uLiBhbmQgbWFueSBtb3JlLiBGb3IgbW9yZSBkZXRhaWxzIHNlZToKKwkgIGh0dHA6Ly9ibG9nLm5pcmJoZWVrLmluLzIwMTYvMDUvZ3N0cmVhbWVyLWFuZC1tZXNvbi1uZXctaG9wZS5odG1sCisJICBodHRwOi8vYmxvZy5uaXJiaGVlay5pbi8yMDE2LzA3L2J1aWxkaW5nLWFuZC1kZXZlbG9waW5nLWdzdHJlYW1lci11c2luZy5odG1sCisJICBCdWlsZGluZyB3aXRoIE1lc29uIHNob3VsZCB3b3JrIG9uIGJvdGggTGludXggYW5kIFdpbmRvd3MsIGJ1dCBtYXkKKwkgIG5lZWQgYSBmZXcgbW9yZSB0d2Vha3Mgb24gb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMuCisKKzIwMTYtMDgtMjAgMTY6NTk6MzAgKzA4MDAgIEppZSBKaWFuZyA8amlhbmdqaWVAbnVkdC5lZHUuY24+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSAgRml4ZWQgc3BsaXRtdXhzaW5rIDMyLWJpdCBvdmVyZmxvdyBidWcKKwkgIEV4dGVuZCB0aGUgYnl0ZSB0cmFja2luZyBjb3VudGVycyB0byA2NC1iaXQgb24KKwkgIGFsbCBwbGF0Zm9ybXMsIGluc3RlYWQgb2YgdXNpbmcgZ3NpemUsIHdoaWNoIG92ZXJmbG93cworCSAgYWZ0ZXIgNEdCLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MDAxOQorCisyMDE2LTA4LTE5IDE3OjE4OjE2ICswMzAwICBWaXZpYSBOaWtvbGFpZG91IDx2aXZpYUB0b29sc29uYWlyLmNvbT4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSAgaXNvbXA0OiBGaXggY292ZXJpdHkgd2FybmluZworCSAgSWYgYXRvbV9jb3B5X2RhdGEgZmFpbHMgdG8gd3JpdGUgYW55dGhpbmcsIHJldHVybiAwCisJICBDSUQgIzEzNzE0NTgKKworMjAxNi0wNC0wOSAwNzo1MTowMyArMDUzMCAgTmlyYmhlZWsgQ2hhdWhhbiA8bmlyYmhlZWtAY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyZGV2aWNlcHJvdmlkZXIuYzoKKwkqIHN5cy92NGwyL3Y0bDItdXRpbHMuYzoKKwkgIHY0bDI6IGNvbnNpc3RlbnRseSBjaGVjayAjaWZkZWYgSEFWRV9HVURFViBpbnN0ZWFkIG9mICNpZgorCSAgQm90aCB3b3JrIHdpdGggYXV0b3Rvb2xzIGJ1dCB0aGV5IGRlZmluaXRlbHkgZG9uJ3QgbWVhbiB0aGUgc2FtZSB0aGluZywgY2F1c2UKKwkgIHByb2JsZW1zIHdpdGggb3RoZXIgYnVpbGQgc3lzdGVtcywgYW5kIGFyZSBiYWQgZm9ybS4gRXhpc3RlbmNlIHNob3VsZCBhbHdheXMgYmUKKwkgIGNoZWNrZWQgd2l0aCAjaWZkZWYgb3IgI2lmIGRlZmluZWQuCisKKzIwMTYtMDQtMTkgMTA6NTM6MDUgKzA1MzAgIE5pcmJoZWVrIENoYXVoYW4gPG5pcmJoZWVrQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5oOgorCSAgZGlyZWN0c291bmQ6IHBvcnQgYXdheSBmcm9tIG9sZCBEaXJlY3RYIEFQSQorCSAgRDNEWCBoYXMgYmVlbiBkZXByZWNhdGVkIGZvciB0aGUgbGFzdCA0IHllYXJzIGFuZCBsYXRlc3QgdmVyc2lvbnMgb2YKKwkgIFdpbmRvd3Mgbm8gbG9uZ2VyIHNoaXAgaGVhZGVycyBmb3IgaXQuIFRoaXMgaXMgZmluZSBhcyBsb25nIGFzIHlvdSdyZQorCSAgYnVpbGRpbmcgd2l0aCBDZXJiZXJvJ3MgV2luZS1iYXNlZCBEaXJlY3RYIGhlYWRlcnMsIGJ1dCBzdWNrcyBpZiB5b3UKKwkgIHdhbnQgdG8gYnVpbGQgYWdhaW5zdCB0aGUgYWN0dWFsIFdpbmRvd3MgU0RLLgorCSAgV2Ugd2VyZSBqdXN0IHVzaW5nIGl0IHRvIGdldCBlcnJvciBzdHJpbmdzIGFueXdheSwgc28ganVzdCB1c2UgdGhlCisJICBnZW5lcmljIGVycm9yIHN0cmluZyBBUEkuCisKKzIwMTYtMDgtMTggMTI6MDI6MDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBSZXZlcnQgImZsYWNwYXJzZTogQWRkIG1heGltdW0gYml0cmF0ZSB0YWciCisJICBUaGlzIHJldmVydHMgY29tbWl0IGM3MDNhYjY5ZjUyNjA5MmJiMjZjY2U0MWNhNjkxYTg5NmM4MzgzZDguCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5MzkyCisKKzIwMTYtMDgtMTggMDk6NTc6NTEgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBGaXggdW5pdCB0ZXN0IGJ5IGRpc2FibGluZyBhZGFwdGl2ZSBtaXNvcmRlci9kcm9wb3V0IGNhbGN1bGF0aW9ucworCSAgTmVlZCB0byBzZXQgbWF4LW1pc29yZGVyLXRpbWUgYW5kIG1heC1kcm9wb3V0LXRpbWUgdG8gMCBzbyB0aGUKKwkgIGppdHRlcmJ1ZmZlciBkb2VzIG5vdCBiYXNlIHRoZW0gb24gcGFja2V0IHJhdGUgY2FsY3VsYXRpb25zLgorCSAgSWYgaXQgZG9lcywgb3V0IGdhcCBpcyBiaWcgZW5vdWdoIHRvIGJlIGNvbnNpZGVyZWQgYSBuZXcgc3RyZWFtIGFuZAorCSAgd2Ugd2FpdCBmb3IgYSBmZXcgY29uc2VjdXRpdmUgcGFja2V0cyBqdXN0IHRvIGJlIHN1cmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTEzMTEKKworMjAxNi0wOC0wOSAxMjo1NTo1OSArMDMwMCAgVml2aWEgTmlrb2xhaWRvdSA8dml2aWFAYWhpcnUuZXU+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSAgc3BsaXRtdXhzaW5rOiBBZGQgb3B0aW9uIHRvIHNwbGl0IGF0IGV4YWN0bHkgbWF4LXNpemUtdGltZQorCSAgV2lsbCB0cnkgdG8gcmVxdWVzdCBhIGtleWZyYW1lIGZyb20gdGhlIGVuY29kZXIgdG8gYmUgc2VudCBhdCB0aGUgdGFyZ2V0CisJICBydW5uaW5nIHRpbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5NjY0CisKKzIwMTYtMDgtMDkgMjA6MTY6MTYgKzAzMDAgIFZpdmlhIE5pa29sYWlkb3UgPHZpdmlhQGFoaXJ1LmV1PgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXhzaW5rOiBBbGxvdyB0aW1lIGFuZCBieXRlcyB0byByZWFjaCB0aGVpciByZXNwZWN0aXZlIHRocmVzaG9sZHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njk2NjQKKworMjAxNi0wOC0xNyAwOTo0OTowNCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogQWxsb3cgbWltZXR5cGVzIHdpdGggcHJvcGVydGllcyBhcyBsb25nIGFzIHRoZXkncmUgYXBwbGljYXRpb24vc2RwCisJICBTb21lIHNlcnZlcnMgYWRkIHByb3BlcnRpZXMgbGlrZSBjaGFyc2V0LCBlLmcuCisJICBhcHBsaWNhdGlvbi9zZHA7IGNoYXJzZXQ9dXRmOAorCSAgSWRlYWxseSB3ZSBzaG91bGQgYWxzbyBwYXJzZSB0aGUgY2hhcnNldCBhbmQgZG8gY29udmVyc2lvbiBvZiBhbGwgbWVzc2FnZXMsCisJICBidXQgdGhhdCdzIGZvciBhIGxhdGVyIHRpbWUuCisKKzIwMTYtMDYtMjQgMTY6MzI6MzcgKzAzMDAgIFZpdmlhIE5pa29sYWlkb3UgPHZpdmlhQHRvb2xzb25haXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5oOgorCSAgcXRtdXg6IEFkZGVkIHN1cHBvcnQgZm9yIHdyaXRpbmcgdGltZWNvZGUgdHJhY2sKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njc5NTAKKworMjAxNi0wOC0xMSAxNjozMjoyMSAtMDYwMCAgVGhvbWFzIEJsdWVtZWwgPHRibHVlbWVsQGNvbnRyb2w0LmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpdWRwc2luazogSW5pdGlhbGl6ZSBieXRlc19zZW50IGZpZWxkLgorCSAgVGhpcyBmaXhlcyBlbmRwb2ludHMgbm90IHJlY2VpdmluZyBhbnkgZGF0YSBpbnRlcm1pdHRlbnRseS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njk3NzMKKworMjAxNi0wOC0xMCAxMTo0NToxMyAtMDYwMCAgVGhvbWFzIEJsdWVtZWwgPHRibHVlbWVsQGNvbnRyb2w0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBBY3R1YWxseSBjYWxjdWxhdGUgdGhlIHBhY2tldCByYXRlIGZvciBtYXgtZHJvcG91dCBhbmQgbWF4LW1pc29yZGVyIGNhbGN1bGF0aW9ucy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTEzMTEKKworMjAxNi0wOC0xMCAxMToyNjoxNyAtMDYwMCAgVGhvbWFzIEJsdWVtZWwgPHRibHVlbWVsQGNvbnRyb2w0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IERvbid0IHdhcm4gZm9yIGR1cGxpY2F0ZSBwYWNrZXRzCisJICBUaGlzIGlzIGEgbm9ybWFsIHNjZW5hcmlvIGFuZCBzaG91bGQgbm90IGJlIGEgd2FybmluZy4gIFRoaXMgY2FuCisJICBoYXBwZW4gZnJlcXVlbnRseSB3aGVuIHJlLXRyYW5zbWl0cyBvZiBsb3N0IHBhY2tldHMgYXJlIGVuYWJsZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyMjA4CisKKzIwMTYtMDgtMDggMTM6NDk6MTkgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXg6IEZpeCB0eXBvIGNvbnZlcnRpbmcgdG8gcnVubmluZyB0aW1lLgorCSAgVXNlIHRoZSBjb3JyZWN0IGNvbGxlY3RlZCB0aW1lc3RhbXAuCisKKzIwMTYtMDgtMDggMDI6NTM6NDggKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuaDoKKwkgIFJldmVydCAic3BsaXRtdXhzaW5rOiBVc2UgR3N0QmluIGFzeW5jLWhhbmRsaW5nIGluc3RlYWQgb2Ygb3VyIG93bi4iCisJICBUaGlzIHJldmVydHMgY29tbWl0IGZhMDA4ZjI3MWE1MmY4MmRlZGVkYzI4YmQ4MWIwMjBjYTc5MzliNDcuCisJICBhc3luYy1oYW5kbGluZyBpbiBHc3RCaW4gY2F1c2VzIHRoZSBwaXBlbGluZSB0byBzcGluIGF0IDEwMCUKKwkgIENQVSBhcyB0aGUgdG9wLWxldmVsIHBpcGVsaW5lIHRyaWVzIHRvIGNoYW5nZSB0aGF0IHN0YXRlCisJICB0byBQTEFZSU5HIGNvbnN0YW50bHkuIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBhIGNvcmUKKwkgIHByb2JsZW0sIGVzc2VudGlhbGx5LCBidXQgYW4gaW1wcm92ZW1lbnQgaW4gdGhpcyBjYXNlIGZvciBub3cuCisKKzIwMTYtMDgtMDggMDA6NTY6MzggKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXg6IFJlY2hlY2sgc3RhdGUgYWZ0ZXIgdW5sb2NraW5nIG11dGV4LgorCSAgQWZ0ZXIgZHJvcHBpbmcgdGhlIHNwbGl0bXV4IGxvY2ssIHJlLWNoZWNrIHRoZSBzdGF0ZSwKKwkgIGRvbid0IGp1c3QgZmFsbCB0aHJvdWdoIGFuZCBzbGVlcCB1bmNvbmRpdGlvbmFsbHksCisJICBhcyB3ZSBtYXkgaGF2ZSBhbHJlYWR5IG1pc3NlZCB0aGUgd2FrZXVwLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTUxNAorCisyMDE2LTA4LTAzIDAzOjMyOjA3ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNyYy5jOgorCSAgc3BsaXRtdXhzcmM6IERvbid0IHN0b3AgYW5kIGVycm9yIG9uIEVPUyBmbG93IHJldHVybgorCSAgRG9uJ3QgaW1tZWRpYXRlbHkgaGFsdCBvbiBFT1MgZmxvdyByZXR1cm4gZnJvbSBkb3duc3RyZWFtCisJICBkdWUgdG8gb3V0IG9mIHNlZ21lbnQuIExldCB0aGUgZGVtdXhlciBoYW5kbGUgaXQgYW5kIHNlbmQKKwkgIEVPUy4KKworMjAxNi0wOC0wNCAwMDozNjoyOCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NhbnRvc0BnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBhdm9pZCB1bnJlZiBvZiBudWxsIGJ1ZmZlcgorCSAgVGhlIGN1cnJlbnQgJ2wnIHBvaW50ZXIgd2lsbCBiZSBOVUxMIHdoZW4gdGhlIGxvb3AKKwkgIGlzIGludGVycnVwdGVkIHdpdGggYSAnYnJlYWsnIHN0YXRlbWVudC4gTmVlZCB0byBoYXZlCisJICBpdCBhZHZhbmNlIHRvIHRoZSBuZXh0IGxpc3QgaXRlbSBiZWZvcmUgaW50ZXJydXB0aW5nLgorCisyMDE2LTA4LTAyIDE0OjAxOjE0ICswMjAwICBDYXJsb3MgUmFmYWVsIEdpYW5pIDxkdkBwc2V1ZG90ZXJtaW5hbC5vcmc+CisKKwkqIGdzdC93YXZwYXJzZS9NYWtlZmlsZS5hbToKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IEFkZCB0YWdzIGZvciBjb250YWluZXIgZm9ybWF0IGFuZCBiaXRyYXRlIGZvciB1bmNvbXByZXNzZWQgUENNCisJICBUaGUgUENNIGJpdHJhdGUgaXMgYWRkZWQgdG8gaGVscCBkb3duc3RyZWFtIGVsZW1lbnRzIChsaWtlIHVyaWRlY29kZWJpbikKKwkgIGZpZ3VyZSBvdXQgYSBwcm9wZXIgbmV0d29yayBidWZmZXIgc2l6ZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTM5MAorCisyMDE2LTA4LTAxIDE4OjUyOjI2ICswMjAwICBDYXJsb3MgUmFmYWVsIEdpYW5pIDxkdkBwc2V1ZG90ZXJtaW5hbC5vcmc+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IEFkZCBtYXhpbXVtIGJpdHJhdGUgdGFnCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5MzkyCisKKzIwMTYtMDctMjggMTc6NTg6MTYgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogV2hlbiByZWNlaXZpbmcgYSBESVNDT05UIGJ1ZmZlciB0aGF0IGRvZXMgbm90IHBvaW50IHRvIGEgc2FtcGxlLCByZW1lbWJlciB0aGUgb2Zmc2V0CisJICBBbmQgZG9uJ3QganVzdCByZXNldCBldmVyeXRoaW5nLiBUaGlzIG1ha2VzIHN1cmUgdGhhdCB3ZSBjYW4gY29udGludWUgdG8KKwkgIGhhbmRsZSBkYXRhIGluIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW86CisJICBtb292OiBkaXNjb250CisJICBtb29mOiBkaXNjb250CisJICBtZGF0OiBjb250aW51b3VzCisJICBQcmV2aW91c2x5IHRoaXMgd291bGQgZmFpbCBiZWNhdXNlIHRoZSBvZmZzZXQgd291bGQgYmUgdGhlIGFjY3VtdWxhdGVkIG9mZnNldAorCSAgZnJvbSBtb292IGFuZCBtb29mIGF0IHRoZSBtZGF0IHBvc2l0aW9uLCB3aGlsZSB0aGUgYnVmZmVyIG9mZnNldCBtaWdodCBiZQorCSAgc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50LgorCisyMDE2LTA3LTI1IDEzOjM0OjAyICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGJ2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYzoKKwkgIHJ0cDogRmlsdGVyIHdpdGggdGhlIGZpbHRlciBjYXBzIGluIHRoZSBwYXlsb2FkZXIncyBnZXRjYXBzCisKKzIwMTYtMDMtMDMgMTE6MzU6MDYgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IGluY2x1ZGUgaHR0cC1zdGF0dXMtY29kZSBpbiBlcnJvciBtZXNzYWdlIGRldGFpbHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjMwMzgKKworMjAxNi0wNy0yNSAxODoyMDowMyArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IEZpeCBkZWJ1ZyBzdGF0ZW1lbnQgc2lnbmVkbmVzcy4KKwkgIFRoZSB0cyB2YXJpYWJsZSBpcyBhIEdzdENsb2NrVGltZSwgZG9uJ3QgcHJpbnQgaXQKKwkgIGFzIGEgR3N0Q2xvY2tUaW1lRGlmZi4KKworMjAxNi0wNy0xNyAyMjo0MTowMiArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSAgc3BsaXRtdXhzaW5rOiBIYW5kbGUgbmVnYXRpdmUgcnVubmluZyB0aW1lCisJICBVc2Ugc2lnbmVkIGNsb2NrIHRpbWVzIGZvciBydW5uaW5nIHRpbWUgZXZlcnl3aGVyZQorCSAgc28gdGhhdCB3ZSBoYW5kbGUgbmVnYXRpdmUgcnVubmluZyB0aW1lcyB3aXRob3V0CisJICBnb2luZyBoYXl3aXJlLCBzaW1pbGFyIHRvIHdoYXQgcXVldWUgYW5kIG11bHRpcXVldWUKKwkgIGRvIHRoZXNlIGRheXMuCisKKzIwMTYtMDctMTggMDA6MTI6NTUgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXhzaW5rOiBEcm9wIGxvY2sgd2hlbiBzZW5kaW5nIGR1bW15IGV2ZW50CisJICBXaGVuIHB1c2hpbmcgdGhlIGR1bW15IGV2ZW50IGludG8gdGhlIG11bHRpcXVldWUsCisJICBkcm9wIHRoZSBzcGxpdG11eCBsb2NrIG9yIGVsc2Ugd2UgbWlnaHQgZGVhZGxvY2suCisKKzIwMTYtMDYtMzAgMDE6NTY6NDEgKzEwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHBoMjY0cGF5OiBJbnRlcnNlY3Qgd2l0aCBmaWx0ZXIgY2FwcyBpbiBnZXRjYXBzIGZ1bmN0aW9uLgorCSAgQWx3YXlzIGludGVyc2VjdCB3aXRoIHRoZSBmaWx0ZXIgY2FwcyBpbiB0aGUgZ2V0Y2FwcyBmdW5jdGlvbgorCSAgdG8gbWFrZSBzdXJlIHdlIHJldHVybiBhIHN1YnNldCBvZiB3aGF0IHdhcyByZXF1ZXN0ZWQuCisJICBPdGhlciBwYXlsb2FkZXJzIGFsc28gaGF2ZSB0aGlzIHByb2JsZW0gYW5kIG5lZWQgZml4aW5nCisJICBpbiBmdXR1cmUgY29tbWl0cy4KKworMjAxNi0wNy0xMiAxNzozMDo1NiArMDIwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0ZGVtdXguYzoKKwkgIHRlc3RzOiBxdGRlbXV4OiBmaXggZWxlbWVudCBhbmQgcGFkIGxlYWsKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njg3MzkKKworMjAxNi0wNy0xMiAxNjo0NTozNiArMDIwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZmlyZmlsdGVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2lpcmZpbHRlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvYm94LmM6CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvZWZmZWN0di5jOgorCSAgdGVzdHM6IGZpeCBidXMgbGVha3MKKwkgIGdzdF9idXNfYWRkX3NpZ25hbF93YXRjaCgpIHRha2VzIGEgcmVmIG9uIHRoZSBidXMgd2hpY2ggc2hvdWxkIGJlCisJICByZWxlYXNlZCB1c2luZyBnc3RfYnVzX3JlbW92ZV9zaWduYWxfd2F0Y2goKS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njg3MzkKKworMjAxNi0wNy0xNCAwMzowNzoxMSArMDgwMCAgVGluZy1XZWkgTGFuIDxsYW50d0BzcmMuZ25vbWUub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IENhbGwgQUdfR1NUX1BLR19DT05GSUdfUEFUSCB0byBzZXQgR1NUX1BLR19DT05GSUdfUEFUSAorCSAgR1NUX1BLR19DT05GSUdfUEFUSCBpcyB1c2VkIGluIGRvY3MvcGx1Z2lucyBkaXJlY3RvcnksIHNvCisJICBBR19HU1RfUEtHX0NPTkZJR19QQVRIIG11c3QgYmUgY2FsbGVkIHRvIHNldCBpdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njg3ODcKKworMjAxNi0wNy0xMiAwNzozOTo1OCArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBEb24ndCBkcm9wIGZpbmFsIGJ5dGVzIG9mIGEgcmFuZ2UgcmVxdWVzdAorCSAgQXQgdGhlIGVuZCBvZiBhIHJhbmdlIHJlcXVlc3QsIHdlIGRvbid0IHdhbnQgdG8gcmV0dXJuIEdTVF9GTE9XX0VPUyBvdGhlcndpc2UKKwkgIHRoZSBsYXN0IGJ5dGVzIHdlIGp1c3QgcmVhZCB3aWxsIGJlIGRyb3BwZWQgYnkgYmFzZXNyYy4KKwkgIEluc3RlYWQganVzdCByZXR1cm4gR1NUX0ZMT1dfT0sgKHdoaWNoIHdhcyBzZXQganVzdCBiZWZvcmUpIGFuZCBsZXQgYmFzZXNyYworCSAgaGFuZGxlIHRoZSBmYWN0IHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBzZWdtZW50LgorCisyMDE2LTA3LTExIDE4OjMwOjE4IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJkZXZpY2Vwcm92aWRlci5jOgorCSAgdjRsMnByb3ZpZGVyOiBGaXggZGV2aWNlIHR5cGUgZGV0ZWN0aW9uCisJICBUaGUgdHlwZSBkZXRlY3Rpb24gd291bGQgbGVhZCB0byBhc3NlcnRpb24gYXMgaXQgd291bGQgdHJ5CisJICB0byBjcmVhdGUgYSBkZXZpY2Ugd2l0aG91dCBoYXZpbmcgZm91bmQgYW55IHR5cGUgZm9yIGl0LiBJdAorCSAgYWxzbyBkaWRuJ3QgZGV0ZWN0IE1QTEFORSBkZXZpY2VzIHByb3Blcmx5LgorCisyMDE2LTA3LTExIDE4OjI5OjAxIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IERvbid0IGFzc2VydCB3aGVuIHVzZWQgYnkgdGhlIG1vbml0b3IKKwkgIFRoZSBtb25pdG9yIHNldHMgdGhlIG9iamVjdC0+ZWxlbWVudCBvYmplY3QgYXMgYSBHc3RPYmplY3QuIFRoaXMKKwkgIHdvcmtzIGZvciBkZWJ1ZyB0cmFjZXMsIGJ1dCB3aWxsIGFzc2VydCBmb3IgRUxFTUVOVF9FUlJPUi4gVGhpcworCSAgd2FzIHRoZSBvbmx5IGNhc2Ugd2hlcmUgdGhhdCBjb3VsZCBoYXBwZW4uIEFkZCBhIGNoZWNrIGZvciB0aGF0LgorCisyMDE2LTA3LTExIDE3OjM4OjAwIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IEluZGVudCB2ZXJ5IGxvbmcgbGluZQorCisyMDE2LTA3LTEyIDAwOjQyOjAyICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IEF0IHRoZSBlbmQgb2YgYSByYW5nZSByZXF1ZXN0LCByZWFkIGFub3RoZXIgdGltZSB0byBmaW5hbGl6ZSB0aGUgcmVxdWVzdAorCSAgSWYgd2UncmUgYXQgdGhlIGVuZCBvZiBhIHJhbmdlIHJlcXVlc3QsIHJlYWQgYWdhaW4gdG8gbGV0IGxpYnNvdXAKKwkgIGZpbmFsaXplIHRoZSByZXF1ZXN0LiBUaGlzIGFsbG93cyB0byByZXVzZSB0aGUgY29ubmVjdGlvbiBhZ2FpbiBsYXRlciwKKwkgIG90aGVyd2lzZSB3ZSB3b3VsZCBoYXZlIHRvIGNhbmNlbCB0aGUgbWVzc2FnZSBhbmQgY2xvc2UgdGhlIGNvbm5lY3Rpb24uCisKKzIwMTYtMDctMTEgMjE6MTM6NDcgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBmMzYzYjMyIHRvIGY0OWM1NWUKKworMjAxNi0wNy0xMSAxOTo1NzoxOCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBGaXgga2VlcC1hbGl2ZSBoYW5kbGluZworCSAgV2UgaGF2ZSB0byBnZXQgcmlkIG9mIHRoZSBtZXNzYWdlIG9uIEVPUyB3aGVuIHRoZSBjb21wbGV0ZSBzdHJlYW0gaXMgcmVhZCB0bworCSAgcmVtZW1iZXIgdGhhdCB3ZSBzdWNjZXNzZnVsbHkgZmluaXNoZWQgaGFuZGxpbmcgdGhpcyBzcGVjaWZpYyBtZXNzYWdlLgorCSAgT3RoZXJ3aXNlIHdlIHdpbGwgY2FuY2VsIGl0IGxhdGVyIGFuZCBjbG9zZSB0aGUgY29ubmVjdGlvbiBpbnN0ZWFkIG9mIHJldXNpbmcKKwkgIGl0IGF0IGEgbGF0ZXIgdGltZS4KKwkgIEl0IG1pZ2h0IGFsc28gbWFrZSBzZW5zZSB0byByZXVzZSBjb25uZWN0aW9ucyBpZiBhIG5vbi0yMDAgcmVzcG9uc2UgaXMKKwkgIHJlY2VpdmVkLiBBcyBsb25nIGFzIHRoZXJlIHdhcyBubyBjb25uZWN0aW9uIGVycm9yLCB0aGUgSFRUUCBjb25uZWN0aW9uIHNob3VsZAorCSAgYmUgcmUtdXNhYmxlLgorCisyMDE2LTA3LTExIDEyOjA1OjA2IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEFsc28gZW5hYmxlIFY0TDIgcHJvYmUgb24gYWFyY2g2NCAoYWthIEFSTSA2NGJpdCkKKworMjAxNi0wNy0xMSAxMTo1OToxOSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLmM6CisJICBydHAgZXhhbXBsZTogRml4IGxlYWsKKwkgIEFsc28gc3RvcCBmZXRjaGluZyB0aGUgaW50ZXJuYWwgc291cmNlIGFzIHRoaXMKKwkgIGZ1bmN0aW9uYWxpdHkgaGFzIGJlZW4gYnJva2VuLgorCisyMDE2LTA3LTA4IDE0OjU4OjM3IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEVuYWJsZSB2NGwyIHByb2JlIG9uIExpbnV4L0FSTQorCSAgTW9zdCBvZiB0aG9zZSBoYXZlIFY0TDIgZHJpdmVycyB0aGVzZSBkYXlzIGVuYWJsaW5nIGl0IG1ha2Ugc3VyZSB0aGF0IGl0CisJICB0aGlzIGNvZGUgaXMgZW5hYmxlZCBpbiBtYWpvciBkaXN0cmlidXRpb24sIGhlbmNlIHRoYXQgSFcgYWNjZWxlcmF0ZWQKKwkgIGRlY29kZXIvZW5jb2RlciBjYW4gYmUgdXNlZCBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IGl0LiBUaGUgcHJvYmVzIGFyZQorCSAgc2xpZ2h0bHkgaW5jcmVhc2luZyB0aGUgZmlyc3QgaW5pdCBvZiBnc3RyZWFtZXIgbGlicmFyeSwgdGhvdWdoIHRoZQorCSAgcmVzdWx0IGlzIGNhY2hlZCBpbiB0aGUgcmVnaXN0cnkgZm9yIGxhdGVyIHVzZS4KKworMjAxNi0wNy0xMSAwOTo0Njo0OSArMDIwMCAgSm9uYXMgSG9sbWJlcmcgPGpvbmFzaGdAYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHJ0cGgyNjVwYXk6IEFjY2VwdCBhcnJheV9jb21wbGV0ZW5lc3M9MQorCSAgV2hlbiBwYXJzaW5nIE5BTCB1bml0IHR5cGUgaW4gY29kZWNfZGF0YSwgY2hlY2sgdGhlIDZiaXRzIG9mCisJICBOQUxfdW5pdF90eXBlIG9ubHkgYW5kIGRvIG5vdCByZXF1aXJlIHRoZSBhcnJheV9jb21wbGV0ZW5lc3MgYml0IHRvIGJlCisJICAwLCBzaW5jZSB0aGUgZGVmYXVsdCBhbmQgbWFuZGF0b3J5IHZhbHVlIG9mIGFycmF5X2NvbXBsZXRlbmVzcyBpcyAxIGZvcgorCSAgaHZjMS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njg2NTMKKworMjAxNi0wNy0xMCAyMTozNTowNiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBBbHNvIGNvcHkgZGV2aWNlX2NhcHMgaW4gZ3N0X3Y0bDJfZHVwCisJICBUaGlzIGZpeGVzIHJlZ3Jlc3Npb24gd2hlcmUgTTJNIGVycm9yIG91dCBzYXlpbmcgdGhleSBoYXZlIG5vIG91dHB1dAorCSAgZm9ybWF0ICh0aGUgVjRMMiBDQVBUVVJFIHNpZGUpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2ODE5NQorCisyMDE2LTA3LTEwIDIxOjMwOjI3ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBVc2UgY29ycmVjdCBpbjZfcGt0aW5mbyBzdHJ1Y3QgaW5zdGVhZCBvZiBpbl9wa3RpbmZvCisJICBGaXhlcyB0aGUgYnVpbGQgb24gRnJlZUJTRCwgd2hpY2ggZG9lcyBub3QgaGF2ZSB0aGUgbGF0dGVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2ODYyMworCisyMDE2LTA3LTA4IDE3OjI4OjE5ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBmaXggbXVsdGlwbGFuYXIgY2FwdHVyZQorCSAgQWZ0ZXIgc3dpdGNoaW5nIHRvIHVzaW5nIFY0TDJfQ0FQX0RFVklDRV9DQVBTIHdlIGxvc3Qgc3VwcG9ydCBmb3IKKwkgIG11bHRpcGxhbmFyIGRldmljZSB0eXBlcy4gQWZ0ZXIgc29tZSByZXNlYXJjaCwgaXQgbG9va3MgbGlrZQorCSAgdmNhcC5jYXBhYmlsaXRpZXMgdHJlYXRlZCB0aGUgbXVsdGlwbGFuYXIgZmxhZyBvZiBvdXRwdXQgYW5kIGNhcHR1cmUKKwkgIGRldmljZXMgZXF1YWxseSwgYnV0IG5vdCB0aGUgbmV3IGRldmljZV9jYXBzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2ODE5NQorCisyMDE2LTA3LTA4IDE0OjU2OjMwICswMjAwICBNYXRzIExpbmRlc3RhbSA8bWF0c2xtQGF4aXMuY29tPgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguaDoKKwkgIG11bHRpcGFydG11eDogVXNlIFBUUyBhbmQgRFRTIGluc3RlYWQgb2YgdGltZXN0YW1wCisJICBBbmQgcGFzcy10aHJvdWdoIGJvdGggb2YgdGhlbS4KKwkgIEJhc2VkIG9uIGEgcGF0Y2ggYnkgR8O2cmFuIErDtm5zc29uIDxnb3JhbmpuQGF4aXMuY29tPgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzkwMAorCisyMDE2LTA2LTMwIDE0OjQwOjQwICswMjAwICBUaG9tYXMgU2NoZXVlcm1hbm4gPFRob21hcy5TY2hldWVybWFubkBiYXJjby5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5jOgorCSAgamFjazogZG9uJ3Qgd2FpdCBmb3IgY2FsbGJhY2tzIGlmIHRoZSBqYWNrIHNlcnZlciBzaHV0IGRvd24KKwkgIE90aGVyd2lzZSB3ZSdsbCB3YWl0IGZvcmV2ZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3Mjc1CisKKzIwMTYtMDYtMjMgMTU6MzA6MTkgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogTGV0IHVwc3RyZWFtIGV2ZW50cyBnbyB0aHJvdWdoIHVwc3RyZWFtCisJICBUaGVyZSdzIG5vIHJlYWwgcmVhc29uIHRvIGF2b2lkIHNlbmRpbmcgUU9TL05BVklHQVRJT04gZXZlbnRzIHVwc3RyZWEuCisJICBTb21lIGVsZW1lbnRzIG1pZ2h0IHdhbnQgdG8gaGF2ZSB0aGF0IGluZm9ybWF0aW9uLgorCisyMDE2LTA2LTIzIDE1OjIyOjU2ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogTGV0IHVwc3RyZWFtIGV2ZW50cyBnbyB0aHJvdWdoIHVwc3RyZWFtCisJICBUaGVyZSdzIG5vIHJlYWwgcmVhc29uIHRvIGF2b2lkIHNlbmRpbmcgUU9TL05BVklHQVRJT04gZXZlbnRzIHVwc3RyZWEuCisJICBTb21lIGVsZW1lbnRzIG1pZ2h0IHdhbnQgdG8gaGF2ZSB0aGF0IGluZm9ybWF0aW9uLgorCisyMDE2LTA2LTIzIDE1OjE3OjM2ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSAgZHZkZW11eDogTGV0IHVwc3RyZWFtIGV2ZW50cyBnbyB0aHJvdWdoIHVwc3RyZWFtCisJICBUaGVyZSdzIG5vIHJlYWwgcmVhc29uIHRvIGF2b2lkIHNlbmRpbmcgUU9TL05BVklHQVRJT04gZXZlbnRzIHVwc3RyZWEuCisJICBTb21lIGVsZW1lbnRzIG1pZ2h0IHdhbnQgdG8gaGF2ZSB0aGF0IGluZm9ybWF0aW9uLgorCSAgQWxzbyByZW1vdmUgZG93bnN0cmVhbS1vbmx5IENBUFMgZXZlbnQgaGFuZGxpbmcgYW5kIG1pbmltaXplIGNvZGUKKworMjAxNi0wNy0wNyAyMzo1Mzo1NCArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMi5jOgorCSAgdjRsMjogZml4IHY0bDIgcHJvYmUgYnVpbGQgZXJyb3IKKwkgIEEgdHlwbyBpbiBnc3RfdjRsMl9wcm9iZV9hbmRfcmVnaXN0ZXIoKSBjYXVzZWQgYSBidWlsZCBlcnJvciB3aGVuIGJ1aWxkaW5nCisJICB3aXRoIC0tZW5hYmxlLXY0bDItcHJvYmUuIEZpeGluZyBpdC4KKwkgIGdzdHY0bDIuYzogSW4gZnVuY3Rpb24gJ2dzdF92NGwyX3Byb2JlX2FuZF9yZWdpc3Rlcic6CisJICBnc3R2NGwyLmM6MTUwOjI1OiBlcnJvcjogJ3N0cnVjdCB2NGwyX2NhcGFiaWxpdHknIGhhcyBubyBtZW1iZXIgbmFtZWQgJ2NhcGFiaWxpdGl0ZXMnCisJICBkZXZpY2VfY2FwcyA9IHZjYXAuY2FwYWJpbGl0aXRlczsKKworMjAxNi0wNy0wMSAyMjo1MzozMyAtMDcwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiB1c2UgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgaW4gbmVnb3RpYXRlKCkKKwkgIEluc3RlYWQgb2YgcmVpbXBsZW1lbnRpbmcgdGhlIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVAorCSAgaW50ZXJlY3Rpb24gbW9kZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjgxOTUKKworMjAxNi0wNy0wMiAwMTo1NjowNyAtMDcwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmRldmljZXByb3ZpZGVyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwycmFkaW8uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiB1c2Ugb3BlbmVkIGRldmljZSBjYXBzIGluc3RlYWQgb2YgcGh5c2ljYWwgZGV2aWNlIG9uZXMKKwkgIFRoZSBzYW1lIHBoeXNpY2FsIGRldmljZSBjYW4gZXhwb3J0IG11bHRpcGxlIGRldmljZXMuIEluCisJICB0aGlzIGNhc2UsIHRoZSBjYXBhYmlsaXRpZXMgZmllbGQgbm93IGNvbnRhaW5zIGEgdW5pb24gb2YKKwkgIGFsbCBjYXBzIGF2YWlsYWJsZSBmcm9tIGFsbCBleHBvcnRlZCBWNEwyIGRldmljZXMgYWxvbmdzaWRlCisJICBhIFY0TDJfQ0FQX0RFVklDRV9DQVBTIGZsYWcgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBkZWNpZGUKKwkgIHdoYXQgY2FwYWJpbGl0aWVzIHRvIGNvbnNpZGVyLiBJbiBvdXIgY2FzZSwgd2UgbmVlZCB0aGUKKwkgIG9uZXMgZnJvbSB0aGUgZXhwb3J0ZWQgZGV2aWNlIHdlIGFyZSB1c2luZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjgxOTUKKworMjAxNi0wNy0wNyAxODoyNDo1OSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IFJlbW92ZSBzdXNwaWNpb3VzIGNoZWNrcyBmb3IgcGFkcyBiZWluZyBhY3RpdmUgYW5kIGxpbmtlZAorCSAgV2Ugc2hvdWxkIGFkZCBhbGwgcGFkcywgbm8gbWF0dGVyIGlmIHRoZXkgYXJlIGxpbmtlZCBvciBhY3RpdmUgb3Igbm90IGF0IHRoaXMKKwkgIHBvaW50LiBTa2lwcGluZyBzb21lIHRoYXQgYXJlIG5vdCB3aWxsIGNhdXNlIGRpZmZlcmVudCBiZWhhdmlvdXIgdGhhbiB3aXRoCisJICBvdGhlciBtdXhlcnMuCisKKzIwMTYtMDctMDcgMTg6MjM6MDcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBFcnJvciBvdXQgaWYgd2Ugc3RhcnQgd3JpdGluZyBkYXRhIHdpdGggc29tZSBwYWRzIG5vdCBoYXZpbmcgYSBjb2RlYyBpZCB5ZXQKKwkgIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIGEpIHVwc3RyZWFtIHNvbWVob3cgZ2V0cyBhcm91bmQgdGhlIENBUFMgZXZlbnQgZmFpbGluZworCSAgb3IgYikgdGhlcmUgbmV2ZXIgYmVpbmcgYW55IENBUFMgZXZlbnQuCisJICBUaGUgZm9sbG93aW5nIGNvZGUgYXNzdW1lcyB0aGF0IGFsbCBwYWRzIGhhdmUgYSBjb2RlYy1pZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njg1MDkKKworMjAxNi0wNy0wNyAxODoxNDo0MyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IENvbnNpc3RlbnRseSB1c2UgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQoKSBmb3Igc2V0dGluZyB0aGUgY29kZWMgaWQKKworMjAxNi0wNy0wNCAwOTo1MDoxMSArMDIwMCAgSm9uYXMgSG9sbWJlcmcgPGpvbmFzaGdAYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHJ0cGgyNjVwYXkvZGVwYXk6IFN5bmMgYWdhaW5zdCBSRkMgNzc5OAorCSAgSGFuZGxlIHNwcm9wLXZwcywgc3Byb3Atc3BzIGFuZCBzcHJvcC1wcHMgaW4gY2FwcyBpbnN0ZWFkIG9mCisJICBzcHJvcC1wYXJhbWV0ZXItc2V0cy4KKwkgIHJ0cGgyNjVwYXkgd29ya3Mgd2l0aCBieXRlLXN0cmVhbSBhbmQgaHZjMSBmb3JtYXRzIGJ1dCBub3QgaGV2MSB5ZXQuIEl0CisJICBoYW5kbGVzIHByb2ZpbGUtaWQsIHRpZXItZmxhZyBhbmQgbGV2ZWwtaWQgaW4gY2FwcyBxdWVyeS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM3NjAKKworMjAxNi0wNy0wNiAwOToyNTowMCArMDIwMCAgSmFuIEFsZXhhbmRlciBTdGVmZmVucyAoaGVmdGlnKSA8amFuLnN0ZWZmZW5zQGdtYWlsLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5oOgorCSAgZmx2ZGVtdXg6IFB1c2ggbm9taW5hbCBiaXRyYXRlIHRhZ3MKKwkgIEFkZCBwZXItc3RyZWFtIHRhZyBsaXN0cywgd2hpY2ggYXJlIHVzZWQgdG8gc2VuZCBub21pbmFsCisJICBiaXRyYXRlIHRhZ3MuIFdoZW4gcmVtdXhpbmcgRkxWID0+IEZMViwgdGhpcyBub3cgcGFzc2VzCisJICB0aHJvdWdoIHRoZSB1cHN0cmVhbSBiaXRyYXRlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2ODQ0MAorCisyMDE2LTA3LTA2IDA5OjI0OjQ5ICswMjAwICBKYW4gQWxleGFuZGVyIFN0ZWZmZW5zIChoZWZ0aWcpIDxqYW4uc3RlZmZlbnNAZ21haWwuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4Lmg6CisJICBmbHZkZW11eDogUmVmYWN0b3IgbWV0YWRhdGEgdGFnIGhhbmRsaW5nCisJICBUaGUgRkxWIGhlYWRlciBjYW5ub3QgYmUgdHJ1c3RlZCB0byBpbmRpY2F0ZSB2aWRlbyBvcgorCSAgYXVkaW8gcHJlc2VuY2UsIGFzIHRoZSBjb21tZW50cyBhbHJlYWR5IG1lbnRpb24uIERvbid0CisJICBkZWxheSBwdXNoaW5nIHRhZ3Mgd2FpdGluZyBmb3Igc3RyZWFtcyB0aGF0IG1pZ2h0IG5ldmVyCisJICBhcHBlYXIuCisJICBUYWdzIGFyZSBub3cgcHVzaGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZXkgY2hhbmdlOgorCSAgLSBBZnRlciBwYXJzaW5nIGFuIG9uTWV0YURhdGEgc2NyaXB0IG9iamVjdAorCSAgLSBBZnRlciBuZWdvdGlhdGluZyBjYXBzIG9uIGEgcGFkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY4NDQwCisKKzIwMTYtMDctMDYgMTI6NDQ6MTAgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IEFBQyBjb2RlY19kYXRhIHZhbHVlcworCSAgQXMgc2VlbiBpbiB0aGUgcGFyZW50IHN3aXRjaCBmb3Igb2JqZWN0X3R5cGVfaWQsIHRoZSA0IHBvc3NpYmxlIHZhbHVlcyBhcmUKKwkgIDB4NDAsIDB4NjYsIDB4NjcgYW5kIDB4NjguIEZpeGluZyB0aGUgbmVzdGVkIHN3aXRjaCB0byBtYXRjaCB0aGVzZSB2YWx1ZXMuCisJICBMb29rcyBsaWtlIGl0IHdhcyBhIHR5cG8gbWFraW5nIHRoZW0gZGVjaW1hbCBpbnN0ZWFkIG9mIGhleGFkZWNpbWFsLgorCSAgQ0lEIDEzNjMzMjgKKworMjAxNi0wNy0wNiAxMzo1MTowMyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjkuMSA9PT0KKworMjAxNi0wNy0wNiAxMzowNjo0NCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS45LjEKKworMjAxNi0wNy0wNiAxMTo0NjoyNiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxNi0wNy0wNiAxMToyMjo1MyArMDMwMCAgU3RldmVuIEhvdmluZyA8c2hAYmlnYnJvdGhlci5ubD4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogRml4IGVycm9yIG1lc3NhZ2VzIHRvIGZpcnN0IGNvbnZlcnQgdG8gZG91YmxlcyBiZWZvcmUgZGl2aXNpb24KKworMjAxNi0wNy0wNiAxMDoxODozMCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vZGEucG86CisJKiBwby9oci5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vc2sucG86CisJICBwbzogVXBkYXRlIHRyYW5zbGF0aW9ucworCisyMDE2LTA3LTA1IDIxOjExOjM1ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBTZXQgdG8gUExBWUlORyBhZnRlciBhIHNlZWsgYWdhaW4gYWZ0ZXIgc2V0dGluZyB1cCB0aGUgc2VnbWVudCBhbmQgZXZlcnl0aGluZyBlbHNlCisJICBUaGVyZSdzIGEgc21hbGwgd2luZG93IGZvciBhIHJhY2UgY29uZGl0aW9uIG90aGVyd2lzZS4KKworMjAxNi0wNy0wNCAxNzo0NTo0MCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkgIHF0bXV4OiBVc2UgY29tcGxldGUgQUFDIGNhcHMgd2l0aCBjb2RlY19kYXRhIGluIHRoZSB0ZXN0cworCisyMDE2LTA3LTA0IDE2OjU4OjM4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogUmVqZWN0IHJhdyBBQUMgaWYgbm8gY29kZWNfZGF0YSBpcyBmb3VuZCBpbiB0aGUgY2FwcworCSAgSWYgbmVjZXNzYXJ5LCBhIGRlbXV4ZXIgd2lsbCBoYXZlIHRvIGludmVudCBzb21ldGhpbmcgaGVyZSBidXQgdGhpcyBpcyBvbmx5IGEKKwkgIHByb2JsZW0gd2l0aCBub24tY29uZm9ybWFudCBmaWxlcyBhbnl3YXkuCisKKzIwMTYtMDctMDQgMTY6NTU6MzIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogSW52ZW50IEFBQyBjb2RlY19kYXRhIGlmIG5vbmUgaXMgcHJlc2VudAorCSAgV2l0aG91dCwgcmF3IEFBQyBjYW4ndCBiZSBoYW5kbGVkIGFuZCB3ZSBoYXZlIHNvbWUgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGluCisJICB0aGUgZGVjb2RlciB0aGF0IG1vc3QgbGlrZWx5IGFsbG93cyB1cyB0byBkZWNvZGUgdGhlIHN0cmVhbSBpbiBvbmUgd2F5IG9yCisJICBhbm90aGVyLiBUaGlzIGlzIHRoZSBzYW1lIGNvZGUgYWxyZWFkeSB1c2VkIGJ5IG1hdHJvc2thZGVtdXggZm9yIHRoZSBzYW1lCisJICByZWFzb25zLCBhbmQgZmZtcGVnL3ZsYyBwbGF5IHN1Y2ggZmlsZXMganVzdCBmaW5lIHRvbyBieSBndWVzc3dvcmsuCisKKzIwMTYtMDctMDQgMTQ6NTQ6MTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBSZWplY3QgcmF3IEFBQyBjYXBzIHdpdGhvdXQgY29kZWNfZGF0YQorCSAgVGhlIHJlc3VsdGluZyBmaWxlIGlzIG5vdCBnb2luZyB0byBiZSBwbGF5YWJsZSB3aXRob3V0IGd1ZXNzd29yayBhbmQgcmF3IGNhcHMKKwkgIHNob3VsZCBhbHdheXMgaGF2ZSBjb2RlY19kYXRhLgorCisyMDE2LTA1LTEwIDE1OjQ4OjQ5ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJICBxdGRlbXV4OiBIYW5kbGUgdXBzdHJlYW0gR0FQIGluIHB1c2gtbW9kZS90aW1lIHNlZ21lbnQKKwkgIFRoaXMgaXMgdG8gaGFuZGxlIGNhc2VzIHdoZXJlIHVwc3RyZWFtIGhhbmRsZXMgdGhlIGZyYWdtZW50ZWQgc3RyZWFtaW5nIGluIFRJTUUKKwkgIHNlZ21lbnRzIGFuZCBzZW5kcyB1cyBkYXRhIHdpdGggZ2FwcyB3aXRoaW4gZnJhZ21lbnRzLiBUaGlzIHdvdWxkIGhhcHBlbiB3aGVuIGRlYWxpbmcKKwkgIHdpdGggdHJpY2stbW9kZXMuCisJICBXaGVuIHVwc3RyZWFtIChwdXNoLWJhc2VkLCBUSU1FIFNFR01FTlQpIHdpc2hlcyB0byBzZW5kIGRpc2NvbnRpbnVvdXMgc2FtcGxlcywKKwkgIGl0IG11c3Qgb2JleSB0aGUgZm9sbG93aW5nIHJ1bGVzOgorCSAgKiBUaGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFttb29mXSBtdXN0IGhhdmUgYSB2YWxpZCBHU1RfQlVGRkVSX09GRlNFVAorCSAgKiBUaGUgYnVmZmVycyBjb250YWluaW5nIHRoZSBmaXJzdCBzYW1wbGUgYWZ0ZXIgYSBnYXA6CisJICAqIE1VU1Qgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHNhbXBsZSwKKwkgICogTVVTVCBoYXZlIHRoZSBESVNDT05UIGZsYWcgc2V0LAorCSAgKiBNVVNUIGhhdmUgYSB2YWxpZCBHU1RfQlVGRkVSX09GRlNFVCByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmcmFnbWVudC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjczNTQKKworMjAxNi0wNy0wMSAxMTo1NDo1NyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL3Y0bDIvdjRsMi11dGlscy5jOgorCSAgdjRsMjogZml4IHBvdGVudGlhbCBkb3VibGUtZnJlZSBvZiBlcnJvciBkZWJ1ZyBzdHJpbmcKKwkgIGdzdF92NGwyX2NsZWFyX2Vycm9yKCkgZG9lc24ndCB3b3JrIGxpa2UgZ19jbGVhcl9lcnJvcigpLCBpdAorCSAgZG9lc24ndCBOVUxMaWZ5IHRoZSBwb2ludGVyLCBzbyBzZXQgZnJlZWQgZGVidWcgc3RyaW5nIHRvIE5VTEwKKwkgIHNvIGl0IGRvZXNuJ3QgZ2V0IGZyZWVkIGFnYWluIGlmIGdzdF92NGwyX2NsZWFyX2Vycm9yKCkgaXMKKwkgIGNhbGxlZCB0d2ljZSBvbiB0aGUgZXJyb3IuCisJICBDSUQgMTM2MjkwMQorCisyMDE2LTA3LTAxIDEwOjA1OjAwICswMDAwICBCcmFkIExhY2tleSA8YmxhY2tleUBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IERvbid0IGRpc2FibGUgVURQIHByb3RvY29scyBvbiByZWRpcmVjdGluZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2ODIzMgorCisyMDE2LTA3LTAxIDE3OjI4OjE3ICswOTAwICBTZXVuZ2hhIFlhbmcgPHNoLnlhbmdAbGdlLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBQdXNoIGNhcHMgb25seSB3aGVuIGl0IHdhcyB1cGRhdGVkCisJICBDb21taXQgNzg3M2JlZGUzMTM0YjE1ZTUwNjZlOGQxNGU1NGQxZjUwNTRkMjA2MyBjYXVzZWQgbmV3IGNhcHMKKwkgIGV2ZW50IHBlciBtb29mIHdpdGhvdXQgY29uc2lkZXJhdGlvbiBvZiBkdXBsaWNhdGlvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjgyNjgKKworMjAxNi0wNi0zMCAxNTowMTo0NiArMDIwMCAgSm9uYXMgSG9sbWJlcmcgPGpvbmFzaGdAYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmM6CisJICBydHBoMjY1ZGVwYXk6IGZpeCBpbnZhbGlkIG1lbW9yeSBhY2Nlc3MKKwkgIDEwIGJ5dGVzIHdhcyBhbGxvY2F0ZWQgZm9yIHN0cmVhbV9mb3JtYXQgYnV0IHNpemUgb2YgImJ5dGUtc3RyZWFtIiBpcworCSAgbW9yZS4gVXNlIGdfc3RyZHVwKCkgaW5zdGVhZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM3NjAKKworMjAxNi0wNi0yOSAyMzozMToyMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzoKKwkgIHNob3V0MjogVXNlIGEgbm9uLXRpbWVyIEdzdFBvbGwKKwkgIE90aGVyd2lzZSBzZXRfZmx1c2hpbmcoKSB3aWxsIGhhdmUgdW5kZWZpbmVkIHNlbWFudGljcyBhbmQgbm93YWRheXMgY2F1c2VzIGEKKwkgIGdfY3JpdGljYWwoKSB0byB3YXJuIGFib3V0IHRoYXQuCisKKzIwMTYtMDYtMTkgMDI6MDg6MjUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzYW50b3NAZ21haWwuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuaDoKKwkgIHNvdXBodHRwc3JjOiBkeW5hbWljYWxseSBhZGp1c3QgYmxvY2tzaXplCisJICBVcGRhdGUgdGhlIGJsb2Nrc2l6ZSBkZXBlbmRpbmcgb24gaG93IG11Y2ggaXMgb2J0YWluZWQgZnJvbSBhIHJlYWQKKwkgIG9mIHRoZSBpbnB1dCBzdHJlYW0uIFRoaXMgYXZvaWRzIGRvaW5nIHRvbyBtYW55IHJlYWRzIGluIHNtYWxsIGNodW5rcworCSAgd2hlbiBsYXJnZXIgYW1vdW50cyBvZiBkYXRhIGFyZSBhdmFpbGFibGUgYW5kIGFsc28gcHJldmVudHMgdXNpbmcKKwkgIGEgdmVyeSBsYXJnZSBtZW1vcnkgYXJlYSB0byByZWFkIGEgc21hbGwgY2h1bmsgb2YgZGF0YS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njc4MzMKKworMjAxNi0wNi0yOCAxNjo0NDo1MCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogV2luZG93cyBoYXMgbm8gaXBpX3NwZWNfZHN0IGluIHN0cnVjdCBpbl9wa3RpbmZvCisKKzIwMTYtMDYtMjggMTU6MTU6MTQgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6ICNkZWZpbmUgX19BUFBMRV9VU0VfUkZDXzM1NDIgdG8gYmUgYWJsZSB0byB1c2UgSVBWNl9QS1RJTkZPIG9uIE9TWC9pT1MKKworMjAxNi0wNi0yOCAxNTowODowNCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogTW92ZSAjaW5jbHVkZXMgYXJvdW5kIHRvIGEpIHdvcmsgYXJvdW5kIGJyb2tlbiBnbGliYyBoZWFkZXIgYW5kIGIpIFdpbmRvd3MKKworMjAxNi0wNi0yOCAxNDoyNTowMyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogRml4IGNvbXBpbGF0aW9uIG9uIFdpbmRvd3MgYW5kICpCU0QvT1NYCisKKzIwMTYtMDYtMjMgMjA6MjE6NTkgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IEZpbHRlciBvdXQgbXVsdGljYXN0IHBhY2tldHMgdGhhdCBhcmUgbm90IGZvciBvdXIgbXVsdGljYXN0IGFkZHJlc3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njc5ODAKKworMjAxNi0wNi0yOCAxMDo1NzoyNyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogV2hlbiBzZWVraW5nLCBjb25zaWRlciB0aGUgY3VycmVudCBlbGVtZW50IHN0YXRlIG9yIHBlbmRpbmcgc3RhdGUgaW5zdGVhZCBvZiB0aGUgUlRTUCBzdGF0ZQorCSAgSWYgd2UgY29uc2lkZXIgdGhlIFJUU1Agc3RhdGUsIHdoYXQgY2FuIGhhcHBlbiBpcyB0aGF0IGl0IGlzIFBMQVlJTkcgYnV0IHRoZQorCSAgZWxlbWVudCBhbHJlYWR5IGFzeW5jaHJvbm91c2x5IHRyaWVkIHRvIFBBVVNFIGFuZCBpdCBqdXN0IGRpZCBub3QgaGFwcGVuIHlldC4KKwkgIFdlIHdvdWxkIHRoZW4gb3ZlcnJpZGUgdGhpcyBzZXR0aW5nIHRvIFBBVVNFRCAod2hpbGUgdGhlIGVsZW1lbnQgYWN0dWFsbHkgaXMKKwkgIGluIFBBVVNFRCkgYW5kIHNldCB0aGUgUlRTUCBzdGF0ZSB0byBQTEFZSU5HIGFnYWluLiBUaGlzIHdvdWxkIHRoZW4gY2F1c2UgdXMKKwkgIHRvIHByb2R1Y2UgcGFja2V0cyB3aGlsZSB0aGUgc2lua3MgYXJlIGFsbCBQQVVTRUQsIHBpbGluZyB1cCB0aG91c2FuZHMgb2YKKwkgIHBhY2tldHMgaW4gdGhlIHJ0cGppdHRlcmJ1ZmZlciBhbmQgb3RoZXIgZWxlbWVudHMgYW5kIGZpbmFsbHkgZmFpbGluZy4KKworMjAxNi0wNi0yNyAwOToyMDozNSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IEFkZCBjb21tZW50IGFib3V0IEgyNjMvTVBFRzRQMiBiZWluZyBub24tc3RhbmRhcmQgZm9yIEZMVgorCSAgVGhleSBhcmUgaG93ZXZlciBzdXBwb3J0ZWQgYnkgZmZtcGVnIGFuZCBhcHBhcmVudGx5IHVzZWQgb3V0IHRoZXJlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2ODAwNgorCisyMDE2LTA2LTI0IDE0OjQ4OjUzICswMzAwICBWaXZpYSBOaWtvbGFpZG91IDx2aXZpYUBhaGlydS5ldT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IEFkZCBzdXBwb3J0IGZvciBIMjYzIGFuZCBNUEVHNCBwYXJ0MgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2ODAwNgorCisyMDE2LTA2LTIxIDE3OjEwOjU2IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgIFVwZGF0ZSBwbHVnaW5zIGRvYworCSAgVGhpcyBpcyBwYXJ0bHkgYXV0b21hdGVkIHVzaW5nICJtYWtlIHVwZGF0ZSIgaW4gZG9jcy9wbHVnaW5zLCBidXQgYWxzbworCSAgcmVxdWlyZWQgbWFudWFsIG1lcmdlLiBBZGRpdGlvbmFsbHksIG1pc3NpbmcgcGx1Z2lucyBhbmQgZWxlbWVudHMgaGF2ZQorCSAgYmVlbiBhZGRlZC4KKworMjAxNi0wNi0yMSAxNzo1MTozOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc3BsaXRtdXguYzoKKwkgIHRlc3RzOiBzcGxpdG11eDogc2tpcCB0ZXN0cyBpZiB0aGVvcmEgb3Igb2dnIHBsdWdpbnMgYXJlIG5vdCBhdmFpbGFibGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njc4NjEKKworMjAxNi0wNi0yMSAxMTo0NjoxMyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gYWMyZjY0NyB0byBmMzYzYjMyCisKKzIwMTYtMDYtMjEgMDc6NDA6NDIgLTA0MDAgIEFhcm9uIEJveGVyIDxib3hlcmFiQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkgIGdzdHJ0cGoya3BheTogdXNlIHRpbGUgYml0IGFuZCB0aWxlIG51bWJlciB0byBkZXRlcm1pbmUgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHRpbGVzIGluIHBhY2tldAorCSAgTm93IHdlIGRvbid0IGhhdmUgdG8gcmVseSBvbiBhIHNwZWNpYWwgdmFsdWUgZm9yIHRoZSB0aWxlIG51bWJlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njc4MTcKKworMjAxNi0wNi0yMSAwOTozNDo1NiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkgIHJ0cGoya3BheTogZml4IGNvbXBpbGVyIHdhcm5pbmcgb24gT1MvWAorCSAgZ3N0cnRwajJrcGF5LmM6MzY0OjIxOiBlcnJvcjogaW1wbGljaXQgdHJ1bmNhdGlvbiBmcm9tICdpbnQnIHRvIGJpdGZpZWxkIGNoYW5nZXMgdmFsdWUgZnJvbSAtMSB0byA2NTUzNQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzgxNworCisyMDE2LTA2LTIxIDA5OjM0OjM3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSAgZG9jczogdXBkYXRlCisKKzIwMTYtMDUtMTYgMTc6MzE6NTggKzAyMDAgIEd1aWxsYXVtZSBEZXNtb3R0ZXMgPGd1aWxsYXVtZS5kZXNtb3R0ZXNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jYXBzc2V0dGVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pY3lkZW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvanBlZ2VuYy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdWRwc3JjLmM6CisJICBmaXggYnVmZmVyIGxlYWtzIGluIHRlc3RzCisJICBOZWVkIHRvIGNhbGwgZ3N0X2NoZWNrX2Ryb3BfYnVmZmVycygpIHRvIHJlbGVhc2UgdGhlIGJ1ZmZlcnMgZXhjaGFuZ2VkCisJICBkdXJpbmcgdGhlIHRlc3QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY2NTYxCisKKzIwMTYtMDUtMTcgMTI6NTI6NDMgKzAzMDAgIEd1aWxsYXVtZSBEZXNtb3R0ZXMgPGd1aWxsYXVtZS5kZXNtb3R0ZXNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbnRlcmxlYXZlLmM6CisJICBpbnRlcmxlYXZlOiBmaXggbWVzc2FnZSBsZWFrcyBpbiB0ZXN0CisJICBGbHVzaCB0aGUgYnVzIHdoZW4gY2xlYW5pbmcgdXAgc28gcGVuZGluZyBtZXNzYWdlcyBhcmUgZGVzdHJveWVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjU2MQorCisyMDE2LTA1LTE3IDEyOjU4OjA2ICswMzAwICBHdWlsbGF1bWUgRGVzbW90dGVzIDxndWlsbGF1bWUuZGVzbW90dGVzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogZml4IGV2ZW50IGxlYWtzIGluIHRlc3QKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjY1NjEKKworMjAxNi0wNS0xMyAxNToxMjoyMiArMDIwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOgorCSAgZGVpbnRlcmxlYXZlOiBmaXggbGVha3MKKwkgIC0gRmx1c2ggdGhlIGJ1cyBzbyBtZXNzYWdlcyBhcmVuJ3QgbGVha2VkCisJICAtIEZpeCBwYWQgbGVhaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjU2MQorCisyMDE2LTA2LTE3IDE1OjI5OjE2ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IERlcHJlY2F0ZWQgc3Byb3AtcGFyYW1ldGVyLXNldCBwcm9wZXJ0eQorCSAgVGhpcyBpcyBzdXBwb3NlZCB0byBiZSBlaXRoZXIgaW4gdGhlIGNvZGVjX2RhdGEgKGF2YyBzdHJlYW0gZm9ybWF0KSBvciBpbnNpZGUKKwkgIHRoZSBzdHJlYW0sIGFuZCB3ZSBleHRyYWN0IGl0IGZyb20gdGhlcmUuIEl0IHNob3VsZCBub3QgYmUgc2V0IGZyb20gYQorCSAgcHJvcGVydHkgYXMgaXQncyBzdHJlYW0gc3BlY2lmaWMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY3Nzg5CisKKzIwMTYtMDYtMTcgMTI6MTY6MzIgLTA3MDAgIEFsZWl4IENvbmNoaWxsbyBGbGFxdcOpIDxhbGVpeEBvYmxvbmcuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBtYWtlIGFsbCBzcnRwIGVuY29kZXIgcHJvcGVydGllcyBleHBsaWNpdAorCSAgVGhlIFNlc3Npb24gRGF0YSBQcm90b2NvbCBkb2Vzbid0IGFsbG93IHNwZWNpZnlpbmcgYSBjaXBoZXIgZm9yIHRoZQorCSAgU1JUQ1AsIHNvIGl0IHdpbGwgdXNlIHRoZSBTUlRQIG9uZS4gSW4gdGhlICJzcnRwZW5jIiBlbGVtZW50IHRoZSBjaXBoZXIKKwkgICJhZXMtMTI4LWljbSIgaXMgdGhlIGRlZmF1bHQgZm9yIFNSVFAgYW5kIFNSVENQLCBidXQgaWYgd2Ugd2FudCB0byBoYXZlCisJICBhbiBTUlRDUCB3aXRoIHRoZSAiYWVzLTI1Ni1pY20iIGNpcGhlciB0aGVuIHdlIGFsc28gbmVlZCB0byBzZXQgdGhlIFNSVFAKKwkgIGNpcGhlciB0byAiYWVzLTI1Ni1pY20iLCBvdGhlcndpc2UgImFlcy0xMjgtaWNtIiB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njc3OTkKKworMjAxNi0wNi0xNyAxOTo1OToxMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cC5jOgorCSAgc291cDogd29yayBhcm91bmQgZnJlcXVlbnQgZGVhZGxvY2tzIGluIEdMaWIgdHlwZSBpbml0aWFsaXNhdGlvbgorCSAgLi4gYnkgcmVnaXN0ZXJpbmcgdGhlIHR5cGVzIGZyb20gdGhlIHBsdWdpbiBpbml0IGZ1bmN0aW9uLiBUaGlzCisJICBzZWVtcyB0byBoZWxwLCBidXQgd2UnbGwgc2VlIGlmIGl0J3MgZW5vdWdoIChtaWdodCBuZWVkIHNpbWlsYXIKKwkgIHRoaW5ncyBlbHNld2hlcmUpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MzkxMQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NDg4NQorCisyMDE2LTA2LTE3IDE2OjA4OjA4ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogVGhlIHByb3JlcyB2YXJpYW50IGlzIHN0b3JlZCBpbiB0aGUgdmFyaWFudCBmaWVsZCwgbm90IGZvcm1hdAorCSAgQW5kIHRoZSBjYXBzIGluIHRoZSBzaW5rIHBhZCB0ZW1wbGF0ZSBhbHJlYWR5IHVzZWQgdmFyaWFudCAob25seSkuCisKKzIwMTYtMDYtMTcgMTM6MDA6NDggKzAyMDAgIEpvbmFzIEhvbG1iZXJnIDxqb25hc2hnQGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5oOgorCSAgcnRwaDI2NXBheTogUmVtb3ZlIHNwcm9wLXBhcmFtZXRlci1zZXRzIHByb3BlcnR5CisJICBUaGVyZSBpcyBubyB2YWxpZCB1c2UgY2FzZSB3aGVuIHRoaXMgcHJvcGVydHkgaXMgbmVlZGVkIHNpbmNlIHRoZSB2YWx1ZXMKKwkgIG11c3QgYmUgaW4gZWl0aGVyIGNvZGVjX2RhdGEgb3IgYnVmZmVyIGRhdGEuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzNzYwCisKKzIwMTYtMDYtMTAgMTY6MTc6MjYgKzAyMDAgIEpvbmFzIEhvbG1iZXJnIDxqb25hc2hnQGF4aXMuY29tPgorCisJKiBkb2NzL3BsdWdpbnMvc2Nhbm9iai1idWlsZC5zdGFtcDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSAgcnRwaDI2NXBheTogUmVhZCBOQUxVIHR5cGUgdGhlIHNhbWUgd2F5IGV2ZXJ5d2hlcmUKKwkgIENvc21ldGljIGNoYW5nZSB0byByZWFkIE5BTFUgdHlwZSBpbiBnc3RfcnRwX2gyNjVfcGF5X2RlY29kZV9uYWwoKSB0aGUKKwkgIHNhbWUgd2F5IGFzIGluIG90aGVyIHBsYWNlcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM3NjAKKworMjAxNi0wNi0xNyAxMzo1ODozMyArMDIwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBydHBqaXR0ZXJidWZmZXI6IGZpeCBSVFBKaXR0ZXJCdWZmZXJNb2RlIGRvY3VtZW50YXRpb24KKwkgIERvY3VtZW50YXRpb24gbGFja3MgJ0AnIGJlZm9yZSBlYWNoIGVudW0gdmFsdWVzIGFuZCB0aGVyZSB3YXMgYW4gZXh0cmEKKwkgIGxpbmUgYWZ0ZXIgc3ltYm9sIHNlY3Rpb24gd2hpY2ggY29uZnVzZXMgR1RLLURvYyBwYXJzZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY3Nzg4CisKKzIwMTYtMDUtMjMgMTA6MTg6NDggKzAyMDAgIE1pZ3VlbCBQYXLDrXMgRMOtYXogPG1wYXJpc2RpYXpAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiB0YWtlIHRoZSBsb2NrIHdoZW4gY2hhbmdpbmcgc3RhdHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjYwMjUKKworMjAxNi0wNi0xNSAxMToxOTo0MyArMDIwMCAgSsO8cmdlbiBTbG93YWNrIDxqdXJnZW4uc2xvd2Fja0BiYXJjby5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSAgcnRwaDI2NTogZml4IE5BTCB1bml0IHR5cGUgcGFyc2luZyBhbmQgU1BTL1BQUy9WUFMgZGV0ZWN0aW9uCisJICBGaXhlcyBzcHMvcHBzL3ZwcyBpbnNlcnRpb24gdmlhIHRoZSBjb25maWctaW50ZXJ2YWwgcHJvcGVydHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy8vc2hvd19idWcuY2dpP2lkPTc2NzY4MAorCisyMDE2LTA2LTExIDEyOjE2OjAzICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvc2ltcGxlLWxhdW5jaC1saW5lcy5jOgorCSAgc2ltcGxlLWxhdW5jaC1saW5lczogVXNlIGNvcnJlY3QgSlBFRzIwMDAgY2FwcworCisyMDE2LTA2LTEwIDEzOjQzOjA5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogZml4IGluZGVudGF0aW9uCisKKzIwMTYtMDYtMTAgMTM6NDI6MDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBmaXggZGF0ZSBwYXJzaW5nIHdoZW4gdGhlcmUgYXJlIHRyYWlsaW5nIHNwYWNlcworCSAgRml4ZXMgcGFyc2luZyBvZiAiVGh1IE1heSAxMSAxNTo1Nzo0NiAyMDA2ICIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY3NDk2CisKKzIwMTYtMDUtMTMgMTU6MDg6MjQgLTA0MDAgIEFhcm9uIEJveGVyIDxib3hlcmFiQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtjb21tb24uaDoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJICBnc3RydHBqMms6IHNldCBzYW1wbGluZyBmaWVsZCByZXF1aXJlZCBieSBSRkMKKwkgIFRoaXMgZmllbGQgaXMgbm93IHJlcXVpcmVkIGluIHRoZSBzaW5rIGNhcHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY2MjM2CisKKzIwMTYtMDYtMDkgMDk6MzA6NDggKzA5MDAgIFNldW5naGEgWWFuZyA8c2gueWFuZ0BsZ2UuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogRml4IHVucmVmIGFzc2VydGlvbiBmYWlsdXJlCisJICBGaXggdW5yZWYgYXNzZXJ0aW9uIGZhaWx1cmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njc0MjQKKworMjAxNi0wNS0xNCAxNDo0NjoxNyArMDIwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IFdvcmsgd2l0aCBub24tVElNRSBzZWdtZW50cworCSAgV2l0aCBub24tdGltZSBzZWdtZW50cywgaXQgbm93IGFzc3VtZXMgdGhhdCB0aGUgYXJyaXZhbCB0aW1lIG9mIHBhY2tldHMKKwkgIGlzIG5vdCByZWxldmFudCBhbmQgdGhhdCBvbmx5IHRoZSBSVFAgdGltZXN0YW1wIG1hdHRlciBhbmQgaXQgcHJvZHVjZXMKKwkgIGFuIG91dHB1dCBzZWdtZW50IHN0YXJ0IGF0IHJ1bm5pbmcgdGltZSAwLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjQzOAorCisyMDE2LTA2LTA3IDIwOjUzOjM0IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJICBwbmdkZWM6IFdhaXQgZm9yIHNlZ21lbnQgZXZlbnQgYmVmb3JlIGNoZWNraW5nIGl0CisJICBUaGUgaGV1cmlzdGljIHRvIGNob29zZSBiZXR3ZWVuIHBhY2tldGlzZSBvciBub3Qgd2FzIGNoYW5nZWQgdG8gdXNlIHRoZQorCSAgc2VnbWVudCBmb3JtYXQuIFRoZSBwcm9ibGVtIGlzIHRoYXQgdGhpcyBjaGFuZ2UgaXMgcmVhZGluZyB0aGUgc2VnbWVudAorCSAgZHVyaW5nIHRoZSBjYXBzIGV2ZW50IGhhbmRsaW5nLiBUaGUgc2VnbWVudCBldmVudCB3aWxsIG9ubHkgYmUgc2VudAorCSAgYWZ0ZXIuIFRoYXQgcHJldmVudGVkIHRoZSBkZWNvZGVyIHRvIGdvIGluIHBhY2tldGl6ZSBtb2RlLCBhbmQgYXZvaWQKKwkgIHVzZWxlc3MgcGFyc2luZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzYyNTIKKworMjAxNi0wNi0wNiAxNzowMDoyMiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBXYWl0IGZvciBzZWdtZW50IGV2ZW50IGJlZm9yZSBjaGVja2luZyBpdAorCSAgVGhlIGhldXJpc3RpYyB0byBjaG9vc2UgYmV0d2VlbiBwYWNrZXRpc2Ugb3Igbm90IHdhcyBjaGFuZ2UgdG8gdXNlIHRoZQorCSAgc2VnbWVudCBmb3JtYXQuIFRoZSBwcm9ibGVtIGlzIHRoYXQgdGhpcyBjaGFuZ2UgaXMgcmVhZGluZyB0aGUgc2VnbWVudAorCSAgZHVyaW5nIHRoZSBjYXBzIGV2ZW50IGhhbmRsaW5nLiBUaGUgc2VnbWVudCBldmVudCB3aWxsIG9ubHkgYmUgc2VudAorCSAgYWZ0ZXIuIFRoYXQgcHJldmVudGVkIHRoZSBkZWNvZGVyIHRvIGdvIGluIHBhY2tldGl6ZSBtb2RlLCBhbmQgYXZvaWQKKwkgIHVzZWxlc3MgcGFyc2luZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzYyNTIKKworMjAxNi0wNi0wNyAxNjo0MjowOSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogS2VlcCBwYXJ0IG9mIHRoZSBpbnB1dCBidWZmZXIKKwkgIEluc3RlYWQgb2YgY29tcGxldGVseSBnZXR0aW5nIHJpZCBvZiB0aGUgaW5wdXQgYnVmZmVyLCBjb3B5CisJICB0aGUgbWV0YWRhdGEsIHRoZSBmbGFncyBhbmQgdGhlIHRpbWVzdGFtcCBpbnRvIGFuIGVtcHR5IGJ1ZmZlci4KKwkgIFRoaXMgd2F5IHRoZSBkZWNvZGVyIGJhc2UgY2xhc3MgY2FuIGNvcHkgdGhhdCBpbmZvcm1hdGlvbiBhZ2FpbgorCSAgdG8gdGhlIG91dHB1dCBidWZmZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU4NDI0CisKKzIwMTYtMDYtMDcgMTY6NDE6NTggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmM6CisJICB2NGwydmlkZW9kZWM6IENvZGluZyBzdHlsZSBmaXhlcworCisyMDE2LTA2LTA3IDE2OjA5OjIzIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IENvZGluZyBzdHlsZSBmaXhlcworCisyMDE2LTA2LTA3IDE2OjA0OjUyIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDI6IEFkZCBhbiBlcnJvciByZXR1cm4gdG8gX3RyeS9fc2V0X2Zvcm1hdAorCSAgVGhpcyB3YXkgb25lIGNhbiBlYXNpbHkgaWdub3JlIGVycm9ycy4gUHJldmlvdXNseSwgZXJyb3Igd2VyZSBhbHdheXMKKwkgIHBvc3RlZCBvbnQgaGUgYnVzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjE3MgorCisyMDE2LTA2LTA3IDE2OjAxOjU1IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL3Y0bDItdXRpbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDItdXRpbHMuaDoKKwkgIHY0bDItdXRpbDogSW50cm9kdWNlIEdzdFY0bDJFcnJvcgorCSAgVGhpcyBpcyB0byBhbGxvdyByZXR1cm5pbmcgYW4gZXJyb3IgdGhhdCBjYW4gZWFzaWx5IGJlIHNlbnQgYXMKKwkgIG1lc3NhZ2UgdG8gdGhlIGFwcGxpY2F0aW9uIGlmIHRoZSBlbGVtZW50IG5lZWRzIGl0LiBVc2luZyB0aGlzCisJICBhbHNvIGFsbG93IGlnbm9yaW5nIGVycm9ycy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjYxNzIKKworMjAxNi0wNi0wNyAxMjo0MToxOSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBBdm9pZCBkZWNpZGUgYWxsb2NhdGlvbiBvbiBhY3RpdmUgcG9vbAorCSAgdjRsMnNyYyB3aWxsIHJlbmVnb3RpYXRlIG9ubHkgaWYgdGhlIGZvcm1hdCBoYXZlIGNoYW5nZWQuIEFzIG9mIG5vdywKKwkgIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgYWxsb2NhdGlvbncgd2l0aG91dCByZXNldHRpbmcgdGhlCisJICBjYW1lcmEuIFRvIGF2b2lkIHVud2FudGVkIHNpZGUgZWZmZWN0LCBzaW1wbHkga2VlcCB0aGUgb2xkIGFsbG9jYXRpb24KKwkgIGlmIG5vIHJlbmVnb3RpYXRpb24gaXMgdGFraW5nIHBsYWNlLiBUaGlzIGZpeGVzIGFzc2VydGlvbiBhbmQgcG9zc2libGUKKwkgIGZhaWx1cmVzIGluIFVTRVJQVFIgb3IgRE1BQlVGIGltcG9ydCBtb2RlICh3aGVuIHVzaW5nIGRvd25zdHJlYW0gcG9vbHMpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NDA0MgorCisyMDE2LTA0LTI4IDEzOjQ0OjQ5ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5oOgorCSAgcXRkZW11eDogU2hvdyBzdGF0ZSBuYW1lIGluIGRlYnVnZ2luZworCSAgTWFrZXMgaXQgZWFzaWVyIHRvIHRyYWNlIHdoYXQncyBnb2luZyBvbgorCisyMDE2LTA1LTEwIDE1OjQ1OjQyICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFJlbW92ZSB1c2VsZXNzIHZhcmlhYmxlCisJICBUaGF0IHZhcmlhYmxlIGlzIG9ubHkgbmVlZGVkIGZvciBhIGRlYnVnIHN0YXRlbWVudCwgbW92ZSBpdCB0aGVyZQorCisyMDE2LTA1LTEwIDE1OjEwOjM2ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5oOgorCSAgcXRkZW11eDogQWRkL0ZpeCBjb21tZW50cyBvbiB0aGUgdmFyaW91cyBzdHJ1Y3R1cmUgdmFyaWFibGVzCisJICBObyB2YXJpYWJsZXMgd2VyZSBhZGRlZC9yZW1vdmVkLiBUaGlzIHdhcyBqdXN0IGEgZ29vZCBleGN1c2UgdG86CisJICAqIENvbW1lbnQgd2hhdCBtb3N0IHZhcmlhYmxlcyBhcmUgdXNlZCBmb3IgKGFuZCB3aGVuKQorCSAgKiBPcmRlciB0aGVtIGluIHN1Y2ggYSB3YXkgYXMgdG8gc2hvdyBmaXJzdCB0aGUgY29tbW9uIHZhcmlhYmxlcyB1c2VkCisJICBpbiBhbGwgY2FzZXMsIGZvbGxvd2VkIGJ5IHRob3NlIG9ubHkgdXNlZCBpbiBwdXNoLW1vZGUKKworMjAxNi0wNS0xMCAxNTowNzo0MCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBSZW1vdmUgdW51c2VkIHN0cnVjdHVyZQorCSAgTGV0J3MganVzdCByZW1vdmUgaXQsIGJlZW4gY29tbWVudGVkIGZvciA3KyB5ZWFycyA6KQorCisyMDE1LTA5LTAyIDExOjQ4OjI5ICswMjAwICBQaGlsaXBwIFphYmVsIDxwLnphYmVsQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogdXNlIGRlY29kZXIgc3RvcCBjb21tYW5kIGluc3RlYWQgb2YgcXVldWVpbmcgZW1wdHkgYnVmZmVycworCSAgT25seSBpZiB0aGUgZGVjb2RlciBzdG9wIGNvbW1hbmQgZmFpbHMsIGtlZXAgcXVldWVpbmcgZW1wdHkgYnVmZmVycyB0bworCSAgc2lnbmFsIGVuZCBvZiBzdHJlYW0gYXMgYmVmb3JlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMzg2NAorCisyMDE0LTEyLTEyIDE0OjMxOjM2ICswMTAwICBQZXRlciBTZWlkZXJlciA8cHMucmVwb3J0QGdteC5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBhZGQgZ3N0X3Y0bDJfZGVjb2Rlcl9jbWQgaGVscGVyCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMzODY0CisKKzIwMTYtMDYtMDEgMjA6Mjg6MzkgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRm9yd2FyZCBzZWdtZW50cyBkaXJlY3RseSBpZiB3ZSBhcmUgb3BlcmF0aW5nIGluIFBVU0ggbW9kZSBvbiBmcmFnbWVudGVkIHN0cmVhbXMKKwkgIFdlIHNob3VsZG4ndCBnbyB0aHJvdWdoIHNlZ21lbnQgYWN0aXZhdGlvbiBhcyB3ZSB3aWxsIG9ubHkgaGF2ZSBhIGxpbWl0ZWQKKwkgIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSB3aG9sZSBzdHJlYW0gdGltZWxpbmUgbG9va3MgbGlrZSBmcm9tIHRoZSBtb29mLiBXZQorCSAgb25seSBrbm93IGFib3V0IHRoZSBjdXJyZW50IGZyYWdtZW50LCB3aGlsZSB1cHN0cmVhbSBrbm93cyBhYm91dCB0aGUgd2hvbGUKKwkgIHN0cmVhbS4KKwkgIFRoaXMgZml4ZXMgc2Vla2luZyBpbiBEQVNIIHN0cmVhbXMsIGJvdGggZm9yIHNlZWtzIGFmdGVyIHRoZSBjdXJyZW50IG1vb2YgYW5kCisJICBmb3Igc2Vla3MgaW50byB0aGUgY3VycmVudCBtb29mLiBUaGUgZm9ybWVyIHdvdWxkIGZhaWwgYmVjYXVzZSB0aGUgbW9vZiBlbmRzCisJICBhbmQgd2UgY2FuJ3QgYWN0aXZhdGUgYW55IHNlZ21lbnQsIHRoZSBsYXR0ZXIgd291bGQgY2F1c2UgYSBzZWdtZW50IHRoYXQgc3RvcHMKKwkgIGF0IHRoZSBtb29mIGVuZCwgYW5kIG5vIGZ1cnRoZXIgZnJhZ21lbnRzIHdvdWxkIGJlIHBsYXllZCBiZWNhdXNlIHdlIGVuZCB1cAorCSAgYmVpbmcgRU9TLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzA3MQorCisyMDE2LTA2LTA2IDE3OjU0OjEwIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IFVzZSBsb29zZXIgY2FwcyBmb3IgdXBzdHJlYW0KKwkgIFdoZW4gd2UgZml4YXRlIGZvciB1cHN0cmVhbSwgdHJ5IHRvIG5vdCBpbnRyb2R1Y2UgbmV3IGZpZWxkcyB3aGVuIG5vdAorCSAgbmVlZGVkLiBUaGlzIHdhcyBpbXBvcnRlZCBmcm9tIHZpZGVvY29udmVydCBlbGVtZW50LgorCisyMDE1LTAxLTI4IDEyOjA3OjU4ICswMTAwICBFbnJpY28gSm9ybnMgPGVqb0BwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5jOgorCSAgZ3N0djRsMnRyYW5zZm9ybTogZm9ybWF0IGZpeGF0aW9uIGZvciBwcmVmZXJyaW5nIHBhc3N0aHJvdWdoCisJICAqIElmIG91dGdvaW5nIGZvcm1hdCBpcyB1bmZpeGF0ZWQsIHRyeSB0byBzZXQgaXQgdG8gaW5wdXQgZm9ybWF0LgorCSAgKiBDYWxsIGdzdF9jYXBzX2ZpeGF0ZSAoKSBhdCBlbmQgb2YgZml4YXRpb24gcm91dGluZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjcxOQorCisyMDE2LTA1LTIwIDEyOjQ5OjUzICswMjAwICBQaGlsaXBwIFphYmVsIDxwLnphYmVsQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJICB2NGwydHJhbnNmb3JtOiBhbGxvdyB0byBjaGFuZ2UgcGl4ZWwgYXNwZWN0IHJhdGlvCisJICBTY2FsZXJzIG1heSBjaGFuZ2Ugd2lkdGggYW5kIGhlaWdodCBpbmRlcGVuZGVudGx5LAorCSAgYWxsb3cgdG8gY2hhbmdlIHBpeGVsIGFzcGVjdCByYXRpby4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjY3MTIKKworMjAxNi0wNS0yMCAxMjozMjoyNSArMDIwMCAgUGhpbGlwcCBaYWJlbCA8cC56YWJlbEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5jOgorCSAgdjRsMnRyYW5zZm9ybTogZml4IHNjYWxpbmcgaW4gY2FzZSBvZiBmaXhlZCBwaXhlbCBhc3BlY3QgcmF0aW8KKwkgIFRvIGNoYW5nZSBwaXhlbCBhc3BlY3QgcmF0aW8gZnJvbSBEQVIgdG8gUEFSLCB0aGUgbmVjZXNzYXJ5IHNjYWxpbmcgZmFjdG9yCisJICBpcyBEQVIvUEFSLCBub3QgREFSKlBBUi4KKwkgIEZvciBnb29kIG1lYXN1cmUsIGFkZCBkZWJ1ZyBvdXRwdXQgc2ltaWxhciB0byB0aGUgZml4ZWQtd2lkdGggYW5kCisJICBmaXhlZC1oZWlnaHQgY2FzZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY2NzExCisKKzIwMTYtMDUtMTMgMTY6Mzk6MjUgKzAyMDAgIFBoaWxpcHAgWmFiZWwgPHAuemFiZWxAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IGZpbGwgY29sb3JpbWV0cnkgaW4gZ3N0X3Y0bDJfb2JqZWN0X2FjcXVpcmVfZm9ybWF0CisJICBJbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGhlIGRlZmF1bHQgY29sb3JpbWV0cnkgY2hvc2VuIGJ5CisJICBnc3RfdmlkZW9faW5mb19zZXRfZm9ybWF0KCksIHNldCBpbmZvLmNvbG9yaW1ldHJ5IGZyb20gdGhlCisJICB2YWx1ZXMgcmV0dXJuZWQgYnkgR19GTVQuIFRoaXMgYWxsb3dzIGRlY29kZXJzIHRvIHByb3BhZ2F0ZQorCSAgdGhlaXIgaW5wdXQgY29sb3JpbWV0cnkgZG93bnN0cmVhbS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjYzODMKKworMjAxNi0wNS0xOCAxMDoxNzoxMiArMDIwMCAgUGhpbGlwcCBaYWJlbCA8cC56YWJlbEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogcmVmYWN0b3IgZ3N0X3Y0bDJfb2JqZWN0X2dldF9jb2xvcnNwYWNlIHRvIHRha2UgYSB2NGwyX2Zvcm1hdCBwYXJhbWV0ZXIKKwkgIE1vdmUgdGhlIGV4dHJhY3Rpb24gb2YgY29sb3JpbWV0cnkgcGFyYW1ldGVycyBmcm9tIHN0cnVjdCB2NGwyX2Zvcm1hdCBhbmQgdGhlCisJICBzZXR0aW5nIG9mIHRoZSBpZGVudGl0eSBtYXRyaXggZm9yIFJHQiBmb3JtYXRzIGludG8gdGhlIGZ1bmN0aW9uIHRvIGF2b2lkIGNvZGUKKwkgIGR1cGxpY2F0aW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjM4MworCisyMDE2LTA1LTEzIDE0OjU4OjQxICswMjAwICBQaGlsaXBwIFphYmVsIDxwLnphYmVsQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogdXNlIHZpc2libGUgc2l6ZSwgbm90IGNvZGVkIHNpemUsIGZvciBkb3duc3RyZWFtIG5lZ290aWF0aW9uIGZpbHRlcgorCSAgZ3N0X3Y0bDJfcHJvYmVfY2FwcygpIHJldHVybnMgdGhlIGNvZGVkIHNpemUsIG5vdCB0aGUgdmlzaWJsZSBzaXplLiBTdWJ0cmFjdAorCSAgdGhlIGtub3duIHBhZGRpbmcgZnJvbSBwcm9iZWQgY2FwcyB3aXRoIHRoZSBjb2RlZCBzaXplIGJlZm9yZSB1c2luZyB0aGVtIGFzCisJICBmaWx0ZXIgZm9yIGNhcHMgbmVnb3RpYXRpb24gd2l0aCBkb3duc3RyZWFtIGVsZW1lbnRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjM4MgorCisyMDE2LTA1LTEzIDE0OjQ1OjAyICswMjAwICBQaGlsaXBwIFphYmVsIDxwLnphYmVsQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiB1c2UgR19TRUxFQ1RJT04gaW5zdGVhZCBvZiBHX0NST1AgaW4gZ3N0X3Y0bDJfb2JqZWN0X2FjcXVpcmVfZm9ybWF0CisJICBUaGUgZ3N0X3Y0bDJfb2JqZWN0X2FjcXVpcmVfZm9ybWF0KCkgZnVuY3Rpb24gaXMgdXNlZCBieSB2NGwydmlkZW9kZWMgdG8gb2J0YWluCisJICB0aGUgY3VycmVudGx5IHNldCBjYXB0dXJlIGZvcm1hdC4gU2luY2UgR19GTVQgcmV0dXJucyB0aGUgY29kZWQgc2l6ZSwgdGhlCisJICB2aXNpYmxlIHNpemUgbmVlZHMgdG8gYmUgb2J0YWluZWQgZnJvbSB0aGUgY29tcG9zZSByZWN0YW5nbGUgaW4gb3JkZXIgdG8KKwkgIG5lZ290aWF0ZSBpdCB3aXRoIGRvd25zdHJlYW0gZWxlbWVudHMuIFRoZSBHX0NST1AgY2FsbCBoYXNuJ3Qgd29ya2VkIG9uIG1lbTJtZW0KKwkgIGNhcHR1cmUgcXVldWVzIGZvciBhIGxvbmcgdGltZS4gSW5zdGVhZCB1c2UgdGhlIEdfU0VMRUNUSU9OIGNhbGwgdG8gb2J0YWluIHRoZQorCSAgY29tcG9zZSByZWN0YW5nbGUgYW5kIG9ubHkgZmFsbCBiYWNrIHRvIEdfQ1JPUCBmb3IgYW5jaWVudCBrZXJuZWxzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjM4MQorCisyMDE2LTAxLTI3IDA5OjU3OjM4ICswMTAwICBBbmRyZWFzIE5hdW1hbm4gPGFuYXVtYW5uQHVsdHJhdHJvbmlrLmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMnNpbms6IFVzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9PVkVSTEFZIGlmIGRyaXZlciBhZHZlcnRpc2VzIGl0LgorCSAgT24gbW9kZXJuIGtlcm5lbHMsIHRoZSBHL1NfRk1UIGlvY3RscyB3aWxsIGFsd2F5cyBmYWlsIHVzaW5nCisJICBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVkgd2l0aCBWRkxfRElSX1RYIChlLmcuIHJlYWwgb3ZlcmxheSBvdXQgZHJpdmVycykKKwkgIHNpbmNlIHRoaXMgaXMgbm90IHRoZSBpbnRlbnRlZCB1c2UgKHJhdGhlciByeCwgYWNjb3JkaW5nIHRvIHY0bDIgQVBJIGRvYykuCisJICBQcm9iYWJseSB0aGlzIGlzIHdoeSB0aGUgVmlkZW8gT3V0cHV0IE92ZXJsYXkgaW50ZXJmYWNlIHdhcyBjcmVhdGVkLCBzbyBpZgorCSAgdGhlIGRyaXZlciBhZHZlcnRpc2VzIGl0IHdlIG1pZ2h0IGFzIHdlbGwgdXNlLgorCSAgRm9yIG9sZCBrZXJuZWxzIChwcmUgMjAxMikgdGhlIG9sZCB3YXkgbWlnaHQgc3RpbGwgd29yayBzbyBrZWVwaW5nIHRoaXMgZm9yCisJICBjb21wYXRpYmlsaXR5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MTE2NQorCisyMDE2LTA2LTA2IDE4OjUyOjAxICswMTAwICBLaWVyYW4gQmluZ2hhbSA8a2llcmFuQGJpbmdoYW0ueHl6PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBVc2Ugbm9uLWRlcHJlY2F0ZWQgVjRMMiB0eXBlIGZvciBSR0IxNQorCSAgU3VwcG9ydCBmb3IgdGhlIHVwZGF0ZWQgVjRMMl9QSVhfRk1UX1hSR0I1NTUgd2FzIGFkZGVkIGluIGNvbW1pdAorCSAgMjUzOGZlZTJmZDhmZGI3NGIwNWYwYTUxMTI4MWJjNDcwN2U3Y2M0NCBob3dldmVyLCB3aGVuIHNldHRpbmcgdGhlIGZvcm1hdAorCSAgZm9yIHVzZSBpbiB2NGwyIGlvY3RscywgdGhlIG9sZCBkZXByZWNhdGVkIGZvcm1hdCBpcyBzdGlsbCB1c2VkLiBDb252ZXJ0CisJICB0aGlzIHRvIHRoZSBuZXcgYWNjZXB0ZWQgZm9ybWF0IHR5cGUsIGFzIHRoZSBwcmVmZXJyZWQgZm9ybWF0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzMwMAorCisyMDE2LTA1LTA0IDE0OjUwOjMyICswMjAwICBNaWNoYWVsIE9sYnJpY2ggPG0ub2xicmljaEBwZW5ndXRyb25peC5kZT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBwcmVzZXJ2ZSBzZWVrIGZsYWdzCisJICBXaXRob3V0IHRoaXMgc29tZSBmbGFncyBnZXQgbG9zdCBpbiBzdHJlYW1pbmcgbW9kZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjcxOTQKKworMjAxNi0wNi0wNiAxMDo0Nzo1MiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvTWFrZWZpbGUuYW06CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgUmV2ZXJ0ICJXSVAgcmV2ZXJ0IHNvdXAiCisJICBUaGlzIHJldmVydHMgY29tbWl0IGZkYWMzYTdhMjMxZjM4NDg2NjU2MzZjZjgxMjJmOTYxMDNiNDZlM2IuCisJICBXYXMgbm90IHN1cHBvc2VkIHRvIGJlIHB1c2hlZCBidXQgYSBsb2NhbCB3b3JrYXJvdW5kIGZvcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MzkxMSNjMTMKKworMjAxNi0wNi0wMyAxMzowOTozNSArMDIwMCAgTWlndWVsIFBhcsOtcyBEw61heiA8bXBhcmlzZGlhekBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291cmNlOiBjb21wbGV0ZSB3YXJuIGxvZyB3aXRoIFNTUkMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjcxOTUKKworMjAxNi0wNS0zMSAxNToyOToxMyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvTWFrZWZpbGUuYW06CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgV0lQIHJldmVydCBzb3VwCisKKzIwMTYtMDYtMDMgMTM6MTg6MzEgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJICBkdmRlbXV4OiBVbnJlZiBzZWVrIGV2ZW50IGluIGFueSBjYXNlCisJICBJdCB3b3VsZCBiZSBsZWFrZWQgaWYgbm8gc2VlayBoYW5kbGVyIHdhcyBjdXJyZW50bHkgc2V0LgorCisyMDE2LTA2LTAzIDEwOjQ5OjE3ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguaDoKKwkgIGR2ZGVtdXg6IFByb3Blcmx5IHNldCBldmVudC9tZXNzYWdlIHNlcXVlbmNlIG51bWJlcnMgYmFzZWQgb24gdGhlIHByZXZpb3VzIHNlZWsKKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY1OTM1CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY3MTU3CisKKzIwMTYtMDYtMDMgMTA6MzY6MzIgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJKiBleHQvZHYvZ3N0ZHZkZW11eC5oOgorCSAgZHZkZW11eDogUmVtZW1iZXIgaWYgdXBzdHJlYW0gaGFkIGEgdGltZSBzZWdtZW50IGFuZCBpZiBub3QgcHJvcGVybHkgY3JlYXRlIHRpbWUgc2VnbWVudHMKKwkgIFByZXZpb3VzbHkgdGhlIHNlZ21lbnQudGltZSB3YXMgd3JvbmcsIGFuZCB0aGUgcG9zaXRpb24gd2FzIG5vdCB1cGRhdGVkCisJICBjb3JyZWN0bHksIHJlc3VsdGluZyBpbiBzZWVrcyBpbiBQVVNIIG1vZGUgd2l0aCB1cHN0cmVhbSBwcm92aWRpbmcgYSBCWVRFUworCSAgc2VnbWVudCB0byBub3Qgd29yayBhdCBhbGwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY3MTU3CisKKzIwMTYtMDYtMDMgMDk6NTQ6NTMgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJICBkdmRlbXV4OiBJbXBsZW1lbnQgU0VFS0lORyBxdWVyeSBzbyB3ZSBjYW4gYWN0dWFsbHkgc2VlayBpZiB1cHN0cmVhbSBjYW4ndCBzZWVrIGluIFRJTUUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjcxNTcKKworMjAxNi0wNi0wMiAxNDoxOToxNSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkgIGR2ZGVtdXg6IFJlY2FsY3VsYXRlIHRoZSBmcmFtZSBvZmZzZXRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBCWVRFIHNlZ21lbnQgYW5kIHdoZW5ldmVyIHVwc3RyZWFtIGdpdmVzIHVzIGEgdGltZXN0YW1wCisJICBUaGlzIGZpeGVzIHNlZWtpbmcgaW4gRFYgc3RyZWFtcyB3aGVyZSB1cHN0cmVhbSBvcGVyYXRlcyBpbiBQVVNIIG1vZGUgd2l0aCBhCisJICBUSU1FIHNlZ21lbnQgKGUuZy4gYXZpZGVtdXgpLiBXaXRob3V0IHRoaXMsIHdlIHdvdWxkIGdlbmVyYXRlIHdyb25nIGR1cmF0aW9ucworCSAgYW5kIHRpbWVzdGFtcHMgYWZ0ZXIgYSBzZWVrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzE1NworCisyMDE2LTA2LTAyIDEzOjUzOjQ0ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguaDoKKwkgIGR2ZGVtdXg6IFBhc3MtdGhyb3VnaCBidWZmZXIgRElTQ09OVCBmbGFncworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzE1NworCisyMDE2LTA2LTAyIDE2OjE2OjQ1IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOWRlcGF5LmM6CisJICBydHB2cDlkZXBheTogRG9uJ3QgYXNzZXJ0IG9uIGZsZXhpYmxlIG1vZGUgcGFja2V0cworCSAgSW5zdGVhZCBqdXN0IHBvc3QgYSB3YXJuaW5nIG9uIHRoZSBidXMgZm9yIG5vdy4KKworMjAxNi0wNi0wMiAxNTowMzoxNyArMDIwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbi5jOgorCSAgdGVzdHM6IHJ0cGJpbjogZml4IGNhcHMgbGVhaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzE1NgorCisyMDE2LTA2LTAyIDE1OjAwOjAxICswMjAwICBHdWlsbGF1bWUgRGVzbW90dGVzIDxndWlsbGF1bWUuZGVzbW90dGVzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYW1ycGFyc2UuYzoKKwkgIHRlc3RzOiBhbXJwYXJzZTogY2xlYW4gdXAgdGVzdAorCSAgLSB1c2UgR1NUX0NIRUNLX01BSU4oKSB0byByZWR1Y2UgYm9pbGVycGxhdGUKKwkgIC0gdW5yZWYgdGhlIGlucHV0IGNhcHMgdXNpbmcgYSB0ZWFyZG93biBmdW5jdGlvbiB0byBwcmV2ZW50IGxlYWtzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY3MTU2CisKKzIwMTYtMDUtMjAgMTU6MjI6MzUgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmg6CisJICBkZWludGVybGFjZTogRW5zdXJlIERJU0NPTlQgZmxhZyBpcyBwcm9wZXJseSBwcm9wYWdhdGVkCisJICBUaGUgb3V0cHV0IG9mIGRlaW50ZXJsYWNlIGF0IHN0YXJ0dXAsIG9yIHdoZW4gcmVjZWl2aW5nIGEgbmV3IERJU0NPTlQKKwkgIGJ1ZmZlciwgc2hvdWxkIGhhdmUgdGhlIERJU0NPTlQgZmxhZyBzZXQgb24gdGhlIGZpcnN0IGJ1ZmZlci4KKworMjAxNi0wNS0zMSAyMTozNDowNCArMDIwMCAgSm9zZXAgVG9ycmEgPGFkbjc3MEBnbWFpbC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyc3JjOiBjaGVjayBmb3IgdmFsaWQgc2l6ZSBvbiByYXcgdmlkZW8gYnVmZmVycworCSAgRGlzY2FyZCBidWZmZXJzIHRoYXQgZG9lc24ndCBjb250YWluIGVub3VnaCBkYXRhIHdoZW4gZGVhbGluZworCSAgd2l0aCByYXcgdmlkZW8gaW5wdXRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzA4NgorCisyMDE2LTA1LTMxIDE3OjEwOjM2ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFVzZSB0aGUgZGVtdXhlciBzZWdtZW50IGluc3RlYWQgb2YgYSBuZXcgb25lIGZvciBNU1Mgc3RyZWFtcworCSAgVXBzdHJlYW0gbWlnaHQgaGF2ZSB0b2xkIHVzIHNvbWV0aGluZyBhYm91dCB0aGUgdG8gYmUgZXhwZWN0ZWQgc2VnbWVudCwgc28KKwkgIGxldCdzIHVzZSB0aGF0IGluZm9ybWF0aW9uIGluc3RlYWQgb2YgY29taW5nIHVwIHdpdGggYSBbMCwtMV0gc2VnbWVudC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjcwNzEKKworMjAxNi0wNS0zMSAxNzowNDozMiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBPbmx5IGFjdGl2YXRlIHNlZ21lbnRzIGFuZCBzZW5kIFNFR01FTlQgZXZlbnRzIGlmIHdlIGhhdmUgc3RyZWFtcworCSAgQnV0IGluIHRoYXQgY2FzZSBhbHNvIHJlbW92ZSB0aGUgcGVuZGluZyBuZXdzZWdtZW50IGV2ZW50LCBvdGhlcndpc2Ugd2Ugd291bGQKKwkgIGxhdGVyIHNlbmQgYSBwb3NzaWJseSBvdXRkYXRlZCBldmVudC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjcwNzEKKworMjAxNi0wNS0zMSAxNjo1Mzo1MCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBJbiBQVUxMIG1vZGUsIG5vdGhpbmcgaXMgZXZlciBnb2luZyB0byBzZW5kIHVzIGEgU0VHTUVOVCBldmVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzA3MQorCisyMDE2LTA1LTMxIDE2OjM4OjM0ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IERvbid0IG92ZXJyaWRlIFRJTUUgc2VnbWVudHMgZnJvbSB1cHN0cmVhbSB0aGF0IHdlIGp1c3Qgc2F3CisJICBUaGUgcG9pbnQgb2YgZDhmYjdhOWM5NmIxMDg4MTRiZWVhYTBlNjNmODE4ZDQ2NDhjN2ZlOSB3YXMgdG8gbm90IGhhdmUgYW55CisJICBzcHVyaW91cyBzZWdtZW50cyBzdG9yZWQgZm9yIGxhdGVyIGlmIHdlIGRvIEJZVEVTLT5USU1FIGNvbnZlcnNpb24sIGJ1dAorCSAgb3ZlcnJpZGluZyBhbnkgVElNRSBzZWdtZW50cyBmcm9tIHVwc3RyZWFtIGRvZXMgbm90IG1ha2UgYW55IHNlbnNlLgorCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjMxNjUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjcwNzEKKworMjAxNS0wNy0xNiAwOTo0ODo0NiArMDUzMCAgUHJhc2hhbnQgR290YXJuZSA8cHMuZ290YXJuZUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkgIG11bHRpZmlsZXNyYzogc2V0IHBvc2l0aW9uIGFzIG9mZnNldCBmcm9tIHN0YXJ0LWluZGV4CisJICBxdWVyeSBwb3NpdGlvbiBpbiBHU1RfRk9STUFUX0JVRkZFUiByZXR1cm5zCisJICBvZmZzZXQgZnJvbSBzdGFydC1pbmRleCByYXRoZXIgdGhhbiBpbmRleC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTI0NjIKKworMjAxNi0wNS0yNyAxMjo0OTozMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3NpbXBsZS1sYXVuY2gtbGluZXMuYzoKKwkqIHRlc3RzL2ZpbGVzL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZmlsZXMvZ3JhZGllbnQuajJrOgorCSAgdGVzdHM6IGFkZCB1bml0IHRlc3QgZm9yIEpQRUctMjAwMCBydHAgcGF5bG9hZGVyIGxlYWsKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjY4NzAKKworMjAxNi0wNS0yNSAxNzoxMToxMyArMDIwMCAgUGllcnJlIExhbW90IDxwaWVycmUubGFtb3RAb3BlbndpZGUuZnI+CisKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJICBydHBqMmtwYXk6IEZpeCBidWZmZXIgbWVtb3J5IGxlYWsKKwkgIElucHV0IGJ1ZmZlciBtZW1vcnkgd2FzIG5vdCB1bm1hcHBlZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2Njg3MAorCisyMDE2LTA1LTE4IDEyOjEyOjE1ICswMzAwICBHdWlsbGF1bWUgRGVzbW90dGVzIDxndWlsbGF1bWUuZGVzbW90dGVzQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogZml4IGNhcHMgbGVhaworCSAgZ3N0X3Y0bDJfb2JqZWN0X3Byb2JlX2NhcHMoKSB3YXMgdGFraW5nIGFuIGV4dHJhIHJlZiBvbiB0aGUgcmV0dXJuZWQKKwkgIGNhcHMgZm9yIG5vIHJlYXNvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjY2MTAKKworMjAxNi0wNS0yMiAyMDoxNDoxOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzoKKwkgIHZpZGVvY3JvcCBtYXJrIGNyb3AgcHJvcGVydGllcyBhcyBtdXRhYmxlIGluIHBsYXlpbmcgc3RhdGUKKworMjAxNi0wNS0yMCAxNjo0NzozNSArMDMwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogZml4IGJ1ZmZlciBsZWFrIHdoZW4gZmx1c2hpbmcKKwkgIFdoZW4gZWFybHkgcmV0dXJuaW5nIGluIGdzdF9zb3VwX2h0dHBfc3JjX3JlYWRfYnVmZmVyKCkgYmVjYXVzZSB0aGUKKwkgIGVsZW1lbnQgaXMgRkxVU0hJTkcsIHdlIG5lZWQgdG8gdW5tYXAgYW5kIHVucmVmIHRoZSBidWZmZXIgd2hpY2ggd2FzIGp1c3QgY3JlYXRlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjY3MTgKKworMjAxNi0wNS0yMCAxMToxNTo0NCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBTZXQgc2VlayBldmVudCBzZXFudW0gb24gYWxsIFNFR01FTlQgZXZlbnRzCisJICBTb21lIHdlcmUgZm9yZ290dGVuLgorCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjU5MzUKKworMjAxNi0wNS0yMCAxMToxMjo0NCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgYXZpZGVtdXg6IFBhc3MgdGhyb3VnaCBzZWVrIGV2ZW50IHNlcW51bXMgaW4gYWxsIFNFR01FTlQvRU9TIGV2ZW50cyBhbmQgU0VHTUVOVF9ET05FIG1lc3NhZ2VzL2V2ZW50cworCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjU5MzUKKworMjAxNi0wNS0yMCAxMDo1Njo1MiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBTZXQgc2VlayBldmVudCBzZXFudW0gaW4gRU9TIGFuZCBTRUdNRU5UX0RPTkUgbWVzc2FnZXMvZXZlbnRzCisJICBBbHNvIGFjdHVhbGx5IHN0b3JlIHRoZSBzZXFudW0gaW4gcHVsbCBtb2RlIHNlZWtzLgorCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjU5MzUKKworMjAxNi0wNS0xNyAxMzo0MDozOCArMDMwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IGZpeCBjYXBzIGxlYWsKKwkgIFRoZSBjYXBzIHJldHVybmVkIGJ5IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcygpIHdhcyBuZXZlciB1bnJlZmZlZCB3aGVuCisJICBub3QgZWFybHkgcmV0dXJuaW5nLgorCSAgRml4IGEgbGVhayB3aXRoIHRoZSBlbGVtZW50cy9kZWludGVybGFjZSB0ZXN0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjU1OAorCisyMDE2LTAxLTI1IDE2OjI1OjUxICswMTAwICBNaWtoYWlsIEZsdWRrb3YgPG1pc2hhQHBleGlwLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBkb24ndCBhY3Qgb24gc3VzcGljaW91cyBCWUUgUlRDUAorCSAgU29tZSBlbmRwb2ludHMgKGxpa2UgVGFuZGJlcmcgRTIwKSBjYW4gc2VuZCBCWUUgcGFja2V0IGNvbnRhaW5pbmcgb3VyCisJICBpbnRlcm5hbCBTU1JDLiBJIHRoaXMgY2FzZSB3ZSB3b3VsZCBkZXRlY3QgU1NSQyBjb2xsaXNpb24gYW5kIGdldCByaWQKKwkgIG9mIHRoZSBzb3VyY2UgYXQgc29tZSBwb2ludC4gQnV0IGJlY2F1c2Ugd2UgYXJlIHN0aWxsIHNlbmRpbmcgcGFja2V0cworCSAgd2l0aCB0aGF0IFNTUkMgdGhlIHNvdXJjZSB3aWxsIGJlIHJlY3JlYXRlZCBpbW1lZGlhdGVseS4KKwkgIFRoaXMgYnJhbmQgbmV3IGludGVybmFsIHNvdXJjZSB3aWxsIG5vdCBoYXZlIHNvbWUgdmFyaWFibGVzIGluY29ycmVjdGx5CisJICBzZXQgaW4gaXRzIHN0YXRlLiBGb3IgZXhhbXBsZSAnc2VxbnVtLWJhc2VgIGFuZCBgY2xvY2stcmF0ZWAgdmFsdWVzIHdpbGwgYmUKKwkgIC0xLgorCSAgVGhlIGZpeCBpcyBub3QgdG8gYWN0IG9uIEJZRSBSVENQIGlmIGl0IGNvbnRhaW5zIGludGVybmFsIG9yIHVua25vd24KKwkgIFNTUkMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyMjE5CisKKzIwMTUtMTEtMTUgMTQ6NTQ6MjggKzAxMDAgIE1pa2hhaWwgRmx1ZGtvdiA8bWlzaGFAcGV4aXAuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBBZGQgdGVzdCBmb3IgbG9ja2luZyBvZiB0aGUgc3RhdHMgc2lnbmFsCisJICBLZWVwaW5nIHRoZSBsb2NrIHdoaWxlIGVtaXR0aW5nIHRoZSBzdGF0cyBzaWduYWwgaW50cm9kdWNlcyBwb3RlbnRpYWwKKwkgIGRlYWRsb2NrIGluIHRob3NlIHNpdHVhdGlvbnMgd2hlbiB0aGUgc2lnbmFsIGNhbGxiYWNrIHdhbnRzIHRoZSBhY2Nlc3MKKwkgIHRvIHJ0cHNlc3Npb24ncyBwcm9wZXJ0aWVzIHdoaWNoIGFsc28gcmVxdXJlIHRoZSBsb2NrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MjIxNgorCisyMDE2LTA1LTE5IDE1OjM2OjU3ICswOTAwICBTZXVuZ2hhIFlhbmcgPHNoLnlhbmdAbGdlLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBkb24ndCBob2xkIG9iamVjdCBsb2NrIHdoaWxzdCBwdXNoaW5nIG91dCBoZWFkZXJzCisJICBtYXRyb3NrYWRlbXV4IHdvdWxkIHRha2UgdGhlIEdTVF9PQkpFQ1RfTE9DSyBpbgorCSAgLSBnc3RfbWF0cm9za2FfZGVtdXhfcHVzaF9jb2RlY19kYXRhX2FsbCgpCisJICAtIGdzdF9tYXRyb3NrYV9kZW11eF9xdWVyeSgpCisJICBTb21lIHBhcnNlIGVsZW1lbnQgc3VjaCBhcyBGTEFDIGNoZWNrcyB1cHN0cmVhbSBzZWVrYWJpbGl0eSwgYW5kCisJICB0aGVyZSBpcyBzb21lIHVzZSBjYXNlcyB0aGF0IG1hdHJvc2thLWRlbXV4IGlzIGxpbmtlZCB0byBhIHBhcnNlIGVsZW1lbnQKKwkgIChlLmcuLEZMQUMgZm9ybWF0KSB3aXRob3V0IGludGVybWVkaWF0ZSBlbGVtZW50cyAoZS5nLiwgcXVldWUpLgorCSAgSW4gdGhpcyBjYXNlLCBtYXRyb3NrYS1kZW11eCBuZXZlciByZXR1cm5zIGZyb20gX3B1c2hfY29kZWNfZGF0YV9hbGwoKQorCSAgYmVjYXVzZSB0aGUgcGFyc2VyIGNhbiByZXR1cm4gb25seSBhZnRlciBpdCByZWNlaXZlcyB0aGUgcmVzcG9uc2UgdG8KKwkgIHRoZSB1cHN0cmVhbSBxdWVyeSwgYnV0IHRoYXQncyBub3QgZ29pbmcgdG8gaGFwcGVuIGJlY2F1c2UgaXQncworCSAgZGVhZGxvY2tlZC4KKwkgIEVsZW1lbnRzIG11c3Qgbm90IGhvbGQgdGhlIG9iamVjdCBsb2NrIHdoaWxzdCBwdXNoaW5nIG91dCBldmVudHMKKwkgIG9yIGRhdGEuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY2NjQ1CisKKzIwMTYtMDUtMTkgMTI6NDM6MDEgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5jOgorCSAgc291cGh0dHBjbGllbnRzaW5rOiBTZXQgc2VudF9idWZmZXJzIGFuZCBzdHJlYW1oZWFkZXJfYnVmZmVycyB0byBOVUxMIGFmdGVyIGZyZWVpbmcKKwkgIE90aGVyd2lzZSB3ZSBtaWdodCB1c2UgYW4gYWxyZWFkeSBmcmVlZCBsaXN0IGxhdGVyIGFuZCBjcmFzaCBvciB3b3JzZS4KKworMjAxNi0wNS0xOCAxODozMjo1NyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogZml4IFNpbmNlIHZlcnNpb24gZm9yIG5ldyAibG9vcCIgcHJvcGVydHkKKworMjAxNi0wNS0xNiAxNjoxODozNyArMDIwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOgorCSAgcnRwZGVjOiBmaXggY2xvY2sgbGVhaworCSAgZ3N0X3N5c3RlbV9jbG9ja19vYnRhaW4oKSByZXR1cm5zIGEgbmV3IHJlZi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjY1MjEKKworMjAxNi0wNS0xNyAwNTozMzozNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogYWRkIGRvYyBibHVyYiB3aXRoIHNpbmNlIG1hcmtlciBmb3IgbmV3ICJsb29wIiBwcm9wZXJ0eQorCisyMDE1LTExLTEzIDE1OjUyOjM1ICswMTAwICBEaW1pdHJpb3MgS2F0c2Fyb3MgPHBhdGNoZXJ3b3JrQGdtYWlsLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogYWRkIHN1cHBvcnQgZm9yIHBuZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1ODA1OQorCisyMDE2LTA1LTE1IDIyOjA3OjE0ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuYzoKKwkgIHNwbGl0bXV4c3JjOiBDb25uZWN0IHRvIGRlbXV4IHNpZ25hbHMgYmVmb3JlIGFjdGl2YXRpbmcKKwkgIEZpeCBhIHJhY2UgaW4gc3BsaXRtdXhzcmMgYnkgcHJvcGVybHkgY29ubmVjdGluZyB0byB0aGUKKwkgIGRlbXV4ZXIgc2lnbmFscyB3ZSdyZSBpbnRlcmVzdGVkIGluICpiZWZvcmUqIHNldHRpbmcgaXQgcnVubmluZy4KKworMjAxNi0wNS0xNSAxMzozMTozNyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5zaWduYWxzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSAgZG9jczogVXBkYXRlIGZvciBnaXQgbWFzdGVyCisKKzIwMTYtMDUtMTUgMTI6MTY6MjMgKzAyMDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5Lmg6CisJICBydHBtcDRncGF5OiBEb24ndCBwcm9kdWNlIHRpbWVzdGFtcHMgYmFzZWQgb24gYnl0ZSBjb3VudAorCSAgVGhlIEdTVF9CVUZGRVJfT0ZGU0VUIG9mIG91dHB1dCBidWZmZXJzIHJldHVybmVkIHRvIEdzdFJ0cEJhc2VQYXlsb2FkCisJICBzaG91bGQgcmVmbGVjdCB0aGUgbnVtYmVyIG9mICJzYW1wbGVzIiBpbiB0aGUgdW5pdCBvZiB0aGUgUlRQIGNsb2NrIGluIHRoaXMKKwkgIGJ1ZmZlci4gSWYgdGhpcyBpcyBub3QgdHJ1ZSwgdGhlbiBpdCBzaG91bGRuJ3QgYmUgc2V0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MTk0MworCisyMDE2LTA1LTE1IDEyOjI0OjAzICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYS1tdXg6IEZpeCBzdHJjbXAgdXNhZ2UKKwkgIEp1c3QgdXNlIGdfc3RyY21wMCB3aGljaCBjYW4gaGFuZGxlIE5VTEwgZW50cmllcworCisyMDE2LTAzLTA0IDEwOjE0OjAwICswMTAwICBDYXJsb3MgUmFmYWVsIEdpYW5pIDxkdkBwc2V1ZG90ZXJtaW5hbC5vcmc+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogVXNlIGF1ZGlvL3gtdW5hbGlnbmVkLXJhdyBpbnN0ZWFkIG9mIGF1ZGlvL3gtcmF3IGZvciBMMTYgZGF0YQorCSAgRGlyZWN0bHkgc2V0dGluZyBhdWRpby94LXJhdyBjYXBzIGxlYWRzIHRvIHByb2JsZW1zIHdoZW4gdGhlIGRlbGl2ZXJlZAorCSAgZGF0YSBibG9ja3MgZG8gbm90IGFsaWduIHByb3Blcmx5IGF0IHNhbXBsZSBib3VuZGFyaWVzIChmb3IgZXhhbXBsZSwgYQorCSAgZGF0YSBibG9jayB3aXRoIDM5MSBieXRlcykuIFNvLCBpbnN0ZWFkLCBzZXQgYXVkaW8veC11bmFsaWduZWQtcmF3IHRvCisJICBsZXQgYSBwYXJzZXIgYmUgYXV0b3BsdWdnZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg5NDYwCisKKzIwMTYtMDUtMTIgMTE6NTI6MDkgKzA5MDAgIFNldW5naGEgWWFuZyA8c2gueWFuZ0BsZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFBhcnNpbmcgZWxzdCBib3ggYmFzZWQgb24gdmVyc2lvbgorCSAgc2VnbWVudF9kdXJhdGlvbiBhbmQgbWVkaWFfdGltZSBzaG91bGQgYmUgcGFyc2VkIGJhc2VkIG9uIHZlcnNpb24KKwkgIG9mIGVsc3QgYm94LiBTcGVjaWZpY2F0aW9uIGRlZmluZXMgdGhhdCBhbiBlbHN0IGJveCB3aXRoIHZlcnNpb24gMQorCSAgaGFzIHVpbnQ2NCBhbmQgaW50NjQgdmFsdWVzIGZvciBzZWdtZW50X2R1cmF0aW9uIGFuZCBtZWRpYV90aW1lLAorCSAgcmVzcGVjdGl2ZWx5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjMwMQorCisyMDE2LTA1LTE0IDEyOjU3OjQxIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogY2hlY2sgaWYgcmVxdWVzdCB3YXMgY2FuY2VsbGVkIHdoZW4gc2VuZGluZyBtZXNzYWdlCisJICBJdCBtaWdodCBiZSB0aGF0IHRoZSByZXF1ZXN0IHdhcyBhYm9ydGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBhbmQKKwkgIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbGx5CisKKzIwMTYtMDUtMTQgMTI6NDM6NTQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBwcm94eSByZXNvbHZlciBpcyBvbiBieSBkZWZhdWx0CisJICBSZW1vdmUgZnJvbSB0aGUgc2Vzc2lvbiBjcmVhdGlvbiBwYXJhbWV0ZXJzCisKKzIwMTYtMDUtMTQgMTI6MTU6NDggLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZXh0L3NvdXAvTWFrZWZpbGUuYW06CisJICBzb3VwOiB1cGRhdGUgYnVpbGQgdG8gd2FybiBhYm91dCBuZXdlciBkZXByZWNhdGVkIGZ1bmN0aW9ucworCSAgV2UgYWxyZWFkeSBkZXBlbmQgb24gMi40OAorCisyMDE2LTA1LTE0IDExOjA5OjMzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IHJlZHVjZSByZWFkaW5nIGxhdGVuY3kgYnkgdXNpbmcgbm9uLWJsb2NraW5nIHJlYWQKKwkgIE5vbi1ibG9ja2luZyByZWFkIHdpbGwgcmV0dXJuIHRoZSBhbW91bnQgb2YgZGF0YSBhdmFpbGFibGUgd2l0aG91dAorCSAgYmxvY2tpbmcgdG8gd2FpdCBmb3IgdGhlIGZ1bGwgcmVxdWVzdGVkIHNpemUuCisJICBUaGUgZG93bnNpZGUgaXMgdGhhdCBub3cgaXQgc291cGh0dHBzcmMgbmVlZHMgdG8gaGF2ZSBhIHdhaXRpbmcKKwkgIG1lY2hhbmlzbSBpbiBjYXNlIHRoZXJlIGlzIG5vIGRhdGEgYXZhaWxhYmxlIHlldCB0byBhdm9pZCBidXN5CisJICBsb29waW5nIGFyb25kIHRoZSBpbnB1dHN0cmVhbS4KKworMjAxNi0wNS0xNSAxMjozMDo1MCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogVGFrZSB0aGUgbG9jayBhbHJlYWR5IHdoZW4gcmVhZGluZyB0aGUgb3RoZXIgc3RhdHMsIG5vdCBqdXN0IGZvciB0aGUgaGFzaCB0YWJsZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjAyNQorCisyMDE2LTA1LTE0IDE3OjA0OjU3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6CisJICBtYXRyb3NrYTogdXNlIG1hdGgtY29tcGF0LmggZm9yIE5BTiBkZWZpbmUKKworMjAxNi0wNS0xNCAyMzozOToyMiArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSAgc3BsaXRtdXhzaW5rOiBVc2UgR3N0QmluIGFzeW5jLWhhbmRsaW5nIGluc3RlYWQgb2Ygb3VyIG93bi4KKwkgIFNldCB0aGUgYXN5bmMtaGFuZGxpbmcgcHJvcGVydHkgb24gR3N0QmluIHRvIGxldCBpdCBtYW5hZ2UKKwkgIGFzeW5jLWhhbmRsaW5nIGluc3RlYWQgb2YgdGhlIGxvY2FsIGhhbmRsaW5nIGZyb20gdGhlIHByZXZpb3VzCisJICBjb21taXQuIFdvcmtzIGJlY2F1c2Ugb2YgIzE3NGE1ZSBpbiBjb3JlCisKKzIwMTYtMDUtMTMgMTA6MTc6MzMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmg6CisJICBzb3VwaHR0cHNyYzogcmVmYWN0b3IgdG8gdXNlIFNvdXAncyBzeW5jIEFQSQorCSAgUmVwbGFjZSB0aGUgYXN5bmMgQVBJIHdpdGggdGhlIHN5bmMgQVBJIHRvIHJlbW92ZSBhbGwgdGhlIGV4dHJhIG1haW5sb29wCisJICBhbmQgY29udGV4dCBoYW5kbGluZy4gQ3VycmVudGx5IGl0IGJsb2NrcyByZWFkaW5nIHVudGlsICdibG9ja3NpemUnCisJICBieXRlcyBhcmUgYXZhaWxhYmxlIGJ1dCB0aGF0IGNhbiBiZSBpbXByb3ZlZCBieSB1c2luZzoKKwkgIGh0dHBzOi8vZGV2ZWxvcGVyLmdub21lLm9yZy9naW8vdW5zdGFibGUvR1BvbGxhYmxlSW5wdXRTdHJlYW0uaHRtbCNnLXBvbGxhYmxlLWlucHV0LXN0cmVhbS1yZWFkLW5vbmJsb2NraW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkzOTExCisKKzIwMTYtMDUtMTQgMDQ6NTA6MzYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkgIHRlc3RzOiBzb3VwaHR0cHNyYzogcmVwbGFjZSBkZXByZWNhdGVkIEFQSQorCSAgQXZvaWQgdXNpbmcgc291cF9zZXJ2ZXJfcnVuX2FzeW5jIGFuZCBvbGQgZ2V0X3BvcnQoKSBBUElzLAorCSAgcmVwbGFjZSB3aXRoIG1lIHNvdXBfc2VydmVyX2xpc3RlbiBhbmQgZ2V0IHRoZSBwb3J0IHRocm91Z2ggdGhlCisJICBVUklzIGxpc3QgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyLgorCisyMDE2LTA1LTE0IDEyOjM0OjEwICswMjAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogVXBncmFkZSBkZWJ1ZyBtZXNzYWdlIHRvIGVycm9yCisJICBJdCBjYXVzZXMgdGhlIGVudGlyZSBwaXBlbGluZSB0byBmYWlsLCBpdCBzaG91bGQgYmUgZWFzaWVyIHRvIGZpbmQuCisKKzIwMTYtMDUtMTQgMTg6MzI6NTIgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuaDoKKwkgIHNwbGl0bXV4c2luazogSGlkZSBpbnRlcm5hbCBhc3luYyBzdGF0ZSBjaGFuZ2VzLgorCSAgV2hlbiBzd2l0Y2hpbmcgZnJhZ21lbnRzLCBoaWRlIHRoZSBhc3luYy1zdGFydC9hc3luYy1kb25lCisJICBtZXNzYWdlcyBmcm9tIHRoZSBwYXJlbnQgYmluLCBhcyBvdGhlcndpc2Ugd2Ugc29tZXRpbWVzICh2ZXJ5IHJhcmVseSkKKwkgIGhhbmcgaW4gUEFVU0VEIGluc3RlYWQgb2YgcmV0dXJuaW5nIC8gY29udGludWluZyB0byBQTEFZSU5HCisJICBzdGF0ZS4KKworMjAxNi0wNS0xMyAyMToyMDoyOCArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IFJlbW92ZSBzdHJheSBjYXJyaWFnZS1yZXR1cm4gZnJvbSBkZWJ1ZworCisyMDE2LTA1LTEzIDE2OjQzOjIxICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgcnRwOiBTaGlwIGdzdHJ0cGoya2NvbW1vbi5oIGZpbGUgdG8gZml4IGRpc3RjaGVjaworCisyMDE1LTA0LTMwIDE0OjQzOjA0ICswMjAwICBKZXNwZXIgTGFyc2VuIDxrbm9yci5qZXNwZXJAZ21haWwuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBEbyBub3Qgd3JpdGUgaW5kZXggYW5kIGhlYWRlciBpZiBpZHggaXMgTlVMTAorCSAgRml4ZXMgY3JpdGljYWxzIHdpdGggZS5nLgorCSAgdmlkZW90ZXN0c3JjIG51bS1idWZmZXJzPTEgISBpZGVudGl0eSBkcm9wLXByb2JhYmlsaXR5PTEuMCAhIGF2aW11eCAhIGZha2VzaW5rCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ4NzAwCisKKzIwMTYtMDUtMTIgMDg6NDM6MzkgLTA0MDAgIEFhcm9uIEJveGVyIDxib3hlcmFiQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkgIHJ0cGoya3BheTogbWFuYWdlIFQgdGlsZSBpbnZhbGlkYXRpb24gYml0IGNvcnJlY3RseSwgdXBkYXRlIHRpbGUgaWQgaW4gaGVhZGVyIGNvcnJlY3RseS4KKwkgIDEuIGFjY29yZGluZyB0byBSRkMsIFQgYml0IGlzIG9ubHkgc2V0IHdoZW4gZWl0aGVyIHRoZSBSVFAgcGFja2V0IG9ubHkgY29udGFpbnMgdGhlIEoySyBtYWluIGhlYWRlciwgb3IgdGhlIHBhY2tldCBjb250YWlucyB0aWxlIHBhcnRzIGZyb20gbXVsdGlwbGUgdGlsZXMuIFRoaXMgaXMgbm93IGJlaW5nIG1hbmFnZWQgY29ycmVjdGx5IGluIHRoZSBjb2RlLiBUaGUgc2Vjb25kIHNjZW5hcmlvIGNhbm5vdCBoYXBwZW4gd2l0aCBvdXIgcGF5bG9hZGVyLCBzaW5jZSB0aWxlIGhlYWRlcnMgYXJlIGFsd2F5cyBwbGFjZWQgaW4gdGhlaXIgb3duIFJUUCBwYWNrZXQsIGFuZCBzbyBhIHBhY2tldCBjYW5ub3QgY29udGFpbiB0aWxlIHBhcnRzIGZyb20gbXVsdGlwbGUgdGlsZXMuCisJICBIb3dldmVyLCBJIGhhdmUgYWRkZWQgY29kZSB0byB0cmFjayBpZiBtdWx0aXBsZSB0aWxlIHBhcnRzIGFyZSBpbmNsdWRlZCBpbiBhIHNpbmdsZSBSVFAgcGFja2V0LCBpbiBjYXNlIGluIHRoZSBmdXR1cmUgd2Ugd2FudCB0byBwdXQgaGVhZGVyIGFuZCBkYXRhIGluIHNhbWUgcGFja2V0LgorCSAgMi4gT2xkIGNvZGUgd291bGQgc2V0IHRoZSB0aWxlIGlkIHRvIHplcm8gZm9yIGFsbCBKMksgcGFja2V0cy4gVGhpcyBpcyBub3cgc2V0IGNvcnJlY3RseSB0byB0aGUgYXBwcm9wcmlhdGUgdGlsZSBpZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDUxODcKKworMjAxNi0wNS0xMiAwODo0MTo1MSAtMDQwMCAgQWFyb24gQm94ZXIgPGJveGVyYWJAZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5jOgorCSAgcnRwajJrcGF5OiBtYW5hZ2UgZnJhZ21lbnRlZCBoZWFkZXJzIGNvcnJlY3RseQorCSAgSjJLIG1haW4gaGVhZGVyIGZyYW1lbnRhdGlvbiBhY3Jvc3MgbXVsdGlwbGUgUlRQIHBhY2tldHMgaXMgbm93IGhhbmRsZWQgY29ycmVjdGx5CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1MTg3CisKKzIwMTYtMDUtMTEgMTU6MDQ6MjYgLTA0MDAgIEFhcm9uIEJveGVyIDxib3hlcmFiQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtjb21tb24uaDoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5oOgorCSAgcnRwajJrOiBtb3ZlIGNvbW1vbiBjb2RlIHRvIHNoYXJlZCBoZWFkZXIsIGNvZGUgY2xlYW4gdXAKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDUxODcKKworMjAxNi0wNS0xMSAxNTowMTozMiAtMDQwMCAgQWFyb24gQm94ZXIgPGJveGVyYWJAZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGoya2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5jOgorCSAgcnRwajJrOiB1cGRhdGUgZG9jdW1lbnRhdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTE4NworCisyMDE2LTA1LTEyIDE0OjQzOjQzICswMjAwICBQYXRyaWNpYSBNdXNjYWx1IDxwYXRyaWNpYUBheGlzLmNvbT4KKworCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5oOgorCSAgYXVwYXJzZTogRml4IHN0aWNreSBldmVudCBtaXNvcmRlcmluZyB3YXJuaW5nCisJICBNYWtlIHN1cmUgdGhhdCBzcmMgcGFkIGhhcyBjYXBzIGJlZm9yZSBzZW5kaW5nIHNlZ21lbnQgZXZlbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY2MzU5CisKKzIwMTYtMDUtMTEgMDk6Mjg6MTMgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IERvbid0IG5vdGlmeSBhYm91dCBzdGF0cyBwcm9wZXJ0eSBjaGFuZ2VzIHdoaWxlIHRha2luZyB0aGUgc2Vzc2lvbiBsb2NrCisJICBUaGUgc2lnbmFsIGhhbmRsZXJzIG1pZ2h0IHdhbnQgdG8gYWN0dWFsbHkgZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3RhdHMKKwkgIHByb3BlcnR5LCB3aGljaCB3b3VsZCB0YWtlIHRoZSBzZXNzaW9uIGxvY2sgYWdhaW4gYW5kIGRlYWRsb2NrLgorCSAgVGhpcyB3YXMgaW50cm9kdWNlZCBieSAyZTk2MGU3MDc1MGEwY2I3ZTExMTdkMGMwOWQwODU5Nzg2NmEyOWVlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjAyNQorCisyMDE2LTA1LTAzIDEzOjU5OjU0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogaW1wcm92ZSBlZHRzIHNlZ21lbnQgaGFuZGxpbmcgYWZ0ZXIgc2Vla3MgaW4gcHVzaCBtb2RlCisJICBQcm9wZXJseSBoYW5kbGUgZWR0cyBzZWdtZW50cyBmb3IgcHVzaC1iYXNlZCBvcGVyYXRpb24gc2Vla2luZy4KKwkgIFdlIG9ubHkgc3VwcG9ydCBlZHRzIHRoYXQgYSBzaW5nbGUgc2VnbWVudCB0aGF0IGhhcyBtZWRpYSBhdCB0aGUgZW5kLAorCSAgYmVpbmcgcHJlY2VlZGVkIGJ5IGFueSBudW1iZXIgb2YgZ2FwIHNlZ21lbnRzLgorCSAgVGhpcyBhbHNvIGFsbG93cyB0aGUgcXQgc2VnbWVudCByYXRlIHRvIGJlIHJlc3BlY3RlZCBhZnRlciBzZWVrcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NTY2OQorCisyMDE2LTA1LTAzIDEwOjQxOjA2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcHJvcGVybHkgYWN0aXZhdGUgc2VnbWVudCB3aXRoIHJhdGUgIT0gMS4wCisJICBBbHNvIHVzZSB0aGUgcXQgcmF0ZSB0byBpZGVudGlmeSB0aGUgcG9zaXRpb24gd2l0aGluIGEgcXQgc2VnbWVudAorCSAgdG8gcHJvcGVybHkgdHJhbnNsYXRlIHBsYXliYWNrIHRpbWUgdG8gcXQgbWVkaWEgdGltZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NTY2OQorCisyMDE2LTA1LTAzIDExOjQ1OjAxICswMjAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IEZpeCBzdGFsbCB3aGVuIHJlY2VpdmluZyBhbHJlYWR5IGxvc3QgcGFja2V0CisJICBXaGVuIGEgcGFja2V0IGFycml2ZXMgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNvbnNpZGVyZWQgbG9zdCBhcyBwYXJ0IG9mIGEKKwkgIGxhcmdlIGdhcCB0aGUgImxvc3QgdGltZXIiIGZvciB0aGlzIHdpbGwgYmUgY2FuY2VsbGVkLiBJZiB0aGUgcmVtYWluaW5nCisJICBwYWNrZXRzIG9mIHRoaXMgbGFyZ2UgZ2FwIG5ldmVyIGFycml2ZXMsIHRoZXJlIHdpbGwgYmUgbWlzc2luZyBlbnRyaWVzCisJICBpbiB0aGUgcXVldWUgYW5kIHRoZSBsb29wIGZ1bmN0aW9uIHdpbGwga2VlcCB3YWl0aW5nIGZvciB0aGVzZSBwYWNrZXRzCisJICB0byBhcnJpdmUgYW5kIG5ldmVyIHB1c2ggYW5vdGhlciBwYWNrZXQsIGVmZmVjdGl2ZWx5IHN0YWxsaW5nIHRoZQorCSAgcGlwZWxpbmUuCisJICBUaGUgcHJvcG9zZWQgZml4IGNvbmNpZGVycyBwYXJ0cyBvZiBhIGxhcmdlIGdhcCBkZWZpbml0ZWx5IGxvc3QgKHNpbmNlCisJICB0aGV5IGFyZSBjYWxjdWxhdGVkIGZyb20gbGF0ZW5jeSkgYW5kIGlnbm9yZXMgdGhlIGxhdGUgYXJyaXZhbHMuCisJICBJbiBwcmFjdGljZSB0aGUgaXNzdWUgaXMgcmFyZSBzaW5jZSBsYXJnZSBnYXBzIGFyZSBzY2hlZHVsZWQgaW1tZWRpYXRlbHksCisJICBhbmQgZm9yIHRoZSBzdGFsbCB0byBoYXBwZW4gdGhlIGxhdGUgYXJyaXZhbCBuZWVkcyB0byBiZSBwcm9jZXNzZWQKKwkgIGJlZm9yZSB0aGlzIHRpbWVzIG91dC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjU5MzMKKworMjAxNi0wNS0wNSAxNDoxODoyMSArMDIwMCAgTWlndWVsIFBhcsOtcyBEw61heiA8bXBhcmlzZGlhekBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IFRha2Ugc2Vzc2lvbiBsb2NrIHdoZW4gY3JlYXRpbmcgc3RhdHMKKwkgIFRoZSBhY2Nlc3MgdG8gdGhlIHNlc3Npb24gaGFzaCB0YWJsZSBtdXN0IGhhcHBlbiB3aGlsZSB0aGUgc2Vzc2lvbiBsb2NrIGlzCisJICB0YWtlbiwgb3RoZXJ3aXNlIGFub3RoZXIgdGhyZWFkIG1pZ2h0IG1vZGlmeSB0aGUgaGFzaCB0YWJsZSB3aGlsZSB3ZSdyZQorCSAgY3JlYXRpbmcgdGhlIHN0YXRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjAyNQorCisyMDE2LTA1LTAzIDIxOjE3OjAxIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogdXBkYXRlIHNlZ21lbnQgd2hlbiBuZXcgZHVyYXRpb24gaXMgZm91bmQKKwkgIE90aGVyd2lzZSB0aGUgb2xkIHNlZ21lbnQgd2lsbCBoYXZlIGEgc2hvcnRlciBzdG9wIHRpbWUgYW5kIHdvdWxkCisJICBjYXVzZSB0aGUgc3RyZWFtIHRvIGVuZCB0b28gZWFybHkuCisKKzIwMTYtMDUtMDQgMTE6Mzc6MjkgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBkaXNtZW1iZXIgYWN0aXZhdGVfc2VnbWVudCBpbnRvIDIgcGFydHMKKwkgIE9uZSB0aGF0IHVwZGF0ZXMgYW5kIHB1c2ggYSBuZXcgc2VnbWVudCwgdGhlIG90aGVyIHdpbGwgbW92ZSB0aGUKKwkgIHN0cmVhbSB0byB0aGUgbmV3IHNlZ21lbnQgc3RhcnRpbmcgcG9zaXRpb24KKworMjAxNi0wNS0wNCAwOTozMDoyNyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSAgZHY6IFVzZSBjb3JyZWN0IHBpeGVsLWFzcGVjdC1yYXRpbyB2YWx1ZXMKKwkgIFRoZSBwcmV2aW91cyBvbmVzIHJlc3VsdGVkIGluIG9kZCBkaXNwbGF5IGFzcGVjdCByYXRpb3MgYW5kIHdlcmUgZGlmZmVyZW50CisJICBmcm9tIHRoZSBvbmVzIHVzZWQgYnkgZS5nLiBmZm1wZWcuIFRoZSBuZXcgb25lcyBub3cgcmVzdWx0IGluIGRpc3BsYXkgYXNwZWN0CisJICByYXRpb3Mgb2YgNDozIGFuZCAxNjo5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NTk0NgorCisyMDE1LTExLTA5IDE3OjU1OjA5ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zcGxpdG11eC5jOgorCSAgdGVzdHM6IGFkZCBzcGxpdG11eHNyYyB0ZXN0IGZvciBuZXcgImZvcm1hdC1sb2NhdGlvbiIgc2lnbmFsCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzNjI1CisKKzIwMTUtMTEtMDkgMTc6NTE6MTIgKzAxMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYzoKKwkgIHNwbGl0bXV4c3JjOiBhZGQgYSBmb3JtYXQtbG9jYXRpb24gc2lnbmFsIHRoYXQgYWxsb3dzIGJ5cGFzc2luZyB0aGUgbG9jYXRpb24gcHJvcGVydHkKKwkgIFRoaXMgc2lnbmFsIGFsbG93cyBhIHVzZXIgdG8gZGlyZWN0bHkgcmV0dXJuIGEgc29ydGVkIGxpc3Qgb2YKKwkgIGZpbGVzIHRvIGJlIGpvaW5lZCwgc28gdGhhdCB0aGV5IGRvbid0IGhhdmUgdG8gZm9sbG93IHRoZQorCSAgZmlsZW5hbWUgcGF0dGVybiB0aGF0IHRoZSAibG9jYXRpb24iIHByb3BlcnR5IGV4cGVjdHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzNjI1CisKKzIwMTYtMDUtMDQgMTE6MTU6MjAgLTA0MDAgIFhhdmllciBDbGFlc3NlbnMgPHhhdmllci5jbGFlc3NlbnNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkgIHNwbGl0bXV4c2luazogRml4IGRlYWRsb2NrIGNhc2Ugd2hlbiBzb3VyY2UgcmVhY2hlcyBFT1MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjUwNzIKKworMjAxNi0wNS0wMyAyMjo1OToyNyAtMDcwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogc2ltcGxpZnkgYW5kIGNvcnJlY3QgaGVhZGVyIHNjYW5uaW5nCisJICBUaGUgd2F2IHNwZWMgdGVsbHMgdGhhdCAnZm10JyAoYW5kICdiZXh0JyBpZiBwcmVzZW50KSBtdXN0IGNvbWUgYmVmb3JlICdkYXRhJy4KKwkgIFRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IGZvciAnZm10JyB0byBiZSBmaXJzdC4gV2UgYWxyZWFkeSBoYWQgYSBsaXN0IG9mIGNodW5rcworCSAgdG8gc2tpcCwgYnV0IGl0IGlzIGVhc2llciB0byBqdXN0IHNraXAgYW55IGNodW5rIHdoaWxlIHNlZWtpbmcgZm9yICdmbXQnLgorCSAgVGhpcyBmaXhlcyByZWFkaW5nIGZpbGVzIGdlbmVyYXRlZCBieSBQcm9Ub29scy4KKworMjAxNi0wNC0zMCAyMjoxNToxMyArMDkwMCAgSHl1bmp1biBLbyA8enpvb25AaWdhbGlhLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL01ha2VmaWxlLmFtOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9kZXZpY2Vwcm92aWRlci5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvZGV2aWNlcHJvdmlkZXIuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmg6CisJICBvc3hhdWRpbzogU3VwcG9ydCBhdWRpbyBkZXZpY2UgcHJvdmlkZXIgb24gb3N4CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzMjY1CisKKzIwMTYtMDUtMDEgMTU6MDk6MjcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogc2V0IGF1ZGlvIGhlYWRlciByYXRlIGFjY29yZGluZyB0byBjYWxjdWxhdGVkIGJwcyBpbiBzdG9wX2ZpbGUKKwkgIC4uLiBub3cgdGhhdCBzZXRfZmllbGRzIGlzIG5vIGxvbmdlciBjYWxsZWQgdGhlcmUgYnkKKwkgIGU1Mzg2MDhiM2Y5MDUzOTAwM2RlMjFjMWRiMjM4ZjNjOWI5NDZlMzAKKworMjAxNi0wNC0yOSAxNTowNDoxMSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IFN0b3JlIHRoZSBzZWdtZW50IHNlcXVlbmNlIG51bWJlciBpbiB0aGUgRU9TIGV2ZW50cyBhbmQgU0VHTUVOVF9ET05FIGV2ZW50cy9tZXNzYWdlCisJICBBbHNvIGluc3RlYWQgb2Ygc3RvcmluZyBpdCBwZXIgc3RyZWFtLCBzdG9yZSBpdCBnbG9iYWxseSBpbiB0aGUgZGVtdXhlci4gSXQncworCSAgdGhlIHNhbWUgZm9yIGVhY2ggc3RyZWFtIGFueXdheS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjU4MDYKKworMjAxNi0wNC0xMSAxMDo1NDozOCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogQWx3YXlzIGJpbmQgdG8gQU5ZIHdoZW4gYWRkcmVzcyBpcyBhIG11bHRpY2FzdCBhZGRyZXNzIGFuZCBub3Qgb25seSBvbiBXaW5kb3dzCisJICBGb3IgSVB2NiBhZGRyZXNzZXMsIGJpbmRpbmcgdG8gYSBtdWx0aWNhc3QgZ3JvdXAgZG9lcyBub3Qgd29yayBvbiBMaW51eAorCSAgZWl0aGVyLiBBbHdheXMgYmluZCB0byBBTlkgYW5kIHRoZW4gbGF0ZXIgam9pbiB0aGUgbXVsdGljYXN0IGdyb3VwLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NDY3OQorCisyMDE2LTA0LTI2IDE3OjAxOjQ5ICswODAwICBTb25nIEJpbmcgPGIwNjQ5OEBmcmVlc2NhbGUuY29tPgorCisJKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzoKKwkgIHhpbWFnZXV0aWw6IHNob3VsZG4ndCBpbXBsZW1lbnQgdHJhbnNmb3JtIGlmIGRvbid0IHN1cHBvcnQgaXQKKwkgIHNob3VsZG4ndCBpbXBsZW1lbnQgdHJhbnNmb3JtIGlmIGRvbid0IHN1cHBvcnQgaXQuIE9yIGdzdF9idWZmZXJfY29weV9pbnRvKCkKKwkgIHdpbGwgcHJpbnQgRVJST1IgbG9nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NTU4MworCisyMDE2LTA0LTI4IDE2OjI0OjUyICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogQWxsb3cgTVBFRy0xIExheWVyIDEgYW5kIDIgaW4gYWRkaXRpb24gdG8gMyBpbiBNUDQKKwkgIFZpYSB0aGUgTVBFRy00IFBhcnQgMyBzcGVjIHdlIGNhbiBzdXBwb3J0IHRoZSBvdGhlciBsYXllcnMgdG9vLgorCSAgQWxzbyBjb3JyZWN0IHRoZSBzYW1wbGVzIHBlciBmcmFtZSBjYWxjdWxhdGlvbiBmb3IgTVAzIGlmIGl0J3MgTVBFRy0yIG9yCisJICBNUEVHLTIuNS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjU3MjUKKworMjAxNi0wNC0yNyAyMDo0NjozNCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogVXBkYXRlIGNhcHMgZm9yIFRDUCB3aGVuZXZlciB0aGV5IGNoYW5nZQorCSAgV2Ugb25seSBjaGFuZ2VkIHRoZW0gZm9yIFVEUCBzbyBmYXIsIHdoaWNoIGNhdXNlZCB0aGUgd3Jvbmcgc2VxbnVtLWJhc2UgYW5kCisJICBvdGhlciBpbmZvcm1hdGlvbiB0byBiZSBwYXNzZWQgdG8gcnRwaml0dGVyYnVmZmVyL2V0YyB3aGVuIHNlZWtpbmcuIFRoaXMKKwkgIHVzdWFsbHkgd2Fzbid0IHRoYXQgbXVjaCBvZiBhIHByb2JsZW0gYXMgdGhlIGNvZGUgdGhlcmUgaXMgcm9idXN0IGVub3VnaCwgYnV0CisJICBldmVyeSBub3cgYW5kIHRoZW4gaXQgY2F1c2VzIHVzIHRvIGRyb3AgdXAgdG8gMzI3NTYgcGFja2V0cyBiZWZvcmUgd2UKKwkgIGNvbnRpbnVlIGRvaW5nIGFueXRoaW5nIG1lYW5pbmdmdWwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY1Njg5CisKKzIwMTYtMDQtMjcgMjA6MzM6MzggKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBFbnN1cmUgdG8gbm90IHRha2UgY2FwcyB3aXRoIHRoZSB3cm9uZyBwdCBmb3IgZ2V0dGluZyB0aGUgY2xvY2stcmF0ZQorCSAgRXNwZWNpYWxseSB0aGUgY2FwcyBvbiB0aGUgcGFkIG1pZ2h0IGJlIG91dCBvZiBkYXRlLCBhbmQgdGhlIG5ldyBjYXBzIHdvdWxkIGJlCisJICBwcm92aWRlZCBmb3IgdGhlIGN1cnJlbnQgcHQgdmlhIHRoZSByZXF1ZXN0LXB0LW1hcCBzaWduYWwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY1Njg5CisKKzIwMTYtMDQtMjcgMTg6Mjc6MTcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IERvbid0IHByb3BhZ2F0ZSBzcHVyaW91cyBzdGF0ZSBjaGFuZ2UgcmV0dXJucyBmcm9tIGludGVybmFsIGVsZW1lbnRzIGZ1cnRoZXIKKwkgIFdlIGhhbmRsZSB0aGVtIGluc2lkZSBydHNwc3JjIGFuZCBvdmVycmlkZSB0aGVtIGluIGFsbCBvdGhlciBjYXNlcyBhbnl3YXksIHNvCisJICBkbyB0aGUgc2FtZSBmb3IgImludGVybmFsIiBzdGF0ZSBjaGFuZ2VzIGxpa2UgUEFVU0VELT5QQVVTRUQgYW5kCisJICBQTEFZSU5HLT5QTEFZSU5HLgorCSAgVGhpcyBrZWVwcyB1bmV4cGVjdGVkIE5PX1BSRVJPTEwgdG8gY29uZnVzZSBzdGF0ZSBjaGFuZ2VzIGluIEdzdEJpbi4KKwkgIFNlZSBhbHNvIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjA1MzIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjU2ODkKKworMjAxNi0wNC0yNyAxNDowOTowMyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogRG9uJ3Qgb3ZlcnJpZGUgbWF4aW11bSBhdWRpbyBjaHVuayBzaXplIHdpdGggdGhlIHNjYWxlIGFnYWluIGp1c3QgYmVmb3JlIHdyaXRpbmcgaXQKKwkgIHNldF9maWVsZHMoKSBzaG91bGQgb25seSBiZSBjYWxsZWQgaW4gdGhlIGJlZ2lubmluZywgb3RoZXJ3aXNlIHdlIHdpbGwgbmV2ZXIKKwkgIHJlbWVtYmVyIHRoZSBtYXhpbXVtIGF1ZGlvIGNodW5rIHNpemUgYW5kIHdyaXRlIGEgd3JvbmcgYmxvY2sgYWxpZ24uLi4gd2hpY2gKKwkgIHRoZW4gY2F1c2VzIHdyb25nIHRpbWVzdGFtcHMgYW5kIG90aGVyIHByb2JsZW1zLgorCisyMDE2LTA0LTI3IDEzOjUzOjAwICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBBY3R1YWxseSBzdG9yZSB0aGUgbGFyZ2VzdCBhdWRpbyBjaHVuayBzaXplIGZvciB0aGUgVkJSIGNhc2Ugb2YgTVAyL01QMworCSAgM2VhMzM4Y2UyNzFlMWY2YTk2ZDJlZDQ5ZDQ0NzJiMDkxZjZmOGI3ZSBjaGFuZ2VkIGF2aW11eCB0byBkbyB0aGF0LCBidXQgaXQKKwkgIG5ldmVyIGFjdHVhbGx5IGtlcHQgdHJhY2sgb2YgdGhlIG1heCBhdWRpbyBjaHVuayBmb3IgTVAzIGFuZCBNUDIuIFRoZXNlIGFyZQorCSAga25vd2luZyB0aGUgaGRyLnNjYWxlIG9ubHkgYWZ0ZXIgcGFyc2luZyB0aGUgZnJhbWVzIGluc3RlYWQgb2YgYXQgc2V0Y2FwcworCSAgdGltZS4KKworMjAxNi0wNC0yNSAxNTowMzoxNCArMDIwMCAgTWF0cyBMaW5kZXN0YW0gPG1hdHNsbUBheGlzLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpdWRwc2luazogQWxsb3cgc2V0dGluZyAic29ja2V0LXY2IiB3aXRob3V0IHNldHRpbmcgInNvY2tldCIgdG9vCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY0ODk3CisKKzIwMTYtMDQtMjIgMTU6MDI6MTYgKzAxMDAgIE1hcmlvIFNhbmNoZXogUHJhZGEgPG1hcmlvQGVuZGxlc3NtLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cHhlbmMuYzoKKwkgIHZweGVuYzogUHJvcGVybHkgaGFuZGxlIGZyYW1lcyB3aXRoIHRvbyBsb3cgZHVyYXRpb24KKwkgIFdoZW4gYSBmcmFtZSdzIGR1cmF0aW9uIGlzIHRvbyBsb3csIGNhbGxpbmcgZ3N0X3V0aWxfdWludDY0X3NjYWxlKCkKKwkgIHRvIHNjYWxlIGl0cyB2YWx1ZSBjYW4gcmVzdWx0IGludG8gaXQgYmVpbmcgdHJ1bmNhdGVkIHRvIHplcm8sIHdoaWNoCisJICB3aWxsIGNhdXNlIHRoZSB2cHggZW5jb2RlciB0byByZXR1cm4gYW4gVlBYX0NPREVDX0lOVkFMSURfUEFSQU0gZXJyb3IKKwkgIHdoZW4gdHJ5aW5nIHRvIGVuY29kZS4KKwkgIFRvIHByZXZlbnQgdGhpcyBmcm9tIGhhcHBlbmluZywgd2Ugc2ltcGx5IGlnbm9yZSB0aGUgZHVyYXRpb24gd2hlbgorCSAgZW5jb2RpbmcgaWYgaXQgYmVjb21lcyB6ZXJvIGFmdGVyIHNjYWxpbmcsIGxvZ2dpbmcgYSB3YXJuaW5nIG1lc3NhZ2UuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY1MzkxCisKKzIwMTYtMDQtMjIgMTU6NDg6MDggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IGZpeCBkZXNjcmlwdGlvbiBvZiBsaW5lYXIgaW50ZXJsYWNpbmcgbWV0aG9kCisKKzIwMTYtMDQtMjEgMTQ6MDg6MTkgLTAzMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRzYXVuaWVyQGdub21lLm9yZz4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdjogSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGRvIG5vdCBnZXQgYW55IENvbGxlY3REYXRhIGluIGhhbmRsZV9idWZmZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjUzMjAKKworMjAxNi0wNC0xMSAyMjo0MToyMCArMDkwMCAgU2V1bmdoYSBZYW5nIDxzaC55YW5nQGxnZS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRG8gbm90IHVzZSB1bnJlbGlhYmxlIGZyYW1lcmF0ZQorCSAgdGltZXNjYWxlLzEgaXMgdW5yZWxpYWJsZSB2YWx1ZSBmb3IgZnJhbWVyYXRlLiBEdWUgdG8gZG93bnN0cmVhbQorCSAgZWxlbWVudCB1c3VhbGx5IHVzZSBmcmFtZXJhdGUgZ2VuZXJhdGVkIGJ5IHF0ZGVtdXgsIGxldCBpdCBiZSBvbWl0dGVkCisJICB1bnRpbCB0aGUgZnJhbWVyYXRlIGNhbiBiZSByZWxpYWJseSBjYWxjdWxhdGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NDczMworCisyMDE2LTA0LTIxIDEyOjUzOjMzICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5oOgorCSAgUmV2ZXJ0ICJxdGRlbXV4OiBleHBvc2Ugc3RyZWFtcyB3aXRoIGZpcnN0IG1vb2YgZm9yIGZyYWdtZW50ZWQgZm9ybWF0IgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCBkOGJiNjY4N2VhMjUxNTcwYzMzMTAzODI3OWE0M2Q0NDgxNjdkNmFkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NDczMworCisyMDE2LTAyLTA5IDE3OjE3OjA5ICswMDAwICBBbGV4IEFzaGxleSA8YnVnemlsbGFAYXNobGV5LWZhbWlseS5uZXQ+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogc3VwcG9ydCBzZWVraW5nIG9mIENFTkMgZW5jcnlwdGVkIHN0cmVhbXMKKwkgIFdoZW4gcGxheWluZyBhIHN0cmVhbSB0aGF0IGhhcyBiZWVuIHByb3RlY3RlZCBieSBEQVNIIENFTkMsIHBsYXliYWNrCisJICB3aWxsIGZhaWwgaWYgYSBzZWVrIGlzIHBlcmZvcm1lZC4gUXRkZW11eCBwcm9kdWNlcyB0aGUgZXJyb3IgInN0cmVhbQorCSAgaXMgcHJvdGVjdGVkIHVzaW5nIGNlbmMsIGJ1dCBubyBjZW5jIHByb3RlY3Rpb24gc3lzdGVtIGluZm9ybWF0aW9uCisJICBoYXMgYmVlbiBmb3VuZCIgYW5kIHBsYXliYWNrIHN0b3BzLgorCSAgVGhlIHByb2JsZW0gaXMgdGhhdCBnc3RfcXRkZW11eF9yZXNldCgpIGdldHMgY2FsbGVkIGFzIHBhcnQgb2YgdGhlCisJICBGTFVTSCBkdXJpbmcgYSBzZWVrLiBUaGlzIGZ1bmN0aW9uIGZyZWVzIHRoZSBwcm90ZWN0aW9uX3N5c3RlbV9pZHMKKwkgIGFycmF5LiBXaGVuIGdzdF9xdGRlbXV4X2NvbmZpZ3VyZV9wcm90ZWN0ZWRfY2FwcygpIGlzIGNhbGxlZCBhZnRlciB0aGUKKwkgIHNlZWsgaGFzIGNvbXBsZXRlZCwgdGhlIHByb3RlY3Rpb25fc3lzdGVtX2lkcyBhcnJheSBpcyBlbXB0eSBhbmQKKwkgIHF0ZGVtdXggaXMgdW5hYmxlIHRvIGNyZWF0ZSB0aGUgY29ycmVjdCBvdXRwdXQgY2FwcyBmb3IgdGhlIHByb3RlY3RlZAorCSAgc3RyZWFtLgorCSAgVGhpcyBjb21taXQgY2hhbmdlcyBpdCB0byBvbmx5IGZyZWUgdGhlIHByb3RlY3Rpb25fc3lzdGVtX2lkcyBvbgorCSAgaGFyZCByZXNldHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYxNzg3CisKKzIwMTYtMDQtMTggMTQ6MzM6MTAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCSAgdWRwc3JjOiBhZGQgInJldHJpZXZlLXNlbmRlci1hZGRyZXNzIiBwcm9wZXJ0eQorCSAgVGhpcyBhbGxvd3MgZGlzYWJsaW5nIG9mIHNlbmRlciBhZGRyZXNzIHJldHJpZXZhbCwgd2hpY2ggbWlnaHQKKwkgIGJlIHVzZWZ1bCBpbiBjZXJ0YWluIHNjZW5hcmlvcywgbGlrZSB3aGVuIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkLAorCSAgb3IgdGhlIHNlbmRlciBhZGRyZXNzIGlzIG5vdCBvZiBpbnRlcmVzdCAoZS5nLiB3aGVuIHJlY2VpdmluZyBhbgorCSAgTVBFRy1UUyBzdHJlYW0pLiBEaXNhYmxpbmcgc2VuZGVyIGFkZHJlc3MgcmV0cmlldmFsIGluIHRob3NlCisJICBjYXNlcyBjYW4gaGF2ZSBtaW5vciBwZXJmb3JtYW5jZSBhZHZhbnRhZ2VzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU2MzMyMworCisyMDE1LTExLTI2IDEzOjE1OjA2ICswMTAwICBEaW1pdHJpb3MgS2F0c2Fyb3MgPHBhdGNoZXJ3b3JrQGdtYWlsLmNvbT4KKworCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSAgdjRsMjogQ2hhbmdlIHdhcm5pbmcgaGFuZGxpbmcgdG8gYnJlYWsgaW5maW5pdGUgbWVzc2FnZSBsb29wCisJICB2NGwyc3JjIGNhbiBjYXVzZSBhbiAiaW5maW5pdGUgbWVzc2FnZSBsb29wIiB3aGVuIGEgYmFzZSBjb250cm9sIGV4cG9zZWQgYXMgYQorCSAgcHJvcGVydHkgaXMgbm90IHByb3ZpZGVkIGJ5IHRoZSBkZXZpY2UuIEluIHRoZXNlIGNhc2VzLCBpZiBpbiB0aGUgd2FybmluZyBtZXNzYWdlCisJICBoYW5kbGluZyBmb3IgdGhlIGJ1cywgdGhlIEdTVF9ERUJVR19CSU5fVE9fRE9UX0ZJTEUqIGNhdGVnb3J5IG9mIGZ1bmN0aW9ucyBhcmUgdXNlZCwKKwkgIHRoZSBzcmMgbG9va3VwIGNhdXNlcyBhIG5ldyB3YXJuaW5nIHRvIGJlIHBvc3RlZCBvbiB0aGUgYnVzLCBjYXVzaW5nIGEgbG9vcC4KKwkgIFRoaXMgcGF0Y2ggY2hhbmdlcyB0aGUgd2FybmluZyBmb3IgdGhlc2UgY29udHJvbHMgc28gdGhleSBhcmUgbm90IHBvc3RlZCBvbiB0aGUgYnVzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1ODcwMworCisyMDE2LTA0LTE1IDEwOjQ0OjAyIC0wNDAwICBYYXZpZXIgQ2xhZXNzZW5zIDx4YXZpZXIuY2xhZXNzZW5zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGl0bXV4c2luazogQXZvaWQgY3JlYXRpbmcgc21hbGwgZmlsZSBhdCBFT1MKKwkgIFdoZW4gRU9TIGlzIHJlYWNoZWQsIHRoZSBjdXJyZW50IGZpbGUgZ2V0IGNsb3NlZCBhbmQgdGhlIGxhc3QKKwkgIEdPUCBpbiB0aGUgbXEgd2FzIHdyaXR0ZW4gaW4gYSBuZXcgZmlsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjUwNzIKKworMjAxNi0wNC0xNSAxOTo1OToxNSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jOgorCSAgc2NhbGV0ZW1wbzogUzE2IHVzZXMgUzMyIHRlbXBvcmFyeSBidWZmZXJzLCBmbG9hdC9kb3VibGUgdGhlaXIgb3duIHR5cGUKKwkgIE1ha2Ugc3VyZSB0byBhbGxvY2F0ZSBub3Qgb25seSBhIFMxNiBidWZmZXIgZm9yIFMxNiBidXQgYSB0d2ljZSBhcyBiaWcgb25lIHRvCisJICBob2xkIFMzMi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjUxMTYKKworMjAxNi0wNC0xNiAwMjoxNzoyNiArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIFJldmVydCAicHVsc2VzaW5rOiB1bmNvcmsgaWYgbmVlZGVkIHVwb24gY29tbWl0IgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCAwZGQ0NmFjY2Y2ZDI4MmZmMDcwNjU4NTJiZDkxYzg1Yzc4YWYzMzk0LgorCSAgV2l0aCBzb21lIGF1ZGlvc2lua3MsIHN0YXJ0aW5nIHRoZSByaW5nYnVmZmVyIG9uIHRoZSBmaXJzdCBjb21taXQKKwkgIGNhdXNlcyBhdWRpbyBnbGl0Y2hlcyBhdCBzdGFydHVwIGJ5IHN0YXJ0aW5nIHRvIG91dHB1dCBzZWdtZW50cworCSAgZnJvbSB0aGUgcmluZ2J1ZmZlciBiZWZvcmUgaXQgaGFzIGJlZW4gZmlsbGVkIC8gZnVsbHkgcHJlcm9sbGVkLiBUaGlzCisJICBkb2Vzbid0IHVzdWFsbHkgaGFwcGVuIHdpdGggcHVsc2VzaW5rIGJlY2F1c2Ugd2UgbWFwIHRoZSBwdWxzZWF1ZGlvCisJICByaW5nYnVmZmVyIGRpcmVjdGx5LCBidXQgd2Ugc2hvdWxkIGtlZXAgdGhpbmdzIGNvbnNpc3RlbnQgd2l0aAorCSAgb3RoZXIgc2lua3Mgd2l0aCByZWdhcmRzIHRvIHN0YXJ0dXAgbGF0ZW5jeSwgcGx1cyBpdCBnaXZlcyBtb3JlCisJICBoZWFkd2F5IHRvIGF2b2lkIGdsaXRjaGluZywgc2hvdWxkIHRoZSBpbml0aWFsIDJuZCBzZWdtZW50IHRha2UKKwkgIG1vcmUgdGhhbiAxMG1zIHRvIGdlbmVyYXRlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1NzA3NgorCisyMDE2LTA0LTE1IDAwOjQ2OjU2IC0wNzAwICBBbGVpeCBDb25jaGlsbG8gRmxhcXXDqSA8YWxlaXhAb2Jsb25nLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogYWRkIHNydHAgcm9sbG92ZXIgY291bnRlcnMgZnJvbSBtaWtleSBjcnlwdG8gc2Vzc2lvbnMKKwkgIFRoZSBzZXJ2ZXIgY2FuIHNlbmQgbXVsdGlwbGUgY3J5cHRvIHNlc3Npb25zLCBvbmUgZm9yIGVhY2ggU1NSQyB3aXRoIGl0cworCSAgb3duIHJvbGxvdmVyIGNvdW50ZXIuIFdlIHBhcnNlIHRoaXMgaW5mb3JtYXRpb24gYW5kIHBhc3MgaXQgdG8gdGhlIFNSVFAKKwkgIGRlY29kZXIgdmlhIHRoZSAicmVxdWVzdC1rZXkiIHNpZ25hbC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzA1NDAKKworMjAxNi0wNC0xNSAxNDozNTowNyArMDAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBGaXggZGVidWcgb3V0cHV0IHdoZW4gcmVzeW5jaW5nCisJICBEb24ndCBvdXRwdXQgdGhlIHBvaW50ZXIgdmFsdWUgb2YgdGhlIHRpbWUoKSBmdW5jdGlvbiBhcyBhIHRpbWVzdGFtcAorCSAgYnkgdXNpbmcgdGhlIGNvcnJlY3QgdmFyaWFibGUuCisJICBGaXhlcyBidWlsZCBvbiBSYXNwYmVycnkgUGkgMy4KKworMjAxNi0wNC0xNSAxMTozNjozNiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJICBzb3VwaHR0cGNsaWVudHNpbms6IElmIG5vIHByb3h5IGlzIHNldCBieSBwcm9wZXJ0aWVzLCB1c2UgdGhlIGRlZmF1bHQgbGlic291cCBwcm94eSByZXNvbHZlcgorCSAgVGhhdCBpcywgdXNlIHdoYXRldmVyIHN5c3RlbSBzZXR0aW5ncyB0aGVyZSBtaWdodCBleGlzdC4gVGhpcyBpcyB0aGUgc2FtZQorCSAgYmVoYXZpb3VyIHdlIHVzZSBpbiB0aGUgSFRUUCBzb3VyY2UuCisKKzIwMTYtMDQtMTQgMTA6MDE6MjggKzAxMDAgIEp1bGllbiBJc29yY2UgPGouaXNvcmNlQHNhbXN1bmcuY29tPgorCisJKiBSRUFETUU6CisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNmYyZDIwOSB0byBhYzJmNjQ3CisKKzIwMTYtMDQtMTMgMTg6NDU6MDcgKzAxMDAgIERhbWlhbiBaaW9icm8gPGRhbWlhbkB4bWVtZW50b2l0LmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmg6CisJICBzcGxpdG11eHNpbms6IEFkZCBtYXhfZmlsZXNfbnVtYmVyIHByb3BlcnR5CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ0NjEyCisKKzIwMTYtMDQtMTMgMTA6NTc6MDMgLTA3MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXI6IGRyb3AgcmVmZXJlbmNlIHRvIHZpZGVvbWl4ZXIgMgorCSAgRml4IGEgc21hbGwgZ3JhbW1hciBtaXN0YWtlIG9uICJvdmVybGF5ZWQiIHdoaWxlIGF0IGl0LgorCisyMDE2LTA0LTEzIDA5OjU3OjE2ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzoKKwkgIHhpbWFnZTogSW5pdGlhbGl6ZSBhbGwgZmllbGRzIGluIHRoZSBtZXRhIGV4cGxpY2l0bHkKKwkgIFRoZSBtZXRhIGlzIG5vdCBhbGxvY2F0ZWQgd2l0aCBhbGwgZmllbGRzIGluaXRpYWxpemVkIHRvIHplcm9lcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjQ5MDIKKworMjAxNi0wNC0xMiAwOTo0MTowMCArMDAwMCAgUGFvbG8gUGV0dGluYXRvIDxwcGV0dGluYUBjaXNjby5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBGb3J3YXJkIHN0aWNreSBldmVudHMgb24gYnVmZmVyIGxpc3RzIHRvbywgbm90IG9ubHkgb24gYnVmZmVycworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NDkzMworCisyMDE2LTA0LTEyIDE1OjAxOjI4ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBEcmFpbiB0aGUgZmllbGQgaGlzdG9yeSBpZiB0aGUgY2FwcyBhcmUgY2hhbmdpbmcKKwkgIE90aGVyd2lzZSB3ZSB3aWxsIHVzZSBmaWVsZHMgZnJvbSB0aGUgb2xkIGNhcHMgd2l0aCBldmVyeXRoaW5nIHNldCB1cCBmb3IgdGhlCisJICBuZXcgY2FwcywgY2F1c2luZyBjcmFzaGVzIGFuZCB3b3JzZS4KKwkgIEFsc28gZG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlIHNhbWUgY2FwcyBhcmUgc2V0IHR3aWNlLgorCisyMDE2LTA0LTEyIDE1OjAwOjMxICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBJbnN0ZWFkIG9mIGNvbmZ1c2luZyBjcmFzaGVzIGxhdGVyLCBqdXN0IGVycm9yIG91dCBpbW1lZGlhdGVseSBpZiBtYXBwaW5nIGEgdmlkZW8gZnJhbWUgZmFpbHMKKwkgIFRoaXMgcHJvYmFibHkgc3RpbGwgY3Jhc2hlcyBidXQgYXQgbGVhc3Qgd2UgZ2V0IHNvbWUgaGludCBhYm91dCB3aGF0IGdvZXMKKwkgIHdyb25nIGluc3RlYWQgb2YgcmFuZG9tIGJlaGF2aW91ciBsYXRlci4KKworMjAxNi0wNC0xMiAxMTozODo1MSArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBjaGVjayBzdHJlYW0gaXMgYXZhaWxhYmxlIGluIFBJRkYgcGFyc2VyCisJICBxdGRlbXV4LT5zdHJlYW1zIGlzIGFuIGFycmF5LCBpdCB3aWxsIG5ldmVyIGV2YWx1YXRlIHRvIHRydWUgd2hlbiBjb21wYXJpbmcKKwkgIHRvIE5VTEwuIEluc3RlYWQgd2Ugd2FudCB0byBjaGVjayB0aGUgbnVtYmVyIG9mIHN0cmVhbXMgdG8gbWFrZSBzdXJlIHRoZQorCSAgc3RyZWFtIGlzIGF2YWlsYWJsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM2MTQKKwkgIENJRCAxMzU4Mzg5CisKKzIwMTYtMDQtMTIgMTE6Mzc6MzYgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgUmV2ZXJ0ICJxdGRlbXV4OiByZWR1bmRhbnQgY2hlY2sgaW4gUElGRiBwYXJzZXIiCisJICBUaGlzIHJldmVydHMgY29tbWl0IDQxZTEwNTI0ZjNiYWJkZDkyYWFjOGM4YzlkNWI5Y2RmMTg0YzJkNGUuCisKKzIwMTYtMDQtMTIgMTE6MDU6NTAgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcmVkdW5kYW50IGNoZWNrIGluIFBJRkYgcGFyc2VyCisJICBxdGRlbXV4LT5zdHJlYW1zIGlzIGFuIGFycmF5IG9mIHNpemUgR1NUX1FUREVNVVhfTUFYX1NUUkVBTVMsIGl0IHdpbGwgbmV2ZXIKKwkgIGV2YWx1YXRlIHRvIHRydWUgd2hlbiBjb21wYXJpbmcgdG8gTlVMTC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM2MTQKKwkgIENJRCAxMzU4Mzg5CisKKzIwMTYtMDQtMTIgMTE6NTY6MDggKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBhdm9pZCBsZWFraW5nIEdWYWx1ZXMKKwkgIHVuc2V0IHRoZSBHVmFsdWUgaWYgd2UgZG9uJ3QgdXNlIGl0IGFueSBtb3JlIHRvIGF2b2lkIGxlYWtzLgorCisyMDE2LTA0LTEyIDEwOjE1OjM5ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogRml4IHJ0cF9qaXR0ZXJfYnVmZmVyX2dldF90c19kaWZmKCkgZmlsbCBsZXZlbCBjYWxjdWxhdGlvbgorCSAgVGhlIGhlYWQgb2YgdGhlIHF1ZXVlIGlzIHRoZSBvbGRlc3QgcGFja2V0IChhcyBpbiBsb3dlc3Qgc2VxbnVtKSwgdGhlIHRhaWwgaXMKKwkgIHRoZSBuZXdlc3QgcGFja2V0LiBUbyBjYWxjdWxhdGUgdGhlIGZpbGwgbGV2ZWwsIHdlIHNob3VsZCBjYWxjdWxhdGUgdGFpbC1oZWFkCisJICB3aGlsZSBjb25zaWRlcmluZyB3cmFwYXJvdW5kcy4gTm90IHRoZSBvdGhlciB3YXkgYXJvdW5kLgorCSAgT3RoZXIgY29kZSBpcyBhbHJlYWR5IGRvaW5nIHRoaXMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY0ODg5CisKKzIwMTYtMDQtMTEgMTA6NDQ6NTYgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSAgcnRwbWFuYWdlcjogSXQncyBHU1RfTElCUywgbm90IEdTVF9MSUJTX0xJQlMKKworMjAxNi0wNC0xMSAwODozMzoxNyArMDkwMCAgU2V1bmdoYSBZYW5nIDxzaC55YW5nQGxnZS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IHBhcnNpbmcgc2VnbWVudCBkdXJhdGlvbiBvZiBlbXB0eSBlZGl0IGxpc3QgYm94CisJICBGb3IgZW1wdHkgZWRpdCBsaXN0LCBzZWdtZW50LWR1cmF0aW9uIGluIGVkaXQgbGlzdCBib3ggc2hvdWxkIG5vdCBiZQorCSAgdXNlZCBmb3Igc2VnbWVudCBldmVudC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjQ4NzAKKworMjAxNi0wNC0wOCAxMzowNTo1NyArMDIwMCAgTmljb2xhIE11cmlubyA8bmljb2xhLm11cmlub0BnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBtYWtlIHRpbWVjb2Rlc2NhbGUgY29uZmlndXJhYmxlCisJICBJbiBzb21lIHVzZSBjYXNlcyB0aGUgZGVmYXVsdCB0aW1lY29kZXNjYWxlIHdpbGwgcHJvZHVjZSBibG9ja3Mgd2l0aCB0aGUgc2FtZSB0aW1lc3RhbXAKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjQ3NjkKKworMjAxNi0wNC0wNyAxMzowMTo1MiArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXRlcmJ1ZmZlcjogTW92ZSBhc3NlcnRpb24gdG8gdGhlIHJpZ2h0IGxvY2F0aW9uCisJICBXZSBzaG91bGRuJ3QgaGF2ZSAibGF0ZSIgbG9zdCB0aW1lcnMgYXQgdGhhdCBwb2ludAorCisyMDE2LTAzLTAyIDE0OjI1OjI0ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogU3BlZWQgdXAgbG9zdCB0aW1lb3V0IGhhbmRsaW5nCisJICBXaGVuIGRvd25zdHJlYW0gYmxvY2tzLCAibG9zdCIgdGltZXJzIGFyZSBjcmVhdGVkIHRvIG5vdGlmeSB0aGUKKwkgIG91dGdvaW5nIHRocmVhZCB0aGF0IHBhY2tldHMgYXJlIGxvc3QuCisJICBUaGUgcHJvYmxlbSBpcyB0aGF0IGZvciBoaWdoIHBhY2tldC1yYXRlIHN0cmVhbXMsIHdlIG1pZ2h0IGVuZCB1cCB3aXRoCisJICBhIGJpZyBsaXN0IG9mIGxvc3QgdGltZW91dHMgKGhhZCBhIHVzZS1jYXNlIHdpdGggfjEwMDAuLi4pLgorCSAgVGhlIHByb2JsZW0gaXNuJ3Qgc28gbXVjaCB0aGUgYW1vdW50IG9mIGxvc3QgdGltZW91dHMgdG8gaGFuZGxlLCBidXQKKwkgIHJhdGhlciB0aGUgd2F5IHRoZXkgd2VyZSBoYW5kbGVkLiBBbGwgdGltZXJzIHdvdWxkIGZpcnN0IGJlIGl0ZXJhdGVkLAorCSAgdGhlbiB0aGUgb25lIHNlbGVjdGVkIHdvdWxkIGJlIGhhbmRsZWQgLi4uIHRvIHJlLWl0ZXJhdGUgdGhlIGxpc3QgYWdhaW4uCisJICBBbGwgb2YgdGhpcyBpcyBiZWluZyBkb25lIHdoaWxlIHRoZSBqYnVmIGxvY2sgaXMgdGFrZW4sIHdoaWNoIGluIHNvbWUgdXNlLWNhc2VzCisJICB3b3VsZCByZXR1cm4gaW4gaG9sZGluZyB0aGF0IGxvY2sgZm9yIDEwcy4uLiBibG9ja2luZyBhbnkgYnVmZmVycyBmcm9tCisJICBiZWluZyBhY2NlcHRlZCBpbiBpbnB1dC4uLiB3aGljaCB3b3VsZCB0aGVuIGFycml2ZSBsYXRlIC4uLiB3aGljaCB3b3VsZAorCSAgY3JlYXRlIHBsZW50eSBvZiBsb3N0IHRpbWVycyAuLi4gd2hpY2ggd291bGQgY2F1c2UgdGhlIHNhbWUgaXNzdWUuCisJICBJbiBvcmRlciB0byBhdm9pZCB0aGF0IHNpdHVhdGlvbiwgaGFuZGxlIHRoZSBsb3N0IHRpbWVycyBpbW1lZGlhdGVseSB3aGVuCisJICBpdGVyYXRpbmcgdGhlIGxpc3Qgb2YgcGVuZGluZyB0aW1lcnMuIFRoaXMgbW9kaWZpZXMgdGhlIGNvbXBsZXhpdHkgZnJvbQorCSAgYSBxdWFkcmF0aWMgdG8gYSBsaW5lYXIgY29tcGxleGl0eS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjI5ODgKKworMjAxNi0wMy0wMiAxNDoyMzowMSArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IERvbid0IGNyZWF0ZSBsb3N0IGV2ZW50cyBpZiB3ZSBkb24ndCBuZWVkIHRoZW0KKwkgIFdoZW4gImRvLWxvc3QiIGlzIHNldCB0byBGQUxTRSB3ZSBkb24ndCB1c2Uvc2VuZCB0aGUgbG9zdCBldmVudHMuCisJICBJbiB0aGF0IGNhc2UsIGRvbid0IGNyZWF0ZSB0aGVtIHRvIHN0YXJ0IHdpdGggOikKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjI5ODgKKworMjAxNi0wMy0wMiAxMzo1NzowNyArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IEFkZCB0cmFjaW5nIG9mIGxvY2sgdXNhZ2UKKwkgIEhlbHBzIHdpdGggZGVidWdnaW5nIGxvY2sgdXNhZ2UKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjI5ODgKKworMjAxNi0wMi0xMCAxOTo1Njo1OSArMDUzMCAgTmlyYmhlZWsgQ2hhdWhhbiA8bmlyYmhlZWtAY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyZGV2aWNlcHJvdmlkZXIuYzoKKwkgIHY0bDI6IERvbid0IGxlYWsgdjRsMiBvYmplY3RzIGFuZCBwcm9wcyBvbiBwcm9iZSBlcnJvcnMKKworMjAxNi0wNC0wNCAxNzo0MjowMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHRlc3RzOiBhZGQgdW5pdCB0ZXN0IGZvciBqcGVnIGRlcGF5bG9hZGVyIHBhY2tldCBsb3NzIGhhbmRsaW5nCisJICBNYWtlIHN1cmUgaXQgYWx3YXlzIG91dHB1dHMgc29tZXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIHZhbGlkCisJICBKUEVHIGZyYW1lLCBpZS4gc3RhcnRzIHdpdGggYW4gU09JIG1hcmtlciBhbmQgZW5kcyB3aXRoIGFuIEVPSQorCSAgbWFya2VyLgorCisyMDE2LTAzLTE1IDAzOjI1OjI2ICswNTMwICBOaXJiaGVlayBDaGF1aGFuIDxuaXJiaGVla0BjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJICBydHBqcGVnZGVwYXk6IERvbid0IHNlbmQgaW52YWxpZCBmcmFtZXMgZG93bnN0cmVhbSBhZnRlciBwYWNrZXQgbG9zcyBvciBhIERJU0NPTlQKKwkgIEFmdGVyIGNsZWFyaW5nIHRoZSBhZGFwdGVyIGR1ZSB0byBhIERJU0NPTlQsIGFzIG1pZ2h0IGhhcHBlbiB3aGVuIHNvbWUgcGFja2V0KHMpCisJICBoYXZlIGJlZW4gbG9zdCwgdGhlIGRlcGF5bG9hZGVyIHdhcyBwdXNoaW5nIGRhdGEgaW50byB0aGUgYWRhcHRlciAod2hpY2ggaGFkIG5vCisJICBoZWFkZXIgZHVlIHRvIHRoZSBjbGVhciksIGNyZWF0aW5nIGEgaGVhZGVybGVzcyBmcmFtZSBvdXQgb2YgaXQsIGFuZCBzZW5kaW5nIGl0CisJICBkb3duc3RyZWFtLiBUaGUgZG93bnN0cmVhbSBkZWNvZGVyIHdvdWxkIHRoZW4gdXN1YWxseSBpZ25vcmUgaXQ7IHVubGVzcyB0aGVyZQorCSAgd2VyZSBsb3RzIG9mIERJU0NPTlRzIGZyb20gdGhlIGppdHRlcmJ1ZmZlciBpbiB3aGljaCBjYXNlIHRoZSBkZWNvZGVyIHdvdWxkIHJlYWNoCisJICBpdHMgbWF4X2Vycm9ycyBsaW1pdCBhbmQgdGhyb3cgYW4gZWxlbWVudCBlcnJvci4gTm93IHdlIGp1c3QgZGlzY2FyZCB0aGF0IGRhdGEuCisJICBJdCBpcyBwcm9iYWJ5IG5vdCB3b3J0aCB0cnlpbmcgdG8gc2FsdmFnZSB0aGlzIGRhdGEgYmVjYXVzZSBub24tcHJvZ3Jlc3NpdmUKKwkgIGpwZWcgZG9lcyBub3QgZGVncmFkZSBncmFjZWZ1bGx5IGFuZCBtYWtlcyB0aGUgdmlkZW8gdW53YXRjaGFibGUgZXZlbiB3aXRoCisJICBsb3cgcGFja2V0IGxvc3Mgc3VjaCBhcyAzLTUlLgorCisyMDE2LTAxLTA1IDE2OjE1OjE2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRwaml0dGVyYnVmZmVyOiBBZGQgUkZDNzI3MyBtZWRpYSBjbG9jayBoYW5kbGluZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MjI1OQorCisyMDE1LTA3LTEwIDA5OjQ0OjE1ICswMjAwICBQaGlsaXBwZSBOb3JtYW5kIDxwaGlsbkBpZ2FsaWEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFBJRkYgYm94IGRldGVjdGlvbiBhbmQgcGFyc2luZyBzdXBwb3J0CisJICBUaGUgUElGRiBkYXRhIGlzIHN0b3JlZCBpbiBhIGN1c3RvbSBVVUlEIGJveCB3aGljaCBpcyBwYXJzZWQgYW5kIHRoZQorCSAgY3J5cHRvX2luZm8gb2YgdGhlIGVsZW1lbnQgaXMgdXBkYXRlZCBhY2NvcmRpbmdseS4gVGhpcyBhbGxvd3MKKwkgIGRvd25zdHJlYW0gZGVjcnlwdG9ycyB0byBwcm9jZXNzIGFuZCBkZWNyeXB0IHRoZSBwcm90ZWN0ZWQgY29udGVudC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM2MTQKKworMjAxNi0wNC0wMSAxMjoxNTowNSArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOgorCSAgcnRwdm9yYmlzZGVwYXk6IHJlbW92ZSBkZWFkIGNvZGUKKwkgIHBheWxvYWRfYnVmZmVyIGhhc24ndCBiZWVuIGFzc2lnbmVkIGEgdmFsdWUgYmVmb3JlIHRoZSBqdW1wcyB0bworCSAgc3dpdGNoX2ZhaWxlZCBvciBwYWNrZXRfc2hvcnQuIFNvIHRoZSB2YWx1ZSBtdXN0IGJlIE5VTEwuIE5vIG5lZWQKKwkgIHRvIHVubWFwIGFuZCB1bnJlZi4KKwkgIENJRCAjMTMxNjQ3NgorCisyMDE2LTAzLTMxIDE0OjU3OjIwICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgIHJ0cGgyNjNwYXk6IGZpeCBsZWFrCisJICBGcmVlIG1lbW9yeSBvZiBjdXJyZW50IG1hY3JvYmxvY2sgb25jZSBpdCBpc24ndCBuZWVkZWQgc28gaXQgaXNuJ3QgbGVha2VkCisJICBieSB0aGUgY2FsbCBvZiB0aGUgZ3N0X3J0cF9oMjYzX3BheV9CX21iZmluZGVyIGZ1bmN0aW9uLgorCSAgaWYgKCEobWFjID0gZ3N0X3J0cF9oMjYzX3BheV9CX21iZmluZGVyIChjb250ZXh0LCBnb2IsIG1hYywgbWIpKSkgeworCSAgQ0lEIDEyMTIxNTYKKworMjAxNi0wMy0zMSAwMjoxNTowNCArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eDogSGFuZGxlIGEgaGFuZyBkcmFpbmluZyBvdXQgYXQgRU9TCisJICBNYWtlIHN1cmUgdGhhdCBhbGwgZGF0YSBpcyBkcmFpbmVkIG91dCB3aGVuIHRoZSByZWZlcmVuY2UgcGFkCisJICBnb2VzIEVPUy4gRml4ZXMgYSBwcm9ibGVtIHdoZXJlIGRhdGEgdGhhdCBhcnJpdmVzIG9uIG90aGVyCisJICBwYWRzIGFmdGVyIHRoZSByZWZlcmVuY2UgcGFkIGZpbmlzaGVzIGNhbiBzdGFsbCBmb3JldmVyIGFuZAorCSAgbmV2ZXIgcGFzcyBFT1MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYzNzExCisKKzIwMTYtMDMtMTggMTU6NDU6MDEgLTA0MDAgIFhhdmllciBDbGFlc3NlbnMgPHhhdmllci5jbGFlc3NlbnNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkgIHNwbGl0bXV4c2luazogRml4IG9jY2FzaW9uYWwgZGVhZGxvY2sgd2hlbiBlbmRpbmcgZmlsZSB3aXRoIHN1YnRpdGxlCisJICBEZWFkbG9jayBvY2N1cnMgd2hlbiBzcGxpdHRpbmcgZmlsZXMgaWYgb25lIHN0cmVhbSByZWNlaXZlZCBubyBidWZmZXIgZHVyaW5nCisJICB0aGUgZmlyc3QgR09QIG9mIHRoZSBuZXh0IGZpbGUuIFRoYXQgY2FuIGhhcHBlbiBpbiB0aGF0IHNjZW5hcmlvIGZvciBleGFtcGxlOgorCSAgMSkgVGhlIGZpcnN0IEdPUCBvZiB2aWRlbyBpcyBjb2xsZWN0ZWQsIGl0IGhhcyBhIGR1cmF0aW9uIG9mIDEwcy4KKwkgIG1heF9pbl9ydW5uaW5nX3RpbWUgaXMgc2V0IHRvIDEwcy4KKwkgIDIpIE90aGVyIHN0cmVhbXMgY2F0Y2h1cCBhbmQgd2UgcmVjZWl2ZSB0aGUgZmlyc3Qgc3VidGl0bGUgYnVmZmVyIGF0IHRzPTAgYW5kCisJICBoYXMgYSBkdXJhdGlvbiBvZiAxbWluLgorCSAgMykgV2UgcmVjZWl2ZSB0aGUgMm5kIHN1YnRpdGxlIGJ1ZmZlciB3aXRoIGEgdHM9MW1pbi4gaW5fcnVubmluZ190aW1lIGlzIHNldCB0bworCSAgMW1pbi4gVGhhdCBidWZmZXIgaXMgYmxvY2tlZCBpbiBoYW5kbGVfbXFfaW5wdXQoKSBiZWNhdXNlCisJICBtYXhfaW5fcnVubmluZ190aW1lIGlzIHN0aWxsIDEwcy4KKwkgIDQpIFNpbmNlIGFsbCBpbl9ydW5uaW5nX3RpbWUgYXJlIG5vdyA+IDEwcywgbWF4X291dF9ydW5uaW5nX3RpbWUgaXMgbm93IHNldCB0bworCSAgMTBzLiBUaGF0IGZpcnN0IEdPUCBnZXRzIHJlY29yZGVkIGludG8gdGhlIGZpbGUuIFRoZSBtdXhlciBwb3AgYnVmZmVycyBvdXQKKwkgIG9mIHRoZSBtcSwgd2hlbiBpdCB0cmllcyB0byBwb3AgYSAybmQgc3VidGl0bGUgYnVmZmVyIGl0IGJsb2NrcyBiZWNhdXNlIHRoZQorCSAgR3N0RGF0YVF1ZXVlIGlzIGVtcHR5LgorCSAgNSkgQSAybmQgR09QIG9mIHZpZGVvIGlzIGNvbGxlY3RlZCBhbmQgaGFzIGEgZHVyYXRpb24gb2YgMTBzIGFzIHdlbGwuCisJICBtYXhfaW5fcnVubmluZ190aW1lIGlzIG5vdyAyMHMuIFNpbmNlIHN1YnRpdGxlJ3MgaW5fcnVubmluZ190aW1lIGlzIGFscmVhZHkKKwkgIDFtaW4sIHRoYXQgR09QIGlzIGFscmVhZHkgY29tcGxldGUuCisJICA2KSBCdXQgbGV0J3Mgc2F5IHdlIG92ZXJyYW4gdGhlIG1heCBmaWxlIHNpemUsIHdlIHRodXMgc2V0IHN0YXRlIHRvCisJICBTUExJVE1VWF9TVEFURV9FTkRJTkdfRklMRSBub3cuIEFzIHNvb24gYXMgYSBidWZmZXIgd2l0aCB0cyA+IDEwcyAoZW5kIG9mCisJICBwcmV2aW91cyBHT1ApIGFycml2ZXMgaW4gaGFuZGxlX21xX291dHB1dCgpLCBFT1MgZXZlbnQgaXMgc2VudCBkb3duc3RyZWFtCisJICBpbnN0ZWFkLiBCdXQgc2luY2UgdGhlIHN1YnRpdGxlIHF1ZXVlIGlzIGVtcHR5LCB0aGF0J3MgbmV2ZXIgZ29pbmcgdG8KKwkgIGhhcHBlbi4gUGlwZWxpbmUgaXMgbm93IGRlYWRsb2NrZWQuCisJICBUbyBmaXggdGhpcyBzaXR1YXRpb24gd2UgaGF2ZSB0bzoKKwkgIC0gU2VuZCBhIGR1bW15IGV2ZW50IHRocm91Z2ggdGhlIHF1ZXVlIHRvIHdha2V1cCBvdXRwdXQgdGhyZWFkLgorCSAgLSBVcGRhdGUgb3V0X3J1bm5pbmdfdGltZSB0byBhdCBsZWFzdCBtYXhfb3V0X3J1bm5pbmdfdGltZSBzbyBpdCBzZW5kcyBFT1MuCisJICAtIFJlc3BlY3QgdGltZSBvcmRlciwgc28gd2Ugc2V0IG91dF9ydW5uaW5nX3RpbT1tYXhfaW5fcnVubmluZ190aW1lIGJlY2F1c2UKKwkgIHRoYXQncyBiaWdnZXIgdGhhbiBwcmV2aW91cyBidWZmZXIgYW5kIHNtYWxsZXIgdGhhbiBuZXh0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MzcxMQorCisyMDE1LTExLTE3IDE4OjE3OjM1ICswMTAwICBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogQWRkIG5ldyBzaWduYWwgJ29uLWFwcC1ydGNwJworCSAgU2ltaWxhciB0byB0aGUgJ29uLWZlZWRiYWNrLXJ0Y3AnIHNpZ25hbCwgYnV0IGVtaXR0ZWQgZm9yIFJUQ1AgQVBQCisJICBwYWNrZXRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MjIxNworCisyMDE2LTAzLTI0IDE1OjU3OjExICswOTAwICBNaW5qYWUgS2ltIDxuYXRlLmtpbUBsZ2UuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cG1hbmFnZXI6IFNldCB0byBpbml0aWFsIHZhbHVlIGZvciAnbnRwbnMnIGluIGdldF9jdXJyZW50X3RpbWVzKCkKKwkgIEluaXRpYWxpemUgIm50cG5zIiB2YXJpYWJsZSB0byAtMSBhcyB0aGUgT0UgY29tcGlsZXIgZm9yIHNvbWUgcmVhc29uIGRvZXNuJ3QKKwkgIHJlYWxpemUgdGhhdCB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGFsbCBjb2RlIHBhdGhzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NDExOQorCisyMDE2LTAxLTMxIDExOjA4OjM4ICsxMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkgIHJ0cGpwZWdwYXk6IEFsbG93IGRpZmZlcmVudCBxdWFudGl6YXRpb24gdGFibGVzIGZvciBjb21wb25lbnRzIDIgYW5kIDMKKwkgIFJGQyAyNDM1IG1lbnRpb25zIGluIHNlY3Rpb24gNC4xIHRoYXQgVS9WIHVzZSB0YWJsZSBudW1iZXIgMSwgYnV0IHRoaXMgc2VlbXMKKwkgIGp1c3QgbGlrZSBhbiBleGFtcGxlLiBTb21lIGVuY29kZXJzIGFyZSBub3QgZm9sbG93aW5nIHRoYXQgYW5kIHRoZXJlIHNlZW1zIHRvCisJICBiZSBubyByZWFzb24gdG8gcmVqZWN0IHRoZWlyIHN0cmVhbXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYxMzQ1CisKKzIwMTYtMDMtMjQgMTk6MjM6MTIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cHhkZWMuYzoKKwkgIHZweGRlYzogVXNlIHRocmVhZHMgb24gbXVsdGktY29yZSBzeXN0ZW1zCisJICBUaGlzIGlzIGEgcmVkbyBvZiBjb21taXQgYjg0OGMxYjZmZmQxZTUwODIyODgyMGEwMTNmOTRmYjQ0NWU0Nzc3Zi4gVGhlCisJICBjb2RlIHdhcyBsb3N0IHdoZW4gdGhlIGVsZW1lbnRzIHdoZXJlIHBvcnRlZCB0byB1c2UgYSBiYXNlY2xhc3MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY0MTY5CisKKzIwMTYtMDItMjkgMjM6NDA6MDMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwbGl0bXV4LmM6CisJICBzcGxpdG11eHNpbms6IG9ubHkgdHJ5IHRvIGNyZWF0ZSBpbnRlcm5hbCBzaW5rIGlmIGl0IGRvZXNuJ3QgZXhpc3QKKwkgIFRoaXMgYWxsb3dzIHNwbGl0bXV4c2luayB0byBiZSByZXVzZWQgYWZ0ZXIgYmVpbmcgcHV0IHRvIE5VTEwuCisJICBUZXN0IGluY2x1ZGVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyODkzCisKKzIwMTUtMTAtMDEgMTM6NDE6MjMgKzAyMDAgIEF1csOpbGllbiBaYW5lbGxpIDxhdXJlbGllbi56YW5lbGxpQHBhcnJvdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IHByb2JlIGFsbCBjb2xvcnNwYWNlIHN1cHBvcnRlZCBieSBkZXZpY2UKKwkgIEEgZGV2aWNlIGNhbiBzdXBwb3J0IG1vcmUgdGhhbiBvbmUgY29sb3JzcGFjZSBmb3IgYSBnaXZlbiBpbWFnZQorCSAgZGltZW5zaW9uIGFuZCBwaXhlbCBmb3JtYXQuIFNvIHdlIGhhdmUgdG8gcHJvYmUgYWxsIHRoZSBzdXBwb3J0ZWQKKwkgIGNvbG9yc3BhY2UgYW5kIG5vdCBvbmx5IHJlbHkgb24gdGhlIGRlZmF1bHQgb25lLiBPdGhlcndpc2Ugd2UgY291bGQgZW5kCisJICB1cCB3aXRoIG5lZ290aWF0aW9uIGZhaWx1cmUgaWYgdGhlIGNhcHMgY29sb3JpbWV0cnkgZmllbGQgZG9uJ3QgbWF0Y2gKKwkgIHRoZSB2NGwyIGRldmljZSBkZWZhdWx0IG9uZSBldmVuIGlmIHRoZSB2NGwyIGNvdWxkIHN1cHBvcnQgc3VjaAorCSAgY29sb3JpbWV0cnkuCisJICBUaGlzIHBhdGNoIGVuYWJsZSBwcm9iaW5nIGlmIGNvbG9yc3BhY2UgZm9yIGJvdGggY2FwdHVyZSBhbmQgb3V0cHV0CisJICBkZXZpY2UuIEl0IHJlYWxseSBtYWtlcyBzZW5zZSBmb3Igb3V0cHV0IGRldmljZSBzaW5jZSB0aGUgY29sb3JzcGFjZQorCSAgc2hhbGwgYmUgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiBhbmQgYSBsaXR0bGUgbGVzcyBmb3IgY2FwdHVyZSBkZXZpY2UKKwkgIHdoaWNoLCBhdCB0aGUgbW9tZW50LCBzaGFsbCBwcm92aWRlIHRoZSBjb2xvcnNwYWNlOyBpZTogdGhlIHY0bDIKKwkgIHNwZWNpZmljYXRpb24gc2VlbXMgdG8gbm90IHRha2UgaW50byBhY2NvdW50IHRoZSBmYWN0IHRoYXQgYSBjYXB0dXJlCisJICBkZXZpY2UgY291bGQgZG8gY29sb3JzcGFjZSBjb252ZXJzaW9uLgorCSAgQXMgYSBzaWRlIGVmZmV0LCBwcm9iaW5nIHRha2VzIHNvbWUgdGltZXMgYW5kIHNvIHNsaWd0aGx5IGRlbGF5IHY0bDIKKwkgIGluaXRpYWxpemF0aW9uLiBOb3RlIHRoYXQgdGhpcyBwYXRjaCBvbmx5IHByb2JlIGNvbG9yc3BhY2UgYW5kIG5vdCBhbGwKKwkgIGNvbG9yc3BhY2UsIG1hdHJpeCwgdHJhbnNmZXIgYW5kIHJhbmdlIGNvbWJpbmF0aW9uIHRvIGF2b2lkIHRha2luZyB0b28KKwkgIG11Y2ggdGltZSwgZXNwZWNpYWxseSB3aXRoIGxvdy1zcGVlZCBkZXZpY2VzIGFzIGZ1bGwgcHJvYmluZyBkbyAxNzgyCisJICBpb2N0bC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTU5MzcKKworMjAxNi0wMy0yNCAxNjoyMTo1NiArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZmx2ZGVtdXguYzoKKwkgIGNoZWNrOiBGaXggaW5kZW50YXRpb24KKworMjAxNi0wMy0yNCAxNjoyMDozOSArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZmx2ZGVtdXguYzoKKwkgIHRlc3RzOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcworCisyMDE2LTAzLTE2IDIwOjI2OjE2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkgIGRlaW50ZXJsZWF2ZTogUmV0dXJuIHRoZSBjdXJyZW50IGNhcHMgb24gdGhlIHNyY3BhZHMgb24gY2FwcyBxdWVyaWVzCisJICBJdCdzIG5vdCBsaWtlIHdlIGNvdWxkIGFjY2VwdCBhbnkgb3RoZXIgY2FwcyBoZXJlLiBUaGUgY2FwcyBhcmUgZGVjaWRlZCBieSB0aGUKKwkgIHVwc3RyZWFtIGNhcHMgZXZlbnQuCisJICBBbHNvIGtlZXAgdGhlIGZpbHRlciBvcmRlciBpbnRhY3Qgd2hlbiBmaWx0ZXJpbmcgdGhlIHJlc3VsdHMgYWdhaW5zdCB0aGUKKwkgIGZpbHRlciBjYXBzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MzMyNgorCisyMDE2LTAzLTI0IDE1OjE0OjIzICswOTAwICBKaW1teSBPaG4gPHlvbmdqaW4ub2huQGxnZS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IHF0ZGVtdXggbWVtb3J5IGxlYWsgaW4gc3JjX2NvbnZlcnQgZnVuY3Rpb24KKwkgIElmIHdlIGRvbid0IGZpbmQgdGhlIGluZGV4IG9mIHRoZSBzYW1wbGUgY29ycmVjdGx5IGluIHNyY19jb252ZXJ0IGZ1bmN0aW9uLAorCSAgd2UgaGF2ZSB0byB1bnJlZiBhYm91dCB0aGUgcXRkZW11eCBiZWZvcmUgcmV0dXJuaW5nIHZhbHVlLgorCSAgU28sIEkgaGF2ZSBtb2RpZnkgaXQgYWJvdXQgaW5zdGVhZCBwYXNzIHF0ZGVtdXggYXMgYSBwYXJhbWV0ZXIgaW50bworCSAgc3JjX2NvbnZlcnQgZnVuY3Rpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYzOTczCisKKzIwMTYtMDMtMjIgMTM6MTU6MjAgKzA5MDAgIEppbW15IE9obiA8eW9uZ2ppbi5vaG5AbGdlLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBBZGQgY2hlY2sgY29uZGl0aW9uIGZvciBmYWlsIGNhc2UgaW4gZ2V0X2R1cmF0aW9uIGZ1bmN0aW9uCisJICBDdXJyZW50bHksIGdldF9kdXJhdGlvbiBmdW5jdGlvbiBhbHdheXMgcmV0dXJuIHRoZSBUUlVFIGV2ZW4gdGhvdWdoCisJICBpdCBjYW4ndCBiZSBzZXQgZHVyYXRpb24gY29ycmVjdGx5LiBTbywgd2UgbmVlZCB0byBhZGQgdGhlIGVsc2UgY29uZGl0aW9uCisJICBhYm91dCB0aGUgZmFpbCBjYXNlLiBBbHNvLCB3ZSBhbHJlYWR5IHNldCB0aGUgR1NUX0NMT0NLX1RJTUVfTk9ORQorCSAgaW4gdGhpcyBmdW5jdGlvbi4gU28gSSBoYXZlIG1vZGlmeSBpdCB3aGljaCBpcyByZWxhdGVkIGNvZGUgaW4gc29tZQorCSAgZnVuY3Rpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYzOTY4CisKKzIwMTYtMDMtMjEgMTA6MTE6MjMgKzA5MDAgIEppbW15IE9obiA8eW9uZ2ppbi5vaG5AbGdlLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBNb2RpZnkgZGF0YSB0eXBlIG9mIGR1cmF0aW9uIGluIGhhbmRsZV9zcmNfcXVlcnkgZnVuY3Rpb24KKwkgIERhdGEgdHlwZSBvZiBkdXJhdGlvbiBuZWVkIHRvIG1vZGlmeSBmcm9tIGd1aW50NjQgdG8gR3N0Q2xvY2tUaW1lCisJICBmb3IgY29uc2lzdGVuY3kgaW4gaGFuZGxlX3NyY19xdWVyeSBmdW5jdGlvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjM5NjUKKworMjAxNi0wMy0xOCAxNDo0MDo1OCArMDIwMCAgVml2aWEgTmlrb2xhaWRvdSA8dml2aWFAYWhpcnUuZXU+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogQWRkZWQgdW5pdCB0ZXN0cyBmb3IgZmllbGQ9YXV0bworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2Mzg2OQorCisyMDE2LTAzLTE3IDIxOjIxOjAyICswMjAwICBWaXZpYSBOaWtvbGFpZG91IDx2aXZpYUB0b29sc29uYWlyLmNvbT4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuaDoKKwkgIGRlaW50ZXJsYWNlOiBBZGRlZCAiYXV0byIgZmllbGRzIG1vZGUKKwkgIFRoZSAiYXV0byIgZmllbGRzIG1vZGUgd2lsbCBkZXRlY3QgdGhlIHVwc3RyZWFtIGFuZCBkb3duc3RyZWFtIGZyYW1lcmF0ZXMgYW5kCisJICB3aWxsIGRlY2lkZSB0byBkZWludGVybGFjZSBhbGwgb3Igb25seSB0b3AgZmllbGRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2Mzg2OQorCisyMDE2LTAzLTE2IDIwOjE3OjU1ICswMTAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkBnbWFpbC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogZG9uJ3QgZW1pdCBwYWQtYWRkZWQgdW50aWwgY2FwcyBhcmUgcmVhZHkKKwkgIEluIG90aGVyIHdvcmRzLCBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgc2hvdWxkIG5ldmVyIHJldHVybiBOVUxMCisJICBpbiBhIHBhZC1hZGRlZCBjYWxsYmFjayBmcm9tIHRoZSBkZW11eGVyLgorCSAgQWRkZWQgdGVzdHMgZm9yIHRoZSB0d28gc3BlY2lhbCBjYXNlcyB3aXRoIEFBQyBhbmQgSC4yNjQgd2hlcmUgdGhpcworCSAgd291bGQgaGFwcGVuIGV2ZXJ5IHRpbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYzNzgwCisKKzIwMTYtMDMtMDQgMTA6MzA6MTIgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzoKKwkqIGV4dC9jYWlyby9nc3RjYWlyb292ZXJsYXkuYzoKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZmRlYy5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmb3ZlcmxheS5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvanBlZy9nc3RzbW9rZWRlYy5jOgorCSogZXh0L2pwZWcvZ3N0c21va2VlbmMuYzoKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkqIGV4dC90YWdsaWIvZ3N0YXBldjJtdXguY2M6CisJKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSogZXh0L3ZweC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnB4L2dzdHZwOWRlYy5jOgorCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHNiY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmM6CisJKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOgorCSogZ3N0L2RlYnVndXRpbHMvYnJlYWtteWRhdGEuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2NwdXJlcG9ydC5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0Y2Fwc2RlYnVnLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZpZ2F0aW9udGVzdC5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2c2Vlay5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0cHVzaGZpbGVzcmMuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHRhZ2luamVjdC5jOgorCSogZ3N0L2RlYnVndXRpbHMvcHJvZ3Jlc3NyZXBvcnQuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Rlc3RwbHVnaW4uYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0b3AuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJKiBnc3QvZWZmZWN0di9nc3RyYWRpb2FjLmM6CisJKiBnc3QvZWZmZWN0di9nc3RyZXYuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJpcHBsZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c3RyZWFrLmM6CisJKiBnc3QvZWZmZWN0di9nc3R2ZXJ0aWdvLmM6CisJKiBnc3QvZWZmZWN0di9nc3R3YXJwLmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzoKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaXNvbXA0L2dzdHJ0cHhxdGRlcGF5LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOgorCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL3dlYm0tbXV4LmM6CisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdGZpbGVzcmMuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c3JjLmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmdhbmFseXNpcy5jOgorCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmdsaW1pdGVyLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ3ZvbHVtZS5jOgorCSogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cEwyNGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cEwyNHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhYzNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYxcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGtsdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGtsdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBvcHVzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3RyZWFtZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3RyZWFtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZwOGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZwOHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cDlkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cDlwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHF1ZXVlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlYWxwaGEuYzoKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9tZWRpYW4uYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6CisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuYzoKKwkqIHN5cy93YXZlZm9ybS9nc3R3YXZlZm9ybXNpbmsuYzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdXRvZGV0ZWN0LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgZ29vZDogdXNlIG5ldyBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSgpCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYzMDc2CisKKzIwMTYtMDMtMDQgMDk6NDI6NDQgKzAxMDAgIERhdmlkIEJ1Y2htYW5uIDxkYXZpZC5idWNobWFubkBnbWFpbC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2Zsdm11eC5jOgorCSAgZmx2bXV4OiBUZXN0IHRvIHZlcmlmeSBmbHZtdXggaGFuZGxlcyBEVFMgd2l0aCBHU1RfQ0xPQ0tfVElNRSBOT05FCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyMjA3CisKKzIwMTUtMTEtMDQgMTQ6NTE6MTkgKzA5MDAgIEppaGFlIFlpIDxqaWhhZS55aUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYXZvaWQgcG90ZW50aWFsbHkgb3ZlcmZsb3dpbmcgZXhwcmVzc2lvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NzU2OQorCisyMDE2LTAzLTIyIDEwOjQzOjQ1ICswOTAwICBKaW1teSBPaG4gPHlvbmdqaW4ub2huQGxnZS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWRkIHRoZSBmdW5jdGlvbiB0byBnZXQgY2hhbm5lbHMgYW5kIHNhbXBsZSByYXRlIGZvciBBQUMKKwkgIEFkZCBhYWNfZ2V0X2NoYW5uZWxzIGFuZCBzYW1wbGVfcmF0ZSBmdW5jdGlvbiB0byBnZXQgdGhlc2UgdmFsdWUgZm9yCisJICBBQUMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ5MTEwCisKKzIwMTYtMDMtMjQgMTM6MzM6MDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQKKworPT09IHJlbGVhc2UgMS44LjAgPT09CisKKzIwMTYtMDMtMjQgMTI6Mjc6MzMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjguMAorCisyMDE2LTAzLTI0IDEyOjAyOjU5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDE2LTAzLTE2IDIwOjE4OjQxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkgIGRlaW50ZXJsZWF2ZTogVXNlIEdzdEl0ZXJhdG9yIGZvciBpdGVyYXRpbmcgYWxsIHBhZHMgaW5zdGVhZCBvZiBtYW51YWxseSBpdGVyYXRpbmcgdGhlbSB3aGlsZSBob2xkaW5nIHRoZSBvYmplY3QgbG9jayBhbGwgdGhlIHRpbWUKKwkgIERvaW5nIHF1ZXJpZXMgd2hpbGUgaG9sZGluZyB0aGUgb2JqZWN0IGxvY2sgaXMgYSBiaXQgZGFuZ2Vyb3VzLCBhbmQgaW4gdGhpcworCSAgY2FzZSBjYXVzZXMgZGVhZGxvY2tzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MzMyNgorCisyMDE2LTAzLTE3IDIwOjUzOjI3ICswMjAwICBWaXZpYSBOaWtvbGFpZG91IDx2aXZpYUB0b29sc29uYWlyLmNvbT4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogRml4IHR5cG8gdG8gbm90IGNoYW5nZSB0aGUgaW5wdXQgY2FwcyBidXQgb3VyIGZpbHRlcmVkIGNhcHMKKwkgIENoYW5naW5nIHRoZSBpbnB1dCBjYXBzIGFuZCBub3QgdXNpbmcgdGhlbSBhbnltb3JlIGFmdGVyd2FyZHMgaXMgdXNlbGVzcywgYW5kCisJICBpdCBicmVha3MgbmVnb3RpYXRpb24gaW4gcGlwZWxpbmVzIGxpa2U6CisJICBnc3QtbGF1bmNoLTEuMCB2aWRlb3Rlc3RzcmMgISAidmlkZW8veC1yYXcsZnJhbWVyYXRlPTI1LzEsaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQiICEKKwkgIGRlaW50ZXJsYWNlIGZpZWxkcz1hbGwgISAidmlkZW8veC1yYXcsZnJhbWVyYXRlPTUwLzEsaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUiICEKKwkgIGZha2VzaW5rCisKKz09PSByZWxlYXNlIDEuNy45MSA9PT0KKworMjAxNi0wMy0xNSAxMjowNDozOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdnB4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDEuNy45MQorCisyMDE2LTAzLTE1IDExOjUzOjM3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisKKzIwMTYtMDMtMTUgMTE6NDE6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL2h1LnBvOgorCSogcG8vc3IucG86CisJICBwbzogVXBkYXRlIHRyYW5zbGF0aW9ucworCisyMDE2LTAzLTE1IDAzOjI2OjE0ICswNTMwICBOaXJiaGVlayBDaGF1aGFuIDxuaXJiaGVla0BjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBtYW5hZ2VyOiBTb21lIGNvbW1lbnQgYW5kIGRvY3VtZW50YXRpb24gY2xhcmlmaWNhdGlvbnMvZml4ZXMKKworMjAxNi0wMy0xMyAxMDozMzoxMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIFJldmVydCAiZmxhY3BhcnNlOiBwdXNoIHRhZ3MgaW4gcHJlX3B1c2hfZnJhbWUiCisJICBUaGlzIHJldmVydHMgY29tbWl0IDQwNjVmY2I4MGE0OTkyNGI3MGYwYzhmYzE1OWRlYzBmZjQ3OTQzYTEuCisJICBmbGFjcGFyc2Ugc2hvdWxkIG5vdCBwdXNoIHRhZ3MgYnkgaXRzZWxmLCB0aGUgYmFzZSBjbGFzcyBpcyBnb2luZyB0byBkbyB0aGF0CisJICB3aGlsZSBwcm9wZXJseSBtZXJnaW5nIGluIHVwc3RyZWFtIHRhZ3MuIEl0IGp1c3QgZGlkbid0IGJlY2F1c2Ugb2YgYSBidWcgaW4KKwkgIHRoZSBiYXNlIGNsYXNzLCB3aGljaCB3YXMgaGlkZGVuIGJ5IHRoaXMgY29tbWl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MzU1MworCisyMDE2LTAyLTI1IDA1OjE3OjUxICswNTMwICBOaXJiaGVlayBDaGF1aGFuIDxuaXJiaGVla0BjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZGJvb2xodWZmLmM6CisJKiBnc3QvcnRwL2Rib29saHVmZi5oOgorCSogZ3N0L3J0cC9nc3RydHBzYmNwYXkuYzoKKwkgIHdpbjMyOiBEb24ndCB1c2UgX19hdHRyaWJ1dGVfXyBvbiBNU1ZDCisJICBVc2UgTVNWQy1lcXVpdmFsZW50cyBmb3IgYWxpZ25tZW50IGFuZCBwYWNraW5nIGNvbXBpbGVyIGRpcmVjdGl2ZXMgd2hlbiBidWlsZGluZworCSAgb24gTVNWQworCisyMDE2LTAyLTI1IDA1OjE2OjQyICswNTMwICBOaXJiaGVlayBDaGF1aGFuIDxuaXJiaGVla0BjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkgIHdpbjMyOiBEb24ndCB0cnkgdG8gaW5jbHVkZSB4bWF0aC5oIG9uIG5ld2VyIFZpc3VhbCBTdHVkaW8KKworMjAxNi0wMi0yNSAwNToxNjowOSArMDUzMCAgTmlyYmhlZWsgQ2hhdWhhbiA8bmlyYmhlZWtAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSogZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYzoKKwkgIGdzdCBGYWN0b3Igb3V0IGVuZGlhbi1vcmRlciBSR0IgZm9ybWF0cworCSAgTVNWQyBzZWVtcyB0byBpZ25vcmUgcHJlcHJvY2Vzc29yIGNvbmRpdGlvbmFscyBpbnNpZGUgc3RhdGljIHBhZAorCSAgdGVtcGxhdGUgbWFjcm9zLgorCisyMDE2LTAzLTA4IDE3OjM3OjE3ICswMTAwICBUaG9tYXMgUm9vcyA8dGhvbWFzLnJvb3NAaW5kdXN0cm9uaWMuZGU+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIGRpcmN0c291bmRzaW5rOiBTZXR0aW5nIHZvbHVtZSBzaG91bGQgbm90IHVubXV0ZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NTEwNgorCisyMDE2LTAzLTA4IDEzOjU3OjI0ICswMTAwICBUaG9tYXMgUm9vcyA8dGhvbWFzLnJvb3NAaW5kdXN0cm9uaWMuZGU+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIGRpcmN0c291bmRzaW5rOiBGaXggdm9sdW1lIHJlc2V0IG9uIHVubXV0ZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NTEwNgorCisyMDE2LTAzLTA4IDEzOjAzOjU1ICswMTAwICBBbGJhbiBCZWRlbCA8YWxiYW4uYmVkZWxAYXZpb25pYy1kZXNpZ24uZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IGZpeCBjYXB0dXJlIHdpdGggYmF5ZXIgZm9ybWF0cyBvdGhlciB0aGFuIGJnZ3IKKwkgIGdzdF92NGwyX29iamVjdF9nZXRfY2Fwc19pbmZvKCkgYWx3YXlzIHJldHVybiBWNEwyX1BJWF9GTVRfU0JHR1I4CisJICBmb3IgYWxsIGJheWVyIGZvcm1hdHMuIFRoaXMgaXMgb2J2aW91c2x5IGJyb2tlbiBpZiB0aGUgZGV2aWNlIHVzZQorCSAgYW5vdGhlciBvcmRlcmluZy4gRml4IHRoaXMgYnkgcHJvcGVybHkgcmVhZGluZyB0aGUgZm9ybWF0IHBhcmFtZXRlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjMzMTgKKworMjAxNi0wMy0wNyAxMDoyODowNiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJlc2V0IHBlbmRpbmcgc2VnbWVudCBpZiB3ZSBhcmUgYWxyZWFkeSBwdXNoaW5nIG9uZQorCSAgV2hlbiB1cHN0cmVhbSBpcyBydW5uaW5nIGluIGJ5dGVzIGluIHB1c2gtbW9kZSwgcXRkZW11eCB3aWxsCisJICBjb252ZXJ0IHNlZWtzIGZyb20gdGltZSB0byBieXRlcyBhbmQgc2VuZCBpdCB1cHN0cmVhbS4gVXBzdHJlYW0KKwkgIGVsZW1lbnQgd2lsbCBwZXJmb3JtIGEgYnl0ZSBzZWVrIGFuZCBzZW5kIGEgYnl0ZSBzZWdtZW50IHRvIHF0ZGVtdXgKKwkgIHRoYXQgd2lsbCBjb252ZXJ0IGl0IHRvIHRpbWUgYW5kIHB1c2ggaXQgZG93bnN0cmVhbS4KKwkgIFRoZXJlIGlzLCBob3dldmVyLCB0aGUgcGVuZGluZ19zZWdtZW50IHZhcmlhYmxlIHRoYXQgc3RvcmVzIGEgbmV3CisJICBzZWdtZW50IGV2ZW50IHRvIGJlIHB1c2hlZCBiZWZvcmUgdGhlIG5leHQgZGF0YS4gV2hlbiBoYW5kbGluZyBzZWVrcworCSAgYXMgbWVudGlvbmVkIGFib3ZlIHRoaXMgdmFyaWFibGUgd2FzIGJlaW5nIGlnbm9yZWQgYW5kLCBpZiBpdCBjb250YWluZWQKKwkgIHNvbWUgc2VnbWVudCBldmVudCwgaXQgd291bGQgb3ZlcnJpZGUgdGhlIG9uZSByZXN1bHRpbmcgZnJvbSB0aGUgc2Vlay4KKwkgIFRoaXMgd291bGQgcmVzdG9yZSBhIHByZXZpb3VzIHNlZ21lbnQgYW5kIHdvdWxkIGNhdXNlIHRoZSBzZWVrIHNlZ21lbnQKKwkgIHRvIGJlIGRpc2NhcmRlZCBkb3duc3RyZWFtLgorCSAgVGhpcyBwYXRjaCBmaXhlcyB0aGlzIGlzc3VlIGJ5IHVucmVmaW5nIGFueSBwZW5kaW5nIHNlZ21lbnQgYXMgdGhlCisJICBzZWVrIGZyb20gdXBzdHJlYW0gc2hvdWxkIGNvbnRhaW4gdGhlIGxhdGVzdCBvbmUgdGhhdCBzaG91bGQgYmUKKwkgIHVzZWQsIGFzIHJlcXVlc3RlZCBieSB0aGUgYXBwbGljYXRpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYzMTY1CisKKzIwMTYtMDMtMDcgMTA6Mjc6NDEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBydW4gZ3N0LWluZGVudAorCSAgT3RoZXJ3aXNlIGNvbW1pdHMgd2lsbCBmYWlsIHdpdGggb3VyIGluZGVudCBjaGVjayBob29rCisKKzIwMTYtMDMtMDQgMTU6MDk6NDUgKzAxMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogZml4IGNvbG9yaW1ldHJ5IGZvciBOVjEyCisJICBSZXBsaWNhdGUgVjRMMl9NQVBfUVVBTlRJWkFUSU9OX0RFRkFVTFQgbWFjcm8gYmVoYXZpb3IuCisJICBBdCAjdjRsIGl0IHdhcyBkZXNjcmliZWQgdGhhdCBkb2N1bWVudGF0aW9uIG1pZ2h0IGJlIHdyb25nIGFuZCB0aGF0CisJICB3ZSBzaG91bGQgdHJ1c3QgdGhpcyBtYWNybyBpbnN0ZWFkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MjUyOQorCisyMDE2LTAzLTA0IDE0OjA3OjE5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBGaXggbXVsdGljYXN0IGdyb3VwIGpvaW5pbmcgd2l0aCBwcm92aWRlZCBzb2NrZXRzIG9uIFdpbmRvd3MKKwkgIE9uIFdpbmRvd3MgdGhlIHNvY2tldCB3aWxsIGJlIGJvdW5kIHRvIEFOWSBpbnN0ZWFkIG9mIHRoZSBtdWx0aWNhc3QgZ3JvdXAsCisJICBhcyBiaW5kaW5nIHRvIGEgbXVsdGljYXN0IGdyb3VwIGRvZXMgbm90IHdvcmsuIFdoaWNoIHdvdWxkIG1lYW4gdGhhdCB3ZQorCSAgb3ZlcnJpZGUgc3JjLT5hZGRyIHRvIGJlY29tZSBBTlkgYW5kIHdvbid0IGF1dG9tYXRpY2FsbHkgam9pbiBhIG11bHRpY2FzdAorCSAgZ3JvdXAgYW55bW9yZSBvbiBXaW5kb3dzLgorCSAgT24gTGludXggd2Ugd291bGQgYXV0b21hdGljYWxseSBqb2luIGEgbXVsdGljYXN0IGdyb3VwLCBrZWVwIGl0IGNvbnNpc3RlbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYzMDkzCisKKzIwMTYtMDMtMDIgMTM6MTM6MjQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgUmV2ZXJ0ICJydHBqaXR0ZXJidWZmZXI6IGRvbid0IGZvcmdldCB0byB1bmxvY2sgbXV0ZXggaW4gZXJyb3IgY29kZSBwYXRoIGluIHR3byBjYXNlcyIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgYTdmYjdiNTM1OTJkODdmNzk4MzU0NGRlYmI3NGQzNjRmYzMyNTdhZC4KKwkgIFRoZSBtdXRleCBpcyB0YWtlbiBieSB0aGUgY2FsbGVyLCB3ZSBzaG91bGQga2VlcCBpdCBsb2NrZWQgd2hlbiByZXR1cm5pbmcgc28KKwkgIHRoZSBjYWxsZXIgY2FuIHVubG9jayBpdCBhZ2Fpbi4KKworMjAxNi0wMy0wMSAxNTowMToyMiArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogcHVzaCB0YWdzIGluIHByZV9wdXNoX2ZyYW1lCisJICBQdXNoIGEgdGFnIGV2ZW50IGJlZm9yZSBwcmUtcm9sbCBpZiB3ZSBoYXZlIHRhZ3MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyNjYwCisKKz09PSByZWxlYXNlIDEuNy45MCA9PT0KKworMjAxNi0wMy0wMSAxODoxNTo0MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS43LjkwCisKKzIwMTYtMDMtMDEgMTc6MDM6NTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxNi0wMy0wMSAxNjo1MzoyNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYmcucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZnIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTYtMDMtMDEgMTQ6MTQ6MDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBkb24ndCBmb3JnZXQgdG8gdW5sb2NrIG11dGV4IGluIGVycm9yIGNvZGUgcGF0aCBpbiB0d28gY2FzZXMKKworMjAxNi0wMi0yOSAxMDoxMDoyNCArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYS1kZW11eDogcmVtb3ZlIGltcG9zc2libGUgY29uZGl0aW9uCisJICBJdCBpcyBpbXBvc3NpYmxlIGZvciBhIGd1aW50IHRvIGhhdmUgYSBuZWdhdGl2ZSB2YWx1ZSwgbm8gbmVlZCB0byBjaGVjayBmb3IKKwkgIHRoaXMuIEludHJvZHVjZWQgaW4gY29tbWl0IDY4NjFkMTFjNDllYTBmMzBkMjQzMmNmNGViZjYxMDhiYzg5ODk3ZjEKKwkgIENJRCAxMzU0NTA5CisKKzIwMTYtMDItMjggMTA6MTI6MzYgKzAxMDAgIFBldHIgVmlrdG9yaW4gPGVuY3Vrb3VAZ21haWwuY29tPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkgIGFscGhhOiBGaXggc2FtcGxlIHBpcGVsaW5lCisJICBVc2UgdGhlIHpvcmRlciBwYWQgcHJvcGVydHkgdG8gbWFrZSBzdXJlIHRoZSBzZW1pdHJhbnNwYXJlbnQKKwkgIHZpZGVvIGlzIG9uIHRvcCBvZiB0aGUgYmFja2dyb3VuZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjI4MDkKKworMjAxNi0wMi0yOCAxMzo0MjoyOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3Jndm9sdW1lLmM6CisJICByZ3ZvbHVtZTogbWFrZSB0YWcgbGlzdCB3cml0YWJsZSBiZWZvcmUgbW9kaWZ5aW5nIGl0CisJICBNYWtpbmcgdGhlIGV2ZW50IGl0c2VsZiB3cml0YWJsZSBpcyBub3QgZW5vdWdoLCBpdCB3b24ndCBtYWtlCisJICB0aGUgYWN0dWFsIHRhZ2xpc3QgaW4gdGhlIGV2ZW50IHdyaXRhYmxlIGFzIHdlbGwuIEluc3RlYWQsIGp1c3QKKwkgIG1ha2UgYSBjb3B5IG9mIHRoZSB0YWdsaXN0IGFuZCB0aGVuIGNyZWF0ZSBhIG5ldyB0YWcgZXZlbnQgZnJvbQorCSAgdGhhdCBpZiByZXF1aXJlZCwgcmVwbGFjaW5nIHRoZSBvbGQgb25lLiBCZWZvcmUgd2Ugd291bGQKKwkgIGluYWR2ZXJ0ZW50bHkgbW9kaWZ5IHRhZ2xpc3RzIHVwc3RyZWFtIGVsZW1lbnRzIG1pZ2h0IHN0aWxsCisJICBiZSBob2xkaW5nIG9uIHRvLiBBZGQgdW5pdCB0ZXN0IGZvciB0aGlzIGFzIHdlbGwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyNzkzCisKKzIwMTYtMDItMjggMTM6MDE6MzQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IFByb3Blcmx5IGVycm9yIG91dCBpZiBiaW5kaW5nIHRoZSBVRFAgc29ja2V0cyBmYWlscworCSAgdWRwc3JjIGlzIG5vdCByZXR1cm5pbmcgdXMgYSBzb2NrZXQgaW4gdGhhdCBjYXNlLgorCisyMDE2LTAyLTI3IDIwOjMzOjMyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJICBnb29tOiBVc2UgZ29vbV9zZXRfcmVzb2x1dGlvbigpIGluc3RlYWQgb2YgcmVjcmVhdGluZyB0aGUgZ29vbSBpbnN0YW5jZSB3aGVuIHRoZSByZXNvbHV0aW9uIGNoYW5nZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjI3NjUKKworMjAxNi0wMi0yNyAyMDozMjo0NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSAgUmV2ZXJ0ICJnb29tOiBJbml0aWFsaXplIHRoZSBnb29tIHN0cnVjdCBvbmx5IG9uY2Ugd2Uga25vdyB3aWR0aC9oZWlnaHQgYW5kIHJlY3JlYXRlIGl0IGlmIHRob3NlIGNoYW5nZSIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgY2M2ZTEwMjY0M2MxYmFlOTI4MzE2ZGNhOWYzNGRiMDI4ZmI5YTY3ZS4KKworMjAxNi0wMi0yNyAyMDozMToxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSAgZ29vbTogSW5pdGlhbGl6ZSB0aGUgZ29vbSBzdHJ1Y3Qgb25seSBvbmNlIHdlIGtub3cgd2lkdGgvaGVpZ2h0IGFuZCByZWNyZWF0ZSBpdCBpZiB0aG9zZSBjaGFuZ2UKKwkgIEZpeGVzIGNyYXNoIHdoZW4gdGhlIHdpZHRoIGFuZC9vciBoZWlnaHQgaXMgY2hhbmdpbmcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyNzY1CisKKzIwMTYtMDItMjYgMTI6NDE6MDcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBiNjRmMDNmIHRvIDZmMmQyMDkKKworMjAxNi0wMi0yNSAyMjo1NDoxOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJICBkb2NzOiBhZGQgcnRwb3B1c2RlcGF5IGFuZCBydHBvcHVzcGF5IHRvIGRvY3VtZW50YXRpb24KKworMjAxNi0wMi0xNyAxNToxNToxMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cG9wdXNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBvcHVzZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBvcHVzcGF5Lmg6CisJICBydHA6IG9wdXM6IG1vdmUgT3B1cyBSVFAgcGF5bG9hZGVyL2RlcGF5bG9hZGVyIGZyb20gLWJhZCB0byAtZ29vZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NjI4MgorCisyMDE2LTAyLTE3IDE1OjEwOjAwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJICBNZXJnZSBicmFuY2ggJ3BsdWdpbi1tb3ZlLXJ0cC1vcHVzJworCSAgTW92ZSBPcHVzIFJUUCBkZXBheWxvYWRlci9wYXlsb2FkZXIgZnJvbSAtYmFkIHRvIC1nb29kLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NjI4MgorCisyMDE2LTAyLTI1IDExOjMzOjEzICswMTAwICBQaGlsaXBwZSBOb3JtYW5kIDxwaGlsbkBpZ2FsaWEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGNlbmMgYXV4IGluZm8gcGFyc2luZyBmcm9tIG1kYXQgc3VwcG9ydCBpbiBQVUxMIG1vZGUKKwkgIFRoaXMgaXMgYWxyZWFkeSBzdXBwb3J0ZWQgZm9yIFBVU0ggbW9kZSBidXQgd2FzIGZhaWxpbmcgaW4gUFVMTCBtb2RlLgorCSAgVGhlIGF1eCBpbmZvIGlzIHNvbWV0aW1lcyBzdG9yZWQgaW4gdGhlIG1kYXQgYmVmb3JlIHRoZSBmaXJzdCBzYW1wbGUsCisJICBzbyB0aGUgbG9vcCB0YXNrIG5lZWRzIHRvIHB1bGwgZGF0YSBzdG9yZWQgYXQgdGhhdCBsb2NhdGlvbiBhbmQKKwkgIHBlcmZvcm0gdGhlIGF1eCBpbmZvIGNlbmMgcGFyc2luZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjE3MDAKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjI1MTYKKworMjAxNi0wMi0yNCAxMToyODowOSArMDEwMCAgUGhpbGlwcGUgTm9ybWFuZCA8cGhpbG5AaWdhbGlhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwcmV2ZW50IGJ1ZmZlciBmbG93IGlmIGFueSBzdHJlYW0gZmFpbGVkIHRvIGJlIGV4cG9zZWQKKwkgIEluIHNvbWUgY2FzZXMgdGhlIHN0cmVhbSBjb25maWd1cmF0aW9uIGNhbiBmYWlsLCBmb3IgaW5zdGFuY2UgaWYgdGhlCisJICBzdHJlYW0gaXMgcHJvdGVjdGVkIGFuZCBubyBkZWNyeXB0b3Igd2FzIGZvdW5kLiBGb3IgdGhvc2Ugc2l0dWF0aW9ucworCSAgdGhlIGRlbXV4ZXIgc2hvdWxkbid0IGVtaXQgYW55IGRhdGEgb24gdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIHBhZCBvZgorCSAgdGhlIHN0cmVhbSBhbmQgYmFpbCBvdXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyNTE2CisKKzIwMTYtMDItMjQgMDk6MTI6MDMgKzAxMDAgIFBoaWxpcHBlIE5vcm1hbmQgPHBoaWxuQGlnYWxpYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZG9uJ3QgcHVzaCBlbmNyeXB0ZWQgYnVmZmVyIHdpdGhvdXQgY2VuYyBtZXRhZGF0YQorCSAgV2hlbiB0aGUgY2VuYyBtZXRhZGF0YSBpcyBzdG9yZWQgb3V0c2lkZSBvZiB0aGUgbW9vZiBib3ggYW5kIHRoZQorCSAgc3RyZWFtIGlzIGV4cG9zZWQgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgY2VuYyBtZXRhZGF0YSBoYXNuJ3QgYmVlbgorCSAgcHJvY2Vzc2VkIHlldCB3aGlsZSB0aGUgZmlyc3QgYnVmZmVyIGlzIGJlaW5nIHB1c2hlZC4gV2hlbiB0aGlzCisJICBoYXBwZW5zIHRoZSBidWZmZXIgY2FuJ3QgcG9zc2libHkgYmUgZGVjcnlwdGVkIGRvd25zdHJlYW0gc28gZG9uJ3QKKwkgIHB1c2ggaXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyNTE2CisKKzIwMTUtMTAtMjEgMTY6MjE6NDUgKzAyMDAgIFBoaWxpcHBlIE5vcm1hbmQgPHBoaWxuQGlnYWxpYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcmVhZCBzYWlvIGF1eF9pbmZvX3R5cGUgYXMgYSBGT1VSQ0MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTY4OTcKKworMjAxNi0wMi0yMyAxODoyNzo0NyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZkZWMuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJICBnc3Q6IEhhbmRsZSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMoKSByZXR1cm5pbmcgTlVMTCBncmFjZWZ1bGx5CisKKzIwMTYtMDItMjMgMTg6MTI6NTQgKzAyMDAgIERhdmUgQ3JhaWcgPGRjcmFpZ0BicmlnaHRzaWduLmJpej4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuYzoKKwkgIHJ0cGgyNjVkZXBheTogRG9uJ3QgYXNzdW1lIHRoYXQgZ2V0X2N1cnJlbnRfY2FwcygpIHJldHVybnMgbm9uLU5VTEwgY2FwcyBhZnRlciBoYXNfY3VycmVudF9jYXBzKCkKKwkgIFJlbW92ZSBjYWxscyB0byBnc3RfcGFkX2hhc19jdXJyZW50X2NhcHMoKSB3aGljaCB0aGVuIGdvIG9uIHRvIGNhbGwKKwkgIGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcygpIGFzIHRoZSBjYXBzIGNhbiBnbyB0byBOVUxMIGluIGJldHdlZW4uIEluc3RlYWQganVzdAorCSAgdXNlIGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcygpIGFuZCBjaGVjayBmb3IgTlVMTC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTk1MzkKKworMjAxNS0xMi0xNiAxMjo0MDozOSArMDAwMCAgRGF2ZSBDcmFpZyA8ZGNyYWlnQGJyaWdodHNpZ24uYml6PgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmM6CisJICBnc3Q6IERvbid0IGFzc3VtZSB0aGF0IGdldF9jdXJyZW50X2NhcHMoKSByZXR1cm5zIG5vbi1OVUxMIGNhcHMgYWZ0ZXIgaGFzX2N1cnJlbnRfY2FwcygpCisJICBSZW1vdmUgY2FsbHMgdG8gZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzKCkgd2hpY2ggdGhlbiBnbyBvbiB0byBjYWxsCisJICBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMoKSBhcyB0aGUgY2FwcyBjYW4gZ28gdG8gTlVMTCBpbiBiZXR3ZWVuLiBJbnN0ZWFkIGp1c3QKKwkgIHVzZSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMoKSBhbmQgY2hlY2sgZm9yIE5VTEwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU5NTM5CisKKzIwMTUtMTItMTYgMTA6NTQ6MTcgKzAwMDAgIERhdmUgQ3JhaWcgPGRjcmFpZ0BicmlnaHRzaWduLmJpej4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IEhhbmRsZSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMoKSByZXR1cm5pbmcgTlVMTCBncmFjZWZ1bGx5CisJICBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgcGlwZWxpbmUgaXMgY3VycmVudGx5IHNodXR0aW5nIGRvd24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU5NTM5CisKKzIwMTYtMDItMjMgMTU6NTc6MTggKzAxMDAgIExpbnVzIFN2ZW5zc29uIDxsaW51c3NuQGF4aXMuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thLWRlbXV4OiBEb24ndCBoYW5kbGUgc2VlayB1bnRpbCByZWFkeQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MjU0MgorCisyMDE2LTAyLTIzIDE1OjU1OjEzICswMTAwICBMaW51cyBTdmVuc3NvbiA8bGludXNzbkBheGlzLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYS1kZW11eDogVW5yZWYgc2VlayBldmVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MjU0MgorCisyMDE2LTAyLTIyIDExOjAxOjQwICswMTAwICBBdXLDqWxpZW4gWmFuZWxsaSA8YXVyZWxpZW4uemFuZWxsaUBwYXJyb3QuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIG11bHRpZmlsZXNpbms6IGNsb3NlIGZpbGUgb24gd3JpdGUgZXJyb3Igd2l0aCBuZXh0LWZpbGUgbW9kZSBpcyBzZXQgdG8gYnVmZmVyCisJICBJZiB3ZSBoYXZlIGFuIGVycm9yIGR1cmluZyBmd3JpdGUgY2FsbCwgZmlsZSBzdGF5cyBvcGVuIGFuZCB0aHVzIG5leHQKKwkgIGluY29taW5nIGJ1ZmZlciB3aWxsIHRyaWdnZXIgYW4gYXNzZXJ0IHdoZW4gdHJ5aW5nIHRvIG9wZW5pbmcgYSBuZXcKKwkgIGZpbGUuCisJICBUaGlzIGhhcHBlbnMgaWYgd2UgZG8gbm90IHJlc3RhcnQgZWxlbWVudCwgZmlsZSBpcyBjbG9zZWQgYXQgc3RvcCwgYW5kCisJICBpZiBhcHBsaWNhdGlvbiBoYW5kbGVzIHRoZSByZXR1cm5lZCBHU1RfRkxPV19FUlJPUiB0byBrZWVwIGJpbiBhbGl2ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjI0MzQKKworMjAxNi0wMi0xOSAyMzo0NDo0MiArMDEwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGRvbid0IG91dHB1dCBlbXB0eSB0YWdzL3RhZyBlbGVtZW50cworCSAgU3VjaCBmaWxlcyB3aWxsIG5vdCBwbGF5IG9uIEFuZHJvaWQsIGJlY2F1c2Ugb2YgYnVnIGluIGxpYndlYm0gbWF0cm9za2EgcGFyc2luZywgd2hpY2ggaXMgc3RpbGwgcHJlc2VudCBpbiA2LjAuMQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MjM0OQorCisyMDE2LTAyLTA0IDE1OjU5OjA0ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYS1kZW11eDogbWFrZSB1cCBhbiBPcHVzSGVhZCBibG9jayBpZiBwb3NzaWJsZSB3aGVuIG1pc3NpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjE0ODkKKworMjAxNi0wMi0wNCAxMDo0MzoxNSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thLW11eDogbWFrZSB1cCBhbiBPcHVzSGVhZCBibG9jayBpZiBwb3NzaWJsZSB3aGVuIG1pc3NpbmcKKwkgIFRoaXMgYmxvY2sgaXMgbmVlZGVkIGluIHRoZSBNYXRyb3NrYSBmaWxlLCBidXQgZGF0YSBjb21pbmcgZnJvbQorCSAgUlRQIG1heSBub3QgaGF2ZSBvbmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYxNDg5CisKKzIwMTYtMDItMjIgMTM6NTM6MjEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBtYWtlIHN0cmVhbS1pZCBtb3JlIHJlYWRhYmxlIGFuZCBvcmRlci1mcmllbmRseQorCSAgLi4uIGFzIHN0cmVhbXMgYXJlIHNvIG9yZGVyZWQgYnkgaWQgYnkgZS5nLiBkZWNvZGViaW4KKwkgIChhbmQgYXMgdHlwaWNhbGx5IGFscmVhZHkgaG9ub3VyZWQgYnkgb3RoZXIgZGVtdXhlcnMpLgorCisyMDE2LTAyLTIyIDEzOjI1OjUxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thOiByZW1vdmUgY29uZnVzaW5nIGR1cGxpY2F0ZSB0cmFjayB1aWQgZmllbGQKKworMjAxNi0wMi0yMiAxNDowMzowMiArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cDlwYXkuYzoKKwkgIHJ0cHZwOXBheTogYWRkIG1pc3NpbmcgYnJlYWsKKwkgIFZQOV9QQVlfUElDVFVSRV9JRF83QklUUyBhbmQgVlA5X1BBWV9QSUNUVVJFX0lEXzE1QklUUyBhcmUgbXV0dWFsbHkKKwkgIGV4Y2x1c2l2ZSBvcHRpb25zIG9mIHRoZSBwaWN0dXJlLWlkLW1vZGUuIFdlIGNhbiBicmVhayBhZnRlciB0aGUKKwkgIGZpcnN0IGNhc2UuCisJICAxIG9yIDIgYnl0ZXMgbmVlZCB0byBiZSBhZGRlZCB0byB0aGUgaGVhZGVyIGxlbmd0aCBkZXBlbmRpbmcgb24gdGhlCisJICBQaWN0dXJlSUQgc2l6ZS4KKwkgIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC11YmVydGktcGF5bG9hZC12cDktMDAjc2VjdGlvbi00LjIKKwkgIENJRCAxMzUzNDc5CisKKzIwMTYtMDItMjIgMDk6MDk6MDEgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBGaXggYnVmZmVyIG1lbW9yeSBsZWFrCisJICBidWZmZXIgYmVpbmcgbWFwcGVkIGlzIG5vdCBiZWluZyB1bm1hcHBlZCBpbiBzb21lIGNhc2VzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyNDIwCisKKzIwMTUtMTEtMDQgMTA6MTk6MDMgKzAxMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cG1hbmFnZXI6IERvbid0IHdhcm4gZm9yIGR1cGxpY2F0ZS9yZW9yZGVyZWQgcGFja2V0cworCSAgVGhpcyBpcyBhIG5vcm1hbCBzY2VuYXJpbyBhbmQgc2hvdWxkIG5vdCBiZSBhIHdhcm5pbmcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyMjA4CisKKzIwMTYtMDItMjEgMDk6NDc6NDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hbHBoYS9hbHBoYS52Y3Byb2o6CisJKiBnc3QvYXVwYXJzZS9hdXBhcnNlLnZjcHJvajoKKwkqIGdzdC9hdmkvYXZpLnZjcHJvajoKKwkqIGdzdC9jdXR0ZXIvY3V0dGVyLnZjcHJvajoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2RlYnVnLnZjcHJvajoKKwkqIGdzdC9kZWJ1Z3V0aWxzL25hdmlnYXRpb250ZXN0LnZjcHJvajoKKwkqIGdzdC9lZmZlY3R2L2VmZmVjdHYudmNwcm9qOgorCSogZ3N0L2ZseC9mbHhkZWMudmNwcm9qOgorCSogZ3N0L2dvb20vZ29vbS52Y3Byb2o6CisJKiBnc3QvZ29vbTJrMS9nb29tLnZjcHJvajoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUudmNwcm9qOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LnZjcHJvajoKKwkqIGdzdC9sYXcvYWxhdy52Y3Byb2o6CisJKiBnc3QvbGF3L211bGF3LnZjcHJvajoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS52Y3Byb2o6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydC52Y3Byb2o6CisJKiBnc3QvcnRwL3J0cC52Y3Byb2o6CisJKiBnc3Qvc21wdGUvc21wdGUudmNwcm9qOgorCSogZ3N0L3NwZWN0cnVtL3NwZWN0cnVtLnZjcHJvajoKKwkqIGdzdC91ZHAvdWRwLnZjcHJvajoKKwkqIGdzdC92aWRlb2JveC92aWRlb2JveC52Y3Byb2o6CisJKiBnc3QvdmlkZW9jcm9wL3ZpZGVvY3JvcC52Y3Byb2o6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ2FtbWEudmNwcm9qOgorCSogZ3N0L3ZpZGVvZmlsdGVyL3ZpZGVvYmFsYW5jZS52Y3Byb2o6CisJKiBnc3QvdmlkZW9maWx0ZXIvdmlkZW9maWx0ZXIudmNwcm9qOgorCSogZ3N0L3ZpZGVvZmlsdGVyL3ZpZGVvZmxpcC52Y3Byb2o6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLnZjcHJvajoKKwkqIGdzdC93YXZlbmMvd2F2ZW5jLnZjcHJvajoKKwkqIGdzdC93YXZwYXJzZS93YXZwYXJzZS52Y3Byb2o6CisJKiBnc3QveTRtL3k0bWVuYy52Y3Byb2o6CisJKiB3aW4zMi9NQU5JRkVTVDoKKwkqIHdpbjMyL3ZzNi9hdXRvZ2VuLmRzcDoKKwkqIHdpbjMyL3ZzNi9nc3RfcGx1Z2luc19nb29kLmRzdzoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhbGF3LmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhbHBoYS5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0YWxwaGFjb2xvci5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0YXBldGFnLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhdWRpb2Z4LmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhdXBhcnNlLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhdXRvZGV0ZWN0LmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhdmkuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdGN1dHRlci5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0ZGlyZWN0c291bmQuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdGVmZmVjdHYuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdGZseC5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0Z29vbS5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0aWN5ZGVtdXguZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdGlkM2RlbXV4LmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RpbnRlcmxlYXZlLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RqcGVnLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RsZXZlbC5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0bWF0cm9za2EuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdG1lZGlhbi5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0bW9ub3Njb3BlLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RtdWxhdy5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0bXVsdGlwYXJ0LmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RwbmcuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdHF0ZGVtdXguZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdHJ0cC5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0cnRzcC5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0c21wdGUuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdHNwZWV4LmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3R1ZHAuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdHZpZGVvYmFsYW5jZS5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0dmlkZW9ib3guZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdHZpZGVvY3JvcC5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0dmlkZW9mbGlwLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3R2aWRlb21peGVyLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3R3YXZlZm9ybS5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0d2F2ZW5jLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3R3YXZwYXJzZS5kc3A6CisJKiB3aW4zMi92czcvbGliZ3N0ZGlyZWN0c291bmQudmNwcm9qOgorCSogd2luMzIvdnM4L2dzdC1wbHVnaW5zLWdvb2Quc2xuOgorCSogd2luMzIvdnM4L2xpYmdzdDEzOTQudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdGFhc2luay52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0YWxhdy52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0YWxwaGEudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdGFscGhhY29sb3IudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdGFubm9kZXgudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdGFwZXRhZy52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0YXVkaW9meC52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0YXVwYXJzZS52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0YXV0b2RldGVjdC52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0YXZpLnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3RjYWNhc2luay52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0Y2Rpby52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0Y3V0dGVyLnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3RkaXJlY3Rzb3VuZC52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0ZHYudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdGVmZmVjdHYudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdGZsYWMudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdGZseGRlYy52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0Z29vbS52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0aWN5ZGVtdXgudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdGlkM2RlbXV4LnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3RqcGVnLnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3RsYWRzcGEudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdGxldmVsLnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3RtYXRyb3NrYS52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0bW5nLnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3Rtb25vc2NvcGUudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdG11bGF3LnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3RtdWx0aXBhcnQudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdHBuZy52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0cnRwLnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3RydHNwLnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3RzaG91dDIudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdHNtcHRlLnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3RzcGVleC52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0dGFnbGliLnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3R1ZHAudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdHZpZGVvYmFsYW5jZS52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0dmlkZW9ib3gudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdHZpZGVvZmxpcC52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0dmlkZW9taXhlci52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0d2F2ZW5jLnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3R3YXZwYXJzZS52Y3Byb2o6CisJICB3aW4zMjogcmVtb3ZlIG91dGRhdGVkIGJ1aWxkIGNydWZ0CisJICBUaGlzIGhhc24ndCBiZWVuIHRvdWNoZWQgZm9yIGdlbmVyYXRpb25zLCBkb2Vzbid0IHdvcmssCisJICBhbmQgaXMganVzdCBjYXVzaW5nIGNvbmZ1c2lvbi4gV2UgYWxzbyBkb24ndCB3YW50IHRvCisJICBtYWludGFpbiB0aGVzZSBmaWxlcyBtYW51YWxseS4KKworMjAxNi0wMi0yMCAxMTo1MTo1NiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGRvbid0IHVzZSB1bmRlY2xhcmVkIGNvcmUgZGVidWcgY2F0ZWdvcnkgc3ltYm9scworCisyMDE2LTAyLTA2IDE0OjM5OjA1ICswMTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHdvcmthcm91bmQgZm9yIGZpbGVzIHdpdGggd3JvbmcgY29sb3JfdGFibGVfaWQgdmFsdWUKKwkgIEluc3RlYWQgb2YgZXJyb3Jpbmcgb3V0LCBqdXN0IHVzZSB0aGUgZGVmYXVsdCBjb2xvciB0YWJsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjE2MzcKKworMjAxNi0wMi0xOSAxNTowMjowNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA5ZGVwYXkuYzoKKwkgIGZsdm11eCwgcnRwdnA5ZGVwYXk6IGZpeCBpbmRlbnRhdGlvbgorCisyMDE2LTAyLTE5IDE1OjAzOjA0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJzcmM6IGZpeCBpbmRlbnRhdGlvbgorCisyMDE1LTEyLTA0IDAwOjQ2OjM0ICsxMTAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkBnbWFpbC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IHBsdWcgbGVhayhzKSBpbiBlcnJvci1zY2VuYXJpbworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MjIxMAorCisyMDE1LTEyLTA0IDAwOjQ2OjEyICsxMTAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkBnbWFpbC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBmaXggZW9zIGV2ZW50IGxlYWsKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjIyMDkKKworMjAxNi0wMi0xOSAxNDo0MTowNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZmx2ZGVtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2Zsdm11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaDI2My5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICB0ZXN0czogZml4IGluZGVudGF0aW9uCisKKzIwMTYtMDItMTggMTY6MDk6MjkgKzAxMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQGdtYWlsLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICB0ZXN0czogcnRwaml0dGVyYnVmZmVyOiBwb3J0IHRlc3RoYXJuZXNzIHRvIEdzdEhhcm5lc3MgYW5kIGNsZWFudXAvaW1wcm92ZQorCSAgUHJvYmFibHkgZm91bmQgYSBidWcgYXMgd2VsbCwgaW4gdGhhdCB0aGVyZSBhcmUgc29tZSB0aW1lc3RhbXBzIGluCisJICB0aGVyZSB0aGF0IGFyZSBsb29raW5nIHZlcnkgd3JvbmcuIChtYXJrZWQgd2l0aCBGSVhNRSkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjIyNjcKKworMjAxNi0wMi0xOCAxMDoyNzoxOSArMDEwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHRlc3RzOiBydHBqaXR0ZXJidWZmZXI6IHRlc3QgY2xlYW51cHMvaW1wcm92ZW1lbnRzCisJICBVc2UgZmFpbF91bmxlc3MgYW5kIGZyaWVuZHMgaW5zdGVhZCBvZiBnX2Fzc2VydAorCSAgRmFjdG9yIHNlcS1udW0gY2hlY2tpbmcgb3V0IHRvIHNlcGFyYXRlIGZ1bmN0aW9uCisJICBDaGVjayBtb3JlIHJldHVybi12YWx1ZXMgZnJvbSBwdXNoIGFuZCBjcmFuayBhbmQgb3RoZXJzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyMjU0CisKKzIwMTUtMTItMDMgMTE6MDc6MDUgKzAxMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHRlc3RzOiBydHBqaXR0ZXJidWZmZXI6IGZpeCBsZWFrcyBpbiB1bml0IHRlc3QKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjIyMTQKKworMjAxNi0wMi0xOSAxMjozODoyOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjcuMiA9PT0KKworMjAxNi0wMi0xOSAxMTo0OTo1NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFsczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS43LjIKKworMjAxNi0wMi0xOSAxMDozMTo0OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTYtMDItMTggMTg6MzM6MTMgKzAxMDAgIFBoaWxpcHBlIE5vcm1hbmQgPHBoaWxuQGlnYWxpYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcGx1ZyBsZWFrcyBpbiBjZW5jIGF1eCBpbmZvIHBhcnNpbmcKKworMjAxNi0wMi0xOCAxMzo0MzowNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICB0ZXN0czogZml4IHNwdXJpb3VzIHNvdXBodHRwc3JjIHRlc3QgdGltb3V0cworCSAgU2V0IEdTRVRUSU5HU19CQUNLRU5EPW1lbW9yeSwgYXBwYXJlbnRseSB0aGVyZSdzIHNvbWV0aGluZworCSAgYWJvdXQgZm9yaygpIGFuZCB0aGUgZGNvbmYgYmFja2VuZCAob3Igd2hhdGV2ZXIgZWxzZSB0aGF0CisJICBkcmFncyBpbiBvciBhY3RpdmF0ZXMpIHRoYXQgbWVzc2VzIHVwIGxvY2tpbmcgYW5kIGNhdXNlcworCSAgdGltZW91dHMgZHVlIHRvIGRlYWRsb2NrcyBpbiBnX211dGV4X2xvY2soKSwgc2luY2UKKwkgIGV2ZXJ5dGhpbmcgd29ya3MgZmluZSB3aXRoIENLX0ZPUks9bm8gYXMgd2VsbC4KKworMjAxNi0wMi0xOCAxMToxMDoxNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBVbm1hcCB3YXZwYWNrIGhlYWRlciBidWZmZXIgYWZ0ZXIgY3JlYXRpbmcgaXQKKwkgIE90aGVyd2lzZSBpdCB3aWxsIGJlIG1hcHBlZCB3cml0YWJsZSBhbGwgdGhlIHRpbWUgYW5kIHdlIGNhbid0IHJlYWQgZnJvbSBpdAorCSAgYW55d2hlcmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyMjM5CisKKzIwMTUtMTItMDggMTg6NDk6NDAgKzAxMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogQWRkIHRlc3QgZm9yIGJpZyBzZXFudW0gZ2FwIGhhbmRsaW5nCisJICBNYWtlIHN1cmUgdGhhdCB0aGUgcGFja2V0cyBxdWV1ZWQgd2hlbiBkZXRlY3RpbmcgYSBiaWcgZ2FwIGFyZSBwdXNoZWQKKwkgIGFmdGVyIHJlc2V0ICg1IGNvbnNlY3RpdmUgc2VxbnVtcykgYW5kIG5vdCBkcm9wcGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MjIxMQorCisyMDE2LTAyLTE3IDE1OjAzOjEzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHV0aWxzLmg6CisJICBydHA6IHNwcmlua2xlIHNvbWUgR19HTlVDX0lOVEVSTkFMIGZvciBpbnRlcm5hbCB1dGlscyBmdW5jdGlvbnMKKworMjAxNi0wMi0wOSAxMzoxNzowMCArMDAwMCAgQWxleCBBc2hsZXkgPGJ1Z3ppbGxhQGFzaGxleS1mYW1pbHkubmV0PgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IG9ubHkgdHJhbnNmb3JtIHByb3RlY3RlZCBjYXBzIG9uY2UKKwkgIENvbW1pdCA3ODczYmVkZTMxMzRiMTVlNTA2NmU4ZDE0ZTU0ZDFmNTA1NGQyMDYzCisJICAoaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MDc3NCkgY2hhbmdlZCB0aGUKKwkgIGJlaGF2aW91ciBvZiBxdGRlbXV4IHRvIGNhbGwgZ3N0X3F0ZGVtdXhfY29uZmlndXJlX3N0cmVhbSgpIGZvcgorCSAgZXZlcnkgbmV3IG1vb2YuCisJICBXaGVuIHBsYXlpbmcgYSBwcm90ZWN0ZWQgc3RyZWFtLCBnc3RfcXRkZW11eF9jb25maWd1cmVfc3RyZWFtKCkKKwkgIGNhbGxzIGdzdF9xdGRlbXV4X2NvbmZpZ3VyZV9wcm90ZWN0ZWRfY2FwcygpLiBUaGUKKwkgIGdzdF9xdGRlbXV4X2NvbmZpZ3VyZV9wcm90ZWN0ZWRfY2FwcygpIGZ1bmN0aW9uIHRha2VzIHRoZSBvcmlnaW5hbAorCSAgbWVkaWEgZm9ybWF0LCBwdXRzIHRoaXMgaW4gYSBmaWVsZCBjYWxsZWQgIm9yaWdpbmFsLW1lZGlhLXR5cGUiCisJICBhbmQgdGhlbiBjaGFuZ2VzIHRoZSBjYXBzIHRvICJhcHBsaWNhdGlvbi94LWNlbmMiLgorCSAgVGhlIGdzdF9xdGRlbXV4X2NvbmZpZ3VyZV9wcm90ZWN0ZWRfY2FwcygpIGRpZCBub3QgaGFuZGxlIHRoZSBjYXNlCisJICBvZiBiZWluZyBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIGNhdXNpbmcgaXQgdG8gaW5jb3JyZWN0bHkgc2V0IHRoZQorCSAgY2Fwcy4gVGhlIHNlY29uZCBjYWxsIHdhcyBjYXVzaW5nIHRoZSBjYXBzIHRvIGJlIHNldCB0bzoKKwkgIGFwcGxpY2F0aW9uL3gtY2VuYywgb3JpZ2luYWwtbWVkaWEtdHlwZSJhcHBsaWNhdGlvbi94LWNlbmMiCisJICBUaGlzIGNvbW1pdCBtYWtlcyBnc3RfcXRkZW11eF9jb25maWd1cmVfcHJvdGVjdGVkX2NhcHMoKSBjaGVjayB0aGF0CisJICB0aGUgY2FwcyBoYXZlIGFscmVhZHkgYmVlbiB0cmFuc2Zvcm1lZCwgc28gdGhhdCBpdCBvbmx5IGdldHMKKwkgIGNoYW5nZWQgb25jZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjE3NjkKKworMjAxNS0xMS0wMyAxNDo1MDo1MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBvcHVzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSAgb3B1czogQWRkIHByb3BlciBzdXBwb3J0IGZvciBtdWx0aWNoYW5uZWwgYXVkaW8KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTcxNTIKKworMjAxNS0wNi0zMCAxMzo1MTozMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBvcHVzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSAgb3B1czogQ29weSBtZXRhZGF0YSBpbiB0aGUgKGRlKXBheWxvYWRlciwgYnV0IG9ubHkgdGhlIHJlbGV2YW50IG9uZXMKKwkgIFRoZSBwYXlsb2FkZXIgZGlkbid0IGNvcHkgYW55dGhpbmcgc28gZmFyLCB0aGUgZGVwYXlsb2FkZXIgY29waWVkIGV2ZXJ5CisJICBwb3NzaWJsZSBtZXRhLiBMZXQncyBtYWtlIGl0IGNvbnNpc3RlbnQgYW5kIGp1c3QgY29weSBhbGwgbWV0YXMgd2l0aG91dCB0YWdzIG9yCisJICB3aXRoIG9ubHkgdGhlIGF1ZGlvIHRhZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTE3NzQKKworMjAxNS0wNS0wNCAxMToyMzoxNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBvcHVzZGVwYXkuYzoKKwkgIG9wdXNkZXBheTogU2V0IG11bHRpc3RyZWFtPUZBTFNFIG9uIHRoZSBPcHVzIGNhcHMKKwkgIFRoZSBSVFAgT3B1cyBtYXBwaW5nIG9ubHkgYWxsb3dzIG1vbm8vc3RlcmVvLCBhbmQgbm90IG11bHRpc3RyZWFtIE9wdXMKKwkgIHN0cmVhbXMuCisKKzIwMTUtMDMtMjQgMTM6NTc6NTQgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSAgcnRwb3B1c3BheTogRm9yd2FyZCBzdGVyZW8gcHJlZmVyZW5jZXMgZnJvbSBjYXBzIHVwc3RyZWFtCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ2NjE3CisKKzIwMTUtMDMtMjQgMTM6NTY6MjEgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSAgcnRwb3B1c3BheTogU2V0IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgdG8gMiBhcyBwZXIgUkZDIGRyYWZ0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ2NjE3CisKKzIwMTUtMDMtMjMgMTI6MjQ6NTUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG9wdXNwYXkuYzoKKwkgIG9wdXM6IEhhbmRsZSBzcHJvcC1zdGVyZW8gYW5kIHNwcm9wLW1heGNhcHR1cmVyYXRlIFJUUCBjYXBzIGZpZWxkcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjYxNworCisyMDE1LTAyLTE5IDE0OjMwOjEwICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBvcHVzcGF5LmM6CisJICBydHBvcHVzcGF5OiBkZWZhdWx0IGVuY29kaW5nIG5hbWUgdG8gT1BVUworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNzgxMAorCisyMDE1LTAyLTE5IDE0OjA1OjA2ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBvcHVzcGF5LmM6CisJICBydHBvcHVzcGF5OiBtYWtlIGNhcHMgd3JpdGFibGUgYmVmb3JlIHRydW5jYXRpbmcgdGhlbQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNzgxMAorCisyMDE1LTAyLTA1IDEwOjI3OjUxICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBvcHVzcGF5LmM6CisJICBydHBvcHVzcGF5OiBuZWdvdGlhdGUgdGhlIGVuY29kaW5nIG5hbWUKKwkgIENocm9tZSB1c2VzIGEgZGlmZmVyZW50IGVuY29kaW5nIG5hbWUgdGhhdCBnc3RyZWFtZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3ODEwCisKKzIwMTQtMTEtMDEgMTA6MTA6MjcgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG9wdXNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBvcHVzcGF5LmM6CisJICBydHBvcHVzOiBVc2UgT1BVUyBlbmNvZGluZyBuYW1lCisJICBCb3RoIEZpcmVmb3ggYW5kIENocm9tZSB1c2VzIE9QVVMgYXMgdGhlIGVuY29kaW5nIGluIHRoZWlyIFNEUC4KKwkgIEFkZGluZyB0aGlzIG5vdyBkZWZhY3RvIHN0YW5kYXJkIG5hbWUgcmVtb3ZlIHRoZSBuZWVkIGZvciBzcGVjaWFsCisJICBjYXNlIGluIFNEUCBwYXJzaW5nIGNvZGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3ODEwCisKKzIwMTMtMDEtMzEgMTI6MzA6NDkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSAgb3B1c3BheTogZml4IHRpbWVzdGFtcHMKKwkgIENvcHkgdGltZXN0YW1wcyB0byBwYXlsb2FkZWQgYnVmZmVyLgorCSAgQXZvaWQgaW5wdXQgYnVmZmVyIG1lbW9yeSBsZWFrLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MjkyOQorCisyMDEyLTExLTAzIDIwOjM4OjAwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvcnRwL2dzdHJ0cG9wdXNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBvcHVzZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBvcHVzcGF5Lmg6CisJICBGaXggRlNGIGFkZHJlc3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc1MjAKKworMjAxMi0xMC0yMiAxMjowODo0MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBvcHVzcGF5LmM6CisJICBvcHVzcGF5OiByZW1vdmUgcG9pbnRsZXNzIGNhcHMgc2VyaWFsaXphdGlvbgorCSAgUmVtb3ZlIHRoZSBjYXBzIHNlcmlhbGl6YXRpb24gaW4gdGhlIHJ0cCBjYXBzLiB0aGUgc3BlYyBub3IgdGhlIHJlY2VpdmVyCisJICBkb2VzIGFueXRoaW5nIHdpdGggaXQuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg2NTQ3CisKKzIwMTItMTAtMTcgMTc6MzQ6MjYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG9wdXNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBvcHVzcGF5LmM6CisJICBVc2UgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSgpCisJICB3aGVyZSBwb3NzaWJsZS4gQXZvaWRzIHNvbWUgc3RyaW5nIGNvcGllcy4gQWxzbyByZS1pbmRlbnQKKwkgIHNvbWUgc3R1ZmYuIEFsc28gc29tZSBpbmRlbnQgZml4ZXMgaGVyZSBhbmQgdGhlcmUuCisKKzIwMTItMDktMjAgMTg6NDE6MjQgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSAgcnRwb3B1c3BheTogQWxsb2NhdGUgdGhlIHJ0cCBidWZmZXIgY29ycmVjdGx5CisJICBVc2UgdGhlIHJpZ2h0IGZ1bmN0aW9ucyB0byBhbGxvY2F0ZSB0aGUgcnRwIGJ1ZmZlcgorCisyMDEyLTA5LTE0IDE3OjA4OjQ5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBvcHVzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSAgcmVwbGFjZSBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUgd2l0aCBnc3RfZWxlbWVudF9jbGFzc19zZXRfbWV0YWRhdGEKKworMjAxMi0wMy0wNyAxNzoxNDoyOSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSAgb3B1czogcG9ydCB0byB1cGRhdGVkIDAuMTEKKworMjAxMS0xMi0zMCAxMTo0MToxNyArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG9wdXNkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBvcHVzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG9wdXNwYXkuaDoKKwkgIE1lcmdlIHJlbW90ZS10cmFja2luZyBicmFuY2ggJ29yaWdpbi9tYXN0ZXInIGludG8gMC4xMS1wcmVtZXJnZQorCSAgQ29uZmxpY3RzOgorCSAgZG9jcy9saWJzL01ha2VmaWxlLmFtCisJICBleHQva2F0ZS9nc3RrYXRldGlnZXIuYworCSAgZXh0L29wdXMvZ3N0b3B1c2RlYy5jCisJICBleHQveHZpZC9nc3R4dmlkZW5jLmMKKwkgIGdzdC1saWJzL2dzdC9iYXNlY2FtZXJhYmluc3JjL01ha2VmaWxlLmFtCisJICBnc3QtbGlicy9nc3QvYmFzZWNhbWVyYWJpbnNyYy9nc3RiYXNlY2FtZXJhc3JjLmMKKwkgIGdzdC1saWJzL2dzdC9iYXNlY2FtZXJhYmluc3JjL2dzdGJhc2VjYW1lcmFzcmMuaAorCSAgZ3N0LWxpYnMvZ3N0L3ZpZGVvL2dzdGJhc2V2aWRlb2NvZGVjLmMKKwkgIGdzdC1saWJzL2dzdC92aWRlby9nc3RiYXNldmlkZW9jb2RlYy5oCisJICBnc3QtbGlicy9nc3QvdmlkZW8vZ3N0YmFzZXZpZGVvZGVjb2Rlci5jCisJICBnc3QtbGlicy9nc3QvdmlkZW8vZ3N0YmFzZXZpZGVvZW5jb2Rlci5jCisJICBnc3QvYXNmbXV4L2dzdGFzZm11eC5jCisJICBnc3QvYXVkaW92aXN1YWxpemVycy9nc3R3YXZlc2NvcGUuYworCSAgZ3N0L2NhbWVyYWJpbjIvZ3N0Y2FtZXJhYmluMi5jCisJICBnc3QvZGVidWd1dGlscy9nc3Rjb21wYXJlLmMKKwkgIGdzdC9mcmVpMHIvZ3N0ZnJlaTBybWl4ZXIuYworCSAgZ3N0L21wZWdwc211eC9tcGVncHNtdXguYworCSAgZ3N0L21wZWd0c211eC9tcGVndHNtdXguYworCSAgZ3N0L214Zi9teGZtdXguYworCSAgZ3N0L3ZpZGVvbWVhc3VyZS9nc3R2aWRlb21lYXN1cmVfc3NpbS5jCisJICBnc3QvdmlkZW9wYXJzZXJzL2dzdGgyNjRwYXJzZS5jCisJICBnc3QvdmlkZW9wYXJzZXJzL2dzdG1wZWc0dmlkZW9wYXJzZS5jCisKKzIwMTEtMTItMDkgMTc6MjU6NDEgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG9wdXNwYXkuYzoKKwkgIG9wdXNlbmM6IGFkZCB1cHN0cmVhbSBuZWdvdGlhdGlvbiBmb3IgbXVsdGlzdHJlYW0gYWJpbGl0eQorCSAgVGhpcyB3aWxsIGhlbHAgZWxlbWVudHMgdGhhdCBjYW5ub3QgZGVhbCB3aXRoIG11bHRpc3RyZWFtLAorCSAgc3VjaCBhcyB0aGUgUlRQIHBheWxvYWRlci4KKwkgIFRoZSBjYXBzIG5vdyBkbyBub3QgaW5jbHVkZSBhICJzdHJlYW1zIiBmaWVsZCBhbnltb3JlLCBidXQKKwkgIGEgIm11bHRpc3RyZWFtIiBib29sZWFuLCBzaW5jZSB3ZSBoYXZlIG5vIHJlYWwgdXNlIGZvciBrbm93aW5nCisJICB0aGUgZXhhY3QgYW1vdW50IG9mIHN0cmVhbXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY1MDc4CisKKzIwMTEtMTItMDcgMTU6MTM6MTEgLTAyMDAgIERhbmlsbyBDZXNhciBMZW1lcyBkZSBQYXVsYSA8ZGFuaWxvLmNlc2FyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBvcHVzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG9wdXNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5oOgorCSAgQWRkaW5nIG9wdXMgUlRQIHBheWxvYWRlci9kZXBheWxvYWRlciBlbGVtZW50CisJICBBZGRpbmcgT1BVUyBSVFAgbW9kdWxlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRyYWZ0OgorCSAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2lkL2RyYWZ0LXNwaXR0a2EtcGF5bG9hZC1ydHAtb3B1cy0wMC50eHQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjQ4MTcKKworMjAxNi0wMi0xNyAxMzoyNjowMiArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHV0aWxzLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHV0aWxzLmg6CisJICBydHA6IGgyNjQvaDI2NTogYXZvaWQgZHVwbGljYXRpb24gb2YgcmVhZF9nb2xvbWIoKQorCSAgVGhlcmUgaXMgbm8gbmVlZCB0byBoYXZlIHR3byBpZGVudGljYWwgaW1wbGVtZW50YXRpb25zIG9mIHRoZSByZWFkX2dvbG9tYgorCSAgZnVuY3Rpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYxNjA2CisKKzIwMTYtMDItMTcgMTQ6Mzc6NDQgKzAxMDAgIE9nbnlhbiBUb25jaGV2IDxvZ255YW5AYXhpcy5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIFRSSUNLTU9ERV9LRVlfVU5JVFMKKwkgIFdoZW4gdGhlIHRyaWNrbW9kZSBrZXktdW5pdHMgZmxhZyBpcyBzZXQgb24gdGhlIHNlZ21lbnQsIHNpbXBseSBza2lwCisJICBhbnkgc2FtcGxlIG9uIGEgdmlkZW8gc3RyZWFtIHRoYXQgaXNuJ3QgYSBrZXlmcmFtZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MjE4NQorCisyMDE1LTA4LTIxIDE0OjE1OjE4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thLWRlbXV4OiBzZW5kIEdBUCBldmVudHMgZm9yIGxhZ2dpbmcgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbXMgdG9vCisJICBTZW5kIEdBUCBldmVudHMgZm9yIG5vbi1zdWJ0aXRsZSBzdHJlYW1zIHRvbyBpZiB0aGV5IGxhZyB0b28gbXVjaAorCSAgYmVoaW5kLCBidXQgdXNlIGEgaGlnaGVyIHRocmVzaG9sZCB0aGFuIGZvciBzdWJ0aXRsZXMuCisJICBUaGlzIGhlbHBzIHdpdGggZml4aW5nIHByZXJvbGxpbmcgd2l0aCBhIGZpbGUgd2hlcmUgb25lIG9mIHRoZQorCSAgYXVkaW8gc3RyZWFtcyBvbmx5IGhhcyBkYXRhIHN0YXJ0aW5nIGZyb20gMTlzIG9ud2FyZHMuIEl0J3Mgbm90CisJICBhIGNvbXBsZXRlIGZpeCB5ZXQsIGl0IGFsc28gcmVxdWlyZXMgY2hhbmdlcyBlbHNld2hlcmUsIHN1Y2ggYXMKKwkgIGluIGJhc2VwYXJzZSwgdG8gbWFrZSBzdXJlIGNhcHMgYXJlIHByb3BhZ2F0ZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjE0NDYwCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzODk5CisKKzIwMTUtMTItMjMgMTk6NTQ6MTMgKzAxMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA5ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA5ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA5cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZwOXBheS5oOgorCSAgcnRwdnA5cGF5OiBydHB2cDlkZXBheTogSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBkcmFmdCAwMQorCSAgUXVpY2sgYW5kIGRpcnR5IGltcGxlbWVudGF0aW9uIG9mIGFuIFJUUCBwYXlsb2FkZXIgYW5kIGRlcGF5bG9hZGVyCisJICBmb3IgVlA5LiBJbiBwYXJ0aWNhbHVyIGl0IGFzc3VtZXMgbm8gc3BhdGlhbCBvciB0ZW1wb3JhbCBsYXllcmluZywKKwkgIG5vbi1mbGV4aWJsZSBtb2RlLCBhbmQgc29tZSBvdGhlciBiaXRzIGFuZCBwaWVjZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU0NzczCisKKzIwMTYtMDItMTYgMDk6MDI6MzAgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBGaXggc3RyaW5nIG1lbW9yeSBsZWFrCisJICBjb2RlY19uYW1lIGlzIG5vdCBiZWluZyBmcmVlZCBpbiBhbGwgY29uZGl0aW9ucyBsZWFkaW5nIHRvIG1lbW9yeSBsZWFrCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyMTE3CisKKzIwMTUtMTItMTAgMTI6MTU6NTIgKzAxMDAgIE1pZ3VlbCBQYXLDrXMgRMOtYXogPG1wYXJpc2RpYXpAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgcnRwYmluOiBhZGQgImdldC1zZXNzaW9uIiBzaWduYWwKKwkgIFRoaXMgZ2V0cyB0aGUgR3N0UlRQU2Vzc2lvbiBlbGVtZW50LCBhcyBjb21wYXJlZCB0byB0aGUgUlRQU2Vzc2lvbiBvYmplY3QKKwkgIHRoYXQgaXMgcmV0dXJuZWQgYnkgZ2V0LWludGVybmFsLXNlc3Npb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU5MjkzCisKKzIwMTYtMDItMTYgMDA6MTk6MDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSAgcnRwOiBoMjY1OiBob29rIHVwIG1vdmUgUlRQIEguMjY1IHBheWxvYWRlci9kZXBheWxvYWRlciB0byBidWlsZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MTYwNgorCisyMDE2LTAyLTE2IDAwOjE0OjI3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSAgcnRwOiBoMjY1OiB1c2UgY29tbW9uIG1ldGEgdXRpbGl0eSBmdW5jdGlvbnMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjE2MDYKKworMjAxNi0wMi0wNSAxODoxODozMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1dHlwZXMuaDoKKwkgIHJ0cDogaDI2NTogcmVtb3ZlIGNvZGVjcGFyc2VyIGRlcGVuZGVuY3kgZnJvbSBoMjY1IHBheWxvYWRlci9kZXBheWxvYWRlcgorCSAgTG9va3MgbGlrZSBpdCBqdXN0IHVzZXMgdGhlIE5BTCBlbnVtcyBhbmQgbm90aGluZyBlbHNlIGZyb20KKwkgIHRoZSBjb2RlY3BhcnNlcnMsIGFuZCB0aGF0J3MgdGhlIG9ubHkgcmVhc29uIGl0IGhhZCB0byBiZQorCSAgbW92ZWQgZnJvbSAtZ29vZCB0byAtYmFkIHdoZW4gaXQgd2FzIG9yaWdpbmFsbHkgYWRkZWQuIFdlCisJICBjYW4gcHJvYmFibHkga2VlcCB0aG9zZSBOQUwgZW51bXMgdXAgdG8gZGF0ZSBlbm91Z2gsIHNvIGxldCdzCisJICByZW1vdmUgdGhlIGNvZGVjcGFyc2VyIGRlcGVuZGVuY3kgc28gaXQgY2FuIGJlIG1vdmVkIGJhY2sgaW50bworCSAgLWdvb2QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYxNjA2CisKKzIwMTYtMDItMTYgMDA6MjQ6NTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkgIE1lcmdlIGJyYW5jaCAncGx1Z2luLW1vdmUtcnRwLWgyNjUnCisJICBNb3ZlIFJUUCBILjI2NSBwYXlsb2FkZXIvZGVwYXlsb2FkZXIgZnJvbSAtYmFkIHRvIC1nb29kLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MTYwNgorCisyMDE2LTAyLTA1IDE1OjM0OjUxICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuaDoKKwkgIGdzdHJ0cGgyNjVkZXBheToga2VlcCBjb25zaXN0ZW5jeSB3aXRoIHJ0cGgyNjRkZXBheQorCSAgVXNlIGdzdF9ydHBfZHJvcF9tZXRhKCkgYW5kIHRoZSBzYW1lIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IKKwkgIGdzdF9ydHBfY29weV9tZXRhKCkgdG8ga2VlcCBjb25zaXN0ZW5jeSB3aXRoIHRoZSBSVFAgZWxlbWVudHMgaW4KKwkgIGdzdC1wbHVnaW5zLWdvb2QKKworMjAxNi0wMi0wNSAxMzo1NjozNCArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuYzoKKwkgIHJ0cGgyNjVkZXBheTogZml4IHRlcm1pbmF0aW9uIG9mIGFjY2VzcyB1bml0CisJICBPbmx5IGNvbnNpZGVyIHRoZSBhY2Nlc3MgdW5pdCBjb21wbGV0ZSB3aGVuIHRoZSBuZXh0LW9jY3VycmluZyBWQ0wgTkFMIHVuaXQKKwkgIGhhcyB0aGUgZmlyc3QgYml0IGFmdGVyIGl0cyBOQUwgdW5pdCBoZWFkZXIgZXF1YWwgdG8gMS4KKworMjAxNi0wMS0xNSAxNjoxMDowMiArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuYzoKKwkgIHJ0cGgyNjVkZXBheTogZml4IHVubmVlZGVkIHN1Yi1idWZmZXIgY3JlYXRpb24KKwkgIFdlIGNyZWF0ZSBhIHN1Yi1idWZmZXIganVzdCB0byBjb3B5IG92ZXIgaXRzIG1ldGFzIGFuZCB0aGVuIHRocm93IGl0CisJICBhd2F5IGltbWVkaWF0ZWx5LCBqdXN0IHVzZSB0aGUgb3JpZ2luYWwgaW5wdXQgYnVmZmVyIGRpcmVjdGx5LgorCisyMDE2LTAxLTE1IDE1OjU2OjU5ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVwYXkuYzoKKwkgIHJ0cGgyNjVwYXk6IGFkZCAic2VuZCBWUFMvU1BTL1BQUyB3aXRoIGV2ZXJ5IGtleSBmcmFtZSIgbW9kZQorCSAgSXQncyBub3QgZW5vdWdoIHRvIGhhdmUgdGltZW91dCBvciBldmVudCBiYXNlZCBWUFMvU1BTL1BQUyBpbmZvcm1hdGlvbgorCSAgc2VudCBpbiBSVFAgcGFja2V0cy4gVGhlcmUgYXJlIHNvbWUgc2NlbmFyaW9zIHdoZW4ga2V5IGZyYW1lcyBtYXkgYXBwZWFyCisJICBtb3JlIGZyZXF1ZW50bHkgdGhhbiBvbmNlIGEgc2Vjb25kLCBpbiB3aGljaCBjYXNlIHRoZSBtaW5pbXVtIHRpbWVvdXQKKwkgIGZvciAiY29uZmlnLWludGVydmFsIiBvZiAxIHNlY29uZCBmb3Igc2VuZGluZyBWUFMvU1BTL1BQUyBpc24ndCBlbm91Z2guCisJICBJdCBtaWdodCBhbHNvIGJlIGRlc2lyYWJsZSBpbiBnZW5lcmFsIHRvIG1ha2Ugc3VyZSB0aGUgVlBTL1NQUy9QUFMgaXMKKwkgIGF2YWlsYWJsZSB3aXRoIGV2ZXJ5IGtleWZyYW1lIChwYWNrZXQgbG9zcyBhc2lkZSksIHNvIHJlY2VpdmVycyBjYW4KKwkgIGFjdHVhbGx5IHBpY2sgdXAgZGVjb2RpbmcgaW1tZWRpYXRlbHkgZnJvbSB0aGUgZmlyc3Qga2V5ZnJhbWUgaWYKKwkgIFZQUy9TUFMvUFBTIGlzIG5vdCBzaWduYWxlZCBvdXQgb2YgYmFuZC4KKwkgIFRoaXMgY29tbWl0IGFkZHMgdGhlIHBvc3NpYmlsaXR5IHRvIHNlbmQgVlBTL1NQUy9QUFMgd2l0aCBldmVyeSBrZXkgZnJhbWUuCisJICBUaGlzIG1vZGUgY2FuIGJlIGVuYWJsZWQgYnkgc2V0dGluZyAiY29uZmlnLWludGVydmFsIiBwcm9wZXJ0eSB0byAtMS4gSW4KKwkgIHRoaXMgY2FzZSB0aGUgcGF5bG9hZGVyIHdpbGwgYWRkIFZQUywgU1BTIGFuZCBQUFMgYmVmb3JlIGV2ZXJ5IGtleSAoSURSKQorCSAgZnJhbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU3ODkyCisKKzIwMTYtMDEtMTUgMTU6MTk6NDEgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1cGF5Lmg6CisJICBydHBoMjY1cGF5OiBjaGFuZ2UgY29uZmlnLWludGVydmFsIHByb3BlcnR5IHR5cGUgZnJvbSB1aW50IHRvIGludAorCSAgVGhpcyB3YXkgd2UgY2FuIHVzZSAtMSBhcyBzcGVjaWFsIHZhbHVlLCB3aGljaCBpcyBuaWNlciB0aGFuIE1BWFVJTlQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU3ODkyCisKKzIwMTUtMDgtMTUgMTY6MjI6MjAgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNAZGViZXRoZW5jb3VydC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmM6CisJICBydHBoMjY1ZGVwYXk6IG1ha2Ugc3VyZSB3ZSBjYWxsIGhhbmRsZV9uYWwgZm9yIGVhY2ggTkFMCisJICBDYWxsIGhhbmRsZV9uYWwgZm9yIGVhY2ggTkFMIGluIHRoZSBTVEFQLUEgUlRQIHBhY2tldC4gVGhpcyBtYWtlcyBzdXJlCisJICB3ZSBjb3JyZWN0bHkgZXh0cmFjdCB0aGUgU1BTIGFuZCBQUFMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMwOTk5CisKKzIwMTUtMDgtMTUgMTQ6NDU6MzQgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNAZGViZXRoZW5jb3VydC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSAgcnRwaDI2NXBheTogQ29weSBtZXRhZGF0YSBpbiB0aGUgcGF5bG9hZGVyLCBidXQgb25seSB0aGUgcmVsZXZhbnQgb25lcworCSAgVGhlIHBheWxvYWRlciBkaWRuJ3QgY29weSBhbnl0aGluZyBzbyBmYXIsIHRoZSBkZXBheWxvYWRlciBjb3BpZWQgZXZlcnkKKwkgIHBvc3NpYmxlIG1ldGEuIExldCdzIG1ha2UgaXQgY29uc2lzdGVudCBhbmQganVzdCBjb3B5IGFsbCBtZXRhcyB3aXRob3V0CisJICB0YWdzIG9yIHdpdGggb25seSB0aGUgdmlkZW8gdGFnLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTc3NAorCisyMDE1LTA4LTE1IDExOjQxOjQwICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzQGRlYmV0aGVuY291cnQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVwYXkuYzoKKwkgIHJ0cGgyNjVwYXk6IFVzZSBHU1RfV0FSTklOR19PQkpFQ1QoKSBpbnN0ZWFkIG9mIEdTVF9XQVJOSU5HKCkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTMyMjgKKworMjAxNS0wOC0xNSAxMTozMDozNiArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc0BkZWJldGhlbmNvdXJ0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1cGF5LmM6CisJICBydHBoMjY1cGF5OiBmaXggcG90ZW50aWFsIGNyYXNoIHdoZW4gc2h1dHRpbmcgZG93bgorCSAgQSByYWNlIGNvbmRpdGlvbiBpbiB0aGUgc3RhdGUgY2hhbmdlIGZ1bmN0aW9uIG1heSBjYXVzZSBidWZmZXJzIHRvIGJlCisJICB1bnJlZmZlZCB3aGlsZSB0aGV5IGFyZSBzdGlsbCB1c2VkIGJ5IHRoZSBzdHJlYW1pbmcgdGhyZWFkIGluCisJICBnc3RfcnRwX2gyNjVfcGF5X3NlbmRfdnBzX3Nwc19wcHMoKSByZXN1bHRpbmcgaW4gYSBjcmFzaC4gQ2hhaW4gdXAgdG8gdGhlCisJICBwYXJlbnQgY2xhc3MgZmlyc3QgaW4gdGhlIHN0YXRlIGNoYW5nZSBmdW5jdGlvbiB0byBtYWtlIHN1cmUgc3RyZWFtaW5nCisJICBoYXMgc3RvcHBlZCBhbmQgb25seSB0aGVuIGZyZWUgdGhvc2UgYnVmZmVycy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDEzODEKKworMjAxNS0wOC0xNCAxNTowODowOCArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc0BkZWJldGhlbmNvdXJ0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1cGF5LmM6CisJICBydHBoMjY1cGF5OiBmaXggYnVmZmVyIGxlYWsgd2hlbiB1c2luZyBTUFMvUFBTCisJICBGaXhlcyBhIGJ1ZmZlciBsZWFrIHRoYXQgd291bGQgb2NjdXIgaWYgdGhlIHBpcGVsaW5lIHdhcyBzaHV0ZG93biB3aGlsZSBhCisJICBTUFMvUFBTIGhlYWRlciB3YXMgYmVpbmcgY3JlYXRlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDEyNzEKKworMjAxNS0wOC0xNCAxMTo0OTo1MSArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc0BkZWJldGhlbmNvdXJ0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5Lmg6CisJICBydHBoMjY1ZGVwYXk6IGNvcHkgbWV0YWRhdGEgaW4gdGhlIGRlcGF5bG9hZGVyLCBidXQgb25seSB0aGUgcmVsZXZhbnQgb25lcworCSAgVGhlIHBheWxvYWRlciBkaWRuJ3QgY29weSBhbnl0aGluZyBzbyBmYXIsIHRoZSBkZXBheWxvYWRlciBjb3BpZWQgZXZlcnkKKwkgIHBvc3NpYmxlIG1ldGEuIExldCdzIG1ha2UgaXQgY29uc2lzdGVudCBhbmQganVzdCBjb3B5IGFsbCBtZXRhcyB3aXRob3V0CisJICB0YWdzIG9yIHdpdGggb25seSB0aGUgdmlkZW8gdGFnLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTc3NAorCisyMDE1LTA4LTEyIDE3OjU0OjUyICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzQGRlYmV0aGVuY291cnQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVkZXBheS5jOgorCSAgcnRwaDI2NWRlcGF5OiBjaGVja2luZyBpZiBkZXBheSBoYXMgc3BzL3BwcyBuYWxzIGJlZm9yZSBpbnNlcnRpb24KKwkgIFJlbGF0ZWQgdG86IGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM0MzAKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTMyMjgKKworMjAxNS0wOC0xMiAxNzoyMjo0MiArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc0BkZWJldGhlbmNvdXJ0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuYzoKKwkgIHJ0cGgyNjVkZXBheTogb25seSB1cGRhdGUgdGhlIHNyY3BhZCBjYXBzIGlmIHNvbWV0aGluZyBlbHNlIHRoYW4gdGhlIGNvZGVjX2RhdGEgY2hhbmdlZAorCSAgaDI2NHBhcnNlIGFuZCBnc3RydHBoMjY0ZGVwYXkgZG8gdGhlIHNhbWUsIGxldCdzIGtlZXAgdGhlIGJlaGF2aW91cgorCSAgY29uc2lzdGVudC4gQXMgd2Ugbm93IGluY2x1ZGUgdGhlIGNvZGVjX2RhdGEgaW5zaWRlIHRoZSBzdHJlYW0sIHRoaXMgY2F1c2VzCisJICBsZXNzIGNhcHMgcmVuZWdvdGlhdGlvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTMyMjgKKworMjAxNS0wOC0xMiAxNjo0Mzo0OCArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc0BkZWJldGhlbmNvdXJ0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuYzoKKwkgIHJ0cGgyNjVkZXBheTogUFBTIHJlcGxhY2VzIG9sZCBQUFMgaWYgaXQgaGFzIHRoZSBzYW1lIGlkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzMjI4CisKKzIwMTUtMDgtMTIgMTY6MTE6MDAgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNAZGViZXRoZW5jb3VydC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmM6CisJICBydHBoMjY1ZGVwYXk6IEluc2VydCBTUFMvUFBTIE5BTHMgaW50byB0aGUgc3RyZWFtCisJICBydHBoMjY0ZGVwYXkgZG9lcyB0aGUgc2FtZSBhbmQgdGhpcyBmaXhlcyBkZWNvZGluZyBvZiBzb21lIHN0cmVhbXMgd2l0aCAzMgorCSAgU1BTIChvciAyNTYgUFBTKS4gSXQgaXMgYWxsb3dlZCB0byBoYXZlIFNQUyBJRCAwIHRvIDMxIChvciBQUFMgSUQgMCB0byAyNTUpLAorCSAgYnV0IHRoZSBmaWVsZCBpbiB0aGUgY29kZWNfZGF0YSBmb3IgdGhlIG51bWJlciBvZiBTUFMgb3IgUFBTIGlzIG9ubHkgNQorCSAgKG9yIDgpIGJpdC4gQXMgc3VjaCwgMzIgU1BTIChvciAyNTYgUFBTKSBhcmUgaW50ZXJwcmV0ZWQgYXMgMCBldmVyeXdoZXJlLgorCSAgVGhpcyBsb29rcyBsaWtlIGEgbWlzdGFrZSBpbiB0aGUgcGFydCBvZiB0aGUgc3BlY3QgYWJvdXQgdGhlIGNvZGVjX2RhdGEuCisKKzIwMTUtMDgtMTIgMTU6NDk6NTAgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNAZGViZXRoZW5jb3VydC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmM6CisJICBydHBoMjY1ZGVwYXk6IGltcGxlbWVudCBwcm9jZXNzX3J0cF9wYWNrZXQoKSB2ZnVuYworCSAgRm9yIG1vcmUgb3B0aW1pc2VkIFJUUCBwYWNrZXQgaGFuZGxpbmc6IG1lYW5zIHdlIGRvbid0IG5lZWQgdG8gbWFwIHRoZQorCSAgaW5wdXQgYnVmZmVyIGFnYWluIGJ1dCBjYW4ganVzdCByZS11c2UgdGhlIG1hcHBpbmcgdGhlIGJhc2UgY2xhc3MgaGFzCisJICBhbHJlYWR5IGRvbmUuCisJICBCYXNlZCBvbjogaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MDIzNQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MzIyOAorCisyMDE1LTA4LTEyIDE1OjE0OjUwICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzQGRlYmV0aGVuY291cnQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVkZXBheS5jOgorCSAgcnRwaDI2NWRlcGF5OiBVc2UgR1NUX0JVRkZFUl9QVFMoKSBpbnN0ZWFkIG9mIEdTVF9CVUZGRVJfVElNRVNUQU1QKCkKKwkgIFN3aXRjaGluZyB0byBHU1RfQlVGRkVSX1RJTUVTVEFNUCgpIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBydHAgY29kZS4KKworMjAxNS0wOC0xMiAxNDo1OTo1MyArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc0BkZWJldGhlbmNvdXJ0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuYzoKKwkgIHJ0cGgyNjVkZXBheTogcHJldmVudCB0cnlpbmcgdG8gZ2V0IDAgYnl0ZXMgZnJvbSBhZGFwdGVyCisJICBUaGlzIGNhdXNlcyBhbiBhc3NlcnRpb24gYW5kIHdvdWxkIGxlYWQgdG8gZ2V0dGluZyBhIE5VTEwgaW5zdGVhZAorCSAgb2YgYSBidWZmZXIuIFdpdGhvdXQgcHJvcGVyIGNoZWNraW5nIHRoaXMgd291bGQgZWFzaWx5IGxlYWQgdG8gYQorCSAgc2VnZmF1bHQuCisJICBSZWxhdGVkIHRvIHJwdGgyNjRkZXBheTogaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNzE5OQorCisyMDE1LTA3LTI5IDE3OjI5OjI4ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzQGRlYmV0aGVuY291cnQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVwYXkuYzoKKwkgIHJ0cDogcmVtb3ZlIGRlYWQgYXNzaWdubWVudAorCSAgVmFsdWUgc2V0IHRvIHJldCB3aWxsIGJlIG92ZXJ3cml0dGVuIGF0IGxlYXN0IG9uY2UgYXQgdGhlIGVuZCBvZiB0aGUgd2hpbGUKKwkgIGxvb3AsIHJlbW92aW5nIGFzc2lnbm1lbnQuCisKKzIwMTUtMDQtMjQgMTY6NDg6MjMgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSAgcmVtb3ZlIHVudXNlZCBlbnVtIGl0ZW1zIFBST1BfTEFTVAorCSAgVGhpcyB3ZXJlIHByb2JhYmx5IGFkZGVkIHRvIHRoZSBlbnVtcyBkdWUgdG8gY2FyZ28gY3VsdCBwcm9ncmFtbWluZyBhbmQgYXJlCisJICB1bnVzZWQuCisKKzIwMTUtMDMtMDYgMTQ6NTQ6NDEgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmM6CisJICBydHA6IGRvbmxfcHJlc2VudCB2YXJpYWJsZSB1bnVzZWQKKwkgIGRvbmxfcHJlc2VudCBpcyBub3QgaW1wbGVtZW50ZWQsIHlldCB0aGUgdmFsdWUgaXMgc2V0IGFuZCBjaGVja2VkIGEgZmV3IHRpbWVzLgorCSAgQ2xlYW5pbmcgdGhpcy4KKwkgIENJRCAjMTI0OTY4NworCisyMDE1LTAxLTA4IDE1OjM2OjA0ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVwYXkuYzoKKwkgIHJ0cDogdmFsdWUgdHJ1bmNhdGVkIHRvbyBzaG9ydCBjcmVhdGVzIGRlYWQgY29kZQorCSAgdHlwZSBpcyB0cnVuY2F0ZWQgdG8gMC0zMSB3aXRoICImIDB4MWYiLCBidXQgcmlnaHQgYWZ0ZXIgdGhhdCBpdCBpcyBjaGVja3MgaWYKKwkgIHRoZSB2YWx1ZSBpcyBlcXVpdmFsZW50IHRvIEdTVF9IMjY1X05BTF9WUFMsIEdTVF9IMjY1X05BTF9TUFMsIGFuZAorCSAgR1NUX0gyNjVfTkFMX1BQUyAod2hpY2ggYXJlIDMyLCAzMywgYW5kIDM0IHJlc3BlY3RpdmVseSkuIE9idmlvdXNseSwgdGhpcyB3aWxsCisJICBuZXZlciBiZSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBtYXhpbXVtIDMxIGFmdGVyIHRoZSB0cnVuY2F0aW9uLgorCSAgVGhlIGludGVudGlvbiBvZiB0aGUgY29kZSB3YXMgdG8gdHJ1bmNhdGUgdG8gMC02My4KKworMjAxNS0wMS0wOCAxNToyNzo0NCArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuYzoKKwkgIHJ0cDogZml4IG5hbCB1bml0IHR5cGUgY2hlY2sKKwkgIEFmdGVyIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbiB0aGUgcHJldmlvdXMgY29tbWl0IGlzIHdyb25nLiBUaGUgY29kZSBpbnRlbmRlZCB0bworCSAgY2hlY2sgaWYgdGhlIHR5cGUgaXMgMzkgb3IgdGhlIHJhbmdlcyA0MS00NCBhbmQgNDgtNTUuIEp1c3QgbGlrZSBnc3RoMjY1cGFyc2UuYworCSAgZG9lcy4gVHlwZSA0MCB3b3VsZCBub3QgYmUgY29tcGxldGUuCisKKzIwMTUtMDEtMDggMTM6NDc6MDkgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmM6CisJICBydHA6IGZpeCBkZWFkIGNvZGUgYW5kIGNoZWNrIGZvciBpbXBvc3NpYmxlIHZhbHVlcworCSAgbmFsX3R5cGUgaXMgdGhlIGluZGV4IGZvciBhIEdzdEgyNjVOYWxVbml0VHlwZSBlbnVtLiBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGRlYWQKKwkgIGNvZGUgaGVyZToKKwkgIEZpcnN0LCBhZnRlciBjaGVja2luZyBpZiBuYWxfdHlwZSBpcyA+PSAzOSB0aGVyZSBhcmUgdHdvIE9SIGNvbmRpdGlvbmFscyB0aGF0CisJICBjaGVjayBpZiB0aGUgdmFsdWUgaXMgaW4gcmFuZ2VzIGhpZ2hlciB0aGFuIHRoYXQgbnVtYmVyLCBzbyBpZiBuYWxfdHlwZSA+PSAzOQorCSAgZmFsbHMgaW4gdGhlIFRydWUgYnJhbmNoIHRob3NlIG90aGVyIGNvbmRpdGlvbnMgYXJlbid0IGNoZWNrZWQgYW5kIGlmIGl0IGZhbGxzCisJICBpbiB0aGUgRmFsc2UgYnJhbmNoIGFuZCB0aGV5IGFyZSBjaGVja2VkLCB0aGV5IHdpbGwgYWx3YXlzIGFsc28gYmUgRmFsc2UuIFRoZXkKKwkgIGFyZSByZWR1bmRhbnQuCisJICBTZWNvbmQsIHRoZSBlbnVtIGhhcyBhIHJhbmdlIG9mIDAgdG8gNDAuIFNvIHRoZSBjaGVja3MgZm9yIHJhbmdlcyBoaWdoZXIgdGhhbiA0MQorCSAgc2hvdWxkIG5ldmVyIGJlIFRydWUuCisJICBSZW1vdmluZyB0aGlzIHJlZHVuZGFudCBjaGVja3MuCisJICBDSUQgMTI0OTY4NAorCisyMDE0LTEwLTE2IDEwOjM0OjAxICswMjAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1cGF5Lmg6CisJICBydHA6IGFkZCBoMjY1IFJUUCBwYXlsb2FkZXIgKyBkZXBheWxvYWRlcgorCisyMDE2LTAyLTE1IDExOjUxOjQ2ICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBtdXguYzoKKwkgIHRlc3RzOiBydHBtdXg6IEZpeCBlbGVtZW50IG1lbW9yeSBsZWFrCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyMDU3CisKKzIwMTYtMDItMTIgMjA6NTc6MjkgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tb25vc2NvcGUvbW9ub3Njb3BlLmM6CisJICBtb25vc2NvcGU6IHJld29yayB0aGUgc2NhbGluZyBjb2RlCisJICBUaGUgcnVubmluZyBhdmVyYWdlIHdhcyB3cm9uZyBhbmQgdGhlIHJlc3VsdGluZyBzY2FsaW5nIGZhY3RvciB3YXMgb25seSBoZWxkIGluCisJICBwbGFjZSB1c2luZyB0aGUgQ0xBTVAuIEluIGFkZHRpb24gd2UgYXJlIG5vdyBjb252ZXJpbmcgcXVpY2tseSB0byB2b2x1bWUKKwkgIGNoYW5nZXMuCisJICBGSW5hbGx5IG5vdyB3aXRoIHRoaXMgY2hhbmdlLCB3ZSBjYW4gY2hhbmdlIHRoZSByZXNvbHV0aW9uIGRlZmluZXMgYW5kCisJICBldmVyeXRoaWduIGFkanVzdHMuCisKKzIwMTYtMDEtMjggMTc6MDA6NTUgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tb25vc2NvcGUvY29udm9sdmUuYzoKKwkqIGdzdC9tb25vc2NvcGUvbW9ub3Njb3BlLmM6CisJKiBnc3QvbW9ub3Njb3BlL21vbm9zY29wZS5oOgorCSAgbW9ub3Njb3BlOiB1c2UgY29uc3RhbnRzIGluIHRoZSBkcmF3aW5nIGNvZGUKKwkgIE1ha2UgYWxsIHRoZSBkcmF3aW5nIG9wcyBiZSBiYXNlZCBvbiB0aGUgY29uc3RhbnRzLiBUaGlzIHdheSB3ZSBjYW4gY2hhbmdlCisJICB0aGUgZml4ZWQgc2l6ZSBhdCBsZWFzdCBhdCBjb21waWxlIHRpbWUuCisKKzIwMTYtMDEtMjggMDk6NTE6MTcgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6CisJICBtb25vc2NvcGU6IHJlcGxhY2UgaGFyZGNvZGVkIHZhbHVlcyBieSBjb25zdGFudHMKKwkgIFRoaXMgYXQgbGVhc3QgZXN0YWJsaXNoZXMgdGhlIHJlbGF0aW9uc2hpcC4KKworMjAxNi0wMS0yOCAwOTo0MzoxMiArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L21vbm9zY29wZS9jb252b2x2ZS5jOgorCSogZ3N0L21vbm9zY29wZS9jb252b2x2ZS5oOgorCSogZ3N0L21vbm9zY29wZS9tb25vc2NvcGUuYzoKKwkqIGdzdC9tb25vc2NvcGUvbW9ub3Njb3BlLmg6CisJICBtb25vc2NwZTogbWFrZSB0aGUgY29udm9sdmVyIHVzZSBkeW5hbWljIG1lbW9yeQorCSAgUmVwbGFjZSBhbGwgI2RlZmluZXMgd2l0aCBtZW1iZXJzIGFuZCBpbml0aWFsaXplIHRoZSBjb252b2x2ZXIgd2l0aCBhIHBhcmFtZXRlci4KKworMjAxNi0wMS0yOCAwODo1Njo0NCArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L21vbm9zY29wZS9SRUFETUU6CisJICBtb25vc2NvcGU6IHVwZGF0ZSBSRUFETUUKKwkgIFdlIGNhbiBhbHJlYWR5IGNyZWF0ZSBtdWx0aXBsZSBpbnN0YW5jZXMuCisKKzIwMTYtMDEtMjggMDg6NTM6MzUgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tb25vc2NvcGUvY29udm9sdmUuYzoKKwkqIGdzdC9tb25vc2NvcGUvbW9ub3Njb3BlLmM6CisJICBtb25vc2NvcGU6IGNvZGUgY2xlYW51cAorCSAgVXNlIGNvbnN0YW50cyBtb3JlIG9mdGVuLiBDbGVhbnVwIGNvbW1lbnRzIGFuZCBhZGQgbW9yZSB0byBleHBsYWluIGhvdyB0aGluZ3MKKwkgIHdvcmsuCisKKzIwMTYtMDItMDggMjM6NDE6MzIgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IHJlbW92ZSBjaGVjayBmb3IgaW1wb3NzaWJsZSBjb25kaXRpb24KKwkgIENvbW1pdCBiZDI3YTFmMzBiNDQ1OGYyZWRlZTUzYzc2ZGQwN2ZiMzU5MDRiNjFkIGFkZGVkIGEgZmV3IGVycm9yIGhhbmRsaW5nCisJICBtZW1vcnkgbWFuYWdlbWVudCBjaGVja3MuIFRoZXNlIGNoZWNrIHNyY2NhcHMgdG8gc2VlIGlmIGl0IG5lZWRzIHRvIGJlCisJICB1bnJlZmVyZW5jZWQgYmVmb3JlIHJldHVybmluZywgaW4gdGhlIGNhc2Ugb2YgaW52YWxpZF9jYXBzIHRoaXMgZ290byBqdW1wCisJICBhbHdheXMgaGFwcGVucyBiZWZvcmUgc3JjY2FwcyBpcyBzZXQsIHNvIGl0IHdpbGwgYWx3YXlzIGJlIE5VTEwgaW4gdGhpcworCSAgZXJyb3IgbGFiZWwuCisJICBDSUQgIzEzNTIwMzUKKworMjAxNi0wMi0wOCAxMjo0ODo0NiArMDEwMCAgUGlvdHIgRHLEhWcgPHBpb3RyZHJhZ0BnbWFpbC5jb20+CisKKwkqIHBvL1BPVEZJTEVTLmluOgorCSAgcG86IHVwZGF0ZSBQT1RGSUxFUworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MTcwNQorCisyMDE2LTAyLTA4IDE1OjMxOjU1ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJICB2NGwyYWxsb2NhdG9yOiBGaXggc3BlbGxpbmcgb2YgcmVlbnF1ZXVlaW5nCisJICBUbyBtYXRjaCBjb21taXQgN2Q3MDc0Y2VmMDI3MmNkNTE1NTA5OGJmYzJiZGE2ODQ5ZGQ4OTI2Ny4gSSBsb3ZlIHRoZSBpZGVhCisJICBvZiBhaW1pbmcgZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25zZWN1dGl2ZSB2b3dlbHMuCisKKzIwMTYtMDItMDggMTA6MTc6NDkgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogRml4IHNwZWxsaW5nIG9mIHF1ZXVlaW5nCisJICBEaWRuJ3Qga25vdyB3aGljaCBvbmUgdG8gY2hvb3NlIGJldHdlZW4gcXVldWluZyBhbmQgcXVldWVpbmcsIHNvIEkgcGlja2VkCisJICB0aGUgb25lIHdpdGggdGhlIGJpZ2dlc3QgYW1vdW50IG9mIHZvd2VscyBpbiBhIHJvdyA7LVAgKGJvdGggYXJlCisJICBhY2NlcHRhYmxlIGFwcGFyZW50bHkpCisKKzIwMTYtMDItMDcgMTU6MDI6MzUgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogRG9uJ3QgcGFzcyB0aGUgc2FtZSBkYXRhIG92ZXIgYW5kIG92ZXIKKwkgIFdlIGFscmVhZHkgcGFzcyB0aGUgZW50aXJlIGZyYW1lIHRvIHRoZSBkZWNvZGVyLiBJZiB0aGUgZGVjb2RlciBhc2sgZm9yCisJICBtb3JlIGRhdGEsIGRvbid0IHBhc3MgdGhlIHNhbWUgZGF0YSBhZ2FpbiBhcyB0aGlzIGxlYWRzIHRvIGluZmluaXQgbG9vcC4KKwkgIEluc3RlYWQsIHNpbXBseSBmYWlsIHRoZSBmaWxsIGZ1bmN0aW9uIHRvIHNpZ25hbCB0aGUgcHJvYmxlbSB3aXRoIHRoYXQKKwkgIGZyYW1lLiBJdCB3aWxsIHRoZW4gYmUgc2tpcHBlZCBwcm9wZXJseS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjE2NzAKKworMjAxNi0wMi0wOCAwMDoxMDozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL2x6by5jOgorCSAgbWF0cm9za2E6IGdldCByaWQgb2YgX3N0ZGludC5oIGluY2x1ZGUKKworMjAxNi0wMi0wNSAyMDowMDo1NyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiBleHRlbmQgdGhlIEFNX1RFU1RTX0VOVklST05NRU5UIGZyb20gY2hlY2subWFrCisJICBUbyBnZXQgdGhlIENLX0RFRkFVTFRfVElNRU9VVCBkZWZpbmVkIGZvciBhbGwgdGVzdHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjE0NzIKKworMjAxNi0wMi0wNSAxODowNDozMSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBhdXRvZ2VuLnNoOgorCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDg2ZTQ2NjMgdG8gYjY0ZjAzZgorCisyMDE2LTAxLTMwIDE4OjQzOjMwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkgIHJ0cGpwZWdwYXk6IFNraXAgQVBQIGFuZCBKUEcgbWFya2VycyBhbmQgcHJpbnQgd2FybmluZ3MgZm9yIHVua25vd24gbWFya2VycworCSAgRm9yIEFQUC9KUEcgbWFya2VycyB0aGUgc2l6ZSBpcyBmb2xsb3dpbmcgYW5kIHdlIGhhdmUgdG8gc2tpcCB0aGF0LiBUaGlzIGlzCisJICBub3QgcmVhbGx5IGEgcHJvYmxlbSB1bmxlc3MgdGhlIG1hcmtlciBjb250YWlucyBlLmcuIGEgcHJldmlldyBKUEVHIG9yCisJICBzb21ldGhpbmcgZWxzZSB0aGF0IHdlIG1pZ2h0IGludGVycHJldGUgYXMgYW5vdGhlciBtYXJrZXIuCisKKzIwMTYtMDEtMjYgMjI6Mzc6MzAgKzA5MDAgIFNldW5naGEgWWFuZyA8c2gueWFuZ0BsZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBmcmFtZXJhdGUgY2FsY3VsYXRpb24gZm9yIGZyYWdtZW50ZWQgZm9ybWF0CisJICBxdGRlbXV4IGNhbGN1bGF0ZXMgZnJhbWVyYXRlIHVzaW5nIGR1cmF0aW9uIGFuZCB0aGUgbnVtYmVyIG9mIHNhbXBsZS4KKwkgIEluIGNhc2Ugb2YgZnJhZ21lbnRlZCBtcDQgZm9ybWF0LCBob3dldmVyLCB0aGUgbnVtYmVyIG9mIHNhbXBsZSBjYW4KKwkgIGJlIGZpZ3VyZSBvdXQgYWZ0ZXIgcGFyc2luZyBldmVyeSBtb29mIGJveC4gQmVjYXVzZSBxdGRlbXV4IGRvZXMgbm90CisJICBwYXJzZSBldmVyeSBtb29mIGluIFFUREVNVVhfU1RBVEVfSEVBREVSIHN0YXRlLCBpdCB3aWxsIGNhdXNlIGluY29ycmVjdAorCSAgZnJhbWVyYXRlIGNhbGN1bGF0aW9uLgorCSAgVGhpcyBwYXRjaCB3aWxsIHRyaWdlciBnc3RfcXRkZW11eF9jb25maWd1cmVfc3RyZWFtKCkgZm9yIGV2ZXJ5IG5ldyBtb29mLgorCSAgVGhlbiwgZnJhbWVyYXRlIHdpbGwgYmUgY2FsY3VsYXRlZCBieSB1c2luZyBkdXJhdGlvbiBhbmQgbl9zYW1wbGVzIG9mIHRoZSBtb29mLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MDc3NAorCisyMDE2LTAxLTI4IDIyOjM2OjIzICswOTAwICBTZXVuZ2hhIFlhbmcgPHNoLnlhbmdAbGdlLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBoYW5kbGluZyB6ZXJvIHNlZ21lbnQtZHVyYXRpb24gZWRpdCBsaXN0CisJICBCYXNlZCBvbiBkb2N1bWVudCBJU09fSUVDXzE0NDk2LTEyLCBlZGl0IGxpc3QgYm94IGNhbiBoYXZlCisJICBzZWdtZW50IGR1cmF0aW9uIGFzIHplcm8uIEl0IGRvZXMgbm90IGltcGx5IHRoYXQgbWVkaWFfc3RhcnQgZXF1YWxzIHRvCisJICBtZWRpYV9zdG9wLiBCdXQsIGl0IGp1c3QgaW5kaWNhdGVzIGEgc2FtcGxlIHdoaWNoIHNob3VsZCBiZSBwcmVzZW50ZWQKKwkgIGF0IHRoZSBmaXJzdC4gVGhpcyBwYXRjaCBkZXJpdmVzIHNlZ21lbnQgZHVyYXRpb24gdXNpbmcgbWVkaWFfdGltZQorCSAgYW5kIGR1cmF0aW9uIG9mIGZpbGUuIEFuZCBzZXQgZGVyaXZlZCBkdXJhdGlvbiB0byBzZWdtZW50LWR1cmF0aW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MDc4MQorCisyMDE2LTAxLTI4IDIxOjM2OjU0ICswOTAwICBTZXVuZ2hhIFlhbmcgPHNoLnlhbmdAbGdlLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IGV4cG9zZSBzdHJlYW1zIHdpdGggZmlyc3QgbW9vZiBmb3IgZnJhZ21lbnRlZCBmb3JtYXQKKwkgIEluIGNhc2Ugb2YgcHVzaCBtb2RlLCBxdGRlbXV4IGV4cG9zZSBzdHJlYW1zIGFmdGVyIGdvdCBtb292IGJveC4KKwkgIFdlIGNhbiBub3QgZ3VhcmFudGVlIHRoYXQgYSBtb292IGJveCBoYXMgc2FtcGxlIGRhdGEgc3VjaCBhcyBzYW1wbGUgZHVyYXRpb24KKwkgIGFuZCB0aGUgbnVtYmVyIG9mIHNhbXBsZSBpbiBzdGJsIGJveCBmb3IgZnJhZ21lbnRlZCBmb3JtYXQgY2FzZS4KKwkgIFNvLCBpZiBhIG1vb3YgaGFzIG5vIHNhbXBsZSBkYXRhLCBzdHJlYW1zIHdpbGwgbm90IGJlIGV4cG9zZWQgdW50aWwgZ2V0IHRoZSBmaXJzdCBtb29mLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MDc3OQorCisyMDE2LTAxLTI3IDE4OjQ4OjE3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBDaGVjayBmb3Igc3Vic2V0IGluc3RlYWQgb2Ygbm9uLWVtcHR5IGludGVyc2VjdGlvbiBmb3IgQUNDRVBUX0NBUFMKKworMjAxNi0wMS0yNyAxODo0NDoyMyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogVW5zZXQgUkVDT05GSUdVUkUgZmxhZyBvbiBzcmNwYWQgd2hlbmV2ZXIgd2UgY29uZmlndXJlIG5ldyBjYXBzCisJICBQcmV2ZW50cyBkb3VibGUtbmVnb3RpYXRpb24gZHVyaW5nIHN0YXJ0dXAgYW5kIGluIHNvbWUgb3RoZXIgY2FzZXMuCisKKzIwMTYtMDEtMjcgMTY6NDM6MjIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogQWRkIG5lZ290aWF0aW9uIHVuaXQgdGVzdHMgZm9yIGFsbCA0IG1vZGVzCisJICBUaGVzZSBub3cgY2hlY2sgdGhlIG91dHB1dCBjYXBzIGJhc2VkIG9uIHRoZSBpbnB1dCBjYXBzIGFuZCBhIGZvbGxvd2luZworCSAgY2Fwc2ZpbHRlciBhbmQgbWFrZSBzdXJlIHRoZSBjYXBzIGFyZSBleGFjdGx5IGFzIGV4cGVjdGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MDk5NQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDM4OAorCisyMDE2LTAxLTI2IDE3OjM5OjIwICswMTAwICBWaXZpYSBOaWtvbGFpZG91IDx2aXZpYUB0b29sc29uYWlyLmNvbT4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogRG8gcGFzc3Rocm91Z2ggaW4gYXV0byBtb2RlIGlmIGRvd25zdHJlYW0gb25seSBzdXBwb3J0cyBpbnRlcmxhY2VkCisJICBJZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKwkgIDEpIHVwc3RyZWFtIGFuZCBkb3duc3RyZWFtIGNhcHMgYXJlIGNvbXBhdGlibGUKKwkgIDIpIHVwc3RyZWFtIGlzIGludGVybGFjZWQKKwkgIDMpIGRvd25zdHJlYW0gZG9lc24ndCBzdXBwb3J0IHByb2dyZXNzaXZlIG1vZGUKKwkgIHRoZW4gZGVpbnRlcmxhY2Ugd2lsbCBqdXN0IGRvIHBhc3N0aHJvdWdoIGluc3RlYWQgb2YgZmFpbGluZyB0byBsaW5rLgorCSAgVGhpcyBpcyBkb25lIHdpdGggdGhlIGZvbGxvd2luZyBzY2VuYXJpbyBpbiBtaW5kOgorCSAgdmlkZW90ZXN0c3JjICEgInZpZGVvL3gtcmF3LGludGVybGFjZS1tb2RlPWludGVybGVhdmVkIiAhIGRlaW50ZXJsYWNlCisJICBuYW1lPWRlaW5fc3JjICEgdGVlIG5hbWU9dCAhIHF1ZXVlICEgZGVpbnRlcmxhY2UgbmFtZT1kZWluX2ZpbGUgISBmaWxlc2luayB0LiAhCisJICBxdWV1ZSAhIGRlaW50ZXJsYWNlIG5hbWU9ZGVpbl9kZXNrdG9wICEgYXV0b3ZpZGVvc2luaworCSAgSW4gdGhpcyBjYXNlLCBkZWluX3NyYyB3aWxsIGRvIHRoZSBkZWludGVybGFjaW5nLiBIb3dldmVyLAorCSAgdmlkZW90ZXN0c3JjICEgInZpZGVvL3gtcmF3LGludGVybGFjZS1tb2RlPWludGVybGVhdmVkIiAhIGRlaW50ZXJsYWNlCisJICBuYW1lPWRlaW5fc3JjICEgdGVlIG5hbWU9dCAhIHF1ZXVlICEgZGVpbnRlcmxhY2UgbmFtZT1kZWluX2ZpbGUgISBmaWxlc2luayB0LiAhCisJICBxdWV1ZSAhIGRlaW50ZXJsYWNlIG5hbWU9ZGVpbl9kZXNrdG9wICEgYXV0b3ZpZGVvc2luayB0LiAhIHF1ZXVlICEKKwkgICJ2aWRlby94LXJhdyxpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCIgISBmYWtlc2luaworCSAgSW4gdGhpcyBjYXNlLCBjYXBzIGF1dG8tbmVnb3RpYXRpb24gd2lsbCBtYWtlIGRlaW5fZmlsZSBhbmQgZGVpbl9kZXNrdG9wIGRvCisJICB0aGUgZGVpbnRlcmxhY2luZywgd2hpbGUgZGVpbl9zcmMgd2lsbCBiZSBwYXNzdGhyb3VnaC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjA5OTUKKworMjAxNi0wMS0yNiAxODowNTo1MSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuaDoKKwkgIGRlaW50ZXJsYWNlOiBBZGQgbW9kZT1hdXRvLXN0cmljdAorCSAgSW4gdGhpcyBtb2RlIHdlIHdpbGwgcGFzc3Rocm91Z2ggYWxsIHByb2dyZXNzaXZlIGNhcHMgYnV0IGludGVybGFjZWQgY2FwcyBtdXN0IGJlCisJICBjYXBzIHdoZXJlIHdlIGFjdHVhbGx5IHN1cHBvcnQgZGVpbnRlcmxhY2luZy4KKwkgIFRoaXMgaXMgdGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIGF1dG8gYW5kIGF1dG8tc3RyaWN0LCBhdXRvIHdvdWxkCisJICBwYXNzdGhyb3VnaCBhbGwgdW5zdXBwb3J0ZWQgaW50ZXJsYWNlZCBjYXBzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDM4OAorCisyMDE2LTAxLTI2IDE3OjUwOjMwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBJbXBsZW1lbnQgcmVjb25maWd1cmF0aW9uIGEgYml0IGJldHRlcgorCSAgQW5kIGUuZy4gY29uc2lkZXIgcmVjb25maWd1cmF0aW9uIGNhdXNlZCBieSBSRUNPTkZJR1VSRSBldmVudHMgdG9vLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDM4OAorCisyMDE2LTAxLTI2IDExOjU3OjA5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBSZXdyaXRlIGNhcHMgbmVnb3RpYXRpb24KKwkgIFByZXZpb3VzbHkgdGhlIHJlc3VsdCBvZiB0aGUgQ0FQUyBxdWVyeSBhbmQgQUNDRVBUX0NBUFMgZGVwZW5kZWQgb24gd2hhdCBraW5kCisJICBvZiBjYXBzIHdlcmUgbGFzdCBzZXQsIGFuZCBlLmcuIGlmIHdlIGxhc3QgaGFkIGludGVybGFjZWQgY2FwcyBvciBub3QuIFRoYXQncworCSAganVzdCBicm9rZW4uCisJICBBbHNvIHByZXZpb3VzbHkgdGhlIGhhbmRsaW5nIG9mIG5vbi1zeXNtZW0gY2FwcyBmZWF0dXJlcyB3YXMgcmF0aGVyIHJhbmRvbSBhbmQKKwkgIHVudXN1YWJsZS4KKwkgIE5vdyB0aGUgYmVoYXZpb3VyIGlzIHRoZSBmb2xsb3dpbmcsIGRlcGVuZGluZyBvbiB0aGUgbW9kZSBwcm9wZXJ0eToKKwkgIDEpIG1vZGU9ZGlzYWJsZWQKKwkgIENvbXBsZXRlbHkgZG8gcGFzc3Rocm91Z2ggb2YgZXZlcnl0aGluZworCSAgMikgbW9kZT1pbnRlcmxhY2VkCisJICBPbmx5IGFjY2VwdCBmb3JtYXRzIHdlIGNhbiBhY3R1YWxseSBkZWludGVybGFjZSwgYW5kIGFjY2VwdCBpbnRlcmxhY2VkCisJICBhbmQgcHJvZ3Jlc3NpdmUgY29udGVudCBhbmQgYWx3YXlzIHJ1biB0aGUgZGVpbnRlcmxhY2VyIGFuZCBvdXRwdXQKKwkgIHByb2dyZXNzaXZlIGNvbnRlbnQKKwkgIDMpIG1vZGU9YXV0byAoaS5lLiBwbGF5YmluKQorCSAgQWNjZXB0IGFsbCBwcm9ncmVzc2l2ZSBmb3JtYXRzIGFzIHBhc3N0aHJvdWdoLCBhY2NlcHQgYWxsIGZvcm1hdHMgdGhhdCB3ZQorCSAgY2FuIGRlaW50ZXJsYWNlIG91cnNlbHZlcyAod2hpY2ggd2UgZG8gdGhlbiksIGJ1dCBhbHNvIGFjY2VwdCBldmVyeXRoaW5nCisJICBlbHNlIGZvciB3aGljaCB3ZSB0aGVuIGp1c3QgcGFzc3Rocm91Z2guIEluIGF1dG8gbW9kZSwgZGVpbnRlcmxhY2luZyBpcyBiZXN0CisJICBlZmZvcnQ6IElmIHdlIGNhbiwgd2UgZGVpbnRlcmxhY2UsIGlmIHdlIGNhbid0IHdlIGp1c3Qgb3V0cHV0IGludGVybGFjZWQKKwkgIGNvbnRlbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwMzg4CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYwNTUzCisKKzIwMTYtMDEtMjYgMTE6MzQ6NDAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IFJlbW92ZSB1bnVzZWQsIG9ic29sZXRlIGJ1ZmZlcmFsbG9jIGNvZGUKKworMjAxNi0wMS0yNiAxODo1MDozOCArMDEwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHVzZSBBX0FBQyBpbnN0ZWFkIG9mIEFfQUFDL01QRUd4L3kKKwkgIFNvbWUgR29vZ2xlQ2FzdCBjb21wYXRpYmxlIGRldmljZXMgaWdub3JlIEFfQUFDL01QRUd4L3kgdHJhY2tzOyBBbHNvIGFjY29yZGluZyB0byBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1NYXRyb3NrYSBBX0FBQy9NUEVHeC95IGlzIG9ic29sZXRlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYxMTQ0CisKKzIwMTYtMDEtMjUgMTc6MjE6MjQgKzAxMDAgIFbDrWN0b3IgTWFudWVsIErDoXF1ZXogTGVhbCA8dmphcXVlekBpZ2FsaWEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2MXBheS5jOgorCSAgZ3N0OiBGaXggdW5pbnRpYWxpemVkIHZhcmlhYmxlIHdhcm5pbmdzCisJICBXaGlsZSBjcm9zcy1jb21waWxpbmcgd2l0aCBMaW5hcm8gR0NDIDUuMS0yMDE1LjA4LCBpdCBjb21wbGFpbmVkCisJICBhYm91dCBhIGNvdXBsZSB1bml0aWFsaXplZCB2YXJpYWJsZXMuCisJICBUaGlzIHBhdGNoIGluaXRpYWxpemVzIHRoZW0gdG8gemVyby4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjEwOTQKKworMjAxNi0wMS0yNSAxNTowMzoyMyArMDEwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuYzoKKwkgIHNwbGl0bXV4c3JjOiBwcmludCBwb3RlbnRpYWxseSBuZWdhdGl2ZSBvZmZzZXQgd2l0aCBhIHNpZ24KKworMjAxNi0wMS0yMSAxNzo0MTo1NSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBSZS1hZGQgY29sb3JpbWV0cnkgZmllbGQgZm9yIFJHQiBmb3JtYXRzCisJICBUaGlzIHRpbWUsIGNoZWNrIGlmIGl0J3MgYW4gUkdCIGZvcm1hdCBhbmQgc2V0cyB0aGUgdHJhbnNmb3JtYXRpb24KKwkgIG1hdHJpeCB0byBpZGVudGl0eS4gVGhlIHJlc3Qgb2YgdGhlIGNvbG9yaW1ldHJ5IGluZm9ybWF0aW9uIGlzCisJICBtZWFuaW5nZnVsbCBhbmQgc2hhbGwgYmUga2VwdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTk2MjQKKworMjAxNi0wMS0yMiAxMDowMzo1MCArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IGZpeCBzUkdCIGNvbG9yc3BhY2UgZGVmaW5pdGlvbgorCSAgVjRsMiBjYW4gYWxzbyB1c2UgdGhlIHNSR0IgY29sb3JzcGFjZSBmb3IgWVVWIGZvcm1hdHMgYW5kIHRodXMgbmVlZHMgYQorCSAgZGVmYXVsdCBtYXRyaXguCisKKzIwMTYtMDEtMjEgMTU6Mjk6NDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHRhZ2luamVjdC5jOgorCSAgdGFnaW5qZWN0OiBmaXggc2FtcGxlIHBpcGVsaW5lIGluIGRvY3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Nzk1NzEKKworMjAxNi0wMS0yMSAxMDo0OTo0NCArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IEFkZCBhZG9iZSBjb2xvcnNwYWNlIHN1cHBvcnQKKwkgIFVzZSB0aGUgbmV3IHByaW1hcmllcyBhbmQgdHJhbnNmZXIgZnVuY3Rpb24gZm9yIEFkb2JlIFJHQi4KKwkgIEV4cGxpY2l0bHkgbGlzdCB0aGUgY29sb3JpbWV0cnkgaW5zdGVhZCBvZiB1c2luZyB0aGUgZGVmYXVsdCBHU3RyZWFtZXIKKwkgIG9uZXMuIFRoZSBkZWZhdWx0cyBmb3IgQlQyMDIwLCBmb3IgZXhhbXBsZSwgZG8gbm90IG1hdGNoLgorCSAgRXhwbGljaXRseSBzZXQgdGhlIG1hdHJpeCBvZiBTUkdCIHRvIFJHQi4KKworMjAxNi0wMS0yMCAxMzo0MTozMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDhlbmMuYzoKKwkgIHZwOGVuYzogRW5zdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgdmFsaWQgZnJhbWUgdXNlciBkYXRhIGJlZm9yZSB1c2luZyBpdAorCSAgT3RoZXJ3aXNlIHdlJ3JlIGdvaW5nIHRvIGRlcmVmZXJlbmNlIE5VTEwgcG9pbnRlcnMuCisKKzIwMTYtMDEtMjAgMTA6MDI6NDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC92cHgvZ3N0dnB4ZGVjLmM6CisJICB2cHhkZWM6IFVucmVmIGZyYW1lIGluIGFsbCBjb2RlIHBhdGhzIG9mIGhhbmRsZV9mcmFtZSgpCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYwNjY2CisKKzIwMTYtMDEtMTkgMjI6NDk6MjAgKzAxMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRzYXVuaWVyQGdub21lLm9yZz4KKworCSogZXh0L3ZweC9nc3R2cHhlbmMuYzoKKwkgIHZweGVuYzogVW5yZWYgZnJhbWUgb24gRVJST1IKKwkgIEFsbCBjb2RlIHBhdGhzIGZvciBoYW5kbGVfZnJhbWUoKSBtdXN0IHNvbWVob3cgdGFrZSBvd25lcnNoaXAgb2YgdGhlIGZyYW1lLCBiZQorCSAgaXQgYnkgYWN0dWFsbHkgdW5yZWZmaW5nLCBmb3J3YXJkaW5nIHRoZSBmcmFtZSBlbHNld2hlcmUgb3Igc3RvcmluZyBpdCBmb3IKKwkgIGxhdGVyLgorCSAgaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYwNjY2CisKKzIwMTYtMDEtMjAgMTg6MjA6NDMgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyZGV2aWNlcHJvdmlkZXIuYzoKKwkgIHY0bDI6IERvbid0IGZyZWUgcHJvcHMgc3RydWN0dXJlIHR3aWNlLgorCSAgZ3N0X3Y0bDJfZGV2aWNlX3Byb3ZpZGVyX3Byb2JlX2RldmljZSgpIGZyZWVzIHRoZSBwYXNzZWQgcHJvcHMKKwkgIHN0cnVjdHVyZSwgZG9uJ3QgZnJlZSBpdCBhZ2FpbiBpbiB0aGUgY2FsbGVyLgorCisyMDE2LTAxLTE5IDE1OjE1OjM1IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IENsZWFudXAgdW5lZWRlZCByZXR1cm4gc3RhdGVtZW50CisKKzIwMTYtMDEtMTkgMTU6MTQ6NTkgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRG9uJ3Qgc2V0IGNvbG9yaW1ldHJ5IGZvciBub24gWVVWIGZvcm1hdHMKKwkgIFNldHRpbmcgY29sb3JtZXRyeSBpbiBjYXBzIGZvciBSR0IgaGF2ZSBubyBtZWFuaW5nLCBidXQgd29yc3QgaXQKKwkgIGNvbmZ1c2VzIHRoZSBjb252ZXJ0ZXJzIGRvd25zdHJlYW0uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU5NjI0CisKKzIwMTYtMDEtMTkgMTM6MDE6MTcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwY2hhbm5lbHMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2hhbm5lbHMuaDoKKwkgIHJ0cDogZml4IGNvbXBpbGVyIHdhcm5pbmdzIHdpdGggZ2NjLTYKKwkgIEluIGZpbGUgaW5jbHVkZWQgZnJvbSBnc3RydHBMMTZkZXBheS5oOjI3OjAsCisJICBmcm9tIGdzdHJ0cC5jOjczOgorCSAgZ3N0cnRwY2hhbm5lbHMuaDoxNTQ6MzM6IGVycm9yOiAnY2hhbm5lbF9vcmRlcnMnIGRlZmluZWQgYnV0IG5vdCB1c2VkIFstV2Vycm9yPXVudXNlZC1jb25zdC12YXJpYWJsZV0KKwkgIHN0YXRpYyBjb25zdCBHc3RSVFBDaGFubmVsT3JkZXIgY2hhbm5lbF9vcmRlcnNbXSA9CisKKzIwMTYtMDEtMTkgMTQ6NTc6MDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IERvbid0IHBsYXkgYW55dGhpbmcgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgZGF0YSBjaHVuayBldmVuIHdoZW4gc2Vla2luZworCSAgRXNwZWNpYWxseSBpbiBwdXNoIG1vZGUgd2Ugd291bGQgY29tcGxldGVseSBpZ25vcmUgdGhlIHNpemUgb2YgdGhlIGRhdGEgY2h1bmsKKwkgIHdoZW4gbm90IHN0b3AgcG9zaXRpb24gaXMgZ2l2ZW4gZm9yIHRoZSBzZWVrLiBJbnN0ZWFkIG1ha2Ugc3VyZSB0aGF0IHRoZSBlbmQKKwkgIG9mZnNldCBpcyBhdCBtb3N0IHRoZSBlbmQgb2YgdGhlIGRhdGEgY2h1bmsgaWYga25vd24uCisJICBXaXRob3V0IHRoaXMgd2Ugd291bGQgb3V0cHV0IGFueXRoaW5nIGFmdGVyIHRoZSBkYXRhIGNodW5rLCBwb3NzaWJseSBjYXVzaW5nCisJICBsb3VkIG5vaXNlcyBpZiB0aGUgbWVkaWEgZmlsZSBpcyBmb2xsb3dlZCBieSBhbiBJTkZPIGNodW5rIG9yIGFuIElEMyB0YWcuCisKKzIwMTYtMDEtMTkgMTQ6NTU6NTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IERvbid0IGRvIGNhbGN1bGF0aW9ucyB3aXRoIC0xIG9mZnNldHMgd2hlbiBoYW5kbGluZyBTRUdNRU5UIGV2ZW50cworCSAgV2UgdXNlIHRoYXQgdG8gc2lnbmFsICJpbmZpbml0eSIsIHRha2luZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoYXQgYW5kIHNvbWUKKwkgIG90aGVyIHZhbHVlIGlzIG5vdCBnb2luZyB0byBnaXZlIHVzIGFueSB1c2VmdWwgcmVzdWx0IGZvciB0aGUgZW5kIG9mZnNldHMgb2YKKwkgIHNlZ21lbnRzLgorCisyMDE2LTAxLTE4IDExOjMwOjQ1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBSZXZlcnQgIldJUDogcnRwaml0dGVyYnVmZmVyOiBBZGQgUkZDNzI3MyBtZWRpYSBjbG9jayBoYW5kbGluZyIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgMjcxNTAxZjY1NzZkZTRkMTQxZTdjMmY2MThlMjhiOWUzYjFlNWIzOC4KKwkgIEl0IHdhc24ndCBtZWFudCB0byBiZSBwdXNoZWQgeWV0IGFzIHRoZSBjb21taXQgbWVzc2FnZSBpbmRpY2F0ZXMuCisKKzIwMTYtMDEtMTIgMTQ6MDE6MjEgLTA4MDAgIEFsZWl4IENvbmNoaWxsbyBGbGFxdcOpIDxhY29uY2hpbGxvQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogaGFuZGxlIHJ0Y3Avc3J0Y3AgY2FwcyBwcm9wZXJseSB3aGVuIHVzaW5nIGludGVybGVhdmVkIGRhdGEKKwkgIFdlIGNoZWNrIHRoZSBzdHJlYW0gcHJvZmlsZSBhbmQgdXNlIHRoZSBwcm9wZXIgUlRDUCBjYXBzOgorCSAgYXBwbGljYXRpb24veC1zcnRjcCBpZiB3ZSBhcmUgdXNpbmcgYSBzZWN1cmUgcHJvZmlsZSBhbmQKKwkgIGFwcGxpY2F0aW9uL3gtcnRjcCBvdGhlcndpc2UuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYwNTU2CisKKzIwMTYtMDEtMDUgMTY6MTU6MTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaDoKKwkgIFdJUDogcnRwaml0dGVyYnVmZmVyOiBBZGQgUkZDNzI3MyBtZWRpYSBjbG9jayBoYW5kbGluZworCisyMDE2LTAxLTE1IDExOjM2OjM1ICswMDAwICBUaGliYXVsdCBTYXVuaWVyIDx0c2F1bmllckBnbm9tZS5vcmc+CisKKwkqIGV4dC92cHgvZ3N0dnB4ZW5jLmM6CisJICB2cDhlbmM6IFJldHVybiBGTE9XX0VSUk9SIHdoZW4gYW4gZXJyb3IgYWNjdXJlcworCSAgRkFMU0Ugd291bGQgbWVhbiBGTE9XX09LCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYwNjY2CisKKzIwMTYtMDEtMTUgMDM6NTc6NDUgKzA1MzAgIE5pcmJoZWVrIENoYXVoYW4gPG5pcmJoZWVrQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2hhbC5jOgorCSAgb3N4YXVkaW86IGJyZWFrIGFzIHNvb24gYXMgdGhlIGRldmljZSBpcyBmb3VuZAorCSAgTm8gbmVlZCB0byBsb29wIGZ1cnRoZXIgaWYgdGhlcmUncyBubyBzaWRlLWVmZmVjdHMgZm9yIGl0CisKKzIwMTYtMDEtMTUgMDM6NTY6NDkgKzA1MzAgIE5pcmJoZWVrIENoYXVoYW4gPG5pcmJoZWVrQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2hhbC5jOgorCSAgb3N4YXVkaW86IEZpeCBlcnJvciBoYW5kbGluZyB3aGVuIHNlbGVjdGluZy9vcGVuaW5nIGRldmljZXMKKwkgIFBvc3QgYW4gZWxlbWVudCBlcnJvciB3aGVuIHRoZSBDb3JlQXVkaW8gZGV2aWNlIGNhbm5vdCBiZSBzZWxlY3RlZCBvciBvcGVuZWQuCisJICBBbHNvIGVuc3VyZSB0aGF0IHdlIHBvc3QgYSBHU1RfRVJST1Igd2l0aCBtb3JlIGRldGFpbC4KKworMjAxNi0wMS0xMyAyMzo0MDoyMCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogV2hlbiBmbHVzaGluZyBvbiBFT1MsIGRvbid0IHByb2Nlc3MgbW9yZSBkYXRhIHRoYW4gdGhlICJkYXRhIiBzaXplCisJICBFdmVuIGlmIHdlIGhhdmUgbW9yZSBkYXRhIHF1ZXVlZCB1cCB3aGVuIGZsdXNoaW5nIHRoYW4gdGhlIHNpemUgb2YgdGhlIGRhdGEKKwkgIGNodW5rLCBkb24ndCBwcm9jZXNzIGFuZCBvdXRwdXQgaXQuIElmIHRoZSBkYXRhIHNpemUgaXMga25vd24sIHRoaXMgbGlrZWx5CisJICBjb250YWlucyBhbm90aGVyIGNodW5rIChlLmcuIGFuIElORk8gY2h1bmspIG9yIHRoaW5ncyBsaWtlIElEMyB0YWdzLiBKdXN0CisJICBvdXRwdXR0aW5nIHRoZW0gYXMgaWYgdGhleSB3ZXJlIGRhdGEgaXMgZ29pbmcgdG8gY2F1c2UgdW5leHBlY3RlZCBiZWhhdmlvdXIKKwkgIGFuZCB1bnBsZWFzYW50IGF1ZGlvIG5vaXNlcy4KKworMjAxNC0wOC0yOSAxNTo0MDoyMyArMDIwMCAgQW50b25pbyBPc3BpdGUgPGFvMkBhbzIuaXQ+CisKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZlbmMuYzoKKwkgIHRlc3RzOiBmaXggYSB0aGlua28gaW4gdGhlIHdhdmVuYyBleGFtcGxlCisJICBUaGUgY29kZSBpcyBzdXBwb3NlZCB0byBmb2xsb3cgc29tZWhvdyB3aGF0IHRoZSBjb21tZW50IGFib3ZlIHNheXMsIHRoYXQKKwkgIGlzIHRvIGhhdmUgb25lIGNoYW5uZWwgd2l0aCBhIHdhdmUgb2YgZnJlcSA0NDAgYW5kIHRoZSBvdGhlciBjaGFubmVsCisJICB3aXRoIGEgd2F2ZSBvZiBmcmVxIDg4MCwgYnV0IGFuIG9mZiBieSBvbmUgZXJyb3IgcmVzdWx0cyBpbiBmcmVxdWVuY2llcworCSAgb2YgMCBhbmQgNDQwLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNTY3MworCisyMDE0LTA4LTI5IDE1OjA3OjU4ICswMjAwICBBbnRvbmlvIE9zcGl0ZSA8YW8yQGFvMi5pdD4KKworCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSAgaW50ZXJsZWF2ZTogRml4IHRoZSBleGFtcGxlIGJ5IHNldHRpbmcgY2hhbm5lbC1tYXNrcyBpbiB0aGUgc2luayBwYWRzCisJICBUaGUgY3VycmVudCBleGFtcGxlIGRvZXMgbm90IHdvcmssIGl0IGZhaWxzIHdpdGg6CisJICBFUlJPUjogZnJvbSBlbGVtZW50IC9Hc3RQaXBlbGluZTpwaXBlbGluZTAvR3N0RGVjb2RlQmluOmRlY29kZWJpbjAvR3N0V2F2UGFyc2U6d2F2cGFyc2UwOiBJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuCisJICBnc3R3YXZwYXJzZS5jKDIxNzgpOiBnc3Rfd2F2cGFyc2VfbG9vcCAoKTogL0dzdFBpcGVsaW5lOnBpcGVsaW5lMC9Hc3REZWNvZGVCaW46ZGVjb2RlYmluMC9Hc3RXYXZQYXJzZTp3YXZwYXJzZTA6CisJICBzdHJlYW1pbmcgdGFzayBwYXVzZWQsIHJlYXNvbiBub3QtbmVnb3RpYXRlZCAoLTQpCisJICBUaGlzIGlzIGJlY2F1c2UgbmVnb3RpYXRpb24gd2l0aCB3YXZlbmMgZ2V0cyBtZXNzZWQgdXAgYnkgdGhlIG1pc3NpbmcKKwkgIGNoYW5uZWwgcG9zaXRpb25zIGNvbmZpZ3VyYXRpb24uCisJICBUaGUgcHJvcGVyIHdheSB0byBkZWZpbmUgdGhlIGNoYW5uZWwgbGF5b3V0IHdoZW4gdXNpbmcgdGhlIGludGVybGVhdmUKKwkgIGVsZW1lbnQgaW4gY29kZSB3b3VsZCBiZSB0byBzZXQgdGhlIGNoYW5uZWwtcG9zaXRpb25zIHByb3BlcnR5LCBidXQKKwkgIGdzdC1sYXVuY2gtMS4wIGRvZXMgbm90IGtub3cgaG93IHRvIGRlYWwgd2l0aCBhcnJheXM7IHNvIHRoZSBleGFtcGxlCisJICBwaXBlbGluZSB3b3JrcyBhcm91bmQgdGhlIGlzc3VlIGJ5IHNldHRpbmcgdGhlIGNoYW5uZWwtbWFza3MgaW4gdGhlIHNpbmsKKwkgIHBhZHMuCisJICBBbHNvIGZpeCBhIHJlcGV0aXRpb24gaW4gdGhlIGRlaW50ZXJsZWF2ZSBleGFtcGxlIGRlc2NyaXB0aW9uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1NjczCisKKzIwMTYtMDEtMTEgMTY6Mjk6NTUgKzAwMDAgIFRpbSBTaGVyaWRhbiA8dGltLnNoZXJpZGFuQGltZ3RlYy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0c2JjcGFyc2UuYzoKKwkgIHNiY3BhcnNlOiBGaXggZnJhbWUgbGVuZ3RoIGNhbGN1bGF0aW9uCisJICBTQkMgZnJhbWUgbGVuZ3RoIGNhbGN1bGF0aW9uIHdhc24ndCBiZWluZyByb3VuZGVkIHVwIHRvIHRoZSBuZWFyZXN0IGJ5dGUKKwkgIChhcyBzcGVjaWZpZWQgaW4gdGhlIEEyRFAgMS4wIHNwZWNpZmljYXRpb24sIHNlY3Rpb24gMTIuOSkuIFRoaXMgY291bGQKKwkgIGNhdXNlICdzdGVyZW8nIGFuZCAnam9pbnQgc3RlcmVvJyBtb2RlIFNCQyBzdHJlYW1zIHRvIGhhdmUgaW5jb3JyZWN0bHkKKwkgIGNhbGN1bGF0ZWQgZnJhbWUgbGVuZ3Rocy4KKwkgIEluY29ycmVjdCBmcmFtZSBsZW5ndGggY2FsY3VsYXRpb24gY2F1c2VzIGZyYW1lIGNvYWxlc2NpbmcgdG8gZmFpbCwgYXMKKwkgIHN1YnNlcXVlbnQgZnJhbWVzIGluIHRoZSBzdHJlYW0gYXJlbid0IGZvdW5kIGluIHRoZSBleHBlY3RlZCBsb2NhdGlvbnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQyNDQ2CisKKzIwMTYtMDEtMTAgMjI6NTQ6MTIgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogZGVtb3RlIHdhcm5pbmcgb24gd3JvbmcgcmVzZXJ2ZWQgdmFsdWUgdG8gZml4bWUKKwkgIFdlIGFyZSBsaWtlbHkganVzdCBwYXJzaW5nIGEgYmFja3dhcmQtY29tcGF0aWJsZSBzdHJlYW0gd2UKKwkgIGRvbid0IGZ1bGx5IHN1cHBvcnQuCisKKzIwMTYtMDEtMDggMTY6Mjc6MDUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogc2ltcGxpZnkgY2FwcyBzZWxlY3Rpb24KKwkgIFRoZSBkb3duc3RyZWFtIGNhcHMgcXVlcnkgd2l0aCBhIGZpbHRlciBhbHJhZWR5IGdpdmVzIHVzIHRoZSBwb3NzaWJsZQorCSAgaW50ZXJzZWN0aW9uIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgaXQgYWdhaW4gd2l0aCBkb3duc3RyZWFtCisJICBpZiBpdCBpcyBzdXBwb3J0ZWQuIEp1c3QgdHJ5IHRvIHNldCBpdCBkaXJlY3RseS4KKworMjAxNi0wMS0wNyAyMDo0Mjo0MSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIHJ0cGgyNjRkZXBheTogZml4IHVubmVjZXNzYXJ5IHN1Yi1idWZmZXIgY3JlYXRpb24KKwkgIFdlIGNyZWF0ZSBhIHN1Yi1idWZmZXIganVzdCB0byBjb3B5IG92ZXIgaXRzIG1ldGFzIGFuZCB0aGVuCisJICB0aHJvdyBpdCBhd2F5IGltbWVkaWF0ZWx5LCBqdXN0IHVzZSB0aGUgb3JpZ2luYWwgaW5wdXQgYnVmZmVyCisJICBkaXJlY3RseS4KKworMjAxNi0wMS0wNyAyMDozODoyNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBkdmRlcGF5LmM6CisJICBydHBkdmRlcGF5OiBmaXggdW5uZWNlc3Nhcnkgc3ViLWJ1ZmZlciBjcmVhdGlvbgorCSAgV2UgY3JlYXRlIGEgc3ViLWJ1ZmZlciBqdXN0IHRvIGNvcHkgb3ZlciBpdHMgbWV0YXMgYW5kIHRoZW4KKwkgIHRocm93IGl0IGF3YXkgaW1tZWRpYXRlbHksIGp1c3QgdXNlIHRoZSBvcmlnaW5hbCBpbnB1dCBidWZmZXIKKwkgIGRpcmVjdGx5LgorCisyMDE2LTAxLTA3IDIwOjM0OjA1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJICBydHBhbXJkZXBheTogZml4IHVubmVjZXNzYXJ5IHN1Yi1idWZmZXIgY3JlYXRpb24KKwkgIFdlIGNyZWF0ZSBhIHN1Yi1idWZmZXIganVzdCB0byBjb3B5IG92ZXIgaXRzIG1ldGFzIGFuZCB0aGVuCisJICB0aHJvdyBpdCBhd2F5IGltbWVkaWF0ZWx5LCBqdXN0IHVzZSB0aGUgb3JpZ2luYWwgaW5wdXQgYnVmZmVyCisJICBkaXJlY3RseS4KKworMjAxNi0wMS0wNyAyMDoyNzoyOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkgIHJ0cHZyYXdkZXBheTogZml4IG1ham9yIG1lbW9yeSBsZWFrIGFuZCBwZXJmb3JtYW5jZSBpc3N1ZQorCSAgV2UgY2FsbCBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCgpIHdoaWNoIGNyZWF0ZXMgYSBzdWItYnVmZmVyCisJICBvZiBlYWNoIGlucHV0IGJ1ZmZlciwganVzdCB0byBjb3B5IG92ZXIgbWV0YXMsIGFuZCB0aGVuIGxlYWsgaXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYwMjg5CisKKzIwMTYtMDEtMDggMTU6MzI6NDcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzoKKwkgIHJnYW5hbHlzaXM6IEZpeCBjb21waWxlciB3YXJuaW5ncyBpbiB0aGUgdW5pdCB0ZXN0CisJICBlbGVtZW50cy9yZ2FuYWx5c2lzLmM6OTE5OjY2OiBlcnJvcjogc2hpZnRpbmcgYSBuZWdhdGl2ZSBzaWduZWQgdmFsdWUgaXMgdW5kZWZpbmVkCisJICBbLVdlcnJvciwtV3NoaWZ0LW5lZ2F0aXZlLXZhbHVlXQorCSAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2ludDE2X3N0ZXJlbyAoODAwMCwgMTYsIDUxMiwgLTEgPDwgMTQsIDApKTsKKwkgIH5+IF4KKwkgIGVsZW1lbnRzL3JnYW5hbHlzaXMuYzo5Mjk6Njk6IGVycm9yOiBzaGlmdGluZyBhIG5lZ2F0aXZlIHNpZ25lZCB2YWx1ZSBpcyB1bmRlZmluZWQKKwkgIFstV2Vycm9yLC1Xc2hpZnQtbmVnYXRpdmUtdmFsdWVdCisJICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfaW50MTZfc3RlcmVvICg4MDAwLCAxNiwgNTEyLCAwLCAtMSA8PCAxNCkpOworCSAgfn4gXgorCSAgZWxlbWVudHMvcmdhbmFseXNpcy5jOjkzOTo2NDogZXJyb3I6IHNoaWZ0aW5nIGEgbmVnYXRpdmUgc2lnbmVkIHZhbHVlIGlzIHVuZGVmaW5lZAorCSAgWy1XZXJyb3IsLVdzaGlmdC1uZWdhdGl2ZS12YWx1ZV0KKwkgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9pbnQxNl9tb25vICg4MDAwLCAxNiwgNTEyLCAtMSA8PCAxNCkpOworCSAgfn4gXgorCisyMDE2LTAxLTA1IDE4OjEzOjA2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBkb24ndCBtYXAgYnVmZmVyIG11bHRpcGxlIHRpbWVzIHdoZW4gcGFyc2luZworCisyMDE2LTAxLTA3IDE4OjIwOjMwICswMjAwICBTdGV2ZW4gSG92aW5nIDxzaEBiaWdicm90aGVyLm5sPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thOiBTdG9yZSBzdWJ0aXRsZSBzdHJlYW0gY291bnQgaW4gdGhlIGNvcnJlY3QgdmFyaWFibGUKKwkgIEFuZCBkb24ndCBvdmVycmlkZSB0aGUgdmlkZW8gc3RyZWFtIGNvdW50IGluc3RlYWQuCisKKzIwMTYtMDEtMDUgMTg6NTk6MDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVybmJhbmRzLmM6CisJICBlcXVhbGl6ZXI6IFRoZSBjaGlsZC1wcm94eSBBUEkgaXMgR09iamVjdCBiYXNlZCBpbiAxLngKKwkgIE5vdCBHc3RPYmplY3QgYW55bW9yZS4KKworMjAxNS0wNS0yMSAxNzo0MToxMiArMDIwMCAgUGFibG8gQW50b24gPHBhYmxvLmFudG9uQHZvZGFseXMtbGFicy5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDItKjogQ29uZmlndXJpbmcgb3V0cHV0IHBvb2wgY29ycmVjdGx5IGZvciB1c2luZyBkcml2ZXJzIG1pbl9idWZmZXIgaWYgcHJlc2VudC4KKwkgIFNpZ25lZC1vZmYtYnk6IFBhYmxvIEFudG9uIDxwYWJsby5hbnRvbkB2b2RhbHlzLWxhYnMuY29tPgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NTczNgorCisyMDE1LTEyLTMxIDE1OjQ2OjMxIC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGFkZCBkZWJ1ZyBtc2cgb24gQ1JDIG1pc21hdGNoIHdoaWxlIHZhbGlkYXRpbmcgZnJhbWUgaGVhZGVyCisKKzIwMTUtMTItMzEgMTY6MDA6NDkgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogZHJvcCB1bm5lZWRlZCBicmFjZXMgYXQgX3BhcnNlX2ZyYW1lKCkgZXhpdAorCSAgQWRkaXRpb25hbGx5LCBkcm9wIHJlZHVuZGFudCBjb21tZW50ICYgbGluZSBicmVhaworCisyMDE1LTEyLTMxIDE1OjU1OjE4IC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IG1pbm9yIGdyYW1tYXIgY29ycmVjdGlvbgorCisyMDE1LTEyLTMxIDE1OjM0OjU3IC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IHVwZGF0ZSBVUkxzIG9uIHBvaW50ZXJzIHRvIG9ubGluZSBzcGVjCisKKzIwMTUtMTItMzEgMTQ6NDA6MTUgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogbWFrZSBidWZmZXIgRFRTIHNldHRpbmcgZXhwbGljaXRseSB1bmNvbmRpdGlvbmFsCisJICBXZSBhcmUgc2V0dGluZyBpdCB0byBQVFMgcmVnYXJkbGVzcyBvZiBibG9ja19zdHJhdGVneQorCisyMDE1LTEyLTMxIDE0OjIxOjQwIC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGFkZCBhY3R1YWwgaW52YWxpZCBibG9jayB0eXBlIHRvIHdhcm5pbmcKKwkgIEZvciBzb21lb25lIHRoYXQgcmVhZCB0aGUgc3BlYyBpcyBjbGVhciB0aGUgb25seSAqaW52YWxpZCoKKwkgIGRhdGEgYmxvY2sgdHlwZSBpcyAxMjcuIEZvciB0aGUgcmVzdCwgaXRzIHVzZWZ1bCBpbmZvcm1hdGlvbi4KKwkgIEFkZGl0aW9uYWxseS4gdmFsdWVzIDctMTI2IGFyZSBjdXJyZW50bHkgcmVzZXJ2ZWQgYnkgdGhlCisJICBzcGVjIHNvIHRoZSBzaXR1YXRpb24gbWlnaHQgY2hhbmdlIGluIHRoZSBmdXR1cmUuCisKKzIwMTUtMTItMzEgMTQ6MTI6MzYgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogdXNlIHNoaWZ0IGluc3RlYWQgb2YgbWFzayAmIGNvbXAKKwkgIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgb24gdGhlIGZpcnN0IGJpdCBvZiB0aGUgZmlyc3QKKwkgIGJ5dGUgb2YgdGhlIG1ldGFkYXRhIGJsb2NrIGhlYWRlciB0byBmaWd1cmUgb3V0IHdoZXRoZXIKKwkgIGlzIG1hcmtlZCBhcyB0aGUgbGFzdCBvbmUuIFRoZSBzaGlmdCBtYWtlcyBpdCBxdWl0ZQorCSAgY2xlYXJlci4KKworMjAxNS0xMi0zMSAxMjo1MjoxMyAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiB3YXJuIG9uIHdpc2hmdWwgcGFyc2luZyBvZiB3ZWlyZCBoZWFkZXJzCisJICBJZiB3ZSBnZXQgYW55dGhpbmcgZnJvbSA3IHRvIDEyNiBhcyB0eXBlIHdoZW4gcGFyc2luZworCSAgYSBtZXRhZGF0YSBibG9jayBoZWFkZXIsIHdlIGFyZSBsaWtlbHkgZGVhbGluZyB3aXRoIGEKKwkgIEZMQUMgc3RyZWFtIHZlcnNpb24gd2UgZG9uJ3QgZnVsbHkgdW5kZXJzdGFuZC4gSXNzdWUKKwkgIGEgd2FybmluZyBpZiBzby4KKwkgIERvY3VtZW50IGZ1bmN0aW9uIGFzc3VtcHRpb25zIHJlZ2FyZGluZyB0aGUgcGFzc2VkLW9uCisJICB0eXBlIHdoaWxlIGF0IHRoaXMuCisKKzIwMTUtMTItMzEgMTE6MzM6NDUgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogc2hvdyBtZWFuaW5nZnVsIGluZm8gb24gZnJhbWUgQ1JDIGNoZWNrCisJICBBcyBDUkNzIGFyZSBjYWxjdWxhdGVkIGZvciB0aGUgY29tcGFyaXRpb24gYWxyZWFkeSwgd2UKKwkgIG1pZ2h0IGFzIHdlbGwgKGNoZWFwbHkpIGluZm9ybSB0aGUgdXNlciBob3cgdGhlIG51bWJlcnMKKwkgIGRpZmZlciBpZiBhIG1pc3NtYXRjaGVkIHBhaXIgaXMgZm91bmQuCisJICBXaGlsZSBhdCBpdDoKKwkgIFJlcGhyYXNlIGNhbmRpZGF0ZS1mcmFtZSBtZXNzYWdlIHRvIG1ha2UgbW9yZSBzZW5zZQorCisyMDE1LTEyLTMxIDAyOjQwOjQzIC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGRyb3AgcmVtYWluaW5nIHRyYWlsaW5nIHdoaXRlc3BhY2UKKworMjAxNS0xMi0zMSAwMjoxNTowNiAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBkcm9wIHN1cGVyZmxvdXMgZWxzZSBjbGF1c2VzCisKKzIwMTUtMTItMzEgMDE6MDk6NTEgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogZmFjdG9yIG91dCBidWZmZXIgdGltZSBhbmQgb2Zmc2V0IHJlc2V0dGluZworCSAgQXZvaWRzIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mIHRoZSBzYW1lIHJlc2V0dGluZyBwYXR0ZXJuCisKKzIwMTUtMTItMzEgMDA6NTQ6NDggLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogbW92ZSBibG9jayBoYW5kbGluZyBieSB0eXBlIG91dCBvZiBfcGFyc2VfZnJhbWUoKQorCisyMDE1LTEwLTA3IDE4OjUxOjI1ICswOTAwICBIeXVuanVuIEtvIDx6em9vbi5rb0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcmVwbGFjZSBkdXBsaWNhdGVkIGNvZGVzIHRvIGNhbGwgbmV3IGJhc2Ugc2RwIGFwaXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDU4ODAKKworMjAxNS0xMi0zMCAxMjoxNjo1NiAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBkcm9wIHJlZHVuZGFudCByZXR1cm4gc3RhdGVtZW50IG9uIF9oZWFkZXJfaXNfdmFsaWQoKQorCSAgRml4IHRoZSByYXRoZXIgdmFndWUgZXJyb3IgbWVzc2FnZSB3aGlsZSBhdCBpdC4KKworMjAxNS0xMi0zMCAwMTo1NjoyNiAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiByZXdvcmsgZ3N0X2ZsYWNfcGFyc2VfZnJhbWVfaXNfdmFsaWQoKQorCSAgZHJvcCB1bm5lY2Vzc2FyeSBuZXN0aW5nIGxvb2tpbmcgZm9yIGVuZCBvZiBmcmFtZQorCisyMDE1LTEyLTMwIDAwOjM3OjA0IC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGZhY3RvciBvdXQgY29udGV4dCBjbGVhcmluZyByb3V0aW5lCisKKzIwMTUtMTItMjkgMTg6MDU6NTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogR3VhcmQgYWdhaW5zdCBubyBjb2RlYyBkYXRhIGluIHByb3JlcyBjYXBzIGNyZWF0aW9uCisJICBDSUQgMTM0NjUzMgorCisyMDE1LTEyLTI5IDE3OjU4OjM4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdnB4L2dzdHZweGRlYy5jOgorCSAgdnB4ZGVjOiBJbml0aWFsaXplIGJ1ZmZlciB2YXJpYWJsZSB0byBOVUxMCisJICBGYWxzZSBwb3NpdGl2ZSBidXQgdHJpdmlhbCB0byBmaXggYW5kIHBvc3NpYmx5IGNhdXNpbmcgY29tcGlsZXIgd2FybmluZ3MgYXQKKwkgIHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0b28uCisJICBDSUQgMTM0NjUzNQorCisyMDE1LTA3LTI3IDE1OjUzOjI2ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmRldmljZXByb3ZpZGVyLmM6CisJICB2NGwyZGV2aWNlcHJvdmlkZXI6IGFkZCBwcm9wZXJ0aWVzIHRvIHRoZSBkZXZpY2UKKwkgIEFkZCBwcm9wZXJ0aWVzIHRvIHRoZSBkZXZpY2Ugd2l0aCBleGFjdGx5IHRoZSBzYW1lIGtleXMgYW5kIHNlbWF0aWNzCisJICBhcyB3aGF0IHB1bHNlYXVkaW8gdXNlcyBhcyBwcm9wZXJ0eSBrZXlzLgorCSAgQWxzbyBoYW5kbGUgdGhlIGNhc2Ugd2hlbiBhIGRldmljZSBpcyBwcm9iZWQgbWFudWFsbHkgYW5kIG5vdCB0aHJvdWdoIGd1ZGV2LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvL3Nob3dfYnVnLmNnaT9pZD03NTk3ODAKKworMjAxNS0xMi0yNSAxMTo0MToxOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jOgorCSAgc2NhbGV0ZW1wbzogRnJlZSB0aGUgdmFyaW91cyBidWZmZXJzIGluIEdzdEJhc2VUcmFuc2Zvcm06OnN0b3AoKQorCSAgUHJldmlvdXNseSB3ZSBsZWFrZWQgdGhlbSBjb21wbGV0ZWx5LCBidXQgYXMgdGhleSdyZSBzcGVjaWZpYyB0byB0aGUgY2FwcworCSAgZnJlZWluZyB0aGVtIGluIHN0b3AoKSBpbnN0ZWFkIG9mIGZpbmFsaXplKCkgbWFrZXMgbW9zdCBzZW5zZS4KKworMjAxNS0xMi0yNCAxNToyODowNiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjcuMSA9PT0KKworMjAxNS0xMi0yNCAxNDoxNjoyMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdnB4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDEuNy4xCisKKzIwMTUtMTItMjQgMTM6MTk6MjQgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2hyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisKKzIwMTUtMTItMjQgMTI6MjI6MzIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL2NzLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSAgcG86IFVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAxNS0xMi0yMSAwOTo1NzozMyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5oOgorCSAgcXRkZW11eDogZHJvcCBmbHVzaGVzIGZyb20gb3VyIG93biBvZmZzZXQgc2VlaworCSAgUHJldmVudHMgZG93bnN0cmVhbSBmcm9tIHJlY2VpdmluZyBmbHVzaGVzIGZvciBhIHNlZWsgb25seSBpbgorCSAgdXBzdHJlYW0uIFRob3NlIHNlZWtzIGFyZSBvbmx5IHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgcmlnaHQKKwkgIG9mZnNldCB3aGVuIHNraXBwaW5nIG9yIHJldHVybmluZyB0byBxdCBhdG9tcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTg5MjgKKworMjAxNS0xMS0xMSAxNjo1MzoxOSArMDEwMCAgVGhpYmF1bHQgU2F1bmllciA8dHNhdW5pZXJAZ25vbWUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IEFsd2F5cyBzZXQgdGhlIGNoYW5uZWwgbWFzayBmb3IgUENNIHN0cmVhbXMKKwkgIEp1c3QgdXNlIHRoZSBnc3RfYXVkaW9fY2hhbm5lbF9nZXRfZmFsbGJhY2tfbWFzayBmdW5jdGlvbiBmb3Igbm93IGFzCisJICB0aGUgc3BlY2lmaWNhdGlvbiBpcyB0b28gY29tcGxpY2F0ZWQgYW5kIG5vYm9keSBpbXBsZW1lbnRzIGl0LgorCisyMDE1LTEyLTIxIDExOjM3OjI2ICswMTAwICBUaG9tYXMgUm9vcyA8dGhvbWFzLnJvb3NAaW5kdXN0cm9uaWMuZGU+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIGRpcmVjdHNvdW5kc2luazogRml4IHNsZWVwIGZvciBidWZmZXItdGltZSBsb3dlciB0aGFuIDIwMDAwMAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0ODY4MAorCisyMDE1LTEyLTIxIDEyOjMxOjE5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IFVzZSAtQnN5bWJvbGljLWZ1bmN0aW9ucyBpZiBhdmFpbGFibGUKKwkgIFdoaWxlIHRoaXMgaXMgbW9yZSB1c2VmdWwgZm9yIGxpYnJhcmllcywgc29tZSBvZiBvdXIgcGx1Z2lucyB3aXRoIG11bHRpcGxlCisJICBmaWxlcyBhbmQgc29tZSBpbnRlcm5hbCBBUEkgY2FuIGFsc28gYmVuZWZpdCBmcm9tIHRoaXMuCisKKzIwMTUtMTItMTggMTU6MzQ6NTIgKzAwMDAgIFdpbGxpYW0gTWFubGV5IDx3aWxsQHdpbGxpYW1tYW5sZXkubmV0PgorCisJKiBnc3QvZGVidWd1dGlscy9wcm9ncmVzc3JlcG9ydC5jOgorCSogZ3N0L2RlYnVndXRpbHMvcHJvZ3Jlc3NyZXBvcnQuaDoKKwkgIHByb2dyZXNzcmVwb3J0OiBhZGQgc3VwcG9ydCBmb3IgdXNpbmcgZm9ybWF0PWJ1ZmZlcnMgd2l0aCBkby1xdWVyeT1mYWxzZQorCSAgVGhpcyBpcyB1c2VmdWwgZm9yIGludmVzdGlnYXRpbmcgYW5kIGRlYnVnZ2luZyBwaXBlbGluZXMgd2hpY2ggYXJlCisJICBwcm9kdWNpbmcgYnVmZmVycyBhdCBhIHNsb3dlci9mYXN0ZXIgcmF0ZSB0aGFuIHlvdSB3b3VsZCBleHBlY3QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU5NjM1CisKKzIwMTUtMTItMTggMTU6NDk6NDMgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogVXBkYXRlIGZvcm1hdHMgdGFibGUKKwkgIFRoaXMgY2hhbmdlIGFkZCBhbGwgdGhlIG5ldyBSR0IgYmFzZWQgZm9ybWF0LiBUaG9zZSBmb3JtYXQgcmVtb3ZlcyB0aGUKKwkgIGFtYmlndWl0eSB3aXRoIHRoZSBBTFBIQSBjaGFubmVsLiBTb21lIG90aGVyIG1pc3NpbmcgbXVsdGlwbGFuYXIgZm9ybWF0CisJICBoYXMgYmVlbiBhZGRlZCB3aXRoIHNvbWUgYWRkaXRpb25hbCBjbGVhbnVwLgorCisyMDE1LTEyLTE4IDA1OjE3OjE1ICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IERvbid0IHdyaXRlIGludmFsaWQgZWRpdCBsaXN0IHN0YXJ0IHRpbWUuCisJICBBdm9pZCB3cml0aW5nIGEgbmVnYXRpdmUgbnVtYmVyIGFzIGEgbGFyZ2UgcG9zaXRpdmUKKwkgIGludGVnZXIgaW4gYW4gZWRpdCBsaXN0IHdoZW4gdGhlIGZpcnN0X3RzIGlzIHNtYWxsZXIKKwkgIHRoYW4gdGhlIGZpcnN0X2R0cyAtIHdoaWNoIGNhbiBoYXBwZW4gd2hlbiB0aGUgZmlyc3QKKwkgIHBhY2tldCByZWNlaXZlZCBoYXMgYSBQVFMgYnV0IG5vIERUUy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTk2MTUKKworMjAxNS0xMi0wNCAyMzoxNjo0NSArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IE9ubHkgdXBkYXRlIHJ1bm5pbmcgdGltZSB3aGVuIGl0IGluY3JlYXNlcy4KKwkgIERvbid0IGluY3JlbWVudCBydW5uaW5nIHRpbWUgZnJvbSBldmVyeSBidWZmZXIuIFRoZSBjb3JyZWN0CisJICBsb2dpYyB0byBvbmx5IGluY3JlbWVudCB3aGVuIHJ1bm5pbmcgdGltZSBhZHZhbmNlcyBpcyBhCisJICBsaXR0bGUgZnVydGhlciBkb3duLCBzbyBkZWxldGUgdGhpcyBsZWZ0LW92ZXIgbGluZS4KKworMjAxNS0xMS0xOCAxMTowMToyMCArMDEwMCAgVGhpYmF1bHQgU2F1bmllciA8dHNhdW5pZXJAZ25vbWUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYS1tdXg6IEltcGxlbWVudCBwcm9yZXMgc3VwcG9ydAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1ODI1OAorCisyMDE1LTExLTE4IDE2OjIwOjM4ICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICBtYXRyb3NrYS1kZW11eDogUGxheSBQcm9SZXMgdmlkZW8gc3RyZWFtcworCSAgR2VuZXJhdGUgdmlkZW8veC1wcm9yZXMgY2FwcyBmb3IgUHJvUmVzIHZpZGVvIHN0cmVhbXMuCisJICBFdmVyeSBmcmFtZSBuZWVkcyBhbiA4IGJ5dGUgaGVhZGVyIHByZXBlbmRlZCwgYXMgZGVzY3JpYmVkIGluCisJICBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1BcHBsZV9Qcm9SZXMjRnJhbWVfbGF5b3V0CisJICBzbyBkbyB0aGF0IGluIGEgcG9zdC1wcm9jZXNzaW5nIGNhbGxiYWNrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1ODI1OAorCisyMDE1LTEyLTE4IDEwOjE4OjA5ICswNTMwICBSYXZpIEtpcmFuIEsgTiA8cmF2aS5raXJhbkBzYW1zdW5nLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmg6CisJICBkdmRlYzogUmVtb3ZlIHVudXNlZCBmaWVsZHMKKwkgIFJlbW92ZSB1bnVzZWQgZmllbGRzIGZyYW1lX2xlbiBhbmQgc3BhY2UKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTk2MTQKKworMjAxNS0xMi0xNyAxNjowMzowNCArMDEwMCAgVmluY2VudCBEZWhvcnMgPHZpbmNlbnQuZGVob3JzQG9wZW53aWRlLmZyPgorCisJKiBnc3QvcnRwL2dzdHJ0cGoya2RlcGF5LmM6CisJICBydHBqMmtkZXBheTogUHVzaCBvbmUgSlBFRzIwMDAgZnJhbWUgcGVyIGJ1ZmZlciwgbm90IGEgYnVmZmVyIGxpc3Qgd2l0aCBtdWx0aXBsZSBidWZmZXJzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU4OTQzCisKKzIwMTUtMTItMTYgMTE6NDM6NTggKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5jOgorCSAgZHYxMzk0OiBsb2cgZXJyb3IgaWYgZmFpbGVkIHRvIHNldCBzb2NrZXQgc3RhdHVzIGZsYWcKKwkgIExvZyBhbiBlcnJvciBtZXNzYWdlIGlmIGZhaWxlZCB0byBzZXQgd3JpdGUgb3IgcmVhZCBzb2NrZXQgYXMKKwkgIG5vbi1ibG9ja2luZy4KKwkgIENJRCAxMTM5NjA4CisJICBDSUQgMTEzOTYwOQorCisyMDE1LTEyLTE1IDE3OjEwOjAwICswMDAwICBEYXZlIENyYWlnIDxkYXZlY3JhaWdAdW5iYWxhbmNlZGF1ZGlvLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0c2JjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IENoZWNrIGZvciBOVUxMIHJldHVybiB2YWx1ZSBvZiBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMoKQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1OTUwMworCisyMDE1LTEyLTE2IDA5OjM1OjUzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkgIGRvY3M6IHVwZGF0ZSB0byBnaXQKKworMjAxNS0xMi0xNSAxNDoyNzoyMiAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBleHQvdnB4L01ha2VmaWxlLmFtOgorCSAgdnB4OiBBZGQgbWlzc2luZyBoZWFkZXJzIGluIE1ha2VmaWxlLmFtCisJICBUaGlzIGZpeGVzIGRpc3RjaGVjay4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTU1MTAKKworMjAxNS0wOS0yNCAxMjo1NzowMCArMDUzMCAgUHJhc2hhbnQgR290YXJuZSA8cHMuZ290YXJuZUBzYW1zdW5nLmNvbT4KKworCSogZXh0L3ZweC9NYWtlZmlsZS5hbToKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnB4L2dzdHZwOGVuYy5oOgorCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkqIGV4dC92cHgvZ3N0dnA5ZW5jLmg6CisJKiBleHQvdnB4L2dzdHZweGVuYy5jOgorCSogZXh0L3ZweC9nc3R2cHhlbmMuaDoKKwkgIHZweDogY3JlYXRlZCBjb21tb24gYmFzZWNsYXNzIEdzdFZQWEVuYworCSAgR3N0VlA4RW5jIGFuZCBHc3RWUDlFbmMgaGFzIGFsbW9zdCA4MCUgY29kZSBpbiBjb21tb24uCisJICBjcmVhdGVkIGNvbW1vbiBiYXNlY2xhc3MgR3N0VlBYRW5jIGZvciBHc3RWUDhFbmMgYW5kIEdzdFZQOUVuYworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NTUxMAorCisyMDE1LTEyLTE1IDEyOjU3OjUzIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC92cHgvZ3N0dnA5ZGVjLmM6CisJKiBleHQvdnB4L2dzdHZweGRlYy5jOgorCSogZXh0L3ZweC9nc3R2cHhkZWMuaDoKKwkgIHZweGRlYzogUmVtb3ZlIHVubmVlZGVkIGFkZCB2aWRlb19tZXRhCisJICBUaGlzIGFsc28gcmVtb3ZlIGNvcGllcyBmb3IgVlA4LCB3aGljaCB3YXMgbm90IGNvcnJlY3RseSBpbiBwbGFjZQorCSAgaW4gcHJldmlvdXMgcmVsYXRlZCBwYXRjaC4KKworMjAxNS0xMi0xNSAwOTo0OToyNCArMDUzMCAgUHJhc2hhbnQgR290YXJuZSA8cHMuZ290YXJuZUBzYW1zdW5nLmNvbT4KKworCSogZXh0L3ZweC9NYWtlZmlsZS5hbToKKwkqIGV4dC92cHgvZ3N0dnA4ZGVjLmM6CisJKiBleHQvdnB4L2dzdHZwOGRlYy5oOgorCSogZXh0L3ZweC9nc3R2cDlkZWMuYzoKKwkqIGV4dC92cHgvZ3N0dnA5ZGVjLmg6CisJKiBleHQvdnB4L2dzdHZweGRlYy5jOgorCSogZXh0L3ZweC9nc3R2cHhkZWMuaDoKKwkgIHZweDogY3JlYXRlZCBjb21tb24gYmFzZSBjbGFzcyBHc3RWUFhkZWMgZm9yIHZweCBkZWNvZGVycworCSAgQmFzZSBjbGFzcyBmb3IgdGhlIHZwOGRlYyBhbmQgdnA5ZGVjLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NTUxMAorCisyMDE1LTA2LTEwIDA5OjE3OjA4IC0wNDAwICBYYXZpZXIgQ2xhZXNzZW5zIDx4YXZpZXIuY2xhZXNzZW5zQGNvbGxhYm9yYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IEFkZCBHVGxzSW50ZXJhY3Rpb24gcHJvcGVydHkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTA3MDkKKworMjAxNS0xMi0xNCAwOTowNTowNiAtMDUwMCAgRXZhbiBDYWxsYXdheSA8ZXZhbi5jYWxsYXdheUBpcGNvbmZpZ3VyZS5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IFJldHJ5IGNvbm5lY3Rpb24gaWYgdHVubmVsaW5nIG5lZWRzIGF1dGhlbnRpY2F0aW9uCisJICBMZXZlcmFnZSByZXNwb25zZSBmcm9tIGdzdF9ydHNwX2Nvbm5lY3Rpb25fY29ubmVjdF93aXRoX3Jlc3BvbnNlIHRvCisJICBkZXRlcm1pbmUgaWYgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIGJlIHJldHJpZWQgdXNpbmcgYXV0aGVudGljYXRpb24uICBJZgorCSAgc28sIGFkZCB0aGUgYXBwcm9wcmlhdGUgYXV0aGVudGljYXRpb24gaGVhZGVycyBiYXNlZCB1cG9uIHRoZSByZXNwb25zZQorCSAgYW5kIHJldHJ5IHRoZSBjb25uZWN0aW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0OTU5NgorCisyMDE1LTEyLTE0IDE0OjE5OjA1ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBjaGVjayBwb3J0LXJhbmdlIGZvcm1hdAorCSAgVGhlIHN0cmluZyBjb3VsZCBleGlzdCBidXQgd2l0aCBhIHdyb25nIGZvcm1hdCwgaW4gdGhhdCBjYXNlIHdlIHN0aWxsIHdhbnQKKwkgIHRvIHJlc2V0IHRoZSB2YWx1ZXMgb2YgY2xpZW50X3BvcnRfcmFuZ2UubWluIGFuZCBtYXggbGlrZSB3ZSBkbyBpZiB0aGVyZSBpcworCSAgbm8gc3RyaW5nLgorCSAgQ0lEIDExMzk1OTMKKworMjAxNS0xMi0xNCAxNDo1NToxMiArMDEwMCAgVGhvbWFzIFJvb3MgPHRob21hcy5yb29zQGluZHVzdHJvbmljLmRlPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBkaXJlY3Rzb3VuZHNpbms6IENoZWNrIGRldmljZSBwcm9wZXJ0eSBhbmQgZmFpbCBpZiBkZXZpY2UgY2FuJ3QgYmUgZm91bmQKKwkgIERvbid0IHVzZSBkZWZhdWx0IGlmIGEgc3BlY2lmaWMgZGV2aWNlIGlzIHNldCBidXQgaXQgY2FuJ3QgYmUgZm91bmQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU5NDUyCisKKzIwMTUtMTItMTQgMTQ6MTU6MDAgKzAxMDAgIFRob21hcyBSb29zIDx0aG9tYXMucm9vc0BpbmR1c3Ryb25pYy5kZT4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgZGlyZWN0c291bmRzaW5rOiBGaXggaGFuZGxpbmcgb2YgdGhlIG11dGUgcHJvcGVydHkKKwkgIC0gc2V0IG11dGUgdmFsdWUgYXQgc3RhcnR1cAorCSAgLSBjb3JyZWN0IHNldCBhbmQgZ2V0IG11dGUgZnVuY3Rpb25zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1MTA2CisKKzIwMTUtMTItMTEgMTE6MjM6MTMgKzAxMDAgIFRob21hcyBSb29zIDx0aG9tYXMucm9vc0BpbmR1c3Ryb25pYy5kZT4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgZGlyZWN0c291bmRzaW5rOiBDaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIEdldFN0YXR1cygpIHRvbyB0byBkZWNpZGUgaWYgdGhlcmUgd2FzIGFuIGVycm9yCisJICBJZiBHZXRTdGF0dXMoKSBmYWlscywgdGhlIHN0YXR1cyBpdHNlbGYgd29uJ3QgYmUgdmVyeSBtZWFuaW5nZnVsIGJ1dCB3ZSBhbHNvCisJICBoYXZlIHRvIGxvb2sgYXQgaXRzIHJldHVybiB2YWx1ZS4gVGhpcyBmaXhlcyBibG9ja2luZyBwaXBlbGluZXMgd2hlbiByZW1vdmluZworCSAgc291bmQgZGV2aWNlcyBvciBkdXJpbmcgb3RoZXIgZXJyb3JzLCB3aGVyZSB3ZSB3b3VsZG4ndCBub3RpY2UgdGhlIGVycm9yIGFuZAorCSAgdGhlbiB3YWl0IGZvcmV2ZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM0MDk4CisKKzIwMTUtMTItMTAgMTc6NDE6NDYgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvYXRvbXMuaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIGlzb21wNDogcmVtb3ZlIHVudXNlZCBwYXJhbWV0ZXJzIGluIGJ1aWxkXypfZXh0ZW5zaW9uCisJICBBdG9tVFJBSyBwYXJhbWV0ZXIgaXMgbm90IHVzZWQgYnkgYnVpbGRfbW92X2FsYWNfZXh0ZW5zaW9uKCksCisJICBidWlsZF9qcDJoX2V4dGVuc2lvbigpLCBvciBidWlsZF9tb3ZfYWxhY19leHRlbnNpb24oKSAgYW5kIGNhbiBiZQorCSAgcmVtb3ZlZC4KKworMjAxNS0xMi0xMCAxNToxMTowNyArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgaXNvbXA0OiByZXBsYWNlIHZhcmlhYmxlIG9ubHkgdXNlZCBvbmNlCisJICBSZXBsYWNlIGhhc19zaGlmdCB2YXJpYWJsZSB3aXRoIHZhbHVlIHNpbmNlIGl0IGlzIG9ubHkgdXNlIG9uY2UuCisKKzIwMTUtMTItMDkgMTI6MjQ6MDkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBGaXggcGFja2V0IGRyb3BwaW5nIGFmdGVyIGEgYmlnIGRpc2NvbnQKKwkgIFdlIHdvdWxkIHF1ZXVlIDUgY29uc2VjdGl2ZSBwYWNrZXRzIGJlZm9yZSBjb25zaWRlcmluZyBhIHJlc2V0IGFuZCBhIHByb3BlcgorCSAgZGlzY29udCBoZXJlLiBJbnN0ZWFkIG9mIGV4cGVjdGluZyB0aGUgbmV4dCBvdXRwdXQgcGFja2V0IHRvIGhhdmUgdGhlIGN1cnJlbnQKKwkgIHNlcW51bSAoaS5lLiB0aGUgZmlmdGgpLCBleHBlY3QgaXQgdG8gaGF2ZSB0aGUgZmlyc3Qgc2VxbnVtLiBPdGhlcndpc2Ugd2UncmUKKwkgIGdvaW5nIHRvIGRyb3AgYWxsIHF1ZXVlZCB1cCBwYWNrZXRzLgorCisyMDE1LTEyLTA5IDExOjQ5OjAyICswNTMwICBSYXZpIEtpcmFuIEsgTiA8cmF2aS5raXJhbkBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5oOgorCSAgaW50ZXJsZWF2ZTogUmVtb3ZlIHVuc2VkIGZpZWxkCisJICBSZW1vdmUgdW51c2VkIGZpZWxkIGNvbGxlY3RfZXZlbnQgaW4gaW50ZXJsZWF2ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTkyMjYKKworMjAxNS0xMi0wNyAxNjozMzoxNCArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBTdG9wIHB1c2hpbmcgZGF0YSBhcyBzb29uIGFzIHBvc3NpYmxlIGluIHB1c2gtbW9kZQorCSAgV2hlbiB3b3JraW5nIGluIHB1c2gtbW9kZSwgd2UgYXR0ZW1wdCB0byBwdXNoIG91dCBldmVyeXRoaW5nIGN1cnJlbnRseQorCSAgYnVmZmVyZWQgaW4gdGhlIGFkYXB0ZXIuCisJICBUaGlzIGhhcyB0d28gcGl0ZmFsbHM6CisJICAqIFdlIGNvdWxkIHN0b3AgZWFybGllciAodGhlIG1vbWVudCB3ZSBnZXQgYSBub24tb2sgb3Igbm9uLW5vdC1saW5rZWQpCisJICAqIFdlIHJldHVybiB0aGUgbGFzdCBjb21iaW5lZCBmbG93IHJldHVybiwgd2hpY2ggbWlnaHQgYmUgY29tcGxldGVseQorCSAgZGlmZmVyZW50IGZyb20gdGhlIHByZXZpb3VzIGNvbWJpbmVkIGZsb3cgcmV0dXJuCisKKzIwMTUtMTItMDcgMDk6MDg6MDkgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBhdXRvZ2VuLnNoOgorCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGIzMTk5MDkgdG8gODZlNDY2MworCisyMDE1LTEyLTA3IDE0OjQxOjUxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBBZGQgYSB3YXJuaW5nIGlmIGFuIGVtcHR5IFJUQ1AgcGFja2V0IGlzIHRyaWVkIHRvIGJlIHNlbnQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTkxMTkKKworMjAxNS0xMS0zMCAxOToyMDoxMyAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZweC9nc3R2cDhkZWMuaDoKKwkqIGV4dC92cHgvZ3N0dnA5ZGVjLmM6CisJKiBleHQvdnB4L2dzdHZwOWRlYy5oOgorCSAgdnB4ZGVjOiBVc2UgR3N0TWVtb3J5IHRvIGF2b2lkIGNvcGllcworCSAgV2l0aCB0aGUgVlBYIGRlY29kZXJzIGl0J3Mgbm90IHNpbXBsZSB0byB1c2UgZG93bnN0cmVhbSBidWZmZXIgcG9vbCwKKwkgIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgaW1hZ2Ugc2l6ZSBhbmQgYWxpZ25tZW50IHdoZW4gYnVmZmVycyBnZXQKKwkgIGFsbG9jYXRlZC4gV2UgY2FuIHRob3VnaCB1c2UgR3N0QWxsb2NhdG9yIChmb3IgZG93bnN0cmVhbSwgb3IgdGhlIHN5c3RlbQorCSAgYWxsb2NhdG9yKSB0byBhdm9pZCBhIGNvcHkgYmVmb3JlIHB1c2hpbmcgaWYgZG93bnN0cmVhbSBzdXBwb3J0cworCSAgR3N0VmlkZW9NZXRhLiBUaGlzIHdvdWxkIHN0aWxsIGNhdXNlIGEgY29weSBmb3Igc2luayB0aGF0IHJlcXVpcmVzCisJICBzcGVjaWFsaXplZCBtZW1vcnkgYW5kIGRvZXMgbm90IGhhdmUgYSBHc3RBbGxvY2F0b3IgZm9yIHRoYXQsIHRob3VnaAorCSAgaXQgd2lsbCBncmVhdGx5IGltcHJvdmUgcGVyZm9ybWFuY2UgZm9yIHNpbmsgbGlrZSBnbGltYWdlc2luayBhbmQKKwkgIGNsdXR0ZXJzaW5rLiBUbyBhdm9pZCBhbGxvY2F0aW5nIGZvciBldmVyeSBidWZmZXIsIHdlIGFsc28gdXNlIGEKKwkgIGludGVybmFsIGJ1ZmZlciBwb29sLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTM3MgorCisyMDE1LTExLTMwIDA4OjQyOjM1ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogQXZvaWQgb3Zlci1za2lwcGluZyB3aGVuIGNoZWNraW5nIExPQVMgY29uZmlnCisJICBUaGVyZSBtaWdodCBiZSBtdWx0aXBsZSBMT0FTIGNvbmZpZyBpbiBhIHJvdyBpbiBhIGZ1bGwgZnJhbWUuIFRoZSBmaXJzdAorCSAgb25lIG1pZ2h0IGJlIGEgbXVsdGktbGF5ZXIgY29uZmlnICh3aGljaCB3ZSBjYW4ndCBwcm9wZXJseSBwYXJzZSB5ZXQpLi4uCisJICBidXQgdGhlbiBmb2xsb3dlZCBieSBhIHZhbGlkIChzaW5nbGUtbGF5ZXIpIG9uZS4KKwkgIFRoZSBjb2RlIHdhcyBwcmV2aW91c2x5IHNraXBwaW5nIHdob2xlIGZyYW1lcyAoaW5zdGVhZCBvZiBqdXN0IHRoZSBMT0FTCisJICBjb25maWcgd2UgZmFpbGVkIHRvIHJlYWQpIHJlc3VsdGluZyBpbiBtdWx0aXBsZSBmcmFtZXMgKHNlZW4gdXAgdG8gNnMgaW4KKwkgIHNvbWUgc2l0dWF0aW9uKSBiZWluZyBkcm9wcGVkIGJlZm9yZSBmaW5hbGx5IGdldHRpbmcgdGhlIGNvbmZpZ3VyYXRpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU4ODI2CisKKzIwMTUtMTEtMjUgMTc6MDg6NTYgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBQcm9wZXJseSBzZXQgU1BBUlNFIHN0cmVhbSBmbGFncyBmb3Igc3VicGljdHVyZS9zdWJ0aXRsZQorCSAgQW5kIHdoaWxlIHdlJ3JlIGF0IGl0LCBhbHNvIGRldGVjdCAnRFhTQScgYXMgYmVpbmcgYSB2YXJpYW50IGZvdXJjYworCSAgb2YgJ0RYU0InIGZvciBYU1VCCisKKzIwMTUtMTEtMzAgMjE6MjM6NTIgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkgIHRlc3RzOiBzb3VwaHR0cHNyYzogZ3JhbW1hciBmaXgKKworMjAxNS0xMS0zMCAyMTowMToxNyAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSAgdGVzdHM6IHNvdXBodHRwc3JjOiBzd2l0Y2ggc2hvdXRjYXN0IHN0cmVhbSBwcm92aWRlcgorCSAgRml4ZXMgZmFpbGluZyBJQ1kgdGVzdC4gUHJldmlvdXMgcHJvdmlkZXIgaGFzCisJICBzdHJlYW1pbmcgZGlzYWJsZWQgb3V0c2lkZSBVSy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTgxMTQKKworMjAxNS0xMS0xOCAxNjoxMDoxMSArMDEwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IGRvbid0IGNyYXNoIGlmIHdlIG5ldmVyIGdvdCBhdWRpbyBjYXBzIGJlZm9yZSBzdG9wcGluZworCSAgYXVkcy5ibG9ja2FsaWduIGlzIHNldCBvbmNlIHRoZSBmaXJzdCBjYXBzIGFycml2ZS4gSWYKKwkgIGdzdF9hdmlfbXV4X3N0b3BfZmlsZSgpIGlzIGNhbGxlZCBiZWZvcmUgdGhpcyBoYXBwZW5zIHRoZW4gYXVkcy5ibG9ja2FsaWduCisJICBpcyB6ZXJvIGFuZCBnc3RfYXZpX211eF9hdWRzaW5rX3NldF9maWVsZHMoKSBjYXVzZSBhIGNyYXNoOgorCSAgWy4uLl0KKwkgIGF2aXBhZC0+cGFyZW50Lmhkci5yYXRlID0gYXZpcGFkLT5hdWRzLmF2X2JwcyAvIGF2aXBhZC0+YXVkcy5ibG9ja2FsaWduOworCSAgWy4uLl0KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTg5MTIKKworMjAxNS0xMi0wMSAxODoyMDoyMyArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogZG9uJ3QgYmxvY2sgd2hlbiByZXN1cmVjdGluZyBhIGJ1ZmZlcgorCSAgV2hlbiB3ZSBhcmUgcmVzdXJlY3RpbmcgYSBidWZmZXIsIGRvbid0IGJsb2NrLiBpbnN0ZWFkIGxldCB1cyBjb3B5IGEKKwkgIGJ1ZmZlci4KKworMjAxNS0xMi0wMSAwMDozMDowOCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiByZW1vdmUgZXh0cmEgdmFyaWFibGUgdG8gaW1wcm92ZSByZWFkYWJpbGl0eQorCSAgTWFrZXMgaXQgZWFzaWVyIHRvIHNlZSB0aGF0IHRoZSBldmVudCBpcyBiZWluZyByZXBsYWNlZC91bnJlZmVkCisKKzIwMTUtMTItMDEgMDA6MjI6MzYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogcmVzcGVjdCBzZXFudW0gaW4gc2VlayBldmVudHMKKwkgIFByb3BhZ2F0ZSB0aGUgb3JpZ2luYWwgc2VlayBzZXFudW0gdG8gZXZlbnRzIG9yaWdpbmF0ZWQgZnJvbQorCSAgc2Vla2luZyB0byBtYWtlIHN1cmUgdGhleSBoYXZlIHRoZSBzYW1lIHZhbHVlCisKKzIwMTUtMTItMDEgMDA6MDM6MjEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogZmx1c2ggdXBzdHJlYW0gd2hlbiBzZWVraW5nIGluIHB1bGwgbW9kZQorCSAgTWFrZXMgc3VyZSB1cHN0cmVhbSB3aWxsIHVuYmxvY2sgYW5kIHJldHVybiB0aGUgdGhyZWFkIHNvIHRoYXQKKwkgIHNlZWtpbmcgY2FuIGNvbnRpbnVlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU4ODYxCisKKzIwMTUtMTEtMjcgMDk6Mjc6MjkgKzAxMDAgIEFudG9uIEJvbmRhcmVua28gPGFudG9uYm9AYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwaDI2NHBheTogYWRkICJzZW5kIFNQUy9QUFMgd2l0aCBldmVyeSBrZXkgZnJhbWUiIG1vZGUKKwkgIEl0J3Mgbm90IGVub3VnaCB0byBoYXZlIHRpbWVvdXQgb3IgZXZlbnQgYmFzZWQgU1BTL1BQUyBpbmZvcm1hdGlvbiBzZW50CisJICBpbiBSVFAgcGFja2V0cy4gVGhlcmUgYXJlIHNvbWUgc2NlbmFyaW9zIHdoZW4ga2V5IGZyYW1lcyBtYXkgYXBwZWFyCisJICBtb3JlIGZyZXF1ZW50bHkgdGhhbiBvbmNlIGEgc2Vjb25kLCBpbiB3aGljaCBjYXNlIHRoZSBtaW5pbXVtIHRpbWVvdXQKKwkgIGZvciAiY29uZmlnLWludGVydmFsIiBvZiAxIHNlY29uZCBmb3Igc2VuZGluZyBTUFMvUFBTIGlzIG5vdCBzdWZmaWNpZW50LgorCSAgSXQgbWlnaHQgYWxzbyBiZSBkZXNpcmFibGUgaW4gZ2VuZXJhbCB0byBtYWtlIHN1cmUgdGhlIFNQUy9QUFMgaXMKKwkgIGF2YWlsYWJsZSB3aXRoIGV2ZXJ5IGtleWZyYW1lIChwYWNrZXQgbG9zcyBhc2lkZSksIHNvIHJlY2VpdmVycyBjYW4KKwkgIGFjdHVhbGx5IHBpY2sgdXAgZGVjb2RpbmcgaW1tZWRpYXRlbHkgZnJvbSB0aGUgZmlyc3Qga2V5ZnJhbWUgaWYKKwkgIFNQUy9QUFMgaXMgbm90IHNpZ25hbGVkIG91dCBvZiBiYW5kLgorCSAgVGhpcyBwYXRjaCBhZGRzIHRoZSBwb3NzaWJpbGl0eSB0byBzZW5kIFNQUy9QUFMgd2l0aCBldmVyeSBrZXkgZnJhbWUuIFRoaXMKKwkgIG1vZGUgY2FuIGJlIGVuYWJsZWQgYnkgc2V0dGluZyAiY29uZmlnLWludGVydmFsIiBwcm9wZXJ0eSB0byAtMS4gSW4gdGhpcworCSAgY2FzZSB0aGUgcGF5bG9hZGVyIHdpbGwgYWRkIFNQUyBhbmQgUFBTIGJlZm9yZSBldmVyeSBrZXkgKElEUikgZnJhbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU3ODkyCisKKzIwMTUtMTEtMjcgMDk6MDM6NTEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSAgcnRwaDI2NHBheTogY2hhbmdlIGNvbmZpZy1pbnRlcnZhbCBwcm9wZXJ0eSB0eXBlIGZyb20gdWludCB0byBpbnQKKwkgIFRoaXMgd2F5IHdlIGNhbiB1c2UgLTEgYXMgc3BlY2lhbCB2YWx1ZSwgd2hpY2ggaXMgbmljZXIgdGhhbiBNQVhVSU5ULgorCSAgVGhpcyBpcyBiYWNrd2FyZHMgY29tcGF0aWJsZSBldmVuIHdpdGggdGhlIEdWYWx1ZSBBUEksIGFzIHNob3duIGJ5CisJICBhIHVuaXQgdGVzdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTc4OTIKKworMjAxNS0xMS0yNiAyMTo0NjoxMSArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgc3VwcG9ydCBmb3IgT3B1cworCSAgQWRkIHN1cHBvcnQgZm9yIGRlbXV4aW5nIE9wdXMgZW5jYXBzdWxhdGVkIGluIE1QNCBmaWxlcywgYmFzZWQgb24gdGhlCisJICBmb2xsb3dpbmcgc3BlYzogaHR0cHM6Ly93d3cub3B1cy1jb2RlYy5vcmcvZG9jcy9vcHVzX2luX2lzb2JtZmYuaHRtbAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MjY0MworCisyMDE1LTExLTI1IDIyOjQ4OjMyICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHVzZSBtYWNybyBmb3IgY29kZWNfbmFtZQorCSAgVXNlIF9jb2RlYygpIG1hY3JvIGluc3RlYWQgb2YgZHVwbGljYXRpbmcgY29kZS4KKworMjAxNS0wMy0yNSAxNjozMjo1NSArMDEwMCAgUGhpbGlwcCBaYWJlbCA8cC56YWJlbEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmM6CisJICB2NGwyOiB2aWRlb2RlYzogY2hvb3NlIGZvcm1hdCBmcm9tIGNhcHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzM4MjcKKworMjAxNS0wMy0yNyAxNTowMjozMyArMDEwMCAgUGhpbGlwcCBaYWJlbCA8cC56YWJlbEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSAgdjRsMjogYWRkIGdzdF92NGwyX29iamVjdF9wcm9iZV9jYXBzCisJICBBZGQgYSB2YXJpYW50IG9mIGdzdF92NGwyX29iamVjdF9nZXRfY2FwcyB0aGF0IGJ5cGFzc2VzIHRoZSBwcm9iZWRfY2FwcyBjYWNoZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzM4MjcKKworMjAxNS0xMS0xOSAxNzoyMDo1NSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6CisJICB2NGwyLXByb2JlOiBTa2lwIGRldmljZXMgd2l0aG91dCBzdXBwb3J0ZWQgZm9ybWF0cworCisyMDE1LTExLTEzIDEyOjM1OjU5IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkgIHY0bDI6IFRyYWNrIC9kZXYvdmlkZW8qIHRvIHRyaWdnZXJlZCByZXF1aXJlZCBwcm9iZQorCSAgSWYgc29tZXRoaW5nIGluIC9kZXYvdmlkZW8qIGdldCBhZGRlZCwgcmVtb3ZlZCBvciByZXBsYWNlZCwgd2UgbmVlZCB0bworCSAgcHJvYmUgdGhlIGRldmljZXMgYWdhaW4gaW4gb3JkZXIgdG8gZW5zdXJlIHRoZSBkeW5hbWljIGRldmljZXMgYXJlIHVwIHRvCisJICBkYXRlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1ODA4NQorCisyMDE1LTExLTI1IDE0OjUxOjQwICsxMTAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwbWFuYWdlcjogcnRwc2Vzc2lvbjogZG9uJ3Qgc2VuZCBlbXB0eSBSVENQIHBhY2tldHMKKwkgIGdlbmVyYXRlX3J0Y3AgY2FuIHByb2R1Y2UgZW1wdHkgcGFja2V0cyB3aGVuIHJlZHVjZWQgc2l6ZSBSVENQIGlzIHR1cm5lZCBvbi4KKwkgIFNraXAgdGhlbSBzaW5jZSBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gcHVzaCB0aGVtIGFuZCB0aGV5IGNhdXNlIGVycm9ycyB3aXRoCisJICBlbGVtZW50cyB0aGF0IGV4cGVjdCBSVENQIHBhY2tldHMgdG8gY29udGFpbiBkYXRhIChsaWtlIHNydHBlbmMpLgorCisyMDE1LTExLTI0IDEwOjU3OjI4IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcmVzdG9yZSB0aGUgc2VnbWVudCBvbiBjYXNlIG9mIHNvZnQgcmVzZXQKKwkgIFdoZW4gc2Vla2luZyBiYWNrIHRvIHJlc3RvcmUgdGhlIG1kYXQgcG9zaXRpb24gYSBmbHVzaCBpcyBwdXNoZWQKKwkgIHRocm91Z2ggYW5kIGl0IHJlc2V0cyBkb3duc3RyZWFtIHNlZ21lbnQgaW5mb3JtYXRpb24uIE1ha2Ugc3VyZQorCSAgdGhhdCBhZnRlciB0aGUgZmx1c2ggKHRoYXQgZG9lcyBhIHNvZnQgcmVzZXQpIGEgc2VnbWVudCB3aWxsCisJICBiZSBwdXNoZWQgYWdhaW4KKwkgIEZpeGVzIHJlZ3Jlc3Npb25zIHNwb3R0ZWQgYXQKKwkgIGh0dHBzOi8vY2kuZ3N0cmVhbWVyLm5ldC9qb2IvR1N0cmVhbWVyLW1hc3Rlci12YWxpZGF0ZS8yMTAwLworCisyMDE1LTExLTIwIDEyOjQ0OjIyICswMDAwICBHcmFoYW0gTGVnZ2V0dCA8bWluZnJpbkBzaGFycC5mbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICBtdWx0aWZpbGVzaW5rOiBmaXggc3BlbGxpbmcgb2YgdmFyaWFibGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTgzOTAKKworMjAxNS0xMS0yMCAxMTowNTo1MSArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogdW5pdGUgZHVwbGljYXRlIEZvdXJDQworCSAgVW5pdGUgaW4gZm91cmNjLmggdGhlIEZvdXJDQ3MgdGhhdCBhcmUgdXNlZCB0d2ljZSBvciBtb3JlIGluIHF0ZGVtdXgKKworMjAxNS0xMS0xOSAxNTozMzo0NSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDI6IEZpeCBjYXB0dXJlL291dHB1dC1pby1tb2RlIHByb3BlcnRpZXMKKwkgIFRoZXJlIHdhcyBzb21lIG1pc3MtbWF0Y2ggaW4gdGhlIGltcGxlbWVudGF0aW9uLiBUaGlzIG1ha2VzIGl0CisJICBjb25jaXN0ZW50LCB0aG91Z2ggZnVuY3Rpb25hbGx5IGl0IHdvcmtlZCwgZXhjZXB0IHRoZSB2aWRlbyBkZWNvZGVyCisJICBvdXRwdXQtaW8tbW9kZSBnZXR0ZXIuCisKKzIwMTUtMTEtMTkgMTk6NDg6MDYgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkgIGF0b21zOiByZW1vdmUgdW51c2VkIGFyZ3VtZW50IG9mIGJ1aWxkX21vdl93YXZlX2V4dGVuc2lvbigpCisJICBBdG9tVHJhayAqIHRyYWsgYXJndW1lbnQgb2YgYnVpbGRfbW92ZV93YXZlX2V4dGVuc2lvbigpIGlzbid0IHVzZWQuCisJICBSZW1vdmluZyBpdC4KKworMjAxNS0xMS0xOSAxOToyODoyMCArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcmVtb3ZlIGR1cGxpY2F0ZSBGb3VyQ0MKKwkgIFVzZSB0aGUgYXZhaWxhYmxlIEZvdXJDQ3MgaW4gZm91cmNjLmggaW5zdGVhZCBvZiBkdXBsaWNhdGluZyB0aGVtLgorCisyMDE1LTExLTE5IDE4OjM2OjM5ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgaXNvbXA0OiBjZW50cmFsaXplIGFsbCBGb3VyQ0MKKwkgIDEwIEZvdXJDQ3MgZ2VuZXJhdGVkIHdpdGggR1NUX01BS0VfRk9VUkNDKCkgaW4gZ3N0cXRtdXguYyBhbmQgYXRvbXMuYworCSAgYWxyZWFkeSBleGlzdCBpbiBmb3VyY2MuaC4gRG9uJ3QgZHVwbGljYXRlIHRoZXNlIGFuZCB1c2UgdGhlbSBkaXJlY3RseS4KKwkgIFBsdXMgbW92aW5nIDYgdG8gZm91cmNjLmgsIHRvIGNlbnRyYWxpemUgdGhlbSBhbGwuCisKKzIwMTUtMTEtMTkgMTc6MzI6MTIgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS93ZWJtLW11eC5jOgorCSAgbWF0cm9za2Evd2VibW11eDogZml4IG91dGRhdGVkIGV4YW1wbGUgbGF1bmNoIGxpbmVzCisJICBVcGRhdGUgZ3N0LWxhdW5jaC0wLjEwIGxpbmVzIHRvIGdzdC1sYXVuY2gtMS4wCisKKzIwMTUtMTEtMTYgMTM6MjY6NTAgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvYXRvbXMuaDoKKwkqIGdzdC9pc29tcDQvZm91cmNjLmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJICBpc29tcDQ6IGFkZCBzdXBwb3J0IGZvciBPcHVzIGluIG1wNG1wdXgKKwkgIEFkZCBzdXBwb3J0IGZvciBtdXhpbmcgTVA0IGZpbGVzIGNvbnRhaW5pbmcgT3B1cy4gQmFzZWQgb24gdGhlIHNwZWMKKwkgIGRldGFpbGVkIGhlcmU6CisJICBodHRwczovL3d3dy5vcHVzLWNvZGVjLm9yZy9kb2NzL29wdXNfaW5faXNvYm1mZi5odG1sCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQyNjQzCisKKzIwMTUtMTEtMTggMTk6MTA6NTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogUmVwbGFjZSB0YWJzIHdpdGggc3BhY2VzCisKKzIwMTUtMTEtMTggMTk6MDc6NTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQ2FzdCB0byBzaWduZWQgaW50ZWdlcnMgdG8gcHJldmVudCB1bnNpZ25lZCBjb21wYXJlIGJldHdlZW4gbmVnYXRpdmUgYW5kIHBvc2l0aXZlIG51bWJlcnMKKwkgIFRoaXMgZml4ZXMgc2Vla2luZyBpZiB0aGUgZmlyc3QgZW50cmllcyBpbiB0aGUgc2FtcGxlcyB0YWJsZSBhcmUgbmVnYXRpdmUuIFRoZQorCSAgYmluYXJ5IHNlYXJjaCB3b3VsZCBhbHdheXMgZmFpbCBvbiB0aGlzIGFzIHRoZSBhcnJheSB3b3VsZCBub3QgYmUgc29ydGVkIGlmCisJICBpbnRlcnByZXRpbmcgdGhlIG5lZ2F0aXZlIG51bWJlcnMgYXMgaHVnZSBwb3NpdGl2ZSBudW1iZXJzLiBUaGlzIGNhdXNlZCB1cyB0bworCSAgYWx3YXlzIG91dHB1dCBidWZmZXJzIGZyb20gdGhlIGJlZ2lubmluZyBhZnRlciBhIHNlZWsgaW5zdGVhZCBvZiBjbG9zZSB0byB0aGUKKwkgIHNlZWsgcG9zaXRpb24uCisJICBBbHNvIGFkZCBhIGNhc2UgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gZm9yIGVxdWFsaXR5LgorCisyMDE1LTExLTE4IDE2OjAxOjQ4ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogcmVtb3ZlIGR1cGxpY2F0ZSBjaGVjaworCSAgV2Ugd2FudCAxIG9yIDIgc3RyZWFtaGVhZGVycywgdGhlIGNoZWNrICBpZiAoYnVmYXJyLT5sZW4gIT0gMSAmJgorCSAgYnVmYXJyLT5sZW4gIT0gMikgaXMgZW5vdWdoLiBOb3QgbmVlZCB0byBjaGVjayBpZiBidWZhcnItPmxlbiBpcyA8PSAwIG9yCisJICA+IDI1NS4KKworMjAxNS0xMS0xOCAxNDo0ODozNiArMDkwMCAgVmluZWV0aCBUTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJICBzb3VwaHR0cGNsaWVudHNpbms6IEZpeCBlcnJvciBsZWFrIGFuZCBoYW5kbGUgZXJyb3IKKwkgIGdfdGhyZWFkX3RyeV9uZXcgYWxsb3dzIGZvciBwb3NzaWJsaXR5IG9mIGZhaWx1cmVzLiBJbiBjYXNlIGl0IGZhaWxzLAorCSAgZXJyb3IgaXMgbm90IGhhbmRsZWQgYW5kIGxlYWtlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTgyNjAKKworMjAxNS0xMS0xNSAxNzoxNjoyOSAtMDgwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmM6CisJICBydHBnc3RkZXBheTogUHJvcGVybHkgaGFuZGxlIGJhY2t3YXJkIGNvbXBhdCBmb3IgZXZlbnQgZGVzZXJpYWxpemF0aW9uCisJICBBY3R1YWwgY29kZSBpcyBjaGVja2luZyBmb3IgYSBOVUxMIHRlcm1pbmF0b3IgYW5kIGEgJzsnIHRlcm1pbmF0b3IsCisJICBmb3IgYmFja3dhcmQgY29tcGF0LCBpbiBhIGNoYWluZWQgd2F5IHRoYXQgY2F1c2UgYWxsIGV2ZW50cyBiZWluZyByZWplY3RlZC4KKwkgIFRoZSBwcm9wZXIgY29uZGl0aW9uIGlzIHRvIHJlamVjdCB0aGUgZXZlbnRzIHdoZW4gdGVybWluYXRvciBpc24ndAorCSAgaW4gWydcMCcsICc7J10gc2V0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1ODE1MQorCisyMDE1LTExLTE1IDE3OjExOjAyIC0wODAwICBKb3NlcCBUb3JyYSA8bjc3MGdhbGF4eUBnbWFpbC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6CisJICB0ZXN0czogcnRwLXBheWxvYWRpbmc6IFRlc3QgZm9yIGhhbmRsaW5nIG9mIGN1c3RvbSBldmVudHMgaW4gcnRwZ3N0CisJICBBZGQgYSBzaW1wbGUgdGVzdCB0aGF0IGNoZWNrcyBwcm9wZXIgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24KKwkgIG9mIGN1c3RvbSBldmVudHMgd2l0aCBydHBnc3RwYXkgYW5kIHJ0cGdzdGRlcGF5LgorCisyMDE1LTExLTE2IDE2OjIzOjQzIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZGVjLmM6CisJKiBleHQvdnB4L2dzdHZwOWRlYy5jOgorCSAgdnB4ZGVjOiBVc2UgdGhyZWFkcyBvbiBtdWx0aS1jb3JlIHN5c3RlbXMKKwkgIFRoaXMgYWRkcyBhbiBhdXRvbWF0aWMgbW9kZSB0byB0aGUgdGhyZWFkcyBwcm9wZXJ0eSBvZiB2cHhkZWMgaW4gb3JkZXIgdG8KKwkgIHVzZSBhcyBtYW55IHRocmVhZHMgYXMgdGhlcmUgaXMgQ1BVIG9uIHRoZSBwbGF0Zm9ybS4gVGhpcyBicmluZ3MgYmFjaworCSAgR1N0cmVhbWVyIFZQWCBkZWNvZGluZyBwZXJmb3JtYW5jZSBjbG9zZXIgdG8gd2hhdCBpcyBhY2hpZXZlZCBieSBvdGhlcgorCSAgcGxheWVycywgaW5jbHVkaW5nIENocm9taXVtLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1ODE5NQorCisyMDE1LTExLTE2IDEwOjU4OjMyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogb25seSBzZW5kIGluaXRpYWwgZ2FwcyBmb3Igbm9uLWZyYWdtZW50ZWQgc3RyZWFtcworCSAgSXQgd291bGQgYmUgdW51c3VhbCB0byBoYXZlIHRoZSBoZWFkZXIgc2VnbWVudCB3aXRoIGFuICdlZHRzJyBhdG9tCisJICBpbmRpY2F0aW5nIGdhcHMgYXQgdGhlIGJlZ2lubmluZyB3aGVuIGhhbmRsaW5nIGZyYWdtZW50ZWQgc3RyZWFtcy4KKwkgIFRoZSBoZWFkZXIgdXN1YWxseSBkb2Vzbid0IGNvbnRhaW4gYW55IHRpbWVzdGFtcGluZyBpbmZvcm1hdGlvbiwgdGhpcworCSAgc2hvdWxkIGNvbWUgZnJvbSB0aGUgcGxheWxpc3QvbWFuaWZlc3QgYW5kIHRoZSBzZWdtZW50cyB3aXRoIG1lZGlhCisJICBpbiB0aG9zZSBzY2VuYXJpb3MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU4MTcxCisKKzIwMTUtMTEtMTcgMDk6NDE6MzQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBSZXZlcnQgIlJldmVydCAicXRkZW11eDogcmVzcGVjdCBxdCBzZWdtZW50cyBpbiBwdXNoLW1vZGUgZm9yIGVtcHR5IHN0YXJ0cyIiCisJICBUaGlzIHJldmVydHMgY29tbWl0IGQ4NDJmZjI4OGE5ZDAxMjE0YTA0NmJlY2JmZDljYmZmM2E0YWNlYTAuCisJICBUaGlzIHdhcyByZXZlcnRlZCBieSBhY2NpZGVudAorCisyMDE1LTExLTE3IDEyOjM5OjA1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwkgIHVkcHNyYzogQWRkICJsb29wIiBwcm9wZXJ0eSBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIG11bHRpY2FzdCBsb29wYmFjaworCSAgT24gUE9TSVgsIElQX01VTFRJQ0FTVF9MT09QIGlzIGEgc2V0dGluZyBmb3IgdGhlIHNlbmRlciBzb2NrZXQuIE9uIFdpbmRvd3MgaXQKKwkgIGlzIGEgc2V0dGluZyBmb3IgdGhlIHJlY2VpdmVyIHNvY2tldC4gQXMgc3VjaCB3ZSB3aWxsIG5lZWQgaXQgb24gdWRwc3JjIHRvbyB0bworCSAgYWxsb3cgZmlsdGVyaW5nIG91dCBvdXIgb3duIG11bHRpY2FzdCBwYWNrZXRzLgorCisyMDE1LTExLTE2IDEzOjUyOjA1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIFJldmVydCAicXRkZW11eDogcmVzcGVjdCBxdCBzZWdtZW50cyBpbiBwdXNoLW1vZGUgZm9yIGVtcHR5IHN0YXJ0cyIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgMTQyZDhlMmQyM2U1NjAyZTczODI5NzdhZjEwNDNkNjIxNjI1ZjhjOC4KKworMjAxNS0xMS0xNiAxNjo1NjowNCArMDkwMCAgVmluZWV0aCBUTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBGaXggc3RyaW5nIG1lbW9yeSBsZWFrCisJICBUaGUgc3RyaW5nIGdvdCB1c2luZyBnX3N0cmR1cF9wcmludGYgd2lsbCBiZSBhbGxvY2F0ZWQgbWVtb3J5CisJICBhbmQgc2hvdWxkIGJlIGZyZWVkIGFmdGVyIHVzZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTgxNjEKKworMjAxNS0xMS0xNCAyMTo1MToxMSAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyL29iamVjdDogcmVtb3ZlIHVubmVjZXNzYXJ5IE5VTEwgY2hlY2sgYmVmb3JlIGdfZnJlZSgpCisKKzIwMTUtMTEtMTQgMjE6NDU6MjkgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkgIG9zc3NyYzogcmVtb3ZlIHVubmVjZXNzYXJ5IE5VTEwgY2hlY2sgYmVmb3JlIGdfZnJlZSgpCisKKzIwMTUtMTEtMTQgMjE6NDM6MjQgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc3JjLmM6CisJICBzdW5hdWRpb3NyYzogcmVtb3ZlIHVubmVjZXNzYXJ5IE5VTEwgY2hlY2tzIGJlZm9yZSBnX2ZyZWUoKQorCisyMDE1LTExLTE0IDIxOjM2OjMwIC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IHJlbW92ZSB1bm5lY2Vzc2FyeSBOVUxMIGNoZWNrcyBiZWZvcmUgZ19mcmVlKCkKKworMjAxNS0xMS0xNCAyMTozMTowOCAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogcmVtb3ZlIHVubmVjZXNzYXJ5IE5VTEwgY2hlY2tzIGJlZm9yZSBnX2ZyZWUoKQorCisyMDE1LTExLTE0IDIxOjI2OjIxIC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWF0cm9za2EvcmVhZC1jb21tb246IHJlbW92ZSB1bm5lY2Vzc2FyeSBOVUxMIGNoZWNrcyBiZWZvcmUgZ19mcmVlKCkKKworMjAxNS0xMS0xNCAyMDo0MzoxMCAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJICBpc29tcDQvYXRvbXM6IHJlbW92ZSB1bm5lY2Vzc2FyeSBOVUxMIGNoZWNrcyBiZWZvcmUgZ19mcmVlKCkKKworMjAxNS0xMS0xNCAyMDozNTo1NCAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgcnRwL3RoZW9yYXBheTogcmVtb3ZlIHVubmVjZXNzYXJ5IE5VTEwgY2hlY2tzIGJlZm9yZSBnX2ZyZWUoKQorCisyMDE1LTExLTE0IDIwOjMzOjU0IC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJICBydHAvdm9yYmlzcGF5OiByZW1vdmUgdW5uZWNlc3NhcnkgTlVMTCBjaGVja3MgYmVmb3JlIGdfZnJlZSgpCisKKzIwMTUtMTEtMTQgMjA6MzE6MzQgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBydHAvanBlZ3BheTogcmVtb3ZlIHVubmVjZXNzYXJ5IE5VTEwgY2hlY2tzIGJlZm9yZSBnX2ZyZWUoKQorCisyMDE1LTExLTE0IDIwOjI3OjA0IC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJICBydHBnc3RwYXk6IHJlbW92ZSB1bm5lY2Vzc2FyeSBOVUxMIGNoZWNrcyBiZWZvcmUgZ19mcmVlKCkKKworMjAxNS0xMS0xNCAyMDoyMjowOSAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiByZW1vdmUgdW5uZWNlc3NhcnkgTlVMTCBjaGVja3MgYmVmb3JlIGdfZnJlZSgpCisKKzIwMTUtMTEtMTQgMjA6MTQ6MjUgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2ZseC9nc3RmbHhkZWMuYzoKKwkgIGZseGRlYzogcmVtb3ZlIHVubmVjZXNzYXJ5IE5VTEwgY2hlY2sgYmVmb3JlIGdfZnJlZSgpCisKKzIwMTUtMTEtMTQgMjA6MDk6NTQgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2VmZmVjdHYvZ3N0b3AuYzoKKwkgIGVmZmVjdHYvb3B0djogcmVtb3ZlIHVubmVjZXNzYXJ5IE5VTEwgY2hlY2tzIGJlZm9yZSBnX2ZyZWUoKQorCisyMDE1LTExLTE0IDIwOjA1OjAzIC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYzoKKwkgIGVmZmVjdHYvc2hhZ2FkZWxpY3R2OiByZW1vdmUgdW5uZWNlc3NhcnkgTlVMTCBjaGVja3MgYmVmb3JlIGdfZnJlZSgpCisKKzIwMTUtMTEtMTQgMjA6MDE6NDMgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2VmZmVjdHYvZ3N0cmlwcGxlLmM6CisJICBlZmZlY3R2L3JpcHBsZTogcmVtb3ZlIHVubmVjZXNzYXJ5IE5VTEwgY2hlY2tzIGJlZm9yZSBnX2ZyZWUoKQorCisyMDE1LTExLTE0IDE5OjU2OjU3IC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkgIGVmZmVjdHYvcmFkaW9hYzogcmVtb3ZlIHVubmVjZXNzYXJ5IE5VTEwgY2hlY2tzIGJlZm9yZSBnX2ZyZWUoKQorCisyMDE1LTExLTE0IDE5OjUyOjEyIC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHN0cmVhay5jOgorCSAgZWZmZWN0di9zdHJlYWs6IHJlbW92ZSB1bm5lY2Vzc2FyeSBOVUxMIGNoZWNrIGJlZm9yZSBnX2ZyZWUoKQorCisyMDE1LTExLTE0IDE3OjA0OjU1IC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmM6CisJICBzaG91dDI6IHJlbW92ZSB1bm5lY2Vzc2FyeSBOVUxMIGNoZWNrcyBiZWZvcmUgZ19mcmVlKCkKKworMjAxNS0xMS0xNCAxNjo1NzoxMyAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOWVuYy5jOgorCSAgdnA5ZW5jOiByZW1vdmUgdW5uZWNlc3NhcnkgTlVMTCBjaGVjayBiZWZvcmUgZ19mcmVlKCkKKworMjAxNS0xMS0xNCAxNjo1NDo0MiAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSAgdnA4ZW5jOiByZW1vdmUgdW5uZWNlc3NhcnkgTlVMTCBjaGVjayBiZWZvcmUgZ19mcmVlKCkKKworMjAxNS0xMS0xNCAxNjoyMDozMyAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IHJlbW92ZSB1bm5lY2Vzc2FyeSBOVUxMIGNoZWNrcyBiZWZvcmUgZ19mcmVlKCkKKworMjAxNS0xMS0xMyAxMzozNDowMiArMDEwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogYWRkIHN1cHBvcnQgb2YgTlYxNiwgTlY2MSBhbmQgTlYyNCBmb3JtYXRzCisJICBNYXBwZWQgcmVzcGVjdGl2ZWx5IHRvIFY0TDJfUElYX0ZNVF9OVjE2L1Y0TDJfUElYX0ZNVF9OVjE2TSwKKwkgIFY0TDJfUElYX0ZNVF9OVjYxLFY0TDJfUElYX0ZNVF9OVjYxTSBhbmQgVjRMMl9QSVhfRk1UX05WMjQgdjRsMiBmb3JtYXRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1ODA1OAorCisyMDE1LTExLTExIDE0OjEwOjUzICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4cGFydHJlYWRlci5jOgorCSAgc3BsaXRtdXhwYXJ0cmVhZGVyOiBGaXggR0NvbmQgbGVhaworCSAgaW5hY3RpdmVfY29uZCBpcyBub3QgYmVpbmcgY2xlYXJlZCByZXN1bHRpbmcgaW4gbWVtb3J5IGxlYWsuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU3OTI0CisKKzIwMTUtMDgtMDYgMTI6NDQ6MjAgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGZpeCBvdXRwdXQgc3RhdGUgbWVtb3J5IGxlYWsKKwkgIFdoZW4ganBlZ19maW5pc2hfZGVjb21wcmVzcyBpcyBjYWxsZWQsIG91dHB1dCBzdGF0ZSByZWZlcmVuY2UgaXMgYmVpbmcgY3JlYXRlZC4KKwkgIEJ1dCBpZiB0aGVyZSBpcyBhbnkgZmFpbHVyZXMgaW4gZmluaXNoaW5nIGRlY29tcHJlc3MsIGl0IGp1bXBzIHRvIHNldGptcCwKKwkgIGFuZCBhdCB0aGF0IHBvaW50IHN0YXRlIHdhcyBub3QgcmVmZXJlbmNlZC4gUmVzdWx0aW5nIGluIGxlYWsgb2Ygb3V0cHV0IHN0YXRlLgorCSAgSGVuY2UgYWRkaW5nIGFub3RoZXIgc2V0am1wIGFmdGVyIG91dHB1dCBzdGF0ZSBpcyByZWZlcmVuY2VkLgorCSAgU2ltaWxhcmx5IGFkZGluZyBhbm90aGVyIHNldGptcCB0byB1bm1hcCB0aGUgZnJhbWUgaW4gY2FzZSBlcnJvciBoYXBwZW5zIGJlZm9yZQorCSAgZmluaXNoX2RlY29tcHJlc3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTMwODcKKworMjAxNS0wOC0xMCAxMToyMzo0NSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJlc3BlY3QgcXQgc2VnbWVudHMgaW4gcHVzaC1tb2RlIGZvciBlbXB0eSBzdGFydHMKKwkgIEluIHB1c2gtbW9kZSBpdCBpcyBoYXJkIHRvIHN1cHBvcnQgcXQgc2VnbWVudHMgb3ZlcmFsbCBidXQgaXQgaXMKKwkgIHBvc3NpYmxlIHRvIHN1cHBvcnQgd2hlbiB0aGUgZmlsZSBpc24ndCBoZWF2aWx5IGVkaXRlZCBidXQganVzdCBjb250YWluCisJICBhIHNlZ21lbnQgdG8gaW5kaWNhdGUgYSBnYXAgYXQgdGhlIGJlZ2lubmluZy4gVGhpcyBhbHNvIGFsbG93cyBwcm9wZXJseQorCSAgdGltZXN0YW1waW5nIGRhdGEgdGhhdCBoYXMgbmVnYXRpdmUgRFRTIGluIHB1c2gtbW9kZS4KKwkgIEl0IGlzIHJlbGV2YW50IHRvIHN1cHBvcnQgdGhvc2UgZm9yIDIgc2NlbmFyaW9zOgorCSAgMSkgZnJhZ21lbnRlZCBzdHJlYW1pbmcKKwkgIDIpIEhUVFAgcGxheWJhY2sgb2YgJ3JlZ3VsYXInIG1wNAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MzQ4NAorCisyMDE1LTExLTA1IDE4OjM5OjMzICswNTMwICBOaXJiaGVlayBDaGF1aGFuIDxuaXJiaGVla0BjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWRldmljZXByb3ZpZGVyLmM6CisJICBwdWxzZTogRG9uJ3QgbGVhayBjYXBzIGFuZCBzdHJ1Y3R1cmVzIGluIHRoZSBkZXZpY2UgcHJvdmlkZXIKKworMjAxNS0xMS0wNCAxOTowMToyMCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cG1hbmFnZXI6IERvY3VtZW50IHByb3BlcnRpZXMgdGhhdCBhcmUgZXhwcmVzc2VkIGluIGJpdHMgcGVyIHNlY29uZAorCSAgVGhpcyBjaGFuZ2VkIGluIDkyOGNkMTEwYmNlYTVkMTQzY2FiM2VhNzQ3OTkxODUxZDUyZWNiYWQgYW5kCisJICA3M2MwYzI5MjBmOWFjYTk2OTgyYTRkZTBjMjBiMzQxN2FhMTQ4YjgxIGJ1dCB3YXMgbm90IGRvY3VtZW50ZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3ODYzCisKKzIwMTUtMTEtMDQgMTg6NTE6MzIgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBtYW5hZ2VyOiBUcml2aWFsIGdzdC1pbmRlbnQgZml4ZXMKKworMjAxNS0wOC0xMiAxMzozNTo0MCArMDIwMCAgUGhpbGlwcGUgTm9ybWFuZCA8cGhpbG5AaWdhbGlhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IHN1cHBvcnQgZm9yIGNlbmMgYXV4aWxpYXJ5IGluZm8gcGFyc2luZyBvdXRzaWRlIG9mIG1vb2YgYm94CisJICBXaGVuIHRoZSBjZW5jIGF1eCBpbmZvIGluZGV4IGlzIG91dCBvZiBtb29mIGJvdW5kYXJpZXMsIGtlZXAgdHJhY2sgb2YKKwkgIGl0IGFuZCBwYXJzZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZGF0IGJveCwgYmVmb3JlIHRoZSBmaXJzdCBzYW1wbGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1NjE0CisKKzIwMTUtMTEtMDMgMjA6MzM6MTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogVXNlIGNvZGVjdXRpbHMgaGVscGVycyBmb3IgY3JlYXRpbmcgT3B1cyBjYXBzCisJICBBbHNvIGZpeCB1cCBjb2RlYyBkYXRhIHdpdGggdmFsdWVzIGZyb20gdGhlIGNvbnRhaW5lci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTcxNTIKKworMjAxNS0xMS0wMyAxNDo1MTo0OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBUaGVyZSBpcyBubyBtdWx0aXN0cmVhbSBmaWVsZCBmb3IgT3B1cyBhbnltb3JlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU3MTUyCisKKzIwMTUtMTEtMDMgMTI6NDI6NTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS93ZWJtLW11eC5jOgorCSAgbWF0cm9za2Evd2VibW11eDogU3VwcG9ydCBPcHVzIGluIHdlYm1tdXggYW5kIFZQOSBpbiBtYXRyb3NrYW11eAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyOTk1MAorCisyMDE1LTExLTAzIDEyOjQwOjE1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IFBhcnNlIGFuZCBoYW5kbGUgQ29kZWNEZWxheSwgU2Vla1ByZXJvbGwgYW5kIERpc2NhcmRQYWRkaW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI3MzA1CisKKzIwMTUtMTEtMDMgMTI6MTg6MTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBXcml0ZSBDb2RlY0RlbGF5LCBEaXNjYXJkUGFkZGluZyBhbmQgU2Vla1ByZXJvbGwgZm9yIE9wdXMKKwkgIEFuZCBhbHNvIGFkanVzdCB0aW1lc3RhbXBzIGFuZCBkdXJhdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSBjb2RlYyBkZWxheSwgYm90aAorCSAgc2hvdWxkIGluY2x1ZGUgaXQgZm9yIHdoYXRldmVyIHJlYXNvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjczMDUKKworMjAxNS0xMS0wMyAxMTo0OTo1NCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IE9wdXMgaGVhZGVycyBhcmUgbm90IGluLWJhbmQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjczMDUKKworMjAxNS0xMS0wMyAyMjowMTowNyArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Z2l0QGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkgIHY0bDI6IFNldCBPX0NMT0VYRUMgb24gdGhlIGRldmljZSBmZAorCSAgVGhpcyBpcyBuZWVkZWQgdG8gbWFrZSBzdXJlIHRoYXQgY2hpbGQgcHJvY2Vzc2VzIGRvbid0IGluaGVyaXQgdGhlIHZpZGVvCisJICBkZXZpY2UgZmQgd2hpY2ggY2FuIGNhdXNlIHByb2JsZW1zIHdpdGggc29tZSBkcml2ZXJzLgorCisyMDE1LTExLTAzIDE0OjQ2OjMwICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cG1hbmFnZXI6IHN3aXRjaCBHX0dJTlQ2NF9GT1JNQVQgZm9yIEdTVF9TVElNRV9BUkdTCisJICBObyBuZWVkIHRvIHVzZSBHX0dJTlQ2NF9GT1JNQVQgZm9yIHBvdGVudGlhbGx5IG5lZ2F0aXZlIHZhbHVlcyBvZgorCSAgR3N0Q2xvY2tUaW1lRGlmZi4gU2luY2UgMS42IHRoZXNlIGNhbiBiZSBoYW5kbGVkIHdpdGggR1NUX1NUSU1FX0FSR1MuCisJICBQbHVzIGl0IGNyZWF0ZXMgbW9yZSByZWFkYWJsZSB2YWx1ZXMgaW4gdGhlIGxvZ3MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU3NDgwCisKKzIwMTUtMTEtMDMgMTQ6MjY6MjkgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwbWFuYWdlcjogdXNlIEdTVF9TVElNRV9BUkdTIGZvciBHc3RDbG9ja1RpbWVEaWZmCisJICBObyBuZWVkIHRvIG1hbnVhbGx5IGhhbmRsZSBuZWdhdGl2ZSB2YWx1ZXMgb2YgZGlmZiwgR1NUX1NUSU1FX0FSR1MgZG9lcworCSAgZXhhY3RseSB0aGlzLgorCisyMDE1LTExLTAyIDE2OjUzOjE1ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogdXNlIEdTVF9TVElNRV9BUkdTIGZvciBHc3RDbG9ja1RpbWVEaWZmCisJICBObyBuZWVkIHRvIG1hbnVhbGx5IGhhbmRsZSBuZWdhdGl2ZSB2YWx1ZXMgb2YgZGlmZiwgR1NUX1NUSU1FX0FSR1MgZG9lcworCSAgZXhhY3RseSB0aGlzLgorCisyMDE1LTExLTAyIDE2OjQzOjQ2ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiB1c2UgR1NUX1NUSU1FX0FSR1MgZm9yIEdzdENsb2NrVGltZURpZmYKKwkgIE5vIG5lZWQgdG8gbWFudWFsbHkgaGFuZGxlIG5lZ2F0aXZlIHZhbHVlcyBvZiBkaWZmLCBHU1RfU1RJTUVfQVJHUyBpcworCSAgYXZhaWxhYmxlIGZvciB0aGlzLgorCisyMDE1LTEwLTMwIDEwOjA1OjM3ICswNTMwICBSYXZpIEtpcmFuIEsgTiA8cmF2aS5raXJhbkBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jOgorCSAgYXVkaW9jaGViYmFuZDogRml4IHR5cG8gaW4gZXhhbXBsZSBwaXBlbGluZQorCSAgRml4IHR5cG8gaW4gZXhhbXBsZSBwaXBlbGluZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTczNDAKKworMjAxNS0xMC0yOCAyMzo0NzozMCArMDUzMCAgTmlyYmhlZWsgQ2hhdWhhbiA8bmlyYmhlZWtAY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyZGV2aWNlcHJvdmlkZXIuYzoKKwkgIHY0bDI6IGZpeCBkb3VibGUtdW5yZWYgaW4gdGhlIHY0bDIgZGV2aWNlIHByb3ZpZGVyCisKKzIwMTUtMTAtMjcgMTA6NDg6MDAgKzAxMDAgIE5pY29sYSBNdXJpbm8gPG5pY29sYS5tdXJpbm9AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJICBtYXRyb3NrYW11eDogZG9uJ3QgZHJvcCBKUEVHIGZyYW1lcyB0aGF0IG9ubHkgaGF2ZSBQVFMgYnV0IG5vIERUUyBzZXQKKwkgIEZvciB0aGUgTVMvVmZXIGNvZGVjIGlkcywgd2Ugd2FudCB0byB3cml0ZSBEVFMgdGltZXN0YW1wcyBpbnN0ZWFkCisJICBvZiBQVFMgYmVjYXVzZSB0aGF0J3Mgd2hhdCBldmVyeW9uZSBlbHNlIHNlZW1zIHRvIGRvIChhbmQgaXQncyBhbHNvCisJICBob3cgaXQgaXMgaW4gQVZJKS4gU28gZm9yIHRob3NlIGlucHV0IGZvcm1hdHMgd2UgdXNlIHRoZSBidWZmZXIgRFRTCisJICBpbnN0ZWFkIG9mIHRoZSBQVFMuIEhvd2V2ZXIsIGlmIHRoZXJlJ3Mgbm8gRFRTIHNldCBidXQgb25seSB0aGUgUFRTCisJICB0aGVuIGp1c3QgdGFrZSB0aGUgUFRTIGluc3RlYWQgb2YgZHJvcHBpbmcgdGhlIGlucHV0IGJ1ZmZlci4gVGhpcworCSAgaXMgdXNlZnVsIGVzcGVjaWFsbHkgZm9yIEktZnJhbWUgb25seSBjb2RlY3MgbGlrZSBKUEVHIGFuZCBodWZmeXV2LAorCSAgYnV0IHNob3VsZCBhbHNvIGJlIGZpbmUgYXMgZmFsbGJhY2sgaW4gZ2VuZXJhbC4KKwkgIEZpeGVzIHJlZ3Jlc3Npb24gd2l0aCBpbnB1dCBKUEVHIGZyYW1lcyB0aGF0IG9ubHkgaGF2ZSBQVFMgc2V0IG9uIHRoZW0uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU2OTY3CisKKzIwMTUtMTAtMjQgMjM6NTc6MzggKzAyMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwbGl0bXV4LmM6CisJICB0ZXN0cy9jaGVjay9zcGxpdG11eDogdGVzdCB0aGF0IHRoZSByZWxlYXNlX3BhZCB2ZnVuYyBvZiBzcGxpdG11eHNpbmsgYWN0dWFsbHkgcmVsZWFzZXMgcGFkcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MzYyMgorCisyMDE1LTEwLTI0IDIzOjU3OjI5ICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXhzaW5rOiBkbyBub3QgZGVzdHJveSB0aGUgbXVsdGlxdWV1ZSAmIG11eGVyIHdoZW4gZ29pbmcgdG8gTlVMTAorCSAgSW5zdGVhZCwgZGVsYXkgaXQgdW50aWwgYWxsIHJlcXVlc3QgcGFkcyBoYXZlIGJlZW4gcmVsZWFzZWQuIFRoaXMgaXMKKwkgIGJlY2F1c2UgdGhlIHJlbGVhc2VfcGFkKCkgdmZ1bmMgcmVxdWlyZXMgdGhlIG11bHRpcXVldWUgYW5kIG11eGVyIHRvCisJICBiZSB0aGVyZSBpbiBvcmRlciB0byByZWxlYXNlIHRoZWlyIHJlcXVlc3QgcGFkcyBhcyB3ZWxsLiBJZiB0aG9zZQorCSAgZWxlbWVudHMgYXJlIGRlc3Ryb3llZCBlYXJsaWVyLCByZWxlYXNlX3BhZCgpIGRvZXMgbm90IHdvcmssIG5vCisJICBwYWRzIGFyZSByZWxlYXNlZCBhbmQgc29tZSByZXNvdXJjZXMgYXJlIGxlYWtlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM2MjIKKworMjAxNS0xMC0yMCAxNToyODoxMCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBSZWFkIGJ1ZmZlciB0aW1lc3RhbXAgKmFmdGVyKiBhY3R1YWxseSBzZXR0aW5nIGl0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU2ODA5CisKKzIwMTUtMTAtMjQgMTc6MTQ6MDcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uaDoKKwkgIHNjYWxldGVtcG86IEZpeCBoYW5kbGluZyBvZiByYXRlIDwgMAorCSAgV2UgaGF2ZSB0byByZXZlcnNlIGFsbCBzYW1wbGVzIGluIGEgYnVmZmVyIGJlZm9yZSBwcm9jZXNzaW5nIHRoZW0gdG8gcHJvcGVybHkKKwkgIGhhdmUgY29udGludW91cyBkYXRhIGZyb20gb25lIGJ1ZmZlciB0byBhbm90aGVyLiBBcyBhIHJlc3VsdCB3ZSB3aWxsIGhhdmUgYQorCSAgbmVnYXRpdmUgYXBwbGllZCByYXRlIGFuZCBhIHJhdGUgb2YgMS4wLgorCSAgQWxzbyBtYWtlIHN1cmUgdGhhdCBpbnB1dCBidWZmZXJzIGFyZSBjb3JyZWN0bHkgY2xpcHBlZCB0byB0aGUgc2VnbWVudCwKKwkgIG90aGVyd2lzZSBvdXIgY2FsY3VsYXRpb25zIGFyZSBnb2luZyB0byBnbyB3cm9uZy4KKwkgIEFsc28gY29weSBvdmVyIHRoZSBzZWdtZW50IGV2ZW50J3Mgc2VxdWVuY2UgbnVtYmVyIHRvIHRoZSBvdXRwdXQgc2VnbWVudCB3aGlsZQorCSAgd2UncmUgYXQgaXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU3MDMzCisKKzIwMTUtMTAtMTkgMTg6MDQ6NTYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogYnJlYWsgYXMgc29vbiBhcyBub24taW50ZXJsYWNlZCBpZiBmb3VuZAorCSAgSXQgbG9va3MgZm9yIGEgbm9uLWludGVybGFjZWQgZW50cnkgb24gdGhlIGZpbHRlciBjYXBzLCBicmVhaworCSAgYXMgc29vbiBhcyBvbmUgaXMgZm91bmQgdG8gYXZvaWQgd2FzdGluZyBjcHUKKworMjAxNS0xMC0xOSAxNzo1MDoyOCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBpbXBsZW1lbnQgYWNjZXB0LWNhcHMKKwkgIEltcGxlbWVudCBhY2NlcHQtY2FwcyBoYW5kbGVyIHRvIGF2b2lkIGRvaW5nIGEgZnVsbCBjYXBzIHF1ZXJ5CisJICBkb3duc3RyZWFtIHRvIGhhbmRsZSBpdC4KKwkgIFRoaXMgY29tbWl0IGltcGxlbWVudHMgYWNjZXB0LWNhcHMgYXMgYSBzaW1wbGlmaWNhdGlvbiBvZiB0aGUgX2dldGNhcHMKKwkgIGZ1bmN0aW9uLCBzbyBpdCBleHBvc2VzIHRoZSBzYW1lIGxpbWl0YXRpb25zIHRoYXQgZ2V0Y2FwcyB3b3VsZC4KKwkgIEZvciBleGFtcGxlLCBub3QgYWNjZXB0aW5nIHJlbmVnb3RpYXRpb24gdG8gY2FwcyB3aXRoIGNhcHNmZWF0dXJlcyB3aGVuCisJICBpdCB3YXMgbGFzdCBjb25maWd1cmVkIHRvIGEgY2FwcyB0aGF0IGl0IGhhcyB0byBkZWludGVybGFjZS4KKworMjAxNS0xMC0xOSAxNzowNjoyOCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGFjZS5jOgorCSAgdGVzdHM6IGRlaW50ZXJsYWNlOiBmaXggc21hbGwgdHlwbyBpbiBjb21tZW50CisKKzIwMTUtMTAtMjYgMDA6NDE6MjggKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9maWxlcy9NYWtlZmlsZS5hbToKKwkgIGNoZWNrOiBEaXN0IHNwbGl0dmlkZW8wWzAxMl0ub2dnIHRlc3QgZmlsZXMuCisKKzIwMTUtMTAtMjMgMjA6MTY6MTcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uaDoKKwkgIHNjYWxldGVtcG86IEFkZCBzdXBwb3J0IGZvciBGNjQKKworMjAxNS0xMC0yMiAxNzo0MDozOCAtMDcwMCAgTWlzY2hhIFNwaWVnZWxtb2NrIDxtc3BpZWdlbG1vY2tAZ21haWwuY29tPgorCisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkqIGdzdC9ydHAvUkVBRE1FOgorCSogZ3N0L3J0cC9nc3RydHB2cDhwYXkuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHJlY2VpdmUuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICBkb2NzOiBNaW5vciBmaXhlcyBpbiB2YXJpb3VzIHBsYWNlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1Njk5NgorCisyMDE1LTEwLTIxIDE3OjQzOjMxICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvZ29vbS9wbHVnaW5faW5mby5jOgorCSAgZ29vbTogcmVtb3ZlIGNvbXBpbGVyIHRyaWNrCisJICBBZnRlciBjb21taXQgMmNiNmNmZWQyMjE2NmIyNjJhZTUwY2I1OGYzZmYxMWRkOGJhOTFmOSB0aGVyZSBpcyBubyBuZWVkIHRvCisJICB0cmljayB0aGUgY29tcGlsZXIgYW55bW9yZSBhYm91dCB0aGUgdXNhZ2Ugb2YgdmFyaWFibGUgY3B1Rmxhdm91ci4KKworMjAxNS0xMC0yMSAxNDozNTowMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGI5OTgwMGEgdG8gYjMxOTkwOQorCisyMDE1LTEwLTIxIDE3OjQxOjM4ICswNTMwICBSYXZpIEtpcmFuIEsgTiA8cmF2aS5raXJhbkBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuaDoKKwkgIGF1ZGlvZng6IHJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKwkgIFJlbW92ZSB1bnN1ZWQgdmFyaWFibGUgaGF2ZV9jb2VmZnMgaW4gYXVkaW9meGJhc2VpaXJmaWx0ZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTY5MDUKKworMjAxNS0xMC0yMCAxNzoyOTo0MiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgVXNlIG5ldyBHU1RfRU5BQkxFX0VYVFJBX0NIRUNLUyAjZGVmaW5lCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU2ODcwCisKKzIwMTUtMTAtMjEgMTQ6MjU6NTUgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIFJFQURNRToKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA5YWVkMWQ3IHRvIGI5OTgwMGEKKworMjAxNS0xMC0yMSAxMTo1MzowOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IHJlbGF4IGNyZWF0aW9uIHRpbWUgcGFyc2luZworCSAgUGFyc2Ugd3JvbmcgdGltZXN0YW1wcyBsaWtlIHdlIHVzZWQgdG8gd3JpdGUgYXMgd2VsbCwKKwkgIGUuZy4gMTA6OTo0MiwgYW5kIHRoZSBob3VyIG1pZ2h0IGJlIHdpdGhvdXQgYSBsZWFkaW5nCisJICB6ZXJvIGluIGFueSBjYXNlLgorCisyMDE1LTEwLTIxIDExOjQ1OjM1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogZml4IGluZGVudGF0aW9uCisKKzIwMTUtMTAtMjEgMTE6NDQ6NTAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBleHRyYWN0IGJvdGggY3JlYXRpb24gZGF0ZSBhbmQgdGltZQorCSAgQmVmb3JlIHdlIG9ubHkgZXh0cmFjdGVkIHRoZSBkYXRlIHBhcnQuCisKKzIwMTUtMTAtMjEgMTE6MTY6MDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IGZpeCB3cml0aW5nIG9mIGNyZWF0aW9uIHRpbWUKKwkgIERvbid0IHdyaXRlIHRpbWUgYXMgZS5nLiAxMTo5OjQyCisKKzIwMTUtMTAtMTMgMTI6NDI6NTYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkgIHJ0cGoya3BheTogdXBkYXRlIGZyYWdtZW50IG9mZnNldAorCSAgSXQgd2FzIGFsd2F5cyBiZWluZyBzZXQgdG8gMCwgbWFraW5nIHRoZSByZXN1bHRpbmcgc3RyZWFtIGJyb2tlbgorCSAgZm9yIHRoZSByZWNlaXZlcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NjQyMgorCisyMDE1LTEwLTE5IDE1OjM2OjM3ICswMzAwICBSeWFuIEhlbmRyaWNrc29uIDxyeWFuLmhlbmRyaWNrc29uQGFsdW0ubWl0LmVkdT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IERvbid0IHVuY29uZGl0aW9uYWxseSB1c2Ugc3RybmxlbigpCisJICBJdCdzIG5vdCBhdmFpbGFibGUgb24gb2xkZXIgT1NYIGFuZCB3ZSBjYW4gYXMgd2VsbCB1c2UgbWVtY2hyKCkgaGVyZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTYxNTQKKworMjAxNS0xMC0xOSAxNzozODozMiArMDkwMCAgVmluZWV0aCBUTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSAgYXVwYXJzZTogRml4IGV2ZW50IG1lbW9yeSBsZWFrCisJICBGcmVlIHRoZSBldmVudCBhZnRlciBiZWluZyBoYW5kbGVkIHRvIHByZXZlbnQgbWVtb3J5IGxlYWsuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU2Nzk5CisKKzIwMTUtMTAtMTkgMDk6MTQ6MTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXhtYXAuYzoKKwkgIHF0bXV4OiB1bmlmeSByYXcgYXVkaW8gY2FwcyBpbnRvIGEgc2luZ2xlIGNhcHMgc3RydWN0dXJlCisKKzIwMTUtMTAtMTQgMTU6NDI6NTAgLTA3MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgc3VwcG9ydCBmb3IgRkZWMSBjb2RlZCBzdHJlYW1zIGluIG1vdgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjQ5NQorCisyMDE1LTEwLTE0IDE1OjUzOjI2ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IEVPUyBpbW1lZGlhdGVseSBpZiB3ZSBoYXZlIGFuIGVtcHR5IHNlZWsgc2VnbWVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0ODMxNgorCisyMDE1LTEwLTE0IDEwOjQzOjE5ICswMzAwICBTdGF2cm9zIFZhZ2lvbml0aXMgPHN0YXZyb3N2QGRpZ2lzb2Z0LnR2PgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IE1ha2Ugbm9uLWluY2x1c2l2ZSBzZWdtZW50IGJvdW5kYXJpZXMgaW5jbHVzaXZlCisJICBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZSBmaWxlc3JjIGFuZCBzb3VwaHR0cHNyYyBhcmUgYmVoYXZpbmcKKwkgIGRpZmZlcmVudGx5IHJlZ2FyZGluZyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIHNlZ21lbnQgYm91bmRhcmllcy4gVGhlCisJICBmaWxlc3JjIGlzIHVzaW5nIGEgbm9uLWluY2x1c2l2ZSBib3VuZGFyaWVzLCB3aGlsZSB0aGUgc291cGh0dHBzcmMKKwkgIHVzZXMgaW5jbHVzaXZlLiBDdXJyZW50bHkgdGhlIGhsc2RlbXV4IGNhbGN1bGF0ZXMgdGhlIGJvdW5kYXJpZXMgYXMKKwkgIGluY2x1c2l2ZSwgc28gZm9yIHRoaXMgcmVhc29uIHRoZXJlIGlzIG5vIHByb2JsZW0gd2l0aCB0aGUgc291cGh0dHBzcmMsCisJICBidXQgdGhlcmUgaXMgYW4gaXNzdWUgaW4gdGhlIGZpbGVzcmMuCisJICBUaGUgR3N0U2VnbWVudCBpcyBub24taW5jbHVzaXZlLCBzbyB0aGUgcHJvcG9zZWQgc29sdXRpb24gaXMgdG8gdXNlCisJICBub24taW5jbHVzaXZlIGJvdW5kYXJpZXMgaW4gdGhlIGhsc2RlbXV4IGluIG9yZGVyIHRvIGJlIGNvbnNpc3RlbnQuCisJICBNYWtlIHRoZSBjaGFuZ2UgaW4gdGhlIGhsc2RlbXV4LCB3aWxsIGJyZWFrIHRoZSBzb3VwaHR0cHNyYywgd2hpY2gKKwkgIHdpbGwgZXhwZWN0IGluY2x1c2l2ZSBib3VuZGFyaWVzLCBidXQgdGhlIGhsc2RlbXV4IHdpbGwgb2ZmZXIKKwkgIG5vbi1pbmNsdXNpdmUuIFRoaXMgY2hhbmdlIG1ha2VzIHN1cmUgdGhhdCB0aGUgbm9uLWluY2x1c2l2ZQorCSAgYm91bmRhcmllcyBhcmUgY29udmVydGVkIHRvIGluY2x1c2l2ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDgzMTYKKworMjAxNS0xMC0xMSAyMjowNzo1NCArMDAwMCAgR3JhaGFtIExlZ2dldHQgPG1pbmZyaW5Ac2hhcnAuZm0+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmg6CisJICBzb3VwaHR0cGNsaWVudHNpbms6IEFkZCB0aGUgcmV0cnkgYW5kIHJldHJ5LWRlbGF5IHByb3BlcnRpZXMKKwkgIFRoZXNlIGFsbG93IGEgZmFpbGVkIHJlcXVlc3QgdG8gYmUgcmV0cmllZCBhZnRlciB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHNlY29uZHMKKwkgIGluc3RlYWQgb2YgZmFpbGluZyB0aGUgcGlwZWxpbmUuIFRha2UgYWNjb3VudCBvZiB0aGUgUmV0cnktQWZ0ZXIgaGVhZGVyIGlmCisJICBwcmVzZW50LiBBZGQgcmV0cmllcyBwYXJhbWV0ZXIgdGhhdCBjb250cm9scyB0aGUgbnVtYmVyIG9mIHRpbWVzIGFuIEhUVFAKKwkgIHJlcXVlc3Qgd2lsbCBiZSByZXRyaWVkIGJlZm9yZSBmYWlsaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NjMxOAorCisyMDE1LTEwLTE0IDEyOjAzOjE1ICswMjAwICBHdWlsbGF1bWUgRGVzbW90dGVzIDxndWlsbGF1bWUuZGVzbW90dGVzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggY2FwcyBsZWFrCisJICBJZiB0aGUgUXREZW11eFN0cmVhbSBhcmUgcmUtdXNlZCB0aGV5IG1heSBhbHJlYWR5IGhhdmUgY2FwcyB3aGljaCB1c2VkCisJICB0byBiZSBsZWFrZWQuCisJICBSZXByb2R1Y2VkIHVzaW5nIHRoZQorCSAgdmFsaWRhdGUuZGFzaC5wbGF5YmFjay5zZWVrX2ZvcndhcmQuZGFzaF9leE1QRF9CSVBfVEMxIHZhbGlkYXRlCisJICBzY2VuYXJpby4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTY1NjEKKworMjAxNS0xMC0xNCAwOToyOTo1MCArMDkwMCAgVmluZWV0aCBUTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBGaXggdGFnbGlzdCBtZW1vcnkgbGVhaworCSAgRnJlZSB0aGUgc3RyZWFtIGFuZCBpdHMgc3ViIGl0ZW1zIGluc3RlYWQgb2YganVzdCB0aGUgc3RyZWFtCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU2NTQ0CisKKzIwMTUtMTAtMTEgMTI6MDY6MjYgKzAxMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRzYXVuaWVyQGdub21lLm9yZz4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eG1hcC5jOgorCSAgcXRtdXg6IEFsbG93IG5lZ290aWF0aW5nIHRvIFM4IGFzIGEgcmF3IGZvcm1hdCBidXQgc3RvcCBtYWtpbmcgaXQgYmVzdCBjaG9pY2UKKwkgIE5lZ290aWF0aW9uIHRvIGF1ZGlvL3gtcmF3LGZvcm1hdD1TOCB3YXMgbm90IHBvc3NpYmxlIGJlY2F1c2UgUzggZG9lcworCSAgbm90IGhhdmUgYSBiaXQgb3JkZXIgc28gd2UgZW5kZWQgdXAgZG9pbmcgYGlmICghZW50cnkuZm91cmNjKSBnb3RvIHJlZnVzZV9jYXBzO2AKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTYzODcKKworMjAxNS0xMC0xMSAwOToxODo0MCArMDEwMCAgVGhpYmF1bHQgU2F1bmllciA8dHNhdW5pZXJAZ25vbWUub3JnPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogQWRkIHByb3JlcyBzdXBwb3J0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU2Mzg4CisKKzIwMTUtMTAtMTIgMTg6NTY6MzIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgdGVzdHM6IGFkZCBHU1RfUExVR0lOU19CQVNFX0xJQlMgZm9yIGZsdmRlbXV4IGNoZWNrCisJICBTbyBpdCBwdWxscyBpbiB0aGUgcmlnaHQgbGliZ3N0dGFnLTEuMC4KKworMjAxNS0xMC0xMSAyMjoyNzo0NyArMDEwMCAgSnVsaWVuIElzb3JjZSA8ai5pc29yY2VAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9nb29tL01ha2VmaWxlLmFtOgorCSogZ3N0L2dvb20vZ3N0YXVkaW92aXN1YWxpemVyLmM6CisJKiBnc3QvZ29vbS9nc3RhdWRpb3Zpc3VhbGl6ZXIuaDoKKwkqIGdzdC9nb29tL2dzdGdvb20uaDoKKwkqIGdzdC9nb29tMmsxL01ha2VmaWxlLmFtOgorCSogZ3N0L2dvb20yazEvZ3N0YXVkaW92aXN1YWxpemVyLmM6CisJKiBnc3QvZ29vbTJrMS9nc3RhdWRpb3Zpc3VhbGl6ZXIuaDoKKwkqIGdzdC9nb29tMmsxL2dzdGdvb20uaDoKKwkgIGdvb20vZ29vbTJrMTogcmVtb3ZlIG9ic29sZXRlIGxlZnQgb3ZlciBmaWxlcworCSAgVGhleSBub3cgdXNlIHRoZSBuZXcgR3N0QXVkaW9WaXN1YWxpemVyIGJhc2UgY2xhc3MKKwkgIGZyb20gZ3N0LXBsdWdpbnMtYmFzZS9nc3QtbGlicy9nc3QvcGJ1dGlscworCSAgQWxzbyBmaXhlZCB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGdzdF9hdWRpb192aXN1YWxpemVyX2dldF90eXBlCisJICBBZGRlZCBHU1RfUExVR0lOU19CQVNFX0xJQlMgdG8gTWFrZWZpbGUuYW0gYW5kIHJlLW9yZGVyIExJQkFERC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDI4NzUKKworMjAxNS0xMC0xMiAxMDo0ODoyMyArMDkwMCAgVmluZWV0aCBUTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSAgbXBlZ2F1ZGlvcGFyc2U6IEZpeCBidWZmZXIgbWVtb3J5IGxlYWsgZHVyaW5nIGZhaWx1cmVzCisJICBtYXBwZWQgYnVmZmVyIGlzIG5vdCBiZWluZyB1bm1hcHBlZCBkdXJpbmcgZmFpbHVyZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTYyMzEKKworMjAxNS0xMC0xMiAxMToxODo1MSArMDkwMCAgVmluZWV0aCBUTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJICBzb3VwaHR0cGNsaWVudHNpbms6IENoZWNrIGlmIHNvdXAgbWVzc2FnZSBpcyBjcmVhdGVkCisJICBJZiBzb3VwIG1lc3NhZ2UgaXMgbm90IGNyZWF0ZWQgdGhlbiB0aGUgc2FtZSBzaG91bGQgbm90IGJlIHBhc3NlZAorCSAgb24sIHdoaWNoIGlzIHJlc3VsdGluZyBpbiBzZWdmYXVsdC4gSGVuY2UgdGhyb3dpbmcgYSB3YXJuaW5nIG1lc3NhZ2UKKwkgIGFuZCByZXR1cm5pbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTUzMjYKKworMjAxNS0xMC0xMiAxMToxNToxNSArMDkwMCAgVmluZWV0aCBUTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJICBzb3VwaHR0cGNsaWVudHNpbms6IENoZWNrIGlmIGxvY2F0aW9uIGJlaW5nIHNldCBpcyB2YWxpZAorCSAgQWRkaW5nIGEgY2hlY2sgaW4gc2V0X3Byb3BlcnR5IHRvIGZpbmQgaWYgdGhlIGxvY2F0aW9uIHVyaSBpcyB2YWxpZAorCSAgYW5kIHByaW50aW5nIHdhcm5pbmcgaWYgbm90IHZhbGlkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NTMyNgorCisyMDE1LTEwLTEyIDExOjA5OjMwICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkgIHNvdXBodHRwY2xpZW50c2luazogRml4IG1lbW9yeSBsZWFrcyBkdXJpbmcgZmFpbHVyZXMKKwkgIGZyZWVpbmcgc3RyZWFtaGVhZGVyX2J1ZmZlcnMgYW5kIHNlbnRfYnVmZmVycyBkdXJpbmcgZmFpbHVyZSBjYXNlcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTUzMjYKKworMjAxNS0xMC0xMiAxMTowMzoxNyArMDkwMCAgVmluZWV0aCBUTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJICBzb3VwaHR0cGNsaWVudHNpbms6IFJlcGxhY2UgcmVkdW5kYW50IGZyZWVfYnVmZmVyX2xpc3QgZnVuY3Rpb24KKwkgIFJlbW92aW5nIGZyZWVfYnVmZmVyX2xpc3QgYW5kIHJlcGxhY2luZyBpdCB3aXRoIGFscmVhZHkgYXZhaWxhYmxlIGZ1bmN0aW9uCisJICBnX2xpc3RfZnJlZV9mdWxsCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1MzI2CisKKzIwMTUtMTAtMTEgMTY6NDA6MDEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgY2hlY2s6IERvbid0IGZvcmdldCBiYXNlIENGTEFHUyBmb3IgZmx2ZGVtdXggY2hlY2sKKwkgIGVsZW1lbnRzL2ZsdmRlbXV4LmM6MjU6MjU6IGZhdGFsIGVycm9yOiBnc3QvdGFnL3RhZy5oOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisKKzIwMTUtMTAtMTEgMTE6Mzc6NTEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgbWF0cm9za2FtdXg6IENyZWF0ZSBhIFRJTUUgc2VnbWVudCB3aGVuIGNyZWF0aW5nIHN0cmVhbWFibGUgb3V0cHV0CisJICBSZWxhdGVkIHRvIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTQ0MzUgd2hpY2gKKwkgIGRvZXMgdGhlIHNhbWUgZm9yIGZsdm11eC4KKworMjAxNS0wOS0yMyAxMzo1MDo1MiArMDIwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiBnc3QvZmx2L01ha2VmaWxlLmFtOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9mbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IG91dHB1dCBzcGVleCB2b3JiaXNjb21tZW50IGFzIGEgR3N0VGFnTGlzdAorCSAgVGhpcyBpcyB3aGF0IHNwZWV4ZGVjIGV4cGVjdHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1NDc4CisKKzIwMTUtMDktMjIgMjI6NTk6MTYgKzAyMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQGdtYWlsLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2Zsdm11eC5jOgorCSAgZmx2bXV4OiBHU1RfQlVGRkVSX09GRlNFVHMgc2hvdWxkIGJlIEdTVF9CVUZGRVJfT0ZGU0VUX05PTkUKKwkgIE9yIGVsc2UgZmx2ZGVtdXggZG9uJ3QgdW5kZXJzdGFuZCBpdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NDQzNQorCisyMDE1LTA5LTAyIDEwOjQ0OjU5ICswMjAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkBnbWFpbC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9mbHZtdXguYzoKKwkgIGZsdm11eDogdXNlIHRpbWUgc2VnbWVudCBhbmQgY29weSB0aW1lc3RhbXBzIHdoZW4gc3RyZWFtYWJsZQorCSAgQWRkIGEgYmFzaWMgdGVzdCB1c2luZyBzcGVleCBkYXRhIHRvIHZlcmlmeSB0aW1lc3RhbXBpbmcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU0NDM1CisKKzIwMTUtMDktMjMgMTM6MTQ6MDMgKzAyMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQGdtYWlsLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IHNwZWV4IGlzIGFsc28gYWx3YXlzIDE2S0h6CisJICBUaGlzIGlzIGp1c3QgYSBjb3NtZXRpYyBjaGFuZ2UgZm9yIHRoZSBsb2dzLCBzaW5jZSB0aGUgcmlnaHQgY2FwcworCSAgZm9yIFNwZWV4IGlzIGJlaW5nIHNldCBlbHNld2hlcmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1NDc5CisKKzIwMTUtMDctMTQgMTU6MTk6NDQgKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBtYW5hZ2VyOiBBZGQgJ3NvdXJjZS1zdGF0cycgdG8gc3RhdHMgYW5kIG5vdGlmeQorCSAgQWRkIHN0YXRpdGljcyBmcm9tIGVhY2ggcnRwIHNvdXJjZSB0byB0aGUgcnRwIHNlc3Npb24gcHJvcGVydHkuCisJICAnc291cmNlLXN0YXRzJyBpcyBhIEdWYWx1ZUFycmF5IHdoZXJlIGVhY2ggZWxlbWVudCBpcyBhIEdzdFN0cnVjdHVyZSBvZgorCSAgc3RhdHMgZm9yIG9uZSBydHAgc291cmNlLgorCSAgVGhlIGF2YWlsYWJpbGl0eSBvZiBuZXcgc3RhdHMgaXMgc2lnbmFsZWQgdmlhIGdfb2JqZWN0X25vdGlmeS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTI2NjkKKworMjAxNS0wNi0wNSAxNzoyMDozMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjogSW1wbGVtZW50IHNlbmRpbmcgb2YgcmVkdWNlZCBzaXplIFJUQ1AgcGFja2V0cworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MDQ1NgorCisyMDE1LTEwLTA4IDE1OjAxOjEzICswNTMwICBSYXZpIEtpcmFuIEsgTiA8cmF2aS5raXJhbkBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmg6CisJICBhdWRpb2Z4OiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlCisJICBSZW1vdmUgdW51c2VkIHZhcmlhYmxlICdkZWdyZWUnIGluIGF1ZGlvZHluYW1pYworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NjIzNAorCisyMDE1LTEwLTA4IDE0OjQ0OjA3ICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBtZW1vcnkgbGVhayBmb3IgY29ycnVwdGVkIGZpbGUKKwkgIEZyZWUgYnJhbmRzIGJlZm9yZSBvdmVycmlkaW5nIHRoZW0uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU2MjI2CisKKzIwMTUtMTAtMDggMTE6NDQ6MDQgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZmRlYy5jOgorCSAgZ2RrcGl4YnVmZGVjOiBGaXggcGl4YnVmX2xvYWRlciBsZWFrIGR1cmluZyBmYWlsdXJlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NjIxOQorCisyMDE1LTEwLTA3IDIzOjIzOjQ1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogQWRkIG1pc3NpbmcgYnJlYWsKKworMjAxNS0xMC0wNyAxMzowMzowMiArMDIwMCAgTWlndWVsIFBhcsOtcyBEw61heiA8bXBhcmlzZGlhekBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgcnRwbWFuYWdlcjogVGFrZSBpbnRvIGFjY291bnQgcGFja2V0IHJhdGUgZm9yIG1heC1kcm9wb3V0IGFuZCBtYXgtbWlzb3JkZXIgY2FsY3VsYXRpb25zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxMzExCisKKzIwMTUtMTAtMDcgMTM6MDI6MTIgKzAyMDAgIE1pZ3VlbCBQYXLDrXMgRMOtYXogPG1wYXJpc2RpYXpAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oOgorCSAgcnRwbWFuYWdlcjogYWRkICJtYXgtZHJvcG91dC10aW1lIiBhbmQgIm1heC1taXNvcmRlci10aW1lIiBwcm9wcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTMxMQorCisyMDE1LTEwLTA3IDE3OjE0OjU3ICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogRml4IGRhdGUgbWVtb3J5IGxlYWsKKwkgIFdoZW4gZ2V0dGluZyBkYXRlIGZyb20gdGFnbGlzdCwgdGhlIG1lbW9yeSBzaG91bGQgYmUgZnJlZWQgYWZ0ZXIKKwkgIHVzaW5nIGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NjE3MQorCisyMDE1LTEwLTA1IDExOjAzOjM4ICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogRml4IHNhbXBsZSBtZW1vcnkgbGVhaworCSAgV2hlbiBnZXR0aW5nIHNhbXBsZSBmcm9tIHRhZ2xpc3QsIHRoZSBtZW1vcnkgc2hvdWxkIGJlIGZyZWVkIGFmdGVyCisJICB1c2luZyBpdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTYwNjgKKworMjAxNS0xMC0wNSAxMzoxMDo1NiArMDkwMCAgVmluZWV0aCBUTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzoKKwkgIGN1dHRlcjogRml4IGJ1ZmZlciBsZWFrCisJICBCdWZmZXIgaXMgYWRkZWQgdG8gdGhlIGludGVybmFsIGNhY2hlLCBhbmQgcHVzaGVkIG9ubHkgd2hlbiBhY2N1bXVsYXRlZAorCSAgYnVmZmVyIGR1cmF0aW9uIGNyb3NzZXMgMjAwIG1zLiBTbyB3aGVuIHRoZSBjaGFpbiBlbmRzLCB0aGUgYnVmZmVyIGFjY3VtdWxhdGVkCisJICBpcyBub3QgZnJlZWQuIEZyZWVpbmcgdGhlIGNhY2hlIHdoZW4gdGhlIHN0YXRlIGNoYW5nZXMgZnJvbSBQQVVTRUQgdG8gUkVBRFkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU0MjEyCisKKzIwMTUtMDgtMzEgMjE6MTA6MTYgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBVc2UgZGVmYXVsdCB1cHN0cmVhbSBldmVudCBoYW5kbGluZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjY5NAorCisyMDE1LTA4LTMxIDIxOjA1OjAzIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5oOgorCSAgcnRwbXV4OiBBcyAweEZGRkZGRkZGIGlzIGEgdmFsaWQgc3NyYywgY2hlY2sgaWYgaXQgaGFzIGJlZW4gc2V0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyNjk0CisKKzIwMTUtMDctMjIgMDk6NDc6MjIgKzAyMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cG11eC5jOgorCSAgZ3N0cnRwbXV4OiBhbGxvdyB0aGUgc3NyYy1wcm9wZXJ0eSB0byBkZWNpZGUgc3NyYyBvbiBvdXRnb2luZyBidWZmZXJzCisJICBCeSBub3QgZG9pbmcgdGhpcywgdGhlIG11eGVyIGlzIG5vdCBlZmZlY3RpdmVseSBhIHJ0cG11eGVyLCByYXRoZXIgYQorCSAgZnVubmVsLCBzaW5jZSBpdCBzaG91bGQgYmUgYSBzaW5nbGUgc3RyZWFtIHRoYXQgZXhpc3RzIHRoZSBtdXhlci4KKwkgIElmIG5vdCBzcGVjaWZpZWQsIHRha2UgdGhlIGZpcnN0IHNzcmMgc2VlbiBvbiBhIHNpbmtwYWQsIGFsbG93aW5nIHVwc3RyZWFtCisJICB0byBkZWNpZGUgc3NyYyBpbiAicGFzc3Rocm91Z2giIHdpdGggb25seSBvbmUgc2lua3BhZC4KKwkgIEFsc28sIGxldCBkb3duc3RyZWFtIHNzcmMgb3ZlcnJ1bGUgaW50ZXJuYWwgY29uZmlndXJlZCBvbmUKKwkgIFdlIGhlbmNlIGhhcyB0aGUgZm9sbG93aW5nIG9yZGVyIGZvciBkZXRlcm1pbmluZyB0aGUgc3NyYyB1c2VkIGJ5CisJICBydHBtdXg6CisJICAwLiBTdWdnZXN0aW9uIGZyb20gR3N0UlRQQ29sbGlzaW9uIGV2ZW50CisJICAxLiBEb3duc3RyZWFtIGNhcHMKKwkgIDIuIHNzcmMtUHJvcGVydHkKKwkgIDMuIChGaXJzdCkgdXBzdHJlYW0gY2FwcyBjb250YWluaW5nIHNzcmMKKwkgIDQuIFJhbmRvbWx5IGdlbmVyYXRlZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjY5NAorCisyMDE1LTEwLTAyIDIyOjQyOjIwICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBGaXh1cCBsYXN0IGNvbW1pdAorCisyMDE1LTEwLTAyIDIyOjIxOjQ1ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgVXBkYXRlIEdMaWIgZGVwZW5kZW5jeSB0byAyLjQwLjAKKworMjAxNS0wNi0zMCAxNjo1NjoxOSArMDIwMCAgTWlndWVsIFBhcsOtcyBEw61heiA8bXBhcmlzZGlhekBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgcnRwc3RhdHM6IGFkZCB1dGlsaXR5IGZvciBjYWxjdWxhdGluZyBSVFAgcGFja2V0IHJhdGUKKworMjAxNS0wOC0xMCAxODoxNDozOSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGhhbmRsZSBlbXB0eSBzZWdtZW50cyBpbiBzZWVraW5nIGFkanVzdAorCSAgSWYgc2Vla2luZyB0YXJnZXRzIGFuIGVtcHR5IHNlZ21lbnQgc2tpcCBpdCBhcyB0aGVyZSBpcyBubyBtZWRpYQorCSAgb2Zmc2V0IHRvIGdldCBmcm9tIGl0LiBJbnN0ZWFkIGxvb2sgZm9yIHRoZSBuZXh0IG9uZS4KKwkgIFRoaXMgZG9lc24ndCBtYWtlIHNlZWtpbmcgaW4gcHVzaC1tb2RlIHdvcmsgaWYgeW91IHNlZWsgdG8gYW4KKwkgIGVtcHR5IHNlZ21lbnQgYnV0IGF0IGxlYXN0IHdvbid0IGdldCB5b3UgdG8gd3Jvbmcgb2Zmc2V0cy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM0ODQKKworMjAxNS0wNC0xNyAxNDoyNTo0MyArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmg6CisJICBzcGxpdG11eHNpbms6IHBvc3QgbWVzc2FnZXMgd2hlbiBmcmFnbWVudHMgYXJlIGJlaW5nIG9wZW5lZCBhbmQgY2xvc2VkCisJICBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8gdHJhY2sgdGhlIGNyZWF0ZWQgZnJhZ21lbnRzCisJICAodG8gbG9nIHRoZW0gaW4gYSByZWNvcmRpbmcgZGF0YWJhc2UsIGZvciBleGFtcGxlKQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MDEwOAorCisyMDE1LTA0LTI5IDE4OjIzOjI4ICswMTAwICBSYW1pcm8gUG9sbGEgPHJhbWlyby5wb2xsYUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSAgc3BsaXRtdXhzaW5rOiBhbGxvdyBub24tdmlkZW8gc3RyZWFtcyB0byBzZXJ2ZSBhcyByZWZlcmVuY2UKKwkgIEluIHRoZSBhYnNlbmNlIG9mIGEgdmlkZW8gc3RyZWFtLCB0aGUgZmlyc3Qgc3RyZWFtIHdpbGwgYmUgdXNlZCBhcworCSAgcmVmZXJlbmNlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MzYxNworCisyMDE1LTA3LTIyIDE3OjQ1OjEyICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXhzaW5rOiBpbml0aWFsaXplIG11eF9zdGFydF90aW1lIHByb3Blcmx5CisJICBtdXhfc3RhcnRfdGltZSByZWZlcnMgdG8gdGhlIHJ1bm5pbmdfdGltZSBvZiB0aGUgYnVmZmVyCisJICB0aGF0IGdvZXMgZmlyc3QgaW4gdGhlIG91dHB1dCBmaWxlLiBOb3JtYWxseSB0aGlzIHRpbWUgaXMKKwkgIDAsIHNvIHRoaXMgdmFyaWFibGUgaXMgaW5pdGlhbGl6ZWQgdG8gMCBkdXJpbmcgdGhlIHN0YXRlCisJICBjaGFuZ2UgdG8gUEFVU0VELgorCSAgSG93ZXZlciwgd2hlbiBkZWFsaW5nIHdpdGggZHluYW1pYyBwaXBlbGluZXMgYW5kIHN0YXJ0aW5nCisJICBhIHJlY29yZGluZyB3aGlsZSB0aGUgcGlwZWxpbmUgaGFzIGFscmVhZHkgcnVuIGZvciBhIHdoaWxlLAorCSAgdGhlIHJ1bm5pbmdfdGltZSBvZiB0aGUgZmlyc3QgYnVmZmVyIGlzID4gMCBhbmQgdGhpcyBjYXVzZXMKKwkgIGEgcHJvYmxlbSB3aXRoIGRldGVjdGluZyB0aGUgZW5kIG9mIHRoZSBmaXJzdCBmaWxlKHMpIHdoZW4KKwkgIHNwbGl0dGluZyBieSBkdXJhdGlvbiwgYmVjYXVzZSB0aGUgY29kZSB3aWxsIGxhdGVyIGNvbXBhcmUKKwkgIHRoZSB0aHJlc2hvbGRfdGltZSB3aXRoIChsYXN0IGJ1ZmZlciBydW5uaW5nX3RpbWUgLSBtdXhfc3RhcnRfdGltZSkKKwkgIGFuZCB3aWxsIGdldCBpdCB3cm9uZyB1bnRpbCBtdXhfc3RhcnRfdGltZSBhZHZhbmNlcyBlbm91Z2gKKwkgIHRvIG1ha2UgdGhpcyBkaWZmZXJlbmNlIDwgdGhyZXNob2xkX3RpbWUsIGNyZWF0aW5nIGVtcHR5IGZpbGVzCisJICBpbiB0aGUgbWVhbnRpbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzNjI0CisKKzIwMTUtMDktMTYgMTY6MDM6MDIgKzA5MDAgIFZpbmVldGggVCBNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogUmV2ZXJzZSBwbGF5YmFjayBkb2VzIG5vdCBjb25zaWRlciBzZWdtZW50LnN0YXJ0CisJICBEdXJpbmcgcmV2ZXJzZSBwbGF5YmFjaywgdGhlIG1lZGlhIHNob3VsZCBzdG9wIHBsYXlpbmcgYXQgc2VnbWVudC5zdGFydAorCSAgVGhpcyBkb2VzIG5vdCBoYXBwZW4sIGFuZCBhdmlkZW11eCBjb250aW51ZXMgdG8gcHJvY2VzcyBkYXRhIGV2ZW4gd2hlbgorCSAgY3VycmVudCB0aW1lc3RhbXAgaXMgbGVzcyB0aGF0IHNlZ21lbnQuc3RhcnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1MDk0CisKKzIwMTUtMDktMjMgMTI6Mzk6MzUgKzA5MDAgIE1hbmFzYSBBdGhyZXlhIDxtYW5hc2EuYXRocmV5YUBsZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IENoZWNrIG11bHRpIHRyZXggdG8gZmluZCB0cmFjayBpZCBpbiBtcDQgbXBlZy1kYXNoIHN0cmVhbQorCSAgSWYgc3RyZWFtIGhhcyBtb3JlIHRoYW4gb25lIHRyZXggYm94IHdoaWNoIGlzIG5vdCBtYXRjaGVkIHRvIGFjdHVhbAorCSAgdHJhY2sgaWQsIGl0IG1ha2VzIHF0ZGVtdXggY3Jhc2hlZC4KKwkgIEF1dGhvciA6IE1hbmFzYSBBdGhyZXlhIChtYW5hc2EuYXRocmV5YUBsZ2UuY29tKQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NDg2NAorCisyMDE1LTA5LTA0IDE0OjI0OjQ1ICswNTMwICBSYXZpIEtpcmFuIEsgTiA8cmF2aS5raXJhbkBzYW1zdW5nLmNvbT4KKworCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJICBzbXB0ZTogZ2V0IHNpemUsIHN0cmlkZSBpbmZvIHVzaW5nIFZpZGVvSW5mbworCSAgVXNlIFZpZGVvSW5mbyBkYXRhIHRvIGdldCBzaXplIHN0cmlkZSBhbmQKKwkgIG9mZnNldCwgaW5zdGVhZCBvZiBoYXJkIGNvZGVkIG1hY3Jvcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTQ1NTgKKworMjAxNS0wOS0wNCAxNDoxODo1MCArMDUzMCAgUmF2aSBLaXJhbiBLIE4gPHJhdmkua2lyYW5Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSAgc21wdGU6IGZyZWUgbWFzaworCSAgRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCB0byAnbWFzaycgdG8gYXZvaWQKKwkgIG1lbW9yeSBsZWFrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NDU1NQorCisyMDE1LTA4LTIwIDExOjAyOjU4ICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSogdGVzdHMvaWNsZXMvZXF1YWxpemVyLXRlc3QuYzoKKwkqIHRlc3RzL2ljbGVzL2dka3BpeGJ1Zm92ZXJsYXktdGVzdC5jOgorCSogdGVzdHMvaWNsZXMvZ2RrcGl4YnVmc2luay10ZXN0LmM6CisJKiB0ZXN0cy9pY2xlcy90ZXN0LW9zczQuYzoKKwkqIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6CisJICBnc3RyZWFtZXI6IGdvb2Q6IHRlc3RzOiBGaXggbWVtb3J5IGxlYWtzIHdoZW4gY29udGV4dCBwYXJzZSBmYWlscy4KKwkgIFdoZW4gZ19vcHRpb25fY29udGV4dF9wYXJzZSBmYWlscywgY29udGV4dCBhbmQgZXJyb3IgdmFyaWFibGVzIGFyZSBub3QgZ2V0dGluZyBmcmVlJ2QKKwkgIHdoaWNoIHJlc3VsdHMgaW4gbWVtb3J5IGxlYWtzLiBGcmVlJ2luZyB0aGUgc2FtZS4KKwkgIEFuZCByZXBsYWNpbmcgZ19lcnJvcl9mcmVlIHdpdGggZ19jbGVhcl9lcnJvciwgd2hpY2ggY2hlY2tzIGlmIHRoZSBlcnJvciBiZWluZyBwYXNzZWQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM4NTMKKworMjAxNS0xMC0wMiAxNjoxODoxNSArMDkwMCAgSHl1bmp1biBLbyA8enpvb24ua29Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291cmNlOiBkb2Vzbid0IGhhbmRsZSBwcm9iYXRpb24gYW5kIHJ0cCBnYXAgaW4gY2FzZSBvZiBzZW5kZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTQ1NDgKKworMjAxNS0xMC0wMiAxNjoxNjozMiArMDkwMCAgSHl1bmp1biBLbyA8enpvb24ua29Ac2Ftc3VuZy5jb20+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFsczoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBtYW5hZ2VyOiBhZGQgbmV3IG9uLW5ldy1zZW5kZXItc3NyYywgb24tc2VuZGVyLXNzcmMtYWN0aXZlIHNpZ25hbHMKKwkgIEFsbG93cyBmb3IgYXBwbGljYXRpb25zIHRvIGdldCBpbnRlcm5hbCBzb3VyY2UncyBSVFAgc3RhdGlzdGljcy4KKwkgIChlZy4gc2VuZGVyIHNvdXJjZXMgZm9yIGEgc2VydmVyL2NsaWVudCkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDY3NDcKKworMjAxNS0xMC0wMiAxNDoxNzo0OCArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICB4aW1hZ2VzcmM6IEdhdGhlciBhbmQgY29hbGVzY2UgYWxsIGRhbWFnZWQgYXJlYXMgYmVmb3JlIHJldHJpZXZpbmcuCisJICBUaGVzZSBkYXlzIHRoZSB4c2VydmVyIHNlZW1zIHRvIGdpdmUgdXMgdGhlIHNhbWUgZGFtYWdlIHJlZ2lvbnMKKwkgIG92ZXIgYW5kIG92ZXIgZm9yIGVudGlyZSB3aW5kb3dzLCBhbmQgd2UgcmV0cmlldmUgdGhlbSBtdWx0aXBsZQorCSAgdGltZXMsIHdoaWNoIGdpdmVzIHRpbWUgZm9yIG1vcmUgZGFtYWdlIHRvIGFwcGVhci4gSW5zdGVhZCwganVzdAorCSAgcXVpY2tseSBnYXRoZXIgYWxsIGRhbWFnZWQgYXJlYXMgaW50byBhIHJlZ2lvbiBsaXN0IGFuZCBjb3B5CisJICBvdXQgb25jZS4KKworMjAxNS0xMC0wMSAxNjoyNDozMiArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2dvb20yazEvTWFrZWZpbGUuYW06CisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmg6CisJICBnb29tMmsxOiB1c2UgdGhlIG5ldyBhdWRpb3Zpc3VhbGl6ZXIgYmFzZSBjbGFzcworCSAgUmViYXNlIHRvIGhhdmUgZ29vbSB1c2luZyB0aGUgR3N0QXVkaW9WaXN1YWxpemVyIGJhc2UgY2xhc3MgaW4KKwkgIGdzdC1wbHVnaW5zLWJhc2UvZ3N0LWxpYnMvZ3N0L3BidXRpbHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDI4NzUKKworMjAxNS0xMC0wMSAxNjoxNjowOCArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2dvb20vTWFrZWZpbGUuYW06CisJKiBnc3QvZ29vbS9nc3Rnb29tLmg6CisJICBnb29tOiB1c2UgdGhlIG5ldyBhdWRpb3Zpc3VhbGl6ZXIgYmFzZSBjbGFzcworCSAgUmViYXNlIHRvIGhhdmUgZ29vbSB1c2luZyB0aGUgR3N0QXVkaW9WaXN1YWxpemVyIGJhc2UgY2xhc3MgaW4KKwkgIGdzdC1wbHVnaW5zLWJhc2UvZ3N0LWxpYnMvZ3N0L3BidXRpbHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDI4NzUKKworMjAxNS0wOS0zMCAxNzozNTozMyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOgorCSAgZGVpbnRlcmxlYXZlOiBpbXBsZW1lbnQgYWNjZXB0LWNhcHMKKwkgIEF2b2lkIHVzaW5nIGRlZmF1bHQgYWNjZXB0LWNhcHMgaGFuZGxlciB0aGF0IHdpbGwgcXVlcnkgZG93bnN0cmVhbQorCSAgYW5kIGlzIG1vcmUgZXhwZW5zaXZlLiBKdXN0IGNoZWNrIGlmIHRoZSBjYXBzIGlzIGNvbXBhdGlibGUgd2l0aAorCSAgdGhlIHRlbXBsYXRlIGFuZCBjaGVjayBpZiB0aGUgY2hhbm5lbHMgYXJlIHRoZSBzYW1lLgorCisyMDE1LTA5LTMwIDA5OjM1OjM5IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOgorCSAgdGVzdHM6IGRlaW50ZXJsZWF2ZTogYWxzbyBjaGVjayBmb3IgY2FwcyBxdWVyeSByZXN1bHRzCisKKzIwMTUtMDktMzAgMTI6MzA6NTkgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJICBkZWludGVybGVhdmU6IHVzZSB0aGUgY2FwcyBxdWVyeSBmaWx0ZXIKKwkgIEl0IHdhcyBiZWluZyBpZ25vcmVkIGFuZCB3b3VsZCBsZWFkIHRvIHdyb25nIHJlc3VsdHMgaWYgdGhlCisJICBlbGVtZW50IGRvaW5nIHRoZSBxdWVyeSB3b3VsZCByZWx5IG9uIHRoZSBpbnRlcnNlY3Rpb24gYmVpbmcgbWFkZS4KKworMjAxNS0wOS0zMCAxMDowMDozMSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkgIGRlaW50ZXJsZWF2ZTogaW1wbGVtZW50IGEgY2FwcyBxdWVyeSBoYW5kbGVyIGZvciB0aGUgc2lua3BhZAorCSAgSXQgd2FzIG1pc3NpbmcgYW5kIGFwcGFyZW50bHkgY29kZSByZWxpZWQgb24gaGF2aW5nIGl0IHRoZXJlCisJICBmb3Igbm90IGFsbG93aW5nIGEgY2hhbmdlIGluIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKworMjAxNS0wOS0zMCAwOTowNTowMyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkgIGRlaW50ZXJsZWF2ZTogZml4IGNhcHMgbGVhaworCSAgQ2FwcyBmcm9tIHRoZSBwYWQgdGVtcGxhdGUgYXJlIGJlaW5nIGxlYWtlZC4gSW4gYW55IGNhc2UgaXQgaXMKKwkgIGZyb20gYSBzdGF0aWMgcGFkIHRlbXBsYXRlIGFuZCB3aWxsICdsZWFrJyBpbiB0aGUgZW5kLCBqdXN0IGRvaW5nCisJICB0aGUgY2xlYW51cCBmb3IgdGhlIGdvb2QgcHJhY3RpY2UuCisKKzIwMTUtMDktMjkgMTE6MTU6MDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2dka3BpeGJ1Zm92ZXJsYXkuYzoKKwkgIHRlc3RzOiBnZGtwaXhidWZvdmVybGF5OiBhZGQgbWluaW1hbCB1bml0IHRlc3QKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTU3NzMKKworMjAxNS0wOS0yOSAxMToxMjo0OCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmb3ZlcmxheS5jOgorCSAgZ2RrcGl4YnVmc2luazogZG9uJ3QgbGVhayBvbGQgcGl4ZWwgYnVmZmVyIHdoZW4gc2V0dGluZyBhIG5ldyBvdmVybGF5CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1NzczCisKKzIwMTUtMDktMjggMjA6MjU6MjIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IGF2b2lkIHBvdGVudGlhbCBzdHJpbmcgb3ZlcmZsb3cKKwkgIFdlIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgZnVsbCBjb250cm9sIG92ZXIgdGhlIGlucHV0IHRhZ3MsIHNvCisJICBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlIElTUkMgdGFnIGNvbnRhaW5zIGEgbG9uZ2VyIHN0cmluZyB0aGFuCisJICBleHBlY3RlZCwgaW4gd2hpY2ggY2FzZSB3ZSdkIHdyaXRlIG92ZXIgdGhlIGVuZCBvZiB0aGUgc3RhdGljLXNpemUKKwkgIDEzIGJ5dGUgYnVmZmVyIHRoYXQgaXMgRkxBQ19fU3RyZWFtTWV0YWRhdGFfQ3VlU2hlZXRfVHJhY2s6OmlzcmMuCisJICBNYWtlIHN1cmUgdG8gb25seSBjb3B5IHRoZSBJU1JDIGlmIGl0J3Mgbm90IHRvbyBsb25nLCBhbmQgbWFrZQorCSAgc3VyZSB0aGUgYnVmZmVyIHdlIHdyaXRlIHRvIGlzIGFsd2F5cyBOVUwtdGVybWluYXRlZCBieSB1c2luZworCSAgZ19zdHJsY3B5KCkuCisJICBDSUQgMTMyNDkzMS4KKworMjAxNS0wOS0yOCAxODowMzo1MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBSZW1vdmUgbGVmdG92ZXIgYXNzZXJ0aW9uIGZyb20gMC4xMAorCSAgV2Ugbm93IGFsbG9jYXRlIG1lbW9yeSB2aWEgR3N0QWxsb2NhdG9yIGFuZCBhcyBzdWNoIGNhbiBoYW5kbGUgYXJiaXRyYXJ5CisJICBhbGlnbm1lbnRzLCBub3Qgb25seSA8PSBHX01FTV9BTElHTi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTU3MDgKKworMjAxNS0wOS0yNSAxMDowMTozNyArMDIwMCAgR3VpbGxhdW1lIE1hcnF1ZWJpZWxsZSA8Z3VpbGxhdW1lLm1hcnF1ZWJpZWxsZUBwYXJyb3QuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogZml4IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIGluIExPQVMgY29uZmlnIHJlYWRpbmcKKwkgIE9uIHJlYWRpbmcgTE9BUyBjb25maWcsIGZsYWcgdj0xIGFuZCB2QT0xIGNvbWJpbmF0aW9uIGNhbiBvY2N1ciwgbGVhZGluZyB0byB3YXJuaW5nCisJICAiU3BlYyBzYXlzICJUQkQiLi4uIi4gUmV0dXJuaW5nIFRSVUUgb24gdGhpcyBjYXNlIHdoaWxlIHBhcmFtZXRlcnMgJ3NhbXBsZV9yYXRlJyBhbmQKKwkgICdjaGFubmVscycgYXJlIHBvaW50aW5nIHRvIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIGNhbiBlbmQgb24gc2V0dGluZyByYW5kb20gdmFsdWVzIGFzCisJICByYXRlIGFuZCBjaGFubmVscyBvbiBzcmMgY2Fwcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTU2MTEKKworMjAxNS0wOS0xOCAwMDo1ODoyMyArMTAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIEZpeCBzb21lIGNvbXBpbGVyIHdhcm5pbmdzIHdoZW4gYnVpbGRpbmcgd2l0aCBHX0RJU0FCTEVfQVNTRVJUCisJICBUb3VjaGVzIHJ0cG1hbmFnZXIgYW5kIGdka3BpeGJ1ZnNpbmsKKworMjAxNS0wOC0xOCAxNDozMDo1NyArMDEwMCAgQ2hyaXMgQmFzcyA8Zmxvb2JsZWZsYW1AZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuYzoKKwkgIHF0ZGVtdXg6IHN1cHBvcnQgdGltZWQtdGV4dCBzdWJ0aXRsZSB0cmFja3MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyODE4CisKKzIwMTUtMDktMjYgMDA6MTI6NDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGdzdDogRG9uJ3QgdXNlIGRlcHJlY2F0ZWQgZ3N0X3NlZ21lbnRfdG9fcG9zaXRpb24oKQorCisyMDE1LTA5LTIxIDEzOjQ3OjIxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHBiaW4vcnRwaml0dGVyYnVmZmVyL3J0c3BzcmM6IEFkZCBwcm9wZXJ0eSB0byBzZXQgbWF4aW11bSBtcyBiZXR3ZWVuIFJUQ1AgU1IgUlRQIHRpbWUgYW5kIGxhc3Qgb2JzZXJ2ZWQgUlRQIHRpbWUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTUxMjUKKworMjAxNS0wOS0xNiAxOToyODoxMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cGJpbi9zZXNzaW9uOiBBbGxvdyBSVENQIHN5bmMgdG8gaGFwcGVuIGJhc2VkIG9uIGNhcHR1cmUgdGltZSBvciBzZW5kIHRpbWUKKwkgIFNlbmQgdGltZSBpcyB0aGUgcHJldmlvdXMgYmVoYXZpb3VyIGFuZCB0aGUgZGVmYXVsdCwgYnV0IHRoZXJlIGFyZSB1c2UgY2FzZXMKKwkgIHdoZXJlIHlvdSB3YW50IHRvIHN5bmNocm9uaXplIGJhc2VkIG9uIHRoZSBjYXB0dXJlIHRpbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1MTI1CisKKzIwMTUtMDktMjUgMjM6NTE6MDkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQKKworPT09IHJlbGVhc2UgMS42LjAgPT09CisKKzIwMTUtMDktMjUgMjM6MTU6NTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjYuMAorCisyMDE1LTA5LTI1IDIyOjU3OjM0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDE1LTA5LTI1IDE0OjA4OjA5ICswMjAwICBUaGliYXVsdCBTYXVuaWVyIDx0c2F1bmllckBnbm9tZS5vcmc+CisKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJICBzbXB0ZWFscGhhOiBEbyBub3Qgc2V0IHdpZHRoL2hlaWdodCBiZWZvcmUgY29tcGFyaW5nIHdpdGggb2xkIHZhbHVlcworCSAgT3RoZXJ3aXNlIHdlIGVuZCB1cCBjb25zaWRlcmluZyB0aGUgdmFsdWVzIGRpZCBub3QgY2hhbmdlIGFuZCB3ZSB3cm9uZ2x5CisJICB3b3JrIHdpdGggdGhlIG9sZCB2aWRlbyBmb3JtYXQgKHdoaWNoIHdpbGwgbGVhZCB0byB3cm9uZworCSAgYmVoYXZpb3VyL3NlZ2ZhdWx0cykuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1NjIxCisKKzIwMTUtMDktMjMgMjA6NTk6MDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWNjdW11bGF0ZSBzZWdtZW50cyBmb3IgZWRpdCBsaXN0cyBiZWZvcmUgYWN0aXZhdGluZyB0aGUgbmV4dCBzZWdtZW50CisJICBlY2ViMmNjYzczOTA5MmQ5NjRkNzg5NDVlMTljMmVjZWRiZDIxNGUyIGJyb2tlIHNlZ21lbnQgc2Vla3MgYnkgYWx3YXlzCisJICBhY2N1bXVsYXRpbmcgc2VnbWVudHMgbWFudWFsbHkgd2hlbiBhY3RpdmF0aW5nIGEgc2VnbWVudC4gVGhpcyBpcyBvbmx5CisJICBuZWVkZWQgd2hlbiBoYW5kbGluZyBlZGl0IGxpc3RzLCBub3Qgd2hlbiBhY3RpdmF0aW5nIGEgc2VnbWVudCBiZWNhdXNlIG9mIGEKKwkgIHNlZWsuIERvIHRoZSBhY2N1bXVsYXRpb24gd2hlbiBzd2l0Y2hpbmcgZWRpdCBsaXN0IHNlZ21lbnRzIGluc3RlYWQuCisJICBUaGlzIGZpeGVzIHNlZ21lbnQgc2Vla3MgYWdhaW4sIHdoaWxlIGtlZXBpbmcgZWRpdCBsaXN0cyBwbGF5YmFjayB3b3JraW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NTQ3MQorCisyMDE1LTA5LTIzIDE3OjQzOjUxICswNTMwICBWaWtyYW0gRnVncm8gPHZpa3JhbS5mdWdyb0BnbWFpbC5jb20+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IHNlbmQgcGhhc2UgdmFsdWVzIGluIHRoZSBHc3RNZXNzYWdlIGZvciBQaGFzZSBpbmZvCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1NDYzCisKKzIwMTUtMDktMjIgMDA6NDY6MDEgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYS1tdXg6IERvbid0IG91dHB1dCBhIHdhcm5pbmcgb24gTU9OTyBtdWx0aXZpZXcgbW9kZS4KKworMjAxNS0wOS0xOSAxNzowMjoxOCArMDIwMCAgU2ViYXN0aWFuIFJhc211c3NlbiA8c2VicmFzQGhvdG1haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJICBydHB0aGVvcmFkZXBheTogRml4IG1lbW9yeSBsZWFrcworCSAgVGhlIHNhbWUgbWVtb3J5IGxlYWtzIHdlcmUgZml4ZWQgaW4gaWRlbnRpY2FsIGZhc2hpb24gZm9yCisJICB2b3JiaXNkZXBheSBpbiAwNmVmZWZmNWQ5Nzk1NzZhMjUyZTVkYWU1N2Y0NmQ2NDQ1YjFkZjEyIGluIDIwMDkuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1Mjc3CisKKzIwMTUtMDktMTkgMTc6MDQ6MDcgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJhc0Bob3RtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJICBydHB7dm9yYmlzLHRoZW9yYX17cGF5LGRlcGF5fTogQ29zbWV0aWMgY2xlYW51cAorCSAgKiB1c2UgZ19saXN0X2ZyZWVfZnVsbCgpLCBkb24ndCBpdGVyYXRlIGVsZW1lbnRzIG1hdWFsbHkgd2hlbiBmcmVlaW5nCisJICAqIGNhbGwgZ3N0X3J0cF8qX3BheV9jbGVhcl9wYWNrZXQoKSwgZG9uJ3QgZHVwbGljYXRlIGl0cyBjb2RlCisJICAqIHVzZSBnc3RfYnVmZmVyX3VucmVmKCkgdG8gY2xhcmlmeSB0aGF0IGl0IGlzIGJ1ZmZlcnMgYmVpbmcgcmVsZWFzZWQsCisJICBpbnN0ZWFkIG9mIHJlZmVyaW5nIGRpcmVjdGx5IHRvIGdzdF9taW5pX29iamVjdF91bnJlZigpCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1Mjc3CisKKzIwMTUtMDktMTkgMTg6NDQ6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSAgcnRwe3ZvcmJpcyx0aGVvcmF9cGF5OiBTdG9yZSBoZWFkZXJzIGluIHRoZSBwYWNrZXQgYnVmZmVycyBsaXN0cywgbm90IGEgTlVMTCBidWZmZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTUyNjUKKworPT09IHJlbGVhc2UgMS41LjkxID09PQorCisyMDE1LTA5LTE4IDE5OjMzOjEzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFsczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS41LjkxCisKKzIwMTUtMDktMTggMTk6MjM6NTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2hyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisKKzIwMTUtMDktMTggMTE6NTA6MzEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL3poX0NOLnBvOgorCSAgcG86IFVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAxNS0wOS0xNyAxMDo1MDowMSArMDkwMCAgRXVuaGFlIENob2kgPGV1bmhhZTEuY2hvaUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IEZpeCB0YWdsaXN0IGxlYWsKKwkgIGdzdF90YWdfbGlzdF9pbnNlcnQoKSBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgaW5zZXJ0ZWQgdGFnbGlzdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTUxMzgKKworMjAxNS0wOS0xNiAwNzowNTozNiArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBTa2lwIExPQVMgQUFDIHVudGlsIGEgdmFsaWQgY29uZmlnIGlzIHNlZW4uCisJICBJdCdzIG5vcm1hbCB3aGVuIGRyb3BwaW5nIGludG8gdGhlIG1pZGRsZSBvZiBhIHN0cmVhbSB0bworCSAgbm90IGFsd2F5cyBoYXZlIHRoZSBjb25maWcgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LCBzbyBza2lwIExPQVMKKwkgIHVudGlsIGEgdmFsaWQgY29uZmlnIGlzIHNlZW4gd2l0aG91dCBlaXRoZXIgc2V0dGluZyBpbnZhbGlkCisJICBjYXBzIG9yIGVycm9yaW5nIG91dC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTEzODYKKworMjAxNS0wOS0xMyAxNTo0MTozOCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogcmVzZXQganVzdCBhIGJpdCBtb3JlIHVwb24gZmx1c2hfc3RvcAorCisyMDE1LTA5LTEzIDE1OjQwOjA5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiByZW1vdmUgZGVhZCBzdHJ1Y3QgbWVtYmVyCisKKzIwMTUtMDktMTEgMTc6MDk6MjggKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICBtdWx0aXVkcHNpbms6IGZpeCBHRXJyb3IgbWVtb3J5IGxlYWsgd2hlbiBob3N0bmFtZSByZXNvbHV0aW9uIGZhaWxzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU0ODY5CisKKzIwMTUtMDktMTAgMTU6MjY6NTQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkgIG1hdHJvc2thbXV4OiBkcm9wIEhFQURFUiBmbGFnIGZyb20gb3V0cHV0IGJ1ZmZlcnMKKwkgIERyb3AgSEVBREVSIGZsYWcgZnJvbSBvdXRwdXQgYnVmZmVycyBpZiB0aGV5IGFyZSBub3QgaW5kZWVkCisJICBoZWFkZXJzLgorCSAgRml4ZXMgcmVzZW5kaW5nIG9mIGhlYWRlcnMgaW4gdGNwIGNvbm5lY3Rpb24gaGFuZGxpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTQ3NjgKKworMjAxNS0wOS0xMCAxNjowMDo1MCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkgIG1hdHJvc2thbXV4OiBmaXggbWF0cm9za2FtdXggISBtYXRyb3NrYWRlbXV4CisJICBEb24ndCBjYXJyeSBvdmVyIERJU0NPTlQgZmxhZ3MgZnJvbSB0aGUgaW5wdXQgYnVmZmVycyB0byB0aGUKKwkgIG91dHB1dCBidWZmZXIsIG9yIHRoZSBkZW11eGVyIG1pZ2h0IHJlc2V0IGl0cyBzdGF0ZSB3aGVuIGl0CisJICByZWNlaXZlcyB0aGUgZmlyc3QgZGF0YSBidWZmZXIganVzdCBhZnRlciBwYXJzaW5nIHRoZSBzaW1wbGUKKwkgIGJsb2NrIGhlYWRlciwgYW5kIHRoZW4gZXhwZWN0IHNhbmUgZGF0YSB0byBmb2xsb3cuCisJICBGaXhlcyBtYXRyb3NrYW11eCAhIGRlbXV4IGVycm9yaW5nIG91dC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTQ3NjgKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTc4MDUKKworMjAxNS0wOS0wOSAxMjo1MTo0MCAtMDcwMCAgTWFydGluIEtlbGx5IDxtYXJ0aW5Ac3Vycm91bmQuaW8+CisKKwkqIGdzdC9ydHNwL1JFQURNRToKKwkgIHJ0c3A6IGZpeCBzbWFsbCBSRUFETUUgdHlwbworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NDgwNworCisyMDE1LTA5LTA0IDE5OjQ1OjM3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgd2F2cGFja3BhcnNlOiBzZXQgYm90aCBwdHMgYW5kIGR0cyBzbyBiYXNlcGFyc2UgZG9lc24ndCBtYWtlIHVwIHdyb25nIGR0cyBhZnRlciBzZWVrcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjEwNgorCisyMDE1LTA5LTA0IDE5OjM0OjQxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBzZXQgYm90aCBwdHMgYW5kIGR0cyBzbyBiYXNlcGFyc2UgZG9lc24ndCBtYWtlIHVwIHdyb25nIGR0cyBhZnRlciBhIHNlZWsKKwkgIGZsYWMgY29udGFpbnMgdGhlIHNhbXBsZSBvZmZzZXQgaW4gdGhlIGZyYW1lIGhlYWRlciwgc28gYWZ0ZXIgYSBzZWVrCisJICB3aXRob3V0IGluZGV4IGZsYWNwYXJzZSB3aWxsIGtub3cgdGhlIGV4YWN0IHBvc2l0aW9uIHdlIGxhbmRlZCBvbiBhbmQKKwkgIHRpbWVzdGFtcCBidWZmZXJzIGFjY29yZGluZ2x5LiBJdCBvbmx5IHNldCB0aGUgcHRzIHRob3VnaCwgd2hpY2ggbWVhbnMKKwkgIHRoZSBiYXNlcGFyc2Utc2V0IGR0cyB3aGljaCB3YXMgc2V0IHRvIHRoZSBzZWVrIHBvc2l0aW9uIHByZXZhaWxzLCBhbmQKKwkgIHNpbmNlIHRoZSBzZWVrIHdhcyBiYXNlZCBvbiBhbiBlc3RpbWF0ZSwgdGhlcmUncyBsaWtlbHkgYSBkaXNjcmVwYW5jeQorCSAgYmV0d2VlbiB3aGVyZSB3ZSB3YW50ZWQgdG8gbGFuZCBhbmQgd2hlcmUgd2UgZGlkIGxhbmQsIHNvIGZyb20gaGVyZSBvbgorCSAgdGhhdCBkdHMvcHRzIGRpZmZlcmVuY2Ugd2lsbCBiZSBtYWludGFpbmVkLCB3aXRoIGR0cyBwb3NzaWJseSBtdWx0aXBsZQorCSAgc2Vjb25kcyBhaGVhZCBvZiBwdHMsIHdoaWNoIGlzIGp1c3Qgd3JvbmcuIFRoZSBlYXNpZXN0IHdheSB0byBmaXggdGhpcworCSAgaXMgdG8ganVzdCBzZXQgYm90aCBwdHMgYW5kIGR0cyBiYXNlZCBvbiB0aGUgc2FtcGxlIG9mZnNldCwgYnV0IHBlcmhhcHMKKwkgIHBhcnNlZCBhdWRpbyBzaG91bGQganVzdCBub3QgaGF2ZSBkdHMgc2V0IGF0IGFsbC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTIxMDYKKworMjAxNS0wOS0wNiAxNjozMzowMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5zaWduYWxzOgorCSAgZG9jczogcmVtb3ZlIHByb3BlcnRpZXMgYW5kIHNpZ25hbHMgdGhhdCBubyBsb25nZXIgZXhpc3QKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjY0NDMKKworMjAxMy0xMC0xMSAxNToxMzowMCArMDAwMCAgR2VvcmdlIENocmlzcyA8Z3NjaHJpc3NAZ21haWwuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBNYWtlIHRoZSBlbGVtZW50IGNvdW50IGluIGFycmF5cyBub3QgaW5jbHVkZSBlbmQKKwkgIE9uZS1saW5lIHJlbW92YWwgb2YgdGFnc193cml0dGVuKysKKwkgIFRoaXMgc2hvdWxkIGZpeCBydG1wIG91dHB1dCB0byBjcnRtcHNlcnZlciwgYW5kIGhvcGVmdWxseQorCSAgbm9vbmUgaXMgZXhwZWN0aW5nIHRoYXQgdGhlIGVsZW1lbnQgY291bnQgaW5jbHVkZXMgdGhlIGVuZAorCSAgZWxlbWVudCwgYXMgZGlmZmVyZW50IGJpdHMgb2YgZG9jdW1lbnRhdGlvbiBzYXkgZGlmZmVyZW50CisJICB0aGluZ3MgYWJvdXQgd2hldGhlciBpdCBzaG91bGQgb3Igbm90LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2MTYyNAorCisyMDE1LTA3LTMwIDAwOjU5OjE1ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4Lmg6CisJICBmbHZtdXg6IFN0b3JlIGluY29taW5nIGJpdHJhdGUgdGFncyBhbmQgc2VuZCBpbiB0aGUgbWV0YWRhdGEKKwkgIEFwcGFyZW50bHkgdGhlIE1pY3Jvc29mdCBBenVyZSBSVE1QIHNlcnZlciByZXF1aXJlcyB0aGF0IHRoZQorCSAgdmlkZW9kYXRhcmF0ZSBhbmQgYXVkaW9kYXRhcmF0ZSBtZXRhZGF0YSBiZSBwcm92aWRlZCwgc28KKwkgIHNldCB0aG9zZSwgZXZlbiBpZiBpdCdzIHRvIDAuIFVzZSB0aGUgYWN0dWFsIGlucHV0IGJpdHJhdGUKKwkgIHRhZ3MgaWYgYXZhaWxhYmxlLgorCisyMDE1LTA5LTA0IDAwOjA2OjI5ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogRG9uJ3QgcGFyc2Uga2V5IGRhdGEgbW9yZSB0aGFuIG5lZWRlZC4KKwkgIFdoZW4gYW4gYXV4aWxsaWFyeSBzdHJlYW1zIGFyZSBwcmVzZW50IGluIHRoZSBTRFAgbWVkaWEsCisJICB0aGVyZSdzIG5vIG5lZWQgdG8gcmUtcGFyc2UgdGhlIFNEUCBhdHRyaWJ1dGVzIG11bHRpcGxlCisJICB0aW1lcy4KKworMjAxNS0wOS0wMyAyMDo1Njo1NSArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IEZpeCBTUlRQICsgUlRYLCBhdXRoIGFjY2VzcywgYSBsZWFrLCBhbmQgYW4gaW52YWxpZCBtZW1vcnkgYWNjZXNzLgorCSAgSW4gcGFyc2Vfa2V5bWdtdCgpLCBkb24ndCBtdXRhdGUgdGhlIGlucHV0IHN0cmluZyB0aGF0J3MgYmVlbiBwYXNzZWQKKwkgIGFzIGNvbnN0LCBlc3BlY2lhbGx5IHNpbmNlIHdlIG1pZ2h0IG5lZWQgdGhlIG9yaWdpbmFsIHZhbHVlIGFnYWluIGlmCisJICB0aGUgc2FtZSBrZXkgaW5mbyBhcHBsaWVzIHRvIG11bHRpcGxlIHN0cmVhbXMgKFJUWCwgZm9yIGV4YW1wbGUpLgorCSAgV2hlbiBhIHJlc291cmNlIGlzIDQwNCwgYW5kIHdlIGhhdmUgYXV0aCBpbmZvIC0gcmV0cnkgd2l0aCB0aGUgYXV0aAorCSAgaW5mbyB0aGUgc2FtZSBhcyBpZiB3ZSBoYWQgcmVjZWl2ZSB1bmF1dGhvcmlzZWQsIGluIGNhc2UgdGhlIHJlc291cmNlCisJICBpc24ndCBldmVuIHZpc2libGUgdW50aWwgY3JlZGVudGlhbHMgYXJlIHN1cHBsaWVkLgorCSAgRml4IGEgbWVtb3J5IGxlYWsgaGFuZGxpbmcgTWlrZXkgZGF0YS4KKwkgIFdoZW4gZ2VuZXJhdGluZyBhIHJhbmRvbSBrZXlzdHJpbmcsIGRvbid0IG92ZXJydW4gdGhlIDMwIGJ5dGUKKwkgIGJ1ZmZlciBieSBnZW5lcmF0aW5nIDMyIGJ5dGVzIGludG8gaXQuCisKKzIwMTUtMDktMDQgMTU6MTg6MDUgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IEZpeCBidWlsZCB3aXRoIEdMaWIgPCAyLjQ0CisJICBHX0lPX0VSUk9SX0NPTk5FQ1RJT05fQ0xPU0VEIHdhcyBhZGRlZCBpbiAyLjQ0LgorCisyMDE1LTA5LTA0IDEyOjAxOjUyICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBJZ25vcmUgR19JT19FUlJPUl9DT05ORUNUSU9OX0NMT1NFRCB3aGVuIHJlY2VpdmluZyBkYXRhCisJICBUaGlzIGhhcHBlbnMgb24gV2luZG93cyBpZiB3ZSB1c2UgdGhlIHNhbWUgc29ja2V0IGZvciBzZW5kaW5nIHBhY2tldHMsCisJICBhbmQgdGhlIHJlbW90ZSBzZW5kcyBJQ01QIHBvcnQvaG9zdCB1bnJlYWNoYWJsZSBtZXNzYWdlcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTQ1MzQKKworMjAxNS0wOS0wMiAyMToxMjo0MSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOgorCSAgcnRwdm9yYmlzL3RoZW9yYWRlcGF5OiBGaXggaGFuZGxpbmcgb2YgZnJhZ21lbnRlZCBwYWNrZXRzCisJICBUaGlzIHdhcyBicm9rZW4gaW4gYjEwODlmYjUyMCBieSBub3QgY29uc2lkZXJpbmcgdGhlIGZ1bGwgcGFja2V0IGxlbmd0aCBvZiBhCisJICBmcmFnbWVudGVkIHBhY2tldCBidXQgb25seSB0aGUgbGVuZ3RoIG9mIHRoZSBmaXJzdCBvbmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU0NDE3CisKKzIwMTUtMDktMDEgMTU6Mzk6MjIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIGR0bWZzcmM6IFJlcGx5IHRvIGxhdGVuY3kgcXVlcnkKKworMjAxNS0wOC0zMSAxNjo0MjozMCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwc2Vzc2lvbi5jOgorCSAgdGVzdHM6IEZpeCBydHBzZXNzaW9uIHRlc3QgZmFpbHVyZQorCSAgVGhlIHRpbWUgb2YgdGhlIGZpcnN0IFJUQ1AgcGFja2V0IGlzIHNlbWktcmFuZG9tLCBzbworCSAgc29tZXRpbWVzIGl0IHdhcyBwcm9kdWNlZCBiZWZvcmUgZW5vdWdoIHBhY2tldHMgZnJvbQorCSAgdGhlIHNlY29uZCBTU1JDIHdlcmUgcmVjZWl2ZWQuIEZpcnN0IGRyb3AgcXVldWVkIFJUQ1AKKwkgIHBhY2tldHMsIHRoZW4gYWR2YW5jZSB0aGUgY2xvY2sgZW5vdWdoIHRvIGVuc3VyZQorCSAgdGhhdCBhdCBsZWFzdCBvbmUgbmV3IFJUQ1AgcGFja2V0IGlzIHByb2R1Y2VkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MDczMQorCisyMDE1LTA4LTMxIDEzOjU2OjA0ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgbGV2ZWw6IGltcHJvdmUgdGhlIHRlc3QgZm9yIG11bHRpLWNoYW5uZWwgbW9kZQorCSAgQ2hhbmdlIHRoZSB0ZXN0IHRvIHZlcmlmeSB0aGUgcmVhZC1pbmRleCBmb3IgbXVsdGlwbGUgbWVzc2FnZXMgcGVyIGJ1ZmZlci4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU0MTQ0CisKKzIwMTUtMDgtMzEgMTI6NDY6NTIgKzAyMDAgIEphbiBBbGV4YW5kZXIgU3RlZmZlbnMgKGhlZnRpZykgPGphbi5zdGVmZmVuc0BnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogQWxpZ24gcmF3IHZpZGVvIGZyYW1lcyB0byAzMiBieXRlcworCSAgT3V0cHV0dGluZyB1bmFsaWduZWQgdmlkZW8gZnJhbWVzIGNhdXNlcyB2aWRlb3NjYWxlIGV0IGFsIHRvCisJICBjcmFzaCB3aGVuIGF0dGVtcHRpbmcgU0lNRC1hY2NlbGVyYXRlZCBjb252ZXJzaW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNjk2NQorCisyMDE1LTA4LTI2IDIzOjE2OjQ2ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIGxldmVsOiBmaXggbGV2ZWwgY2FsY3VsYXRpb25zIGZvciBtdXRsaXBsZSBjaGFubmVscworCSAgVGhpcyB3YXMgYnJva2VuIHdpdGggN2I5MGJmMzIxNTA4OTdhMTQxYTI5YTEyZWNhYjU1NWQ4YzViN2ZhYi4KKworMjAxNS0wOC0yNyAxMDoyODo1NSArMDUzMCAgUmF2aSBLaXJhbiBLIE4gPHJhdmkua2lyYW5Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSAgc21wdGU6IEZpeCBtZW1vcnkgbGVhaworCSAgSW4gZ3N0X3NtcHRlX2NvbGxlY3RlZCgpLCBjaGVjayB1cGZyb250IGlmIGlucHV0IGZvcm1hdHMgYXJlIHNhbWUKKwkgIG9yIG5vdC4gVGhpcyBhdm9pZHMgYWxsb2NhdGlvbiBvZiBpbjEgYW5kIGluMiBidWZmZXJzIGFuZAorCSAgc3Vic2VxdWVudCBtZW1vcnkgbGVhayB3aGVuIGlucHV0IGZvcm1hdHMgZG8gbm90IG1hdGNoLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NDE1MworCisyMDE1LTA4LTIxIDExOjUyOjE5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSAgdGVzdHM6IHNvdXBodHRwc3JjOiBkb24ndCB0cnkgdG8gY29ubmVjdCB0byBkZWFkIHJhZGlvIHNlcnZlcgorCisyMDE1LTA4LTIxIDE2OjI5OjE2ICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBUcml2aWFsIGZpeCB0byBjaGVjayBjb3JyZWN0IGNvbmRpdGlvbgorCSAgV2hlbiBjaGVja2luZyBmb3IgZGVzY3JpYmUgbWV0aG9kLCBiZWNhdXNlIG9mIG1pc3NpbmcgcGFyZW50aGVzZXMsIHdyb25nCisJICBjb25kaXRpb24gaXMgYmVpbmcgY2hlY2tlZCwgd2hpY2ggd2lsbCByZXN1bHQgaW4gd3JvbmcgYmVoYXZpb3IuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzOTEyCisKKzIwMTUtMDgtMjEgMTM6MTk6MDIgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWF0cm9za2E6IHJlYWQ6IGZpeCB0YWcgbGlzdCBtZW1vcnkgbGVhaworCSAgZ3N0X3RvY19lbnRyeV9tZXJnZV90YWdzIG1ha2VzIGEgbmV3IHJlZiBvZiB0aGUgdGFnbGlzdCwgc28gaXQgc2hvdWxkCisJICBiZSB1bnJlZidlZCBhcyBzb29uIGFzIHRoZSB0YWdzIGFyZSBtZXJnZWQgdG8gdGhlIHRvY2VudHJ5CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzOTA0CisKKzIwMTUtMDgtMjEgMTI6MjA6NTkgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkgIHdhdnBhY2tkZWM6IGZpeCB0YWdsaXN0IG1lbW9yeSBsZWFrCisJICBXaGVuIHBhc3NpbmcgdGhlIHRhZ2xpc3QgdG8gZ3N0X2F1ZGlvX2RlY29kZXJfbWVyZ2VfdGFncywgdGhlIHJlZmVyZW5jZSBpcyBpbmNyZWFzZWQKKwkgIGJ5IGF1ZGlvZGVjb2RlciBhbmQgdGhlIGNhbGxlciBzaG91bGQgZnJlZSB0aGUgdGFnbGlzdCBiZWluZyBwYXNzZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzOTAzCisKKzIwMTUtMDgtMjAgMTQ6NDU6MzMgKzAyMDAgIEplYW4tTWljaGVsIEhhdXRib2lzIDxqZWFuLW1pY2hlbC5oYXV0Ym9pc0B2ZW8tbGFicy5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IGZpeCBwYWQgY2xvc2luZworCSAgU2lnbmVkLW9mZi1ieTogSmVhbi1NaWNoZWwgSGF1dGJvaXMgPGplYW4tbWljaGVsLmhhdXRib2lzQHZlby1sYWJzLmNvbT4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM4NzUKKworPT09IHJlbGVhc2UgMS41LjkwID09PQorCisyMDE1LTA4LTE5IDEzOjI5OjUzICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5zaWduYWxzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjUuOTAKKworMjAxNS0wOC0xOSAxMjo0Nzo0MiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxNS0wOC0xOSAxMToyOTo1NSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vZWwucG86CisJKiBwby96aF9DTi5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTUtMDgtMTMgMTc6Mjk6NTggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJICBtdWx0aWZpbGVzcmM6IGZpeCByZWdyZXNzaW9uIHdpdGggc3RhcnRpbmcgZnJvbSBpbmRleCBzZXQgdmlhIGluZGV4IHByb3BlcnR5CisJICBXaGVuIHdlIGhhdmVuJ3Qgc3RhcnRlZCB5ZXQsIHNldCB0aGUgc3RhcnRfaW5kZXggd2hlbiB3ZSBzZXQgdGhlIGluZGV4IHByb3BlcnR5LAorCSAgc28gdGhhdCB3ZSBzdGFydCBhdCB0aGUgcmlnaHQgaW5kZXggcG9zaXRpb24gYWZ0ZXIgdGhlIGluaXRpYWwgc2Vlay4gVGhlIGluZGV4CisJICBwcm9wZXJ0eSB3YXMgbmV2ZXIgcmVhbGx5IG1lYW50IHRvIGJlIGZvciB3cml0aW5nLCBidXQgaXQgdXNlZCB0byB3b3JrLCBzbyBsZXQncworCSAgc3VwcG9ydCBpdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM5NDcyCisKKzIwMTUtMDgtMTggMTA6NTI6MTEgKzAxMDAgIEFsZXggQXNobGV5IDxidWd6aWxsYUBhc2hsZXktZmFtaWx5Lm5ldD4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggb2Zmc2V0IGNhbGN1bGF0aW9uIHdoZW4gcGFyc2luZyBDRU5DIGF1eCBpbmZvCisJICBDb21taXQgN2Q3ZTU0Y2U2ODYzZmY1M2UxODhkMDI3NmQyNjUxYjY1MDgyZmZkYiBhZGRlZCBzdXBwb3J0IGZvcgorCSAgREFTSCBjb21tb24gZW5jcnlwdGlvbiwgaG93ZXZlciBjb21taXQKKwkgIGJiMzM2ODQwYzBiMGIwMmZhMThkYzQ0MzdjZTBkZWQzZDkxNDI4MDEgdGhhdCB3ZW50IG9udG8gbWFzdGVyCisJICBzaG9ydGx5IGJlZm9yZSB0aGUgQ0VOQyBjb21taXQgY2F1c2VkIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgQ0VOQworCSAgYXV4IGluZm8gb2Zmc2V0IHRvIGJlIGluY29ycmVjdC4KKwkgIFRoZSBiYXNlX29mZnNldCB3YXMgYmVpbmcgYWRkZWQgaWYgcHJlc2VudCwgYnV0IGlmIHRoZSBiYXNlX29mZnNldAorCSAgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtb29mLCB0aGUgb2Zmc2V0IHdhcyBiZWluZyBhZGRlZCB0d2ljZS4KKwkgIFRoZSBjb3JyZWN0IGFwcHJvYWNoIGlzIHRvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZQorCSAgbW9vZiBhbmQgdXNlIHRoYXQgb2Zmc2V0IHdoZW4gcGFyc2luZyB0aGUgQ0VOQyBhdXggaW5mby4KKworMjAxNS0wOC0xNyAxNDoyODoyNCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBhY3R1YWxseSByZXR1cm4gdHJ1ZSBmb3IgYWNjZXB0LWNhcHMgcXVlcnkgaGFuZGxpbmcKKworMjAxNS0wOC0xNyAxNDowNzoxMCArMDkwMCAgSHl1bmp1biBLbyA8enpvb24ua29Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwa2x2cGF5LmM6CisJICBydHA6IGNvcHkgbWV0YWRhdGEgaW4gdGhlIChkZSlwYXlsb2FkZXJzIHdoaWNoIGlzIG1pc3NlZCBiZWZvcmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM3MDYKKworMjAxNS0wOC0xNiAxNToyMTo1MSAtMDQwMCAgRHVzdGluIFNwaWN1enphIDxkdXN0aW5AdmlydHVhbHJvYWRzaWRlLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5oOgorCSAgZGlyZWN0c291bmRzaW5rOiBhbGxvdyBzcGVjaWZ5aW5nIGF1ZGlvIHBsYXliYWNrIGRldmljZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MzY3MAorCisyMDE1LTA4LTE2IDEzOjUxOjQ3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IHJlbW92ZSBzaW5nbGUgZW50cnkgaWYgZnJvbSBsb29wCisJICBJdGVyYXRlIGZyb20gdGhlIDJuZCBjaGFubmVsIG9uIGFuZCBjcmVhdGUgdGhlIDEgY2hhbm5lbCBzdHJ1Y3QKKwkgIG91dHNpZGUgdG8gbWFrZSBsb29wIHN0cnVjdHVyZSBzaW1wbGVyIGFuZCBvbmx5IHNsaWdodGx5IGZhc3Rlci4KKworMjAxNS0wOC0xNiAxMzoyMTo0MSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBpbXBsZW1lbnQgcHJvcGVyIGFjY2VwdC1jYXBzCisJICBTaG91bGQganVzdCBjb21wYXJlIHdpdGggd2hhdCBjYW4gYmUgaW1tZWRpYXRlbGx5IGFjY2VwdGVkIGJ5CisJICB0aGUgZWxlbWVudC4gZmxhY2VuYyBjYW4ndCByZW5lZ290aWF0ZSBzbyBpZiBpdCBoYXMgYSBjYXBzIGFscmVhZHkKKwkgIGl0IHNob3VsZCBvbmx5IGFjY2VwdCBpZiBpdCBpcyB0aGF0IGNhcHMgb3RoZXJ3aXNlIGp1c3QgdXNlIHRoZQorCSAgdGVtcGxhdGUgY2FwcworCisyMDE1LTA4LTE2IDEzOjAzOjM2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IGltcHJvdmUgc2luayBwYWQgdGVtcGxhdGUgY2FwcworCSAgUmVtb3ZlcyB0aGUgbmVlZCBmb3IgY3VzdG9tIGNhcHMgcXVlcnkgaGFuZGxpbmcgYW5kIG1ha2VzIGl0IG1vcmUKKwkgIGNvcnJlY3QgZnJvbSB0aGUgYmVnaW5uaW5nIG9uIHRoZSB0ZW1wbGF0ZS4gSXQgaXMgYSBiaXQgdWdsaWVyCisJICB0byByZWFkIGJlY2F1c2UgdGhlcmUgaXMgMSBlbnRyeSBwZXIgY2hhbm5lbCBidXQgbWFrZXMgY29kZSBlYXNpZXIKKwkgIHRvIG1haW50YWluLgorCisyMDE1LTA4LTE2IDEyOjQxOjU2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJICB5NG1lbmNvZGU6IGZpeCBnc3QtbGF1bmNoIHZlcnNpb24gaW4gZG9jdW1lbnRhdGlvbgorCisyMDE1LTA4LTE1IDIyOjMyOjIxIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOgorCSogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzoKKwkgIGF1ZGlvZW5jb2RlcnM6IHVzZSB0ZW1wbGF0ZSBzdWJzZXQgY2hlY2sgZm9yIGFjY2VwdC1jYXBzCisJICBJdCBpcyBmYXN0ZXIgdGhhbiBkb2luZyBhIHF1ZXJ5IHRoYXQgcHJvcGFnYXRlcyBkb3duc3RyZWFtIGFuZAorCSAgc2hvdWxkIGJlIGVub3VnaAorCSAgRWxlbWVudHM6IHNwZWV4ZW5jLCB3YXZwYWNrZW5jLCBtdWxhd2VuYywgYWxhd2VuYworCisyMDE1LTA4LTE1IDIyOjI5OjQxIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJICB2aWRlb2VuY29kZXJzOiB1c2UgdGVtcGxhdGUgc3Vic2V0IGNoZWNrIGZvciBhY2NlcHQtY2FwcworCSAgSXQgaXMgZmFzdGVyIHRoYW4gZG9pbmcgYSBxdWVyeSB0aGF0IHByb3BhZ2F0ZXMgZG93bnN0cmVhbSBhbmQKKwkgIHNob3VsZCBiZSBlbm91Z2gKKwkgIEVsZW1lbnRzOiBqcGVnZW5jLCBwbmdlbmMsIHZwOGVuYywgdnA5ZW5jLCB5NG1lbmMKKworMjAxNS0wOC0xNiAxNzoyMToyNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSAgbXBlZ2F1ZGlvcGFyc2U6IHVzZSBuZXcgYmFzZXBhcnNlIEFQSSB0byBmaXggdGFnIGhhbmRsaW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc5NzY4CisKKzIwMTUtMDMtMTcgMTc6NTA6MzcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0c2JjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IHVzZSBuZXcgYmFzZSBwYXJzZSBBUEkgdG8gZml4IHRhZyBoYW5kbGluZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3OTc2OAorCisyMDE1LTA4LTE2IDE0OjM3OjUzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiB1c2UgbmV3IGJhc2VwYXJzZSBBUEkgYW5kIGZpeCB0YWcgaGFuZGxpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Nzk3NjgKKworMjAxNS0wOC0xNiAxMzowNDowMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBVc2Ugc2lnbmVkIGludGVnZXIgdHlwZSB0byBiZSBhYmxlIHRvIGNoZWNrIGZvciBuZWdhdGl2ZSBzdWJ0cmFjdGlvbiByZXN1bHRzCisJICBDSUQgMTMxNTgyOQorCisyMDE1LTA4LTE2IDExOjUwOjM0ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzQGRlYmV0aGVuY291cnQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJICBydHB2b3JiaXNkZXBheTogcmVtb3ZlIGRlYWQgY29kZQorCSAgcGF5bG9hZF9idWZmZXIgbXVzdCBiZSBOVUxMIGluIGlnbm9yZV9yZXNlcnZlZC4gQ2hlY2sgd2lsbCBhbHdheXMgYmUgZmFsc2UuCisJICBJbnRyb2R1Y2VkIGJ5IGIxMDg5ZmI1MjA3Njk3YmEyNmVkYjRmZjY2ZWQwZjQ2NWM2ZGYzY2YKKwkgIENJRCAjMTMxNjQ3NgorCisyMDE1LTA4LTE1IDIyOjQ1OjUzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9sYXcvYWxhdy1lbmNvZGUuaDoKKwkgIGFsYXdlbmM6IHBvcnQgdG8gQXVkaW9FbmNvZGVyIGJhc2UgY2xhc3MKKworMjAxNS0wOC0xNSAwOToxNjoyMyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6CisJICBhdWRpb2RlY29kZXJzOiB1c2UgZGVmYXVsdCBwYWQgYWNjZXB0LWNhcHMgaGFuZGxpbmcKKwkgIEF2b2lkcyB1c2VsZXNzIGNoZWNrIG9mIGRvd25zdHJlYW0gY2FwcyB3aGVuIGhhbmRsaW5nIGFuCisJICBhY2NlcHQtY2FwcyBxdWVyeQorCSAgRWxlbWVudHM6IGZsYWNkZWMsIHNwZWV4ZGVjLCB3YXZwYWNrZGVjLCBtdWxhd2RlYywgYWxhd2RlYworCisyMDE1LTA4LTE1IDA4OjQ5OjU3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZweC9nc3R2cDlkZWMuYzoKKwkgIHZpZGVvZGVjb2RlcnM6IHVzZSBkZWZhdWx0IHBhZCBhY2NlcHQtY2FwcyBoYW5kbGluZworCSAgQXZvaWRzIHVzZWxlc3MgY2hlY2sgb2YgZG93bnN0cmVhbSBjYXBzIHdoZW4gaGFuZGxpbmcgYW4KKwkgIGFjY2VwdC1jYXBzIHF1ZXJ5CisJICBFbGVtZW50czoganBlZ2RlYywgcG5nZGVjLCB2cDhkZWMsIHZwOWRlYworCisyMDE1LTA4LTE1IDExOjMxOjA0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkgIGFsYXdkZWM6IG1ha2UgZXJyb3IgaGFuZGxpbmcgYSBiaXQgbmljZXIKKwkgIFByaW50IHRoZSBlbGVtZW50IGFsb25nIHdpdGggdGhlIGRlYnVnIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHRyYWNlCisJICB0aGUgZmFpbHVyZXMKKworMjAxNS0wOC0xNSAxMTowNDoxNiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmg6CisJICBhbGF3ZGVjOiBwb3J0IHRvIGF1ZGlvZGVjb2RlciBiYXNlIGNsYXNzCisJICBtdWxhd2RlYyB3YXMgYWxyZWFkeSBwb3J0ZWQsIGFsYXdkZWMgd2FzIGxlZnQgYmVoaW5kLgorCisyMDE1LTA4LTE1IDEwOjM0OjE0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogb25seSBsb29rIGZvciBtb3JlIHNhbXBsZXMgaW4gbW9vZnMgaW4gcHVsbC1tb2RlCisJICBGb3IgcGxheWJhY2sgb2Ygc29tZSBmcmFnbWVudGVkIGZvcm1hdHMgd2l0aCBxdGRlbXV4IGl0IHdpbGwKKwkgIHRyeSB0byBsb29rIGZvciB0aGUgbmV4dCBtb29mIGFmdGVyIGZpbmlzaGluZyBvbmUgYnV0IGl0IGlzIG9ubHkKKwkgIHBvc3NpYmxlIGZvciBwdWxsLW1vZGUuIEZvciBwbGF5YmFjayBvZiBzdHJlYW1pbmcgZnJhZ21lbnRlZCBmb3JtYXRzCisJICBzdWNoIGFzIERBU0ggaXQgc2hvdWxkIGp1c3Qgbm90IHRyeSB0byBsb29rIGZvciBhbm90aGVyIG1vb2YgYnV0CisJICBpbnN0ZWFkIHdhaXQgZm9yIG1vcmUgZGF0YS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTI2MDIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTI2MDMKKworMjAxNS0wOC0xNSAxMjo1ODo1MCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSAgZGNhcGFyc2U6IERvbid0IGxvb2sgZm9yIGEgc2Vjb25kIHN5bmN3b3JkCisJICBUaGVyZSBhcmUgc3RyZWFtcyBvdXQgdGhlcmUgdGhhdCBjb25zaXN0ZW50bHkgY29udGFpbiBnYXJiYWdlIGJldHdlZW4KKwkgIGV2ZXJ5IGZyYW1lIHNvIHdlIG5ldmVyIGV2ZXIgZmluZCBhIHNlY29uZCBjb25zZWN1dGl2ZSBzeW5jd29yZC4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM4MjM3CisKKzIwMTUtMDgtMTUgMTE6MTI6MDUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnB4L2dzdHZwOWVuYy5jOgorCSAgdnA4ZW5jLCB2cDllbmM6IHJlc2V0IG11bHRpcGFzcyBmaWxlIGluZGV4IHdoZW4gc3RvcHBpbmcgZW5jb2RlcgorCSAgRml4ZXMgbXVsdGlwYXNzIGVuY29kaW5nIHdoZW4gcmUtdXNpbmcgdGhlIHNhbWUgZWxlbWVudC9waXBlbGluZQorCSAgZm9yIHN1YnNlcXVlbnQgZW5jb2RpbmcgcnVucy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDc3MjgKKworMjAxNS0wOC0xNSAxMTowOTo0MiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkqIGV4dC92cHgvZ3N0dnA5ZW5jLmg6CisJICB2cDllbmM6IHByb3ZpZGUgc3VwcG9ydCBmb3IgbXVsdGlwbGUgcGFzcyBjYWNoZSBmaWxlcworCSAgU29tZSBmaWxlcyBtYXkgcHJvdmlkZSBkaWZmZXJlbnQgY2FwcyBpbnNpZ2h0IG9mIG9uZSBzdHJlYW0uIFNpbmNlCisJICB2cDllbmMgc3VwcG9ydCBjYXBzIHJlaW5pdCwgd2Ugc2hvdWxkIHN1cHBvcnQgY2FjaGUgcmVpbml0IHRvby4KKwkgIElmIG1vcmUgdGhlbiBmaWxlIGNhY2hlIGZpbGUgd2lsbCBiZSBjcmVhdGVkLCB0aGUgbmFtaW5nIHdpbGwgYmU6CisJICBjYWNoZSBjYWNoZS4xIGNhY2hlLjIgLi4uCisJICBCYXNlZCBvbiBwYXRjaCBieTogT2xla3NpaiBSZW1wZWwgPGxpbnV4QHJlbXBlbC1wcml2YXQuZGU+CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3NzI4CisKKzIwMTUtMDgtMTQgMTE6NDE6NDIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYWFjcGFyc2UuYzoKKwkgIHRlc3RzOiBhYWNwYXJzZTogdXNlIGNhcHMgcXVlcnkgaW5zdGVhZCBvZiBhY2NlcHQtY2FwcworCSAgVGhlIGFjY2VwdC1jYXBzIHF1ZXJ5IGp1c3QgZG9lcyBhIHNoYWxsb3cgY2hlY2sgYXQgdGhlIGN1cnJlbnQKKwkgIGVsZW1lbnQgd2hpbGUgYXQgdGhpcyB0ZXN0IHdlIHdhbnQgaXQgdG8gYWxzbyBsb29rIGF0IGRvd25zdHJlYW0uCisJICBTbyB1c2UgY2FwcyBxdWVyeSB0aGVyZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM2MjMKKworMjAxNS0wOC0xNCAxMTo0MDoyMiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2VyczogZW5hYmxlIGFjY2VwdC10ZW1wbGF0ZSBmbGFnCisJICBEbyBhIHF1aWNrIGNoZWNrIHdpdGggdGhlIHBhZCB0ZW1wbGF0ZSBjYXBzIGFzIGl0IGlzIGVub3VnaC4gVXNlcnMKKwkgIHNob3VsZCBoYXZlIGZpZ3VyZWQgdGhlIGFwcHJvcHJpYXRlIGZ1bGwgY2FwcyBvbiBhIHByZXZpb3VzIGNhcHMgcXVlcnkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM2MjMKKworMjAxNS0wOC0xNCAxNTo0Njo1MyArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogc2VuZCB0aGUgVXNlci1BZ2VudCBoZWFkZXIKKwkgIFNvbWV0aW1lcyBpdCBpcyB1c2VmdWwgdG8ga25vdyB0aGlzIGluZm9ybWF0aW9uIG9uIHRoZQorCSAgc2VydmVyIHNpZGUuIE90aGVyIHBvcHVsYXIgaW1wbGVtZW50YXRpb25zICh2bGMsIGZmbXBlZywgLi4uKQorCSAgYWxzbyBzZW5kIHRoaXMgaGVhZGVyIG9uIGV2ZXJ5IG1lc3NhZ2UuCisJICBUaGlzIGluY2x1ZGVzIGEgbmV3ICJ1c2VyLWFnZW50IiBwcm9wZXJ0eSB0aGF0IHRoZSB1c2VyCisJICBjYW4gc2V0IHRvIHVzZSBhIGN1c3RvbSBVc2VyLUFnZW50IHN0cmluZy4gVGhlIGRlZmF1bHQKKwkgIGlzICJHU3RyZWFtZXIvPHZlcnNpb24+IgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MDEwMQorCisyMDE1LTA4LTE0IDE1OjQyOjQyICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiB3cmFwIGdzdF9ydHNwX21lc3NhZ2VfaW5pdF9yZXF1ZXN0IGluIGEgbG9jYWwgZnVuY3Rpb24KKwkgIFRoaXMgd2lsbCBhbGxvdyBhZGRpbmcgY29tbW9uIHJlcXVlc3QgaW5pdGlhbGl6YXRpb24sIGxpa2UgdGhlCisJICB1c2VyIGFnZW50IHN0cmluZywgaW4ganVzdCBvbmUgcGxhY2UuCisKKzIwMTUtMDgtMTQgMDk6MzY6MDkgKzA1MzAgIFByYXNoYW50IEdvdGFybmUgPHBzLmdvdGFybmVAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5jOgorCSAgYXVkaW9lY2hvOiBtYWtlIHN1cmUgYnVmZmVyIGdldHMgcmVhbGxvY2F0ZWQgaWYgbWF4X2RlbGF5IGNoYW5nZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM0OTAKKworMjAxNS0wNy0wOSAwOTo1MToyNiArMDIwMCAgT2xla3NpaiBSZW1wZWwgPGxpbnV4QHJlbXBlbC1wcml2YXQuZGU+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnB4L2dzdHZwOGVuYy5oOgorCSAgdnA4ZW5jOiBwcm92aWRlIHN1cHBvcnQgZm9yIG11bHRpcGxlIHBhc3MgY2FjaGUgZmlsZXMKKwkgIFNvbWUgZmlsZXMgbWF5IHByb3ZpZGUgZGlmZmVyZW50IGNhcHMgaW5zaWdodCBvZiBvbmUgc3RyZWFtLiBTaW5jZSB2cDhlbmMKKwkgIHN1cHBvcnQgY2FwcyByZWluaXQsIHdlIHNob3VsZCBzdXBwb3J0IGNhY2hlIHJlaW5pdCB0b28uCisJICBJZiBtb3JlIHRoZW4gZmlsZSBjYWNoZSBmaWxlIHdpbGwgYmUgY3JlYXRlZCwgdGhlIG5hbWluZyB3aWxsIGJlOgorCSAgY2FjaGUKKwkgIGNhY2hlLjEKKwkgIGNhY2hlLjIKKwkgIC4uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NzcyOAorCisyMDE1LTA0LTE1IDIyOjUxOjUxICswMjAwICBSYW1pcm8gUG9sbGEgPHJhbWlyby5wb2xsYUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJICBydHBtcDRnZGVwYXk6IGZpeCB0aW1lc3RhbXBzIGZvciBSVFAgcGFja2V0cyB3aXRoIG11bHRpcGxlIEFVcworCSAgVXNlIGNvbnN0YW50RHVyYXRpb24gdG8gY2FsY3VsYXRlIHRoZSB0aW1lc3RhbXAgb2Ygbm9uLWZpcnN0IEFVIGluIHRoZQorCSAgUlRQIHBhY2tldC4KKwkgIElmIGNvbnN0YW50RHVyYXRpb24gaXMgbm90IHByZXNlbnQgaW4gdGhlIE1JTUUgcGFyYW1ldGVycywgaXRzIHZhbHVlCisJICBtdXN0IGJlIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIHRpbWluZyBpbmZvcm1hdGlvbiBmcm9tIHR3byBjb25zZWN1dGl2ZQorCSAgUlRQIHBhY2tldHMgd2l0aCBBVS1JbmRleCBlcXVhbCB0byAwLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0Nzg4MQorCisyMDE1LTA4LTE0IDA2OjQzOjEzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogcmVtb3ZlIHVubmVjZXNzYXJ5IGlmLCBnX2ZyZWUgaXMgbnVsbCBzYWZlCisKKzIwMTUtMDgtMTQgMDg6MzM6NTYgKzAxMDAgIEFsZXggQXNobGV5IDxidWd6aWxsYUBhc2hsZXktZmFtaWx5Lm5ldD4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmg6CisJICBzb3VwaHR0cHNyYzogYWRkIHByb3BlcnR5IHRvIHNldCBIVFRQIG1ldGhvZAorCSAgVG8gYWxsb3cgc291cGh0dHBzcmMgdG8gYmUgdXNlIEhUVFAgbWV0aG9kcyBvdGhlciB0aGFuIEdFVAorCSAgKGUuZy4gSEVBRCksIGFkZCBhICJtZXRob2QiIHByb3BlcnR5IHRoYXQgaXMgYSBzdHJpbmcuIElmIHRoaXMKKwkgIHByb3BlcnR5IGlzIG5vdCBzZXQsIEdFVCBpcyB1c2VkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjQxMworCisyMDE1LTA4LTE0IDExOjEzOjAxICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9nZW5lcmljL3N0YXRlcy5jOgorCSAgY2hlY2s6IFJlbmFtZSBzdGF0ZXMgdW5pdCB0ZXN0CisJICBNYWtlcyBpdCBlYXNpZXIgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIG90aGVyIG1vZHVsZXMgc3RhdGVzIHVuaXQgdGVzdAorCisyMDE1LTA4LTE0IDA5OjIxOjI1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZ29vbS9nc3RhdWRpb3Zpc3VhbGl6ZXIuYzoKKwkqIGdzdC9nb29tL2dzdGF1ZGlvdmlzdWFsaXplci5oOgorCSogZ3N0L2dvb20yazEvZ3N0YXVkaW92aXN1YWxpemVyLmM6CisJKiBnc3QvZ29vbTJrMS9nc3RhdWRpb3Zpc3VhbGl6ZXIuaDoKKwkgIGdvb206IFJlbmFtZSBnZXRfdHlwZSgpIGZ1bmN0aW9uIG9mIGJhc2UgY2xhc3MgdG8gcHJldmVudCBzeW1ib2wgY29uZmxpY3RzCisJICBUaGlzIGlzIGEgcHJvYmxlbSB3aGVuIHN0YXRpY2FsbHkgbGlua2luZy4KKworMjAxNS0wOC0xMyAxNjozMjo1NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IEtlZXAgdGhlIERUUyBlc3RpbWF0ZSBpZiB3ZSBnb3Qgbm8gRFRTIGFmdGVyIGEgaml0dGVyYnVmZmVyIHJlc2V0CisJICBPdGhlcndpc2Ugd2Ugd2lsbCBqdXN0IG91dHB1dCBidWZmZXJzIHdpdGhvdXQgdGltZXN0YW1wcyBhZnRlciBhIHJlc2V0IGlmIG5vCisJICB0aW1lc3RhbXBzIGFyZSBwcm92aWRlZCBieSB1cHN0cmVhbSwgZS5nLiB3aGVuIHVzaW5nIFJUU1Agb3ZlciBUQ1AuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ5NTM2CisKKzIwMTUtMDgtMTIgMTc6MTY6MDEgKzA1MzAgIFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5oOgorCSAgbWF0cm9za2E6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM1NTYKKworMjAxNS0wOC0wNCAyMDo1OToxNyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDI0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBidmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGR2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2MWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMXNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzYmNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzYmNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc2lyZW5kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHV0aWxzLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHV0aWxzLmg6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJICBydHA6IENvcHkgbWV0YWRhdGEgaW4gdGhlIChkZSlwYXlsb2FkZXIsIGJ1dCBvbmx5IHRoZSByZWxldmFudCBvbmVzCisJICBUaGUgcGF5bG9hZGVyIGRpZG4ndCBjb3B5IGFueXRoaW5nIHNvIGZhciwgdGhlIGRlcGF5bG9hZGVyIGNvcGllZCBldmVyeQorCSAgcG9zc2libGUgbWV0YS4gTGV0J3MgbWFrZSBpdCBjb25zaXN0ZW50IGFuZCBqdXN0IGNvcHkgYWxsIG1ldGFzIHdpdGhvdXQKKwkgIHRhZ3Mgb3Igd2l0aCBvbmx5IHRoZSB2aWRlbyB0YWcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxNzc0CisKKzIwMTUtMDgtMTAgMTg6MjA6MTUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggc21hbGwgdHlwbyBpbiBjb21tZW50CisKKzIwMTUtMDgtMTAgMTY6MTk6MTggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSAgZ29vbTJrMS9kb2M6IEZpeHVwIHByZXZpb3VzIGNvbW1pdAorCisyMDE1LTA4LTEwIDE1OjU1OjE5IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5oOgorCSAgZ29vbTJrMS9kb2M6IFVzZSBHc3RHb29tMmsxIG5hbWVzcGFjZQorCSAgVGhlIGRvYyBnZW5lcmF0b3IgaXNuJ3QgaGFwcHkgd2hlbiB3ZSBoYXZlIGNsYXNzIG5hbWUgY2xhc2guIFNpbXBseQorCSAgdXNlIGl0J3Mgb3duIG5hbWVzcGFjZS4KKworMjAxNS0wOC0xMCAxNzoxMDo0MiArMDUzMCAgUHJhc2hhbnQgR290YXJuZSA8cHMuZ290YXJuZUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9lY2hvLmM6CisJICBhdWRpb2VjaG86IHJlbW92ZWQgdW51c2VkIHZhcmlhYmxlIGluIHNldF9wcm9wZXJ0eQorCSAgdW51c2VkIGxvY2FsIHZhcmlhYmxlICdkZWxheScgaXMgcmVtb3ZlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM0NTAKKworMjAxNS0wOC0xMCAxMjo0NToyNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggc3Vib3B0aW1hbCBxdWV1ZSBpdGVyYXRpb24gY29kZQorCisyMDE1LTA4LTA5IDE3OjI1OjQ1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGRvbid0IHVzZSBnbGliIDIuNDQtb25seSBBUEkKKworMjAxNS0wNy0yOSAxNDoxNDo1MCArMDEwMCAgQWxleCBBc2hsZXkgPGJ1Z3ppbGxhQGFzaGxleS1mYW1pbHkubmV0PgorCisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF90eXBlcy5jOgorCSAgcXRkZW11eDogYWRkIHN1cHBvcnQgZm9yIElTT0JNRkYgQ29tbW9uIEVuY3J5cHRpb24KKwkgIFRoaXMgY29tbWl0IGFkZHMgc3VwcG9ydCBmb3IgSVNPQk1GRiBDb21tb24gRW5jcnlwdGlvbiAoY2VuYyksIGFzCisJICBkZWZpbmVkIGluIElTTy9JRUMgMjMwMDEtNy4gSXQgdXNlcyBhIEdzdFByb3RlY3Rpb24gZXZlbnQgdG8KKwkgIHBhc3MgdGhlIGNvbnRlbnRzIG9mIFBTU0ggYm94ZXMgdG8gZG93bnN0cmVhbSBkZWNyeXB0b3IgZWxlbWVudHMKKwkgIGFuZCBhdHRhY2hlZCBHc3RQcm90ZWN0aW9uTWV0YSB0byBlYWNoIHNhbXBsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDU5OTEKKworMjAxNS0wOC0xMCAxNDoxMzo1MCArMDkwMCAgSHl1bmp1biBLbyA8enpvb24ua29Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICBydHBoMjY0ZGVwYXk6IGNoZWNraW5nIGlmIGRlcGF5IGhhcyBzcHMvcHBzIG5hbHMgYmVmb3JlIGluc2VydGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MzQzMAorCisyMDE1LTA4LTA4IDE2OjQ0OjQ5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogZml4IG91dGRhdGVkIGNvbW1lbnQKKwkgIFRoZSBkZWZhdWx0IGJlaGF2aW91ciB3YXMgY2hhbmdlZCBpbiB0aGUgMC4xMCAtPiAxLngKKwkgIHRyYW5zaXRpb24sIGJ1dCB0aGUgY29tbWVudCB3YXMgbm90IHVwZGF0ZWQuCisKKzIwMTUtMDgtMDggMTc6NDI6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJICBydHB0aGVvcmFwYXk6IElmIGZsdXNoaW5nIGEgcGFja2V0IGZhaWxlZCwgZ28gb3V0IG9mIHRoZSBsb29wIGltbWVkaWF0ZWx5CisKKzIwMTUtMDgtMDggMTc6NDE6MDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJICBydHB2b3JiaXNwYXk6IElmIGZsdXNoaW5nIGEgcGFja2V0IGZhaWxlZCwgZ28gb3V0IG9mIHRoZSBsb29wIGltbWVkaWF0ZWx5CisKKzIwMTUtMDgtMDggMTc6MzQ6NTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5oOgorCSAgcnRwdGhlb3JhcGF5OiBFeHRyYWN0IHBpeGVsIGZvcm1hdCBmcm9tIHRoZSBpZGVudCBoZWFkZXIgdG8gcHV0IGl0IGludG8gdGhlIHNhbXBsaW5nIGZpZWxkIG9mIHRoZSBjYXBzCisJICBXZSBhbHdheXMgcHV0IDQ6MjowIGludG8gdGhlIGNhcHMgYmVmb3JlLCB3aGljaCBvYnZpb3VzbHkgaXMgd3JvbmcgZm9yIDQ6MjoyCisJICBhbmQgNDo0OjQgZm9ybWF0cy4KKworMjAxNS0wOC0wNiAxNzo0NjoxMyArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBrbHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBrbHZwYXkuYzoKKwkgIHJ0cGtsdihkZSlwYXk6IGFkZCAiUlRQIiBpbiB0aGUga2xhc3Mgc3RyaW5nCisJICBHc3RSVFNQTWVkaWEgdXNlcyB0aGlzIGNsYXNzaWZpY2F0aW9uIHRvIGRldGVjdCB0aGUgcmVhbCBwYXlsb2FkZXIKKwkgIGluc2lkZSBhIGR5bnBheSBiaW4gYW5kIGFzc2VydHMgaWYgaXQgZG9lc24ndCBmaW5kIGl0LCB0aGVyZWZvcmUKKwkgIGl0IGlzIHJlcXVpcmVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzMzI1CisKKzIwMTUtMDgtMDUgMTE6MTM6MDkgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYXV4LmM6CisJICB0ZXN0czogcnRwYXV4OiB1c2UgYSBkeW5hbWljIHB0IGluIHRoZSB0ZXN0CisJICAxKSBUZXN0cyB0aGF0IHVzaW5nIGR5bmFtaWMgUFQgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBvbmVzIHdvcmsKKwkgIDIpIElmIHdlIGV2ZXIgZGVjaWRlIHRvIGNoYW5nZSB0aGUgY29kZWMgaGVyZSB3ZSBkb24ndCBuZWVkIHRvCisJICB3b3JyeSBhYm91dCBjaGFuZ2UgdGhlIFBUIGZvciB0aGUgZGVmYXVsdCBvbmUgb2YgdGhlIG5ldyBjb2RlYworCSAgaW4gdGhlIHRlc3QKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDY0NDUKKworMjAxNS0wOC0wNSAxMDo1MzoxNSArMDkwMCAgSHl1bmp1biBLbyA8enpvb24ua29Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHNlbmQuYzoKKwkgIHJ0cHJ0eHNlbmQ6IHByaW50IHZhbGlkIHR5cGUgd2hlcmUgZ3VpbnQzMiBpcyBleHBlY3RlZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjQ0NQorCisyMDE1LTA4LTA2IDExOjMzOjM3ICswOTAwICBIeXVuanVuIEtvIDx6em9vbi5rb0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY21hcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYzoKKwkgIHJ0cHBheWxvYWQ6IHNldCBzdGFuZGFyZCBwYXlsb2FkIHR5cGUgYXMgZGVmYXVsdAorCSAgSW5pdGlhbGl6ZSB0aGUgUFQgdG8gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNvZGVjIGFuZCBjaGVjayBpZgorCSAgaXQgaXMgc3RpbGwgdGhlIGRlZmF1bHQgYmVmb3JlIGRlY2xhcmluZyB0aGUgcHQgdG8gYmUgZHluYW1pYyBvcgorCSAgbm90IHdoZW4gc2V0dGluZyB0aGUgY2Fwcy4KKwkgIEFsc28gdXNlIHRoZSBQVCBjb25zdGFudHMgZnJvbSB0aGUgcnRwIGxpYiB3aGVuIHBvc3NpYmxlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3OTY1CisKKzIwMTUtMDctMjYgMTI6MDc6NTYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBzdG9yZSB0aGUgbW9vZi1vZmZzZXQgYWxzbyBmb3IgcHVzaCBtb2RlCisJICBJdCB3aWxsIGJlIHVzZWQgaW4gc29tZSBjYXNlcyBmb3IgZ2V0dGluZyB0aGUgY29ycmVjdCBvZmZzZXRzCisJICBmcm9tIHRydW4gYXRvbXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyNjAzCisKKzIwMTUtMDctMjYgMDI6MDk6MjQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuaDoKKwkgIHF0ZGVtdXg6IGhhbmRsZSBkZWZhdWx0LWJhc2UtaXMtbW9vZiBmbGFnCisJICBIYW5kbGUgdGhlIGZsYWcgZnJvbSB0aGUgdGZoZCB0aGF0IHNpZ25hbHMgdGhlIGJhc2Ugb2Zmc2V0IHRvCisJICBzdGFydCBmcm9tIHRoZSBtb29mIGF0b20KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTI2MDMKKworMjAxNS0wNy0yOSAxODo1NDozNSAtMDYwMCAgR2xlbiBEaWVuZXIgPGdyZEBsb2dhbm1pbGwubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYWRlbXV4OiBQcmVzZXJ2ZSBmb3J3YXJkIHJlZmVyZW5jZWQgdHJhY2sgdGFncworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1Mjg1MAorCisyMDE1LTA4LTA0IDE4OjA3OjM1IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGF1eC5jOgorCSAgdGVzdHM6IHJ0cGF1eDogZml4IHRlc3QgZmFpbHVyZQorCSAgVGhlIFJUUCBQVCBmb3IgYWxhdyBpcyA4LgorCSAgTGVzcyB0aGFuIDUwIHBhY2tldHMgYXJlIHJlY2VpdmVkIGluIHRoZSBsZW5ndGggb2YgdGhpcyB0ZXN0IHNvIGl0CisJICB3b3VsZCBuZXZlciBkcm9wIGEgYnVmZmVyIG9yIHdvdWxkIGRyb3Agb25seSB0aGUgbGFzdCBidWZmZXIgYW5kCisJICBpdCB3b3VsZCBmYWlsIHNvbWV0aW1lcyB3aGVuIHRoZSByZWNlaXZlZCB3b3VsZG4ndCByZWNlaXZlIHRoZQorCSAgcmV0cmFuc21pc3Npb24gcGFja2V0IGluIHRpbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ2NDQ1CisKKzIwMTUtMDgtMDQgMjA6NTk6MTcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc3RyZWFtZGVwYXkuYzoKKwkgIHJ0cHN0cmVhbWRlcGF5OiBPbmx5IGFsbG93IGFjdGl2YXRpb24gaW4gcHVzaCBtb2RlCisJICBXZSBuZWVkIGEgcHJvcGVyIGNhcHMgZXZlbnQgZnJvbSB1cHN0cmVhbSB3aXRoIHRoZSBmdWxsIFJUUCBjYXBzIGFzIHdlIGNhbid0CisJICBjcmVhdGUgY2FwcyBvdXJzZWx2ZXMgZnJvbSB0aGluIGFpci4gRml4ZXMgdXNhZ2Ugb2YgcnRwc3RyZWFtZGVwYXkgYWZ0ZXIgZS5nLgorCSAgYSBmaWxlc3JjIG9yIGFueSBvdGhlciBlbGVtZW50IHRoYXQgc3VwcG9ydHMgcHVsbCBtb2RlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MzA2NgorCisyMDE1LTA4LTA0IDE2OjI4OjE3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cDogZml4IHR5cG8gaW4gdHJhbnNsYXRlZCBzdHJpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTMyNDAKKworMjAxNS0wOC0wNCAxMjoyNTo0NiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIHJ0cGgyNjRkZXBheTogUHV0IHRoZSBwcm9maWxlIGFuZCBsZXZlbCBpbnRvIHRoZSBjYXBzCisKKzIwMTUtMDgtMDQgMTI6MDk6MTIgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICBydHBoMjY0ZGVwYXk6IE9ubHkgdXBkYXRlIHRoZSBzcmNwYWQgY2FwcyBpZiBzb21ldGhpbmcgZWxzZSB0aGFuIHRoZSBjb2RlY19kYXRhIGNoYW5nZWQKKwkgIGgyNjRwYXJzZSBkb2VzIHRoZSBzYW1lLCBsZXQncyBrZWVwIHRoZSBiZWhhdmlvdXIgY29uc2lzdGVudC4gQXMgd2Ugbm93CisJICBpbmNsdWRlIHRoZSBjb2RlY19kYXRhIGluc2lkZSB0aGUgc3RyZWFtIHRvbyBoZXJlLCB0aGlzIGNhdXNlcyBsZXNzIGNhcHMKKwkgIHJlbmVnb3RpYXRpb24uCisKKzIwMTUtMDgtMDQgMTE6NDg6MjcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICBydHBoMjY0ZGVwYXk6IFBQUyByZXBsYWNlcyBhbmQgb2xkIFBQUyBpZiBpdCBoYXMgdGhlIHNhbWUgaWQsIGluZGVwZW5kZW50IG9mIFNQUyBpZAorCSAgVGhlIHNwZWMgc2F5czoKKwkgIFdoZW4gYSBwaWN0dXJlIHBhcmFtZXRlciBzZXQgTkFMIHVuaXQgd2l0aCBhIHBhcnRpY3VsYXIgdmFsdWUgb2YKKwkgIHBpY19wYXJhbWV0ZXJfc2V0X2lkIGlzIHJlY2VpdmVkLCBpdHMgY29udGVudCByZXBsYWNlcyB0aGUgY29udGVudCBvZiB0aGUKKwkgIHByZXZpb3VzIHBpY3R1cmUgcGFyYW1ldGVyIHNldCBOQUwgdW5pdCwgaW4gZGVjb2Rpbmcgb3JkZXIsIHdpdGggdGhlIHNhbWUKKwkgIHZhbHVlIG9mIHBpY19wYXJhbWV0ZXJfc2V0X2lkICh3aGVuIGEgcHJldmlvdXMgcGljdHVyZSBwYXJhbWV0ZXIgc2V0IE5BTCB1bml0CisJICB3aXRoIHRoZSBzYW1lIHZhbHVlIG9mIHBpY19wYXJhbWV0ZXJfc2V0X2lkIHdhcyBwcmVzZW50IGluIHRoZSBiaXRzdHJlYW0pLgorCisyMDE1LTA4LTAzIDEzOjQ1OjU5IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IHJlbW92ZSBleHRyYSBcbiBhdCBkZWJ1ZyBtZXNzYWdlCisKKzIwMTUtMDgtMDMgMTM6NDI6MjAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkgIHNwbGl0bXV4c2luazogcHJldmVudCBkZWFkbG9jayB3aGVuIHN0YXRlcyBjaGFuZ2UgdG9vIGZhc3QKKwkgIElmIHRoZSBHT1AgaXMgY29tcGxldGVkLCBwYWRzIGhhdmUgdG8gc3RhcnQgZ2F0aGVyaW5nIGZvciB0aGUKKwkgIG5leHQgb25lIGJ1dCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSB0aGUgc3RhdGUgbWlnaHQgZ28gdG8KKwkgIENPTExFQ1RJTkdfR09QX1NUQVJUIGFuZCBiYWNrIHRvIFdBSVRJTkdfR09QX0NPTVBMRVRFIGJlZm9yZSB0aGUKKwkgIHRocmVhZCBoYXMgYSBjaGFuY2UgdG8gd2FrZSB1cCBhbmQgcHJvY2VlZCwgbGVhdmluZyBpdCB0cmFwcGVkIGluCisJICB0aGUgY2hlY2tfY29tcGxldGVkX2dvcCBsb29wIGFuZCBkZWFkbG9ja2luZyB0aGUgb3RoZXIgdGhyZWFkcworCSAgd2FpdGluZyBmb3IgaXQgdG8gYWR2YW5jZS4KKwkgIFRvIHNvbHZlIGl0LCB0aGlzIHBhdGNoIGFsc28gY2hlY2tzIHRoYXQgdGhhIGlucHV0IHJ1bm5pbmcgdGltZQorCSAgaGFzbid0IGNoYW5nZWQgdG8gcHJldmVudCB0aGlzIHNjZW5hcmlvLgorCisyMDE1LTA4LTAzIDE3OjU1OjAxICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgcnRwaDI2NGRlcGF5OiBJbnNlcnQgU1BTL1BQUyBOQUxzIGludG8gdGhlIHN0cmVhbQorCSAgaDI2NHBhcnNlIGRvZXMgdGhlIHNhbWUgYW5kIHRoaXMgZml4ZXMgZGVjb2Rpbmcgb2Ygc29tZSBzdHJlYW1zIHdpdGggMzIgU1BTCisJICAob3IgMjU2IFBQUykuIEl0IGlzIGFsbG93ZWQgdG8gaGF2ZSBTUFMgSUQgMCB0byAzMSAob3IgUFBTIElEIDAgdG8gMjU1KSwgYnV0CisJICB0aGUgZmllbGQgaW4gdGhlIGNvZGVjX2RhdGEgZm9yIHRoZSBudW1iZXIgb2YgU1BTIG9yIFBQUyBpcyBvbmx5IDUgKG9yIDgpIGJpdC4KKwkgIEFzIHN1Y2gsIDMyIFNQUyAob3IgMjU2IFBQUykgYXJlIGludGVycHJldGVkIGFzIDAgZXZlcnl3aGVyZS4KKwkgIFRoaXMgbG9va3MgbGlrZSBhIG1pc3Rha2UgaW4gdGhlIHBhcnQgb2YgdGhlIHNwZWMgYWJvdXQgdGhlIGNvZGVjX2RhdGEuCisKKzIwMTUtMDctMzAgMTE6Mjk6MjcgKzA5MDAgIEV1bmhhZSBDaG9pIDxldW5oYWUxLmNob2lAc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogaGFuZGxlIGVtcHR5IGh0dHAgcHJveHkgc3RyaW5nCisJICAxKSBJZiB0aGUgc3lzdGVtIGh0dHBfcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldAorCSAgb3Igc2V0IHRvIGFuIGVtcHR5IHN0cmluZywgd2UgbXVzdCBub3Qgc2V0IHByb3h5IHRvIGF2b2lkCisJICBodHRwIGNvbm5lY3Rpb24gZXJyb3IuCisJICAyKSBJbiBjYXNlIG9mIHByb3h5IHByb3BlcnR5IHNldHRpbmcsIGlmIHVzZXIgd2FudCB0byBjbGVhcgorCSAgdGhlIHByb3h5IHNldHRpbmcsIHRoZXkgc2hvdWxkIGJlIGFibGUgdG8gc2V0IGl0IHRvIE5VTEwgb3IKKwkgIGFuIGVtcHR5IHN0cmluZyBhZ2Fpbiwgc28gdGhpcyBpcyBmaXhlZCB0b28uCisJICAzKSBDaGVjayBpZiB0aGUgcHJveHkgc3RyaW5nIHdhcyBwYXJzZWQgY29ycmVjdGx5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1Mjg2NgorCisyMDE1LTA3LTI5IDE1OjQ2OjIwICswNTMwICBSYXZpIEtpcmFuIEsgTiA8cmF2aS5raXJhbkBzYW1zdW5nLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9kdi9nc3RkdmRlbXV4Lmg6CisJICBkdmRlbXV4OiByZW1vdmUgdW51c2VkIHZhcmlhYmxlCisJICBSZW1vdmUgdW51c2VkIHZhcmlhYmxlICdmcmFtZWNvdW50JyBmcm9tIGR2ZGVtdXgKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTMwMDgKKworMjAxNS0wNy0zMCAxNTozMjowOSArMDkwMCAgVmluZWV0aCBUTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYXNzZXJ0aW9uIGVycm9yIGR1ZSB0byB3cm9uZyBjb25kaXRpb24gY2hlY2sKKwkgIEluIG1lZGlhIHRvIGNhcHMgZnVuY3Rpb24sIHJlc2VydmVkX2tleXMgYXJyYXkgaXMgYmVpbmcgdXNlZCBmb3IgdmFyaWFibGUgaSwKKwkgIGxlYWRpbmcgdG8gR0xpYi1DUklUSUNBTCAqKjogZ19hc2NpaV9zdHJjYXNlY21wOiBhc3NlcnRpb24gJ3MxICE9IE5VTEwnIGZhaWxlZAorCSAgY2hhbmdlZCBpdCB0byB2YXJpYWJsZSBqCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzMDA5CisKKzIwMTUtMDctMzAgMTU6MjE6MjAgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJICBydHBtcDR2ZGVwYXk6IHJ0cGJ1ZmZlciBpcyBiZWluZyB1bnJlZidlZCB0d2ljZQorCSAgcHJvY2Vzc19ydHBfcGFja2V0IGRvZXNuJ3QgdHJhbnNmZXIgdGhlIHJ0cCBidWZmZXIgdG8gbXA0dl9wcm9jZXNzX2RlcGF5CisJICB0aGUgcmVmZXJuY2Ugc2hvdWxkIG5vdCBiZSByZW1vdmVkIGhlcmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTMwNDIKKworMjAxNS0wNy0yOSAxMToyNjo0NiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogU3RyaXAga2V5cyBmcm9tIHRoZSBmbXRwIHRoYXQgd2UgdXNlIGludGVybmFsbHkgaW4gb3VyIGNhcHMKKwkgIFNraXAga2V5cyBmcm9tIHRoZSBmbXRwLCB3aGljaCB3ZSBhbHJlYWR5IHVzZSBvdXJzZWx2ZXMgZm9yIHRoZQorCSAgY2Fwcy4gU29tZSBzb2Z0d2FyZSBpcyBhZGRpbmcgcmFuZG9tIHRoaW5ncyBsaWtlIGNsb2NrLXJhdGUgaW50bworCSAgdGhlIGZtdHAsIGFuZCB3ZSB3b3VsZCBvdGhlcndpc2UgaGVyZSBzZXQgYSBzdHJpbmctdHlwZWQgY2xvY2stcmF0ZQorCSAgaW4gdGhlIGNhcHMuLi4gYW5kIHRodXMgZmFpbCB0byBjcmVhdGUgdmFsaWQgUlRQIGNhcHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTMwMDkKKworMjAxNS0wNy0yOSAxOToyODozMyArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IFN1cHBvcnQgbXBlZ3RzbXV4IGFzIGEgbXV4ZXIuCisJICBBcyBhIGZhbGxiYWNrLCBsb29rIGZvciBhIHBhZCB0ZW1wbGF0ZSBzaW5rXyVkIG9uCisJICB0aGUgbXV4ZXIgd2hlbiByZXF1ZXN0aW5nIHBhZHMsIHRvIHN1cHBvcnQgbXBlZ3RzbXV4CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyOTk5CisKKzIwMTUtMDYtMjUgMDE6MzU6MjcgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4cGFydHJlYWRlci5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuaDoKKwkgIHNwbGl0bXV4c3JjOiBVc2UgYSBzZXBhcmF0ZSBsb2NrIHRvIGRlbGF5IHR5cGVmaW5kLgorCSAgRG9uJ3QgaG9sZCB0aGUgbWFpbiBzcGxpdG11eCBwYXJ0IGxvY2sgb3ZlcgorCSAgdGhlIHBhcmVudCBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24sIGFzIGl0IHByZXZlbnRzCisJICBwb3N0aW5nIGVycm9yIG1lc3NhZ2VzIHRoYXQgaGFwcGVuLiBTaW5jZSB0aGUgcHVycG9zZQorCSAgaXMgdG8gcHJldmVudCB0eXBlZmluZGluZyBmcm9tIHByb2NlZWRpbmcsIHVzZSBhCisJICBzZXBhcmF0ZSBtdXRleCBqdXN0IGZvciB0aGF0LgorCisyMDE1LTA3LTI5IDEzOjQzOjUwICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thOiBmaXggbWVtb3J5IGxlYWsKKwkgIEFmdGVyIGFkZGluZyB0byB0YWcgbGlzdCwga2V5X3ZhbCBpcyBub3QgYmVpbmcgZnJlZSdkCisJICByZXN1bHRpbmcgaW4gbWVtb3J5IGxlYWsKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTI5OTIKKworMjAxNS0wNy0yNyAxMzozNDoxNCArMDkwMCAgTWFuYXNhIEF0aHJleWEgPG1hbmFzYS5hdGhyZXlhQGxnZS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IDE2LWJpdCBQQ00gYXVkaW8gYWR2ZXJ0aXNlZCB3aXRoICdyYXcgJyBmb3VyY2MKKwkgICdOT05FJyBhbmQgJ3JhdyAnIGZvdXJjYyBkb24ndCBhbHdheXMgY29udGFpbiBVOCBhdWRpbywgaXQgY2FuCisJICBiZSBtb3JlIGJpdHMgYXMgd2VsbCwgaW4gd2hpY2ggY2FzZSBpdCdzIGp1c3QgbGlrZSAndHdvcycuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyNjEzCisKKzIwMTUtMDctMjQgMTU6MTA6MDUgKzAyMDAgIERpbWl0cmlvcyBLYXRzYXJvcyA8cGF0Y2hlcndvcmtAZ21haWwuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyOiBBbGxvdyBmcmFtZXJhdGUgdG8gYmUgbGFyZ2UgdGhlbiAxMDBwZnMKKwkgIFRoaXMgbGltaXQgd2FzIGFyYml0cmFyeS4gV2Ugc3RpbGwgZml4YXRlIG5lYXIgMTAwcGZzIGZvciBjb21wYXRpYmlsaXR5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjgyNQorCisyMDE1LTA3LTI1IDAzOjI1OjI4IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBvY3JldGUuY2E+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBTdG9wIHdpdGhvdXQgcG9zdGluZyBlcnJvciBvbiBmbHVzaGluZworCSAgVGhpcyBjb3VsZCBqdXN0IGJlIGEgbm9ybWFsIHBpcGVsaW5lIHNodXRkb3duLgorCisyMDE1LTA3LTIzIDE1OjAwOjA4ICswOTAwICBIeXVuanVuIEtvIDx6em9vbi5rb0BzYW1zdW5nLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBzZXQgR1NUX0JVRkZFUl9DT1BZX0ZMQUdTIHRvIGNvcHkgZmxhZ3MgYWxzbworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjYxOAorCisyMDE1LTA3LTE2IDE4OjA5OjMwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYWRlbXV4LmM6CisJICB0ZXN0czogYWRkIG1pbm1hbCBtYXRyb3NrYWRlbXV4IHRlc3QgZm9yIHN1YnRpdGxlIG91dHB1dAorCSAgU29tZSBvZiB0aGUgc3VidGl0bGUgY2h1bmtzIHdpbGwgaGF2ZSBlbWJlZGRlZAorCSAgTlVMLXRlcm1pbmF0b3JzIChsYXN0IHRocmVlKSwgc29tZSBkb24ndCAoZmlyc3QgdGhyZWUpLAorCSAgc29tZSB3aWxsIGhhdmUgbWFya3VwLCBzb21lIHdvbid0LCBzb21lIHdpbGwgYmUgdmFsaWQKKwkgIFVURi04IChhbGwgYnV0IGxhc3QpLCBzb21lIHdvbid0IChsYXN0IHN0YW56YSkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyNDIxCisKKzIwMTUtMDctMTYgMTg6NDk6MjYgKzAzMDAgIERpbWl0cmlvcyBDaHJpc3RpZGlzIDxkY2hyaXN0aWRpc0BteWtvbGFiLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBmaXggZm9yIHN1YnRpdGxlIGJ1ZmZlcnMgd2l0aCBOVUwgdGVybWluYXRvcnMKKwkgIENvbW1pdCA0NTg5MmVjOCBjcmVhdGVkIGEgcmVncmVzc2lvbiB3aGVyZSBnX3V0ZjhfdmFsaWRhdGUoKSB3b3VsZCBmYWlsCisJICBpZiB0aGUgc3VidGl0bGUgYnVmZmVyIGhhZCBhIE5VTCB0ZXJtaW5hdG9yIGFzIHBhcnQgb2YgdGhlIGRhdGEuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyNDIxCisKKzIwMTUtMDctMjEgMTM6MzE6MDUgKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOGRlcGF5LmM6CisJICBydHB2cDhkZXBheTogQ2hlY2sgYXZhaWxhYmxlIGJ5dGVzIGJlZm9yZSBjb3B5CisJICBOZWVkIHRvIGNoZWNrIHRoYXQgdGhlIG51bWJlciBvZiBieXRlcyB3ZSB3YW50IHRvIGNvcHkgZnJvbSB0aGUgYWRhcHRlcgorCSAgYWN0dWFsbHkgaXMgYXZhaWxhYmxlIGFuZCBoYW5kbGUgdGhlIGVycm9yIGNhc2UgZ3JhY2VmdWxseS4gVGhpcyBlcnJvcgorCSAgbWF5IGhhcHBlbiBpZiBtYWxmb3JtZWQgcGFja2V0cyBhcmUgcmVjZWl2ZWQgYW5kIHdlIGRvbid0IGhhdmUgYQorCSAgY29tcGxldGUgZnJhbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyNjYzCisKKzIwMTUtMDctMTYgMDk6MzI6MzYgKzA5MDAgIFBhdWwgSHl1bmlsIDxwYXVsLmh5dW5pbEBsZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBTdXBwb3J0IHN1YnRpdGxlIHdoZW4gdHJhY2sgc3VidHlwZSBpcyBmb3VyY2Nfc3VidAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjY1NQorCisyMDE1LTA3LTIwIDE2OjU5OjQwICswODAwICBTb25nIEJpbmcgPGIwNjQ5OEBmcmVlc2NhbGUuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IFNldCB0aW1lc3RhbXAgd2hlbiBxdWV1ZSBidWZmZXIuCisJICBTaG91bGQgc2V0IHRpbWVzdGFtcCB3aGVuIHF1ZXVlIGJ1ZmZlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTI2MTgKKworMjAxNS0wNy0xNiAxNToxMjoxNyArMDIwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cG11eC5jOgorCSAgcnRwbXV4OiBoYW5kbGUgZGlmZmVyZW50IHNzcmMncyBvbiBzaW5rcGFkcworCSAgRG8gdGhpcyBieSBub3QgcHV0dGluZyB0aGUgc3NyYyBmcm9tIHRoZSBzcmMgcGFkcyBpbiB0aGUgY2FwcyB1c2VkIHRvCisJICBwcm9iZSBvdGhlciBzaW5rcGFkcywgYW5kIHRoZW4gIGludGVyc2VjdGluZyB3aXRoIGl0IGxhdGVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjQ5MQorCisyMDE1LTA3LTE2IDE3OjE5OjAzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS93ZWJtLW11eC5jOgorCSAgVXBkYXRlIG1haWxpbmcgbGlzdCBhZGRyZXNzIGZyb20gc291cmNlZm9yZ2UgdG8gZnJlZWRlc2t0b3AKKworMjAxNS0wNy0xNSAxMzo0NDo1MiArMDMwMCAgRGltaXRyaW9zIENocmlzdGlkaXMgPGRjaHJpc3RpZGlzQG15a29sYWIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGZpeCB0cmFpbGluZyAnKicgZGlzcGxheWVkIHdpdGggc29tZSB0ZXh0IHN1YnRpdGxlcworCSAgVGhlIHN1YnRpdGxlIGJ1ZmZlciB3ZSBwdXNoIG91dCBzaG91bGQgbm90IGluY2x1ZGUgYSBOVUwgdGVybWluYXRvcgorCSAgYXMgcGFydCBvZiB0aGUgZGF0YSwgd2UganVzdCBhZGQgc3VjaCBhIHRlcm1pbmF0b3IgZm9yIHNhZmV0eSwgYnV0CisJICBpdCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBidWZmZXIgc2l6ZS4KKwkgIEEgTlVMIHRlcm1pbmF0b3IgaXMgbm90IHZhbGlkIFVURi04LCBzbyBjaGVja3Mgd2lsbCBmYWlsIGlmIGl0J3MKKwkgIGluY2x1ZGVkIGluIHRoZSBzaXplLCBhbmQgdGhlIE5VTCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBmYWxsYmFjaworCSAgY2hhcmFjdGVyIHNwZWNpZmllZCB3aGVuIGNvbnZlcnRpbmcsIGkuZS4gJyonLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjQyMQorCisyMDE1LTA3LTE1IDE4OjIzOjA1ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlZGV2aWNlcHJvdmlkZXIuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuaDoKKwkgIHB1bHNlOiBhZGQgcHJvcGVydGllcyB0byBHc3REZXZpY2UKKwkgIEFkZCB0aGUgZXh0cmEgcHJvcGVydGllcyB3ZSBnZXQgZnJvbSBwdWxzZSB0byB0aGUgR3N0RGV2aWNlIHdlIGV4cG9zZQorCSAgd2l0aCB0aGUgZGV2aWNlIG1vbml0b3IKKworMjAxNS0wNy0xNSAxNzoyMDoyMCArMDUzMCAgUmF2aSBLaXJhbiBLIE4gPHJhdmkua2lyYW5Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jYmFuZC5jOgorCSAgYXVkaW9meDogRml4IHR5cG8gaW4gZXhhbXBsZSBwaXBlbGluZXMKKwkgIEZpeCB0eXBvIGluIGV4YW1wbGUgcGlwZWxpbmVzIG9mIGF1ZGlvd3NpbmNiYW5kIGFuZCBhdWRpb2ludmVydC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTI0MTYKKworMjAxNS0wNC0xNSAxODoyNzowNCArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkgIHNwbGl0bXV4c2luazogYWRkIGEgImZvcm1hdC1sb2NhdGlvbiIgc2lnbmFsIHRoYXQgYWxsb3dzIGJldHRlciBjb250cm9sIG92ZXIgZmlsZW5hbWVzCisJICBJbiBjZXJ0YWluIGFwcGxpY2F0aW9ucywgc3BsaXR0aW5nIGludG8gZmlsZXMgbmFtZWQgYWZ0ZXIgYSBiYXNlCisJICBsb2NhdGlvbiB0ZW1wbGF0ZSBhbmQgYW4gaW5jcmVtZW50YWwgc2VxdWVuY2UgbnVtYmVyIGlzIG5vdCBlbm91Z2guCisJICBUaGlzIHNpZ25hbCBnaXZlcyBtb3JlIGZpbmUtZ3JhaW5lZCBjb250cm9sIHRvIHRoZSBhcHBsaWNhdGlvbiB0bworCSAgZGVjaWRlIGhvdyB0byBuYW1lIHRoZSBmaWxlcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTAxMDYKKworMjAxNS0wNC0xNSAyMDoxMzoyNyArMDMwMCAgSWx5YSBLb25zdGFudGlub3YgPGlseWEua29uc3RhbnRpbm92QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5jOgorCSAgb3N4YXVkaW9zcmM6IG5vIHJlc2FtcGxpbmcgb24gT1MgWAorCSAgVW5saWtlIFJlbW90ZSBJTywgQVVIQUwgZG9lc24ndCBoYXZlIGJ1aWx0LWluIHJlc2FtcGxpbmcKKwkgIGZvciBzb3VyY2VzIC0tIGNvbmZpcm1lZCBieSBDb3JlIEF1ZGlvIGVuZ2luZWVyIERvdWcgV3lhdHQ6CisJICBodHRwOi8vbGlzdHMuYXBwbGUuY29tL2FyY2hpdmVzL2NvcmVhdWRpby1hcGkvMjAwNi9TZXAvbXNnMDAwODguaHRtbAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0Mzc1OAorCisyMDE1LTA0LTE1IDE4OjI5OjE0ICswMzAwICBJbHlhIEtvbnN0YW50aW5vdiA8aWx5YS5rb25zdGFudGlub3ZAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvLmM6CisJICBvc3hhdWRpb3NyYzogYXZvaWQgZ2V0X2NoYW5uZWxfbGF5b3V0CisJICBUaGlzIG9ubHkgcHJvZHVjZXMgYSB3YXJuaW5nIGFuZCBzZXJ2ZXMgbm8gcHVycG9zZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDM3NTgKKworMjAxNS0wNC0wNyAxNTo0MDoxNCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bkBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uYzoKKwkgIG9zeGF1ZGlvOiBBdm9pZCBtYWtpbmcgYSBkdXBsaWNhdGUgc3RydWN0dXJlIGluIGNhcHMgZm9yIG1vbm8vc3RlcmVvIGNhc2UKKwkgIEZvciAxY2ggb3IgMmNoIGRldmljZXMsIHdlIGp1c3QgbmVlZCB0byBzZXQgdGhlIGNhcHMgdG8gYWxsb3cgYm90aAorCSAgb3B0aW9ucyBzaW5jZSBDb3JlQXVkaW8gd2lsbCB1cC9kb3dubWl4IGFwcHJvcHJpYXRlbHkuCisJICBBbHNvIGZpeGVzIHRoZSBjb25kaXRpb24gZm9yIHRoZSAyY2ggY2FzZSB0byBiZSBleGFjdCwgcmF0aGVyIHRoYW4gYXQKKwkgIGxlYXN0IDIgY2hhbm5lbHMgc2luY2UgdGhlIGRvd25taXggd2lsbCBub3QgdGFrZSBwbGFjZSBpbiB0aGUgPnN0ZXJlbworCSAgY2FzZS4KKworMjAxNS0wNC0wNiAxNjoyMjozNCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bkBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9oYWwuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9yZW1vdGVpby5jOgorCSAgb3N4YXVkaW86IERvbid0IHNldCB0aGUgZm9ybWF0IG9uIGFuIGluaXRpYWxpemVkIEF1ZGlvVW5pdAorCSAgV2UgbmVlZCB0byBpbml0aWFsaXplIHRoZSBBdWRpb1VuaXQgZWFybHkgdG8gYmUgYWJsZSB0byBwcm9iZSB0aGUKKwkgIHVuZGVybHlpbmcgZGV2aWNlLCBidXQgYWNjb3JkaW5nIHRvIHRoZSBBdWRpb1VuaXRJbml0aWFsaXplKCkgYW5kCisJICBBdWRpb1VuaXRVbmluaXRpYWxpemUoKSBkb2N1bWVudGF0aW9uLCBmb3JtYXQgY2hhbmdlcyBzaG91bGQgYmUgZG9uZQorCSAgd2hpbGUgdGhlIEF1ZGlvVW5pdCBpcyB1bmluaXRpYWxpemVkLiBTbyB3ZSBleHBsaWNpdGx5IHVuaW5pdGlhbGl6ZSB0aGUKKwkgIEF1ZGlvVW5pdCBkdXJpbmcgYSBmb3JtYXQgY2hhbmdlIGFuZCByZWluaXRpYWxpemUgaXQgd2hlbiB3ZSdyZSBkb25lLgorCisyMDE1LTA0LTA2IDE1OjU1OjU5ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5oOgorCSAgb3N4YXVkaW86IE1pbm9yIHNwZWxsaW5nIGZpeCAodW5pdGlhbGl6ZSAtPiB1bmluaXRpYWxpemUpCisKKzIwMTUtMDMtMjEgMjA6MzQ6MjUgKzAyMDAgIElseWEgS29uc3RhbnRpbm92IDxpbHlhLmtvbnN0YW50aW5vdkBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5oOgorCSAgb3N4YXVkaW86IEZpeCBsb2NrdXAgaW4gX2F1ZGlvX3VuaXRfcHJvcGVydHlfbGlzdGVuZXIKKwkgIF9hdWRpb191bml0X3Byb3BlcnR5X2xpc3RlbmVyIGlzIGNhbGxlZCBlaXRoZXIgZnJvbSBhIENvcmUgQXVkaW8gdGhyZWFkCisJICBvciBhcyBhIHJlc3VsdCBvZiBhIENvcmUgQXVkaW8gQVBJIChlLmcuIEF1ZGlvVW5pdEluaXRpYWxpemUpCisJICBmcm9tIG91ciBvd24gdGhyZWFkLiBJbiB0aGUgbGF0dGVyIGNhc2UsIG9zeGJ1ZiBjYW4gYmUgYWxyZWFkeSBsb2NrZWQKKwkgIChHU3RyZWFtZXIncyBtdXRleCBpcyBub3QgcmVjdXJzaXZlKS4KKwkgIFdlIGludHJvZHVjZSB0aGUgZmxhZyBjYWNoZWRfY2Fwc192YWxpZCBhbmQgdXNlIGl0IGluc3RlYWQgb2YgbnVsbGlmeWluZworCSAgY2FjaGVkX2NhcHMgd2hlbiB3ZSBjYW5ub3QgbG9jayBvbiBvc3hidWYuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQzNzU4CisKKzIwMTUtMDMtMTIgMTI6MTU6MTIgKzAyMDAgIElseWEgS29uc3RhbnRpbm92IDxpbHlhLmtvbnN0YW50aW5vdkBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uYzoKKwkgIG9zeGF1ZGlvOiBJbnZhbGlkYXRlIGNhY2hlZCBjYXBzIG9uIGZvcm1hdCBjaGFuZ2UKKwkgIExpc3RlbiBmb3IgY2hhbmdlcyBpbiBoYXJkd2FyZSBzdHJlYW0gZm9ybWF0IGFuZCBjaGFubmVsIGxheW91dCwgYW5kCisJICBpbnZhbGlkYXRlIGNhY2hlZCBjYXBzIChzaW5jZSB0aGV5IGNvbnRhaW4gdGhlIHByZWZlcnJlZCBjYXBzKS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDM3NTgKKworMjAxNS0wMy0wOSAyMzozNDowNiArMDIwMCAgSWx5YSBLb25zdGFudGlub3YgPGlseWEua29uc3RhbnRpbm92QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9oYWwuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9yZW1vdGVpby5jOgorCSAgb3N4YXVkaW86IE92ZXJoYXVsIG9mIHByb2JpbmcgY2FwcworCSAgLSBQcm9iaW5nIGNhcHMgaXMgdW5pZmllZCBiZXR3ZWVuIHNvdXJjZSBhbmQgc2luaworCSAgLSBIYXJkd2FyZSBzdHJlYW0gZm9ybWF0IGlzIG5vdyByZXBvcnRlZCBhcyBwcmVmZXJyZWQgY2FwYWJpbGl0aWVzCisJICAoZHluYW1pY2FsbHkgdXBkYXRlZCB3aGVuIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcykKKwkgIC0gR2V0IGhhcmR3YXJlIGNoYW5uZWwgbGF5b3V0IGZyb20gUmVtb3RlIElPIGp1c3QgbGlrZSBmcm9tIEhBTAorCSAgLSBNb3JlIGNvbXByZWhlbnNpdmUgbWFwcGluZyBiZXR3ZWVuIEF1ZGlvQ2hhbm5lbExhYmVsIGFuZAorCSAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24KKwkgIC0gU3VwcG9ydCBmb3IgdW5wb3NpdGlvbmVkIGNoYW5uZWwgbGF5b3V0cworCSAgLSBBbm5vdW5jZSBzdGVyZW8tbW9ubyB1cG1peGluZy9kb3dubWl4aW5nIGluIGNhcHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDM3NTgKKworMjAxNS0wMy0wOSAyMzoxNTo1NiArMDIwMCAgSWx5YSBLb25zdGFudGlub3YgPGlseWEua29uc3RhbnRpbm92QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5jOgorCSAgb3N4YXVkaW86IEF1ZGlvVW5pdEluaXRpYWxpemUgb24gb3BlbgorCSAgQ2FsbCBBdWRpb1VuaXRJbml0aWFsaXplIHVwb24gb3Blbi4gT3RoZXJ3aXNlLCB3ZSBjYW5ub3QgZ2V0CisJICAoaGFyZHdhcmUpIHN0cmVhbSBmb3JtYXQgbm9yIGNoYW5uZWwgbGF5b3V0IGZyb20gdGhlIG91dGVyIHNjb3BlLgorCisyMDE1LTA3LTEyIDE0OjI3OjE1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cEwyNGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGR2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBrbHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzYmNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZwOGRlcGF5LmM6CisJICBydHA6IGRlcGF5bG9hZGVyczogaW1wbGVtZW50IHByb2Nlc3NfcnRwX3BhY2tldCgpIHZmdW5jCisJICBGb3IgbW9yZSBvcHRpbWlzZWQgUlRQIHBhY2tldCBoYW5kbGluZzogbWVhbnMgd2UgZG9uJ3QKKwkgIG5lZWQgdG8gbWFwIHRoZSBpbnB1dCBidWZmZXIgYWdhaW4gYnV0IGNhbiBqdXN0IHJlLXVzZQorCSAgdGhlIG1hcHBpbmcgdGhlIGJhc2UgY2xhc3MgaGFzIGFscmVhZHkgZG9uZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTAyMzUKKworMjAxNS0wNS0yNyAxOToxOToyNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkgIHJ0cHZyYXdkZXBheTogaW1wbGVtZW50IHByb2Nlc3NfcnRwX3BhY2tldCgpIHZmdW5jCisJICBGb3IgbW9yZSBvcHRpbWlzZWQgUlRQIHBhY2tldCBoYW5kbGluZzogbWVhbnMgd2UgZG9uJ3QKKwkgIG5lZWQgdG8gbWFwIHRoZSBpbnB1dCBidWZmZXIgYWdhaW4gYnV0IGNhbiBqdXN0IHJlLXVzZQorCSAgdGhlIG1hcCB0aGUgYmFzZSBjbGFzcyBoYXMgYWxyZWFkeSBkb25lLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MDIzNQorCisyMDE1LTA3LTEwIDAwOjEzOjMyICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogRml4IGluZGVudGlvbgorCisyMDE1LTA3LTA5IDIzOjU5OjEwICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogQWx3YXlzIGVzdGltYXRlIERUUyBmcm9tIHRoZSBjdXJyZW50IGNsb2NrIHRpbWUKKwkgIEVzdGltYXRpbmcgaXQgZnJvbSB0aGUgUlRQIHRpbWUgd2lsbCBnaXZlIHVzIHRoZSBQVFMsIHNvIGluIGNhc2VzIG9mIFBUUyE9RFRTCisJICB3ZSB3b3VsZCBwcm9kdWNlIHdyb25nIERUUy4gQXMgbm93IHRoZSBlc3RpbWF0ZWQgRFRTIGlzIGJhc2VkIG9uIHRoZSBjbG9jaywKKwkgIGRvbid0IHN0b3JlIGl0IGluIHRoZSBqaXR0ZXJidWZmZXIgaXRlbXMgYXMgaXQgd291bGQgb3RoZXJ3aXNlIGJlIHVzZWQgaW4gdGhlCisJICBza2V3IGNhbGN1bGF0aW9ucyBhbmQgd291bGQgaW5mbHVlbmNlIHRoZSByZXN1bHRzLiBXZSBvbmx5IHJlYWxseSBuZWVkIHRoZSBEVFMKKwkgIGZvciB0aW1lciBjYWxjdWxhdGlvbnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ5NTM2CisKKzIwMTUtMDctMDkgMDk6MjY6MDkgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkgIGdpdGlnbm9yZTogaWdub3JlIHJ0cGgyNjMgdGVzdAorCisyMDE1LTA3LTA4IDIzOjQ3OjQ0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBmaXggYnVpbGQgZXJyb3Igd2l0aCBnY2MgKERlYmlhbiA0LjkuMi0yMSkgNC45LjIKKwkgIFJlcGxhY2Ugc3RhdGljIGNvbnN0YW50cyB3aXRoIG1hY3JvcyB0byBtYWtlIGdjYyBoYXBweQorCSAgQ0MgICAgICAgZWxlbWVudHMvZWxlbWVudHNfcnRwaml0dGVyYnVmZmVyLXJ0cGppdHRlcmJ1ZmZlci5vCisJICBlbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzozODc6MTogZXJyb3I6IGluaXRpYWxpemVyIGVsZW1lbnQgaXMgbm90IGNvbnN0YW50CisJICBzdGF0aWMgY29uc3QgR3N0Q2xvY2tUaW1lIFBDTVVfQlVGX0RVUkFUSU9OID0gUENNVV9CVUZfTVMgKiBHU1RfTVNFQ09ORDsKKwkgIF4KKwkgIGVsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOjM4ODoxOiBlcnJvcjogaW5pdGlhbGl6ZXIgZWxlbWVudCBpcyBub3QgY29uc3RhbnQKKwkgIHN0YXRpYyBjb25zdCBndWludCBQQ01VX0JVRl9TSVpFID0gNjQwMDAgKiBQQ01VX0JVRl9NUyAvIDEwMDA7CisJICBeCisJICBlbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzozOTA6NTogZXJyb3I6IGluaXRpYWxpemVyIGVsZW1lbnQgaXMgbm90IGNvbnN0YW50CisJICBQQ01VX0JVRl9DTE9DS19SQVRFICogUENNVV9CVUZfTVMgLyAxMDAwOworCisyMDE1LTA3LTA4IDIzOjQwOjQ1IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBydW4gaW5kZW50IGFuZCBmaXggc29tZSBjb21tZW50cworCSAgRml4IGluZGVudCBvbiB0aGlzIGZpbGUgYW5kIGJyZWFrIHNvbWUgY29tbWVudCBsaW5lcyBpbnRvIHR3byB0byBtYWtlCisJICBpdCBmaXQgODAgY2hhcnMgcGVyIGxpbmUKKworMjAxNS0wNy0wOCAxNTowMjoyNCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJld29yayBzZWdtZW50IGV2ZW50IGhhbmRsaW5nIGZvciBhZGFwdGl2ZSBzdHJlYW1pbmcKKwkgIFdoZW4gYSBuZXcgdGltZSBzZWdtZW50IGlzIHJlY2VpdmVkIHVwc3RyZWFtIGlzIGdvaW5nIHRvIHJlc3RhcnQKKwkgIHdpdGggYSBuZXcgYXRvbS4gTWFrZSB0aGUgbmVlZGVkYnl0ZXMgYW5kIHRvZHJvcCB2YXJpYWJsZXMKKwkgIHJlZmxlY3QgdGhhdCB0byBhdm9pZCB3YWl0aW5nIHRvbyBtdWNoIG9yIGRyb3BwaW5nIHRoZQorCSAgaW5pdGlhbCBieXRlcyB0aGF0IGNvbnRhaW4gdGhlIGhlYWRlci4KKworMjAxNS0wNy0wOCAxMjozNTo1NSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHB1c2ggZGF0YSBmcm9tIGFkYXB0ZXIgYmVmb3JlIHN0YXJ0aW5nIG5ldyBzZWdtZW50CisJICBUaGUgYWRhcHRlciBtaWdodCBoYXZlIGRhdGEgcmVtYWluaW5nIGZyb20gdGhlIHByZXZpb3VzIHNlZ21lbnQsCisJICBwdXNoIGl0IGFsbCBiZWZvcmUgY2xlYXJpbmcgdGhlIGFkYXB0ZXIgYW5kIHN0YXJ0aW5nIGEgbmV3IHNlZ21lbnQuCisJICBJdCBjYW4gYWNjdW11bGF0ZSBkYXRhIGlmIGl0IGhhZCBwdXNoZWQgYW5kIGdvdCBub3QtbGlua2VkLCByZXR1cm5pbmcKKwkgIGltbWVkaWF0ZWx5IHdpdGhvdXQgcHJvY2Vzc2luZyBhbGwgdGhlIGRhdGEuIEJlZm9yZSBzdGFydGluZyBhIG5ldworCSAgc2VnbWVudCB0aGlzIGRhdGEgc2hvdWxkIGJlIGhhbmRsZWQuCisKKzIwMTUtMDctMDggMTk6NTk6MTMgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBDYWxjdWxhdGUgRFRTIGZyb20gdGhlIGNsb2NrIGlmIHdlIGhhZCBub25lIGZvciB0aGUgZmlyc3QgcGFja2V0IGFmdGVyIGEgcmVzZXQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDk1MzYKKworMjAxNS0wNy0wOCAyMTowODozNiArMDIwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBmaXggZ2FwLXRpbWUgY2FsY3VsYXRpb24gYW5kIHJlbW92ZSAibGF0ZSIKKwkgIFRoZSBhbW91bnQgb2YgdGltZSB0aGF0IGlzIGNvbXBsZXRlbHkgZXhwaXJlZCBhbmQgbm90IHdvcnRoIHdhaXRpbmcgZm9yLAorCSAgaXMgdGhlIGR1cmF0aW9uIG9mIHRoZSBwYWNrZXRzIGluIHRoZSBnYXAgKGdhcCAqIGR1cmF0aW9uKSAtIHRoZQorCSAgbGF0ZW5jeSAoc2l6ZSkgb2YgdGhlIGppdHRlcmJ1ZmZlciAocHJpdi0+bGF0ZW5jeV9ucykuIFRoaXMgaXMgdGhlIGR1cmF0aW9uCisJICB0aGF0IHdlIG1ha2UgYSAibXVsdGktbG9zdCIgcGFja2V0IGZvci4KKwkgIFRoZSAibGF0ZSIgY29uY2VwdCBtYWRlIHNvbWUgc2Vuc2UgaW4gMC4xMCBhcyBpdCByZWZsZWN0ZWQgdGhhdCBhIGJ1ZmZlcgorCSAgY29taW5nIGluIGhhZCBub3QgYmVlbiB3YWl0ZWQgZm9yIGF0IGFsbCwgYnV0IGhhZCBhIHRpbWVzdGFtcCB0aGF0IHdhcworCSAgb3V0c2lkZSB0aGUgaml0dGVyYnVmZmVyIHRvIHdhaXQgZm9yLiBXaXRoIHRoZSByZXdyaXRlIG9mIHRoZSB3YWl0aW5nCisJICAodGltZW91dCkgbWVjaGFuaXNtIGluIDEuMCwgdGhpcyBubyBsb25nZXIgbWFrZXMgYW55IHNlbnNlLCBhbmQgdGhlCisJICB2YXJpYWJsZSBubyBsb25nZXIgcmVmbGVjdHMgYW55dGhpbmcgbWVhbmluZ2Z1bCAobnVtID4gMCBpcyB1c2VsZXNzLAorCSAgdGhlIGR1cmF0aW9uIGlzIHdoYXQgbWF0dGVycykKKwkgIEZpeGVkIHVwIHRoZSB0ZXN0cyB0aGF0IGhhZCBiZWVuIHNsaWdodGx5IG1vZGlmaWVkIGluIDEuMCB0byBhbGxvdyBmYXVsdHkKKwkgIGJlaGF2aW9yIHRvIHNuZWFrIGluLCBhbmQgcG9ydCBzb21lIG9mIHRoZW0gdG8gdXNlIEdzdEhhcm5lc3MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM4MzYzCisKKzIwMTUtMDYtMzAgMTE6MjE6MzEgKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIFJldmVydCAicnRwaml0dGVyYnVmZmVyOiBGaXggZXhwZWN0ZWRfZHRzIGNhbGMgaW4gY2FsY3VsYXRlX2V4cGVjdGVkIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCAwNWJkNzA4ZmM1ZTg4MTM5MGZlODM5ODAzYjUzMTQ0MzkzZDk1YWIwLgorCSAgVGhlIHJldmVydGVkIHBhdGNoIGlzIHdyb25nIGFuZCBpbnRyb2R1Y2VzIGEgcmVncmVzc2lvbiBiZWNhdXNlIHRoZXJlCisJICBtYXkgc3RpbGwgYmUgdGltZSB0byByZWNlaXZlIHNvbWUgb2YgdGhlIHBhY2tldHMgaW5jbHVkZWQgaW4gdGhlIGdhcAorCSAgaWYgdGhleSBhcmUgcmVvcmRlcmVkLgorCisyMDE1LTA3LTA3IDIzOjUzOjAyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZmx1c2ggc2FtcGxlcyBiZWZvcmUgYWRkaW5nIG1vcmUgZnJvbSBtb29mCisJICBBdm9pZHMgYWNjdW11bGF0aW5nIGFsbCBzYW1wbGVzIGZyb20gYSBmcmFnbWVudGVkIHN0cmVhbSB0aGF0IGNvdWxkCisJICBsZWFkIHRvIGEgJ2luZGV4LXRvby1iaWcnIGVycm9yIG9uY2UgaXQgZ29lcyBvdmVyIDUwTUIgb2YgZGF0YS4gSXQKKwkgIGNvdWxkIHJlYWNoIHRoYXQgYmVmb3JlIDJoIG9mIHBsYXliYWNrIHNvIGl0IGRvZXNuJ3QgdGFrZSB0aGF0IGxvbmcuCisJICBBcyB1cHN0cmVhbSBlbGVtZW50cyBhcmUgcHJvdmlkaW5nIGRhdGEgaW4gdGltZSBmb3JtYXQgdGhleSBzaG91bGQKKwkgIGJlIHRoZSBvbmVzIHRoYXQgaGF2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmdWxsIG1lZGlhIGluZGV4CisJICBhbmQgc2hvdWxkIGJlIGFibGUgdG8gc2VlayBpZiBwb3NzaWJsZS4KKworMjAxNS0wNy0wNyAyMzo1NjoxMiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5oOgorCSAgcXRkZW11eDogcmVuYW1lIHVwc3RyZWFtX25ld3NlZ21lbnQgdG8gdXBzdHJlYW1fZm9ybWF0X2lzX3RpbWUKKwkgIHVwc3RyZWFtX25ld3NlZ21lbnQgaXNuJ3QgcmVhbGx5IGNsZWFyIG9uIHdoYXQgaXQgbWVhbnMsIGl0IGlzIHNldAorCSAgdG8gVFJVRSB3aGVuIHRoZSB1cHN0cmVhbSBlbGVtZW50IHNlbmRzIGEgc2VnbWVudCBpbiBUSU1FIGZvcm1hdCwgc28KKwkgIHJlbmFtZSBpdCB0byBiZSBtb3JlIGNsZWFyIGFib3V0IGl0LgorCSAgSXQgaXMgaW1wb3J0YW50IHRvIGtub3cgdGhpcyBiZWNhdXNlIGl0IG1lYW5zIHRoYXQgdXBzdHJlYW0gaGFzCisJICBhIG5vdGlvbiBvZiB0aW1lIGFuZCBxdGRlbXV4IGlzIGxpa2VseSBiZWluZyBkcml2ZW4gYnkgYW4gdXBzdHJlYW0KKwkgIGVsZW1lbnQgdGhhdCBpcyByZWFkaW5nIGZyb20gYSBoaWdoZXIgbGV2ZWwgYWJzdHJhY3Rpb24gdGhhbiBhIGZpbGUsCisJICBzdWNoIGFzIGEgREFTSCwgTVNTIG9yIERMTkEgZWxlbWVudC4KKworMjAxNS0wNy0wNyAyMTozMTowOCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBsZWFrIGJ5IGZsdXNoaW5nIHByZXZpb3VzIHNhbXBsZSBpbmZvIGZyb20gdHJhaworCSAgSW4gZnJhZ21lbnRlZCBzdHJlYW1pbmcsIG11bHRpcGxlIG1vb3YvbW9vZiB3aWxsIGJlIHBhcnNlZCBhbmQgdGhlaXIKKwkgIHByZXZpb3VzbHkgc3RvcmVkIHNhbXBsZXMgYXJyYXkgbWlnaHQgbGVhayB3aGVuIG5ldyB2YWx1ZXMgYXJlIHBhcnNlZC4KKwkgIFRoZSBwYXJzZV90cmFrIGFuZCBjYWxsZWVzIHdvbid0IGZyZWUgdGhlIHByZXZpb3VzbHkgc3RvcmVkIHZhbHVlcworCSAgYmVmb3JlIHBhcnNpbmcgdGhlIG5ldyBvbmVzLgorCSAgSW4gc3RlcC1ieS1zdGVwLCB0aGlzIGlzIHdoYXQgaGFwcGVuczoKKwkgIDEpIGluaXRpYWwgbW9vdiBpcyBwYXJzZWQsIHRyYWtzIGFzIHdlbGwsIHN0cmVhbXMgYXJlIGNyZWF0ZWQuIFRoZQorCSAgdHJhayBkb2Vzbid0IGNvbnRhaW4gc2FtcGxlcyBiZWNhdXNlIHRoZXkgYXJlIGluIHRoZSBtb29mJ3MgdHJ1bgorCSAgYm94ZXMuIG5fc2FtcGxlcyBpcyBzZXQgdG8gMCB3aGlsZSBwYXJzaW5nIHRoZSB0cmFrIGFuZCB0aGUgc2FtcGxlcworCSAgYXJyYXkgaXMgc3RpbGwgTlVMTC4KKwkgIDIpIG1vb2ZzIGFyZSBwYXJzZWQsIGFuZCB0aGVpciB0cnVuIGJveGVzIHdpbGwgaW5jcmVhc2Ugbl9zYW1wbGVzIGFuZAorCSAgY3JlYXRlL2V4dGVuZCB0aGUgc2FtcGxlcyBhcnJheQorCSAgMykgQXQgc29tZSBwb2ludCBhIG5ldyBtb292IG1pZ2h0IGJlIHNlbnQgKGJpdHJhdGUgc3dpdGNoaW5nLCBmb3IgZXhhbXBsZSkKKwkgIGFuZCBwYXJzaW5nIHRoZSB0cmFrIHdpbGwgb3ZlcndyaXRlIG5fc2FtcGxlcyB3aXRoIHRoZSB2YWx1ZXMgZnJvbQorCSAgdGhpcyB0cmFrLiBJZiB0aGUgbl9zYW1wbGVzIGlzIHNldCB0byAwIHF0ZGVtdXggd2lsbCBhc3N1bWUgdGhhdAorCSAgdGhlIHNhbXBsZXMgYXJyYXkgaXMgTlVMTCBhbmQgd2lsbCBsZWFrIGl0IHdoZW4gYSBuZXcgb25lIGlzCisJICBjcmVhdGVkIGZvciB0aGUgc3Vic2VxdWVudCBtb29mcy4KKwkgIFRoaXMgcGF0Y2ggbWFrZXMgcXRkZW11eCBwcm9wZXJseSBmcmVlIHByZXZpb3VzIHNhbXBsZSBkYXRhIGJlZm9yZQorCSAgY3JlYXRpbmcgbmV3IG9uZXMgYW5kIGFkZHMgYW4gYXNzZXJ0IHRvIGNhdGNoIGZ1dHVyZSBvY2N1cnJlbmNlcyBvZgorCSAgdGhpcyBpc3N1ZSB3aGVuIHRoZSBjb2RlIGNoYW5nZXMuCisKKzIwMTUtMDctMDcgMTY6NDY6MzMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggaW5kZXggc2l6ZSBjaGVjayBhbmQgZGVidWcgbWVzc2FnZQorCSAgSXQgaXMgYWxsb2NhdGluZyBzYW1wbGVzX2NvdW50ICsgbl9zYW1wbGVzLCBub3Qgb25seSBuX3NhbXBsZXMKKworMjAxNS0wNy0wOCAxNzowMjowNSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IENhbGN1bGF0ZSByZWNlaXZlIHRpbWUgaWYgd2UgZG9uJ3QgaGF2ZSBhbnkKKwkgIFRoaXMgaXMgcmVxdWlyZWQgdG8gcHJvcGVybHkgc2NoZWR1bGUgcGFja2V0IGxvc3MgdGltZXJzIGFuZCBtYWtlCisJICBzdXJlIGFsbCBvdXIgY2FsY3VsYXRpb25zIHdvcmsgcHJvcGVybHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ5NTM2CisKKzIwMTUtMDctMDggMTU6MTM6MTcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBIYW5kbGUgc2VxbnVtIGdhcHMgaW4gVENQIHN0cmVhbXMgd2l0aG91dCBlcnJvcmluZyBvdXQgb3Igb3ZlcmZsb3dpbmcgY2FsY3VsYXRpb25zCisJICBUaGF0IGlzLCBoYW5kbGUgRFRTPT1HU1RfQ0xPQ0tfVElNRV9OT05FIGNvcnJlY3RseS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDk1MzYKKworMjAxNS0wNy0wOCAyMDozMTo0MiArMDkwMCAgVmluZWV0aCBUIE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggZXZlbnQgbGVhaworCSAgd2hlbiBzZWVrIGZhaWxzIGluIGF2aWRlbXV4LCBldmVudCBpcyBub3QgYmVpbmcgZnJlZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyMTE3CisKKzIwMTUtMDctMDggMTI6MDI6MjIgKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5jOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBoMjYzLmM6CisJICBydHBoMjYzZGVwYXk6IE1ha2Ugc3VyZSBwYXlsb2FkIGlzIGxhcmdlIGVub3VnaAorCSAgUGx1cyBuZXcgdW5pdCB0ZXN0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjExMgorCisyMDE1LTA3LTA4IDA4OjU5OjQ5ICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGtsdmRlcGF5LmM6CisJICBydHBrbHZkZXBheTogZml4IHByaW50ZiBmb3JtYXQgY29tcGlsZXIgd2FybmluZworCSAgdl9sZW4gaXMgb2YgdHlwZSBndWludDY0LCBidXQgd2hpbGUgcHJpbnQgdGhlIHZhbHVlKDE2ICsgbGVuX3NpemUgKyB2X2xlbikKKwkgIEdfR1NJWkVfRk9STUFUIGlzIGJlaW5nIHVzZWQgaW5zdGVhZCBvZiBHX0dVSU5UNjRfRk9STUFUCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyMTAwCisKKzIwMTUtMDctMDcgMjA6MjU6NDcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSAgZG9jczogYWRkIG5ldyBSVFAgZWxlbWVudHMgdG8gZG9jcworCisyMDE1LTA3LTA3IDIwOjA3OjMxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSAgdGVzdHM6IHJ0cC1wYXlsb2FkaW5nOiBhZGQgYmFzaWMgdW5pdCB0ZXN0IGZvciBLTFYgcGF5bG9hZGluZworCSAgQWxzbyBtYWtlIGl0IHNvIHRoYXQgdGhlIG10dSBpcyBhbHdheXMgc2V0IGlmIHNwZWNpZmllZCwgbm90CisJICBvbmx5IGluIGNhc2Ugb2YgdGhlIHJhdGhlciB3ZWlyZCBidWZmZXJsaXN0IHRlc3QgY29kZSBwYXRoLgorCSAgVGhpcyBhbGxvd3MgdXMgdG8gZWFzaWx5IG1ha2UgdGhlIHBheWxvYWRlciBmcmFnbWVudCBhIHBheWxvYWQKKwkgIGFjcm9zcyBtdWx0aXBsZSBvdXRwdXQgcGFja2V0cyBieSBzZXR0aW5nIGEgc21hbGwgTVRVIG9uIGl0LgorCisyMDE1LTA3LTA3IDE5OjU4OjQyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGtsdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGtsdmRlcGF5Lmg6CisJICBydHBrbHZkZXBheTogaW1wcm92ZSBzdGFydCBkZXRlY3Rpb24gYW5kIGhhbmRsZSBmcmFnbWVudGVkIEtMViB1bml0cworCisyMDE1LTA3LTA1IDIwOjI1OjEwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwa2x2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwa2x2ZGVwYXkuaDoKKwkgIHJ0cDogYWRkIFNNUFRFIDMzNk0gS0xWIG1ldGFkYXRhIGRlcGF5bG9hZGVyCisJICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NTk3CisKKzIwMTQtMDgtMDkgMTA6MDg6NDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cC9nc3RydHBrbHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwa2x2cGF5Lmg6CisJICBydHA6IGFkZCBTTVBURSAzMzZNIEtMViBtZXRhZGF0YSBwYXlsb2FkZXIKKwkgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY1OTcKKworMjAxNS0wNy0wNyAxNjo1OToyMCArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSogZ3N0L2lzb21wNC9hdG9tcy5oOgorCSogZ3N0L2lzb21wNC9hdG9tc3JlY292ZXJ5LmM6CisJKiBnc3QvaXNvbXA0L3Byb3BlcnRpZXMuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgZG9jczogZml4ICJTeW1ib2wgbmFtZSBub3QgZm91bmQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjb21tZW50IGJsb2NrIgorCSAgQWRkIHN5bWJvbHMgb3IgY2hhbmdlIGNvbW1lbnQgaW50byBhIHJlZ3VsYXIgY29tbWVudC4KKworMjAxNS0wNy0wNyAxNjo1ODo1MyArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5oOgorCSAgZG9jczogcmVtb3ZlIG91dGRhdGVkIGRvYyBzdHJpbmdzCisKKzIwMTUtMDctMDMgMjM6MTA6NDAgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgZG9jczogYWRkIG1pc3NpbmcgcGx1Z2lucyBhbmQgZW5zdXJlIG1hc3RlciBkb2MgaXMgc29ydGVkCisKKzIwMTUtMDctMDcgMTU6NTQ6NDEgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNAZGViZXRoZW5jb3VydC5jb20+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgUmV2ZXJ0ICJpbWFnZWZyZWV6ZTogUmVtb3ZlIGltcG9zc2libGUgZXJyb3IgY29uZGl0aW9uIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCBkNDY2MzFjNWM3MzEyYWQ2MTMzOTdmODIzOGM3YTk3MTRhZTNhZTk0LgorCSAgcGFkIG9ubHkgaGFuZGxlIEVPUyBldmVudHMgYnV0IG5vdCBFT1MgZmxvdywgYW5kIHdpbGwgcHVzaCB0aGUgYnVmZmVyIGFnYWluCisJICByZXN1bHRpbmcgaW4gYW4gYXNzZXJ0aW9uIGVycm9yLiBTbyB3ZSBzaG91bGQgbm90IGhhbmRsZSB0aGUgYnVmZmVyCisJICBhbmQgcmV0dXJuIEVPUyBmbG93LgorCisyMDE1LTA3LTA3IDE1OjUwOjUwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jOgorCSAgcnRwZzcyOWRlcGF5OiB1bm1hcCBydHAgYnVmZmVyIGluIGVycm9yIHBhdGgKKworMjAxNS0wNy0wNyAxNTo0ODo0MCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6CisJICBydHBnNzI5cGF5OiBmaXggYnVmZmVyIGxlYWsKKwkgIFRoZSBoYW5kbGVfYnVmZmVyIHZmdW5jIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgaW5wdXQgYnVmZmVyLgorCSAgRml4ZXMgZWxlbWVudHMvcnRwLXBheWxvYWRpbmcgdW5kZXIgdmFsZ3JpbmQuCisKKzIwMTUtMDctMDIgMDg6NTI6NDMgKzAyMDAgIFRvYmlhcyBNdWVsbGVyIDxtdWVsbGlAY3J5cHRvYml0Y2guZGU+CisKKwkqIGdzdC9nb29tL2dvb21fY29yZS5jOgorCSAgZ29vbTogSW5pdGlhbGlzZWQgdmFyaWFibGVzIHRvIHJlbW92ZSBjb21waWxlciB3YXJuaW5ncworCSAgZ29vbV9jb3JlLmM6IEluIGZ1bmN0aW9uICdnb29tX3VwZGF0ZSc6CisJICBnb29tX2NvcmUuYzo2ODU6NTogZXJyb3I6ICdwYXJhbTInIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbiBbLVdlcnJvcj1tYXliZS11bmluaXRpYWxpemVkXQorCSAgZ29vbV9saW5lc19zd2l0Y2hfdG8gKGdvb21JbmZvLT5nbWxpbmUyLCBtb2RlLCBwYXJhbTIsIGFtcGxpdHVkZSwgY291bGV1cik7CisJICBeCisJICBnb29tX2NvcmUuYzo2ODQ6NTogZXJyb3I6ICdwYXJhbTEnIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbiBbLVdlcnJvcj1tYXliZS11bmluaXRpYWxpemVkXQorCSAgZ29vbV9saW5lc19zd2l0Y2hfdG8gKGdvb21JbmZvLT5nbWxpbmUxLCBtb2RlLCBwYXJhbTEsIGFtcGxpdHVkZSwgY291bGV1cik7CisJICBeCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyMDUzCisKKzIwMTUtMDctMDcgMDk6MTg6MzkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2MXBheS5jOgorCSAgcnRwaDI2MXBheTogZml4IGluZGVudGF0aW9uCisKKzIwMTUtMDctMDYgMTk6MTE6MDAgKzA5MDAgIEppbW15IE9obiA8eW9uZ2ppbi5vaG5AbGdlLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYxcGF5LmM6CisJICBydHBoMjYxcGF5OiBGaXggdW5pbml0aWFsaXplZCB2YXJpYWJsZSBjb21waWxlciBlcnJvcgorCSAgZW5kcG9zIHZhcmlhYmxlIGRvZXMgbm90IGNvcnJlY3RseSB1bmRlcnN0YW5kIGluIHRoZQorCSAgNC42LjMgR0NDIHZlcnNpb24uIFNvIGNvbXBpbGUgZXJyb3IgYXBwZWFycyB3aGVuIHdlIGRvCisJICBjb21waWxlIHJ0cGgyNjFwYXkgdXNpbmcgamhidWlsZC4KKwkgIFRoaXMgcGF0Y2ggaXMgZml4ZWQgdGhlIGNvbXBpbGUgZXJyb3IgaW4gNC42LjMgR0NDIHZlcnNpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxOTg1CisKKzIwMTQtMTEtMTIgMTI6MDg6NTggKzAxMDAgIEphbiBBbGV4YW5kZXIgU3RlZmZlbnMgKGhlZnRpZykgPGpzdGVmZmVuc0BtYWtlLnR2PgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogSGFuZGxlIHNlZWsgZmxhZ3MgcHJvcGVybHkKKwkgIEFsbG93cyBmb3Igbm9uLWtleWZyYW1lIHNlZWtzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczODU3MAorCisyMDE1LTAyLTI0IDEwOjUwOjUyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogYXZvaWQgbG9vcGluZyByZWFkaW5nIHRoZSAnbW9vZicgYXRvbSBmb3JldmVyCisJICBJdCBnZXRzIHN0dWNrIGlmIGl0IG9ubHkgZmluZHMgYSBtb29mIGFuZCBubyBtZnJhL21mcm8gb3IgbW9vdgorCSAgYXRvbXMuIFNraXAgdGhlIG1vb2YgdG8gY29udGludWUgdGhlIHBhcnNpbmcgdG8gaGF2ZSBpdCBlaXRoZXIKKwkgIHBsYXkgb3IgZXJyb3Igb3V0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTA4OQorCisyMDE1LTA2LTI2IDEzOjI0OjE3ICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBmbGFjZGVjOiBpbXByb3ZlIGVycm9yIGhhbmRsaW5nCisJICBmb3IgZmlsZXMgd2hpY2ggaGF2ZSBjb3JydXB0ZWQgaGVhZGVyLCBsaWJmbGFjIGlzIG5vdCBhYmxlIHRvCisJICBwcm9jZXNzIHRoZSBtZXRhZGF0YSBwcm9wZXJseS4gV2UganVzdCB0cnkgdG8gaWdub3JlIHRoZSBlcnJvcgorCSAgYW5kIGNvbnRpbnVlIHdpdGggdGhlIHByb2Nlc3NpbmcsIHNpbmNlIG1ldGFkYXRhIHBhcnNpbmcgaXMgbm90CisJICBtYWtpbmcgbXVjaCBvZiBhIGRpZmZlcmVuY2UgdG8gbGliZmxhYworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTMzNAorCisyMDE1LTA3LTA2IDIwOjE2OjM4ICswOTAwICBIeXVuanVuIEtvIDx6em9vbi5rb0BzYW1zdW5nLmNvbT4KKworCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmM6CisJICB4aW1hZ2VzcmM6IGFkZCBtZXRhIHRyYW5zZm9ybSBmdW5jdGlvbgorCSAgeGltYWdlIG1ldGFkYXRhIGNhbid0IGJlIHRyYW5zZm9ybWVkIG9yIGNvcGllZCwgYnV0IHByb3ZpZGUgYW4gZW1wdHkKKwkgIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIGluc3RlYWQgb2YgTlVMTCB0byBhbGxvdyB1bmNvbmRpdGlvbmFsIGNhbGxpbmcKKwkgIG9mIG1ldGFzJyB0cmFuc2Zvcm0gZnVuY3Rpb25zLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTc3OAorCisyMDE0LTA2LTE2IDE2OjE0OjI4ICswMjAwICBTdGlhbiBTZWxuZXMgPHN0aWFuLnNlbG5lc0BnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSAgcnRwaDI2M3BkZXBheTogaW5pdCBkZWJ1ZyBjYXRlZ29yeQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjAxMgorCisyMDE0LTA2LTIwIDEwOjU5OjE0ICswMjAwICBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5jOgorCSAgcnRwdjhkZXBheTogaWdub3JlIHJlc2VydmVkIGJpdCBpbiBwYXlsb2FkIGRlc2NyaXB0b3IKKwkgIERyYWZ0IDE2IG9mICJSVFAgUGF5bG9hZCBGb3JtYXQgZm9yIFZQOCIgc3RhdGVzIGluIHNlY3Rpb24gNC4yIHRoYXQ6CisJICBSOiBCaXQgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuICBNVVNUIGJlIHNldCB0byB6ZXJvIGFuZCBNVVNUIGJlCisJICBpZ25vcmVkIGJ5IHRoZSByZWNlaXZlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTE5MjkKKworMjAxNS0wNy0wNCAyMDo1Njo0MiArMDIwMCAgU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYxcGF5LmM6CisJICBydHBoMjYxcGF5OiBydHBoMjYxZGVwYXk6IEFkZCBkb2N1bWVudGF0aW9uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxOTgyCisKKzIwMTUtMDctMDMgMjE6NTg6MTQgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBmNzRiMmRmIHRvIDlhZWQxZDcKKworMjAxNS0wNy0wMyAxNDoyOToxNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYxcGF5LmM6CisJICBydHBoMjYxcGF5OiBGaXggY29tcGlsZXIgd2FybmluZworCSAgZ3N0cnRwaDI2MXBheS5jOiBJbiBmdW5jdGlvbiAnZ3N0X3J0cF9oMjYxX3BheV9jbGFzc19pbml0JzoKKwkgIGdzdHJ0cGgyNjFwYXkuYzoxMDAzOjE3OiBlcnJvcjogdmFyaWFibGUgJ2dvYmplY3RfY2xhc3MnIHNldCBidXQgbm90IHVzZWQgWy1XZXJyb3I9dW51c2VkLWJ1dC1zZXQtdmFyaWFibGVdCisJICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisKKzIwMTUtMDctMDMgMTQ6MDM6MDUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2MWRlcGF5LmM6CisJICBydHBoMjYxZGVwYXk6IExldCB0aGUgYmFzZSBjbGFzcyBwdXNoIHRoZSBidWZmZXIgc28gaXQgY2FuIGRlYWwgd2l0aCB0aGUgZmxvdyByZXR1cm4KKworMjAxNS0wNy0wMyAxNDoxMTozNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYxcGF5LmM6CisJICBydHBoMjYxcGF5OiBSZW1vdmUgdW51c2VkIGFkYXB0ZXIKKworMjAxNS0wNy0wMyAxMzoxNzoyNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSAgc3BlZXhwYXk6IERpcmVjdGx5IGF0dGFjaCBwYXlsb2FkIHRvIHRoZSBvdXRwdXQgYnVmZmVyIGluc3RlYWQgb2YgY29weWluZyBpdAorCisyMDE1LTA3LTAzIDEzOjA3OjIwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5jOgorCSAgc2JjcGF5OiBBdHRhY2ggcGF5bG9hZCBkaXJlY3RseSB0byB0aGUgb3V0cHV0IGluc3RlYWQgb2YgY29weWluZworCisyMDE0LTEyLTAxIDE0OjE4OjQwICswMTAwICBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYxZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2MXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYxcGF5Lmg6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSAgcnRwOiBhZGQgSC4yNjEgUlRQIHBheWxvYWRlciBhbmQgZGVwYXlsb2FkZXIKKwkgIEltcGxlbWVudGF0aW9uIGFjY29yZGluZyB0byBSRkMgNDU4Ny4KKwkgIFBheWxvYWRlciBjcmVhdGUgZnJhZ21lbnRzIG9uIE1CIGJvdW5kYXJpZXMgaW4gb3JkZXIgdG8gbWF0Y2ggTVRVIHNpemUKKwkgIHRoZSBiZXN0IGl0IGNhbi4gU29tZSBkZWNvZGVycy9kZXBheWxvYWRlcnMgaW4gdGhlIHdpbGQgYXJlIHZlcnkgc3RyaWN0CisJICBhYm91dCByZWNlaXZpbmcgYSBjb250aW51b3VzIGJpdC1zdHJlYW0gKGUuZy4gbm8gbm8tb3AgYml0cyBiZXR3ZWVuCisJICBmcmFtZXMpLCBzbyB0aGUgcGF5bG9hZGVyIHdpbGwgc2hpZnQgdGhlIGNvbXByZXNzZWQgYml0LXN0cmVhbSBvZiBhCisJICBmcmFtZSB0byBhbGlnbiB3aXRoIHRoZSBsYXN0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgcHJldmlvdXMgZnJhbWUuCisJICBEZXBheWxvYWRlciBkb2VzIG5vdCB0cnkgdG8gYmUgZmFuY3kgaW4gY2FzZSBvZiBwYWNrZXQgbG9zcy4gSXQgc2ltcGx5CisJICBkcm9wcyBhbGwgcGFja2V0cyBmb3IgYSBmcmFtZSBpZiB0aGVyZSBpcyBhIGxvc3MsIGtlZXBpbmcgaXQgc2ltcGxlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTg4NgorCisyMDE1LTA3LTAzIDEyOjE4OjUyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wdmRlcGF5LmM6CisJICBydHBtcHZkZXBheTogRG9uJ3QgZm9yZ2V0IHRvIHVubWFwIHRoZSBpbnB1dCBidWZmZXIKKworMjAxNS0wNy0wMyAxMjoxNDo0NyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBtcHZwYXkuYzoKKwkgIHJ0cG1wdnBheTogQ3JlYXRlIGJ1ZmZlciBsaXN0cyBpbnN0ZWFkIG9mIHB1c2hpbmcgZWFjaCBidWZmZXIgaW5kaXZpZHVhbGx5CisKKzIwMTUtMDctMDMgMTI6MDM6NTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJICBydHBtcGFwYXk6IFVzZSBidWZmZXIgbGlzdHMgaW5zdGVhZCBvZiBwdXNoaW5nIGVhY2ggZnJhZ21lbnQgaW5kaXZpZHVhbGx5CisKKzIwMTUtMDctMDMgMTA6NTE6NTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5jOgorCSAgcnRwbXA0YXBheTogQ3JlYXRlIGJ1ZmZlciBsaXN0cyBhbmQgZG9uJ3QgY29weSBwYXlsb2FkIG1lbW9yeQorCisyMDE1LTA2LTI5IDE2OjE0OjE4ICswMjAwICBNaWd1ZWwgUGFyw61zIETDrWF6IDxtcGFyaXNkaWF6QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IENvbnNpZGVyIHRpbWVycyBsZW4gdG8gY29tcGFyZSB3aXRoIFJUUF9NQVhfRFJPUE9VVAorCSAgV2hlbiB0aGVyZSBhcmUgYSBsb3Qgb2Ygc21hbGwgZ2Fwcywgd2UgY2FuIGNvbnNpZGVyIHRoYXQgdGhlcmUgaXMKKwkgIGEgYmlnIGdhcCAodG9vIGxvc3NlcykgdG8gcmVzZXQgdGhlIGJ1ZmZlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTE2MzYKKworMjAxNS0wNi0yOSAxNTo1Mzo1MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogSWYgcG9zc2libGUsIGFsd2F5cyB1cGRhdGUgdGhlIGN1cnJlbnQgdGltZSBiZWZvcmUgbG9vcGluZyBvdmVyIGFsbCB0aW1lcnMKKwkgIElmIHdlIGhhdmUgYSBjbG9jaywgdXBkYXRlICJub3ciIG5vdyB3aXRoIHRoZSB2ZXJ5IGxhdGVzdCBydW5uaW5nIHRpbWUgd2UgaGF2ZS4KKwkgIElmIHRpbWVycyBhcmUgdW5zY2hlZHVsZWQgYmVsb3cgd2Ugb3RoZXJ3aXNlIHdvdWxkbid0IHVwZGF0ZSBub3cgKGl0J3Mgb25seSB1cGRhdGVkCisJICB3aGVuIHRpbWVycyBleHBpcmUpLCBhbmQgYWxzbyBmb3IgdGhlIHZlcnkgZmlyc3QgbG9vcCBpdGVyYXRpb24gbm93IHdvdWxkIG90aGVyd2lzZQorCSAgYWx3YXlzIGJlIDAuCisJICBBbHNvIHRoZSB0aW1lIGlzIHVzZWQgZm9yIHRoZSB0aW1lb3V0IGZ1bmN0aW9ucywgZS5nLiB0byBjYWxjdWxhdGUgYW55IHRpbWVzCisJICBmb3IgdGhlIG5leHQgdGltZW91dHMgYW5kIHdlIHdvdWxkIG90aGVyd2lzZSBwYXNzIHRvbyBvbGQgdGltZXMgdGhlcmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxNjM2CisKKzIwMTUtMDctMDIgMTQ6MzQ6NTcgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IGZpeCBtZW1vcnkgbGVhaworCSAgdG1wIG5lZWRzIHRvIGJlIGZyZWVkIGJlZm9yZSBnb2luZyBvdXQgb2Ygc2NvcGUgaW4gJ2RvbmUnLgorCSAgQ0lEICMxMzA4OTU0CisKKzIwMTUtMDctMDIgMTI6MjM6NDUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkgIHJ0cGgyNjNwcGF5OiBHZW5lcmF0ZSBidWZmZXIgbGlzdHMgYW5kIGF0dGFjaCB0aGUgcGF5bG9hZCBkaXJlY3RseSBpbnN0ZWFkIG9mIGNvcHlpbmcgaXQKKworMjAxNS0wNy0wMiAwOTo0ODowMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJICBydHBoMjYzcGRlcGF5OiBTaW1wbGlmeSBjb2RlIGEgYml0IGFuZCBkbyBsZXNzIGRpcmVjdCBtZW1jcHkgYW5kIGxldCBHc3RCdWZmZXIgZG8gdGhhdCBmb3IgdXMKKworMjAxNS0wNy0wMiAwOToxNzo1OSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaDoKKwkgIHJ0cGgyNjNwYXk6IFN0b3AgdXNpbmcgYW4gYWRhcHRlciBhbmQgZGlyZWN0bHkgdXNlIHRoZSBidWZmZXIKKwkgIFdlIGFsd2F5cyBwdXNoZWQgb25lIGJ1ZmZlciBpbnRvIHRoZSBhZGFwdGVyLCB0aGVuIGhhbmRsZWQgZXhhY3RseSB0aGF0IG9uZQorCSAgYnVmZmVyIGFuZCBmbHVzaGVkIGl0IGZyb20gdGhlIGFkYXB0ZXIuIE5vdyBhbHNvIGRvbid0IG1lbWNweSgpIHRoZSBhY3R1YWwKKwkgIHBheWxvYWQgYnV0IGp1c3QgYXR0YWNoIHRoZSBpbnB1dCBidWZmZXIncyBkYXRhIHRvIHRoZSBvdXRwdXQgYnVmZmVyLgorCSAgVGhpcyBjb2RlIHN0aWxsIG5lZWRzIHNvbWUgc2VyaW91cyByZWZhY3RvcmluZy9yZXdyaXRpbmcuCisKKzIwMTUtMDctMDEgMjE6NTc6MjggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJICBydHBnc21wYXk6IFJlbW92ZSBub24tZXhpc3RpbmcgaW5jbHVkZXMgZm9yIG5vdworCSAgZ2l0IGFkZCAtcCBtaXN0YWtlLgorCisyMDE1LTA3LTAxIDE5OjI5OjA3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSAgcnRwZ3N0cGF5OiBVc2UgdGhlIHJldHVybiB2YWx1ZSBvZiBnc3RfYnVmZmVyX2FwcGVuZCgpCisKKzIwMTUtMDctMDEgMTk6MTk6MTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJICBydHBnc21wYXk6IEF0dGFjaCBwYXlsb2FkIHRvIHRoZSBvdXRwdXQgYnVmZmVyIGluc3RlYWQgb2YgY29weWluZyBpdAorCisyMDE1LTA3LTAxIDE3OjU4OjU2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkgIHJ0cGc3MjlwYXk6IEF0dGFjaCBwYXlsb2FkIGRpcmVjdGx5IHRvIG91dHB1dCBidWZmZXJzIGluc3RlYWQgb2YgY29weWluZworCisyMDE1LTA3LTAxIDE3OjQzOjUxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGc3MjNwYXkuYzoKKwkgIHJ0cGc3MjNwYXk6IEF0dGFjaCBwYXlsb2FkIGJ1ZmZlciB0byB0aGUgb3V0cHV0IGluc3RlYWQgb2YgY29weWluZworCisyMDE1LTA3LTAxIDE3OjMwOjM5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGR2ZGVwYXkuYzoKKwkgIHJ0cGR2ZGVwYXk6IE1hcCB0aGUgb3V0cHV0IGJ1ZmZlciBvbmNlIGluc3RlYWQgb2Ygb25jZSBldmVyeSA4MCBieXRlcworCisyMDE1LTA3LTAxIDIxOjQ2OjQ2ICswOTAwICBKaW1teSBPaG4gPHlvbmdqaW4ub2huQGxnZS5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggcmV0dXJuIHR5cGUgb2YgaW5kZXhfZW50cnlfb2Zmc2V0X3NlYXJjaCgpCisJICBJdCdzIGEgY29tcGFyZSBmdW5jdGlvbiBhbmQgbWF5IHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlLAorCSAgc28gc2hvdWxkIGZvciBjb3JyZWN0bmVzcyBhbmQgY29uc2lzdGVuY3kgcmV0dXJuIGEgc2lnbmVkCisJICBpbnRlZ2VyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTc4MAorCisyMDE1LTA3LTAxIDE0OjEyOjU3ICswMjAwICBNaWd1ZWwgUGFyw61zIETDrWF6IDxtcGFyaXNkaWF6QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHJlZmFjdG9yIGhhbmRsZV9uZXh0X2J1ZmZlcgorCSAgVGhlIGdvYWwgb2YgdGhpcyBwYXRjaCBpcyBtYWtpbmcgaGFuZGxlX25leHRfYnVmZmVyIGZ1bmN0aW9uCisJICBtb3JlIHJlYWRhYmxlIGF2b2lkaW5nIHVubmVjZXNhcnkgZ290b3MgYW5kIGFkZGluZyBvdGhlcgorCSAgY29zbWV0aWMgY2hhbmdlcy4KKworMjAxNS0wNy0wMSAxNTo0MDoyNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBhYzNwYXkuYzoKKwkgIHJ0cGFjM3BheTogQXR0YWNoIHRoZSBwYXlsb2FkIHRvIHRoZSBvdXRwdXQgYnVmZmVyIGluc3RlYWQgb2YgY29weWluZyBpdAorCSAgTWlnaHQgYWxzbyB3YW50IHRvIHByb2R1Y2UgYnVmZmVyIGxpc3RzIGhlcmUgaWYgbmVlZGVkLgorCisyMDE1LTA3LTAxIDE1OjM4OjQ3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5LmM6CisJICBydHA6IEZpeCBpbmRlbnRpb24KKworMjAxNS0wNy0wMSAxMjozNzoxMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvZXhhbXBsZXMvcnRwL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1WUDgtT1BVUy5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItVlRTLVZQOC1BVFMtT1BVUy5zaDoKKwkgIHJ0cDogQWRkIGV4YW1wbGVzIHdpdGggVlRTL0FUUyBmb3IgVlA4L09QVVMKKwkgIExldCdzIGhhdmUgYW4gZXhhbXBsZSB3aXRoIG1vZGVybiBjb2RlY3MuCisKKzIwMTUtMDYtMzAgMTg6MTE6MzMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwaDI2NHBheTogVXNlIEdTVF9XQVJOSU5HX09CSkVDVCgpIGluc3RlYWQgb2YgR1NUX1dBUk5JTkcoKQorCisyMDE1LTA2LTMwIDE0OjA2OjIwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOGRlcGF5LmM6CisJICB2cDhkZXBheTogRG9uJ3QgbG9jay9tYXAgZXZlcnkgbm9uLWtleWZyYW1lIGJ1ZmZlciB0d2ljZQorCSAgSnVzdCBjb3B5IHRoZSBjb21wbGV0ZSBoZWFkZXIgaW5zdGVhZCBvZiBmaXJzdCBsb29raW5nIGF0IHRoZSBmaXJzdCBieXRlCisJICBhbmQgdGhlbiBhdCB0aGUgcmVtYWluaW5nIDEwIGJ5dGVzLgorCisyMDE1LTA2LTI5IDE2OjA1OjQ0ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzQGRlYmV0aGVuY291cnQuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBkb2N1bWVudCBmYWxsdGhyb3VnaCBjYXNlcworCSAgUGFjaWZ5IGNvdmVyaXR5IGFuZCBkb2N1bWVudCBmYWxsdGhyb3VnaCBjYXNlcyBpbiBzd2l0Y2ggc3RhdGVtZW50cy4KKwkgIENJRCAjMTMwODk0OCwgIzEzMDg5NDcsICMxMzA4OTQ2CisKKzIwMTUtMDYtMjkgMTA6MzY6NTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgUmV2ZXJ0ICJydHBqaXR0ZXJidWZmZXI6IElmIHdlIGhhdmUgYW4gaW1tZWRpYXRlIHRpbWVvdXQsIGRvbid0IHRyeSB0byBmaW5kIGFuIGVhcmxpZXIgdGltZW91dCIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgMGMyMWNkNzE3N2VhODgzYzcxMDk5OTE0N2RkY2VkYjE5MDA0ZDE4Mi4KKwkgIElmIHdlIGhhdmUgbXVsdGlwbGUgaW1tZWRpYXRlIHRpbWVycywgd2Ugd2FudCB0byBmaXJzdCBoYW5kbGUgdGhlIG9uZSB3aXRoIHRoZQorCSAgbG93ZXN0IHNlcXVlbmNlIG51bWJlci4uLiB3aGljaCB3b3VsZCBiZSBicm9rZW4gbm93LgorCSAgSW5zdGVhZCBvZiB0aGlzIHdlIHNob3VsZCBqdXN0IHVzZSBhIEdTZXF1ZW5jZSBmb3IgdGhlIHRpbWVycywgYW5kIGhhdmUgdGhlbQorCSAgc29ydGVkIGZpcnN0IGJ5IHRpbWVzdGFtcCwgYW5kIGZvciBlcXVhbCB0aW1lc3RhbXBzIGJ5IHNlcXVlbmNlIG51bWJlci4gVGhlbgorCSAgd2Ugd291bGQgYWx3YXlzIG9ubHkgaGF2ZSB0byB0YWtlIHRoZSB2ZXJ5IGZpcnN0IHRpbWVyIGZyb20gdGhlIGxpc3QgYW5kIG5ldmVyCisJICBoYXZlIHRvIGxvb2sgYXQgYW55IG90aGVycy4KKworMjAxNS0wNi0yOSAxMDoxNDowNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IElmIHdlIGhhdmUgYW4gaW1tZWRpYXRlIHRpbWVvdXQsIGRvbid0IHRyeSB0byBmaW5kIGFuIGVhcmxpZXIgdGltZW91dAorCSAgSWYgd2UgaGF2ZSBsb3RzIG9mIHN1Y2ggaW1tZWRpYXRlIHRpbWVvdXRzLCB3ZSB3b3VsZCBvdGhlcndpc2UgaGF2ZSBxdWFkcmF0aWMKKwkgIHJ1bnRpbWUgaW4gdGhlIG51bWJlciBvZiB0aW1lb3V0cy4KKworMjAxNS0wNi0xOSAxODowMTowMyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c3JjLmM6CisJICBzcGxpdG11eHNyYzogc3RpY2t5IGV2ZW50cyBhcmUgc2VudCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIHBhZAorCSAgTm8gbmVlZCB0byBzZW5kIHRoZW0gZXhwbGljaXRseSBmcm9tIHRoZSBlbGVtZW50CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxMjQwCisKKzIwMTUtMDYtMTkgMTg6MDA6NDAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNyYy5jOgorCSAgc3BsaXRtdXhzcmM6IG1ha2Ugc3VyZSB0byBwdXNoIHN0aWNreSBldmVudHMgYmVmb3JlIGFkZGluZyBwYWQKKwkgIEl0IGFsbG93cyB0aGUgY2FwcyB0byBiZSBzZXQgb24gdGhlIHBhZCBiZWZvcmUgYmVpbmcgYWRkZWQgZm9yCisJICBkeW5hbWljIGF1dG9wbHVnZ2luZyB0byB3b3JrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTI0MAorCisyMDE1LTA2LTI2IDAwOjA1OjI5ICswOTAwICBIeXVuanVuIEtvIDx6em9vbi5rb0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogQWRkIG5ldyBudHAtdGltZS1zb3VyY2UgcHJvcGVydHkgYW5kIGRlcHJlY2F0ZSB1c2UtcGlwZWxpbmUtY2xvY2sgcHJvcGVydHkKKwkgIEVuYWJsZSB0byB1c2UgbmV3IG50cC10aW1lLXNvdXJjZSBwcm9wZXJ0eSBvZiBydHBiaW4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTE0OTYKKworMjAxNS0wNi0yNSAyMzoxOTo1OCArMDkwMCAgSHl1bmp1biBLbyA8enpvb24ua29Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwYmluL3Nlc3Npb246IGZpeCBkZXNjcmlwdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTQ5NgorCisyMDE1LTA2LTI1IDEwOjU3OjI1ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogdGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlL3NoYXBld2lwZS1leGFtcGxlLmM6CisJICBkb2NzOiBkZWNvZGViaW4yIC0+IGRlY29kZWJpbgorCisyMDE1LTA2LTI1IDEwOjQ3OjA2ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiB1cGRhdGUgZXhhbXBsZSBwaXBlbGluZQorCSAgVXBkYXRlIHJlZmVyZW5jZSB0byBkZWNvZGViaW4yIHRvIGRlY29kZWJpbgorCisyMDE1LTA2LTI1IDEwOjQ1OjM1ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiByZW1vdmUgZGVhZCBhc3NpZ25tZW50cworCSAgVmFsdWVzIGluIGZpZWxkc19yZXF1aXJlZCBhbmQgc2FtZV9idWZmZXIgYXJlIG92ZXJ3cml0dGVuIGJlZm9yZSB1c2VkLiBSZW1vdmluZworCSAgYXNzaWdubWVudAorCisyMDE1LTA2LTI1IDEwOjA2OjA3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvbWlrbW9kL01ha2VmaWxlLmFtOgorCSogZXh0L21pa21vZC9SRUFETUU6CisJKiBleHQvbWlrbW9kL2Rydl9nc3QuYzoKKwkqIGV4dC9taWttb2QvZ3N0bWlrbW9kLmM6CisJKiBleHQvbWlrbW9kL2dzdG1pa21vZC5oOgorCSogZXh0L21pa21vZC9taWttb2RfcmVhZGVyLmM6CisJKiBleHQvbWlrbW9kL21pa21vZF90eXBlcy5jOgorCSogZXh0L21pa21vZC9taWttb2RfdHlwZXMuaDoKKwkqIG00L01ha2VmaWxlLmFtOgorCSogbTQvbGlibWlrbW9kLm00OgorCSogd2luMzIvTUFOSUZFU1Q6CisJKiB3aW4zMi92czgvbGliZ3N0bWlrbW9kLnZjcHJvajoKKwkgIG1pa21vZDogcmVtb3ZlIGFuY2llbnQgdW5wb3J0ZWQgcGx1Z2luCisJICBUaGlzIGhhc24ndCBiZWVuIHRvdWNoZWQgaW4gMTEgeWVhcnMsIGFuZAorCSAgY2xlYXJseSBubyBvbmUncyBiZWVuIG1pc3NpbmcgaXQuCisKKzIwMTUtMDYtMjMgMjA6MTU6MTMgKzA5MDAgIEdpbGJvayBMZWUgPGdpbGJvay5sZWVAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZG9lcyBub3QgZGV0ZWN0IG9yaWVudGF0aW9uCisJICBNb3N0IGZpbGVzIGRvbid0IGNvbnRhaW4gdGhlIHZhbHVlcyBmb3IgdHJhbnNwb3NpbmcgdGhlIGNvb3JkaW5hdGVzCisJICBiYWNrIHRvIHRoZSBwb3NpdGl2ZSBxdWFkcmFudCBzbyBxdGRlbXV4IHdhcyBpZ25vcmluZyB0aGUgcm90YXRpb24KKwkgIHRhZy4gVG8gYmUgYWJsZSB0byBwcm9wZXJseSBoYW5kbGUgdGhvc2UgZmlsZXMgcXRkZW11eCB3aWxsIGFsc28gaWdub3JlCisJICB0aGUgdHJhbnNwb3NpbmcgdmFsdWVzIHRvIG9ubHkgZGV0ZWN0IHRoZSByb3RhdGlvbiB1c2luZyB0aGUgdmFsdWVzCisJICBhYmRlIGZyb20gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeDoKKwkgIFthIGIgY10KKwkgIFtkIGUgZl0KKwkgIFtnIGggaV0KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzg2ODEKKworMjAxNS0wNi0yNSAwMDowNDoxNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjUuMiA9PT0KKworMjAxNS0wNi0yNCAyMzozMDo0MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS41LjIKKworMjAxNS0wNi0yNCAyMjo1NjoxMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxNS0wNi0yNCAxMToxNTowMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vbmwucG86CisJICBwbzogVXBkYXRlIHRyYW5zbGF0aW9ucworCisyMDE1LTA2LTIzIDE4OjQyOjU5IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6CisJICBxdG11eDogQ29ycmVjdGx5IHRlc3QgZWFjaCBzZWdtZW50cworCSAgSW4gcHJlc2VuY2Ugb2YgZ2FwcywgcXRkZW11eCB3aWxsIGVtaXQgbXVsdGlwbGUgc2VnbWVudHMuIFRoZQorCSAgc2Vjb25kIHNlZ21lbnQgc3RhcnQgc2hvdWxkIG1hdGNoIHRoZSBDVFRTLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTM2MQorCisyMDE1LTA2LTIzIDE3OjU0OjMxIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBDb3JyZWN0bHkgY2FsY3VsYXRlIHRoZSBlbHN0IG1lZGlhIHN0YXJ0CisJICBUaGUgbWVkaWEgc3RhcnQgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCB0aGUgc2hpZnQgd2UgaGF2ZSBhcHBsaWVkCisJICBidXQgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IFBUUy4gVGhpcyBpcyBkZWZpbmVkIGFzOgorCSAgRHQoMCkgPSAwCisJICBDdCgwKSA9IER0KDApICsgQ1RUUygwKQorCSAgU28gdGhlIG1lZGlhIHN0YXJ0IGlzIGFsd2F5cyB0aGUgZmlyc3QgQ1RUUy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTEzNjEKKworMjAxNS0wNi0yMyAxMTo0OTozMiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFjY3VtdWxhdGUgcHJldmlvdXMgZWR0cyBlbnRyaWVzIGludG8gc2VnbWVudC5iYXNlCisJICBBbGxvd3MgcGxheWluZyBlZHRzIGVkaXR0ZWQgZmlsZXMgd2l0aCBwcm9wZXIgc3luY2hyb25pemF0aW9uIG9mCisJICBzdHJlYW1zLiBUaGlzIHBhdGNoIGZpeGVzIHRoZSByZWdyZXNzaW9uIGludHJvZHVjZWQgYnkKKwkgIGJmOTVmOTNjMDE4OWFhMDRmMThlMjY0Yjg2YjY1MjdlNDMxYzVkNTMgdGhhdCB3YXMgYWRkZWQgdG8gZml4CisJICBzZWdtZW50IHNlZWtzIGhhbmRsaW5nLgorCSAgSGF2aW5nIHRoZSBhY2N1bXVsYXRlZF9iYXNlIHNlcGFyYXRlZCBmcm9tIHRoZSBtYWluIHNlZ21lbnQuYmFzZQorCSAgYWxsb3dzIGhhbmRsaW5nIGJvdGggc2VnbWVudCBzZWVrcyBhbmQgZWR0cyBlZGl0dGVkIGZpbGVzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTM2MQorCisyMDE1LTA2LTIzIDAwOjU2OjE2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogaW1wcm92ZSBzb21lIGRlYnVnIG1lc3NhZ2VzCisJICBUaG9zZSBtZXNzYWdlcyBhcmUgYWJvdXQgdGhlIHN0cmVhbSwgdXNlIHRoZSBwYWQgYXMgdGhlCisJICBkZWJ1ZyBvYmplY3QgdG8gbWFrZSBpdCBjbGVhciBmcm9tIHRoZSBsb2dzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxMzYxCisKKzIwMTUtMDYtMjIgMjI6MjI6MDkgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHN0b3JlIGxhc3RfZHRzIG9mIHRoZSBmaXJzdCBidWZmZXIKKwkgIEJ1ZmZlcnMgbmVlZCBub3QgdG8gc3RhcnQgYXQgcnVubmluZy10aW1lIDAgc28gdGhlIGxhc3RfZHRzIG5lZWRzCisJICB0byBiZSB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGJ1ZmZlcidzIGR0cyBhcyBpdCBpcyB1c2VkIHRvIGNvbXB1dGUKKwkgIHRoZSBkdXJhdGlvbiBvZiB0aGUgYnVmZmVycy4gSWYgaXQgd2FzIGxlZnQgYXQgMCB0aGUgZmlyc3QgYnVmZmVyCisJICB3b3VsZCBoYXZlIGEgbGFyZ2VyIGR1cmF0aW9uIHdoZW4gaXQgc2hvdWxkbid0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxMzYxCisKKzIwMTUtMDYtMjMgMTc6MTE6NTcgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGZpeCBwb3NzaWJsZSBtZW1vcnkgbGVhaworCSAgd2hlbiBidWZmZXIgaXMgc3RvcmVkIHRvIHNlZWt0YWJsZSwgYW5kIHN0b3AgZ2V0cyBjYWxsZWQgZHVlIHRvCisJICBjb3JydXB0IGZsYWMgZmlsZSwgdGhlbiB0aGUgc2Vla3RhYmxlIGlzIG5vdCBiZWluZyByZWxlYXNlZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTM2NAorCisyMDE1LTA2LTIzIDE2OjI4OjQwICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmg6CisJICBSZXZlcnQgInNwbGl0bXV4c2luazogTWFzayBhc3luYy1zdGFydC9kb25lIHdoaWxlIHN3aXRjaGluZyBmaWxlcy4iCisJICBUaGlzIHJldmVydHMgY29tbWl0IGQ2MWU1MzkzZjExMGVkNDgyODE1ZDc3ODA3MjQ1ZDc4YjUyZWZmNDYuCisJICBDYXVzZXMgZmFpbHVyZXMgbXV4aW5nIGxhcmdlciBHT1Agc2l6ZXMgZm9yIHNvbWUgcmVhc29uLiBSZXZlcnRpbmcKKwkgIHdoaWxlIEkgZmlndXJlIGl0IG91dAorCisyMDE1LTA2LTE4IDIzOjIyOjA2ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYzoKKwkgIHNwbGl0bXV4c3JjOiBGaXggc3RhcnR1cCBhbmQgc2h1dGRvd24gcmFjZXMuCisJICBGaXggMiBzdGFydHVwIHJhY2VzIHdoZW4gdGhpbmdzIGhhcHBlbiB0b28gcXVpY2tseSwgYW5kIDEKKwkgIGF0IHNodXRkb3duIGJ5IGhvbGRpbmcgYSByZWYgdG8gdGhlIHBhZHMgaW4gdXNlIHVudGlsIHRoZQorCSAgbG9vcCBmdW5jdGlvbnMgZXhpdC4KKwkgIEhhbmRsZSBlcnJvcnMgYWN0aXZhdGluZyBmaWxlIHBhcnRzIGFuZCBwdWJsaXNoIHRoZW0gb24KKwkgIHRoZSBidXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUwNzQ3CisKKzIwMTUtMDYtMTggMDk6MjY6MTMgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuaDoKKwkgIHNwbGl0bXV4c2luazogTWFzayBhc3luYy1zdGFydC9kb25lIHdoaWxlIHN3aXRjaGluZyBmaWxlcy4KKwkgIFNvbWV0aW1lcywgZXh0cmEgYXN5bmMtc3RhcnQvZG9uZSBmcm9tIHRoZSBpbnRlcm5hbCBzaW5rCisJICB3aGlsZSB0aGUgZWxlbWVudCBpcyBzdGlsbCBzdGFydGluZyB1cCBjYW4gY2F1c2Ugc3BsaXRtdXhzaW5rCisJICB0byBzdGFsbCBpbiBQQVVTRUQgc3RhdGUgd2hlbiBpdCBoYXMgYmVlbiBzZXQgdG8gUExBWUlORworCSAgYnkgdGhlIGFwcC4gRHJvcCB0aGUgY2hpbGQncyBhc3luYy1zdGFydC9kb25lIG1lc3NhZ2VzIHdoaWxlCisJICBzd2l0Y2hpbmcsIHNvIHRoZXkgZG9uJ3QgY2F1c2Ugc3RhdGUgY2hhbmdlcyBhdCB0aGUKKwkgIHNwbGl0bXV4c2luayBsZXZlbC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTA3NDcKKworMjAxNS0wNi0xNSAxNjoxMjoxMCArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2EtZGVtdXg6IFVzZSBnc3RfdmlkZW9fbXVsdGl2aWV3X2d1ZXNzX2hhbGZfYXNwZWN0KCkKKwkgIFVzZSB0aGUgZ3N0X3ZpZGVvX211bHRpdmlld19ndWVzc19oYWxmX2FzcGVjdCgpIHV0aWxpdHkgZnVuY3Rpb24KKwkgIHRvIHNldCB0aGUgaGFsZi1hc3BlY3QgZmxhZyAob3Igbm90KSBvbiBzdGVyZW9zY29waWMgZnJhbWUtcGFja2VkCisJICB2aWRlb3MuCisKKzIwMTUtMDYtMTUgMTY6MTA6MzcgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IE1vdmUgbXVsdGl2aWV3IGNhcHMgY2FsY3VsYXRpb25zLCBhZGQgaGFsZi1hc3BlY3QgaGV1cmlzdGljcworCSAgTW92ZSB0aGUgbXVsdGl2aWV3IGNhcHMgY2FsY3VsYXRpb25zIHRvIHRoZSBjb25maWd1cmVfc3RyZWFtKCkKKwkgIGZ1bmN0aW9uLCBzbyB0aGUgcmVzdCBvZiB0aGUgdmlkZW8gaW5mbyBpcyBhdmFpbGFibGUsIGFuZAorCSAgdXNlIHRoZSBnc3RfdmlkZW9fbXVsdGl2aWV3X2d1ZXNzX2hhbGZfYXNwZWN0KCkgZnVuY3Rpb24gdG8KKwkgIGRldGVybWluZSBpZiB0aGUgaGFsZi1hc3BlY3QgZmxhZyBzaG91bGQgYmUgc2V0IG9uIGZyYW1lLXBhY2tlZAorCSAgdmlkZW8uCisKKzIwMTUtMDYtMTggMTY6MDY6MDIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBBZGQgY3NsZyBzdXBwb3J0CisJICBUaGUgY3NsZyBhdG9tIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIERUUyBzaGlmdC4gVGhpcyBpcworCSAgbmVlZGVkIGluIHJlY2VudCB2ZXJzaW9uIG9mIGN0dHMgYXRvbSB3aGVyZSB0aGUgb2Zmc2V0IGNhbiBiZQorCSAgbmVnYXRpdmUuIFdoZW4gY3NsZyBpcyBtaXNzaW5nLCB3ZSBwYXJzZSB0aGUgQ1RUUyB0YWJsZSBhcyBwcm9wb3NlZAorCSAgaW4gdGhlIHNwZWMgdG8gY2FsY3VsYXRlIHRoZXNlIHZhbHVlcy4KKwkgIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIHdlIG9ubHkgbmVlZCB0byBrbm93IHRoZSBzaGlmdC4gQXMgR1N0cmVhbWVyCisJICBjYW5ub3QgdHJhbnNwb3J0IG5lZ2F0aXZlIHRpbWVzdGFtcHMsIHdlIHNoaWZ0IHRoZSB0aW1lc3RhbXBzIGZvcndhcmQKKwkgIHVzaW5nIHRoYXQgdmFsdWUgYW5kIGFkYXB0IHRoZSBzZWdtZW50IHRvIGNvbXBlbnNhdGUuIFRoaXMgcGF0Y2ggYWxzbworCSAgcmVtb3ZlcyBib2d1cyBvZmZzZXQgb2YgY3R0c19zb2Zmc2V0LCB0aGlzIG9mZnNldCBzaGFsbCBiZSBpbmNsdWRlZAorCSAgaW4gdGhlIGVkaXQgbGlzdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTExMDMKKworMjAxNS0wNi0xOSAxODozNzo1OSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgcXRtdXg6IFRlc3QgZ2FwcyBhdCBzdGFydCBvZiBzdHJlYW0KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTEyNDIKKworMjAxNS0wNi0xOSAxODo0MDo0MyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogVXNlIFBUUyB0byBmaWd1cmUtb3V0IHByZXNlbmNlIG9mIGdhcHMKKwkgIFdlIG5lZWQgdG8gbG9vayBhdCB0aGUgcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBpbiBvcmRlciB0byBjb25jbHVkZSBpZgorCSAgdGhlcmUgaXMgYSBnYXAgYXQgdGhlIHN0YXJ0IG9mIGEgc3RyZWFtLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTI0MgorCisyMDE1LTA2LTE5IDE2OjQ1OjAyIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBTZXQgZWRpdCBsaXN0IHRvIGNvbXBlbnNhdGUgRFRTIHNoaWZ0CisJICBXZSBzaGlmdCBEVFMgZm9yd2FyZCB0byBhdm9pZCBuZWdhdGl2ZSB0aW1lc3RhbXBzIHdoaWNoIGNhbm5vdCBiZQorCSAgcmVwcmVzZW50ZWQgd2l0aCB2ZXJzaW9uIDAgb2YgdGhlIENUVFMgdGFibGUuIFRvIHN0aWNrIHdpdGggdGhhdAorCSAgdmVyc2lvbiAoYmFja3dhcmQgY29tcGF0aWJpbGl0eSksIHRoZSBzcGVjIHJlY29tbWVuZCB1c2luZyBhbgorCSAgZWRpdCBsaXN0IGVudHJ5IHRvIG1vdmUgYmFjayB0aGUgcHJlc2VudGF0aW9uIHRpbWUgdG8gd2hlcmUgaXQKKwkgIHNob3VsZCBiZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTEyNDIKKworMjAxNS0wNi0yMiAxNDozNTo1MiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IEluc2VydCBBVkMgZW5kIG9mIHNlcXVlbmNlCisJICBUaGlzIEZMViBzcGVjaWZpYyBtYXJrIGlzIG5lZWRlZCB0byBwcmV2ZW50IEZsb3cgUGxheWVyIChtb3N0IGxpa2VseQorCSAgYWxsIEZsYXNoIGJhc2UgcGxheWVyKSBmcm9tIGdvaW5nIGludG8gYnVmZmVyaW5nIHN0YXRlIHdoZW4gbmVhciBFT1MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxMzIwCisKKzIwMTUtMDYtMjIgMTM6MDU6MjkgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJICBtYXRyb3NrYTogcmVtb3ZlIHVzZWxlc3MgY2hlY2sKKwkgIE5vIG5lZWQgdG8gY2hlY2sgZm9yIGNvbnRleHQgYXZhaWxhYmlsaXR5IHdoaWxlIGZyZWVpbmcuIFdlIGFyZSBpbnNpZGUKKwkgIGluc2lkZSBhIGNvZGUgYmxvY2sgd2l0aCBhIGNvbmRpdGlvbiB0aGF0IGRlcmVmZXJlbmNlcyBjb250ZXh0LgorCSAgaWYgKGNvbnRleHQtPnR5cGUgPT0gMCAuLi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTEzMDYKKworMjAxNS0wNi0yMiAxOTozNTo1NyArMDkwMCAgVmluZWV0aCBUIE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9sem8uYzoKKwkgIGx6bzogZml4IG1lbW9yeSBsZWFrCisJICB0aGUgb3BlbmVkIGZpbGUgaXMgbm90IGJlaW5nIGNsb3NlZCBkdXJpbmcgdGVzdCwgd2hpY2ggd2lsbCByZXN1bHQKKwkgIGluIG1lbW9yeSBsZWFrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTMwNgorCisyMDE1LTA2LTIyIDE5OjMwOjU4ICswOTAwICBWaW5lZXRoIFQgTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZXh0L21pa21vZC9taWttb2RfcmVhZGVyLmM6CisJICBtaWttb2RfcmVhZGVyOiBQb3NzaWJsZSBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2U6CisJICBnc3RfcmVhZGVyIHZhcmlhYmxlIGlzIGJlaW5nIHVzZWQgYmVmb3JlIGFjdHVhbGx5IGNoZWNraW5nIGlmIGl0CisJICBhbGxvY2F0ZWQgcHJvcGVybHkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTEzMDYKKworMjAxNS0wNi0yMiAxOTo0NToxNCArMDkwMCAgU2FuZ2t5dSBQYXJrIDxzazExMjIucGFya0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogTWlub3IgY2xlYW4tdXAKKwkgIDEuIEZpeCB0aGUgY29kZSB3aGljaCBpcyB3cm9uZyBjb2Rpbmcgc3R5bGUuCisJICAyLiBGaXggYSB0eXBpbmcgZXJyb3Igb2YgY29tbWVudC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTEzMTYKKworMjAxNS0wNi0yMiAxMToyODoxMyArMDIwMCAgSm9zZSBBbnRvbmlvIFNhbnRvcyBDYWRlbmFzIDxzYW50b3NjYWRlbmFzQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzb3VyY2U6IERvIG5vdCB0cnkgdG8gcHVzaCBOVUxMIGJ1ZmZlcnMKKwkgIElmIHVwZGF0ZV9yZWNlaXZlcl9zdGF0cygpIGZhaWxzLCB3ZSBjYW4ndCByZWFsbHkgZG8gYW55dGhpbmcgd2l0aCB0aGlzIGJ1ZmZlcgorCSAgYW55bW9yZSBhbmQgaGF2ZSB0byBkcm9wIGl0LiBUaGlzIGhhcHBlbnMgaWYgdGhlcmUncyBhIGJpZyBzZXFudW0KKwkgIGRpc2NvbnRpbnVpdHkgZm9yIGV4YW1wbGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxMzExCisKKzIwMTUtMDYtMjIgMTM6MTA6MDIgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiB0cml2aWFsIGNsZWFudXAKKwkgIHRyaXZpYWwgcGF0Y2ggdG8gYWRkIHByb3BlciAoIHdoaWxlIGNoZWNraW5nIGZvciBpZihHX1VOTElLRUxZKCkpCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxMzA2CisKKzIwMTUtMDYtMjIgMTM6MTY6MDggKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkgIGRjYXBhcnNlOiBpbml0aWFsaXplIHNpemUgdmFyaWFibGUKKwkgIHNpemUgY2FuIGJlIHVzZWQgaW4gY2xlYW51cCB3aXRob3V0IGJlaW5nIGluaXRpYWxpemVkLiBIZW5jZQorCSAgc2V0dGluZyBpdCB0byAwIHdoZW4gZGVjbGFyaW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxMzA2CisKKzIwMTUtMDYtMjIgMTM6MTM6MjkgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIG1wZWdhdWRpb3BhcnNlOiBpbml0aWFsemUgYnBmIHZhcmlhYmxlCisJICBicGYgdmFyaWFibGUgbWlnaHQgYmUgdXNlZCBpbiBjbGVhbnVwIHdpdGhvdXQgYmVpbmcgaW50aWFsaXplZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTEzMDYKKworMjAxNS0wNi0xOSAxNDo1MDo1OSArMDIwMCAgTWlndWVsIFBhcsOtcyBEw61heiA8bXBhcmlzZGlhekBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHF1ZXVlLmM6CisJICBydHBydHhxdWV1ZTogcmV2ZXJzZSBwZW5kaW5nIGxpc3QgYmVmb3JlIHB1c2hpbmcgYnVmZmVycworCSAgV2l0aCB0aGlzIHdlIHNlbmQgdGhlIFJUWCBidWZmZXJzIGluIHRoZSBzYW1lIG9yZGVyCisJICB0aGF0IHRoZXkgd2VyZSByZXF1ZXN0ZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxMjk3CisKKzIwMTUtMDYtMjEgMTk6MjI6MTAgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBGaXggRFRTIHZhbGlkaXR5IGNoZWNrCisJICBUaGlzIGNoZWNrIHdhcyB1cC1zaWRlLWRvd24sIGNhdXNpbmcgYSBiYWQgdGltZXN0YW1wIGF0IHN0YXJ0CisJICBhbmQgdGhlbiBhbGwgdGltZXN0YW1wIGJlaW5nIGRlbGF5ZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxMjk4CisKKzIwMTUtMDYtMTcgMTU6MTk6NDcgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9kdW1wLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmM6CisJICBjc2xnOiBBZGQgQ29tcG9zaXRpb24gU2hpZnQgTGVhc3QgR3JlYXRlc3QgQXRvbQorCSAgVGhpcyBzaW1wbHkgYWRkIGZvdXJjYyBhbmQgZHVtcCBmdW5jdGlvbiBmb3IgdGhlIGNzbGcgQXRvbS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTExMDMKKworMjAxNS0wNi0xNyAxNToxODozOCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5jOgorCSAgY3R0c19kdW1wOiBGaXggc2lnbmVzcyBpc3N1ZXMKKwkgIEl0IGRpZG4ndCBidWcsIGJ1dCB1c2UgY29ycmVjdCBzaWduZXNzIGluIHRyYWNlcy4gVGhlIG51bWJlciBvZgorCSAgZW50cmllcyBpcyB1bnNpZ25lZCB3aGlsZSB0aGUgb2Zmc2V0IGNhbiBiZSBzaWduZWQgYWNjb3JkaW5nIHRvCisJICByZWNlbnQgc3BlYy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTExMDMKKworMjAxNS0wNi0xNiAxNzo0ODowOCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA2MDE1ZDI2IHRvIGY3NGIyZGYKKworMjAxNS0wNi0xNiAxMTo0MzozOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGdzdF9ydHBfYnVmZmVyX2V4dF90aW1lc3RhbXAoKSBtb2RpZmllcyBpdHMgZmlyc3QgYXJndW1lbnQsIGtlZXAgYSBjb3B5IGFyb3VuZAorCisyMDE1LTA2LTE2IDEwOjMwOjM0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogQ29tcGFyZSBleHQgUlRQIHRpbWVzLCBub3QgcGxhaW4gUlRQIHRpbWUgYW5kIGV4dCBSVFAgdGltZSB3aGVuIGNhbGN1bGF0aW5nIGVsYXBzZWQgdGltZQorCSAgT3RoZXJ3aXNlIGFsbCBSVFAgdGltZXMgYWZ0ZXIgYSB3cmFwYXJvdW5kIHdvdWxkIGJlIGNvbnNpZGVyZWQgYXMgZ29pbmcKKwkgIGJhY2t3YXJkcywgdGhleSB3aWxsIGFsd2F5cyBiZSBzbWFsbGVyIHRoYW4gdGhlIGV4dCBSVFAgdGltZS4KKworMjAxNS0wNi0xNSAxOToyNToxMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IFRoZSBkZWZhdWx0IHJ0cC1wcm9maWxlIHNob3VsZCBiZSBBVlAsIG5vdCBBVlBGCisKKzIwMTUtMDYtMTUgMTQ6MzI6MjEgKzA5MDAgIFNhbmdreXUgUGFyayA8c2sxMTIyLnBhcmtAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IE1pbm9yIGNsZWFudXAKKwkgIDEuIEFkZCBOdWxsIGNoZWNrIGluICdmcmVlX2l0ZW0nIGZ1bmN0aW9uLgorCSAgMi4gRml4IGEgdHlwaW5nIGVycm9yIG9mIGNvbW1lbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUwOTY1CisKKzIwMTUtMDYtMTIgMTc6NDQ6NTEgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsbXV4OiBNYWtlIHN1cmUgYmVzdF90aW1lIGlzIGluaXRpYWxpemVkCisKKzIwMTUtMDYtMTIgMjM6Mjk6MTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmg6CisJICBydHBiaW4vc2Vzc2lvbjogQWRkIG5ldyBudHAtdGltZS1zb3VyY2UgcHJvcGVydHkgYW5kIGRlcHJlY2F0ZSB1c2UtcGlwZWxpbmUtY2xvY2sgcHJvcGVydHkKKwkgIFRoZSBuZXcgcHJvcGVydHkgYWxsb3dzIHRvIHNlbGVjdCB0aGUgdGltZSBzb3VyY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlCisJICBOVFAgdGltZSBpbiBSVENQIHBhY2tldHMuIEJ5IGRlZmF1bHQgaXQgd2lsbCBjb250aW51ZSB0byBjYWxjdWxhdGUgdGhlIE5UUAorCSAgdGltZXN0YW1wICgxOTAwIGVwb2NoKSBiYXNlZCBvbiB0aGUgcmVhbHRpbWUgY2xvY2suIEFsdGVybmF0aXZlbHkgaXQgY2FuIHVzZQorCSAgdGhlIFVOSVggdGltZXN0YW1wICgxOTcwIGVwb2NoKSwgdGhlIHBpcGVsaW5lJ3MgcnVubmluZyB0aW1lIG9yIHRoZSBwaXBlbGluZSdzCisJICBjbG9jayB0aW1lLiBUaGUgbGF0dGVyIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBzeW5jaHJvbml6aW5nIG11bHRpcGxlCisJICByZWNlaXZlcnMgaWYgYWxsIG9mIHRoZW0gc2hhcmUgdGhlIHNhbWUgY2xvY2suCisJICBJZiB1c2UtcGlwZWxpbmUtY2xvY2sgaXMgc2V0IHRvIFRSVUUsIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIG50cC10aW1lLXNvdXJjZQorCSAgc2V0dGluZyBhbmQgY29udGludWUgdG8gdXNlIHRoZSBydW5uaW5nIHRpbWUgcGx1cyA3MCB5ZWFycy4gVGhpcyBpcyBvbmx5IGtlcHQKKwkgIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKworMjAxNS0wNC0wNyAxNjowMzo0MiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgdGVzdHM6IHF0bXV4OiB0ZXN0IGZvciBtdXhpbmcgd2l0aCBEVFMgb3V0c2lkZSB0aGUgc2VnbWVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDU3NQorCisyMDE1LTA2LTExIDE3OjI2OjQ5IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWRqdXN0IHNlZ21lbnQgYWNjb3JkaW5nIHRvIGN0dHMgb2Zmc2V0CisJICBJbiBwcmVzZW5jZSBvZiBhIENUVFMsIHRoZSBzZWdtZW50IHN0YXJ0L3N0b3AgbXVzdCBiZSBvZmZzZXQgc28KKwkgIHRoZSBzZWdtZW50IHN0YXJ0L3N0b3AgaW5jbHVkZSB0aGUgUFRTLiBUaGlzIGlzIG5lZWRlZCBzaW5jZSB0aGUKKwkgIFBUUyBjYW5ub3QgYmUgbmVnYXRpdmUgaW4gdGhpcyBmb3JtYXQuIFRoaXMgZml4ZXMgaXNzdWVzIHdoZXJlIHRoZQorCSAgcnVubmluZyB0aW1lIG9mIHRoZSBmaXJzdCBidWZmZXIgaXNuJ3QgYXQgdGhlIHN0YXJ0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDU3NQorCisyMDE1LTA0LTAzIDIwOjM0OjQyIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBIYW5kbGUgRFRTIHdpdGggbmVnYXRpdmUgcnVubmluZyB0aW1lCisJICBBcyBRVCB3b3JrcyB3aXRoIGR1cmF0aW9uLCBzaW1wbHkgYnJpbmcgYmFjayBmaXJzdCBEVFMgdG8gMCBhbmQgc2hpZnQKKwkgIGZvcndhcmQgdGhlIFBUUyBvZiB0aGUgc2FtZSBhbW91bnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQwNTc1CisKKzIwMTUtMDYtMTAgMTg6MTU6NTIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4Lmg6CisJICBmbHZtdXg6IEFkZCBuZWdhdGl2ZSBydW50aW1lIERUUyBzdXBwb3J0CisJICBUaGlzIGlzIGRvbmUgYnkgdXNpbmcgbmV3IGZlYXR1cmUgb2YgdGhlIENvbGxlY3RQYWQgY2xpcCBmdW5jdGlvbgorCSAgd2hpY2ggc2V0cyB0aGUgRFRTIGFzIGEgZ2ludDY0IGluIHRoZSBjb2xsZWN0ZWQgZGF0YS4gSXQgYWxzbyBzaW1wbGlmeQorCSAgdGhlIGNvZGUgYSBiaXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQwNTc1CisKKzIwMTUtMDYtMTIgMjM6MDY6MjQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBSZW5hbWUgc29tZSB2YXJpYWJsZXMgYW5kIGRlYnVnIG91dHB1dCB0byBtYWtlIG1vcmUgc2Vuc2UKKwkgIExvY2FsIGFuZCByZW1vdGUgd2VyZSBtaXhlZCB1cCBpbiBhIGZldyBwbGFjZXMsIGFuZCB0aGUgdGltZSB3ZSBzdG9yZSBoZXJlIGlzCisJICBub3QgVU5JWCB0aW1lICgxOTcwIGVwb2NoKSwgYnV0IE5UUCB0aW1lICgxOTAwIGVwb2NoKSBpbiBuYW5vc2Vjb25kcy4KKworMjAxNS0wNi0xMiAxOToyMToxMCArMDMwMCAgSWx5YSBLb25zdGFudGlub3YgPGlseWEua29uc3RhbnRpbm92QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb3JlbW90ZWlvLmM6CisJICBvc3hhdWRpbzogZml4IGxhdGVuY3kgcHJvcGVydHkgcXVlcnkgb24gUmVtb3RlSU8KKwkgIEF1ZGlvVW5pdEdldFByb3BlcnR5IHdvdWxkIGZhaWwgd2l0aCBrUGFyYW1FcnIgKC01MCkgZXZlcnkgdGltZSwKKwkgIHNpbXBseSBiZWNhdXNlIHNpemUgd2Fzbid0IGluaXRpYWxpemVkLgorCSAgTm93IGl0IHJldHVybnMgemVybyBsYXRlbmN5LCBidXQgYXQgbGVhc3QgaXQgZG9lc24ndCBmYWlsLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MDg2OAorCisyMDE1LTA0LTA3IDE0OjA2OjE2ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxnaXRAYXJ1bnJhZ2hhdmFuLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogRml4IG1hcHBpbmcgb2YgbGF0ZW5jeSBwYXJhbWV0ZXJzIHRvIGJ1ZmZlciBhdHRyaWJ1dGVzCisKKzIwMTUtMDYtMTIgMDE6NTY6MzcgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thLWRlbXV4OiBBY3R1YWxseSBzZXQgZGV0ZWN0ZWQgM0QgaW5mbyBpbnRvIG91dHB1dCBjYXBzLgorCSAgVXNlIHRoZSBpbmZvcm1hdGlvbiByZWFkIGZyb20gdGhlIFN0ZXJlb01vZGUgaW5mbworCSAgdG8gY29uZmlndXJlIG11bHRpdmlldy1tb2RlIGFuZCBtdWx0aXZpZXctZmxhZ3MgaW4gdGhlCisJICB2aWRlbyBjYXBzLgorCisyMDE1LTA2LTExIDEzOjM2OjU0ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSAgc3BsaXRtdXhzaW5rOiBUYWtlIHJlbGVhc2VkLWJ1dC1ub3QteWV0LW91dHB1dCBieXRlcyBpbnRvIGFjY291bnQKKwkgIFdoZW4gZGVjaWRpbmcgd2hldGhlciBpdCdzIHRpbWUgdG8gc3dpdGNoIHRvIGEgbmV3IGZpbGUsIHRha2UgaW50bworCSAgYWNjb3VudCBkYXRhIHRoYXQncyBiZWVuIHJlbGVhc2VkIGZvciBwdXNoaW5nLCBidXQgaGFzbid0IHlldAorCSAgYmVlbiBwdXNoZWQgLSBiZWNhdXNlIGRvd25zdHJlYW0gaXMgc2xvdyBvciB0aGUgdGhyZWFkcyBoYXZlbid0IGJlZW4KKwkgIHNjaGVkdWxlZC4KKwkgIEZpeGVzIGEgcmFjZSBpbiB0aGUgdW5pdCB0ZXN0IGFuZCBwcm9iYWJseSBpbiBwcmFjdGljZSAtIHNvbWV0aW1lcworCSAgZmFpbGluZyB0byBzd2l0Y2ggd2hlbiBpdCBzaG91bGQgZm9yIGFuIGV4dHJhIEdPUCBvciB0d28uCisJICBBbHNvIGZpeCBhIHByb2JsZW0gaW4gc3BsaXRtdXhzcmMgd2hlcmUgcGxheWJhY2sgc29tZXRpbWVzCisJICBzdGFsbHMgYXQgc3RhcnR1cCBpZiB0eXBlcyBhcmUgZm91bmQgdG9vIHF1aWNrbHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUwNzQ3CisKKzIwMTUtMDYtMTEgMDE6MDQ6NTEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSAgYXRvbXM6IHJlbW92ZSBjdXN0b20gZ3N0X2J1ZmZlcl9uZXcgZnVuY3Rpb24gaW4gZmF2b3Igb2YgY29yZSB2ZXJzaW9uCisJICBSZW1vdmUgYSBjdXN0b20gc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBnc3RfYnVmZmVyX25ld193cmFwcGVkIGJ5CisJICB1c2luZyBnc3RfYnVmZmVyX25ld193cmFwcGVkX2Z1bGwgaW5zaWRlIGEgbWFjcm8gdG8gc2ltcGxpZnkKKwkgIHBhcmFtZXRlcnMgYW5kIGdpdmUgaXQgYSBtb3JlIG1lYW5pbmdmdWwgbmFtZS4KKwkgIEl0IGlzIG9ubHkgdXNlZCB0byBjcmVhdGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgdG8gaGF2ZSBpdHMgZGF0YSBjb3BpZWQuCisKKzIwMTUtMDYtMTEgMDA6MTQ6NDEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSAgYXRvbXM6IHNpbXBsaWZ5IGZyZWUgZm9ybSBkYXRhIGF0b21zIGNyZWF0aW9uCisJICBBdm9pZCBjcmVhdGluZyBhbiBpbnRlcm1lZGlhcnkgYnVmZmVyIG9yIG1lbW9yeSBhcmVhIGp1c3QKKwkgIHRvIGNvcHkgaW50byBhbiBhdG9tJ3MgZGF0YSBhcmVhLgorCisyMDE1LTA2LTEwIDIyOjI3OjI3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvYXRvbXMuaDoKKwkqIGdzdC9pc29tcDQvZm91cmNjLmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4Lmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogYWRkIEFDLTMgbXV4aW5nIHN1cHBvcnQKKwkgIEFkZHMgQUMtMyBtdXhpbmcgc3VwcG9ydC4gSXQgaXMgZGVmaW5lZCBmb3IgbXA0IGFuZCAzZ3AgZm9ybWF0cy4KKwkgIE9uZSBleHRyYSBmZWF0dXJlIHRoYXQgd2FzIGFkZGVkIHdhcyB0aGUgYWJpbGl0eSB0byBhZGQgZXh0ZW5zaW9uCisJICBhdG9tcyBhZnRlciBzZXRfY2FwcyBhcyB0aGUgQUMtMyBleHRlbnNpb24gYXRvbSBuZWVkcyBzb21lIGRhdGEKKwkgIHRoYXQgaGFzIHRvIGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBzdHJlYW0gaXRzZWxmIGFuZCBpcyBub3QKKwkgIHByZXNlbnQgb24gY2Fwcy4KKworMjAxNS0wNi0xMCAyMjozNjo1OSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJICBxdG11eDogcmVtb3ZlIHVudXNlZCB0eXBlIE1QNFMKKworMjAxNS0wNi0xMCAyMjoyOTowMSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogcmVtb3ZlIGR1cGxpY2F0ZSBhdHRyaWJ1dGUgdmFsdWUgc2V0CisJICBJdCBpcyBhbHNvIHNldCBhIGZldyBsaW5lcyBiZWxvdworCisyMDE1LTA2LTExIDAwOjIyOjU0ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYTogSW1wbGVtZW50IGJhc2ljIHN0ZXJlb3Njb3BpYyB2aWRlbyBzdXBwb3J0CisJICBJbXBsZW1lbnQgc3VwcG9ydCBmb3IgdGhlIHBhY2tlZCB2aWRlbyBmb3JtYXRzIFdlYk0KKwkgIHVzZXMsIG5vdCBhbGwgdGhlIHZhbHVlcyB0aGF0IE1hdHJvc2thIG1pZ2h0IHVzZS4KKwkgIEluIHByYWN0aWNlLCBpdCdzIHJlYWxseSBoYXJkIHRvIGZpbmQgYW55IHNhbXBsZXMgaW4gdGhlCisJICB3aWxkIG9mIGFueS4KKwkgIFN1cHBvcnRlZCBpbiBib3RoIHRoZSBtdXhlciBhbmQgZGVtdXhlci4KKworMjAxNS0wNi0xMCAwMToyNjoxNSArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZm91cmNjLmg6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9kdW1wLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmM6CisJICBxdGRlbXV4OiBBZGQgYmFzaWMgc3VwcG9ydCBmb3IgTVBFRy1BIHN0ZXJlb3Njb3BpYyB2aWRlbworCSAgVGhlIE1QRUctQSBmb3JtYXQgcHJvdmlkZXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBJU08gYmFzZSBtZWRpYQorCSAgZmlsZSBmb3JtYXQgdG8gc3RvcmUgc3RlcmVvc2NvcGljIGNvbnRlbnQgZW5jb2RlZCB3aXRoIGRpZmZlcmVudAorCSAgY29kZWNzIGxpa2UgSC4yNjQgYW5kIE1QRUctNDoyLiBUaGUgc3RlcmVvIHZpZGVvIG1lZGlhIGluZm9ybWF0aW9uKHN2bWkpCisJICBhdG9tIGRlY2xhcmVzIHRoZSBwcmVzZW5jZSBhbmQgc3RvcmFnZSBtZXRob2QgZm9yIHRoZSB2aWRlby4KKwkgIFN0ZXJlbyB2aWRlbyBpbmZvcm1hdGlvbiBmb3IgTVBFRy1BIGNhbiBhbHNvIGJlIHN1cHBsaWVkIHRocm91Z2gKKwkgIHRoZSAnc3R2aScgYXRvbSAocmVmOiBJU08vSUVDXzE0NDk2LTEyLCBJU08vSUVDXzIzMDAwLTExKSwgd2hpY2gKKwkgIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHBhdGNoLgorCSAgQWxzbyBtaXNzaW5nIGlzIHN1cHBvcnQgZm9yIHN0ZXJlbyB2aWRlbyBlbmNvZGVkIGFzIHNlcGFyYXRlIHZpZGVvIHRyYWNrcworCSAgZm9yIG5vdy4KKwkgIEJhc2VkIG9uIGEgcGF0Y2ggYnkgU3JlZXJlbmogQmFsYWNoYW5kcmFuIDxzcmVlcmVuai5iYWxhY2hhbmRyYW5AaW50ZWwuY29tPgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxMTE1NworCisyMDE1LTA2LTAyIDE2OjE1OjM1IC0wNDAwICBYYXZpZXIgQ2xhZXNzZW5zIDx4YXZpZXIuY2xhZXNzZW5zQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IEFkZCB0bHMtZGF0YWJhc2UgcHJvcGVydHkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTAyOTgKKworMjAxNS0wNi0xMCAxNDozMzo1MCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cDogVXNlIEdTVF9CVUZGRVJfUFRTKCkgaW5zdGVhZCBvZiBHU1RfQlVGRkVSX1RJTUVTVEFNUCgpCisJICBUaGUgbWl4IGJldHdlZW4gYWxsIHRoZXNlIGluIHRoZSBSVFAgY29kZSBpcyBjb25mdXNpbmcsIGxldCdzIHRyeSB0byBiZQorCSAgY29uc2lzdGVudC4KKworMjAxNS0wNi0xMCAxNDo0OTo1MCArMDMwMCAgSWx5YSBLb25zdGFudGlub3YgPGlseWEua29uc3RhbnRpbm92QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBtYW5hZ2VyOiBjbGFyaWZ5IG5lZ2F0aXZlIGxvc3QgcGFja2V0cyBpbiBzdGF0cworCSAgQWxzbzoKKwkgIC0gTW92ZSBub3RlcyBvbiB1bml0cyBiZWZvcmUgZmllbGQgZG9jdW1lbnRhdGlvbi4KKwkgIC0gVW5pZnkgZG9jdW1lbnRhdGlvbiBzdHlsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTA2NTMKKworMjAxNS0wNi0xMCAwNjozODozOSAtMDQwMCAgWGF2aWVyIENsYWVzc2VucyA8eGF2aWVyLmNsYWVzc2Vuc0Bjb2xsYWJvcmEuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IGZpeCBnZXR0ZXIgb2YgInNzbC11c2Utc3lzdGVtLWNhLWZpbGUiCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUwMjk4CisKKzIwMTUtMDYtMTAgMDk6NDk6NDcgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IHJldmVyc2UgcGxheWJhY2sKKwkgIFdoZW4gcGVyZm9ybWluZyBzZWVrLCBzZWdtZW50LT5zdGFydCBpcyBiZWluZyB1cGRhdGVkIHdpdGggZGVzaXJlZF9vZmZzZXQsCisJICBidXQgaW4gY2FzZSBvZiByZXZlcnNlIHBsYXliYWNrIHNlZ21lbnQtPnN0YXJ0IHNob3VsZCBiZSAwIGFuZAorCSAgc2VnbWVudC0+c3RvcCBzaG91bGQgYmUgdXBkYXRlZCB3aXRoIGRlc2lyZWQgb2Zmc2V0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MDY3NQorCisyMDE1LTAxLTIxIDE4OjA5OjAzICswMTAwICBQaGlsaXBwIFphYmVsIDxwLnphYmVsQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgZ3N0djRsMmJ1ZmZlcnBvb2w6IGhhbmRsZSAtRVBJUEUgZnJvbSBEUUJVRiB0byBzaWduYWwgRU9TCisJICBUaGUgVjRMMiBkZWNvZGVyIHNpZ25hbHMgRU9TIGJ5IHJldHVybmluZyAtRVBJUEUgZnJvbSBEUUJVRiBhZnRlciB0aGUKKwkgIGxhc3QgYnVmZmVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MzMzOAorCisyMDE1LTA2LTA2IDIxOjA5OjE5IC0wNDAwICBYYXZpZXIgQ2xhZXNzZW5zIDx4YXZpZXIuY2xhZXNzZW5zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IEFkZCBhIEdUbHNJbnRlcmFjdGlvbiBwcm9wZXJ0eQorCSAgSXQgY2FuIGJlIHVzZWQgZm9yIFRMUyBjbGllbnQgYXV0aGVudGljYXRpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUwNDcxCisKKzIwMTUtMDEtMDkgMTE6MzY6MTEgKzAxMDAgIEVucmljbyBKb3JucyA8ZWpvQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJICB2NGwyOiBBbGxvdyBzY2FsaW5nIGluIHRoZSB2NGwyKmNvbnZlcnQgZWxlbWVudAorCSAgVGhpcyBpcyBpbnNwaXJlZCBvZiB2aWRlb3NjYWxlIGFuZCB2aWRlb2NvbnZlcnQgZWxlbWVudHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQyOTE3CisKKzIwMTUtMDYtMDkgMTk6MDI6NTUgKzAzMDAgIElseWEgS29uc3RhbnRpbm92IDxpbHlhLmtvbnN0YW50aW5vdkBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaDoKKwkgIHJ0cG1hbmFnZXI6IGRvY3VtZW50IHVuaXRzIG9mIHN0YXRzIGFuZCBhcmd1bWVudHMKKwkgIEFsc28sIG1pbm9yIHNwZWxsaW5nIGFuZCBzdHlsZSBjb3JyZWN0aW9ucy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTA2NTMKKworMjAxNS0wNi0wOSAxNDo0MjoyNyArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogTWFrZWZpbGUuYW06CisJICBjcnVmdDogYWRkIHRoZSBvYnNvbGV0ZSB0bXBsIGRpciB0byBjcnVmdC1kaXJzCisKKzIwMTUtMDYtMDkgMTE6MzA6MjIgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBkOWEzMzUzIHRvIDYwMTVkMjYKKworMjAxNS0wNi0wOSAwNzowNDowNyArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogY29tbW9uOgorCSAgRml4IGNvbW1vbiB2ZXJzaW9uCisJICBXYXMgYWNjaWRlbnRseSBkb3duZ3JhZGVkIGJ5IDg3YTQ4ODRhY2Q4NjU1YTY1OTFkNzM1YTFkOTQ0ZWNiNWVhM2RlMTYKKworMjAxNS0wNi0wOCAxOToxMTo0MSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBBbHNvIHNldCBjb2xvcmltZXRyeSBvbiBvdXRwdXQgZGV2aWNlcworCSAgVGhpcyBjb21wbGV0ZXMgdGhlIGNvZGUgdGhhdCBzZXQgdGhlIGNvbG9yaW1ldHJ5IG9uIG91dHB1dAorCSAgZGV2aWNlLgorCisyMDE1LTA2LTA4IDE5OjEwOjM0IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGNvbW1vbjoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IEFkZCBtaXNzaW5nIFNNVFAyNDBNIG1hdHJpeAorCSAgVGhpcyBpcyBtaXNzaW5nIGluIHRoZSBkb2MsIGJ1dCB3YXMgaW4gdGhlIGhlYWRlci4KKworMjAxNS0wNi0wOCAyMzowMDoxNiArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L2dvb20vZ29vbV9jb3JlLmM6CisJICBnb29tOiBwb3NzaWJsZSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyB3YXJuaW5nCisJICBCdWlsZCBmYWlscyB3aXRoIHRoZSBsYXRlc3Qgc25hcHNob3Qgb2YgZ2NjLTQuOSBiZWNhdXNlIHBhcmFtMSBhbmQgcGFyYW0yIG1pZ2h0CisJICBwb3NzaWJseSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQuIFRoZXkgYXJlIHNldCBkZXBlbmRpbmcgb24gdGhlIGNhc2VzIG9mIGEgc3dpdGNoCisJICBzdGF0ZW1lbnQgYW5kIHRoZSBjb21waWxlciBzZWVzIHRoaXMgYXMgbm90IGEgY29tcGxldGUgZ3VhcmFudGVlLgorCSAgU2V0IHRoZW0gdG8gMCBpZiB0aGUgc3dpdGNoIHN0YXRlbWVudCBmYWxscyBkb3duIHRvIHRoZSBkZWZhdWx0IGNhc2UuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUwNTY2I2M2CisKKzIwMTUtMDYtMDggMTc6MjQ6MzggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRnVsbHkgaW1wbGVtZW50IGNvbG9yaW1ldHJ5IHN1cHBvcnQKKwkgIFRoaXMgZml4ZXMgd3JvbmcgbWFwcGluZyBmb3Igc1JHQiBhcyBpbiBHU3RyZWFtZXIgc1JHQiBjb3JyZWN0bHkKKwkgIGFwcGx5IHRvIFJHQiBmb3JtYXRzLCB3aGlsZSBpbiBWNEwyIGl0J3MgYW4gYWxpYXMgZm9yIHNZQ0MuIEFsc28KKwkgIGFkZCBzdXBwb3J0IGZvciB0aGUgbmV3IHF1YW50aXphdGlvbiAocmFuZ2UpLCB5Y2Jjcl9lbmNvZGluZyAobWF0cml4KQorCSAgYW5kIHhmZXJfZnVuYyAodHJhbnNmZXIpIGVudW1lcmF0aW9uLgorCisyMDE1LTA2LTA4IDE3OjAxOjE1IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2V4dC90eXBlcy1jb21wYXQuaDoKKwkqIHN5cy92NGwyL2V4dC92NGwyLWNvbW1vbi5oOgorCSogc3lzL3Y0bDIvZXh0L3Y0bDItY29udHJvbHMuaDoKKwkqIHN5cy92NGwyL2V4dC92aWRlb2RldjIuaDoKKwkgIHY0bDI6IFVwZGF0ZSBrZXJuZWwgaGVhZGVycyB0byBsYXRlc3QgZnJvbSBtZWRpYSB0cmVlCisJICBUaGlzIGlzIHRoZSBsYXRlc3QgZnJvbSBtZWRpYSB0cmVlLiBUaGlzIHNob3VsZCBlbmFibGUgbW9yZSBkZXZlbG9wbWVudAorCSAgb2YgdGhlIHY0bDIgZWxlbWVudHMuIFRoaXMgaW5jbHVkZXMgbmV3IGZsYWdzIHJlcXVpcmVzIHRvIGZpeCBkcmFpbmluZworCSAgcGF0aCBpbiBkZWNvZGVyLCBjb2xvcmltZXRyeSBhbmQgbXVjaCBtb3JlLgorCisyMDE1LTA2LTA4IDIzOjA3OjU1ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZDM3YWYzMiB0byBkOWEzMzUzCisKKzIwMTUtMDYtMDggMTk6NDI6MzAgKzAxMDAgIENocmlzIENsYXl0b24gPGNocmlzMjU1M0Bnb29nbGVtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cDhwYXkuYzoKKwkgIHJ0cHZwOGRlcGF5OiBwb3RlbnRpYWwgYWNjZXNzIGJleW9uZCBlbmQgb2YgYXJyYXkKKwkgIENvbXBpbGluZyAod2l0aCBnY2MtNC45LTIwMTUwNjAzKSBwcm9kdWNlcyBhbiBlcnJvciBiZWNhdXNlIG9mIGFuIGFjY2VzcyBiZXlvbmQKKwkgIHRoZSBlbmQgb2YgYW4gYXJyYXkuIFRoaXMgcGF0Y2ggZml4ZXMgdGhlIGVycm9yIGJ5IGluaXRpYWxpemluZyB0aGUgbG9vcAorCSAgY29udHJvbC9hcnJheSBpbmRleCB2YXJpYWJsZSAoaSkgdG8gMSBhbmQgcmV0dXJuaW5nIGkgLSAxIHdoZW4gYSBtYXRjaCBpcyBmb3VuZC4KKwkgIEFsc28sIGJlY2F1c2UgdGhlIHZhbHVlcyBzdG9yZWQgaW4gdGhlIGFycmF5IGluY3JlYXNlIGluIHZhbHVlIGFzIHRoZSBpbmRleAorCSAgaW5jcmVhc2VzLCB0aGUgPj0gdGVzdCB1bm5lY2Vzc2FyeSwgc28gaXQgaXMgcmVtb3ZlZC4KKworMjAxNS0wNC0zMCAwMjo1Mjo1OCArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IERvbid0IGFjY3VtdWxhdGUgbW9yZSB0aGFuIDIgR09QcworCSAgRG9uJ3QgYWxsb3cgbGFyZ2UgYW1vdW50cyBvZiBkYXRhIHRvIHF1ZXVlIHVwIC0gd2Ugb25seSBuZWVkCisJICB0aGUgR09QIHdlJ3JlIHdyaXRpbmcsIGFuZCB0aGUgR09QIHdlJ3JlIGFjY3VtdWxhdGluZy4KKworMjAxNS0wNC0xNiAxMDo0NDo0OSArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIGlzb21wNDogZnN5bmMgYWZ0ZXIgc2VuZGluZyB1cGRhdGVzIGluIHJvYnVzdCBtb2RlCisJICBVc2UgdGhlIG5ldyBHc3RCdWZmZXIgU1lOQ19BRlRFUiBmbGFnIHRvIHRyaWdnZXIgYW4gZnN5bmMKKwkgIGFmdGVyIHVwZGF0aW5nIHRoZSBtb292IG9yIG1kYXQgYXRvbSwgYW5kIGFmdGVyIHVwZGF0aW5nIHRoZSBmcmVlCisJICBhdG9tIHRvIG1ha2UgaXQgdmlzaWJsZS4KKworMjAxNS0wNC0wMyAwMDo1NzoyMCArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIGlzb21wNDogT25seSBzZXQgbW9vdiBoZWFkZXIgaW50byBzdHJlYW1oZWFkZXIgYXQgRU9TCisJICBPbmx5IHVwZGF0ZSB0aGUgbW9vdiBoZWFkZXIgaW50byB0aGUgY2FwcyBpZiBpdCdzIHRoZSBmaW5hbGlzZWQKKwkgIG1vb3YgYXQgRU9TIHRpbWUuIEF2b2lkcyBwb3N0aW5nIGEgYm9ndXMgbW9vdiBhdCBzdGFydHVwIGFuZAorCSAgcmVwZWF0ZWQgdXBkYXRlcyBpbiByb2J1c3QtcmVjb3JkaW5nIG1vZGUKKworMjAxNS0wNC0wMyAwMTo0NDoxNSArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6CisJICB0ZXN0czogVXBkYXRlIG1wNCBtdXggdGVzdCBmb3IgbWRhdCBwbGFjZWhvbGRlciBjaGFuZ2UKKwkgIFRoZSBtcDQgbXV4ZXIgbm93IHdyaXRlcyBhIHBsYWNlLWhvbGRlciBtZGF0IGFzIGEgZnJlZQorCSAgYXRvbSBmb2xsb3dlZCBieSBhIDAtYnl0ZSBtZGF0IHRoYXQgY292ZXJzIHRoZSByZXN0IG9mIHRoZQorCSAgZmlsZSwgbWFraW5nIGl0IHBvc3NpYmxlIHRvIHJld3JpdGUgaXQgYXMgNjQtYml0LCBvciBsZWF2ZQorCSAgaXQgYXMtaXMgaWYgbm90aGluZyBlbHNlIGlzIHdyaXR0ZW4gYWZ0ZXJ3YXJkCisKKzIwMTUtMDQtMDEgMTE6MTU6MzggKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJKiBnc3QvaXNvbXA0L2F0b21zcmVjb3ZlcnkuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkgIGlzb21wNDogSW1wbGVtZW50IHJvYnVzdCBtdXhpbmcgdXNpbmcgcGluZy1wb25nIHN0cmF0ZWd5CisJICBJbXBsZW1lbnQgYSByb2J1c3QgcmVjb3JkaW5nIG1vZGUsIHdoZXJlIHRoZSBvdXRwdXQKKwkgIGZpbGUgaXMgYWx3YXlzIGluIGEgcGxheWFibGUgc3RhdGUsIHNlZWtpbmcgYW5kIHJld3JpdGluZworCSAgdGhlIG1vb3YgaGVhZGVyIGF0IGEgY29uZmlndXJhYmxlIGludGVydmFsLiBSZXdyaXRpbmcKKwkgIG1vb3YgaXMgZG9uZSB1c2luZyByZXNlcnZlZCBzcGFjZSBhdCB0aGUgc3RhcnQgb2YKKwkgIHRoZSBmaWxlLCBhbmQgYSBwaW5nLXBvbmcgc3RyYXRlZ3kgd2hlcmUgdGhlIG1vb3YKKwkgIGlzIHJlcGxhY2VkIGF0b21pY2FsbHkgc28gaXQncyBuZXZlciBpbnZhbGlkLgorCSAgVHJhY2sgd2hlbiB0YWdzIGhhdmUgYWN0dWFsbHkgY2hhbmdlZCwgYW5kIGRvbid0IHdyaXRlIHRoZW0gaW50bworCSAgdGhlIG1vb3YgdW5sZXNzIHRoZXkndmUgY2hhbmdlZC4gQ2xlYXIgYW55IGV4aXN0aW5nIHRhZ3Mgd2hlbgorCSAgcmUtd3JpdGluZyB0aGVtLCBzbyB3ZSBjYW4gZG8gcHJvZ3Jlc3NpdmUgbW9vdiB1cGRhdGluZyBpbiByb2J1c3QKKwkgIHJlY29yZGluZyBtb2RlLgorCSAgV3JpdGUgcGxhY2Vob2xkZXIgbWRhdCBhcyBhIGZyZWUgYXRvbSBwbHVzIGEgMzItYml0IG1kYXQKKwkgIHdpdGggJzAnIHNpemUsIHdoaWNoIG1lYW5zICJyZXN0IG9mIHRoZSBmaWxlIiBpbiB0aGUgc3BlYy4KKwkgIFJlLXdyaXRlIGl0IGxhdGVyIHRvIGEgZnVsbCA2NC1iaXQgZXh0ZW5kZWQgc2l6ZSBhdG9tIGlmIG5lZWRlZC4KKworMjAxNS0wNC0wMSAwMDo1ODo1MiArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvYXRvbXMuaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIGlzb21wNDogVXBkYXRlIGVkaXQgbGlzdCB3aGVuIHJlLXdyaXRpbmcgbW9vdgorCSAgQ29ycmVjdGx5IHVwZGF0ZSBhbnkgZWRpdCBsaXN0cyBlYWNoIHRpbWUgdGhlIG1vb3YgaXMgcmVjYWxjdWxhdGVkLAorCSAgdXBkYXRpbmcgZXhpc3RpbmcgdGFibGUgZW50cmllcyBpZiB0aGV5IGFscmVhZHkgZXhpc3QgaW5zdGVhZCBvZiBqdXN0CisJICBhZGRpbmcgbmV3IG9uZXMuCisKKzIwMTUtMDQtMDggMDE6NDE6MTggKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBpc29tcDQ6IFJlbW92ZSBhbiBleHRyYSBicmFja2V0IGluIGEgY29tbWVudC4KKworMjAxNS0wMy0xOSAyMDoyOTo0NCArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYzoKKwkgIHNwbGl0bXV4c3JjOiBQcm90ZWN0IHRvdGFsX2R1cmF0aW9uIHN0YXRlIHZhcmlhYmxlIHdpdGggdGhlIG9iamVjdCBsb2NrLgorCSAgUHJldmVudCBkZWFkbG9ja3MgZnJvbSBkb3duc3RyZWFtIHF1ZXJ5aW5nIGR1cmF0aW9uIGZyb20gdGhlIHN0cmVhbWluZyB0aHJlYWQuCisKKzIwMTUtMDYtMDcgMjM6MDY6MjAgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSAyMWJhMmU1IHRvIGQzN2FmMzIKKworMjAxNS0wNi0wNyAxOToyNDoyMCArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L2dvb20vZ3N0YXVkaW92aXN1YWxpemVyLmM6CisJICBnb29tOiBjbGVhbiBkZXJlZmVyZW5jZXMgb2YgcHJpdmF0ZSBzdHJ1Y3R1cmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDI4NzUKKworMjAxNS0wNi0wNyAxOToyMDowNCArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L2dvb20yazEvZ3N0YXVkaW92aXN1YWxpemVyLmM6CisJICBnb29tMmsxOiBjbGVhbiBkZXJlZmVyZW5jZXMgb2YgcHJpdmF0ZSBzdHJ1Y3R1cmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDI4NzUKKworMjAxNS0wNi0wNyAxNzozMjowMSArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGM0MDg1ODMgdG8gMjFiYTJlNQorCisyMDE1LTA2LTA3IDE3OjAxOjM3ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICBkb2NzOiByZW1vdmUgdmFyaWFibGVzIHRoYXQgd2UgZGVmaW5lIGluIHRoZSBzbmlwcGV0IGZyb20gY29tbW9uCisJICBUaGlzIGlzIHN5bmNpbmcgb3VyIE1ha2VmaWxlLmFtIHdpdGggdXBzdHJlYW0gZ3RrZG9jLgorCisyMDE1LTA2LTA3IDE3OjE2OjE5ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBhdXRvZ2VuLnNoOgorCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGQ2NzY5OTMgdG8gYzQwODU4MworCisyMDE1LTA2LTA3IDE2OjQ0OjM3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisKKz09PSByZWxlYXNlIDEuNS4xID09PQorCisyMDE1LTA2LTA3IDEwOjQ2OjM0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0LmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyb3JjLWRpc3QuYzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS41LjEKKworMjAxNS0wNi0wNyAxMDozODoyOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxNS0wNi0wNyAxMDozMjozOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogT3ZlcnJpZGUgdGhlIFNTUkMgZnJvbSB0aGUgcGFja2V0cycgU1NSQyBpZiBub25lIHdhcyBnaXZlbiB2aWEgY2FwcyBvciBwcm9wZXJ0eQorCisyMDE1LTA2LTA3IDA5OjM1OjM4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgcG86IFVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAxNS0wNi0wNSAxNTozMjoxMCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IERvbid0IHdhcm4gd2hlbiBvcHRpb25hbCBDSUQgYXJlIG5vdCBpbXBsZW1lbnQKKwkgIGdzdF92NGwyX2dldF9hdHRyaWJ1dHJlKCkgc2hhbGwgb25seSBiZSB1c2VkIHdoZW4gdGhlIENJRCBpcyBleHBlY3RlZAorCSAgdG8gYmUgc3VwcG9ydGVkLiBPdGhlcndpc2UsIHdlIGdldCB1bndhbnRlZCB3YXJuaW5nIHBvc3RlZCB0byB0aGUgYnVzLgorCisyMDE1LTA2LTA1IDE2OjQzOjA4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBzZXNzaW9uOiBPbmx5IHN1Z2dlc3Qgb3VyIGludGVybmFsIHNzcmMgaWYgaXQncyBub3QgYSByYW5kb20gb25lIGFuZCB3YXMgc2VsZWN0ZWQgYXMgaW50ZXJuYWwgc3NyYworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0OTU4MQorCisyMDE1LTA2LTA0IDE0OjE4OjAxICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJICBpbnRlcmxlYXZlOiBlcnJvciB3aGVuIGNoYW5uZWwtcG9zaXRpb25zLWZyb20taW5wdXQ9RmFsc2UKKwkgIHNlbGYtPmNoYW5uZWxzIGlzIGJlaW5nIGluY3JlbWVudGVkIG9ubHkgd2hlbgorCSAgY2hhbm5lbC1wb3NpdGlvbnMtZnJvbS1pbnB1dCBpcyBzZXQgYXMgVFJVRS4gU28gaW4gY2FzZSBvZiBGQUxTRQorCSAgc2VsZi0+ZnVuYyBpcyBub3Qgc2V0IGFuZCBoZW5jZSBjcmVhdGluZyBhc3NlcnRpb24gZXJyb3IuCisJICBIZW5jZSByZW1vdmluZyB0aGUgY29uZGl0aW9uIHRvIGluY3JlbWVudCBzZWxmLT5jaGFubmVscy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDQyMTEKKworMjAxNS0wNi0wNSAxMDozMzoxMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IEFkZCBzdXBwb3J0IGZvciByZWNlaXZpbmcgcmVkdWNlZCBzaXplIFJUQ1AKKwkgIEl0IHdvcmtlZCBiZWZvcmUgYnV0IGdhdmUgd2FybmluZ3MsIG5vdyB3ZSBqdXN0IGlnbm9yZSBSVENQCisJICBwYWNrZXRzIHRoYXQgZG9uJ3Qgc3RhcnQgd2l0aCBhIFNSLiBBcyBhbGwgd2UncmUgaW50ZXJlc3RlZAorCSAgaW4gaGVyZSBhcmUgU1JzLgorCisyMDE1LTA2LTAzIDEyOjIyOjQyICswMjAwICBKb3NlIEFudG9uaW8gU2FudG9zIENhZGVuYXMgPHNhbnRvc2NhZGVuYXNAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHJ0cHNzcmNkZW11eDogQWRkIHN1cHBvcnQgZm9yIHJlZHVjZSBzaXplIHJ0Y3AKKwkgIEFjY29yZGluZyB0byBSRkMgNTUwNiwgcmVkdWNlIHNpemUgcGFja2FnZXMgY2FuIGJlIHNlbnQsIHRoaXMKKwkgIHBhY2thZ2VzIG1heSBub3QgYmUgY29tcG91bmQsIHNvIHdlIG5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yCisJICBnZXR0aW5nIHNzcmMgZnJvbSBvdGhlciB0eXBlcyBvZiBwYWNrYWdlcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTAzMjcKKworMjAxNS0wNi0wMyAxMzoxNDo0NCArMDIwMCAgSm9zZSBBbnRvbmlvIFNhbnRvcyBDYWRlbmFzIDxzYW50b3NjYWRlbmFzQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogQWRkIHN1cHBvcnQgZm9yIHJlY2VpdmluZyByZWR1Y2VkIHNpemUgcnRjcAorCSAgU2VlIFJGQyA1NTA2CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUwMzMyCisKKzIwMTUtMDYtMDQgMTY6MDk6NDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBBZGQgc3VwcG9ydCBmb3IgY2hhbm5lbCBjb25maWd1cmF0aW9ucyAxMSwgMTIgYW5kIDE0IGFuZCA3IGFjdHVhbGx5IGhhcyA4IGNoYW5uZWxzCisJICBJU08vSUVDIDE0NDk2LTM6MjAwOS9QREFNIDQgYWRkZWQgMTEsIDEyIGFuZCAxNC4KKworMjAxNS0wNi0wMyAwODo1Nzo1NyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0YXN0ZXJpc2toMjYzLmM6CisJICBhc3Rlcmlza2gyNjM6IFVuLXJhbmsgY2xhc2hpbmcgZGVwYXlsb2FkZXIKKwkgIFRoaXMgZGVwYXlsb2FkZXIgY2xhc2ggd2l0aCB0aGUgc3RhbmRhcmQgb25lIGZvciBIMjYzcC4gSXQgcHJvZHVjZXMgYW4KKwkgIEgyNjNwIHN0cmVhbSB3aXRoIGEgbW9kaWZpZWQgaGVhZGVyLiBJdCB1c2VzIGVuY29kaW5nLW5hbWUgdGhhdCBpcyB0aGUKKwkgIHNhbWUgYXMgSDI2M3AgKEgyNjMtMTk5OCkgdGhvdWdoIHRoZSByZXN1bHRpbmcgRVMgaXMgbm90IGRlY29kYWJsZSBvcgorCSAgcGFyc2FibGUgaW4gR1N0cmVhbWVyLCBtYWtpbmcgaXQgdW5zdWFibGUgaW4gZHluYW1pYyBwaXBlbGluZS4gVGhpcworCSAgcGF0Y2ggdW5yYW5rIHRoaXMgc3BlY2lhbGl6ZWQgZGVwYXlsb2FkZXIgc2luY2UgaXQgY2FuIG9ubHkgYmUgdXNlZCBpbgorCSAgY3VzdG9tIHBpcGVsaW5lLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczOTkzNQorCisyMDE1LTA2LTAyIDE4OjA5OjQ4ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmM6CisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmg6CisJICBnb29tMmsxOiByZW1vdmUgdmFyaWFibGVzIG5vdCBuZWVkZWQgYW55bW9yZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0Mjg3NQorCisyMDE1LTA2LTAyIDE3OjUyOjQ2ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvZ29vbTJrMS9NYWtlZmlsZS5hbToKKwkqIGdzdC9nb29tMmsxL2dzdGF1ZGlvdmlzdWFsaXplci5jOgorCSogZ3N0L2dvb20yazEvZ3N0YXVkaW92aXN1YWxpemVyLmg6CisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmM6CisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmg6CisJICBnb29tMmsxOiByZWJhc2UgdG8gdXNlIHRoZSBhdWRpb3Zpc3VhbGl6ZXIgY2xhc3MKKwkgIFJlYmFzZSB0byBoYXZlIGdvb20yazEgdXNpbmcgdGhlIGNvbW1vbiBHc3RBdWRpb1Zpc3VhbGl6ZXIgY2xhc3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDI4NzUKKworMjAxNS0wNi0wMiAxNzoyOTozNiArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L2dvb20vTWFrZWZpbGUuYW06CisJKiBnc3QvZ29vbS9nc3RhdWRpb3Zpc3VhbGl6ZXIuYzoKKwkqIGdzdC9nb29tL2dzdGF1ZGlvdmlzdWFsaXplci5oOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5oOgorCSAgZ29vbTogcmViYXNlIHRvIHVzZSB0aGUgYXVkaW92aXN1YWxpemVyIGNsYXNzCisKKzIwMTUtMDYtMDIgMTY6Mjc6MjQgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FhY3BhcnNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hYzNwYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXBldjJtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FzcGVjdHJhdGlvY3JvcC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9hbXBsaWZ5LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2NoZWJiYW5kLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2NoZWJsaW1pdC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9keW5hbWljLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2ludmVydC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW93c2luY2JhbmQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvd3NpbmNsaW1pdC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9lcXVhbGl6ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsYWNwYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzdjJtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2pwZWdkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2pwZWdlbmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tcGVnYXVkaW9wYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdsaW1pdGVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ3ZvbHVtZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBzZXNzaW9uLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zcGVjdHJ1bS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9ib3guYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9maWx0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tlbmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2twYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMveTRtZW5jLmM6CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvc2ltcGxlLWxhdW5jaC1saW5lcy5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3RhZ3NjaGVja2luZy5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3dhdnBhY2suYzoKKwkgIGNoZWNrOiBVc2UgR1NUX0NIRUNLX01BSU4gKCkgbWFjcm8gZXZlcnl3aGVyZQorCSAgTWFrZXMgc291cmNlIGNvZGUgc21hbGxlciwgYW5kIGVuc3VyZXMgd2UgZ28gdGhyb3VnaCBjb21tb24gaW5pdGlhbGl6YXRpb24KKwkgIHBhdGggKGxpa2UgdGhlIG9uZSB0aGF0IHNldHMgdXAgWE1MIHVuaXQgdGVzdCBvdXRwdXQgLi4uKQorCisyMDE1LTA1LTI2IDE0OjQ3OjMxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBzZXNzaW9uOiBPbmx5IHNjaGVkdWxlIGEgdGltZXIgd2hlbiB3ZSBhY3R1YWxseSBoYXZlIHRvIHNlbmQgUlRDUAorCSAgT3RoZXJ3aXNlIHdlIHdpbGwgaGF2ZSAxMHMtMTAwcyBvZiB0aHJlYWQgd2FrZXVwcyBpbiBmZWVkYmFjayBwcm9maWxlcywgY3JlYXRlCisJICBSVENQIHBhY2tldHMsIGV0Yy4ganVzdCB0byBzdXBwcmVzcyB0aGVtIGluIDk5JSBvZiB0aGUgY2FzZXMgKGkuZS4gaWYgbm8KKwkgIGZlZWRiYWNrIGlzIGFjdHVhbGx5IHBlbmRpbmcgYW5kIG5vIHJlZ3VsYXIgUlRDUCBoYXMgdG8gYmUgc2VudCkuCisJICBUaGlzIGltcHJvdmVzIENQVSB1c2FnZSBhbmQgYmF0dGVyeSBsaWZlIHF1aXRlIGEgbG90LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjU0MworCisyMDE1LTA1LTIyIDEzOjQ0OjAzICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBSZW1vdmUgdXNlbGVzcyBnb3RvCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ2NTQzCisKKzIwMTUtMDUtMjEgMTI6NTQ6NDcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2NC1ydHguc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LXJ0cGF1eC5jOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1WVFMtSDI2NC1ydHguc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXJ0cGF1eC5jOgorCSAgZXhhbXBsZXM6IFNldCBSVFAgcHJvZmlsZSB0byBBVlBGIGZvciBydHBhdXggZXhhbXBsZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDY1NDMKKworMjAxNS0wNS0wNCAxNjo0MTo1MCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogU2V0IFJUUCBwcm9maWxlIG9uIHRoZSBydHBzZXNzaW9uIG9iamVjdHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDY1NDMKKworMjAxNS0wNS0yMSAxNDoxMzo1NiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgIHJ0cGJpbjogQWRkIHJ0cC1wcm9maWxlIHByb3BlcnR5IGZvciBzZXR0aW5nIHRoZSBkZWZhdWx0IHByb2ZpbGUgb2YgbmV3bHkgY3JlYXRlZCBzZXNzaW9ucworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjU0MworCisyMDE1LTA1LTA0IDExOjUxOjQxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBPbmx5IHB1dCBSUnMgYW5kIGZ1bGwgU0RFUyBpbnRvIHJlZ3VsYXIgUlRDUCBwYWNrZXRzCisJICBJZiB3ZSBtYXkgc3VwcHJlc3MgdGhlIHBhY2tldCBkdWUgdG8gdGhlIHJ1bGVzIG9mIFJGQzQ1ODUgKGkuZS4gd2hlbgorCSAgYmVsb3cgdGhlIHQtcnItaW50KSwgd2UgY2FuIHNlbmQgYSBzbWFsbGVyIFJUQ1AgcGFja2V0IHdpdGhvdXQgUlJzCisJICBhbmQgZnVsbCBTREVTLiBJbiB0aGVvcnkgd2UgY291bGQgZXZlbiBzZW5kIGEgbWluaW1hbCBSVENQIHBhY2tldAorCSAgYWNjb3JkaW5nIHRvIFJGQzU1MDYsIGJ1dCB3ZSBkb24ndCBzdXBwb3J0IHRoYXQgeWV0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjU0MworCisyMDE1LTA1LTA0IDEzOjUxOjUwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBzZXNzaW9uOiBLZWVwIHRyYWNrIG9mIHRwL3RuIGFuZCB0X3JyX2xhc3Qgc2VwYXJhdGVseQorCSAgT3RoZXJ3aXNlIHdlIGNhbid0IHByb3Blcmx5IHNjaGVkdWxlIFJUQ1AgaW4gZmVlZGJhY2sgcHJvZmlsZXMgYXMgd2UgbmVlZCB0bworCSAgZGlzdGluZ3Vpc2ggdGhlIHRpbWUgd2hlbiB3ZSBsYXN0IGNoZWNrZWQgZm9yIHNlbmRpbmcgUlRDUCAodHApIGJ1dCBtaWdodCBoYXZlCisJICBzdXBwcmVzc2VkIGl0LCBhbmQgdGhlIHRpbWUgd2hlbiB3ZSBsYXN0IGFjdHVhbGx5IHNlbnQgYSBub24tZWFybHkgUlRDUAorCSAgcGFja2V0LgorCSAgVGhpcyB0b2dldGhlciB3aXRoIHRoZSBvdGhlciBjaGFuZ2VzIHNob3VsZCBub3cgcHJvcGVybHkgaW1wbGVtZW50IFJUQ1AKKwkgIHNjaGVkdWxpbmcgYWNjb3JkaW5nIHRvIFJGQzQ1ODUsIGFuZCBlc3BlY2lhbGx5IGFsbG93IHVzIHRvIHNlbmQgZmVlZGJhY2sKKwkgIHBhY2tldHMgYSBsb3QgaWYgbmVlZGVkIGJ1dCBvbmx5IHNlbmQgcmVndWxhciBSVENQIHBhY2tldHMgZXZlcnkgb25jZSBpbiBhCisJICB3aGlsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDY1NDMKKworMjAxNS0wNS0wNCAxMTo0MjowOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaDoKKwkgIHJ0cHNlc3Npb246IEFkZCBwcm9wZXJ0eSBmb3Igc2VsZWN0aW5nIFJUUCBwcm9maWxlIChBVlAvQVZQRi9ldGMpCisJICBBbmQgbW9kaWZ5IG91ciBSVENQIHNjaGVkdWxpbmcgYWxnb3JpdGhtIGFjY29yZGluZ2x5LiBXZSBub3cgY2FuIHNlbmQgbW9yZQorCSAgUlRDUCBwYWNrZXRzIGlmIG5lZWRlZCBmb3IgZmVlZGJhY2ssIGJ1dCB3aWxsIHRocm90dGxlIGZ1bGwgUlRDUCBwYWNrZXRzIGJ5CisJICBydGNwLW1pbi1pbnRlcnZhbCAodC1yci1pbnQgZnJvbSBSRkM0NTg1KS4KKwkgIEluIG5vbi1mZWVkYmFjayBtb2RlLCBydGNwLW1pbi1pbnRlcnZhbCBpcyBUbWluIGZyb20gUkZDMzU1MCwgd2hpY2ggaXMKKwkgIHN0YXRpY2FsbHkgc2V0IHRvIDFzIG9yIDBzIGJ5IFJGQzQ1ODUuIFRtaW4gZGVmaW5lcyBob3cgb2Z0ZW4gd2Ugc2hvdWxkCisJICBzZW5kIFJUQ1AgcGFja2V0cyBhdCBtb3N0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjU0MworCisyMDE1LTA1LTMwIDE3OjQxOjA1IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOgorCSAgbXVsYXdkZWM6IExldCBiYXNlY2xhc3MgZXN0aW1hdGUgYml0cmF0ZQorCSAgVGhpcyBtYWtlcyBwbGF5YmFjayBkaXJlY3RseSBmcm9tIGEgZmlsZSB3b3JrIHdpdGggdGhlIHJpZ2h0IGNhcHMuCisKKzIwMTUtMDUtMjcgMTY6MzE6MjMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmg6CisJICBkeW51ZHBzaW5rOiBrZWVwIEdDYW5jZWxsYWJsZSBmZCBhcm91bmQgaW5zdGVhZCBvZiByZS1jcmVhdGluZyBpdCBjb25zdGFudGx5CisJICBBbmQgY3JlYXRlIGl0IG9ubHkgd2hlbiBzdGFydGluZyB0aGUgZWxlbWVudC4KKworMjAxNS0wNS0yNyAxNTo1NTo1NiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJICB1ZHBzaW5rLCBtdWx0aXVkcHNpbms6IGtlZXAgR0NhbmNlbGxhYmxlIGZkIGFyb3VuZCBpbnN0ZWFkIG9mIHJlLWNyZWF0aW5nIGl0IGNvbnN0YW50bHkKKwkgIE90aGVyd2lzZSB3ZSBjb25zdGFudGx5IGNyZWF0ZS9jbG9zZSBldmVudCBmaWxlIGRlc2NyaXB0b3JzLAorCSAgZXZlcnkgdGltZSB3ZSBjYWxsIGdfc29ja2V0X2NvbmRpdGlvbl90aW1lZF93YWl0KCkgb3IKKwkgIGdfc29ja2V0X3NlbmRfbWVzc2FnZShzKSgpLCBpLmUuIGEgbG90LiBXaGljaCBpcyBub3QKKwkgIHBhcnRpY3VsYXJseSBnb29kIGZvciBwZXJmb3JtYW5jZS4KKwkgIENhbid0IGNyZWF0ZSBHQ2FuY2VsbGFibGUgaW4gOjpzdGFydCgpIGhlcmUgYmVjYXVzZSBpdCdzIHVzZWQKKwkgIGluIGNsaWVudF9uZXcoKSB3aGljaCBtYXkgYmUgY2FsbGVkIHZpYSB0aGUgYWRkLWNsaWVudCBhY3Rpb24KKwkgIHNpZ25hbCB3aGljaCBtYXkgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZWxlbWVudCBpcyB1cCBhbmQgcnVubmluZy4KKworMjAxNS0wNS0xOSAxODoxMzoxNiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmg6CisJICB1ZHBzcmM6IGtlZXAgR0NhbmNlbGxhYmxlIGZkIGFyb3VuZCBpbnN0ZWFkIG9mIHJlLWNyZWF0aW5nIGl0IGNvbnN0YW50bHkKKwkgIE90aGVyd2lzZSB3ZSBjb25zdGFudGx5IGNyZWF0ZS9jbG9zZSBldmVudCBmaWxlIGRlc2NyaXB0b3JzLAorCSAgZXZlcnkgc2luZ2xlIHRpbWUgd2UgY2FsbCBnX3NvY2tldF9jb25kaXRpb25fdGltZWRfd2FpdCgpIG9yCisJICBnX3NvY2tldF9yZWNlaXZlX21lc3NhZ2UoKSwgaS5lLiB0d2ljZSBwZXIgcGFja2V0IHJlY2VpdmVkIQorCSAgVGhpcyB3YXMgbm90IHBhcnRpY3VsYXJseSBnb29kIGZvciBwZXJmb3JtYW5jZS4KKwkgIEFsc28gb25seSBjcmVhdGUgR0NhbmNlbGxhYmxlIG9uIHN0YXJ0LXVwLgorCisyMDE1LTA1LTI2IDE1OjMzOjM3ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thOiBvdmVyd3JpdHRlbiB2YWx1ZSBhc3NpZ25tZW50CisJICBjdXJwb3MgaXMgc2V0IGFuZCBpbW1lZGlhdGVseSBhZnRlciwgc2V0IGFnYWluLiBSZW1vdmUgdGhlIHJlZHVuZGFudAorCSAgYXNzaWdubWVudC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDk5MDkKKworMjAxNS0wNS0yMyAxMzo0NzoxNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkgIHJ0cHZyYXdkZXBheTogZG9uJ3Qgc2hhZG93IGV4aXN0aW5nIG91dGJ1ZiB2YXJpYWJsZQorCSAgQW5kIGZpeCB1bnJlZiBvZiB0aGUgd3Jvbmcgb25lIHdoaWNoIHdpbGwgY29udGFpbiBOVUxMCisJICBpbiBhbiBlcnJvciBjb2RlIHBhdGguCisKKzIwMTUtMDUtMjMgMTM6MjM6MjIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5oOgorCSAgcnRwdnJhd2RlcGF5OiBtYXAvdW5tYXAgb3V0cHV0IGZyYW1lIG9ubHkgb25jZSwgbm90IGZvciBldmVyeSBpbnB1dCBwYWNrZXQKKwkgIE1hcCBvdXRwdXQgYnVmZmVyIGFmdGVyIGNyZWF0aW5nIGl0IGFuZCBrZWVwIGl0IG1hcHBlZAorCSAgdW50aWwgd2UncmUgZG9uZSB3aXRoIGl0IGluc3RlYWQgb2YgbWFwcGluZy91bm1hcHBpbmcKKwkgIGl0IGZvciBldmVyeSBzaW5nbGUgaW5wdXQgYnVmZmVyLgorCisyMDE1LTA1LTI1IDA4OjQ3OjQ3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcmVtb3ZlIGZpeG1lIGZyb20gMjAwNgorCSAgSXQgaGFzIGJlZW4gdmVyaWZpZWQgYnkgdXNlIG92ZXIgdGltZS4KKworMjAxNS0wNS0yMyAxNDozNjo0MSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCByZXZlcnNlIHBsYXliYWNrIG9mIGZyYWdtZW50ZWQgbWVkaWEKKwkgIHF0ZGVtdXggY3JlYXRlcyBhIHNhbXBsZXMgYXJyYXkgYW5kIGdldHMgdGhlIHRpbWVzdGFtcHMgZm9yIGJ1ZmZlcnMgYnkKKwkgIGFjY3VtdWxhdGluZyB0aGVpciBkdXJhdGlvbnMuIFdoZW4gZG9pbmcgcmV2ZXJzZSBwbGF5YmFjayBvZiBmcmFnbWVudHMsCisJICBhY2N1bXVsYXRpbmcgc2FtcGxlcyB3aWxsIGxlYWQgdG8gd3JvbmcgdGltZXN0YW1wcyBhcyB0aGUgdGltZXN0YW1wcworCSAgc2hvdWxkIGdvIGRlY3JlYXNpbmcgZnJvbSBmcmFnbWVudCB0byBmcmFnbWVudCBhbmQgdGhlIGFjY3VtdWxhdGlvbgorCSAgd2lsbCBwcm9kdWNlIHdyb25nIHJlc3VsdHMuCisJICBJbiB0aGlzIGNhc2UsIHdoZW4gcmVjZWl2aW5nIGEgZGlzY29udCBmb3IgZnJhZ21lbnRlZCByZXZlcnNlIHBsYXliYWNrLAorCSAgdGhlIHByZXZpb3VzIHNhbXBsZXMgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGZsdXNoZWQgYmVmb3JlIG5ldyBkYXRhCisJICBpcyBwcm9jZXNzZWQuCisKKzIwMTUtMDUtMjMgMDE6MDM6MTggKzA5MDAgIEppbW15IE9obiA8eW9uZ2ppbi5vaG5AbGdlLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdGZpbGVzcmMuYzoKKwkgIHNwbGl0ZmlsZXNyYzogSW1wbGVtZW50IGJpbmFyeSBzZWFyY2ggaW4gZmluZF9wYXJ0X2Zvcl9vZmZzZXQKKwkgIEltcGxlbWVudCBiaW5hcnkgc2VhcmNoIHVzaW5nIGdzdF91dGlsX2FycmF5X2JpbmFyeV9zZWFyY2gKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDk2OTAKKworMjAxNS0wNS0yMSAxMzoyNjo1MyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogRG9uJ3QgY3Jhc2ggaWYgd2UgcmVjZWl2ZSBGSVIvUExJIGZyb20gYSBzb3VyY2Ugd2UgZG9uJ3Qga25vdworCisyMDE1LTA1LTIxIDA5OjM1OjU4ICswMjAwICBTYW50aWFnbyBDYXJvdC1OZW1lc2lvIDxzYW5jYW5lQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogRml4IGNvbGxlY3Rpb24gb2Ygc3RhdGlzdGljcworCSAgU3RhdHMgc2hvdWxkIGJlIGNvbGxlY3RlZCBvbiB0aGUgbWVkaWEgcnRwIHNvdXJjZSBub3QgaW4gdGhlCisJICBzZW5kZXIgb25lLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0OTY2OQorCisyMDE1LTA0LTIwIDEwOjA3OjMwICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oOgorCSAgbXVsdGlmaWxlc2luazogQWRkIGEgbmV3IG1heC1kdXJhdGlvbiBmaWxlIHN3aXRjaGluZyBtb2RlCisJICBUaGlzIG5ldyBtb2RlIGVuc3VyZXMgdGhhdCBmaWxlcyB3aWxsIG5ldmVyIGV4Y2VlZCBhIGNlcnRhaW4gZHVyYXRpb24KKwkgIGJhc2VkIG9uIGluY29taW5nIGJ1ZmZlciBQVFMgKGFuZCBkdXJhdGlvbiBpZiBwcmVzZW50KQorCSAgTm90ZToKKwkgICogWW91IG5lZWQgdGltZXN0YW1wZWQgYnVmZmVycyAoZHVoKS4gSWYgc29tZSBvZiB0aGUgaW5jb21pbmcgYnVmZmVycyBkb24ndAorCSAgaGF2ZSBQVFMsIHRoZW4gaXQgd2lsbCBqdXN0IGFjY2VwdCB0aGVtIGluIHRoZSBjdXJyZW50IGZpbGUKKworMjAxNS0wNC0xNyAxNjoxODozMiArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICBtdWx0aWZpbGVzaW5rOiBzdHJlYW1saW5lIHRoZSBmaWxlLXN3aXRjaCBjb2RlIGEgYml0CisJICBVc2UgdGhlIHNhbWUgZnVuY3Rpb25zIHJlZ2FyZGxlc3Mgb2YgdGhlIG1vZGUgd2UgYXJlIHVzaW5nCisKKzIwMTUtMDQtMDIgMTM6MzU6MTggKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmg6CisJICBtdWx0aWZpbGVzaW5rOiBhZGQgImFnZ3JlZ2F0ZS1nb3BzIiBwcm9wZXJ0eSB0byBwcm9jZXNzIEdPUHMgYXMgYSB3aG9sZQorCSAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIG5leHQtZmlsZT1tYXgtc2l6ZQorCSAgKGFuZCBwZXJoYXBzIGEgZnV0dXJlIG5leHQtZmlsZT1tYXgtZHVyYXRpb24pIHRvIG1ha2Ugc3VyZSB0aGF0CisJICBlYWNoIGZpbGUgcGFydCBzdGFydHMgY2xlYW5seSB3aXRoIGEga2V5IGZyYW1lIGFuZCB0aGUgYXBwcm9wcmlhdGUgaGVhZGVycy4KKwkgIEluIG9yZGVyIGZvciB0aGlzIHByb3BlcnR5IHRvIHdvcmsgY29ycmVjdGx5LCB1cHN0cmVhbSBlbGVtZW50cyBzaG91bGQgbWFrZQorCSAgc3VyZSB0aGFuIGFueSBoZWFkZXJzIHRoYXQgbmVlZCB0byBiZSB3cml0dGVuIGluIGEgc3RhbmRhbG9uZSBmaWxlIGFyZToKKwkgIDEpIGluIHRoZSBzdHJlYW1oZWFkZXIgY2FwcyBmaWVsZAorCSAgMikgYW5kL29yIGluIHRoZSBzdHJlYW0gYXMgb25lIG9yIG1vcmUgYnVmZmVycyBtYXJrZWQgd2l0aCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSCisJICB0aGF0IGFyZSBqdXN0IGJlZm9yZSB0aGUga2V5ZnJhbWUgYnVmZmVyCisJICBUaGlzIGlzIHVzZWZ1bCBmb3IgTVBFRy1UUy9NUEVHLVBTIGZpbGUgc2VnbWVudGluZyBpbgorCSAgY29tYmluYXRpb24gd2l0aCBtcGVndHNtdXggb3IgbXBlZ3BzbXV4LgorCSAgT3JpZ2luYWwgcGF0Y2ggYnk6IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKzIwMTUtMDUtMjAgMTY6Mzc6MjIgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IFVzZSBzaW5nbGUtaW5jbHVkZSBoZWFkZXIgZm9yIHRoZSBSVFNQIGxpYnJhcnkKKworMjAxNC0xMC0yNCAyMzo0NzoyMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcDogZG9uJ3QgdXNlIHNvb24tdG8tYmUtZGVwcmVjYXRlZCBnX2NhbmNlbGxhYmxlX3Jlc2V0KCkKKwkgIEZyb20gdGhlIEFQSSBkb2N1bWVudGF0aW9uOiAiTm90ZSB0aGF0IGl0IGlzIGdlbmVyYWxseSBub3QKKwkgIGEgZ29vZCBpZGVhIHRvIHJldXNlIGFuIGV4aXN0aW5nIGNhbmNlbGxhYmxlIGZvciBtb3JlCisJICBvcGVyYXRpb25zIGFmdGVyIGl0IGhhcyBiZWVuIGNhbmNlbGxlZCBvbmNlLCBhcyB0aGlzCisJICBmdW5jdGlvbiBtaWdodCB0ZW1wdCB5b3UgdG8gZG8uIFRoZSByZWNvbW1lbmRlZCBwcmFjdGljZQorCSAgaXMgdG8gZHJvcCB0aGUgcmVmZXJlbmNlIHRvIGEgY2FuY2VsbGFibGUgYWZ0ZXIgY2FuY2VsbGluZworCSAgaXQsIGFuZCBsZXQgaXQgZGllIHdpdGggdGhlIG91dHN0YW5kaW5nIGFzeW5jIG9wZXJhdGlvbnMuCisJICBZb3Ugc2hvdWxkIGNyZWF0ZSBhIGZyZXNoIGNhbmNlbGxhYmxlIGZvciBmdXJ0aGVyIGFzeW5jCisJICBvcGVyYXRpb25zLiIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzkxMzIKKworMjAxNS0wNS0xOCAyMDoxMzowMSArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYzoKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICBSZXZlcnQgImRvYzogV29ya2Fyb3VuZCBndGtkb2MgaXNzdWUiCisJICBUaGlzIHJldmVydHMgY29tbWl0IDE3OTdjOGY4YjEyZDdmNGM3YTk0NDRjOTRmMzRmNGQwOGVjODU5NDUuCisJICBUaGlzIGlzIGZpeGVkIGJ5IHRoZSBndGstZG9jIDEuMjMgcmVsZWFzZS4KKwkgIDxwYXJhPiBjYW5ub3QgY29udGFpbiA8cmVmc2VjdDI+OgorCSAgaHR0cDovL3d3dy5kb2Nib29rLm9yZy90ZGcvZW4vaHRtbC9wYXJhLmh0bWwKKwkgIGh0dHA6Ly93d3cuZG9jYm9vay5vcmcvdGRnL2VuL2h0bWwvcmVmc2VjdDIuaHRtbAorCisyMDE1LTA1LTE4IDE2OjQwOjIxICswMjAwICBOaWNvbGEgTXVyaW5vIDxuaWNvbGEubXVyaW5vQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJICBydHBnNzI2cGF5OiBmaXggY2FwcyBsZWFrCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ5NTQ0CisKKzIwMTUtMDUtMTggMTY6MzQ6MTMgKzAyMDAgIE5pY29sYSBNdXJpbm8gPG5pY29sYS5tdXJpbm9AZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOgorCSAgcnRwZzcyNmRlcGF5OiBkb24ndCBsZWFrIGlucHV0IGJ1ZmZlcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0OTU0MworCisyMDE1LTA1LTE4IDE3OjM4OjMxICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cHNvdXJjZTogUXVldWUgYmFkIHBhY2tldHMgaW5zdGVhZCBvZiBkcm9wcGluZyB0aGVtCisJICBTbyB3ZSBjYW4gc2VuZCB0aGVtIG91dCBvbmNlIHdlIGZvdW5kIHRoZSBuZXh0LCBjb25zZWN1dGl2ZSBzZXF1ZW5jZSBudW1iZXIgaW4KKwkgIGNhc2Ugb25lIGlzIGZvbGxvd2luZy4KKworMjAxNS0wNS0xOCAxNzozODoxNCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzb3VyY2U6IFVzZSBnX3F1ZXVlX2ZvcmVhY2goKSB0byB1bnJlZiBhbGwgYnVmZmVycyBpbiBxdWV1ZXMKKworMjAxNS0wNS0xOCAxNzoxOTozMSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzb3VyY2U6IFJlZmFjdG9yIHNlcW51bSBjb21wYXJpc29uIGNvZGUgYSBiaXQKKworMjAxNS0wNS0xOCAxNzowODo1MyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzb3VyY2U6IEFsbG93IHNlcXVlbmNlIG51bWJlciB3cmFwYXJvdW5kIGR1cmluZyBwcm9iYXRpb24KKworMjAxNS0wNS0xOCAxNzowNzoyMyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzb3VyY2U6IE1ha2Ugc2VxdWVuY2UgbnVtYmVyIGNvbXBhcmlzb24gY29kZSBtb3JlIHJlYWRhYmxlCisJICAuLi4gYnkgdXNpbmcgZ3N0X3J0cF9idWZmZXJfY29tcGFyZV9zZXFudW0oKSBhbmQgc2lnbmVkIGludGVnZXJzCisJICBpbnN0ZWFkIG9mIGltcGxpY3RseSB1c2luZyBlZmZlY3RzIG9mIGludGVnZXIgb3Zlci91bmRlcmZsb3dzLgorCisyMDE1LTA0LTIyIDE4OjU0OjA2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogV2hlbiBkZXRlY3RpbmcgYSBodWdlIHNlcW51bSBnYXAsIHdhaXQgZm9yIDUgY29uc2VjdXRpdmUgcGFja2V0cyBiZWZvcmUgcmVzZXR0aW5nIGV2ZXJ5dGhpbmcKKwkgIEl0IG1pZ2h0IGp1c3QgYmUgYSBsYXRlIHJldHJhbnNtaXNzaW9uIG9yIHNwdXJpb3VzIHBhY2tldCBmcm9tIGVsc2V3aGVyZSwgYnV0CisJICByZXNldHRpbmcgZXZlcnl0aGluZyB3b3VsZCBtZWFuIHRoYXQgd2Ugd2lsbCBjYXVzZSBhIG5vdGljZWFibGUgaGlja3VwLiBMZXQncworCSAgZ2V0IHNvbWUgY29uZmlkZW5jZSBmaXJzdCB0aGF0IHRoZSBzZXF1ZW5jZSBudW1iZXJzIGNoYW5nZWQgZm9yIHdoYXRldmVyCisJICByZWFzb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3OTIyCisKKzIwMTUtMDUtMTYgMjM6Mzc6MDYgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5jOgorCSogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVybmJhbmRzLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIGRvYzogV29ya2Fyb3VuZCBndGtkb2MgaXNzdWUKKwkgIFdpdGggZ3RrZG9jIDEuMjIsIHRoZSBYTUwgZ2VuZXJhdG9yIGZhaWxzIHdoZW4gYSBpdGVtaXplZGxpc3QgaXMKKwkgIGZvbGxvd2VkIGJ5IGEgcmVmc2VjdDIuIFdvcmthcm91bmQgdGhlIGlzc3VlIGJ5IHdyYXBwaW5nIHRoZQorCSAgcmVmc2VjdDIgaW50byBwYXJhLgorCisyMDE1LTAxLTIzIDEzOjU3OjQwICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuYzoKKwkgIHF0ZGVtdXg6IGF2b2lkIHdyb25nIHdhcm5pbmdzIG9uIHVua25vd24gbm9kZSB0eXBlcworCSAgQWRkICduYW1lJyBhbmQgJ21lYW4nIGZvdXJjY3MsIGFzIHdlIGhhbmRsZSB0aGVtLiBSaWdodCBub3cgZWFjaCB1c2Ugd291bGQKKwkgIHRyaWdnZXIgYSB3YXJuaW5nLgorCisyMDE1LTA1LTA4IDE5OjEzOjAwICswMjAwICBOaWNvbGEgTXVyaW5vIDxuaWNvbGEubXVyaW5vQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNmRlcGF5Lmg6CisJICBydHBnNzI2ZGVwYXk6IGFkZCBibG9ja19hbGlnbiB0byBvdXRwdXQgY2FwcworCSAgSXQgaXMgbmVlZGVkIHRvIGNvcnJlY3RseSBuZWdvdGlhdGUgY2FwcyB3aXRoIG1hdHJvc2thbXV4CisJICBhbmQgbW9zdCBvdGhlciBtdXhlcnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ5MTI5CisKKzIwMTUtMDUtMTIgMTM6NDE6NTggKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJICBhdWRpb2Z4YmFzZWZpcmZpbHRlcjogRml4IHRpbWUtZG9tYWluIGNvbnZvbHV0aW9uIHdpdGggPjEgY2hhbm5lbHMKKwkgIGlucHV0X3NhbXBsZXMgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMsIGJ1dCB3ZSB1c2VkIGl0IGFzIHRoZSBudW1iZXIgb2YKKwkgIHNhbXBsZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3MjA0CisKKzIwMTUtMDUtMTIgMTI6MTM6MTYgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnB4L2dzdHZwOWVuYy5jOgorCSAgdnBbODldZW5jOiBQcm9wZXJseSBjb252ZXJ0IGJldHdlZW4gR1N0cmVhbWVyIGFuZCBlbmNvZGVyIHRpbWViYXNlCisJICAuLi4gYnkgc3dpdGNoaW5nIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3Igd2hlbiBzY2FsaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0OTEyMgorCisyMDE1LTA1LTExIDEzOjMzOjI2ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkgIHZwWzg5XWVuYzogRG9uJ3Qgc2V0IHRpbWViYXNlIGZyb20gdGhlIGZyYW1lcmF0ZQorCSAgVGhlIGZyYW1lcmF0ZSB2ZXJ5IG9mdGVuIGlzIGp1c3QgYW4gaW5kaWNhdGlvbiBvZiB0aGUgaWRlYWwgZnJhbWVyYXRlLCBub3QgdGhlCisJICBhY3R1YWwgZnJhbWVyYXRlIG9mIHRoZSBzdHJlYW0uIEJ5IGp1c3QgdXNpbmcgdGhlIGZyYW1lcmF0ZSwgd2UgY29uZnVzZSB0aGUKKwkgIHJhdGUgY29udHJvbCBhbGdvcml0aG0gYWxnb3JpdGhtIGFzIG11bHRpcGxlIGZyYW1lcyB3aWxsIG1hcCB0byB0aGUgc2FtZSBQVFMKKwkgIG9yIGhhdmUgZHVyYXRpb25zIG9mIDAuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ5MTIyCisKKzIwMTUtMDUtMTAgMTQ6MjE6MDQgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFja3BhcnNlLmM6CisJICB0ZXN0czogd2F2cGFja3BhcnNlOiBmaXggdW5pdCB0ZXN0CisJICBTZWUgYWxzbyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM4MjM3CisKKzIwMTUtMDUtMTAgMTE6MDU6MDAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmM6CisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZweC9nc3R2cDhlbmMuYzoKKwkqIGV4dC92cHgvZ3N0dnA5ZGVjLmM6CisJKiBleHQvdnB4L2dzdHZwOWVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDI0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDI0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3dhdmVuYy5jOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWFsc2FzcmMtUENNQS5jOgorCSAgZG9jczogdXBkYXRlIGV4YW1wbGUgcGlwZWxpbmVzIGluIGVsZW1lbnQgZG9jcworCSAgTW9zdGx5IGdzdC1sYXVuY2ggLT4gZ3N0LWxhdW5jaC0xLjAKKwkgIFVzZSBhdXRvdmlkZW9zaW5rL2F1dG9hdWRpb3NpbmsgbW9yZSBvZnRlbi4KKwkgIFNwcmlua2xlIHNvbWUgY29udmVydGVycyBoZXJlIGFuZCB0aGVyZS4KKworMjAxNS0wNS0wOSAxOTo0ODo1NSArMDIwMCAgUGlvdHIgRHLEhWcgPHBpb3RyZHJhZ0BnbWFpbC5jb20+CisKKwkqIHBvL1BPVEZJTEVTLmluOgorCSAgcG86IHVwZGF0ZSBQT1RGSUxFUy5pbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0OTE2MworCisyMDE1LTA1LTEwIDEwOjUyOjE4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c3JjLmM6CisJICBzcGxpdG11eHNyYzogbWlub3IgZXJyb3IgbWVzc2FnZSBjbGVhbi11cAorCSAgRG9uJ3QgcHV0IGZpbGVuYW1lIGluIGVycm9yIG1lc3NhZ2Ugc2hvd24gdG8gdXNlci4KKworMjAxNS0wNS0wNyAxNjoyNTozNiArMDIwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGZpeCBidWZmZXIgbGVhayB3aGVuIHN0b3JlZCB0byBzZWVrdGFibGUKKwkgIEZpeCBhIGxlYWsgd2l0aCB0aGUKKwkgIHZhbGlkYXRlLmZpbGUucGxheWJhY2suY2hhbmdlX3N0YXRlX2ludGVuc2l2ZS5zYW1wbGVzX211bHRpbWVkaWFfY3hfZmxhY19ZZXN0ZXJkYXlfZmxhYworCSAgc2NlbmFyaW8uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ5MDcyCisKKzIwMTUtMDUtMDcgMTc6MTA6MzcgKzA5MDAgIFBhdWwgSHl1bmlsIDxwYXVsLmh5dW5pbEBsZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBleGFtcGxlIHBpcGVsaW5lIGluIGRvY3MKKwkgIFRoZSBnc3QtbGF1bmNoIHNjcmlwdCBmb3IgZXhhbXBsZSBsYXVuY2ggbGluZSB0byB0ZXN0IHF0ZGVtdXggaXMKKwkgIG1pc3NpbmcgYSBxdWV1ZSBiZWZvcmUgdGhlIGRlY29kZWJpbnMsIG90aGVyd2lzZSB0aGUgZ3N0LWxhdW5jaC0xLjAKKwkgIGNvbW1hbmQgd29uJ3Qgd29yay4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDkwNTQKKworMjAxNS0wNS0wNyAxNDo1MTo0NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgUmV2ZXJ0ICJydHBzZXNzaW9uOiBBbHNvIHJlcG9ydCBpbnRlcm5hbCBzb3VyY2VzIGluIG9uLW5ldy1zc3JjIGFuZCBvbi1zc3JjLWFjdGl2ZSIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgZDIyZWM0OTYzMjhlNmJhOGVkYmYyZDA3MWQ1NjA4YjJhZjI4MzFlOC4KKwkgIEFwcGxpY2F0aW9uIGNvZGUgbWlnaHQgZXhwZWN0IHRoYXQgaXQgb25seSBnZXRzIGV4dGVybmFsIHNvdXJjZXMgb24gdGhvc2UKKwkgIHNpZ25hbHMsIGFuZCBnZXQgY29uZnVzZWQgYnkgdGhpcy4gSWYgYW55dGhpbmcgd2Ugd291bGQgbmVlZCB0byBhZGQgbmV3CisJICBzaWduYWxzLgorCisyMDE1LTAzLTI1IDE1OjI3OjM0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBBbHNvIHJlcG9ydCBpbnRlcm5hbCBzb3VyY2VzIGluIG9uLW5ldy1zc3JjIGFuZCBvbi1zc3JjLWFjdGl2ZQorCSAgV2l0aG91dCB0aGlzIGl0IHNlZW1zIGltcG9zc2libGUgZm9yIGFuIGFwcGxpY2F0aW9uIHRvIGVhc2lseSBnZXQgbm90aWZpZWQKKwkgIGFib3V0IHRoZSBpbnRlcm5hbCBzc3JjcyB0aGF0IGFyZSBjcmVhdGVkLCBlLmcuIHNlbmRlciBzb3VyY2VzLCBhbmQgYWxzbworCSAgdG8ga25vdyB3aGVuIHRoZXkgYXJlIGFjdGl2ZSBhbmQgcHJvZHVjZSBSVENQIHBhY2tldHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ2NzQ3CisKKzIwMTUtMDUtMDQgMTk6MjY6MTQgKzAyMDAgIEd1aWxsYXVtZSBEZXNtb3R0ZXMgPGd1aWxsYXVtZS5kZXNtb3R0ZXNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBmaXggZnJhbWUgbGVha3MgaW4gaGFuZGxlX2ZyYW1lKCkgaW1wbGVtZW50YXRpb24KKwkgIGhhbmRsZV9mcmFtZSgpIGlzIHN1cHBvc2VkIHRvIGNvbnN1bWUgQGZyYW1lLCBzbyBpZiB3ZSBkb24ndCBjYWxsCisJICBnc3RfdmlkZW9fZGVjb2Rlcl9kcm9wX2ZyYW1lKCkgb3IgZ3N0X3ZpZGVvX2RlY29kZXJfZmluaXNoX2ZyYW1lKCkgd2UgaGF2ZSB0bworCSAgcmVsZWFzZSBpdCBtYW51YWxseS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDg5MDkKKworMjAxNS0wNS0wNCAxNjo1MDozOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogRml4IHVwIGxhc3QgY29tbWl0CisKKzIwMTUtMDUtMDQgMTY6NDY6MDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IE9ubHkgZG8gUlRYIHdoZW4gdXNpbmcgYSBmZWVkYmFjayBwcm9maWxlCisKKzIwMTUtMDUtMDQgMTM6NTA6MzEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IFRoZSBzdGF0cyBtaW5faW50ZXJ2YWwgaXMgaW4gc2Vjb25kcywgbm90IG5hbm9zZWNvbmRzCisJICBXZSBoYXZlIHRvIHNjYWxlIGl0IHRvIGNvbXBhcmUgaXQgYWdhaW5zdCBvdXIgY2xvY2sgdGltZXMuCisKKzIwMTUtMDUtMDQgMTE6Mzg6MjcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IE9ubHkgcmV0dXJuIFRSVUUgaWYgZWFybHkgZmVlZGJhY2sgd2FzIHJlcXVlc3RlZCBhbHJlYWR5IGFuZCBpdCdzIGVhcmx5IGVub3VnaAorCisyMDE1LTA0LTMwIDE1OjQyOjM0ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkgIG1hdHJvc2thOiByZW1vdmUgdW51c2VkIHByb3BlcnR5IGVudW0gaXRlbXMKKworMjAxNS0wNC0zMCAxMjoxMzo1OSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggYnVmZmVyIGxlYWsgb24gZW9zIGluIHB1c2ggbW9kZQorCSAgQmFzZWQgb24gcGF0Y2ggYnkgR3VpbGxhdW1lIERlc21vdHRlcy4KKwkgIHNjZW5hcmlvOiB2YWxpZGF0ZS5odHRwLnBsYXliYWNrLnNlZWtfd2l0aF9zdG9wLnJhd19oMjY0XzFfbXA0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ4NjE3CisKKzIwMTUtMDQtMjkgMTk6NDE6MjkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQ2hlY2sgZm9yIHNpemVzIG9mIHRoZSByZHJmIChyZWRpcmVjdCkgYXRvbSBiZWZvcmUgYWNjZXNzaW5nIHRoZSBkYXRhIGFuZCB1c2UgZ19zdHJuZHVwKCkgaW5zdGVhZCBvZiBnX3N0cmR1cCgpCisJICBUaGFua3MgdG8gUmFscGggR2lsZXMgZm9yIHJlcG9ydGluZyB0aGlzLgorCisyMDE1LTA0LTI5IDE1OjUyOjI3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBPbmx5IGVuYWJsZSByZXRyYW5zbWlzc2lvbnMgaWYgdGhlcmUgaXMgcmV0cmFuc21pc3Npb24gaW5mbyBpbiB0aGUgU0RQCisJICBPdGhlcndpc2Ugd2UncmUgZ29pbmcgdG8gc2VuZCBlYXJseSBSVENQIGFuZCBOQUNLcyBpbiBub24tZmVlZGJhY2sgc2Vzc2lvbnMKKwkgIHRvbywgd2hpY2ggd2lsbCBjb25mdXNlIHNlcnZlcnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ4NjI3CisKKzIwMTUtMDItMTEgMTg6MDk6MjQgKzA1MzAgIFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSAgZHZkZW11eDogZXh0cmFjdCByZWNvcmRpbmcgdGltZQorCSAgRXh0cmFjdHMgdGhlIHJlY29yZGVkIHRpbWUgb2YgdGhlIGR2IGZpbGUgZnJvbQorCSAgdGhlIG1ldGFkYXRhIGFuZCBwdXRzIGl0IGludG8gdGhlIGdsb2JhbCB0YWdzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MzY1NworCisyMDE1LTA0LTI4IDE1OjU5OjI1ICswMjAwICBHdWlsbGF1bWUgRGVzbW90dGVzIDxndWlsbGF1bWUuZGVzbW90dGVzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBmaXggc2VlayBldmVudCBsZWFrCisJICBnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NlZWtfZXZlbnQoKSBkb2Vzbid0IGNvbnN1bWUgdGhlCisJICBldmVudCBzbyB3ZSBoYXZlIHRvIHVucmVmIGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0ODU4NAorCisyMDE1LTA0LTI4IDE1OjQyOjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thLWRlbXV4OiBTZW5kIHBlbmRpbmcgdGFncyB3aGVuIGFkZGluZyBhIG5ldyBwYWQKKwkgIFdlIG1pZ2h0J3ZlIHBhcnNlZCB0aG9zZSB0YWdzIGJlZm9yZSBhbHJlYWR5IGFuZCB0cmllZCB0byBwdXNoIHRoZW0gdG8KKwkgIG5vbi1leGlzdGluZyBwYWRzIGJlZm9yZS4gTm93IGxldCdzIGRvIGl0IGZvciByZWFsLgorCisyMDE1LTA0LTIzIDE4OjU3OjM3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSAgcnRwc3RhdHM6IEF2ZXJhZ2UgUlRDUCBwYWNrZXQgc2l6ZSBpcyBpbiBieXRlcywgYmFuZHdpZHRocyBpbiBiaXRzCisJICBXZSBuZWVkIHRvIGNvbnZlcnQgdGhlIHNpemUgdG8gYml0cyBmb3Igb3VyIGNhbGN1bGF0aW9ucy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDc4NjMKKworMjAxNS0wNC0yMyAxODo1MzozOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuYzoKKwkgIHJ0cHN0YXRzOiBVc2UgdGhlIHNhbWUgbG93ZXIgbGltaXQgZm9yIFJUQ1AgYmFuZHdpZHRoIHRvIHN0b3Agc2VuZGluZyBSVENQIGV2ZXJ5d2hlcmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDc4NjMKKworMjAxNS0wNC0xNCAxODo0MTowNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogVXNlIGJhbmR3aWR0aCBjYWxjdWxhdGlvbiBieSBkZWZhdWx0IGluc3RlYWQgb2Ygc29tZSBhcmJpdHJhcnkgaGFyZGNvZGVkIHZhbHVlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3ODYzCisKKzIwMTUtMDQtMjMgMTg6NDk6MzcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IEJhbmR3aWR0aCBpcyBzdXBwb3NlZCB0byBiZSBpbiBiaXRzL3MsIG5vdCBieXRlcy9zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3ODYzCisKKzIwMTUtMDQtMjcgMTY6MzY6MjcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBGaXggUlRYIHVuaXQgdGVzdAorCSAgVGhlIGNhbGN1bGF0aW9ucyB3ZXJlIGEgYml0IG9mZiBldmVyeXdoZXJlLCBldmVuIGJlZm9yZSB0aGUgY2hhbmdlcyBkb25lCisJICByZWNlbnRseSB0byB0aGUgZGVsYXkgZm9yIFJUWCBvZiBleHBlY3RlZCBmdXR1cmUgcGFja2V0cy4gSXQgb25seSB3b3JrZWQgYnkKKwkgIGFjY2lkZW50LCBidXQgbm93IHRoZSBjYWxjdWxhdGlvbnMgYXJlIGFsbCBjb3JyZWN0IGFnYWluLiBIb3BlZnVsbHkuCisKKzIwMTUtMDQtMjcgMTE6MjI6MTEgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvZGVidWd1dGlscy9icmVha215ZGF0YS5jOgorCSogZ3N0L2RlYnVndXRpbHMvY3B1cmVwb3J0LmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZzZWVrLmM6CisJKiBnc3QvZGVidWd1dGlscy9wcm9ncmVzc3JlcG9ydC5jOgorCSogZ3N0L2RlYnVndXRpbHMvcm5kYnVmZmVyc2l6ZS5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJKiBnc3QvZmx2L2dzdGluZGV4LmM6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmM6CisJKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cnRweHF0ZGVwYXkuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW90ZW1wbGF0ZS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIFJlbmFtZSBwcm9wZXJ0eSBlbnVtcyBmcm9tIEFSR18gdG8gUFJPUF8KKwkgIFByb3BlcnR5IGVudW0gaXRlbXMgc2hvdWxkIGJlIG5hbWVkIFBST1BfIGZvciBjb25zaXN0ZW5jeSBhbmQgcmVhZGFiaWxpdHkuCisKKzIwMTUtMDQtMjUgMDI6NDk6NTggKzAzMDAgIElseWEgS29uc3RhbnRpbm92IDxpbHlhLmtvbnN0YW50aW5vdkBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBGaXggInN0YXRzIiBwcm9wZXJ0eSBkb2NzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ4NDM2CisKKzIwMTUtMDQtMjYgMTc6NTQ6NTIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIEFuZHJvaWQubWs6CisJKiBnc3QvYWxwaGEvTWFrZWZpbGUuYW06CisJKiBnc3QvYXBldGFnL01ha2VmaWxlLmFtOgorCSogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVwYXJzZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdXRvZGV0ZWN0L01ha2VmaWxlLmFtOgorCSogZ3N0L2F2aS9NYWtlZmlsZS5hbToKKwkqIGdzdC9jdXR0ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVidWd1dGlscy9NYWtlZmlsZS5hbToKKwkqIGdzdC9kZWludGVybGFjZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9kdG1mL01ha2VmaWxlLmFtOgorCSogZ3N0L2VmZmVjdHYvTWFrZWZpbGUuYW06CisJKiBnc3QvZXF1YWxpemVyL01ha2VmaWxlLmFtOgorCSogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkqIGdzdC9mbHgvTWFrZWZpbGUuYW06CisJKiBnc3QvZ29vbS9NYWtlZmlsZS5hbToKKwkqIGdzdC9nb29tMmsxL01ha2VmaWxlLmFtOgorCSogZ3N0L2ljeWRlbXV4L01ha2VmaWxlLmFtOgorCSogZ3N0L2lkM2RlbXV4L01ha2VmaWxlLmFtOgorCSogZ3N0L2ltYWdlZnJlZXplL01ha2VmaWxlLmFtOgorCSogZ3N0L2ludGVybGVhdmUvTWFrZWZpbGUuYW06CisJKiBnc3QvaXNvbXA0L01ha2VmaWxlLmFtOgorCSogZ3N0L2xhdy9NYWtlZmlsZS5hbToKKwkqIGdzdC9sZXZlbC9NYWtlZmlsZS5hbToKKwkqIGdzdC9tYXRyb3NrYS9NYWtlZmlsZS5hbToKKwkqIGdzdC9tb25vc2NvcGUvTWFrZWZpbGUuYW06CisJKiBnc3QvbXVsdGlmaWxlL01ha2VmaWxlLmFtOgorCSogZ3N0L211bHRpcGFydC9NYWtlZmlsZS5hbToKKwkqIGdzdC9yZXBsYXlnYWluL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0c3AvTWFrZWZpbGUuYW06CisJKiBnc3Qvc2hhcGV3aXBlL01ha2VmaWxlLmFtOgorCSogZ3N0L3NtcHRlL01ha2VmaWxlLmFtOgorCSogZ3N0L3NwZWN0cnVtL01ha2VmaWxlLmFtOgorCSogZ3N0L3VkcC9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2JveC9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2Nyb3AvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9taXhlci9NYWtlZmlsZS5hbToKKwkqIGdzdC93YXZlbmMvTWFrZWZpbGUuYW06CisJKiBnc3Qvd2F2cGFyc2UvTWFrZWZpbGUuYW06CisJKiBnc3QveTRtL01ha2VmaWxlLmFtOgorCSAgUmVtb3ZlIG9ic29sZXRlIEFuZHJvaWQgYnVpbGQgY3J1ZnQKKwkgIFRoaXMgaXMgbm90IG5lZWRlZCBhbnkgbG9uZ2VyLgorCisyMDE1LTA0LTI0IDEzOjU1OjA4IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJICB2aWRlb2Nyb3A6IHByaW50IHRoZSBwcm9wZXJ0eSB2YWx1ZXMgd2hlbiBzZXQKKwkgIEluc3RlYWQgb2YgcHJpbnRpbmcgdGhlIGN1cnJlbnRseSB1c2VkIHZhbHVlcy4gVGhlIGxvZyBpcyBtZWFudAorCSAgdG8gc2hvdyB3aGF0IHRoZSBwcm9wZXJ0aWVzIGNoYW5nZWQgdG8sIG5vdCB3aGF0IGlzIGJlaW5nIGN1cnJlbnRseQorCSAgdXNlZC4KKworMjAxNS0wNC0yNCAxNzowMToxMCArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2thcmFva2UuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhxdWV1ZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHJlbW92ZSB1bnVzZWQgZW51bSBpdGVtcyBQUk9QX0xBU1QKKwkgIFRoaXMgd2VyZSBwcm9iYWJseSBhZGRlZCB0byB0aGUgZW51bXMgZHVlIHRvIGNhcmdvIGN1bHQgcHJvZ3JhbW1pbmcgYW5kIGFyZQorCSAgdW51c2VkLiBSZW1vdmluZyB0aGVtLgorCisyMDE1LTA0LTI0IDAwOjMwOjM1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIGxldmVsOiBmaXggaW5maW5pdGUgbG9vcCBmb3IgdmVyeSBsb3cgaW50ZXJ2YWwgdmFsdWVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1NTE1CisKKzIwMTUtMDQtMjMgMTY6MDg6NTQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgdGVzdHM6IGRlZmluZSBHU1RfQ0hFQ0tfVEVTVF9FTlZJUk9OTUVOVF9CRUFDT04KKwkgIE1ha2Ugc3VyZSB0aGUgdGVzdCBlbnZpcm9ubWVudCBpcyBzZXQgdXAuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy8vc2hvd19idWcuY2dpP2lkPTc0NzYyNAorCisyMDE1LTA0LTIzIDE2OjA4OjMyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IGJ1bXAgYXV0b21ha2UgcmVxdWlyZW1lbnQgdG8gMS4xNCBhbmQgYXV0b2NvbmYgdG8gMi42OQorCSAgVGhpcyBpcyBvbmx5IHJlcXVpcmVkIGZvciBidWlsZHMgZnJvbSBnaXQsIHBlb3BsZSBjYW4gc3RpbGwKKwkgIGJ1aWxkIHRhcmJhbGxzIGlmIHRoZXkgb25seSBoYXZlIG9sZGVyIGF1dG90b29scy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnLy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3NjI0CisKKzIwMTUtMDQtMjMgMTY6MDY6NTcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIC5naXRpZ25vcmU6CisJICBVcGRhdGUgLmdpdGlnbm9yZQorCisyMDE1LTA0LTIzIDA5OjU1OjU5ICswMjAwICBKZXNwZXIgTGFyc2VuIDxrbm9yci5qZXNwZXJAZ21haWwuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBGaXggUlRDUCBjYXBzIGxlYWsKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnLy9zaG93X2J1Zy5jZ2k/aWQ9NzQ4MzUzCisKKzIwMTUtMDQtMjIgMjA6MjQ6MjAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBXaGVuIHJlcXVlc3QgcmV0cmFuc21pc3Npb25zIGZvciBmdXR1cmUgcGFja2V0cywgY29uc2lkZXIgdGhlIHBhY2tldCBzcGFjaW5nIGluIHRoZSBleHRyYSBkZWxheQorCSAgV2Ugbm93IHRha2UgdGhlIG1heGltdW0gb2YgMipqaXR0ZXIgYW5kIDAuNSpwYWNrZXRfc3BhY2luZyBmb3IgdGhlIGV4dHJhCisJICBkZWxheS4gSWYgaml0dGVyIGlzIHZlcnkgbG93LCB0aGlzIHNob3VsZCBwcmV2ZW50IHVubmVjZXNzYXJ5IHJldHJhbnNtaXNzaW9uCisJICByZXF1ZXN0cyB0byBzb21lIGRlZ3JlZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDgwNDEKKworMjAxNS0wNC0yMiAxOTo0MTowNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IFRha2UgYSBydW5uaW5nIGF2ZXJhZ2Ugb2YgdGhlIHBhY2tldCBzcGFjaW5ncyBpbnN0ZWFkIG9mIGp1c3QgdGhlIGxhdGVzdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0ODA0MQorCisyMDE1LTA0LTEzIDExOjIwOjQwICswMjAwICBNaWd1ZWwgUGFyw61zIETDrWF6IDxtcGFyaXNkaWF6QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IEFkZCAicnR4LW5leHQtc2VxbnVtIiBwcm9wZXJ0eQorCSAgSWYgdGhpcyBpcyBzZXQgdG8gRkFMU0UsIHJ0cGppdHRlcmJ1ZmZlciB3aWxsIG5vdCByZXF1ZXN0IHJldHJhbnNtaXNzaW9ucyBmb3IKKwkgIGZ1dHVyZSBwYWNrZXRzIGJhc2VkIG9uIHdoZW4gdGhleSBhcmUgZXN0aW1hdGVkIHRvIGFycml2ZS4KKwkgIFNlZSBhbHNvIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDgwNDEKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk4NjgKKworMjAxNS0wNC0yMiAxOToyOTozNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5jOgorCSAgcnR4cmVjZWl2ZTogUHV0IGRlYnVnIG91dHB1dCBmb3IgcmV0cmFuc21pc3Npb24gcmVxdWVzdHMgYXQgdGhlIHJpZ2h0IHBsYWNlCisJICBCZWZvcmUgaXQgd2FzIG9ubHkgZXZlciBwcmludGVkIG9uY2UgZm9yIGV2ZXJ5IHRpbWUgYSBzc3JjIHdhcyBhc3NvY2lhdGVkIHdpdGgKKwkgIGEgc3BlY2lmaWMgc3RyZWFtLgorCisyMDE1LTA0LTIyIDE4OjA1OjI0ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogZG9uJ3QgYWRkIHRoZSBzYW1lIGludGVybGFjZSBtb2RlIHR3aWNlCisJICBTb21lIGRyaXZlcnMgbW9kaWZ5IHRoZSBpbnRlcmxhY2UgbW9kZSB0byBwcm9ncmVzc2l2ZSwgbm8gbWF0dGVyIHdoYXQKKwkgIGlucHV0IHlvdSBnaXZlIHRoZW0sIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGFkZCB0aGUgc2FtZSBpbnRlcmxhY2UgbW9kZQorCSAgdHdpY2UuCisKKzIwMTUtMDQtMjEgMTY6MzQ6MjEgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJICBlcXVhbGl6ZXI6IGZpeCBkeW5hbWljIGNoYW5nZXMgb24gYmFuZHMKKwkgIFdoZW4gd2UgYXJlIGluIHBhc3N0aHJvdWdoLCB0aGUgdHJhbnNmb3JtIGZ1bmN0aW9uIGRvZXNuJ3QgcnVuIGFuZCBpZiB0aGUKKwkgIHBhc3N0aHJvdWdoIGNoZWNrIGlzIGluIHRoaXMgZnVuY3Rpb24gaXQgd2lsbCBuZXZlciBiZSBkZWFjdGl2YXRlZC4gRml4IHRoaXMgYnkKKwkgIGNoZWNraW5nIGRpcmVjdGx5IHdoZW5ldmVyIGEgZ2FpbiBpcyBjaGFuZ2VkLgorCSAgQWxzbyBzZXQgdGhlIHBhc3N0aHJvdWdoIHRvIFRSVUUgYXQgaW5pdCBiZWNhdXNlIHRoZSBnYWlucyBkZWZhdWx0IHRvIDAsIHNvIHdlCisJICBjYW4gcGFzc3Rocm91Z2ggdW50aWwgYW55IGdhaW4gcHJvcGVydHkgaXMgY2hhbmdlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDgwNjgKKworMjAxNS0wNC0yMiAxMDozMDo1MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogSU5TVEFMTDoKKwkgIFJlbW92ZSBJTlNUQUxMIGZpbGUKKwkgIGF1dG90b29scyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIHRoaXMsIGFuZCB3aGVuIHVzaW5nIGRpZmZlcmVudCB2ZXJzaW9ucworCSAgZm9yIGF1dG9nZW4uc2ggdGhlcmUgd2lsbCBhbHdheXMgYmUgY2hhbmdlcyB0byBhIGZpbGUgdHJhY2tlZCBieSBnaXQuCisKKzIwMTUtMDQtMjIgMTA6MzA6MTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIExJQ0VOU0VfcmVhZG1lOgorCSAgUmVtb3ZlIExJQ0VOU0VfcmVhZG1lCisJICBJdCdzIGNvbXBsZXRlbHkgb3V0ZGF0ZWQgYW5kIGp1c3QgY29uZnVzaW5nLCBiZXR0ZXIgaWYgcGVvcGxlIGFyZQorCSAgZm9yY2VkIHRvIGxvb2sgYXQgdGhlIGFjdHVhbCBjb2RlIGluIHF1ZXN0aW9uIHRoYW4gdHJ1c3RpbmcgdGhpcyBmaWxlLgorCisyMDE1LTA0LTIxIDE1OjIxOjMzICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBjYXN0IHVudXNlZCByZXR1cm4gdG8gdm9pZAorCSAgUXVlbGwgdW5jaGVja2VkIHJldHVybiB2YWx1ZSBkZWZlY3QgYnkgY2FzdGluZyB0aGUgcmV0dXJuIHZhbHVlIHRvIHZvaWQgYW5kCisJICBtYWtpbmcgaXQgZXhwbGljaXQgaXQgaXMgZ29pbmcgdG8gYmUgaWdub3JlZC4KKwkgIENJRCAjMjA2MDMxCisKKzIwMTUtMDQtMTcgMTM6MDg6MDIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDhkZWMuYzoKKwkgIHZwOGRlYzogb3B0aW1pemUgdnB4IGltYWdlIHRvIGdzdGJ1ZmZlciBjb3B5IHdoZW4gc3RyaWRlcyBtYXRjaAorCSAgU29sdmluZyB0aGlzIEZJWE1FLiBDb3B5IHRoZSBmdWxsIHBsYW5lIHdoZW4gc3RyaWRlcyBhcmUgdGhlIHNhbWUKKworMjAxNS0wNC0xNiAxNToxMTowNSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOWRlYy5jOgorCSAgdnA5ZGVjOiBvcHRpbWl6ZSB2cHggaW1hZ2UgdG8gZ3N0YnVmZmVyIGNvcHkgd2hlbiBzdHJpZGVzIG1hdGNoCisJICBTb2x2aW5nIHRoaXMgRklYTUUuIENvcHkgdGhlIGZ1bGwgcGxhbmUgd2hlbiBzdHJpZGVzIGFyZSB0aGUgc2FtZQorCisyMDE1LTA0LTE3IDEzOjMyOjU0ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IGZpeCBtZW1vcnkgbGVhaworCisyMDE1LTA0LTE3IDA2OjUxOjQ2ICswMDAwICBBbGV4IE8nS29uc2tpIDxhbGV4YW5kZXJva29uc2tpQGdtYWlsLmNvbT4KKworCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJICBpY3lkZW11eDogRml4IHNlZ2ZhdWx0IGlmIG1ldGFkYXRhLWludGVydmFsIGlzIDAKKwkgIFByZXZlbnRzIGFuIGV4dHJhIHVucmVmIG9mIEdzdEJ1ZmZlciB3aGVuIHBhc3NpbmcgYSBub24taWN5IHN0cmVhbSB0aHJvdWdoCisJICBpY3lkZW11eCB3aXRoIG1ldGFkYXRhLWludGVydmFsIHNldCB0byAwLgorCSAgUmVwcm9kdWNpYmxlIHdpdGg6CisJICBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPX4vdGVzdHNvbmcubXAzICEgXAorCSAgJ2FwcGxpY2F0aW9uL3gtaWN5LG1ldGFkYXRhLWludGVydmFsPShpbnQpMCcgISBpY3lkZW11eCAhIGRlY29kZWJpbiAhIHdhdmVuYyAhIFwKKwkgIGZpbGVzaW5rIGxvY2F0aW9uPX4vdGVzdHNvbmcud2F2CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ4MDI0CisKKzIwMTUtMDQtMTcgMTE6NTQ6MjMgKzA1MzAgIFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5jOgorCSAgYXVkaW9meDogZml4IHR5cG8gaW4gZXhhbXBsZSBwaXBlbGluZXMKKwkgIEZpeCB0eXBvIGluIGV4YW1wbGUgcGlwZWxpbmVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ4MDIyCisKKzIwMTUtMDQtMTUgMTg6MjI6MzcgKzAzMDAgIElseWEgS29uc3RhbnRpbm92IDxpbHlhLmtvbnN0YW50aW5vdkBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9oYWwuYzoKKwkgIG9zeGF1ZGlvOiBmaXggc3BlbGxpbmcgaW4gZGVidWcgbWVzc2FnZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvL3Nob3dfYnVnLmNnaT9pZD03NDc5MzYKKworMjAxNS0wNC0xNiAxNjozMzo0NCArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogdGVzdHMvZXhhbXBsZXMvZXF1YWxpemVyL2RlbW8uYzoKKwkgIHRlc3RzOiBzZWxlY3RhYmxlIGFtb3VudCBvZiBiYW5kcyBpbiBlcXVhbGl6ZXIgZGVtbworCSAgQWRkaW5nIGFuIG9wdGlvbiBpbiB0aGUgZXF1YWxpemVyIGRlbW8gdG8gbWFrZSB0aGUgbnVtYmVyIG9mIGJhbmRzIHNlbGVjdGFibGUuCisKKzIwMTUtMDQtMTYgMTU6MzE6MjUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHNlbmQuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291cmNlL3J0cHJ0eHNlbmQ6IEFsc28gcGFzcyBjb3JyZWN0IHNlcW51bS1vZmZzZXQgYW5kIHBheWxvYWQgdG8gdGhlIFJUWCBydHBzb3VyY2UKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDczOTQKKworMjAxNS0wNC0wNiAxMjo1Njo1MCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHNlbmQuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IFRyYWNrIFJUWCBzc3JjIGNhcHMKKwkgIFRoaXMgaXMgbmVlZGVkIHNvIHRoYXQgd2UgY2FuIGdlbmVyYXRlIFNSIGZvciBSVFggc3RyZWFtIGNvcnJlY3RseSAodGhlCisJICBjbG9jayByYXRlIGlzIHJlcXVpcmVkKS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDczOTQKKworMjAxNS0wNC0xNCAxMzo1NjozOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSAgcnRwcnR4c2VuZDogQ29weSBvdmVyIHRpbWVzdGFtcHMgZnJvbSB0aGUgb3JpZ25hbCBidWZmZXJzIHRvIHRoZSBSVFggYnVmZmVycworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NzM5NAorCisyMDE1LTA0LTE2IDE2OjAxOjUwICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSAgdGVzdHM6IHN3aXRjaCBlcXVhbGl6ZXIgZGVtbyB0byBwbGF5IGZyb20gdXJpCisJICBTd2l0Y2ggdGhlIGVxdWFsaXplci1uYmFuZHMgZGVtbyB0byB1c2UgdXJpZGVjb2RlYmluLCBzbyB1c2VycyBjYW4gbGlzdGVuIHRvCisJICBzb21ldGhpbmcgbW9yZSBwbGVhc2FudCB0aGFuIHdoaXRlIG5vaXNlLiBJZiBhbnlib2R5IG1pc3NlcyB0aGUgd2hpdGUgbm9pc2UKKwkgIGEgdXJpIGhhbmRsZXIgdG8gYXVkaW90ZXN0c3JjIGNhbiBiZSB1c2VkLgorCisyMDE1LTA0LTE2IDExOjE3OjM4ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSAgdGVzdHM6IGltcHJvdmUgcmVhZGFiaWxpdHkgb2YgZXF1YWxpemVyIGRlbW8KKwkgIFJlbmFtZSB2YXJpYWJsZSBuYW1lIHRvIG1ha2UgaXQgbW9yZSByZWFkYWJsZSwgYWRkIGNvbW1lbnRzIGZvciB0aGUgdGhyZWUKKwkgIHNjYWxlcyBjcmVhdGVkIHBlciBibG9jaywgYW5kIHNldCB0aGUgd2luZG93IHRpdGxlLgorCisyMDE1LTA0LTE1IDE3OjMyOjM3ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSAgdGVzdHM6IGFkZCBtaXNzaW5nIGxpY2Vuc2UgaGVhZGVyIGZvciBlcXVhbGl6ZXIgZGVtbworCisyMDE1LTA0LTE2IDEzOjA5OjE5ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggdGFnIGxpc3QgbGVha3Mgb24gZXJyb3IgcGF0aHMKKworMjAxNS0wNC0xNiAxMjoyMzozOCArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IHRhZyBsaXN0IGxlYWsgb24gdW5rbm93biBzdHJlYW0gdHlwZQorCisyMDE1LTA0LTA5IDEzOjE5OjQ5ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZ3N0LXBsdWdpbnMtZ29vZC5zdXBwOgorCSAgc3VwcHJlc3Npb25zOiBpZ25vcmUgYW4gYXBwYXJlbnQgYnVnIGluIHN0cnRvZAorCSAgQSBidWZmZXIgb3ZlcnJlYWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3NTU0CisKKzIwMTUtMDQtMTUgMTE6MDc6MjcgKzAyMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IGRvIG5vdCBhY2Nlc3MgcHJvcGVydHkgdmFyaWFibGUgd2l0aG91dCB0aGUgb2JqZWN0IGxvY2ssIHVzZSB0aGUgbG9jYWwgc3RhY2sgY29weSBpbnN0ZWFkCisKKzIwMTUtMDQtMTQgMTg6NDU6NDQgKzAyMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IGFkZCBwcm9iZSBvbiB0aGUgbXVsdGlxdWV1ZSdzIHNpbmsgcGFkIGluc3RlYWQgb2YgdGhlIGdob3N0IHBhZAorCSAgYmVjYXVzZSBfcmVsZWFzZV9wYWQgdHJpZXMgdG8gcmVsZWFzZSBpdCBmcm9tIGN0eC0+c2lua3BhZCwgd2hpY2ggaXMKKwkgIG11bHRpcXVldWUncyBzaW5rIHBhZCwgYW5kIGN1cnJlbnRseSBmYWlscyBiZWNhdXNlIHRoZSBwcm9iZSBpcyBub3QKKwkgIGluc3RhbGxlZCB0aGVyZQorCisyMDE1LTA0LTE0IDE5OjA4OjI0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJICBydHBydHgqOiBGaXggdHlwb3MKKworMjAxNS0wNC0xNCAxNzoyNDo0NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogTm90IHNlbmRpbmcgZWFybHkgUlRDUCBub3cgYmVjYXVzZSBvZiBkaXRoZXJpbmcgbWVhbnMgd2Ugc2VuZCBpdCB3aXRoIHRoZSBuZXh0IGNvbXBvdW5kIHBhY2tldAorCisyMDE1LTA0LTE0IDE2OjI3OjE4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBJbXByb3ZlIGRlYnVnIG91dHB1dCBhIGJpdCBpZiB3ZSBjYW4ndCBhbGxvdyBlYXJseSBmZWVkYmFjaworCisyMDE1LTA0LTA3IDE4OjAwOjUzIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOGRlcGF5LmM6CisJICBydHB2cDhkZXBheTogV2hlbiBkcm9wcGluZyBpbnRyYSBwYWNrZXQsIHJlcXVlc3Qga2V5ZnJhbWUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDcyMDgKKworMjAxNS0wNC0xMyAyMDoyNTowMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IENoYW5nZSByZXN5bmNpbmcgR1NUX1dBUk5JTkcgdG8gR1NUX0lORk8KKwkgIFRoaXMgYWxzbyBoYXBwZW5zIGluIHRoZSB2ZXJ5IGJlZ2lubmluZyB3aGVuIHdlIHJlY2VpdmUgdGhlIGZpcnN0IHBhY2tldCwgYQorCSAgd2FybmluZyB3b3VsZCBiZSB2ZXJ5IGNvbmZ1c2luZyBoZXJlLiBJbiBhbGwgcGxhY2VzIHdoZXJlIHdlIHNob3VsZCB3YXJuIGFib3V0CisJICB0aGlzLCB3ZSB3b3VsZCd2ZSBwcmludGVkIGEgd2FybmluZyBhbHJlYWR5IGJlZm9yZS4KKworMjAxNS0wNC0wMiAxMzoyNjo0MSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICBtdWx0aWZpbGVzaW5rOiBtaW5vciBkb2NzIGltcHJvdmVtZW50CisKKzIwMTQtMTEtMDYgMTI6MDg6MDMgKzAxMDAgIE1pZ3VlbCBQYXLDrXMgRMOtYXogPG1wYXJpc2RpYXpAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogQWRkICJydHgtbWF4LXJldHJpZXMiIHByb3BlcnR5CisJICBUaGlzIHByb3BlcnR5IGFsbG93cyB0byBsaW1pdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmFuc21pc3Npb24KKwkgIGZvciBhIHNwZWNpZmljIHBhY2tldC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk4NjgKKworMjAxNC0xMS0wNCAxNTowMDo1MiArMDEwMCAgTWlndWVsIFBhcsOtcyBEw61heiA8bXBhcmlzZGlhekBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBGaXggZXhwZWN0ZWRfZHRzIGNhbGMgaW4gY2FsY3VsYXRlX2V4cGVjdGVkCisJICBSaWdodCBhYm92ZSB3ZSBjb25zaWRlciBsb3N0X3BhY2tldCBwYWNrZXRzLCBlYWNoIG9mIHRoZW0gaGF2aW5nIGR1cmF0aW9uLAorCSAgYXMgbG9zdCBhbmQgdHJpZ2dlcmVkIHRoZWlyIHRpbWVycyBpbW1lZGlhdGVseS4gQmVsb3cgd2UgdXNlIGV4cGVjdGVkX2R0cworCSAgdG8gc2NoZWR1bGUgcmV0cmFuc21pc3Npb24gb3Igc2NoZWR1bGUgbG9zdCB0aW1lcnMgZm9yIHRoZSBwYWNrZXRzIHRoYXQKKwkgIGNvbWUgYWZ0ZXIgZXhwZWN0ZWRfZHRzLgorCSAgQXMgd2UganVzdCB0cmlnZ2VyZWQgbG9zdF9wYWNrZXRzIHBhY2tldHMgYXMgbG9zdCwgdGhlcmUncyBubyBwb2ludCBpbgorCSAgc2NoZWR1bGluZyBuZXcgdGltZXJzIGZvciB0aGVtIGFuZCB3ZSBjYW4ganVzdCBza2lwIG92ZXIgYWxsIGxvc3QgcGFja2V0cy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk4NjgKKworMjAxNS0wMy0yMCAxODoyMTo1NyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IE1ha2UgdGhlIG5leHQgb3V0cHV0IGJ1ZmZlciBkaXNjb250IGFmdGVyIHJlc2V0dGluZyB0aGUgaml0dGVyYnVmZmVyCisJICBSZXNldHRpbmcgdGhlIGppdHRlcmJ1ZmZlciBkcm9wcyBhbGwgcGFja2V0cyBhbmQgb3RoZXIgdGhpbmdzLCBhbmQgd2lsbCBjYXVzZQorCSAgYSBkaXNjb250aW51aXR5IGluIHRoZSBwYWNrZXRzIHJlY2VpdmVkIGJ5IHRoZSBkZXBheWxvYWRlcnMuIFRoZXkgc2hvdWxkIG5vdworCSAgYWxzbyBmbHVzaCBhbnl0aGluZyB0aGV5IGhhZCBwZW5kaW5nIGFzIHRoZSBuZXcgZGF0YSB3aWxsIHN0YXJ0IGF0IGEgZGlmZmVyZW50CisJICBwb3NpdGlvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk4NjgKKworMjAxNS0wNC0xMCAwOToxNzoyNiArMDkwMCAgSHl1bmp1biBLbyA8enpvb24ua29Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogVXBkYXRlIHNlZ21lbnQuc3RhcnQgYWZ0ZXIga2V5LXVuaXQgc2VlaworCSAgV2hlbiBkb2luZyBrZXkgdWludCBzZWVrLCBxdGRlbXV4IGNhbGxzIGdzdF9xdGRlbXV4X2FkanVzdF9zZWVrCisJICB0byBnZXQgcHJvcGVyIG9mZnNldC4gQW5kIHRoZW4gdGhpcyBvZmZzZXQgaXMgc2V0IHRvCisJICBzZWdtZW50LnBvc2l0aW9uIGFuZCBzZWdtZW50LnRpbWUgaW4gZ3N0X3F0ZGVtdXhfcGVyZm9ybV9zZWVrIGJ1dAorCSAgc2VnbWVudC5zdGFydCBpcyBub3QgdXBkYXRlZC4KKwkgIEFmdGVyIHRoYXQsIGFwcGxpY2F0aW9uIHNlbmRzIHNlZ21lbnQgcXVlcnksCisJICBxdGRlbXV4IHNldHMgc3RhcnQgYW5kIHN0b3AgdG8gcXVlcnkgdXNpbmcgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUuIER1ZQorCSAgdG8gdGhlIHdyb25nIHZhbHVlIGluIHNlZ21lbnQuc3RhcnQsIHRoZSBzdG9wIHBvc2l0aW9uIGlzIHNtYWxsZXIgdGhhbgorCSAgaXQgc2hvdWxkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjgyMgorCisyMDE1LTA0LTA3IDE2OjEyOjQwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiByZW1vdmUgdXNlbGVzcyB2YXJpYWJsZSBkb19wdHMKKwkgIFdlIGFsd2F5cyB3cml0ZSB0aGUgQ1RUUyBpbiBxdG11eC4gSWRlYWxseSB3ZSBvbmx5IHdhbnQgdG8gZG8gdGhhdAorCSAgZm9yIHN0cmVhbXMgdGhhdCBuZWVkIERUUywgaXQgc2hvdWxkIGJlIHByZXNlbnQgb24gdGhlIHRyYWNrIGluZm9ybWF0aW9uCisJICByYXRoZXIgdGhhbiBiZSBkZWNpZGVkIGJhc2VkIG9uIGVhY2ggYnVmZmVyCisKKzIwMTUtMDQtMDcgMDA6NTM6MzUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHJlbW92ZSBzdWJ0cmFjdGlvbiB0aGF0IG1ha2VzIFBUUy9EVFMgc3RhcnQgZnJvbSAwCisJICBBcyBxdCB1c2VzIGR1cmF0aW9ucywgaXQgZG9lc24ndCBtYXR0ZXIsIG9ubHkgdGhlIGRpZmZlcmVuY2UKKwkgIGJldHdlZW4gY29uc2VjdXRpdmUgYnVmZmVycyBpcyBpbXBvcnRhbnQuIEFsc28sIGNvbGxlY3RwYWRzCisJICBhbHJlYWR5IHJlcGxhY2VzIFBUUy9EVFMgd2l0aCB0aGUgcnVubmluZyB0aW1lcyBmb3IgdGhlbS4KKworMjAxNS0wNC0wNiAyMjozNjo0MyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgdGVzdHM6IHF0bXV4OiBhZGQgdGVzdHMgdG8gdmVyaWZ5IGl0IGhhbmRsZXMgbm9uLTAgc2VnbWVudHMKKwkgIEJvdGggaW5wdXQgc3RyZWFtcyBpbiB0aGlzIHRlc3QgaGF2ZSBhIHNlZ21lbnQuc3RhcnQgPSAxMHMsIHNvCisJICBvdXRwdXQgc2hvdWxkIHN0YXJ0IGZyb20gMCBhbnl3YXkuCisJICBBbm90aGVyIHRlc3QgaGFzIGJvdGggc3RhcnRpbmcgYXQgbm9uLTAgc2VnbWVudHMsIGJ1dCB0aGUgcnVubmluZworCSAgdGltZSBvZiBib3RoIHN0cmVhbXMgc2hvdWxkIHN0aWxsIHN0YXJ0IGZyb20gMAorCisyMDE1LTA0LTA2IDIwOjAzOjE5IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6CisJICB0ZXN0czogcXRtdXg6IHNpbXBsZSBtdXhpbmcgdGVzdAorCSAgQWRkcyBhIG5ldyBzaW1wbGUgdGVzdCB0aGF0IHZlcmlmaWVzIHRoYXQgZGF0YSBpcyBwcm9wZXJseSBtdXhlZAorCSAgYW5kIHByZXNlcnZlZC4gIFBUUywgRFRTLCBkdXJhdGlvbiBhbmQgY2FwcyBhcmUgdmVyaWZpZWQuCisKKzIwMTUtMDQtMTAgMTA6NTk6MjYgKzA1MzAgIFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuaDoKKwkgIHNtcHRlOiByZW1vdmUgdW51c2VkIGZpZWxkcworCSAgUmVtb3ZlIHRoZSBmaWVsZHMgLSBmb3JtYXQgYW5kIGZwcyBmcm9tIHNtcHRlCisJICBhcyB0aGV5IGFyZSB1bnVzZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3NTk3CisKKzIwMTUtMDQtMTAgMTA6Mjk6NDcgKzA1MzAgIFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hbHBoYS5jOgorCSAgdGVzdHM6IGFkZCB0ZXN0IHN1aXRlIGZvciBhbHBoYQorCSAgQWRkZWQgdGVzdCBzdWl0ZSBmb3IgYWxwaGEgZWxlbWVudCB3aXRoIHRlc3QgY2FzZXMKKwkgIDEuIGFscGhhCisJICAyLiBjaHJvbWEga2V5aW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3NTk1CisKKzIwMTUtMDQtMDkgMTI6NTg6NDYgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9nc3QtcGx1Z2lucy1nb29kLnN1cHA6CisJICBzdXBwcmVzc2lvbnM6IGFkZCBhIHdlbGwga25vd24gemxpYiBpbmZsYXRlIGJ1ZworCisyMDE1LTA0LTA5IDEyOjU4OjI2ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkgIHNwbGl0bXV4c2luazogZml4IG11dGV4IGxlYWsKKworMjAxNS0wNC0wOSAxMjo1ODowNCArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jOgorCSAgdGVzdHM6IEZpeCBydHBydHggdGVzdCBieSBoYW5kbGluZyBidWZmZXIgbGlzdHMKKwkgIENvbW1pdCAjMTAxOGFhIG1hZGUgcnRwcnR4c2VuZCBoYW5kbGUgYnVmZmVyIGxpc3RzLCBicmVha2luZworCSAgdGhlIHRlc3Qgd2hpY2ggcHJvYmVzIGZvciBidWZmZXJzLCBidXQgbm90IGJ1ZmZlciBsaXN0cy4KKwkgIFVzZSBhIHV0aWxpdHkgZnVuY3Rpb24gdG8gcnVuIHRoZSBwcm9iZSBjYWxsYmFjayBvbiBlYWNoIGJ1ZmZlcgorCSAgaW4gdGhlIGxpc3QgaW4gdHVybiBhbmQgcmVtb3ZlIGFueSBidWZmZXJzIHRoYXQgYXJlIGRyb3BwZWQuCisKKzIwMTUtMDQtMDEgMTE6MTU6MzggKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4Lmg6CisJICBpc29tcDQ6IFJlZmFjdG9yIHZhcmlvdXMgc3RhdGUgdmFyaWFibGVzIGludG8gYSBtdXhfbW9kZSB2YXIKKwkgIEluc3RlYWQgb2YgY2hlY2tpbmcgdmFyaW91cyBzdGF0ZSB2YXJpYWJsZXMgYXJvdW5kIHRoZSBtdXhlciwKKwkgIHRyYWNrIHRoZSBjdXJyZW50IG11eGluZyBtb2RlIGluIGEgc2luZ2xlICdtdXhfbW9kZScgZW51bS4KKwkgIEFkZCBzb21lIGltcGxlbWVudGF0aW9uIG5vdGVzIGFib3V0IHRoZSBkaWZmZXJlbnQgbXV4IG1vZGVzCisKKzIwMTUtMDQtMDggMTY6NDA6MDIgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjZW50cmljdWxhci5jb20+CisKKwkqIGNvbW1vbjoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgdGVzdHM6IFVzZSBBTV9URVNUU19FTlZJUk9OTUVOVAorCSAgTmVlZGVkIGJ5IHRoZSBuZXcgYXV0b21ha2UgdGVzdCBydW5uZXIKKworMjAxNS0wNC0wOCAxMToxNzozMSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkgIHJ0cGgyNjNkZXBheTogRml4IGZyYW1lc2l6ZSBwYXJzaW5nCisJICBUaGUgc3RyaW5nIHBhc3NlZCB0byB0aGUgcGFyc2luZyBmdW5jdGlvbiBvbmx5IGNvbnRhaW5zIGEgZnJhbWVzaXplLCBhbmQKKwkgIG5vdCA8cHQ+ICsgPGZyYW1lc2l6ZT4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjY0MTYKKworMjAxNS0wMy0yMCAxMjoxODozNyArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IGNsaXAgY2h1bmsgc2l6ZSBhYm92ZSB0aGUgdmFsaWQgbWF4aW11bSAoMHg3ZmZmZmZmZikKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjI1NjcKKworMjAxNS0wMy0yMCAwOTowNzozNSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IGNsaXAgY2h1bmsgbGVuZ3RoIHRvIGF2YWlsYWJsZSBkYXRhICh3aGVuIGtub3duKQorCSAgVGhpcyBwcmV2ZW50cyBzaWxseSBjaHVuayBsZW5ndGhzIGZyb20gcG9zc2libHkgb3ZlcmZsb3dpbmcKKwkgIChhdCBsZWFzdCB3aGVuIHdlIGtub3cgdGhlIGFjdHVhbCBkYXRhIGxlbmd0aCkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIyNTY3CisKKzIwMTUtMDQtMDYgMjA6MTc6NTIgLTA3MDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRG9uJ3QgYWNjdW11bGF0ZSBzZWdtZW50IGJhc2VzIG1hbnVhbGx5CisJICBnc3Rfc2VnbWVudF9kb19zZWVrKCkgZG9lcyB0aGF0IGZvciB1cyBhbHJlYWR5LCBhbmQgZG9pbmcgaXQgdHdpY2UKKwkgIHdpbGwgYnJlYWsgbm9uLWZsdXNoaW5nIHNlZWtzIGluIGludGVyZXN0aW5nIHdheXMuIExlZnRvdmVyIGZyb20gMS4wCisJICBwb3J0aW5nLgorCSAgQWxzbyBjb3B5IG92ZXIgc2VnbWVudCBvZmZzZXQgYW5kIGFwcGxpZWRfcmF0ZSwganVzdCBpbiBjYXNlLgorCisyMDE1LTA0LTA2IDE5OjA4OjEwIC0wNzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9pY2xlcy90ZXN0LXNlZ21lbnQtc2Vla3MuYzoKKwkgIGljbGVzOiBGaXggd2FpdGluZyBmb3Igc2VnbWVudC1kb25lIGlmIGl0IGhhcHBlbnMgdG9vIGZhc3QKKwkgIFNvbWV0aW1lcyB3ZSBjYW4gZ2V0IHNlZ21lbnQtZG9uZSBiZWZvcmUgd2UgZ290IGFzeW5jLWRvbmUuIElmIHdlIHdhaXRlZAorCSAgZm9yIGFzeW5jLWRvbmUgb25seSwgdGhlIHNlZ21lbnQtZG9uZSB3b3VsZCBiZSBkcm9wcGVkIGFuZCB3ZSB3b3VsZCB3YWl0CisJICBmb3JldmVyIGZvciBpdCBhIGZldyBsaW5lcyBiZWxvdy4KKworMjAxNS0wNC0wNiAxODo1NTowOCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHN0YmxfaW5kZXggaXMgdmFsaWQgZnJvbSAwIG9ud2FyZHMKKwkgIEl0IGluZGljYXRlcyB0aGUgbGFzdCBzYW1wbGUgcGFyc2VkLCBub3QgdGhlIG5leHQgb25lIHRvIHBhcnNlLgorCSAgQXMgaXQgc3RhcnRzIGluIC0xLCBhbnkgdmFsdWUgZnJvbSAwIG9ud2FyZHMgbWVhbnMgdGhhdCBpdCBoYXMKKwkgIHNvbWUgdmFsaWQgZGF0YS4KKworMjAxNS0wNC0wNSAyMDowNjowOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgZG9jczogbWFrZSBHc3RSVENQU3luYyBlbnVtIHNob3cgdXAgaW4gcnRwYmluIGRvY3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDczNTgKKworMjAxNS0wNC0wNSAxMTo0NTo0NSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBkb2NzOiBhZGQgUlRQSml0dGVyQnVmZmVyTW9kZSBlbnVtIHRvIHJ0cGJpbiBkb2NzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3MzU4CisKKzIwMTUtMDQtMDQgMTE6NTU6MDAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICBtdWx0aWZpbGVzaW5rOiBjbG9zZSBmaWxlcyBiZWZvcmUgcG9zdGluZyBtZXNzYWdlCisJICBNYWtlcyBzdXJlIHRoZSBmaWxlcyB3ZXJlIHByb3Blcmx5IGZsdXNoZWQgYW5kIGNsb3NlZCBiZWZvcmUKKwkgIHRoZSBtZXNzYWdlIHJlYWNoZXMgdGhlIGFwcGxpY2F0aW9uCisKKzIwMTUtMDMtMzAgMTM6NTQ6MjMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsdGlmaWxlLmM6CisJICB0ZXN0czogbXVsdGlmaWxlOiBpbmNyZW1lbnQgdGVzdHMgdG8gY2hlY2sgZm9yIG11bHRpZmlsZSBtZXNzYWdlcworCSAgQWxzbyB2ZXJpZnkgdGhhdCB0aGUgbXVsdGlmaWxlc2luayBmaWxlIG1lc3NhZ2VzIGFyZSBiZWluZyBjb3JyZWN0bHkKKwkgIHBvc3RlZCB0byB0aGUgYnVzCisKKzIwMTUtMDMtMzAgMTI6NTE6MzUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsdGlmaWxlLmM6CisJICB0ZXN0czogbXVsdGlmaWxlOiBoYW5kbGUgRklYTUUgZm9yIHByb3BlciBjaGVja2luZyB3aGVuIHRlc3QgZmluaXNoZWQKKwkgIFVzZSBhIEdzdEJ1cyBhbmQgd2FpdCBmb3IgRU9TIHRvIGZpbmlzaCB0aGUgdGVzdHMgaW5zdGVhZCBvZgorCSAgcmVseWluZyBvbiBzbGVlcGluZworCisyMDE1LTAzLTMwIDExOjE0OjA5IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgbXVsdGlmaWxlc2luazogcG9zdCBmaWxlIG1lc3NhZ2Ugb24gRU9TCisJICBXaGVuIG11bHRpZmlsZXNpbmsgaXMgb3BlcmF0aW5nIGluIGFueSBtb2RlIG90aGVyIHRoYW4gb25lIGZpbGUKKwkgIHBlciBidWZmZXIsIHRoZSBsYXN0IGZpbGUgY3JlYXRlZCB3b24ndCBoYXZlIGEgZmlsZSBtZXNzYWdlIHBvc3RlZAorCSAgYXMgbXVsdGlmaWxlc2luayBkb2Vzbid0IGhhbmRsZSB0aGUgRU9TIGV2ZW50LgorCSAgVGhpcyBwYXRjaCBmaXhlcyBpdCBieSB1c2luZyB0aGUgbGFzdCBwb3NpdGlvbiB0byBwb3N0IGEgZmlsZQorCSAgbWVzc2FnZSB3aGVuIEVPUyBpcyByZWNlaXZlZC4gVGhpcyBzaG91bGQgZW5zdXJlIGF0IGxlYXN0IHRoZQorCSAgdGltZSByZWxhdGVkIGRhdGEgYW5kIHRoZSBmaWxlbmFtZSBhcmUgcG9zdGVkIHRvIHRoZSBhcHBsaWNhdGlvbgorCSAgb3Igb3RoZXIgZWxlbWVudHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDcwMDAKKworMjAxNS0wNC0wMyAxODo1Nzo1MCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogYXV0b2dlbi5zaDoKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBiYzc2YThiIHRvIGM4ZmIzNzIKKworMjAxNS0wNC0wMyAwMjowODo1MCArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogR3VhcmQgYWdhaW5zdCA2NC1iaXQgb3ZlcmZsb3cKKwkgIEZvciBsYXJnZS1maWxlIGF0b21zLCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93IGluIHRoZSBzaXplIGZpZWxkLAorCSAgd2hpY2ggY291bGQgbWFrZSB1cyBqdW1wIGJhY2t3YXJkIGluIHRoZSBmaWxlIGFuZCBjYXVzZQorCSAgaW5maW5pdGUgbG9vcHMuCisKKzIwMTUtMDQtMDEgMjM6NDY6MTMgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4Lmg6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgaXNvbXA0OiBNYWtlIG5vbi1zZWVrYWJsZSBkb3duc3RyZWFtIGFuIGVycm9yIGluIG5vcm1hbCBtb2RlCisJICBXaGVuIG5vdCBpbiBmYXN0LXN0YXJ0IG9yIGZyYWdtZW50ZWQgbW9kZSwgd2UgbmVlZCB0byBiZSBhYmxlCisJICB0byByZXdyaXRlIHRoZSBzaXplIG9mIHRoZSBtZGF0IGF0b20sIG9yIGVsc2UgdGhlIG91dHB1dCBqdXN0CisJICB3b24ndCBiZSBwbGF5YWJsZSAtIHRoZSBtZGF0IHBsYWNlaG9sZGVyIHdpdGggc2l6ZSA9PSAwIHdpbGwKKwkgIGNvdmVyIHRoZSByZXN0IG9mIHRoZSBmaWxlLCBpbmNsdWRpbmcgYW55IG1vb3YgYXRvbSB3ZSB3cml0ZSBvdXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA4ODA4CisKKzIwMTQtMDMtMTUgMTU6MjM6MDEgKzAxMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJhc0Bob3RtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHJ0cGgyNjNwYXkvLWRlcGF5OiBhZGQgZnJhbWVzaXplIFNEUCBhdHRyaWJ1dGUKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjY0MTYKKworMjAxNC0wMy0xNSAxMzozMzo1NiArMDEwMCAgU2ViYXN0aWFuIFJhc211c3NlbiA8c2VicmFzQGhvdG1haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBydHBqcGVncGF5Ly1kZXBheTogUmVtb3ZlIGluY29ycmVjdGx5IGludHJvZHVjZWQgZnJhbWVzaXplIFNEUCBhdHRyaWJ1dGUKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjY0MTUKKworMjAxNS0wMy0yNyAyMTowOTo0NCArMDEwMCAgUGV0ZXIgU2VpZGVyZXIgPHBzLnJlcG9ydEBnbXgubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmg6CisJICB2NGwyc3JjOiBkZXZpY2Ugc2VxdWVuY2Uvb2Zmc2V0IGNvcnJlY3Rpb24gaW4gY2FzZSBvZiByZW5lZ290aWF0aW9uCisJICBUaGUgdjRsMiBkZXZpY2UgcmVzdGFydHMgdGhlIHNlcXVlbmNlIGNvdW50ZXIgaW4gY2FzZSBvZiBzdHJlYW1vZmYvc3RyZWFtb24sCisJICB0aGUgR1NUIG9mZnNldCB2YWx1ZXMgYXJlIHN1cHBvc2VkIHRvIGluY3JlbWVudCBzdHJpY3RseSBtb25vdG9uaWMsIHNvCisJICBhZGp1c3QgdGhlIHNlcXVlbmNlIGNvdW50ZXIvb2Zmc2V0IHZhbHVlcyBpbiBjYXNlIG9mIGNhcHMKKwkgIHJlbmVnb3RpYXRpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1NDQxCisKKzIwMTQtMTEtMTQgMTQ6MTg6NTEgKzAxMDAgIFBldGVyIFNlaWRlcmVyIDxwcy5yZXBvcnRAZ214Lm5ldD4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMnNyYzogYWRkIGZyYW1lIGxvc3MgZGV0ZWN0aW9uCisJICBJbiBjYXNlIG9mIHY0bDIgZHJpdmVyIGZpbGxlZCBvZmZzZXQvc2VxdWVuY2UgdmFsdWVzIGFkZCBmcmFtZQorCSAgbG9zcyBkZXRlY3Rpb24gKGFuZCB3cml0ZSBhIHdhcm5pbmcgbWVzc2FnZSkuCisJICBNb3ZlIG9mZnNldCBtZXRhIGRhdGEgc2V0dGluZyBhbmQgZnJhbWUgbG9zcyBjaGVja2luZyBhZnRlciB0aGUKKwkgIHRpbWVzdGFtcCBhZGp1c3RtZW50IGNvZGUgdG8gZ2V0IHByb3BlciB0aW1lc3RhbXBzIGZvciB0aGUKKwkgIHdhcm5pbmcgbWVzc2FnZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDU0NDEKKworMjAxNC0xMS0xNCAxMzo0ODo1MSArMDEwMCAgUGV0ZXIgU2VpZGVyZXIgPHBzLnJlcG9ydEBnbXgubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogdXNlIHY0bDIgY2FwdHVyZSBkZXZpY2Ugc2VxdWVuY2UgY291bnRlcgorCSAgVXNlIHRoZSB2NGwyIGNhcHR1cmUgZGV2aWNlIHNlcXVlbmNlIGNvdW50ZXIgZm9yCisJICBzZXR0aW5nIHRoZSBHc3RCdWZmZXIgb2Zmc2V0L29mZnNldF9lbmQgdmFsdWVzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTQ0MQorCisyMDE1LTAzLTMwIDEzOjEyOjM1ICswMjAwICBUb2JpYXMgTW9kc2NoaWVkbGVyIDx0b2JpYXMubW9kc2NoaWVkbGVyQGNldGl0ZWMuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogQXNrIHRoZSBkcml2ZXIgYWJvdXQgaXRzIHJlcXVpcmVtZW50cyBmb3IgbWluX2J1ZmZlcnMgYmVmb3JlIGluaXRpYXRpbmcgYnVmZmVyIHBvb2wuCisJICBJZiBwcm9wb3NlX2FsbG9jYXRpb24oKSBoYWQgbm90IGJlZW4gY2FsbGVkIHlldCwgaXQgd2FzIHBvc3NpYmxlIHRoYXQgdGhlIGRyaXZlciB3YXMgbm90IGFza2VkIGF0IGFsbC4KKwkgIEluIGJ1ZmZlciBwb29sOiBDb25zaWRlciBtaW5pbXVtIG51bWJlciBvZiBidWZmZXJzIHJlcXVlc3RlZCBieSBkcml2ZXIgd2hlbiBzZXR0aW5nIGNvbmZpZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDY4MzQKKworMjAxNS0wNC0wMSAxOTozMDoyNyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5oOgorCSAgcnRwdnA4ZGVwYXk6IFBhcnNlIHdpZHRoL2hlaWdodC9wcm9maWxlIGZyb20ga2V5ZnJhbWVzCisJICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIG11eCB0aGUgcmVzdWx0IGludG8gYSBjb250YWluZXIKKwkgIHN1Y2ggYXMgbWF0cm9za2EuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3MjA4CisKKzIwMTUtMDQtMDEgMTk6MDE6NDkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJICB2cDhlbmM6IEV4cG9zZSBWUDggd2lkdGgvaGVpZ2h0IGxpbWl0YXRpb25zIGluIHRoZSBjYXBzIHRlbXBsYXRlCisJICBUaGUgVlA4IGZvcm1hdCBzcGVjaWZpY2F0aW9uIChSRkMgNjM4NiBzZWN0aW9uIDE4LjEpIHNwZWNpZmllcworCSAgdGhhdCB0aGUgbWF4aW11bSBzaXplIGlzIDE2MzgzeDE2MzgzLgorCisyMDE1LTAzLTMxIDAwOjIwOjEzICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2OiBXaGVuIHBhc3Npbmcgc2VlayBldmVudCB1cHN0cmVhbSwgaG9sZCBhIHJlZi4KKwkgIEluIGNhc2UgdXBzdHJlYW0gY2FuJ3QgaGFuZGxlIHRoZSBzZWVrLCBtYWtlIHN1cmUgd2UKKwkgIGtlZXAgYSByZWYgb24gdGhlIGV2ZW50IHRvIGF0dGVtcHQgdG8gaGFuZGxlIGl0IG91cnNlbHZlcy4KKworMjAxNS0wMy0yNiAxMzozNDo1MyArMDEwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWF0cm9za2E6IGZpeCBHVmFsdWUgbGVha3Mgd2hlbiBwYXJzaW5nIHRhZ3MKKwkgIGdzdF90YWdfbGlzdF9hZGRfdmFsdWUoKSBkb2Vzbid0IGNvbnN1bWUgdGhlIEdWYWx1ZSB3ZSBwYXNzIHRvIGl0IHNvIHRoZXJlIGlzCisJICBubyBwb2ludCBjb3B5aW5nIGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjgxMAorCisyMDE1LTAzLTIzIDIwOjU4OjI1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcmVzdXJyZWN0IHNvbWUgZmxvdyByZXR1cm4gaGFuZGxpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDQ1NzIKKworMjAxNS0wMy0yMyAyMDo1Nzo1NiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogcmVzdXJyZWN0IHNvbWUgZmxvdyByZXR1cm4gaGFuZGxpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDQ1NzIKKworMjAxNS0wMy0yMyAyMDo1Njo0MSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IHJlc3VycmVjdCBzb21lIGZsb3cgcmV0dXJuIGhhbmRsaW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ0NTcyCisKKzIwMTUtMDMtMjcgMTg6NTg6MzEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thOiBzdG9yZSBzdHJlYW0gdGFncyBhbmQgcHVzaCBhcyB1cGRhdGVkCisJICBOZXcgdGFncyBjYW4gYmUgZm91bmQgb24gZGlmZmVyZW50IHBhcnRzIG9mIHRoZSBmaWxlLCBzbyB0aGlzIHBhdGNoCisJICBrZWVwcyB0aGUgc3RyZWFtIHRhZ2xpc3RzIGFyb3VuZCBmb3IgdGhlIGxpZmUgY3ljbGUgb2YgdGhlIHBhZAorCSAgYW5kIGFkZHMgdGhvc2UgbmV3IHRhZ3MgYXMgZm91bmQuIFRoZW4gYSBuZXcgdGFnIGlzIGZvdW5kLCB0aGUKKwkgIHBhZCdzIGlzIG1hcmtlZCB3aXRoIGEgdGFncyBjaGFuZ2VkIGZsYWcsIG1ha2luZyB0aGUgZWxlbWVudCBwdXNoCisJICBhIG5ldyB0YWcgZXZlbnQgb24gdGhlIG5leHQgY2hlY2suIEJlZm9yZSB0aGlzLCB3ZSB3ZXJlIHNlbmRpbmcKKwkgIG9ubHkgdGhlIG5ld2x5IGZvdW5kIHRhZ3MsIGFzIHRoZSBlbGVtZW50IHdhcyBsb3NpbmcgaXRzIHRhZ2xpc3QKKwkgIHdoZW4gcHVzaGluZyB0aGUgZXZlbnQuCisKKzIwMTUtMDMtMTUgMTQ6NDA6MzYgKzAxMDAgIFJhbWlybyBQb2xsYSA8cmFtaXJvLnBvbGxhQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBzZW5kIGdsb2JhbCB0YWdzIGluY3JlbWVudGFsbHkKKwkgIEluc3RlYWQgb2Ygc2VuZGluZyBvbmx5IG5ldyB0YWdzIG9uY2UgdGhleSBhcmUgZm91bmQsIG1lcmdlIHRoZSB0YWdsaXN0CisJICBhbmQgc2VuZCB0aGVtIGluY3JlbWVudGFsbHkuCisKKzIwMTUtMDMtMTQgMTc6MDc6MDUgKzAxMDAgIFJhbWlybyBQb2xsYSA8cmFtaXJvLnBvbGxhQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSAgbWF0cm9za2FwYXJzZTogc2VuZCBnbG9iYWwgdGFncworCSAgR2xvYmFsIHRhZ3MgYXJlIGFscmVhZHkgYmVpbmcgcmVhZCBpbiBtYXRyb3NrYXBhcnNlLCBidXQgdGhleSBhcmUgbm90CisJICBjdXJyZW50bHkgYmVpbmcgc2VudC4KKwkgIFRoaXMgcGF0Y2ggbWFrZXMgZ2xvYmFsIHRhZ3MgZ2V0IHNlbnQgaW5jcmVtZW50YWxseSB3aGVuZXZlciBuZXcgb25lcworCSAgYXJlIGZvdW5kLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjI0MgorCisyMDE1LTAyLTAzIDEwOjE4OjU4ICswNTMwICBWaW5lZXRoIFQgTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkgIHF1YXJrdHY6IGZpeCAicGxhbmVzIiBwcm9wZXJ0eSByYW5nZSwgYSB2YWx1ZSBvZiAwIGlzIG5vdCBhbGxvd2VkCisJICBXaGVuIHBsYW5lcyBwcm9wZXJ0eSBpcyBzZXQgdG8gMCwgdGhlIHBpcGVsaW5lIGV4ZWN1dGVzIGluCisJICBhbiBpbmZpbml0ZSBsb29wIGFuZCBuZXZlciBleGl0cy4gU2luY2UgcGxhbmVzIG11c3QgbmV2ZXIKKwkgIGJlIDAsIHNldCB0aGUgbWluaW11bSB2YWx1ZSBpbiB0aGUgcHJvcGVydHkgZGVzY3JpcHRpb24KKwkgIHRvIDEuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQzOTA2CisKKzIwMTUtMDMtMjYgMTM6NDI6MDIgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBGaXggdXAgY29tbWVudHMgcmVnYXJkaW5nIERUUworCisyMDE1LTAzLTI1IDE1OjExOjM0IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IEZpeCBzZWdtZW50IGluIFRDUCBtb2RlCisJICBJdCBpcyBleHBlY3RlZCB0aGF0IGJ1ZmZlcnMgYXJlIHRpbWUtc3RhbXBlZCB3aXRoIHJ1bm5pbmcgdGltZS4gU2V0CisJICBhIHNlZ21lbnQgYWNjb3JkaW5nbHkuIEluIHRoaXMgY2FzZSB3ZSBwaWNrIDAsLTEgYXMgdGhpcyBpcyB3aGF0IHVkcHNyYworCSAgd291bGQgZG8uIERlcGF5bG9hZGVycyB3aWxsIHVwZGF0ZSB0aGUgc2VnbWVudCB0byByZWZsZWN0IHRoZSBwbGF5YmFjaworCSAgcG9zaXRpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjM1NzAxCisKKzIwMTUtMDMtMjYgMTI6MjE6MjUgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBiZSBtb3JlIHN0cmljdCBhYm91dCB0eXBlZmluZGluZyBEVFMKKwkgIENvZGUgbm93IG1hdGNoZXMgY29tbWVudHMuCisKKzIwMTUtMDMtMjUgMTU6MTA6NTMgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogUmVtb3ZlIHVzZWxlc3MgZnVuY3Rpb24KKwkgIFRoaXMgZnVuY3Rpb24gZGlkbid0IGRvIGFueXRoaW5nIHNwZWNpYWwsIGxldCdzIG5vdCB1c2UgYSBmdW5jdGlvbiBmb3IKKwkgIHRoYXQuCisKKzIwMTUtMDMtMjAgMTM6MDM6MDkgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXI6IEFjY291bnQgZm9yIHJ0eF9yZXRyeSBpbiBvdmVyZmxvdyBjaGVjaworCSAgQXMgcnR4X3JldHJ5IGlzIHBhcnQgb2YgdGhlIHN1YnN0cmFjdGlvbiwgd2UgbmVlZCB0byB0YWtlIGl0IGludG8KKwkgIGFjY291bnQsIG90aGVyd2lzZSB3ZSBtYXkgZW5kdXAgd2l0aCBhIGJpZyB2YWx1ZS4KKworMjAxNS0wMy0yNCAyMzoxNToxNSArMDAwMCAgSnVsaWVuIElzb3JjZSA8ai5pc29yY2VAc2Ftc3VuZy5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5tOgorCSAgb3N4dmlkZW9zaW5rOiBjaGVjayBmb3IgZGVwcmVjYXRlZCBjb25zdGFudHMgcHJpb3IgdG8gT1NYIDEwLjEwCisJICBjb2NvYXdpbmRvdy5tOjMzOTo1OiBlcnJvcjogJ05TT3BlbkdMUEZBV2luZG93JworCSAgaXMgZGVwcmVjYXRlZDogZmlyc3QgZGVwcmVjYXRlZCBpbiBPUyBYIDEwLjkKKwkgIGNvY29hd2luZG93Lm06NTc2Ojc6IGVycm9yOiAnTlNPcGVuR0xQRkFGdWxsU2NyZWVuJworCSAgaXMgZGVwcmVjYXRlZDogZmlyc3QgZGVwcmVjYXRlZCBpbiBPUyBYIDEwLjYKKwkgIGNvY29hd2luZG93Lm06NjA1OjI0OiBlcnJvcjogJ3NldEZ1bGxTY3JlZW4nCisJICBpcyBkZXByZWNhdGVkOiBmaXJzdCBkZXByZWNhdGVkIGluIE9TIFggMTAuNworCisyMDE1LTAzLTI0IDE2OjUxOjEyIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogRml4IHNlZWtpbmcgcXVlcnkKKwkgIFRoZSBzZWdtZW50IHN0YXJ0L3N0b3AgaW4gdGhlIHF1ZXJ5IGlzIG1lYW50IHRvIHJlcHJlc2VudCB0aGUgc2Vla2FibGUKKwkgIHBvcnRpb24gb2YgdGhlIHN0cmVhbS4gSXQgZG9lcyBub3QgbWF0Y2ggdGhlIHNlZ21lbnQgc3RhcnQvc3RvcC4gSW5zdGVhZAorCSAgZXhwb3J0IDAgdG8gZHVyYXRpb24uCisKKzIwMTUtMDMtMjQgMTY6MTg6NTMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBPbmx5IHNldCBjYXBzIG9uY2UgaWYgdGhleSBkb24ndCBjaGFuZ2UKKwkgIFByZXZpb3VzbHkgd2Ugd2VyZSBzZXR0aW5nIG5ldyBjYXBzIHdpdGggdGhlIHNhbWUgY29udGVudCBmb3IgZXZlcnkgSDI2NCBvcgorCSAgQUFDIGNvZGVjX2RhdGEgd2UgZm91bmQgaW4gdGhlIHN0cmVhbSwgc3BhbW1pbmcgZXZlcnl0aGluZyBhbmQgY2F1c2luZworCSAgcmVuZWdvdGlhdGlvbnMuCisKKzIwMTUtMDMtMjQgMTI6NDY6MTkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBEb24ndCBjcmVhdGUgQUFDL0gyNjQgY2FwcyB3aXRob3V0IGNvZGVjX2RhdGEKKwkgIEluc3RlYWQgZGVsYXkgY3JlYXRpbmcgdGhlIGNhcHMgdW50aWwgd2UgcmVhZCB0aGUgY29kZWNfZGF0YSBmcm9tIHRoZSBzdHJlYW0sCisJICBvciBmYWlsIGlmIHdlIGdldCBub3JtYWwgZGF0YSBiZWZvcmUgdGhlIGNvZGVjX2RhdGEuCisJICBBQUMgcmF3IGNhcHMgYW5kIEgyNjQgYXZjIGNhcHMgYWx3YXlzIG5lZWQgY29kZWNfZGF0YSwgc2V0dGluZyBjYXBzIG9uIHRoZSBwYWQKKwkgIHdpdGhvdXQgdGhlbSBpcyBnb2luZyB0byBtYWtlIG5lZ290aWF0aW9uIGZhaWwgbW9zdCBvZiB0aGUgdGltZS4gRXZlbiBpZiB3ZQorCSAgbGF0ZXIgc2V0IG5ldyBjYXBzIHdpdGggdGhlIGNvZGVjX2RhdGEsIHRoYXQncyB1c3VhbGx5IGdvaW5nIHRvIGJlIHRvbyBsYXRlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjY4MgorCisyMDE1LTAzLTI0IDE1OjM5OjIyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogRml4IGluZGVudGlvbgorCisyMDE1LTAzLTIyIDEzOjIzOjQ0ICswMjAwICBJbHlhIEtvbnN0YW50aW5vdiA8aWx5YS5rb25zdGFudGlub3ZAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvLmg6CisJICBvc3hhdWRpbzogRml4IHN0cmluZyBmb3JtYXQgd2FybmluZyBvbiAzMi1iaXQKKwkgIFVJbnQzMiAoRGFyd2luLCBub3QgQzk5J3MgdWludDMyX3QpIGlzICd1bnNpZ25lZCBsb25nJyBvbiAzMi1iaXQKKwkgIHBsYXRmb3Jtcy4KKworMjAxNS0wMy0yMSAxNzo1MDo0MCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogRml4IGFub3RoZXIgaW5zdGFuY2Ugb2Ygc3RpY2t5IGV2ZW50IG1pc29yZGVyaW5nIHdhcm5pbmdzCisJICBNYWtlIHN1cmUgdGhhdCB0aGUgc3luY19zcmMgcGFkIGhhcyBjYXBzIGJlZm9yZSB0aGUgc2VnbWVudCBldmVudC4KKwkgIE90aGVyd2lzZSB3ZSBtaWdodCBnZXQgYSBzZWdtZW50IGV2ZW50IGJlZm9yZSBjYXBzIGZyb20gdGhlIHJlY2VpdmUKKwkgIFJUQ1AgcGFkLCBhbmQgdGhlbiBsYXRlciB3aGVuIHJlY2VpdmluZyBSVENQIHBhY2tldHMgd2lsbCBzZXQgY2Fwcy4KKwkgIFRoaXMgd2lsbCByZXN1bHRzIGluIGEgc3RpY2t5IGV2ZW50IG1pc29yZGVyaW5nIHdhcm5pbmcKKwkgIFRoaXMgZml4ZXMgd2FybmluZ3MgaW4gdGhlIHJ0cGF1eCB1bml0IHRlc3QgYnV0IGFsc28gaW4gdGhlCisJICBydHBhdXggYW5kIHJ0eCBleGFtcGxlcyBpbiB0ZXN0cy9leGFtcGxlcy9ydHAKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDY0NDUKKworMjAxNS0wMy0yMSAxNzoxODo0NyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogQWxzbyBzdGFydCB0aGUgUlRDUCBzZW5kIHRocmVhZCB3aGVuIHJlY2VpdmluZyBSVFAgb3IgUlRDUAorCSAgQmVmb3JlIHdlIG9ubHkgc3RhcnRlZCBpdCB3aGVuIGVpdGhlcjoKKwkgIC0gdGhlcmUgaXMgbm8gc2VuZCBSVFAgc3RyZWFtCisJICBvcgorCSAgLSB3ZSByZWNlaXZlZCBhbiBSVFAgcGFja2V0IGZvciBzZW5kaW5nCisJICBUaGlzIGNvdWxkIG1lYW4gdGhhdCBpZiB0aGUgc2VuZCBSVFAgcGFkcyBhcmUgY29ubmVjdGVkIGJ1dCBuZXZlciByZWNlaXZlIGFueQorCSAgUlRQIGRhdGEsIGFuZCB0aGUgc2FtZSBzZXNzaW9uIGlzIGFsc28gdXNlZCBmb3IgcmVjZWl2aW5nIFJUUC9SVENQLCB3ZSB3b3VsZAorCSAgbmV2ZXIgc3RhcnQgdGhlIFJUQ1AgdGhyZWFkIGFuZCB3b3VsZCBuZXZlciBzZW5kIFJUQ1AgZm9yIHRoZSByZWNlaXZpbmcgcGFydAorCSAgb2YgdGhlIHNlc3Npb24uCisJICBUaGlzIGNhbiBiZSByZXByb2R1Y2VkIHdpdGggYSBwaXBlbGluZSBsaWtlOgorCSAgZ3N0LWxhdW5jaC0xLjAgcnRwYmluIG5hbWU9cnRwYmluIFwKKwkgIHVkcHNyYyBwb3J0PTUwMDAgISAiYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPXZpZGVvLCBjbG9jay1yYXRlPTkwMDAwLCBlbmNvZGluZy1uYW1lPUgyNjQiICEgcnRwYmluLnJlY3ZfcnRwX3NpbmtfMCBcCisJICB1ZHBzcmMgcG9ydD01MDAxICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzAgXAorCSAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMCAhIGZha2VzaW5rIG5hbWU9cnRjcF9mYWtlc2luayBzaWxlbnQ9ZmFsc2UgYXN5bmM9ZmFsc2Ugc3luYz1mYWxzZSBcCisJICBydHBiaW4ucmVjdl9ydHBfc3JjXzBfMjU1MzIyNTUzMV85NiAhIGRlY29kZWJpbiAhIHh2aW1hZ2VzaW5rIFwKKwkgIGZha2VzcmMgISB2YWx2ZSBkcm9wPXRydWUgISBydHBiaW4uc2VuZF9ydHBfc2lua18wIFwKKwkgIHJ0cGJpbi5zZW5kX3J0cF9zcmNfMCAhIGZha2VzaW5rIG5hbWU9cnRwX2Zha2VzaW5rIHNpbGVudD1mYWxzZSBhc3luYz1mYWxzZSBzeW5jPWZhbHNlIC12CisJICBCZWZvcmUgdGhpcyBjaGFuZ2UgdGhlIHJ0Y3BfZmFrZXNpbmsgd291bGQgbmV2ZXIgc2VuZCBSVENQIGZvciB0aGUgcmVjZWl2aW5nCisJICBwYXJ0IG9mIHRoZSBzZXNzaW9uIChpLmUuIG5vIHJlY2VpdmVyIHJlcG9ydHMhKSwgYWZ0ZXIgdGhlIGNoYW5nZSBpdCBkb2VzLgorCSAgQW5kIGJlZm9yZSBhbmQgYWZ0ZXIgdGhpcyBjaGFuZ2UgaXQgd291bGQgc2VuZCBSVENQIGZvciB0aGUgcmVjZWl2aW5nIHBhcnQgb2YKKwkgIHRoZSBzZXNzaW9uIGlmIHRoZSBzZW5kZXIgcGFydCB3YXMgb21pdHRlZCAodGhlIGxhc3QgdHdvIGxpbmVzKS4KKworMjAxNS0wMy0xOSAxMTo1NDoxMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSAgcnRwcnR4c2VuZDogQWRkIHN1cHBvcnQgZm9yIGJ1ZmZlciBsaXN0cworCisyMDE1LTAzLTE5IDExOjM5OjM4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhxdWV1ZS5jOgorCSAgcnRwcnR4cXVldWU6IEltcGxlbWVudCBzdXBwb3J0IGZvciBidWZmZXIgbGlzdHMKKworMjAxNS0wMy0xOCAxNzozMjozNiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBJbXByb3ZlIHRyYWNlIHJlYWRhYmlsaXR5CisJICBDaGFuZ2UgdGhlIGNvbW1hbmQgbnVtYmVyIGludG8gc3RyaW5ncy4KKworMjAxNS0wMS0yMCAxMDoxODo1NiArMDEwMCAgSmFuIEFsZXhhbmRlciBTdGVmZmVucyAoaGVmdGlnKSA8anN0ZWZmZW5zQG1ha2UudHY+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkgIGZsdmRlbXV4OiBEb24ndCByZXBlYXRlZGx5IHdhcm4gYWZ0ZXIgbm9fbW9yZV9wYWRzICh2MikKKwkgIFRoaXMgY2FuIGdldCByYXRoZXIgc3BhbW15IGZvciBzdWNoIGEgaGlnaCBsb2cgbGV2ZWwuCisJICBPbmx5IHdhcm4gb25jZSBwZXIgc3RyZWFtLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjI3NAorCisyMDE1LTAzLTE2IDExOjIzOjUyICswMTAwICBKYW4gQWxleGFuZGVyIFN0ZWZmZW5zIChoZWZ0aWcpIDxqc3RlZmZlbnNAbWFrZS50dj4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IEludHJvZHVjZSBjb25zdGFudCBmb3Igbm8tbW9yZS1wYWRzIHRocmVzaG9sZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjI3NAorCisyMDE1LTAxLTIwIDEwOjE4OjI5ICswMTAwICBKYW4gQWxleGFuZGVyIFN0ZWZmZW5zIChoZWZ0aWcpIDxqc3RlZmZlbnNAbWFrZS50dj4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IEZpeCB3YXJuaW5nIHRvIGNvbnRhaW4gJ3ZpZGVvJworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjI3NAorCisyMDE1LTAzLTExIDIxOjI1OjQwICswMTAwICBOaWNvbGEgTXVyaW5vIDxuaWNvbGEubXVyaW5vQGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICBtYXRyb3NrYWRlbXV4OiBmb3IgZHRzIG9ubHkgc3RyZWFtIHNldCBwdHM9ZHRzIGZvciBpbnRyYSBvbmx5IGZvcm1hdHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDUxOTIKKworMjAxNS0wMy0xNCAxNjozOTowOSArMDEwMCAgUmFtaXJvIFBvbGxhIDxyYW1pcm8ucG9sbGFAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWF0cm9za2FkZW11eDogZml4IHNlbmRpbmcgb2YgdGFncworCSAgKiBGaXggY3JpdGljYWwgd2hlbiBuZXcgdGFncyBhcmUgZm91bmQgYWZ0ZXIgc2VnbWVudCBldmVudCBoYXMgYWxyZWFkeQorCSAgYmVlbiBzZW50LgorCSAgKiBTZW5kIGdsb2JhbCB0YWdzIGJlZm9yZSBzdHJlYW0gdGFncy4KKwkgICogU3BsaXQgc2VuZGluZyBvZiB0YWdzIG91dCBvZiBnc3RfbWF0cm9za2FfZGVtdXhfc2VuZF9ldmVudCgpIGludG8gaXRzCisJICBvd24gZnVuY3Rpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1OTczCisKKzIwMTUtMDMtMTMgMTg6MjY6MDYgKzAwMDAgIFJhbWlybyBQb2xsYSA8cmFtaXJvLnBvbGxhQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcHJvcGVybHkgZXNjYXBlIHBlcmNlbnQgc2lnbiBpbiBkb2N1bWVudGF0aW9uCisKKzIwMTUtMDMtMTMgMTg6MjY6NDQgKzAwMDAgIFJhbWlybyBQb2xsYSA8cmFtaXJvLnBvbGxhQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSAgcnRwZHRtZm11eDogcHJvcGVybHkgZXNjYXBlIHBlcmNlbnQgc2lnbiBpbiBkb2N1bWVudGF0aW9uCisKKzIwMTUtMDMtMTMgMTg6NDg6MDMgKzAwMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSAgdjRsMnNyYzogZGVsYXkgcmVuZWdvdGlhdGlvbiB1bnRpbCBpdCBpcyBsaWtlbHkgYnVmZmVycyB3ZXJlIHJlY2xhaW1lZAorCSAgQWxsb3cgcmVuZWdvdGlhdGlvbiB0byBoYXBwZW4gd2hlbiBidWZmZXJzIGhhdmUgcmV0dXJuZWQgYWZ0ZXIgYW4gYWxsb2NhdGlvbgorCSAgcXVlcnkuIEFzIHRoZSBhbGxvY2F0aW9uIHF1ZXJ5IGlzIHNlcmlhbGl6ZWQsIGFsbCBidWZmZXJzIGZyb20gdGhlIHBvb2wKKwkgIHNob3VsZCBoYXZlIHJldHVybmVkIGFuZCB3ZSBjYW4gc3RvcCBpdCB0byBjcmVhdGUgYSBuZXcgb25lIGZvciB0aGUKKwkgIG5ldyBmb3JtYXQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODI3NzAKKworMjAxNS0wMy0xMyAxODo0Nzo1NSArMDAwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyb2JqZWN0OiBhZGQgZ3N0X3Y0bDJfb2JqZWN0X3RyeV9mb3JtYXQKKwkgIFNpbWlsYXIgdG8gc2V0X2Zvcm1hdCBidXQgaXQgdXNlcyBUUllfRk1UIGluc3RlYWQgb2YgU19GTVQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODI3NzAKKworMjAxNS0wMy0xMyAxODozODo0MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpdWRwc2luazogZml4IGNyYXNoIHdpdGggR1NUX0RFQlVHIGVuYWJsZWQKKwkgIGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcygpIGRvZXMgbm90IGdpdmUKKwkgIHVzIGEgcmVmIHRvIHRoZSBhZGRyZXNzLCBzbyBkb24ndCB1bnJlZiBpdC4KKworMjAxNS0wMy0xMiAxMzo0OTo1NiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJICBsZXZlbDogRG9uJ3QgcmVhZCBvdmVyIHRoZSBlbmQgb2YgdGhlIGlucHV0IG1lbW9yeQorCSAgUHJldmlvdXNseSB3ZSBhZHZhbmNlZCB0aGUgaW5fZGF0YSBwb2ludGVyIGJ5IGJwcyBmb3IgZXZlcnkgY2hhbm5lbCwgYW5kIHRoZW4KKwkgIGxhdGVyIGFnYWluIGZvciBibG9ja19zaXplKmJwcy4gVGhpcyBjYXVzZWQgdXMgdG8gYmUgb25lIHNhbXBsZSBmdXJ0aGVyIHRoYW4KKwkgIGV4cGVjdGVkIGlmIGFuIGlucHV0IGJ1ZmZlciBjb3ZlcmVkIHR3byBhbmFseXNpcyBmcmFtZXMuIEFuZCBpbiB0aGUgZW5kIGxlYWQKKwkgIHRvIGNvbXBsZXRlbHkgYm9ndXMgdmFsdWVzIHJlcG9ydGVkIGJ5IGxldmVsLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjA2NQorCisyMDE1LTAzLTEyIDAxOjM3OjA4ICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL29zcy9nc3Rvc3NkbWFidWZmZXIuYzoKKwkgIFJlbW92ZSBhIGNvdXBsZSBvZiBzdXBlcmZsdW91cyB0cmFpbGluZyBzZW1pLWNvbG9ucworCisyMDE1LTAzLTEwIDA5OjMxOjIwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHB1c2hmaWxlc3JjLmM6CisJKiBnc3QvaXNvbXA0L2dzdGlzb2ZmLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2NvbW1vbi5jOgorCSAgRml4IGRvdWJsZSBzZW1pY29sb25zCisKKzIwMTUtMDMtMTAgMTU6NDY6NDAgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c3JjLmM6CisJICBzcGxpdG11eDogU2h1dCBkb3duIGVsZW1lbnQgYmVmb3JlIGRvd253YXJkIHN0YXRlIGNoYW5nZQorCSAgTWFrZSBzdXJlIHRoZSBzdGF0ZSBjaGFuZ2Ugd29uJ3QgaGFuZyB0cnlpbmcgdG8gc2h1dCBkb3duIHBhZHMKKwkgIGJ5IG1ha2luZyBzdXJlIHRoZSBzdHJlYW1pbmcgaGFzIHN0b3BwZWQgYmVmb3JlIGNoYWluaW5nIHVwLgorCisyMDE1LTAzLTA5IDIyOjU4OjA1ICswMjAwICBJbHlhIEtvbnN0YW50aW5vdiA8aWx5YS5rb25zdGFudGlub3ZAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvLmg6CisJICBvc3hhdWRpbzogc3RyZWFtIGZvcm1hdCBpcyBhbiBTUERJRi1vbmx5IGZpZWxkCisKKzIwMTUtMDMtMDkgMjI6NTM6NDEgKzAyMDAgIElseWEgS29uc3RhbnRpbm92IDxpbHlhLmtvbnN0YW50aW5vdkBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5oOgorCSAgb3N4YXVkaW86IGZpeCBzcGFjZXMKKworMjAxNS0wMy0wOSAyMjo1Mjo0NiArMDIwMCAgSWx5YSBLb25zdGFudGlub3YgPGlseWEua29uc3RhbnRpbm92QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmg6CisJICBvc3hhdWRpbzogYWRkIHR5cGUgY2hlY2sgbWFjcm8KKworMjAxNS0wMy0wOSAyMjo1MTo1MSArMDIwMCAgSWx5YSBLb25zdGFudGlub3YgPGlseWEua29uc3RhbnRpbm92QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2NvbW1vbi5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2NvbW1vbi5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2hhbC5jOgorCSAgb3N4YXVkaW86IHJlbmFtZSBnc3RfY29yZV9hdWRpb19zZXRfY2hhbm5lbHNfbGF5b3V0KCkKKwkgIHRvIGdzdF9jb3JlX2F1ZGlvX2dldF9jaGFubmVsX2xheW91dCgpLgorCisyMDE1LTAzLTA5IDIyOjMwOjI4ICswMjAwICBJbHlhIEtvbnN0YW50aW5vdiA8aWx5YS5rb25zdGFudGlub3ZAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9yaW5nYnVmZmVyLmM6CisJICBvc3hhdWRpbzogcmVtb3ZlIHVudXNlZCBmaW5hbGl6ZQorCisyMDE1LTAzLTA5IDE2OjI1OjQzICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOWVuYy5jOgorCSAgdnA5ZW5jOiByZW1vdmUgZHVwbGljYXRlIGRlY2xhcmF0aW9uIG9mIGZ1bmN0aW9uCisKKzIwMTUtMDMtMDkgMTY6MjI6MjkgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICBydHBoMjY0ZGVwYXk6IHJlbW92ZSB1bnVzZWQgdmFsdWUKKwkgIENJRCAjMTIyNjQ3NAorCisyMDE1LTAzLTA5IDE2OjE0OjM0ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgIHJ0cGgyNjNwYXk6IGZpeCBsZWFrCisJICBDSUQgMTIxMjE1NgorCisyMDE1LTAzLTA5IDE1OjU4OjMzICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgIHJ0cGgyNjNwYXk6IHJlbW92ZSB1bmVlZGVkIHZhcmlhYmxlCisJICBXZSBqdXN0IG5lZWQgdG8gc2F2ZSB0aGUgZWJpdCBpbmZvcm1hdGlvbiBpbiBjYXNlIHRoZXJlIGlzIGFuIGVycm9yIGRlY29kaW5nLgorCisyMDE1LTAzLTA5IDE2OjQ2OjAyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkgIHZwWzg5XWVuYzogUmVzZXQgdGhlIGVuY29kZXIgd2hlbiBmbHVzaGluZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTcwNAorCisyMDE1LTAzLTA5IDEyOjUxOjE3ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkgIG1hdHJvc2thOiBlcnJvciBtb2RlIGlmIGNhbid0IHB1c2ggYnVmZmVyCisJICBJZiBnc3RfcGFkX3B1c2goKSBmYWlscywgaW5mb3JtIGFuZCByZXR1cm4gZmxvdyBlcnJvci4KKworMjAxNS0wMy0wOSAxMjoxMzozNCArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJICBtYXRyb3NrYTogdW51c2VkIHZhbHVlCisJICBWYWx1ZSBzZXQgaW4gcmV0IHdpbGwgYmUgb3ZlcndyaXR0ZW4ganVzdCBiZWZvcmUgZXhpdGluZyB0aGUgZnVuY3Rpb24uCisJICBDSUQgIzEyMjY0NjkKKworMjAxNS0wMy0wOSAxMToxMDozNSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IERyb3AgcGFja2V0cyB3aXRoIHNlcXVlbmNlIG51bWJlcnMgYmVmb3JlIHRoZSBzZXFudW0tYmFzZQorCSAgVGhlc2UgYXJlIG91dHNpZGUgdGhlIGV4cGVjdGVkIHJhbmdlIG9mIHNlcXVlbmNlIG51bWJlcnMgYW5kIHNob3VsZCBiZQorCSAgY2xpcHBlZCwgZXNwZWNpYWxseSBmb3IgUlRTUCB0aGV5IG1pZ2h0IGJlbG9uZyB0byBwYWNrZXRzIGZyb20gYmVmb3JlIGEgc2VlaworCSAgb3IgYSBwcmV2aW91cyBzdHJlYW0gaW4gZ2VuZXJhbC4KKworMjAxNC0wMi0yNyAxMDo1MjoxNiArMDEwMCAgTGludXMgU3ZlbnNzb24gPGxpbnVzc25AYXhpcy5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IERvbid0IGluY2x1ZGUgcGF5bG9hZCB0eXBlIGluIHRoZSBjYXBzIGZvciBmcmFtZXNpemUKKwkgIFdoZW4gdGhlIHNkcCBtZWRpYSBhdHRyaWJ1dGUgZnJhbWVzaXplIGFyZSBjb252ZXJ0ZWQgdG8gY2FwcworCSAgdGhlIDxwYXlsb2FkPiBzaG91bGQgbm90IGJlIGluY2x1ZGVkLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNTMzNQorCisyMDE1LTAzLTA5IDEwOjA1OjE0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogRG9uJ3QgZm9yZ2V0IHRvIHVubG9jayB0aGUgbXV0ZXggd2hlbiByZWNlaXZpbmcgR0FQcyBpbiBUQ1Agc3RyZWFtcworCisyMDE1LTAzLTA5IDExOjI0OjU4ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBNYWtlIHN1cmUgdG8gZmlsdGVyIGNhcHMgaW4gYWxsIGNhc2VzIGR1cmluZyBDQVBTIHF1ZXJ5CisJICBXZSB3ZXJlIHNraXBwaW5nIHRoZSBmaWx0ZXIgc3RlcCB3aGlsZSByZXR1cm5pbmcgdGVtcGxhdGUgY2FwcywgZm9yCisJICBleGFtcGxlLgorCisyMDE1LTAzLTA4IDIxOjE1OjUzICswMDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogRG9uJ3QgdXBkYXRlIGJ1ZmZlciBmb3IgT1VUUFVUCisJICBGb3Igb3V0cHV0IGRldmljZSwgd2Ugc2hvdWxkIG5vdCB1cGRhdGUgdGhlIGJ1ZmZlciB3aXRoIGZsYWdzIGFuZAorCSAgdGltZXN0YW1wIHdoZW4gd2UgZGVxdWV1ZS4gVGhlIGluZm9ybWF0aW9uIGluIHRoZSB2NGwyX2J1ZmZlciBpcyBub3QKKwkgIG1lYW5pbmdmdWwgYW5kIGl0IGJyZWFrcyB0aGUgY2FzZSB3aGVyZSB0aGUgYnVmZmVyIGlzIHJlbmRlcmVkIGF0CisJICBtdWx0aXBsZSBwbGFjZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1NDM4CisKKzIwMTUtMDMtMDggMTg6MDQ6MzQgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5jOgorCSAgc291cGh0dHBjbGllbnRzaW5rOiBJbXBsZW1lbnQgY29va2llcyBwcm9wZXJ0eQorCisyMDE1LTAzLTA4IDE4OjAyOjUxICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkgIHNvdXBodHRwY2xpZW50c2luazogSW1wbGVtZW50IGF1dG9tYXRpYy1yZWRpcmVjdCBwcm9wZXJ0eQorCisyMDE1LTAzLTA4IDE3OjU0OjA3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkgIHNvdXBodHRwY2xpZW50c2luazogSW1wbGVtZW50IHByb3h5IHN1cHBvcnQKKwkgIFRoZSBwcm9wZXJ0aWVzIHdlcmUgdGhlcmUgYmVmb3JlLCBidXQgbm90IHVzZWQgYW55d2hlcmUuCisKKzIwMTUtMDItMjEgMjA6MDU6MjQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHJlc3VycmVjdCBzb21lIGZsb3cgcmV0dXJuIGhhbmRsaW5nCisKKzIwMTUtMDMtMDQgMTA6Mjc6MTcgKzAxMDAgIE5pY29sYXMgSHVldCA8bmljb2xhcy5odWV0QHBhcnJvdC5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBmaXggTE9BUyBwYXJzaW5nIGlzc3VlCisJICBGaXggbWlzc2luZyBpbmRleCBpbiBzeW5jd29yZCBzZWFyY2hpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDU1ODUKKworMjAxNS0wMy0wNSAxNzo1NDo0MyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBkaXJlY3Rzb3VuZHNpbms6IGZpeCBtb2R1bG8gbWF0aCB3aXRoIHJpbmdidWZmZXIgcGFyYW1ldGVycworCSAgVG8gZ2V0IGEgbXVsdGlwbGUgb2YgYnBmIHVzZSBhIHN1YnRyYWN0aW9uIGFuZCBub3QgYW4gYWRkaXRpb24KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDU2ODQKKworMjAxNS0wMy0wNyAwMDo1NTo0NyArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IFByb3RlY3QgcHJvcGVydHkgdmFyaWFibGVzIHdpdGggdGhlIG9iamVjdCBsb2NrLgorCSAgVXNlIHRoZSBvYmplY3QgbG9jayBpbnN0ZWFkIG9mIHRoZSBzcGxpdG11eCBsb2NrIHRvIHByb3RlY3QKKwkgIGludGVybmFsIHByb3BlcnR5IHZhcmlhYmxlcywgc28gdGhleSdyZSBub3QgbG9ja2VkIHdoZW4KKwkgIHN3aXRjaGluZyB0byBhIG5ldyBmaWxlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NDQyMAorCisyMDE1LTAzLTA2IDExOjM5OjM5ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICBjaGVjazogYWRkIGppdHRlcmJ1ZmZlciB1bml0IHRlc3QKKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1NTM5CisKKzIwMTUtMDMtMDUgMDk6MTg6NTIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IEZpeCBoYW5kbGluZyBvZiBpbnRlcmxlYXZlZCAoVENQKSBzdHJlYW1zCisJICBXZSBuZWVkIHRvIHNldCB1cCB0aGUgdHJhbnNwb3J0IGluIGFueSBjYXNlLCBub3QganVzdCBpZiB3ZSBoYXZlIGEgY29udGFpbmVyCisJICBzdHJlYW0gb3IgYSBub24taW50ZXJsZWF2ZWQgc3RyZWFtLiBPbmx5IGlmIHdlIGhhdmUgYW4gaW50ZXJsZWF2ZWQgc3RyZWFtIGFuZAorCSAgYXJlIHJldHJ5aW5nLCB3ZSBzaG91bGQgbm90IHNldCB1cCB0aGUgc3RyZWFtIGFnYWluLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTU5OQorCisyMDE1LTAzLTA1IDEwOjAwOjMzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZweC9nc3R2cDlkZWMuYzoKKwkgIHZwWzg5XWRlYzogRHJvcCBmcmFtZXMgdGhhdCBoYXZlIG5vIG91dHB1dCBidWZmZXIgYmVjYXVzZSBvZiBlcnJvcnMKKwkgIGZpbmlzaF9mcmFtZSgpIGFzc3VtZXMgdGhhdCB0aGVyZSBpcyBhbiBvdXRwdXQgYnVmZmVyLgorCisyMDE1LTAzLTA1IDA5OjU2OjIzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBEb24ndCB1bnJlZiBjYXBzIHdlIGRvbid0IG93bgorCisyMDE1LTAzLTA1IDA5OjQ2OjE3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBQdXNoIFJUQ1AgY2FwcyBvbiB0aGUgUlRDUCBwYWRzCisJICBPdGhlcndpc2Ugd2Ugd2lsbCBnZXQgbm90LW5lZ290aWF0ZWQgbGF0ZXIgZnJvbSBydHBiaW4sIGFuZCB3aWxsIG5ldmVyIGJlIGFibGUKKwkgIHRvIHNlbmQgUlRDUCBwYWNrZXRzIGJhY2sgdG8gdGhlIHNlcnZlci4gTm90ZSB0aGF0IGVycm9yIGZsb3cgcmV0dXJucyBmcm9tIHRoZQorCSAgUlRDUCBwYWRzIGFyZSBpZ25vcmVkLCB0aGF0J3Mgd2h5IGl0IGRpZG4ndCBmYWlsIG1vcmUgdmlzaWJsZSBiZWZvcmUuCisKKzIwMTUtMDMtMDUgMDk6MzU6MzIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IE1ha2Ugc3VyZSB0byBzZW5kIFNFR01FTlQgZXZlbnRzIG9uIGFsbCBwYWRzCisKKzIwMTUtMDMtMDMgMTY6MjM6MTUgKzAxMDAgIFNhbnRpYWdvIENhcm90LU5lbWVzaW8gPHNhbmNhbmVAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmg6CisJICBydHA6IEFkZCBGdWxsIEludHJhIFJlcXVlc3QgKEZJUikgcGFja2V0cyB0byBzdGF0aXN0aWNzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1NTg3CisKKzIwMTUtMDMtMDMgMTY6MDE6NTMgKzAxMDAgIFNhbnRpYWdvIENhcm90LU5lbWVzaW8gPHNhbmNhbmVAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmg6CisJICBydHA6IEFkZCBQYWNrZXQgTG9zcyBJbmRpY2F0aW9uIChQTEkpIHRvIHN0YXRpc3RpY3MKKwkgIFRoaXMgaXMgaGVscGZ1bCB0byBwcm92aWRlIHN0YXRpc3RpY3MgaW4gdGhlIGZvcm1hdCBkZWZpbmVkIGluCisJICBodHRwOi8vdzNjLmdpdGh1Yi5pby93ZWJydGMtc3RhdHMvI2RpY3Rpb25hcnktcnRjcnRwc3RyZWFtc3RhdHMtbWVtYmVycy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDU1ODcKKworMjAxNS0wMy0wMyAxOToxOTo1MCArMDEwMCAgTmljb2xhIE11cmlubyA8bmljb2xhLm11cmlub0BnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkgIG1hdHJvc2thbXV4OiBSZW1vdmUgZHVyYXRpb24gYWNjdW11bGF0aW9uIGxvZ2ljCisJICBEdXJhdGlvbiBhY2N1bXVsYXRpb24gY2FuIGNhdXNlIHJvdW5kaW5nIGVycm9ycyBhbmQgZ2VuZXJhdGUgd3JvbmcKKwkgIGR1cmF0aW9uIHdpdGggZGlmZmVyZW50IGJ1ZmZlcnMgdGhhdCBzaGFyZSB0aGUgc2FtZSB0aW1lc3RhbXAuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1MTkyCisKKzIwMTUtMDMtMDMgMTg6NDA6MTYgKzAxMDAgIE5pY29sYSBNdXJpbm8gPG5pY29sYS5tdXJpbm9AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thOiBBZGQgYW4gaGVscGVyIG1ldGhvZCB0byBnZXQgYnVmZmVyIHRpbWVzdGFtcHMKKwkgIC4uLiBhbmQgcmVwbGFjZSBHU1RfQlVGRkVSX1RJTUVTVEFNUCB0aGF0IGFsd2F5cyByZXR1cm4gUFRTIHdpdGggdGhpcyBtZXRob2QKKwkgIHRoYXQgcmV0dXJuIFBUUyBvciBEVFMgYmFzZWQgb24gc3RyZWFtIHR5cGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1MTkyCisKKzIwMTUtMDMtMDQgMTE6Mjg6MTIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IEFkZCBleHBsYW5hdGlvbiB3aHkgd2UgaGF2ZSBzcGFjZSBmb3IgMzIgaGFzaCB0YWJsZXMKKwkgIEFuZCBhbHNvIGNyZWF0ZSBvbmx5IG9uZSwgdGhlcmUncyBubyBuZWVkIHlldCB0byBjcmVhdGUgYWxsIDMyIHVudGlsCisJICB3ZSBpbXBsZW1lbnQgUkZDMjc2Mi4KKworMjAxNS0wMy0wNCAxMToyNjo1NyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgUmV2ZXJ0ICJydHBzZXNzaW9uOiBEbyBub3QgdXNlIGFuIGFycmF5IG9mIG1hcHMgaWYgdGhleSBhcmUgbm90IGJlaW5nIHVzZWQiCisJICBUaGlzIHJldmVydHMgY29tbWl0IDE1OTFhZGY0Y2Q4NDNkMTNkODYyMmEzMGM2MTk0MjU2OTFhODQxMjguCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1NTg2I2MxOgorCSAgSXQncyB0aGUgYmVnaW5uaW5nIG9mIGFuIGltcGxlbWVudGF0aW9uIG9mIFJGQyAyNzYyLCB3aGljaCBpcyBuZWVkZWQgZm9yCisJICBsYXJnZSBtdWx0aWNhc3QgZ3JvdXBzLiBUaGUgaW1wbGVtZW50YXRpb24gaXMgbm90IHlldCBjb21wbGV0ZSBidXQgd2h5CisJICBub3QgbGVhdmUgd2hhdCBpcyB0aGVyZSBhbmQgaW1wbGVtZW50IFJGQyAyNzYyIGluc3RlYWQ/CisKKzIwMTUtMDMtMDQgMTA6MzU6MTIgKzAxMDAgIFNhbnRpYWdvIENhcm90LU5lbWVzaW8gPHNhbmNhbmVAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBzZXNzaW9uOiBEbyBub3QgdXNlIGFuIGFycmF5IG9mIG1hcHMgaWYgdGhleSBhcmUgbm90IGJlaW5nIHVzZWQKKwkgIHJ0cHNlc3Npb24gZGVjbGFyZXMgYW4gYXJyYXkgb2YgbWFwcyB0byBzdG9yZSBzcnJjcyBidXQgb25seSB0aGUKKwkgIHRoZSBrZXkgMCBpcyBiZWluZyB1c2VkLiBUaGlzIHBhdGNoIHJlcGxhY2VzIHRoZSBhcnJheSBvZiBtYXBzCisJICBmb3IganVzdCBvbmUgbWFwIGFuZCByZW1vdmUgdXNlbGVzcyBwYXJhbWV0ZXJzIGluIHJ0cHNlc3Npb24KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDU1ODYKKworMjAxNS0wMi0yNyAxODoxMjowOSArMDkwMCAgSmltbXkgT2huIDx5b25namluLm9obkBsZ2UuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogcmVtb3ZlIG5vdCBuZWVkZWQgY29kZQorCSAgSW4gZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5LCB0aGVyZSBpcyBub3QgbmVlZGVkIGNvZGUuCisJICBXZSBhbHJlYWR5IGNoZWNrIGFib3V0IHN0cmVhbSBpcyB2YnIgb3Igbm90IGF0IHRoZSB1cHBlciBsaW5lLgorCSAgbywgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGlzIGNvbmRpdGlvbiBiZWNhc2Ugc3RyZWFtIGlzIG5vdAorCSAgdmJyIDEwMCUgaW4gdGhpcyBjYXNlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTI3NgorCisyMDE1LTAzLTAzIDIzOjI1OjM1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9pY2xlcy9nZGtwaXhidWZvdmVybGF5LXRlc3QuYzoKKwkgIHRlc3RzOiBnZGtwaXhidWZvdmVybGF5LXRlc3Q6IHJlcGxhY2UgZGVwcmVjYXRlZCBmdW5jdGlvbgorCSAgSnVzdCBhdm9pZCB1c2luZyB0aGUgZGVwcmVjYXRlZCBmdW5jdGlvbiBlbnRpcmVseSwKKwkgIGl0J3MgZWFzeSBlbm91Z2guIERlZmluaW5nIHRoZSBtYWNybyBpcyBub3QgZW5vdWdoLgorCisyMDE1LTAzLTAzIDE5OjA0OjQ4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9pY2xlcy9nZGtwaXhidWZvdmVybGF5LXRlc3QuYzoKKwkgIHRlc3RzOiBnZGtwaXhidWZvdmVybGF5LXRlc3Q6IGZpeCBjb21waWxhdGlvbiBhZ2FpbnN0IG5ld2VyIGdkay1waXhidWYKKwkgIGdka19waXhidWZfbmV3X2Zyb21faW5saW5lKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvdXIKKwkgIG9mIEdSZXNvdXJjZS4KKworMjAxNS0wMy0wMyAxODozOToxNSArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bkBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSAgb3N4YXVkaW9zcmM6IEFsbG93IGNhcHMgcmVuZWdvdGlhdGlvbgorCSAgVGhlIHJpbmdidWZmZXIgZG9lcyBhbGxvdyByZW5lZ290aWF0aW9uLCBzbyB3ZSBkbyBub3QgaGF2ZSB0byByZXBvcnQKKwkgIGZpeGVkIGNhcHMgb25jZSBpdCBpcyBhY3F1aXJlZCAoYmFzZWQgb24gYSBzaW1pbGFyIHBhdGNoIGZvciB0aGUgc2luaworCSAgc2lkZSBieSBJbHlhIEtvbnN0YW50aW5vdiA8aWx5YS5rb25zdGFudGlub3ZAZ21haWwuY29tPikuCisKKzIwMTUtMDItMjEgMTQ6NDE6MDggKzAyMDAgIElseWEgS29uc3RhbnRpbm92IDxpbHlhLmtvbnN0YW50aW5vdkBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkgIG9zeGF1ZGlvc2luazogQWxsb3cgcmVuZWdvdGlhdGluZyBjYXBzCisJICBPbmNlIG9zeGF1ZGlvc2luaydzIGRldmljZSBpcyBvcGVuLCBpdCBmaXhhdGVzIG9uIHRoZSBpbml0aWFsIGNhcHMgYW5kCisJICByZWZ1c2VzIHRvIGFjY2VwdCBuZXcgY2Fwcy4gVGhpcyBpcyBlcnJvbmVvdXMgc2luY2UgdGhlIEF1ZGlvIFVuaXQgaXMKKwkgIGNhbiBhY2NlcHQgYSBuZXcgQVNCRCwgYW5kIEdzdEF1ZGlvUmluZ0J1ZmZlciBzdXBwb3J0cyByZWNvbmZpZ3VyYXRpb24KKwkgIGFzIHdlbGwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQzOTI1CisKKzIwMTUtMDMtMDIgMTI6MDQ6MDAgKzAxMDAgIEd3ZW5vbGUgQmVhdWNoZXNuZSA8Z3dlbm9sZS5iZWF1Y2hlc25lQGludGVsLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJhbGxvY2F0b3I6IGZpeCBmZCBsZWFrIGluIERNQUJVRiBpbXBvcnQgbW9kZS4KKwkgIEVuc3VyZSBnc3RfdjRsMl9idWZmZXJfcG9vbF9yZWxlYXNlX2J1ZmZlcigpIHJlbGVhc2VzIHRoZSBhc3NvY2lhdGVkCisJICBHc3RWNGwyTWVtb3J5R3JvdXAuIEluIHBhcnRpY3VsYXIsIHRoaXMgYWxsb3dzIGZvciBjbG9zaW5nIHRoZSBETUFCVUYKKwkgIGhhbmRsZXMgcHJpb3IgdG8gaW5zdGFudGlhdGluZyBuZXcgb25lcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDU0NDMKKworMjAxNS0wMy0wMiAxNTowNjowOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDhlbmMuYzoKKwkgIHZwOGVuYzogVXNlIDAgYXMgZHVyYXRpb24gZm9yIHRoZSBFT1MgImZyYW1lIgorCisyMDE1LTAzLTAyIDE1OjAyOjIwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZweC9nc3R2cDhlbmMuaDoKKwkqIGV4dC92cHgvZ3N0dnA5ZW5jLmM6CisJKiBleHQvdnB4L2dzdHZwOWVuYy5oOgorCSAgdnB7OCw5fWVuYzogVGVsbCB0aGUgZW5jb2RlciBhYm91dCBhY3R1YWwgdGltZXN0YW1wcyBhbmQgZHVyYXRpb25zIG9mIGZyYW1lcworCSAgLi4uIGluc3RlYWQgb2YganVzdCBjb3VudGluZyBmcmFtZXMuIFRoZSB2YWx1ZXMgYXJlIHN1cHBvc2VkIHRvIGJlIGluIHRpbWViYXNlCisJICB1bml0cywgbm90IGZyYW1lIHVuaXRzLiBUaGlzIGZpeGVzIHZhcmlvdXMgcXVhbGl0eSBwcm9ibGVtcyB3aXRoIFZQOC9WUDkKKwkgIGVuY29kaW5nIGFuZCBpbiBnZW5lcmFsIG1ha2VzIHRoZSBlbmNvZGVyIGJlaGF2ZSBiZXR0ZXIuCisJICBUaGFua3MgdG8gTmlyYmhlZWsgQ2hhdWhhbiBmb3Igbm90aWNpbmcgdGhpcyBidWcuCisKKzIwMTUtMDMtMDEgMTM6NTY6MTcgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZweC9nc3R2cDlkZWMuYzoKKwkgIHZweGRlYzogRml4IGNhbGN1bGF0aW9uIG9mIHdpZHRoIGluIGJ5dGVzCisJICBSaWdodCBub3cgd2Ugb25seSBzdXBwb3J0IEk0MjAsIGJ1dCB2cHggc2VlbXMgdG8gc3VwcG9ydCBtb3JlIGZvcm1hdHMuCisJICBUaGlzIHdpbGwgcHJldmVudCBoYXJkIHRvIGZpbmQgYnVnIGluIHRoZSBmdXR1cmUuCisKKzIwMTUtMDMtMDEgMTM6NTI6NTAgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZweC9nc3R2cDlkZWMuYzoKKwkgIHZweGRlYzogRG9uJ3QgbWVtY3B5IGluIGZyYW1lIG1hcCBmYWlsZWQKKwkgIFRoaXMgYXZvaWQgYSBjcmFzaCBpZiBtYXBwaW5nIHRoZSBmcmFtZSBmYWlsZWQuCisKKzIwMTUtMDMtMDEgMTM6NDg6NDUgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IEFkZCBtaXNzaW5nIGJyZWFrCisJICBUaGlzIGlzIGNvc21ldGljIGNoYW5nZS4KKworMjAxNS0wMy0wMSAxMzo0NjoxOCAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSAgdjRsMjogV29ya2Fyb3VuZCBkcml2ZXIgbm90IHNldHRpbmcgZmllbGQgY29ycmVjdGx5CisJICBBcyBpdCdzIHZlcnkgY29tbW9uLCBoYW5kbGUgZHJpdmVyIG5vdCBzZXR0aW5nIGZpZWxkIGluIGJ1ZmZlcnMKKwkgIGJ5IHVzaW5nIHRoZSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBmb3JtYXQuIFRoaXMgd29ya2Fyb3VuZCBhIGxvbmcgdGltZQorCSAgYnVnIGluIFVWQyBkcml2ZXIuIEZvciBldmVuIGJ1Z2dpZXIgZHJpdmVyLCB3ZSBzaW1wbHkgYXNzdW1lCisJICBwcm9ncmVzc2l2ZSBhcyBiZWZvcmUuIFdlIGFsc28gb25seSB3YXJuIG9uY2UsIHRvIGF2b2lkIHNwYW1taW5nLgorCisyMDE1LTAyLTI4IDE4OjEwOjA2ICswMTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBrZXkgdW5pdCBzZWVrCisJICBVbmxpa2UgbWFueSBvdGhlciBzZWVrIGZsYWdzLCB0aGUgS0VZX1VOSVQgc2VlaworCSAgZmxhZyBpcyBub3QgY29waWVkIG92ZXIgaW50byB0aGUgR3N0U2VnbWVudCwKKwkgIHNpbmNlIGl0J3Mgb25seSByZWxldmFudCBmb3IgdGhlIHNlZWsgaXRzZWxmLAorCSAgc28gd2UgbmVlZCB0byBwYXNzIGl0IGV4cGxpY2l0bHkgdG8gdGhlIHNlZWsKKwkgIGhhbmRsZXIgaGVyZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDUzMzkKKworMjAxNS0wMi0yNyAwOTozODowMSArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkgIGRvY3MvcGx1Z2luczogVXBkYXRlcworCisyMDE1LTAyLTI2IDIzOjQxOjQ3ICswMTAwICBOaWNvbGEgTXVyaW5vIDxuaWNvbGEubXVyaW5vQGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eC9kZW11eDogaW5pdGlhbGl6ZSBkdHNfb25seQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTE5MgorCisyMDE1LTAyLTI2IDIzOjI4OjExICswMTAwICBOaWNvbGEgTXVyaW5vIDxuaWNvbGEubXVyaW5vQGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHN0b3JlIERUUyBmb3IgVl9NUy9WRlcvRk9VUkNDIHN0cmVhbXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDUxOTIKKworMjAxNS0wMi0yNiAxOTo0ODozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYzoKKwkgIG11bHRpZmlsZTogYXR0ZW1wdCB0byBmaXggZG9jcyBidWlsZCBpc3N1ZSBvbiBidWlsZCBib3QKKworMjAxNS0wMi0yNyAwMDo0MTo0NiArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Z2l0QGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkgIGludGVybGVhdmU6IERyb3AgY3VzdG9tIGxhdGVuY3kgcXVlcnkgaGFuZGxpbmcKKwkgIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGRlZmF1bHQgcXVlcnkgaGFuZGxlciBub3cuCisKKzIwMTUtMDItMjcgMDA6NDA6MDUgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGdpdEBhcnVucmFnaGF2YW4ubmV0PgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogRHJvcCBjdXN0b20gbGF0ZW5jeSBxdWVyeWluZyBsb2dpYworCSAgVGhpcyBpcyBub3cgaW1wbGVtZW50ZWQgaW4gdGhlIGRlZmF1bHQgbGF0ZW5jeSBxdWVyeSBoYW5kbGVyLgorCisyMDE1LTAyLTI2IDE2OjEwOjQxICswMTAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJybkBheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkgIHJ0cHZvcmJpc3BheTogZml4IHBheWxvYWRlciBkZXNjcmlwdGlvbiBhbmQgYXV0aG9yIGUtbWFpbAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTIyNgorCisyMDE0LTA5LTA1IDE2OjM0OjI2ICswMjAwICBBdXLDqWxpZW4gWmFuZWxsaSA8YXVyZWxpZW4uemFuZWxsaUBwYXJyb3QuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMjogcXVlcnkgY3JvcCBjb25maWd1cmF0aW9uIGFmdGVyIGVhY2ggY2FsbCBvZiBTX0NST1AKKwkgIFNfQ1JPUCBpb2N0bCBpcyB3cml0ZS1vbmx5IGFuZCB0aGUgZGV2aWNlIGNhbiBhZGp1c3QgY3JvcCByZWN0YW5nbGUgc28KKwkgIHdlIHF1ZXJ5IGJhY2sgdGhlIGNyb3AgY29uZmlndXJhdGlvbiBhZnRlciBlYWNoIFNfQ1JPUCB0byBrbm93IHdoYXQgaGFzCisJICBiZWVuIGRvbmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2MTMzCisKKzIwMTUtMDItMjYgMDI6MTI6MTggKzAxMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgbWF0cm9za2FkZW11eDogVl9NUy9WRlcvRk9VUkNDIHN0cmVhbXMgaGF2ZSBEVFMgaW5zdGVhZCBvZiBQVFMKKwkgIFdoZW4gc3VjaCBzdHJlYW0gaXMgcHJlc2VudCBkZW11eGVyIHNob3VsZCBzZXQgRFRTIG9uIGJ1ZmZlcnMgaW5zdGVhZAorCSAgb2YgUFRTLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBob3cgVkxDIGFuZCBsaWJhdi9mZm1wZWcgaGFuZGxlIFZGVworCSAgc3RyZWFtcy4KKwkgIFNhbXBsZSBmaWxlCisJICBodHRwczovL3MzLmFtYXpvbmF3cy5jb20vTWF0ZWpLL1NhbXBsZXMvTWF0cm9za2EtVkZXLURUUy1Pbmx5Lm1rdgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTE5MgorCisyMDE1LTAyLTI1IDE2OjQ1OjExIC0wODAwICBBbGVpeCBDb25jaGlsbG8gRmxhcXXDqSA8YWxlaXhAb2Jsb25nLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBDaGVjayBjb3JydXB0aW9uIGZsYWcgb24gdGhlIHJpZ2h0IGJ1ZmZlcgorCSAgV2Ugd2hlcmUgY2hlY2tpbmcgdGhlIGJ1ZmZlciB3ZSBhcmUgY29weWluZyB0byBpbnN0ZWFkIG9mIHRoZSBidWZmZXIgd2UKKwkgIGFyZSBjb3B5aW5nIGZyb20uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQwMDQwCisKKzIwMTUtMDEtMTkgMTU6Mjk6MjQgKzAxMDAgIEF1csOpbGllbiBaYW5lbGxpIDxhdXJlbGllbi56YW5lbGxpQHBhcnJvdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IHNldCBjb2xvcnNwYWNlIGluIGNhcHMgZm9yIGNhcHR1cmUgZGV2aWNlcworCSAgVGhpcyBpbmZvcm1hdGlvbiBpcyBzZXQgYnkgdGhlIGRyaXZlciBmb3IgYSBjYXB0dXJlIGRldmljZSwgYW5kIHNvIGNvdWxkCisJICBiZSBmb3J3YXJkZWQgdG8gcGlwZWxpbmUgYnkgc2V0dGluZyB0aGUgY29sb3JpbWV0cnkgaW4gY2Fwcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDMxODYKKworMjAxNC0xMC0wNiAxNzozMDowNiArMDIwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIHY0bDJidWZmZXJwb29sOiBmaXggaW1wb3J0X3VzZXJwdHIoKSBpbiBzaW5nbGUtcGxhbmFyIEFQSSB3aGVuIG5fcGxhbmVzID4gMQorCSAgSW4gdGhlIFY0TDIgc2luZ2xlLXBsYW5hciBBUEksIHdoZW4gZm9ybWF0IGlzIHNlbWktcGxhbmFyL3BsYW5hciwKKwkgIGRyaXZlcnMgZXhwZWN0IHRoZSBwbGFuZXMgdG8gYmUgY29udGlndW91cyBpbiBtZW1vcnkuCisJICBTbyB0aGlzIGNvbW1pdCBjaGFuZ2UgdGhlIHdheSB3ZSBoYW5kbGUgc2VtaS1wbGFuYXIvcGxhbmFyIGZvcm1hdAorCSAgKG5fcGxhbmVzID4gMSkgd2hlbiB3ZSB1c2UgdGhlIHNpbmdsZS1wbGFuYXIgQVBJIChncm91cC0+bl9tZW0gPT0gMSkuCisJICBUbyBjaGVjayB0aGF0IHBsYW5lcyBhcmUgY29udGlndW91cyBhbmQgaGF2ZSBleHBlY3RlZCBzaXplLCBpZTogbm8KKwkgIHBhZGRpbmcuIFdlIHRlc3QgdGhlIGZhY3QgdGhhdCBwbGFuZSAnaScgc3RhcnQgYWRkcmVzcyArIHBsYW5lICdpJworCSAgZXhwZWN0ZWQgc2l6ZSBlcXVhbHMgdG8gcGxhbmUgJ2kgKyAxJyBzdGFydCBhZGRyZXNzLiBJZiBub3QsIHdlIHJldHVybgorCSAgaW4gZXJyb3IuCisJICBNYXRoIGFyZSBkb25lIGluIGJ1ZmZlcnBvb2wgcmF0aGVyIHRoYW4gaW4gYWxsb2NhdG9yIGJlY2F1c2UgdGhlCisJICBmb3JtZXIgaXMgYXdhcmUgb2YgdmlkZW8gaW5mby4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzgwMTMKKworMjAxNS0wMS0yMyAxMDoxNTo0NiArMDEwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJhbGxvY2F0b3I6IGxldCBidWZmZXJwb29sIGNhbGN1bGF0ZSBpbWFnZSBzaXplIHdoZW4gaW1wb3J0aW5nIHVzZXJwdHIKKwkgIE9mZnNldCBhcmUgcmVsYXRpdmUgdG8gdGhlIGJ1ZmZlciBhbmQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHN1YnN0cmFjdGluZworCSAgdGhlbSB3aWxsIGdpdmUgdXMgdGhlIHBsYW5lIHNpemUuIFNvIHdlIGxldCBidWZmZXJwb29sIG1ha2UgdGhlIG1hdGggYXMKKwkgIGl0IGlzIG1vcmUgYXdhcmUgb2YgdmlkZW8gaW5mbyB0aGFuIGFsbG9jYXRvciBhbmQgcGFzcyBhIHNpemUgYXJyYXkgdG8KKwkgIGFsbG9jYXRvciBpbXBvcnQgZnVuY3Rpb24uCisJICBQb2ludGVkIG91dCBieSBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM4MDEzCisKKzIwMTQtMTItMTEgMTY6MTM6MTUgKzAxMDAgIFBoaWxpcHBlIERlIE11eXRlciA8cGhkbUBtYWNxZWwuYmU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IHJlY29nbml6ZSBhbmQgZGlzdGluZ3Vpc2ggYWxsIGJheWVyIGFycmFuZ2VtZW50cworCSAgVXAgdG8gbm93LCB2NGwyc3JjIHJlY29nbml6ZWQgb25seSAiYmdnciIgYW1vbmdzdCB0aGUgYmF5ZXIgYXJyYW5nZW1lbnRzLgorCSAgUmVjb2duaXplIG5vdyBhbHNvIHRoZSAicmdnYiIsICJnYnJnIiBhbmQgImdyYmciIGFycmFuZ2VtZW50cy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDIzNjMKKworMjAxNS0wMS0xNSAxNjoxMTo1MyArMDEwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBzZXQgdjRsMl9idWZmZXIuZmllbGQgd2hlbiBxdWV1aW5nIGJ1ZmZlciBpbiBhbiBvdXRwdXQgZGV2aWNlCisJICBBY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc3BlY2lmaWNhdGlvbiwgYXBwbGljYXRpb24gbXVzdCBzZXQgdGhpcyBmaWVsZAorCSAgZm9yIGFuIG91dHB1dCBkZXZpY2UuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQzMDEzCisKKzIwMTUtMDItMjQgMDU6NTc6MjQgKzAyMDAgIElseWEgS29uc3RhbnRpbm92IDxpbHlhLmtvbnN0YW50aW5vdkBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2NvbW1vbi5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2NvbW1vbi5oOgorCSAgb3N4YXVkaW9zcmM6IGlPUyByZXNhbXBsaW5nIGNhdXNlcyBzdHV0dGVyaW5nCisJICBGaXhlcyBzdHV0dGVyaW5nIGF1ZGlvIHdoZW4gaU9TIEFVIGlzIHJlc2FtcGxpbmcuIFRvIG1ha2UgQVUgcmVzYW1wbGUsCisJICBvbmUgaGFzIHRvIHJlcXVlc3QgYSByYXRlIHRoYXQgZGlmZmVycyBmcm9tIEFWQXVkaW9TZXNzaW9uJ3MKKwkgIHNhbXBsZVJhdGUuIFRoZSByZXNhbXBsaW5nIGl0c2VsZiBpcyBub3QgdGhlIGN1bHByaXQsIGJ1dCByYXRoZXIgb3VyCisJICBBUEkgbWlzdXNlLgorCSAgQXVkaW9Vbml0UmVuZGVyIG1vZGlmaWVzIHRoZSBtRGF0YUJ5dGVTaXplIG1lbWJlcnMgd2l0aCB0aGUKKwkgIGFjdHVhbCByZWFkIGJ5dGVzIGNvdW50LiBUaGVyZWZvcmUsIHRoZXkgbXVzdCBiZSByZWluaXRpYWxpemVkCisJICBiZWZvcmUgZWFjaCBBdWRpb1VuaXRSZW5kZXIuIChUaGUgYnVmZmVycyB0aGVtc2VsdmVzIGNhbiBiZQorCSAgcHJlYWxsb2NhdGVkLikKKwkgIFRoZSAic3R1dHRlciIgd2FzIGNhdXNlZCBieSBvbmUgQXVkaW9Vbml0UmVuZGVyIG1ha2luZyB0aGUgYnVmZmVyCisJICB0b28gc21hbGwgZm9yIG90aGVyIEF1ZGlvVW5pdFJlbmRlciBpbnZvY2F0aW9ucywgbWFraW5nIHRoZW0gZmFpbAorCSAgd2l0aCAtNTAgKHBhcmFtRXJyKS4gQnkgd2F5IG9mIGx1Y2ssIHdoZW4gQVUgZGlkbid0IHJlc2FtcGxlLCBhbGwKKwkgIEF1ZGlvVW5pdFJlbmRlciBpbnZvY2F0aW9ucyByZWFkIHRoZSBzYW1lIG51bWJlciBvZiBieXRlcy4KKwkgIChUaGlzIHBhdGNoIGFkZHJlc3NlcyBzb21lIG5vbi1pbnRlcmxlYXZlZCBhdWRpbyBjb25jZXJucywgYnV0CisJICBhdCB0aGlzIG1vbWVudCB0aGUgZWxlbWVudHMgZG8gbm90IHN1cHBvcnQgbm9uLWludGVybGVhdmVkIGF1ZGlvCisJICBhbmQgbm9uLWludGVybGVhdmVkIGlzIHVudGVzdGVkLikKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDQ5MjIKKworMjAxNS0wMi0yMiAwMTo0OTo1MiArMDEwMCAgS3J6eXN6dG9mIEtvdGxlbmdhIDxwb2Nla0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGltcHJvdmUgZXJyb3IgbWVzc2FnZSB3aGVuIHVuYXV0aG9yaXplZAorCSAgTWFrZSB1c2Ugb2YgTk9UX0FVVEhPUklaRUQgZXJyb3IgY29kZSBpbnN0ZWFkIG9mIGZhbGxpbmcgYmFjayB0byBnZW5lcmljCisJICBSRUFEIGVycm9yLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYwMTczMworCisyMDE1LTAyLTIzIDIwOjA2OjI1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzoKKwkgIHhpbWFnZXNyYzogcmVtb3ZlIHBvaW50bGVzcyBnX3JldHVybl92YWxfaWZfZmFpbCgpCisJICB4aW1hZ2Ugd29uJ3QgZXZlciBiZSBOVUxMIGhlcmUgYmVjYXVzZSB0aGUgZGlzcG9zZQorCSAgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSB4aW1hZ2UtPmRpc3Bvc2UoKS4KKworMjAxNS0wMi0yMyAxOTo0MDoyNSArMDEwMCAgVGhpYmF1bHQgU2F1bmllciA8dHNhdW5pZXJAZ25vbWUub3JnPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEFsbCBzZWdtZW50IHJlc3VsdGluZyBmcm9tIGEgc2VlayBzaG91bGQgaGF2ZSB0aGUgc2FtZSBzZXFudW0KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDQ5ODMKKworMjAxNS0wMi0xOSAyMzoxMjozMSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogRW5hYmxlIGNvcHkgd2hlbiBubyBrbm93biBhbGxvY2F0aW9uIHBhcmFtcworCSAgV2hlbiB0aGVyZSBpcyBubyBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgaW4gdGhlIHF1ZXJ5LCBlbmFibGUgY29weQorCSAgdGhyZXNob2xkLiBXaGVuIHRoaXMgdGhyZXNob2xkIGlzIHJlYWNoZWQsIHRoZSBidWZmZXIgcG9vbCB3aWxsIHN0YXJ0CisJICBjb3B5aW5nIHdoZW4gdGhlIHBvb2wgcmVhY2hlcyBhIGNyaXRpY2FsIGxldmVsLiBJZiB0aGUgZHJpdmVyIHN1cHBvcnRzCisJICBDUkVBVEVfQlVGUywgdGhpcyB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KKworMjAxNS0wMi0xOSAyMzowODozNCAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogVXBkYXRlIGFsbG9jYXRvciBmbGFncworCSAgV2hlbiB3ZSBoaXQgZW11bGF0ZWQgZm9ybWF0cywgd2UgZGlzYWJsZSBDUkVBVEVfQlVGUyBzaW5jZSBsaWJ2NGwyCisJICBjb3BlIHZlcnkgYmFkbHkgd2l0aCBpdC4gQWxzbyBjbGVhciB0aGUgYWxsb2NhdG9yIGZsYWdzIHNvIHdlIHdpbGwKKwkgIG5ldmVyIHRyeSB0byBhbGxvY2F0ZSBtb3JlIGJ1ZmZlcnMuIFRoaXMgZml4ZXMgZmFpbHVyZSB3aGVuIHRoZSBjb3B5CisJICB0aHJlc2hvbGQgaXMgcmVhY2hlZCBhcyB3ZSB3aGVyZSBjYWxsaW5nIENSRUFURV9CVUZTLCB3aGljaCBsZWFkIHRvCisJICBsaWJ2NGwyIGluc3RhYmlsaXR5LgorCisyMDE1LTAyLTE5IDIzOjA3OjIzIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBVc2Ugc3BlY2lmaWMgZGVidWcgY2F0ZWdvcnkKKwkgIFRoZSBwb29sIGhhcyBncm93biBlbm91Z2ggdGhhdCBpdCBpcyBub3cgaGFuZHkgdG8gc2VwZXJhdGUgdjRsMm9iamVjdAorCSAgdHJhY2UgZnJvbSB2NGwyYnVmZmVycG9vbCB0cmFjZS4KKworMjAxNS0wMi0xOSAxNDoyOTowMiArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5LmM6CisJICBydHB2cDhwYXk6IGRlZmF1bHQgZW5jb2RpbmcgbmFtZSB0byBWUDgKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzc4MTAKKworMjAxNS0wMi0xOSAxNDowNjo1MSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5LmM6CisJICBydHB2cDhwYXk6IG1ha2UgY2FwcyB3cml0YWJsZSBiZWZvcmUgdHJ1bmNhdGluZyB0aGVtCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3ODEwCisKKzIwMTUtMDItMDUgMTA6Mjk6MjYgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOHBheS5jOgorCSAgcnRwdnA4cGF5OiBuZWdvdGlhdGUgZW5jb2RpbmcgbmFtZQorCSAgQ2hyb21lIHVzZXMgYSBkaWZmZXJlbnQgb25lIHRoYW4gZ3N0cmVhbWVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNzgxMAorCisyMDE1LTAyLTE5IDEyOjM1OjA3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBTZW5kIGluaXRpYWwgZXZlbnRzIG9uIHN5bmNfcnRjcCBwYWQgd2hlbiB1c2luZyBSVFAvUlRDUCBtdXhpbmcKKwkgIE90aGVyd2lzZSB3ZSB3aWxsIGp1c3Qgc2VuZCBidWZmZXJzIG9uIHRoZSBwYWQgd2l0aG91dCBhbnkgZXZlbnRzIGJlZm9yZWhhbmQKKwkgIGFuZCB3aWxsIGdldCBnX3dhcm5pbmdzKCkgYWJvdXQgdGhhdC4KKworMjAxNS0wMi0xOSAxMToyMDo1MSArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICBqYWNrOiBjYXNlIG1pc3NpbmcgYnJlYWsgc3RhdGVtZW50CisJICBjb21taXQgYjEwOThjMmVhNWVhYmVhN2FmMDhjZTUxZDIyYjg2N2VhZWQyYmJlMiBhZGRlZCBhIG5ldyBjYXNlIGluCisJICBnc3RfamFja19hdWRpb19zcmNfZ2V0X3Byb3BlcnR5KCkgYnV0IGZvcmdvdCB0byBhZGQgdGhlIGJyZWFrIHN0YXRlbWVudCB0byBpdC4KKworMjAxNS0wMi0xOCAxOToxODowMCArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSAgUmV2ZXJ0ICJ2NGwyOiBmcmFjdGlvbiBpcyByZXZlcnNlZCIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgYjkxZmUzNjY0NGIxNWFlMDcwZDcyYjllOGE5YzcwODdlODJhZWYxMi4KKworMjAxNS0wMi0xOCAxNzo0OToyOSArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSAgdjRsMjogZnJhY3Rpb24gaXMgcmV2ZXJzZWQKKwkgIEluIHRoZSBmcmFjdGlvbiAxIC8gMi4gMSBpcyB0aGUgbnVtZXJhdG9yIGFuZCAyIGlzIHRoZSBkZW5vbWluYXRvci4KKwkgIFRoZSBhcmd1bWVudHMgb2YgZnJhY3Rpb24gZ3N0X3ZhbHVlX3NldF9mcmFjdGlvbnMoKSBhcmUgdmFsdWUsCisJICBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yLgorCSAgQWxzbywgZ3N0X3ZhbHVlX3NldF9mcmFjdGlvbigpIGZhaWxzIGlmIGRlbm9taW5hdG9yIGlzIDAgZm9yIG9idmlvdXMKKwkgIHJlYXNvbnMuCisKKzIwMTUtMDItMTcgMjA6MjY6NTUgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMnBvb2w6IERlYWN0aXZhdGUgb3RoZXIgcG9vbAorCSAgV2hlbiBpbXBvcnRpbmcgYnVmZmVycyBmcm9tIGEgZG93bnN0cmVhbSBwb29sLCB3ZSBuZWVkIHRvIGRlYWN0aXZhdGUKKwkgIHRoYXQgcG9vbCB0byBlbnN1cmUgaXQgd2lsbCBiZSB1c2FibGUgYWdhaW4gbGF0ZXIuIFJlbHlpbmcgb24gdGhlCisJICByZWZjb3VudCB0byByZWFjaCB6ZXJvIGRvZXMgbm90IHdvcmssIHNpbmNlIGVsZW1lbnRzIGxpa2UgeHZpbWFnZXNpbmsKKwkgIGtlZXBzIGEgcmVmZXJlbmNlIG9uIHRoZWlyIHByb3Bvc2VkIHBvb2wuCisKKzIwMTUtMDItMTggMTA6MTA6NTMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdG11eDogcmVtb3ZlIG5vdCBuZWVkZWQgY29uZGl0aW9uCisJICBnc3RfYnVmZmVyX3JlcGxhY2UgY2FuIGhhbmRsZSBOVUxMIGlucHV0cyBieSBpdHNlbGYKKworMjAxNS0wMi0xOCAwOTo0MDoxNCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHByZWZlciB0aGUgdGZkdCB0aW1lc3RhbXAgb3ZlciB0aGUgYnVmZmVyJ3MgdGhhdCBpcyBsZXNzIGFjY3VyYXRlCisJICBUaGUgdGZkdCBzaG91bGQgYmUgbW9yZSBhY2N1cmF0ZSBhcyB0aGUgYnVmZmVyIHRpbWVzdGFtcCBpcyBwcm92aWRlZAorCSAgYnkgdGhlIGZyYWdtZW50ZWQgZm9ybWF0IG1hbmlmZXN0IGFuZCBpdCBtaWdodCBqdXN0IGJlIGFuIGFwcHJveGltYXRpb24uCisKKzIwMTUtMDItMTcgMTY6NTc6NTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBXaGVuIHJlc2V0dGluZyB0aGUgaml0dGVyYnVmZmVyIGJlY2F1c2Ugb2YgcGFja2V0IGRpc2NvbnQsIGRvbid0IGZsdXNoIHN0aWNreSBldmVudHMKKwkgIFdlIHdpbGwgb3RoZXJ3aXNlIGZsdXNoIGF3YXkgU1RSRUFNX1NUQVJULCBDQVBTIG9yIFNFR01FTlQgZXZlbnRzIGFuZCB3aWxsCisJICBjb25mdXNlIGRvd25zdHJlYW0gd2l0aCBidWZmZXJzIHRoYXQgY29tZSBiZWZvcmUgc3VjaCBldmVudHMuCisKKzIwMTUtMDItMTcgMTI6MjA6NTcgKzAxMDAgIGhhcmsgPGhhcmtAcHVzY2lpLm5sPgorCisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmg6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5oOgorCSAgamFjazogQWRkIHByb3BlcnR5IHBvcnQtcGF0dGVybiB0byBzcGVjaWZ5IHdoaWNoIEpBQ0sgcG9ydHMgdG8gY29ubmVjdCB0bworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MDcxOQorCisyMDE1LTAyLTE3IDEyOjMxOjA2ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdGlzb2ZmLmM6CisJKiBnc3QvaXNvbXA0L2dzdGlzb2ZmLmg6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIGlzb21wNDogUmVkZWZpbmUgZ3N0X2lzb2ZmXyBzeW1ib2xzIHRvIGdzdF9pc29mZl9xdF8KKwkgIFdlIG5lZWQgZGlmZmVyZW50IHN5bWJvbCBuYW1lcywgYmVjYXVzZSB0aGVzZSBzeW1ib2xzIGFyZSBhbHNvIHByZXNlbnQKKwkgIGluIHRoZSBmcmFnbWVudGVkIHBsdWdpbiAuLi4gd2hpY2ggd2lsbCBjYXVzZSBjb25mbGljdHMgd2hlbiBkb2luZworCSAgc3RhdGljIGxpbmtpbmcKKworMjAxNS0wMi0xNiAxNDozMTowNSArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L2dvb20yazEvbGluZXMuYzoKKwkgIGdvb20yazE6IHVzZSBmcmFjdGlvbmFsIHBhcnQgb2YgZmxvYXQgZGl2aXNpb24KKworMjAxNS0wMi0xNiAxMzo1OToxNCArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkgIHNwbGl0bXV4c2luOiByZW1vdmUgZGVhZCBjb2RlCisJICBFdmVyeSBpbnN0YW5jZSBvZiBnb3RvIGJlYWNoIGhhcyBidWZfaW5mbyBlcXVhbCBOVUxMLiBEb24ndCBjaGVjaworCSAgZm9yIGEgY29uZGl0aW9uIHRoYXQgbmV2ZXIgaGFwcGVucy4KKwkgIENJRCAjMTI2ODM5OQorCisyMDE1LTAyLTE1IDIxOjQ1OjI0IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc3BsaXRtdXguYzoKKwkgIHNwbGl0bXV4LXRlc3Q6IFBhcnNlIGVycm9yIG1lc3NhZ2UKKwkgIFRoZSB0ZXN0IGhhZCBhIGZ1bmN0aW9uIHRvIHByaW50IHRoZSBlcnJvciwgYnV0IHdhcyBub3QgcGFyc2luZyBpdC4KKwkgIFRoaXMgd2FzIGNhdXNpbmcgd2FybmluZyBhYm91dCBkYmdfaW5mbyBiZWluZyB1c2VkIHVuaW5pdGlhbGl6ZWQuIElmCisJICB0aGUgdGVzdCB3YXMgdGVzdGluZyBhbnkgZXJyb3JzLCB0aGlzIHdvdWxkIGhhdmUgY3Jhc2hlZC4KKworMjAxNS0wMi0xNSAyMTozNDoyOCAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IEZpeCBtaW4gYW5kIG1heCBmb3IgYmFuZHMgcHJvcGVydHkKKwkgIFRoZSBudW1iZXIgb2YgRkZUcyBpcyBjYWxjdWxhdGVkIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtdWxhOgorCSAgZ3VpbnQgbmZmdCA9IDIgKiBiYW5kcyAtIDI7CisJICBuZmZ0IGlzIHBhc3NlZCB0byBnc3RfZmZ0X2YzMl9uZXcoKSBhcyB0aGUgbGVuIGFyZ3VtZW50IGFuZCBpcyBvZiB0eXBlCisJICB1bnNpZ25lZCBpbnRlZ2VyLiBUaGlzIG1ldGhvZCByZXF1aXJlZCB0aGF0IGxlbiBpcyBhdCBsZWFzIDEsIHRoZW4KKwkgIG1heGltdW0gR19NQVhJTlQsIGFzIG90aGVyIHZhbHVlcyB3b3VsZCBiZSBuZWdhdGl2ZS4gSWYgd2UgZXh0cmFwb2xhdGUKKwkgIGZyb20gdGhlIGZvcm11bGEgYWJvdmUgaXQgbWVhbnMgd2UgbmVlZCAiYmFuZHMiIHRvIGJlIGJldHdlZW4gMiBhbmQKKwkgICgoZ3VpbnQpR19NQVhJTlQgKyAyKSAvIDIpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NDIxMworCisyMDE1LTAyLTE1IDE1OjUxOjU1IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogRml4IGZyZWVpbmcgb2Ygc2hhcmVkIG1lbW9yeQorCSAgV2hlbiBtZW1vcnkgKHRoYXQgaGFzIGJlZW4gc2hhcmVkIHVzaW5nIGdzdF9tZW1vcnlfc2hhcmUoKSkgYXJlIGZyZWVkLAorCSAgdGhlIG1lbW9yeSAob3IgdGhlIERNQUJVRiBGRCkgc2hvdWxkIG5vdCBiZWUgZnJlZWQuIFRoZXNlIG1lbW9yaWVzIGhhdmUKKwkgIGEgcGFyZW50LiBUaGlzIGFsc28gcmVtb3ZlcyB0aGUgZXh0cmEgX3Y0bDJtZW1fZnJlZSBmdW5jdGlvbiBhbmQgYXZvaWQKKwkgIGNhbGxpbmcgY2xvc2UgdHdpY2Ugb24gdGhlIERNQUJVRiBGRC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDQ1NzMKKworMjAxNS0wMi0xNCAxMToxMTozMCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGRvIG5vdCB1c2Ugc3BhcnNlIHN0cmVhbXMgaW4gcHVzaC1iYXNlZCBzZWVraW5nCisJICBVc2luZyB0aGUgc3BhcnNlIHN0cmVhbXMgY2FuIG1ha2UgdGhlIHB1c2gtYmFzZWQgc2Vla2luZyByZXR1cm4KKwkgIHRvbyBmYXIgaW4gdGhlIHN0cmVhbS4gSXQgYWxzbyBjYW4gbGVhZCB0byBpc3N1ZXMgYXMgdGhlCisJICBzcGFyc2Ugc3RyZWFtcyB3aWxsIGJlIGlnbm9yZWQgd2hlbiByZXN0YXJ0aW5nIHBsYXliYWNrIGFuZCwKKwkgIGlmIHRoZSBzcGFyc2Ugc3RyZWFtIGlzIHRoZSBvbmUgdGhhdCBoYXMgdGhlIGVhcmxpZXN0IHNhbXBsZSwKKwkgIGl0IHdpbGwgY29uZnVzZSBxdGRlbXV4J3Mgb2Zmc2V0cyBhcyBvbmUgc3RyZWFtIHdpbGwgaGF2ZQorCSAgYW4gZWFybGllciBvZmZzZXQgdGhhbiB0aGUgZGVtdXhlcidzIG9uZSB3aGljaCBtaWdodCBsZWFkIHRvCisJICBlYXJseSBFT1MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQyNjYxCisKKzIwMTUtMDItMTMgMTk6NDM6MTYgKzA5MDAgIEppbW15IE9obiA8eW9uZ2ppbi5vaG5AbGdlLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBFbmhhbmNlIGNvZGUgcmVhZGFiaWxpdHkgaW4gcHVsc2VzaW5rX3F1ZXJ5CisJICBJbiBwdWxzZXNpbmtfcXVlcnkgZnVuY3Rpb24sIHdlIHVzZSBhIHN3aXRjaCBmb3IgdGhlIHF1ZXJ5CisJICB0eXBlLiBJbiB0aGUgQ0FQUyBjYXNlLCB0aGVyZSBpcyBubyAnYnJlYWsnLCBpbnN0ZWFkIHdlCisJICByZXR1cm4gcmlnaHQgYXdheS4gVXNlIGEgYnJlYWsgYW5kIHJldHVybiBhdCB0aGUgZW5kIG9mCisJICB0aGUgZnVuY3Rpb24gaW5zdGVhZCBmb3IgYmV0dGVyIGNvZGUgcmVhZGFiaWxpdHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ0NDYxCisKKzIwMTUtMDItMTMgMjA6NDA6NDggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IGZsYWcgYXMgc2luayBmcm9tIHRoZSBzdGFydAorCisyMDE1LTAyLTExIDE1OjMwOjQ0ICswMTAwICBQaGlsaXBwZSBOb3JtYW5kIDxwaGlsbkBpZ2FsaWEuY29tPgorCisJKiBnc3QvaXNvbXA0L01ha2VmaWxlLmFtOgorCSogZ3N0L2lzb21wNC9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvZ3N0aXNvZmYuYzoKKwkqIGdzdC9pc29tcDQvZ3N0aXNvZmYuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4Lmg6CisJICBxdGRlbXV4OiBJbml0aWFsICdzaWR4JyBhdG9tIHBhcnNpbmcgc3VwcG9ydAorCSAgUGFyc2UgdGhlICdzaWR4JyBhdG9tIGFuZCB1cGRhdGUgdGhlIHRvdGFsIGR1cmF0aW9uIGFjY29yZGluZyB0byB0aGUKKwkgIHBhcnNlciByZXN1bHQuIFRoZSBpc29mZiBwYXJzZXIgY29kZSBpcyBpbXBvcnRlZCBmcm9tCisJICBnc3QtcGx1Z2lucy1iYWQncyBkYXNoZGVtdXggYW5kIGEgZ3N0X2lzb2ZmX3NpZHhfcGFyc2VyX2FkZF9kYXRhKCkKKwkgIGZ1bmN0aW9uIHdhcyBmYWN0b3JlZCBvdXQgb2YgdGhlIGdzdF9pc29mZl9zaWR4X3BhcnNlcl9hZGRfYnVmZmVyKCkKKwkgIGZ1bmN0aW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MzU3OAorCisyMDE1LTAyLTExIDA1OjA2OjQ1ICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBVc2UgZ3N0X3ZpZGVvX2d1ZXNzX2ZyYW1lcmF0ZSgpCisJICBVc2UgZ3N0X3ZpZGVvX2d1ZXNzX2ZyYW1lcmF0ZSgpIGZyb20gbGliZ3N0dmlkZW8gdG8gZ3Vlc3MKKwkgIHNlbnNpYmxlIGNvbW1vbiBmcmFtZXJhdGVzIHdoZXJlIHBvc3NpYmxlIGZyb20gdGhlCisJICBmbG9hdGluZyBwb2ludCBmcHMgaW4gdGhlIHN0cmVhbS4KKworMjAxNS0wMi0xMSAxMzo1MzowMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIEltcHJvdmUgYW5kIGZpeCBMQVRFTkNZIHF1ZXJ5IGhhbmRsaW5nCisJICBUaGlzIG5vdyBmb2xsb3dzIHRoZSBkZXNpZ24gZG9jcyBldmVyeXdoZXJlLCBlc3BlY2lhbGx5IHRoZSBtYXhpbXVtIGxhdGVuY3kKKwkgIGhhbmRsaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NDEwNgorCisyMDE1LTAyLTExIDEwOjI5OjU1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBIYW5kbGUgZmlyc3QgUlRDUCBwYWNrZXQgYW5kIGVhcmx5IGZlZWRiYWNrIGNvcnJlY3RseQorCSAgQWNjb3JkaW5nIHRvIFJGQyA0NTg1IHNlY3Rpb24gMy41LjMgc3RlcCAxIHdlIGFyZSBub3QgYWxsb3dlZCB0byBzZW5kCisJICBhbiBlYXJseSBSVENQIHBhY2tldCBmb3IgdGhlIHZlcnkgZmlyc3Qgb25lLiBJdCBtdXN0IGJlIGEgcmVndWxhciBvbmUuCisJICBBbHNvIG1ha2Ugc3VyZSB0byBub3QgdXNlIGxhc3RfcnRjcF9zZW5kX3RpbWUgaW4gYW55IGNhbGN1bGF0aW9ucyB1bnRpbAorCSAgd2UgYWN0dWFsbHkgc2VudCBhbiBSVENQIHBhY2tldCBhbHJlYWR5LiBJbiBzcGVjaWZpYyB0aGlzIG1lYW5zIHRoYXQgd2UKKwkgIG11c3Qgbm90IHVzZSBpdCBmb3IgZm9yd2FyZCByZWNvbnNpZGVyYXRpb24gb2YgdGhlIGN1cnJlbnQgUlRDUCBzZW5kIHRpbWUuCisJICBJbnN0ZWFkIHdlIGRvbid0IGRvIGFueSBmb3J3YXJkIHJlY29uc2lkZXJhdGlvbiBmb3IgdGhlIGZpcnN0IFJUQ1AgcGFja2V0LgorCisyMDE1LTAyLTEwIDE4OjUzOjUzICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkgIHJ0cGgyNjNkZXBheTogZml4IGNvbXBpbGF0aW9uIHdpdGggZ2NjIDUuMAorCisyMDE1LTAyLTEwIDE2OjAwOjA3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXhzaW5rOiBmaXggZXhhbXBsZSBwaXBlbGluZSBwcm9wZXJseQorCSAgeDI2NGVuYyBtaWdodCBub3QgaGF2ZSBhIG1heC1rZXktaW50IHByb3BlcnR5LCBidXQgaXQKKwkgIGhhcyBhIGtleS1pbnQtbWF4IHByb3BlcnR5Li4uCisKKzIwMTUtMDItMTAgMTQ6NTc6NTUgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYzoKKwkgIHNwbGl0bXV4OiBmaXggdHlwbworCisyMDE1LTAyLTEwIDE0OjU2OjIzICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXg6IHVwZGF0ZSBleGFtcGxlIHBpcGVsaW5lCisJICBFbGVtZW50IHgyNjRlbmMgZG9lc24ndCBoYXZlIGEgbWF4LWtleS1pbnQgcHJvcGVydHkKKworMjAxNS0wMi0xMCAxMzoyOTozMiArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkgIHNwbGl0bXV4OiBmaXggbWVtb3J5IGxlYWsKKwkgIElmIGV4ZWN1dGlvbiBnb2VzIHRvIHRoZSBiZWFjaCBpbiBsaW5lIDk4MSwgYnVmX2luZm8gZ29lcyBvdXQgb2Ygc2NvcGUgd2l0aG91dAorCSAgdGhlIG1lbW9yeSBiZWluZyBmcmVlJ2QuIEhhbmRsZSB0aGlzIGNhc2UuCisJICBDSUQgIzEyNjg0MDMKKworMjAxNS0wMi0wOCAxMjowMzoxMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IGF3a3dhcmQgaWYgY2xhdXNlCisKKzIwMTUtMDItMDcgMDE6NDE6NDkgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4cGFydHJlYWRlci5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwbGl0bXV4LmM6CisJICBzcGxpdG11eDogQWRkIHVuaXQgdGVzdCBmb3IgZmlsZSBzcGxpdHRpbmcKKwkgIEFkZCBhIHVuaXQgdGVzdCBmb3IgZmlsZSBzcGxpdHRpbmcsIGFuZCBmaXggdGhlIGxlYWtzIGluIHRoZQorCSAgc3BsaXRtdXhzaW5rIGl0IGZvdW5kCisKKzIwMTUtMDItMDYgMTQ6NDM6MjIgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IGZpeCB3aGljaCBzdG9wIHZhcmlhYmxlIGlzIHVzZWQgaW4gYXNzaWdubWVudAorCSAgQXNzaWdubWVudCBpcyBkb25lIHRvIHZhcmlhYmxlIHNlZ21lbnQuc3RvcCB3aGVuIHRoZSBpbnRlbnRpb24gd2FzIHRvIGFzc2lnbiB0bworCSAgbG9jYWwgdmFyaWFibGUgc3RvcC4gSW5zdGVhZCBvZiBvdmVyd3JpdGluZyBpdCwgdGhlIHZhbHVlIGlzIG5vdyBjbGFtcGVkIGFuZAorCSAgc2VnbWVudC5zdG9wIGlzIHNldCB0byBpdCBzb29uIGFmdGVyLgorCSAgQ0lEICMxMjY1NzczCisKKzIwMTUtMDItMDcgMDA6MTk6MzYgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4cGFydHJlYWRlci5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNyYy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc3BsaXRtdXguYzoKKwkgIHNwbGl0bXV4OiBGaXggbWVtb3J5IGxlYWtzIHVudGlsIHRoZSB0ZXN0IHZhbGdyaW5kcyBjbGVhbgorCisyMDE1LTAyLTA2IDA2OjQyOjE3ICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuYzoKKwkgIHNwbGl0bXV4OiBIYW5kbGUgZWFybHkgRU9TIGR1cmluZyBwYXJ0IHByZXBhcmF0aW9uCisJICBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYSBzaG9ydCBmaWxlIHJlYWNoZXMgRU9TIHdoaWxlIHdlJ3JlIHN0aWxsCisJICB3YWl0aW5nIGZvciBuby1tb3JlLXBhZHMsIGFuZCBtYWtlIHN1cmUgd2UgY29udGludWUgdG8gdGhlIGludGVybmFsCisJICBSRUFEWSBzdGF0ZSBmb3IgcmVhbCBwbGF5YmFjayB0byB3b3JrIHByb3Blcmx5IGxhdGVyLgorCisyMDE1LTAyLTA2IDA1OjAzOjE5ICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvZmlsZXMvc3BsaXR2aWRlbzAwLm9nZzoKKwkqIHRlc3RzL2ZpbGVzL3NwbGl0dmlkZW8wMS5vZ2c6CisJKiB0ZXN0cy9maWxlcy9zcGxpdHZpZGVvMDIub2dnOgorCSAgdGVzdHM6IENoYW5nZSBzcGxpdG11eCB0ZXN0IHZpZGVvIGZpbGVzCisJICBBdm9pZCB0ZXN0IGZhaWx1cmUgYnkgY2hhbmdpbmcgdGhlIHN0b3JlZCB2aWRlbyByZXNvbHV0aW9uCisJICBmcm9tIDgweDYwIHRvIDgweDY0LCB3aGljaCBuZWVkcyBidWcgNzQxMDMwIHRvIGJlIGZpeGVkLgorCisyMDE0LTA4LTAxIDAwOjA3OjUzICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZ3N0L211bHRpZmlsZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0ZmlsZXNyYy5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhwYXJ0cmVhZGVyLmg6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuaDoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuaDoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXR1dGlscy5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdHV0aWxzLmg6CisJKiBnc3QvbXVsdGlmaWxlL3Rlc3Qtc3BsaXRtdXhwYXJ0cmVhZGVyLmM6CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zcGxpdG11eC5jOgorCSogdGVzdHMvZmlsZXMvc3BsaXR2aWRlbzAwLm9nZzoKKwkqIHRlc3RzL2ZpbGVzL3NwbGl0dmlkZW8wMS5vZ2c6CisJKiB0ZXN0cy9maWxlcy9zcGxpdHZpZGVvMDIub2dnOgorCSAgc3BsaXRtdXg6IEltcGxlbWVudCBuZXcgZWxlbWVudHMgZm9yIHNwbGl0dGluZyBmaWxlcyBhdCBtdXggbGV2ZWwuCisJICBJbXBsZW1lbnQgMiBuZXcgZWxlbWVudHMgLSBzcGxpdG11eHNpbmsgYW5kIHNwbGl0bXV4c3JjLgorCSAgc3BsaXRtdXhzaW5rIGlzIGEgYmluIHdoaWNoIHdyYXBzIGEgbXV4ZXIgYW5kIHRha2VzIDEgdmlkZW8gc3RyZWFtLAorCSAgcGx1cyBhdWRpby9zdWJ0aXRsZSBzdHJlYW1zLCBhbmQgc3RhcnRzIGEgbmV3IGZpbGUKKwkgIHdoZW5ldmVyIG5lY2Vzc2FyeSB0byBhdm9pZCBvdmVycnVubmluZyBhIHRocmVzaG9sZCBvZiBlaXRoZXIgYnl0ZXMKKwkgIG9yIHRpbWUuIE5ldyBmaWxlcyBhcmUgc3RhcnRlZCBhdCBhIGtleWZyYW1lLCBhbmQgY29ycmVzcG9uZGluZyBhdWRpbworCSAgYW5kIHN1YnRpdGxlIHN0cmVhbXMgYXJlIHNwbGl0IGF0IHBhY2tldCBib3VuZGFyaWVzIHRvIG1hdGNoCisJICB2aWRlbyBHT1AgdGltZXN0YW1wcy4KKwkgIHNwbGl0bXV4c3JjIGlzIGEgY29ycmVzcG9uZGluZyBzb3VyY2UgZWxlbWVudCB3aGljaCBoYW5kbGVzCisJICB0aGUgc3BsaXRtdXg6Ly8gVVJMIGFuZCBwbGF5cyBiYWNrIGFsbCBjb21wb25lbnQgZmlsZXMsCisJICByZWNvbnN0cnVjdGluZyB0aGUgb3JpZ2luYWwgZWxlbWVudGFyeSBzdHJlYW1zIGFzIGl0IGdvZXMuCisKKzIwMTUtMDItMDQgMTY6MzI6MTQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkqIHRlc3RzL2ZpbGVzL3Rlc3QtY2VydC5wZW06CisJKiB0ZXN0cy9maWxlcy90ZXN0LWtleS5wZW06CisJICB0ZXN0czogc291cGh0dHBzcmM6IHVwZGF0ZSBzc2wga2V5L2NlcnQgcGFpcgorCSAgT3VyIG9uZXMgd2VyZSBleHBpcmVkLiBUaGUgbmV3IG9uZXMgd2VyZSBjb3BpZWQgZnJvbSBsaWJzb3VwJ3MKKwkgIHRlc3RzIGZpbGVzLgorCSAgQWxzbyBzZXRzIHRoZSBwcm9wZXJ0eSB0byB1c2Ugb3VyIG93biBjZXJ0IHRvIHZhbGlkYXRlIHRoZQorCSAgc2VydmVyLCBvdGhlcndpc2UgdGhlIGRlZmF1bHQgc3lzdGVtIGNlcnRzIHdvdWxkIGJlIHVzZWQKKwkgIGFuZCBpdCB3b3VsZCBmYWlsLgorCisyMDE1LTAyLTA0IDAyOjI1OjQ0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICBydHBoMjY0ZGVwYXk6IHByZXZlbnQgdHJ5aW5nIHRvIGdldCAwIGJ5dGVzIGZyb20gYWRhcHRlcgorCSAgVGhpcyBjYXVzZXMgYW4gYXNzZXJ0aW9uIGFuZCB3b3VsZCBsZWFkIHRvIGdldHRpbmcgYSBOVUxMIGluc3RlYWQKKwkgIG9mIGEgYnVmZmVyLiBXaXRob3V0IHByb3BlciBjaGVja2luZyB0aGlzIHdvdWxkIGVhc2lseSBsZWFkIHRvCisJICBhIHNlZ2ZhdWx0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3MTk5CisKKzIwMTUtMDItMDQgMjE6NTA6NTEgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBHU1RfU0VHTUVOVF9GTEFHX1RSSUNLTU9ERV9LRVlfVU5JVFMKKwkgIFdoZW4gdGhlIHRyaWNrbW9kZSBrZXktdW5pdHMgZmxhZyBpcyBzZXQgb24gdGhlIHNlZ21lbnQsIHNpbXBseSBza2lwCisJICBhbnkgc2FtcGxlIG9uIGEgdmlkZW8gc3RyZWFtIHRoYXQgaXNuJ3QgYSBrZXlmcmFtZQorCisyMDE1LTAyLTAzIDE3OjM1OjUyICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IGNvbnRhaW5lciBoYW5kbGluZworCSAgV2UgZGV0ZWN0IGEgY29udGFpbmVyIGNvcnJlY3RseSBub3cgc28gd2UgbmVlZCB0byByZXZlcnQgdGhlIHdlaXJkCisJICBjaGVjayB0aGVyZSB3YXMgYmVmb3JlLgorCSAgVXNlIGdzdF9ydHNwc3JjX3N0cmVhbV9wdXNoX2V2ZW50KCkgdG8gcHVzaCB0aGUgY2FwcyBldmVudCBvbiB0aGUKKwkgIHJpZ2h0IHBhZC4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM5MzkxCisKKzIwMTUtMDItMDIgMTk6NDY6MjcgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgbWF0cm9za2FtdXg6IHN0b3JlIGFuZCB3cml0ZSBzdHJlYW0gdGFncworCSAgU2VwYXJhdGUgZ2xvYmFsIGZyb20gc3RyZWFtIHRhZ3Mgc3RvcmFnZSBhbmQgd3JpdGUgdGhlbSB0byB0aGUKKwkgIGFwcHJvcHJpYXRlIHRhZ3MgZW50cnkgaW4gdGhlIG91dHB1dAorCisyMDE1LTAyLTAyIDEzOjM1OjU5IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcGFyc2Ugc3RyZWFtIHRhZ3MKKwkgIEtlZXAgZ2xvYmFsIGFuZCBzdHJlYW0gdGFncyBzZXBhcmF0ZWx5IGFuZCBwYXJzZSB0aGUgdWR0YSBub2RlCisJICB0aGF0IGNhbiBiZSBmb3VuZCB1bmRlciB0aGUgdHJhayBhdG9tLiBUaGUgdWR0YSB3aWxsIGNvbnRhaW4KKwkgIHN0cmVhbSBzcGVjaWZpYyB0YWdzIGFuZCB3aWxsIGJlIHB1c2hlZCBhcyBzdWNoCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkyNDczCisKKzIwMTUtMDEtMzEgMTQ6MzI6MzQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5oOgorCSAgcXRtdXg6IHN0b3JlIHN0cmVhbSBhbmQgY29udGFpbmVyIHRhZ3Mgc2VwYXJhdGVseQorCSAgVGFncyByZWNlaXZlZCB2aWEgZXZlbnRzLCB3aGVuIG1hcmtlZCBhcyBzdHJlYW0gdGFncywgd2lsbAorCSAgYmUgc3RvcmVkIG9uIHRoYXQgc3RyZWFtJ3MgdHJhayBhdG9tIGluc3RlYWQgb2YgYmVpbmcgc3RvcmVkCisJICBpbiB0aGUgbWFpbiB0YWdzIGF0b20uIFRoaXMgYWxsb3dzIHRoZSByZXN1bHRpbmcgZmlsZSB0byBoYXZlCisJICBnbG9iYWwgYW5kIHN0cmVhbSB0YWdzIHN0b3JlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTI0NzMKKworMjAxNS0wMS0zMSAxMzoxNDo0NCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogcmVmYWN0b3IgdGFncyBmdW5jdGlvbnMgdG8gYWNjb21vZGF0YSBVRFRBIGF0IHRyYWsgbGV2ZWwKKwkgIFJlZmFjdG9yIHRoZSBmdW5jdGlvbnMgdGhhdCB3ZXJlIGJvdW5kIHRvIHRoZSAnbW9vdicgYXRvbSB0bworCSAgZGlyZWN0bHkgcGFzcyB0aGUgZGVzaXJlZCAndWR0YScgdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgdGFncy4KKwkgIFRoaXMgYWxsb3dzIHRoZSB0YWdzIHRvIGJlIHdyaXR0ZW4gdG8gJ3VkdGEnIGF0IHRoZSAnbW9vdicgb3IKKwkgIHRoZSAndHJhaycgbGV2ZWwsIGNyZWF0aW5nIHRhZ3MgdGhhdCBhcmUgZm9yIHRoZSBjb250YWluZXIgb3IKKwkgIGZvciBhIHN0cmVhbSBvbmx5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MjQ3MworCisyMDE1LTAxLTMxIDEwOjQ3OjQwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBtYXAgYXBwbGljYXRpb24gbmFtZSB0byBfc3dyIHRhZworCSAgSXQgcmVmZXJzIHRvIHRoZSBhcHBsaWNhdGlvbiBuYW1lIGFuZCB2ZXJzaW9uIHVzZWQgdG8gY3JlYXRlIHRoZQorCSAgZmlsZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MjQ3MworCisyMDE1LTAxLTMxIDAyOjMwOjQwICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYTogRml4IHNlZWtpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGluIHJldmVyc2UgbW9kZS4KKwkgIFNuYXAgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSB3aGVuIHNlZWtpbmcgcGFzdCB0aGUgZW5kIGluIHJldmVyc2UgbW9kZSwKKwkgIGFuZCBhbHNvIGZpeCBHU1RfU0VFS19UWVBFX0VORCBhbmQgR1NUX1NFRUtfVFlQRV9OT05FIGhhbmRsaW5nCisJICBmb3IgdGhlIHN0b3AgcG9zaXRpb24gYnkgYWx3YXlzIHNlZWtpbmcgb24gYSBzZWdtZW50IGluIHN0cmVhbSB0aW1lCisKKzIwMTUtMDEtMzAgMTg6MjI6MzEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IEZpeCBzaWduYWwgbmFtZQorCSAgVGhpcyB3YXNuJ3QgbWVhbnQgdG8gYmUgcHVzaGVkIGF0IGFsbCB5ZXQsIGJ1dCBub3cgdGhhdCBpdCdzIHRoZXJlCisJICBhbHJlYWR5IGl0IHdvbid0IGh1cnQgdG8gbWFrZSBpdCBjb3JyZWN0IGF0IGxlYXN0LgorCisyMDE1LTAxLTMwIDE2OjU2OjM1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgcnRwc3RhdHM6IEZpeCB0eXBvIGluIGRvY3VtZW50YXRpb24KKworMjAxNS0wMS0zMCAxNjo1MDozNiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjogQWRkIG5ldyBvbi1yZWNlaXZpbmctcnRjcCBzaWduYWwKKwkgIFRoaXMgd2lsbCBiZSBlbWl0dGVkIHdoZW5ldmVyIGFuIFJUQ1AgcGFja2V0IGlzIHJlY2VpdmVkLiBEaWZmZXJlbnQgdG8KKwkgIG9uLWZlZWRiYWNrLXJ0Y3AsIHRoaXMgc2lnbmFsIGdldHMgZXZlcnkgY29tcGxldGUgUlRDUCBwYWNrZXQgYW5kIG5vdAorCSAganVzdCB0aGUgaW5kaXZpZHVhbCBmZWVkYmFjayBwYWNrZXRzLgorCisyMDE1LTAxLTI4IDE0OjAyOjE1IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4Lmg6CisJICBxdGRlbXV4OiBzaW1wbGlmeSBzZWdtZW50LmJhc2UgbWF0aAorCSAgUmVtb3ZlIGEgZml4IGZvciBoZWF2aWx5IGVkaXRlZCBmaWxlcyBhZGRlZCBmb3IgZml4aW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQ1ODMwIHRvIHdvcmsKKwkgIHdpdGggc2Vla3MgYW5kIHByb3BlciBnYXBzIHBsYXliYWNrLiBUaGUgZml4IHdhcyByZXBsYWNlZAorCSAgZm9yIGEgbW9yZSBnZW5lcmFsIHNvbHV0aW9uIHRoYXQgYmFzZXMgb24gdXNpbmcgcHJldmlvdXMKKwkgIHNlZ21lbnQncyBkdXJhdGlvbiwganVzdCBsaWtlIGl0IHdvcmtzIGZvciBtZWRpYSBzZWdtZW50cworCSAgcGxheWJhY2suCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQzNTE4CisKKzIwMTUtMDEtMjcgMTQ6MDA6MzUgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXJvcmMtZGlzdC5jOgorCSAgdmlkZW9taXhlcjogdXBkYXRlIG9yYyBmaWxlcworCisyMDE1LTAxLTI2IDE3OjA4OjEyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IGRhdGEgZHJvcHBpbmcgZm9yIGZyYWdtZW50ZWQgc3RyZWFtcworCSAgRm9yIGZyYWdtZW50ZWQgc3RyZWFtcyB3aXRoIGV4dHJhIGRhdGEgYXQgdGhlIGVuZCBvZiB0aGUgbWRhdAorCSAgcXRkZW11eCB3YXMgbm90IGRyb3BwaW5nIHRob3NlIGJ5dGVzIGFuZCB3b3VsZCB0cnkgdG8gdXNlCisJICB0aGF0IGV4dHJhIGRhdGEgYXMgdGhlIGJlZ2lubmluZyBvZiBhIG5ldyBhdG9tLCBjYXVzaW5nIHRoZQorCSAgc3RyZWFtIHRvIGZhaWwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQzNDA3CisKKzIwMTUtMDEtMjUgMTc6MzA6MzMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IERlcHJlY2F0ZSBydGNwLWltbWVkaWF0ZS1mZWVkYmFjay10aHJlc2hvbGQgcHJvcGVydHkKKwkgIEl0IGhhZCBubyBlZmZlY3Qgc2luY2UgcXVpdGUgc29tZSB0aW1lIGFuZCBhbHNvIGlzIG5vdCBuZWVkZWQgaW4gZ2VuZXJhbCwKKwkgIGVzcGVjaWFsbHkgbm90IHRvIHN3aXRjaCBiZXR3ZWVuIGltbWVkaWF0ZSBmZWVkYmFjayBtb2RlIGFuZCBlYXJseSBmZWVkYmFjaworCSAgbW9kZS4gVGhlIGxhdGVzdCB1bmRlcnN0YW5kaW5nIG9mIHRoZSBSRkMgaXMgdGhhdCBmcm9tIHRoZSBlbmRwb2ludCBwb2ludCBvZgorCSAgdmlldywgYm90aCBtb2RlcyBhcmUgZXhhY3RseSB0aGUgc2FtZS4gUlRDUCBpcyBvbmx5IGFsbG93ZWQgdG8gdXNlIHRoZQorCSAgYmFuZHdpZHRoIGFzIGdpdmVuIGJ5IHRoZSBSRkMgY29uc3RyYWludHMsIGFzIHN1Y2ggaXQgaXMgb25seSBldmVyIHBvc3NpYmxlCisJICB0byBzY2hlZHVsZSBhIFJUQ1AgcGFja2V0IGVhcmx5IGJ1dCBpdCdzIGFnYWluc3QgdGhlIFJGQyB0byBzY2hlZHVsZSBtb3JlIFJUQ1AKKwkgIHBhY2tldHMuCisJICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGltbWVkaWF0ZSBmZWVkYmFjayBtb2RlIGFuZCBlYXJseSBmZWVkYmFjayBtb2RlIGlzIHRoYXQKKwkgIHRoZSBmb3JtZXIgZ3VhcmFudGVlcyB0aGF0IGFuIFJUQ1AgcGFja2V0IGNhbiBiZSBzZW50IGZvciBldmVyeSBldmVudAorCSAgImltbWVkaWF0ZWx5Iiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgYmFuZHdpZHRoIGNhbGN1bGF0aW9ucyBmcm9tIHRoZSBSRkMgaGF2ZQorCSAgcmVzdWx0ZWQgaW4gYW4gUlRDUCBzY2hlZHVsaW5nIGludGVydmFsIHRoYXQgaXMgc21hbGwgZW5vdWdoLiBFYXJseSBmZWVkYmFjaworCSAgbW9kZSBvbiB0aGUgb3RoZXIgaGFuZCBtZWFucyB0aGF0IHdlIGNhbiBzY2hlZHVsZSBzb21lIHBhY2tldHMgZWFybHkgdG8gbWFrZQorCSAgdGhhdCBoYXBwZW4sIGJ1dCBpdCdzIG5vdCBndWFyYW50ZWVkIGF0IGFsbCB0aGF0IGl0J3MgcG9zc2libGUgdG8gc2NoZWR1bGUKKwkgIGFuIFJUQ1AgcGFja2V0IHBlciBldmVudCAoaS5lLiB0aGV5IG5lZWQgdG8gYmUgYWNjdW11bGF0ZWQgb3IgZHJvcHBlZCkuCisKKzIwMTUtMDEtMjIgMTA6Mjk6MzkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IERlbGF5IHRoZSBuZXh0IHJlZ3VsYXIgUlRDUCBwYWNrZXQgYWZ0ZXIgZWFybHkgUlRDUAorCSAgVGhpcyBpcyByZXF1aXJlZCB0byBub3QgZXhjZWVkIHRoZSBzaG9ydCB0ZXJtIGF2ZXJhZ2UgUlRDUCBiaXRyYXRlIHdoZW4KKwkgIHVzaW5nIGVhcmx5IGZlZWRiYWNrIGFzIGNvbXBhcmVkIHRvIHdpdGhvdXQgZWFybHkgZmVlZGJhY2suCisKKzIwMTUtMDEtMjIgMTA6Mjg6NTIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IEFkZCBuZXcgc2VuZC1ydGNwLWZ1bGwgc2lnbmFsCisJICBUaGlzIGluZGljYXRlcyB3aXRoIGEgYm9vbGVhbiByZXR1cm4gdmFsdWUgaWYgc2NoZWR1bGluZyBhIG5ldyBSVENQIHBhY2tldAorCSAgd2l0aGluIHRoZSByZXF1ZXN0ZWQgZGVsYXkgd2FzIHBvc3NpYmxlLiBPdGhlcndpc2UgaXQgYmVoYXZlcyBleGFjdGx5IGxpa2UKKwkgIHNlbmQtcnRjcC4gVGhlIG9ubHkgcmVhc29uIGZvciBhZGRpbmcgYSBuZXcgc2lnbmFsIGlzIEFCSSBjb21wYXRpYmlsaXR5LgorCisyMDE1LTAxLTIwIDAwOjMyOjAwICswMDAwICBKaW1teSBPaG4gPHlvbmdqaW4ub2huQGxnZS5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogRnJlZSBmb3JtYXRfaW5mbyBpbiBxdWVyeV9nZXRjYXBzCisJICBJZiB3ZSBjYW4gbm90IGNyZWF0ZSBwcm9iZSBzdHJlYW0gaW4gcXVlcnlfZ2V0Y2FwcyBmdW5jdGlvbiwgaXQgd2lsbCBhcHBlYXIKKwkgIG1lbW9yeSBsZWFrYWdlIGZyb20gZm9ybWF0IGluZm8uCisJICBUaGUgZm9sbG93aW5nIHBhdGNoIHByZXZlbnQgbWVtb3J5IGxlYWthZ2UgaW4gcHVsc2VzaW5rLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MzE3OAorCisyMDE1LTAxLTIzIDE3OjM1OjUxICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thZGVtdXg6IHJlbW92ZSB1bm5lY2Vzc2FyeSBjaGVjaworCSAgTm8gbWF0dGVyIGlmIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9pbmRleF9jdWV0cmFjayAoKSByZXR1cm5zIHRoYXQgdGhlCisJICBmbG93IGlzIE9LIG9yIG5vdCwgdGhlIGNoZWNrIHRoZXJlIHdpbGwgYmUgYSBicmVhayBmcm9tIHRoZSBzd2l0Y2guIFJlbW92aW5nIHRoZQorCSAgY2hlY2sgc2luY2UgdGhlIG91dGNvbWUgaXMgdGhlIHNhbWUuCisJICBDSUQgIzEyNjU3NjIKKworMjAxNS0wMS0yMyAxNToxNjoyNSArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IEF2b2lkIHVzaW5nIGZyZWVkIHZhcmlhYmxlCisJICB0aGUgbmFtZSB2YXJpYWJsZSBtaWdodCBoYXZlIGJlZW4gYXR0cmlidXRlZCB0byBwYWRfbmFtZSwgbWFrZSBzdXJlIHdlCisJICBmcmVlIGl0IG9ubHkgKmFmdGVyKiBwYWRfbmFtZSBoYXMgYmVlbiB1c2VkLgorCSAgQ292ZXJpdHkgQ0lEIDogMTI2NTc3NAorCisyMDE1LTAxLTIzIDE1OjEzOjU1ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBBdm9pZCB1c2luZyBmcmVlZCB2YXJpYWJsZQorCSAgdGhlIG5hbWUgdmFyaWFibGUgbWlnaHQgaGF2ZSBiZWVuIGF0dHJpYnV0ZWQgdG8gcGFkX25hbWUsIG1ha2Ugc3VyZSB3ZQorCSAgZnJlZSBpdCBvbmx5ICphZnRlciogcGFkX25hbWUgaGFzIGJlZW4gdXNlZC4KKwkgIENvdmVyaXR5IENJRCA6IDEyNjU3NzUKKworMjAxNC0xMS0xNCAxMjo1OTozMSArMDEwMCAgUGV0ZXIgU2VpZGVyZXIgPHBzLnJlcG9ydEBnbXgubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiByZXVzZSBjYXBzIGZyYW1lcmF0ZSBpZiBub3Qgb3ZlcndyaXR0ZW4gYnkgdjRsMiBkZXZpY2UKKwkgIEVuYWJsZXMgZHVyYXRpb24gc2V0dGluZyBpbiB2NGwyc3JjLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDQwMworCisyMDE1LTAxLTIyIDEwOjI5OjI0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBGaXggaW5kZW50aW9uCisKKzIwMTUtMDEtMjEgMTc6MzY6MjYgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9kdW1wLmM6CisJICBxdGRlbXV4X2R1bXA6IEJ5cGFzcyBldmVuIG1vcmUgY29kZSBpZiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQKKwkgIEFuZCBhdm9pZCB1c2luZyB2YXJpYWJsZXMgdGhhdCB3b24ndCBleGlzdCB3aGVuIGRlYnVnZ2luZyBpcyBkaXNhYmxlZAorCisyMDE1LTAxLTIxIDE1OjMwOjMzICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5jOgorCSAgcXRkZW11eDogT25seSB0cmF2ZXJzZS9kdW1wIG5vZGVzIGlmIGd1YXJhbnRlZWQgdG8gYmUgdXNlZAorCSAgX19nc3RfZGVidWdfbWluIGlzIHRoZSAiZ2xvYmFsIiBsb3dlc3QgZGVidWcgbGV2ZWwgc2V0LiBUaGVyZSdzIG5vCisJICBndWFyYW50ZWUgdGhlIHF0ZGVtdXggZGVidWcgY2F0ZWdvcnkgaXMgYWN0dWFsbHkgc2V0IGF0IHRoYXQgbGV2ZWwuCisKKzIwMTQtMTItMjAgMTc6MDk6MTQgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkgIG1hdHJvc2thOiBBdm9pZCBkZWJ1Z2dpbmcgYmVsb3cgY2F0ZWdvcnkgdGhyZXNob2xkCisJICBUaGlzIHBhcnQgYWxvbmUgd2FzIHdoYXQgbWFkZSB0aGUgbWF0cm9za2EgdGhyZWFkIHRha2UgYSBmdWxsIGNvcmUKKwkgIG9uIGFuIGFuZHJvaWQgcGhvbmUgLi4uCisKKzIwMTUtMDEtMjEgMDk6NTU6MzAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9kdi9nc3RzbXB0ZXRpbWVjb2RlLmM6CisJKiBleHQvbWlrbW9kL21pa21vZF90eXBlcy5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hLmM6CisJKiBnc3QvZWZmZWN0di9nc3RyYWRpb2FjLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb3RlbXBsYXRlLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIENvbnN0aWZ5IHNvbWUgc3RhdGljIGFycmF5cyBldmVyeXdoZXJlCisKKzIwMTUtMDEtMTkgMTc6NDk6NTQgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBkZWFkbG9jayBzZWVraW5nIGluIGZpbGVzIHdpdGhvdXQgc2VlayBlbnRyaWVzCisJICBBIG11dGV4IHVubG9jayB3YXMgbWlzc2luZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk5NzUKKworMjAxNS0wMS0xOSAxMjozNDoyNSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kLmM6CisJICB2aWRlb21peGVyOiBmaXggaWxsZWdhbCBtZW1vcnkgYWNjZXNzIGluIGJsZW5kIGZ1bmN0aW9uIHdpdGggbmVnYXRpdmUgeXBvcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MTExNQorCisyMDE1LTAxLTEzIDE2OjQ5OjM0IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBQcm94eSBnZXRjYXBzCisJICBSZXBsYWNlIHRoZSBzaW5rX3F1ZXJ5IHdpdGggbmV3IGdldGNhcHMoKSB2aXJ0dWFsIGFuZCB1c2UgdGhlIHByb3h5CisJICBoZWxwZXIgd2l0aCB0aGUgcHJvYmVkIGNhcHMuIFRoaXMgYWxsb3cgdXBzdHJlYW0gZWxlbWVudCB0YWtpbmcgZGVjaXNpb24KKwkgIGJhc2Ugb24gd2hhdCBpcyBzdXBwb3J0ZWQgZG93bnN0cmVhbS4KKworMjAxNS0wMS0xMyAxOTowNToyMCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXhtYXAuYzoKKwkgIHF0bXV4OiBBZGQgc3VwcG9ydCBmb3IgdjIxMAorCisyMDE1LTAxLTEzIDE4OjU4OjAxICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHYyMTAgaXMgdjIxMCwgbm90IFVZVlkgYW5kIHl1djIgaXMgWVVZMiwgbm90IEk0MjAKKwkgIEFsc28gYWRkIGEgZmV3IG90aGVyIHJhdyB2aWRlbyBmb3JtYXRzIHdlIHN1cHBvcnQ6IHYzMDgsIHYyMTYKKwkgIGFuZCBhZGQgY29tbWVudHMgZm9yIGEgZmV3IG90aGVycyB3ZSBkb24ndCBzdXBwb3J0IHlldC4KKwkgIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJyYXJ5L21hYy90ZWNobm90ZXMvdG4yMTYyLworCisyMDE1LTAxLTEyIDE1OjU2OjI5ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZjJjNmI5NSB0byBiYzc2YThiCisKKzIwMTUtMDEtMTAgMTU6NTE6MTYgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5oOgorCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IERpc2FibGUgaGFjayBmb3IgTlNBcHAgaXRlcmF0aW9uIHdpdGggYSBzcGVjaWFsICNkZWZpbmUKKwkgIFRoZSBoYWNrIGNhdXNlcyBkZWFkbG9ja3MgYW5kIG90aGVyIGludGVyZXN0aW5nIHByb2JsZW1zIGFuZCBpdCByZWFsbHkKKwkgIGNhbiBvbmx5IGJlIGZpeGVkIHByb3Blcmx5IGluc2lkZSBHTGliLiBXZSB3aWxsIGluY2x1ZGUgYSBwYXRjaCBmb3IKKwkgIEdMaWIgaW4gb3VyIGJ1aWxkcyBmb3Igbm93IHRoYXQgaGFuZGxlcyB0aGlzLCBhbmQgaG9wZWZ1bGx5IGF0IHNvbWUKKwkgIHBvaW50IEdMaWIgd2lsbCBhbHNvIG1lcmdlIGEgcHJvcGVyIHNvbHV0aW9uLgorCSAgQSBwcm9wZXIgc29sdXRpb24gd291bGQgZmlyc3QgcmVxdWlyZSB0byByZWZhY3RvciB0aGUgcG9sbGluZyBpbgorCSAgR01haW5Db250ZXh0IHRvIG9ubHkgcHJvdmlkZSBhIHNpbmdsZSBmZCwgZS5nLiB2aWEgZXBvbGwva3F1ZXVlCisJICBvciBhIHRocmVhZCBsaWtlIHRoZSBvbmUgYWRkZWQgYnkgb3VyIHBhdGNoLiBUaGVuIHRoaXMgc2luZ2xlCisJICBmZCBjb3VsZCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgR01haW5Db250ZXh0IGFuZCBkaXJlY3RseSBpbnRlZ3JhdGVkCisJICBpbnRvIGEgTlNSdW5Mb29wLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MTQ1MAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNDM3NAorCisyMDE1LTAxLTA4IDIxOjA3OjA1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogdW5jb3JrIGlmIG5lZWRlZCB1cG9uIGNvbW1pdAorCSAgLi4uIHRvIHByb3ZpZGUgZm9yIGEgcnVubmluZyBjbG9jay4KKworMjAxNS0wMS0wOSAxNjo1OTo1MyAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogUHJldmVudCByZW5lZ290aWF0aW9uCisJICBSZW5lZ290aWF0aW9uIGlzbid0IHN1cHBvcnRlZCwgc2ltcGx5IHByZXZlbnQgaXQgdGhlIHdheSB3ZSBkbyBpbgorCSAgdjRsMnNyYy4KKworMjAxNS0wMS0wNiAxMzo1NDoyNSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogRG9uJ3QgdW5sb2NrIHRoZSBzdHJlYW0gbG9jayB0d2ljZQorCisyMDE1LTAxLTA5IDExOjQwOjQwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IHN0cmVhbSB0aW1lIGNvbnZlcnNpb24KKwkgIFVzZSB0aGUgcmlnaHQgbWFjcm8gdG8gY29udmVydCB0byB0aGUgY29ycmVjdCBzY2FsZSBvciB0aGUKKwkgIHNlZ21lbnQgaW5mb3JtYXRpb24gd2lsbCBiZSB3cm9uZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MjU3MgorCisyMDE1LTAxLTA3IDE4OjQ4OjU4IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogQWRkIHByb3RlY3Rpb24gYWdhaW5zdCBkcml2ZXIgYnVnCisJICB2NGwybG9vcGJhY2sgZHJpdmVyIGhhcyBhIHRoaXMgbmFzdHkgYnVnIHRoYXQgaWYgdGhlIHF1ZXVlIGlzIGxhcmdlcgorCSAgdGhlbiAyIGJ1ZmZlcnMsIGl0IHJldHVybnMgcmFuZG9tIGluZGV4IG9uIGRxYnVmLiBTbyBmYXIgd2UgYXNzdW1lZAorCSAgdGhhdCB0aGUgaW5kZXggd2FzIGFsd2F5cyByaWdodCwgd2hpY2ggd291bGQgbGVhZCB0byBtZW1vcnkgYmVpbmcKKwkgIHVucmVmIHR3aWNlLCBhbmQgZXZlbnR1YWxseSBjcmFzaC4KKworMjAxNS0wMS0wNyAxNzo1ODowNSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBEb24ndCB1c2UgYWxsb2NhdG9yIHNpemUgdG8gaXRlcmF0ZQorCSAgQXMgdGhlIGJ1ZmZlciBhcnJheSBpcyBmaXhlZCBzaXplIGFuZCBzbWFsbCwgaXQncyBzYWZlciB0byBzaW1wbHkKKwkgIHVzZSB0aGlzIHN0YXRpYyBzaXplIHRvIGNsZWFudXAgdGhlIGJ1ZmZlcnMuIFRoaXMgaXMgYWxzbyBtb3JlCisJICBjb25zaXN0ZW50IHdpdGggdGhlIHJlc3QuIFRoZSBhc3NvY2lhdGVkIG1ldGhvZCBpcyBubyBsb25nZXIKKwkgIHJlcXVpcmVkIGFuZCBjYW4gYmUgZHJvcHBlZC4KKworMjAxNS0wMS0wNyAxNzo1NToxNCAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogRG9uJ3QgY2xlYW4gYnVmZmVyIGFycmF5IGluIGRpc3Bvc2UKKwkgIFRoaXMgc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGRvbmUsIHBsdXMgdGhpcyBjb2RlIGlzIGluY29ycmVjdAorCSAgYW5kIG1heSBsZWFkIHRvIGNyYXNoLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MjA3NAorCisyMDE1LTAxLTA3IDE3OjQ4OjMxIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBEb24ndCByZWYgcXVldWVkIG91dHB1dCBidWZmZXIKKwkgIFRoaXMgcGFydGx5IHJldmVydCB0byB0aGUgb2xkIDEuMiBiZWhhdmlvci4gSW5zdGVhZCBvZiBrZWVwaW5nIGEKKwkgIHJlZmVyZW5jZSB0byB0aGUgb3V0cHV0IGJ1ZmZlciBxdWV1ZWQsIHdlIHNpbXBseSByZWxlYXNlIHRoZW0gYnV0CisJICBkb24ndCBmb3J3YXJkIGl0IHRvIEdzdEJ1ZmZlclBvb2wuIFRoaXMgd2F5LCB0aGUgYnVmZmVyIHBvb2wgZG9uJ3QKKwkgIG5lZWQgdG8gYmUgZmx1c2hlZCB0byBiZSBzdG9wcGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MjA3NAorCisyMDE1LTAxLTA4IDExOjM3OjIzIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBOZXZlciBmYWlsIG9uIHN0cmVhbW9mZgorCSAgRmFpbGluZyBzdHJlYW1vZmYgcHJldmVudHMgYWxsb2NhdG9yIGZyb20gYmVpbmcgZGlzcG9zZWQgaGVuY2UKKwkgIGxlYWQgdG8gZGV2aWNlIEZEIGxlYWsuIFRoZXJlIGlzIG5vIGtub3duIGNhc2VzIHdoZXJlIHN0cmVhbW9mZgorCSAgbWF5IGZhaWxzIGZvciB3aGljaCB3ZSdkIHN0aWxsIGJlIHN0cmVhbWluZy4gc3RyZWFtb2ZmIGlzIGtub3duCisJICB0byBmYWlsIHdoZW4gYSBkZXZpY2UgaXMgYmVpbmcgdW5wbHVnZ2VkIChpbiB3aGljaCBjYXNlIGVycm5vCisJICAxOS9FTk9ERVYgaXMgc2V0KS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzI3MzQKKworMjAxNS0wMS0wNyAyMTo1MjoxNyAtMDUwMCAgQnJhZCBTbWl0aCA8YnJhZEBjb21zdHlsZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIHY0bDI6IEFkZCBzdXBwb3J0IGZvciBkZXRlY3RpbmcgdGhlIHByZXNlbmNlIG9mIFY0TDIgc3VwcG9ydCBvbiBPcGVuQlNECisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9yZXZpZXc/YnVnPTc0MjUwMworCisyMDE1LTAxLTA0IDE1OjU3OjEwICswMTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJICBhYzNwYXJzZTogcmVxdWVzdCBhdCBsZWFzdCA4IGJ5dGVzIHRvIHByb3Blcmx5IHBhcnNlIGhlYWRlcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MjMyNQorCisyMDE1LTAxLTA3IDE2OjIwOjAzIC0wODAwICBNaWNoYWVsIFNtaXRoIDxtaWNoYWVsLnNtaXRoQHJkaW8uY29tPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBza2lwIGFuIGFkZGl0aW9uYWwgdW5pbnRlcmVzdGluZyBjaHVuayB0eXBlIGJlZm9yZSB0aGUgZm10IGNodW5rLgorCisyMDE1LTAxLTA3IDE4OjE2OjEyICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2R5bmFtaWMuYzoKKwkgIGF1ZGlvZHluYW1pYzogYXNzZXJ0IGZ1bmNfaW5kZXggaXMgaW5zaWRlIGJvdW5kcworCSAgQnJpbmdpbmcgYmFjayB0aGUgY2hlY2sgcmVtb3ZlZCBpbiB0aGUgcHJldmlvdXMgY29tbWl0IGJ1dCBoYXZlIHRoYXQgY2hlY2sgYmUgYQorCSAgZ19hc3NlcnQuIENoYW5naW5nIHRoZSBmdW5jdGlvbiB0byBzdGF0aWMgdm9pZCBzaW5jZSByZXR1cm4gY2FuIG5ldmVyIGJlIEZhbHNlLAorCSAgYmVjYXVzZSBhdWRpbyBmb3JtYXQgd2lsbCBuZXZlciBiZSB1bmtvd24uCisKKzIwMTUtMDEtMDcgMTc6MzE6MzkgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5jOgorCSAgYXVkaW9keW5hbWljOiByZW1vdmUgYWx3YXlzLXRydWUgY29uZGl0aW9uYWwKKwkgIGZ1bmNfaW5kZXggaXMgc2V0IGJ5IHRoZSBzdW0gb2YgdGhyZWUgdGVybmFyeSBvcGVyYXRvcnMgd2hpY2ggYWRkLCAwOjQsIDA6MiwKKwkgIGFuZCAxOjAuIE1pbmltdW0gdmFsdWUgd291bGQgYmUgMCswKzA9MCwgYW5kIG1heGltdW0gd291bGQgYmUgNCsyKzE9Ny4KKwkgIFRoZSBjb25kaXRpb25hbCBjaGVja2luZyBpZiBmdW5jX2luZGV4IGlzID49IDAgYW5kIDwgOCB3aWxsIGFsd2F5cyBiZSB0cnVlLgorCSAgUmVtb3ZpbmcgaXQuCisJICBDSUQgMTIyNjQ0MgorCisyMDE1LTAxLTA3IDE4OjA1OjE4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogSWYgd2UgZ2V0IGEgZ2FwIHdpdGggYSBidWZmZXIgd2l0aG91dCBEVFMsIGVycm9yIG91dAorCSAgV2UgKGN1cnJlbnRseT8pIGNhbid0IHJlYWxseSBoYW5kbGUgZ2FwcyBiZXR3ZWVuIFJUUCBwYWNrZXRzIGlmIHRoZXkncmUgbm90CisJICBwcm9wZXJseSB0aW1lc3RhbXBlZC4gVGhlIGN1cnJlbnQgY29kZSB3b3VsZCBnbyBpbnRvIGNhbGN1bGF0aW9ucyB3aXRoCisJICBHU1RfQ0xPQ0tfVElNRV9OT05FIGFuZCB0aGVuIGNhdXNlIGFzc2VydGlvbnMgZXZlcnl3aGVyZS4gSXQncyBwcm9iYWJseQorCSAgYmV0dGVyIHRvIGVycm9yIG91dCBjbGVhbmx5IGluc3RlYWQuCisKKzIwMTQtMTEtMjEgMTE6Mzk6MTkgLTA4MDAgIEFsZWl4IENvbmNoaWxsbyBGbGFxdcOpIDxhbGVpeEBvYmxvbmcuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBzZXQgUExBWUlORyBzdGF0ZSBhZnRlciBjb25maWd1cmluZyBjYXBzCisJICBXZSBzZXQgdG8gUExBWUlORyBhZnRlciB3ZSBoYXZlIGNvbmZpZ3VyZWQgdGhlIGNhcHMsIG90aGVyd2lzZSB3ZQorCSAgbWlnaHQgZW5kIHVwIGNhbGxpbmcgcmVxdWVzdF9rZXkgKHdpdGggU1JUUCkgd2hpbGUgY2FwcyBhcmUgc3RpbGwKKwkgIGJlaW5nIGNvbmZpZ3VyZWQsIGVuZGluZyBpbiBhIGNyYXNoLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDUwNQorCisyMDE0LTEyLTMwIDE4OjAzOjIyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9pY2xlcy9nZGtwaXhidWZvdmVybGF5LXRlc3QuYzoKKwkgIHRlc3RzOiBnZGtwaXhidWZvdmVybGF5LXRlc3Q6IHJlbW92ZSBvdXRkYXRlZCBGSVhNRQorCisyMDE0LTEyLTMwIDE3OjE5OjQyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBjb2xsaXNpb24uYzoKKwkgIHRlc3RzOiBydHBjb2xsaXNpb246IHVzZSBhbGF3ZW5jL2RlYyBpbiB0aGVzZSB0ZXN0cyBpbnN0ZWFkIG9mIFNwZWV4CisJICBUaGV5IHNob3VsZCBhbHdheXMgYmUgYnVpbHQsIHdoaWxlIHRoZSBzcGVleCBlbGVtZW50cyBhcmUgbm90LgorCSAgTmVlZCB0byBjaGVjayBmb3IgYSBzbWFsbGVyIG51bWJlciBvZiBidWZmZXJzIHRoZW4gKDctPjQpIGJlY2F1c2UKKwkgIHNwZWV4ZW5jIHdpbGwgYWRkIDMgaGVhZGVyIGJ1ZmZlcnMgd2hpbGUgYWxhd2VuYyB3aWxsIGp1c3Qgb3V0cHV0CisJICBhcyBtYW55IGJ1ZmZlcnMgYXMgaXQgcmVjZWl2ZXMgYXMgaW5wdXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQyMDk4CisKKzIwMTQtMTItMzAgMTY6MzY6MDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy9zaW1wbGUtbGF1bmNoLWxpbmVzLmM6CisJICB0ZXN0czogc2ltcGxlLWxhdW5jaC1saW5lczogb25seSBydW4ganBlZy9wbmcgdGVzdHMgaWYgZWxlbWVudHMgYXJlIGF2YWlsYWJsZQorCisyMDE0LTEyLTMwIDE2OjI2OjU4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IERvbid0IHJldHVybiBhIGJ1ZmZlciB3aGVuIHJldHVybmluZyBub3QgR1NUX0ZMT1dfT0sKKwkgIGJhc2VzcmMgYXNzdW1lcyB0aGF0IHdlIGRvbid0IHJldHVybiBhIGJ1ZmZlciBpZgorCSAgc29tZXRoaW5nIGVsc2UgdGhhbiBPSyBpcyByZXR1cm5lZC4gSXQgd2lsbCBqdXN0CisJICBsZWFrIGFueSBidWZmZXIgd2UgbWlnaHQgYWNjaWRlbnRpYWxseSBwcm92aWRlCisJICBoZXJlLgorCSAgVGhpcyBjYW4gcG90ZW50aWFsbHkgaGFwcGVuIGR1cmluZyBmbHVzaGluZy4KKwkgIE1heWJlIGZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDE5OTMKKworMjAxNC0xMi0zMCAxNDo1Mjo0MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYXV4LmM6CisJICB0ZXN0czogcnRwYXV4OiB1c2UgYWxhd2VuYy9kZWMgaW4gdGhlc2UgdGVzdHMgaW5zdGVhZCBvZiBTcGVleAorCSAgVGhleSBzaG91bGQgYWx3YXlzIGJlIGJ1aWx0LCB3aGlsZSB0aGUgc3BlZXggZWxlbWVudHMgYXJlIG5vdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDIwOTgKKworMjAxNC0xMi0yOSAxNTozNToxOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBJbXByb3ZlIGRldGVjdGlvbiBvZiBiZWluZyBzdHVjayBhdCB0aGUgc2FtZSBvZmZzZXQKKwkgIE9ubHkgZXJyb3Igb3V0IGlmIHdlIHJlYWQgZnJvbSB0aGUgc2FtZSBwb3NpdGlvbiBhZ2FpbiBhbmQgZ290IHRoZQorCSAgc2FtZSBsZW5ndGguIEp1c3QgdGhlIHNhbWUgcG9zaXRpb24gaXMgbm90IG5lY2Vzc2FyaWx5IGVub3VnaC4KKworMjAxNC0xMi0yOSAxNTowMDowMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBEb24ndCBnZXQgc3R1Y2sgYXQgdGhlIHNhbWUgb2Zmc2V0IHdoZW4gc2VhcmNoaW5nIGZvciBjbHVzdGVycworCSAgVGhpcyBjb3VsZCBoYXBwZW4gaWYgdGhlcmUgaXMgYW4gaW52YWxpZCBjbHVzdGVyIHdpdGggc2l6ZSAwLCBhbmQgaW4gdGhhdAorCSAgY2FzZSBqdXN0IGVycm9yIG91dCBpbnN0ZWFkIG9mIGxvb3BpbmcgZm9yZXZlci4KKworMjAxNC0xMi0yNSAyMTozMjo0MCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGZpeCBBTEFDIG11eGluZworCSAgQWN0dWFsbHkgY29weSB0aGUgY29kZWMgZGF0YSBpbnN0ZWFkIG9mIGNvcHlpbmcgbm90aGluZworCSAgYW5kIHRoZW4gYm9tYmluZyBvdXQgYmVjYXVzZSB0aGVyZSdzIG5vIGRhdGEuCisJICBGaXhlczogZ3N0LWxhdW5jaC0xLjAgYXVkaW90ZXN0c3JjICEgYXZlbmNfYWxhYyAhIHF0bXV4ICEgZmFrZXNpbmsKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDE3ODMKKworMjAxNC0xMi0yNSAxNTo0ODowNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSAgcnRwcHRkZW11eDoganVzdCBkcm9wIGludmFsaWQgcnRwIHBhY2tldHMgaW5zdGVhZCBvZiBlcnJvcmluZyBvdXQKKwkgIEFwcGFyZW50bHkgbGlucGhvbmUgc2VuZHMgYW4gaW52YWxpZCBSVFAgcGFja2V0IGFzIHZlcnkKKwkgIGZpcnN0IHBhY2tldC4gV2Ugd2FudCB0byBpZ25vcmUgdGhhdCBpbnN0ZWFkIG9mIGVycm9yaW5nCisJICBvdXQgKHNhbWUgZm9yIGFueSBvdGhlciBpbnZhbGlkIHBhY2tldHMgcmVhbGx5KS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDEzOTgKKworMjAxNC0xMi0yNSAxNTo0NDoxNSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSAgcnRwcHRkZW11eDogZml4IDAuMTAtaXNtIGluIGRvY3MKKworMjAxNC0xMi0yNSAxNDo1ODoxMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvaWNsZXMvZ2RrcGl4YnVmb3ZlcmxheS10ZXN0LmM6CisJICB0ZXN0czogZ2RrcGl4YnVmb3ZlcmxheS10ZXN0OiB1c2UgYWJzb2x1dGUgcG9zaXRpb25pbmcgdG8gZml4IGRlbW8KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk1NjYKKworMjAxNC0xMi0yNSAxNDo1MzowOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmb3ZlcmxheS5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmb3ZlcmxheS5oOgorCSAgZ2RrcGl4YnVmb3ZlcmxheTogYWRkICJwb3NpdGlvbmluZy1tb2RlIiBwcm9wZXJ0eSB0byBhbGxvdyBhYnNvbHV0ZSBwb3NpdGlvbnMKKwkgIFNldCBwb3NpdGlvbmluZy1tb2RlPXBpeGVscy1hYnNvbHV0ZSB0byBhbGxvdyBwb3NpdGlvbmluZyB3aXRoCisJICBhYnNvbHV0ZSBjb29yZGluYXRlcywgbWVhbmluZyBuZWdhdGl2ZSB4L3kgb2Zmc2V0cyB3aWxsIGJlCisJICBpbnRlcnByZXRlZCBhcyBiZWluZyB0byB0aGUgbGVmdC9hYm92ZSB0aGUgdmlkZW8gZnJhbWUgaW5zdGVhZAorCSAgb2YgYmVpbmcgaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhlIHJpZ2h0L2JvdHRvbSBlZGdlIG9mCisJICB0aGUgdmlkZW8gZnJhbWUgKHdoaWNoIGlzIGEgc2lsbHkgZGVmYXVsdCwgYnV0IHRoYXQncyBob3cgaXQgaXMpLgorCSAgVGhpcyBtZWFucyB3ZSBjYW4gbmljZWx5IHNsaWRlIGltYWdlcyBpbnRvIGFuZCBvdXQgb2YgdGhlIGZyYW1lLAorCSAgc2VlIGdka3BpeGJ1Zm92ZXJsYXktdGVzdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk1NjYKKworMjAxNC0xMi0yMiAxNTozMzo1MSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJICBvc3hhdWRpbzogRGlyZWN0bHkgcmV0dXJuIHRoZSByaW5nYnVmZmVyJ3MgY2FwcyBpZiBpdCBpcyBhY3F1aXJlZAorCisyMDE0LTEyLTIyIDEyOjU2OjE5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkgIG9zeGF1ZGlvOiBQdXQgYWxsIGF1ZGlvIGZvcm1hdHMgaW50byB0aGUgdGVtcGxhdGUgY2FwcworCSAgV2UgcmVwb3J0IHRoZSBwcm9wZXIgY2FwcyBsYXRlciBmcm9tIHRoZSBnZXRfY2FwcygpIHZmdW5jIGltcGxlbWVudGF0aW9uIGFmdGVyCisJICBwcm9iaW5nIHRoZSBzZWxlY3RlZCBkZXZpY2UuCisKKzIwMTQtMTItMjIgMTI6NTY6MDUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3JpbmdidWZmZXIuYzoKKwkgIG9zeGF1ZGlvOiBBbHNvIHNldCB0aGUgYmlnIGVuZGlhbiBmbGFnIGZvciBmbG9hdGluZyBwb2ludCBzYW1wbGVzCisKKzIwMTQtMTItMjIgMTE6NDU6NTkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIE1BSU5UQUlORVJTOgorCSAgTUFJTlRBSU5FUlM6IFVwZGF0ZSBteSBtYWlsIGFkZHJlc3MKKworMjAxNC0xMi0yMiAxMDoyMzowMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJICBvc3hhdWRpbzogRml4IGRlYWRsb2NrIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGluIGRldmljZSBzZWxlY3Rpb24gY29kZQorCSAgQWZ0ZXIgY3JlYXRpbmcgdGhlIHJpbmdidWZmZXIgd2UgaGF2ZSB0byBzZXQgdGhlIGRldmljZSBvbiB0aGUgcmluZ2J1ZmZlciBhcworCSAgaXQgZGVmYXVsdHMgdG8ga0F1ZGlvRGV2aWNlVW5rbm93bi4gQXQgdGhpcyBwb2ludCBpdCBjYW4ndCBoYXZlIGNoYW5nZWQgdG8KKwkgIGFueXRoaW5nIGVsc2UgeWV0IGFuZCB3ZSBkb24ndCBoYXZlIHRvIG5vdGlmeSBhYm91dCBjaGFuZ2VzIHRvIHRoZSBzaW5rL3NyYworCSAgImRldmljZSIgcHJvcGVydHkuIEl0J3MgYWxzbyBub3QgYSBnb29kIGlkZWEgYmVjYXVzZSBHc3RBdWRpb0Jhc2VTcmMgaGFzIHRoZQorCSAgb2JqZWN0IGxvY2sgdGFrZW4gd2hpbGUgdGhlIHJpbmdidWZmZXIgaXMgY3JlYXRlZCwgd2hpY2ggbWlnaHQgY2F1c2UgYQorCSAgZGVhZGxvY2sgaWYgc29tZXRoaW5nIGNhbGxzIGJhY2sgaW50byB0aGUgZWxlbWVudCBmcm9tICJub3RpZnk6OmRldmljZSIuCisJICBPbmNlIHRoZSBiYXNlIGNsYXNzIGlzIGRvbmUgd2l0aCB0aGUgTlVMTF9UT19SRUFEWSBzdGF0ZSBjaGFuZ2UsIGl0IGhhcyBvcGVuZWQKKwkgIHRoZSBkZXZpY2UgdmlhIHRoZSByaW5nYnVmZmVyIGFuZCB0aGlzIG1pZ2h0IGhhdmUgY2hvc2VuIGEgZGlmZmVyZW50IGRldmljZS4KKwkgIEVzcGVjaWFsbHkgaWYgd2UgaW5pdGlhbGx5IHVzZWQga0F1ZGlvRGV2aWNlVW5rbm93bi4gQWxzbyBub3RpZnkgYWJvdXQgdGhpcworCSAgcHJvcGVydHkgY2hhbmdlIGFzIGluaXRpYWxseSBpbnRlbmRlZCBieSB0aGlzIGNvZGUuCisKKzIwMTQtMTItMTkgMTI6MzA6MDMgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJwb29sOiBVcGRhdGUgY29uZmlndXJhdGlvbiBzaXplCisJICBXZSBhbHJlYWR5IHVwZGF0ZSBvdXIgY29weSBvZiBWaWRlb0luZm8uc2l6ZSB0byBwcm9wZXIgc2l6ZSwgbm93IGFsc28KKwkgIHRoZSBjb25maWd1cmF0aW9uIHNvIHRoZSBzaXplIG1hdGNoZXMgb24gcmVsZWFzZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDE0MjAKKworMjAxNC0xMi0xOSAxMDo1NzoyOSArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkgIG1hdHJvc2thLWRlbXV4OiBDYWNoZSB1cHN0cmVhbSBsZW5ndGgKKwkgIEluc3RlYWQgb2YgY29uc3RhbnRseSBxdWVyeWluZyB1cHN0cmVhbSwganVzdCBjYWNoZSB0aGUgbGFzdCBkdXJhdGlvbiwKKwkgIGFuZCBpbiB0aGUgdW5saWtlbHluZXNzIHdlIG1pZ2h0IGhhdmUgZ29uZSBvdmVyIHF1ZXJ5IGFnYWluIGJlZm9yZQorCSAgZGVjaWRpbmcgd2UgYXJlIEVPUy4KKwkgIEN1dCAxNSUgY3B1IG9mZiBtYXRyb3NrYWRlbXV4IHN0cmVhbWluZyB0aHJlYWQgKHNyc2x5Li4uKQorCisyMDE0LTEyLTE3IDE3OjM2OjE4ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYTogbXV4L2RlbXV4IHRoZSBPcHVzSGVhZCBoZWFkZXIKKwkgIFRoaXMgaXMgbWVhbnQgdG8gYmUgc28gKGh0dHBzOi8vd2lraS54aXBoLm9yZy9NYXRyb3NrYU9wdXMgLSB3aGlsZQorCSAgaXQgaXMgbWFya2VkIGFzIGEgZHJhZnQsIHRoaXMgcGFydCB3YXMgY29uZmlybWVkIHRvIGJlIGNvcnJlY3Qgb24KKwkgIElSQyksIGFuZCBhbGxvd3Mgb25lIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZGVtdXhlZCBzdHJlYW0gaXMKKwkgIG11bHRpc3RyZWFtIG9yIG5vdCwgYW5kIHRodXMgc2V0IHRoZSBtdWx0aXN0cmVhbSBjYXBzIGZpZWxkCisJICBhY2NvcmRpbmdseS4gSW4gdHVybiwgdGhpcyBtZWFucyBkb3duc3RyZWFtIGRvZXMgbm90IGhhdmUgdG8gZ3Vlc3MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQwNzQ0CisKKzIwMTQtMTItMTggMTE6NTA6MzMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IERvbid0IGRlcmVmZXJlbmNlIE5VTEwgaWYgYSBzdWl0YWJsZSBzdHJlYW0gZm9yIHRoZSBBVVggZWxlbWVudCBjYW4ndCBiZSBmb3VuZAorCSAgQ0lEIDEyNTg3MTcKKworMjAxNC0xMi0xOCAxMDo1MzozOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGVmMWZmZGMgdG8gZjJjNmI5NQorCisyMDE0LTEyLTEyIDIzOjA2OjA3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaDoKKwkgIHVkcHNpbms6IGFsbG9jYXRlIHNjcmF0Y2ggc3BhY2UgZm9yIHJlbmRlciBmdW5jdGlvbnMgb24gdGhlIGhlYXAKKwkgIGFuZCBub3QgdGhlIHN0YWNrLiBPdXIgYWxsb2NhdGlvbnMgY291bGQgZ2V0IGEgYml0IHRvbyBsYXJnZQorCSAgdG8gYmUgc3VyZSBpdCdzIG5vdCBnb2luZyB0byBjYXVzZSB0cm91YmxlIHVzaW5nIHRoZSBzdGFjay4KKworMjAxNC0wNi0yNCAwMToxNjozNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpdWRwc2luazogcmUtdXNlIHNlbmRfYnVmZmVycygpIGNvZGUgcGF0aCBmb3IgcmVuZGVyKCkgZnVuY3Rpb24KKwkgIEl0J3MgbGlrZSByZW5kZXJpbmcgYSBidWZmZXIgbGlzdCwganVzdCB3aXRoIG9uZSBidWZmZXIuCisJICBIYXMgdGhlIGFkZGVkIGFkdmFudGFnZSB0aGF0IGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBjbGllbnRzCisJICB3ZSBjYW4gc2VuZCB0aGUgYnVmZmVyIHRvIGFsbCB0aGUgY2xpZW50cyBpbiBvbmUgZ28uCisKKzIwMTQtMDYtMjQgMDE6MTU6MjUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSAgbXVsdGl1ZHBzaW5rOiBrZWVwIGNsaWVudCBsaXN0IGNvbnNpc3RlbnQgZHVyaW5nIHJlbW92YWxzCisJICBXZSB1bmxvY2sgYW5kIHJlLWxvY2sgdGhlIGNsaWVudCBsb2NrIHdoaWxlIGVtaXR0aW5nIHRoZQorCSAgcmVtb3ZlZCBzaWduYWwsIHdoaWNoIGNhdXNlcyBpbmNvbnNpc3RlbmNpZXMgaW4gdGhlIGNsaWVudAorCSAgbGlzdCB2cy4gdGhlIGNsaWVudCBjb3VudHMuIEluc3RlYWQsIHJlbW92ZSB0aGUgY2xpZW50IGZyb20KKwkgIHRoZSBsaXN0IGFscmVhZHkgYmVmb3JlIGVtaXR0aW5nIHRoZSBzaWduYWwgYW5kIHB1dCBpdCBpbnRvCisJICBhIHRlbXBvcmFyeSBsaXN0IG9mIGNsaWVudHMgdG8gYmUgcmVtb3ZlZC4gVGhhdCB3YXkgdGhpbmdzCisJICBsb29rIGNvbnNpc3RlbnQgdG8gdGhlIHN0cmVhbWluZyB0aHJlYWQsIGJ1dCBzaWduYWwgY2FsbGJhY2tzCisJICBjYW4gc3RpbGwgZG8gdGhpbmdzIGxpa2UgZ2V0IHN0YXRzIGZyb20gcmVtb3ZlZCBjbGllbnRzLgorCisyMDE0LTA2LTI0IDAwOjU2OjI3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgbXVsdGl1ZHBzaW5rOiBmaXggY2xpZW50IGNvdW50IGFmdGVyIHJlbW92YWwKKworMjAxNC0wNi0yMyAxODo0MzoyMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpdWRwc2luazoga2VlcCBjbGllbnQgbGlzdCBzb3J0ZWQgYnkgc29ja2V0IGZhbWlseQorCSAgV2UgbWFrZSB1c2Ugb2YgaW4gdGhlIHNlbmRfYnVmZmVycygpIGZ1bmN0aW9uIGlmIHdlCisJICBuZWVkIHRvIHVzZSBkaWZmZXJlbnQgc29ja2V0cyB0byBzZW5kIHRvIElQdjQgYW5kCisJICBJUHY2IGRlc3RpbmF0aW9ucy4KKworMjAxNC0wNi0yMCAxMTozNjoxOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJICBtdWx0aXVkcHNpbms6IGFkZCBzZW5kbW1zZy1yZWFkeSByZW5kZXJfbGlzdCBmdW5jdGlvbiBwcm90b3R5cGUKKwkgIEFkZCBwcm90b3R5cGUgZm9yIGEgcmVuZGVyX2xpc3QoKSBmdW5jdGlvbiB0aGF0IGNhbiB1c2UgYQorCSAgc2VuZG1tc2ctc3R5bGUgZ19zb2NrZXRfc2VuZF9tZXNzYWdlcygpIGZ1bmN0aW9uIG9uY2UgaXQgbGFuZHMKKwkgIGluIEdMaWIuIFdlIGNhbiB1c2UgdGhpcyBpbmZyYXN0cnVjdHVyZSB0byBzZW5kIG11bHRpcGxlIGJ1ZmZlcnMKKwkgIG1hZGUgdXAgYnkgbXVsdGlwbGUgbWVtb3JpZXMgdG8gbXVsdGlwbGUgY2xpZW50cyBpbiBvbmUgZ28sIHdoaWNoCisJICBkcmFzdGljYWxseSByZWR1Y2VzIHRoZSBudW1iZXIgb2Ygc3lzY2FsbHMgbWFkZSB3aGVuIHNlbmRpbmcKKwkgIGhpZ2gtYml0cmF0ZSB2aWRlbyBzdHJlYW1zLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMjE1MgorCisyMDE0LTA2LTE5IDE5OjE2OjAxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaDoKKwkgIG11bHRpdWRwc2luazogbWFrZSB1ZHAgY2xpZW50IHN0cnVjdHVyZSByZWZjb3VudGVkCisJICBVc2UgdGhlIHJlZmNvdW50IGZvciBtZW1vcnkgbWFuYWdlbWVudCBhbmQga2VlcCB0cmFjaworCSAgb2YgdGhlIG51bWJlciBvZiBkdXBsaWNhdGUgY2xpZW50cyBpbiBhIHNlcGFyYXRlCisJICB2YXJpYWJsZS4gVGhpcyB3aWxsIGJlIHVzZWZ1bCBsYXRlciwgYW5kIG1lYW5zIHdlCisJICBkb24ndCBoYXZlIHRvIGhvbGQgdGhlIE9CSkVDVF9MT0NLIGFsbCB0aGUgdGltZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzI4NjYKKworMjAxNC0wNi0xOSAxODozMTowNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJICBtdWx0aXVkcHNpbms6IGtlZXAgY291bnQgb2YgbnVtYmVyIG9mIHVuaXF1ZSBhbmQgbm9uLXVuaXF1ZSBJUHY0IGFuZCBJUHY2IGNsaWVudHMKKwkgIFRoaXMgd2lsbCBjb21lIGluIGhhbmR5IGxhdGVyLgorCisyMDE0LTEyLTE2IDE1OjAwOjIyIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogRGlzYWJsZSBjcmVhdGVfYnVmIHdpdGggbGlidjRsMgorCSAgTGlidjRsMiBkb2VzIG5vdCB3b3JrIHdpdGggQ1JFQVRFX0JVRlMuIEluc3RlYWQgb2YgZmFpbGluZyBvbiByYW5kb20KKwkgIGVycm9yIGNhdXNlZCBieSBsaWJ2NGwyLCBkaXNhYmxlIENSRUFURV9CVUZTIHdoZW4gYW4gZW11bGF0ZWQgZm9ybWF0IGlzCisJICBkZXRlY3RlZC4KKworMjAxNC0xMi0wOSAxNzozOToxMiAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJICB2NGwyYWxsb2NhdG9yOiBBZGQgcHJvdGVjdGlvbiBhZ2FpbnN0IGJyb2tlbiBsaWJ2NGwyCisJICBJdCBsb29rcyBsaWtlIGxpYnY0bDIgc3VwcG9ydCBmb3IgQ1JFQVRFX0JVRiBpcyBpbmNvbXBsZXRlLiBUaGF0CisJICBjb21iaW5lIHdpdGggZXhpc3RpbmcgYnVncyBtYXkgbGVhZCB0byBjcmFzaCBpbiBHU3RyZWFtZXIuIFRoZXNlCisJICBjaGVjayB3aWxsIG1ha2UgaXQgcm9idXN0IGJ5OgorCSAgLSBDaGVja2luZyBjcmVhdGUgYnVmIGluZGV4IGlzbid0IGFuIGFscmVhZHkgaW4gdXNlZCBpbmRleAorCSAgLSBDaGVja2luZyB0aGF0IHRoZSBpbmRleCBvdXQgb2YgUVVFUllCVUYgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkCisJICBpbmRleAorCisyMDE0LTEyLTE2IDE2OjM3OjI0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBBZGQgc29tZXRoaW5nIHRvIHRoZSBkZWJ1ZyBsb2dzIGlmIGFuIFJUWCBBVVggZWxlbWVudCBjYW4ndCBiZSBhZGRlZAorCSAgLi4uIGJlY2F1c2UgdGhlIGFwcGxpY2F0aW9uIGFscmVhZHkgaGFzIGEgc2lnbmFsIGhhbmRsZXIgc2V0IHVwIGhlcmUuCisKKzIwMTQtMTEtMjEgMTQ6MTM6MzQgKzExMDAgIE1hdHRoZXcgV2F0ZXJzIDxtYXR0aGV3QGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogYWRkIHJldHJhbnNtaXNzaW9uIHN1cHBvcnQgYWNjb3JkaW5nIHRvIFJGQzQ1ODgKKwkgIEJhc2VkIG9uIHRoZSBjbGllbnQtcnRwYXV4IGV4YW1wbGUKKworMjAxNC0xMi0xNiAxMzoyNTowMSArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogY2xlYXIgcmVjdGFuZ2xlIHN0cnVjdHVyZXMgYmVmb3JlIHVzZQorCisyMDE0LTEyLTA5IDE1OjA5OjU2IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IEFsd2F5cyBzZXQgZm9ybWF0CisJICBSaWdodCBub3cgd2UgdHJ5IHRvIGJlIGNsZXZlciBieSBkZXRlY3RpbmcgaWYgZGV2aWNlIGZvcm1hdCBoYXZlCisJICBjaGFuZ2VkIG9yIG5vdCwgYW5kIHNraXAgc2V0dGluZyBmb3JtYXQgaW4gdGhpcyBjYXNlLiBUaGlzIGlzIHZhbGlkCisJICBiZWhhdmlvdXIgd2l0aCBWNEwyLCBidXQgaXQncyBhbHNvIHZlcnkgZXJyb3IgcHJvbmUuIFRoZSByYXRpb25hbAorCSAgZm9yIG5vdCBzZXR0aW5nIHRoZXNlIGFsbCB0aGUgdGltZSBpcyBmb3Igc3BlZWQsIHRob3VnaCBJIGNhbid0CisJICBtZWFzdXJlIGFueSBub3RpY2VhYmxlIGdhaW4gb24gYW55IEhXIEkgb3duLiBBbHNvLCB1bnRpbCByZWNlbnRseSwKKwkgIHdlIHdoZXJlIGRvaW5nIGdldC9zZXQgb24gdGhlIGZvcm1hdCBmb3IgZWFjaCBmb3JtYXQgd2Ugd2hlcmUKKwkgIHByb2JpbmcsIG1ha2luZyBpdCBuZWFyIHRvIGltcG9zc2libGUgdGhhdCB0aGUgZm9ybWF0IHdvdWxkIG1hdGNoLgorCSAgVGhpcyBhbHNvIGZpeGVzIGJ1ZyB3aGVyZSB3ZSB3aGVyZSBza2lwcGluZyBmcmFtZS1yYXRlIHNldHRpbmcgaWYKKwkgIGZvcm1hdCBkaWRuJ3QgY2hhbmdlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDYzNgorCisyMDE0LTEyLTE1IDE4OjMwOjAxIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJICB2aWRlb2Nyb3A6IFJlbW92ZSB0b2RvIGFib3V0IGNhcHMgZmlsdGVyCisJICBUaGUgZmlsdGVyIGlzIGFscmVhZHkgaW50ZXJlY3RlZC4KKworMjAxNC0xMi0xNSAxODoxOTowNSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuaDoKKwkgIHZpZGVvY3JvcDogTWFrZSBzdXJlIG5ldyBjcm9wIGlzIGFwcGxpZWQKKwkgIFNpbmNlICJiYXNldHJhbnNmb3JtOiBGaXggY2FwcyBlcXVhbGl0eSBjaGVjayIgY29tbWl0IGE3ZjM1NywKKwkgIHNldF9pbmZvKCkgd2lsbCBub3QgYmUgY2FsbGVkIGFueW1vcmUgaWYgY3JvcCBkaWRuJ3QgY2hhbmdlCisJICB0aGUgY2Fwcy4gVGhpcyBpcyBmaXhlZCBieSBzZXR0aW5nICJuZWVkX3VwZGF0ZSIgYm9vbGVhbiB3aGVuCisJICBjcm9wcGluZyBwcm9wZXJ0aWVzIGhhcyBiZWVuIGNoYW5nZWQsIGFuZCB0aGVuIGFwcGx5aW5nIHRoZXNlCisJICBpZiB0aGV5IHdoZXJlIG5vdCBhcHBsaWVkIGJlZm9yZSByZW5kZXJpbmcgdGhlIG5leHQgZnJhbWUuIFRoaXMKKwkgIHBhdGNoIGFsc28gZml4ZWQgdGhlIGxvY2tpbmcsIGRyb3BwaW5nIHVuLW5lZWRlZCBjdXN0b20gbG9jaywKKwkgIGFuZCBubyBob2xkaW5nIG5lZWRsZXNzIGxvY2sgd2hpbGUgZG9pbmcgdGhlIG9wZXJhdGlvbiBhcyB3ZQorCSAgYWxyZWFkeSBob2xkIHRoZSBzdHJlYW1pbmcgbG9jay4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDA3ODcKKworMjAxNC0xMi0xMiAxODoxMDozNSArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Z2l0QGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkgIG9zeGF1ZGlvc2luazogUHJlZmVyIGZpbHRlciBjYXBzIG9yZGVyIHdoaWxlIGdldHRpbmcgY2FwcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDk4NworCisyMDE0LTEyLTA5IDEzOjM4OjI2ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxnaXRAYXJ1bnJhZ2hhdmFuLm5ldD4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSAgb3N4YXVkaW9zaW5rOiBBZGQgc29tZSBlcnJvciBoYW5kbGluZyBhcm91bmQgY2hhbm5lbCBsYXlvdXQgcGFyc2luZworCSAgRm9yIG5vdyB3ZSBqdXN0IHNwaXQgYSB3YXJuaW5nIGFuZCBpZ25vcmUgdGhlIGNoYW5uZWwgbGF5b3V0IGlmIHdlIGNhbid0CisJICBzdXBwb3J0IGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDk4NworCisyMDE0LTEyLTA4IDIyOjM4OjIyICswNTMwICBBcnVuIFJhZ2hhdmFuIDxnaXRAYXJ1bnJhZ2hhdmFuLm5ldD4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJICBvc3hhdWRpbzogVGFrZSBsb2NrIGFyb3VuZCBzaW5rL3NvdXJjZSBiZWZvcmUgYWNjZXNzaW5nIHRoZSByaW5nYnVmZmVyCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQwOTg3CisKKzIwMTQtMTItMDEgMjE6MDY6MjcgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGdpdEBhcnVucmFnaGF2YW4ubmV0PgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmg6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9yZW1vdGVpby5jOgorCSAgb3N4YXVkaW9zcmM6IFByb2JlIGNoYW5uZWwgbGF5b3V0IHRvbworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDk4NworCisyMDE0LTEyLTAxIDIwOjMyOjA0ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxnaXRAYXJ1bnJhZ2hhdmFuLm5ldD4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSAgb3N4YXVkaW9zaW5rOiBPbmx5IGZpeCB1cCBjaGFubmVscy9sYXlvdXQgZm9yIFBDTSBjYXBzIHdoaWxlIHByb2JpbmcKKwkgIEl0J3MgdW5saWtlbHkgdGhhdCBzZXR0aW5nIGEgY2hhbm5lbCBsYXlvdXQgd2lsbCBkbyBtdWNoIGZvciBBQzMvRFRTCisJICBzdHJlYW1zLiBJZiB3ZSBmaW5kIGF0IHNvbWUgcG9pbnQgdGhhdCBpdCBkb2VzIG1ha2Ugc2Vuc2UsIHdlIGNhbgorCSAgcGVyZm9ybSB0aGUgc3RydWN0dXJlIGNvcHlpbmcgdW5jb25kaXRpb25hbGx5IChpLmUuLCB0aGUgY3VycmVudCBjb2RlIGlzCisJICB3cm9uZywgc2luY2UgQUMzL0RUUyB3aWxsIGdldCB0d28gc3RydWN0dXJlcyBub3cgLSBvbmUgd2l0aCB0aGUgY2hhbm5lbAorCSAgbGF5b3V0LCBvbmUgd2l0aG91dCkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQwOTg3CisKKzIwMTQtMTItMDEgMTk6NDE6MzUgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGdpdEBhcnVucmFnaGF2YW4ubmV0PgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5oOgorCSAgb3N4YXVkaW9zcmM6IEltcGxlbWVudCBjYXBzIHByb2JpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDA5ODcKKworMjAxNC0xMi0wMSAxOToyOTo1NyArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Z2l0QGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9oYWwuYzoKKwkgIG9zeGF1ZGlvOiBCaW5kIGF1ZGlvIGRldmljZSB0byBhdWRpbyB1bml0IGVhcmx5CisJICBXZSB3YW50IHRvIGJpbmQgdGhlIGRldmljZSBkdXJpbmcgb3BlbiBzbyB0aGF0IHN1YnNlcXVlbnQgZm9ybWF0IHF1ZXJpZXMKKwkgIG9uIHRoZSBhdWRpbyB1bml0IGFyZSBhcyBzcGVjaWZpYyBhcyBwb3NzaWJsZSBmcm9tIHRoYXQgcG9pbnQgb253YXJkcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDA5ODcKKworMjAxNC0xMS0yOSAyMzoxNjozMCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Z2l0QGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkgIG9zeGF1ZGlvc2luazogRml4IHVwIGNhcHMgcXVlcnlpbmcgYSBiaXQKKwkgIFRoaXMgc2hvdWxkIG1ha2UgY2FwcyBxdWVyaWVzIGNvcnJlY3QgaW4gUEFVU0VEIGFuZCBoaWdoZXIgYXMgd2VsbC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDA5ODcKKworMjAxNC0xMS0yOCAyMjozMjozNiArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Z2l0QGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5jOgorCSAgb3N4YXVkaW86IE1vdmUgb3N4YXVkaW9zcmMtc3BlY2lmaWMgY29kZSBvdXQgb2YgdGhlIGdlbmVyaWMgcGF0aAorCSAgQXZvaWRzIG9uZSBsYXllcmluZyB2aW9sYXRpb24gKEdzdENvcmVBdWRpbyByZWZlcnJpbmcgdG8KKwkgIEdzdE9zeEF1ZGlvU3JjKS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDA5ODcKKworMjAxNC0xMS0yOCAyMjoyMzoxNyArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Z2l0QGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3JpbmdidWZmZXIuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3JpbmdidWZmZXIuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2hhbC5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb3JlbW90ZWlvLmM6CisJICBvc3hhdWRpbzogQ2xlYW4gdXAgYSBHc3RDb3JlQXVkaW8gLT4gR3N0T3N4QXVkaW9TcmMvU2luayByZWZlcmVuY2UKKwkgIE5vdyB0aGF0IGRldmljZSBzZWxlY3Rpb24gaGFzIG5vIHNpbmsvc291cmNlLXNwZWNpZmljIGJpdHMsIHdlIGNhbiBoYXZlCisJICBnZW5lcmljIGRldmljZSBzZWxlY3Rpb24gZm9yIHRoaXMgcGF0aC4gV2UgZG8gbmVlZCB0byBub3cgdHJhY2sgc3RhdGUKKwkgIGNoYW5nZXMgc28gd2UgY2FuIGxvb2sgdXAgdGhlIGZpbmFsIGRldmljZV9pZCBvbmNlIHRoZSBkZXZpY2UgaXMgb3BlbiwKKwkgIHRob3VnaC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDA5ODcKKworMjAxNC0xMS0yOCAxOTo0MDo1MiArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Z2l0QGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkgIG9zeGF1ZGlvc2luazogTW92ZSBkZXZpY2UgY2FwcyBwcm9iaW5nIHRvIGdldF9jYXBzKCkKKwkgIFRoaXMgc2hvdWxkIGJlIHByZWZlcnJlZCB0byBydW5uaW5nIHRoZSBwcm9iZSBhdCBkZXZpY2Ugb3BlbiB0aW1lLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDk4NworCisyMDE0LTExLTI4IDE4OjM3OjAyICswNTMwICBBcnVuIFJhZ2hhdmFuIDxnaXRAYXJ1bnJhZ2hhdmFuLm5ldD4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2hhbC5jOgorCSAgb3N4YXVkaW86IE1ha2Ugc29tZSBkZWJ1ZyBjb2RlIGNvbXBpbGUgY29uZGl0aW9uYWxseQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDk4NworCisyMDE0LTExLTI4IDE1OjA2OjM1ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxnaXRAYXJ1bnJhZ2hhdmFuLm5ldD4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJICBvc3hhdWRpbzogTW92ZSBkZXZpY2Ugc2VsZWN0aW9uIHRvIHJpbmdidWZmZXItPm9wZW5fZGV2aWNlKCkKKwkgIFRoaXMgaXMgY29uY2VwdHVhbGx5IHRoZSByaWdodCB0aGluZyB0byBkbywgYW5kIGFsbG93cyB1cyB0byBjb3JyZWN0bHkKKwkgIGNhdGNoIGVycm9ycyBpbiBkZXZpY2Ugc2VsZWN0aW9uIGFzIHdlbGwsIHdoaWNoIHdlIGNvdWxkIG5vdCBkbyB3aGlsZQorCSAgY3JlYXRpbmcgdGhlIHJpbmdidWZmZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQwOTg3CisKKzIwMTQtMTEtMjggMTQ6MzQ6MzQgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGdpdEBhcnVucmFnaGF2YW4ubmV0PgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9oYWwuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9yZW1vdGVpby5jOgorCSAgb3N4YXVkaW86IENvbnNvbGlkYXRlIGlucHV0IGFuZCBvdXRwdXQgY29kZSBwYXRocyBhIGJpdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDk4NworCisyMDE0LTExLTIxIDExOjU0OjE4ICswMTAwICBUaGliYXVsdCBTYXVuaWVyIDx0c2F1bmllckBnbm9tZS5vcmc+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgRGVpbnRlcmxhY2U6IGluIHF1ZXJ5X2NhcHMgcmV0dXJuIG9ubHkgc3VwcG9ydGVkIGZvcm1hdHMgaWYgZmlsdGVyIGlzIGludGVybGFjZWQKKwkgIEluIHNvbWUgY2FzZXMgdGhlIGN1cnJlbnRseSBzZXQgR3N0VmlkZW9JbmZvIGlzIG5vdCBpbnRlcmxhY2VkLCBidXQKKwkgIHVwc3RyZWFtIGNhcHMgYXJlIGludGVybGFjZWQgYW5kIHRoZSBpbmZvIGlzIHBhc3NlZCBpbiB0aGUgZmlsdGVyLAorCSAgd2Ugc2hvdWxkIHRha2UgdGhhdCBpbmZvIGludG8gYWNjb3VudCBhbmQgbWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90CisJICBjb25zaWRlciB0aGF0IGNhc2UgYXMgYSAicGFzcyB0aHJvdWdoIiBjYXNlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MTQwNworCisyMDE0LTEyLTEyIDExOjA2OjE3ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBkZWJ1ZyBzdGF0ZW1lbnQKKwkgIEl0IHdhcyB1c2luZyB0aGUgbm9uLWluY3JlYXNpbmcgb2Zmc2V0IHZhcmlhYmxlLCB3aGljaCBtYWRlIHRoYXQgc3RhdGVtZW50CisJICBub3Qgc28gdXNlZnVsIDopCisKKzIwMTQtMTItMTIgMTE6MDM6MTUgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWRkIG1hY3JvcyBmb3IgdGhlIHZhcmlvdXMgdGltZXNjYWxlIGNvbnZlcnNpb25zCisJICBUaGlzIGhlbHBzIG1ha2UgdGhlIGNvZGUgbW9yZSByZWFkYWJsZSBhbmQgYXZvaWQgZnV0dXJlIGJhZCB1c2FnZSBvZgorCSAgc2NhbGluZyBmdW5jdGlvbiBhcmd1bWVudCBvcmRlci4KKworMjAxNC0xMi0xMSAxMDoxNjowNiArMDEwMCAgUGF0cmljayBSYWRpemkgPHBhdHJpY2tyQGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IGZpeCBwb3RlbnRpYWwgY3Jhc2ggd2hlbiBzaHV0dGluZyBkb3duCisJICBBIHJhY2UgY29uZGl0aW9uIGluIHRoZSBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24gbWF5IGNhdXNlIGJ1ZmZlcnMKKwkgIHRvIGJlIHVucmVmZmVkIHdoaWxlIHRoZXkgYXJlIHN0aWxsIHVzZWQgYnkgdGhlIHN0cmVhbWluZyB0aHJlYWQKKwkgIGluIGdzdF9ydHBfaDI2NF9wYXlfc2VuZF9zcHNfcHBzKCkgcmVzdWx0aW5nIGluIGEgY3Jhc2guIENoYWluCisJICB1cCB0byB0aGUgcGFyZW50IGNsYXNzIGZpcnN0IGluIHRoZSBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24gdG8KKwkgIG1ha2Ugc3VyZSBzdHJlYW1pbmcgaGFzIHN0b3BwZWQgYW5kIG9ubHkgdGhlbiBmcmVlIHRob3NlIGJ1ZmZlcnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQxMzgxCisKKzIwMTQtMTItMTIgMDA6NDI6MDYgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IENvcHkgZmxhZ3Mgb2YgdGhlIG92ZXJhbGwgc2VnbWVudCB0byBvdXRwdXQgc2VnbWVudHMKKwkgIFByZXNlcnZlIHRoZSBzZWdtZW50IGZsYWdzIG9mIHRoZSBvdmVyYWxsIGRlbXV4IHNlZ21lbnQgb24gdGhlIG91dHB1dAorCSAgc2VnbWVudHMgZm9yIGVhY2ggcGFkLgorCisyMDE0LTEyLTA5IDAyOjQzOjAwICswMTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogdXNlIDY0Yml0IGNodW5rX29mZnNldAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MTI3OQorCisyMDE0LTEyLTEwIDE3OjM5OjE3ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCByb3VuZGluZyBlcnJvcnMgaW4gZHVyYXRpb24gdXBkYXRlCisJICBNYWtlIHN1cmUgd2Ugc3RvcmUgdXBkYXRlZCBzZWdtZW50IHN0b3AvZHVyYXRpb24gd2l0aCB0aGUgc2FtZQorCSAgZ3JhbnVsYXJpdHkgYXMgdGhlIGR1cmF0aW9uIHRpbWVzY2FsZS4KKwkgIEFuZCBhZGQgbW9yZSBkZWJ1ZworCisyMDE0LTEyLTEwIDE2OjU1OjQ0ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFVwZGF0ZSBkdXJhdGlvbiB3aGVuIHdlIGdldCBtb3JlIGluZm9ybWF0aW9uCisJICBXaGVuIGRlYWxpbmcgd2l0aCBmcmFnbWVudGVkIGZpbGVzLCB3ZSB3aWxsIGdldCBtb3JlIGFjY3VyYXRlIGR1cmF0aW9uCisJICBpbmZvcm1hdGlvbiB2aWEgdGhlIG1mcmEgYW5kIG1vb2YgYXRvbXMuCisJICBJbiBvcmRlciBmb3IgcGxheWJhY2sgdG8gbm90IHN0b3AgYXQgdGhlIGluaXRpYWwgZHVyYXRpb24gKGZyb20gdGhlCisJICBtb292IGF0b20pLCB3ZSBuZWVkIHRvIGNoZWNrIGFuZCB1cGRhdGUgdGhlIHZhcmlvdXMgZHVyYXRpb24gdmFyaWFibGVzCisJICB3aGVuIHdlIGZpbmQgbW9yZSBpbmZvcm1hdGlvbi4KKwkgIEZpeGVzIHBsYXliYWNrIG9mIGZyYWdtZW50ZWQgZmlsZXMgaW4gcHVsbCBtb2RlCisKKzIwMTQtMTItMTAgMTU6MDg6NDAgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogUmVtb3ZlIHZhcmlhYmxlIGFzc2lnbm1lbnRzIG5ldmVyIHJlYWQKKwkgIEFzIGRldGVjdGVkIGJ5IGNsYW5nL3NjYW4tYnVpbGQKKworMjAxNC0xMi0xMCAxNDo1NjowNiArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IFVzZSBHc3RDbG9ja1RpbWUgZm9yIG5hbm9zZWNvbmQtYmFzZWQgdGltZSB2YXJpYWJsZXMvZmllbGRzCisJICBBdm9pZHMgY29uZnVzaW9uIHdpdGggdGltZXNjYWxlZC1iYXNlZCB2YXJpYWJsZXMgYW5kIGJ5dGVzIChvZmZzZXQpCisJICB2YXJpYWJsZXMuCisJICBBbmQgdXNlIEdTVF9DTE9DS19USU1FX05PTkUgd2hlcmUgYXBwbGljYWJsZQorCisyMDE0LTEyLTAzIDE0OjQ3OjA1ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvZGVidWd1dGlscy9nc3RwdXNoZmlsZXNyYy5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0cHVzaGZpbGVzcmMuaDoKKwkgIHB1c2hmaWxlc3JjOiBBZGQgVElNRSBTRUdNRU5UIGNhcGFiaWxpdHkKKwkgIEFkZHMgYSBuZXcgc2V0IG9mIHByb3BlcnRpZXMgdG8gbWFrZSBwdXNoZmlsZXNyYyBvdXRwdXQgYSBUSU1FIFNFR01FTlQKKwkgIChpbnN0ZWFkIG9mIHRoZSBmaWxlc3JjIEJZVEUgU0VHTUVOVCkuCisJICBXaGVuIHRpbWUtc2VnbWVudCBpcyBzZXQgdG8gVHJ1ZSB0aGUgZm9sbG93aW5nIHdpbGwgaGFwcGVuOgorCSAgKiBTZWVrcyBhcmUgcmVmdXNlZCAoZGF0YSBzdGFydHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlKQorCSAgKiBUaGUgQllURSBzZWdtZW50IHdpbGwgYmUgcmVwbGFjZWQgYnkgYSBUSU1FIHNlZ21lbnQgd2l0aCB0aGUgdmFsdWVzCisJICBzcGVjaWZpZWQgaW4gdGhlIHZhcmlvdXMgcHJvcGVydGllcworCSAgKiBUaGUgZmlyc3Qgb3V0Z29pbmcgYnVmZmVyIHdpbGwgaGF2ZSBhIHRpbWVzdGFtcCBzZXQgb24gaXQgKGJ5IGRlZmF1bHQKKwkgIGl0IGhhcyBhIHZhbHVlIG9mIEdTVF9DTE9DS19USU1FX05PTkUpCisKKzIwMTQtMTItMTAgMTE6MzU6MjkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBBbHNvIG9ubHkgdW5yZWYgY2FwcyBpZiB0aGV5J3JlIG5vdCBOVUxMCisKKzIwMTQtMTItMTAgMTE6MzQ6NDIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMoKSB3aWxsIHJldHVybiBOVUxMIGlmIHRoZXJlIGlzIG5vIHBlZXIKKworMjAxNC0xMi0wOSAxNjozODozOCArMDEwMCAgVGhpYmF1bHQgU2F1bmllciA8dHNhdW5pZXJAZ25vbWUub3JnPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkgIHZwWGVuYzogQ0xPQ0tfVElNRV9OT05FIGlzIG5vdCBhIHZhbGlkIG1pbl9sYXRlbmN5IHZhbHVlCisJICBXZSBzaG91bGQganVzdCB1c2UgMCBpZiB3ZSBkbyBub3QgaGF2ZSB0aGUgaW5mb3JtYXRpb24KKworMjAxNC0xMi0wMyAxNzoyNjo1NiArMDEwMCAgVGhpYmF1bHQgU2F1bmllciA8dHNhdW5pZXJAZ25vbWUub3JnPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBVc2UgYW4gZW1wdHkgaXRlcmF0b3IgaW4gaXRlcmF0ZV9pbnRlcm5hbF9saW5rIHdoZW4gbm8gbGlua3MKKwkgIEFuZCBub3QgYSBOVUxMIEl0ZXJhdG9yLCBzbyBpdCBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHdheSBpdCB1c3VhbGx5CisJICB3b3JrcyBhbmQgYXZvaWQgdXNlciB0byBuZWVkIGEgZGlmZmVyZW50IGNvZGUgcGF0aHMgdG8gaGFuZGxlIHRoYXQuCisKKzIwMTQtMTItMDkgMTQ6MDE6NTAgKzAxMDAgIEF1csOpbGllbiBaYW5lbGxpIDxhdXJlbGllbi56YW5lbGxpQHBhcnJvdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogc2V0IGJ1ZmZlciBpbnRlcmxhY2UgZmxhZ3Mgd2hlbiBmaWVsZCBpcyBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQKKwkgIElmIHY0bDJfYnVmZmVyLmZpZWxkIGlzIFY0TDJfRklFTERfSU5URVJMQUNFRCwgd2Ugc2V0IGNvcnJlc3BvbmRpbmcKKwkgIEdzdFZpZGVvQnVmZmVyIGZsYWdzIGRlcGVuZGluZyBvbiB0aGUgdmlkZW8gc3RhbmRhcmQuCisJICBBY2NvcmRpbmcgdG8gVjRMMiBzcGVjaWZpY2F0aW9uLCBNL05UU0MgdHJhbnNtaXRzIHRoZSBib3R0b20gZmllbGQKKwkgIGZpcnN0LCBhbGwgb3RoZXIgc3RhbmRhcmRzIHRoZSB0b3AgZmllbGQgZmlyc3QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3NjAzCisKKzIwMTQtMTItMDggMjE6MjY6MTggKzAxMDAgIFBhdHJpY2sgUmFkaXppIDxwYXRyaWNrckBheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHBoMjY0cGF5OiBGaXhlcyBidWZmZXIgbGVhayB3aGVuIHVzaW5nIFNQUy9QUFMKKwkgIEZpeGVzIGEgYnVmZmVyIGxlYWsgdGhhdCB3b3VsZCBvY2N1cnIgaWYgdGhlIHBpcGVsaW5lIHdhcyBzaHV0ZG93bgorCSAgd2hpbGUgYSBTUFMvUFBTIGhlYWRlciB3YXMgYmVpbmcgY3JlYXRlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDEyNzEKKworMjAxNC0xMi0wOSAwNDo0MzoyOSArMDEwMCAgTWF0aGlldSBEdXBvbmNoZWxsZSA8bWF0aGlldS5kdXBvbmNoZWxsZUBvcGVuY3JlZWQuY29tPgorCisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSAgYWdpbmd0djogZml4IG1lbWNweSB3aGVuIG5vIGNvbG9yIGFnaW5nIHJlcXVlc3RlZC4KKwkgIHZpZGVvX3NpemUgaXMgdGhlIHNpemUgaW4gcGl4ZWxzLCBhY3R1YWwgc2l6ZSBvZiB0aGUgbWVtY3B5CisJICBoYXMgdG8gYmUgc3RyaWRlICogaGVpZ2h0LgorCisyMDE0LTEyLTA3IDE3OjMzOjUxIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IFdvcmthcm91bmQgbGlidjRsMiBSVyBlbXVsYXRpb24gYnVnCisJICBXaGVuIGxpYnY0bDIgZW11bGF0ZXMgUlcgbW9kZSBvbiB0b3Agb2YgTU1BUCBkZXZpY2VzLCB0aGUgcXVldWVzIGFyZQorCSAgb25seSBpbml0aWFsaXplZCBvbiBmaXJzdCByZWFkLiBUaGUgcHJvYmxlbSBpcyB0aGF0IHBvbGwoKSB3aWxsIGZhaWwKKwkgIGlmIGNhbGxlZCBiZWZvcmUgdGhlIHF1ZXVlcyBhcmUgaW5pdGlhbGl6ZWQgYW5kIHN0cmVhbWluZy4gV29ya2Fyb3VuZAorCSAgdGhpcyBieSBkb2luZyBhIHplcm8gc2l6ZSByZWFkIHdoZW4gcG9vbCBpcyBzdGFydGVkIGluIHRoYXQgSU8gbW9kZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDA2MzMKKworMjAxNC0xMi0wNyAxNzoyNzozNyAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBGaXggUlcgaW8gbW9kZQorCSAgSW4gUlcsIGFsbG9jYXRvciBjYW4gYmUgbnVsbCwgbWF4X2J1ZmZlcnMgY2FuIGJlIHplcm8sIGFuZCB3ZSBuZWVkIG5vdAorCSAgdG8gd2FpdCB3aGlsZSB0aGUgcXVldWUgaXMgZW1wdHkgc2luY2UgdGhlcmUgaXMgbm8gcXVldWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQwNjMzCisKKzIwMTQtMTItMDMgMTY6NDA6NDkgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBDbGVhbnVwIHVuZWVkZWQgY2hlY2sgYW5kIGNhc2VzCisJICBUaGVyZSBpcyBub3RoaW5nIGluIGJldHdlZW4gdGhlIGJyZWFrIGFuZCB0aGUgImRvbmU6IiBhbnltb3JlLCBwbHVzCisJICBVU0VSUFRSIGFuZCBETUFCVUZfSU1QT1JUIGNhc2UgaXMgZXhhY3RseSB0aGUgc2FtZS4KKworMjAxNC0xMi0wMyAxNzowNzo0OSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMnBvb2w6IEZpeCBDUkVBVEVfQlVGUyBzdXBwb3J0IGZvciBjYXB0dXJlCisJICBUaGlzIHBhdGNoIGZpeGVzIENSRUFURV9CVUZTIHN1cHBvcnQgZm9yIGNhcHR1cmUgZGV2aWNlcy4gSW5pdGlhbGx5IHdlCisJICB3b3VsZCBvbmx5IHRyeSBhbmQgYWxsb2NhdGUgbW9yZSBidWZmZXJzIHdoZW4gdGhlIGNvcHkgdGhyZXNob2xkCisJICBpcyByZWFjaGVkLiBXaGVuIHRoZSB0aHJlc2hvbGQgd2FzIG5vdCBzZXQgKG5lZWRlZCkgaXQgd291bGQgbmV2ZXIKKwkgIGhhcHBlbi4gQW5vdGhlciBwcm9ibGVtIGlzIHRoYXQgb24gY2FwdHVyZSBzaWRlLCBhY3F1aXJlIHJldHVybnMKKwkgIGZpbGxlZCBidWZmZXIsIGhlbmNlIG5lZWQgdG8gcG9vbC4gV2UgbmVlZCB0byBzZXQgYSBzcGVjaWFsIGZsYWcgdG8KKwkgIGZvcmNlIGFsbG9jYXRpb24gdG8gaGFwcGVuLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MTEzNAorCisyMDE0LTEyLTAzIDE2OjI3OjU5IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuYzoKKwkgIHY0bDJhbGxvY2F0b3I6IEZpeCBDUkVBVEVfQlVGIHByb2JpbmcKKwkgIEN1cnJlbnQgZm9yIGV2ZXJ5IG1lbW9yeSB0eXBlIHdlIHdoZXJlIHByb2JpbmcgTU1BUCBDUkVBVEVfQlVGUyBpb2N0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MTEzNAorCisyMDE0LTExLTE4IDE2OjUyOjQwICswMTAwICBOaWNvbGEgTXVyaW5vIDxuaWNvbGEubXVyaW5vQGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBzZXQgZnJhbWVyYXRlIDAvMSB3aGVuIGR1cmF0aW9uIGlzIG5vdCBrbm93bgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDEzMAorCisyMDE0LTEyLTA0IDE3OjI1OjU1ICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBNb3JlIGZpeGVzIGZvciByZXZlcnNlIHBsYXliYWNrCisJICBXaGVuIHNlZWtpbmcgb3IgZmluZGluZyB0aGUgcHJldmlvdXMga2V5ZnJhbWUsIGRvCisJICBjb21wYXJpc29ucyBhZ2FpbnN0IHRhcmdldHMgYW5kIHNlZ21lbnRzIHVzaW5nIGNvbXBvc2l0aW9uIHRpbWUKKwkgIHRvIGNvcnJlY3RseSBkZWNpZGUgd2hpY2ggc2FtcGxlIHRpbWVzIG1hdGNoLgorCisyMDE0LTEyLTAzIDExOjEyOjU1ICswMTAwICBUaGliYXVsdCBTYXVuaWVyIDx0c2F1bmllckBnbm9tZS5vcmc+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBVc2UgYW4gZW1wdHkgaXRlcmF0b3IgaW4gaXRlcmF0ZV9pbnRlcm5hbF9saW5rIHdoZW4gbm8gbGlua3MKKwkgIFdlIHVzZWQgdG8gc2V0dXAgYW4gaXRlcmF0b3Igd2l0aCAxIEdWYWx1ZSBzZXQgd2l0aCBhIE5VTEwgb2JqZWN0CisJICBwb2ludGVyIHdoaWNoIGlzIG5vdCB0aGUgbm9ybWFsIHdheSB0byBkbyB0aGF0LiBJbnN0ZWFkIHdlIHNob3VsZCBtYWtlCisJICBzdXJlIHRoYXQgdGhlIGZpcnN0IGNhbGwgdG8gZ3N0X2l0ZXJhdG9yX25leHQgcmV0dXJucyBHU1RfSVRFUkFUT1JfRE9ORS4KKworMjAxNC0xMi0wMyAxMzoyMDo1NyArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogSGFuZGxlIHNlZWtzIHBhc3QgRU9TIGFzIGEgc2VlayB0byB0aGUgZW5kCisJICBGaXggcmV2ZXJzZSBwbGF5YmFjayBvZiBldmVyeSBmcmFtZSBieSBtYWtpbmcgc2Vla3MgcGFzdC90byBFT1MKKwkgIGZpbmQgdGhlIGxhc3Qgc2VnbWVudCBhbmQgc3RhcnQgdGhlcmUuCisKKzIwMTQtMTItMDIgMTU6MzM6MjUgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkgIHJ0cG1wYWRlcGF5OiBSZWxheCBjYXBzIHRvIGFsbG93IGFueSBjbG9jay1yYXRlCisJICBTb21lIFdvd3phIHNldHVwcyBzZWVtIHRvIHNlbmQgYW4gaW52YWxpZCBub24tOTAwMDAgY2xvY2stcmF0ZS4KKworMjAxNC0xMi0wMSAyMTowNDowMiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGRvbid0IHVzZSBHU1RfQ0xPQ0tfVElNRV9OT05FIGluIG5vbiBHc3RDbG9ja1RpbWUgdmFyaWFibGVzCisJICBVc2UgLTEgaW5zdGVhZCBhcyB0aG9zZSBhcmUgZ2ludDY0L2d1aW50NjQgdmFyaWFibGVzIGFuZCBub3QgR3N0Q2xvY2tUaW1lCisKKzIwMTQtMTEtMDcgMTc6MDY6NDkgKzAxMDAgIEF1csOpbGllbiBaYW5lbGxpIDxhdXJlbGllbi56YW5lbGxpQHBhcnJvdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuaDoKKwkgIHY0bDJhbGxvY2F0b3I6IGZpeCBnc3RfdjRsMl9hbGxvY2F0b3Jfc3RvcCBwcm90b3R5cGUKKwkgIGdzdF92NGwyX2FsbG9jYXRvcl9zdG9wIHJldHVybnMgYSBHc3RWNGwyUmV0dXJuLCBub3QgYSBnYm9vbGVhbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk3OTIKKworMjAxNC0xMS0wNyAxNjo0MTo1MiArMDEwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiB1bnJlZiBwb29sIHdoZW4gdjRsMl9hbGxvY2F0b3JfbmV3KCkgZmFpbHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk3OTEKKworMjAxNC0xMS0zMCAxNzo1Mjo0NyAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuaDoKKwkgIHY0bDI6IFJlbW92ZSBsYXN0IGluY2x1ZGUgdG8gbGludXgvdmlkZW9kZXYyLmgKKwkgIFdlIG5vdyB1c2UgYW5kIHVwZGF0ZSBvdXIgaW50ZXJuYWwgY29weSBzbyB3ZSBubyBsb25nZXIgaGF2ZSB0byBpZmRlZgorCSAgdGhlIGVudGlyZSBjb2RlIGZvciBmZWF0dXJlcyBhbmQgZGVmaW5lcyB0aGF0IHdoZXJlIGFkZGVkIG92ZXIgdGhlCisJICB5ZWFycy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDA5MDUKKworMjAxNC0wOC0yNCAxMzozODowOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IGltcGxlbWVudCBzZWVraW5nIGluIGZyYWdtZW50ZWQgbXA0IGZpbGVzIGluIHB1bGwgbW9kZSBiYXNlZCBvbiB0aGUgbWZyYSB0YWJsZQorCisyMDE0LTExLTI5IDE1OjI1OjUxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHVzZSB0cmFjayBmcmFnbWVudCBkZWNvZGluZyB0aW1lICh0ZmR0KSBpbiBwYXJzZV90cnVuKCkgZm9yIGludGVycG9sYXRpb24KKwkgIEFzIGZhbGxiYWNrIGlmIHdlIGRvbid0IGhhdmUgYW55IGV4aXN0aW5nIHNhbXBsZXMKKwkgIGFzIHJlZmVyZW5jZSBwb2ludCB5ZXQuCisJICBCYXNlZCBvbiBwYXRjaCBieSBEYXZpZCBDb3J2b3lzaWVyIDxkYXZpZC5jb3J2b3lzaWVyQG9yYW5nZS5jb20+CisKKzIwMTQtMTEtMjkgMTQ6Mzc6MjUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4Lmg6CisJICBxdGRlbXV4OiBwYXJzZSBtZnJhIHJhbmRvbSBhY2Nlc3MgYm94IGZvciBmcmFnbWVudGVkIG1wNCBmaWxlcworCSAgSWYgaXQncyBwcmVzZW50LCBhbmQgd2Ugb3BlcmF0ZSBpbiBwdWxsIG1vZGUuCisKKzIwMTQtMDgtMTUgMTQ6NTg6MjYgKzAyMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogc3RvcCBwYXJzaW5nIGhlYWRlcnMgZm9yIGZyYWdtZW50ZWQgbXA0cyBhdCB0aGUgZmlyc3QgbW9vZgorCSAgQ3VycmVudGx5IGR1cmluZyBoZWFkZXIgcGFyc2luZywgd2Ugc2NhbiB0aHJvdWdoIHRoZSBlbnRpcmUgZmlsZQorCSAgYW5kIHNraXAgZXZlcnkgbW9vZittZGF0IGNodW5rIGZvciBmcmFnbWVudGVkIG1wNHMsIHdoaWNoIG1ha2VzCisJICBzdGFydC11cCBpbmNyZWRpYmx5IHNsb3cuIEluc3RlYWQsIGp1c3Qgc3RvcCBhdCB0aGUgZmlyc3QgbW9vZgorCSAgY2h1bmsgd2hlbiBoYXZlIGEgbW9vdiwgYW5kIHN0YXJ0IGV4cG9zaW5nIHRoZSBzdHJlYW1zLCBzbyB3ZQorCSAgY2FuIGdvIGFuZCBzdGFydCBoYW5kbGluZyB0aGUgbW9vZnMgZm9yIHJlYWwuCisKKzIwMTQtMTEtMjkgMTM6NTk6MzUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2ljbGVzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2ljbGVzL2dka3BpeGJ1Zm92ZXJsYXktdGVzdC5jOgorCSAgdGVzdHM6IGFkZCBpbnRlcmFjdGl2ZSBnZGtwaXhidWZvdmVybGF5IHRlc3QKKwkgIEp1c3QgbmVlZCB0byBmaXggdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG5vdyBzbworCSAgdGhhdCBuZWdhdGl2ZSBvZmZzZXRzIGFyZSBhY3R1YWxseSBuZWdhdGl2ZQorCSAgYW5kIG5vdCBmbGlwcGVkIHRvIHBvc2l0aW9uIHRoaW5ncyBmcm9tIHRoZQorCSAgb3Bwb3NpdGUgYm9yZGVyLgorCisyMDE0LTExLTI5IDEzOjUzOjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5Lmg6CisJICBnZGtwaXhidWZvdmVybGF5OiBhZGQgInBpeGJ1ZiIgcHJvcGVydHkKKwkgIFNvIHdlIGNhbiBzZXQgYSBHZGtQaXhidWYgZGlyZWN0bHkgaW5zdGVhZCBvZgorCSAgcmVhZGluZyBpdCBmcm9tIGFuIGltYWdlIGZpbGUgb24gdGhlIGZpbGUgc3lzdGVtLgorCisyMDE0LTExLTI5IDEzOjIzOjUwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9NYWtlZmlsZS5hbToKKwkqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5oOgorCSAgZ2RrcGl4YnVmOiByZW1vdmUgcGl4YnVmc2NhbGUgY29kZSB0aGF0IHdhcyBuZXZlciBwb3J0ZWQKKwkgIERvbid0IHRoaW5rIHdlJ2xsIG5lZWQgdGhpcyBhZ2Fpbi4KKworMjAxNC0xMS0yOSAxODozNTo0MiAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5jOgorCSAgcnRwcnR4cmVjZWl2ZTogVXNlIG9mZnNldCB3aGVuIGNvcHlpbmcgaGVhZGVyCisJICBUaGUgaGVhZGVyIGlzIG5vdCBhbHdheXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwYWNrZXQsIHNvIHdlIG5lZWQgdG8gY29tcHV0ZQorCSAgdGhlIG9mZnNldCBmaXJzdC4KKworMjAxNC0xMS0yOCAxMzoxMjo0NiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3RhZ2xpYi9nc3RhcGV2Mm11eC5jYzoKKwkgIGFwZXYybXV4OiB3cml0ZSBBUEUgdGFncyBhdCBlbmQgZm9yIHdhdnBhY2sgZmlsZXMKKwkgIGh0dHA6Ly93d3cud2F2cGFjay5jb20vZmlsZV9mb3JtYXQudHh0OgorCSAgIkJvdGggdGhlIEFQRXYyIHRhZ3MgYW5kL29yIElEM3YxIHRhZ3MgbXVzdCBjb21lIGF0IHRoZSBlbmQgb2YgdGhlCisJICBXYXZQYWNrIGZpbGUsIHdpdGggdGhlIElEM3YxIGNvbWluZyBsYXN0IGlmIGJvdGggYXJlIHByZXNlbnQuIgorCSAgV2F2UGFjayBmaWxlcyB0aGF0IGNvbnRhaW4gQVBFdjIgdGFncyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlcworCSAgYXJlIHVucGxheWFibGUgb24gcGxheWVycyB0aGF0IHVzZSBGRm1wZWcgKGxpa2UgVkxDKSBhbmQgbW9zdCBvdGhlcgorCSAgc29mdHdhcmUgKGV4Y2VwdCBCYW5zaGVlKS4gUGxheWVycyB0aGF0IHVzZSBsaWJ3YXZwYWNrIGRpcmVjdGx5IGNhbgorCSAgcGxheSB0aGUgZmlsZXMgYmVjYXVzZSBpdCBza2lwcyB0aGUgdGFncywgYnV0IGRvZXMgbm90IHJlY29nbml6ZSB0aGUKKwkgIHRhZyBkYXRhIGF0IHRoYXQgbG9jYXRpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzExNDM3CisKKzIwMTQtMTEtMjggMTA6NDE6NTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2ljbGVzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2ljbGVzL3Rlc3Qtc2VnbWVudC1zZWVrcy5jOgorCSAgdGVzdHM6IGFkZCBpbnRlcmFjdGl2ZSB0ZXN0IGZvciBnYXBsZXNzIHBsYXliYWNrIHVzaW5nIFNFR01FTlQgc2Vla3MKKwkgIE5vdCB3b3JraW5nIHRvbyB3ZWxsIHlldCwgdGhlcmUgYXJlIGdsaXRjaGVzIGV2ZW4gd2l0aCBXQVYgb3IgRkxBQy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTIzNjgKKworMjAxNC0xMS0yNiAxMDozMzowOSArMDMwMCAgQW5kcmVpIFNhcmFrZWV2IDxzYXJha3VzaGFAZ21haWwuY29tPgorCisJKiBnc3QvdmlkZW9jcm9wL2dzdGFzcGVjdHJhdGlvY3JvcC5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuaDoKKwkgIGFzcGVjdHJhdGlvY3JvcDogSGFuZGxlIHJlc29sdXRpb24gY2hhbmdlcyBwcm9wZXJseQorCSAgV2hlbiBhbiBjYXBzLWV2ZW50IGlzIHJlY2VpdmVkLCB3ZSBtdXN0IGltbWVkaWF0ZWx5IGNoYW5nZSB0aGUgY3JvcAorCSAgdG8gdmlkZW9jcm9wIGNvcnJlY3RseSBjaGFuZ2VkIGNhcHMtZXZlbnQgZGltZW5zaW9uLCBvdGhlcndpc2UgdGhlCisJICB2aWRlb2Nyb3Agd2lsbCBmaXJzdCB1c2UgdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBjcm9wIHRoYXQgd2hlbgorCSAgcmVzaXppbmcgdmlkZW8gdG8gYSBzbWFsbGVyIHJlc29sdXRpb24gbWF5IGNhdXNlIGFuIGVycm9yLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDY3MQorCisyMDE0LTExLTI3IDE3OjEwOjUzICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gN2JiMmJjZSB0byBlZjFmZmRjCisKKzIwMTQtMTEtMjcgMTE6MjA6MzYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2ljbGVzL3Rlc3QtYWNjdXJhdGUtc2Vlay5jOgorCSAgdGVzdDogdXNlIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCgpIGZvciB0aW1lc3RhbXAgdG8gc2FtcGxlIGNhbGN1bGF0aW9uCisKKzIwMTQtMTEtMjcgMTE6MTY6MzUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2ljbGVzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2ljbGVzL3Rlc3QtYWNjdXJhdGUtc2Vlay5jOgorCSAgdGVzdHM6IGFkZCBpbnRlcmFjdGl2ZSB0ZXN0IGZvciBhY2N1cmF0ZSBzZWVraW5nCisJICBGb3Igc29tZSBhdWRpbyBmb3JtYXRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1NTI3NgorCisyMDE0LTExLTI2IDE2OjA0OjI2ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIGlzb21wNDogQ2hlY2sgcHJlc2VuY2Ugb2YgbWZoZCBpbiBtb29mCisJICBUaGUgJ21maGQnIGF0b20gaXMgbWFuZGF0b3J5IGluICdtb29mJy4gV2UgY2FuIGxhdGVyIG9uIGNoZWNrIHdoZXRoZXIKKwkgIHRoZSBmcmFnbWVudCBudW1iZXIgcHJvcGVybHkgaW5jcmVhc2VzCisKKzIwMTQtMTEtMjYgMTU6NTk6MzYgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9kdW1wLmM6CisJICBpc29tcDQ6IEZpeCBtZnJvIGFuZCB0ZnJhIGF0b20gZHVtcGluZworCSAgbWZybyB3YXMgc2tpcHBpbmcgdGhlIHZlcnNpb24vZmxhZ3MKKwkgIHRmcmEgaGFkIHdyb25nIGJ5dGVfcmVhZGVyIHJldHVybiB2YWx1ZSBjaGVja3MKKworMjAxNC0xMS0yNiAxNTo1ODoyNiArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4X2R1bXAuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9kdW1wLmg6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuYzoKKwkgIGlzb21wNDogQWRkIG1maGQgYXRvbSBkdW1waW5nCisKKzIwMTQtMTEtMjcgMDA6MTU6MDIgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEhhbmRsZSBlbXB0eSBzZWdtZW50cyB3aGVuIHNlZWtpbmcgaW4gcmV2ZXJzZSBwbGF5LgorCSAgRW1wdHkgc2VnbWVudHMgaW4gYW4gZWRpdCBsaXN0IGhhdmUgYSBtZWRpYV9zdGFydCB0aW1lIG9mIC0xLAorCSAgYXMgdGhleSBkb24ndCBhY3R1YWxseSBwbGF5IGFueSBtZWRpYS4gQWxsb3cgZm9yIHRoYXQgd2hlbgorCSAgYWxpZ25pbmcgdG8gdGhlIHJlZmVyZW5jZSBzdHJlYW0gaW4gcmV2ZXJzZSBwbGF5LgorCisyMDE0LTExLTI0IDEwOjM2OjU0IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgUmV2ZXJ0ICJ2NGwyYWxsb2NhdG9yOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCBhZDQ0ODBkNTM0MDhhNGQ5N2FiNTMxMTc0ZWYzN2YyNThmMzI1M2MwLgorCisyMDE0LTExLTI0IDEwOjM2OjMwIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIFJldmVydCAidjRsMjogbW92ZSB2Yl9xdWV1ZSBwcm9iaW5nIGZyb20gYWxsb2NhdG9yIHRvIHY0bDJvYmplY3QiCisJICBUaGlzIHJldmVydHMgY29tbWl0IGVjNmI4Yjg0YWY3MTlkODI4ZGRkOTFjNzI0ZTcxNWMwYjRhNTU2YmMuCisKKzIwMTQtMTEtMjQgMTA6MzM6MjkgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgUmV2ZXJ0ICJ2NGwyb2JqZWN0OiBhbGxvdyB0byBhdXRvbWF0aWMgc2VsZWN0aW9uIG9mIGRtYWJ1ZiIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgZTZjMmFkNTU3MWU1ZGVkYjIxMjI4N2VmZTIzOGViNDUwMDMyY2Q0Zi4KKworMjAxNC0xMS0yMyAxNjozNDoxNSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogUkVRVUlSRU1FTlRTOgorCSAgUkVRVUlSRU1FTlRTOiB1cGRhdGUgYSBsaXR0bGUKKwkgIFBlb3BsZSBhY3R1YWxseSBsb29rIGF0IHRoYXQgaXQgc2VlbXMuCisKKzIwMTQtMTEtMjMgMTY6MjI6MTIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pY3lkZW11eC9NYWtlZmlsZS5hbToKKwkgIGljeWRlbXV4OiBkb2VzIG5vdCBuZWVkIHRvIGxpbmsgYWdhaW5zdCB6bGliCisKKzIwMTQtMTEtMjIgMjE6Mjg6MzUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5oOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmg6CisJICBzcGVleDogcmVtb3ZlIHN1cHBvcnQgZm9yIGFuY2llbnQgc3BlZXggdmVyc2lvbnMKKworMjAxNC0xMS0yMSAxMToyMToxOCArMDEwMCAgQnJhbmlzbGF2IEthdHJlbmlhayA8YmthdHJlbmlha0BudXZvdGVjaG5vbG9naWVzLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBsb2cgY29ubmVjdGlvbiBldmVudHMgYXQgaW5mbyBsZXZlbAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczOTMwNQorCisyMDE0LTEwLTIwIDEzOjAwOjM3ICswMjAwICBNaWd1ZWwgUGFyw61zIETDrWF6IDxtcGFyaXNkaWF6QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGVuc3VyZSBydHhfcmV0cnlfcGVyaW9kID49IDAKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzkzNDQKKworMjAxNC0xMS0yMSAxMTo0NDoyNCAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuYzoKKwkgIHY0bDJhbGxvY2F0b3I6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKwkgIHRoaXMgd2FzIGludHJvZHVjZWQgYnkgY29tbWl0IGVjNmI4YgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5OTM4MgorCisyMDE0LTExLTE2IDEyOjM0OjE3IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDI6IEhhbmRsZSBjb3JydXB0ZWQgYnVmZmVyIHdpdGggZW1wdHkgcGF5bG9hZAorCSAgVGhpcyBhbGxvdyBza2lwcGluZyBidWZmZXIgZmxhZ2dlZCB3aXRoIEVSUk9SIHRoYXQgaGFzIG5vIHBheWxvYWQuCisJICBUaGlzIGlzIHR5cGljYWwgYmVoYXZpb3VyIHdoZW4gYSByZWNvdmVyZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nCisJICBjYXB0dXJlIGluIHRoZSBkcml2ZXIsIGJ1dCB0aGF0IG5vIHZhbGlkIGRhdGEgd2FzIGV2ZXIgd3JpdHRlbiBpbnRvIHRoYXQKKwkgIGJ1ZmZlci4gVGhpcyBwYXRjaCBhbHNvIHRyYW5zbGF0ZSBWNEwyX0JVRl9GTEFHX0VSUk9SIGludG8KKwkgIEdTVF9CVUZGRVJfRkxBR19DT1JSVVBURUQuIEhlbmNlIGRlY29kaW5nIGVycm9yIHByb2R1Y2UKKwkgIGJ5IGRlY29kZXIgZHVlIHRvIG1pc3NpbmcgZnJhbWVzIHdpbGwgbm93IGJlIGNvcnJlY3RseSBtYXJrZWQuIEZpbmFsbHksCisJICB0aGlzIGZpeGVzIGEgYnVmZmVyIGxlYWsgd2hlbiBFT1MgaXMgcmVhY2hlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDAwNDAKKworMjAxNC0xMS0yMSAxNjozNjoxNSArMDEwMCAgQmVuamFtaW4gR2FpZ25hcmQgPGJlbmphbWluLmdhaWduYXJkQGxpbmFyby5vcmc+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBhbGxvdyB0byBhdXRvbWF0aWMgc2VsZWN0aW9uIG9mIGRtYWJ1ZgorCSAgSWYgdGhlIHY0bDIgcXVldWUgc3VwcG9ydCBkbWFidWYgc2VsZWN0IHRoaXMgYnVmZmVyIHBvb2wgbW9kZQorCSAgYW5kIHVwZGF0ZSB0aGUgcXVlcnkgd2l0aCBhbGxvY2F0b3IuCisJICBUaGlzIHBhdGNoIG9ubHkgY29uY2VybiBleHBvcnRpbmcgZG1hYnVmIGFuZCBub3QgaW1wb3J0aW5nIGRtYWJ1ZgorCSAgZmQgZnJvbSBkb3duc3RyZWFtIGVsZW1lbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk5MzgyCisKKzIwMTQtMTEtMjEgMTY6MTM6MDUgKzAxMDAgIEJlbmphbWluIEdhaWduYXJkIDxiZW5qYW1pbi5nYWlnbmFyZEBsaW5hcm8ub3JnPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSAgdjRsMjogbW92ZSB2Yl9xdWV1ZSBwcm9iaW5nIGZyb20gYWxsb2NhdG9yIHRvIHY0bDJvYmplY3QKKwkgIFRoZSBnb2FsIGlzIHRvIG1ha2UgdGhvc2UgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGluIHY0bDJfb2JqZWN0CisJICB0byBiZSBhYmxlIGxhdGVyIHRvIHNlbGVjdCB0aGUgYmVzdCBhbGxvY2F0aW9uIG1ldGhvZCBmb3IgdGhlIHBvb2wKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTkzODIKKworMjAxNC0xMS0yMCAyMjo0Mjo1OSArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Z2l0QGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgcnRwYmluOiBGaXggdXAgbmV3X2ppdHRlcmJ1ZmZlciBzaWduYWwgcHJvdG90eXBlCisKKzIwMTQtMTEtMjAgMjA6MTk6MjUgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGdpdEBhcnVucmFnaGF2YW4ubmV0PgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogRG9jdW1lbnQgaG93IHRvIGNvbnRyb2wgcGVyLVNTUkMgcmV0cmFuc21pc3Npb24KKworMjAxNC0xMS0yMCAyMDoxODo0NSArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Z2l0QGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIGRvY3MvZGVzaWduL2Rlc2lnbi1ydHByZXRyYW5zbWlzc2lvbi50eHQ6CisJICBkb2M6IFRyaXZpYWwgc3BlbGxpbmcgYW5kIGNvbnNpc3RlbmN5IHVwZGF0ZQorCisyMDE0LTExLTIwIDEzOjE0OjE0ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIHJ0cGdzdHBheTogcHV0IDAtYnl0ZSBhdCB0aGUgZW5kIG9mIGV2ZW50cworCSAgUHV0IGEgMC1ieXRlIGF0IHRoZSBlbmQgb2YgdGhlIGV2ZW50IHN0cmluZy4gRG9lcyBub3QgYnJlYWsgQUJJIGJlY2F1c2UKKwkgIG9sZCBkZXBheWxvYWRlcnMgd2lsbCBza2lwIHRoZSAwIGJ5dGUgKHdoaWNoIGlzIGluY2x1ZGVkIGluIHRoZSBsZW5ndGgpLgorCSAgRXhwZWN0IGEgMC1ieXRlIGF0IHRoZSBlbmQgb2YgdGhlIGV2ZW50IHN0cmluZyBvciBhIDsgZm9yIG9sZAorCSAgcGF5bG9hZGVycy4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3NTkxCisKKzIwMTQtMTEtMjAgMTI6NDA6MjggKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmM6CisJICBydHBnc3RkZXBheTogYXZvaWQgYnVmZmVyIG92ZXJyZWFkLgorCSAgQ2hlY2sgdGhhdCBhIGNhcHMgZXZlbnQgc3RyaW5nIGlzIDAgdGVybWluYXRlZCBhbmQgdGhlIGV2ZW50IHN0cmluZyBpcworCSAgdGVybWluYXRlZCB3aXRoIGEgOyB0byBhdm9pZCBidWZmZXIgb3ZlcnJlYWRzLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNzU5MQorCisyMDE0LTExLTIwIDEwOjQ1OjA3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogZG9uJ3QgbGltaXQgbWF4IHZpZGVvIHJlc29sdXRpb24gdG8gNDA5Nng0MDk2CisJICBNQVggaXNuJ3QgZW50aXJlbHkgY29ycmVjdCBhcyB1cHBlciBsaW1pdCBlaXRoZXIsCisJICBpdCBzaG91bGQgcmVhbGx5IGJlIE1BWFVJTlQzMiwgYnV0IGl0J3MgdW5saWtlbHkKKwkgIHRvIGJlIGEgcHJvYmxlbSBpbiB0aGUgbmVhciBmdXR1cmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQwNDA3CisKKzIwMTQtMTEtMTkgMTU6MDY6MDAgLTA4MDAgIEFsZWl4IENvbmNoaWxsbyBGbGFxdcOpIDxhbGVpeEBvYmxvbmcuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaXggbGVhayBmb3IgbWlrZXkgYmFzZTY0IGRlY29kZWQga2V5LW1nbXQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDAzOTIKKworMjAxNC0xMS0yMCAwOTowMTozOCArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkgIHZpZGVvYmFsYW5jZTogZml4IHVuaGFuZGxlZCBmb3JtYXQgaW4gcGFzc3Rocm91Z2gKKwkgIEluIHBhc3N0aHJvdWdoIHdlIGNhbiBoYW5kbGUgYWxsIGZvcm1hdHMuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQwMzg3CisKKzIwMTQtMTEtMTkgMTY6MTI6MzggKzAxMDAgIEphbiBBbGV4YW5kZXIgU3RlZmZlbnMgKGhlZnRpZykgPGpzdGVmZmVuc0BtYWtlLnR2PgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogUmVzdHJpY3QgcmVzeW5jaW5nIHRvIFRTIHJlZ3Jlc3Npb25zCisJICBUaGUgYmVoYXZpb3Igb2YgcmVzeW5jaW5nIHZpZGVvIGFuZCBhdWRpbyBpbmRlcGVuLQorCSAgZGVudGx5IGNhbiBjYXVzZSBBL1YgZGVzeW5jcy4gTGV0cyByZXN0cmljdCByZXN5bmNzCisJICB0byBqdW1wcyBiYWNrd2FyZCBmb3Igbm93LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNjM5NworCisyMDE0LTExLTE3IDIzOjE2OjAzICsxMTAwICBNYXR0aGV3IFdhdGVycyA8bWF0dGhld0BjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5oOgorCSAgdmlkZW9taXhlcjogZml4IHVwIFFvUyBoYW5kbGluZyBmb3IgbGl2ZSBzb3VyY2VzCisJICBPbmx5IGF0dGVtcHQgYWRhcHRpdmUgZHJvcCB3aGVuIHdlIGFyZSBub3QgbGl2ZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczOTk5NgorCisyMDE0LTExLTEwIDIyOjM0OjM5ICswMTAwICBIZW5uaW5nIEhlaW5vbGQgPGhlbm5pbmdAaXRjb25zdWx0aW5nLWhlaW5vbGQuZGU+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtUENNQS5weToKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLnB5OgorCSAgZXhhbXBsZXM6IHBvcnQgcHl0aG9uIHJ0cCBQQ01BIGNsaWVudC9zZXJ2ZXIgdGVzdHMgdG8gMS4wCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM5OTMwCisKKzIwMTQtMDYtMDQgMTI6MTE6MTAgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBmbGFjZGVjOiBzZXQgdGhlIGNoYW5uZWwgcG9zaXRpb25zIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBBUEkKKwkgIFRoaXMgYXZvaWRzIF9zZXRfZm9ybWF0IHNldHRpbmcgdGhlIHVucG9zaXRpb25lZCBmbGFnIHdoZW4gcGFzc2VkCisJICBOVUxMIGFzIGNoYW5uZWwgcG9zaXRpb25zLCBhcyBpdCB3b3VsZCBub3QgYmUgY2xlYXJlZCB3aGVuIHNldHRpbmcKKwkgIGFjdHVhbCBjaGFubmVsIHBvc2l0aW9ucyBsYXRlci4KKworMjAxNC0xMS0wMSAyMjozOTo0MSArMDEwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAZGFya29zcGhlcmUuZnI+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnB4L2dzdHZwOWVuYy5jOgorCSAgdnB4OiBtYXJrIGFybnItdHlwZSBwcm9wZXJ0aWVzIGFzIGRlcHJlY2F0ZWQgYW5kIHNldCB0aGVtIHRvIG5vLW9wCisJICBBUk5SIHR5cGUgY29udHJvbCBpbiBsaWJ2cHggaGFzIGJlZW4gZGVwcmVjYXRlZCBzbyB0aGlzIGNvbW1pdCBtYXJrIHRoZQorCSAgdnA4ZW5jIGFuZCB2cDllbmMgYXNzb2NpYXRlZCBwcm9wZXJ0aWVzIGFzIGRlcHJlY2F0ZWQgYW5kIGNoYW5nZSB0aGVpcgorCSAgYmVoYXZpb3IgdG8ganVzdCBkaXNwbGF5IGEgd2FybmluZyBtZXNzYWdlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczOTQ3NgorCisyMDE0LTExLTEwIDEzOjE2OjAxICswNTMwICBBcnVuIFJhZ2hhdmFuIDxnaXRAYXJ1bnJhZ2hhdmFuLm5ldD4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBtYW5hZ2VyOiBUcml2aWFsIHR5cG8gZml4CisKKzIwMTQtMTEtMDkgMTE6MDQ6MzMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thLW11eDogVXNlIEdfREVGSU5FX1RZUEUoKSB0byByZWdpc3RlciB0aGUgcGFkIGluc3RlYWQgb2YgbWFudWFsbHkgcmVnaXN0ZXJpbmcgaXQKKworMjAxNC0xMS0wNiAxNTozNzoyOCArMDEwMCAgR8O2cmFuIErDtm5zc29uIDxnb3JhbmpuQGF4aXMuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogbWFrZSBHc3RNYXRyb3NrYW11eFBhZCBnZXRfdHlwZSgpIGZ1bmN0aW9uIHRocmVhZC1zYWZlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM5NzIyCisKKzIwMTQtMTEtMDcgMTY6MTE6MjQgKzAxMDAgIEF1csOpbGllbiBaYW5lbGxpIDxhdXJlbGllbi56YW5lbGxpQHBhcnJvdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuYzoKKwkgIHY0bDJhbGxvY2F0b3I6IGZpeCBlcnJvciBtZXNzYWdlIGlmIGFsbG9jYXRvciBpcyBhbHJlYWR5IGFjdGl2ZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczOTc4OQorCisyMDE0LTExLTA2IDIxOjIxOjQwIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBJbXByb3ZlIGJ1ZmZlciB2YWxpZGF0aW9uCisJICBJbXByb3ZlIGJ1ZmZlciB2YWxpZGF0aW9uIGJ5IG1ha2luZyBzdXJlIGVhY2ggbWVtb3J5IGFyZSB0aGUgcmlnaHQKKwkgIG9uZSBhbmQgdGhhdCBlYWNoIG1lbW9yeSBpcyB3cml0YWJsZS4gVGhpcyBmaXhlcyB0ZWFyaW5nIGlzc3VlcyBpbgorCSAgY2FzZSBkb3duc3RyZWFtIHVzZXMgZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlKCkgb3Igb3RoZXIgdHlwZQorCSAgb2YgR3N0QnVmZmVyIGNvcHkgd2hlcmUgbWVtb3J5IGFyZSBvbmx5IHJlZmZlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk3NTQKKworMjAxNC0xMS0wNiAyMTozODo0MyArMDEwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiBnc3QvcnRzcC9NYWtlZmlsZS5hbToKKwkgIHJ0c3A6IGZpeCBidWlsZCBpbiBnc3QtdW5pbnN0YWxsZWQgc2V0dXAKKworMjAxNC0xMC0yOSAxODo0NDo0MyArMDEwMCAgVGhpYmF1bHQgU2F1bmllciA8dHNhdW5pZXJAZ25vbWUub3JnPgorCisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYzoKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5oOgorCSAgaW1hZ2VmcmVlemU6IEhhbmRsZSBzZXFudW1zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM5MzY2CisKKzIwMTQtMTEtMDQgMDg6MTg6NDEgKzA1MzAgIFZpbmVldGggVCBNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuaDoKKwkgIHBuZ2RlYzogY2hhbmdlIHBhcnNlIGxvZ2ljCisJICBSaWdodCBub3cgaW4gcGFyc2UgbG9naWMgdGhlIHNpZ25hdHVyZSBpcyBjaGVja2VkIGV2ZXJ5IHRpbWUgdGhlIHBhcnNlIGZ1bmN0aW9uCisJICBpcyBjYWxsZWQsIGFuZCB0aGUgd2hvbGUgZGF0YSBpcyB0aGUgc2Nhbm5lZCBlYWNoIGFuZCBldmVyeSB0aW1lLCBldmVuIHRob3VnaCB0aGUKKwkgIGRhdGEgaXMgc2Nhbm5lZCBpbiB0aGUgcHJldmlvdXMgaW5zdGFuY2UuIENoYW5naW5nIHRoZSBsb2dpYyBzdWNoIHRoYXQsIHdlIHNraXAKKwkgIHRoZSBieXRlcyB3aGljaCBhcmUgYWxyZWFkeSBzY2FubmVkIGluIHRoZSBwcmV2aW91cyBpbnN0YW5jZXMgb2YgcGFyc2UuIFRoaXMKKwkgIGhlbHBzIGluIGF2b2lkaW5nIG11bHRpcGxlIHNjYW4gb2YgYWxyZWFkeSBzY2FubmVkIGRhdGEvc2lnbmF0dXJlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNzcwOAorCisyMDE0LTExLTAzIDE1OjI2OjA2ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXIyOiByZXZlcnNlIG9yZGVyIG9mIHBhcmFtcyBmb3IgY29udmVydGVyCisKKzIwMTQtMTEtMDMgMTE6NDQ6MjggKzAxMDAgIEF1csOpbGllbiBaYW5lbGxpIDxhdXJlbGllbi56YW5lbGxpQHBhcnJvdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogZml4IHR5cG8gaW4gZmxhZ3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk1NDkKKworMjAxNC0xMS0wMiAyMzozMzoyMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMnNyYzogZml4IGEgY291cGxlIG9mIG1pbm9yIGxlYWtzCisKKzIwMTQtMTEtMDIgMTk6NDI6MDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9nb29tMmsxL2dzdGdvb20uYzoKKwkqIGdzdC9nb29tMmsxL2dzdGdvb20uaDoKKwkgIGdvb20yazE6IHBvc3QgUW9TIG1lc3NhZ2VzIHdoZW4gZHJvcHBpbmcgZnJhbWVzIGR1ZSB0byBRb1MKKworMjAxNC0xMS0wMiAxOToyOTo1MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5oOgorCSAgZ29vbTogcG9zdCBRb1MgbWVzc2FnZXMgd2hlbiBkcm9wcGluZyBmcmFtZXMgZHVlIHRvIFFvUworCisyMDE0LTExLTAyIDE5OjAyOjM1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogdHdlYWsgd3JpdGluZyBhcHAgdGFnIHN0cmluZyBhIGxpdHRsZQorCisyMDE0LTExLTAyIDE2OjUxOjIzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgU3ByaW5rbGUgc29tZSBHX1BBUkFNX0RFUFJFQ0FURUQgYW5kICNpZm5kZWYgR1NUX1JFTU9WRV9ERVBSRUNBVEVECisKKzIwMTQtMTEtMDIgMTY6NTg6MDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6CisJICB0ZXN0czogZG9uJ3QgdXNlIGRlcHJlY2F0ZWQgcHJvcGVydHkgaW4gbGV2ZWwgdW5pdCB0ZXN0CisKKzIwMTQtMTEtMDIgMTM6MDY6MzMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBpbXBsZW1lbnQgZ2V0L3NldCBmb3IgbmV3IHJ0eC1taW4tcmV0cnktdGltZW91dCBwcm9wZXJ0eQorCSAgUHJvcGVydGllcyBhcmUgc28gbXVjaCBtb3JlIHVzZWZ1bCBpZiB5b3UgY2FuIGFjdHVhbGx5IHNldAorCSAgYW5kIGdldCB0aGVpciB2YWx1ZXMuCisKKzIwMTQtMTAtMzAgMTc6NDE6MTkgKzAwMDAgIFNpbW9uIEZhcm5zd29ydGggPHNpbW9uLmZhcm5zd29ydGhAb25lbGFuLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogQ2xlYW4gdXAgaW50ZXJsYWNlIHN1cHBvcnQKKwkgIFJhdGhlciB0aGFuIHRyeSBhbmQgZ3Vlc3MgaW50ZXJsYWNlIHN1cHBvcnQgYXMgcGFydCBvZiBjaGVja2luZyBzdXBwb3J0ZWQKKwkgIHNpemVzLCBsb29rIGZvciBpbnRlcmxhY2Ugc3VwcG9ydCBzcGVjaWZpY2FsbHkgaW4gaXRzIG93biBmdW5jdGlvbi4KKwkgIEFzIGEgY2xlYW51cCwgdXNlIFY0TDJfRklFTERfQU5ZIHdoZW4gcHJvYmluZyBzaXplcywgd2hpY2ggc2hvdWxkIHJlc3VsdCBpbgorCSAgdGhlIGRyaXZlciBkb2luZyB0aGUgcmlnaHQgdGhpbmcuCisJICBXaXRoIG15IGNhcHR1cmUgc2V0dXAsIHRoaXMgZ2V0cyBtZSB0aGUgZm9sbG93aW5nIHNhbXBsZSBjYXBzOgorCSAgRm9yIDEwODBpIHJlc29sdXRpb246CisJICB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpWVVZMiwgd2lkdGg9KGludCkxOTIwLCBoZWlnaHQ9KGludCkxMDgwLCBwaXhlbC1hc3BlY3QtcmF0aW89KGZyYWN0aW9uKTEvMSwgaW50ZXJsYWNlLW1vZGU9KHN0cmluZylpbnRlcmxlYXZlZCwgZnJhbWVyYXRlPShmcmFjdGlvbil7IDI1LzEsIDMwLzEgfQorCSAgRm9yIDcyMHAgcmVzb2x1dGlvbjoKKwkgIHZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylZVVkyLCB3aWR0aD0oaW50KTEyODAsIGhlaWdodD0oaW50KTcyMCwgcGl4ZWwtYXNwZWN0LXJhdGlvPShmcmFjdGlvbikxLzEsIGludGVybGFjZS1tb2RlPShzdHJpbmcpcHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0oZnJhY3Rpb24peyA1MC8xLCA2MC8xIH0KKwkgIEZvciA1NzZpL3AgcmVzb2x1dGlvbiAoYm90aCBwb3NzaWJsZSBhdCB0aGUgcG9pbnQgb2YgcXVlcnkpOgorCSAgdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVlVWTIsIHdpZHRoPShpbnQpNzIwLCBoZWlnaHQ9KGludCk1NzYsIHBpeGVsLWFzcGVjdC1yYXRpbz0oZnJhY3Rpb24pMS8xLCBpbnRlcmxhY2UtbW9kZT0oc3RyaW5nKXsgcHJvZ3Jlc3NpdmUsIGludGVybGVhdmVkIH0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24peyAyNS8xLCA1MC8xIH0KKwkgIFRoaXMsIGluIHR1cm4sIG1ha2VzIDU3Nmkgd29yayBjb3JyZWN0bHk7IHdpdGggdGhlIG9sZCBjb2RlLAorCSAgdGhlIGNhcHMgd291bGQgYmUgaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUgZm9yIGludGVybGFjZWQgdmlkZW8uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI2MTk0CisKKzIwMTQtMTEtMDEgMTI6MTg6MDIgKzAxMDAgIEF1csOpbGllbiBaYW5lbGxpIDxhdXJlbGllbi56YW5lbGxpQGRhcmtvc3BoZXJlLmZyPgorCisJKiBleHQvdnB4L2dzdHZwOHV0aWxzLmg6CisJICB2cHg6IHJlbW92ZSBjb21wYXRpYmlsaXR5IGRlZmluZXMKKwkgIFdlIGFyZSBndWFyYW50ZWVkIHRvIGhhdmUgVlBYX0lNR19GTVRfSTQyMCwgVlBYX1BMQU5FX1ksCisJICBWUFhfUExBTkVfVSBhbmQgVlBYX1BMQU5FX1YgYXMgd2UgcmVxdWlyZSBsaWJ2cHggPiAxLjEuMC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk0NzYKKworMjAxNC0xMS0wMSAxNTozMzoyMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOgorCSAgd2F2cGFjazogcmVtb3ZlIHN1cHBvcnQgZm9yIGFuY2llbnQgQVBJIHZlcnNpb24KKworMjAxNC0xMS0wMSAxMDoxNDozMSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5LmM6CisJICBydHB2cDg6IFVzZSBWUDggZW5jb2RpbmcgbmFtZQorCSAgQm90aCBGaXJlZm94IGFuZCBDaHJvbWUgdXNlcyBWUDggYXMgdGhlIGVuY29kaW5nIGluIHRoZWlyIFNEUC4KKwkgIEFkZGluZyB0aGlzIG5vdyBkZWZhY3RvIHN0YW5kYXJkIG5hbWUgcmVtb3ZlcyB0aGUgbmVlZCBmb3Igc3BlY2lhbAorCSAgY2FzZSBpbiBTRFAgcGFyc2luZyBjb2RlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNzgxMAorCisyMDE0LTExLTAxIDExOjU5OjI2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzoKKwkgIHJ0cG1wMnRwYXk6IGZpeCB1cCB0ZW1wbGF0ZSBjYXBzIHNvIHdlIGNhbiBvdXRwdXQgdGhlIGRlZmF1bHQgcHQgMzMKKwkgIEFkZCBmaXhlZCBwYXlsb2FkIHR5cGUgZm9yIG1wMnQgdG8gdGVtcGxhdGUgY2FwcyBhcyB3ZWxsLCBzbworCSAgb3VyIG91dHB1dCBjYXBzIG1hdGNoIHRoZSBhZHZlcnRpc2VkIGRlZmF1bHQgcHQuIEZpeGVzIGEKKwkgIHJlZ3Jlc3Npb24gZnJvbSAxLjIuCisJICBUaGVyZSdzIHN0aWxsIHNvbWV0aGluZyB3cm9uZyB3aXRoIGNhcHMgbmVnb3RpYXRpb24gdGhvdWdoLAorCSAgcnRwbXAydHBheSBwYXlsb2FkPTk2ICEgZmFrZXNpbmsgd2lsbCBub3Qgb3V0cHV0IGNhcHMgd2l0aAorCSAgcGF5bG9hZD05Ni4KKworMjAxNC0xMC0zMCAxNTozNzozNiAtMDcwMCAgQWxlaXggQ29uY2hpbGxvIEZsYXF1w6kgPGFsZWl4QG9ibG9uZy5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IG1pa2V5IHJlbGF0ZWQgbWVtb3J5IGxlYWtzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM5NDMwCisKKzIwMTQtMDYtMTAgMTA6MDQ6MDcgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5oOgorCSAgc3BlZXhlbmM6IHVwZGF0ZSBvdXRwdXQgc2VnbWVudCBzdG9wIHRpbWUgdG8gbWF0Y2ggY2xpcHBlZCBzYW1wbGVzCisJICBUaGlzIHdpbGwgbGV0IG9nZ211eCBnZW5lcmF0ZSBhIGdyYW5wb3Mgb24gdGhlIGxhc3QgcGFnZSB0aGF0IHByb3Blcmx5CisJICByZXByZXNlbnRzIHRoZSBjbGlwcGVkIHNhbXBsZXMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLgorCisyMDE0LTA2LTEwIDEwOjU5OjEzICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5oOgorCSAgZmxhY2VuYzogdXBkYXRlIG91dHB1dCBzZWdtZW50IHN0b3AgdGltZSB0byBtYXRjaCBjbGlwcGVkIHNhbXBsZXMKKwkgIFRoaXMgd2lsbCBsZXQgb2dnbXV4IGdlbmVyYXRlIGEgZ3JhbnBvcyBvbiB0aGUgbGFzdCBwYWdlIHRoYXQgcHJvcGVybHkKKwkgIHJlcHJlc2VudHMgdGhlIGNsaXBwZWQgc2FtcGxlcyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uCisKKzIwMTQtMTAtMDcgMTU6Mjk6MzMgKzAyMDAgIEF1csOpbGllbiBaYW5lbGxpIDxhdXJlbGllbi56YW5lbGxpQHBhcnJvdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogY2xlYW5seSBoYW5kbGUgc3RyZWFtb24gZmFpbHVyZSBmb3Igb3V0cHV0IGRldmljZQorCSAgT24gc3RyZWFtb24gZmFpbHVyZSwgdGhlIHF1ZXVlZCBidWZmZXIgaXMgbm90IHJlbGVhc2VkIGZyb20gdGhlCisJICBidWZmZXJwb29sIGNsYXNzIHBvaW50IG9mIHZpZXcgYmVjYXVzZSBpdCBpcyBxdWV1ZWQgdG8gdGhlIGRyaXZlciBhbmQKKwkgIHRoZSBmbHVzaCBsb2dpYyBpcyBub3QgcGVyZm9ybWVkIHNpbmNlIHdlIGFyZSBub3QgaW4gc3RyZWFtaW5nIHN0YXRlLgorCSAgSXQgY2F1c2VzIHRoZSB2NGwyIGJ1ZmZlcnBvb2wgdG8gYWx3YXlzIHJldHVybiB0aGF0IHN0b3AgbWV0aG9kIGZhaWxlZAorCSAgYW5kIHRvIGxlYWsgdjRsMiBvYmplY3RzIGFuZCBidWZmZXJzLgorCSAgVGhpcyBjb21taXQgc29sdmUgdGhpcyBieSBwZXJmb3JtaW5nIHRoZSBmbHVzaCBsb2dpYyBpbiBlcnJvciBjYXNlLCBpZQorCSAgZmx1c2hpbmcgdGhlIGFsbG9jYXRvciBhbmQgcmVzdG9yaW5nIHF1ZXVlZCBidWZmZXIgc3RhdGUgdG8gbm9uLXF1ZXVlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzgxMDIKKworMjAxNC0xMC0wOCAxMDozMToyMSArMDIwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBpbXBsZW1lbnQgZGlzcG9zZSBtZXRob2QKKwkgIFVucmVmIG9iamVjdHMgaW4gZGlzcG9zZSBtZXRob2QgcmF0aGVyIHRoYW4gaW4gZmluYWxpemUgaW4gb3JkZXIgdG8KKwkgIHByZXZlbnQgY2lyY3VsYXIgcmVmZXJlbmNlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczODEwMgorCisyMDE0LTEwLTA4IDEwOjM1OjE0ICswMjAwICBBdXLDqWxpZW4gWmFuZWxsaSA8YXVyZWxpZW4uemFuZWxsaUBwYXJyb3QuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IGNoZWNrIHRoYXQgYWxsb2NhdG9yIGlzIG5vbiBudWxsIHdoZW4gc3RvcHBpbmcgcG9vbAorCSAgT3RoZXJ3aXNlLCB3ZSBjb3VsZCBkZXJlZmVyZW5jZSBOVUxMIGFsbG9jYXRvciB3aGVuIHRoZSBzdG9wIG1ldGhvZCBpcworCSAgY2FsbGVkIGJ5IHRoZSBHc3RCdWZmZXJQb29sJ3MgZmluYWxpemUgbWV0aG9kLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczODEwMgorCisyMDE0LTEwLTA5IDEyOjE1OjA1IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJICB2NGwyc2luazogSW1wbGVtZW50IHVubG9jay91bmxvY2tfc3RvcAorCSAgVGhpcyB3aWxsIHByZXZlbnQgZGVhZGxvY2tzLCBidXQgd2lsbCBhbHNvIHByb3Blcmx5IGZsdXNoIHRoZSBwb29sIGFuZCBhbGxvY2F0b3IKKwkgIHdoZW4gZ29pbmcgdG8gUkVBRFkgc3RhdGUuIEl0IHNob3VsZCBhbHNvIGZpeCBpc3N1ZXMgcmVwb3J0ZWQgb24gbWFpbGluZyBsaXN0CisJICB3aGVuIHNlZWtpbmcgaXMgcGVyZm9ybWVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczODE1MgorCisyMDE0LTEwLTI4IDIxOjMyOjA2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvcHVsc2UvcHVsc2VkZXZpY2Vwcm92aWRlci5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMmRldmljZXByb3ZpZGVyLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuaDoKKwkgIHB1bHNlLCB2NGwyOiBhZGQgbWlzc2luZyBHX0VORF9ERUNMUyBpbiBzb21lIHBsYWNlcworCisyMDE0LTEwLTI3IDE3OjU3OjIwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gODRkMDZjZCB0byA3YmIyYmNlCisKKzIwMTQtMTAtMjcgMTE6MDg6MjAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogRml4IHVuaXQgdGVzdCBub3cgdGhhdCB3ZSBhbHdheXMgaGF2ZSBwcm9maWxlL2xldmVsIGluIHRoZSBjYXBzCisKKzIwMTQtMTAtMjYgMTQ6NTU6NDkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIE1ha2VmaWxlLmFtOgorCSAgUGFyYWxsZWxpc2UgJ21ha2UgY2hlY2stdmFsZ3JpbmQnCisJICBTb21lIG9mIHRoZSBSVFAgdW5pdCB0ZXN0cyBhcmUgdmVyeSBmbGFreSBhbmQgd2lsbAorCSAgZmFpbCBtb3JlIG9mdGVuIHdpdGggdGhlIENQVSBtYXhlZCBvdXQgZnVsbHkuIFRob3NlCisJICB0ZXN0cyBuZWVkIHRvIGJlIGZpeGVkIGluIGFueSBjYXNlIHRob3VnaCwgdGhleSBhbHNvCisJICBmYWlsIG9uIHNsb3dlciBtYWNoaW5lcyBhbmQgYWxzbyBvY2Nhc2lvbmFsbHkgd2l0aAorCSAgbm9ybWFsICdtYWtlIGNoZWNrJy4KKworMjAxNC0xMC0yNiAxMTo0NzoyNSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IEFsd2F5cyBzZXQgcHJvZmlsZS9sZXZlbCBvbiB0aGUgY2FwcworCSAgV2UgaGF2ZSB0aGUgaW5mb3JtYXRpb24gYWxyZWFkeSwgc28gd2h5IG5vdCB1c2UgaXQ/CisKKzIwMTQtMTAtMjUgMTI6MzY6MDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBmaXggY3Jhc2ggb24gc29tZSAzMi1iaXQgc3lzdGVtcworCSAgTWFrZSBzdXJlIHRvIHBhc3MgcmlnaHQgbnVtYmVyIG9mIGJpdHMgdG8gZ3N0X3N0cnVjdHVyZV9uZXcoKQorCSAgd2hpY2ggaXMgYSB2YXJhcmcgZnVuY3Rpb24uCisJICBGaXhlcyBlbGVtZW50cy9ydHBhdXggdW5pdCB0ZXN0IG9uIHBwYzMyLgorCisyMDE0LTEwLTI1IDAwOjU2OjAyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ3ZvbHVtZS5jOgorCSAgdGVzdHM6IGZpeCByZ3ZvbHVtZSB0ZXN0IG9uIGJpZy1lbmRpYW4gc3lzdGVtcworCisyMDE0LTEwLTI1IDAwOjUzOjM5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bGF3ZGVjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWxhd2VuYy5jOgorCSAgdGVzdHM6IGZpeCBtdWxhd2RlYy9tdWxhd2VuYyB0ZXN0IGZvciBiaWcgZW5kaWFuIHN5c3RlbXMKKworMjAxNC0xMC0yNCAyMzo0ODozMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSAgaW50ZXJsZWF2ZTogaW50ZXJzZWN0IHJlc3VsdCB3aXRoIGZpbHRlciBjYXBzIGluIGNhcHMgcXVlcnkKKwkgIEZpeGVzIGNyYXNoIGluIGF1ZGlvdGVzdHNyYyBiZWNhdXNlIG9mIGFuIHVuc3VwcG9ydGVkIGZvcm1hdAorCSAgZ2V0dGluZyBuZWdvdGlhdGVkIG9uIGJpZy1lbmRpYW4gc3lzdGVtcyB3aXRoCisJICBhdWRpb3Rlc3RzcmMgISBpbnRlcmxlYXZlICEgYXVkaW9jb252ZXJ0ICEgd2F2ZW5jCisKKzIwMTQtMTAtMjMgMTU6NDY6MTMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWRldmljZXByb3ZpZGVyLmM6CisJKiBleHQvcHVsc2UvcHVsc2VkZXZpY2Vwcm92aWRlci5oOgorCSAgcHVsc2U6IHJlbW92ZSBzb21lIHVudXNlZCB0eXBlZGVmcworCisyMDE0LTEwLTIyIDE1OjI4OjQ0ICswMjAwICBBbmFuZGEgPGFuYW5kYUBsYXRlbGllcjIzLmNvbT4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkgIHNwZWV4OiBGaXggc2VnZmF1bHQgd2hlbiByZXNldHRpbmcgdGhlIGNvZGVjcyBtdWx0aXBsZSB0aW1lcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczODc5MworCisyMDE0LTEwLTIyIDIyOjUwOjU0ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuQGFjY29zdGVkLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBUZW1wb3JhcmlseSBkaXNhYmxlIHN0cmVhbSBzdGF0dXMgcG9zdGluZworCSAgV2UgbmVlZCBhIG1lY2hhbmlzbSBpbiBQdWxzZUF1ZGlvIHRvIGFsbG93IHJ1bm5pbmcgY29kZSBvdXRzaWRlIHRoZQorCSAgbWFpbmxvb3AgbG9jay4gVGhlbiB3ZSdkIGJlIGFibGUgdG8gcG9zdCB0byB0aGUgYnVzICh0YWtpbmcgdGhlCisJICBHU1RfT0JKRUNUX0xPQ0spLCB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IGxvY2tpbmcgb3JkZXIgd2l0aCB0aGUgbWFpbmxvb3AKKwkgIGxvY2ssIHdoaWNoIGlzIHRoZSBjdXJyZW50IGNhdXNlIG9mIGRlYWRsb2NrcyB3aGlsZSB0cnlpbmcgdG8gcG9zdCB0aGUKKwkgIHN0cmVhbSBzdGF0dXMgbWVzc2FnZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2MDcxCisKKzIwMTQtMTAtMjIgMTU6MDQ6MjQgKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogbGltaXQgdGhlIHJldHJ5IGZyZXF1ZW5jeQorCSAgV2hlbiB0aGUgUlRUIGFuZCBqaXR0ZXIgYXJlIHZlcnkgbG93IChzdWNoIGFzIG9uIGEgbG9jYWwgbmV0d29yayksIHRoZQorCSAgY2FsY3VsYXRlZCByZXRyYW5zbWlzc2lvbiB0aW1lb3V0IGlzIHZlcnkgc21hbGwuIFNldCBzb21lIHNlbnNpYmxlIGxvd2VyCisJICBib3VuZGFyeSB0byB0aGUgdGltZW91dCBieSBhZGRpbmcgYSBuZXcgcHJvcGVydHkuIFdlIHVzZSB0aGUgcGFja2V0CisJICBzcGFjaW5nIGFzIGEgbG93ZXIgYm91bmRhcnkgYnkgZGVmYXVsdC4KKworMjAxNC0xMC0yMiAxMzo0MDo1OCArMDIwMCAgTWlndWVsIFBhcsOtcyBEw61heiA8bXBhcmlzZGlhekBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgZ3N0cnRwaml0dGVyYnVmZmVyOiBhZGQgInJ0eC1taW4tZGVsYXkiIHByb3BlcnR5CisJICBUaGlzIHByb3BlcnR5IGlzIHVzZWZ1bCB0byBzZXQgYSBtaW4gdGltZSB0byB3YWl0IGJlZm9yZSBzZW5kaW5nIGEKKwkgIHJldHJhbnNtaXNzaW9uIGV2ZW50LgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNTM3OAorCisyMDE0LTEwLTIyIDEzOjI5OjQ4ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IFJlZmFjdG9yIGNvZGUKKwkgIFJlZmFjdG9yIHNvbWUgY29kZSBkZWFsaW5nIHdpdGggY2FsY3VsYXRpbmcgdmFyaW91cyB0aW1lb3V0cy4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1Mzc4CisKKzIwMTQtMTAtMTAgMTk6NTA6MDYgKzAyMDAgIE1pZ3VlbCBQYXLDrXMgRMOtYXogPG1wYXJpc2RpYXpAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBzZXNzaW9uOiBmaXggRWFybHkgRmVlZGJhY2sgVHJhbnNtaXNzaW9uCisJICBJbiBlYXJseSByZXRyYW5zbWlzc2lvbiB3ZSBhcmUgYWxsb3dlZCB0byBzY2hlZHVsZSAxIHJlZ3VsYXIgUlRDUCBwYWNrZXQKKwkgIGF0IGFuIGVhcmxpZXIgdGltZS4gV2hlbiB3ZSBkbyB0aGF0LCB3ZSBuZWVkIHRvIHNldCBhbGxvd19lYXJseSB0byBGQUxTRQorCSAgYW5kIGlnbm9yZS9kcm9wIChvciBtZXJnZSkgYWxsIGZ1dHVyZSByZXF1ZXN0cyBmb3IgZWFybHkgdHJhbnNtaXNzaW9uLgorCSAgV2Ugbm93IGZpcnN0IGNoZWNrIGlmIHdlIGNhbiBzY2hlZHVsZSBhbiBlYXJseSBSVENQIGFuZCBpZiB3ZSBjYW4sCisJICBhY3R1YWxseSBwcmVwYXJlIHRoZSBkYXRhIGZvciB0aGUgbmV4dCBSVENQIGludGVydmFsLgorCSAgQWZ0ZXIgd2Ugc2VuZCB0aGUgbmV4dCByZWd1bGFyIFJUQ1AgYWZ0ZXIgdGhlIGVhcmx5IFJUQ1AsIHdlIHNldAorCSAgYWxsb3dfZWFybHkgdG8gVFJVRSBhZ2FpbiB0byBhbGxvdyBtb3JlIGVhcmx5IHJlcXVlc3RzLgorCSAgUmVtb3ZlIHRoZSBjb25kaXRpb24gZm9yIHRoZSBpbW1lZGlhdGUgZmVlZGJhY2sgZm9yIG5vdy4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzgzMTkKKworMjAxNC0xMC0yMSAxMzowMTozMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGE4Yzg5MzkgdG8gODRkMDZjZAorCisyMDE0LTEwLTIxIDEzOjEwOjI0ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IG1ha2UgZGVidWcgbGluZSBsZXNzIGNvbmZ1c2luZworCisyMDE0LTEwLTIxIDEyOjU4OjEzICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBSRUFETUU6CisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMzYzODhhMSB0byBhOGM4OTM5CisKKzIwMTQtMDctMDIgMTc6NTA6MzUgKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgaml0dGVyYnVmZmVyOiByZXdvcmsgcmVzeW5jIGhhbmRsaW5nCisJICBBZGQgYSBuZWVkLXJlc3luYyBzdGF0ZSwgdGhpcyBpcyB3aGVuIHdlIG5lZWQgdG8gdHJ5IHRvIGxvY2sgb24gdG8gYQorCSAgdGltZS9SVFB0aW1lIHBhaXIuCisJICBBbHdheXMgY2hlY2sgdGhlIFJUUCB0aW1lc3RhbXBzIGFuZCBpZiB0aGV5IGdvIGJhY2t3YXJkcywgbWFyayBvdXJzZWx2ZXMKKwkgIGFzIG5lZWQtcmVzeW5jLgorCSAgT25seSByZXN5bmMgd2hlbiBuZWVkLXJlc3luYyBpcyBUUlVFIGFuZCB3ZSBoYXZlIGEgdmFsaWQgdGltZS4gT3RoZXJ3aXNlCisJICB3ZSBrZWVwIHRoZSBvbGQgdmFsdWVzLiBUaGlzIGF2b2lkcyBsb2NraW5nIG9uIHRvIGFuIGludmFsaWQgdGltZSBhbmQKKwkgIGNhdXNpbmcgdXMgdG8gdGltZXN0YW1wIGV2ZXJ5dGhpbmcgd2l0aCAtMS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzA0MTcKKworMjAxNC0xMC0wMyAxNzoyODowNiAtMDcwMCAgQWxlaXggQ29uY2hpbGxvIEZsYXF1w6kgPGFsZWl4QG9ibG9uZy5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHNldCBmdWxsIHN0cmVhbSBjYXBzIG9uIGludGVybmFsIHNyYyBUQ1AgcGFkcworCSAgU2V0IHRoZSBjb21wbGV0ZSBzdHJlYW0gY2FwcyBvbiB0aGUgVENQIGludGVybmFsIHNyYyBwYWRzLiBPdGhlcndpc2UsCisJICBwdGRlbXV4IHdpbGwgbm90IHByb3Blcmx5IGRldGVjdCB0aGUgY2FwcyBjaGFuZ2UuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3ODY4CisKKzIwMTQtMTAtMTcgMjI6MjM6MjcgKzAyMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBtdXguYzoKKwkgIHJ0cG11eDogRG9uJ3Qgc2V0IFBST1hZX0NBUFMgZmxhZyBvbiB0aGUgc3JjIHBhZAorCSAgcnRwbXV4IGJlaGF2ZXMgbGlrZSBhIGZ1bm5lbCBpbiB0aGF0IGl0IGZvcndhcmRzIHdoYXRldmVyIHVwc3RyZWFtIGlzCisJICBzZW5kaW5nIGJ1ZmZlcnMuIFNvIHNldHRpbmcgcHJveHkgY2FwcyBkb2Vzbid0IG1ha2Ugc2Vuc2UgYXMgdGhlCisJICB1cHN0cmVhbSBkb24ndCBoYXZlIHRvIGhhdmUgY29tcGF0aWJsZSBjYXBzLCB0aHVzIHJlc3VsdGluZyBpbiBhbiBlbXB0eQorCSAgY2FwcyBzZXQgYXMgYSByZXN1bHQgb2YgYSBjYXBzIHF1ZXJ5LiBJbnN0ZWFkIHNldCBmaXhlZCBjYXBzIGp1c3QKKwkgIGFzIGZ1bm5lbCBkb2VzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczODcyMgorCisyMDE0LTEwLTIwIDExOjU3OjM4ICswNTMwICBWaW5lZXRoIFQgTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogY3JpdGljYWwgZXJyb3Igd2hlbiBlbGVtZW50IHByb3BlcnRpZXMgc2V0IGFzIG1heC9taW4KKwkgIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSBjYW4gYmUgc2V0IGZyb20gcmFuZ2Ugb2YgLTIxNDc0ODM2NDggdG8gMjE0NzQ4MzY0NworCSAgd2hlbiBpIGxhdW5jaCB0aGUgdmlkZW9ib3ggZWxlbWVudCB3aXRoIHRoYXQgdmFsdWVzLCBpdCBnaXZlcyBhIGNyaXRpY2FsIGVycm9yCisJICAoZ3N0LWNoZWNrLTEuMDoyOTg2OSk6IEdTdHJlYW1lci1DUklUSUNBTCAqKjogZ3N0X3ZhbHVlX3NldF9pbnRfcmFuZ2Vfc3RlcDogYXNzZXJ0aW9uICdzdGFydCA8IGVuZCcgZmFpbGVkCisJICBUaGlzIGhhcHBlbnMgYmVjYXVzZSBtaW4gY2Fubm90IGJlIGVxdWFsIHRvIG1heC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzg4MzgKKworMjAxNC0xMC0xNSAxNzo0NToyNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1cGF5Lmg6CisJICBSZXZlcnQgInJ0cDogYWRkIGgyNjUgUlRQIHBheWxvYWRlciArIGRlcGF5bG9hZGVyIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCBkMDZiYTkwNTFmOTA0YTdlYjQ4MmMwN2E5N2ExODI3MTY5MTU4NjYzLgorCSAgVGhpcyBicmVha3MgdGhlIGJ1aWxkLCBhcyBpdCBkZXBlbmRzIG9uIHBhcnNlciBBUEkgaW4gLWJhZC4KKworMjAxNC0xMC0xNSAxNzozNDo1MCArMDIwMCAgSnVyZ2VuIFNsb3dhY2sgPGp1cmdlbi5zbG93YWNrQGJhcmNvLmNvbT4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1cGF5Lmg6CisJICBydHA6IGFkZCBoMjY1IFJUUCBwYXlsb2FkZXIgKyBkZXBheWxvYWRlcgorCisyMDE0LTEwLTA1IDIxOjI0OjI3ICswMjAwICBQZXRlciBHLiBCYXVtIDxwZXRlckBkci1iYXVtLm5ldD4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmg6CisJICB3YXZlbmM6IFN1cHBvcnQgUkY2NCBmb3JtYXQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjUxNDUKKworMjAxNC0xMC0xMSAxMToxODo0MiArMTEwMCAgRGF2aWQgU2Fuc29tZSA8bWVAZGF2aWRzYW5zb21lLmNvbT4KKworCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIGVxdWFsaXplcjogRG9uJ3QgY2FsbCBpaXJlcXVhbGl6ZXIncyB0cmFuc2Zvcm1faXAgaW4gcGFzc3Rocm91Z2ggbW9kZQorCSAgSXQgdHJpZXMgdG8gbWFwIHRoZSByZWFkLW9ubHkgYnVmZmVyIHdpdGggR1NUX01BUF9SRUFEV1JJVEUgYW5kIGNyYXNoZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3ODg2CisKKzIwMTQtMTAtMTAgMTg6MzA6MDcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQG9jcmV0ZS5jYT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIHJ0cHNvdXJjZTogUmVuYW1lIHNlcW51bS1iYXNlIHRvIHNlcW51bS1vZmZzZXQgaW4gY2FwcworCSAgVGhpcyB3YXMgbW9kaWZpZWQgYmFjayBpbiAxLjAgaW4gR3N0UnRwQmFzZVBheWxvYWQKKworMjAxNC0xMC0xMCAxODoxMToxOSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAb2NyZXRlLmNhPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kdG1mLmM6CisJICBydHBkdG1mc3JjOiBjbG9jay1iYXNlIGFuZCBzZXFudW0tYmFzZSAtPiB0aW1lc3RhbXAtb2Zmc2V0IGFuZCBzZXFudW0tb2Zmc2V0CisJICBUaGVzZSB3ZXJlIHJlbmFtZWQgaW4gR3N0UlRQQmFzZVBheWxvYWQgaW4gMS4wCisKKzIwMTQtMTAtMTAgMTc6MzA6MjQgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQG9jcmV0ZS5jYT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cG11eC5jOgorCSAgcnRwbXV4OiBjbG9jay1iYXNlIGFuZCBzZXFudW0tYmFzZSAtPiB0aW1lc3RhbXAtb2Zmc2V0IGFuZCBzZXFudW0tb2Zmc2V0CisJICBUaGVzZSB3ZXJlIHJlbmFtZWQgaW4gR3N0UlRQQmFzZVBheWxvYWQgaW4gMS4wCisKKzIwMTQtMTAtMDYgMTQ6MjM6MjIgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9nb29tMmsxL2ZpbHRlcnMuYzoKKwkgIGdvb20yazE6IHJlbW92aW5nIGJsb2NrIG9mIGNvZGUgdGhhdCBkb2VzIG5vdGhpbmcKKwkgIFRoZSBsb29wIGluIHpvb21GaWx0ZXJTZXRSZXNvbHV0aW9uIGlzIG1lYW50IHRvIGNoYW5nZSB0aGUgdmFsdWVzIGluIHRoZQorCSAgemYtPmZpcmVkZWNbXSBhcnJheS4gRWFjaCBpdGVyYXRpb24gd3JpdGVzIHRoZSB2YWx1ZSBvZiBkZWNjIG9udG8gdGhlIGFycnlhLAorCSAgYnV0IG5vIGNvbmRpdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGRlY2MgYXJlIGV2ZXIgbWV0IGFuZCB0aGUgYXJyYXkgaXMKKwkgIGZpbGxlZCB3aXRoIHplcm8gZm9yIGVhY2ggZWxlbWVudC4gV2hpY2ggaXMgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlCisJICBhcnJheSBiZWZvcmUgdGhlIGxvb3AgYmVnaW5zLgorCSAgVGhlIGxvb3AgZG9lcyBub3RoaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyODM1MworCisyMDE0LTEwLTA0IDE3OjE3OjEzICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogZG9uJ3QgbG9nIGFsbCBjbG9ja19yYXRlIGNoYW5nZXMgYXMgd2FybmluZ3MuCisJICBXZSBuZXZlciBpbml0aWFsaXplIGNsb2NrX3JhdGUgZXhwbGljaXRseSwgdGhlcmVmb3JlIGl0IGlzIDAgYnkgZGVmYXVsdC4gVGhlCisJICBwYXJhbWV0ZXIgaXMgYSB1aW50MzIgYW5kIHRoZSBvbmx5IGNhbGxlciBlbnN1cmUgdGhhdCBpdCBpcyA+MCwgdGhlcmVmb3JlIGl0CisJICB3b24ndCBiZWNvbWUgLTEgZXZlci4KKworMjAxNC0xMC0wMiAxNDoyNjowOCArMDUzMCAgTmlyYmhlZWsgQ2hhdWhhbiA8bmlyYmhlZWtAY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkgIHNvdXBodHRwY2xpZW50c2luazogRml4IGxpZmV0aW1lIG9mIHN0cmVhbSBoZWFkZXJzIGFuZCBxdWV1ZWQgYnVmZmVycworCSAgU3RyZWFtIGhlYWRlcnMgYXJlIHVwZGF0ZWQgd2hlbmV2ZXIgOjpzZXRfY2FwcyBpcyBjYWxsZWQsIHNvIHdlIGNhbid0IGFzc3VtZQorCSAgdGhleSdsbCBiZSB2YWxpZCBiZWZvcmUgdGhlIG1lc3NhZ2UgYm9keSBpcyB3cml0dGVuIG91dC4gV2UgKmNhbiogYXNzdW1lIHRoYXQKKwkgIGZvciBxdWV1ZWQgYnVmZmVycywgYnV0IFNPVVBfTUVNT1JZX1NUQVRJQyBpcyBzdGlsbCB3cm9uZyBmb3IgdGhvc2UuCisJICBBbHNvLCBhZGQgc29tZSBkZWJ1ZyBsb2dnaW5nIGZvciBzdHJlYW0gaGVhZGVyIGludGVyYWN0aW9ucy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzc3NzEKKworMjAxNC0xMC0wMiAwMzoyNjoyMiArMDIwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IGZpeCBtZW1vcnkgbGVhayB3aGVuIHByZXBlbmRpbmcgQURUUyBoZWFkZXJzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3NzYxCisKKzIwMTQtMDktMjMgMTA6NDg6MDkgKzAyMDAgIEFudG9uaW8gT3NwaXRlIDxhbzJAYW8yLml0PgorCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmg6CisJICBpbnRlcmxlYXZlOiBpbnRlcmxlYXZlIHNhbXBsZXMgZm9sbG93aW5nIHRoZSBEZWZhdWx0IENoYW5uZWwgT3JkZXJpbmcKKwkgIEluIG9yZGVyIHRvIGhhdmUgYSBmdWxsIG1hcHBpbmcgYmV0d2VlbiBjaGFubmVsIHBvc2l0aW9ucyBpbiB0aGUgYXVkaW8KKwkgIHN0cmVhbSBhbmQgbG91ZHNwZWFrZXIgcG9zaXRpb25zLCB0aGUgY2hhbm5lbC1tYXNrIGFsb25lIGlzIG5vdCBlbm91Z2g6CisJICB0aGUgY2hhbm5lbHMgbXVzdCBiZSBpbnRlcmxlYXZlZCBmb2xsb3dpbmcgc29tZSBEZWZhdWx0IENoYW5uZWwgT3JkZXJpbmcKKwkgIGFzIG1lbnRpb25lZCBpbiB0aGUgV0FWRUZPUk1BVEVYVEVOU0lCTEVbMV0gc3BlY2lmaWNhdGlvbi4KKwkgIEFzIGEgRGVmYXVsdCBDaGFubmVsIE9yZGVyaW5nIHVzZSB0aGUgb25lIGltcGxpZWQgYnkKKwkgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHdoaWNoIGZvbGxvd3MgdGhlIG9yZGVyaW5nIGRlZmluZWQgaW4gU01QVEUKKwkgIDIwMzYtMi0yMDA4WzJdLgorCSAgTk9URSB0aGF0IHRoZSByZWxhdGl2ZSBvcmRlciBpbiB0aGUgVG9wIExheWVyIGlzIG5vdCBleGFjdGx5IHRoZSBzYW1lIGFzCisJICB0aGUgb25lIGZyb20gdGhlIFdBVkVGT1JNQVRFWFRFTlNJQkxFWzFdIHNwZWNpZmljYXRpb247IGxldCdzIGhvcGUgdXNlcnMKKwkgIHVzaW5nIHNvIG1heSBjaGFubmVscyBhcmUgYWxyZWFkeSBhd2FyZSBvZiBzdWNoIGRpc2NyZXBhbmNpZXMuCisJICBbMV0gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvaGFyZHdhcmUvZG42NTMzMDglMjh2PXZzLjg1JTI5LmFzcHgKKwkgIFsyXSBodHRwOi8vd3d3Lml0dS5pbnQvZG1zX3B1Yi9pdHUtci9vcGIvcmVwL1ItUkVQLUJTLjIxNTktMi0yMDExLVBERi1FLnBkZgorCSAgRml4ZXM6IGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzcxMjcKKworMjAxNC0xMC0wMiAxMDoxMDoxMSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkgIHdhdmVuYzogU2VuZCBDQVBTIGV2ZW50IGFmdGVyIHRoZSBwYWQgd2FzIGFjdGl2YXRlZAorCSAgT3RoZXJ3aXNlIHRoZSBDQVBTIGV2ZW50IHdpbGwgYmUgZHJvcHBlZCBhbmQgd2UgbmV2ZXIgY29uZmlndXJlIGFueSBjYXBzIGF0CisJICBhbGwsIGxlYWRpbmcgdG8gd2VpcmQgYmVoYXZpb3VyIGluIG1hbnkgc2l0dWF0aW9ucy4gRXNwZWNpYWxseSBoZWFkZXIKKwkgIHJld3JpdGluZyBpcyBub3QgZ29pbmcgdG8gd29yayBpZiBhIGNhcHNmaWx0ZXIgaXMgYWZ0ZXIgd2F2ZW5jLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNzczNQorCisyMDE0LTEwLTAxIDIzOjEyOjMwICswNTMwICBOaXJiaGVlayBDaGF1aGFuIDxuaXJiaGVla0BjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5jOgorCSAgc291cGh0dHBjbGllbnRzaW5rOiBBZGQgc29tZSBtb3JlIHVzZWZ1bCBkZWJ1ZyBsb2dnaW5nCisKKzIwMTQtMTAtMDEgMjM6MDU6MDMgKzA1MzAgIE5pcmJoZWVrIENoYXVoYW4gPG5pcmJoZWVrQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJICBzb3VwaHR0cGNsaWVudHNpbms6IEZyZWUgcXVldWVkIGJ1ZmZlcnMgaW4gOjpyZXNldAorCSAgOjpyZW5kZXIgc2V0cyBhIG5ldyBjYWxsYmFjayBmb3Igd3JpdGluZyBvdXQgbmV3IGJ1ZmZlcnMgb25seSBpZiB0aGVyZSBhcmVuJ3QKKwkgIGFscmVhZHkgYnVmZmVycyBxdWV1ZWQgZm9yIHdyaXRpbmcgd2l0aCBhIHByZXZpb3VzbHktc2NoZWR1bGVkIGNhbGxiYWNrLgorCSAgSG93ZXZlciwgaWYgdGhlIHByZXZpb3VzbHktc2NoZWR1bGVkIGNhbGxiYWNrIGlzIGludGVycnVwdGVkIGJ5IGEgc3RhdGUgY2hhbmdlCisJICAoZWl0aGVyIG1hbnVhbGx5IG9yIGR1ZSB0byBhbiBlcnJvcikgYW5kIHRoZXJlIGFyZSBzdGlsbCBidWZmZXJzIGluIHRoZSBxdWV1ZSwKKwkgIHJlc3RhcnRpbmcgdGhlIHBpcGVsaW5lIHdpbGwgcmVzdWx0IGluIGJ1ZmZlcnMgYmVpbmcgcXVldWVkIGZvcmV2ZXIsIGFuZCBubworCSAgY2FsbGJhY2tzIHdpbGwgZXZlciBiZSBzY2hlZHVsZWQsIGFuZCBubyBidWZmZXJzIHdpbGwgYmUgd3JpdHRlbiBvdXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3NzM5CisKKzIwMTQtMTAtMDEgMTc6Mjk6MjkgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBBY3R1YWxseSB1c2UgdGhlIGNvcnJlY3QgR3N0VmlkZW9JbmZvIGZvciBjb252ZXJzaW9uCisKKzIwMTQtMTAtMDEgMTc6MjQ6NTkgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBSZXZlcnQgdGhlIGxhc3QgY29tbWl0IGFuZCBoYW5kbGUgcmVzb2x1dGlvbnMgZGlmZmVyZW5jZXMgcHJvcGVybHkKKwkgIFRoaXMgaXMgYWJvdXQgY29udmVydGluZyB0aGUgZm9ybWF0LCBub3QgYWJvdXQgY29udmVydGluZyBhbnkgd2lkdGhzIGFuZAorCSAgaGVpZ2h0cy4gU3ViY2xhc3NlcyBhcmUgZXhwZWN0ZWQgdG8gaGFuZGxlciBkaWZmZXJlbnQgcmVzb2x1dGlvbnMgdGhlbXNlbHZlcywKKwkgIGxpa2UgdGhlIHZpZGVvbWl4ZXJzIGFscmVhZHkgZG8gcHJvcGVybHkuCisKKzIwMTQtMTAtMDEgMTc6MTI6NTkgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBHc3RWaWRlb0NvbnZlcnRlciBjdXJyZW50bHkgY2FuJ3QgcmVzY2FsZSBhbmQgd2lsbCBhc3NlcnQKKwkgIExlYWRzIHRvIHVnbHkgYXNzZXJ0aW9ucyBpbnN0ZWFkIG9mIHByb3Blcmx5IGVycm9yaW5nIG91dDoKKwkgIENSSVRJQ0FMICoqOiBnc3RfdmlkZW9fY29udmVydGVyX25ldzogYXNzZXJ0aW9uICdpbl9pbmZvLT53aWR0aCA9PSBvdXRfaW5mby0+d2lkdGgnIGZhaWxlZAorCisyMDE0LTA5LTMwIDExOjM1OjEyICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkgIHZwOGVuYy92cDllbmM6IFByb3RlY3QgdGhlIGVuY29kZXIgd2l0aCBhIG11dGV4IGluIGFsbCBzaXR1YXRpb25zCisKKzIwMTQtMDktMzAgMTE6MzE6NDMgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC92cHgvZ3N0dnA5ZW5jLmM6CisJICB2cDllbmM6IEFsbG93IGNhcHMgcmVuZWdvdGlhdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNjMyOQorCisyMDE0LTA5LTMwIDExOjI4OjM5ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSAgdnA4ZW5jOiBmaW5pc2goKSBhbmQgZHJhaW4oKSBzaG91bGQgcmV0dXJuIGEgR3N0Rmxvd1JldHVybgorCisyMDE0LTAzLTE0IDEyOjU5OjAyICswMTAwICBKb3NlIEFudG9uaW8gU2FudG9zIENhZGVuYXMgPHNhbnRvc2NhZGVuYXNAZ21haWwuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSAgdnA4ZW5jOiBBbGxvdyBjYXBzIHJlbmVnb3RpYXRpb24KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjYzMjkKKworMjAxNC0wOS0yOSAxMTo0OTo0NSArMDIwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogc2V0IGNvbG9yc3BhY2UgZm9yIG91dHB1dCBkZXZpY2VzCisJICBXaGVuIHRoZSB2NGwyIGRldmljZSBpcyBhbiBvdXRwdXQgZGV2aWNlLCB0aGUgYXBwbGljYXRpb24gc2hhbGwgc2V0IHRoZQorCSAgY29sb3JzcGFjZS4gU28gbWFwIEdTdHJlYW1lciBjb2xvcmltZXRyeSBpbmZvIHRvIFY0TDIgY29sb3JzcGFjZSBhbmQgc2V0CisJICBvbiBzZXRfZm9ybWF0LiBJbiBjYXNlIHdlIGhhdmUgbm8gY29sb3JpbWV0cnkgaW5mb3JtYXRpb24sIHdlIHRyeSB0bworCSAgZ3Vlc3MgaXQgYWNjb3JkaW5nIHRvIHBpeGVsIGZvcm1hdCBhbmQgdmlkZW8gc2l6ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzc1NzkKKworMjAxNC0wOS0yOSAyMjo0ODoxNiArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bkBhY2Nvc3RlZC5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2U6IEFkZCBzb21lIGRvY3VtZW50YXRpb24gYWJvdXQgdGhyZWFkaW5nIGFuZCBzeW5jaHJvbmlzYXRpb24KKwkgIFRoaXMgZ2l2ZXMgYSBxdWljayBpbnRyb2R1Y3Rpb24gdG8gaG93IHRoZSBwdWxzZXNpbmsvcHVsc2VzcmMgY29kZQorCSAgaW50ZXJhY3RzIHdpdGggdGhlIHBhX3RocmVhZGVkX21haW5sb29wIHRoYXQgd2Ugc3RhcnQgdXAgdG8gY29tbXVuaWNhdGUKKwkgIHdpdGggdGhlIHNlcnZlci4KKworMjAxNC0wOS0yOSAyMDoxODowOCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bkBhY2Nvc3RlZC5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogTWFrZSBlbWl0dGluZyBzdHJlYW0gc3RhdHVzIG1lc3NhZ2VzIHN5bmNocm9ub3VzCisJICBUaGUgc3RyZWFtIHN0YXR1cyBtZXNzYWdlcyBhcmUgZW1pdHRlZCBpbiB0aGUgUEEgbWFpbmxvb3AgdGhyZWFkLCB3aGljaAorCSAgbWVhbnMgdGhlIG1haW5sb29wIGxvY2sgaXMgdGFrZW4sIGZvbGxvd2VkIGJ5IHRoZSBHc3Qgb2JqZWN0IGxvY2sgKGJ5CisJICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UoKSkuIEluIGFsbCBvdGhlciBsb2NhdGlvbnMsIHRoZSBvcmRlciBvZgorCSAgbG9ja2luZyBpcyByZXZlcnNlZCAodGhpcyBpcyB1bmF2b2lkYWJsZSBpbiBhIGJ1bmNoIG9mIGNhc2VzIHdoZXJlIHRoZQorCSAgb2JqZWN0IGxvY2sgaXMgdGFrZW4gYnkgR3N0QmFzZVNpbmsgb3IgR3N0QXVkaW9CYXNlU2luaywgYW5kIHRoZW4gd2UgZ2V0CisJICBjb250cm9sIHRvIHRha2UgdGhlIG1haW5sb29wIGxvY2spLgorCSAgVGhlIG9ubHkgd2F5IHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBkZWZlciBjYWxsYmFjayBmb3Igc3RyZWFtIHN0YXR1cworCSAgbWVzc2FnZXMgZG9lc24ndCBkZWFkbG9jayBpcyB0byBlaXRoZXIgc3RvcCBwb3N0aW5nIHRob3NlIG1lc3NhZ2VzLCBvcgorCSAgbWFrZSBzdXJlIHRoYXQgdGhlIG1lc3NhZ2UgZW1pc3Npb24gaXMgY29tcGxldGVkIGJlZm9yZSB3ZSBwcm9jZWVkIHRvCisJICBhbnkgcG9pbnQgdGhhdCBtaWdodCB0YWtlIHRoZSBvYmplY3QgbG9jayBiZWZvcmUgdGhlIG1haW5sb29wIGxvY2sKKwkgICh3aGljaCBpcyB3aGF0IHdlIGRvIGFmdGVyIHRoaXMgcGF0Y2gpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNjA3MQorCisyMDE0LTA5LTE2IDEyOjEyOjQ5ICswMjAwICBBbnRvbmlvIE9zcGl0ZSA8YW8yQGFvMi5pdD4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkgIHdhdmVuYzogcHJpbnQgY2hhbm5lbCBtYXNrcyBpbiBoZXhhZGVjaW1hbAorCisyMDE0LTA5LTI3IDE2OjAxOjIxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyZGV2aWNlcHJvdmlkZXIuaDoKKwkgIHY0bDI6IHJlbW92ZSByZWR1bmRhbnQgc3RydWN0IGRlY2xhcmF0aW9uCisKKzIwMTQtMDktMjYgMTM6NDY6MTYgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IEZpeCBjb21waWxlciB3YXJuaW5ncworCSAgZ3N0cnRzcHNyYy5jOjc5Mzk6MTE6IGVycm9yOiBpbXBsaWNpdCBjb252ZXJzaW9uIGZyb20gZW51bWVyYXRpb24gdHlwZSAnR3N0U0RQUmVzdWx0JyB0byBkaWZmZXJlbnQgZW51bWVyYXRpb24gdHlwZQorCSAgJ0dzdFJUU1BSZXN1bHQnIFstV2Vycm9yLC1XZW51bS1jb252ZXJzaW9uXQorCSAgcmVzID0gZ3N0X3NkcF9tZXNzYWdlX25ldyAoJnNkcCk7CisJICB+IF5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisJICBnc3RydHNwc3JjLmM6Nzk0NDoxMTogZXJyb3I6IGltcGxpY2l0IGNvbnZlcnNpb24gZnJvbSBlbnVtZXJhdGlvbiB0eXBlICdHc3RTRFBSZXN1bHQnIHRvIGRpZmZlcmVudCBlbnVtZXJhdGlvbiB0eXBlCisJICAnR3N0UlRTUFJlc3VsdCcgWy1XZXJyb3IsLVdlbnVtLWNvbnZlcnNpb25dCisJICByZXMgPSBnc3Rfc2RwX21lc3NhZ2VfcGFyc2VfdXJpICh1cmksIHNkcCk7CisJICB+IF5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisyMDE0LTA5LTI1IDE1OjAxOjE0ICswMjAwICBKb25hcyBIb2xtYmVyZyA8am9uYXNoZ0BheGlzLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBtYWtlIGRlbXV4ZXIgcmV1c2FibGUKKwkgIFJlbW92ZSBwYWRzIGZyb20gZmxvdyBjb21iaW5lciBhbmQgcmVzZXQgbGFzdAorCSAgZmxvdyByZXR1cm4gdG8gRkxPV19PSyBieSByZXNldHRpbmcgdGhlIGZsb3cgY29tYmluZXIuCisJICBUaGlzIHByZXZlbnRzIEZMT1dfRkxVU0hJTkcgd2hlbiB0cnlpbmcgdG8gcmUtdXNlIHRoZQorCSAgZGVtdXhlciBhZnRlciBzZXR0aW5nIGl0IGJhY2sgdG8gTlVMTC9SRUFEWSBzdGF0ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzczNTkKKworMjAxNC0wOS0yNCAxNjo0NjozNiArMDIwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvZ3N0Y21zLmM6CisJKiBnc3QvdmlkZW9taXhlci9nc3RjbXMuaDoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvY29udmVydC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9jb252ZXJ0Lmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjJwYWQuaDoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXJvcmMtZGlzdC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy1kaXN0Lmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyb3JjLm9yYzoKKwkgIHZpZGVvbWl4ZXI6IHVzZSB2aWRlbyBsaWJyYXJ5IGNvZGUgaW5zdGVhZCBvZiBjb3B5CisKKzIwMTQtMDktMTggMTY6Mzk6MTkgKzA1MzAgIFNhbmpheSBOTSA8c2FuamF5Lm5tQHNhbXN1bmcuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IEFkZGVkIGluZGV4IGNoZWNrIGJlZm9yZSB1c2luZyB0aGUgaW5kZXgKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzY4NzgKKworMjAxNC0wOS0yMyAyMzozMzozNyArMDIwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IERvIG5vdCBpbmZlciBEVFMgb24gYnVmZmVycyBmcm9tIHNwYXJzZSBzdHJlYW1zLgorCSAgRFRTIGRlbHRhIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHNhbXBsZSBkdXJhdGlvbi4gSWYgYnVmZmVyIGhhcyBtaXNzaW5nIERUUywgd2UgdGFrZSBlaXRoZXIgc2VnbWVudCBzdGFydCBvciBwcmV2aW91cyBidWZmZXIgZW5kIHRpbWUsIHdoaWNoZXZlciBpcyBsYXRlci4KKwkgIFRoaXMgbXVzdCBvbmx5IGJlIGRvbmUgZm9yIG5vbiBzcGFyc2Ugc3RyZWFtcywgc3BhcnNlIHN0cmVhbXMgY2FuIGhhdmUgZ2FwcyBiZXR3ZWVuIGJ1ZmZlcnMgKHdoaWNoIGlzIGhhbmRsZWQgbGF0ZXIgYnkgYWRkaW5nIGV4dHJhIGVtcHR5IGJ1ZmZlciB3aXRoIGR1cmF0aW9uIHRoYXQgZmlsbHMgdGhlIGdhcCkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzcwOTUKKworMjAxNC0wOS0xOCAxNzowODozNyArMDUzMCAgU2FuamF5IE5NIDxzYW5qYXkubm1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9nb29tL2lmcy5jOgorCSAgZ29vbTogQ2xhcmlmaWVkIHByZWNlZGVuY2UgYmV0d2VlbiAlIGFuZCA/CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODg3CisKKzIwMTQtMDktMTggMTc6NTk6MzEgKzA1MzAgIFNhbmpheSBOTSA8c2FuamF5Lm5tQHNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwOiBjbGFyaWZ5IGV4cHJlc3Npb24gc28gb3BlcmF0b3IgcHJlY2VkZW5jZSBpcyBjbGVhcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNjkwMworCisyMDE0LTA5LTE4IDE2OjA0OjAzICswNTMwICBTYW5qYXkgTk0gPHNhbmpheS5ubUBzYW1zdW5nLmNvbT4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHJlY2VpdmUuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIE1pc2NlbGxhbmVvdXMgbWlub3IgY2xlYW51cHMKKwkgIEZpeCByZWR1bmRhbnQgdmFyaWFibGVzIGFuZCBhc3NpZ25tZW50cywKKwkgIGFuZCB1bnJlYWNoYWJsZSBicmVha3MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODc1CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODc2CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODc5CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODgwCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODgxCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODg4CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODkwCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODkyCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODkzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODk0CisKKzIwMTQtMDktMjQgMDA6MTI6MTQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IHJlbW92ZSBkdXBsaWNhdGUgYXNzaWdubWVudHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzY4OTcKKworMjAxNC0wOS0yMyAyMjo1NTo0OCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogT25seSBjYWxjdWxhdGUgd2l0aCBkdXJhdGlvbnMgIT0gLTEKKworMjAxNC0wOS0yMyAxOTowODo0OCArMDIwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGNvbGxlY3QgcGFkIGZvciBzcGFyc2Ugc3RyZWFtIHNob3VsZCBiZSBjcmVhdGVkIHdpdGggbG9jayBzZXQgdG8gZmFsc2UKKwkgIEF2b2lkcyB3YWl0aW5nIGZvciBidWZmZXJzIGZyb20gc3BhcnNlIHN0cmVhbXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzcwOTUKKworMjAxNC0wOS0yMyAxOTowNzoyNSArMDIwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGZpeCBzdWJ0aXRsZSBidWZmZXIgZHVyYXRpb24gYW5kIHN0cmlwIG51bGwgdGVybWluYXRpb24KKwkgIFN0cmlwIHRoZSBcMCBvZmYgdGhlIHN1YnRpdGxlIGFzIHdlIGFscmVhZHkga25vdyB0aGUgc2l6ZSBhbmQgYWxzbyByZW1lbWJlcgorCSAgdG8gc2V0IHRoZSBkdXJhdGlvbiBhcyBidWZmZXIgY29weWluZyBkb2Vzbid0IGRvIGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNzA5NQorCisyMDE0LTA5LTIzIDE5OjA2OjE4ICswMjAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJICBxdG11eDogbW92ZSBzdWJ0aXRsZSBsYXllciBhYm92ZSB2aWRlbyBhbmQgc2V0IGFsdGVybmF0ZSBncm91cAorCSAgbGF5ZXIgLTEgaXMgYWJvdmUgdmlkZW8sIHRoYXQgaXMgMAorCSAgQW5kIGhhdmluZyBhbGwgc3VidGl0bGVzIGluIGFsdGVybmF0ZSBncm91cCAyIG1lYW5zIHRoYXQgb25seSBvbmUKKwkgIHNob3VsZCBiZSBzZWxlY3RlZCBhdCBhIHRpbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3MDk1CisKKzIwMTQtMDktMjMgMDk6NDc6MzEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6CisJICBjaGVjay9zb3VwOiBUZW1wb3JhcmlseSBkaXNhYmxlIEdfRU5BQkxFX0RJQUdOT1NUSUMKKwkgIFRoZSBTT1VQX1NFUlZFUl9QT1JUIHByb3BlcnR5IGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gcmVjZW50IGxpYnNvdXAKKwkgIHZlcnNpb25zLgorCisyMDE0LTA5LTIzIDA5OjQzOjA1ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSAgY2hlY2svc291cDogRGVmaW5lIG1pbmltdW0gdmVyc2lvbiByZXF1aXJlZAorCSAgVG8gYXZvaWQgZGVwcmVjYXRpb24gd2FybmluZ3MKKworMjAxNC0wOS0xOSAxOToxNDoyOCArMDIwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBIYW5kbGUgbXA0YSB3aXRob3V0IEVTRFMgYXRvbQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNjk4NgorCisyMDE0LTA5LTIyIDE2OjE1OjI3ICswMjAwICBMaW51cyBTdmVuc3NvbiA8bGludXNzbkBheGlzLmNvbT4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHhpbWFnZXNyYzogRml4IGJ1aWxkIHByb2JsZW0gd2l0aG91dCBYRklYRVMKKworMjAxNC0wOS0xOSAxNDozNDoxMyArMDUzMCAgU2FuamF5IE5NIDxzYW5qYXkubm1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5jOgorCSAgZHRtZjogUmVtb3ZlZCB1bnVzZWQgc3RydWN0dXJlIG1lbWJlcnMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzY4ODMKKworMjAxNC0wOS0xMSAxMzo0ODo0NCAtMDMwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJICBpc29tcDQ6IGZpeCB3cm9uZyBEQVIgY2FsY3VsYXRpb24gZm9yIFBBUiA8PSAxCisJICBDSUQgIzEyMjY0NTIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzYzOTYKKworMjAxNC0wOS0xOCAxNjo1OTo1MiArMDUzMCAgU2FuamF5IE5NIDxzYW5qYXkubm1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdjogUmVtb3ZlZCB1bnJlYWNoYWJsZSBicmVhayBzdGF0ZW1lbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODg0CisKKzIwMTQtMDktMTcgMTY6Mzc6MTEgKzAyMDAgIE9nbnlhbiBUb25jaGV2IDxvZ255YW5AYXhpcy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBkbyBub3QgbGVhayBlbmNzaW5rIHBhZCBpbiBlcnJvciBjYXNlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODA3CisKKzIwMTQtMDktMTcgMTY6MjM6MjEgKzAyMDAgIE9nbnlhbiBUb25jaGV2IDxvZ255YW5AYXhpcy5jb20+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkgIG11bHRpcGFydGRlbXV4OiBkbyBub3QgbGVhayBuZXcgc3RyZWFtIGV2ZW50CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODA1CisKKzIwMTQtMDktMTUgMDk6MDg6MTggKzA1MzAgIFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuaDoKKwkgIHk0bWVuYzogcG9ydCB5NG1lbmMgdG8gdXNlIEdzdFZpZGVvRW5jb2RlciBiYXNlIGNsYXNzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1MDg1CisKKzIwMTQtMDktMTcgMTM6NTU6MTggKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9oYWwuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9yZW1vdGVpby5jOgorCSAgb3N4YXVkaW86IE9TU3RhdHVzIGlzIG5vdCBhIGZvdXJjYywgc28gZG9uJ3QgcHJpbnQgaXQgYXMgb25lLi4uCisKKzIwMTQtMDktMTYgMTQ6MjY6MDggKzAyMDAgIE9nbnlhbiBUb25jaGV2IDxvZ255YW5AYXhpcy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGRvIG5vdCBsZWFrIHVpZCBhZnRlciBwYXJzaW5nIFRPQyBldmVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNjczOQorCisyMDE0LTA5LTE2IDIyOjQ3OjEzICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSAgcnRwdnJhd2RlcGF5OiBEZWNsYXJlIHNvbWUgbW9yZSByZXF1aXJlZCBjYXBzIGZpZWxkcyBpbiB0aGUgc2luayB0ZW1wbGF0ZSBjYXBzCisJICBOb3cgb25seSBtaXNzaW5nIGFyZSB3aWR0aCBhbmQgaGVpZ2h0LCB3aGljaCBhcmUgZXhwcmVzc2VkIGFzIHN0cmluZ3MKKwkgIGZvciBSVFAuLi4gc28gd2UgY2FuJ3QgcHV0IHRoZW0gaW50byB0aGUgdGVtcGxhdGUgY2Fwcy4KKworMjAxNC0wOS0xNiAxNjo0NjowNyArMDUzMCAgVmluZWV0aCBUIE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZmRlYy5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmZGVjLmg6CisJICBnZGtwaXhidWZkZWM6IG1vZGlmeSB3cm9uZyBwYWNrZXRpemVkIG1vZGUgbG9naWMKKwkgIHBhY2tldGl6ZWQgbW9kZSBpcyBiZWluZyBzZXQgd2hlbiBmcmFtZXJhdGUgaXMgYmVpbmcgc2V0CisJICB3aGljaCBpcyBub3QgY29ycmVjdC4gQ2hhbmdpbmcgdGhlIHNhbWUgYnkgY2hlY2tpbmcgdGhlCisJICBpbnB1dCBzZWdlbWVudCBmb3JtYXQuIElmIGlucHV0IHNlZ21lbnQgaXMgaW4gVElNRSBpdCBpcworCSAgUGFja2V0aXplZCwgYW5kIGlmIGl0IGlzIGluIEJZVEVTIGl0IGlzIG5vdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzYyNTIKKworMjAxNC0wOS0xNiAxMToyNjoyMiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBhbmQgdXNlIGNvcnJlY3QgZGVjb2RlciB2YXJpYWJsZSBuYW1lCisKKzIwMTQtMDktMTYgMTE6MjU6NDIgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJICBwbmdkZWM6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKworMjAxNC0wOS0xNiAxMzoyNDoxNSArMDUzMCAgVmluZWV0aCBUIE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdnZGVjOiBtb2RpZnkgd3JvbmcgcGFja2V0aXplZCBtb2RlIGxvZ2ljCisJICBwYWNrZXRpemVkIG1vZGUgaXMgYmVpbmcgc2V0IHdoZW4gZnJhbWVyYXRlIGlzIGJlaW5nIHNldAorCSAgd2hpY2ggaXMgbm90IGNvcnJlY3QuIENoYW5naW5nIHRoZSBzYW1lIGJ5IGNoZWNraW5nIHRoZQorCSAgaW5wdXQgc2VnZW1lbnQgZm9ybWF0LiBJZiBpbnB1dCBzZWdtZW50IGlzIGluIFRJTUUgaXQgaXMKKwkgIFBhY2tldGl6ZWQsIGFuZCBpZiBpdCBpcyBpbiBCWVRFUyBpdCBpcyBub3QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2MjUyCisKKzIwMTQtMDktMTYgMTM6MjM6MTYgKzA1MzAgIFZpbmVldGggVCBNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgcG5nZGVjOiBtb2RpZnkgd3JvbmcgcGFja2V0aXplZCBtb2RlIGxvZ2ljCisJICBwYWNrZXRpemVkIG1vZGUgaXMgYmVpbmcgc2V0IHdoZW4gZnJhbWVyYXRlIGlzIGJlaW5nIHNldAorCSAgd2hpY2ggaXMgbm90IGNvcnJlY3QuIENoYW5naW5nIHRoZSBzYW1lIGJ5IGNoZWNraW5nIHRoZQorCSAgaW5wdXQgc2VnZW1lbnQgZm9ybWF0LiBJZiBpbnB1dCBzZWdtZW50IGlzIGluIFRJTUUgaXQgaXMKKwkgIFBhY2tldGl6ZWQsIGFuZCBpZiBpdCBpcyBpbiBCWVRFUyBpdCBpcyBub3QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2MjUyCisKKzIwMTQtMDktMTUgMTQ6Mzk6NDEgKzAyMDAgIEFudG9uaW8gT3NwaXRlIDxhbzJAYW8yLml0PgorCisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuaDoKKwkqIHN5cy94aW1hZ2UveGltYWdldXRpbC5jOgorCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmg6CisJICB4aW1hZ2VzcmM6IFJlbW92ZSB1bnVzZWQgc2NyZWVuLW51bSBwcm9wZXJ0eQorCSAgVGhlIHNjcmVlbiBudW1iZXIgY2FuIGJlIHN0aWxsIHNwZWNpZmllZCBhcyBwYXJ0IG9mIHRoZSBkaXNwbGF5LW5hbWUKKwkgIHByb3BlcnR5IChlLmcuIGZvciBzY3JlZW4gMSBvZiBkaXNwbGF5IDAgdXNlIGRpc3BsYXktbmFtZT0iOjAuMSIpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNjEyMgorCisyMDE0LTA5LTA0IDE2OjEwOjUxICswMjAwICBBbnRvbmlvIE9zcGl0ZSA8YW8yQGFvMi5pdD4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHhpbWFnZXNyYzogRHJhdyB0aGUgY3Vyc29yIG9ubHkgd2hlbiBpdCBpcyBhY3RpdmUgaW4gdGhlIGNhcHR1cmluZyByZWdpb24KKwkgIFVzZSBYUXVlcnlQb2ludGVyIHRvIGNoZWNrIHRoYXQgdGhlIHBvaW50ZXIgaXMgYWN0dWFsbHkgYWN0aXZlIGluc2lkZQorCSAgdGhlIGNhcHR1cmluZyByZWdpb24uCisJICBUaGlzIHByZXZlbnRzIGRyYXdpbmcgdGhlIGN1cnNvciB3aGVuIHRoZSBwb2ludGVyIGlzIHBhcnRpYWxseSBvdXRzaWRlCisJICBvZiB0aGUgY2FwdHVyZWQgcmVnaW9uIGJ1dCBub3QgYWN0aXZlIGluc2lkZSB0aGUgcmVnaW9uOyBpbiBwYXJ0aWN1bGFyCisJICB0aGlzIGF2b2lkcyBkcmF3aW5nIHRoZSAid2luZG93IHJlc2l6ZSIgY3Vyc29yIHNoYXBlcyB0byB0aGUgY2FwdHVyZWQKKwkgIGltYWdlIHdoZW4gdGhlIG1vdXNlIHBvaW50ZXIgY3Jvc3NlcyBhIHdpbmRvdyBib3JkZXIuCisJICBOT1RFIHRoYXQgdGhpcyBpcyBub3Qgb25seSBhbiBvcHRpbWl6YXRpb24sIHRoaXMgYWxzbyBoYXBwZW4gdG8gZml4CisJICBhIHNlcmlvdXMgcHJvYmxlbSBpbiBtdWx0aS1zY3JlZW4gc2V0dXBzLgorCSAgQmVjYXVzZSBYRml4ZXMgZ2l2ZXMgbm8gaW5mb3JtYXRpb24gb2Ygd2hhdCBzY3JlZW4gdGhlIHBvaW50ZXIgaXMgb24sCisJICB4aW1hZ2VzcmMgd2FzIGFsd2F5cyBkcmF3aW5nIHRoZSBjdXJzb3Igb24gdGhlIGNhcHR1cmVkIHNjcmVlbiBldmVuIGlmCisJICB0aGUgbW91c2UgcG9pbnRlciB3YXMgb24gYW5vdGhlciBzY3JlZW4uCisJICBGb3IgZXhhbXBsZSwgd2hlbiBjYXB0dXJpbmcgZnJvbSBzY3JlZW4gMSAoaS5lLiBkaXNwbGF5LW5hbWU9IjowLjEiKSB0aGUKKwkgIGN1cnNvciB3YXMgZHJhd24gaW4gdGhlIGNhcHR1cmVkIGltYWdlIGV2ZW4gd2hlbiB0aGUgbW91c2UgcG9pbnRlciB3YXMKKwkgIGFjdHVhbGx5IG9uIHNjcmVlbiAwLCB3aGljaCBpcyB3cm9uZyBhbmQgdmlzdWFsbHkgY29uZnVzaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MDY0NgorCisyMDE0LTA5LTA1IDExOjMzOjMxICswMjAwICBBbnRvbmlvIE9zcGl0ZSA8YW8yQGFvMi5pdD4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHhpbWFnZXNyYzogRml4IGRyYXdpbmcgdGhlIGN1cnNvciB3aGVuIGl0IGlzIG91dHNpZGUgdGhlIGNhcHR1cmluZyByZWdpb24KKwkgIFdoZW4gdGhlIGN1cnNvciBpcyBwYXJ0aWFsbHkgb3IgdG90YWxseSBvdXQgb2YgdGhlIGNhcHR1cmluZyByZWdpb24gb24KKwkgIHRoZSB0b3Agc2lkZSBvciBvbiB0aGUgbGVmdCBzaWRlLCBpdCBnZXRzIGRyYXduIGZ1bGx5IGluc2lkZSBvZiB0aGUKKwkgIHJlZ2lvbiB3aXRoIGl0cyBjb29yZGluYXRlcyByb3VuZGVkIHVwIHRvIHRoZSBsZWZ0IG9yIHRvIHRoZSB0b3AgYm9yZGVyLgorCSAgVGhpcyBpcyBpbW1lZGlhdGVseSBub3RpY2VhYmxlIHdoZW4gdXNpbmcgdGhlIHhpZCBwcm9wZXJ0eSB0byBjYXB0dXJlCisJICBhIHNwZWNpZmljIHdpbmRvdy4KKwkgIFRvIGZpeCB0aGUgaXNzdWUsIGFsbG93IG5lZ2F0aXZlIGN4IGFuZCBjeCBjb29yZGluYXRlcyB3aGVuIGNoZWNraW5nIHRoZQorCSAgYm91bmRhcmllcyBiZWZvcmUgZHJhd2luZyB0aGUgY3Vyc29yLgorCSAgTk9URSB0aGF0IHRoZSBib3VuZGFyaWVzIGNoZWNraW5nIGNhbGN1bGF0aW9ucyBzdGlsbCBhbGxvd3MgdGhlIGN1cnNvcgorCSAgdG8gYmUgZHJhd24gd2hlbiBpdCBpcyBvbmx5IHBhcnRpYWxseSBvdXRzaWRlIG9mIHRoZSBjYXB0dXJpbmcgcmVnaW9uLAorCSAgYnV0IHRoaXMgbWFrZXMgc2Vuc2UgYW5kIGdpdmVzIGEgbW9yZSBwbGVhc2luZyB2aXN1YWwgYmVoYXZpb3VyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MDY0NgorCisyMDE0LTA5LTA1IDAwOjE1OjMwICswMjAwICBBbnRvbmlvIE9zcGl0ZSA8YW8yQGFvMi5pdD4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmg6CisJICB4aW1hZ2VzcmM6IEZpeCB0aGUgZGVzdGluYXRpb24gY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnNvcgorCSAgWEZpeGVzIHByb3ZpZGVzIHRoZSBjdXJzb3IgY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgd2luZG93LCB0aGlzCisJICBpcyBub3QgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gdXNpbmcgdGhlIHhpZCBwcm9wZXJ0eSB0byBjYXB0dXJlCisJICBhIHNwZWNpZmljIHdpbmRvdywgdGhlIHJlc3VsdCBpcyB0aGF0IHRoZSBjdXJzb3IgZ2V0cyBkcmF3biBhdCB0aGUgd3JvbmcKKwkgIHBvc2l0aW9uLgorCSAgSW4gb3JkZXIgdG8gZml4IHRoaXMgY29uc2lkZXIgdGhlIHdpbmRvdyBsb2NhdGlvbiB3aGVuIGNhbGN1bGF0aW5nIHRoZQorCSAgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSBkZXN0aW5hdGlvbiBpbWFnZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTA2NDYKKworMjAxNC0wOS0xNSAxNDo1MToyNCArMDIwMCAgUGV0ZXIgS29yc2dhYXJkIDxwZXRlckBrb3JzZ2FhcmQuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJICB2NGwyYWxsb2NhdG9yOiBPX0NMT0VYRUMgbmVlZHMgX0dOVV9TT1VSQ0UKKwkgIFNpbWlsYXIgdG8gOTRmM2Q2ZmMgLyBieiA3MDk0MjMKKwkgIE9uIHNvbWUgc3lzdGVtcyAoRS5HLiB1Q2xpYmMgYW5kIG9sZGVyIEdsaWJjIHZlcnNpb25zKSwgT19DTE9FWEVDIGlzIG9ubHkKKwkgIGRlZmluZWQgd2hlbiBfR05VX1NPVVJDRSBpcyBzcGVjaWZpZWQsIHNvIGRvIHNvLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNjY3MAorCisyMDE0LTA5LTE1IDE4OjExOjM3ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L2RlYnVndXRpbHMvZ3N0Y2Fwc3NldHRlci5jOgorCSAgY2Fwc3NldHRlcjogdXBkYXRlIHRvIDEuMCB0cmFuc2Zvcm1fY2FwcyBzZW1hdGljcworCSAgSW4gMS4wLCB3ZSBwYXNzIHRoZSBjb21wbGV0ZSBjYXBzIHRvIHRyYW5zZm9ybV9jYXBzIHRvIGFsbG93IGZvciBiZXR0ZXIKKwkgIG9wdGltaXphdGlvbnMuIE1ha2UgdGhpcyBmdW5jdGlvbiBhY3R1YWxseSB3b3JrIG9uIG5vbi1zaW1wbGUgY2FwcworCSAgaW5zdGVhZCBvZiBqdXN0IGlnbm9yaW5nIHRoZSBjb25maWd1cmVkIGZpbHRlciBjYXBzLgorCisyMDE0LTA5LTA4IDE0OjA2OjAwICswMjAwICBQZXRlciBHLiBCYXVtIDxwZXRlckBkci1iYXVtLm5ldD4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmg6CisJICB3YXZlbmM6IHVzZSBXQVZFX0ZPUk1BVF9FWFRFTlNJQkxFIGZvciBtb3JlIHRoYW4gMiBjaGFubmVscworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMzQ0NAorCisyMDE0LTA5LTEyIDE1OjA2OjUwICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBGaXggcGFyc2luZyBvZiBhZHRsIGNodW5rcworCSAgV2UgaGF2ZSB0byBza2lwIDEyIGJ5dGVzIG9mIGRhdGEgZm9yIHRoZSBjaHVuaywgYW5kIHRoZSBkYXRhIHNpemUKKwkgIHBhc3NlZCB0byB0aGUgc3ViLWNodW5rIHBhcnNpbmcgZnVuY3Rpb25zIHNob3VsZCBoYXZlIDQgYnl0ZXMgbGVzcworCSAgdGhhbiB0aGUgZGF0YSBzaXplLgorCSAgQWxzbyB3aGVuIHBhcnNpbmcgdGhlIHN1Yi1jaHVua3MsIGNoZWNrIGlmIHdlIGFjdHVhbGx5IGhhdmUgZW5vdWdoCisJICBkYXRhIHRvIHJlYWQgaW5zdGVhZCBvZiBqdXN0IGNyYXNoaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNjI2NgorCisyMDE0LTA5LTEyIDEwOjU1OjIzICswNTMwICBTYW5qYXkgTk0gPHNhbmpheS5ubUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcDogaW5jbHVkZSBzdHJpbmcuaCBmb3IgbWVtY21wIGFuZCBtZW1zZXQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnLy9zaG93X2J1Zy5jZ2k/aWQ9NzM2NTI4CisKKzIwMTQtMDktMTIgMTM6MzY6MTggKzA1MzAgIEFudWogSmFpc3dhbCA8YW51ai5qYWlzd2FsQHNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogZG9uJ3QgYml0d2lzZSBPUiB0aGUgc2FtZSBmbGFnIHR3aWNlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy8vc2hvd19idWcuY2dpP2lkPTczNjU0MworCisyMDE0LTA5LTEyIDEwOjM1OjM2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGhhbmRsZSByZWFsIGF1ZGlvIDI4XzgKKwkgIEZpeGVzIGR1cGxpY2F0ZSBjaGVjayBmb3IgMTRfNC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnLy9zaG93X2J1Zy5jZ2k/aWQ9NzM2NTQzCisKKzIwMTQtMDktMTEgMTQ6NDY6MDkgKzA1MzAgIEFudWogSmFpc3dhbCA8YW51ai5qYWlzd2FsQHNhbXN1bmcuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIG11bHRpZmlsZXNpbms6IGRvbid0IE9SIHRoZSBzYW1lIGZsYWcgdHdpY2UKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzY0NjIKKworMjAxNC0wOS0xMSAxMjo1MjoxMSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBJZiB0aGUgc2VydmVyIHJlcG9ydHMgIkFjY2VwdC1SYW5nZXM6IG5vbmUiIGRvbid0IHRyeSByYW5nZSByZXF1ZXN0cworCisyMDE0LTA5LTEwIDA5OjUwOjQ1ICswMjAwICBPZ255YW4gVG9uY2hldiA8b2dueWFuQGF4aXMuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMnNpbms6IFVucmVmIHBvb2wgYWZ0ZXIgdXNhZ2UKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzYzODQKKworMjAxNC0wOS0wOSAxOTowMzo1MCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IERvbid0IHJhbmsgaXQgZm9yIG5vdworCSAgVGhpcyB3aWxsIHByZXZlbnQgdGhlIGNvbnZlcnRlciB0byBiZSBwaWNrZWQgYXV0b21hdGljYWxseSBpbiBjYXNlCisJICBzb21lb25lIGltcGxlbWVudCBkeW5hbWljIGNvbnZlcnRlciBzZWxlY3Rpb24gc3VwcG9ydC4gSSdkIGxpa2UgdGhpcworCSAgdG8gYmUgcmFua2VkIG9ubHkgZm9yIGtub3duIGRldmljZSwgYXMgaXQncyBoYXJkIHRvIGJlIHN1cmUgYSBkZXZpY2UgaXMKKwkgIGEgY29udmVydGVyIHN1aXRlZCBmb3IgZ2VuZXJhbCBwdXJwb3NlLiBSZS1uZWdvdGlhdGlvbiBpcyBhbHNvIG5lZWRlZAorCSAgYmVmb3JlIHdlIGNhbiByYW5rIGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMzYwNworCisyMDE0LTA5LTA1IDA4OjI5OjIwIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSAgdjRsMjogRGV0ZWN0IGJhZCBkcml2ZXJzIHRpbWVzdGFtcHMKKwkgIEV2ZW4gdGhvdWdoIHRoZSBVVkMgZHJpdmVyIGRvIGEgZ3JlYXQgZGVhbCBvZiBlZmZvcnQgdG8gcHJldmVudCBiYWQKKwkgIHRpbWVzdGFtcCB0byBiZSBzZW50IHRvIHVzZXJzcGFjZSwgdGhlcmUgc3RpbGwgZXhpc3QgVVZDIGhhcmR3YXJlIHRoYXQKKwkgIGFyZSBzbyBidWdneSB0aGF0IHRoZSB0aW1lc3RhbXAgZW5kdXAgbmVhcmx5IHJhbmRvbS4gVGhpcyBjb2RlIGRldGVjdAorCSAgYW5kIGlnbm9yZSB0aW1lc3RhbXAgZnJvbSB0aGVzZSBkcml2ZXJzLCBtYWtpbmcgdGhlc2UgY2FtZXJhIHVzYWJsZS4KKwkgIFRoaXMgaGFzIGJlZW4gdGVzdGVkIG9uIGJvdGggaW52YWxpZCBhbmQgdmFsaWQgY2FtZXJhcywgbWFraW5nIHN1cmUgaXQKKwkgIGRvZXMgbm90IHRyaWdnZXIgZm9yIHZhbGlkIGNhbWVyYXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMyOTEwCisKKzIwMTQtMDgtMjkgMTc6MDk6MzAgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogV29ya2Fyb3VuZCBkcml2ZXIgdGhhdCBkb24ndCBzdXBwb3J0IFJFUUJVRlMoMCkKKwkgIFRoZXJlIGlzIHN0aWxsIGFyb3VuZCAxOCBkcml2ZXJzIG5vdCB5ZXQgcG9ydGVkIHRvIHZpZGVvYnVmMi4gVGhlc2UgZHJpdmVyCisJICBkb24ndCBzdXBwb3J0IGZyZWVpbmcgYnVmZmV0cnMgdGhyb3VnaCBSRVFCVUZTKDApIGhlbmNlIGZvciB0aGVzZSB0aGUKKwkgIG1lbW9yeSB0eXBlIHByb2JpbmcgZmFpbHMuIEluIG9yZGVyIHRvIGdhaW4gYmFjayBvdXIgcHJldmlvdXMgYmVoYXZpb3VyIGluCisJICBwcmVzZW5jZSBvZiB0aGVzZSwgd2UgaW1wbGVtZW50IGEgd29ya2Fyb3VuZCB0aGF0IGFzc3VtaW5nIE1NQVAgaXMKKwkgIHN1cHBvcnRlZC4gTm90ZSB0aGF0IGFuIGFsbG9jYXRvciBpcyBvbmx5IGNyZWF0ZWQgZm9yIGRldmljZSB3aXRoCisJICBTVFJFQU1JTkcgc3VwcG9ydCBpbiB0aGUgZGV2aWNlIGNhcGFiaWxpdGllcy4gSW4gc3VjaCBjYXNlIG9uZSBvZiBNTUFQLAorCSAgVVNFUlBUUiBhbmQgRE1BQlVGIGlzIHJlcXVpcmVkLiBUaG91Z2ggRE1BQlVGIGNhbWUgYWZ0ZXJ3YXJkLCBzbyBpcworCSAgbm90IGFuIG9wdGlvbiBhbmQgaW4gcHJhY3RpY2Ugbm9uZSBvZiB0aGVzZSBkcml2ZXJzIHdpbGwgb25seSBkbyBVU0VSUFRSLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNTY2MAorCSAgQWxzby1ieTogSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KKworMjAxNC0wOS0wNCAxNToxMTo0MCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDI6IE1lcmdlIG1pbl9idWZmZXJzX2ZvciogdmFyaWFibGUgaW50byBvbmUKKwkgIFJldXNlIHRoZSBzYW1lIG1pbl9idWZmZXJzIHZhcmlhYmxlIGZvciBib3RoIGNhcHR1cmUgYW5kIG91dHB1dCwgdGhpcworCSAgcmVkdWNlIHRoZSBsZW5ndGggb2YgbGluZXMgYW5kIG1ha2UgdGhlIGNvZGUgbW9yZSByZWFkYWJsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzYwNzIKKworMjAxNC0wOS0wNCAxODozNTo0NiArMDIwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIHY0bDI6IHNldCBtaW5fbGF0ZW5jeSBmb3Igb3V0cHV0IGRldmljZSBhY2NvcmRpbmcgdG8gcmVxdWlyZWQgbWluaW11bSBudW1iZXIgb2YgYnVmZmVycworCSAgU2luY2Ugd2UgY2FuIGdldCB0aGUgbWluaW11bSBudW1iZXIgb2YgYnVmZmVycyBuZWVkZWQgYnkgYW4gb3V0cHV0CisJICBkZXZpY2UgdG8gd29yaywgdXNlIGl0IHRvIHNldCBtaW5fbGF0ZW5jeSB3aGljaCB3aWxsIGRldGVybWluZSBob3cgbWFueQorCSAgYnVmZmVycyBhcmUgcXVldWVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNjA3MgorCisyMDE0LTA5LTA5IDE2OjEwOjU2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy91ZHBzcmMuYzoKKwkgIHRlc3RzOiB1ZHBzcmM6IGFkZCBjaGVjayB0byBtYWtlIHN1cmUgbXVsdGlwbGUgbWVtb3J5IGNodW5rcyBhcmUgdXNlZAorCisyMDE0LTA5LTA5IDE1OjU1OjE4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy91ZHBzcmMuYzoKKwkgIHRlc3RzOiB1ZHBzcmM6IHdhaXQgZm9yIGJ1ZmZlcnMgd2l0aCBHQ29uZCBpbnN0ZWFkIG9mIHNsZWVwaW5nCisJICBBdm9pZHMgaGFsZi1zZWNvbmQgc2xlZXAgZm9yIG5vIHJlYXNvbi4KKworMjAxNC0wOS0wOSAxNTozMTozMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdWRwc3JjLmM6CisJICB0ZXN0czogdWRwc3JjOiBzcGxpdCBvdXQgc29ja2V0IHNldHVwCisKKzIwMTQtMDktMDkgMTM6NDY6NTYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IG1vcmUgZWZmaWNpZW50IG1lbW9yeSBoYW5kbGluZworCSAgRHJvcCB1c2Ugb2YgZ19zb2NrZXRfZ2V0X2F2YWlsYWJsZV9ieXRlcygpIHdoaWNoIGlzCisJICBub3QgdXNlZnVsIG9uIGFsbCBzeXN0ZW1zICh3aGVyZSBpdCByZXR1cm5zIHRoZSBzaXplCisJICBvZiB0aGUgZW50aXJlIGJ1ZmZlciBub3QgdGhhdCBvZiB0aGUgbmV4dCBwZW5kaW5nCisJICBwYWNrZXQpLCBhbmQgaXMgeWV0IGFub3RoZXIgc3lzY2FsbCBhbmQgYXBwYXJlbnRseQorCSAgdmVyeSBpbmVmZmljaWVudCBvbiBXaW5kb3dzIGluIHRoZSBVRFAgY2FzZS4KKwkgIEluc3RlYWQsIHdoZW4gcmVhZGluZyBVRFAgcGFja2V0cywgdXNlIHRoZSBtb3JlIGZlYXR1cmVmdWwKKwkgIGdfc29ja2V0X3JlY2VpdmVfbWVzc2FnZSgpIGNhbGwgdGhhdCBhbGxvd3MgdG8gcmVhZCBpbnRvCisJICBzY2F0dGVyZWQgbWVtb3J5LCBhbmQgYWxsb2NhdGUgb25lIG1lbW9yeSBjaHVuayB3aGljaCBpcworCSAgbGlrZWx5IHRvIGJlIGxhcmdlIGVub3VnaCBmb3IgYSBwYWNrZXQsIHdoaWxlIGFsc28gcHJvdmlkaW5nCisJICBhIGxhcmdlciBhbGxvY2F0ZWQgbWVtb3J5IGNodW5rIGp1c3QgaW4gY2FzZSB0aGUgcGFja2V0CisJICBpcyBsYXJnZXIgdGhhbiBleHBlY3RlZC4gSWYgdGhlIHJlY2VpdmVkIGRhdGEgZml0cyBpbnRvIHRoZQorCSAgZmlyc3QgY2h1bmssIHdlJ2xsIGp1c3QgYWRkIHRoYXQgdG8gdGhlIGJ1ZmZlciB3ZSByZXR1cm4KKwkgIGFuZCByZS11c2UgdGhlIGZhbGxiYWNrIGJ1ZmZlciBmb3IgbmV4dCB0aW1lLCBvdGhlcndpc2Ugd2UKKwkgIGFkZCBib3RoIGNodW5rcyB0byB0aGUgYnVmZmVyLgorCSAgVGhpcyByZWR1Y2VzIG1lbW9yeSB3YXN0ZSBtb3JlIHJlbGlhYmx5IG9uIHN5c3RlbXMgd2hlcmUKKwkgIGdldF9hdmFpbGFibGVfYnl0ZXMoKSBkb2Vzbid0IHdvcmsgcHJvcGVybHkuCisJICBJbiBhIG11bHRpbWVkaWEgc3RyZWFtaW5nIHNjZW5hcmlvLCBpbmNvbWluZyBVRFAgcGFja2V0cworCSAgYXJlIGFsbW9zdCBuZXZlciBmcmFnbWVudGVkIGFuZCB0aHVzIGFsbW9zdCBhbHdheXMgc21hbGxlcgorCSAgdGhhbiB0aGUgTVRVIHNpemUsIHdoaWNoIGlzIGFsc28gd2h5IHdlIGRvbid0IHRyeSB0byBkbworCSAgc29tZXRoaW5nIHNtYXJ0ZXIgd2l0aCBtb3JlIGZhbGxiYWNrIG1lbW9yeSBjaHVua3Mgb2YKKwkgIGRpZmZlcmVudCBzaXplcy4gVGhlIGZhbGxiYWNrIHNjZW5hcmlvIGlzIGp1c3QgZm9yIHdoZW4KKwkgIHNvbWVvbmUgYnVpbHQgYSBicm9rZW4gc2VuZGVyIHBpcGVsaW5lIChub3QgdXNpbmcgYQorCSAgcGF5bG9hZGVyIG9yIHNvbWVzdWNoKQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxMDM2NAorCisyMDE0LTA5LTA5IDEyOjE1OjQzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwkgIHVkcHNyYzogcmV3b3JrIG1lbW9yeSBhbGxvY2F0aW9uIGJpdHMgYW5kIGVuc3VyZSB3ZSBhbHdheXMgaGF2ZSB0d28gY2h1bmtzIG9mIG1lbW9yaWVzIHRvIHJlYWQgaW50bworCSAgRmlyc3QgY2h1bmsgaXMgdGhlIGxpa2VseS9leHBlY3RlZCBidWZmZXIgc2l6ZSwgc2Vjb25kIGlzIGFzCisJICBmYWxsYmFjayBpbiBjYXNlIHRoZSBwYWNrZXQgaXMgbGFyZ2VyIGluIHRoZSBlbmQuCisJICBOZXh0IHN0ZXA6IGFjdHVhbGx5IHVzZSB0aGVzZS4KKworMjAxNC0wOS0wOSAwOTo0MjoxNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmg6CisJICB1ZHBzcmM6IHRyYWNrIG1heCBwYWNrZXQgc2l6ZSBhbmQgc2F2ZSBhbGxvY2F0b3IgbmVnb3RpYXRlZCBieSBHc3RCYXNlU3JjCisKKzIwMTQtMDktMDggMTY6MTU6MDUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5jOgorCSAgYXVkaW9lY2hvOiBmaXggZXhhbXBsZSBjb21tYW5kIGxpbmUKKworMjAxNC0wOS0wNyAxMjo0NjowOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGZpeCBjcmFzaCB3aXRoIGNlcnRhaW4gdmlkZW9zCisJICBUaGlzIGlzIGEgcmVncmVzc2lvbiBmcm9tIDEuMiBjYXVzZWQgYnkgdGhlIHBvcnQKKwkgIHRvIHRoZSBwYWQgZmxvdyBjb21iaW5lci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzYxOTIKKworMjAxNC0wOS0wNCAxNjoyMToyMCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thLWRlbXV4OiBEb24ndCBoYW5kbGUgcGFyc2UgZXJyb3JzIGF0IHRoZSBlbmQgb2YgZmlsZSBhcyBhbiBlcnJvcgorCSAgQnV0IG9ubHkgaWYgdGhleSBoYXBwZW4gYWZ0ZXIgdGhlIE1hdHJvc2thIHNlZ21lbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1ODMzCisKKzIwMTQtMDktMDQgMTI6MTQ6MTEgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogSW5jbHVkZSByZWRpcmVjdGlvbiB0YXJnZXQgaW4gZXJyb3IgbWVzc2FnZXMKKwkgIEp1c3QgZ2l2aW5nIHRoZSBvcmlnaW5hbCBVUkkgY2FuIGdpdmUgdGhlIGZhbHNlIGltcHJlc3Npb24gdGhhdCBlLmcuCisJICB0aGF0IG9uZSBmYWlsZWQgaG9zdCBuYW1lIHJlc29sdXRpb24sIHdoaWxlIGFjdHVhbGx5IHRoZSByZWRpcmVjdGlvbiB0YXJnZXQKKwkgIGRpZC4KKworMjAxNC0wOS0wMiAxMToxMzo0NCArMDQwMCAgQW5kcmVpIFNhcmFrZWV2IDxzYXJha3VzaGFAZ21haWwuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogRml4IHN5bmNocm9uaXphdGlvbiBpZiBkeW5hbWljYWxseSBjaGFuZ2luZyB0aGUgRlBTCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1ODU5CisKKzIwMTQtMDktMDIgMTM6NTI6NDMgKzA1MzAgIFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzoKKwkgIHNtcHRlOiBDaGVjayBpZiBpbnB1dCBjYXBzIGFyZSB0aGUgc2FtZSBhbmQgY3JlYXRlIG91dHB1dCBjYXBzIGZyb20gdmlkZW8gaW5mbworCSAgVGhpcyBtYWtlcyBzdXJlIHRoYXQgYWxzbyBwcm9wZXJ0aWVzIGxpa2UgdGhlIHBpeGVsLWFzcGVjdC1yYXRpbyBhcmUgdGhlIHNhbWUKKwkgIGJldHdlZW4gYm90aCBzdHJlYW1zIGFuZCB0aGF0IHRoZSBvdXRwdXQgY2FwcyBjb250YWluIGFsbCBmaWVsZHMgbmVjZXNzYXJ5IGZvcgorCSAgY29tcGxldGUgdmlkZW8gY2Fwcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzU4MDQKKworMjAxNC0wOS0wMiAxNzoyMjowNyArMDUzMCAgVmluZWV0aCBUIE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IHJlcGxhY2Ugd2l0aCBnc3RfYnVmZmVyX2NvcHkKKwkgIGdzdF9idWZmZXJfcmVmIGFuZCBnc3RfYnVmZmVyX3dyaXRhYmxlIGlzIGJlaW5nIHVzZWQgdG8gY3JlYXRlIGEgd3JpdGFibGUgY29weSBvZiBzb3VyY2UgYnVmZmVyLgorCSAgcmVwbGFjaW5nIHRoZSBzYW1lIHdpdGggZ3N0X2J1ZmZlcl9jb3B5IGFzIHRoZSBmdW5jdGlvbmFsaXR5IGlzIHNhbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1ODgwCisKKzIwMTQtMDktMDMgMjM6MDY6NTMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogbWFyayBqcGVnIGFuZCBwbmcgYXMgcGFyc2VkIHNvIGF2ZGVjX21qcGVnIGNhbiBiZSB1c2VkIHRvbworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNTk3MQorCisyMDE0LTA5LTAzIDExOjQ2OjEzICswNTMwICBWaW5lZXRoIFQgTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmZGVjLmM6CisJICBnZGtwaXhidWZkZWM6IGZyZWUgcXVlcnkgYWZ0ZXIgdXNlCisJICBJbiBnc3RfZ2RrX3BpeGJ1Zl9kZWNfc2V0dXBfcG9vbCgpLCBxdWVyeSBpcyBiZWluZyBhbGxvY2F0ZWQgdXNpbmcKKwkgIGdzdF9xdWVyeV9uZXdfYWxsb2NhdGlvbigpLCBidXQgdGhlIHNhbWUgaXMgbm90IHVucmVmZXJlbmNlZAorCSAgaGVuY2UgY2FsbGluZyBnc3RfcXVlcnlfdW5yZWYoKSBhZnRlciB1c2FnZSBvZiBxdWVyeS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzU5NTAKKworMjAxNC0wOS0wMyAyMzo0NjozNCArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmM6CisJICBxdGRlbXV4OiBTaWxlbmNlIHNvbWUgd2FybmluZ3MgZm9yIG5vcm1hbCBmaWxlIGNvbnRlbnRzCisKKzIwMTQtMDktMDEgMDk6NTY6MDIgKzAyMDAgIE5pY29sYXMgSHVldCA8bmljb2xhcy5odWV0QHBhcnJvdC5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBGaXggcGFyc2luZyBpc3N1ZSB3aGVuIHRoZSBidWZmZXIgZG9lcyBub3QgaGF2ZSBhIGNvbXBsZXRlIEFEVFMvTE9BUyBmcmFtZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNTUyMAorCisyMDE0LTA5LTAyIDA5OjA5OjQ5ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOWRlYy5jOgorCSAgdnA5ZGVjOiBHZXQgaW5wdXQgd2lkdGgvaGVpZ2h0IGZyb20gdGhlIGNvZGVjIGluc3RlYWQgb2YgdGhlIGlucHV0IGNhcHMKKwkgIFRoZXkgYXJlIHJlcG9ydGVkIHByb3Blcmx5IGJ5IGxpYnZweCBpZiB0aGUgY29ycmVjdCBzdHJ1Y3QgbWVtYmVycyBhcmUgdXNlZC4KKwkgIFRoaXMgYWxzbyBmaXhlcyBoYW5kbGluZyBvZiByZXNvbHV0aW9uIGNoYW5nZXMgd2l0aG91dCBpbnB1dCBjYXBzIGNoYW5nZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzE5MzU5CisKKzIwMTMtMTAtMjIgMTg6NDk6MjIgKzAxMDAgIFRvbSBHcmVlbndvb2QgPHRjZGdyZWVud29vZEBob3RtYWlsLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDhkZWMuYzoKKwkgIHZwOGRlYzogRml4IGZvciBoYW5kbGluZyByZXNvbHV0aW9uIGNoYW5nZXMgd2hlbiBkZWNvZGluZyBWUDgKKwkgIElmIHRoZSByZXNvbHV0aW9uIGNoYW5nZXMgaW4gdGhlIGJpdHN0cmVhbSB3aXRob3V0IHRoZSBpbnB1dCBjYXBzIGNoYW5naW5nIHdlCisJICB3b3VsZCBwcmV2aW91c2x5IG91dHB1dCBjb3JydXB0ZWQgdmlkZW8gb3IgY3Jhc2guCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzE5MzU5CisKKzIwMTQtMDktMDIgMDA6NTU6MTcgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDlkZWMuYzoKKwkgIHZwOWRlYzogRml4IHNlZ2ZhdWx0IHdoZW4gYSBuZXcgY2FwcyBpcyByZWNlaXZlZAorCSAgUmVtZW1iZXIgdG8gdW5yZWYgdGhlIG91dHB1dCBjYXBzIHdoZW4gYSBuZXcgY2FwcyBldmVudCBpcyByZWNlaXZlZAorCSAgYXMgaXQgc2hvdWxkIGdlbmVyYXRlIGEgbmV3IG9uZSBiYXNlZCBvbiB0aGUgbmV3IGNhcHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM0MjY2CisKKzIwMTQtMDktMDIgMDA6NTQ6MzUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdnA4ZGVjLmM6CisJICB0ZXN0czogdnA4ZGVjOiBhZGQgdGVzdCBmb3IgY2FwcyByZW5lZ290aWF0aW9uCisJICBDaGVjayB0aGF0IHZwOGRlYyBjYW4gcHJvcGVybHkgYWNjZXB0IGEgbmV3IGNhcHMgd2hlbiB1cHN0cmVhbQorCSAgY2hhbmdlcyBpdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNDI2NgorCisyMDE0LTA4LTA1IDEwOjM0OjM5ICswMjAwICBKb3NlIEFudG9uaW8gU2FudG9zIENhZGVuYXMgPHNhbnRvc2NhZGVuYXNAZ21haWwuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSAgdnA4ZGVjOiBSZXNldCBvdXRwdXQgYW5kIGlucHV0IHN0YXRlcyB3aGVuIGNoYW5naW5nIGZvcm1hdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNDI2NgorCisyMDE0LTA5LTAxIDE2OjM5OjIzICswNTMwICBWaW5lZXRoIFQgTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogRG9uJ3QgY2FsbCBnc3RfY2Fwc191bnJlZigpIG9uIHRlbXBsYXRlIGNhcHMgd2hlbiBhbHJlYWR5IHVucmVmZXJlbmNlZAorCSAgQWRkaW5nIGFuIGV4dHJhIGNvbmRpdGlvbiB3aGlsZSBjYWxsaW5nIGdzdF9jYXBzX3VucmVmICh0ZW1wbCkKKwkgIGFuZCByZXBsYWNpbmcgZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoZ3N0X2NhcHNfcmVmIChjYXBzKSkgd2l0aAorCSAgZ3N0X2NhcHNfY29weSAoY2FwcykgaW4gbGluZSAxNzcsIHNpbmNlIHRoZSBmdW5jdGlvbmFsaXR5IGlzIHNhbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1Nzk1CisKKzIwMTQtMDgtMjkgMTI6MDE6MjcgKzAyMDAgIEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IGdldF9uZWFyZXN0X3NpemU6IEZpeCAiVW5zdXBwb3J0ZWQgZmllbGQgdHlwZSIgZXJyb3JzCisJICBNb3N0IFY0TDIgaW9jdGxzIGxpa2UgdHJ5X2ZtdCB3aWxsIGFkanVzdCBpbnB1dCBmaWVsZHMgdG8gbWF0Y2ggd2hhdCB0aGUKKwkgIGhhcmR3YXJlIGNhbiBkbyByYXRoZXIgdGhlbiByZXR1cm5pbmcgLUVJTlZBTC4gQXMgaXMgZG9jbWVudGVkIGhlcmU6CisJICBodHRwOi8vbGludXh0di5vcmcvZG93bmxvYWRzL3Y0bC1kdmItYXBpcy92aWRpb2MtZy1mbXQuaHRtbAorCSAgRUlOVkFMIGlzIG9ubHkgcmV0dXJuZWQgaWYgdGhlIGJ1ZmZlciB0eXBlIGZpZWxkIGlzIGludmFsaWQgb3Igbm90IHN1cHBvcnRlZC4KKwkgIFNvIHVwb24gcmVxdWVzdGluZyBWNEwyX0ZJRUxEX05PTkUgZGV2aWNlcyB3aGljaCBjYW4gb25seSBkbyBpbnRlcmxhY2VkCisJICBtb2RlIHdpbGwgY2hhbmdlIHRoZSBmaWVsZCB2YWx1ZSB0byBlLmcuIFY0TDJfRklFTERfQk9UVE9NIGFzIG9ubHkgcmV0dXJuaW5nCisJICBoYWxmIHRoZSBsaW5lcyBpcyB0aGUgY2xvc2VzdCB0aGV5IGNhbiBkbyB0byBwcm9ncmVzc2l2ZSBtb2Rlcy4KKwkgIEluIGVzc2VuY2UgdGhpcyBtZWFucyB0aGF0IHdlJ3ZlIGZhaWxlZCB0byBnZXQgYSAodXNhYmxlKSBwcm9nZXNzaXZlIG1vZGUKKwkgIGFuZCBzaG91bGQgZmFsbCBiYWNrIHRvIGludGVybGFjZWQgbW9kZS4KKwkgIFRoaXMgY29tbWl0IGFkZHMgYSBjaGVjayBmb3IgaGF2aW5nIGdvdHRlbiBhIHVzYWJsZSBmaWVsZCB2YWx1ZSBhZnRlciB0aGUgZmlyc3QKKwkgIHRyeV9mbXQsIHRvIGZvcmNlIGZhbGxiYWNrIHRvIGludGVybGFjZWQgbW9kZSBldmVuIGlmIHRoZSB0cnlfZm10IHN1Y2NlZWRlZCwKKwkgIHRoZXJlYnkgZml4aW5nIGdldF9uZWFyZXN0X3NpemUgZmFpbGluZyBvbiB0aGVzZSBkZXZpY2VzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNTY2MAorCisyMDE0LTA4LTI5IDEwOjU3OjIwICswMjAwICBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBnZXRfbmVhcmVzdF9zaXplOiBBbHdheXMgcmVpbml0IGFsbCBzdHJ1Y3QgZmllbGRzIG9uIHJldHJ5CisJICBUaGV5IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgdGhlIGlvY3RsIGV2ZW4gaWYgaXQgZmFpbGVkLiBUaGlzIGFsc28gbWFrZXMKKwkgIHRoZSBTX0ZNVCBmYWxsYmFjayBwYXRoIHRyeSBwcm9ncmVzc2l2ZSBmaXJzdCwgbWFraW5nIGl0IGNvbnNpc3RlbnQgd2l0aCB0aGUKKwkgIHByZWZlcnJlZCBUUllfRk1UIHBhdGguCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1NjYwCisKKzIwMTQtMDgtMjkgMTE6NTU6MjYgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IFN0b3JlIHNpemUgb2YgZGF0YSB0YWcgaW4gYSA2NCBiaXQgaW50ZWdlciBsb2NhbGx5IHRvbworCSAgT3RoZXJ3aXNlIHdlIHdpbGwgY2xpcCB0aGUgRFM2NCB2YWx1ZSBvZiBSRjY0IGZpbGVzIHRvIDMyIGJpdHMgYWdhaW4uCisKKzIwMTQtMDgtMjkgMTE6NTM6MjMgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IFVzZSA2NCBiaXQgc2NhbGluZyBmdW5jdGlvbnMgbm93IHRoYXQgZmFjdCBpcyBhIDY0IGJpdCBpbnRlZ2VyCisKKzIwMTQtMDgtMjcgMTg6NTU6MTggKzAyMDAgIFBldGVyIEcuIEJhdW0gPHBldGVyQGRyLWJhdW0ubmV0PgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5oOgorCSAgd2F2cGFyc2U6IHN1cHBvcnQgcmY2NCBmb3JtYXQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzU2MjcKKworMjAxNC0wOC0yOCAxMzo0ODo1MCAtMDYwMCAgSmFzb24gTGl0emluZ2VyIDxqbGl0emluZ2VyQGNvbnRyb2w0LmNvbT4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSAgbXVsdGlwYXJ0ZGVtdXg6IEVuc3VyZSBjYXBzIGJlZm9yZSBwYWQgYWRkZWQuCisJICBUaGlzIHN0b3JlcyB0aGUgc3RyZWFtLXN0YXJ0LCBzZXRzIGNhcHMsIGFuZCB0aGVuIGFkZHMgdGhlIHBhZCwKKwkgIHdoaWNoIGVuc3VyZXMgdGhhdCB0aGUgY2FwcyBhcmUgc2V0IGZvciB0aGUgInBhZC1hZGRlZCIgY2FsbGJhY2suCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1NjI2CisKKzIwMTQtMDgtMjggMTU6MDM6NTAgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBGYWxsYmFjayB0byBQVFMgaWYgRFRTIGlzIG1pc3NpbmcKKwkgIEZpeGluZyBhIHJlZ3Jlc3Npb24gaW50cm9kdWNlIHdoZW4gZml4aW5nOgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMTM1MgorCisyMDE0LTA4LTI4IDE2OjEzOjI5ICswNTMwICBWaW5lZXRoIFQgTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogUmVtb3ZlIGltcG9zc2libGUgZXJyb3IgY29uZGl0aW9uCisJICBXZSByZXR1cm4gRU9TIGFmdGVyIHRoZSBmaXJzdCBidWZmZXIsIGFuZCBHc3RQYWQgd2lsbCBtYWtlIHN1cmUgbm93IHRoYXQgd2UKKwkgIHdvbid0IGdldCBhbnkgb3RoZXIgYnVmZmVyIGFmdGVyd2FyZHMgdW50aWwgYSBmbHVzaCBoYXBwZW5zLiBObyBuZWVkIHRvIGNoZWNrCisJICBmb3IgaXQgb3Vyc2VsdmVzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNTU4MQorCisyMDE0LTA4LTI4IDEzOjUzOjIzICswNTMwICBWaW5lZXRoIFQgTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmZGVjLmM6CisJICBnZGtwaXhidWZkZWM6IEVPUyBhbmQgTk9UX0xJTktFRCBhcmUgbm8gZXJyb3JzIGluIGdlbmVyYWwKKwkgIERvbid0IHBvc3QgYW4gZXJyb3IgbWVzc2FnZSBmb3IgdGhlbSBidXQgbGV0IHVwc3RyZWFtIGhhbmRsZQorCSAgYW55dGhpbmcgYWNjb3JkaW5nbHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1NTY0CisKKzIwMTQtMDgtMjcgMjE6MDc6MjYgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4Lmg6CisJICBmbHZtdXg6IENvcnJlY3RseSBvZmZzZXQgdGltZXN0YW1wCisJICBUaGUgcHJldmlvdXMgbWV0aG9kIHdvdWxkIGJyZWFrIEFWIHN5bmMgaW4gdGhlIGNhc2UgYXVkaW8gb3IgdmlkZW8KKwkgIGRpZG4ndCBzdGFydCBhdCB0aGUgc2FtZSBwb2ludCBpbiBydW5uaW5nIHRpbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMxMzUyCisKKzIwMTQtMDgtMjcgMjA6NTY6MTIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogU2F2ZSBkdHMgZnJvbSBidWZmZXIKKwkgIFdlIG5vIGxvbmdlciBzZXQgZHRzIGluIG11eGVkIGJ1ZmZlci4gVGhpcyB3b3VsZCBsZWFkIHRvIGVuY29kaW5nIHRhZ3MKKwkgIHdpdGggdGltZXN0YW1wIDAgaW5zdGVhZCBvZiB0aGUgdGltZXN0YW1wIG9mIHByZXZpb3VzIGJ1ZmZlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzEzNTIKKworMjAxNC0wNy0yOCAyMDo1ODo1OSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5oOgorCSAgZmx2bXV4OiBFbnN1cmUgVGltZXN0YW1wIHN0YXJ0cyBhdCAwCisJICBGTFYgZG9jdW1lbnRhdGlvbiBzdGlwdWxhdGVzIHRoYXQgdGltZXN0YW1wIG11c3Qgc3RhcnQgYXQgemVyby4KKwkgIEluIG9yZGVyIHRvIHJlc3BlY3QgdGhpcyBydWxlLCBrZWVwIHRoZSBmaXJzdCB0aW1lc3RhbXAgYXJvdW5kCisJICBhbmQgb2Zmc2V0IHRoZSB0aW1lc3RhbXAgZnJvbSB0aGlzIHZhbHVlLiBUaGlzIGFsbG93IGZvciBsb25nZXIKKwkgIHJlY29yZGluZyB0aW1lIGluIHByZXNlbmNlIG9mIHRpbWVzdGFtcCB0aGF0IGRvZXMgbm90IHN0YXJ0CisJICBhdCAwIGFscmVhZHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMxMzUyCisKKzIwMTQtMDYtMDYgMjM6MTc6NTIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4Lmg6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2OiBUYWcgdGltZXN0YW1wIGFyZSBEVFMgbm90IFBUUworCSAgVGhlIHRhZ3MgaW4gRkxWIGFyZSBEVFMuIEluIGF1ZGlvIGNhc2VzLCBhbmQgZm9yIG1hbnkgdmlkZW8gZm9ybWF0IHRoaXMgbWFrZXMKKwkgIG5vIGRpZmZlcmVuY2UsIGJ1dCBmb3IgQVZDIHdpdGggQi1GcmFtZXMsIFBUUyBuZWVkIHRvIGJlIGNvbXB1dGVkIGZyb20KKwkgIGNvbXBvc2l0aW9uIHRpbWVzdGFtcCBDVFMsIHdpdGggUFRTID0gRFRTICsgQ1RTLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMTM1MgorCisyMDE0LTA4LTA3IDIxOjU4OjE0IC0wNDAwICBZb3VuZXNzIEFsYW91aSA8a2FrYXJvdG9Aa2FrYXJvdG8uaG9tZWxpbnV4Lm5ldD4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IEFsbG93IHJ0cCBjYXBzIHdpdGhvdXQgY2xvY2stcmF0ZQorCSAgVGhlIGppdHRlcmJ1ZmZlciBzaG91bGRuJ3QgZm9yY2UgY2xvY2stcmF0ZSBvbiBpdHMgc2luayBwYWQsIHRoaXMgd2lsbCBjYXVzZSBhIG5lZ290aWF0aW9uIGlzc3VlIHNpbmNlIHJ0cHNzcmNkZW11eCBkb2Vzbid0IGhhdmUgdGhlIGNsb2NrLXJhdGUgYW5kIGRvZXNuJ3QgYWRkIGl0IHRvIHRoZSBjYXBzLiBUaGUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCB0aGUgY2xvY2stcmF0ZSBjYW4gZWl0aGVyIGJlIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBjYXBzIG9yIHRocm91Z2ggdGhlIHJlcXVlc3QtcHQtbWFwIHNpZ25hbCwgc28gd2UgbXVzdCByZW1vdmUgY2xvY2stcmF0ZSBmcm9tIHRoZSBwYWQgdGVtcGxhdGVzIGFuZCB3ZSBtdXN0IGFjY2VwdCB0aGUgR1NUX0VWRU5UX0NBUFMgaWYgdGhlIGNhcHMgZG9uJ3QgaGF2ZSB0aGUgY2xvY2stcmF0ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzQzMjIKKworMjAxNC0wOC0xOCAxNDowNTo1MiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGF2b2lkIGNyYXNoaW5nIG9uIGRhc2ggc3RyZWFtcworCSAgREFTSC9mcmFnbWVudGVkIG1vb3YgbWlnaHQgaGF2ZSBubyBzYW1wbGVzIGFzIHRob3NlIGFyZSBjYXJyaWVkCisJICBpbiBtb29mIGZyYWdtZW50cy4gQXZvaWQgY3Jhc2hpbmcgb3IgZmFpbGluZyB0aGUgc3RyZWFtIGJlY2F1c2UKKwkgIG9mIHRoYXQuCisKKzIwMTQtMDgtMTggMTA6MzM6NDggKzA1MzAgIFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1hdWRpb3Rlc3QuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tb3Nzc3JjLmM6CisJICBleGFtcGxlczogdXNlICdwb3N0LW1lc3NhZ2VzJyBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRlcHJlY2F0ZWQgJ21lc3NhZ2UnIHByb3BlcnR5CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM0OTc5CisKKzIwMTQtMDgtMTggMTE6NDU6NTQgKzAyMDAgIFbDrWN0b3IgTWFudWVsIErDoXF1ZXogTGVhbCA8dmphcXVlekBpZ2FsaWEuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwOiBmaXggdWRwc3JjIGRvY3VtZW50YXRpb24KKwkgIHVkcHNyYyBndGstZG9jIGRvY3VtZW50YXRpb24gcmVmZXJzIHRvIHNvY2tmZCBhbmQgY2xvc2VmZCBwcm9wZXJ0aWVzIHdoaWNoIGhhcworCSAgYmVlbiByZW1vdmVkLiBUaGlzIHBhdGNoIHJlcGxhY2VzIHRob3NlIHJlZmVyZW5jZXMgdG8gc29ja2V0IGFuZCBjbG9zZS1zb2NrZXQKKwkgIHJlc3BlY3RpdmVseS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzQ5ODcKKworMjAxNC0wOC0xNSAxMDowOTo1NiArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBNYWtlIHRoZSBkZWZhdWx0IHRpbWVzY2FsZSAxLzE4MDAgc2Vjb25kCisJICBUaGUgb2xkIGRlZmF1bHQgdGltZXNjYWxlIG9mIDEgbWlsbGlzZWNvbmQgcHJvZHVjZXMgaXJyYXRpb25hbAorCSAgbnVtYmVycyBmb3IgYSBsb3Qgb2YgZnJhbWVyYXRlL2F1ZGlvLXBhY2tldC1kdXJhdGlvbiBtdWx0aXBsZXMuCisJICAxLzE4MDAgaXMgYSBuaWNlciBudW1iZXIsIGFzIGl0IHRlbmRzIHRvIHByb2R1Y2UgYmV0dGVyIGZyYWN0aW9ucworCSAgYW5kIHRoZXJlZm9yZSBzbGlnaHRseSBoaWdoZXIgYWNjdXJhY3kgb3ZlcmFsbAorCisyMDE0LTA4LTE1IDAxOjE3OjI3ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYTogVXNlIGdzdF92aWRlb19ndWVzc19mcmFtZXJhdGUoKSBmdW5jdGlvbgorCSAgUmVtb3ZlIGxvY2FsIGZyYW1lcmF0ZSBndWVzc2luZyBmdW5jdGlvbiBpbiBmYXZvdXIgb2YKKwkgIHRoZSBuZXcgZ3N0X3ZpZGVvX2d1ZXNzX2ZyYW1lcmF0ZSgpIGZ1bmN0aW9uLgorCisyMDE0LTA4LTE1IDAxOjEyOjIwICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9NYWtlZmlsZS5hbToKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogSW1wcm92ZSBmcmFtZXJhdGUgY2FsY3VsYXRpb24vZ3Vlc3NpbmcKKwkgIENoYW5nZSB0aGUgd2F5IHRoZSBvdXRwdXQgZnJhbWVyYXRlIGlzIGNhbGN1bGF0ZWQKKwkgIHRvIGlnbm9yZSB0aGUgZmlyc3Qgc2FtcGxlICh3aGljaCBpcyBzb21ldGltZXMgdHJ1bmNhdGVkCisJICBpbiBteSB0ZXN0aW5nKSBhbmQgdXNlIHRoZSBuZXcgZ3N0X3ZpZGVvX2d1ZXNzX2ZyYW1lcmF0ZSgpCisJICBmdW5jdGlvbiB0byByZWNvZ25pc2UgY29tbW9uIHN0YW5kYXJkIGZyYW1lcmF0ZXMgYmV0dGVyLgorCSAgUmVtb3ZlIHRoZSBjb2RlIHRoYXQgd2FzIHNvcnRpbmcgdGhlIGZpcnN0IDIwIHNhbXBsZQorCSAgZHVyYXRpb25zIGFuZCB0aGVuIGlnbm9yaW5nIHRoZSByZXN1bHQuCisKKzIwMTQtMDgtMTQgMTY6MzY6NDQgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBVc2UgdGhlIGJlc3Qgd2lkdGgvaGVpZ2h0L2V0YyBpZiBkb3duc3RyZWFtIGNhbiBoYW5kbGUgdGhhdAorCSAgQmVmb3JlIGl0IHdhcyBhbHdheXMgdXNpbmcgd2hhdGV2ZXIgZG93bnN0cmVhbSBwcmVmZXJyZWQsIHdoaWxlCisJICB0aGUgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBjbGFpbWVkIHNvbWV0aGluZyBkaWZmZXJlbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI3MTgwCisKKzIwMTQtMDgtMTQgMTE6Mjk6MDAgKzA1MzAgIFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogQXZvaWQgZG91YmxlIGZyZWUgb2YgVmlkZW9Db252ZXJ0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM0NzY0CisKKzIwMTQtMDgtMTMgMTE6NTg6MzUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBmaXggaW5kZW50YXRpb24KKworMjAxNC0wOC0xMyAxMTo1NDoyNiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IHVuLWJyZWFrIGR1cmF0aW9uIHF1ZXJ5aW5nCisJICBDb21taXQgMmI5NDkzYjUgYnJva2UgdGhpcyBpbiB0d28gd2F5czogYSkgd2Ugc2hvdWxkIG9ubHkKKwkgIHBhc3MgZHVyYXRpb24gcXVlcmllcyBpbiBUSU1FIGZvcm1hdCB1cHN0cmVhbSAob3IgYXQgbGVhc3QKKwkgIG5vdCB0aG9zZSBpbiBERUZBVUxUIG9yIEJZVEUgZm9ybWF0KSwgYW5kIGIpIHdlIG11c3RuJ3QKKwkgIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiAncmVzJyBmcm9tIFRSVUUgdG8gRkFMU0UKKwkgIGFuZCBub3Qgc2V0IGl0IGFnYWluIGxhdGVyLiBUaGlzIGxlZCB0byBib2d1cyBkdXJhdGlvbnMKKwkgIGJlaW5nIHJlcG9ydGVkIGZvciBGTFYgcGxheWJhY2sgZnJvbSBmaWxlLCBiZWNhdXNlIFRJTUUKKwkgIHF1ZXJpZXMgd291bGQgZmFpbCAoYXMgJ3JlcycgaGFkIGJlZW4gc2V0IHRvIEZBTFNFKSBhbmQKKwkgIHBhcnNlcnMgdGhlbiBkbyBhIEJZVEUgcXVlcnkgYXMgZmFsbGJhY2sgYW5kIHRyeSB0bworCSAgZ3Vlc3N0aW1hdGUgc29tZXRoaW5nIGluIHJldHVybiwgd2hpY2ggb2YgY291cnNlIGdvZXMKKwkgIGhvcnJpYmx5IHdyb25nIHNpbmNlIHRoZSBCWVRFIHNpemUgcmV0dXJuZWQgaXMgZm9yIHRoZQorCSAgbXV4ZWQgZmlsZS4KKworMjAxNC0wOC0xMyAxMzoyMzoxMCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgdmlkZW9iYWxhbmNlOiBBbGxvdyBhbnkgcmF3IGNhcHMgaW4gcGFzc3Rocm91Z2ggbW9kZSwgbm90IGp1c3QgdGhlIG9uZXMgd2UgaGFuZGxlCisKKzIwMTQtMDgtMTMgMTM6MDQ6MjEgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkgIHZpZGVvYmFsYW5jZTogQWxsb3cgQU5ZIGNhcHNmZWF0dXJlcywgYnV0IG9ubHkgaW4gcGFzc3Rocm91Z2ggbW9kZQorCSAgV2hlbiBjaGFuZ2luZyB0aGUgcHJvcGVydGllcyB0byBub3QgYmUgaW4gcGFzc3Rocm91Z2ggbW9kZSBhbnltb3JlLAorCSAgd2Ugd2lsbCBvbmx5IGFjY2VwdCBjYXBzIHdlIGNhbiBwcm9jZXNzIG91cnNlbHZlcywgcG90ZW50aWFsbHkgY2F1c2luZworCSAgYSBub3QtbmVnb3RpYXRlZCBlcnJvci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjAzNDUKKworMjAxNC0wOC0xMiAxMTozNDozMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSAgZG9jczogdXBkYXRlIGZvciBnaXQKKworMjAxNC0wOC0xMiAxMTozMzo1NiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBidWlsZCB4aW1hZ2VzcmMgYWdhaW4gd2hlbiBjaGVja3Mgc3VjY2VlZAorCSAgVGhpcmQgdGltZSBsdWNreSwgaG9wZWZ1bGx5LgorCisyMDE0LTA4LTExIDA5OjI2OjE3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IGZpeCB4MTEgY2hlY2tzIHRvIGJlIG5vbi1mYXRhbCBhZ2FpbgorCSAgTXVzdCBwYXNzIGFuIGFjdGlvbi1pZi1ub3QtZm91bmQgYXJndW1lbnQgdG8KKwkgIFBLR19DSEVDS19NT0RVTEVTIG9yIGl0IHdpbGwgZXJyb3Igb3V0IHdoZW4KKwkgIGl0IGNhbid0IGZpbmQgdGhlIG1vZHVsZSByZXF1ZXN0ZWQuIEFsc28gZml4CisJICBBQ19DSEVDS19MSUIgdXNhZ2UsIGV4dHJhIGxpYnMgYXJndW1lbnQgd2FzCisJICBpbiB0aGUgd3JvbmcgcGxhY2UuCisKKzIwMTQtMDgtMDcgMTc6MTI6MzggKzAzMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZm9yd2FyZCBESVNDT05UIGZyb20gdXBzdHJlYW0gdG8gdGhlIG91dHB1dCBzdHJlYW1zCisJICBUaGlzIG1ha2VzIHNlbnNlIGluIERBU0ggcmV2ZXJzZSBwbGF5YmFjaywgd2hlcmUgdGhlIHVwc3RyZWFtIGRhc2hkZW11eAorCSAgd2lsbCBkb3dubG9hZCBEQVNIIHNlZ21lbnRzIGluIHJldmVyc2Ugb3JkZXIsIGJ1dCBwdXNoIHRoZWlyIGJ1ZmZlcnMKKwkgIGZvcndhcmQgdG8gcXRkZW11eCBhbmQgbWFyayBlYWNoIHNlZ21lbnQgc3RhcnQgYXMgRElTQ09OVC4gVGhpcyBuZWVkcworCSAgdG8gYmUgZm9yd2FyZGVkIGRvd25zdHJlYW0gdG8gdGhlIHBhcnNlci9kZWNvZGVyLCBvdGhlcndpc2UgaXQgd29uJ3Qgd29yay4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzQ0NDMKKworMjAxNC0wOC0xMCAxODo1NTowNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiB1c2UgcGtnLWNvbmZpZyB0byBkZXRlY3QgeDExIGFuZCBzaW1wbGlmeSBjaGVja3MKKwkgIEFDX1BBVEhfWFRSQSBtYWNybyB1bm5lY2Vzc2FyaWx5IHB1bGxzIGluIGxpYlNNIGFuZCBsaWJJQ0UuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMxMDQ3CisKKzIwMTQtMDgtMTAgMTI6MzA6MDcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHRlc3RzOiBydHAtcGF5bG9hZGluZzogYWRqdXN0IHRlc3QgZGF0YSB0byBhdm9pZCBOQUwgY2hvcHBpbmcKKwkgIC4uLiBhbmQgY29ycmVzcG9uZGluZ2x5IHVuZXhwZWN0ZWQgYnVmZmVyIHNpemVzLgorCisyMDE0LTA4LTA5IDE0OjIyOjQyICswMjAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJyYXNAaG90bWFpbC5jb20+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgc3BlZXhlbmM6IEltcHJvdmUgYW5ub3RhdGlvbiBvZiBpbnRlcm5hbCBmdW5jdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNDU0MgorCisyMDE0LTA4LTA4IDEyOjU0OjMwICswMjAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJyYXNAaG90bWFpbC5jb20+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkgIHNoYXBld2lwZTogVW5yZWYgY2FwcyBhbmQgZWxlbWVudCBhZnRlciB1c2FnZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNDQ3OAorCisyMDE0LTA4LTA5IDIwOjQ3OjMwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGltcHJvdmUgZGVidWcgbG9nZ2luZyBvZiBmb3VyY2NzCisJICBJZiB3ZSBjYW4ndCBzaG93IEFTQ0lJLCBhdCBsZWFzdCBzaG93IHRoZW0KKwkgIGluIGJpZyBlbmRpYW4gb3JkZXIuCisKKzIwMTQtMDgtMDkgMjA6NDY6MDQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogYWRkIHN1cHBvcnQgZm9yICd3bWEgJyBtYXBwaW5nIGFzIGZvdW5kIGluIHNvbWUgaXNtdiBmaWxlcworCSAgZS5nLiBUb19UaGVfTGltaXRfNzIwXzI5NjIuaXNtdgorCisyMDE0LTA4LTA5IDE4OjMxOjIwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFkZCBzdXBwb3J0IGZvciAndmMtMScgbWFwcGluZyBhcyBmb3VuZCBpbiBzb21lIGlzbXYgZmlsZXMKKwkgIGUuZy4gVG9fVGhlX0xpbWl0XzcyMF8yOTYyLmlzbXYKKworMjAxNC0wOC0wNyAxNjozNDozNiArMDIwMCAgU2ViYXN0aWFuIFJhc211c3NlbiA8c2VicmFzQGhvdG1haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJICBydHBoMjYzcHBheTogVW5yZWYgcGFkIHRlbXBsYXRlIGNhcHMgYWZ0ZXIgdXNlCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM0NDM1CisKKzIwMTQtMDgtMDggMTI6MzY6MDEgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJhc0Bob3RtYWlsLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXI6IFVucmVmIGFsbG93ZWQgY2FwcyBhZnRlciB1c2FnZQorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNDQ3NAorCisyMDE0LTA4LTA4IDEyOjQwOjQ5ICswMjAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJyYXNAaG90bWFpbC5jb20+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IFVucmVmIHBhZCB0ZW1wbGF0ZSBjYXBzIGFmdGVyIHVzYWdlCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM0NDc1CisKKzIwMTQtMDgtMDggMTI6NDQ6MDkgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJhc0Bob3RtYWlsLmNvbT4KKworCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2c2Vlay5jOgorCSAgbmF2c2VlazogVW5yZWYgcGVlciBwYWQgYWZ0ZXIgdXNhZ2UKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzQ0NzYKKworMjAxNC0wOC0wOCAxMjoyOTo1MiArMDIwMCAgU2ViYXN0aWFuIFJhc211c3NlbiA8c2VicmFzQGhvdG1haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogVW5yZWYgcGFkIHRlbXBsYXRlIGNhcHMgYWZ0ZXIgdXNhZ2UKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzQ0NzMKKworMjAxNC0wOC0wNSAxMTo0NzozOSArMDIwMCAgU3JpbWFudGEgUGFuZGEgPHNyaW1hbnRhQGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IGFwcGVuZCBwYWNrZXRpemF0aW9uIG1vZGUgcGFyYW1ldGVyIHRvIFNEUAorCSAgQXBwZW5kIHBhY2tldGl6YXRpb24tbW9kZSBwYXJhbWV0ZXIgdG8gU0RQIGRlc2NyaXB0aW9uLgorCSAgUGFja2V0aXphdGlvbiBtb2RlIHNpZ25hbHMgdGhlIHByb3BlcnRpZXMgb2YgYW4gUlRQIHBheWxvYWQgdHlwZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzM1NTYKKworMjAxNC0wOC0wOCAwMzo1ODoxNCArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgaXNvbXA0L3F0bXV4OiBXcml0ZSBjb3JyZWN0IGZpbGUgZHVyYXRpb24gd2hlbiBnYXBzIGV4aXN0LgorCSAgV2hlbiB3cml0aW5nIG91dCBhIHRyYWsgd2l0aCBhbiBlZGl0IGxpc3QsIG1ha2Ugc3VyZSB0aGUKKwkgIG92ZXJhbGwgZmlsZSBkdXJhdGlvbiBpcyBhbHNvIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUKKwkgIGxlbmd0aGVuaW5nIG9mIHRoZSBzdHJlYW0uCisJICBBZGQgc29tZSBtb3JlIGRlYnVnIHRvIHF0ZGVtdXggdG8gd2FybiBhYm91dCBzdHJlYW1zIHRoYXQKKwkgIGFyZSBsb25nZXIgdGhhbiB0aGUgZmlsZSBhbmQgZ2V0IHRydW5jYXRlZC4KKworMjAxNC0wOC0wNCAxNTozOToxNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogUHVzaCB0aGUgY29ycmVjdCBzZWdtZW50IGluIFRDUCBtb2RlIHdoZW4gc2Vla2luZworCisyMDE0LTA4LTAzIDEyOjMzOjMyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwaDI2NHBheTogdW5icmVhayBhdSBhbGlnbmVkIGJ5dGUtc3RyZWFtIHBheWxvYWRpbmcKKworMjAxNC0wNy0yMiAxMzoyNDowOSArMDIwMCAgU3JpbWFudGEgUGFuZGEgPHNyaW1hbnRhQGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IGFwcGVuZCBwcm9maWxlLWxldmVsLWlkIHRvIFNEUAorCSAgQXBwZW5kIHByb2ZpbGUtbGV2ZWwtaWQgdG8gU0RQIGlmIGF2YWlsYWJsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzM1MzkKKworMjAxNC0wNy0zMSAxODo0Nzo0OSArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNvbGxhYm9yYS5jb20+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogY29tbW9uOgorCSAgTWFrZWZpbGU6IEFkZCB1c2FnZSBvZiBidWlsZC1jaGVja3Mgc3RlcAorCSAgQWxsb3dzIGJ1aWxkaW5nIGNoZWNrcyB3aXRob3V0IHJ1bm5pbmcgdGhlbQorCisyMDE0LTA3LTMxIDA5OjUzOjUzIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmM6CisJICB4aW1hZ2VzcmM6IEZpeCB3YXJuaW5nIGFib3V0IG1pc3NpbmcgcmV0dXJuIHZhbHVlCisKKzIwMTQtMDctMjQgMTU6Mjg6MDkgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkqIHN5cy94aW1hZ2UveGltYWdldXRpbC5jOgorCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmg6CisJICB4aW1hZ2VzcmM6IEFkZCBtaXNzaW5nIHJldHVybiB2YWx1ZSB0byBCdWZmZXIgZGlzcG9zZSBmdW5jdGlvbgorCSAgRGVwZW5kaW5nIG9udCBoZSBidWlsZCwgdGhlIG1ldGhvZCBjb3VsZCByZXR1cm4gRkFMU0UsIGhlbmNlIG5ldmVyCisJICBmcmVlIHRoZSBidWZmZXJzLCBvciBhbHJlYWR5IFRSVUUgYW5kIGxlYWQgdG8gYSBjcmFzaDoKKwkgIEZpeGVzOiBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMzNjk1CisKKzIwMTQtMDctMjggMTY6NDk6MTYgKzAyMDAgIFBoaWxpcHBlIE5vcm1hbmQgPHBoaWxuQGlnYWxpYS5jb20+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ludGVybGVhdmUuYzoKKwkgIGludGVybGVhdmU6IHNldCBvdXRwdXQgY2FwcyBsYXlvdXQgdG8gaW50ZXJsZWF2ZWQKKwkgIFNldCBvdXRwdXQgY2FwcyBsYXlvdXQgaW5kZXBlbmRlbnRseSBmcm9tIGlucHV0IGNhcHMgbGF5b3V0IHdoaWNoIGNhbgorCSAgYmUgZWl0aGVyIG5vbi1pbnRlcmxlYXZlZCBvciBpbnRlcmxlYXZlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzM4NjYKKworMjAxNC0wNy0yNiAxMjowNjozOSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQG9zZy5zaXNhLnNhbXN1bmcuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IGNsZWFyIGdjb25kCisKKzIwMTQtMDctMjUgMTQ6MzA6MzMgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgUmV2ZXJ0ICJ2NGwyYnVmZmVycG9vbDogV29ya2Fyb3VuZCBlbGVtZW50cyBub3QgcmVxdWVzdGluZyBhbnkgYnVmZmVycyIKKwkgIFRoaXMgd2FzIGEgdGVtcG9yeSB3b3JrYXJvdW5kLCB3ZSBzaG91bGQgZml4IHRoZSBlbmNvZGVycyB0aGF0IGRvIG5vdAorCSAgbmVnb3RhdGlhdGUgdGhlIGFtb3VudCBvZiBidWZmZXJzIHRoZXkgbmVlZC4KKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgZDAzYmNiYTNkYjE1ZDA2ZGJkZWE2Yjc3NmE2ZjI4ZWQyZjAzMjcyYS4KKworMjAxNC0wNy0wOCAxNDozMTo1OSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBEb24ndCBzaGFyZSBvd24gcG9vbCBpZiBtaW4gZXhjZWVkIFY0TDIgY2FwYWNpdHkKKwkgIElmIHRoZSBtaW5pbXVtIHJlcXVpcmVkIGJ1ZmZlciBleGNlZWQgVjRMMiBjYXBhY2l0eSwgZG9uJ3Qgc2hhcmUgZG93bgorCSAgcG9vbC4gVGhpcyBhbGxvdyBzdXBwb3J0IHZlcnkgaGlnaCBsYXRlbmN5LCBsaWtlIHdpdGggeDI2NGVuYyBkZWZhdWx0CisJICBlbmNvZGluZyBzZXR0aW5ncy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzIyODgKKworMjAxNC0wNy0yNSAxNzo0MjoyMCArMDIwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogcXVlcnkgbWluaW11bSByZXF1aXJlZCBidWZmZXJzIGZvciBvdXRwdXQKKwkgIFNvbWUgdjRsMiBkZXZpY2VzIGNvdWxkIHJlcXVpcmUgYSBtaW5pbXVtIGJ1ZmZlcnMgZGlmZmVyZW50IGZyb20gZGVmYXVsdAorCSAgdmFsdWVzLiBSYXRoZXIgdGhhbiBibGluZGx5IHByb3Bvc2UgYSBwb29sIHdpdGggbWluLWJ1ZmZlcnMgc2V0IHRvIHRoZQorCSAgZGVmYXVsdCB2YWx1ZSwgaXQgYXNrIHRoZSBkZXZpY2UgdXNpbmcgY29udHJvbCBpb2N0bC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzM3NTAKKworMjAxNC0wNy0yMyAxODo0MDoxMCArMDIwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDJzaW5rOiB1c2UgZGlyZWN0bHkgJ29iaicgaW5zdGVhZCBvZiAndjRsMnNpbmstPnY0bDJvYmplY3QnCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMzNjE2CisKKzIwMTQtMDctMjMgMTg6Mzk6NTAgKzAyMDAgIEF1csOpbGllbiBaYW5lbGxpIDxhdXJlbGllbi56YW5lbGxpQHBhcnJvdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJICB2NGwyOiBzZXQgZGVidWcgbWVzc2FnZXMgYWNjb3JkaW5nIHRvIGRldmljZSB0eXBlIGFuZCBJTyBtb2RlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMzNjE2CisKKzIwMTQtMDUtMjQgMTk6MDI6NTkgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBSZW1vdmUgaXNfYWN0aXZlIGNoZWNrcworCSAgVGhlc2UgY2hlY2tzIGFyZSBubyBsb25nZXIgcmVxdWlyZWQgd2l0aCByZWNlbnQgY2hhbmdlIHRvIHRoZSBidWZmZXJwb29sLiBUaGlzCisJICBzaG91bGQgYWxsb3cgY2hhbmdpbmcgdGhlIGNvbmZpZ3VhcnRpb24sIGhlbmNlIHRoZSB3YXkgZm9yd2FyZCByZW5lZ290aWF0aW9uCisJICBzdXBwb3J0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyODI2OAorCisyMDE0LTA3LTIxIDE4OjExOjE2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9sYW5nLmM6CisJICBxdGRlbXV4OiBmaXggbGFuZ3VhZ2UgY29kZSBwYXJzaW5nIGZvciAzLWxldHRlciBjb2RlcyBzdGFydGluZyB3aXRoICdhJworCSAgQW5kIGhhbmRsZSBzcGVjaWFsIHZhbHVlIGZvciAndW5zcGVjaWZpZWQnIGV4cGxpY2l0bHkuCisJICBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vbGlicmFyeS9tYWMvZG9jdW1lbnRhdGlvbi9RdWlja1RpbWUvUVRGRi9RVEZGQ2hhcDQvcXRmZjQuaHRtbAorCisyMDE0LTA3LTA4IDAyOjE4OjI3ICswMjAwICBOaWNvbGEgTXVyaW5vIDxuaWNvbGEubXVyaW5vQGdtYWlsLmNvbT4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAganBlZ2VuYzogQWRkIHN1cHBvcnQgZm9yIGVuY29kaW5nIGZyb20gTlYyMSBhbmQgTlYxMgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMjg3MAorCisyMDE0LTA3LTE5IDE4OjA0OjM4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisKKz09PSByZWxlYXNlIDEuNC4wID09PQorCisyMDE0LTA3LTE5IDE3OjIwOjM0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS40LjAKKworMjAxNC0wNy0xOSAxNjozNTo0MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxNC0wNy0xOSAxMjozMjoyMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTQtMDctMTkgMTE6MzA6MzAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IERvbid0IG92ZXJ3cml0ZSB0aGUgZmlyc3QgY29tcG9uZW50IHdpdGggdGhlIGFscGhhIHZhbHVlIGZvciBCR1J4CisJICBJbnN0ZWFkIGxlYXZlIHRoZSB4IGNvbXBvbmVudCB1bnNldCB3aGVuIGZpbGxpbmcgdGhlIGJvcmRlcnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMzMzgwCisKKzIwMTQtMDctMTYgMTc6MTg6NTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBQcm9wZXJseSByZXBvcnQgaW4gdGhlIENBUFMgcXVlcnkgdGhhdCB3ZSBjYW4gY29udmVydCBBRFRTPC0+UkFXCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMzMTkwCisKKzIwMTQtMDctMTMgMTY6MDU6NTYgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJhc0Bob3RtYWlsLmNvbT4KKworCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYzoKKwkgIHJndm9sdW1lOiBBdm9pZCB0YWtpbmcgdW5uZWNlc3NhcnkgcmVmcworCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMzEyMgorCisyMDE0LTA3LTEzIDE2OjA0OjIzICswMjAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJyYXNAaG90bWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkgIHJ0cGR0bWZtdXg6IEF2b2lkIHRha2luZyBhbiB1bm5lY2Vzc2FyeSByZWYKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzMxMjIKKworMjAxNC0wNy0xNSAxNjo1OTowNiArMDIwMCAgUGlvdHIgRHLEhWcgPHBpb3RyZHJhZ0BnbWFpbC5jb20+CisKKwkqIHBvL1BPVEZJTEVTLmluOgorCSAgcG86IHVwZGF0ZSBQT1RGSUxFUworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMzIwOAorCisyMDE0LTA3LTExIDEzOjM1OjEwIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBGaXggY29weSB0aHJlc2hvbGQgaW1wbGVtZW50YXRpb24KKwkgIFdlIGNhbm5vdCBhbGxvY2F0ZSBuZXcgYnVmZmVyIGluIGFjcXVpcmUsIG90aGVyd2lzZSB0aGUgYmFzZSBjbGFzcworCSAgaXMgbm90IGF3YXJlIGFuZCBnZXQgY29uZnVzZWQuIEluc3RlYWQsIGNvcHkgaW4gX3Byb2Nlc3MoKS4gVGhpcyBsZWFkcworCSAgdG8gY3Jhc2ggb24gZmluYWxpemUuCisJICBGaXhlcyByZWdyZXNzaW9uLCBzZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMjkxMgorCis9PT0gcmVsZWFzZSAxLjMuOTEgPT09CisKKzIwMTQtMDctMTEgMTE6Mzg6NTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjMuOTEKKworMjAxNC0wNy0xMSAxMDo1ODowOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxNC0wNy0xMCAxODoxMToyMCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmFsbG9jYXRvcjogVXNlIHFkYXRhIGluc3RlYWQgb2YgcGFyZW50aW5nIHRvIERtYWJ1Zk1lbW9yeQorCSAgUGFyZW50aW5nIFY0bDJNZW1vcnkgdG8gRG1hYnVmTWVtb3J5IHdhcyBpbiBjb25mbGljdCB3aXRoIHJlY2VudAorCSAgb3B0aW1pemF0aW9uIGluIERtYWJ1Zk1lbW9yeSB0byBhdm9pZCBkdXAoKSwgYW5kIGRpZG4ndCB3b3JrIHdpdGgKKwkgIG1lbW9yeSBzaGFyaW5nLiBJbnN0ZWFkLCB1c2UgYSBxZGF0YSBhbmQgaXQncyBkZXN0cm95IG5vdGlmeS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzA0NDEKKworMjAxNC0wNy0xMSAwODo1MjozOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTQtMDctMDggMTc6NTA6NDcgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBXb3JrYXJvdW5kIGVsZW1lbnRzIG5vdCByZXF1ZXN0aW5nIGFueSBidWZmZXJzCisJICBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgZWxlbWVudCB0aGF0IGRvbid0IHJlcXVlc3QgYnVmZmVycyB3aGVuCisJICB0aGV5IHNob3VsZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzIyODgKKworMjAxNC0wNy0wNiAxMToyNzozNiArMDIwMCAgU2ViYXN0aWFuIFJhc211c3NlbiA8c2VicmFzQGhvdG1haWwuY29tPgorCisJKiB0ZXN0cy9pY2xlcy92aWRlb2Nyb3AtdGVzdC5jOgorCSAgdGVzdHM6IGZpeCBwaXBlbGluZSBsZWFrIGluIHZpZGVvY3JvcCB0ZXN0CisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMyOTc2CisKKzIwMTQtMDctMDYgMTE6MjY6NDYgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJhc0Bob3RtYWlsLmNvbT4KKworCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1ydHBhdXguYzoKKwkgIGV4YW1wbGVzOiBjbGllbnQtcnRwYXV4OiBSZWxlYXNlIHJlZmVyZW5jZSB0byBwYXJlbnQgd2hlbiBkb25lCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMyOTc2CisKKzIwMTQtMDctMTAgMTc6MTk6NDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGZpeCBxdWVyeSBsZWFrCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMzMDAzCisKKzIwMTQtMDctMTAgMTI6MTA6NDUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6CisJICB3YXZlbmM6IFJldHVybiBub3QtbmVnb3RpYXRlZCBpZiB3ZSBnb3Qgbm8gY2FwcyBvciBjYXBzIG5lZ290aWF0aW9uIGZhaWxlZAorCSAgQW5kIGRvIGl0IGFsd2F5cywgbm90IGluc2lkZSBhIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKCkuCisJICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMjkzOQorCisyMDE0LTA3LTA4IDEzOjM0OjI4IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IEVuc3VyZSBpbnRlcm5hbCBwb29sIGFjdGl2YXRpb24KKwkgIEJlZm9yZSB3ZSB3b3VsZCBoaXQgYW4gYXNzZXJ0aW9uICInZ3N0X2J1ZmZlcl9wb29sX2lzX2FjdGl2ZSAoYnBvb2wpJyBmYWlsZWQiCisJICBpZiB0aGUgaW50ZXJuYWwgcG9vbCB3YXMgbm90IHVzZWQgdG8gcHVzaCBidWZmZXIgZG93bnN0cmVhLCBoZW5jZSBub3QKKwkgIGdpdmVuIHRvIHRoZSBiYXNlY2xhc3MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMyOTEyCisKKzIwMTQtMDctMDQgMjA6MjI6MTAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBmaXggZG91YmxlIHVubG9jayBpbiBzZWdtZW50IHNlZWsgc2VnbWVudCBjb2RlIHBhdGgKKwkgIFdlIG9ubHkgd2FudCB0byB1bmxvY2sgaWYgd2UgcHVzaCBhbiBldmVudCBkb3duc3RyZWFtIGFuZAorCSAganVtcCB0byBkb25lX3VubG9jayBsYWJlbCBhZnRlcndhcmRzLiBXZSB3b3VsZCBhbHNvIHVubG9jaworCSAgaW4gY2FzZSBvZiBhIHNlZ21lbnQgc2VlayBhbmQgdGhlbiB1bmxvY2sgYWdhaW4gbGF0ZXIsIGFuZAorCSAgbm90aGluZyBnb29kIGNhbiBjb21lIG9mIHRoYXQuCisJICAoVGhpcyBjb2RlIGxvb2tzIGEgYml0IGRvZGd5IGFueXdheSB0aG91Z2gsIHNob3VsZG4ndCBpdAorCSAgYWxzbyBiYWlsIG91dCB3aXRoIEZMT1dfRU9TIGhlcmUgaW4gY2FzZSBvZiBhIHNlZ21lbnQgc2VlaworCSAgc2NlbmFyaW8sIGp1c3Qgd2l0aG91dCB0aGUgZXZlbnQ/KQorCisyMDE0LTA3LTA0IDE5OjQ1OjU1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgdGVzdHM6IHF0bXV4OiBzdXBwcmVzcyBnbGliIGNyaXRpY2FscyBjYXVzZWQgYnkgdGVzdGluZyBkZXByZWNhdGVkIGR0cyBtZXRob2RzCisKKzIwMTQtMDctMDQgMDM6MjE6MzAgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJhc0Bob3RtYWlsLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBhdmlkZW11eCwgd2F2cGFyc2U6IFByaW50IGludmFsaWQgZm91cmNjIGluIGhleAorCSAgUHJldmlvdXNseSB0aGlzIHdhcyBwcmludGVkIGFzIGNoYXJhY3RlcnMgd2hpY2ggY2F1c2VkIGxhdGVyIHByb2Nlc3NpbmcKKwkgIG9mIHRoZSBlcnJvciBtZXNzYWdlIHRvIHNvbWV0aW1lcyB3YXJuIGFib3V0IG5vbi1VVEYtOCBjaGFyYWN0ZXJzLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMjcxNAorCisyMDE0LTA3LTAzIDE1OjIxOjE4IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IFBvb2wgbWlnaHQgYmUgTlVMTCBpbiBkZWNpZGUgYWxsb2NhdGlvbgorCSAgSWYgc3BlY2lhbCBzdHJpZGUgaXMgbmVlZGVkIGFuZCBkb3duc3RyZWFtIGRvbid0IHN1cHBvcnQgVmlkZW9NZXRhLAorCSAgcG9vbCBtaWdodCBiZSBOVUxMIGluIG9yZGVyIHRvIGxldCB0aGUgYmFzZWNsYXNzIGNyZWF0ZSBhIGdlbmVyaWMKKwkgIHBvb2zCrS4gVGhpcyB3b3VsZCBsZWFkIHRvIGFzc2VydGlvbiB3aXRoIG9uIEV4eW5vcyB3aXRoOgorCSAgZ3N0LWxhdW5jaC0xLjAgLXYgZmlsZXNyYyBsb2NhdGlvbj1tb3YgISBxdGRlbXV4ICEgaDI2NHBhcnNlICEgXAorCSAgdjRsMnZpZGVvOGRlYyAhIGZha2VzaW5rCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMyNzA3CisKKzIwMTQtMDctMDMgMTU6Mjk6NTQgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJICB2NGwyYnVmZmVycG9vbDogSGFuZGxlIEZEIGVycm9yIGR1cmluZyBwb2xsCisJICBUaGlzIHdpbGwgZW5zdXJlIHdlIGZhaWwgZWFybGllciBpZiBzb21ldGhpbmcgdW5yZWNvdmVyYWJsZQorCSAgaGFwcGVucy4KKworMjAxNC0wNy0wMyAxNToyODo0NSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkgIHY0bDJidWZmZXJwb29sOiBXYWl0IGJlZm9yZSBwb2xsaW5nIGlmIHF1ZXVlIGlzIGVtcHR5CisJICBJbiBrZXJuZWwgYmVmb3JlIDMuMTcsIHBvbGxpbmcgZHVyaW5nIHF1ZXVlIHVuZGVycnVuIHdvdWxkIHVuYmxvY2sgcmlnaHQKKwkgIGF3YXkgYW5kIHRyaWdnZXIgUE9MTEVSUi4gQXMgd2UgYXJlIG5vdCBoYW5kbGluZyBQT0xMRVJSLCB3ZSB3b3VsZCBlbmR1cAorCSAgYmxvY2tpbmcgaW4gRFFCVUYgY2FsbCwgd2hpY2ggd29uJ3QgYmUgdW5ibG9ja2VkIGNvcnJlY3RseSB3aGVuIGdvaW5nCisJICB0byBOVUxMIHN0YXRlLiBBIGRlYWRsb2NrIGF0IHN0YXJ0IGNhdXNlZCBieSBsb2NraW5nIGVycm9yIGluIGxpYnY0bDIgd2FzCisJICBhbHNvIHNlZW4gYmVmb3JlIHRoaXMgcGF0Y2guIEluc3RlYWQsIHdlIHdhaXQgdW50aWwgdGhlIHF1ZXVlIGlzIG5vIGxvbmdlcgorCSAgZW1wdHkgYmVmb3JlIHBvbGxpbmcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMxMDE1CisKKzIwMTQtMDctMDIgMTY6MDE6NDcgKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaXggZm9yIG1pa2V5IGFwaSBjaGFuZ2UKKworMjAxNC0wNi0zMCAxMDoyOTo1NCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogZml4IHByb2JpbmcgYW5kIGVudW1lcmF0aW9uIG9mIHN0ZXB3aXNlIGZyYW1lIHNpemVzCisJICBUaGUgY29kZSBlbnVtZXJhdGluZyBTVEVQV0lTRSBmcmFtZXNpemVzIHdvdWxkIHN0YXJ0IGZyb20KKwkgIChtaW5fdywgbWluX2gpIGFuZCB0aGVuIGFkZCAoc3RlcF93LCBzdGVwX2gpIHRvIGdldCB0aGUKKwkgIG5leHQgZnJhbWVzaXplLiBIb3dldmVyLCBpdCBzaG91bGQgcmVhbGx5IGFsbG93IGFueSB3aWR0aAorCSAgZnJvbSBtaW5fdyB0byBtYXhfdyB3aXRoIHN0ZXBfdyBhbmQgc2FtZSBmb3IgaGVpZ2h0cy4KKwkgIFNlY29uZGx5LCB3ZSB3b3VsZCBhZGQgYW5kIHByb2JlIGVhY2ggaW5kaXZpZHVhbCBzdGVwcGVkCisJICBmcmFtZSBzaXplIHRvIHRoZSBjYXBzIGFzIHNlcGFyYXRlIHN0cnVjdHVyZSwgd2hpY2ggd291bGQKKwkgIGxlYWQgdG8gaHVuZHJlZHMgaWYgbm90IHRob3VzYW5kcyBvZiBzdHJ1Y3RzIGVuZGluZyB1cCBpbgorCSAgdGhlIHByb2JlZCBjYXBzLiBVc2UgaW50ZWdlciByYW5nZXMgd2l0aCBzdGVwcyBpbnN0ZWFkLgorCSAgVGhpcyB3YXMgcGFydGljdWxhcmx5IG5vdGljYWJsZSB3aXRoIHRoZSBSYXNwYmVycnkgUGkgQ2FtLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNDUyMQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMjQ1OAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNjUyMQorCisyMDE0LTA2LTI3IDExOjMzOjA2ICswMTAwICBEYW5pZWwgRHJha2UgPGRyYWtlQGVuZGxlc3NtLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogZHJvcCB3b3JrYXJvdW5kIGZvciBtaXNiZWhhdmluZyBUUllfRk1UCisJICBUaGlzIHdvcmthcm91bmQgZnJvbSAyMDExIHdhcyBjYXVzaW5nIDI1IFNfRk1UIGlvY3RscyB0byBiZSBzZW50CisJICB0byBteSBVVkMgd2ViY2FtIGZyb20gdW5kZXIgZ3N0X3Y0bDJfb2JqZWN0X2dldF9jYXBzIGFzIGl0IHByb2JlcworCSAgYWxsIHRoZSBmb3JtYXRzLiBJbiB0b3RhbCwgdGhpcyBhZGRzIHVwIHRvIGFib3V0IDUgc2Vjb25kcyBvZgorCSAgZXhlY3V0aW9uIHRpbWUsIG9yIGEgMTAgc2Vjb25kIGRlbGF5IHdoaWxlIHN0YXJ0aW5nIHVwIGNoZWVzZS4KKwkgIFRoZXNlIGlvY3RscyBjb21lIGZyb20gYSB3b3JrYXJvdW5kIGZyb20gMjAxMSB3aGVyZSBUUllfRk1UIG1pZ2h0CisJICBtYWtlIGNoYW5nZXMgdG8gaGFyZHdhcmUgc2V0dGluZ3MsIHNvIFNfRk1UIHdhcyB1c2VkIHRvIHJlc3RvcmUKKwkgIHRoZSBvcmlnaW5hbCBjb25maWc6CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ5MDY3CisJICBUaGUgZHJpdmVyIGJ1ZyBpcyBub3cgYXNzdW1lZCBmaXhlZC4gUmVtb3ZlIHRoZSB3b3JrYXJvdW5kIHRvIGZpeCB0aGUKKwkgIGxvbmcgc3RhcnR1cCBkZWxheS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzIzMjYKKworMjAxNC0wNy0wMSAxMjo1MDozMSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiByZXNldCBRb1Mgb24gc2VnbWVudCBldmVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMjU0MAorCisyMDE0LTA3LTAxIDE1OjE0OjM0ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBzZW5kIGdhcCBldmVudHMgaW5zdGVhZCBvZiBzZWdtZW50IHRyaWNrcworCSAgVGhpcyBmaXhlcyBtaXNzaW5nIGZyYW1lcyBmcm9tIGJlaW5nIHRpbWUgc2tpcHBlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzIzNzIKKworMjAxNC0wNi0zMCAwMDowMDozMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogRml4IG1lbW9yeSBsZWFrcyBpbiB1bml0IHRlc3QKKworMjAxNC0wNi0yOSAyMzo1NToxOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IERvbid0IGxlYWsgY2FwcworCisyMDE0LTA2LTI5IDIwOjAyOjE0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBGaXggY29tcGlsZXIgd2FybmluZyB3aGVuIGNvbXBpbGluZyB3aXRoIEdfRElTQUJMRV9BU1NFUlQKKworMjAxNC0wNi0yOSAxOTo1OTo1MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICBydHBzc3JjZGVtdXg6IEZpeCBjb21waWxlciB3YXJuaW5nIHdoZW4gY29tcGlsaW5nIHdpdGggR19ESVNBQkxFX0FTU0VSVAorCisyMDE0LTA2LTI5IDE5OjU3OjU3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogRml4IGNvbXBpbGVyIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIHdpdGggR19ESVNBQkxFX0FTU0VSVAorCisyMDE0LTA2LTI5IDE5OjU0OjQ0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuYzoKKwkgIGRlaW50ZXJsYWNlOiBGaXggY29tcGlsZXIgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aCBHX0RJU0FCTEVfQVNTRVJUCisKKzIwMTQtMDYtMjkgMTc6MDU6MTMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWRldmljZXByb3ZpZGVyLmM6CisJICBwdWxzZTogZml4IGNvbXBpbGVyIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIHdpdGggLURHX0RJU0FCTEVfQVNTRVJUCisJICBDb21waWxlciBjb21wbGFpbnMgYWJvdXQgdW5pbml0aWFsaXNlZCB2YXJpYWJsZXMgaW4gdGhlIGltcG9zc2libGUKKwkgICdkZWZhdWx0JyBjb2RlIHBhdGggaW4gZGV2aWNlIHByb3ZpZGVyIHNvdXJjZS9zaW5rIHN3aXRjaC1jYXNlLgorCisyMDE0LTA2LTI5IDE3OjAzOjE3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyZGV2aWNlcHJvdmlkZXIuYzoKKwkgIHY0bDI6IGZpeCBjb21waWxlciB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyB3aXRoIC1ER19ESVNBQkxFX0FTU0VSVAorCSAgQ29tcGlsZXIgY29tcGxhaW5zIGFib3V0IHVuaW5pdGlhbGlzZWQgdmFyaWFibGVzIGluIHRoZSBpbXBvc3NpYmxlCisJICAnZGVmYXVsdCcgY29kZSBwYXRoIGluIGRldmljZSBwcm92aWRlciBzb3VyY2Uvc2luayBzd2l0Y2gtY2FzZS4KKworMjAxNC0wNi0yOCAxNzo0MDo0NSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbWF0cm9za2FwYXJzZS5jOgorCSAgdGVzdHM6IG1hdHJvc2thcGFyc2U6IGZhaWwgb24gZXJyb3JzIGFuZCBkaXNhYmxlIHB1bGwgbW9kZSB0ZXN0CisJICBBY3R1YWxseSBsb29rIGZvciBlcnJvciBtZXNzYWdlcyBvbiB0aGUgYnVzIGFuZCBmYWlsIGlmIHRoZXJlCisJICBpcyBvbmUgYmVmb3JlIHRoZSBFT1MgbWVzc2FnZS4gRGlzYWJsZSBwdWxsIG1vZGUgdGVzdCB3aGljaCBpcworCSAgcG9pbnRsZXNzIGFzIGxvbmcgYXMgbWF0cm9za2FwYXJzZSBvbmx5IHN1cHBvcnRzIHB1c2ggbW9kZQorCSAgKHB1bGwgbW9kZSBzdXBwb3J0IGhhcyBub3QgYmVlbiBwb3J0ZWQgb3ZlciB0byAxLjApLgorCisyMDE0LTA2LTI4IDE3OjM3OjIzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkgIG1hdHJvc2thcGFyc2U6IGRvbid0IGVycm9yIG91dCBpZiB0aGVyZSdzIG5vdCBlbm91Z2ggZGF0YSBpbiB0aGUgYWRhcHRlcgorCSAgZ3N0X21hdHJvc2thX3BhcnNlX3Rha2UoKSB3b3VsZCByZXR1cm4gRkxPV19FUlJPUiBpbnN0ZWFkIG9mCisJICBGTE9XX0VPUyBpbiBjYXNlIHRoZXJlJ3MgbGVzcyBkYXRhIGluIHRoZSBhZGFwdGVyIHRoYW4gcmVxdWVzdGVkLAorCSAgYmVjYXVzZSBidWZmZXIgaXMgTlVMTCBpbiB0aGF0IGNhc2Ugd2hpY2ggdHJpZ2dlcnMgdGhlIGVycm9yCisJICBjb2RlIHBhdGguIFRoaXMgbWFkZSB0aGUgdW5pdCB0ZXN0IGZhaWwgKG9jY2FzaW9uYWxseSBhdCBsZWFzdCwKKwkgIGJlY2F1c2Ugb2YgYSBidWcgaW4gdGhlIHVuaXQgdGVzdCB0aGVyZSdzIGEgcmFjZSBhbmQgaXQgd291bGQKKwkgIGhhcHBlbiBvbmx5IHNwb3JhZGljYWxseSkuCisKKzIwMTQtMDYtMjggMTY6NTM6NTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXJvcmMtZGlzdC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy1kaXN0Lmg6CisJICB2aWRlb21peGVyOiBVcGRhdGUgZGlzdCBnZW5lcmF0ZWQgT1JDIGZpbGVzCisKKzIwMTQtMDYtMjggMTY6NDg6MTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL2dzdGNtcy5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvZ3N0Y21zLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb2NvbnZlcnQuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvY29udmVydC5oOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy5vcmM6CisJICB2aWRlb21peGVyOiBVcGRhdGUgdmlkZW9jb252ZXJ0IGNvZGUgZnJvbSAtYmFzZQorCSAgQW5kIGFsc28gcmVuYW1lIHRoZSByZW1haW5pbmcgc3ltYm9scyB0byBwcmV2ZW50IGNvbmZsaWN0cworCSAgZHVyaW5nIHN0YXRpYyBsaW5raW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyODQ0MworCisyMDE0LTA2LTI4IDEzOjAxOjQ2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkgIGF1dG92aWRlb3NyYzogdXNlIHZpZGVvdGVzdHNyYyBhcyBmYWxsYmFjayBlbGVtZW50IGluc3RlYWQgb2YgZmFrZXNyYworCSAgZmFrZXNyYyBkb2Vzbid0IGFubm91bmNlIHZpZGVvIGNhcHMsIHNvIG1vc3QgdmlkZW8gcGlwZWxpbmVzIHdpbGwKKwkgIGp1c3QgZXJyb3Igb3V0IHdpdGggbm90LW5lZ290aWF0ZWQgaWYgYSBmYWxsYmFjayBlbGVtZW50IGlzIGNyZWF0ZWQuCisKKzIwMTQtMDYtMjggMTI6NDQ6MzEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NyYy5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2RldGVjdC5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2RldGVjdC5oOgorCSAgYXV0b2F1ZGlvc3JjOiB1c2UgYXVkaW90ZXN0c3JjIGFzIGZhbGxiYWNrIGVsZW1lbnQgaW5zdGVhZCBvZiBmYWtlc3JjCisJICBmYWtlc3JjIGRvZXNuJ3QgYW5ub3VuY2UgYXVkaW8gY2Fwcywgc28gbW9zdCBhdWRpbyBwaXBlbGluZXMgd2lsbAorCSAganVzdCBlcnJvciBvdXQgd2l0aCBub3QtbmVnb3RpYXRlZCBpZiBhIGZhbGxiYWNrIGVsZW1lbnQgaXMgY3JlYXRlZC4KKworPT09IHJlbGVhc2UgMS4zLjkwID09PQorCisyMDE0LTA2LTI4IDExOjIxOjE1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjMuOTAKKworMjAxNC0wNi0yOCAxMTowODozMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxNC0wNi0yNiAxNDo1Mjo1NyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3B1bHNlL01ha2VmaWxlLmFtOgorCSogZXh0L3B1bHNlL3BsdWdpbi5jOgorCSogZXh0L3B1bHNlL3B1bHNlZGV2aWNlcHJvdmlkZXIuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZWRldmljZXByb3ZpZGVyLmg6CisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJkZXZpY2Vwcm92aWRlci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmRldmljZXByb3ZpZGVyLmg6CisJICBSZW5hbWUgR3N0RGV2aWNlTW9uaXRvciB0byBHc3REZXZpY2VQcm92aWRlcgorCisyMDE0LTA2LTI0IDA5OjE0OjQwICswNTMwICBSYXZpIEtpcmFuIEsgTiA8cmF2aS5raXJhbkBzYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBBZGQgdW5pdCB0ZXN0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMyMTQ0CisKKzIwMTQtMDYtMTYgMTE6MzU6MzkgKzAyMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRzYXVuaWVyQGdub21lLm9yZz4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXI6IERlY2xhcmUgYXMgQ29tcG9zaXRvciBpbiAna2xhc3MnCisKKzIwMTQtMDYtMjYgMTM6NTA6MTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBmaXggc3BlZXggY2FwcworCSAgRGVjb2RlciBjb21wbGFpbnMgYWJvdXQgIm5vdGlmaWNhdGlvbjogSW52YWxpZCBtb2RlIGVuY291bnRlcmVkLgorCSAgVGhlIHN0cmVhbSBpcyBjb3JydXB0ZWQiIHRob3VnaCwgZXZlbiBpZiBpdCB3b3Jrcywgc28gdGhlcmUncworCSAgcHJvYmFibHkgc29tZXRoaW5nIHdyb25nIHdpdGggdGhlIGdlbmVyYXRlZCBjb2RlYyBoZWFkZXJzLgorCisyMDE0LTA2LTI2IDEzOjQzOjMzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBmaXggc3BlZXggaW4gRkxWCisJICBTcGVleCBpbiBGTFYgaXMgYWx3YXlzIG1vbm8gQCAxNmtIeiwgc2VlCisJICBodHRwOi8vZG93bmxvYWQubWFjcm9tZWRpYS5jb20vZjR2L3ZpZGVvX2ZpbGVfZm9ybWF0X3NwZWNfdjEwXzEucGRmCisJICBzZWN0aW9uIEUuNC4yLjE6ICJJZiB0aGUgU291bmRGb3JtYXQgaW5kaWNhdGVzIFNwZWV4LCB0aGUgYXVkaW8gaXMKKwkgIGNvbXByZXNzZWQgbW9ubyBzYW1wbGVkIGF0IDE2IGtIeiwgdGhlIFNvdW5kUmF0ZSBzaGFsbCBiZSAwLCB0aGUKKwkgIFNvdW5kU2l6ZSBzaGFsbCBiZSAxLCBhbmQgdGhlIFNvdW5kVHlwZSBzaGFsbCBiZSAwIgorCSAgQWxzbyBzZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MzYyMgorCisyMDE0LTA2LTI2IDA1OjE5OjU3ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBpc29tcDQ6IEFkZCBvYmplY3QgdHlwZSBpZCBhbmQgZm91cmNjIGZvciBEVFMvRFRTLUhECisJICBFbmFibGVzIHBsYXliYWNrIGZvciBmaWxlcyB3aXRoIERUUyBhdWRpbyB0cmFja3MuCisJICBBbHNvIGFkZCBhbiBleHRyYSBBQy0zIHZhcmlhbnQgZm91cmNjIGZyb20gTmVybworCisyMDE0LTAzLTEzIDEwOjM1OjMwICswMTAwICBEYXZpZCBGZXJuYW5kZXogPGQuZmVybmFuZGV6bG9wQGdtYWlsLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXIyOiBTb2x2ZSBzZWdtZW50YXRpb24gZmF1bHQgd2hlbiBzcmMgY2FwcyBhcmUgY29uZmlndXJlZAorCSAgQ2hhbmdlIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIE5VTEwgd2hpbGUgaG9sZGluZyB0aGUgbG9jayB0byBhdm9pZAorCSAgcmFjZSBjb25kaXRpb25zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAxMTEwCisKKzIwMTQtMDYtMjUgMTQ6MzQ6MjEgKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogaW1wcm92ZSBTUiBwYWNrZXQgaGFuZGxpbmcKKwkgIEltcGxlbWVudCAzIGRpZmZlcmVudCBjYXNlcyBmb3IgaGFuZGxpbmcgdGhlIFNSOgorCSAgMSkgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggdGltaW5nIGluZm9ybWF0aW9uIHRvIGhhbmRsZSB0aGUgU1IgcGFja2V0IGFuZAorCSAgd2UgbmVlZCB0byB3YWl0IGEgbGl0dGxlIGZvciBtb3JlIFJUUCBwYWNrZXRzLiBJbiB0aGF0IGNhc2Ugd2Uga2VlcAorCSAgdGhlIFNSIHBhY2tldCBhcm91bmQgYW5kIHJldHJ5IHdoZW4gd2UgZ2V0IGFuIFJUUCBwYWNrZXQgaW4gdGhlCisJICBjaGFpbiBmdW5jdGlvbi4KKwkgIDIpIHRoZSBTUiBwYWNrZXQgaGFzIGEgdG9vIG9sZCB0aW1lc3RhbXAgYW5kIHNob3VsZCBiZSBkaXNjYXJkZWQuIEl0IGlzCisJICBsYWJlbGVkIGludmFsaWQgYW5kIHRoZSBsYXN0X3NyIGlzIGNsZWFyZWQuCisJICAzKSB0aGUgU1IgcGFja2V0IGlzIG9rIGFuZCB0aGVyZSBpcyBlbm91Z2ggdGltaW5nIGluZm9ybWF0aW9uLCBwcm9jZWVkCisJICB3aXRoIHByb2Nlc3NpbmcgdGhlIFNSIHBhY2tldC4KKwkgIEJlZm9yZSB0aGlzIHBhdGNoLCBjYXNlIDIpIGFuZCAxKSB3ZXJlIGhhbmRsZWQgaW4gdGhlIHNhbWUgd2F5LAorCSAgcmVzdWx0aW5nIHRoYXQgU1IgcGFja2V0cyB3aXRoIHRvbyBvbGQgdGltZXN0YW1wcyB3ZXJlIGNoZWNrZWQgb3ZlciBhbmQKKwkgIG92ZXIgYWdhaW4gZm9yIGVhY2ggUlRQIHBhY2tldC4KKworMjAxNC0wNi0yNCAxMDo0NzozMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdWRwc2luay5jOgorCSAgdGVzdHM6IGFkZCB1ZHBzaW5rIHRlc3QgdG8gY2hlY2sgY2xpZW50IGFkZC9yZW1vdmUKKworMjAxNC0wNi0yMyAxNjoxMzoyNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdWRwc2luay5jOgorCSAgdGVzdHM6IHBvcnQgdWRwc2luayB0ZXN0cyB0byAxLjAKKwkgIFRoZXkgYWxsIHNlZW0gYSBiaXQgcG9pbnRsZXNzIHRob3VnaC4KKworMjAxNC0wNi0yMyAxOTo1NToyOSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogQWRkIFVZVlkgZm9ybWF0CisKKzIwMTQtMDYtMDYgMTE6MjA6MjEgKzAyMDAgIE1pZ3VlbCBQYXLDrXMgRMOtYXogPG1wYXJpc2RpYXpAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIGdzdHJ0cHNzcmNkZW11eDogbWFuYWdlIHNzcmMgb2YgUlRDUCBSUiBwYWNrZXRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMxMzI0CisKKzIwMTQtMDYtMjMgMjA6NTM6NTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IFVwZGF0ZSBvZmZzZXQgYWZ0ZXIgcGFyc2luZyBhZHRsIGNodW5rCisJICBPdGhlcndpc2Ugd2Ugd2lsbCBwYXJzZSBpdCBvdmVyIGFuZCBvdmVyIGFnYWluIHdpdGhvdXQgZXZlcgorCSAgZ2V0dGluZyBwYXN0IGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMTUzMworCisyMDEzLTA3LTA3IDIwOjE4OjI3ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IHJlbW92ZSBsZWdhY3kgY29kZSBmb3IgcGFzc2luZyBhIHdpbmRvdyBoYW5kbGUKKwkgICJoYXZlLW5zLXZpZXciIGFuZCB0aGUgImVtYmVkIiBwcm9wZXJ0eSB3YXMga2VwdCBpbiAwLjEwIGZvcgorCSAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgYnV0IGl0J3Mgbm8gbG9uZ2VyIHVzZWQgaW4gZmF2b3Igb2YKKwkgIHRoZSBHc3RWaWRlb092ZXJsYXkgaW50ZXJmYWNlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAzNzUzCisKKzIwMTQtMDYtMjIgMTk6MzY6MTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQKKworMjAxNC0wNi0yMiAxOToyNjowMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYWRlbXV4OiBEb24ndCBjYWxsIEdTVF9ERUJVR19PQkpFQ1QoKSBhbmQgb3RoZXIgbWFjcm9zIHdpdGggbm9uLUdPYmplY3Qgb2JqZWN0cworCSAgSXQgd2lsbCBjcmFzaCB3aXRoIGxhdGVzdCBHTGliIEdJVCBhbmQgd2FzIG5ldmVyIHN1cHBvc2VkIHRvIHdvcmsgYmVmb3JlCisJICBlaXRoZXIuCisKKz09PSByZWxlYXNlIDEuMy4zID09PQorCisyMDE0LTA2LTIyIDE4OjA4OjAzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFsczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS4zLjMKKworMjAxNC0wNi0yMiAxNzozNjoyOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxNC0wNi0yMiAxNDoyNDoyNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTQtMDYtMjEgMDE6MzI6MDMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWRldmljZW1vbml0b3IuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJkZXZpY2Vtb25pdG9yLmM6CisJICBwdWxzZSwgdjRsMjogdXBkYXRlIGZvciBkZXZpY2UgImtsYXNzIiAtPiAiZGV2aWNlLWNsYXNzIiByZW5hbWUKKworMjAxNC0wNi0yMCAxMjoyMTowNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpdWRwc2luazogb3B0aW1pc2F0aW9uOiBhdm9pZCB1bm5lY2Vzc2FyeSBtZW1vcnkgcmVmL3VucmVmcworCSAgV2Uga25vdyB0aGUgYnVmZmVyIHdpbGwgc3RheSB2YWxpZCBhbmQgd2Ugd2lsbCBhbHNvIG5vdAorCSAgbW9kaWZ5IHRoZSBidWZmZXIsIHdlIGp1c3Qgd2FudCB0byBzZW5kIG91dCB0aGUgZGF0YS4KKworMjAxNC0wNi0xOSAxNDo1OTo0OCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJICBtdWx0aXVkcHNpbms6IGF2b2lkIHNvbWUgdW5uZWNlc3NhcnkgcnVuLXRpbWUgdHlwZSBjaGVja3MKKworMjAxNC0wNi0xOSAxNjoxNzoyMyArMDIwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHBhc3MgdGhlIHN0cmVhbSBpZCB3aGVuIGFza2luZyBmb3IgY3J5cHRvIHBhcmFtcworCSAgVGhpcyB3YXkgdGhlIGFwcCBjYW4gY2hvb3NlIGRpZmZlcmVudCBwYXJhbWV0ZXJzIGZvciBlYWNoIHN0cmVhbS4KKworMjAxNC0wNS0yMCAxNDo1ODowNyAtMDcwMCAgQWxlaXggQ29uY2hpbGxvIEZsYXF1w6kgPGFsZWl4QG9ibG9uZy5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IGFkZCBzdXBwb3J0IGZvciBrZXkgbGVuZ3RoIHBhcmFtZXRlcnMKKwkgIFRoaXMgcGF0Y2ggYWRkcyBzdXBwb3J0cyBmb3IgdGhlIGluY29taW5nIGtleSBtYW5hZ2VtZW50IHBhcmFtZXRlcnMgZm9yCisJICBlbmNyeXB0aW9uIGFuZCBhdXRoZW50aWNhdGlvbiBrZXkgbGVuZ3Rocy4KKwkgIEl0IGFsc28gYWRkcyBhIG5ldyBzaWduYWwgcmVxdWVzdC1ydGNwLWtleSB0aGF0IGFsbG93cyB0aGUgdXNlciB0bworCSAgcHJvdmlkZSB0aGUgY3J5cHRvIHBhcmFtZXRlcnMgYW5kIGtleSBmb3IgdGhlIFJUQ1Agc3RyZWFtLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMDQ3MworCisyMDE0LTA2LTE5IDE1OjI1OjAxICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5jOgorCSAgdnA4ZGVwYXk6IGZpeCBoZWFkZXIgc2l6ZSBjaGVja2luZworCSAgVXNlIGEgZGlmZmVyZW50IHZhcmlhYmxlIG5hbWUgdG8gbWFrZSBpdCBjbGVhciB0aGF0IHdlIGFyZSBjYWxjdWxhdGluZworCSAgdGhlIGhlYWRlciBzaXplLgorCSAgQ29ycmVjdGx5IGNoZWNrIHRoYXQgd2UgaGF2ZSBlbm91Z2ggYnl0ZXMgdG8gcmVhZCB0aGUgaGVhZGVyIGJpdHMuIFdlCisJICB3ZXJlIGNoZWNraW5nIGlmIHRoZXJlIHdlcmUgNSBieXRlcyBhdmFpbGFibGUgaW4gdGhlIGhlYWRlciB3aGlsZSB3ZQorCSAgb25seSBuZWVkZWQgMywgY2F1c2luZyB0aGUgcGFja2V0IHRvIGJlIGRpc2NhcmRlZCBhcyB0b28gc21hbGwuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIzNTk1CisKKzIwMTQtMDUtMjAgMTI6Mzk6MzEgKzAyMDAgIEd1aWxsYXVtZSBEZXNtb3R0ZXMgPGd1aWxsYXVtZS5kZXNtb3R0ZXNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5oOgorCSAgcnRwaDI2NHBheTogcHJvcGFnYXRlIHRoZSBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCBmbGFnCisJICBTaW1pbGFybHkgdG8gd2hhdCB3ZSBkaWQgd2l0aCB0aGUgREVMVEFfVU5JVCBmbGFnLCB0aGlzIHBhdGNoCisJICBwcm9wYWdhdGVzIHRoZSBESVNDT05UIGZsYWcgdG8gdGhlIGZpcnN0IFJUUCBwYWNrZXQgYmVpbmcgdXNlZCB0byB0cmFuc2ZlciBhCisJICBESVNDT05UIGJ1ZmZlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzA1NjMKKworMjAxNC0wNS0wNiAxNzo0MjoxNCArMDIwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJICBydHBoMjY0cGF5OiBwcm9wYWdhdGUgdGhlIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUIGZsYWcKKwkgIERvd25zdHJlYW0gZWxlbWVudHMgbWF5IGJlIGludGVyZXN0ZWQga25vd2luZyBpZiBhIFJUUCBwYWNrZXQgaXMgdGhlIHN0YXJ0CisJICBvZiBhIGtleSBmcmFtZSAodG8gaW1wbGVtZW50IGEgUlRQIGV4dGVuc2lvbiBhcyBkZWZpbmVkIGluIHRoZQorCSAgT05WSUYgU3RyZWFtaW5nIFNwZWMgZm9yIGV4YW1wbGUpLgorCSAgV2UgZG8gdGhpcyBieSBjaGVja2luZyB0aGUgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQgZmxhZyB3ZSByZWNlaXZlIGZyb20KKwkgIHVwc3RyZWFtIGFuZCBwcm9wYWdhdGUgaXQgdG8gdGhlICpmaXJzdCogUlRQIHBhY2tldCBvdXRwdXR0ZWQgdG8gdHJhbnNmZXIgdGhpcworCSAgYnVmZmVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMDU2MworCisyMDE0LTA1LTIwIDEzOjU4OjIwICswMjAwICBHdWlsbGF1bWUgRGVzbW90dGVzIDxndWlsbGF1bWUuZGVzbW90dGVzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuaDoKKwkgIGdzdHJ0cG1wNGdwYXk6IHByb3BhZ2F0ZSB0aGUgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQgZmxhZworCSAgUHJvcGFnYXRlIHRoZSBESVNDT05UIGZsYWcgdG8gdGhlIGZpcnN0IFJUUCBwYWNrZXQgYmVpbmcgdXNlZCB0byB0cmFuc2ZlcgorCSAgYSBESVNDT05UIGJ1ZmZlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzA1NjMKKworMjAxNC0wNS0yMCAxMzo1ODoyMCArMDIwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAgcnRwanBlZ3BheTogcHJvcGFnYXRlIHRoZSBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCBmbGFnCisJICBQcm9wYWdhdGUgdGhlIERJU0NPTlQgZmxhZyB0byB0aGUgZmlyc3QgUlRQIHBhY2tldCBiZWluZyB1c2VkIHRvIHRyYW5zZmVyCisJICBhIERJU0NPTlQgYnVmZmVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMDU2MworCisyMDE0LTA2LTE4IDE1OjAzOjI1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogZG9uJ3QgbGVhayBmbG93IGNvbWJpbmVyCisKKzIwMTQtMDYtMTggMTQ6Mzg6NTUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJICBydHBqcDJrcGF5OiBwcmUtYWxsb2NhdGUgYnVmZmVyLWxpc3Qgb2YgdGhlIHJpZ2h0IHNpemUKKworMjAxNC0wNi0xOCAxNDozNDowOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBydHBqcGVncGF5OiBwcmUtYWxsb2NhdGUgYnVmZmVyIGxpc3Qgb2YgdGhlIHJpZ2h0IHNpemUKKworMjAxNC0wNi0xOCAxNDoxOToyOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJICBydHBtcDR2cGF5OiBwcmUtYWxsb2NhdGUgYnVmZmVyIGxpc3Qgb2YgdGhlIHJpZ2h0IHNpemUKKworMjAxNC0wNi0xOCAxMzo0NDozMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cDhwYXkuYzoKKwkgIHJ0cHZwOHBheTogYWxsb2NhdGUgYml0cmVhZGVyIG9uIHRoZSBzdGFjaworCisyMDE0LTA2LTE4IDEzOjI5OjQ3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOHBheS5jOgorCSAgcnRwdnA4cGF5OiBwb3N0IGVycm9yIG1lc3NhZ2Ugb24gYnVzIG9uIGVycm9yIGFuZCBkb24ndCB1c2UgZ19tZXNzYWdlKCkKKworMjAxNC0wNi0xOCAxMzoyMDo0NCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cDhwYXkuYzoKKwkgIHJ0cHZwOHBheTogY291cGxlIG9mIG1pbm9yIG9wdGltaXNhdGlvbnMKKwkgIFByZS1hbGxvY2F0ZSBidWZmZXIgbGlzdCBvZiB0aGUgcmlnaHQgc2l6ZSB0byBhdm9pZCByZS1hbGxvY3MuCisJICBBdm9pZCBwbGVudHkgb2YgZG91YmxlIHJ1bnRpbWUgY2FzdCBjaGVja3MgYW5kIHJlLWRvaW5nIHRoZQorCSAgc2FtZSBjYWxjdWxhdGlvbiBvdmVyIGFuZCBvdmVyIGFnYWluIGluIHJ0cF92cDhfY2FsY19wYXlsb2FkX2xlbigpLgorCSAgT25seSBjYWxsIGdzdF9idWZmZXJfZ2V0X3NpemUoKSBvbmNlLgorCisyMDE0LTA2LTE4IDA4OjEwOjAzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSAgcnRwZ3N0cGF5OiBwcmUtYWxsb2NhdGUgYnVmZmVyIGxpc3Qgb2YgdGhlIHJpZ2h0IHNpemUKKwkgIFRvIGF2b2lkIHJlLWFsbG9jcy4KKworMjAxNC0wNi0xOCAwNzo1MjowNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHBoMjY0cGF5OiBwcmUtYWxsb2NhdGUgYnVmZmVybGlzdCBvZiB0aGUgcmlnaHQgc2l6ZQorCSAgVG8gYXZvaWQgdW5uZWNlc3NhcnkgcmUtYWxsb2NzLgorCisyMDE0LTA2LTE2IDIwOjE1OjQzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6CisJICBydHBoMjY0cGF5OiBwdXNoIHNpbmdsZSBidWZmZXIgZGlyZWN0bHksIG5vIG5lZWQgdG8gd3JhcCBpdCBpbiBhIGJ1ZmZlcmxpc3QKKwkgIE5vIHBvaW50IGluIGEgYnVmZmVyIGxpc3QgaWYgd2UganVzdCBoYXZlIG9uZSBzaW5nbGUKKwkgIGJ1ZmZlciB0byBwdXNoLiBGaXggdXAgdW5pdCB0ZXN0IHRvIGhhbmRsZSB0aGF0IGNhc2UKKwkgIGFzIHdlbGwuCisKKzIwMTQtMDYtMTYgMTU6MzU6MTIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5Lmg6CisJICBydHB2cmF3cGF5OiBtYWtlIGNodW5rcyBwZXIgZnJhbWUgY29uZmlndXJhYmxlCisJICBCaXQgb2YgYSBtaXNub21lciBiZWNhdXNlIGl0J3MgcmVhbGx5IGNodW5rcyBwZXIgZmllbGQKKwkgIGFuZCBub3QgcGVyIGZyYW1lLCBidXQgd2UncmUgZ29pbmcgdG8gaWdub3JlIHRoYXQgZm9yCisJICB0aGUgdGltZSBiZWluZy4KKworMjAxNC0wNi0xNiAxNDo1MjoxNiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuaDoKKwkgIHJ0cHZyYXdwYXk6IHJlbW92ZSB1bnVzZWQgdmFyaWFibGVzCisKKzIwMTQtMDYtMTYgMTQ6NDQ6MjcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSAgcnRwdnJhd3BheTogcHJlLWFsbG9jYXRlIGJ1ZmZlciBsaXN0cyBvZiBzdWZmaWNpZW50IHNpemUKKwkgIEF2b2lkcyB1bm5lY2Vzc2FyeSByZWFsbG9jcyB3aGVuIGFwcGVuZGluZyBidWZmZXJzCisJICB0byB0aGUgYnVmZmVybGlzdC4KKworMjAxNC0wNi0xNiAxMzo1MTowMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJICBydHB2cmF3cGF5OiBtaWNyby1vcHRpbWlzZSB2YXJpYWJsZSBhY2Nlc3MgaW4gaW5uZXIgbG9vcAorCSAgU3RvcmUgc29tZSB2YWx1ZXMgdGhhdCBkb24ndCBjaGFuZ2UgZHVyaW5nIHRoZSBleGVjdXRpb24KKwkgIG9mIHRoZSBpbm5lciBsb29wcyBsb2NhbGx5LCBzbyB0aGUgY29tcGlsZXIga25vd3MgdGhhdCB0b28uCisKKzIwMTQtMDYtMTYgMTM6Mzg6NDcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSAgcnRwdnJhd3BheTogdXNlIGJ1ZmZlciBsaXN0cworCSAgQ29sbGVjdCBidWZmZXJzIHRvIHNlbmQgb3V0IGluIGJ1ZmZlciBsaXN0cyBpbnN0ZWFkIG9mCisJICBwdXNoaW5nIG91dCBzaW5nbGUgYnVmZmVycyBvbmUgYXQgYSB0aW1lLiBGb3IgSEQgdmlkZW8KKwkgIGVhY2ggZnJhbWUgbWlnaHQgZWFzaWx5IGFkZCB1cCB0byBhIGNvdXBsZSBvZiB0aG91c2FuZAorCSAgcGFja2V0cywgbXVsdGlwbHkgdGhhdCBieSB0aGUgZnJhbWUgcmF0ZSBhbmQgdGhhdCdzIGEKKwkgIGxvdCBvZiBwdXNoKCkgYW5kIHNlbmRtc2coKSBjYWxscyBwZXIgc2Vjb25kLgorCSAgQSBnb29kIHJlYXNvbiB0byBwdXNoIG91dCBidWZmZXJzIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGlzCisJICBsYXRlbmN5LCBzbyB3ZSBkb24ndCBhY2N1bXVsYXRlIHRoZSB3aG9sZSBmcmFtZSBpbiBhIHNpbmdsZQorCSAgYnVmZmVyIGxpc3QsIGJ1dCBpbnN0ZWFkIHB1c2ggaXQgb3V0IGluIGEgZmV3IGNodW5rcywgd2hpY2gKKwkgIGlzIGhvcGVmdWxseSBhIHJlYXNvbmFibGUgY29tcHJvbWlzZS4KKworMjAxNC0wNi0xNiAxNjo0MDowNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgdWRwOiBpbXByb3ZlIGVsZW1lbnQgZGVzY3JpcHRpb25zIGZvciBkeW51ZHBzaW5rIGFuZCBtdWx0aXVkcHNpbmsKKworMjAxNC0wNi0xNiAxNjoxNzoxNiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgdWRwOiByZW1vdmUgc3VwcHJlc3Npb24gb2YgY29tcGlsZXIgd2FybmluZ3MgZm9yIGRlcHJlY2F0ZWQgR0xpYiBBUEkKKwkgIE5vdCBuZWVkZWQgYW55IG1vcmUuCisKKzIwMTQtMDYtMTcgMTM6MTY6MjcgKzA1MzAgIFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBGaXggY2FwcyBuZWdvdGlhdGlvbiBpc3N1ZQorCSAgTWFrZSBzdXJlIHRoYXQgaWYgQVlVViBpcyByZWNlaXZlZCBpdCB3aWxsIGRldGVjdCB0aGF0IGl0IGNhbiBwcm9kdWNlCisJICBib3RoIFJHQiBhbmQgWVVWIGZvcm1hdHMKKwkgIFNpZ25lZC1vZmYtYnk6IFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNTI0OAorCisyMDE0LTA2LTE2IDEyOjAyOjQxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJICBydHB0aGVvcmFkZXBheTogZml4IGRvdWJsZSBmcmVlcworCSAgRml4IGRvdWJsZS1mcmVlcyBpbnRyb2R1Y2VkIHRvIGZpeCBhbm90aGVyIGNvdmVyaXR5IHJlcG9ydC4KKwkgIENJRCAxMjIzMDUzCisKKzIwMTQtMDYtMTMgMTA6MTI6MDcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSAgZHludWRwc2luazogcmV0dXJuIEZMVVNISU5HIHdoZW4gc2VuZHRvIGdvdCBjYW5jZWxlZCwgbm90IGFuIGVycm9yCisKKzIwMTQtMDYtMTMgMDk6NTI6MDMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3MvZ3N0b3NzaGVscGVyLmM6CisJICBvc3M6IHNpbXBsaWZ5IHByb2JlZCBjYXBzIGJlZm9yZSByZXR1cm5pbmcgdGhlbQorCSAgRXhwb3NlcyBhbGwgZm9ybWF0cyBpbiB0aGUgZmlyc3Qgc3RydWN0dXJlIGlmIHRoZQorCSAgcmVzdCBpcyB0aGUgc2FtZSBmb3IgYWxsIG9mIHRoZW0uCisKKzIwMTQtMDYtMTMgMDk6NDU6MjggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3MvZ3N0b3NzaGVscGVyLmM6CisJICBvc3M6IG1ha2Ugc3VyZSAxNi1iaXQgZm9ybWF0cyBhcmUgYmVmb3JlIDgtYml0IGZvcm1hdHMgaW4gcHJvYmVkIGNhcHMKKwkgIFByb2JlIHN1cHBvcnRlZCBmb3JtYXRzIGluIG9yZGVyIG9mIGRlc2lyYWJpbGl0eSByYXRoZXIgdGhhbiBpbgorCSAgd2hhdCBvcmRlciB0aGV5IG1heSBoYXBwZW4gdG8gYmUgaW4gdGhlIGZvcm1hdHMgYml0bWFzay4gRml4ZXMKKwkgIGFjY2lkZW50YWxseSBleHBvc3VyZSBvZiA4LWJpdCBmb3JtYXRzIGluIGNhcHMgYmVmb3JlIDE2LWJpdCBmb3JtYXRzCisJICAoaW4gY2FzZSB3aGVyZSBVMTYgd2FzIG5vdCBzdXBwb3J0ZWQgUzggbWlnaHQgYmUgbGlzdGVkIGJlZm9yZSBTMTYpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNjg4NAorCisyMDE0LTA2LTEyIDE2OjM2OjI0IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogQ2xlYW5seSBoYW5kbGUgdjRsMl9hbGxvY2F0b3JfbmV3IGZhaWx1cmUKKworMjAxNC0wNi0xMiAxMToyNDoxNSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkgIHJ0cHRoZW9yZGVwYXk6IGZpeCBsZWFrcworCSAgQ292ZXJpdHkgMTIxMjE2MworCisyMDE0LTA2LTEyIDExOjE2OjA4ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6CisJICBydHBnNzI5cGF5OiBsZWFrIGZpeGVzCisJICBDb3Zlcml0eSAxMjEyMTU5CisKKzIwMTQtMDYtMTIgMTE6MTE6MzggKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgIHJ0cGgyNjNwYXk6IGZpeCBsZWFrCisJICBDb3Zlcml0eSAxMjEyMTU3CisKKzIwMTQtMDYtMTIgMTA6NDM6NTMgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgIHJ0cGgyNjNwYXk6IGZpeCBsZWFrcworCSAgQ292ZXJpdHkgMTIxMjE0OQorCisyMDE0LTA2LTEyIDEwOjMxOjQ3ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSAgcnRwZHZwYXk6IGNhdGNoIGZhaWx1cmVzIHRvIG1hcCBidWZmZXIKKwkgIENvdmVyaXR5IDExMzk3NDEKKworMjAxNC0wNi0xMSAxNzo0Mzo0MiArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkgIG11bHRpcGFydGRlbXV4OiBndWFyZCBhZ2FpbnN0IGhhdmluZyBubyBNSU1FIHR5cGUKKwkgIFRoZSBjb2RlIHdvdWxkIHByZXZpb3VzbHkgY3Jhc2ggdHJ5aW5nIHRvIGluc2VydCBhIE5VTEwgc3RyaW5nCisJICBpbnRvIGEgaGFzaCB0YWJsZS4KKwkgIEl0IGRvZXMgc2VlbSBhIGxpdHRsZSBicm9rZW4gdGhhdCBpbmRleGluZyBpcyBkb25lIGJ5IE1JTUUgdHlwZQorCSAgYW5kIG5vdCBieSBpbmRleCB0aG91Z2gsIHVubGVzcyB0aGUgc3BlYyBzYXlzIHRoZXJlIGNhbm5vdCBiZQorCSAgdHdvIHBhcnRzIHdpdGggdGhlIHNhbWUgTUlNRSB0eXBlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1OTU3MworCisyMDE0LTA2LTEwIDE1OjQyOjE0IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5oOgorCSAgbXVsdGlwYXJ0ZGVtdXg6IFNlbmQgc3RyZWFtLXN0YXJ0IGV2ZW50CisJICBUaGlzIGV2ZW50IHdhcyBub3Qgc2VudC4gU2VuZCBpdCBiZWZvcmUgY2FwcywgdGhpcyByZXF1aXJlcyB0aGUgcGFkIHRvCisJICBiZSBwYXJlbnRlZC4gVGhpcyByZW1vdmVzIHdhcm5pbmcgbGlrZTogIkdvdCBkYXRhIGZsb3cgYmVmb3JlCisJICBzdHJlYW0tc3RhcnQgZXZlbnQiLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMTQ3NQorCisyMDE0LTA2LTEwIDE1OjMzOjMzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhdm9pZCBsb29waW5nIGluZGVmaW5pdGVseSBpbiBicm9rZW4gc3ZxMyBmaWxlcworCSAgQWJvcnQgaWYgYW4gYXRvbSB3aXRoIHNpemUgMCBpcyByZWFkIGZyb20gd2l0aGluIHRoZSBzdnEzIHN0c2QKKwkgIGF0b21zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI2NTEyCisKKzIwMTQtMDYtMTAgMTA6NTI6MjMgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBmbGFjZGVjOiBhZGQgY29uc3Qgd2hlcmUgYXBwcm9wcmlhdGUKKworMjAxNC0wNi0wOSAxMDozOToyMCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJICBzcGVleGVuYzogYWRkIG1pc3NpbmcgdmFfZW5kIGluIHZhcmlhZGljIGZ1bmN0aW9uCisJICBDb3Zlcml0eSAxMTM5OTQ0CisKKzIwMTQtMDYtMDkgMTA6MDQ6MzggKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBBdHRlbXB0IHVwc3RyZWFtIHNlZWsgZmlyc3QKKwkgIElmIHdlIGhhdmUgYW4gdXBzdHJlYW0gZWxlbWVudCB0aGF0IGNhbiBoYW5kbGUgdGhlIHNlZWsgKHN1Y2ggYXMKKwkgIHJ0bXBzcmMpLCB0cnkgdG8gZG8gdGhhdCBmaXJzdCBiZWZvcmUgYXR0ZW1wdGluZyBpdCBvdXJzZWxmLgorCisyMDE0LTA2LTA0IDExOjM0OjI3ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogZG8gbm90IGluY2x1ZGUgY29kZWNfZGF0YSBvbiByYXcgYXVkaW8gY2FwcworCSAgSWYgdGhlIHdhdiBoZWFkZXIgY29udGFpbnMgYW4gZXh0ZW5kZWQgY2h1bmssIHdlIHdhbnQgdG8ga2VlcAorCSAgdGhlIGNvZGVjX2RhdGEgZmllbGQsIGJ1dCBub3QgZm9yIHJhdyBhdWRpby4KKwkgIFRoaXMgZml4ZXMgc29tZSBlbGVtZW50cyAoc3VjaCBhcyBhZGRlcikgZnJvbSBmYWlsaW5nIHRvIGludGVyc2VjdAorCSAgcmF3IGF1ZGlvIGNhcHMgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGJlIGludGVyc2VjdGFibGUuCisKKzIwMTQtMDYtMDUgMDk6Mzg6MjkgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBRdWVyeSBkdXJhdGlvbiB1cHN0cmVhbSBmaXJzdAorCSAgVXBzdHJlYW0gZWxlbWVudHMgKGxpa2UgcnRtcHNyYykgbWlnaHQgYmUgYWJsZSB0byBwcm92aWRlIHRoZSBkdXJhdGlvbgorCSAgbW9yZSBhY2N1cmF0ZWx5IHRoYW4gZmx2ZGVtdXguIEVzcGVjaWFsbHkgd2l0aCBpbmRleC1sZXNzIHZvZCBmaWxlcworCisyMDE0LTA1LTMwIDE5OjM3OjU3IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogQ2xlYW51cCBwb2xsIG1ldGhvZCBhbmQgcmV0cnkgb24gRUlOVFIvRUFHQUlOCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMxMDE1CisKKzIwMTQtMDMtMDYgMTY6Mzc6NTEgKzAxMDAgIEphbiBBbGV4YW5kZXIgU3RlZmZlbnMgKGhlZnRpZykgPGphbi5zdGVmZmVuc0BnbWFpbC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBzZXQgUkVTWU5DIGJ1ZmZlciBmbGFnIHdoZW4gYnJpZGdpbmcgbGFyZ2UgUFRTIGdhcHMKKwkgIFNvIGRvd25zdHJlYW0gZ2V0cyBub3RpZmllZCB3aGVuIHRoaXMgaGFwcGVucy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjU5MDMKKworMjAxNC0wNi0wMyAxNzo1OTozMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwcnR4LmM6CisJICBydHBydHg6IFJlc2V0IHN0YXRlIG9uIGVhY2ggaXRlcmF0aW9uCisJICBPdGhlcndpc2UgaXQgZGlkbid0IHdhaXQgZm9yIHRoZSB0ZXN0IHRvIGZpbmlzaCBiZWZvcmUgY2hlY2tpbmcgdGhlIHJlc3VsdHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI4NTAxCisKKzIwMTQtMDUtMDkgMTQ6MjI6NDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWF0cm9za2FkZW11eDogZG9uJ3QgbGVhayBkb2N0eXBlIHN0cmluZyBpbiBlcnJvciBjb2RlIHBhdGgKKwkgIENJRCAxMjEyMTQ1LgorCisyMDE0LTA1LTIwIDA4OjIwOjQyICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkgIHZwOWVuYzogRG9uJ3QgZGVyZWZlcmVuY2UgTlVMTCBjaGVja3MKKwkgIENJRCAjMTE5NzcwMworCisyMDE0LTA1LTIwIDA4OjIzOjA2ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDhlbmMuYzoKKwkgIHZwOGVuYzogRG9uJ3QgZGVyZWZlcmVuY2UgTlVMTCB2YXJpYWJsZQorCSAgQ0lEICMxMTM5ODM4CisKKzIwMTQtMDUtMzAgMTQ6MzI6NDIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHVwc3RyZWFtIGhhbmRsZXMgc2VlayBpZiBmcmFnbWVudGVkIGFuZCBvbiB0aW1lIHNlZ21lbnQKKwkgIE90aGVyd2lzZSB3ZSBjYW4gcmVqZWN0IHNlZWtzIG9uIGxvY2FsIGZpbGVzIHRoYXQgY29udGFpbiBmcmFnbWVudGVkLWxpa2UKKwkgIGF0b21zIGxpa2UgJ212ZXgnLiBBbHNvIGltcHJvdmUgYSBtZXNzYWdlIGxvZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMDcyMgorCisyMDE0LTA1LTMwIDE2OjQzOjQ0ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIGgyNjRkZXBheTogbWFrZSBzdXJlIHdlIGNhbGwgaGFuZGxlX25hbCBmb3IgZWFjaCBOQUwKKwkgIENhbGwgaGFuZGxlX25hbCBmb3IgZWFjaCBOQUwgaW4gdGhlIFNUQVAtQSBSVFAgcGFja2V0LiBUaGlzIG1ha2VzCisJICBzdXJlIHdlIGNvcnJlY3RseSBleHRyYWN0IHRoZSBTUFMgYW5kIFBQUy4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzA5OTkKKworMjAxNC0wNS0wNyAxNDowOTowNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmg6CisJICBzb3VwaHR0cHNyYzogQWRkIGN1c3RvbSBzdGlja3kgZXZlbnQgdG8gY29udGFpbiB0aGUgSFRUUCByZXF1ZXN0IGFuZCByZXNwb25zZSBoZWFkZXJzCisJICBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gZS5nLiBnZXQgY29va2llIGluZm9ybWF0aW9uIGRvd25zdHJlYW0uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI5NzA3CisKKzIwMTQtMDUtMjYgMTk6NDc6MzkgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogcmVtb3ZlIHN0cmVhbSBsYXN0IGZsb3cgcmV0dXJuCisJICBHc3RQYWQgYWxyZWFkeSBzdG9yZXMgdGhhdCBpbmZvcm1hdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwOTIyNAorCisyMDE0LTA1LTI2IDE5OjM3OjQ2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiByZW1vdmUgbGFzdCBmbG93IHJldHVybiBmcm9tIHN0cmVhbSBzdHJ1Y3QKKwkgIEl0IGlzIGFscmVhZHkgc3RvcmVkIG9uIEdzdFBhZCBvbiBjb3JlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA5MjI0CisKKzIwMTQtMDUtMjYgMTk6MTk6NDUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4Lmg6CisJICBmbHZkZW11eDogVXNlIEdzdEZsb3dDb21iaW5lcgorCSAgVXNlIHRoZSBmbG93IGNvbWJpbmVyIHRvIGhhdmUgdGhlIHN0YW5kYXJkIGNvbWJpbmF0aW9uIHJlc3VsdHMgYW5kIGF2b2lkCisJICByZXBlYXRpbmcgdGhlIHNhbWUgY29kZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwOTIyNAorCisyMDE0LTA1LTI2IDEzOjIxOjI1IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYWRlbXV4OiB1c2UgR3N0Rmxvd0NvbWJpbmVyCisJICBVc2UgdGhlIGZsb3cgY29tYmluZXIgdG8gaGF2ZSB0aGUgc3RhbmRhcmQgY29tYmluYXRpb24gcmVzdWx0cyBhbmQgYXZvaWQKKwkgIHJlcGVhdGluZyB0aGUgc2FtZSBjb2RlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA5MjI0CisKKzIwMTQtMDUtMjYgMTM6MDQ6MTAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogdXNlIEdzdEZsb3dDb21iaW5lcgorCSAgUmVtb3ZlcyBmbG93IHJldHVybiBjb21iaW5hdGlvbiBjb2RlIHRvIHVzZSB0aGUgbmV3bHkgYWRkZWQgR3N0Rmxvd0NvbWJpbmVyCisKKzIwMTQtMDUtMjMgMTc6NTM6MDAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5oOgorCSAgcXRkZW11eDogdXNlIEdzdEZsb3dDb21iaW5lcgorCSAgUmVtb3ZlcyB0aGUgY29tbW9uIGNvZGUgdG8gY29tYmluaW5nIGZsb3cgcmV0dXJucyB0byBsZXQgaXQgYmUKKwkgIGhhbmRsZWQgYnkgY29yZSBnc3R1dGlscycgR3N0Rmxvd0NvbWJpbmVyCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA5MjI0CisKKzIwMTQtMDUtMjYgMTA6NTk6NTUgLTA0MDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMnNpbms6IGltcGxlbWVudCBnc3R2aWRlb3Npbmsuc2hvd19mcmFtZSBpbnN0ZWFkIG9mIGdzdGJhc2VzaW5rLnJlbmRlcgorCSAgSXQgYWxsb3dzIHRvIHNob3cgcHJlcm9sbCBmcmFtZS4gRXNwZWNpYWxseSBpdCBhbGxvd3MgdG8gdXBkYXRlIHRoZQorCSAgZnJhbWUgd2hlbiBzZWVraW5nIGluIFBBVVNFRCBzdGF0ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjIzMDMKKworMjAxNC0wNS0yNiAxMDo1OTowNiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMnNpbms6IENsZWFudXAgb2xkIHBhZCBhbGxvYyBkZWNsYXJhdGlvbgorCisyMDE0LTA1LTI2IDEyOjM0OjQyIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IENvcHkgYWxyZWFkeSBxdWV1ZWQgYnVmZmVyCisJICBUaGlzIGlzIHJlcXVpcmVkIGFzIGR1cmluZyBwcmVyb2xsIHdlIHBhc3MgdGhlIGZpcnN0IGJ1ZmZlciB0d2ljZSwgaGVuY2UgYWxyZWFkeQorCSAgcXVldWVkLiBJdCBpcyBhbHNvIHVzZWZ1bCwgdG8gYWxsb3cgZmlsdGVycyByZXBsYXlpbmcgYSBwcmV2aW91cyByZW5kZXJlZCBidWZmZXJzLgorCSAgVGhpcyB3aWxsIHJlcXVpcmUgMSBtb3JlIGJ1ZmZlciBpbiBzaW5rIGlmIGxhc3Qtc2FtcGxlIGlzIGVuYWJsZWQsIHNpbmNlIHRoZSBsYXN0CisJICBzYW1wbGUgd2lsbCBub3QgYmUgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnRseSBxdWV1ZWQgYnVmZmVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMjMwMworCisyMDE0LTA1LTI0IDIwOjIwOjA3IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBQb3J0IHRvIGJ1ZmZlcnBvb2wgZmx1c2hfc3RhcnQvc3RvcCBtZXRob2QKKwkgIFBvcnQgdGhlIGJ1ZmZlciBwb29sIHRvIHVzZSB0aGUgbmV3IGZsdXNoX3N0YXJ0L2ZsdXNoX3N0b3AgdmlydHVhbAorCSAgbWV0aG9kcyBhZGRlZCB0byBHc3RCdWZmZXJQb29sLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNzYxMQorCisyMDE0LTA1LTI1IDE3OjQwOjU4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgcG86IHVwZGF0ZQorCisyMDE0LTA1LTI1IDE2OjU0OjE4ICswMjAwICBQaW90ciBEcsSFZyA8cGlvdHJkcmFnQGdtYWlsLmNvbT4KKworCSogcG8vUE9URklMRVMuaW46CisJICBwbzogdXBkYXRlIFBPVEZJTEVTCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI2NTU2CisKKzIwMTQtMDUtMjQgMjM6NTE6NTggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IERvbid0IHF1ZXVlIGFsbCB0aGUgYnVmZmVycyBiZWZvcmUgZGVxdWV1ZWluZyBmaXJzdAorCSAgRm9yIG91dHB1dCBkZXZpY2UsIHdlIHdoZXJlIHF1ZXVpbmcgYWxsIHRoZSBidWZmZXJzLCBhbmQgdGhlbiB3ZSB3b3VsZAorCSAgZGVxdWV1ZSBvbmUuIFRoaXMgbWVhbnMgd2Ugb25seSBoYXZlIDEgYnVmZmVyIGZvciB0aGUgcGlwZWxpbmUsIG5vIG1hdHRlcgorCSAgdGhlIHNpemUgb2YgdGhlIHF1ZXVlLiBJbnN0ZWFkLCBzdGFydCBkZXF1ZXVlZCB3aGVuIG1pbl9sYXRlbmN5IGlzIHJlYWNoZWQuCisJICBFdmVudHVhbGx5LCB0aGlzIHRoZSBtaW5fbGF0ZW5jeSBzaG91bGQgYWxzbyBiZSBhZmZlY3RlZCBieSBjb250cm9sCisJICBNSU5fQlVGRkVSU19GT1JfT1VUUFVUICh1c2UgYnkgZW5jb2RlcnMpLgorCisyMDE0LTA1LTI0IDIzOjQ5OjE5IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogU2ltcGx5IHJlYWQgYmFjayB0aGUgY29uZmlnIHRvIHVwZGF0ZSB0aGUgcXVlcnkKKwkgIEl0J3MgZWFzeSB0byBnZXQgdGhlIG1pbi9tYXggb3V0ZGF0ZSB3aGVuIGhhY2tpbmcgZGVjaWRlIGFsbG9jYXRpb24uIEluCisJICBvcmRlciB0byBhdm9pZCB0aGlzLCBzaW1wbHkgcmVhZCBiYWNrIHRoZSBjaG9vc2VuIHZhbHVlIGZyb20gdGhlIGNvbmZpZy4KKworMjAxNC0wNS0yNCAyMzozMToyNCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogQ2xlYW51cCBhbmQgZml4IGNhbGN1bGF0aW9uIG9mIGxhdGVuY3kKKwkgIENhbGN1bGF0aW9uIG9mIG51bV9idWZmZXJzICh0aGUgbWF4IGxhdGVuY3kgaW4gYnVmZmVycykgd2FzCisJICB1cC1zaWRlLWRvd24uICBJZiB3ZSBjYW4gYWxsY29hdGUsIHRoZW4gb3VyIG1heGltdW0gbGF0ZW5jeSBtYXRjaAorCSAgcG9vbCBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJzLiBBbHNvIHJlbmFtZWQgaXQgdG8gbWF4IGxhdGVuY3kuIEZpbmFsbHkKKwkgIGludHJvZHVjZWQgYSBtaW5fbGF0ZW5jeSBmb3IgY2xhcml0eS4KKworMjAxNC0wNS0yNCAyMDowMDoxNCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICBSZXZlcnQgInY0bDJidWZmZXJwb29sOiBQb3J0IHRvIGJ1ZmZlcnBvb2wgZmx1c2hfc3RhcnQvc3RvcCBtZXRob2QiCisJICBUaGlzIHJldmVydHMgY29tbWl0IDJlMGZiNDJlODY4ZmM5ZjZkOThiMDI4ZGVmODBhM2U5NTM1MjczMDcuCisJICBDb25mbGljdHM6CisJICBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmMKKwkgIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmMKKwkgIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jCisKKzIwMTQtMDUtMjQgMTg6NTY6MzIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBGaXggY29uZmlndXJhdGlvbiBvZiBvdGhlcl9wb29sIGFuZCBpbXBvcnRhdGlvbiBjYXNlCisJICBGaXggdGhlIGNob2ljZSBvZiBtaW4vbWF4LCBkb24ndCBvdmVycmlkZSB0aGUgbWluL21heCB3aXRoIG93biBwb29sIHNlbGVjdGVkCisJICBzaXplLCBjb3JyZWN0IG90aGVyX3Bvb2wgaXNfYWN0aXZlIGNoZWNrLCBzdGFydCBmcm9tIG90aGVyX3Bvb2wgY29uZmlnIHdoZW4KKwkgIGNvbmZpZ3VyaW5nIHRoZSBvdGhlciBwb29sIGFuZCBmaW5hbGx5IHZhbGlkYXRlIHRoZSBjb25maWd1cmF0aW9uLgorCisyMDE0LTA1LTI0IDE4OjQ1OjMwIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogVXNlIHByb3Bvc2VkIGFsbG9jYXRvciBhcyBkZWZhdWx0CisKKzIwMTQtMDUtMjQgMTg6NDM6MjggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IEZpeCBVU0VSUFRSIG1hcCBmbGFncworCSAgV2UgbmVlZCB0byBtYXAgUkVBRCBvbmx5IGZvciBvdXRwdXQgYW5kIHdyaXRlIG9ubHkgZm9yIGNhcHR1cmUsIHdlIHdoZXJlCisJICBkb2luZyB0aGUgb3Bwb3NpdGUuIFRoaXMgZml4aW5nIFVTRVJQVFIgd2l0aCBnbGltYWdlc2luaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMDY5OAorCisyMDE0LTA1LTI0IDExOjE2OjM1IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwYXJzZSB0a2hkIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBhbmQgYWRkIHRhZ3MgaWYgYXBwcm9wcmlhdGUKKwkgIEhhbmRsZSB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IGNhc2VzIHdoZXJlIHRoZXJlIGFyZSBvbmx5IHNpbXBsZSByb3RhdGlvbnMKKwkgICg5MCwgMTgwIG9yIDI3MCBkZWdyZWVzKSBhbmQgdXNlIGEgdGFnIGZvciB0aG9zZSBjYXNlcy4gVGhpcyBpcyBhIGNvbW1vbiBzY2VuYXJpbworCSAgd2hlbiByZWNvcmRpbmcgd2l0aCBtb2JpbGUgZGV2aWNlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3OTUyMgorCisyMDE0LTA1LTIzIDE5OjEwOjIxIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogUHJldmVudCBudW1fcXVldWVkIGZyb20gZ29pbmcgbmVnYXRpdmUKKworMjAxNC0wNS0yMyAxODoyNTo0OSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogZG9uJ3Qgc3RvcCBpZiBsb29wIHJldHVybmVkIEZMVVNISU5HCisJICBUaGUgZGVjb2RlaW5nIHRocmVhZCByZXR1cm5pbmcgZmx1c2hpbmcgaXNuJ3QgYW4gZXJyb3IsIHdlIHNob3VsZCBzaW1wbHkKKwkgIHRyeSBzdGFydGluZyB0aGUgdGFzayBhZ2Fpbi4gSWYgaXQncyBhY3R1YWxseSBmbHVzaGluZywgaXQgd2lsbCBzdG9wIGFnYWluIGJ5IGl0c2VsZi4KKworMjAxNC0wNS0yMyAxNzo1NDoyMCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogSGFuZGxlIGVhcmx5IHRhc2sgc3RvcAorCisyMDE0LTA1LTIzIDE3OjI4OjEzIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBIYW5kbGUgZ3N0X3BhZF9zdGFydF90YXNrKCkgZmFpbHVyZQorCisyMDE0LTA1LTIzIDE3OjE5OjA3IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBBZGQgdHJhY2UgZm9yIEZMVVNIX1NUQVJUL1NUT1AgaGFuZGxpbmcKKworMjAxNC0wNS0yMyAxNzoxODoxNiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogRml4IHVzZSBvZiBhdG9taWMgdmFsdWUKKworMjAxNC0wNS0yMyAxNzowMTo1MyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IEltcHJvdmUgZGVidWdnaW5nCisJICBObyBuZWVkIHRvIHVzZSBvYmotPmVsZW1lbnQsIHRoZSBwb29sIG5vdyBoYXZlIGEgc2lnbmlmaWNhbnQgbmFtZS4gQWxzbyBkb24ndAorCSAgd2FybiBpZiBmbHVzaGluZy4KKworMjAxNC0wNS0yMyAxNzowMTowMiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogRml4IGhhbmRsZV9mcmFtZSBlcnJvciBoYW5kbGluZworCisyMDE0LTA1LTIzIDE1OjU2OjI0IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogQWRkIGEgdHJhY2Ugd2hlbiBfc3RhcnQoKSBpcyBjYWxsZWQKKworMjAxNC0wNS0yMyAxNTo1NjowMiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJICB2NGwyYWxsb2NhdG9yOiBBZGQgZGVidWcgYXNzZXJ0IHRvIGRldGVjdCBjYWxscyBpbiB0aGUgd3Jvbmcgc3RhdGUKKworMjAxNC0wNS0yMyAxNTo1NToyNiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJICB2NGwyYWxsb2NhdG9yOiBSZXNldCBjb3VudCB3aGVuIHN0b3BwZWQKKworMjAxNC0wNS0yMyAxNTo1NTowOCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmFsbG9jYXRvcjogUmV0dXJuIGEgR3N0Rmxvd1JldHVybiBpbnN0ZWFkIG9mIGJvb2xlYW4gaW4gYWxsb2MKKworMjAxNC0wNS0yMyAxNToxNzoyNyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBEb24ndCBsZWFrIGNvbmZpZyBzdHJ1Y3R1cmUKKworMjAxNC0wNS0yMyAxNDoxMjoxMCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IFBvcnQgdG8gYnVmZmVycG9vbCBmbHVzaF9zdGFydC9zdG9wIG1ldGhvZAorCisyMDE0LTA1LTIzIDAzOjAwOjUwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogYWRkIHRhZyBtYXBwaW5ncyBmb3IgX3N3ciwgX21hayBhbmQgX21vZCB0YWdzCisJICBzd3IgLT4gQXBwbGljYXRpb24gbmFtZQorCSAgbWFrIC0+IGRldmljZSBtYW51ZmFjdHVyZXIKKwkgIG1vZCAtPiBkZXZpY2UgbW9kZWwKKworMjAxNC0wNS0yMCAxNzozNzo0OSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSAgeGltYWdlc3JjOiBGaXggeGltYWdlIGxlYWtzIHdoZW4gYnVmZmVyIGhhcyBtb3JlIHRoZW4gb25lIHhpbWFnZQorCSAgRnJvbSB0aW1lIHRvIHRpbWUsIHdoZW4gdGhlIGltYWdlX3Bvb2wgbGlzdCBoYXMgbW9yZSB0aGVuIDEgZWxlbWVudAorCSAgYW5kIEkgc3VwcG9zZSBhdCBzdGFydCwgYWxsIGJ1dCAxIHBvb2xlZCB4aW1hZ2UgYXJlIGxlYWtlZC4gVGhpcyBpcworCSAgZHVlIHRvIGJyb2tlbiBhbGdvcml0aG0gaW4gZ3N0X3hpbWFnZXNpbmtfc3JjX3hpbWFnZV9nZXQoKS4gVGhlcmUgd2FzCisJICBhbHNvIGEgcmlzayBvZiB1c2UgYWZ0ZXIgZnJlZSBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHhpbWFnZSBzaXplIGhhcworCSAgY2hhbmdlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mjg1MDIKKworMjAxNC0wNS0yMSAxMzoyMzoyNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjMuMiA9PT0KKworMjAxNC0wNS0yMSAxMzowNjozNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb21tb246CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0LWJ1aWxkLnN0YW1wOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3Quc3RhbXA6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdnB4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDEuMy4yCisKKzIwMTQtMDUtMjEgMTI6MTk6MzkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2hyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisKKzIwMTQtMDUtMjEgMTA6NTE6MTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSAyMTFmYTVmIHRvIDFmNWQzYzMKKworMjAxNC0wNS0yMCAwODoyMzowNiArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJICB2cDhlbmM6IERvbid0IGRlcmVmZXJlbmNlIE5VTEwgdmFyaWFibGUKKwkgIENJRCAjMTEzOTgzOAorCisyMDE0LTA1LTIwIDA4OjIwOjQyICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkgIHZwOWVuYzogRG9uJ3QgZGVyZWZlcmVuY2UgTlVMTCBjaGVja3MKKwkgIENJRCAjMTE5NzcwMworCisyMDE0LTA1LTE5IDExOjI2OjQ2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IEV4cGxpY2l0bHkgY2FzdCBlbnVtICJzdWJ0eXBlIiB0byBpdHMgInN1cGVydHlwZSIKKwkgIGdzdHY0bDJidWZmZXJwb29sLmM6NjA4OjE4OiBlcnJvcjogaW1wbGljaXQgY29udmVyc2lvbiBmcm9tIGVudW1lcmF0aW9uIHR5cGUKKwkgICdlbnVtIF9Hc3RWNGwyQnVmZmVyUG9vbEFjcXVpcmVGbGFncycgdG8gZGlmZmVyZW50IGVudW1lcmF0aW9uIHR5cGUKKwkgICdHc3RCdWZmZXJQb29sQWNxdWlyZUZsYWdzJyBbLVdlcnJvciwtV2VudW0tY29udmVyc2lvbl0KKwkgIHBhcmFtcy5mbGFncyA9IEdTVF9WNEwyX1BPT0xfQUNRVUlSRV9GTEFHX1JFU1VSRUNUOworCSAgfiBefn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisyMDE0LTA1LTE5IDExOjI0OjA2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZ29vbS90ZW50YWNsZTNkLmM6CisJICBnb29tOiBVc2UgZmFicygpIGluc3RlYWQgb2YgYWJzKCkgdG8gY2FsY3VsYXRlIHRoZSBmbG9hdGluZyBwb2ludCBhYnNvbHV0ZSB2YWx1ZQorCSAgdGVudGFjbGUzZC5jOjI2ODo3OiBlcnJvcjogdXNpbmcgaW50ZWdlciBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnYWJzJyB3aGVuCisJICBhcmd1bWVudCBpcyBvZiBmbG9hdGluZyBwb2ludCB0eXBlIFstV2Vycm9yLC1XYWJzb2x1dGUtdmFsdWVdCisJICBpZiAoYWJzICh0bXAgLSBmeF9kYXRhLT5yb3QpID4gYWJzICh0bXAgLSAoZnhfZGF0YS0+cm90ICsgMi4wICogR19QSSkpKSB7CisJICBeCisKKzIwMTQtMDUtMTkgMTE6MjE6MzYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Rlc3RzLmM6CisJICBkZWJ1Z3V0aWxzOiBQcm9wZXJseSBjYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2Ugd2l0aCB1bnNpZ25lZCB0eXBlcworCSAgdGVzdHMuYzoxNjE6MTY6IGVycm9yOiB0YWtpbmcgdGhlIGFic29sdXRlIHZhbHVlIG9mIHVuc2lnbmVkIHR5cGUKKwkgICd1bnNpZ25lZCBsb25nJyBoYXMgbm8gZWZmZWN0IFstV2Vycm9yLC1XYWJzb2x1dGUtdmFsdWVdCisJICB0LT5kaWZmICs9IGxhYnMgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpIC0gdC0+ZXhwZWN0ZWQpOworCisyMDE0LTA1LTE2IDE3OjQ2OjMwIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBIYW5kbGUgZmx1c2ggd2hpbGUgaW4gc3RhcnRfc3RyZWFtaW5nCisJICBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhIGZsdXNoIG9jY3VyZSB3aGlsZSB0aGUgc3RyZWFtaW5nCisJICB0aHJlYWQgaXMgYmVpbmcgYnJvdWdodCB1cC4gSW4gdGhpcyBjYXNlLCB0aGUgZmx1c2hpbmcgc3RhdGUgb2YgdGhlIHBvbGwKKwkgIG9iamVjdCBpcyBjbGVhcmVkLiBUbyBzb2x2ZSB0aGlzLCB3ZSBzaW1wbHkgc2V0IHRoZSBjYXB0dXJlIHBvbGwgdG8gZmx1c2hpbmcKKwkgIGFnYWluLCB0aGlzIHdheSB3ZSBrbm93IHRoZSB0aHJlYWQgd2lsbCBleGl0LiBUaGUgZGVjb2RlciBzdHJlYW1sb2NrCisJICBpcyB1c2VkIHRvIHN5bmNocm9uaXplIHdpdGggaGFuZGxlIGZyYW1lLgorCisyMDE0LTA1LTE2IDE2OjQ0OjM3IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuYzoKKwkgIHY0bDJhbGxvY2F0b3I6IERvbid0IHRyYWNlIHR3aWNlIHRoZSBzYW1lIG1lc3NhZ2UKKworMjAxNC0wNS0xNSAxMToyNTo1MCAtMDcwMCAgQWxlaXggQ29uY2hpbGxvIEZsYXF1w6kgPGFsZWl4QG9ibG9uZy5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGFsd2F5cyB1c2UgYSByYW5kb20gc3NyYyBmb3IgdGhlIGludGVybmFsIHNlc3Npb24KKwkgIFVzZSBhIHJhbmRvbSBTU1JDIGRpZmZlcmVudCB0aGFuIDAgZm9yIHRoZSBpbnRlcm5hbCBzZXNzaW9uIFNTUkMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMwMjEyCisKKzIwMTQtMDUtMTYgMTY6NTI6MjUgKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiB1cGRhdGUgbGFzdF9hY3Rpdml0eSB3aGVuIHNlbmRpbmcgUlRQCisJICBBbHNvIHVwZGF0ZSBsYXN0X2FjdGl2aXR5IHdoZW4gZG9pbmcgc29tZXRoaW5nIHdpdGggdGhlIGludGVybmFsCisJICBzb3VyY2UgdG8gbWFrZSBzdXJlIGRvbid0IHRpbWVvdXQgZWFybHkuCisJICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMDIxNworCisyMDE0LTA1LTE1IDE4OjA4OjUzIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMjogQ2xlYW51cCBNMk0gcHJvcGVydGllcworCSAgTTJNIGRldmljZXMgd2VyZSBzaGFyaW5nIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgc3JjIGFuZCBzaW5rLiBNb3N0IG9mCisJICB0aGVzZSBtYWRlIG5vIHNlbnNlLiBUaGlzIHBhdGNoIHJlZHVjZXMgdGhlIG51bWJlciBvZiBwcm9wZXRpZXMgYW5kCisJICBtYWtlcyBpby1tb2RlIGNsZWFyZXIgYnkgaGF2aW5nIGNhcHR1cmUtaW8tbW9kZSBhbmQgb3V0cHV0LWlvLW1vZGUuIFRoaXMKKwkgIGFsc28gYWNjaWRlbnRseSBmaXhlZCBhIGJ1ZyBpbiBnc3R2NGwydHJhbnNmb3JtIGlvLW1vZGUgY29kZSwgd2hlcmUgdGhlCisJICBjYXB0dXJlIGlvLW1vZGUgY291bGQgbm90IGJlIHNldC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mjk1OTEKKworMjAxNC0wNS0xNSAxNzozOTozOSArMDIwMCAgQmVuamFtaW4gR2FpZ25hcmQgPGJlbmphbWluLmdhaWduYXJkQGxpbmFyby5vcmc+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogVXBkYXRlIHBvb2wgbGltaXQgd2l0aCBoYXJkd2FyZSByZXF1aXJlbWVuc3QKKwkgIElmIHRoZSBkcml2ZXIgbmVlZCBtb3JlIGJ1ZmZlcnMgdGhhbiByZXF1ZXN0ZWQgYnkgdGhlIGNvbmZpZywKKwkgIHVwZGF0ZSB0aGUgcG9vbCBtaW4vbWF4IHZhbHVlcy4gVGhlIG1pbmltdW0gdmFsdWUgZm9yIHRoZSBwb29sCisJICBjb3VsZCBiZSBwcm92aWRlZCBlaXRoZXIgYnkgdGhlIGRyaXZlciBvciBieSB0aGUgcG9vbC4gVGhpcyBpcworCSAgYmVzdCBlZmZvcnQgZm9yIGRyaXZlcnMgdGhhdCBkb24ndCBzdXBwb3J0CisJICBDSUQgVjRMMl9DSURfTUlOX0JVRkZFUlNfRk9SX0NBUFRVUkUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMwMjAwCisKKzIwMTQtMDUtMTUgMTA6NDQ6MjkgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmM6CisJICB2NGwydmlkZW9kZWM6IEhhbmRsZSBzdGFydF9zdHJlYW1pbmcgZXJyb3IKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzAyMDcKKworMjAxNC0wNS0xNSAxMDozOTo0MCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogUHJpbnQgdGhlIGZsb3cgcmV0dXJuIGNhdXNpbmcgdGhlIGxvb3AgdG8gbGVhdmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzAyMDcKKworMjAxNC0wNS0xNSAxMDozMTo0MCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogRG9uJ3QgbG9jayB0aGUgZGVjb2RlciB3aGVuIHN0b3BwaW5nIHRhc2sKKwkgIFRoYXQgc3JjIHBhZCB0YXNrIG1heSBuZWVkIHRvIHRha2UgdGhlIGxvY2sgd2hlbiBiZWluZyBwdWxsZWQKKwkgIGRvd24uIHRha2VpbmcgdGhhdCBsb2NrIGNhbiBsZWFkIHRvIGEgZGVhZGxvY2suCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMwMjA3CisKKzIwMTQtMDUtMTQgMTc6MTg6NTIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5jOgorCSAgdjRsMnRyYW5zZm9ybTogRG9uJ3QgbGVhayBwb29sIGlmIGFjdGl2YXRpb24gZmFpbGVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMwMjA3CisKKzIwMTQtMDUtMTQgMTc6MTg6MzUgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDI6IFNwbGl0IGZsdXNoIGluIHN0YXJ0L3N0b3Bfc3RyZWFtaW5nCisJICBUaGlzIGFsbG93IGNhbGxpbmcgc3RhcnQgc3RyZWFtaW5nIGxhdGVyIGZvciBjYXB0dXJlIGRldmljZS4gQ3VycmVudGx5IGl0IGJyZWFrcworCSAgaW4gZG1hYnVmLWltcG9ydCBiZWNhdXNlIGRvd25zdHJlYW0gaXMgaG9sZGluZyBhIGJ1ZmZlciB0aGF0IHdpbGwgb25seSBiZQorCSAgcmVsZWFzZWQgYWZ0ZXIgc3RyZWFtLXN0YXJ0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMDIwNworCisyMDE0LTA1LTE0IDE1OjEyOjI2IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IEZsdXNoIGJ1ZmZlciBwb29scyBvbiBmbHVzaCBzdG9wCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMwMjA3CisKKzIwMTQtMDUtMTQgMTM6Mjg6MzEgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogRml4IHVzZSBvZiBhdG9taWMgYWN0aXZlIG1hcmtlcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMDIwNworCisyMDE0LTA1LTE0IDEzOjA1OjQyIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogRG9uJ3QgZGVhY3RpdmF0ZSBvdGhlcnBvb2wKKwkgIFdlIHNob3VsZCBub3Qgc3RvcCB0aGUgb3RoZXJwb29sIHVubGVzcyB3ZSBhbHNvIHN0b3Agb3VyIG93bgorCSAgcG9vbCwgb3RoZXJ3aXNlIGl0IHdpbGwgbmV2ZXIgZ2V0IHJlc3RhcnRlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzAyMDcKKworMjAxNC0wNS0xNCAxMjozMzo1OCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IEFsc28gdXBkYXRlIG51bV9idWZmZXJzIGZvciBpbXBvcnQgY2FzZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzAyMDcKKworMjAxNC0wNS0xNCAxMzo0MjoyNSAtMDcwMCAgQWxlaXggQ29uY2hpbGxvIEZsYXF1w6kgPGFsZWl4QG9ibG9uZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiB1cGRhdGUgcnRwIGVuY29kZXIvZGVjb2RlciBkb2NzCisJICBVc2UgJXUgaW4gUlRQIGVuY29kZXIvZGVjb2RlciBwYWRzIHRvIG1hdGNoIG90aGVyIHJ0cGJpbiBwYWRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMDE0NgorCisyMDEzLTEyLTI3IDExOjU1OjE4ICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBzZXNzaW9uLmM6CisJICB0ZXN0cy9jaGVjazogcnRwc2Vzc2lvbjogdGVzdCBpbnRlcm5hbCBzb3VyY2VzIHRpbWluZyBvdXQKKworMjAxMy0xMi0yNiAxNzozMDo0MiArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogcmVtb3ZlIHVudXNlZCBpZiBicmFuY2gKKwkgIDEpIHNvdXJjZXMgdGhhdCBoYXZlIHNlbnQgQllFIGluIHRoZSBwYXN0IGNhbm5vdCBiZSBzZW5kZXJzLCBzaW5jZQorCSAgdGhleSB3b3VsZCBoYXZlIHRpbWVkIG91dCB0byBiZWluZyByZWNlaXZlcnMgaW4gdGhlIG1lYW50aW1lLi4uCisJICAyKSBzb3VyY2VzIHRoYXQgaGF2ZSBzZW50IEJZRSBhcmUgbm93IGJlaW5nIHJlbW92ZWQgZWFybGllciBpbnNpZGUKKwkgIHRoaXMgZnVuY3Rpb24KKworMjAxMy0xMi0yNiAxNzoyOTo0MiArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogY2xlYW51cCBzb3VyY2VzIHRoYXQgaGF2ZSBzZW50IEJZRQorCisyMDEzLTEyLTI2IDE3OjI0OjUxICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiB1bmlmeSBuZXN0ZWQgaWYgY2xhdXNlcworCisyMDEzLTEyLTI2IDE3OjIxOjQ0ICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiB0aW1lb3V0IGludGVybmFsIHNvdXJjZXMgdGhhdCBhcmUgaW5hY3RpdmUgZm9yIGEgbG9uZyB0aW1lIGFuZCBzZW5kIEJZRQorCisyMDE0LTA1LTEzIDEyOjI1OjA0IC0wNzAwICBBbGVpeCBDb25jaGlsbG8gRmxhcXXDqSA8YWxlaXhAb2Jsb25nLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGRvbid0IHN0b3AgbG9vcGluZyBpZiBldmVudCBmb3VuZCBpbiB0aGUgcXVldWUKKwkgIElmIHdlIGFyZSBpbnNlcnRpbmcgYSBwYWNrZXQgaW50byB0aGUgaml0dGVyIHF1ZXVlIHdlIG5lZWQgdG8ga2VlcAorCSAgbG9vcGluZyB0aHJvdWdoIHRoZSBpdGVtcyB1bnRpbCB0aGUgcmlnaHQgcG9zaXRpb24gaXMgZm91bmQuIEN1cnJlbnRseSwKKwkgIHRoZSBjb2RlIHN0b3BzIGFzIHNvb24gYXMgYW4gZXZlbnQgaXMgZm91bmQgaW4gdGhlIHF1ZXVlLgorCSAgUmVnYXJkaW5nIGV2ZW50cywgd2Ugc2hvdWxkIG9ubHkgbW92ZSBwYWNrZXRzIGJlZm9yZSBhbiBldmVudCBpZiB0aGVyZQorCSAgaXMgYW5vdGhlciBwYWNrZXQgYmVmb3JlIHRoZSBldmVudCB0aGF0IGhhcyBhIGxhcmdlciBzZXFudW0uCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMwMDc4CisKKzIwMTQtMDQtMTcgMTM6MDQ6MDAgKzAwMDAgIEFkcmllbiBTQ0ggPGFkcmllbi5zY2h3YXJ0emVudHJ1YmVyQGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGZpeCB0aGUgbWVtb3J5IGxlYWsgb2YgbGFuZ3VhZ2UgYXR0cmlidXRlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI4NDE4CisKKzIwMTQtMDUtMTMgMTM6NDQ6MjAgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRml4IHJlZ3Jlc3Npb24gaW4gb2Zmc2V0IGV4dHJhcG9sYXRpb24KKwkgIFdoZW4gZXh0cmFwb2xhdGluZyB0aGUgb2Zmc2V0LCB3ZSBuZWVkIHRvIHVzZSB0aGUgZXh0cmFwb2xhdGUKKwkgIHN0cmlkZSByYXRoZXIgdGhlbiB0aGUgYmFzZSBzdHJpZGUuIFRoaXMgc2hvdWxkIGZpeCBzdXBwb3J0IGZvciBmb3JtYXQKKwkgIHdpdGggbW9yZSB0aGVuIHR3byBwbGFuZXMgKEk0MjAsIFk0MkIsIGV0YykuCisKKzIwMTQtMDUtMTIgMTg6MDM6MTggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJICB2NGwyYnVmZmVycG9vbDogVXNlIGRlZmF1bHQgVmlkZW9JbmZvIGZvciBmcmFtZSBvcGVyYXRpb24KKwkgIFdoZW4gZG9pbmcgZnJhbWUgb3BlcmF0aW9uLCB3ZSBuZWVkIHRvIHVzZSB0aGUgZGVmYXVsdCBWaWRlb0luZm8KKwkgIGFuZCBsZXQgdGhlIGZyYW1lIEFQSSByZWFkIHRoZSB2aWRlbyBtZXRhIGluIG9yZGVyIHRvIGdldCB0aGUgc3RyaWRlCisJICBhbmQgb2Zmc2V0IHJpZ2h0LiBDdXJyZW50bHkgd2Ugd2hlcmUgdXNpbmcgdGhlIHNwZWNpYWxpemVkIFZpZGVvSW5mbworCSAgd2hpY2ggcmVmbGVjdHMgd2hhdCB0aGUgSFcgaXMgc2V0dXAgdG8uCisKKzIwMTQtMDUtMTIgMTc6MjM6MTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJzcmM6IG1pbm9yIEdWYWx1ZSBoYW5kbGluZyBvcHRpbWlzYXRpb24gaW4gcHJvYmluZyBjb2RlCisKKzIwMTQtMDUtMTIgMTc6MjA6MTQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJzcmM6IGF2b2lkIGxpc3RzIHdpdGggb25lIHNpbmdsZSBmcmFtZXJhdGUgaW4gcHJvYmVkIGNhcHMKKwkgIFNpbXBsaWZ5IGZyYW1lcmF0ZSBmaWVsZCBpZiBwb3NzaWJsZSwgc28gd2UgZG9uJ3QgZW5kIHVwIHdpdGgKKwkgIGUuZy4gZnJhbWVyYXRlID0gKGZyYWN0aW9uKSB7IDMwLzEgfS4gTWF5YmUgdGhlIGhlbHBlciBmdW5jdGlvbgorCSAgc2hvdWxkIGJlIG1vdmVkIHRvIGNvcmUsIGJ1dCB3ZSBjYW4gZG8gdGhpcyBsYXRlci4KKworMjAxNC0wNS0xMiAxNjo1NjozNSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBGaXggbGVhayBvZiBwYWxldHRlX2RhdGEgaW4gZXJyb3IgY2FzZXMKKwkgIENJRCAjMTIxMjE1MQorCisyMDE0LTA1LTEyIDE2OjUzOjMyICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogRnJlZSBub2RlX2hlYWRlciBpbiBlcnJvciBjYXNlcworCSAgQ0lEICMxMjEyMTM0CisKKzIwMTQtMDUtMTIgMTM6NDY6MDEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogRG9uJ3QgdXNlIFdBUk5JTkcgZm9yIG5vdC1saW5rZWQgZmxvdyByZXR1cm4KKwkgIFBvbGx1dGVzIGRlYnVnIGxvZ3MgZm9yIG5vIHJlYXNvbi4gSXQncyBvbmx5IGFuIGVycm9yIGlmIGFsbCBwYWRzCisJICByZXR1cm4gbm90LWxpbmtlZAorCisyMDE0LTA1LTEyIDEzOjQ1OjA2ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5oOgorCSAgZmx2ZGVtdXg6IFNraXAgdW5rbm93biB0YWdzIGluIHB1c2gtbW9kZQorCSAgV2UgYWRkIGEgbmV3IG1vZGUgKFNLSVApIGluIHB1c2gtbW9kZSB0byBza2lwIHRhZ3MgdGhhdCB3ZSBkb24ndCBrbm93biBhYm91dAorCSAgUGFydGlhbGx5IGZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NzA3MTIKKworMjAxNC0wNS0xMCAwOToxNDozMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogQWRkIHN1cHBvcnQgZm9yIHZhcmlhYmxlIGJsb2NrIHNpemUgZmlsZXMgYW5kIHJlbW92ZSBkZWFkIGNvZGUKKwkgIFRoaXMgZGVhZCBjb2RlIHdhc24ndCB1c2VkIHNpbmNlIHRoZSAxLjAgcG9ydCBhbmQgd291bGQgbmVlZCB0bworCSAgYmUgbW9kaWZpZWQgaGVhdmlseSBmb3IgdmFyaWFibGUgYmxvY2sgc2l6ZSBzdXBwb3J0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyOTg5NAorCisyMDE0LTA1LTA5IDEyOjE0OjIzIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5jOgorCSAgdjRsMnRyYW5zZm9ybTogRml4IE5VTEwgY2hlY2sgY29weSBwYXN0ZSBlcnJvcgorCSAgQ0lEIDEyMTIxMjkKKworMjAxNC0wNS0wOSAxMjoxMTo1NCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IEZpeCBwb3RlbnRpYWwgZGVhZGxvY2sgZHVlIHRvIG1pc3NpbmcgYnJlYWsKKwkgIENJRCAxMjEyMTMxCisKKzIwMTQtMDUtMDkgMTg6MDE6MjggKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBpbmNyZW1lbnQgYWNjZXB0ZWQgcGFja2V0cyBhZnRlciBsb3NzCisJICBXaGVuIHdlIGRldGVjdCBhIGxvc3QgcGFja2V0LCBleHBlY3QgcGFja2V0cyB3aXRoIGhpZ2hlcgorCSAgc2VxbnVtIG9uIHRoZSBpbnB1dC4KKwkgIEFsc28gdXBkYXRlIHRoZSB1bml0IHRlc3QuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI5NTI0CisKKzIwMTQtMDUtMDQgMTE6MTI6NTQgLTA2MDAgIEphc29uIExpdHppbmdlciA8amxpdHppbmdlcmRldkBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICBBZGQgbmV3IHRlc3QgY2FzZS4KKworMjAxNC0wNS0wOSAxNjoxNDoyMSArMDIwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NoYXBld2lwZS5jOgorCSAgc2hhcGV3aXBlOiBubyBuZWVkIHRvIGFjdGl2YXRlIHBhZHMKKwkgIEFjdGl2YXRpb24gd2lsbCBoYXBwZW4gaW4gdGhlIHN0YXRlIGNoYW5nZQorCisyMDE0LTA1LTA5IDEyOjEwOjA0IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRG9uJ3QgbGVhayBjb25maWcgc3RydWN0dXJlCisJICB0aGlzIGZpeGVzIGEgbGVhayBvZiB0aGUgY29uZmlnIHN0cnVjdHVyZSBhbmQgdGFrZSBjYXJlIG9mIG1ha2luZyBzdXJlCisJICBjYXBzIGNhbid0IHJlYWNoIHJlZiAwIGJlZm9yZSB3ZSBhcmUgZG9uZSBkb2luZyBvdXIgY2hlY2suCisJICBDSUQgMTIxMjE0NAorCisyMDE0LTA1LTA5IDEyOjA4OjExIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogUmVtb3ZlIHVuZWVkZWQgY2FzdCBmb3IgY29kZSBjbGFyaXR5CisKKzIwMTQtMDUtMDkgMTE6NTY6NTIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMnBvb2w6IEZpeCBsZWFrIG9mIGNvbmZpZyBzdHJ1Y3R1cmUgaW4gZXJyb3IgY2FzZQorCSAgQ0lEcyAxMjEyMTY3IGFuZCAgMTIxMjE2NworCisyMDE0LTA1LTA5IDExOjUxOjI2IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRml4IHVzZSBvZiB1bml0aWxpemVkIHBvb2wgcG9pbnRlcgorCSAgQ0lEICMxMjEyMTczCisKKzIwMTQtMDUtMDkgMTY6NDg6NTggKzAyMDAgIEVyaWMgVHJvdXNzZXQgPGV0cm91c3NldEBhd294LmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBkb24ndCByZXNwb25kIHRvIGEgcG9zaXRpb24gcXVlcnkgaW4gQllURSBmb3JtYXQgd2l0aCBhIFRJTUUgcG9zaXRpb24KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mjk1NTMKKworMjAxNC0wNS0wOSAxNDoyMjo0MiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYWRlbXV4OiBkb24ndCBsZWFrIGRvY3R5cGUgc3RyaW5nIGluIGVycm9yIGNvZGUgcGF0aAorCSAgQ0lEIDEyMTIxNDUuCisKKzIwMTQtMDUtMDYgMTM6Mzc6NDcgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBSZWFkYmFjayBwb29sIGNvbmZpZyBpZiB1c2VkIHdpdGhpbiB0aGUgYmFzZWNsYXNzCisKKzIwMTQtMDUtMDYgMTI6NTg6NTkgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMjogUmVwbGFjZSBtaXNzLXVzZSBvZiBjcm9wIG1ldGEgaW4gZmF2b3VyIG9mIHByb3BlciBvZmZzZXQKKwkgIFRoaXMgbW92ZXMgYXdheSBmcm9tIGNvcHlpbmcgaW5mb3JtYXRpb24gYW5kIHN0b3JlIGV2ZXJ5dGhpbmcgaW5zaWRlCisJICB0aGUgR3N0VmlkZW9JbmZvIHN0cnVjdHVyZS4gVGhlIGFsaWduZW1lbnQgZXhwb3NlZCBieSB2NGwyIGFwaQorCSAgaXMgbm93IGhhbmRsZWQgdXNpbmcgcHJvcGVyIG9mZnNldC4KKworMjAxNC0wNS0wNiAxMjo1NTozMCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIHY0bDJvYmplY3Q6IFN0eWxlIGZpeAorCisyMDE0LTA1LTA1IDEyOjM4OjMzIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogUmVzZXQgaW1wb3J0ZWQgYnVmZmVyIHNpemUgd2l0aCBleHBlY3RlZCBzaXplCisJICBUaGlzIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgcG9vbCB3b24ndCBhbHdheXMgZGlzY2FyZCBidWZmZXIgd2l0aCB0aGVzZQorCSAgbWVtb3J5IHdoZW4gdGhleSBhcmUgcmVsZWFzZWQuCisKKzIwMTQtMDUtMDUgMTI6Mzc6NDMgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJICB2NGwyYWxsb2NhdG9yOiBSZXNldCBmbHVzaGVkIGdyb3VwCisJICBUaGlzIGVuc3VyZSB0aGF0IGEgZmx1c2hlZCBncm91cCBtZW1vcnkgYXJlIHRoZSBzYW1lIHNpemUgYXMgd2hlbiB0aGV5CisJICB3aGVyZSBvcmlnaW5hbGx5IGFsbG9jYXRlZCAvIGltcG9ydGVkLgorCisyMDE0LTA1LTA1IDEyOjA3OjMxIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJICB2NGwyYnVmZmVycG9vbDogR2V0IG51bWJlciBvZiBhbGxvY2F0ZWQgYnVmZmVycyBmcm9tIGFsbG9jYXRvcgorCSAgVGhlIHZhbHVlIG9mIG51bV9hbGxvY2F0ZWQgYnVmZmVyIHdvdWxkIGdldCBjb25mdXNlZCB3aGVuCisJICBidWZmZXIgYXJlIGJlaW5nIGRpc2NhcmRlZC4KKworMjAxNC0wNS0wNSAxMjowNjo0NCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuaDoKKwkgIHY0bDJhbGxvY2F0b3I6IEFkZCBhIG1ldGhvZCB0byByZWFkIG51bWJlciBvZiBhbGxvY2F0ZWQgZ3JvdXAKKworMjAxNC0wNS0wNCAyMDoyMzo0MiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogSW1wcm92ZSBkZWJ1Z2dpbmcKKworMjAxNC0wNS0wNCAxOTo1MTo0OCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IEVuc3VyZSB3ZSBkb24ndCByZS1lbnF1ZXVlIGJ1ZmZlciBkdXJpbmcgZmx1c2gKKworMjAxNC0wNS0wNCAxOToxMzozNyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IEluaXRpbGlhbGl6ZSBkZWJ1ZyBjYXRlZ29yeQorCisyMDE0LTA1LTA0IDE2OjExOjA5IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogRml4IGxpYnY0bDIgc3VwcG9ydAorCSAgTmVlZCB0byBpbmNsdWRlIGNvbmZpZy5oLCBvdGhlcndpc2Ugd2UgZW5kdXAgZGlyZWN0bHkgdXNpbmcgdGhlCisJICBpb2N0L21tYXAvbXVubWFwIGNhbGxzIGFuZCBuZWVkIHRvIHZhbGwgdjRsMl9tdW5tYXAuCisKKzIwMTQtMDUtMDEgMTM6MDQ6MDggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogU2V0IHRoZSBmbGFncyBvbiB0aGUgb2JqZWN0CisJICBXZSB3aGVyZSBub3Qgc2V0dGluZyB0aGUgcHJvYmVkIGZsYWdzIG9uIHRoZSBhbGxvY2F0b3IsIHdoaWNoIG1lYW4gZXZlbiBpZgorCSAgQ1JFQVRFX0JVRlMgd2FzIHN1cHBvcnRlZCBvbiBzb21lIGRyaXZlciwgaXQgd291bGQgZW5kdXAgYmVpbmcgaWdub3JlZC4KKworMjAxNC0wNC0yOSAxNjo0OTo1MiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IFJlLWVucXVldWUgYnVmZmVyIGF0IHN0cmVhbSBzdGFydAorCisyMDE0LTA0LTI5IDE2OjA2OjAwIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuYzoKKwkgIHY0bDJhbGxvY2F0b3I6IFRoZXJlIGlzIG5vdCBncm91cCBvbiBlcnJvcgorCisyMDE0LTA0LTI5IDE0OjU2OjMxIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IEhhbmRsZSBGTFVTSF9TVE9QIGV2ZW50CisKKzIwMTQtMDQtMjkgMTM6MDU6NDEgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmM6CisJICB2NGwyYnVmZmVycG9vbDogQWNxdWlyZSBjYW5ub3QgcmV0dXJuIGEgYnVmZmVyIGZyb20gYW5vdGhlciBwb29sCisJICBSZXR1cm4gYSBidWZmZXIgZnJvbSBhbiBvdGhlcnBvb2wgaGFzIHVud2FudGVkIHNpZGUgZWZmZWN0cyB0aGF0IGxlYWQgdG8gbGVha3MgYW5kCisJICBwcmV2ZW50cyBkZWFjdGl2YXRpbmcgdGhlIHBvb2wuIEluc3RlYWQsIHdlIGNoYW5nZSB0aGUgX3Byb2Nlc3MoKSBBUEkgc28gaXQgY2FuCisJICByZXBsYWNlIHRoZSBpbnRlcm5hbCBidWZmZXIgd2l0aCB0aGUgYnVmZmVyIGZyb20gdGhlIGRvd25zdHJlYW0gcG9vbC4gVGhpcyBpbXBsaWVkCisJICBtb3ZpbmcgZnJvbSBfZmlsbCgpIHRvIF9jcmVhdGUoKSBtZXRob2QgaW4gdGhlIHNyYy4KKworMjAxNC0wNC0yOSAxMzowMDozMiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IFJlbW92ZSB1bnJlYWNoZWQgYWNxdWlyZSBjb2RlCisJICBUaGUgYWNxdWlyZSBpcyBkb25lIGluIF9wcmVwYXJlIG5vdy4KKworMjAxNC0wNC0yOSAxMjo1NzowOCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IFNhbmV0aXplIGJ1ZmZlciByZWZvdW50IGhhbmRsaW5nCisJICBCdWZmZXIgcmVmY291bnRpbmcgaXMgYSBiaXQgaGFyZCwgYmVjYXVzZSBvZiB0aGUgZHVhbGl0eSBiZXR3ZWVuIENBUFRVUkUgYW5kCisJICBPVVRQVVQgbW9kZS4gSW4gdGhlIGxvbmcgdGVybSwgd2Ugc2hvdWxkIGNvbnNpZGVyIGhhdmluZyB0d28gc2VwZXJhdGUgcG9vbAorCSAgaW5zdGVhZCBvZiB0aGlzIG1lc3MuIEF0IGxlYXN0IHN0YXRlIHNob3VsZCBiZSBiZXR0ZXIga2VwdCB0aGlzIHdheS4KKworMjAxNC0wNC0yOSAxMjo0ODowNCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJICB2NGwydHJhbnNmb3JtOiBBZGQgbW9yZSB0cmFjZXMKKworMjAxNC0wNC0yOCAwODo0ODoyNiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmg6CisJICB2NGwyLWFsbG9jYXRvcjogQWRkIFMgdG8gUkVRQlVGUy9DUkVBVEVfQlVGUyBlbnVtCisJICBBbGwgZW51bSB0aGF0IGhhcyBSRVFCVUZTIGFuZCBDUkVBVEVfQlVGUyB3aGVyZSBtaXNzaW5nIFMsIHdoaWNoIHdhcworCSAgY29uZnVzaW5nIHNpbmNlIHRoZXkgYXJlIHN1cHBvc2VkIHRvIG1hdGNoIHdpdGggYXNzb2NpY2F0ZWQgaW9jdGwgbmFtZS4gVGhpcworCSAgYWxzbyBmaXhlcyB0aGUgeWV0IHVudXNlZCBDQU5fUkVRVUVTVCBmbGFnIGNoZWNrLgorCisyMDE0LTA0LTE4IDE3OjUxOjA3IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IEVuYWJsZWQgUW9TCisKKzIwMTQtMDQtMTggMTc6MDI6NTAgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IEZpeHVwIFVTRVJQVFIvRE1BQlVGIGNhcHR1cmUgc3VwcG9ydAorCisyMDE0LTA0LTE4IDE0OjQ1OjAwIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IEltcHJvdmUgc2VsZWN0b24gb2YgbWluL21heCBpbiBkZWNpZGUgYWxsb2NhdGlvbgorCisyMDE0LTA0LTE4IDEzOjA5OjAwIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogVXBkYXRlIGNvbmZpZyBpZiBtZXRhIGlzIG1pc3NpbmcKKwkgIFJhdGhlciB0aGVuIGhhcmQgZmFpbHVyZSwgd2Ugc2hvdWxkIHVwZGF0ZSB0aGUgY29uZmlnIHdpdGggdGhlIG1ldGEgb3B0aW9uIHdlCisJICBuZWVkIGFuZCByZXR1cm4gZmFsc2UuCisKKzIwMTQtMDQtMTEgMTc6MTA6MTEgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyOiBBZGQgRE1BQlVGIGFuZCBVU0VSUFRSIGltcG9ydGF0aW9uCisKKzIwMTQtMDQtMTcgMjE6NDU6NTggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogVmFsaWQgRkQgYXJlIGJpZ2dlciBvciBlcXVhbCB0byB6ZXJvCisKKzIwMTQtMDQtMTYgMTc6MDQ6NDIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRG9uJ3QgbGVhayBkb3duc3RyZWFtIHBvb2wgaW4gcHJvcG9zZV9hbGxvY2F0aW9uCisJICBwYXJzZV9udGhfYWxsb2NhdGlvbl9wb29sKCkgZ2l2ZSBhIHJlZiBvbiB0aGUgcG9vbCwgd2UgbmVlZCB0byB1bnJlZiBpdAorCSAgd2hlbiBkb25lLgorCisyMDE0LTA0LTE0IDEyOjE5OjM5IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyOiBJbnRyb2R1Y2UgRE1BQlVGX0lNUE9SVCBJTyBtb2RlCisKKzIwMTQtMDQtMTAgMTY6MjY6MzQgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IEFkZCBkbWFidWYgZXhwb3J0IHN1cHBvcnQKKwkgIFRoaXMgY2FuIGJlIGVuYWJsZWQgc2luZyBpby1tb2RlPWRtYWJ1Zi4gVGhpcyB3aWxsIGVuYWJsZWQgbW1hcCBiYXNlCisJICBkcml2ZXJzIHRvIGV4cG9ydCB0aGUgYnVmZmVycyBhcyBkbWFidWYuCisKKzIwMTQtMDQtMTYgMTU6NTE6MDMgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogR3VhcmFudHkgcXVldWVkIHN0YXRlIGludGVncmV0eQorCSAgQmVjYXVzZSBvZiB0aGUgYnVmIGluIHZpZGVvYnVmMiwgZHFidWYgbWF5IGxlYXZlIHRoZSBET05FIGZsYWcgYmVpbmcsCisJICB3aGljaCB3b3VsZCBpbXBsaWVkIHRoYXQgdGhlIGJ1ZmZlciBpcyBxdWV1ZWQuIEFzIHRoaXMgaGFzIGJlZW4gYnJva2VuCisJICBmb3IgNCB5ZWFycywgc2ltcGx5IGd1YXJhbnR5IHRoZSBzdGF0ZSBmbGFncyBpbnRlZ3JpdHkgd2hlbiBkb2luZworCSAgcWJ1Zi9kcWJ1Zi4KKwkgIFNlZSBodHRwczovL3BhdGNod29yay5saW51eHR2Lm9yZy9wYXRjaC8yMzY0MS8KKworMjAxNC0wNC0xNSAxNzozMTo0MiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJICB2NGwydHJhbnNmb3JtOiBJbXBsZW1lbnQgb3Blbi9jbG9zZQorCisyMDE0LTA0LTE1IDE2OjQzOjQxIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IEVuc3VyZSBvdXRwdXQgcG9vbCBpcyBjb25maWd1cmVkCisKKzIwMTQtMDQtMTUgMTY6NDM6MTUgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5oOgorCSAgdjRsMnRyYW5zZm9ybTogQ2hlY2sgaWYgY2FwcyBoYXZlIGNoYW5nZXMgYmVmb3JlIGFzc2VydGluZworCSAgSW4gc2V0X2NhcHMsIG5vdyBjaGVja3MgaWYgY2FwcyBhY3R1YWxseSBjaGFuZ2VkIGFuZCBzdWNjZWVkIGlmIHRoZXkgZGlkbid0CisJICBjaGFuZ2UuCisKKzIwMTQtMDQtMTUgMTY6NDE6NDYgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmM6CisJICB2NGwydmlkZW9kZWM6IEVuc3VyZSBwb29sIGlzIGNvbmZpZ3VyZWQKKworMjAxNC0wNC0wOCAxODo1NDowOSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBBbHdheXMgc2V0IGEgc2l6ZSB3aGVuIGRlY2lkaW5nIGFsbG9jYXRpb24KKworMjAxNC0wNC0wOCAxODoyMDoyNSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBJbXByb3ZlZCBkZWNpZGUgYWxsb2NhdGlvbgorCSAgSW1wcm92ZSBkZWNpZGUgYWxsb2NhdGlvbiBzbyBpdCBwcm9wZXJseSBjb25maWd1cmUgYm90aCBsb2NhbCBhbmQgZG93bnN0cmVhbQorCSAgYnVmZmVyIHBvb2xzLiBBbHNvIHJlYWQgYmFjayB0aGUgcG9vbCBjb25maWcgaWYgaXQgd2FzIGNoYW5nZWQgdG8gdG8gZHJpdmVyCisJICBsaW1pdGF0aW9ucy4KKworMjAxNC0wNC0xNSAxMzozMDowMiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IERvIG5vdCBwcmUtY29uZmlndXJlIHRoZSBwb29sCisJICBQcmUtY29uZmlndXJpbmcgdGhlIHBvb2wgaXMgZXJyb3IgcHJvbmUsIHNpbmNlIGl0IG1heSBoaWRlIGEgY29uZmlndXJhdGlvbiBmYWlsdXJlIGFuZAorCSAgZW5kdXAgd2l0aCBhIHBvb2wgdGhhdCBpcyBub3QgY29uZmlndXJlZCB0aGUgd2F5IGl0IHNob3VsZCAoZS5nLiBubyB2aWRlbyBtZXRhLCB3cm9uZworCSAgcXVldWUgc2l6ZSwgZXRjLikKKworMjAxNC0wNC0xNSAxMzoyMzozMyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IFByZXNlcnZlIGRvd25zdHJlYW0gbWluaW11bSBldmVuIGluIFJXCisKKzIwMTQtMDQtMTUgMTM6MjA6MTIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJICB2NGwyYnVmZmVycG9vbDogVHVybiBjcm9wbWV0YSBpbnRvIGEgY3VzdG9tIG9wdGlvbgorCSAgVHVybiBjcm9wIG1ldGEgaW50byBhIGN1c3RvbSBvcHRpb24gYW5kIG1ha2Ugc3VyZSBpdCdzIHRoZXJlIGlzIG5lZWRlZC4KKworMjAxNC0wNC0wOSAxMjo1MzoxOSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyYnVmZmVycG9vbDogRWFybHkgY2F0Y2ggc2hvcnQgYWxsb2NhdGlvbgorCSAgQ2F0Y2ggc2hvcnQgYWxsb2NhdGlvbiBhZnRlciBzYXZpbmcgdGhlIGZvcm1hdC4gVGhpcyBpcyBub3QgYSBjYXRjaCBhbGwsIGJ1dCBzaG91bGQgY2F0Y2gKKwkgIG1vc3Qgb2YgdGhlIG1pc3MtYmVoYXZpbmcgZHJpdmVycyB3aGVuIGRvaW5nIFNfRk1UL0dfRk1UIGFuZCBhdm9pZCBwb3RlbnRpYWwgY3Jhc2guCisKKzIwMTQtMDQtMDQgMjI6NDY6NDAgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJICB2NGwyYnVmZmVycG9vbDogUG9ydCB0byB1c2UgR3N0VjRsMkFsbG9jYXRvcgorCisyMDE0LTA0LTA0IDIyOjM1OjQ4IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5oOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5oOgorCSAgSW1wbGVtZW50IFY0bDIgQWxsb2NhdG9yCisJICBUaGlzIGdvYWwgb2YgdGhpcyBhbGxvY2F0b3IgaXMgbWFpbmx5IHRvIGFsbG93IHRyYWNraW5nIHRoZSBtZW1vcnkuCisJICBDdXJyZW50bHksIHdoZW4gYSBidWZmZXIgbWVtb3J5IGhhcyBiZWVuIG1vZGlmaWVkLCB0aGUgYnVmZmVyIGFuZCBpdCdzCisJICBtZW1vcnkgaXMgZGlzcG9zZWQgYW5kIGxvc3QgdW50aWwgdGhlIHN0cmVhbSBpcyByZXN0YXJ0ZWQuCisKKzIwMTQtMDQtMTYgMTY6MzU6NDkgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRG9uJ3QgYWR2ZXJ0aXNlIGNyb3AgbWV0YQorCSAgQ3VycmVudGx5IHdlIGFkdmVydGlzZSBjcm9wIG1ldGEsIGJ1dCBub3QgZWxlbWVudCBoYW5kbGUgc3VwcG9ydCB0aGlzIG1ldGEuCisKKzIwMTQtMDQtMDggMTg6MTg6NTcgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogU2V0dXAgcG9vbCBhbHJlYWR5IHNlbmQgZWxlbWVudCBlcnJvcgorCisyMDE0LTA0LTA4IDE4OjE3OjMxIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IFdvcmthcm91bmQgZGVjb2RlciB0aGF0IHNldCBudW1fcGxhbmVzIHRvIDAgaW4gdGhlIGZvcm1hdAorCSAgU29tZSB3ZWxsIGtub3duIGRlY29kZXIgd3JvbmdseSBzZXQgbnVtX3BsYW5lcyB0byAwIGluIHRoZWlyIGZvcm1hdCBpbnN0ZWFkIG9mCisJICBvbmUuIEluIHRoaXMgY2FzZSB3ZSB3b3VsZCBlbmR1cCB3aXRoIG5vIHNpemUgd2hlbiBkZWNpZGluZyBidWZmZXIgYWxsb2NhdGlvbi4KKworMjAxNC0wNC0wOCAxNzozNDoxOSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBFbnN1cmUgc2l6ZSBiZWZvcmUgY29uZmlndXJpbmcgdGhlIHBvb2wKKworMjAxNC0wNC0wNCAyMjozODowNSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyb2JqZWN0OiBTZXQgbWluaW11bSBidWZmZXJzIHRvIDIKKwkgIEFsbCB0aGUgZWxlbWVudCByZXF1aXJlcyBhdCBsZWFzdCB0d28gYnVmZmVycy4gVGhpcyBpcyBub3QgdXNlZCBmb3IgUlcgbW9kZS4KKworMjAxNC0wNC0wNCAyMjozNzoxNCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyb2JqZWN0OiBSZW1vdmUgdW51c2VkIE1BWF9CVUZGRVJTIGRlZmluZQorCisyMDE0LTA0LTA0IDIyOjM2OjM3IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IERvbid0IGhhcmRjb2RlIG1pbi9tYXggdXNlIGRlZmF1bHQgaW5zdGVhZAorCisyMDE0LTA0LTEwIDE3OjQ5OjQxIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IEluc3RhbGwgUFJPUF9DQVBUVVJFX0lPX01PREUgd2l0aCByaWdodCBJRAorCisyMDE0LTA0LTA4IDE4OjU0OjUwIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IGRlY2lkZV9hbGxvY2F0aW9uIHJldHVybnMgYSBib29sZWFuCisKKzIwMTQtMDQtMTAgMTc6NDk6MjkgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmM6CisJICB2NGwydmlkZW9kZWM6IEluc3RhbGwgUFJPUF9DQVBUVVJFX0lPX01PREUgd2l0aCByaWdodCBJRAorCisyMDE0LTAzLTI3IDEzOjIxOjI1IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IEFkZCBwcm9wb3NlX2FsbG9jYXRpb24KKwkgIFRoaXMgc2hvdWxkIHJlbW92ZSAxIGNvcHkgYmV0d2VlbiB0aGUgZGVjb2RlciBhbmQgdGhlIHRyYW5zZm9ybS4KKworMjAxNC0wMy0yNyAxMzoyMDo1MyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMjogTW92ZSBwcm9wb3NlIGFsbG9jYXRpb24gdG8gdjRsMm9iamVjdAorCisyMDE0LTAzLTIwIDE3OjI2OjA1IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IEZpeHVwIGNhcHMgcXVlcnkKKworMjAxNC0wMy0yMCAxNTozMToyMiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJICB2NGwydHJhbnNmb3JtOiBTZXR1cCBjcm9wcGluZyBpZiBuZWVkZWQKKworMjAxNC0wMy0xOSAxNzoyNToxNiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6CisJICB2NGwydHJhbnNmb3JtOiBFeHBvc2UgQkdSQSBhbmQgQVJHQiBmb3JtYXRzCisKKzIwMTQtMDMtMTggMTc6MzM6MzggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5jOgorCSAgdjRsMnRyYW5zZm9ybTogRW5zdXJlIG91dHB1dCBwb29sIGlzIGFjdGl2YXRlZAorCSAgVGhhdCBwb29sIG1heSBiZSBkaWZmZXJlbnQgdGhlbiB0aGUgaW50ZXJuYWwgcG9vbC4KKworMjAxNC0wMy0xNiAxOToxMToxNiArMDEwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJICB2NGwydHJhbnNmb3JtOiBFbnN1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2xzIGFjdGljYXRpb24KKworMjAxNC0wMy0xNiAxMTozNjoxOSArMDEwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJICB2NGwydHJhbnNmb3JtOiBNb3ZlIHN1Ymluc3RhbmNlIHN1YmNsYXNzIGluaXQgbmVhciBvdGhlciBpbml0CisKKzIwMTQtMDMtMTUgMTg6NTY6NTEgKzAxMDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5jOgorCSAgdjRsMnRyYW5zZm9ybTogU3RvcCBzdHJlYW0gYmVmb3JlIGNsb3NpbmcgdGhlIGRldmljZXMuCisKKzIwMTQtMDMtMTUgMTY6NTM6NTQgKzAwMDAgIFbDrWN0b3IgTWFudWVsIErDoXF1ZXogTGVhbCA8dmphcXVlekBpZ2FsaWEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJICB2NGwydHJhbnNmb3JtOiBjb3B5IG1ldGRhdGEKKworMjAxNC0wMy0wNCAxODozMToyNyAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uaDoKKwkgIEltcGxlbWVudCBHc3RWNGwyVHJhbnNmb3JtCisJICBJbXBsZW1lbnQgYSB2NGwyIGVsZW1lbnQgdGhhdCB3cmFwcyBIVyB2aWRlbyBjb252ZXJ0ZXJzLgorCisyMDE0LTAzLTI3IDE4OjQxOjA3IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyOiBQcm9iZSBmb3IgQ1JFQVRFX0JVRlMgaW4gb3JkZXIgdG8gY29ycmVjdGx5IHNldCBwb29sIG1pbi9tYXgKKwkgIEluIG9yZGVyIHRvIGNvcnJlY3RseSBzZXQgdGhlIHBvb2wgbWluL21heCwgd2UgbmVlZCB0byBwcm9iZSBmb3IgQ1JFQVRFX0JVRlMKKwkgIGlvY3RsLiBUaGlzIGNhbiBiZSBkb25lIGFzIHNvb24gYXMgdGhlIGZvcm1hdCBoYXMgYmVlbiBuZWdvdGlhdGVkIHVzaW5nIGEKKwkgIGNvdW50IG9mIDAuCisKKzIwMTQtMDMtMjUgMTU6MjE6MDMgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMjogTW92ZSBjYXB0dXJlIGVvcyBoYW5kbGluZyBpbiBfcHJvY2VzcygpCisJICBOb3cgdGhhdCB3ZSBtaWdodCBiZSBjb3B5aW5nIG91dCBidWZmZXIgKGUuZy4gZG93bnN0cmVhbSBkb24ndCBzdXBwb3J0IHZpZGVvCisJICBtZXRhIGJ1ZyB3ZSBuZWVkIGl0KSB3ZSBuZWVkIHRvIG1vdmUgdGhlIEVPUyBoYW5kbGluZyBpbnNpZGUgdGhlIHByb2Nlc3MKKwkgIG1ldGhvZC4KKworMjAxNC0wMy0yNSAxMDo0OTozOSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBGaXggc3VwcG9ydCBmb3IgcGxhbmFyIGZvcm1hdCBpbiAxIHY0bDIgbXBsYW5lCisJICBTbyBmYXIgd2Ugd2hlcmUgb25seSBzZXR0aW5nIHNhdmluZyB0aGUgZmlyc3QgcGxhbmUgc3RyaWRlIGluIHRoZSBtZXRhLiBUaGlzIHdhcworCSAgbGVhZGluZyB0byB3cm9uZyB2YWx1ZXMgaW4gR3N0VmlkZW9NZXRhLgorCisyMDE0LTAzLTE5IDE3OjUyOjA4IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBDbGVhbmx5IGZhaWwgaWYgc2V0X2Zvcm1hdCBpcyBuZXZlciBjYWxsZWQKKworMjAxNC0wMy0xOSAxNzowMDo1NiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBFeHBvc2UgUkdCMzIgZm9ybWF0cyB3aXRoIGFuZCB3aXRob3V0IGFscGhhCisJICBBcyBzb29uIGEgdGhlIGFscGhhIGNvbXBvbmVudCBjYW4gYmUgc2V0LCB3ZSBjYW4gZXhwb3NlIHRoZSBSR0IzMiBhbmQgQkdSMzIKKwkgIGZvcm1hdCBhcyBBUkdCIGFuZCBCR1JBIGFzIGxvbmcgd2UgY2FuIGRldGVybWluaXN0aWNhbGx5IHNldCB0aGUgYWxwaGEgcGFkZGluZworCSAgdmFsdWUuCisKKzIwMTQtMDMtMTggMTU6NDk6NDkgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IENvcnJlY3RseSBjaGVjayBpZiB2aWRlbyBtZXRhIGlzIG5lZWRlZAorCSAgQ29ycmVjdGx5IGNoZWNrIGlmIHZpZGVvIG1ldGEgaXMgbmVlZGVkLiBJbiBidWZmZXIgcG9vbCwgdHJ1c3QgbmVlZF92aWRlb19tZXRhCisJICBmbGFnIGluIG9yZGVyIHRvIGRlY2lkZSBpZiBjb25maWd1cmF0aW9uIHNob3VsZCBzdWNjZWVkLgorCisyMDE0LTAzLTE4IDE1OjQ1OjE4IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IEZpeCB0aWxlZCBzdHJpZGUgcmVxdWVzdAorCSAgRml4IHN0cmlkZSByZXF1ZXN0IGZvciB0aWxlZCBmb3JtYXQgYW5kIGltcHJvdmUgbG9nZ2luZy4KKworMjAxNC0wMy0xOCAxMTo1Mzo1NyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRW5zdXJlIHZpZGVvIGFuZCBjcm9wIG1ldGEgYXJlIGVuYWJsZWQgaWYgbmVlZGVkCisJICBJbiBjZXJ0YWluIGNhc2VzIHdlIGNhbm5vdCBsaXZlIHdpdGhvdXQgdmlkZW8gbWV0YSBhbmQvb3IgY3JvcCBtZXRhCisJICBiZWluZyBlbmFibGVkIGluIG91ciBpbnRlcm5hbCBidWZmZXIgcG9vbC4gRW5zdXJlIHRoaXMgaXMgYWx3YXlzIHRoZSBjYXNlLAorCSAgcmVnYXJkbGVzcyBvZiBoYXZpbmcgc3VwcG9ydCBmb3IgYWxsb2NhdGlvbiBxdWVyeS4KKworMjAxNC0wMy0xNiAxODozOTozMiArMDEwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogRW5zdXJlIGludGVybmFsIHBvb2wgYXJlIGFjdGl2YXRlZAorCisyMDE0LTAzLTE2IDE3OjAxOjEwICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBDaGVjayB0aGF0IHBvb2wgd2hlcmUgYWxsb2NhdGVkIGJlZm9yZSBmbHVzaGluZyB0aGVtCisJICBVcG9uIGVycm9yLCB0aGUgcG9vbHMgbWlnaHQgbm90IGhhdmUgYmVlbiBhbGxvY2F0ZWQgeWV0LCBoZW5jZSB3ZSBzaG91bGQgbm90CisJICB0cnkgYW5kIGZsdXNoIHRoZW0gKGV2ZW4gdGhvdWdoIHdlIHN0aWxsIHdhbnQgdG8gbWFrZSBzdXJlIHRoZSBwcm9jZXNzaW5nIHRocmVhZAorCSAgaXMgZnVsbHkgc3RvcHBlZCkuCisKKzIwMTQtMDMtMTYgMTY6NTU6NDMgKzAxMDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJICB2NGwyYnVmZmVycG9vbDogRW5mb3JjZSBhY3RpdmF0aW9uIG91dHNpZGUgb2YgcHJvY2VzcworCSAgRW5mb3JjZSBwb29sIGJlaW5nIGFjdGl2YXRlIGZyb20gYmVmb3JlIGNhbGxpbmcgcG9vbCBwcm9jZXNzLiBUaGlzIHNob3VsZAorCSAgaGVscCBjYXRjaGluZyBiYXNpYyBlcnJvcnMgaW4gdGhlIHVzYWdlIG9mIGJ1ZmZlciBwb29sLgorCisyMDE0LTAzLTE2IDEyOjQ0OjE0ICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IGRvbid0IHVzZSBvd24gcG9vbCBpZiBkb3duc3RyZWFtIGRvbid0IHN1cHBvcnQgdmlkZW8gbWV0YQorCisyMDE0LTAzLTE0IDAwOjMxOjMyICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogVXNlIG9iai0+bl92NGwyX3BsYW5lcyBmb3IgY29ycmVjdCBudW1iZXIgb2YgcGxhbmVzCisJICBCdWZmZXIgcG9vbCB3YXMgZ3Vlc3Npbmcgd3JvbmdseSB0aGUgbnVtYmVyIG9mIHBsYW5lcyByYXRoZXIKKwkgIHRoZW4gcmVhZGluZyB0aGUgdmFsdWUgZnJvbSBvYmotPm5fdjRsMl9wbGFuZXMuIFRoaXMgd2FzIGNhdXNpbmcKKwkgIGZvcm1hdCBZVTEyIChJNDIwKSB0byBmYWlsIHVwb24gY2hlY2suCisKKzIwMTQtMDMtMDcgMTY6Mzk6MjkgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRml4IGhhbmRsaW5nIG9mIGNvbnRpdW91cyB2cyBub24tY29udGlndW91cyBzdXBwb3J0CisJICBUaGUgY29tcGxleCBtZWNoYW5pYyB0byB0cnkgYW5kIGNob29zZSB0aGUgcmlnaHQgdGhpbmcgZGlkIG5vdCB3b3JrLiBJbnN0ZWFkLAorCSAgc2ltcGx5IHByb2JlIHRoZSBub24tY29udGlndW91cyBmb3JtYXQgZmlyc3QgYW5kIHRoZW4gdGhlIGNvbnRpZ3VvdXMgb25lLgorCSAgVGhpcyBpcyBpbiBmYWN0IHZlcnkgbG93IG92ZXJoZWFkLCBhcyB0aGVyZSBpcyBhIHJlbGF0aXZlbHkgc21hbGwgbnVtYmVyIG9mCisJICBwaXhlbCBmb3JtYXQgc3VwcG9ydGVkIGJ5IGVhY2ggZGV2aWNlcy4KKworMjAxNC0wNC0xNSAxNTowNzoyMyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5oOgorCSAgdjRsMjogQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgYWxpZ25tZW50IGFuZCBjcm9wcGluZworCisyMDE0LTAzLTEzIDE5OjI0OjUxICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMm9iamVjdDogUmVuYW1lIHNldHVwX2Zvcm1hdCgpIG1ldGhvZCBpbnRvIGFjcXVpcmVfZm9ybWF0KCkKKwkgIFRoZSBzZXR1cF9mb3JtYXQoKSB3YXMgY29uZnVzaW5nIHNpbmNlIGl0IGRvZXMgbm90IHNldCBhbnl0aGluZywgaW4gZmFjdAorCSAgaXQgcmVhZHMgdGhlIHNldHVwIGZyb20gdGhlIGRyaXZlciBhbmQgc2F2ZSBpdC4KKworMjAxNC0wMy0xMyAxODoyMTo0MSArMDEwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBNb3ZlIHR5cGUgZGVjbGFyYXRpb24gdG8gdGhlIHRvcAorCisyMDE0LTAzLTEyIDE4OjA3OjM4ICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBQcm90ZWN0IE5VTEwgcG9vbCB3aGlsZSBnb2luZyB0byBSRUFEWQorCSAgV2hlbiB0aGUgcGlwZWxpbmUgZmFpbHMgZWFybHksIHRoZSBwb29sIG1pZ2h0IGJlIHVuc2V0IGJlZm9yZSB0aGUgcHJvY2Vzc2luZworCSAgdGhyZWFkIGhhcyBydW4gb25jZS4gQWRkIHByb3RlY3Rpb24gYWdhaW5zdCB0aGF0LgorCisyMDE0LTAzLTEyIDE4OjAxOjA5ICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IEZhaWwgY2xlYW5seSBpZiBwaXhlbCBmb3JtYXQgaXMgdW5rb3duIG9yIG5vdCByYXcgdmlkZW8KKwkgIENlcnRhaW4gZGVjb2RlciBoYXMgYmVlbiBmb3VuZCB0byBub3QgY2hvb3NlIGEgZm9ybWF0IGF1dG9tYXRpY2FsbHkuIFJ1bm5pbmcKKwkgIHY0bDJ2aWRlb2RlYyBvbiB0aGVzZSB3b3VsZCBhc3NlcnQuIFRoaXMgcGF0Y2ggd2lsbCBtYWtlIGl0IGZhaWwgY2xlYW5seQorCSAgaW5zdGVhZC4KKworMjAxNC0wMy0xMiAxNzo1NjoxOCArMDEwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogQ2xlYXIgdGhlIGlucHV0IHN0YXRlIHBvaW50ZXIgYWZ0ZXIgdW5yZWYKKwkgIElmIGNhcHMgYXJlIHNldCBhZ2Fpbiwgd2UgaGF2ZSBhIHJpc2sgb2QgcmV0dXJuaW5nIGZyb20gc2V0X2Zvcm1hdCB3aXRoIGEKKwkgIGlucHV0X3N0YXRlIHBvaW50aW5nIHRvIGRlYWQgbWVtb3J5LiBDbGVhcmluZyB0aGUgcG9pbnRlciBhZnRlciB1bnJlZiBmaXgKKwkgIHRoaXMgaXNzdWUuCisKKzIwMTQtMDMtMTIgMTc6MTE6MTYgKzAxMDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmM6CisJICB2NGwydmlkZW9kZWM6IGhhbmRsZSBzdG9wIGJlaW5nIGNhbGxlZCB3aXRob3V0IGZsdXNoCisJICBVcHBvbiBjZXJ0YWluIGRvd25zdHJlYW0gZXJyb3IsIHN0b3AoKSBpcyBjYWxsZWQgd2l0aG91dCBhIGZsdXNoKCkuIFRoaXMgbWVhbiB0aGF0CisJICB0aGUgc3RyZWFtaW5nIHRocmVhZCBtYXkgc3RpbGwgYmUgcnVubmluZyBldmVuIHRob3VnaCB1bmxvY2sgaGFzIGJlZW4gY2FsbGVkLgorCSAgTm93IGNhbGxpbmcgZmx1c2ggdG8gcmVzZXQgdGhlIGRlY29kZXIgc3RhdGUgaWYgd2UgYXJlIHByb2Nlc3NpbmcuCisKKzIwMTQtMDMtMDYgMTg6MTM6MTQgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmM6CisJICB2NGwydmlkZW9kZWM6IERlZmF1bHQgdG8gdGVtcGxhdGUgaW4gY2FwcyBxdWVyeQorCisyMDE0LTAzLTExIDE0OjIzOjMyIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBFbnN1cmUgcHJvY2Vzc2luZyB0aHJlYWQgaGFzIHN0b3BwZWQgd2hlbiBkcmFpbmluZworCisyMDE0LTAzLTExIDE0OjAxOjI3IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBEb24ndCBkcmFpbiBpZiBwcm9jZXNzaW5nIHRocmVhZCBpcyBpbmFjdGl2ZQorCisyMDE0LTA1LTA4IDA5OjQ5OjI0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IENsZWFuIHVwIGFsbCBwZW5kaW5nIG9wZXJhdGlvbnMgZnJvbSBsaWJzb3VwIGJlZm9yZSB1bnJlZmZpbmcgb3VyIGNvbnRleHQKKwkgIFdoZW4gd2UgY2FuY2VsIGNvbm5lY3Rpb24gYXR0ZW1wdHMgYW5kIHNpbWlsYXIgdGhpbmdzLCB0aGVyZSBhcmUgc3RpbGwKKwkgIHNvbWUgb3BlcmF0aW9ucyBwZW5kaW5nIG9uIG91ciBtYWluIGNvbnRleHQgZnJvbSB0aGUgR0NhbmNlbGxhYmxlcy4gV2UKKwkgIHNob3VsZCBsZXQgdGhlbSBhbGwgcnVuIGJlZm9yZSB1bnJlZmZpbmcgb3VyIGNvbnRleHQsIG90aGVyd2lzZSB3ZSBsZWFrCisJICBmaWxlIGRlc2NyaXB0b3JzLgorCSAgVW5mb3J0dW5hdGVseSB0aGlzIHJlcXVpcmVzIGxpYnNvdXAgMi40Ny4wIG9yIG5ld2VyIGFzIGVhcmxpZXIgdmVyc2lvbnMKKwkgIHN0ZWFsIG91ciBtYWluIGNvbnRleHQgZnJvbSB1cyBhbmQgd2UgY2FuJ3QgdXNlIGl0IGZvciBjbGVhbnVwIGxhdGVyCisJICB3aXRob3V0IGFzc2VydGlvbnMgYW5kIGZ1bm55IGNyYXNoZXMuCisJICBCYXNlZCBvbiBhIHBhdGNoIGJ5IERtaXRyeSBTaGF0cm92IDxzaGF0cm92QGdtYWlsLmNvbT4uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjYzOTQ0CisKKzIwMTQtMDUtMDcgMTU6NDk6MzkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6CisJICB0ZXN0czogZml4IGNvbXBpbGF0aW9uIG9mIHNvdXBodHRwc3JjIHRlc3QgZm9yIGxpYnNvdXAgMi40MCBmb3IgcmVhbAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNzMyOQorCisyMDE0LTA1LTA3IDEzOjIzOjUwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSAgdGVzdHM6IGZpeCBjb21waWxhdGlvbiBvZiBzb3VwaHR0cHNyYyB0ZXN0IGZvciBsaWJzb3VwIDIuNDAKKwkgIFNPVVBfQ0hFQ0tfVkVSU0lPTiB3YXMgb25seSBhZGRlZCBpbiAyLjQxLCBidXQgd2Ugb25seQorCSAgZGVwZW5kIG9uIDIuNDAuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI3MzI5CisKKzIwMTQtMDUtMDcgMDA6NTg6MTUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IHNraXAgUElDVFVSRSBoZWFkZXJzIHdpdGhvdXQgYW55IGltYWdlIGRhdGEKKwkgIEZpeGVzIHdhcm5pbmcgaWYgdGhlIGltYWdlIGxlbmd0aCBpcyAwLgorCisyMDE0LTA1LTA2IDA5OjIyOjE4ICswMDAwICDQoNGD0YHQu9Cw0L0g0JjQttCx0YPQu9Cw0YLQvtCyIDxscm4xOTg2QGdtYWlsLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiB1c2UgWDExIGRldGVjdGlvbiBtYWNybyBmcm9tIGNvbW1vbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyOTYyMQorCisyMDE0LTA0LTMwIDExOjEzOjEyICswMjAwICBHdWlsbGF1bWUgRGVzbW90dGVzIDxndWlsbGF1bWUuZGVzbW90dGVzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9SRUFETUU6CisJICBydHAvUkVBRE1FOiB1cGRhdGUgcGlwZWxpbmVzIHRvIHdvcmsgd2l0aCAxLjAKKwkgIC0gVXNlIGdzdC1saWJhdiBlbmNvZGVycy9kZWNvZGVycyBpbnN0ZWFkIG9mIGdzdC1mZm1wZWcKKwkgIC0gZ3N0cnRwaml0dGVyYnVmZmVyIC0+IHJ0cGppdHRlcmJ1ZmZlcgorCSAgLSBnc3QtbGF1bmNoLTAuMTAgLT4gZ3N0LWxhdW5jaC0xLjAKKwkgIC0gQWRkICd2aWRlb2NvbnZlcnQnIGVsZW1lbnQKKwkgIC0geHZpbWFnZXNpbmsgLT4gYXV0b3ZpZGVvc2luaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyOTI0NworCisyMDE0LTA1LTA1IDE0OjQxOjA1ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkgIG1hdHJvc2thOiByZWppZyB0ZXN0IHRvIGF2b2lkIHVuZGVmaW5lZCBzaGlmdCBiZWhhdmlvcgorCSAgQ292ZXJpdHkgMTE5NTEyMSwgMTE5NTEyMAorCisyMDE0LTA1LTA1IDE0OjMzOjM4ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkgIHZwOWVuYzogZG8gbm90IGRlcmVmZXJlbmNlIE5VTEwgcG9pbnRlcgorCSAgQ292ZXJpdHkgMTE5NzcwMworCisyMDE0LTA1LTA1IDE0OjMyOjA2ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGVuc3VyZSB3ZSBkb24ndCBkZXJlZmVyZW5jZSBhIE5VTEwgcG9pbnRlcgorCSAgd2hpbGUgd29ya2luZyBvdXQgdGhlIGNvZGVjIElELgorCSAgQ292ZXJpdHkgMTE5NTE0OAorCisyMDE0LTA1LTA1IDEyOjA3OjI1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6CisJICB2NGwyOiBtaW5vciBmaXggZm9yIGNsb3NpbmcgdGhlIGZkCisJICBUaGUgZmQgcmV0dXJuZWQgYnkgb3BlbigpIGNvdWxkIHRoZW9yZXRpY2FsbHkgYmUgMCBhcyB3ZWxsLgorCSAgQ292ZXJpdHkgQ0lEIDEyMTE4MjMuCisKKzIwMTQtMDUtMDQgMjA6MjM6MjkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQG9jcmV0ZS5jYT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBydHguYzoKKwkgIHJ0cGF1eC9ydHBydHg6IE1ha2UgdGVzdHMgbm9uLXJhY3kKKwkgIEZpeCB0aGUgcmFjaW5lc3MgYnkgaXRlcmF0aW5nIG9uIGEgY29uZGl0aW9uIGluc3RlYWQgb2YgdXNpbmcgdGhlIGdtYWlubG9vcC4KKwkgIERvbid0IHVzZSB0aGUgRU9TIGFzIHRoZSB0YXJnZXQsIG90aGVyd2lzZSB0aGUgcmV0cmFuc21pc3Npb24gb2YgdGhlIGxhc3QKKwkgIHBhY2tldHMgYXJlIGxvc3QuIEFsc28gY291bnQgdGhlIHJldHJhbm1pc3Npb25zIHJlcXVlc3RzIHRoYXQgYXJlIGRyb3BwZWQuCisJICBDaGVjayB0aGUgY29uZGl0aW9uIGJlZm9yZSBibG9ja2luZyBvbiB0aGUgR0NvbmQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mjg1MDEKKworMjAxNC0wNS0wNCAyMjozMjo1NCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAb2NyZXRlLmNhPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmg6CisJICBydHBydHhyZWNlaXZlOiBXYWl0IHVudGlsIHRpbWVvdXQgdG8gY2xlYXIgYXNzb2NpYXRpb24gcmVxdWVzdHMKKwkgIElmIHR3byBzdHJlYW1zIHJlcXVlc3QgYSByZXRyYW5taXNzaW9uIGZvciB0aGUgc2FtZSBTU1JDLCBpZ25vcmUgdGhlIHNlY29uZAorCSAgb25lIGlmIHRoZSBmaXJzdCBvZW4gaXMgbGVzcyB0aGFuIG9uZSBzZWNvbmQgb2xkLCBvdGhlcndpc2UgdGltZSBvdXQgdGhlIGZpcnN0CisJICBvbmUgYW5kIGlnbm9yZSB0aGUgc2Vjb25kLgorCisyMDE0LTA1LTA0IDE4OjU5OjMzIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBvY3JldGUuY2E+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwbXV4LmM6CisJICBydHBtdXg6IEFsd2F5cyBsZXQgdXBzdHJlYW0gY2hvc2UgdGhlIHNzcmMgaWYgaXQgd2lzaGVzCisKKzIwMTQtMDUtMDQgMTM6Mzc6NDYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGF2b2lkIHN0YWxsIGJ5IGNvcnJ1cHRlZCBzZXFudW0gYWNjb3VudGluZworCisyMDE0LTA1LTA0IDAxOjE0OjMzIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBvY3JldGUuY2E+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWRldmljZW1vbml0b3IuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZWRldmljZW1vbml0b3IuaDoKKwkgIHB1bHNlZGV2aWNlbW9uaXRvcjogSW5kZXggYXJlIHBlciBmYWNpbGl0eSwgbm90IGdsb2JhbAorCSAgU28gbmVlZCB0byBrZWVwIHRoZSB0eXBlIG9mIGRldmljZSBpbiB0aGUgZGV2aWNlIG9iamVjdAorCisyMDE0LTA1LTA0IDAxOjEzOjI0IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBvY3JldGUuY2E+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWRldmljZW1vbml0b3IuYzoKKwkgIHB1bHNlZGV2aWNlbW9uaXRvcjogcGFfc3Vic2NyaXB0aW9uX2V2ZW50X3QgYXJlIGVudW1zLCBub3QgZmxhZ3MKKwkgIENvdmVyaXR5IDExOTUxMzIKKworMjAxNC0wNS0wMiAyMjo0Mjo1NCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJkZXZpY2Vtb25pdG9yLmM6CisJICB2NGwyZGV2aWNlbW9uaXRvcjogUG9ydCB0byB1c2UgR3N0VjRsMkl0ZXJhdG9yCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI3OTI1CisKKzIwMTQtMDUtMDIgMjE6Mzg6MzAgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5oOgorCSAgdjRsMjogVXNlIHNpbmdsZSBwYXNzIGl0ZXJhdG9yIGZvciBNMk0gcHJvYmUKKwkgIEluc3RlYWQgb2YgaGF2aW5nIGVhY2ggTTJNIGNsYXNzIGRvIHRoZWlyIG93biBwcm9iaW5nLCB1c2UgdGhlCisJICBHc3RWNGwySXRlcmF0b3IgYW5kIHByb2JlIGFsbCBkZXZpY2VzIGluIGEgc2luZ2xlIHBhc3MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI3OTI1CisKKzIwMTQtMDUtMDIgMTY6NTU6MDUgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsMi92NGwyLXV0aWxzLmM6CisJKiBzeXMvdjRsMi92NGwyLXV0aWxzLmg6CisJICB2NGwyOiBBZGQgYSBjb21tb24gZGV2aWNlIGVudW1lcmF0b3IKKwkgIFRoaXMgd2lsbCBhbGxvdyByZW1vdmluZyBjb2RlIGR1cGxpY2F0aW9uIChoZW5jZSBidWdzIGR1cGxpY2F0aW9uKS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mjc5MjUKKworMjAxNC0wMy0xNiAxMTozODowNyArMDEwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5oOgorCSAgdjRsMnZpZGVvZGVjOiBTaW1wbGlmeSBzdWItaW5zdGFuY2lhdGlvbiBtZWNoYW5pc20KKwkgIFNpbXBsaWZ5IHN1Yi1pbnN0YW5jaWF0aW9uIGJ5IGRlZmluaW5nIGFuIGFic3JhY3QgdHlwZSBhbmQgdXNpbmcgc3VidHlwZQorCSAgY2xhc3MgYW5kIGluc3RhbmNlIGluaXQgY2FsbGJhY2suIFRoaXMgYWxzbyBmaXhlcyBhIGJ1ZyB3aGVyZSB0aGUgdGVtcGxhdGUKKwkgIHBhZHMgZ2V0IGluaXRpYWxpemVkIHRvbyBsYXRlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNzkyNQorCisyMDE0LTA1LTAyIDE4OjE4OjI2IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMi5jOgorCSAgdjRsMjogQ2xlYW51cCBwbHVnaW4gcmVnaXN0cmF0aW9uCisJICBUaGVyZSBpcyBubyBwbGFuIHRvIGludHJvZHVjZSBzcGVjaWFsIHNvdXJjZXMgZm9yIGpwZWcsIHRlIHY0bDJzcmMgd29ya3MgZmluZQorCSAgZm9yIHRoaXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI3OTI1CisKKzIwMTQtMDUtMDMgMTg6MzA6MjAgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQG9jcmV0ZS5jYT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGNvbGxpc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogS2VlcCBsb2NhbCBjb25mbGljdGluZyBhZGRyZXNzZXMgaW4gdGhlIHNlc3Npb24KKwkgIEFzIHdlIG5vdyByZXBsYWNlIHRoZSBsb2NhbCBSVFBTb3VyY2Ugb24gYSBjb25mbGljdCwgaXQncyBubyBsb25nZXIgcG9zc2libGUKKwkgIHRvIGtlZXAgbG9jYWwgY29uZmxpY3RzIGluIHRoZSBSVFBTb3VyY2UsIHNvIHRoZXkgaW5zdGVhZCBuZWVkIHRvIGJlIGtlcHQKKwkgIGluIHRoZSBSVFBTZXNzaW9uLgorCSAgQWxzbyBmaXggdGhlIHJ0cGNvbGxpc2lvbiB0ZXN0IHRvIGdlbmVyYXRlIG11bHRpcGxlIGNvbGxpc2lvbnMgaW5zdGVhZCBvZgorCSAgb25lIGJ5IGNoYW5nZSB0aGUgYWRkcmVzcywgYXMgb3RoZXJ3aXNlIHdlIGRldGVjdGVkIHRoYXQgaXQgd2FzIGEgc2luZ2xlIG9uZS4KKworMjAxNC0wNS0wMyAyMDo0ODozMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjMuMSA9PT0KKworMjAxNC0wNS0wMyAxODowMjoyMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFsczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWFvcmMtZGlzdC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0LmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMtZGlzdC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy1kaXN0LmM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDEuMy4xCisKKzIwMTQtMDUtMDMgMTg6MDI6MDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2hyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisKKzIwMTQtMDUtMDMgMTc6MjI6NDUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSAgcG86IFVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAxNC0wNS0wMyAxMTo0MzoyMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc2hhcGV3aXBlLmM6CisJICBzaGFwZXdpcGU6IFNlbmQgaW5pdGlhbCBldmVudHMgYWZ0ZXIgc2V0dGluZyB0aGUgZWxlbWVudHMgdG8gUExBWUlORworCSAgT3RoZXJ3aXNlIHdlIHNlbmQgdGhlbSB0b28gZWFybHksIGFuZCBzZXR0aW5nIHRoZSBlbGVtZW50cyB0byBQTEFZSU5HCisJICBhZnRlcndhcmRzIHdpbGwgZHJvcCBhbGwgdGhlIGV2ZW50cyBhZ2Fpbi4KKworMjAxNC0wNS0wMyAxMDoxNTowMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGJjYjE1MTggdG8gMjExZmE1ZgorCisyMDE0LTA1LTAyIDE3OjEyOjI5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYzoKKwkgIGltYWdlZnJlZXplOiBTZXQgc2VnbWVudCBwb3NpdGlvbiB0byB0aGUgc3RvcCBwb3NpdGlvbiBvZiB0aGUgYnVmZmVyCisKKzIwMTQtMDUtMDIgMTc6MTA6MTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IFByb3Blcmx5IHJlcG9ydCBlcnJvcnMgYmVmb3JlIHN0b3BwaW5nIHRoZSBzcmNwYWQgdGFzaworCisyMDE0LTA1LTAyIDE3OjAyOjAyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYzoKKwkgIGltYWdlZnJlZXplOiBFcnJvciBvdXQgaWYgd2UgaGF2ZSBubyBjYXBzIHlldAorCisyMDE0LTA1LTAyIDE0OjQ5OjI3ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogYXZvaWQgZGl2aWRpbmcgYnkgYSAwIGJsb2NrYWxpZ24KKwkgIFRoaXMgY2FuIGJlIDAuIEluIHRoYXQgY2FzZSwgZG8gbm90IHRyeSB0byBjdXQgb2ZmIHRoZSBsYXN0IGZldworCSAgYnl0ZXMgZnJvbSB0aGUgbGFzdCBidWZmZXIuCisJICBDb3Zlcml0eSAxMTQ2OTcxCisKKzIwMTQtMDUtMDIgMTQ6MjU6MDEgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogZG8gbm90IHVzZSB1aW5pdGlhbGl6ZWQgY2x1dCBvbiBlcnJvcgorCSAgSWYgd2UncmUgbWlzc2luZyBwYXJ0IG9mIHRoZSBjbHV0LCBkbyBub3QgdHJ5IHRvIHVzZSBpdC4gSXQgc2VlbXMKKwkgIHZlcnkgbGlrZWx5IHRoZSBicmVhayB3YXMgbWVhbnQgdG8gYnJlYWsgb3V0IG9mIHRoZSBzd2l0Y2ggcmF0aGVyCisJICB0aGFuIGZyb20gdGhlIGxvb3AuCisJICBDb3Zlcml0eSAxMTM5ODc4CisKKzIwMTQtMDUtMDIgMTQ6MTg6MDggKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSAgZmx4ZGVjOiBmaXggaW50ZWdlciBvdmVyZmxvdworCSAgQ292ZXJpdHkgMTEzOTg1OQorCisyMDE0LTA1LTAyIDE0OjA5OjAyICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSAgcnRwcWRtZGVwYXk6IHJlbW92ZSBwb2ludGxlc3MgY2hlY2sKKwkgIEJlc2lkZXMsIHRoZSBwb2ludGVyIHdhcyBkZXJlZmVyZW5jZWQgZWFybGllciBhbnl3YXkuCisJICBDb3Zlcml0eSAxMTM5ODUzCisKKzIwMTQtMDUtMDIgMTQ6MDY6MjUgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiByZW1vdmUgZHVwbGljYXRlIHRlc3QKKwkgIGl0ZW0gd2FzIGRlcmVmZXJlbmNlIHByZXZpb3VzbHkuCisJICBXaGlsZSB0aGVyZSwgcmVvcmRlciBzb21lIHRlc3QgZm9yIGZhc3RlciBlYXJseSBvdXQuCisJICBDb3Zlcml0eSAxMTM5ODQ0CisKKzIwMTQtMDUtMDIgMTQ6MDI6NTIgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSAgdnA4ZW5jOiBndWFyZCBhZ2FpbnN0IE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZQorCSAgQ292ZXJpdHkgMTEzOTgzOAorCisyMDE0LTA1LTAyIDEzOjU5OjA3ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogZml4IHRoZW9yZXRpY2FsIGludGVnZXIgb3ZlcmZsb3cKKwkgIFRoaXMgY29kZSBpc24ndCBhY3R1YWxseSB1c2VkIGF0IHRoZSBtb21lbnQsIHVuc3VyZSBpZiBJIHNob3VsZAorCSAganVzdCByZW1vdmUgaXQgb3Igbm90Li4uCisJICBDb3Zlcml0eSAxMTM5ODExCisKKzIwMTQtMDUtMDIgMTM6MzM6MDIgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOgorCSAgbWF0cm9za2E6IGJsaW5kbHkgZml4IHdyaXRpbmcgdmFyaWFibGUgbGVuZ3RoIG5lZ2F0aXZlIHZhbHVlcworCSAgU3BvdHRlZCB3aGlsZSBmaXhpbmcgc29tZXRoaW5nIGVsc2UgaW4gdGhlIGFyZWEuCisJICBOb3RoaW5nIGNhbGxzIHRoaXMgd2l0aCBhIG5lZ2F0aXZlIHZhbHVlLgorCisyMDE0LTA1LTAyIDEzOjI5OjMzICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkgIG1hdHJvc2thOiBkbyBub3QgbG9zZSB0aGUgdG9wIGJpdHMgd2hlbiB3cml0aW5nIGEgPiAzMiBiaXQgdmFsdWUKKwkgIENvdmVyaXR5IDExMzk4MDYKKworMjAxNC0wNS0wMiAxMjoxMDoyNiArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkgIHZpZGVvZmxpcDogYWRkIG1pc3NpbmcgYnJlYWsgaW4gc3dpdGNoCisJICBDb3Zlcml0eSAxMTM5NzU1CisKKzIwMTQtMDUtMDIgMTE6Mzk6MzkgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkgIG1hdHJvc2thOiBkbyBub3QgdHJ5IHRvIGNhbGwgZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IG9uIGEgTlVMTCBwYWQKKwkgIGdzdF9tYXRyb3NrYV9wYXJzZV9xdWVyeSBjYW4gYmUgY2FsbGVkIGV4cGxpY2l0ZWx5IHdpdGggYSBOVUxMIHBhZC4KKwkgIElmIHdlIHJlYWNoIHRoaXMgcG9pbnQgd2l0aCBhIE5VTEwgcGFkLCBmYWlsIHRoZSBxdWVyeS4KKwkgIENvdmVyaXR5IDExMzk3MTUKKworMjAxNC0wNS0wMiAxMToyODowMSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSAgbWF0cm9za2E6IGRvIG5vdCByZXR1cm4gR1NUX0ZMT1dfT0sgaWYgd2UgZGlkIG5vdCBnZXQgYSBidWZmZXIKKwkgIENvdmVyaXR5IDExMzk3MTQgKHdoaWNoIHdpbGwgbGlrZWx5IGNvbWUgYmFjayBpbiBhbm90aGVyIGd1aXNlLAorCSAgYXMgdGhlIF9yZWFkX2luaXQgY2FsbCBjYW4gaGF2ZSBhIGZhaWxpbmcgX21hcCkKKworMjAxNC0wNS0wMiAxMToyMDozMyArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJICBtYXRyb3NrYTogY2F0Y2ggZmFpbHVyZSB0byBtYXAgYnVmZmVyCisJICBBdm9pZHMgZGVyZWZlcmVuY2luZyBOVUxMLgorCSAgQ292ZXJpdHkgMTEzOTcxMgorCisyMDE0LTA1LTAyIDEwOjUyOjQ0ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogcmVmdXNlIGNhcHMgd2l0aCBpbnZhbGlkIGZyYW1lcmF0ZQorCSAgQ292ZXJpdHkgMTEzOTcwMQorCisyMDE0LTA1LTAyIDEwOjIxOjA5ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGhhbmRsZSAwIHNpemUgcGFja2V0cyB3aXRob3V0IGRpdmlkaW5nIGJ5IDAKKwkgIENvdmVyaXR5IDExMzk2OTEKKworMjAxNC0wNS0wMiAwOTo0OTozMiArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZ3VhcmQgYWdhaW5zdCBpbnZhbGlkIGZyYW1lIHNpemUgdG8gYXZvaWQgZGl2aXNpb24gYnkgMAorCSAgQ292ZXJpdHkgMTEzOTY5MAorCisyMDE0LTA1LTAyIDA5OjQ5OjE3ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiB0cml2aWFsIHR5cG8gZml4CisKKzIwMTQtMDUtMDIgMDk6NDM6NTQgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkgIHNwZWV4ZGVjOiByZW1vdmUgZGVhZCBjb2RlCisJICBmcHAgY2FuIG5ldmVyIGVxdWFsIDAgaGVyZSwgb3IgdGhlIGxvb3Agd291bGQgbm90IGV4ZWN1dGUgYXQgYWxsLgorCSAgWmVybyBmcHAgd2FzIHBvc3NpYmxlIGJlZm9yZSBhcyB0aGUgbG9vcCBjb25kaXRpb24gd2FzIGFsbG93aW5nCisJICBpdCBzcGVjaWZpY2FsbHksIGJ1dCBubyBtb3JlLgorCSAgQ292ZXJpdHkgMTEzOTY4MQorCisyMDE0LTA1LTAyIDA5OjQxOjE5ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zczQvb3NzNC1wcm9wZXJ0eS1wcm9iZS5jOgorCSAgb3NzNDogcmVtb3ZlIGRlYWQgbWl4ZXIgY29kZQorCSAgVGhpcyB3YXMgcGFydGx5IHJlbW92ZWQgaW4gdGhlIHBvcnQgdG8gMC4xMS4gSWYgc3RpbGwgbmVlZGVkLAorCSAgaXQncyBzdGlsbCB0aGVyZSBpbiB0aGUgaGlzdG9yeS4KKwkgIENvdmVyaXR5IDExMzk2ODcKKworMjAxNC0wNS0wMiAwOTozMzo1MSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3M0L29zczQtcHJvcGVydHktcHJvYmUuYzoKKwkgIG9zczQ6IGZpeCBhIG1pc3NpbmcgdW5sb2NrIGFuZCBhIHJldHVybi1vbmx5LXdoZW4tYXNzZXJ0aW9ucy1lbmFibGVkCisJICBTcG90dGVkIG9uIHRoZSBzaWRlIHdoaWxlIGxvb2tpbmcgYXQgYW5vdGhlciBpc3N1ZS4KKworMjAxNC0wMy0wNyAxNzozMToyOSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBDb3JyZWN0bHkgbWFwIFJHQjMyIGZvcm1hdAorCSAgSW4gdjRsMiBzcGVjaWZpY2F0aW9uLCBSR0IzMiBoYXMgdGhlIGFscGhhLCBvciBwYWRpbmcsIGZpcnN0LCBub3QgbGFzdC4KKwkgIFNlZSBodHRwOi8vbGludXh0di5vcmcvZG93bmxvYWRzL3Y0bC1kdmItYXBpcy9wYWNrZWQtcmdiLmh0bWwgLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU0MDk0MQorCisyMDE0LTA0LTMwIDE4OjA2OjQwICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogcmVtb3ZlIGRlYWQgY29kZQorCSAgRm9yIDggYml0IHdpZHRoLCB3ZSBhbHdheXMgaGF2ZSBkZXB0aD09Z2RlcHRoPT13aWR0aD09OC4KKwkgIENvdmVyaXR5IDExMzk2NzgKKworMjAxNC0wNC0zMCAxNzo0ODo1MyArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIG1wZWdhdWRpb3BhcnNlOiByZW1vdmUgZGVhZCBjb2RlCisJICBBIHN0cmljZXIgY2hlY2sgaXMgYWxyZWFkeSBkb25lIGVhcmxpZXIsIGFuZCBpbnRlZ2VyIG92ZXJmbG93cworCSAgZG8gbm90IHNlZW0gcG9zc2libGUgaGVyZS4KKwkgIENvdmVyaXR5IDExMzk2NzUKKworMjAxNC0wNC0zMCAxNDo1MDo0NCArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSAgcnRwdnJhd3BheTogZ3VhcmQgYWdhaW5zdCBwYXRob2xvZ2ljYWwgIm5vIHNwYWNlIiBjb25kaXRpb24KKwkgIEV2ZW4gaWYgb25lIHdvdWwgaG9wZSBvbmUgcGl4ZWwgY2FuIGZpdCBpbiBhIE1UVSwgZW5zdXJlIHdlIGRvIG5vdAorCSAgb3ZlcndyaXRlIGEgYnVmZmVyIGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLgorCSAgU3BvdHRlZCB3aGlsZSBsb29raW5nIGF0IENvdmVyaXR5IDEyMDg3ODYKKworMjAxNC0wNC0zMCAxMTo1MjoxMCArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJICBydHBqcGVnZGVwYXk6IHNhbml0eSBjaGVjayBmb3IgTlVMTCBxdGFibGUKKwkgIENhbiBoYXBwZW4gKGF0IGxlYXN0IGluIGNyYWZ0ZWQgc3RyZWFtKQorCSAgQ292ZXJpdHkgMTIwODc3OAorCisyMDE0LTA0LTMwIDAxOjA4OjQxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBwYXNzIG9uIHRhZ3MgZnJvbSB1cHN0cmVhbSBpZiB0aGVyZSBhcmUgYW55CisJICBEb24ndCBqdXN0IGlnbm9yZSB1cHN0cmVhbSB0YWdzIGZyb20gZS5nLiBhbiBJRDMgdGFnIGJlZm9yZQorCSAgdGhlIC53YXYgZGF0YSwgcGFzcyB0aGVtIG9uIGRvd25zdHJlYW0uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI5MjIzCisKKzIwMTQtMDQtMjkgMTY6MjY6NTMgKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogb3B0aW1pemUgdGltZXIgdXBkYXRlCisJICBXaGVuIHdlIGFyZSBub3QgZG9pbmcgcmV0cmFuc21pc3Npb24sIHdlIGp1c3QgbmVlZCB0byBmaW5kIHRoZSBjdXJyZW50CisJICBzZXFudW0gc28gd2UgY2FuIHN0b3Agd2hlbiB3ZSBmb3VuZCBpdC4KKworMjAxNC0wNC0yOSAxNjoyMTo0NCArMDIwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJICBydHBqaXR0ZXJidWZmZXI6IHNtYWxsIG9wdGltaXphdGlvbnMKKwkgIFNtYWxsIG9wdGltaXphdGlvbnMgd2hlcmUgd2UgY2FuLgorCSAgQWRkIHNvbWUgbW9yZSBkZWJ1Zy4KKworMjAxNC0wNC0yOSAxNjoxNjoxNyArMDIwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBzaWduYWwgd2hlbiBuZXh0X3NlcW51bSBjaGFuZ2VkCisJICBTaWduYWwgdGhlIHB1c2hpbmcgdGhyZWFkIHdoZW4gdGhlIG5leHRfc2VxbnVtIGNoYW5nZWQgYW5kIHdlIG1pZ2h0IGJlCisJICBhYmxlIHRvIHB1c2ggYSBidWZmZXIgbm93LgorCisyMDE0LTA0LTI5IDE2OjEyOjI5ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IG9ubHkgc2lnbmFsIGV2ZW50IHdoZW4gaGVhZCBjaGFuZ2VkCisJICBBZnRlciBhZGRpbmcgYSBidWZmZXIsIG9ubHkgc2lnbmFsIHRoZSBwdXNoaW5nIHRocmVhZCB3aGVuIHRoZSBoZWFkCisJICBidWZmZXIgY2hhbmdlZCBvciBlbHNlIHdlIGNhdXNlIGEgdXNlbGVzcyB3YWtldXAuCisKKzIwMTQtMDQtMjkgMTU6Mjk6MzEgKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgcnRwaml0dGVyYnVmZmVyOiByZXdvcmsgcGFja2V0IGluc2VydAorCSAgUmV3b3JrIHRoZSBwYWNrZXQgcXVldWUgc28gdGhhdCB0aGUgbW9zdCBjb21tb24gYWN0aW9uIChpbnNlcnQgYSBwYWNrZXQKKwkgIGF0IHRoZSB0YWlsIG9mIHRoZSBxdWV1ZSkgZ29lcyB2ZXJ5IGZhc3QuCisJICBSZXBvcnQgaWYgYSBwYWNrZXQgd2FzIGluc2VydGVkIGF0IHRoZSBoZWFkIGluc3RlYWQgb2YgdGhlIHRhaWwgc28gdGhhdAorCSAgd2UgY2FuIGtub3cgd2hlbiB0byByZXRyeSBfcG9wIG9yIF9wZWVrLgorCisyMDE0LTA0LTI4IDE0OjQxOjEwICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSAgcnRwdnJhdzogdXNlIHBsYW5lIHBvaW50ZXJzIHdoZW4gbmVlZGVkCisJICBQYWNrL3VucGFjayBwbGFuYXIgZm9ybWF0cyB0by9mcm9tIHRoZSBmaXJzdCBwbGFuZS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjkwNTgKKworMjAxNC0wNC0yOCAwOTo0NzoxMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmg6CisJICBzb3VwaHR0cHNyYzogUmVtZW1iZXIgaWYgYSByZWRpcmVjdCBpcyBwZXJtYW5lbnQgb3Igbm90IGFuZCBzdG9yZSBpdCBpbiB0aGUgcXVlcnkKKworMjAxNC0wNC0yNyAyMTo1NzozMSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9nb29tL2NvbmZpZ19wYXJhbS5jOgorCSAgZ29vbTogUmVtb3ZlIGZyZW5jaCBjb21tZW50IHNheWluZyB0byBwcmVmaXggZnVuY3Rpb25zCisJICBBbGwgbm9uLXN0YXRpYyBmdW5jdGlvbiBpbiB0aGlzIGZpbGUgYXJlIGFscmVhZHkgcHJlZml4ZWQgd2l0aCBnb29tXy4KKworMjAxNC0wNC0yOCAwMDoyMDo0NyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2dvb20vZmlsdGVycy5jOgorCSAgZ29vbTogZml4IGNvbXBpbGF0aW9uIG9uIGlvcy1hcm03LTEwLjkgYW5kIG9zeC14ODZfNjQKKwkgIHVpbnQgaXMgbm90IGEgc3RhbmRhcmQgdHlwZSwgYW5kIHRoZSByZXN0IG9mIHRoZSBjb2RlIHVzZXMKKwkgIFVpbnQgd2hpY2ggaXMgbG9jYWxseSB0eXBlZGVmZWQgdG8gdW5zaWduZWQgaW50LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyOTA2NworCisyMDE0LTA0LTI3IDE4OjI5OjExIC0wNDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzQGRlYmV0aGVuY291cnQuY29tPgorCisJKiBnc3QvZ29vbS9maWx0ZXJzLmM6CisJICBnb29tOiBmaXggdW5kZWZpbmVkIGJlaGF2aW91ciBvZiBsZWZ0LXNoaWZ0CisJICBEb24ndCBsZWZ0LXNoaWZ0IGludG8gdGhlIHNpZ24gYml0LCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZCBhbmQgcG90ZW50aWFsbHkKKwkgIGFuIG92ZXJmbG93IGNvdWxkIGZsaXAgdGhlIHNpZ24uCisKKzIwMTQtMDQtMjYgMjA6NTE6MzYgLTA0MDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNAZGViZXRoZW5jb3VydC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogY2hlY2sgcmV0dXJuIGZyb20gcXRfZGVtdXhfdmlkZW9fY2FwcworCSAgTm93IHF0ZGVtdXhfdmlkZW9fY2FwcygpIGNhbiByZXR1cm4gTlVMTC4gV2UgbmVlZCB0byBjaGVjayB0aGlzIHJldHVybiBiZWZvcmUKKwkgIHVzaW5nIGl0J3MgdmFsdWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI4OTg3CisKKzIwMTQtMDQtMjYgMjM6MzU6MTcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bW9vdnJlY292ZXIuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXgtZG9jLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBidmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2cGF5LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkgIGRvY3M6IHJlbW92ZSBvdXRkYXRlZCBhbmQgcG9pbnRsZXNzICdMYXN0IHJldmlld2VkJyBsaW5lcyBmcm9tIGRvY3MKKwkgIFRoZXkgYXJlIHZlcnkgY29uZnVzaW5nIGZvciBwZW9wbGUsIGFuZCBtb3JlIG9mdGVuIHRoYW4gbm90CisJICBhbHNvIGp1c3Qgbm90IHZlcnkgYWNjdXJhdGUuIFNlZWluZyAnbGFzdCByZXZpZXdlZDogMjAwNScgaW4KKwkgIHlvdXIgZG9jcyBpcyBub3QgdmVyeSBjb25maWRlbmNlLWluc3BpcmluZy4gTGV0J3MganVzdCByZW1vdmUKKwkgIHRob3NlIGNvbW1lbnRzLgorCisyMDE0LTA0LTI1IDE3OjU4OjQyIC0wNDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzQGRlYmV0aGVuY291cnQuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGluaXRpYWxpemUgY2FwcyBwb2ludGVyIHRvIG51bGwKKwkgIE1ha2Ugc3VyZSB0aGUgY2FwcyBwb2ludGVyIHJldHVybnMgaW5pdGlhbGl6ZWQgd2hlbiB1c2luZyBpdCBpbgorCSAgcXRkZW11eF9wYXJzZV90cmVlICgpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyODk4NworCisyMDE0LTA0LTIyIDE3OjA3OjM4ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IENsZWFyIGxhc3RfcHQgb24gZmx1c2gtc3RvcC4KKwkgIE90aGVyd2lzZSwgd2UgZG9uJ3QgcmVjaGVjayB0aGUgYnVmZmVyIGNhcHMgZm9yIGNsb2NrLXJhdGUKKwkgIHByb3Blcmx5IG9uIHRoZSBuZXh0IGNoYWluLgorCisyMDE0LTA0LTIyIDE3OjI5OjAyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBGaXggY29tcGlsZXIgd2FybmluZworCSAgZ3N0ZGVpbnRlcmxhY2UuYzogSW4gZnVuY3Rpb24gJ2dzdF9kZWludGVybGFjZV9vdXRwdXRfZnJhbWUnOgorCSAgZ3N0ZGVpbnRlcmxhY2UuYzoxNTM3OjU3OiBlcnJvcjogJ3BhdHRlcm4ubGVuZ3RoJyBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24gWy1XZXJyb3I9bWF5YmUtdW5pbml0aWFsaXplZF0KKwkgIFRoaXMgYWN0dWFsbHkgaXMgYWx3YXlzIGluaXRpYWxpemVkIGJlZm9yZSBpdCBpcyB1c2VkIHRoZXJlLCBidXQKKwkgIGxldCdzIGp1c3Qgc2lsZW5jZSBnY2MgaGVyZS4KKworMjAxNC0wNC0yMSAxNTo1ODo0NSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBmaXggYnVmZmVyIGxpc3QgZHJvcCBjaGVjaworCSAgV2hpbGUgcG9ydGluZyB0byAwLjExLCB0aGUgY2hlY2sgd2FzIG1pc3Rha2VubHkgbWFkZSBjb25zdGFudCwKKwkgIGluc3RlYWQgb2YgdGVzdGluZyBmb3IgdGhlIHJldHVybiB2YWx1ZSBvZiBwcm9jZXNzX2J1ZmZlcl9sb2NrZWQuCisJICBDb3Zlcml0eSAxMTM5NjYzCisKKzIwMTQtMDQtMjEgMTM6NDQ6MTUgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thOiBmaXggY29udGVudCBlbmNvZGluZyBzY29wZSB2YWxpZGl0eSBjaGVjaworCSAgSXQncyAzIGJpdHMsIGFuZCBodHRwOi8vbWF0cm9za2Eub3JnL3RlY2huaWNhbC9zcGVjcy9pbmRleC5odG1sCisJICBzYXlzIGl0IGNhbid0IGJlIDAuCisJICBDb3Zlcml0eSAxMTM5NjYwCisKKzIwMTQtMDQtMjEgMTM6MzQ6MzcgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogZml4IFBBUiBmcmFjdGlvbiBzYW5pdHkgY2hlY2sKKwkgIEl0IHdhcyBjaGVja2luZyBwYXJfbnVtIHR3aWNlLCBhbmQgbmV2ZXIgcGFyX2RlbnVtLgorCSAgQ292ZXJpdHkgMTEzOTYzNAorCisyMDE0LTA0LTIxIDEzOjMyOjQwICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpaWRwc2luazogd2FybiB3aGVuIHNldHNvY2tvcHQgZmFpbHMKKwkgIFRoaXMgZG9lc24ndCBzZWVtIHRvIGJlIGZhdGFsLCBidXQgaXQncyBnb29kIHRvIGxldCB0aGUgdXNlciBrbm93CisJICBpbiB0aGUgbG9ncy4KKwkgIENvdmVyaXR5IDExMzk2MzAKKworMjAxNC0wNC0yMSAxMzoyNzoyNCArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOgorCSAgaW50ZXJsYWNlOiBjYXRjaCBmYWlsdXJlIHRvIGNyZWF0ZSBhdWRpbyBpbmZvIGZyb20gY2FwcworCSAgQ292ZXJpdHkgMTEzOTYyNywgMTEzOTYyOAorCisyMDE0LTAzLTEzIDA5OjM3OjQ4ICswMTAwICBHw7ZyYW4gSsO2bnNzb24gPGdvcmFuam5AYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgZ3N0cnRwaDI2NHBheTogUmVzZXQgc3BzIHBwcyB2YXJpYWJsZSB3aGVuIHN0YXRlIGNoYW5nZS4KKwkgIFJlc2V0IGxhc3Rfc3BzcHBzIGFuZCBzcHMvcHBzIGFycmF5cyAgd2hlbiBzdGF0ZSB0cmFuc2l0aW9uCisJICBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjYwMTUKKworMjAxNC0wNC0xOCAxMToxMToxNCArMDIwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaDoKKwkgIGppdHRlcmJ1ZmZlcjogaW1wcm92ZSBFT1MgaGFuZGxpbmcKKwkgIE1ha2UgYSBuZXcgbWV0aG9kIHRvIGRpc2FibGUgdGhlIGppdHRlcmJ1ZmZlciBidWZmZXJpbmcuCisJICBSZXdvcmsgdGhlIHVwZGF0ZV9lc3RpbWF0ZWRfZW9zKCkgbWV0aG9kLiBDYWxjdWxhdGUgaG93IG11Y2ggdGltZQorCSAgdGhlcmUgaXMgbGVmdCB0byBwbGF5LiBJZiB3ZSBoYXZlIGxlc3MgdGhhbiB0aGUgZGVsYXkgb2YgdGhlCisJICBqaXR0ZXJidWZmZXIsIHdlIGRpc2FibGVkIGJ1ZmZlcmluZyBiZWNhdXNlIHdlIG1pZ2h0IG5ldmVyIGJlIGFibGUgdG8KKwkgIGZpbGwgdGhlIGNvbXBsZXRlIGppdHRlcmJ1ZmZlciBhZ2Fpbi4KKwkgIElmIHdlIHJlY2VpdmUgYW4gRU9TIGV2ZW50LCBkaXNhYmxlIGJ1ZmZlcmluZy4gV2Ugd2lsbCBkcmFpbiB0aGUKKwkgIGJ1ZmZlciBhbmQgZXZlbnR1YWxseSBwdXNoIHRoZSBFT1MgZXZlbnQgb3V0LgorCSAgV2hlbiB3ZSByZWFjaCB0aGUgZXN0aW1hdGVkIE5QVCB0aW1lb3V0IGFuZCB3ZSBkaWRuJ3QgcmVjZWl2ZSBhbiBFT1MKKwkgIGV2ZW50LCBtYWtlIG9uZSBhbmQgcXVldWUgaXQgc28gdGhhdCBpdCBjYW4gYmUgcHVzaGVkLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyODAxNworCisyMDE0LTA0LTE4IDEwOjIxOjI3ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjogc2VuZCByZWNvbmZpZ3VyZSB3aGVuIGludGVybmFsLXNzcmMgY2hhbmdlcworCSAgV2hlbiB0aGUgaW50ZXJuYWwtc3NyYyBwcm9wZXJ0eSBjaGFuZ2VzLCB3ZSB3YW50IHRvIHNlbmQgYSByZWNvbmZpZ3VyZQorCSAgdXBzdHJlYW0gdG8gbWFrZSBwYXlsb2FkZXJzIHVzZSB0aGUgbmV3IHN1Z2dlc3RlZCBzc3JjLgorCSAgVXNpbmcgdGhlIGludGVybmFsLXNzcmMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBTU1JDIG9mIGEgc3RyZWFtIGlzIG5vdCBhCisJICBnb29kIGlkZWEgYW5kIGRvZXNuJ3Qgd29yayB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBzZW5kZXJzLCB3ZSB3YW50IHRvCisJICBzZXQgdGhlIFNTUkMgZGlyZWN0bHkgb24gdGhlIHBheWxvYWRlcnMuIFRoZXJlZm9yZSwgZGVwcmVjYXRlIHRoaXMKKwkgIHByb3BlcnR5LgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNTM2MQorCisyMDE0LTA0LTE4IDA0OjIzOjI2ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGFzc3VtZSBhIGZ1bGwgYnVmZmVyIHdoZW4gZW9zCisJICBSZXdvcmsgdGhlIGxvZ2ljIHRvIG1ha2UgYnVmZmVyaW5nIG1lc3NhZ2VzIGEgbGl0dGxlLCBtYWtlIHN1cmUgd2UKKwkgIGRvbid0IG1ha2UgdGhlIHNhbWUgbWVzc2FnZSBtdWx0aXBsZSB0aW1lcy4KKwkgIENvbnNpZGVyIHRoZSBidWZmZXIgZnVsbCB3aGVuIEVPUyB3YXMgcmVjZWl2ZWQuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI4MDE3CisKKzIwMTQtMDQtMTcgMTg6MDc6MDkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jOgorCSAgcnRwcnR4OiBEb24ndCBmb3JnZXQgdG8gdW5tYXAgcnRwIGJ1ZmZlciBpbiB0aGUgdGVzdAorCisyMDE0LTA0LTE3IDE3OjU4OjU4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJICBydHBydHhzZW5kOiBSZXF1aXJlIGNsb2NrLXJhdGUgaW4gdGhlIGNhcHMgYW5kIGhhbmRsZSBubyBzc3JjIGluIHRoZSBjYXBzIHByb3Blcmx5CisKKzIwMTQtMDQtMTcgMTc6NDM6MTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jOgorCSAgcnRwcnR4OiBQcm92aWRlIGFuIHNzcmMgaW4gdGhlIHRlc3QKKwkgIEFuZCBpbmNyZWFzZSB0aW1lb3V0IHRvIGFsbG93IGFsbCB0ZXN0cyB0byBydW4gaW4gdmFsZ3JpbmQuCisKKzIwMTQtMDQtMTcgMTc6MzM6NDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IEZpeCBtZW1vcnkgbGVha3MgaW4gdGVzdAorCisyMDE0LTA0LTE3IDE3OjI2OjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogRml4IGh1bmRyZWRzIG9mIG1lbW9yeSBsZWFrcyBpbiB0aGUgdGVzdAorCisyMDE0LTA0LTE3IDE3OjAwOjM3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogVW5yZWYgY2xvY2sgaWQgd2hlbiB3YWl0aW5nIGZvciB0aGUgY2xvY2sgaXMgaW50ZXJydXB0ZWQKKworMjAxNC0wNC0xNyAxNjozOTo1OSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwY29sbGlzaW9uLmM6CisJICBydHBjb2xsaXNpb246IEZpeCBtZW1vcnkgbGVha3MgaW4gdW5pdCB0ZXN0CisKKzIwMTQtMDQtMTYgMjE6NDA6NDUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBuYW1lIGNvbGxlY3RwYWRzIG9iamVjdCBiYXNlZCBvbiB2aWRlb21peGVyIG5hbWUKKwkgIE1ha2VzIGl0IGVhc2llciB0byB0cmFjayB0aGluZ3MgaW4gZGVidWcgbG9ncyB3aGVuIHRoZXJlCisJICBhcmUgbXVsdGlwbGUgbWl4ZXJzIGFuZCBtdXhlcnMuCisKKzIwMTQtMDQtMTYgMjE6Mzc6MTIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBiZXR0ZXIgbG9nZ2luZyBvZiBpbmNvbWluZyBldmVudHMKKwkgIFRoZSBwYWQgYW5kIHBhcmVudCBuYW1lcyBhcmUgYWxyZWFkeSBsb2dnZWQgYXMgcGFydCBvZiBsb2dnaW5nCisJICB0aGUgb2JqZWN0LiBJbnN0ZWFkIGxvZyB0aGUgZnVsbCBldmVudCBkZXRhaWxzLgorCisyMDE0LTA0LTE2IDE5OjAzOjQ3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBGaXggbWVtb3J5IGxlYWsgaW4gdW5pdCB0ZXN0CisKKzIwMTQtMDQtMTYgMTg6NDk6NDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgbGV2ZWw6IFVzZSB0aGUgY29ycmVjdCBudW1iZXIgb2Ygc2FtcGxlcyB0byBpdGVyYXRlIG92ZXIgdGhlIGlucHV0IGFycmF5CisJICBGaXhlcyBpbnZhbGlkIG1lbW9yeSBhY2Nlc3NlcyBhbmQgYWNjZXNzZXMgdG8gdW5pbml0aWFsaXNlZCBkYXRhLgorCisyMDE0LTA0LTE2IDE4OjAwOjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzoKKwkgIGljeWRlbXV4OiBVbnJlZiBkcm9wcGVkIGV2ZW50cworCisyMDE0LTA0LTE2IDE3OjI5OjMwICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOgorCSAgbWF0cm9za2E6IGZpeCBjaGVjayBmb3IgYW1vdW50IG9mIGRhdGEgdG8gcmVhZAorCSAgSGlzdG9yeSBzaG93cyBsZW5ndGg9PTAgc2hvdWxkIHNldCBkYXRhIHRvIE5VTEwgYW5kIHJldHVybiwKKwkgIHNvIHdlIGRvIHRoYXQgdG9vIGluc3RlYWQgb2YgdHJ5aW5nIHRvIHJlYWQgbm90aGluZy4KKwkgIENvdmVyaXR5IDIwNjIwNQorCisyMDE0LTA0LTE2IDE3OjI1OjQ0ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogZml4IHNpZ24gY29tcGFyaXNvbgorCSAgaGlzdG9yeV9jb3VudCBpcyB1bnNpZ25lZCwgc28gdGhlIHdob2xlIGNvbXBhcmlzb24gd2lsbCBiZSBtYWRlCisJICBhcyB1bnNpZ25lZCwgYW5kIGZhaWwgdG8gcmVqZWN0IHdoYXQgaXQgd2FzIG1lYW50IHRvLgorCSAgQ292ZXJpdHkgMjA2MjA0CisKKzIwMTQtMDQtMTYgMTc6MDQ6NTAgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogcmVtb3ZlIGRlYWQgY29kZQorCSAgc3ViIG1heSBub3QgYmUgTlVMTCBpbiB0aGlzIHN3aXRjaCwgdGhlcmUgaXMgYSBiYWlsIG91dCBqdXN0CisJICBiZWZvcmUgaXQgaWYgc28uCisJICBDb3Zlcml0eSAyMDYwOTgKKworMjAxNC0wNC0xNiAxNjo1OTo0MyArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IHJlbW92ZSBkZWFkIGNvZGUKKwkgIFRoZSBibG9ja19zaXplID09IDAgd2FzIHNob3J0Y3V0IGVhcmxpZXIsIGFuZCB0aGUgdmFyaWFibGUgaXMgbm90CisJICBtb2RpZmllZCBpbiB0aGUgbWVhbnRpbWUuCisJICBDb3Zlcml0eSAyMDYwOTcKKworMjAxNC0wNC0xNiAxNjo1Njo1NCArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvY29udmVydC5jOgorCSAgdmlkZW9taXhlcjogcmVtb3ZlIGRlYWQgY29kZQorCSAgV2hpbGUgaXQgc2VlbXMgdG8ga2VlcCBhIGNvbXBpbGUgdGltZSBzZWxlY3Rpb24sIEkgdHJhY2VkIGl0CisJICB0byBzb21lIGNvZGUgY29waWVkIGZyb20gdmlkZW9jb252ZXJ0LCB3aGVyZSBpdCB3YXMgcmVtb3ZlZCwKKwkgIHdpdGggdGhlIGZvbGxvd2luZyBjb21tZW50OgorCSAgQWxzbyByZW1vdmUgdGhlIGhpZ2gtcXVhbGl0eSBJNDIwIHRvIEJHUkEgZmFzdC1wYXRoIGFzIGl0IG5lZWRzCisJICB0aGUgc2FtZSBmaXgsIHdoaWNoIGNhdXNlcyBhbiBhZGRpdGlvbmFsIGluc3RydWN0aW9uLCB3aGljaCBjYXVzZXMKKwkgIG9yYyB0byBlbWl0IG1vcmUgdGhhbiA5NiB2YXJpYWJsZXMsIHdoaWNoIHRoZW4ganVzdCBjcmFzaGVzLgorCSAgVGhpcyBjYW4gb25seSBiZSBmaXhlZCBpbiBvcmMgYnkgYnJlYWtpbmcgQUJJIGFuZCBhbGxvd2luZyBtb3JlCisJICB2YXJpYWJsZXMuCisJICBUaHVzLCBJIHJlbW92ZSBpdCBoZXJlIGFzIHdlbGwuCisJICBDb3Zlcml0eSAyMDYwNjQKKworMjAxNC0wNC0xNiAxNjo1MDozMCArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgaXNvbXA0OiBmaXggaW5jb3JyZWN0IG1hc2tpbmcgZm9yIG11bHRpcGxlIHRhZ3MKKwkgIENvdmVyaXR5IDIwNjA1OAorCisyMDE0LTA0LTE2IDE2OjQ1OjA4ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSAgaXNvbXA0OiBmaXggd3JvbmcgYXRvbSBmbGFncyBzZXQgd2hlbiBhZGRpbmcgc2FtcGxlcworCSAgQ292ZXJpdHkgMjA2MDU3CisKKzIwMTQtMDQtMTYgMTY6NDA6MDIgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSAgYXVkaW9meDogZml4IGNvbXBhcmlzb24gb2YgZGVsdGEgdGltZSB0byBhIHRocmVzaG9sZAorCSAgQ292ZXJpdHkgMjA2MDU1CisKKzIwMTQtMDQtMTYgMTY6MzI6MjYgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBkbyBub3QgcmVseSBvbiBjYWxsIGZhaWx1cmUga2VlcGluZyByZXR1cm4gZGF0YSB1bm1vZGlmaWVkCisJICBUaGlzIGlzIGNsZWFyZXIgdGhpcyB3YXkgdG9vLgorCSAgQ292ZXJpdHkgMjA2MDI5CisKKzIwMTQtMDQtMTYgMTY6Mjg6NDkgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L2F0b21zcmVjb3ZlcnkuYzoKKwkgIGlzb21wNDogY2F0Y2ggZnNlZWsgZXJyb3IKKwkgIENvdmVyaXR5IDIwNjAyOAorCisyMDE0LTA0LTE2IDE2OjI1OjQ0ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSAgaXNvbXA0OiByZXBvcnQgZmFpbHVyZXMgdG8gY2FsbGVyCisJICBDb3Zlcml0eSAyMDYwMjcKKworMjAxNC0wNC0xNiAxODowNTo0NiArMDIwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiByZWZ1c2Ugc2VyaWFsaWVkIHF1ZXJ5IHdoZW4gYnVmZmVyaW5nCisJICBXaGVuIHdlIGFyZSBidWZmZXJpbmcsIHdlIGNhbid0IGJsb2NrIGFuZCB3YWl0IGZvciB0aGUgc2VyaWFsaXplZCBxdWVyeQorCSAgdG8gY29tcGxldGUgYmVjYXVzZSB0aGUgaml0dGVyYnVmZmVyIHdpbGwgbm90IHRyeSB0byBmb3J3YXJkIHRoZSBxdWVyeQorCSAgd2hpbGUgYnVmZmVyaW5nLiBJbnN0ZWFkLCBqdXN0IHJlZnVzZSB0aGUgcXVlcnkuCisKKzIwMTQtMDQtMTYgMTY6NTE6MTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogZG9uJ3QgZnJlZSB0aGUgc2VyaWFsaXplZCBxdWVyeQorCSAgV2Ugc2hvdWxkIG5ldmVyIGZyZWUgYSBzZXJpYWxpemVkIHF1ZXJ5IGluIHRoZSBxdWV1ZSwgaXQgaXMgdGhlIHVwc3RyZWFtCisJICBjYWxsZXIgdGhhdCB3aWxsIGZyZWUgaXQuCisKKzIwMTQtMDQtMTYgMTc6MzU6NDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogRml4IG1lbW9yeSBsZWFrIGluIHRoZSB0ZXN0CisKKzIwMTQtMDQtMTYgMTc6MzM6NDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBDcmVhdGUgaGFzaHRhYmxlIG9ubHkgd2hlbiB3ZSBhY3R1YWxseSB1c2UgaXQKKwkgIEluIGVycm9yIGNhc2VzIHdlIHByZXZpb3VzbHkgcmV0dXJuZWQgd2l0aG91dCBmcmVlaW5nIGl0LgorCisyMDE0LTA0LTE2IDE3OjMwOjU5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogQ2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzcycgZGlzcG9zZSBmdW5jdGlvbgorCisyMDE0LTA0LTE2IDE3OjIzOjI3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogSW5pdGlhbGlzZSBpb2N0bCBzdHJ1Y3Qgd2l0aCB6ZXJvZXMgYmVmb3JlIHBhc3NpbmcgaXQgdG8gaW9jdGwoKQorCisyMDE0LTA0LTE2IDEzOjQ3OjQzICswMjAwICBNYXJjIExlZW1hbiA8bWFyYy5sZWVtYW5AZ21haWwuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBjb3JyZWN0IExPRyBtc2cgZm9yIC0xCisJICBTaWduZWQtb2ZmLWJ5OiBNYXJjIExlZW1hbiA8bWFyYy5sZWVtYW5AZ21haWwuY29tPgorCisyMDE0LTA0LTE1IDIxOjM2OjMwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJICBpbnRlcmxlYXZlOiBGaXggbmVnb3RpYXRpb24gdG8gd29yayBhdCBhbGwgYWdhaW4KKwkgIFRoZSBjYXBzIHF1ZXJ5IGhhbmRsaW5nIGZ1bmN0aW9uIGZvciB0aGUgc2lua3BhZHMgd2FzIGNhbGxlZCBmb3IKKwkgIHRoZSBzcmNwYWQsIGFuZCB0aGUgc2lua3BhZHMgaGFkIG5vbmUuIFRoaXMgY29tbWl0IG1vdmVzIGl0IHRvIHRoZQorCSAgcmlnaHQgcGFkLCBidXQgbm9uZXRoZWxlc3MgdGhlIG5lZ290aWF0aW9uIHN0aWxsIGxvb2tzIHdyb25nLgorCSAgVGhpcyBtYWtlcyB0aGUgdGVzdCBwYXNzIGFnYWluIGFmdGVyIHRoZSByZWNlbnQgY292ZXJpdHkgZml4CisJICBhbmQgYWxzbyBhbGxvd3MgaW50ZXJsZWF2ZSB0byB3b3JrIGFnYWluLCBidXQgc29tZW9uZSBzaG91bGQKKwkgIHJlYWxseSByZXZpZXcgdGhlIG5lZ290aWF0aW9uIGNvZGUgYW5kIGZpeCBpdC4KKworMjAxNC0wNC0xMyAwOTowMzo0MSArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy9vc3M0L29zczQtYXVkaW8uYzoKKwkgIG9zczQ6IE1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIHN1cHBvcnQgaXMgOAorCSAgQXZvaWRzIGRvaW5nIHBvdGVudGlhbCBvdmVyd3JpdGVzIGluIGNoX2xheW91dCAod2hpY2ggb25seSBoYXMgOAorCSAgZmllbGRzKS4KKwkgIENJRCAjMTEzOTgyNgorCisyMDE0LTA0LTEyIDIyOjE2OjM3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IFNldCByYW5rIHRvIE1BUkdJTkFMCisJICBJZiBhdmFpbGFibGUgd2UgcHJlZmVyIHVzaW5nIGdsaW1hZ2VzaW5rIG92ZXIgb3N4dmlkZW9zaW5rLiBJdCBzdXBwb3J0cworCSAgbW9yZSBmb3JtYXRzIGFuZCBpbiBnZW5lcmFsIGhhcyBtb3JlIGZlYXR1cmVzIHRoYW4gb3N4dmlkZW9zaW5rLgorCisyMDE0LTA0LTExIDE4OjE5OjQ5ICswMjAwICBKb3NlcCBUb3JyYSA8bjc3MGdhbGF4eUBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICBydHBoMjY0ZGVwYXk6IG9ubHkgZ3Vlc3MgQVUgYm91bmRhcmllcyB3aGVuIGFyZW4ndCBpbmRpY2F0ZWQgYnkgbWFya2VyCisJICBUaGUgbWFya2VyIGJpdCBpc24ndCBtYW5kYXRvcnkgYW5kIHdlIGhhZCBpbiBwbGFjZSBjb2RlIHRvIGd1ZXNzIEFVCisJICBib3VuZGFyaWVzIGJ5IGRldGVjdGluZyBhIG5ldyBwaWN0dXJlIHN0YXJ0LiBUaGlzIGd1ZXNzaW5nIGNvZGUKKwkgIGRpZG4ndCB3b3JrIHdpdGggaW50ZXJsYWNlZCBjb250ZW50IHRoYXQgaGFzIHByb3BlciBtYXJrZXIgYml0cworCSAgdG8gaW5kaWNhdGUgdGhlIEFVIGJvdW5kYXJpZXMuIEl0IHdhcyBsZWFraW5nIHRoZSBmaXJzdCBmaWVsZCBidWZmZXIKKwkgIGFuZCBwcm9kdWNpbmcgYSBjb3JydXB0ZWQgb3V0cHV0LgorCSAgZml4ZXM6IGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjgwNDEKKworMjAxNC0wNC0xMCAxMDozODoxOSAtMDMwMCAgUmFmYcWCIE11xbx5xYJvIDxnYWx0Z2VuZG9AbzIucGw+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJICBwbmdkZWM6IGVuYWJsZSBsaWJwbmcgaW50ZXJsYWNlZCBwaWN0dXJlIGhhbmRsaW5nCisJICBNYWtlcyBsaWJwbmcgZGVpbnRlcmxhY2UgQWRhbTcgaW50ZXJsYWNlZCBwaWN0dXJlcworCSAgYnkgZGVmYXVsdC4gSXQgaXMgdGhlIG9ubHkgaW50ZXJsYWNlZCBmb3JtYXQgYXZhaWxhYmxlCisJICBhbmQgaWYgdGhlIHBpY3R1cmUgaXNuJ3QgaW50ZXJsYWNlZCB0aGUgY29kZSBzaG91bGQgYmVoYXZlCisJICBhcyBiZWZvcmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI2MTYxCisKKzIwMTQtMDQtMTEgMTM6Mjc6NDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogT25seSBrZWVwLWFsaXZlIHRoZSBjb25uZWN0aW9uIGluIHN0b3AoKSBpZiB3ZSBoYXZlIGZpbmlzaGVkIGFsbCBwcmV2aW91cyBtZXNzYWdlcworCSAgQWZ0ZXIgY2FuY2VsbGluZyBhIHJlcXVlc3Qgd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbi4KKworMjAxNC0wNC0xMSAxMTo1NDoxMiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJICBkdmRlYzogRG9uJ3Qgc2V0IGJvZ3VzIHRpbWVzdGFtcC9kdXJhdGlvbgorCSAgVGhpcyB3aWxsIGhhcHBlbiBpZiB3ZSBoYXZlIGFuIGluY29taW5nIHN0cmVhbSB3aXRoIGEgbm9uLVRJTUUgc2VnbWVudAorCSAgQ291bGQgYmUgaW1wcm92ZWQgbGF0ZXIgdG8gZmlndXJlIG91dCBwcm9wZXIgcHRzL2R1cmF0aW9uLgorCSAgQ0lEICMxMTk5NzAyCisJICBDSUQgIzExOTk3MDMKKworMjAxNC0wNC0xMSAxMTo1Mzo0MiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJICBkdmRlYzogUHJvcGVybHkgcmVmdXNlIGluY29taW5nIHN0cmVhbSB3aXRob3V0IGZyYW1lcmF0ZQorCSAgVGhlIHJldHVybiB2YWx1ZSB3YXNuJ3QgcHJvcGVybHkgcHJvcGFnYXRlZCBiYWNrIGlmIHRoZSBjYXBzCisJICBkaWRuJ3QgY29udGFpbiBhIGZyYW1lcmF0ZQorCisyMDE0LTA0LTEwIDE2OjM1OjI4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IEFsc28gcmV0cnkgb24gdW5leHBlY3RlZCBuZXR3b3JrIGZhaWx1cmVzCisKKzIwMTQtMDQtMTAgMTU6NDU6NDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IE5ldyBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGJlZm9yZSB3ZSBnaXZlIHVwCisKKzIwMTQtMDMtMTMgMTA6NTY6MTEgKzAxMDAgIEFsZXhhbmRlciBaYWxsZXNvdiA8emFsbGVzb3ZAZ21haWwuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IENoYW5nZSBkZWZhdWx0IHRpbWVvdXQgdG8gMTUgc2Vjb25kcworCSAgSWYgbm90aGluZyBoYXBwZW5zIGFmdGVyIDE1IHNlY29uZHMsIGNoYW5jZXMgYXJlIGdvb2QgdGhhdAorCSAgb3VyIGNvbm5lY3Rpb24gd2lsbCBuZXZlciB3aWxsIHdvcmsuIFN0b3AgYWZ0ZXIgMTUgc2Vjb25kcworCSAgaW5zdGVhZCBvZiB3YWl0aW5nIHVudGlsIHRoZSBzeXN0ZW0ncyBkZWZhdWx0IHRpbWVvdXQsIHdoaWNoCisJICBjYW4gYmUgPiAxIG1pbnV0ZS4KKworMjAxNC0wNC0wOSAxNzozMDo1NCArMDkwMCAgSmltbXkgT2huIDx5b25namluLm9obkBsZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJlcGxhY2UgZHVwbGljYXRlZCB2YXJpYWJsZSB3aGVuIHBhcnNpbmcgdHJleCBhdG9tCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI3ODc4CisKKzIwMTQtMDQtMDkgMTA6NTY6MjkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogVXNlIEdTVF9GTE9XX0ZMVVNISU5HIHdoZW4gZmx1c2hpbmcsIG5vdCBHU1RfRkxPV19FT1MKKwkgIC4uLiBhbmQgcmVzZXQgaXQgcHJvcGVybHkgYWZ0ZXIgZmx1c2hpbmcgaXMgZG9uZS4gRml4ZXMgcGxheWJhY2sKKwkgIGluIG1hbnkgY2FzZXMgd2hlbiBidWZmZXJpbmcgaXMgdXNlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mjc4MjEKKworMjAxNC0wNC0wOSAwODo1ODowNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBQcm9wZXJseSByZXR1cm4gc3RyZWFtIGZsYWdzIHdoZW4gcGFyc2luZyB0cmV4IGF0b20KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mjc4NjcKKworMjAxNC0wMy0xOSAxOToxODoxMSArMDAwMCAgTWF0dGhpZXUgQm91cm9uIDxtYXR0aGlldS5ib3Vyb25AY29sbGFib3JhLmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiB1c2UgdGhlIHZpZGVvIGZyYW1lIEFQSSBpbnN0ZWFkIG9mIHRoZSB2aWRlbyBtZXRhIEFQSQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNjczOAorCisyMDE0LTAzLTE5IDE4OjQ3OjM5ICswMDAwICBNYXR0aGlldSBCb3Vyb24gPG1hdHRoaWV1LmJvdXJvbkBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IGFkdmVydGl6ZSB2aWRlbyBtZXRhIEFQSSBzdXBwb3J0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI2NzM3CisKKzIwMTQtMDQtMDggMTE6MzE6MDYgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJICBpbnRlcmxlYXZlOiBBZGQgbWlzc2luZyBicmVhayBpbiBzd2l0Y2ggc3RhdGVtZW50CisJICBUaGUgY2FwcyBxdWVyeSBpcyBoYW5kbGVkIGVudGlyZWx5IGFscmVhZHkgYmVmb3JlLgorCSAgQ0lEICMxMTM5NzU3CisKKzIwMTQtMDQtMDYgMTg6MDM6MTEgLTAzMDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHIudmVyZGVqb0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSAgdGVzdHM6IHNvdXBodHRwc3JjOiB1c2UgU291cEtub3duU3RhdHVzQ29kZSBpZiBuZWVkZWQKKwkgIEZyb20gbGlic291cCBkb2NzOgorCSAgUHJpb3IgdG8gMi40NCBTb3VwU3RhdHVzIHdhcyBjYWxsZWQgU291cEtub3duU3RhdHVzQ29kZSwKKwkgIGJ1dCB0aGUgaW5kaXZpZHVhbCB2YWx1ZXMgaGF2ZSBhbHdheXMgaGFkIHRoZSBuYW1lcyB0aGV5CisJICBoYXZlIG5vdy4KKwkgIEZpeGVzOgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNzMyOQorCisyMDE0LTA0LTA3IDEyOjU4OjIzICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHVzZSBmcmFtZXMsIG5vdCBieXRlcywgZm9yIHBvc2l0aW9uIHF1ZXJ5IGluIFZCUiBzdHJlYW1zCisJICBDb3Zlcml0eSAxMTM5NjQ4CisKKzIwMTQtMDQtMDcgMTI6NDI6MTQgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzoKKwkgIHNtcHRlOiBmaXggY29weS9wYXN0ZSBlcnJvciBjYXVzaW5nIHVubWFwIG9uIHdyb25nIGJ1ZmZlcgorCSAgQ292ZXJpdHkgMTEzOTY0NworCisyMDE0LTA0LTA3IDEyOjE2OjE3ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogZ3VhcmQgYWdhaW5zdCBmaW5kaW5nIG5vIHN1aXRhYmxlIHBhdHRlcm4KKwkgIFRoZSBjb2RlIGhhbmRsZXMgYSAtMSBwYXR0ZXJuIGluZGV4LCBhbmQgaXQgc2VlbXMgcGxhdXNpYmxlCisJICB0aGF0IGEgcGF0dGVybiBtaWdodCBiZSBmb3VuZCBsYXRlciwgc28gaXQgc2VlbXMgYmVzdCB0byBub3QKKwkgIHNlbmQgYW4gZWxlbWVudCBlcnJvciBoZXJlLgorCSAgQ292ZXJpdHkgMTEzOTc2NgorCisyMDE0LTA0LTA0IDE3OjM4OjE0ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogdXBkYXRlIGZvciBuZXcgTUlLRVkgQVBJCisKKzIwMTQtMDQtMDMgMTc6NDA6MDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBzZW5kIHNlbmRlciBTU1JDIGluIHRoZSBNSUtFWSBtZXNzYWdlCisJICBBbGxvY2F0ZSBhIG5ldyBTU1JDIGZvciBvdXIgUlRDUCBtZXNzYWdlcyBiYWNrIHRvIHRoZSBzZXJ2ZXIgYW5kIHNldAorCSAgdGhpcyBpbiB0aGUgTUlLRVkgbWVzc2FnZS4KKworMjAxNC0wNC0wMyAxNzozOTozMCArMDIwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IG1ha2UgcmFuZG9tIG51bWJlciBmb3IgdGhlIENTQgorCSAgQXMgcmVjb21tZW5kZWQgaW4gdGhlIFJGQworCisyMDE0LTAzLTI2IDEyOjEwOjQ0ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZG9uJ3QgcHV0IHNwYWNlcyBpbiBrZXltZ210IGhlYWRlcgorCisyMDE0LTAzLTI1IDE3OjQ3OjQ5ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogY3JlYXRlIGFuZCBzZW5kIHRoZSBSVENQIGVuY3J5cHRpb24ga2V5CisJICBDcmVhdGUgYW5kIG1ha2UgYSBrZXkgZm9yIGVuY3J5cHRpbmcgdGhlIFJUQ1AgcGFja2V0cyBiYWNrIHRvIHRoZSBzZXJ2ZXIKKwkgIGFuZCB3cmFwIHRoaXMgaW4gYSBNSUtFWSBtZXNzYWdlIHRoYXQgd2Ugc2VuZCBhcyBhIGhlYWRlciBpbiB0aGUgU0VUVVAKKwkgIHJlcXVlc3QuCisKKzIwMTQtMDQtMDMgMTI6MTg6MzkgKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmcmVlIHRoZSBzcnRwZGVjIGVsZW1lbnQKKworMjAxNC0wNC0wMyAxMjoxNjoyNSArMDIwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGNsZWFudXAgc3RyZWFtX2ZyZWUgZnVuY3Rpb24KKwkgIFRoZXJlIGlzIG5vIHJlYXNvbiB0byBOVUxMIGFsbCBmaWVsZHMsIHdlIHdpbGwgZnJlZSB0aGUgc3RyZWFtIGFueXdheS4KKworMjAxNC0wNC0wMyAxMjowNzozMSArMDIwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBkZW1vdGUgd2FybmluZyB0byBkZWJ1ZworCSAgRm9yIFRDUCwgaXQgaXMgbm9ybWFsIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0aW1lc3RhbXBzIHNvIGRvbid0IFdBUk4gb24KKwkgIGl0LgorCisyMDE0LTAzLTI5IDE5OjEzOjA2IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDI6IEZpeCBzdXBwb3J0IGZvciBjYXBzIHdpdGhvdXQgd2lkdGgsIGhlaWdodCwgZnJhbWVyYXRlIG9yIGZvcm1hdAorCSAgRm9yIGZvcm1hdCBsaWtlIG1wZWd0cywgd2lkdGggYW5kIGhlaWdodCBpcyByYXJlbHkgaW4gdGhlIG5lZ290aWF0ZWQgY2Fwcy4gVGhpcworCSAgcGF0Y2ggZml4ZXMgZmFpbHVyZSB3aGVuIHNldHRpbmcgZm9ybWF0LCBhbmQgcHJldmVudCBpbnRyb2R1Y2luZyB3aWR0aCwgaGVpZ2h0LAorCSAgZnJhbWVyYXRlIGFuZCBmb3JtYXQgdG8gdGhlIGNhcHMgd2hlbiBmaXhhdGluZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjU4NjAKKworMjAxNC0wMy0zMSAxODozNDoxMyArMDIwMCAgVGhpYmF1bHQgU2F1bmllciA8dHNhdW5pZXJAZ25vbWUub3JnPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogQWx3YXlzIHNldCBQVFM9RFRTIG9uIHJhdyB2aWRlbyBzdHJlYW1zCisKKzIwMTQtMDMtMzEgMTg6MzE6MjIgKzAyMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRzYXVuaWVyQGdub21lLm9yZz4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IEFsd2F5cyBzZXQgcGl4ZWwtYXNwZWN0LXJhdGlvIG9uIHJhdyB2aWRlbyBzdHJlYW1zCisJICBUaGF0IGZpZWxkIGlzIG1hbmRhdG9yeSBpbiBjYXBzIGFuZCBpZiBpdCBpcyBub3QgcHJlc2VudCBpbiB0aGUKKwkgIEFWSSBjb250YWluZXIsIGl0IG1lYW5zIHNxdWFyZSBwaXhlbHMgdGh1cyAxLzEuCisKKzIwMTQtMDMtMzAgMDA6MzU6MDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thLW11eDogYWRkIG1hcHBpbmcgZm9yIE9wdXMgYXVkaW8KKwkgIE1pZ2h0IHdhbnQgdG8gY29uc2lkZXIgYWRkaW5nIGNoYW5uZWxzL3JhdGUKKwkgIHJlcXVpcmVtZW50IHRvIHRlbXBsYXRlIGNhcHMsIGJ1dCByZXF1aXJlcworCSAgZml4aW5nIHVwIG9mIGVuY29kZXIgYW5kIHBhcnNlciBmaXJzdC4KKworMjAxNC0wMy0zMCAwMDozMToxMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICBtYXRyb3NrYS1kZW11eDogYWRkIG1hcHBpbmcgZm9yIE9wdXMgYXVkaW8gY29kZWMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjczMDUKKworMjAxNC0wMy0yOSAxNzoyMToxNyAtMDQwMCAgV2lsbGlhbSBNYW5sZXkgPHdpbGxAd2lsbGlhbW1hbmxleS5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJzcmM6IEZpeCBzdXBwb3J0IGZvciBtcGVndHMgc3RyZWFtcworCSAgSXQgc2VlbXMgdGhhdCBHU3RyZWFtZXIncyBtcGVndHMgZWxlbWVudHMgKHRzZGVtdXgsIHRzcGFyc2UpIHJlcXVpcmUgY2FwcworCSAgYHZpZGVvL21wZWd0cyxzeXN0ZW1zdHJlYW09dHJ1ZWAuICBBcyBmYXIgYXMgSSBjYW4gc2VlIHRoZSBzaWduaWZpY2FuY2UKKwkgIG9mIHN5c3RlbXN0cmVhbSBpcyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgYSBjb250YWluZXIgZm9ybWF0IHJhdGhlciB0aGFuCisJICBhbiBlbGVtZW50YXJ5IHN0cmVhbS4gIEFzIHRoaXMgaXMgdGhlIGNhc2UgKGFuZCBJIGNhbid0IHVuZGVyc3RhbmQgaG93IGl0CisJICBjb3VsZCBub3QgYmUgdGhlIGNhc2Ugd2l0aCBtcGVndHMpIEkgYWRkIHN5c3RlbXN0cmVhbT10cnVlIHRvIHY0bDJzcmMncworCSAgY2Fwcy4KKwkgIFRoaXMgYWxsb3dzIHY0bDJzcmMgdG8gYmUgbGlua2VkIHdpdGggdHNkZW11eCBmb3IgcGxheWJhY2sgZnJvbSBteQorCSAgSGF1cHBhdWdlIEhELVBWUiB3aXRoIHRoZSBwaXBlbGluZToKKwkgIHY0bDJzcmMgISBxdWV1ZSAhIHRzZGVtdXggISB2aWRlby94LWgyNjQgISBkZWNvZGViaW4gISB4dmltYWdlc2luaworCSAgSW4gY29tYmluYXRpb24gd2l0aCB0aGUgbmV4dCBjb21taXQgdGhpcyBmaXhlcyB1c2luZyBIYXVwcGF1Z2UgSEQtUFZSIHdpdGgKKwkgIEdTdHJlYW1lciAxLjArLgorCisyMDE0LTAxLTE0IDE0OjQ4OjQyICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSAgdjRsMjogYXR0ZW1wdCB0byBmaXggaW5maW5pdGUgKGZvciBzbWFsbCB2ZXJzaW9uIG9mIGluZmluaXRlKSBsb29wCisKKzIwMTQtMDMtMjkgMTM6MjA6MzAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwbWFuYWdlcjogY29weSBzdGlja3kgZXZlbnRzIHdoZW4gZXhwb3NpbmcgcGFkcyBpbiBtb3JlIHBsYWNlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNDcxMgorCisyMDE0LTAzLTI4IDIwOjExOjM2ICswMTAwICBSaWNvIFR6c2NoaWNoaG9seiA8cmljb3R6QHVidW50dS5jb20+CisKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSAgdjRsMjogZml4IGRpc3RjaGVjaworCSAgTWFrZSBzdXJlIGV4dC8qLmggYXJlIGRpc3QnZWQKKworMjAxNC0wMy0yNyAxOTo1MTo1MCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHhpbWFnZXNyYzogb25seSBleHRyYXBvbGF0ZSBhbHBoYSBtYXNrIGZvciAzMi1iaXQgZGVwdGgKKwkgIEluc3RlYWQgb2YgcGFzc2luZyBib2d1cyBhbHBoYSBtYXNrIHZhbHVlcyB3aGVuIHRoZXJlJ3Mgbm8gYWxwaGEuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI2ODMzCisKKzIwMTQtMDMtMjEgMTM6MDM6MTcgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHhpbWFnZXNyYzogQWRkIEFSR0IvQkdSQSBzdXBwb3J0CisKKzIwMTQtMDMtMjAgMTU6Mjg6MjYgKzAxMDAgIE9nbnlhbiBUb25jaGV2IDxvZ255YW5AYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAganBlZ3BheTogY29uc2lkZXIgaGVhZGVyIGxlbiB3aGVuIGNhbGN1bGF0aW5nIHBheWxvYWQgbGVuCisJICBGaXhlZCBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI2Nzc3CisKKzIwMTQtMDMtMjYgMDg6MDM6MjIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IEFsbCBmcmFtZXMgYXJlIHN5bmMgcG9pbnRzCisKKzIwMTQtMDMtMjYgMDg6MDI6NDMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJICBwbmdkZWM6IEFsbCBmcmFtZXMgYXJlIHN5bmMgcG9pbnRzCisKKzIwMTQtMDMtMjIgMTc6MDc6NDYgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBzZWdtZW50IGNsb3Npbmcgbm90IG5lZWRlZCBpbiAxLngKKwkgIC4uLiBhcyBzZW5kZXIgc2hvdWxkIGtlZXAgdHJhY2sgb2Ygc2VnbWVudCBiYXNlIGFjY3VtdWxhdGlvbi4KKwkgIFJhdGhlciwgaXQgbWF5IGhhdmUgc29tZSBhZHZlcnNlIGVmZmVjdHMgYXMgYSBzcHVyaW91cyBzZWdtZW50IGV2ZW50LAorCSAgZS5nLiBpbiBjb2xsZWN0cGFkcy4KKworMjAxNC0wMy0yMiAxNzowNToxNyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGVhcmx5IHNlbmRpbmcgcGVuZGluZyBjb2RlYy1kYXRhIGZvciBhbGwgc3RyZWFtcworCSAgLi4uIGF0IGxlYXN0IGJlZm9yZSBzeW5jaW5nIGFjcm9zcyBhbGwgc3RyZWFtcyBtaWdodCBjYXVzZSBzb21lIGdhcAorCSAgYWN0aXZpdHkgb24gYW55IG9mIHRob3NlIHN0cmVhbXMsIG5vdGFibHkgc3BhcnNlIHN0cmVhbXMuCisJICBTZWUgYWxzbyAjNzEyMTM0CisKKzIwMTQtMDMtMjIgMTc6MDE6MjcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGhhbmRsZSBib3RoIHN0aWNreSBhbmQgbm9uLXN0aWNreSBjdXN0b20gZXZlbnQKKworMjAxNC0wMy0yNSAxMTo0NDoyNyArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IG9ubHkgZXhwb3NlIHN0cmVhbXMgb24gZGF0YWZsb3cKKwkgIE9ubHkgcHJvYmUgb24gYnVmZmVycywgd2UgZG9uJ3Qgd2FudCB0byBleHBvc2UgdGhlIHN0cmVhbXMgb24gZXZlbnRzLgorCisyMDE0LTAzLTI1IDExOjM2OjQwICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBjb3B5IHN0aWNreSBldmVudHMgdG8gZ2hvc3RwYWQKKwkgIFdoZW4gd2UgZXhwb3NlIGludGVybmFsIHBhZHMgYXMgZ2hvc3RwYWRzLCBmaXJzdCBjb3B5IHRoZSBzdGlja3kgZXZlbnRzCisJICBzbyB0aGF0IHdlIGhhdmUgdGhlIGNhcHMgYW5kIHNlZ21lbnQgZXRjLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNDcxMgorCisyMDE0LTAzLTI0IDE0OjI1OjQzICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogc3J0cCBoYW5kbGluZworCisyMDE0LTAzLTI1IDEwOjIzOjAwICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogc2V0IFNTUkMgb24gY2FwcyBpZiBrbm93bgorCisyMDE0LTAzLTI0IDE2OjU4OjI1ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcHV0IGNhcHMgb24gdWRwc3JjIGluc3RlYWQgb2YgdXNpbmcgdGhlIHNpZ25hbHMKKwkgIFRyeSB0byBhdm9pZCB1c2luZyB0aGUgcmVxdWVzdC1wdC1tYXAgdG8gZ2V0IGNhcHMgYnV0IHNldCB0aGVtIGRpcmVjdGx5CisJICBvbiB0aGUgdWRwc3JjIGVsZW1lbnQuIFRoYXQgd2F5LCB0aGUgY2FwcyBnZXQgbmljZWx5IHRyYW5zZm9ybWVkIGFzIHRoZXkKKwkgIHBhc3MgdGhyb3VnaCB0aGUgZGlmZmVyZW50IGVsZW1lbnRzIGluIHRoZSBydHBiaW4sIGluY2x1ZGluZyB0aGUgQVVYIGFuZAorCSAgZGVjb2Rlci9lbmNvZGVyIGVsZW1lbnRzLgorCisyMDE0LTAzLTI0IDE1OjM1OjA5ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogdXNlIHByb2ZpbGUgdG8gc2V0IHJ0Y3AgY2FwcworCSAgVXNlIHRoZSBuZWdvdGlhdGVkIHByb2ZpbGUgdG8gc2V0IHgtcnRjcCBvciB4LXNydGNwIGNhcHMKKworMjAxNC0wMy0yNCAxNTozNDoyNiArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHNldCB1ZHBzcmMgdG8gUkVBRFkKKwkgIFJFQURZIGlzIGVub3VnaCB0byBhbGxvY2F0ZSBwb3J0cyBub3cKKworMjAxNC0wMy0yNCAxNDoyNToyOCArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IGltcHJvdmUgY2FwcyBoYW5kbGluZworCSAgUHJvdGVjdCBjYXBzIHdpdGggdGhlIGxvY2suCisJICBEb24ndCBwdXNoIHRoZSBjYXBzIGV2ZW50IGZyb20gdGhlIHNldF9wcm9wZXJ0eSBmdW5jdGlvbiBidXQgbWFyayB0aGUKKwkgIHBhZCBmb3IgcmVjb25maWd1cmF0aW9uIHNvIHRoYXQgaXQgd2lsbCByZW5lZ290aWF0ZSBhbmQgcHVzaCB0aGUgbmV3CisJICBjYXBzIGV2ZW50IGluIHRoZSBzdHJlYW1pbmcgdGhyZWFkLgorCisyMDE0LTAzLTI0IDE1OjE1OjM0ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogb3Blbi9jbG9zZSBzb2NrZXQgaW4gTlVMTDwtPlJFQURZIHN0YXRlCisJICBXZSBzaG91bGQgb3BlbiB0aGUgc29ja2V0IHdoZW4gZ29pbmcgdG8gTlVMTDwtPlJFQURZIGFuZCBub3QgaW4gdGhlCisJICBzdGFydC9zdG9wIHZlbXRob2QsIHdoaWNoIGlzIGNhbGxlZCBpbiBSRUFEWTwtPlBBVVNFRC4gVGhpcyBtYWtlcyBpdAorCSAgcG9zc2libGUgdG8gYWxsb2NhdGUgYSBzb2NrZXQgd2l0aG91dCBnb2luZyB0byBQQVVTRUQgKGFuZCBzdGFydGluZyB0aGUKKwkgIG5lZ290aWF0aW9uKS4KKworMjAxNC0wMy0yNCAxNDozNTowMSArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGZyZWUgY2FwcyBpbiBwdG1hcCBhcnJheQorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNjY5NgorCisyMDE0LTAzLTIwIDExOjEyOjUxICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogaGFuZGxlIE5VTEwgcnRwbWFwIGFuZCBwYXJzZSBlcnJvciBiZXR0ZXIKKworMjAxNC0wMy0xNiAyMzo0NjoyMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogRG9uJ3QgY2hlY2sgZm9yIGd1ZGV2IGlmIHZpZGVvNGxpbnV4MiBpcyBub3QgcHJlc2VudAorCisyMDE0LTAzLTE2IDIzOjE5OjU1IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBEb24ndCBmYWlsIGlmIGd1ZGV2IGlzIG5vdCBwcmVzZW50CisJICBQS0dfQ0hFQ0tfTU9EVUxFUyBoYXMgdGhlIGJhZCBoYWJpdCBvZiBmYWlsaW5nIHRoZSBidWlsZCBpZiBpdCBkb2Vzbid0CisJICBnZXQgd2hhdCBpdCB3YW50cywgcHJldmVudCB0aGF0LgorCisyMDEyLTExLTAyIDEzOjMzOjEzICswMTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJkZXZpY2Vtb25pdG9yLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyZGV2aWNlbW9uaXRvci5oOgorCSAgdjRsMjogSW1wbGVtZW50IEdzdERldmljZU1vbml0b3Igc3ViY2xhc3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Nzg0MDIKKworMjAxMy0wOC0xMiAxMTo0OToyMSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3B1bHNlL01ha2VmaWxlLmFtOgorCSogZXh0L3B1bHNlL3BsdWdpbi5jOgorCSogZXh0L3B1bHNlL3B1bHNlZGV2aWNlbW9uaXRvci5jOgorCSogZXh0L3B1bHNlL3B1bHNlZGV2aWNlbW9uaXRvci5oOgorCSAgcHVsc2U6IEFkZCBkZXZpY2UgbW9uaXRvcnMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Nzg0MDIKKworMjAxNC0wMy0xNiAxOToyNDoyNiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IFJlbW92ZSBHc3RQcm9wZXJ0eVByb2JlIGxlZnRvdmVycworCisyMDE0LTAyLTE5IDAzOjA0OjAzICswMTAwICBNYXRoaWV1IER1cG9uY2hlbGxlIDxtZHVwb25jaGVsbGUxQGdtYWlsLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmg6CisJICB2aWRlb21peGVyOiBQb3J0IHRvIG5ldyBjb2xsZWN0cGFkcyBBUEkKKwkgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNDcwNQorCisyMDE0LTAzLTE2IDE1OjI2OjA0ICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2V4dC90eXBlcy1jb21wYXQuaDoKKwkqIHN5cy92NGwyL2V4dC92aWRlb2RldjIuaDoKKwkgIHY0bDI6IEFkZCB0eXBlcyBjb21wYXRpYmxpdHkgZm9yIG90aGVyIE9TCisJICBBZGRzIHR5cGUgY29tcGF0aWJsaXR5IHdpdGggb3RoZXIgT1MgbGlrZSBCU0QuIFRoaXMgdXNlcyB0eXBlcyBtYXBwaW5nIG1hY3JvIHRvCisJICBhdm9pZCBjb25mbGljdCB3aXRoIGV4aXN0aW5nIGRlZmluZWQgdHlwZXMuIFdlIHJlc3VzZSBnbGliIHR5cGVzIGFzIHRoZXNlIGFyZQorCSAgYWxyZWFkeSBhdmFpbGFibGUgb24gc3VwcG9ydGVkIHBsYXRmb3Jtcy4gVGhpcyBpcyBHQ0Mgb25seSBiZWNhdXNlIG9mIHRoZQorCSAgbGUzMiB0eXBlIHRoYXQgdXNlcyBiaXR3aXNlIGF0dHJpYnV0ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjY0NTMKKworMjAxNC0wMy0xNiAxNTo1NTowMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSAgcHVsc2U6IGZpeCBmb3JtYXQgaW5mbyB0byBjYXBzIGNvbnZlcnNpb24gZm9yIG11bGF3CisKKzIwMTMtMDgtMTMgMTI6MTA6NDIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuaDoKKwkgIHB1bHNlOiBNYWtlIGdzdF9wdWxzZV9mb3JtYXRfaW5mb190b19jYXBzKCkgc2hhcmVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc4NDAyCisKKzIwMTQtMDMtMTUgMTg6NDE6MTYgKzAxMDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL01ha2VmaWxlLmFtOgorCSAgdjRsMjogRml4IHR5cG8gVjRMX0RJUiBpbnRlYWQgb2YgVjRMMl9ESVIKKworMjAxNC0wMy0xNSAxODowNTozMiArMDEwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICB2NGwyLWJ1aWxkOiBTZXQgSEFWRV9HU1RfVjRMMiBpZiBoZWFkZXJzIGFyZSBwcmVzZW50CisJICBUaGUgbmFtZSBvZiBIQVZFXyBuZWVkIHRvIG1hdGNoIHRoZSBVU0VfLiBOb3cgc2V0IEhBVkVfR1NUX1Y0TDIgaWYKKwkgIHZpZGVvZGV2Mi5oIGlzIGZvdW5kLgorCisyMDE0LTAzLTE1IDE2OjQ3OjUxICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHN5cy9NYWtlZmlsZS5hbToKKwkgIHY0bDI6IEFjdHVhbGx5IGJ1aWxkIHRoZSBwbHVnaW4KKwkgIFRoZSBjaGVja3Mgd2VyZSByZW1vdmVkIGluYWR2ZXJ0ZWRseSBpbiBwcmV2aW91cyBwYXRjaCBhbmQgbm90IHJlcGxhY2VkLgorCSAgUmUtaW50cm9kdWNlIHRoZSBjb25maWd1cmUgY2hlY2tzIGFuZCBzb21lIG9mIHRoZSBjaGVja3MgaW4gb3JkZXIgdG8gZW5hYmxlCisJICB0aGlzIHBsdWdpbiBhZ2Fpbi4gV2Ugb25seSBjaGVjayBpZiB2aWRlb2RldjIuaCBleGlzdCBvbiB0aGUgcGxhdGZvcm0gdG8KKwkgIGF2b2lkIGJ1aWxkaW5nIG9uIFdpbmRvd3Mgb3IgT1NYLCB0aG91Z2ggd2UgYnVpbGQgYWdhaW5zdCBvdXIgb3duIGNvcHkuIFRoaXMKKwkgIHdhcyBicmVha2luZyB0aGUgYnVpbGQgb24gYnVpbHQtYm90LgorCisyMDE0LTAzLTE1IDEzOjQ3OjQyICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2hyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICB0cmFuc2xhdGlvbjogUE8gZmlsZSBjaGFuZ2VzIGNhdXNlZCBieSBQT1RGSUxFLmluIHVwZGF0ZQorCisyMDE0LTAzLTE1IDEzOjE3OjIxICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHBvL1BPVEZJTEVTLmluOgorCSogcG8vUE9URklMRVMuc2tpcDoKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb292ZXJsYXkuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb292ZXJsYXkuaDoKKwkgIHY0bDI6IFJlbW92ZSBYViBzdXBwb3J0CisJICBYViBzdXBwb3J0IGZvciB2NGwyIG5ldmVyIGJlY2FtZSB1cHN0cmVhbSBhbmQgZW5kZWQgdXAgYmVpbmcKKwkgIGNvbW1lbnRlZCBvdXQgd2l0aCBhbiB1bmRlZiBmb3IgYSBsb25nIHRpbWUgbm93LgorCisyMDE0LTAzLTE1IDExOjEzOjA1ICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkqIHN5cy9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2V4dC92NGwyLWNvbW1vbi5oOgorCSogc3lzL3Y0bDIvZXh0L3Y0bDItY29udHJvbHMuaDoKKwkqIHN5cy92NGwyL2V4dC92aWRlb2RldjIuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkb3JpZW50LmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgIHY0bDI6IFVzZSBhIGNvcHkgb2YgdmlkZW9kZXYyLmggaGVhZGVyCisJICBXaXRoIHllYXJzIHRoZSBhbW91bnQgb2YgaWZkZWYgaGF2ZSBncm93biB1cCBhbmQgd2UgYXJlIG5vdCBldmVuIHN1cmUgaWYgdGhlCisJICBvbGQgY29kZSBwYXRoIGNvbXBpbGVzLiBFYWNoIHRpbWUgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHY0bDIgZnJhbWV3b3JrIHRvIGFkZAorCSAgdGhlIG5ldyBmZWF0dXJlLCB3ZSBicmVhayBjb21waWxhdGlvbiBvbiBvbGRlciBrZXJuZWwuIFdpdGggZXhjZXB0aW9uIG9mIHR3bworCSAgY29udHJvbHMgaW4gdGhlIHZpZGVvIG9yaWVudGF0aW9uIGNvbnRyb2wsIHRoaXMgcGF0Y2ggZ2V0IHJpZCBvZiBhbGwgaWZkZWYgYnkKKwkgIGluY2x1ZGluZyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdmlkZW9kZXYyLmggaW5zaWRlIEdTdHJlYW1lci4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjM0NDYKKworMjAxNC0wMy0xMiAxNTozMjo1NSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmg6CisJICBzb3VwaHR0cHNyYzogQWRkIHByb3BlcnRpZXMgZm9yIHNlbGVjdGluZyBTU0wvVExTIGNlcnRpZmljYXRlIGNoZWNraW5nCisJICBBbmQgYnkgZGVmYXVsdCBwcm9wZXJseSBjaGVjayBjZXJ0aWZpY2F0ZXMgYWdhaW5zdCB0aGUgc3lzdGVtJ3MgQ0EKKwkgIGNlcnRpZmljYXRlcy4gRXZlcnl0aGluZyBlbHNlIGlzIG5vdCBhIGdvb2QgZGVmYXVsdCBhdCBhbGwuCisKKzIwMTQtMDMtMTEgMTQ6NTY6MzAgKzAxMDAgIFBlciB4IEpvaGFuc3NvbiA8cGVyeGpvaEBheGlzLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBmaXggYXNzZXJ0IG9uIGZwcyBsb3dlciB0aGFuIDEKKwkgIEZpeGVzIGFzc2VydCBjYXVzZWQgYnkgZ3N0X2R1cmF0aW9uX3RvX2ZyYWN0aW9uIGNhbGxpbmcKKwkgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgd2l0aCBhIGRlbm9taW5hdG9yIG9mIDAgd2hlbiBmcHMgaXMgbGVzcworCSAgdGhhbiAxLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNjEwNgorCisyMDE0LTAzLTExIDAwOjQ2OjA2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXIyOiBzdG9yZSB2aWRlbyBpbmZvIHdpdGggYnVmZmVycyB0byBrZWVwIGl0IGluIHN5bmMKKwkgIEluc3RlYWQgdGhlIHF1ZXVlZCBidWZmZXIgbWlnaHQgaGF2ZSBhbiBvbGQgY2FwcyB3aGlsZSB0aGUgcGFkCisJICBpcyBhbHJlYWR5IHN0b3JpbmcgdGhlIGluZm9ybWF0aW9uIGZvciBhIG5ldyBjYXBzLiBNaXhpbmcgdGhvc2UKKwkgIHdoaWxlIGhhbmRsaW5nIGJ1ZmZlcnMgd2lsbCBvZnRlbiBsZWFkIHRvIGlzc3VlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNTk0OAorCisyMDE0LTAzLTA4IDE5OjI5OjU4IC0wNTAwICBXaWxsaWFtIE1hbmxleSA8d2lsbEB3aWxsaWFtbWFubGV5Lm5ldD4KKworCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSAgdjRsMjogRml4IHR5cG8gY29udG9sIC0+IGNvbnRyb2wKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjU2MzIKKworMjAxNC0wMy0wNCAwMToxNTo0OSArMDAwMCAgV2lsbGlhbSBNYW5sZXkgPHdpbGxAd2lsbGlhbW1hbmxleS5uZXQ+CisKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDI6IE5vcm1hbGlzZSBjb250cm9sIG5hbWVzIGluIHRoZSBzYW1lIHdheSBhcyB2NGwyLWN0bAorCSAgVjRMMiBrZXJuZWwgZHJpdmVycyBhbGxvdyBjb25maWd1cmF0aW9uIG9mIHRoZSBoYXJkd2FyZSBzZXR0aW5ncyB2aWEgYQorCSAgbWVjaGFuaXNtIGNhbGxlZCBjb250cm9scy4gIFRoZXNlIGNhbiBiZSByZWZlcnJlZCB0byBieSBuYW1lIHN1Y2ggYXMKKwkgICJCcmlnaHRuZXNzIiBhbmQgIldoaXRlIEJhbGFuY2UgVGVtcGVyYXR1cmUiLiAgVGhlIHVzZXItc3BhY2UgY29tbWFuZCBsaW5lCisJICBjbGllbnQgZm9yIHNldHRpbmcgdGhlc2UgY29udHJvbHMgKHY0bDItY3RsKSBub3JtYWxpc2VzIHRoZXNlIG5hbWVzIHN1Y2gKKwkgIHRoYXQgdGhleSBvbmx5IGNvbnRhaW4gbG93ZXIgY2FzZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgdGhlCisJICB1bmRlcnNjb3JlICdfJy4gIGUuZzoKKwkgIEtlcm5lbCAgICAgICAgICAgICAgICAgICAgIHY0bDItY3RsCisJICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICBCcmlnaHRuZXNzICAgICAgICAgICAgICAgICBicmlnaHRuZXNzCisJICBXaGl0ZSBCYWxhbmNlIFRlbXBlcmF0dXJlICB3aGl0ZV9iYWxhbmNlX3RlbXBlcmF0dXJlCisJICBGb2N1cyAoYWJzb2x1dGUpICAgICAgICAgICBmb2N1c19hYnNvbHV0ZQorCSAgR1N0cmVhbWVyIHNlZW1zIHRvIHdhbnQgdG8gZm9sbG93IHRoaXMgcGF0dGVybiBidXQgZmFpbGVkIGZvciBjb250cm9scyB3aXRoCisJICBtb3JlIHRoYW4gb25lIGNvbnNlY3V0aXZlIG5vbi1hbHBoYW51bSBjaGFyYWN0ZXIuICBlLmcuIEdTdHJlYW1lciB3b3VsZAorCSAgcHJvZHVjZSAiZm9jdXNfX2Fic29sdXRlXyIgcmF0aGVyIHRoYW4gImZvY3VzX2Fic29sdXRlIi4KKwkgIFRoaXMgY29tbWl0IGZpeGVzIHRoYXQgaXNzdWUuICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpcyBwcmVzZXJ2ZWQgYnkKKwkgIG5vcm1hbGlzaW5nIGFsbCBjb250cm9sIG5hbWVzIGJlZm9yZSBjb21wYXJpc29uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNTYzMgorCisyMDE0LTAzLTA3IDE2OjE3OjI5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IE1ha2Ugc3VyZSB0byBub3QgcmV0dXJuIEVPUyBpbW1lZGlhdGVseSBpZiB3ZSBmaW5pc2hlZCBhIHJhbmdlIHJlcXVlc3QKKwkgIE9ubHkgcmV0dXJuIEVPUyB0aGUgbmV4dCB0aW1lIGNyZWF0ZSgpIGlzIGNhbGxlZCwgaWYgYXQgYWxsLiBiYXNlc3JjCisJICBzaG91bGQgYWxyZWFkeSB0YWtlIGNhcmUgb2Ygbm90IGNhbGxpbmcgaXQgYWdhaW4uCisJICBBbHNvIGFsd2F5cyByZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlIHByZXZpb3VzIGZsb3cgcmV0dXJuIHdhcworCSAgbm90IE9LLiBUaGlzIGluZGljYXRlcyBhbiBlcnJvciBzb21ld2hlcmUuCisKKzIwMTQtMDMtMDYgMTI6MDY6NDMgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVuZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOgorCSAgcnRwOiBSZW1vdmUgY2FwcyByZXN0cmljdGlvbnMgZnJvbSBSVFAgZGVwYXlsb2FkZXIgc2luayBjYXBzCisJICBSZW1vdmUgY2FwcyByZXN0cmljdGlvbnMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBkZWZhdWx0IGFuZCBhcmUgbm90CisJICByZXF1aXJlZCBpbiBTRFAuIFdpdGggdGhlIG5ldyB1c2FnZSBvZiBoYXZpbmcgcGFkcyByZXF1aXJlIGEgc3Vic2V0CisJICBvZiB0aGUgY2FwcywgdGhleSB3aWxsIG1ha2UgdGhlIG5lZ290aWF0aW9uIGZhaWwuCisKKzIwMTQtMDMtMDYgMTE6MDI6MDkgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOgorCSAgcnRwc3BlZXhkZXBheTogUmVtb3ZlIGNhcHMgcmVzdHJpY3Rpb25zIGZvciBkZXBheWxvYWRlcgorCSAgVGhlICJlbmNvZGluZy1wYXJhbXMiIGlzIG9wdGlvbmFsIGluIHRoZSBTRFAsIGJlY2F1c2Ugd2Ugbm93IHJlcXVpcmUKKwkgIGEgc3Vic2V0IG9mIHRoZSBjYXBzLCBpdCB3b3VsZCBmYWlsIGNhcHMgbmVnb3RpYXRpb2luIGlmIGl0IHdhc24ndCBwcmVzZW50LgorCSAgU28gcmVtb3ZlZCBpdCBmcm9tIHRoZSB0ZW1wbGF0ZSBjYXBzLgorCisyMDE0LTAzLTA2IDEzOjM4OjA5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IERvbid0IGZvcmdldCB0byBxdWl0IG1haW5sb29wIGFmdGVyIHdlIGNhbmNlbGxlZCB3aGVuIHdlIGdvdCBkYXRhIGFmdGVyIHRoZSBzdG9wIHBvc2l0aW9uCisKKzIwMTQtMDMtMDYgMTM6MzU6NDcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogSWYgd2UgaGFkIGEgc3RvcCBwb3NpdGlvbiwgYWxsb3cgZm9yIHRoZSBzZXJ2ZXIgdG8gZmluaXNoIG91ciBjb25uZWN0aW9uIGluc3RlYWQgb2YganVzdCBjYW5jZWxsaW5nCisJICBPdGhlcndpc2Uga2VlcC1hbGl2ZSBkb2VzIG5vdCBtYWtlIG11Y2ggc2Vuc2UgYW5kIGFsc28gdGhlIHNlcnZlciB3aWxsIGhhdmUKKwkgIGNvbmZ1c2luZyB0aGluZ3MgaW4gdGhlIGxvZ3MuCisKKzIwMTQtMDMtMDYgMTI6MjQ6MDEgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBza2lwIHN0cmVhbXMgd2l0aCBzYW1lIGNvbnRyb2wgdXJsCisJICBLZWVwIHRyYWNrIG9mIHdoYXQgc3RyZWFtcyB3ZSBkaWQgdGhlIFNFVFVQIGZvci4gV2Ugb25seSBuZWVkIHRvCisJICBjb25maWd1cmUgY2Fwcywgd2FpdCBmb3IgcGFkcyBhbmQgcHVzaCBldmVudHMgb24gc2V0dXAgc3RyZWFtcy4gV2UgY2FuCisJICByZW1vdmUgdGhlIGRpc2FibGVkIHN0YXRlIG9mIHRoZSBzdHJlYW0gYW5kIHNpbXBsaWZ5IHNvbWUgY2hlY2tzLgorCSAgQWZ0ZXIgd2Ugc2V0dXAgYSBzdHJlYW0sIHNraXAgdGhlIG90aGVyIHN0cmVhbXMgdGhhdCBoYXZlIHRoZSBzYW1lCisJICBjb250cm9sIHVybC4gVXNlIGEgc2tpcHBlZCBmbGFnIHRvIG1hcmsgc3RyZWFtcyB0aGF0IHNob3VsZCBiZSBza2lwcGVkLgorCisyMDE0LTAzLTA2IDEyOjIyOjQ3ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcmVtb3ZlIG9ic29sZXRlIGNvZGUKKworMjAxNC0wMy0wNSAxNjoxOToxOSArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IGp1c3QgdXNlIHRoZSBTRFAgaW5kZXggYXMgdGhlIHN0cmVhbSBpZAorCSAgVXNlIHRoZSBpbmRleCBvZiB0aGUgbWVkaWEgc3RyZWFtIGluIHRoZSBTRFAgYXMgdGhlIHN0cmVhbSBpZCBpbnN0ZWFkIG9mCisJICBrZWVwaW5nIGEgc2VwYXJhdGUgY291bnRlci4KKworMjAxNC0wMy0wNSAxMzozNToxOSArMDEwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlbzogZml4IGJ1aWxkIG9uIE1hYyBPU1ggTWF2ZXJpY2tzIGFuZCBwdXQgbmV3IHdpbmRvdyBpbiBmcm9udAorCSAgR2V0Q3VycmVudFByb2Nlc3MvU2V0RnJvbnRQcm9jZXNzL1RyYW5zZm9ybVByb2Nlc3NUeXBlIHdhcyBkZXByZWNhdGVkCisJICBhbmQgbm93IHJlbW92ZWQgaW4gTWFjIE9TWCAxMC45LiBvcmRlckZyb250UmVnYXJkbGVzcyBpcyB1c2VkIHRvIG1ha2UKKwkgIHRoZSB2aWRlbyB3aW5kb3cgdGhlIG1vc3QgZnJvbnQgd2luZG93LgorCisyMDE0LTAzLTA1IDE3OjMzOjU2ICswMTAwICBDaHJpc3RpYW4gRnJlZHJpayBLYWxhZ2VyIFNjaGFsbGVyIDx1cmFldXNAbGludXhyaXNpbmcub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBBZGQgZG9jcyBkaXJlY3RvcnkgdG8gc3BlYyBmaWxlCisKKzIwMTQtMDMtMDUgMTU6NDQ6MjUgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBoYW5kbGUgTlVMTCBjb250cm9sIHVybHMgYmV0dGVyCisKKzIwMTQtMDMtMDUgMTQ6Mjg6MjYgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBzbWFsbCBjbGVhbnVwcworCSAgSXQncyBuaWNlciB0byBleHBsaWNpdGx5IGNoZWNrIGZvciBOVUxMIG9uIHBvaW50ZXIgdHlwZXMgdG8gbWFrZSBpdAorCSAgY2xlYXIgdGhhdCBpdCdzIGEgcG9pbnRlciBhbmQgbm90IGEgYm9vbGVhbi4KKworMjAxNC0wMy0wNSAxNDoyNjowMiArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHNlc3Npb246IGhhbmRsZSB1bmtub3duIFNTUkMgaW4gRklSCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI1NzEyCisKKzIwMTQtMDMtMDUgMTE6Mzk6MDkgKzAxMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRAZ21haWwuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaXggc2Vla2luZworCSAgQ2FsbCBnc3RfcnRzcHNyY19jb25uZWN0aW9uX2ZsdXNoIChzcmMsIEZBTFNFKSB0byByZXNldCBjb25uZWN0aW9ucyBhcworCSAgbm9uLWZsdXNoaW5nIGJlZm9yZSBzZW5kaW5nIFBBVVNFIGFuZCBQTEFZIHdpdGggdGhlIG5ldyBucHQgcmFuZ2UuIFdpdGhvdXQgdGhpcworCSAgcGF0Y2gsIHRob3NlIGNvbW1hbmRzIHdvdWxkIGZhaWwgd2l0aCBFSU5UUiBhcyB0aGUgY29ubmVjdGlvbnMgd2VyZSBzdGlsbAorCSAgZmx1c2hpbmcuCisKKzIwMTQtMDMtMDMgMTY6Mzk6MjYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogZXhwb3NlIHhzdWIgYXMgYSBzdWJ0aXRsZSBpbnN0ZWFkIG9mIGFzIGEgdmlkZW8KKwkgIEl0IGlzIHBsYWNlZCBpbnNpZGUgYSAndmlkcycgc3RydWN0LCBzbyBpdCB3YXMgYmVpbmcgZXhwb3NlZCBvbgorCSAgYSBwYWQgbmFtZWQgdmlkZW9fJWQuIFhTVUIgYXJlIHN1YnRpdGxlcyBhbmQgdGhpcyBwYXRjaCBhZGRzCisJICBhbiBzcGVjaWFsIGNhc2UgZm9yIGl0IHRvIGJlIGV4cG9zZWQgaW4gYSBzdWJwaWN0dXJlXyVkIHBhZAorCisyMDE0LTAzLTAzIDE2OjM4OjQ1IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGRvIG5vdCB0cnkgdG8gYWRkIGEgdGFnIHdpdGggdGFnX25hbWUgc2V0IHRvIE5VTEwKKwkgIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGVyZSBhcmUgc3VidGl0bGVzIGluIHRoZSBzdHJlYW0sIGxlYWRpbmcgdG8KKwkgIGFuIGFzc2VydGlvbgorCisyMDE0LTAzLTA0IDE2OjQwOjM0ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogQWRkIHN1cHBvcnQgZm9yIG11bHRpcGxlIHBheWxvYWQgdHlwZXMKKwkgIEEgbWVkaWEgc3RyZWFtIGNhbiBoYXZlIG11bHRpcGxlIHBheWxvYWQgdHlwZXMuIFBhcnNlIGFsbCB0aGUgcGF5bG9hZAorCSAgdHlwZXMgYW5kIGNvbGxlY3QgdGhlIGNhcHMgaW5mb3JtYXRpb24uIFdlIHRoZW4gaGF2ZSB0byBzdG9yZSB0aGUKKwkgIHB0PC0+Y2FwcyBtYXBwaW5nIGluc3RlYWQgb2YgMSBwdCBhbmQgMSBjYXBzLgorCSAgUGFyc2UgdGhlIHByb2ZpbGUgZnJvbSB0aGUgU0RQIGFuZCB1c2UgdGhhdCB0byBuZWdvdGlhdGUgdGhlIHRyYW5zcG9ydAorCSAgaW5zdGVhZCBvZiBhbHdheXMgdXNpbmcgQVZQLgorCSAgUmV3b3JrIGhvdyB3ZSBkbyBzb21lIHR3ZWFrcyBmb3IgQVNGIGFuZCBSZWFsbWVkaWEuCisKKzIwMTQtMDMtMDQgMTE6MzQ6MzkgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiByZWZhY3RvciBwYXlsb2FkIGhhbmRsaW5nCisKKzIwMTQtMDMtMDMgMTE6MzQ6MDAgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogZml4IGJ1ZmZlciBsZXZlbCB3aXRoIGludmFsaWQgRFRTCisJICBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBEVFMgaXMgaW52YWxpZCAod2hlbiB3ZSByZWNlaXZlIFJUUCBwYWNrZXRzIGZyb20KKwkgIFRDUCwgZm9yIGV4YW1wbGUpLiBBcyBhIGZhbGxiYWNrLCB1c2UgdGhlIHJlY29uc3RydWN0ZWQgUFRTIHZhbHVlIHRvCisJICBjYWxjdWxhdGUgdGhlIGJ1ZmZlciBsZXZlbC4KKworMjAxNC0wMy0wMiAwNToxMDoxMyArMDEwMCAgU2ViYXN0aWFuIFJhc211c3NlbiA8c2VicmFzQGhvdG1haWwuY29tPgorCisJKiAuZ2l0aWdub3JlOgorCSAgLmdpdGlnbm9yZTogSWdub3JlIGdjb3YgaW50ZXJtZWRpYXRlIGZpbGVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI1NDgwCisKKzIwMTQtMDItMjggMDk6MzQ6NDYgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBmZTE2NzJlIHRvIGJjYjE1MTgKKworMjAxNC0wMi0yNyAyMzoxNTowNCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIFJldmVydCAiYWFjcGFyc2U6IHB1dCBjb2RlYyBkYXRhIG9uIGNhcHMgZm9yIGxvYXMgZm9ybWF0IgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCBlNDU5Y2YzZTAxYTA4ZjFhM2VmMWZiOTU0YTQxY2ZhMzZiM2U1MTBjLgorCSAgVGhpcyB3YXMgcHVzaGVkIGJ5IGFjY2lkZW50LCB0aGUgYnVnIHNob3VsZCBsaWtlbHkgYmUgZml4ZWQgaW4KKwkgIGxpYmF2IGh0dHBzOi8vYnVnemlsbGEubGliYXYub3JnL3Nob3dfYnVnLmNnaT9pZD02NDQKKworMjAxNC0wMi0yNyAxODo1NTowNCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IG1hcmsgYWxsIHBhcnNlZCBmcmFtZXMgYXMgc3luYyBwb2ludHMKKwkgIGFsbCBqcGVnIGZyYW1lcyBhcmUgc3luYyBwb2ludHMsIHNvIG1hcmsgdGhlbSBhcyBzdWNoIHNvCisJICByZXZlcnNlIHBsYXliYWNrIGNhbiBwcm9wZXJseSB3b3JrIHdpdGggdGhlIHZpZGVvIGRlY29kZXIKKwkgIGJhc2UgY2xhc3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjUxMDQKKworMjAxNC0wMi0yNSAwMToxMjowNSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBwdXQgY29kZWMgZGF0YSBvbiBjYXBzIGZvciBsb2FzIGZvcm1hdAorCSAgZ3N0LWxpYmF2IGF1ZGlvIGRlY29kZXIgYWxzbyBuZWVkcyBjb2RlYyBkYXRhIGZvciBMT0FTIGZvcm1hdCwgb3RoZXJ3aXNlCisJICBpdCB3aWxsIGNvbXBsYWluIGFib3V0IG5vdCBoYXZpbmcgYSBkZWNvZGVyIGNvbmZpZyBhbmQgc2tpcCBhbGwgcGFja2V0cworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU5Njc3MgorCisyMDE0LTAyLTI3IDAwOjQzOjQ4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGFsaWduIHJhdyBhdWRpbyBtZW1vcnkgdG8gcG93ZXJzIG9mIHR3bworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNTAwOAorCisyMDE0LTAyLTI3IDAwOjM3OjIwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGNhbGN1bGF0ZSBhbGlnbm1lbnQgcHJvcGVybHkgZm9yIGF1ZGlvIGRlcHRocyBub3QgYSBtdWx0aXBsZSBvZiA4CisKKzIwMTQtMDItMjMgMTk6MDk6MjQgKzAxMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogZml4IGNyYXNoIHdpdGggMjQtYml0IHJhdyBhdWRpbworCSAgRG8gbm90IHRyeSB0byBhbGlnbiBhdWRpbyBidWZmZXJzIHRvIG9kZCBudW1iZXJzLAorCSAgd2hpY2ggd2lsbCBnZXQgdXMgYSBOVUxMIGJ1ZmZlciB3aGljaCB3ZSB0aGVuCisJICBjcmFzaCBvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjUwMDgKKworMjAxNC0wMi0yNyAwMDoxMTo0MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW06CisJICBydHBtYW5hZ2VyOiByZS1lbmFibGUgLVdlcnJvcgorCisyMDE0LTAyLTI3IDAwOjExOjExICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogZml4IGNvbXBpbGVyIHdhcm5pbmcKKwkgIGdzdHJ0cGppdHRlcmJ1ZmZlci5jOiBJbiBmdW5jdGlvbiAnZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3AnOgorCSAgZ3N0cnRwaml0dGVyYnVmZmVyLmM6Mjk3ODozOiBlcnJvcjogJ3Jlc3VsdCcgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZCBpbiB0aGlzIGZ1bmN0aW9uCisJICB3aGlsZSAocmVzdWx0ID09IEdTVF9GTE9XX09LKTsKKwkgIF4KKworMjAxNC0wMi0yNiAyMjoxMTo0MSArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDFhMDdkYTkgdG8gZmUxNjcyZQorCisyMDE0LTAyLTI2IDIxOjExOjIzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogRml4IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgY29tcGlsZXIgd2FybmluZworCisyMDE0LTAyLTI2IDA3OjMyOjMyIC0wNTAwICBKYWtlIEZveXRpayA8amFrZS5mb3l0aWtAaXBjb25maWd1cmUuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogUmVtb3ZlIHJhdyBjb21wYXJpc29ucyBvZiBSVFAgc2VxdWVuY2UgbnVtYmVycworCSAgU2V2ZXJhbCBjb25kaXRpb25hbCBzdGF0ZW1lbnRzIHBlcmZvcm0gY29tcGFyaXNvbiBvbiBSVFAgc2VxdWVuY2UKKwkgIG51bWJlcnMgd2l0aG91dCB0YWtpbmcgdGhlIHNlcXVlbmNlIG51bWJlciByb2xsb3ZlciBpbnRvIGFjY291bnQuCisJICBJbnN0ZWFkLCB1c2UgdGhlIGdzdF9ydHBfYnVmZmVyX2NvbXBhcmVfc2VxbnVtIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlCisJICBjb21wYXJpc29uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNTE1OQorCisyMDE0LTAyLTAzIDAxOjQ0OjIxICswMTAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJyYXNAaG90bWFpbC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgdGVzdHM6IERvbid0IGJ1aWxkIGRpc2FibGVkIHBsdWdpbnMnIGNoZWNrIHRlc3RzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIzNTAyCisKKzIwMTQtMDItMjYgMTE6Mjk6NDUgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGRvY3MvTWFrZWZpbGUuYW06CisJICBkb2NzOiBpbnN0YWxsIHByZWJ1aWx0IHBsdWdpbiBkb2NzIGlmIGd0ay1kb2MgaXMgZGlzYWJsZWQKKwkgIFN5bmMgdG8gdGhlIE1ha2VmaWxlLmFtIGZyb20gZ3N0LXBsdWdpbi1iYXNlIHdoZXJlIGl0IGlzIGRvbmUgcmlnaHQuCisJICBGaXhlcyAjNzI1MDM0CisKKzIwMTQtMDItMjUgMTY6MTA6NTQgLTA1MDAgIEh1Z3VlcyBGcnVjaGV0IDxodWd1ZXMuZnJ1Y2hldEBzdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IGRvIG5vdCBlbWl0ICJwYXJzZWQiIGNhcHMgZm9yIHZwOAorCSAgVlA4IGRvZXNuJ3QgcmVxdWlyZSBwYXJzaW5nICh2cDhwYXJzZSBkb2Vzbid0IGV4aXN0LCBzbyBuZWdvdGlhdGlvbiB3aXRoIGRlbXV4IGZhaWxzCisJICBpZiAicGFyc2VkIiBpcyBzZXQgaW4gY2FwcykuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI0NjM2CisKKzIwMTQtMDItMTEgMTY6Mjc6MDggLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogRG9uJ3QgcmVxdWlyZSBwYXJzZXIgZm9yIFZQOAorCSAgVW50aWwgR1N0cmVhbWVyIGhhcyBvbmUgKHNlZSBidWc3MjI3NjApLCB3ZSBzaG91bGQgbm90IHJlcXVpcmUgYSBwYXJzZXIgZm9yIFZQOC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjIxMjgKKworMjAxNC0wMi0xMCAxNzowODoyNSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBDQVBUVVJFX01QTEFORSBpcyB3ZWxsIHRlc3RlZCBub3cKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjIxMjgKKworMjAxMy0xMi0xOCAwOTo1NjozNSArMDEwMCAgQmVuamFtaW4gR2FpZ25hcmQgPGJlbmphbWluLmdhaWduYXJkQGxpbmFyby5vcmc+CisKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmg6CisJICB2NGwydmlkZW9kZWM6IENyZWF0ZSBvbmUgZWxlbWVudCBwZXIgZGV2aWNlCisJICBGb3IgZWFjaCB2aWRlb0NkZXZpY2UgcHJvYmUgaXQgaW5wdXQvb3V0cHV0IGNhcGFiaWxpdGllcworCSAgaWYgaXQgbWF0Y2ggd2l0aCB2aWRlbyBkZWNvZGVyIHJlcXVpcmVtZW50IHJlZ2lzdGVyIGEgbmV3IGVsZW1lbnQuCisJICBTaWduZWQtb2ZmLWJ5OiBCZW5qYW1pbiBHYWlnbmFyZCA8YmVuamFtaW4uZ2FpZ25hcmRAbGluYXJvLm9yZz4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjIxMjgKKworMjAxMy0xMi0xOSAxNToyNjo1MiAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogQ2FsY3VsYXRlIGxhdGVuY3kgZnJvbSBkZXZpY2UgaW5mb3JtYXRpb24KKwkgIERlY29kZXJzIG9yIG90aGVyIGRldmljZXMgdGhhdCBleHBvc2UgYSBtaW5pbXVtIGJ1ZmZlcnMgcmVxdWlyZWQgcHJvZHVjZQorCSAgYW4gZmlyc3Qgb3V0cHV0LiBXZSB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBjYWxjdWxhdGUgbGF0ZW5jeS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjIxMjgKKworMjAxMy0xMS0yOCAxNzoxNDoxOCAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmg6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwydmlkZW9kZWM6IEltcGxlbWVudCB2NGwydmlkZW9kZWMKKwkgIEltcGxlbWVudCBhbiBlbGVtZW50IHRoYXQgY2FuIGRyaXZlciBWNEwyIE0yTSBkZWNvZGVyIGRldmljZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjIxMjgKKworMjAxNC0wMi0xMSAxMjo0MToyOSArMDEwMCAgR8O2cmFuIErDtm5zc29uIDxnb3JhbmpuQGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IG9ubHkgdXBkYXRlIGxhc3Rfc3BzcHBzIHRpbWUgaWYgYWxsIHNwcy9wcHMgZ290IHNlbnQgc3VjY2Vzc2Z1bGx5CisJICBUaGlzIGZpeGVzIGFuIGlzc3VlIHdpdGggZ3N0LXJ0c3Atc2VydmVyIHdoZXJlIG5vIHNwcyBhbmQgcHBzIGFyZQorCSAgc2VudCBmb3IgdGhlIGZpcnN0IGludHJhIGZyYW1lLCBiZWNhdXNlIHRoZSBwYXlsb2FkZXIgc3RhcnRzIHdvcmtpbmcKKwkgIGFscmVhZHkgd2hlbiByZWNlaXZpbmcgREVTQ1JJQkUgYnV0IHRoZXJlIGlzIG5vIHRyYW5zcG9ydHMgc28gaXQgdHJpZXMKKwkgIHRvIHNlbmQgc3BzIGFuZCBwcHMsIGJ1dCB0aGF0IGZhaWxzIHdpdGggYSBGTFVTSElORyBmbG93LiBCdXQgdGhlIHRpbWUKKwkgIGZvciBsYXN0IHNlbnQgc3BzIGFuZCBwcHMgd291bGQgc3RpbGwgYmUgc2V0LCBzbyB3aGVuIFBMQVkgYXJyaXZlcyBhbmQKKwkgIHRoZSBmaXJzdCBpbnRyYSBmcmFtZSBpcyB0byBiZSBzZW50IHRoZXJlIGlzIG5vIHNwcyBhbmQgcHBzIHNlbnQgZHVlIHRvCisJICB0aGF0IHRpbWUgc2luY2UgbGFzdCBzcHMgcHBzIGlzIGxlc3MgdGhhbiBzcHNwcHNfaW50ZXJ2YWwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI0MjEzCisKKzIwMTQtMDItMjUgMDk6MDA6NDUgKzAxMDAgIFNhbnRpYWdvIENhcm90LU5lbWVzaW8gPHNhbmNhbmVAZ21haWwuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBGaXggZGVhZGxvY2sgd2hlbiB0YXNrIGNyZWF0aW9uIGlzIG5vIHN1Y2Nlc3NmdWwKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjUxMjQKKworMjAxNC0wMi0yMiAyMDoxOTo0OSArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2RldGVjdC5jOgorCSAgYXV0b2RldGVjdDogZGVtb3RlIGNhbmRpZGF0ZSBlcnJvciB0byB3YXJuaW5nIGFuZCBwbHVnIGZha2V7c2luayxzcmN9CisJICBJbiB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIG5vIHN1aXRhYmxlIGNhbmRpZGF0ZSB3ZSBwb3N0IGEgd2FybmluZyBhbmQgcGx1ZyBhCisJICBmYWtlLWVsZW1lbnQuIERvIHRoZSBzYW1lIHdoZW4gbm9uIG9mIHRoZSBjYW5kaWRhdGUgd29yay4KKwkgIFRoaXMgaXMgbW9yZSBjb25zaXN0ZW50IGFuZCBwbHVnaW4gdGhlIGZha2VzaW5rIGFzIGEgZmFsbGJhY2sgaXMgcHJvYmFibHkKKwkgIGhlbHBmdWwgZm9yIHJ1bm5pbmcgdW5pdCB0ZXN0cyB3aXRob3V0IHJlcXVpcmluZyBoYXJkd2FyZSBzcmMvc2luayBlbGVtZW50cy4KKwkgIEZpeGVzICM3MjI5ODEKKworMjAxNC0wMi0yMyAxMjozNDo0OCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDI6IG1ha2Ugc29tZSBtb3JlIGNvbnRyb2xzIGNvbmZpZ3VyYWJsZQorCSAgLi4uIGF0IGxlYXN0IGlmIG9uZSB0cmllcyBoYXJkIGVub3VnaCB1c2luZyBleHRyYS1jb250cm9scyBwcm9wZXJ0eS4KKworMjAxNC0wMi0yMyAxMDozOToyMCArMDEwMCAgRGFuIEtlZ2VsIDxkYW5rQGtlZ2VsLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgdjRsMjogUmVxdWlyZSBtcGxhbmFyIHN1cHBvcnQgZm9yIG5vdyBpbiBjb25maWd1cmUKKwkgIFRoZSBjb2RlIGZhaWxzIHRvIGNvbXBpbGUgd2l0aG91dCBjdXJyZW50bHksIHNlZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMzQ0NgorCSAgSXQncyBiZXR0ZXIgdG8gZGlzYWJsZSBpdCBpbnN0ZWFkIG9mIGZhaWxpbmcgY29tcGlsYXRpb24KKwkgIHVudGlsIHRoaXMgaXMgZml4ZWQgcHJvcGVybHkuCisKKzIwMTQtMDItMjMgMDA6MTQ6MDQgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5jOgorCSAgamFjazogYWRkIHNvbWUgc2ltcGxlIGxvZyBoYW5kbGVycyBmb3IgamFjaworCSAgQWRkIGxvZyBoYW5kbGVycyBmb3IgamFjayB0aGF0IHdyaXRlIHRvIHRoZSBnc3QgZGVidWcgbG9nLiBUaGlzIGF2b2lkcyBzcGFtbWluZworCSAgdGhlIGNvbnNvbGUgd2hlbiBlLmcuIHVzaW5nIGF1dG9hdWRpb3NpbmssIGhhdmluZyB0aGUgamFjayBlbGVtZW50cyBpbnN0YWxsZWQsCisJICBidXQgbm90IHJ1bm5pbmcgamFjay4KKworMjAxNC0wMi0yMiAyMTozMToyMSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyc3JjOiBoYW5kbGUgb2xkIGFuZCBvZGQgZHJpdmVyIGJlaGF2aW91ciB3aGVuIGxpc3RpbmcgY29udHJvbHMKKworMjAxMy0xMS0yOCAxNjo1NDo1OCAtMDgwMCAgRGFycnlsIEdhbXJvdGggPGRnYW1yb3RoQHV2aWMuY2E+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlaWlyZmlsdGVyLmM6CisJICBhdWRpb2Z4YmFzZWlpcmZpbHRlcjogY2hlY2sgaWYgY29lZmZpY2llbnRzIGFyZSBwcm92aWRlZCBpbnNpZGUgZmlsdGVyIGxvY2sKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTk1MjQKKworMjAxNC0wMi0yMSAxOTo0Njo0NCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJzcmM6IGFsc28gdW5zZXQgSU5URVJMQUNFRCBmbGFnIG9uIGJ1ZmZlcnMgaWYgZnJhbWUgaXMgbm90IGludGVybGFjZWQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjQ4OTkKKworMjAxNC0wMi0yMSAxNDozMTo1OSArMDAwMCAgU2ltb24gRmFybnN3b3J0aCA8c2ltb24uZmFybnN3b3J0aEBvbmVsYW4uY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyc3JjOiBGbGFnIGludGVybGFjZWQgYnVmZmVycyBhcyBpbnRlcmxhY2VkLgorCSAgV2UgY29ycmVjdGx5IGluZGljYXRlIHRoZSBmaWVsZCBvcmRlcmluZyBvbiBpbnRlcmxhY2VkIGJ1ZmZlcnMsIGJ1dCBmYWlsIHRvCisJICBmbGFnIHRoZW0gYXMgY29udGFpbmluZyBpbnRlcmxhY2VkIHZpZGVvLCB3aGljaCB3ZSBuZWVkIHRvIGRvIGhlcmUgYmVjYXVzZQorCSAgd2Ugc2lnbmFsIGludGVybGFjZS1tb2RlPW1peGVkIGluIG91ciBjYXBzLiBUaGlzIG1lYW5zIHRoYXQgZG93bnN0cmVhbQorCSAgZWxlbWVudHMgKGxpa2UgdmFhcGlwb3N0cHJvYyBmcm9tIGdzdHJlYW1lci12YWFwaSkgZG9uJ3QgcmVjb2duaXNlIHRoZXNlCisJICBidWZmZXJzIGFzIGluIG5lZWQgb2YgZGVpbnRlcmxhY2luZy4KKwkgIEZpeCB0aGlzIGJ5IHNldHRpbmcgdGhlIGludGVybGFjZWQgZmxhZyBvbiBhbGwgaW50ZXJsYWNlZCBidWZmZXJzLgorCSAgU2lnbmVkLW9mZi1ieTogU2ltb24gRmFybnN3b3J0aCA8c2ltb24uZmFybnN3b3J0aEBvbmVsYW4uY28udWs+CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI0ODk5CisKKzIwMTQtMDItMTkgMTM6NTY6MzcgLTAzMDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHIudmVyZGVqb0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogYmUgbW9yZSBzdHJpY3QgYXQgQURUUyBoZWFkZXIgcGFyc2luZworCSAgQWRkcyB0d28gZXh0cmEgY2hlY2tzOgorCSAgLSBTYW1wbGluZyBmcmVxdWVuY3kgb24gaGVhZGVyIGNhbid0IGJlIDE1LgorCSAgLSBGcmFtZSBzaXplIHNob3VsZCBiZSBhdCBsZWFzdCA5IG9yIDcsIGRlcGVuZGluZworCSAgb24gd2hldGhlciBDUkMgcHJvdGVjdGlvbiBpcyBwcmVzZW50LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNDYzOAorCisyMDE0LTAyLTE5IDEzOjM1OjU5IC0wMzAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyLnZlcmRlam9Ac2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IG1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBBRFRTIGRhdGEKKwkgIFdlIG5lZWQgYXQgbGVhc3QgNiBieXRlcyB0byBwYXNzIG92ZXIgdG8gX2dldF9mcmFtZV9sZW4oKQorCSAgYnV0IHdlIHdlcmUganVzdCBjaGVja2luZyBmb3IgYSBtaW5pbXVtIG9mIDIgYnl0ZXMgZm9yIHRoZQorCSAgc3luY3dvcmQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI0NjM4CisKKzIwMTQtMDItMjAgMjI6NTI6NTcgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9kZXRlY3QuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9kZXRlY3QuaDoKKwkgIGF1dG9kZXRlY3Q6IGNoZWNrIGlmIHRoZSBraWQgaGFzIGEgc3luYyBwcm9wZXJ0eQorCSAgcHJldmlvdXNseSBhdXRvdmlkZW9zcmMgZGlkIG5vdCBoYXZlIGEgc3luYyBwcm9wZXJ0eSBhbmQgdjRsMnNyYyBoYXMgbm9uZSBlaXRoZXIuCisKKzIwMTQtMDItMTkgMjE6NTU6NTIgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuaDoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NyYy5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmg6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvZGV0ZWN0LmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvZGV0ZWN0Lmg6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmg6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5oOgorCSAgYXV0b2RldGVjdDogdXNlIGEgY29tbW9uIGJhc2VjbGFzcworCSAgVGhpcyBtYWtlcyB0aGUgYWN0dWFsIGVsZW1lbnRzIHN1cGVyIHNpbXBsZS4gV2UncmUgdXNpbmcgdGhlIEVMRU1FTlRfRkxBRyB0bworCSAgY29uZmlndXJlIHNvdXJjZS9zaW5rIGFuZCBhIHN0cmluZyBmb3IgdGhlIEF1ZGlvL1ZpZGVvIHR5cGUuCisKKzIwMTQtMDItMTQgMTc6MTQ6NDIgLTA4MDAgIEFsZWl4IENvbmNoaWxsbyBGbGFxdcOpIDxhbGVpeEBvYmxvbmcuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBhZGQgdGxzLWRhdGFiYXNlIHByb3BlcnR5CisJICBBZGQgc3VwcG9ydCBmb3IgYSBuZXcgcHJvcGVydHk6IHRscy1kYXRhYmFzZS4gSWYgdGhlIHByb3BlcnR5IGlzIHNldCwKKwkgIHRoZSBjZXJ0aWZpY2F0ZSBkYXRhYmFzZSB3aWxsIGJlIGdpdmVuIHRvIHRoZSBydHNwIGNvbm5lY3Rpb24gaWYgVExTCisJICBwcm90b2NvbCBpcyBiZWluZyB1c2VkLiBJZiB0aGUgc2VydmVyIGNlcnRpZmljYXRlIGNhbid0IGJlIHZlcmlmaWVkIHdpdGgKKwkgIHRoZSBkZWZhdWx0IGRhdGFiYXNlLCB0aGlzIGFkZGl0aW9uYWwgZGF0YWJhc2Ugd2lsbCBiZSB1c2VkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNDM5NgorCisyMDE0LTAyLTE5IDIyOjIxOjU0ICswMTAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9yaW5nYnVmZmVyLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJICBvc3hhdWRpbzogcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMKKworMjAxNC0wMi0xOSAyMToyNjowMyArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvZGV0ZWN0LmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvZGV0ZWN0Lmg6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkgIGF1dG9kZXRlY3Q6IGV4dHJhY3QgY29tbW9uIGhlbHBlciBjb2RlCisJICBUaGUgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgdGhlIHByZXR0eSBuYW1lcyBpcyBiYXNpY2FsbHkgdGhlIHNhbWUuIFVzZSBvbmUgYW5kIGFkZAorCSAgYSBwYXJhbWV0ZXIuCisKKzIwMTQtMDItMTkgMjE6MDE6MzkgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXV0b2RldGVjdC5jOgorCSAgYXV0b2RldGVjdDogaW1wcm92ZSB0aGUgdGVzdHMKKwkgIEFkZCBmYWtlIGF1ZGlvL3ZpZGVvIHNpbmtzLiBQcmV2aW91c2x5IHJ1bm5pbmcgdGhlIHRlc3QgbWlnaHQgYmUgZmxha3kgZHVlIHRvCisJICB0aGUgdXNlIG9mIHJlYWwgZWxlbWVudHMgKGhhcmR3YXJlIGluIHVzZSksIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8gdGVzdCBoZXJlLgorCSAgQWRkIHR3byBtb3JlIHRlc3RzIHRoYXQgY2hlY2sgdGhhdCB0aGUgZmFrZXMgYXJlIGNob3Nlbi4KKworMjAxNC0wMi0xOSAxNToxOTozMCArMDEwMCAgQnJhbmlzbGF2IEthdHJlbmlhayA8YmthdHJlbmlha0BudXZvdGVjaG5vbG9naWVzLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBkbyBub3QgZW1pdCBlcnJvciB3aGVuIGNvbm5lY3Rpb24gd2l0aCB1bmtub3duIHNpemUgZW5kcworCSAgQ29tbWl0IDQ2ZmQxMmFlNWVjNTMyMDBiMTZkZmQ3ZjE3MDQ4ZDZiYzYwZmJmYmMgaW50cm9kdWNlZCBjb25uZWN0aW9uCisJICByZWNvdmVyeS4gQnV0IHdoZW4gc2VydmVyIGRvZXMgbm90IHNwZWNpZnkgY29udGVudC1zaXplLAorCSAgc291cGh0dHBzcmMgdHJpZXMgdG8gcmVjb25uZWN0IGV2ZW4gYWZ0ZXIgcmVndWxhciBlbmQgb2Ygc3RyZWFtLgorCSAgSHR0cCBzZXJ2ZXIgcmVwbGllcyAgd2l0aCBTT1VQX1NUQVRVU19SRVFVRVNURURfUkFOR0VfTk9UX1NBVElTRklBQkxFCisJICBidXQgc291cGh0dHBzcmMgc3RpbGwgZW1pdHMgZXJyb3IgaW5zdGVhZCBvZiBFT1MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI0NzE3CisJICBTaWduZWQtb2ZmLWJ5OiBCcmFuaXNsYXYgS2F0cmVuaWFrIDxia2F0cmVuaWFrQG51dm90ZWNobm9sb2dpZXMuY29tPgorCisyMDE0LTAyLTE5IDExOjI2OjIyICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdXRvZGV0ZWN0LmM6CisJICBhdXRvZGV0ZWN0OiBmaXggdGhlIGRpc2FibGVkIHRlc3QKKwkgIFVzZSBhIHNoYXJlZCBoZWxwZXIgZm9yIGJvdGggdGVzdHMuIEl0IHR1cm5zIG91dCB0aGF0IHRoZSB2YWxncmluZCB2YXJpYW50IGlzCisJICBmaW5lIChtYXliZSBkdWUgdG8gcGlja2luZyB1cCBwdWxzZXNpbmsgdGhvdWdoKS4KKworMjAxNC0wMi0xOSAxMTowNTozNSArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXV0b2RldGVjdC5jOgorCSAgYXV0b2RldGVjdDogcmVtb3ZlIGNydWZ0IGZyb20gdGhlIHRlc3QKKwkgIFJlbW92ZSB0aGUgb2Jzb2xldGUgdmVyc2lvbiBjaGVjayBhbmQgdXNlIHRoZSBpZ25vcmUgbWFjcm8gZm9yIHRoZSBkaXNhYmxlZCB0ZXN0LgorCisyMDE0LTAyLTE4IDIyOjU0OjQ1ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2ZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9paXJmaWx0ZXIuYzoKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBkb2NzOiB1c2UgZG9jYm9vayBtYXJrdXAgZm9yIHhpOmluY2x1ZGUKKwkgIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBjaGFuZ2UgaW4gZ3RrLWRvYy0xLjIwIHdoaWNoIHdyYXBzIHRoZSB8W118IGNvbnRlbnQgaW4KKwkgIENEQVRBIGJyZWFrIHhpOmlubGN1ZGUgZXhhbXBsZXMuIEFzIGluIGEgd2hvbGUgamhidWlsZCBjaGVja291dCB0aGVzZSB3aGVyZQorCSAgdGhlIG9ubHkgNCwgd2UncmUgZml4aW5nIHRoZW0gaW5zdGVhZC4KKworMjAxNC0wMi0xOCAyMjozNTo0NSArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC1kb2MuaDoKKwkgIGlzb21wNG11eDogZml4IGNvcHkgYW5kIHBhc3RlCisJICBUaGlzIGZpeGVzIGRvYyB3YXJuaW5ncy4KKworMjAxNC0wMi0xOCAyMTo0NDoyNCArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2RlYnVndXRpbHMvZ3N0Y2Fwc3NldHRlci5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC1kb2MuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmdhbmFseXNpcy5jOgorCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYzoKKwkgIGRvY3M6IHVzZSB0aGUgZ3RrLWRvYyBzeW50YXggdG8gbGluayB0byBwcm9wZXJ0aWVzCisJICBEb24ndCB1c2UgZG9jYm9vayB1bmxlc3MgbmVlZGVkLiBBbHNvIHN0aXAgb3RoZXIgZG9jYm9vayB0YWdzIGluIHRoZSB0aGUgZmlsZXMgd2UgZml4LgorCisyMDE0LTAyLTE4IDExOjI4OjE4ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGZpeCBjcmFzaCB3aGVuIGdldHRpbmcgdGhlIGN1cnJlbnQtZGV2aWNlIGluIE5VTEwtPlJFQURZCisJICBUaGUgImdvdG8gdW5sb2NrIiBpcyB3cm9uZyBhcyBpbiB0aGlzIGNvZGUgcGF0aCB3ZSBoYXZlbid0IHRha2UgdGhlIGxvY2sgeWV0LgorCSAgRml4ZXMgIzcyNDYxOQorCisyMDE0LTAyLTE0IDIyOjUwOjQ5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBzb3VwOiBXZSBuZWVkIGxpYnNvdXAgPj0gMi40MCBmb3IgcHJvcGVyIHVzYWdlIG9mIHRoZSBjb250ZW50IGRlY29kZXIKKwkgIFByZXZpb3VzIHZlcnNpb25zIGRpZCBub3QgY29uc2lkZXIgb3VyIGNodW5rIGFsbG9jYXRvciBhbmQgYWxsb2NhdGVkCisJICBtZW1vcnkgYnkgdGhlbXNlbHZlcywgd2hpY2ggY2F1c2VkIGNyYXNoZXMgYW5kIGJyb2tlbiBiZWhhdmlvdXIuCisKKzIwMTQtMDItMTQgMTU6Mjc6MjAgLTA1MDAgIFdpbGxpYW0gSm9uIE1jQ2FubiA8d2lsbGlhbS5qb24ubWNjYW5uQGdtYWlsLmNvbT4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICBkb2NzOiBmaXggbWlzbWF0Y2hlZCBwYXJhIHRhZ3MKKwkgIG5ld2VyIGd0a2RvYyBpcyBtb3JlIHNlbnNpdGl2ZSB0byBtaXNtYXRjaGVkIGRvY2Jvb2sgdGFncy4KKwkgIFRoaXMgZml4ZXMgdGhlIGJ1aWxkIGluIG1hc3Rlci4KKworMjAxNC0wMi0xNCAxNTo1OTo0NiArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBhZGQgc3VwcG9ydCBmb3Igc2VyaWFsaXplZCBxdWVyaWVzCisJICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMzg1MAorCisyMDE0LTAyLTE0IDE1OjUzOjU1ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkgIHRlc3RzOiBmaXggdHlwZWNhc3QgdG8gZml4IGNvbXBpbGF0aW9uCisKKzIwMTQtMDItMTQgMTI6MDE6MDAgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBwcm94eSBjYXBzIGFuZCBhbGxvY2F0aW9uIG9uIFJUUCBwYWRzCisJICByZWN2X3J0cF9zaW5rOiBhbGxvdyBwcm94eWluZyBvZiB0aGUgYWxsb2NhdGlvbiBxdWVyeS4KKwkgIHNlbmRfcnRwX3Npbms6IGFsbG93IHByb3h5aW5nIG9mIGNhcHMgYW5kIGFsbG9jYXRpb24uIFRoaXMgYWxsb3dzIHVzIHRvCisJICBxdWVyeSBjYXBzIGRvd25zdHJlYW0gYXMgd2VsbCBhcyBnZXQgYW4gYWxsb2NhdG9yIGZyb20gZG93bnN0cmVhbS4KKwkgIHNlbmRfcnRwX3NyYzogYWxsb3cgcHJveHkgb2YgY2FwcywgdGhpcyBtYWtlcyB0aGUgY2FwcyBxdWVyeSBkbworCSAgdXBzdHJlYW0uCisJICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMzg1MAorCisyMDE0LTAyLTEzIDEyOjI5OjEzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBoYW5kbGUgdGFncyBpbiBtYWMgZW5jb2RpbmcKKwkgIENoZWNrIHRoZSBjaGFyc2V0IGZyb20gKEMpKioqIHRhZ3MgYW5kIHNldCB0aGUgY2hhcnNldAorCSAgdG8gY29udmVydCBmcm9tIE1BQyBlbmNvZGluZyBpZiBzdWl0YWJsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjMxNjYKKworMjAxNC0wMi0xMyAxMjowOToxMyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBVc2UgbmV3IGF1dG9tYXRpY19lb3MgQVBJIGZyb20gYmFzZXNyYworCSAgV2Ugd2FudCB0byBub3RpY2Ugb3Vyc2VsdmVzIHRoYXQgd2UncmUgRU9TLiBPdGhlcndpc2Ugd2Ugd2lsbAorCSAgYWx3YXlzIGNhbmNlbCByZXF1ZXN0cyBpbiB0aGUgdmVyeSBlbmQgYW5kIGNvbmZ1c2UgdGhlIHNlcnZlci4uLgorCSAgYW5kIGFsc28gbWFrZSBpdCBpbXBvc3NpYmxlIHRvIHVzZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zLgorCisyMDE0LTAyLTEzIDExOjExOjEzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IENvbnNpc3RlbnRseSB1c2UgaGF2ZV9zaXplIGluc3RlYWQgb2YgY29udGVudF9zaXplIT0wCisKKzIwMTQtMDItMTMgMTA6MzA6MDkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogRnJlZSBleHRyYSBoZWFkZXJzIHdoZW4gZmluYWxpemluZyB0aGUgZWxlbWVudAorCSAgSXQncyBzZXQgYXMgcHJvcGVydHkgYnkgdGhlIGFwcGxpY2F0aW9uLCB3ZSBzaG91bGQgbm90IGp1c3QgcmVzZXQKKwkgIHByb3BlcnRpZXMgd2hlbiBnb2luZyBiYWNrIHRvIFJFQURZLgorCisyMDE0LTAyLTEzIDEwOjI4OjEzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IFByb3Blcmx5IGNsb3NlIHRoZSBzZXNzaW9uIHdoZW4gZ29pbmcgYmFjayB0byBOVUxMCisJICBEb24ndCB3YWl0IGZvciB0aGF0IHVudGlsIHRoZSBlbGVtZW50IGlzIGRpc3Bvc2VkLgorCisyMDEzLTAyLTI4IDEyOjIwOjUyICswMTAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuaDoKKwkgIHNvdXBodHRwc3JjOiBhZGQgc3VwcG9ydCBmb3Iga2VlcC1hbGl2ZSBzZXNzaW9ucworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5OTkyNgorCisyMDE0LTAyLTEyIDEzOjAwOjEzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuaDoKKwkgIHNvdXBodHRwc3JjOiBBZGQgImNvbXByZXNzIiBwcm9wZXJ0eSB0byBlbmFibGUvZGlzYWJsZSBhdXRvbWF0aWMgZ3ppcC9kZWZsYXRlIGNvbnRlbnQgZW5jb2RpbmcgaGFuZGxpbmcKKworMjAxNC0wMi0xMiAxMjozOToxMCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBSZXRyeSBjb25uZWN0aW9uIGlmIHdlJ3JlIGZpbmlzaGVkIGJlZm9yZSB0aGUgY29udGVudCBzaXplIG9ubHkgaWYgd2UgYWN0dWFsbHkgaGF2ZSBhIGNvbnRlbnQgc2l6ZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMjE4NQorCisyMDE0LTAyLTEyIDEwOjA4OjUwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwdXRpbHMuYzoKKwkgIHNvdXB1dGlsczogRml4IGNvbXBpbGVyIHdhcm5pbmcKKwkgIGdzdHNvdXB1dGlscy5jOjM1OjI1OiBlcnJvcjogY29tcGFyaXNvbiBvZiBjb25zdGFudCA5IHdpdGggZXhwcmVzc2lvbiBvZiB0eXBlCisJICAnU291cExvZ2dlckxvZ0xldmVsJyBpcyBhbHdheXMgZmFsc2UKKwkgIFstV2Vycm9yLC1XdGF1dG9sb2dpY2FsLWNvbnN0YW50LW91dC1vZi1yYW5nZS1jb21wYXJlXQorCisyMDE0LTAxLTA3IDIzOjAwOjU2IC0wMzAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyLnZlcmRlam9Ac2lzYS5zYW1zdW5nLmNvbT4KKworCSogZXh0L3NvdXAvTWFrZWZpbGUuYW06CisJKiBleHQvc291cC9nc3Rzb3VwLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5oOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmg6CisJKiBleHQvc291cC9nc3Rzb3VwdXRpbHMuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXB1dGlscy5oOgorCSAgc291cGh0dHAqOiBhZGQgYWJpbGl0eSB0byBkbyBIVFRQIHNlc3Npb24gbG9nZ2luZworCSAgVGhpcyBjaGFuZ2VzZXQgYWRkcyB0aGUgbG9nZ2luIGluZnJhc3RydWN0dXJlIGFuZAorCSAgbW9kcyBib3RoIHNvdXBodHRwc3JjIGFuZCBzb3VwaHR0Y2xpZW50c2luayB0byB1c2UgaXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIxNzY0CisKKzIwMTQtMDItMDcgMTQ6MDA6MTUgKzAxMDAgIGRpdmhhZXJlIDxkaXJrLnZhbmhhZXJlbmJvcmdoQHVnZW50LmJlPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thOiBhZGQgc3VwcG9ydCBmb3IgR1JBWTgsIEJHUiBhbmQgUkdCIHZpZGVvIGNvbG91cnNwYWNlcyBpbiBWX1VOQ09NUFJFU1NFRCBjb2RlYworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMzg0OQorCisyMDE0LTAyLTExIDEzOjI1OjQ2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IEFkZCBtYXBwaW5nIGZvciBOT1RfRk9VTkQgYW5kIE5PVF9BVVRIT1JJWkVEIGVycm9ycworCisyMDE0LTAyLTExIDEzOjI1OjIyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IERvbid0IGR1cGxpY2F0ZSBzdGF0dXNfY29kZSB0byBHU3RyZWFtZXIgZXJyb3IgbWFwcGluZworCisyMDE0LTAyLTA5IDIzOjM4OjQ0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZ29vbS9maWx0ZXJzLmM6CisJKiBnc3QvZ29vbTJrMS9maWx0ZXJzLmM6CisJICBnb29tOiBSZW1vdmUgdW51c2VkIGZ1bmN0aW9ucworCisyMDE0LTAyLTA5IDIzOjIxOjIwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkgIG1hdHJvc2thcGFyc2U6IENvbW1lbnQgb3V0IHNvbWUgdW51c2VkIGZ1bmN0aW9ucyB1c2VkIG9ubHkgZnJvbSB0aGUgY29tbWVudGVkIG91dCBwdWxsLW1vZGUgY29kZQorCisyMDE0LTAyLTA4IDIxOjAxOjMyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSAgaWQzdjJtdXg6IEZpeCBhbm90aGVyIGNvbXBpbGVyIHdhcm5pbmcKKworMjAxNC0wMi0wOCAxNzo0MzozMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBGaXggaW1wbGljaXQgZW51bSBjb252ZXJzaW9uIGNvbXBpbGVyIHdhcm5pbmcKKwkgIGVycm9yOiBpbXBsaWNpdCBjb252ZXJzaW9uIGZyb20gZW51bWVyYXRpb24gdHlwZQorCSAgJ1NvdXBTdGF0dXMnIHRvIGRpZmZlcmVudCBlbnVtZXJhdGlvbiB0eXBlICdTb3VwS25vd25TdGF0dXNDb2RlJworCisyMDE0LTAyLTA4IDE3OjQxOjIxICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbnRlcmxlYXZlLmM6CisJICBpbnRlcmxlYXZlOiBGaXggdW5pdGlhbGl6ZWQgdmFyaWFibGUgY29tcGlsZXIgd2FybmluZyBpbiB0ZXN0CisJICBlcnJvcjogdmFyaWFibGUgJ21hc2snIGlzIHVzZWQgdW5pbml0aWFsaXplZAorCSAgd2hlbmV2ZXIgJ2lmJyBjb25kaXRpb24gaXMgZmFsc2UgWy1XZXJyb3IsLVdzb21ldGltZXMtdW5pbml0aWFsaXplZF0KKworMjAxNC0wMi0wOCAxNzoyNzo1MSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzoKKwkgIGlkM3YybXV4OiBGaXggdW5pdGlhbGl6ZWQgdmFyaWFibGUgY29tcGlsZXIgd2FybmluZworCSAgZXJyb3I6IHZhcmlhYmxlICdpbWFnZV90eXBlJyBpcyB1c2VkIHVuaW5pdGlhbGl6ZWQKKwkgIHdoZW5ldmVyICdpZicgY29uZGl0aW9uIGlzIGZhbHNlIFstV2Vycm9yLC1Xc29tZXRpbWVzLXVuaW5pdGlhbGl6ZWRdCisKKzIwMTQtMDItMDggMTc6MjU6MjcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3M0L29zczQtYXVkaW8uaDoKKwkgIG9zczQ6IEZpeCB0eXBvIGluIGhlYWRlciBpbmNsdWRlIGd1YXJkCisJICBlcnJvcjogJ0dTVF9PU1M0X0FVRElPX0gnIGlzIHVzZWQgYXMgYSBoZWFkZXIgZ3VhcmQgaGVyZSwKKwkgIGZvbGxvd2VkIGJ5ICNkZWZpbmUgb2YgYSBkaWZmZXJlbnQgbWFjcm8gWy1XZXJyb3IsLVdoZWFkZXItZ3VhcmRdCisKKzIwMTQtMDItMDggMTc6MjQ6MDYgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHNlbmQuYzoKKwkgIHJ0cHJ0eHNlbmQ6IEZpeCB1bml0aWFsaXplZCB2YXJpYWJsZSBjb21waWxlciB3YXJuaW5nCisJICB2YXJpYWJsZSAncnR4X3NzcmMnIGlzIHVzZWQgdW5pbml0aWFsaXplZCB3aGVuZXZlcgorCSAgJ2lmJyBjb25kaXRpb24gaXMgZmFsc2UgWy1XZXJyb3IsLVdzb21ldGltZXMtdW5pbml0aWFsaXplZF0KKworMjAxNC0wMi0wOCAxNzoyMToxOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5jOgorCSAgcnRwYWMzZGVwYXk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKworMjAxNC0wMi0wOCAxNzoxOToxOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2ZseC9mbHhfZm10Lmg6CisJICBmbHg6IEZpeCB0eXBvIGluIGhlYWRlciBpbmNsdWRlIGd1YXJkCisJICBlcnJvcjogJ19fR1NUX0ZMWF9GTVRfX0hfXycgaXMgdXNlZCBhcyBhIGhlYWRlciBndWFyZCBoZXJlLAorCSAgZm9sbG93ZWQgYnkgI2RlZmluZSBvZiBhIGRpZmZlcmVudCBtYWNybyBbLVdlcnJvciwtV2hlYWRlci1ndWFyZF0KKworMjAxNC0wMi0wNyAxMDowNzo0MSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiByZW1vdmUgaGF2ZV9kdHMgZmxhZyBmcm9tIHBhZHMKKwkgIEl0IHdhcyB1c2VkIGluIHRoZSBwYXN0IGluIDAuMTAgd2hlbiB0aGVyZSB3YXMgbm8gZXhwbGljaXQgRFRTCisJICBmaWVsZCBpbiBidWZmZXJzLCBub3cgd2UgaGF2ZSBpdCBpbiAxLnggc2VyaWVzIGFuZCB3ZSBjYW4KKwkgIGNoZWNrIGl0IGRpcmVjdGx5IHdpdGggR1NUX0JVRkZFUl9EVFNfSVNfVkFMSUQKKworMjAxNC0wMi0wNyAwMTo0OToyNiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBpbXByb3ZlIHN1cHBvcnQgZm9yIHNwYXJzZSBzdHJlYW1zCisJICBEbyBub3QgdHJ5IHRvIHVzZSBzdWJzZXF1ZW50IGJ1ZmZlciB0aW1lc3RhbXBzIHRvIGNhbGN1bGF0ZQorCSAgc3BhcnNlIHN0cmVhbXMgZHVyYXRpb25zIGJlY2F1c2UgdGhlIHN0cmVhbSBpcyBzcGFyc2UgYW5kCisJICB0aGUgYnVmZmVycyBtaWdodCBub3QgYmUgJ3RpbWUgYWRqYWNlbnQnLiBTbyByZWx5IG9uIHRoZQorCSAgZHVyYXRpb24gYW5kIGdpdmUgdGhlIG9wdGlvbiB0byB0aGUgcGFkIHRvIHByb3ZpZGUKKwkgIGN1c3RvbSAnZW1wdHknIGJ1ZmZlcnMgdG8gcmVwcmVzZW50IHRoZSBnYXBzIGluIHRoZQorCSAgc3RyZWFtLCB0aGlzIGNhbiB2YXJ5IG9uIGhvdyB0aGUgZGF0YSBpcyByZXByZXNlbnRlZC4KKwkgIFJpZ2h0IG5vdywgdGhlIG9ubHkgc3BhcnNlIHN0cmVhbSBzdXBwb3J0ZWQgaXMgdHgzZyBzdWJ0aXRsZXMuCisKKzIwMTQtMDItMDYgMTI6MTU6MjIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogYWRkIHN1cHBvcnQgZm9yIHRleHQveC1yYXcgc3VidGl0bGVzCisJICBBZGRzIGl0IHRvIG1wNG11eCwgcXRtdXggYW5kIGdwcG11eC4KKwkgIEJ1ZmZlcnMgbmVlZCB0byBiZSBwcmVmaXhlZCB3aXRoIDIgYnl0ZXMgZm9yIHRoZSB0ZXh0IGxlbmd0aCBiZWZvcmUKKwkgIGJlaW5nIG11eGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU4MTI5NQorCisyMDE0LTAyLTA2IDEyOjA5OjAxIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSogZ3N0L2lzb21wNC9hdG9tcy5oOgorCSogZ3N0L2lzb21wNC9mb3VyY2MuaDoKKwkgIHF0bXV4OiBhZGQgc3VwcG9ydCBmb3IgdGhlIFRYM0cgYXRvbXMKKwkgIEFkZHMgZnVuY3Rpb25zIGZvciBjcmVhdGluZyBhbmQgc2V0dGluZyB2YWx1ZXMgcmVsYXRlZCB0byB0aGUKKwkgIHR4M2cgYXRvbSBmb3IgcmF3IHRleHQgc3VidGl0bGUgc3VwcG9ydC4KKwkgIFFURkYgc3BlYyBoYXMgaW5mb3JtYXRpb24gb24gdGhvc2UgYXRvbXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD01ODEyOTUKKworMjAxNC0wMi0wNSAxMDoyNzo1NCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXhtYXAuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXhtYXAuaDoKKwkgIHF0bXV4OiBhZGQgc3VidGl0bGUgc3VwcG9ydCB0byBxdG11eG1hcCBzdHJ1Y3R1cmVzCisJICBhZGRzIGJhc2ljIHN0dWJzIGZvciBzdWJ0aXRsZSBzdXBwb3J0IGFyb3VuZCB0aGUgcXRtdXggYW5kCisJICBxdG11eG1hcCBzdHJ1Y3R1cmVzLiBTdGlsbCBubyByZWFsIHN1YnRpdGxlIGltcGxlbWVudGVkLCBidXQKKwkgIGJhc2ljIGZ1bmN0aW9ucyBpbiBwbGFjZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU4MTI5NQorCisyMDE0LTAxLTIwIDE3OjMxOjE0IC0wMzAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyLnZlcmRlam9Ac2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYTogZmFjdG9yIG91dCByZWFkIGNvbnRleHQgaW5pdC9yZXNldAorCSAgV2hpbGUgYXQgdGhpcywgbW92ZSBfdHJhY2tfcmVzZXQoKSB0byB0cmFjay1pZHMKKwkgIHNvIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgY29tbW9uIHJlYWQgY29udGV4dAorCSAgcmVzZXQgcm91dGluZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjI3MDUKKworMjAxNC0wMi0wNiAxMjoyMTowNyArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHJldi5jOgorCSAgZWZmZWN0djogZml4IGRvYyBzZWN0aW9uIG9mIHJldnR2IGVsZW1lbnQKKworMjAxNC0wMi0wNSAxMjo0Njo1NCArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogc3lzL29zeHZpZGVvL01ha2VmaWxlLmFtOgorCSAgb3N4dmlkZW86IEZpeCBsaWJ0b29sIHVzYWdlCisJICAtLXRhZz1DQyBpcyBuZWVkZWQgZm9yIHN0YXRpYyBidWlsZAorCisyMDE0LTAxLTE2IDExOjI2OjQxICswMDAwICBNYXR0aGlldSBCb3Vyb24gPG1hdHRoaWV1LmJvdXJvbkBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBkbyBub3QgdHJ5IHNldCBkZWludGVybGFjZSBtZXRob2QgaWYgcGFzc3Rocm91Z2ggaXMgZW5hYmxlZAorCSAgRml4ZXMgYW4gaXNzdWUgd2l0aCBwcm9ncmVzc2l2ZSBjb250ZW50IGFuZCB1bnN1cHBvcnRlZCB2aWRlbyBmb3JtYXRzCisJICBmb3IgdGhlIGRlaW50ZXJsYWNlIG1ldGhvZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTk2MzYKKworMjAxNC0wMi0wNCAyMToyNjo1NiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogb3JkZXIgZm9ybWF0IGluIHRlbXBsYXRlIGNhcHMgYnkgcHJlZmVyZW5jZQorCSAgVG8gbWluaW1pc2UgcmlzayBvZiBiYWQgZml4YXRpb24sIHRob3VnaCBhdWRpb2NvbnZlcnQKKwkgIGF0IGxlYXN0IHNob3VsZCBiZSBzbWFydCBlbm91Z2ggdG8gYXZvaWQgaXQuCisKKzIwMTQtMDItMDIgMDk6NTc6MDMgLTA4MDAgIERhbiBLZWdlbCA8ZGFua0BrZWdlbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIHY0bDI6IFJlbW92ZSBvYnNvbGV0ZSBkZWZpbml0aW9uIEdTVF9WNEwyX01JU1NJTkdfQlVGREVDTAorCSAgVGhlIG9ubHkgdXNlIHdhcyByZW1vdmVkIGJ5IDllZGMwYzAzNjVmNzlhYjA3ZmYyZTY1NDYxYzY2OTZlMzkzMWEzZjAKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjM0NDYKKworMjAxNC0wMi0wNCAxMzo0Mzo1NiArMDEwMCAgUmFmYcWCIE11xbx5xYJvIDxnYWx0Z2VuZG9AbzIucGw+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6CisJICBnc3Q6IERvbid0IHVzZSBlbmRpYW5uZXNzLXNwZWNpZmljIFM4IGF1ZGlvIGZvcm1hdAorCSAgSXQgZG9lcyBub3QgZXhpc3QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIzMzMxCisKKzIwMTQtMDEtMzEgMTQ6MTc6NTQgKzAwMDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm9vdmVybGF5LmM6CisJICBjYWlyb292ZXJsYXk6IGFkZCBzdXBwb3J0IGZvciBSR0IxNgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMzI4OQorCisyMDE0LTAxLTMwIDA5OjQzOjUwICswMTAwICBQZXIgeCBKb2hhbnNzb24gPHBlcnhqb2hAYXhpcy5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkgIG1hdHJvc2thbXV4OiBGaXggY29uc3RhbnRseSBncm93aW5nIHVzZWQgdWlkIGxpc3QKKwkgIE1vdmVzIHRoZSB1c2VkIHVpZCBsaXN0IHRvIHRoZSBjbGFzcyB0byBhdm9pZCBoYXZpbmcgaXQgZ3JvdyBmb3JldmVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMzI2OQorCisyMDE0LTAxLTMwIDEwOjQ0OjA1ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZDQ4YmVkMyB0byAxYTA3ZGE5CisKKzIwMTQtMDEtMjQgMDE6NTI6MDggKzAwMDAgIE1pa2UgU2hlbGRvbiA8ZWxsZW9AZ251Lm9yZz4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogSWdub3JlIEJyb2FkY2FzdCBXYXZlIEZvcm1hdCAoQldGKSB0YWdzIHdoZW4gc2VhcmNoaW5nIGZvciAnZm10JyBjaHVuaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMzEyNQorCisyMDE0LTAxLTI5IDEwOjM3OjUzICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBhdXguYzoKKwkgIGNoZWNrOiBVc2UgZmFrZXNpbmsgc3luYz1UcnVlIGluc3RlYWQgb2YgYW4gYXVkaW8gc2luaworCSAgRW5zdXJlcyB0aGUgdGVzdCBjYW4gcnVuIG9uIHN5c3RlbXMgd2l0aG91dCBhbHNhIChvciBhbnkgYXVkaW8gb3V0cHV0IGZvcgorCSAgdGhhdCBtYXR0ZXIpLCBhbmQgd2lsbCBhdm9pZCBwZW9wbGUgcnVubmluZyBidWlsZCBzbGF2ZXMgd29uZGVyaW5nIHdoYXQKKwkgIHRoZSBoZWxsIHdhcyBiZWVwaW5nIGR1cmluZyB0aGUgbmlnaHQgOikKKworMjAxNC0wMS0yNyAyMDowNTo0MiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJICBhYzNwYXJzZTogY3VzdG9tIGdldF9zaW5rX2NhcHMgaGFuZGxpbmcgZm9yIHByaXZhdGUgc3RyZWFtIGNhcHMKKwkgIC4uLiBub3cgdGhhdCB0aG9zZSBhcmUgdHJhbnNmb3JtZWQgcmF0aGVyIHRoYW4gcGFyc2VkLCBzb21lIHRyYW5zZm9ybWluZworCSAgb2YgY2FwcyBpcyByZXF1aXJlZCBhcyB3ZWxsIHRvIG1ha2UgYXV0by1wbHVnZ2luZyBzdWNjZWVkLgorCisyMDE0LTAxLTI1IDAyOjA2OjAwIC0wNTAwICBSeWFuIExvcnRpZSA8ZGVzcnRAZGVzcnQuY2E+CisKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDI6IGd1YXJkIHVzZSBvZiBFTk9EQVRBIHdpdGggI2lmZGVmCisJICBOb3QgYWxsIHN5c3RlbXMgd2l0aCB2NGwgaGF2ZSBFTk9EQVRBIGRlZmluZWQsIHNvIGNoZWNrIHRoYXQgd2UgaGF2ZSBpdAorCSAgYmVmb3JlIGF0dGVtcHRpbmcgdG8gdXNlIGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMjk1MworCisyMDE0LTAxLTI0IDEyOjM3OjM5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBSZXZlcnQgInJ0c3BzcmM6IFByb3h5IHJ0cGppdHRlcmJ1ZmZlciBkby1yZXRyYW5zbWlzc2lvbiBwcm9wZXJ0eSIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgOWY3YjExMjhiMWYwMGEyYjg3YTIzMmZmODkwODY3NTQ5YWI5NWJhNS4KKwkgIFRoaXMgc2hvdWxkIGJlIGhhbmRsZWQgYXV0b21hdGljYWxseSBiZSBydHNwc3JjIGlmIHRoZSBBVlBGIHByb2ZpbGUKKwkgIGlzIHVzZWQsIGFuZCBtYW51YWwgZW5hYmxpbmcgb2YgaXQgY2FuIGJlIGRvbmUgd2l0aCB0aGUgbmV3LW1hbmFnZXIKKwkgIHNpZ25hbC4KKworMjAxNC0wMS0yNCAxMDoyMToxMSArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGFkZCBzaWduYWwgdG8gbm90aWZ5IG9mIG5ldyBtYW5hZ2VyCisJICBTbyB0aGF0IHlvdSBjYW4gY29uZmlndXJlIGFuZCBjb25uZWN0IHRvIHNpZ25hbHMgb24gdGhlIHJ0cGJpbi4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIyODY2CisKKzIwMTQtMDEtMjMgMTU6MTc6NTggLTA4MDAgIEFsZWl4IENvbmNoaWxsbyBGbGFxdcOpIDxhbGVpeEBvYmxvbmcuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBQcm94eSBydHBqaXR0ZXJidWZmZXIgZG8tcmV0cmFuc21pc3Npb24gcHJvcGVydHkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjI4NjYKKworMjAxNC0wMS0yMSAxNzo1Mjo0NCArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBoYW5kbGUgZXhwZWN0ZWQgcGFja2V0IGJlaW5nIGFuIFJUWCBwYWNrZXQKKwkgIElmIHRoZSBleHBlY3RlZCBwYWNrZXQgKGRvX25leHRfc2VxbnVtIGlzIFRSVUUpIGlzIHRoZSBvbmUgd2UgcmVxdWVzdGVkCisJICBmb3IgcmV0cmFubWlzc2lvbiBlYXJsaWVyLCBkbyB0aGUgbG9naWMgdG8gdXBkYXRlIHRoZSByZXRyYW5zbWlzc2lvbgorCSAgc3RhdGlzdGljcyBhcyB3ZWxsIGJlZm9yZSBzZXR0aW5nIHVwIHRoZSB0aW1lcnMgZm9yIHRoZSBuZXh0IGV4cGVjdGVkCisJICBwYWNrZXQuCisJICBBbHNvIHJlc2V0IHRoZSByZXRyYW5zbWlzc2lvbiBjb3VudGVyIGlmIHRoZSB0aW1lciBpcyByZXVzZWQgZm9yIGFub3RoZXIKKwkgIHNlcW51bS4KKworMjAxNC0wMS0yMSAxNTo0ODoyMCArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBhZGQgYSBjYXBzIGFjY3VtdWxhdG9yIGZvciB0aGUgcmVxdWVzdC1wdC1tYXAgc2lnbmFsCisJICBBZGQgYW4gYWNjdW11bGF0b3IgdGhhdCBzdG9wcyB0aGUgc2lnbmFsIGVtaXNzaW9uIGFzIHNvb24gYXMgYSBjYXBzIGhhcworCSAgYmVlbiByZXRyaWV2ZWQuIE90aGVyd2lzZSB0aGUgZGVmYXVsdCBoYW5kbGVyIHdvdWxkIGNvbnRpbnVlIGVtaXR0aW5nCisJICB0aGUgc2lnbmFsIGFuZCBwb3NzaWJseSBvdmVyd3JpdGUgdGhlIHJlc3VsdCB3aXRoIE5VTEwgYWdhaW4uCisKKzIwMTQtMDEtMjEgMTU6MjU6NTQgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmM6CisJICBydHhyZWNlaXZlOiBjb3B5IGZsYWdzIGFuZCB0aW1lc3RhbXBzIGZyb20gb3JpZ2luYWwgYnVmZmVyCisKKzIwMTQtMDEtMjEgMTU6MjQ6NTIgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogaWdub3JlIGludmFsaWQgdGltZXN0YW1wcyBpbiBydHQgY2FsY3VsYXRpb24KKwkgIFdoZW4gdGhlIGlucHV0IGJ1ZmZlciBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgdGltZXN0YW1wLCBkb24ndCB0cnkgdG8KKwkgIGNhbGN1bGF0ZSB0aGUgcm91bmQtdHJpcC10aW1lLgorCisyMDE0LTAxLTE2IDE0OjIzOjEzIC0wMzAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyLnZlcmRlam9Ac2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYXBhcnNlOiBiZXR0ZXIgZGVmYXVsdCBjYXBzIHdoZW4gbm9uZSBzZXQKKwkgIFVzZXMgaW5mb3JtYXRpb24gZ2F0aGVyZWQgZHVyaW5nIEVCTUwgcGFyc2luZyB0bworCSAgZm9yZ2UgYSBtb3JlIHN1aXRhYmxlIHNldCBvZiBjYXBzIGluc3RlYWQgb2YgYmxpbmRseQorCSAgYXNzdW1pbmcgZXZlcnl0aGluZyBpcyB2aWRlby94LW1hdHJvc2thLgorCSAgRm9yIGNvbnNpc3RlbmN5LCBzdHJlYW0gdHlwZSByZXNldCB3YXMgYWRkZWQgdG8KKwkgIG1hdHJvc2thLWRlbXV4IHRvby4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjIzMTEKKworMjAxNC0wMS0xNSAxNzoyOTozNSArMDEwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwcnR4LmM6CisJICB0ZXN0czogcnRwcnR4Ojp0ZXN0X3J0eHJlY2VpdmVfZGF0YV9yZWNvbnN0cnVjdGlvbjogcmVtb3ZlIHVzZWxlc3MgY29kZSBmb3IgdHJpZ2dlcmluZyByZXRyYW5zbWlzc2lvbgorCSAgVGhlcmUgaXMgbm8gbmVlZCBhbnltb3JlIHRvIHB1c2ggeWV0IGFub3RoZXIgYnVmZmVyIGluIHJ0eHNlbmQKKwkgIGluIG9yZGVyIHRvIHRyaWdnZXIgdGhlIHByZXZpb3VzbHkgcmVxdWVzdGVkIHJldHJhbnNtaXNzaW9ucworCSAgdG8gYWN0dWFsbHkgaGFwcGVuLgorCisyMDE0LTAxLTE1IDE3OjI3OjE5ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBydHguYzoKKwkgIHRlc3RzOiBydHBydHg6OnRlc3RfcnR4cmVjZWl2ZV9kYXRhX3JlY29uc3RydWN0aW9uOiBmaXggcmFjZSBjb25kaXRpb24KKwkgIE5vdyB3aXRoIHJ0cHJ0eHNlbmQgcHVzaGluZyBydHggYnVmZmVycyBmcm9tIGEgZGlmZmVyZW50IHRocmVhZCwKKwkgIHRoaXMgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSByZXN1bHQgb2YgdGhlIHRlc3QgaXMgZGV0ZXJtaW5pc3RpYy4KKwkgIFRoaXMgY29kZSBtYWtlcyB1c2Ugb2YgR3N0Q2hlY2sncyBnbG9iYWwgR011dGV4IGFuZCBHQ29uZCB0aGF0IGFyZQorCSAgYmVpbmcgdXNlZCBpbnNpZGUgR3N0Q2hlY2sncyBzaW5rIHBhZCBjaGFpbigpIGZ1bmN0aW9uIGluIG9yZGVyCisJICB0byBzeW5jaHJvbml6ZSB3aXRoIGl0LgorCisyMDE0LTAxLTE1IDE3OjE3OjU3ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBydHguYzoKKwkgIHRlc3RzOiBydHBydHg6OnRlc3RfcnR4c2VuZGVyX3BhY2tldF9yZXRlbnRpb246IGZpeCByYWNlIGNvbmRpdGlvbgorCSAgTm93IHdpdGggcnRwcnR4c2VuZCBwdXNoaW5nIHJ0eCBidWZmZXJzIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkLAorCSAgdGhpcyBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIHJlc3VsdCBvZiB0aGUgdGVzdCBpcyBkZXRlcm1pbmlzdGljLgorCSAgVGhpcyBjb2RlIG1ha2VzIHVzZSBvZiBHc3RDaGVjaydzIGdsb2JhbCBHTXV0ZXggYW5kIEdDb25kIHRoYXQgYXJlCisJICBiZWluZyB1c2VkIGluc2lkZSBHc3RDaGVjaydzIHNpbmsgcGFkIGNoYWluKCkgZnVuY3Rpb24gaW4gb3JkZXIKKwkgIHRvIHN5bmNocm9uaXplIHdpdGggaXQuCisKKzIwMTQtMDEtMTUgMTE6MjY6MzMgKzAxMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jOgorCSAgdGVzdHM6IHJ0cHJ0eDo6dGVzdF9wdXNoX2ZvcndhcmRfc2VxOiBmaXggcmFjZSBjb25kaXRpb24KKwkgIE5vdyB3aXRoIHJ0cHJ0eHNlbmQgcHVzaGluZyBydHggYnVmZmVycyBmcm9tIGEgZGlmZmVyZW50IHRocmVhZCwKKwkgIHRoaXMgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSByZXN1bHQgb2YgdGhlIHRlc3QgaXMgZGV0ZXJtaW5pc3RpYy4KKwkgIFRoaXMgY29kZSBtYWtlcyB1c2Ugb2YgR3N0Q2hlY2sncyBnbG9iYWwgR011dGV4IGFuZCBHQ29uZCB0aGF0IGFyZQorCSAgYmVpbmcgdXNlZCBpbnNpZGUgR3N0Q2hlY2sncyBzaW5rIHBhZCBjaGFpbigpIGZ1bmN0aW9uIGluIG9yZGVyCisJICB0byBzeW5jaHJvbml6ZSB3aXRoIGl0LgorCisyMDE0LTAxLTE1IDA5OjQ3OjAzICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBydHguYzoKKwkgIHRlc3RzOiBydHBydHg6OnRlc3RfcHVzaF9mb3J3YXJkX3NlcTogZml4IGJ1ZmZlciByZWZjb3VudGluZworCisyMDE0LTAxLTIxIDEzOjQyOjM4ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJICBydHBydHhzZW5kOiBlbnN1cmUgdGhhdCBubyBydHggYnVmZmVycyBhcmUgc2VudCBhZnRlciBFT1MKKwkgIFRvIGRvIHRoYXQsIGVucXVldWUgdGhlIEVPUyBldmVudCB0byBiZSBzZW50IGZyb20gdGhlIHNyY3BhZCB0YXNrCisJICB0aHJlYWQgYW5kIGZsdXNoIHRoZSBxdWV1ZSByaWdodCBhZnRlcndhcmRzLCBzbyB0aGF0IG5vIG1vcmUgcnR4CisJICBidWZmZXJzIGNhbiBiZSBzZW50LCBldmVuIGlmIHRoZXJlIGFyZSBtb3JlIHJlcXVlc3RzIGNvbWluZyBpbi4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjIzNzAKKworMjAxNC0wMS0xNSAwOTo0NjoxNCArMDEwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5oOgorCSAgcnRwcnR4c2VuZDogcnVuIGEgbmV3IEdzdFRhc2sgb24gdGhlIHNyYyBwYWQKKwkgIFRoZSByZWFzb24gYmVoaW5kIHRoaXMgaXMgdG8gbWluaW1pemUgdGhlIHJldHJhbnNtaXNzaW9uIGRlbGF5LgorCSAgUHJldmlvdXNseSwgd2hlbiBhIE5BQ0sgd2FzIHJlY2VpdmVkLCBydHBydHhzZW5kIHdvdWxkIHB1dCBhCisJICByZXRyYW5zbWlzc2lvbiBwYWNrZXQgaW4gYSBxdWV1ZSBhbmQgaXQgd291bGQgc2VuZCBpdCBmcm9tIGNoYWluKCksCisJICBpLmUuIG9ubHkgYWZ0ZXIgYSBuZXcgYnVmZmVyIHdvdWxkIGFycml2ZS4KKwkgIFRoaXMgdW5mb3J0dW5hdGVseSB3YXMgY2F1c2luZyBiaWcgZGVsYXlzLCBpbiB0aGUgb3JkZXIgb2YgNjAtMTAwIG1zLAorCSAgd2hpY2ggY2FuIGJlIGNyaXRpY2FsIGZvciB0aGUgcmVjZWl2ZXIgc2lkZS4KKwkgIEJ5IGhhdmluZyBhIHNlcGFyYXRlIEdzdFRhc2sgZm9yIHB1c2hpbmcgYnVmZmVycyBvdXQgb2YgcnR4c2VuZCwKKwkgIHdlIGNhbiBwdXNoIGJ1ZmZlcnMgb3V0IHJpZ2h0IGFmdGVyIHJlY2VpdmluZyB0aGUgZXZlbnQsIHdpdGhvdXQKKwkgIHdhaXRpbmcgZm9yIGNoYWluKCkgdG8gZ2V0IGNhbGxlZC4KKworMjAxNC0wMS0wMyAxNzo0Nzo1NSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzoKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmg6CisJICBzaG91dDJzZW5kOiBlcnJvciBvdXQgaWYgbm8gY2FwcyB3ZXJlIHJlY2VpdmVkCisJICBJbnN0ZWFkIG9mIGFzc3VtaW5nIHRoYXQgaW5wdXQgaXMgb2dnLgorCisyMDE0LTAxLTAzIDE3OjMwOjEyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSAgc2hvdXQyc2VuZDogYWNjZXB0IGF1ZGlvL3dlYm0sIGF1ZGlvL29nZyBhbmQgdmlkZW8vb2dnIGFzIHdlbGwKKwkgIFRob3NlIGFyZSBhZHZlcnRpc2VkIGluIHRoZSB0ZW1wbGF0ZSBjYXBzLCBidXQgdGhlCisJICBzZXRjYXBzIGhhbmRsZXIgZGlkbid0IGhhbmRsZSB0aGVtLiBCdXQgdGhlbiBvZ2dtdXgKKwkgIGFuZCBvZ2dwYXJzZSBhdCBsZWFzdCBmb3Igbm93IHN0aWxsIGFsd2F5cyBvdXRwdXQKKwkgIGFwcGxpY2F0aW9uL29nZyBhbnl3YXksIHNvIHRoYXQgd2Fzbid0IGEgcmVhbCBwcm9ibGVtLgorCisyMDE0LTAxLTIwIDEwOjEyOjQ1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOHBheS5jOgorCSAgcnRwdnA4cGF5OiBEb24ndCBsZWFrIGlucHV0IGJ1ZmZlcnMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjI0MTQKKworMjAxNC0wMS0xOSAxNzo0MDo1NiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiByZXNldCBzb21lIG1vcmUgYXVkaW8gcGFkIGRhdGEgd2hlbiBuZWVkZWQKKworMjAxNC0wMS0xOSAxNzozODo1OSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguaDoKKwkgIGF2aW11eDogd3JpdGUgY29ycmVjdCBibG9ja2FsaWduIGZvciB2YnIgYXVkaW8KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA2NTkKKworMjAxNC0wMS0xNiAxNzozNjoxMiAtMDgwMCAgQWxlaXggQ29uY2hpbGxvIEZsYXF1w6kgPGFsZWl4QG9ibG9uZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBkbyBub3QgZHJvcCBzZXJpYWxpemVkIGV2ZW50cyB3aGVuIGxhdGVuY3kgaXMgc2V0CisJICBTZXJpYWxpemVkIGV2ZW50cyBhcmUgbm93IHF1ZXVlZCBpbiB0aGUgaml0dGVyIGJ1ZmZlciwgc28gd2UgZG9uJ3QKKwkgIHdhbnQgdG8gZHJvcCB0aGVtIGV2ZW4gbGF0ZW5jeSBpcyBzZXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIyMzcyCisKKzIwMTMtMTItMTEgMDk6MzY6MjIgKzAxMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBkb24ndCBtYWtlIHRoZSBidWZmZXIgd3JpdGFibGUgdW5sZXNzIGFic29sdXRlbHkgbmVjZXNzYXJ5CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIyMzk2CisKKzIwMTMtMDktMTIgMTY6NTY6NTYgKzAyMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMjogc2V0IEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUIHdoZW4gYXBwcm9wcmlhdGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjIzOTQKKworMjAxNC0wMS0xNyAwNzo0NjowOSArMDEwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogZG9uJ3QgcmVmIHRoZSBuZXdseSBjcmVhdGVkIGFsbG9jYXRvcgorCSAgT3RoZXJ3aXNlIHRoZSBhbGxvY2F0b3Igd2lsbCBuZXZlciBiZSBkZWxldGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMjYxMgorCisyMDE0LTAxLTE1IDIyOjQ3OjEyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IERvbid0IHNraXAgYWxsIHZpZGVvIGZyYW1lcyB1bnRpbCB0aGUgZmlyc3Qga2V5ZnJhbWUKKwkgIEluc3RlYWQgZG8gaXQgbGlrZSBhbGwgb3RoZXIgZGVtdXhlcnMgYW5kIGxldCBwYXJzZXJzIGFuZCBkZWNvZGVycworCSAgaGFuZGxlIHRoYXQuIFRoZSBrZXlmcmFtZSBpbmZvcm1hdGlvbiBpbnNpZGUgdGhlIGNvbnRhaW5lciBtaWdodAorCSAgYmUgY29tcGxldGVseSB3cm9uZyBsaWtlIGluIHRoZSBzYW1wbGUgZmlsZSBvZiB0aGUgYnVnIHJlcG9ydCwKKwkgIGFuZCBpZiBpdCBpcyBjb3JyZWN0IGFuZCB3ZSBwdXNoIG5vIGtleWZyYW1lcywgdGhlbiB0aGUgcGFyc2VycworCSAgYW5kIGRlY29kZXJzIHdpbGwgaGFuZGxlIHRoYXQgcHJvcGVybHkgYW55d2F5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MjI3NgorCisyMDE0LTAxLTEzIDEwOjA4OjA5IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IHJlbW92ZSBlbHN0X29mZnNldCB2YXJpYWJsZXMKKwkgIFRoZXkgYXJlIG5vdCB1c2VkIGFueW1vcmUKKworMjAxNC0wMS0wNiAyMTozNjoxNyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcmVtZW1iZXIgcmV2ZXJzZSBwbGF5YmFjayB3aGVuIHZlcmlmeWluZyB0aGUgc2VnbWVudCBlbmQKKwkgIENoZWNrIGlmIHRoZSByYXRlIGlzIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIHRvIGNvcnJlY3RseSBjb21wYXJlIHRoZSBjdXJyZW50CisJICBwb3NpdGlvbiB3aXRoIHRoZSBzZWdtZW50IHRvIG1ha2UgcmV2ZXJzZSBwbGF5YmFjayB3b3JrCisKKzIwMTQtMDEtMDMgMTA6NTk6MzUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5oOgorCSAgcXRkZW11eDogZG8gbm90IGlnbm9yZSBlbXB0eSBzZWdtZW50cworCSAgTWFrZSBzdXJlIGVtcHR5IHNlZ21lbnRzIGFyZSB1c2VkIGFuZCBwdXNoZWQgd2l0aCBhIGdhcCBldmVudAorCSAgdG8gcmVwcmVzZW50IGl0cyBkYXRhIChvciBsYWNrIG9mIGl0KQorCSAgRWFjaCBRdFNlZ21lbnQgaXMgbWFwcGVkIGludG8gYSBHc3RTZWdtZW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcKKwkgIG1lZGlhIHJhbmdlLiBGb3IgZW1wdHkgUXRTZWdtZW50cyBhIGdhcCBldmVudCBpcyBwdXNoZWQgaW5zdGVhZAorCSAgb2YgR3N0QnVmZmVycyBhbmQgaXQgYWR2YW5jZXMgdG8gdGhlIG5leHQgUXRTZWdtZW50LgorCSAgVG8gbWFrZSB0aGlzIHdvcmsgd2l0aCBzZWVrcywgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBzdGFydGluZworCSAgJ2Jhc2UnIHRvIG1ha2Ugc3VyZSBpdCByZW1haW5zIGNvbnNpc3RlbnRseSBpbmNyZWFzaW5nIHdoZW4KKwkgIHB1c2hpbmcgbmV3IHNlZ21lbnQgZXZlbnRzLgorCSAgRm9yIGV4YW1wbGU6IGlmIGEgc2VlayBtYWtlcyBxdGRlbXV4IHN0YXJ0IGZyb20gNXMsIHRoZSBmaXJzdAorCSAgc2VnbWVudCB3aWxsIGhhdmUgYSBiYXNlPTAuIFdoZW4gdGhlIG5leHQgc2VnbWVudCBpcyBhY3RpdmF0ZWQsCisJICBpdHMgYmFzZSB0aW1lIHdpbGwgYmUgUXRTZWdtZW50LnRpbWUgLSBxdGRlbXV4LnNlZ21lbnRfYmFzZSBzbworCSAgdGhhdCBpdCBkb2Vzbid0IGluY2x1ZGUgdGhlIGZpcnN0IDVzIHRoYXQgd2VyZW4ndCBwbGF5ZWQgYW5kCisJICBzaG91bGRuJ3QgYmUgYWNjb3VudGVkIG9uIHRoZSBydW5uaW5nIHRpbWUKKwkgIFRoaXMgcHVycG9zZWRseSB3aWxsIHJlbW92ZSB0aGUgZml4IG1hZGUgZm9yCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwMjY0LCBhdCB0aGlzCisJICBwb2ludCBpdCB3YXMgZGVjaWRlZCB0byByZXNwZWN0IHRoZSBnYXBzLCBldmVuIGlmIHRoZXkgY2F1c2UKKwkgIGEgZGVsYXkgb24gcGxheWJhY2ssIGJlY2F1c2UgdGhhdCdzIHRoZSB3YXkgdGhlIGZpbGUgd2FzIGNyYWZ0ZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQ1ODMwCisKKzIwMTMtMTItMTIgMjM6MDU6NDMgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jOgorCSAgdGVzdHM6IFJlbW92ZSB1c2FnZSBvZiB0aGUgc3lzdGVtIGNsb2NrIGZyb20gdGhlIHJ0cHJ0eCB0ZXN0CisKKzIwMTMtMTItMTIgMjM6MjI6NDEgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGNvbGxpc2lvbi5jOgorCSAgdGVzdHM6IEluaXRpYWwgc2VnbWVudCBpbiBydHBjb2xsaXNpb24gdGVzdAorCisyMDE0LTAxLTE0IDE1OjU2OjQyICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LXJ0cGF1eC5jOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1ydHBhdXguYzoKKwkgIGV4YW1wbGVzLyotcnRwYXV4OiBzcGVjaWZ5IHBheWxvYWQgdHlwZSBhc3NvY2lhdGlvbiBmb3IgdGhlIGF1ZGlvIHN0cmVhbSwgc28gdGhhdCBydHggd29ya3MgYWxzbyBmb3IgYXVkaW8KKworMjAxNC0wMS0xNCAxMzowODoxOCArMDEwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSAgcnRwcnR4c2VuZDogcmVtb3ZlIHdyb25nIGNoZWNrIGZvciBwYXlsb2FkIHR5cGUgbm90IGhhdmluZyBiZWVuIHNldAorCSAgMSkgcHQgY2FuIGJlIGxvd2VyIHRoYW4gOTYKKwkgIDIpIHRoZXJlIGlzIG5vIHBvaW50IGluIGNoZWNraW5nIHRoYXQgYmVjYXVzZSBydHBydHhzZW5kIHdpbGwgbm90CisJICBldmVuIHN0b3JlIGJ1ZmZlcnMgZm9yIHBheWxvYWQgdHlwZXMgdGhhdCBpdCBkb2Vzbid0IGtub3cgYWJvdXQsCisJICBzbyB0aGlzIGNhc2Ugd2lsbCBuZXZlciBiZSByZWFjaGVkCisKKzIwMTQtMDEtMTQgMTM6MDE6NDEgKzAxMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHNlbmQuYzoKKwkgIHJ0cHJ0eHNlbmQ6IGZpeCBkYXRhIGxvY2tpbmcgd2hlbiBjcmVhdGluZyBydHggcGFja2V0cworCSAgVGhpcyBwYXRjaCBtb3ZlcyB0aGUgY3JlYXRpb24gb2YgcnR4IHBhY2tldHMgdG8gYmUgZG9uZSBlYXJseSwKKwkgIGluIHRoZSBzcmNfZXZlbnQoKSBmdW5jdGlvbiwgd2hlbiB0aGV5IGFyZSByZXF1ZXN0ZWQuIFRoZSBwdXJwb3NlCisJICBpcyB0byBydW4gZ3N0X3J0cF9ydHhfYnVmZmVyX25ldygpIHdpdGggdGhlIG9iamVjdCBsb2NrZWQgdG8KKwkgIHByb3RlY3QgaW50ZXJuYWwgZGF0YSwgYmVjYXVzZSBpZiBpdCBpcyBkb25lIGF0IHRoZSBwdXNoaW5nIHN0YWdlLAorCSAgd2Ugd291bGQgaGF2ZSB0byBsb2NrIGFuZCB1bmxvY2sgbXVsdGlwbGUgdGltZXMgaW4gYSByb3cgd2hpbGUgd2UKKwkgIGFyZSBwdXNoaW5nIHRoZSBydHggYnVmZmVycy4KKwkgIFByZXZpb3VzbHkgdGhlcmUgd2FzIG5vIGxvY2tpbmcgYXQgYWxsLCB3aGljaCB3YXMgdGVycmlibHkgd3JvbmcuCisKKzIwMTQtMDEtMTQgMTI6NTA6MjMgKzAxMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHNlbmQuYzoKKwkgIHJ0cHJ0eHNlbmQ6IGxvY2sgYWNjZXNzIHRvIGludGVybmFsIGRhdGEgaW4gc2lua19ldmVudCgpIGZ1bmN0aW9uCisKKzIwMTQtMDEtMTQgMTI6NDQ6MDYgKzAxMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHNlbmQuYzoKKwkgIHJ0cHJ0eHNlbmQ6IHJlbW92ZSB1bm5lY2Vzc2FyeSBjYWxsIHRvIHJlc2V0KCkgZnJvbSBmaW5hbGl6ZSgpCisJICAuLi5hbmQgdXNlIF9mcmVlX2Z1bGwoKSBvbiB0aGUgcGVuZGluZyBidWZmZXJzIHF1ZXVlIG5vdyB0aGF0CisJICByZXNldCgpIGlzIG5vdCBiZWluZyBjYWxsZWQKKworMjAxNC0wMS0xNCAxMjozODo1MSArMDEwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSAgcnRwcnR4c2VuZDogcmVtb3ZlIHVudXNlZCBwYXJhbWV0ZXIgZnJvbSB0aGUgaW50ZXJuYWwgcmVzZXQoKSBtZXRob2QKKworMjAxNC0wMS0xNCAxMjozMjozOCArMDEwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSAgcnRwcnR4c2VuZDogVXNlIGdfc2xpY2VfKiBmb3IgYWxsb2NhdGluZyBpbnRlcm5hbCBzdHJ1Y3R1cmVzCisKKzIwMTQtMDEtMTQgMTI6Mjg6MDEgKzAxMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHJlY2VpdmUuYzoKKwkgIHJ0cHJ0eHJlY2VpdmU6IHJlbW92ZSBzdHVwaWQgbXV0ZXggdW5sb2NrIGluIHRoZSBtaWRkbGUgb2YgY2hhaW4oKQorCisyMDE0LTAxLTE0IDEyOjI1OjM2ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmM6CisJICBydHBydHhyZWNlaXZlOiB1c2UgR1NUX0RFQlVHX09CSkVDVCAvIEdTVF9XQVJOSU5HX09CSkVDVCBpbnN0ZWFkIG9mIEdTVF9ERUJVRyAvIGdfd2FybmluZworCisyMDE0LTAxLTE0IDEyOjE5OjU4ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmM6CisJICBydHBydHhyZWNlaXZlOiBmaXggaW50ZWdlciBmb3JtYXQgc3BlY2lmaWVycyBpbiBHU1RfREVCVUcKKwkgIHNlcW51bSBpbiB0aGlzIGZ1bmN0aW9uIGlzIDMyLWJpdCwgc28gR19HVUlOVDE2X0ZPUk1BVCB3b3VsZAorCSAgcHJvZHVjZSB1bmRlZmluZWQgb3V0cHV0IG9uIGJpZyBlbmRpYW4gc3lzdGVtcworCisyMDE0LTAxLTE0IDEyOjEzOjQ5ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmg6CisJICBydHBydHhzZW5kOiBjaGFuZ2UgdGhlIHJ0eF9wdF9tYXAgZGlyZWN0bHkgaW4gc2V0X3Byb3BlcnR5KCkgaW5zdGVhZCBvZiBkZWxheWluZyBpdCBmb3IgY2hhaW4oKQorCSAgVGhlIHNhbWUgbG9jayBpcyBoZWxkLCBzbyB0aGVyZSBpcyBubyBwb2ludCBpbiBjb21wbGljYXRpbmcgaXQuLi4KKworMjAxNC0wMS0xNCAxMjowNzo1OCArMDEwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5oOgorCSAgcnRwcnR4cmVjZWl2ZTogY2hhbmdlIHRoZSBydHhfcHRfbWFwIGRpcmVjdGx5IGluIHNldF9wcm9wZXJ0eSgpIGluc3RlYWQgb2YgZGVsYXlpbmcgaXQgZm9yIGNoYWluKCkKKwkgIFRoZSBzYW1lIGxvY2sgaXMgaGVsZCwgc28gdGhlcmUgaXMgbm8gcG9pbnQgaW4gY29tcGxpY2F0aW5nIGl0Li4uCisKKzIwMTQtMDEtMTQgMTE6NTU6MDAgKzAxMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHJlY2VpdmUuYzoKKwkgIHJ0cHJ0eHJlY2VpdmU6IHNpbXBsaWZ5IHRoZSBjb2RlIG9mIGZpbmFsaXplKCkKKworMjAxNC0wMS0xNCAxMTo1MjoyMSArMDEwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5oOgorCSAgcnRwcnR4cmVjZWl2ZTogdXNlIHRoZSBHc3RPYmplY3QgbG9jayBpbnN0ZWFkIG9mIGEgbmV3IG9uZQorCisyMDE0LTAxLTE0IDExOjQ1OjUyICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmg6CisJICBydHBydHhzZW5kOiB1c2UgdGhlIEdzdE9iamVjdCBsb2NrIGluc3RlYWQgb2YgYSBuZXcgb25lCisKKzIwMTMtMTItMTAgMTQ6Mjk6NTUgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IEFkZCBOVjEyXzY0WjMyIHN1cHBvcnQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjIxMjcKKworMjAxNC0wMS0xNCAxOTowODo0OSArMDkwMCAgSnVzdGluIEpveSA8anVzdGluLmpveS45dG81QGdtYWlsLmNvbT4KKworCSogc3lzL29zcy9nc3Rvc3NoZWxwZXIuYzoKKwkgIG9zc2hlbHBlcjogRG9uJ3QgbGVhayBmZCB3aGVuIGdldHRpbmcgY2FyZCBuYW1lCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIyMTYzCisKKzIwMTQtMDEtMTQgMDk6NDM6MzMgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBSZXZlcnQgImFhY3BhcnNlOiByZWxheCB0aGUgZGV0ZWN0aW9uIG9mIEFEVFMiCisJICBUaGlzIHdhcyBwdXNoZWQgYnkgbWlzdGFrZSBhbG9uZyB3aXRoIHRoZSBWNEwyIGZpeC4KKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgOGViNGIwMzJiZWY0NDQzOTdjNGQyMTFmMjA5NWMxNzNiYTExNDE4Ny4KKworMjAxNC0wMS0xNCAxNTo0MjowMSArMDkwMCAgSnVzdGluIEpveSA8anVzdGluLmpveS45dG81QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJICBydHBnNzI2cGF5OiBkb24ndCBsZWFrIGVuY29kaW5nX25hbWUgc3RyaW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIyMTU5CisKKzIwMTQtMDEtMTMgMDk6MTQ6MDAgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBmaXggYnVpbGQgYnJlYWsgdXNpbmcgVjRMMl9DQVBfVklERU9fTTJNX01QTEFORQorCSAgVGhpcyBtYXkgbm90IGJlIGRlZmluZWQuIFNpbmNlIHRoZSBwcmV2aW91cyB2ZXJzaW9uIHVzZWQKKwkgIG9ubHkgdGhlIG90aGVyIGRlZmluZSAoVjRMMl9DQVBfVklERU9fT1VUUFVUX01QTEFORSksIGZhbGwKKwkgIGJhY2sgb24gdGhpcyBvbmx5IHdoZW4gbm90IGF2YWlsYWJsZS4KKworMjAxMy0wMi0yNyAwMTo0NTo1MiArMDkwMCAgQWtpaGlybyBUc3VrYWRhIDxhdHN1a2FkYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiByZWxheCB0aGUgZGV0ZWN0aW9uIG9mIEFEVFMKKwkgIEFjY29yZGluZyB0byBJU08vSUVDIDEzODE4LTcsICJjaGFubmVsX2NvbmZpZyIgZmllbGQgaW4gQURUUyBoZWFkZXIKKwkgIG1heSBoYXZlIHZhbHVlIG9mIDAsIGFzIGluIHRoZSBjYXNlIG9mIGZyYW1lIHdpdGggUENFLgorCSAgZ3N0X2FhY19wYXJzZV9kZXRlY3Rfc3RyZWFtcygpIHJldHVybmVkIEZBTFNFIGZvciB0aG9zZSBmcmFtZXMKKwkgIGFuZCBkaXNjYXJkZWQgdGhlbS4KKworMjAxNC0wMS0wNyAxMTo1ODoyMyArMDAwMCAgSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogY2hlY2sgc2V0X2NvbmZpZyByZXR1cm4gdmFsdWUgaW4gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfbmV3CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTQtMDEtMTAgMTI6NDA6MzEgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogQWRkIHBhcnNlZD0xIGZpZWxkIGZvciBlbmNvZGVkIG91dHB1dAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDE0LTAxLTEwIDEyOjM5OjE2IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IERvbid0IGxlYWsgZW1wdHkgY2FwcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDE0LTAxLTA4IDE2OjUxOjIxICswMDAwICBKdWxpZW4gSXNvcmNlIDxqdWxpZW4uaXNvcmNlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBkbyBub3Qgc3RvcCBhIHN0cmVhbSBub3QgcHJldmlvdXNseSBzdGFydGVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTItMTIgMTY6Mjc6MjEgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRG9uJ3QgZW5mb3JjZSBkaW1lbnNpb24gZmllbGQgb24gZW5jb2RlZCBmb3JtYXRzCisJICBEb24ndCBlbmZvcmNlIGhhdmluZyB3aWR0aCwgaGVpZ2h0IGFuZCBmcmFtZXJhdGUgaW4gdGVtcGxhdGUgY2FwcyBmb3IgZW5jb2RlZAorCSAgZm9ybWF0cy4gVGhlc2UgZG9uJ3QgYWx3YXlzIG5lZWQgdG8gYmUgZXhwb3NlZCBhbmQgbWF5IGJyZWFrIG5lZ290aWF0aW9uIGZvcgorCSAgZGVjb2RlciBhbmQgZGVjb2Rpbmcgc2luay4gSWYgbmVlZGVkLCB0aGVzZSBmaWVsZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQKKwkgIHdoZW4gcHJvYmVkIGNhcHMgYXJlIGtub3duLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDEzLTEyLTEyIDE3OjA5OjU5ICswMDAwICBKdWxpZW4gSXNvcmNlIDxqdWxpZW4uaXNvcmNlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogdW5yZWYgZG93bnN0cmVhbSBwb29sCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTItMTggMTM6Mzc6MjMgLTA1MDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkgIHY0bDJidWZmZXJwb29sOiBhZGQgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfZmx1c2gKKwkgIFNUUkVBTU9GRiBzZXQgYWxsIHY0bDJidWZmZXJzIHRvIERFUVVFVUUgc3RhdGUuCisJICBUaGVuIGZvciBDQVBUVVJFIHdlIGNhbGwgUUJVRiBvbiBlYWNoIGJ1ZmZlci4KKwkgIEZvciBPVVRQVVQgdGhlIGJ1ZmZlcnMgYXJlIGp1c3QgcHVzaCBiYWNrIGluIHRoZSBHc3RCdWZmZXJQb29sCisJICBiYXNlIGNsYXNzICdzIHF1ZXVlLgorCSAgQnV0IHRoZSBsb29wIGFjdHVhbGx5IGxvb2tzIGxpa2UgdGhlIHNhbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTItMTYgMTc6Mjk6MzAgLTA1MDAgIEJlbmphbWluIEdhaWduYXJkIDxiZW5qYW1pbi5nYWlnbmFyZEBsaW5hcm8ub3JnPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBBZGQgdnA4IHN1cHBvcnQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0xMiAxNjo0NjowOSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBEb24ndCBmb3JjZSBmcmFtZXJhdGUgZmllbGQgZm9yIE9VVFBVVAorCSAgSWYgdGhlcmUgaXMgbm90aGluZyB0aGF0IHNlZW1zIHRvIGZvcmNlIGEgY2VydGFpbiBmcmFtZXJhdGUgb24gb3V0cHV0IGRldmljZSwgaXQgaXMKKwkgIHByZWZlcmFibGUgdG8gc2ltcGx5IG5vdCBzZXQgdGhhdCBmZWlsZC4gVGhpcyBhbGxvdyBuZWdvdGlhdGlvbiB3aXRoIHRzZGVtdXggaW4gYQorCSAgZGVjb2RlciBmb3IgZXhhbXBsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0xMiAxNDowNzowMyAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyb2JqZWN0OiBfdjRsMmZvdXJjY190b19zdHJ1Y3R1cmUoKSBjYW4gYmUgc3RhdGljCisJICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGFueW1vcmUgb3V0c2lkZSB2NGwyb2JqZWN0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDEzLTEyLTEyIDE0OjIyOjI2IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IEFkZCBNUEVHMS8yIHN1cHBvcnQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0xMiAxMjoxODo0NSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBBc2sgZm9yIGEgZGVjZW50IGJ1ZmZlciBzaXplIHdoZW4gZGVhbGluZyB3aXRoIGVuY29kZWQgZm9ybWF0cworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDEzLTEyLTA3IDE0OjAzOjUzIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogT24gd2FybiBvbiBzaXplIGNoYW5nZSBpZiBuX3BsYW5lcyA+IDEKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0zMSAxNjozODowOSArMDAwMCAgSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IGNoZWNrIGlmIHRyYW5zbGF0ZWQgZm9ybWF0IGlzIHZhbGlkCisJICBBbHNvIGFkZCBhIEZJWE1FIGluIGdzdF92NGwyX29iamVjdF9zZXR1cF9mb3JtYXQKKwkgIHRvIG5vdGUgdGhhdCB0aGUgd2hvbGUgZnVuY3Rpb24gaGFzIHRvIGJlIGltcHJvdmVkCisJICBpbiBvcmRlciB0byBzdXBwb3J0IEVOQ09ERUQgZm9ybWF0cy4KKwkgIEl0IHJlcXVpcmVzIHRvIGhhdmUgYW4gZW5jb2RlciBkZXZpY2Ugd2hpY2ggd2UgZG8gbm90CisJICBoYXZlIHJpZ2h0IG5vdy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0wNyAxMDozMToxNSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBWYWxpZGF0ZSByZXR1cm5lZCBkaW1lbnNpb25zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTItMDUgMTk6MzY6MjUgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRW5zdXJlIG1heCBpcyBub3Qgc21hbGxlciB0aGVuIG1pbiBpbiBkZWNpZGVfYWxsb2NhdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDEzLTEyLTA1IDE5OjM2OjA2IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IERvbid0IGtlZXAgdGhlIG1heCBwYXJhbXRlciB3aGVuIHVzaW5nIG91ciBvd24gcG9vbAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDEzLTEyLTA1IDE5OjM0OjQ0IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogUmVzcGVjdCB0aGUgc3VnZ2VzdGVkIG1pbiBidWZmZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0wNSAxODo0ODo0NCAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBBbGxvY2F0ZSBwb29sIGlmIG5lZWRlZCBpbiBkZWNpZGVfYWxsb2NhdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDEzLTEyLTA1IDE4OjQ5OjE5IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IEFkZCBWNEwyX0NJRF9NSU5fQlVGRkVSU19GT1JfQ0FQVFVSRSBzdXBwb3J0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTItMDUgMTg6NDg6MTUgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogTW92ZSBkZWNpZGUgYWxsb2NhdGlvbiBpbnRvIHY0bDJvYmplY3QKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0wNSAxMzo1MToxMyAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyb2JqZWN0OiBJbXBsZW1lbnQgX3NldHVwX2Zvcm1hdCgpCisJICBUaGlzIG1ldGhvZCBhbGxvdyBzZXR0aW5nIHVwIHRoZSBvYmplY3QgZnJvbSB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgZm9ybWF0IG9uIHRoZQorCSAgZGV2aWNlLiBUaGlzIGlzIHVzZWZ1bCBmb3IgTTJNIGVsZW1lbnQgd2hlcmUgaW5wdXQgZGF0YSBkZWNpZGVzIHRoZSBmb3JtYXQgdGhhdCB3aWxsCisJICBiZSBzZXQgb24gY2FwdHVyZSBzaWRlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDEzLTEyLTEwIDE0OjM0OjE3IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IFNwbGl0IG91dCBzYXZpbmcgZm9ybWF0IGZyb20gc2V0X2Zvcm1hdCgpCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTItMzEgMTU6Mzc6MjYgKzAwMDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBzZXQgb25seSBvbmUgcGxhbmUgZm9yIGVuY29kZWQgZm9ybWF0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTItMDQgMTY6NDk6MTMgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogTW92ZSBjb2RlIGJsb2NrIHdoZXJlIGl0IGJlbG9uZ3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0wNCAxNjoyNjoxMiAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBEb24ndCBjaGVjayBmb3JtYXQgc3BlY2lmaWMgaW5mb3JtYXRpb24KKwkgIFRoZSBudW1iZXIgb2YgcGxhbmUsIGFuZCB0aGUgc3RyaWRlIGRvZXMgbm90IHJlcHJlc2VudCBhIGNhcGFiaWxpdHkgY2hhbmdlLiBTYW1lIGNhcHMKKwkgIGNhbiBoYXZlIGRpZmZlcmVudCBzdHJpZGUgZnJvbSB0aGUgZGVmYXVsdCBHc3RWaWRlb0luZm8gYW5kIHRoZSBudW1iZXIgb2YgcGxhbmVzIHdpbGwKKwkgIG5ldmVyIGNoYW5nZSBmb3IgMSBmb3JtYXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTItMDQgMTY6MjM6MTggLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IE1vdmUgdGhlIGV4dHJhcG9sYXRpb24gb2Ygc3RyaWRlIGF0IHRoZSByaWdodCBwbGFjZQorCSAgTm93IHRoYXQgd2UgaGF2ZSBhIHN0cmlkZSBhcnJheSwgd2Ugc2hvdWxkIGV4dHJhcG9sYXRlIG9ubHkgd2hlbgorCSAgZWVkZWQgKG5vbiBtdWx0aS1wbGFuYXIgYnVmZmVyKS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0wNCAxNTowOTo0NCAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBNb3ZlIGJhY2sgYXNzZXJ0aW9ucyB3aGVyZSB0aGV5IHNob3VsZCBiZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDEzLTEyLTA0IDE1OjA5OjEwIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IE1vdmUgbXBsYW5lIGxvZ2ljIGludG8gZ3N0X3Y0bDJfb2JqZWN0X2dldF9jYXBzX2luZm8oKQorCSAgSXQgbWFrZXMgdGhlIGdzdF92NGwyX29iamVjdF9zZXRfZm9ybWF0KCkgc2xpZ2h0bHkgc2ltcGxpZXIgYW5kIHdpbGwgbWFrZSB0aGF0CisJICBsb2dpYyByZXVzYWJsZS4gTm90ZSB0aGF0IGdzdF92NGwyX29iamVjdF9oYXNfbXBsYW5lKCkgd2lsbCBhbHdheXMgcmV0dXJuIHRoZQorCSAgc2FtZSB2YWx1ZSBmb3Igb25lIGRldmljZS4gVGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBhZ2FpbnN0IHRoZSBjYXBzIGFzIHRoaXMKKwkgIGhhcyBhbHJlYWR5IGJlZW4gZG9uZSBieSBfb3Blbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0wMyAxODoyNzo0NyAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyb2JqZWN0OiBTcGxpdCBfdjRsMmZvdXJjY190b192aWRlb19mb3JtYXQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0wMiAxODowNToxMSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IFJlcXVlc3QgYnVmZmVycyBvbmx5IG9uY2UKKwkgIFZJRElPQ19SRVFCVUZTIGFsbG9jYXRlcyBidWZmZXIsIGl0IGhhcyBubyBwbGFjZSBpbnNpZGUgc2V0X2NvbmZpZy4gQWxzbywgc29tZSBkcml2ZXIgZG8KKwkgIG5vIGFsbG93IG11bHRpcGxlIGNhbGxzIHRvIHRoaXMgaW9jdGwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTItMDIgMTU6MjY6NTAgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRG9uJ3QgdmFsaWRhdGUgZGltZW5zaW9uIGZvciBlbmNvZGVkIGZvcm1hdAorCSAgV2Ugc2V0IHRoZSBkaW1lbnNpb25zIGp1c3QgaW4gY2FzZSBidXQgZG9uJ3QgdmFsaWRhdGUgdGhlbQorCSAgYWZ0ZXJ3YXJkcy4gRm9yIHNvbWUgY29kZWNzIHRoZSBkaW1lbnNpb25zIGFyZSAqbm90KiBpbiB0aGUKKwkgIGJpdHN0cmVhbSwgSUlSQyBWQzEgaW4gQVNGIG1vZGUgZm9yIGV4YW1wbGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTEtMjggMTc6MTA6MjkgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSAgdjRsMm9iamVjdDogUXVpcmtzIGZvciBkZXYgd2l0aG91dCBpbml0aWFsIGZvcm1hdAorCSAgTW9zdCBNMk0gaGF2ZSB1bmRlZmluZWQgYmVoYXZpb3VyIGluaXRpYWxseSB3aGVuIFZJRElPQ19HX0ZNVCBpcyBjYWxsZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTEtMjggMTc6MDk6MjYgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSAgdjRsMm9iamVjdDogQWRkIGdzdF92NGwyX29iamVjdF9vcGVuX3NoYXJlZCgpCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTEtMjggMTc6MDc6MDUgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5oOgorCSAgdjRsMm9iamVjdDogSW1wbGVtZW50IGdzdF92NGwyX2R1cCgpCisJICBUaGlzIHdpbGwgZHVwbGljYXRlZCB0aGUgRkQgZnJvbSBhbm90aGVyIG9iamVjdCBhbmQgY29weSBvdmVyIHRoZSBwcm9iZWQgcmVzdWx0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDEzLTExLTI4IDE2OjU5OjU5IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIHY0bDJvYmplY3Q6IG1ha2UgSU9fTU9ERSBlbnVtIHB1YmxpYworCSAgVGhpcyBpcyB0byBhbGxvdyBhZGRpbmcgYSBzZWNvbmQgaW8tbW9kZSBwcm9wZXJ0eSBvbiBNMk0gZGV2aWNlIGxpa2UgZGVjb2RlciBzbworCSAgaW5wdXQgYW5kIG91dHB1dCBjYW4gYmUgY29udHJvbGxlZCBzZXBhcmF0bHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMDYtMDQgMjM6NDI6MjQgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBiZXR0ZXIgaGFuZGxlIHF1aXJrcyBhY3RpdmF0aW9uCisJICBUaGlzIHdheSB3ZSBjYW4gYWN0aXZhdGUgZGVhY3RpdmF0ZSB0aG9zZSBxdWlya3MgYWxsIGF0IG9uY2UgYXQgb25lCisJICBwbGFjZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0wNi0wNCAyMzozNDowNCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IEZpeCBoMjY0IGNhcHMKKwkgIFY0TDJfUElYX0ZNVF9IMjY0IGlzIGRvY3VtZW50YXRlZCBhcyBieXRlLXN0cmVhbSAod2l0aCBzdGFydCBjb2RlKS4gVGhlIGVuc3VyZSBwcm9wZXIKKwkgIG5lZ290aWF0aW9uIHdpdGggZWxlbWVudCBsaWtlIGgyNjRwYXJzZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0wNiAxNDo0NDo1MSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyb2JqZWN0OiBTcGxpdCBjYXBzIGluIGRpZmZlcmVudCBjYXRlZ29yaWVzCisJICBUaGlzIGlzIG5lZWQgdG8gY29ycmVjdGx5IGV4cG9zZSBjYXBhYmlsaXRpZXMgb24gc3BlY2lhbGl6ZWQgZGV2aWNlcworCSAgbGlrZSBkZWNvZGVycyBhbmQgZW5jb2RlcnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTQtMDEtMTAgMTQ6MTY6MDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWF0cm9za2FkZW11eDogZG9uJ3QgbGVhayBUT0MgY2hhcHRlciBsaXN0CisKKzIwMTQtMDEtMTAgMDg6NTI6MTYgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogcmVtb3ZlIG9ic29sZXRlIHdyaXRlLWR1bW15LWFuZC1vdmVyd3JpdGUtb24tZW9zIGNvZGUKKwkgIFRoZSBuZWVkIGZvciByZXdyaXRpbmcgYXBwYXJlbnRseSBpcyBvYnNvbGV0ZSAwLjEwIGxlZnRvdmVyLgorCSAgV2Ugbm93IGhhdmUgY2FwcyBmb3Igc3VidGl0bGVzIHdoZW4gd2UgY3JlYXRlIHRoZSBoZWFkZXJzLAorCSAgc28gd2UgYWx3YXlzIHdyaXRlIHRoZSBjb3JyZWN0IGRhdGEgaW4gdGhlIGZpcnN0IHBsYWNlLgorCisyMDE0LTAxLTA5IDIzOjU1OjE2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJICBydHBydHhzZW5kOiByZW1vdmUgZHVwbGljYXRlIGFzc2lnbm1lbnQKKwkgIENvdmVyaXR5IENJRCAxMTUxNjgwCisKKzIwMTQtMDEtMDkgMTg6MjU6MDQgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogd3JpdGUgc3VidGl0bGUgY29kZWMgSUQgYW5kIGRhdGEgYXQgc3RhcnQgd2hlbiBrbm93bgorCSAgVGhpcyBhdm9pZHMgaXNzdWVzIHdpdGggd3JpdGluZyBkdW1teSBkYXRhIGZpcnN0LCB0aGVuIGhhdmluZworCSAgdG8gY29tZSBiYWNrIGFuZCB3cml0ZSBjb3JyZWN0IGRhdGEgbGF0ZXIuIERvaW5nIHNvIHByZXZlbnRzCisJICB0aGUgbXV4ZWQgc3RyZWFtIGZyb20gYmVpbmcgYWN0dWFsbHkgc3RyZWFtYWJsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTIxMzQKKworMjAxNC0wMS0wOSAxNzozMjoxNSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBJbmNsdWRlIEF2YWlsYWJpbGl0eU1hY3Jvcy5oIGZvciBvc3h2aWRlbyBjaGVjaworCSAgT3RoZXJ3aXNlIE1BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEIG1pZ2h0IG5vdCBiZSBkZWZpbmVkCisKKzIwMTQtMDEtMDkgMTE6NTY6MzEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJICBxdG11eDogcmVzcGVjdCB0aGUgSERMUiBib3ggc3RyaW5nIGZvcm1hdCBmb3IgbW92IGFuZCBpc29tZWRpYQorCSAgTW92IHNwZWMgc2F5cyBpdCB1c2VzIGEgcGFzY2FsIHN0eWxlIHN0cmluZywgd2hpbGUgaXNvbWVkaWEgdXNlcworCSAgYSBudWxsIHRlcm1pbmF0ZWQgb25lLiBTdG9yZSB0aGUgY3VycmVudCBhdG9tcyBmbGF2b3IgaW50byB0aGUgSERMUgorCSAgdG8gYmUgYWJsZSB0byBnZW5lcmF0ZSB0aGUgY29ycmVjdCBvdXRwdXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA1OTgyCisKKzIwMTQtMDEtMDggMTE6Mjg6MDQgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBSZXZlcnQgIm1hdHJvc2thbXV4OiBVc2UgdGhlIHJ1bm5pbmcgdGltZSBmb3IgY29udGFpbmVyIHRpbWVzdGFtcHMsIG5vdCBidWZmZXIgdGltZXN0YW1wcyIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgYjNhYTg3NTVmZTA3NjM5ZjIyZTQxMDRmNDkzMmQ3NjlkNmM5MDc1YS4KKwkgIFdlIGFyZSBhbHJlYWR5IHVzaW5nIHRoZSBydW5uaW5nLXRpbWUgYmVjYXVzZSB0aGV5IHdlcmUgcGxhY2VkIG9uIHRoZQorCSAgYnVmZmVycyB3aXRoIGdzdF9jb2xsZWN0X3BhZHNfY2xpcF9ydW5uaW5nX3RpbWUoKS4gQXJndWFibHkgaXQgd291bGQgYmUKKwkgIGJldHRlciB0byBub3QgbW9kaWZ5IHRoZSBpbmNvbW1pbmcgYnVmZmVycyBidXQgY29sbGVjdHBhZHMgc2VlbXMgdG8gd2FudAorCSAgdG8gdXNlIGFic29sdXRlIHRpbWVzdGFtcHMgZnJvbSB0aGUgYnVmZmVycyBmb3IgZmluZGluZyB0aGUgYmVzdCBidWZmZXIKKwkgICh0aGlzIGNhbiBiZSBjaGFuZ2VkIHdpdGggYSBjdXN0b20gY29tcGFyZSBmdW5jdGlvbi4uKS4KKworMjAxNC0wMS0wOCAxMDo0MToyNCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBGaXggQUNfQ09NUElMRV9JRkVMU0UgdXNhZ2UKKworMjAxNC0wMS0wOCAxMDozMToxOCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgb3N4dmlkZW9zaW5rOiBJbXByb3ZlIGNvbmZpZ3VyZSBjaGVjayBmb3IgT1NYID49IDEwLjYKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjEyNDUKKworMjAxNC0wMS0wNyAxMjoxMzo1MSAtMDgwMCAgQWxlaXggQ29uY2hpbGxvIEZsYXF1w6kgPGFsZWl4QG9ibG9uZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiByZW1vdmUgdW51c2VkIGxpc3Qgb2YgZGVjb2RlcnMKKwkgIHJlbW92ZSBsaXN0IG9mIGRlY29kZXJzLCB3aGljaCBhcmUgYWxyZWFkeSBoYW5kbGVkIGJ5IHRoZSBsaXN0IG9mIGVsZW1lbnRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxOTkzOAorCisyMDE0LTAxLTA4IDA5OjQ2OjU1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogRXJyb3Igb3V0IGlmIEFEUENNIGNhcHMgZG9uJ3QgY29udGFpbiB0aGUgbGF5b3V0IGZpZWxkCisKKzIwMTQtMDEtMDMgMTU6MjU6MjMgKzAxMDAgIE5pY29sYSBNdXJpbm8gPG5pY29sYS5tdXJpbm9AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogQWRkIHN1cHBvcnQgZm9yIGc3MjYgQURQQ00KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA5OTUKKworMjAxNC0wMS0wNyAxNTowNDowMiArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHVzZSBuZXcgbWV0aG9kIHRvIGdldCBtZWRpYS10eXBlCisJICBVc2UgdGhlIG5ldyBtZXRob2QgdG8gZ2V0IHRoZSBtZWRpYSB0eXBlIG9mIGEgdHJhbnNwb3J0LgorCisyMDE0LTAxLTA2IDIxOjEyOjE3ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IHNwbGl0IHRoZSB0ZXN0CisJICBUaGlzIHdheSBvbmUgZmFpbHVyZSB3b24ndCBzaGFkb3cgdGhlIG90aGVyIHRlc3QgYW5kIGFsc28gaWYgb25lIGZhaWxzIHdlIGdldAorCSAgYmV0dGVyIGRpc2dub3N0aWNzIHRocm91Z2ggdGhlIHRlc3QtbmFtZS4KKworMjAxNC0wMS0wNiAxNDo1NDo0NiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IEFkZCBIRVZDIC8gaDI2NSBzdXBwb3J0CisKKzIwMTQtMDEtMDYgMTQ6NTQ6MzggKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgbWF0cm9za2FkZW11eDogQWRkIEhFVkMgLyBoMjY1IHN1cHBvcnQKKworMjAxNC0wMS0wNiAxMzozNjozOCArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogcmVtb3ZlIGlmZGVmJ2VkIGNvZGUKKwkgIFdlIGRvIGhhdmUgYWR0bCBhbmQgY3VlIHBhcnNlIGFzIHBhcnQgb2YgdG9jIGhhbmRsaW5nIGFscmVkYXkuIFRoZSBmbXQgY29kZSBpcyBhIGxlZnQgb3ZlciBmcm9tIDwwLjEwIHRpbWVzLgorCisyMDE0LTAxLTA2IDEzOjMyOjU4ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIGF2aWRlbXV4LCB3YXZlcGFyc2U6IG1vcmUgbG9nZ2luZyBmb3IgdW5oYW5kbGVkIGNodW5rcworCSAgQWx3YXlzIHByaW50IGEgd2FybmluZyB3aXRoIHRoZSB0YWcgYW5kIGlmIHBvc3NpYmxlIGRvIGEgbWVtZHVtcC4KKworMjAxNC0wMS0wNSAyMjo0Nzo0MiArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGV4cG9zZSAnc3RybicgLSBzdHJlYW0gbmFtZSAtIGFzIHRpdGxlIHRhZworCisyMDE0LTAxLTA1IDIyOjQxOjI0ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogcGFyc2UgZnVqaSBzdHJkCisJICBXZSBjYW4gZ2V0IG1ha2VyLCBtb2RlbCBhbmQgY2FwdHVyZSBkYXRlIGZyb20gdGhpcyBjaHVuay4KKwkgIEZpeGVzICM2MzYxNDMKKworMjAxNC0wMS0wNSAyMTo0NjozMyArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IC4uLiBhbmQgdXNlIHRoZSBsb2NhbCBhcGkgYm90aCB0aW1lcworCisyMDE0LTAxLTA1IDIxOjM4OjE0ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogY29weSB0aGUgcmlmZiBhcGkgZm9yIG5jZHQgaW50byB0aGUgZWxlbWVudAorCSAgVGhpcyBjaHVuayBpcyBhdmkgc3BlY2lmaWMsIG5vIG5lZWQgdG8gZXhwb3NlIHRoaXMgYXMgcHVibGljIGFwaS4KKworMjAxNC0wMS0wNSAxMDoyODoyMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IEFkZCBtaXNzaW5nIHNlbWljb2xvbiBmcm9tIGxhc3QgY29tbWl0CisKKzIwMTQtMDEtMDUgMTA6MjI6MzcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBVc2UgdGhlIHJ1bm5pbmcgdGltZSBmb3IgY29udGFpbmVyIHRpbWVzdGFtcHMsIG5vdCBidWZmZXIgdGltZXN0YW1wcworCSAgQnVmZmVyIHRpbWVzdGFtcHMgaGF2ZSBubyByZWFsIG1lYW5pbmcgaGVyZSwgYW5kIGZvciBzZWxlY3RpbmcgdGhlIG5leHQKKwkgIGJ1ZmZlciB3ZSBhbHJlYWR5IHVzZSB0aGUgcnVubmluZyB0aW1lIGFueXdheS4KKworMjAxNC0wMS0wNCAyMTozNDozOCArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpOiB1c2UgbmV3IHJpZmYgYXBpIHRvIGV4dHJhY3Qgbmlrb24gbWV0YWRhdGEKKwkgIEZpeGVzICM2MzYxNDMKKworMjAxMy0xMS0wMSAxNjo0MTo0MyArMDAwMCAgSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkgIHJ0cHJ0eHNlbmQvcnRwcnR4cmVjZWl2ZTogZ2VuZXJhdGUgZ3RrIGRvYworCisyMDEzLTEyLTAyIDExOjI2OjA5ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBydHguYzoKKwkgIHRlc3QvY2hlY2s6IFZlcmlmeSBydHBydHhzZW5kOjpzc3JjLW1hcCBwcm9wZXJ0eSB3b3JrcyBhcyBleHBlY3RlZAorCisyMDEzLTExLTI5IDE5OjM1OjQ0ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmg6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBhdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1ydHBhdXguYzoKKwkgIHJ0cHJ0eHJlY2VpdmU6IG1vZGlmeSB0byB1c2UgYSBwYXlsb2FkLXR5cGUgbWFwIGxpa2UgcnRwcnR4c2VuZAorCisyMDEzLTExLTI5IDE5OjU4OjI2ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJICBydHBydHhzZW5kOiBkbyBub3Qga2VlcCBoaXN0b3J5IG9mIHBhY2tldHMgd2l0aCBhbiB1bmtub3duIHBheWxvYWQgdHlwZQorCSAgVGhpcyBhbGxvd3MgdG8gZGlzYWJsZSByZXRyYW5zbWlzc2lvbiBwZXIgcGF5bG9hZCB0eXBlIGJ5IG5vdCBwdXR0aW5nCisJICBhIGNlcnRhaW4gcGF5bG9hZCB0eXBlIGluIHRoZSBtYXAuCisKKzIwMTQtMDEtMDIgMTU6MTg6NTIgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmg6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBhdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGNvbGxpc2lvbi5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwcnR4LmM6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXJ0cGF1eC5jOgorCSAgcnRwcnR4c2VuZDogQWxsb3cgU1NSQy1tdWx0aXBsZXhpbmcgYW5kIG11bHRpcGxlIHBheWxvYWQgdHlwZXMgaW4gdGhlIG9yaWdpbmFsIHN0cmVhbQorCSAgQ29uZmxpY3RzOgorCSAgdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1ydHBhdXguYworCisyMDEzLTExLTI1IDE1OjAwOjQ1ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJICBydHBydHhzZW5kOiBBZGQgYW4gcnR4LXNzcmMgcHJvcGVydHkgdG8gYWxsb3cgZXh0ZXJuYWwgY29udHJvbCBvZiB0aGUgc3NyYworCSAgVGhpcyBpcyB1c2VmdWwgd2hlbiBvbmUgbmVlZHMgdG8ga25vdyB0aGUgU1NSQyBiZWZvcmVoYW5kcywgc28gdGhhdCBpdCBjYW4KKwkgIGJlIHVzZWQgZm9yIFNSVFAgZm9yIGV4YW1wbGUuCisKKzIwMTMtMTEtMTMgMTU6MTE6MzUgLTA1MDAgIFRvcnJpZSBGaXNjaGVyIDx0b3JyaWUuZmlzY2hlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC8uZ2l0aWdub3JlOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1ydHBhdXguYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItcnRwYXV4LmM6CisJICBleGFtcGxlczogcnRwOiBBZGQgZW5kLXRvLWVuZCBydHBiaW4gZXhhbXBsZSB3aXRoIFJUWCBlbGVtZW50cworCSAgVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIHJ0cGJpbiB3aXRoIHJldHJhbnNtaXNzaW9uIChydHgpCisJICBlbGVtZW50cyBzZXQgaW4gdGhlIHBsYWNlIG9mIHJ0cGJpbidzICJhdXgiIGVsZW1lbnRzIGluIG9yZGVyIHRvCisJICBlbmFibGUgUlRQIHJldHJhbnNtaXNzaW9uIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgUkZDNDU4OC4KKworMjAxMy0xMS0wNSAxNzozNTowMSArMDAwMCAgSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvY3MvZGVzaWduL01ha2VmaWxlLmFtOgorCSogZG9jcy9kZXNpZ24vZGVzaWduLXJ0cGF1eGlsaWFyeS50eHQ6CisJICBkb2M6IGFkZCBkZXNpZ24tcnRwYXV4aWxpYXJ5LnR4dCB0byBkZXNjcmliZSBob3cgcnRwYmluIGRlYWxzIHdpdGggYXV4aWxpYXJ5IGVsZW1lbnRzCisKKzIwMTQtMDEtMDIgMTQ6NDg6NDkgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBhbHNvIHB1c2ggRU9TIGV2ZW50IHRvIFJUQ1Agc3JjcGFkCisKKzIwMTQtMDEtMDIgMTQ6NDY6MTEgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBzZXNzaW9uOiBwbGFjZSBTU1JDIGluIFJldHJhbnNtaXNzaW9uIGV2ZW50CisKKzIwMTMtMTEtMDEgMTY6NTc6MTUgKzAwMDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBhdXguYzoKKwkgIHRlc3RzL2NoZWNrOiBhZGQgcnRwYXV4Ojp0ZXN0X3NpbXBsZV9ydHBiaW5fYXV4CisJICBJdCBzaG93cyBob3cgdG8gdXNlICJzZXQtYXV4LXJlY2VpdmUiIGFuZCAic2V0LWF1eC1zZW5kIgorCSAgcHJvcGVydGllcyBvZiBydHBiaW4gdG8gc2V0IHJ0cHJ0eHNlbmQgYW5kIHJ0cHJ0eHJlY2VpdmUKKwkgIEJ1aWxkIDIgcGlwZWxpbmVzLCBvbmUgZm9yIHJ0cGJpbiBhcyBhIHNlbmRlciBhbmQgb25lIGZvcgorCSAgcnRvYmluIGFzIGEgcmVjZWl2ZS4gVGhlbiB0cmFuc21pdCBhbiBhdWRpbyBzdHJlYW0uCisJICBJdCBhbHNvIGRyb3BzIHNvbWUgcGFja2V0cyB0byBhY3RpdmF0ZSByZXN0cmFuc21pc3Npb24gYW5kCisJICBjaGVjayB0aGV5IGFyZSBhY3R1YWxseSByZXRyYW5zbWl0ZWQuCisKKzIwMTMtMTEtMDEgMTc6MDk6NDIgKzAwMDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBjb2xsaXNpb24uYzoKKwkgIHRlc3RzL2NoZWNrOiBhZGQgcnRwY29sbGlzaW9uOjp0ZXN0X3J0eF9zc3JjX2NvbGxpc2lvbiB1bml0IHRlc3QKKwkgIGNoZWNrIHRoYXQgcnR4cnRwc2VuZCBjaGFuZ2VzIGl0cyByZXRyYW5zbWlzc2lvbiBzc3JjIHdoZW4KKwkgIGNvbGxpc2lvbiBoYXBwZW5zCisKKzIwMTMtMTEtMDYgMTI6MzQ6MTMgKzAyMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jOgorCSAgdGVzdHMvY2hlY2s6IGFkZCBydHBydHg6OnRlc3RfcnR4cmVjZWl2ZV9kYXRhX3JlY29uc3RydWN0aW9uCisJICBUaGlzIHVuaXQgdGVzdCB2ZXJpZmllcyB0aGF0IHJldHJhbnNtaXR0ZWQgcnRwIHBhY2tldHMgY29taW5nIG91dAorCSAgb2YgcnRwcnR4cmVjZWl2ZSBhcmUgdGhlIHNhbWUgYXMgdGhlIG9yaWdpbmFsIG9uZXMuCisKKzIwMTMtMTEtMDUgMDk6MzM6NTEgKzAyMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHNlbmQuYzoKKwkgIHJ0cHJ0eHNlbmQ6IHVzZSBhIHJlYWxpc3RpYyBsaW1pdCBmb3IgdGhlIHZhbHVlIG9mIG1heC1zaXplLXBhY2tldHMKKwkgIEdfTUFYSU5UMTYgaXMgY2hvc2VuIGJlY2F1c2UgaWYgdGhlIHF1ZXVlIGNvbnRhaW5zIG1vcmUgdGhhbgorCSAgR19NQVhJTlQxNiBwYWNrZXRzLCBzZXFudW0gY29tcGFyaXNvbiB3aWxsIG5vdCB3b3JrIHByb3Blcmx5LgorCisyMDEzLTExLTA0IDIwOjA1OjAzICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmg6CisJICBydHBydHhzZW5kOiB1c2UgYSBHU2VxdWVuY2UgdG8gaW1wbGVtZW50IHRoZSBidWZmZXIgcXVldWUKKwkgIFRoaXMgaGFzIHRoZSBhZHZhbnRhZ2UgdGhhdCBzZWFyY2hpbmcgdGhlIHF1ZXVlIHRvIGZpbmQgdGhlCisJICBidWZmZXIgd2l0aCB0aGUgcmVxdWVzdGVkIHNlcW51bSBpcyBkb25lIHdpdGggYmluYXJ5IHNlYXJjaC4KKworMjAxMy0xMS0wNCAxODozODoyNCArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwcnR4LmM6CisJICBydHBydHhzZW5kOiByZXRyYW5zbWl0IHBhY2tldHMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHJ0eCByZXF1ZXN0cworCisyMDEzLTExLTAyIDE5OjU2OjQ0ICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBydHguYzoKKwkgIHRlc3RzL2NoZWNrOiBBZGQgdW5pdCB0ZXN0IGZvciBydHhzZW5kJ3MgbWF4X3NpemVfdGltZSBwcm9wZXJ0eQorCisyMDEzLTEwLTI5IDE4OjI3OjAwICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmg6CisJICBydHBydHhzZW5kOiBIYW5kbGUgdGhlIG1heF9zaXplX3RpbWUgcHJvcGVydHkKKwkgIFRoaXMgcHJvcGVydHkgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBhbW91bnQgb2YgYnVmZmVycworCSAgdG8ga2VlcCBpbiB0aGUgcmV0cmFuc21pc3Npb24gcXVldWUgZXhwcmVzc2VkIGFzIHRpbWUgKG1zKQorCSAgaW5zdGVhZCBvZiBidWZmZXIgY291bnQgKHdoaWNoIGlzIHRoZSBtYXhfc2l6ZV9idWZmZXJzIHByb3BlcnR5KS4KKworMjAxMy0xMS0wMiAxNToyMTowOCArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSAgcnRwcnR4c2VuZDoga2VlcCBpbXBvcnRhbnQgYnVmZmVyIGluZm9ybWF0aW9uIGluIGEgcHJpdmF0ZSBzdHJ1Y3R1cmUKKwkgIFRoaXMgaXMgdG8gYXZvaWQgbWFwcGluZyBhIGJ1ZmZlciBldmVyeSB0aW1lIHdlIG5lZWQgdG8gcmVhZCBhIHNlcW51bQorCSAgb3IgYSB0aW1lc3RhbXAuCisKKzIwMTMtMTEtMDEgMTE6NTg6NDcgKzAxMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jOgorCSAgdGVzdHMvY2hlY2s6IEFkZCBydHBydHg6OnRlc3RfcnR4c2VuZGVyX3BhY2tldF9yZXRlbnRpb24KKwkgIFRoaXMgdW5pdCB0ZXN0IHZlcmlmaWVzIHRoYXQgdGhlIHJ0eHNlbmQgZWxlbWVudCBjb3JyZWN0bHkgbWFpbnRhaW5zCisJICBhIGJ1ZmZlciBvZiBhbHJlYWR5IHRyYW5zbWl0dGVkIHJ0cCBwYWNrZXRzIGFuZCB0aGF0IGl0IGNhbgorCSAgcmUtdHJhbnNtaXQgYWxsIG9mIHRoZW0gY29ycmVjdGx5IG9uIGRlbWFuZC4gSXQgYWxzbyB2ZXJpZmllcworCSAgdGhhdCB0aGUgbGltaXQgb2YgdGhpcyBidWZmZXIgKG1heC1zaXplLXBhY2tldHMgcHJvcGVydHkpIGlzIHJlc3BlY3RlZC4KKworMjAxMy0xMS0wMSAxNjoyMjoxMyArMDAwMCAgSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jOgorCSAgdGVzdHMvY2hlY2s6IGFkZCBydHBydHg6OnRlc3RfZHJvcF9tdWx0aXBsZV9zZW5kZXIgdW5pdCB0ZXN0CisJICBTZXZlcmFsIHNlbmRlcnMgLyBvbmUgcmVjZWl2ZXIKKwkgIFNpbWlsYXIgdGhhbiB0ZXN0X2Ryb3Bfb25lX3NlbmRlciBidXQgd2l0aCBtdWx0aXBsZSBzZW5kZXJzCisJICBtaXhlZCB0aHJvdWdoIHRoZSBmdW5uZWwgZWxlbWVudC4KKwkgIEl0IGRyb3BzIHNvbWUgcGFja2V0cyBhbmQgY2hlY2tzIHRoYXQgdGhleSBhcmUgcmV0cmFuc21pdGVkCisJICBjb3JyZWN0bHkuCisKKzIwMTMtMTEtMDEgMTY6MjE6MDAgKzAwMDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBydHguYzoKKwkgIHRlc3RzL2NoZWNrOiBhZGQgcnRwcnR4Ojp0ZXN0X2Ryb3Bfb25lX3NlbmRlciB1bml0IHRlc3QKKwkgIFRlc3QgZm9yIG9uZSBzZW5kZXIgLyBvbmUgcmVjZWl2ZXIKKwkgIEJ1aWxkIHRoZSBwaXBlbGluZQorCSAgdmlkZW90ZXN0c3JjICEgcnRwdnJhd3BheSAhIHJ0cHJ0eHNlbmQgISBydHBydHhyZWNlaXZlICEgZmFrZXNpbmsKKwkgIGFuZCBkcm9wIHNvbWUgYnVmZmVycyBiZXR3ZWVuIHJ0cHJ0eHNlbmQgYW5kIHJ0cHJ0eHJlY2VpdmUKKwkgIFRoZW4gaXQgY2hlY2tzIHRoYXQgZXZlcnkgZHJvcHBlZCBwYWNrZXQgaGFzIGJlZW4gcmUtc2VudC4KKwkgIEl0IGFsc28gY2hlY2tzIHRoYXQgbm90IHRvbyBtdWNoIHJlcXVlc3RzIGhhcyBiZWVuIHNlbnQuCisKKzIwMTMtMTEtMDEgMTY6MTc6NTEgKzAwMDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBydHguYzoKKwkgIHRlc3RzL2NoZWNrOiBhZGQgcnRwcnR4Ojp0ZXN0X3B1c2hfZm9yd2FyZF9zZXEKKwkgIGFkZCBzaW1wbGUgdW5pdCB0ZXN0IHRoYXQgbWFudWFsbHkgcHVzaCBidWZmZXJzCisJICBpbiBydHBydHhzZW5kIGNvbm5lY3RlZCB0byBydHBydHhyZWNlaXZlLgorCSAgRHJvcHMgc29tZSBidWZmZXJzIGFuZCBtYWtlIHN1cmUgdGhleSBhcmUgcmV0cmFuc21pc3RlZC4KKworMjAxMy0xMS0wMSAxNTo1MjowMyArMDAwMCAgSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbWFuYWdlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5oOgorCSAgcnRwbWFuYWdlcjogYWRkIG5ldyBydHBydHhzZW5kIC8gcnRwcnR4cmVjZWl2ZSBlbGVtZW50cworCSAgVGhlIHB1cnBvc2Ugb2YgdGhlIHNlbmRlciBSVFggb2JqZWN0IGlzIHRvIGtlZXAgYSBoaXN0b3J5CisJICBvZiBSVFAgcGFja2V0cyB1cCB0byBhIGNvbmZpZ3VyYWJsZSBsaW1pdCAoaW4gdGltZSkuIEl0IHdpbGwKKwkgIGxpc3RlbiBmb3IgY3VzdG9tIHJldHJhbnNtaXNzaW9uIGV2ZW50cyBmcm9tIGRvd25zdHJlYW0uIFdoZW4KKwkgIGl0IHJlY2VpdmVzIGEgcmVxdWVzdCBmb3IgcmV0cmFuc21pc3Npb24sIGl0IHdpbGwgbG9vayB1cCB0aGUKKwkgIHJlcXVlc3RlZCBzZXFudW0gaW4gaXRzIGxpc3Qgb2Ygc3RvcmVkIHBhY2tldHMuIElmIHRoZSBwYWNrZXQKKwkgIGlzIGF2YWlsYWJsZSwgaXQgd2lsbCBjcmVhdGUgYSBSVFggcGFja2V0IGFjY29yZGluZyB0byBSRkMgNDU4OAorCSAgYW5kIHNlbmQgdGhpcyBhcyBhbiBhdXhpbGlhcnkgc3RyZWFtLgorCSAgVGhlIHJlY2VpdmVyIHdpbGwgbGlzdGVuIHRvIHRoZSBjdXN0b20gcmV0cmFuc21pc3Npb24gZXZlbnRzCisJICBmcm9tIHRoZSBkb3duc3RyZWFtIGppdHRlcmJ1ZmZlciBhbmQgd2lsbCByZW1lbWJlciB0aGUgU1NSQzEKKwkgIG9mIHRoZSBzdHJlYW0gYW5kIHNlcW51bSB0aGF0IHdhcyByZXF1ZXN0ZWQuIFdoZW4gaXQgc2VlcyBhCisJICBwYWNrZXQgd2l0aCBvbmUgb2YgdGhlIHN0b3JlZCBzZXFudW0sIGl0IGFzc29jaWF0ZXMgdGhlIFNTUkMyCisJICBvZiB0aGUgc3RyZWFtIHdpdGggdGhlIFNTUkMxIG9mIHRoZSBtYXN0ZXIgc3RyZWFtLiBGcm9tIHRoZW4KKwkgIG9uIGl0IGtub3dzIHRoYXQgU1NSQzIgaXMgdGhlIHJldHJhbnNtaXNzaW9uIHN0cmVhbSBvZiBTU1JDMS4KKwkgIFRoaXMgYWxnb3JpdGhtIGlzIHN0YXRlZCBpbiBSRkMgNDU4OC4gRm9yIHRoaXMgYWxnb3JpdGhtIHRvCisJICB3b3JrLCBSRkM0NTg4IGFsc28gc3RhdGVzIHRoYXQgbm8gdHdvIHBlbmRpbmcgcmV0cmFuc21pc3Npb24KKwkgIHJlcXVlc3RzIGNhbiBleGlzdCBmb3IgdGhlIHNhbWUgc2VxbnVtIGFuZCBkaWZmZXJlbnQgU1NSQ3Mgb3IKKwkgIGVsc2UgaXQgd291bGQgYmUgaW1wb3NzaWJsZSB0byBhc3NvY2lhdGUgdGhlIHJldHJhbnNtaXNzaW9uIHdpdGgKKwkgIHRoZSBvcmlnaW5hbCByZXF1ZXN0ZXIgU1NSQy4KKwkgIFdoZW4gdGhlIFJUWCByZWNlaXZlciBoYXMgYXNzb2NpYXRlZCB0aGUgcmV0cmFuc21pc3Npb24gcGFja2V0cywKKwkgIGl0IGNhbiBkZXBheWxvYWQgYW5kIGZvcndhcmQgdGhlbSB0byB0aGUgc291cmNlIHBhZCBvZiB0aGUgZWxlbWVudC4KKwkgIFJUWCBpcyBTU1JDLW11bHRpcGxleGVkCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzExMDg0CisKKzIwMTMtMTEtMDUgMTY6MzY6NDYgKzAwMDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL2Rlc2lnbi9NYWtlZmlsZS5hbToKKwkqIGRvY3MvZGVzaWduL2Rlc2lnbi1ydHByZXRyYW5zbWlzc2lvbi50eHQ6CisJICBkb2M6IGFkZCBkZXNpZ24gZm9yIHJ0cCByZXRyYW5zbWlzc2lvbgorCSAgRGVzY3JpYmUgaG93IHJ0cHJ0eHNlbmQgYW5kIHJ0cHJ0eHJlY2VpdmUgZ2VuZXJhbGx5IHdvcmsKKwkgIGJ1dCBhbHNvIGhvdyB0aGUgYXNzb2NpYXRpb24gYWxnb3JpdGhtIGlzIGltcGxlbWVudGVkLgorCisyMDE0LTAxLTAyIDIwOjIzOjA1IC0wMzAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyLnZlcmRlam9Ac2lzYS5zYW1zdW5nLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiB1c2Ugc3RhdHVzIGNvZGUgbWFjcm8gaW5zdGVhZCBvZiA0MDcKKwkgIFJlc3Qgb2YgdGhlIGNvZGUgaXMgdXNpbmcgdGhlIF9QUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRAorCSAgbWFjcm8gdG9vLiBFYXNpZXIgdG8gdW5kZXJzdGFuZCBpZiB5b3UgZG9uJ3QgcmVjYWxsIEhUVFAKKwkgIGVycm9yIGNvZGVzIGJ5IGhlYXJ0LgorCisyMDEzLTEyLTMxIDIxOjMxOjQzIC0wMzAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyLnZlcmRlam9Ac2lzYS5zYW1zdW5nLmNvbT4KKworCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzoKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmg6CisJICBzaG91dDJzZW5kOiBjaGFuZ2UgYXVkaW9fZm9ybWF0IGZpZWxkIHRvIGZvcm1hdAorCSAgVGhpcyBlbGVtZW50IGFuZCB0aGUgdW5kZXJseWluZyBsaWJzaG91dDIgbGlicmFyeQorCSAgY2FuIGhhbmRsZSB2aWRlbyBtZWRpYSBmaWxlcyB0b28uIFRoZSBjb2RlIGFscmVhZHkKKwkgIGhhbmRsZXMgdmlkZW8vd2VibSBzbyB0aGUgbmFtZSBnZXRzIGNvbmZ1c2luZy4gQWxzbworCSAgYWRkIGFuZCB1c2UgREVGQVVMVF9GT1JNQVQgbWFjcm8gSW5zdGVhZCBvZiBoYXJkd2lyaW5nCisJICBTSE9VVF9GT1JNQVRfVk9SQklTIGF0IGluaXQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjEzNDIKKworMjAxMy0xMi0zMSAyMDowOToyOSAtMDMwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8ci52ZXJkZWpvQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmM6CisJICBzaG91dDJzZW5kOiBjbGFyaWZ5IG1lYW5pbmcgb2YgdGhlIFVSTCBwcm9wCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIxMzQyCisKKzIwMTMtMTItMjcgMTI6Mjc6MzIgLTAzMDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHIudmVyZGVqb0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzoKKwkgIHNob3V0MnNlbmQ6IGRvY3MsIGFkZCBhIHNhbXBsZSBwaXBlbGluZQorCSAgQW5kIGZpbmlzaCBhZGRpbmcgc2hvdXQyc2VuZCB0byB0aGUgZG9jcyB3aGlsZSBhdCBpdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMTM0MgorCisyMDEzLTEyLTMxIDE1OjAwOjIyIC0wMzAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyLnZlcmRlam9Ac2lzYS5zYW1zdW5nLmNvbT4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmb3ZlcmxheS5jOgorCSAgZ2RrcGl4YnVmb3ZlcmxheTogcmVtb3ZlIHNwdXJpb3VzIEBzZWVfYWxzbworCisyMDEzLTEyLTA2IDE3OjA4OjU0ICswMDAwICBNYXR0aGlldSBCb3Vyb24gPG1hdHRoaWV1LmJvdXJvbkBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBzdXBwb3J0IGFueSB2aWRlbyBmb3JtYXRzIGFuZCBhbnkgY2FwcyBmZWF0dXJlcyBpZiBkZWludGVybGFjZSBtb2RlIGFsbG93cyBpdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxOTYzNgorCisyMDEzLTEyLTMxIDEzOjMxOjUyICswMTAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJyYXNAaG90bWFpbC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IEhhbmRsZSB2NGwyX2lvY3RsKCkgZXJyb3JzIGV2ZW4gaW4gZXJyb3IgaGFuZGxpbmcKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjEyNjgKKworMjAxNC0wMS0wMSAxMjoxMTo0MyAtMDgwMCAgSmVyZW15IEh1ZGRsZXN0b24gU2VxdW9pYSA8amVyZW15aHVAYXBwbGUuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vTWFrZWZpbGUuYW06CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlbzogdW5pZmRlZiAtRFJVTl9OU19BUFBfVEhSRUFECisKKzIwMTQtMDEtMDEgMTI6MTA6MDEgLTA4MDAgIEplcmVteSBIdWRkbGVzdG9uIFNlcXVvaWEgPGplcmVteWh1QGFwcGxlLmNvbT4KKworCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJICBvc3h2aWRlbzogQXNzdW1lIFNESyBhbmQgZGVwbG95bWVudCB0YXJnZXQgYXJlIGF0IGxlYXN0IFNub3cgTGVvcGFyZAorCisyMDE0LTAxLTAxIDEyOjIzOjUwIC0wODAwICBKZXJlbXkgSHVkZGxlc3RvbiBTZXF1b2lhIDxqZXJlbXlodUBhcHBsZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogRGlzYWJsZSBvc3h2aWRlbyBvbiBMZW9wYXJkIGFuZCBlYXJsaWVyCisJICBUaGlzIGFsc28gbW92ZXMgdGhlICJvdGhlciBwbGF0Zm9ybXMiIGNoZWNrIGluIE9TIFggdmlkZW8gdG8gYmVmb3JlIHRoZQorCSAgdmFyaWFibGUgaXMgcmVhZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMTI0NQorCisyMDEzLTEyLTMxIDE0OjU3OjI3ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluLmM6CisJICB0ZXN0czogYWRkIEFVWCByZWNlaXZlciB1bml0IHRlc3QKKworMjAxMy0xMi0zMSAxMzoyMDowMSArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbi5jOgorCSAgdGVzdHM6IGltcHJvdmUgcnRwYmluIHRlc3QKKworMjAxMy0xMi0zMSAxMzoxNjo0NiArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBhZGQgc29tZSBkb2NzIGFib3V0IEFVWCBlbGVtZW50cworCisyMDEzLTEyLTMxIDEzOjAxOjIyICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluLmM6CisJICB0ZXN0czogYWRkIEFVWCBzZW5kZXIgdW5pdCB0ZXN0CisKKzIwMTMtMTItMzEgMTI6MzE6MjUgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgcnRwYmluOiBhZGQgc3VwcG9ydCBmb3IgQVVYIHNlbmRlciBhbmQgcmVjZWl2ZXIKKwkgIEFVWCBlbGVtZW50cyBhcmUgZWxlbWVudHMgdGhhdCBjYW4gYmUgaW5zZXJ0ZWQgaW50byB0aGUgcnRwYmluCisJICBwaXBlbGluZSByaWdodCBiZWZvcmUgb3IgYWZ0ZXIgMSBvciBtb3JlIHNlc3Npb24gZWxlbWVudHMuCisJICBUaGUgQVVYIGVsZW1lbnRzIGFyZSBlc3NlbnRpYWwgZm9yIGltcGxlbWVudGluZyBmdW5jdGlvbmFsaXR5IHN1Y2gKKwkgIGFzIGVycm9yIGNvcnJlY3Rpb24gKEZFQykgYW5kIHJldHJhbnNtaXNzaW9uIChSVFgpLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMTA4NworCisyMDEzLTEyLTMxIDEyOjIyOjM5ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluLmM6CisJICB0ZXN0czogYWRkIGRlY29kZXIgdGVzdAorCisyMDEzLTEyLTMwIDE3OjM2OjQyICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IG1ha2UgcmVxdWVzdF9lbGVtZW50IG1ldGhvZCBpbnRlcm5hbGx5CisJICBXZSBjYW4gdXNlIHRoZSBzYW1lIG1ldGhvZCB0byBjcmVhdGUgZW5jb2RlciBhbmQgZGVjb2RlciBlbGVtZW50cywgdGhleQorCSAgYXJlIGp1c3QgaW50ZXJuYWwgZWxlbWVudHMgdGhhdCB3ZSBjcmVhdGUuCisKKzIwMTMtMTItMzEgMTA6MjU6MjggKzAxMDAgIFN0w6lwaGFuZSBDZXJ2ZWF1IDxzY2VydmVhdUBnbWFpbC5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IFNraXAgaWQzIHRhZworCSAgU2tpcCBpZDMgdGFnIGR1cmluZyB3YXYgcGFyc2UuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIxMjQxCisKKzIwMTMtMTItMzEgMTA6MTA6MDUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uaDoKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5tOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSAgb3N4OiBNYWtlIE9TWCB2ZXJzaW9uIGNoZWNrcyBtb3JlIGNvbnNpc3RlbnQKKwkgIEFuZCBlc3BlY2lhbGx5IGFsc28gY29uc2lkZXIgdXBkYXRlIHZlcnNpb25zLCBlLmcuIDEwLjUgd2l0aCB1cGRhdGVzCisJICB3aWxsIGJlIDEwNTEgb3Igc2ltaWxhciBhbmQgdGh1cyBiaWdnZXIgdGhhbiBNQUNfT1NfWF9WRVJTSU9OXzEwXzUgYnV0CisJICBzdGlsbCB3b24ndCBoYXZlIHRoZSBBUEkgd2Ugd2FudCB0byB1c2UuCisKKzIwMTMtMTItMzEgMTA6MDc6MjIgKzAxMDAgIEplcmVteSBIdWRkbGVzdG9uIDxqZXJlbXlodUBmcmVlZGVza3RvcC5vcmc+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkgIG9zeHZpZGVvc2luazogRml4IGJ1aWxkIG9uIHVwZGF0ZWQgT1MgWCBMZW9wYXJkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIxMjQ1CisKKzIwMTMtMTItMzAgMTc6MjM6MjIgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IEFkZCBtaXNzaW5nIGJyZWFrCisJICBJIGd1ZXNzIG5vLW9uZSBub3RpY2VkIHdlIG5vIGxvbmdlciBjb3VsZCBtdXggV01WMyAuLi4KKwkgIENPVkVSSVRZIENJRCAxMTM5NzU5CisKKzIwMTMtMTItMzAgMTc6MjA6MzcgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSAgcnRwdnJhd3BheTogQWRkIG1pc3NpbmcgYnJlYWsKKwkgIENPVkVSSVRZIENJRCAxMTM5NzYyCisKKzIwMTMtMTItMzAgMTc6MDA6NDUgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBpbnRlcm5hbC1zc3JjIGlzIG5vIGxvbmdlciBkZXByZWNhdGVkCisKKzIwMTMtMTItMzAgMTY6NTk6MjAgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogYWRkIFNpbmNlIHRhZ3MKKworMjAxMy0xMi0zMCAxNjo1MjoyOCArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICBydHBiaW46IGFkZCBzaWduYWwgZm9yIG5ldyBqaXR0ZXJidWZmZXIKKwkgIEVtaXQgYSBzaWduYWwgd2hlbiBhIG5ldyBqaXR0ZXJidWZmZXIgaXMgY3JlYXRlZCBzbyB0aGF0IHRoZSBhcHAgY2FuCisJICBoYXZlIGEgY2hhbmNlIHRvIGNvbmZpZ3VyZSBpdC4KKworMjAxMy0xMi0zMCAxNjoyODo1NyArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluLmM6CisJICBydHBiaW46IGhhbmRsZSBtdWx0aXBsZSBlbmNvZGVyIGluc3RhbmNlcworCSAgS2VlcCB0cmFjayBvZiBlbGVtZW50cyB0aGF0IGFyZSBhZGRlZCB0byBtdWx0aXBsZSBzZXNzaW9ucyBhbmQgbWFrZSBzdXJlCisJICB3ZSBvbmx5IGFkZCB0aGVtIHRvIHRoZSBydHBiaW4gb25jZSBhbmQgdGhhdCB3ZSBjbGVhbiB0aGVtIHdoZW4gbm8KKwkgIHNlc3Npb24gcmVmZXJzIHRvIHRoZW0gYW55bW9yZS4KKworMjAxMy0xMi0zMCAxNToxNjowOSArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbi5jOgorCSAgdGVzdHM6IGFkZCB1bml0IHRlc3QgZm9yIGVuY29kZXIgZWxlbWVudAorCisyMDEzLTEyLTMwIDE1OjE1OjQzICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IGZpeCBtZW1vcnkgbGVha3MKKworMjAxMy0xMi0zMCAxNTowMzozNCArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbi5jOgorCSAgdGVzdHM6IGZpeCBsZWFrCisKKzIwMTMtMTItMzAgMTU6MDA6NTAgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogZXhwZWN0IHRoZSBwYWRzIG9uIHRoZSBlbmNvZGVycworCSAgRG9uJ3QgdXNlIHJlcXVlc3QgcGFkcyBmb3IgdGhlIGVuY29kZXIgZWxlbWVudHMsIHRoZSBzaWduYWwgaGFuZGxlcgorCSAgc2hvdWxkIHJlcXVlc3QgdGhlIHBhZHMgYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZSBhdmFpbGFibGUgd2l0aCB0aGUgcmlnaHQKKwkgIG5hbWUuCisKKzIwMTMtMTItMzAgMTQ6NTY6MDcgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgcnRwYmluOiByZXF1ZXN0LXJ0cC1lbmNvZGVyIGFyZSBubyBhY3Rpb24gc2lnbmFscworCSAgVGhlIHJlcXVlc3QtcnRwLWVuY29kZXIgc2lnbmFscyBhcmUgbm90IGFjdGlvbiBzaWduYWxzIHNvIG1hcmsgdGhlbQorCSAgY29ycmVjdGx5IGFuZCB1c2UgYW4gYWNjdW11bGF0b3IgdG8gY29sbGVjdCB0aGUgcmVzdWx0IHZhbHVlLgorCisyMDEzLTEyLTMwIDE0OjM2OjQ1ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBlbWl0IG1pZGktYmFzZS1ub3RlIHRhZyBmcm9tIGRhdGEgaW4gJ3NtcGwnIGNodW5rCisJICBBZGQgcGFyc2luZyBvZiB0aGUgJ3NtcGwnIGNodW5rLiBSaWdodCBub3cgd2Ugb25seSBncmFiIHRoZSBtaWRpLWJhc2Utbm90ZSBhbmQKKwkgIGVtaXQgaXQgYXMgYSB0YWcuCisKKzIwMTMtMTItMjYgMTI6MDU6MTkgKzAyMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIGdzdHJ0cHNlc3Npb246IHN1Z2dlc3QgdXBzdHJlYW0gdG8gdXNlIHRoZSBuZXcgImludGVybmFsLXNzcmMiIGFmdGVyIGEgY29sbGlzaW9uCisJICBXaGVuIGEgY29sbGlzaW9uIGlzIGZvdW5kIG9uIHRoZSBpbnRlcm5hbCBzc3JjLCB3ZSBoYXZlIHRvIGNoYW5nZSBpdC4KKwkgIElkZWFsbHksIHdlIHdhbnQgYWxzbyB0aGUgcGF5bG9hZGVyIHVwc3RyZWFtIHRvIGZvbGxvdyB0aGlzIGNoYW5nZSBhbmQgdXNlCisJICB0aGUgbmV3IGludGVybmFsIHNzcmMuIElkZWFsbHkgd2Ugd2FudCB0aGlzIGNvbmRpdGlvbiB0byBiZSBhbHdheXMgbWV0OgorCSAgaWYgdGhlcmUgaXMgb25lIHBheWxvYWRlciBzZW5kaW5nIG9uIHRoaXMgc2Vzc2lvbiwgaXRzIHNzcmMgc2hvdWxkIG1hdGNoIHRoZQorCSAgaW50ZXJuYWwgc3NyYy4KKworMjAxMy0xMi0yNiAxMTowNDoyOSArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogYWxsb3cgc2V0dGluZyBpbnRlcm5hbC1zc3JjIGFnYWluCisKKzIwMTMtMTItMzAgMTM6MzE6NDUgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJICB5NG1lbmNvZGU6IFJlbW92ZSBkZWFkIGNvZGUKKwkgIHNldC9nZXQgcHJvcGVydHkgaXNuJ3QgdXNlZAorCisyMDEzLTEyLTMwIDEzOjMwOjI0ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHFjZWxwZGVwYXkuYzoKKwkgIHJ0cHFjZWxwZGVwYXk6IFJlbW92ZSB1bmVlZGVkIHZhcmlhYmxlCisKKzIwMTMtMTItMDUgMTU6NTM6NTIgLTA4MDAgIEFsZWl4IENvbmNoaWxsbyBGbGFxdcOpIDxhbGVpeEBvYmxvbmcuY29tPgorCisJICBydHBiaW46IGFsbG93IGR5bmFtaWMgUlRQL1JUQ1AgZW5jb2RlcnMvZGVjb2RlcnMKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLltjaF06IGZvdXIgbmV3IGFjdGlvbiBzaWduYWxzIGhhdmUgYmVlbgorCSAgYWRkZWQgKHJlcXVlc3QtcnRwLWVuY29kZXIsIHJlcXVlc3QtcnRwLWRlY29kZXIsIHJlcXVlc3QtcnRjcC1lbmNvZGVyCisJICBhbmQgcmVxdWVzdC1ydGNwLWRlY29kZXIpLiBUaGUgdXNlciB3aWxsIGJlIGFibGUgdG8gcHJvdmlkZSBlbmNvZGVycworCSAgb3IgZGVjb2RlcnMgZHluYW1pY2FsbHkuIFRoZSBlbmNvZGVycyBtdXN0IGZvbGxvdyB0aGUgc3J0cGVuYyBBUEkgYW5kCisJICB0aGUgZGVjb2RlcnMgdGhlIHNydHBkZWMgQVBJLiBIYXZpbmcgc2VwYXJhdGUgc2lnbmFscyBmb3IgUlRQIGFuZCBSVENQCisJICBhbGxvd3MgdGhlIHVzZXIgdG8gdXNlIGRpZmZlcmVudCBlbmNvZGVycy9kZWNvZGVycyBvciBwcm92aWRlIHRoZSBzYW1lCisJICBvbmUgKGUuZy4gdGhhdCB3b3VsZCBiZSB0aGUgY2FzZSBmb3Igc3J0cGVuYykuCisJICBBbHNvLCBydHBiaW4gbm93IGFsbG93cyBhcHBsaWNhdGlvbi94LXNydHAgaW4gaXRzIHBhZHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzE5OTM4CisKKzIwMTMtMTItMjcgMTY6NTE6MzIgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogZHluYW1pY2FsbHkgcmVjYWxjdWxhdGUgUlRYIHBhcmFtZXRlcnMKKwkgIFVzZSB0aGUgcm91bmQtdHJpcC10aW1lIGFuZCBhdmVyYWdlIGppdHRlciB0byBkeW5hbWljYWxseSBjYWxjdWxhdGUgdGhlCisJICByZXRyYW5zbWlzc2lvbiBpbnRlcnZhbCBhbmQgZXhwZWN0ZWQgcGFja2V0IGFycml2YWwgdGltZS4KKwkgIEJhc2VkIG9uIHBhdGNoZXMgZnJvbSBUb3JyaWUgRmlzY2hlciA8dG9ycmllLmZpc2NoZXJAY29sbGFib3JhLmNvLnVrPgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMTQxMgorCisyMDEzLTEyLTI3IDE2OjUwOjUyICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGNhbGN1bGF0ZSBhdmVyYWdlIGppdHRlcgorCisyMDEzLTEyLTI3IDE2OjQ4OjQ4ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiB1c2UgUlRUIGZyb20gdGhlIFJldHJhbnNtaXNzaW9uIGV2ZW50CisJICBQbGFjZSB0aGUgZXN0aW1hdGVkIFJUVCBpbiB0aGUgUmV0cmFuc21pc3Npb24gZXZlbnQgYW5kIGxldCB0aGUgc2Vzc2lvbgorCSAgbWFuYWdlciB1c2UgdGhhdCBpbnN0ZWFkIG9mIHRoZSBoYXJkY29kZWQgdmFsdWUuCisKKzIwMTMtMTItMjcgMTU6NTc6MzkgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogdGFrZSBtb3JlIGFjY3VyYXRlIHJ1bm5pbmctdGltZSBmb3IgTkFDSworCSAgRG9uJ3QgdXNlIHRoZSBjdXJyZW50IHRpbWUgY2FsY3VsYXRlZCBmcm9tIHRoZSB0bWllb3V0IGxvb3AgZm9yIHdoZW4gd2UKKwkgIGxhc3Qgc2NoZWR1bGVkIHRoZSBOQUNLIGJlY2F1c2UgaXQgbWlnaHQgYmUgdW5zY2hlZHVsZWQgYmVjYXVzZSBvZiBhIG1heAorCSAgcGFja2V0IG1pc29yZGVyIGFuZCB0aGVuIHdlIGRvbid0IGFjY3VyYXRlbHkgY2FsY3VsYXRlIHRoZSBjdXJyZW50IHRpbWUuCisJICBJbnN0ZWFkLCB0YWtlIHRoZSBjdXJyZW50IGVsZW1lbnQgcnVubmluZyB0aW1lIHVzaW5nIHRoZSBjbG9jay4KKworMjAxMy0xMi0zMCAxMTowNjozOCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFja2RlYy5jOgorCSAgd2F2cGFja2RlYzogU2VuZCBhIENBUFMgZXZlbnQgaW4gdGhlIHVuaXQgdGVzdAorCisyMDEzLTEyLTI3IDAyOjE0OjAyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IGltcHJvdmUgbXNzX21vZGUvZnJhZ21lbnRlZCBzcGVjaWFsIGhhbmRsaW5nCisJICBNYWtlIGl0IGNsZWFyIHdoYXQgc2hvdWxkIGJlIGhhbmRsZWQgcHVyZWx5IGJ5IG1zcyBtb2RlOgorCSAgMSkgRXhwb3NlIHRoZSBzdHJlYW1zIG9uIHRoZSBmaXJzdCBtb29mIGFzIHRoZXJlIGFyZSBubyBtb292IGF0b21zCisJICAyKSBQcm9wZXJseSBjbGVhbnVwIHN0cmVhbXMgb24gZmx1c2hlcworCSAgQWRkIGEgbm90ZSBhYm91dCB0aGUgbWVhbmluZyBvZiB1cHN0cmVhbV9uZXdzZWdtZW50IGFuZCBtc3NfbW9kZQorCSAgZm9yIGZ1dHVyZSByZWZlcmVuY2UuCisJICBNYWtlIGFsbCBvdGhlciBzcGVjaWFsIGZyYWdtZW50IGhhbmRsaW5nIHNoYXJlZCBmb3IgYm90aCBkYXNoCisJICBhbmQgbXNzIHN0cmVhbXMuCisKKzIwMTMtMTItMTIgMTA6NTA6MjcgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGRyYWluIHRoZSBhZGFwdGVyIGJlZm9yZSBwdXNoaW5nIEVPUworCSAgSW4gYSBmcmFnbWVudGVkIHNjZW5hcmlvLCBxdGRlbXV4IGlzIG9wZXJhdGluZyBpbiBwdXNoIG1vZGUKKwkgIGFuZCBpdCBnZXRzIGEgZnJhZ21lbnRlZCBidWZmZXIuIFdoaWxlIHByb2Nlc3NpbmcgaXRzIGRhdGEKKwkgIGRvd25zdHJlYW0gZ2V0cyB1bmxpbmtlZCAob3IgYSBpbnB1dC1zZWxlY3RvciBjaGFuZ2VzIGl0cworCSAgYWN0aXZlIHBhZCBhbmQgcmV0dXJucyBub3QtbGlua2VkKS4gUXRkZW11eCBzdG9wcyBwcm9jZXNzaW5nCisJICB0aGlzIGZyYWdtZW50IGFuZCByZXR1cm5zIG5vdC1saW5rZWQgdXBzdHJlYW0sIGxlYXZpbmcgdGhlCisJICByZW1haW5pbmcgZGF0YSBpbiBpdHMgYWRhcHRlci4KKwkgIFdoZW4gaXQgZ2V0cyBhbiBFT1MgaXQgc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IGFsbCB0aGUgZGF0YSBpdAorCSAgaGFkIHJlY2VpdmVkIGlzIHB1c2hlZCBiZWZvcmUgcHVzaGluZyBFT1MuCisKKzIwMTMtMTItMjYgMjM6MjE6NDcgLTAzMDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHIudmVyZGVqb0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSAgc2hvdXQyc2VuZDogZHJvcCBJUCBvbmx5IHJlcXVpcmVtZW50IGZvciBfc2V0X2hvc3QoKQorCSAgbGlic2hvdXQyICh3ZSByZXF1aXJlID4gMi4wIGF0IGNvbmZpZyB0aW1lKSBzdXBwb3J0cworCSAgYm90aCBJUCBhbmQgaG9zdG5hbWUgZm9yIF9zZXRfaG9zdCgpLiBEcm9wcGVkIGFuCisJICBvdXRkYXRlZCBGSVhNRSByZWdhcmRpbmcgdGhpcyBsaW1pdGF0aW9uLCBhZGp1c3RlZAorCSAgc29tZSBjb21tZW50cyBhbmQgY2hhbmdlZCB0aGUgcGFyYW0gYmx1cmIgdG8gcmVmbGVjdAorCSAgdGhpcyB0b28uCisKKzIwMTMtMTItMjYgMjE6NDM6MzQgLTAzMDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHIudmVyZGVqb0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSAgc2hvdXQyc2VuZDogUmV0YXJnZXQgRklYTUUgdG8gMi4wCisKKzIwMTMtMTItMjYgMTE6MjE6MzYgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiB1c2UgYWdncmVnYXRlIGNvbnRyb2wgZm9yIFBMQVkvUEFVU0UvVEVBUkRPV04KKwkgIFVzZSB0aGUgYWdncmVnYXRlIGNvbnRyb2wgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwgcmVxdWVzdCB1cmwgdG8gcGVyZm9ybQorCSAgUEFVU0UvUExBWSBhbmQgVEVBUkRPV04uCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIxMDAzCisKKzIwMTMtMTItMjQgMTQ6NDA6MjUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYzoKKwkgIHJuZGJ1ZmZlcnNpemU6IFByb3h5IENBUFMsIEFMTE9DQVRJT04sIFNDSEVEVUxJTkcgYW5kIHNyY3BhZCBldmVudHMgcHJvcGVybHkKKworMjAxMy0xMi0yNCAwMDo0MzozOSArMDEwMCAgTmljb2xhIE11cmlubyA8bmljb2xhLm11cmlub0BnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBhZHBjbSBtYXggYmxvY2sgYWxpZ24gaXMgODE5MgorCisyMDEzLTEyLTIzIDEyOjIzOjI3IC0wNjAwICBCcmVuZGFuIExvbmcgPGIubG9uZ0BjYWJsZWxhYnMuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICB2cDlkZWM6IFJlcXVpcmUgdnB4ID49IDEuMy4wIGZvciBidWlsZGluZyB2cDlkZWMgYW5kIHZwOWVuYworCSAgUHJldmlvdXMgdmVyc2lvbnMgZGlkIG5vdCBoYXZlIGEgc3RhYmxlIGJpdHN0cmVhbSBmb3IgVlA5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDk4NgorCisyMDEzLTEyLTIzIDE1OjQ2OjQ4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogVXNlIGNvcnJlY3QgY29kZWMgaWQgZm9yIEFEUENNL0RWSQorCisyMDEzLTEyLTIzIDE1OjQ0OjMwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IENoZWNrIGZvciB0aGUgY29ycmVjdCBzaXplIG9mIGNvZGVjX2RhdGEgaW4gdGhlIEFDTSBjYXNlCisKKzIwMTItMDEtMTQgMTk6NTg6MTcgKzAxMDAgIE5pY29sYSBNdXJpbm8gPG5pY29sYS5tdXJpbm9AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogYmFzaWMgYWRwY20gc3VwcG9ydAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NDMzOQorCisyMDEzLTEyLTIwIDExOjQ1OjM4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2Rlc2NyaXB0b3JzLmM6CisJICBxdGRlbXV4OiBGaXggY2FsY3VhdGlvbiBvZiBkZXNjcmlwdG9yIGxlbmd0aAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDgxMworCisyMDEzLTEyLTIyIDIyOjMzOjM5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBhdXRvZ2VuLnNoOgorCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGRiZWRhYTAgdG8gZDQ4YmVkMworCisyMDEzLTEyLTIyIDIxOjU2OjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9NYWtldmFyczoKKwkgIHBvOiBzZXQgZ2V0dGV4dCBkb21haW4gaW4gTWFrZXZhcnMgc28gd2UgZG9uJ3QgaGF2ZSB0byBwYXRjaCB0aGUgZ2VuZXJhdGVkIE1ha2VmaWxlLmluLmluCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA1NDU1CisKKzIwMTMtMTItMTkgMTY6NTA6MTAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IG9uIHJlY2VpdmUgZXJyb3Igb25seSB1bm1hcCBhbmQgdW5yZWYgYnVmZmVyIGlmIG9uZSB3YXMgYWxsb2NlZCBhbmQgbWFwcGVkCisJICBjb3Zlcml0eSBDSUQgMTEzOTg2Ni4KKworMjAxMy0xMi0xOSAxMjo0NzoyMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpdWRwc2luazogZml4IG1pc2xlYWRpbmcgY29tbWVudAorCSAgVGhvc2UgYXJlIG5vdCBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLgorCisyMDEzLTEyLTE3IDE4OjI4OjI1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICB2cHg6IE1hcmsgVlA5IHN1cHBvcnQgYXMgbm9uLWV4cGVyaW1lbnRhbAorCSAgVGhlcmUgd2FzIGEgbGlidnB4IHJlbGVhc2Ugd2l0aCBWUDkgc3VwcG9ydCBub3cgYW5kIHRoZSBiaXRzdHJlYW0KKwkgIGlzIGZyb3plbiB0b28uCisKKzIwMTMtMTItMTUgMjE6MDQ6MTEgLTA4MDAgIFRvZGQgQWd1bG5pY2sgPHRvZGRAYWd1bG5pY2suY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIFNvbWUgY29tcGlsZXIgd2FybmluZyBmaXhlcyB0byBzYXRpc2Z5IFhDb2RlIGNvbXBpbGVyCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTEzCisKKzIwMTMtMTItMTYgMTY6MTc6MDcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJICBpZDN2Mm11eDogU2V0IHBpY3R1cmUgdHlwZSBpbiB0aGUgQVBJQyBmcmFtZXMKKworMjAxMy0xMi0xNiAxNjoxNDo1MiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzoKKwkgIGlkM3YybXV4OiBTZXQgaW1hZ2UtZGVzY3JpcHRpb24gZnJvbSB0aGUgaW5mbyBzdHJ1Y3QsIG5vdCB0aGUgY2FwcworCisyMDEzLTEyLTE2IDEwOjAyOjM3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3R3YXZwYWNrcGFyc2UuaDoKKwkgIHdhdnBhY2twYXJzZTogUG9zdCBBVURJT19DT0RFQyB0YWcKKworMjAxMy0xMi0xNiAxMDowMDozNyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5oOgorCSAgc2JjcGFyc2U6IFBvc3QgQVVESU9fQ09ERUMgdGFnCisKKzIwMTMtMTItMTYgMDk6NTg6MzEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5oOgorCSAgZmxhY3BhcnNlOiBQb3N0IEFVRElPX0NPREVDIHRhZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDUxMgorCisyMDEzLTEyLTE2IDA5OjU2OjI5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmg6CisJICBkY2FwYXJzZTogUG9zdCBBVURJT19DT0RFQyB0YWcKKworMjAxMy0xMi0xNiAwOTo1NDozOCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5oOgorCSAgYW1ycGFyc2U6IFBvc3QgQVVESU9fQ09ERUMgdGFnCisKKzIwMTMtMTItMTYgMDk6NDk6NDggKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuaDoKKwkgIGFjM3BhcnNlOiBQb3N0IEFVRElPX0NPREVDIHRhZworCisyMDEzLTEyLTE2IDA5OjQ2OjE2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmg6CisJICBhYWNwYXJzZTogUG9zdCBBVURJT19DT0RFQyB0YWcKKworMjAxMy0xMi0xNiAwOTo0MToxNCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSAgbXBlZ2F1ZGlvcGFyc2U6IFVzZSBwYnV0aWxzIGZ1bmN0aW9uYWxpdHkgdG8gY3JlYXRlIHRoZSBBVURJT19DT0RFQyB0YWcKKworMjAxMy0xMi0xMyAxNzozNjozNiAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogQWRkIGVycm9yIG1lc3NhZ2UgaWYgdGhlIGFwcCB0cmllcyB0byBzZXQgdGhlIGludGVybmFsLXNzcmMKKworMjAxMy0xMi0xMyAxNjowODozNSAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogT25seSBjb3VudCBuYWNrcyB3aGVuIGEgbmFjayBwYWNrZXQgaXMgcmVjZWl2ZWQKKwkgIE5vdCB3aGVuIGFueSBSVENQIGZlZWRiYWNrIHBhY2tldCBpcy4KKworMjAxMy0xMi0xMiAyMzoyMjo0MSAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwY29sbGlzaW9uLmM6CisJICB0ZXN0czogSW5pdGlhbGl6ZSBzZWdtZW50IGluIHJ0cGNvbGxpc2lvbiB0ZXN0CisKKzIwMTMtMTItMTMgMTU6NTc6MzYgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IFByb2Nlc3MgUFNGQiBGSVIgcmVxdWVzdHMgd2hpY2ggbGFjayB0aGUgbWVkaWEgc3NyYworCSAgQWNjb3JkaW5nIHRvIFJGQyA1MTA0IHNlY3Rpb24gNC4zLjEuMiwgUlRDUCBQU0ZCIEZJUiBtZXNzYWdlIFNIQUxMCisJICBoYXZlIGEgbWVkaWFfc3NyYyBmaWVsZCBzZXQgdG8gMC4gVGhlIGFjdHVhbCBtZWRpYSBzc3JjIGlzIGluIHRoZSBGQ0kuCisJICBTbyBpbiB0aGF0IGNhc2UsIHdlIGlnbm9yZSB0aGUgcmV0YWluZWQgZmVlZGJhY2sgYW5kIGp1c3QgbGV0IGl0IHRocm91Z2gKKwkgIHRvIHRoZSBydHBfc2Vzc2lvbl9wcm9jZXNzX2ZpcigpIGZ1bmN0aW9uIHdoaWNoIHdpbGwgY2hlY2sgZm9yIHRoZSBhY3R1YWwKKwkgIFNTUkMgaW5zaWRlIHRoZSBGQ0kuCisJICBGaXhlcyBhIHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBieSBjb21taXQgNTdjMjdlYzMKKworMjAxMy0xMS0xNCAxNjoxOToyOSArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIHJ0cHNlc3Npb246IGZpeCByYiBibG9ja3MgZGlzYXBwZWFyaW5nIGFmdGVyIHRoZSBmaXJzdCBydGNwIGN5Y2xlIHdpdGggbXVsdGlwbGUgc2VuZGVycworCSAgUHJldmlvdXNseSwgd2hlbiB0aGUgc2Vzc2lvbiBoYWQgbXVsdGlwbGUgaW50ZXJuYWwgc2VuZGVyIFNTUkNzLCBpdCB3b3VsZAorCSAgaXNzdWUgU1IgcmVwb3J0cyB3aXRoIFJCIGJsb2NrcyBvbmx5IG9uIHRoZSBmaXJzdCBSVENQIHRpbWVvdXQgYW5kIGFmdGVyd2FyZHMKKwkgIFNSIHJlcG9ydHMgd291bGQgYmUgc2VudCBlbXB0eS4gVGhpcyB3YXMgYmVjYXVzZSB0aGUgImdlbmVyYXRpb24iIG51bWJlcgorCSAgaW4gUlRQU291cmNlIHdvdWxkIGluY3JlYXNlIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgc2FtZSBjeWNsZSBhbmQgYWZ0ZXJ3YXJkcworCSAgaXQgd291bGQgYWx3YXlzIGJlIGdyZWF0ZXIgdGhhbiB0aGUgc2Vzc2lvbidzIGdlbmVyYXRpb24sIHdoaWNoIHdvdWxkIGNhdXNlCisJICBpdCB0byBiZSBza2lwcGVkIGZyb20gYmVpbmcgaW5jbHVkZWQgaW4gUkJzLgorCSAgVGhpcyBjb21taXQgZml4ZXMgdGhpcyBwcm9ibGVtIGJ5OgorCSAgMSkgSW5jcmVhc2luZyB0aGUgUlRQU291cmNlIGdlbmVyYXRpb24gb25seSBhdCB0aGUgZW5kIG9mIGVhY2ggY3ljbGUsCisJICB3aGljaCBlc3NlbnRpYWxseSBmaXhlcyB0aGUgcHJvYmxlbSBidXQgb25seSB3aGVuIHRoZSBpbnRlcm5hbCBzZW5kZXJzCisJICBhcmUgbGVzcyB0aGFuIEdTVF9SVENQX01BWF9SQl9DT1VOVC4KKwkgIDIpIEtlZXBpbmcgZm9yIGVhY2ggUlRQU291cmNlIGEgc2V0IG9mIFNTUkNzIHdoaWNoIHN0b3JlcyB3aGljaCBTU1JDJ3MKKwkgIFNSIHRoZSBnaXZlbiBSVFBTb3VyY2UgaGFzIGJlZW4gcmVwb3J0ZWQgaW4sIHdoaWNoIGFsc28gZml4ZXMgdGhlIHByb2JsZW0KKwkgIHdoZW4gdGhlIGludGVybmFsIHNlbmRlcnMgYXJlIG1vcmUgdGhhbiBHU1RfUlRDUF9NQVhfUkJfQ09VTlQuIFRoaXMgaXMKKwkgIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIHRoZSBmYWN0IHRoYXQgYW55IFJUUFNvdXJjZSBpcyBtYXJrZWQgYXMgcmVwb3J0ZWQKKwkgIGluIGl0c2VsZidzIFNSIGFuZCBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIGtub3cgaWYgaXQgaGFzIGJlZW4gcmVwb3J0ZWQKKwkgIGluIG90aGVyIFNScyB0b28gb3Igbm90LCBhbmQgd2hpY2guCisKKzIwMTMtMTEtMTQgMTY6MjM6MzUgKzAyMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHNlc3Npb24uYzoKKwkgIHRlc3RzL2NoZWNrOiBhZGQgYW4gcnRwc2Vzc2lvbiB1bml0IHRlc3QgdG8gdmVyaWZ5IGFsbCBSQnMgYXJlIGluY2x1ZGVkIGluIGFsbCBTUnMsIHJvdW5kcm9iaW4KKwkgIFRoaXMgdGVzdCBjaGVja3MgdGhhdCB3aGVuIHdlIGhhdmUgbXVsdGlwbGUgaW50ZXJuYWwgc2VuZGVyIHNvdXJjZXMKKwkgIGluIHJ0cHNlc3Npb24sIFNScyBjb250YWluIFJCcyBmb3IgZXZlcnkgb3RoZXIgc2VuZGVyIHNvdXJjZSwgYW5kIHRoYXQKKwkgIHRoZXkgYXJlIGluY2x1ZGVkIHJvdW5kcm9iaW4gd2hlbiB0aGV5IGV4Y2VlZCBTVF9SVENQX01BWF9SQl9DT1VOVCwKKwkgIHdoaWNoIGlzIHRoZSBtYXggbnVtYmVyIG9mIFJCcyB0aGF0IGNhbiBmaXQgaW4gYSBTUi4KKworMjAxMy0xMi0xMiAxNjowMToxMCArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGRvY3MvZGVzaWduL2Rlc2lnbi1ydHBjb2xsaXNpb24udHh0OgorCSAgZG9jczogaW1wcm92ZSBkb2NzCisKKzIwMTMtMTEtMDUgMTg6MDM6NDggKzAwMDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL2Rlc2lnbi9NYWtlZmlsZS5hbToKKwkqIGRvY3MvZGVzaWduL2Rlc2lnbi1ydHBjb2xsaXNpb24udHh0OgorCSAgZG9jOiBhZGQgZGVzaWduLXJ0cGNvbGxpc2lvbi50eHQgdGhhdCBleHBsYWlucyB3aGVuIEdzdFJUUENvbGxpc2lvbiBpcyBjcmVhdGVkCisJICBJdCBhbHNvIHRhbGtzIGFib3V0ICJCWUUgb25seSB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UsIG5vdCB0aGUgd2hvbGUgc2Vzc2lvbi4iCisKKzIwMTMtMTEtMDUgMTI6MzE6NTQgKzAwMDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBjb2xsaXNpb24uYzoKKwkgIHRlc3RzL2NoZWNrOiBpbXByb3ZlIHJ0cGNvbGxpc2lvbjo6dGVzdF9tYXN0ZXJfc3NyY19jb2xsaXNpb24gdG8gZW5zdXJlIHRoYXQgYSBjb2xsaXNpb24gZG9lcyBub3QgQllFIHRoZSB3aG9sZSBzZXNzaW9uCisJICBDb25mbGljdHM6CisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBjb2xsaXNpb24uYworCisyMDEzLTExLTAxIDE3OjA3OjU3ICswMDAwICBKdWxpZW4gSXNvcmNlIDxqdWxpZW4uaXNvcmNlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwY29sbGlzaW9uLmM6CisJICB0ZXN0cy9jaGVjazogYWRkIHJ0cGNvbGxpc2lvbjo6dGVzdF9tYXN0ZXJfc3NyY19jb2xsaXNpb24gdW5pdCB0ZXN0CisJICBJdCBjaGVja3MgdGhlIHBheWxvYWRlciBjaGFuZ2VzIGl0cyBzc3JjIHdoZW4gY29sbGlzaW9uIGhhcHBlbnMKKworMjAxMy0xMi0xMiAxMDozODo0MyArMDEwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjoga2VlcCBleHRyYSBzdGF0cyBmb3Igc2NoZWR1bGluZyBCWUUKKwkgIEtlZXAgYW4gZXh0cmEgc3RhdHMgc3RydWN0dXJlIGZvciBzY2hlZHVsaW5nIHRoZSBCWUUgcGFja2V0cy4gV2hlbiB3ZQorCSAgZGVjaWRlIHRvIHNjaGVkdWxlIEJZRSwgbWFrZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgc3RhdHMgaW50byB0aGUKKwkgIGJ5ZV9zdGF0cy4gVGhlbiB3aGlsZSB3ZSBzY2hlZHVsZSB0aGUgQllFLCB1cGRhdGUgYW5kIHVzZSBvbmx5IHRoZQorCSAgYnllX3N0YXRzLiBXaGVuIHdlIGZpbmlzaGVkIHNjaGVkdWxpbmcgdGhlIEJZRSBwYWNrZXQsIHdlIHVzZSB0aGUKKwkgIHJlZ3VsYXIgc3RhdHMgYWdhaW4uCisKKzIwMTMtMTItMTIgMTA6MzQ6MzggKzAxMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IHdoZW4gd2Ugc2NoZWR1bGUgQllFLCBvbmx5IGRlYWwgd2l0aCBCWUUgc291cmNlcworCSAgV2hlbiB3ZSBhcmUgZG9pbmcgdGhlIFJUQ1AgdGltZW91dCB0byBzY2hlZHVsZSBCWUUgcGFja2V0cywgZG9uJ3QKKwkgIGdlbmVyYXRlIFJUQ1AgZm9yIGFsbCBzb3VyY2VzIGJ1dCBvbmx5IGZvciB0aGUgc291cmNlcyBtYXJrZWQgYXMgQllFLgorCisyMDEzLTEyLTEyIDEwOjMyOjQ4ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiByZXNldCBzdGF0ZSBhZnRlciBzY2hlZHVsaW5nIEJZRQorCSAgQWZ0ZXIgd2UgZG8gUlRDUCwgd2UgYXJlIG5vdCBzY2hlZHVsaW5nIGJ5ZSBhbnltb3JlLgorCisyMDEzLTEyLTEyIDEwOjMxOjM4ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBhbHNvIGNvdW50IE5BQ0tTIHdoZW4gbm8gc2lnbmFsIHdhcyBwZW5kaW5nCisKKzIwMTMtMTItMTIgMTA6MDk6MjUgKzAxMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHNlc3Npb246IGlnbm9yZSBSVENQIHBhY2tldHMgZm9yIHRoZSBCWUUgc291cmNlcworCSAgV2hlbiB3ZSBhcmUgc2NoZWR1bGluZyBCWUUgcGFja2V0cywgaWdub3JlIGFsbCBSVENQIGZvciB0aGUgc291cmNlcyB0aGF0CisJICBhcmUgc2NoZWR1bGluZyBhIEJZRSBwYWNrZXQuIE90aGVyIHNvdXJjZXMgdGhhdCBhcmUgbm90IHNjaGVkdWxpbmcgQllFCisJICBzaG91bGQgY29udGludWUgcmVjZWl2aW5nIFJUQ1AgcGFja2V0cyBhcyB1c3VhbC4KKworMjAxMy0xMS0wNCAxMTo0ODoyMSArMDAwMCAgSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIHJ0cHNlc3Npb246IGRldGVybWluZSBpZiB0aGUgc2Vzc2lvbiBpcyBkb2luZyBwb2ludC10by1wb2ludAorCSAgSW4gdGhpcyBjYXNlIFRfZGl0aGVyX21heCBpcyBzZXQgdG8gMCBhY2NvcmRpbmcgdG8gUkZDIDQ1ODUKKworMjAxMy0xMi0xMCAxMTo1NzozNyArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHNlcmlhbGl6ZSBldmVudHMgaW4gdGhlIGJ1ZmZlcgorCSAgU2VyaWFsaXplIGV2ZW50cyBpbnRvIHRoZSBqaXR0ZXJidWZmZXIgYnkgaW5zZXJ0aW5nIHRoZW0gd2l0aCBhIC0xCisJICBzZXFudW0uCisJICBVcGRhdGUgdW5pdCB0ZXN0IHRvIGV4cGVjdCBldmVudHMgZnJvbSB0aGUgc3RyZWFtaW5nIHRocmVhZC4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTI5ODYKKworMjAxMy0xMi0xMCAxMTowNDowNiArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBkZXRlY3QgLTEgc2VxbnVtCisJICBLZWVwIHRoZSBzZXFudW0gYXMgYSBmdWxsIGd1aW50IHNvIHRoYXQgd2UgY2FuIGNoZWNrIGZvciAtMSBlbnRyaWVzIGFuZAorCSAgZGVhbCB3aXRoIHRoZW0gY29ycmVjdGx5LgorCSAgSW1tZWRpYXRlbHkgdHJ5IHRvIHB1c2ggLTEgc2VxbnVtLgorCisyMDEzLTEyLTEwIDExOjAxOjAzICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHJlb3JnYW5pemUgaml0dGVyYnVmZmVyIGl0ZW1zCisJICBLZWVwIHRoZSBvbGRlc3QgaXRlbSBhdCB0aGUgaGVhZCBhbmQgdGhlIG5ld2VzdCBpdGVtcyBvbiB0aGUgdGFpbC4gVGhpcworCSAgbWFrZXMgaXQgZWFzaWVyIHRvIGRlYWwgd2l0aCAtMSBzZXFudW1zLgorCisyMDEzLTEyLTA5IDIzOjM0OjEwICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaDoKKwkgIGppdHRlcmJ1ZmZlcjogY29ycmVjdGx5IGNoZWNrIGZvciBpbnZhbGlkIHZhbHVlcworCSAgQ2hlY2sgZm9yIC0xIG9uIHRoZSBndWludCBmcm9tIHRoZSBidWZmZXIgaXRlbSBpbnN0ZWFkIG9mIG9uIHRoZSBndWludDE2CisJICBvciBndWludDMyLgorCSAgQWxzbyBpbnNlcnQgLTEgc2VxbnVtIGF0IHRoZSBoZWFkIG9mIHRoZSBqaXR0ZXJidWZmZXIuCisKKzIwMTMtMTItMDggMTY6NDk6NTUgKzAxMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cubToKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogZml4IHNlZ2ZhdWx0IHdoZW4gZGVhbGluZyB3aXRoIHBhZGRlZCBmcmFtZXMKKwkgIEZpeGVzIGNyYXNoZXMgd2l0aCB2dGRlYyAhIG9zeHZpZGVvc2luayB3aGVyZSBWaWRlb1Rvb2xib3ggb3V0cHV0cyBwYWRkZWQgVVlWWQorCisyMDEzLTEyLTA1IDEyOjE1OjI5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOgorCSAgbXVsYXdkZWM6IFJlcXVpcmUgY2FwcyB0byBiZSBzZXQgYmVmb3JlIGFjY2VwdGluZyBhbnkgZGF0YQorCisyMDEzLTEyLTA1IDEyOjE1OjE5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6CisJICB3YXZwYWNrZGVjOiBSZXF1aXJlIGNhcHMgdG8gYmUgc2V0IGJlZm9yZSBhY2NlcHRpbmcgYW55IGRhdGEKKworMjAxMy0xMi0wNSAxMjoxMzozMyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJICBzcGVleGRlYzogUmVxdWlyZSBjYXBzIHRvIGJlIHNldCBiZWZvcmUgYWNjZXB0aW5nIGFueSBkYXRhCisKKzIwMTMtMTItMDUgMTI6MTM6MTAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGZsYWNkZWM6IFJlcXVpcmUgY2FwcyB0byBiZSBzZXQgYmVmb3JlIGFjY2VwdGluZyBhbnkgZGF0YQorCisyMDEzLTEyLTA1IDExOjQyOjE1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZweC9nc3R2cDlkZWMuYzoKKwkgIHZweDogVXNlIG5ldyBnc3RfdmlkZW9fZGVjb2Rlcl9zZXRfbmVlZHNfZm9ybWF0KCkgQVBJCisKKzIwMTMtMTItMDQgMTY6MjM6NDMgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogRnJlZSBkZXZpY2VfaW5mbyBpbiBhY2NlcHRzIGNhcHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTk4MTEKKworMjAxMy0xMi0wNCAyMTo1Nzo0OCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkgIHJ0cHRoZW9yYXBheTogRG9uJ3Qgc2VuZCBoZWFkZXJzIHR3aWNlIGlmIHdlIGdvdCB0aGVtIGZyb20gdGhlIGNhcHMgYWxyZWFkeQorCisyMDEzLTEyLTA0IDIxOjU3OjA0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgcnRwdGhlb3JhcGF5OiBEb24ndCBsZWFrIGNvbmZpZyBkYXRhIHdoZW4gcmVjZWl2aW5nIGEgc2Vjb25kIENBUFMgZXZlbnQKKworMjAxMy0xMi0wNCAyMTo1NTo1MyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkgIHJ0cHZvcmJpc3BheTogRG9uJ3Qgc2VuZCBoZWFkZXJzIHR3aWNlIGlmIHdlIGdvdCB0aGVtIGZyb20gdGhlIGNhcHMgYWxyZWFkeQorCisyMDEzLTEyLTA0IDIxOjU0OjE2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSAgcnRwdm9yYmlzcGF5OiBEb24ndCBsZWFrIGNvbmZpZyBkYXRhIHdoZW4gcmVjZWl2aW5nIGEgc2Vjb25kIENBUFMgZXZlbnQKKworMjAxMy0xMi0wNCAyMToxNzowMyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN0cmVhbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN0cmVhbWRlcGF5Lmg6CisJICBydHBzdHJlYW1kZXBheTogQWRkIFJGQzQ1NzEgUlRQIHN0cmVhbSBkZXBheWxvYWRpbmcgZWxlbWVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxOTgyOQorCisyMDEzLTEyLTA0IDEwOjEyOjQ2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3RyZWFtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN0cmVhbXBheS5oOgorCSAgcnRwc3RyZWFtcGF5OiBBZGQgUkZDNDU3MSBSVFAgc3RyZWFtIHBheWxvYWRpbmcgZWxlbWVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxOTgyOQorCisyMDEzLTEyLTAzIDE1OjA4OjI1IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IGltcHJvdmUgZnJhZ21lbnQtc3RhcnQgdHJhY2tpbmcKKwkgIFNvbWUgYnVmZmVycyBjYW4gaGF2ZSBtdWx0aXBsZSBtb292IGF0b21zIGluc2lkZSBhbmQgdGhlIHN0cmF0ZWd5CisJICBvZiB1c2luZyB0aGUgZ3N0X2FkYXB0ZXJfcHJldl9wdHMgdGltZXN0YW1wIHRvIGdldCB0aGUgYmFzZSB0aW1lc3RhbXAKKwkgIGZvciB0aGUgbWVkaWEgb2YgdGhlIGZyYWdtZW50IHdvdWxkIGZhaWwgYXMgaXQgd291bGQgcmV1c2UgdGhlIHNhbWUKKwkgIGJhc2UgdGltZXN0YW1wIGZvciBhbGwgbW9vZnMgaW4gdGhlIGJ1ZmZlciBpbnN0ZWFkIG9mIGFjY3VtdWxhdGluZworCSAgdGhlIGR1cmF0aW9ucyBmb3IgYWxsIG9mIHRoZW0uCisJICBIZXJlcyBhIGJldHRlciBleHBsYW5hdGlvbiBvZiB0aGUgaXNzdWU6CisJICBxdGRlbXV4IHJlY2VpdmVzIGEgYnVmZmVyIHdoZXJlIFBUUyhidWYpID0gWAorCSAgYnVmIC0+IG1vb2ZBIHwgbW9vZkIgfCBtb29mQworCSAgVGhlIHByb2JsZW0gd2FzIHRoYXQgUFRTKGJ1Zikgd2FzIHVzZWQgYXMgdGhlIGJhc2UgdGltZXN0YW1wIGZvcgorCSAgYWxsIDMgbW9vZnMsIGNhdXNpbmcgYWxsIGJ1ZmZlcnMgdG8gYmUgWCBiYXNlZC4gSW4gdGhpcyBjYXNlIHdlIHdhbnQKKwkgIG9ubHkgbW9vZkEgdG8gYmUgWCBiYXNlZCBhcyBpdCBpcyB3aGF0IHRoZSBQVFMgb24gYnVmIG1lYW5zLCBhbmQgdGhlCisJICBvdGhlciBtb29mQiBhbmQgbW9vZkMganVzdCB1c2UgdGhlIGFjY3VtdWxhdGVkIHRpbWVzdGFtcCBmcm9tIHRoZQorCSAgcHJldmlvdXMgbW9vZnMgZHVyYXRpb25zLgorCSAgVG8gc29sdmUgdGhpcywgdGhpcyBwYXRjaCB1c2VzIGdzdF9hZGFwdGVyX3ByZXZfcHRzIGRpc3RhbmNlCisJICByZXN1bHQsIHRoaXMgYWxsb3dzIHF0ZGVtdXggdG8gY2FsY3VsYXRlIGlmIGl0IHNob3VsZCB1c2UgdGhlCisJICByZXN1bHRpbmcgcHRzIG9yIGp1c3QgYWNjdW11bGF0ZSB0aGUgc2FtcGxlcyBhcyBpdCBjYW4gaWRlbnRpZnkKKwkgIGlmIHRoZSBtb29mcyBiZWxvbmcgdG8gdGhlIHNhbWUgdXBzdHJlYW0gYnVmZmVyIG9yIG5vdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTk3ODMKKworMjAxMy0xMS0yMSAxMjoyOToyOCArMDAwMCAgSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogYWRkIHN1cHBvcnQgZm9yIG11bHRpLXBsYW5hciBWNGwyIEFQSSBpbiBETUFCVUYgbW9kZQorCSAgRml4ZXMgYnVnIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTI3NTQKKworMjAxMy0xMS0xOSAxNzoxNjoyNyArMDAwMCAgSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSAgdjRsMjogcmVmYWN0b3IgYnkgZW11bGF0aW5nIG9uZSB2NGwyX3BsYW5lIGluIG5vbi1NUExBTkUgbW9kZQorCSAgc28gdGhhdCB0aGUgYnVmZmVyIGluZm9ybWF0aW9ucyBjYW4gYmUgcmV0cmlldmVkIHRoZSBzYW1lIHdheQorCSAgaW4gYm90aCBNUExBTkUgYW5kIG5vbi1NUExBTkUgbW9kZS4KKwkgIEhlcmUgImVtdWxhdGluZyIgbWVhbnMgIm1hbnVhbGx5IGZpbGwgaW4gdGhlIHBsYW5lIi4KKwkgIEZpeGVzIGJ1ZyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzEyNzU0CisKKzIwMTMtMTEtMTMgMTI6MDU6NDAgKzAwMDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDI6IGFkZCBzdXBwb3J0IGZvciBtdWx0aS1wbGFuYXIgVjRMMiBBUEkKKwkgIFRoaXMgYXBpIGlzIGluIGxpbnV4IGtlcm5lbCBzaW5jZSB2ZXJzaW9uIDIuNi4zOSwKKwkgIGFuZCBwcmVzZW50IGluIGFsbCB2ZXJzaW9uIDMuCisJICBUaGUgY29tbWl0IHRoYXQgYWRkcyB0aGUgQVBJIGluIG1hc3RlciBicmFuY2ggb2YgdGhlCisJICBsaW51eCBrZXJuZWwgc291cmNlIGlzOgorCSAgaHR0cHM6Ly9naXRodWIuY29tL3RvcnZhbGRzL2xpbnV4L2NvbW1pdC9mOGYzOTE0Y2Y5MjJmNWY5ZTFkNjBlOWUxMGY2ZmI5Mjc0MjkwN2FkCisJICB2NGwyIGRvYzogIlNvbWUgZGV2aWNlcyByZXF1aXJlIGRhdGEgZm9yIGVhY2ggaW5wdXQKKwkgIG9yIG91dHB1dCB2aWRlbyBmcmFtZSB0byBiZSBwbGFjZWQgaW4gZGlzY29udGlndW91cworCSAgbWVtb3J5IGJ1ZmZlcnMiCisJICBUaGVyZSBhcmUgbmV3ZXIgc3RydWN0dXJlcyAnc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUnCisJICBhbmQgJ3N0cnVjdCB2NGwyX3BsYW5lJy4KKwkgIFNvIHRoZSBwaXhlbCBmb3JtYXQgaXMgbm90IHNldHVwIHdpdGggdGhlIHNhbWUgQVBJIHdoZW4gdXNpbmcKKwkgIG11bHRpLXBsYW5hci4KKwkgIEFsc28gZm9yIGdzdC12NGwyLCBvbmUgb2YgdGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBpbiBHc3RWNGwyTWV0YQorCSAgdGhlcmUgYXJlIG5vdyBvbmUgbWVtIHBvaW50ZXIgZm9yIGVhY2ggbWFwZWQgcGxhbmUuCisJICBXaGVuIG5vdCB1c2luZyBtdWx0aS1wbGFuYXIsIHRoaXMgY29tbWl0IHRha2VzIGNhcmUgb2Yga2VlcGluZworCSAgdGhlIHNhbWUgY29kZSBwYXRoIHRoYW4gcHJldmlvdXNseS4gU28gdGhhdCB0aGUgMiBjYXNlcyBhcmUKKwkgIGluIHR3byBkaWZmZXJlbnQgYmxvY2tzIHRyaWdnZXJlZCBmcm9tIFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUi4KKwkgIEZpeGVzIGJ1ZyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzEyNzU0CisKKzIwMTMtMTItMDQgMDk6MTI6MDcgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2VyczogZG9uJ3QgbGVhayB0ZW1wbGF0ZSBjYXBzCisKKzIwMTMtMTItMDMgMjE6NDE6MjggKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3R3YXZwYWNrcGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FhY3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IHVzZSBBQ0NFUFRfSU5URVJTRUNUIGZsYWcKKwkgIFRoZSBwYXJzZXIgY2FuIGFjY2VwdCBpbnB1dCB0aGF0IGlzIG5vdCBjb21wbGV0ZWx5IHNwZWNpZmllZC4gVXNlIHRoZQorCSAgQUNDRVBUX0lOVEVSU0VDVCBmbGFnIG9uIHRoZSBzaW5rcGFkIHRvIHR3ZWFrIHRoZSBhY2NlcHRjYXBzIGZ1bmN0aW9uIHRvCisJICBjaGVjayBmb3IgaW50ZXJzZWN0aW9uIG9ubHkuIFRoaXMgYWxsb3dzIHVzIHRvIHByb3h5IGRvd25zdHJlYW0KKwkgIGNvbnN0cmFpbnRzIHdoaWxlIHN0aWxsIGFsbG93aW5nIG5vbi1zdWJzZXQgY2FwcyBhcyBpbnB1dC4KKwkgIFdlIGNhbiB0aGVuIGFsc28gcmVtb3ZlIHRoZSBhcHBlbmRlZCB0ZW1wbGF0ZSBjYXBzIHdvcmthcm91bmQuCisJICBNYWtlIGEgdW5pdC10ZXN0IHRvIGNoZWNrIHRoZSBuZXcgZmVhdHVyZS4KKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgMjYwNDBlZTM4Y2I5ZTdjNDJmM2Q5YTAyODJiM2U1Y2FjZTdjYTQyZAorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNTAyNAorCisyMDEzLTEyLTAzIDIxOjM2OjU0ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0c2JjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IHJlbW92ZSBmaWVsZHMgZnJvbSBmaWx0ZXIKKwkgIFdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBmaWVsZHMgZnJvbSB0aGUgZmlsdGVyIHdoZW4gd2UgY2FuIGNvbnZlcnQKKwkgIGJldHdlZW4gdGhlbS4KKworMjAxMy0xMi0wMyAyMToyOToxMyArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHNiY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgYXVkaW9wYXJzZXJzOiByZWZhY3RvciBjb2RlIHRvIHJlbW92ZSBjYXBzIGZpZWxkcworCisyMDEzLTEyLTAyIDAwOjEwOjQzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBtaWNyb29wdGltaXNhdGlvbjogYXZvaWQgc29tZSB1bm5lY2Vzc2FyeSBHVmFsdWUgY29waWVzCisKKzIwMTMtMTItMDEgMjM6MzI6MjAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IGZpeCBvZmYtYnktb25lIGNyYXNoIHdoZW4gZG93bnN0cmVhbSBjYXBzIGNvbnRhaW4gYSBsaXN0IG9mIGZyYW1lcmF0ZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTk1NDQKKworMjAxMy0xMS0yOSAxMToyNjowNSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogVXNlIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vb2YgYXMgdGhlIGJhc2UgZnJhZ21lbnQgc3RhcnQKKwkgIEluIFNtb290aFN0cmVhbWluZyBmcmFnbWVudGVkIHNjZW5hcmlvLCB0aGUgdGltZXN0YW1wcyBhcmUgY2FsY3VsYXRlZAorCSAgc3RhcnRpbmcgZnJvbSB0aGUgZnJhZ21lbnQgYnVmZmVyIHRpbWVzdGFtcC4gV2hlbiB0aGVyZSBpcyBhIG5vdC1saW5rZWQKKwkgIHJldHVybiBmcm9tIGRvd25zdHJlYW0sIHF0ZGVtdXggd2lsbCByZXR1cm4gdXBzdHJlYW0gYW5kIHdpbGwga2VlcCB0aGUKKwkgIG5vbi1wdXNoZWQgZGF0YSBpbnRvIGl0cyBhZGFwdGVyLgorCSAgT24gYSBuZXcgZnJhZ21lbnQgYnVmZmVyIHB1c2hlZCB0byBxdGRlbXV4LCB0aGUgbmV3IGJ1ZmZlciB0aW1lc3RhbXAKKwkgIHdvdWxkIG92ZXJ3cml0ZSB0aGUgcHJldmlvdXMgb25lIHRoYXQgc2hvdWxkIGJlIHVzZWQgb24gdGhlIHN0aWxsCisJICB0byBiZSBwdXNoZWQgYnVmZmVycy4gQmVjYXVzZSBvZiB0aGlzLCB0aGlzIHBhdGNoIHdpbGwgYWxzbworCSAgdXBkYXRlIHRoZSBmcmFnbWVudF9zdGFydCB0aW1lc3RhbXAgZnJvbSB0aGUgYWRhcHRlciBsYXN0IHB0cworCSAgdG8gbWFrZSBzdXJlIHRoZSBtb29mIGFuZCB0aW1lc3RhbXBzIGFyZSBpbiBzeW5jIGFuZCB3aWxsIHJlc3VsdAorCSAgaW4gY29ycmVjdCB0aW1lc3RhbXBzIGZvciBhbGwgZnJhZ21lbnRzLgorCisyMDEzLTExLTE1IDA4OjU0OjA3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IGF2b2lkIHJlLXJlYWRpbmcgdGhlIHNhbWUgbW9vdiBhbmQgZW50ZXJpbmcgaW50byBsb29wCisJICBJbiB0aGUgc2NlbmFyaW8gb2YgIm1kYXQgfCBtb292ICh3aXRoIGZyYWdtZW50ZWQgYXJ0aWZhY3RzKSIgcXRkZW11eAorCSAgY291bGQgcmVhZCB0aGUgbW9vdiBhZ2FpbiBhZnRlciB0aGUgbWRhdCBiZWNhdXNlIGl0IHdhcyBjb25zaWRlcmluZyB0aGUKKwkgIG1lZGlhIGFzIGEgZnJhZ21lbnRlZCBvbmUuCisJICBUbyBhdm9pZCB0aGlzIGxvb3AgdGhpcyBwYXRjaCBtYWtlcyBpdCBzdG9yZQorCSAgdGhlIGxhc3QgcHJvY2Vzc2VkIG1vb3Zfb2Zmc2V0IHRvIGF2b2lkIHBhcnNpbmcgaXQgYWdhaW4uCisJICBBbmQgaXQgYWxzbyBjaGVja3MgaWYgdGhlcmUgYXJlIGFueSBzYW1wbGVzIHRvIHBsYXkgYmVmb3JlCisJICByZXN0dXJuaW5nIHRvIHRoZSBtZGF0LCBzbyB0aGF0IGl0IGtub3dzIHRoZXJlIGlzIG5ldyBkYXRhIHRvIGJlIHBsYXllZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTE1NzAKKworMjAxMy0xMS0xNSAwMDo1Mjo1MyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZG8gbm90IGZyZWUgc3RyZWFtcyBpZiB0aGV5IHdlcmUgbm90IGNyZWF0ZWQgbG9jYWxseQorCSAgV2hlbiBwYXJzaW5nIGEgdHJhayBvbmx5IGZyZWUgc3RyZWFtcyBvbiBmYWlsdXJlcyBpZiB0aG9zZSBzdHJlYW1zCisJICB3ZXJlIGNyZWF0ZWQgbG9jYWxseS4gVGhleSBjb3VsZCBoYXZlIGJlZW4gY3JlYXRlZCBmcm9tIGEgcHJldmlvdXMKKwkgIGZyYWdtZW50LCBpbiB0aGlzIGNhc2Ugd2UgdGhleSBoYXZlIHZhbGlkIGluZm8gZnJvbSB0aGUgb3RoZXIgZnJhZ21lbnQuCisJICBJbmNsdWRpbmcgcGFkcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTE1NzAKKworMjAxMy0xMS0yOSAxOTo1Nzo0NiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkgIHZpZGVvbWl4ZXI6IFNpbXBsaWZ5IE5WMTIvMjEgYmxlbmRpbmcgY29kZSBtYWNyb3MKKworMjAxMy0xMS0yOSAxOTo1MDoyNCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkgIHZpZGVvbWl4ZXI6IEZpeCBzZWdmYXVsdCB3aGVuIGZpbGxpbmcgdGhlIGJhY2tncm91bmQgb2YgYSBVWVZZIGZyYW1lCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzEyNDAxCisKKzIwMTMtMTEtMjkgMDk6MjE6NTIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IGNvbXBpbGF0aW9uIHdpdGggZ3N0IGRlYnVnaW5nIGRpc2FibGVkCisJICBxdGRlbXV4LmM6OTQ1MjoxOiBlcnJvcjogbGFiZWwgYXQgZW5kIG9mIGNvbXBvdW5kIHN0YXRlbWVudAorCisyMDEzLTExLTI3IDE3OjAyOjAwICswMTAwICBKb25hcyBIb2xtYmVyZyA8am9uYXNoZ0BheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHBoMjY0cGF5OiBNYXAgaW5idWZmZXIgb25jZSBvbmx5CisJICBEbyBub3QgY2FsbCBnc3RfYnVmZmVyX2V4dHJhY3QoKSB0d2ljZSBzaW5jZSBlYWNoIGNhbGwgd2lsbCBtYXAgYW5kCisJICB1bm1hcCB0aGUgYmlmZmVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxOTQzNAorCisyMDEzLTExLTI4IDExOjU4OjQyIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvZmlsdGVyLmM6CisJICB2aWRlb2ZsaXA6IEFkZCB1bml0IHRlc3QgZm9yIHRoZSAnYXV0b21hdGljJyBtZXRob2QKKwkgIFRoZXNlIG5ldyB0ZXN0cyBzZW5kIGEgdGFnIGV2ZW50IGJlZm9yZSBzZWRpbmcgdGhlIGJ1ZmZlci4gVGVzdGVkIGNhc2UgYXJlIGFuCisJICBlbXB0eSB0YWcgbGlzdCwgYSB0YWcgbGlzdCB3aXRoIG9yaWVudGF0aW9uLTE4MCBzZXQgYW5kIGFuIGludmFsaWQgb3JpZW50YXRpb24gdmFsdWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzE5NDk3CisKKzIwMTMtMTEtMjggMTY6MDk6MDQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkgIHZpZGVvZmxpcDogZG9uJ3QgY3Jhc2ggb24gdGFnIGV2ZW50cyB3aXRob3V0IG9yaWVudGF0aW9uIHRhZworCSAgV291bGQgY3Jhc2ggaW4gZ19mcmVlKCkgdHJ5aW5nIHRvIGZyZWUgYW4gdW5pbml0aWFsaXNlZCBwb2ludGVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxOTQ5NworCisyMDEzLTExLTI4IDE2OjUwOjQyICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogZG9uJ3QgdW5yZWYgYnVmZmVyIHR3aWNlCisJICBDbGVhbmluZyB0aGUgcGFja2V0IGluZm8gd2lsbCBhbHJlYWR5IHVucmVmIHRoZSBidWZmZXIuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzE1MDc4CisKKzIwMTMtMTEtMjggMjI6MzU6MDIgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEFkZCBIeWRyb2dlbkF1ZGlvIFJlcGxheUdhaW4gdGFncworCSAgSWRlbnRpY2FsIHRvIHRoZSBpdHVuZXMgKHRtKSB2ZXJzaW9uLCBidXQgbGFiZWxsZWQgd2l0aAorCSAgb3JnLmh5ZHJvZ2VuYXVkaW8ucmVwbGF5Z2FpbiBhcyB0aGUgcHJvZHVjZXIuCisKKzIwMTMtMTEtMjcgMTY6MTU6MTIgKzAxMDAgIE1hdGhpZXUgRHVwb25jaGVsbGUgPG1kdXBvbmNoZWxsZTFAZ21haWwuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogZXhwbGljaXRseSBmYWlsIHdoZW4gYWxwaGEgaW5mb3JtYXRpb24gd291bGQgaGF2ZSBiZWVuIGxvc3QuCisKKzIwMTMtMDUtMjkgMTY6MDY6MDUgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiAuZ2l0aWdub3JlOgorCSAgZ2l0aWdub3JlOiBVcGRhdGVkIHRvIGlnbm9yZSAqLnN3cCBhbmQgLmRpcnN0YW1wCisKKzIwMTMtMTEtMjYgMTE6MTc6NDIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2EtZGVtdXg6IEFsbG93IGEgYml0IG1vcmUgdmFyaWF0aW9uIHdoZW4gZGV0ZWN0aW5nIGNvbW1vbiBmcmFtZXJhdGVzCisJICBJbnN0ZWFkIG9mICsvLSAxbnMgd2UgYWxsb3cgMm5zIG5vdy4gRHVlIHRvIHJvdW5kaW5nIGVycm9ycyB0aGVyZSBhcmUKKwkgIHNvbWUgTWF0cm9za2EgZmlsZXMgb3V0IHRoZXJlIHdpdGggMzMuMzMzMzMxbXMgcGVyIGZyYW1lIGZvciAzMGZwcy4KKworMjAxMy0xMS0yNiAxMDoyMDozMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYS1kZW11eDogVXNlIGdzdF91dGlsX2RvdWJsZV90b19mcmFjdGlvbigpIGluc3RlYWQgb2YgR1ZhbHVlIG1hZ2ljCisKKzIwMTMtMTEtMjUgMTQ6MDM6MjEgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSAgdmlkZW9mbGlwOiBTZXQgZGVmYXVsdCBtZXRob2QgYXQgY29udHJ1Y3Rpb24KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTIzMzMKKworMjAxMy0wNS0yOSAxNTo1NzowOSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IFVzZSBzcGFjZSBpbnN0ZWFkIG9mIHRhYnMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTI3NTQKKworMjAxMy0wNS0yOSAxNTo0NDozMSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIHY0bDJvYmplY3Q6IEZpeCBoZWFkZXIgaW5kZW50YXRpb24gc28gaXQncyByZWFkYWJsZSBhZ2FpbgorCSAgSXQncyB1bmZvcnR1bmF0ZSB0byBoYXZlIHRvIGRvIHRoaXMsIGJ1dCB3aXRoIHRoZSBtaXggb2YgdGFicyBhbmQgc3BhY2UsIHBsdXMgYWxsIHRoZSByYW5kb20KKwkgIGluZGVudGF0aW9uIHRoaXMgaGVhZGVyIGhhcyBiZWNvbWUgdmVyeSBoYXJkIHRvIHJlYWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzEyNzU0CisKKzIwMTMtMTEtMjUgMTc6Mzg6MDYgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGNoZWNrOiBmaXggaml0dGVyYnVmZmVyIGNoZWNrCisJICBEb24ndCBhZHZhbmNlIHRoZSBjbG9jayB0byAyNDBtcyB0b28gZWFybHkuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzEwMDEzCisKKzIwMTMtMTEtMjUgMTE6NDU6MzMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBkZXByZWNhdGUgbWF4LWVycm9ycworCSAgVGhlIHByb3BlcnR5IHdhc24ndCB1c2UgaW50ZXJuYWxseSwgbGV0IHRoZSBiYXNlIGNsYXNzIGhhbmRsZSB0aGUKKwkgIG51bWJlciBvZiBlcnJvcnMgdG8gdG9sZXJhdGUuCisKKzIwMTMtMTEtMjUgMTU6NDk6MDcgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBpbXByb3ZlIGNsZWFyLXB0LW1hcCBoYW5kbGluZworCSAgRG9uJ3QgcmVzZXQgdGhlIGV4cGVjdGVkIG91dHB1dCBzZXFudW0gd2hlbiBjbGVhcmluZyB0aGUgcHQgbWFwIGJlY2F1c2UgdGhpcworCSAgY291bGQgc3RhbGwgdGhlIGppdHRlcmJ1ZmZlciBmb3JldmVyLgorCSAgQWRkIGEgdW5pdCB0ZXN0IGZvciB0aGlzLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwOTgwMAorCisyMDEzLTEwLTI4IDIxOjMzOjIyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogbGV0IHRoZSBiYXNlIGNsYXNzIGRlY2lkZSB3aGVuIHRvIHJldHVybiBhbiBlcnJvcgorCSAgVGhlIGJhc2UgdmlkZW9kZWNvZGVyIGNsYXNzIGhhcyBhbiBlcnJvciBjb3VudGluZyBmZWF0dXJlIHRvIHRvbGVyYXRlCisJICBhIGZldyBlcnJvcnMgYmVmb3JlIHBvc3RpbmcgYW4gZXJyb3IgbWVzc2FnZS4gU28gZG9uJ3QgZm9yY2UgdGhlCisJICBlcnJvciBhbmQgbGV0IHRoZSBiYXNlIGNsYXNzIGRlY2lkZSB3aGVuIGl0IHNob3VsZCBoYXBwZW4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTA3NjIKKworMjAxMy0xMC0yOCAyMToyODozMyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IEFkZCBkYXRhIHNraXBwaW5nIG9uIGlucHV0CisJICBBZGQgbWlzc2luZyBieXRlcyBza2lwcGluZyB3aGVuIGJhZCBpbnB1dCBpcyByZWNlaXZlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTA3NjIKKworMjAxMy0xMS0yNSAxMjoxMzo0MyArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRGlzY2FyZCAyIGJ5dGUgc3VicGljdHVyZSBwYWNrZXRzCisJICBBcyBmb3IgdGV4dCBzdWJ0aXRsZXMgYW5kIGFzIHN1Z2dlc3RlZCBpbiAjNzEyNjQzLCB0aHJvdworCSAgYXdheSB0aGUgMiBieXRlIHRlcm1pbmF0b3IgcGFja2V0cyB0aGF0IHNvbWUgZW5jb2RlcnMgaW5zZXJ0LgorCSAgVGhpcyB3aWxsIG1ha2UgdGhpbmdzIGJldHRlciB3aGVuIHJlbXV4aW5nIGFuZCBjYXVzZXMgZ2VuZXJhdGlvbgorCSAgb2YgZ2FwIGV2ZW50cy4KKworMjAxMy0xMS0yNSAwMDozNDoyMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGZpeCB3YWtlLXVwIHdoZW4gbmV3IGJ1ZmZlcnMgY29tZSBpbiBhZnRlciBydW5uaW5nIGVtcHR5CisJICBTcG90dGVkIGJ5ICdncmF0aWFzJyBvbiBJUkMuIFByb2JhYmx5IGludHJvZHVjZWQgaW4gcmVjZW50IHJlZmFjdG9yaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxNTAzOQorCisyMDEzLTExLTIzIDEyOjE1OjQwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBjb3JyZWN0bHkgaGFuZGxlIG5lZ2F0aXZlIHJlbGF0aXZlIHRpbWVzdGFtcHMKKwkgIC4uLiByYXRoZXIgdGhhbiBzY2FsaW5nIHRoZXNlIGFzIHVuc2lnbmVkLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMjc0NAorCSAgQmFzZWQgb24gcGF0Y2ggYnkgS3J6eXN6dG9mIEtvdGxlbmdhIDxwb2Nla0B1c2Vycy5zZi5uZXQ+CisKKzIwMTMtMDktMTQgMDM6Mjc6MDkgKzAyMDAgIE1hdGhpZXVEdXBvbmNoZWxsZSA8bWF0aGlldS5kdXBvbmNoZWxsZUBlcGl0ZWNoLmV1PgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuaDoKKwkgIHZpZGVvbWl4ZXIyOiBNZXJnZSB0YWcgZXZlbnRzIHRvIHNlbmQgdGhlbSBpbiBjb2xsZWN0ZWQuCisJICBPdGhlcndpc2UgdGhlcmUgd2VyZSByYWNlIGNvbmRpdGlvbnMgd2hlcmUgd2Ugd291bGQgc2VuZCB0YWdzCisJICBvbiBhIGZsdXNoaW5nIHNyY3BhZC4KKwkgIFdlIGhhdmUgYSB0ZXN0IGZvciB0aGF0IGluIEdFUywgYnV0IHRoaXMgc2hvdWxkIGJlIHRlc3RlZAorCSAgc3lzdGVtYXRpY2FsbHkgd2l0aCBoYXJuZXNzIGluIHRoZSBmdXR1cmUgYXMgSSBiZWxpZXZlIGl0CisJICBpcyB1c2VmdWwgZm9yIGV4YWN0bHkgdGhhdCBraW5kIG9mIGNhc2VzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwODE2NQorCisyMDEzLTExLTE0IDE3OjI5OjUwIC0wMzAwICBUaGliYXVsdCBTYXVuaWVyIDx0aGliYXVsdC5zYXVuaWVyQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogVXNlIEdzdFZpZGVvSW5mbyBoZWxwZXIgdG8gY3JlYXRlIGNhcHMgZm9yIHJhdyB2aWRlbworCSAgVGhpcyB3YXkgd2UgZG8gbm90IG1pc3MgbWFuZGF0b3J5IGZpZWxkcyBpbiBjYXBzLgorCSAgQXQgdGhlIHNhbWUgdGltZSB1c2UgdGhlIGdzdF9wYl91dGlsc19nZXRfY29kZWNfZGVzY3JpcHRpb24KKwkgIGhlbHBlciB0byBnZXQgY29kZWMgZGVzY3JpcHRpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzEyMzM1CisKKzIwMTMtMTEtMTQgMTY6MTE6MzggLTAzMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBVc2UgR3N0VmlkZW9JbmZvIGhlbHBlciB0byBjcmVhdGUgY2FwcyBmb3IgcmF3IHZpZGVvCisJICBUaGlzIHdheSB3ZSBkbyBub3QgbWlzcyBtYW5kYXRvcnkgZmllbGRzIGluIGNhcHMuCisJICBBdCB0aGUgc2FtZSB0aW1lIHVzZSB0aGUgZ3N0X3BiX3V0aWxzX2dldF9jb2RlY19kZXNjcmlwdGlvbiBoZWxwZXIgdG8KKwkgIGdldCBjb2RlYyBkZXNjcmlwdGlvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTIzMjgKKworMjAxMy0xMS0xMyAyMDoxODoxNyAtMDMwMCAgVGhpYmF1bHQgU2F1bmllciA8dGhpYmF1bHQuc2F1bmllckBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuaDoKKwkgIG11bHRpZmlsZXNyYzogSW1wbGVtZW50IHNlZWtpbmcgaW4gY2FzZSBvZiBtdWx0aXBsZSBpbWFnZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTIyNTQKKworMjAxMy0xMS0yMiAxMjoyNjoyMSArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBwYXNzIGRvd25zdHJlYW0gZmxvd3JldHVybiB0byB1cHN0cmVhbQorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMjcyMgorCisyMDEzLTExLTE4IDE0OjI3OjQ4ICswMTAwICBNaWNoYWVsIE9sYnJpY2ggPG0ub2xicmljaEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogY2xlYXIgY2FjaGVkIGNhcHMgb24gY2xvc2UKKwkgIEEgZGlmZmVyZW50IGRldmljZSB3aXRoIGRpZmZlcmVudCBjYXBzIG1heSBiZSB1c2VkIGZvciB0aGUgbmV4dCBvcGVuLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMjYxMQorCisyMDEzLTExLTIxIDE1OjMwOjM0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrY29tbW9uLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrc3RyZWFtcmVhZGVyLmM6CisJKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBnX21lbW1vdmUoKSBpcyBkZXByZWNhdGVkCisJICBKdXN0IHVzZSBwbGFpbiBtZW1tb3ZlKCksIGdfbWVtbW92ZSgpIGlzIGRlcHJlY2F0ZWQgaW4KKwkgIHJlY2VudCBHTGliIHZlcnNpb25zLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMjgxMQorCisyMDEzLTExLTIxIDExOjMyOjE1ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkgIHJ0cHZvcmJpc2RlcGF5OiBoYW5kbGUgcGFja2V0cyA+IDB4ZmZmZgorCSAgSGFuZGxlIGlucHV0IHBhY2tldCBzaXplcyBsYXJnZXIgdGhhbiAxNiBiaXRzIGluIHRoZSBkZXBheWxvYWRlci4KKwkgIFJlbW92ZSBzaXplIHJlc3RyaWN0aW9ucyBvbiB0aGUgcGF5bG9hZGVyLgorCisyMDEzLTExLTIxIDExOjMwOjI4ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkgIHJ0cHRoZW9yYWRlcGF5OiBoYW5kbGUgcGFja2V0cyA+IDB4ZmZmZgorCSAgUmVvcmdhbml6ZSBzb21lIHRoaW5ncyBpbiB0aGUgZGVwYXlsb2FkZXIgc28gdGhhdCBpdCBjYW4gaGFuZGxlIHBhY2tldHMgbGFyZ2VyCisJICB0aGFuIDE2IGJpdHMuCisJICBSZW1vdmUgdGhlIHNpemUgcmVzdHJpY3Rpb24gb24gdGhlIHBheWxvYWRlci4KKworMjAxMy0xMS0yMSAwMjoyODoyNyArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X2R1bXAuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF90eXBlcy5jOgorCSAgaXNvbXA0OiBIYW5kbGUgbXA0cyBzdWJwaWN0dXJlIHN0cmVhbXMgYmV0dGVyLgorCSAgQ2xlYW4gdXAgdGhlIGhhbmRsaW5nIG9mIG1wNHMgc3RyZWFtcy4gVXNlIHRoZSBnZW5lcmljIGVzZHMKKwkgIGRlc2NyaXB0b3IgZnVuY3Rpb24gdG8gZXh0cmFjdCB0aGUgcGFsZXR0ZSwgaW5zdGVhZCBvZiBoYXJkIGNvZGluZworCSAgYSB3cm9uZyBtYWdpYyBvZmZzZXQuCisJICBBZGQgc29tZSBtb3JlIHNpemUgc2FmZXR5IGNoZWNrcyB3aGVuIHBhcnNpbmcgRVMgZGVzY3JpcHRvcnMsIGFuZAorCSAgcmVwbGFjZSBtYWdpYyBudW1iZXJzIHdpdGggdGhlIGRlc2NyaXB0aXZlIGNvbnN0YW50cyB0aGF0IGFyZSBhbHJlYWR5CisJICBkZWZpbmVkLgorCSAgRW5oYW5jZSBkdW1wIG91dHB1dCBmb3Igc3RzZCBhdG9tcy4KKwkgIFN0cmVhbXMgZnJvbSBib3RoIGJ1ZyA3MTI2NDMgYW5kIGhpc3RvcmljIGJ1ZyA1NjgyNzggbm93IGJvdGggd29yaworCSAgY29ycmVjdGx5LgorCSAgRml4ZXM6ICM3MTI2NDMKKworMjAxMy0xMS0yMCAyMjowODoyNSArMTEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSAgcXRkZW11eDogU29ydCBmb3VyY2MgZGVjbGFyYXRpb25zIGFuZCByZW1vdmUgZHVwbGljYXRlcworCisyMDEzLTExLTIwIDIxOjQxOjQ3ICsxMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9pc29tcDQvTWFrZWZpbGUuYW06CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9mdHlwY2MuaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXhtYXAuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X2R1bXAuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF90eXBlcy5jOgorCSAgcXRkZW11eDogTWVyZ2UgYWxsIHRoZSBmb3VyY2MgaGVhZGVycyBpbnRvIG9uZQorCSAgUmVtb3ZlIHF0ZGVtdXhfZm91cmNjLmggYW5kIGZ0eXBjYy5oIGFuZCBwdXQgaXQgYWxsIGluIGZvdXJjYy5oCisKKzIwMTMtMTEtMTkgMTA6MTA6NTEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBhdm9pZCBtYXBwaW5nIHRoZSBidWZmZXIKKwkgIFJldXNlIHRoZSBwYXJzZWQgc3RydWN0dXJlIHRvIGdldCB0aGUgdGltZXN0YW1wcy4KKworMjAxMy0xMS0xOCAxNzoxMzo0OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4ICdtYWtlIGNoZWNrJworCSAgRml4IGdlbmVyaWMvc3RhdGVzIGNoZWNrLiBBbHNvLCBnX3JldHVybl9pZl9mYWlsKCkgaXMKKwkgIG5vdCBmb3IgaW50ZXJuYWwgc3RhdGUgY2hlY2tpbmcuCisKKzIwMTMtMTEtMTggMTQ6NDQ6MzYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zm92ZXJsYXkuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZnNpbmsuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkqIGV4dC9yYXcxMzk0L2dzdGhkdjEzOTRzcmMuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NyYy5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc3JjLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdGZpbGVzcmMuYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJKiBzeXMvb3NzNC9vc3M0LXNpbmsuYzoKKwkqIHN5cy9vc3M0L29zczQtc291cmNlLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSAgZG9jczogZ2V0IHJpZCBvZiAnU2luY2U6IDAuMTAueCcgbWFya2VycworCSAgQW5kIHNvbWUgZ3RrLWRvYyBtYXJrdXAgZml4ZXMuCisKKzIwMTMtMTEtMTYgMTI6MTU6MTQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwbWFuYWdlcjogZml4IFNpbmNlIG1hcmtlcnMKKwkgIFNob3VsZCBiZSBuZXh0IHN0YWJsZSByZWxlYXNlIHNlcmllcyB2ZXJzaW9uCisKKzIwMTMtMTEtMTUgMTM6NDg6MDcgKzAyMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IEZpeCBzdGF0cyBwcm9wZXJ0eSBmaWVsZCBuYW1lcyBhbmQgZG9jdW1lbnRhdGlvbgorCisyMDEzLTExLTE1IDE1OjIwOjE0ICswMTAwICBUb3JyaWUgRmlzY2hlciA8dG9ycmllLmZpc2NoZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaDoKKwkgIGdzdHJ0cHNlc3Npb246IEltcGxlbWVudCBhIG51bWJlciBvZiBmZWVkYmFjayBwYWNrZXQgc3RhdGlzdGljcworCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMTY5MworCisyMDEzLTExLTEzIDE3OjExOjA4IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAcGFydG5lci5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiByZW1vdmUgbWF0aCBvcGVyYXRpb24gZnJvbSBsb29wCisJICBUaGUgZWxzdF9vZmZzZXQgZG9lc24ndCBjaGFuZ2UgaW5zaWRlIHRoZSBsb29wLCBzbyBjb21wdXRlIGl0CisJICBvdXRzaWRlCisKKzIwMTMtMTEtMTQgMjA6NTQ6MzIgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRtdXg6IGZpeCBwbGF5YmFjayByZWdyZXNzaW9uCisJICBJbiBhZTExNTBlODVjZjk5ZDc0ODI5MzNhYTZmN2U0ZjAxMmZlNDVhM2VjIGZsaXBwaW5nIGEgY29uZGl0aW9uIG1pc2FsaWduZWQgdGhlCisJICBlbHNlIGJyYW5jaCwgd2hlcmUgZm9yIHRoZXJlIGNvbmRpdGlvbiB0aGF0IHdhcyBjaGFuZ2UgdGhlcmUgaXMgbm9uZS4KKwkgIEZpeGVzICM3MTIzMDMKKworMjAxMy0xMS0xNCAwOToyMDowNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHJlbmFtZSBwcm9wZXJ0eSB0byAnc3RhdHMnCisJICBUaGlzIG1ha2VzIHRoZSB1bml0IHRlc3Qgd29yay4KKwkgIFdlIGNhbiBsYXRlciBhbHNvIGFkZCBtb3JlIHN0YXRzLCBub3Qgc3BlY2lmaWMgdG8gcmV0cmFuc21pc3Npb24uCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzExNDExCisKKzIwMTMtMTEtMTIgMTE6MTk6MjUgLTA1MDAgIFRvcnJpZSBGaXNjaGVyIDx0b3JyaWUuZmlzY2hlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGltcGxlbWVudCBydHggc3RhdGlzdGljcworCisyMDEzLTExLTEzIDEwOjQyOjIxICswMDAwICBNYXJjIExlZW1hbiA8bWFyYy5sZWVtYW5AZ21haWwuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBwcmludCBGT1VSQ0NfRk9STUFUIHdoZW4gZW51bWVyYXRpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTIyMDYKKworMjAxMy0xMS0wNiAxMjo0MDowNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGFkdmFuY2UgZXhwZWN0ZWQgc2VxbnVtIGFmdGVyIGRyb3BwaW5nCisJICBBZnRlciBkcm9wcGluZyBhIGJ1ZmZlciwgbW92ZSBvdXIgZXhwZWN0ZWQgc2VxbnVtCisJICBDb25mbGljdHM6CisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYworCisyMDEzLTExLTA0IDE1OjQ2OjIyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSAgZ3N0cGF5OiBvbmx5IHNlbmQgb25lIGNhcHMKKwkgIE9ubHkgc2VuZCBvbmUgY2FwcyBpbiBhIHBhY2tldC4gVHdvIGNhcHMgY2FuIGhhcHBlbiB3aGVuIHNldGNhcHMgaXMgY2FsbGVkIGFuZAorCSAgdGhlIGNvbmZpZy1pbnRlcnZhbCBleHBpcmVzIGF0IHRoZSBzYW1lIHRpbWUuCisKKzIwMTMtMTEtMTMgMTA6MjM6MTkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IFVzZSB0aGUgc3luY2VkIGJ1ZmZlciBtb2RlIGluIGF1dG8gbW9kZSBpZiBhIGNsb2NrIHByb3ZpZGVyIGlzIGluIHRoZSBTRFAKKworMjAxMy0xMS0wOCAxMTowOToyMSArMDAwMCAgTWFyYyBMZWVtYW4gPG1hcmMubGVlbWFuQGdtYWlsLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGluaXQgdjRsMl9idWZmZXIgdG8gMHgwIGJlZm9yZSBpb2N0bAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMjEzNworCisyMDEzLTExLTExIDE1OjI3OjE4ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiByZW1vdmUgY29sbGlzaW9uIHJlY29uZmlndXJlIGV2ZW50CisJICBSZW1vdmUgYm9ndXMgcmVjb25maWd1cmUgZXZlbnQgb24gY29sbGlzaW9uLCB3ZSBkb24ndCB3YW50IHRvIHNlbmQgdGhlIGV2ZW50IG9uCisJICB0aGUgcmVjZWl2aW5nIFJUUCBwYWQgYW5kIHRoZSBjb2xsaXNpb24gZXZlbnQgaXMgbm93IGhhbmRsaW5nIHRoaXMKKwkgIGNhc2UuCisJICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMTU2MAorCisyMDEzLTExLTAxIDE3OjA0OjI4ICswMDAwICBKdWxpZW4gSXNvcmNlIDxqdWxpZW4uaXNvcmNlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgZ3N0cnRwc2Vzc2lvbjogc2VuZCBjdXN0b20gdXBzdHJlYW0gZXZlbnQgIkdzdFJUUENvbGxpc2lvbiIgb24gc2VuZF9ydHBfc2luayBwYWQKKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzExNTYwCisKKzIwMTMtMTEtMTEgMTQ6MjU6NTEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHNlc3Npb24uYzoKKwkgIGNoZWNrOiBhZGQgcnRwc2Vzc2lvbiB0ZXN0CisJICBBZGQgYSBiYXNpYyBydHBzZXNzaW9uIHRlc3QgdG8gZW5zdXJlIHRoYXQgUlIgYmxvY2tzIGFyZSBnZW5lcmF0ZWQgd2hlbgorCSAgbXVsdGlwbGUgU1NSQyBzZW5kZXJzIGFyZSBhY3RpdmUuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzExMjcwCisKKzIwMTMtMTEtMTEgMTM6MTc6MjUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IGNvcnJlY3RseSBoYW5kbGUgdGltZXN0YW1wcyB3aGVuIHBhcnNpbmcgeC1wcml2YXRlMS1hYzMKKwkgIC4uLiB0aGUgd2F5IGl0IGhhcyBhbHdheXMgd29ya2VkIGZpbmUgaW4gYTUyZGVjLgorCisyMDEzLTExLTA1IDEwOjQ4OjMzICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogZml4IGNyYXNoIHdoZW4gZG8tcmV0cmFuc21pc3Npb249dHJ1ZSBhbmQgYSBsb3Qgb2YgYnVmZmVycyBhcmUgbG9zdAorCSAgVGhlIHByb2JsZW0gaGVyZSB3YXMgdGhhdCB0aGUgaml0dGVyYnVmZmVyIGxvY2sgd2FzIHVubG9ja2VkIHRvIHB1c2gKKwkgIHRoZSBldmVudCwgYnV0IHRoYXQgY2F1c2VkIGFub3RoZXIgdGhyZWFkIHRvIHJlbW92ZSB0aGUgdGltZXIgY3VycmVudGx5CisJICBiZWluZyBwcm9jZXNzZWQsIHByb2JhYmx5IGJlY2F1c2UgdGhlIGFtb3VudCBvZiBydHggZXZlbnRzCisJICAoYW5kIHRoZXJlZm9yZSB0aW1lcnMpIHdhcyBnZXR0aW5nIHRvbyBoaWdoLiBUaGUgc29sdXRpb24gaXMgdG8KKwkgIHVubG9jayBhbmQgcHVzaCB0aGUgZXZlbnQgb25seSBhZnRlciB0aW1lciBwcm9jZXNzaW5nIGhhcyBmaW5pc2hlZC4KKwkgIGZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTExMzEKKworMjAxMy0xMC0yNCAxMzoxNjo0MiArMDIwMCAgUGVyIHggSm9oYW5zc29uIDxwZXJ4am9oQGF4aXMuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IEF2b2lkIGRpdmlzaW9uIGJ5IHplcm8gYXNzZXJ0IGluIGdzdF9tYXRyb3NrYV9kZW11eF9zZWFyY2hfcG9zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzExODI5CisKKzIwMTMtMTEtMDggMTc6NTk6MjQgKzAxMDAgIFBoaWxpcHBlIE5vcm1hbmQgPHBoaWxuQGlnYWxpYS5jb20+CisKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6CisJICB3YXZlbmM6IGdlbmVyYXRlIGEgbm9uLWVtcHR5IGRhdGEgaGVhZGVyCisJICBSZXN0b3JlIHRoZSBiZWhhdmlvciBvZiB0aGUgZWxlbWVudCB0byB0aGUgc3RhdGUgYmVmb3JlIGNvbW1pdAorCSAgZGIyOTUyMmE0MzBlNDQ0NTA0MTVjYTM2NzZhYmQxYjc3ZWU5MjNkOS4gQSBub24tZW1wdHkgaGVhZGVyIGlzCisJICBnZW5lcmF0ZWQgYW5kIHdoZW4gdGhlIEVPUyBldmVudCBpcyByZWNlaXZlZCB0aGUgaGVhZGVyIGlzIGdlbmVyYXRlZAorCSAgYWdhaW4sIHRoaXMgdGltZSB3aXRoIHRoZSBjb3JyZWN0IHNpemUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzExNjk5CisKKzIwMTMtMTEtMDcgMTY6MTc6MTYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291cmNlOiB1cGRhdGUgcmVjZWl2ZXIgc3RhdHMgZm9yIHNlbmRlcgorCSAgQW4gaW50ZXJuYWwgc2VuZGVyIGluIGEgc2Vzc2lvbiBpcyBhbHNvIGEgcmVjZWl2ZXIgb2YgaXRzIG93biBwYWNrZXRzIHNvIHVwZGF0ZQorCSAgdGhlIHJlY2VpdmVyIHN0YXRzLiBPdGhlciBzZW5kZXJzIGluIHRoZSBzZXNzaW9uIHdpbGwgdXNlIHRoaXMgaW5mbyB0byBnZW5lcmF0ZQorCSAgY29ycmVjdCBSQiBibG9ja3MgaW4gdGhlaXIgU1IgcmVwb3J0cy4KKworMjAxMy0xMS0wNyAxNjoxMzoxNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzb3VyY2U6IHJlZmFjdG9yIHJlY2VpdmVyIHN0YXRzIHVwZGF0ZQorCisyMDEzLTEwLTI1IDE4OjIyOjAwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAcGFydG5lci5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBoYW5kbGUgZnJhZ21lbnRlZCBmaWxlcyB3aXRoIG1kYXQgYmVmb3JlIG1vb2ZzCisJICBBc3N1bWUgYSBmaWxlIHdpdGggYXRvbXMgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogbW9vdiwgbWRhdCwgbW9vZiwKKwkgIG1kYXQsIG1vb2YgLi4uCisJICBUaGUgZmlyc3QgbW9vdiB1c3VhbGx5IGRvZXNuJ3QgY29udGFpbiBhbnkgc2FtcGxlIGVudHJpZXMgYXRvbXMgKG9yCisJICB0aGV5IGFyZSBhbGwgc2V0IHRvIDAgbGVuZ3RoKSwgYmVjYXVzZSB0aGUgcmVhbCBzYW1wbGVzIGFyZSBzaWduYWxlZAorCSAgYXQgdGhlIG1vb2ZzLiBJbiBwdXNoIG1vZGUsIHF0ZGVtdXggcGFyc2VzIHRoZSBtb292IGFuZCB0aGVuIGZpbmRzIHRoZSBtZGF0LAorCSAgYnV0IHRoZW4gaXQgaGFzIDAgZW50cmllcyBhbmQgYXNzdW1lcyBpdCBpcyBFT1MuCisJICBUaGlzIHBhdGNoIG1ha2VzIGl0IGNvbnRpbnVlIHBhcnNpbmcgaW4gY2FzZSBpdCBpcyBhIGZyYWdtZW50ZWQgZmlsZSBzbyB0aGF0CisJICBpdCBtaWdodCBmaW5kIHRoZSBtb29mcyBhbmQgcGxheSB0aGUgbWVkaWEuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzEwNjIzCisKKzIwMTMtMTAtMjUgMTE6NDI6MzcgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BwYXJ0bmVyLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5oOgorCSAgcXRkZW11eDogV2hlbiB1c2luZyBhIGJ1ZmZlcmVkIG1kYXQsIHN0b3JlIGFsbCByZWNlaXZlZCBkYXRhIGZvciBsYXRlciB1c2UKKwkgIEluIHB1c2ggbW9kZSwgd2hlbiBxdGRlbXV4IGNhbid0IHVzZSBhIHNlZWsgdG8gc2tpcCB0aGUgbWRhdCBidWZmZXIgaXQgaGFzCisJICB0byBidWZmZXIgaXQgZm9yIGxhdGVyIHVzZS4KKwkgIFRoZSBpc3N1ZSBpcyB0aGF0IGFmdGVyIHBhcnNpbmcgdGhlIG5leHQgbW9vdi9tb29mLCB0aGVyZSBtaWdodCBiZSBzb21lCisJICB0cmFpbGluZyBieXRlcyBmcm9tIHRoZSBuZXh0IGF0b20gaW4gdGhlIGZpbGUuIFRoaXMgZGF0YSB3YXMgYmVpbmcgZGlzY2FyZGVkCisJICBhbG9uZyB3aXRoIHRoZSBhbHJlYWR5IHBhcnNlZCBtb292L21vb2YgYW5kIHBsYXliYWNrIHdvdWxkIGZhaWwgdG8gY29udGludWUKKwkgIGFmdGVyIHRoZSBjb250ZW50cyBvZiB0aGlzIG1vb3YvbW9vZiBhcmUgcGxheWVkLgorCSAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgYmFkIG9uIGZyYWdtZW50ZWQgZmlsZXMgdGhhdCBoYXZlIHRoZSBtZGF0IGJlZm9yZSB0aGUKKwkgIGNvcnJlc3BvbmRpbmcgbW9vZi4gU28geW91J2QgZ2V0OgorCSAgbWRhdHxtb29mfG1kYXR8bW9vZiAuLi4KKwkgIFdoZW4gYSBtb29mIHdhcyByZWNlaXZlZCwgaXQgdXN1YWxseSBjYW1lIHdpdGggc29tZSBleHRyYSBieXRlcyB0aGF0IHdvdWxkCisJICBiZWxvbmcgdG8gdGhlIG5leHQgbWRhdCAoYmVjYXVzZSB1cHN0cmVhbSBkb2Vzbid0IGNhcmUgYWJvdXQgYXRvbXMgYWxpZ25tZW50KS4KKwkgIFNvIHRob3NlIGJ5dGVzIHdlcmUgYmVpbmcgZGlzY2FyZGVkIGFuZCBwbGF5YmFjayB3b3VsZCBmYWlsLgorCSAgVGhpcyBwYXRjaCBtYWtlcyBxdGRlbXV4IHN0b3JlIHRob3NlIGV4dHJhIGJ5dGVzIHRvIHJldXNlIHRoZW0gbGF0ZXIgYWZ0ZXIgdGhlCisJICBtZGF0IGlzIGVtcHRpZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzEwNjIzCisKKzIwMTMtMTEtMDcgMDk6NDk6NTUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICBtdWx0aXVkcHNpbms6IEFsc28gdXNlIHRoZSBiaW5kLXBvcnQgcHJvcGVydHkgaWYgbm8gYmluZC1hZGRyZXNzIHdhcyBnaXZlbgorCisyMDEzLTExLTA3IDAwOjUxOjEyICswMTAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvaGFsLmM6CisJICBvc3hhdWRpb3Npbms6IGZpeCBzZWdmYXVsdCB3aGVuIHdlIGNhbid0IGdldCB0aGUgY2hhbm5lbHMgbGF5b3V0CisKKzIwMTMtMTEtMDUgMTc6MjY6NDkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5LmM6CisJICBydHB2cDhwYXk6IE1ha2UgUGljdHVyZSBJRCBtb2RlIGNvbmZpZ3VyYWJsZSBhbmQgZGVmYXVsdCB0byBubyBwaWN0dXJlIElECisJICBTb21lIGltcGxlbWVudGF0aW9ucyAobGlucGhvbmUpIG9ubHkgc3VwcG9ydCBubyBwaWN0dXJlIGF0IGFsbCBpbiB0aGUKKwkgIHN0cmVhbSBhbmQgd2lsbCBmYWlsIGlmIG9uZSBpcyBwcm92aWRlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTE0OTcKKworMjAxMy0xMS0wNSAxMToxODozNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDg2NWFhMjAgdG8gZGJlZGFhMAorCisyMDEzLTAxLTI5IDEwOjUxOjA3ICswMTAwICBQYXVsIEhFTlJZUyA8dmlzZWNoZWxsZUBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgQWRkIGNhbGwgdG8gZ3N0X3J0cF9oMjY0X3BheV9jbGVhcl9zcHNfcHBzKCkgd2hlbiByZWNlaXZpbmcgYSBTVFJFQU1fU1RBUlQgZXZlbnQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTI3ODcKKworMjAxMy0xMS0wMiAyMjo1MDo0NyArMDEwMCAgUmljbyBUenNjaGljaGhvbHogPHJpY290ekB1YnVudHUuY29tPgorCisJKiBnc3QvcnRzcC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3A6IEFkZCBtaXNzaW5nIGdpby0yLjAgZGVwcyBhbmQgaW5jbHVkZXMKKworMjAxMy0xMS0wMSAxODozMTozNiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9paXJmaWx0ZXIuYzoKKwkgIGF1ZGlvaWlyZmlsdGVyOiBGaXggaW5pdGlhbGl6YXRpb24gY29lZmZpY2llbnQgaGFuZGxpbmcKKwkgIEJyb2tlIHVuaXQgdGVzdC4KKworMjAxMy0xMC0zMSAxNDowNTo0MyAtMDcwMCAgQWxlaXggQ29uY2hpbGxvIEZsYXF1ZSA8YWxlaXhAb2Jsb25nLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogYWxsb3cgc2V0dGluZyB0bHMgY2VydGlmaWNhdGUgdmFsaWRhdGlvbiBmbGFncworCSAgQWRkZWQgYSBuZXcgcHJvcGVydHkgInRscy12YWxpZGF0aW9uLWZsYWdzIi4gSWYgdGhlIHVybCB0cmFuc3BvcnQgaXMKKwkgIFRMUywgdGhlIHZhbGlkYXRpb24gZmxhZ3Mgd2lsbCBiZSBzZXQgdG8gdGhlIHJ0c3AgY29ubmVjdGlvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTEyMzAKKworMjAxMy0xMC0zMSAyMjo0Mzo0OSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaWlyZmlsdGVyLmM6CisJICBhdWRpb2lpcmZpbHRlcjogRG9uJ3QgY3Jhc2ggaWYgbm8gZmlsdGVyIGNvZWZmaWNpZW50cyBhcmUgcHJvdmlkZWQKKwkgIC4uLmFuZCBieSBkZWZhdWx0IHVzZSBhIGlkZW50aXR5IGZpbHRlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTAyMTUKKworMjAxMy0xMC0zMSAxOToxNToxMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOgorCSAgd2F2cGFja2VuYzogRml4IHdyaXRpbmcgb2YgTUQ1IHN1bXMgYW5kIG90aGVyIG1ldGFkYXRhIGJsb2NrcworCSAgVGhlc2UgZG9uJ3QgaGF2ZSB0aGUgRklOQUxfQkxPQ0sgZmxhZyBzZXQuCisKKzIwMTMtMTAtMzEgMTM6MDI6MTEgLTAyMDAgIERqYWxtYSBMw7pjaW8gU29hcmVzIGRhIFNpbHZhIDxkbHVjaW9AaW1wYS5icj4KKworCSogZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5jOgorCSAgaGR2MTM5NHNyYzogTWFrZSBpdCBwb3NzaWJsZSB0byBzZWxlY3QgYSBjYW1lcmEgYnkgaXRzIEdVSUQKKwkgIFRoZSBzb3VyY2UgaGR2MTM5NHNyYyBoYXMgdGhlIGd1aWQgcHJvcGVydHkgdGhhdCBwZXJtaXRzIHNlbGVjdCBhIGNhbWVyYQorCSAgY29ubmVjdGVkIGZyb20gaXRzIEdVSUQgbnVtYmVyLgorCSAgSG93ZXZlciB3aGVuIHRoaXMgcHJvcGVydHkgaXMgc2V0dGVkIHRoZSBzZWxlY3RlZCBjYW1lcmEgaXMgbm90IGNoYW5nZWQuCisJICBUaGUgc291cmNlIGNvbnRpbnVlcyB1c2luZyB0aGUgZGVmYXVsdCBjYW1lcmEuCisJICBUaGlzIHByb2JsZW0gd2FzIHNvbHZlZCB1c2luZyB0aGUgZnVuY3Rpb24gaWVjNjE4ODNfY21wX2Nvbm5lY3QuCisJICBUaGUgcmVmZXJlbmNlIGZvciB0aGUgZnVuY3Rpb24gY291bGQgYmUgZm91bmQgaGVyZToKKwkgIGh0dHA6Ly93d3cuZGVubmVkeS5vcmcvbGliaWVjNjE4ODMvQVBJLWllYzYxODgzLWNtcC1jb25uZWN0Lmh0bWwKKwkgIFRoZSBzb2x1dGlvbiBjYW1lIGZyb20gZHZncmFiIHNvdXJjZSBjb2RlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMDQxNQorCisyMDEzLTEwLTMxIDEzOjIwOjQxIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAcGFydG5lci5zYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkgIHRlc3RzOiBzb3VwaHR0cHNyYzogYWRkIGV4cGxpY2l0IGNhc3QgdG8gc2lsZW5jZSB3YXJuaW5nCisJICBTaWxlbmNpbmcgdGhpcyB3YXJuaW5nOgorCSAgZWxlbWVudHMvc291cGh0dHBzcmMuYzo1MzM6MTQ6IGVycm9yOiBjb21wYXJpc29uIGJldHdlZW4g4oCYU291cEtub3duU3RhdHVzQ29kZeKAmSBhbmQg4oCYZW51bSA8YW5vbnltb3VzPuKAmSBbLVdlcnJvcj1lbnVtLWNvbXBhcmVdCisJICBpZiAoc3RhdHVzICE9IFNPVVBfU1RBVFVTX09LICYmICFzZW5kX2Vycm9yX2RvYykKKwkgIFdpdGggZ2NjIDQuOC4yIChkZWJpYW4pCisKKzIwMTMtMTAtMzEgMTA6Mzg6MzUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcHJveHkgbmV3IGJ1ZmZlciBtb2RlCisKKzIwMTMtMTAtMzAgMTY6NDk6MzYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBqaXR0ZXJidWZmZXI6IGFkZCBuZXcgdGltZXN0YW1wIG1vZGUKKwkgIEFkZCBhIG5ldyB0aW1lc3RhbXAgbW9kZSB0aGF0IGFzc3VtZXMgdGhlIGxvY2FsIGFuZCByZW1vdGUgY2xvY2sgYXJlCisJICBzeW5jaHJvbml6ZWQuIEl0IHRha2VzIHRoZSBmaXJzdCB0aW1lc3RhbXAgYXMgYSBiYXNlIHRpbWUgYW5kIHRoZW4gdXNlcyB0aGUgUlRQCisJICB0aW1lc3RhbXBzIGZvciB0aGUgb3V0cHV0IFBUUy4KKworMjAxMy0xMC0zMCAyMjoxMjo0NSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYS1kZW11eDogRml4IGNvbXBpbGVyIHdhcm5pbmcKKwkgIG1hdHJvc2thLWRlbXV4LmM6IEluIGZ1bmN0aW9uICdnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSc6CisJICBtYXRyb3NrYS1kZW11eC5jOjEzNzk6NzogZXJyb3I6IGZvcm1hdCAnJXUnIGV4cGVjdHMgYXJndW1lbnQgb2YgdHlwZSAndW5zaWduZWQgaW50JywgYnV0IGFyZ3VtZW50IDQgaGFzIHR5cGUgJ2d1aW50NjQnIFstV2Vycm9yPWZvcm1hdD1dCisJICAiJTAzdSIsIGNvbnRleHQtPnVpZCk7CisJICBeCisKKzIwMTMtMTAtMjggMTM6MjE6MTUgKzAwMDAgIE1hdHRoaWV1IEJvdXJvbiA8bWF0dGhpZXUuYm91cm9uQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvY29udmVydC5jOgorCSAgdmlkZW9taXhlcjogcmVtb3ZlIHVubmVlZGVkIGd1aW50IGNvbXBhcmFpc29uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzExMDEwCisKKzIwMTMtMTAtMjggMTQ6MTM6MTIgKzAwMDAgIE1hdHRoaWV1IEJvdXJvbiA8bWF0dGhpZXUuYm91cm9uQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5oOgorCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJICBvc3h2aWRlb3Npbms6IGZpeCBtaXNzaW5nIHNlbGVjdG9yIG5hbWUgd2FybmluZ3MKKwkgIFRoZSBzcGFjZXMgbWF0dGVyIGluIE9iakMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTEwMTMKKworMjAxMy0xMC0yOCAxMzozMTozNCArMDAwMCAgTWF0dGhpZXUgQm91cm9uIDxtYXR0aGlldS5ib3Vyb25AY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIHk0bWVuYzogZml4IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgd2FybmluZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMTAxMQorCisyMDEzLTEwLTI1IDExOjMwOjM2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAcGFydG5lci5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBjaGVjayBpZiB0aGUgZW5kX3RpbWUgaXMgZGVmaW5lZCBiZWZvcmUgdXNpbmcgaXQKKwkgIEF2b2lkcyBzZW5kaW5nIEVPUyB0b28gc29vbiBiZWNhdXNlIG9mIG92ZXJmbG93LiBDYW4gaGFwcGVuIG9uCisJICBmcmFnbWVudGVkIG1wNCBwbGF5YmFjay4KKworMjAxMy0xMC0yMyAxMzozODoyMCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHBhcnRuZXIuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogdXNlIGNvcnJlY3QgdW5yZWYgZnVuY3Rpb24KKwkgIEV2ZW50cyBhcmVuJ3QgR3N0T2JqZWN0cywgYnV0IEdzdE1pbmlPYmplY3RzCisKKzIwMTMtMTAtMTUgMDg6MTY6MjAgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcmVuYW1lIGNodW5rc19hcmVfY2h1bmtzIHRvIGNodW5rc19hcmVfc2FtcGxlcyBhbmQgZmxpcCB0aGUgbG9naWMKKwkgIEFzIHRoZSB2YXJpYWJsZSBuYW1lIHN1Z2dlc3RzLCBzb21ldGltZXMgY2h1bmtzIGFyZSBjaHVua3MuIFJlbmFtZSB0aGUgdmFyaWFibGUKKwkgIHRvIHRlbGwgd2hhdCB0aGV5IGFyZSB3aGVuIHRoZXkgYXJlIG5vdCBjaHVua3MuCisKKzIwMTMtMTAtMDkgMDg6MDQ6MjAgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IHR5cG9zIGFuZCBhZGQgbW9yZSBsb2dnaW5nIGZvciB1bmhhbmRsZWQgcGFydHMKKworMjAxMy0xMC0xNCAxNjoyMzoyNSArMDIwMCAgT2dueWFuIFRvbmNoZXYgPG9nbnlhbkBheGlzLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpdWRwc2luazogRml4IG1lbW9yeSBsZWFrCisJICBVbm1hcCBhbGwgR3N0TWVtb3J5IG9mIHRoZSBjdXJyZW50IGJ1ZmZlciB3aGVuIGZsdXNoaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMDExMAorCisyMDEzLTEwLTEyIDIwOjQ0OjMxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBmaXggYnJva2VuIHNhbXBsZSBwaXBlbGluZQorCSAgd2hpY2ggd2FzIG11eGluZyByYXcgYXVkaW8gYW5kIHZpZGVvIGludG8gZmx2bXV4LCB3aGljaCB3b24ndCB3b3JrLAorCSAgZXZlbiBpZiB0aGVyZSB3ZXJlIGNvbnZlcnRlcnMuCisKKzIwMTMtMTAtMTIgMjA6Mzc6NDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IHJlcXVpcmUgc3RyZWFtLWZvcm1hdD1yYXcgZm9yIG1wZWctMiB0b28sIGJ1dCBkb24ndCByZXF1aXJlIGZyYW1lZCBmaWVsZAorCSAgcmF3IGltcGxpZXMgdGhhdCBpdCdzIGZyYW1lZCBhbHJlYWR5LiBGaXhlcyAuLiAhIGZhYWMgISBmbHZtdXgKKworMjAxMy0xMC0wNyAxNDoyNzoyMSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHBhcnRuZXIuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IGRvIG5vdCBlbWl0IEVPUyB3aGVuIGNvbm5lY3Rpb24gZHJvcHMKKwkgIElmIHRoZSBwaXBlbGluZSBpcyBzdGFsbGVkIGZvciB0b28gbG9uZywgc291cGh0dHBzcmMgd2lsbCBibG9jayBhbmQKKwkgIHN0b3AgZmV0Y2hpbmcgZGF0YSBmcm9tIHRoZSBuZXR3b3JrLiBUaGlzIGNhbiBjYXVzZSB0aGUgY29ubmVjdGlvbiB0bworCSAgZHJvcCBhbmQgc291cGh0dHBzcmMgd291bGQgaGFuZGxlIGl0IGFzIGFuIEVPUy4gVGhpcyBwYXRjaCBtYWtlcyBpdAorCSAgcGVyc2lzdCBhbmQgdHJ5IHRvIGZldGNoIG1vcmUgZGF0YSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBjb250ZW50IGxlbmd0aAorCSAgb3IgdW50aWwgcmVjZWl2aW5nIGFuIGVycm9yIHRoYXQgaXQgaXMgYmV5b25nIGxpbWl0cyBpbiBjYXNlIHRoZSBjb250ZW50CisJICBpcyB1bmtub3duLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MzUzNgorCisyMDEzLTEwLTEwIDEzOjUyOjM1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSogZXh0L2R2L2dzdGR2ZGVjLmg6CisJICBkdmRlYzogRG9uJ3Qgc2VuZCBzZWdtZW50IGV2ZW50IGJlZm9yZSBjYXBzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA5NzI4CisKKzIwMTMtMTAtMDkgMTc6NDY6MzMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkgIGR2ZGVtdXg6IFNlbmQgc3RyZWFtLXN0YXJ0LCBjYXBzIGFuZCBzZWdtZW50IGV2ZW50cyBpbiB0aGUgcmlnaHQgb3JkZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDk3MjgKKworMjAxMy0xMC0wOCAxMToyODowNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSAgd2F2ZW5jOiBBLUxhdyBhbmQgTXUtTGF3IGRvbid0IGhhdmUgd2lkdGgvZGVwdGgvc2lnbmVkIGNhcHMgZmllbGRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA5NjE0CisKKzIwMTMtMTAtMDcgMTI6NTQ6MTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHloLmM6CisJICBkZWludGVybGFjZTogRml4IGhhbmRsaW5nIG9mIHBsYW5hciB2aWRlbyBmb3JtYXRzIGluIGdyZWVkeWggbWV0aG9kCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA5NTA3CisKKzIwMTMtMTAtMDYgMTA6MDE6MjYgLTA3MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHIudmVyZGVqb0BwYXJ0bmVyLnNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYTogVHJpdmlhbCBncmFtbWFyIGZpeCBvbiBkZWJ1ZyBtc2cKKworMjAxMy0xMC0wNiAwOToxNzowMCAtMDcwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8ci52ZXJkZWpvQHBhcnRuZXIuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkqIGdzdC9tYXRyb3NrYS93ZWJtLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IEFkZCBjb250ZXh0IGZsYWcgZm9yIFdlYk0KKwkgIFdlYk0gaGFzIGEgY291cGxlIG9mIHNwZWNpZmljIHJlcXVpcmVtZW50cyB3ZSBuZWVkIHRvIGhhbmRsZS4KKwkgIElkZWEgaXMgdG8gc2V0IHRoaXMgZmxhZyBvbmNlIGFuZCBqdXN0IHJlbHkgb24gbXV4LT5pc193ZWJtCisJICBhdCBydW4gdGltZSBpbnN0ZWFkIG9mIHJlcGVhdGVkbHkgZmlndXJpbmcgdGhpcyBvdXQgZnJvbQorCSAgR1NUX01BVFJPU0tBX0RPQ1RZUEVfV0VCTSAod2hpY2ggcmVxdWlyZXMgYSBzdHJjbXAoKSkuCisKKzIwMTMtMTAtMDQgMTQ6NDI6NTkgLTA3MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHIudmVyZGVqb0BwYXJ0bmVyLnNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYTogRG8gbm90IHdyaXRlIFNlZ21lbnRVSUQgZm9yIFdlYk0gbXV4CisJICBXZWJNIHNwZWMgc3RhdGVzIFNlZ21lbnRVSUQgaXMgVW5zdXBwb3J0ZWQuIEZpbGVzIHByb2R1Y2VkCisJICB3aXRoIGdzdHJlYW1lciB3aXRob3V0IHRoaXMgY2hhbmdlIHdpbGwgc3BpdCBhbiBlcnJvciBsaWtlCisJICB0aGlzIHdoZW4gcGFzc2VkIHRvIG1rdmFsaWRhdG9yOgorCSAgRVJSMjAxOiBJbnZhbGlkICdTZWdtZW50VUlEJyBmb3IgcHJvZmlsZSAnd2VibScgaW4gSW5mbyBhdCAxOTIKKworMjAxMy0xMC0wNSAwMDowMDowMyArMDIwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBtYWtlIGR2ZCBwYWxldHRlIGNoYW5nZSBldmVudCBzdGlja3kKKwkgIFNvIHRoZXkgZG9uJ3QgZ2V0IGxvc3QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA5NDU0CisKKzIwMTMtMTAtMDMgMTY6Mzk6MjYgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5oOgorCSAgdmlkZW9mbGlwOiBBZGQgYXV0b21hdGljIGZsaXAgbW9kZSBkcml2ZW4gYnkgaW1hZ2Utb3JpZW50YXRpb24gdGFnCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA5MzEyCisKKzIwMTMtMTAtMDQgMTM6MzQ6MDkgKzAyMDAgIFBldGVyIEtvcnNnYWFyZCA8cGV0ZXJAa29yc2dhYXJkLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBPX0NMT0VYRUMgbmVlZHMgX0dOVV9TT1VSQ0UKKwkgIE9uIHNvbWUgc3lzdGVtcyAoRS5HLiB1Q2xpYmMgYW5kIG9sZGVyIEdsaWJjIHZlcnNpb25zKSwgT19DTE9FWEVDIGlzIG9ubHkKKwkgIGRlZmluZWQgd2hlbiBfR05VX1NPVVJDRSBpcyBzcGVjaWZpZWQsIHNvIGRvIHNvLgorCSAgX0dOVV9TT1VSQ0UgbmVlZHMgdG8gYmUgZGVmaW5lZCBiZWZvcmUgYW55IHN5c3RlbSBoZWFkZXJzIGFyZSBpbmNsdWRlZCwKKwkgIHNvIG1vdmUgdGhlIGZjbnRsLmggc2VjdGlvbiB1cC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDk0MjMKKworMjAxMy0xMC0wNCAxMjoxMTo1NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGZpeCByYWNlIGluIGZsdXNoLXN0YXJ0L2ZsdXNoLXN0b3AKKwkgIFdoZW4gZmx1c2gtc3RvcCBhcnJpdmVzIGJlZm9yZSB3ZSBwcm9jZXNzIHRoZSByZXN1bHQgb2YgdGhlIF9wdXNoKCkgaW4gdGhlCisJICBsb29wIGZ1bmN0aW9uLCB3ZSBtaWdodCBwYXVzZSBldmVuIHRob3VnaCB3ZSBhcmUgbm90IGZsdXNoaW5nIGFueW1vcmUuIEZpeCB0aGlzCisJICByYWNlIGJ5IHdhaXRpbmcgZm9yIHRoZSBzcmNwYWQgbG9vcCBmdW5jdGlvbiB0byBjb21wbGV0ZWx5IHBhdXNlIGFmdGVyIGRvaW5nIHRoZQorCSAgZmx1c2gtc3RhcnQuCisKKzIwMTMtMTAtMDMgMjI6Mzg6NDMgKzAyMDAgIE1hdGhpZXUgRHVwb25jaGVsbGUgPG1kdXBvbmNoZWxsZTFAZ21haWwuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb2NvbnZlcnQuYzoKKwkgIHZpZGVvbWl4ZXI6IFVwZGF0ZSB2aWRlb2NvbnZlcnQgY29weQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwOTM5MAorCisyMDEzLTEwLTAzIDIxOjM2OjM0ICswMjAwICBNYXRoaWV1IER1cG9uY2hlbGxlIDxtZHVwb25jaGVsbGUxQGdtYWlsLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXI6IENoZWNrIGlmIHRoZSBwYWQgbmVlZHMgcmVjb25maWd1cmF0aW9uIGluIGNvbGxlY3RlZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwOTM4NAorCisyMDEzLTEwLTAzIDE0OjM5OjM1ICswMTAwICBNYXR0aGlldSBCb3Vyb24gPG1hdHRoaWV1LmJvdXJvbkBjb2xsYWJvcmEuY29tPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBSZWxheCBzaW5rIGNhcHMKKwkgIFNpbmNlIGpwZWdkZWMgYWxyZWFkeSBwYXJzZSB0aGUganBlZyBzdHJlYW0sIHRoZSBzaW5rIGNhcHMgY291bGQgYmUKKwkgIHJlbGF4ZWQuIFRoaXMgd2lsbCBhbGxvdyBqcGVnZGVjIHRvIGJlIHNlbGVjdGVkIGluIG1vcmUgY2FzZSBhbmQgaW4KKwkgIHBhcnRpY3VsYXIgd2hlbiB0aGUganBlZyB0eXBlZmluZGVyIGRvZXMgbm90IGZpbmQgdGhlIHdpZHRoIGFuZCBoZWlnaHQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA5MzUyCisKKzIwMTMtMTAtMDMgMTg6MzM6MDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJzcmM6IHByaW50IHByb2JlZCBjYXBzIGFzIGNhcHMgYWdhaW4gaW4gZGVidWcgbG9nCisJICBUaGlzIGdvdCBsb3N0IGR1cmluZyByZWZhY3RvcmluZy4KKworMjAxMy0xMC0wMyAxMTo1OToyNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEFkZCBzdXBwb3J0IGZvciB0aGUgbXAydiBmb3VyY2MgZm9yIE1QRUctMiB2aWRlbworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwOTI3MAorCisyMDEzLTEwLTAyIDE1OjU2OjUzICswMjAwICBPZ255YW4gVG9uY2hldiA8b2dueWFuQGF4aXMuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IEZpeCBtZW1vcnkgbGVhaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwOTI2NgorCisyMDEzLTA5LTMwIDEyOjMxOjQyICswMzAwICBTcmVlcmVuaiBCYWxhY2hhbmRyYW4gPHNyZWVyZW5qLmJhbGFjaGFuZHJhbkBpbnRlbC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmM6CisJICBxdGRlbXV4OiBBZGQgSEVWQyBzdXBwb3J0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA5MDkzCisKKzIwMTMtMDktMzAgMTI6MjQ6MzIgKzAyMDAgIE9nbnlhbiBUb25jaGV2IDxvZ255YW5AYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJICBydHBnc3RwYXk6IEZpeCBtZW1vcnkgbGVhaworCSAgV2Ugd2VyZSBsZWFraW5nIHRoZSBHTGlzdCBub2RlcyBvZiB0aGUgcGVuZGluZyBidWZmZXJzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwOTA3OQorCisyMDEzLTA5LTMwIDEyOjMxOjAwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgcnRwaml0dGVyYnVmZmVyOiBmaXggcmFjZSB3aGVuIHVwZGF0aW5nIHRoZSBuZXh0X3NlcW51bQorCSAgSWYgd2Ugd2VyZSBub3Qgd2FpdGluZyBmb3IgdGhlIG1pc3Npbmcgc2VxbnVtIHdoZW4gd2UgaW5zZXJ0IHRoZSBsb3N0IHBhY2tldAorCSAgZXZlbnQgaW4gdGhlIGppdHRlcmJ1ZmZlciwgd2UgZW5kIHVwIG5vdCB1cGRhdGluZyB0aGUgbmV4dF9zZXFudW0gYW5kIHdhaXQKKwkgIGZvcmV2ZXIgZm9yIHRoZSBsb3N0IHBhY2tldHMgdG8gYXJyaXZlLiBJbnN0ZWFkLCBrZWVwIHRyYWNrIG9mIHRoZSBhbW91bnQgb2YKKwkgIHBhY2tldHMgY29udGFpbmVkIGJ5IHRoZSBqaXR0ZXJidWZmZXIgaXRlbSBhbmQgdXBkYXRlIHRoZSBuZXh0IGV4cGVjdGVkCisJICBzZXFudW0gb25seSBhZnRlciBwdXNoaW5nIHRoZSBidWZmZXIvZXZlbnQuIFRoaXMgbWFrZXMgc3VyZSB3ZSBjb3JyZWN0bHkgaGFuZGxlCisJICBHQVBTIGluIHRoZSBzZXF1ZW5jZSBudW1iZXJzLgorCisyMDEzLTA5LTMwIDEyOjMwOjIzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogc21hbGwgZGVidWcgaW1wcm92ZW1lbnQKKworMjAxMy0wOS0zMCAxMTo1MzowOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHJlc2V0IHNrZXcgZG9lcyBub3QgcmVzZXQgY2xvY2stcmF0ZQorCSAgRG9uJ3QgcmVzZXQgdGhlIGNsb2NrLXJhdGUgd2hlbiB3ZSByZXNldCB0aGUgc2tldyBjb3JyZWN0aW9uIGFsZ29yaXRobS4KKwkgIFJlc2V0IHRoZSBza2V3IGNvcnJlY3Rpb24gYWxnb3JpdGhtIHdoZW4gd2UgY2hhbmdlIHRoZSBjbG9jay1yYXRlLgorCisyMDEzLTA5LTMwIDExOjE2OjMyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogcGF1c2UgdGltZXIgd2hlbiBQQVVTRUQKKwkgIEFsc28gcGF1c2UgdGhlIHRpbWVyIHdoZW4gd2UgZ28gdG8gdGhlIFBBVVNFRCBzdGF0ZS4gSXQgaXMgcG9zc2libGUgdGhhdCB3ZQorCSAgZG9uJ3QgaGF2ZSBhIGNsb2NrIG9yIGJhc2UtdGltZSBpbiBQQVVTRUQgdG8gcGVyZm9ybSB0aGUgdGltZW91dHMuCisKKzIwMTMtMDktMzAgMTE6MTU6MjUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBpbXByb3ZlIGRlYnVnCisKKzIwMTMtMDktMjYgMjA6NDE6MjYgKzAyMDAgIEhhbnMgTcOlbnNzb24gPGhhbnNtQGF4aXMuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJICBtcDRtdXg6IERvIG5vdCByZXF1aXJlIGZyYW1lcmF0ZSBpbiBwZWVyIHZpZGVvIGNhcHMKKwkgIFJlbW92ZSB0aGUgZnJhbWVyYXRlIHJlc3RyaWN0aW9uIG9uIHRoZSBjYXBzLgorCSAgUmVmZXJlbmNlOiBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA4ODY0CisKKzIwMTMtMDktMjcgMTU6MDU6MDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGFsc28gZ28gaW50byB0aGUgbG9vcCBmdW5jdGlvbiBhZnRlciBjb25uZWN0CisJICBXaGVuIHdlIGhhdmUgb3BlbmVkIHRoZSBzdHJlYW0sIGdvIGludG8gdGhlIGxvb3AgZnVuY3Rpb24gc28gdGhhdCB3ZSBjYW4KKwkgIHJlY2VpdmUgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyLgorCisyMDEzLTA5LTI3IDEyOjUzOjA2ICswMjAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IG1vdmUgdGhlIGNoZWNrIGZvciBzdWJ0aXRsZSBidWZmZXIgYmVpbmcgbnVsbCB0ZXJtaW5hdGVkIGJlZm9yZSB2YWxpZGF0aW5nIFVURi04CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3OTMzCisKKzIwMTMtMDktMjYgMTY6MjA6MDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBkb24ndCBjYWxjdWxhdGUgc2tldyB3aXRob3V0IHJ0cHRpbWUKKwkgIFNraXAgdHJ5aW5nIHRvIGNhbGN1bGF0ZSB0aGUgc2tldyB3aGVuIHdlIGRvbid0IGhhdmUgYW4gcnRwdGltZS4KKwkgIEl0IGNhdXNlcyBwcm9ibGVtcyB3aGVuIGxvc3QgcGFja2V0IGV2ZW50cyBhcmUgcGxhY2VkIGluIHRoZSBqaXR0ZXJidWZmZXIuCisKKzIwMTMtMDktMjUgMjM6NDY6MTQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogZ2V0IHJpZCBvZiBBU19TQ1JVQl9JTkNMVURFCisJICBTaG91bGQgbm90IGJlIG5lZWRlZCBhbnkgbW9yZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDc2NTgKKworMjAxMy0wOS0yNSAxNzo0MjowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZGlzYWJsZSBjaGVja3Mgd2hlbiBsaW5raW5nIHBhZHMKKwkgIFdlIGtub3cgdGhlIHBhZCBsaW5rcyB3aWxsIHdvcmsgKGFuZCB3ZSBkb24ndCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlCisJICBhbnl3YXkpLgorCisyMDEzLTA5LTI1IDE3OjM2OjE1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogYXZvaWQgc29tZSBwYWQgbGluayBjaGVja3MKKwkgIExpbmsgcGFkcyB3aXRob3V0IGNoZWNrcywgd2Uga25vdyBpdCB3aWxsIHdvcmsuCisKKzIwMTMtMDktMjUgMTI6NTU6MjEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IERvbid0IGVycm9yIG91dCBpZiBkb3duc3RyZWFtIGlzIG5vdCBzZWVrYWJsZSBmb3Igbm9uLWZyYWdtZW50ZWQgdmFyaWFudHMKKwkgIERvaW5nIHNvIHdvdWxkIGJlIGEgcmVncmVzc2lvbiBvdmVyIDEuMCBhbmQgYnJlYWtzIHRoZSB1bml0IHRlc3QuCisJICBIb3dldmVyIHRoZSByZXN1bHQgd2lsbCBiZSBtb3N0IGxpa2VseSB1bnVzYWJsZSwgc28gbGV0J3MgcG9zdAorCSAgYSB3YXJuaW5nIG1lc3NhZ2Ugb24gdGhlIGJ1cy4KKworMjAxMy0wOS0yNCAwNDowMjowOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGNhbGN1bGF0ZSBzb21lIHN0YXRzCisKKzIwMTMtMDktMjMgMTc6MDU6NDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBtb3ZlIHNlbmRfbG9zdF9ldmVudCBmdW5jdGlvbgorCSAgTW92ZSB0aGUgc2VuZF9sb3N0X2V2ZW50IGZ1bmN0aW9uIHRvIHRoZSBkb19sb3N0X2V2ZW50IGhhbmRsaW5nLCB0aGVyZSBpcyBubworCSAgbmVlZCB0byBoYXZlIGEgc2VwYXJhdGUgZnVuY3Rpb24uCisKKzIwMTMtMDktMTYgMTE6MjA6NTEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgY29kZSB0byBwYXJzZSBjcmVhdGlvbiB0aW1lIGVhcmxpZXIgdGhhbiAxOTcwCisJICBVc2UgZ19kYXRlX3RpbWUgc2Vjb25kcyBtYW5pcHVsYXRpb24gdG8gYWxsb3cgdG8gY292ZXIgdGhlIHF1aWNrdGltZQorCSAgc3BlYyBmb3IgY3JlYXRpb25fdGltZS4gSXQgdXNlcyBzZWNvbmRzIHNpbmNlIDE5MDQuCisJICBCb3RoIHBhdGhzIGNvdWxkIGJlIGRvbmUgdXNpbmcgdGhlIGdlbmVyaWMgYXBwcm9hY2ggb2Ygc2Vjb25kcyBzaW5jZQorCSAgMTkwNCB3aXRoIEdEYXRlVGltZSBoYW5kbGluZywgYnV0IHRoZSBmaXJzdCBwYXRoIHVzaW5nIHNlY29uZHMgZnJvbQorCSAgMTk3MCBzaG91bGQgYmUgbW9yZSBjb21tb25seSBmb3VuZCBhbmQgYXZvaWRzIGEgZmV3IG9iamVjdHMgY3JlYXRpb24gYW5kCisJICByZWYvdW5yZWYsIHNvIGtlZXAgaXQgdGhlcmUgZm9yIHBlcmZvcm1hbmNlLgorCSAgQWRkaXRpb25hbGx5LCB0aGUgY29kZSBmb3IgaGFuZGxpbmcgc2Vjb25kcyBzaW5jZSAxOTcwIGNoYW5nZWQgZnJvbSA+CisJICB0byA+PSBiZWNhdXNlIGhhdmluZyAwIHNlY29uZHMgc2luY2UgMTk3MCBpcyBhbHNvIGEgdmFsaWQgY2FzZSBmb3IgdGhhdAorCSAgcGF0aCB0byBoYW5kbGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3OTc1CisKKzIwMTMtMDktMjEgMDA6NTU6MjYgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogdXBkYXRlIHN0cmVhbS0+cG9zIHdoZW4gc2VuZGluZyBidWZmZXJzIHNvIHRoYXQgZ2FwIGV2ZW50cyBhcmUgbm90IHNlbnQgdW5uZWNlc3NhcmlseQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwODUwNQorCisyMDEzLTA5LTI0IDE4OjMwOjA0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBSRUFETUU6CisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNmIwM2JhNyB0byA4NjVhYTIwCisKKzIwMTMtMDktMjQgMTU6MDU6MjQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBBY3R1YWxseSB1c2UgMS4zLjAuMSBhcyB2ZXJzaW9uIHRvIG1ha2UgY29uZmlndXJlIGhhcHB5CisKKzIwMTMtMDktMjQgMTU6MDA6MjQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjIuMCA9PT0KKworMjAxMy0wOS0yNCAxNDoyMTowOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjIuMAorCisyMDEzLTA5LTI0IDE0OjIwOjUxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2hyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisKKzIwMTMtMDktMjAgMTk6NDM6MjEgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogZml4IHNlZ2ZhdWx0IHJlbGVhc2luZyB0aGUgc2luaworCSAgc2hvd19mcmFtZSBpcyBkZWZlcnJlZCB0byB0aGUgbWFpbiB0aHJlYWQgYW5kIGNhbiBiZSBjYWxsZWQKKwkgIHdoZW4gdGhlIHNpbmsgaGFzIGJlZW4gcmVsZWFzZWQsIHNvIHdlIG5lZWQgdG8ga2VlcCBhbiBleHRyYSByZWYKKwkgIG9uIE9iamVjdGl2ZUMgb2JqZWN0IGhlbHBlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDg1MDEKKworMjAxMy0wOS0xOSAxNzoxMTozNCAtMDQwMCAgUm9iZXJ0IEtyYWtvcmEgPHJvYi5rcmFrb3JhQG1lc3NhZ2VuZXRzeXN0ZW1zLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBSZXN0b3JlIG9yaWdpbmFsIEdzdE1lbW9yeSBpbiBidWZmZXIgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNjA4MworCisyMDEzLTA5LTIzIDE2OjM0OjE1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cG1hbmFnZXI6IHVwZGF0ZSBkb2NzCisKKzIwMTMtMDktMjMgMTU6MzY6MzIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIGRvY3M6IHVwZGF0ZSBkb2NzIHdpdGggMS4wIGVsZW1lbnQgbmFtZXMKKworMjAxMy0wOS0yMyAxNDoxMzozMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICB0ZXN0czogYWRkIHRlc3QgZm9yIHJldHJhbnNtaXNzaW9uIGJlY2F1c2Ugb2YgcmVvcmRlcmluZworCisyMDEzLTA5LTIzIDE0OjEyOjAzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogYWx3YXlzIHN0b3JlIGxvc3QgZXZlbnQgaW4gaml0dGVyYnVmZmVyCisJICBBbHdheXMgcHJlcGFyZSBhIGxvc3QgZXZlbnQgaW4gdGhlIGppdHRlcmJ1ZmZlciwgaXQgaXMgdG8gd2FrZSB1cCBhbmQgbWFrZSB0aGUKKwkgIHB1c2hpbmcgdGhyZWFkIGNvbnRpbnVlLiBXZSBkcm9wIHRoZSBldmVudCB3aGVuIHdlIGFyZSBub3Qgc3VwcG9zZWQgdG8gcHVzaCBsb3N0CisJICBldmVudHMgZG93bnN0cmVhbS4KKworMjAxMy0wOS0yMyAxMToxODo0NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHNjaGVkdWxlIGxvc3QgZXZlbnQgZGlmZmVyZW50bHkKKwkgIFNjaGVkdWxlIHRoZSBsb3N0IGV2ZW50IGJ5IHBsYWNpbmcgaXQgaW5zaWRlIHRoZSBqaXR0ZXJidWZmZXIgd2l0aCB0aGUgc2VxbnVtCisJICB0aGF0IHdhcyBsb3N0IHNvIHRoYXQgdGhlIHB1c2hpbmcgdGhyZWFkIGNhbiBpbnRlcmxlYXZlIGFuZCBwdXNoIGl0IHByb3Blcmx5LgorCisyMDEzLTA5LTIzIDExOjE3OjM0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHRlc3RzOiByZW1vdmUgdGltZW91dHMgZnJvbSBjaGVjaworCSAgVGltZW91dHMgbWFrZSB0aGUgdGVzdCB1bnJlbGlhYmxlIGFuZCBhcmUgbm90IG5lZWRlZC4KKworMjAxMy0wOS0yMyAxMToxNTozMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHJlbW92ZSBsaXN0IGRlYnVnCisKKzIwMTMtMDktMjMgMTE6MTQ6MDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBydHBqaXR0ZXJidWZmZXI6IGFkZCB0eXBlIHRvIHRoZSBpdGVtCisJICBTbyB0aGF0IHRoZSB1cHBlciBsYXllciBjYW4ga25vdyB3aGF0IGRhdGEgaXMgY29udGFpbmVkIGluIHRoZSBpdGVtLgorCisyMDEzLTA5LTIzIDA5OjU4OjMyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBydHBqaXR0ZXJidWZmZXI6IGZpeCBmbHVzaAorCSAgUGFzcyBmdW5jdGlvbiB0byBmbHVzaCB0byBwcm9wZXJseSBmcmVlIHRoZSBxdWV1ZSBpdGVtcy4KKworMjAxMy0wOS0yMSAwMDowODoyMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGFwcGVuZCBzZXFudW0gLTEgcGFja2V0cworCisyMDEzLTA5LTIwIDIzOjQ4OjIwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBydHBqaXR0ZXJidWZmZXI6IHVzZSBzdHJ1Y3R1cmUgdG8gaG9sZCBwYWNrZXQgaW5mb3JtYXRpb24KKwkgIE1ha2UgdGhlIGppdHRlcmJ1ZmZlciBvcGVyYXRlIG9uIGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgYWxsIHRoZSBwYWNrZXQKKwkgIGluZm9ybWF0aW9uLiBUaGlzIGF2b2lkcyBtYXBwaW5nIHRoZSBidWZmZXIgbXVsdGlwbGUgdGltZXMganVzdCB0byBnZXQgdGhlIFJUUAorCSAgaW5mb3JtYXRpb24uIEl0IHdpbGwgYWxzbyBtYWtlIGl0IHBvc3NpYmxlIHRvIHN0b3JlIG90aGVyIG1pbmlvYmplY3RzIHN1Y2ggYXMKKwkgIGV2ZW50cyBsYXRlci4KKworMjAxMy0wOS0yMCAxNzo0ODo1MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHVwZGF0ZSBleHBlY3RlZCB0aW1lciB3aGVuIHBvc3NpYmxlCisJICBXaGVuIHdlIHJlY2VpdmUgYSBwYWNrZXQgYW5kIHdlIGhhdmUgc29tZSBtaXNzaW5nIHBhY2tldHMsIHdlIGNhbiB1cGRhdGUgdGhlaXIKKwkgIGVzdGltYXRlZCBhcnJpdmFsIHRpbWVzIGJhc2VkIG9uIHRoZSB0aW1lc3RhbXAgZGlmZmVyZW5jZS4KKworMjAxMy0wOS0yMCAxNzoxODoyNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGZpeCBvcmRlciBvZiB0aW1lb3V0IGV2ZW50cworCSAgSW1wcm92ZSB0aGUgb3JkZXIgb2YgdGhlIHRpbWVvdXQgZXZlbnRzLCBpZiB0aGVyZSBhcmUgdGltZXJzIHdpdGggdGhlIHNhbWUKKwkgIHRpbWVvdXQsIHdlIHdhbnQgdG8gdHJpZ2dlciB0aGUgbG93ZXN0IHNlcW51bSBmaXJzdC4gRm9yIHRoaXMgd2UgbmVlZCB0byBsb29wCisJICBvdmVyIHRoZSBjb21wbGV0ZSBhcnJheSBvZiB0aW1lcnMgdG8gZmluZCB0aGUgYmVzdCBvbmUgYmVmb3JlIHRyaWdnZXJpbmcgdGhlCisJICB0aW1lb3V0LgorCisyMDEzLTA5LTIwIDE2OjU4OjM4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogc2VuZCBsb3N0IGV2ZW50IGJlZm9yZSBzaWduYWxpbmcgbmV4dCBidWZmZXIKKwkgIEZpcnN0IHNlbmQgdGhlIGxvc3QgZXZlbnQsIHRoZW4gdXBkYXRlIHRoZSBuZXh0X3NlcW51bSBjb3VudGVyIGFuZCB0aGVuCisJICBzZW5kIHRoZSBzaWduYWwgdG8gdGhlIHB1c2hpbmcgdGhyZWFkIHRoYXQgaXQgY2FuIHJldHJ5IHRvIHB1c2ggYSBidWZmZXIuIFRoaXMKKwkgIGF2b2lkcyBwdXNoaW5nIG91dCBidWZmZXJzIGJlZm9yZSB0aGUgbG9zdCBldmVudCBpcyBwdXNoZWQuCisKKzIwMTMtMDktMjAgMTU6MzU6MjUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaDoKKwkgIGppdHRlcmJ1ZmZlcjogY29uZmlndXJlIGNsb2NrLXJhdGUgb24gaml0dGVyYnVmZmVyCisJICBBZGQgYSBnZXQgYW5kIHNldHRlciB0byBjb25maWd1cmUgdGhlIGNsb2NrLXJhdGUgaW4gdGhlIGppdHRlcmJ1ZmZlciBpbnN0ZWFkIG9mCisJICBwYXNzaW5nIGl0IGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBpbnNlcnQgbWV0aG9kLgorCisyMDEzLTA5LTIwIDEyOjI5OjM5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHRlc3RzOiBhZGQgdGVzdCBmb3IgcGFja2V0IGRlbGF5IGFuZCByZXRyYW5zbWlzc2lvbgorCisyMDEzLTA5LTIwIDEyOjI3OjI2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogYWRkIG9wdGlvbiB0byByZXNldCByZXRyYW5zbWlzc2lvbiB0aW1lcnMKKworMjAxMy0wOS0yMCAxMjoyNTo0MyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHN0b3AgdGhlIHRpbWVyIHRocmVhZAorCSAgVGhlIHRpbWVvdXQgY29kZSBjb3VsZCByZWxlYXNlIHRoZSBsb2NrIHNvIHdlIG5lZWQgdG8gY2hlY2sgaWYgd2UgYXJlIGFsbG93ZWQgdG8KKwkgIHdhaXQgZm9yIHRoZSBjbG9jayBzb21lIG1vcmUuCisKKzIwMTMtMDktMjAgMTI6MjU6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiB1bmxvY2sgb25seSBvbmNlCisKKzIwMTMtMDktMjAgMTE6MzA6MDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgdGVzdHM6IGNoZWNrIGJvdGggUFRTIGFuZCBEVFMKKworMjAxMy0wOS0yMCAxMDo1NTowMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICB0ZXN0czogYWRkIHVuaXQtdGVzdCBmb3IgbXVsdGlwbGUgbWlzc2luZyBwYWNrZXRzCisJICBDaGVjayBpZiBtdWx0aXBsZSBtaXNzaW5nIHBhY2tldHMgZ2VuZXJhdGUgcmV0cmFuc21pc3Npb24gZXZlbnRzIGFuZCB0aGF0IHRoZQorCSAgcmV0cmFubWlzc2lvbiByZXF1ZXN0cyBhcmUgY2FuY2VsZWQgd2hlbiB0aGUgbWlzc2luZyBwYWNrZXQgYXJyaXZlcy4KKworMjAxMy0wOS0yMCAxMDo1MzoyOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGltcHJvdmUgZmx1c2ggYW5kIHNodXRkb3duCisJICBUaGVyZSBpcyBubyBuZWVkIHRvIHVuc2NoZWR1bGUgdGhlIHRpbWVyIGluIGZsdXNoLXN0YXJ0LCBmbHVzaC1zdG9wIHdpbGwgcmVtb3ZlCisJICB0aGUgdGltZXJzIGFuZCB1bnNjaGVkdWxlLgorCSAgVW5zY2hlZHVsZSB0aGUgY3VycmVudCB0aW1lciBiZWZvcmUgYXR0ZW1wdGluZyB0byBqb2luIHRoZSB0aW1lciB0aHJlYWQuCisKKzIwMTMtMDktMjAgMTA6NDM6NTMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgdGVzdHM6IGltcHJvdmUgZGVidWcKKworMjAxMy0wOS0yMCAxMDo0MjoyNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHNldCBjb3JyZWN0IGV4cGVjdGVkIHRpbWUKKwkgIFdoZW4gd2UgYWxyZWFkeSBoYXZlIGEgdGltZXIgZm9yIGEgcGFja2V0LCBza2lwIGl0IGJ1dCBkb24ndCBmb3JnZXQgdG8gYWRqdXN0CisJICB0aGUgZHRzIHRvIHRoZSBleHBlY3RlZCBkdHMgb2YgdGhlIG5leHQgcGFja2V0LgorCisyMDEzLTA5LTIwIDEwOjQxOjU5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogaW1wcm92ZSBkZWJ1ZworCisyMDEzLTA5LTE5IDE2OjU1OjI1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkgIGFscGhhOiB1c2UgUE9GRlNFVCBpbnN0ZWFkIG9mIE9GRlNFVAorCSAgVXNlIHRoZSBtb3JlIGNvcnJlY3QgUE9GRlNFVCBtYWNybyB0byBnZXQgdGhlIG9mZnNldCBvZiBhIGNvbXBvbmVudCBpbiBpdHMKKwkgIHBsYW5lLiBUaGUgb2Zmc2V0IG1hY3JvIGdpdmVzIHRoZSBvZmZzZXQgb2YgdGhlIGNvbXBvbmVudCByZWxhdGl2ZSB0byB0aGUgc3RhcnQKKwkgIG9mIHRoZSBmcmFtZS4KKworMjAxMy0wOS0yMSAxODo0NjoyOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvZ29vbS9tbXguaDoKKwkgIGdvb206IEZpeCBNTVggYXNzZW1ibHkgY29tcGlsYXRpb24gd2l0aCBjbGFuZworCSAgY2xhbmcgZG9lcyBub3Qgd2FudCBvciBuZWVkIGEgY2xvYmJlciBsaXN0IGZvciBlbW1zOgorCSAgZXJyb3I6IGNsb2JiZXJzIG11c3QgYmUgbGFzdCBvbiB0aGUgeDg3IHN0YWNrCisJICBQYXRjaCB0YWtlbiBmcm9tIHRoZSBGcmVlQlNEIHBvcnRzLCBwcm92aWRlZCBieQorCSAgRGFuIE1jR3JlZ29yIDxkYW4ubWNncmVnb3JAdXNhc2suY2E+CisKKzIwMTMtMDktMjAgMTY6MTY6NTcgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjb2xsYWJvcmEuY29tPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gYjYxMzY2MSB0byA2YjAzYmE3CisKKzIwMTMtMDktMjAgMTA6MTk6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYS1kZW11eDogTWFrZSBzdXJlIHRoYXQgc3VidGl0bGUgYnVmZmVycyBhcmUgXDAtdGVybWluYXRlZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzkzMworCisyMDEzLTA5LTE3IDEyOjE3OjU0ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogaGFuZGxlIGlzc3VlcyBjb3JyZWN0bHkgd2hlbiBkb3duc3RyZWFtIGlzIG5vdCBzZWVrYWJsZQorCSAgVGhlIHN0cmVhbWFibGUgcHJvcGVydHkgb25seSBtYWtlIHNlbnNlIGZvciBmcmFnbWVudGVkIGZvcm1hdHMuCisJICBGb3IgcmVndWxhciBNUDQsIHdoZW4gZG93bnN0cmVhbSBpcyBub3Qgc2Vla2FibGUgd2UgY2FuJ3QgcmV3cml0ZQorCSAgdGhlIGhlYWRlcnMsIHNvIHF0bXV4IGNhbiBvbmx5IHdvcmsgd2l0aCBmYXN0LXN0YXJ0PVRSVUUsIHdoZXJlCisJICB0aGUgaGVhZGVycyBhcmUgd3JpdHRlbiBmaW5pc2hpbmcgdGhlIGZpbGUuCisJICBGb3IgZnJhZ21lbnRlZCBNUDQsIHdoZW4gc3RyZWFtYWJsZSBpcyBub3Qgc2Vla2FibGUgYW5kIHRoZSBzdHJlYW1hYmxlCisJICBwcm9wZXJ0eSBpcyBGQUxTRSwgd2UgbXVzdCBlbmZvcmNlIHN0cmVhbWFibGU9VFJVRSB3YXJuaW5nIHRoZSB1c2VyCisJICBhYm91dCB0aGlzIGNoYW5nZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzI0MgorCisyMDEzLTA5LTE3IDEyOjA2OjA2ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogbWFrZSAic3RyZWFtYWJsZSIgVFJVRSBhcyBkZWZhdWx0CisJICBUaGUgbW9zdCBjb21tb24gdXNlIGNhc2UgZm9yIGZyYWdtZW50ZWQgTVA0IChEYXNoIGFuZCBTbW9vdGggU3RyZWFtaW5nKQorCSAgaXMgcHJvZHVjaW5nIHN0cmVhbWFibGUgY29udGVudCAoZXZlbiBmb3IgVk9EKS4gc3RyZWFtYWJsZT1GQUxTRSB3b3VsZCBvbmx5CisJICBiZSB1c2VkIHRvIGdlbmVyYXRlIGZyYWdtZW50ZWQgTVA0IHdpdGggYW5kIGluZGV4IG9mIE1PT0YncyB0aGF0IGNvdWxkCisJICBiZSByZXByb2R1Y2VkIHdpdGhvdXQgYSBwbGF5bGlzdC9tYW5pZmVzdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzI0MgorCisyMDEzLTA5LTE3IDEyOjAxOjMwICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogZGVwcmVjYXRlIHRoZSBzdHJlYW1hYmxlIHByb3BlcnR5IGZvciBub24tZnJhZ21lbnRlZCBNUDQKKwkgIFRoZSBzdHJlYW1hYmxlIHByb3BlcnR5IG9ubHkgbWFrZXMgc2Vuc2UgZm9yIGZyYWdtZW50ZWQgTVA0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzI0MgorCisyMDEzLTA5LTE5IDE3OjA4OjE5IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSAgdjRsMjogUmVtb3ZlIGNvbW1lbnRlZCBvdXQgbGluZQorCisyMDEzLTA5LTE5IDE4OjQzOjA4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNzRhNjg1NyB0byBiNjEzNjYxCisKKzIwMTMtMDktMTkgMTc6MzU6MjcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGF1dG9nZW4uc2g6CisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMDk4YzBkNyB0byA3NGE2ODU3CisKKzIwMTMtMDktMTkgMTY6NTA6NDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgYWxwaGE6IGRvbid0IGFzc3VtZSBwbGFuYXIgZm9ybWF0cyBoYXZlIGp1c3QgMSBibG9jaworCSAgRG9uJ3QgYXNzdW1lIHBsYW5hciBmb3JtYXRzIGhhdmUganVzdCBvbmUgbWVtb3J5IGJsb2NrIHdpdGggdGhlIGRhdGEgYnV0IHVzZSB0aGUKKwkgIG1hY3JvcyB0byBhY2Nlc3MgdGhlIHJpZ2h0IG1lbW9yeSBibG9jayB3aGVyZSBhIGNvbXBvbmVudCBjYW4gYmUgZm91bmQuCisKKzIwMTMtMDktMTkgMTQ6MTQ6NTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgdGVzdHM6IGFkZCByZXRyYW5zbWlzc2lvbiBqaXR0ZXJidWZmZXIgdGVzdAorCSAgU3RvcmUgYm90aCBEVFMgYW5kIFBUUyBvbiBidWZmZXJzLgorCSAgTWFrZSBhIHF1ZXVlIGZvciBzcmNwYWQgZXZlbnRzLgorCSAgQWN0aXZhdGUgcGFkcyBhZnRlciBsaW5raW5nIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IFJFQ09ORklHVVJFIGV2ZW50cy4KKwkgIEFkZCB0ZXN0IGZvciByZXRyYW5zbWlzc2lvbi4KKworMjAxMy0wOS0xOSAxNDoxMjoxOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGtlZXAgZGVsYXkgYXMgYSBzZXBhcmF0ZSB2YXJpYWJsZSBpbiB0aW1lcgorCSAgS2VlcCBhIHNlcGFyYXRlIGRlbGF5IGluIHRoZSB0aW1lciBzbyB0aGF0IHdlIHN0aWxsIGtub3cgdGhlIG9yaWdpbmFsIHRpbWVzdGFtcAorCSAgb2YgdGhlIHBhY2tldCB0aGF0IHRoaXMgdGltZXIgcmVmZXJzIHRvLiBXZSBjYW4gdGhlbiBwbGFjZSB0aGUgY29ycmVjdAorCSAgcnVubmluZy10aW1lIGluIHRoZSBSZXRyYW5zbWlzc2lvbiBldmVudC4KKworMjAxMy0wOS0xOSAxNDowODo1NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGZpeCB3cml0YWJpbGl0eSBvZiBwcm9wZXJ0aWVzCisKKzIwMTMtMDktMTkgMTE6MzQ6NTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjEuOTAgPT09CisKKzIwMTMtMDktMTkgMTA6NTA6MjMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS4xLjkwCisKKzIwMTMtMDktMTkgMTA6MjE6NDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxMy0wOS0xOSAwOTo0NToxOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBwby9jcy5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vcGwucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSAgcG86IFVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAxMy0wOS0xMSAxNDoyNzowMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBkbWFidWYgaXMgbm90IGEgc2luZ2xldG9uIGFueW1vcmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDc3OTMKKworMjAxMy0wOS0xNiAxMzo1Mzo0NSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IGRvIG5vdCBkbyBodHRwIHJlcXVlc3RzIGluIFJFQURZCisJICBIRUFEIHJlcXVlc3RzIHRvIGRpc2NvdmVyIGlmIHRoZSBzZXJ2ZXIgaXMgc2Vla2FibGUgc2hvdWxkbid0IGJlIGRvbmUgaW4KKwkgIFJFQURZIGFzIGl0IG1pZ2h0IGxvY2sgdGhlIG1haW4gdGhyZWFkIHRoYXQgaXMgZG9pbmcgdGhlIHN0YXRlIGNoYW5nZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDUzNzEKKworMjAxMy0wOS0xOCAxNjozMjoyOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHJlZXZhbHVhdGUgdGhlIGN1cnJlbnQgdGltZXIgYWZ0ZXIgdGltZW91dAorCSAgV2hlbiB3ZSB0cmlnZ2VyIHRoZSB0aW1lb3V0IGxvZ2ljIG9mIGEgdGltZXIsIHJlZXZhbHVhdGUgaXQgYmVjYXVzZSBpdCBpcworCSAgcG9zc2libGUgdGhhdCBpdCBzdGlsbCBoYXMgdGhlIGxvd2VzdCB0aW1lb3V0LgorCisyMDEzLTA5LTE4IDE2OjMxOjI2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogZG9uJ3QgdXBkYXRlIHRpbWUgd2hlbiB1bnNjaGVkdWxlZAorCSAgRG9uJ3QgdHJ5IHRvIGVzdGltYXRlIHRoZSBjdXJyZW50IHRpbWUgd2hlbiB3ZSBnb3QgdW5zY2hlZHVsZWQuCisKKzIwMTMtMDktMTggMTY6Mjk6MzcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBpbml0IHBhY2tldCBzcGFjaW5nIG9uIGZpcnN0IGJ1ZmZlcgorCSAgQWxyZWFkeSBpbml0IHRoZSBwYWNrZXQgc3BhY2luZyB2YXJpYWJsZXMgb24gdGhlIGZpcnN0IGJ1ZmZlciBzbyB0aGF0IHdlIGNhbgorCSAgY2FsY3VsYXRlIHRoZSBzcGFjaW5nIG9uIHRoZSBzZWNvbmQgYnVmZmVyIGFscmVhZHkuCisKKzIwMTMtMDktMTggMTU6MDg6NDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgdGVzdHM6IGZpeCBjb21tZW50cworCisyMDEzLTA5LTE4IDE0OjU3OjA5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogcHVzaCB0aGUgbG9zdCBldmVudCBmcm9tIHRoZSB0aW1lciB0aHJlYWQKKwkgIEluc3RlYWQgb2YgcHVzaGluZyB0aGUgbG9zdCBldmVudCBmcm9tIHRoZSBjaGFpbiBmdW5jdGlvbiwgc2NoZWR1bGUgYSB0aW1lb3V0CisJICB0aGF0IHdpbGwgcHVzaCB0aGUgbG9zdCBldmVudCBmcm9tIHRoZSB0aW1lciB0aHJlYWQuIFRoaXMgYXZvaWQgYmxvY2tpbmcgdGhlCisJICB1cHN0cmVhbSB0aHJlYWQgd2hpbGUgd2UgcHVzaCBhbmQgc3luYyB0aGUgZXZlbnQuCisKKzIwMTMtMDktMTggMTQ6MjM6NTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBhZGQgYW5vdGhlciB0ZXN0CisJICBUaGUgdGVzdCBpcyBtb2RpZmllZCBzbGlnaHRseSBiZWNhdXNlIHRoZSBsYXRlIGxvc3QgcGFja2V0cyBhcmUgb25seQorCSAgZ2VuZXJhdGVkIG5vdyB3aGVuIGEgbGFyZ2UgZ2FwIGlzIHJlY2VpdmVkLgorCisyMDEzLTA5LTE4IDE0OjEyOjQ3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiByb3VuZCBnYXAgZHVyYXRpb24gdG8gbXVsdGlwbGUgb2YgZHVyYXRpb24KKwkgIE1ha2Ugc3VyZSB0aGUgZ2FwIGR1cmF0aW9uIGluIHRoZSBsb3N0IGV2ZW50IGlzIGEgbXVsdGlwbGUgb2YgdGhlIHBhY2tldAorCSAgZHVyYXRpb24uCisJICBFbmFibGUgYW5vdGhlciB0ZXN0LgorCisyMDEzLTA5LTE4IDEyOjI5OjM4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGtlZXAgdHJhY2sgb2YgZHVyYXRpb24KKwkgIEtlZXAgdHJhY2sgb2YgdGhlIGVzdGltYXRlZCBkdXJhdGlvbiBvZiBtaXNzaW5nIHBhY2tldHMgYW5kIHVzZSBpdCBpbiB0aGUgbG9zdAorCSAgZXZlbnQuCisJICBFbmFibGUgYW5vdGhlciB1bml0IHRlc3QKKworMjAxMy0wOS0xOCAxMTo1OToyOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogaGFuZGxlIGxhcmdlIGdhcHMgd2l0aCBvbmUgbG9zdCBldmVudAorCSAgV2hlbiB3ZSBoYXZlIGEgbGFyZ2UgbnVtYmVyIG9mIG1pc3NpbmcgcGFja2V0cywgZ2VuZXJhdGUgb25lIGxvc3QgZXZlbnQgZm9yIGFsbAorCSAgdGhlIHBhY2tldHMgdGhhdCBoYXZlIG5vIGNoYW5jZSBvZiBiZWluZyBwdXNoZWQgb3V0IGluIHRpbWUuCisJICBGaXggYW5kIGFjdGl2YXRlIHVuaXQgdGVzdCBmb3IgbGFyZ2UgZ2Fwcy4KKworMjAxMy0wOS0xOCAxMTo1NjozOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHJlZmFjdG9yIGxvc3QgZXZlbnQgc2VuZGluZworCSAgQWxzbyBtYWtlIHN1cmUgd2Ugb25seSBpbmNyZW1lbnQgdGhlIGV4cGVjdGVkIHNlcW51bSBhbmQgbGFzdAorCSAgb3V0cHV0IHRpbWVzdGFtcC4KKworMjAxMy0wOS0xNyAyMzoyMTowOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHJlZmFjdG9yIHRpbWVvdXQgdHJpZ2dlcnMKKworMjAxMy0wOS0xNyAyMzowMzo0NSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHNpbXBsaWZ5IHRoZSB0aW1lb3V0IGNvZGUKKwkgIEtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgdGltZSBpbiB0aGUgdGltZW91dCBsb29wLgorCSAgTG9vcCBvdmVyIGFsbCB0aW1lcnMgYW5kIHRyaWdnZXIgYWxsIHRoZSBleHBpcmVkIG9uZXMsIHdlIGNhbiBkbyB0aGlzIGluIHRoZQorCSAgc2FtZSBsb29wIHRoYXQgc2VsZWN0cyB0aGUgbmV3IGJlc3QgdGltZXIuCisKKzIwMTMtMDktMTcgMjM6MDE6MTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiByZWFycmFuZ2UgdGltZXIgdXBkYXRlIGNvZGUKKwkgIEFsc28gdXBkYXRlIHRoZSB0aW1lcnMgd2hlbiByZXRyYW5zbWlzc2lvbiBpcyBkaXNhYmxlZC4gV2UgbmVlZCB0bworCSAgZG8gdGhpcyBiZWNhdXNlIHdoZW4gd2UgYWRkZWQgTE9TVCB0aW1lcnMgd2hlbiB3ZSBkZXRlY3RlZCBtaXNzaW5nIHBhY2tldHMgYW5kCisJICB3ZSBuZWVkIHRvIHJlbW92ZSB0aG9zZSB0aW1lcnMgd2hlbiB0aGUgcGFja2V0IGZpbmFsbHkgYXJyaXZlcy4KKworMjAxMy0wOS0xNyAyMjowMjowNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvTWFrZWZpbGUuYW06CisJICB2aWRlb21peGVyOiBsaW5rIHRvIGxpYm0gZm9yIG1hdGhzIHN0dWZmCisJICBGaXhlcyB1bmRlZmluZWQgcmVmZXJlbmNlcyB0byByaW50IGFuZCBwb3cgb24gdWJ1bnR1CisJICBidWlsZCBib3QuCisKKzIwMTMtMDktMTcgMTU6MTk6NDIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiByZWxlYXNlIGxvY2sgb24gc2h1dGRvd24KKworMjAxMy0wOS0xNyAxNToxMTo0MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBjaGVjazogY2hhbmdlIGZvciB2aWRlb21peGVyIHJlbmFtZWQgb3JjIGZpbGUKKworMjAxMy0wOS0xNCAxNjowMzoyMCArMDIwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHJlbW92ZSBNQVhfVE9MRVJBVEVEX0xBVEVORVNTCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3NDExCisKKzIwMTMtMDktMTYgMTU6NTQ6MzcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2NC1ydHguc2g6CisJICBleGFtcGxlczogd2UgZG9uJ3QgbmVlZCB0aGUgcXVldWUgYW55bW9yZQorCisyMDEzLTA5LTE2IDE1OjUzOjQ3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogdXNlIHNlcGFyYXRlIHRocmVhZCBmb3IgdGltZW91dHMKKwkgIFVzZSBhIHNlcGFyYXRlIHRocmVhZCBmb3Igc2NoZWR1bGluZyB0aGUgdGltZW91dHMgaW5zdGVhZCBvZiB1c2luZyB0aGUKKwkgIGRvd25zdHJlYW0gc3RyZWFtaW5nIHRocmVhZCB0aGF0IG1pZ2h0IGJsb2NrIGF0IGFueSB0aW1lLgorCisyMDEzLTA5LTE0IDE1OjU2OjA0ICswMjAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogc2V0IGZpcnN0X3RzIHRvIERUUyBmb3Igc3RyZWFtcyB0aGF0IGhhdmUgRFRTCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3MzQwCisKKzIwMTMtMDktMTQgMTU6NTU6MjIgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBtYWtlIHN1cmUgZHVyYXRpb24gaXMgYSB2YWxpZCBudW1iZXIgZm9yIGxhc3QgYnVmZmVyCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3MzQwCisKKzIwMTMtMDktMTQgMTU6NTQ6MjkgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiB1c2Ugc2VnbWVudC5zdGFydCBvciBsYXN0IGJ1ZmZlciBlbmQgdGltZSBpbiBjYXNlIG9mIG1pc3NpbmcgRFRTCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3MzQwCisKKzIwMTMtMDktMDMgMTg6MTQ6MDQgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIFJldmVydCBxdG11eDogVXNlIGJ1ZmZlciBQVFMgaWYgRFRTIGlzIG5vdCBzZXQiCisJICBUaGlzIHJldmVydHMgY29tbWl0IGY3MmMzY2Y3MWZkZTYyMjA2N2Y0MWYzMWE1Mzk3OGJhNGM5NDQ2OWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3MzQwCisKKzIwMTMtMDktMTYgMTE6MDM6MDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy1kaXN0LmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyb3JjLWRpc3QuaDoKKwkgIHZpZGVvbWl4ZXI6IFVwZGF0ZSBvcmMgZ2VuZXJhdGVkIGZpbGVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA4MTMxCisKKzIwMTMtMDktMTMgMTY6MjU6NDkgKzAyMDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIHJ0cHNlc3Npb246IERlbXV4IFJUQ1AgYnVmZmVycyBmcm9tIHRoZSBSVFAgc3RyZWFtCisJICBJZiB0aGVyZSBhcmUgUlRDUCBidWZmZXJzIGluIHRoZSBSVFAgc3RyZWFtLCBwcm9jZXNzIHRoZW0gYXMKKwkgIFJUQ1AuIFRoaXMgd2F5LCB3ZSB3YW50IHJlY2VpdmUgc3RyZWFtcyBmb2xsb3dpbmcgUkZDIDU3NjEKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc2NTcKKworMjAxMy0wOS0xMyAyMzoyNjoyMSArMTAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBnc3QvcnRwL2dzdHJ0cEwyNGRlcGF5LmM6CisJICBydHA6IFJlbW92ZSBib2d1cyBleHRyYSBjYXBzIGZyb20gTDI0IHRlbXBsYXRlLgorCSAgVGhlIGV4dHJhIGNhcHMgZW50cnkgaW4gdGhlIHRlbXBsYXRlIHdhcyBtYWtpbmcgaXQgc29tZXRpbWVzCisJICBnZXQgcGx1Z2dlZCBmb3IgYW55IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBwYXlsb2FkIHR5cGUuCisKKzIwMTMtMDktMTMgMTI6NDA6NDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgcnRwYmluOiB1c2UgUGFja2V0SW5mbyBmb3IgdGhlIHNlbmRlcgorCSAgQXZvaWQgbWFwcGluZyB0aGUgcGFja2V0IG11bHRpcGxlIHRpbWVzIHdoZW4gc2VuZGluZyBSVFAuCisKKzIwMTMtMDktMTMgMTI6MjI6MzYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgcnRwYmluOiBzdG9yZSBtb3JlIGluIHRoZSBQYWNrZXRJbmZvCisJICBTdG9yZSBhbGwgaW5mbyBpbiB0aGUgUGFja2V0SW5mbyBzbyB0aGF0IHdlIGNhbiBhdm9pZCBtYXBwaW5nIHRoZSBwYWNrZXQKKwkgIG11bHRpcGxlIHRpbWVzLgorCisyMDEzLTA5LTEzIDExOjMyOjUyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgc2Vzc2lvbjogc3RvcmUgbW9yZSBpbiB0aGUgUGFja2V0SW5mbyBzdHJ1Y3R1cmUKKworMjAxMy0wOS0xMyAxMTowODo1NSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmg6CisJICBydHBiaW46IFJUUEFycml2YWxTdGF0cyAtPiBSVFBQYWNrZXRJbmZvCisJICBSZW5hbWUgYSBzdHJ1Y3R1cmUgYmVjYXVzZSB3ZSBhcmUgYWxzbyBnb2luZyB0byB1c2UgdGhpcyBmb3IgdGhlIHNlbmRlcgorCSAgYml0cy4KKworMjAxMy0wOS0xMyAxMDo1NTozMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIHNvdXJjZTogc21hbGwgY2xlYW51cHMKKworMjAxMy0wOS0xMiAxMzozMTowMSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IG9ubHkgdXBkYXRlIHN0b3AgcG9zaXRpb24gaWYgc2VlayByZXF1ZXN0cyBpdAorCSAgQ2hlY2sgZm9yIEdTVF9TRUVLX1RZUEVfTk9ORSBmb3Igc3RvcCBwb2lzdGlvbiBhbmQgb25seSB1cGRhdGUKKwkgIHRoZSBzdG9wIHRpbWUgaWYgaXQgaXMgcmVxdWVzdGVkLiBPdGhlcndpc2UganVzdCBtYWludGFpbiB3aGF0ZXZlcgorCSAgd2FzIHN0b3JlZCBhdCB0aGUgc2VnbWVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzUzMAorCisyMDEzLTA5LTEzIDA4OjUzOjI1ICswMjAwICBSaWNvIFR6c2NoaWNoaG9seiA8cmljb3R6QHVidW50dS5jb20+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICBydHA6IEFkZCBtaXNzaW5nIGhlYWRlcnMgdHAgZml4IG1ha2UgZGlzdAorCSAgSW4gYWRkaXRpb24gdG8gYTk1NmE2Y2ViMmRlYjg3Y2MxMzYxYWVlMWQ2NjI2NDQ5ZjQ2ZGFiMgorCisyMDEzLTA5LTEyIDE1OjA3OjQ4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IE1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBkYXRhIHRvIHJlYWQgaW1hZ2UgdGFncworCSAgVGhhbmtzIHRvIGlwdXRpbmVpIGZvciByZXBvcnRpbmcgdGhpcyBvbiBJUkMuCisKKzIwMTMtMDktMTIgMTU6MDE6MzYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBoYW5kbGUgc2VnbWVudHMgd2l0aCBub24tMCBzdGFydAorCSAgV2Uga2VlcCB0aGUgRFRTIGFuZCBQVFMgaW4gcnVubmluZy10aW1lIGluc2lkZSB0aGUgaml0dGVyYnVmZmVyLiBNYWtlIHN1cmUgdG8KKwkgIHRyYW5zZm9ybSBpdCBiYWNrIHRvIGEgYnVmZmVyIHRpbWVzdGFtcCBiZWZvcmUgcHVzaGluZyBvdXQgdGhlIGJ1ZmZlci4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDc5MzEKKworMjAxMy0wOS0xMSAxMzoxMTo1OCAtMDYwMCAgU2XDoW4gZGUgQsO6cmNhIDxsZWZ0bW9zdGNhdEBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogRml4IG9mZi1ieS1vbmUgaW4gdmFsaWRhdGlvbiBvZiBVVEYtOAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzkzMworCisyMDEzLTA5LTExIDE0OjMyOjE3IC0wMzAwICBUaGliYXVsdCBTYXVuaWVyIDx0aGliYXVsdC5zYXVuaWVyQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBEbyBub3QgY2hlY2sgaWYgY2FwcyBhcmUgZW1wdHkgd2hlbiB0aGV5IGFyZSBOVUxMCisJICBJbiB0aGUgY2FzZSB0aGUgY2FwcyBhcmUgYWN0dWFsbHkgTlVMTCwgd2Ugc2hvdWxkIGp1c3QgY29uY2lkZXIgaXQgdGhlCisJICBzYW1lIHdheSBhcyBlbXB0eSBjYXBzIGluIHRoYXQgY2FzZS4KKworMjAxMy0wOS0xMCAxNjo0NDo1MyAtMDYwMCAgU2XDoW4gZGUgQsO6cmNhIDxsZWZ0bW9zdGNhdEBnbWFpbC5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXJvcmMtZGlzdC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy1kaXN0Lmg6CisJICB2aWRlb21peGVyOiBmaXggYnVpbGQgaWYgb3JjIGlzIG5vdCBpbnN0YWxsZWQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDc4ODYKKworMjAxMy0wOS0xMCAxNzo1Nzo0OSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IFByZXNlcnZlIHNlcW51bSB3aGVuIHB1c2hpbmcgc2VlayB1cHN0cmVhbQorCSAgQWZ0ZXIgY29udmVydGluZyBhIHNlZWsgZnJvbSB0aW1lIHRvIGJ5dGVzLCB1c2UgdGhlIHNhbWUgc2VxbnVtCisJICBvbiB0aGUgZXZlbnQgdGhhdCBnb2VzIHVwc3RyZWFtCisKKzIwMTMtMDktMDUgMDA6MTc6MTYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiB0cmFjayBzdHJlYW1zIHRoYXQgYXJlIEVPUyBvbiBwdXNoIG1vZGUgdG8gZmluaXNoIGVhcmxpZXIKKwkgIFdoZW4gdGhlIHNlZ21lbnQgaGFzIGEgZGVmaW5lZCBzdG9wIHBvc2l0aW9uLCBxdGRlbXV4IHNob3VsZCBjaGVjaworCSAgd2hlbiBzdHJlYW1zIHJlYWNoIHRoaXMgcG9zaXRpb24gYW5kIG1hcmsgdGhvc2UgYXMgRU9TLiBXaGVuIGFsbAorCSAgc3RyZWFtcyBhcmUgRU9TIGl0IHdpbGwgcmV0dXJuIEdTVF9GTE9XX0VPUyB0byB1cHN0cmVhbSB0byBhbGxvdworCSAgdGhlIHBpcGVsaW5lIHRvIGZpbmlzaCBpbnN0ZWFkIG9mIGNvbnRpbnVvdXNseSBjb25zdW1lIGJ1ZmZlcnMKKwkgIGZyb20gdXBzdHJlYW0gdGhhdCBhcmUgbm90IHVzZWZ1bCBmb3IgdGhlIHNlZ21lbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3NTMwCisKKzIwMTMtMDktMDQgMTU6MzQ6MzUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IHByZXNlcnZlIHN0b3Agb2Ygc2VnbWVudCB3aGVuIGRvaW5nIHNlZWtzIGluIHB1c2ggbW9kZQorCSAgV2hlbiBoYW5kbGluZyBzZWVrcyBpbiBwdXNoIG1vZGUsIHF0ZGVtdXggY29udmVydHMgdGhlIHNlZWsgdG8gYnl0ZXMKKwkgIGFuZCBwdXNoZXMgdXBzdHJlYW0uIEl0IG5lZWRzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHNlZWsgYW5kIHRoZQorCSAgc3Vic2VxdWVudCBzZWdtZW50IHRvIGJlIGFibGUgdG8gbWFwIHRoZW0gYmFjayB0byB0aGUgcmVxdWVzdGVkCisJICBzZWVrIHRpbWUgYW5kIHByb3Blcmx5IHByZXNlcnZlIHRoZSBzZWdtZW50IHN0b3Agb2YgdGhlIHNlZWsuCisJICBUaGlzIGlzIGRvbmUgYnkgdXNpbmcgdGhlIHN0YXJ0IG9mZnNldCBpbiBieXRlcyBvZiB0aGUgc2VlaywKKwkgIHRoYXQgc2hvdWxkIGJlIHRoZSBzYW1lIG9mIHRoZSBzZWdtZW50IGZyb20gdXBzdHJlYW0uIEFuZCB0aGlzCisJICBpcyBhbHNvIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggd2hhdCBxdGRlbXV4IGFscmVhZHkgd2FzIHVzaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzUzMAorCisyMDEzLTA3LTI2IDE5OjQwOjUzICswMjAwICBNYXRoaWV1IER1cG9uY2hlbGxlIDxtYXRoaWV1LmR1cG9uY2hlbGxlQGVwaXRlY2guZXU+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMnBhZC5oOgorCSAgdmlkZW9taXhlcjogQWRkIGNvbG9yc3BhY2UgY29udmVyc2lvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNDk1MAorCisyMDEzLTA4LTA2IDE1OjM4OjM5ICswMjAwICBNYXRoaWV1IER1cG9uY2hlbGxlIDxtYXRoaWV1LmR1cG9uY2hlbGxlQGVwaXRlY2guZXU+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBEb24ndCBzZW5kIHJlY29uZmlndXJlIGV2ZW50IHdoZW4gZm9ybWF0cyBvciBQQVIgYXJlIGRpZmZlcmVudAorCSAgSXQgaXMgcmFjeSB3aXRoIG11bHRpcGxlIHBhZHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA0OTUwCisKKzIwMTMtMDctMjUgMTM6NDk6NTcgKzAyMDAgIE1hdGhpZXUgRHVwb25jaGVsbGUgPG1hdGhpZXUuZHVwb25jaGVsbGVAZXBpdGVjaC5ldT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRvcmMub3JjOgorCSogZ3N0L3ZpZGVvbWl4ZXIvZ3N0Y21zLmM6CisJKiBnc3QvdmlkZW9taXhlci9nc3RjbXMuaDoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvY29udmVydC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9jb252ZXJ0Lmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy5vcmM6CisJICB2aWRlb21peGVyOiBCdW5kbGUgcHJpdmF0ZSBjb3BpZXMgb2YgdmlkZW9jb252ZXJ0IGNvZGUKKwkgIElkZWFsbHksIHRoaXMgd291bGQgYmUgcGFydCBvZiBsaWJnc3R2aWRlby4KKwkgIFByZWZpeGVzIHZpZGVvY29udmVydCBzeW1ib2xzIHdpdGggdmlkZW9taXhlcl8uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA0OTUwCisKKzIwMTMtMDgtMjIgMDA6MDM6NDggKzAyMDAgIE1hdGhpZXUgRHVwb25jaGVsbGUgPG1hdGhpZXUuZHVwb25jaGVsbGVAZXBpdGVjaC5ldT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IFVzZSBuZXdseSAjZGVmaW5lZCBtZXRhZGF0YSBuYW1lcy4KKworMjAxMy0wOS0wOSAxNToxMTo1MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogb25seSB3YWl0IGlmIHdlIGZsdXNoZWQKKwkgIE9ubHkgd2FpdCBmb3IgdGhlIFNUUkVBTV9MT0NLIHdoZW4gd2UgZmx1c2hlZCBzb21ldGhpbmcgd2hlbiBzZW5kaW5nCisJICBhIGNvbW1hbmQgZm9yIFBBVVNFRCBvciBQTEFZSU5HLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzYxMQorCisyMDEzLTA5LTA5IDE1OjA5OjQxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiByZXR1cm4gd2hlbiBhIGZsdXNoIHdhcyBpc3N1ZWQKKwkgIE1ha2UgZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCgpIHJldHVybiBUUlVFIHdoZW4gdGhlIGN1cnJlbnQKKwkgIGFjdGlvbiBoYXMgYmVlbiBmbHVzaGVkCisKKzIwMTMtMDktMDkgMTE6MTY6NDAgKzAyMDAgIERhdmlkIEhvbHJveWQgPGRhdmVAYmFkZ2Vycy1pbi1mb2lsLmNvLnVrPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDI0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDI0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwTDI0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cEwyNHBheS5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHJ0cDogYWRkIEwyNCBwYXkgYW5kIGRlcGF5bG9hZGVyCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3NzM0CisKKzIwMTMtMDktMDkgMTQ6NDY6NDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBGaXggbWlzc2luZyBjb25kaXRpb24gaW4gcHJldmlvdXMgY29tbWl0CisKKzIwMTMtMDktMDkgMTQ6NDQ6NTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBBbHNvIGZpeCBzdHJpZGVzIGZvciBvdGhlciBzZW1pLXBsYW5hciB2aWRlbyBmb3JtYXRzCisKKzIwMTMtMDktMDkgMTQ6NDE6NDIgKzAyMDAgIEFuZHJlZWEgRnVsZ2VyIDxhbmRyZWVhLmZ1bGdlckBwYXJyb3QuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IEZpeCBzdHJpZGUgZm9yIE5WMTIvTlYyMQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzc1OAorCisyMDEzLTA5LTA3IDE2OjM3OjAzICswMjAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thZGVtdXg6IGZpeCBsZWFraW5nIGJ1ZmZlciBhbmQgY2FwcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzY4OAorCisyMDEzLTA5LTA1IDE5OjQ2OjM3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBmaXggYnVpbGQgb24gd2luMzIKKwkgIGdzdHVkcHNyYy5jOjg1NToxNTogZXJyb3I6ICNpZiB3aXRoIG5vIGV4cHJlc3Npb24KKworMjAxMy0wOS0wNCAxNTo1MDo0MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGhhbmRsZSB1bnNlZWthYmxlIHN0cmVhbXMKKwkgIEhhbmRsZSBzdHJlYW1zIHRoYXQgd2UgY2FuJ3Qgc2VlayBpbiBhbmQgaWdub3JlIHRoZW0gaW4gdGhlCisJICBzZWVrIGxvZ2ljLgorCisyMDEzLTA5LTA0IDE1OjI1OjM5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogb25seSBjaGVjayB2aWRlbyBjb21wcmVzc2lvbiBmb3IgdmlkZW8gc3RyZWFtcworCSAgT3IgZWxzZSB3ZSBtaWdodCBkZXJlZiBhIHN0cmVhbSB3aXRoIGEgTlVMTCBzdHJmLnZpZHMgYW5kIHNlZ2ZhdWx0CisKKzIwMTMtMDYtMTggMTM6Mjc6MjAgKzAxMDAgIEFsZXggQXNobGV5IDxidWd6aWxsYUBhc2hsZXktZmFtaWx5Lm5ldD4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSogZ3N0L2lzb21wNC9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvZnR5cGNjLmg6CisJKiBnc3QvaXNvbXA0L2dzdHJ0cHhxdGRlcGF5LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF90eXBlcy5jOgorCSAgcXRkZW11eDogQWRkIHN1cHBvcnQgZm9yIHRoZSBhdmMzIHNhbXBsZSBlbnRyeSBmb3JtYXQgb2YgdGhlIEFWQyBmaWxlIGZvcm1hdAorCSAgQW1lbmRtZW50IDIgb2YgSVNPL0lFQyAxNDQ5Ni0xNSAoQVZDIGZpbGUgZm9ybWF0KSBpcyBkZWZpbmluZyBhIG5ldworCSAgc3RydWN0dXJlIGZvciBmcmFnbWVudGVkIE1QNCBjYWxsZWQgImF2YzMiLiBUaGUgcHJpbmNpcGFsIGRpZmZlcmVuY2UKKwkgIGJldHdlZW4gQVZDMSBhbmQgQVZDMyBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIGNvZGVjIGluaXRpYWxpc2F0aW9uCisJICBkYXRhIChlLmcuIFNQUywgUFBTKS4gSW4gQVZDMSB0aGlzIGRhdGEgaXMgcGxhY2VkIGluIHRoZSBpbml0aWFsCisJICBNT09WIGJveCAobW9vdi50cmFrLm1kaWEubWluZi5zdGJsLnN0c2QuYXZjMSkgYnV0IGluIEFWQzMgdGhpcyBkYXRhCisJICBnb2VzIGluIHRoZSBmaXJzdCBzYW1wbGUgb2YgZXZlcnkgZnJhZ21lbnQgKGkuZS4gdGhlIGZpcnN0IHNhbXBsZSBpbgorCSAgZWFjaCBtZGF0IGJveCkuICBUaGUgcHJpbmNpcGFsIHJlYXNvbiBmb3IgYXZjMyBpcyB0byBtYWtlIGl0IGVhc2llcgorCSAgZm9yIGNsaWVudCBpbXBsZW1lbnRhdGlvbnMsIGJlY2F1c2UgaXQgcmVtb3ZlcyB0aGUgcmVxdWlyZW1lbnQgdG8KKwkgIGluc2VydCB0aGUgU1BTK1BQUyBpbiB0byB0aGUgZGVjb2RlciBwaXBlbGluZSBldmVyeSB0aW1lIHRoZXJlIGlzIGEKKwkgIHJlcHJlc2VudGF0aW9uIGNoYW5nZS4KKwkgIFRoaXMgY29tbWl0IGFkZHMgc3VwcG9ydCBmb3IgdGhlICJhdmMzIiBhdG9tLCB3aGljaCBpcyBhbG1vc3QgaWRlbnRpY2FsCisJICB0byB0aGUgImF2YzEiIGF0b20sIGV4Y2VwdCBpdCBkb2VzIG5vdCBjb250YWluIGFueSBTUFMgb3IgUFBTIGRhdGEuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAyMDA0CisKKzIwMTMtMDktMDQgMDA6Mjc6NTAgKzAyMDAgIE1hdGhpZXUgRHVwb25jaGVsbGUgPG1hdGhpZXUuZHVwb25jaGVsbGVAZXBpdGVjaC5ldT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXI6IERvbid0IHNldCBFT1MgdG8gRkFMU0Ugd2hlbiB0aGUgY29sbGVjdHBhZCAqaXMqIEVPUworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzIzOAorCisyMDEzLTA5LTAzIDE3OjMyOjQxICswMjAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBjbGVhbnVwIG9uIGVycm9yIGFmdGVyIHN0YXRlIGNoYW5nZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzIyOQorCisyMDEzLTA5LTAzIDExOjIzOjI0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCSAgdWRwc3JjOiBCaW5kIHRvIG11bHRpY2FzdCBhZGRyZXNzZXMgb24gbm9uLVdpbmRvd3Mgc3lzdGVtcworCSAgT24gV2luZG93cyBpdCdzIG5vdCBwb3NzaWJsZSB0byBiaW5kIHRvIGEgbXVsdGljYXN0IGFkZHJlc3MKKwkgIGJ1dCB0aGUgT1Mgd2lsbCBtYWtlIHN1cmUgdG8gZmlsdGVyIG91dCBhbGwgcGFja2V0cyB0aGF0CisJICBhcnJpdmUgbm90IGZvciB0aGUgbXVsdGljYXN0IGFkZHJlc3MgdGhlIHNvY2tldCBqb2luZWQuCisJICBPbiBMaW51eCBhbmQgb3RoZXJzIGl0IGlzIG5lY2Vzc2FyeSB0byBiaW5kIHRvIGEgbXVsdGljYXN0CisJICBhZGRyZXNzIHRvIGxldCB0aGUgT1MgZmlsdGVyIG91dCBhbGwgcGFja2V0cyB0aGF0IGFyZSByZWNlaXZlZAorCSAgb24gdGhlIHNhbWUgcG9ydCBidXQgZm9yIGRpZmZlcmVudCBhZGRyZXNzZXMgdGhhbiB0aGUgbXVsdGljYXN0CisJICBhZGRyZXNzCisJICBBbmQgZGVwcmVjYXRlIHRoZSBtdWx0aWNhc3QtZ3JvdXAgcHJvcGVydHkgYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUKKwkgIGFkZHJlc3MgcHJvcGVydHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3MDQyCisKKzIwMTMtMDktMDMgMTA6MTA6MDEgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IEZyZWUgR3N0QmFzZVBhcnNlRnJhbWUgaWYgcHVzaGluZyBhIGhlYWRlciBmYWlsZWQKKworMjAxMy0wOS0wMiAxNjowMjozNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBSZWZhY3RvciBhZGRyZXNzIHJlc29sdmFsIGludG8gaXRzIG93biBmdW5jdGlvbgorCisyMDEzLTA5LTAyIDIzOjAwOjI5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJICByZXBsYXlnYWluOiBmaXggdGFnbGlzdCBsZWFrIGluIHJnYW5hbHlzaXMKKwkgIEFuZCBhZGQgc29tZSBGSVhNRXMuCisKKzIwMTMtMDktMDIgMjI6NTA6NTggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzoKKwkgIHRlc3RzOiByZ2FuYWx5c2lzOiByZW5hbWUgZnVuY3Rpb24gZm9yIGNsYXJpdHkKKworMjAxMy0wMy0xOCAxNDozMjowNyArMDEwMCAgQ2hyaXN0b3BoIFJlaXRlciA8cmVpdGVyLmNocmlzdG9waEBnbWFpbC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzoKKwkgIHRlc3RzOiBmaXggc2tpcHBlZCByZ2FuYWx5c2lzIHRlc3RzCisJICBJbiAwLjEwIGVsZW1lbnRzIHdvdWxkIHBvc3QgdGFnIG1lc3NhZ2VzIG9uIHRoZSBidXMKKwkgIGRpcmVjdGx5LCBhbmQgcmdhbmFseXNpcyB3b3VsZCBvbmx5IHBvc3QgYSB0YWcgbWVzc2FnZQorCSAgd2hlbiBpdCBjaGFuZ2VkIHRhZ3MuIEluIDEuMCwgb25seSBzaW5rcyBwb3N0IHRhZworCSAgbWVzc2FnZXMgd2hlbiB0aGV5IHJlY2VpdmUgdGhlIHNlcmlhbGlzZWQgdGFnIGV2ZW50LgorCSAgVGhpcyBtZWFucyB0aGF0IHdlIGdldCBhbiBhZGRpdGlvbmFsIHRhZyBtZXNzYWdlIG9uCisJICB0aGUgYnVzIG5vdyB3aGVyZSB3ZSBkaWRuJ3QgZXhwZWN0IG9uZSBiZWZvcmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1MDkwCisKKzIwMTMtMDktMDIgMTE6NDY6NTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogUHJvcGVybHkgcHJvcGFnYXRlIGRvd25zdHJlYW0gZmxvdyByZXR1cm5zIHVwc3RyZWFtCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3MjI5CisKKzIwMTMtMDktMDEgMjE6MTg6MzggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmM6CisJKiBnc3QvYXZpL2dzdGF2aS5jOgorCSogZ3N0L2lzb21wNC9pc29tcDQtcGx1Z2luLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW8uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkgIERvbid0IHVzZSBzZXRsb2NhbGUgaW4gcGx1Z2lucygpCisJICBPbmx5IGFwcHMgc2hvdWxkIGNhbGwgc2V0bG9jYWxlKCksIG5vdCBsaWJyYXJpZXMuCisKKzIwMTMtMDgtMjkgMTM6MTU6MTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2cGF5LmM6CisJICBydHBtcHZwYXk6IEZpeCBSVFAgYnVmZmVyIGFsbG9jYXRpb24gaW4gcnRwbXB2cGF5CisJICBSVFAgYnVmZmVyIGFsbG9jYXRpb24gc2hvdWxkIG5vdCBiZSBkb25lIHdpdGggcGFkZGluZyBmb3IgdGhlIHNwZWNpZmljIE1QRUcyCisJICBoZWFkZXIgYXMgdGhlIHBhZGRpbmcgaXMgZG9uZSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgYW5kIHRoZSBsYXN0IGJ5dGUgaXMKKwkgIHRoZSBzaXplIG9mIHRoZSBwYWRkaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNjk3MAorCisyMDEzLTA4LTI4IDEwOjUxOjMyICswMjAwICBCZXJuaGFyZCBNaWxsZXIgPGJlcm5oYXJkLm1pbGxlckBzdHJlYW11bmxpbWl0ZWQuY29tPgorCisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmg6CisJICBhdXRvdmlkZW9zaW5rOiBhZGQgc3luYyBwcm9wZXJ0eQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNjk1NQorCisyMDEzLTA4LTI4IDA3OjE1OjAwICswMjAwICBCZXJuaGFyZCBNaWxsZXIgPGJlcm5oYXJkLm1pbGxlckBzdHJlYW11bmxpbWl0ZWQuY29tPgorCisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmg6CisJICBhdXRvYXVkaW9zaW5rOiBpbnRyb2R1Y2Ugc3luYyBwcm9wZXJ0eQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNjk1NQorCisyMDEzLTA4LTI3IDE3OjMzOjQwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcHVzaCBidWZmZXJzIGFmdGVyIHNlZ21lbnQgc3RvcCB1bnRpbCByZWFjaGluZyBhIGtleWZyYW1lCisJICBUaGlzIHNob3VsZCBtYWtlIGRlY29kZXJzIGFibGUgdG8gcHJlY2lzZWx5IHB1c2ggYnVmZmVycyB1bnRpbCB0aGUgc3RvcAorCSAgdGltZSBpbiBjYXNlIHRoZXkgbmVlZCB0aGUgbmV4dCBrZXlmcmFtZSB0byBkbyBpdC4KKwkgIEFsc28sIGFjY29yZGluZyB0byBnc3Rfc2VnbWVudF9jbGlwLCBpdCBzaG91bGQgb25seSBwdXNoIGEgYnVmZmVyIHRoYXQKKwkgIHRoZSBzdGFydGluZyB0cyBpcyBzdHJpY3RseSBzbWFsbGVyIHRoYW4gdGhlIHNlZ21lbnQgc3RvcCwgc28gd2UgY2hhbmdlCisJICB0aGUgbWluIDwgY29tcGFyaXNvbiBmb3IgPD0KKworMjAxMy0wOC0yOCAxMzoyNjo0NyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisKKz09PSByZWxlYXNlIDEuMS40ID09PQorCisyMDEzLTA4LTI4IDEyOjUyOjI1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdnB4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiBnc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hb3JjLWRpc3QuYzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS4xLjQKKworMjAxMy0wOC0yOCAxMjo1MjoxNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDEzLTA4LTI4IDEyOjMyOjEwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIHBvL3B0X0JSLnBvOgorCSAgcG86IHVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAxMy0wOC0yNyAxNToyNToxNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2EtbXV4OiByZW1vdmUgZnJhbWVyYXRlIHJlc3RyaWN0aW9uCisJICBSZW1vdmUgdGhlIGZyYW1lcmF0ZSByZXN0cmljdGlvbiBvbiB0aGUgY2Fwcy4KKworMjAxMy0wOC0yNyAwOTozODoxNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogb25seSB1cGRhdGUgbmV4dCBjaGVjayB0aW1lIHdoZW4gcmVjb25zaWRlcmluZworCSAgRG9uJ3QgdXBkYXRlIHRoZSBuZXh0IFJUQ1AgY2hlY2sgdGltZSBpbiBhbGwgY2FzZXMgYnV0IG9ubHkgd2hlbiB3ZQorCSAgcmVjb25zaWRlcmVkLiBUaGlzIGF2b2lkcyBkZWxheWluZyBzZW5kaW5nIGEgZnVsbCBSVENQIHBhY2tldCB3aGVuIHdlCisJICBhcmUgZG9pbmcgZWFybHkgZmVlZGJhY2suCisKKzIwMTMtMDgtMjcgMDk6Mzc6MzMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHNlc3Npb246IGFkZCBtb3JlIGRlYnVnCisKKzIwMTMtMDgtMjcgMDk6MzQ6NDYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgaml0dGVyYnVmZmVyOiBmaXggdHlwZXMgb2YgdGhlIHJldHJhbnNtaXNzaW9uIGV2ZW50CisKKzIwMTMtMDgtMjcgMDk6MzM6MDMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBvbmx5IHRpbWVvdXQgRVhQRUNURUQgdGltZXJzIG9uIGdhcAorCSAgT25seSB0aW1lb3V0IHRoZSBFWFBFQ1RFRCB0aW1lcnMgd2hlbiB3ZSBkZXRlY3QgYSBsYXJnZSBzZXFudW0gZ2FwLgorCisyMDEzLTA4LTI2IDEzOjQ3OjUzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZS5hYzogRG9uJ3Qgc2V0IEJaMl9MSUJTIGlmIGJ6MiBpcyBub3QgZm91bmQKKworMjAxMy0wOC0yNiAxMTo1MDoyNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRzZXNzaW9uOiBmaXggbG9ja2luZworCSAgV2UgbmVlZCB0byB0YWtlIHRoZSBzZXNzaW9uIGxvY2sgd2hlbiBnZXR0aW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlCisJICBzb3VyY2UuCisKKzIwMTMtMDgtMjYgMTE6NTA6MTMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGFkZCBzb21lIG1vcmUgZGVidWcKKworMjAxMy0wOC0yMCAyMjoxMjowMyArMDIwMCAgTWF0aGlldSBEdXBvbmNoZWxsZSA8bWF0aGlldS5kdXBvbmNoZWxsZUBlcGl0ZWNoLmV1PgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogZG9uJ3Qgc2VuZCBmbHVzaF9zdG9wIHR3aWNlLgorCSAgSWYgd2UgZ2V0IGZsdXNoIHN0YXJ0IGFuZCBhIHNlZWsgd2UgbmVlZCB0byBvbmx5IHNlbmQgZmx1c2hfc3RvcCBvbmNlLgorCSAgTW9yZSBpbmZvIGF0ICM3MDY0NDEKKworMjAxMy0wOC0yMyAxNTo1Njo0MyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5oOgorCSAgbXVsdGlwYXJ0ZGVtdXg6IHByb3BhZ2F0ZSBkaXNjb250CisKKzIwMTMtMDgtMjMgMTU6NDk6NDcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkgIG11bHRpcGFydGRlbXV4OiByZW1vdmUgZHluYW1pYyBzb3VyY3BhZHMgd2hlbiBnb2luZyBmcm9tIFBBVVNFRCB0byBSRUFEWQorCisyMDEzLTA4LTIzIDE1OjI5OjI4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4Lmg6CisJICBtdWx0aXBhcnRkZW11eDogdGltZXN0YW1wIG91dHB1dCBidWZmZXJzIGJhc2VkIG9uIGZpcnN0IGlucHV0IGJ1ZmZlciB0aGF0IHByb3ZpZGVkIGJ5dGVzIG5vdCBsYXN0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjM3NzU0CisKKzIwMTMtMDgtMjMgMTU6NDc6MjUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHF1ZXVlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhxdWV1ZS5oOgorCSAgcnR4cXVldWU6IGFkZCBwcm9wZXJ0eSB0byBjb25maWd1cmUgcXVldWUgc2l6ZQorCisyMDEzLTA4LTIzIDEyOjA3OjU1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjQtcnR4LnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1WVFMtSDI2NC1ydHguc2g6CisJICB0ZXN0czogYWRkIHJldHJhbnNtaXNzaW9uIGV4YW1wbGUKKworMjAxMy0wOC0yMyAxMTo1NTowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgIHJ0cGJpbjogcHJveHkgaml0dGVyYnVmZmVyIGRvLXJldHJhbnNtaXNzaW9uIHByb3BlcnR5CisKKzIwMTMtMDgtMjMgMTE6MTc6NDUgKzAyMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiB1bm1hcCB0aGUgY29ycmVjdCBidWZmZXIKKwkgIFRoZSBhdWRpbyBidWZmZXIgd2FzIG1hcHBlZCBzbyB1bm1hcCBpdCBhbmQgbm90IHRoZSB2aWRlbyBidWZmZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDY2NDIKKworMjAxMy0wOC0xOCAyMzozMjoyMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSAgcHVsc2VzaW5rOiBBZGQgcHJvcGVydHkgdG8gZmluZCBvdXQgdGhlIGRldmljZSBjdXJyZW50bHkgaW4gdXNlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTkwNzY4CisKKzIwMTMtMDgtMTggMjM6MzE6MTUgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogRGUtZHVwbGljYXRlIGNvZGUgdG8gZ2V0IHRoZSBjdXJyZW50IHNpbmsgaW5wdXQgaW5mbworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU5MDc2OAorCisyMDEzLTA4LTE4IDIyOjI3OjM3IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IEltcGxlbWVudCBjaGFuZ2luZyB0aGUgZGV2aWNlIHdoaWxlIHBsYXlpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD01OTA3NjgKKworMjAxMy0wOC0xOCAyMzozMjoyMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuaDoKKwkgIHB1bHNlc3JjOiBBZGQgcHJvcGVydHkgdG8gZmluZCBvdXQgdGhlIGRldmljZSBjdXJyZW50bHkgaW4gdXNlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTkwNzY4CisKKzIwMTMtMDgtMTggMjM6MzE6MTUgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2VzcmM6IERlLWR1cGxpY2F0ZSBjb2RlIHRvIGdldCB0aGUgY3VycmVudCBzb3VyY2Ugb3V0cHV0IGluZm8KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD01OTA3NjgKKworMjAxMy0wOC0xOCAyMjoyNzozNyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogSW1wbGVtZW50IGNoYW5naW5nIHRoZSBkZXZpY2Ugd2hpbGUgcGxheWluZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU5MDc2OAorCisyMDEzLTA4LTIyIDE0OjU1OjE0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogRml4IGJ6MiBjb25maWd1cmUgY2hlY2sgZm9yIFdpbmRvd3MKKwkgIER1ZSB0byBmdW5jdGlvbiBkZWNvcmF0aW9ucyBvbiBXaW5kb3dzIEFDX0NIRUNLX0xJQiBjYW4ndCBiZSB1c2VkIHRvIGNoZWNrIGZvciBiejIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDY1OTI0CisKKzIwMTMtMDItMjIgMjA6NTc6MDAgKzA5MDAgIEFraWhpcm8gVHN1a2FkYSA8YXRzdWthZGFAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJKiBleHQvcHVsc2UvcHVsc2V1dGlsLmM6CisJKiBleHQvcHVsc2UvcHVsc2V1dGlsLmg6CisJICBwdWxzZXNpbms6IEFkZCBzdXBwb3J0IGZvciBBQUMgcGFzcy10aHJvdWdoCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk0NDQ1CisKKzIwMTMtMDYtMjQgMTc6Mjk6MzcgKzAyMDAgIEtpc2hvcmUgQXJlcGFsbGkgPGtpc2hvcmUuYXJlcGFsbGlAZ21haWwuY29tPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmM6CisJICBnZGtwaXhidWZvdmVybGF5OiBjcmFzaGVzIGlmIGFueSBwcm9wZXJ0eSBjaGFuZ2VzIGR1cmluZyBwbGF5YmFjayB3aGVuIGxvY2F0aW9uIHByb3BlcnR5IGlzIG5vdCBzZXQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDI5ODgKKworMjAxMy0wOC0yMSAxNDo1NDoyNiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJKiBleHQvcHVsc2UvcHVsc2V1dGlsLmg6CisJICBwdWxzZTogU2hhcmUgc3RhdGljIGNhcHMgZGVmaW5pdGlvbiBiZXR3ZWVuIHNyYyBhbmQgc2luaworCSAgVGhlIHNyYyB3YXMgYWxzbyBtaXNzaW5nIDI0LWJpdCBzYW1wbGUgZm9ybWF0cworCisyMDEzLTA4LTIxIDE2OjUzOjU5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhxdWV1ZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cXVldWUuaDoKKwkgIHJ0eDogdmFyaW91cyBpbXByb3ZlbWVudHMKKwkgIFVzZSBsb2NraW5nCisJICBEb24ndCBwdXNoIGZyb20gdGhlIGV2ZW50IGhhbmRsZXIsIGNvbGxlY3RlZCBwYWNrZXRzIGluIGEgcXVldWUgYW5kIHB1c2ggZnJvbQorCSAgdGhlIGNoYWluIGZ1bmN0aW9uLgorCSAgQ2xlYXIgcXVldWVzIG9uIHNodXRkb3duLgorCisyMDEzLTA4LTIxIDE2OjUwOjU5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBnZW5lcmF0ZSBldmVudHMgY29ycmVjdGx5CisJICBEbyBjb3JyZWN0IHNoaWZ0aW5nIG9mIHRoZSBiaXRtYXNrIGZvciBsb3N0IHBhY2tldHMuCisKKzIwMTMtMDgtMjEgMTY6NDc6NDAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG1hbmFnZXIuYzoKKwkgIHJ0cDogcmVnaXN0ZXIgcnR4IGVsZW1lbnQgYmV0dGVyCisKKzIwMTMtMDgtMjEgMTY6MzI6NTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgZGlyZWN0c291bmRzaW5rOiBXQVZFRk9STUFURVggaXMgdW5zaWduZWQgZm9yIDggYml0IGludGVnZXJzLCBhbmQgc2lnbmVkIGZvciBvdGhlcnMKKwkgIFByb2JhYmx5IGZpeGVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA1NDc3CisKKzIwMTMtMDgtMjEgMTM6MDM6MzQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWdlbmM6IGRvbid0IGlnbm9yZSByZXR1cm4gdmFsdWUgZnJvbSBfZmluaXNoX2ZyYW1lKCkKKwkgIGdzdF92aWRlb19lbmNvZGVyX2ZpbmlzaF9mcmFtZSgpIHdpbGwgcmV0dXJuIEZMT1dfT0sgaGVyZSBpZgorCSAgdGhlcmUncyBubyBvdXRwdXQgYnVmZmVyLgorCisyMDEzLTA4LTIxIDEyOjU2OjM1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSAganBlZ2RlcGF5OiBhZGQgc29tZSBtb3JlIGRlYnVnCisKKzIwMTMtMDgtMjEgMTI6MTA6MDAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuaDoKKwkgIHJ0cGdzdGRlcGF5OiBvbmx5IHB1c2ggZXZlbnRzIHdoZW4gdGhleSBjaGFuZ2VkCisJICBLZWVwIHRyYWNrIG9mIHRoZSBTVFJFQU1fU1RBUlQgYW5kIFRBRyBldmVudHMgYW5kIG9ubHkgcHVzaCB0aGVtCisJICB3aGVuIHRoZXkgY2hhbmdlZC4KKworMjAxMy0wOC0yMSAxMDo1Mjo1OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIHJ0cGdzdHBheTogdGFnbGlzdHMgc2hvdWxkIG5vdCBiZSBtZXJnZWQgaW4gMS4wCisKKzIwMTMtMDgtMjEgMTA6Mjg6NTAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkgIHJ0cGdzdGRlcGF5OiBmbHVzaCBvbiBGTFVTSF9TVE9QIGV2ZW50CisKKzIwMTMtMDgtMjEgMTA6MDM6NTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJICBydHBnc3RwYXk6IHJlc2V0IG9uIHN0YXRlIGNoYW5nZQorCSAgRG8gZnVsbCByZXNldCBvbiBzdGF0ZSBjaGFuZ2UgdG8gUkVBRFkKKworMjAxMy0wOC0yMSAwOTo1NToyMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIHJ0cGdzdHBheTogcmVzZXQgb24gRkxVU0hfU1RPUAorCSAgQ2xlYXIgdGhlIGFkYXB0ZXIgYW5kIHBlbmRpbmcgYnVmZmVyIGxpc3Qgb24gRkxVU0hfU1RPUC4KKworMjAxMy0wOC0yMSAwOTozOTozMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIHJ0cGdzdHBheTogZG9uJ3QgdXNlIGNsb2NrIGZvciBjb25maWcgaW50ZXJ2YWwKKwkgIFdlIGNhbid0IHVzZSB0aGUgY2xvY2sgdG8gdGltZSBvdXIgY29uZmlnLWludGVydmFsIGJlY2F1c2Ugd2UgYXJlIG5vdAorCSAgbGl2ZSAob3IgdGhlcmUgbWlnaHQgbm90IGJlIGEgY2xvY2sgb3IgdGhlIGNsb2NrIG1pZ2h0IG5vdCBiZSBydW5uaW5nKS4KKwkgIEluc3RlYWQganVzdCBzaW1wbHkgdGFrZSB0aGUgdGltZXN0YW1wIGRpZmYuCisKKzIwMTMtMDgtMjEgMDk6MzM6MDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5Lmg6CisJICBydHBnc3RheTogZG9uJ3QgdXNlIC8vIGNvbW1lbnRzCisKKzIwMTMtMDgtMDggMTE6NTU6MjIgLTA0MDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IEZpeCByZXNwb25zZSBhcmd1bWVudCBpbiBoYW5kbGUtcmVxdWVzdCBzaWduYWwKKworMjAxMy0wOC0wOCAxMTo1NDo0MSAtMDQwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogQWRkIHNkZXMgcHJvcGVydHkgYW5kIHByb3h5IGl0IHRvIHJ0cGJpbgorCisyMDEzLTA4LTA3IDA5OjQ3OjM1IC0wNDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuaDoKKwkgIFNlbmQgYSBzdHJlYW0tc3RhcnQgd2hlbmV2ZXIgd2Ugc2VuZCB0YWdzIFRoaXMgaXMgdG8gbWFrZSBzdXJlIHRhZ3MgYXJlIGNsZWFyZWQgb24gdGhlIGNsaWVudCBpZiB0aGUgc3RyZWFtLXN0YXJ0IHdhcyBwcmV2aW91c2x5IGxvc3QsIG90aGVyd2lzZSwgdGhlIGNsaWVudCBtYXkgZW5kIHVwIHdpdGggYSBtZXJnZWQgdGFnbGlzdCBvZiBtdWx0aXBsZSBzb25ncworCisyMDEzLTA3LTI1IDIxOjEyOjA1IC0wNDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuaDoKKwkgIHJ0cGdzdHBheTogQWRkIGEgY29uZmlnLWludGVydmFsIHByb3BlcnR5IHRvIHJlc2VuZCB0aGUgY2Fwcy90YWdzIGF0IGEgcmVndWxhciBpbnRlcnZhbCBUaGlzIGlzIHVzZWZ1bCBpbiBjYXNlIHRoZSBwYWNrZXQgY29udGFpbmluZyB0aGUgaW5saW5lZCBjYXBzIHdhcyBsb3N0IG9yIGlmIG5ldyBjbGllbnQgam9pbnMgYW4gYWxyZWFkeSBydW5uaW5nIFJUUCBzdHJlYW0gYW5kIHRoZXkgbWlzc2VkIHRoZSBwcmV2aW91cyB0YWcgZXZlbnRzLiBUaGlzIGFsc28gbWFrZXMgdGhlIHBheWxvYWRlciBrZWVwIGEgbGlzdCBvZiBtZXJnZWQgdGFncyBzbyB0aGUgcmV0cmFuc21pdHRlZCB0YWcgZXZlbnQgY29udGFpbnMgYWxsIHByZXZpb3VzbHkgcmVjZWl2ZWQuIEEgU1RSRUFNX1NUQVJUIGV2ZW50IHdpbGwgZmx1c2ggdGhlIGxpc3Qgb2YgdGFncy4KKworMjAxMy0wNy0yNSAyMToxMDoxMCAtMDQwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIHJ0cGdzdHBheTogUmVmYWN0b3IgdGhlIHNldGNhcHMgYW5kIHVzZSBuZXcgbWV0aG9kIHRvIHNlbmQgYXJiaXRyYXJ5IGNhcHMgYXQgYW55IHRpbWUKKworMjAxMy0wNy0yNSAyMTowMzozNCAtMDQwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIHJ0cGdzdHBheTogRG8gbm90IGZsdXNoIGV2ZW50cyBmb3Igc3RyZWFtLXN0YXJ0IGFuZCBhdm9pZCBjb25mbGljdCBiZXR3ZWVuIGV2ZW50IGFuZCBwZW5kaW5nIGlubGluZSBjYXBzCisKKzIwMTMtMDctMjUgMjA6NTQ6NTAgLTA0MDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5oOgorCSAgcnRwZ3N0cGF5OiBBZGQgYSBjcmVhdGVfZnJvbV9hZGFwdGVyIEFQSSBhbmQgdXNlIGEgbGlzdCBvZiBHc3RCdWZmZXJMaXN0IFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGZpeCBldmVudC9jYXBzIHNlbmRpbmcuIElmIHdlIHNlbmQgYSBTVFJFQU1fU1RBUlQgcGFja2V0LCBpdCB3aWxsIGNhdXNlIGFuIGVycm9yIGJlY2F1c2UgdGhlIHN0cmVhbSBkaWRuJ3QgcmVjZWl2ZSBpdHMgY2FwcyBhbmQgbmV3LXNlZ21lbnQgZXZlbnRzLCBzbyB3ZSBtdXN0IHdhaXQgZm9yIHRoZSBmaXJzdCBidWZmZXIgYmVmb3JlIHNlbmRpbmcgdGhlIHN0cmVhbS1zdGFydCBldmVudCBidWZmZXIuIEhvd2V2ZXIsIHRoZSBjYXBzIHdpbGwgYmUgc2VudCBhdCB0aGUgc2FtZSB0aW1lIGFuZCBzbyB0aGUgJ2lubGluZSBjYXBzJyB3aWxsIGJlIHNldCBmb3IgdGhlIGV2ZW50LiBXZSBuZWVkIHRvIGJlIGFibGUgdG8gcGF5bG9hZCBpbmRpdmlkdWFsIHBhY2tldHMgKGRhdGEsIGNhcHMgb3IgZXZlbnRzKSBhbmQgb25seSBzZW5kIHRoZW0gd2hlbiB3ZSBjYWxsIGZsdXNoLgorCisyMDEzLTA3LTI1IDE3OjU2OjM4IC0wNDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSAgcnRwZ3N0cGF5OiBBZGQgZXR5cGU9NCBmb3IgcGF5bG9hZGluZyBHU1RfRVZFTlRfU1RSRUFNX1NUQVJUCisKKzIwMTMtMDctMjUgMTc6NTI6MTYgLTA0MDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJICBydHBnc3RwYXk6IEZpeCB0eXBvLCBHU1RfRVZFTlRfQ1VTVE9NX0JPVEggaGFzIGV0eXBlIG9mIDMKKworMjAxMy0wOC0yMCAxNDozNjo1OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGhhbmRsZSBFT1MKKwkgIFdoZW4gdGhlIHF1ZXVlIGlzIGVtcHR5LCBhbmQgd2UgcmVjZWl2ZWQgRU9TLCBwYXVzZSBhbmQgcHVzaCBhbiBFT1MKKwkgIGV2ZW50IGRvd25zdHJlYW0uCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA2Mzg3CisKKzIwMTMtMDgtMjAgMTA6MjY6MTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiB1cGRhdGUgZG9jcworCisyMDEzLTA4LTIwIDEwOjI1OjE3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogdXBkYXRlIGFsbCB0aW1lcnMKKwkgIEtlZXAgbG9vcGluZyBvdmVyIGFsbCByZWdpc3RlcmVkIHRpbWVycyBzbyB0aGF0IHdlIGNhbiBtYXJrIHRoZW0gbG9zdCBpbnN0ZWFkIG9mCisJICBzdG9wcGluZyBhcyBzb29uIGFzIHdlIGZpbmQgdGhlIHRpbWVyIGZvciB0aGUgY3VycmVudCBzZXFudW0uCisKKzIwMTMtMDgtMjAgMDg6NTU6NTAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiByZW1vdmUgdW51c2VkIHZhcmlhYmxlcworCisyMDEzLTA4LTE5IDIxOjEwOjAwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogcmVvcmdhbml6ZSB0aW1lciBoYW5kbGluZworCSAgUmVzdHJ1Y3R1cmUgaGFuZGxpbmcgb2YgaW5jb21taW5nIHBhY2tldCBhbmQgdGhlIGdhcCB3aXRoIHRoZSBleHBlY3RlZCBzZXFudW0KKwkgIGFuZCByZWdpc3RlciBhbGwgdGltZXJzIGZyb20gdGhlIF9jaGFpbiBmdW5jdGlvbi4KKwkgIENvbnZlcnQgYSB0aW1lciB0byBhIExPU1QgcGFja2V0IHRpbWVyIHdoZW4gdGhlIG1heCBhbW91bnQgb2YgcmV0cmFuc21pc3Npb24KKwkgIHJlcXVlc3RzIGhhcyBiZWVuIHJlYWNoZWQuCisKKzIwMTMtMDgtMTkgMjE6Mzc6NDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiByZWZhY3RvciBwYWNrZXQgc3BhY2luZyBjYWxjdWxhdGlvbgorCisyMDEzLTA4LTE5IDIxOjM0OjM4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjoga2VlcCB0cmFjayBvZiBsYXN0IHNlcW51bSBhbmQgZHRzCisKKzIwMTMtMDgtMTkgMjE6Mjk6NDkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBzbWFsbCBjbGVhbnVwcworCisyMDEzLTA4LTE5IDIxOjIxOjA4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogcmVzZXQgcmV0cmFuc21pc3Npb24gdGltZXJzIGluIGFkZC9yZXNjaGVkdWxlCisJICBSZXNldCB0aGUgcmV0cmFuc21pc3Npb24gdGltZXJzIHdoZW4gYWRkaW5nIGFuZCByZXNjaGVkdWxpbmcgYSB0aW1lci4KKworMjAxMy0wOC0xOSAyMToxMjoxMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHJlbmFtZSB2YXJpYWJsZXMgZm9yIHBhY2tldCBzcGFjaW5nCisKKzIwMTMtMDgtMTkgMTQ6NTg6MDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiByZW1vdmUgbG9zdCB0aW1lciB3aGVuIHdlIGdldCB0aGUgcGFja2V0CisJICBXaGVuIHdlIHJlY2VpdmUgYSBwYWNrZXQsIGFsc28gcmVtb3ZlIHRoZSBMT1NUIHRpbWVyIGZvciBpdC4KKworMjAxMy0wOC0xOSAxNDo1Njo0OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGV4cGVjdGVkIHNlcW51bSBtdXN0IGluY3JlYXNlCisJICBPbmx5IHVwZGF0ZSB0aGUgZXhwZWN0ZWQgc2VxbnVtIHdoZW4gaXQgaXMgYmlnZ2VyIHRoYW4gdGhlIHByZXZpb3VzIGV4cGVjdGVkCisJICBzZXFudW0uCisKKzIwMTMtMDgtMTkgMTQ6NTU6NDkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBhZGQgbW9yZSBkZWJ1ZworCisyMDEzLTA4LTEyIDE2OjE1OjU0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG1hbmFnZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHF1ZXVlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhxdWV1ZS5oOgorCSAgcnR4cXVldWU6IGFkZCByZXRyYW5zbWlzc2lvbiBxdWV1ZSBlbGVtZW50CisKKzIwMTMtMDgtMTIgMTQ6NTM6MzMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHNlc3Npb246IGFkZCBzb21lIGRvY3MKKworMjAxMy0wOC0wNiAxNjoyOTo1NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgc2Vzc2lvbjogaGFuZGxlIE5BQ0sgZmVlZGJhY2sgYW5kIGdlbmVyYXRlIGV2ZW50cworCSAgSGFuZGxlIGFuZCBwYXJzZSB0aGUgZmVlZGJhY2sgTkFDSyBwYWNrZXRzIGFuZCBnZW5lcmF0ZSBhIFJldHJhbnNtaXNzaW9uCisJICBldmVudCBmb3IgZWFjaCBOQUNLZWQgcGFja2V0CisKKzIwMTMtMDgtMTkgMTM6MTk6NDIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IEFkZCBmb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBnc3RfdjRsMl9vYmplY3RfZ2V0X2Zvcm1hdF9saXN0CisKKzIwMTItMTAtMjIgMTc6NTg6MDcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSAgdjRsMjogRGUtZHVwbGljYXRlIGNhcHMgcHJvYmluZyBiZXR3ZWVuIHNyYyBhbmQgc2luaworCisyMDEzLTA4LTEzIDE3OjMyOjE3IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBleHQvcHVsc2UvTWFrZWZpbGUuYW06CisJKiBleHQvcHVsc2UvcHVsc2Vwcm9iZS5jOgorCSogZXh0L3B1bHNlL3B1bHNlcHJvYmUuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmg6CisJICBwdWxzZTogUmVtb3ZlIHVudXNlZCBHc3RQdWxzZVByb2JlCisKKzIwMTMtMDgtMTkgMTI6NDY6NDUgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOgorCSogc3lzL3Y0bDIvdHVuZXIuYzoKKwkqIHN5cy92NGwyL3R1bmVyY2hhbm5lbC5jOgorCSogc3lzL3Y0bDIvdHVuZXJub3JtLmM6CisJICB2NGwyOiBVc2UgR19ERUZJTkVfIG1hY3JvcyBmb3IgYWRkZWQgdGhyZWFkIHNhZmV0eQorCisyMDEzLTA4LTE3IDExOjI4OjEzICswMjAwICBUaGliYXVsdCBTYXVuaWVyIDx0aGliYXVsdC5zYXVuaWVyQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5oOgorCSAgdmlkZW9taXhlcjogRG8gbm90IHNlbmQgZmx1c2hfc3RvcCBvdXJzZWxmIGFmdGVyIGEgZmx1c2hfc3RhcnQKKwkgIFdoZW4gd2UgcmVjZWl2ZSBhIGZsdXNoX3N0YXJ0LCB3ZSBzaG91bGQgd2FpdCBmb3IgdGhlIG5leHQgZmx1c2hfc3RvcAorCSAgYW5kIGZvd2FyZCBpdCwgbm90IGNyZWF0ZSBhIGZsdXNoX3N0b3Agb3Vyc2VsZi4KKworMjAxMy0wOC0xNiAxNzoxMDozMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIGgyNjRkZXBheTogaW5pdCBkZWJ1ZyBjYXRlZ29yeSBlYXJseQorCSAgSW5pdCB0aGUgZGVidWcgdmFyaWFibGUgd2hlbiB3ZSByZWdpc3RlciB0aGUgZWxlbWVudCBiZWNhdXNlIGl0IGlzIGFsc28gdXNlZCBieQorCSAgdGhlIHBheWxvYWRlciBlbGVtZW50IHdoZW4gaXQgY2FsbHMgdGhlIGFkZF9zcHNfcHBzIG1ldGhvZC4KKworMjAxMy0wOC0xNiAxMzoyNjoyOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBQcm9wZXJseSBzZXQgaGVhZGVycyB2aWEgdGhlIGJhc2UgY2xhc3MgaW5zdGVhZCBvZiBqdXN0IHB1c2hpbmcgdGhlbSBkb3duc3RyZWFtCisJICBQcmV2ZW50cyBidWZmZXJzIGZyb20gYmVpbmcgc2VuZCBiZWZvcmUgdGhlIGNhcHMgYW5kIHNlZ21lbnQgZXZlbnRzLgorCisyMDEzLTA4LTE1IDEwOjU5OjEwICswMTAwICBDaHJpcyBCYXNzIDxmbG9vYmxlZmxhbUBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogY2hlY2sgZGVub21pbmF0b3IgaXNuJ3QgemVybyBiZWZvcmUgc2NhbGluZyBkdXJhdGlvbi4KKwkgIFdoZW4gZ3N0X3F0ZGVtdXhfY29uZmlndXJlX3N0cmVhbSBzZXRzIGZwc19kLCBjaGVjayB0aGF0IG5fc2FtcGxlcyBpcworCSAgbm9uLXplcm8gYmVmb3JlIHVzaW5nIGl0IGFzIGEgZGVub21pbmF0b3IgdG8gc2NhbGUgdGhlIHN0cmVhbSBkdXJhdGlvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDYwNzYKKworMjAxMy0wOC0xNSAxNTowODowNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSogZXh0L3ZweC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cHgvZ3N0dnA5ZGVjLmM6CisJICBleHQ6IFVzZSBuZXcgZmx1c2ggdmZ1bmMgb2YgdmlkZW8gY29kZWMgYmFzZSBjbGFzc2VzIGFuZCByZW1vdmUgcmVzZXQgaW1wbGVtZW50YXRpb25zCisKKzIwMTMtMDgtMTQgMTY6MTk6MzIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBmb3J3YXJkIGZsdXNoIGJlZm9yZSBzdG9wcGluZyBkYXRhZmxvdworCSAgRmlyc3QgZm9yd2FyZCB0aGUgZmx1c2ggZXZlbnQgYW5kIHRoZW4gc3RvcCBvdXIgbG9vcCBmdW5jdGlvbi4KKworMjAxMy0wOC0xNCAxMzoxMDozMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiByZXF1aXJlIGxpYnNvdXAgPj0gMi4zOAorCSAgQnVtcCBsaWJzb3VwIHJlcXVpcmVtZW50IGZvciBuZXdlciBBUEkgdXNlZCwgbGlrZSBoZWFkZXJzX2dldF9vbmUoKS4KKwkgIDIuMzggaXMgZnJvbSBlYXJseSAyMDEyIGFuZCBpcyBpbiBsaW5lbiB3aXRoIG91ciBHTGliIHJlcXVpcmVtZW50LgorCisyMDEzLTA4LTE0IDExOjU0OjE5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cDogZG9uJ3QgdXNlIGRlcHJlY2F0ZWQgc291cF9tZXNzYWdlX2hlYWRlcnNfZ2V0KCkgQVBJCisKKzIwMTMtMDgtMTMgMTc6NDQ6NTAgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjb2xsYWJvcmEuY29tPgorCisJKiAuZ2l0aWdub3JlOgorCSAgLmdpdGlnbm9yZTogSWdub3JlIGZpbGVzIGZyb20gYXV0b21ha2UgdGVzdC1kcml2ZXIKKworMjAxMy0wOC0xMiAxNToyODozNCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuaDoKKwkgIHJ0cGgyNjRwYXk6IFVzZSB0aGUgU1BTL1BQUyBoYW5kbGluZyBmdW5jdGlvbiBmcm9tIHRoZSBkZXBheWxvYWRlcgorCSAgUmVtb3ZlIGR1cGxpY2F0ZWQgY29waWVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA1NTUzCisKKzIwMTMtMDgtMTIgMTU6MjY6MDggLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5oOgorCSAgcnRwaDI2NGRlcGF5OiBNYWtlIHRoZSBTUFMvUFBTIGRlZHVwbGljYXRpb24gZnVuY3Rpb24gZ2VuZXJpYworCSAgTWFrZSBpdCBub3QgdG91Y2ggYW55IGludGVybmFscyBvZiB0aGUgZGVwYXlsb2FkZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDU1NTMKKworMjAxMy0wOC0xMyAxNDowOToyMCArMDEwMCAgQ2hyaXMgQmFzcyA8Zmxvb2JsZWZsYW1AZ21haWwuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogYWxsb3cgY29udmVyc2lvbiBmcm9tIHJhdyBBQUMgdG8gQURUUworCSAgVGhpcyBwYXRjaCB3aWxsIHByZXBlbmQgQURUUyBoZWFkZXJzIHRvIHJhdyBBQUMgYXVkaW8gZnJhbWVzLCBhbGxvd2luZworCSAgdXBzdHJlYW0gZWxlbWVudHMgdG8gbGluayB0byBkZWNvZGVycyB0aGF0IG9ubHkgc3VwcG9ydCBBQUMgaW4gQURUUyBmb3JtYXQuCisJICBOb3RlIHRoYXQgbm8gZXJyb3IgY29ycmVjdGlvbiBiaXRzIGFyZSBhZGRlZCB0byBBRFRTIGZyYW1lcyBpbiB0aGlzIGNvZGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjE1NzQwCisKKzIwMTMtMDgtMTMgMTI6NDQ6MTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogT25seSBmcmVlIEdDaGVja1N1bSBhZnRlciBpdHMgbGFzdCB1c2FnZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNTc2MAorCisyMDEzLTA4LTEzIDEyOjAyOjI5ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IGZpeCBjcml0aWNhbCBzZXR0aW5nIGEgTlVMTCB1cmkgcmVkaXJlY3Rpb24KKworMjAxMy0wNy0xMyAwMTo1MDo1NiArMDIwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmg6CisJICBzb3VwaHR0cHNyYzogYWRkIHJlZGlyZWN0aW9uIHRvIHRoZSBVUkkgcXVlcnkKKworMjAxMy0wNy0zMSAxMDo0MjowNyArMDIwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBlbHN0IHNob3VsZCBvZmZzZXQgc2FtcGxlcyBpbnN0ZWFkIG9mIGJ1ZmZlcnMKKwkgIFRoZSBjdXJyZW50IGFwcHJvYWNoIHdoZXJlIGJ1ZmZlcnMgYXJlIG9mZnNldCBpcyBub3QgaWRlYWwsIGFzIGR1cmluZyBzZWVrCisJICBhbmQgbG9vcCBjdXJyZW50IHRpbWUgaXMgY29tcGFyZWQgdG8gc2FtcGxlIHRpbWVzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDI2NAorCisyMDEzLTA4LTA3IDE5OjMyOjA3ICswMjAwICBUaGliYXVsdCBTYXVuaWVyIDx0aGliYXVsdC5zYXVuaWVyQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBTZW5kIEVPUyBpZiBidWZfZW5kID49IHNlZ21lbnQuc3RvcAorCSAgVGhhdCBtZWFucyB0aGUgd2hvbGUgc2VnbWVudCBpcyBhbHJlYWR5IHBsYXllZCwgYW5kIHdlIGFyZSBzdXJlIHdlCisJICBhcmUgRU9TIGF0IHRoYXQgcG9pbnQuCisJICBBbHNvIGhhbmRsZSBzZWdtZW50IHNlZWtzLCBhbmQgZG8gbm90IHNlbmQgRU9TIGluIHRoYXQgY2FzZS4KKworMjAxMy0wOC0wNCAxNDo0MDozOCArMDIwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHNlbmQgcHJvcGVyIHN0cmVhbV9zdGFydCBldmVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvL3Nob3dfYnVnLmNnaT9pZD03MDU0NDkKKworMjAxMy0wOC0wOCAxMTo1MToxNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IERvbid0IHByaW50IHdhcm5pbmdzIGR1cmluZyBmbHVzaGluZyBhbmQgc3RvcCBhcyBzb29uIGFzIHBvc3NpYmxlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy8vc2hvd19idWcuY2dpP2lkPTcwNTQ0MgorCisyMDEzLTA4LTA3IDExOjE0OjM4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOGRlcGF5LmM6CisJICBydHB2cDhkZXBheTogbWFyayBrZXkgZnJhbWVzIGFuZCBkZWx0YSBmcmFtZXMgcHJvcGVybHkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDU1NTAKKworMjAxMy0wOC0wNSAyMzoyMzo1NyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogYWRkIE5BQ0sgZmVlZGJhY2sgaW4gUlRDUAorCisyMDEzLTA4LTA1IDIzOjIyOjE2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oOgorCSAgc291cmNlOiBhZGQgbWV0aG9kcyB0byByZWdpc3RlciBOQUNLCisJICBBZGQgYSBtZXRob2QgdG8gcmVnaXN0ZXIgYSBtaXNzaW5nIHBhY2tldCBmb3IgYW4gc3NyYyBhbG9uZyB3aXRoCisJICBtZXRob2RzIHRvIGdldCB0aGUgbWlzc2luZyBwYWNrZXRzIGFuZCBjbGVhciB0aGVtLgorCisyMDEzLTA4LTA0IDIzOjA1OjM2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBzZXNzaW9uOiBoYW5kbGUgUmV0cmFuc21pc3Npb24gZXZlbnQgYW5kIHNjaGVkdWxlIE5BQ0sKKwkgIEhhbmRsZSB0aGUgcmV0cmFuc21pc3Npb24gZXZlbnQgZnJvbSBkb3duc3RyZWFtIGFuZCB1c2UgaXQgdG8gc2NoZWR1bGUgYSBOQUNLCisJICByZXF1ZXN0LgorCisyMDEzLTA4LTA1IDIzOjIwOjI5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBwYXNzIGRhdGEgdG8gcmVtb3ZlIGZ1bmMKKwkgIFBhc3MgdGhlIGRhdGEgdG8gdGhlIHJlbW92ZSBmdW5jdGlvbiBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBkZXJlZiBpdCB3aGVuIHRoZXJlCisJICBpcyBwbGkgb3IgZmlyLgorCisyMDEzLTA4LTA2IDE1OjI4OjUwICswMjAwICBUaGliYXVsdCBTYXVuaWVyIDx0aGliYXVsdC5zYXVuaWVyQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IGNvbXBpbGF0aW9uCisKKzIwMTMtMDgtMDYgMTU6MTc6NDQgKzAyMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBSYXcgYnVmZmVyIERUUyBzaG91bGQgYWx3YXlzIGJlIENMT0NLX1RJTUVfTk9ORQorCisyMDEzLTA4LTA2IDExOjU4OjM4ICswMjAwICBUaGliYXVsdCBTYXVuaWVyIDx0aGliYXVsdC5zYXVuaWVyQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBNYWtlIHN1cmUgdG8gc2VuZCBFT1MgaWYgdGhlIGJ1ZmZlciBlbmQgdGltZSBlcXVhbHMgdGhlIHNlZ21lbnQgZW5kIHRpbWUKKwkgIE90aGVyd2l6ZSBFT1MgbmV2ZXIgZ2V0cyBzZW50IGluIHRoYXQgcGFydGljdWxhciBjYXNlLgorCisyMDEzLTA4LTA1IDA4OjQ5OjUwICswMjAwICBTam9lcmQgU2ltb25zIDxzam9lcmQuc2ltb25zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSAgZ29vbTogRW5zdXJlIHNyYyBjYXBzIGFyZSB3cml0YWJsZQorCSAgSW4gc29tZSBjYXNlcyB0aGUgc3JjIGNhcHMgZGV0ZXJtaW5lZCBieSBnb29tIHdlcmVuJ3Qgd3JpdGFibGUsIGNhdXNpbmcKKwkgIGEgYnVuY2ggb2YgYXNzZXJ0aW9uIGZhaWx1cmVzIGFuZCBmYWlsZWQgY2Fwcy4gRml4ZWQgYnkgYWx3YXlzCisJICBleHBsaWNpdGVseSBtYWtpbmcgdGhlIGNhcHMgd3JpdGFibGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDU0NzUKKworMjAxMy0wOC0wNCAyMzoxODoyOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgc2Vzc2lvbjogdXNlIGNvbW1vbiBzZW5kX3J0Y3AgbWV0aG9kCisJICBSZXVzZSB0aGUgc2VuZF9ydGNwIG1ldGhvZCB0aGF0IGFscmVhZHkgYXNrcyBmb3IgdGhlIGN1cnJlbnQgdGltZSB3aGVuCisJICByZXF1ZXN0aW5nIGEga2V5ZnJhbWUuCisKKzIwMTMtMDgtMDQgMjM6MTI6NTAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIHNlc3Npb246IERvbid0IHVzZSBDbG9ja1RpbWVEaWZmIGZvciB1bnNpZ25lZCBkZWxheXMKKworMjAxMy0wOC0wNCAxNjo1MjoxNSArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBVc2UgYnVmZmVyIFBUUyBpZiBEVFMgaXMgbm90IHNldAorCSAgQXZvaWRzIGVuZGluZyB1cCB3aXRoIGNvbXBsZXRlbHkgYm9ndXMgc2NhbGVkIGR1cmF0aW9uL3B0cyB3aGVuIG5ldworCSAgYnVmZmVycyBoYXZlIGludmFsaWQgRFRTLgorCisyMDEzLTA4LTA0IDE0OjMyOjQ3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSAgdGVzdHM6IHNraXAgaHR0cHMgdGVzdCBpZiB0aGVyZSdzIG5vIFRMUyBzdXBwb3J0IGluIHNvdXAvZ2xpYgorCisyMDEzLTA4LTA0IDExOjIwOjQxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkgIHJ0cGRlYzogdXNlIGdlbmVyaWMgbWFyc2hhbGxlcgorCisyMDEzLTA4LTA0IDEwOjUyOjMzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBNYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyLy5naXRpZ25vcmU6CisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2dzdHY0bDItbWFyc2hhbC5saXN0OgorCSogc3lzL3Y0bDIvdHVuZXItbWFyc2hhbC5saXN0OgorCSogc3lzL3Y0bDIvdHVuZXIuYzoKKwkqIHN5cy92NGwyL3R1bmVyLmg6CisJKiB3aW4zMi9NQU5JRkVTVDoKKwkqIHdpbjMyL2NvbW1vbi90dW5lci1lbnVtdHlwZXMuYzoKKwkqIHdpbjMyL2NvbW1vbi90dW5lci1lbnVtdHlwZXMuaDoKKwkqIHdpbjMyL2NvbW1vbi90dW5lci1tYXJzaGFsLmM6CisJKiB3aW4zMi9jb21tb24vdHVuZXItbWFyc2hhbC5oOgorCSAgdjRsMjogcmVtb3ZlIHVudXNlZCBlbnVtdHlwZXMgYW5kIHVzZSBnZW5lcmljIG1hcnNoYWxsZXIKKworMjAxMy0wOC0wNCAxMDo0NzozOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogTWFrZWZpbGUuYW06CisJKiBnc3QvdWRwLy5naXRpZ25vcmU6CisJKiB3aW4zMi9jb21tb24vZ3N0dWRwLWVudW10eXBlcy5jOgorCSogd2luMzIvY29tbW9uL2dzdHVkcC1lbnVtdHlwZXMuaDoKKwkqIHdpbjMyL2NvbW1vbi9nc3R1ZHAtbWFyc2hhbC5jOgorCSogd2luMzIvY29tbW9uL2dzdHVkcC1tYXJzaGFsLmg6CisJICB1ZHA6IHJlbW92ZSB1bnVzZWQgbWFyc2hhbCBhbmQgZW51bXR5cGVzIGZpbGVzCisKKzIwMTMtMDgtMDQgMDk6Mzg6MTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogZ3N0L3J0cG1hbmFnZXIvLmdpdGlnbm9yZToKKwkqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLW1hcnNoYWwubGlzdDoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIHdpbjMyL01BTklGRVNUOgorCSogd2luMzIvY29tbW9uL2dzdHJ0cGJpbi1tYXJzaGFsLmM6CisJKiB3aW4zMi9jb21tb24vZ3N0cnRwYmluLW1hcnNoYWwuaDoKKwkgIHJ0cG1hbmFnZXI6IHVzZSBnZW5lcmljIG1hcnNoYWxsZXIKKworMjAxMy0wOC0wNCAwMDoxMzowNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHNlbmQgZXZlbnQgaW4gcmlnaHQgZGlyZWN0aW9uCisKKzIwMTMtMDgtMDIgMTc6Mzg6MzQgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiBjcmVhdGUvcmVtb3ZlIG9yYyBkaXJlY3RvcnkgYXQgcHJvcGVyIHRpbWUKKwkgIEJlZm9yZSBhdXRvbWFrZSBjcmVhdGVzIC5kZXBzIGRpcmVjdG9yaWVzLCBhbmQgZHVyaW5nIGRpc3RjbGVhbi4KKworMjAxMy0wOC0wMyAwMDoyNTo0NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogYWRkIEZJUiBhbmQgUExJIGxpa2Ugb3RoZXIgUlRDUCBwYWNrZXRzCisJICBBZGQgdGhlIEZJUiBhbmQgUExJIHBhY2tldHMgbGlrZSB0aGUgb3RoZXIgUlRDUCBwYWNrZXQgaW5zdGVhZCBvZiBmcm9tIHRoZQorCSAgb24tc2VuZGluZy1ydGNwIGRlZmF1bHQgc2lnbmFsIGhhbmRsZXIuCisKKzIwMTMtMDgtMDIgMTc6MjI6NTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBmaXggcHJvcGVydHkgcmFuZ2VzCisKKzIwMTMtMDgtMDIgMTY6NDI6NTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBwdXNoIHJldHJhbnNtaXNzaW9uIGV2ZW50cworCisyMDEzLTA4LTAyIDE0OjEyOjE2ICswMjAwICBMdWJvc3ogU2FybmVja2kgPGx1Ym9zekBnbWFpbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGJ1aWxkOiBhZGQgc3ViZGlyLW9iamVjdHMgdG8gQU1fSU5JVF9BVVRPTUFLRQorCSAgRml4ZXMgd2FybmluZ3Mgd2l0aCBhdXRvbWFrZSAxLjE0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA1MzUwCisKKzIwMTMtMDgtMDIgMTQ6NTQ6NTYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBhZGQgc3VwcG9ydCBmb3IgcmV0cmFuc21pc3Npb24gcmV0cnkKKwkgIFdoZW4gd2UgZGlkbid0IHJlY2VpdmUgYSBwYWNrZXQgYWZ0ZXIgcmVxdWVzdGluZyByZXRyYW5zbWlzc2lvbiwgcmV0cnkKKwkgIGFza2luZyBmb3IgcmV0cmFuc21pc3Npb24gZm9yIGEgY2VydGFpbiBwZXJpb2QuCisKKzIwMTMtMDgtMDIgMTQ6MTk6NTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBhZGQgcHJvcGVydGllcworCSAgQWRkIHByb3BlcnRpZXMgdG8gY29udHJvbCByZXRyYW5zbWlzc2lvbiBwYXJhbWV0ZXJzCisKKzIwMTMtMDgtMDIgMTI6NDQ6NTggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiB1c2UgY29ycmVjdGVkIHRpbWVvdXQgd2hlbiByZXNjaGVkdWxpbmcKKwkgIFdoZW4gd2UgcmVjYWxjdWxhdGUgdGhlIHRpbWVvdXQsIHVzZSB0aGUgY29ycmVjdGVkIHRpbWVvdXQgdmFsdWUgZGVwZW5kaW5nIG9uCisJICB0aGUgdGltZXIgdHlwZS4KKworMjAxMy0wOC0wMiAxMjo0MzowMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHVwZGF0ZSB0aW1lcnMgYWZ0ZXIgcXVldWVpbmcKKwkgIEVsc2Ugd2UgbWlnaHQgdXBkYXRlIHRoZSB0aW1lciBuZWVkbGVzc2x5IGZvciBkdXBsaWNhdGVzLgorCisyMDEzLTA4LTAyIDEyOjQyOjA4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogbW92ZSBtZXRob2QgdXAKKworMjAxMy0wOC0wMiAwNjoyODozMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHNtYWxsIGNsZWFudXAKKworMjAxMy0wOC0wMSAyMzoyNjowNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHVuc2NoZWR1bGUgb2xkIGV4cGVjdGVkIHBhY2tldHMKKwkgIFdoZW4gd2UgcmVjZWl2ZSBhIG5ldyBwYWNrZXQsIHVuc2NoZWR1bGUgb2xkIG91dHN0YW5kaW5nIHBhY2tldHMgd2hlbiB0aGVpcgorCSAgc2VxbnVtIGlzIHRvbyBmYXIgYXdheS4KKworMjAxMy0wOC0wMSAyMzoyOToyMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHJlZmFjdG9yIHRpbWVyIHVwZGF0ZQorCisyMDEzLTA4LTAxIDIzOjI0OjI5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogdXBkYXRlIHRpbWVycyB3aGVuIHJlbW92aW5nCisJICBVcGRhdGUgdGhlIHRpbWVycyB3aGVuIHdlIHJlbW92ZSBhIHRpbWVyLgorCSAgSGFuZGxlIGNhbmNlbGVkIHRpbWVycywgbWFrZSB0aGVtIHVuc2NoZWR1bGUgdGhlIGN1cnJlbnQgdGltZXIgYW5kCisJICB0cmlnZ2VyIHRoZSB0aW1lb3V0IGNvZGUuCisKKzIwMTMtMDgtMDEgMjM6MjI6MDIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBmaXggdHlwbworCisyMDEzLTA4LTAxIDE1OjQwOjUyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogaW1wcm92ZSB0aW1lb3V0IG1hbmFnZW1lbnQKKwkgIElmIHdlIGNoYW5nZSB0aGUgc2VxbnVtIG9mIGFuIGV4aXN0aW5nIHRpbWVyIGFuZCB3ZSB3ZXJlIHdhaXRpbmcgZm9yCisJICB0aGF0IHRpbWVyLCB1bnNjaGVkdWxlIGl0LiBJZiB3ZSBjaGFuZ2UgdGhlIHRpbWVvdXQgb2YgYW4gZXhpc3RpbmcgdGltZXIgYW5kIHdlCisJICB3ZXJlIHdhaXRpbmcgb24gaXQsIG9ubHkgdW5zY2hlZHVsZSB3aGVuIHRoZSBuZXcgdGltZSBpcyBzbWFsbGVyLgorCisyMDEzLTA4LTAxIDE1OjA1OjM1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogaW5zdGFsbCB0aW1lciBmb3IgZXhwZWN0ZWQgYXJyaXZhbAorCSAgSW5zdGFsbCBhIHRpbWVyIHRoYXQgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIGV4cGVjdGVkIGFycml2YWwgdGltZSBvZiBhIHBhY2tldAorCSAgZXhwaXJlZC4KKworMjAxMy0wOC0wMSAxNDo1NjowMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGltcHJvdmUgdW5zY2hlZHVsZSBvZiB0aW1lcnMKKwkgIENvbmZsaWN0czoKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jCisKKzIwMTMtMDgtMDEgMTI6MjE6NTMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBtb3ZlIGNvZGUgYXJvdW5kCisKKzIwMTMtMDgtMDEgMTI6MDc6MTEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBlc3RpbWF0ZSBpbnRlciBwYWNrZXQgc3BhY2luZworCSAgV2hlbiB3ZSBzZWUgdHdvIHBhY2tldHMgd2l0aCBjb25zZWN1dGl2ZSBzZXFudW1zIGFuZCBhIGRpZmZlcmVudCBSVFAgdGltZSwgdXNlCisJICB0aGUgRFRTIGRpZmZlcmVuY2UgYXMgdGhlIGludGVyIHBhY2tldCBzcGFjaW5nIGVzdGltYXRlLgorCisyMDEzLTA4LTAxIDEyOjAxOjE1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjoga2VlcCB0cmFjayBvZiBjdXJyZW50IHRpbWVvdXQKKworMjAxMy0wOC0wMSAxMTo0OToxMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGNsZWFudXAgdGltZXIgaGFuZGxpbmcKKworMjAxMy0wOC0wMSAxMTo0MDo0MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHJlc2V0IGlzIG9ubHkgcG9zc2libGUgd2l0aCBhIEdBUAorCisyMDEzLTA4LTAxIDExOjI5OjMyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBvcGVyYXRlIG9uIERUUworCSAgTWFrZSB0aGUgaml0dGVyYnVmZmVyIHNjaGVkdWxlIHRoZSB0aW1lb3V0cyBiYXNlZCBvbiB0aGUgRFRTIGluc3RlYWQKKwkgIG9mIHRoZSBQVFMuIFRoaXMgbWFrZXMgaXQgYWxsIHNtb290aGVyIHdpdGggcmVvcmRlcmVkIGZyYW1lcyBhbmQgZ2l2ZXMKKwkgIHRoZSBkZWNvZGVyIHRpbWUgdG8gcmVvcmRlciB0aGUgZnJhbWVzIGluIHRpbWUuCisKKzIwMTMtMDgtMDEgMTE6MTQ6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiByZW5hbWUgdGltb3V0IHZhcmlhYmxlCisKKzIwMTMtMDctMzEgMTc6MDg6NTggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBzbWFsbCBjbGVhbnVwCisKKzIwMTMtMDctMzEgMTY6NTk6NTggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBibG9jayBvdXRwdXQgaW4gcGF1c2VkIG9yIGJ1ZmZlcmluZworCisyMDEzLTA3LTMxIDE2OjU5OjA5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogc3RvcmUgcHRzIGluIHRpbWVyCisJICBPbmx5IHN0b3JlIHRoZSBwdHMgaW4gdGhlIHRpbWVyIHNvIHRoYXQgd2UgY2FuIGJvdGggZG8gdGltZW91dHMgd2l0aCB0aW1pbmdzIG9uCisJICB0aGUgaW5wdXQgYW5kIG91dHB1dCBvZiB0aGUgaml0dGVyYnVmZmVyLgorCisyMDEzLTA3LTMwIDIzOjE0OjI0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogcmVmYWN0b3Igaml0dGVyYnVmZmVyCisJICBSZWZhY3RvciB0aGUgaml0dGVyYnVmZmVyIGNvZGUuIE1ha2Ugc2VwYXJhdGUgZnVuY3Rpb24gZm9yIHBlZWtpbmcgYSBidWZmZXIsCisJICBwdXNoaW5nIHRoZSBuZXh0IGJ1ZmZlciwgd2FpdGluZyBmb3IgdGltZW91dHMgYW5kIGhhbmRsaW5nIHRoZSB0aW1lb3V0cy4KKwkgIFRoZSBtYWluIGxvb3Agbm93IHRyaWVzIHRvIHB1c2ggYXMgbWFueSBidWZmZXJzIGFzIGl0IGNhbiB1bnRpbCBpdCBydW5zIG91dCBvZgorCSAgYnVmZmVycyBvciB3aGVuIGl0IGRldGVjdHMgYSBzZXFudW0gZGlzY29udC4gVGhlbiBpdCB3aWxsIHdhaXQgZm9yIHNvbWUgZXZlbnQgdG8KKwkgIGhhcHBlbiBiZWZvcmUgYXR0ZW1wdGluZyB0byBwdXNoIG1vcmUgYnVmZmVycy4KKwkgIE1ha2UgbWV0aG9kcyB0byByZWdpc3RlciB0aW1lb3V0cyBpbiBhbiBhcnJheS4gVGhlc2UgdGltZW91dHMgYXJlIHJlZ2lzdGVyZWQKKwkgIHdoZW4gd2UgZGV0ZWN0IGEgbWlzc2luZyBwYWNrZXQsIHN5bmMgZm9yIHRoZSBmaXJzdCBwYWNrZXQgb3Igd2hlbiB3ZSBmaW5kIGFuCisJICBlc3RpbWF0aW9uIGZvciB0aGUgZW5kLW9mLXN0cmVhbS4KKwkgIFRoaXMgZ3JlYXRseSBzaW1wbGlmaWVzIGFuZCBjbGFyaWZpZXMgdGhlIGNvZGUgYW5kIGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8KKwkgIHJlZ2lzdGVyIG1vcmUgY29tcGxpY2F0ZWQgdGltZW91dCBzY2hlbWVzIGxhdGVyLgorCisyMDEzLTA3LTMwIDE4OjUyOjU4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogdXNlIE5VTEwgdG8gaWdub3JlIHBlcmNlbnQKKwkgIElmIHdlIHBhc3MgTlVMTCB0byBwb3AgYW5kIHB1c2ggd2UgaWdub3JlIHRoZSBwZXJjZW50IHJlc3VsdC4KKworMjAxMy0wNy0zMCAwNzowMDoxOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHJlZmFjdG9yCisJICBNb3ZlIGVvcyBlc3RpbWF0aW9uIGludG8gc2VwYXJhdGUgZnVuY3Rpb24KKworMjAxMy0wNy0zMCAxNDoyODoxOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IGRvbid0IGxlYWsgc3RyZWFtX2lkIHN0cmluZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNTE0MgorCisyMDEzLTA3LTI5IDE5OjUzOjUyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBwby9MSU5HVUFTOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vamEucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vcGwucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJICBwbzogdXBkYXRlIHRyYW5zbGF0aW9ucworCisyMDEzLTA3LTI5IDE5OjQ4OjU0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSAgdGVzdHM6IGlnbm9yZSBuZXcgdGVzdCBiaW5hcmllcworCisyMDEzLTA3LTI5IDE0OjQ3OjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQKKworPT09IHJlbGVhc2UgMS4xLjMgPT09CisKKzIwMTMtMDctMjkgMTM6NDI6MTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS4xLjMKKworMjAxMy0wNy0yOSAxMzo0MjowNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxMy0wNy0yOSAxMjoxMjo0MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgZ3N0OiBEb24ndCBzd2FwIHN0YXJ0L3N0b3AgZm9yIG5lZ2F0aXZlIHJhdGVzIGluIHRoZSBTRUdNRU5UIHF1ZXJ5CisKKzIwMTMtMDctMjkgMTE6MTg6NDAgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQ2hlY2sgZm9yIGRhdGEgc2l6ZSB3aGVuIHBhcnNpbmcgaDI2NCBjb2RlYyBkYXRhIGZyb20gc3RyZiBhdG9tCisKKzIwMTMtMDctMjkgMTA6NTM6NTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBJbXBsZW1lbnQgU0VHTUVOVCBxdWVyeQorCisyMDEzLTA3LTI5IDEwOjUzOjQ3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBJbXBsZW1lbnQgU0VHTUVOVCBxdWVyeQorCisyMDEzLTA3LTI5IDEwOjUwOjU5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBJbXBsZW1lbnQgU0VHTUVOVCBxdWVyeQorCisyMDEzLTA3LTI3IDE4OjEwOjIyICswMjAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9mb3VyY2MuaDoKKwkgIHF0ZGVtdXg6IFN1cHBvcnQgSDI2NCBmb3VyY2MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDQ5OTYKKworMjAxMy0wNy0yOCAxODowOTozMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBGaXggaGFuZGxpbmcgb2YgaW1hZ2UgdGFncworCSAgVGhlIGNhcHMgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IHRoZSBtaW1ldHlwZSBhbmQgdGhlcmUgaXMKKwkgIG9ubHkgYW4gaW5mbyBzdHJ1Y3R1cmUgZm9yIHRoZSBHc3RTYW1wbGUgaWYgdGhlIGltYWdlLXR5cGUKKwkgIGlzIG5vdCBOT05FLgorCisyMDEzLTA3LTI4IDE4OjA0OjMyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IERvbid0IGNyYXNoIGlmIHRoZXJlIGlzIG5vIGltYWdlIHRhZyBpbmZvcm1hdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNTAxOAorCisyMDEzLTA3LTI4IDE3OjM4OjU2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBGaXggZHVyYXRpb24gcmVwb3J0aW5nIGluIHB1c2ggbW9kZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDkzMworCisyMDEzLTA3LTI4IDE3OjMyOjI3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBEb24ndCBmb3JnZXQgdW5tYXBwaW5nIGFuZCB1bnJlZmZpbmcgYnVmZmVyCisKKzIwMTMtMDctMjYgMjE6MDY6MTcgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiB1bm1hcCBidWZmZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDQ5NTEKKworMjAxMy0wNy0yNiAyMjozMTo0MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogZG9uJ3QgbWFrZSBidWZmZXIgd3JpdGFibGUgcHJlbWF0dXJlbHkKKwkgIFRoZXJlIGlzIG5vIHJlYXNvbiB0byBtYWtlIHRoZSBTUiBidWZmZXIgd3JpdGFibGUgYXQgdGhpcyBwb2ludC4gVGhpcyBpcyBiZXR0ZXIKKwkgIGRlbGF5ZWQgdW50aWwgbmVlZGVkLgorCisyMDEzLTA3LTI2IDIyOjI1OjUwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBpZ25vcmUgUlRDUCBmb3IgaW5hY3RpdmUgc291cmNlcworCisyMDEzLTA3LTI2IDIyOjI1OjE3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBzbWFsbCBjbGVhbnVwCisKKzIwMTMtMDctMjYgMTc6MTc6MzEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oOgorCSAgc2Vzc2lvbjogaGFuZGxlIHBhcnRpYWwgUlRDUCByZXBvcnQgYmxvY2tzCisJICBXaGVuIHdlIGhhdmUgbW9yZSBTU1JDcyB0byByZXBvcnQgdGhhbiB3aGF0IGZpdCBpbiBhbiBSVENQIHBhY2tldCwgdXNlIGEKKwkgIGdlbmVyYXRpb24gY291bnRlciB0byBtYWtlIHN1cmUgYWxsIG9mIHRoZW0gZW5kIHVwIGluIGEgcGFja2V0IGV2ZW50dWFsbHkuCisKKzIwMTMtMDctMjYgMTc6MjM6MTAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHNlc3Npb246IGNyZWF0ZSBTU1JDIGJlZm9yZSBkb2luZyBzZXNzaW9uIGNsZWFudXAKKwkgIE1ha2UgdGhlIGludGVybmFsIHNvdXJjZSBiZWZvcmUgd2UgZG8gc2Vzc2lvbiBjbGVhbnVwCisKKzIwMTMtMDctMjYgMTc6MjE6MDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHNlc3Npb246IHJlb3JnYW5pemUgdGhlIHJlcG9ydCBibG9jayBjb2RlCisKKzIwMTMtMDctMjYgMTY6MDI6MDEgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogZml4IG1lbW9yeSBsZWFrIGluIGNoZWNrX3N1YnRpdGxlX2J1ZmZlcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNDkyMQorCisyMDEzLTA3LTI2IDE0OjIxOjQwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiByZWZhY3RvciBhY3RpdmUgYW5kIHNlbmRlciBjaGVja3MKKworMjAxMy0wNy0yNiAxMjowNjozNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogcmVtb3ZlIGludGVybmFsIHNvdXJjZXMgb24gdGltZW91dAorCSAgV2hlbiBhbiBpbnRlcm5hbCBzb3VyY2UgdGltZXMgb3V0IGFuZCBiZWNvbWVzIGEgcmVjZWl2ZXIsIHJlbW92ZSBpdC4KKworMjAxMy0wNy0yNiAxMTo0Nzo1NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogY3JlYXRlIGFuIGludGVybmFsIHNvdXJjZSBmb3IgUlRDUAorCSAgV2hlbiB3ZSBuZWVkIHRvIGRvIFJUQ1AgYW5kIHdlIGRvbid0IGhhdmUgYW4gaW50ZXJuYWwgc291cmNlIHlldCwKKwkgIG1ha2Ugb25lLgorCisyMDEzLTA3LTI2IDEwOjQ3OjI4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHNlc3Npb246IHJlbW92ZSBvbGQgY29kZSB0byBjaGFuZ2UgU1NSQworCSAgUmVtb3ZlIGNvZGUgdXNlZCB0byBjaGFuZ2UgdGhlIFNTUkMgYWZ0ZXIgYSBjb2xsaXNpb24uIFdlIG5vdyBzZW5kCisJICBhIFJFQ09ORklHVVJFIGV2ZW50IHVwc3RyZWFtIHRvIG1ha2UgdGhlIHVwc3RyZWFtIGVsZW1lbnQgY2hhbmdlIHRoZSBTU1JDLgorCisyMDEzLTA3LTI2IDEwOjQyOjQ0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHNvdXJjZTogZG9uJ3QgdXBkYXRlIHBhY2tldCBTU1JDCisJICBSZW1vdmUgdGhlIGNvZGUgdG8gdXBkYXRlIHRoZSBTU1JDIGluIHBhY2tldHMsIGl0IGNhbiBuZXZlciBiZSBjYWxsZWQgbm93IHRoYXQKKwkgIHdlIGFsd2F5cyB1c2UgYSBzb3VyY2Ugd2l0aCBtYXRjaGluZyBwYWNrZXQgU1NSQy4KKworMjAxMy0wNy0yNiAxMDoyNDoyMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgc2Vzc2lvbjogZGVsYXkgYWxsb2NhdGlvbiBvZiBpbnRlcm5hbCBzb3VyY2UKKwkgIEFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzb3VyY2Ugd2hlbiB3ZSByZWNlaXZlIGEgY2FwcyB3aXRoIHRoZSBTU1JDIG9yIHdoZW4gd2Ugc2VlCisJICBhIGJ1ZmZlciB3aXRoIHRoZSBTU1JDLgorCisyMDEzLTA3LTI2IDEwOjAwOjU4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBnZW5lcmF0ZSByZWNvbmZpZ3VyZSBvbiBjb2xsaXNpb24KKwkgIFdoZW4gd2UgZGV0ZWN0IGEgY29sbGlzaW9uLCBjaGFuZ2UgdGhlIFNTUkMgdGhhdCB3ZSBzdWdnZXN0IHVwc3RyZWFtCisJICBhbmQgdHJpZ2dlciBSRUNPTkZJR1VSRS4gVGhpcyBzaG91bGQgbWFrZSB1cHN0cmVhbSBzZWxlY3QgYSBuZXcgU1NSQy4KKworMjAxMy0wNy0yNiAwOTozNzoyNCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgc2Vzc2lvbjogcHJvZHVjZSBSVENQIGZvciBhbGwgaW50ZXJuYWwgc291cmNlcworCSAgTG9vcCBvdmVyIGFsbCB0aGUgaW50ZXJuYWwgc291cmNlcyBhbmQgcHJvZHVjZSBSVENQLiBXZSBhbHNvIG5lZWQKKwkgIHRvIHF1ZXVlIHRoZSBSVENQIHBhY2tldHMgYW5kIHNlbmQgdGhlbSB3aGVuIHdlIGFyZSBmaW5pc2hlZC4KKworMjAxMy0wNy0yNiAwMTo0MDoyMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgc2Vzc2lvbjogZGVwcmVjYXRlIGludGVybmFsIHNvdXJjZSBhbmQgc3NyYyBwcm9wZXJ0aWVzCisJICBEZXByZWNhdGUgdGhlIGludGVybmFsIHNvdXJjZSBhbmQgaW50ZXJuYWwgc3NyYyBwcm9wZXJ0aWVzLiBUaGVyZSBtaWdodAorCSAgYmUgbW9yZSB0aGFuIG9uZSBpbnRlcm5hbCBzb3VyY2UuCisKKzIwMTMtMDctMjYgMDE6Mjk6MDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHNlc3Npb246IGludGVybmFsIHNvdXJjZXMgZG9uJ3QgdXNlIHByb2JhdGlvbgorCisyMDEzLTA3LTI2IDAxOjI0OjA3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBnaXZlIGNhcHMgdG8gc2Vzc2lvbgorCSAgTGV0IHRoZSBzZXNzaW9uIHBhcnNlIHRoZSBjYXBzIGFuZCB1cGRhdGUgaXRzIFNTUkMgd2hlbiBuZWVkZWQuCisKKzIwMTMtMDctMjYgMDE6MTQ6MDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIHNlc3Npb246IG1ha2UgbWV0aG9kIHRvIHN1Z2dlc3QgYXZhaWxhYmxlIFNTUkMKKwkgIE1ha2UgYSBtZXRob2QgdG8gc3VnZ2VzdCB0aGUgYmVzdCBhdmFpbGFibGUgU1NSQy4gVGhpcyBpcyB0aGUgU1NSQyBvZiB0aGUgbGFzdAorCSAgY3JlYXRlZCBpbnRlcm5hbCBzb3VyY2UgYW5kIGlzIHVzZWQgdG8gaW5zdHJ1Y3QgdXBzdHJlYW0gdG8gcHJvZHVjZSB0aGlzCisJICBTU1JDLgorCisyMDEzLTA3LTI2IDAxOjAxOjQ5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBzZXNzaW9uOiBrZWVwIFNERVMgYW5kIHNldCBvbiBuZXcgaW50ZXJuYWwgc291cmNlcworCSAgS2VlcCB0cmFjayBvZiB0aGUgU0RFUyBvdXJzZWx2ZXMgYW5kIHNldCBpdCBvbiBhbGwgbmV3bHkgY3JlYXRlZAorCSAgaW50ZXJuYWwgc291cmNlcy4KKworMjAxMy0wNy0yNiAwMDo0ODoyNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogbWFrZSBtZXRob2QgdG8gbWFrZSBpbnRlcm5hbCBzb3VyY2VzCisJICBBZGQgYSBtZXRob2QgdG8gb2J0YWluIGFuIGludGVybmFsIHNvdXJjZSBhbmQgdXNlIGl0IHRvIGNyZWF0ZQorCSAgb3VyIGludGVybmFsIHNvdXJjZQorCisyMDEzLTA3LTI2IDAwOjI5OjQxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgc2Vzc2lvbjogY291bnQgaW50ZXJuYWwgc291cmNlcyBhbmQgaG93IG1hbnkgYXJlIHNlbmRlcnMKKworMjAxMy0wNy0yNiAwMDoxNDoyOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjogc2VwYXJhdGUgQllFIG1hcmtpbmcgYW5kIHNjaGVkdWxpbmcKKwkgIEZpcnN0IG1hcmsgc291cmNlcyB3aXRoIEJZRSBhbmQgdGhlbiBzY2hlZHVsZSB0aGUgQllFIFJUQ1AgbWVzc2FnZS4KKworMjAxMy0wNy0yNSAyMzo1Njo0NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogZ2V0IFNTUkMgZnJvbSBSVENQIHBhY2tldCBpdHNlbGYKKwkgIEdldCB0aGUgU1NSQyBmcm9tIHRoZSBSVENQIHBhY2tldCBpbnN0ZWFkLgorCisyMDEzLTA3LTI1IDIzOjUxOjM0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBmaXggYmFuZHdpZHRoIGNhbGN1bGF0aW9uCisJICBXZSBpdGVyYXRlIG92ZXIgYWxsIHNvdXJjZXMgYW5kIHRoZSBpbnRlcm5hbCBvbmUgaXMgYWxzbyBpbiB0aGUKKwkgIGhhc2h0YWJsZSBzbyBhdm9pZCBhZGRpbmcgaXQgdHdpY2UuCisKKzIwMTMtMDctMjUgMjM6Mzg6MDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHNlc3Npb246IGFkZCBzb21lIGRvY3MKKworMjAxMy0wNy0yNSAyMzoxMTowNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogUmVhcnJhbmdlIFJUQ1AgcmVwb3J0aW5nIGEgbGl0dGxlCisJICBNYWtlIGEgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgYW4gUlRDUCBwYWNrZXQgZm9yIGEgc291cmNlLCBwYXNzIHRoZSBzb3VyY2UgYXMgYQorCSAgcGFyYW1ldGVyLgorCSAgTW92ZSB0aW1lb3V0IG9mIGNvbGxpc2lvbnMgdG8gc2Vzc2lvbiBjbGVhbnVwIHBoYXNlLgorCisyMDEzLTA3LTI1IDIyOjM5OjA0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBtb3ZlIGNoZWNrIGZvciBpc19lYXJseSBhcm91bmQKKwkgIE1vdmUgdGhlIGNoZWNrIGZvciB0aGUgZWFybHkgUlRDUCB0byB3aGVyZSBpdCBpcyBuZWVkZWQgYW5kIHVzZWQuCisKKzIwMTMtMDctMjUgMTc6MzU6MDIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHNlc3Npb246IHBhcnNlIHBhY2tldCBvdXRzaWRlIG9mIHRoZSBzZXNzaW9uIGxvY2sKKworMjAxMy0wNy0yNSAxNzozNDowNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogZG8gbmljZXIgY2hlY2tzIGZvciBpbnRlcm5hbCBzb3VyY2VzCisKKzIwMTMtMDctMjUgMTc6MTU6MzcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBzZXNzaW9uOiBsZXQgc291cmNlIGtlZXAgdHJhY2sgaWYgaXQgc2VudCBCWUUKKworMjAxMy0wNy0yNSAxNzowNjoyMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBzb3VyY2U6IHJlc2V0IG1vcmUKKworMjAxMy0wNy0yNSAxNjo0OTo0MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIHNvdXJjZTogYWxzbyB1c2UgdGhlIHNvdXJjZSBmb3IgYnllX3JlYXNvbgorCSAgU3RvcmUgdGhlIEJZRSByZWFzb24gaW4gb3VyIGludGVybmFsIHNvdXJjZSBvYmplY3QuIFJlbmFtZSB0aGUgbWV0aG9kcyBvbiB0aGUKKwkgIHNvdXJjZSBvYmplY3QgYSBsaXR0bGUgYmVjYXVzZSBub3cgdGhlIEJZRSBjYW4gYmUgcmVjZWl2ZWQgaW4gUlRDUCBvcgorCSAgc2V0IHdoZW4gdGhlIHNlc3Npb24gd2FudHMgdG8gc2VuZCBCWUUuCisKKzIwMTMtMDctMjUgMTY6MjQ6MDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBzZXNzaW9uOiBjb25maWd1cmUgc2RlcyB3aXRoIHN0cnVjdHVyZSBvbmx5CisJICBSZW1vdmUgY29kZSB0byBjb25maWd1cmUgdGhlIFNERVMgd2l0aCBtZXRob2RzIGFuZCB0eXBlcywgb25seQorCSAgYWxsb3cgY29uZmlndXJhdGlvbiB3aXRoIEdzdFN0cnVjdHVyZQorCisyMDEzLTA3LTI1IDE1OjU2OjM5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiByZWZhY3RvciBhZGQgYW5kIGZpbmQgc291cmNlCisJICBNYWtlIGZ1bmN0aW9ucyB0byBmaW5kIGFuZCBhZGQgYSBzb3VyY2UgdG8gdGhlIGhhc2h0YWJsZS4KKworMjAxMy0wNy0yNSAxNTo0MzoxMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgc2Vzc2lvbjogcmVtb3ZlIHNvdXJjZSBmcm9tIHN5bmNfcnRjcAorCSAgV2UgZG9uJ3QgbmVlZCB0byBrbm93IHRoZSBzZW5kZXIgc291cmNlIG9mIHRoZSBzZXNzaW9uIGluIHRoZQorCSAgY2FsbGJhY2ssIHRoZSBTUiBwYWNrZXQgaXMgZm9yIGFsbCBwYXJ0aWNpcGFudHMgaW4gdGhlIHNlc3Npb24uCisKKzIwMTMtMDctMjQgMTQ6MTg6MTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBhZGQgc29tZSBtb3JlIGRlYnVnCisKKzIwMTMtMDctMTUgMTc6MTE6NDUgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL01ha2VmaWxlLmFtOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5oOgorCSAgYWFjcGFyc2U6IGFsbG93IGNvbnZlcnNpb24gZnJvbSBBRFRTIHRvIHJhdyBBQUMKKwkgIFNvbWUgbXV4ZXJzIChlZywgcXRtdXgpIG9ubHkgc3VwcG9ydCByYXcgQUFDLCBzbyB0aGlzIGFsbG93cyBsaW5raW5nCisJICBhbiBlbmNvZGVyIHRoYXQgb3V0cHV0cyBBRFRTIG9ubHkgdG8gdGhvc2UgbXV4ZXJzLgorCSAgVGhlIGNvbnZlcnNpb24gaXMgc2ltcGxlIChvbWl0IHRoZSBmaXJzdCA3IG9yIDkgYnl0ZXMgb2YgdGhlIGZyYW1lKSwKKwkgIGJ1dCBoYXMgdG8gYmUgZG9uZSBpbiBwcmVfcHVzaCBpbnN0ZWFkIG9mIGhhbmRsZV9mcmFtZSBhcyAxLjAgZG9lcworCSAgbm90IHNlZW0gdG8gYWxsb3cgc2tpcHBpbmcgYnl0ZXMgdGhlcmUgYXMgMC4xMCB1c2VkIHRvLgorCSAgT3RoZXIgY29udmVyc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgKHlldCkuCisKKzIwMTMtMDctMTUgMTc6MTU6NDQgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogZml4IG9iamVjdF90eXBlIHBhcnNpbmcgb2ZmLWJ5LW9uZSBpbiBBRFRTIGZyYW1lCisJICBBY2NvcmRpbmcgdG8gaHR0cDovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9QURUUywKKwkgIHRoZSB2YWx1ZSBzdG9yZWQgaW4gQURUUyBoZWFkZXJzIGlzIG9uZSBsZXNzIHRoYW4gdGhlIG9iamVjdAorCSAgdHlwZSBvZiB0aGUgQUFDIHN0cmVhbS4KKwkgIEEgbG9vayBhdCBmZm1wZWcgc2hvd3MgaXQgYWxzbyBhZGRzIDEgdG8gdGhlIHZhbHVlIHJlYWQgb2ZmCisJICB0aGUgQURUUyBoZWFkZXIuCisJICBOb3RlIHRoYXQgdGhpcyBtaWdodCBicmVhayBvdGhlciB0aGluZ3MgdGhhdCBoYXBwZW4gdG8gaGF2ZQorCSAgYW4gaW52ZXJzZSBvZmYgYnkgb25lIHRvIG1hdGNoIHRoZSBleGlzdGluZyBjb2RlLgorCisyMDEzLTA3LTI1IDExOjEzOjAxIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggc2VxbnVtIGhhbmRsaW5nIGZvciBzZWVrcworCSAgVXNlIHRoZSBzYW1lIHNlcW51bSBhcyB0aGUgc2VlayBmb3IgZmx1c2hlcy9zZWdtZW50cyB0aGF0IGFyZQorCSAgY2F1c2VkIGJ5IHRoZSBzZWVrLiBBbHNvIGRvIHRoZSBzYW1lIGZvciBzZWdtZW50IGV2ZW50cworCSAgRml4ZXMgIzY3NjI0MgorCisyMDEzLTA3LTI1IDAxOjM5OjU4IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICBtYXRyb3NrYWRlbXV4OiBmaXggc2VxbnVtIGhhbmRsaW5nIGZvciBzZWVrcworCSAgVXNlIHRoZSBzYW1lIHNlcW51bSBhcyB0aGUgc2VlayBmb3IgZmx1c2hlcy9zZWdtZW50cyB0aGF0IGFyZQorCSAgY2F1c2VkIGJ5IHRoZSBzZWVrLiBBbHNvIGRvIHRoZSBzYW1lIGZvciBzZWdtZW50IGV2ZW50cworCSAgRml4ZXMgIzY3NjI0MgorCisyMDEzLTA3LTI1IDAxOjExOjMxIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogY29ycmVjdGx5IGhhbmRsZSBzZXFudW0gZm9yIHNlZWtzIGFuZCBzZWdtZW50cworCSAgVXNlIHRoZSBzYW1lIHNlcW51bSBvbiBtZXNzYWdlcyBhbmQgZXZlbnRzIGZvciBkZXJpdmVkIGV2ZW50cy4KKwkgIEZpeGVkIGZvciBmbHVzaGVzIC8gc3RyZWFtLXN0YXJ0IC8gc2VnbWVudCBhZnRlciBhIHNlZWssIGFuZCBzZWdtZW50CisJICBhZnRlciBhIHNlZ21lbnQuCisJICBGaXhlcyAjNjc2MjQyCisKKzIwMTMtMDctMTIgMjA6MDE6NDIgKzAyMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IGFsd2F5cyBpZ25vcmUgSEVBRCBlcnJvcnMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDQyNDEKKworMjAxMy0wNy0yNSAxNDoyNjowNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJICBqcGVnZW5jOiBDbGVhbiB1cCByZXNldC9zdGFydC9zdG9wIGhhbmRsaW5nCisKKzIwMTMtMDctMjUgMTQ6MTM6MTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAganBlZ2RlYzogVXNlIGJhc2UgY2xhc3MgZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb24gaW5zdGVhZCBvZiByZXBsaWNhdGluZyBpdCBoZXJlCisKKzIwMTMtMDctMjUgMTQ6MTI6NTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogQ2xlYW4gdXAgaGFuZGxpbmcgb2YgcmVzZXQvc3RhcnQvc3RvcAorCisyMDEzLTA3LTI1IDEwOjQxOjIyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvZmlsZXMvaWQzLTQwNzM0OS0xLnRhZzoKKwkqIHRlc3RzL2ZpbGVzL2lkMy00MDczNDktMi50YWc6CisJKiB0ZXN0cy9maWxlcy9pZDMtNDQ3MDAwLXdjb3AudGFnOgorCSAgdGVzdHM6IGZpeCB0ZXN0IElEMyB0YWdzIHVwIG5vdCB0byByZWx5IG9uIGRvZGd5IHR5cGVmaW5kaW5nIGNvZGUKKwkgIENoYW5nZSAweGZmIDB4ZmIgJ21wMycgbWFya2VyIHRvICdmTGFDJyBtYXJrZXIsIHNvIHdlIGNhbiBmaXgKKwkgIHRoZSB0eXBlZmluZGVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MTM2OAorCisyMDEzLTA3LTI1IDA4OjIyOjQ1ICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSAgb3N4YXVkaW9zaW5rOiBpbnRlcnNlY3QgdGhlIHByb2JlZCBjYXBzIHdpdGggdGhlIGZpbHRlciBwYXNzZWQgdG8gZ2V0X2NhcHMoKQorCisyMDEzLTA3LTI0IDE0OjE3OjQ1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIGJpbjogZml4IGNvbXBpbGF0aW9uCisKKzIwMTMtMDctMjQgMTI6NDI6MzEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJICB2cmF3ZGVwYXk6IGZpeCBVWVZQIGZvcm1hdAorCisyMDEzLTA3LTI0IDEyOjQxOjU4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkgIHZyYXdwYXk6IGZpeCBVWVZQIGZvcm1hdAorCisyMDEzLTA3LTI0IDEyOjQxOjQ0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkgIHZyYXdwYXk6IGZpeCBjYXBzCisKKzIwMTMtMDctMjQgMTA6NDk6MDMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBmaXggbG9ja2luZworCSAgVGFrZSB0aGUgbG9jayBlYXJsaWVyIHNvIHRoYXQgd2UgZG8gdGhpbmdzIHRoYXQgZm9sbG93IHdpdGggdGhlIHJpZ2h0CisJICBsb2NraW5nLgorCisyMDEzLTA3LTIzIDE3OjQwOjAyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBkb24ndCB1c2UgaW52YWxpZCB0aW1lcyBpbiBSVENQIHRpbWVvdXRzCisJICBBbiBpbnZhbGlkIHRpbWVvdXQgY2FuIGJlIGNhbGN1bGF0ZWQgd2hlbiB3ZSBkaXNhYmxlZCBSVENQIGJ5IHNldHRpbmcgdGhlCisJICBiYW5kd2lkdGggdG8gMC4gTWFrZSBzdXJlIGFsbCBjb2RlIGNhbiBoYW5kbGUgdGhpcyBjYXNlLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NDYyNgorCisyMDEzLTA3LTIzIDE3OjM4OjIwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBsb2NrIHNlc3Npb24gd2hlbiBjaGFuZ2luZyBiYW5kd2lkdGgKKwkgIFRha2UgdGhlIHNlc3Npb24gbG9jayB3aGVuIGNoYW5naW5nIHRoZSBiYW5kd2lkdGggcHJvcGVydGllcyBzbyB0aGF0IHdlIGRvbid0CisJICBlbmQgdXAgd2l0aCBpbmNvbnNpc3RlbnQgYmVoYXZpb3VyLgorCisyMDEzLTA3LTIzIDE3OjM3OjA1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiByZXNldCBzb21lIFJUQ1AgdmFyaWFibGVzCisJICBUaGUgZWFybHlfc2VuZCB0aW1lIHdhcyBzZXQgdG8gMCBhbmQgYWx3YXlzIHRyaWdnZXJpbmcgYW4gZWFybHkgUlRDUCBwYWNrZXQuCisKKzIwMTMtMDctMjMgMTU6MDM6MzEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEFkZCBhbGwgdGhlIG1wZWcgWERDQU0gdmFyaWFudHMKKwkgIFRoaXMgc2hvdWxkIGNvdmVyIGFsbCBrbm93biBYRENBTSB2YXJpYW50cyAod2hpY2ggYXJlIGFsbCBtcGVnMiB2aWRlbykKKwkgIEZpeGVzICM2NzIyMjcKKworMjAxMy0wNy0wMyAxODo0MTo0MiArMDIwMCAgQ2FybG9zIFJhZmFlbCBHaWFuaSA8ZHZAcHNldWRvdGVybWluYWwub3JnPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgcnRwYmluOiBhZGRlZCBjdXN0b20gZG93bnN0cmVhbSBzeW5jIGV2ZW50CisJICBydHBiaW4gY2FuIG5vdyBzZW5kIGEgY3VzdG9tIGluLWJhbmQgZG93bnN0cmVhbSBldmVudCB3aGljaCBpbmZvcm1zCisJICBkb3duc3RyZWFtIHRoYXQgdGhlIGJpbiBoYXMgcmVjZWl2ZWQgYW4gUlRDUCBTUiBwYWNrZXQuIFRoaXMgaXMgdXNlZnVsCisJICBmb3IgYXBwbGljYXRpb25zIHdoaWNoIHdhbnQgdG8gZHJvcCB0aGUgaW5pdGlhbCB1bnN5bmNocm9uaXplZCByZWNlaXZlZAorCSAgUlRQIHBhY2tldHMuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAzNTYwCisJICBTaWduZWQtb2ZmLWJ5OiBDYXJsb3MgUmFmYWVsIEdpYW5pIDxkdkBwc2V1ZG90ZXJtaW5hbC5vcmc+CisKKzIwMTMtMDctMjIgMTg6MDA6MTYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBmaXggb24tdGhlLWZseSBjaGFuZ2luZyBvZiAibW9kZSIgYW5kICJmaWVsZHMiIHByb3BlcnRpZXMKKwkgIFdlIGNhbGwgc2V0Y2FwcygpIHRvIHJlY29uZmlndXJlIG91cnNlbHZlcywgYnV0IHdlIG5lZWQgdG8gcGFzcworCSAgdGhlIGN1cnJlbnQgKnNpbmsqIGNhcHMsIG5vdCB0aGUgc291cmNlIGNhcHMgdGhlbi4gQWxzbyBmaXggYQorCSAgY2FwcyBsZWFrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0MTU5OQorCisyMDEzLTA3LTIyIDE1OjIzOjM5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IEFkZCBzdXBwb3J0IGZvciBncm91cC1pZCBpbiB0aGUgc3RyZWFtLXN0YXJ0IGV2ZW50CisKKzIwMTMtMDctMjIgMTU6MjM6MjAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogQWRkIHN1cHBvcnQgZm9yIGdyb3VwLWlkIGluIHRoZSBzdHJlYW0tc3RhcnQgZXZlbnQKKworMjAxMy0wNy0yMiAxNToyMzoxMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBBZGQgc3VwcG9ydCBmb3IgZ3JvdXAtaWQgaW4gdGhlIHN0cmVhbS1zdGFydCBldmVudAorCisyMDEzLTA3LTIyIDE1OjIyOjU1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICBtYXRyb3NrYWRlbXV4OiBBZGQgc3VwcG9ydCBmb3IgZ3JvdXAtaWQgaW4gdGhlIHN0cmVhbS1zdGFydCBldmVudAorCisyMDEzLTA3LTIyIDE1OjIyOjQ3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4Lmg6CisJICBxdGRlbXV4OiBBZGQgc3VwcG9ydCBmb3IgZ3JvdXAtaWQgaW4gdGhlIHN0cmVhbS1zdGFydCBldmVudAorCisyMDEzLTA3LTIyIDE1OjIyOjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkgIGZsdmRlbXV4OiBBZGQgc3VwcG9ydCBmb3IgZ3JvdXAtaWQgaW4gdGhlIHN0cmVhbS1zdGFydCBldmVudAorCisyMDEzLTA3LTIyIDE1OjIyOjE2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIGF2aWRlbXV4OiBBZGQgc3VwcG9ydCBmb3IgZ3JvdXAtaWQgaW4gdGhlIHN0cmVhbS1zdGFydCBldmVudAorCisyMDEzLTA3LTIyIDE1OjIxOjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJKiBleHQvZHYvZ3N0ZHZkZW11eC5oOgorCSAgZHZkZW11eDogQWRkIHN1cHBvcnQgZm9yIGdyb3VwLWlkIGluIHRoZSBzdHJlYW0tc3RhcnQgZXZlbnQKKworMjAxMy0wNy0xOSAyMjo1OToxNSArMDIwMCAgTWF0aGlldSBEdXBvbmNoZWxsZSA8bWF0aGlldS5kdXBvbmNoZWxsZUBlcGl0ZWNoLmV1PgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogdXNlIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSpfcm91bmQuCisJICBUaGVyZSBjb3VsZCBiZSBhIGNhc2Ugd2hlcmU6CisJICAxKSB5b3UgZG8gYSBuZXcgc2V0X2NhcHMgYWZ0ZXIgYnVmZmVycyBoYXZlIGJlZW4gcHJvY2Vzc2VkLgorCSAgMikgdHNfb2Zmc2V0IGdldHMgc2V0IHRvIGEgZGlmZmVyZW50IHZhbHVlLCBlZyAwLjAzMzMzMzMzMworCSAgMykgeW91ciBwYWRzIGdldCBFT1MsIGJ1dCB0aGUgY2hlY2sgZG9yIHRoYXQgZG9lc24ndCB3b3JrCisJICBiZWNhdXNlIHlvdSB1c2UgdHNfb2Zmc2V0ICsgYSB0cnVuY2F0ZWQgdmFsdWUgPCBzZWdtZW50LnN0b3AKKwkgIDQpIHNvIGluIHRoZSBuZXh0IGNvbGxlY3RlZCwgeW91IGVuZCB1cCBjb21wYXJpbmcgZm9yIGV4YW1wbGU6CisJICAwLjk5OTk5OTk5OTkgPiAxLiwgd2hpY2ggaXMgZmFsc2UgYW5kIG1lYW5zIHlvdSBkb24ndCBzZW5kIEVPUy4KKwkgIEFsc28gYWRkcyBzY2FsZV9yb3VuZCBpbiB0d28gb3RoZXIgcGxhY2VzIHdoZXJlIGl0IHBvdGVudGlhbGx5IGNvdWxkCisJICBoYXZlIGNhdXNlZCBwcm9ibGVtcy4KKworMjAxMy0wNy0xNSAxNzo1NToxOSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZm91cmNjLmg6CisJICBxdGRlbXV4OiBBZGQgV1JMRSBzdXBwb3J0CisKKzIwMTMtMDctMTkgMTk6MzU6MjYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9mb3VyY2MuaDoKKwkgIHF0ZGVtdXg6IG1ha2UgZmlsZXMgZnJvbSBWaXZvdGVrIGNhbWVyYSBwbGF5CisJICBTa2lwIHRyYWNrcyBvZiAndml2bycgc3VidHlwZSB3aXRoIGVtcHR5IHN0c2QgaW5zdGVhZCBvZgorCSAgZXJyb3Jpbmcgb3V0IHNheWluZyB0aGF0IHRoZSBmaWxlIGlzIGJyb2tlbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTk3OTEKKworMjAxMy0wNy0xOSAxNzoxNDowNiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiB3aGVuIHN0cmVhbWluZyBkb24ndCB0cnkgdG8gc2VlayB3aGVuIHN0b3BwaW5nCisJICBJdCBtaWdodCBjYXVzZSBlcnJvcnMgaW4gc2lua3MgdGhhdCBhcmUgbm90IHNlZWthYmxlIGFuZAorCSAgaGF2ZSByZXBvcnRlZCB0aGlzIChsaWtlIGUuZy4gZmRzaW5rKQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NjIyOAorCisyMDEzLTA3LTE5IDE3OjI2OjU0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHNpbXBsaWZ5IHNvbWUgaGVscGVycworCSAgU29tZSBoZWxwZXIgZnVuY3Rpb25zIGFyZSBub3QgbmVlZGVkIGFueW1vcmUgb3IgY2FuIGJlIHNpbXBsaWZpZWQuCisKKzIwMTMtMDctMTkgMTc6MTI6MzcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZm9yIG5vbi1yYXcgdmlkZW8sIG1vdmUgcGFsZXR0ZSBpbiBjYXBzCisJICBXZSBvbmx5IG5lZWQgdG8gYXBwZW5kIHRoZSBwYWxldHRlIHRvIHJhdyB2aWRlbyBidWZmZXJzLCBub24tcmF3IHZpZGVvIGhhcyB0aGUKKwkgIHBhbGV0dGUgaW4gdGhlIGNhcHMgc3RpbGwuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA0MjkyCisKKzIwMTMtMDctMTkgMDE6NDk6MjAgKzAyMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IG5pdHBpY2tpbmcgaW4gZXNkcyBwYXJzaW5nCisKKzIwMTMtMDctMTkgMDE6NDk6MDcgKzAyMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHNldCBwcm9wZXIgY2FwcyBmb3IgbXBlZy0xIGF1ZGlvCisJICBSZW1vdmUgQUFDIHNwZWNpZmljIGZpZWxkcyBmcm9tIG1wZWctMSBhdWRpbyBjYXBzLCByZW1vdmUgYXNzdW1wdGlvbgorCSAgdGhhdCB0aGUgbXBlZzEgYXVkaW8gbGF5ZXIgaXMgMywgYW5kIHNldCBgcGFyc2VkJyBmaWVsZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDQ1NDgKKworMjAxMy0wNi0xNyAyMToyNzozNyArMDIwMCAgQXJuYXVkIFZyYWMgPGF2cmFjQGZyZWVib3guZnI+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZGVjLmg6CisJKiBleHQvdnB4L2dzdHZwOGVuYy5oOgorCSogZXh0L3ZweC9nc3R2cDlkZWMuaDoKKwkqIGV4dC92cHgvZ3N0dnA5ZW5jLmg6CisJICB2cHg6IGZpeCBjb21waWxhdGlvbiB3aGVuIGVuY29kZXIgb3IgZGVjb2RlciBoZWFkZXJzIGFyZSBub3QgaW5zdGFsbGVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA0NTQ3CisKKzIwMTMtMDctMTYgMjA6NDE6MTUgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6CisJICB2aWRlb2Nyb3A6IEZpeCB1bml0IGZvciBHUkFZMTYgZm9ybWF0cworCisyMDEzLTA3LTE2IDIyOjE3OjE3ICswMjAwICBBcm5hdWQgVnJhYyA8YXZyYWNAZnJlZWJveC5mcj4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiByZW1vdmUgY2hhcHRlciBzdHJlYW0KKwkgIFJlbW92ZSBhbGwgc3RyZWFtcyB0aGF0IGFyZSBhY3R1YWxseSB0YWJsZSBvZiBjb250ZW50cywgc2luY2Ugd2Ugd2lsbAorCSAgbmV2ZXIgbmVlZCB0aGUgZGF0YSBhZnRlciBwYXJzaW5nIHRoZW0uCisKKzIwMTMtMDctMTYgMjE6NTk6MzcgKzAyMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHNlbmQgZ2FwIGV2ZW50IGZvciBzcGFyc2Ugc3RyZWFtcyBpbiBwdXNoIG1vZGUKKwkgIFRoaXMgYWxsb3dzIHRvIHByZS1yb2xsIGF0IGxlYXN0IGlmIHRoZSBuZXh0IHN1YnRpdGxlIGJ1ZmZlcgorCSAgaXMgZmFyIGF3YXkuCisKKzIwMTMtMDctMTYgMjE6NTY6MDcgKzAyMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGRvIG5vdCB1c2UgaW5kZXhlcyBmcm9tIHNwYXJzZSBzdHJlYW0gd2hlbiBzZWVraW5nIGluIHB1c2ggbW9kZQorCSAgVGhpcyBtYWtlcyBzZWVraW5nIG1vcmUgYWNjdXJhdGUgaW4gcHVzaCBtb2RlLCBzaW5jZSB0aGUgcHJldmlvdXMKKwkgIGtleWZyYW1lIG9uIGEgc3BhcnNlIHN0cmVhbSBtaWdodCBiZSBmYXIgYXdheS4KKworMjAxMy0wNy0xNiAyMTowNDowNyArMDIwMCAgQXJuYXVkIFZyYWMgPGF2cmFjQGZyZWVib3guZnI+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogYWR2ZXJ0aXNlIHN1YnRpdGxlIHN0cmVhbXMgYXMgc3BhcnNlCisKKzIwMTMtMDctMTcgMTc6MTE6NDQgKzAyMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hc3Ryb2thZGVtdXg6IGRvIG5vdCBwdXNoIGRpc2NvbnQgYnVmZmVycyBpZiB0aGV5IGFyZW4ndCBkaXNjb250CisJICBVbnNldCB0aGUgZGlzY29udCBmbGFnIGluc3RlYWQgb2YgcG9zc3NpYmx5IHB1c2hpbmcgYSBidWZmZXIgd2l0aAorCSAgYSBmbGFnIHRoYXQncyBzdGlsbCBzZXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgyMTEwCisKKzIwMTMtMDctMTcgMTU6MTA6MDAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZXh0cmFjdCB0aGUgcGFsZXR0ZSBmcm9tIHN0c2QKKwkgIFNvbWV0aW1lcyBhIHBhbGV0dGUgaXMgaW5zaWRlIHRoZSBzdHNkLCBleHRyYWN0IGl0IGluc3RlYWQgb2YgYWx3YXlzIHVzaW5nCisJICB0aGUgZGVmYXVsdCBvbmUKKworMjAxMy0wNy0xNyAxNDozMDoxNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmM6CisJICBnb29tMmsxOiBGaXggZXZlbnQgaGFuZGxpbmcgYW5kIG5lZ290aWF0ZSBhcyBzb29uIGFzIHBvc3NpYmxlCisKKzIwMTMtMDctMTcgMTQ6Mjc6NTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSAgZ29vbTogRml4IGV2ZW50IGhhbmRsaW5nIGFuZCBuZWdvdGlhdGUgYXMgc29vbiBhcyBwb3NzaWJsZQorCisyMDEzLTA3LTExIDE5OjQ1OjE3ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IHdhcm4gYWJvdXQgdGhlIGZ1dHVyZSBkZXByZWNhdGlvbiBvZiB0aGUgImVtYmVkIiBwcm9wZXJ0eQorCisyMDEzLTA3LTE3IDA5OjU2OjAxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFkZCBzdXBwb3J0IGZvciBXUkFXCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA0MjkyCisKKzIwMTMtMDctMTcgMDk6NTQ6NTggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcGFsZXR0ZSBpcyBhcHBlbmRlZCB0byBidWZmZXJzLCBub3QgaW4gY2FwcworCSAgRml4IHRoZSBwYWxldHRlIGhhbmRsaW5nLCBpbiAxLjAgd2UgYXBwZW5kIHRoZSBwYWxldHRlIHRvIHRoZSBidWZmZXIgaW5zdGVhZCBvZgorCSAgcGxhY2luZyBpdCBvbiB0aGUgY2Fwcy4KKwkgIFNlZSBhbHNvIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDQyOTIKKworMjAxMy0wNy0xNiAxNTozNzo0OSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5jOgorCSAgcnRwOiBVc2UgZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXJfZmFzdCgpIHdoZXJlIHBvc3NpYmxlIGluIFJUUCBwYXlsb2FkZXJzCisKKzIwMTMtMDctMTUgMTY6MjQ6MDcgKzAyMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJlc2V0IHNlZ21lbnQgb24gZmx1c2ggc3RvcAorCSAgY2NhMmY1NTVkMTQgaW50cm9kdWNlcyBhIHJlZ3Jlc3Npb24sIHdoZXJlIHRoZSBkZW11eCBzZWdtZW50IGlzIG5vdAorCSAgcmVzZXQgb24gZmx1c2ggc3RvcCwgc28gdGhlIG5leHQgdXBzdHJlYW0gc2VnbWVudCBldmVudCB3aWxsIGNhbGN1bGF0ZQorCSAgYW4gaW52YWxpZCBiYXNlIHRpbWUgb24gdGhlIG5ldyBzZWdtZW50IHRvIGJlIHNlbnQgZG93bnN0cmVhbS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDQyNTUKKworMjAxMy0wNy0wNiAxNzoyMDo0OSArMDIwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IG9mZnNldCBzYW1wbGVzIGFjY29yZGluZyB0byBlZGl0IGxpc3QKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDAyNjQKKworMjAxMy0wNy0xNCAxMjo1MDoxMyArMTIwMCAgRG91Z2xhcyBCYWduYWxsIDxkb3VnbGFzQGhhbG8uZ2VuLm56PgorCisJKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9zcGVjdHJ1bS1leGFtcGxlLmM6CisJICBsZXZlbDogRml4IHRoZSBzcGVjdHJ1bSBleGFtcGxlIGZvciAxLjAKKwkgIFRoZSAibWVzc2FnZSIgcHJvcGVydHkgaGFzIGJlZW4gcmVwbGFjZWQgYnkgInBvc3QtbWVzc2FnZXMiLgorCSAgUHJlLXBhdGNoIG91dHB1dDoKKwkgICh0ZXN0X3NwZWN0cnVtOjIzMTAxKTogR0xpYi1HT2JqZWN0LVdBUk5JTkcgKio6IGdfb2JqZWN0X3NldF92YWxpc3Q6CisJICBvYmplY3QgY2xhc3MgYEdzdFNwZWN0cnVtJyBoYXMgbm8gcHJvcGVydHkgbmFtZWQgYG1lc3NhZ2UnCisJICBOZXcgc3BlY3RydW0gbWVzc2FnZSwgZW5kdGltZSAwOjAwOjAwLjEwMDAwMDAwMAorCSAgKHRlc3Rfc3BlY3RydW06MjMxMDEpOiBHU3RyZWFtZXItQ1JJVElDQUwgKio6CisJICBnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWU6IGFzc2VydGlvbiBgR1NUX1ZBTFVFX0hPTERTX0xJU1QgKHZhbHVlKScgZmFpbGVkCisJICBbLi4uXQorCSAgUG9zdC1wYXRjaDoKKwkgIE5ldyBzcGVjdHJ1bSBtZXNzYWdlLCBlbmR0aW1lIDA6MDA6MDAuMTAwMDAwMDAwCisJICBiYW5kIDAgKGZyZXEgNDAwKTogbWFnbml0dWRlIC02NS45ODg3NzcgZEIgcGhhc2UgMS41MzMzOTcKKwkgIGJhbmQgMSAoZnJlcSAxMjAwKTogbWFnbml0dWRlIC02NS41NDU1NjMgZEIgcGhhc2UgLTAuNzgwOTAwCisJICBiYW5kIDIgKGZyZXEgMjAwMCk6IG1hZ25pdHVkZSAtNjQuNzkxOTQ2IGRCIHBoYXNlIC0wLjc5OTYxMQorCSAgYmFuZCAzIChmcmVxIDI4MDApOiBtYWduaXR1ZGUgLTY0LjU1NjE3NSBkQiBwaGFzZSAtMC4wNjM2MTUKKwkgIFsuLi5dCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA0MTc5CisKKzIwMTMtMDctMTMgMjA6NTY6MjYgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBiZSBsZXNzIHZlcmJvc2Ugd2hlbiBwYXJzaW5nIExPQVMgc3RyZWFtcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNDE2MgorCisyMDEzLTA3LTEyIDEyOjMxOjM5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJICBzaW5rOiBhbGF3L211bGF3IGNhcHMgZG9uJ3QgaGF2ZSBhIGxheW91dCBwcm9wZXJ0eQorCisyMDEzLTA3LTEyIDEyOjI3OjUzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2V1dGlsLmM6CisJICBwdWxzZTogcmVsYXggbXVsYXcgYW5kIGFsYXcgZm9ybWF0IGNoZWNrcworCSAgVGhlIGF1ZGlvIGxpYnJhcnkgY29uc2lkZXJzIHRoZW0gYXMgZW5jb2RlZCBmb3JtYXRzIGFuZCBkb2VzIG5vdCBmaWxsIGluIHRoZQorCSAgc2FtcGxlIHdpZHRoLiBUaGUgYXVkaW8gcmluZ2J1ZmZlcnMgaWRlbnRpZmllcyB0aGUgZm9ybWF0IGFzIGFsYXcvbXVsYXcgYW5kIHRoYXQKKwkgIGlzIGFsd2F5cyA4IGJpdHMuCisKKzIwMTMtMDctMTEgMTY6MTM6MDUgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4Lmg6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZm91cmNjLmg6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuYzoKKwkgIHF0ZGVtdXg6IHVuc2VsZWN0IGluc3RlYWQgb2YgaWdub3JpbmcgZGlzYWJsZWQgdHJhY2ssIGRldGVjdCBjaGFwdGVyIHRyYWNrCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA0MDA3CisKKzIwMTMtMDctMTEgMjA6NDE6MjMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBpZ25vcmUgZXJyb3JzIGZyb20gSEVBRCByZXF1ZXN0CisJICBIRUFEIHJlcXVlc3RzIGFyZSB1c2VkIHRvIGNoZWNrIHRoZSBzZXJ2ZXIgaGVhZGVycyB0byBzZWUgaWYgaXQKKwkgIHNlZWthYmxlLiBJZ25vcmUgZXJyb3JzIGZyb20gdGhvc2UgcmVxdWVzdHMgYXMgdGhleSBzaG91bGRuJ3QgYmUKKwkgIGNyaXRpY2FsLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNDA1MworCisyMDEzLTA3LTEyIDAzOjI0OjA4ICswODAwICBLeW9zdWtlIE5la29tdXJhIDxzdXBlcmNhdGV4cGVydEBnbWFpbC5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5jOgorCSAgYXVkaW9lY2hvOiBGaXggaGFuZGxpbmcgb2YgZGVsYXkgcHJvcGVydHkgaW4gUExBWUlORy9QQVVTRUQgc3RhdGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDM5MDEKKworMjAxMy0wNy0wOSAxNzo1Njo1NyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IEVuYWJsZSBwcm94eSBjYXBzIG9uIHRoZSBzcmMgcGFkcworCisyMDEzLTA3LTExIDE2OjU3OjE1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQKKworPT09IHJlbGVhc2UgMS4xLjIgPT09CisKKzIwMTMtMDctMTEgMTU6NTg6NTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFsczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjEuMgorCisyMDEzLTA3LTExIDE1OjU4OjI5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDEzLTA3LTA5IDE1OjM0OjA0ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IGRlZmVyIHRoZSB3aW5kb3cgaGFuZGxlIHNldHVwIHRvIHRoZSBtYWluIHRocmVhZAorCisyMDEzLTA3LTA5IDE1OjMzOjE4ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IGRlZmF1bHQgdG8gdGhlIG1haW4gaW4gY2FzZSB3ZSBhcmUgbm90IHNldHVwIHlldAorCisyMDEzLTA3LTA3IDIyOjE2OjA1ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IGNsb3NlIHRoZSBpbnRlcm5hbCB3aW5kb3cgY29ycmVjdGx5CisKKzIwMTMtMDctMDcgMjE6MTQ6MjIgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogb25seSBjcmVhdGUgdGhlIE5TIGFwcCB0aHJlYWQgZm9yIENvY29hIG9uY2UKKwkgIFRoZSBoZWxwZXIgdGhyZWFkIGZvciBDb2NvYSwgaW4gY2FzZSBubyBOUyBydW4gbG9vcCBpcyBydW5uaW5nLAorCSAgc2hvdWxkIGJlIHN0YXJ0ZWQgb25seSBvbmNlIGFuZCBzaGFyZWQgYWNyb3NzIGFsbCB0aGUgaW5zdGFuY2VzCisJICBydW5uaW5nCisKKzIwMTMtMDctMDkgMTk6MTA6MTcgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogY29ycmVjdCBhcmd1bWVudCBvcmRlciBpbiBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50X3JvdW5kCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAzMzUwCisKKzIwMTMtMDctMDkgMTc6NDI6NTkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBLZWVwIGNhcHMgb3JkZXIgZnJvbSB0aGUgcGVlciBvciB0aGUgZmlsdGVyCisKKzIwMTMtMDctMDkgMTI6NDI6MTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXI6IEZpeCBoYW5kbGluZyBvZiBidWZmZXJzIHdpdGhvdXQgYSBkdXJhdGlvbgorCSAgV2UnbGwgaGF2ZSB0byBwb3AgYnVmZmVyIGZyb20gY29sbGVjdHBhZHMgYW5kIHN0b3JlIGl0CisJICBpbnRlcm5hbGx5IG9ubHkgdG8gZ2V0IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG5leHQgYnVmZmVyLgorCSAgSWYgd2UgY29udGludWUgdG8ga2VlcCBpdCBpbiBjb2xsZWN0cGFkcywgbm8gbmV3IGJ1ZmZlcgorCSAgdG8gY2FsY3VsYXRlIHRoZSBlbmQgdGltZSB3aWxsIGV2ZXIgYXJyaXZlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMzc0MworCisyMDEzLTA3LTA5IDExOjUzOjA3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBGaXggbmVnb3RpYXRpb24gd2l0aCAwLzEgZnJhbWVyYXRlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMzc0MworCisyMDEzLTA3LTA5IDExOjE3OjU5ICswMjAwICBKb25hcyBIb2xtYmVyZyA8am9uYXNoZ0BheGlzLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBVbmxvY2sgc3RyZWFtIGxvY2sgYWZ0ZXIgdXNlCisJICBTdHJlYW0gbG9jayBvZiBzaW5rIHBhZCB3YXMgbm90IHVubG9ja2VkIGFmdGVyIG5vbi11cGRhdGluZyBzZWVrLgorCisyMDEzLTA2LTI3IDEzOjI2OjMxICswMjAwICBPZ255YW4gVG9uY2hldiA8b2dueWFuQGF4aXMuY29tPgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSAgbXVsdGlwYXJ0bXV4OiBSZS1zZXQgbmVlZF9zZWdtZW50IGZsYWcgYWZ0ZXIgRkxVU0hfU1RPUAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMzE4MgorCisyMDEzLTA3LTA1IDExOjUxOjA0ICswMjAwICBNaWNoYWVsIE9sYnJpY2ggPG0ub2xicmljaEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGJ1ZmZlcnBvb2w6IGRvbid0IGZvcmdldCB0byByZWxlYXNlIGJ1ZmZlciBvbiBlcnJvcgorCSAgSWYgdGhlIHBvb2wgaXMgc3RvcHBlZCB3aGlsZSBnc3RfdjRsMl9idWZmZXJfcG9vbF9kcWJ1ZigpIHdhaXRzIGZvciBhCisJICBidWZmZXIgdGhlbiB0aGUgcmV0dXJuIHZhbHVlIGlzIEdTVF9GTE9XX0ZMVVNISU5HLiBJbiB0aGlzIGNhc2UgdGhlIGJ1ZmZlcgorCSAgdG8gcXVldWUgbXVzdCBhbHNvIGJlIHJlbGVhc2VkLiBPdGhlcndpc2UgaXMgd2lsbCBuZXZlciBiZSBkZWxldGVkIG9yCisJICByZXR1cm5lZCB0byBpdHMgcG9vbC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDM3NjQKKworMjAxMy0wNy0wOCAxNDoxNToxMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSAgcnRwOiBGYWlsIHBheWxvYWRpbmcgdW5pdCB0ZXN0IGlmIGFuIGVycm9yIG1lc3NhZ2UgaXMgcmVjZWl2ZWQKKworMjAxMy0wNy0wOCAxNDowOTozNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJICBydHBoMjYzcHBheTogRG9uJ3QgcGFzcyB1cHN0cmVhbSBmaWx0ZXIgY2FwcyB0byBkb3duc3RyZWFtCisJICBEb3duc3RyZWFtIHVzdWFsbHkgY2FuJ3QgYWNjZXB0IHZpZGVvL3gtaDI2MyBidXQgb25seSBhcHBsaWNhdGlvbi94LXJ0cCwKKwkgIHNvIHdlIHdvdWxkIGFsd2F5cyBnZXQgYW4gZW1wdHkgaW50ZXJzZWN0aW9uIGhlcmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAyNjMyCisKKzIwMTMtMDctMDUgMjI6MDA6MzcgKzAyMDAgIFBpb3RyIERyxIVnIDxwaW90cmRyYWdAZ21haWwuY29tPgorCisJKiBwby9QT1RGSUxFUy5pbjoKKwkgIHBvOiB1cGRhdGUgUE9URklMRVMuaW4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDM2ODUKKworMjAxMy0wNy0wMiAxMToxMzoyNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYXZvaWQgc29tZSBzdHJkdXAKKworMjAxMy0wNy0wMiAxMDozNzo1MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYWRkIHNlbGVjdC1zdHJlYW0gc2lnbmFsCisJICBBZGQgYSBzaWduYWwgdG8gbGV0IHRoZSBhcHAgc2VsZWN0IHdoYXQgc3RyZWFtcyB3aWxsIGJlIHNlbGVjdGVkLgorCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MzQ0MTkKKworMjAxMy0wNy0wMiAxMDozNzozNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYXZvaWQgc3RyZHVwCisKKzIwMTMtMDctMDIgMTA6MTI6MTcgKzAyMDAgIEouIFJpY2sgUmFtc3RldHRlciA8cmljay5yYW1zdGV0dGVyQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9SRUFETUU6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cDogRml4IGRvY3VtZW50YXRpb24gYW5kIGNvbW1lbnRzIHRvIHVzZSBydHBiaW4gaW5zdGVhZCBvZiBvbGQgZ3N0cnRwYmluCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAzNDI2CisKKzIwMTMtMDctMDEgMTY6NTU6MDEgKzAyMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBkb24ndCBleHRyYWN0IGRhdGEgZnJvbSBjYXBzIHR3aWNlCisJICBnc3RfdmlkZW9faW5mb19mcm9tX2NhcHMoKSBhbHdheXMgZXh0cmFjdCB3aWR0aCwgaGVpZ2h0LCBpbnRlcmxhY2UgbW9kZSBhbmQKKwkgIGZyYW1lcmF0ZSBub3cuIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gZG8gaXQgYWdhaW4gZm9yIGVuY29kZWQKKwkgIGZvcm1hdHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAzMzk5CisKKzIwMTMtMDYtMjAgMDk6NDE6NDggLTAzMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IGFsc28gY29uc2lkZXIgc3RvcCBwb3NpdGlvbnMgaW4gc2Vla3MKKwkgIFVzZSBzZWVrIHN0b3AgcG9zaXRpb24gYXMgcmFuZ2UgZW5kIGZvciByZXF1ZXN0cworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMjIwNgorCisyMDEzLTA2LTE5IDE0OjA2OjQwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IGFsbG93IHNlZWtzIGluIHJlYWR5CisJICBPbiBpc19zZWVrYWJsZSwgY2hlY2sgaWYgdGhlIHNlcnZlcidzIGhlYWRlcnMgaGF2ZSBhbHJlYWR5IGJlZW4KKwkgIHJlY2VpdmVkLiBJZiBub3QsIGRvIGEgSEVBRCByZXF1ZXN0IHRvIGdldCB0aGVtIGJlZm9yZSByZXNwb25kaW5nCisJICB0byBiYXNlc3JjLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMjIwNgorCisyMDEzLTA3LTAxIDE3OjI4OjU1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBhZGQgc2lnbmFsIHRvIG5vdGlmeSBvZiB0aGUgU0RQCisJICBUaGlzIHdheSwgdGhlIGFwcCBjYW4gbG9vayBhbmQgbW9kaWZ5IHRoZSBTRFAuCisKKzIwMTMtMDYtMjEgMTg6MTA6MjggKzAyMDAgIEtpc2hvcmUgQXJlcGFsbGkgPGtpc2hvcmUuYXJlcGFsbGlAZ21haWwuY29tPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmM6CisJICBnZGtwaXhidWZvdmVybGF5OiBBbGxvdyBuZWdhdGl2ZSBvZmZzZXRzIHRvIHNwZWNpZnkgb2Zmc2V0IGZyb20gYm90dG9tL3JpZ2h0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAyODI2CisKKzIwMTMtMDYtMzAgMjE6MDE6MjAgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvTWFrZWZpbGUuYW06CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGNvbXB1dGUgZnJhbWVyYXRlIGZyb20gYXZlcmFnZSBzYW1wbGUgZHVyYXRpb24KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDMzNTAKKworMjAxMy0wNi0yNSAyMToxNjozOCArMDIwMCAgQWxiYW4gQnJvd2FleXMgPHByYWhhbEB5YWhvby5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBBZGQgZmx2dmVyc2lvbiAxIHRvIHRoZSBmbGFzaC12aWRlbyBjYXBzCisJICBUaGlzIGFsbG93cyB1c2luZyBhdmRlY19mbHYgd2hpY2ggcmVxdWlyZXMgdGhpcyBmaWVsZCB0byBiZQorCSAgcHJlc2VudCBpbiB0aGUgY2Fwcy4gRkxWIG9ubHkgc3VwcG9ydHMgZmxhc2gtdmlkZW8gdmVyc2lvbiAxCisJICByaWdodCBub3cuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAzMDc2CisKKzIwMTMtMDctMDEgMTE6Mzc6MDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJICBkZWludGVybGVhdmU6IERvbid0IGhvbGQgb2JqZWN0IGxvY2sgd2hpbGUgc2VuZGluZyBldmVudHMgZG93bnN0cmVhbQorCSAgQmFzZWQgb24gYSBwYXRjaCBieSBLaXNob3JlIEFyZXBhbGxpIDxraXNob3JlLmFyZXBhbGxpQGdtYWlsLmNvbT4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDMxMTQKKworMjAxMy0wNy0wMSAxMDo1OTowNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IEFkZCBNUEVHNCB2aWRlbyBwcm9maWxlL2xldmVsIHRvIHRoZSBjYXBzCisKKzIwMTMtMDctMDEgMTA6NTY6MjggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBBZGQgQUFDIHByb2ZpbGUvbGV2ZWwgdG8gdGhlIGNhcHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDMzMTIKKworMjAxMy0wNi0yOCAxNToyMTo1NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5Lmg6CisJICB2b3JiaXNwYXk6IGFkZCBzdXBwb3J0IGZvciBjb25maWctaW50ZXJ2YWwKKwkgIEFsaWduIGNvZGUgd2l0aCB0aGUgdGhlb3JhIHBheWxvYWRlciBhbmQgYWRkIHN1cHBvcnQgZm9yIHRoZSBjb25maWctaW50ZXJ2YWwgdG8KKwkgIHBlcmlvZGljYWxseSBzZW5kIG91dCB0aGUgY29uZmlnIGhlYWRlcnMuCisKKzIwMTMtMDYtMjggMTU6MjE6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJICB0aGVvcmFwYXk6IHNtYWxsIGNsZWFudXBzCisKKzIwMTMtMDYtMjggMTI6MDg6MTkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJICB0aGVvcmFwYXk6IGhhbmRsZSBzdHJlYW1oZWFkZXJzIGFzIHdlbGwKKworMjAxMy0wNi0yOCAxMjowNjoyMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkgIHZvcmJpc3BheTogYWx3YXlzIGNvbGxlY3QgaGVhZGVycyBvbiBkYXRhCisJICBXaGVuIHdlIHNlZSBhIGRhdGEgcGFja2V0LCBhbHdheXMgY2hlY2sgaWYgd2UgbmVlZCB0byBjb2xsZWN0IGFueSBwcmV2aW91cworCSAgaGVhZGVycy4KKworMjAxMy0wNi0yOCAxMTo0MzoxNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkgIHZvcmJpc3BheTogaGFuZGxlIHN0cmVhbWhlYWRlciBhcyB3ZWxsCisJICBUYWtlIGNvbmZpZyBzdHJpbmdzIGZyb20gdGhlIHN0cmVhbWhlYWRlciB3aGVuIHdlIGNhbgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NDMxMgorCisyMDEzLTA2LTI3IDA3OjQwOjI5ICswMjAwICBEYXZpZCBTdmVuc3NvbiBGb3JzIDxkYXZpZHNmQGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IGF2b2lkIGRvdWJsZSBidWZmZXIgdW5tYXAgb24gZXJyb3IKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDMxNzEKKworMjAxMy0wNi0yNyAxNzowMjoxNCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcmVzZXQtc3luYyBiZWZvcmUgcGxheQorCSAgQ2FsbCByZXNldC1zeW5jIG9uIHRoZSBydHBiaW4gYmVmb3JlIHdlIGdvIHRvIHBsYXlpbmcuIFRoaXMgbWFrZXMgdXMgcmVxdWlyZSBTUgorCSAgcGFja2V0cyBmb3IgYWxsIHN0cmVhbXMgYWdhaW4gYmVmb3JlIHdlIGF0dGVtcHQgdG8gc3luYyB0aGVtLiBJZiB3ZSBkb24ndCByZXNldCwKKwkgIGl0IG1pZ2h0IGJlIHRoYXQgd2UgY29tYmluZSBTUiBwYWNrZXRzIGZyb20gYmVmb3JlIGFuZCBhZnRlciB0aGUgUEFVU0UvUExBWUlORworCSAgc3RhdGUgY2hhbmdlIGFuZCBlbmQgdXAgd2l0aCBodWdlIGJvZ3VzIG9mZnNldHMuCisKKzIwMTMtMDYtMjcgMTY6MjM6MjAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBpbXByb3ZlIHN5bmMgb24gZmlyc3QgcGFja2V0cworCSAgRG9uJ3QgdGhyb3cgYXdheSB0aGUgZmlyc3QgUlRDUCBwYWNrZXQgaWYgaXQgYXJyaXZlcyBiZWZvcmUgdGhlIGZpcnN0CisJICBSVFAgcGFja2V0IGJ1dCByZW1lbWJlciBhbmQgdXNlIGl0IHRvIHNpZ25hbCBzeW5jIG9uY2Ugd2UgZ2V0IHRoZQorCSAgUlRQIHBhY2tldC4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkxNDAwCisKKzIwMTMtMDYtMjcgMTY6MTU6NDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBvbmx5IHNpZ25hbCBsb29wIHdoZW4gYWN0aXZlCisJICBPbmx5IHNpZ25hbCB0aGUgbG9vcCBmdW5jdGlvbiB3aGVuIGl0IGlzIGFjdGl2ZS4KKworMjAxMy0wNi0yNyAxNjoxMzozNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHNpZ25hbCB0aW1lc3RhbXAgZGlzY29udAorCSAgV2UgY2FuIG5vdyB1c2UgdGhlIFJFU1lOQyBidWZmZXIgZmxhZyB0byBtYXJrIGEgdGltZXN0YW1wIGRpc2NvbnQgd2hlbiB3ZSB1cGRhdGUKKwkgIHRoZSB0cy1vZmZzZXQgcHJvcGVydHkuCisKKzIwMTMtMDYtMjYgMjA6NDk6NDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAganBlZ3BheTogdHVybiBzb21lIGVycm9ycyBpbnRvIHdhcm5pbmdzCisJICBUdXJuIHNvbWUgZXJyb3JzIGludG8gd2FybmluZ3MsIHdlIGNhbiBjb250aW51ZSBwcm9jZXNzaW5nIHNvIHRoaXMgc2hvdWxkCisJICBub3QgYmUgZmF0YWwuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU3MDc5CisKKzIwMTMtMDYtMjYgMTQ6NTg6NTMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IGF2b2lkIHNvbWUgZmx1c2hlcworCisyMDEzLTA2LTI2IDE0OjQxOjAwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBoYW5kbGUgZGF0YSBtZXNzYWdlIHdoZW4gd2FpdGluZyBmb3IgcmVwbHkKKwkgIFdoZW4gd2UgYXJlIHdhaXRpbmcgZm9yIGEgc2VydmVyIHJlcGx5LCBoYW5kbGUgZGF0YSBtZXNzYWdlcyBpbnN0ZWFkIG9mCisJICBpZ25vcmluZyB0aGVtLgorCisyMDEzLTA2LTI2IDE0OjI3OjM0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBoYW5kbGUgZGF0YSBtZXNzYWdlcyBpbiBzZXBhcmF0ZSBtZXRob2QKKwkgIFJlZmFjdG9yIGFuZCBtYWtlIGEgbWV0aG9kIHRvIGhhbmRsZSBhIGRhdGEgbWVzc2FnZS4KKworMjAxMy0wNi0yNSAyMDozNjoxOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYWRkIHNvbWUgbW9yZSBkb2NzIHRvIGhhbmRsZS1yZXF1ZXN0IHNpZ25hbAorCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDI3MDUKKworMjAxMy0wNi0xMCAxNzoyMDozMCAtMDQwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgU2VuZCBhIGNsb2NrX3Byb3ZpZGUgbWVzc2FnZSBvbiB0aGUgYnVzIHdoZW4gd2UgZ2V0IGEgbmV0Y2xvY2sKKworMjAxMy0wNi0xMCAxNzoyMDoxNCAtMDQwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogRXhwb3NlIHVzZS1waXBlbGluZS1jbG9jayBwcm9wZXJ0eQorCisyMDEzLTA2LTI0IDE3OjExOjM1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgdWRwc2luazogYmluZCB0byB0aGUgZ2l2ZW4gaW50ZXJmYWNlCisJICBBY3R1YWxseSBjYWxsIEJJTkRUT0RFVklDRSB0byBiaW5kIHRvIHRoZSBpbnRlcmZhY2UgYXMgZ2l2ZW4gYnkgdGhlCisJICBwcm9wZXJ0eS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDI4MTkKKworMjAxMy0wNi0yMiAxMDo1OToxNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSAgdnA4ZGVjOiBFcnJvciBvdXQgZ3JhY2VmdWxseSBpZiB3ZSBnZXQgYW4gdW5zdXBwb3J0ZWQgY29sb3IgZm9ybWF0CisJICBJbiB0aGVvcnkgd2UgY2FuIG9ubHkgZ2V0IEk0MjAgdGhvdWdoLCBqdXN0IHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUuCisKKzIwMTMtMDYtMjIgMTA6NTc6NDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZXh0L3ZweC9nc3R2cDlkZWMuYzoKKwkqIGV4dC92cHgvZ3N0dnA5ZW5jLmM6CisJICB2cDk6IEFkZCBzdXBwb3J0IGZvciBZVjEyLCBZNDJCIGFuZCBZNDQ0IGNvbG9yIGZvcm1hdHMKKwkgIFRoZSBlbmNvZGVyIGRvZXMgbm90IHdvcmsgd2l0aCBZNDJCIGFuZCBZNDQ0IHlldCBpdCBzZWVtcy4KKworMjAxMy0wNi0yMiAxMDoyNjoxOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBleHQvdnB4L2dzdHZwOWRlYy5jOgorCSAgdnA5ZGVjOiBVcGRhdGUgZGVmYXVsdCBwb3N0cHJvYyBzZXR0aW5ncyBmcm9tIHZwOV9keF9pZmFjZS5jCisKKzIwMTMtMDYtMjEgMTM6MTE6MzIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2Evd2VibS1tdXguYzoKKwkgIG1hdHJvc2thOiBBZGQgaW5pdGlhbCBWUDkgc3VwcG9ydAorCisyMDEzLTA2LTIxIDEzOjA3OjMwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC92cHgvTWFrZWZpbGUuYW06CisJKiBleHQvdnB4L2dzdHZwOWRlYy5jOgorCSogZXh0L3ZweC9nc3R2cDlkZWMuaDoKKwkqIGV4dC92cHgvZ3N0dnA5ZW5jLmM6CisJKiBleHQvdnB4L2dzdHZwOWVuYy5oOgorCSogZXh0L3ZweC9wbHVnaW4uYzoKKwkgIHZweDogQWRkIGluaXRpYWwsIGV4cGVyaW1lbnRhbCBWUDkgc3VwcG9ydAorCisyMDEzLTA2LTIxIDEwOjMyOjMwICswMjAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWkgYXQgY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwOiBnbyBiYWNrIGludG8gdGhlIGxvb3AgYWZ0ZXIgZG9pbmcgcGF1c2UKKwkgIEFmdGVyIHdlIGRvIGEgcGF1c2UgcmVxdWVzdCwgZ28gYmFjayB0byBsb29wIG1vZGUgc28gdGhhdCB3ZSBjYW4gbGlzdGVuCisJICBmb3Igc2VydmVyIG1lc3NhZ2VzIGFnYWluLgorCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDI3MDUKKworMjAxMy0wNi0yMCAyMzoxNjoxNyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSAgcnRwcHRkZW11eDogV2FpdCBhZnRlciB0aGUgY2FwcyB0byBmb3J3YXJkIHRoZSBvdGhlciBldmVudHMKKwkgIEZpcnN0IGZvcndhcmQgdGhlIHN0cmVhbS1zdGFydCwgdGhlbiB0aGUgY2FwcywgdGhlbiB0aGUgcmVzdAorCisyMDEzLTA2LTIxIDAwOjQyOjAyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSAgeGltYWdlc3JjOiBjbGVhciBkdHMgb24gYnVmZmVyIGFjcXVpcmVkIGZyb20gcG9vbAorCSAgV2hlbiBzZXR0aW5nIHRpbWVzdGFtcHMgb24gb3V0Z29pbmcgYnVmZmVycywgY2xlYXIgdGhlCisJICBkdHMgZXhwbGljaXRseSwgb3RoZXJ3aXNlIGl0IG1heSBlbmQgdXAgYmVpbmcgc2V0IHRvIGEKKwkgIGJvZ3VzIHZhbHVlIGZyb20gbGFzdCB0aW1lIGl0IHdhcyB1c2VkLiBBdm9pZHMgZXZlcnkKKwkgIHNlY29uZCBvciBzbyBidWZmZXIncyBkdHMgYmVpbmcgc2V0IHRvIDAuIE5vdCB0aGF0IGl0CisJICBzaG91bGQgbWF0dGVyIGZvciByYXcgdmlkZW8uCisKKzIwMTMtMDYtMjAgMTU6MzU6MTEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkgIHY0bDI6IGRvbid0IHJlZGVmaW5lIHRoZSBQRVJGT1JNQU5DRSBkZWJ1ZyB2YXJpYWJsZQorCSAgSXQgaXMgYWxyZWFkeSBkZWZpbmVkIGluIGNvcmUuCisJICBmaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAyNzMyCisKKzIwMTMtMDYtMjAgMTQ6NDM6NDcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGZpeCByYWNlIGluIHN0YXRlIGNoYW5nZSB0byBwYXVzZWQKKwkgIFdoZW4gd2UgZ28gdG8gcGF1c2VkLCB3ZSBmaXJzdCBmbHVzaCB0aGUgY29ubmVjdGlvbiBhbmQgdGhlbiBzZW5kIHRoZSBwYXVzZQorCSAgY29tbWFuZC4gQXMgYSByZXN1bHQgb2YgdGhlIGZsdXNoaW5nLCB0aGUgc2NoZWR1bGVkIHBhdXNlZCBjb21tYW5kIGNhbiBnZXQKKwkgIGxvc3QuIFdhaXQgdW50aWwgdGhlIGNvbm5lY3Rpb24gaXMgY29tcGxldGVseSBmbHVzaGVkIGFuZCB0aGUgcnRzcCB0YXNrIGlzCisJICB3YWl0aW5nIGJlZm9yZSBpc3N1aW5nIHRoZSBwYXVzZWQgb3IgcGxheWluZyByZXF1ZXN0LgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMjcwNQorCisyMDEzLTA2LTIwIDExOjMxOjIyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGhhbmRsZSBTRUdNRU5UIHF1ZXJ5CisKKzIwMTMtMDYtMTkgMTI6Mzc6MzEgKzAyMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZC5zaW1vbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyOiBPcHRpbWl6ZSBuZWdvdGlhdGlvbiBieSByZW1vdmluZyB0aGUgcXVlcnkgZmlsdGVyCisJICBBcyBjYW1lcmFzIHRlbmQgdG8gaGF2ZSBhIHF1aXRlIHNwZWNpZmljIHNldCBvZiBjYXBhYmlsaXRpZXMgKHNwZWNpZmljCisJICBmcmFtZXJhdGVzIGZvciBlYWNoIHJlc29sdXRpb24pLCBnZXR0aW5nIHRoZSBwZWVyIGNhcHMgZmlsdGVyZWQgYnkgb3VyCisJICBwcm9iZWQgY2FwcyBjYW4gY2F1c2UgYSBiaWcgaW5jcmVhc2UgaW4gdGhlIGNhcHMgc2l6ZSB3aGljaCBzbG93cyBkb3duCisJICB0aGluZ3MgcXVpcmUgYSBiaXQuCisJICBBcyBmb3IgbmVnb3RpYXRpb24gdjRsMiBpdGVyYXRlcyB0aHJvdWdoIHRoZSBjYXBzIG9mIHRoZSBwZWVyIHRvIGZpbmQgdGhlCisJICBmaXJzdCBpbnRlcnNlY3Rpb24gd2l0aCB0aGUgcHJvYmVkIGNhcHMsIGdldHRpbmcgdGhlIGZ1bGx5IGV4cGFuZGVkCisJICBpbnRlcnNlY3Rpb24gb2YgY2FwYWJpbGl0aWVzIGlzIG5vdCB1c2VmdWwuCisJICBVc2luZyB0aGUgc2FtZSB0ZXN0Y2FzZSBhcyBmb3IgYnVnICM3MDI2MzIsIGFkZGluZyB0aGlzIHBhdGNoIG9uIHRvcCBvZgorCSAgdGhlIHBhdGNoZXMgc3VnZ2VzdGVkIHRoZXJlIHNwZWVkcyB1cCBnZXR0aW5nIHRoZSBpbml0YWwgZnJhbWUgZnJvbQorCSAgYXJvdW5kIH4xNC0xNSBzZWNvbmRzIHRvIGFyb3VuZCB+My00IHNlY29uZHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAyNjM4CisKKzIwMTMtMDYtMTkgMTA6MzA6NTYgKzAyMDAgIEtpc2hvcmUgQXJlcGFsbGkgPGtpc2hvcmUuYXJlcGFsbGlAZ21haWwuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogZHVyYXRpb24gcXVlcnkgcmV0dXJucyB6ZXJvIGZvciBEViB2aWRlbyBpbiBhdmkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDI2MjUKKworMjAxMy0wNi0xOSAxMTowNjozNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IERpc2FibGUgdXNhZ2Ugb2YgYWxsb2NhdGlvbiBxdWVyaWVzCisJICBUaGlzIGNhbiBvbmx5IHJlbGlhYmx5IHdvcmsgaWYgZGVtdXhlcnMgaGF2ZSBhCisJICBzZXBhcmF0ZSBzdHJlYW1pbmcgdGhyZWFkIHBlciBzcmNwYWQuIFRoaXMgc2hvdWxkIGJlCisJICBkb25lIGluIGEgZGVtdXhlciBiYXNlIGNsYXNzLCB3aGljaCBpbnRlZ3JhdGVzIHBhcnRzCisJICBvZiBtdWx0aXF1ZXVlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAxODU2CisKKzIwMTMtMDYtMTEgMTU6MDI6MjEgKzAxMDAgIEFsZXggQXNobGV5IDxidWd6aWxsYUBhc2hsZXktZmFtaWx5Lm5ldD4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBBdm9pZCBza2lwcGluZyBtb292IGF0b21zIGZvciBmcmFnbWVudGVkIE1QNCBmaWxlcy4KKwkgIGJ1ZyAjNzAwNTA1CisJICBGb2xsb3dpbmcgYSByZXByZXNlbnRhdGlvbiBjaGFuZ2UgdGhhdCBjYXVzZXMgYSByZXNvbHV0aW9uIGNoYW5nZSwKKwkgIHRoZSB2aWRlbyBkZWNvZGVyIGZhaWxzIHRvIGRlY29kZSBjb3JyZWN0bHkuIERhc2hkZW11eCBkZXRlY3RzIHRoZQorCSAgcmVwcmVzZW50YXRpb24gY2hhbmdlIGFuZCBwdXNoZXMgYSBuZXcgY2FwcyBldmVudCBhbmQgYW4KKwkgIGluaXRpYWxpemF0aW9uIHNlZ21lbnQgKGEgbmV3IG1vb3YgYXRvbSkgdG8gdGhlIGRvd25zdHJlYW0gcXRkZW11eCwKKwkgIGJ1dCBpdCBkb2Vzbid0IGhhbmRsZSB0aGlzIG5ldyBtb292IHlldCwgaXQgd2lsbCBvbmx5IHBhcnNlIHRoZQorCSAgZmlyc3Qgb25lIGl0IHJlY2VpdmVzLgorCSAgVGhpcyBjb21taXQgY2hhbmdlcyBxdGRlbXV4IHRvIGFjY2VwdCBhIG5ldyBtb292IGluIGEgZGFzaCBiaXRzdHJlYW0KKwkgIHN3aXRjaGluZyBzY2VuYXJpby4KKworMjAxMy0wNi0xOSAwMDo0Mjo1NCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHNlbmQgc3RyZWFtLXN0YXJ0IG9ubHkgb25jZSBmb3IgZWFjaCBzdHJlYW0KKwkgIERvIG5vdCBzZW5kIHN0cmVhbSBzdGFydCBhZ2FpbiB3aGVuIHJlY29uZmlndXJpbmcgYSBwYWQgZm9yIG5ldyBjYXBzLgorCSAgVGhhdCBpcyBjb21tb24gZm9yIGFkYXB0aXZlIHN0cmVhbXMKKworMjAxMy0wNi0wNSAxNzowMjo0OSArMDIwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IGZpeCBzdXBwb3J0IGluIFZNJ3Mgd2l0aG91dCBoYXJkd2FyZSBhY2NlbGVyYXRpb24KKworMjAxMy0wNi0xNSAxMjoyOTozMSArMDIwMCAgSmVucyBHZW9yZyA8bWFpbEBqZW5zZ2Uub3JnPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOgorCSAgcnRwbXAydGRlcGF5OiBhY2NlcHQgbWlzbGFiZWxsZWQgc3RyZWFtcyBmcm9tIEdTdHJlYW1lciAwLjEwIGFzIHdlbGwKKwkgIFRoZSBtcDJ0IHBheWxvYWRlciBpbiAwLjEwIG1pc2xhYmVsbGVkIHRoZSBzdHJlYW1zIGFzIE1QMlQtRVMKKwkgIGluc3RlYWQgb2YgTVAyVCwgc28gYWNjZXB0IHRoYXQgYXMgd2VsbCBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMjQ1NworCisyMDEzLTA2LTE2IDA1OjQwOjEzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBtYW5hZ2UgZWxlbWVudCBzdGF0ZSBvdXJzZWx2ZXMKKwkgIExvY2sgdGhlIHN0YXRlIG9mIHRoZSBhbGwgb3VyIGVsZW1lbnRzIGFuZCBtYW5hZ2UgdGhlaXIgc3RhdGVzCisJICBvdXRzZWx2ZXMuIEJlY2F1c2Ugd2UgYXJlIHdvcmtpbmcgYXN5bmMsIHdlIGNhbid0IHJlbHkgb24gdGhlIHN0YXRlCisJICBjaGFuZ2UgZnVuY3Rpb24gdG8gc2V0IHRoZSBzdGF0ZSBhdCB0aGUgcmlnaHQgdGltZSBvciB0byByZXR1cm4gdGhlCisJICByaWdodCByZXR1cm4gdmFsdWUgZnJvbSB0aGUgc3RhdGUgY2hhbmdlIGZ1bmN0aW9uLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMjA0NgorCisyMDEzLTA2LTE0IDE0OjA5OjUwICswMjAwICBCcnVubyBHb256YWxleiA8c3Rlbnlha0BnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogRG9uJ3QgdW5sb2NrIHN0cmVhbSBsb2NrIHdpdGhvdXQgbG9ja2luZyBpdCBmaXJzdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMjE2NworCisyMDEzLTA2LTEzIDE2OjAwOjMzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBzZXNzaW9uOiBVc2UgdGhlIHJpZ2h0IGhhc2h0YWJsZSB0byBjYWxjdWxhdGUgYmFuZHdpZHRoCisJICBEb24ndCB1c2UgYW4gdW51c2VkIGhhc2h0YWJsZSB0byBpdGVyYXRlIHNvdXJjZSB0byBjYWxjdWxhdGUgYmFuZHdpZHRoLgorCSAgUmVtb3ZlIHVudXNlZCBjb2RlLgorCisyMDEzLTA2LTEyIDE2OjI3OjI0IC0wNjAwICBCcmVuZGFuIExvbmcgPGIubG9uZ0BjYWJsZWxhYnMuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBwdWxzZXNpbms6IFJlcXVpcmUgUHVsc2VBdWRpbyA+PSAyLjAKKwkgIFRoaXMgaXMgbmVlZGVkIGZvciBwYV9mb3JtYXRfaW5mb19nZXRfcHJvcF8qIGZ1bmN0aW9ucy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODY0NTkKKworMjAxMy0wNi0xMyAxNDoyMzowOCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkgIFJldmVydCAicHVsc2VzaW5rOiBNYWtlIDIuMCBkZXBlbmRlbmN5IG9wdGlvbmFsIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCAwMTQ1NzAyN2UwZDM4NGFjYTNlNTUxYWU2ODRlMGFhMDc0ZWU1NDk4LgorCSAgV2UnbGwganVzdCBkZXBlbmQgb24gUHVsc2VBdWRpbyAyLjAgb3IgYWJvdmUgaW5zdGVhZCBvZiBoYXZpbmcgdGhlIGJ1ZworCSAgcGFydGlhbGx5IGZpeGVkIGJhc2VkIG9uIHRoZSBpbnN0YWxsZWQgbGlicHVsc2UgdmVyc2lvbi4KKworMjAxMy0wNi0xMyAxMjo0MDoxNSArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkgIHB1bHNlc2luazogTWFrZSAyLjAgZGVwZW5kZW5jeSBvcHRpb25hbAorCSAgVGhlIGdldGNhcHMgZnVuY3Rpb24gd2UgYWRkZWQgdXNlcyBzb21lIHBhX2Zvcm1hdF9pbmZvX2dldF9wcm9wLi4uCisJICBhY2Nlc3NvciBmdW5jdGlvbnMgdGhhdCB3ZXJlIG9ubHkgYWRkZWQgaW4gMi4wLCBzbyB3ZSBvbmx5IGhhdmUgb3VyCisJICBnZXRjYXBzIGltcGxlbWVudGF0aW9uIGV4aXN0IGlmIHdlJ3JlIGNvbXBpbGluZyBhZ2FpbnN0IGxpYnB1bHNlIDIuMCBvcgorCSAgYWJvdmUuCisJICBFdmVudHVhbGx5LCB3ZSBjb3VsZCBidW1wIHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50IHRvIDIuMCBvciBhYm92ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODY0NTkKKworMjAxMy0wNi0xMiAxODoyMzo0NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgUmV2ZXJ0ICJ2aWRlb21peGVyOiBXaGVuIGFsbCBzaW5rcGFkcyBhcmUgZW9zLCB1cGRhdGUgb3V0cHV0IHNlZ21lbnQgc3RvcCBhbmQgZm9yd2FyZCBpdCIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgMmQzOTEwZmM3OTAxYjVmMjllMTZjMGZkZDRlOTA2N2E2ZDdmNjZmZS4KKwkgIEl0J3Mgbm90IHNvbHZpbmcgYW55IHByb2JsZW0gYW5kIGluc3RlYWQgY2F1c2VzIGNvZGUgdG8gZmFsbCBhcGFydC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDE1MTkKKworMjAxMy0wMS0wOSAwOTozOTozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBtYXJrIHN1YnRpdGxlIHN0cmVhbXMgYXMgc3BhcnNlIGluIHN0cmVhbS1zdGFydCBldmVudAorCSAgQW5kIGFsc28gbWFyayB0aGUgc3RyZWFtcyB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0IGlmCisJICBtYXJrZWQgc28gaW4gdGhlIGhlYWRlcnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjAwNjQ4CisKKzIwMTMtMDYtMTEgMjI6MTI6NTggKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWFvcmMtZGlzdC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYW9yYy1kaXN0Lmg6CisJICBhdWRpb3Bhbm9yYW1hOiBhZGQgcHJlYnVpbHQgZmlsZXMKKworMjAxMy0wNi0xMSAyMDoyNzo1MSArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9wYW5vcmFtYS5jOgorCSAgYXVkaW9wYW5vcmFtYTogY2xlYW51cCBhbmQgZXhwYW5kIHRoZSB0ZXN0cworCSAgU3BsaXQgb3V0IHR3byBtb3JlIHRlc3RzLiBFeHRyYWN0IG1vcmUgY29tbW9uIGNvZGUgaW50byBoZWxwZXJzLiBBZGQgY292ZXJhZ2UgZm9yIGZsb2F0LgorCisyMDEzLTA2LTEwIDIxOjE1OjIwICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hLmM6CisJICBhdWRpb3Bhbm9yYW1hOiBjbGVhbnVwIG9mIHRyYW5zZm9ybSgpCisJICBPbmx5IG1hcCBpbnB1dCBpZiB3ZSBhcmUgcmVhZGluZyBpdC4gQ2xlYW51cCB0aGUgbG9nZ2luZyBhbmQgdGhlIGNvbW1lbnRzIGEgYml0LgorCisyMDEzLTA2LTA5IDIwOjM1OjE4ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXVkaW9meC9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuaDoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWFvcmMub3JjOgorCSAgYXVkaW9wYW5vcmFtYTogdXNlIG9yYyB0byBzcGVlZHVwIHByb2Nlc3NpbmcKKwkgIFVzZSBzcGVjaWFsIHZhcmlhbnRzIGZvciB0aGUgY2FzZSB3aGVuIHdlIGRvbid0IGNoYW5nZSB0aGUgcGFub3JhbWEgKHBhbj0wLjApLgorCSAgU2ltcGxpZnkgdGhlIHByb2Nlc3NpbmcgZnVuY3Rpb25zIGJ5IHBhc3NpbmcgdGhlIHBhbm9yYW1hIHZhbHVlIGRpcmVjdHkgaW5zdGVhZAorCSAgb2YgdGhlIGluc3RhbmNlLiBVc2Ugb3JjIGZvciBjbGVhcmluZyBidWZmZXJzIHRvby4KKworMjAxMy0wNi0xMSAxOToyNDo0OSArMDIwMCAgTWF0aGlldSBEdXBvbmNoZWxsZSA8bWF0aGlldS5kdXBvbmNoZWxsZUBlcGl0ZWNoLmV1PgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogY2hlY2sgbGFzdCBlbmRfdGltZSBhZnRlciBjb252ZXJzaW9uIHRvIHJ1bm5pbmcgc2VnbWVudAorCSAgVGhlIGxhc3QgZW5kX3RpbWUgd2FzIHNhdmVkIGFmdGVyIGNvbnZlcnNpb24sIHNvIHRoZSBjb21wYXJpc29uCisJICBoYWQgdG8gYmUgbWFkZSBhZnRlciBjb252ZXJzaW9uIGZvciBpdCB0byBtYWtlIHNlbnNlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMTM4NQorCisyMDEzLTA2LTExIDE5OjIyOjIwICswMjAwICBNYXRoaWV1IER1cG9uY2hlbGxlIDxtYXRoaWV1LmR1cG9uY2hlbGxlQGVwaXRlY2guZXU+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBhZGQgbWl4LT5zZWdtZW50LnN0YXJ0IHRvIG91dHB1dF9lbmRfdGltZQorCSAgV2hlbiB0aGUgc2VnbWVudCBzdGFydCBpcyBub3QgMCwgdGhpcyBjcmVhdGVkIGEgc2l0dWF0aW9uIHdoZXJlCisJICB0aGUgb3V0cHV0X2VuZF90aW1lIGlzIGluZmVyaW9yIHRvIG91dHB1dF9zdGFydF90aW1lLCBhbmQgdGhlIGR1cmF0aW9uCisJICBvZiB0aGUgbmV4dCBidWZmZXIgZW5kZWQgdXAgdW5kZXJmbG93aW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMTM4NQorCisyMDEzLTA2LTExIDEzOjU0OjUzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogU2VuZCBzdHJlYW0gaGVhZGVycyBhZnRlciB0aGUgc2VnbWVudCBldmVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDc5OQorCisyMDEzLTA2LTExIDEyOjI2OjI0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRG8gYWxsb2NhdGlvbiBxdWVyeSBhZnRlciBleHBvc2luZyBhbGwgcGFkcyBhbmQgbm8tbW9yZS1wYWRzCisJICBBbHNvIGNvbmZpZ3VyZSB2aWRlbyBzdHJlYW1zIGFzIGVhcmx5IGFzIHBvc3NpYmxlLgorCSAgUmVsYXRlZCBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAxODU2CisJICBidXQgbm90IGZpeGluZyB0aGF0LgorCisyMDEzLTA2LTExIDEyOjI1OjQ2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBEb24ndCBmb3J3YXJkIENBUFMgZXZlbnRzIGZyb20gdXBzdHJlYW0KKwkgIEp1c3QgdXNlIHRoZSBkZWZhdWx0IHBhZCBldmVudCBoYW5kbGVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMTk3NgorCisyMDEzLTA1LTI2IDA4OjE4OjA0ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBDYWNoZSB0aGUgZ2V0Y2Fwcy9hY2NlcHRjYXBzIHByb2JlIHN0cmVhbQorCSAgZ2V0Y2FwcyBpcyBjYWxsZWQgZnJlcXVlbnRseSBkdXJpbmcgc3RyZWFtIHNldHVwLCBhbmQgY3JlYXRpbmcgYSBuZXcKKwkgIHN0cmVhbSBlYWNoIHRpbWUgaXMgdmVyeSBpbmVmZmljaWVudC4gVGhlcmUncyBzb21lIG1vcmUgcm9vbSBmb3IKKwkgIG9wdGltaXNhdGlvbiBieSBjYWNoaW5nIHRoZSBxdWVyaWVkIHNpbmsgZm9ybWF0cyBhcyB3ZWxsLCBidXQgdGhpcyBuZWVkcworCSAgc29tZSBtb3JlIGNoYW5nZXMgdG8gbGlzdGVuIGZvciBmb3JtYXQgY2hhbmdlcyBvbiB0aGUgc2luayAoZm9yIHdoZW4KKwkgIHN1cHBvcnRlZCBmb3JtYXRzIGNoYW5nZSBiZXR3ZWVuIHByb2JlIHN0cmVhbSBjcmVhdGlvbiBhbmQgc2luaworCSAgcXVlcnlpbmcpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NjQ1OQorCisyMDEzLTA1LTIzIDIxOjM5OjA4ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5oOgorCSAgcHVsc2VzaW5rOiBBZGQgYSBnZXRjYXBzIGZ1bmN0aW9uCisJICBUaGlzIGFsbG93cyB1cyB0byBoYXZlIG1vcmUgZmluZS10dW5lZCBjYXBzIGluIFJFQURZIG9yIGFib3ZlLiBIb3dldmVyLAorCSAgdGhpcyBpcyBfcmVhbGx5XyBpbmVmZmljaWVudCBzaW5jZSB3ZSBjcmVhdGUgYSBuZXcgc3RyZWFtIGFuZCBxdWVyeSBzaW5rCisJICBmb3IgZXZlcnkgZ2V0Y2FwcyBpbiBSRUFEWSwgd2hpY2ggb24gYSBzaW1wbGUgZ3N0LWxhdW5jaCBsaW5lIGhhcHBlbnMKKwkgIGFib3V0IDM1IHRpbWVzLiBUaGUgbmV4dCBzdGVwIGlzIHRvIGNhY2hlIGdldGNhcHMgcmVzdWx0cy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODY0NTkKKworMjAxMy0wNS0xMCAxMTozMjo0NCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogVGFrZSBhIGxvY2sgb24gdGhlIHJpbmdidWZmZXIgaW4gYWNjZXB0Y2FwcworCSAgVGhpcyBpcyBuZWVkZWQgYXMgYSBjb25jdXJyZW50IHN0YXRlIGNoYW5nZSBjb3VsZCBwdWxsIHRoZSBjb250ZXh0IG9yCisJICBzdHJlYW0gb3V0IGZyb20gdW5kZXIgb3VyIGZlZXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg2NDU5CisKKzIwMTMtMDYtMDkgMjA6Mjk6MDkgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuaDoKKwkgIGF1ZGlvcGFub3JhbWE6IG1vdmUgdGhlIGVudW0gdG8gdGhlIGhlYWRlciBhbmQgdXNlIGluc3RlYWQgb2YgZ2ludAorCSAgTW92ZSB0aGUgZW51bSBmb3IgdGhlIHByb2Nlc3NpbmcgbWV0aG9kIHRvIHRoZSBoZWFkZXIgc28gdGhhdCB3ZSBjYW4gdXNlIHRoZQorCSAgdHlwZSBmb3IgdGhlIGluc3RhbmNlIHN0cnVjdC4KKworMjAxMy0wNi0wOSAyMDozMjoyMiArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzoKKwkgIGxldmVsOiByZXdvcmsgdGhlIHRlc3RzIHRvIGNvdmVyIG90aGVyIGZvcm1hdHMgdG9vCisKKzIwMTMtMDYtMDUgMTY6MzI6MzAgKzAyMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMjogbWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIG5vdCBkZWxldGVkIGJlZm9yZSB0aGUgcG9vbAorCSAgVGhlIHBvb2wgYWNjZXNzZXMgZGF0YSBmcm9tIHRoZSB2NGwyb2JqZWN0IHNvIGl0IG11c3QgZXhpc3QgYXQgbGVhc3QKKwkgIGFzIGxvbmcgYXMgdGhlIHBvb2wuIFJlZmNvdW50IHRoZSBlbGVtZW50IHdoaWNoIGNvbnRyb2xzIHRoZSBvYmplY3QKKwkgIGxpdmUtdGltZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDE2NTAKKworMjAxMy0wNi0wNyAxNTozODoyNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9saWJwbmcvTWFrZWZpbGUuYW06CisJICBwbmc6IExpbmsgd2l0aCBsaWJnc3RiYXNlIGZvciBHc3RCeXRlUmVhZGVyIGFuZCBHc3RBZGFwdGVyCisKKzIwMTMtMDYtMDcgMTU6MTU6MTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2ZW5jL01ha2VmaWxlLmFtOgorCSAgd2F2ZW5jOiBMaW5rIHdpdGggbGliZ3N0YmFzZSBmb3IgR3N0Qnl0ZVdyaXRlcgorCisyMDEzLTA2LTA3IDEzOjI2OjM1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogUHVzaCBzdHJlYW0tc3RhcnQgZXZlbnQgaW4gcHVsbCBtb2RlIGJlZm9yZSBhbnl0aGluZyBlbHNlCisKKzIwMTMtMDUtMTAgMTI6MDk6MTkgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJICBwdWxzZXNpbms6IEdldCByaWQgb2YgYWNjZXB0Y2FwcyBzaWRlLWVmZmVjdHMKKwkgIFRoZSBzaW5rIGluZm8gY2FsbGJhY2sgc2hvdWxkIG5vdCBoYXZlIHNpZGUtZWZmZWN0cyBvbiB0aGUgR3N0UHVsc2VTaW5rCisJICBvYmplY3Qgc2luY2Ugd2UgYXJlIHNvbWV0aW1lcyB1c2luZyB3aXRoIGEgZHVtbXkgc3RyZWFtIGluIGFjY2VwdGNhcHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg2NDU5CisKKzIwMTMtMDYtMDUgMTg6MzY6NDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisKKz09PSByZWxlYXNlIDEuMS4xID09PQorCisyMDEzLTA2LTA1IDE3OjU4OjUxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb21tb246CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFsczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUtZGlzdC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0Lmg6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMtZGlzdC5jOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLWRpc3QuaDoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kb3JjLWRpc3QuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kb3JjLWRpc3QuaDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS4xLjEKKworMjAxMy0wNi0wNSAxNjozNToxOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDEzLTA2LTA1IDE1OjUwOjA0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkgIHdhdmVuYzogRml4IHRhZ2xpc3QgcmVmIGhhbmRsaW5nIHRoYXQgbWFkZSB0aGUgdW5pdCB0ZXN0IGZhaWwKKworMjAxMy0wNi0wNSAxNToxNDo1NCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMDk4YzBkNyB0byAwMWE3YTQ2CisKKzIwMTMtMDYtMDMgMDk6MTc6NDMgKzAyMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBpdGVyYXRlIGNvbnRyb2xzIHdpdGggVjRMMl9DVFJMX0ZMQUdfTkVYVF9DVFJMIGlmIHBvc3NpYmxlCisJICBJbiB2Mi42LjE4IGNvbnRyb2wgY2xhc3NlcyB3aGVyZSBhZGRlZCB0byB0aGUgdjRsMiBBUEkuCisJICBJdGVyYXRpbmcgb3ZlciBDSURzIHN0YXJ0aW5nIHdpdGggVjRMMl9DSURfQkFTRSB3aWxsIG9ubHkgZmluZCBjb250cm9scyBmb3IKKwkgIHRoZSBmaXJzdCBjb250cm9sIGNsYXNzLgorCSAgQnkgaXRlcmF0aW5nIHdpdGggVjRMMl9DVFJMX0ZMQUdfTkVYVF9DVFJMIGFsbCBjb250cm9scyBhcmUgZm91bmQuCisJICBUaGlzIGlzIG5lY2Vzc2FyeSB0byBtYWtlIGNvbnRyb2xzIGZyb20gb3RoZXIgY29udHJvbCBjbGFzc2VzIGF2YWlsYWJsZSBpbgorCSAgdGhlIGV4dHJhLWNvbnRyb2xzIHByb3BlcnR5LgorCSAgSWYgVjRMMl9DVFJMX0ZMQUdfTkVYVF9DVFJMIGlzIG5vdCBkZWZpbmVkIGF0IGNvbXBpbGUgdGltZSBvciBub3Qgc3VwcG9ydGVkCisJICBhdCBydW50aW1lIHRoZW4gdGhlIG9sZCBtZWNoYW5pc20gZm9yIGl0ZXJhdGluZyBpcyB1c2VkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMTU0MAorCisyMDEzLTA2LTA1IDEyOjEyOjUzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdHVkcHNpbmsuYzoKKwkgIHVkcHNpbms6IGF2b2lkIGxlYWtpbmcgdGhlIGhvc3QKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDE1ODYKKworMjAxMy0wNi0wNCAwODoyNjozMyArMDIwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIHY0bDI6IGltcHJvdmUgcGl4ZWwgYXNwZWN0IHJhdGlvIGhhbmRsaW5nCisJICBJbnN0ZWFkIG9mIGp1c3QgYXNzdW1pbmcgYSBhc3BlY3QgcmF0aW8gb2YgMS8xIHVzZSBWSURJT0NfQ1JPUENBUCB0byBhc2sKKwkgIHRoZSBkZXZpY2UuCisJICBUaGlzIGFsc28gYWRkIGEgcGl4ZWwtYXNwZWN0LXJhdGlvIHByb3BlcnR5IHRvIG92ZXJ3cml0ZSB0aGUgdmFsdWUgZnJvbSB0aGUKKwkgIGRyaXZlciBhbmQgYSBmb3JjZS1hc3BlY3QtcmF0aW8gcHJvcGVydHkgdG8gaWdub3JlIGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDI4NQorCisyMDEzLTA2LTA0IDE3OjA0OjExICswMjAwICBTdGlybGluZyBXZXN0cnVwIDxzd2VzdHJ1cEBnbWFpbC5jb20+CisKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDI6IEZpeCBjb21waWxhdGlvbiB3aXRoIG9sZGVyIGtlcm5lbHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDE1OTUKKworMjAxMy0wNi0wMyAxNzowNzoxMCArMDIwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBjYWxsIFZJRElPQ19SRVFCVUZTIHdpdGggY291bnQgPSAwIGluIHBvb2xfZmluYWxpemUKKwkgIFdpdGhvdXQgdGhpcyB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIGZhaWxzOgorCSAgLSBzZXRfY2FwcygpCisJICAtIG9iamVjdF9zdG9wKCkgKGRvZXMgbm90aGluZykKKwkgIC0gc2V0X2Zvcm1hdCgpIC0+IFZJRElPQ19TX0ZNVAorCSAgLSBzZXRfY29uZmlnKCkgLT4gVklESU9DX1JFUUJVRlMgd2l0aCBjb3VudCA9IE4KKwkgIC0gc2V0X2NhcHMoKQorCSAgLSBvYmplY3Rfc3RvcCgpCisJICAtIHBvb2xfZmluYWxpemUoKQorCSAgLSBzZXRfZm9ybWF0KCkgLT4gVklESU9DX1NfRk1UID0+IEVCVVNZCisJICBVc3VhbGx5IHRoZSBwb29sIGlzIHN0YXJ0ZWQgYWZ0ZXIgc2V0X2NvbmZpZygpLCBpbiB3aGljaCBjYXNlIG9iamVjdF9zdG9wKCkKKwkgIHdpbGwgcmVzdWx0IGluIGEgcG9vbF9zdG9wIGFuZCB0aGVyZWZvcmUgVklESU9DX1JFUUJVRlMgd2l0aCBjb3VudCA9IDAgYnV0CisJICB0aGF0IGlzIG5vdCBndWFyYW50ZWVkLgorCSAgQWxzbyBjYWxsaW5nIFZJRElPQ19SRVFCVUZTIHdpdGggY291bnQgPSAwIGluIHBvb2xfZmluYWxpemUoKSBpZiBuZWNlc3NhcnkKKwkgIGZpeGVzIHRoaXMgcHJvYmxlbS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDE1NDMKKworMjAxMy0wNS0yOCAxOToxNDoxNSArMDIwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiByZXdvcmsgc2luayBidWZmZXIgcmVmY291bnRpbmcKKwkgIFRoaXMgaXMgYSBmb2xsb3d1cCBwYXRjaCBmb3IgIzcwMDc4MSwgd2hpY2ggaXMgbm90IHF1aXRlIGNvcnJlY3QuCisJICBUaGUgYnVmZmVyIGhhbmRsaW5nIGlzIHF1aXRlIGNvbXBsaWNhdGVkIGhlcmUuCisJICBUaGUgb3JpZ2luYWwgY29kZSBpbnRlbmRlZCB0byB0aGUgdGhlIGZvbGxvd2luZzoKKwkgIC0gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcHJvY2VzcygpIGNhbGxzIFFCVUYgYW5kIGFkZHMgdGhlIGJ1ZmZlciB0byB0aGUKKwkgIGxvY2FsIGxpc3QuCisJICAtIFRoZSBzaW5rIGNhbGxzIGdzdF9idWZmZXJfdW5yZWYoKSB3aGljaCByZXR1cm5zIHRoZSBidWZmZXIgdG8gdGhlIHBvb2wKKwkgIGJ1dCBub3QgdGhlICdmcmVlIGxpc3QnLgorCSAgLSBTb21lIHRpbWUgbGF0ZXIgRFFCVUYgcmV0dXJucyB0aGUgYnVmZmVyIGFuZAorCSAgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcmVsZWFzZV9idWZmZXIoKSBwdXRzIGluIG9uIHRoZSAnZnJlZSBsaXN0Jy4KKwkgIElmIHRoZSBidWZmZXIgbXVzdCBiZSBjb3BpZWQgdGhlbiAocGFyZW50X2NsYXNzKS0+YWNxdWlyZV9idWZmZXIoKSBpcworCSAgY2FsbGVkIGRpcmVjdGx5IHRvIGtlZXAgdGhlIGJ1ZmZlciBpbiB0aGUgcG9vbC4KKwkgIFRoaXMgaGFzIHR3byBwcm9ibGVtczoKKwkgIDEuIElmIGdzdF92NGwyX2J1ZmZlcl9wb29sX3JlbGVhc2VfYnVmZmVyKCkgaXMgY2FsbGVkIGJlZm9yZSB0aGUgYnVmZmVyIGlzCisJICByZXR1cm5lZCB0byB0aGUgcG9vbCwgdGhlbiB0aGUgYnVmZmVyIGlzIHB1dCBvbiB0aGUgJ2ZyZWUgbGlzdCcgdHdpY2UuCisJICBUaGlzIGNhbiBoYXBwZW4gaWYgYSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBpcyBrZXB0IG91dHNpZGUgdGhlIHNpbmssCisJICBvZiBpZiBEUUJVRiByZXR1cm5zIHRoZSBidWZmZXIsIHRoYXQgd2FzIGp1c3QgcXVldWVkIHdpdGggUUJVRi4KKwkgIDIuIElmIGJ1ZmZlcnMgYXJlIGNvcGllZCwgdGhlbiBhbGwgYnVmZmVycyBhcmUgaW4gdGhlIHBvb2wgYXQgYWxsIHRpbWVzLiBBcworCSAgYSByZXN1bHQgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfc3RvcCgpIGFuZCBnc3RfdjRsMl9idWZmZXJfcG9vbF9kcWJ1ZigpCisJICBjYW4gYWNjZXNzIHBvb2wtPmJ1ZmZlcnMgYXQgdGhlIHNhbWUgdGltZSwgd2hpY2ggY2FuIGxlYWQgdG8gbWVtb3J5CisJICBjb3JydXB0aW9uLgorCSAgVGhlIHBhdGNoIGZvciAjNzAwNzgxIGZpeGVzIHRob3NlIHByb2JsZW1zLCBidXQgd2l0aCB0aGUgc2lkZSBlZmZlY3QgdGhhdAorCSAgdGhlcmUgYXJlIGFsd2F5cyBidWZmZXJzIG91dHNpZGUgdGhlIHBvb2wgKGJlY2F1c2UgdGhleSBhcmUgcXVldWVkKSBhbmQKKwkgIHRoZSBwb29sIGlzIG5ldmVyIHN0b3BwZWQuCisJICBUaGlzIHBhdGNoIGZpeGVzIHRoaXMgYnkgcmVsZWFzaW5nIHRoZSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBhZnRlcgorCSAgaGFuZGxpbmcgaXQgKHRvIGF2b2lkIHByb2JsZW0gMi4pIHNvIGl0IGNhbiBiZSByZXR1cm5lZCB0byB0aGUgcG9vbC4KKwkgIGdzdF92NGwyX2J1ZmZlcl9wb29sX3JlbGVhc2VfYnVmZmVyKCkgaXMgb25seSBjYWxsZWQgaWYgdGhlIGJ1ZmZlciBpcworCSAgYWxyZWFkeSBpbiB0aGUgcG9vbCAodG8gYXZvaWQgcHJvYmxlbSAxLikuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAxMzc1CisKKzIwMTMtMDYtMDIgMTU6MjQ6MzggLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBtYWtlIHN1cmUgdGFnbGlzdCBpcyB3cml0YWJsZSBiZWZvcmUgYWRkaW5nIHRhZ3MKKwkgIEF2b2lkcyBhc3NlcnRpb25zCisKKzIwMTMtMDUtMzAgMTk6MjQ6MTMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBlZmZlY3RpdmVseSBza2lwIHRyYWNrcyB0aGF0IHdlcmVuJ3QgbGlzdGVkIG9uIHRoZSAxc3QgbW9vdgorCSAgV2l0aG91dCB0aGlzLCBzdHJlYW0gaXMgTlVMTCBhbmQgdGhlIGNvZGUgd2lsbCB0cnkgdG8gYWNjZXNzIGl0LCBsZWFkaW5nCisJICB0byBzZWdmYXVsdHMuCisKKzIwMTMtMDUtMzAgMTk6MjM6NTAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBza2lwIHJlZHVuZGFudCBjaGVjaworCSAgIWdvdF9tb292IGlzIGFscmVhZHkgY2hlY2tlZCB0aGUgbGluZSBhYm92ZQorCisyMDEzLTA2LTAyIDEzOjAzOjQwICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgdGVzdHM6IGNsZWFudXAgbGV2ZWwgdGVzdHMKKwkgIFNwbGl0IG91dCBhIGZldyBtb3JlIHRlc3RzIHRvIGF2b2lkIGNoZWNraW5nIHRoZSBzYW1lIHN0dWZmIG92ZXIgYW5kIG92ZXIgYWdhaW4uCisKKzIwMTMtMDYtMDEgMjE6MzM6NDYgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5oOgorCSAgbGV2ZWw6IHJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIGluIGluc3RhbmNlIHN0cnVjdAorCisyMDEzLTA1LTMxIDE4OjEzOjAyICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgbGV2ZWw6IGFkZCBhIHRlc3QgZm9yIGNvbnRpbm91cyB0aW1lc3RhbXBzCisJICBBIHRlc3QgdGhhdCBjaGVja3MgdGhhdCBtc2dbbl0udHMgKyBtc2dbbl0uZHVyID09IG1zZ1tuKzFdLnRzLgorCisyMDEzLTA0LTEyIDE2OjAyOjQ0ICswMzAwICBBbnRvbiBCZWxrYSA8YW50b25iZWxrYUBnbWFpbC5jb20+CisKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5oOgorCSAgd2F2ZW5jOiBhZGQgdGFncyAmIHRvYyBzdXBwb3J0CisJICBXcml0ZSB0YWdzIGFzIExJU1QgSU5GTyBjaHVuay4gRm9ybWF0IHRoZSB0b2MgYXMgY3VlICsgTElTVCBhZHRsIGNodW5rLiBSZW1vdmUKKwkgIG9sZCAjaWZkZWYnZWQgY29kZS4KKworMjAxMy0wNS0zMSAxNToxMjowOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBSZXZlcnQgInJ0cGgyNjRwYXk6IFJlc3RydWN0dXJpbmcgdG8gYWxsb3cgZm9yIGFkZGluZyBvcHRpb25hbCBjYXBzIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCA2MTY2Njg5OGNmZTg5YTFiMjFkM2U2ODUwYWI0NGY1YjE2MzNlZDc5LgorCSAgVGhpcyBjb21taXQgY2hhbmdlcyB3aGF0IHRoZSBzZXRfc3BzX3BwcygpIGZ1bmN0aW9uIGRvZXMsIG5vdCBpdCBkb2Vzbid0CisJICBzZXQgY2FwcyBhbnltb3JlIChhbmQgc2hvdWxkIGhhdmUgYmVlbiByZW5hbWVkKS4gVGhlIG1haW4gcHJvYmxlbSBpcyB0aGF0CisJICBub3QgYWxsIGNhbGwgc2l0ZXMgYXJlIHVwZGF0ZWQgYW5kIHRodXMgbGVhayB0aGUgc3RyaW5nLgorCisyMDEzLTA1LTMxIDE1OjExOjEyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIFJldmVydCAicnRwaDI2NHBheS9kZXBheTogQWRkIGZyYW1lIGRpbWVuc2lvbnMgYSBwYXlsb2FkZWQgY2FwcyIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgM2RjYTc1NmE1ZGJhNTUyNjYyNTZmMjM5ZTNlMTJhM2QwNThlMTg1YS4KKwkgIFRoZSBIMjY0IFJUUCBzcGVjIGhhcyBubyBhdHRyaWJ1dGVzIGZvciB3aWR0aCBhbmQgaGVpZ2h0LgorCisyMDEzLTA1LTMxIDE1OjA5OjUxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgUmV2ZXJ0ICJydHBoMjY0cGF5L2RlcGF5OiBBZGQgb3B0aW9uYWwgZnJhbWVyYXRlIGNhcHMgZm9yIHVzZSBpbiBTRFAiCisJICBUaGlzIHJldmVydHMgY29tbWl0IGQ4ODI1ZTJhNWMwYmZiODgzZmY4OGUyYzlkYTQ5OWM4MDBlYmNhMGEuCisJICBUaGVyZSBpcyBubyBmcmFtZXJhdGUgYXR0cmlidXRlIGluIHRoZSBoMjY0IFJUUCBzcGVjLgorCisyMDEzLTA1LTMxIDE1OjA4OjE2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBSZXZlcnQgInJ0cGpwZWdwYXkvZGVwYXk6IFJlcGxhY2UgZnJhbWVzaXplIGNhcHMgd2l0aCB3aWR0aC9oZWlnaHQiCisJICBUaGlzIHJldmVydHMgY29tbWl0IDAwNzVkMTExYjQ3NWNhMjc4OTVlZTk0NzYxNTQyNjBiNjkwMjk0MGIuCisJICBFeHRyYSBhcHBsaWNhdGlvbi94LXJ0cCBhcmUgU0RQIGZpZWxkcywgd2hpY2ggYXJlIHN0cmluZ3MuCisKKzIwMTMtMDUtMzEgMTU6MDU6NTEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6CisJICBSZXZlcnQgInJ0cGpwZWdwYXkvZGVwYXk6IFJlcGxhY2UgZnJhbWVyYXRlIGNhcHMgZmllbGQgd2l0aCBmcmFjdGlvbiIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgOWZkMjVhODEwYjg1OWUwZWMyMDUxNzY1Nzg3MzUxMDBkODNkZTRhZi4KKwkgIFdlIGRlYWwgd2l0aCBzZHAgYXR0cmlidXRlcyBpbiBhcHBsaWNhdGlvbi9zZHAsIHdoaWNoIGFyZSBhbHdheXMgc3RyaW5ncy4KKworMjAxMy0wNS0zMSAxMjozMzoyMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYWRkIGV4dHJhIFRMUyB1cmwgcHJvdG9jb2xzCisJICBXZSBhbHNvIHN1cHBvcnQgVExTIHByb3RvY29scyBub3cuCisKKzIwMTMtMDUtMzAgMTQ6NDg6NDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXI6IEFkZCBGSVhNRSBjb21tZW50IGFib3V0IHRoZSBEVVJBVElPTiBxdWVyeSBmcm9tIGFkZGVyCisJICBDdXJyZW50bHkgdGhlIGNvZGUganVzdCB0YWtlcyB3aXRoIG1heGltdW0gdXBzdHJlYW0gZHVyYXRpb24sIHdoaWNoCisJICBpcyB3cm9uZy4gSXQgc2hvdWxkIGJlIHRoZSBtYXhpbXVtIHVwc3RyZWFtIGR1cmF0aW9uIGluIHJ1bm5pbmcgdGltZS4KKworMjAxMy0wNS0zMCAyMToyMDo1OSArMDIwMCAgTWF0aGlldSBEdXBvbmNoZWxsZSA8bWF0aGlldS5kdXBvbmNoZWxsZUBlcGl0ZWNoLmV1PgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogU2V0IGEgcmVmZXJlbmNlIHRvIG1peC0+Y3VycmVudF9jYXBzIGFzIHRoZSBRVUVSWV9DQVBTIHJlc3VsdC4KKworMjAxMy0wNS0zMCAxNzozNzoxMyArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJICBsZXZlbDogbWlzYyBjbGVhbnVwcworCSAgRml4IHNvbWUgb3VkYXRlZCBjb21tZW50cy4gU29ydCBvdXQgc29tZSBjb25mdXNpb24gb2YgaW50ZXJ2YWxfZnJhbWVzIGFuZCBudW1fZnJhbWVzLgorCisyMDEzLTA1LTI5IDIwOjM1OjQxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSAgdjRsMjogT25seSBjb25kaXRpb25hbGx5IHVzZSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSX01FTlUsIGl0J3Mgbm90IGF2YWlsYWJsZSBpbiBvbGRlciB2ZXJzaW9ucworCisyMDEzLTA1LTIwIDE2OjQ1OjM3ICswMjAwICBNaWNoYWVsIE9sYnJpY2ggPG0ub2xicmljaEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5oOgorCSAgdjRsMjogYWRkIGEgcHJvcGVydHkgZm9yIGFyYml0cmFyeSB2NGwyIGNvbnRyb2xzCisJICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHNldCBhbnkgY29udHJvbHMgdGhhdCBjYW4gYmUgc2V0IHdpdGgKKwkgIFZJRElPQ19TX0NUUkwuCisJICBUaGUgY29udHJvbHMgYXJlIHNldCB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBzZXQgKGlmIHRoZSBkZXZpY2UgaXMgb3BlbikKKwkgIGFuZCB3aGVuIHRoZSBkZXZpY2UgaXMgb3BlbmVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5ODgzNworCisyMDEzLTA1LTI4IDE4OjMxOjA3ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIGxldmVsOiBmaXggZGlzY29udGludWl0aWVzIGluIHRpbWVzdGFtcHMKKworMjAxMy0wNS0yOCAxNTo0Njo0MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka2FuaW1hdGlvbi5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmZGVjLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZkZWMuaDoKKwkgIGdka3BpeGJ1ZmRlYzogS2VlcCBzZXJpYWxpemVkIGV2ZW50cyBpbiBvcmRlciwgYW5kIGRvbid0IHNlbmQgU0VHTUVOVCBiZWZvcmUgQ0FQUworCisyMDEzLTA1LTI4IDE1OjQ1OjQ5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBjcmVhdGUgYW5kIHB1c2ggc3RyZWFtLXN0YXJ0IGluIFRDUCBtb2RlCisKKzIwMTMtMDUtMjggMTU6MTA6MDcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHJlbW92ZSBzb21lIG9ic29sZXRlIGNvZGUKKwkgIEl0IGlzIG5vdCBuZWVkZWQgdG8gZG8gYSBzdGF0ZSBjaGFuZ2UgZnJvbSB0aGUgX3BsYXkoKSBmdW5jdGlvbiBvbgorCSAgb3Vyc2VsdmVzLiBUaGUgc3RhdGUgY2hhbmdlIGZ1bmN0aW9uIGFscmVhZHkgZGlkIHRoYXQgYW5kIHdlIGRvbid0IHdhbnQgdG8KKwkgIGludGVyZmVyZSB3aXRoIHRoYXQgKG9yIHVzZSBoYWNrcyB0byBhdm9pZCBpbnRlcmZlcmVuY2UpLgorCisyMDEzLTA1LTI4IDEyOjI0OjM3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBzZXQgUlRDUCBjYXBzIG9uIHRoZSBSVENQIHBhZHMKKworMjAxMy0wNS0yOCAxMjoyMzozNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogc2VuZCBzdHJlYW0tc3RhcnQgYW5kIHNlZ21lbnQgZXZlbnRzCisJICBBbHNvIHNlbmQgc3RyZWFtLXN0YXJ0IGFuZCBzZWdtZW50IGV2ZW50IG9uIHRoZSBSVENQIHBhZC4KKwkgIFdlIGRvbid0IG5lZWQgdG8gc2VuZCBhbnl0aGluZyBvbiB0aGUgc3luY19zcmMgcGFkIGJlY2F1c2Ugd2UKKwkgIGFscmVhZHkgZm9yd2FyZGVkIGFsbCBpbmNvbW1pbmcgZXZlbnRzLgorCisyMDEzLTA0LTI1IDE1OjI1OjA2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBhZGQgc2lnbmFsIHRvIGhhbmRsZSBzZXJ2ZXIgcmVxdWVzdHMKKwkgIEFkZCBhIHNpZ25hbCB0byBiZSBub3RpZmllZCBvZiBhIHNlcnZlciByZXF1ZXN0LiBUaGUgc2lnbmFsIGhhbmRsZXIgY2FuIHRoZW4KKwkgIGNvbnN0cnVjdCB0aGUgcmVzcG9uc2UgbWVzc2FnZSBmb3IgdGhlIHNlcnZlci4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjMyMjA3CisKKzIwMTMtMDUtMjcgMjI6NDM6MjUgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogTWFpbnRhaW4gei1vcmRlciB3aGVuIG5ldyBwYWQgYXJlIGFkZGVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAxMTA5CisKKzIwMTMtMDMtMDYgMTM6MTc6NTQgKzAwMDAgIFRvbSBHcmVlbndvb2QgPHRjZGdyZWVud29vZEBob3RtYWlsLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDhlbmMuYzoKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmg6CisJICB2cDhlbmM6IEFkZCBwcm9wZXJ0eSB0byBtYW51YWxseSBzcGVjaWZ5IHRoZSB0aW1lYmFzZSBvZiB0aGUgZW5jb2RlcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTcwOQorCisyMDEzLTA1LTI1IDEyOjE3OjQwIC0wNDAwICBUaGliYXVsdCBTYXVuaWVyIDx0aGliYXVsdC5zYXVuaWVyQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBBbHdheXMgaGFuZGxlIGZsdXNoX3N0b3BfcGVuZGluZyBhdG9taWNhbGx5CisJICBJdCBpcyBub3QgcHJvdGVjdGVkIHdpdGggdGhlIENPTExFQ1RfUEFEU19TVFJFQU1fTE9DSyBhbnltb3JlCisKKzIwMTMtMDUtMjMgMTg6MTQ6MTcgLTA0MDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb21peGVyLmM6CisJICB0ZXN0czogdmlkZW9taXhlcjogQWRkIGEgdGVzdHN1aXRlIGZvciB2aWRlb21peGVyCisJICBUaGlzIGlzIG1vc3RseSBjb3B5IHBhc3RlZCBmcm9tIC1iYXNlL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2FkZGVyLmMKKworMjAxMy0wNS0yNSAxMDo1NzowMiAtMDQwMCAgVGhpYmF1bHQgU2F1bmllciA8dGhpYmF1bHQuc2F1bmllckBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogRG8gbm90IHRha2UgQ09MTEVDVF9QQURTX1NUUkVBTV9MT0NLIHdoZW4gdW5uZWNlc3NhcnkKKwkgIENvbGxlY3RwYWQgdGFrZXMgdGhlIGxvY2sgaXRzZWxmIHdoZW4gcmVjZWl2aW5nIHNlcmlhbGl6ZWQgZXZlbnRzCisJICBhbmQgd2Ugc2hvdWxkIG5vdCB0YWtlIGl0IGZvciBub3Qgc2VyaWFsaXplZCBvbmVzCisKKzIwMTMtMDUtMjQgMTk6MzQ6MDUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L2ZseC9nc3RmbHhkZWMuYzoKKwkgIGZseGRlYzogUHJvcGVybHkgc2tpcCBub24tZnJhbWUgY2h1bmtzCisKKzIwMTMtMDUtMjQgMTk6MzE6MTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L2ZseC9nc3RmbHhkZWMuYzoKKwkgIGZseGRlYzogRmx1c2ggZGF0YSBmcm9tIGFkYXB0ZXIgYWZ0ZXIgcmVhZGluZyBpdAorCSAgT3RoZXJ3aXNlIHdlJ3JlIGdvaW5nIGluIGFuIGluZmluaXRlIGxvb3AsIHJlYWRpbmcgdGhlIHNhbWUgZGF0YQorCSAgb3ZlciBhbmQgb3ZlciBhZ2Fpbi4KKworMjAxMy0wNC0yNCAxNTozOTo1NCArMDAwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogZ3N0L2dvb20yazEvTWFrZWZpbGUuYW06CisJICBnb29tMmsxOiBmaXggbW9yZSBkdXBsaWNhdGVkIHN5bWJvbHMKKworMjAxMy0wNS0yMiAwMjo0MDo1MiArMDIwMCAgU2ViYXN0aWFuIFJhc211c3NlbiA8c2Vicm5AYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6CisJICBydHBqcGVncGF5L2RlcGF5OiBSZXBsYWNlIGZyYW1lcmF0ZSBjYXBzIGZpZWxkIHdpdGggZnJhY3Rpb24KKwkgIFRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBoYWQgdGhlIGZvcm1hdHRpbmcgb2YgU0RQIGF0dHJpYnV0ZXMgaGFwcGVuCisJICBpbiBlYWNoIFJUUCBwYXlsb2FkZXIsIG5vdyBpbnN0ZWFkIHRoZSBjb25zdGl0dWVudCB2YWx1ZXMgYXJlIHByb3BhZ2F0ZWQKKwkgIGFzIGNhcHMgZmllbGRzLiBUaGlzIGFsbG93cyBmb3IgYXBwbGljYXRpb25zIHRvIGRvIFNEUCBvZmZlci9hbnN3ZXIKKwkgIGJhc2VkIG9uIGNhcHMgbmVnb3RpYXRpb24uCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwNzQ4CisKKzIwMTMtMDUtMjIgMDE6NTg6NTcgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJuQGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBydHBqcGVncGF5L2RlcGF5OiBSZXBsYWNlIGZyYW1lc2l6ZSBjYXBzIHdpdGggd2lkdGgvaGVpZ2h0CisJICBUaGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gaGFkIHRoZSBmb3JtYXR0aW5nIG9mIFNEUCBhdHRyaWJ1dGVzIGhhcHBlbgorCSAgaW4gZWFjaCBSVFAgcGF5bG9hZGVyLCBub3cgaW5zdGVhZCB0aGUgY29uc3RpdHVlbnQgdmFsdWVzIGFyZSBwcm9wYWdhdGVkCisJICBhcyBjYXBzIGZpZWxkcy4gVGhpcyBhbGxvd3MgZm9yIGFwcGxpY2F0aW9ucyB0byBkbyBTRFAgb2ZmZXIvYW5zd2VyCisJICBiYXNlZCBvbiBjYXBzIG5lZ290aWF0aW9uLgorCSAgS2VlcCBwYXJzaW5nIGEtZnJhbWVyYXRlLCB4LWZyYW1lcmF0ZSBhbmQgeC1kaW1lbnNpb25zIGluIHJ0cGpwZWdkZXBheQorCSAgdG8gYmUgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyBwYXlsb2FkZXJzLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDc0OAorCisyMDEzLTA1LTIyIDAzOjE4OjA3ICswMjAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJybkBheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXkvZGVwYXk6IEFkZCBvcHRpb25hbCBmcmFtZXJhdGUgY2FwcyBmb3IgdXNlIGluIFNEUAorCSAgVGhpcyBhbGxvd3MgZm9yIGFwcGxpY2F0aW9ucyB0byBmb3JtYXQgU0RQIGF0dHJpYnV0ZXMgYW5kIHN0aWxsIGRvIFNEUAorCSAgb2ZmZXIvYW5zd2VyIGJhc2VkIG9uIGNhcHMgbmVnb3RpYXRpb24uCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwNzQ5CisKKzIwMTMtMDUtMjIgMDM6MDk6NDQgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJuQGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHJ0cGgyNjRwYXkvZGVwYXk6IEFkZCBmcmFtZSBkaW1lbnNpb25zIGEgcGF5bG9hZGVkIGNhcHMKKwkgIFRoaXMgYWxsb3dzIGZvciBhcHBsaWNhdGlvbnMgdG8gZm9ybWF0IFNEUCBhdHRyaWJ1dGVzIGFuZCBzdGlsbCBkbyBTRFAKKwkgIG9mZmVyL2Fuc3dlciBiYXNlZCBvbiBjYXBzIG5lZ290aWF0aW9uLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDc0OQorCisyMDEzLTA1LTIwIDIyOjE0OjQ0ICswMjAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJybkBheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHBoMjY0cGF5OiBSZXN0cnVjdHVyaW5nIHRvIGFsbG93IGZvciBhZGRpbmcgb3B0aW9uYWwgY2FwcworCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDc0OQorCisyMDEzLTA1LTIzIDE4OjQyOjA5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmg6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaDoKKwkgIChkeW58bXVsdGkpdWRwc2luazogQWRkIHByb3BlcnRpZXMgdG8gc3BlY2lmeSB0aGUgYmluZCBhZGRyZXNzIGFuZCBwb3J0CisJICBCeSBkZWZhdWx0IHdlIHVzZSB0aGUgYW55IGFkZHJlc3NlcyBhbmQgYSByYW5kb20gcG9ydCBmb3IgYmluZGluZyB0aGUgc29ja2V0LgorCisyMDEzLTA1LTIzIDE4OjA1OjA3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIChkeW58bXVsdGkpdWRwc2luazogQmluZCBzb2NrZXQgYmVmb3JlIHVzaW5nIGl0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwODc4CisKKzIwMTMtMDUtMjMgMTc6MjU6MjkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIChtdWx0aSl1ZHBzaW5rOiBBZGQgbWlzc2luZyBnZXR0ZXJzIGZvciBzb2NrZXQtdjYgYW5kIHVzZWQtc29ja2V0LXY2IHByb3BlcnRpZXMKKworMjAxMy0wNS0yMiAyMTowMTo0OCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBEb24ndCBob2xkIHN0cmVhbS1sb2NrIHdoaWxlIHB1c2hpbmcgbm9uLXNlcmlhbGl6ZWQgZXZlbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwODY4CisKKzIwMTMtMDUtMjIgMjE6MDA6NDUgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogRG9uJ3QgaG9sZCBvYmplY3QgbG9jayB3aGlsZSBzZW5kaW5nIGV2ZW50cworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDg2OAorCisyMDEzLTA1LTIyIDE3OjMyOjMzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IFRoZSByZXR1cm4gdmFsdWUgb2YgZ3N0X3BhZF9zZXRfY2FwcygpIGlzIG5vdCByZWxldmFudCBhbnltb3JlCisJICBDYXBzIGNhbiBmYWlsIHRvIGJlIHNldCBiZWNhdXNlIHRoZSBwYWQgaXMgbm90IGxpbmtlZCB5ZXQgZm9yIGV4YW1wbGUuCisKKzIwMTMtMDUtMTUgMTY6Mzk6MzYgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEFkZCBlcnJvciBpZiBmaWxlIGhhcyBwbGF5cmVhZHkgZHJtCisKKzIwMTMtMDUtMTggMTU6MDY6NDkgLTA0MDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXI6IFNlbmQgYSByZWNvbmZpZ3VyZSBldmVudCB1cHN0cmVhbSBpZiBzaW5rcGFkIGNhcHMgYXJlIG5vdCB1c2FibGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODQyMzcKKworMjAxMy0wNS0yMSAxMjowMjo1MSArMDIwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBrZWVwIGEgcmVmZXJlbmNlIHRvIGFsbCBxdWV1ZWQgYnVmZmVycworCSAgV2l0aG91dCB0aGlzLCBhIHF1ZXVlZCBidWZmZXIgbWF5IGJlIHJlcXVpcmVkLCBmaWxsZWQgYW5kIHF1ZXVlZCBiZWZvcmUgaXQKKwkgIGlzIGRlcXVldWVkLgorCSAgQ2FsbGluZyBnc3RfYnVmZmVyX3Bvb2xfYWNxdWlyZV9idWZmZXIoKSBlbnN1cmVzIHRoYXQgdGhlIGJ1ZmZlciBpcyBzZXQgdXAKKwkgIGNvcnJlY3RseSBhbmQgZ3N0X2J1ZmZlcl91bnJlZigpIGNhbGxzIGJ1ZmZlcl9yZWxlYXNlKCkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwNzgxCisKKzIwMTMtMDUtMjEgMTM6MzM6NTkgKzAyMDAgIEFsZXhhbmRlciBTY2hyYWIgPGFsZXhhc0BheGlzLmNvbT4KKworCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzoKKwkgIG11bGF3ZGVjOiBIYW5kbGUgTlVMTCBidWZmZXJzIGluIGhhbmRsZV9mcmFtZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5ODg5NAorCisyMDEzLTA1LTIwIDIxOjQ0OjEzICswMjAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJybkBheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAgcnRwanBlZ3BheS9kZXBheTogQWRkIGZyYW1lc2l6ZSBjYXBzIGZvciB1c2UgaW4gU0RQCisJICBUaGUgZm9ybWF0IG9mIHRoZSB2YWx1ZSBhZGhlcmVzIHRvIFJGQzYwNjQgYW5kIGl0IGlzIG1lYW50IHRvIGJlIHBhcnNlZAorCSAgYW5kIGluY2x1ZGVkIGluIHRoZSBTRFAgc2VudCBieSBnc3QtcnRzcC1zZXJ2ZXIgdG8gaXRzIGNsaWVudHMuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwNzQ4CisKKzIwMTMtMDUtMjAgMjE6MzQ6MTMgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJuQGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkgIHJ0cGpwZWdwYXk6IEFkZCBvcHRpb25hbCBmcmFtZXJhdGUgY2FwcyBmb3IgdXNlIGluIFNEUAorCSAgVGhlIGZvcm1hdCBvZiB0aGUgdmFsdWUgYWRoZXJlcyB0byBSRkM0NTY2IGFuZCBpdCBpcyBtZWFudCB0byBiZSBwYXJzZWQKKwkgIGFuZCBpbmNsdWRlZCBpbiB0aGUgU0RQIHNlbnQgYnkgZ3N0LXJ0c3Atc2VydmVyIHRvIGl0cyBjbGllbnRzLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDc0OAorCisyMDEzLTA1LTIwIDE5OjU5OjEzICswMjAwICBNYXRoaWV1IER1cG9uY2hlbGxlIDxtYXRoaWV1LmR1cG9uY2hlbGxlQGVwaXRlY2guZXU+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBXaGVuIGFsbCBzaW5rcGFkcyBhcmUgZW9zLCB1cGRhdGUgb3V0cHV0IHNlZ21lbnQgc3RvcCBhbmQgZm9yd2FyZCBpdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5OTc5MworCisyMDEzLTA1LTIwIDE5OjUxOjA3ICswMjAwICBNYXRoaWV1IER1cG9uY2hlbGxlIDxtYXRoaWV1LmR1cG9uY2hlbGxlQGVwaXRlY2guZXU+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBEb24ndCByZXNldCB0aGUgb3V0cHV0IHNlZ21lbnQgb24gZmx1c2ggc3RvcAorCSAgT25seSBpbml0IGl0IHdoZW4gZ2V0dGluZyBmcm9tIFJFQURZIHRvIFBBVVNFRCwgYW5kIGNoYW5nZSBpdCBvbiBzZWVrIGV2ZW50cy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTk3OTMKKworMjAxMy0wNS0xNyAxMDoxNjo0OCArMDIwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyOiBEb24ndCBzdG9wIHN0cmVhbWluZyB3aGVuIHNldF9jYXBzIGlzIGNhbGxlZCB3aXRoIHVuY2hhbmdlZCBjYXBzCisJICBUaGlzIGNhbiBoYXBwZW4gaWYgb3RoZXIgcGFydHMgb2YgdGhlIHBpcGVsaW5lIGFyZSByZWNvbmZpZ3VyZWQuCisJICBTdG9wIHN0cmVhbWluZyBldmVuIGZvciBhIHNob3J0IGFtb3VudCBvZiB0aW1lIGNhbiBiZSBxdWl0ZSB2aXNpYmxlLCBzbyBpdAorCSAgc2hvdWxkIGJlIGF2b2lkZWQgaWYgcG9zc2libGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwNTAzCisKKzIwMTMtMDUtMTggMTU6Mzk6MzYgLTA0MDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3NpbXBsZS1sYXVuY2gtbGluZXMuYzoKKwkgIHRlc3RzOiBSZS1lbmFibGUgdmlkZW9taXhlciB0ZXN0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg0MjM3CisKKzIwMTMtMDUtMTggMTQ6MzY6MzkgLTA0MDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmg6CisJICB2aWRlb21peGVyOiBTZW5kIGNhcHMgZXZlbnQgZnJvbSB0aGUgc3RyZWFtaW5nIHRocmVhZAorCSAgVGhpcyB3YXkgd2UgYXZvaWQgcmFjZXMgaW4gY2FwcyBuZWdvdGlhdGlvbiBhbmQgd2UgbWFrZSBzdXJlCisJICB0aGF0IHRoZSBjYXBzIGFyZSBzZW50IGFmdGVyIHN0cmVhbS1zdGFydC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODQyMzcKKworMjAxMy0wNS0wNSAyMDoyNToyMCArMDEwMCAgVGhpYmF1bHQgU2F1bmllciA8dGhpYmF1bHQuc2F1bmllckBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogRG8gbm90IHNlbmQgZmx1c2hfc3RvcCB3aGVuIHJlY2VpdmluZyBhIHNlZWsKKwkgIFRoZXJlIGlzIG5vIHJlYXNvbiB0byBzZW5kIGEgZmx1c2gtc3RvcCB3aGVuIHJlY2VpdmluZyBhIHNlZWsgZXZlbnQuCisJICBJbiB0aGUgY2FzZSBvZiBhIGZsdXNoaW5nIHNlZWssIHdlIGNvdWxkIGV2ZW50dWFsbHkgd2FudCB0bywgYnV0IGluCisJICB0aGUgY29kZSBwYXRoIHdlcmUgd2UgY2hlY2sgaWYgdGhlIHNlZWsgaXMgImZsdXNoaW5nIiwgd2UgaGF2ZSB0aGUKKwkgIGZvbGxvd2luZyBjb21tZW50IHRoYXQgbWFrZXMgc2Vuc2U6CisJICAid2UgY2FuJ3Qgc2VuZCBGTFVTSF9TVE9QIGhlcmUgc2luY2UgdXBzdHJlYW0gY291bGQgc3RhcnQgcHVzaGluZyBkYXRhCisJICBhZnRlciB3ZSB1bmxvY2sgbWl4LT5jb2xsZWN0LgorCSAgV2Ugc2V0IGZsdXNoX3N0b3BfcGVuZGluZyB0byBUUlVFIGluc3RlYWQgYW5kIHNlbmQgRkxVU0hfU1RPUCBhZnRlcgorCSAgZm9yd2FyZGluZyB0aGUgc2VlayB1cHN0cmVhbSBvciBmcm9tIGdzdF92aWRlb21peGVyX2NvbGxlY3RlZCwKKwkgIHdoaWNoZXZlciBoYXBwZW5zIGZpcnN0LiIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODQyMzcKKworMjAxMy0wNS0wNSAyMDoyNDo0OSArMDEwMCAgVGhpYmF1bHQgU2F1bmllciA8dGhpYmF1bHQuc2F1bmllckBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjI6IFByb3RlY3QgZmx1c2hfc3RvcF9wZW5kaW5nIHdpdGggdGhlIGNvbGxlY3RwYWQgc3RyZWFtIGxvY2sKKwkgIEFuZCBtYWtlIHN1cmUgdG8gZXhwZWN0IGEgZmx1c2gtc3RvcCBhZnRlciBhIGZsdXNoLXN0YXJ0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg0MjM3CisKKzIwMTMtMDUtMTcgMTI6Mzc6NTkgKzAyMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFwYXkuYzoKKwkgIHJ0cG1wNGFwYXk6IGNsZWFyIGNvbmZpZyBidWZmZXIgYmVmb3JlIHVzaW5nIGl0CisJICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHBhcnRzIG9mIHRoZSBtZW1vcnkgYXJlIG9ubHkgbW9kaWZpZWQgd2l0aCAifD0iCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwNTE0CisKKzIwMTMtMDUtMTQgMTc6MzA6MDcgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBEbyBub3QgZXhwZWN0IEVPUyBhZnRlciBhIHNlZ21lbnQgZXZlbnQgaWYgdXBzdHJlYW0gaXMgbXNzCisJICBJbiBjYXNlIHF0ZGVtdXggaXMgaGFuZGxpbmcgYSBtc3Mgc3RyZWFtLCBkbyBub3QgbWFyayB0aGUgc3RyZWFtIHRvIHdhaXQKKwkgIGZvciBFT1MgYWZ0ZXIgYSBzZWdtZW50LiBFdmVuIGlmIGl0IHNlZW1zIHRvIGJlIHRoZSBsYXN0IG9uZSBhY2NvcmRpbmcgdG8KKwkgIHRoZSBjdXJyZW50IHN0cmVhbXMgaW5mb3JtYXRpb24uCisJICBNU1MgaGFuZGxpbmcgaXMgZGlmZmVyZW50IGhlcmUgYmVjYXVzZSB0aGVyZSBpcyBhbm90aGVyIGRlbXV4ZXIgZHJpdmluZworCSAgdGhlIHBpcGVsaW5lCisKKzIwMTMtMDUtMTQgMTY6MzI6NTEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBvbmx5IHNldCBjaGFubmVscyBhbmQgcmF0ZSBpZiBxdGRlbXV4IGtub3dzIGl0CisJICBTZXR0aW5nIGJvdGggb2YgdGhvc2UgdG8gMCBpcyBwb2ludGxlc3MgYW5kIG1lYW5zIHRoYXQgcXRkZW11eAorCSAgZG9lc24ndCBrbm93IHRoZSByZWFsIHZhbHVlLiBBdm9pZCBzZXR0aW5nIGl0IGluIHRoaXMgY2FzZS4KKworMjAxMy0wNS0xNCAxNToyMzowOCArMDIwMCAgQXJuYXVkIFZyYWMgPGF2cmFjQGZyZWVib3guZnI+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogc2V0IGFsYWMgY2FwcyB1c2luZyBpbmZvIGZyb20gY29kZWMgYnVmZmVyCisJICBUaGUgc2FtcGxlcmF0ZSBmaWVsZCBpbiB0aGUgU1RTRCBhdG9tIGlzIG5vdCByaWdodCBmb3Igc29tZSBBTEFDIGZpbGVzCisJICAodXN1YWxseSB3aGVuIGF1ZGlvIGlzIDk2a0h6LzI0Yml0cyksIHNvIHRoZSBhdWRpbyBjYXBzIG11c3QgYmUKKwkgIGV4dHJhY3RlZCBmcm9tIHRoZSBjb2RlYyBkYXRhLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDM4MgorCisyMDEzLTA1LTE1IDExOjEzOjEyICswMjAwICBBcm5hdWQgVnJhYyA8YXZyYWNAZnJlZWJveC5mcj4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGRvIG5vdCBwdXNoIGRpc2NvbnQgYnVmZmVycyBpZiB0aGV5IGFyZW4ndCBkaXNjb250CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgyMTEwCisKKzIwMTMtMDUtMTUgMTA6NTE6MzggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNWVkY2Q4NSB0byAwOThjMGQ3CisKKzIwMTMtMDUtMTQgMTA6Mjg6MTAgLTA0MDAgIEpvc2h1YSBNLiBEb2UgPG9zc0BudmwuYXJteS5taWw+CisKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSAgdmlkZW9jcm9wOiBBZGQgc3VwcG9ydCBmb3IgR1JBWTE2X0xFL0dSQVkxNl9CRQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDMzMQorCisyMDEzLTA1LTE0IDE3OjI5OjU4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYzoKKwkgIHJndm9sdW1lOiBTZW5kIGFsbCBldmVudHMgdGhyb3VnaCB0aGUgcHJveHlwYWRzIGluc3RlYWQgb2YganVzdCBzZW5kaW5nIHRvIHRoZSB0YXJnZXQKKwkgIE90aGVyd2lzZSB0aGUgc3RpY2t5IGV2ZW50cyBhcmUgbWlzc2luZyBvbiB0aGUgcHJveHlwYWRzLgorCisyMDEzLTA1LTE0IDE3OjI5OjE4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmd2b2x1bWUuYzoKKwkgIHJndm9sdW1lOiBGaXggZXZlbnQgaGFuZGxpbmcgaW4gdGhlIHVuaXQgdGVzdAorCisyMDEzLTA1LTE0IDE2OjM0OjU0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdsaW1pdGVyLmM6CisJICByZ2xpbWl0ZXI6IEZpeCBldmVudCBoYW5kbGluZyBpbiB1bml0IHRlc3RzCisKKzIwMTMtMDUtMTQgMTY6MzE6NTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmM6CisJICByZ2FuYWx5c2lzOiBGaXggZXZlbnQgaGFuZGxpbmcgaW4gdW5pdCB0ZXN0CisKKzIwMTMtMDUtMTQgMTY6MDg6NTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgcXRtdXg6IEZpeCBldmVudCBoYW5kbGluZyBpbiB1bml0IHRlc3QKKworMjAxMy0wNS0xNCAxNjowMDo1OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jOgorCSAgbXVsdGlmaWxlOiBGaXggZXZlbnQgaGFuZGxpbmcgaW4gdW5pdCB0ZXN0CisKKzIwMTMtMDUtMTQgMTM6NTg6MDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWxhd2RlYy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsYXdlbmMuYzoKKwkgIG11bGF3OiBGaXggZXZlbnQgaGFuZGxpbmcgaW4gdW5pdCB0ZXN0CisKKzIwMTMtMDUtMTQgMTM6NTI6MTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkgIG1hdHJvc2thcGFyc2U6IE1ha2Ugc3VyZSB0byBzZW5kIGEgc2VnbWVudCBldmVudCBiZWZvcmUgZGF0YWZsb3cKKworMjAxMy0wNS0xNCAxMDo1MjoxOSArMDIwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IG9ubHkgYWRkIGludGVybGFjZS1tb2RlIHRvIHRoZSBjYXBzIGZvciByYXcgZm9ybWF0cworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDI4MAorCisyMDEzLTA1LTE0IDEyOjAzOjAzICswMjAwICBNaWNoYWVsIE9sYnJpY2ggPG0ub2xicmljaEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogY29weSBhbmQgc2V0IHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgY29udGVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDI4MgorCisyMDEzLTA1LTE0IDEwOjI1OjU2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW50ZXJsZWF2ZS5jOgorCSAgaW50ZXJsZWF2ZTogRml4IGV2ZW50IGhhbmRsaW5nIGluIHVuaXQgdGVzdAorCisyMDEzLTA1LTE0IDA5OjQ1OjEyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogSW1wcm92ZSBoYW5kbGluZyBvZiBtaW4vbWF4IGJ1ZmZlciBudW1iZXJzIG9mIHRoZSBidWZmZXIgcG9vbAorCisyMDEzLTA1LTE0IDAzOjQyOjU5ICswMjAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBzZXQgY2FwcyBmb3IgYnVmZmVyIHBvb2wgY29uZmlnCisKKzIwMTMtMDUtMTMgMTM6MzA6MzggLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgbXVsdGlmaWxlc2luazogTGV0IHRoZSBiYXNlIGNsYXNzIGRvIGdldF90aW1lcworCSAgVGhpcyB3aWxsIG1ha2Ugc3luYz1UUlVFIHdvcmssIHRoZSBkZWZhdWx0IGlzIHN0aWxsIHN5bmM9RkFMU0UKKworMjAxMy0wNS0xMSAyMzowODoyMyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkgIGludGVybGVhdmU6IFNlbmQgc3RyZWFtLXN0YXJ0IGJlZm9yZSBjYXBzIGV2ZW50CisKKzIwMTMtMDUtMTEgMjM6MjQ6MzYgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwbXV4LmM6CisJICBydHBtdXg6IFNlbmQgc3RyZWFtLXN0YXJ0IGJlZm9yZSBjYXBzCisKKzIwMTMtMDUtMTEgMjM6Mjg6MTIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlci10ZXN0OiBTZW5kIHN0cmVhbS1zdGFydCBiZWZvcmUgY2FwcyBmb2xsb3dlZCBieSBzZWdtZW50CisKKzIwMTMtMDUtMTEgMjM6MzQ6MzYgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW4uYzoKKwkgIHJ0cGJpbi10ZXN0OiBTZW5kIG1pc3Npbmcgc3RyZWFtLXN0YXJ0IGFuZCBzZWdtZW50IGV2ZW50cworCisyMDEzLTA1LTEzIDE1OjM2OjE5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6CisJICB0ZXN0czogRml4IHNvbWUgbW9yZSBldmVudCBoYW5kbGluZyBpbiB0ZXN0cworCisyMDEzLTA1LTEzIDE1OjE5OjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWN5ZGVtdXguYzoKKwkgIGljeWRlbXV4OiBGaXggZXZlbnQgaGFuZGxpbmcgaW4gdW5pdCB0ZXN0CisKKzIwMTMtMDUtMTMgMTU6MTk6MjUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzoKKwkgIGljeWRlbXV4OiBGaXggc3RpY2t5IGV2ZW50IGhhbmRsaW5nCisKKzIwMTMtMDUtMTMgMTU6MDY6MDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBQdXNoIHN0aWNreSBldmVudHMgaW4gdGhlIHJpZ2h0IG9yZGVyCisKKzIwMTMtMDUtMTMgMTQ6NTU6MTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGVhdmUuYzoKKwkgIGRlaW50ZXJsZWF2ZTogRml4IGV2ZW50IGhhbmRsaW5nIGluIHRlc3QKKworMjAxMy0wNS0xMyAxNDowNzoxMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOgorCSAgZGVpbnRlcmxlYXZlOiBGaXggc3RpY2t5IGV2ZW50IGhhbmRsaW5nCisKKzIwMTMtMDUtMTMgMTM6NTU6NDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkgIGRlaW50ZXJsZWF2ZTogQ29kZSBzdHlsZSBmaXhlcworCisyMDEzLTA1LTEzIDEwOjQzOjMyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIHJ0cGdzdHBheTogRmlyc3QgbGV0IGJhc2VjbGFzcyBoYW5kbGUgZXZlbnRzLCB0aGVuIHB1dCB0aGVtIGludG8gdGhlIHN0cmVhbQorCSAgRml4ZXMgaGFuZGxpbmcgb2Ygc3RpY2t5IGV2ZW50cy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDAyMTMKKworMjAxMy0wNS0wOSAyMjowNToyNCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NoYXBld2lwZS5jOgorCSAgc2hhcGV3aXBlLXRlc3Q6IFNlbmQgaW5pdGFsIGV2ZW50cworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDAzMworCisyMDEzLTA1LTA5IDE4OjMyOjIzIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwZWN0cnVtLmM6CisJICBzcGVjdHJ1bS10ZXN0OiBTZW5kIGluaXRhbCBldmVudHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDAwMzMKKworMjAxMy0wNS0wOSAxODoyNToxNyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2ZpbHRlci5jOgorCSAgdmlkZW9maWx0ZXItdGVzdDogU2VuZCBpbml0YWwgZXZlbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwMDMzCisKKzIwMTMtMDUtMDkgMTg6MjM6MzAgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFja3BhcnNlLmM6CisJICB3YXZwYWNrcGFyc2UtdGVzdDogU2VuZCBpbml0YWwgZXZlbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwMDMzCisKKzIwMTMtMDUtMDkgMTg6MjE6NTQgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMveTRtZW5jLmM6CisJICB5NG1lbmMtdGVzdDogU2VuZCBpbml0YWwgZXZlbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwMDMzCisKKzIwMTMtMDUtMTAgMTQ6MDA6MzMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJICBtdWx0aXBhcnRkZW11eDogZml4IGV4YW1wbGUgcGlwZWxpbmUKKwkgIE5lZWQganBlZ3BhcnNlLgorCisyMDEzLTA1LTEwIDEzOjM0OjE2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYWxwaGFjb2xvci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXNwZWN0cmF0aW9jcm9wLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2FtcGxpZnkuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYmJhbmQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYmxpbWl0LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2R5bmFtaWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZWNoby5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9pbnZlcnQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvcGFub3JhbWEuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvd3NpbmNiYW5kLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jbGltaXQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpc3VidGl0bGUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NhcHNzZXR0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsYWNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kdG1mLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9lcXVhbGl6ZXIuYzoKKwkgIHRlc3RzOiBGaXggc29tZSBtb3JlIHVuaXQgdGVzdHMKKworMjAxMy0wNS0xMCAxMzoxMDoyOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3BhcnNlci5jOgorCSAgdGVzdHM6IEZpeCBwYXJzZXIgdGVzdHMKKworMjAxMy0wNS0wOSAyMjoyMDoyOCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJICBzaGFwZXdpcGU6IENhbid0IG1hcCB0d2ljZSB0aGUgc2FtZSBidWZmZXIgZm9yIHdyaXRpbmcKKwkgIEkgdG9vayB0aGUgb3Bwb3J0dW5pdHkgdG8gc2ltcGxpZnkgdGhhdCBjb2RlIGEgYml0LiBXZSBub3cgdXNlCisJICBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUoKSB0byBtYWtlIHRoZSBidWZmZXIgd3JpdGFibGUgYW5kIG1hcCB0d2ljZSB0aGUKKwkgIHNhbWUgYnVmZmVyLCB3aXRoIGZpcnN0IG1hcCBiZWluZyByZWFkL3dyaXRlLCBhbmQgc2Vjb25kIHJlYWQgb25seS4gVGhpcworCSAgZ2V0IHJpZCBvZiB0aGUgY3JpdGljYWw6CisJICBHU3RyZWFtZXItQ1JJVElDQUwgKio6IGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWU6IGFzc2VydGlvbiBgSVNfTVVUQUJMRQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDA0NAorCisyMDEzLTA1LTA5IDIyOjE1OjU0IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkgIHNoYXBld2lwZTogRW5zdXJlIGNhcHMgYXJlIHdyaXRhYmxlCisJICBUaGUgZXhpc3Qgb25lIGNhc2Ugd2hlcmUgdGhhdCB3ZSBlbmR1cCB3aXRoIG9yaWdpbmFsIGNhcHMgaW4gcmV0LCBpbiB3aGljaAorCSAgY2FzZSB3ZSBhcmUgbm90IGd1YXJhdGllZCB0byBoYXZlIHdyaXRhYmxlIGNhcHMuIFNpbXBseSBlbnN1cmUgdGhpcyBpcyB0aGUKKwkgIGNhcHMgYXJlIHdyaXRhYmxlIGJlZm9yZSBlbnRlcmluZyB0aGUgbG9vcC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDAwNDQKKworMjAxMy0wNS0wOSAyMjoxMzo1MSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJICBzaGFwZXdpcGU6IEZpeCBzYW1wbGUgcGlwZWxpbmUgaW4gZG9jdW1lbnRhdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDA0NAorCisyMDEzLTA1LTA5IDE4OjA1OjAyIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2pwZWdlbmMuYzoKKwkgIGpwZWdlbmMtdGVzdDogU2VuZCBpbml0YWwgZXZlbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwMDMzCisKKzIwMTMtMDUtMDkgMTc6NDk6MDMgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdnA4ZW5jLmM6CisJICB2cDhlbmMtdGVzdDogU2VuZCBpbml0YWwgZXZlbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwMDMzCisKKzIwMTMtMDUtMDkgMTc6MjA6MTggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdnA4ZGVjLmM6CisJICB2cDhkZWMtdGVzdDogU2VuZCBpbml0YWwgZXZlbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwMDMzCisKKzIwMTMtMDUtMDkgMTc6MTk6NTMgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFja2RlYy5jOgorCSAgd2F2cGFja2RlYy10ZXN0OiBTZW5kIGluaXRpYWwgZXZlbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwMDMzCisKKzIwMTMtMDUtMDkgMTY6MjY6MTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgUmV2ZXJ0ICJ2aWRlb21peGVyMjogVGFrZSBpbnRvIGFjY291bnQgbmV3IHNlZ21lbnRzIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCA4NGFlNjcwYWI0MGIyNThhMTBlMWUyMTQ3MWU2ZGM5ZDc4NmJmMDg2LgorCSAgQWN0dWFsbHkgdGhpcyBpcyBub3QgaG93IGl0IGlzIHN1cHBvc2VkIHRvIHdvcmsuIHZpZGVvbWl4ZXIKKwkgIGNyZWF0ZXMgYSBbMCwtMV0gc2VnbWVudCBhbmQgdGhlbiBwdXRzIGZyYW1lcyBvZiB0aGUgZGlmZmVyZW50CisJICBzdHJlYW1zIHRoZXJlIGJhc2VkIG9uIHRoZWlyIHJ1bm5pbmcgdGltZXMgaW4gdGhlaXIgb3duIHNlZ21lbnRzLgorCisyMDEzLTA1LTA2IDIzOjQzOjAzICswMjAwICBNYXRoaWV1IER1cG9uY2hlbGxlIDxtYXRoaWV1LmR1cG9uY2hlbGxlQGVwaXRlY2guZXU+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyMjogVGFrZSBpbnRvIGFjY291bnQgbmV3IHNlZ21lbnRzCisJICBBbHNvIGZvcndhcmQgdGhlIGV2ZW50IGRvd25zdHJlYW0gb24gdGhlIG5leHQgb3Bwb3J0dW5pdHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk5NzkzCisKKzIwMTMtMDUtMDkgMDk6MDc6MzggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIFJldmVydCAiZ3N0cnRzcHNyYzogc2V0IGJ1ZmZlci1zaXplIGZvciBtdWx0aWNhc3QgYnVmZmVycyIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgMjQ4MWU5NWQwMzhiNDIyOTdhMDE2ZjFkMmRjMWFmMjZkMjE3NWI0Mi4KKwkgIFRoaXMgaXMgYWxyZWFkeSBkb25lIGZpdmUgbGluZXMgYWJvdmUsIGl0IHdhcyBhZGRlZCBhIHllYXIKKwkgIGFnbyBpbiBjb21taXQgNTYxYjEzMWUuCisKKzIwMTMtMDUtMDggMTk6NTQ6MTkgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2ZpbHRlci5jOgorCSAgdmlkZW9maWx0ZXI6IFVuaXQgdGVzdCBzZW5kIFNFR01FTlQgYmVmb3JlIENBUFMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTk5NjYKKworMjAxMy0wNS0wOCAxOToyMjozMSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOgorCSAgYXZpbXV4OiBVbml0IHRlc3Qgc2VuZHMgU0VHTUVOVCBiZWZvcmUgY2FwcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5OTk2NgorCisyMDEzLTA1LTA4IDE5OjA4OjI0IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW93c2luY2JhbmQuYzoKKwkgIGF1ZGlvd3NpbmNiYW5kOiBUZXN0IHNob3VsZCBzZW5kIHNlZ21lbnQgYWZ0ZXIgQ0FQUworCSAgVGhpcyBtYWtlcyB0aGUgdW5pdCB0ZXN0IHBhc3MgYWdhaW4uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk5OTY2CisKKzIwMTMtMDUtMDggMTk6MDA6MjggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jbGltaXQuYzoKKwkgIGF1ZGlvd3NpbmNsaW1pdDogVGVzdCBzaG91bGQgc2VuZCBzZWdtZW50IGFmdGVyIENBUFMKKwkgIFRoaXMgbWFrZXMgdGhlIHVuaXQgdGVzdCBwYXNzIGFnYWluLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5OTk2NgorCisyMDEzLTA1LTA4IDE4OjQ0OjMyIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2xpbWl0LmM6CisJICBhdWRpb3dzaW5jbGltaXQ6IEZyZXF1ZW5jZSBwcm9wZXJ0eSByZW5hbWVkIGN1dG9mZgorCSAgVXBkYXRpbmcgdGhlIGRvY3VtZW50YXRpb24gdG8gcmVmbGVjdCB0aGlzIGNoYW5nZS4KKwkgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5OTk2NAorCisyMDEzLTA1LTA4IDE1OjI1OjU4IC0wMzAwICBBaGEgVW5zd29ydGggPGFoYS51bnN3b3J0aEBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIGdzdHJ0c3BzcmM6IHNldCBidWZmZXItc2l6ZSBmb3IgbXVsdGljYXN0IGJ1ZmZlcnMKKwkgIEZvciByZWNlaXZpbmcgdmlkZW8gZGF0YSB2aWEgUlRTUCB3aGVuIHRoZSB2aWRlbyBpcyBzZW50IHZpYQorCSAgbXVsdGljYXN0IHRoZXJlIGlzIG5vIHdheSB0byBzcGVjaWZ5IHRoZSB1ZHBzcmMgYnVmZmVyLXNpemUuCisJICBPbiB3aW5kb3dzIHRoZSBuYXRpdmUgbmV0d29yayBidWZmZXIgaXMgbm90IGxhcmdlIGFuZCB3aXRoIHZpZGVvCisJICBpLWZyYW1lcyBiZWluZyBodWdlIHRoZSBidWZmZXIgaXMgdG8gc21hbGwgYW5kIHlvdSBnZXQgaS1mcmFtZSBjb3JydXB0aW9uLAorCSAgaXQgbG9va3MgdGVycmlibGUsIGFuZCB0aGVyZSBpcyBubyAoZWFzeSkgd2F5IHRvIHNldCB0aGUgdWRwc3JjIGJ1ZmZlci1zaXplLgorCSAgaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTIyNjQKKworMjAxMy0wNS0wOCAxNjowMjowNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyMjogU2VuZCBzdHJlYW0tc3RhcnQgYmVmb3JlIGNhcHMgZXZlbnQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTk4OTUKKworMjAxMy0wNS0wNyAxOToxNTo0OSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBmaXggY29tcGlsZXIgd2FybmluZyBvbiB0eXBlIGNoZWNrCisKKzIwMTMtMDQtMTggMDc6NDk6NTQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwdXNoIG5ldyBjYXBzIGV2ZW50cyB3aGVuIGNhcHMgY2hhbmdlCisJICBXaGVuZXZlciB0aGUgZGVtdXhlciBoYXMgYSBuZXcgY2FwcyBvbiBhIHN0cmVhbSwgaXQgc2hvdWxkIHNldCB0aGUKKwkgIG5ld19jYXBzIHZhcmlhYmxlIHRvIHRydWUgYW5kIGEgbmV3IGNhcHMgZXZlbnQgd2lsbCBiZSBwdXNoZWQgYmVmb3JlCisJICB0aGUgbmV4dCBidWZmZXIKKworMjAxMy0wNC0xNyAxNjo1NDoyMiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGRvIG5vdCBwdXNoIGRpc2NvbnQgYnVmZmVycyBpZiB0aGV5IGFyZW4ndCBkaXNjb250CisJICBxdGRlbXV4IHRha2VzIGl0cyBidWZmZXJzIGZyb20gYSBHc3RBZGFwdGVyLiBUaG9zZSBidWZmZXJzIGFyZSBjcmVhdGVkCisJICBmcm9tIHRoZSBsYXJnZXIgYnVmZmVyIHRoYXQgaXQgb2J0YWluZWQgZnJvbSB1cHN0cmVhbSBhbmQgdGhleSBjYXJyeQorCSAgdGhlIHNhbWUgZmxhZ3MsIGluY2x1ZGluZyBESVNDT05UIGlmIGl0IGlzIHNldC4gSW4gdGhlc2UgY2FzZXMsIGFsbAorCSAgYnVmZmVycyB0aGF0IHF0ZGVtdXggaXMgZ29pbmcgdG8gcHVzaCB3b3VsZCBiZSBtYXJrZWQgYXMgRElTQ09OVC4KKwkgIFRoaXMgc2NlbmFyaW8gY2FuIG1ha2UgcGFyc2Vycy9kZWNvZGVycyBmbHVzaCBvbiBldmVyeSBidWZmZXIgbGVhZGluZworCSAgdG8gbm8gZGVjb2RpbmcgYXQgYWxsIGhhcGVubmluZy4gVGhpcyBwYXRjaCBwcmV2ZW50cyB0aGlzIGJ5IHVuc2V0dGluZworCSAgdGhlIGZsYWcgaWYgaXQgc2hvdWxkbid0IGJlIHNldC4KKworMjAxMy0wNC0xMiAwOTowODoxNiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5oOgorCSAgcXRkZW11eDogc29tZSBjb2RlIGNsZWFudXAgZm9yIG1zcyBoYW5kbGluZyBjb2RlCisJICAqIEV4cGxpY2l0bHkgaW5pdCB2YXJpYWJsZXMgZm9yIGZyYWdtZW50ZWQgZm9ybWF0cyBhdCBpbml0CisJICAqIERvIG5vdCB1c2UgR3N0Q2xvY2tUaW1lIHR5cGUgaWYgdGhlIHZhcmlhYmxlIGlzbid0IGEgdGltZXN0YW1wCisJICAqIEZpeCBhIHN0eWxlL3JlYWRhYmlsaXR5IGlzc3VlIGF0IGFuIGlmIGJsb2NrCisJICAqIEdyb3VwIDIgbXNzIG1vZGUgY29uZGl0aW9uYWwgYmxvY2tzIHRvZ2V0aGVyIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkKKwkgIENvbmZsaWN0czoKKwkgIGdzdC9pc29tcDQvcXRkZW11eC5jCisKKzIwMTMtMDQtMTIgMTA6MjE6MTEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhdm9pZCBzdG9yaW5nIG5vbi10aW1lIG5ld3NlZ21lbnRzIHRvIHB1c2ggbGF0ZXIKKwkgIFRoaXMgY2FuIGNvbmZ1c2UgZG93bnN0cmVhbSB3aGVuIHRoZXkgZ2V0IGEgYnl0ZSBzZWdtZW50IGFmdGVyIHJlY2VpdmluZworCSAgdGhlIG5hdHVyYWwgdGltZSBzZWdtZW50IGZyb20gcXRkZW11eCB0aGF0IGl0IHNlbmRzIHdoZW4gc3RhcnRpbmcgdG8KKwkgIHB1c2ggYnVmZmVycy4gVGhpcyBpcyBzcGVjaWFsbHkgdGhlIGNhc2Ugd2l0aCBwYXJzZXJzIHRoYXQgdHJ5IHRvCisJICBjb252ZXJ0IHRoZSBwb3NpdGlvbiBmcm9tIGJ5dGUgdG8gdGltZSBmb3JtYXQgYW5kIG1pZ2h0IG1pc3MgdGhlCisJICBjb3JyZWN0IHBvc2l0aW9uIGZvciBwbGF5YmFjayB0byBzdGFydC4KKworMjAxMy0wNC0xMCAxODowMjoyOCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGF2b2lkIHNldHRpbmcgZmllbGRzIHRvIG5vbi13cml0YWJsZSBjYXBzCisKKzIwMTMtMDMtMTAgMDQ6MTU6MDYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZG9uJ3Qgc2VuZCBzbyBtYW55IHNlZ21lbnQgZXZlbnRzCisJICBPbmx5IHNlbmQgb25lIHNlZ21lbnQgZXZlbnQgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtLCBub3QKKwkgIGFmdGVyIGVhY2ggbW9vdiBhbmQgbW9vZiBhdG9tLgorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L2lzb21wNC9xdGRlbXV4LmMKKworMjAxMy0wMy0wOCAxNjowMjoyNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwbGFjZSBpbmNvbW1pbmcgdGltZXN0YW1wcyBvbiBvdXRwdXQKKwkgIFBsYWNlIHRoZSBpbmNvbW1pbmcgdGltZXN0YW1wIChpZiBhbnkpIGRpcmVjdGx5IG9udG8gdGhlIG91dGdvaW5nIGJ1ZmZlcnMKKwkgIGFuZCBpbnRlcnBvbGxhdGUgb3RoZXIgdGltZXN0YW1wcy4KKwkgIENvbmZsaWN0czoKKwkgIGdzdC9pc29tcDQvcXRkZW11eC5jCisKKzIwMTMtMDUtMDcgMTA6MTY6MTggLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBpbXByb3ZlIHJlc2V0IG9mIGludGVybmFsIHN0YXR1cworCSAgUmVzZXQgZGlmZmVyZW50IHZhcmlhYmxlcyBvbiBzdGF0ZSBjaGFuZ2VzIHRvIHJlYWR5IGFuZCB3aGVuCisJICBoYW5kbGluZyBhIGZsdXNoLXN0b3AuIEZvciBoYW5kbGluZyBmbHVzaCBzdG9wcyB3ZSBzaG91bGQgY2hlY2sKKwkgIGlmIHRoZXJlIGlzIGFuIHVwc3RyZWFtIGFkYXB0aXZlIGRlbXV4ZXIgZHJpdmluZyB0aGUgcGlwZWxpbmUgYXMgdGhpcworCSAgbWVhbnMgdGhhdCBxdGRlbXV4IHdpbGwgZ2V0IGEgbmV3IG1vb3YgYXRvbS4gRm9yICdzdGFuZGFyZCcgaXNvbWVkaWEKKwkgIHN0cmVhbXMgdGhpcyBpc24ndCB0cnVlIGFuZCBxdGRlbXV4IHNob3VsZCBrZWVwIHRoZSBwcmV2aW91cyBtb292CisJICBpbmZvcm1hdGlvbiBhcm91bmQuCisJICBDb25mbGljdHM6CisJICBnc3QvaXNvbXA0L3F0ZGVtdXguYworCisyMDEzLTAyLTA4IDAwOjI5OjIwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcHJlcGFyZSBxdGRlbXV4IHRvIGFjY2VwdCBtdWx0aXBsZSBkYXNoIG1vb3ZzIGluIGEgcm93CisJICBXaGVuZXZlciBkYXNoZGVtdXggc3dpdGNoZXMgYml0cmF0ZXMgaXQgc2VuZHMgYSBuZXcgbW9vdiB3aXRoIHRoZQorCSAgbmV3IHN0cmVhbSBjb25maWd1cmF0aW9uLiBxdGRlbXV4IHNob3VsZCBub3cgaGFuZGxlIHRoaXMgYnkgc3BsaXR0aW5nCisJICB0aGUgZXhwb3NpbmcgYW5kIGNvbmZpZ3VyYXRpb24gb2Ygc3RyZWFtcyBpbnRvIHNlcGFyYXRlIGZ1bmN0aW9ucy4gV2hlbgorCSAgdGhlIHN0cmVhbSBpcyBuZXcgaXQgaXMgY29uZmlndXJlZCBhbmQgZXhwb3NlZCwgd2hlbiBpdCBpcyBhIG5ldyBiaXRyYXRlCisJICBvZiBhbiBleGlzdGluZyBzdHJlYW0gaXQgaXMgb25seSByZWNvbmZpZ3VyZWQuCisJICBDb25mbGljdHM6CisJICBnc3QvaXNvbXA0L3F0ZGVtdXguYworCisyMDEzLTAyLTA3IDE0OjEyOjUzIC0wMjAwICBBbmRyZSBNb3JlaXJhIE1hZ2FsaGFlcyAoYW5kcnVua28pIDxhbmRyZS5tYWdhbGhhZXNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IE1vdmUgRkxVU0hfU1RPUC9QQVVTRURfVE9fUkVBRFkgaGFuZGxpbmcgdG8gYSByZXNldCBtZXRob2QuCisJICBDb25mbGljdHM6CisJICBnc3QvaXNvbXA0L3F0ZGVtdXguYworCisyMDEzLTAxLTIzIDEwOjU1OjMzIC0wNTAwICBMb3Vpcy1GcmFuY2lzIFJhdHTDqS1Cb3VsaWFubmUgPGxvdWlzLWZyYW5jaXMucmF0dGUtYm91bGlhbm5lQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IFJlbW92ZSBvbGQgcGFkcyB3aGVuIGV4cG9zaW5nIHN0cmVhbXMgYW5kIG90aGVyIGdlbmVyYWwgZml4ZXMuCisJICBDb25mbGljdHM6CisJICBnc3QvaXNvbXA0L3F0ZGVtdXguYworCisyMDEzLTA0LTE2IDEwOjQxOjQzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4Lmg6CisJICBxdGRlbXV4OiBoYW5kbGUgbXNzIHN0cmVhbXMKKwkgIHNtb290aHN0cmVhbWluZyBzdHJlYW1zIHNob3VsZCBiZSBoYW5kbGVkIGFzIGEgc3BlY2lhbCBraW5kIG9mCisJICBmcmFnbWVudGVkIGlzb21lZGlhLiBJbiBNU1MgdGhlIGZyYWdtZW50cyB3aWxsIG5vdCBjb250YWluIGEKKwkgICdtb292JyBhdG9tIHdpdGggdGhlIG1lZGlhIGRlc2NyaXB0aW9ucywgdGhpcyBoYXMgdG8gYmUgZXh0cmFjdGVkCisJICBmcm9tIHRoZSBjYXBzLgorCSAgQWRkaXRpb25hbGx5LCB0aGVyZSBzaG91bGQgYmUgYW5vdGhlciBkZW11eGVyIHVwc3RyZWFtIHRoYXQgaXMgbGlrZWx5CisJICBnb2luZyB0byBiZSB0aGUgb25lIHRvIGFuc3dlci9hY3Qgb24gcXVlcmllcyBhbmQgZXZlbnRzLCBzbyBxdGRlbXV4IGhhcworCSAgdG8gZm9yd2FyZCB0aG9zZSB1cHN0cmVhbS4KKworMjAxMy0wNS0wNiAxNjo1NDowMiArMDIwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiByZXF1ZXN0IDAgYnVmZmVycyB3aGVuIHN0b3BwaW5nCisJICBXaXRob3V0IHRoaXMgc3RvcHBpbmcgdGhlIHBvb2wgaW4gKl9zZXRfY2FwcygpIGlzIHVzZWxlc3MuCisJICBTX0ZNVCB3aWxsIHN0aWxsIGZhaWwgd2l0aCBFQlVTWS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTk4MzUKKworMjAxMy0wNS0wNyAxNjozMjowMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IEJ5IGRlZmF1bHQgYXNzdW1lIHRoYXQgd2UncmUgd29ya2luZyBvbiBub24tcGFja2V0aXplZCBpbnB1dAorCSAgT25seSBkZXRlY3RpbmcgdGhpcyBpbiBzZXRfZm9ybWF0KCkgZG9lcyBub3Qgd29yayBiZWNhdXNlIHdlIG1pZ2h0CisJICBub3QgZ2V0IGFueSBjYXBzIGF0IGFsbCwgZS5nLiBmcm9tIGZpbGVzcmMuCisKKzIwMTMtMDUtMDcgMTY6MzA6NTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgcG5nZGVjOiBJbXBsZW1lbnQgcGFyc2luZyBmdW5jdGlvbmFsaXR5CisJICBUaGlzIGFsbG93cyB0byBwbHVnIHBuZ2RlYyBkaXJlY3RseSB3aXRob3V0IGEgcGFyc2VyIGlmIHRoYXQKKwkgIGlzIGRlc2lyZWQuCisJICBQYXJzaW5nIGNvZGUgaXMgYmFzZWQgb24gcG5ncGFyc2UuCisKKzIwMTMtMDUtMDcgMTU6NTQ6MjQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5jOgorCSAgY2FjYXNpbms6IEZpeCBzdXBwb3J0IGZvciBSR0IgZm9ybWF0cyBhbmQgYWRkIHN1cHBvcnQgZm9yIG1vcmUgb2YgdGhlbQorCisyMDEzLTA1LTA0IDEzOjE5OjUzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBEb24ndCBjb25zaWRlciB0aGUgY29udGVudCBzaXplIGZyb20gdGhlIEhUVFAgaGVhZGVycyBhcyBhYnNvbHV0ZWx5IGNvcnJlY3QKKwkgIFRoZSBIVFRQIHNlcnZlciBjb3VsZCBnaXZlIHdyb25nIGluZm9ybWF0aW9uLCBlLmcuIGlmIHRoZSBIVFRQIHN0cmVhbSBpcworCSAgY2h1bmstZW5jb2RlZCBvciBjb21wcmVzc2VkLCBvciBpZiB0aGUgc2VydmVyIGRvZXMgbm90IGtub3cgdGhlIGNvbXBsZXRlIHNpemUKKwkgIGF0IHRoZSB0aW1lIHdoZW4gdGhlIGZpbGUgaXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuCisJICBBbHNvIHNlZQorCSAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTExNTM1NAorCisyMDEyLTA4LTIwIDA5OjUyOjMyICswMjAwICBQaGlsaXBwIFphYmVsIDxwLnphYmVsQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMjogZmlsbCBvdXQgdjRsMl9idWZmZXIuYnl0ZXN1c2VkIGZpZWxkIGZvciB2NGwyc2luaworCSAgV2hlbiBxdWV1aW5nIGEgYnVmZmVyIGZvciBhIHNpbmssIGJ5dGVzdXNlZCBtdXN0IGNvbnRhaW4gdGhlIGFjdHVhbAorCSAgYW1vdW50IG9mIGRhdGEuCisJICBGb3IgYSBzb3VyY2UsIHRoZSBkcml2ZXIgbXVzdCBvdmVyd3JpdGUgdGhpcywgc28gaXQgZG9lc24ndCBtYXR0ZXIKKwkgIHdoYXQgaXMgc2V0IGhlcmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk5NTk4CisKKzIwMTMtMDUtMDMgMjM6NDM6MjYgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJhc0BnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJICBydHBnc3RwYXk6IGZpeCBpbnZhbGlkIG1lbW9yeSBhY2Nlc3MgaW4gZXZlbnQgaGFuZGxlcgorCSAgRmlyc3QgcHJvY2VzcyBldmVudCBpbiBwYXlsb2FkZXIsIHRoZW4gaGFuZCBpdCB0byB0aGUKKwkgIGJhc2UgY2xhc3Mgd2hpY2ggdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBldmVudC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTk2MzcKKworMjAxMy0wNS0wNCAwOTo0ODowMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSAgYWMzcGFyc2UsIGRjYXBhcnNlOiBjaGVjayBidWZmZXIgc2l6ZSBiZWZvcmUgdHJpbW1pbmcKKwkgIGFuZCB1bnJlZiBvbGQgYnVmZmVyIGFzIHNvb24gYXMgcG9zc2libGUuCisKKzIwMTMtMDUtMDIgMTU6MDA6MjIgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuaDoKKwkgIGRjYXBhcnNlOiBhZGQgc3VwcG9ydCBmb3IgImF1ZGlvL3gtcHJpdmF0ZTEtZHRzIgorCisyMDEzLTA1LTAyIDE0OjU2OjAyICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmg6CisJICBhYzNwYXJzZTogYWRkIHN1cHBvcnQgZm9yICJhdWRpby94LXByaXZhdGUxLWFjMyIKKworMjAxMy0wNS0wMyAxMjo0NjozNyArMDIwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IGFsd2F5cyBnZW5lcmF0ZSB2aWRlbyBpbmZvIGZyb20gY2FwcworCSAgSW4gdGhlIHBhc3QgZ3N0X3ZpZGVvX2luZm9fZnJvbV9jYXBzKCkgb25seSB2aWRlby94LXJhdy4gTm93IGl0IGFsc28KKwkgIHN1cHBvcnRzIG90aGVyIHZpZGVvLyogYW5kIGltYWdlLyogZm9ybWF0cy4KKwkgIFdpdGggdGhpcyBwYXRjaCB0aGUgZm9ybWF0IHdvbid0IGJlIEdTVF9WSURFT19GT1JNQVRfVU5LT1dOIGFuZAorCSAgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfc2V0X2NvbmZpZygpIGhhbmRsZXMgc3RyaWRlcyBjb3JyZWN0bHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk5NTcwCisKKzIwMTMtMDUtMDIgMDk6NDE6MDEgKzAyMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkgIHY0bDI6IHRyeSB0byBhbGxvY2F0ZSBuZXcgYnVmZmVycyB3aXRoIFZJRElPQ19DUkVBVEVfQlVGUyBpZiBuZWVkZWQKKwkgIElmIG1heF9idWZmZXJzIGlzIDAgdGhlbiBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGJ1ZmZlcnMgKGN1cnJlbnRseSA0KSBpcworCSAgYWxsb2NhdGVkLiBJZiB0aGlzIGlzIG5vdCBlbm91Z2ggdjRsMnNyYyBzdGFydHMgY29weWluZyBidWZmZXJzLgorCSAgV2l0aCB0aGlzIHBhdGNoIFZJRElPQ19DUkVBVEVfQlVGUyBpcyB1c2VkIHRvIGFsbG9jYXRlIGEgbmV3IGJ1ZmZlci4gSWYKKwkgIHRoaXMgZmFpbHMgdjRsMnNyYyBmYWxscyBiYWNrIHRvIGNvcHlpbmcgYnVmZmVycy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTk0NDcKKworMjAxMy0wNC0xNSAxNzozNzowMSArMDIwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiBmaXggc2V0dGluZyB3aW5kb3cgaGFuZGxlIGFmdGVyIHRyYW5zaXRpb24KKwkgIFRoZSBkZXN0cm95ZWQgZmxhZyB3YXMgbm90IHJlc2V0IHByb3Blcmx5IGFuZCBpdCdzIGFsc28gbm90IG5lZWRlZAorCSAgYXMgd2UgY2FuIGNoZWNrIG9zeHdpbmRvdyAhPSBOVUxMCisKKzIwMTMtMDUtMDIgMTM6NDU6NTUgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICBydHA6IGZpeCBkdXBsaWNhdGVkIHN5bWJvbHMgd2l0aCBsaWJ2cHgKKworMjAxMy0wNC0yOSAxMDo1ODowOCArMDIwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogZ3N0L2dvb20yazEvTWFrZWZpbGUuYW06CisJICBnb29tMmsxOiBmaXggZHVwbGljYXRlZCBzeW1ib2xzIHdpdGggZ29vbQorCisyMDEzLTA1LTAxIDE1OjQ5OjQ1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHBoMjY0cGF5OiBJZiB0aGUgYWRhcHRlciBpcyBlbXB0eSBvbiBFT1MgZG9uJ3QgdHJ5IHRvIG1hcCBpdHMgY29udGVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5OTMxNAorCisyMDEzLTA0LTMwIDE0OjM2OjM4ICswMjAwICBPZ255YW4gVG9uY2hldiA8b2dueWFuQGF4aXMuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGFkZCBzdHJlYW0tZm9ybWF0PXJhdyB0byBhYWMgY2FwcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5OTMwMworCisyMDEzLTA0LTMwIDEzOjA3OjM3ICswMjAwICBNaWNoYWVsIE9sYnJpY2ggPG0ub2xicmljaEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGZpeCBhbmQgY2xlYW51cCBWSURJT0NfRVhQQlVGIGhhbmRsaW5nCisJICBjbGVhciB0aGUgc3RydWN0LCBhbmQgcHJvdmlkZSBhIGNvcnJlY3QgZXJyb3IgbWVzc2FnZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5OTMzNworCisyMDEyLTA3LTA1IDE4OjAyOjI3ICswMjAwICBQaGlsaXBwIFphYmVsIDxwLnphYmVsQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBoYW5kbGUgcmV0dXJuIHZhbHVlIC1FTk9UVFkgZm9yIHVuaW1wbGVtZW50ZWQgVklESU9DX0dfUEFSTQorCSAgTmV3ZXIga2VybmVscyByZXR1cm4gLUVOT1RUWSwgb2xkZXIga2VybmVscyByZXR1cm4gLUVJTlZBTCBpZiB0aGUgaW9jdGwKKwkgIGlzIG5vdCBpbXBsZW1lbnRlZC4gV2l0aCB0aGlzIHBhdGNoLCBHU3RyZWFtZXIgaGFuZGxlcyBib3RoIGNhc2VzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5ODgyNQorCisyMDEzLTA0LTMwIDA5OjE2OjA3ICswMjAwICBNaWNoYWVsIE9sYnJpY2ggPG0ub2xicmljaEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogZml4IGJyb2tlbiBib29sZWFuIGV4cHJlc3Npb24gdG8gZGV0ZWN0IG5vbi1mcmFtZSBidWZmZXJzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk5Mjk0CisKKzIwMTMtMDQtMjkgMTE6MDc6NTYgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IEJldHRlciBlcnJvciBtZXNzYWdlIHdoZW4gc2VydmVyIHZlcnNpb24gaXMgdG9vIG9sZAorCSAgV2UgY2hlY2sgZm9yIHRoZSBsaWJyYXJ5IHZlcnNpb24gYXQgY29uZmlndXJlIHRpbWUsIGJ1dCB0aGUgc2VydmVyCisJICB2ZXJzaW9uIGNhbiBvbmx5IHJlYWxseSBiZSBjaGVja2VkIGF0IHJ1bi10aW1lLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5ODc2OAorCisyMDEzLTA0LTI3IDExOjI0OjM4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvdWRwL2dzdHVkcC5jOgorCSAgdWRwOiBsb2cgV0FSTklORyBkZWJ1ZyBtZXNzYWdlIGlmIFVEUCBtdWx0aWNhc3QgaXMgbGlrZWx5IHRvIGJlIGJyb2tlbgorCisyMDEzLTA0LTI3IDExOjE2OjU0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBhZGQgaW5jbHVkZXMgdG8gZ2V0IHNvY2tsZW5fdCBkZWZpbmVkIG9uIFdpbmRvd3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTI0MDAKKworMjAxMy0wNC0yNyAwOTozOTo0NSArMDEwMCAgWXVyeSBEZWxlbmRpayA8YXN5bmMucHJvY2Vzc2luZ2pzQHlhaG9vLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgc3VwcG9ydCBmb3IgVlA2RiBWUDYgZmxhc2ggY29kZWMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTkwMTAKKworMjAxMi0wOS0wNSAxNjozOTozMSArMDIwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBhbHNvIHBvbGwgZm9yIG91dHB1dCBkZXZpY2VzCisJICBOb3RlIHRoYXQgdGhlIFY0TDIgQVBJIGRlZmluZXMgdGhhdCBmb3Igb3V0cHV0IGRldmljZXMgUE9MTE9VVAorCSAgaW5kaWNhdGVzIHRoYXQgYSBidWZmZXIgaXMgcmVhZHkgdG8gYmUgZGVxdWV1ZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk4OTkyCisKKzIwMTItMDgtMjAgMDk6NTI6MzQgKzAyMDAgIFBoaWxpcHAgWmFiZWwgPHAuemFiZWxAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IGZpeCBjb3B5aW5nIG9mIGVuY29kZWQgYnVmZmVycworCSAgVGhlIGV4aXN0ZW5jZSBvZiBhIEdzdFZpZGVvRm9ybWF0SW5mbyBkb2VzIG5vdCBndWFyYW50ZWUsIHRoYXQKKwkgIHRoZSBidWZmZXIgY29udGFpbnMgdmlkZW8gZnJhbWVzLCBzbyB0aGUgZm9ybWF0IG11c3QgYmUgY2hlY2tlZC4KKwkgIEFsc28sIGZvciBlbmNvZGVkIGJ1ZmZlcnMgdGhlIGxlbmd0aCBpcyB2YXJpYWJsZSBhbmQgbXVzdCBiZSBzZXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk4OTQ5CisKKzIwMTItMDctMTAgMTU6Mjk6NDAgKzAyMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBhZGQgc3VwcG9ydCBmb3IgbXBlZzQgYW5kIEguMjYzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk4ODI2CisKKzIwMTMtMDQtMjYgMTI6MTY6NDkgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSAgbW9ub3Njb3BlOiBGaXggZGVidWcgc3RhdGVtZW50CisKKzIwMTMtMDQtMjUgMjE6NTA6MzMgKzAyMDAgIEFsZXhhbmRlciBTY2hyYWIgPG1lcm9zQG1lcm9zLWRlc2t0b3AuKG5vbmUpPgorCisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuaDoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsYXdkZWMuYzoKKwkgIG11bGF3ZGVjOiBjaGFuZ2UgYmFzZSBjbGFzcyB0byBHc3RBdWRpb0RlY29kZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTg4OTQKKworMjAxMy0wNC0yNSAyMDo1OTo1MiArMDIwMCAgTWF0aGlldSBEdXBvbmNoZWxsZSA8bWF0aGlldS5kdXBvbmNoZWxsZUBlcGl0ZWNoLmV1PgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuaDoKKwkgIHZpZGVvbWl4ZXI6IHNlbmQgc3RyZWFtLXN0YXJ0IGV2ZW50LgorCisyMDEyLTEwLTE4IDEwOjM3OjM1ICswMjAwICBQaGlsaXBwIFphYmVsIDxwLnphYmVsQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBoYW5kbGUgRU5PREFUQSByZXR1cm4gdmFsdWUgZm9yIFZJRElPQ19FTlVNU1RECisJICBJbiBrZXJuZWwgdjMuNy1yYzEsIFZJRElPQ19FTlVNU1REIHJldHVybnMgRU5PREFUQSBpZiB0aGUgY3VycmVudCBpbnB1dAorCSAgZG9lcyBub3Qgc3VwcG9ydCB0aGUgU1REIEFQSS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTg4MjcKKworMjAxMy0wNC0yNSAxMzoxOTozNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBidnBheS5jOgorCSAgZG9jczogYWRkIHNvbWUgcGF5L2RlcGF5bG9hZGVycworCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD01NTE2MzEKKworMjAxMy0wNC0yNSAxMjo0NDoxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWxhd2VuYy5jOgorCSAgbXVsYXc6IFNvbWUgbWlub3IgbWVtbGVhayBmaXhlcyBhbmQgY2xlYW51cAorCisyMDEzLTA0LTI0IDEzOjU2OjU2ICswMjAwICBBbGV4YW5kZXIgU2NocmFiIDxhbGV4YXNAYXhpcy5jb20+CisKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5oOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWxhd2VuYy5jOgorCSAgbXVsYXdlbmM6IGNoYW5nZSB0byBnc3RhdWRpb2VuY29kZXIgYmFzZSwgYWRkZWQgYml0cmF0ZSB0YWdzCisKKzIwMTItMDUtMDMgMTY6MDc6MjcgKzAyMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMjogYnVmZmVycG9vbDogcmVzZXQgYnVmZmVyIHNpemUgaW4gcmVsZWFzZV9idWZmZXIKKwkgIFRoZSBidWZmZXIgbWlnaHQgc3RpbGwgYmUgaW4gdXNlIGVsc2V3aGVyZSB3aGVuIGRlcXVldWluZyBidWZmZXJzIGZvcgorCSAgb3V0cHV0cy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTg4MjIKKworMjAxMi0wNC0yMCAwOTo1MzozNSArMDIwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBidWZmZXJwb29sOiByZW1vdmUgdW51c2VkIGluY2x1ZGVzCisJICBUaGUgaGFja3MgdGhhdCBuZWVkZWQgdGhlc2UgYXJlIGxvbmcgZ29uZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTg4MjEKKworMjAxMy0wNC0yNSAxMjoxMjoyMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSAgKG11bHRpKXVkcHNpbms6IFVzZSBzZXBhcmF0ZSBzb2NrZXRzIGZvciBJUHY0IGFuZCBJUHY2CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTM0MjQzCisKKzIwMTMtMDQtMjUgMTA6NDQ6NDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5oOgorCSAgZHludWRwc2luazogVXNlIHNlcGFyYXRlIHNvY2tldHMgZm9yIElQdjQgYW5kIElQdjYKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD01MzQyNDMKKworMjAxMy0wNC0yNSAxMDo0Mzo1NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvTWFrZWZpbGUuYW06CisJICB1ZHA6IERvbid0IGluY2x1ZGUgcmVtb3ZlZCBnc3R1ZHAuaCBpbiBub2luc3RfSEVBREVSUworCisyMDEzLTA0LTE3IDE2OjQ3OjMxIC0wNzAwICBUb2RkIEFndWxuaWNrIDx0b2RkQGFndWxuaWNrLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSAgb3N4YXVkaW86IFVzZSBnc3RfYXVkaW9fY2hhbm5lbF9wb3NpdGlvbnNfdG9fbWFzaygpIHRvIGNyZWF0ZSBtYXNrCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk4ODA3CisKKzIwMTMtMDQtMTcgMTY6MTI6MjYgLTA3MDAgIFRvZGQgQWd1bG5pY2sgPHRvZGRAYWd1bG5pY2suY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJICBvc3hhdWRpbzogUmVtb3ZlIHVudXNlZCBjb2RlCisKKzIwMTMtMDQtMjUgMDk6MTY6MTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmg6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSogZ3N0L3VkcC9nc3R1ZHAuaDoKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5oOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwkgIHVkcDogUmVtb3ZlIHVudXNlZCBlbnVtIHR5cGUKKworMjAxMy0wNC0yNSAwOToxMzo1MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvTWFrZWZpbGUuYW06CisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcC1tYXJzaGFsLmxpc3Q6CisJICB1ZHA6IFVzZSB0aGUgZ2VuZXJpYyBtYXJzaGFsbGVyIGluc3RlYWQgb2YgZ2VuZXJhdGluZyBtYXJzaGFsbGVycworCisyMDEzLTA0LTI1IDA5OjA3OjQxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmg6CisJICB1ZHBzcmM6IFJlbmFtZSBpbnN0YW5jZSB2YXJpYWJsZSBmcm9tIGhvc3QgdG8gbXVsdGlfZ3JvdXAKKwkgIFRoaXMgaXMgbW9yZSBjb25zaXN0ZW50IGFzIGl0J3MgdXNlZCBmb3IgdGhlIG11bHRpY2FzdC1ncm91cCBwcm9wZXJ0eS4KKworMjAxMy0wNC0yNSAwOTowMzo1NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IEFkZCBiaW5kLWFkZHJlc3MgcHJvcGVydHkKKwkgIFRoaXMgaXMgZXF1aXZhbGVudCB0byBtdWx0aWNhc3QtZ3JvdXAgY3VycmVudGx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKwkgIEluIDIuMCB0aGlzIHNob3VsZCBiZSBoYW5kbGVkIHNlcGFyYXRlbHksIHRoZSBmb3JtZXIgb25seSBiZWluZyB0aGUgbXVsdGljYXN0CisJICBncm91cCBhbmQgdGhlIGxhdHRlciBhbHdheXMgYmVpbmcgdGhlIGFkZHJlc3MgdGhlIHNvY2tldCBpcyBib3VuZCB0bywgZXZlbiBpZgorCSAgYSBtdWx0aWNhc3QgZ3JvdXAgaXMgZ2l2ZW4uCisKKzIwMTMtMDQtMjQgMTY6MjQ6MjUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJICB2cmF3ZGVwYXk6IHJldHVybiBvdXRwdXQgYnVmZmVyIGZyb20gcHJvY2VzcworCSAgUmV0dXJuIHRoZSBvdXRwdXQgYnVmZmVyIGZyb20gdGhlIHByb2Nlc3MgZnVuY3Rpb24gaW5zdGVhZCBvZiBwdXNoaW5nCisJICBpdCBvdXJzZWx2ZXMuIFRoaXMgd2F5LCB0aGUgc3ViY2xhc3MgY2FuIGFjdHVhbGx5IGRlYWwgd2l0aCB0aGUgcmV0dXJuCisJICB2YWx1ZSBvZiB0aGUgcHVzaC4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTM3MjcKKworMjAxMi0xMC0wMSAwOToyOToyMSAtMDMwMCAgRGlvZ28gQ2FyYm9uZXJhIEx1dml6b24gPGRpb2dvLmx1dml6b25AZW5zaXRlYy5jb20uYnI+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IHNhdmUgdGhlIGZvcm1hdCBjb3JyZWN0bHkKKwkgIElmIFRSWV9GTVQgaXMgbm90IGltcGxlbWVudGVkLCAgZ3N0X3Y0bDJfb2JqZWN0X2dldF9uZWFyZXN0X3NpemUgd2lsbAorCSAgdXNlIFNfRk1UIGFuZCB3aWxsIGNoYW5nZSB0aGUgZGV2aWNlJ3Mgb3BlcmF0aW9uIG1vZGUuIFRvIHNhdmUgdGhlCisJICBvbGQgZGV2aWNlIG1vZGUgd2UgbmVlZCB0byBzZXQgdGhlIHR5cGUgZmllbGQgb3IgZWxzZSBpdCB3aWxsIGZhaWwKKwkgIHRvIHNhdmUgdGhlIHByZXZpb3VzIGZvcm1hdC4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODUyMDkKKworMjAxMy0wNC0yNCAxNTozODo1MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBidmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVkZXBheS5jOgorCSAgcnRwOiBhIG1hcmtlciBiaXQgc2hvdWxkIHRyYW5zbGF0ZSB0byBSRVNZTkMKKwkgIEEgbWFya2VyIGJpdCBvbiBhbiBhdWRpbyBwYWNrZXQgZG9lcyBub3QgbWVhbiBhIERJU0NPTlQgKGluIHRoZSBHU3RyZWFtZXIgc2Vuc2UKKwkgIG9mIG1pc3NpbmcgZGF0YSkgYnV0IGl0IG1lYW5zIHRoYXQgdGhlIHBhY2tldCBpcyB0aGUgZW5kIG9mIGEgdGFsa3NwdXJ0IGFuZCB0aHVzCisJICBhIGdvb2Qgb3Bwb3J0dW5pdHkgdG8gcmVzeW5jIHRvIHRoZSBjbG9jay4gVXNlIHRoZSBSRVNZTkMgYnVmZmVyIGZsYWcgdG8gbm90ZQorCSAgdGhpcy4KKwkgIFJlYWwgZGlzY29udGludWl0aWVzIGFyZSBtYXJrZWQgd2l0aCBESVNDT05UIHN0aWxsIHdoZW4gdGhlIHNlcW51bSBoYXMgYSBHQVAgb3IKKwkgIHdoZW4gdGhlIGlucHV0IGJ1ZmZlciBoYXMgdGhlIERJU0NPTlQgZmxhZyBzZXQuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjI3MjA0CisKKzIwMTMtMDQtMjIgMjM6NTE6MzggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIE1BSU5UQUlORVJTOgorCSogUkVBRE1FOgorCSogUkVBRE1FLnN0YXRpYy1saW5raW5nOgorCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDNjYjNkM2MgdG8gNWVkY2Q4NQorCisyMDEzLTA0LTIyIDEwOjE5OjI5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkgIHJ0cGpwZWdkZXBheTogRHJvcCBmcmFtZSBpZiBpdCdzIGxlc3MgdGhhbiAyIGJ5dGVzIGxhcmdlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc3NTYwCisKKzIwMTMtMDQtMTggMTI6MjA6MDggKzAzMDAgIFNyZWVyZW5qIEJhbGFjaGFuZHJhbiA8c3JlZXJlbmouYmFsYWNoYW5kcmFuQGludGVsLmNvbT4KKworCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkgIGF1dG9kZXRlY3Q6IHVzZSBfcGx1Z2luX2ZlYXR1cmVfcmFua19jb21wYXJlIEFQSSBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIHRoZSBjb2RlLgorCisyMDEzLTA0LTE4IDA5OjM3OjMwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5oOgorCSAgb3N4YXVkaW86IEluY2x1ZGUgZ3N0YXVkaW9yaW5nYnVmZmVyLmggdG8gZml4IGNvbXBpbGF0aW9uIGluIDEuMAorCisyMDEzLTA0LTE3IDIxOjA1OjE0ICswMjAwICBQaGlsaXBwZSBOb3JtYW5kIDxwaGlsbkBpZ2FsaWEuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJICBvc3hhdWRpb3Npbms6IGNoYW5uZWwtbWFzayBjb25maWd1cmF0aW9uIGZpeGVzCisJICBTZXQgY2hhbm5lbC1tYXNrIGFjY29yZGluZyB0byBzaW5rJ3MgbGF5b3V0IGluIGNhc2Ugb2Ygc3RlcmVvIGxheW91dC4KKwkgIEFsc28gaW5pdGlhbGl6ZSBhbmQgcmVzZXQgdGhlIG1hc2sgd2hlbiBhbiB1bnJlY29nbml6ZWQgY2hhbm5lbCBpcyBkZXRlY3RlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTgyMjQKKworMjAxMy0wNC0xNSAxOTo1MzoyOCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMnNyYzogRGlzYWJsZSByZW5lZ290aWF0aW9uIGluIHRoZSBuZWdvdGlhdGUgbWV0aG9kCisJICBUaGlzIHdheSwgd2UgZG9uJ3QgYmxvY2sgdGhlIGluaXRpYWwgbmVnb3RpYXRpb24uCisJICBUaGFua3MgdG8gSmVyZW15IFdoaXRpbmcgZm9yIGRvaW5nIGFsbCB0aGUgdGVzdGluZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU5ODEKKworMjAxMy0wNC0xNSAxOTo0NjoxMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgUmV2ZXJ0ICJ2NGwyOiBkaXNhYmxlIHJlbmVnb3RpYXRpb24iCisJICBUaGlzIHJldmVydHMgY29tbWl0IGQxYjI2ZTFkNTk0YWIyYjYzMzI0ZTQzYTM2MzMwNDc1ZTk4Y2RmMTguCisJICBUaGlzIGNhdXNlcyB0aGUgaW5pdGlhbCBuZWdvdGlhdGlvbiB0byBuZXZlciBoYXBwZW4gaWYgYSByZWNvbmZpZ3VyZQorCSAgZXZlbnQgaXMgcmVjZWl2ZWQgYWZ0ZXIgZ3N0X2Jhc2Vfc3JjX3N0YXJ0X2NvbXBsZXRlKCkgYnV0IGJlZm9yZSB0aGUgbG9vcAorCSAgc3RhcnRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTk4MQorCisyMDEzLTA0LTE3IDIxOjEyOjU1ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvZmxhYy9nc3RmbGFjdGFnLmM6CisJICBmbGFjdGFnOiBmb3J3YXJkIGNhcHMgZXZlbnQKKwkgIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBkb3duc3RyZWFtIGVsZW1lbnQgd2lsbCBnZXQgdGhlIGV2ZW50IGFuZCBuZWdvdGlhdGVzLiBBZGQKKwkgIGEgRklYTUUgZm9yIHVwZGF0aW5nIHRoZSBzdHJlYW1oZWFkZXIgZmllbGQgb24gdGggY2Fwcy4KKworMjAxMy0wNC0xNyAwNzo1MDoyNyArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOgorCSAgZmxhYzogYWRkIG1vcmUgbG9nZ2luZworCisyMDEzLTA0LTE3IDIwOjI0OjQ4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2NvbW1vbi5oOgorCSAgb3N4YXVkaW86IEZpeCBtZXJnZSBjb25mbGljdHMKKworMjAxMy0wNC0xNyAxMDoxMDo0NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIG9zeGF1ZGlvOiBGaXggY29uZmlndXJlIGNoZWNrIGZvciBvc3hhdWRpbyBwbHVnaW4KKworMjAxMy0wNC0xNyAwOTo1MDo0MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3JpbmdidWZmZXIuYzoKKwkgIG9zeGF1ZGlvcmluZ2J1ZmZlcjogRmlyc3QgY2hlY2sgdGhlIHR5cGUsIHRoZW4gY2FzdAorCisyMDEzLTA0LTE2IDIyOjQ2OjAwICswOTAwICBUYWthc2hpIE5ha2FqaW1hIDx0ZWQubmFrYWppbWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9yaW5nYnVmZmVyLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmg6CisJICBvc3hhdWRpbzogdXNlIEdTVF9JU19PU1hfQVVESU9fU0lOSyBpbiByaW5nIGJ1ZmZlci4KKworMjAxMy0wNC0xMCAyMTowNjoxNiArMDkwMCAgVGFrYXNoaSBOYWthamltYSA8dGVkLm5ha2FqaW1hQGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5oOgorCSAgb3N4YXVkaW86IGNhbGwgc2V0X2NoYW5uZWxfcG9zaXRpb25zKCkgaW4gb3N4YXVkaW9yaW5nYnVmZmVyIGFjcXVpcmUoKQorCisyMDEzLTA0LTEyIDEyOjE4OjA0IC0wNzAwICBUb2RkIEFndWxuaWNrIDx0b2RkQGFndWxuaWNrLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5jOgorCSAgb3N4YXVkaW86IHVzZSBHU1RfQVVESU9fSU5GT18qIGFjY2Vzc29ycworCSAgQ2hhbmdlcyBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6CisJICAqIFVwZGF0ZSBjbGFzc25hbWUgcmVmZXJlbmNlcworCSAgKiBSZXBsYWNlIEdTVF9CT0lMRVJQTEFURV9GVUxMIHdpdGggR19ERUZJTkVfVFlQRQorCSAgKiBVc2UgbmV3IEdzdEF1ZGlvSW5mbyBzdHJ1Y3QgYW5kIG1ldGhvZHMKKwkgICogVXNlIG5ldyBidWZmZXIgbWVtb3J5IGFsbG9jYXRpb24gc2NoZW1lCisJICBDb25mbGljdHM6CisJICBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9yaW5nYnVmZmVyLmMKKworMjAxMy0wNC0xMiAxMTo1MTo0NiAtMDcwMCAgVG9kZCBBZ3VsbmljayA8dG9kZEBhZ3Vsbmljay5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9oYWwuYzoKKwkgIG9zeGF1ZGlvOiBhZGp1c3QgZm9yIGNoYW5nZXMgdG8gZ2xpYiBtdXRleCBhcGkuCisKKzIwMTMtMDQtMTAgMDE6MjE6NDkgKzA5MDAgIFRha2FzaGkgTmFrYWppbWEgPHRlZC5uYWthamltYUBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSAgb3N4YXVkaW86IHRyeSB0byBmaXggdXAgYWNjb3JkaW5nIHRvIFNlYmFzdGlhbidzIGNvbW1lbnRzCisKKzIwMTMtMDQtMDUgMTA6MDI6MzggKzAyMDAgIFBoaWxpcHBlIE5vcm1hbmQgPHBoaWxuQGlnYWxpYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3JpbmdidWZmZXIuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5oOgorCSAgb3N4YXVkaW86IGJ1aWxkIGZpeGVzCisJICBFbmFibGUgdGhlIG9zeGF1ZGlvIHBsdWdpbiBidWlsZCBpbiBjb25maWd1cmUuYWMgYW5kIGZpeCBzb21lCisJICBpbmNsdWRlIGRpcmVjdGl2ZSBvcmRlciBpc3N1ZXMuCisKKzIwMTMtMDQtMDIgMjI6Mjg6MDkgKzA5MDAgIHRlZC1uIDx0ZWQubmFrYWppbWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkgIG9zeGF1ZGlvOiBmaXggbGF5b3V0IGZvciBvc3hhdWRpb3NyYworCisyMDEzLTAzLTMwIDIyOjQ5OjM0ICswOTAwICB0ZWQtbiA8dGVkLm5ha2FqaW1hQGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL01ha2VmaWxlLmFtOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvZWxlbWVudC5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uaDoKKwkgIG9zeGF1ZGlvOiBwb3J0IHRvIHYuMS4wCisKKzIwMTMtMDQtMTYgMTk6Mjk6NDggLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBEb24ndCB1bnJlZiBxdWVyeSwgd2UgZG9uJ3Qgb3duIGl0CisJICBGaXhlcyBkb3VibGUtdW5yZWYgYnVnLiBCdWcgZm91bmQgYnkgWW91bmVzcyBBbGFvdWkKKworMjAxMy0wNC0xNiAyMDo0MToxMCArMDIwMCAgUGhpbGlwcGUgTm9ybWFuZCA8cGhpbG5AaWdhbGlhLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBmaXggU0NIRURVTElORyBxdWVyeSBzdXBwb3J0CisJICBDaGFpbiB0aGUgcXVlcnkgdXAgdG8gcGFyZW50IGJlZm9yZSBhZGRpbmcgX0JBTkRXSURUSF9MSU1JVEVEIGZsYWcsCisJICBzbyB0aGF0IGFsbCB0aGUgb3RoZXIgZmxhZ3MgZ2V0IHNldCwgYW5kIHB1c2ggbW9kZSBnZXRzIGFkZGVkIGFzCisJICBzdXBwb3J0ZWQgYWN0aXZhdGlvbiBtb2RlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MzQ4NAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5ODE1NgorCisyMDEzLTAzLTMxIDEyOjA1OjQ5ICswMjAwICBQaGlsaXBwZSBOb3JtYW5kIDxwaGlsbkBpZ2FsaWEuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IGJhc2ljIHNjaGVkdWxpbmcgcXVlcnkgc3VwcG9ydAorCSAgQW5zd2VyIHRvIHNjaGVkdWxpbmcgcXVlcmllcyB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycyBhbmQgdGhlIG5ldworCSAgX0JBTkRXSURUSF9MSU1JVEVEX0ZMQUcgc28gdGhhdCBkb3duc3RyZWFtIGlzIGFkdmlzZWQgdG8gbWluaW1pemUgc2VlaworCSAgb3BlcmF0aW9ucyBhbmQgcGVyZm9ybSBvbi1kaXNrIGJ1ZmZlcmluZyBpZiBwb3NzaWJsZS4KKwkgIEJ1ZyA2OTM0ODQKKworMjAxMy0wNC0xNSAxNDozMjo0NiArMDAwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiBmaXggc2VnZmF1bHQgYWNjZXNzaW5nIG9zeHdpbmRvdyB3aGVuIG5vdCBzZXQgeWV0CisKKzIwMTItMTAtMjQgMTI6MTQ6NTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvYWFsaWIvTWFrZWZpbGUuYW06CisJKiBleHQvY2Fpcm8vTWFrZWZpbGUuYW06CisJKiBleHQvZHYvTWFrZWZpbGUuYW06CisJKiBleHQvZmxhYy9NYWtlZmlsZS5hbToKKwkqIGV4dC9nZGtfcGl4YnVmL01ha2VmaWxlLmFtOgorCSogZXh0L2phY2svTWFrZWZpbGUuYW06CisJKiBleHQvanBlZy9NYWtlZmlsZS5hbToKKwkqIGV4dC9saWJjYWNhL01ha2VmaWxlLmFtOgorCSogZXh0L2xpYnBuZy9NYWtlZmlsZS5hbToKKwkqIGV4dC9taWttb2QvTWFrZWZpbGUuYW06CisJKiBleHQvcHVsc2UvTWFrZWZpbGUuYW06CisJKiBleHQvcmF3MTM5NC9NYWtlZmlsZS5hbToKKwkqIGV4dC9zaG91dDIvTWFrZWZpbGUuYW06CisJKiBleHQvc291cC9NYWtlZmlsZS5hbToKKwkqIGV4dC9zcGVleC9NYWtlZmlsZS5hbToKKwkqIGV4dC90YWdsaWIvTWFrZWZpbGUuYW06CisJKiBleHQvdnB4L01ha2VmaWxlLmFtOgorCSogZXh0L3dhdnBhY2svTWFrZWZpbGUuYW06CisJKiBnc3QvYWxwaGEvTWFrZWZpbGUuYW06CisJKiBnc3QvYXBldGFnL01ha2VmaWxlLmFtOgorCSogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVkaW9wYXJzZXJzL01ha2VmaWxlLmFtOgorCSogZ3N0L2F1cGFyc2UvTWFrZWZpbGUuYW06CisJKiBnc3QvYXV0b2RldGVjdC9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdmkvTWFrZWZpbGUuYW06CisJKiBnc3QvY3V0dGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L2RlYnVndXRpbHMvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUuYW06CisJKiBnc3QvZHRtZi9NYWtlZmlsZS5hbToKKwkqIGdzdC9lZmZlY3R2L01ha2VmaWxlLmFtOgorCSogZ3N0L2VxdWFsaXplci9NYWtlZmlsZS5hbToKKwkqIGdzdC9mbHYvTWFrZWZpbGUuYW06CisJKiBnc3QvZmx4L01ha2VmaWxlLmFtOgorCSogZ3N0L2dvb20vTWFrZWZpbGUuYW06CisJKiBnc3QvZ29vbTJrMS9NYWtlZmlsZS5hbToKKwkqIGdzdC9pY3lkZW11eC9NYWtlZmlsZS5hbToKKwkqIGdzdC9pZDNkZW11eC9NYWtlZmlsZS5hbToKKwkqIGdzdC9pbWFnZWZyZWV6ZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9pbnRlcmxlYXZlL01ha2VmaWxlLmFtOgorCSogZ3N0L2lzb21wNC9NYWtlZmlsZS5hbToKKwkqIGdzdC9sYXcvTWFrZWZpbGUuYW06CisJKiBnc3QvbGV2ZWwvTWFrZWZpbGUuYW06CisJKiBnc3QvbWF0cm9za2EvTWFrZWZpbGUuYW06CisJKiBnc3QvbW9ub3Njb3BlL01ha2VmaWxlLmFtOgorCSogZ3N0L211bHRpZmlsZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9tdWx0aXBhcnQvTWFrZWZpbGUuYW06CisJKiBnc3QvcmVwbGF5Z2Fpbi9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwbWFuYWdlci9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHNwL01ha2VmaWxlLmFtOgorCSogZ3N0L3NoYXBld2lwZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9zbXB0ZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9zcGVjdHJ1bS9NYWtlZmlsZS5hbToKKwkqIGdzdC91ZHAvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9ib3gvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9jcm9wL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvZmlsdGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3Qvd2F2ZW5jL01ha2VmaWxlLmFtOgorCSogZ3N0L3dhdnBhcnNlL01ha2VmaWxlLmFtOgorCSogZ3N0L3k0bS9NYWtlZmlsZS5hbToKKwkqIHN5cy9kaXJlY3Rzb3VuZC9NYWtlZmlsZS5hbToKKwkqIHN5cy9vc3MvTWFrZWZpbGUuYW06CisJKiBzeXMvb3NzNC9NYWtlZmlsZS5hbToKKwkqIHN5cy9vc3hhdWRpby9NYWtlZmlsZS5hbToKKwkqIHN5cy9vc3h2aWRlby9NYWtlZmlsZS5hbToKKwkqIHN5cy9zdW5hdWRpby9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSogc3lzL3dhdmVmb3JtL01ha2VmaWxlLmFtOgorCSogc3lzL3hpbWFnZS9NYWtlZmlsZS5hbToKKwkgIGdzdDogQWRkIGJldHRlciBzdXBwb3J0IGZvciBzdGF0aWMgcGx1Z2lucworCisyMDEzLTA0LTEyIDE5OjI2OjExICswMDAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBnc3QvZ29vbTJrMS9NYWtlZmlsZS5hbToKKwkgIGdvb20yazE6IGZpeCBkdXBsaWNhdGVkIHN5bWJvbCB3aXRoIGdvb20KKworMjAxMy0wMy0xMCAxNzoxNzoxNyArMDAwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9lbGVtZW50LmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvY29tbW9uLmg6CisJICBvc3hhdWRpbzogRml4ZXMgZXJyb3I6ICJHU1RfTEVWRUxfREVGQVVMVCIgcmVkZWZpbmVkCisKKzIwMTMtMDMtMTAgMTc6Mjc6MzAgKzAwMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2hhbC5jOgorCSAgb3N4YXVkaW86IGZpeGVzIGltcGxpY2l0IGRlY2xhcmF0aW9uIG9mIGZ1bmN0aW9uICdnZXRwaWQnCisKKzIwMTMtMDQtMTQgMTc6NTU6MDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGF1dG9nZW4uc2g6CisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gYWVkODdhZSB0byAzY2IzZDNjCisKKzIwMTMtMDQtMTQgMTI6MzI6MDYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IGFkZCBiYWNrICJpcmFkaW8tbW9kZSIgcHJvcGVydHkgdG8gZGlzYWJsZSBzZW5kaW5nIG9mIGljZWNhc3QgcmVxdWVzdCBoZWFkZXJzCisJICBJbiAxLjAgd2Ugbm93IGFsd2F5cyBzZW5kIHRoZSBpY2VjYXN0IHJlcXVlc3QgaGVhZGVycyBieSBkZWZhdWx0LCB3aGljaAorCSAgbWFrZXMgdGhlIHNlcnZlciBzZW5kIGljZWNhc3RzIG1ldGFkYXRhIGluc2VydGVkIGludG8gdGhlIHN0cmVhbSBpZiBpdAorCSAgc3VwcG9ydHMgdGhhdC4gSG93ZXZlciwgdGhlcmUgYXJlIHNvbWUgdXNlIGNhc2VzIHdoZXJlIHRoaXMgaXMgbm90CisJICBkZXNpcmFibGUsIGxpa2Ugd2hlbiBqdXN0IHNhdmluZyBhIHJhZGlvIHN0cmVhbSB0byBkaXNrLCBzbyBhZGQgYmFjaworCSAgdGhlICJpcmFkaW8tbW9kZSIgcHJvcGVydHkgdG8gYWxsb3cgcGVvcGxlIHRvIGRpc2FibGUgdGhpcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTc5ODQKKworMjAxMy0wNC0xMiAxNjoxNjo0MSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkgIHJ0cDogcmVnaXN0ZXIgdGFnIGltYWdlIHR5cGVzCisJICBUaGUgcnRwZ3N0ZGVwYXkgbmVlZHMgdGhlIHR5cGUgdG8gYmUgYXZhaWxhYmxlIGluIG9yZGVyIHRvIGRlc2VyaWFsaXplIHRoZQorCSAgZXZlbnQuCisKKzIwMTMtMDQtMTIgMTY6MDg6NTggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkgIHJ0cGdzdGRlcGF5OiBoYW5kbGUgZXZlbnQgcGFyc2UgZmFpbHVyZXMgYmV0dGVyCisKKzIwMTMtMDQtMTEgMjI6MjU6MDUgKzAzMDAgIEFudG9uIEJlbGthIDxhbnRvbmJlbGthQGdtYWlsLmNvbT4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkgIHdhdmVuYzogYWRkIFRPQyBzZXR0ZXIgc3VwcG9ydAorCisyMDEzLTA0LTEyIDEyOjMxOjMwICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSAgd2F2ZW5jOiBzbWFsbCBjbGVhbnVwcyBmb3IgdG9jIGhhbmRsaW5nCisJICBEb24ndCBhZGQgZW1wdHkgbGFibC9ub3RlIGNodW5rcy4gQWx3YXlzIHBhc3MgaW5zdGFuY2UgYXMgdGhlIGZpcnN0IHBhcmFtLiBBZGQgbW9yZSBsb2dnaW5nLgorCisyMDEzLTA0LTEyIDEyOjU4OjUwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogUHJveHkgdGhlIG50cC1zeW5jIHByb3BlcnR5IG9mIHJ0cGJpbgorCisyMDEzLTA0LTEyIDEyOjUxOjA1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogR2l2ZSB0aGUgbWFuYWdlciBhbHdheXMgdGhlIG5hbWUgIm1hbmFnZXIiCisJICBUaGlzIGFsbG93cyB0byB1c2UgdGhlIEdzdENoaWxkUHJveHkgaW50ZXJmYWNlIHRvIGFkanVzdAorCSAgcHJvcGVydGllcyBvbiBpdC4KKworMjAxMy0wNC0xMSAyMjo1MzoyOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYWxwaGFjb2xvci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXBldjJtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM3YybXV4LmM6CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvZmxhY2RlYy5jOgorCSAgdGVzdHM6IGZpeCBzb21lIHByaW50ZiBmb3JtYXQgaXNzdWVzIGluIGRlYnVnIG1lc3NhZ2VzCisKKzIwMTMtMDQtMTEgMTk6Mjc6MTUgKzAzMDAgIEFudG9uIEJlbGthIDxhbnRvbmJlbGthQGdtYWlsLmNvbT4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmg6CisJICB3YXZlbmM6IGFkZCAnbm90ZScgY2h1bmsgc3VwcG9ydAorCisyMDEzLTA0LTExIDIwOjQ2OjI2ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGFkZCBhIGxpdHRsZSBtb3JlIGRvY3MgdG8gdGhlIGF1ZGlvY2xvY2sKKworMjAxMy0wNC0xMSAxNTowMDowNSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBhZGQgc3VwcG9ydCBmb3IgTmV0Q2xpZW50Q2xvY2sKKwkgIFdoZW4gdGhlIHNlcnZlciBzdWdnZXN0cyBhIEdzdE5ldFRpbWVQcm92aWRlciBpbiB0aGUgU0RQLCBzZXQgdXAgYQorCSAgR3N0TmV0Q2xpZW50Q2xvY2sgdGhhdCBzbGF2ZXMgdG8gdGhlIHJlbW90ZSBjbG9jayBhbmQgc3VnZ2VzdCB0aGlzIGNsb2NrIGluCisJICBwcm92aWRlX2Nsb2NrLgorCisyMDEzLTA0LTExIDE0OjU3OjExICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaDoKKwkgIHVkcHNpbms6IGF2b2lkIGFsbG9jIGFuZCBmcmVlIGluIHJlbmRlciBmdW5jdGlvbgorCSAgQXZvaWQgZG9pbmcgYWxsb2MgYW5kIGZyZWUgaW4gdGhlIHJlbmRlciBmdW5jdGlvbiBmb3IgZWFjaCBidWZmZXIuIEluc3RlYWQsCisJICBhbGxvY2F0ZSB0aGUgbmVlZGVkIGFycmF5cyBpbiBfaW5pdCBhbmQgdXNlIHRob3NlLgorCisyMDEzLTA0LTEwIDA4OjM2OjAwICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdmVwYXJzZTogcmVtb3ZlIHN1cGVyZmx1b3VzIGdfbGlzdF9maXJzdCgpIGNhbGxzCisJICBUaGUgdmFyaWFibGVzIGFscmVhZHkgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaXN0LgorCisyMDEzLTA0LTA5IDIzOjEzOjE4ICswMTAwICBBbmRyZWFzIEZlbmthcnQgPGFuZHJlYXMuZmVua2FydEBzdHJlYW11bmxpbWl0ZWQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHNiY2RlcGF5LmM6CisJICBydHBzYmNkZXBheTogZml4IHNiYyBmcmFtZSBsZW5ndGggY2FsY3VsYXRpb24gZm9yIG1vbm8gYW5kIHN0ZXJlbyBtb2RlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NzQ2MworCisyMDEzLTAzLTI1IDE0OjM1OjAyICswMzAwICBBbnRvbiBCZWxrYSA8YW50b25iZWxrYUBnbWFpbC5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICB3YXZwYXJzZTogYWRkICdub3RlJyBjaHVuayBzdXBwb3J0CisJICBBZGQgJ25vdGUnIGNodW5rIHN1cHBvcnQgaW4gVE9DIGFzIEdTVF9UQUdfQ09NTUVOVAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NjU0OQorCisyMDEzLTA0LTA4IDE3OjUzOjA5IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBjaGVjayB2YWx1ZSBpbnNpZGUgZW5kYSB0byBzZXQgZW5kaWFubmVzcworCisyMDEzLTA0LTA5IDIxOjAwOjEyICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMDRjN2ExZSB0byBhZWQ4N2FlCisKKzIwMTMtMDQtMDkgMTc6MzQ6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSAgaWN5ZGVtdXg6IGF2b2lkIGNvcHkgd2hlbiB3ZSBjYW4KKworMjAxMy0wNC0wOSAxNjo1MjoyMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIGdzdHBheTogdXNlIGJ1ZmZlcmxpc3QgdG8gYXZvaWQgbWVtY3B5CisKKzIwMTMtMDQtMDkgMTY6NTA6NTYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICB1ZHBzaW5rOiBpbXByb3ZlIGRlYnVnCisKKzIwMTMtMDQtMDkgMDA6Mjg6NTQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhcnNlLmM6CisJICB0ZXN0czogcmVmYWN0b3IgbmV3IHdhdnBhcnNlIHRlc3QgYSBsaXR0bGUKKwkgIFVzZSBmYWtlc3JjIGluc3RlYWQgb2YgZmlsZXNyYyB3aXRoIC9kZXYvbnVsbC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTY2ODQKKworMjAxMy0wNC0wOCAxMTozODozMyArMDIwMCAgQWxleGFuZGVyIFNjaHJhYiA8YWxleGFzQGF4aXMuY29tPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBlcnJvciBvdXQgaWYgd2UgcmVjZWl2ZSBlb3MgYmVmb3JlIGFueSB2YWxpZCBkYXRhCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk2Njg0CisKKzIwMTMtMDQtMDcgMDE6NDc6NTYgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IGZvcmNlIGRlaW50ZXJsYWNpbmcgaW4gImludGVybGFjZWQiIG1vZGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTc0NjcKKworMjAxMy0wNC0wNiAxMjo0NToyOCAtMDMwMCAgVGhpYmF1bHQgU2F1bmllciA8dGhpYmF1bHQuc2F1bmllckBjb2xsYWJvcmEuY29tPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmM6CisJICBnZGtwaXhidWZzaW5rOiBBZGQgdGltZXN0YW1wL3J1bm5pbmctdGltZS9zdHJlYW0tdGltZSB0byB0aGUgZW1pdGVkIG1lc3NhZ2UKKworMjAxMy0wNC0wNSAxNDozODo0MyArMDIwMCAgTmljb2xhIE11cmlubyA8bmljb2xhLm11cmlub0BnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjZGVwYXkuYzoKKwkgIHJ0cHNiY2RlcGF5OiBmaXggcHJpbnRmIGZvcm1hdCBjb21waWxlciB3YXJuaW5ncworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NzM0MworCisyMDEzLTA0LTA1IDA5OjM0OjIzICswMTAwICBUb2RkIEFndWxuaWNrIDx0b2RkQGFndWxuaWNrLmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW86IGluY2x1ZGUgcHRocmVhZC5oIHRvIGZpeCBjb21waWxlciB3YXJuaW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk3MzAzCisKKzIwMTMtMDQtMDQgMjI6NDg6NDUgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSogZ3N0L2xldmVsL2dzdGxldmVsLmg6CisJICBsZXZlbDogcmVzeW5jIG9uIGRpc2NvbnQKKwkgIERyb3AgcGVuZGluZyBkYXRhIG9uIGRpc2NvbnQgYW5kIHN0YXJ0IGEgbmV3IGN5Y2xlIHdpdGggYSBuZXcgYmFzZSB0aW1lc3RhbXAuCisJICBDbGVhbnVwIHNvbWUgdmFyaWFibGVzLgorCisyMDEzLTA0LTAzIDIzOjUyOjQ3ICswMTAwICBUb20gR3JlZW53b29kIDx0Z3JlZW53b29kQFRvbXMtTWFjQm9vay1Qcm8ubG9jYWw+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZGVjLmM6CisJICB2cDhkZWM6IEltcHJvdmUgbG9nZ2luZyB3aGVuIHZweF9jb2RlY19wZWVrX3N0cmVhbV9pbmZvIGZhaWxzCisJICBEZWNvZGUgZmFpbHVyZXMgYW5kIG1pc3Npbmcga2V5ZnJhbWVzIHNob3VsZCBnZXQgZGlmZmVyZW50IGRlYnVnCisJICBvdXRwdXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk3MjMyCisKKzIwMTMtMDQtMDMgMTg6MjQ6MjkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjZGVwYXkuYzoKKwkgIHJ0cHNiY2RlcGF5OiBSYW5rIGFzIHNlY29uZGFyeQorCSAgVGhpcyB3YXksIGl0IHdpbGwgYmUgc2VsZWN0ZWQgYnkgZGVjb2RlYmluCisJICBCdWcgcmVwb3J0ZWQgYnkgYW5kcmVhcy5mZW5rYXJ0QHN0cmVhbXVubGltaXRlZC5jb20KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTcyMjcKKworMjAxMy0wNC0wMyAxOTowNTozOCArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgbGV2ZWw6IHN1YmRpdmlkZSBidWZmZXJzIGZvciBzYW1wbGUgYWNjdXJhdGUgaW50ZXJ2YWwgaGFuZGxpbmcKKwkgIFByZXZpb3VzbHkgd2Ugd291bGQgc2tpcCBsZXZlbCBtZXNzYWdlIHdoZW4gcHJvY2Vzc2luZyBidWZmZXJzID4gdGhlIHJlcXVlc3RlZAorCSAgaW50ZXJ2YWwuIEFsc28gdGhlIG1lc3NhZ2UgZnJlcXVlbmN5IHdvdWxkIGNvbnRhaW4gcXVpdGUgc29tZSBqaXR0ZXIgZHVlIHRvIG9ubHkKKwkgIGNvbnNpZGVyaW5nIHRoZW0gYXQgdGhlIGVuZCBvZiBidWZmZXJzLgorCSAgQ2xlYW51cCB0aGUgdGVzdHMgd2hpbGUgd2UncmUgYXQgaXQuCisKKzIwMTMtMDMtMTkgMDg6MjM6MjUgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IHJlbW92ZSBvbGQgc2luY2UgY29tbWVudHMgYW5kIHVwZGF0ZSBsb2dnaW5nCisJICBEb24ndCBwcmV0ZW5kIHRoYXQgd2UgaGF2ZSBhIHRpbWVzdGFtcCBvbiBhIGJ1ZmZlciB3aGVuIHdlIG5ldmVyIHNldCBvbmUuCisKKzIwMTMtMDMtMTggMjA6NTk6MjMgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IHJlbW92ZSBvbGQgc2luY2UgY29tbWVudAorCisyMDEzLTA0LTAzIDE3OjUzOjEzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogUHJveHkgdGhlIG11bHRpY2FzdC1pZmFjZSBwcm9wZXJ0eSBvZiB1ZHBzcmMKKworMjAxMy0wNC0wMyAxMTowOTo1MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGZyZWUgYWxsIHF1ZXVlZCBidWZmZXJzCisJICBEb24ndCBqdXN0IGxvb3Agb3ZlciB0aGUgZmlyc3QgbnVtX3F1ZXVlZCBidWZmZXJzIGJ1dCBsb29wIG92ZXIKKwkgIGFsbCB0aGUgYnVmZmVycyBhbmQgY2hlY2sgaWYgdGhleSBuZWVkIHRvIGJlIGZyZWVkLiBJdCBpcyBwb3NzaWJsZSB0aGF0CisJICBub3QgYWxsIGJ1ZmZlcnMgYXJlIHF1ZXVlZCBhbmQgdGhlbiB0aGUgZW50cnkgaW4gb3VyIGFycmF5IHdpbGwgYmUgTlVMTC4KKwkgIFRob3NlIGJ1ZmZlcnMgdGhhdCBhcmUgbm90IHF1ZXVlZCB3ZXJlIGZyZWVkIGluIHN0b3AoKS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTY2NTEKKworMjAxMy0wNC0wMyAxMTowOTozNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGltcHJvdmUgZGVidWcKKworMjAxMy0wNC0wMiAyMzo0MjoyMyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICBydHBzc3JjZGVtdXg6IE9ubHkgZm9yd2FyZCBzdGljayBldmVudHMgd2hpbGUgaG9sZGluZyB0aGUgc2lua3BhZCBzdHJlYW0gbG9jaworCSAgT3RoZXJ3aXNlIHdlIGdldCBhIHJhY2Ugd2hlcmUgaWYgdGhlIFJUQ1AgcGFja2V0IGNvbWVzIGluIGZpcnN0IGFuZCB3aGlsZQorCSAgaXQgaXMgYWRkZWQgdGhlIHBhZHMsIHRoZSBzZWdtZW50IGV2ZW50IGFycml2ZXMgb24gdGhlIFJUUCBzdHJlYW0sIHRoZSBldmVudAorCSAgbWF5IGJlIGxvc3QgY29tcGxldGVseSBhbmQgbmV2ZXIgZm9yd2FyZGVkLgorCisyMDEzLTA0LTAyIDIzOjM1OjA2IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHJ0cHNzcmNkZW11eDogTm8gbmVlZCB0byBleHBsaWNpdGVseSBmb3J3YXJkIHRoZSBjYXBzCisJICBUaGV5IGFyZSBmb3J3YXJkZWQgd2l0aCB0aGUgb3RoZXIgZXZlbnRzCisKKzIwMTMtMDQtMDIgMjI6Mjk6MzggLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4Lmg6CisJICBydHBzc3JjZGVtdXg6IFJlbW92ZSB1bnVzZWQgR3N0U2VnbWVudAorCisyMDEzLTA0LTAyIDIyOjI2OjAyIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHJ0cHNzcmNkZW11eDogU2ltcGxpZnkgZXZlbnQgZm9yd2FyZGluZworCSAgVXNlIHRoZSBnc3RfcGFkX2ZvcndhcmQoKSBtZWNoYW5pYywgdGhpcyB3YXkgd2Ugd29uJ3QgbWlzcyBwYWRzIHRoYXQgYXJlCisJICBhZGRlZCB3aGlsZSB3ZSBhcmUgcHVzaGluZworCisyMDEzLTA0LTAyIDIxOjUzOjEwIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHJ0cHNzcmNkZW11eDogRG9uJ3QgY3Jvc3MgdGhlIGludGVybmFsIGxpbmtzCisJICBXZSBoYWQgdGhlIHdyb25nIGNvbmRpdGlvbiB0byBjaGVjayBmb3IgdGhlIGludGVybmFsIGxpbmtzLCBzbyBSVFAgYW5kIFJUQ1AKKwkgIHBhZHMgZ290IGNyb3NzZWQhCisKKzIwMTMtMDMtMzEgMTc6NTQ6MTYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogZml4IHNvbWUgZGVidWcgbWVzc2FnZXMKKworMjAxMy0wNC0wMiAyMzozNjoyMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSAgdjRsMjogZml4IHByaW50ZiBmb3JtYXQgY29tcGlsZXIgd2FybmluZyBpbiBkZWJ1ZyBtZXNzYWdlCisKKzIwMTItMDgtMjkgMTc6MjQ6MDAgKzAyMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIG1hdHJvc2thZGVtdXg6IGhhbmRsZSBUcnVlSEQgYXVkaW8gY29kZWMgaWQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTcxMTMKKworMjAxMy0wMy0zMSAxOToxNDowNCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSAgdGhlb3JhcGF5OiBhZGQgZGVsdGEtdW5pdCB0byBvdXRwdXQgZnJhbWVzCisKKzIwMTMtMDMtMjMgMDU6MjI6MjMgKzAxMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiB1c2UgdGltZXN0YW1wIGRlbHRhIGFzIGR1cmF0aW9uIGlmIHBvc3NpYmxlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk2NDM3CisKKzIwMTMtMDMtMzAgMDk6NDQ6NDEgKzAxMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBzYmNkZXBheS5jOgorCSAgcnRwOiBmaXhlcyBkZWJ1ZyBtZXNzYWdlIHByaW50ZiByZWxhdGVkIGNvbXBpbGVyIHdhcm5pbmdzIGluIFNCQyBkZXBheWxvYWRlcgorCisyMDEzLTAzLTI4IDE2OjQ2OjM2ICswMDAwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY2RlcGF5Lmg6CisJICBydHA6IEFkZCBhbiBydHBzYmNkZXBheSBlbGVtZW50CisJICBQcmV0dHkgc3RyYWlnaHRmb3J3YXJkIC0gdGFrZXMgU0JDIGVuY2Fwc3VsYXRlZCBpbiBSVFAsIGRlcGF5bG9hZHMsIGFuZAorCSAgcHVzaGVzIG91dCBTQkMgYnVmZmVycy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTA1ODIKKworMjAxMy0wMy0yNyAyMjoxODozNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L3J0cC9nc3RydHBzYmNwYXkuYzoKKwkgIHJ0cDogZml4IFNCQyBwYXlsb2FkZXIKKwkgIEluaXQgUlRQIGJ1ZmZlciBvbiBzdGFjayBjb3JyZWN0bHksIHNvIG1hcHBpbmcgaXQgd29ya3MKKwkgIHdpdGhvdXQgY3JpdGljYWxzIGFuZCB0aGUgcGF5bG9hZGVyIGFjdHVhbGx5IHdvcmtzLgorCisyMDEzLTAzLTI2IDE0OjQ0OjM2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgZGlyZWN0c291bmRzaW5rOiBDaGVjayBmb3IgYSBzdWJzZXQgaW5zdGVhZCBvZiBub24tZW1wdHkgaW50ZXJzZWN0aW9uIGluIGFjY2VwdC1jYXBzCisKKzIwMTMtMDMtMjYgMTQ6Mzk6NTMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBkaXJlY3Rzb3VuZHNpbms6IFByb3Blcmx5IGhhbmRsZSB0aGUgZmlsdGVyIGNhcHMgaW4gZ2V0X2NhcHMoKQorCisyMDEzLTAzLTI2IDE0OjM1OjM4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgZGlyZWN0c291bmRzaW5rOiBEb24ndCB1bm5lY2Vzc2FyaWx5IGdldCB0aGUgcGFyZW50IGNsYXNzIGluIGNsYXNzX2luaXQKKwkgIFRoZSB0cmFtcG9saW5lIGdlbmVyYXRlZCBieSBHX0RFRklORV9UWVBFIGRvZXMgdGhhdCBhbHJlYWR5LgorCisyMDEzLTAzLTI1IDE4OjAyOjEwIC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIFVzZSAlMDN1IGZvciBmb3JtYXQgaW4gZ3N0X3BhZF9jcmVhdGVfc3RyZWFtX2lkX3ByaW50ZigpCisKKzIwMTMtMDMtMjUgMTA6MTI6MDMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmM6CisJICBjYXBzc2V0dGVyOiBQcmV2ZW50IHVubmVlZGVkIGNhcHMgY29weWluZyBhbmQgYWxsb2NhdGlvbgorCisyMDEzLTAyLTAxIDE0OjMzOjQxICswMTAwICBEaXJrIFZhbiBIYWVyZW5ib3JnaCA8dmhkaXJrQGdtYWlsLmNvbT4KKworCSogZ3N0L2RlYnVndXRpbHMvZ3N0Y2Fwc3NldHRlci5jOgorCSAgY2Fwc3NldHRlcjogUGFzcyBhbnkgb3IgZmlsdGVyIGNhcHMgdXBzdHJlYW0KKwkgIGNhcHNldHRlciBhY2NlcHRzIGFueXRoaW5nIGFuZCBqdXN0IGZvcndhcmRzIGRpZmZlcmVudCBjYXBzLAorCSAgYXMgc3VjaCBpdCBzaG91bGQgcmV0dXJuIEFOWSBjYXBzIG9uIHRoZSBzaW5rcGFkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MzAwNQorCisyMDEzLTAzLTA2IDEzOjE3OjU0ICswMDAwICBUb20gR3JlZW53b29kIDx0Z3JlZW53b29kQFRvbXMtTWFjQm9vay1Qcm8ubG9jYWw+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJICB2cDhlbmM6IEZpeCBmb3IgZGl2aWRlIGJ5IHplcm8gd2hlbiB1c2luZyAwLzEgZnJhbWVyYXRlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NzA5CisKKzIwMTMtMDMtMjQgMTc6NTU6NTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IGV4cG9zZSBDVUUgc2hlZXQgaXRlbXMgYXMgdHJhY2tzIG5vdCBjaGFwdGVyIGVudHJpZXMgaW4gVE9DCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc3MzA2CisKKzIwMTMtMDMtMjMgMTM6MTE6MDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IGFkZCBtb3JlIGV4YW1wbGUgcGlwZWxpbmVzCisKKzIwMTMtMDMtMjMgMTI6NTk6MjYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6CisJICB3YXZlbmM6IGFkZCBzb21lIGV4YW1wbGUgcGlwZWxpbmVzCisKKzIwMTMtMDMtMjAgMjE6Mzg6NDAgKzAzMDAgIEFudG9uIEJlbGthIDxhbnRvbmJlbGthQGdtYWlsLmNvbT4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmg6CisJICB3YXZlbmM6IGFkZCBUT0Mgc3VwcG9ydAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MDk5OAorCisyMDEzLTAzLTIzIDA0OjU2OjM2ICswMTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IG1ha2UgZW1wdHkgc3VidGl0bGUgYnVmZmVyIHJlY29nbml0aW9uIG1vcmUgcm9idXN0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk2MjQ0CisKKzIwMTMtMDMtMDQgMTU6NDk6MDYgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOgorCSAgcG5nZW5jOiB1bm1hcCBzb3VyY2UgZnJhbWUgd2hlbiBkb25lCisKKzIwMTMtMDMtMjIgMTU6MTQ6MTUgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogRml4IHRlc3QgcmVncmVzc2lvbiB3aXRoIG9uZSBidWZmZXIgc3RyZWFtcworCisyMDEzLTAzLTA1IDE3OjAwOjE3IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBzcGxpdCBsYXJnZSByYXcgYXVkaW8gc2FtcGxlcworCSAgSW4gb3JkZXIgdG8gZGVhbCB3aXRoIGEgZmlsZSB0aGF0IGhhcyBzYW1wbGVzIHRoYXQgYXJlIDI0IHNlY29uZHMKKwkgIGxvbmcuICBTZWVraW5nIHN0aWxsIGRvZXNuJ3Qgd29yayB3aXRoIHN1Y2ggZmlsZXMuCisKKzIwMTMtMDMtMjIgMTE6NTQ6MDggLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogUmVtb3ZlIGRvY3VtZW50YXRpb24gZm9yIGR0cy1tZXRob2QKKworMjAxMy0wMy0yMiAxMzoyNDozMyAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBkZXByZWNhdGUgZHRzLW1ldGhvZCBwcm9wZXJ0eQorCisyMDEzLTAzLTEzIDE3OjA4OjAzIC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IEZpeCBwcm9ibGVtcyBjYXVzaW5nIGJhZCBkdXJhdGlvbnMgaW4gZmlsZQorCSAgLSBGaXggdXAgb3V0LW9mLW9yZGVyIGluY29taW5nIERUUyB2YWx1ZXMuCisJICAtIEZpeCBkdXJhdGlvbiBvZiBpbml0aWFsIHNhbXBsZS4KKworMjAxMy0wMy0xMiAxOTowODoyNiAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBmaXggYWxsIHRpbWVzdGFtcHMgb25jZSBmaXJzdF90cyBpcyBkZXRlcm1pbmVkCisKKzIwMTMtMDItMTQgMTY6MzQ6MzQgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4Lmg6CisJICBxdG11eDogVXNlIFBUUy9EVFMgZnJvbSBpbmNvbWluZyBidWZmZXJzCisJICBSZW1vdmUgb2xkIERUUyBndWVzc2luZyBjb2RlLgorCisyMDEzLTAzLTE4IDEyOjMwOjUwICswMTAwICBOaWNvbGEgTXVyaW5vIDxuaWNvbGEubXVyaW5vQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eG1hcC5jOgorCSAgcXRtdXg6IGV4cG9zZSBtdWxhdyBjYXBzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk2MDUyCisKKzIwMTMtMDMtMjIgMTA6NTA6MzQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBSZXF1aXJlIE9yYyA+PSAwLjQuMTcKKwkgIE9yYyAwLjQuMTcgZml4ZXMgYSBidW5jaCBjcmFzaGVzIG9uIGkzODYgYW5kIFJQaSB3aGVuIG9yYworCSAgZnVuY3Rpb25zIGNhbid0IGJlIGNvbXBpbGVkIGFuZCB0aGUgZmFsbGJhY2sgZnVuY3Rpb24gaXMKKwkgIHN1cHBvc2VkIHRvIGJlIHVzZWQuIEFsc28gZml4ZXMgc29tZSBpc3N1ZXMgb24gUG93ZXJQQy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODQzOTkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTM4NjIKKworMjAxMy0wMy0yMiAwODo0NzoxNyArMDAwMCAgUm9kb2xmbyBTY2h1bHogZGUgTGltYSA8cm9kb2xmb0Byb2Rzb2Z0Lm9yZz4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggc2FtcGxlIGxlYWsgd2hlbiBwcm9jZXNzaW5nIHByaXZhdGUgcXQgdGFncworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NjM1NQorCisyMDEzLTAzLTIyIDAyOjI0OjAxICswMTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogc2V0IHN0cmVhbSBsYW5ndWFnZSBjb2RlIGZyb20gdGFnCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk2MzU4CisKKzIwMTMtMDMtMjEgMDI6NTU6MDYgKzAxMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogc2VuZCBHQVAgZXZlbnRzIGZvciBzdWJ0aXRsZSBzdHJlYW1zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk2MjQ0CisKKzIwMTMtMDMtMjEgMDI6NTM6MjQgKzAxMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogaWdub3JlIGVtcHR5IHN1YnRpdGxlIGJ1ZmZlcnMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTYyNDQKKworMjAxMy0wMy0yMSAwMjo1MjowNyArMDEwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZm91cmNjLmg6CisJICBxdGRlbXV4OiByZWNvZ25pemUgU0JUTCBzdWJ0eXBlIGZvciBzdWJ0aXRsZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTYyNDQKKworMjAxMy0wMy0xNyAxNjoyNzowMyArMDMwMCAgQW50b24gQmVsa2EgPGFudG9uYmVsa2FAZ21haWwuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBhZGQgc3VwcG9ydCBmb3IgdGhlIHRvYy1zZWxlY3QgZXZlbnQKKwkgIFNlbGVjdCB0cmFja3MgZnJvbSB0aGUgQ1VFIHNoZWV0IGJ5IHNlbmRpbmcgYSB0b2Mtc2VsZWN0CisJICBldmVudCBiYXNlZCBvbiB0aGUgdWlkIGluIHRoZSBUT0MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQwODkxCisKKzIwMTMtMDMtMTkgMTg6MDk6MzEgLTA3MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEByZGlvLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgbXA0bXV4OiBpbiBmYXN0c3RhcnQgbW9kZSwgZG9uJ3Qgb3V0cHV0IHVwIHRvIDQga0Igb2YgZ2FyYmFnZSBhdCB0aGUgZW5kLgorCisyMDEzLTAzLTIwIDAwOjM1OjE3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHNiY3BhcnNlLmM6CisJICBzYmNwYXJzZTogcGFjayBtdWx0aXBsZSBmcmFtZXMgaW50byBvbmUgb3V0cHV0IGJ1ZmZlcgorCSAgRG9uJ3Qgb3V0cHV0IGEgc2luZ2xlIGJ1ZmZlciBmb3IgZXZlcnkgdGlueSBTQkMgZnJhbWUKKworMjAxMy0wMy0xOCAxNDo1OTozNSArMDAwMCAgQmFzdGllbiBOb2NlcmEgPGhhZGVzc0BoYWRlc3MubmV0PgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBmaXggY29tcGlsYXRpb24gYWdhaW5zdCBuZXdlciBrZXJuZWwgaGVhZGVycyBhcyBvbiBGQzE5CisKKzIwMTMtMDMtMTQgMTQ6MTI6MDUgKzAxMDAgIEtpc2hvcmUgQXJlcGFsbGkgPGtpc2hvcmUuYXJlcGFsbGlAZ21haWwuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBmaXggaW5maW5pdGUgbG9vcCBvbiBFT1Mgd2l0aCBub24tZGVmYXVsdCBtZXRob2RzIG9yIGZpZWxkcworCSAgRml4ZXMgcHJvYmxlbSBvZiBpbmZpbml0ZSBsb29wIGluIGdzdF9kZWludGVybGFjZV9yZXNldF9oaXN0b3J5LgorCSAgTGFzdCBmaWVsZCBpbiB0aGUgaGlzdG9yeSB3YXMgbmV2ZXIgZGVpbnRlcmxhY2VkIGJlY2F1c2UgaWR4IGJlY29tZXMgbmVnYXRpdmUuCisJICBIYXBwZW5zIGUuZy4gd2l0aCBtZXRob2Q9c2NhbGVyYm9iIGZpZWxkcz1ib3R0b20gb3IKKwkgIG1ldGhvZD1ncmVlZHlsIGZpZWxkcz10b3AKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU2NDQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTMxNzMKKworMjAxMy0wMy0xMiAwOTo0ODozMSArMDAwMCAgS2lzaG9yZSBBcmVwYWxsaSA8a2lzaG9yZS5hcmVwYWxsaUBnbWFpbC5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJICBkdmRlbXV4OiBkb24ndCByZXR1cm4gRkFMU0Ugd2hlbiBkcm9wcGluZyBzaW5rIGV2ZW50cworCSAgRml4ZXMgcHJvYmxlbSBpbiBjb25qdW5jdGlvbiB3aXRoIGF2aWRlbXV4LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTY0MworCisyMDEzLTAzLTEyIDAwOjE2OjE4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBjaGFuZ2UgcmF3IHZpZGVvIGNhcHMgb3JkZXIgc28gdGhhdCBHUkFZOCBpcyBsYXN0CisJICBQZW9wbGUgbGlrZSBjb2xvdXJzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTU0MworCisyMDEzLTAzLTExIDE0OjUwOjQxICswMTAwICBPZ255YW4gVG9uY2hldiA8b2dueWFuQGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IERvbid0IHVzZSB1cHN0cmVhbSBjYXBzIHdpdGggcGVlcl9xdWVyeV9jYXBzICgpCisJICBDYWxsaW5nIGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzICgpIG9uIHRoZSBzcmMgcGFkIHdpdGggdGhlIGNhcHMKKwkgIHVwc3RyZWFtIGNhbiBwcm9kdWNlIGFzIGEgZmlsdGVyIGZyb20gZ3N0X3J0cF9oMjY0X3BheV9nZXRjYXBzICgpCisJICBpcyB3cm9uZyBhbmQgbWFrZXMgY2FwcyBuZWdvdGlhdGlvbiBmYWlsIGlmIHVwc3RyZWFtIGNhcHMgYXJlIG5vdAorCSAgTlVMTC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU2MjkKKworMjAxMy0wMy0xMCAwOToxMDoxOCArMDEwMCAgRGlyayBWYW4gSGFlcmVuYm9yZ2ggPHZoZGlya0BnbWFpbC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IHN1cHBvcnQgcmF3IEJHUgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTU0MworCisyMDEzLTAzLTEwIDA5OjI1OjM0ICswMTAwICBEaXJrIFZhbiBIYWVyZW5ib3JnaCA8dmhkaXJrQGdtYWlsLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHN1cHBvcnQgcmF3IHZpZGVvIHdpdGggbmVnYXRpdmUgaGVpZ2h0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NTQxCisKKzIwMTMtMDMtMDUgMTQ6NDA6NTYgKzAxMDAgIEpvbmFzIEhvbG1iZXJnIDxqb25hc2hnQGF4aXMuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdXRvZGV0ZWN0LmM6CisJICBhdXRvZGV0ZWN0IGNoZWNrdGVzdDogRG8gbm90IGZhaWwgd2l0aG91dCB2aWRlb3NpbmsKKwkgIElmIHRoZXJlIGlzIG5vIHZpZGVvc2luayBhdmFpbGFibGUgYXV0b3ZpZGVvc2luayB3aWxsIGNvbnRhaW4gYQorCSAgZmFrZXNpbmsgaW5zdGVhZCB3aGljaCBuZWVkcyBzcGVjaWFsIHRyZWF0bWVudCBpbiB0aGUgdW5pdCB0ZXN0LgorCisyMDEzLTAzLTA5IDAxOjE4OjMwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBBbmRyb2lkLm1rOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5zaWduYWxzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJKiBnc3QvZHRtZi9nc3RkdG1mLmM6CisJKiBnc3QvZHRtZi9nc3RkdG1mY29tbW9uLmg6CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJICBkdG1mOiBtb3ZlIGR0bWYgcGx1Z2luIGZyb20gLWJhZCB0byAtZ29vZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NzQxNgorCisyMDEzLTAzLTA5IDAwOjMwOjM4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBNZXJnZSBicmFuY2ggJ2R0bWYtbW92ZWQtZnJvbS1iYWQnCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg3NDE2CisKKzIwMTMtMDMtMDUgMjE6MjI6MTggKzAxMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHN5cy9vc3hhdWRpby9NYWtlZmlsZS5hbToKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2VsZW1lbnQuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9yZW1vdGVpby5jOgorCSAgb3N4YXVkaW86IGFkZCBzdXBwb3J0IGZvciBpT1MgdXNpbmcgdGhlIFJlbW90ZUlPIEF1ZGlvVW5pdAorCisyMDEzLTAzLTA1IDIxOjE3OjUyICswMTAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vTWFrZWZpbGUuYW06CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9oYWwuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hyaW5nYnVmZmVyLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4cmluZ2J1ZmZlci5oOgorCSAgb3N4YXVkaW86IGFkZCBhIGZhw6dhZGUgZm9yIHRoZSBDb3JlQXVkaW8gQVBJCisKKzIwMTMtMDMtMDcgMDA6MDA6NDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSAyZGUyMjFjIHRvIDA0YzdhMWUKKworMjAxMy0wMy0wMyAxMTo1OTozMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9sem8uYzoKKwkgIG1hdHJvc2thOiBJbmNsdWRlIGNvbmZpZy5oLCBpdCdzIG5lZWRlZCBmb3IgX3N0ZGludC5oCisKKzIwMTMtMDMtMDMgMTE6NTM6MDQgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBGaXggKHdyb25nKSB1c2Ugb2YgdW5pbml0aWFsaXplZCB2YXJpYWJsZSBjb21waWxlciB3YXJuaW5nCisKKzIwMTMtMDMtMDIgMTM6NTk6NTIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogYWRkIHZhcmlhbnQgZmllbGQgdG8gSC4yNjMgY2FwcworCSAgYXZkZWNfaDI2MyB3b24ndCBnZXQgcGx1Z2dlZCBvdGhlcndpc2UuCisKKzIwMTMtMDItMjIgMTk6MDY6NTIgKzAxMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHNraXAgZGlzYWJsZWQgdHJhY2tzCisJICBJU08vSUVDIDE0NDk2LTEyIHNwZWNpZmllcyBkaXNhYmxlZCB0cmFja3Mgc2hvdWxkIGJlIGNvbXBsZXRlbHkKKwkgIGlnbm9yZWQsIHNvIGp1c3QgZG8gaXQuCisJICBBdm9pZHMgZGVhZGxvY2sgZHVyaW5nIHByZXJvbGxpbmcgZm9yIHNvbWUgZmlsZXMuCisJICBBbHNvIHByZXZlbnRzICdjaGFwdGVyJyBzdWJ0aXRsZSB0cmFja3MgZnJvbSBzaG93aW5nIHVwLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5Mzk5MworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYyODc5MAorCisyMDEzLTAyLTI1IDA5OjU4OjEzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgdGVzdHM6IHJlLWFkZCBzdXBwcmVzc2lvbiBmb3IgR1ZhbHVlQXJyYXkgd2FybmluZ3MgdG8gdW5pdCB0ZXN0IGFzIHdlbGwKKworMjAxMy0wMi0yOCAxMzoyNTowNiArMDEwMCAgSm9uYXMgSG9sbWJlcmcgPGpvbmFzaGdAYXhpcy5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2R0bWYuYzoKKwkgIHRlc3RzOiB1c2UgcmVsYXRpdmUgaW5jbHVkZSBmb3Igb3V0LW9mLXRyZWUgYnVpbGRzIGluIGR0bWYgdGVzdAorCisyMDEzLTAyLTI4IDA4OjQ2OjU5ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgIHNwZWN0cnVtOiByZW1vdmUgdGhlIHNpbmNlIGRvYy1jb21tZW50IGZyb20gMC4xMAorCisyMDEzLTAyLTI4IDA4OjQ0OjE4ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5oOgorCSogdGVzdHMvZXhhbXBsZXMvbGV2ZWwvbGV2ZWwtZXhhbXBsZS5jOgorCSAgbGV2ZWw6IGFkZCBhICJwb3N0LW1lc3NhZ2VzIiBwcm9wZXJ0eSBhbmQgZGVwcmVjYXRlICJtZXNzYWdlIgorCSAgSW4gc3BlY3RydW0gdGhpcyB3YXMgY2hhbmdlZCBmcm9tIDAuMTAgdG8gMS4wLCBsZXRzIGRvIHRoaXMgaGVyZSB0b28uCisKKzIwMTMtMDItMjcgMTg6NTY6NTAgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2R0bWYuYzoKKwkgIHRlc3RzOiBBZGQgdGVzdHMgZm9yIGR0bWZzcmMKKworMjAxMy0wMi0yNyAxNjoxNToyNyAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZHRtZi5jOgorCSAgdGVzdHM6IEZpeCByZWYgbGVhayBpbiBkdG1mIHRlc3QKKworMjAxMy0wMi0yNiAxNDoxODoyMCAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzoKKwkgIHJ0cG1wNGdkZXBheTogc3RyZWFtdHlwZSBpcyBub3QgcHV0IGJ5IGFsbCBSVFNQIHNlcnZlciwgbm90IG1ha2UgaXQgb3B0aW9uYWwKKwkgIFNwZWNpZmljIGNhc2UgaGVyZSBpcyBXb3d6YSAzLjUuMAorCisyMDEzLTAyLTI1IDAwOjM1OjU4ICswMTAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXMgKGF0KSBhcGVzdGFhcnQgKGRvdCkgb3JnPgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIGxldmVsOiBwdXQgYmFjayBkZXByZWNhdGlvbiB3YXJuaW5ncworCisyMDEzLTAyLTI0IDE3OjAwOjE0ICswMTAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXMgKGF0KSBhcGVzdGFhcnQgKGRvdCkgb3JnPgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6CisJICBsZXZlbDogc2VuZCBsYXN0IG1lc3NhZ2Ugb24gRU9TCisKKzIwMTMtMDItMjMgMTQ6MzQ6MzUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHB1c2ggbW9kZTogaGFuZGxlIHNvbWUgbW9yZSAwLXNpemUgYnVmZmVyIGNhc2VzCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg0OTQ0CisKKzIwMTMtMDItMjMgMTg6NTA6NTIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBmaXggdXAgZXhhbXBsZSBwaXBlbGluZSBpbiBkb2NzCisKKzIwMTItMTEtMjAgMTI6MTQ6MDcgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IFVwZGF0ZSBzZWdkb25lIHBlcmlvZGljYWxseQorCSAgVGhpcyBtYWtlcyBzdXJlIHRoYXQgd2UgdXBkYXRlIHNlZ2RvbmUgYmFzZWQgb24gdGhlIHJlYWQgaW5kZXggcmVjZWl2ZWQKKwkgIGR1cmluZyBsYXRlbmN5IHVwZGF0ZXMuIEFzIHRoZSBjb21tZW50IG5vdGVzLCB3ZSBtYWtlIHNvbWUgY29tcHJvbWlzZXMKKwkgIHRvIGRlYWwgd2l0aCB0aGUgZmFjdCB0aGF0IHNlZ2RvbmUgaXMgYSBzZWdtZW50IG11bHRpcGxlLCB3aGlsZSB0aGUgcmVhZAorCSAgaW5kZXggb2ZmZXJzIGZpbmVyIGdyYW51bGFyaXR5LiBUaGUgdXBkYXRlcyBhcmUgYWxzbyBub3QgdmVyeSBvZnRlbgorCSAgKDEwMG1zIHNpbmNlIHRoYXQgaXMgaG93IG9mdGVuIGF1dG9tYXRpYyB0aW1pbmcgdXBkYXRlcyBhcmUgcHJvdmlkZWQpLgorCSAgQWxsIHRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBiYXNlYXVkaW9zaW5rIHNhbXBsZSBhbGlnbm1lbnQgY29kZSB0byB3b3JrCisJICBhdCBhbGwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk0MjU3CisKKzIwMTMtMDItMTMgMTA6NDY6NTQgKzAxMDAgIFBhdWwgSEVOUllTIDx2aXNlY2hlbGxlQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogRml4IHdyb25nIGNvZGUgb3JnYW5pc2F0aW9uIGluIGNhc2Ugb2YgY29sbGlzaW9uCisJICBjaGFuZ2Vfc3NyYyBmaWVsZCBvZiBSVFBTZXNzaW9uIHNob3VsZCBiZSBzZXQgYmVmb3JlIGNhbGxpbmcKKwkgIHJ0cF9zZXNzaW9uX3NjaGVkdWxlX2J5ZV9sb2NrZWQgKCkgYXMgdGhpcyBmdW5jdGlvbiB3aWxsIGNhbGwgcmVjb25zaWRlciBmdW5jdGlvbgorCSAgdGhhdCB3aWxsIHdha2UgdXAgcnRjcF90aHJlYWQgd2hpY2ggd2lsbCBjYWxsIHJ0cF9zZXNzaW9uX29uX3RpbWVvdXQgKCkgdGhhdCB3aWxsCisJICBjaGVjayBjaGFuZ2Vfc3NyYyB0byBjaGFuZ2UgdGhlIHNzcmMuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk0MTg0CisKKzIwMTMtMDItMjEgMTE6MTU6MjMgLTA1MDAgIEplYW4tRnJhbsOnb2lzIEZvcnRpbiBUYW0gPG5la29oYXlvQGdtYWlsLmNvbT4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICBhbHBoYTogaW1wcm92ZSBkZXNjcmlwdGlvbnMgb2YgY2hyb21hIGtleWluZy1yZWxhdGVkIHByb3BlcnRpZXMgYW5kIGVudW1zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk0Mzc0CisKKzIwMTMtMDItMjEgMTU6MDE6MTUgLTA1MDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgYWxwaGE6IERvIG5vdCBvdmVycmlkZSB0aGUgbWV0aG9kIHdpdGggY3VzdG9tIHIvZy9iIHZhbHVlcworCSAgRGVwZW5kaW5nIG9uIHRoZSBvcmRlciBnX29iamVjdF9zZXQoKSBjYWxscyBhYXJlIG1hZGUsIHRoZQorCSAgdGFyZ2V0IHIvZy9iIHNldHRpbmdzIHdpbGwgb3ZlcnJpZGUgdGhlIG1ldGhvZCBpZiBzZXQgdG8KKwkgIGdyZWVuL2JsdWUuIENoYW5nZSB0aGF0IHNvIHdlIGRvIG5vdCB1c2UgdGhlIHRhcmdldC1yL2cvYiB2YWx1ZXMKKwkgIHVubGVzcyB0aGUgbWV0aG9kIGlzIHNldCB0byBjdXN0b20uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk0Mzc0CisKKzIwMTMtMDItMjAgMTU6NDY6NDMgKzAxMDAgIE9nbnlhbiBUb25jaGV2IDxvZ255YW5AYXhpcy5jb20+CisKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzoKKwkgIGF1cGFyc2U6IGRvIG5vdCBsZWFrIHNyY19jYXBzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk0Mjc1CisKKzIwMTMtMDItMjAgMjE6MDM6MjcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IG9ubHkgZGVsYXkgUlRDUCB3aGVuIHdlIGFyZSBhIHNlbmRlcgorCSAgT25seSBkZWxheSB0aGUgUlRDUCB0aHJlYWQgd2hlbiB3ZSBhcmUgYSBzZW5kZXIsIHdoaWNoIHdlIGNhbiBrbm93IGJlY2F1c2Ugd2UKKwkgIGhhdmUgYSBzZW5kX3J0cF9zcmMgcGFkLiBPdGhlcndpc2Ugd2UgbWlnaHQgZGVsYXkgdGhlIFJUQ1AgdGhyZWFkIGlmIHdlCisJICBhcmUgb25seSBhIHJlY2VpdmVyIGFuZCB0aGVuIHRoZXJlIGlzIG5vIGNvZGUgcGF0aCB0aGF0IHdha2VzIHVwIHRoZQorCSAgUlRDUCB0aHJlYWQgYW5kIHdlIGVuZCB1cCB3aXRob3V0IFJUQ1AgcGFja2V0cy4KKworMjAxMy0wMi0xOSAxMTo0NzoyMCArMDEwMCAgQmVuamFtaW4gR2FpZ25hcmQgPGJlbmphbWluLmdhaWduYXJkQGxpbmFyby5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDI6IEFkZCBzdXBwb3J0IG9mIGRtYWJ1ZgorCSAgdjRsIGhhcyBhZGQgYSBuZXcgSU9DVEwgdG8gZXhwb3J0IGEgYnVmZmVyIGJ5IHVzaW5nIGRtYWJ1Zi4KKwkgIFRoaXMgcGF0Y2ggYWxsb3cgdG8gdXNlIHRoaXMgbmV3IElPVENMIGlmIGl0IGhhcyBiZWVuIGRlZmluZWQgaW4gdmlkZW9kZXYyLmgKKwkgIEkgaW50cm9kdWNlIGEgbmV3IElPIG1vZGUgKEdTVF9WNEwyX0lPX0RNQUJVRikgdG8gZW5hYmxlIHRoaXMgd2F5IG9mIHdvcmtpbmcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkzODI2CisKKzIwMTMtMDItMTggMjA6MDQ6MDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCB1cCBkb2RneSBjb2RlIHRoYXQgdHJpZXMgdG8gZml4IHVwIGEgYnJva2VuIG1vb3YgYXRvbQorCSAgQWZ0ZXIgZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jKCkgZ3N0X2J1ZmZlcl9jb3B5X2ludG8oKSB3aWxsIGxpa2VseQorCSAgYXBwZW5kIHRvIHRoZSBhbHJlYWR5LWV4aXN0aW5nIG1lbW9yeSBpbnN0ZWFkIG9mIGZpbGxpbmcgaXQuCisKKzIwMTMtMDItMTggMTY6MzI6MTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBwb3RlbnRpYWwgY3Jhc2ggb24gc2hvcnQgTU9PViBhdG9tCisJICBEb24ndCB1bm1hcCBzaG9ydCBNT09WIGF0b20gYnVmZmVyIHR3aWNlLCB3aGljaCBoYXBwZW5lZAorCSAgaW4gdGhlIGNhc2Ugd2hlcmUgd2UgZG9uJ3QgZml4IHVwIHRoZSBNT09WIGF0b20uCisJICBGaXhlcyBjcmFzaGVzIHdoZW4gdGh1bWJuYWlsaW5nIHBhcnRpYWwgbXA0IGZpbGUgd2hlcmUKKwkgIHRoZSBNT09WIGF0b20gaXMgc3RpbGwgaW5jb21wbGV0ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTQwMTAKKworMjAxMy0wMi0xNiAxNjo0OToyMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZXh0L3NvdXAvTWFrZWZpbGUuYW06CisJICBzb3VwaHR0cHNyYzogc2V0IFNPVVBfVkVSU0lPTl97TUlOX1JFUVVJUkVELE1BWF9BTExPV0VEfSB0byBzdXBwcmVzcyBkZXByZWNhdGlvbnMgd2l0aCBuZXdlciB2ZXJzaW9ucworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MzkxMQorCisyMDEzLTAyLTE2IDE1OjQ3OjAyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cDogdXNlIGRlZmF1bHQgcHJveHkgcmVzb2x2ZXIgaW5zdGVhZCBvZiBkZXByZWNhdGVkIEdOT01FIHByb3h5IHJlc29sdmVyCisJICBBcHBhcmVudGx5IHRoZXJlJ3Mgbm8gcmVhc29uIHRvIHVzZSBpdCBhbnkgbG9uZ2VyLiBEcm9wIGxpYnNvdXAtZ25vbWUKKwkgIGRlcGVuZGVuY3kgd2hpbGUgYXQgaXQsIG5vdyB0aGF0IHdlIGRvbid0IG5lZWQgYW55dGhpbmcgZnJvbSBpdCBhbnkKKwkgIG1vcmUgKGl0IG9ubHkgY29uc2lzdHMgZW50aXJlbHkgb2YgZGVwcmVjYXRlZCBBUEkgbm93IGFueXdheXMpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MzkxMQorCisyMDEzLTAyLTE1IDE1OjQzOjQzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3RhZ3NjaGVja2luZy5jOgorCSAgdGVzdHM6IGZpeCBzb21lIGgyNjQgY2FwcworCSAgRG9lc24ndCBmaXggYW55dGhpbmcgaW4gcGFydGljdWxhciwgYnV0IGlzCisJICBzdGlsbCBuZWVkZWQgaGVyZSBmb3IgY29ycmVjdG5lc3MuCisKKzIwMTMtMDItMTUgMDg6MTk6MjQgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkgIGF1ZGlvcGFub3JhbWE6IHJlbW92ZSBjaGFubmVsLW1hc2sgZnJvbSBjYXBzCisJICBUaGUgY2hhbm5lbC1tYXNrIGlzIG9ubHkgbmVlZGVkIGZvciBjaGFubmVscz4yIHdoaWNoIHdlIGRvbid0IGRvLgorCisyMDEzLTAyLTE1IDE2OjIxOjIxICswMTAwICBCZW5qYW1pbiBHYWlnbmFyZCA8YmVuamFtaW4uZ2FpZ25hcmRAc3Rlcmljc3Nvbi5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBkb24ndCBjaGVjayBzdHJpZGUgZm9yIGVuY29kZWQgZm9ybWF0cworCSAgRG9uJ3QgdHJ5IHRvIGNoZWNrIHRoZSBzdHJpZGUgZm9yIGVuY29kZWQgZm9ybWF0cy4gU29tZSBkcml2ZXJzIG91dHB1dAorCSAgc29tZXRoaW5nICE9IDAgYW5kIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byBmYWlsIG9uIHRoYXQuCisKKzIwMTMtMDItMTUgMTQ6MTE6MzYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiB1c2UgZ19zb2NrZXRfc2V0X29wdGlvbigpIHRvIHNldCBidWZmZXIgc2l6ZSB3aXRoIG5ld2VyIEdMaWIgdmVyc2lvbnMKKwkgIFNvIHdlIGhhdmUgdG8gd29ycnkgbGVzcyBhYm91dCBwb3J0YWJpbGl0eS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTI0MDAKKworMjAxMy0wMi0xNCAxNDoxMzoyNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IHJlbW92ZSBzb2YtbWFya2VyIGZyb20gdGVtcGxhdGUgY2FwcyBmb3Igbm93CisJICBOb3cgdGhhdCB0aGUgc3Vic2V0IGNoZWNrIGFjdHVhbGx5IHdvcmtzLCB0aGlzIGJyZWFrcworCSAgdGhpbmdzIHdpdGggZGVtdXhlcnMgdGhhdCBkb24ndCBwdXQgYSAic29mLW1hcmtlciIKKwkgIGluIHRoZWlyIGpwZWcgY2FwcywgYW5kIHdlIGRvbid0IGhhdmUgYSBnb29kIHBhcnNlcgorCSAgdG8gcGx1ZyBlaXRoZXIgeWV0LgorCisyMDEzLTAyLTEzIDEyOjMyOjEwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5oOgorCSAganBlZ2VuYzogUHV0IHRoZSBTT0YgbWFya2VyIGludG8gdGhlIGNhcHMKKworMjAxMy0wMi0xMyAxMjowMjo0NiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6CisJICBydHAtcGF5bG9hZGluZzogRml4IHVuaXQgdGVzdCBjYXBzIGFuZCBBTVIgZGVwYXlsb2FkZXIgc2luayB0ZW1wbGF0ZSBjYXBzCisJICBGaWVsZHMgd2VyZSBtaXNzaW5nIGZyb20gdGhlIGFjdHVhbCBjYXBzLCBvciB0b28gbWFueSBmaWVsZHMKKwkgIGV4aXN0ZWQgaW4gdGhlIHRlbXBsYXRlIGNhcHMuCisKKzIwMTMtMDItMTMgMTE6NTM6MDEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IEZpeCBjYXBzIHVzZWQgaW4gdGhlIHVuaXQgdGVzdAorCSAgVGhlIEFBQyBjYXBzIHBhc3NlZCB3ZXJlIGluY29tcGxldGUuCisKKzIwMTMtMDItMTMgMTE6NDk6NDAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZW5jLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrcGFyc2UuYzoKKwkgIHdhdnBhY2s6IEZpeCB1bml0IHRlc3RzLCB3aWR0aCBpcyBub3cgY2FsbGVkIGRlcHRoIGluIHRoZSBjYXBzIGluIDEuMAorCisyMDEzLTAyLTEyIDIzOjMxOjIyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSAgdGVzdHM6IG1ha2Ugc291cGh0dHBzcmMgdW5pdCB0ZXN0IHdvcmsgZXZlbiBpZiBodHRwX3Byb3h5IGlzIHNldAorCSAgV2UncmUgdGVzdGluZyB3aXRoIGFuIGh0dHAgc2VydmVyIG9uIGxvY2FsaG9zdCwgYnV0IGRvbid0IHN1cHBvcnQKKwkgIGFuIGV4Y2VwdGlvbiBsaXN0IGZvciB0aGUgaHR0cF9wcm94eSwgc28ganVzdCB1bnNldCB0aGUgZW52aXJvbm1lbnQKKwkgIHZhcmlhYmxlIHRvIG1ha2Ugc3VyZSB3ZSBjYW4gcnVuIHRoaXMgdGVzdCBwcm9wZXJseSBldmVuIGlmIHRoZQorCSAgZW52aXJvbm1lbnQgaGFzIGh0dHBfcHJveHkgc2V0LgorCSAgQWxzbywgZG9uJ3Qgc2tpcCBhbGwgdGVzdHMgaWYgdGhlcmUgaXMgYW4gaXNzdWUgd2l0aCB0aGUgU1NMIHNlcnZlciwKKwkgIGp1c3QgcnVuIHRoZSBub24tU1NMIHRlc3RzIHRoZW4uCisJICBodHRwczovL2plbmtpbnMucWEudWJ1bnR1LmNvbS92aWV3L1JhcmluZy92aWV3L0pIQnVpbGQlMjBHbm9tZS9qb2IvamhidWlsZC1hbWQ2NC1nc3QtcGx1Z2lucy1nb29kLworCisyMDEzLTAyLTEyIDEyOjUzOjUyIC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAcmRpby5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZXh0cmFjdCBjb2RlY19kYXRhIGZvciBQcm9SZXMKKworMjAxMy0wMi0wOCAwMTowMjoxMCArMTEwMCAgVGltICdtaXRocm8nIEFuc2VsbCA8bWl0aHJvQG1pdGhpcy5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IEZpeGluZyBidWZmZXIgbGVhayBpbiBnc3RfYXZpX211eF9kb19idWZmZXIKKwkgIGdzdF9hdmlfbXV4X2RvX2J1ZmZlciB3YXMgbGVha2luZyBkYXRhIGZyb20gZ3N0X2NvbGxlY3RfcGFkc19wb3AuCisKKzIwMTMtMDItMTAgMTU6MTA6MzIgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGNvcnJlY3QgZHVyYXRpb24gZm9yIGF1ZGlvIFZCUiBidWZmZXJzIGluIHB1bGwgbW9kZQorCisyMDEzLTAyLTA4IDIxOjI4OjAyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBwcm9wZXIgcG9zaXRpb24gcmVwb3J0aW5nIGFuZCBwdXNoIG1vZGUgdGltZXN0YW1waW5nCisJICAuLi4gYW5kIGFsaWduIGN1cnJlbnRfdG90YWwgc2VtYW50aWNzIGluIHB1c2ggYW5kIHB1bGwgbW9kZSwKKwkgIHdoaWNoIHRyYWNrcyBieXRlcyBmb3IgQ0JSIGFuZCBibG9ja3MgZm9yIFZCUi4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTE0ODEKKworMjAxMy0wMi0wOCAxNzowNToyNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogZGVsYXkgUlRDUCB1bnRpbCBmaXJzdCBSVFAgcGFja2V0CisJICBEZWxheSBzZW5kaW5nIHRoZSBmaXJzdCBSVENQIHBhY2tldCB1bnRpbCB3ZSBoYXZlIHNlbnQgdGhlIGZpcnN0IFJUUCBwYWNrZXQuCisJICBPdGhlcndpc2Ugd2Ugd2lsbCBzZW5kIG91dCBhIFJlY2VpdmVyIFJlcG9ydCBpbnN0ZWFkIG9mIGEgc2VuZGVyIHJlcG9ydC4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkxNDAwCisKKzIwMTMtMDItMDcgMTU6MDY6NDAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IHJlbW92ZSBkZWFkIGNvZGUKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjgzNTUKKworMjAxMy0wMS0yOSAxMDo0ODoxNyArMDEwMCAgUGF1bCBIRU5SWVMgPHZpc2VjaGVsbGVAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJICBydHBwdGRlbXV4OiBmb3J3YXJkIHN0aWNreSBldmVudHMgYW5kIHRoZW4gc2V0IGNhcHMKKwkgIFdoZW4gYSBuZXcgc3JjIHBhZCBpcyBhZGRlZCwgZmlyc3QgZm9yd2FyZCB0aGUgc3RpY2t5IGV2ZW50cyBhbmQgdGhlbgorCSAgc2V0IHRoZSBjYXBzIG9uIHRoZSBzcmMgcGFkCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkyNzg2CisKKzIwMTMtMDItMDcgMTQ6MzI6MjYgKzAxMDAgIE1hcmtvdnRzZXYgVmFkaW0gPHYubWFya292dHNldiBhdCBzYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGltcHJvdmUgZGVidWcgb3V0cHV0CisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg4OTM1CisKKzIwMTEtMDktMjYgMTQ6NDI6NTEgLTA3MDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiByZXdvcmsgY2xlYW51cCBvZiBzdHJlYW1zCisJICBNb3ZlIHRoZSB3b3JrIG9mIGNsZWFuaW5nIHVwIHRoZSBjbGllbnQgc3RyZWFtcyBpbiB0aGUgZnJlZV9zdHJlYW0KKwkgIGZ1bmN0aW9uLiBUaGlzIGFsbG93cyB1cyB0byBwcm9wZXJseSBjbGVhbiB1cCB0aGUgY2xpZW50IHN0cmVhbXMgd2hlbiB3ZQorCSAgcmVtb3ZlIGFuIFJUUCBzdHJlYW0gYXMgd2VsbC4KKwkgIEJhc2VkIG9uIHBhdGNoIGJ5IFN1amF5IDxzZGF0YXJAY2lzY28uY29tPgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2MDE1NgorCisyMDEzLTAyLTA3IDExOjQwOjM1ICswMTAwICBUaW0gJ21pdGhybycgQW5zZWxsIDxnbm9tZSBhdCBtaXRoaXMuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjI6IGF2b2lkIGNhcHMgbGVhaworCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MzMwNworCisyMDEzLTAyLTA2IDE3OjE1OjExICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogZG8gc2tldyBlc3RpbWF0aW9uIG9ubHkgZm9yIG5ldyB0aW1lc3RhbXBzCisJICBPbmx5IHJ1biB0aGUgc2tldyBlc3RpbWF0aW9uIGNvZGUgd2hlbiB3ZSBoYXZlIGEgbmV3IFJUUCB0aW1lc3RhbXAuIElmIHdlIGhhdmUKKwkgIHRoZSBzYW1lIFJUUCB0aW1lc3RhbXAsIHdlIHNpbXBseSB1c2UgdGhlIHByZXZpb3VzIGVzdGltYXRpb24uIFRoaXMgd29ya3MKKwkgIGJlY2F1c2UgdGhlIG5ldyBvYnNlcnZhdGlvbiB3aXRoIHRoZSBzYW1lIFJUUCB0aW1lc3RhbXAgaGFzIHRvIGhhdmUgYSBiaWdnZXIKKwkgIHJlY2VpdmVyIHRpbWUgYW5kIGlzIHRodXMgbm90IGdvaW5nIHRvIGluZmx1ZW5jZSB0aGUgZXN0aW1hdGlvbiBleGNlcHQgZm9yCisJICBjYXVzaW5nIG1vcmUgaml0dGVyLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0MDAyMworCisyMDEzLTAyLTA2IDEzOjUyOjI2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBvbmx5IEVPUyB3aGVuIG91ciBzb3VyY2Ugc2VuZHMgQllFCisJICBPbmx5IEVPUyB3aGVuIHdlIHJlY2VpdmUgYSBCWUUgZXZlbnQgZnJvbSB0aGUgU1NSQyBvZiBvdXIgc3RyZWFtLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NTQ1MworCisyMDEzLTAyLTA2IDEzOjQ3OjUxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBzYXZlIHRoZSBzdHJlYW0gU1NSQworCSAgQ29uZmxpY3RzOgorCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jCisKKzIwMTMtMDItMDYgMTM6MTg6MTggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGZsdXNoIGNvbm5lY3Rpb24gd2hlbiBzdG9wcGluZworCSAgV2hlbiB3ZSBzdG9wLCB3ZSBjYW4gZmx1c2ggYWxsIHBlbmRpbmcgY29tbWFuZHMgc28gdGhhdCB3ZSBjYW4gc3RvcCBhbmQKKwkgIGpvaW4gdGhlIHRhc2suCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg0OTI0CisKKzIwMTMtMDItMDUgMjI6MDI6MTMgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9SRUFETUU6CisJICBzcGVjdHJ1bTogcmVtb3ZlIG91dGRhdGVzIHJlYWRtZQorCSAgTGV0cyByZW1vdmUgdGhlIHJlYWRtZSBmcm9tIHByZS0wLjEuMCB0aGF0IGlzIGNvbXBsZXRlbHkgaXJyZWxldmFudCBub3cuCisKKzIwMTMtMDItMDUgMDc6MzI6MjkgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkgIGF1ZGlvcGFub3JhbWE6IGFkZCBtb3JlIGRlYnVnIGxvZ2dpbmcKKworMjAxMy0wMi0wNSAwODoyNjoxNCArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvZXhhbXBsZXMvbGV2ZWwvbGV2ZWwtZXhhbXBsZS5jOgorCSAgbGV2ZWwtZXhhbXBsZS4gYXZvaWQgdGFraW5nIHRoZSBhcnJheXMgYWdhaW4gZm9yIGVhY2ggY2hhbm5lbCBmb3IgY2xhcml0eQorCSAgQWxzbyBpbnRyb2R1Y2Ugc29tZSBibGFuayBsaW5lcyBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5IGFuZCB1cGRhdGUgdGhlIGNvbW1lbnRzLgorCisyMDEzLTAyLTA0IDE4OjM4OjQxICswMDAwICBSaWNvIFR6c2NoaWNoaG9seiA8cmljb3R6QHVidW50dS5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvTWFrZWZpbGUuYW06CisJICBhdWRpb3BhcnNlcnM6IGZpeCB0eXBvIGluIG5vaW5zdF9oZWFkZXJzCisKKzIwMTMtMDItMDQgMTE6MDg6MjMgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkgIGF1ZGlvcGFub3JhbWE6IGZ1cnRoZXIgcG9ydCB0byAxLjAKKwkgIFRyYW5zZm9ybWNhcHMgaXMgbm90IGNhbGxlZCB3aXRoIGNhcHMgY29udGFpbmluZyBzaW5nbGUgc3RydWN0dXJlcyBhbnltb3JlLiBBbHNvIGFkZCBtaXNzaW5nIGZpbHRlciBoYW5kbGluZy4gU3RpbGwgZG9lcyBub3QgbmVnb3RpYXRlIHRob3VnaC4KKworMjAxMy0wMi0wMyAyMjo0NTo1MiArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSAgYXVkaW9wYW5vcmFtYTogZml4IGNhcHMKKwkgIFdlIGRvbid0IHR1cm4gZmxvYXQgaW50byAzMmJpdCBwY20uIExvb2tzIGxpa2UgYSB0eXBvIGZyb20gdXBkYXRpbmcgdGhlIGNhcHMuCisKKzIwMTMtMDItMDMgMTM6MTQ6NTAgKzAxMDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgbGV2ZWw6IEFkZCBtaXNzaW5nIGNvbWEgYmV0d2VlbiBmb3JtYXRzCisKKzIwMTMtMDEtMzEgMjI6NTU6MTggKzExMDAgIE1hdHRoZXcgV2F0ZXJzIDx5c3RyZWV0MDBAZ21haWwuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogZml4IGVvcyB0aW1lc3RhbXAgY2hlY2sKKwkgIGZpeGVzIGhhbmcgaW4gdmlkZW90ZXN0c3JjIG51bS1idWZmZXJzPTIwICEgdmlkZW9taXhlciAhIGZha2VzaW5rCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkyOTM1CisKKzIwMTMtMDEtMzEgMTE6MzU6MDkgKzAxMDAgIERpcmsgVmFuIEhhZXJlbmJvcmdoIDx2aGRpcmtAZ21haWwuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBhZGQgc3VwcG9ydCBmb3IgcmF3IG1vbm9jaHJvbWUgOC1iaXQgdmlkZW8KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTI5MzIKKworMjAxMy0wMS0xOCAyMTowODoxMiArMDQwMCAgQWxleGV5IENoZXJub3YgPGFjaGVybm92QG5lb3NwaGVyZS5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5oOgorCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJICBvc3h2aWRlb3Npbms6IE1ha2UgR3N0TmF2aWdhdGlvbiBrZXkgaW5wdXQgZXZlbnRzIGluIG9zeHZpZGVvc2luayBjb21wYXRpYmxlIHdpdGggeCh2KWltYWdlc2luayBvbmVzCisKKzIwMTMtMDEtMjkgMTA6MzA6MzIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGF2b2lkICcuLi5pcyB1c2VkIHVuaW5pdGlhbGl6ZWQnCisKKzIwMTMtMDEtMDkgMTM6MjQ6NDkgLTA1MDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogc2V0IGludGVybGVhdmVkIGxheW91dCBjb3JyZWN0bHkgZm9yIExQQ00gYXVkaW8KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjM0NTgKKworMjAxMy0wMS0wOCAyMDo0NToyMSAtMDUwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgc3VwcG9ydCBmb3IgTFBDTSBmb3VyY2MgKHVuY29tcHJlc3NlZCBhdWRpbyBpbiBRdWlja3RpbWU3KQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2MzQ1OAorCisyMDEzLTAxLTA4IDIwOjQyOjM1IC0wNTAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHByaW50IGFsbCBkZWJ1ZyBmb3Igc291bmQgc2FtcGxlIGRlc2NyaXB0aW9uIHYyCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjYzNDU4CisKKzIwMTMtMDEtMDggMjA6MTQ6MTcgLTA1MDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogc291bmQgc2FtcGxlIGRlc2NyaXB0aW9uIHYyIGRvZXNuJ3Qgb3ZlcnJpZGUgc2FtcGxlc19wZXJfcGFja2V0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjYzNDU4CisKKzIwMTMtMDEtMDggMTk6NTc6NTAgLTA1MDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcGFzcyBzdHNkIGRhdGEgdG8gcXRkZW11eF9hdWRpb19jYXBzKCkKKwkgIFdlIHdpbGwgbmVlZCB0aGF0IGxhdGVyIGZvciBMUENNIGZvcm1hdCBzdXBwb3J0LiBEaXNhYmxlCisJICBRRE0yIHBhcnNpbmcgb2Ygc3RzZCBkYXRhIHdoaWNoIGRlYWQgY29kZSBiZWZvcmUgYXMgd2VsbAorCSAgYmVjYXVzZSBkYXRhIHdhcyBhbHdheXMgTlVMTC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjM0NTgKKworMjAxMy0wMS0wOCAxOTo1Njo0NiAtMDUwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgbGVuIGNoZWNrIGZvciBzb3VuZCBzYW1wbGUgZGVzY3JpcHRpb25zIHYxIGFuZCB2MgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2MzQ1OAorCisyMDEzLTAxLTI4IDIyOjQyOjI1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHJ0cG1hbmFnZXI6IHVzZSBDODktc3R5bGUgY29tbWVudHMKKworMjAxMy0wMS0yOCAxODowNjoxNSAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgZ3N0cnRwc2Vzc2lvbjogRml4IGRvdWJsZS1kZWNsYXJlZCB2YXJpYWJsZQorCisyMDEzLTAxLTI4IDE3OjU4OjIwIC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHJ0cDogRml4IGNvbXBpbGF0aW9uIGVycm9ycyBpbiBwcmV2aW91cyBwYXRjaGVzCisKKzIwMTEtMDQtMjggMjI6NTk6MjggKzAyMDAgIEhhYWtvbiBTcG9yc2hlaW0gPGhhYWtvbi5zcG9yc2hlaW1AZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBFbnN1cmUgTVQgc2FmZSBldmVudCBoYW5kbGluZyBhbmQgcGx1ZyBldmVudCBsZWFrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NzgyNgorCisyMDExLTEwLTE3IDIzOjQ1OjM3ICswMjAwICBJZGFyIFRvbGxlZnNlbiA8aXRvbGxlZnNAY2lzY28uY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBtdC1zYWZlIGV2ZW50LXB1c2gKKwkgIEJ5IHRha2luZyBhIHJlZiBvZiB0aGUgc2luay1wYWQgdW5kZXIgbG9jaywgaXQgd29uJ3QgZGlzc2FwcGVhcgorCSAgd2hpbGUgdGhlIHB1c2ggaXMgdGFraW5nIHBsYWNlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY3ODE2CisKKzIwMTItMDEtMDQgMTA6Mjk6NDUgKzAxMDAgIFBhc2NhbCBCdWhsZXIgPHBhYnVobGVyQGNpc2NvLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICBydHBzc3JjZGVtdXg6IFNhZmVseSBwdXNoIG9uIHBhZHMgdGhhdCBtaWdodCBiZSByZW1vdmVkIGR1ZSB0byBhIFJUQ1AgQllFCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY3ODE1CisKKzIwMTMtMDEtMjggMjA6NDI6MjYgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBhOTQyMjkzIHRvIDJkZTIyMWMKKworMjAxMy0wMS0yOCAxMTo1NDo1NCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0c2JjcGFyc2UuYzoKKwkgIHNiY3BhcnNlOiBpbml0IHNvbWUgdmFyaWFibGVzIHRvIGF2b2lkIGJvZ3VzIGNvbXBpbGVyIHdhcm5pbmdzCisKKzIwMTMtMDEtMjggMTI6NDE6MDQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZwOGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSAgcnRwZGVwYXk6IHJlbW92ZSBwYXlsb2FkIHR5cGUgcmVzdHJpY3Rpb25zCisJICBSZW1vdmUgdGhlIHB0IHJlc3RyaWN0aW9ucyBmb3IgYWxsIHRoZSBkZXBheWxvYWRlcnMgdGhhdCBoYXZlIGFuCisJICBlbmNvZGluZy1uYW1lLiBXZSBjYW4gdXNlIHRoaXMgdG8gYXV0b3BsdWcgZGVjb2RlcnMuCisJICBSZW1vdmUgdGhlIGVuY29kaW5nLW5hbWUgZm9yIGFsbCB0aGUgcGF5bG9hZGVycyB3aXRoIGEgZml4ZWQgcGF5bG9hZAorCSAgdHlwZS4KKwkgIFdlIG5vdyBlaXRoZXIgaGF2ZSBhbiBlbmNvZGluZy1uYW1lIG9yIGEgcHQgaW4gdGhlIHNpbmtwYWQgY2FwcyBvZgorCSAgYSBkZXBheWxvYWRlci4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjM5MjkyCisKKzIwMTMtMDEtMjggMTI6MjM6NDEgKzAxMDAgIE1hcmMgTGVlbWFuIDxtYXJjLmxlZW1hbkBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSAgcnRwOiByZW1vdmUgcGF5bG9hZCByZXF1aXJlbWVudHMgZnJvbSBzZWxlY3RlZCBkZXBheWxvYWRlcnMKKwkgIGVuY29kaW5nIG5hbWUgaXMgcmVxdWlyZWQgaW4gdGhlIGNhcHMgYW5kIGlzIGEgYmV0dGVyIGZpdCBmb3IgYXV0b3BsdWdnaW5nIHRoYW4KKwkgIHRoZSBwdCB2YWx1ZS4gSGFyZHdhcmUgbWFudWZhY3R1cmVycyBoYXZlIGEgYmFkIGhhYml0IG9mIHNraW1taW5nIHRocm91Z2ggUkZDcworCSAgYW5kIGluIHRoaXMgY2FzZTsgdXNlIHVuYXNzaWduZWQgbnVtYmVycyBmb3IgZW5jb2RlcnMgaW5zdGVhZCBvZiBkeW5hbWljCisJICBudW1iZXJzLgorCSAgSW4gZXNzZW5jZSwgdGhpcyBwYXRjaCB3aWxsIGFkZCBzdXBwb3J0IGZvciBhIGxvdCBvZiBCb3NjaCBoYXJkd2FyZSBlbmNvZGVycworCSAgd2l0aG91dCBicmVha2luZyBhdXRvcGx1Z2dpbmcuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjM5MjkyCisKKzIwMTMtMDEtMjcgMTA6MTc6NTkgKzA1MzAgIEIuUHJhdGhpYmhhIDxib3NzbGludXhAY2RhYy5pbj4KKworCSogdGVzdHMvZXhhbXBsZXMvamFjay9qYWNrX2NsaWVudC5jOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1hbHNhc3JjLVBDTUEuYzoKKwkqIHRlc3RzL2ljbGVzL3hpbWFnZXNyYy10ZXN0LmM6CisJICB0ZXN0czogdXNlIGdfdGltZW91dF9hZGRfc2Vjb25kcyBpbnN0ZWFkIG9mIGdfdGltZW91dF9hZGQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTI2MTUKKworMjAxMy0wMS0yNyAxMjo1NDoxNSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHB1c2ggbW9kZTogb25seSBwYXJzZSBtb292IDEgb25jZQorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MTU3MAorCisyMDEzLTAxLTI2IDIyOjU4OjI5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBydHBkdG1mc3JjOiBmaXggY29tcGlsZXIgd2FybmluZworCSAgZ3N0cnRwZHRtZnNyYy5jOiBJbiBmdW5jdGlvbiAnZ3N0X2R0bWZfc3JjX3ByZXBhcmVfbWVzc2FnZS5pc3JhLjEnOgorCSAgZ3N0cnRwZHRtZnNyYy5jOjY2OTozOiBlcnJvcjogJ3MnIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbgorCisyMDEzLTAxLTI1IDIxOjA2OjA1IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuYzoKKwkgIHJ0cGR0bWZkZXBheTogRml4IG1pc3Npbmcgd29yayBpbiBkb2MKKworMjAxMy0wMS0yNCAyMTowMDowOCAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZHRtZi5jOgorCSAgdGVzdHM6IEFkZCB0ZXN0IGZvciBydHBkdG1mZGVwYXkgYW5kIHJ0cGR0bWZzcmMKKworMjAxMy0wMS0yNSAyMDozOTozMyAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgcnRwZHRtZnNyYzogUG9zdCB0aGUgbWVzc2FnZXMgYWZ0ZXIgdGhlIGNsb2NrIHdhaXQKKwkgIFRoaXMgd2F5LCB0aGUgbWVzc2FnZXMgd2lsbCBiZSBjbG9zZXIgaW4gdGltZSB0byB3aGVuIHRoZSBwYWNrZXRzIGFyZSBzZW50IG91dAorCisyMDEzLTAxLTI1IDIwOjM3OjUzIC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBydHBkdG1mc3JjOiBPbmx5IHNldCB0aGUgZHVyYXRpb24gd2hlbiBzdGFydGluZyB0byBzZW5kCisJICBUaGUgZHVyYXRpb24gZGVwZW5kcyBvbiB0aGUgY2xvY2sgcmF0ZSwgd2hpY2ggY291bGQgY2hhbmdlIGR1ZSB0byByZW5lZ290aWF0aW9uCisKKzIwMTMtMDEtMjUgMjA6Mzc6MDkgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIHJ0cGR0bWZzcmM6IHJlbW92ZSAic3NyYyIgZnJvbSBjYXBzCisJICBzc3JjIGlzIHVpbnQgYW5kIHdlIGRvbid0IGhhdmUgYSB1aW50IHJhbmdlIHR5cGUKKworMjAxMy0wMS0yNCAyMTowODo1MSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5oOgorCSAgcXRtdXg6IHNldCBsYW5ndWFnZSB0byAndW5kZWZpbmVkJyBpbnN0ZWFkIG9mIEVuZ2xpc2ggYnkgZGVmYXVsdAorCisyMDEzLTAxLTIzIDIxOjM1OjI1IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmM6CisJKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuaDoKKwkgIHhpbWFnZXNyYzogU2V0IHRoZSBwaXhlbCBhc3BlY3QgcmF0aW8gY29ycmVjdGx5IGluIHRoZSBjYXBzCisKKzIwMTMtMDEtMDggMDg6NTY6NDUgKzAxMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogUmUtZW5hYmxlIHByZXBhcmUtZm9ybWF0IGVtaXNzaW9uCisJICBXaXRoIHRoZSBwb3J0IHRvIGdzdHJlYW1lciAxLjAgdGhlIHByZXBhcmUtZm9ybWF0IHNpZ25hbCBzdG9wcGVkIGJlaW5nCisJICBlbWl0dGVkLiBTdGFydCBlbWl0dGluZyB0aGlzIGFnYWluIGZvciB1c2UgaW4gdXZjaDI2NHNyYy4gIFdoaWxlIHRoZXJlCisJICBjaGFuZ2UgdGhlIGVtaXNzaW9uIHRvIGluY2x1ZGUgdGhlIGNhcHMgZm9yIGV4dHJhIGZsZXhpYmlsaXR5IGluc3RlYWQgb2YKKwkgIGZvdXJjZSwgd2lkdGgsIGhlaWdodC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTIwNDIKKworMjAxMy0wMS0yMiAxODoxMjoxMCArMDEwMCAgQmVuamFtaW4gR2FpZ25hcmQgPGJlbmphbWluLmdhaWduYXJkQHN0LmNvbT4KKworCSogYXV0b2dlbi5zaDoKKwkgIGF1dG9nZW4uc2g6IGFsbG93IGNhbGxpbmcgZnJvbSBvdXQtb2YtdHJlZQorCSAgU2lnbmVkLW9mZi1ieTogQmVuamFtaW4gR2FpZ25hcmQgPGJlbmphbWluLmdhaWduYXJkQHN0LmNvbT4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTIzMDkKKworMjAxMy0wMS0yMiAxOToyNjowOSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHNiY3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IHNiYzogZml4IGJvZ3VzIGNvbXBpbGVyIHdhcm5pbmcKKwkgIGdzdC1wbHVnaW5zLWdvb2QvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5jOiBJbiBmdW5jdGlvbiAnZ3N0X3NiY19wYXJzZV9oYW5kbGVfZnJhbWUnOgorCSAgZ3N0LXBsdWdpbnMtZ29vZC9nc3QvYXVkaW9wYXJzZXJzL2dzdHNiY3BhcnNlLmM6MjEwOjMyOiBlcnJvcjogJ2NoX21vZGUnIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaQorCisyMDEzLTAxLTE5IDEzOjI3OjQ4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGRvbid0IGVycm9yIG91dCBpZiBwYV9zdHJlYW1fcHJvcGxpc3RfdXBkYXRlKCkgd2l0aCBuZXcgdGFncyBmYWlscworCSAgU2hvdWxkbid0IHJlYWxseSBoYXBwZW4gdGhlc2UgZGF5cywgYnV0IGlmIGl0IGRvZXMsIGl0J3Mgbm90IHJlYWxseQorCSAgYSBwcm9ibGVtIGVpdGhlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTYwNjgKKworMjAxMy0wMS0xNiAxODowMToyMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6CisJICB0ZXN0czogc2tpcCBzb3VwaHR0cHNyYyB0ZXN0cyBpZiB0aGVyZSBpcyBubyBsb2NhbCBodHRwIHNlcnZlciB0byB1c2UKKwkgIFNraXAgdGVzdHMgaWYgdGhlIHNlcnZlciBjb3VsZG4ndCBiZSBzdGFydGVkIG9yIHdlIGNhbid0IGNvbm5lY3QKKwkgIHRvIGl0IGZvciBzb21lIHJlYXNvbiAoZS5nLiBkcmFjb25pYyBidWlsZCBib3QgZW52aXJvbm1lbnRzKS4KKworMjAxMy0wMS0xNiAxNDozMjo1NiArMDEwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5jOgorCSAgYXV0b3BhcnNlcnM6IHVzZSBhcHByb3ByaWF0ZSBwcmludGYgZm9ybWF0IGZvciBnc2l6ZQorCisyMDEzLTAxLTE1IDE1OjA1OjQzICswMTAwICBNYXJ0aW4gUGl0dCA8bWFydGlucGl0dEBnbm9tZS5vcmc+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgdGVzdHM6IHVzZSBfMV8wIHZhcmlhbnRzIGZvciB0aGUgdmFyaW91cyByZWdpc3RyeSB2YXJpYWJsZXMKKwkgIFRoZXNlIG92ZXJyaWRlIHRoZSB2YXJpYW50cyB3aXRob3V0IHZlcnNpb24gc3VmZml4LiBNYWtlcyAnbWFrZSBjaGVjaycgd29yaworCSAgcHJvcGVybHkgaW4gZW52aXJvbm1lbnRzIHRoYXQgc2V0IHRoZSBzdWZmaXhlZCB2YXJpYW50IGZvciAxLjAsIHN1Y2ggYXMKKwkgIGpoYnVpbGQuCisKKzIwMTMtMDEtMTEgMTk6MjQ6NDMgKzA0MDAgIEFsZXhleSBDaGVybm92IDxhY2hlcm5vdkBuZW9zcGhlcmUuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cubToKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogRml4IGNyYXNoIGluIG9zeHZpZGVvc2luayB3aXRoIGV4dGVybmFsIHdpbmRvdyBvdXRwdXQKKworMjAxMy0wMS0xNiAxMjowNDo1OSArMDQwMCAgQWxleGV5IENoZXJub3YgPGFjaGVybm92QG5lb3NwaGVyZS5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5tOgorCSAgb3N4dmlkZW9zaW5rOiBNYWtlIEdzdEdMVmlldyBwcm9wYWdhdGUgaW5wdXQgZXZlbnRzIHRvIGl0cyBwYXJlbnQgdmlldworCSAgRml4ZXMgYnVnICM2OTE4MzIKKworMjAxMy0wMS0xNiAxMDoxOTozNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjcGF5LmM6CisJICBydHBzYmNwYXk6IHVwZGF0ZSBzb21lIGZpZWxkcyBpbiB0aGUgY2FwcyB0byB0aGVpciBuZXcgbmFtZQorCSAgYW5kIHRvIG1hdGNoIHRoZSBwYXJzZXIuICJtb2RlIiBnb3QgcmVuYW1lZCB0byAiY2hhbm5lbC1tb2RlIgorCSAgYW5kICJhbGxvY2F0aW9uIiB0byAiYWxsb2NhdGlvbi1tZXRob2QiLgorCisyMDEzLTAxLTE1IDE3OjQ0OjMzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkgIGRvY3M6IGFkZCBzYmNwYXJzZSBhbmQgcnRwc2JjcGF5IHRvIHBsdWdpbiBkb2NzCisKKzIwMTMtMDEtMTUgMTc6Mzg6MjQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL01ha2VmaWxlLmFtOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5oOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9wbHVnaW4uYzoKKwkgIGF1ZGlvcGFyc2VyczogYWRkIFNCQyBhdWRpbyBwYXJzZXIKKwkgIEZyb20tc2NyYXRjaCByZXdyaXRlLCB0aGUgYmx1ZXogb25lIHdhcyB1c2VsZXNzIGFuZCBicm9rZW4uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkwNTgyCisKKzIwMTMtMDEtMTUgMTU6MDU6MDQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gYTcyZmFlYSB0byBhOTQyMjkzCisKKzIwMTMtMDEtMTAgMTI6Mzg6MTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5oOgorCSAgcnRwOiBpbXBvcnQgcnRwc2JjcGF5IGZyb20gYmx1ZXogYW5kIHBvcnQgdG8gMS4wCisJICBDb21waWxlcywgYnV0IG5vdCB0ZXN0ZWQgeWV0IChzYmMgZWxlbWVudHMgc3RpbGwgbmVlZCB0byBiZSBwb3J0ZWQpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MDU4MgorCisyMDEzLTAxLTA5IDE5OjU5OjE2IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZHRtZi9NYWtlZmlsZS5hbToKKwkqIGdzdC9kdG1mL2dzdGR0bWYuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZkZXRlY3QuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZkZXRlY3QuaDoKKwkqIGdzdC9kdG1mL3RvbmVfZGV0ZWN0LmM6CisJKiBnc3QvZHRtZi90b25lX2RldGVjdC5oOgorCSAgZHRtZi9zcGFuZHNwOiBNb3ZlIGR0bWZkZXRlY3QgdG8gdXNlIGxpYnNwYW5kc3AKKwkgIFJlbW92ZSBvdXIgY29weSBvZiB0aGUgdG9uZV9kZXRlY3QuYyBmaWxlIGFuZCB1c2UgdGhlIG9yaWdpbmFsCisJICBmcm9tIGxpYnNwYW5kc3AuIEFsc28gbW92ZSB0aGUgZWxlbWVudCB0byB0aGUgc3BhbmRzcCBwbHVnaW4uCisKKzIwMTEtMDItMTMgMTc6NTE6NDUgLTA4MDAgIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKworCSogZ3N0L3J0cC9nc3RydHBzYmNwYXkuaDoKKwkgIHJ0cHNiY3BheTogUmVtb3ZlIHdvcmthcm91bmQgZm9yIGNvbXBpbGVyIHdhcm5pbmdzCisKKzIwMTAtMDUtMTkgMTY6NTk6MzAgKzAyMDAgIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKworCSogZ3N0L3J0cC9nc3RydHBzYmNwYXkuYzoKKwkgIHJ0cHNiY3BheTogQWRkIHByYWdtYSBiYXNlZCB3b3JrYXJvdW5kIGZvciBHU3RyZWFtZXIgd2FybmluZ3MKKworMjAxMC0wMS0wMSAxNzowODoxNyAtMDgwMCAgTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPgorCisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzYmNwYXkuaDoKKwkgIHJ0cHNiY3BheTogVXBkYXRlIGNvcHlyaWdodCBpbmZvcm1hdGlvbgorCisyMDA5LTAxLTMwIDAwOjMxOjE1ICswMTAwICBNYXJjZWwgSG9sdG1hbm4gPG1hcmNlbEBob2x0bWFubi5vcmc+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjcGF5LmM6CisJICBydHBzYmNwYXk6IEZpeCBzaWduZWQvdW5zaWduZWQgY29tcGFyaXNvbiBpc3N1ZSB3aXRoaW4gR1N0cmVhbWVyIHBsdWdpbgorCisyMDA5LTAxLTAxIDE5OjMzOjIwICswMTAwICBNYXJjZWwgSG9sdG1hbm4gPG1hcmNlbEBob2x0bWFubi5vcmc+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5oOgorCSAgcnRwc2JjcGF5OiBVcGRhdGUgY29weXJpZ2h0IGluZm9ybWF0aW9uCisKKzIwMDgtMTItMjMgMDU6MjU6NTAgKzAxMDAgIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKworCSogZ3N0L3J0cC9nc3RydHBzYmNwYXkuaDoKKwkgIHJ0cHNiY3BheTogRmlyc3QgYXR0ZW1wdCBpbiBmaXhpbmcgY29tcGlsZXIgd2FybmluZ3MgKHN0aWxsIG5lZWRzIGNsZWFudXApCisKKzIwMDgtMTItMjAgMjE6NDI6NDkgKzAyMDAgIEpvaGFuIEhlZGJlcmcgPGpvaGFuLmhlZGJlcmdAbm9raWEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5jOgorCSAgcnRwc2JjcGF5OiBNb3JlIGNvZGluZyBzdHlsZSBmaXhlcworCisyMDA4LTAyLTI5IDE5OjM3OjE1ICswMDAwICBMdWl6IEF1Z3VzdG8gdm9uIERlbnR6IDxsdWl6LmRlbnR6QG9wZW5ib3NzYS5vcmc+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjcGF5LmM6CisJICBydHBzYmNwYXk6IFJlbW92ZSBwb3NzaWJsZSBleHRyYSBtZW1jcHkgZm9yIGdzdHJlYW1lciBwbHVnaW4uCisKKzIwMDgtMDItMjggMTk6Mzg6NTMgKzAwMDAgIEx1aXogQXVndXN0byB2b24gRGVudHogPGx1aXouZGVudHpAb3BlbmJvc3NhLm9yZz4KKworCSogZ3N0L3J0cC9nc3RydHBzYmNwYXkuYzoKKwkgIHJ0cHNiY3BheTogRml4IGJ1ZyBzZW5kaW5nIGVtcHR5IHBhY2thZ2VzIGFuZCByZW1vdmUgYSBidWZmZXIgY29weS4KKworMjAwOC0wMi0yMCAxMzozNzowMCArMDAwMCAgTHVpeiBBdWd1c3RvIHZvbiBEZW50eiA8bHVpei5kZW50ekBvcGVuYm9zc2Eub3JnPgorCisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5jOgorCSAgcnRwc2JjcGF5OiBGaXggcnVudGltZSB3YXJuaW5ncyBvZiBnc3RyZWFtZXIgcGx1Z2luLgorCisyMDA4LTAyLTE5IDE5OjQ5OjI0ICswMDAwICBMdWl6IEF1Z3VzdG8gdm9uIERlbnR6IDxsdWl6LmRlbnR6QG9wZW5ib3NzYS5vcmc+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjcGF5LmM6CisJICBydHBzYmNwYXk6IFVwZGF0ZSBnc3RyZWFtZXIgcGx1Z2luIHRvIHVzZSBuZXcgc2JjIEFQSS4KKworMjAwOC0wMi0wMiAwMzozNzowNSArMDAwMCAgTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPgorCisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzYmNwYXkuaDoKKwkgIHJ0cHNiY3BheTogVXBkYXRlIGNvcHlyaWdodCBpbmZvcm1hdGlvbgorCisyMDA4LTAxLTMwIDE0OjIxOjQzICswMDAwICBMdWl6IEF1Z3VzdG8gdm9uIERlbnR6IDxsdWl6LmRlbnR6QG9wZW5ib3NzYS5vcmc+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjcGF5LmM6CisJICBydHBzYmNwYXk6IEZpeGVzIGdzdHJlYW1lciBjYXBzIGFuZCBjb2RlIGNsZWFudXAuCisKKzIwMDgtMDEtMjQgMTQ6MjU6MjkgKzAwMDAgIEx1aXogQXVndXN0byB2b24gRGVudHogPGx1aXouZGVudHpAb3BlbmJvc3NhLm9yZz4KKworCSogZ3N0L3J0cC9nc3RydHBzYmNwYXkuYzoKKwkgIHJ0cHNiY3BheTogRml4IGd0cmVhbWVyIHBheWxvYWRlciBzZW5kaW5nIGZyYWdtZW50ZWQgZnJhbWVzLgorCisyMDA4LTAxLTIzIDE5OjE3OjMzICswMDAwICBMdWl6IEF1Z3VzdG8gdm9uIERlbnR6IDxsdWl6LmRlbnR6QG9wZW5ib3NzYS5vcmc+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5oOgorCSAgcnRwc2JjcGF5OiBGaXggdXNlIG9mIGdzdHJlYW1lciBwbHVnaW4gd2l0aCByaHl0aG1ib3ggYW5kIGJhbnNoZWUgYW5kIHJ0cCB0aW1lc3RhbXBzLgorCisyMDA4LTAxLTIzIDEzOjE0OjAyICswMDAwICBMdWl6IEF1Z3VzdG8gdm9uIERlbnR6IDxsdWl6LmRlbnR6QG9wZW5ib3NzYS5vcmc+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5oOgorCSAgcnRwc2JjcGF5OiBNYWtlIGEyZHBzaW5rIHRvIGFjdCBsaWtlIGEgYmluIGFuZCBzcGxpdCB0aGUgcGF5bG9hZGVyLgorCisyMDEzLTAxLTA4IDE2OjI3OjQyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHA6IHNtYWxsIGltcHJvdmVtZW50cworCisyMDEzLTAxLTA3IDE1OjUwOjMzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogcmVmYWN0b3IgaGFuZGxlIHN5bmMgY29kZQorCSAgTW92ZSB0aGUgY29kZSB0aGF0IGNvbWJpbmVzIHRoZSBsYXN0IFNSIHBhY2tldCBhbmQgdGhlIGN1cnJlbnQgaml0dGVyYnVmZmVyIHN5bmMKKwkgIHZhbHVlcyBpbnRvIGEgc3luYyBzdHJ1Y3R1cmUsIGludG8gaXRzIG93biBmdW5jdGlvbi4gV2Ugd2FudCB0byByZXVzZSB0aGlzIGJpdAorCSAgbGF0ZXIuCisKKzIwMTMtMDEtMDcgMTU6NDU6MTAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cDogaW5jbHVkZSBkb3duc3RyZWFtIGxhdGVuY3kgaW4gU1IgY2FsY3VsYXRpb25zCisJICBXaGVuIHdlIG1ha2UgYSBtYXBwaW5nIGJldHdlZW4gYW4gUlRQIHRpbWVzdGFtcCBhbmQgYW4gTlRQIHRpbWVzdGFtcCwgaW5jbHVkZQorCSAgdGhlIGRvd25zdHJlYW0gbGF0ZW5jeSBhcHBsaWVkIHRvIHRoZSBzaW5rcy4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBoYXZlCisJICBib3RoIHNpbmtzIHJ1biB3aXRoIGRpZmZlcmVudCBsYXRlbmNpZXMgYW5kIHN0aWxsIGhhdmUgY29ycmVjdCBzeW5jIG9uIHRoZQorCSAgY2xpZW50LiBJdCBhbHNvIGlzIG1vcmUgY29ycmVjdCBiZWNhdXNlIHRoZSBSVFAgdGltZXN0YW1wIGluIHRoZSBTUiByZXBvcnQgd2lsbAorCSAgYWN0dWFsbHkgY29ycmVzcG9uZCBtb3JlIGNsb3NlbHkgdG8gdGhlIE5UUCB0aW1lIGl0IHdhcyBzZW50IG9uIHRoZSBzZXJ2ZXIuCisJICBGb3IgcGlwZWxpbmVzIHdpdGggaGlnaCBsYXRlbmN5IG9uIHRoZSBzZW5kZXIgc2lkZSwgdGhpcyBhY3R1YWxseSBhbGxvd3MgYQorCSAgR1N0cmVhbWVyIHJlY2VpdmVyIHRvIHBlcmZvcm0gc3luY2hyb25pc2F0aW9uIGluc3RlYWQgb2YgZHJvcHBpbmcgdGhlIFJUQ1AKKwkgIHBhY2tldHMuCisKKzIwMTMtMDEtMDcgMTQ6MjU6MTQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGRvbid0IGNhc3QgZXZlbnQgZnVuY3Rpb25zCisJICBUaGVyZSBpcyBubyBuZWVkIHRvIGNhc3QgdGhlIGV2ZW50IGZ1bmN0aW9ucyBhbmQgb25seSBjYXVzZXMgcHJvYmxlbXMgbGF0ZXIgd2hlbgorCSAgd2UgY2hhbmdlIHRoZSBzaWduYXR1cmUgbGF0ZXIgYW5kIHRoaW5ncyBzaWxlbnRseSBjb21waWxlcyB3cm9uZyBjb2RlLgorCisyMDEzLTAxLTA3IDE0OjIzOjM0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHA6IG1vcmUgZGVidWcKKworMjAxMy0wMS0wNyAxNDoyMjo0OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogaW1wcm92ZSBkZWJ1ZworCisyMDEzLTAxLTAyIDAwOjAzOjI3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBzYW5pdHkgY2hlY2sgc2l6ZSBvZiBhdmFpbGFibGUgcGFja2V0IGRhdGEgZm9yIHJlYWRpbmcgdG8gYXZvaWQgbWVtb3J5IHdhc3RlCisJICBPbiBXaW5kb3dzIGFuZCBPUy9YLCBfZ2V0X2F2YWlsYWJsZV9ieXRlcygpIG1heSBub3QgcmV0dXJuIHRoZSBzaXplCisJICBvZiB0aGUgbmV4dCBwZW5kaW5nIHBhY2tldCwgYnV0IHRoZSBzaXplIG9mIGFsbCBwZW5kaW5nIHBhY2tldHMgaW4KKwkgIHRoZSBrZXJuZWwtc2lkZSBidWZmZXIsIHdoaWNoIG1pZ2h0IGJlIHJhdGhlciBsYXJnZSBkZXBlbmRpbmcgb24KKwkgIGNvbmZpZ3VyYXRpb24uIFNhbml0eS1jaGVjayB0aGUgc2l6ZSByZXR1cm5lZCBieSBfZ2V0X2F2YWlsYWJsZV9ieXRlcygpCisJICB0byBtYWtlIHN1cmUgd2UgbmV2ZXIgYWxsb2NhdGUgbW9yZSBtZW1vcnkgdGhhbiB0aGUgbWF4LiBzaXplIGZvcgorCSAgYSBwYWNrZXQsIGlmIGl0J3MgYW4gSVB2NCBzb2NrZXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjEwMzY0CisKKzIwMTMtMDEtMDQgMTA6MDM6MzIgKzAxMDAgIFJvYmVydCBLcmFrb3JhIDxyb2Iua3Jha29yYUBtZXNzYWdlbmV0c3lzdGVtcy5jb20+CisKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDI6IEFsc28gaGFuZGxlIHRoZSBuZXcgRU5PRU5UIHJldHVybiB2YWx1ZSBvZiBWSURJT0NfUVVFUllDVFJMCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkxMDk4CisKKzIwMTMtMDEtMDEgMTk6MTQ6MzYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6CisJICB0ZXN0czogYWRkIHRlc3QgZm9yIHNvdXBodHRwc3JjIGVycm9yIGhhbmRsaW5nIHdpdGggZGF0YQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3ODQyOQorCisyMDEyLTA2LTIyIDIxOjU2OjUyICswMDAwICBOb3JiZXJ0IFdhc2NoYnVlc2NoIDxud2FzY2hidUBvcGVudHYuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IGVycm9yIG91dCBwcm9wZXJseSB3aGVuIHJlY2VpdmluZyBkYXRhIGFsb25nIHdpdGggYW4gZXJyb3Igc3RhdHVzCisJICBXaGVuIHJlY2VpdmluZyBhbiBlcnJvciBjb2RlIGZyb20gdGhlIGh0dHAgc2VydmVyLCBzdWNoIGFzIDQwNCwKKwkgIGRhdGEgbWlnaHQgYmUgc2VudCBhbG9uZyB3aXRoIGl0LCBsaWtlIGEgd2ViIHBhZ2UuIFdlIGRvbid0IHdhbnQKKwkgIHRvIG91dHB1dCB0aGF0IGRhdGEgaW4gdGhpcyBjYXNlLCBhbmQgd2UgYWxzbyB3YW50IHRvIHBhc3MgdGhlCisJICBGTE9XX0VSUk9SIHJldHVybiBiYWNrIHRvIHRoZSBiYXNlIGNsYXNzLCBzbyBpdCBjYW4gc3RvcCBwcm9wZXJseS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Nzg0MjkKKworMjAxMy0wMS0wMSAxMjoyMDoyMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgZG9jczogdXBkYXRlIGZvciBuZXcgcnRzcHNyYyBwcm94eS1pZCBhbmQgcHJveHktcHcgcHJvcGVydGllcworCisyMDEzLTAxLTAxIDEyOjE5OjIzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSAgZG9jczogZml4IGRvY3MgYnVpbGQgYW5kIHVwZGF0ZSBhZnRlciByZW1vdmFsIG9mIG9sZCBjYWlybyBlbGVtZW50cworCisyMDEzLTAxLTAxIDEyOjEyOjAyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBleHQvY2Fpcm8vTWFrZWZpbGUuYW06CisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm8uYzoKKwkqIGV4dC9jYWlyby9nc3RjYWlyb3JlbmRlci5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmg6CisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzoKKwkqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5oOgorCSogZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5LmM6CisJKiBleHQvY2Fpcm8vZ3N0dGltZW92ZXJsYXkuaDoKKwkgIGNhaXJvOiByZW1vdmUgb2xkIGNhaXJvLWJhc2VkIHRleHQgcmVuZGVyZXJpbmcgZWxlbWVudAorCSAgVGhleSBoYXZlbid0IHdvcmtlZCB3ZWxsIG9yIGF0IGFsbCBpbiBhIHZlcnkgbG9uZyB0aW1lCisJICBhbmQgd2VyZSByYXRoZXIgYml0LXJvdHRlbiwgYW5kIHRoZXJlJ3Mgbm8gbmVlZCBmb3IgdGhlbQorCSAgYW55IG1vcmUuCisKKzIwMTMtMDEtMDEgMTE6NTI6MDkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9jYWlyby8uZ2l0aWdub3JlOgorCSogZXh0L2NhaXJvL01ha2VmaWxlLmFtOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvLW1hcnNoYWwubGlzdDoKKwkqIGV4dC9jYWlyby9nc3RjYWlyby5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvb3ZlcmxheS5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvb3ZlcmxheS5oOgorCSogdGVzdHMvZXhhbXBsZXMvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9leGFtcGxlcy9jYWlyby9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL2NhaXJvL2NhaXJvX292ZXJsYXkuYzoKKwkgIGNhaXJvOiBwb3J0IGNhaXJvb3ZlcmxheSB0byAwLjExCisJICBUaGUgb3RoZXIgZWxlbWVudHMgYXJlIG5vdCB0aGF0IGludGVyZXN0aW5nIG5vdyB0aGF0IHdlJ3JlCisJICB1c2luZyBwYW5nb2NhaXJvIGluIHRoZSBwYW5nbyBwbHVnaW4sIGFuZCBzaG91bGQgcHJvYmFibHkKKwkgIGp1c3QgYmUgcmVtb3ZlZC4KKworMjAxMi0xMi0zMSAxODo1OToxOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1kZWNvZGViaW4tSDI2M3AtQU1SLnNoOgorCSAgZXhhbXBsZXM6IGNoZWNrIGZvciB1cmkgYXJndW1lbnQgaW4gZGVjb2RlYmluLWgyNjRwLWFtciBzZXJ2ZXIgZXhhbXBsZQorCSAgT3RoZXJ3aXNlIHBlb3BsZSBnZXQgYSByYXRoZXIgY29uZnVzaW5nIGVycm9yIG1lc3NhZ2UuCisKKzIwMTItMTItMzEgMDA6MjI6MjcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IGFkZCAicHJveHktaWQiIGFuZCAicHJveHktcHciIHByb3BlcnRpZXMKKwkgIHRvIG1hdGNoIHNvdXBodHRwc3JjLiB1c2VyL3Bhc3N3b3JkIHBhc3NlZCB2aWEgdGhlIFVSSQorCSAgd2lsbCBzdGlsbCB0YWtlIHByZWNlZGVuY2UgdGhvdWdoLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTM5NTQyNworCisyMDEyLTEyLTI1IDE2OjQ4OjQzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBzeXMvb3NzNC9vc3M0LXNpbmsuYzoKKwkgIG9zczRzaW5rOiBub3RpZnkgInZvbHVtZSIgcHJvcGVydHkgb24gb3BlbiB0byBtYWtlIGFwcHMgcXVlcnkgaW5pdGlhbCB2b2x1bWUKKwkgIFRoZSBpbml0aWFsIHZvbHVtZSBtaWdodCBub3QgYmUgdGhlIHByb3BlcnR5IGRlZmF1bHQsIHNvCisJICBlbWl0IGEgbm90aWZ5IG9uIHRoZSB2b2x1bWUgcHJvcGVydHkgdG8gbWFrZSBhcHBzIGdldAorCSAgYW4gdXAtdG8tZGF0ZSByZWFkaW5nIG9mIHRoZSBjdXJyZW50IHZvbHVtZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MzEwNTMKKworMjAxMi0xMi0yMCAxNzoxMjozMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IGNtZCBjb21wYXJpc29uCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkwNDc2CisKKzIwMTItMTItMjAgMTc6MTI6MjAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGFkZCBzb21lIG1vcmUgZGVidWcKKworMjAxMi0xMi0yMCAxNjo0NDoyNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3JhdzEzOTQvZ3N0MTM5NGNsb2NrLmM6CisJICAxMzk0Y2xvY2s6IG1hcmsgb3VyIGNsb2NrIHR5cGUgYXMgT1RIRVIKKworMjAxMi0xMi0yMCAxNjoxNToxMyArMDEwMCAgSm9uYXMgSG9sbWJlcmcgPGpvbmFzaGdAYXhpcy5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6CisJICB0ZXN0czogYWRkIGpwZWdwYXkgdW5pdCB0ZXN0CisJICBTZWUgYWxzbyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg0OTU1CisKKzIwMTItMTItMjAgMTU6NTU6MDIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuaDoKKwkgIGpwZWdlbmM6IHBhc3MgZmxvd3JldHVybiB1cHN0cmVhbQorCisyMDEyLTA5LTI3IDE1OjQyOjU2ICswMjAwICBKb25hcyBIb2xtYmVyZyA8am9uYXNoZ0BheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBydHBqcGVncGF5OiBoYW5kbGUgd2lkdGggYW5kIGhlaWdodCA+IDIwNDAKKwkgIElmIHdpZHRoIG9yIGhlaWdodCBpcyBncmVhdGVyIHRoYW4gMjA0MCBzZXQgd2lkdGggYW5kIGhlaWdodCB0byB6ZXJvIGluCisJICB0aGUgcnRwIGhlYWRlciBhbmQgYWRkIHgtZGltZW5zaW9ucyB0byBvdXRjYXBzLgorCSAgU29sdmVzICM2ODQ5NTUKKworMjAxMi0xMi0yMCAxMzowMzo0MSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGNsZWFudXAgaW4gZmxhZyBkZWZpbmUKKworMjAxMi0xMi0yMCAxMzowMjo1NyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGltcHJvdmUgZGVidWcKKworMjAxMi0xMi0xOCAxNTo1Njo1OSArMDEwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOgorCSAgd2F2cGFjazogdXNlIGFwcHJvcHJpYXRlIHByaW50ZiBmb3JtYXQgZm9yIGdzaXplCisKKzIwMTItMTItMTggMTU6NTU6NDMgKzAxMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJICB0YWdsaWI6IHVzZSBhcHByb3ByaWF0ZSBwcmludGYgZm9ybWF0IGZvciBnc2l6ZQorCisyMDEyLTEyLTE4IDE1OjU0OjA4ICswMTAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZkZWMuYzoKKwkgIGdka3BpeGJ1ZjogdXNlIGFwcHJvcHJpYXRlIHByaW50ZiBmb3JtYXQgZm9yIGdzaXplCisKKzIwMTItMTItMTggMTU6NTE6NDYgKzAxMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkgIHJ0cDogdXNlIGFwcHJvcHJpYXRlIHByaW50ZiBmb3JtYXQgZm9yIGdzaXplCisKKzIwMTItMTItMTggMTU6NDY6NTYgKzAxMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IHVzZSBhcHByb3ByaWF0ZSBwcmludGYgZm9ybWF0IGZvciBnc2l6ZQorCisyMDEyLTEyLTE3IDE2OjM1OjU2ICswMTAwICBQaGlsaXBwZSBOb3JtYW5kIDxwaGlsbkBpZ2FsaWEuY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmg6CisJICBpbnRlcmxlYXZlOiBzZXQgc3JjIHBhZCBjYXBzIHVwb24gbGFzdCBzaW5rIHBhZCBDQVBTIGV2ZW50CisJICBHYXRoZXIgY2FwcyBvbiBhbGwgc2luayBwYWRzIGJlZm9yZSBzZXR0aW5nIHRoZSBzcmMgcGFkIGNhcHMuIFRoaXMgaXMKKwkgIHNwZWNpYWxseSBuZWVkZWQgd2hlbiB0aGUgYXVkaW8gY2hhbm5lbCBtYXBwaW5nIGlzIHNldCBvbiB0aGUgc2luaworCSAgcGFkcyBhbmQgdGhlIGVsZW1lbnQgbmVlZHMgdG8gcHJlc2VydmUgaXQgb24gaXRzIHNyYyBwYWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkwMjY3CisKKzIwMTItMTItMTcgMjI6NTU6MTIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWF0cm9za2FkZW11eDogc2tpcCBlbXB0eSB0YWdzCisJICBpbnN0ZWFkIG9mIHRyeWluZyB0byBhZGQgdGFncyB3aXRoIGVtcHR5IHN0cmluZ3MsIHdoaWNoCisJICBjYXVzZXMgY3JpdGljYWxzIGF0IHJ1bnRpbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkwMzU4CisKKzIwMTItMTItMTcgMTU6MTc6MTIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2VyczogTWFrZSBzdXJlIHRoZSBjYXBzIGFyZSBhY3R1YWxseSB3cml0YWJsZSBiZWZvcmUgY2hhbmdpbmcgdGhlbQorCisyMDEyLTEyLTE3IDE1OjAxOjAyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IFVzZSB0aGUgcGVlciBjYXBzIGZvciByZXN0cmljdGlvbnMgaW5zdGVhZCBvZiB0aGUgc3JjcGFkIGFsbG93ZWQgY2FwcworCSAgT3RoZXJ3aXNlIHdlIHdpbGwgaW50ZXJzZWN0IHdpdGggdGhlIHNyY3BhZCB0ZW1wbGF0ZSBjYXBzIGFuZCBhZGQgYWxsIHRoZSBjYXBzIGZpZWxkcworCSAgdGhhdCB0aGUgcGFyc2VyIHdpbGwgZXZlciBzZXQsIG5vIG1hdHRlciBpZiBkb3duc3RyZWFtIHJlc3RyaWN0cyB0aGlzIGZpZWxkIG9yIG5vdC4KKwkgIFRoaXMgcmVxdWlyZXMgdXBzdHJlYW0gdG8gc2V0IHRoaXMgZmllbGQgb24gdGhlIGNhcHMgdG8gc3VjY2Vzc2Z1bGx5IG5lZ290aWF0ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTAxODQKKworMjAxMi0xMi0xNCAyMjoyNTowOCArMDAwMCAgS29vcCBNYXN0IDxrd21AcmFpbmJvdy1ydW5uZXIubmw+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIHY0bDI6IFRlYWNoIHdoZXJlIHRoZSB2aWRlb2RldjIuaCBoZWFkZXIgbGl2ZXMgb24gZnJlZWJzZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTAyMzMKKworMjAxMi0xMi0xNiAyMzoyNzo0MSArMDAwMCAgQWxleGV5IEZpc2hlciA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogc2V0IGFwcHJvcHJpYXRlIGJsb2NrIGhlYWRlciBmbGFnIGZvciBWUDggaW52aXNpYmxlIGZyYW1lcworCSAgVXNlZnVsIGZvciBkZWJ1Z2dpbmcgbW9zdGx5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1NDI1OQorCisyMDEyLTEyLTE2IDE1OjI1OjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJICBkb2NzOiBhZGQgcnRwbXV4IGFuZCBydHBkdG1mbXV4IHRvIHBsdWdpbiBkb2NzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjI5MTE3CisKKzIwMTItMTItMTYgMTU6MTM6MzggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbWFuYWdlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkgIHJ0cG1hbmFnZXI6IG1vdmUgcnRwbXV4IGFuZCBydHBkdG1mbXV4IGVsZW1lbnRzIGZyb20gLWJhZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYyOTExNworCisyMDEyLTExLTAzIDIwOjM4OjAwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4Lmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cG11eC5jOgorCSAgcnRwbXV4OiBGaXggRlNGIGFkZHJlc3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc1MjAKKworMjAxMi0xMC0xNyAxNzozNDoyNiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBVc2UgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSgpCisJICB3aGVyZSBwb3NzaWJsZS4gQXZvaWRzIHNvbWUgc3RyaW5nIGNvcGllcy4gQWxzbyByZS1pbmRlbnQKKwkgIHNvbWUgc3R1ZmYuIEFsc28gc29tZSBpbmRlbnQgZml4ZXMgaGVyZSBhbmQgdGhlcmUuCisKKzIwMTItMDktMTAgMjA6Mzg6MTQgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwbXV4LmM6CisJICBydHBtdXg6IE1pc2MgZml4IGZvciAwLjExCisJICBDb252ZXJ0IHRoZSBpbmNvbWluZyBjYXBzIGJlZm9yZSBwcm94eWluZyB0aGVtCisJICBDbGVhciB0aGUgbGFzdF9wYWQgd2hlbiBnb2luZyB0byByZWFkeQorCSAgdGVzdHM6IEltcGxlbWVudCBhY2NlcHRfY2FwcywgZG9uJ3QgbGVhayBldmVudAorCisyMDEyLTA3LTE3IDE2OjM5OjAyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogdXBkYXRlIGZvciBSVFAgYnVmZmVyIGFwaSBjaGFuZ2VzCisKKzIwMTItMDQtMDUgMTg6MDI6NTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXhlci5jOgorCSAgcnRwbXV4OiBVcGRhdGUgZm9yIEdTVF9QTFVHSU5fREVGSU5FKCkgQVBJIGNoYW5nZXMKKworMjAxMi0wNC0wMiAxMTowNzoxOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IGZpeCBjb21waWxhdGlvbgorCisyMDEyLTAzLTExIDE5OjA2OjU5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogZml4IGZvciBjYXBzIGFwaSBjaGFuZ2VzCisKKzIwMTItMDEtMjYgMDY6NTg6NDYgLTA1MDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBGaXggY29tcGlsZXIgd2FybmluZ3MKKworMjAxMi0wMS0yOSAxODowMTowNSArMDAwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IFVucmVmIG5vbi1mb3J3YXJkZWQgZXZlbnRzCisJICBBbHNvLCBkb24ndCB1bnJlZiBmb3J3YXJkZWQgb25lcworCisyMDEyLTAxLTI4IDE2OjU3OjAzICswMDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogcmVzeW5jIGl0ZXJhdG9yIG9uIHJlc3luYworCisyMDEyLTAxLTI3IDEyOjA4OjUyICswMTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5oOgorCSAgcnRwbXV4OiBSZS1wdXNoIHN0aWNreSBldmVudHMgb24gaW5wdXQgcGFkIGNoYW5nZQorCisyMDEyLTAxLTI1IDE1OjQzOjAxICswMTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogRG9uJ3QgbGVhayBndmFsdWUgZnJvbSBpdGVyYXRvcgorCisyMDEyLTAxLTI1IDE2OjQ2OjQ0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogbW9yZSBwb3J0aW5nCisKKzIwMTItMDEtMjQgMTQ6MjA6NTIgKzAxMDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4Lmg6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBtdXguYzoKKwkgIHJ0cG11eDogcG9ydCB0byAwLjExCisKKzIwMTEtMTEtMDQgMTI6MjI6MzcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBtYWtlIHJlcXVlc3QgcGFkcyB0YWtlIF8ldQorCisyMDExLTA0LTE0IDE0OjM0OjI2IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4Lmg6CisJICBydHBkdG1mbXV4OiBBZGQgbGFzdC1zdG9wIHRvIGR0bWYtZXZlbnQgdXBzdHJlYW0gZXZlbnRzCisJICBBZGQgdGhlIHJ1bm5pbmcgdGltZSBvZiB0aGUgbGFzdCBvdXRwdXR0ZWQgYnVmZmVyIHRvIHRoZQorCSAgdXBzdHJlYW0gImR0bWYtZXZlbnQiIGV2ZW50cyBzbyB0aGF0IHRoZSBkdG1mIHNvdXJjZSBkb2VzIG5vdAorCSAgbGVhdmUgYSBnYXAuCisKKzIwMTAtMTEtMjUgMTk6MjE6MTEgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBSZW1vdmUgZGVhZCBhc3NpZ25tZW50cworCisyMDEwLTEwLTE5IDEzOjQzOjE0ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBhZGQgbWlzc2luZyBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIGZsYWdzCisJICBDYW5vbmljYWxpemUgcHJvcGVydHkgbmFtZXMgYXMgbmVlZGVkLgorCisyMDEwLTA5LTMwIDE2OjA3OjI5IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBJbXByb3ZlIGRvY3VtZW50YXRpb24KKwkgIEFkZCBhbiBleGFtcGxlIHBpcGVsaW5lLCBhbmQgdHJ5IHRvIGV4cGxhaW4gYSBiaXQgbW9yZSB3aGF0IGl0IGRvZXMuCisKKzIwMTAtMDktMjQgMTM6Mjk6NTUgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSAgcnRwZHRtZm11eDogcmVtb3ZlIHVudXNlZCB2YXJpYWJsZQorCisyMDEwLTA5LTI0IDEzOjI1OjIyICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkgIHJ0cGR0bWZtdXg6IHJlbW92ZSB1bnVzZWQgc2lnbmFsIGJvaWxlcnBsYXRlCisKKzIwMTAtMDktMjQgMTM6MjQ6NDggKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IG5vIG5lZWQgdG8gcmVmIHBhZCBpbiBfY2hhaW4oKQorCisyMDEwLTA4LTI1IDIyOjU2OjAzIC0wNDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogVW5sb2NrIHRoZSByaWdodCBtdXRleAorCSAgVGhlIG11dGV4IGxvY2tlZCBpcyBmb3IgdGhlICdtdXgnIG9iamVjdCwgYnV0IHdlIHVubG9jayB0aGUKKwkgIHBhZCwgd2hpY2ggbWVhbnMgdGhhdCBpZiB0aGUgcnRwbXV4IGdldHMgYSBmbHVzaCwgdGhlbiB0aGUKKwkgIG9iamVjdCBsb2NrIHdpbGwgc3RheSBsb2NrZWQgZm9yZXZlciwgY2F1c2luZyBpdCB0byBmcmVlemUKKwkgIHRoZSBuZXh0IHRpbWUgaXQgdHJpZXMgdG8gdGFrZSBpdC4KKwkgIEZpeGVzIGJ1ZyAjNjI3OTkxCisKKzIwMTAtMDctMDEgMTU6MTk6MTIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkgIHJ0cG11eDogQWRkIHN1cHBvcnQgZm9yIEdzdEJ1ZmZlckxpc3QKKwkgIEZhY3RvciBvdXQgbW9zdCBvZiB0aGUgYnVmZmVyIGhhbmRsaW5nIGFuZCBpbXBsZW1lbnQgYSBjaGFpbl9saXN0CisJICBmdW5jdGlvbi4gQWxzbywgdGhlIERUTUYgbXV4ZXIgaGFzIGJlZW4gbW9kaWZpZWQgdG8ganVzdCBoYXZlIGEKKwkgIGZ1bmN0aW9uIHRvIGFjY2VwdCBvciByZWplY3QgYSBidWZmZXIgaW5zdGVhZCBvZiBoYXZpbmcgdG8gc3ViY2xhc3MKKwkgIGJvdGggY2hhaW4gYW5kIGNoYWluX2xpc3QuCisKKzIwMTAtMDctMDEgMTU6MTU6NDkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IERvbid0IGxlYWsgaW52YWxpZCBidWZmZXJzCisKKzIwMTAtMDYtMDMgMTA6NDM6MjAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJICBydHBtdXg6IGZpeCBtaXNzaW5nIGRlYnVnIGxvZyBtZXNzYWdlIGFyZ3VtZW50CisKKzIwMTAtMDUtMTAgMTg6Mzc6NTUgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSAgcnRwZHRtZm11eDogQWRkIHNvbWUgZGVidWcgbWVzc2FnZXMKKworMjAxMC0wNS0wNyAxODo1Njo1NyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4Lmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5oOgorCSAgcnRwZHRtZm11eDogUmVtb3ZlIHN0cmVhbS1sb2NrIGV2ZW50IGhhbmRsaW5nCisKKzIwMTAtMDUtMDcgMTg6NTQ6NDkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSAgcnRwZHRtZm11eDogVXBkYXRlIGRvYyBmb3Igc2ltcGxpZmljYXRpb24KKworMjAxMC0wNS0wNyAxODo0MDozMCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBtdXguYzoKKwkgIHRlc3RzOiBDaGFuZ2UgdGVzdHMgdG8gbm90IHVzZSB0aGUgcHJpb3JpdHkgcGFkcyBpbnN0ZWFkIG9mIHRoZSBldmVudHMKKworMjAxMC0wNS0wNiAxOTo1MTo1OSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4Lmg6CisJICBydHBkdG1mbXV4OiBEcm9wIGJ1ZmZlcnMgb24gbm9uLXByaW9yaXR5IHNpbmtzIHdoZW4gc29tZXRoaW5nIGlzIGluY29taW5nIG9uIHRoZSBwcmlvcml0eSBzaW5rCisKKzIwMTAtMDUtMDYgMTg6MTE6NDAgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkgIHJ0cGR0bWZtdXg6IEFkZCBwcmlvcml0eSBzaW5rIHBhZHMKKworMjAxMC0wNS0wNyAxNzoxNTo0NyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJICBydHBkdG1mbXV4OiBDbGVhbnVwIGV2ZW50IGZ1bmN0aW9uCisKKzIwMTAtMDUtMDcgMTY6NDI6MjIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cG11eC5jOgorCSAgcnRwbXV4OiBBZ2dyZWdhdGUgaW5jb21pbmcgc2VnbWVudHMKKworMjAxMC0wNS0wNiAxOTowOTo0OCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJICBydHBkdG1mbXV4OiBVcGRhdGUgZG9jdW1lbnRhdGlvbgorCisyMDEwLTA1LTA2IDE4OjEwOjQ1IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4Lmg6CisJICBydHBtdXg6IFNpbXBsaWZ5IHJlcXVlc3QgcGFkIGNyZWF0aW9uCisKKzIwMTAtMDMtMjEgMjE6Mzk6MTggKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwbXV4LmM6CisJICBBZGQgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV21pc3NpbmctcHJvdG90eXBlcyB0byBjb25maWd1cmUgZmxhZ3MKKwkgIEFuZCBmaXggYWxsIHdhcm5pbmdzCisKKzIwMTAtMDMtMTggMTc6MzA6MjYgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IGdzdF9lbGVtZW50X2NsYXNzX3NldF9kZXRhaWxzID0+IGdzdF9lbGVtZW50X2NsYXNzX3NldF9kZXRhaWxzX3NpbXBsZQorCisyMDA5LTExLTE4IDE2OjM4OjMzICswMTAwICB1bmtub3duIDxoYXZhcmQuZ3JhZmZALmV1LnRhbmRiZXJnLmludD4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IHVwZGF0ZSB0aGUgY3VycmVudF9zc3JjIGZyb20gdGhlIGNhcHMKKwkgIEZpeGVzICM2MDQxMDEKKworMjAwOS0xMi0wOSAxNDo0MjoyMSArMDEwMCAgSMOldmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQHRhbmRiZXJnLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IHJlbGVhc2UgcGFkcyB3aGVuIGRpc3Bvc2luZworCSAgQmVjYXVzZSBvZiBhbiBhbGxvY2F0ZWQgcHJpdiAoR3N0UlRQTXV4UGFkUHJpdmF0ZSksIHRoZSBlbGVtZW50IHdpbGwKKwkgIGxlYWsgbWVtb3J5IGlmIG5vdCBnc3RfcnRwX211eF9yZWxlYXNlX3BhZCgpIGlzIGNhbGxlZC4gVGhpcyB3b3VsZAorCSAgcHJldmlvdXNseSBvbmx5IGhhcHBlbiBpZiByZWxlYXNlX3JlcXVlc3RfcGFkKCkgd2FzIGNhbGxlZCBleHBsaWNpdGx5LAorCSAgc29tdGhpbmcgdGhhdCBzaG91bGQgbm90IGJlIG5lY2Nlc2FyeS4KKwkgIEZpeGVzICM2MDQwOTkKKworMjAwOS0xMi0wOSAxMzo0MDo0MyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSAgZHRtZm11eDogbWV0aG9kIG5hbWUgY2xlYW51cHMKKworMjAwOS0xMC0wOCAxOTowNjoyNiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBtdXguYzoKKwkgIHRlc3RzOiBBZGQgdGVzdCBmb3IgcnRwZHRtZm11eCBsb2NraW5nCisKKzIwMDktMDktMjggMTk6NTQ6NTMgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwbXV4LmM6CisJICB0ZXN0czogQWRkIHVuaXQgdGVzdCBmb3IgcnRwbXV4CisKKzIwMDktMDktMjggMTM6MzY6NDQgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IERvbid0IGlnbm9yZSByZXF1ZXN0ZWQgcGFkIG5hbWUKKworMjAwOS0wNy0yOSAxNzoyMzozMSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogUmVtb3ZlIGVtcHR5IGZpbmFsaXplCisKKzIwMDktMDctMjEgMTU6MzE6MzMgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IEZyZWUgdGhlIHBhZCBwcml2YXRlIGRhdGEgb24gcGFkIHJlbGVhc2UKKwkgIEZyZWUgdGhlIHBhZCBwcml2YXRlIGRhdGEgb24gcGFkIHJlbGVhc2UgaW5zdGVhZCBvZiB1c2luZyBhIHdlYWsgcmVmLAorCSAgd2hpY2ggaXMgbm90IHRocmVhZCBzYWZlLiBBbHNvLCBsb2NrIHRoZSBjb250ZW50IG9mIHRoZSBwYWQgcHJpdmF0ZSB1c2luZyB0aGUgZWxlbWVudCdzCisJICBvYmplY3QgbG9jay4KKworMjAwOS0wNC0yOCAxNjoxMDoyMSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogUmVqZWN0IHdyb25nIGNhcHMKKworMjAwOS0wNC0yOCAxNjowMzoxOSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogRml4IGxlYWsgRml4ZWQgYSBsZWFrIGRpc2NvdmVyZWQgYnkgTGF1cmVudCBHbGF5YWwgPHNwZWdsZUB5YWhvby5mcj4KKworMjAwOS0wNC0yOCAxNTo1ODo0MSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogRml4IGxlYWsKKwkgIEZpeGVkIGEgbGVhayBkaXNjb3ZlcmVkIGJ5IExhdXJlbnQgR2xheWFsIDxzcGVnbGVAeWFob28uZnI+CisKKzIwMDktMDQtMjIgMTg6MDE6MDcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IEZpeCB3YXJuaW5nCisKKzIwMDktMDQtMjAgMjA6MDA6MTUgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IFNldCBkaWZmZXJlbnQgY2FwcyBkZXBlbmRpbmcgb24gdGhlIGlucHV0CisKKzIwMDktMDQtMjIgMTY6MjU6MDcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IE9ubHkgZnJlZSBwYWQgcHJpdmF0ZSB3aGVuIHBhZCBpcyBkaXNwb3NlZAorCisyMDA5LTA0LTIwIDE4OjQxOjM5IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBSZW1vdmUgdXNlbGVzcyBjYXBzIG1hbmdsaW5nCisKKzIwMDktMDQtMjAgMTg6MzY6NDIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IFJlbmFtZSB2YXJpYWJsZSBmb3IgbW9yZSBjbGFyaXR5CisKKzIwMDktMDQtMjAgMTc6NDM6MzkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IFVzZSBHU1RfQk9JTEVSUExBVEUKKworMjAwOS0wNC0yMCAxNzo0Mjo0MCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4Lmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogRG8gdGhlIGluY2x1ZGVzIGxvY2FsbHkKKworMjAwOS0wNC0xNSAxMzoyMzowMSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogQWRkIEdTVF9ERUJVR19GVU5DUFRScworCisyMDA5LTA0LTE1IDEzOjE1OjU1IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkgIHJ0cGR0bWZtdXg6IFJlbGVhc2UgbG9ja2VkIHBhZCBvbiByZWxlYXNlX3BhZAorCSAgUmVsZWFzZSB0aGUgc3BlY2lhbCBwYWQgaWYgdGhlIHBhZCBpcyByZW1vdmVkIGZyb20gdGhlIG11eGVyLgorCisyMDA5LTA0LTE1IDEzOjA5OjI3IC0wNDAwICBMYXVyZW50IEdsYXlhbCA8c3BnbGVnbGVAeWFob28uZnI+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkgIHJ0cGR0bWZtdXg6IFJlbGVhc2Ugc3BlY2lhbCBvbiBwYWQgZGlzcG9zZQorCSAgRml4ZXMgIzU3NzY5MAorCisyMDA5LTAyLTI1IDExOjQ1OjA1ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgZG9jczogdmFyaW91cyBkb2MgZml4ZXMKKwkgIE5vIHNob3J0LWRlc2MgYXMgd2UgaGF2ZSB0aGVtIGluIHRoZSBlbGVtZW50IGRldGFpbHMuCisJICBBbHNvIGtlZXAgdGhpbmdzIChNYWtlZmlsZS5hbSBhbmQgc2VjdGlvbnMudHh0KSBzb3J0ZWQuCisJICBSZXdvcmQgYW1iaWdvdXMgcmV0dXJucy4gTm8gdGV4dCBhZnRlciBzaW5jZSBwbGVhc2UuCisKKzIwMDktMDItMTAgMTc6MDI6MjQgKzAwMDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4ZXIuYzoKKwkgIHJ0cG11eDogTW92ZSBydHBtdXggZnJvbSBnc3QtcGx1Z2lucy1mYXJzaWdodCB0byAtYmFkCisKKzIwMDktMDItMjAgMTc6NDU6NTAgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eGVyLmM6CisJICBydHBtdXg6IFJlLWluZGVudCB0byBHc3Qgc3R5bGUKKworMjAwOS0wMi0xMCAxOToxMToxNSArMDAwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogRG9jdW1lbnQgcnRwIG11eGVyIGEgYml0CisKKzIwMDktMDItMjAgMTM6MzA6NDkgLTA1MDAgIExhdXJlbnQgR2xheWFsIDxzcGdsZWdsZUB5YWhvby5mcj4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5oOgorCSAgcnRwbXV4OiBBZGQgc2lnbmFscyBiZWZvcmUgc3RyZWFtIGxvY2sgYW5kIGFmdGVyIHVubG9ja2luZworCisyMDA5LTAyLTE4IDIwOjE4OjQ2IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBMZXQgc3NyYyB0aHJvdWdoIGdldGNhcHMKKworMjAwOS0wMi0xOCAxOTo1ODo1OCAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogUmVuYW1lIGhhdmVfYmFzZSB0byBoYXZlX3RzX2Jhc2UKKworMjAwOS0wMi0xOCAxODoxNDo1MiAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5oOgorCSAgcnRwbXV4OiBQcm90ZWN0IHRoZSBzZXFudW0gd2l0aCBvYmplY3QgbG9jayBpbiBydHBtdXgKKworMjAwOS0wMi0xOCAxODowNzo0NCAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkgIHJ0cG11eDogUmVtb3ZlIHVudXNlZCBzaW5rX3RzX2Jhc2UKKworMjAwOS0wMi0xOCAxNToyMDo1OCAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogSGF2ZSBnZXRjYXBzIHRvIGZvcmNlIHRoZSBzYW1lIGNsb2NrcmF0ZSBvbiBhbGwgcGFkcworCisyMDA5LTAyLTE4IDE3OjA1OjEzIC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBWYWxpZGF0ZSBSVFAgZGF0YSBpbiBSVFAgTXV4CisKKzIwMDktMDItMTggMTQ6MTY6MDAgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkgIHJ0cG11eDogUmVtb3ZlIHVudXNlZCBjbG9jay1yYXRlIHByb3BlcnR5CisKKzIwMDktMDItMTggMTM6NTY6MzYgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5oOgorCSAgcnRwbXV4OiBDbGFyaWZ5IGxvY2tpbmcgaW4gcnRwZHRtZm11eAorCisyMDA5LTAyLTE4IDEzOjMyOjU2IC0wNTAwICBMYXVyZW50IEdsYXlhbCA8c3BnbGVnbGVAeWFob28uZnI+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBNaXNzaW5nIGZvcm1hdCBwYXJhbWV0ZXIKKworMjAwOC0xMi0wMSAxNzo1NToyMiAtMDUwMCAgSMOldmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQHRhbmRiZXJnLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IFVwZGF0ZSBzZXFudW0gYmFzZSBpbiBydHAgbXV4ZXIKKwkgIFdpdGggaGVscCBmcm9tIFdpbQorCisyMDA4LTEyLTAxIDE3OjU0OjU4IC0wNTAwICBIw6V2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAdGFuZGJlcmcuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogRml4IHNvbWUgbW9yZSBsZWFrcworCisyMDA4LTEyLTAxIDE3OjQ4OjI5IC0wNTAwICBIw6V2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAdGFuZGJlcmcuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJICBydHBtdXg6IEZpeCBsZWFrCisKKzIwMDgtMDktMjkgMTU6MDM6MDUgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IERvbid0IHVucmVmIGNhcHMgd2UgZG9uJ3Qga25vdyAodGhhbmtzIFdpbSkKKworMjAwOC0wOC0xMiAxMjo0ODowMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogUHV0IHBlci1idWZmZXIgZGVidWcgYXQgbGV2ZWwgTE9HCisKKzIwMDgtMDgtMTIgMTI6NDc6MTQgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IE1ha2UgZGVidWcgcHJpbnQgYWNjdXJhdGUKKworMjAwOC0wOC0xMiAxMjo0NjoyMyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogU2V0IG91ciBjYXBzIG9uIHRoZSBidWZmZXJzCisKKzIwMDgtMDgtMTIgMTI6NDY6MDcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IFRha2UgdGhlIGNsb2NrLWJhc2Ugc3RvcmVkIGZyb20gdGhlIGxhc3Qgc2V0Y2FwcworCisyMDA4LTA4LTEyIDEyOjQxOjU5IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBTdG9yZSB0aGUgY2xvY2stYmFzZSBvbiBzZXRjYXBzCisKKzIwMDgtMDgtMTIgMTI6MzA6NTIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IEFkZCBwYWRwcml2YXRlIHRvIHRoZSByZXF1ZXN0IHBhZHMKKworMjAwOC0wOC0xMSAyMToyMDowNiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogTWFrZSBpbmRlbnRhdGlvbiBtb3JlIGNvcnJlY3QKKworMjAwOC0wOC0xMSAyMTowNTozNCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogRml4IHR5cG8KKworMjAwOC0wOC0xMSAyMTowMzoyMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogU2V0IHNlcW51bS1iYXNlIGFuZCBjbG9jay1iYXNlIGluIGNhcHMgZnJvbSBydHBtdXhlcgorCisyMDA3LTA4LTE1IDEzOjUwOjM4ICswMDAwICBaZWVzaGFuIEFsaSA8Zmlyc3QubGFzdEBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkgIHJ0cG11eDogbW9yZSBkZWJ1ZworCSAgMjAwNzA4MTUxMzUwMzgtZjNmMWUtOWM3YTU0OTBhNTI1YzZlODc1M2NiMWI4YzAzMzU0ZGY5OTEzMmI1Yy5negorCisyMDA3LTA4LTIwIDE4OjUwOjMyICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogbWlzc2luZyBjb21tZW50CisJICAyMDA3MDgyMDE4NTAzMi00ZjBmNi0wYWI2N2I2YWM0MGRkNGUzNWE4ZmU1M2YzY2I2ZGFmZjY1Y2U0M2I5Lmd6CisKKzIwMDctMDctMTIgMTk6NTM6MzYgKzAwMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogTWFrZSBidWZmZXIgd3JpdGFibGUgYmVmb3JlIHdyaXRpbmcgaW50byBpdAorCSAgMjAwNzA3MTIxOTUzMzYtM2UyZGMtOTFhNWZiNzk3Y2ZhNDkxOWQ0ZTJmOWE3MjhjNmQ2ZmJkM2I4M2Q5My5negorCisyMDA3LTA3LTA2IDIwOjI0OjU5ICswMDAwICBPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IFNldCBwYWRzIGFjdGl2ZSB3aGVuIGFkZGluZyB0aGVtIHRvIGEgcG90ZW50aWFsbHkgcnVubmluZyBlbGVtZW50CisJICAyMDA3MDcwNjIwMjQ1OS0zZTJkYy1hMzczMWY4ODU3MjU1OTRkZWYwYTdiZTk5N2ZjN2IzYTczOWVlOTY3Lmd6CisKKzIwMDctMDYtMDcgMTI6MDE6MjEgKzAwMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogRml4IG11bHRpcGxlIHJlZiBsZWFrcyAocGF0Y2hlcyBieSBTUCBHTEUpCisJICAyMDA3MDYwNzEyMDEyMS0zZTJkYy0wNjFlOWVmN2E0N2IxYjg0ZmE4ZjgwOTJmNGI4YmNjMGU2ZGI4YzhjLmd6CisKKzIwMDctMDUtMjggMTU6MjU6MDUgKzAwMDAgIFplZXNoYW4gQWxpIDxmaXJzdC5sYXN0QG5va2lhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IHNlbmQgZXZlbnQgdG8gYWxsIHNyYyBwYWRzCisJICAyMDA3MDUyODE1MjUwNS1mM2YxZS0wMzkyMTZjNzNkYzkzZjY0YzQ5OTYyYzc3YTAyNTNjYjljZmVjNGQzLmd6CisKKzIwMDctMDUtMjggMTI6Mzc6NDkgKzAwMDAgIFplZXNoYW4gQWxpIDxmaXJzdC5sYXN0QG5va2lhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IHByaW50IGEgd2FybmluZyBpZiByZWNlaXZlIGFuIGVycm9yIGl0ZXJhdGluZyBzaW5rcGFkcworCSAgMjAwNzA1MjgxMjM3NDktZjNmMWUtNGMxZWIzZjUxMWI1NjEwMTQzNjEwYTY1YTk0ZDExN2YyYzNkMjU4MC5negorCisyMDA3LTA1LTI4IDEyOjI4OjA4ICswMDAwICBaZWVzaGFuIEFsaSA8Zmlyc3QubGFzdEBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBkZWFsIHdpdGggYWxsIHRoZSBnc3RfaXRlcmF0b3JfbmV4dCgpIHJldHVybiB2YWx1ZXMKKwkgIDIwMDcwNTI4MTIyODA4LWYzZjFlLWQzMDE2NDRjM2JlNzYzM2VjNmRjNWUyODU5NmU5MzQ2ZDJkYTZhNTAuZ3oKKworMjAwNy0wNS0yNSAxMjozMToxNiArMDAwMCAgWmVlc2hhbiBBbGkgPGZpcnN0Lmxhc3RAbm9raWEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogUmV0dXJuIGNvcnJlY3QgdmFsdWUgZnJvbSB0aGUgZXZlbnQgaGFuZGxlcgorCSAgMjAwNzA1MjUxMjMxMTYtZjNmMWUtMTMxYjM3YjVmNDUyMTYxOGZlMmYxMzIwNDA5YTQ3ZTY1YjM1YWQyZC5negorCisyMDA3LTA1LTI1IDEwOjI3OjA5ICswMDAwICBaZWVzaGFuIEFsaSA8Zmlyc3QubGFzdEBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBWaWxsZSdzIG9yaWdpbmFsIHBhdGNoIHRvIGZpeCB0aGUgdHJhdmVyc2FsIG9mIGR0bWYgZXZlbnQKKwkgIDIwMDcwNTI1MTAyNzA5LWYzZjFlLTZjNDFkMWVmOTM0MDY4YTRmNGU4MTBlN2U5ODFiNDIwMDc1YjBjOTguZ3oKKworMjAwNy0wMy0yOSAxMzo1Mjo1MCArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBTZXQgdGhlIGNvcnJlY3QgdHMtb2Zmc2V0IG9uIHRoZSBnZXRfcHJvcCB2YWx1ZQorCSAgMjAwNzAzMjkxMzUyNTAtNjUwMzUtYTQzZTIyMmQ5MWQ1N2MwYTYxY2IzMjg3NTg2YWFhMjlhYmY3ODY3NC5negorCisyMDA3LTAzLTI5IDEzOjUyOjIzICswMDAwICB6ZWVzaGFuLmFsaUBub2tpYS5jb20gPHplZXNoYW4uYWxpQG5va2lhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IFJlZmFjdG9yaXplIHN0YXRlX2NoYW5nZQorCSAgMjAwNzAzMjkxMzUyMjMtNjUwMzUtMjNhMDEwN2IyZTM5NzcxMGYwMzVjNmU4OGNjMGU0OWI2NWJiNGQ1ZC5negorCisyMDA3LTAzLTI5IDEzOjM2OjIyICswMDAwICB6ZWVzaGFuLmFsaUBub2tpYS5jb20gPHplZXNoYW4uYWxpQG5va2lhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkgIHJ0cG11eDogc2V0IFNTUkMgb24gdGhlIHBhY2tldHMKKwkgIDIwMDcwMzI5MTMzNjIyLTY1MDM1LTFiZTZlMGFhODVhNzEzODlmN2QyNTdiOWNkM2UxM2E3M2Q2Yjc0NWIuZ3oKKworMjAwNy0wMy0yOSAxMzoxOTozNiArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBDb2RlIGNsZWFuLXVwIGFuZCBtb3JlIGRlYnVnIG91dHB1dAorCSAgMjAwNzAzMjkxMzE5MzYtNjUwMzUtOWQ0OTllMjA5ZTBkN2E0MDljM2FhMGQxMDQwNzc4YmFiZjA3NjE3OS5negorCisyMDA3LTAzLTI4IDExOjIyOjE5ICswMDAwICB6ZWVzaGFuLmFsaUBub2tpYS5jb20gPHplZXNoYW4uYWxpQG5va2lhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkgIHJ0cG11eDogVXNlIG93biBjbG9jay1iYXNlCisJICAyMDA3MDMyODExMjIxOS02NTAzNS0xYmE1ZmVmYmM2NTA1OWU5YjBjODYwNTI4YTMxMDYyY2ViNmE3MzMxLmd6CisKKzIwMDctMDMtMjMgMTY6MzE6MzkgKzAwMDAgIHplZXNoYW4uYWxpQG5va2lhLmNvbSA8emVlc2hhbi5hbGlAbm9raWEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5oOgorCSAgcnRwbXV4OiBPbmx5IGFjY2VwdCBSVFAgc3RyZWFtcyB0aGF0IGhhdmUgdGhlIHNhbWUgY2xvY2stcmF0ZQorCSAgMjAwNzAzMjMxNjMxMzktNjUwMzUtZmMwYjE3YjBiOGE3YTA0MWY0ODk5NGM0ZjI2ZTk2NTY4MTY4YmY5NS5negorCisyMDA3LTAzLTIyIDE2OjE1OjUyICswMDAwICB6ZWVzaGFuLmFsaUBub2tpYS5jb20gPHplZXNoYW4uYWxpQG5va2lhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSAgcnRwbXV4OiBTb21lIG1vcmUgY29kZS1jbGVhbnVwcworCSAgMjAwNzAzMjIxNjE1NTItNjUwMzUtYmRhOTYxNjVlMTQ2YjRmMWQ1ZmVhMWNjOTU3NmE3YWIzYWJlYmM5ZS5negorCisyMDA3LTAzLTIyIDE1OjQyOjUxICswMDAwICB6ZWVzaGFuLmFsaUBub2tpYS5jb20gPHplZXNoYW4uYWxpQG5va2lhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IHJldHVybiBuZXdwYWQgaW5zdGVhZCBvZiBOVUxMIGFuZCB3YXJuIGlmIGZhaWxlZCB0byBjcmVhdGUgYSBwYWQKKwkgIDIwMDcwMzIyMTU0MjUxLTY1MDM1LWNkYjY2NTFlNjFjMmViMDIwNWNjOGMyNDY5M2I0M2Y5OGEyZGE3MTguZ3oKKworMjAwNy0wMy0yMiAxMjo0MTozMiArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBSZWZhY3Rvcml6ZSB0aGUgUlRQTXV4IGNvZGUKKwkgIDIwMDcwMzIyMTI0MTMyLTY1MDM1LTBhMzI3ODE0NzU0NmUzM2Y2ODcwOTdhNDNiNzc1YjNmNmFhOTlmOTMuZ3oKKworMjAwNy0wMy0yMiAxMjoxNDo1MyArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkgIHJ0cG11eDogU29tZSBtb3JlIGRvYyBmaXhpbmcKKwkgIDIwMDcwMzIyMTIxNDUzLTY1MDM1LTEyZDYwMjI3MjIxN2I1MWJkOTdkZjRlNTc5MDAyNGMzOTk2MjJkZDMuZ3oKKworMjAwNy0wMy0yMiAxMTozMjoyOCArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkgIHJ0cG11eDogTW9yZSBSZWZhY3RvcmluZworCSAgMjAwNzAzMjIxMTMyMjgtNjUwMzUtYmFlMzRhNzk1OTllN2RlNTI5M2VkNzdiMDIyMzYxY2NmZjgyMmJiOS5negorCisyMDA3LTAzLTIyIDExOjMxOjU0ICswMDAwICB6ZWVzaGFuLmFsaUBub2tpYS5jb20gPHplZXNoYW4uYWxpQG5va2lhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSAgcnRwbXV4OiBNb3JlIGRvY3VtZW50YXRpb24KKwkgIDIwMDcwMzIyMTEzMTU0LTY1MDM1LTYyNDg1MDU0MWE1YjVmYzNkZjIzMTIwNGJlNWE4M2QwNzIzOWRiMjguZ3oKKworMjAwNy0wMy0yMSAxNjozMzoxMSArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkgIHJ0cG11eDogUmVmYWN0b3IgdGhlIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24KKwkgIDIwMDcwMzIxMTYzMzExLTY1MDM1LTk4N2U3ZjI1ZDFhYjUzMzViNzlmNDRiMjc3YWJmMTVlNGUzN2QzMTcuZ3oKKworMjAwNy0wMy0yMSAxNDo1Mjo0NCArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4Lmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXhlci5jOgorCSAgcnRwbXV4OiBBZGQgUlRQRFRNRk11eCBlbGVtZW50CisJICAyMDA3MDMyMTE0NTI0NC02NTAzNS05YTAxMzkwYjBkZWUzMzk4ZTUzMTk5YTFmYTFkOTM1MjAwNGYzMzhlLmd6CisKKzIwMDctMDMtMjEgMTI6MzE6NDkgKzAwMDAgIHplZXNoYW4uYWxpQG5va2lhLmNvbSA8emVlc2hhbi5hbGlAbm9raWEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5oOgorCSAgcnRwbXV4OiBSZW1vdmUgRFRNRi1zcGVjaWZpYyBjb2RlIGZyb20gUlRQIG11eGVyIGFuZCBtYWtlIGl0IGV4dGVuZGFibGUKKwkgIDIwMDcwMzIxMTIzMTQ5LTY1MDM1LWI4YThmNTVmZjc4ZWVkOGNiYjAwNDJlODI3ODg1ZWRmYzU0MzgyNDIuZ3oKKworMjAwNy0wMy0yMCAxMjowNToyNCArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBQdXQgbW9yZSBoZWxwZnVsIGRlc2NyaXB0aW9uCisJICAyMDA3MDMyMDEyMDUyNC02NTAzNS1kYjI3YTdjZjYzMDdiNTExYWViM2Q5OTZkMjZlNzkwZTM2N2E3YmFkLmd6CisKKzIwMDctMDMtMTYgMTU6MTY6NDEgKzAwMDAgIHplZXNoYW4uYWxpQG5va2lhLmNvbSA8emVlc2hhbi5hbGlAbm9raWEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogcmVtb3ZlIHRoZSAoY29tbWVudGVkLW91dCkgY29kZSBmb3IgYmxvY2tpbmcgdGhlIHBhZHMKKwkgIDIwMDcwMzE2MTUxNjQxLTY1MDM1LTAxMjNhZjM4Nzk1MWY4ODU5NDc5N2M3MjJlODgyY2ZlNzAyNDBhZmYuZ3oKKworMjAwNy0wMy0xNiAxMzoxNDo0NCArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBEcm9wIGJ1ZmZlcnMgaW5zdGVhZCBvZiBibG9ja2luZyB0aGUgc2lua3BhZHMKKwkgIDIwMDcwMzE2MTMxNDQ0LTY1MDM1LTljMTM0NWFkOTYxMDg4ODFmNDU1ZDRiNTVhN2Y2MjNjZDMwMmQwZWQuZ3oKKworMjAwNy0wMy0xNCAxNzoxNjoxOCArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBJbXBsZW1lbnQgc3RyZWFtIGxvY2tpbmcsIG5lZWRlZCBmb3IgRFRNRgorCSAgMjAwNzAzMTQxNzE2MTgtNjUwMzUtZTRkMjRiMTYwNmNlMGEzZTJlNzM5ZjAxODMzZjYxZTRkNzU1NWVhYy5negorCisyMDA3LTAzLTE0IDEwOjIwOjU4ICswMDAwICB6ZWVzaGFuLmFsaUBub2tpYS5jb20gPHplZXNoYW4uYWxpQG5va2lhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IHVzZSBHU1RfKl9PQkpFQ1QgaW5zdGVhZCBvZiBnXyoKKwkgIDIwMDcwMzE0MTAyMDU4LTY1MDM1LWUyNDQyODg4ZjJlM2U1YTNhNzY1OWFkNzk1NGE0ZmJhMzQ3NDljZTIuZ3oKKworMjAwNy0wMy0xNCAxMDoxODo1NCArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBObyBuZWVkIHRvIG1hbmFnZSBwYWRzLCBwYXJlbnQgZG9lcyB0aGF0IGZvciB1cworCSAgMjAwNzAzMTQxMDE4NTQtNjUwMzUtZWY1ZjRhYmRlMjI3MTAyYTExMjg4MzVhYjMyNTkwNWVhZTRjMzcyNi5negorCisyMDA3LTAzLTE0IDA5OjAzOjU4ICswMDAwICB6ZWVuaXhAZ21haWwuY29tIDx6ZWVuaXhAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogRml4IGNvcHlyaWdodCBoZWFkZXIKKwkgIDIwMDcwMzE0MDkwMzU4LWQwMTRhLTNhNmQzZWVlYWFmNWNiOGNhM2JjYTZhMzNlOTlhNTUxZjU5OGJkNDguZ3oKKworMjAwNy0wMy0wNyAwODo1MzowNyArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBUaGUgZmlyc3QgaW1wbGVtZW50YXRpb24gb2YgUlRQIG11eGVyCisJICAyMDA3MDMwNzA4NTMwNy02NTAzNS04MzM0MDI0MTNmOTljYjNmOGJlNDg4M2U5MmJhZDRjODcyMjUxMGM5Lmd6CisKKzIwMTItMTItMTUgMjE6Mjc6MDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uaDoKKwkgIHNjYWxldGVtcG86IG5vIG5lZWQgZm9yIGEgcHJpdmF0ZSBzdHJ1Y3QKKworMjAxMi0xMi0xNCAxNToxMzozMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJICBkb2NzOiB1cGRhdGUgcGx1Z2luIGRvY3MKKworMjAxMi0xMi0xNCAxNToxMzoxOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSAgZG9jczogYWRkIHNjYWxldGVtcG8gdG8gZG9jcworCisyMDEyLTExLTA2IDEzOjM2OjM5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4LmM6CisJICBhdWRpb2Z4OiBtb3ZlIHNjYWxldGVtcG8gZWxlbWVudCBmcm9tIC1iYWQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODcyNjIKKworMjAxMi0xMC0yMyAxNDozMzoyMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYzoKKwkgIHNjYWxldGVtcG86IEZpeCBldmVudCBsZWFrCisKKzIwMTItMTAtMjMgMTQ6MzI6MjQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9nc3RzY2FsZXRlbXBvLmM6CisJICBzY2FsZXRlbXBvOiBGaXggdGltZXN0YW1wIHRyYWNraW5nCisKKzIwMTItMTAtMjMgMTQ6MDY6MzcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9nc3RzY2FsZXRlbXBvLmM6CisJICBzY2FsZXRlbXBvOiBJbXBsZW1lbnQgTEFURU5DWSBxdWVyeQorCisyMDEyLTEwLTIzIDEzOjM5OjE3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jOgorCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5oOgorCSAgc2NhbGV0ZW1wbzogU3RvcmUgaW5zdGFuY2UgcHJpdmF0ZSBkYXRhIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3QKKwkgIEdldHRpbmcgaXQgb3ZlciBhbmQgb3ZlciBhZ2FpbiB2aWEgR19UWVBFX0lOU1RBTkNFX0dFVF9QUklWQVRFKCkKKwkgIGlzIHJlYWxseSBzbG93LgorCisyMDEyLTEwLTE3IDE3OjM0OjI2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jOgorCSAgc2NhbGV0ZW1wbzogdXNlIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEoKQorCSAgd2hlcmUgcG9zc2libGUuIEF2b2lkcyBzb21lIHN0cmluZyBjb3BpZXMuIEFsc28gcmUtaW5kZW50CisJICBzb21lIHN0dWZmLiBBbHNvIHNvbWUgaW5kZW50IGZpeGVzIGhlcmUgYW5kIHRoZXJlLgorCisyMDEyLTA5LTE0IDE3OjA4OjQ5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jOgorCSAgc2NhbGV0ZW1wbzogcmVwbGFjZSBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUgd2l0aCBnc3RfZWxlbWVudF9jbGFzc19zZXRfbWV0YWRhdGEKKworMjAxMi0wOS0xNCAxNjo0NTozNCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jOgorCSAgc2NhbGV0ZW1wbzogZmZtcGVnY29sb3JzcGFjZSBpcyBubyBtb3JlCisKKzIwMTItMDQtMDUgMTg6MDI6NTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9nc3RzY2FsZXRlbXBvcGx1Z2luLmM6CisJICBzY2FsZXRlbXBvOiBVcGRhdGUgZm9yIEdTVF9QTFVHSU5fREVGSU5FKCkgQVBJIGNoYW5nZXMKKworMjAxMi0wMy0xOCAxODozMjo1NSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYzoKKwkgIHNjYWxldGVtcG86IHBvcnQgdG8gMC4xMQorCisyMDExLTA3LTA3IDEwOjUyOjUwIC0wNzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYzoKKwkgIHNjYWxldGVtcG86IGltcHJvdmUgdGhlIGRvY3MKKwkgIEZpeCB0aGUgc3ludGF4LCBhZGQgbW9yZSBleHBsYW5hdGlvbiBhbmQgeHJlZiB0aGUgcHJvcGVydGllcy4KKworMjAxMS0wMy0yMiAxMzo0Njo0MiArMDEwMCAgQ2hyaXMgRSBKb25lcyA8Y2hyaXNAY2hyaXNlam9uZXMuY29tPgorCisJKiBnc3QvYXVkaW9meC9nc3RzY2FsZXRlbXBvLmM6CisJICBzY2FsZXRlbXBvOiBDb3JyZWN0bHkgaGFuZGxlIG5ld3NlZ21lbnQgZXZlbnRzIHdpdGggc3RvcD09LTEKKwkgIEZpeGVzIGJ1ZyAjNjQ1NDIwLgorCisyMDEwLTEwLTE5IDEzOjQzOjE0ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYzoKKwkgIHNjYWxldGVtcG86IGFkZCBtaXNzaW5nIEdfUEFSQU1fU1RBVElDX1NUUklOR1MgZmxhZ3MKKwkgIENhbm9uaWNhbGl6ZSBwcm9wZXJ0eSBuYW1lcyBhcyBuZWVkZWQuCisKKzIwMTAtMDMtMTggMTc6MzA6MjYgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jOgorCSAgc2NhbGV0ZW1wbzogZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X2RldGFpbHMgPT4gZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X2RldGFpbHNfc2ltcGxlCisKKzIwMDktMTEtMDUgMTM6NDA6MzggLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9nc3RzY2FsZXRlbXBvLmM6CisJICBzY2FsZXRlbXBvOiBwcm9wZXJseSB1cGRhdGUgbmV3IHNlZ21lbnRzCisJICBTY2FsZXRlbXBvIHdhcyBtaXNzaW5nIGFuIHVwZGF0ZSBvZiAnc3RvcCcgaW4KKwkgIG5ldyBzZWdtZW50IHBhcmFtZXRlcnMgd2hlbiBwdXNoaW5nIGl0IGRvd25zdHJlYW0sCisJICB3aGljaCBjYXVzZWQgZmlsZXMgdG8gZW5kIGVhcmxpZXIgd2hlbiByYXRlIDwgMS4KKwkgIEZpeGVzICM1OTk5MDMKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5OiBCYXN0aWFuIEhlY2h0IDxoZWNodGJAZ21haWwuY29tPgorCisyMDA5LTA2LTE0IDIwOjAwOjUxICswMjAwICBNYXhpbWlsaWFuIEjDtmduZXIgPHBibWF4aUBob2VnbmVycy5kZT4KKworCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jOgorCSAgc2NhbGV0ZW1wbzogRXhwbGljaXRlbHkgY2FzdCB0byBzaWduZWQgaW50ZWdlcnMgdG8gZml4IGEgc2VnZmF1bHQKKwkgIEZpeGVzIGJ1ZyAjNTg1NjYwLgorCisyMDA5LTAyLTEzIDEyOjE4OjQ4IC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jOgorCSAgc2NhbGV0ZW1wbzogRG8gbm90IHVzZSB2b2lkIHBvaW50ZXIgYXJpdGhtZXRpYy4KKworMjAwOC0xMC0zMCAxMjoxMzoxOCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBzY2FsZXRlbXBvOiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBwYXJlbnRfY2xhc3MtPmV2ZW50KCkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meC9nc3RzY2FsZXRlbXBvLmM6CisJICBSZXR1cm4gdGhlIHJlc3VsdCBvZiBwYXJlbnRfY2xhc3MtPmV2ZW50KCkuCisKKzIwMDgtMDgtMzEgMTI6MjA6MzMgKzAwMDAgIFJvdiBKdXZhbm8gPHJvdmp1dmFub0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIEFkZCBzY2FsZXRlbXBvIHBsdWdpbiwgd2hpY2ggYWxsb3dzIHRvIHNjYWxlIHRoZSBzcGVlZCBvZiBhdWRpbyB3aXRob3V0IGNoYW5naW5nIHRoZSBwaXRjaCBieSBoYW5kbGluZyBzZWVrcyB3aXRoIGEgci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUm92IEp1dmFubyA8cm92anV2YW5vIGF0IHVzZXJzIGRvdCBzb3VyY2Vmb3JnZSBkb3QgbmV0PgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNjYWxldGVtcG8ueG1sOgorCSAgKiBleGFtcGxlcy9zY2FsZXRlbXBvL01ha2VmaWxlLmFtOgorCSAgKiBleGFtcGxlcy9zY2FsZXRlbXBvL2RlbW8tZ3VpLmM6IChwb3Bfc3RhdHVzX2JhciksCisJICAoc3RhdHVzX2Jhcl9wcmludGYpLCAoZGVtb19ndWlfc2Vla19iYXJfZm9ybWF0KSwgKHVwZGF0ZV9wb3NpdGlvbiksCisJICAoZGVtb19ndWlfc2Vla19iYXJfY2hhbmdlKSwgKGRlbW9fZ3VpX2RvX2NoYW5nZV9yYXRlKSwKKwkgIChkZW1vX2d1aV9kb19zZXRfcmF0ZSksIChkZW1vX2d1aV9kb19yYXRlX2VudGVyZWQpLAorCSAgKGRlbW9fZ3VpX2RvX3RvZ2dsZV9hZHZhbmNlZCksIChkZW1vX2d1aV9kb190b2dnbGVfZGlzYWJsZWQpLAorCSAgKGRlbW9fZ3VpX2RvX3NlZWspLCAoZGVtb19ndWlfZG9fcGxheSksIChkZW1vX2d1aV9kb19wYXVzZSksCisJICAoZGVtb19ndWlfZG9fcGxheV9wYXVzZSksIChkZW1vX2d1aV9kb19vcGVuX2ZpbGUpLAorCSAgKGRlbW9fZ3VpX2RvX3BsYXlsaXN0X3ByZXYpLCAoZGVtb19ndWlfZG9fcGxheWxpc3RfbmV4dCksCisJICAoZGVtb19ndWlfZG9fYWJvdXRfZGlhbG9nKSwgKGRlbW9fZ3VpX2RvX3F1aXQpLAorCSAgKGRlbW9fZ3VpX3JlcXVlc3Rfc2V0X3N0cmlkZSksIChkZW1vX2d1aV9yZXF1ZXN0X3NldF9vdmVybGFwKSwKKwkgIChkZW1vX2d1aV9yZXF1ZXN0X3NldF9zZWFyY2gpLCAoZGVtb19ndWlfcmF0ZV9jaGFuZ2VkKSwKKwkgIChkZW1vX2d1aV9wbGF5aW5nX3N0YXJ0ZWQpLCAoZGVtb19ndWlfcGxheWluZ19wYXVzZWQpLAorCSAgKGRlbW9fZ3VpX3BsYXlpbmdfZW5kZWQpLCAoZGVtb19ndWlfcGxheWVyX2Vycm9yZWQpLAorCSAgKGRlbW9fZ3VpX3N0cmlkZV9jaGFuZ2VkKSwgKGRlbW9fZ3VpX292ZXJsYXBfY2hhbmdlZCksCisJICAoZGVtb19ndWlfc2VhcmNoX2NoYW5nZWQpLCAoZGVtb19ndWlfc2V0X3BsYXllcl9mdW5jKSwKKwkgIChkZW1vX2d1aV9zZXRfcGxheWxpc3RfZnVuYyksIChidWlsZF9ndmFsdWVfYXJyYXkpLAorCSAgKGNyZWF0ZV9hY3Rpb24pLCAoZGVtb19ndWlfc2hvd19mdW5jKSwgKGRlbW9fZ3VpX3NldF9wbGF5ZXIpLAorCSAgKGRlbW9fZ3VpX3NldF9wbGF5bGlzdCksIChkZW1vX2d1aV9zaG93KSwgKGRlbW9fZ3VpX2dldF9wcm9wZXJ0eSksCisJICAoZGVtb19ndWlfc2V0X3Byb3BlcnR5KSwgKGRlbW9fZ3VpX2luaXQpLCAoZGVtb19ndWlfY2xhc3NfaW5pdCksCisJICAoZGVtb19ndWlfZ2V0X3R5cGUpOgorCSAgKiBleGFtcGxlcy9zY2FsZXRlbXBvL2RlbW8tZ3VpLmg6CisJICAqIGV4YW1wbGVzL3NjYWxldGVtcG8vZGVtby1tYWluLmM6IChoYW5kbGVfZXJyb3JfbWVzc2FnZSksCisJICAoaGFuZGxlX3F1aXQpLCAobWFpbik6CisJICAqIGV4YW1wbGVzL3NjYWxldGVtcG8vZGVtby1wbGF5ZXIuYzogKG5vX3BpcGVsaW5lKSwKKwkgIChkZW1vX3BsYXllcl9ldmVudF9saXN0ZW5lciksIChkZW1vX3BsYXllcl9zdGF0ZV9jaGFuZ2VkX2NiKSwKKwkgIChkZW1vX3BsYXllcl9lb3NfY2IpLCAoZGVtb19wbGF5ZXJfYnVpbGRfcGlwZWxpbmUpLCAoX3NldF9yYXRlKSwKKwkgIChkZW1vX3BsYXllcl9zY2FsZV9yYXRlX2Z1bmMpLCAoZGVtb19wbGF5ZXJfc2V0X3JhdGVfZnVuYyksCisJICAoX3NldF9zdGF0ZV9hbmRfd2FpdCksIChkZW1vX3BsYXllcl9sb2FkX3VyaV9mdW5jKSwKKwkgIChkZW1vX3BsYXllcl9wbGF5X2Z1bmMpLCAoZGVtb19wbGF5ZXJfcGF1c2VfZnVuYyksIChfc2Vla190byksCisJICAoZGVtb19wbGF5ZXJfc2Vla19ieV9mdW5jKSwgKGRlbW9fcGxheWVyX3NlZWtfdG9fZnVuYyksCisJICAoZGVtb19wbGF5ZXJfZ2V0X3Bvc2l0aW9uX2Z1bmMpLCAoZGVtb19wbGF5ZXJfZ2V0X2R1cmF0aW9uX2Z1bmMpLAorCSAgKGRlbW9fcGxheWVyX3NjYWxlX3JhdGUpLCAoZGVtb19wbGF5ZXJfc2V0X3JhdGUpLAorCSAgKGRlbW9fcGxheWVyX2xvYWRfdXJpKSwgKGRlbW9fcGxheWVyX3BsYXkpLCAoZGVtb19wbGF5ZXJfcGF1c2UpLAorCSAgKGRlbW9fcGxheWVyX3NlZWtfYnkpLCAoZGVtb19wbGF5ZXJfc2Vla190byksCisJICAoZGVtb19wbGF5ZXJfZ2V0X3Bvc2l0aW9uKSwgKGRlbW9fcGxheWVyX2dldF9kdXJhdGlvbiksCisJICAoZGVtb19wbGF5ZXJfZ2V0X3Byb3BlcnR5KSwgKGRlbW9fcGxheWVyX3NldF9wcm9wZXJ0eSksCisJICAoZGVtb19wbGF5ZXJfaW5pdCksIChkZW1vX3BsYXllcl9jbGFzc19pbml0KSwKKwkgIChkZW1vX3BsYXllcl9nZXRfdHlwZSk6CisJICAqIGV4YW1wbGVzL3NjYWxldGVtcG8vZGVtby1wbGF5ZXIuaDoKKwkgICogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYzogKGJlc3Rfb3ZlcmxhcF9vZmZzZXRfZmxvYXQpLAorCSAgKGJlc3Rfb3ZlcmxhcF9vZmZzZXRfczE2KSwgKG91dHB1dF9vdmVybGFwX2Zsb2F0KSwKKwkgIChvdXRwdXRfb3ZlcmxhcF9zMTYpLCAoZmlsbF9xdWV1ZSksIChyZWluaXRfYnVmZmVycyksCisJICAoZ3N0X3NjYWxldGVtcG9fdHJhbnNmb3JtKSwgKGdzdF9zY2FsZXRlbXBvX3RyYW5zZm9ybV9zaXplKSwKKwkgIChnc3Rfc2NhbGV0ZW1wb19zaW5rX2V2ZW50KSwgKGdzdF9zY2FsZXRlbXBvX3NldF9jYXBzKSwKKwkgIChnc3Rfc2NhbGV0ZW1wb19nZXRfcHJvcGVydHkpLCAoZ3N0X3NjYWxldGVtcG9fc2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfc2NhbGV0ZW1wb19iYXNlX2luaXQpLCAoZ3N0X3NjYWxldGVtcG9fY2xhc3NfaW5pdCksCisJICAoZ3N0X3NjYWxldGVtcG9faW5pdCk6CisJICAqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uaDoKKwkgICogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wb3BsdWdpbi5jOiAocGx1Z2luX2luaXQpOgorCSAgQWRkIHNjYWxldGVtcG8gcGx1Z2luLCB3aGljaCBhbGxvd3MgdG8gc2NhbGUgdGhlIHNwZWVkIG9mIGF1ZGlvIHdpdGhvdXQKKwkgIGNoYW5naW5nIHRoZSBwaXRjaCBieSBoYW5kbGluZyBzZWVrcyB3aXRoIGEgcmF0ZSE9MS4wLgorCSAgSW50ZWdyYXRlIGl0IGludG8gdGhlIGRvY3MgYW5kIGFkZCB0aGUgZXhhbXBsZSBhcHBsaWNhdGlvbiBmb3IgaXQuCisJICBGaXhlcyBidWcgIzUzNzcwMC4KKworMjAxMi0xMi0xMyAxMjozNjoyMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICBjaGVjazogYWRkIChidXQgZGlzYWJsZSkgbW9yZSBydHAgaml0dGVyYnVmZmVyIHRlc3RzCisJICBUZXN0cyBuZWVkIHRvIGJlIHBvcnRlZCB0byAxLjAgYmVmb3JlIHRoZXkgY2FuIGJlIGVuYWJsZWQgYnV0IGFkZGVkIGhlcmUgc28gdGhleQorCSAgZG9uJ3QgZ2V0IGZvcmdvdHRlbi4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY3ODM4CisKKzIwMTItMDEtMTMgMDE6MTE6MzEgKzAxMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQHRhbmRiZXJnLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGJ1bmRsZSB0b2dldGhlciBsYXRlIGxvc3QtZXZlbnRzCisJICBUaGUgc2NlbmFyaW8gd2hlcmUgeW91IGhhdmUgYSBnYXAgaW4gYSBzdGVhZHkgZmxvdyBvZiBwYWNrZXRzIG9mCisJICBzYXkgMTAgc2Vjb25kcyAoNTAwIHBhY2tldHMgb2Ygd2l0aCBkdXJhdGlvbiBvZiAyMG1zKSwgdGhlIGppdHRlcmJ1ZmZlcgorCSAgd2lsbCBpZGxlIHVwIHVudGlsIGl0IHJlY2VpdmVzIHRoZSBmaXJzdCBidWZmZXIgYWZ0ZXIgdGhlIGdhcCwgYnV0IHdpbGwKKwkgIHRoZW4gZ28gb24gdG8gcHJvZHVjZSA0OTkgbG9zdC1ldmVudHMsIHRvICJjb3ZlciB1cCIgdGhlIGdhcC4KKwkgIE5vdyB0aGlzIGlzIG9idmlvdXNseSB3cm9uZywgc2luY2UgdGhlIGxhc3QgcG9zc2libGUgdGltZSBmb3IgdGhlIGVhcmxpZXN0CisJICBsb3N0LWV2ZW50cyB0byBiZSBwbGF5ZWQgb3V0IGhhcyBvYnZpb3VzbHkgZXhwaXJlZCwgYnV0IHRoZSBmYWN0IHRoYXQKKwkgIHRoZSBqaXR0ZXJidWZmZXIgaGFzIGEgImxlbmd0aCIsIHJlcHJlc2VudGVkIHdpdGggaXRzIG93biBsYXRlbmN5IGNvbWJpbmVkCisJICB3aXRoIHRoZSB0b3RhbCBsYXRlbmN5IGRvd25zdHJlYW0sIGFsbG93cyBmb3IgY292ZXJpbmcgdXAgYXQgbGVhc3Qgc29tZQorCSAgb2YgdGhpcyBnYXAuCisJICBTbyBpbiB0aGUgY2FzZSBvZiB0aGUgImxlbmd0aCIgYmVpbmcgMjAwbXMsIHdoaWxlIGhhdmluZyByZWNlaXZlZCBwYWNrZXQKKwkgIDUwMCwgdGhlIGppdHRlcmJ1ZmZlciBzaG91bGQgc3RpbGwgY3JlYXRlIGEgdGltZW91dCBmb3IgcGFja2V0IDQ5MSwgd2hpY2gKKwkgIHdpbGwgaGF2ZSBpdHMgdGltZSBleHBpcmUgYXQgMTAsMDIgc2Vjb25kcywgc3BlY2lhbGx5IHNpbmNlIGl0IG1pZ2h0CisJICBhY3R1YWxseSBhcnJpdmUgaW4gdGltZSEgQnV0IG9idmlvdXNseSwgd2FpdGluZyBmb3IgcGFja2V0IDEwMCwgdGhhdCBoYWQKKwkgIGl0cyB0aW1lIGV4cGlyZSBhdCAyIHNlY29uZHMsIChyZW1lbWJlcmluZyB0aGF0IHRoZSBjdXJyZW50IHRpbWUgaXMgMTApCisJICBpcyB1c2VsZXNzLi4uCisJICBUaGUgcGF0Y2ggd2lsbCBjcmVhdGUgb25lICJiaWciIGxvc3QtZXZlbnQgZm9yIHRoZSBmaXJzdCA0OTAgcGFja2V0cywKKwkgIGFuZCB0aGVuIGdvIG9uIHRvIGNyZWF0ZSBzaW5nbGUgb25lcyBpZiB0aGV5IGNhbiByZWFjaCB0aGVpcgorCSAgcGxheW91dCBkZWFkbGluZS4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY3ODM4CisKKzIwMTItMTItMTMgMDk6Mjc6MTQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGZpeCBUQ1AgcmVjb25uZWN0CisJICBJZ25vcmUgb3RoZXIgY29tbWFuZHMgd2hlbiByZWNvbm5lY3RpbmcsIG90aGVyd2lzZSB0aGUgbG9vcCBmdW5jdGlvbiB3b3VsZCBwYXVzZQorCSAgYW5kIHRoZSByZWNvbm5lY3Rpb24gd291bGQgbm90IGhhcHBlbi4gQ29udGludWUgbG9vcGluZyBhZnRlciBkb2luZyBhIHJlY29ubmVjdAorCSAgc28gdGhhdCB3ZSBoYXZlIGEgY2hhbmNlIHRvIGFjdHVhbGx5IHJlYWQgdGhlIG5ldyBkYXRhLgorCisyMDEyLTEyLTEzIDAxOjAyOjM0ICswNDAwICDQoNGD0YHQu9Cw0L0g0JjQttCx0YPQu9Cw0YLQvtCyIDxscm4xOTg2QGdtYWlsLmNvbT4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5oOgorCSogc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5oOgorCSAgZGlyZWN0c291bmQsIHdhdmVmb3JtOiBmaXggY29tcGlsYXRpb24gZXJyb3JzIGNhdXNlZCBieSBjaXJjdWxhciBpbmNsdWRlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MDEyNAorCisyMDEyLTEyLTEyIDE3OjM1OjA0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSogZXh0L2phY2svZ3N0amFjay5oOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJKiBleHQvamFjay9nc3RqYWNrdXRpbC5oOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXByb2JlLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJKiBzeXMvb3NzL2NvbW1vbi5oOgorCSogc3lzL29zcy9nc3Rvc3NhdWRpby5jOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkqIHN5cy9vc3M0L29zczQtYXVkaW8uaDoKKwkgIGV4dC9zeXM6IEZpeCBzb21lIGNvbXBpbGF0aW9uIGVycm9ycyBjYXVzZWQgYnkgY2lyY3VsYXIgaW5jbHVkZXMKKworMjAxMi0xMi0xMiAxMjowNzozNCArMDEwMCAgUGhpbGlwcGUgTm9ybWFuZCA8cGhpbG5AaWdhbGlhLmNvbT4KKworCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJICBkZWludGVybGVhdmU6IHByb3Blcmx5IHNldCBzcmNwYWQgY2hhbm5lbCBwb3NpdGlvbgorCSAgVGhlIHNyYyBwYWQgY2FwcyBhbHdheXMgZGVzY3JpYmUgYSBzaW5nbGUgYXVkaW8gY2hhbm5lbCBzbyBvbmx5IHRoZQorCSAgZmlyc3QgcG9zaXRpb24gbWF0dGVycyBpZiBkZWludGVybGVhdmUgaXMgY29uZmlndXJlZCB0byBrZWVwIGNoYW5uZWwKKwkgIHBvc2l0aW9ucyBpbiBpdHMgc3JjIHBhZHMuCisKKzIwMTItMTItMTIgMTE6MDk6NDIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHRpbWVvdXQgb24gdWRwc3JjIGlzIGluIG5hbm9zZWNvbmRzCisKKzIwMTItMTItMTIgMTE6MDg6MTMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IGltcHJvdmUgdGltZW91dHMKKwkgIE1ha2UgaXQgcG9zc2libGUgdG8gc2V0IHRoZSB0aW1lb3V0IGFmdGVyIHdlIHdlbnQgdG8gdGhlIFJFQURZIHN0YXRlIGJ5IHVzaW5nCisJICB0aGUgdGltZW91dCB3aGVuIGNoZWNraW5nIHRoZSBjb25kaXRpb24uIFRoaXMgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byBzZXQgdGhlCisJICB0aW1lb3V0IHdpdGggYSBoaWdoZXIgZ3JhbnVsYXJpdHkgdGhhbiBzZWNvbmRzLgorCisyMDEyLTEyLTExIDEzOjAwOjQ2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlbWV0aG9kLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaDoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5LmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWguYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2xpbmVhcmJsZW5kLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3NjYWxlcmJvYi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwuaW5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS92ZmlyLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlYmZmLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZldGZmLmM6CisJICBkZWludGVybGFjZTogYWRkIHN1cHBvcnQgZm9yIHN0cmlkZXMKKwkgIEltcGxlbWVudCBzdHJpZGUgc3VwcG9ydCBjb3JyZWN0bHkgYnkgdGFraW5nIGl0IGZyb20gdGhlIEdzdFZpZGVvRnJhbWUuCisJICBQcm9wb3NlIGEgYnVmZmVycG9vbCB1cHN0cmVhbSB3aGVuIG5vdCBvcGVyYXRpbmcgaW4gcGFzc3Rocm91Z2guCisKKzIwMTItMDktMjcgMTI6MTc6NTggLTA3MDAgIEFsZWl4IENvbmNoaWxsbyBGbGFxdWUgPGFsZWl4QG9ibG9uZy5jb20+CisKKwkgIHJ0c3BzcmM6IGRvIG5vdCBjaGFuZ2Ugc3RhdGUgdG8gUExBWUlORyBpZiBjdXJyZW50bHkgY2hhbmluZyBzdGF0ZQorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmMgKGdzdF9ydHNwc3JjX3BsYXkpOiBzdGF0ZSBjaGFuZ2UgbWlnaHQgYmUKKwkgIGhhcHBlbmluZyBpbiB0aGUgYXBwbGljYXRpb24gdGhyZWFkLCBzbyB3ZSBkb24ndCBjaGFuZ2UgdGhlIHN0YXRlIHRvCisJICBQTEFZSU5HIGluIHRoZSBnc3RydHNwc3JjIHRocmVhZCB1bmxlc3MgaXQgaXMgc2FmZS4KKwkgIEEgc3BlY2lmaWMgY2FzZSBpcyB3aGVuIGNoYW5pbmcgdGhlIHN0YXRlIHRvIE5VTEwgZnJvbSB0aGUgYXBwbGljYXRpb24KKwkgIHRocmVhZC4gVGhpcyB3aWxsIHN5bmNocm9ub3VzbHkgdHJ5IHRvIHN0b3AgdGhlIHRhc2sgKHdpdGggdGhlIGVsZW1lbnQKKwkgIHN0YXRlIGxvY2sgYWNxdWlyZWQpLCBidXQgd2Ugd2lsbCB0cnkgYSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgZnJvbQorCSAgZ3N0cnRzcHNyYyB0aHJlYWQgd2hpY2ggd2lsbCBibG9jayBvbiB0aGUgZWxlbWVudCBzdGF0ZSBsb2NrIGNhdXNpbmcgYQorCSAgZGVhZGxvY2suCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg0MzEyCisKKzIwMTItMTItMTAgMTE6NDQ6MjYgKzAwMDAgIEFsZXhleSBDaGVybm92IDw0ZXJub3ZAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IEZpeCByZXNpemluZyB0aGUgQ29jb2Egd2luZG93IG9uIHJlY2VpdmluZyBuZXcgY2FwcworCSAgRml4ZXMgYnVnICM2ODk3MzIuCisKKzIwMTItMTEtMzAgMjA6Mzc6NDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkgIHY0bDJzcmM6IGxpbmsgYWdhaW5zdCAtbHJ0IGZvciBjbG9ja19nZXR0aW1lKCkKKwkgIE5lZWQgdG8gZXhwbGljaXRseSBsaW5rIGFnYWluc3QgLWxydCBmb3IgY2xvY2tfZ2V0dGltZSgpLCB3aGljaAorCSAgd2UgZG9uJ3QgZ2V0IGluIHRoZSBsaWJzIGFueSBtb3JlLCBiZWNhdXNlIGNvcmUgbW92ZWQgdGhlCisJICBnbW9kdWxlLW5vLWV4cG9ydC0yLjAgYml0IGludG8gUmVxdWlyZXMuUHJpdmF0ZS4KKwkgIE5vdCByZXF1aXJlZCBmb3IgbmV3ZXIgZ2xpYmMsIGJ1dCBmb3Igb2xkZXIgb25lcywgc28gY2hlY2sgZm9yIHRoYXQuCisKKzIwMTItMTEtMzAgMTc6MjI6NTkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSAgc2hvdXQyc2VuZDogYWNjZXB0IGF1ZGlvL3dlYm0gYXMgd2VsbCBhcyB2aWRlby93ZWJtCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg5MzM2CisKKzIwMTItMTEtMzAgMTc6MjA6MTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jOgorCSAgd2VibXV4OiBmaXggbGlua2luZyB3aXRoIHNob3V0MnNlbmQgZWxlbWVudAorCSAgU2hvdXQyc2VuZCBvbmx5IGFjY2VwdHMgd2VibSBmb3JtYXQsIG5vdCBtYXRyb3NrYSwgYnV0IGR1ZQorCSAgdG8gYSBidWcgaW4gbWF0cm9za2FtdXgsIHdlYm1tdXgncyBzb3VyY2UgcGFkIGlzIGFsc28gY3JlYXRlZAorCSAgd2l0aCB0aGUgbWF0cm9za2Egc291cmNlIHBhZCB0ZW1wbGF0ZSBhcyBwYWQgdGVtcGxhdGUsIHdoaWNoCisJICBtYWtlcyB0aGUgbGluayBmdW5jdGlvbiB0aGluayBpdCBjYW4ndCBsaW5rIHdlYm1tdXggdG8gc2hvdXQyc2VuZC4KKwkgIEFsc28gYWRkIHVuaXQgdGVzdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODkzMzYKKworMjAxMi0xMS0yNyAxMToxMzozNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogdXNlIG5ldyBvcHRpb24gcGFyc2VyIGZ1bmN0aW9uCisKKzIwMTItMTEtMjYgMTU6MTc6MTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9sYXcvbXVsYXctY29udmVyc2lvbi5jOgorCSAgbGF3OiBmaXggYWNjaWRlbnRhbCBmaWxlIHBlcm1pc3Npb25zIGNoYW5nZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NzQ2OQorCisyMDEyLTExLTI1IDE2OjA1OjExICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiByZW1vdmUgdW51c2VkIGRlZmluZQorCisyMDEyLTExLTI1IDE0OjE2OjA5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGF2b2lkIGNyaXRpY2FscyBpZiB1bmtub3duIGZvdXJjYyBoYXMgc3BhY2UgYXQgYmVnaW5uaW5nIG9yIGVuZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MjkzNgorCisyMDEyLTExLTI0IDE5OjMyOjUxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBmaXggYm9yZGVyIGZpbGxpbmcgZm9yIHBsYW5hciBZVVYgZm9ybWF0cworCSAgV2Ugd291bGQgZ2V0IGEgZ3JlZW4gYm9yZGVyIGluc3RlYWQgb2YgYSBibGFjayBvbmUsIGZvcgorCSAgZXhhbXBsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODQ5OTEKKworMjAxMi0xMS0yNCAxNDoyNzozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2xhdy9tdWxhdy1jb252ZXJzaW9uLmM6CisJICBtdWxhdzogY29uc3QtaWZ5IHNvbWUgYXJyYXlzCisKKzIwMTItMTEtMDIgMTI6Mzg6NDQgLTA0MDAgIFJvbGFuZCBLcmlrYXZhIDxya3Jpa2F2YUBnbWFpbC5jb20+CisKKwkqIGdzdC9sYXcvbXVsYXctY29udmVyc2lvbi5jOgorCSAgbXVsYXdkZWM6IGZpeCBpbnRlZ2VyIG92ZXJydW4KKwkgIFRoZXJlIG1pZ2h0IGJlIG1vcmUgdGhhbiA2NTUzNSBzYW1wbGVzIGluIGEgY2h1bmsgb2YgZGF0YS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc0NjkKKworMjAxMi0xMS0yMiAxMTozNDozMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcGF1c2UgdGhlIHRhc2sgaW5zdGVhZCBvZiBzcGlubmluZworCSAgQWN0dWFsbHkgcGF1c2UgdGhlIGxvb3AgdGFzayBpbnN0ZWFkIG9mIHNwaW5uaW5nIGZvcmV2ZXIuCisKKzIwMTItMTEtMTkgMDM6MzE6MzcgLTA1MDAgIEpvc2h1YSBNLiBEb2UgPG9zc0BudmwuYXJteS5taWw+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkgIHZpZGVvZmxpcDogQWRkIGdyYXkgOC8xNiBzdXBwb3J0CisKKzIwMTItMTEtMTkgMTE6MjU6MTQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBiNDk3YzRmIHRvIGE3MmZhZWEKKworMjAxMi0xMS0xNiAxNTozODoyOSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogaGFuZGxlIHNlZ21lbnQgZXZlbnQKKwkgIE1ha2UgYSBzZWdtZW50IGV2ZW50IHdoZW4gd2Ugc2VuZCBhIG5ldyByYW5nZSBoZWFkZXIgdG8gYSBjbGllbnQgKGZpcnN0IFBMQVkKKwkgIHJlcXVlc3Qgb3IgYWZ0ZXIgYSBzZWVrKS4gU2VuZCB0aGUgc2VnbWVudCBldmVudCBpbiBpbnRlcmxlYXZlZCBtb2RlLgorCSAgQ2xlYW4gdGhlIHNlZ21lbnQgZXZlbnQgb24gY2xlYW51cAorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4ODM4MgorCisyMDEyLTExLTE2IDE1OjE4OjA3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaXggY2hlY2sgZm9yIGFjdGl2ZSBzdHJlYW1zCisJICBBIHN0cmVhbSBjYW4gYmUgYWN0aXZlIHdpdGhvdXQgYSBzcmNwYWQgeWV0IGFuZCB3ZSB3YW50IHRvIHNlbmQKKwkgIGV2ZW50cyBvbiB0aG9zZSBzdHJlYW1zIGFzIHdlbGwuCisKKzIwMTItMTEtMTYgMTM6MzE6MDQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGNyZWF0ZSBhbmQgYWRkIHBhZHMgb3V0c2lkZSBvZiBsb2NrCisJICBDcmVhdGUgYW5kIGFkZCB0aGUgZ2hvc3RwYWQgZm9yIHRoZSBuZXcgc3RyZWFtIG91dHNpZGUgb2YgdGhlIGxvY2sgYmVjYXVzZSBpdAorCSAgaXMgbm90IG5lZWRlZCBhbmQgY2F1c2VzIGRlYWRsb2Nrcy4KKworMjAxMi0wOS0xMiAyMjoxMToyMCAtMDcwMCAgQWxlaXggQ29uY2hpbGxvIEZsYXF1ZSA8YWxlaXhAb2Jsb25nLmNvbT4KKworCSAgcnRzcHNyYzogYWxsb3cgY2xpZW50IHRvIGRpc2FibGUgcmVjb25uZWN0aW9uCisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuW2NoXTogYWRkZWQgbmV3ICJ1ZHAtcmVjb25uZWN0IiBwcm9wZXJ0eS4gQmVmb3JlLAorCSAgcnRzcHNyYyBhbHdheXMgdHJpZWQgdG8gcmVjb25uZWN0IHRvIHRoZSBzZXJ2ZXIgd2hlbiB0aGUgUlRTUAorCSAgY29ubmVjdGlvbiB3YXMgY2xvc2VkIGJ5IHRoZSBzZXJ2ZXIuIFRoaXMgcHJvcGVydHkgbGV0cyB0aGUgdXNlcgorCSAgZGVjaWRlIHdoZXRoZXIgaXQgd2FudHMgcnRzcHNyYyB0byByZWNvbm5lY3Qgb3Igbm90LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MzkxMgorCisyMDEyLTExLTE2IDEyOjE2OjA1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBjbGVhciB2YXJpYWJsZXMgYmVmb3JlIHJldHJ5aW5nCisJICBFbHNlIHdlIG1pZ2h0IHVucmVmIGFuIG9sZCB1ZHBzcmMgdHdpY2UgaW4gY2xlYW51cC4KKworMjAxMi0xMS0xNiAxMjowMDoxNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcHJvcG9zZSBwb3J0cyBpbiBtdWx0aWNhc3QKKwkgIFdoZW4gdGhlIHVzZXIgY29uZmlndXJlZCBhIHBvcnQtcmFuZ2UsIHByb3Bvc2UgcG9ydHMgZnJvbSB0aGlzIHJhbmdlCisJICBhcyB0aGUgbXVsdGljYXN0IHBvcnRzLiBUaGUgc2VydmVyIGlzIGZyZWUgdG8gaWdub3JlIHRoaXMgcmVxdWVzdCBidXQgaWYgaXQKKwkgIGhvbm91cnMgaXQsIGluY3JlbWVudCBvdXIgcG9ydHMgc28gdGhhdCB3ZSBzdWdnZXN0IHRoZSBuZXh0IHBvcnQgcGFpciBmb3IgdGhlCisJICBuZXh0IHN0cmVhbS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Mzk0MjAKKworMjAxMi0xMS0xNiAxMTo1ODo1MyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYWRkIG1vcmUgZGVidWcKKworMjAxMi0xMS0xNiAwOTowOTozOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICBtdWx0aWZpbGVzaW5rOiBwb3N0IG1lc3NhZ2VzIGluIG1heC1zaXplIG1vZGUgYXMgd2VsbAorCSAgTm8gcmVhc29uIG5vdCB0byByZWFsbHkuCisKKzIwMTItMTEtMTUgMTQ6Mzc6NDQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IHBvc3QgZXJyb3IgYmVmb3JlIHN0b3BwaW5nCisKKzIwMTItMTEtMTQgMDA6MTM6MzYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkqIGdzdC9nb29tMmsxL2dzdGdvb20uYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJICBnc3RfYWRhcHRlcl9wcmV2X3RpbWVzdGFtcCAtPiBnc3RfYWRhcHRlcl9wcmV2X3B0cworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NTU5OAorCisyMDEyLTExLTEyIDE5OjIzOjQxICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkgIHZpZGVvZmxpcDogQWRkIE5WMTIvTlYyMSBzdXBwb3J0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg4MjI1CisKKzIwMTItMTEtMTIgMTM6MDE6MjMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSAgdnA4ZW5jOiBEb24ndCBsZWFrIEdzdFZpZGVvQ29kZWNGcmFtZXMgdGhhdCBjYXVzZSB0aGUgY3JlYXRpb24gb2YgaW52aXNpYmxlIGZyYW1lcworCSAgRml4ZXMgYnVnICM2ODI3MTQuCisKKzIwMTItMTEtMTIgMTE6NDc6MTcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZTogVXNlIG5ldyBHVHlwZSBmb3IgR1RocmVhZCBpbnN0ZWFkIG9mIGp1c3QgR19UWVBFX1BPSU5URVIKKworMjAxMi0xMS0xMiAxMToxNDozNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzb3VyY2U6IHByb3RlY3QgYWdhaW5zdCBpbnZhbGlkIFJUUCBwYWNrZXRzCisKKzIwMTItMTEtMTIgMTA6NDQ6MDEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgcG5nZGVjOiBBY3R1YWxseSB1c2UgdGhlIHN0b3AoKSB2ZnVuYyBpbXBsZW1lbnRhdGlvbgorCisyMDEyLTExLTEyIDEwOjMxOjU5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZweC9nc3R2cDhkZWMuYzoKKwkgIHZwOGRlYzogRml4IGxhc3QgY29tbWl0CisKKzIwMTItMTEtMTIgMTA6MTA6MTUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgcG5nZGVjOiBLZWVwIHRoZSBpbnB1dCBzdGF0ZSBpbiByZXNldCgpCisJICBJdCdzIHN0aWxsIHZhbGlkIGFmdGVyIGEgZmx1c2ggYW5kIHdlIG1pZ2h0IG5vdCBnZXQgYSBuZXcgb25lLgorCisyMDEyLTExLTEyIDEwOjA4OjU3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZweC9nc3R2cDhkZWMuYzoKKwkgIHZwOGRlYzogQWxzbyBkZXN0cm95IGRlY29kZXIgaW4gc2V0X2Zvcm1hdCgpIGlmIGl0IHdhcyBjcmVhdGVkIGFscmVhZHkKKwkgIEZpeGVzIGEgbWVtb3J5IGxlYWsuCisKKzIwMTItMTEtMTIgMDk6NDg6NDUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSAgdnA4ZGVjOiBEb24ndCBjbGVhciBpbnB1dCBzdGF0ZSBpbiByZXNldCgpCisJICBUaGUgaW5wdXQgc3RhdGUgaXMgc3RpbGwgdmFsaWQgYWZ0ZXIgZmx1c2hpbmcgdW50aWwKKwkgIG5ldyBjYXBzIGFycml2ZS4KKwkgIEZpeGVzIGJ1ZyAjNjg4MDkyLgorCisyMDEyLTExLTEwIDE4OjIxOjI4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSAgdmlkZW9jcm9wOiBhZGQgc3VwcG9ydCBmb3IgWVYxMgorCSAgV2UgY2FuIGRvIEk0MjAsIHNvIHdlIGNhbiBkbyBZVjEyIGFzIHdlbGwuCisKKzIwMTItMTEtMTAgMTI6Mzk6MDggKzAxMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRAZ21haWwuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIG11bHRpZmlsZXNpbms6IGRvbid0IHdyaXRlIHN0cmVhbSBoZWFkZXJzIHdpdGgga2V5LXVuaXQtZXZlbnQKKwkgIERvbid0IHdyaXRlIHN0cmVhbSBoZWFkZXJzLCBsZXQgdXBzdHJlYW0gZWxlbWVudHMgaW5zZXJ0IHRoZW0gaW4gdGhlIHN0cmVhbSBpZgorCSAgYWxsX2hlYWRlcnM9dHJ1ZSBpcyBzZXQgaW4ga2V5IHVuaXQgZXZlbnRzLgorCisyMDEyLTExLTA5IDEzOjI3OjE2ICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5oOgorCSAgdmlkZW9jcm9wOiBBZGQgTlYxMi9OVjIxIHN1cHBvcnQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc5NjQKKworMjAxMi0xMS0wOSAxNjozMTowNSArMDEwMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSAgdnA4ZGVjOiBEb24ndCBnaXZlIHVwIHNvIGVhc2lseSBpZiBmYWlsZWQgdG8gZGVjb2RlIGEgZnJhbWUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc0MzYKKworMjAxMi0xMS0wOSAxMToyMjozMCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IEFsc28gY2xlYXIgR0Vycm9yCisKKzIwMTItMTEtMDkgMTE6MjA6MjcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBEb24ndCBlcnJvciBvdXQgaWYgd2UgZ2V0IGFuIElDTVAgZGVzdGluYXRpb24tdW5yZWFjaGFibGUgbWVzc2FnZSB3aGVuIHRyeWluZyB0byByZWFkIHBhY2tldHMKKwkgIFNlZSBidWcgIzUyOTQ1NCBhbmQgIzY4Nzc4MiBhbmQgY29tbWl0CisJICA3NTFmMmJiMzY0NmYyYmVmZjM2OThjOWYwOTkwMGRiZDBlYTA4YWJiCisKKzIwMTItMTEtMDcgMjA6MzU6NTAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZS5hYzogdXBkYXRlIGNvdXJ0ZXN5IG9mIGF1dG91cGRhdGUKKworMjAxMi0xMS0wNyAxODo0ODo0OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogbGV0IEFHX0dTVF9QTFVHSU5fRE9DUyBjaGVjayBmb3IgcHl0aG9uCisJICBBbmQgdXBkYXRlIGNvbW1vbiBmb3IgbW92ZSBmcm9tIEFTX1BBVEhfUFlUSE9OIHRvIEFNX1BBVEhfUFlUSE9OLAorCSAgd2hpY2ggYXMgYSBzaWRlLWVmZmVjdCBzaG91bGQgcGljayB1cCBuZXdlciBweXRob24gdmVyc2lvbnMgYXMKKwkgIHdlbGwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTYzOTAzCisKKzIwMTItMTEtMDcgMTM6MzY6MzMgKzAxMDAgIENocmlzdGlhbiBGcmVkcmlrIEthbGFnZXIgU2NoYWxsZXIgPHVyYWV1c0BsaW51eHJpc2luLm9yZz4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgIEZpeCB2cDhydHAgaGVhZGVyIG5hbWVzIGluIE1ha2VmaWxlCisKKzIwMTItMTEtMDYgMTU6MDM6NTUgKzAxMDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmg6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2Nyb3AuYzoKKwkgIHZpZGVvY3JvcDogQWRkIHN1cHBvcnQgZm9yIGF1dG9tYXRpYyBjcm9wcGluZworCSAgVGhpcyBjaGFuZ2UgZW5hYmxlIGF1dG9tYXRpYyBjcm9wcGluZyB1c2luZyAtMSBzZXQgdG8gbGVmdCwgdG9wLCByaWdodCBvcgorCSAgYm90dG9tIHByb3BlcnR5LiBJbiB0aGUgY2FzZSBib3RoIHNpZGUgYXJlIHNldCB0byBhdXRvbWF0aWMgY3JvcHBpbmcsIHRoZQorCSAgY3JvcGluZyB3aWxsIGJlIGRvbmUgZXF1YWxseSBvbiBib3RoIHNpZGUgKGluIHRoZSBvZGQgY2FzZSwgcmlnaHQgYW5kCisJICBib3R0b20gY3JvcHBpbmcgd2lsbCBiZSAxIHBpeGVsIG1vcmUpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc2MQorCisyMDEyLTExLTAyIDE2OjM5OjI4ICswMTAwICBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSAgc3BlZXhkZWM6IERvbid0IHVubWFwIG9yIGZpbmlzaF9mcmFtZSBhbiBpbnZhbGlkIEdzdEJ1ZmZlcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NzQ2NAorCisyMDEyLTExLTA2IDEzOjIyOjU4ICswMTAwICBNYXJjIExlZW1hbiA8bWFyYy5sZWVtYW5AZ21haWwuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwOiB0aGUgUlRDUCBwb3J0IG51bWJlciBpcyBpbmNsdXNpdmUKKwkgIFRoZSBjb25maWd1cmVkIHBvcnQgbnVtYmVyIHBhaXIgaGFzIGl0cyB1cHBlciBib3VuZCBzZXQgdG8gdGhlIG1heGltdW0KKwkgIGFsbG93ZWQgUlRDUCBwb3J0LCBpbmNsdXNpdmUuCisJICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzOTQyMAorCisyMDEyLTExLTAzIDIwOjM4OjAwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvZHRtZi9nc3RkdG1mZGV0ZWN0LmM6CisJKiBnc3QvZHRtZi9nc3RkdG1mZGV0ZWN0Lmg6CisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmg6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5oOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5oOgorCSAgRml4IEZTRiBhZGRyZXNzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg3NTIwCisKKzIwMTItMTEtMDQgMDA6MDc6MTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzoKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuaDoKKwkqIGV4dC9jYWlyby9nc3RjYWlyby5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvb3ZlcmxheS5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvb3ZlcmxheS5oOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmM6CisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm9yZW5kZXIuaDoKKwkqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOgorCSogZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5LmM6CisJKiBleHQvY2Fpcm8vZ3N0dGltZW92ZXJsYXkuaDoKKwkqIGV4dC9kdi9nc3Rkdi5jOgorCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBleHQvZHYvZ3N0ZHZkZWMuaDoKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJKiBleHQvZHYvZ3N0ZHZkZW11eC5oOgorCSogZXh0L2R2L2dzdHNtcHRldGltZWNvZGUuYzoKKwkqIGV4dC9kdi9nc3RzbXB0ZXRpbWVjb2RlLmg6CisJKiBleHQvZmxhYy9nc3RmbGFjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmg6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmg6CisJKiBleHQvZmxhYy9nc3RmbGFjdGFnLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjdGFnLmg6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGthbmltYXRpb24uYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka2FuaW1hdGlvbi5oOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmZGVjLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZkZWMuaDoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zm92ZXJsYXkuaDoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZnBsdWdpbi5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5oOgorCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmg6CisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJKiBleHQvamFjay9nc3RqYWNrLmg6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9jbGllbnQuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5oOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5oOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuaDoKKwkqIGV4dC9qYWNrL2dzdGphY2tyaW5nYnVmZmVyLmg6CisJKiBleHQvamFjay9nc3RqYWNrdXRpbC5jOgorCSogZXh0L2phY2svZ3N0amFja3V0aWwuaDoKKwkqIGV4dC9qcGVnL2dzdGpwZWcuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWcuaDoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuaDoKKwkqIGV4dC9qcGVnL2dzdHNtb2tlZGVjLmM6CisJKiBleHQvanBlZy9nc3RzbW9rZWRlYy5oOgorCSogZXh0L2pwZWcvZ3N0c21va2VlbmMuYzoKKwkqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmg6CisJKiBleHQvanBlZy9zbW9rZWNvZGVjLmM6CisJKiBleHQvanBlZy9zbW9rZWNvZGVjLmg6CisJKiBleHQvanBlZy9zbW9rZWZvcm1hdC5oOgorCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzoKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmg6CisJKiBleHQvbGlicG5nL2dzdHBuZy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmcuaDoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5oOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmg6CisJKiBleHQvbWlrbW9kL1JFQURNRToKKwkqIGV4dC9taWttb2QvZ3N0bWlrbW9kLmM6CisJKiBleHQvbWlrbW9kL2dzdG1pa21vZC5oOgorCSogZXh0L21pa21vZC9taWttb2RfdHlwZXMuYzoKKwkqIGV4dC9taWttb2QvbWlrbW9kX3R5cGVzLmg6CisJKiBleHQvcHVsc2UvcGx1Z2luLmM6CisJKiBleHQvcHVsc2UvcHVsc2Vwcm9iZS5jOgorCSogZXh0L3B1bHNlL3B1bHNlcHJvYmUuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmg6CisJKiBleHQvcHVsc2UvcHVsc2V1dGlsLmM6CisJKiBleHQvcHVsc2UvcHVsc2V1dGlsLmg6CisJKiBleHQvcmF3MTM5NC9nc3QxMzk0LmM6CisJKiBleHQvcmF3MTM5NC9nc3QxMzk0Y2xvY2suYzoKKwkqIGV4dC9yYXcxMzk0L2dzdDEzOTRjbG9jay5oOgorCSogZXh0L3JhdzEzOTQvZ3N0MTM5NHByb2JlLmM6CisJKiBleHQvcmF3MTM5NC9nc3QxMzk0cHJvYmUuaDoKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmg6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmg6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuaDoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5oOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4LmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5oOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuaDoKKwkqIGV4dC90YWdsaWIvZ3N0YXBldjJtdXguY2M6CisJKiBleHQvdGFnbGliL2dzdGFwZXYybXV4Lmg6CisJKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5oOgorCSogZXh0L3RhZ2xpYi9nc3R0YWdsaWJwbHVnaW4uYzoKKwkqIGV4dC92cHgvZ3N0dnA4ZGVjLmM6CisJKiBleHQvdnB4L2dzdHZwOGRlYy5oOgorCSogZXh0L3ZweC9nc3R2cDhlbmMuYzoKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmg6CisJKiBleHQvdnB4L2dzdHZwOHV0aWxzLmM6CisJKiBleHQvdnB4L2dzdHZwOHV0aWxzLmg6CisJKiBleHQvdnB4L3BsdWdpbi5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFjay5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5oOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5oOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5oOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3N0cmVhbXJlYWRlci5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3N0cmVhbXJlYWRlci5oOgorCSogZ3N0LWxpYnMvZ3N0L2dldHRleHQuaDoKKwkqIGdzdC1saWJzL2dzdC9nbGliLWNvbXBhdC1wcml2YXRlLmg6CisJKiBnc3QtbGlicy9nc3QvZ3N0LWkxOG4tcGx1Z2luLmg6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5oOgorCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmg6CisJKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6CisJKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4Lmg6CisJKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmxpbWl0Lmg6CisJKiBnc3QvYXVkaW9meC9hdWRpb2R5bmFtaWMuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9lY2hvLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uaDoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2ZpcmZpbHRlci5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmg6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWlpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuaDoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaWlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0Lmg6CisJKiBnc3QvYXVkaW9meC9hdWRpb2thcmFva2UuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNiYW5kLmg6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5oOgorCSogZ3N0L2F1ZGlvZngvbWF0aF9jb21wYXQuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5oOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5oOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3R3YXZwYWNrcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL3BsdWdpbi5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5oOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5oOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuaDoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9kZXRlY3QuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9kZXRlY3QuaDoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuaDoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc3JjLmg6CisJKiBnc3QvYXZpL2F2aS1pZHMuaDoKKwkqIGdzdC9hdmkvZ3N0YXZpLmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguaDoKKwkqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6CisJKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5oOgorCSogZ3N0L2RlYnVndXRpbHMvYnJlYWtteWRhdGEuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2NwdXJlcG9ydC5jOgorCSogZ3N0L2RlYnVndXRpbHMvY3B1cmVwb3J0Lmg6CisJKiBnc3QvZGVidWd1dGlscy9nc3RjYXBzZGVidWcuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNkZWJ1Zy5oOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0ZGVidWcuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdG5hdmlnYXRpb250ZXN0LmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZpZ2F0aW9udGVzdC5oOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2c2Vlay5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2c2Vlay5oOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0cHVzaGZpbGVzcmMuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHB1c2hmaWxlc3JjLmg6CisJKiBnc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHRhZ2luamVjdC5oOgorCSogZ3N0L2RlYnVndXRpbHMvcHJvZ3Jlc3NyZXBvcnQuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Byb2dyZXNzcmVwb3J0Lmg6CisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJKiBnc3QvZGVidWd1dGlscy90ZXN0cGx1Z2luLmM6CisJKiBnc3QvZGVidWd1dGlscy90ZXN0cy5jOgorCSogZ3N0L2RlYnVndXRpbHMvdGVzdHMuaDoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmg6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHkuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5hc206CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWguYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aG1hY3Jvcy5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyYmxlbmQuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvcGx1Z2lucy5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9zY2FsZXJib2IuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwuaW5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS92ZmlyLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlYmZmLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZldGZmLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3g4Ni02NF9tYWNyb3MuaW5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmg6CisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmg6CisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmg6CisJKiBnc3QvZWZmZWN0di9nc3RlZmZlY3R2LmM6CisJKiBnc3QvZWZmZWN0di9nc3RlZmZlY3R2Lmg6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0b3AuaDoKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmV2LmM6CisJKiBnc3QvZWZmZWN0di9nc3RyZXYuaDoKKwkqIGdzdC9lZmZlY3R2L2dzdHJpcHBsZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmlwcGxlLmg6CisJKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmg6CisJKiBnc3QvZWZmZWN0di9nc3RzdHJlYWsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHN0cmVhay5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5oOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmg6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjEwYmFuZHMuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5oOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIzYmFuZHMuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmg6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXJuYmFuZHMuaDoKKwkqIGdzdC9mbHYvYW1mZGVmcy5oOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5oOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4Lmg6CisJKiBnc3QvZmx2L2dzdGluZGV4LmM6CisJKiBnc3QvZmx2L2dzdGluZGV4Lmg6CisJKiBnc3QvZmx2L2dzdG1lbWluZGV4LmM6CisJKiBnc3QvZmx4L2ZseF9jb2xvci5jOgorCSogZ3N0L2ZseC9mbHhfY29sb3IuaDoKKwkqIGdzdC9mbHgvZmx4X2ZtdC5oOgorCSogZ3N0L2ZseC9nc3RmbHhkZWMuYzoKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmg6CisJKiBnc3QvZ29vbS9jb25maWdfcGFyYW0uYzoKKwkqIGdzdC9nb29tL2NvbnZvbHZlX2Z4LmM6CisJKiBnc3QvZ29vbS9kcmF3bWV0aG9kcy5jOgorCSogZ3N0L2dvb20vZHJhd21ldGhvZHMuaDoKKwkqIGdzdC9nb29tL2ZpbHRlcnMuYzoKKwkqIGdzdC9nb29tL2ZpbHRlcnNfbW14LnM6CisJKiBnc3QvZ29vbS9mbHlpbmdfc3RhcnNfZnguYzoKKwkqIGdzdC9nb29tL2dvb20uaDoKKwkqIGdzdC9nb29tL2dvb21fY29uZmlnLmg6CisJKiBnc3QvZ29vbS9nb29tX2NvbmZpZ19wYXJhbS5oOgorCSogZ3N0L2dvb20vZ29vbV9jb3JlLmM6CisJKiBnc3QvZ29vbS9nb29tX2ZpbHRlcnMuaDoKKwkqIGdzdC9nb29tL2dvb21fZnguaDoKKwkqIGdzdC9nb29tL2dvb21fZ3JhcGhpYy5oOgorCSogZ3N0L2dvb20vZ29vbV9wbHVnaW5faW5mby5oOgorCSogZ3N0L2dvb20vZ29vbV90b29scy5jOgorCSogZ3N0L2dvb20vZ29vbV90b29scy5oOgorCSogZ3N0L2dvb20vZ29vbV90eXBlZGVmcy5oOgorCSogZ3N0L2dvb20vZ29vbV92aXN1YWxfZnguaDoKKwkqIGdzdC9nb29tL2dyYXBoaWMuYzoKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkqIGdzdC9nb29tL2dzdGdvb20uaDoKKwkqIGdzdC9nb29tL2xpbmVzLmM6CisJKiBnc3QvZ29vbS9saW5lcy5oOgorCSogZ3N0L2dvb20vbWF0aHRvb2xzLmM6CisJKiBnc3QvZ29vbS9tYXRodG9vbHMuaDoKKwkqIGdzdC9nb29tL21vdGlmX2dvb20xLmg6CisJKiBnc3QvZ29vbS9tb3RpZl9nb29tMi5oOgorCSogZ3N0L2dvb20vcGx1Z2luX2luZm8uYzoKKwkqIGdzdC9nb29tL3BwY19kcmF3aW5ncy5oOgorCSogZ3N0L2dvb20vcHBjX2RyYXdpbmdzLnM6CisJKiBnc3QvZ29vbS9wcGNfem9vbV91bHRpbWF0ZS5oOgorCSogZ3N0L2dvb20vcHBjX3pvb21fdWx0aW1hdGUuczoKKwkqIGdzdC9nb29tL3NvdW5kX3Rlc3Rlci5jOgorCSogZ3N0L2dvb20vc291bmRfdGVzdGVyLmg6CisJKiBnc3QvZ29vbS9zdXJmM2QuYzoKKwkqIGdzdC9nb29tL3N1cmYzZC5oOgorCSogZ3N0L2dvb20vdGVudGFjbGUzZC5jOgorCSogZ3N0L2dvb20vdGVudGFjbGUzZC5oOgorCSogZ3N0L2dvb20vdjNkLmM6CisJKiBnc3QvZ29vbS92M2QuaDoKKwkqIGdzdC9nb29tMmsxL2dzdGdvb20uYzoKKwkqIGdzdC9nb29tMmsxL2dzdGdvb20uaDoKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4Lmg6CisJKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzoKKwkqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5oOgorCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuaDoKKwkqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOgorCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmg6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmg6CisJKiBnc3QvaW50ZXJsZWF2ZS9wbHVnaW4uYzoKKwkqIGdzdC9pbnRlcmxlYXZlL3BsdWdpbi5oOgorCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSogZ3N0L2lzb21wNC9hdG9tcy5oOgorCSogZ3N0L2lzb21wNC9hdG9tc3JlY292ZXJ5LmM6CisJKiBnc3QvaXNvbXA0L2F0b21zcmVjb3ZlcnkuaDoKKwkqIGdzdC9pc29tcDQvZGVzY3JpcHRvcnMuYzoKKwkqIGdzdC9pc29tcDQvZGVzY3JpcHRvcnMuaDoKKwkqIGdzdC9pc29tcDQvZm91cmNjLmg6CisJKiBnc3QvaXNvbXA0L2Z0eXBjYy5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG1vb3ZyZWNvdmVyLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bW9vdnJlY292ZXIuaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXgtZG9jLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LWRvYy5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eG1hcC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eG1hcC5oOgorCSogZ3N0L2lzb21wNC9nc3RydHB4cXRkZXBheS5jOgorCSogZ3N0L2lzb21wNC9nc3RydHB4cXRkZXBheS5oOgorCSogZ3N0L2lzb21wNC9pc29tcDQtcGx1Z2luLmM6CisJKiBnc3QvaXNvbXA0L3Byb3BlcnRpZXMuYzoKKwkqIGdzdC9pc29tcDQvcHJvcGVydGllcy5oOgorCSogZ3N0L2lzb21wNC9xdGF0b21wYXJzZXIuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4Lmg6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X2R1bXAuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9sYW5nLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfbGFuZy5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuaDoKKwkqIGdzdC9pc29tcDQvcXRwYWxldHRlLmg6CisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmg6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmg6CisJKiBnc3QvbGF3L2FsYXcuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5oOgorCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmg6CisJKiBnc3QvbGF3L211bGF3LmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5oOgorCSogZ3N0L21hdHJvc2thL2VibWwtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmg6CisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOgorCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS5jOgorCSogZ3N0L21hdHJvc2thL3dlYm0tbXV4LmM6CisJKiBnc3QvbWF0cm9za2Evd2VibS1tdXguaDoKKwkqIGdzdC9tb25vc2NvcGUvY29udm9sdmUuYzoKKwkqIGdzdC9tb25vc2NvcGUvY29udm9sdmUuaDoKKwkqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6CisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5oOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGUuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmg6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuaDoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRmaWxlc3JjLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0ZmlsZXNyYy5oOgorCSogZ3N0L211bHRpZmlsZS9wYXR0ZXJuc3BlYy5jOgorCSogZ3N0L211bHRpZmlsZS9wYXR0ZXJuc3BlYy5oOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnQuYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguaDoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5oOgorCSogZ3N0L3J0cC9mbnYxaGFzaC5jOgorCSogZ3N0L3J0cC9mbnYxaGFzaC5oOgorCSogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzoKKwkqIGdzdC9ydHAvZ3N0YXN0ZXJpc2toMjYzLmg6CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhYzNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBidmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2hhbm5lbHMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2hhbm5lbHMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGR2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIycGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFjZWxwZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwcWRtZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWRtZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwc2lyZW5kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbWFuYWdlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmg6CisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0cGRlYy5oOgorCSogZ3N0L3J0c3AvZ3N0cnRzcC5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcC5oOgorCSogZ3N0L3J0c3AvZ3N0cnRzcGV4dC5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcGV4dC5oOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmg6CisJKiBnc3Qvc21wdGUvYmFyYm94d2lwZXMuYzoKKwkqIGdzdC9zbXB0ZS9nc3RtYXNrLmM6CisJKiBnc3Qvc21wdGUvZ3N0bWFzay5oOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuaDoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5oOgorCSogZ3N0L3NtcHRlL3BhaW50LmM6CisJKiBnc3Qvc21wdGUvcGFpbnQuaDoKKwkqIGdzdC9zbXB0ZS9wbHVnaW4uYzoKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5oOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJKiBnc3QvdWRwL2dzdHVkcC5jOgorCSogZ3N0L3VkcC9nc3R1ZHAuaDoKKwkqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuaDoKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmg6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94Lmg6CisJKiBnc3QvdmlkZW9jcm9wL2dzdGFzcGVjdHJhdGlvY3JvcC5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuaDoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5oOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuaDoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuaDoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuaDoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb21lZGlhbi5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvbWVkaWFuLmg6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW90ZW1wbGF0ZS5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL3BsdWdpbi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuaDoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIycGFkLmg6CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuaDoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuaDoKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHBsdWdpbi5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5oOgorCSogc3lzL29zcy9jb21tb24uaDoKKwkqIHN5cy9vc3MvZ3N0b3NzYXVkaW8uYzoKKwkqIHN5cy9vc3MvZ3N0b3NzZG1hYnVmZmVyLmM6CisJKiBzeXMvb3NzL2dzdG9zc2RtYWJ1ZmZlci5oOgorCSogc3lzL29zcy9nc3Rvc3NoZWxwZXIuYzoKKwkqIHN5cy9vc3MvZ3N0b3NzaGVscGVyLmg6CisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzoKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5oOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkqIHN5cy9vc3MvZ3N0b3Nzc3JjLmg6CisJKiBzeXMvb3NzNC9vc3M0LWF1ZGlvLmM6CisJKiBzeXMvb3NzNC9vc3M0LWF1ZGlvLmg6CisJKiBzeXMvb3NzNC9vc3M0LXByb3BlcnR5LXByb2JlLmM6CisJKiBzeXMvb3NzNC9vc3M0LXByb3BlcnR5LXByb2JlLmg6CisJKiBzeXMvb3NzNC9vc3M0LXNpbmsuYzoKKwkqIHN5cy9vc3M0L29zczQtc2luay5oOgorCSogc3lzL29zczQvb3NzNC1zb3VyY2UuYzoKKwkqIHN5cy9vc3M0L29zczQtc291cmNlLmg6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW8uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2VsZW1lbnQuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2VsZW1lbnQuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmg6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvLmg6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4cmluZ2J1ZmZlci5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeHJpbmdidWZmZXIuaDoKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5oOgorCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW8uYzoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlci5oOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuaDoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyb3B0aW9ucy5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJvcHRpb25zLmg6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcnRyYWNrLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcnRyYWNrLmg6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmg6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuYzoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMi5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwycmFkaW8uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJyYWRpby5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvb3ZlcmxheS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvb3ZlcmxheS5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZG9yaWVudC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZG9yaWVudC5oOgorCSogc3lzL3Y0bDIvdHVuZXIuYzoKKwkqIHN5cy92NGwyL3R1bmVyLmg6CisJKiBzeXMvdjRsMi90dW5lcmNoYW5uZWwuYzoKKwkqIHN5cy92NGwyL3R1bmVyY2hhbm5lbC5oOgorCSogc3lzL3Y0bDIvdHVuZXJub3JtLmM6CisJKiBzeXMvdjRsMi90dW5lcm5vcm0uaDoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuaDoKKwkqIHN5cy93YXZlZm9ybS9nc3R3YXZlZm9ybXBsdWdpbi5jOgorCSogc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5jOgorCSogc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5oOgorCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmg6CisJKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzoKKwkqIHN5cy94aW1hZ2UveGltYWdldXRpbC5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYWFjcGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FjM3BhcnNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hbHBoYWNvbG9yLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hbXJwYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXBldjJtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FzcGVjdHJhdGlvY3JvcC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9hbXBsaWZ5LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2R5bmFtaWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZWNoby5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9pbnZlcnQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvcGFub3JhbWEuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1dG9kZXRlY3QuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpc3VidGl0bGUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NhcHNzZXR0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsYWNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGVhdmUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsYWNwYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZmx2ZGVtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2Zsdm11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZ2RrcGl4YnVmc2luay5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWN5ZGVtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM2RlbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDN2Mm11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW1hZ2VmcmVlemUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ludGVybGVhdmUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2pwZWdkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2pwZWdlbmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbWF0cm9za2FwYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcGFyc2VyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9wYXJzZXIuaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW5fYnVmZmVyX2xpc3QuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc2hhcGV3aXBlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc3BlY3RydW0uYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3N1bmF1ZGlvLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy91ZHBzaW5rLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy91ZHBzcmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9maWx0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZwOGRlYy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdnA4ZW5jLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZGVjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZW5jLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrcGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3k0bWVuYy5jOgorCSogdGVzdHMvY2hlY2svZ2VuZXJpYy9zdGF0ZXMuYzoKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy9lZmZlY3R2LmM6CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvZmxhY2RlYy5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3NpbXBsZS1sYXVuY2gtbGluZXMuYzoKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy90YWdzY2hlY2tpbmcuYzoKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZlbmMuYzoKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZwYWNrLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L2ZpcmZpbHRlci1leGFtcGxlLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L2lpcmZpbHRlci1leGFtcGxlLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9jYWlyby9jYWlyb19vdmVybGF5LmM6CisJKiB0ZXN0cy9leGFtcGxlcy9sZXZlbC9sZXZlbC1leGFtcGxlLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9wdWxzZS9wdWxzZS5jOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWFsc2FzcmMtUENNQS5jOgorCSogdGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlL3NoYXBld2lwZS1leGFtcGxlLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1vc3NzcmMuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL3NwZWN0cnVtLWV4YW1wbGUuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvY2FtY3RybC5jOgorCSogdGVzdHMvaWNsZXMvZXF1YWxpemVyLXRlc3QuYzoKKwkqIHRlc3RzL2ljbGVzL2dka3BpeGJ1ZnNpbmstdGVzdC5jOgorCSogdGVzdHMvaWNsZXMvdGVzdC1vc3M0LmM6CisJKiB0ZXN0cy9pY2xlcy92NGwyc3JjLXRlc3QuYzoKKwkqIHRlc3RzL2ljbGVzL3ZpZGVvYm94LXRlc3QuYzoKKwkqIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6CisJKiB0ZXN0cy9pY2xlcy92aWRlb2Nyb3AyLXRlc3QuYzoKKwkqIHRlc3RzL2ljbGVzL3hpbWFnZXNyYy10ZXN0LmM6CisJICBGaXggRlNGIGFkZHJlc3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc1MjAKKworMjAxMi0xMS0wMiAxODo0NzoyNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkgIHZyYXdkZXBheTogZG9uJ3QgYWNjZXNzIHJ0cCBidWZmZXIgYWZ0ZXIgdW5tYXAKKwkgIFJlYWQgdGhlIG1hcmtlciBiaXQgYmVmb3JlIHdlIHVubWFwIHRoZSBydHAgcGFja2V0LgorCisyMDEyLTExLTAyIDA5OjM0OjI1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZweC9nc3R2cDhkZWMuYzoKKwkgIHZwOGRlYzogSW1tZWRpYXRlbHkgcmV0dXJuIGlmIG9wZW5pbmcgdGhlIGRlY29kZXIgZmFpbGVkCisJICBJbnN0ZWFkIG9mIGlnbm9yaW5nIGFueSBlcnJvcnMuCisKKzIwMTItMTEtMDEgMjI6MDI6MzkgKzAxMDAgIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKworCSogZXh0L3ZweC9nc3R2cDhkZWMuYzoKKwkgIHZwOGRlYzogU2hvcnQgY2lyY3VpdCBnc3RfdnA4X2RlY19oYW5kbGVfZnJhbWUgaWYga2V5ZnJhbWUgaXMgbWlzc2luZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NzM3NgorCisyMDEyLTExLTAyIDEwOjUzOjU3ICsxMzAwICBEb3VnbGFzIEJhZ25hbGwgPGRvdWdsYXNAcGFyYWRpc2UubmV0Lm56PgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSAgdmlkZW9jb252ZXJ0OiBDb21wYXJlIHkgb2Zmc2V0IHdpdGggaGVpZ2h0LCBub3Qgd2lkdGgsIHdoZW4gdGVzdGluZyBmb3Igb3ZlcmxhcAorCSAgVGhpcyBjb3VsZCBoYXZlIHByZXZlbnRlZCBpbWFnZXMgc2hvd2luZyB0aGF0IHNob3VsZCBoYXZlIHdoZW4gdGhlCisJICBzb3VyY2UgaGVpZ2h0IGlzIGdyZWF0ZXIgdGhhbiBpdHMgd2lkdGguCisJICBXaGVuIHdpZHRoIGV4Y2VlZHMgaGVpZ2h0LCBhcyBpcyBjb21tb24sIGl0IHByb2JhYmx5IG9ubHkgY2F1c2VkIGEKKwkgIG1pbmlzY3VsZSBhbW91bnQgb2YgdW5uZWNlc3Nhcnkgd29yay4gIEkgaGF2ZW4ndCB0ZXN0ZWQuCisKKzIwMTItMTEtMDEgMjE6MDk6NTYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZwOHBheS5oOgorCSAgcnRwdnA4OiBpbmNsdWRlIGNvbmZpZy5oIGFuZCBtaW5vciBzdHlsZSBmaXhlcworCisyMDEyLTExLTAxIDIwOjEzOjQzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgcnRwOiBmaXggdGFicy9zcGFjZSBtZXNzIGluIE1ha2VmaWxlLmFtCisKKzIwMTItMTEtMDEgMjA6MDU6NDkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cC9nc3RydHB2cDguYzoKKwkgIHJ0cDogbW92ZSBWUDggcGF5bG9hZGVyIGFuZCBkZXBheWxvYWRlciBmcm9tIC1iYWQKKwkgIFNwZWMgaXMgc3RpbGwgaW4gZHJhZnQgc3RhdGUsIGJ1dCBzaG91bGQgaG9wZWZ1bGx5IG5vdAorCSAgY2hhbmdlIG11Y2ggbm93LiBCZXNpZGVzLCB3ZSBhbm5vdW5jZSB0aGluZ3MgYXMgVlA4LURSQUZULUlFVEYtMDEKKwkgIGluIG91ciBjYXBzLCBzbyBldmVuIGlmIHRoaW5ncyBjaGFuZ2UgaW4gaW5jb21wYXRpYmxlIHdheXMgaXQKKwkgIHNob3VsZCBub3QgYnJlYWsgYW55dGhpbmcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg3MjYzCisKKzIwMTItMTAtMTcgMTc6MzQ6MjYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZwOHBheS5jOgorCSAgcnRwdnA4OiB1c2UgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSgpCisJICB3aGVyZSBwb3NzaWJsZS4gQXZvaWRzIHNvbWUgc3RyaW5nIGNvcGllcy4gQWxzbyByZS1pbmRlbnQKKwkgIHNvbWUgc3R1ZmYuIEFsc28gc29tZSBpbmRlbnQgZml4ZXMgaGVyZSBhbmQgdGhlcmUuCisKKzIwMTItMDktMTQgMTc6MDg6NDkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOHBheS5jOgorCSAgcnRwdnA4OiByZXBsYWNlIGdzdF9lbGVtZW50X2NsYXNzX3NldF9kZXRhaWxzX3NpbXBsZSB3aXRoIGdzdF9lbGVtZW50X2NsYXNzX3NldF9tZXRhZGF0YQorCisyMDEyLTA0LTA1IDE4OjAyOjU2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cDguYzoKKwkgIHJ0cHZwODogdXBkYXRlIGZvciBHU1RfUExVR0lOX0RFRklORSgpIEFQSSBjaGFuZ2VzCisKKzIwMTItMDMtMjggMTI6NDk6NTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5LmM6CisJICBydHB2cDg6IHVwZGF0ZSBmb3IgYnVmZmVyIGNoYW5nZXMKKworMjAxMi0wMy0wMSAxNDo1OTo1NSAtMDMwMCAgRGFuaWxvIENlc2FyIExlbWVzIGRlIFBhdWxhIDxkYW5pbG8uY2VzYXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZwOHBheS5jOgorCSAgcnRwdnA4OyBmaXggY29tcGF0aWJpbGl0eSB3aXRoIHRoZSB0aGlyZCBkcmFmdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3MTA3MworCisyMDEyLTAxLTI1IDE2OjIwOjQxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cDhwYXkuYzoKKwkgIHJ0cHZwODogcG9ydCBzb21lIG1vcmUgdG8gbmV3IG1lbW9yeSBBUEkKKworMjAxMi0wMS0yNSAxMDo0NTo1MSArMDEwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHB2cDhwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5Lmg6CisJICBydHB2cDg6IHBvcnQgdG8gMC4xMQorCisyMDExLTEwLTAzIDEyOjA2OjI3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cDhwYXkuYzoKKwkgIHJ0cHZwOHBheTogRml4IHR5cG8KKworMjAxMS0wOS0yMyAyMjo1ODozMCArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cDhwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5Lmg6CisJICBydHB2cDg6IFVwZGF0ZSB0aGUgcGF5L2RlcGF5IHRvIHRoZSBpZXRmLWRyYWZ0LTAxIHNwZWMKKworMjAxMS0wOS0xMCAxMTozMToyMCArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZGJvb2xodWZmLmM6CisJKiBnc3QvcnRwL2Rib29saHVmZi5oOgorCSogZ3N0L3J0cC9nc3RydHB2cDhwYXkuYzoKKwkgIHJ0cHZwODogZml4IGJpdHN0cmVhbSBwYXJzaW5nIHVzaW5nIHRoZSB3cm9uZyBraW5kIG9mIGJpdHJlYWRlcgorCSAgVlA4IHVzZXMgYSBwcm9iYWJpbGlzdGljIGJvb2wgY29kZXIsIG5vdCBhIHN0cmFpZ2h0IGJpdCBjb2Rlci4KKwkgIFRoaXMgZml4ZXMgcGFyc2luZyB3aGVuIGVycm9yLXJlc2lsaWVudCBpcyBzZXQuCisJICBUaGlzIGNvbW1pdCBpbmNsdWRlcyBhIGNvcHkgb2YgbGlidnB4J3MgYm9vbCBjb2RlciwgQlNEIGxpY2Vuc2VkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MjY5NAorCisyMDExLTA3LTEyIDE4OjAzOjUzIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOHBheS5jOgorCSAgcnRwdnA4OiBSZWplY3QgdW5rbm93biBiaXRzdHJlYW0gdmVyc2lvbnMKKworMjAxMS0wMy0wNCAxMTo1OTo0NCArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5LmM6CisJICBydHB2cDg6IEZpeCB1bml0aWFsaXplZCB2YXJpYWJsZQorCSAgTWFrZXMgbWFjb3N4IGNvbXBpbGVyIGhhcHB5LgorCisyMDExLTAxLTIzIDE3OjAyOjM4ICswMDAwICBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4ZGVwYXkuYzoKKwkgIHJ0cHZwOGRlcGF5OiBBY2NlcHQgcGFja2V0cyB3aXRoIG9ubHkgb25lIGJ5dGUgb2YgZGF0YQorCSAgV2hlbiBmcmFnbWVudGluZyBwYXJ0aW9ucyBpdCBjYW4gaGFwcGVuIHRoYXQgYW4gUlRQIHBhY2tldCBvbmx5IGNhcmllcyAxCisJICBieXRlIG9mIFJUUCBkYXRhLgorCisyMDExLTAxLTIzIDE2OjQyOjE3ICswMDAwICBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZwOHBheS5oOgorCSAgcnRwdnA4cGF5OiBUcmVhdCB0aGUgZnJhbWUgaGVhZGVyIGp1c3QgbGlrZSBhbnkgb3RoZXIgcGFydGl0aW9uCisJICBXaGVuIHNldHRpbmcgdXAgdGhlIGluaXRpYWwgbWFwcGluZyBqdXN0IGFjdCBhcyBpZiB0aGUgZ2xvYmFsIGZyYW1lCisJICBpbmZvcm1hdGlvbiBpcyBhbm90aGVyIHBhcnRpdGlvbi4gVGhpcyBzYXZlcyBzcGVjaWFsLWNhc2luZyBpdCBsYXRlciBpbgorCSAgdGhlIGFjdHVhbCBwYWNrZXRpemluZyBjb2RlLgorCisyMDEwLTA1LTE2IDE3OjIzOjE3ICswMTAwICBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisKKwkqIGdzdC9ydHAvZGJvb2xodWZmLkxJQ0VOU0U6CisJKiBnc3QvcnRwL2dzdHJ0cHZwOC5jOgorCSogZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHB2cDhwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5Lmg6CisJICBydHB2cDg6IEFkZCBzaW1wbGUgcGF5bG9hZGVycyBhbmQgZGVwYXlsb2FkZXJzIGZvciBWUDgKKwkgIE1pbmltYWwgaW1wbGVtZW50YXRpb24gb2YgaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvY29kZS9zcGVjcy9ydHAvLAorCSAgdmVyc2lvbiAwLjMuMgorCisyMDEyLTExLTAxIDE4OjQyOjM5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSAgZ3N0cGF5OiBmaXggZm9yIDEuMCBldmVudHMKKwkgIENhcHMgZXZlbnRzIGFyZSBzb21ldGltZXMgbm90IGZvbGxvd2VkIGJ5IGEgYnVmZmVyIGJ1dCBieSBhbiBldmVudC4gRmx1c2ggYW55CisJICBwZW5kaW5nIGNhcHMgYmVmb3JlIHdlIG1ha2UgYSBwYWNrZXQgd2l0aCB0aGUgZXZlbnQuCisJICBDaGFpbiB1cCB0byB0aGUgcGFyZW50IGV2ZW50IGhhbmRsZXIgYmVmb3JlIHdlIGF0dGVtcHQgdG8gcHVzaCBSVFAgcGFja2V0cywgaXQKKwkgIG1pZ2h0IGJlIGEgc2VnbWVudCBldmVudC4KKworMjAxMi0xMS0wMSAxODo0MjoyNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jOgorCSAgZ3N0ZGVwYXk6IGZpeCBzbWFsbCBsZWFrCisKKzIwMTItMTEtMDEgMTc6NDQ6MTEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkgIGdzdGRlcGF5OiBhZGQgc3VwcG9ydCBmb3IgZXZlbnRzCisJICBDb25mbGljdHM6CisJICBnc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmMKKworMjAxMi0xMS0wMSAxNzo0MDozMSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5Lmg6CisJICBydHBnc3RwYXk6IGFkZCBzdXBwb3J0IGZvciBzZW5kaW5nIGV2ZW50cworCSAgV2UgY3VycmVudGx5IG9ubHkgc2VuZCB0YWdzIGFuZCBjdXN0b20gZXZlbnRzLiBUaGUgb3RoZXIgZXZlbnRzCisJICBtaWdodCBpbnRlcmZlcmUgd2l0aCB0aGUgcmVjZWl2ZXIgdGltaW5ncyBvciBhcmUgb3RoZXJ3aXNlIGhhbmRsZWQKKwkgIGJ5IFJUUC4KKwkgIENvbmZsaWN0czoKKwkgIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmMKKworMjAxMi0xMS0wMSAxNTo1NDo1OCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5Lmg6CisJICBnc3RwYXk6IHJld3JpdGUgcGF5bG9hZGVyCisJICBVc2UgYWRhcHRlciB0byBhc3NlbWJsZSB0aGUgcGF5bG9hZCBhbmQgbWFrZSBhIGZsdXNoIGZ1bmN0aW9uIHRvCisJICB0dXJuIHRoaXMgcGF5bG9hZCBpbnRvIChmcmFnbWVudGVkKSBwYWNrZXRzLgorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L3J0cC9nc3RydHBnc3RwYXkuYworCSAgZ3N0L3J0cC9nc3RydHBnc3RwYXkuaAorCisyMDEyLTExLTAxIDEzOjAzOjQ0ICswMDAwICBEb3VnbGFzIEJhZ25hbGwgPGRvdWdsYXNAcGFyYWRpc2UubmV0Lm56PgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSAgdmlkZW9taXhlcjogZ2V0IGhlaWdodCB2aWEgR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCwgbm90IF9XSURUSAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NzMzMAorCisyMDEyLTExLTAxIDEzOjAyOjE2ICswMDAwICBEb3VnbGFzIEJhZ25hbGwgPGRvdWdsYXNAcGFyYWRpc2UubmV0Lm56PgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVib3g6IGZpeCBib3JkZXIgZmlsbGluZyBmb3IgZ3JheSBmb3JtYXRzCisJICBHZXQgdGhlIGhlaWdodCB2aWEgR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCwgbm90IF9XSURUSC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODczMzAKKworMjAxMi0xMS0wMSAxMTo1ODo1NyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jOgorCSAgZ3N0ZGVwYXk6IGNoZWNrIGZvciBjb3JyZWN0IGZyYWdtZW50IG9mZnNldAorCSAgTWFrZSBzdXJlIHdlIG9ubHkgaW5zZXJ0IHRoZSBydHAgcGFja2V0IGluIHRoZSBhZGFwdGVyIHdoZW4gdGhlCisJICBmcmFnX29mZnNldCBtYXRjaGVzLiBXaGVuIHRoZSBmaXJzdCBwYWNrZXQgb2YgYSBmcmFnbWVudCBpcyBkcm9wcGVkLAorCSAgaXQgYXZvaWRzIHB1dHRpbmcgdGhlIHJlbWFpbmluZyBwYWNrZXRzIGluIHRoZSBhZGFwdGVyIGFuZCBwcm9jZXNzaW5nCisJICB0aGUgcGFydGlhbCBmcmFnbWVudC4KKwkgIENvbmZsaWN0czoKKwkgIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYworCisyMDEyLTExLTAxIDExOjU0OjUwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSAgZ3N0cGF5OiBzZXQgQyBmbGFnIG9uIGFsbCBidWZmZXJzIG9mIHRoZSBmcmFnbWVudAorCSAgU2V0IHRoZSBDIGZsYWdzIG9uIGFsbCB0aGUgZnJhZ21lbnRzIGluc3RlYWQgb2Ygb25seSB0aG9zZSB3aXRoCisJICBjYXBzIGluIHRoZW0uIFRoaXMgbWFrZXMgaXQgZWFzaWVyIGluIHRoZSByZWNlaXZlciB0byBjaGVjayBpZiB0aGVyZQorCSAgaXMgYSBjYXBzIGluIHRoZSBhc3NlbWJsZWQgZnJhZ21lbnRzIGp1c3QgYnkgbG9va2luZyBhdCB0aGUgbGFzdCBSVFAKKwkgIHBhY2tldCBmbGFncy4KKworMjAxMi0xMS0wMSAxMDo1NTowMyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jOgorCSAgZ3N0ZGVwYXk6IHVzZSB0aGUgY2Fwc3ZlcnNpb24KKwkgIFRha2UgdGhlIGNhcHMgZnJvbSB0aGUgaW5wdXQgY2FwcyBhbmQgc3RvcmUgaXQgaW4gdGhlIHNsb3QgZ2l2ZW4KKwkgIGJ5IGNhcHN2ZXJzaW9uLgorCisyMDEyLTExLTAxIDEwOjUyOjI1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuaDoKKwkgIGdzdHBheTogc2VuZCBjYXBzIGlubGluZQorCSAgUGxhY2UgdGhlIGNhcHN2ZXJzaW9uIG9uIHRoZSBvdXRnb2luZyBjYXBzIHNvIHRoYXQgdGhleSBlbmQgdXAgaW4KKwkgIGFuIFNEUCBhcyB3ZWxsLiBSZWNlaXZlcnMgbmVlZCB0byBrbm93IHdoYXQgY2Fwc3ZlcnNpb24gYSBwYXJ0aWN1bGFyCisJICBjYXBzIGlzIGZvciB0byBiZSBhYmxlIHRvIG1hdGNoIHRoZSBjYXBzIHRvIHRoZSBDViBpbiB0aGUgUlRQIHBhY2tldHMuCisJICBQbGFjZSB0aGUgY2FwcyBpbnNpZGUgdGhlIFJUUCBwYWNrZXQgd2hlbmV2ZXIgdGhlIGNhcHMgY2hhbmdlLgorCSAgQmFzZWQgb24gcGF0Y2ggYnkgQW5kcnplaiBCaWVuaWVrIDxhbmRyemVqLmJpZW5pZWtAcHVyZS5jb20+CisJICBDb25mbGljdHM6CisJICBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jCisJICBnc3QvcnRwL2dzdHJ0cGdzdHBheS5oCisKKzIwMTItMTAtMzEgMTY6MTc6NDggKzAwMDAgIEFuZHJ6ZWogQmllbmllayA8YW5kcnplai5iaWVuaWVrQHB1cmUuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSAgZ3N0cGF5OiBhZGQgZGVidWcKKwkgIENvbmZsaWN0czoKKwkgIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmMKKworMjAxMi0xMC0zMSAxNjowOToyNiArMDAwMCAgQW5kcnplaiBCaWVuaWVrIDxhbmRyemVqLmJpZW5pZWtAcHVyZS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkgIGRlcGF5OiBjb3JyZWN0bHkgc2tpcCBjYXBzIGhlYWRlciBzaXplCisJICBDb25mbGljdHM6CisJICBnc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmMKKworMjAxMi0wOS0yOCAwMDo0MzozOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICBtYXRyb3NrYWRlbXV4OiBwdXQgc3RyZWFtaGVhZGVycyBvbiB2b3JiaXMvc3BlZXgvZmxhYy90aGVvcmEgY2FwcyB0byBtYWtlIHJlbXV4aW5nIHdvcmsKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDA1ODkKKworMjAxMi0xMC0yOCAwMDowNzo0NiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogZG9uJ3QgYXNzZXJ0IGluIGdldF90aW1lKCkgd2hlbiBjYWxsZWQgYWZ0ZXIgc2h1dGRvd24KKwkgIFdoaWNoIG1pZ2h0IGhhcHBlbiBpZiB0aGUgc291cmNlIGdldHMgc2V0IHRvIE5VTEwgc3RhdGUgYmVmb3JlCisJICB0aGUgcmVzdCBvZiB0aGUgcGlwZWxpbmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg2OTg1CisKKzIwMTItMTAtMzAgMTE6MTA6NDkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL2xldmVsL2xldmVsLWV4YW1wbGUuYzoKKwkgIHRlc3RzOiBmaXggbGV2ZWwgZXhhbXBsZQorCSAgVXNlIHRoZSBHVmFsdWVBcnJheSBpbiB0aGUgbWVzc2FnZS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODcxNTQKKworMjAxMi0xMC0yNyAyMzoyMjozNiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2F1cGFyc2UvTWFrZWZpbGUuYW06CisJKiBnc3QvbGV2ZWwvTWFrZWZpbGUuYW06CisJKiBnc3QveTRtL01ha2VmaWxlLmFtOgorCSAgZ3N0OiBmaXggdmFyaWFibGUgb3JkZXIgaW4gc29tZSBNYWtlZmlsZS5hbQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NzAxMworCisyMDEyLTEwLTI3IDE3OjI3OjE2IC0wNDAwICBBbnRvaW5lIFRyZW1ibGF5IDxoZXhhMDBAZ21haWwuY29tPgorCisJKiBleHQvbGliY2FjYS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdXBhcnNlL01ha2VmaWxlLmFtOgorCSogZ3N0L2xldmVsL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvY3JvcC9NYWtlZmlsZS5hbToKKwkqIGdzdC95NG0vTWFrZWZpbGUuYW06CisJICBnc3Q6IGFkZCB2YXJpb3VzIG1pc3NpbmcgR1NUX1BMVUdJTlNfQkFTRV9MSUJTIGluIE1ha2VmaWxlLmFtCisJICBUaG9zZSBwbHVnaW5zIGRlcGVuZCBvbiBlaXRoZXIgbGliZ3N0YXVkaW8gb3IgbGliZ3N0dmlkZW8sCisJICB3aGljaCBhcmUgaW4gZ3N0LXBsdWdpbnMtYmFzZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODcwMTMKKworMjAxMi0xMC0yNyAxMzoyNDoyNCArMDEwMCAgQWxleGV5IEZpc2hlciA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IG1hcmsgaW52aXNpYmxlIFZQOCBmcmFtZXMgd2l0aCB0aGUgREVDT0RFX09OTFkgZmxhZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1NDI1OQorCisyMDEyLTEwLTI2IDEwOjU1OjI4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWx0aWZpbGUuYzoKKwkgIHRlc3RzOiBhZGQgbXVsdGlmaWxlc3JjIHRlc3QgZm9yIGZpeCBpbiBwcmV2aW91cyBjb21taXQKKwkgIE1ha2Ugc3VyZSB0aGUgc3RvcC1pbmRleCBzZXQgaXMgaG9ub3VyZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0ODUzCisKKzIwMTItMTAtMjYgMTA6MzM6MDMgKzAxMDAgIFN0YXMgU2VyZ2VldiA8c3RzcEBha25ldC5ydT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkgIG11bHRpZmlsZXNyYzogZml4IHN0b3AgaW5kZXggaGFuZGxpbmcKKwkgIE1ha2Ugc3VyZSB0aGUgc3RvcCBpbmRleCBpcyBhbHdheXMgaG9ub3VyZWQuIEF2b2lkcworCSAgZW5kbGVzcyBsb29wIGlmIG9uZSB3YW50cyB0byByZWFkIGFuZCBvdXRwdXQgdGhlIHNhbWUKKwkgIGZpbGUgTiB0aW1lcywgZm9yIGV4YW1wbGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0ODUzCisKKzIwMTItMDgtMjUgMDI6MjY6MjkgKzA0MDAgINCg0YPRgdC70LDQvSDQmNC20LHRg9C70LDRgtC+0LIgPGxybjE5ODZAZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thZGVtdXg6IFN1cHBvcnQgcmVjdXJzaXZlIFNpbXBsZVRhZ3MKKwkgIEZpeGVzICM2ODI2NDQKKwkgIERlcGVuZHMgb24gIzY4MjYxNQorCisyMDEyLTA4LTI0IDEzOjU1OjQxICswNDAwICDQoNGD0YHQu9Cw0L0g0JjQttCx0YPQu9Cw0YLQvtCyIDxscm4xOTg2QGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYWRlbXV4OiBFeHBhbmQgdGhlIHRhZyBtYXBwaW5nLgorCSAgKiBBbHNvIGV4cG9zZSB1bmtub3duIHRhZ3MgYXMga2V5PXZhbHVlIHBhaXJzLgorCSAgKiBBcnJhbmdlIHRhZyBtYXAgaW4gdGhlIHNhbWUgb3JkZXIgdGFncyBhcmUgbGlzdGVkIGluIE1hdHJvc2thIHNwZWMsIGxlYXZpbmcKKwkgIHVubWFwcGVkIHRhZ3MgYXMgY29tbWVudHMuCisJICAqIE1vcmUgc3BlY2lmaWMgVE9ET3MuCisJICAqIFJlbW92ZSBkdXBsaWNhdGUgREFURSBkZWZpbmUuCisJICBGaXhlcyAjNjgyNjE1CisJICBEZXBlbmRzIG9uICM2ODI1MjQKKworMjAxMi0xMC0yNiAxMDowOTozOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWF0cm9za2FkZW11eDogRml4IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgY29tcGlsZXIgd2FybmluZworCisyMDEyLTA4LTIzIDE1OjA3OjIyICswNDAwICDQoNGD0YHQu9Cw0L0g0JjQttCx0YPQu9Cw0YLQvtCyIDxscm4xOTg2QGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYWRlbXV4OiBNYXRyb3NrYSB0YWcgVGFyZ2V0VHlwZSBzdXBwb3J0CisJICAqIFJlYWRzIFRhcmdldFR5cGUgYW5kIFRhcmdldFR5cGVWYWx1ZSBmcm9tIGEgVGFnLgorCSAgKiBBZnRlciBUYWcgaXMgY29tcGxldGVseSByZWFkLCBwcm9jZXNzZXMgdGFnbGlzdCwgc3Vic3RpdHV0aW5nIHNvbWUgb2YgdGhlCisJICB0YWdzIGRlcGVuZGluZyBvbiB0YXJnZXQgdHlwZSB2YWx1ZSBhbmQgdGhlIHByZXNlbmNlIG9mIHZpZGVvL3N1YnRpdGxlIHN0cmVhbXMuCisJICAqIFN1cHBvcnRzIHJlYWRpbmcgdHdvIG5ldyBzaW1wbGV0YWdzIC0gUEFSVF9OVU1CRVIgYW5kIFRPVEFMX1BBUlRTCisJICBEZXBlbmRzIG9uICM2ODI0NDgKKwkgIEZpeGVzICM2ODI1MjQKKworMjAxMi0wOC0yMiAxNTozMjo0MSArMDQwMCAg0KDRg9GB0LvQsNC9INCY0LbQsdGD0LvQsNGC0L7QsiA8bHJuMTk4NkBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYWRlbXV4OiBQZXItdHJhY2sgdGFncyBmb3IgTWF0cm9za2EKKwkgIFJlcXVpcmVzIE1hdHJvc2thIGZpbGUgdG8gaGF2ZSBzYW5lIGxheW91dCAodHJhY2sgaW5mbyBiZWZvcmUgdGFnIGluZm8pLgorCSAgVXNlcyByZXBsYWNlLW1lcmdlLgorCSAgTWFrZXMgdHJhY2sgVUlEcyA2NC1iaXQuCisJICBGaXhlcyAjNjgyNDQ4CisKKzIwMTItMTAtMjUgMjA6MTg6MzYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJICBtdWx0aWZpbGVzcmM6IGZpeCB0eXBvIGluIHByb3BlcnR5IGRlc2NyaXB0aW9uCisKKzIwMTItMTAtMjUgMTI6MTg6MDMgLTA3MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEByZGlvLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZm91cmNjLmg6CisJICBxdGRlbXV4OiByZWFkIHZpZGVvIGZvcm1hdCBoZWFkZXIgZnVsbHkgKHNvIHdlIGNhbiBmaW5kICdwYXNwJyBhdG9tcykgZm9yIG1vcmUgZm91cmNjcy4gRml4ZXMgYXNwZWN0IHJhdGlvIG9mIHByb3JlcyBmaWxlcy4KKworMjAxMi0xMC0yNSAwMDo0NDozNCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYzoKKwkgIGltYWdlZnJlZXplOiB0aGUgbmV3IGdldF9jYXBzIGFscmVhZHkgZG9lcyB0aGUgZmlsdGVyIGludGVyc2VjdGlvbgorCSAgSXQgc2hvdWxkIGJlIGZhc3RlciB0byBwYXNzIHRoZSBjYXBzIHRvIGludGVyc2VjdCBhcyB0aGUgZmlsdGVyIGNhcHMsCisJICByYXRoZXIgdGhhbiB1c2luZyBOVUxMIGFuZCBpbnRlcnNlY3RpbmcgJ21hbnVhbGx5JyBsYXRlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODY4MzcKKworMjAxMi0xMC0yNSAwMDo0Mzo1MSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYzoKKwkgIGltYWdlZnJlZXplOiBhdm9pZCBhc3NlcnRpb24gd2hlbiB1c2luZyBhY2NlcHQgY2FwcyBxdWVyeQorCSAgVGhpcyBxdWVyeSBtdXN0IHJlY2VpdmUgYSBmaXhlZCBjYXBzLCBzbyBpbWFnZWZyZWV6ZSBzaG91bGQKKwkgIGZpeGF0ZSBpdHMgZnJhbWVyYXRlIGJlZm9yZSBzZW5kaW5nIHRoZSBxdWVyeSBkb3duc3RyZWFtLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NjgzNworCisyMDEyLTEwLTI1IDEyOjMzOjI0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIEJhY2sgdG8gZmVhdHVyZSBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjAuMiA9PT0KKworMjAxMi0xMC0yNSAwMTowMTowOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjAuMgorCisyMDEyLTEwLTI0IDEzOjUwOjAwICswMjAwICBBcm5hdWQgVnJhYyA8YXZyYWNAZnJlZWJveC5mcj4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiB1c2UgY29ycmVjdCB0eXBlIGZvciBjaGFubmVsLW1hc2sgYml0bWFzaworCSAgRml4ZXMgY3Jhc2ggb24gMzItYml0IHN5c3RlbXMuCisKKzIwMTItMTAtMjQgMTE6MTc6NTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IEZsdXNoIHRoZSByaW5nYnVmZmVyIG9uIEdBUCBldmVudHMgd2l0aG91dCBkdXJhdGlvbgorCSAgVGhpcyBpcyByZXF1aXJlZCB0byBwcm9wZXJseSBzdGFydCB0aGUgcmluZ2J1ZmZlciBhbmQgY2xvY2suCisKKzIwMTItMTAtMDIgMjA6NTE6MjkgKzAyMDAgIE9sZWtzaWogUmVtcGVsIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJICB2cDhlbmM6IHNldCBERUNPREVfT05MWSBmbGFnIG9uIGludmlzaWJsZSBBbHRSZWYgZnJhbWVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0MjE2CisKKzIwMTItMTAtMjMgMTY6MDI6MDUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBmaXggY292ZXJhcnQgZXh0cmFjdGlvbiBpZiB2b3JiaXMgY29tbWVudHMgY29tZSBhZnRlciBwaWN0dXJlIGhlYWRlcgorCSAgU2VlIHNhbXBsZSBmaWxlIGZvciBidWcgIzY4NDcwMS4KKworMjAxMi0xMC0yMyAxMzo0NToxNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGlnbm9yZSBiYWQgaGVhZGVycyBpZiB3ZSBoYXZlIGEgdmFsaWQgU1RSRUFNSU5GTyBoZWFkZXIKKwkgIElmIHdlIHJ1biBpbnRvIGFueSBoZWFkZXIgcGFyc2luZyBpc3N1ZXMgYW5kIHdlIGhhdmUgYSB2YWxpZAorCSAgU1RSRUFNSU5GTyBoZWFkZXIgYWxyZWFkeSwgZG9uJ3QgZXJyb3Igb3V0LCBidXQganVzdCBzdG9wCisJICBoZWFkZXIgcGFyc2luZyBhbmQgdHJ5IHRvIGZpbmQgc29tZSBhdWRpbyBmcmFtZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg0NzAxCisKKzIwMTItMTAtMjMgMTM6NDM6MTAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBwb3N0IHByb3BlciBlcnJvciBtZXNzYWdlIGFuZCBmaXggYnVmZmVyIGxlYWsgb24gaGVhZGVyIHBhcnNpbmcgZXJyb3IKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODQ3MDEKKworMjAxMi0xMC0yMiAyMjozMjo0OSAtMDcwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHJkaW8uY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHdpdGggcmF3IGF1ZGlvLCBzZXQgYSBkZWZhdWx0IGNoYW5uZWwtbWFzayBmb3IgbXVsdGljaGFubmVsIGF1ZGlvLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcGFyc2UgJ2NoYW4nIGJlY2F1c2UgaXQncyBhYnN1cmRseSBjb21wbGV4LgorCisyMDEyLTEwLTIyIDE1OjU0OjE3ICswMjAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJybkBheGlzLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVwZHNyYzogZml4IHR5cG8gY2F1c2luZyBjb21waWxhdGlvbiBlcnJvcgorCSAgZ3N0dWRwc3JjLmM6IEluIGZ1bmN0aW9uICdnc3RfdWRwc3JjX2NyZWF0ZSc6CisJICBnc3R1ZHBzcmMuYzozNjU6IGVycm9yOiAncmV0JyBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODY2NDIKKworMjAxMi0xMC0yMiAxMTo1NTo1OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpXyBmaXggaW52ZXJ0IGZ1bmN0aW9uCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg2NTUwCisKKzIwMTItMTAtMjIgMTE6NTU6MjIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aTogZml4IGRlYnVnCisKKzIwMTItMTAtMjIgMTE6Mzk6MzcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X2ZvdXJjYy5oOgorCSAgcXRkZW11eDogYWRkIHN1cHBvcnQgZm9yICdnZW5lcmljJyBzYW1wbGVzCisJICBBZGQgc3VwcG9ydCBmb3Igc3R1ZmZpbmcgYSBjb21wbGV0ZSBzdHJlYW0gaW50byAxIHNhbXBsZS4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg2NTUwCisKKzIwMTItMTAtMjAgMTM6MDE6NDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6CisJICB0ZXN0czogcmVtb3ZlIHN1cGVyZmx1b3VzIGdfdHlwZV9pbml0KCkgY2FsbAorCSAgSXQncyBkZXByZWNhdGVkIGluIG5ld2VyIEdMaWIgYW5kIG5vdCBuZWVkZWQgaGVyZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODY0NTYKKworMjAxMi0xMC0yMCAxMTozMjoyNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBmaXggY2FwcyBsZWFrIGluIGFjY2VwdGNhcHMgZnVuY3Rpb24KKworMjAxMi0xMC0xOSAxOToyNDoyMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZG9uJ3QgbGVhayBnc3RfcmlmZl9zdHJmX2F1ZHMgaW4gY2FzZSBvZiBNUy9SSUZGIGF1ZGlvCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgxMTkyCisKKzIwMTItMTAtMTggMjI6MjA6MzkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogdW5zaWduZWQgc3VidGl0bGUgdGVtcGxhdGUKKworMjAxMi0xMC0xOCAxMTozMjoxMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogaW4gYWNjZXB0X2NhcHMoKSBjaGVjayBpZiByaW5nIGJ1ZmZlciBpcyBOVUxMIGJlZm9yZSBkZS1yZWZlcmVuY2luZworCSAgQW5kIHNwcmlua2xlIHNvbWUgdGhyZWFkLXNhZmV0eSAodGFrZSBvYmplY3QgbG9jayBmb3IKKwkgIGFjY2Vzc2luZyByaW5nIGJ1ZmZlciwgYW5kIHBhIG1haW4gbG9vcCBsb2NrIGZvciB0aGUKKwkgIGNvbnRleHQpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Mzc4MgorCisyMDEyLTA5LTEzIDAwOjEwOjAwICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuaDoKKwkgIHZpZGVvbWl4ZXIyOiBGaXggcmFjZSBjb25kaXRpb24gd2hlcmUgYSBzcmMgc2V0Y2FwcyBpcyBpZ25vcmVkCisJICBJZiBib3RoIHBhZHMgcmVjZWl2ZSBkYXRhIGF0IHRoZSBzYW1lIHRpbWUsIHRoZXkgd2lsbCBib3RoIGdldCB0aGVpcgorCSAgc2lua19zZXRjYXBzIGNhbGxlZCB3aGljaCB3aWxsIGNhbGwgdGhlIHNyY19zZXRjYXBzLCBidXQgdGhlcmUgaXMKKwkgIGEgcmFjZSBjb25kaXRpb24gd2hlcmUgdGhlIHNlY29uZCBvbmUgbWlnaHQgbm90IGJlIGNhbGxlZC4KKwkgIEZpeGVzOiBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgzODQyCisKKzIwMTEtMTAtMzEgMTU6NDM6MjUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogZG8gbm90IHVzZSB1bm9mZmljYWwgVl9NSlBFRyBjb2RlYyBpZAorCSAgU2luY2UgaXQncyBub3Qgc3BlYydlZCwgY29uc2lkZXIgaXQgYSBWZlcgY29tcGF0aWJpbGl0eQorCSAgY2FzZS4gTWFueSBhcHBsaWNhdGlvbnMgKGUuZy4gYXZpZGVtdXgpIGRvbid0IHVuZGVyc3RhbmQKKwkgIHRoZSB1bm9mZmljaWFsIFZfTUpQRUcgaWQuCisJICBGaXhlcyAjNjU5ODM3LgorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jCisKKzIwMTItMTAtMTcgMTc6MzQ6MjYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mZGV0ZWN0LmM6CisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIFVzZSBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhKCkKKwkgIHdoZXJlIHBvc3NpYmxlLiBBdm9pZHMgc29tZSBzdHJpbmcgY29waWVzLiBBbHNvIHJlLWluZGVudAorCSAgc29tZSBzdHVmZi4gQWxzbyBzb21lIGluZGVudCBmaXhlcyBoZXJlIGFuZCB0aGVyZS4KKworMjAxMi0xMC0xNyAxNzowMzozOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOgorCSogZXh0L3ZweC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJICBqcGVnLCBwbmcsIHZweDogdXNlIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEoKQorCSAgQXZvaWRzIHNvbWUgc3RyaW5nIGNvcGllcy4KKworMjAxMi0xMC0xNyAxNDoyMzowMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkgIGpwZWdkZXBheTogc3RvcmUgcXVhbnQgdGFibGVzIGluIHppZ3phZyBvcmRlcgorCisyMDEyLTEwLTE3IDEzOjU1OjQ1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHNlc3Npb246IGZpeCBjb21waWxlciB3YXJuaW5nCisKKzIwMTItMTAtMTcgMTM6MzU6MDcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBjbGFyaWZ5IHRoZSBudHAtc3luYyBvcHRpb24KKworMjAxMi0xMC0xNyAxMzoxNTo0OCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjogdXBkYXRlIGNhcHMgaW4gdGhlIHNvdXJjZQorCSAgSW5mb3JtIHRoZSBzb3VyY2Ugd2hlbiBjYXBzIGNoYW5nZWQuIFRoaXMgd2FzIHJlbW92ZWQgaW4gdGhlIHBvcnQgdG8gMS4wCisJICBsZWF2aW5nIHRoZSBzb3VyY2UgdW5hd2FyZSBvZiB0aGUgY2xvY2stcmF0ZSBhbmQgdW5hYmxlIHRvIGludGVycG9sbGF0ZQorCSAgcnRwIHRpbWVzdGFtcHMgZm9yIFNSIHBhY2tldHMuCisKKzIwMTItMTAtMTcgMTI6NDY6MzIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBiaW46IHNldCBQVFMgYW5kIERUUyBpbiBqaXR0ZXJidWZmZmVyCisKKzIwMTItMTAtMTcgMTI6MjQ6MjIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBkaXNhYmxlIGNoZWNrIGZvciBudHAtc3luYworCSAgRGlzYWJsZSB0aGUgY2hlY2sgZm9yIHRoZSBudHAtc3luYyBtZXRob2QuIEl0IGlzIGV4cGVjdGVkIHRoYXQKKwkgIGEgcmF0aGVyIGxhcmdlciBvZmZzZXQgbmVlZHMgdG8gYmUgYXBwbGllZCB3aXRoIHRoaXMgbWV0aG9kLgorCisyMDEyLTEwLTE3IDEyOjE3OjMyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cGJpbjogdXNlIHJ1bm5pbmctdGltZSBmb3IgTlRQIHRpbWUKKwkgIFdoZW4gdXNlLXBpcGVsaW5lLWNsb2NrIGlzIHNldCwgdXNlIHRoZSBydW5uaW5nLXRpbWUgb2YgdGhlCisJICBwaXBlbGluZSB0byBjYWxjdWxhdGUgdGhlIE5UUCB0aW1lc3RhbXBzLiBUaGlzIG1ldGhvZCB3b3VsZCBwcmV2aW91c2x5CisJICBvbmx5IHdvcmsgd2hlbiB0aGUgYmFzZS10aW1lIGlzIHNldCB0byAwIGJ1dCB3aXRoIHRoaXMgY2hhbmdlIGl0IGNhbgorCSAgYWxzbyB3b3JrIHdpdGggZGlmZmVyZW50IG9mZnNldHMgYW5kIHdlIGNhbiBhbHNvIGltcGxlbWVudCBwYXVzZS9yZXN1bWUKKwkgIG9mIHRoZSBzZW5kZXIgYW5kIHJlY2VpdmVyIG5vdy4KKworMjAxMi0xMC0xNyAxMDoyMDoxMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmg6CisJICB2aWRlb2Nyb3A6IHBvcnQgdG8gdmlkZW9maWx0ZXIKKworMjAxMi0xMC0xNyAwOTozNjo1MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogdXNlIG91dF9pbmZvIGZvciBvdXQgcHJvcGVydGllcworCisyMDEyLTEwLTE2IDE0OjQwOjE5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9tZWRpYW4uYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb21lZGlhbi5oOgorCSAgbWVkaWFuOiBzbWFsbCBjbGVhbnVwcworCisyMDEyLTEwLTE2IDEzOjU2OjE5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBNYWtlZmlsZS5hbToKKwkqIGdzdC9tZWRpYW4vLmdpdGlnbm9yZToKKwkqIGdzdC9tZWRpYW4vTWFrZWZpbGUuYW06CisJKiBnc3QvbWVkaWFuL2dzdG1lZGlhbi5jOgorCSogZ3N0L21lZGlhbi9nc3RtZWRpYW4uaDoKKwkqIGdzdC9tZWRpYW4vbWVkaWFuLnZjcHJvajoKKwkgIG1lZGlhbjogcmVtb3ZlIG5vdyB0aGF0IGl0IGlzIGluIHZpZGVvZmlsdGVyCisKKzIwMTItMTAtMTYgMTM6NDk6MTEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogcmVtb3ZlIG1lZGlhbiBmcm9tIGJ1aWxkCisKKzIwMTItMTAtMTYgMTM6NDc6MjQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb21lZGlhbi5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvbWVkaWFuLmg6CisJKiBnc3QvdmlkZW9maWx0ZXIvcGx1Z2luLmM6CisJICB2aWRlb21lZGlhbjogY29weSBtZWRpYSB0byB2aWRlb21lZGlhbgorCSAgQ29weSB0aGUgbWVkaWFuIHZpZGVvIGZpbHRlciB0byB2aWRlb2ZpbHRlcnMgYW5kIHJlbmFtZSB0bworCSAgdmlkZW9tZWRpYW4uCisKKzIwMTItMTAtMTYgMTM6MTI6MjEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9tZWRpYW4vTWFrZWZpbGUuYW06CisJKiBnc3QvbWVkaWFuL2dzdG1lZGlhbi5jOgorCSogZ3N0L21lZGlhbi9nc3RtZWRpYW4uaDoKKwkgIG1lZGlhOiBwb3J0IHRvIDEuMAorCisyMDEyLTEwLTE2IDAxOjAyOjExICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogYXBwZW5kIHBhbGV0dGUgZGF0YSB0byBwYWxldHRlZCA4LWJpdCBSR0IgZnJhbWVzCisJICBGaXhlcyBwbGF5YmFjayBvZiA4LWJpdCBpbmRleGVkIFJHQiB2aWRlb3MsIHdpdGggZml4ZXMgaW4gLWJhc2UuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg2MDQ2CisKKzIwMTItMTAtMTUgMTU6MzY6MDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSAgdnA4ZW5jOiBBbmQgdGhpcyB0aW1lIGZpeCB0aGUgZGVmYXVsdCB0YXJnZXQtYml0cmF0ZSB2YWx1ZSBmb3IgcmVhbAorCisyMDEyLTEwLTE1IDE1OjMwOjMzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZweC9nc3R2cDhlbmMuYzoKKwkgIHZwOGVuYzogRml4IGRlZmF1bHQgdGFyZ2V0LWJpdHJhdGUgdmFsdWUKKworMjAxMi0xMC0xMyAwMDowMzoyOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBkb24ndCBhc3NlcnQgaWYgdXBzdHJlYW0gc2l6ZSBpcyBub3QgYXZhaWxhYmxlIHdoZW4gZ3Vlc3NpbmcgYml0cmF0ZXMKKwkgIEZpeGVzIGFib3J0IGluIHB1c2ggbW9kZSB3aGVyZSB0aGUgc291cmNlIGlzIG5vdCBzZWVrYWJsZSBhbmQgdGhlCisJICBzaXplIG9mIHRoZSBmaWxlIGlzIG5vdCBhdmFpbGFibGUsIGFzIHdpdGgKKwkgIGNhdCBmb28ubXA0IHwgZ3N0LWxhdW5jaC0xLjAgcGxheWJpbiB1cmk9ZmQ6Ly8wCisJICBMZXNzIG5vdGljYWJsZSB3aXRoIHJlbGVhc2VzLCBzaW5jZSB3ZSBkaXNhYmxlIGFsbAorCSAgZ19hc3NlcnQoKSB0aGVyZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODYwMDgKKworMjAxMi0xMC0xMiAxNDozODozMyAtMDcwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHJkaW8uY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IGFsbG93IG1vcmUgc3RyZWFtcy4gQnVtcCB0aGlzIGNvbnN0YW50IHRvIDMyLCB3aGljaCBzaG91bGQgYmUgZW5vdWdoIGZvciByZWFsLXdvcmxkIGZpbGVzLgorCisyMDEyLTEwLTEyIDE0OjM1OjI0IC0wNzAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAcmRpby5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogc3VwcG9ydCBtb3JlIGRpZmZlcmVudCBmb3VyY2MgdmFsdWVzIGZvciBvdGhlciBQcm9SZXMgdmFyaWFudHMuCisKKzIwMTItMTAtMTEgMjI6MzY6MjEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3AtQU1SLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC1QQ01BLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2NC1QQ01BLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLVZUUy1IMjYzcC1BVFMtUENNQS5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItVlRTLUgyNjNwLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1hbHNhc3JjLVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWRlY29kZWJpbi1IMjYzcC1BTVIuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXY0bDItSDI2M3AtYWxzYXNyYy1BTVIuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXY0bDItSDI2NC1hbHNhc3JjLVBDTUEuc2g6CisJICBleGFtcGxlczogdXBkYXRlIHNvbWUgZWxlbWVudCBuYW1lcyBmb3IgMS4wIGluIFJUUCBleGFtcGxlcworCSAgZ3N0cnRwYmluIC0+IHJ0cGJpbgorCSAgZmZkZWNfKiAgIC0+IGF2ZGVjXyoKKwkgIGZmZW5jXyogICAtPiBhdmVuY18qCisKKzIwMTItMTAtMTAgMTI6MDU6MzQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHJlbW92ZSB1bnVzZWQgaW5jbHVkZQorCisyMDEyLTEwLTEwIDEwOjU1OjI4ICswMjAwICBSYXNtdXMgUm9oZGUgPHJvaGRlQGR1ZmYuZGs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSAgbXVsdGl1ZHBzaW5rOiBhZGQgbXVsdGljYXN0LWlmYWNlIHByb3BlcnR5CisJICB1ZHBzcmMgYWxyZWFkeSBoYXMgc3VwcG9ydCBmb3Igc2V0dGluZyB0aGUgbXVsdGljYXN0IGludGVyZmFjZSwgd2hpY2gKKwkgIGlzIHVzZWZ1bCBmb3IgbXVsdGktaG9tZWQgbWFjaGluZXMuIFRoaXMgcGF0Y2ggYWRkcyB0aGUgc2FtZSBjb2RlIHRvCisJICB0aGUgbXVsdGl1ZHBzaW5rLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NTg2NAorCisyMDEyLTEwLTEwIDExOjMyOjE3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgbXVsdGl1ZHBzaW5rOiBkb24ndCBlcnJvciBvbiBzZW5kIGVycm9ycyBidXQgb25seSB3YXJuCisJICBEb24ndCBlcnJvciBvbiBzZW5kIGVycm9ycyBidXQgc2ltcGx5IHBvc3QgYSB3YXJuaW5nLCBpdCdzIHBvc3NpYmxlCisJICB0aGF0IHRoZSBuZXh0IHBhY2tldCB3aWxsIGJlIGZpbmUuCisKKzIwMTItMTAtMTAgMTA6Mjg6MjQgKzAyMDAgIFJhc211cyBSb2hkZSA8cm9oZGVAZHVmZi5kaz4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJICBtdWx0aXVkcHNpbms6IGFkZCBmb3JjZS1pcHY0IG9wdGlvbgorCSAgQWRkIGFuIG9wdGlvbiB0byB0aGUgbXVsdGl1ZHBzaW5rIHRoYXQgbWFrZXMgaXQgcG9zc2libGUgdG8gZm9yY2UKKwkgIHRoZSB1c2Ugb2YgYW4gSVB2NCBzb2NrZXQuCisJICBUaGlzIGNhbiBlLmcuIGJlIHVzZWQgdG8gaGFuZGxlIHRoZSBpc3N1ZSBkZXNjcmliZWQgaW4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODI0ODEKKworMjAxMi0xMC0xMCAxMDoxODo1MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJICBtdWx0aXVkcHNpbms6IHJlbW92ZSB1bnVzZWQgZmllbGQKKworMjAxMi0xMC0xMCAxMDoxMDoyNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogdXNlIG5lZ290aWF0ZWQgYWxsb2NhdG9yIG9yIHBvb2wKKwkgIFVzZSB0aGUgYmFzZSBjbGFzcyB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdXMgYmVjYXVzZSBpdCBrbm93cyBob3cKKwkgIHRvIHVzZSB0aGUgbmVnb3RpYXRlZCBhbGxvY2F0b3Igb3IgYnVmZmVycG9vbC4KKworMjAxMi0xMC0xMCAxMDowOTozNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpdWRwc2luazogcG9zdCBlcnJvciB3aGVuIHNvbWV0aGluZyBnb2VzIHdyb25nCisKKzIwMTItMTAtMTAgMTA6MDk6MTAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IGVsZW1lbnRzIHBvc3QgZWxlbWVudCBtZXNzYWdlcworCisyMDEyLTEwLTA3IDE2OjU2OjM4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQgKGJ1ZyBmaXhpbmcpCisKKz09PSByZWxlYXNlIDEuMC4xID09PQorCisyMDEyLTEwLTA3IDE1OjMxOjEyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjAuMQorCisyMDEyLTEwLTA2IDE0OjU3OjEwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNmMwYjUyYyB0byA2YmI2OTUxCisKKzIwMTItMTAtMDUgMTU6MTI6MjcgLTA3MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEByZGlvLmNvbT4KKworCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJICBkZWludGVybGVhdmU6IG91dHB1dCBjaGFubmVscyBzaG91bGQgYmUgbWFya2VkIGFzIE1PTk8sIG5vdCBGUk9OVF9MRUZULCBpZiB3ZSdyZSBub3QgcHJlc2VydmluZyBpbnB1dCBjaGFubmVsIHBvc2l0aW9ucy4KKworMjAxMi0xMC0wNCAxNToxMzoyMCAtMDcwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHJkaW8uY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJICBpbnRlcmxlYXZlOiB1c2UgZ3N0X2F1ZGlvX2NoYW5uZWxfcG9zaXRpb25zX3RvX21hc2sgaW5zdGVhZCBvZiBhIGxvY2FsIGNvcHkgb2YgaGFsZiBvZiBpdC4gSGFuZGxlcyBzb21lIHZhbHVlcyBtb3JlIGNvcnJlY3RseS4KKworMjAxMi0xMC0wNCAyMDozMjo0NSArMDIwMCAgUmFzbXVzIFJvaGRlIDxyb2hkZUBkdWZmLmRrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmM6CisJICBnc3RydHBkZXBheTogZG9uJ3QgbGVhayBpbnB1dCBidWZmZXIKKwkgIFRoZSBydHAgYnVmZmVyIGlzIG5ldmVyIHVubWFwcGVkIGluIHRoZSBub3JtYWwgY29kZSBleGl0IHBhdGgKKwkgIG9mIGdzdF9ydHBfZ3N0X2RlcGF5X3Byb2Nlc3MoLi4pIHJlc3VsdGluZyBpbiBhIG1lbW9yeSBsZWFrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NTUxMgorCisyMDEyLTEwLTA0IDE4OjM3OjE4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgdmlkZW9iYWxhbmNlOiBBZGQgc3VwcG9ydCBmb3IgTlYxMiBhbmQgTlYyMQorCisyMDEyLTEwLTAxIDE1OjExOjA1ICswMjAwICBQYXRyaWNpYSBNdXNjYWx1IDxwYXRyaWNpYUBheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSAgcnRwaDI2NHBheTogZG8gbm90IHB1c2ggdW5tYXBwZWQgZGF0YQorCSAgQWxzbyBkbyBub3QgdXNlIGEgR3N0QnVmZmVyIGFmdGVyIGl0IGhhcyBiZWVuIHB1c2hlZCBpbnRvIHRoZSBhZGFwdGVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NTIxMworCisyMDEyLTEwLTAzIDEwOjUxOjQ1IC0wNzAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAcmRpby5jb20+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy94aW1hZ2UveGltYWdldXRpbC5jOgorCSAgbWV0YSBpbmZvOiB0aHJlYWRzYWZlIHJlZ2lzdHJhdGlvbiB1c2luZyBnX29uY2UKKworMjAxMi0xMC0wMSAxNTo0NDowMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBwdXNoIG1vZGU7IGhhbmRsZSBzb21lIGluaXRpYWwganVuayBiZWZvcmUgaGRybCBsaXN0CisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg1MDU5CisKKzIwMTItMTAtMDEgMTQ6MDM6MTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9pY2xlcy9nZGtwaXhidWZzaW5rLXRlc3QuYzoKKwkgIHRlc3RzOiBwb3J0IGdka3BpeGJ1ZnNpbmsgdGVzdAorCisyMDEyLTA5LTI5IDExOjU5OjMxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOgorCSAgUHVyZ2UgcmVmZXJlbmNlcyB0byBsaWJvaWwKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NzMyODUKKworMjAxMi0wOS0yOCAxNjo1MTowMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvYXZpLWlkcy5oOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHJlY29nbml6ZSBhbGwgeHN1YiBmcmFtZXMgYXMga2V5ZnJhbWVzCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg0OTc3CisKKzIwMTItMDktMjggMTY6NTA6MjUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogcHVzaCBtb2RlOiBmaW5kIHRoZSBjb3JyZWN0IGNodW5rIGZvciBzZWdtZW50IGZvbGxvd2luZyBzZWVrCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg0OTc3CisKKzIwMTItMDktMjcgMjI6MTc6NDkgKzAxMDAgIEFybmF1ZCBWcmFjIDxyYXdvdWxAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IGZpeCBwYXJzaW5nIGluIHB1c2ggbW9kZSB3aGVuIG1vb3YgYXRvbSBpcyBhdCB0aGUgZW5kCisJICBXaGVuIHBsYXlpbmcgYW4gbXA0IGZpbGUgd2l0aCB0aGUgTU9PViBhdG9tIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIHBsYXliYWNrCisJICBmYWlscyB3aXRoIHRoZSBlcnJvciBtZXNzYWdlICJubyAnbW9vdicgYXRvbSB3aXRoaW4gdGhlIGZpcnN0IDEwIE1CIi4gVGhpcyBpcworCSAgZHVlIHRvIGEgbWlzdGFrZSBpbiB0aGUgdXBzdHJlYW1fc2l6ZSB0eXBpbmcsIG1ha2luZyB0aGUgc2VlayB0byB0aGUgZW5kIG9mCisJICBmaWxlIG5ldmVyIGhhcHBlbmluZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODQ5NzIKKworMjAxMi0wOS0yNyAxNTo1MDo0OSAtMDMwMCAgQW5kcmUgTW9yZWlyYSBNYWdhbGhhZXMgKGFuZHJ1bmtvKSA8YW5kcmUubWFnYWxoYWVzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJICBnYW1tYTogcmVtb3ZlIGR1cGxpY2F0ZSBlbnRyaWVzIGF0IGZvcm1hdCBhdCBjYXBzCisJICBBdm9pZHMgZXh0cmEgY2Fwcy9zdHJ1Y3R1cmVzIHByb2Nlc3NpbmcKKworMjAxMi0wOS0yNyAxNDoxMzo0MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkgIHJ0cHZyYXdkZXBheTogbmVnb3RpYXRlIHBvb2wgd2l0aCBzcmNwYWQgY2FwcworCisyMDEyLTA5LTI3IDExOjAyOjUxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkgIGR2ZGVtdXg6IFRoZSBjb252ZXJ0IGFuZCBkdXJhdGlvbiBxdWVyaWVzIGFyZSBub3Qgc3VwcG9zZWQgdG8gY2hhbmdlIHRoZSBmb3JtYXQKKworMjAxMi0wOS0yNiAwOToyODo1OSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXI6IGNsZWFyIHZpZGVvIGZyYW1lIG1vcmUgY29ycmVjdGx5CisJICBNYWtlIHN1cmUgbm90IHRvIHRvdWNoIG1lbW9yeSB0aGF0IGRvZXNuJ3QgYmVsb25nIHRvCisJICBvdXIgZnJhbWUsIHdlIG1pZ2h0IGJlIG9uZSBwYXJ0IG9mIGEgc2lkZS1ieS1zaWRlIDNECisJICBmcmFtZSwgb3IgaW4gYSBwaWN0dXJlLWluLXBpY3R1cmUgc2NlbmFyaW8uCisKKzIwMTItMDktMjYgMDA6NDQ6NTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBtaW5vciBjbGVhbi11cAorCSAgVXNlIEdzdEJ5dGVXcml0ZXIsIGJlY2F1c2Ugd2UgY2FuLCBhbmQgZ192YWx1ZV90YWtlX2JveGVkLgorCisyMDEyLTA5LTEwIDEwOjI3OjI4ICswNDAwICBEbWl0cml5IFNhbW9uZW5rbyA8ZG1pdHJpeS5zYW1vbmVua29AdGVsaWdlbnQucnU+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBmaXggc3BlZXggYXVkaW8gZGVjb2RpbmcgYnkgY3JlYXRpbmcgZmFrZSBzdHJlYW0gaGVhZGVyCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgzNjIyCisKKzIwMTItMDktMjUgMjE6MjE6MTUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvc2ltcGxlLWxhdW5jaC1saW5lcy5jOgorCSAgdmlkZW9taXhlcjogZml4IHdhcm5pbmdzIHdoZW4gdXNpbmcgdHJhbnNwYXJlbnQgYmFja2dyb3VuZAorCSAgZ3N0X3ZpZGVvX2ZyYW1lX21hcCgpIGluY3JlYXNlcyB0aGUgcmVmY291bnQsIHdoaWNoIG1ha2VzCisJICB0aGUgYnVmZmVyIG5vdCB3cml0YWJsZSBhbnkgbW9yZSB0ZWNobmljYWxseSwgc28gY2FsbGluZworCSAgZ3N0X2J1ZmZlcl9tZW1zZXQoKSBvbiBpdCB3aWxsIGNhdXNlIG5hc3R5IHdhcm5pbmdzLgorCSAgVW5pdCB0ZXN0IGRpc2FibGVkIGJlY2F1c2UgaXQgdmVyeSByYXJlbHkgKGZvciBtZSkKKwkgIGZhaWxzLCBwb3NzaWJseSBuZWdvdGlhdGlvbi1yZWxhdGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NDM5OAorCisyMDEyLTA5LTI1IDEwOjQzOjI4ICswMjAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IEFkZCBzb21lIHVzZWZ1bCBkZWJ1ZyBsb2dnaW5nCisKKzIwMTItMDktMjUgMTA6NDE6NDQgKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogRml4IHRlbGVjaW5lCisJICBUaGlzIG9ubHkgYWZmZWN0cyBiZWhhdmlvdXIgaW4gdGVsZWNpbmUgY2FzZXMgd2l0aCBwYXR0ZXJuIGxvY2tpbmcKKwkgIGVuYWJsZWQuIFRoZSBkZWZhdWx0IGNhc2Ugc2hvdWxkIGJlIHVudG91Y2hlZC4KKwkgIFRoaXMgd29ya3Mgd2l0aCB0aGUgb3V0cHV0IGZyb20gZmllbGRhbmFseXNpcyBhdCBsZWFzdCwgYnV0IHRoZSBmaWVsZAorCSAgb3JkZXIgbG9va3Mgc3dhcHBlZCBmb3IgdGVsZWNpbmUgbWl4ZWQgYnVmZmVycyB3aXRoIHRoZQorCSAgRGF2aWRfc2xpZGVzX1NjaGxlZWYgY2xpcC4KKworMjAxMi0wOS0yNSAxNDo0MzoxNSArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJICB2cDhlbmM6IERpc2FibGUgR0xJQiBkZXByZWNhdGlvbiB3YXJuaW5ncworCSAgR1ZhbHVlQXJyYXkgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSAyLjMyIC4uLiBidXQgdGhlcmUncyBubyB1c2FibGUKKwkgIHJlcGxhY2VtZW50IGZvciBpdC4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY3MjI4CisKKzIwMTItMDktMjUgMTQ6MTg6MzUgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogRml4IGxlYWsKKworMjAxMi0wOS0yNCAxNjo0NjoxOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgQmFjayB0byBkZXZlbG9wbWVudCAoYnVnIGZpeGluZykKKworPT09IHJlbGVhc2UgMS4wLjAgPT09CisKKzIwMTItMDktMjQgMTQ6MDY6NDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjAuMAorCisyMDEyLTA5LTI0IDExOjU2OjU2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jOgorCSAgdGVzdHM6IHJlbW92ZSBnX3ByaW50ZXJyKCkgdGhhdCdzIG5vdCBuZWVkZWQgYW55IGxvbmdlcgorCSAgbm93IHRoYXQgdGNhc2Vfc2tpcF9icm9rZW5fdGVzdCgpIHByaW50cyBpdCBhcyB3ZWxsLgorCisyMDEyLTA5LTIzIDE5OjUwOjQyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmM6CisJICB0ZXN0czogZGlzYWJsZSBmYWlsaW5nIHJlcGxheWdhaW4gdGVzdHMKKworMjAxMi0wOS0yMyAxNjozMTozNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuaDoKKwkgIHNtcHRlOiBzZW5kIHN0cmVhbS1zdGFydCBldmVudAorCisyMDEyLTA5LTIzIDE2OjEwOjM2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguaDoKKwkgIG11bHRpcGFydG11eDogc2VuZCBzdHJlYW0tc3RhcnQgZXZlbnQKKworMjAxMi0wOS0yMyAxNjowMjoxOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHNlbmQgc3RyZWFtLXN0YXJ0CisKKzIwMTItMDktMjMgMTU6NTc6MzUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBzZW5kIHN0cmVhbS1zdGFydCBldmVudAorCisyMDEyLTA5LTIzIDE1OjQ4OjU0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmg6CisJICBpbnRlcmxlYXZlOiBhZGQgYSBidW5jaCBvZiBGSVhNRXMKKwkgIE5lZWRzIHNvbWUgbW9yZSB3b3JrLCBzbyBzdHJlYW0tc3RhcnQsIGNhcHMgYW5kIHRhZ3MgYXJlCisJICBzZW50IGluIHRoZSByaWdodCBvcmRlci4KKworMjAxMi0wOS0yMyAxNToxODo1NCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogc2VuZCBzdHJlYW0tc3RhcnQgZXZlbnQKKworMjAxMi0wOS0yMyAxNToxNjoxNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogc2VuZCBzdHJlYW0tc3RhcnQgZXZlbnQKKworMjAxMi0wOS0yMiAxNTowMDoyNyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJICBydHBkdG1mZGVwYXk6IFVzZSAxLjAtc3R5bGUgY2FwcyBuZWdvdGlhdGlvbiBhbmQgYXVkaW8veC1yYXcKKworMjAxMi0wOS0yMiAxNjowODowNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDRmOTYyZjcgdG8gNmMwYjUyYworCisyMDEyLTA5LTIxIDIxOjU0OjM2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYW5zd2VyIFVSSSBxdWVyeQorCSAgV2l0aG91dCB0aGlzLCBzb21ldGhpbmcgYWxzbyBhbnN3ZXJlZCB0aGUgcXVlcnkKKwkgIHdpdGggVFJVRSBidXQgd2l0aG91dCBzZXR0aW5nIGEgdXJpLCBub3Qgc3VyZQorCSAgd2hhdCB0aGF0IHdhcy4uCisKKzIwMTItMDktMjAgMTc6Mjg6NDcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwaDI2NHBheTogTWFrZSBzdXJlIHRoZSBjYXBzIGRvbid0IGhhdmUgZHVwbGljYXRlZCBzcHMvcHBzCisKKzIwMTItMDktMjAgMTk6NTg6MTIgKzAyMDAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBNdXRlIHN0cmVhbSBwb3N0LWNvbm5lY3Rpb24gaWYgcmVxdWlyZWQKKwkgIEEgYnVnIGluIFB1bHNlQXVkaW8gY2F1c2VzIFBBX1NUUkVBTV9TVEFSVF9NVVRFRCB0byBiZSByZWplY3RlZCBvbgorCSAgcmVjb3JkIHN0cmVhbXMuIFVudGlsIHRoaXMgaXMgZml4ZWQgdXBzdHJlYW0sIHdlIG11dGUgdGhlIHN0cmVhbQorCSAgbWFudWFsbHkgYXQgc3RhcnR1cC4gQmFzZWQgb24gYSBwYXRjaCBieSBBbGJhbiBCcm93YWV5cworCSAgPHByYWhhbEB5YWhvby5jb20+LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NDQ2OQorCisyMDEyLTA5LTIwIDE4OjAwOjU5IC0wNzAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAcmRpby5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogMjQgYml0IGF1ZGlvIGhlcmUgaXMgUzI0TEUsIG5vdCBTMjRfM0xFLgorCisyMDEyLTA5LTIwIDEwOjA3OjI0ICswMjAwICBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IGhhbmRsZSBsYXRlbmN5IHF1ZXJ5IGJlZm9yZSBzZXR0aW5nIHVwIHRoZSBidWZmZXJwb29sCisJICBGaXhlcyBjcmFzaCBpZiBubyBidWZmZXJwb29sIGlzIHNldCB1cCB5ZXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg0NDMwCisKKzIwMTItMDktMTkgMDk6MTc6MDMgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJICBvc3hhdWRpb3Npbms6IFNwZWNpZnkgZW5kaWFubmVzcyBpbiBJRUMgNjE5MzcgcGF5bG9hZGluZworCSAgQ29ycmVzcG9uZHMgdG8gYW4gQVBJIGNoYW5nZSBpbiBnc3QtcGx1Z2lucy1iYXNlLiBUaGlzIG5lZWRzIHRvIGJlIGZpeGVkCisJICB0byBxdWVyeSB0aGUgZXhwZWN0ZWQgYnl0ZSBvcmRlciB1c2luZyBhcHByb3ByaWF0ZSBBUEkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc4MDIxCisKKzIwMTItMDktMTkgMDk6MTU6NTMgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBkaXJlY3Rzb3VuZHNpbms6IFNwZWNpZnkgZW5kaWFubmVzcyBpbiBJRUMgNjE5MzcgcGF5bG9hZGluZworCSAgRGlyZWN0U291bmQgZXhwZWN0cyBuYXRpdmUgZW5kaWFuIGJ5dGUgb3JkZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc4MDIxCisKKzIwMTItMDktMTkgMDk6MTM6MTEgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IFNwZWNpZnkgZW5kaWFubmVzcyBpbiBJRUMgNjE5MzcgcGF5bG9hZGluZworCSAgQ29ycmVzcG9uZHMgdG8gYW4gQVBJIGNoYW5nZSBpbiBnc3QtcGx1Z2lucy1iYXNlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3ODAyMQorCisyMDEyLTA5LTE5IDAwOjM5OjAxICswMjAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IFJlbW92ZSBpbmNvcnJlY3QgbG9naWMKKwkgIEkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgdGhlc2UgbGluZXMgd2VyZSBhZGRlZCwgdGhleSBkb24ndCBtYWtlIHNlbnNlIHRvCisJICBtZSBub3cgYW5kIGJvdGggRGF2aWQgYW5kIEkgYWdyZWUgdGhhdCByZW1vdmluZyB0aGVtIG1vdmVzIGNsb3NlciB0bworCSAgcmVsYXRlZCBsb2dpYyBiZWluZyBjb3JyZWN0LCB0aGVyZWZvcmUsIHRoZXkncmUgYmVpbmcgcmVtb3ZlZC4KKwkgIEkndmUgdGVzdGVkIGEgZmV3IHByb2dyZXNzaXZlLCBpbnRlcmxhY2VkIGFuZCB0ZWxlY2luZSBjbGlwcyBhbmQgdGhleQorCSAgYWxsIGJlaGF2ZSBwcm9wZXJseSB0aW1lc3RhbXAtd2lzZSBhbmQgdmlzdWFsbHkgYWZ0ZXIgdGhlc2UgY2hhbmdlcy4KKworMjAxMi0wOS0xOSAwMDoxNzo0OSArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBGaXggZmllbGQgZHVyYXRpb24KKwkgIFRoZSBmcmFtZSByYXRlIGZyYWN0aW9uIGlzIGNvcnJlY3RseSBhZGp1c3RlZCBpbiB0aGUgY2FzZXMgcHJlY2VkaW5nIHRoZQorCSAgZmllbGQgZHVyYXRpb24gY2FsY3VsYXRpb24gYW5kIHNvIHRoZSBmYWN0b3Igb2YgMiBpcyBpbmNvcnJlY3QuCisKKzIwMTItMDktMTggMTA6MzQ6MDMgLTA3MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEByZGlvLmNvbT4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogRml4IFUvViBzdHJpZGVzIGZvciBhIG51bWJlciBvZiBjYXNlcy4KKworMjAxMi0wOS0xOCAxMjoxMzoyMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBpbml0IHZpZGVvaW5mbworCSAgLi4uIHRvIHByZXZlbnQgcmFuZG9tIGJvZ3VzIGNhcHMgZmllbGRzLgorCisyMDEyLTA5LTE4IDEyOjEyOjM5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXI6IGNoYWluIHVwIHRvIGNvbGxlY3RwYWRzIHF1ZXJ5IGZ1bmN0aW9uCisKKzIwMTItMDktMTcgMTM6MTc6MDAgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogRG9uJ3QgbGV0IEdzdENvbGxlY3RQYWQgc2hhZG93IGN1c3RvbSBzaW5rIHBhZCBxdWVyeSBmdW5jCisJICBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlIGN1c3RvbSBwYWQgcXVlcnkgZnVuY3Rpb24gaXMgbm90IGNhbGxlZC4KKwkgIFRoaXMgcGF0Y2gsIHNldCB0aGF0IHF1ZXJ5IGZ1bmN0aW9uIG9uIHRoZSBHc3RDb2xsZWN0UGFkcyB0byBhdm9pZCB0aGlzCisJICBzaGFkb3dpbmcuCisJICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NDIzNworCisyMDEyLTA5LTE3IDE4OjIzOjExICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvZmlsZXMvTWFrZWZpbGUuYW06CisJICB0ZXN0czogZGlzdCBpbWFnZS5qcGcgZm9yIGpwZWcgdGVzdAorCis9PT0gcmVsZWFzZSAwLjExLjk5ID09PQorCisyMDEyLTA5LTE3IDE3OjU3OjU4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAwLjExLjk5CisKKzIwMTItMDktMTcgMTY6NTM6MDQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMudHlwZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkgIGRvY3M6IHVwZGF0ZQorCisyMDEyLTA5LTE3IDEzOjMwOjE1ICswMjAwICBDaHJpc3RpYW4gRnJlZHJpayBLYWxhZ2VyIFNjaGFsbGVyIDx1cmFldXNAbGludXhyaXNpbi5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIEZpeCBzcGVjIGZpbGUgZm9yIHZwOCBtb3ZlCisKKzIwMTItMDktMTcgMTM6MjM6MzYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBNYWtlZmlsZS5hbToKKwkgIGFubm9kZXg6IEFkZCB0byB0aGUgQ1JVRlRfRElSUworCisyMDEyLTA5LTE3IDEyOjE0OjA3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb25vc2NvcGUueG1sOgorCSAgZG9jczogdXBkYXRlCisKKzIwMTItMDktMTcgMDk6NDg6NTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSAgdnA4ZW5jOiBDb3JyZWN0bHkgZmluaXNoIGZyYW1lcworCSAgUHJldmlvdXNseSB3ZSB3b3VsZCBhbHdheXMgZ2V0IHRoZSBzYW1lIGZyYW1lIGlmIG11bHRpcGxlIGZyYW1lcyBhcmUgcGVuZGluZywKKwkgIGxlYWtpbmcgbWVtb3J5IG9mIHRoZSBwcmV2aW91cyBmcmFtZXMgYW5kIGJyZWFraW5nIHRpbWVzdGFtcHMuCisKKzIwMTItMDktMTcgMDk6NDA6NDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSAgdnA4ZW5jOiBBbGxvdyBjaGFuZ2luZyBiaXRyYXRlIGFuZCBvdGhlciBwYXJhbWV0ZXJzIGR1cmluZyBwbGF5YmFjaworCSAgRml4ZXMgYnVnICM2NDgyNzYuCisKKzIwMTItMDktMTcgMDk6MTY6MzkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZweC9nc3R2cDhlbmMuaDoKKwkgIHZwOGVuYzogU3RvcmUgY29uZmlndXJhdGlvbiBpbiB0aGUgdnB4X2NvZGVjX2VuY19jZmdfdCBzdHJ1Y3QgaW5zdGVhZCBvZiBkdXBsaWNhdGluZyBhbGwgdmFyaWFibGVzCisJICBBbHNvIHByb3RlY3QgZW5jb2RlciB3aXRoIGEgbXV0ZXguCisKKzIwMTItMDktMTYgMTY6MDM6MDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSAgdnA4ZW5jOiBVcGRhdGUgZG9jdW1lbnRhdGlvbiB0byByZWZsZWN0IG5ldyBwcm9wZXJ0eSBuYW1lcworCSAgLi4uYW5kIGFsc28gbGluayB0byB0aGUgV2ViTSBlbmNvZGVyIHBhcmFtZXRlcnMgd2Vic2l0ZS4KKworMjAxMi0wOS0xNiAxNTo1Nzo1OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJICB2cDhlbmM6IE1ha2Ugc29tZSBwcm9wZXJ0eSBuYW1lcyBtb3JlIHJlYWRhYmxlCisKKzIwMTItMDktMTYgMTU6NDc6MTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSAgdnA4OiBBZGQgdGVzdHMgdG8gLmdpdGlnbm9yZQorCisyMDEyLTA5LTE2IDE1OjQ2OjMxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdnA4ZW5jLmM6CisJICB2cDhlbmM6IFVwZGF0ZSBwYXRjaCB0byB0aGUgbmV3IHByb3BlcnR5IG5hbWVzCisKKzIwMTItMDktMTYgMTU6NDY6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHZweDogSW50ZWdyYXRlIHRlc3QgaW50byB0aGUgYnVpbGQgc3lzdGVtIHRvbworCisyMDEyLTAyLTA3IDE3OjAwOjI2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92cDhkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDYvNl0gdGVzdHM6IGZpeCBtb3JlIHVuaXQgdGVzdHMKKworMjAxMS0xMS0yNCAyMTo0MjozOSArMDEwMCAgUmVuw6kgU3RhZGxlciA8cmVuZS5zdGFkbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdnA4ZGVjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA1LzZdIHRlc3RzOiB1cGRhdGUgZm9yIGdzdGNoZWNrIEFQSSBjaGFuZ2UKKworMjAxMC0wNy0xMCAxNTo0Njo1MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDQvNl0gdnA4ZGVjOiBBZGQgc2ltcGxlIHVuaXQgdGVzdCBmb3IgdnA4ZGVjCisKKzIwMTAtMDctMTAgMTU6NDY6NDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAzLzZdIHZwOGVuYzogSW1wcm92ZSB1bml0IHRlc3QgYSBiaXQKKworMjAxMC0wNy0xMCAxNTozMjoyOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDIvNl0gdnA4ZW5jOiBBbHNvIGNoZWNrIHRoZSBvdXRwdXQgY2FwcyBpbiB0aGUgdW5pdCB0ZXN0CisKKzIwMTAtMDctMTAgMTU6Mjk6NDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxLzZdIHZwOGVuYzogQWRkIHNpbXBsZSB1bml0IHRlc3QKKworMjAxMi0wOS0xNiAxNTo0MzozOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSAgdnB4OiBJbnRlZ3JhdGUgaW50byB0aGUgYnVpbGQgc3lzdGVtCisKKzIwMTItMDktMTYgMTU6MzM6NTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L0dzdFZQOEVuYy5wcnM6CisJKiBleHQvdnB4L01ha2VmaWxlLmFtOgorCSogZXh0L3ZweC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cHgvZ3N0dnA4ZGVjLmg6CisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZweC9nc3R2cDhlbmMuaDoKKwkqIGV4dC92cHgvZ3N0dnA4dXRpbHMuYzoKKwkqIGV4dC92cHgvZ3N0dnA4dXRpbHMuaDoKKwkqIGV4dC92cHgvcGx1Z2luLmM6CisJICB2cHg6IFJlbmFtZSB2cDggcGx1Z2luIHRvIHZweAorCSAgVGhpcyBpcyB1c2luZyBsaWJ2cHgsIHdoaWNoIGNhbiBzdXBwb3J0IG1vcmUgY29kZWNzIHRoYW4ganVzdCBWUDgKKwkgIGFuZCB3aWxsIGxpa2VseSBzdXBwb3J0IGZ1dHVyZSBjb2RlY3MuCisKKzIwMTItMDktMTYgMTU6MzI6MjQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIHZwODogQXBwbHkgcmVtYWluaW5nIGNoYW5nZXMgdGhhdCBnb3QgbG9zdCB3aGlsZSBtb3ZpbmcgdGhlIHBsdWdpbiB2aWEgZ2l0IGFtIHRoYW5rcyB0byBtZXJnZXMKKworMjAxMi0wOS0xNiAxNToyNTowOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTM0LzEzNF0gdnA4ZGVjOiBVbnJlZiBpbnB1dC9vdXRwdXQgc3RhdGVzIHdoZW4gc3RvcHBpbmcgdGhlIGRlY29kZXIKKworMjAxMi0wOS0xNiAxNToxODoyMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvR3N0VlA4RW5jLnByczoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMzMvMTM0XSB2cDhlbmM6IFVwZGF0ZSByZWFsdGltZSBwcm9maWxlIHRvIHRoZSBuZXcgcHJvcGVydGllcworCisyMDEyLTA5LTE2IDEwOjU2OjA3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMzIvMTM0XSB2cDg6IFJlcXVpcmUgbGF0ZXN0IGxpYnZweCByZWxlYXNlICgxLjEuMCBmcm9tIE1heSAyMDEyKQorCSAgRml4ZXMgYnVnICM2ODQxMTYgYW5kIHNpbXBsaWZpZXMgY29uZmlndXJlIGNoZWNrcy4KKworMjAxMi0wOS0xNSAyMDoyMzoxMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTMxLzEzNF0gdnA4ZW5jOiBVc2UgYSBzdHJpbmcgZmllbGQgZm9yIHRoZSBwcm9maWxlIGluIHRoZSBjYXBzCisJICBKdXN0IGZvciBjb25zaXN0ZW5jeSB3aXRoIGFsbCB0aGUgb3RoZXIgY29kZWNzLgorCisyMDEyLTA5LTE1IDAwOjA0OjA3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMzAvMTM0XSB2cDhlbmM6IENvcnJlY3RseSBzZXQgcHJvZmlsZSBpbiBjYXBzCisKKzIwMTItMDktMTQgMjM6NDE6NDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMjkvMTM0XSB2cDg6IFVwZGF0ZSBjb3B5cmlnaHQgYW5kIGF1dGhvcnMKKworMjAxMi0wOS0wOCAxNTozODo0MCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5oOgorCSAgW01PVkVEIEZST00gQkFEIDEyOC8xMzRdIHZwOGVuYzogUmV3b3JrIGVuY29kZXIgcHJvcGVydGllcyB0byBiZSBtb3JlIGluIGxpbmUgd2l0aCB0aGUgbGlidnB4IHRvb2xzIGFuZCBBUEkKKwkgIEFsc28gYWRkIGFsbCBhdmFpbGFibGUgcHJvcGVydGllcy4KKworMjAxMi0wOS0xNCAxNzowODo0OSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDEyNy8xMzRdIHJlcGxhY2UgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X2RldGFpbHNfc2ltcGxlIHdpdGggZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X21ldGFkYXRhCisKKzIwMTItMDctMTkgMDk6MDU6MjggKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDEyNi8xMzRdIHZwOGRlYzogQ2FsbCBnc3RfdmlkZW9fZGVjb2Rlcl9uZWdvdGlhdGUoKQorCisyMDEyLTA4LTE0IDExOjE3OjI1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMTI1LzEzNF0gdnA4ZGVjOiBBZGQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgZGVjb2RpbmcgdGhyZWFkcworCisyMDEyLTA4LTE0IDExOjA5OjQ2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMjQvMTM0XSB2cDhkZWM6IEFkZCBzdXBwb3J0IGZvciB0aGUgTUZRRSBwb3N0cHJvY2Vzc2luZyBmbGFnCisJICBXaGljaCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgaWYgcG9zdHByb2Nlc3NpbmcgaXMgZW5hYmxlZC4KKworMjAxMi0wOC0wOSAxMzozNzoyMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvTWFrZWZpbGUuYW06CisJICBbTU9WRUQgRlJPTSBCQUQgMTIzLzEzNF0gdnA4OiBVc2UgcGtnLWNvbmZpZyBmaWxlIGZvciBnZXR0aW5nIHRoZSBMSUJTIGFuZCBDRkxBR1MKKworMjAxMi0wOC0wOCAxNzowNjoyMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTIyLzEzNF0gdnA4ZW5jOiBVcGRhdGUgdGhlIHBlci1jb21wb25lbnQgc3RyaWRlcyBmb3IgZXZlcnkgZnJhbWUgdG9vCisJICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIEdzdFZpZGVvQWxpZ25tZW50CisKKzIwMTItMDctMjYgMTk6MzE6MTQgKzAyMDAgIE9sZWtzaWogUmVtcGVsIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTIxLzEzNF0gdnA4ZW5jOiBpbml0aWF0ZSBlbmNvZGVyIHRvIGZpeCBhIGNyYXNoLgorCSAgV2l0aG91dCB0aGlzIHBhdGNoIHZwOGVuYyBzZW5kIGhlYWRlciBiZWZvcmUgYW5kIGFmdGVyIGZpcnN0CisJICBrZXkgZnJhbWUuIE9uIHNlY29uZCBrZXlmcmFtZSB2cDhkZWMgd2lsbCBjcmFzaCB3aXRob3V0IGdldHRpbmcKKwkgIGRlY29kZWQgZnJhbWUuIFdpdGggdGhpcyBwaXBlIGl0IGlzIGVhc3kgdG8gcmVwcm9kdWNlIHRoaXMgaXNzdWU6CisJICBnc3QtbGF1bmNoLTEuMCB2aWRlb3Rlc3RzcmMgISB2cDhlbmMgISB2cDhkZWMgISBmYWtlc2luaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MDY2NworCisyMDEyLTA3LTI4IDAwOjMyOjU4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMjAvMTM0XSB0YWc6IFVwZGF0ZSBmb3IgdGFnbGlzdC90YWcgZXZlbnQgQVBJIGNoYW5nZXMKKworMjAxMi0wNy0yMyAxMDozNTowMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTE5LzEzNF0gZXh0OiBVcGRhdGUgZm9yIHZpZGVvIGJhc2UgY2xhc3NlcyBBUEkgY2hhbmdlcworCisyMDEyLTA3LTIxIDE5OjU5OjIxICswMjAwICBPbGVrc2lqIFJlbXBlbCA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDExOC8xMzRdIHZwOGVuYzogZml4IG1lbW9yeSBsZWFrCisJICB1bnJlZiBmcmFtZS4gaSBob3BlIGl0IGlzIGNvcnJlY3QgcGxhY2UgdG8gZG8gaXQuCisJICBTaWduZWQtb2ZmLWJ5OiBPbGVrc2lqIFJlbXBlbCA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisyMDEyLTA3LTA2IDExOjUwOjUzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDExNy8xMzRdIHVwZGF0ZSBmb3IgcXVlcnkgYXBpIGNoYW5nZXMKKworMjAxMi0wNy0wNiAxMToyNjo1NSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMTYvMTM0XSB1cGRhdGUgZm9yIHF1ZXJ5IGFwaSBjaGFuZ2VzCisKKzIwMTItMDctMDYgMTE6MDM6MDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTE1LzEzNF0gdXBkYXRlIGZvciBhbGxvY2F0aW9uIHF1ZXJ5IGNoYW5nZXMKKworMjAxMi0wNi0wNyAxMjozMzozMSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDExNC8xMzRdIHZwODogZml4IGNvZGVjIHN0YXRlIGxlYWtzCisJICBJIG9ubHkgdGVzdGVkIHRoYXQgdnA4ZW5jICEgdnA4ZGVjIGRvZXMgbm90IGNyYXNoLCBhcyB2YWxncmluZCBkb2VzIG5vdCBncm9rCisJICBhdCBsZWFzdCBvbmUgb2YgdGhlIGluc3RydWN0aW9ucyB1c2VkIGJ5IHZwOGVuYywgcHJldmVudGluZyBtZSBmcm9tIGNoZWNraW5nCisJICBhIGxlYWssIGFuZCB0aGUgbGFjayBvZiBvbmUgYWZ0ZXIgdGhlIHBhdGNoLgorCisyMDEyLTA2LTA2IDEzOjAyOjQwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDExMy8xMzRdIHVwZGF0ZSBmb3IgdGFnIGV2ZW50IGNoYW5nZQorCisyMDEyLTA1LTI4IDE2OjA1OjIxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5oOgorCSAgW01PVkVEIEZST00gQkFEIDExMi8xMzRdIHZwODogUG9ydCB0byAwLjExIGFnYWluCisKKzIwMTItMDUtMTggMTI6NDY6NTUgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDExMS8xMzRdIHZwOGVuYzogZml4IHRhcmdldCBiaXRyYXRlIGNvbmZpZyB3aXRoIGxpYnZweCAxLjEuMAorCSAgbGlidnB4IDEuMS4wIGRpc2FsbG93cyBhIGJpdHJhdGUgb2YgMCwgd2hpY2ggd2FzIHVzZWQgYnkKKwkgIHZwOGVuYyBhcyBhIGRlZmF1bHQgdmFsdWUuCisJICBJbnN0ZWFkLCB3ZSB1c2UgdGhlIGRlZmF1bHQgbGlidnB4IGJpdHJhdGUsIHNjYWxlZCB0byBvdXIKKwkgIHZpZGVvIHNpemUsIGlmIG5vIGJpdHJhdGUgd2FzIHNwZWNpZmllZC4KKwkgIFRoaXMgZml4ZXMgZW5jb2RpbmcgVlA4IHZpZGVvIHdpdGggbGlidnB4IDEuMS4wLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NjI0NQorCisyMDEyLTA1LTE2IDE0OjA0OjI4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMTAvMTM0XSB2cDhlbmM6IFVwZGF0ZSBmb3IgR3N0VmlkZW9Db2RlY0ZyYW1lIEFQSSBjaGFuZ2VzCisKKzIwMTItMDQtMjcgMTg6MjI6NDIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMTA5LzEzNF0gdnA4ZGVjOiBJbXByb3ZlIG91dHB1dF9zdGF0ZSBoYW5kbGluZworCSAgQXZvaWQgZ2V0dGluZyBvdXRwdXRfc3RhdGUgZm9yIGV2ZXJ5IGJ1ZmZlciBhcyB0aGF0IHJlcXVpcmVzCisJICBnZXR0aW5nIHRoZSBvYmplY3Rsb2NrIGFuZCBkb2luZyByZWZlcmVuY2UgY291bnRpbmcuIFN0b3JlIGl0IGxvY2FsbHkKKwkgIHdoZW4gaXQgaXMgY3JlYXRlZCBhbmQgdXNlIGl0LgorCisyMDEyLTA0LTI3IDA5OjA1OjU3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTA4LzEzNF0gdnA4ZGVjOiBVc2Ugb3V0cHV0c3RhdGUgd2hlbiBjb3B5aW5nIG91dHB1dCBidWZmZXIgZGF0YQorCSAgVXNpbmcgdGhlIGlucHV0IHN0YXRlIHdhcyBjYXVzaW5nIGEgY3Jhc2ggYmVjYXVzZSB0aGUgc3RyaWRlcy9vZmZzZXRzCisJICB3b3VsZCBiZSB3cm9uZy4gRml4IGl0IGJ5IHVzaW5nIHRoZSBvdXRwdXQgYXMgd2UgYXJlIGRlYWxpbmcgd2l0aAorCSAgdGhlIGRlY29kZWQgZnJhbWUuCisKKzIwMTItMDQtMjQgMTE6MDg6NDEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDEwNy8xMzRdIHZwODogUG9ydCB0byAtYmFzZSB2aWRlbyBiYXNlIGNsYXNzZXMKKwkgIENvbmZsaWN0czoKKwkgIGV4dC92cDgvTWFrZWZpbGUuYW0KKwkgIGV4dC92cDgvZ3N0dnA4ZGVjLmMKKwkgIGV4dC92cDgvZ3N0dnA4ZW5jLmMKKwkgIEJhY2sgdG8gMC4xMCBzdGF0ZSBmb3Igbm93LCBuZWVkIHRvIGJlIHBvcnRlZCBhZ2Fpbi4KKworMjAxMi0wNS0xOCAxMjo0Njo1NSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTA2LzEzNF0gdnA4ZW5jOiBmaXggdGFyZ2V0IGJpdHJhdGUgY29uZmlnIHdpdGggbGlidnB4IDEuMS4wCisJICBsaWJ2cHggMS4xLjAgZGlzYWxsb3dzIGEgYml0cmF0ZSBvZiAwLCB3aGljaCB3YXMgdXNlZCBieQorCSAgdnA4ZW5jIGFzIGEgZGVmYXVsdCB2YWx1ZS4KKwkgIEluc3RlYWQsIHdlIHVzZSB0aGUgZGVmYXVsdCBsaWJ2cHggYml0cmF0ZSwgc2NhbGVkIHRvIG91cgorCSAgdmlkZW8gc2l6ZSwgaWYgbm8gYml0cmF0ZSB3YXMgc3BlY2lmaWVkLgorCSAgVGhpcyBmaXhlcyBlbmNvZGluZyBWUDggdmlkZW8gd2l0aCBsaWJ2cHggMS4xLjAuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc2MjQ1CisKKzIwMTItMDQtMDUgMTg6MDI6NTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L3BsdWdpbi5jOgorCSAgW01PVkVEIEZST00gQkFEIDEwNS8xMzRdIGdzdDogVXBkYXRlIGZvciBHU1RfUExVR0lOX0RFRklORSgpIEFQSSBjaGFuZ2VzCisKKzIwMTItMDQtMDQgMTQ6NDE6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L01ha2VmaWxlLmFtOgorCSAgW01PVkVEIEZST00gQkFEIDEwNC8xMzRdIGdzdDogVXBkYXRlIHZlcnNpb25pbmcKKworMjAxMi0wMy0wNiAxNToyMToxNyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTAzLzEzNF0gdnA4ZW5jOiBGaXggJ2FyZ3VtZW50IHRvICdzaXplb2YnIGluICdtZW1zZXQnIGNhbGwgaXMgdGhlIHNhbWUgZXhwcmVzc2lvbiBhcyB0aGUgZGVzdGluYXRpb24nIGNvbXBpbGVyIHdhcm5pbmcKKworMjAxMi0wMS0zMCAxNzoxNzoxNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMDIvMTM0XSB1cGRhdGUgZm9yIEhFQURFUiBmbGFnCisKKzIwMTItMDEtMjUgMTg6NDk6NTggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMDEvMTM0XSBwb3J0IHNvbWUgbW9yZSB0byBuZXcgbWVtb3J5IEFQSQorCSAgRml4ZXMgIzY2ODY3Ny4KKworMjAxMi0wMS0yNCAxMToyMjo0NiArMDEwMCAgT2xla3NpaiBSZW1wZWwgKEFsZXhleSBGaXNoZXIpIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTAwLzEzNF0gdnA4ZW5jOiB0cmFjZSBvdXRnb2luZyB0aW1lc3RhbXBzCisJICBhZGQgaW5mbyBsZXZlbCBwcmludHMgZm9yIG91dGdvaW5nIHRpbWVzdGFtcHMuCisJICBTaWduZWQtb2ZmLWJ5OiBPbGVrc2lqIFJlbXBlbCAoQWxleGV5IEZpc2hlcikgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKworMjAxMi0wMS0wNCAxMTowNTo0OCArMDEwMCAgT2xla3NpaiBSZW1wZWwgKEFsZXhleSBGaXNoZXIpIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDk5LzEzNF0gdnA4ZGVjOiB1c2UgaXNfYWx0X2RhdGEgb3B0aW9uIHRvIHByZXZlbnQgdGltZXN0YW1wIGNvbGxpc2lvbnMKKwkgIGFsdHJlZi9pbnZpc2libGUgZnJhbWVzIHVzdWFsbHkgc3RvcmVkIGluIGNvbnRhaW5lciB3aXRoIHNhbWUgdGltZXN0YW1wIGFzCisJICBkZXBlbmRldCBmcmFtZS4gVGhpcyBtYWtlIGJhc2V2aWRlb2RlY29kZXIgdG8gdXBkYXRlIHRpbWVzdGFtcCBmb3IgZGVwZW5kZXQKKwkgIGZyYW1lIGFuZCBjb3VzZSBUUyBjb2xpc2lvbiBvbiBuZXh0IGZyYW1lOgorCSAgXi0gaGVyZSBpcyBhbHRyZWYKKwkgIHRpbWUgICAgIDogMSAyIDMgNCA1IDYgNyA4IDkKKwkgIHdlYm0gdHMgIDogMSAgIDMgNSA1ICAgNyAgIDkKKwkgIHZwOGRlYyB0czogMSAgIDMgICA3ICAgNyAgIDkKKwkgIEZpeCBidWc6IGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTUyNDUKKwkgIFNpZ25lZC1vZmYtYnk6IE9sZWtzaWogUmVtcGVsIChBbGV4ZXkgRmlzaGVyKSA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisyMDEyLTAxLTAyIDA4OjI4OjEzICswMTAwICBPbGVrc2lqIFJlbXBlbCAoQWxleGV5IEZpc2hlcikgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKworCSogZXh0L3ZwOC9Hc3RWUDhFbmMucHJzOgorCSogZXh0L3ZwOC9NYWtlZmlsZS5hbToKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwOTgvMTM0XSB2cDg6IGFkZCBpbml0aWFsIHByZXNldCBmaWxlCisJICBUaGlzIGlzIGluaXRpYWwgcHJlc2V0IGZpbGUsIGN1cnJlbnRseSB3aXRoIG9ubHkgb25lIHByb2ZpbGUKKwkgIGZvciByZWFsdGltZSBlbmNvZGluZy4KKwkgIFNpZ25lZC1vZmYtYnk6IE9sZWtzaWogUmVtcGVsIChBbGV4ZXkgRmlzaGVyKSA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisyMDExLTExLTI4IDEzOjA4OjI3ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDk3LzEzNF0gdmFyaW91czogZml4IHBhZCB0ZW1wbGF0ZSByZWYgbGVha3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjI2NjQKKworMjAxMS0xMS0yNSAxMTozNjoxNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDk2LzEzNF0gdnA4ZGVjOiB1c2UgbmV3IGJhc2V2aWRlb2RlY29kZXIgQVBJIHRvIGRyb3AgZnJhbWVzIGFuZCBnZXQgUW9TIG1lc3NhZ2VzIHBvc3RlZAorCisyMDExLTExLTEwIDE1OjEzOjM0ICswMjAwICBNYXJ0IFJhdWRzZXBwIDxsZWlvQGdlbnRvby5vcmc+CisKKwkqIGV4dC92cDgvTWFrZWZpbGUuYW06CisJICBbTU9WRUQgRlJPTSBCQUQgMDk1LzEzNF0gbWltaWMsIG9wZW5jdiwgdnA4LCBhY21tcDNkZWMsIGxpbnN5czogRG9uJ3QgYnVpbGQgc3RhdGljIHBsdWdpbnMKKwkgIFBhc3MgLS10YWc9ZGlzYWJsZS1zdGF0aWMgdG8gbGlidG9vbCBldmVyeXdoZXJlIHdoZXJlIGl0J3MgYmVlbiBmb3Jnb3R0ZW4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjM3NjgKKworMjAxMS0xMS0wMyAxNDowMTo0MSArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA5NC8xMzRdIHZwODogUG9ydCB0byAwLjExCisKKzIwMTEtMDgtMjEgMjA6MTU6MjUgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA5My8xMzRdIHZwOGVuYzogZml4IGRyb3AtZnJhbWUgcHJvcGVydHkKKwkgIEZpeGVzICM2NTY5MjkuCisKKzIwMTEtMDgtMTkgMTk6MTc6MTUgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZwOC9nc3R2cDhlbmMuaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwOTIvMTM0XSB2cDg6IHByb2JlIGZvciB0aGUgbmV3IHR1bmluZyBBUEkgdG8ga2VlcCBidWlsZGluZyB3aXRoIG9sZGVyIGxpYnZweAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1NjkyOAorCisyMDExLTA4LTE4IDEwOjM5OjI2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwOTEvMTM0XSB2cDhlbmM6IFJlbW92ZSB1bnVzZWQgYW5kIHVzZWxlc3MgdmFyaWFibGUgaW4gdGFncyBoYW5kbGluZworCisyMDExLTA4LTEyIDEyOjA4OjA4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwOTAvMTM0XSB2cDhlbmM6IFVwZGF0ZSBmb3IgYmFzZXZpZGVvZW5jb2RlciA6OmdldF9jYXBzKCkgcmVtb3ZhbAorCisyMDExLTA3LTA5IDE4OjUzOjI0IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMDg5LzEzNF0gdnA4ZW5jOiBBZGQgbW9yZSBwcm9wZXJ0aWVzCisKKzIwMTEtMDYtMTkgMTY6MDY6NDYgKzAyMDAgIEFsZXhleSBGaXNoZXIgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMDg4LzEzNF0gdnA4ZW5jOiBhZGQgbWluL21heHNlY3Rpb24tcGN0IG9wdGlvbgorCSAgVGhpcyBvcHRpb25zIHNob3VsZCBiZSBnb29kIHRvIHJlZGV1Y2UgZGVjb2RlIENQVSBsb2FkLgorCSAgZm9yIGxvd2VuZCBoYXJkd2FyZToKKwkgIG1pbnNlY3Rpb24tcGN0PTE1IG1heHNlY3Rpb24tcGN0PTQwMAorCSAgZm9yIGhpZW5kIGh3OgorCSAgbWluc2VjdGlvbi1wY3Q9NSBtYXhzZWN0aW9uLXBjdD04MDAKKwkgIHNlZSBleGFtcGxlOgorCSAgaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvdG9vbHMvZW5jb2Rlci1wYXJhbWV0ZXJzLyMyLXBhc3NfdmJyX2VuY29kaW5nX2Zvcl9zbW9vdGhfcGxheWJhY2tfb25fbG93LWVuZF9oYXJkd2FyZQorCSAgU2lnbmVkLW9mZi1ieTogQWxleGV5IEZpc2hlciA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCSAgU2lnbmVkLW9mZi1ieTogRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKzIwMTEtMDYtMTkgMTE6MDU6MzYgKzAyMDAgIEFsZXhleSBGaXNoZXIgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMDg3LzEzNF0gdnA4ZW5jOiBhZGQgbGFnLWluLWZyYW1lcyBvcHRpb24uCisJICBUaGlzIG9wdGlvbiBzZXQgbWF4aW11bSBvZiBmcmFtZXMgY29kZWMgc2hvdWxkIHJlbWVtYmVyLAorCSAgdG8gbWFrZSBiZXR0ZXIgcHJlZGlrdGlvbiBmb3IgYWx0LXJlZiBmcmFtZXMuCisJICBTZWUgZXhhbXBsZToKKwkgIGh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL3Rvb2xzL2VuY29kZXItcGFyYW1ldGVycy8jMi1wYXNzX2Jlc3RfcXVhbGl0eV92YnJfZW5jb2RpbmcKKwkgIFNpZ25lZC1vZmYtYnk6IEFsZXhleSBGaXNoZXIgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKwkgIFNpZ25lZC1vZmYtYnk6IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisyMDExLTA2LTE5IDA3OjE2OjU3ICswMjAwICBBbGV4ZXkgRmlzaGVyIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDg2LzEzNF0gdnA4ZW5jOiB1c2UgbXVsdGlwYXNzLmNhY2hlIGZpbGUgbmFtZSBhcyBkZWZhdWx0IGZvciBtdWx0aXBhc3MgbW9kZS4KKwkgIFNpZ25lZC1vZmYtYnk6IEFsZXhleSBGaXNoZXIgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKwkgIFNpZ25lZC1vZmYtYnk6IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisyMDExLTA3LTIxIDA4OjAzOjUxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwODUvMTM0XSB2cDhlbmM6IFVwZGF0ZSBmb3IgR3N0QmFzZVZpZGVvRW5jb2Rlcjo6ZmluaXNoKCkgc2lnbmF0dXJlIGNoYW5nZQorCisyMDExLTA3LTEyIDE4OjA1OjI1IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA4NC8xMzRdIHZwODogRml4IHNldC1idXQtdW51c2VkIHdhcm5pbmdzCisKKzIwMTEtMDctMDkgMTE6MzE6MDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA4My8xMzRdIHZwOGVuYzogVXNlIGRlc3Ryb3kgbm90aWZ5IHRvIGZyZWUgdGhlIGNvZGVyIGhvb2sKKworMjAxMS0wNi0xOCAxNTo1Njo0OSAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDgyLzEzNF0gdnA4ZW5jOiB1cGRhdGUgZm9yIG5ldyBsaWJ2cHggYXBpCisKKzIwMTEtMDYtMjYgMTU6MTU6NTQgKzAyMDAgIEFsZXhleSBGaXNoZXIgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwODEvMTM0XSB2cDhlbmM6IGdlbmVyYXRlIGEgdGltZXN0YW1wIGZvciBhbHQtcmVmIGZyYW1lcy4KKwkgIEl0IHdpbGwgZml4IGhhbmRsaW5nIG9mIGFsdHJlZi9pbnZpc2libGUgZnJhbWVzIHNpbmNlIG1hdHJvc2thLW11eAorCSAgZHJvcCBhbnkgZnJhbSB3aXRoIG5vIHRpbWVzdGFtcC4KKwkgIHNlZSBhbHNvOgorCSAgaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvY29kZS9zcGVjcy9jb250YWluZXIvCisJICBUaGUgZW5jb2RlciB3aWxsIGN1cnJlbnRseSBzZXQgdGhlIEFSJ3MgdGltZXN0YW1wIGFzIGNsb3NlIGFzIHBvc3NpYmxlCisJICB0byB0aGUgcHJldmlvdXMgZnJhbWUgd2hpbGUgYXR0ZW1wdGluZyB0byBwcm92aWRlIGEgdGltZXN0YW1wIHRoYXQgaXMKKwkgIHN0cmljdGx5IGluY3JlYXNpbmcuIEluIGNhc2VzIHdoZXJlIHRoZSB0aW1lIGJhc2UgZ2l2ZW4gdG8gdGhlIGVuY29kZXIKKwkgIGF0IGNvbmZpZ3VyZSB0aW1lIGlzIG5vdCBncmFudWxhciBlbm91Z2ggdG8gYWxsb3cgZm9yIHRoaXMgdGhlIEFSCisJICB3aWxsIHNoYXJlIHRoZSBzYW1lIHRpbWVzdGFtcCBhcyBELCBidXQgc2hvdWxkIGJlCisJICB0cmVhdGVkIGFzIGhhdmluZyBubyBkdXJhdGlvbi4KKwkgIEZpeGVzIGJ1ZyAjNjUyOTUxCisJICBTaWduZWQtb2ZmLWJ5OiBBbGV4ZXkgRmlzaGVyIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKzIwMTEtMDYtMTggMTc6NDc6MzYgKzAyMDAgIEFsZXhleSBGaXNoZXIgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwODAvMTM0XSB2cDhkZWM6IGFkZCBjaGVjayBpZiB3ZSBoYXZlIGxlZ2FsIGFzcGVjdC1yYXRpbyBiZWZvcmUgcmVzZXQgaXQuCisJICB0aGUgY29tbWl0IGY5YjU1MmYwNDk0ZSAodnA4ZGVjOiBzZXQgcGFyIHRvIDEvMSkKKwkgIHdpbGwgZml4IHNpdHVhdGlvbiB3aGVyZSBubyBhc3BlY3QtcmF0aW8gaXMgc2V0LCBidXQgaXQgYnJha2UKKwkgIHN0cmVhbSB3aXRoIGF2YWlsYWJsZSBhc3BlY3QtcmF0aW8uIFRoaXMgcGF0Y2ggZml4IGl0LgorCSAgRml4ZXM6ICM2NTI5MDIuCisJICBTaWduZWQtb2ZmLWJ5OiBBbGV4ZXkgRmlzaGVyIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKzIwMTEtMDYtMDMgMTk6MzY6NTkgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA3OS8xMzRdIHZwOGRlYzogc2V0IHBhciB0byAxLzEKKworMjAxMS0wNS0xOCAxMzoyNzoyMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDc4LzEzNF0gdnA4ZW5jOiBOYW1lIG1heC9taW4gcXVhbnRpemVyIHByb3BlcnRpZXMge21heCxtaW59LXF1YW50aXplcgorCSAgQWxzbyBpbXByb3ZlIHF1YWxpdHkgcHJvcGVydHkgZGVzY3JpcHRpb24uCisKKzIwMTEtMDUtMTggMTM6MjY6MjMgKzAyMDAgIEFsZXhleSBGaXNoZXIgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMDc3LzEzNF0gdnA4ZW5jOiBBZGQgcHJvcGVydGllcyB0byBzZWxlY3QgYSBtYXhpbXVtIGFuZCBtaW5pbXVtIHF1YW50aXplcgorCSAgRml4ZXMgYnVnICM2NDE0MDUuCisKKzIwMTEtMDUtMTggMTM6MTg6NTggKzAyMDAgIEFsZXhleSBGaXNoZXIgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNzYvMTM0XSB2cDhlbmM6IEZpeCBxdWFsaXR5IHRvIChjb25zdGFudCkgcXVhbnRpemVyIG1hcHBpbmcKKwkgIFRoaXMgbm93IGFsbG93cyB0byBzZWxlY3QgYWxsIHBvc3NpYmxlIHF1YW50aXplcnMgYmV0d2VlbgorCSAgMCBhbmQgNjMuCisJICBTZWUgYnVnICM2NDE0MDUuCisKKzIwMTEtMDQtMDEgMjI6MTM6NTUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA3NS8xMzRdIHZwOGRlYzogZGVidWcgY29kZSBzdHlsZSBmaXhlcworCisyMDExLTA0LTAxIDIyOjEzOjAwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNzQvMTM0XSB2cDhkZWM6IHByb3BhZ2F0ZSBkb3duc3RyZWFtIGZsb3cgcmV0dXJuIHRvIHVwc3RyZWFtCisKKzIwMTEtMDMtMzAgMTA6MTg6MjMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA3My8xMzRdIGJhc2V2aWRlb2RlY29kZXI6IHJlYWxseSBhbmQgb25seSBzZXQgc3JjIHBhZCBjYXBzIHdoZW5ldmVyIHJlcXVlc3RlZAorCSAgLi4uIHNpbmNlIHN1YmNsYXNzIGlzIGV4cGVjdGVkIHRvIGJlIHdpc2UgZW5vdWdoIHRvIGtub3cgd2hlbiB0byBkbyBzby4KKworMjAxMS0wMy0yOSAxMDo0MTo1NCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDcyLzEzNF0gYmFzZXZpZGVvZGVjb2RlcjogaW52b2tlIHN1YmNsYXNzIHN0YXJ0IG1ldGhvZCBhdCBzdGF0ZSBjaGFuZ2UgYW5kIHVzZSBzZXRfZm9ybWF0CisJICBXaGlsZSB0aGlzIGNoYW5nZXMgQVBJIHNsaWdodGx5IChlLmcuIGFjdHVhbGx5IHVzZXMgc2V0X2Zvcm1hdCBub3cpLCB3aGljaCBpcyBPSworCSAgZm9yIHVuc3RhYmxlIEFQSSwgaXQgaGFzIGZvbGxvd2luZyBtZXJpdHM6CisJICAqIHN5bW1ldHJpYyB3LnIudC4gc3RvcCBhdCBzdGF0ZSBjaGFuZ2UKKwkgICogaW4gbGluZSB3aXRoIG90aGVyIGJhc2UgY2xhc3MgcHJhY3RpY2UKKwkgICogb3RoZXJ3aXNlIG5vIHN1YmNsYXNzIG1ldGhvZCBhdCBzdGF0ZSBjaGFuZ2UgKGdsb2JhbCBhY3RpdmF0aW9uIHRpbWUpCisJICBNb3Jlb3Zlciwgc3ViY2xhc3Nlc2UgYXJlIGVpdGhlciB1bmFmZmVjdGVkIG9yIHRyaXZpYWxseSBhZGp1c3RlZCBhY2NvcmRpbmdseS4KKworMjAxMS0wMy0yOCAwODo1OToyMCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDcxLzEzNF0gYmFzZXZpZGVvZGVjb2Rlcjogc3Vic3VtZSBza2lwX2ZyYW1lIGludG8gZmluaXNoX2ZyYW1lCisKKzIwMTEtMDMtMjQgMTQ6MTA6MDcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA3MC8xMzRdIGJhc2V2aWRlb2VuY29kZXI6IHByb3ZpZGUgcHJvcGVyIHVwc3RyZWFtIGZsb3cgcmV0dXJuIGhhbmRsaW5nCisKKzIwMTEtMDMtMjQgMTM6NTk6MzUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZwOC9nc3R2cDhlbmMuaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNjkvMTM0XSB2cDhlbmM6IG1pbm9yIG9wdGltaXphdGlvbiBpbiBzZXR0aW5nIHVwIGltYWdlIGJ1ZmZlcgorCisyMDExLTAzLTI0IDEyOjUwOjIzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNjgvMTM0XSB2cDhlbmM6IHJlZmFjdG9yIGZyYW1lIHByb2Nlc3NpbmcKKworMjAxMS0wMy0yNCAxMTo1NTo0MSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDY3LzEzNF0gdnA4ZW5jOiBkbyBpbml0IGF0IHNldF9mb3JtYXQgdGltZQorCisyMDExLTAzLTI0IDEwOjE1OjU1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMDY2LzEzNF0gdnA4ZW5jOiBmaXgga2V5ZnJhbWUgZm9yY2luZworCisyMDExLTAzLTIzIDA5OjQ1OjIwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNjUvMTM0XSBiYXNldmlkZW9jb2RlYzogcmVtb3ZlIHJlZHVuZGFudCBjYXBzIGZpZWxkCisJICAuLi4gYXMgaXQgaXMgYWxyZWFkeSBhdCBoYW5kIGFzIHRoZSBzcmMgcGFkJ3MgbmVnb3RpYXRlZCBjYXBzLgorCisyMDExLTAzLTIzIDA4OjUwOjMxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMDY0LzEzNF0gdnA4ZW5jOiB1c2UgYmFzZWNsYXNzIGV2ZW50IHZpcnR1YWwgaGFuZGxlcgorCisyMDExLTAyLTIwIDE0OjE2OjE4IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuaDoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMDYzLzEzNF0gYmFzZXZpZGVvOiBtZXJnZSB1dGlscyBoZWFkZXIgaW50byBiYXNldmlkZW9jb2RlYworCisyMDExLTAzLTE3IDE2OjM0OjAyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9NYWtlZmlsZS5hbToKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNjIvMTM0XSB2cDg6IGZpeCBMSUJBREQgb3JkZXIgaW4gTWFrZWZpbGUuYW0KKworMjAxMS0wMi0wNCAwOTowODoyNiArMDEwMCAgQWxleGV5IEZpc2hlciA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA2MS8xMzRdIHZwOGVuYzogQWRkIGRlc2NyaXB0aW9uIGZvciBiaXRyYXRlIHVuaXRzLgorCisyMDEwLTExLTMwIDE4OjQzOjI0IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNjAvMTM0XSB2cDhlbmM6IFJlYWRkIHNldHRpbmcgb2YgZ3JhbnVsZXBvcworCSAgUmV2ZXJ0IHBhcnRzIG9mIGxhc3QgcGF0Y2ggdGhhdCByZW1vdmVkIHNldHRpbmcgb2YgZ3JhbnVsZXBvcy4KKwkgIG9nZ211eCBzdGlsbCByZXF1aXJlcyBjb3JyZWN0IGdyYW51bGVwb3MgaW4gaW5jb21pbmcgcGFja2V0LgorCisyMDEwLTExLTI5IDIwOjIxOjMxIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNTkvMTM0XSB2cDhlbmM6IERvbid0IG92ZXJyaWRlIHRpbWVzdGFtcHMgc2V0IGJ5IGJhc2UgY2xhc3MKKwkgIEJlY2F1c2UgdGhlIGJhc2UgY2xhc3MgZG9lcyBpdCBjb3JyZWN0bHkuCisJICBGaXhlczogIzYzNTcyMCwgIzYyNTU1OC4KKworMjAxMC0xMS0yNSAxODo1Mjo0NyArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDU4LzEzNF0gdnA4OiBSZW1vdmUgZGVhZCBhc3NpZ25tZW50cworCisyMDEwLTEwLTA5IDE3OjM2OjA3IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDU3LzEzNF0gYmFzZXZpZGVvOiBNb3ZlIGNvbW1vbiBmaWVsZHMvZnVuY3Rpb25zIHRvIGJhc2Vjb2RlYworCisyMDEwLTA5LTE4IDE3OjI4OjQ4IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNTYvMTM0XSBiYXNldmlkZW86IE1vdmUgZGVhZGxpbmUgdG8gZnJhbWUgc3RydWN0dXJlCisKKzIwMTAtMDgtMTMgMTQ6MzQ6MjEgKzAyMDAgIFBoaWxpcCBKw6RnZW5zdGVkdCA8cGhpbGlwakBvcGVyYS5jb20+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDU1LzEzNF0gdnA4ZGVjOiBTZXQgR3N0QmFzZVZpZGVvRGVjb2Rlcjo6cGFja2V0aXplZCB0byBUUlVFIGFzIHNvb24gYXMgcG9zc2libGUKKwkgIFRoaXMgZml4ZXMgYW4gaW5maW5pdGUgbG9vcCBpZiBhbiBFT1MgZXZlbnQgaXMgcmVjZWl2ZWQgYmVmb3JlCisJICBHc3RCYXNlVmlkZW9EZWNvZGVyOjpzdGFydCgpIGlzIGNhbGxlZCwgZS5nLiBpbW1lZGlhdGVseSB3aGVuIHRoZQorCSAgcGFkcyBhcmUgYWN0aXZhdGVkLgorCSAgRml4ZXMgYnVnICM2MjY4MTUuCisKKzIwMTAtMDctMTAgMTY6NTI6MTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZwOC9nc3R2cDhlbmMuaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNTQvMTM0XSB2cDhlbmM6IEFkZCBzdXBwb3J0IGZvciBlbmFibGluZyBhdXRvbWF0aWMgaW5zZXJ0aW9uIG9mIGFsdC1yZWYgZnJhbWVzIGJ5IHRoZSBlbmNvZGVyCisKKzIwMTAtMDctMTAgMTY6NTE6NTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA1My8xMzRdIHZwOGVuYzogRml4IGhhbmRsaW5nIG9mIGludmlzaWJsZS9hbHQgcmVmIGZyYW1lcworCisyMDEwLTA3LTAzIDE3OjQ3OjI5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmg6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZwOC9nc3R2cDhlbmMuaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNTIvMTM0XSB2cDg6IEFkZCBpbml0aWFsIGRvY3VtZW50YXRpb24sIGJhc2VkIG9uIHRoZSB0aGVvcmFkZWMvdGhlb3JhZW5jIGRvY3VtZW50YXRpb24KKworMjAxMC0wNy0wMyAxNzozNDo1OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvTWFrZWZpbGUuYW06CisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZwOC9nc3R2cDhkZWMuaDoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5oOgorCSogZXh0L3ZwOC9wbHVnaW4uYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNTEvMTM0XSB2cDg6IE1vdmUgc3RydWN0dXJlIGRlZmluaXRpb25zLCBldGMgdG8gcHVibGljIGhlYWRlciBmaWxlcyBmb3IgZ3RrLWRvYworCisyMDEwLTA2LTEyIDA5OjAyOjI5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNTAvMTM0XSB2cDhlbmM6IEltcGxlbWVudCBtdWx0aXBhc3MgZW5jb2RpbmcKKwkgIEZpeGVzIGJ1ZyAjNjIxMzQ4LgorCisyMDEwLTA2LTE0IDE1OjU2OjI0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNDkvMTM0XSB2cDhlbmM6IFNldCBWUDhFX1NFVF9DUFVVU0VEIHRvIDAKKwkgIFRoaXMgc2V0dGluZyBjb250cm9scyBob3cgbXVjaCBDUFUgY2FuIGJlIHVzZWQgYnkgdGhlIGVuY29kZXIsIHNwZWNpZmllZAorCSAgaW4gZnJhY3Rpb25zIG9mIDE2LiBOZWdhdGl2ZSB2YWx1ZXMgbWVhbiBzdHJpY3QgZW5mb3JjZW1lbnQgb2YgdGhpcworCSAgd2hpbGUgcG9zaXRpdmUgdmFsdWVzIGFyZSBhZGFwdGl2ZS4KKwkgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIC00LCB3aGljaCBtZWFucyB0aGF0IHdlJ3JlIG5vdCBydW5uaW5nIGFzIGZhc3QKKwkgIGFzIHBvc3NpYmxlIGFuZCBwcm9iYWJseSBhcmUgd2FzdGluZyBzb21lIHF1YWxpdHkuIDAgaXMgdGhlIHJlY29tbWVuZGVkCisJICBkZWZhdWx0IGJ5IGxpYnZweCB1cHN0cmVhbS4KKworMjAxMC0wNi0xNCAxNTo1MTozMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDQ4LzEzNF0gdnA4ZW5jOiBVc2UgVlBYIGRlZmluZXMgZm9yIFJFQUxUSU1FLCBHT09EL0JFU1QgcXVhbGl0eSBkZWFkbGluZXMgaW5zdGVhZCBvZiBvdXIgb3duCisJICBUaGVzZSBhcmUgdGhlIHZhbHVlcyB1c2VkIGZvciB0aGUgc3BlZWQgcHJvcGVydHkuCisKKzIwMTAtMDYtMDMgMTA6NDk6NDAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA0Ny8xMzRdIHZwOGVuYzogZml4IHByaW50ZiBmb3JtYXQgd2FybmluZyBpbiBsb2cgbWVzc2FnZQorCSAgZ3N0dnA4ZW5jLmM6NTY0OiBlcnJvcjogZm9ybWF0IOKAmCVk4oCZIGV4cGVjdHMgdHlwZSDigJhpbnTigJksIGJ1dCBhcmd1bWVudCA4IGhhcyB0eXBlIOKAmHNpemVfdOKAmQorCSAgZ3N0dnA4ZW5jLmM6NzQ0OiBlcnJvcjogZm9ybWF0IOKAmCVk4oCZIGV4cGVjdHMgdHlwZSDigJhpbnTigJksIGJ1dCBhcmd1bWVudCA4IGhhcyB0eXBlIOKAmHNpemVfdOKAmQorCisyMDA5LTA3LTAzIDE2OjA4OjM4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9NYWtlZmlsZS5hbToKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNDYvMTM0XSBiYXNldmlkZW8sIHZwODogZ3VhcmQgdW5zdGFibGUgQVBJIHdpdGggR1NUX1VTRV9VTlNUQUJMRV9BUEkKKwkgIEFkZCBzb21lIGd1YXJkcyBhbmQgZmF0IHdhcm5pbmdzIHRvIHRoZSBoZWFkZXIgZmlsZXMgd2l0aCBzdGlsbCB1bnN0YWJsZQorCSAgQVBJLCBzbyBwZW9wbGUgd2hvIGp1c3QgbG9vayBhdCB0aGUgaW5zdGFsbGVkIGhlYWRlcnMga25vdyB0aGF0IGl0CisJICBhY3R1YWxseSBpcyB1bnN0YWJsZSBBUEkuCisJICBNZXJnaW5nIHByZXZpb3VzIGNvbW1pdCBpbnRvIGN1cnJlbnQgY29kZWJhc2UuCisKKzIwMTAtMDYtMDEgMTU6NTQ6NTEgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvdnA4L01ha2VmaWxlLmFtOgorCSogZXh0L3ZwOC9nc3QvdmlkZW8vZ3N0YmFzZXZpZGVvY29kZWMuYzoKKwkqIGV4dC92cDgvZ3N0L3ZpZGVvL2dzdGJhc2V2aWRlb2NvZGVjLmg6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW9kZWNvZGVyLmM6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW9kZWNvZGVyLmg6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW9lbmNvZGVyLmM6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW9lbmNvZGVyLmg6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW9wYXJzZS5jOgorCSogZXh0L3ZwOC9nc3QvdmlkZW8vZ3N0YmFzZXZpZGVvcGFyc2UuaDoKKwkqIGV4dC92cDgvZ3N0L3ZpZGVvL2dzdGJhc2V2aWRlb3V0aWxzLmM6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW91dGlscy5oOgorCSogZXh0L3ZwOC9nc3QvdmlkZW8vZ3N0dmlkZW9jb21wYXQuYzoKKwkqIGV4dC92cDgvZ3N0L3ZpZGVvL2dzdHZpZGVvY29tcGF0Lmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMDQ1LzEzNF0gYmFzZXZpZGVvOiBNb3ZlIGJhc2UgdmlkZW8gZnJvbSB2cDggdG8gZ3N0LWxpYnMKKworMjAxMC0wNS0yNiAwNjo1MjoxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZwOC9nc3R2cDh1dGlscy5oOgorCSAgW01PVkVEIEZST00gQkFEIDA0NC8xMzRdIHZwODogVXNlIFZQWF9QTEFORV8qIGluc3RlYWQgb2YgUExBTkVfKgorCisyMDEwLTA1LTI0IDExOjA0OjAyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDh1dGlscy5oOgorCSAgW01PVkVEIEZST00gQkFEIDA0My8xMzRdIHZwODogQWRkIGNvbXBhdGlsaWJpdHkgZGVmaW5lcyB0byB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgbGlidnB4IHRvbworCisyMDEwLTA1LTIzIDA5OjI4OjEzICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcGpAb3BlcmEuY29tPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA0Mi8xMzRdIHZwOGRlYzogcy9JTUdfRk1UX0k0MjAvVlBYX0lNR19GTVRfSTQyMC8KKwkgIFRoaXMgY29ycmVzcG9uZHMgdG8gdXBzdHJlYW0gbGlidnB4IGNvbW1pdCA2Y2Q0YTEwZTE2NzIwM2QxZGViNzlhYmY2MGVlNzI1OTllOTc4OTFiCisKKzIwMTAtMDUtMjIgMTI6NTU6NDUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA0MS8xMzRdIHZwOGVuYzogQWxsb3cgYSBtYXhpbXVtIGtleWZyYW1lIGRpc3RhbmNlIG9mIDAsIGkuZS4gYWxsIGZyYW1lcyBhcmUga2V5ZnJhbWVzCisKKzIwMTAtMDUtMjIgMDg6NDU6MzUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA0MC8xMzRdIHZwOGRlYzogU2V0IGRlY29kZXIgZGVhZGxpbmUgZnJvbSB0aGUgUW9TIGluZm9ybWF0aW9uCisKKzIwMTAtMDUtMjggMTY6MzU6MTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAzOS8xMzRdIHZwOGVuYzogTW92ZSBkZWJ1ZyBvdXRwdXQgb25lIGxpbmUgYWJvdmUgd2hlcmUgdGhlIHBhY2tldCBpcyBzdGlsbCB2YWxpZAorCisyMDEwLTA1LTI4IDE1OjUzOjMwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMzgvMTM0XSB2cDhlbmM6IENvcnJlY3RseSBpZ25vcmUgbm9uLWZyYW1lIHBhY2tldHMgZnJvbSB0aGUgZW5jb2RlcgorCSAgRml4ZXMgYnVnICM2MTk5MTYuCisKKzIwMTAtMDUtMjIgMDc6NDQ6MjcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW9kZWNvZGVyLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDM3LzEzNF0gYmFzZXZpZGVvZGVjb2RlcjogVGFrZSB0aGUgZnJhbWUgZHVyYXRpb24gaW50byBhY2NvdW50IHdoZW4gY2FsY3VsYXRpbmcgdGhlIGVhcmxpZXN0IHRpbWUKKwkgIFRoaXMgZm9ybXVsYSBpcyB1c2VkIGluIG1hbnkgb3RoZXIgZWxlbWVudHMgdG9vLgorCSAgRml4ZXMgYnVnICM2MTkzMTguCisKKzIwMTAtMDUtMjIgMDc6MzU6MDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW9kZWNvZGVyLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDM2LzEzNF0gYmFzZXZpZGVvZGVjb2RlcjogUmVzZXQgUW9TIHZhbHVlcyB3aGVuIG5lY2Vzc2FyeQorCisyMDEwLTA1LTIyIDA5OjM1OjI0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMzUvMTM0XSB2cDhlbmM6IFVzZSBHU1RfVklERU9fQ0FQU19ZVVYoSTQyMCkgaW5zdGVhZCBvZiBoYW5kd3JpdHRlbiBJNDIwIGNhcHMgZm9yIHRoZSBwYWQgdGVtcGxhdGUKKwkgIEZpeGVzIGJ1ZyAjNjE5MzQ0LgorCisyMDEwLTA1LTIxIDIwOjUzOjM2ICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcGpAb3BlcmEuY29tPgorCisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW9kZWNvZGVyLmM6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW9kZWNvZGVyLmg6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW91dGlscy5oOgorCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMzQvMTM0XSB2cDhkZWM6IGRyb3AgbGF0ZSBmcmFtZXMgYWZ0ZXIgZGVjb2RpbmcgdGhlbQorCSAgVGhpcyBzYXZlcyBhIG1lbWNweSwgd2hpY2ggaXMgYWx3YXlzIHNvbWV0aGluZy4KKworMjAxMC0wNS0yMSAyMToyODoyOSArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMzMvMTM0XSB2cDhlbmM6IHRocmVhZHMgcHJvcGVydHkKKwkgIEluY3JlYXNpbmcgZnJvbSAxIHRvIDIgdGhyZWFkcyBvbiBhbiBUaGlua3BhZCBYNjBzIGRlY3JlYXNlZCBlbmNvZGUgdGltZQorCSAgaW4gYSB0ZXN0IGZyb20gfjI0IHMgdG8gfjE5IHMsIHNvIHRoaXMgaXMgcXVpdGUgdXNlZnVsLgorCSAgSWRlYWxseSB3ZSBzaG91bGQgbGV0IDAgYmUgdGhlIGRlZmF1bHQgYW5kIGF1dG9tYXRpY2FsbHkgbWF0Y2ggdGhlIG51bWJlcgorCSAgb2YgQ1BVIGNvcmVzIChvciBzb21ldGhpbmcpLgorCisyMDEwLTA1LTIxIDE1OjE3OjQ2ICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcGpAb3BlcmEuY29tPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAzMi8xMzRdIHZwOGVuYzogYWRkIG1vZGUgcHJvcGVydHkgdG8gc3dpdGNoIGJldHdlZW4gQ0JSL1ZCUgorCSAgQWx3YXlzIHVzaW5nIENCUiB3aGVuIGJpdHJhdGUgaXMgdXNlZCBpc24ndCB0aGF0IGdyZWF0LCBWQlIgbW9kZQorCSAgY2FuIHByb2R1Y2UgbWVhbmluZ2Z1bCByZXN1bHRzIHRvby4KKworMjAxMC0wNS0yMSAxMDo1NDo1NyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDMxLzEzNF0gdnA4ZGVjOiBPbmx5IGVuYWJsZSBwb3N0cHJvY2Vzc2luZyBpZiB0aGUgZGVjb2RlciBzdXBwb3J0cyBpdAorCisyMDEwLTA1LTIxIDA4OjIzOjU4ICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcGpAb3BlcmEuY29tPgorCisJKiBleHQvdnA4L3BsdWdpbi5jOgorCSAgW01PVkVEIEZST00gQkFEIDAzMC8xMzRdIHZwODogdHlwbzogcy9IQVZFX1ZQOF9ERUNPREVSL0hBVkVfVlA4X0VOQ09ERVIvCisJICBGaXh1cCBmb3IgYnVnICM2MTkxNzIuCisKKzIwMTAtMDUtMjEgMDg6MTM6MDYgKzAyMDAgIFBoaWxpcCBKw6RnZW5zdGVkdCA8cGhpbGlwakBvcGVyYS5jb20+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAyOS8xMzRdIHZwODogbW92ZSAjaWZkZWYgSEFWRV9WUDhfRU5DT0RFUi9ERUNPREVSCisJICBPdGhlcndpc2Ugd2UnbGwgdHJ5IGluY2x1ZGluZyBlLmcuIDx2cHgvdnA4Y3guaD4gd2hpY2ggZG9lc24ndCBleGlzdC4KKworMjAxMC0wNS0yMCAyMDowNjowOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDI4LzEzNF0gdnA4ZW5jOiBXcml0ZSBHU3RyZWFtZXIgZWxlbWVudCBhbmQgdmVyc2lvbiBpbiB0aGUgdm9yYmlzY29tbWVudCB2ZW5kb3Igc3RyaW5nCisKKzIwMTAtMDUtMjAgMTY6NDk6MDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkqIGV4dC92cDgvcGx1Z2luLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDI3LzEzNF0gdnA4OiBPbmx5IGVuYWJsZSB0aGUgZW5jb2RlciBvciBkZWNvZGVyIGlmIGl0J3MgYXZhaWxhYmxlIGluIGxpYnZweAorCSAgRml4ZXMgYnVnICM2MTkxNzIuCisKKzIwMTAtMDUtMjAgMTA6MTk6NTQgKzAyMDAgIFBoaWxpcCBKw6RnZW5zdGVkdCA8cGhpbGlwakBvcGVyYS5jb20+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZwOC9wbHVnaW4uYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMjYvMTM0XSB2cDg6IGV4bGN1ZGUgZGVjL2VuYyBiYXNlZCBvbiBDT05GSUdfVlA4X0RFQ09ERVIvRU5DT0RFUgorCSAgVGhpcyBtYXkgbm90IGJlIHZlcnkgYXV0b3Rvb2xpc2gsIGJ1dCB3b3JrcyB3aXRoIGxpYnZweCBpbiB0aGUgc3RhdGUKKwkgIHRoYXQgbGlidnB4IGlzIGFjdHVhbGx5IGluLiBNb3ZlZCB0aGUgZGVidWcgaW5pdCB0byB0aGUgZWxlbWVudHMKKwkgIHRoZW1zZWx2ZXMgdG8gbWluaW1pemUgYW1vdW50IG9mICNpZmRlZnMKKworMjAxMC0wNS0yMCAwOToyNDo1MyArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMjUvMTM0XSB2cDhlbmM6IExpbWl0IG1heC1sYXRlbmN5IHRvIDI1IHRvIG1hdGNoIGxpYnZweAorCSAgRnJvbSBsaWJ2cHgvdnA4L2VuY29kZXIvb255eF9pbnQuaDoKKwkgICNkZWZpbmUgTUFYX0xBR19CVUZGRVJTIChDT05GSUdfUkVBTFRJTUVfT05MWT8gMSA6IDI1KQorCSAgV2hpbGUgd2UgZG9uJ3QgbmVlZCB0byBiZSB0aWVkIHRvIHdoYXQgbGlidnB4IGRvZXMgaW50ZXJuYWxseSwgaXQKKwkgIGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBwcmV0ZW5kIHRvIHN1cHBvcnQgbG9uZ2VyIGZyYW1lIGxhZ3MgdGhhbiBhcmUKKwkgIGFjdHVhbGx5IHBvc3NpYmxlLgorCisyMDEwLTA1LTIwIDA5OjU2OjI1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnA4L2dzdHZwOHV0aWxzLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDI0LzEzNF0gdnA4OiBVbmRlZiBIQVZFX0NPTkZJR19IIGJlZm9yZSBpbmNsdWRpbmcgbGlidnB4IGhlYWRlcnMKKwkgIEEgcHVibGljIGxpYnZweCBoZWFkZXIgaW5jbHVkZXMgcHJpdmF0ZSBoZWFkZXJzIGlmIHRoaXMgaXMKKwkgIGRlZmluZWQsIGNhdXNpbmcgY29tcGlsYXRpb24gZmFpbHVyZXMgYmVjYXVzZSB0aGUgcHJpdmF0ZSBoZWFkZXJzCisJICBhcmUgbm90IGluc3RhbGxlZCBvZiBjb3Vyc2UuCisKKzIwMTAtMDUtMjAgMDg6NTM6MTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAyMy8xMzRdIHZwOGVuYzogU29tZSBtb3JlIG1pbm9yIGFkanVzdG1lbnRzIGZvciB0aGUgT2dnIG1hcHBpbmcKKworMjAxMC0wNS0xOSAyMzowMjoxOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDIyLzEzNF0gdnA4ZGVjOiBGaXggbWVtb3J5IGxlYWsKKworMjAxMC0wNS0xOSAyMTozNDo0MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDIxLzEzNF0gdnA4ZW5jOiBBZGp1c3QgT2dnIG1hcHBpbmcgZm9yIHRoZSBjaGFuZ2VzCisKKzIwMTAtMDUtMTkgMTg6MTI6MTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAyMC8xMzRdIHZwOGRlYzogQWRkIHByb3BlcnRpZXMgdG8gY29udHJvbCB0aGUgVlA4IGRlY29kZXIgcG9zdCBwcm9jZXNzaW5nIGZlYXR1cmUKKwkgIFRoaXMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBmb3Igbm93LgorCisyMDEwLTA1LTE5IDE3OjE2OjU0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMTkvMTM0XSB2cDhlbmM6IFJlbmFtZSBrZXlmcmFtZS1pbnRlcnZhbCB0byBtYXgta2V5ZnJhbWUtZGlzdGFuY2UKKwkgIEFuZCB1c2UgZGVmYXVsdCBzZXR0aW5ncyBmb3IgYnVmZmVyIHNpemVzIHVudGlsIHdlIGV4cG9zZSB0aGlzCisJICBzb21laG93LgorCisyMDEwLTA1LTE5IDE3OjEzOjE3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9NYWtlZmlsZS5hbToKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZwOC9nc3R2cDh1dGlscy5jOgorCSogZXh0L3ZwOC9nc3R2cDh1dGlscy5oOgorCSAgW01PVkVEIEZST00gQkFEIDAxOC8xMzRdIHZwODogSW1wcm92ZSBlcnJvciBoYW5kbGluZyBhbmQgZGVidWcgb3V0cHV0CisKKzIwMTAtMDUtMTkgMTQ6NDY6NDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMTcvMTM0XSB2cDg6IFVzZSBjb3JyZWN0IHN0cmlkZXMgYW5kIHBsYW5lIG9mZnNldHMgZm9yIEdTdHJlYW1lcgorCisyMDEwLTA1LTE4IDE0OjQ3OjU0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMTYvMTM0XSB2cDhlbmM6IEltcGxlbWVudCBHc3RUYWdTZXR0ZXIgaW50ZXJmYWNlCisKKzIwMTAtMDUtMTggMTQ6MzM6NDkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAxNS8xMzRdIHZwOGVuYzogRml4IHNldHRpbmcgb2YgdGhlIGtleWZyYW1lIGZsYWcgb24gZW5jb2RlZCBmcmFtZXMKKworMjAxMC0wNS0xOCAxNDozMDoxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDE0LzEzNF0gdnA4ZW5jOiBQb3N0IGFuIGVycm9yIG1lc3NhZ2Ugb24gdGhlIGJ1cyBpZiBlbmNvZGVyIGluaXRpYWxpemF0aW9uIGZhaWxzCisKKzIwMTAtMDUtMTggMTQ6Mjg6NTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAxMy8xMzRdIHZwOGRlYzogRml4IG1lbW9yeSBsZWFrcyBhbmQgZmFpbCBpZiBpbml0aWFsaXppbmcgdGhlIGRlY29kZXIgZmFpbHMKKworMjAxMC0wNS0xOCAwMjo0NDo1NCAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDEyLzEzNF0gdnA4ZW5jOiBTZXQgdGltZWJhc2UKKwkgIEFsc28gbWlzYyBjbGVhbnVwLgorCisyMDEwLTA1LTE2IDEwOjM2OjEyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMTEvMTM0XSB2cDhkZWM6IEZpeCBkZWNvZGluZyBvZiBpbnZpc2libGUgZnJhbWVzCisKKzIwMTAtMDUtMTQgMTQ6MjY6MzQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAxMC8xMzRdIHZwOGVuYzogVXBkYXRlIHRoZSBsYXRlbmN5IHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBlbmNvZGVyCisKKzIwMTAtMDUtMTQgMTQ6MDI6NTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAwOS8xMzRdIHZwOGRlYzogQ29ycmVjdGx5IGluaXRpYWxpemUgc3RyZWFtIGluZm8gYmVmb3JlIHBlZWtpbmcgYXQgdGhlIHN0cmVhbQorCSAgT3RoZXJ3aXNlIHBlZWtpbmcgd2lsbCBmYWlsIGFuZCB3ZSdsbCBnZXQgaW52YWxpZCB2YWx1ZXMKKworMjAxMC0wNS0xNCAxMTowMToyOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDA4LzEzNF0gdnA4ZGVjOiBNYWtlIHN1cmUgdG8gcGFzcyBhIGtleWZyYW1lIGFzIGZpcnN0IGZyYW1lIHRvIHRoZSBkZWNvZGVyLCBjb3B5IG91dHB1dCBmcmFtZXMgb25seSBvbmNlIGFuZCByZXF1aXJlIHdpZHRoL2hlaWdodC9ldGMgb24gdGhlIGlucHV0IGNhcHMKKworMjAxMC0wNS0xNCAxMDozMDoxOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDA3LzEzNF0gdnA4ZW5jOiBBZGQgc3VwcG9ydCBmb3IgaW52aXNpYmxlIGZyYW1lcyBhbmQgdGhlIE9nZyBtYXBwaW5nCisKKzIwMTAtMDUtMTQgMDE6MTQ6NDYgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAwNi8xMzRdIHZwOGRlYzogRml4IHJlc2V0IGFmdGVyIHNlZWtpbmcKKwkgIEFsc28gcmVtb3ZlIHNvbWUgdW51c2VkIGNvZGUuCisKKzIwMTAtMDUtMTMgMjE6MTk6MzIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAwNS8xMzRdIHZwOGVuYzogU2V0IGZyYW1lIG51bWJlcnMgYXMgYnVmZmVyIG9mZnNldHMKKworMjAxMC0wNS0xMyAyMToxODowOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDA0LzEzNF0gdnA4ZW5jOiBBbHdheXMgZ2V0IGFzIG1hbnkgZnJhbWVzIGFzIHBvc3NpYmxlIGZyb20gdGhlIGVuY29kZXIKKworMjAxMC0wNS0xMyAyMTowODowMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDAzLzEzNF0gdnA4ZW5jOiBGaWxsIHRoZSBvbGRlc3QgcGVuZGluZyBmcmFtZSBpbnN0ZWFkIG9mIHRoZSBuZXdlc3QKKworMjAxMC0wNS0xMyAyMDoyMDozMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDAyLzEzNF0gdnA4ZW5jOiBDb3JyZWN0bHkgc2V0IGRlbHRhIHVuaXQgZmxhZyBmb3Igbm9uLWtleWZyYW1lcworCisyMDEwLTA1LTEzIDAxOjA0OjA0IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L3ZwOC9NYWtlZmlsZS5hbToKKwkqIGV4dC92cDgvZ3N0L3ZpZGVvL2dzdGJhc2V2aWRlb2NvZGVjLmM6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW9jb2RlYy5oOgorCSogZXh0L3ZwOC9nc3QvdmlkZW8vZ3N0YmFzZXZpZGVvZGVjb2Rlci5jOgorCSogZXh0L3ZwOC9nc3QvdmlkZW8vZ3N0YmFzZXZpZGVvZGVjb2Rlci5oOgorCSogZXh0L3ZwOC9nc3QvdmlkZW8vZ3N0YmFzZXZpZGVvZW5jb2Rlci5jOgorCSogZXh0L3ZwOC9nc3QvdmlkZW8vZ3N0YmFzZXZpZGVvZW5jb2Rlci5oOgorCSogZXh0L3ZwOC9nc3QvdmlkZW8vZ3N0YmFzZXZpZGVvcGFyc2UuYzoKKwkqIGV4dC92cDgvZ3N0L3ZpZGVvL2dzdGJhc2V2aWRlb3BhcnNlLmg6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW91dGlscy5jOgorCSogZXh0L3ZwOC9nc3QvdmlkZW8vZ3N0YmFzZXZpZGVvdXRpbHMuaDoKKwkqIGV4dC92cDgvZ3N0L3ZpZGVvL2dzdHZpZGVvY29tcGF0LmM6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3R2aWRlb2NvbXBhdC5oOgorCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnA4L3BsdWdpbi5jOgorCSAgW01PVkVEIEZST00gQkFEIDAwMS8xMzRdIHZwODogQWRkIGVuY29kZXIvZGVjb2RlcgorCisyMDEyLTA5LTE1IDIyOjE2OjUyICswMjAwICBDaHJpc3RpYW4gRnJlZHJpayBLYWxhZ2VyIFNjaGFsbGVyIDx1cmFldXNAbGludXhyaXNpbi5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIFVwZGF0ZSBzcGVjIGZpbGUgd2l0aCBGMTggbmFtZSBjaGFuZ2UgYW5kIGFkZCBkZWludGVybGFjZXIKKworMjAxMi0wOS0xNSAxOTowNjowNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NyYy5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc3JjLmM6CisJICB1c2UgZ3N0X2VsZW1lbnRfZmFjdG9yeV9nZXRfbWV0YWRhdGEgdG8gcmVwbGFjZSBvYnNvbGV0ZSBBUEkKKworMjAxMi0wOS0xNCAxNzo1NToxNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkgIHJlcGxhY2UgX2dldF9jYXBzX3JlZmZlZCB3aXRoIF9nZXRfY2FwcworCisyMDEyLTA5LTE0IDE3OjA4OjQ5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJICByZXBsYWNlIGdzdF9lbGVtZW50X2NsYXNzX3NldF9kZXRhaWxzX3NpbXBsZSB3aXRoIGdzdF9lbGVtZW50X2NsYXNzX3NldF9tZXRhZGF0YQorCisyMDEyLTA5LTE0IDE3OjA3OjI2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgcmVwbGFjZSBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUgd2l0aCBnc3RfZWxlbWVudF9jbGFzc19zZXRfbWV0YWRhdGEKKworMjAxMi0wOS0xNCAxMzozMDozNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzoKKwkqIGdzdC9ydHAvUkVBRE1FOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1WVFMtSDI2M3AtQVRTLVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLVZUUy1IMjYzcC5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItZGVjb2RlYmluLUgyNjNwLUFNUi5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItdjRsMi1IMjYzcC1hbHNhc3JjLUFNUi5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItdjRsMi1IMjY0LWFsc2FzcmMtUENNQS5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3NoYXBld2lwZS9zaGFwZXdpcGUtZXhhbXBsZS5jOgorCSogdGVzdHMvZXhhbXBsZXMvdjRsMi9jYW1jdHJsLmM6CisJKiB0ZXN0cy9pY2xlcy9nZGtwaXhidWZzaW5rLXRlc3QuYzoKKwkgIGZpeCBtb3JlIGNhcHMKKworMjAxMi0wOS0xNCAwMjo1Nzo0NCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAwLjExLjk0ID09PQorCisyMDEyLTA5LTE0IDAyOjQ4OjQzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBDaGFuZ2VMb2c6CisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTEuOTQKKworMjAxMi0wOS0xNCAwMTo1MDo0NCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBwbzogdXBkYXRlIHRyYW5zbGF0aW9ucworCisyMDEyLTA5LTE0IDAxOjQ2OjE0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkgIGRvY3M6IHVwZGF0ZSBkb2NzCisKKzIwMTItMDktMTQgMDA6NDc6MzggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tlbmMuYzoKKwkgIHRlc3RzOiBwdXNoIHN0cmVhbS1zdGFydCBhbmQgc2VnbWVudCBldmVudHMgaW4gd2F2cGFja2VuYyB0ZXN0CisKKzIwMTItMDktMTMgMTA6NTY6MjcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkgIHY0bDI6IHJlbW92ZSB1bnVzZWQgcHJvcGVydGllcworCisyMDEyLTA5LTEzIDEwOjE1OjU0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBkaXNhYmxlIHJlY29uZmlndXJlCisJICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MzkwMgorCisyMDEyLTA5LTEwIDIyOjA5OjU5IC0wNzAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IERvbid0IHRyZWF0IGV2ZXJ5IGN1c3RvbS1kb3duc3RyZWFtIGV2ZW50IGFzIEVPUworCSAgRG9uJ3QgZmFsbCB0aHJvdWdoIHRvIHRoZSBFT1MgaGFuZGxpbmcgYWZ0ZXIgcmVjZWl2aW5nIGEKKwkgIGN1c3RvbS1kb3duc3RyZWFtIGV2ZW50LgorCisyMDEyLTA5LTEyIDIxOjA1OjQ0ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIGNvbGxlY3RwYWRzOiByZW1vdmUgZ3N0X2NvbGxlY3RfcGFkc19hZGRfcGFkX2Z1bGwKKwkgIFJlbmFtZSBnc3RfY29sbGVjdF9wYWRzX2FkZF9wYWRfZnVsbCgpIHRvIGdzdF9jb2xsZWN0X3BhZHNfYWRkX3BhZCgpIGFuZCBmaXggYWxsCisJICBpbnZvY2F0aW9ucy4KKworMjAxMi0wOS0xMiAxNzoxNDo0NiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICB1ZHA6IGFkZCBpbmNsdWRlIGZvciBJUFBST1RPXyoKKworMjAxMi0wOS0xMiAxNjozOTowOCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICB1ZHA6IHByb3Blcmx5IG1hdGNoIGJyYWNlcyBhbmQgY3BwIGRpcmVjdGl2ZXMKKwkgIEZpeGVzIGNvbXBpbGF0aW9uIHdoZXJlIElQVjZfVENMQVNTIG5vdCBkZWZpbmVkLgorCisyMDEyLTA5LTEyIDE0OjQyOjA3ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkgIHNoYXBld2lwZTogVXNlIGRlZmF1bHQgcXVlcnkgaGFuZGxlciB3aGVyZSBuZWVkZWQKKwkgIEFuZCBjbGVhbiB1cCBnZXRfY2FwcyBjb2RlIHdoaWxlIEknbSBhdCBpdAorCisyMDEyLTA5LTEyIDEzOjI4OjA3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBpbXByb3ZlIGZyYW1lcmF0ZSB0cmFuc2Zvcm0KKwkgIEhhbmRsZSBHX01BWElOVCBpbiB0aGUgZnJhbWVyYXRlcyBiZXR0ZXIuIElmIHdlIGNhbm5vdCBkb3VibGUgb3IgZGl2aWRlIHRoZQorCSAgZnJhbWVyYXRlLCBjbGFtcCB0byB0aGUgc21hbGxlc3QvbGFyZ2VzdCBwb3NzaWJsZSB2YWx1ZSB3ZSBjYW4gZXhwcmVzcyBpbnN0ZWFkCisJICBvZiBmYWlsaW5nLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Mzg2MQorCisyMDEyLTA5LTEyIDEzOjE3OjU0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBzbWFsbCBjbGVhbnVwCisKKzIwMTItMDktMDcgMTc6MjA6NTcgLTA0MDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kLmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5oOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXIyOiBBZGRpbmcgbnYxMiBhbmQgbnYyMSBzdXBwb3J0CisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgzODQxCisKKzIwMTItMDktMTIgMTA6MTg6NTMgKzAyMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEByZGlvLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZm91cmNjLmg6CisJICBxdGRlbXV4OiBhZGQgc3VwcG9ydCBmb3IgcHJvcmVzCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgzODM5CisKKzIwMTItMDktMTIgMDA6MTY6MzEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzoKKwkgIHRlc3RzOiBmaXggbW9zdCBvZiB0aGUgcmdhbmFseXNpcyB1bml0IHRlc3RzCisJICBCZWZvcmUgdGhlIGVsZW1lbnQgd291bGQgcG9zdCBtZXNzYWdlcyBvbiB0aGUgYnVzIGl0c2VsZiwgbm93CisJICB0aGUgc2lua3MgZG8gdGhhdCBiYXNlZCBvbiB0aGUgdGFnIGV2ZW50cyB0aGV5IHJlY2VpdmUuIEJ1dAorCSAgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBwcm9wZXIgc2luayBlbGVtZW50cyBpbiB0aGVzZSB1bml0IHRlc3RzLAorCSAgYnV0IGp1c3QgZGFuZ2xpbmcgcGFkcywgd2UgaGF2ZSB0byBwb3N0IHRoZSB0YWcgbWVzc2FnZXMgdGhlCisJICB0ZXN0IGNoZWNrcyBmb3Igb3Vyc2VsdmVzLgorCSAgRG93biBmcm9tIDUyLzU1IGZhaWxpbmcgdG8gNy81MiBmYWlsaW5nLgorCisyMDEyLTA5LTExIDE3OjM2OjUxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIGV4dCwgZ3N0OiBvbmx5IGFjdGl2YXRlIGluIHB1bGwgbW9kZSBpZiB1cHN0cmVhbSBpcyBzZWVrYWJsZQorCisyMDEyLTA5LTExIDE1OjM4OjIzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyOiBkaXNhYmxlIHJlbmVnb3RpYXRpb24KKwkgIFdlIGNhbid0IHlldCB3YWl0IGZvciB0aGUgYnVmZmVycG9vbCB0byBEUkFJTiBiZWZvcmUgc3RhcnRpbmcgcmVuZWdvdGlhdGlvbiBzbworCSAgZGlzYWJsZSBpdCBmb3Igbm93LgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Mjc3MAorCisyMDEyLTA5LTExIDEyOjQ4OjM5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluLmM6CisJICB0ZXN0czogcnRwYmluOiBwb3J0IHRvIHRoZSBuZXcgR0xpYiB0aHJlYWQgQVBJCisKKzIwMTItMDktMTEgMTI6MzY6NTYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmg6CisJICBkaXJlY3Rzb3VuZHNpbms6IHBvcnQgdG8gdGhlIG5ldyBHTGliIHRocmVhZCBBUEkKKworMjAxMi0wOS0xMSAxMTo1OTo1NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBkb24ndCByZXNldCBzZWdtZW50CisJICBEb24ndCByZXNldCB0aGUgc2VnbWVudCBiZWNhdXNlIHdlIG5lZWQgdGhlIHZhbHVlcyBmb3IgYWNjdW11bGF0aW9uLiB0aGUgc2VnbWVudAorCSAgaXMgcmVzZXQgYXQgc3RhcnQgYW5kIGFmdGVyIGEgZmx1c2hpbmcgc2Vlay4gRml4ZXMgc29tZSBwcm9ibGVtcyB3aXRoIGZpbGVzIHdpdGgKKwkgIHF1aWNrdGltZSBzZWdtZW50cy4KKworMjAxMi0wOS0xMCAxNzoxNDozNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzZGVtdXguYzoKKwkgIHRlc3RzOiBmaXggaWQzZGVtdXggdGVzdAorCisyMDEyLTA5LTEwIDE0OjMxOjAyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9hbWZkZWZzLmg6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSAgZ3N0OiBhZGp1c3QgY29tbWVudCBzdHlsZQorCisyMDEyLTA5LTEwIDE0OjMwOjQyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHJlbW92ZSBkZWZ1bmN0IGNvbW1lbnRlZCBjb2RlCisKKzIwMTItMDktMTAgMTM6MzU6MTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2VzcmM6IGNvbnNpZGVyIHN0cmVhbSBhbGl2ZSB3aGVuIG5vdCBjb25uZWN0ZWQgeWV0CisJICBXaGVuIHdlIHN0YXJ0IGFuZCByZW5lZ290aWF0ZSwgdGhlcmUgaXMgYSBtb21lbnQgd2hlcmUgdGhlIHN0cmVhbSBpcyBjcmVhdGVkIGJ1dAorCSAgbm90IHlldCBjb25uZWN0ZWQuIE1ha2Ugc3VyZSBhbGwgZnVuY3Rpb25zIGRlYWwgd2l0aCB0aGlzIHNpdHVhdGlvbiBjb3JyZWN0bHkKKwkgIGluc3RlYWQgb2YgZXJyb3Jpbmcgb3V0LgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MTI0NworCisyMDEyLTA5LTEwIDEyOjE1OjI1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBkb24ndCBmYWlsIHdoZW4gbm90IG5lZ290aWF0ZWQgeWV0CisJICBXaGVuIGdldF90aW1lIGlzIGNhbGxlZCBidXQgd2UgYXJlIG5vdCB5ZXQgbmVnb3RpYXRlZCwgcmV0dXJuIDAgaW5zdGVhZCBvZgorCSAgcG9zdGluZyBhbiBlcnJvci4gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBiYXNlIGNsYXNzIGlzIHN0aWxsIG5lZ290aWF0aW5nIHdoZW4KKwkgIG91ciBnZXRfdGltZSBpcyBjYWxsZWQuCisKKzIwMTItMDktMTAgMTE6MzI6MjUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkqIHN5cy9vc3M0L29zczQtc291cmNlLmM6CisJICB1cGRhdGUgZm9yIGF1ZGlvIGJhc2Ugc3JjIGFwaSBjaGFuZ2UKKworMjAxMi0wOS0xMCAwMDo0Mjo1MiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgdmlkZW8veC0zaXZ4IGFuZCB2aWRlby94LXh2aWQgLT4gdmlkZW8vbXBlZyxtcGVndmVyc2lvbj00CisJICBJZiBpdCBldmVyIHR1cm5zIG91dCB0aGF0IHdlIHJlYWxseSBtdXN0IHVzZSB0aG9lIHNwZWNpZmljCisJICBmb3VyY2NzIGFuZCBub3QgdGhlIGdlbmVyaWMgb25lLCB3ZSBjYW4gc3RpbGwgYWRkIGEgZmxhdm9yCisJICBmaWVsZCB0byB0aGUgY2FwcyBsYXRlci4KKworMjAxMi0wOS0wNyAxNjoxNTo0MiArMDIwMCAgRGFuaWVsYSA8ZGFuaWVsYS5tdXp6dUBzZWxleGVsc2FnLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYXZvaWQgbGVhaworCSAgV2hlbiBzZXR1cCBmYWlscywgbWFrZSBzdXJlIHRvIGNsZWFudXAgYWZ0ZXJ3YXJkcy4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NzM1MDkKKworMjAxMi0wOS0wNyAxNToyMzo0NCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkgIHJ0cGFtcmRlcGF5OiB1bm1hcCBydHAgYnVmZmVyCisJICAuLi4gdGhlcmVieSBwbHVnZ2luZyBhIG1lbWxlYWsuCisKKzIwMTItMDktMDcgMTQ6MTM6MTcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSAgdGVzdHM6IHJ0cC1wYXlsb2FkaW5nOiBhZGp1c3QgdG8gbW9kaWZpZWQgYnVmZmVybGlzdCBzZW1hbnRpY3MKKwkgIC4uLiBub3cgaW1wbGVtZW50ZWQgYnkgYnVmZmVyIG1lbW9yeSBibG9ja3MuCisKKzIwMTItMDktMDcgMTQ6MTE6MzkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IGF2b2lkIGNyYXNoaW5nIG9uIE5VTEwgYWNjZXNzIGluIGRlYnVnIG1lc3NhZ2UKKworMjAxMi0wOS0wNyAxNDoxMTowMiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkgIHJ0cGgyNjNwcGF5OiBwbHVnIGNhcHMgbGVhaworCisyMDEyLTA5LTA2IDE3OjA5OjIwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiByZW1vdmUgcmVkdW5kYW50IF9zZXRfYWxsb2NhdGlvbiBjYWxsCisKKzIwMTItMDktMDYgMTc6MDU6MDAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGFjZS5jOgorCSAgdGVzdHM6IGRlaW50ZXJsYWNlOiBkbyBub3QgbGVhayBkZWludGVybGFjZSBwYWRzCisKKzIwMTItMDktMDYgMTc6MDQ6MzkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBwbHVnIHNvbWUgbGVha3MKKworMjAxMi0wOS0wNiAxNjo0OTowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogcmV1c2UgY29yZSBmdW5jdGlvbiBmb3IgR0NECisKKzIwMTItMDktMDYgMTY6MzE6MDAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBzdXBwb3J0IGZpbHRlciBpbiBnZXRjYXBzCisKKzIwMTItMDktMDYgMTY6MzA6NDQgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBkbyBub3QgbGVhayBnZXRjYXBzIHJlc3VsdAorCisyMDEyLTA5LTA2IDE2OjIzOjI4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5oOgorCSAgZGVpbnRlcmxhY2U6IGFkZCBzdXBwb3J0IGZvciBidWZmZXJwb29sCisJICBBZGQgYnVmZmVycG9vbCBzdXBwb3J0IHRvIGF2b2lkIGEgbWVtY3B5IGluIHRoZSB2aWRlb3Npbmsgd2hlbiBhY3RpdmVseQorCSAgaW50ZXJsYWNpbmcuCisJICBSZW1vdmUgc29tZSBjb21tZW50ZWQgb2Jzb2xldGUgY29kZS4KKworMjAxMi0wOS0wNiAxMzozODo1MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogcHJveHkgYWxsb2NhdGlvbiBxdWVyeSBpbiBwYXNzdGhyb3VnaAorCSAgV2UgY2FuIGxldCB0aGUgYWxsb2NhdGlvbiBxdWVyeSBwYXNzIHdoZW4gd2UgYXJlIG9wZXJhdGluZyBpbiBwYXNzdGhyb3VnaCBtb2RlLgorCisyMDEyLTA5LTA2IDEzOjIzOjQ2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiB1c2UgZGVmYXVsdCBldmVudCBmdW5jdGlvbnMKKwkgIGluc3RlYWQgb2YgYmxpbmRseSBmb3J3YXJkaW5nIHVua25vd24gZXZlbnRzLgorCisyMDEyLTA5LTA2IDEzOjIzOjMwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBzbWFsbCBjbGVhbnVwcworCisyMDEyLTA5LTA2IDEyOjU2OjMwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBjYWxsIGRlZmF1bHQgcXVlcnkgaGFuZGxlcnMKKwkgIENhbGwgdGhlIGRlZmF1bHQgcXVlcnkgaGFuZGxlciBpbnN0ZWFkIG9mIGZvcndhcmRpbmcgdGhlIHF1ZXJ5IGJsaW5kbHkuIEZpeGVzCisJICBpc3N1ZXMgb2Ygc3RyaWRlcyBiZWNhdXNlIG9mIHByb3h5aW5nIHRoZSBhbGxvY2F0aW9uIHF1ZXJ5IHdyb25nbHkuCisKKzIwMTItMDktMDYgMTA6NDI6MjEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IHJlbW92ZSB1bnVzZWQgY29kZS4KKworMjAxMi0wOS0wNiAxMDo0MjowNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2U6IGltcHJvdmUgZGVidWcKKworMjAxMi0wOS0wNSAxMTo1MDowNSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJICBkdmRlbXV4OiByZW1vdmUgb2Jzb2xldGUgdXBkYXRlIG5ld3NlZ21lbnQgaGFuZGxpbmcgY29kZQorCisyMDEyLTA5LTA0IDEyOjM1OjUzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJICB2aWRlb2JhbGFuY2U6IGF2b2lkIGRlYWRsb2NrCisJICBfdXBkYXRlX3Byb3BlcnRpZXMgdGFrZXMgdGhlIG9iamVjdCBsb2NrIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCB3aGVuIHRoZQorCSAgb2JqZWN0IGxvY2sgaXMgYWxyZWFkeSB0YWtlbi4KKworMjAxMi0wOS0wMyAxMjo0NjowMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGV4dHJhY3QgaW50ZXJsYWNlZC1uZXNzIG9mIHZpZGVvIHRyYWNrIGZyb20gaW50ZXJsYWNlLW1vZGUgZmllbGQKKwkgIGluc3RlYWQgb2YgdGhlIG9sZCBib29sZWFuICJpbnRlcmxhY2VkIiBmaWVsZC4KKworMjAxMi0wOS0wMyAwMjo1MToyNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdmltdXguYzoKKwkgIHZpZGVvL3gteHZpZCAtPiB2aWRlby9tcGVnLG1wZWd2ZXJzaW9uPTQKKworMjAxMi0wOS0wMiAwMjo1MDo1MCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIHRleHQvcGxhaW4gKyB0ZXh0L3gtcGFuZ28tbWFya3VwIC0+IHRleHQveC1yYXcKKworMjAxMi0wOS0wMiAwMTozMTo1MyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgZ3N0X21lc3NhZ2VfbmV3X2R1cmF0aW9uIC0+IGdzdF9tZXNzYWdlX25ld19kdXJhdGlvbl9jaGFuZ2VkCisKKzIwMTItMDgtMzAgMjI6MDc6MjQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHNlc3Npb246IGFsc28gc3RvcCBwcm9iYXRhdGlvbiBvbiBleGlzdGluZyBzb3VyY2VzCisJICBSZWNlaXZpbmcgYW4gUlRDUCBwYWNrZXQgc2hvdWxkIGFsc28gc3RvcCBwcm9iYXRpb24gb24gc291cmNlcyB3ZSBoYXZlIHNlZW4KKwkgIGJlZm9yZS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODMwNjUKKworMjAxMi0wOC0yMiAxNjozNjoyMSAtMDcwMCAgQWxlaXggQ29uY2hpbGxvIEZsYXF1ZSA8YWxlaXhAb2Jsb25nLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0cDogbWFrZSBydHAgcGFja2V0IHByb2JhdGlvbiBjb25maWd1cmFibGUgKGJ1ZyAjNjgyNTEyKQorCisyMDEyLTA4LTMwIDEyOjIxOjAxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmb3ZlcmxheS5jOgorCSAgZ2RrcGl4YnVmOiBhZGp1c3QgdG8gbW9kaWZpZWQgdmlkZW8gb3ZlcmxheSBjb21wb3NpdGlvbiBBUEkKKworMjAxMi0wOC0zMCAxMTozMDowMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGZpeHVwIDAuMTEgcG9ydCBvZiBzdXNwZWN0IGZyYW1lIGNoZWNraW5nCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgyOTU5CisKKzIwMTItMDgtMjggMTg6NTY6MTkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogYXZvaWQgaW52YWxpZCBIMjY0IGJ5dGVzdHJlYW0gY29kZWNfZGF0YQorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MTM2OQorCisyMDEyLTA4LTI4IDE5OjAwOjQ0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwb3J0IHNlZ21lbnQgZXZlbnQgY3JlYXRpb24gdG8gMC4xMQorCisyMDEyLTA4LTI4IDE2OjI4OjEzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiByZWxlYXNlIGV4dHJhIGV2ZW50IHJlZiB3aGVuIHJlcGxhY2luZyBwZW5kaW5nIG5ld3NlZ21lbnQgZXZlbnQKKworMjAxMi0wNy0wMyAxNzo1MDoyNCArMDIwMCAgRGF2aWQgQ29ydm95c2llciA8ZGF2aWQuY29ydm95c2llckBvcmFuZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9kdW1wLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmM6CisJICBpc29tcDQ6IGFkZCBEQVNIIHRmZHQgYm94IHN1cHBvcnQKKwkgIE1QRUcgREFTSCBoYXMgZGVmaW5lZCBhIHNldCBvZiBuZXcgYm94ZXMgdG8gc3BlY2lmeSBkdXJhdGlvbiwgaW5kZXhlcyBhbmQKKwkgIG9mZnNldHMgb2YgSVNPQk1GRiBmcmFnbWVudHMuCisJICBUaGUgVHJhY2sgRnJhZ21lbnQgQmFzZSBNZWRpYSBEZWNvZGUgVGltZSAodGZkdCkgQm94IGNhbiBpbiBwYXJ0aWN1bGFyIGJlCisJICBpbmNsdWRlZCBpbnNpZGUgYSB0cmFmIGJveCB0byBzcGVjaWZ5IHRoZSBhYnNvbHV0ZSBkZWNvZGUgdGltZSwgbWVhc3VyZWQgb24gdGhlCisJICBtZWRpYSB0aW1lbGluZSwgb2YgdGhlIGZpcnN0IHNhbXBsZSBpbiBkZWNvZGUgb3JkZXIgaW4gdGhlIHRyYWNrIGZyYWdtZW50LgorCSAgVGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUgdXNlZCBieSB0aGUgaXNvbXA0IGRlbXV4IHRvIGZpbmQgb3V0IHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mCisJICBhbiBNUDQgZnJhZ21lbnQgaW4gdGhlIHRpbWVsaW5lLgorCSAgVGhpcyBwYXRjaCBhZGRzIGNvZGUgdG8gaXNvbXA0IHRvOgorCSAgLSBwYXJzZSB0aGUgdGZkdCBib3gKKwkgIC0gYWRqdXN0IHRoZSB0aW1lL3Bvc2l0aW9uIG1lbWJlciBvZiB0aGUgbmV3IHNlZ21lbnQgc2VudCB3aGVuIHBsYXliYWNrIHN0YXJ0cworCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NzUzNQorCisyMDEyLTA4LTI2IDIyOjM5OjU1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6CisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm9yZW5kZXIuYzoKKwkqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOgorCSogZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5LmM6CisJKiBleHQvZHYvZ3N0ZHZkZWMuYzoKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjdGFnLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZXh0L3RhZ2xpYi9nc3RhcGV2Mm11eC5jYzoKKwkqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmJhbmQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmxpbWl0LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2R5bmFtaWMuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RwdXNoZmlsZXNyYy5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0dGFnaW5qZWN0LmM6CisJKiBnc3QvZGVidWd1dGlscy9wcm9ncmVzc3JlcG9ydC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0b3AuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJKiBnc3QvZWZmZWN0di9nc3RyYWRpb2FjLmM6CisJKiBnc3QvZWZmZWN0di9nc3RyZXYuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJpcHBsZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c3RyZWFrLmM6CisJKiBnc3QvZWZmZWN0di9nc3R2ZXJ0aWdvLmM6CisJKiBnc3QvZWZmZWN0di9nc3R3YXJwLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjEwYmFuZHMuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkqIGdzdC9nb29tMmsxL2dzdGdvb20uYzoKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6CisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOgorCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSogZ3N0L2lzb21wNC9hdG9tc3JlY292ZXJ5LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LWRvYy5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL3dlYm0tbXV4LmM6CisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdGZpbGVzcmMuYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYzoKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJndm9sdW1lLmM6CisJKiBnc3QvcnRwL1JFQURNRToKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkqIHN5cy9vc3M0L29zczQtc2luay5jOgorCSogc3lzL29zczQvb3NzNC1zb3VyY2UuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwycmFkaW8uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvd2F2ZWZvcm0vZ3N0d2F2ZWZvcm1zaW5rLmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSogdGVzdHMvZXhhbXBsZXMvY2Fpcm8vY2Fpcm9fb3ZlcmxheS5jOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC1BTVIuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjQuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLVZUUy1IMjYzcC1BVFMtUENNQS5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItVlRTLUgyNjNwLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1hbHNhc3JjLVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWRlY29kZWJpbi1IMjYzcC1BTVIuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXY0bDItSDI2M3AtYWxzYXNyYy1BTVIuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXY0bDItSDI2NC1hbHNhc3JjLVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkqIHRlc3RzL2ljbGVzL2dka3BpeGJ1ZnNpbmstdGVzdC5jOgorCSogdGVzdHMvaWNsZXMvdmlkZW9jcm9wLXRlc3QuYzoKKwkgIGRvY3M6IGdzdC1sYXVuY2ggLT4gZ3N0LWxhdW5jaC0xLjAgYW5kIGZmbXBlZ2NvbG9yc3BhY2UgLT4gdmlkZW9jb252ZXJ0CisKKzIwMTItMDgtMjYgMjI6MzI6NTQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICBkb2NzOiBnc3QtbGF1bmNoLTAuMTEgLT4gZ3N0LWxhdW5jaC0xLjAKKworMjAxMi0wOC0yNiAyMjowODo1NCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IHRoZSBmaWVsZCBpbiBjYXBzIGlzICJpbnRlcmxhY2UtbW9kZSIgbm90ICJpbnRlcmxhY2UtbWV0aG9kIgorCSAgRml4IGRlaW50ZXJsYWNlIHVuaXQgdGVzdC4gTmVlZCB0byBzZXQgcmlnaHQgZmllbGQgb24gb3V0cHV0IGNhcHMuCisJICBBbHNvIHJlbW92ZSByaWdodCBmaWVsZCAobm90IG9sZCAwLjEwICJpbnRlcmxhY2VkIiBib29sZWFuIGZpZWxkKQorCSAgZnJvbSBjYXBzIGluIHVuaXQgdGVzdCBiZWZvcmUgY29tcGFyaW5nIG9sZCBhbmQgbmV3LgorCisyMDEyLTA4LTI2IDIxOjQ1OjQ0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pY3lkZW11eC5jOgorCSAgdGVzdHM6IGZpeCBpY3lkZW11eCB1bml0IHRlc3QKKwkgIFdhcyB3YWl0aW5nIGZvciBhIHRhZyBtZXNzYWdlIG9uIHRoZSBidXMsIHdoaWNoIHdvdWxkIG5ldmVyCisJICBjb21lLCBiZWNhdXNlIGVsZW1lbnRzIGRvbid0IHBvc3QgdGhvc2UgdGhlbXNlbHZlcyBhbnkgbW9yZQorCSAgYnV0IGxldCBzaW5rcyBwb3N0IHRoZW0gZnJvbSB0YWcgZXZlbnRzLiBPbmx5IHRoYXQgdGhlcmUgYXJlCisJICBubyBzaW5rcyBpbiB0aGlzIHVuaXQgdGVzdC4KKworMjAxMi0wOC0yNiAyMToyNzowMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6CisJICB0ZXN0czogZml4IHZpZGVvY3JvcCBjcm9wX3RvXzF4MSB1bml0IHRlc3QgZm9yIEdSQVk4IGZvcm1hdAorCSAgVXBkYXRlIHRhYmxlIHdpdGggcGl4ZWwgdmFsdWVzIHdpdGggdGhlIHZhbHVlIGFjdHVhbGx5IHByb2R1Y2VkCisJICBieSB2aWRlb3Rlc3RzcmMuCisKKzIwMTItMDgtMjcgMDk6MDA6NDUgKzAyMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogT25seSBwcmludCBjYXBzIGlmIHRoZXkncmUgcHJvdmlkZWQKKworMjAxMi0wOC0yNCAxOTo0MzowOCArMDEwMCAgTWljaGFlbCBSdWJpbnN0ZWluIDxtcnViaW5zdGVpbkByYWktZGV2LmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkgIHZpZGVvbWl4ZXI6IGZpeCBlbmRpYW5uZXNzIGNoZWNrIG9uIHN5c3RlbXMgd2hlcmUgbm9uLWdsaWIgZW5kaWFubmVzcyBkZWZpbmVzIGFyZSBub3Qgc2V0CisJICBPbiBXaW5kb3dzIExJVFRMRV9FTkRJQU4gd2l0aG91dCB0aGUgR18gaW4gd2FzIG5vdCBkZWZpbmVkLCAgc28gdGhlCisJICB0ZXN0IGNvbWVzIG91dCB3cm9uZy4KKworMjAxMi0wOC0yMiAxNzoyMzoyNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIHVkcHNpbms6IGRvbid0IGNyYXNoIG9uIE5VTEwgZXJyb3IKKwkgIENoZWNrIGlmIHRoZXJlIGlzIGFuIGVycm9yIGJlZm9yZSByZXRyaWV2aW5nIGl0cyBtZXNzYWdlLgorCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODI0ODEKKworMjAxMi0wOC0yMiAxMzozMDoxOSArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDY2OGFjZWUgdG8gNGY5NjJmNworCisyMDEyLTA4LTIyIDEzOjE4OjAwICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IGJ1bXAgZ3RrLWRvYyByZXEgdG8gMS4xMiAobWFyLTIwMDkpCisJICBUaGlzIGFsbG93cyB1cyB0byBlLmcuIHVuY29uZGl0aW9uYWxseSB1c2UgZ3RrZG9jLXJlYmFzZS4KKworMjAxMi0wOC0yMiAxMToyMTozOCArMDIwMCAgTWFydGluIEVydHNhYXMgPG1lcnRzYXNAY2lzY28uY29tPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IE1ha2Ugb3N4dmlkZW9zaW5rIHVzZSB0aGUgbm9uLWRlcHJlY2F0ZWQgdGhyZWFkaW5nIGFwaSBmcm9tIGdsaWIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgyNDQ2CisKKzIwMTItMDgtMTQgMTU6NDA6MzEgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBIYW5kbGUgbmVnb3RpYXRpb24gZXZlbnRzCisJICBUaGlzIG1ha2VzIHN1cmUgdGhhdCB3ZToKKwkgIGEpIERlc3Ryb3kgYW4gZXhpc3Rpbmcgc3RyZWFtIGlmIGEgbmVnb3RpYXRlKCkgcmVxdWVzdCBjb21lcyBpbjogdGhpcyBpcworCSAgcmVxdWlyZWQgd2hlbiByZWNlaXZpbmcgYSBkb3duc3RyZWFtIHJlbmVnb3RpYXRpb24gcmVxdWVzdCBhZnRlciBhCisJICBzdHJlYW0gaGFzIGJlZW4gY3JlYXRlZC4KKwkgIGIpIENyZWF0ZSBhIG5ldyBzdHJlYW0gb24gcHJlcGFyZSgpOiB0aGlzIGlzIHJlcXVpcmVkIHNpbmNlIHdlIGRvIGEKKwkgIHNldGNhcHMoKSBpbiBuZWdvdGlhdGUoKSwgd2hpY2ggY2F1c2VzIHRoZSBzdHJlYW0gdG8gYmUgZHJvcHBlZCBieSBhCisJICByaW5nYnVmZmVyIHJlbGVhc2UoKSBjYWxsICh0aGlzIGRvZXMgbm90IGhhcHBlbiBkdXJpbmcgZmlyc3QgbmVnb3RpYXRpb24KKwkgIHNpbmNlIHRoZSByZWxlYXNlIGlzIG9ubHkgZG9uZSBvbiBhIHJ1bm5pbmcgcmluZ2J1ZmZlcikuIFRoZSBzdWJzZXF1ZW50CisJICBjYWxsIHRvIHJpbmdidWZmZXIgYWNxdWlyZSgpIGZhaWxzIGJlY2F1c2UgdGhlIHN0cmVhbSB3YXMgbG9zdCBvbgorCSAgcmVsZWFzZSgpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MTI0NworCisyMDEyLTA4LTE0IDE1OjM4OjI3ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSAgcHVsc2U6IENsZWFyIHVucG9zaXRpb25lZCBmbGFnIHdoZW4gc2V0dGluZyBwb3NpdGlvbnMKKwkgIElmIGNvbnZlcnRpbmcgYSBQQSBjaGFubmVsIG1hcCB0byBnc3QgY2hhbm5lbCBwb3NpdGlvbnMgcmVzdWx0cyBpbiBhCisJICB2YWxpZCBzZXQgb2YgY2hhbm5lbCBwb3NpdGlvbnMsIHdlIGNsZWFyIHRoZSB1bnBvc2l0aW9uZWQgZmxhZyBmcm9tIHRoZQorCSAgcmluZ2J1ZmZlciBzcGVjLgorCisyMDEyLTA4LTE0IDA5OjM3OjQ1ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogUmVtb3ZlIHJlZHVuZGFudCBjaGFubmVsLW1hc2sgc2V0dGluZyBmb3Igc3RlcmVvIGNhc2UKKwkgIFRoZSBnc3RhdWRpbyBoZWxwZXIgbGlicmFyaWVzIGFscmVhZHkgdGFrZSBjYXJlIG9mIHRoaXMgY2FzZSBmb3IgdXMuCisKKzIwMTItMDgtMTQgMDk6MzY6MzAgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBEb24ndCB1c2UgbWVtc2V0IHRvIHNldCBpbnZhbGlkIGNoYW5uZWwgcG9zaXRpb25zCisJICBUaGlzIGl0ZXJlYXRlcyBvdmVyIHRoZSBHc3RBdWRpb0luZm8gdG8gc2V0IGludmFsaWQgY2hhbm5lbCBwb3NpdGlvbnMKKwkgIHJhdGhlciB0aGFuIHVzZSBtZW1zZXQoKSB3aGljaCB3b3JrcyByaWdodCBub3cgYmVjYXVzZSBpdCBhc3N1bWVzIHRoYXQKKwkgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0lOVkFMSUQgaXMgLTEuCisKKzIwMTItMDgtMjIgMTA6MzA6MDQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZnNpbmsuYzoKKwkgIGdka3BpeGJ1ZnNpbms6IG1pbm9yIGRvY3MgaW1wcm92ZW1lbnQKKworMjAxMi0wOC0yMiAxMDoyMzoyNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZXh0L2dka19waXhidWYvTWFrZWZpbGUuYW06CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZwbHVnaW4uYzoKKwkgIGdka3BpeGJ1ZjogcmUtZW5hYmxlIGFscmVhZHktcG9ydGVkIGdka3BpeGJ1ZnNpbmsKKworMjAxMi0wOC0yMiAxMDowODowOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZXh0L2dka19waXhidWYvTWFrZWZpbGUuYW06CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5Lmg6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZwbHVnaW4uYzoKKwkgIGdka3BpeGJ1ZjogcG9ydCBnZGtwaXhidWZvdmVybGF5IGVsZW1lbnQgdG8gMC4xMQorCisyMDEyLTA4LTIyIDAwOjAwOjQ2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9NYWtlZmlsZS5hbToKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZmRlYy5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmZGVjLmg6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZwbHVnaW4uYzoKKwkgIGdka3BpeGJ1ZjogcmUtZW5hYmxlIGFscmVhZHktcG9ydGVkIGdka3BpeGJ1ZiBlbGVtZW50IGFzIGdka3BpeGJ1ZmRlYworCSAgTm90IHN1cmUgd2h5IGl0IGFzIGRpc2FibGVkIGV4YWN0bHkgZ2l2ZW4gdGhhdCBpdCBoYWQgYWxyZWFkeQorCSAgYmVlbiBwb3J0ZWQgKHRob3VnaCB3aXRob3V0IG1ldGFzIG9yIGJhc2VjbGFzcykuCisJICBNb3ZlIHBsdWdpbl9pbml0IGJpdHMgaW50byBzZXBhcmF0ZSBzb3VyY2UgZmlsZSwgYW5kIHJlbmFtZQorCSAgZGVjb2RlciBlbGVtZW50IHRvIGdka3BpeGJ1ZmRlYy4KKworMjAxMi0wOC0yMSAyMzoyNTo0NyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZXh0L2dka19waXhidWYvZ3N0X2xvYWRlci5jOgorCSAgZ2RrcGl4YnVmOiByZW1vdmUgb2xkIGFuZCB1bnVzZWQgZ3N0X2xvYWRlciBzb3VyY2UgZmlsZQorCSAgT25jZSB1cG9uIGEgdGltZSB1c2VkIHRvIGxvYWQgR1N0cmVhbWVyIHZpZHMgdmlhIEdka1BpeGJ1ZiBBUEkuCisKKzIwMTItMDgtMTYgMTY6NTE6MTYgLTA3MDAgIEFsZWl4IENvbmNoaWxsbyBGbGFxdWUgPGFsZWl4QG9ibG9uZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBtYWtlIGppdHRlcmJ1ZmZlciBkcm9wLW9uLWxhdGVuY3kgYXZhaWxhYmxlIChmaXggIzY4MjA1NSkKKwkgIENvbmZsaWN0czoKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaAorCisyMDEyLTA4LTIxIDE5OjQ3OjQ1ICswODAwICBIdWFjYWkgQ2hlbiA8Y2hlbmhjQGxlbW90ZS5jb20+CisKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDI6IG1ha2UgZ3N0X3Y0bDJfZmlsbF9saXN0cygpIGFkYXB0IHRvIGtlcm5lbCAzLjMrCisJICBXaGVuIGRvIHY0bDJfaW9jdGwoKSB3aXRoIFZJRElPQ19FTlVNSU5QVVQgZmFpbHMgb24gc29tZSBkZXZpY2VzLAorCSAga2VybmVscyBiZWZvcmUgMy4zLjAgcmV0dXJuIEVJTlZBTCwgYnV0IG5ld2VyIGtlcm5lbHMgcmV0dXJuIEVOT1RUWS4KKwkgIFRoaXMgcGF0Y2ggbWFrZSB0aG9zZSBkZXZpY2VzIHdvcmsgd2VsbCBvbiBrZXJuZWwgMy4zKy4KKwkgIFJlbGF0ZWQga2VybmVsIGNvbW1pdDoKKwkgIGh0dHA6Ly9naXQua2VybmVsLm9yZy8/cD1saW51eC9rZXJuZWwvZ2l0L3RvcnZhbGRzL2xpbnV4LmdpdDthPWNvbW1pdDtoPTA3ZDEwNmQwYTMzZDYwNjNkMjA2MTMwNTkwM2RlYjAyNDg5ZWJhMjAKKwkgIFNpZ25lZC1vZmYtYnk6IEh1YWNhaSBDaGVuIDxjaGVuaGNAbGVtb3RlLmNvbT4KKwkgIFNpZ25lZC1vZmYtYnk6IFJ1aSBXYW5nIDx3YW5nckBsZW1vdGUuY29tPgorCSAgU2lnbmVkLW9mZi1ieTogSmllIENoZW4gPGNoZW5qQGxlbW90ZS5jb20+CisKKzIwMTItMDgtMjAgMjM6MzA6MzggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgdmlkZW8veC1kdmQtc3VicGljdHVyZSAtPiBzdWJwaWN0dXJlL3gtZHZkCisKKzIwMTItMDgtMTcgMjA6NTI6NDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJICBtdWx0aWZpbGVzcmM6IGZpeCBleGFtcGxlIHBpcGVsaW5lIGluIGRvY3MKKworMjAxMi0wOC0xNyAxNDo1OTo1NyArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIzYmFuZHMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2VxdWFsaXplci5jOgorCSAgZXF1YWxpemVyOiBlbmFibGUgcHJlc2V0cyBmb3IgdGhlIG4tYmFuZCBlcXVhbGl6ZXIKKwkgIEFkZCBhIHRlc3QgZm9yIHNhdmluZyBhbmQgcmVzdG9yaW5nIHRoZSBwcmVzZXQuCisKKzIwMTItMDgtMTQgMDE6MjA6MTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IGZpeCBub3QtbmVnb3RpYXRlZCBlcnJvcnMgb24gdmFyaWFibGUgb3IgbWlzc2luZyBmcmFtZXJhdGUgaW4gaW5wdXQgY2FwcworCSAgUmVtb3ZlIHNvbWUgYm9ndXMgY29kZSBJIGFkZGVkIGR1cmluZyBwb3J0aW5nIHRoYXQgd291bGQgZXJyb3Igb3V0CisJICBvbiBtaXNzaW5nIG9yIHZhcmlhYmxlIGZyYW1lcmF0ZXMgaW4gaW5wdXQgY2Fwcy4gSGFuZGxlIHRoaXMgbGlrZQorCSAgd2UgZG8gaW4gMC4xMAorCSAgRml4ZXMgdGVzdF9tb2RlX2Rpc2FibGVkX3Bhc3N0aHJvdWdoIHVuaXQgdGVzdCBjaGVjay4KKworMjAxMi0wOC0xMiAxMzoxNjozMiArMDIwMCAgU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PgorCisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOgorCSAgbGF3OiBGaWx0ZXIgbGF5b3V0IGNhcHMgZmllbGQKKwkgIFRoZSBsYXlvdXQgY2FwcyBmaWVsZCBzaG91bGRuJ3QgYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIHNpbmsgcGFkCisJICBvZiB7bXUsYX1sYXdkZWMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgxNjc3CisKKzIwMTItMDgtMDkgMTk6NDE6MzQgKzAzMDAgIEFudG9uIEJlbGthIDxhbnRvbmJlbGthQGdtYWlsLmNvbT4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogYWxsb3cgYSBUT0Mgd2l0aCBzaW5nbGUgYWx0ZXJuYXRpdmUgdG9wLWxldmVsIGVudHJ5CisJICBBbGxvdyBhIFRPQyB0aGF0IGhhcyBhIHNpbmdsZSBhbHRlcm5hdGl2ZSB0b3AtbGV2ZWwgZW50cnkKKwkgIHdpdGggbXVsdGlwbGUgc2VxdWVuY2Ugc3ViLWVudHJpZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD01NDA4OTEKKworMjAxMi0wOC0wOSAxMDozMTozOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogQW5kIGZpeCB0aGUgR1RLIGNoZWNrIHRvIHVzZSB0aGUgY29ycmVjdCBwa2ctY29uZmlnIHBhY2thZ2UgbmFtZQorCisyMDEyLTA4LTA5IDEwOjI1OjM4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBGaXggR1RLIHJlcXVpcmVkIHZlcnNpb24gdmFyaWFibGUgbmFtZQorCisyMDEyLTA4LTA5IDA4OjM1OjIzICswMTAwICBNYXR0aGlhcyBDbGFzZW4gPG1jbGFzZW5AcmVkaGF0LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGZpeCBidWlsZCB3aXRoIHJlY2VudCBrZXJuZWxzLCB0aGUgdjRsMl9idWZmZXIgaW5wdXQgZmllbGQgd2FzIHJlbW92ZWQKKwkgIFRoaXMgd2FzIHVudXNlZCBhcHBhcmVudGx5IGFuZCByZW1vdmVkIGluIHRoZSBrZXJuZWwgaW4gY29tbWl0OgorCSAgRnJvbSAyYjcxOWQ3YmFmNDkwZTI0Y2U3ZDgxN2M2MzM3YjdjODdmZGE4NGMxIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorCSAgRnJvbTogU2FrYXJpIEFpbHVzIDxzYWthcmkuYWlsdXNAaWtpLmZpPgorCSAgRGF0ZTogV2VkLCAyIE1heSAyMDEyIDA5OjQwOjAzIC0wMzAwCisJICBTdWJqZWN0OiBbUEFUQ0hdIFttZWRpYV0gdjRsOiBkcm9wIHY0bDJfYnVmZmVyLmlucHV0IGFuZCBWNEwyX0JVRl9GTEFHX0lOUFVUCisJICBSZW1vdmUgaW5wdXQgZmllbGQgaW4gc3RydWN0IHY0bDJfYnVmZmVyIGFuZCBmbGFnIFY0TDJfQlVGX0ZMQUdfSU5QVVQgd2hpY2gKKwkgIHRlbGxzIHRoZSBmb3JtZXIgaXMgdmFsaWQuIFRoZSBmbGFnIGlzIHVzZWQgYnkgbm8gZHJpdmVyIGN1cnJlbnRseS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODE0OTEKKwkgIENvbmZsaWN0czoKKwkgIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmMKKworMjAxMi0wOC0wOCAxNzoyNTozNiAtMDcwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSAgcnRwaDI2NHBheTogTWFrZSBpdCBhY3R1YWxseSB3b3JrIGFmdGVyIGNsZWFudXBzCisKKzIwMTItMDgtMDggMTc6NDA6MzQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuYzoKKwkgIGdzdDogU2V0IGFsaWdubWVudCBhdCB0aGUgY29ycmVjdCBwbGFjZSBvZiBHc3RBbGxvY2F0aW9uUGFyYW1zCisKKzIwMTItMDgtMDggMTc6Mzk6MDcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgZ3N0OiBTZXQgYWxpZ25tZW50IGF0IHRoZSBjb3JyZWN0IHBsYWNlIG9mIEdzdEFsbG9jYXRpb25QYXJhbXMKKworMjAxMi0wOC0wOCAxNjoyNTo1OCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQKKworPT09IHJlbGVhc2UgMC4xMS45MyA9PT0KKworMjAxMi0wOC0wOCAxNToyMjowNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMC4xMS45MworCisyMDEyLTA4LTA4IDE1OjE3OjIyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogTWFrZWZpbGUuYW06CisJKiB3aW4zMi9NQU5JRkVTVDoKKwkqIHdpbjMyL2NvbW1vbi90dW5lci1lbnVtdHlwZXMuYzoKKwkqIHdpbjMyL2NvbW1vbi90dW5lci1lbnVtdHlwZXMuaDoKKwkqIHdpbjMyL2NvbW1vbi90dW5lci1tYXJzaGFsLmM6CisJKiB3aW4zMi9jb21tb24vdHVuZXItbWFyc2hhbC5oOgorCSAgd2luMzI6IGFkZCBnZW5lcmF0ZWQgdHVuZXItbWFyc2hhbC9lbnVtdHlwZXMgZmlsZXMgZm9yIHY0bDJzcmMgYW5kIHVwZGF0ZQorCSAgQW5kIGdzdC1pbmRlbnQgdGhlIHJpZ2h0IHJ0cCBtYXJzaGFsIGZpbGVzOyBhZGQgbWlzc2luZyBmaWxlcyB0byBNQU5JRkVTVC4KKworMjAxMi0wOC0wOCAxNToxMDozNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUtZGlzdC5jOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLWRpc3QuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kb3JjLWRpc3QuYzoKKwkgIGdzdDogdXBkYXRlIGRpc3RlZCBvcmMgZmlsZXMKKworMjAxMi0wOC0wOCAxMTozMTo1OSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBzeXMvb3NzNC9vc3M0LWF1ZGlvLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgU2lsZW5jZSBzb21lICd2YXJpYWJsZSBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkJyBjb21waWxlciB3YXJuaW5ncworCSAgV2hlbiBjb21waWxpbmcgd2l0aCAtREdfRElTQUJMRV9BU1NFUlQKKworMjAxMi0wOC0wOCAxMDo1Njo1MSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtb292cmVjb3Zlci5jOgorCSogdGVzdHMvaWNsZXMveGltYWdlc3JjLXRlc3QuYzoKKwkgIE5vIGNvZGUgd2l0aCBzaWRlLWVmZmVjdHMgaW5zaWRlIGdfYXNzZXJ0KCkgcGxlYXNlCisKKzIwMTItMDgtMDcgMTE6MTQ6MjEgLTA3MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICBtdWx0aXVkcHNpbms6IFJldHVybiBGTFVTSElORyBpbnN0ZWFkIG9mIEVSUk9SIG9uIHVubG9jaworCSAgSWYgdGhlIGJhc2UgY2xhc3MgYXNrcyBtdWx0aXVkcHNpbmsgdG8gdW5sb2NrLCB0aGVuIGl0IHNob3VsZCByZXR1cm4KKwkgIEZMVVNISU5HLCBub3QgRVJST1IKKworMjAxMi0wNy0yNiAxNjoxOTo1NyArMDMwMCAgQW50b24gQmVsa2EgPGFudG9uYmVsa2FAZ21haWwuY29tPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmg6CisJICBmbGFjZW5jOiBhZGQgVE9DIHN1cHBvcnQKKwkgIEFkZCBUT0MgYXMgZW1iZWRkZWQgY3Vlc2hlZXRzIGluIGZsYWMgZmlsZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQwODkKKworMjAxMi0wOC0wNyAxMjoxMjowOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGdlbmVyYXRlIGVtcHR5IHZvcmJpc2NvbW1lbnQgZm9yIGNvbXBsZXRlIHN0cmVhbWhlYWRlcnMgaWYgbmVlZGVkCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgxMzM1CisKKzIwMTItMDgtMDYgMTg6MDI6NTAgLTA3MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgcnRwc3NyY2RlbXV4OiBCbG9jayBwYWQgd2hpbGUgaXQgaXMgYW5ub3VuY2VkLgorCSAgQmxvY2sgdGhlIFJUUCBwYWQgYW5kIGFzc29jaWF0ZWQgUlRDUCBwYWRzIHdoaWxlIHRoZXkgYXJlIGJlaW5nCisJICBhbm5vdW5jZWQuIFRoaXMgaXQgdG8gcHJldmVudCBhIHJhY2Ugd2hlcmUgb25lIGlzIGFubm91bmNlZCBhbmQKKwkgIGJlZm9yZSB0aGUgY2FsbGJhY2sgaGFzIGNvbm5lY3RlZCBpdCwgdGhlIG90aGVyIG9uZSBnZXRzIGEgYnVmZmVyLgorCSAgV2UgY2FuJ3QgdXNlIHRoZSAicGFkbG9jayIgb2Ygc3NyY2RlbXV4IGJlY2F1c2UgaXQgY2F1c2VzIGRlYWRsb2Nrcy4KKworMjAxMi0wOC0wNiAxNTowMDo1NyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIGNvbW1vbjogdW4tZG8gYWNjaWRlbnRhbCBjb21tb24gdXBkYXRlIHJldmVydCBpbiBjb21taXQgN2I1OTI1YjUKKworMjAxMi0wOC0wNiAxNDo1MDo1MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYzoKKwkgIHJ0cG1wYXJvYnVzdGRlcGF5OiBzZXQgY29ycmVjdCBkYXRhX3NpemUgZm9yIGdlbmVyYXRlZCBkdW1teSBmcmFtZQorCSAgLi4uIHdoaWNoIHByZXZlbnRzIGdldHRpbmcgc3R1Y2sgaW4gYSBsb29wIGlmIHN1Y2ggb25lIGlzIG5lZWRlZC4KKworMjAxMi0wOC0wNiAxNDo1MDowMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYzoKKwkgIHJ0cG1wYXJvYnVzdGRlcGF5OiBpbXByb3ZlIGFuZCBmaXggZGVidWcgc3RhdGVtZW50CisJICAuLi4gc28gaXQgcmVhbGx5IGluZm9ybXMgYWJvdXQgbmV4dCByYXRoZXIgdGhhbiBwYXN0IGZyYW1lLgorCisyMDEyLTA4LTA2IDEyOjM0OjU1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcGFyb2J1c3RkZXBheS5jOgorCSAgcnRwbXBhcm9idXN0ZGVwYXk6IHVwZGF0ZSBhdmFpbGFibGUgYnl0ZXdyaXRlciBzcGFjZSB3aGVuIHJlcG9zaXRpb25pbmcKKwkgIC4uLiBhbmQgYWRkIHNvbWUgbW9yZSBhc3NlcnQgdG8gY2F0Y2ggcG90ZW50aWFsIHN1cnByaXNlcyBlYXJseSBvbi4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODA1NTgKKworMjAxMi0wOC0wNCAxMjo0Nzo0NCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgZ3N0OiBBZGQgc3RyZWFtLWlkIHRvIHN0cmVhbS1zdGFydCBldmVudHMKKworMjAxMi0wOC0wNCAxMjo1NDozMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogQ2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzcycgcXVlcnkgaGFuZGxlciBpZiBubyBwYWQgaXMgcHJvdmlkZWQKKworMjAxMi0wOC0wMiAwMTo0ODoyOSArMDIwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiBhZGQgYSBiZXR0ZXIgZGV0ZWN0aW9uIGZvciB0aGUgbWFpbiBydW4gbG9vcAorCisyMDEyLTA3LTI3IDE2OjEzOjQ5ICswMjAwICBYYXZpIEFydGlnYXMgPHhhcnRpZ2FzQGZsdWVuZG8uY29tPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBkaXJlY3Rzb3VuZHNpbms6IERvIG5vdCBvdmVyd3JpdGUgdGhlIERTIGJ1ZmZlciB3aGVuIHRlc3RpbmcgZm9yIEFDMyBzdXBwb3J0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgwNzA2CisJICBDb25mbGljdHM6CisJICBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmMKKworMjAxMi0wOC0wNSAxNjozOToyMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDk0Y2NmNGMgdG8gNjY4YWNlZQorCisyMDEyLTA4LTAzIDE2OjEzOjUyICswMTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHJ0cHNzcmNkZW11eDogUmVsZWFzZSBsb2NrIGJlZm9yZSBzaWduYWxsaW5nIG5ldyBwYWQKKwkgIFRoaXMgcHJldmVudHMgYSBkZWFkbG9jayB3aGVyZSBzb21ldGhpbmcgd291bGQgdHJ5IHRvIHB1c2ggYW4gZXZlbnQKKwkgIHRocm91Z2ggdGhlIFNTUkMgZGVtdXggZnJvbSB0aGUgY2FsbGJhY2ssIGNhdXNpbmcgdGhlIHBhZHMgdG8gYmUgaXRlcmF0ZWQKKwkgIGFuZCB0aGUgbG9jayB0YWtlbi4KKworMjAxMi0wOC0wNCAxNjoxMDoxNiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FwZXYybXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pY3lkZW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzZGVtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM3YybXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3RhZ3NjaGVja2luZy5jOgorCSAgZ3N0X3RhZ19saXN0X2ZyZWUgLT4gZ3N0X3RhZ19saXN0X3VucmVmCisKKzIwMTItMDgtMDMgMTQ6MTA6MzIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBtYW5hZ2UgcmFjZSBiZXR3ZWVuIGNvbm5lY3Rpb24gY2xvc2luZyBhbmQgZmx1c2hpbmcKKwkgIC4uLiB3aGVyZSB0aGUgZm9ybWVyIGNhbiBoYXBwZW4gaW4gdGFzayB0aHJlYWQgYW5kIHRoZSBsYXR0ZXIgaW4gbWFpbmxvb3AKKwkgIHVwb24gZG93bndhcmQgc3RhdGUgY2hhbmdlLgorCisyMDEyLTA4LTAzIDE0OjAyOjIzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogaW1wcm92ZSBhbmQgcmVsYXggYXVkaW8gZnJhbWUgcGFyc2luZworCSAgLi4uIHNvIGFzIHRvIHByb3Blcmx5IHJlY29nbml6ZSBmaXJzdCBhdWRpbyBmcmFtZS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODEwNzcKKwkgIENvbmZsaWN0czoKKwkgIGV4dC9mbGFjL2dzdGZsYWNkZWMuYworCisyMDEyLTA4LTAxIDEyOjE2OjQxICswMjAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBkb3VibGUgdW5yZWYgb2YgcHJpdmF0ZSB0YWcgYnVmZmVyCisKKzIwMTItMDctMzAgMTc6NTQ6NTEgKzAzMDAgIEFudG9uIEJlbGthIDxhbnRvbmJlbGthQGdtYWlsLmNvbT4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogY3JlYXRlIFRPQyBhcyBuZWVkZWQKKwkgIEF2b2lkIGNyZWF0aW5nIHRoZSB0b2MgaWYgdGhlIHdhdiBoYXMgbm8gb3IgZW1wdHkgY3VlIGNodW5rLgorCSAgQWxzbyBhIHNtYWxsIGNvZGUgY2xlYW51cC4KKworMjAxMi0wNy0yOCAxMToyNjowMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogdXBkYXRlIGZvciBUT0MgQVBJIGNoYW5nZXMKKworMjAxMi0wNy0yOCAxMToyMjo0MyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYTogdXBkYXRlIGZvciBUT0MgQVBJIGNoYW5nZXMKKworMjAxMi0wNy0yOCAxMToyMDowOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogdXBkYXRlIGZvciBUT0MgQVBJIGNoYW5nZXMKKworMjAxMi0wNy0yOCAwMDoxOTo1MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJKiBleHQvZmxhYy9nc3RmbGFjdGFnLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHRhZ2luamVjdC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3Jndm9sdW1lLmM6CisJICB0YWc6IFVwZGF0ZSBmb3IgdGFnbGlzdC90YWcgZXZlbnQgQVBJIGNoYW5nZXMKKworMjAxMi0wNy0yNyAxMjowNTo0NCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvaXNvbXA0LXBsdWdpbi5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdChkZSltdXg6IHBhc3MgcHJpdmF0ZSBibG9iIHRhZ3MgaW4gYSBzYW1wbGUKKwkgIC4uLiByYXRoZXIgdGhhbiBhIGJ1ZmZlciwgYW5kIHRoZSBkZXRhaWxlZCBpbmZvIGluIHRoZSBzYW1wbGUgaW5mbworCSAgcmF0aGVyIHRoYW4gY2Fwcy4KKworMjAxMi0wNy0yNyAxMTozMToxMyArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSAgdmlkZW9jcm9wOiBEb24ndCByZXR1cm4gTlVMTCBmcm9tIF90cmFuc2Zvcm1fY2FwcworCSAgSWYgX3RyYW5zZm9ybV9jYXBzICgpIHJldHVybnMgTlVMTCwgdGhlIGJhc2V0cmFuc2Zvcm0gX3RyYW5zZm9ybV9jYXBzCisJICB0cmllcyB0byBjYWxsIGdzdF9jYXBzX2lzX3N1YnNldCAoKSB3aXRoIGEgTlVMTCBzdWJzZXQgd2hpY2ggaGl0cyBhbgorCSAgYXNzZXJ0aW9uLgorCisyMDEyLTA3LTI3IDExOjI2OjE4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogb2J0YWluIGltYWdlIHR5cGUgZnJvbSB0aGUgc2FtcGxlIGluZm8KKworMjAxMi0wNy0yNyAxMToyNTo0OSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IHJlbW92ZSBleHRyYW5lb3VzIF91bnJlZgorCSAgLi4uIHNpbmNlIHdlIGRpZCBub3Qgb2J0YWluIGEgYnVmZmVyIHJlZiBmcm9tIHRoZSBHc3RTYW1wbGUuCisKKzIwMTItMDctMjcgMTA6MTQ6MjMgKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogVXBkYXRlIHRvIHVzZSBHc3RTYW1wbGUgdGFnIHNldHRpbmcgQVBJCisKKzIwMTItMDctMjYgMTY6MzQ6MjEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJICBydHBtcGFyb2J1c3RkZXBheTogbW9kaWZ5IGJ1ZmZlciBkYXRhIHJhdGhlciB0aGFuIGJ1ZmZlciBpdHNlbGYKKworMjAxMi0wNy0yNiAxNjoyODozMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYzoKKwkgIHJ0cG1wYXJvYnVzdGRlcGF5OiBhdm9pZCBsZWFraW5nIGJ5dGV3cml0ZXIgaW5zdGFuY2UKKworMjAxMi0wNy0yNiAxNjowNDoyMyArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBGaXggdGltZXN0YW1wIGFkanVzdG1lbnQgYW5kIGNhcHMKKworMjAxMi0wNy0yNiAxNjowMzo1NyArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBGaXgvc2ltcGxpZnkgdGVsZWNpbmUgc3RhdGUgY2hlY2tzCisKKzIwMTItMDctMjYgMTI6MDg6NTggKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogSW1wcm92ZSBkZWJ1ZyBvdXRwdXQKKworMjAxMi0wNy0yNiAxMjowODozNiArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBGaXggbG93LWxhdGVuY3kgcGF0dGVybiBsb2NraW5nCisKKzIwMTItMDctMjQgMTY6MTk6NTMgKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogUkZGIHNob3VsZCBiZSBpZ25vcmVkIGluIGRlaW50ZXJsYWNlCisJICBSRkYgb25seSBvY2N1cnMgb24gcHJvZ3Jlc3NpdmUgZnJhbWVzIGluIHRlbGVjaW5lIHNlcXVlbmNlcy4gRm9yCisJICBkZWludGVybGFjZSwgd2UgZG9uJ3Qgd2FudCB0aGVzZSByZXBlYXRlZCBmaWVsZHMgYXMgd2Ugd2lsbCBzaW1wbHkgYmUKKwkgIHB1c2hpbmcgdGhlIHByb2dyZXNzaXZlIGZyYW1lIGFuZCB0aGVuIG1vdmluZyBvbi4KKwkgIEhvd2V2ZXIsIHdlIG5lZWQgdG8gY29uc2lkZXIgUkZGIGluIG9yZGVyIHRvIGNvcnJlY3RseSBpZGVudGlmeSBwYXR0ZXJucworCSAgYW5kIGFkanVzdCB0aGUgdGltZXN0YW1wcy4KKworMjAxMi0wNy0yNCAxNDo1OTo0NyArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBJbXByb3ZlIHByb2Nlc3MgbG9naWMKKwkgIFRoZSBsb2dpYyBub3cgd29ya3MgYmV0dGVyIGlmIHdlIGZpbHRlciBvcnBoYW5zLCB0aGVuIHByb2dyZXNzaXZlLCB0aGVuCisJICB0ZWxlY2luZSBpbnRlcmxhY2VkIGZpZWxkcyB3aGljaCBuZWVkIHRvIGJlIHdvdmVuIGFuZCBmYWxsIHRocm91Z2ggdG8KKwkgIGludGVybGFjZS4gVGVsZWNpbmUgaW50ZXJsYWNlZCBmaWVsZHMgd2lsbCBiZSByZWd1bGFybHkgZGVpbnRlcmxhY2VkIGlmCisJICB0aGVyZSBpcyBubyBwYXR0ZXJuIGxvY2sgZm9yIHVzIHRvIGJlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgdGVsZWNpbmUKKwkgIHBhdHRlcm4uCisJICBUZWxlY2luZSBzZXF1ZW5jZXMgdGhhdCBhcmVuJ3QgMjRmcHMgcHJvZ3Jlc3NpdmUgd2l0aCBSRkYgZmxhZ3MgY2FuJ3QKKwkgIHJlYWxseSBiZSB0ZXN0ZWQgdW50aWwgZmllbGRhbmFseXNpcyBpcyBwb3J0ZWQuCisKKzIwMTItMDctMjUgMTY6MDI6MzQgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBvbmx5IHNldCBjb21wbGV0ZSBvdXRwdXQgY2FwcyBvbmNlCisJICAuLi4gc28gYXMgdG8gYXZvaWQgZG93bnN0cmVhbSBjb21wbGFpbnRzIGFib3V0IG1pc3Npbmcgc3RyZWFtaGVhZGVycy4KKworMjAxMi0wNy0yNSAxNToyOTowNCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGZsYWNkZWM6IGFsc28gc3VwcG9ydCBTMjRfMzIgb3V0cHV0CisKKzIwMTItMDctMjUgMTU6Mjg6MTQgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBwYXNzIGNvcnJlY3QgcGFyYW1ldGVycyB0byBlbmNvZGVyIGxpYgorCisyMDEyLTA3LTI1IDE0OjU3OjEzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogYWRqdXN0IHRvIG1vZGlmaWVkIGF1ZGlvZW5jb2RlciBnZXRjYXBzIGhlbHBlciBBUEkKKworMjAxMi0wNy0yNSAxMjo1MDowMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcDogZ28gYW5kIHN0YXkgaW4gdGhlIGxvb3AgZnVuY3Rpb24gb24gUExBWQorCSAgV2hlbiB3ZSBoYXZlIGEgUExBWSByZXF1ZXN0LCBnbyBpbnRvIHRoZSBMT09QIGZ1bmN0aW9uIG5leHQuIFdoZW4gd2UgYXJlCisJICBsb29waW5nLCBrZWVwIG9uIGxvb3BpbmcgdW50aWwgd2UgYXJlIHRvbGQgb3RoZXJ3aXNlLgorCSAgVGhpcyBmaXhlZCBydHNwIGFuZCBUQ1AgY29ubmVjdGlvbnMuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgwNTUxCisKKzIwMTItMDctMjUgMTI6NDk6MzUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3A6IHNldCBjYXBzIGFmdGVyIGFjdGl2YXRpbmcgdGhlIHBhZAorCisyMDEyLTA3LTI1IDEyOjQ5OjA3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgaDI2NGRlcGF5OiBzbWFsbCBjbGVhbnVwcworCisyMDEyLTA3LTI1IDEwOjA4OjUyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L2dzdHJ0cHhxdGRlcGF5LmM6CisJICB4cXRkZXBheTogZml4IGJ1ZmZlciByZWZjb3VudCBlcnJvcgorCSAgQWZ0ZXIgcHVzaGluZyB0aGUgYnVmZmVyIGludG8gdGhlIGFkYXB0ZXIsIHdlIHNob3VsZCBub3QgbGV0IHRoZSBiYXNlY2xhc3MgcHVzaAorCSAgaXQgb3V0IGFueW1vcmUuIFRoaXMgZXJyb3Igd2FzIGludHJvZHVjZWQgd2hpbGUgcG9ydGluZyB0byAwLjExLgorCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODA1NDAKKworMjAxMi0wNy0yNCAyMTo0MTo1MyArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJICBsZXZlbDogcmVtb3ZlIG9ic29sZXRlIGxpYm9pbCBjb21tZW50CisKKzIwMTItMDctMjQgMjE6MTE6MTggKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgbWF0cm9za2FkZW11eDogcHVzaCBtb2RlOiBpbmNyZWFzZSBzZWdtZW50IGFjY3VyYWN5IGZvbGxvd2luZyBzZWVrCisJICBDb25mbGljdHM6CisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYworCisyMDEyLTA3LTI0IDE2OjQxOjUxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBwZXJmb3JtIHByb3BlciBLRVlfVU5JVCBzZWVrIGFsc28gaW4gcHVzaCBtb2RlCisJICBDb25mbGljdHM6CisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYworCisyMDEyLTA3LTI0IDE5OjA0OjM5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogZG9uJ3QgY3Jhc2ggZGVyZWZlcmVuY2luZyBOVUxMIGVycm9yIHdoZW4gbGVhdmluZyBtdWx0aWNhc3QgZ3JvdXAgb24gc2h1dGRvd24KKwkgIFN0cmFuZ2VseSBlbm91Z2gsIGlmIHdlIGRvIHBhc3MgYW4gZXJyb3IgdmFyaWFibGUgdG8gYmUgZmlsbGVkLCB3ZQorCSAgbm8gbG9uZ2VyIGdldCBhbiBlcnJvciBvbiBsZWF2aW5nLgorCisyMDEyLTA3LTI0IDE1OjU1OjEyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHJlYXJyYW5nZSBzb21lIGNoZWNrcyB0byBhdm9pZCBOVUxMIHVzZQorCisyMDEyLTA3LTI0IDE1OjM4OjI0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHVzZSBzYW1lIGZvdXJjYyB0byBkZXRlcm1pbmUgY2FwcyBpbiBkZXRlcm1pbmluZyB1bmNvbXByZXNzZWQtbmVzcworCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3Mzg5OAorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jCisKKzIwMTItMDctMjQgMTU6MzY6NTQgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBSZXZlcnQgImF2aWRlbXV4OiBEb24ndCBjb25zaWRlciAwIGZjY19oYW5kbGVyIGFzIHVuY29tcHJlc3NlZC4iCisJICBUaGlzIHJldmVydHMgY29tbWl0IGM2YjlmNWIyNWFiNDM1NjY5ODE2YTA3MDQ5YjBlNWE4ZjAxZTA5Y2EuCisJICBmb3VyY2MgR1NUX1JJRkZfcmdiID0gMCBzdGlsbCBsZWFkcyB0byByYXcgdW5jb21wcmVzc2VkIHJnYiBjYXBzLgorCSAgU2VlIGFsc28gaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3Mzg5OAorCisyMDEyLTA3LTI0IDEyOjEwOjQ2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogZml4IHVwIGV4YW1wbGUgcGlwZWxpbmUgc29tZSBtb3JlCisJICBObyBtb3JlIGZmbXBlZ2NvbG9yc3BhY2UKKworMjAxMi0wNy0yMCAxNjozMDowMCArMDMwMCAgU3JlZXJlbmogQmFsYWNoYW5kcmFuIDxzcmVlcmVuai5iYWxhY2hhbmRyYW5AaW50ZWwuY29tPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBGaXggdGhlIGV4YW1wbGUgZ3N0LWxhdW5jaCBwaXBlbGluZS4KKworMjAxMi0wNy0yNCAxMjozMzozMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogYXZvaWQgTlVMTCBhY2Nlc3Mgd2hlbiBjaGVja2luZyBzdWJ0aXRsZQorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MDM4OAorCisyMDEyLTA3LTI0IDEyOjIyOjA4ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IFJlc2V0IHBhcnNlciB3aGVuIHdlIGhhdmUgY2FwcyB3aXRob3V0IGNvZGVjX2RhdGEKKwkgIFRoaXMgZW5zdXJlcyB0aGUgZGV0ZWN0aW9uIChhbmQgcHJvcGVyIGRvd25zdHJlYW0gY2FwcyBzZXR0aW5ncykgd2lsbAorCSAgYWN0dWFsbHkgaGFwcGVuIHdoZW4gd2UgaGF2ZSBuZXcgaW5jb21pbmcgY2FwcyB3aXRob3V0IGNvZGVjX2RhdGEuCisJICBUaGlzIHdhcyBlYXNpbHkgdHJpZ2dlcmVkIGJ5IHN0cmVhbXMgZnJvbSBtYXRyb3NrYWRlbXV4IHdoaWNoIGluaXRpYWxseQorCSAgcHJvdmlkZWQgY2FwcyB3aXRoIGEgY29uc3RydWN0ZWQgY29kZWNfZGF0YSwgYnV0IHRoZW4gcHVzaGVkIG5ldyBjYXBzCisJICB3aXRob3V0IHRoZSBjb2RlY19kYXRhIG9uY2UgaXQgZGV0ZWN0ZWQgdGhlIHN0cmVhbSB3YXMgYWR0cy4KKworMjAxMi0wNy0yNCAwOToxNzowOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kb3JjLWRpc3QuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kb3JjLWRpc3QuaDoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kb3JjLm9yYzoKKwkgIHZpZGVvbWl4ZXI6IHByZWZpeCBvcmMgZnVuY3Rpb25zIHdpdGggdmlkZW9fbWl4ZXJfb3JjXworCisyMDEyLTA3LTI0IDA5OjEzOjQ4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy1kaXN0LmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMtZGlzdC5oOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLm9yYzoKKwkgIHZpZGVvYm94OiBwcmVmaXggb3JjIGZ1bmN0aW9ucyB3aXRoIHZpZGVvX2JveF9vcmNfCisKKzIwMTItMDctMjMgMTg6NTE6MDAgKzAyMDAgIENocmlzdGlhbiBGcmVkcmlrIEthbGFnZXIgU2NoYWxsZXIgPHVyYWV1c0BsaW51eHJpc2luLm9yZz4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgVXBkYXRlIHNwZWMgZmlsZSB3aXRoIGxhdGVzdCBjaGFuZ2VzCisKKzIwMTItMDctMjMgMTc6Mzc6NTggKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGdlbmVyYXRlIGNvcnJlY3Qgc2VnbWVudCBzdHJlYW0gdGltZQorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MDI3NQorCisyMDEyLTA3LTIzIDE2OjQyOjU2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGoya2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuaDoKKwkgIHJ0cDogYWx3YXlzIHVzZSBidWZmZXIgbGlzdHMKKworMjAxMi0wNy0yMyAxNToyNDoxNyArMDIwMCAgUGF0cmljaWEgTXVzY2FsdSA8cGF0cmljaWFAYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5Lmg6CisJICBydHBtcDR2cGF5OiBhbHdheXMgZW5hYmxlIGJ1ZmZlci1saXN0cworCisyMDEyLTA3LTIzIDE1OjIyOjI0ICswMjAwICBQYXRyaWNpYSBNdXNjYWx1IDxwYXRyaWNpYUBheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuaDoKKwkgIHJ0cGpwZWdwYXk6IGFsd2F5cyBlbmFibGUgYnVmZmVyLWxpc3RzCisKKzIwMTItMDctMjMgMTU6NDk6MDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IGdldCBmcmFtZSBmbGFncyBjb3JyZWN0bHkKKwkgIEFsc28gbW92ZSB0aGUgZGVpbnRlcmxhY2UgcGx1Z2luIHRvIHBvcnRlZCBzdGF0dXMKKworMjAxMi0wNy0yMyAxNTozMzo1NCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogcHJvcGVyIHBhcnNlIHJlY292ZXJ5IGFmdGVyIHNlZWsKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODA0MjcKKworMjAxMi0wNy0yMyAxMjozOTowNSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBjbGVhciBvbGQgc2VnbWVudCBldmVudCB3aGVuIHJlcXVlc3RpbmcgbmV3IG9uZQorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MDI4MworCisyMDEyLTA3LTIzIDEwOjMyOjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkgIGV4dDogVXBkYXRlIGZvciB2aWRlbyBiYXNlIGNsYXNzZXMgQVBJIGNoYW5nZXMKKworMjAxMi0wNy0yMyAwODo0OTowNyArMDIwMCAgQWxiYW4gQnJvd2FleXMgPHByYWhhbEB5YWhvby5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IGNvbnZlcnQgYWxsIG5vbiBHU1RfRk9STUFUX0JZVEVTIHRvIGZvcm1hdCBieXRlcy4KKwkgIENvbnZlcnQgYWxsIG5vbiBHU1RfRk9STUFUX0JZVEVTIHRvIGZvcm1hdCBieXRlczoKKwkgIGZpeGVzOgorCSAgR1N0cmVhbWVyLUNSSVRJQ0FMICoqOiBnc3RfcXVlcnlfc2V0X2R1cmF0aW9uOiBhc3NlcnRpb24gYGZvcm1hdCA9PQorCSAgZ192YWx1ZV9nZXRfZW51bSAoZ3N0X3N0cnVjdHVyZV9pZF9nZXRfdmFsdWUgKHMsIEdTVF9RVUFSSyAoRk9STUFUKSkpJworCSAgZmFpbGVkCisJICB3aGVuIHBsYXlpbmcgbW9yZSB0aGFuIG9uZSB3YXYgc3RyZWFtLgorCSAgZ3N0LXBsdWdpbnMtYmFzZS90ZXN0cy9pY2xlcy9wbGF5YmFjay90ZXN0NyB1cmkxLndhdiB1cmkyLndhdgorCisyMDEyLTA3LTIzIDA5OjI1OjIzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogRG9uJ3QgZmFpbCBpZiBtb3JlIGRhdGEgdGhlbiBuZWVkZWQgaXMgYXZhaWxhYmxlIHdoZW4gcGFyc2luZyBjdWUgY2h1bmtzCisJICBGaXhlcyBidWcgIzY4MDMyOC4KKworMjAxMi0wNy0yMyAwOToyMjoyMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IFNvbWUgbWlub3IgY2xlYW51cCB0byB0aGUgY3VlL2xhYmwgcGFyc2luZworCisyMDEyLTA3LTIzIDA4OjQ1OjI4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDk4ZTM4NmYgdG8gOTRjY2Y0YworCisyMDEyLTA3LTE5IDE0OjU1OjQ1ICswMjAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmg6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHloLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvVG9tc01vQ29tcEFsbC5pbmM6CisJICBkZWludGVybGFjZTogUG9ydCB0byAxLjAKKwkgIFRoaXMgcmVxdWlyZXMgdGhlIGFkZGl0aW9uYWwgSU5URVJMQUNFRCBidWZmZXIgZmxhZyByZWNlbnRseSBhZGRlZCB0bworCSAgLWJhc2UKKworMjAxMi0wNy0yMCAxNToxODo0NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSAgaW50ZXJsZWF2ZTogY29udmVydCB0aGUgb3V0cHV0IHNlZ21lbnQgdG8gdGltZQorCSAgQ29udmVydCB0aGUgc3RvcmVkIGlucHV0IHNlZ21lbnQgdG8gdGltZSBiZWZvcmUgcHVzaGluZyBpdCBvdXQuCisJICBDb25mbGljdHM6CisJICBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmMKKworMjAxMi0wNy0yMCAxMzoxMjo0NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5oOgorCSAgaW50ZXJsZWF2ZTogdHJ5IHRvIGZpeCBzZWdtZW50IGhhbmRsaW5nCisJICBDb25mbGljdHM6CisJICBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmMKKworMjAxMi0wNy0yMCAxNToyODoyMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogTm9uLXVwZGF0ZSBzZWVrcyBzaG91bGQgc3RpbGwgbWFrZSBzdXJlIHRoYXQgcmV2ZXJzZSBwbGF5YmFjayBzdGF0dXMgaXMgcmVzZXQKKwkgIENvbmZsaWN0czoKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jCisKKzIwMTItMDctMjAgMTU6MTg6MjEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IFByb3Blcmx5IGluaXRpYWxpemUgZnJvbV9vZmZzZXQgYW5kIGZyb21fdGltZQorCisyMDEyLTA3LTIwIDE0OjI1OjQzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBXZSBuZWVkIGFuIGluZGV4IGFuZCBpbmRleCBlbnRyeSBmb3IgcmV2ZXJzZSBwbGF5YmFjaworCSAgUmV2ZXJzZSBwbGF5YmFjayBkb2VzIG5vdCB3b3JrIHdpdGggaW5kZXgtbGVzcyBmaWxlcyB5ZXQuCisKKzIwMTItMDctMjAgMTQ6MTA6NDEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBjbGVhbiB1cCBwdXNoIG1vZGUgc2VnbWVudCBoYW5kbGluZworCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MDI3NworCisyMDEyLTA3LTIwIDEzOjM1OjI5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwcm9wZXJseSB0cmFuc2Zvcm0gaW5jb21pbmcgc2VnbWVudCBldmVudAorCSAgLi4uIHdoaWNoIGlzIHJlYWxseSB1c2VmdWwgZm9yIHByb3BlciBwdXNoIG1vZGUgc2Vla2luZy4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODAyNzgKKworMjAxMi0wNy0yMCAxMTowNzo1OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICBtYXRyb3NrYWRlbXV4OiBGaXggcmV2ZXJzZSBwbGF5YmFjayBmb3Igc2Vla3Mgd2l0aG91dCBzdG9wIHBvc2l0aW9uCisJICBDb25mbGljdHM6CisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmgKKworMjAxMi0wNy0yMCAxMDo0ODozNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogT25seSB0YWtlIHRoZSBzdHJlYW1fc3RhcnRfdGltZSBpbnRvIGFjY291bnQgZm9yIFNFVCBzZWVrcworCSAgRm9yIG90aGVyIHNlZWtzIHRoZSBzdHJlYW1fc3RhcnRfdGltZSBpcyBhbHJlYWR5IGFkZGVkIHRvIHRoZQorCSAgc2VnbWVudCB2YWx1ZXMuCisJICBDb25mbGljdHM6CisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYworCisyMDEyLTA3LTA4IDIwOjM2OjIyICswMzAwICBBbnRvbiBCZWxrYSA8YW50b25iZWxrYUBnbWFpbC5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICB3YXZwYXJzZTogQWRkIFRPQyBzdXBwb3J0CisJICBBZGQgc3VwcG9ydCBmb3I6CisJICAqIEN1ZSBDaHVuaworCSAgKiBBc3NvY2lhdGVkIERhdGEgTGlzdCBDaHVuaworCSAgKiBMYWJlbCBDaHVuaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NzMwNgorCisyMDEyLTA1LTA5IDE1OjU4OjE2ICswMjAwICBNYXJpYSBHaW92YW5uYSBDaGlvc3NhIDxtYXJpYWdpb3Zhbm5hLmNoaW9zc2EgYXQgc2VsZXhlbHNhZy5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGFsc28gc2V0IFVEUCBidWZmZXIgc2l6ZSBpbiBtdWx0aWNhc3QKKwkgIEFsc28gc2V0IHRoZSBVRFAgYnVmZmVyIHNpemUgaW4gbXVsdGljYXN0IG1vZGUuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc1NDQ4CisKKzIwMTItMDctMTggMjM6NDM6NTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggaGVhZGVyIHBhcnNpbmcgaW4gcHVzaCBtb2RlCisJICBGaXggJ2JyZWFrJyB0aGF0IGdvdCB3YXJwZWQgdG8gdGhlIHdyb25nIHBsYWNlLAorCSAgcHJvYmFibHkgYXMgcGFydCBvZiBhIG1lcmdlLiBGaXhlcyBHU1RfSVNfQlVGRkVSCisJICBjcml0aWNhbHMgaW4gcGFyc2VfaWRpdCgpIHdoZW4gYmVpbmcgYWNjaWRlbnRhbGx5CisJICBwYXNzZWQgYSBOVUxMIGJ1ZmZlciBiZWNhdXNlIG9mIHRoZSBtaXNzaW5nIGJyZWFrLgorCSAgZ3N0LWxhdW5jaC0xLjAgcGxheWJpbiB1cmk9aHR0cDovL2RvY3MuZ3N0cmVhbWVyLmNvbS9tZWRpYS9zaW50ZWxfdHJhaWxlci00ODBpLmF2aQorCisyMDEyLTA3LTE4IDIyOjQ3OjIyICswMjAwICBBbGJhbiBCcm93YWV5cyA8cHJhaGFsQHlhaG9vLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXA6IGRlcHJlY2F0ZWQgc291cF9tZXNzYWdlX2hlYWRlcnMgX2dldCAtPiBfZ2V0X29uZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MDIwNgorCisyMDEyLTA3LTE4IDE4OjI3OjQwICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkgIGpwZWcvcG5nOiBDYWxsIHZpZGVvX2RlY29kZXJfbmVnb3RpYXRlKCkKKworMjAxMi0wNy0xOCAxNzo1Nzo1OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlYnVndXRpbHMvZ3N0cHVzaGZpbGVzcmMuYzoKKwkgIHVwZGF0ZSBmb3IgZ2hvc3RwYWQgY2hhbmdlcworCisyMDEyLTA3LTE4IDExOjM2OjI3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBQYXNzIHNlZWsgcmF0ZSB0byB1cHN0cmVhbSBzZWVrIGV2ZW50cyBpbiBwdXNoIG1vZGUKKwkgIEZpeGVzIGJ1ZyAjNjc5NDM1LgorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmMKKworMjAxMi0wNy0xNyAxNjozOTowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJICB1cGRhdGUgZm9yIFJUUCBidWZmZXIgYXBpIGNoYW5nZXMKKworMjAxMi0wNy0xNyAxNjozODoyNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RydHB4cXRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkgIHVwZGF0ZSBmb3IgUlRQIGJ1ZmZlciBhcGkgY2hhbmdlcworCisyMDEyLTA3LTE2IDExOjA3OjQ0ICswMjAwICBQYXRyaWNpYSBNdXNjYWx1IDxwYXRyaWNpYUBheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHBoMjY0cGF5OiB1c2UgYnVmZmVyIGxpc3RzCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc5OTk0CisKKzIwMTItMDctMTcgMTA6MDE6NTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBGaXggcGFyc2luZyBvZiBJU1JDIGZyb20gdGhlIGN1ZXNoZWV0cworCisyMDEyLTA3LTA1IDE0OjE1OjI1ICswMzAwICBBbnRvbiBCZWxrYSA8YW50b25iZWxrYUBnbWFpbC5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5oOgorCSAgZmxhY3BhcnNlOiBhZGQgVE9DIHN1cHBvcnQKKwkgIEFkZCBzdXBwb3J0IGVtYmVkZGVkIGN1ZXNoZWV0cyBpbiBmbGFjIGZpbGVzLgorCSAgUGFyc2luZyBNRVRBREFUQV9CTE9DS19DVUVTSEVFVCBhcyBUT0MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQwODkxCisKKzIwMTItMDctMTMgMTQ6NDM6MzEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBhdm9pZCBzb21lIG1vcmUgZnJhbWUgbWlzcGFyc2luZyBieSBhZGRpdGlvbmFsIGhlYWRlciBzYW5pdHkgY2hlY2sKKwkgIC4uLiB1c2luZyBhIHJlcXVpcmVkIGNvbnN0YW50IGJsb2NraW5nX3N0cmF0ZWd5IGJpdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Nzk4MDcKKworMjAxMi0wNy0xMyAxMzo1MTo0OCArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgZGVtdXg6IFB1c2ggU1RSRUFNX1NUQVJUIGV2ZW50IHdoZW4gbmVlZGVkCisKKzIwMTItMDctMTEgMTM6MTA6MDcgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBhdm9pZCB3YXJuaW5nIGlmIGJvdGggdHMgYXJlIGVxdWFsCisKKzIwMTItMDctMTEgMTI6Mjg6MjMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgbXVsdGl1ZHBzaW5rOiBjaGVjayB0aGUgcmlnaHQgc2l6ZSB3aGVuIHdhcm5pbmcgYWJvdXQgdG9vIGxhcmdlIHVkcCBwYWNrZXRzCisJICBXaGF0IG1hdHRlcnMgaXMgdGhlIHRvdGFsIHNpemUsIG5vdCB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlCisJICBpbmRpdmlkdWFsIG1lbW9yeSBjaHVua3MgdGhhdCBtYWtlIHVwIHRoZSBwYWNrZXQuCisKKzIwMTItMDctMTAgMTQ6Mzg6MjEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuaDoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuaDoKKwkgIGF1dG9kZXRlY3Q6IHByb3h5IHRzLW9mZnNldCBwcm9wZXJ0aWVzCisJICBQcm94eSB0aGUgdHMtb2Zmc2V0IHByb3BlcnR5IGluIHRoZSBhdWRpbypzaW5rIGVsZW1lbnRzLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3OTM0MworCisyMDEyLTA3LTA5IDE2OjI3OjEwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICBmaXggZm9yIGFsbG9jYXRvciBBUEkgY2hhbmdlcworCisyMDEyLTA3LTA5IDEyOjIyOjAyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB1cGRhdGUgZm9yIHJpZmYgZmllbGQgcmVuYW1lCisKKzIwMTItMDUtMjEgMTM6NTQ6NTEgKzAyMDAgIE1hdGhpYXMgSGFzc2VsbWFubiA8bWF0aGlhc0BvcGVuaXNtdXMuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiBkcm9wIHJlZHVuZGFudCBlbGVtZW50c19sZXZlbF9MREFERCBsaW5lCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc2MzAyCisKKzIwMTItMDctMDggMTM6MzA6MzQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2pwZWdkZWMuYzoKKwkgIHRlc3RzOiBtaW5vciBqcGVnZGVjIGNsZWFuLXVwcyBhbmQgZml4ZXMKKwkgIEZpeCByYWNlIGNvbmRpdGlvbiBpbiBlb3MgY2hlY2tpbmcgYW5kIGEgbGVhay4gQW5kCisJICBidWlsZCBwaXBlbGluZSB3aXRob3V0IHBhcnNlX2xhdW5jaC4KKworMjAxMi0wNS0yMSAxMzo1Mzo1NCArMDIwMCAgTWF0aGlhcyBIYXNzZWxtYW5uIDxtYXRoaWFzQG9wZW5pc211cy5jb20+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2pwZWdkZWMuYzoKKwkqIHRlc3RzL2ZpbGVzL2ltYWdlLmpwZzoKKwkgIHRlc3RzOiBBZGQgc29tZSBiYXNpYyB0ZXN0cyBmb3IganBlZ2RlYworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NjMwMgorCisyMDEyLTA3LTA4IDAwOjA4OjU1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJICBkdG1mc3JjOiBwYXNzIHVuaGFuZGxlZCBub24tY3VzdG9tIGV2ZW50cyB0byB0aGUgYmFzZSBjbGFzcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NjYyNgorCisyMDEyLTA3LTA2IDE5OjExOjAyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHBoMjY0cGF5OiBhdm9pZCBzb21lIHJlbG9jYXRpb25zCisKKzIwMTItMDctMDYgMTQ6NDk6MTggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkgIHJ0cG1wNHZwYXk6IHJlbW92ZSBkZXByZWNhdGVkIHNlbmQtY29uZmlnIHByb3BlcnR5CisJICBVc2UgY29uZmlnLWludGVydmFsIGluc3RlYWQuCisKKzIwMTItMDctMDYgMTQ6NDI6MTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgcnRwaDI2NGRlcGF5OiByZW1vdmUgZGVwcmVjYXRlZCAiYnl0ZS1zdHJlYW0iIGFuZCAiYWNjZXNzLXVuaXQiIHByb3BlcnRpZXMKKwkgIFRoZXNlIHdpbGwgYmUgcGlja2VkIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gZG93bnN0cmVhbSBjYXBzIG5vdywgc28KKwkgIGlmIHlvdSB3YW50IHRoZSBkZXBheWxvYWRlciB0byBvdXRwdXQgYSBzcGVjaWZpYyBmb3JtYXQsIG1ha2Ugc3VyZQorCSAgdGhlIGVsZW1lbnQgZG93bnN0cmVhbSBhZHZlcnRpc2VzIHRoYXQgcHJlZmVyZW5jZSBvciB1c2UgYSBjYXBzZmlsdGVyCisJICBhZnRlciB0aGUgZGVwYXlsb2FkZXIgdG8gZm9yY2UgaXQuCisKKzIwMTItMDctMDYgMTQ6MTM6NTQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IHJlbW92ZSBkZXByZWNhdGVkIGFuZCBub24tZnVuY3Rpb25hbCAicHJvZmlsZS1sZXZlbC1pZCIgcHJvcGVydHkKKwkgIFRoaXMgaXMgbm93IG9wdGlvbmFsbHkgdGFrZW4gZnJvbSBkb3duc3RyZWFtIGNhcHMsIHNvIGNhbiBiZQorCSAgc3BlY2lmaWVkIHZpYSBhIGNhcHNmaWx0ZXIgYWZ0ZXIgdGhlIHBheWxvYWRlci4KKworMjAxMi0wNy0wNiAxNTowNzo1MSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBwZXJmb3JtIGFkZGl0aW9uYWwgc2FuaXR5IGNoZWNrIGJlZm9yZSBjb25maXJtaW5nIEFEVFMgZm9ybWF0CisJICAuLi4gYW5kIHR3ZWFrIGNvbmZ1c2luZyBkZWJ1ZyBtZXNzYWdlLgorCisyMDEyLTA3LTA2IDE1OjI5OjE0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IHJlbW92ZSB1bmhlbHBmdWwgc3RyYXkgZGVidWcgbWVzc2FnZQorCisyMDEyLTA3LTA2IDEzOjE2OjAwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogcmVtb3ZlIGRlcHJlY2F0ZWQgYW5kIHVudXNlZCAibnRwLW5zLWJhc2UiIHByb3BlcnR5CisKKzIwMTItMDctMDYgMTI6NTc6MjAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LWRvYy5jOgorCSAgZG9jczogdXBkYXRlIGlzb21wNCBkb2NzIGZvciBncHBtdXggLT4gM2dwcG11eCBjaGFuZ2UgYXMgd2VsbAorCisyMDEyLTA3LTA2IDEyOjU0OjAyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eG1hcC5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3RhZ3NjaGVja2luZy5jOgorCSAgaXNvbXA0OiByZW1vdmUgZ3BwbXV4LCB3aGljaCB3YXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgM2dwcG11eAorCisyMDEyLTA3LTA2IDEyOjQ5OjU0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJICBzbXRwOiByZW1vdmUgZGVwcmVjYXRlZCAiZnBzIiBwcm9wZXJ0eQorCisyMDEyLTA3LTA2IDEyOjQ2OjMwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5oOgorCSAgbXVsdGlwYXJ0ZGVtdXg6IHJlbW92ZSBkZXByZWNhdGVkIGFuZCB1bnVzZWQgImF1dG9zY2FuIiBwcm9wZXJ0eQorCSAgUmVwbGFjZWQgYnkgYm91bmRhcnk9TlVMTC4KKworMjAxMi0wNy0wNiAwOTowNzo0MSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHJ0cGgyNjNwcGF5OiBhY2NlcHQgYW55IGgyNjMgaW5wdXQgdW5sZXNzIGRvd25zdHJlYW0gZm9yY2VzIHNwZWNpZmljIHJlcXVpcmVtZW50cworCSAgcnRwaDI2M3BwYXkgc2hvdWxkIGFjY2VwdCBhbnkgaW5wdXQgY29tcGF0aWJsZSB3aXRoIGl0cyBzaW5rIHRlbXBsYXRlCisJICBjYXBzIGlmIGl0IGp1c3Qgb3V0cHV0cyB0byBlLmcuIHVkcHNpbmsgb3IgZmFrZXNpbmsuCisJICBydHBoMjYzcHBheSAhIHJ0cGgyNjNwZGVwYXkgc2hvdWxkIGFsc28gd29yayB3aXRoIGFueSBjb21wYXRpYmxlIGlucHV0LgorCSAgVGhpcyB3b3VsZCBmYWlsIGJlZm9yZSB3aXRoIG5vdC1uZWdvdGlhdGVkIGVycm9ycyBiZWNhdXNlIHRoZSBnZXRfY2FwcworCSAgZnVuY3Rpb24gd291bGQgc2VlIHRoZSBlbmNvZGluZy1uYW1lIGluIHRoZSBkZXBheWxvYWRlcidzIHRlbXBsYXRlIGNhcHMKKwkgIGFuZCBkZWZhdWx0IHRvIGJhc2VsaW5lIEguMjYzIGJlY2F1c2UgdGhlcmUncyBubyBwcm9maWxlL2xldmVsIGluZm9ybWF0aW9uCisJICBpbiB0aG9zZSBjYXBzLCB3aGljaCBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gaWYgZG93bnN0cmVhbSBoYXMgZmlsdGVyY2FwcworCSAgZnJvbSBhbiBTRFAsIGJ1dCBub3QgaWYgdGhvc2UgZmllbGRzIGFyZSBhYnNlbnQgYmVjYXVzZSB0aGV5IGNhbiBiZQorCSAgYW55dGhpbmcgbGlrZSB3aXRoIHRoZSBkZXBheWxvYWRlcidzIHRlbXBsYXRlIGNhcHMuIE1ha2VzCisJICB2aWRlb3Rlc3RzcmMgISBhdmVuY19oMjYzcCAhIHJ0cGgyNjNwcGF5ICEgcnRwaDI2M3BkZXBheSAhIGZha2VzaW5rCisJICB3b3JrLgorCisyMDEyLTA3LTA1IDIyOjU3OjA1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHRlc3RzOiBmaXggaDI2M3AgcGF5bG9hZCAhIGRlcGF5bG9hZCB1bml0IHRlc3QKKwkgIE5lZWQgdG8gYWRkIGgyNjN2ZXJzaW9uIGZpZWxkIHRvIGlucHV0IGNhcHMgc2luY2UgdGhlCisJICBwYXlsb2FkZXIgc2luayBnZXRfY2FwcyBmdW5jdGlvbiB3aWxsIGNvbnRhaW4gaXQgaW4gdGhlCisJICB0aGUgY2FwcywgYW5kIHRoZSBzdHJpY3RlciBjYXBzIHN1YnNldCBjaGVjayByZXF1aXJlcworCSAgdGhpcyB0byBiZSBwcmVzZW50IGluIHRoZSBpbnB1dCBjYXBzIGFzIHdlbGwgdGhlbi4KKworMjAxMi0wNy0wNiAxMTo1MDo1MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJICB1cGRhdGUgZm9yIHF1ZXJ5IGFwaSBjaGFuZ2VzCisKKzIwMTItMDctMDYgMTE6MjY6NDYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB1cGRhdGUgZm9yIHF1ZXJ5IGFwaSBjaGFuZ2VzCisKKzIwMTItMDctMDYgMTE6MDI6MjQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdXBkYXRlIGZvciBhbGxvY2F0aW9uIHF1ZXJ5IGNoYW5nZXMKKworMjAxMi0wNy0wNSAxNToxNDozMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3Jndm9sdW1lLmM6CisJICB0ZXN0czogZml4IHJndm9sdW1lIHVuaXQgdGVzdCBldmVudCBoYW5kbGluZworCSAgTXVzdCBmbHVzaCBhZnRlciBFT1MgYmVmb3JlIHNlbmRpbmcgbW9yZSBidWZmZXJzIG9yCisJICBhbm90aGVyIEVPUyBldmVudCwgb3IgdGhlIGV2ZW50IG9yIGJ1ZmZlciB3aWxsIGJlCisJICByZWplY3RlZC4gQWxzbyBzZW5kIGEgU0VHTUVOVCBldmVudCBhdCB0aGUgc3RhcnQKKwkgIG9mIGVhY2ggc3RyZWFtIGZvciBnb29kIG1lYXN1cmUuCisKKzIwMTItMDctMDUgMTM6MTM6MDkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIGdzdDogSW1wbGVtZW50IHNlZ21lbnQtZG9uZSBldmVudAorCisyMDEyLTA3LTA1IDEyOjM1OjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBSZW1vdmUgdGhlIFRPQyBxdWVyeSBoYW5kbGluZworCisyMDEyLTA3LTA0IDE5OjUyOjIyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thOiBVcGRhdGUgZm9yIG5ldyBHc3RUb2MgQVBJCisJICBUT0Mgc3VwcG9ydCBpbiBtYXRyb3NrYW11eCBpcyBkaXNhYmxlZCBmb3Igbm93IGFzIGl0IHdhcyBicm9rZW4gYW55d2F5LgorCisyMDEyLTA3LTA0IDIzOjU3OjE4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmM6CisJICB0ZXN0czogZml4IHJnYW5hbHlzaXMgdW5pdCB0ZXN0IGV2ZW50IGhhbmRsaW5nCisJICBNdXN0IGZsdXNoIGFmdGVyIEVPUyBiZWZvcmUgc2VuZGluZyBtb3JlIGJ1ZmZlcnMgb3IKKwkgIGFub3RoZXIgRU9TIGV2ZW50LCBvciB0aGUgZXZlbnQgb3IgYnVmZmVyIHdpbGwgYmUKKwkgIHJlamVjdGVkLiBBbHNvIHNlbmQgYSBTRUdNRU5UIGV2ZW50IGF0IHRoZSBzdGFydAorCSAgb2YgZWFjaCBzdHJlYW0gZm9yIGdvb2QgbWVhc3VyZS4KKworMjAxMi0wNy0wNCAxODo1ODo0NiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IGNsZWFyIDAgRFRTIG9uIGJ1ZmZlcnMgb3V0cHV0LCBhcyBzaW5rcyB3aWxsIHByZWZlciBEVFMgb3ZlciBQVFMgZm9yIHN5bmNpbmcKKwkgIFNpbmNlIHRoZSBpbml0aWFsIGRlY29kZWQgc3RpbGwgaW1hZ2UgYnVmZmVyIHdpbGwgaGF2ZSBkdHM9cHRzPTAsIGFuZAorCSAgd2Ugb25seSBzZXQgUFRTIG9uIGJ1ZmZlcnMgd2UgcHVzaCBvdXQsIGFsbCBidWZmZXJzIHB1c2hlZCBvdXQgd291bGQKKwkgIGhhdmUgYSBEVFMgb2YgMC4gU2lua3MsIGhvd2V2ZXIsIHdpbGwgcHJlZmVyIERUUyBvdmVyIFBUUyBpZiBib3RoIGFyZQorCSAgc2V0LCBhbmQgd2lsbCB0aGVyZWZvcmUgYWx3YXlzIHNlZSBhIHRpbWVzdGFtcCBvZiAwIG5vIG1hdHRlciB3aGF0CisJICB0aGUgUFRTIGlzIHNldCB0by4KKwkgIEZpeGVzIHVuaXQgdGVzdCB0b28uCisKKzIwMTItMDctMDQgMjA6NTk6MDMgKzA0MDAgINCg0YPRgdC70LDQvSDQmNC20LHRg9C70LDRgtC+0LIgPGxybjE5ODZAZ21haWwuY29tPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBkaXJlY3Rzb3VuZHNpbms6IEZpeCBxdWVyeSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbjsgbW9yZSBkZWJ1Z2dpbmcKKworMjAxMi0wNy0wNCAxOTo0MTo1MiArMDQwMCAg0KDRg9GB0LvQsNC9INCY0LbQsdGD0LvQsNGC0L7QsiA8bHJuMTk4NkBnbWFpbC5jb20+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIGRpcmVjdHNvdW5kc2luazogRml4IHNwZWMgc3R1ZmYgaW4gZGlyZWN0c291bmRzaW5rCisKKzIwMTItMDUtMzEgMTk6MjI6NDcgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIGRpcmVjdHNvdW5kc2luazogZml4IGFjY2VzcyB0byBpbnZhbGlkIHBvaW50ZXIgaW4gc2V0X3ZvbHVtZQorCisyMDEyLTA2LTEzIDEyOjEyOjM5ICswMjAwICBTZWJhc3RpYW4gRHI9QzM9QjZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIGRpcmVjdHNvdW5kc2luazogRml4IGNhcHMgbGVha3MKKworMjAxMi0wNS0yOSAxMTozNzo1OSArMDAwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgZGlyZWN0c291bmRzaW5rOiBmaXggYWNjZXB0Y2FwcyBjaGVjaworCisyMDEyLTA1LTI1IDEwOjE0OjU3ICswMDAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBkaXJlY3Rzb3VuZHNpbms6IHVzZSBoZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgZm9yIHNwZGlmIGZvcm1hdHMKKworMjAxMi0wNS0yNSAxMDoxOTowOSArMDAwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgZGlyZWN0c291bmRzaW5rOiBhZGQgc3VwcG9ydCBmb3IgRFRTCisKKzIwMTItMDUtMDggMTY6MjM6NDIgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIGRpcmVjdHNvdW5kc2luazogZm9yY2UgNDgwMDAga0h6IGZvcmNlIEFDLTMgb3ZlciBzcGRpZgorCisyMDEyLTA3LTA0IDE3OjQyOjQ5ICswNDAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBkaXJlY3Rzb3VuZHNpbms6IGFkZCBzdXBwb3J0IGZvciBhYy0zIG92ZXIgc3BkaWYKKworMjAxMi0wNy0wNCAxMjozNzo0MCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsYWNlLmM6CisJICB0ZXN0czogZGlzYWJsZSBkZWludGVybGFjZSB0ZXN0IGZvciBub3csIGVsZW1lbnQgc3RpbGwgbmVlZHMgdG8gYmUgcG9ydGVkCisJICBCdXQgbGVhdmUgaXQgYWN0aXZlIGFuZCBwcmludCBhIEZJWE1FLiBQb3J0aW5nIGlzIGluIHByb2dyZXNzLgorCisyMDEyLTA3LTAzIDE5OjM4OjM5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJICBkZWludGVybGVhdmU7IGRvd25ncmFkZSBjYXBzIGNoYW5nZSBmYWlsdXJlIGRlYnVnIG1lc3NhZ2UKKwkgIEFkZCBzb21lIG1vcmUgaW5mbyBhbmQgZG93bmdyYWRlIHRvIHdhcm5pbmcsIHNvCisJICBpdCBkb2Vzbid0IGxvb2sgbGlrZSB0aGUgdW5pdCB0ZXN0IGZhaWxlZC4KKworMjAxMi0wNy0wMyAxNzo1MjoxMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkgIGF1ZGlvcGFub3JhbWE6IGZpeCBuZWdvdGlhdGlvbiBhbmQgdW5pdCB0ZXN0CisJICBNdXN0IHJlbW92ZSBhIHBvc3NpYmx5LWZpeGVkIGNoYW5uZWwtbWFzayBmaWVsZCBpZgorCSAgd2UncmUgZ29pbmcgdG8gc2V0IHVuZml4ZWQgY2hhbm5lbHMgb24gdGhlIHN0cnVjdHVyZSwKKwkgIG9yIGEgZGlmZmVyZW50IGNoYW5uZWwgY291bnQuCisKKzIwMTItMDctMDMgMTc6MjY6MjYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IE9ubHkgcHVzaCB0aGUgVE9DIGV2ZW50LCB0aGUgbWVzc2FnZSBpcyBoYW5kbGVkIGJ5IHRoZSBzaW5rcworCisyMDEyLTA3LTAzIDEyOjQ3OjU4ICswOTAwICBKYXZpZXIgSmFyZMOzbiA8amphcmRvbkBnbm9tZS5vcmc+CisKKwkqIHRlc3RzL2V4YW1wbGVzL2VxdWFsaXplci9kZW1vLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOgorCSogdGVzdHMvaWNsZXMvZ2RrcGl4YnVmc2luay10ZXN0LmM6CisJICB0ZXN0czogZG8gbm90IHVzZSBkZXByZWNhdGVkIGd0aysgc3ltYm9scworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3OTMwMQorCisyMDEyLTA3LTAzIDA5OjI3OjE3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IHJlcXVpcmUgR3RrKyAzLjAgZm9yIHRlc3RzL2V4YW1wbGVzCisKKzIwMTItMDctMDMgMTI6NTc6MTggKzA5MDAgIEphdmllciBKYXJkw7NuIDxqamFyZG9uQGdub21lLm9yZz4KKworCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJICBydHA6IHJlbW92ZSBzb21lIG91dGRhdGVkIGNvbW1lbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc5MzAxCisKKzIwMTItMDYtMjkgMTE6NTE6MzAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IGRlZmF1bHQgdG8gZm9yY2UtYXNwZWN0LXJhdGlvPXRydWUKKworMjAxMi0wNi0yOCAyMDowMzowNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2RlYnVndXRpbHMvcm5kYnVmZmVyc2l6ZS5jOgorCSAgcm5kYnVmZmVyc2l6ZTogYWRkIHB1c2ggbW9kZSBzdXBwb3J0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU2MzE3CisKKzIwMTItMDYtMjggMTE6Mjk6NTUgKzAyMDAgIERhdmlkIENvcnZveXNpZXIgPGRhdmlkLmNvcnZveXNpZXJAb3JhbmdlLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBpc29tcDQ6IFRyeSB0byBzZWVrIHVwc3RyZWFtIGJlZm9yZSBwcm9jZXNzaW5nIHNlZWsgcHVzaCBldmVudAorCSAgV2hlbiBpdCByZWNlaXZlcyBhIHNlZWsgaW4gcHVzaCBtb2RlLCB0aGUgcXRkZW11eCBzaG91bGQgZmlyc3QgdHJ5IHRvIHB1c2ggdGhlIGV2ZW50IHVwc3RyZWFtLCBhbmQgb25seSBpZiB1cHN0cmVhbSBmYWlscyBmYWxsIGJhY2sgdG8KKwkgIGl0cyBvd24gc2VlayBsb2dpYy4KKworMjAxMi0wNi0yOCAxMTo0NzoyMCArMDIwMCAgRGF2aWQgQ29ydm95c2llciA8ZGF2aWQuY29ydm95c2llckBvcmFuZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIGlzb21wNDogQWxsb3cgZHVyYXRpb24gcXVlcmllcyB0byBiZSBmb3J3YXJkZWQgdXBzdHJlYW0KKwkgIFdoZW4gcmVjZWl2aW5nIGEgZHVyYXRpb24gcXVlcnkgZm9yIFRJTUUgZm9ybWF0LCB0cnkgdG8gcXVlcnkgdXBzdHJlYW0sIGFuZCBvbmx5IGlmIHVwc3RyZWFtIGZhaWxzIGZhbGwgYmFjayB0byBxdGRlbXV4IGR1cmF0aW9uIGhhbmRsaW5nLgorCisyMDEyLTA2LTI4IDExOjU5OjExICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5oOgorCSAgcnRwaDI2NHBheTogY2xlYW51cHMKKwkgIFVzZSB0aGUgY2FwcyBwcm9wZXJ0aWVzIGZvciBhbGlnbm1lbnQgYW5kIGZvcm1hdC4KKwkgIFJlbW92ZSBzb21lIG9sZCBwcm9wZXJ0aWVzLCB3ZSBhbHdheXMgd2FudCB0byB1c2UgYnVmZmVybGlzdHMgd2hlbiB3ZSBjYW4gbm93LgorCisyMDEyLTA2LTI4IDExOjMyOjAzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIGgyNjRwYXk6IHByZWZlciBBVkMsIGl0J3MgZWFzaWVyIHRvIHBhcnNlIGV0YworCisyMDEyLTA2LTI3IDA5OjA5OjMyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJICBqcGVnZW5jOiBtYXJrIGFsbCBvdXRwdXQgZnJhbWVzIGFzIGtleWZyYW1lcworCisyMDEyLTA2LTI2IDE4OjQ4OjExICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYTogdXBkYXRlIGZvciBHc3RUb2MgQVBJIGFkZGl0aW9ucworCisyMDEyLTA2LTI2IDE3OjA0OjQxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thOiBzZXQgaW50ZXJsYWNlLW1vZGUKKworMjAxMi0wNi0yNiAxMzoxOTowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGltcHJvdmUgZGVidWcKKworMjAxMi0wNi0yNiAxMzowMjoxMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIFJldmVydCAidjRsMjogZnJlZSBrZXJuZWwgYnVmZmVycyBiZWZvcmUgYWxsb2NhdGluZyBuZXcgb25lcyIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgMWIwOWJjNjA5YTU3OGU3MzFmMGRiYzhmNmU2OThlMjVkOGY0YzVmOC4KKwkgIFNlZW1zIHRvIG1ha2UgbGlidjRsMiBjb21wbGFpbiwgbWF5YmUgYmVjYXVzZSB3ZSBjYWxsIFJFUUJVRlMgd2l0aCAwIGJ1ZmZlcnMKKwkgIGJlZm9yZSB3ZSBhbGxvY2F0ZWQgYnVmZmVycy4KKworMjAxMi0wNi0yNiAxMjowNzo0NyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGZyZWUga2VybmVsIGJ1ZmZlcnMgYmVmb3JlIGFsbG9jYXRpbmcgbmV3IG9uZXMKKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjcwMjU3CisKKzIwMTItMDYtMjYgMTI6MDc6MjkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IGltcHJvdmUgZGVidWcKKworMjAxMi0wNi0yNiAxMToxNDo1OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IHNldHVwIHN0cmlkZXMgYW5kIG9mZnNldHMgZm9yIGFsbCBwbGFuZXMKKworMjAxMi0wNi0yNSAyMDoxMTo1MyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2EtbXV4OiB1cGRhdGUgZm9yIEdzdFRvY1NldHRlciBjaGFuZ2VzCisKKzIwMTItMDYtMjUgMTM6MzE6MTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IFJldHVybiBGQUxTRSBmcm9tIHF1ZXJpZXMgaWYgd2UgY2FuJ3QgYW5zd2VyIFBPU0lUSU9OL0RVUkFUSU9OIHF1ZXJpZXMKKworMjAxMi0wNi0yMSAxNzoxNToxMSArMDMwMCAgQW50b24gQmVsa2EgPGFudG9uYmVsa2FAZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IFJldHVybiBGQUxTRSBmcm9tIFRPQyBxdWVyeSBpZiBubyBUT0MgZXhpc3RzIGluc3RlYWQgb2YgYW4gZW1wdHkgVE9DCisKKzIwMTItMDYtMjQgMjI6NTE6MTYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYTogdXBkYXRlIGZvciBHc3RUb2MgQVBJIGNoYW5nZXMKKworMjAxMi0wNi0yMyAxNDo1NzoyOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogdXBkYXRlIGZvciBnc3RfZWxlbWVudF9tYWtlX2Zyb21fdXJpKCkgY2hhbmdlcworCisyMDEyLTA2LTIwIDEyOjMxOjAxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9mbHZkZW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZmx2bXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDNkZW11eC5jOgorCSAgdXBkYXRlIGZvciBidXMgYXBpIGNoYW5nZXMKKworMjAxMi0wNi0yMCAxMDozMzo0MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG1vb3ZyZWNvdmVyLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHVwZGF0ZSBmb3IgdGFzayBhcGkgY2hhbmdlCisKKzIwMTItMDYtMjAgMDk6NTk6NDkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1hdWRpb3Rlc3QuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tb3Nzc3JjLmM6CisJICB1cGRhdGUgZm9yIGNsb2NrIGFwaSBjaGFuZ2VzCisKKzIwMTItMDYtMTkgMTI6MTU6MzMgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL01ha2VmaWxlLmFtOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeHJpbmdidWZmZXIuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hyaW5nYnVmZmVyLmg6CisJICBvc3hhdWRpb3Npbms6IHJlc3BlY3QgdGhlIHByZWZlcmVkIGNoYW5uZWwgbGF5b3V0CisJICBJbiBPU1ggaXMgYWxsb3dlZCB0byBjb25maWd1cmUgdGhlIGRlZmF1bHQgYXVkaW8gb3V0cHV0IGRldmljZSwKKwkgIHByZWZlcmVkIGNoYW5uZWwgbGF5b3V0IGFuZCBzcGVha2VyIHBvc2l0aW9ucyB0aHJvdWdoIHRoZSB0b29sCisJICAiQXVkaW8gTUlESSBTZXR1cCIuCisKKzIwMTItMDQtMzAgMjI6NTk6NTggKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2EtZGVtdXg6IFNlbmQgZ2FwIGV2ZW50cyBmb3Igc3VidGl0bGUgc3RyZWFtcworCisyMDEyLTA2LTE3IDAxOjAwOjQwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdGZpbGVzcmMuYzoKKwkgIHNwbGl0ZmlsZXNyYzogZml4IHVwIGRvY3MgZm9yIDAuMTEKKworMjAxMi0wNi0xNiAyMzoyOTo0MSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRmaWxlc3JjLmM6CisJICBzcGxpdGZpbGVzcmM6IHNtYWxsIHVyaSBoYW5kbGVyIGZpeHVwIGFuZCBzb21lIG1vcmUgZG9jcworCSAgR2V0IFVSSSBsb2NhdGlvbiB1c2luZyBnc3RfdXJpX2dldF9sb2NhdGlvbigpLCBzbyBhbnkKKwkgIGVzY2FwZWQgYml0cyBnZXQgdW5lc2NhcGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYwOTA0OQorCisyMDEyLTA2LTE3IDAwOjU5OjIxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdGZpbGVzcmMuYzoKKwkgIHNwbGl0ZmlsZXNyYzogcmUtcG9ydCB0byAwLjExCisKKzIwMTItMDYtMTYgMTk6MDY6MjUgKzAxMDAgIEJhc3RpZW4gTm9jZXJhIDxoYWRlc3NAaGFkZXNzLm5ldD4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdGZpbGVzcmMuYzoKKwkgIHNwbGl0ZmlsZXNyYzogSW1wbGVtZW50IHNwbGl0ZmlsZTovLyBVUkkgc2NoZW1lCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjA5MDQ5CisJICBDb25mbGljdHM6CisJICBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0ZmlsZXNyYy5jCisKKzIwMTItMDYtMTQgMTA6NDM6NTYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkgIHRoZW9yYWRlcGF5OiBmaXggYnVmZmVyIG1lbW9yeQorCSAgVGhlIG1lbW9yeSB3YXMgYWRkZWQgdG8gdGhlIGlucHV0IGJ1ZmZlciBpbnN0ZWFkIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgorCisyMDEyLTA2LTEzIDEzOjM2OjQ1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBEb24ndCByZXNldCB0aW1lIGluIGZsdXNoLXN0b3AKKwkgIERvbid0IHJlc2V0IHRoZSB0aW1lIGluIGZsdXNoLXN0b3AuIExpdmUgc291cmNlcyBjYW4gZG8gdGhpcyBmbHVzaCBpbiB0aGUKKwkgIHBsYXlpbmcgc3RhdGUgYW5kIHNvIHRoZSBwaXBlbGluZSB3aWxsIG5ldmVyIGhhdmUgYSBjaGFuY2UgdG8gdXBkYXRlIHRoZQorCSAgYmFzZV90aW1lIG9mIHRoZSBlbGVtZW50cywgd2hpY2ggb25seSBoYXBwZW5zIHdoZW4gZ29pbmcgZnJvbSBwYXVzZWQgdG8KKwkgIHBsYXlpbmcuCisKKzIwMTItMDYtMTIgMTI6NDI6MzEgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL01ha2VmaWxlLmFtOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeHJpbmdidWZmZXIuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hyaW5nYnVmZmVyLmg6CisJICBvc3hhdWRpb3Npbms6IEFkZCBzdXBwb3J0IGZvciBTUERJRiBvdXRwdXQKKwkgIEEgYmlnIHJlZmFjdG9yaW5nIHRvIGFsbG93IHBhc3N0aHJvdWdoIEFDMy9EVFMgb3ZlciBTUERJRi4KKwkgIFNldmVyYWwgcmFuZG9tIGNsZWFudXBzIGFuZCBtaW5vciBmaXhlcy4KKworMjAxMS0wOS0wMSAxNTo0MToyNiArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmg6CisJICBkZWludGVybGFjZTogc2VuZCBRb1MgbWVzc2FnZXMgd2hlbiBkcm9wcGluZyBhIGZyYW1lCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU3OTQxCisKKzIwMTItMDYtMTIgMTY6MDU6NDAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IFJld29yayB0aGUgYXN5bmMgc3RhdGUgaGFuZGxpbmcKKwkgIEFsd2F5cyBzZW5kIHRoZSBmbHVzaGluZyBldmVudHMgdG8gdGhlIHVkcCBlbGVtZW50cyBub3cgdGhhdCBiYXNlc3JjIHN1cHBvcnRzCisJICB0aGlzLiBUaGlzIG1ha2VzIHN1cmUgYSBzZWdtZW50IGV2ZW50IGlzIHNlbnQgY29ycmVjdGx5IGFmdGVyIGEgZmx1c2guCisJICBLZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGNvbW1hbmQgYW5kIG1ha2UgaXQgcG9zc2libGUgdG8gc3BlY2lmeQorCSAgd2hhdCBjb21tYW5kIHlvdSB3YW50IHRvIGNhbmNlbCB3aGVuIHN0YXJ0aW5nIGEgbmV3IGFzeW5jIGNvbW1hbmQuCisJICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NzkwNQorCisyMDEyLTA2LTExIDE4OjI0OjIwICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIGNoaWxkcHJveHk6IHVwZGF0ZSBhcGkgdXNlCisKKzIwMTItMDYtMTEgMTI6NTQ6MjcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGFsd2F5cyBwZXJmb3JtIGZ1bGwgc2VlayBpZiBzZWVrIGlzIGZsdXNoaW5nCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc3ODM4CisKKzIwMTItMDYtMTEgMTE6MjA6MTggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJICBybmRidWZmZXJzaXplOiBwcmludGYgZm9ybWF0IGZpeCBmb3IgbG9uZyAtPiBpbnQgY2hhbmdlCisKKzIwMTItMDYtMDggMjA6Mzg6MzQgKzAyMDAgIEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IERvbid0IHByb2JlIFVWQyBkZXZpY2VzIGZvciBiZWluZyBpbnRlcmxhY2VkCisJICBVVkMgZGV2aWNlcyBhcmUgbmV2ZXIgaW50ZXJsYWNlZCwgYW5kIGRvaW5nIFZJRElPQ19UUllfRk1UIG9uIHRoZW0KKwkgIGNhdXNlcyBleHBlbnNpdmUgYW5kIHNsb3cgVVNCIElPLCBzbyBkb24ndCBwcm9iZSB0aGVtIGZvciBpbnRlcmxhY2VkLgorCSAgVGhpcyBzaGF2ZXMgMiBzZWNvbmRzIG9mIHRoZSBzdGFydHVwIHRpbWUgb2YgY2hlZXNlIHdpdGggYSBMb2dpdGVjaAorCSAgV2ViY2FtIFBybyA5MDAwLgorCSAgU2lnbmVkLW9mZi1ieTogSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Nzc3MjIKKworMjAxMi0wNi0wOSAxNjo1Mzo1NCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYzoKKwkgIGRlYnVnOiBjaGFuZ2Ugcm5kYnVmZmVyc2l6ZSBwcm9wZXJ0aWVzIGZyb20gbG9uZyB0byBpbnQKKwkgIFRoZXNlIHNob3VsZCBhbGwgYmUgaW50IGluc3RlYWQgb2YgbG9uZywgdG8gYXZvaWQgYnVncworCSAgd2hlbiBwYXNzaW5nIHRoZXNlIGFzIHZhcmFyZ3Mgd2l0aCBnX29iamVjdF9zZXQoKSwgYW5kCisJICB0aGVyZSB3YXMgbm8gcmVhc29uIHRvIHVzZSBsb25nIGluIHRoZSBmaXJzdCBwbGFjZSBoZXJlLgorCSAgRml4ZXMgRklYTUUuCisKKzIwMTItMDYtMDggMTU6NTQ6NDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmM6CisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSogZ3N0L3J0c3AvZ3N0cnRwZGVjLmM6CisJICBlbGVtZW50czogVXNlIGdzdF9wYWRfc2V0X2NhcHMoKSBpbnN0ZWFkIG9mIG1hbnVhbCBldmVudCBmaWRkbGluZworCisyMDEyLTA2LTA4IDE1OjA0OjU5ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDAzYTBlNTcgdG8gOThlMzg2ZgorCisyMDEyLTA2LTA4IDEwOjExOjEyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5jOgorCSogc3lzL29zczQvb3NzNC1hdWRpby5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW50ZXJsZWF2ZS5jOgorCSAgdXBkYXRlIGZvciBhdWRpbyBhcGkgY2hhbmdlCisKKzIwMTItMDYtMDcgMTY6MTI6MzQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisKKz09PSByZWxlYXNlIDAuMTEuOTIgPT09CisKKzIwMTItMDYtMDcgMTY6MTI6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5zaWduYWxzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAwLjExLjkyCisKKzIwMTItMDYtMDcgMTY6MTE6MTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxMi0wNi0wNyAxNTowMzowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogaW1wcm92ZSBjbG9jayBoYW5kbGluZworCSAgUG9zdCB0aGUgbm90aWZ5IG91dHNpZGUgb2YgdGhlIHBhX2xvY2sgdG8gYXZvaWQgYSBkZWFkbG9jayBjYXVzZWQgYnkgYmFzZXNyYworCSAgY2FsbGluZyBnZXRfdGltZSB3aXRoIHRoZSBvYmplY3QgbG9jay4KKwkgIFJlc2V0IHRoZSBjbG9jayBvbiBjb25uZWN0LgorCSAgUG9zdCBjbG9jay1sb3N0IGFuZCBjbG9jay1wcm92aWRlIG1lc3NhZ2VzLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3Mzk3NworCSAgQ29uZmxpY3RzOgorCSAgZXh0L3B1bHNlL3B1bHNlc3JjLmMKKworMjAxMi0wNC0xMiAxMzoyMToxNyArMDMwMCAgTW9oYW1tZWQgU2FtZWVyIDxtc2FtZWVyQGZvb2xhYi5vcmc+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgQmV0dGVyIEdzdENsb2NrIGZvciBwdWxzZXNyYworCSAgVGhpcyBjbG9jayB1c2VzIHRoZSBhY3R1YWwgc3RyZWFtIHRpbWUgKHBhX3N0cmVhbV9nZXRfdGltZSkgdG8gZ2V0IGEgbW9yZSBhY2N1cmF0ZSB0aW1lc3RhbXAuCisJICBDb25mbGljdHM6CisJICBleHQvcHVsc2UvcHVsc2VzcmMuYworCisyMDEyLTA2LTA3IDExOjE2OjUwICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJICBwbmc6IGZpeCB2aWRlbyBzdGF0ZSBsZWFrcworCisyMDEyLTA2LTA3IDExOjE2OjM3ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogZml4IHZpZGVvIHN0YXRlIGxlYWsKKworMjAxMi0wNi0wNyAxMjoxMToxNCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogb25seSByZXNldCB0aGUgbWFuYWdlciBvYmplY3Qgd2hlbiB3ZSBkaWQgYSBzZWVrCisJICBPbmx5IHJlc2V0IHRoZSBtYW5hZ2VyIG9iamVjdCB3aGVuIHdlIHVzZWQgYSBSYW5nZSBoZWFkZXIsIGllLiB3aGVuIHdlIGRpZCBhCisJICBzZWVrLiBPdGhlcndpc2Ugd2UganVzdCBwYXVzZWQgYW5kIHdlIGNhbiByZXN1bWUganVzdCBmaW5lLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NzQ3NQorCisyMDEyLTA2LTA2IDE2OjEzOjI5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW4uYzoKKwkgIHRlc3RzOiBhZGQgdGVzdCBmb3IgcnRwc2Vzc2lvbiBjbGVhbnVwCisKKzIwMTItMDYtMDYgMTg6MTg6NDEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMWZhYjM1OSB0byAwM2EwZTU3CisKKzIwMTItMDYtMDYgMTQ6MTc6MDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IFVwZGF0ZSBmb3IgVE9DIGV2ZW50IEFQSSBjaGFuZ2UKKworMjAxMi0wNi0wNiAxMzowMjoxMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmlzdWJ0aXRsZS5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0dGFnaW5qZWN0LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJnYW5hbHlzaXMuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmd2b2x1bWUuYzoKKwkgIHVwZGF0ZSBmb3IgdGFnIGV2ZW50IGNoYW5nZQorCisyMDEyLTA2LTA2IDEzOjAwOjU4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9jcm9wL2dzdGFzcGVjdHJhdGlvY3JvcC5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FzcGVjdHJhdGlvY3JvcC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6CisJICBmaXggWTgwMCBmb3JtYXQKKworMjAxMi0wNi0wMSAwMToxOTozNSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cuaDoKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvOiBzdHJhaWdodGZvcndhcmQgcG9ydCB0byAwLjExCisKKzIwMTItMDUtMzEgMTg6Mzk6MjUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzoKKwkgIFNvbWUgcHJpbnRmIHZhcmlhYmxlIGZvcm1hdCBmaXhlcworCSAgVGhlIG9zeCBjb21waWxlciBjb21wbGFpbnMgYWJvdXQgdGhvc2UKKworMjAxMi0wNi0wNSAwOToxODoxMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgYXVkaW9wYXJzZXJzOiBGaXggR3N0QmFzZVBhcnNlOjpnZXRfc2lua19jYXBzKCkgaW1wbGVtZW50YXRpb25zCisJICBUaGV5IHNob3VsZCB0YWtlIHRoZSBmaWx0ZXIgY2FwcyBpbnRvIGFjY291bnQgYW5kIGFsd2F5cyByZXR1cm4KKwkgIHRoZSB0ZW1wbGF0ZSBjYXBzIGFwcGVuZGVkIHRvIHRoZSBhY3R1YWwgY2Fwcy4gT3RoZXJ3aXNlIHRoZQorCSAgcGFyc2VycyBzdG9wIHRvIGFjY2VwdCB1bnBhcnNlZCBzdHJlYW1zIHdoZXJlIHVwc3RyZWFtIGRvZXMgbm90CisJICBrbm93IGFib3V0IGNoYW5uZWxzLCByYXRlLCBldGMuCisJICBGaXhlcyBidWcgIzY3NzQwMS4KKworMjAxMi0wNi0wNCAxNjoxNzo1MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogc2V0IGNvbG9yaW1ldHJ5IG9uIG91dHB1dCBpbmZvCisKKzIwMTItMDYtMDQgMDg6MTA6MTUgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeHJpbmdidWZmZXIuYzoKKwkgIG9zeGF1ZGlvc2luazogSGFuZGxlIGVuZGlhbm5lc3MgY29ycmVjdGx5CisKKzIwMTItMDYtMDEgMTY6Mzc6MDAgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeHJpbmdidWZmZXIuYzoKKwkgIG9zeGF1ZGlvc2luazogQWRkIHN1cHBvcnQgZm9yIGludCBhdWRpbworCisyMDEyLTA2LTAxIDEwOjI4OjUzICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGYxYjVhOTYgdG8gMWZhYjM1OQorCisyMDEyLTA1LTMxIDEzOjM2OjMyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHNldCB0aGUgcGFsZXR0ZSBzaXplIGNvcnJlY3RseQorCisyMDEyLTA1LTMxIDEwOjE1OjQzICswMjAwICBNaWNoYWVsIEpvbmVzIDxtaWNoYWVsLmpvbmVzQG1hdHJpeC12aXNpb24uZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRvcmllbnQuaDoKKwkgIHY0bDI6IGFkZCBtaXNzaW5nIEdfRU5EX0RFQ0xTCisJICBHX0JFR0lOX0RFQ0xTIGRpZG4ndCBoYXZlIG1hdGNoaW5nIEdfRU5EX0RFQ0xTCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc3MTY1CisKKzIwMTItMDUtMzEgMTM6MDg6MTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gOTJiNzI2NiB0byBmMWI1YTk2CisKKzIwMTItMDUtMzEgMTA6MjY6MjcgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSAgb3N4dmlkZW9zaW5rOiBSZWFsbHkgZml4IHRoZSBidWlsZCBvbiAxMC41CisJICBUaGUgQVBJIHRoYXQgd2UgdXNlIHRvIHJ1biB0aGUgQ29jb2EgbG9vcCBpbiBhbm90aGVyCisJICB0aHJlYWQgZG9lcyBub3QgZXhpc3QgaW4gMTAuNSBvciBlYXJsaWVyLgorCisyMDEyLTA1LTI2IDEyOjIxOjE4ICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kZWNpbmFAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IGZpeCByYWNlIGluIHN0YXJ0aW5nIHRoZSBydW5sb29wIHRocmVhZAorCSAgQmxvY2sgZ3N0X29zeF92aWRlb19zaW5rX3J1bl9jb2NvYV9sb29wIHVudGlsIHRoZSBsb29wIHRocmVhZCBoYXMgc3RhcnRlZCBhbmQKKwkgIGZpbmlzaGVkIGluaXRpYWxpemluZyBOU0FwcC4gRml4ZXMgb2NjYXNpb25hbCB3YXJuaW5ncy9jcmFzaGVzIGR1ZSB0byB0d28KKwkgIHRocmVhZHMgZ29pbmcgaW5zaWRlIE5TQXBwIGJlZm9yZSBmaW5pc2hMYXVuY2hpbmcgaGFkIGNvbXBsZXRlZC4KKworMjAxMi0wNS0zMCAxNjowMzo1NSArMDIwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJICBvc3h2aWRlb3Npbms6IEZpeCBsYXN0IGNvbW1pdCB0byBhY3R1YWxseSB3b3JrCisJICBNQUNfT1NfWF9WRVJTSU9OXzEwXzYgaXMgb2J2aW91c2x5IG5vdCBkZWZpbmVkIG9uIDEwLjUuCisKKzIwMTItMDUtMzAgMTM6NTE6MzUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvb3N4dmlkZW8vTWFrZWZpbGUuYW06CisJICBvc3h2aWRlb3Npbms6IFB1dCB0aGUgcmlnaHQgZmxhZ3MgaW4gdGhlIHJpZ2h0IHZhcmlhYmxlCisKKzIwMTItMDUtMzAgMTM6MjQ6MDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IEZpeCBHU1RfT0JKQ0ZMQUdTCisKKzIwMTItMDUtMzAgMTI6NDU6MjMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZWMxYzRhOCB0byA5MmI3MjY2CisKKzIwMTItMDUtMzAgMTI6NDM6MzcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJICBvc3h2aWRlb3Npbms6IE5TV2luZG93RGVsZWdhdGUgaXMgYXZhaWxhYmxlIGluIGFsbCBPU1ggdmVyc2lvbnMgbmV3ZXIgdGhhbiAxMC42CisKKzIwMTItMDUtMzAgMTI6NDA6NTcgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSAgb3N4dmlkZW9zaW5rOiBGaXggYnVpbGQgd2l0aCBvbGRlciBPU1ggdmVyc2lvbnMKKworMjAxMi0wNS0zMCAxMTowOToyNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHN5cy9vc3h2aWRlby9NYWtlZmlsZS5hbToKKwkgIGNvbmZpZ3VyZTogQWRkIE9CSkMgc3BlY2lmaWMgY29tcGlsZXIgZmxhZ3MKKwkgIFNlZSBidWcgIzY0MzkzOS4KKworMjAxMi0wNS0zMCAxMToyMzozNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSAzNDI5YmE2IHRvIGVjMWM0YTgKKworMjAxMi0wNS0yOSAxNzo1MDoyMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzoKKwkgIHZpZGVvOiByZW1vdmUgZHVwbGljYXRlIGZvcm1hdAorCisyMDEyLTA1LTI5IDE2OjUyOjAyICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IFBvc3QgZXJyb3IgbWVzc2FnZSBpZiBFT1MgYmVmb3JlIHBhZHMgd2VyZSBjcmVhdGVkCisJICBIYXBwZW5zIHdpdGggc29tZSBmaWxlcyB3aXRoIG9ubHkgaGVhZGVycworCisyMDEyLTA1LTI4IDE1OjIyOjI2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmg6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuaDoKKwkgIHBuZzogUG9ydCB0byAwLjExIGFnYWluCisKKzIwMTItMDUtMTQgMTI6NDY6NTcgKzAyMDAgIEplbnMgR2VvcmcgPG1haWxAamVuc2dlLm9yZz4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXA6IERyb3AgdHJhbnNmZXJNb2RlLmRsbmEub3JnIGhlYWRlcgorCSAgTGVhdmUgaXQgdG8gdGhlIGFwcGxpY2F0aW9uIHRvIGRlY2lkZSBvbiB0aGUgaGVhZGVyLiBObyBoZWFkZXIgYXQgYWxsCisJICBpcyBiZXR0ZXIgdGhhbiBoYXZpbmcgdGhlIHdyb25nIGhlYWRlciBhcyBETE5BIG1hbmRhdGVzIHRoYXQgYSBtaXNzaW5nCisJICBoZWFkZXIgaGFzIHRvIGJlIHRvbGVyYXRlZCB3aGlsZSBhIHdyb25nIGhlYWRlciBpcyBhbiBlcnJvci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NzYwMjAKKworMjAxMi0wNC0wNyAwOTo1MjowOSArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5oOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmg6CisJICBwbmc6IFBvcnQgdG8gYmFzZSB2aWRlbyBjbGFzc2VzCisJICBDb25mbGljdHM6CisJICBleHQvbGlicG5nL2dzdHBuZ2RlYy5jCisJICBleHQvbGlicG5nL2dzdHBuZ2RlYy5oCisJICBleHQvbGlicG5nL2dzdHBuZ2VuYy5jCisJICBleHQvbGlicG5nL2dzdHBuZ2VuYy5oCisJICBSZXZlcnRlZCB0byAwLjEwLCBuZWVkcyB0byBiZSBwb3J0ZWQgYWdhaW4uCisKKzIwMTItMDUtMjcgMDA6MDI6MDggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBmbHYsIG1hdHJvc2thOiBkb24ndCB1c2UgR3N0U3RydWN0dXJlIEFQSSBvbiB0YWcgbGlzdHMKKworMjAxMi0wNS0yNiAxMTo1NzoxNiArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJICBydHBtcDJ0ZGVwYXk6IE9ubHkgb3V0cHV0IGludGVncmFsIG1wZWctdHMgcGFja2V0cworCSAgRnJvbSBSRkMgMjI1MAorCSAgMi4gRW5jYXBzdWxhdGlvbiBvZiBNUEVHIFN5c3RlbSBhbmQgVHJhbnNwb3J0IFN0cmVhbXMKKwkgIC4uLgorCSAgRm9yIE1QRUcyIFRyYW5zcG9ydCBTdHJlYW1zIHRoZSBSVFAgcGF5bG9hZCB3aWxsIGNvbnRhaW4gYW4gaW50ZWdyYWwKKwkgIG51bWJlciBvZiBNUEVHIHRyYW5zcG9ydCBwYWNrZXRzLiAgVG8gYXZvaWQgZW5kIHN5c3RlbQorCSAgaW5lZmZpY2llbmNpZXMsIGRhdGEgZnJvbSBtdWx0aXBsZSBzbWFsbCBNVFMgcGFja2V0cyAobm9ybWFsbHkgZml4ZWQKKwkgIGluIHNpemUgYXQgMTg4IGJ5dGVzKSBhcmUgYWdncmVnYXRlZCBpbnRvIGEgc2luZ2xlIFJUUCBwYWNrZXQuICBUaGUKKwkgIG51bWJlciBvZiB0cmFuc3BvcnQgcGFja2V0cyBjb250YWluZWQgaXMgY29tcHV0ZWQgYnkgZGl2aWRpbmcgUlRQCisJICBwYXlsb2FkIGxlbmd0aCBieSB0aGUgbGVuZ3RoIG9mIGFuIE1UUyBwYWNrZXQgKDE4OCkuCisJICAuLi4uCisJICBTaW5jZSBpdCBuZWVkcyB0byBjb250YWluICJhbiBpbnRlZ3JhbCBudW1iZXIgb2YgTVBFRyB0cmFuc3BvcnQgcGFja2V0cyIsIGEKKwkgIHNpbXBsZSBmaXggaXMgdG8gY2hlY2sgdGhhdCdzIHRoZSBjYXNlLCBhbmQgc3RyaXAgb2ZmIGFueSBsZWZ0b3ZlciBkYXRhLgorCSAgRml4ZXMgIzY3Njc5OQorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuYworCisyMDEyLTA1LTI0IDIwOjQzOjE2ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cuaDoKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5tOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiBtYWtlIHN1cmUgYWxsIHNlbGVjdG9ycyBhcmUgcGVyZm9ybWVkIG9uIHRoZSBzYW1lIHRocmVhZAorCSAgV2hlbiB3ZSBhcmUgdXNpbmcgYSBkZWRpY2F0ZWQgdGhyZWFkIHRvIHJ1biB0aGUgbWFpbiBydW4gbG9vcCB3ZQorCSAgbXVzdCBtYWtlIHN1cmUgdGhhdCBhbGwgc2VsZWN0b3JzIGFyZSBwZXJmb3JtZWQgb24gdGhpcyBzYW1lIHRocmVhZC4KKwkgIEZvciBpbnN0YW5jZSBpZiBwZXJmb3JtU2VsZWN0b3JPbk1haW5UaHJlYWQgaXMgY2FsbGVkIGZyb20gdGhlIHJlYWwKKwkgIG1haW4gdGhyZWFkLCBpdCB3aWxsIG5vdCBnbyB0aHJvdWdoIHRoZSBtZXNzYWdlIHF1ZXVlIGFuZCB3aWxsIGJlCisJICBleGVjdXRlZCBmcm9tIHRoZSByZWFsIG1haW4gdGhyZWFkLiBCeSBmb3JjaW5nIHRoZSB0YXJnZXQgdGhyZWFkLAorCSAgd2UgZW5zdXJlIHRoYXQgYWxsIGZ1bmN0aW9ucyB3aWxsIGJlIGNhbGxlZCBlaXRoZXIgZnJvbSB0aGUgcmVhbAorCSAgbWFpbiB0aHJlYWQgd2hlbiB0aGUgbWFpbiBydW4gbG9vcCBpcyBydW5uaW5nIG9yIGZyb20gb3VyIHRocmVhZAorCSAgc3Bpbm5pbmcgdGhlIG1haW4gbG9vcC4KKworMjAxMi0wNS0yNCAxNjowOTo1NCArMDIwMCAgTWF0aGlhcyBIYXNzZWxtYW5uIDxtYXRoaWFzLmhhc3NlbG1hbm4gYXQgZ214LmRlPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiByZW1vdmUgZnJhbWVyYXRlCisJICBUaGUganBlZyBkZWNvZGVyIGRvZXNuJ3QgbmVlZC9jYXJlIGFib3V0IHRoZSBmcmFtZXJhdGUgdG8gc28gaXQgc2hvdWxkCisJICBub3QgYmUgaW4gdGhlIGNhcHMuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc2MzAyCisKKzIwMTItMDUtMjQgMTM6MDg6MzUgKzAyMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRlY2luYUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogc3RhcnQgdGhlIGxvb3AgYmVmb3JlIGNhbGxpbmcgW2dzdHZpZXcgaGF2ZVN1cGVydmlld10KKwkgIC4uLmFzIGhhdmVTdXBlcnZpZXcgcmVxdWlyZXMgdGhlIG1haW5sb29wIHRvIGJlIHJ1bm5pbmcKKworMjAxMi0wNS0yNCAxMzowODoxMyArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZGVjaW5hQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiBmaXggaW5kZW50YXRpb24KKworMjAxMi0wNS0yMiAxNjo0NzozNiArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZGVjaW5hQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zeHZpZGVvL01ha2VmaWxlLmFtOgorCSAgb3N4dmlkZW9zaW5rOiBlbmFibGUgcnVubmluZyB0aGUgY29jb2EgbWFpbiBydW5sb29wIGluIGEgdGhyZWFkCisKKzIwMTItMDUtMjIgMTY6NDU6MjggKzAyMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRlY2luYUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogYWRkIGNvZGUgdG8gb3B0aW9uYWxseSBydW4gdGhlIGNvY29hIG1haW4gcnVubG9vcCBpbiBhIHNlcGFyYXRlIHRocmVhZAorCSAgQWRkIGEgbGl0dGxlIGhhY2sgdG8gcnVuIHRoZSBjb2NvYSBtYWluIHJ1bmxvb3AgZnJvbSBhIHNlcGFyYXRlIHRocmVhZCBfd2hlbl8KKwkgIHRoZSBtYWluIHJ1bmxvb3AgaXMgbm90IGJlaW5nIHJ1biAod2hpY2ggbWVhbnMgdGhhdCB0aGUgYXBwIGRvZXNuJ3QgdXNlIGNvY29hKS4KKwkgIFJ1bmxvb3BzIGFyZSB0aHJlYWQgc3BlY2lmaWMsIHNvIHRoZSBoYWNrIGJvaWxzIGRvd24gdG8gZ2V0dGluZyB0aGUgcnVubG9vcCBmb3IKKwkgIHRoZSBtYWluIHRocmVhZCBhbmQgc2V0dGluZyBpdCBhcyB0aGUgcnVubG9vcCBmb3Igb3VyIGRlZGljYXRlZCB0aHJlYWQuCisKKzIwMTItMDUtMjIgMTY6MzI6NTMgKzAyMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRlY2luYUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogcmVzZXQgYXBwX3N0YXJ0ZWQgdG8gRkFMU0Ugd2hlbiBzaHV0dGluZyBkb3duCisKKzIwMTItMDUtMjIgMTQ6NDk6MTcgKzAyMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRlY2luYUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogcmVuYW1lIGNvY29hIHJ1bmxvb3AgaGVscGVyIGZ1bmNzCisKKzIwMTItMDUtMjIgMTQ6MjY6MTMgKzAyMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRlY2luYUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogZG9uJ3QgY3JlYXRlIGFwcGxpY2F0aW9uIG1lbnVzCisKKzIwMTItMDUtMTYgMjE6NTI6NDUgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogcmVzZXQgdGhlIGVtYmVkIHByb3BlcnR5IGZvciBiYWNrd2FyZCBjb21wYXRpbGliaXR5CisKKzIwMTItMDUtMTYgMjE6MTI6MjIgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5oOgorCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IGZpeCBuYXZpZ2F0aW9uIHdoZW4gZm9yY2UtYXNwZWN0LXJhdGlvIGlzIGFjdGl2YXRlZAorCisyMDEyLTA1LTE2IDE4OjUyOjQ1ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cuaDoKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5tOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiBhZGQgZm9yY2UtYXNwZWN0LXJhdGlvIHByb3BlcnR5CisKKzIwMTItMDUtMTQgMTg6MDE6MDIgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5oOgorCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IHN0YXJ0IGludGVybmFsIHdpbmRvdyBpZiBubyB2aWV3IGlzIHByb3ZpZGVkCisKKzIwMTItMDUtMTQgMTQ6Mjc6NTggKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5oOgorCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IGltcGxlbWVudCB0aGUgbmF2aWdhdGlvbiBpbnRlcmZhY2UKKworMjAxMi0wNS0xMSAxODoyNDowOCArMDIwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N2aWRlb3Npbms6IGNyZWF0ZSwgZGVzdHJveSwgcmVzaXplIGFuZCBkcmF3IGZyb20gdGhlIG1haW4gdGhyZWFkCisKKzIwMTItMDQtMTkgMDg6Mzc6MjggKzAyMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRAZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGluY3JlYXNlIE5FV1NFR01FTlQgYWNjdXJhY3kgYWZ0ZXIgc2Vla2luZworCSAgZGVtdXgtPmNvbW1vbi5zZWdtZW50IGlzIHBvcHVsYXRlZCBkdXJpbmcgc2VlayBoYW5kbGluZyB3aXRoIHRoZSB0YXJnZXQKKwkgIHN0YXJ0L3N0b3AgcG9zaXRpb25zLiBEb24ndCBvdmVycmlkZSB0aGVtIHdoZW4gc2VuZGluZyBvdXQgYSBORVdTRUdNRU5ULgorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmMKKworMjAxMi0wNC0xOSAwODozMTowMCArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZEBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogZG9uJ3QgZGlzY2FyZCB0aGUgaW5jb21pbmcgc2VlayBzZWdtZW50IG9uIHB1c2ggYmFzZWQgc2Vla2luZworCSAgVGhlIGluY29taW5nIHNlZWsgc2VnbWVudCB3YXMgYmVpbmcgZGlzY2FyZGVkIGxlYWRpbmcgdG8gcHVzaCBiYXNlZCBzZWVraW5nCisJICBiZWluZyBwb3RlbnRpYWxseSBpbmFjY3VyYXRlLgorCisyMDEyLTA1LTIzIDE4OjEyOjI0ICswMjAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJybkBheGlzLmNvbT4KKworCSogY29tbW9uOgorCSAgY29tbW9uOiBVcGRhdGUgc28gdGhlIHBsdWdpbiBzY2FubmVyIGNoYW5nZXMgYXJlIGluY2x1ZGVkCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc2Njc0CisKKzIwMTItMDUtMjMgMTg6MDc6MzUgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJuQGF4aXMuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IHN1cHByZXNzIHNvbWUgd2FybmluZ3Mgd2hlbiBkZWJ1ZyBpcyBkaXNhYmxlZAorCSAgV2FybmluZ3MgYWJvdXQgdW51c2VkIHZhcmlhYmxlcyBzaG91bGQgYmUgc3VwcHJlc3NlZCBpZiBjb3JlIGhhcyB0aGUKKwkgIGRlYnVnIHN5c3RlbSBkaXNhYmxlZC4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NzY2NzEKKworMjAxMi0wNS0yNCAwOToyOToyNSArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc0BkZWJldGhlbmNvdXJ0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHA6IGZpeCBidWlsZCBpc3N1ZSBpbiBnc3RydHBoMjY0cGF5LmMKKworMjAxMi0wNS0yMSAxMjoxNzozNSArMDIwMCAgSm9uYXMgSG9sbWJlcmcgPGpvbmFzaGdAYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwaDI2NHBheTogQWRkIHVucmVzdHJpY3RlZCBjYXBzCisJICBJZiB0aGVyZSBhcmUgbm8gcHJvZmlsZSByZXN0cmljdGlvbnMgZG93bnN0cmVhbSwgcmV0dXJuIGNhcHMgd2l0aAorCSAgcHJvZmlsZT1jb25zdHJhaW5lZC1iYXNlbGluZSBpbiB0aGUgZmlyc3Qgc3RydWN0dXJlIGFuZCBhcHBlbmQKKwkgIHVucmVzdHJpY3RlZCBjYXBzIGFzIHRoZSBsYXN0IHN0cnVjdHVyZS4KKwkgIEZpeGVzIGJ1ZyAjNjcyMDE5CisKKzIwMTItMDUtMjQgMDk6NTc6MzEgKzAyMDAgIE1hcmlhIEdpb3Zhbm5hIENoaW9zc2EgPG1hcmlhZ2lvdmFubmEuY2hpb3NzYSBhdCBzZWxleGVsc2FnLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcDogYWRkIHRoZSBTY2FsZSBoZWFkZXIgd2hlbiBuZWVkZWQKKwkgIFNldHRpbmcgR1NUX1NFRUtfRkxBR19TS0lQIHdoZW4gc2VuZGluZyBhIHNlZWsgZXZlbnQgaW4gcnRzcHNyYyBzaG91bGQKKwkgIHNldCB0aGUgIlNjYWxlIiBmaWVsZCBpbiB0aGUgcnRzcCBQTEFZIGhlYWRlci4KKwkgIEJlY2F1c2UgdGhlIGJvb2xlYW4gInNyYy0+c2tpcCIgaXMgc2V0IGFmdGVyIHRoZSBjYWxsLCAiU3BlZWQiIGluc3RlYWQKKwkgIG9mICJTY2FsZSIgaXMgYWx3YXlzIHNldC4gTW92ZSB0aGUgYXNzaWdubWVudCBiZWZvcmUgaXNzdWluZyB0aGUgX3BsYXkKKwkgIHJlcXVlc3QuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc2NjE4CisKKzIwMTItMDUtMTcgMTY6MjM6NTkgKzAzMDAgIFNyZWVyZW5qIEJhbGFjaGFuZHJhbiA8c3JlZXJlbmouYmFsYWNoYW5kcmFuQGludGVsLmNvbT4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogRml4IHRoZSBzYW1wbGUgcGlwZWxpbmUuCisKKzIwMTItMDUtMjIgMTI6MzU6MDQgKzA0MDAgIEFudG9uIE5vdmlrb3YgPHJhbmRvbS5wbGFudEBnbWFpbC5jb20+CisKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSAgaWN5ZGVtdXg6IHdhcm5pbmcgaWYgc2V0dGluZyBzcmNwYWQgY2FwcyBmYWlscworCisyMDEyLTA1LTIyIDEyOjM1OjI5ICswNDAwICBBbnRvbiBOb3Zpa292IDxyYW5kb20ucGxhbnRAZ21haWwuY29tPgorCisJKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzoKKwkgIGljeWRlbXV4OiBhY3RpdmF0ZSBzcmNwYWQgYmVmb3JlIHNldHRpbmcgY2FwcworCSAgQmVmb3JlIGdzdF9wYWRfc2V0X2FjdGl2ZSgpIGlzIGNhbGxlZCwgdGhlIHBhZCBoYXMKKwkgIEZMVVNISU5HIGZsYWcgc2V0LCBzbyBzZXR0aW5nIHRoZSBjYXBzIGZhaWxzCisKKzIwMTItMDUtMjIgMTM6NDY6MjcgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNAZGViZXRoZW5jb3VydC5jb20+CisKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkqIGV4dC9saWJtbmcvTWFrZWZpbGUuYW06CisJKiBleHQvbGlibW5nL2dzdG1uZy5jOgorCSogZXh0L2xpYm1uZy9nc3RtbmcuaDoKKwkqIGV4dC9saWJtbmcvZ3N0bW5nZGVjLmM6CisJKiBleHQvbGlibW5nL2dzdG1uZ2RlYy5oOgorCSogZXh0L2xpYm1uZy9nc3RtbmdlbmMuYzoKKwkqIGV4dC9saWJtbmcvZ3N0bW5nZW5jLmg6CisJICBtbmc6IHJlbW92ZSBleHQvbGlibW5nCisJICBQb3J0IHRvIDAuMTAgd2FzIG5ldmVyIGZpbmlzaGVkLgorCSAgSW50ZXJlc3Qgd2FzIGxvc3QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzI0MzY0CisKKzIwMTItMDUtMTggMTY6Mzc6MDQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogZml4IGFzc2VydGlvbiB3aGVuIGhhbmRsaW5nIGEgZGF0ZSB0YWcgYXMgYSBzdHJpbmcKKwkgIERhdGUgdGFncyBhcmUgR0RhdGUsIG5vdCBzdHJpbmdzLiBBZGQgYSBzcGVjaWFsIGNhc2UgdG8gY29udmVydAorCSAgaXQgdG8gdGhlIGV4aWYgZGF0ZSBmb3JtYXQgcmVwcmVzZW50YXRpb24gaW4gc3RyaW5nIHRvIGF2b2lkCisJICB0aGUgYXNzZXJ0aW9uCisKKzIwMTItMDUtMjEgMTE6NDc6MDcgKzAyMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogTGlzdGVuIHRvIHNvdXJjZSBvdXRwdXQgZXZlbnRzLCBub3Qgc2luayBpbnB1dAorCisyMDEyLTA1LTE4IDEyOjUzOjQ0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5LmM6CisJICBydHBtcDJ0cGF5OiByZXNwZWN0IG10dSBhbmQgcGFja2V0IGJvdW5kYXJpZXMKKwkgIFNlZSAjNjU5OTE1LgorCisyMDEyLTA1LTE4IDExOjEwOjQ2ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZzogUmVtb3ZlIGRlYWQgY29kZQorCSAgQ29uZmxpY3RzOgorCSAgZXh0L2pwZWcvZ3N0anBlZ2RlYy5jCisKKzIwMTItMDUtMTggMTE6MDU6MzUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBGaXggY29tcGlsYXRpb24KKworMjAxMi0wNS0xOCAxMTowMjo1MiArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IFdoZW4gZHJvcHBpbmcgZnJhbWVzIG9uIEVPUywgZmx1c2ggb3V0IGRhdGEKKwkgIENsZWFuZXIgd2F5IG9mIGhhbmRsaW5nIHN0cmF5IGRhdGEKKworMjAxMi0wNS0xNyAwOTozNDowMyArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkgIGpwZWdkZWM6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKwkgIENvbmZsaWN0czoKKwkgIGV4dC9qcGVnL2dzdGpwZWdkZWMuYworCisyMDEyLTA1LTE3IDA5OjMzOjE4ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogT25seSBwYXJzZSBmb3IgU09JIHdoZW4gd2UgZGlkbid0IHNlZSBpdCBiZWZvcmUKKworMjAxMi0wNS0xNyAwOTozMTo0MSArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IFJlbWVtYmVyIGlmIHdlIHNhdyBTT0kgYW5kIGhhbmRsZSBzdHJheSBkYXRhIG9uIEVPUworCisyMDEyLTA1LTE1IDIwOjU4OjI1ICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkgIHJ0cGpwZWdwYXk6IEFsbG93IFUgYW5kIFYgY29tcG9uZW50cyB0byB1c2UgZGlmZmVyZW50IHF1YW50IHRhYmxlcyBpZiB0aGV5IGNvbnRhaW4gdGhlIHNhbWUgZGF0YQorCSAgVGhpcyBhbGxvd3Mgc29tZSBjYW1lcmFzIChMb2dpdGVjaCBDOTIwKSB0aGF0IHNwZWNpZnkgZGlmZmVyZW50IHF1YW50CisJICB0YWJsZXMgYnV0IGJvdGggd2l0aCB0aGUgc2FtZSBkYXRhLCB0byB3b3JrLgorCSAgQnVnIHJlcG9ydGVkIGJ5IFJvYmVydCBLcmFrb3JhCisKKzIwMTItMDUtMTQgMTU6NTE6MjkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IGZpeCBwb3NzaWJsZSBkYXRhIGNvcnJ1cHRpb24gYWZ0ZXIgc2Vla2luZworCSAgQ29uc2lkZXIgYSBkb3duc3RyZWFtIGVsZW1lbnQgdGhhdCBtYXkgaXNzdWUgc2Vla3MgaW4gdmVyeSBzaG9ydAorCSAgc3VjY2Vzc2lvbiAoZS5nLiBxdWV1ZTIpLCBkZXBlbmRpbmcgb24gdGhlIGFjY2VzcyBwYXR0ZXJuIG9mCisJICB0aGUgZG93bnN0cmVhbSBlbGVtZW50IChlLmcuIHF0ZGVtdXggd2l0aCBhdWRpby92aWRlbyBjaHVua3MKKwkgIGludGVybGVhdmVkIHNvIHRoYXQgdGhlcmUncyBhbHdheXMgYSBzaXplYWJsZSBnYXAgYmV0d2VlbiB0aGUKKwkgIGN1cnJlbnQgY2h1bmtzIGZvciBlYWNoIHN0cmVhbSkuIEluIHRoaXMgY2FzZSwgcXVldWUyIHdpbGwgbWFpbnRhaW4KKwkgIHR3byByYW5nZXMsIGFuZCBldmVuIHdoZW4gaXQgc2VydmVzIGEgY2h1bmsgZnJvbSBtZW1vcnksIGl0IHdpbGwKKwkgIHN3aXRjaCByYW5nZXMgYW5kIG1ha2Ugc291cGh0dHBzcmMgc2VlayB0byB0aGUgZW5kIG9mIHRoZSBhdmFpbGFibGUKKwkgIGRhdGEgZm9yIHRoYXQgcmFuZ2UsIGFzc3VtaW5nIHRoYXQgdGhhdCdzIHdoZXJlIHdlJ2xsIHdhbnQgdG8KKwkgIGNvbnRpbnVlIHJlYWRpbmcgZnJvbSBuZXh0LgorCSAgVGhpcyBtYXkgbGVhZCB0byB0aGUgZm9sbG93aW5nIHNlZWsgcmVxdWVzdCBwYXR0ZXJuOgorCSAgLSBzb3VyY2UgcmVhZGluZyBwb3NpdGlvbiBBCisJICAtIHNlZWsgdG8gQgorCSAgLSBub3cgcmVhZGluZyBwb3NpdGlvbiBzdGlsbCBBLCByZXF1ZXN0ZWRfcG9zdGlvbiBpcyBCCisJICAtIHN0cmVhbWluZyB0aHJlYWQgdG8gYmUgcmVzdGFydGVkIHRvIGNvbnRpbnVlIGZyb20gQgorCSAgLSBzZWVrIHRvIEEsIGJlZm9yZSBzdHJlYW1pbmcgdGhyZWFkIGhhZCB0aW1lIHRvIGRvIHRoZSBzZWVrCisJICAtIGRvX3NlZWsoKSBub3cgc2VlcyByZWFkaW5nIHBvc2l0aW9uID09IHNlZWsgcG9zaXRpb24gYW5kCisJICByZXR1cm5zIGVhcmx5LgorCSAgLSBob3dldmVyLCByZXF1ZXN0ZWQgcG9zaXRpb24gaXMgc3RpbGwgQiBmcm9tIHRoZSBlYXJsaWVyCisJICBzZWVrIHJlcXVlc3QKKwkgIC0gc3RyZWFtaW5nIHRocmVhZCBzdGFydHMgdXAsIHNlZXMgdGhhdCBhIHNlZWsgdG8gQiBpcyBwZW5kaW5nCisJICBhbmQgcmVxdWVzdHMgZGF0YSBmcm9tIEIgZnJvbSB0aGUgc2VydmVyLCB3aGlsZSB0aGUgR3N0QmFzZVNyYworCSAgc2VnbWVudCBoYXMgb2YgY291cnNlIGJlZW4gdXBkYXRlZC9yZXNldCB0byBwb3NpdGlvbiBBLCB3aGljaAorCSAgd2FzIHRoZSBsYXN0IHNlZWsgcmVxdWVzdC4KKwkgIC0gd2Ugd2lsbCBub3cgc2VuZCBkYXRhIGZvciBwb3NpdGlvbiBCIGFuZCBwcmV0ZW5kIHRoYXQncyB0aGUKKwkgIGRhdGEgZnJvbSBwb3NpdGlvbiBBICh2aWEgdGhlIG5ld3NlZ21lbnQgZXZlbnQsIGV0Yy4pCisJICAtIHRoaXMgY2F1c2VzIGRhdGEgY29ycnVwdGlvbgorCSAgUmVwcm9kdWNpYmxlIGRvaW5nIHNlZWstZW11bGF0ZWQgZmFzdC1mb3J3YXJkL2JhY2t3YXJkIG9uIDAwNjY0OC4KKworMjAxMi0wNS0xNiAwOToxMjo1NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogUmVxdWlyZSBjb3JlL2Jhc2UgMC4xMS45MQorCisyMDEyLTAxLTEzIDE4OjA5OjUwIC0wNTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiAuZ2l0aWdub3JlOgorCSAgLmdpdGlnbm9yZTogYWRkIHZpc3VhbCBzdHVkaW8gSURFIGZpbGVzIGFuZCBPUyBYIC5EU19TdG9yZSBmaWxlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2Nzg5OQorCisyMDEyLTA1LTAzIDA5OjMyOjUwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5oOgorCSAganBlZzogUG9ydCB0byAwLjExIGFnYWluCisKKzIwMTItMDQtMDYgMTI6MTM6MjQgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmg6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmg6CisJICBqcGVnOiBQb3J0IGpwZWdkZWMvanBlZ2VuYyB0byBiYXNlIHZpZGVvIGNsYXNzZXMKKwkgIENvbmZsaWN0czoKKwkgIGV4dC9qcGVnL2dzdGpwZWdkZWMuYworCSAgZXh0L2pwZWcvZ3N0anBlZ2RlYy5oCisJICBleHQvanBlZy9nc3RqcGVnZW5jLmMKKwkgIGV4dC9qcGVnL2dzdGpwZWdlbmMuaAorCSAgUmV2ZXJ0ZWQgdG8gMC4xMCB2ZXJzaW9ucyBmb3Igbm93LCBuZXh0IHBvcnQgYWdhaW4uCisKKzIwMTItMDUtMTMgMTk6MjE6MTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L2Fubm9kZXgvTWFrZWZpbGUuYW06CisJKiBleHQvYW5ub2RleC9nc3Rhbm5vZGV4LmM6CisJKiBleHQvYW5ub2RleC9nc3Rhbm5vZGV4Lmg6CisJKiBleHQvYW5ub2RleC9nc3RjbW1sZGVjLmM6CisJKiBleHQvYW5ub2RleC9nc3RjbW1sZGVjLmg6CisJKiBleHQvYW5ub2RleC9nc3RjbW1sZW5jLmM6CisJKiBleHQvYW5ub2RleC9nc3RjbW1sZW5jLmg6CisJKiBleHQvYW5ub2RleC9nc3RjbW1scGFyc2VyLmM6CisJKiBleHQvYW5ub2RleC9nc3RjbW1scGFyc2VyLmg6CisJKiBleHQvYW5ub2RleC9nc3RjbW1sdGFnLmM6CisJKiBleHQvYW5ub2RleC9nc3RjbW1sdGFnLmg6CisJKiBleHQvYW5ub2RleC9nc3RjbW1sdXRpbHMuYzoKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWx1dGlscy5oOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvY21tbGRlYy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvY21tbGVuYy5jOgorCSAgYW5ub2RleDogcmVtb3ZlIGFubm9kZXggcGx1Z2luIGFuZCBDTU1MIGVsZW1lbnRzCisJICBUaGlzIG5ldmVyIHJlYWxseSB0b29rIG9mZiBhbmQgaXMgbW9zdCBsaWtlbHkgY29tcGxldGVseQorCSAgdW51c2VkLiBJZiB0aGVyZSBpcyBzdGlsbCBhIG5lZWQgZm9yIHRoaXMsIGl0IHNob3VsZAorCSAgcHJvYmFibHkgYmUgZG9uZSBkaWZmZXJlbnRseSwgcGVyaGFwcyBpbnNpZGUgb2dnZGVtdXgvbXV4LgorCisyMDEyLTA1LTEzIDE2OjU5OjU4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAwLjExLjkxID09PQorCisyMDEyLTA1LTEzIDE2OjMxOjAzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb21tb246CisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTEuOTEKKworMjAxMi0wNS0xMyAxNjozMDowMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDEyLTA1LTEzIDE1OjU2OjA1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGRjNzAyMDMgdG8gMzQyOWJhNgorCisyMDEyLTA1LTA5IDE1OjE0OjU1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlYnVndXRpbHMvcm5kYnVmZmVyc2l6ZS5jOgorCSAgcm5kYnVmZmVyc2l6ZTogb25seSBzZW5kIGZsdXNoLXN0b3AgaWYgaXQgd2FzIGEgZmx1c2hpbmcgc2VlaworCisyMDEyLTA1LTA5IDEyOjU0OjExICswMjAwICBQZXRlciBTZWlkZXJlciA8cHMucmVwb3J0QGdteC5uZXQ+CisKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDJzcmM6IGZpeCB2NGwyX3N0ZF9pZCBsb2dnaW5nCisJICBpbnB1dC5zdGQgaXMgb2YgdHlwZSB2NGwyX3N0ZF9pZCB3aGljaCBpcyBkZWZpbmVkIGFzIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLgorCSAgQ2FzdGluZyB0byB1aW50IG1lYW5zIHRoZSBoaWdoZXIgYml0cywgd2ljaCBhcmUgdXNlZCBmb3IgdGhlIHByaXZhdGUgdmlkZW8KKwkgIHN0YW5kYXJkcyBvZiB0aGUgVEkgdmlkZW8gY2FwdHVyZS9kaXNwbGF5IGRyaXZlciBmb3IgZXhhbXBsZSwgYXJlIGxvc3QuCisKKzIwMTItMDUtMDkgMTI6MjQ6MzcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJICBybmRidWZmZXJzaXplOiBtdXN0IHNlbmQgZmx1c2gtc3RvcCBhZnRlciBhY3F1aXJpbmcgdGhlIHN0cmVhbSBsb2NrCisJICBPdGhlcndpc2UgdGhlIHN0cmVhbWluZyB0aHJlYWQgbWlnaHQganVzdCBrZWVwIG9uIGdvaW5nIGFuZCB3ZQorCSAgbWlnaHQgbmV2ZXIgZ2V0IHRoZSBzdHJlYW0gbG9jay4KKworMjAxMi0wNS0wOSAxMToxNToyMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYzoKKwkgIHJuZGJ1ZmZlcnNpemU6IHBvcnQgc2Vla2luZyBjb2RlIHRvIDAuMTEKKworMjAxMi0wNS0wOCAxOTowNzowNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYzoKKwkgIHJuZGJ1ZmZlcnNpemU6IGFkZCBzdXBwb3J0IGZvciBzZWVrcworCSAgVXNlZnVsIGZvciBlLmcuIGZpbGVzcmMgISBybmRidWZmZXJzaXplICEgcXVldWUyICEgLi4uCisKKzIwMTItMDUtMDggMTg6NDU6MzQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJICBybmRidWZmZXJzaXplOiBzZW5kIFNFR01FTlQgZXZlbnQgYmVmb3JlIHB1c2hpbmcgYnVmZmVycworCSAgQ29uZmxpY3RzOgorCSAgZ3N0L2RlYnVndXRpbHMvcm5kYnVmZmVyc2l6ZS5jCisKKzIwMTItMDUtMDkgMTE6MTU6NTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkgIGludGVybGVhdmU6IGZpeCBjb21waWxhdGlvbiBhZ2FpbgorCisyMDEyLTAxLTEzIDEwOjQ5OjQzICswMTAwICBQYXNjYWwgQnVobGVyIDxwYWJ1aGxlckBjaXNjby5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGNyZWF0aW9uIHNob3VsZCBiZSBzaWduYWxlZCBiZWZvcmUgdmFsaWRhdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2Nzg1MAorCisyMDEyLTA1LTA0IDE1OjIwOjQ3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWdlbmM6IGRvIG5vdCBwcm94eSBvdXIgZmlsdGVyIGNhcHMgZG93bnN0cmVhbSBvbiBjYXBzIHF1ZXJpZXMKKwkgIERvd25zdHJlYW0gbGlrZWx5IHdvbid0IGFjY2VwdCB2aWRlby94LXJhdyBhbmQgdGhlIGNhcHMgcXVlcnkKKwkgIHdpbGwgcmV0dXJuIEVNUFRZIGNhcHMuIEluc3RlYWQsIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGNhcHMgdGhhdAorCSAgaGFzIGFsbCBzdHJ1Y3R1cmUgbmFtZXMgcmVwbGFjZWQgYnkgJ2ltYWdlL2pwZWcnCisJICBTaW1wbGUgcGlwZWxpbmUgdGhhdCBzaG93cyB0aGUgcHJvYmxlbToKKwkgIGdzdC1sYXVuY2gtMS4wIHZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz0xICEgInZpZGVvL3gtcmF3LCBcCisJICB3aWR0aD0oaW50KTY0MCwgaGVpZ2h0PShpbnQpNDgwIiAhIHZpZGVvc2NhbGUgISBqcGVnZW5jICEgXAorCSAgImltYWdlL2pwZWcsIHdpZHRoPShpbnQpODAwLCBoZWlnaHQ9KGludCk2MDAiICEgZmlsZXNpbmsgXAorCSAgbG9jYXRpb249L3RtcC9pbWFnZS5qcGcKKworMjAxMi0wNS0wMiAyMToxNzo0MyArMDIwMCAgQWxiYW4gQnJvd2FleXMgPHByYWhhbEB5YWhvby5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgaXNvbXA0OiBzZXQgbGF5b3V0PWludGVybGVhdmVkIG9uIHJhdyBhdWRpbyBjYXBzCisJICBUaGlzIGZpeGVzIGEgbm90LW5lZ290aWF0ZWQgZXJyb3IgYXQgbGVhc3Qgb24gbW92IGZpbGVzIHdpdGgKKwkgIHR3b3MgYXVkaW8gd2l0aCB0d28gY2hhbm5lbHMgYW5kIHZpZGVvIGR2Y3AuIEFzIHBsYXliaW4gYW5kIGdzdC1sYXVuY2gKKwkgIHNhbXBsZSBjb21pbmcgZnJvbSB0aGUgcXRkZW11eC5jIGZpbGUgdXNlcyBhdWRpb2NvbnZlcnQgYW5kIHRoZSBsYXR0ZXIKKwkgIHJlcXVpcmUgZm9ybWF0IGludGVybGVhdmVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NTMyNgorCisyMDEyLTA1LTAyIDIxOjQ5OjU2ICswNDAwICDQoNGD0YHQu9Cw0L0g0JjQttCx0YPQu9Cw0YLQvtCyIDxscm4xOTg2QGdtYWlsLmNvbT4KKworCSogc3lzL3dhdmVmb3JtL01ha2VmaWxlLmFtOgorCSAgd2F2ZWZvcm06IE5vIG1vcmUgZ3N0aW50ZXJmYWNlcworCSAgRml4ZXMgIzY3NTMxOQorCisyMDEyLTA1LTAyIDIwOjE0OjI0ICswNDAwICDQoNGD0YHQu9Cw0L0g0JjQttCx0YPQu9Cw0YLQvtCyIDxscm4xOTg2QGdtYWlsLmNvbT4KKworCSogc3lzL2RpcmVjdHNvdW5kL01ha2VmaWxlLmFtOgorCSAgZGlyZWN0c291bmQ6IE5vIG1vcmUgZ3N0aW50ZXJmYWNlcworCSAgRml4ZXMgIzY3NTMxOQorCisyMDEyLTA1LTAxIDE4OjU4OjAzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmg6CisJICB2aWRlb21peGVyOiBjaGFuZ2Ugc2luayBwYWQgdGVtcGxhdGUgbmFtZSBmcm9tIHNpbmtfJWQgdG8gc2lua18ldQorCisyMDEyLTA0LTMwIDExOjAwOjE5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJICBpbnRlcmxlYXZlOiBoYW5kbGUgRU9TIG9uIGFsbCBwYWRzCisJICBXaGVuIGFsbCBwYWRzIGdvIHRvIEVPUyBpbW1lZGlhdGVseSwgd2UgYXJlIG5vdCBuZWdvdGlhdGVkIGFuZCBvdXIgY29sbGVjdGVkCisJICBmdW5jdGlvbiBpcyBjYWxsZWQgKHdpdGhvdXQgYW55IGF2YWlsYWJsZSBkYXRhKS4gSGFuZGxlIHRoaXMgY2FzZSBncmFjZWZ1bGx5LgorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jCisKKzIwMTItMDQtMzAgMTA6NTk6MzEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkgIGludGVybGVhdmU6IGltcHJvdmUgZGVidWdnaW5nCisKKzIwMTItMDUtMDEgMTM6MzE6NTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBVcGRhdGUgZm9yIGJhc2VzcmMgQVBJIGNoYW5nZXMKKworMjAxMi0wNC0zMCAyMzo1NzoyOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgYWxwaGE6IGRvbid0IHNldCB1cCBzdHVmZiBiZWZvcmUgdGhlIGlucHV0IGFuZCBvdXRwdXQgZm9ybWF0cyBhcmUga25vd24KKwkgIEZpeGVzIGNyYXNoIG9uIHN0YXJ0dXAuCisKKzIwMTItMDQtMzAgMTQ6MDk6MjMgKzAyMDAgIFBldGVyIFNlaWRlcmVyIDxwcy5yZXBvcnRAZ214Lm5ldD4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICBtdWx0aWZpbGVzaW5rOiBkb24ndCB3cml0ZSBzdHJlYW0gaGVhZGVyIHR3aWNlIGZvciBmaXJzdCBmaWxlCisKKzIwMTItMDQtMzAgMTM6MzI6NDEgKzAyMDAgIFBldGVyIFNlaWRlcmVyIDxwcy5yZXBvcnRAZ214Lm5ldD4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICBtdWx0aWZpbGVzaW5rOiBmaXggYnVmZmVyIGxpc3Qgc2l6ZSBjYWxjdWxhdGlvbiBpbiByZW5kZXJfbGlzdAorCSAgRml4IHVuaW5pdGlhbGl6ZWQgJ3NpemUnIHZhcmlhYmxlIGluIGNhbGwgdG8gZ3N0X2J1ZmZlcl9saXN0X2ZvcmVhY2goKS4KKworMjAxMi0wNC0zMCAyMTo1ODowMCArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc0BkZWJldGhlbmNvdXJ0LmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkgIG11bHRpZmlsZTogdW5uZWNlc3Nhcnkgc2l6ZSBjaGVjaworCisyMDEyLTA0LTMwIDIxOjMwOjU2ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzQGRlYmV0aGVuY291cnQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmk6IGZpeCBidWlsZCBlcnJvcnMKKwkgIGZpeCByZWR1bmRhbnQgZGVjbGFyYXRpb25zCisJICBhbmQgYWxzbyBzdHlsZS9pbmRlbnQgaXNzdWVzCisKKzIwMTItMDQtMjYgMTI6NDc6MjcgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiBpbXBsZW1lbnQgZm9yd2FyZCBzbmFwcGluZyBrZXlmcmFtZSBzZWVraW5nCisJICBSZXF1aXJlcyBhbiBpbmRleC4KKworMjAxMi0wNC0yNiAxMjo0NjoxMSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aTogaW1wbGVtZW50IGZvcndhcmQgc25hcHBpbmcga2V5ZnJhbWUgc2Vla2luZworCSAgSW4gcHVsbCBtb2RlIHdpdGggYW4gaW5kZXguCisKKzIwMTItMDQtMjggMjM6MTQ6MjQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jOgorCSAgdGVzdHM6IGZpeCBtYXRyb3NrYW11eCB1bml0IHRlc3QgYWZ0ZXIgbWVkaWEgdHlwZSBjaGFuZ2VzCisKKzIwMTItMDQtMjggMTk6NTc6NTEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL3dlYm0tbXV4LmM6CisJICBtYXRyb3NrYTogdXBkYXRlIGZvciBtZWRpYSB0eXBlIGNoYW5nZXMKKworMjAxMi0wNC0yNCAxNjowODo0NyArMDIwMCAgaWRjLWRyYWdvbiA8aWRjLWRyYWdvbiBhdCBnbXguZGU+CisKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJICBjZWx0ZGVwYXk6IGNhbGN1bGF0ZSBzaXplIGNvcnJlY3RseQorCSAgVGhlIHN1bW1hdGlvbiB3YXMgZG9uZSB3cm9uZywgY2F1c2luZyB0aGUgZGUtcGF5bG9hZGVyIHRvIGV4aXQgaXRzIGxvb3AgdG9vCisJICBlYXJseSwgYmVmb3JlIGFsbCBmcmFtZXMgYXJlIHByb2Nlc3NlZC4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NzQ0NzIKKworMjAxMi0wNC0yNCAxNTo1NzoxOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBpbXByb3ZlIGRlYnVnCisKKzIwMTItMDQtMjQgMTU6MzQ6NTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogc3RhcnQgdW5tdXRlZCB3aGVuIHJlcXVlc3RlZAorCSAgV2hlbiB3ZSBleHBsaWNpdGVseSBzZXQgdGhlIG11dGUgcHJvcGVydHkgdG8gRkFMU0UsIGNvbm5lY3QgdG8gcHVsc2VhdWRpbyB3aXRoCisJICB0aGUgUEFfU1RSRUFNX1NUQVJUX1VOTVVURUQgZmxhZyBzZXQsIG90aGVyd2lzZSBwdWxzZWF1ZGlvIHdpbGwgdXNlIGl0cworCSAgcHJldmlvdXNseSB1c2VkIHZhbHVlICh3aGljaCBtaWdodCBzdGFydCB0aGUgc3RyZWFtIG11dGVkKS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NzI0MDEKKworMjAxMi0wNC0yNSAwOTo0MTo0NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogaW1wcm92ZSB0aW1lc3RhbXAgY29kZQorCSAgU2FtcGxlIHRoZSBwaXBlbGluZSBjbG9jayBhbmQgZGV2aWNlIGNsb2NrIGNsb3NlciB0byBlYWNob3RoZXIgdG8gcmVkdWNlIGppdHRlci4KKwkgIERvbid0IHN1YnRyYWN0IHRoZSBmcmFtZSBkdXJhdGlvbiBmcm9tIHRoZSB0aW1lc3RhbXAgd2hlbiB3ZSBjYW4gdXNlIHRoZSBkZXZpY2UKKwkgIHRpbWVzdGFtcHMuCisJICBBc3N1bWUgYSBkZWxheSBvZiAxIGZyYW1lIGluIHJlYWQtd3JpdGUgbW9kZS4KKworMjAxMi0wNC0yNCAxMjozNzozMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDI6IHVzZSBkcml2ZXIgdGltZXN0YW1wcworCSAgVXNlIHRoZSBkcml2ZSB0aW1lc3RhbXBzIGZvciB0aW1lc3RhbXBpbmcgb3V0Z29pbmcgYnVmZmVycy4KKworMjAxMi0wNC0yMyAxODowMTozMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyOiBJbXByb3ZlIGJ1ZmZlciBtYW5hZ2VtZW50CisJICBRdWVyeSB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZSBidWZmZXJzIHdoZW4gZG9pbmcgc2V0X2NvbmZpZygpLiBUaGlzIGFsbG93cyB1cyB0bworCSAgY29uZmlndXJlIHRoZSBwYXJlbnQgYnVmZmVycG9vbCB3aXRoIHRoZSBudW1iZXIgb2YgYnVmZmVycyB0byBwcmVhbGxvY2F0ZS4KKwkgIEtlZXAgdHJhY2sgb2YgdGhlIHByb3ZpZGVkIGFsbG9jYXRvciBhbmQgdXNlIGl0IHdoZW4gd2UgbmVlZCB0byBhbGxvY2F0ZSBhCisJICBidWZmZXIgaW4gUlcgbW9kZS4KKwkgIFdoZW4gd2UgYXJlIGNhbiBub3QgYWxsb2NhdGUgdGhlIHJlcXVlc3RlZCBtYXhfYnVmZmVycyBhbW91bnQgb2YgYnVmZmVycywgbWFrZQorCSAgc3VyZSB3ZSBrZWVwIDIgYnVmZmVycyBhcm91bmQgaW4gdGhlIHBvb2wgYW5kIGNvcHkgdGhlbSBpbnRvIGFuIG91dHB1dCBidWZmZXIuCisJICBUaGlzIG1ha2VzIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBhIGJ1ZmZlciB0byBjYXB0dXJlIGludG8uIFdlIGFsc28gbmVlZCB0bworCSAgZGV0ZWN0IHRob3NlIGNvcGllZCBidWZmZXJzIGFuZCB1bnJlZiB0aGVtIHdoZW4gdGhleSByZXR1cm4gdG8gdGhlIHBvb2wuCisKKzIwMTItMDQtMjMgMTY6NTE6MjggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBmcmVlIHRoZSBxdWV1ZWQgYnVmZmVycworCSAgT25seSBmcmVlIHRoZSBxdWV1ZWQgYnVmZmVycyB0aGF0IHdlIGtlZXAgdHJhY2sgb2YgaW4gb3VyIGJ1ZmZlciBhcnJheS4gZm9yIHJ3CisJICBpby1tb2RlLCB3ZSBkbyBhbGxvY2F0ZSBidWZmZXJzIGJ1dCB3ZSBkb24ndCBrZWVwIHRyYWNrIG9mIHRoZW0gaW4gdGhlIGJ1ZmZlcgorCSAgYXJyYXkuCisKKzIwMTItMDQtMjMgMTY6MTA6MTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBtYXJrIG1lbW9yeSBhcyBuby1zaGFyZQorCSAgV2UgZG9uJ3Qgc3VwcG9ydCBzaGFyaW5nIG91ciBtbWFwcGVkIG1lbW9yeSBzbyBtYXJrIGl0IGFzIE5PX1NIQVJFLgorCisyMDEyLTA0LTIzIDE2OjA5OjU1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICB2NGwyOiByZW1vdmUgb2xkIHVudXNlZCBmaWxlCisKKzIwMTItMDQtMjMgMTM6MzI6NDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDI6IHJlbW92ZSB1bnVzZWQgZnVuY3Rpb24KKworMjAxMi0wNC0xMSAxMjo0MjoxNyArMDEwMCAgQmFzdGllbiBOb2NlcmEgPGhhZGVzc0BoYWRlc3MubmV0PgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cDogSGFuZGxlIGljeSBhbmQgaWN5eCBVUkkgc2NoZW1lcworCSAgQXMgaGFuZGxlZCBieSBRdWlja1RpbWUgKGZvciBpY3kpLCBhbmQgT3JiYW4vQ29kaW5nIFRlY2hub2xvZ2llcworCSAgQUFDL2FhY1BsdXMgUGxheWVyIChmb3IgaWN5eCkuIFNlZSBhbHNvOgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTM5NDIwNworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTQwMzI4NQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3Mzg5OQorCisyMDEyLTA0LTIzIDEwOjAzOjE5ICswMzAwICBNYXJ0IFJhdWRzZXBwIDxtYXJ0LnJhdWRzZXBwQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIGRvY3M6IEFkZCBTaW5jZSB0YWcgZm9yIG5ldyBHc3RWNGwyU3JjOjpwcmVwYXJlLWZvcm1hdCBzaWduYWwKKworMjAxMi0wNC0yMyAxMDowNzoxMiArMDIwMCAgQ2hyaXMgUGFua293IDxrYWluMjM5NkBnbWFpbC5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJICBhdWRpb2Z4YmFzZWZpcmZpbHRlcjogRml4IHRpbWUtZG9tYWluIGNvbnZvbHV0aW9uIGZvciBtdWx0aWNoYW5uZWwgaW5wdXQKKwkgIEZpeGVzIGJ1ZyAjNjc0MDI1LgorCisyMDEyLTA0LTIxIDExOjA4OjUxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vUE9URklMRVMuaW46CisJICBwbzogcmVtb3ZlIHNvbWUgbW9yZSBub24tZXhpc3RlbnQgZmlsZXMgZnJvbSB0aGUgbGlzdAorCisyMDEyLTA0LTIxIDEwOjA1OjQ1ICswNDAwICDQoNGD0YHQu9Cw0L0g0JjQttCx0YPQu9Cw0YLQvtCyIDxscm4xOTg2QGdtYWlsLmNvbT4KKworCSogcG8vUE9URklMRVMuaW46CisJICBwbzogUmVtb3ZlIG5vbi1leGlzdGVudCBwb3RmaWxlcyBmcm9tIHRoZSBsaXN0CisJICBGaXhlcyAjNjc0NTE4CisKKzIwMTItMDQtMjAgMTg6MTM6MTUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9pY2xlcy90ZXN0LW9zczQuYzoKKwkgIHRlc3RzOiBvc3M0OiBsaW1pdCB0ZXN0IHNjb3BlCisKKzIwMTItMDQtMjAgMTg6MTM6MDEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogc3lzL29zczQvTWFrZWZpbGUuYW06CisJKiBzeXMvb3NzNC9vc3M0LWF1ZGlvLmM6CisJKiBzeXMvb3NzNC9vc3M0LWF1ZGlvLmg6CisJKiBzeXMvb3NzNC9vc3M0LW1peGVyLWVudW0uYzoKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXItZW51bS5oOgorCSogc3lzL29zczQvb3NzNC1taXhlci1zbGlkZXIuYzoKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXItc2xpZGVyLmg6CisJKiBzeXMvb3NzNC9vc3M0LW1peGVyLXN3aXRjaC5jOgorCSogc3lzL29zczQvb3NzNC1taXhlci1zd2l0Y2guaDoKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXIuYzoKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXIuaDoKKwkqIHN5cy9vc3M0L29zczQtcHJvcGVydHktcHJvYmUuYzoKKwkqIHN5cy9vc3M0L29zczQtcHJvcGVydHktcHJvYmUuaDoKKwkqIHN5cy9vc3M0L29zczQtc2luay5jOgorCSogc3lzL29zczQvb3NzNC1zaW5rLmg6CisJKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOgorCSogc3lzL29zczQvb3NzNC1zb3VyY2UuaDoKKwkgIG9zczQ6IHBvcnQgdG8gMC4xMQorCisyMDEyLTA0LTIwIDE4OjEyOjU0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIHN5cy9vc3MvTWFrZWZpbGUuYW06CisJKiBzeXMvb3NzL2dzdG9zc2F1ZGlvLmM6CisJKiBzeXMvb3NzL2dzdG9zc2hlbHBlci5jOgorCSogc3lzL29zcy9nc3Rvc3NoZWxwZXIuaDoKKwkqIHN5cy9vc3MvZ3N0b3NzbWl4ZXIuYzoKKwkqIHN5cy9vc3MvZ3N0b3NzbWl4ZXIuaDoKKwkqIHN5cy9vc3MvZ3N0b3NzbWl4ZXJlbGVtZW50LmM6CisJKiBzeXMvb3NzL2dzdG9zc21peGVyZWxlbWVudC5oOgorCSogc3lzL29zcy9nc3Rvc3NtaXhlcnRyYWNrLmM6CisJKiBzeXMvb3NzL2dzdG9zc21peGVydHJhY2suaDoKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkqIHN5cy9vc3MvZ3N0b3Nzc3JjLmg6CisJICBvc3M6IHBvcnQgdG8gMC4xMQorCisyMDEyLTA0LTIwIDE2OjQ5OjU2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJICBtdWx0aXBhcnRkZW11eDogZmlyc3QgYWN0aXZhdGUgcGFkIHRoZW4gc2V0IGNhcHMKKworMjAxMi0wNC0yMCAxMzozNToxNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHNldCBjYXBzIG9uIHNyY3BhZAorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NDIxOQorCisyMDEyLTA0LTE5IDE0OjE2OjAxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMjogdXBkYXRlIGZvciB2aWRlbyBhcGkgY2hhbmdlCisKKzIwMTItMDQtMTkgMTI6Mzg6NTggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IGZpeCBjb21waWxhdGlvbiBvbiBvbGRlciB2NGwyCisJICBGaXggY29tcGlsYXRpb24gb24gc3lzdGVtcyB3aGVyZSB0aGUgSDI2NCBmb3JtYXQgaXMgbm90IGRlZmluZWQuCisKKzIwMTItMDQtMTkgMTI6MjA6NTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzoKKwkqIGV4dC9yYXcxMzk0L01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHZpZGVvOiBVcGRhdGUgZm9yIGxpYmdzdHZpZGVvIEFQSSBjaGFuZ2VzCisKKzIwMTItMDQtMTkgMDg6Mjc6MDEgKzAwMDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDJzcmM6IEFsbG93IG1wZWctdHMgY2FtZXJhcyB0byBuZWdvY2lhdGUgZm9ybWF0CisJICBUaGlzIHJlbW92ZXMgYW4gdWdseSBoYWNrIHVudGlsIHRoZSByZWFzb24gZm9yIHRoZSBoYWNrIGNhbiBiZSBkb2N1bWVudGVkCisKKzIwMTItMDQtMTkgMDk6NTA6MjUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyc3JjOiBGaXggbWVyZ2UKKworMjAxMi0wNC0xOSAwOTo0MDo1MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDJzcmM6IFJlbmFtZSBwcmUtc2V0LWZvcm1hdCBzaWduYWwgdG8gcHJlcGFyZS1mb3JtYXQKKworMjAxMi0wNC0xNiAyMjowODoyMSArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMnNyYzogQWRkIEgyNjQgZW5jb2RlZCBzdHJlYW0gc3VwcG9ydCB0byB0aGUgY2FwcworCSAgVGhpcyBpcyBub3QgZW5vdWdoIHRvIHByb3Blcmx5IHN1cHBvcnQgSDI2NCBjYW1lcmFzLCBidXQgaXQgd2lsbAorCSAgYWxsb3cgYW4gSDI2NCBzdHJlYW0gdG8gYmUgZ2VuZXJhdGVkIGJ5IHY0bDJzcmMgdXNpbmcgdGhlIGRlZmF1bHQKKwkgIHNldHRpbmdzIG9mIHRoZSBjYW1lcmEuIElmIHVzZWQgd2l0aCB0aGUgcHJlLXNldC1mb3JtYXQgc2lnbmFsLCB0aGUKKwkgIEgyNjQgZW5jb2RlciBjYW4gYmUgZnVsbHkgY29uZmlndXJlZC4KKwkgIENvbmZsaWN0czoKKwkgIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYworCisyMDEyLTA0LTE2IDIyOjA2OjIxICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi8uZ2l0aWdub3JlOgorCSogc3lzL3Y0bDIvZ3N0djRsMi1tYXJzaGFsLmxpc3Q6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICB2NGwyc3JjOiBBZGRpbmcgYSBwcmUtc2V0LWZvcm1hdCBzaWduYWwKKwkgIEluIG9yZGVyIHRvIHN1cHBvcnQgVVZDIEgyNjQgZW5jb2RpbmcgY2FtZXJhcywgYW4gSDI2NCBQcm9iZSZDb21taXQKKwkgIG11c3QgaGFwcGVuIGJlZm9yZSB0aGUgbm9ybWFsIHY0bDIgc2V0LWZvcm1hdC4gVGhpcyBuZXcgc2lnbmFsIGlzCisJICBtZWFudCB0byBhbGxvdyBhbiBleHRlcm5hbCBhcHBsaWNhdGlvbiBvciBiaW4gdG8gZG8gaXQuCisJICBJdCBhbHNvIHNlcnZlcyB0byBleHBvc2UgdGhlIGZpbGUgZGVzY3JpcHRvciB1c2VkIGJ5IHY0bDJzcmMgaW4gY2FzZQorCSAgc29tZSBjdXN0b20gaW9jdGxzIG5lZWQgdG8gYmUgY2FsbGVkLgorCSAgQ29uZmxpY3RzOgorCSAgc3lzL3Y0bDIvTWFrZWZpbGUuYW0KKwkgIHN5cy92NGwyL2dzdHY0bDJzcmMuYworCSAgc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jCisKKzIwMTItMDQtMTggMTc6MDk6NDUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvcmF3MTM5NC9nc3QxMzk0cHJvYmUuYzoKKwkqIGV4dC9yYXcxMzk0L2dzdDEzOTRwcm9iZS5oOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJICBkdjEzOTQ6IHBvcnQgdG8gMC4xMQorCisyMDEyLTA0LTE3IDE1OjE0OjI3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuaDoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5oOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4Lmg6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4Lmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguaDoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuaDoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIycGFkLmg6CisJICBjb2xsZWN0cGFkczI6IHJlbmFtZSB0byBjb2xsZWN0cGFkcworCisyMDEyLTA0LTE2IDE2OjM3OjQ5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICBtaXNjOiBjaGFpbiB1cCB0byBjb2xsZWN0cGFkcyBldmVudCBoYW5kbGVyCisKKzIwMTItMDQtMTYgMDk6MDk6MTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNmRiMjViZSB0byBkYzcwMjAzCisKKzIwMTItMDQtMTUgMjI6NDk6NDcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSAgc2hvdXQyOiB1cGRhdGUgZm9yIG9nZyBtZWRpYSB0eXBlIGNoYW5nZXMKKworMjAxMi0wNC0xMyAxNjo1NDo1MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmg6CisJICBzbXB0ZTogdXNlIHNvbWUgbW9yZSBib2lsZXJwbGF0ZQorCisyMDEyLTA0LTEzIDE2OjU0OjUwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ZseC9nc3RmbHhkZWMuYzoKKwkgIGZseGRlYzogaW1wcm92ZSBzZWdtZW50IGhhbmRsaW5nCisJICAuLi4gdG8gc2VuZCBhIHByb3BlciBUSU1FIHNlZ21lbnQgZG93bnN0cmVhbS4KKworMjAxMi0wNC0xMyAxNjo1NDo0NiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJKiBnc3QvZmx4L2dzdGZseGRlYy5oOgorCSAgZmx4ZGVjOiBwb3J0IHRvIDAuMTEKKworMjAxMi0wNC0xMyAxNjo1NDo0MiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94Lmg6CisJICB2aWRlb2JveDogYWRqdXN0IHRvIGRlcHJlY2F0ZWQgR011dGV4IHNldHVwCisKKzIwMTItMDQtMTMgMTY6NTQ6MzggKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5oOgorCSAgdmlkZW9ib3g6IHBvcnQgdG8gMC4xMQorCisyMDEyLTA0LTEzIDE2OjU0OjMxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlYWxwaGEuYzoKKwkgIGFscGhhLCBzbXB0ZTogYWRqdXN0IHRvIHJlbW92ZWQgY29sb3ItbWF0cml4IGNhcHMgZmllbGQKKworMjAxMi0wNC0xMyAxNjoyNzozNCArMDIwMCAgVsOtY3RvciBNYW51ZWwgSsOhcXVleiBMZWFsIDx2amFxdWV6QGlnYWxpYS5jb20+CisKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSAgdjRsMjogZW5zdXJlIGF1dG9nZW5lcmF0ZWQgZmlsZXMgYXJlIGNyZWF0ZWQKKwkgIFRoZSB0dW5lciBtYXJzaGFsIGFuZCBlbnVtdHlwZXMgYXJlIGF1dG9nZW5lcmF0ZWQsIGFuZCB0aGV5IG5lZWQKKwkgIHRvIGJlIGNyZWF0ZWQgYmVmb3JlIHRoZSBjb21waWxhdGlvbiBvZiBnc3R2NGwydHVuZXIuYworCSAgVGhpcyBwYXRjaCBhZGRzIHRoZSBhdXRvbWFrZSBpbnN0cnVjdGlvbiBmb3IgZW5zdXJpbmcgdGhlCisJICBhdXRvZ2VuZXJhdGlvbiBvZiB0aG9zZSBmaWxlcyBwcmV2aW91cyB0aGUgY29tcGlsYXRpb24uCisKKzIwMTItMDQtMTMgMTM6NDE6NDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBhdXRvZ2VuLnNoOgorCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBNb2Rlcm5pemUgYXV0b3Rvb2xzIHNldHVwIGEgYml0CisJICBBbHNvIHdlIG5vdyBvbmx5IGNyZWF0ZSB0YXIuYnoyIGFuZCB0YXIueHogdGFyYmFsbHMuCisKKzIwMTItMDQtMTMgMTM6Mzc6MTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNDY0ZmUxNSB0byA2ZGIyNWJlCisKKzIwMTItMDQtMTMgMTM6MDQ6MTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBleHQvcHVsc2UvTWFrZWZpbGUuYW06CisJKiBleHQvcHVsc2UvcGx1Z2luLmM6CisJKiBleHQvcHVsc2UvcHVsc2VtaXhlci5jOgorCSogZXh0L3B1bHNlL3B1bHNlbWl4ZXIuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOgorCSogZXh0L3B1bHNlL3B1bHNlbWl4ZXJjdHJsLmg6CisJKiBleHQvcHVsc2UvcHVsc2VtaXhlcnRyYWNrLmM6CisJKiBleHQvcHVsc2UvcHVsc2VtaXhlcnRyYWNrLmg6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5oOgorCSogZ3N0L3J0c3AvTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvb3ZlcmxheS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvb3ZlcmxheS5oOgorCSogc3lzL3Y0bDIvdHVuZXItbWFyc2hhbC5saXN0OgorCSogc3lzL3Y0bDIvdHVuZXIuYzoKKwkqIHN5cy92NGwyL3R1bmVyLmg6CisJKiBzeXMvdjRsMi90dW5lcmNoYW5uZWwuYzoKKwkqIHN5cy92NGwyL3R1bmVyY2hhbm5lbC5oOgorCSogc3lzL3Y0bDIvdHVuZXJub3JtLmM6CisJKiBzeXMvdjRsMi90dW5lcm5vcm0uaDoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvcHVsc2UvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2ljbGVzL3Y0bDJzcmMtdGVzdC5jOgorCSAgVXBkYXRlIGV2ZXJ5dGhpbmcgZm9yIHRoZSByZW1vdmFsIG9mIHRoZSBpbnRlcmZhY2UgbGlicmFyeSBhbmQgbWl4ZXIvdHVuZXIgaW50ZXJmYWNlcworCisyMDEyLTA0LTEyIDE1OjUwOjE2ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcGFyb2J1c3RkZXBheS5jOgorCSAgcnRwOiBVc2UgdW5jaGVja2VkIHZhcmlhbnQgb2YgR3N0Qnl0ZVdyaXRlciB3aGVyZSBhcHBsaWNhYmxlCisJICBUaGUgc2l6ZSB3YXMgY2hlY2tlZCBiZWZvcmUKKworMjAxMi0wNC0xMiAxNTo0OTo0NCArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgR3N0Qnl0ZVJlYWRlci9Xcml0ZXIKKworMjAxMi0wNC0xMiAxNTo0ODo1NyArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X2R1bXAuYzoKKwkgIGlzb21wNDogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIEdzdEJ5dGVXcml0ZXIKKwkgIEFuZCB1c2UgdW5jaGVja2VkIHZhcmlhbnQgb2YgR3N0Qnl0ZVJlYWRlciB3aGVyZSBhcHBsaWNhYmxlCisKKzIwMTItMDQtMTIgMTU6NDg6MDAgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogVXNlIHVuY2hlY2tlZCB2YXJpYW50IG9mIEdzdEJ5dGVSZWFkZXIKKwkgIFdlIGtub3cgdGhlcmUncyBhdCBsZWFzdCA3IGJ5dGVzIChjaGVja2VkIGFib3ZlKQorCisyMDEyLTA0LTEyIDE1OjQ3OjQ5ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIEdzdEJ5dGVXcml0ZXIKKworMjAxMi0wNC0xMiAxNTo0NzoyNCArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgYXVkaW9wYXJzZXJzOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgR3N0Qml0UmVhZGVyL0dzdEJ5dGVSZWFkZXIKKworMjAxMi0wNC0xMiAxMTo1Nzo1OSArMDEwMCAgdXJhZXVzIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBBZGQgaW50ZXJsZWF2ZSBwbHVnaW4gdG8gc3BlYyBmaWxlCisKKzIwMTItMDQtMTIgMTE6MTk6MDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisKKz09PSByZWxlYXNlIDAuMTEuOTAgPT09CisKKzIwMTItMDQtMTIgMTA6Mjc6MzEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLWRpc3QuYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy1kaXN0LmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0LmM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTEuOTAKKworMjAxMi0wNC0xMiAxMDoyNjo1MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDEyLTA0LTExIDAwOjE5OjMwICswNDAwICDQoNGD0YHQu9Cw0L0g0JjQttCx0YPQu9Cw0YLQvtCyIDxscm4xOTg2QGdtYWlsLmNvbT4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAgRml4IGZvcm1hdCBzdHJpbmcKKwkgIEZpeGVzICM2NzM4NTkKKworMjAxMi0wNC0xMSAwMDoxOToxNiArMDQwMCAg0KDRg9GB0LvQsNC9INCY0LbQsdGD0LvQsNGC0L7QsiA8bHJuMTk4NkBnbWFpbC5jb20+CisKKwkqIHN5cy93YXZlZm9ybS9nc3R3YXZlZm9ybXNpbmsuYzoKKwkgIFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKwkgIEZpeGVzICM2NzM4NTkKKworMjAxMi0wNC0xMCAxMTo1Nzo1MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIHJlbW90ZS10cmFja2luZyBicmFuY2ggJ29yaWdpbi8wLjEwJworCSAgQ29uZmxpY3RzOgorCSAgZ3N0L2Zsdi9nc3RmbHZkZW11eC5jCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYworCisyMDEyLTA0LTEwIDExOjM3OjQ4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBzb21lIG1vcmUgc2VnbWVudCBoYW5kbGluZyB0d2Vha2luZworCisyMDEyLTA0LTEwIDAwOjUxOjQxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvb3ZlcmxheS5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmM6CisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzoKKwkqIGV4dC9jYWlyby9nc3R0aW1lb3ZlcmxheS5jOgorCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvanBlZy9nc3RzbW9rZWRlYy5jOgorCSogZXh0L2pwZWcvZ3N0c21va2VlbmMuYzoKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmM6CisJKiBleHQvbGlibW5nL2dzdG1uZ2RlYy5jOgorCSogZXh0L2xpYm1uZy9nc3RtbmdlbmMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOgorCSogZXh0L21pa21vZC9nc3RtaWttb2QuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZW1peGVyLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5jOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJKiBleHQvdGFnbGliL2dzdGFwZXYybXV4LmNjOgorCSogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9lY2hvLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2ZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9paXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2thcmFva2UuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmM6CisJKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOgorCSogZ3N0L2RlYnVndXRpbHMvYnJlYWtteWRhdGEuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2NwdXJlcG9ydC5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0Y2Fwc2RlYnVnLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZpZ2F0aW9udGVzdC5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2c2Vlay5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0cHVzaGZpbGVzcmMuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHRhZ2luamVjdC5jOgorCSogZ3N0L2RlYnVndXRpbHMvcHJvZ3Jlc3NyZXBvcnQuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Rlc3RwbHVnaW4uYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGRpY2UuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGVkZ2UuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdG9wLmM6CisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmV2LmM6CisJKiBnc3QvZWZmZWN0di9nc3RyaXBwbGUuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHN0cmVhay5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXJuYmFuZHMuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzoKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bW9vdnJlY292ZXIuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cnRweHF0ZGVwYXkuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2xhdy9hbGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2Evd2VibS1tdXguYzoKKwkqIGdzdC9tZWRpYW4vZ3N0bWVkaWFuLmM6CisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdGZpbGVzcmMuYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYzoKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJndm9sdW1lLmM6CisJKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBidmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGR2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVuZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc2lyZW5wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSogZ3N0L3J0c3AvZ3N0cnRwZGVjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW90ZW1wbGF0ZS5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJKiBzeXMvb3NzL2dzdG9zc21peGVyZWxlbWVudC5jOgorCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6CisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jOgorCSogc3lzL29zczQvb3NzNC1taXhlci5jOgorCSogc3lzL29zczQvb3NzNC1zaW5rLmM6CisJKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlci5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwycmFkaW8uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvd2F2ZWZvcm0vZ3N0d2F2ZWZvcm1zaW5rLmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSAgVXNlIG5ldyBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhKCkKKworMjAxMi0wNC0wOSAxMjo1NTozNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy9zaW1wbGUtbGF1bmNoLWxpbmVzLmM6CisJICB0ZXN0czogZGlzYWJsZSBzaW1wbGUgc21va2VlbmMvZGVjIGxhdW5jaCBsaW5lcyB0ZXN0CisJICBEaXNhYmxlIHRlc3QgZm9yIHNtb2tlIGVsZW1lbnRzLCB3aGljaCBhcmVuJ3QgcG9ydGVkIHlldAorCSAgKGFuZCBtYXliZSBzaG91bGRuJ3QgYmUgcG9ydGVkKS4KKworMjAxMi0wNC0wOSAwMDoxNDo0OCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ludGVybGVhdmUuYzoKKwkgIGludGVybGVhdmU6IG1ha2UgY2hhbm5lbC1wb2lzaXRpb25zIHByb3BlcnR5IGEgR1ZhbHVlQXJyYXkgYWdhaW4KKwkgIE9yIHBlcmhhcHMgaXQgc2hvdWxkIGp1c3QgYmUgYSBndWludDY0IGNoYW5uZWwgbWFzaywgd2hpY2ggd291bGQKKwkgIGJlIG5pY2VyIGluIEMsIGJ1dCBtb3JlIGF3a3dhcmQgZm9yIGJpbmRpbmdzIChldmVuIG1vcmUgc28gc2luY2UKKwkgIHdlIGNhbid0IGFkZCBhIGZsYWdzIHR5cGUgZm9yIGl0LCBzaW5jZSB0aGF0IG9ubHkgc3VwcG9ydHMgZ3VpbnQKKwkgIHNpemUgZmxhZ3MpLiBGaXhlcyB3YXZlbmMgdW5pdCB0ZXN0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2OTY0MworCisyMDEyLTA0LTA2IDE2OjAzOjQ3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBjbGVhbmx5IGluaXRpYWxpemUgYW5kIHNldCBuZWVkZWQgc2VnbWVudAorCSAgRml4ZXMgIzY3MzE2NS4KKworMjAxMi0wNC0wNSAxNzoxNzoyMiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogRml4IHRocmVhZGluZyBpc3N1ZSBpbiBpbmRleCBoYW5kbGluZworCisyMDEyLTA0LTA2IDA5OjEzOjMxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IERvbid0IHVzZSBzdGF0aWMgdmFyaWFibGVzIHRvIGhvbGQgaW5kZXggYXNzb2NpYXRpb25zCisJICBUaGlzIG5vdCByZWFsbHkgdGhyZWFkc2FmZSBpbiBhbnkgd2F5LgorCisyMDEyLTA0LTA1IDE5OjE3OjQ4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZmx2bXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbnRlcmxlYXZlLmM6CisJICB0ZXN0czogbWFrZSBmZXcgdGVzdHMgbW9yZSB2YWxncmluZC1mcmllbmRseQorCisyMDEyLTA0LTA1IDE5OjE3OjQyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZGVpbnRlcmxlYXZlLmM6CisJICAoZGUpaW50ZXJsZWF2ZTogZml4IHBvcnRlZCB1bml0IHRlc3QgYW5kIGVuYWJsZSBhcyBwb3J0ZWQKKworMjAxMi0wNC0wNSAxOToxNzozOCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxkZWMuYzoKKwkgIHRlc3RzOiBjbW1sZGVjOiBhZGp1c3QgdG8gdGFnIGV2ZW50cyBubyBsb25nZXIgcG9zdGVkIG9uIGJ1cyBieSBlbGVtZW50CisKKzIwMTItMDQtMDUgMTk6MTc6MjkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdXBkc3JjOiBjbGVhciBlcnJvcgorCisyMDEyLTA0LTA1IDE4OjQyOjUzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDdmZGE1MjQgdG8gNDY0ZmUxNQorCisyMDEyLTA0LTA1IDE4OjAyOjU2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZi5jOgorCSAgZ3N0OiBVcGRhdGUgZm9yIEdTVF9QTFVHSU5fREVGSU5FKCkgQVBJIGNoYW5nZXMKKworMjAxMi0wNC0wNSAxNzozNjozOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzoKKwkqIGV4dC9hbm5vZGV4L2dzdGFubm9kZXguYzoKKwkqIGV4dC9jYWlyby9nc3RjYWlyby5jOgorCSogZXh0L2R2L2dzdGR2LmM6CisJKiBleHQvZmxhYy9nc3RmbGFjLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWcuYzoKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmM6CisJKiBleHQvbGlibW5nL2dzdG1uZy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmcuYzoKKwkqIGV4dC9taWttb2QvZ3N0bWlrbW9kLmM6CisJKiBleHQvcHVsc2UvcGx1Z2luLmM6CisJKiBleHQvcmF3MTM5NC9nc3QxMzk0LmM6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSogZXh0L3NvdXAvZ3N0c291cC5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4LmM6CisJKiBleHQvdGFnbGliL2dzdHRhZ2xpYnBsdWdpbi5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFjay5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSogZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meC5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9wbHVnaW4uYzoKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9kZXRlY3QuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpLmM6CisJKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0ZGVidWcuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdG5hdmlnYXRpb250ZXN0LmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGVmZmVjdHYuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzoKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSogZ3N0L2ludGVybGVhdmUvcGx1Z2luLmM6CisJKiBnc3QvaXNvbXA0L2lzb21wNC1wbHVnaW4uYzoKKwkqIGdzdC9sYXcvYWxhdy5jOgorCSogZ3N0L2xhdy9tdWxhdy5jOgorCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EuYzoKKwkqIGdzdC9tZWRpYW4vZ3N0bWVkaWFuLmM6CisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGUuYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0LmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9yZXBsYXlnYWluLmM6CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbWFuYWdlci5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcC5jOgorCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkqIGdzdC9zbXB0ZS9wbHVnaW4uYzoKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSogZ3N0L3VkcC9nc3R1ZHAuYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb3RlbXBsYXRlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvcGx1Z2luLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHBsdWdpbi5jOgorCSogc3lzL29zcy9nc3Rvc3NhdWRpby5jOgorCSogc3lzL29zczQvb3NzNC1hdWRpby5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvLmM6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW8uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkqIHN5cy93YXZlZm9ybS9nc3R3YXZlZm9ybXBsdWdpbi5jOgorCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIGdzdDogVXBkYXRlIGZvciBHU1RfUExVR0lOX0RFRklORSgpIEFQSSBjaGFuZ2VzCisKKzIwMTItMDQtMDUgMTM6MjY6MTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IFVwZGF0ZSB2ZXJzaW9uIHRvIDAuMTEuODkuMQorCisyMDEyLTA0LTA0IDIwOjA2OjU4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkgIHRlc3RzOiBxdG11eDogZW5zdXJlIGluaXRpYWxpemVkIHRlc3QgYnVmZmVyIG1lbW9yeQorCisyMDEyLTA0LTA0IDE0OjQxOjIyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvTWFrZWZpbGUuYW06CisJICBnc3Q6IFVwZGF0ZSB2ZXJzaW9uaW5nCisKKzIwMTItMDQtMDQgMTQ6MzM6MjMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvdmVyc2lvbi5lbnRpdGllcy5pbjoKKwkqIGV4dC9hYWxpYi9NYWtlZmlsZS5hbToKKwkqIGV4dC9jYWlyby9NYWtlZmlsZS5hbToKKwkqIGV4dC9kdi9NYWtlZmlsZS5hbToKKwkqIGV4dC9mbGFjL01ha2VmaWxlLmFtOgorCSogZXh0L2dka19waXhidWYvTWFrZWZpbGUuYW06CisJKiBleHQvamFjay9NYWtlZmlsZS5hbToKKwkqIGV4dC9qcGVnL01ha2VmaWxlLmFtOgorCSogZXh0L2xpYmNhY2EvTWFrZWZpbGUuYW06CisJKiBleHQvbGlicG5nL01ha2VmaWxlLmFtOgorCSogZXh0L3B1bHNlL01ha2VmaWxlLmFtOgorCSogZXh0L3JhdzEzOTQvTWFrZWZpbGUuYW06CisJKiBleHQvc291cC9NYWtlZmlsZS5hbToKKwkqIGV4dC9zcGVleC9NYWtlZmlsZS5hbToKKwkqIGV4dC90YWdsaWIvTWFrZWZpbGUuYW06CisJKiBleHQvd2F2cGFjay9NYWtlZmlsZS5hbToKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkqIGdzdC9hbHBoYS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hcGV0YWcvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVkaW9meC9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb3BhcnNlcnMvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVwYXJzZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdmkvTWFrZWZpbGUuYW06CisJKiBnc3QvY3V0dGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L2RlYnVndXRpbHMvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUuYW06CisJKiBnc3QvZWZmZWN0di9NYWtlZmlsZS5hbToKKwkqIGdzdC9lcXVhbGl6ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvZmx2L01ha2VmaWxlLmFtOgorCSogZ3N0L2ljeWRlbXV4L01ha2VmaWxlLmFtOgorCSogZ3N0L2lkM2RlbXV4L01ha2VmaWxlLmFtOgorCSogZ3N0L2ludGVybGVhdmUvTWFrZWZpbGUuYW06CisJKiBnc3QvaXNvbXA0L01ha2VmaWxlLmFtOgorCSogZ3N0L2xhdy9NYWtlZmlsZS5hbToKKwkqIGdzdC9sZXZlbC9NYWtlZmlsZS5hbToKKwkqIGdzdC9tYXRyb3NrYS9NYWtlZmlsZS5hbToKKwkqIGdzdC9tdWx0aWZpbGUvTWFrZWZpbGUuYW06CisJKiBnc3QvcmVwbGF5Z2Fpbi9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwbWFuYWdlci9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHNwL01ha2VmaWxlLmFtOgorCSogZ3N0L3NoYXBld2lwZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9zbXB0ZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9zcGVjdHJ1bS9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2JveC9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2Nyb3AvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9taXhlci9NYWtlZmlsZS5hbToKKwkqIGdzdC93YXZlbmMvTWFrZWZpbGUuYW06CisJKiBnc3Qvd2F2cGFyc2UvTWFrZWZpbGUuYW06CisJKiBnc3QveTRtL01ha2VmaWxlLmFtOgorCSogcGtnY29uZmlnL01ha2VmaWxlLmFtOgorCSogcGtnY29uZmlnL2dzdHJlYW1lci1wbHVnaW5zLWdvb2QtdW5pbnN0YWxsZWQucGMuaW46CisJKiBzeXMvZGlyZWN0c291bmQvTWFrZWZpbGUuYW06CisJKiBzeXMvb3NzL01ha2VmaWxlLmFtOgorCSogc3lzL29zczQvTWFrZWZpbGUuYW06CisJKiBzeXMvb3N4YXVkaW8vTWFrZWZpbGUuYW06CisJKiBzeXMvb3N4dmlkZW8vTWFrZWZpbGUuYW06CisJKiBzeXMvc3VuYXVkaW8vTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy93YXZlZm9ybS9NYWtlZmlsZS5hbToKKwkqIHN5cy94aW1hZ2UvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL2F1ZGlvZngvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9leGFtcGxlcy9jYWlyby9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3B1bHNlL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgIGdzdDogVXBkYXRlIHZlcnNpb25pbmcKKworMjAxMi0wNC0wNCAxMjoxMDo0NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIHJlbW90ZS10cmFja2luZyBicmFuY2ggJ29yaWdpbi8wLjEwJworCSAgQ29uZmxpY3RzOgorCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmMKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmMKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oCisKKzIwMTItMDQtMDMgMTg6MzY6NTAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJICBqcGVnZW5jOiBwbHVnIHRlbXBsYXRlIGNhcHMgbGVhaworCisyMDEyLTA0LTAzIDExOjUwOjAwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogYXZpIG9ubHkga25vd3MgYWJvdXQgRFRTCisJICBPbmx5IHNldCBEVFMgb24gb3V0Z29pbmcgYnVmZmVycyB1bmxlc3Mgd2UgaGF2ZSBhIGtleWZyYW1lIGFuZCB0aGVuIHdlIGNhbiBzZXQKKwkgIHRoZSBQVFMgdG8gRFRTIGFzIHdlbGwuCisKKzIwMTItMDQtMDIgMjM6MzU6NDMgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWt2OiBwb3J0IHRvYyBjaGFuZ2VzIHRvIDAuMTEKKworMjAxMi0wNC0wMiAyMzoxODowMCArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSAgTWVyZ2UgYnJhbmNoICcwLjEwJworCSAgQ29uZmxpY3RzOgorCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmMKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmMKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oCisKKzIwMTItMDMtMjkgMjM6MjI6MjggKzA0MDAgIEFsZXhhbmRlciBTYXByeWtpbiA8eGVsZml1bUBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkgIG1hdHJvc2thOiBhZGQgR3N0VG9jIHN1cHBvcnQgZm9yIG11eGVyCisKKzIwMTItMDMtMjkgMjM6MTI6MTMgKzA0MDAgIEFsZXhhbmRlciBTYXByeWtpbiA8eGVsZml1bUBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2E6IGFkZCBzdXBwb3J0IGZvciBHc3RUb2MgaW4gZGVtdXhlcgorCisyMDEyLTAzLTI5IDIzOjA1OjE0ICswNDAwICBBbGV4YW5kZXIgU2FwcnlraW4gPHhlbGZpdW1AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSAgbWF0cm9za2E6IGFkZCBjaGFwdGVyIHN1cHBvcnQgaW4gR3N0TWF0cm9za2FSZWFkQ29tbW9uCisKKzIwMTItMDQtMDIgMTM6MDA6MTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZ29vbTJrMS9saW5lcy5jOgorCSAgZ29vbTJrMTogRml4ICdtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24nIGNvbXBpbGVyIHdhcm5pbmcKKworMjAxMi0wNC0wMiAxMToxMzowOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWlpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJICB1c2UgdHJhbnNmb3JtX2lwX29uX3Bhc3N0aHJvdWdoCisKKzIwMTItMDMtMzEgMTU6NDM6NDkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjEwYmFuZHMuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZXF1YWxpemVyLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSogdGVzdHMvaWNsZXMvZXF1YWxpemVyLXRlc3QuYzoKKwkgIHVwZGF0ZSBmb3IgY2hpbGQgcHJveHkgYXBpIGNoYW5nZQorCisyMDEyLTAzLTMwIDE4OjEzOjA4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmlzdWJ0aXRsZS5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGVhdmUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ludGVybGVhdmUuYzoKKwkgIHVwZGF0ZSBmb3IgYnVmZmVyIGFwaSBjaGFuZ2UKKworMjAxMi0wMy0zMCAxMjo1Mzo0NCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmg6CisJICBzcGVleGVuYzogVXNlIG5ldyBnc3RfYXVkaW9fZW5jb2Rlcl9zZXRfaGVhZGVycygpIEFQSQorCisyMDEyLTAzLTMwIDEyOjE4OjQ1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6CisJICBleHQ6IFVwZGF0ZSBmb3IgR3N0QXVkaW9FbmNvZGVyIEFQSSBjaGFuZ2VzCisKKzIwMTItMDMtMjkgMjM6MjI6MjggKzA0MDAgIEFsZXhhbmRlciBTYXByeWtpbiA8eGVsZml1bUBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkgIG1hdHJvc2thOiBhZGQgR3N0VG9jIHN1cHBvcnQgZm9yIG11eGVyCisKKzIwMTItMDMtMjkgMjM6MTI6MTMgKzA0MDAgIEFsZXhhbmRlciBTYXByeWtpbiA8eGVsZml1bUBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2E6IGFkZCBzdXBwb3J0IGZvciBHc3RUb2MgaW4gZGVtdXhlcgorCisyMDEyLTAzLTI5IDIzOjA1OjE0ICswNDAwICBBbGV4YW5kZXIgU2FwcnlraW4gPHhlbGZpdW1AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSAgbWF0cm9za2E6IGFkZCBjaGFwdGVyIHN1cHBvcnQgaW4gR3N0TWF0cm9za2FSZWFkQ29tbW9uCisKKzIwMTItMDMtMjkgMTc6MjI6MjMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvd2F2cGFjay5jOgorCSAgdGVzdHM6IHdhdnBhY2s6IGZld2VyIGJ1ZmZlcnMgYXJlIGFsc28gYWRlcXVhdGUgYW5kIG1vcmUgY29udmVuaWVudAorCisyMDEyLTAzLTI5IDE3OjIyOjE5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6CisJICB0ZXN0czogdmlkZW9jcm9wOiB1bm1hcCB2aWRlbyBmcmFtZSBhbmQgdW5yZWYgY2FwcworCisyMDEyLTAzLTI5IDE3OjIyOjA0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW93c2luY2JhbmQuYzoKKwkgIHRlc3RzOiBhdWRpb3dzaW5jYmFuZDogdW5tYXAgZXhhbWluZWQgb3V0cHV0IGJ1ZmZlcnMKKworMjAxMi0wMy0yOSAxNzoyMTo1MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IHBsdWcgcmVmIGxlYWsKKworMjAxMi0wMy0yOSAxNzoyMTo1MCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkgIGF1ZGlvcGFub3JhbWE6IGZpeCBzdXBwb3J0ZWQgdGVtcGxhdGUgY2FwcyBhbmQgc2FtcGxlIHByb2Nlc3NpbmcKKworMjAxMi0wMy0yOSAxNzoyMTo0MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJICBhbHBoYWNvbG9yOiBwbHVnIHN0cnVjdHVyZSBsZWFrCisKKzIwMTItMDMtMjkgMTY6MDQ6MjYgKzAxMDAgIHVyYWV1cyA8dXJhZXVzQGdub21lLm9yZz4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgVXBkYXRlIHNwZWMgZmlsZSB3aXRoIGxhdGVzdCBwb3J0ZWQgcGx1Z2lucworCisyMDEyLTAzLTI5IDE1OjAzOjA5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgcmVtb3RlLXRyYWNraW5nIGJyYW5jaCAnb3JpZ2luLzAuMTAnCisJICBDb25mbGljdHM6CisJICBjb25maWd1cmUuYWMKKworMjAxMi0wMy0yOCAxNjoyNjo1NiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy90YWdzY2hlY2tpbmcuYzoKKwkgIHRlc3RzOiB0YWdzY2hlY2tpbmc6IG11eGVycyBuZWVkIFRJTUUgZm9ybWF0CisKKzIwMTItMDMtMjggMTY6MjY6MTUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvZmxhY2RlYy5jOgorCSAgdGVzdHM6IGZsYWNkZWM6IG5lZWRzIGZsYWNwYXJzZSBub3dhZGF5cworCisyMDEyLTAzLTI4IDE0OjQ5OjAzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOgorCSAgd2F2cGFja2VuYzogcXVlcnkgZG93bnN0cmVhbSBmb3IgQllURSBzZWVraW5nIHN1cHBvcnQKKworMjAxMi0wMy0yOCAxNDo0ODo0NiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IHF1ZXJ5IGRvd25zdHJlYW0gZm9yIEJZVEUgc2Vla2luZyBzdXBwb3J0CisKKzIwMTItMDMtMjggMTQ6NDY6MDMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBmbGFjZGVjOiBjbGVhbiB1cCBvYnNvbGV0ZSBsb2cgc3RhdGVtZW50CisKKzIwMTItMDMtMjggMTI6NDk6MTkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9taWttb2QvZ3N0bWlrbW9kLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3BhcnNlci5jOgorCSAgdXBkYXRlIGZvciBidWZmZXIgY2hhbmdlcworCisyMDEyLTAzLTI4IDEyOjE2OjQ1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9keW5hbWljLmM6CisJICB0ZXN0czogYXVkaW9keW5hbWljOiBjb3JyZWN0bHkgcG9ydCBvcmlnaW5hbCB0ZXN0IHRvIG1pbmQgaW4gcGxhY2UgdHJhbnNmb3JtCisKKzIwMTItMDMtMjggMTE6MDU6NDMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5jOgorCSAgYXVkaW9meDogbW9yZSBhZGp1c3RtZW50IHRvIGNoYW5nZWQgc2VtYW50aWNzIG9mIGF1ZGlvZmlsdGVyIF9zZXR1cCBtZXRob2QKKworMjAxMi0wMy0yOCAxMToxMDoyNCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZmlyZmlsdGVyLmM6CisJICB0ZXN0czogYXVkaW9maXJmaWx0ZXI6IG5lZ290aWF0ZSB0aGUgaW50ZW5kZWQgcmF3IGF1ZGlvIGZvcm1hdAorCisyMDEyLTAzLTI3IDE4OjQxOjQ1ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgd2F2cGFja3BhcnNlOiBpbml0IGRhdGFzdHJ1Y3R1cmUKKworMjAxMi0wMy0yNyAxNzoxODo0MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGRpY2UuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJldi5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSAgZWZmZWN0djogZml4IHN0cmlkZXMKKworMjAxMi0wMy0yNyAxNjo0MTowNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmM6CisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkgIGNhcHM6IGltcHJvdmUgY2FwcyBoYW5kbGluZworCSAgQXZvaWQgY2FwcyBjb3B5IGFuZCBsZWFrcworCisyMDEyLTAzLTI3IDE0OjA0OjQ4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWN5ZGVtdXguYzoKKwkgIHRlc3RzOiBpY3lkZW11eDogYWN0aXZhdGUgaW50ZXJuYWwgdGVzdCBoZWxwZXIgc3JjIHBhZAorCisyMDEyLTAzLTI3IDEyOjQ0OjQ2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDI6IHVwZGF0ZSBmb3IgZ2V0X3BhcmFtCisJICBSZW1vdmUgY29uc3QgZnJvbSB0aGUgR3N0Q2Fwcy4KKwkgIFBsdWcgc29tZSBHc3RTdHJ1Y3R1cmUgbGVha3MKKworMjAxMi0wMy0yNyAwMDowMjowOCArMDMwMCAgUmFpbW8gSsOkcnZpIDxyYWltby5qYXJ2aUBnbWFpbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwOiBGaXggY29tcGlsaW5nIHdpdGggbWluZ3cuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjcyODgwCisKKzIwMTItMDMtMjYgMTg6MzE6NDEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ3ZvbHVtZS5jOgorCSAgdGVzdHM6IHJlcGxheWdhaW46IG1pc2MgY29tcGF0aWJpbGl0eSBmaXhlcworCSAgRGlzY2FyZCBjYXBzIGV2ZW50IHdoZW4gY2hlY2tpbmcgZm9yIGFuZCBjb3VudGluZyB2YXJpb3VzIHRhZyBldmVudHMsCisJICBhbmQgcmVtb3ZlIGFsbCB0ZXN0aW5nIG9mIDggYml0cyBkZXB0aCBpbiAxNiBiaXRzIHdpZHRoIGZvcm1hdCBzaW5jZQorCSAgaXQgbm8gbG9uZ2VyIGV4aXN0cy4KKworMjAxMi0wMy0yNiAxODoyODoyNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW4uYzoKKwkgIHRlc3RzOiBydHA6IG1pc2MgY29tcGF0aWJpbGl5IGZpeGVzCisJICAuLi4gc3VjaCBhcyBhbHdheXMgc2V0dGluZyBwYWQgY2FwcyBhbmQgcHJvdmlkaW5nIG5lZWRlZCBjYXBzIGZpZWxkcy4KKworMjAxMi0wMy0yNiAxODoyNjo0MCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvZmlsdGVyLmM6CisJICB0ZXN0czogdmlkZW9maWx0ZXI6IGVuc3VyZSBpbml0aWFsIHNlZ21lbnQgZXZlbnQKKworMjAxMi0wMy0yNiAxODoyNToyOCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5oOgorCSAgc2hhcGV3aXBlOiBwcm9wZXIgdmlkZW8gaW5mbyBhbmQgZnJhbWUgbWFuYWdlbWVudAorCSAgLi4uIHBhcnRpY3VsYXJseSBzaW5jZSBlYWNoIGluY29taW5nIHBhZCBoYXMgYSBkaXN0aW5jdCBmb3JtYXQuCisKKzIwMTItMDMtMjYgMTg6MjQ6MDggKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IGVuc3VyZSBvdXRwdXQgY2FwcyBhcmUgc2V0IHdoZW4gcHVzaGluZyBvdXRwdXQgZGF0YQorCSAgLi4uIGV2ZW4gaWYgc29tZSBTUFMvUFBTIGhhcyBub3QgcGFzc2VkIGJ5IHlldC4KKworMjAxMi0wMy0yNiAxODoyMjo1MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgdmlkZW9maWx0ZXI6IGF2b2lkIGhvbGRpbmcgb2JqZWN0IGxvY2sgd2hlbiBjYWxsaW5nIGJhc2V0cmFuc2Zvcm0gZnVuY3Rpb24KKworMjAxMi0wMy0yNiAxODoyMjowMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBmaXggc29tZSBsb2NrIG1hbmFnZW1lbnQKKwkgIC4uLiB0byBhdm9pZCB0cnlpbmcgdG8gdGFrZSBhIG5vbi1yZWN1cnNpdmUgbG9jayB0d2ljZS4KKworMjAxMi0wMy0yNiAxODoyMToxMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6CisJICBydHBMMTYoZGUpcGF5OiBmaXggcmF3IGF1ZGlvIGZvcm1hdCBpbiB0ZW1wbGF0ZSBjYXBzCisKKzIwMTItMDMtMjYgMTg6MjA6NDAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJICByZXBsYXlnYWluOiBhbHNvIHN0aWxsIHBvc3QgdGhlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzCisKKzIwMTItMDMtMjYgMTU6NTk6MDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IGRvbid0IGVycm9yIGluIHNodXRkb3duCisJICBEb24ndCBsb2cgd2l0aCB0aGUgRVJST1IgY2F0ZWdvcnkgd2hlbiB3ZSBhcmUgc3RvcHBpbmcgYmVjYXVzZSB3ZSBhcmUgc2h1dHRpbmcKKwkgIGRvd24uCisJICBGaXhlczogaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3MjgyNAorCisyMDEyLTAzLTI2IDE1OjUxOjI4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyOiBmaXggbGF0ZW5jeQorCisyMDEyLTAzLTI2IDE1OjMwOjAwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkgIHY0bDI6IGNhbGxlZCBiYXNlIGNsYXNzIHN0YXJ0CisJICBDaGFpbiB1cCB0byB0aGUgYmFzZSBjbGFzcyBzdGFydCBtZXRob2Qgc28gdGhhdCBtZXRhZGF0YSBpcyBwcm9wZXJseSB0YWdnZWQuCisJICBSZW1vdmUgYW4gdW51c2VkIHZhcmlhYmxlLgorCSAgZml4ZXM6IGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NzI4MTMKKworMjAxMi0wMy0yNiAxMjoxMjo0NSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgUmVwbGFjZSBtYXN0ZXIgd2l0aCAwLjExCisKKzIwMTItMDMtMjUgMDA6MDA6NTkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5Lmg6CisJICBnZGtwaXhidWZvdmVybGF5OiBhZGQgImFscGhhIiBwcm9wZXJ0eSB0byBzZXQgYWxwaGEgb2Ygb3ZlcmxheSBpbWFnZQorCSAgLi4gb3IgdHVybiB0aGUgb3ZlcmxheSBvZmYgYnkgc2V0dGluZyBhbHBoYSB0byAwLjAKKworMjAxMi0wMy0yNCAwOTo1MTowNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IHBsdWcgY2FwcyBsZWFrCisKKzIwMTItMDMtMjMgMTg6NDc6NDUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbWFnZWZyZWV6ZS5jOgorCSAgdGVzdHM6IGltYWdlZnJlZXplOiByZW1vdmUgZXh0cmFuZW91cyBfdW5yZWYKKworMjAxMi0wMy0yMyAxODo0NzowMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOgorCSAgdGVzdHM6IGF2aW11eDogYWRqdXN0IHRvIG1vZGlmaWVkIHNpbmsgcGFkIHRlbXBsYXRlIG5hbWUKKworMjAxMi0wMy0yMyAxODo0NjozNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6CisJICB0ZXN0czogcXRtdXg6IGNsZWFudXAgZWxlbWVudCBzb29uZXIKKwkgIC4uLiB0byBhdm9pZCBzdHJheSByZWZzIGluIHN0aWNreSBjYXBzIGV2ZW50cy4KKworMjAxMi0wMy0yMyAxODo0NTo1NiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvd3NpbmNiYW5kLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jbGltaXQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkgIHRlc3RzOiBhcnJhbmdlIGZvciBzZW5kaW5nIGFuIGluaXRpYWwgc2VnbWVudCBldmVudAorCSAgLi4uIHdoaWNoIGlzIG5lZWRlZCBub3dhZGF5cyBzaW5jZSB2YXJpb3VzIGdzdF9zZWdtZW50X3RvXy4uLgorCSAgbm8gbG9uZ2VyIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBmb3JtYXQgdG8gdGhlIHNwZWNpZmllZCBvbmUKKwkgIChmcm9tIF9VTkRFRklORUQpLgorCisyMDEyLTAzLTIzIDE4OjQ0OjE1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogaW1tZWRpYXRlbHkgcmV0dXJuIEdTVF9GTE9XX0VPUworCSAgLi4uIHJhdGhlciB0aGFuIF9PSyBzaW5jZSB3ZSB3aWxsIG5vdCBiZSBjYXJpbmcgYWJvdXQgc3Vic2VxdWVudCBidWZmZXIKKwkgIGFueXdheS4KKworMjAxMi0wMy0yMyAxODo0MzozNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IGZpeCBxdWVyeSBhbmQgX2dldGNhcHMgaGFuZGxpbmcKKworMjAxMi0wMy0yMyAxODo0Mjo0OCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmJhbmQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmxpbWl0LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2ZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmg6CisJKiBnc3QvYXVkaW9meC9hdWRpb2thcmFva2UuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYzoKKwkgIGF1ZGlvZng6IGFkanVzdCB0byBjaGFuZ2VkIHNlbWFudGljcyBvZiBhdWRpb2ZpbHRlciBfc2V0dXAgbWV0aG9kCisJICAuLi4gaW4gdGhhdCBpdCB3aWxsIG5vdyBjYWxsIHN1YmNsYXNzIHdpdGggaW5mbyBvbiBwcm9wb3NlZCBhdWRpbyBmb3JtYXQKKwkgIHdpdGhvdXQgaGF2aW5nIHNldCB0aGF0IGluZm8gYWxyZWFkeSBpbiBiYXNlIGNsYXNzLiAgQXMgc3VjaCwKKwkgIHN1YmNsYXNzIGNhbiBub3QgcmVseSBvbiBhdWRpbyBmb3JtYXQgaW5mbyBiZWluZyBhdmFpbGFibGUgdGhlcmUuCisKKzIwMTEtMDctMTQgMTY6MjM6NDkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5oOgorCSAgcnRwaDI2NGRlcGF5OiBNYWtlIG91dHB1dCBpbiBBVkMgc3RyZWFtIGZvcm1hdCB3b3JrIGV2ZW4gd2l0aG91dCBjb21wbGV0ZSBzcHJvcC1wYXJhbWV0ZXItc2V0CisJICBUaGlzIGFsbG93cyBvdXRwdXR0aW5nIHN0cmVhbXMgaW4gQVZDIGZvcm1hdCBldmVuIGlmIHRoZSBTUFMvUFBTIGFyZSBzZW50IGluc2lkZQorCSAgdGhlIFJUUCBzdHJlYW0uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0ODUwCisJICBQb3J0ZWQgZnJvbSBtYXN0ZXIKKworMjAxMi0wMS0yOSAxODozOTo1NCArMDAwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIHVkcHNpbms6IFVubG9jayBvbiBlcnJvcgorCisyMDEyLTAzLTIyIDE4OjI3OjMwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IHVzZSBzaW5rIHBhZCB0ZW1wbGF0ZSBjYXBzIHJhdGhlciB0aGFuIHNyYworCisyMDEyLTAzLTIyIDE4OjIzOjIyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDEyLTAzLTIyIDE4OjIxOjUyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuaDoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5oOgorCSAgc21wdGU6IHBvcnQgdG8gMC4xMQorCisyMDEyLTAzLTIyIDE2OjEwOjMzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IGludGVyc2VjdCBkb3duc3RyZWFtIGFsbG93ZWQgcGVlciBjYXBzIHdpdGggc2luayBwYWQgdGVtcGxhdGUKKworMjAxMi0wMy0yMiAxNTo1NToyOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgYmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAwLjExLjIgPT09CisKKzIwMTItMDMtMjIgMTU6NTE6MTMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkqIHdpbjMyL2NvbW1vbi9nc3R1ZHAtbWFyc2hhbC5jOgorCSAgUmVsZWFzZSAwLjExLjIKKworMjAxMi0wMy0yMiAxMTo1NToyOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDEyLTAzLTIyIDExOjUzOjI0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICB1bnBvcnQgZ2RrcGl4YnVmCisJICBub3QgbWVyZ2VkOiBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0ODUwCisJICBDb25mbGljdHM6CisJICBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW0KKwkgIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sCisJICBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dAorCSAgZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHkKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbAorCSAgZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLmgKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmMKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmMKKwkgIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jCisJICBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jCisJICBnc3QvZmx2L2dzdGZsdm11eC5jCisJICBnc3QvcnRwL2dzdHJ0cGR2ZGVwYXkuYworCSAgZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYworCisyMDEyLTAzLTIyIDExOjQ1OjExICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJICBzbXB0ZTogb25seSBzdGFydCBjb2xsZWN0cGFkczIgYXQgc3RhdGUgY2hhbmdlIHJhdGhlciB0aGFuIGluaXQKKworMjAxMi0wMy0yMSAxMzoyMjo0MyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9hbXBsaWZ5LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2R5bmFtaWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZWNoby5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9wYW5vcmFtYS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHRlc3RzOiB1cGRhdGUgZm9yIG1lbW9yeSBhcGkgY2hhbmdlcworCisyMDEyLTAzLTIwIDEwOjI0OjA1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIHVwZGF0ZSBmb3IgbWVtb3J5IGFwaSBjaGFuZ2VzCisKKzIwMTItMDMtMTkgMTI6MDE6NDAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBwZXJmb3JtIGFkZGl0aW9uYWwgZnJhbWUgY3JjIGNoZWNrIGlmIGFwcGxpY2FibGUKKwkgIC4uLiBzdWNoIGFzIGEgZnJhbWUgaGVhZGVyIHBhcnNpbmcgdGhyb3dpbmcgc29tZSBzdXNwaWNpb3VzIHdhcm5pbmdzLgorCSAgU28gd2UgY2FuIGJlIGEgYml0IG1vcmUgY29udmluY2VkIHdlIGRldGVybWluZSB0aGUgcmlnaHQgZnJhbWUgZW5kLgorCisyMDEyLTAzLTE5IDExOjU4OjE1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogYXZvaWQgaW5kZWZpbml0ZSBleHRlbmRlZCBzZWFyY2ggZm9yIGZyYW1lIGVuZCBpZiBwb3NzaWJsZQorCSAgLi4uIHdoaWNoIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgaWYgbG9ja2VkIG9uIHRvIHRoZSB3cm9uZyBmcmFtZSBzdGFydAorCSAgYW5kL29yIGNvcnJ1cHQgZnJhbWUgYmVpbmcgY3JjIGNoZWNrZWQuCisKKzIwMTItMDMtMTYgMTg6MjM6MjkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmg6CisJICBmbGFjZGVjOiBpbXByb3ZlIGVycm9yIGhhbmRsaW5nIGFuZCByZXNpbGllbmNlCisJICAuLi4gYnkgbm90aW5nIHRoYXQgb25lIG9jY3VycmVkIGluIHRoZSBmaXJzdCBwbGFjZSwgYW5kIHRoZW4gYXBwcm9wcmlhdGVseQorCSAgaWdub3Jpbmcgc29tZSB0cmFuc2llbnQgb25lcy4KKworMjAxMi0wMy0xOSAxMDozMzo0OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBuZWdvdGlhdGUgYW4gYWxsb2NhdG9yIG9uIHRoZSBzcmNwYWRzCisJICBXZSBkbyBhbiBBTExPQ0FUSU9OIHF1ZXJ5IHRvIGZpbmQgb3V0IGFuIGFsbG9jYXRvciBhbmQgcGFyYW1ldGVycyBvbiB0aGUKKwkgIHNyY3BhZHMuIFRoaXMgd2F5IGRlY29kZXJzIChhbmQgc2lua3MpIGNhbiBzcGVjaWZ5IHRoZSBtZW1vcnkgYW5kIHBhcmFtZXRlcnMKKwkgIHRoZXkgd2FudCB1cyB0byB3cml0ZSBpbnRvLgorCisyMDEyLTAzLTE3IDIwOjUzOjMxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5Lmg6CisJICBkb2NzOiB1cGRhdGUgZG9jcyBmb3IgbmV3IHByb3BlcnRpZXMgYW5kIGFkZCBnZGtwaXhidWZvdmVybGF5IGVsZW1lbnQKKwkgIFNvbWV3aGF0IGF0IGxlYXN0LiBObyBpZGVhIHdoeSBpdCBkb2Vzbid0IHBpY2sgdXAgdGhlIGRlc2NyaXB0aW9uCisJICBvciBleGFtcGxlIHBpcGVsaW5lLgorCisyMDEyLTAzLTE4IDAwOjExOjE5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2dka19waXhidWYvTWFrZWZpbGUuYW06CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zm92ZXJsYXkuYzoKKwkgIGdka3BpeGJ1Zm92ZXJsYXk6IG1ha2UgbW9zdCBwcm9wZXJ0aWVzIGNvbnRyb2xsYWJsZSBhbmQgZmxhZyB0aGVtIGFzIG11dGFibGUtcGxheWluZworCisyMDEyLTAzLTE3IDIzOjQxOjM4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmb3ZlcmxheS5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmb3ZlcmxheS5oOgorCSAgZ2RrcGl4YnVmb3ZlcmxheTogYWRkIHByb3BlcnRpZXMgZm9yIHBvc2l0aW9uaW5nIGFuZCBzaXppbmcKKworMjAxMi0wMy0xNyAyMDoxODoxOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9nZGtfcGl4YnVmL01ha2VmaWxlLmFtOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5Lmg6CisJICBnZGtwaXhidWY6IGFkZCBnZGtwaXhidWZvdmVybGF5IGVsZW1lbnQKKwkgIFN0aWxsIGxhY2tzIGZlYXR1cmVzIHN1Y2ggYXMgcG9zaXRpb25pbmcgb3IgcmVzaXppbmcsIG9yCisJICBhbmltYXRpb25zLCBidXQgaXQncyB1c2FibGUgYWxyZWFkeSwgYW5kIHN1cHBvcnRzIGxvdHMgb2YKKwkgIGZvcm1hdHMuCisKKzIwMTItMDMtMTYgMjI6NTI6MDIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkgIGRvbid0IHBva2UgaW50byBiYXNldHJhbnNmb3JtIGludGVybmFscworCSAgQnV0IHVzZSB0aGUgbWV0aG9kcworCisyMDEyLTAzLTE2IDIxOjQ3OjIxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgZG9uJ3QgcGFzcyByYW5kb20gcG9pbnRlcnMgdG8gcHVsbF9yYW5nZQorCisyMDEyLTAzLTE1IDIyOjE1OjQ3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSAgdXBkYXJ0ZSBmb3IgYnVmZmVycG9vbCBjaGFuZ2VzCisKKzIwMTItMDMtMTUgMjI6MTE6MTcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdXBkYXRlIGZvciBidWZmZXJwb29sIGNoYW5nZXMKKworMjAxMi0wMy0xNSAyMDozNzo1NiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmM6CisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB1cGRhdGUgZm9yIGFsbG9jYXRpb24gcXVlcnkgY2hhbmdlcworCisyMDExLTA3LTE0IDE2OjIzOjQ5IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuaDoKKwkgIHJ0cGgyNjRkZXBheTogTWFrZSBvdXRwdXQgaW4gQVZDIHN0cmVhbSBmb3JtYXQgd29yayBldmVuIHdpdGhvdXQgY29tcGxldGUgc3Byb3AtcGFyYW1ldGVyLXNldAorCSAgVGhpcyBhbGxvd3Mgb3V0cHV0dGluZyBzdHJlYW1zIGluIEFWQyBmb3JtYXQgZXZlbiBpZiB0aGUgU1BTL1BQUyBhcmUgc2VudCBpbnNpZGUKKwkgIHRoZSBSVFAgc3RyZWFtLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1NDg1MAorCisyMDEyLTAzLTE1IDE0OjA2OjQwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdXBkYXRlIGZvciBidWZmZXJwb29sIGFwaSBjaGFuZ2UKKworMjAxMi0wMy0xNSAxMzozNzozNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJICB1cGRhdGUgZm9yIG1lbW9yeSBhcGkgY2hhbmdlcworCisyMDEyLTAzLTE1IDEzOjM2OjE3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvYW5ub2RleC9nc3RjbW1sZGVjLmM6CisJKiBleHQvYW5ub2RleC9nc3RjbW1sZW5jLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0ZmlsZXNyYy5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2NoZWJiYW5kLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2NoZWJsaW1pdC5jOgorCSAgdXBkYXRlIGZvciBtZW1vcnkgYXBpIGNoYW5nZXMKKworMjAxMi0wMy0xNCAyMTozNjowMyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAgdXBkYXRlIGZvciBtZW1vcnkgYXBpIGNoYW5nZXMKKworMjAxMi0wMy0xNCAxOTo1NTozMiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdGFrZSBwYWRkaW5nIGludG8gYWNjb3VudAorCisyMDEyLTAzLTE0IDE3OjA3OjUwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuaDoKKwkgIGltYWdlZnJlZXplOiBwb3J0IHRvIDAuMTEKKworMjAxMi0wMy0xNCAxNTo0NTozOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHJlcGx5IEZBTFNlIG9uIHNlcmlhbGl6ZWQgcXVlcmllcworCisyMDEyLTAzLTEzIDIzOjA4OjM4ICswMTAwICBBbmRyZWogR2VsZW5iZXJnIDxhbmRyZWouZ2VsZW5iZXJnQHVkby5lZHU+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5oOgorCSAgcG5nZW5jOiBhZGQgc3VwcG9ydCBmb3IgOC0gYW5kIDE2LWJpdCBncmF5IGltYWdlcworCSAgQWRkIHN1cHBvcnQgZm9yIGRpcmVjdCBlbmNvZGluZyBvZiA4LSBhbmQgMTYtYml0IGJpZyBlbmRpYW4gZ3JheSBpbWFnZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjcyMDI1CisKKzIwMTItMDMtMTQgMTE6MjE6MzIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSAgbXA0dnBheTogd2UgY2FuIGFsc28gaGFuZGxlIHgtZGl2eAorCisyMDEyLTAzLTE0IDEwOjM5OjUzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOgorCSAgd2F2cGFja2VuYzogZG8gbm90IHNldCBvdXRwdXQgY2FwcyBkaXJlY3RseQorCSAgLi4uIGJ1dCB1c2UgYmFzZSBjbGFzcyBmdW5jdGlvbiBpbnN0ZWFkLgorCisyMDEyLTAzLTEzIDIxOjMxOjQ4ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSAgbXA0dmRlcGF5OiBmaXggYnVmZmVyIGhhbmRsaW5nCisJICBEb24ndCBhbHdheXMgb3V0cHV0IHRoZSBwYXlsb2FkIHN1YmJ1ZmZlciwgdXNlIGEgc2VwYXJhdGUgdmFyaWFibGUgdG8KKwkgIG1ha2UgdGhpbmdzIGNsZWFyZXIgYW5kIHdpdGhvdXQgdGhlIGVycm9yLgorCisyMDEyLTAzLTEzIDIwOjQ5OjQzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgdWRwc2luazogbWFrZSBidWZmZXItc2l6ZSB3b3JrIGFnYWluCisKKzIwMTItMDMtMTMgMjA6MzY6NTYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IGZpeCBTT19SQ1ZCVUYgaGFuZGxpbmcKKworMjAxMi0wMy0xMyAxOToyNjo0NyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogZG9uJ3QgbGVhayB0aGUgYWRkcmVzcworCisyMDEyLTAzLTEzIDE5OjI2OjIzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgaDI2NGRlcGF5OiB1bm1hcCBvbiBlbXB0eSBwYWNrZXQKKworMjAxMi0wMy0xMyAxODowNzoxOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHBoMjY0cGF5OiBkbyBEVFMgYW5kIFBUUyBjb3JyZWN0bHkKKworMjAxMi0wMy0xMyAxNzo1NDo1MCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBzZXQgRFRTIGFuZCBQVFMgb24gb3V0cHV0IGJ1ZmZlcnMKKwkgIFNldCBQVFMgYW5kIERUUyBvbiBvdXRwdXQgYnVmZmVycyBpbnN0ZWFkIG9mIGp1c3QgdGhlIFBUUy4gSW4gc3RyZWFtaW5nIGNhc2VzCisJICB5b3Ugd2FudCB0byBzeW5jaHJvbml6ZWQgZW5jb2RlZCBkYXRhIGJhc2VkIG9uIHRoZSBEVFMgYmVjYXVzZSB0aGF0IGlzCisJICBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuCisKKzIwMTItMDMtMTMgMTc6NTQ6MjggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9kdW1wLmM6CisJICBxdGRlbXV4OiBkZWJ1ZyBhZGRpdGlvbmFsIHNkdHAgZmxhZworCisyMDEyLTAzLTEzIDE3OjI3OjMyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzoKKwkgIHJ0cDogZml4IHVubWFwIGNhbGxzCisKKzIwMTItMDMtMTMgMTM6MjU6MDkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkgIHB1bHNlOiBmaXggZm9ybWF0cywgd2UgY2FuIG5vdCBoYW5kbGUgUzggYnV0IG9ubHkgVTgKKworMjAxMi0wMy0xMyAxMjo0MDozNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogZml4IHN0cmVhbWhlYWRlcnMKKwkgIEZpeCB0aGUgY2FwcyBvZiBmbGFjZW5jLCB0aGUgcmVmZXJlbmNlIGVuY29kZXIgb25seSBzdXBwb3J0IDI0IGJpdHMgaW4KKwkgIDMyIGJpdHMuCisJICBTZXQgc3RyZWFtaGVhZGVyIG9uIG91dHB1dCBjYXBzLgorCisyMDEyLTAzLTEyIDE3OjE3OjAxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSAgdXBkYXRlIGZvciBjYXBzIGFwaSBjaGFuZ2VzCisKKzIwMTItMDMtMTIgMTY6NDM6MjcgKzAyMDAgIFNyZWVyZW5qIEJhbGFjaGFuZHJhbiA8c3JlZXJlbmouYmFsYWNoYW5kcmFuQGludGVsLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlLmFjIDogYnVtcCBHTGliIHJlcXVpcmVtZW50IHRvIDIuMzEuMTQKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NzE5MTEKKworMjAxMi0wMy0xMiAxNToyNzoyNyArMDEwMCAgUm9zcyBCdXJ0b24gPHJvc3MgYXQgYnVydG9uaW5pLmNvbT4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogZ2VuZXJhdGUgc2Vla3RhYmxlcyBldmVyeSAxMCBzZWMgYnkgZGVmYXVsdAorCSAgU2luY2UgdGhpcyBpcyB3aGF0IHRoZSBjb21tYW5kIGxpbmUgdG9vbCBkb2VzIGFzIHdlbGwsIGl0IHNlZW1zIGxpa2UKKwkgIGEgYmV0dGVyIGRlZmF1bHQuCisKKzIwMTItMDMtMTAgMTM6NDQ6MDggKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IG9ubHkgdW5sb2NrIHBhZCB3aGVuIGl0IHdhcyBsb2NrZWQKKwkgIFRoaXMgZml4ZXMgdGhlIG11dGV4IGJlaW5nIHVubG9ja2VkIHRvbyBtdWNoIGFuZCBlbmRpbmcgdXAgYWxsb3dpbmcKKwkgIG90aGVyIHRocmVhZHMgd2hlbiB0aGV5IHNob3VsZCBub3QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjcxNzc2CisKKzIwMTItMDMtMDcgMTM6Mzk6NTAgKzAxMDAgIEFuZHJlaiBHZWxlbmJlcmcgPGFuZHJlai5nZWxlbmJlcmdAdWRvLmVkdT4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkgIHBuZ2RlYzogYWRkIHN1cHBvcnQgZm9yIHZpZGVvL3gtcmF3LWdyYXkgZm9ybWF0cworCSAgcG5nZGVjIGNhbiBub3cgZGVjb2RlIGdyYXkgOC0gYW5kIDE2LWJpdCBpbWFnZXMgd2l0aG91dCBhbHBoYSBjaGFubmVsCisJICBkaXJlY3QgdG8gdmlkZW8veC1yYXctZ3JheSBmb3JtYXQuIDE2LWJpdCBncmF5IGltYWdlcyBoYXZlIGJpZy1lbmRpYW4KKwkgIGZvcm1hdCwgYmVjYXVzZSBpdCdzIG5hdGl2ZSBQTkcgZW5kaWFubmVzcy4gR3JheSBpbWFnZXMgd2l0aCBhbHBoYQorCSAgY2hhbm5lbCBzdGlsbCBjb252ZXJ0ZWQgdG8gUkdCQS4KKwkgIFNpZ25lZC1vZmYtYnk6IEFuZHJlaiBHZWxlbmJlcmcgPGFuZHJlai5nZWxlbmJlcmdAdWRvLmVkdT4KKworMjAxMi0wMy0wOCAxNzowNzo1MSArMDEwMCAgTWFyYyBMZWVtYW4gPG1hcmMubGVlbWFuQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgZ3N0cnRzcHNyYzogZGlzYWJsZSBSVFNQIGtlZXAtYWxpdmUgb24gcmVxdWVzdAorCisyMDEyLTAzLTEyIDE0OjQ4OjQ3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzoKKwkgIHNtcHRlOiBmaXggc3RyaWRlIGhhbmRsaW5nCisKKzIwMTItMDMtMTIgMTI6MjM6MTUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9maWx0ZXIuYzoKKwkgIGZpeCBmb3IgY2FwcyBfbm9ybWFsaXplIGNoYW5nZXMKKworMjAxMi0wMy0xMiAxMTo0NzozNSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgZml4IGZvciBjYXBzIGFwaSBjaGFuZ2UKKworMjAxMi0wMy0xMiAxMDo0Mzo1NyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogc3lzL29zczQvb3NzNC1hdWRpby5jOgorCSAgZml4IGZvciBfZG9fc2ltcGxpZnkgY2hhbmdlcworCisyMDEyLTAzLTEyIDA4OjQ4OjMyICswMTAwICBOaWNvbGEgTXVyaW5vIDxuaWNvbGEubXVyaW5vQGdtYWlsLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIGdzdDogRml4IHNvbWUgcXVlcnkgbGVha3MKKworMjAxMi0wMy0xMSAxOTowNjo1OSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgZml4IGZvciBjYXBzIGFwaSBjaGFuZ2VzCisKKzIwMTItMDMtMTEgMTk6MDY6MzcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkqIGdzdC9nb29tMmsxL2dzdGdvb20uYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICBmaXggZm9yIGNhcHMgYXBpIGNoYW5nZXMKKworMjAxMi0wMy0xMCAxMDo1MTo0NCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSogZ3N0L2xhdy9hbGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6CisJICBmaXggdGVtcGxhdGUgY2FwcyByZWZjb3VudAorCisyMDEyLTAzLTA5IDE1OjUzOjMyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBmaXggdXNlIG9mIEFDX0xBTkdfUFJPR1JBTQorCSAgTm8gbmVlZCB0byBpbmNsdWRlIHRoZSBpbnQgbWFpbiAoKSB7IH0gYml0cywgdGhlIGJvZHkgaXMgZW5vdWdoLgorCisyMDEyLTAzLTA5IDE1OjI1OjAyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBmaXggYXV0b2dlbi5zaCB3YXJuaW5ncworCSAgY29uZmlndXJlLmFjOjQxMDogd2FybmluZzogQUNfTEFOR19DT05GVEVTVDogbm8gQUNfTEFOR19TT1VSQ0UgY2FsbCBkZXRlY3RlZCBpbiBib2R5CisKKzIwMTItMDMtMDggMTM6MDY6MTMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzoKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuaDoKKwkgIGFhc2luazogcHJvcG9zZSB2aWRlb21ldGEgdXB0cmVhbQorCSAgc3ViY2xhc3MgZnJvbSB2aWRlb3NpbmsuCisJICBQcm9wb3NlIHZpZGVvbWV0YSB1cHN0cmVhbSBiZWNhdXNlIHdlIGNhbiBoYW5kbGUgaXQgd2l0aCB0aGUgdmlkZW8gYXBpLgorCisyMDEyLTAzLTA4IDAxOjUzOjUwIC0wNTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogZG8gbm90IHVucmVmIHNhbXBsZSBjYXBzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjcxNTM0CisKKzIwMTItMDMtMDggMTE6MzY6MDEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1dG9kZXRlY3QuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOgorCSAgdGVzdHM6IGltcHJvdmUgbW9yZSB0ZXN0cworCisyMDEyLTAzLTA4IDExOjIwOjQzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jYXBzc2V0dGVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9nZGtwaXhidWZzaW5rLmM6CisJICB0ZXN0czogZml4IHNvbWUgbW9yZSB0ZXN0cworCisyMDEyLTAzLTA3IDE1OjIyOjM2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogaW1wcm92ZSBjbGVhbnVwCisJICBSZXVzZSBjbGVhbnVwIG1ldGhvZHMgdG8gbWFrZSBzdXJlIHdlIHJlbW92ZSBhbGwgcGFkcyBjb3JyZWN0bHkKKworMjAxMi0wMy0wNyAxNTowMDoyNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogc2V0IGNhcHMgd2l0aG91dCB0aGUgbG9jaworCSAgUmVsZWFzZSB0aGUgbG9jayBiZWZvcmUgc2V0dGluZyB0aGUgY2FwcyBvbiB0aGUgc3JjcGFkLCB3aGljaCB0cmlnZ2VycyBhbiBldmVudCwKKwkgIHdoaWNoIGNvdWxkIGV2ZW50dWFsbHkgY2FsbCBiYWNrIGludG8gdXMgYW5kIGNhdXNlIGEgZGVhZGxvY2suCisKKzIwMTItMDMtMDcgMTQ6NTU6MDggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzoKKwkgIHB0ZGVtdXg6IHNldCBjYXBzIGFmdGVyIGFjdGl2YXRpbmcgdGhlIHBhZAorCSAgU2V0IHRoZSBjYXBzIGFmdGVyIHdlIGFjdGl2YXRlZCB0aGUgcGFkIG9yIGVsc2UgaXQgd2lsbCBqdXN0IGZhaWwuCisKKzIwMTItMDMtMDcgMTQ6NTQ6MTUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9sYXcvYWxhdy5jOgorCSogZ3N0L2xhdy9tdWxhdy5jOgorCSAgbGF3OiBhZGQgbGF5b3V0IHRvIGF1ZGlvIGNhcHMKKworMjAxMi0wMy0wNyAxNDo1MTowOSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2xhdy9hbGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9hbGF3LWRlY29kZS5oOgorCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmg6CisJICBsYXc6IHVzZSBHc3RBdWRpb0luZm8KKwkgIFVzZSBHc3RBdWRpb0luZm8gdG8gZ2VuZXJhdGUgb3V0cHV0IGNhcHMuCisKKzIwMTItMDMtMDcgMDQ6MjA6MDAgLTA1MDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0ZGVtdXg6IGNvdmVydCBhcnQgdGFnIHR5cGUgaXMgR3N0U2FtcGxlIG5vdCBHc3RCdWZmZXIgbm93CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjcxNTM0CisKKzIwMTItMDMtMDcgMTA6Mjg6NTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBwby9QT1RGSUxFUy5pbjoKKwkgIHBvOiBmaXggUE9URklMRVMuaW4gZm9yIG5ldyB3YXZwYWNrcGFyc2UgbG9jYXRpb24gaW4gc291cmNlIHRyZWUKKworMjAxMi0wMy0wNiAyMTo0NDozNiAtMDgwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcDogQ2hhbmdlIHRoZSBkZWZhdWx0IHBvcnQgdG8gNTAwNAorCSAgdWRwc3JjL3VkcHNpbmsgYXJlIGFsbW9zdCBhbHdheXMgdXNlZCB3aXRoIFJUUCwgc28gbGV0J3MgdXNlIGFuCisJICBSVFAgcG9ydCBhcyB0aGUgZGVmYXVsdCBwb3J0LiAgSXQncyB1bmNsZWFyIHdoeSA0OTUxIHdhcyB1c2VkLCBpdAorCSAgZ29lcyBiYWNrIHRvIGVhcmx5IGNvbW1pdHMgaW4gQ1ZTLgorCisyMDEyLTAzLTA2IDIxOjM2OjAyIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSAgTWVyZ2UgYnJhbmNoICcwLjExJyBvZiBzc2g6Ly9naXQuZnJlZWRlc2t0b3Aub3JnL2dpdC9nc3RyZWFtZXIvZ3N0LXBsdWdpbnMtZ29vZCBpbnRvIDAuMTEKKworMjAxMi0wMy0wNiAxNTo1ODoyMCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSAgc3BlZXhkZWM6IHVzZSBiYXNlIGNsYXNzIHRhZyBoYW5kbGluZyBoZWxwZXIKKwkgIC4uLiBzbyBhcyB0byBlbnN1cmUgdGhlc2UgdG8gYmUgaGFuZGxlZCBhbmQgc2VudCBhdCBwcm9wZXIgdGltZS4KKworMjAxMi0wMy0wNiAxNDoyNToyNyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tzdHJlYW1yZWFkZXIuYzoKKwkgIHdhdnBhY2s6IEZpeCBwb3NzaWJsZSB1bmRlcmZsb3cgb2YgdW5zaWduZWQgaW50ZWdlciB2YXJpYWJsZQorCisyMDEyLTAzLTA2IDE0OjIyOjQzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHhpbWFnZXNyYzogRml4ICdjb21wYXJpc29uIG9mIHVuc2lnbmVkIGV4cHJlc3Npb24gPj0gMCBpcyBhbHdheXMgdHJ1ZScKKwkgIFRoaXMgdmFyaWFibGUgY2FuIG5ldmVyIGJlIGJlbG93IHplcm8gYW55d2F5LgorCisyMDEyLTAzLTA2IDE0OjE4OjMzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogVXNlIGNvcnJlY3QgZW51bSBmb3IgcmV0dXJuIHZhbHVlcworCisyMDEyLTAzLTA2IDE0OjE2OjIxICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBkdmRlcGF5LmM6CisJICBkdmRlcGF5OiBGaXggJ2NvbXBhcmlzb24gb2YgdW5zaWduZWQgZXhwcmVzc2lvbiA+PSAwIGlzIGFsd2F5cyB0cnVlJyBjb21waWxlciB3YXJuaW5nCisJICBUaGlzIHdhcyBhbiBhY3R1YWwgYnVnIGFzIGl0IGNvdWxkJ3ZlIGNhdXNlZCByZWFkaW5nIGZyb20KKwkgIGludmFsaWQgbWVtb3J5IGFyZWFzIHdoZW4gdGhlIGlucHV0IGlzIGJyb2tlbi4KKworMjAxMi0wMy0wNiAxMzoyMToxMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5hc206CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFRvcC5pbmM6CisJICBkZWludGVybGFjZTogRml4ICd2YXJpYWJsZSAnb2xkYngnIGlzIHVuaW5pdGlhbGl6ZWQgd2hlbiB1c2VkIGhlcmUnIGNvbXBpbGVyIHdhcm5pbmdzCisKKzIwMTItMDMtMDYgMTM6MTk6MjQgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBGaXggJ2ltcGxpY2l0IGNvbnZlcnNpb24gZnJvbSBlbnVtZXJhdGlvbiB0eXBlICdHc3REZWludGVybGFjZUZpZWxkcycgdG8gZGlmZmVyZW50IGVudW1lcmF0aW9uIHR5cGUgJ0dzdERlaW50ZXJsYWNlTW9kZScnIGNvbXBpbGVyIHdhcm5pbmcKKworMjAxMi0wMy0wNSAxNToyOTo1NiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuaDoKKwkgIGdkazogY2xlYW51cHMgYW5kIGZpeCByb3dzdHJpZGUKKwkgIEZpeCB0aGUgb3V0cHV0IHJvd3N0cmlkZSwgd2UgbmVlZCB0byB0YWtlIHRoZSBzdHJpZGUgb2YgdGhlIG91dHB1dCB2aWRlbyBmcmFtZS4KKwkgIFNpbmNlIHdlIGFyZSBhbHNvIGRlYWxpbmcgd2l0aCBwbGFuZXMsIHRha2UgdGhlIHBsYW5lIGRhdGEgYW5kIHN0cmlkZS4KKwkgIERvbid0IHN0b3JlIHRoZSBzYW1lIGluZm8gdHdpY2UgaW4gZGlmZmVyZW50IHZhcmlhYmxlcy4KKworMjAxMi0wMy0wNSAxMzozMTo0NCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJICBnZGtwaXhidWY6IGZpeCBldmVudCBoYW5kbGluZworCisyMDEyLTAzLTA1IDEyOjIwOjA3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZGVjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZW5jLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrcGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZwYWNrLmM6CisJICB0ZXN0czogcG9ydCB3YXZwYWNrIHRlc3RzIHRvIDAuMTEKKworMjAxMi0wMy0wNSAxMzozNjozOSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuaDoKKwkgIHdhdnBhY2tkZWM6IHBvcnQgdG8gMC4xMQorCisyMDEyLTAzLTA1IDEyOjE3OjM5ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5oOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOgorCSAgd2F2cGFja2VuYzogcG9ydCB0byAwLjExCisKKzIwMTItMDMtMDUgMTM6MzQ6MzYgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBleHQvd2F2cGFjay9NYWtlZmlsZS5hbToKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2suYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmg6CisJICB3YXZwYWNrOiByZW1vdmUgbGVnYWN5IHdhdnBhY2twYXJzZQorCisyMDEyLTAzLTA1IDEyOjE1OjQ0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5oOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9wbHVnaW4uYzoKKwkgIGF1ZGlvcGFyc2VyczogcG9ydCB3YXZwYWNrcGFyc2UgdG8gMC4xMQorCisyMDEyLTAzLTA1IDEzOjI5OjU5ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmMKKwkgIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmMKKwkgIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmgKKwkgIHN5cy92NGwyL2dzdHY0bDJ2aWRlb292ZXJsYXkuYworCisyMDEyLTAzLTA1IDEyOjQzOjE3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB4LXJhdy1iYXllciAtPiB4LWJheWVyCisKKzIwMTItMDMtMDUgMTE6MTc6MzAgKzAxMDAgIE9sZWtzaWogUmVtcGVsIChBbGV4ZXkgRmlzaGVyKSA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYzoKKwkgIHY0bDJzaW5rOiBkb24ndCB1c2UgZGVwcmVjYXRlZCBYS2V5Y29kZVRvS2V5c3ltCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjcxMjk5CisJICBTaWduZWQtb2ZmLWJ5OiBPbGVrc2lqIFJlbXBlbCAoQWxleGV5IEZpc2hlcikgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKworMjAxMi0wMy0wNSAxMjowMzowMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3hpbWFnZS9NYWtlZmlsZS5hbToKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICB4aW1hZ2U6IHVzZSBuZXcgc3R5bGUgY2FwcworCisyMDEyLTAzLTA1IDEwOjQ5OjMzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOgorCSAgd2F2cGFja2RlYzogYWxsb3cgc29tZSB0aW1lc3RhbXAgdG9sZXJhbmNlIHRvIGFycmFuZ2UgZm9yIHBlcmZlY3QgdGltZXN0YW1waW5nCisJICAuLi4gd2hpY2ggYWxzbyBoYXBwZW5zIHRvIG1ha2Ugc29tZSBtb3JlIHVuaXQgdGVzdHMgcGFzcy4KKworMjAxMi0wMy0wNSAxMDo0Nzo0NCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkgIHdhdnBhY2tkZWM6IGZpeCBjb3B5aW5nIG91dHB1dCBkYXRhCisKKzIwMTItMDMtMDUgMTA6NDY6NTEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6CisJICB3YXZwYWNrZW5jOiByZXN0b3JlIGxlZ2FjeSBidWZmZXIgb2Zmc2V0IGRlY29yYXRpbmcgc29tZXdoYXQKKwkgIC4uLiBhdCBsZWFzdCBzdWZmaWNpZW50bHkgdG8gYWlkIGluIHJlY29nbml6aW5nIHJld3JpdHRlbiBoZWFkZXIgYnVmZmVyCisJICBtYWtpbmcgdW5pdCB0ZXN0IHBhc3MuCisKKzIwMTItMDMtMDUgMTA6NTE6MzMgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmM6CisJICB3YXZwYWNrcGFyc2U6IGluaXRpYWxpemUgaGVhZGVyIHRvIHNpbGVuY2Ugb2xkZXIgZ2NjIHZlcnNpb25zCisKKzIwMTItMDMtMDUgMTA6NDU6NDYgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgd2F2cGFja3BhcnNlOiByZW1vdmUgZW1wdHkgbGluZXMgaW4gdmFyYWJsZSBkZWNsYXJhdGlvbnMgY2F1c2VkIGJ5IG9sZCBpbmRlbnQKKworMjAxMi0wMy0wNSAxMDo0NDo1NCArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFjay5oOgorCSAgamFjazogZml4IG9idmlvdXMgd3JvbmcgZGVmaW5pdGlvbiBmb3IgdGhlIG1hc3RlciBmbGFnCisKKzIwMTItMDMtMDQgMTk6NTU6MjYgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5oOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuaDoKKwkgIGphY2s6IGNoYW5nZSB0aGUgdHJhbnNwb3J0LW1vZGUgZW51bSBpbnRvIGZsYWdzCisJICBPbmUgY2FuIHVzZSAob3Igbm90IHVzZSkgbWFzdGVyIGFuZCBzbGF2ZSBtb2RlIGluZGVwZW5kZW50bHkuCisKKzIwMTItMDMtMDIgMTE6NDk6MDIgLTA1MDAgIEFudG9pbmUgVHJlbWJsYXkgPGhleGEwMEBnbWFpbC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IHN1cHBvcnQgdXAgdG8gNiBjaGFubmVscyBvZiBBQy0zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjcxMjIwCisKKzIwMTItMDMtMDMgMTM6MDQ6NDggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMjogY2xlYXIgRElTQ09OVCBmbGFnIHdoZW4gcmVjeWNsaW5nIGJ1ZmZlcnMgaW50byB0aGUgYnVmZmVyIHBvb2wKKwkgIFRoZSBiYXNlIGNsYXNzIG1heSBoYXZlIHNldCB0aGUgRElTQ09OVCBmbGFnIG9uIHRoZSBmaXJzdCBidWZmZXIgcHVzaGVkCisJICBvdXQuIFdlIG5lZWQgdG8gY2xlYXIgdGhhdCB3aGVuIHJlY3ljbGluZyBidWZmZXJzIGJhY2sgaW50byB0aGUgYnVmZmVyCisJICBwb29sLCBvdGhlcndpc2Ugd2UgY29uc3RhbnRseSBwdXNoIG91dCBidWZmZXJzIHdpdGggdGhlIGRpc2NvbnQgZmxhZworCSAgc2V0LCB3aGljaCBtaWdodCB1cHNldCBkb3duc3RyZWFtIGVsZW1lbnRzLCBlc3AuIGZvciBjb21wcmVzc2VkCisJICBmb3JtYXRzIGxpa2UgbXBlZy10cy4KKworMjAxMi0wMy0wMSAxNDoxNToyOSArMDEwMCAgT2xla3NpaiBSZW1wZWwgKEFsZXhleSBGaXNoZXIpIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSAgdjRsMnNyYzogZml4IHY0bDJfbXVubWFwKCkgZm9yIGNvbXByZXNzZWQgZm9ybWF0cworCSAgTWFrZSBzdXJlIHdlIGFsd2F5cyBjYWxsIG11bm1hcCgpIHdpdGggdGhlIHNhbWUgc2l6ZSB3ZSBjYWxsZWQgbW1hcCgpCisJICB3aXRoIGJlZm9yZS4KKwkgIEN1cnJlbnQgdjRsMnNyYyB1c2VzIHRoZSBzYW1lIHN0cnVjdHVyZSBmb3IgVklESU9DX1FVRVJZQlVGLCBWSURJT0NfUUJVRgorCSAgYW5kIHY0bDJfbXVubWFwIGNhbGxzLiBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZSB2aWRlbyBidWZmZXIgc2l6ZSAobGVuZ3RoKQorCSAgbWF5IHZhcnkgZm9yIGNvbXByZXNzZWQgb3IgZW11bGF0ZWQgYnVmcy4gVklESU9DX1FCVUYgd2lsbCBjaGFuZ2UgaXQgaWYKKwkgIHdlIHBhc3MgdGhlIHBvaW50ZXIgb2YgYSB2NGwyX2J1ZmZlci4gVGhpcyBpcyB3aHkgd2Ugc2hvdWxkIGF2b2lkIHVzaW5nCisJICBzYW1lIHZhcmlhYmxlIGZvciBtbWFwIGFuZCB2aWRlbyBidWZmZXJzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3MTEyNgorCisyMDEyLTAzLTAyIDExOjE3OjMzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9maXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaWlyZmlsdGVyLmM6CisJKiBnc3QvZmx2L2dzdGluZGV4LmM6CisJICBnc3Q6IFVwZGF0ZSBmb3IgdGhlIGdzdG1hcnNoYWwuW2NoXSByZW1vdmFsCisKKzIwMTItMDMtMDIgMTA6MTM6MDggKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VtaXhlcmN0cmwuaDoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuaDoKKwkgIG1peGVyL2NvbG9yYmFsYW5jZTogVXBkYXRlIGZvciBBUEkgY2hhbmdlcworCisyMDEyLTAzLTAxIDE3OjE1OjU3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6CisJICBhYXNpbms6IGZpeCBzdHJpZGUKKworMjAxMi0wMy0wMSAxMTozNjozNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVkaW9wYXJzZXJzL3BsdWdpbi5jOgorCSAgYXVkaW9wYXJzZXJzOiBkaXNhYmxlIG5vbi1wb3J0ZWQgd2F2cGFja3BhcnNlCisKKzIwMTItMDMtMDEgMTE6Mjk6NTAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmMKKwkgIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvaWlyZmlsdGVyLmMKKwkgIHRlc3RzL2V4YW1wbGVzL3Y0bDIvcHJvYmUuYworCisyMDEyLTAyLTI5IDIyOjMxOjIxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5jOgorCSAgZ2RrcGl4YnVmc2luazogcmVtb3ZlIGRlcHJlY2F0ZWQgcHJvcGVydHkKKworMjAxMi0wMi0yOSAyMjozMDo1NiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOgorCSAgZ2RrcGl4YnVmc2NhbGU6IHJlbW92ZSBkZXByZWNhdGVkIHByb3BlcnR5CisKKzIwMTItMDItMjkgMjI6Mjg6MDEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmg6CisJICBnZGtwaXhidWZzaW5rOiBwb3J0IHRvIDAuMTEKKworMjAxMi0wMi0yOSAyMjoyNToyMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5oOgorCSAgZ2RrcGl4YnVmc2NhbGU6IHBvcnQgdG8gMC4xMQorCisyMDEyLTAyLTI5IDIyOjI0OjQ2ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuaDoKKwkgIGdka3BpeGJ1ZmRlYzogcG9ydCB0byAwLjExCisKKzIwMTItMDItMjkgMTc6MjY6MDEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy94aW1hZ2UveGltYWdldXRpbC5jOgorCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmg6CisJICB1cGRhdGUgZm9yIG1ldGFkYXRhIEFQSSBjaGFuZ2VzCisKKzIwMTItMDItMjggMTM6NTE6MTAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL01ha2VmaWxlLmFtOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3R3YXZwYWNrcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL3BsdWdpbi5jOgorCSAgYXVkaW9wYXJzZXJzOiBhZGQgYmFzZXBhcnNlIGJhc2VkIHdhdnBhY2twYXJzZQorCisyMDEyLTAyLTI4IDExOjM4OjU5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmM6CisJICB1cGRhdGUgZm9yIG1ldGFkYXRhIHRhZ3MKKworMjAxMi0wMi0yNyAyMzo0NjoxNSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tkZWMuYzoKKwkgIHdhdnBhY2tkZWM6IGFkanVzdCB0byBhdWRpbyBmb3JtYXQgbGltaXRhdGlvbnMKKwkgIC4uLiB3aGljaCBkb2VzIG5vdCBhbGxvdyBleHByZXNzaW5nIGFyYml0cmFyeSBkZXB0aCBpbiBhIEdzdEF1ZGlvRm9ybWF0LgorCSAgQWxzbyBhZGp1c3QgdW5pdCB0ZXN0IHRvIG1vZGlmaWVkIGJlaGF2aW91ci4KKworMjAxMi0wMi0yNyAyMzo0NjowOCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzoKKwkgIHdhdnBhY2tkZWM6IGRldGVybWluZSBkZXB0aCBmcm9tIGJ5dGVzIHBlciBzYW1wbGUKKwkgIC4uLiByYXRoZXIgdGhhbiBmcm9tIGJpdHMgcGVyIHNhbXBsZSwgc2luY2Ugc3BlYyBzdGF0ZXMgdmFsdWVzIGFyZSBhbHJlYWR5CisJICBsZWZ0IGp1c3RpZmllZCB3LnIudC4gYml0cyBwZXIgc2FtcGxlIGJ1dCBub3Qgdy5yLnQuIGJ5dGVzIHBlciBzYW1wbGUKKwkgIChhbmQgc28gdGhlIGxhdHRlciBkZXRlcm1pbmVzIHRoZSBub3JtYWxpemF0aW9uLCBvciBpbmRpY2F0ZWQgZGVwdGgpLgorCisyMDEyLTAyLTI3IDIzOjQ2OjAzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5oOgorCSAgd2F2cGFja2RlYzogcG9ydCB0byBhdWRpb2RlY29kZXIKKworMjAxMi0wMi0yNyAyMzo0NTo1NCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tlbmMuYzoKKwkgIHdhdnBhY2tlbmM6IHBvcnQgdG8gYXVkaW9lbmNvZGVyCisJICBBbHNvIGFkanVzdCB1bml0IHRlc3QgdG8gc2xpZ2h0bHkgbW9kaWZpZWQgYmVoYXZpb3VyLgorCisyMDEyLTAyLTI3IDE0OjQ3OjI1ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2Fubm9kZXgvZ3N0YW5ub2RleC5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbHBhcnNlci5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbHRhZy5jOgorCSogZXh0L3B1bHNlL3B1bHNlcHJvYmUuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5jOgorCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogc3lzL29zczQvb3NzNC1hdWRpby5jOgorCSogc3lzL29zczQvb3NzNC1wcm9wZXJ0eS1wcm9iZS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9maXJmaWx0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvaWlyZmlsdGVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZGVjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbnRlcmxlYXZlLmM6CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvd2F2ZW5jLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L2ZpcmZpbHRlci1leGFtcGxlLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L2lpcmZpbHRlci1leGFtcGxlLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9wdWxzZS9wdWxzZS5jOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1hbHNhc3JjLVBDTUEuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvcHJvYmUuYzoKKwkqIHRlc3RzL2ljbGVzL3Rlc3Qtb3NzNC5jOgorCSAgU3VwcHJlc3MgZGVwcmVjYXRpb24gd2FybmluZ3MgaW4gc2VsZWN0ZWQgZmlsZXMsIGZvciBnX3ZhbHVlX2FycmF5XyogbW9zdGx5CisKKzIwMTItMDItMjcgMTM6MDk6MzEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgc3BlZXhlbmM6IGNoYWluIHVwIHRvIHBhcmVudCBldmVudCBoYW5kbGVyCisKKzIwMTItMDItMjcgMTM6MDU6MzMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IGZpeCBldmVudCBoYW5kbGluZworCSAgRml4IGRvZGd5IHNlZ21lbnQgZXZlbnQgaGFuZGxpbmcKKwkgIENoYWluIHVwIHRvIHBhcmVudCBldmVudCBoYW5kbGVyCisKKzIwMTItMDItMjcgMDk6MTQ6MDQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiB1c2UgcHVibGljIGFwaQorCSAgaW5zdGVhZCBvZiBwb2tpbmcgaW50byB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmVzIG9mIHRoZSBiYXNlIGNsYXNzCisKKzIwMTItMDItMjcgMDE6MDk6MTEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgZmx2bXV4LCBtYXRyb3NrYW11eCwgcXRtdXg6IGlmIGluIGRvdWJ0IGFib3V0IGRvd25zdHJlYW0gc2Vla2FiaWxpdHkgZGVmYXVsdCB0byBzdHJlYW1pbmc9dHJ1ZQorCSAgSWYgZG93bnN0cmVhbSBkaWRuJ3QgYW5zd2VyIG91ciBTRUVLSU5HIHF1ZXJ5IGFuZCB0b2xkIHVzCisJICBpdCdzIHNlZWthYmxlLCBkZWZhdWx0IHRvIHN0cmVhbWluZz10cnVlLiBXZSBjb3VsZG4ndCBkbworCSAgdGhpcyBpbiAwLjEwIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zLCBidXQgd2UKKwkgIGNhbiBpbiAwLjExLiBQbGF5IGl0IHNhZmUuCisKKzIwMTItMDItMjcgMDE6MDA6MDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSByZW1vdGUtdHJhY2tpbmcgYnJhbmNoICdvcmlnaW4vbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYworCisyMDEyLTAyLTI3IDAwOjU2OjM3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgY29tbWl0ICdmOTIwNzcyMmNhOGZkOGRjYzFlNzIxNWQ4YWY4NWVmZTRkZWJmZGY0JyBpbnRvIDAuMTEKKworMjAxMi0wMi0yNyAwMDo1NTozOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIG1wZWdhdWRpb3BhcnNlOiBmaXggdXAgYWZ0ZXIgbWVyZ2UKKworMjAxMi0wMi0yNyAwMDo0ODo1NyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGNvbW1pdCAnMzg1MTZhZDM2NzEyOGQ4M2Y5ZTE1NjUyOTAxOGFkYjQ0MzNjZDMyOCcgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYworCSAgZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jCisKKzIwMTItMDItMjYgMjA6Mzk6NTIgKzAxMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRAZ21haWwuY29tPgorCisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmM6CisJICBnb29tMmsxOiBmaXggY29tcGlsZXIgd2FybmluZworCisyMDEyLTAyLTI2IDIwOjMwOjI0ICswMTAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSAgbXBlZ2F1ZGlvcGFyc2U6IGZpeCBjb21waWxlciB3YXJuaW5nCisKKzIwMTItMDItMjUgMTU6NTU6MTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogY3JlYXRlIHN0cmVhbWFibGUgb3V0cHV0IGlmIGRvd25zdHJlYW0gaXMgbm90IHNlZWthYmxlCisJICBJZ25vcmUgdGhlICJzdHJlYW1hYmxlIiBwcm9wZXJ0eSBzZXR0aW5nIGFuZCBjcmVhdGUgc3RyZWFtYWJsZQorCSAgb3V0cHV0IGlmIGRvd25zdHJlYW0gaXMga25vd24gbm90IHRvIGJlIHNlZWthYmxlIChhcyBxdWVyaWVkCisJICB2aWEgYSBTRUVLQUJMRSBxdWVyeSkuCisJICBGaXhlcyBwaXBlbGluZXMgbGlrZSBxdG11eCAhIGFwcHNpbmsgcG9zc2libHkgY3JlYXRpbmcgc2VlbWluZ2x5CisJICBjb3JydXB0ZWQgb3V0cHV0IGlmIHN0cmVhbWFibGUgaGFzIG5vdCBiZWVuIHNldCB0byB0cnVlLgorCisyMDEyLTAyLTI1IDE1OjQ4OjQ0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogY3JlYXRlIHN0cmVhbWFibGUgb3V0cHV0IGlmIGRvd25zdHJlYW0gaXMgbm90IHNlZWthYmxlCisJICBJZ25vcmUgdGhlICJzdHJlYW1hYmxlIiBwcm9wZXJ0eSBzZXR0aW5nIGFuZCBjcmVhdGUgc3RyZWFtYWJsZQorCSAgb3V0cHV0IGlmIGRvd25zdHJlYW0gaXMga25vd24gbm90IHRvIGJlIHNlZWthYmxlIChhcyBxdWVyaWVkCisJICB2aWEgYSBTRUVLQUJMRSBxdWVyeSkuCisJICBGaXhlcyBwaXBlbGluZXMgbGlrZSBmbHZtdXggISBhcHBzaW5rIHBvc3NpYmx5IGNyZWF0aW5nIHNlZW1pbmdseQorCSAgY29ycnVwdGVkIG91dHB1dCBpZiBzdHJlYW1hYmxlIGhhcyBub3QgYmVlbiBzZXQgdG8gdHJ1ZS4KKworMjAxMi0wMi0yNSAxNTo0MDozOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBjcmVhdGUgc3RyZWFtYWJsZSBvdXRwdXQgaWYgZG93bnN0cmVhbSBpcyBub3Qgc2Vla2FibGUKKwkgIElnbm9yZSB0aGUgInN0cmVhbWFibGUiIHByb3BlcnR5IHNldHRpbmcgYW5kIGNyZWF0ZSBzdHJlYW1hYmxlCisJICBvdXRwdXQgaWYgZG93bnN0cmVhbSBpcyBrbm93biBub3QgdG8gYmUgc2Vla2FibGUgKGFzIHF1ZXJpZWQKKwkgIHZpYSBhIFNFRUtBQkxFIHF1ZXJ5KS4KKwkgIEZpeGVzIHBpcGVsaW5lcyBsaWtlIHdlYm1tdXggISBhcHBzaW5rIGNyZWF0aW5nIHNlZW1pbmdseQorCSAgY29ycnVwdGVkIG91dHB1dCBpZiBzdHJlYW1hYmxlIGhhcyBub3QgYmVlbiBzZXQgdG8gdHJ1ZS4KKworMjAxMi0wMi0yNCAxMTowMzo0OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSAgdXBkYXRlIGZvciBiYXNldHJhbnNmb3JtIGNoYW5nZQorCisyMDEyLTAyLTI0IDEwOjI2OjI2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmM6CisJICB1cGRhdGUgZm9yIG1ldGFkYXRhIGNoYW5nZQorCisyMDEyLTAyLTIzIDA4OjQyOjI1IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGdzdC9kZWJ1Z3V0aWxzL01ha2VmaWxlLmFtOgorCSogZ3N0L2RlYnVndXRpbHMvZWZlbmNlLmM6CisJKiBnc3QvZGVidWd1dGlscy9lZmVuY2UuaDoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2VmZW5jZS52Y3Byb2o6CisJICBlZmVuY2U6IHJlbW92ZSBwbHVnaW4KKwkgIFZhbGdyaW5kIGlzIG11Y2ggbW9yZSB1c2VmdWwgdGhlc2UgZGF5cy4KKworMjAxMi0wMi0yMyAxMjowNToyMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSAgVXBkYXRlIE5FV1MgYW5kIFJFTEVBU0UgYXMgd2VsbAorCisyMDEyLTAyLTIzIDExOjA3OjM1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgQnVtcCB2ZXJzaW9uIGFmdGVyIHJlbGVhc2UKKworMjAxMi0wMi0yMyAxMjowMzoyNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9lY2hvLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uaDoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlaWlyZmlsdGVyLmg6CisJICBhdWRpb2Z4OiByZW1vdmUgdHJhbnNmb3JtIGxvY2sgdXNhZ2UKKworMjAxMi0wMi0yMyAxMToxNjoyMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uaDoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5oOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgdXBkYXRlIGZvciBiYXNldHJhbnNmb3JtIGxvY2sgcmVtb3ZhbAorCisyMDEyLTAyLTIyIDIzOjM2OjU0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlYnVndXRpbHMvTWFrZWZpbGUuYW06CisJICBkZWJ1Z3V0aWxzOiBkaXNhYmxlIGVmZW5jZSBwbHVnaW4gcHJvcGVybHkKKwkgIFdlIGRvbid0IHdhbnQgaXQgYnVpbHQgaWYgbW1hcCBpc24ndCBhdmFpbGFibGUgZWl0aGVyLi4KKworMjAxMi0wMi0yMiAxNzozOToxNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IGZpeCBnZXRfY2FwcyBmdW5jdGlvbiBzb21lIG1vcmUgc28gdGhhdCBhbGwgc3RydWN0dXJlcyBoYXZlIGNoYW5uZWwgaW5mbworCSAgU2V0IGNoYW5uZWxzIGFuZCBjaGFubmVsLWxheW91dCBvbiB0aGUgcmlnaHQgc3RydWN0dXJlOyB0aGF0IGlzLCB0aGUKKwkgIHN0cnVjdHVyZSB3ZSBhcmUgZ29pbmcgdG8gYXBwZW5kIHRvIHRoZSBjYXBzIHdlIGFyZSBidWlsZGluZywgYW5kIG5vdAorCSAgdGhlIHN0cnVjdHVyZSB3ZSBhcmUgdXNpbmcgYXMgYSB0ZW1wbGF0ZSBmb3IgYWxsIHRoZSBzdHJ1Y3R1cmVzLiBGaXhlcworCSAgZmlyc3Qgc3RydWN0dXJlIG9mIHRoZSByZXR1cm5lZCBjYXBzIG5vdCBoYXZpbmcgYW55IGNoYW5uZWwgaW5mbyBzZXQKKwkgIG9uIGl0LgorCisyMDEyLTAyLTIyIDE3OjA5OjI1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogbWljcm9vcHRpbWlzYXRpb246IGF2b2lkIHVubmVjZXNzYXJ5IGxpc3QgYW5kIHN0cmluZyBjb3BpZXMKKworMjAxMi0wMi0yMiAxNzowMzo0MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IGF1ZGlvIGNhcHMgaGF2ZSBhICpsaXN0KiBvZiBmb3JtYXRzLCBub3QgYW4gYXJyYXkgb2YgZm9ybWF0cworCSAgQSBsaXN0IG9mIHRoaW5ncyBpbiBjYXBzIGlzIHNvbWV0aGluZyB3aGVyZSBvbmUgaXMgcGlja2VkIGluIHRoZQorCSAgY291cnNlIG9mIG5lZ290aWF0aW9uLiBBbiBhcnJheSBpcyBhbHdheXMgc29tZXRoaW5nIHRoYXQgb25seSBtYWtlcworCSAgc2Vuc2UgYXMgYSB3aG9sZSBpbiB0aGF0IG9yZGVyLgorCisyMDEyLTAyLTIyIDE4OjAyOjI3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogcmVtb3ZlIHBvc3QtcG9ydCBib2d1cyBfdW5yZWYKKworMjAxMi0wMi0yMiAxNzowMDoxOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IHJlbW92ZSBib2d1cyBwYWQgbG9ja2luZyB0aGF0IGNhdXNlcyBkZWFkbG9ja3MKKwkgIEl0J3Mgbm90IGNsZWFyIHdoeSB0aGUgcGFkIG9iamVjdCBsb2NrIGlzIHRha2VuIGhlcmUuIEJ1dAorCSAgZ3N0X3BhZF97aGFzLGdldH1fY3VycmVudF9jYXBzKCkgd2lsbCB0cnkgdG8gdGFrZSB0aGUgbG9jaworCSAgYXMgd2VsbCBhbmQgZGVhZGxvY2ssIHNpbmNlIGl0J3Mgbm90IHJlY3Vyc2l2ZS4KKworMjAxMi0wMi0yMiAxNjo1OTo0MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IHNldCByaWdodCBudW1iZXIgb2YgY2hhbm5lbHMgb24gY2FwcyBpbiBnZXRfY2FwcyBmdW5jdGlvbgorCisyMDEyLTAyLTIxIDE3OjE2OjMyIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogYXV0b2dlbi5zaDoKKwkgIGF1dG9nZW46IGF2b2lkIHRvdWNoaW5nIC5wbyBmaWxlcyBkdXJpbmcgJ21ha2UnCisJICBBIHNpbXBsZSB3b3JrYXJvdW5kIHRvIGRlYWwgd2l0aCBHTlUgZ2V0dGV4dCBhdXRvbWFrZSBpbnRlZ3JhdGlvbgorCSAgZmFpbGluZyB0byBkZWFsIHdpdGggZ2l0LiAgRml4ZXM6ICM2NjkyMDcKKworMjAxMi0wMi0yMiAwMjowNjoxNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW50ZXJsZWF2ZS5jOgorCSAgdXBkYXRlIGZvciBuZXcgbWVtb3J5IGFwaQorCisyMDEyLTAyLTIxIDE3OjU3OjQ0ICswMTAwICBWaW5jZW50IFVudHogPHZ1bnR6QGdub21lLm9yZz4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJICBwdWxzZTogRml4IGEgYnVpbGQgd2FybmluZyB3aGVuIGNvbXBpbGluZyB3aXRoIGFzc2VydHMgZGlzYWJsZWQKKwkgIFJldHVybiBhIHZhbHVlIGV2ZW4gaWYgdGhlIGNvZGUgd2lsbCBuZXZlciBiZSByZWFjaGVkLCB0byBtYWtlIGNvbXBpbGVycworCSAgaGFwcHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjcwNTYxCisKKzIwMTItMDItMjEgMTg6NDI6MzEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmg6CisJICBtcGVnYXVkaW9wYXJzZTogc3VwcG9ydCBwYXJzaW5nIGZyZWVmb3JtIGJpdHJhdGUgc3RyZWFtCisKKzIwMTItMDItMjEgMTg6Mzk6MTggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSogZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuaDoKKwkgIG1vbm9zY29wZTogcG9ydCB0byAwLjExCisKKzIwMTItMDItMjEgMTA6NTM6NTYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMi0wMi0yMCAxMjoyMjoxMiAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHBoMjY0cGF5OiBGb3JjZSBiYXNlbGluZSBpcyBwcm9maWxlLWxldmVsLWlkIGlzIHVuc3BlY2lmaWVkCisKKzIwMTItMDItMjEgMTA6NDA6MDAgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSAgaWQzdjJtdXg6IEZpeCBtZXJnZSBlcnJvcgorCisyMDEyLTAyLTIwIDEyOjIyOjEyIC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IEZvcmNlIGJhc2VsaW5lIGlzIHByb2ZpbGUtbGV2ZWwtaWQgaXMgdW5zcGVjaWZpZWQKKworMjAxMi0wMi0yMCAxNjozNToxOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIGZpeCBjb21waWxlciB3YXJuaW5ncworCisyMDEyLTAxLTI2IDAzOjI5OjI4IC0wNTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgZml4IGNvbXBpbGVyIHdhcm5pbmdzCisKKzIwMTItMDEtMjYgMDY6NTg6NDYgLTA1MDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIEZpeCBjb21waWxlciB3YXJuaW5ncworCisyMDEyLTAyLTE4IDExOjM4OjM2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzoKKwkgIHRlc3RzOiBmaXggdXAgbGV2ZWwgdGVzdCBmb3IgR3N0VmFsdWVMaXN0IC0+IEdWYWx1ZUFycmF5IGNoYW5nZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3MDMwMworCisyMDEyLTAyLTE2IDE4OjAxOjI5ICswMjAwICBQZXRlcmlzIEtyaXNqYW5pcyA8cGVjaXNrQGdtYWlsLmNvbT4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJICBsZXZlbDogdXNlIEdWYWx1ZUFycmF5IGluc3RlYWQgb2YgR3N0VmFsdWVMaXN0IGluIG1lc3NhZ2VzCisJICBVcGRhdGVkIEdzdExldmVsIGVsZW1lbnQgdG8gdXNlIEdWYWx1ZUFycmF5IGluc3RlYWQgb2YKKwkgIEdzdFZhbHVlTGlzdCBmb3Igcm1zL3BlYWsvZGVjYXkga2V5cyBhdHRhY2hlZCB0byBlbGVtZW50CisJICBtZXNzYWdlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3MDMwMworCisyMDEyLTAyLTE4IDAwOjAwOjU0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICB3aW4zMjogYmFjayB0byBkZXZlbG9wbWVudAorCisyMDEyLTAyLTE3IDIzOjU0OjI5ICswMTAwICBEb21pbmlxdWUgTGV1ZW5iZXJnZXIgPGRvbWluaXF1ZS1nbm9tZXppbGxhIGF0IGxldWVuYmVyZ2VyLm5ldD4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgTm8gbG9uZ2VyIHJlZmVyZW5jZSBkZXByZWNhdGVkIGhlYWRlciBmaWxlcyB3aGlsZSBidWlsZGluZyBkb2NzLgorCisyMDEyLTAyLTE3IDIzOjQ5OjIxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jCisKKzIwMTItMDItMTcgMTc6MjE6NTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSAgZXF1YWxpemVyOiBmaXggc3dpdGNoaW5nIGZyb20gcGFzc3Rocm91Z2ggdG8gbm9uLXBhc3N0aHJvdWdoIHdoZW4gcGFyYW1ldGVycyBjaGFuZ2UKKwkgIGNvbW1pdCBiNWJmMDI5NCBtb3ZlZCB0aGUgaWYobmVlZF9uZXdfY29lZmZpY2llbnRzKSBzZXRfcGFzc3Rocm91Z2goZXF1KQorCSAgYWZ0ZXIgdGhlIGlmKGlzX3Bhc3N0aHJvdWdoKSByZXR1cm4gRkxPV19PSyBzaG9ydGN1dCwgc28gdGhlIHBhc3N0aHJvdWdoCisJICBtb2RlIHdvdWxkIG5ldmVyIGdldCB1cGRhdGVkIGV2ZW4gaWYgdGhlIGNvZWZmaWNpZW50cyBjaGFuZ2UuCisJICBGaXhlcyBlcXVhbGl6ZXItdGVzdCBkb2luZyAuLiBub3RoaW5nLgorCisyMDEyLTAyLTE3IDE3OjU3OjAzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSAgZ29vbSo6IGZpeCBsZWFrZWQgY2FwcyBldmVudAorCisyMDEyLTAyLTE3IDEzOjI2OjUzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSAgbXBlZ2F1ZGlvcGFyc2U6IHBhcnNlIGVpdGhlciBYaW5nIG9yIFZCUkkgZGF0YQorCSAgLi4uIGFuZCBhdm9pZCBjb25mdXNpbmcgZGVidWcgbWVzc2FnZSBjbGFpbWluZyBuZWl0aGVyIHByZXNlbnQuCisKKzIwMTItMDItMTcgMTQ6Mzg6MDMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9zazogZml4IHNlZ21lbnQgdXBkYXRlCisKKzIwMTItMDItMTcgMTE6MDU6MjcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGJhY2sgdG8gZGV2ZWxvcG1lbnQKKworPT09IHJlbGVhc2UgMC4xMS4xID09PQorCisyMDEyLTAyLTE3IDExOjA0OjQ3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5zaWduYWxzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJKiB3aW4zMi9jb21tb24vZ3N0cnRwYmluLW1hcnNoYWwuYzoKKwkqIHdpbjMyL2NvbW1vbi9nc3RydHBiaW4tbWFyc2hhbC5oOgorCSAgUkVMRUFTRSAwLjExLjEKKworMjAxMi0wMi0xNiAyMzozMzoxNSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkgIGdvb206IGZpeCBidWZmZXIgbGVhaworCisyMDEyLTAyLTE2IDIzOjQwOjU4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSAgZ29vbTJrMTogdXNlIHNvbWUgbW9yZSBib2lsZXJwbGF0ZQorCisyMDEyLTAyLTE2IDIzOjMzOjAxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5oOgorCSAgZ29vbTJrMTogcG9ydCB0byAwLjExCisKKzIwMTItMDItMTYgMTU6MzE6NTMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSAgc2hvdXQyOiB1c2Ugc29tZSBtb3JlIGJvaWxlcnBsYXRlCisKKzIwMTItMDItMTYgMTU6Mjk6MzQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSAgc2hvdXQyOiBwb3J0IHRvIDAuMTEKKworMjAxMi0wMi0xNCAxMTo1NjowMCArMDEwMCAgUGhpbGlwcGUgTm9ybWFuZCA8cGhpbG5AaWdhbGlhLmNvbT4KKworCSogZ3N0L2ludGVybGVhdmUvTWFrZWZpbGUuYW06CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmg6CisJKiBnc3QvaW50ZXJsZWF2ZS9wbHVnaW4uYzoKKwkqIGdzdC9pbnRlcmxlYXZlL3BsdWdpbi5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW50ZXJsZWF2ZS5jOgorCSAgaW50ZXJsZWF2ZTogcG9ydCB0byAwLjExCisJICBQb3J0IG9mIHRoZSBpbnRlcmxlYXZlIGVsZW1lbnQgYW5kIGl0cyB1bml0dGVzdHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY5NjQzCisKKzIwMTItMDItMTYgMTQ6MjM6NTAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMi0wMi0xNiAxNzoxNDoyMCArMDgwMCAgR2FyeSBDaGluZy1QYW5nIExpbiA8Y2hpbmdwYW5nQGdtYWlsLmNvbT4KKworCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSAgdjRsMnNyYzogZmFpbHVyZSB0byBxdWVyeSBzb21lIG9wdGlvbmFsIGNvbnRyb2xzIGlzIG5vdCBhIGZhdGFsIGVycm9yCisJICBEb24ndCBwb3N0IGEgKGZhdGFsKSBlcnJvciBtZXNzYWdlIG9uIHRoZSBidXMganVzdCBiZWNhdXNlIHdlCisJICBmYWlsZWQgdG8gcXVlcnkgc29tZSBjb250cm9sLiBGaXhlcyBpc3N1ZSB3aXRoIGJ1aWx0LWluCisJICBTdXlpbiBDb3JwIHdlYmNhbSBmb3IgSFAgbm90ZWJvb2sgKHVzYmlkIDA2NGU6ZTI4YSkgb24KKwkgIE9wZW5TdXNlIDEyLjEsIHdoZXJlIHF1ZXJ5aW5nIHJlZC9ibHVlIGJhbGFuY2UgZmFpbHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjcwMTk3CisKKzIwMTItMDItMTYgMTI6NTk6MTAgKzAwMDAgIFR1dWtrYSBQYXNhbmVuIDx0dXVra2EucGFzYW5lbkBpbG1pLmZpPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyc3JjOiBmaXggZm9yIHdlYmNhbXN0dWRpbyB2bG9vcGJhY2sKKwkgIEJlY2F1c2Ugdmxvb2JhY2sgZW1pdHMgMjUgLSBFTk9UVFkgYW5kIG5vIEVJTlZBTCB2NGwyc3JjIHRob3VnaHQgaXQKKwkgIGNhbid0IGhhbmRsZSB0aGlzIGFuZCBkb2VzIG5vdCB3b3JrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2OTQ1NQorCisyMDEyLTAyLTE2IDExOjIxOjI4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGRlY2xhcmUgdmFyaWFibGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJsb2NrCisJICBJdCdzIGhvdyB3ZSByb2xsLiBGaXhlcyAnSVNPIEM5MCBmb3JiaWRzIG1peGVkIGRlY2xhcmF0aW9ucyBhbmQgY29kZScKKwkgIGNvbXBpbGVyIHdhcm5pbmcuCisKKzIwMTItMDItMTUgMjM6NTU6NDQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9NYWtlZmlsZS5hbToKKwkgIGV4YW1wbGVzOiBmaXggc3BlY3RydW0gZXhhbXBsZSBidWlsZCBpc3N1ZXMKKwkgIEZpbmQgZmZ0IGhlYWRlcnMgaW4gdW5pbnN0YWxsZWQgc2V0dXAsIGZpeCBMSUJTIG9yZGVyLgorCisyMDEyLTAyLTE1IDEyOjQxOjQzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogcmVtb3ZlIHNvbWUgdW51c2VkIGRlY2xhcmF0aW9ucworCisyMDEyLTAyLTE1IDExOjI1OjQ1ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tYXVkaW90ZXN0LmM6CisJICBzcGVjdHJ1bS1kZW1vOiBzaG93IHRoZSBlZmZlY3Qgb2YgZmFzdC1tb2RlCisKKzIwMTItMDItMTQgMTI6MjY6MzcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmM6CisJICBhc3BlY3RyYXRpb2Nyb3A6IGZpeCBjYXBzIHJlZmNvdW50CisKKzIwMTItMDItMTQgMTE6MjI6NDYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy9lZmZlY3R2LmM6CisJICB0ZXN0czogZml4IHRlc3QsIHVzZSB2aWRlb2NvbnZlcnQKKworMjAxMi0wMi0xNCAxMDo1MTozOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvZmxhY3BhcnNlLmMKKworMjAxMi0wMi0wOSAxMzo0MTo1MyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IGFkanVzdCB0byBtb2RpZmllZCBiYXNlcGFyc2UgQVBJCisKKzIwMTItMDItMTMgMTc6MTM6MTcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIHVwZGF0ZSBmb3IgbWVtb3J5IGFwaSBjaGFuZ2UKKworMjAxMi0wMi0xMyAxMjowNjozNyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsYWNwYXJzZS5jOgorCSAgdGVzdHM6IGZsYWNwYXJzZTogY2hlY2sgYW5kIGNvbXBhcmUgaW50ZW5kZWQgZGF0YQorCisyMDEyLTAyLTEyIDE3OjAzOjM3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgcmVtb3RlLXRyYWNraW5nIGJyYW5jaCAnb3JpZ2luL21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBleHQvdGFnbGliL2dzdGFwZXYybXV4LmNjCisJICBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjCisJICBleHQvdGFnbGliL2dzdHRhZ2xpYm11eC5jCisJICBleHQvdGFnbGliL2dzdHRhZ2xpYm11eC5oCisKKzIwMTItMDItMTIgMTY6MjI6MjEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdGFnbGliL01ha2VmaWxlLmFtOgorCSogZXh0L3RhZ2xpYi9nc3RhcGV2Mm11eC5jYzoKKwkqIGV4dC90YWdsaWIvZ3N0YXBldjJtdXguaDoKKwkqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJKiBleHQvdGFnbGliL2dzdGlkM3YybXV4Lmg6CisJKiBleHQvdGFnbGliL2dzdHRhZ2xpYm11eC5jOgorCSogZXh0L3RhZ2xpYi9nc3R0YWdsaWJtdXguaDoKKwkqIGV4dC90YWdsaWIvZ3N0dGFnbGlicGx1Z2luLmM6CisJICB0YWdsaWI6IHBvcnQgdG8gR3N0VGFnTXV4IGJhc2UgY2xhc3MKKworMjAxMi0wMi0xMiAxMjoyNDo1MCArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4LmM6CisJICB0YWdsaWI6IGZpbmlzaCBvZmYgYSBmZXcgbWlzc2VkIHZhcmlhYmxlIGNoYW5nZXMKKwkgIExvY2FsIHZhcmlhYmxlcyBhcmUgbm93IHVudXNlZCwgYW5kIHRoZSB2YWx1ZXMgZnJvbSB0aGUgc2VnbWVudCBjb3B5CisJICBhcmUgdXNlZCBpbnN0ZWFkLCBzbyByZW1vdmUgdGhlIG5vdyB1c2VsZXNzIGxvY2FsIHZhcmlhYmxlcyBhbmQgd3JpdGUKKwkgIHRvIHRoZSBzZWdtZW50IHdoZXJlIGFwcHJvcHJpYXRlLgorCisyMDEyLTAyLTEwIDE2OjIzOjE0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBleHQvZmxhYy9nc3RmbGFjZW5jLmMKKwkgIGV4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5jCisJICBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmMKKwkgIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jCisJICBleHQvcHVsc2UvcGx1Z2luLmMKKwkgIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmMKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYworCSAgZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmMKKworMjAxMi0wMi0wOCAyMzowMzoyOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwaDI2NHBheTogYWRkIHN0cmVhbS1mb3JtYXQgYW5kIGFsaWdubWVudCB0byBoMjY0IHNpbmsgY2FwcworCSAgV2UncmUgaGFwcHkgdG8gYWNjZXB0IGJvdGggYnl0ZS1zdHJlYW0gYW5kIGF2YywgYWR2ZXJ0aXNlCisJICB0aGF0IG9uIHRoZSBzaW5rIGNhcHMgYW5kIGZpeCB1cCBfZ2V0X2NhcHMoKSBmdW5jdGlvbiB0bworCSAgbm90IGp1c3QgcmV0dXJuICJ2aWRlby94LWgyNjQiLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYwNjY2MgorCisyMDEyLTAyLTA4IDIwOjU4OjA0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIHJ0cGgyNjRkZXBheTogYWRkIHN0cmVhbS1mb3JtYXQgYW5kIGFsaWdubWVudCBmaWVsZHMgdG8gc3JjIHRlbXBsYXRlIGNhcHMKKwkgIEJlY2F1c2Ugd2UgY2FuLiBBbmQgc28gd2UgZ2V0IGEgd2FybmluZyBpZiB3ZSB0cnkgdG8gb3V0cHV0IGF2YyB3aXRoCisJICBuYWwgYWxpZ25tZW50IG9yIHNvbWVzdWNoLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYwNjY2MgorCisyMDEyLTAyLTEwIDEzOjQ0OjQzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHRlc3RzOiBjbGVhbiB1cCBydHAtcGF5bG9hZGluZyB0ZXN0IGEgbGl0dGxlCisJICBGZWVkIGRhdGEgaW50byB0aGUgcGlwZWxpbmUgdXNpbmcgYXBwc3JjIGluc3RlYWQgb2YgZmRzcmMgYW5kCisJICBhIHBpcGUuIFN0b3JlIHVuc2lnbmVkIGJ5dGUgdmFsdWVzIGluIGd1aW50OCBpbnN0ZWFkIG9mIGNoYXIuCisJICBHZXR0aW5nIHJpZCBvZiB0aGUgY2Fwc2ZpbHRlciBhbHNvIGhlbHBzIHRvIGF2b2lkICdmb3JtYXQgaXMKKwkgIG5vdCBmdWxseSBzcGVjaWZpZWQnIHdhcm5pbmdzIHdoZW4gcHVzaGluZyAidmlkZW8veC1oMjY0IiBkYXRhCisJICBpbnRvIHJ0cGgyNjRwYXkgd2l0aCBmdWxseSBzcGVjaWZpZWQgaDI2NCBjYXBzIGluIHRoZSBzaW5rIHRlbXBsYXRlLgorCisyMDEyLTAyLTEwIDEwOjA3OjM0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHY6IHVzZSBkZWZhdWx0IHBhZCBxdWVyeQorCSAgV2UgbmVlZCB0byBjaGFpbiB1cCB1bmtub3duIHF1ZXJpZXMgdG8gdGhlIGRlZmF1bHQgcXVlcnkgaGFuZGxlciBpbnN0ZWFkIG9mCisJICBibGluZGx5IGZvcndhcmRpbmcgdGhlbS4gSW4gdGhpcyBjYXNlIGl0IGNhdXNlZCB0aGUgY2FwcyBxdWVyeSB0byBiZSBmb3J3YXJkZWQKKwkgIHRvIHRoZSB1cHN0cmVhbSB0eXBlZmluZCBhbmQgcmV0dXJuIHRoZSB3cm9uZyB0eXBlIGZvciB0aGUgYXVkaW8vdmlkZW8gcGFkLgorCisyMDEyLTAyLTA5IDIyOjEyOjE0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIHRlc3RzOiBtcGVnYXVkaW9wYXJzZTogcmVtb3ZlIHN0cmF5IGRlY2xhcmF0aW9uCisKKzIwMTItMDItMDkgMjI6MDc6NDggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogY29ycmVjdGx5IHNldCBBRElGIHNyYyBjYXBzCisKKzIwMTItMDItMDkgMjI6MTA6MDcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJICBhYzNwYXJzZTogcHJldmVudCBhIGZldyBkaXJlY3QgZXhpdHMgd2l0aG91dCBjbGVhbnVwCisKKzIwMTItMDItMDkgMjI6MDc6MTggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBmbGFjZGVjOiBzaGlmdCBpbiBwcm9wZXIgZGlyZWN0aW9uIGZvciBhdWRpbyBzYW1wbGUgY29udmVyc2lvbgorCisyMDEyLTAyLTA5IDE4OjA5OjQ1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGVhdmUuYzoKKwkgIHRlc3RzOiBmaXggY29tcGlsYXRpb24KKworMjAxMi0wMi0wOSAxMDoxMTo0OCArMDEwMCAgTWFyYyBMZWVtYW4gPG1hcmMubGVlbWFuQGdtYWlsLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpdWRwc2luazogdHlwbyBmaXggKGJ5dGVzIHNlbmQgLT4gYnl0ZXMgc2VudCkKKworMjAxMi0wMi0wOCAxNjozNDowMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6CisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRmaWxlc3JjLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSAgR1NUX0ZMT1dfV1JPTkdfU1RBVEUgLT4gR1NUX0ZMT1dfRkxVU0hJTkcKKworMjAxMi0wMi0wOCAxNjozNzoxMyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgR1NUX0ZMT1dfV1JPTkdfU1RBVEUgLT4gR1NUX0ZMT1dfRkxVU0hJTkcKKworMjAxMi0wMi0wNyAxNDoxMDo0NCAtMDgwMCAgUmFscGggR2lsZXMgPGdpbGVzQG1vemlsbGEuY29tPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSAgc2hvdXQyc2VuZDogc2VuZCB2aWRlby93ZWJtIHRocm91Z2ggbGlic2hvdXQuCisJICBUaGlzIHJlcXVpcmVzIFNIT1VUX0ZPUk1BVF9XRUJNLCBhZGRlZCBpbiBsaWJzaG91dCAyLjMuMCwKKwkgIHNvIHZpZGVvL3dlYm0gc3VwcG9ydCBpcyBjb250aW5nZW50IG9uIHRoYXQgc3ltYm9sIGJlaW5nCisJICBkZWZpbmVkLgorCSAgQWxzbyBhbiBpbmRlbnRhdGlvbiBjaGFuZ2UgcmVxdWlyZWQgYnkgdGhlIHByZS1jb21taXQgaG9vay4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Njk1OTAKKworMjAxMi0wMS0zMCAxNjo0MDoxOSArMDEwMCAgUGhpbGlwcGUgTm9ybWFuZCA8cGhpbG5AaWdhbGlhLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2ludGVybGVhdmUvTWFrZWZpbGUuYW06CisJKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5oOgorCSogZ3N0L2ludGVybGVhdmUvcGx1Z2luLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9wbHVnaW4uaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOgorCSAgZGVpbnRlcmxlYXZlOiBwb3J0IHRvIDAuMTEKKwkgIFBvcnQgb2YgdGhlIGRlaW50ZXJsZWF2ZSBlbGVtZW50IGFuZCBpdHMgdW5pdHRlc3RzLiBUaGUgaW50ZXJsZWF2ZQorCSAgZWxlbWVudCB3aWxsIGJlIHBvcnRlZCBhcyBwYXJ0IG9mIGFub3RoZXIgcGF0Y2gsIGhlbmNlIGRpc2FibGluZyBpdAorCSAgZm9yIG5vdy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Njg4NDcKKworMjAxMi0wMi0wNyAyMzo0MToxMyArMDIwMCAgUmFpbW8gSsOkcnZpIDxyYWltby5qYXJ2aUBnbWFpbC5jb20+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuaDoKKwkgIGRpcmVjdHNvdW5kc2luazogRml4IGNvbXBpbGluZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2OTYwNworCisyMDEyLTAyLTA4IDAwOjA4OjQ5ICswMjAwICBSYWltbyBKw6RydmkgPHJhaW1vLmphcnZpQGdtYWlsLmNvbT4KKworCSogc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5jOgorCSAgd2F2ZWZvcm1zaW5rOiBQb3J0IHRvIDAuMTEKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Njk2MTIKKworMjAxMi0wMi0wNyAyMTo1Nzo0NyArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvY2xpZW50LmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgIGphY2s6IHJld29yayB0cmFuc3BvcnQgc3VwcG9ydAorCSAgTW92ZSBjb21tb24gY29kZSB0byBqYWNrY2xpZW50LiBUaGVyZSB3ZSBjYW4gYWxzbyBoYW5kbGUgdGhlIHJlcXVlc3Qgc3RhdGUKKwkgIG1lc3NhZ2UgaW4gYSBiZXR0ZXIgd2F5LCBhcyB0aGUgZWxlbWVudCBjYWxsYmFja3MgYXJlIG9ubHkgcnVuIGlmIHRoZSBlbGVtZW50IGlzCisJICBhY3RpdmUuCisKKzIwMTItMDItMDcgMTA6NDc6MTkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FwZXYybXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDN2Mm11eC5jOgorCSAgdGVzdHM6IGltcHJvdmUgdGFnbXV4IHRlc3RzCisKKzIwMTItMDItMDcgMTA6Mjk6MTEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4LmM6CisJICB0YWdsaWI6IGZpeCBvYmplY3QgcmVnaXN0cmF0aW9uCisJICBXZSBjYW4ndCB1c2UgR19ERUZJTkVfVFlQRSBiZWNhdXNlIHRoZSBjbGFzcyBpcyBub3Qgc2V0IGluIHRoZSBjbGFzc19pbml0IGFuZCB3ZQorCSAgbmVlZCBpdCB0byBnZXQgdGhlIHNyY3BhZCB0ZW1wbGF0ZS4KKwkgIEZpeCBhIGNhcHMgbGVhaworCisyMDEyLTAyLTA3IDEwOjE2OjMyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9qcGVnZW5jLmM6CisJICB0ZXN0czogZml4IGpwZWcgdGVzdAorCisyMDEyLTAyLTA3IDEwOjE1OjUxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cDogZml4IGNhcHMKKworMjAxMi0wMi0wNyAwOTo1NDowMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5jOgorCSAgZWZmZWN0dHY6IGZpeCBpbml0aWFsaXNhdGlvbgorCisyMDEyLTAyLTA3IDA5OjQyOjA0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgeTRtOiBmaXggbmVnb3RpYXRpb24KKworMjAxMi0wMi0wNyAwOTo0MTo1MSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9maWx0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3k0bWVuYy5jOgorCSAgdGVzdHM6IGZpeCBtb3JlIHRlc3RzCisKKzIwMTItMDItMDYgMjI6MTM6NTMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvZHYvTWFrZWZpbGUuYW06CisJKiBleHQvZHYvZ3N0ZHZkZWMuYzoKKwkqIGV4dC9kdi9nc3RkdmRlYy5oOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9kdi9nc3RkdmRlbXV4Lmg6CisJICBkdjogcG9ydCB0byAwLjExCisKKzIwMTItMDItMDYgMTg6MzU6MDEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnbGltaXRlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmd2b2x1bWUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwZWN0cnVtLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2Nyb3AuYzoKKwkgIHRlc3Q6IGZpeCBtb3JlIHRlc3RzCisKKzIwMTItMDItMDYgMTU6NTI6NDkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM2RlbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsdGlmaWxlLmM6CisJICB0ZXN0czogZml4IG1vcmUgdGVzdHMKKworMjAxMi0wMi0wNiAxNTo1MjozNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHY6IGZpeCBjYXBzCisKKzIwMTItMDItMDYgMTU6MjA6NTUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9lcXVhbGl6ZXIuYzoKKwkgIGlpcmVxdWFsaXplcjogZml4IGVxdWFsaXplciBhbmQgdW5pdCB0ZXN0CisKKzIwMTItMDItMDYgMTM6NDQ6MjAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvcGFub3JhbWEuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvd3NpbmNiYW5kLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jbGltaXQuYzoKKwkgIHRlc3RzOiBmaXggc29tZSBtb3JlIHRlc3RzCisKKzIwMTItMDItMDYgMTM6NDM6NDkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IHRha2UgdGhlIHBhZCBmcm9tIGNvbGxlY3RwYWRzMiBjb3JyZWN0bHkKKworMjAxMi0wMi0wNiAxMzoyOToyNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9paXJmaWx0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvaW52ZXJ0LmM6CisJICB0ZXN0czogZml4IG1vcmUgdW5pdCB0ZXN0cworCisyMDEyLTAyLTA2IDEzOjI4OjU1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2R5bmFtaWMuYzoKKwkgIGF1ZGlvZHluYW1pYzogZml4IG5lZ290aWF0aW9uCisKKzIwMTItMDEtMjggMTE6MTM6MTYgKzAxMDAgIE5pY29sYSBNdXJpbm8gPG5pY29sYS5tdXJpbm9AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGF2b2lkIHBvc3RpbmcgaW52YWxpZCBkdXJhdGlvbiBmb3IgZWFjaCBmcmFtZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NjU4MworCisyMDEyLTAyLTA2IDEwOjA3OjA2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2FtcGxpZnkuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYmJhbmQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYmxpbWl0LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2R5bmFtaWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZWNoby5jOgorCSAgdGVzdHM6IGZpeCBtb3JlIHRlc3RzCisKKzIwMTItMDItMDYgMDk6NDk6MzggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FzcGVjdHJhdGlvY3JvcC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jOgorCSAgdGVzdHM6IGltcHJvdmUgc29tZSB0ZXN0cworCisyMDEyLTAyLTA2IDA5OjIzOjQ5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHRlc3RzOiBmaXggaml0dGVyYnVmZmVyIHRlc3QKKworMjAxMi0wMi0wNiAwOToyMzowNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGZpeCBjYXBzIGFmdGVyIHB0IGNoYW5nZQorCisyMDEyLTAyLTA2IDA5OjE4OjE3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogZml4IGNhcHMgbGVhaworCisyMDEyLTAyLTAzIDIyOjA1OjU5ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3BsdWdpbi5jOgorCSAgcHVsc2VhdWRpb3Npbms6IExvd2VyIHJhbmsgdG8gcHJldmVudCBhdXRvcGx1Z2dpbmcKKwkgIHB1bHNlYXVkaW9zaW5rIGJyZWFrcyB2aXN1YWxpc2F0aW9ucyBpbiBpdHMgY3VycmVudCBmb3JtLCBzbyBsZXQncworCSAgcHJldmVudCBpdCBmcm9tIGJlaW5nIGF1dG9wbHVnZ2VkIGZvciB0aGUgdGltZSBiZWluZy4KKwkgIFRoZSBiZXN0IHdlIGNhbiBob3BlIHRvIGRvIGluIHRoZSAwLjEwIHNlcmllcyBpcyBxdWVyeSB0aGUgbGlzdCBvZgorCSAgYXZhaWxhYmxlIHNpbmtzIGFuZCB0aGVpciBmb3JtYXRzLCBhbmQgZXhwb3NlIHRoZXNlIGFzIHRoZSBiaW4ncyBzaW5rcGFkCisJICBjYXBzLiBXaGlsZSB0aGlzIGlzIG5vdCBhIGNvbXByZWhlbnNpdmUgc29sdXRpb24sIGl0IHdpbGwgbWFrZSBzdXJlIHRoYXQKKwkgIHdlJ3JlIG9ubHkgdHJ5aW5nIHRvIHN1cHBvcnQgY29tcHJlc3NlZCBmb3JtYXRzIGlmIHdlJ3JlIGNlcnRhaW4gdGhhdAorCSAgb25lIGV4aXN0cy4KKwkgIFRoZSBsb25nLXRlcm0gZml4IGZvciB0aGlzIHdpbGwgYmUgaW4gdGhlIGZvcm0gb2YgcHJvcGVyIHVwc3RyZWFtCisJICByZW5lZ290aWF0aW9uIHN1cHBvcnQgaW4gdGhlIDAuMTEvMS4wIHNlcmllcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjYzNjEKKworMjAxMi0wMi0wMyAxNzoyMzo0OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvY21tbGRlYy5jOgorCSAgdGVzdHM6IGZpeCBtb3JlIHRlc3RzCisKKzIwMTItMDItMDMgMTY6MTM6NTEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FwZXYybXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2ZpcmZpbHRlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9paXJmaWx0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM3YybXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbnRlcmxlYXZlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9wYXJzZXIuYzoKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZlbmMuYzoKKwkgIHRlc3RzOiBmaXggc29tZSBtb3JlIHRlc3RzCisKKzIwMTItMDItMDMgMTY6MTI6NTkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBmaXggc3JjcGFkIGNhcHMgaGFuZGxpbmcKKworMjAxMi0wMi0wMyAxNjoxMjoyNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOgorCSAgY21tbGVuYzogZml4IGNhcHMgaGFuZGxpbmcKKworMjAxMi0wMi0wMyAxNDo1MzozMSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IGZpeCBldmVudCBsZWFrIHdoZW4gdGhlcmUgaXMgbm8gcGVlciBvbiB0aGUgc3JjIHBhZAorCisyMDEyLTAyLTAyIDE2OjIxOjI5ICswMDAwICBDaHJpc3RpYW4gRnJlZHJpayBLYWxhZ2VyIFNjaGFsbGVyIDxjaHJpc3RpYW4uc2NoYWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBVcGRhdGUgc3BlYyBmaWxlCisKKzIwMTItMDItMDIgMTI6Mjc6MDkgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBzcGVjaWZ5IHdlIG9ubHkgYWNjZXB0IHJhdyBBQUMgaW4gdGVtcGxhdGUgY2FwcworCSAgTm8gaGVhZGVyIHNlZW1zIHRvIGJlIGFkZGVkLCBhbmQgdGhlIGNvZGVjIElEIGlzIHRoZSBzYW1lIGFzIHVzZWQKKwkgIGZvciByYXcgYnkgZmx2ZGVtdXgsIHNvIHJhdyBzZWVtcyB0aGUgb25seSBzdXBwb3J0ZWQgY2FzZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjUzOTQKKworMjAxMi0wMi0wMiAxMjoyNToyMSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBzcGVjaWZ5IHdlIG9ubHkgb3V0cHV0IHJhdyBBQUMgaW4gdGVtcGxhdGUgY2FwcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NTM5NAorCisyMDEyLTAyLTAxIDE4OjAxOjI3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L3RhZ2xpYi9nc3RhcGV2Mm11eC5jYzoKKwkqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJKiBleHQvdGFnbGliL2dzdHRhZ2xpYm11eC5jOgorCSogZXh0L3RhZ2xpYi9nc3R0YWdsaWJtdXguaDoKKwkgIHRhZ2xpYjogcG9ydCB0byAwLjExCisKKzIwMTItMDItMDEgMTY6NDA6NTEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvYW5ub2RleC9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb2Z4L01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL01ha2VmaWxlLmFtOgorCSAgYnVpbGQ6IGlnbm9yZSBHVmFsdWVBcnJheSBkZXByZWNhdGlvbiB3YXJuaW5ncyBmb3IgdGhlIHRpbWUgYmVpbmcKKwkgIHVudGlsIHRoaXMgZ2V0cyBzb3J0ZWQgb3V0IHdpdGggdGhlIEdMaWIgZm9sa3MgYW5kIHdlIGhhdmUgYQorCSAgdmlhYmxlIGFsdGVybmF0aXZlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NzIyOAorCisyMDEyLTAyLTAxIDE2OjM2OjUzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlcHJvYmUuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXByb2JlLmg6CisJICBwdWxzZTogZGlzYWJsZSBzb21lIHVudXNlZCBwcm9wZXJ0eSBwcm9iZSBjb2RlCisJICB3aGljaCB3YXMgdXNpbmcgR1ZhbHVlQXJyYXkKKworMjAxMi0wMi0wMSAxNjoxMToxNCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJICBzcGVleDogVXNlIG5ldyBhdWRpbyBlbmNvZGVyL2RlY29kZXIgYmFzZSBjbGFzcyBBUEkgZm9yIHNyY3BhZCBjYXBzCisKKzIwMTItMDItMDEgMTY6MDU6NTEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjOiBVc2UgbmV3IGF1ZGlvIGVuY29kZXIvZGVjb2RlciBiYXNlIGNsYXNzIEFQSSBmb3Igc3JjcGFkIGNhcHMKKworMjAxMi0wMS0zMSAxNTozOTowOSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZXF1YWxpemVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDNkZW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW50ZXJsZWF2ZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnbGltaXRlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmd2b2x1bWUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbi5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zaGFwZXdpcGUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwZWN0cnVtLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy91ZHBzcmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3k0bWVuYy5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL2ZsYWNkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZlbmMuYzoKKwkgIHRlc3RzOiBmaXggbW9yZSB0ZXN0cworCisyMDEyLTAxLTMwIDE0OjUyOjM3ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5LmM6CisJICBydHBtcDJ0cGF5OiBkbyBub3QgdHJ5IHRvIGZsdXNoIGEgcGFja2V0IHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Njg4NzQKKworMjAxMi0wMS0zMSAxMzo0MTo0NSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYWxwaGFjb2xvci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9jaGViYmFuZC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9jaGVibGltaXQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZmlyZmlsdGVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2lpcmZpbHRlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9pbnZlcnQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvd3NpbmNiYW5kLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jbGltaXQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZGVpbnRlcmxhY2UuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOgorCSAgdGVzdHM6IHVwZGF0ZSBzb21lIHRlc3RzIGZvciBuZXcgbWVtb3J5IGFwaQorCisyMDEyLTAxLTMxIDEyOjIyOjE5ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvY2FtY3RybC5jOgorCSAgY29udHJvbGxlcjogYWRhcHQgdG8gY29udHJvbC1zb3VyY2UgdHlwZSBjaGFuZ2VzCisKKzIwMTItMDEtMzAgMjE6Mzk6MzQgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3NoYXBld2lwZS9zaGFwZXdpcGUtZXhhbXBsZS5jOgorCSogdGVzdHMvZXhhbXBsZXMvdjRsMi9jYW1jdHJsLmM6CisJICBjb250cm9sbGVyOiByZW5hbWUgY29udHJvbC1iaW5kaW5ncworCSAgZ3N0X2NvbnRyb2xfYmluZGluZ194eHggLT4gZ3N0X3h4eF9jb250cm9sX2JpbmRpbmcgZm9yIGNvbnNpc3RlbmN5LgorCisyMDEyLTAxLTMwIDE3OjE2OjUxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvYW5ub2RleC9nc3RjbW1sZW5jLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZGVjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZW5jLmM6CisJICB1cGRhdGUgZm9yIEhFQURFUiBmbGFnCisKKzIwMTAtMDYtMTEgMDg6MzY6MzMgKzAyMDAgIFBhc2NhbCBCdWhsZXIgPHBhc2NhbC5idWhsZXJAdGFuZGJlcmcuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgcnRwaDI2NGRlcGF5OiBFeGNsdWRlIE5BTHUgc2l6ZSBmcm9tIHBheWxvYWQgbGVuZ3RoIG9uIHRydW5jYXRlZCBwYWNrZXRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2Nzg0NgorCisyMDEyLTAxLTI4IDIzOjM1OjUwICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHJlbW92ZSBvYnNvbGV0ZSB2YXJpYWJsZSwgc2V0IGJ1dCBub3QgdXNlZAorCSAgUmVwb3J0ZWQgYnkgYW5kcmVkaWViIG9uICNnc3RyZWFtZXIuCisKKzIwMTItMDEtMjggMTM6MDU6MDkgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBhdm9pZCB3cmFwcGluZyBvcGFxdWUgdG8gdHJhbnNwYXJlbnQKKworMjAxMi0wMS0yOCAxMjozNToxMyArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBkbyBub3QgZnJlZSBtZW1vcnkgdHdpY2UKKwkgIEEgcmVjZW50IGNoYW5nZSB0byBmaXggbGVha2luZyBjb2RlYyBJRCBzdHJpbmcgYWNjaWRlbnRhbGx5IGNhdXNlZAorCSAgb25lIG9mIHRoZSB2ZXJ5IGZldyBwbGFjZXMgdGhhdCB3ZXJlbid0IGxlYWtpbmcgdG8gbm93IGZyZWUgdHdpY2UuCisKKzIwMTItMDEtMjcgMTY6Mjc6NDkgKzAxMDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkgIGFsYXdkZWM6IEVhY2ggb3V0cHV0IHNhbXBsZSBpcyAyIGJ5dGVzCisKKzIwMTItMDEtMjcgMTI6MTQ6NDkgKzAxMDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBEb24ndCBsZWFrIGNhcHMgZXZlbnQgd2hlbiBub3QgcHVzaGluZworCisyMDEyLTAxLTI3IDEyOjA0OjUzICswMTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJICBydHBwdGRlbXV4OiBGb3J3YXJkIHN0aWNreSBldmVudHMKKworMjAxMi0wMS0yNyAxMjowNDowNSArMDEwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSAgcnRwcHRkZW11eDogUHJvdGVjdCBhbGwgdXNlcyBwYWQgbGlzdCB3aXRoIE9CSkVDVCBMT0NLCisJICBBY3R1YWxseSBwcm90ZWN0IHRoZSBlbnRpcmUgcGFkIGxpc3QgYW5kIHVzZSBpdCBpbiBhIHRocmVhZCBzYWZlCisJICB3YXkuCisKKzIwMTItMDEtMjcgMTI6MDI6MjUgKzAxMDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgcnRwc3NyY2RlbXV4OiBGb3J3YXJkIHN0aWNreSBldmVudHMgdG8gbmV3IHBhZHMKKworMjAxMi0wMS0yNyAxMjowMTo0MCArMDEwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICBydHBzc3JjZGVtdXg6IEFkZCBzc3JjIHRvIGZvcndhcmRlZCBDQVBTIGV2ZW50cworCSAgQWxzbyBpdGVyYXRlIHRoZSBsaXN0IG9mIEdzdFJ0cFNzcmNEZW11eFBhZCBzYWZlbHkKKworMjAxMi0wMS0yNyAxMTo1OTowOCArMDEwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICBydHBzc3JjY2RlbXV4OiBGYWN0b3Igb3V0IGdldHRpbmcgZHBhZCBieSBwYWQKKworMjAxMi0wMS0yNiAxODozNTo0OCArMDEwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogS2VlcCB0aGUgYnVmZmVyIG1hcHBlZCB3aGlsZSBpdCBpcyBiZWluZyBtb2RpZmllZAorCisyMDEyLTAxLTI2IDE4OjM1OjI3ICswMTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgcnRwc2Vzc2lvbjogSW5pdGlhbGlzZSB0aGUgYWRkcmVzcyBwb2ludGVyIHRvIE5VTEwKKworMjAxMi0wMS0yNyAxMjowNzo0MyArMDEwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZmRldGVjdC5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJICBkdG1mOiBVc2UgbmV3LXN0eWxlIGNhcHMKKworMjAxMi0wMS0yNyAxNjozNzoxOSArMDEwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDxhbW9yYWxlc0BmbHVtb3Rpb24uY29tPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmg6CisJICBkaXJlY3NvdW5kc2luazogUG9ydCBlbGVtZW50IHRvIDAuMTEKKworMjAxMi0wMS0yNiAxOTo0ODoxNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXIyOiByZW1vdmUgcGFkIGV2ZW50IGZ1bmN0aW9uCisJICBXZSB1c2UgdGhlIG9uZSBmcm9tIGNvbGxlY3RwYWRzCisKKzIwMTItMDEtMjYgMTg6MjY6MDIgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIFJldmVydCAicXRkZW11eDogZml4IEdzdERhdGVUaW1lL0dEYXRlVGltZSBtaXh1cCIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgNTMyNjEyNjExMjBiNGMwMDhkZTYxNjkxYzcwZTk0MzU0YjI4MDA0YS4KKwkgIFRoZSBHc3REYXRlVGltZS0+R0RhdGVUaW1lIGNoYW5nZSBpbiBjb3JlIHdhcyBhcHBhcmVudGx5IGFjY2lkZW50YWwsCisJICBhbmQgaXMgbm93IHJldmVydGVkLgorCisyMDEyLTAxLTI2IDE4OjI1OjIxICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgUmV2ZXJ0ICJhdmlkZW11eDogZml4IEdzdERhdGVUaW1lL0dEYXRlVGltZSBtaXh1cCIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgYWNjOWYxNTA5NjhiMjVjNWFlNWE2OTQwYjM0YWQyZDUxYjE3NGZkMi4KKwkgIFRoZSBHc3REYXRlVGltZS0+R0RhdGVUaW1lIGNoYW5nZSBpbiBjb3JlIHdhcyBhcHBhcmVudGx5IGFjY2lkZW50YWwsCisJICBhbmQgaXMgbm93IHJldmVydGVkLgorCisyMDEyLTAxLTI2IDE3OjUwOjMwICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGZpeCBHc3REYXRlVGltZS9HRGF0ZVRpbWUgbWl4dXAKKwkgIFRoaXMgaXMgYSBibGluZCBmaXggdG8gbWF0Y2ggdGhlIG9uZSBJIGp1c3QgbWFkZSB0byBxdGRlbXV4LAorCSAgYXMgSSBkbyBub3QgaGF2ZSBhbiBBVkkgZmlsZSB3aGVyZSB0aGUgY29kZSBnZXRzIGV4ZWN1dGVkLgorCisyMDEyLTAxLTI2IDE3OjQ3OjI5ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggR3N0RGF0ZVRpbWUvR0RhdGVUaW1lIG1peHVwCisKKzIwMTItMDEtMjYgMTg6NTE6MzAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBtb3JlIGZpeGVzCisKKzIwMTItMDEtMjYgMTg6NDM6MDYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBtYWtlIHZpZGVvbWl4ZXIgd29yayBzb21ld2hhdAorCisyMDEyLTAxLTI2IDE4OjE1OjUxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuaDoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5oOgorCSAgdmlkZW9taXhlcjogcG9ydCB0byAwLjExCisJICBJdCBidWlsZHMgYW5kIGdzdC1pbnNwZWN0LTAuMTEgd29ya3MuLiBvdGhlcndpc2UgdW50ZXN0ZWQKKworMjAxMi0wMS0yNiAxNTo0ODowMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSAgZHludWRwc2luazogZml4IGdldC1zdGF0cyBzaWduYWwgcmVnaXN0cmF0aW9uIHNvbWUgbW9yZQorCisyMDEyLTAxLTI2IDE1OjQ2OjEzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIFJldmVydCAidWRwOiBtYXJrIGFjdGlvbiBzaWduYWxzIGFzIFJVTl9GSVJTVCIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgNWM4MzA4NTk5MTI5ZDllMTYwNmVlZGIyZDM1NDM2MTc2NThkYzMwNi4KKworMjAxMi0wMS0yNiAxNTozOTozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICB1ZHA6IG1hcmsgYWN0aW9uIHNpZ25hbHMgYXMgUlVOX0ZJUlNUCisKKzIwMTItMDEtMjYgMTU6Mzc6MjMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkgIHVkcDogbWFyayAiZ2V0LXN0YXRzIiBhcyBhY3Rpb24gc2lnbmFsCisKKzIwMTItMDEtMjYgMTU6MzA6NDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5oOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIHVkcDogZml4IGdldC1zdGF0cyBhY3Rpb24gc2lnbmFsIHJlZ2lzdHJhdGlvbgorCSAgSXQgcmV0dXJucyBhIEdzdFN0cnVjdHVyZSBub3csIG5vdCBhIEdWYWx1ZUFycmF5CisKKzIwMTItMDEtMjYgMTY6MDU6MzQgKzAxMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8YW1vcmFsZXNAZmx1bW90aW9uLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogZml4IHByaW50IGZvcm1hdAorCisyMDEyLTAxLTI2IDExOjUwOjE5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkgIG1hdHJvc2thbXV4OiBGaXggc2l6ZSBvZiBvdXRwdXQgYnVmZmVycworCisyMDEyLTAxLTI2IDExOjMzOjA3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogaW5jbHVkZSByaWdodCBjb2xsZWN0cGFkcyB2ZXJzaW9uCisKKzIwMTItMDEtMjYgMTE6Mjk6MTEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IFByb3Blcmx5IHVzZSB0aGUgYWxpZ25tZW50IHBhcmFtZXRlciBvZiBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSgpCisJICBJdCdzIGEgYml0bWFzayBmb3IgdGhlIGFsaWdubWVudCwgbm90IHRoZSBhbGlnbm1lbnQgaXRzZWxmLgorCisyMDEyLTAxLTI2IDExOjE4OjQwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkgIG1hdHJvc2thbXV4OiBQcm9wZXJseSB1bm1hcCBXUklURSBtYXBzIG9mIHRoZSBvdXRwdXQgYnVmZmVycworCisyMDEyLTAxLTI2IDEwOjQ0OjI4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXIyOiBVcGRhdGUgZm9yIHRoZSBuZXcgY29sbGVjdHBhZHMyIGV2ZW50IGhhbmRsaW5nIEFQSQorCisyMDEyLTAxLTI2IDEwOjQwOjA2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IFVwZGF0ZSBmb3IgdGhlIG5ldyBjb2xsZWN0cGFkczIgZXZlbnQgaGFuZGxpbmcgQVBJCisKKzIwMTItMDEtMjYgMTA6Mzc6NTIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogVXBkYXRlIGZvciB0aGUgbmV3IGNvbGxlY3RwYWRzMiBldmVudCBoYW5kbGluZyBBUEkKKworMjAxMi0wMS0yNiAxMDoyODo1MSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IFVwZGF0ZSBmb3IgbmV3IGNvbGxlY3RwYWRzMiBldmVudCBoYW5kbGluZyBBUEkKKworMjAxMi0wMS0yNiAxMDoyNzo0MCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IFVwZGF0ZSBmb3IgbmV3IGNvbGxlY3RwYWRzMiBldmVudCBoYW5kbGluZyBBUEkKKworMjAxMi0wMS0yNSAxODo0MTozOCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBPbmx5IGZvcndhcmQgdGhlIGV2ZW50IHdoZW4gd2UgZGlkbid0IGhhbmRsZSBpdCBvdXJzZWx2ZXMKKworMjAxMi0wMS0yNSAxODo0MDowMyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMnBhZC5oOgorCSAgdmlkZW9taXhlcjogc29tZSBtb3JlIHBvcnRpbmcKKworMjAxMi0wMS0yNSAxODowMDo1MiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kLmg6CisJICB2aWRlb21peGVyOiBwb3J0IGJsZW5kIGZ1bmN0aW9uCisKKzIwMTItMDEtMjUgMTY6NTg6MTIgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHY6IEZpeCB1bml0aWFsaXplZCB2YXJpYWJsZXMKKwkgIChvciByYXRoZXIgY2lyY3VtdmVudCBpc3N1ZXMgd2l0aCBuYWl2ZSBjb21waWxlcnMgLi4uKQorCisyMDEyLTAxLTI1IDE1OjIxOjQ0ICswMDAwICBKYXlha3Jpc2huYW4gTSA8amF5LmtyaXNobmFubUBnbWFpbC5jb20+CisKKwkqIGV4dC9jYWlyby9NYWtlZmlsZS5hbToKKwkgIGNhaXJvOiBmaXggYnVpbGQsIG1ha2Ugc3VyZSBsaWJnc3R2aWRlbyBjYW4gYmUgZm91bmQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Njg2NDgKKworMjAxMi0wMS0yNSAxNDo1MDo1MCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZmRldGVjdC5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJICBwb3J0IHRvIG5ldyBtZW1vcnkgQVBJCisKKzIwMTItMDEtMjUgMTM6MTk6MTIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cG1hbmFnZXI6IGRvbid0IHByZXRlbmQgb3VyIHJhbmRvbSBob3N0bmFtZXMgYXJlIGZ1bGx5LXF1YWxpZmllZCBkb21haW4gbmFtZXMKKworMjAxMi0wMS0yNSAxMzo0NzozMCArMDEwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIChhdCkgYXBlc3RhYXJ0IChkb3QpIG9yZz4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGM0NjNiYzAgdG8gN2ZkYTUyNAorCisyMDEyLTAxLTI1IDEyOjQ5OjM0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICcwLjExJyBvZiBzc2g6Ly9naXQuZnJlZWRlc2t0b3Aub3JnL2dpdC9nc3RyZWFtZXIvZ3N0LXBsdWdpbnMtZ29vZCBpbnRvIDAuMTEKKworMjAxMi0wMS0yNSAxMjo0OToxMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIGV4dC9mbGFjL2dzdGZsYWNkZWMuYworCSAgZXh0L2pwZWcvZ3N0anBlZ2VuYy5jCisJICBleHQvcHVsc2UvcHVsc2VzaW5rLmMKKwkgIHN5cy92NGwyL2dzdHY0bDJzcmMuYworCisyMDEyLTAxLTI1IDEyOjQxOjQyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkgIHBuZzogcG9ydCB0byBuZXcgbWVtb3J5IEFQSQorCisyMDEyLTAxLTI1IDEyOjQxOjMwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thOiBwb3J0IHRvIG5ldyBtZW1vcnkgQVBJCisKKzIwMTItMDEtMjQgMTQ6Mzg6NTggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuYzoKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxlbmMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9wYXJzZXIuYzoKKwkgIG1vcmUgbWVtb3J5IEFQSSBwb3J0aW5nCisKKzIwMTItMDEtMjMgMTc6MjU6MzcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWlpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmM6CisJKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOgorCSogZ3N0L2RlYnVndXRpbHMvYnJlYWtteWRhdGEuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Rlc3RzLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOgorCSogZ3N0L2lzb21wNC9hdG9tc3JlY292ZXJ5LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJKiBnc3QvaXNvbXA0L2dzdHJ0cHhxdGRlcGF5LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOgorCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmg6CisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRmaWxlc3JjLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYzoKKwkqIGdzdC9ydHAvZ3N0YXN0ZXJpc2toMjYzLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkgIHVwZGF0ZSBmb3IgbmV3IG1lbW9yeSBBUEkKKworMjAxMi0wMS0yNSAxMToyMTo1MCArMDEwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZmRldGVjdC5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuaDoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIGR0bWY6IHBvcnQgdG8gMC4xMQorCisyMDEyLTAxLTI1IDExOjM4OjExICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDJhNTkwMTYgdG8gYzQ2M2JjMAorCisyMDEyLTAxLTI0IDE4OjI0OjEzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkgIHBuZ2VuYzogZGlzYWJseSBzbmFwc2hvdCBiZWhhdmlvdXIgYnkgZGVmYXVsdAorCSAgLi4uIHNpbmNlIHN1Y2ggYmVoYXZpb3VyIGlzIG5vdCBjb25zaXN0ZW50LCBpZiBhbGxvd2FibGUgYXQgYWxsLgorCisyMDEyLTAxLTI0IDE4OjIzOjIyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmg6CisJICBwbmdkZWM6IHBvcnQgdG8gMC4xMQorCisyMDEyLTAxLTI0IDE4OjIxOjA4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmg6CisJICBwbmdlbmM6IHBvcnQgdG8gMC4xMQorCisyMDEyLTAxLTI0IDE0OjUzOjM4ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogZml4IHN0cmluZyBsZWFrCisKKzIwMTItMDEtMjQgMTQ6NTI6MDkgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBmaXggdXNlIG9mIGZyZWVkIG1lbW9yeQorCisyMDExLTEyLTAxIDE1OjQ5OjQwICswMTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIERvbid0IGNyYXNoIG9uIGVtcHR5IGxhY2VzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY1MjI0CisKKzIwMTItMDEtMjMgMTM6MTU6NDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cG1hbmFnZXI6IGRvbid0IHJldmVhbCB0aGUgdXNlcidzIHVzZXJuYW1lLCBob3N0bmFtZSBvciByZWFsIG5hbWUgYnkgZGVmYXVsdAorCSAgU2VuZCBhIHJhbmRvbWx5IG1hZGUtdXAgdXNlckBob3N0bmFtZSBhcyBDTkFNRSBhbmQgZG9uJ3QKKwkgIHNlbmQgYSBOQU1FIGF0IGFsbCBieSBkZWZhdWx0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2ODMyMAorCisyMDEyLTAxLTIxIDIwOjA3OjU2ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvY2FtY3RybC5jOgorCSAgY29udHJvbGxlcjogbW92ZSBmcm9tIGNvbnRyb2wtYmluZGluZyB0byBjb250cm9sLWJpbmRpbmctZGlyZWN0CisKKzIwMTItMDEtMjIgMjM6MzE6MTkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QtbGlicy9nc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmxpbWl0Lmg6CisJKiBnc3QvYXVkaW9meC9hdWRpb2ZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9maXJmaWx0ZXIuaDoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaWlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNiYW5kLmg6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5oOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmg6CisJICBEb24ndCB1c2UgZGVwcmVjYXRlZCBHTGliIEFQSQorCisyMDEyLTAxLTIyIDIzOjE1OjE5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJKiBnc3QtbGlicy9nc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuaDoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkqIHRlc3RzL2ljbGVzL2VxdWFsaXplci10ZXN0LmM6CisJKiB0ZXN0cy9pY2xlcy9nZGtwaXhidWZzaW5rLXRlc3QuYzoKKwkqIHRlc3RzL2ljbGVzL3Rlc3Qtb3NzNC5jOgorCSogdGVzdHMvaWNsZXMvdjRsMnNyYy10ZXN0LmM6CisJKiB0ZXN0cy9pY2xlcy92aWRlb2Nyb3AtdGVzdC5jOgorCSAgVXNlIG5ldyBHTGliIEFQSSB1bmNvbmRpdGlvbmFsbHkKKworMjAxMi0wMS0yMCAxNzowNjo0MiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHNpbXBsaWZ5IGludGVybmFsIHNyYyBldmVudCBkZWJ1ZyBsb2dnaW5nCisJICAuLi4gd2hpY2ggYXZvaWRzIGFsbW9zdCBzdXBlcmZsdW91cyBvYnRhaW5pbmcgb2YgcnRzcCBlbGVtZW50LgorCisyMDEyLTAxLTIwIDE3OjAzOjUwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYXZvaWQgTlVMTCBzdHJpbmcgY29tcGFyaXNvbgorCisyMDEyLTAxLTIwIDE3OjAzOjIxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IGFycmFuZ2UgZm9yIGluaXRpYWxpemVkIHZhcmlhYmxlcworCisyMDEyLTAxLTIwIDE3OjAyOjE1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzoKKwkgIHJ0cG1wNGFkZXBheTogcHJldmVudCBvdXQtb2YtYm91bmQgYXJyYXkgYWNjZXNzCisKKzIwMTItMDEtMjAgMTc6MDE6MzcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L2F0b21zcmVjb3ZlcnkuYzoKKwkgIGlzb21wNDogcmVjb3Zlcnk6IGFkZCBzYW5pdHkgY2hlY2sKKwkgIC4uLiBvbiBwb3NzaWJseSBib2d1cy9jb3JydXB0IGlucHV0IGRhdGEuCisKKzIwMTItMDEtMjAgMTc6MDA6NTEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJICBydHB0aGVvcmFkZXBheTogcmVtb3ZlIGRlYWQgY29kZQorCisyMDEyLTAxLTIwIDE2OjU4OjI4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYS1kZW11eDogcmVtb3ZlIHJlZHVuZGFudCB2YXJpYWJsZQorCisyMDEyLTAxLTIwIDE2OjU3OjUyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogZml4IGFyaXRobWV0aWMgZm9yIHVuc2lnbmVkIGNvbXBhcmlzb24KKworMjAxMi0wMS0yMCAxNjo1NTowNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IGFkZCB2YXJpb3VzIG1pc3NpbmcgYnJlYWsKKworMjAxMi0wMS0yMCAxNjo1NDowNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiB0d2VhayBERUZBVUxUIGZvcm1hdCBkdXJhdGlvbiBxdWVyeSByZXNwb25zZQorCisyMDEyLTAxLTIwIDE2OjQ5OjE0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkgIGFscGhhY29sb3I6IHJlbW92ZSByZWR1bmRhbnQgc3RhdGVtZW50CisKKzIwMTItMDEtMjAgMTY6NDg6NDkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBmbGFjZGVjOiBpbXByb3ZlIHVwc3RyZWFtIHBlZXIgZHVyYXRpb24gcXVlcnlpbmcKKwkgIC4uLiB0byBhdm9pZCBhY2NlcHRpbmcgdW5oYW5kbGVkIGR1cmF0aW9uIHF1ZXJ5IHJlc3VsdC4KKworMjAxMi0wMS0yMCAxNjo0NzozNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2VzcmM6IGFkZGl0aW9uYWwgZXJyb3IgY29uZGl0aW9uIGNoZWNraW5nCisKKzIwMTItMDEtMjAgMTY6NDY6MjEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGFkZGl0aW9uYWwgZXJyb3IgY29uZGl0aW9uIGNoZWNraW5nCisKKzIwMTItMDEtMjAgMTY6NDQ6MjEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJICBqcGVnZW5jOiBjaGVjayBfYWxsb2NfYnVmZmVyIHJlc3VsdCBhbmQgcGVyZm9ybSBmYWxsYmFjayBhbGxvYyBpZiBuZWVkZWQKKwkgIC4uLiByYXRoZXIgdGhhbiBjYXJyeWluZyBvbiB3aXRoIE5VTEwgYnVmZmVyLgorCisyMDEyLTAxLTIwIDE0OjQ1OjAxICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvY2FtY3RybC5jOgorCSAgY29udHJvbGxlcjogYWRhcHQgdG8gY29udHJvbCBiaW5kaW5nIGNoYW5nZXMKKworMjAxMi0wMS0yMCAxMTozNzozOCArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlL3NoYXBld2lwZS1leGFtcGxlLmM6CisJKiB0ZXN0cy9leGFtcGxlcy92NGwyL2NhbWN0cmwuYzoKKwkgIGNvbnRyb2xsZXI6IGFkYXB0IHRvIGNvbnRyb2xsZXIgYXBpIGNoYW5nZXMKKwkgIERvbid0IHVzZSB0aGUgY29udmVuaWVuY2UgYXBpIGZvciBjb250cm9sIHNvdXJjZXMuCisKKzIwMTItMDEtMTkgMTQ6MjQ6MDQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJKiBjb25maWd1cmUuYWM6CisJICBBZGQgLS1kaXNhYmxlLWZhdGFsLXdhcm5pbmdzIGNvbmZpZ3VyZSBvcHRpb24KKworMjAxMi0wMS0xOSAxMjo0NDozOSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIHVwZGF0ZSBmb3IgbWVtb3J5IEFQSQorCisyMDEyLTAxLTE5IDExOjMzOjUzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvY2xpZW50LmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5oOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuaDoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG1vb3ZyZWNvdmVyLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bW9vdnJlY292ZXIuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5oOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9vdmVybGF5LmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOgorCSAgcG9ydCB0byBuZXcgZ3RocmVhZCBBUEkKKworMjAxMi0wMS0xOCAxNjo1ODoxMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZS5hYzogUmVtb3ZlIEdJTyBjaGVjaywgdGhpcyBpcyBpbiBnc3QtZ2xpYjIubTQgbm93CisKKzIwMTItMDEtMTggMTY6NDY6MTcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMDgwNzE4NyB0byAyYTU5MDE2CisKKzIwMTItMDEtMTggMTY6MTU6NTkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmUuYWM6IFJlcXVpcmUgR0xpYiAyLjMxLjEwIGFuZCBpbXByb3ZlIEdJTyBjaGVjaworCisyMDEyLTAxLTE3IDE2OjU4OjA3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogUmVtb3ZlIHVubmVlZGVkIHNvY2tldC5oIGluY2x1ZGUKKworMjAxMi0wMS0xNyAxNjo1MzozMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jOgorCSAgY29uZmlndXJlOiBSZW1vdmUgc29ja2V0L3dpbnNvY2sgc3BlY2lmaWMgY2hlY2tzCisJICBOb3QgbmVjZXNzYXJ5IGFueW1vcmUuCisKKzIwMTItMDEtMTcgMTY6NDk6MTAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IFVwZGF0ZSBmb3IgdGhlIG5ldyBHSU8gdmVyc2lvbnMgb2YgdGhlIHVkcCBlbGVtZW50cworCisyMDEyLTAxLTE3IDEzOjA4OjQyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgcnRwbWFuYWdlcjogUG9ydCB0byBHSU8KKworMjAxMi0wMS0xNyAxMToxOTozMyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC91ZHAvTWFrZWZpbGUuYW06CisJICBjb25maWd1cmU6IFJlcXVpcmUgR0lPIDIuMzEuMTAKKworMjAxMi0wMS0xNyAxMToxODozMyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwLmM6CisJKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmM6CisJKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmg6CisJICB1ZHA6IFJlbW92ZSBub3cgdW5lY2Vzc2FyeSBjb2RlCisKKzIwMTItMDEtMTcgMTE6MTg6MTUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaDoKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmg6CisJICB1ZHBzaW5rL211bHRpdWRwc2luazogUG9ydCB0byBHSU8KKworMjAxMi0wMS0xNyAwOTozODozMyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmg6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgZHludWRwc2luazogUG9ydCB0byBHSU8KKworMjAxMi0wMS0xNyAwOTozMjoyNyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmg6CisJICBkeW51ZHBzaW5rOiBQb3J0IHRvIEdJTworCisyMDEyLTAxLTE3IDA5OjAzOjM4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9NYWtlZmlsZS5hbToKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5oOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwkgIHVkcHNyYzogUG9ydCB0byBHSU8KKworMjAxMi0wMS0xNiAxNzo1MToxOCArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6CisJICBjdXR0ZXI6IGZpeCBsZWFrIG9mIHVudXNlZCBHVmFsdWUKKworMjAxMi0wMS0xNiAxNjoxMDowOCArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1dG9kZXRlY3QuYzoKKwkgIHRlc3RzOiBmaXggYXV0b2RldGVjdCB0ZXN0IG5vdCB0ZXN0aW5nIGNvcnJlY3RseSBmb3Igc3RhdGUgY2hhbmdlIHN1Y2Nlc3MKKwkgIFN0YXRlIGNoYW5nZSB0byBQQVVTRUQgY2FuIGJlIGRvbmUgYXN5bmMsIHNvIGlmIHRoaXMgaGFwcGVucywgd2UgbmVlZAorCSAgdG8gd2FpdCBmb3IgdGhlIGNoYW5nZSB0byBiZSBkb25lIChvciBmYWlsZWQpLgorCisyMDEyLTAxLTE2IDE1OjQyOjQ2ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSAgcnRwaDI2M3BwYXk6IGZpeCBjYXBzIGxlYWsKKworMjAxMi0wMS0xNiAxMjoxMzo1MCArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IG1ha2UgaW50ZXJsYWNlZG5lc3MgdGVzdCBkZXRlcm1pbmlzdGljCisJICBJZiB0aGUgaW50ZXJsYWNlZCBmbGFnIGlzIG5vdCBwcmVzZW50IGluIHRoZSBjYXBzLCB3ZSBhc3N1bWUgdGhlCisJICBkYXRhIGlzIG5vdCBpbnRlcmxhY2VkLCBpbnN0ZWFkIG9mIGxlYXZpbmcgdGhlIGJvb2xlYW4gdW5pbml0aWFsaXplZC4KKworMjAxMi0wMS0xMyAxODoxMjowNSAtMDUwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgbWF0cm9za2E6IGZpeCBwcmludGYgZm9ybWF0IGNvbXBpbGVyIHdhcm5pbmdzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjYyNjE1CisKKzIwMTItMDEtMTMgMTg6MTE6MzYgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBmaXggd3JvbmcgZXJyb3IgY2hlY2sKKwkgIHBhX3N0cmVhbV8qIGZ1bmN0aW9ucyByZXR1cm4gbmVnYXRpdmUgb24gZXJyb3IsIGRlc3BpdGUgdGhlIGRlZmluZXMKKwkgIGZvciBlcnJvciBjb2RlcyBiZWluZyBwb3NpdGl2ZS4KKwkgIEkgb25seSBnb3QgdG8gcmVwcm8gdGhlIGVycm9yIHR3aWNlLCBzbyBJJ20gbm90IHN1cmUgMTAwJSBzdXJlIHRoaXMKKwkgIGZpeGVzIHRoZSBpc3N1ZSAodGhlIG5lZ2F0aXZlIHZhciBiZWluZyB1bmluaXRpYWxpemVkIGFmdGVyIHJldHVybmluZworCSAgZnJvbSBwYV9zdHJlYW1fZ2V0X2xhdGVuY3kpLgorCisyMDEyLTAxLTEzIDE3OjQzOjQ5ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zczQvb3NzNC1zaW5rLmM6CisJKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOgorCSAgb3NzNDogZml4IGNhcHMgbGVha3MKKworMjAxMi0wMS0xMyAxNzoyNTo1OSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IGZpeCBjYXBzIGxlYWsKKworMjAxMi0wMS0xMyAxNTo1NzoyMCArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOgorCSAgdGVzdHM6IGZpeCBjYXBzIGxlYWsgaW4gdmlkZW90ZXN0c3JjIHRlc3QKKworMjAxMi0wMS0xMyAxMjo1MDowNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICBtYXRyb3NrYWRlbXV4OiBjbGVhbiB1cCBvYnNvbGV0ZSBjbG9zaW5nIHNlZ21lbnQgaGFuZGxpbmcKKworMjAxMi0wMS0xMyAxMDozMjo1OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzoKKwkgIHJ0cHB0ZGVtdXg6IHBsdWcgcGFkIGxlYWsgaW4gZXJyb3IgY29kZSBwYXRoCisJICBCYXNlZCBvbiBwYXRjaCBieTogU3RpZyBTYW5kbmVzIDxzdGlnLnNhbmRuZXNAY2lzY28uY29tPgorCSAgRG9uJ3QgbGVhayBzcmNwYWQgaWYgdGhlcmUgYXJlIG5vIGNhcHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY3ODIwCisKKzIwMTEtMTAtMDQgMTA6MDA6MDIgKzAyMDAgIFN0aWcgU2FuZG5lcyA8c3RpZ3NhbmRAY2lzY28uY29tPgorCisJKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cubToKKwkgIG9zeHZpZGVvOiBGaXggbGVhayBvZiBOU09wZW5HTFBpeGVsRm9ybWF0IG9iamVjdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NzgxOAorCisyMDExLTA5LTA1IDEwOjQzOjE5ICswMjAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IERvbid0IGFzc2VydCB3aGVuIHRoZSBpbnRlcmZhY2UgaXMgbm90IGltcGxlbWVudGVkLgorCSAgU2ltcGx5IHJldHVybiBGQUxTRSBpbnN0ZWFkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NzgxNworCisyMDEyLTAxLTEyIDAwOjE4OjM5ICswMjAwICBSYWltbyBKw6RydmkgPHJhaW1vLmphcnZpQGdtYWlsLmNvbT4KKworCSogc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5jOgorCSogc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5oOgorCSAgd2F2ZWZvcm1zaW5rOiBGaXggbWluZ3cgd2FybmluZ3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Njc3MTkKKworMjAxMi0wMS0xMiAyMzo1NTozMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgR1NUX1RZUEVfREFURSAtPiBHX1RZUEVfREFURQorCisyMDEyLTAxLTEyIDIzOjQ4OjUwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSAgZXFNZXJnZSByZW1vdGUtdHJhY2tpbmcgYnJhbmNoICdvcmlnaW4vbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYworCSAgZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmMKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmMKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jCisKKzIwMTItMDEtMTIgMTg6MjM6NDIgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIGdzdHJ0cHNzcmNkZW11eDogZml4IGVsZW1lbnQgbGVhaworCisyMDEyLTAxLTEyIDE0OjE5OjIyICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYTogZG8gbm90IGxlYWsgYXR0YWNobWVudCBidWZmZXJzCisKKzIwMTItMDEtMTIgMTM6MTc6NTUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogcmVtb3ZlIG9ic29sZXRlIEZJWE1FIGNvbW1lbnRzCisKKzIwMTItMDEtMTIgMTA6MzA6MTEgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBkbyBub3QgZHJvcCB0aGUgZmlyc3QgZGF0YSBidWZmZXIgb24gdGhlIGZsb29yIChhbmQgbGVhayBpdCBlaXRoZXIpCisKKzIwMTItMDEtMTIgMTE6MDg6MzggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGluZGV4LmM6CisJKiBnc3QvZmx2L2dzdG1lbWluZGV4LmM6CisJICBmbHZkZW11eDogYWRkIHByZWZpeCB0byBsb2NhbCBHc3RJbmRleCByZWxhdGVkIGNvcGllcworCSAgLi4uIHRvIGF2b2lkIGR1cGxpY2F0ZSB0eXBlIG5hbWVzIHdpdGggb3RoZXIgc3VjaCBsb2NhbCBjb3BpZXMgaW4gdGhlIHdpbGQuCisKKzIwMTItMDEtMTIgMTE6MDc6MzMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogYWN0aXZhdGUgcGFkIGJlZm9yZSBzZXR0aW5nIGNhcHMKKwkgIC4uLiByYXRoZXIgdGhhbiB0aGUgdXN1YWwgMC4xMCBvdGhlciB3YXkgYXJvdW5kLgorCSAgRml4ZXMgIzY2NzU1OC4KKworMjAxMi0wMS0xMSAxODo0NTozMyAtMDMwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9AY29sbGFib3JhLmNvbT4KKworCSogQW5kcm9pZC5tazoKKwkgIFRlbXBvcmFyaWx5IGRpc2FibGluZyBtdWx0aWZpbGUgZm9yIHRoZSBBbmRyb2lkIGJ1aWxkCisJICBUaGVyZSBpcyBhIGhhcmQgZGVwZW5kZW5jeSBvbiBpbm90aWZ5IGNvbW1pbmcgZnJvbSBnaW8uIFdlCisJICBhcmUgbm90IGN1cnJlbnRseSBidW5kbGluZyBpbm90aWZ5IHdpdGggdGhlIEFuZHJvaWQgZGlzdCBzbworCSAgSSdtIGRpc2FibGluZyBtdWx0aWZpbGUgZm9yIG5vdyB1bnRpbCBzb21lb25lIGdldHMgYXJvdW5kCisJICB0byBzb3J0IHRoaXMgb3V0LgorCSAgVGhpcyBjaGFuZ2UgZml4ZXMgYnVpbGRpbmcgb24gQW5kcm9pZAorCisyMDEwLTEwLTIwIDAyOjE3OjQzIC0wNzAwICBMZW8gU2luZ2VyIDxsZW8uc2luZ2VyQGxpZ28ub3JnPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaWlyZmlsdGVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2lpcmZpbHRlci5jOgorCSAgYXVkaW9meDogVXNlIG1vc3QgY29tbW9uIGNvbnZlbnRpb24gZm9yIGRlZmluaXRpb25zIG9mIElJUiBmaWx0ZXIgY29lZmZpY2llbnRzLgorCSAgTW9zdCBzaWduYWwgcHJvY2Vzc2luZyB0ZXh0cywgaW5jbHVkaW5nIE1BVExBQiwgdXNlIHRoZSBmb2xsb3dpbmcgY29udmVudGlvbiBmb3IgSUlSIGZpbHRlciBjb2VmZmljaWVudHM6CisJICBhXzAgeVtuXSArIGFfMSB5W24tMV0gKyAuLi4gKyBhX00geVtuLU1dID0gYl8wIHhbbl0gKyBiXzEgeFtuLTFdICsgLi4uICsgYltOXSB4W24tTl0KKwkgIFVzdWFsbHksIGFfMCBpcyBzZXQgdG8gMSBiZWNhdXNlIHRoZSBjb2VmZmljaWVudHMgY2FuIGFsd2F5cyBiZSByZXNjYWxlZCwgZ2l2aW5nCisJICB5W25dID0gYl8wIHhbbl0gKyBiXzEgeFtuLTFdICsgLi4uICsgYltOXSB4W24tTl0gLSBhXzEgeVtuLTFdIC0gLi4uIC0gYV9NIHlbbi1NXQorCSAgVGhlIGNvbnZlbnRpb24gdGhhdCB3YXMgcHJldmlvdXNseSB1c2VkIGJ5IGF1ZGlvZnhiYXNlaWlyZmlsdGVyIGFuZCBkZXJpdmVkIGNsYXNzIGhhZCB0aGUgYSBhbmQgYiBjb2VmZmljaWVudHMgc3dhcHBlZCwgYW5kIGRpZCBub3QgaGF2ZSB0aGUgbWludXMgc2lnbnMuCisJICBUaGlzIGNoYW5nZSBtYWtlcyB0aGUgYXVkaW9meCBwbHVnaW4gdXNlIHRoZSBtb3JlIGNvbW1vbiBjb252ZW50aW9uIGRlc2NyaWJlZCBhYm92ZS4KKworMjAxMi0wMS0xMSAxNDo0NzozNiArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSogZXh0L2phY2svZ3N0amFjay5oOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5oOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuaDoKKwkgIGphY2s6IGFkZCBhIHRyYW5zcG9ydCBtb2RlIGVudW0KKwkgIENsaWVudHMgY2FuIGNvbmZpZ3VyZSB0aGUgZGVzaXJlZCBiZWhhdmlvdXIgdmlhICJ0cmFuc3BvcnQiIHByb3BlcnR5LiBUaGUKKwkgIGRlZmF1bHQgYmVoYXZpb3VyIGlzIGlnbm9yaW5nIHRoZSB0cmFuc3BvcnQgc3RhdGUuIE90aGVyIG1vZGVzIGFyZSBtYXN0ZXIgYW5kCisJICBzbGF2ZS4KKworMjAxMi0wMS0xMSAxNDoxMDo0NiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogRml4IGJ1ZmZlciBoYW5kbGluZworCSAgc291cGh0dHBzcmMgaXMgbm93IHVzYWJsZSBhZ2FpbiBhbmQgZG9lc24ndCBjcmFzaCBhbnltb3JlCisJICB3aGVuZXZlciBzb21ldGhpbmcgaXMgcmVhZCBmcm9tIGEgSFRUUCBjb25uZWN0aW9uLgorCisyMDEyLTAxLTExIDAxOjQ1OjM0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3dhdmVuYy5jOgorCSAgdGVzdHM6IGZpeCB3YXZlbmMgdGVzdCBvbiBiaWcgZW5kaWFuCisJICB3YXZlbmMgb25seSBhY2NlcHRzIGxpdHRsZS1lbmRpYW4gUENNLCBidXQgbW9zdCBvZiBvdXIKKwkgIGVsZW1lbnRzIHN1Y2ggYXMgYXVkaW90ZXN0c3JjIG9ubHkgcHJvZHVjZSBvciBwcm9jZXNzCisJICBhdWRpbyBpbiBuYXRpdmUgZW5kaWFubmVzcywgc28gd2UgbmVlZCB0byBwbHVnIGEKKwkgIGNvbnZlcnRlciBiZWZvcmUgd2F2ZW5jIG9uIGJpZyBlbmRpYW4gc3lzdGVtcy4KKworMjAxMi0wMS0xMCAyMzowMjo0NSArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICBqYWNrOiBkZWFjdGl2YXRlIHRoZSByZXF1ZXN0X3N0YXRlIGNvZGUKKwkgIFdoZW4gcWphY2tjdGwgaXMgc3RhcnRlZCwgdHJhbnNwb3J0IGlzIHN0b3BwZWQgYnkgZGVmYXVsdC4gVGhpcyB3b3VsZCBiZSBhCisJICByZWdyZXNzaW9uIGZvciBnc3RyZWFtZXIgYXBwcyB0aGF0IGJlZm9yZSBqdXN0IHN0YXJ0ZWQgdG8gcGxheSByaWdodCBhd2F5LgorCisyMDEyLTAxLTEwIDIyOjI3OjExICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9jbGllbnQuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5oOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICBqYWNrOiBhZGQgdHJhbnNwb3J0IGNvbnRyb2wgaGFuZGxpbmcKKwkgIFRoaXMgZmVhdHVyZSBhbGxvd3MgdG8gc3RhcnQgYW5kIHN0b3AgcGxheWJhY2sgZnJvbSBvdGhlciBqYWNrIGFwcGxpY2F0aW9ucyAoZS5nLiBxamFja2N0bCkuCisKKzIwMTItMDEtMTAgMTg6NTA6MjcgKzAxMDAgIE5pY29sYSBNdXJpbm8gPG5pY29sYS5tdXJpbm9AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogZml4IGNvZGVjX3ByaXYgbGVha3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Njc0MTkKKworMjAxMi0wMS0xMCAxNTowNjozOSArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvY2xpZW50LmM6CisJICBqYWNrOiB1c2UgamFjayB0eXBlIGZvciB0aGUgY2FsbGJhY2sKKwkgIEphY2sgaGVhZGVycyBoYXZlIGEgdHlwZWRlZiBmb3IgdGhlIHNodXRkb3duIGNhbGxiYWNrIGFzIHdlbGwuCisKKzIwMTItMDEtMTAgMTQ6MzI6MzIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYworCSAgZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmMKKwkgIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYworCSAgZ3N0L2F2aS9nc3RhdmltdXguYworCSAgZ3N0L2Zsdi9nc3RmbHZtdXguYworCSAgZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jCisJICBnc3QvaXNvbXA0L2dzdHF0bXV4LmMKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmMKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaAorCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmMKKwkgIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jCisJICBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jCisJICBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jCisJICBnc3Qvc21wdGUvZ3N0c21wdGUuYworCSAgZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYworCSAgZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmMKKwkgIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmMKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYworCSAgZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmMKKwkgIHBvL2phLnBvCisJICBwby9sdi5wbworCSAgcG8vc3IucG8KKwkgIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ3ZvbHVtZS5jCisKKzIwMTItMDEtMDkgMjI6NTg6MzIgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICBkb2NzOiBSZW1vdmUgb2xkIHZpZGVvbWl4ZXIgaGVhZGVycworCSAgVGhlc2UgZ290IHJlbW92ZWQgaW4gdGhlIHRyYW5zaXRpb24gdG8gdmlkZW9taXhlcjIuCisKKzIwMTItMDEtMDkgMTc6Mjg6MTcgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogZml4IGNvZGVjIHN0cmluZyBsZWFrcworCisyMDEyLTAxLTA5IDE0OjUxOjQ0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuaDoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXJwYWQuaDoKKwkgIHZpZGVvbWl4ZXI6IFJlbW92ZSB2aWRlb21peGVyIGFuZCByZWdpc3RlciB2aWRlb21peGVyMiBhcyB2aWRlb21peGVyCisKKzIwMTItMDEtMDkgMTE6MzY6NTggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGluaXRpYWxpemUgdmFyaWFibGUgdG8gYXZvaWQgdW5kZWZpbmVkIHVzZQorCisyMDEyLTAxLTA2IDA5OjQwOjIyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5oOgorCSAgZmxhYzogUG9ydCB0byB0aGUgbmV3IHJhdyBhdWRpbyBjYXBzCisKKzIwMTItMDEtMDUgMTk6MjU6MzMgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBpc29tcDQ6IGZpeCBjYXBzIGxlYWsKKworMjAxMi0wMS0wNSAxOTowODowMyArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIGlzb21wNDogcmVtb3ZlIGRlYWQgYXNzaWdubWVudAorCisyMDEyLTAxLTA1IDE0OjE4OjAzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSAgZml4IHBhZCB0ZW1wbGF0ZXMKKworMjAxMi0wMS0wNCAxNTowNTo0MSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJICBzcGVleDogVXBkYXRlIGZvciB0aGUgbmV3IHJhdyBhdWRpbyBjYXBzCisKKzIwMTItMDEtMDQgMTQ6NTQ6MTAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgIGphY2s6IEFkZCB0aGUgbmV3IGxheW91dCBmaWVsZCB0byB0aGUgcmF3IGF1ZGlvIGNhcHMKKworMjAxMi0wMS0wNCAxNDo1Mjo0NiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSogZXh0L2phY2svZ3N0amFja3V0aWwuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2t1dGlsLmg6CisJICBqYWNrYXVkaW9zcmM6IFBvcnQgdG8gdGhlIG5ldyBtdWx0aWNoYW5uZWwgYXVkaW8gY2FwcworCisyMDEyLTAxLTA0IDE0OjEzOjU0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBBZGQgRkxBQyBhbmQgaW50ZXJsZWF2ZSB0byB0aGUgbm9uLXBvcnRlZCBwbHVnaW5zIGxpc3QKKwkgIEJvdGggbmVlZCB0byBiZSB1cGRhdGVkIHRvIHRoZSBhdWRpby94LXJhdyBjYXBzIGFuZCB3ZXJlIG9ubHkKKwkgIGhhbGYtcG9ydGVkIGJlZm9yZS4KKworMjAxMi0wMS0wNCAxMzo0ODozNiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cEwxNnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBjaGFubmVscy5jOgorCSogZ3N0L3J0cC9nc3RydHBjaGFubmVscy5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJICBydHA6IFVwZGF0ZSBmb3IgdGhlIG5ldyBhdWRpbyBjYXBzCisKKzIwMTItMDEtMDQgMTI6MDY6MTIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBVcGRhdGUgZm9yIGxpYmdzdHJpZmYgQVBJIGNoYW5nZXMKKwkgIFN0aWxsIG5lZWRzIHRvIGhhbmRsZSByYXcgYXVkaW8gY2hhbm5lbCByZW9yZGVyaW5nCisKKzIwMTItMDEtMDQgMTI6MDU6MTYgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSAgd2F2ZW5jOiBVcGRhdGUgZm9yIHRoZSBuZXcgcmF3IGF1ZGlvIGNhcHMKKworMjAxMi0wMS0wNCAxMjowMzo1MCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IFVwZGF0ZSBmb3IgdGhlIG5ldyByYXcgYXVkaW8gY2FwcyBsYXlvdXQgZmllbGQKKworMjAxMi0wMS0wNCAxMTo1NzoyMCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJnYW5hbHlzaXMuYzoKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJnbGltaXRlci5jOgorCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYzoKKwkgIHJlcGxheWdhaW46IFVwZGF0ZSBmb3IgdGhlIG5ldyBhdWRpbyBjYXBzCisKKzIwMTItMDEtMDQgMTE6NTI6MjkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thOiBVcGRhdGUgZm9yIHRoZSBuZXcgcmF3IGF1ZGlvIGludGVybGVhdmVkIGNhcHMgZmllbGQKKwkgIFN0aWxsIG5lZWRzIHRvIGJlIGZpeGVkIHRvIGhhbmRsZSB0aGUgbXVsdGljaGFubmVsIGNoYW5uZWwtbWFzaworCSAgYW5kIHJlb3JkZXJpbmcuCisKKzIwMTItMDEtMDQgMTE6MzE6MDcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIGxldmVsOiBVcGRhdGUgZm9yIHRoZSBuZXcgcmF3IGF1ZGlvIGxheW91dCBmaWVsZAorCisyMDEyLTAxLTA0IDExOjI5OjI2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eG1hcC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBpc29tcDQ6IFBvcnQgdG8gdGhlIG5ldyBhdWRpbyBjYXBzCisJICBTdGlsbCBuZWVkcyB0byBoYW5kbGUgdGhlIGNoYW5uZWwgcG9zaXRpb25zL21hc2tzIGFuZAorCSAgY2hhbm5lbCByZW9yZGVyaW5nLgorCisyMDEyLTAxLTA0IDExOjExOjA2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzoKKwkgIGN1dHRlcjogVXBkYXRlIGZvciB0aGUgbmV3IHJhdyBhdWRpbyBsYXlvdXQgZmllbGQKKworMjAxMi0wMS0wNCAxMTowOTozMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkgIGdvb206IFBvcnQgdG8gdGhlIG5ldyBtdWx0aWNoYW5uZWwgY2FwcyBhbmQgdXBkYXRlIGZvciB0aGUgbmV3IHJhdyBhdWRpbyBsYXlvdXQgZmllbGQKKworMjAxMi0wMS0wNCAxMTowODoxOCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJICBlcXVhbGl6ZXI6IFVwZGF0ZSBmb3IgdGhlIG5ldyByYXcgYXVkaW8gbGF5b3V0IGZpZWxkCisKKzIwMTItMDEtMDQgMTE6MDc6MjkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogVXBkYXRlIGZvciB0aGUgbGliZ3N0cmlmZiBBUEkgY2hhbmdlcworCSAgU3RpbGwgbmVlZHMgdG8gZG8gcmVvcmRlcmluZyBvZiBjaGFubmVscyBmb3IgcmF3IGF1ZGlvLgorCisyMDEyLTAxLTA0IDExOjA2OjI4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSAgYXVwYXJzZTogUG9ydCB0byB0aGUgbmV3IG11bHRpY2hhbm5lbCBjYXBzIGFuZCB0aGUgbmV3IHJhdyBhdWRpbyBsYXlvdXQgZmllbGQKKworMjAxMi0wMS0wNCAxMTowMjo0MyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWlpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSAgYXVkaW9meDogUG9ydCB0byB0aGUgbmV3IG11bHRpY2hhbm5lbCBjYXBzIGFuZCB0aGUgbmV3IHJhdyBhdWRpbyBsYXlvdXQgZmllbGQKKworMjAxMi0wMS0wNCAxMDo1NDo0NiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkgIG9zczogUG9ydCB0byB0aGUgbmV3IG11bHRpY2hhbm5lbCBjYXBzIGFuZCB0aGUgcmF3IGF1ZGlvIGNhcHMgaW50ZXJsZWF2ZWQgZmllbGQKKworMjAxMi0wMS0wNCAxMDoyNzowOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSAgcHVsc2U6IFBvcnQgdG8gdGhlIG5ldyBtdWx0aWNoYW5uZWwgY2FwcworCisyMDEyLTAxLTA0IDE5OjUxOjQ2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDc2MmI2OTIgdG8gMDgwNzE4NworCisyMDEyLTAxLTA0IDE3OjU5OjU1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkgIHRlc3RzOiBmaXggc29tZSBsZWFrcyBhbmQgcmVtb3ZlIGZpbGVzIHdoZW4gZG9uZSBpbiBxdG11eCB0ZXN0CisKKzIwMTEtMTItMTQgMTA6MTQ6MjAgKzAxMDAgIFBldGVyIFNlaWRlcmVyIDxwcy5yZXBvcnRAZ214Lm5ldD4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICBtdWx0aWZpbGVzaW5rOiBwb3N0IGJldHRlciBlcnJvciBtZXNzYWdlIHdoZW4gd2UgcnVuIG91dCBvZiBkaXNrIHNwYWNlCisJICBNYXAgd3JpdGUgZXJybm8gRU5PU1BDIHRvIEdTVF9SRVNPVVJDRV9FUlJPUl9OT19TUEFDRV9MRUZULgorCisyMDEyLTAxLTA0IDEzOjI2OjQ1ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FscGhhY29sb3IuYzoKKwkgIGFscGhhY29sb3I6IE1vcmUgZml4ZXMvY2xlYW51cAorCisyMDEyLTAxLTA0IDEzOjI1OjQwICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICBhbHBoYTogUmVmYWN0b3IgcGFyYW0vcHJvY2VzcyBmdW5jdGlvbnMKKwkgIFdoZW4gOjpzZXRfaW5mbygpIGlzIGNhbGxlZCwgdGhlIGlucHV0L291dHB1dCBWaWRlb0luZm8gYXJlbid0IHNldAorCSAgeWV0IG9uIHRoZSB2aWRlb2ZpbHRlci4KKworMjAxMi0wMS0wNCAxMDowMTo0OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6CisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICBHU1RfRkxPV19VTkVYUEVDVEVEIC0+IEdTVF9GTE9XX0VPUworCisyMDExLTEyLTMxIDIzOjMzOjMzIC0wNTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJICBkY2FwYXJzZTogdXNlIHJpZ2h0IHZhcmlhYmxlCisJICBGaXhlcyB1c2Ugb2YgdW5pdGlhbGl6ZWQgdmFyaWFibGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY3MDg1CisKKzIwMTItMDEtMDMgMTU6MjY6MjEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmlzdWJ0aXRsZS5jOgorCSogZ3N0L2RlYnVndXRpbHMvcm5kYnVmZmVyc2l6ZS5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRmaWxlc3JjLmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIEdTVF9GTE9XX1VORVhQRUNURUQgLT4gR1NUX0ZMT1dfRU9TCisKKzIwMTItMDEtMDMgMTQ6NDI6MjggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy90YWdzY2hlY2tpbmcuYzoKKwkgIHRlc3RzOiByZXdyaXRlIHRlc3QgYSBsaXR0bGUKKwkgIFJld3JpdGUgdGhlIHRhZyBjaGVjayBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gZGVhbCB3aXRoIHRhZyBsaXN0cy4KKworMjAxMi0wMS0wMyAxNDoxNjoyOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9qcGVnZW5jLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWx0aWZpbGUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW5fYnVmZmVyX2xpc3QuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc2hhcGV3aXBlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdWRwc2luay5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2ZpbHRlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMveTRtZW5jLmM6CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvZmxhY2RlYy5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3RhZ3NjaGVja2luZy5jOgorCSAgdGVzdHM6IG1ha2UgbW9yZSB0ZXN0cyBjb21waWxlCisKKzIwMTItMDEtMDMgMTE6NTY6MjUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZXF1YWxpemVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9mbGFjcGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsdmRlbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9mbHZtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ljeWRlbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbWFnZWZyZWV6ZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW50ZXJsZWF2ZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnbGltaXRlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmd2b2x1bWUuYzoKKwkgIHRlc3Q6IG1ha2UgbW9yZSB1bml0IHRlc3RzIGNvbXBpbGUKKworMjAxMi0wMS0wMyAxMDoyNjo0OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2ZpcmZpbHRlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9paXJmaWx0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvaW52ZXJ0LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jYmFuZC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW93c2luY2xpbWl0LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdXRvZGV0ZWN0LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdmltdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aXN1YnRpdGxlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jYXBzc2V0dGVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGFjZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZGVpbnRlcmxlYXZlLmM6CisJKiB0ZXN0cy9jaGVjay9nZW5lcmljL2luZGV4LmM6CisJKiB0ZXN0cy9jaGVjay9nZW5lcmljL3N0YXRlcy5jOgorCSAgdGVzdHM6IGZpeCBzb21lIHVuaXQgdGVzdHMKKwkgIFJlbW92ZSB1bml0IHRlc3QgZm9yIEdzdEluZGV4LgorCSAgTWFrZSBzb21lIG90aGVyIHVuaXQgdGVzdHMgY29tcGlsZQorCisyMDEyLTAxLTAyIDE0OjMyOjQwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BleHQuYzoKKwkgIGF1dG9kZXRlY3QsIHJ0c3A6IGdzdF9yZWdpc3RyeV9nZXRfZGVmYXVsdCgpIC0+IGdzdF9yZWdpc3RyeV9nZXQoKQorCisyMDExLTEyLTMxIDEwOjAwOjQxICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy92NGwyL2NhbWN0cmwuYzoKKwkgIGNvbnRyb2xsZXI6IHBvcnQgdG8gQVBJIGNoYW5nZXMKKworMjAxMS0xMi0zMCAxNzo0MTo0NiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSAgbWF0cm9za2E6IHVwZGF0ZSBmb3IgR3N0SW5kZXggcmVtb3ZhbAorCisyMDExLTEyLTMwIDE3OjIzOjQzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IHVwZGF0ZSBmb3IgR3N0SW5kZXggcmVtb3ZhbAorCisyMDExLTEyLTMwIDE3OjIwOjU3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkqIGdzdC9mbHYvZ3N0aW5kZXguYzoKKwkqIGdzdC9mbHYvZ3N0aW5kZXguaDoKKwkqIGdzdC9mbHYvZ3N0bWVtaW5kZXguYzoKKwkgIGZsdmRlbXV4OiB1cGRhdGUgZm9yIEdzdEluZGV4IHJlbW92YWwKKwkgIEFkZCBwcml2YXRlIEdzdE1lbUluZGV4IGZvciBub3cuCisKKzIwMTEtMTItMzAgMTc6MTI6MDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogdXBkYXRlIGZvciBHc3RJbmRleCByZW1vdmFsCisKKzIwMTEtMTItMjcgMjI6NTk6MDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvd2F2ZWZvcm0vZ3N0d2F2ZWZvcm1zaW5rLmM6CisJICB3YXZlZm9ybXNpbms6IGZpeCBjb21waWxlciB3YXJuaW5ncyB3aXRoIE1pbmdXCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY2NDg1CisKKzIwMTEtMTItMjcgMTI6MDY6MTYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSAgdGVzdHM6IG1ha2UgZ2l0IGlnbm9yZSBuZXcgdW5pdCB0ZXN0IGJpbmFyeQorCisyMDExLTEyLTI3IDExOjUwOjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogZml4IHZhbGdyaW5kIHdhcm5pbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjY2NDQKKworMjAxMS0xMi0yNyAxMTo0OToxMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdWRwc3JjLmM6CisJICB1ZHBzcmM6IGFkZCB1bml0IHRlc3QgdGhhdCBzZW5kcyAwLXNpemUgcGFja2V0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY2NjQ0CisKKzIwMTEtMTItMjEgMTM6MjI6MDMgKzAxMDAgIEpvaG4gT2duZXNzIDxqb2huLm9nbmVzc0BsaW51dHJvbml4LmRlPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBkcm9wIGRhdGFsZXNzIFVEUCBwYWNrZXRzCisJICBJdCBpcyBhbGxvd2VkIHRvIHNlbmQvcmVjZWl2ZSBVRFAgcGFja2V0cyB3aXRoIG5vIGRhdGEuIFdoZW4gc3VjaAorCSAgYSBwYWNrZXQgaXMgYXZhaWxhYmxlLCBzZWxlY3QoKSB3aWxsIHJldHVybiB3aXRoIHN1Y2Nlc3MgYnV0CisJICBpb2N0bChGSU9OUkVBRCkgd2lsbCByZXR1cm4gMC4gQnV0IGEgcmVhZCgpIG11c3Qgc3RpbGwgb2NjdXIgaW4KKwkgIG9yZGVyIHRvIGNsZWFyIG9mZiB0aGUgVURQIHBhY2tldCBmcm9tIHRoZSBxdWV1ZS4KKwkgIFRoaXMgcGF0Y2ggd2lsbCByZWFkIHRoZSBkYXRhbGVzcyBwYWNrZXQgZnJvbSB0aGUgc29ja2V0LiBJZgorCSAgc2VsZWN0KCkgd2FzIHdva2VuIGZvciBvdGhlciByZWFzb25zIChhbmQgRklPTlJFQUQgcmV0dXJucyAwKSwKKwkgIHRoaXMgbWF5IHJlc3VsdCBpbiBhIFVEUCBwYWNrZXQgZ2V0dGluZyBhY2NpZGVudGFsbHkgZHJvcHBlZC4KKwkgIEJ1dCBzaW5jZSBVRFAgaXMgbm90IHJlbGlhYmxlLCB0aGlzIGlzIGFjY2VwdGFibGUuCisJICBOT1RFOiBUaGlzIHBhdGNoIGZpeGVzIGEgbmFzdHkgYnVnIHdoZXJlIHNlbmRpbmcgYSBkYXRhbGVzcworCSAgVURQIHBhY2tldCB0byBhIHVkcHNyYyBpbnN0YW5jZSB3aWxsIGNhdXNlIGFuIGluZmluaXRlCisJICBsb29wLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NjY0NAorCSAgU2lnbmVkLW9mZi1ieTogSm9obiBPZ25lc3MgPGpvaG4ub2duZXNzQGxpbnV0cm9uaXguZGU+CisKKzIwMTEtMTItMjYgMjI6MjI6NTkgKzAwMDAgIFlhYWtvdiBTZWxrb3dpdHogPHlzZWxrb3dpdHpAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBzeXMvTWFrZWZpbGUuYW06CisJKiBzeXMvd2F2ZWZvcm0vTWFrZWZpbGUuYW06CisJICB3YXZlZm9ybTogYWRkIGF1dG90b29scyBiaXRzIGZvciB3YXZlZm9ybSBwbHVnaW4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjY0ODUKKworMjAxMS0xMi0yMSAyMDo1MDoyMSArMDEwMCAgTmljb2xhIE11cmlubyA8bmljb2xhLm11cmlub0BnbWFpbC5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGZpeCBwZWVyX2NhcHMgbGVhaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NjY4OAorCisyMDExLTEyLTI1IDIzOjUyOjQ2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiByZW1vdmUgdW5uZWNlc3NhcnkgY2hlY2sgZm9yIGdkcCBsaWJyYXJ5CisKKzIwMTEtMTItMjUgMjI6MTc6NTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBleHQvcHVsc2UvTWFrZWZpbGUuYW06CisJKiBleHQvcHVsc2UvcGx1Z2luLmM6CisJKiBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkgIHB1bHNlOiByZW1vdmUgcHVsc2VhdWRpb3NpbmsgaGVscGVyIGJpbgorCSAgVGhpcyBpcyBjYXVzaW5nIHVzIGxvdHMgb2YgaGVhZGFjaGVzIGluIDAuMTAgYW5kIG5lZWRzIHRvIGJlIGRvbmUKKwkgIGRpZmZlcmVudGx5IGFuZCBwcm9wZXJseSBpbiAwLjExLiBwbGF5YmluIG9yIGRlY29kZWJpbiBzaG91bGQKKwkgIHJlY29uZmlndXJlIHRoZW1zZWx2ZXMgYmFzZWQgb24gcmVjb25maWd1cmUgZXZlbnRzLCBmb3IgZXhhbXBsZS4KKworMjAxMS0xMi0yNSAyMTo0NTo0NSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkgIHB1bHNlOiB1cGRhdGUgZm9yIHJpbmcgYnVmZmVyIGF1ZGlvIGZvcm1hdCB0eXBlIGVudW0gcmVuYW1lCisKKzIwMTEtMTItMjUgMjA6MzQ6NTIgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvY2FtY3RybC5jOgorCSAgY29udHJvbGxlcjogcG9ydCB0byBuZXcgY29udHJvbCBzb3VyY2UgYXBpCisKKzIwMTEtMTItMjUgMTQ6MjM6MjkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBkb24ndCB0cnkgdG8gcHVzaCBhbHJlYWR5LWZyZWVkIGJ1ZmZlcnMKKwkgIEZpeGVzIHVuaXQgdGVzdC4KKworMjAxMS0xMi0yNCAxMDo1Nzo0MiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IFVzZSBzY2FsZV9jZWlsKCkgZnVuY3Rpb25zIGZyb20gY29yZSBpbnN0ZWFkIG9mIGN1c3RvbSBvbmVzCisKKzIwMTEtMTItMjEgMjM6NTE6MDMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmg6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuaDoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdG5hdmlnYXRpb250ZXN0LmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZpZ2F0aW9udGVzdC5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmg6CisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmg6CisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmg6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0b3AuaDoKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmV2LmM6CisJKiBnc3QvZWZmZWN0di9nc3RyZXYuaDoKKwkqIGdzdC9lZmZlY3R2L2dzdHJpcHBsZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmlwcGxlLmg6CisJKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmg6CisJKiBnc3QvZWZmZWN0di9nc3RzdHJlYWsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHN0cmVhay5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5oOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuaDoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuaDoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuaDoKKwkgIHVwZGF0ZSBmb3IgdmlkZW9maWx0ZXIgY2hhbmdlcy4KKworMjAxMS0xMi0yMSAxNzo0MzoxMCArMDEwMCAgQnJhbmtvIFN1YmFzaWMgPGJyYW5rb0BheGlzLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkgIG1hdHJvc2thZGVtdXg6IGRvIG5vdCBjb25zaWRlciBkdXJhdGlvbiBvZiBub24tZmluYWxpemVkIGZpbGUKKwkgIC4uLiB0byBhdm9pZCBpdCBjbGFtcGluZyByZXF1ZXN0ZWQgc2VlayBwb3NpdGlvbi4KKwkgIE5vbi1maW5hbGl6ZWQgZmlsZSBjYXNlLCBkZXRlcm1pbmVkIGJ5IHdoZXRoZXIKKwkgIF9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrIGV2ZXIgdXBkYXRlcyB0aGUgc2VnbWVudCBkdXJhdGlvbi4KKwkgIEZpeGVzICM2NTIxOTUuCisKKzIwMTEtMTItMjEgMTU6MDY6NTcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGltcHJvdmUgZGVjaXNpb24gdG8gZmFsbCBiYWNrIHRvIHNjYW5uaW5nIHdoZW4gc2Vla2luZworCSAgLi4uIHdoaWNoIGlzIGJhc2ljYWxseSBpZmYgbm90IHN0cmVhbWluZyBhbmQgbm8gZW50cnkgZm91bmQgaW4gaW5kZXgKKworMjAxMS0xMi0yMSAwOTowOToyNyArMDEwMCAgT2xla3NpaiBSZW1wZWwgKEFsZXhleSBGaXNoZXIpIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFjM3BhcnNlOiByZW1vdmUgdW51c2VkIHZhcmlhYmxlCisJICByZW1vdmUgdW51c2VkIHZhcmlhYmxlIHRvIGZpeCBjb21waWxlIGVycm9yOgorCSAgbWFrZSAtQyBhdWRpb3BhcnNlcnMKKwkgIG1ha2VbM106IEJldHJldGUgVmVyemVpY2huaXMgJy9ob21lL2xleC90bXAvZ3N0LXBsdWdpbnMtZ29vZC9nc3QvYXVkaW9wYXJzZXJzJworCSAgQ0MgICAgIGxpYmdzdGF1ZGlvcGFyc2Vyc19sYS1nc3RhYWNwYXJzZS5sbworCSAgZ3N0YWFjcGFyc2UuYzogSW4gZnVuY3Rpb24gJ2dzdF9hYWNfcGFyc2VfcmVhZF9sb2FzX2F1ZGlvX3NwZWNpZmljX2NvbmZpZyc6CisJICBnc3RhYWNwYXJzZS5jOjQ0NjoxMjogZXJyb3I6IHZhcmlhYmxlICdzYnInIHNldCBidXQgbm90IHVzZWQgWy1XZXJyb3I9dW51c2VkLWJ1dC1zZXQtdmFyaWFibGVdCisJICBjYzE6IGFsbCB3YXJuaW5ncyBiZWluZyB0cmVhdGVkIGFzIGVycm9ycworCSAgU2lnbmVkLW9mZi1ieTogT2xla3NpaiBSZW1wZWwgKEFsZXhleSBGaXNoZXIpIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKzIwMTEtMTItMjEgMTE6NTk6NDYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZW1peGVyLmM6CisJKiBleHQvcHVsc2UvcHVsc2Vwcm9iZS5oOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwycmFkaW8uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9wdWxzZS9wdWxzZS5jOgorCSogdGVzdHMvZXhhbXBsZXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvcHJvYmUuYzoKKwkgIHVwZGF0ZSBmb3IgcmVtb3ZlZCBwcm9wZXJ0eSBwcm9iZQorCisyMDExLTA5LTA5IDExOjQyOjA5ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IGxldCBic2lkIDkgYW5kIDEwIHRocm91Z2gKKwkgIEZpbGVzIHdpdGggOSBhbmQgMTAgaGFwcGVuLCBhbmQgc2VlbSB0byBjb21wbHkgd2l0aCB0aGUgPD0gOAorCSAgZm9ybWF0LCBzbyBsZXQgdGhlbSB0aHJvdWdoLgorCSAgVGhlIHNwZWMgc2F5cyBub3RoaW5nIGFib3V0IDkgYW5kIDEwLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1ODU0NgorCisyMDExLTEyLTE5IDIzOjUwOjE5ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy92NGwyL2NhbWN0cmwuYzoKKwkgIGNvbnRyb2xsZXI6IHBvcnQgdG8gbmV3IGludGVycG9sYXRpb24tbW9kZSBhcGkKKworMjAxMS0xMi0xOSAyMjo1Mzo1NyArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvZXhhbXBsZXMvdjRsMi9jYW1jdHJsLmM6CisJICBjb250cm9sbGVyOiBwb3J0IHRvIG5ldyBjb250cm9sbGVyIGFwaQorCisyMDExLTEyLTE5IDE5OjAzOjUyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogdXBkYXRlIGZvciBuZXcgaW50ZXJsYWNlZCBjYXBzCisKKzIwMTEtMTItMTYgMTk6MTU6MzggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBwcm9wZXJseSBkZXRlcm1pbmUgZmluYWwgZHVyYXRpb24KKwkgIC4uLiB3aGljaCBjYW4gYmUgYXV0aG9yYXRpdmVseSBvYnRhaW5lZCBmcm9tIG91ciBvd24gd3JpdHRlbiB0aW1lc3RhbXBzLgorCisyMDExLTEyLTE5IDEzOjU2OjMwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogb25seSB3cml0ZSBmdWxsIG1ldGFkYXRhIGF0IHN0YXJ0CisJICAuLi4gcmF0aGVyIHRoYW4gaGF2aW5nIChwb3RlbnRpYWxseSkgdW5uZWNlc3NhcnkgZHVwbGljYXRlcyB3cml0dGVuIGFsbCBvdmVyLAorCSAgb3IgZXZlbiBjb250cmFkaWN0b3J5IHZhcnlpbmcgZmlsZXNpemUgaW5mbywgb3IgZHVyYXRpb24gaW5mbyB0aGF0IHdpbGwgbm90CisJICBiZSByZXdyaXR0ZW4gdXBvbiBoZWFkZXIgcmV3cml0ZS4KKworMjAxMS0xMi0xNiAxOToxNTowMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IHVzZSBHc3RDb2xsZWN0UGFkczIgYnVmZmVyIGNhbGxiYWNrIGFuZCBydW5uaW5nIHRpbWUgY2xpcHBlcgorCSAgLi4uIHNpbmNlIHRoZSBkZWZhdWx0IGNvbGxlY3Rpb24gaGV1cmlzdGljcyBzdWZmaWNlLgorCisyMDExLTEyLTE2IDE4OjAzOjAxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHVzZSBHc3RDb2xsZWN0UGFkczIgYnVmZmVyIGNhbGxiYWNrIGFuZCBydW5uaW5nIHRpbWUgY2xpcHBlcgorCSAgLi4uIHNpbmNlIGRlZmF1bHQgY29sbGVjdGlvbiBoZXVyaXN0aWNzIHN1ZmZpY2UuCisKKzIwMTEtMTItMTYgMTc6MjA6NTEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogYnJpbmcgYSBmZXcgZGVidWcgc3RhdGVtZW50cyB1cCB0byBzcGVjcworCSAgLi4uIGFuZCBtaW5vciBzcGVsbGluZyBmaXguCisKKzIwMTEtMTItMTYgMTY6NTY6MzcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogYWRkaXRpb25hbCBzdWJ0aXRsZSBzdXBwb3J0CisKKzIwMTEtMTItMTUgMjE6NTA6NDIgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJICBtYXRyb3NrYW11eDogYWRkaXRpb25hbCBidWZmZXIgaGFuZGxpbmcgY2xlYW51cAorCisyMDExLTEyLTE1IDIxOjQ1OjE3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHVzZSBHc3RDb2xsZWN0UGFkczIgYnVmZmVyIGNhbGxiYWNrIGFuZCBydW5uaW5nIHRpbWUgY2xpcHBlcgorCisyMDExLTEyLTA3IDEzOjI0OjU1ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5oOgorCSAgYWFjcGFyc2U6IHBhcnNlIExPQVMgdmFyaWFudAorCSAgVGhlIExPQVMgdmFyaWFudCBzZWVtcyB0byBoYXZlIHRocmVlIGRpZmZlcmVudCBzdWJ2YXJpYW50cyBpdHNlbGYsCisJICBvbmx5IG9uZSBvZiB0aGVtIGlzIGltcGxlbWVudGVkIGFzIG15IHR3byBzYW1wbGVzIGhhcHBlbiB0byBiZQorCSAgdXNpbmcgdGhhdCBvbmUuCisJICBUaGUgc2FtcGxlIHJhdGUgaXMgbm90IGFsd2F5cyByZXBvcnRlZCBjb3JyZWN0bHksIGFzIHRoZSAibWFpbiIKKwkgIHNhbXBsZSByYXRlIGlzIGFwcGFyZW50bHkgc29tZXRpbWVzIGhhbGYgd2hhdCBpdCBzaG91bGQgYmUgKGJvdGgKKwkgIG9mIG15IHNhbXBsZXMgcmVwb3J0IDI0MDAwIEh6IHRoZXJlKSwgYW5kIHRoZXJlIGFyZSB0d28gb3RoZXIKKwkgIHBhcnRzIG9mIHRoZSBzdWJ2YXJpYW50IHdpdGggZGlmZmVyZW50IHNhbXBsaW5nIHJhdGVzLiBPbmUgb2YgdGhlbQorCSAgaXMgcGFyc2VkLCBidXQgbm90IHRoZSBvdGhlciwgYXMgaXQncyBsb2NhdGVkIGFmdGVyIHNvbWUgb3RoZXIKKwkgIGxhcmdlIGFtb3VudCBvZiB2YXJpYWJsZSBkYXRhIHRoYXQgbmVlZHMgcGFyc2luZyBmaXJzdCwgYW5kIHRoZXJlCisJICBzZWVtcyB0byBiZSBhIExPVCBvZiBpdCwgd2hpY2ggaXMgdXNlbGVzcyBmb3Igb3VyIG5lZWRzIGhlcmUuCisJICBUaGlzIGVuZHMgdXAgYmVpbmcgcmF0aGVyIGluY29uc2VxdWVudGlhbCwgYXMgZmZkZWNfYWFjX2xhdG0sCisJICB3aGljaCBpcyB0aGUgb25seSBkZWNvZGVyIHRoYXQgY2FuIGRlY29kZSBzdWNoIHN0cmVhbXMsIGRvZXMgbm90CisJICBuZWVkIHRoZSBzYW1wbGUgcmF0ZSBvbiB0aGUgY2FwcyBhbnl3YXkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY1Mzk0CisKKzIwMTEtMTItMTkgMTA6NDg6NTQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IGRvbid0IHJlbW92ZSBzcmNwYWQKKwkgIERvbid0IHJlbW92ZSB0aGUgYWx3YXlzIHNyY3BhZCBpbiByZWFkeSBhbmQgbWFrZSB0aGUgZWxlbWVudCByZXVzYWJsZS4KKworMjAxMS0xMi0xNSAxNjo0MDoyMSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5oOgorCSAgZmx2bXV4OiB1c2UgR3N0Q29sbGVjdFBhZHMyIGV2ZW50IGNhbGxiYWNrCisJICAuLi4gaW4gc3RlYWQgb2YgbG9jYWwgSEFDSy4KKworMjAxMS0xMi0xNSAxNjozMDoxNyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkgIG1hdHJvc2thbXV4OiB1c2UgR3N0Q29sbGVjdFBhZHMyIGV2ZW50IGNhbGxiYWNrCisJICAuLi4gaW4gc3RlYWQgb2YgbG9jYWwgSEFDSy4KKworMjAxMS0xMi0xNSAxNjoxNjo1MiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5oOgorCSAgYXZpbXV4OiB1c2UgR3N0Q29sbGVjdFBhZHMyIGV2ZW50IGNhbGxiYWNrCisJICAuLi4gaW4gc3RlYWQgb2YgbG9jYWwgSEFDSy4KKworMjAxMS0xMi0xNSAxNjoxNToyMiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiB1c2UgR3N0Q29sbGVjdFBhZHMyIGV2ZW50IGNhbGxiYWNrCisJICAuLi4gaW4gc3RlYWQgb2YgbG9jYWwgSEFDSy4KKworMjAxMS0xMi0xNCAxOToxMzoyMSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmg6CisJICBzbXB0ZTogcG9ydCB0byBHc3RDb2xsZWN0UGFkczIKKworMjAxMS0xMi0xNCAxOToxMDo1MyArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5oOgorCSAgbXVsdGlwYXJ0bXV4OiBwb3J0IHRvIEdzdENvbGxlY3RQYWRzMgorCisyMDExLTEyLTE0IDE5OjA3OjIzICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgbWF0cm9za2FtdXg6IHBvcnQgdG8gR3N0Q29sbGVjdFBhZHMyCisKKzIwMTEtMTItMTQgMTk6MDI6MjMgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4Lmg6CisJICBxdG11eDogcG9ydCB0byBHc3RDb2xsZWN0UGFkczIKKworMjAxMS0xMi0xNCAxODo1NTozNiArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuaDoKKwkgIGludGVybGVhdmU6IHBvcnQgdG8gR3N0Q29sbGVjdFBhZHMyCisKKzIwMTEtMTItMTQgMTg6NTI6MzcgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguaDoKKwkgIGZseG11eDogcG9ydCB0byBHc3RDb2xsZWN0UGFkczIKKworMjAxMS0xMi0xNCAxODozODowOSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5oOgorCSAgYXZpbXV4OiBwb3J0IHRvIEdzdENvbGxlY3RQYWRzMgorCisyMDExLTEyLTE0IDE4OjM0OjI1ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuaDoKKwkgIGNhaXJvdGV4dG92ZXJsYXk6IHBvcnQgdG8gR3N0Q29sbGVjdFBhZHMyCisKKzIwMTEtMTItMTMgMTg6MTg6NDUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thZGVtdXg6IGZpbHRlciBib2d1cyBpbmRleCBlbnRyaWVzIHdpdGggbWlzc2luZyBibG9jayBudW1iZXIKKwkgIC4uLiB0byBhdm9pZCBjb250cmFkaWN0b3J5IGluZm9ybWF0aW9uIHJlc3VsdGluZyBpbiBzZWVrcyBzZW5kaW5nIG1vcmUKKwkgIGRvd25zdHJlYW0gdGhhbiBuZWVkZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHNlZ21lbnQuCisKKzIwMTEtMTItMTMgMTg6MTU6MTggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGNhdGVyIGZvciBzYWZlciBhcml0aG1ldGljIHdpdGggZ2xvYmFsIHN0YXJ0IHRpbWUKKworMjAxMS0xMi0xMyAxNzowMjowMSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogdHdlYWsgZmluYWwgY2xvc2luZyBzZWdtZW50IHNlbmRpbmcKKwkgIC4uLiB0byBhdm9pZCBpdCBpbnRlcmZlcmluZyB3aXRoIChzcGFyc2UpIHN0cmVhbSBzeW5jaW5nLgorCisyMDExLTEyLTEyIDExOjUxOjA2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBtYWtlIGRlYnVnIG1lc3NhZ2UgbW9yZSB1c2VmdWwKKwkgIEFkZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFnbGlzdCBhbmQgd2hpY2ggcGFkIHJlY2VpdmVkIHRoZQorCSAgdGFnIGV2ZW50IG9uIHRoZSBkZWJ1ZyBsb2dnaW5nLgorCisyMDExLTEyLTEzIDExOjQ2OjQzICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogYXZvaWQgdXNpbmcgZmxvYXRpbmcgcG9pbnQgdW5uZWNlc3NhcmlseQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NTkxMQorCisyMDExLTEyLTEzIDExOjQyOjQwICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogZml4IGZvcm1hdCBzcGVjaWZpZXIgc2lnbmVkbmVzcworCSAgVXNlIHVuc2lnbmVkIHNwZWNpZmllcnMgZm9yIGFsbCB1bnNpZ25lZCB2YWx1ZXMuCisJICBBIGxvdCBvZiB0aGUgdmFsdWVzIHVzZWQgaGVyZSBhcmUgdW5zaWduZWQsIGFuZCBzb21lIGNhbiB0YWtlCisJICBoaWdoIGVub3VnaCB2YWx1ZXMgdGhhdCB0aGVpciBzaWduZWQgY291bnRlcnBhcnQgd2lsbCBiZSBuZWdhdGl2ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjU5MTEKKworMjAxMS0xMi0xMiAxNjo0OToxOSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICB3YXZwYXJzZTogYWRkIGEgaWdub3JlLWxlbmd0aCBwcm9wZXJ0eQorCSAgVGhpcyBhbGxvd3MgcGxheWluZyBicm9rZW4gc3RyZWFtcyB3aGljaCB3cml0ZSBhbiBpbmNvcnJlY3QKKwkgIGxlbmd0aCBpbiB0aGVpciBkYXRhIGNodW5rcyAoc3VjaCBhcywgYXQgbGVhc3QsIG9uZSBzdHJlYW1pbmcKKwkgIGNhbWVyYSkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY1OTExCisKKzIwMTEtMTItMTIgMTE6NTQ6NTYgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QtbGlicy9nc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oOgorCSAgZ2xpYi1jb21wYXQ6IEFkZCBsaWNlbnNlIGJvaWxlcnBsYXRlIGZvciBMR1BMCisKKzIwMTEtMTItMTIgMTU6MTU6NDYgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IG1pbmQgKHVuKXNpZ25lZCBpbiBzb21lIHRpbWVzdGFtcCBhcml0aG1ldGljCisJICAuLi4gdG8gYXZvaWQgZW5kaW5nIHVwIHdpdGggaW52YWxpZCAobmVnYXRpdmUpIGR1cmF0aW9uLgorCisyMDExLTAyLTA5IDE1OjMxOjIyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBpbmNyZWFzZSBwYXJzZSB0b2xlcmFuY2UgZm9yIGZ1enp5IGZpbGUgY2FzZXMKKworMjAxMS0xMi0xMiAxMDozODoyMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIE1ha2VmaWxlLmFtOgorCSAgYnVpbGQ6IGRpc3QgZ2xpYi1jb21wYXQtcHJpdmF0ZS5oIHByb3Blcmx5CisJICBBZGQgbWlzc2luZyBzbGFzaC4KKworMjAxMS0xMi0xMiAxMDoxODoxNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6CisJICB0ZXN0czogdXNlIGF0ZXhpdCwgZ19hdGV4aXQgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBnbGliIG1hc3RlcgorCisyMDExLTEyLTEyIDAyOjUyOjEzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bW9vdnJlY292ZXIuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIFN1cHByZXNzIGRlcHJlY2F0aW9uIHdhcm5pbmdzIGluIHNlbGVjdGVkIGZpbGVzLCBmb3IgZ19zdGF0aWNfcmVjX211dGV4XyogbW9zdGx5CisJICBHU3RhdGljUmVjTXV0ZXggaXMgcGFydCBvZiBvdXIgQVBJL0FCSSwgbm90IG11Y2ggd2UgY2FuIGRvIGhlcmUKKwkgIGluIDAuMTAgZm9yIG1vc3Qgb2YgdGhlc2UuCisKKzIwMTEtMTItMTIgMDI6NDE6MzcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSogdGVzdHMvaWNsZXMvZXF1YWxpemVyLXRlc3QuYzoKKwkqIHRlc3RzL2ljbGVzL2dka3BpeGJ1ZnNpbmstdGVzdC5jOgorCSogdGVzdHMvaWNsZXMvdGVzdC1vc3M0LmM6CisJKiB0ZXN0cy9pY2xlcy92aWRlb2Nyb3AtdGVzdC5jOgorCSAgdGVzdHM6IGdfdGhyZWFkX2luaXQoKSBpcyBkZXByZWNhdGVkIGluIGdsaWIgbWFzdGVyCisJICBJdCdzIG5vdCBuZWVkZWQgYW55IGxvbmdlci4KKworMjAxMS0xMi0xMiAwMjozODozNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogc3lzL29zczQvb3NzNC1taXhlci5jOgorCSogdGVzdHMvaWNsZXMvdjRsMnNyYy10ZXN0LmM6CisJICBVc2UgZ190aHJlYWRfdHJ5X25ldygpIGluc3RlYWQgb2YgZ190aHJlYWRfY3JhdGUoKSB3aXRoIG5ld2VyIGdsaWIgdmVyc2lvbnMKKworMjAxMS0xMi0xMiAwMjozMTozNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmg6CisJICBhbHBoYTogdXNlIG5ldyBnbGliIEFQSSBmb3Igc3RhdGljIG11dGV4IGlmIGF2YWlsYWJsZQorCisyMDExLTEyLTEyIDAyOjMwOjQ1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogTWFrZWZpbGUuYW06CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9jbGllbnQuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZWF1ZGlvc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJKiBnc3QtbGlicy9nc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdGFzcGVjdHJhdGlvY3JvcC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICBXb3JrIGFyb3VuZCBkZXByZWNhdGVkIHRocmVhZCBBUEkgaW4gZ2xpYiBtYXN0ZXIKKwkgIEFkZCBwcml2YXRlIHJlcGxhY2VtZW50cyBmb3IgZGVwcmVjYXRlZCBmdW5jdGlvbnMgc3VjaCBhcworCSAgZ19tdXRleF9uZXcoKSwgZ19tdXRleF9mcmVlKCksIGdfY29uZF9uZXcoKSBldGMuLCBtb3N0bHkKKwkgIHRvIGF2b2lkIHRoZSBkZXByZWNhdGlvbiB3YXJuaW5ncy4gV2UnbGwgY2hhbmdlIHRoZXNlCisJICBvdmVyIHRvIHRoZSBuZXcgQVBJIG9uY2Ugd2UgZGVwZW5kIG9uIGdsaWIgPj0gMi4zMi4KKworMjAxMS0xMi0xMiAxMDoyNDo0NSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogUmVxdWlyZSBHTGliID49IDIuMjQKKwkgIEFsbCBvdGhlciBtb2R1bGVzIHJlcXVpcmUgdGhpcyBhbHJlYWR5IGFuZCBub2JvZHkgaXMgdGVzdGluZyB3aXRoCisJICBvbGRlciB2ZXJzaW9ucyBhbnl3YXkuCisKKzIwMTEtMTItMTEgMTg6NDA6MzEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmM6CisJICBnZGtwaXhidWZzaW5rOiBmaXggaW52ZXJ0ZWQgcGl4ZWwtYXNwZWN0LXJhdGlvCisJICBTcG90dGVkIGJ5IE1pa2UgTW9ycmlzb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY1ODgyCisKKzIwMTEtMTItMTEgMTc6NTU6MTQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYzoKKwkgIHB1bHNlYXVkaW9zaW5rOiBkb24ndCBsZWFrIHBhZCB0ZW1wbGF0ZQorCisyMDExLTEyLTEwIDE0OjQ4OjU3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJICBzb3VwOiBmaXggc3RhcnQvc3RvcCByYWNlIGluIHNvdXBodHRwY2xpZW50c2luaworCSAgRml4IGNyYXNoIG9yIGhhbmcgaW4gZ2VuZXJpYy9zdGF0ZXMgdW5pdCB0ZXN0IHdoZW4gZG9pbmcgc3RvcCgpCisJICByaWdodCBhZnRlciBzdGFydCgpLiBDcmVhdGUgbWFpbiBsb29wIGluIHRoZSBzdGFydCBmdW5jdGlvbiBhbHJlYWR5CisJICBhbmQgbm90IGp1c3QgaW4gdGhlIHRocmVhZCBmdW5jdGlvbiwgc28gdGhhdCBzdG9wKCkgYWx3YXlzIGhhcyBhCisJICB2YWxpZCBtYWluIGxvb3AgdG8gcXVpdCBvbi4gQWxzbywgY2FsbGluZyBnX21haW5fbG9vcF9xdWl0KCkgYmVmb3JlCisJICBnX21haW5fbG9vcF9ydW4oKSB3b24ndCB3b3JrIGFuZCByZXN1bHQgaW4gdGhlIHN0b3AgZnVuY3Rpb24gd2FpdGluZworCSAgZm9yIHRoZSB0aHJlYWQgdG8gam9pbiBmb3JldmVyLiBUaGVyZWZvcmUsIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8KKwkgIGJlIHJlYWR5IGFuZCBnZXQgdGhlIG1haW4gbG9vcCBydW5uaW5nIGluIHRoZSBzdGFydCgpIGZ1bmN0aW9uLCB0bworCSAgYmUgc3VyZSBzdG9wKCkgYWx3YXlzIHdvcmtzLgorCisyMDExLTEyLTEwIDEzOjM1OjA4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvZmlsZXMvTWFrZWZpbGUuYW06CisJICB0ZXN0czogZGlzdCB0ZXN0IGZpbGUgdXNlZCBpbiBtYXRyb3NrYXBhcnNlIHVuaXQgdGVzdAorCisyMDExLTEyLTEwIDEyOjMyOjMyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmd2b2x1bWUuYzoKKwkgIHRlc3RzOiBmaXggdXAgcmd2b2x1bWUgdGVzdCBmb3IgYmFzZXRyYW5zZm9ybSBldmVudCBjYWNoaW5nCisJICBTb21lIHRlc3RzIGFzc3VtZWQgdGhhdCB0YWcgZXZlbnRzIHdvdWxkIGFsd2F5cyBwdXNoZWQgdGhyb3VnaAorCSAgaW1tZWRpYXRlbHksIHdoaWNoIGlzbid0IHRoZSBjYXNlIGFueSBsb25nZXIsIHNvIHB1c2ggYSBuZXdzZWdtZW50CisJICBldmVudCBhbmQgYW4gZW1wdHkgYnVmZmVyIGZpcnN0LgorCisyMDExLTEyLTEwIDExOjEyOjAxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHNzcmNkZW11eDogZml4IGl0ZXJhdG9yIGFuZCBjYXBzCisKKzIwMTEtMTItMTAgMTE6MTE6MDAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGZvcndhcmQgdGhlIGNhcHMgZXZlbnQKKworMjAxMS0xMi0xMCAxMTowOTo0MyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHNpbXBseSBmb3J3YXJkIHRoZSBjYXBzIGV2ZW50CisJICBmb3J3YXJkIHRoZSBjYXBzIGV2ZW50IHdlIGdldCBhcyBpbnB1dCBpbnN0ZWFkIG9mIG1ha2luZyBhIG5ldyBldmVudCBldGMuLgorCisyMDExLTEyLTA5IDIwOjEwOjE5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBmb3J3YXJkIGNhcHMKKworMjAxMS0xMi0wOSAxOTo0NjowMiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwOiBwYXNzIHBhcmVudCB0byBzZXRjYXBzIG1ldGhvZHMKKworMjAxMS0xMi0xMCAwMjoyMTowMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL0xJTkdVQVM6CisJKiBwby9lby5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHYucG86CisJKiBwby9zci5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTEtMTItMDkgMTY6MDQ6NTYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlOiByZW5hbWUgImNsaWVudCIgcHJvcGVydGllcyB0byAiY2xpZW50LW5hbWUiCisJICBCZXR0ZXIgbmFtZSwgYnV0IGFsc28gbWF0Y2hlcyB0aGUgcHJvcGVydHkgb24gdGhlIGphY2sKKwkgIGVsZW1lbnRzICh3aGVyZSAiY2xpZW50IiBpcyB1c2VkIGZvciBzb21ldGhpbmcgZWxzZSkuCisKKzIwMTEtMTItMDkgMTU6NTA6MjggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgIGphY2s6IGRvbid0IGxlYWsgY2xpZW50IG5hbWUgd2hlbiBmcmVlaW5nIHRoZSBlbGVtZW50CisJICBBbmQgYWRkIGd0ay1kb2MgY2h1bmtzIGZvciB0aGUgbmV3IHByb3BlcnR5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NTg3MgorCisyMDExLTEyLTA5IDE1OjQ1OjAzICswMDAwICBOaWNvbGFzIEJhcm9uIDxob2dnaW5zQHJhZGlvbS5mcj4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5oOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuaDoKKwkgIGphY2s6IGFkZCAiY2xpZW50LW5hbWUiIHByb3BlcnR5IHRvIGphY2thdWRpb3NpbmsgYW5kIGphY2thdWRpb3NyYworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NTg3MgorCisyMDExLTEyLTA5IDEyOjE5OjEzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2xhdy9NYWtlZmlsZS5hbToKKwkgIGxhdzogZml4IENGTEFHUyBhbmQgTElCUyBvcmRlciBpbiBNYWtlZmlsZS5hbQorCisyMDExLTEyLTA5IDEyOjE1OjMwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgcmVtb3RlLXRyYWNraW5nIGJyYW5jaCAnb3JpZ2luL21hc3RlcicgaW50byAwLjExCisKKzIwMTEtMTItMDkgMTA6NTE6MTQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi1tYXJzaGFsLmxpc3Q6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cDogZml4IG1hcnNoYWxsZXJzCisJICBSZW1vdmUgY3VzdG9tIG1hcnNoYWxsZXJzIGZvciBtaW5vYmplY3QuCisJICBJbml0IFJUQ1AgYnVmZmVyIGNvcnJlY3RseS4KKwkgIEhhbmRsZSByZXN1bHRzIGZyb20gc2V0Y2FwcworCSAgUmVtb3ZlIGFzc2VydHMuCisKKzIwMTEtMTItMDkgMTA6NTA6MTggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9sYXcvTWFrZWZpbGUuYW06CisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L2FsYXcuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOgorCSAgbGF3OiBmaXggbmVnb3RpYXRpb24KKworMjAxMS0xMi0wOCAxMTowMDo0NSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBzdHJlYW0tZm9ybWF0PXJhdyBnb2VzIHdpdGggYWFjIGNhcHMsIG5vdCBtcDMgY2FwcworCisyMDExLTEyLTA4IDAxOjI4OjI2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgcmVtb3RlLXRyYWNraW5nIGJyYW5jaCAnb3JpZ2luL21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmMKKworMjAxMS0xMi0wMiAxMjowNzoyNCArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJzcmM6IGRvIG5vdCBpZ25vcmUgdGhlIGhpZ2hlc3QgZnJhbWUgaW50ZXJ2YWwKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjUzODcKKworMjAxMS0xMi0wMiAxMTo1OTowMyArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJzcmM6IGRvIG5vdCBpZ25vcmUgdGhlIGxhcmdlc3QgcmVzb2x1dGlvbgorCSAgVGhlICdtYXgnIHZhbHVlIGlzbid0IGFuIFNUTCBzdHlsZSAib25lIGFmdGVyIHRoZSBlbmQiIGJvdW5kLAorCSAgYnV0IHRoZSBsYXJnZXN0IGFsbG93ZWQgdmFsdWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY1Mzg3CisKKzIwMTEtMTItMDYgMTY6NDc6MjUgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oOgorCSAgZG9jczogYWRkIGFkZCB0aGUgdHdvIGVudW0gdmFsdWVzIHRoYXQgd2VyZSBqdXN0IGFkZGVkIHRvbworCisyMDExLTEyLTA2IDE2OjE0OjU0ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oOgorCSAgbXVsdGlmaWxlc2luazogZXhwb3NlIHRoZSBlbnVtIHByb3BlcnR5IGRvY3MgZm9yIHNwbGl0dGluZyBtb2RlLgorCSAgRml4ZXMgIzY2NTY2Ni4KKworMjAxMS0xMi0wNiAxNDoyMzozMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJICBoMjYzcGF5OiBmaXggaW52YWxpZCByZXR1cm4gdmFsdWUKKworMjAxMS0xMi0wNiAxMzo1OTo1MiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcmVtb3ZlIHVudXNlZCBmbHVzaCBwYXJhbQorCisyMDExLTEyLTA1IDE4OjQwOjI2ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RydHB4cXRkZXBheS5jOgorCSAgcnRweHF0ZGVwYXk6IEluaXRpYWxpemUgR3N0UlRQQnVmZmVyIGJlZm9yZSB1c2FnZQorCisyMDExLTEyLTA1IDE4OjQwOjEyICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwbWFuYWdlcjogSW5pdGlhbGl6ZSBHc3RSVFBCdWZmZXIgYmVmb3JlIHVzYWdlCisKKzIwMTEtMTItMDUgMTg6Mzk6NTkgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkgIHJ0cDogSW5pdGlhbGl6ZSBHc3RSVFBCdWZmZXIgYmVmb3JlIHVzYWdlCisKKzIwMTEtMTItMDUgMTI6MTU6MjEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiByZXBsYWNlIGRlcHJlY2F0ZWQgR1NUX0NMQVNTX0xPQ0sKKworMjAxMS0xMS0yNCAxMzo1ODowMSArMDEwMCAgU2ViYXN0aWFuIFJhc211c3NlbiA8c2Vicm5AYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAgcnRwanBlZ3BheTogQ2VpbCBqcGVnIGRpbWVuc2lvbnMsIGluc3RlYWQgb2YgZmxvb3IKKwkgIEEgSlBFRyBpbWFnZSBpbnNpZGUgYW4gUlRQIHN0cmVhbSBoYXMgYSBwcmVjZWVkaW5nIFJGQzI0MzUgaGVhZGVyIHRoYXQKKwkgIGNvbnZleXMgd2lkdGgvaGVpZ2h0LiBUaGUgZGltZW5zaW9ucyBpbiB0aGlzIGhlYWRlciBhcmUgbGltaXRlZCB0byBiZQorCSAgbXVsdGlwbGVzIG9mIDguIFNpbmNlIEpQRUcgdXNlcyBhbiBNQ1Ugb2YgOHg4IHBpeGVscyBhbnkgaW1hZ2UgbXVzdAorCSAgYWxyZWFkeSBpbmRpcmVjdGx5IGhhdmUgaW1hZ2UgZGF0YSBkaW1lbnNpb25zIHRoYXQgYXJlIHJvdW5kZWQgdXAgaW4KKwkgIG9yZGVyIHRvIGNvbnRhaW4gZW5vdWdoIGRhdGEgdG8gcmVuZGVyIHRoZSBpbWFnZS4gVGhlcmVmb3JlIHRoaXMgZml4CisJICBzYWZlbHkgcm91bmRzIHRoZSBpbWFnZSBkaW1lbnNpb25zIGluIHRoZSBSRkMyNDM1IGhlYWRlciB1cCB0byB0aGUKKwkgIGNsb3Nlc3QgbXVsdGlwbGUgb2YgOC4KKworMjAxMS0xMi0wNCAxMjo1MDo1NyArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5oOgorCSAgZmxhY3BhcnNlOiBlbnN1cmUgd2Ugb25seSBjaGVjayBmb3Igc2FtcGxlL2Jsb2NrIG1peHVwIGF0IHN0YXJ0CisJICBPdGhlcndpc2Ugd2UgbWlnaHQgdHJpZ2dlciBhdCBzb21lIHBvaW50IHdpdGhpbiB0aGUgZmlsZSwgYnV0IHRoZQorCSAgY2hlY2sgaXMgb25seSBtYWtpbmcgc2Vuc2UgZm9yIHRoZSBzZWNvbmQgYmxvY2suCisKKzIwMTEtMTItMDMgMTg6MTQ6NTkgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkgIG1hdHJvc2thcGFyc2U6IHdhcm4gaWYgYWNjdW11bGF0aW5nIGhlYWRlcnMgYWZ0ZXIgdGhleSB3ZXJlIHB1c2hlZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NTQxMgorCisyMDExLTEwLTI1IDEyOjU0OjQzIC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJICBtYXRyb3NrYXBhcnNlOiBmaXggcGFyc2luZworCSAgTWFyayBtb3JlIHBhcnRzIGFzIGJlbG9uZ2luZyB0byBzdHJlYW1oZWFkZXJzLgorCisyMDExLTEyLTAzIDE3OjMwOjEwICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IGZpeCBkaXNjb250aW51aXR5IHRocmVzaG9sZCBjaGVjayB3aGVuIHRpbWVzdGFtcHMgZ28gYmFja3dhcmRzCisJICBTaW5jZSB1bnNpZ25lZCB0eXBlcyBhcmUgdXNlZCwgYSBuZWdhdGl2ZSB2YWx1ZSB3b3VsZCBzaG93IGFzIHZlcnksIHZlcnkKKwkgIHBvc2l0aXZlLgorCSAgRml4ZXMgQS9WIHN5bmMgb24gc29tZS4uLiBsZXNzIHRoYW4gd2VsbCBtYWRlIGZpbGVzIHdoZXJlIHRpbWVzdGFtcHMgZ28KKwkgIGJhY2t3YXJkcy4KKworMjAxMS0xMi0wMiAyMjoyNToxNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJKiBnc3QvZGVidWd1dGlscy90ZXN0cGx1Z2luLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIHVwZGF0ZSBmb3IgYmFzZXNpbmsgZXZlbnQgaGFuZGxlciBjaGFuZ2VzCisKKzIwMTEtMTItMDIgMTI6MDE6MjIgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyc3JjOiBhZGQgYSBjb21tZW50IGFib3V0IGEgImhpZGRlbiIgYXNzdW1wdGlvbiBvbiByYW5rIHZhbHVlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NTM4NworCisyMDExLTEyLTAyIDAxOjU4OjMwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgcmVtb3RlLXRyYWNraW5nIGJyYW5jaCAnb3JpZ2luL21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbAorCSAgZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmMKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmMKKwkgIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jCisKKzIwMTEtMTItMDEgMTg6NTU6NDUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDNkZW11eC5jOgorCSAgdXBkYXRlIGZvciB0YWcgQVBJIGNoYW5nZXMKKworMjAxMS0xMi0wMSAxNToyOToxNSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogcGxhY2F0ZSBnY2Mgc2luY2UgLVdlcnJvciBpcyB1c2VkCisJICBJbml0aWFsaXplIHZhbHVlcyB0aGF0IEdDQyBjYW5ub3QgcHJvdmUgYXJlIG5vdCB1c2VkIHdpdGhvdXQKKwkgIGJlaW5nIGluaXRpYWxpemVkLCBhbmQgYXNzZXJ0IHRoYXQgSSBkaWQgbm90IG1lc3MgdXAgbXkgcHJvb2YuCisKKzIwMTEtMTItMDEgMTQ6MTM6MDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiBmaXggdXAgTElCUyBvcmRlciBzb20gbW9yZWAKKworMjAxMS0xMi0wMSAxMzoyMjo0MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thLW11eDogZml4IG5hbWUgb2YgbmV3IHByb3BlcnR5IGFuZCB0aGUgdW5pdCB0ZXN0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0Mzc5CisKKzIwMTEtMDktMjUgMTQ6NTc6NTYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIG11bHRpZmlsZXNpbms6IGFkZCBiYXNpYyBidWZmZXIgbGlzdCBoYW5kbGluZworCSAgV2UgYXNzdW1lIGZvciBub3cgdGhhdCBhbGwgYnVmZmVycyBpbiBhIGJ1ZmZlciBsaXN0CisJICBzaG91bGQgZW5kIHVwIGluIHRoZSBzYW1lIGZpbGUgKHNvIHdlIGNhbiBncm91cCBHT1BzCisJICBpbiBidWZmZXIgbGlzdHMsIGZvciBleGFtcGxlKS4gQ291bGQgb3B0aW1pc2UgdGhpcworCSAgYSBiaXQgdG8gYXZvaWQgdGhlIG1lbWNweS4KKworMjAxMS0wOS0yMyAxODo0MzozNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgbXVsdGlmaWxlc2luazogd3JpdGUgc3RyZWFtLWhlYWRlcnMgd2hlbiBzd2l0Y2hpbmcgdG8gdGhlIG5leHQgZmlsZSBpbiBtYXgtc2l6ZSBtb2RlCisKKzIwMTEtMDktMjMgMTg6MzE6MDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oOgorCSAgbXVsdGlmaWxlc2luazogYWRkIG5ldyAnbWF4LXNpemUnIG1vZGUgZm9yIHN3aXRjaGluZyB0byB0aGUgbmV4dCBmaWxlCisKKzIwMTEtMDktMjMgMTc6NDk6MDUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oOgorCSAgbXVsdGlmaWxlc2luazogYWRkICJtYXgtZmlsZS1zaXplIiBwcm9wZXJ0eSBmb3IgbmV3IG5leHQtZmlsZSBtb2RlCisKKzIwMTEtMTItMDEgMTM6Mzg6MDYgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IERvbid0IGZvcmdldCBTU0Egc3VidGl0bGVzIGluIGxhc3QgY29tbWl0CisKKzIwMTEtMTItMDEgMTM6MzQ6NTIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIG1hdHJvc2thZGVtdXg6IE9ubHkgY2hlY2sgZm9yIG1hcmt1cCBhbmQgZXNjYXBlIGlmIG5lY2Vzc2FyeSBmb3IgcGxhaW50ZXh0IHN1YnRpdGxlcworCSAgT3RoZXJ3aXNlIHdlIGJyZWFrIFVTRiBhbmQgQVNTL1NTQSBzdWJ0aXRsZXMuCisKKzIwMTEtMTItMDEgMTM6MjM6MzMgKzAxMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRAZ21haWwuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL01ha2VmaWxlLmFtOgorCSAgbXVsdGlmaWxlOiBmaXggYnVpbGQgaW4gdW5pbnN0YWxsZWQgc2V0dXAKKwkgIEFkZCAtYmFzZSBsaWJzIGluY2x1ZGVzIHRvIENGTEFHUywgZml4IG9yZGVyIG9mIExJQlMgPGNpdD4uCisKKzIwMTEtMTItMDEgMTM6MDg6MDEgKzAxMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRAZ21haWwuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWx0aWZpbGUuYzoKKwkgIHRlc3RzOiBmaXggZ19ta2R0ZW1wIHByZXNlbmNlIGNoZWNrIGluIG11bHRpZmlsZSB0ZXN0cworCSAgZ19ta2R0ZW1wIHdhcyBhZGRlZCBpbiBnbGliIDIuMzAgZXZlbiB0aG91Z2ggdGhlIGRvYyBjbGFpbXMgaXQgd2FzIGFkZGVkIGluCisJICAyLjI2LgorCisyMDExLTA3LTE3IDIzOjU2OjA0ICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmg6CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jOgorCSAgbXVsdGlmaWxlc2luazogYWRkIGZsYWcgdG8gY3V0IGFmdGVyIGEgZm9yY2Uga2V5IHVuaXQgZXZlbnQKKworMjAxMS0xMi0wMSAxMjo0NzoyNiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogQ29weSBhbGwgYnVmZmVyIGZsYWdzIHdoZW4gY3JlYXRpbmcgYSBzdWJ0aXRsZSBidWZmZXIgY29weSBhZnRlciBwb3N0cHJvY2Vzc2luZworCSAgVGhpcyBhbHNvIGNvcGllcyB0aGUgY2Fwcy4gT3RoZXJ3aXNlIHdlIGNvdWxkIGVuZCB1cCBwdXNpbmcKKwkgIHRoZSBmaXJzdCBidWZmZXIgd2l0aG91dCBhbnkgY2Fwcywgd2hpY2ggY2F1c2VzIGRvd25zdHJlYW0KKwkgIHRvIG5vdCBnZXQgbm90aWZpZWQgYWJvdXQgdGhlIGNhcHMuCisJICBGaXhlcyBidWcgIzY2NDg5Mi4KKworMjAxMS0xMC0xMSAwMjowNzoxMyArMDIwMCAgQWxleGV5IEZpc2hlciA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogbWFrZSBkZWZhdWx0IGZyYW1lcmF0ZSBvcHRpb25hbCBwZXIgc3RyZWFtCisJICB0aGVyZSBpcyBhdCBsZWFzdCB0d28gdXNlIGNhc2VzIHdoZXJlIGRlZmF1bHQgZnJhbWUgcmF0ZQorCSAgc2hvdWxkIG9yIG1heSBiZSBkaXNhYmxlZDoKKwkgIC0gdnA4IHN0cmVhbSB3aXRoIGFsdHJlZiBmcmFtZSBlbmFibGVkLiBJZiBkZWZhdWx0IGZyYW1lIHJhdGUKKwkgIGlzIGVuYWJsZWQsIHNvbWUgcGxheWVycyB3aWxsIG1pc3NpbnRlcnByZXRlIGl0IChjcml0aWNhbCEpCisJICAtIGZvciB3ZWJtIGNvbnRhaW5lciwgdG8gcmVkdWNlIG1pY3JvIG92ZXJoZWFkCisJICAtIGZvciBzdHJlYW0gd2l0aCB2YXJpYWJsZSBmcmFtZSByYXRlLgorCSAgU2lnbmVkLW9mZi1ieTogQWxleGV5IEZpc2hlciA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisyMDExLTExLTMwIDIyOjEzOjExICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvZWZmZWN0di9nc3RyaXBwbGUuYzoKKwkgIHJpcHBsZXR2OiBmaXggQ0xBTVAgZW5kLXZhbHVlcworCisyMDExLTExLTMwIDE5OjI1OjM3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5zaWduYWxzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb25vc2NvcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSAgZG9jczogdXBkYXRlIGRvY3MKKworMjAxMS0xMS0zMCAxOTowMDo0MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aWZpbGUvTWFrZWZpbGUuYW06CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0ZmlsZXNyYy5jOgorCSogZ3N0L211bHRpZmlsZS9wYXR0ZXJuc3BlYy5jOgorCSogZ3N0L211bHRpZmlsZS9wYXR0ZXJuc3BlYy5oOgorCSAgc3BsaXRmaWxlc3JjOiBzcGVjaWZ5IGZpbGVuYW1lcyB2aWEgbm9ybWFsIHdpbGRjYXJkcyBpbnN0ZWFkIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMKKwkgIExlc3MgY3JhY2t0YXN0aWMgaW4gdGhlIGVuZC4KKworMjAxMS0xMC0xMCAxODoyODoxMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRmaWxlc3JjLmM6CisJICBzcGxpdGZpbGVzcmM6IGNoZWNrIGJ5dGVzIGFjdHVhbGx5IHJlYWQsIGp1c3QgaW4gY2FzZQorCSAgSGFuZGxlIGNvcm5lciBjYXNlIHdoZXJlIHdlIHRyeSB0byByZWFkIGJleW9uZCB0aGUgZW5kIG9mIHRoZQorCSAgbGFzdCBmaWxlIHBhcnQsIGluIHdoaWNoIGNhc2Ugd2Ugd2FudCB0byByZXR1cm4gYSBzaG9ydCByZWFkLgorCSAgSWYgd2UgZ2V0IGZld2VyIGJ5dGVzIHRoYW4gZXhwZWN0ZWQgZm9yIGFueSBvdGhlciBmaWxlIHBhcnQsCisJICB3ZSBzaG91bGQganVzdCBlcnJvciBvdXQsIHNpbmNlIHNvbWV0aGluZyBmaXNoeSdzIGdvaW5nIG9uCisJICB0aGVuLgorCisyMDExLTEwLTA2IDA4OjMzOjE5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdGZpbGVzcmMuYzoKKwkgIHNwbGl0ZmlsZXNyYzogc2V0IG9mZnNldHMgb24gYnVmZmVycworCSAgTG9va3MgbGlrZSBzb21lIHBhcnNlcnMgKGluIHNvbWUgdmVyc2lvbnMgYXQgbGVhc3QpIGV4cGVjdCB0aGUKKwkgIG9mZnNldHMgdG8gYmUgc2V0LCBhbmQgYmVoYXZlIHdlaXJkIGlmIHRoYXQncyBub3QgdGhlIGNhc2UKKwkgIChlLmcuIG9mZi1ieS1vbmUgaW4gaDI2NHBhcnNlKS4KKworMjAxMS0wNy0yOCAyMDoxOTo1NiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9tdWx0aWZpbGUvTWFrZWZpbGUuYW06CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZS5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdGZpbGVzcmMuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRmaWxlc3JjLmg6CisJICBtdWx0aWZpbGU6IGFkZCBzcGxpdGZpbGVzcmMgZWxlbWVudAorCSAgQWRkIG5ldyBzcGxpdGZpbGVzcmMgZWxlbWVudCB0aGF0IHByZXNlbnRzIG11bHRpcGxlIGZpbGVzCisJICAoc2VsZWN0YWJsZSB2aWEgYSBsb2NhdGlvbiByZWdleCkgYXMgb25lIHNpbmdsZSBjb250aWd1b3VzCisJICBmaWxlLgorCisyMDExLTExLTMwIDA3OjU3OjQwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VtaXhlcmN0cmwuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgdXBkYXRlIGZvciBtb3ZlZCBhdWRpbyBpbnRlcmZhY2VzCisKKzIwMTEtMTEtMjkgMTc6MzQ6MTAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJICBSZXZlcnQgInB1bHNlYXVkaW9zaW5rOiBmaXggY2FwcyBsZWFrIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCBkNmE5ZGU5ZTJhZWRjOGI2NmFiMzIxOTkwMmI1YTM3ZThkNjVhZGEyLgorCSAgc2V0Y2FwcyBmdW5jdGlvbnMgYXJlbid0IHN1cHBvc2VkIHRvIHRha2Ugb3duZXJzaGlwIG9mIHRoZSBjYXBzIHBhc3NlZAorCisyMDExLTExLTI5IDE5OjEwOjU4ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9vdmVybGF5Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkb3JpZW50Lmg6CisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2ljbGVzL3Y0bDJzcmMtdGVzdC5jOgorCSAgZml4IGZvciBtb3ZlZCBpbnRlcmZhY2VzCisKKzIwMTEtMTEtMjggMjM6MjA6MzIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBjb21taXQgJzc1MjFiNTk3ZjRkYzQ5ZDhkMTY4ZjM2OGYwZTdlYmFmOThhNzIxNTYnIGludG8gMC4xMQorCisyMDExLTExLTI4IDIxOjI3OjUzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgcmVtb3RlLXRyYWNraW5nIGJyYW5jaCAnb3JpZ2luL21hc3RlcicgaW50byAwLjExCisKKzIwMTEtMTEtMjggMjE6Mjc6NDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBjb21taXQgJ2EyMzM3YjhhZjQ1Y2I1ZThjMDkxZmYwZTFjM2VmNGI2Y2M3YjIwYTMnIGludG8gMC4xMQorCisyMDExLTExLTI4IDE4OjI1OjUyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJICBVcGRhdGUgZm9yIGluZGV4YWJsZSBjaGFuZ2UKKworMjAxMS0xMS0yOCAxNzo1MjowNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkgIHVwZGF0ZSBmb3IgY2xvY2sgcHJvdmlkZXIgQVBJIGNoYW5nZQorCisyMDExLTExLTI4IDE2OjU3OjI0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgZml4IGZvciBlbGVtZW50IGZsYWcgdXBkYXRlcworCisyMDExLTExLTI4IDEyOjU4OjQ0ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvb3ZlcmxheS5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmM6CisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzoKKwkqIGV4dC9jYWlyby9nc3R0aW1lb3ZlcmxheS5jOgorCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSogZXh0L2VzZC9lc2Rtb24uYzoKKwkqIGV4dC9lc2QvZXNkc2luay5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOgorCSogZXh0L2djb25mL2dzdHN3aXRjaHNpbmsuYzoKKwkqIGV4dC9nY29uZi9nc3Rzd2l0Y2hzcmMuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5jOgorCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuYzoKKwkqIGV4dC9oYWwvZ3N0aGFsYXVkaW9zaW5rLmM6CisJKiBleHQvaGFsL2dzdGhhbGF1ZGlvc3JjLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9qcGVnL2dzdHNtb2tlZGVjLmM6CisJKiBleHQvanBlZy9nc3RzbW9rZWVuYy5jOgorCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzoKKwkqIGV4dC9saWJtbmcvZ3N0bW5nZGVjLmM6CisJKiBleHQvbGlibW5nL2dzdG1uZ2VuYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJKiBleHQvbWlrbW9kL2dzdG1pa21vZC5jOgorCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5jOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJKiBleHQvdGFnbGliL2dzdGFwZXYybXV4LmNjOgorCSogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzoKKwkqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4LmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6CisJKiBnc3QvZGVidWd1dGlscy9icmVha215ZGF0YS5jOgorCSogZ3N0L2RlYnVndXRpbHMvY3B1cmVwb3J0LmM6CisJKiBnc3QvZGVidWd1dGlscy9lZmVuY2UuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNkZWJ1Zy5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0Y2Fwc3NldHRlci5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2aWdhdGlvbnRlc3QuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdG5hdnNlZWsuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHB1c2hmaWxlc3JjLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Byb2dyZXNzcmVwb3J0LmM6CisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJKiBnc3QvZGVidWd1dGlscy90ZXN0cGx1Z2luLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJldi5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmlwcGxlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzdHJlYWsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzoKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHJ0cHhxdGRlcGF5LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOgorCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL3dlYm0tbXV4LmM6CisJKiBnc3QvbWVkaWFuL2dzdG1lZGlhbi5jOgorCSogZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYzoKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJndm9sdW1lLmM6CisJKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBidmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGR2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVuZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc2lyZW5wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSogZ3N0L3J0c3AvZ3N0cnRwZGVjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5jOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6CisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jOgorCSogc3lzL29zczQvb3NzNC1zaW5rLmM6CisJKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvd2F2ZWZvcm0vZ3N0d2F2ZWZvcm1zaW5rLmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkgIHZhcmlvdXM6IGZpeCBwYWQgdGVtcGxhdGUgbGVha3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjI2NjQKKworMjAxMS0xMS0yOCAxMzowODoyNyArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZkZXRlY3QuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgdmFyaW91czogZml4IHBhZCB0ZW1wbGF0ZSByZWYgbGVha3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjI2NjQKKworMjAxMS0xMS0yOCAxMTo0NzoxMSArMDEwMCAgQ2hhZCA8Y2hhbm5hQGNhbHRlY2guZWR1PgorCisJKiBnc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuYzoKKwkgIHRhZ2luamVjdDogc2V0IGdhcC1hd2FyZQorCSAgVGhlIGVsZW1lbnQgZG9lcyBub3QgbW9kaWZ5IHRoZSBkYXRhIGFueXdheS4KKworMjAxMS0xMS0yNyAyMzozMjoxOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiB1cGRhdGUgcG8gZmlsZXMKKworMjAxMS0xMS0yNyAyMzozMTo0MyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIHJlbW90ZS10cmFja2luZyBicmFuY2ggJ29yaWdpbi9tYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYworCisyMDExLTExLTI2IDIxOjM5OjMzICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSAgZXF1YWxpemVyOiBhbHNvIHN5bmMgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmaWx0ZXIgYmFuZHMKKworMjAxMS0xMS0yNiAxNjowNjo1OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuYzoKKwkgIG1hdHJvc2thZGVtdXg6IGluaXRpYWxpc2Ugc2Vlbl9tYXJrdXBfdGFnIGZpZWxkIG9uIHN1YnRpdGxlIHN0cmVhbSBjb250ZXh0CisKKzIwMTEtMTEtMjYgMTA6MDE6MDcgKzAxMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuaDoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSogZ3N0L21hdHJvc2thL3dlYm0tbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jOgorCSAgbWF0cm9za2E6IHBvcnQgdG8gMC4xMQorCSAgU3VwcG9ydCBmb3IgVEFHX0lNQUdFIGFuZCBUQUdfQVRUQUNITUVOVCBpcyBjb21tZW50ZWQgb3V0OyB0aGlzIHJlcXVpcmVzIGNhcHMKKwkgIG9uIGJ1ZmZlcnMgd2hpY2ggaXMgZ29uZSBmcm9tIDAuMTEuCisJICBTZWdtZW50IGhhbmRsaW5nIGluIHRoZSBkZW11eGVyIGlzIGEgYml0IGNvbXBsZXg7IEkgYWRkZWQgc29tZSBGSVhNRSBjb21tZW50cworCSAgaW4gcGxhY2VzIHdoZXJlIEknbSBub3QgeWV0IHN1cmUgaWYgSSBwb3J0ZWQgY29ycmVjdGx5LgorCisyMDExLTExLTI2IDEzOjU0OjIyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L3B1bHNlL3BsdWdpbi5jOgorCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5oOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5oOgorCSAgcHVsc2VhdWRpbzogcmVxdWlyZSBwdWxzZWF1ZGlvID49IDEuMAorCisyMDExLTExLTI2IDEzOjM0OjEwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgcmVtb3RlLXRyYWNraW5nIGJyYW5jaCAnb3JpZ2luL21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYworCSAgZXh0L3B1bHNlL3B1bHNlc3JjLmMKKwkgIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYworCSAgZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jCisJICBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmMKKwkgIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmMKKwkgIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYworCSAgZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5oCisJICBnc3QvZWZmZWN0di9nc3RyaXBwbGUuYworCSAgU29tZSBwb3NzaWJsZSBGSVhNRXMgcmVtYWluaW5nIGluIHRoZSBhdWRpbyBwYXJzZXIgZ2V0Y2FwcyBmdW5jdGlvbnMuCisKKzIwMTEtMTEtMjUgMTk6Mjg6NTUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eG1hcC5jOgorCSAgaXNtbG11eDogVXNlIGlzby1mcmFnbWVudGVkIGFzIHZhcmlhbnQgdHlwZQorCSAgVXNpbmcgJ2lzbycgY29uZmxpY3RzIHdpdGggbXA0bXV4IHZhcmlhbnQgdHlwZSwgaXNtbG11eCBub3cKKwkgIHVzZXMgaXNvLWZyYWdtZW50ZWQKKwkgIEZpeGVzICM2NTY4MjMKKworMjAxMS0xMS0yNCAxMjowNTozMyArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmg6CisJICBwdWxzZXNyYzogSW1wbGVtZW50IEdzdFN0cmVhbVZvbHVtZSBpbnRlcmZhY2UKKwkgIFB1bHNlQXVkaW8gMS4wIHN1cHBvcnRzIHBlci1zb3VyY2Utb3V0cHV0IHZvbHVtZXMsIGFuZCB0aGlzIGV4cG9zZXMgdGhlCisJICBmdW5jdGlvbmFsaXR5IHZpYSB0aGUgR3N0U3RyZWFtVm9sdW1lIGludGVyZmFjZS4KKwkgIFdoZW4gY29tcGlsZWQgYWdhaW5zdCBwcmUtMS4wIFB1bHNlQXVkaW8sIHRoZSBpbnRlcmZhY2UgaXMgbm90CisJICBpbXBsZW1lbnRlZCwgYW5kIHRoZSAidm9sdW1lIiBvciAibXV0ZSIgcHJvcGVydGllcyBhcmUgbm90IGF2YWlsYWJsZS4KKwkgIFRoaXMgYml0IG9mIHVnbGluZXNzIHdpbGwgZ28gYXdheSB3aGVuIHdlIGNhbiBkZXBlbmQgb24gUHVsc2VBdWRpbyAxLjAKKwkgIG9yIGdyZWF0ZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTk1MDU1CisKKzIwMTEtMDktMTAgMjE6MjE6MzggLTA3MDAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBUcml2aWFsIGNvbW1lbnQgY29weS1wYXN0ZS1vIGZpeAorCisyMDExLTExLTE0IDEyOjQzOjI3ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJICBwdWxzZWF1ZGlvc2luazogUmVtb3ZlIHJlZHVuZGFudCBjb2RlCisKKzIwMTEtMTEtMTQgMTI6NDE6NDEgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYzoKKwkgIHB1bHNlYXVkaW9zaW5rOiBDbGVhbiB1cCByZWZjb3VudGluZyBpbiBldmVudCBwcm9iZQorCSAgTWFrZXMgc3VyZSB3ZSBkb24ndCBsZWFrIGEgcmVmY291bnQgaWYgdGhlIG9iamVjdCBpcyBkaXNwb3NlZCBiZWZvcmUgYQorCSAgTkVXU0VHTUVOVCB0dXJucyB1cC4KKworMjAxMS0xMS0yNCAxNjozMTozOCArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBmaXggc2Vla2luZworCSAgV2hpY2ggSSBhY2NpZGVudGFsbHkgYnJva2Ugd2hlbiBmaXhpbmcgZmx2IHZpZGVvcyBicmVha2luZyBvbgorCSAgc3B1cmlvdXMgdGltZXN0YW1wIGRpc2NvbnRpbnVpdGllcyBpbiBicm9rZW4gZmlsZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjMxNDMwCisKKzIwMTEtMTEtMjUgMTM6MTM6NDcgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuaDoKKwkgIGVmZmVjdHY6IHJlcGFpciBjb2xvciBtb2RlcyBpbiByYWRpb2FjdHYgYnkgdGFraW5nIHJnYixiZ3IgaW50byBhY2NvdW50CisKKzIwMTEtMTEtMjUgMTE6NDQ6NDkgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkgIHJhZGlvYWN0djogYWRkIG9uZSBtb3JlIHNldCBvZiBjYXBzCisJICBJdCBhbHNvIHdvcmsgaW4gdGhpcyBmb3JtYXQuIEF2b2lkcyB0aGUgbmVlZCBmb3IgY29udmVyc2lvbi4KKworMjAxMS0xMS0yNSAxMTo0NDoxOCArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5jOgorCSAgZWZmZWN0dHY6IGZpeCByZXZlcnNlIG5lZ290aWF0aW9uCisJICBUaGUgcGx1Z2lucyB3ZXJlIHVzaW5nIF9maXhlZF9jYXBzXyBhbmQgdGh1cyBub3QgYWRqdXN0aW5nIHRvIG5ldyB1cHN0cmVhbQorCSAgc2l6ZXMuIFNwb3R0ZWQgYnkgVGltIE3DvGxsZXIuCisKKzIwMTEtMTEtMjUgMTE6NDM6MTYgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkgIHdhcnB0djogcmVtb3ZlIG5vdCBuZWVkZWQgaWZkZWYKKworMjAxMS0xMS0yNSAxMDoxNTozNSArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2VmZmVjdHYvZ3N0cmlwcGxlLmM6CisJICByaXBwbGV0djogY2xlYW4gdXAgdGhlIHJlbmRlcmluZyBjb2RlIGEgYml0CisJICBUaGlzIGlzIGNvcnJydXB0cyB0aGUgbWVtb3kgd2hlbiByZXNpemluZy4gQWRkIGEgRklYTUUgdG8gbWFrZSBpdCByZXNpemVhYmxlCisJICBvbmNlIHRoYXQgaXMgc29sdmVkLgorCisyMDExLTExLTI0IDIxOjQxOjAzICswMTAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hbHBoYWNvbG9yLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2FtcGxpZnkuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYmJhbmQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYmxpbWl0LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2R5bmFtaWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZWNoby5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9pbnZlcnQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvcGFub3JhbWEuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvd3NpbmNiYW5kLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jbGltaXQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpc3VidGl0bGUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NhcHNzZXR0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxlbmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2VxdWFsaXplci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWN5ZGVtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2pwZWdlbmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9wYXJzZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2xpbWl0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3Jndm9sdW1lLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwZWN0cnVtLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2ZpbHRlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMveTRtZW5jLmM6CisJICB0ZXN0czogdXBkYXRlIGZvciBnc3RjaGVjayBBUEkgY2hhbmdlCisKKzIwMTEtMTEtMjQgMjA6NDI6NDkgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzdHJlYWsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkgIGVmZmVjdHR2OiBmaXggcmV2ZXJzZSBuZWdvdGlhdGlvbgorCSAgVGhlIHBsdWdpbnMgd2VyZSB1c2luZyBfZml4ZWRfY2Fwc18gYW5kIHRodXMgbm90IGFkanVzdGluZyB0byBuZXcgdXBzdHJlYW0KKwkgIHNpemVzLiBTcG90dGVkIGJ5IFRpbSBNw7xsbGVyLgorCisyMDExLTExLTI0IDE0OjE0OjUzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgbXVsdGlmaWxlc2luazogRml4IGxlYWsgb2YgZmlsZW5hbWUgc3RyaW5ncworCSAgRG8gbm90IGZvcmdldCB0byBmcmVlIHRoZSBmaWxlbmFtZSBzdHJpbmdzIHdoZW4gZGVsZXRpbmcKKwkgIHRoZSBsaXN0IG9mIGZpbGVzLgorCisyMDExLTExLTI0IDE0OjExOjMzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jOgorCSAgbXVsdGlmaWxlOiBmaXggYnVpbGQgb2YgdGVzdHMKKwkgIFRlc3RzIGZhaWwgdG8gYnVpbGQgYmVjYXVzZSBnX21rZHRlbXAgaXMgYXZhaWxhYmxlIGZyb20gZ2xpYiBzaW5jZQorCSAgMi4yNi4KKwkgIFRoaXMgcGF0Y2ggYWRkcyBhIGNvbmRpdGlvbiBhcm91bmQgdGhlIHJlZGVmaW5pdGlvbiBvZgorCSAgZ19ta2R0ZW1wIG9uIHRoZSB0ZXN0cyB0byBvbmx5IGJ1aWxkIGl0IGlmIGdsaWIgaXMgb2xkZXIgdGhhbgorCSAgMi4yNi4KKworMjAxMS0wOS0yNyAxNjo0OTo0NSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IHNraXAgaWQzMiB0YWdzCisJICBUaGlzIGFsbG93cyBkZWNvZGluZyBhdCBsZWFzdCBvbmUgc2FtcGxlIHdoZXJlIHNvbWV0aGluZyBoYXMKKwkgIHN0dWZmZWQgc29tZSBJRDMgdGFnIGJlZm9yZSB0aGUgKHN1cHBvc2VkbHkgaW5pdGlhbCkgRk1UXCAuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjYwMjQ5CisKKzIwMTEtMTAtMzEgMTc6MDY6MTggKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6CisJICBlZGdldHY6IHRyaXZpYWwgY29tbWVudCBmaXggZm9yIGNsYXJpdHkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjE4NDEKKworMjAxMS0xMC0zMSAxNzowNDoyMyArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdGVkZ2UuYzoKKwkgIGVkZ2V0djogZG9uJ3QgbGVhdmUgYml0cyBvZiB0aGUgb3V0cHV0IGJ1ZmZlciB1bmluaXRpYWxpemVkCisJICBMZXQncyBpbml0aWFsaXplIHRoZW0gdG8gemVyby4gSXQgbG9va3MgYWxyaWdodCwgYnV0IHRoZW4gaXQKKwkgIGFsc28gbG9va3MgYWxyaWdodCB3aXRoIHYzLCBvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHBpeGVscworCSAgZnJvbSB0aGUgc291cmNlLiBJIGRvbid0IGtub3cgd2hhdCB0aGUgb3JpZ2luYWwgaW50ZW50IHdvdWxkCisJICBiZSwgYW5kIHRoZSBvcmlnaW5hbCBlZmZlY3R2IHNvdXJjZSBhbHNvIGhhcyB0aGlzIGJ1Zy9mZWF0dXJlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2MTg0MQorCisyMDExLTExLTI0IDEwOjI1OjAyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2U6IFVzZSB0aGUgc2lua3BhZCB0ZW1wbGF0ZSBjYXBzIGFzIGZhbGxiYWNrLCBub3QgdGhlIHNyY3BhZCBvbmVzCisKKzIwMTEtMTEtMjQgMDk6NTk6NDAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJICBtcGVnYXVkaW9wYXJzZTogSW1wbGVtZW50IDo6Z2V0X3NpbmtfY2FwcyB2ZnVuYyB0byBwcm9wYWdhdGUgZG93bnN0cmVhbSBjYXBzIGNvbnN0cmFpbnRzIHVwc3RyZWFtCisKKzIwMTEtMTEtMjQgMDk6NTc6NTcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBJbXBsZW1lbnQgOjpnZXRfc2lua19jYXBzIHZmdW5jIHRvIHByb3BhZ2F0ZSBkb3duc3RyZWFtIGNhcHMgY29uc3RyYWludHMgdXBzdHJlYW0KKworMjAxMS0xMS0yNCAwOTo1NTo0NyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkgIGRjYXBhcnNlOiBJbXBsZW1lbnQgOjpnZXRfc2lua19jYXBzIHZmdW5jIHRvIHByb3BhZ2F0ZSBkb3duc3RyZWFtIGNhcHMgY29uc3RyYWludHMgdXBzdHJlYW0KKworMjAxMS0xMS0yNCAwOTo1MzoxOCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkgIGFtcnBhcnNlOiBJbXBsZW1lbnQgOjpnZXRfc2lua19jYXBzIHZmdW5jIHRvIHByb3BhZ2F0ZSBkb3duc3RyZWFtIGNhcHMgY29uc3RyYWludHMgdXBzdHJlYW0KKworMjAxMS0xMS0yNCAwOTo0OToyNyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkgIGFtcnBhcnNlOiBNYXJrIHNvbWUgbW9yZSBmdW5jdGlvbnMgYXMgc3RhdGljCisKKzIwMTEtMTEtMjQgMDk6NDg6MzMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJICBhYzNwYXJzZTogSW1wbGVtZW50IDo6Z2V0X3NpbmtfY2FwcyB2ZnVuYyB0byBwcm9wYWdhdGUgZG93bnN0cmVhbSBjYXBzIGNvbnN0cmFpbnRzIHVwc3RyZWFtCisKKzIwMTEtMTEtMjQgMDk6NDQ6NTggKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogTWFyayBzb21lIGZ1bmN0aW9ucyBhcyBzdGF0aWMgYW5kIHJlbW92ZSB1bnVzZWQgZnVuY3Rpb24gZGVjbGFyYXRpb25zCisKKzIwMTEtMTEtMjQgMDk6NDM6MTQgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogSW1wbGVtZW50IDo6Z2V0X3NpbmtfY2FwcyB2ZnVuYyB0byBwcm9wYWdhdGUgZG93bnN0cmVhbSBjYXBzIGNvbnN0cmFpbnRzIHVwc3RyZWFtCisKKzIwMTEtMTEtMjQgMDE6NDg6MjUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSAgdGVzdHM6IHVwZGF0ZSBzb3VwIHRlc3QgZm9yIHJlbW92ZWQgaXJhZGlvLW1vZGUgcHJvcGVydHkKKworMjAxMS0xMS0yNCAwMTo0NTo0MyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IGdldCByaWQgb2YgaXJhZGlvLSogcHJvcGVydGllcywgcG9zdCB0YWdzIGluc3RlYWQKKworMjAxMS0xMS0yNCAwMTo0MDowNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IGFsd2F5cyBzZW5kIGljZWNhc3QgcmVxdWVzdCBoZWFkZXIsIGRyb3AgaXJhZGlvLW1vZGUgcHJvcGVydHkKKwkgIFNlcnZlciBzaG91bGQgaWdub3JlIHVua25vd24vdW5oYW5kbGVkIGhlYWRlcnMuLgorCisyMDExLTExLTI0IDAxOjE5OjMyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogbWFrZSBjb25uZWN0aW9uLXNwZWVkIHByb3BlcnR5IGEgZ3VpbnQ2NAorCisyMDExLTExLTI0IDAwOjUyOjQwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbWFuYWdlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtUENNQS5weToKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWFsc2FzcmMtUENNQS5weToKKwkgIHJ0cG1hbmFnZXI6IHJlbmFtZSBnc3RydHAqIC0+IHJ0cCoKKwkgIFRoaXMgd2FzIGRvbmUgaW4gMC4xMCB0byBhdm9pZCBjb25mbGljdCB3aXRoIHRoZSBydHAgZWxlbWVudHMgaW4KKwkgIGZhcnNpZ2h0LCBidXQgdGhlIGdzdC1wcmVmaXhpbmcgaXMgbm8gbG9uZ2VyIG5lZWRlZCBpbiAwLjExCisKKzIwMTEtMTEtMjMgMTA6MjM6MjggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0xMS0yMyAwOToyNjoxNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJICBwdWxzZWF1ZGlvc2luazogYXZvaWQgZW5kbGVzcyBjYXBzIGxvb3AKKwkgIENoZWNrIGlmIHRoZSBjYXBzIGFyZSB0aGUgc2FtZSBiZWZvcmUgYWRkaW5nIGEgbmV3IHByb2JlLiBCZWNhdXNlIG9mIHJlY29uZmlndXJlCisJICBldmVudHMsIHVwc3RyZWFtcyBzZW5kcyBtdWx0aXBsZSBjYXBzIGV2ZW50cy4KKworMjAxMS0xMS0yMyAwMDo1NzozOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thcGFyc2UuYzoKKwkqIHRlc3RzL2ZpbGVzL3Bpbmtub2lzZS12b3JiaXMubWt2OgorCSAgdGVzdHM6IGFkZCBiYXNpYyB1bml0IHRlc3QgZm9yIG1hdHJvc2thcGFyc2UKKworMjAxMS0xMS0yMyAwMDo1NjoyNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSAgbWF0cm9za2FwYXJzZTogZG9uJ3QgbGVhayBzdHJlYW0gaGVhZGVycworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NDU0OAorCisyMDExLTExLTIyIDAxOjQwOjM5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSAgTW9yZSBwcmludGYgZm9ybWF0IHdhcm5pbmcgZml4ZXMKKworMjAxMS0xMS0yMSAyMDozMTozMSArMDEwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2JyZWFrbXlkYXRhLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZpZ2F0aW9udGVzdC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIEZpeCBwcmludGYgZm9ybWF0IGNvbXBpbGVyIHdhcm5pbmdzIG9uIE9TIFggLyA2NGJpdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2MjYxNQorCisyMDExLTExLTIxIDEzOjM3OjAxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB1cGRhdGUgZm9yIGFjdGl2YXRpb24gY2hhbmdlcworCisyMDExLTExLTE4IDE3OjU5OjE2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RwdXNoZmlsZXNyYy5jOgorCSogZ3N0L2RlYnVndXRpbHMvcm5kYnVmZmVyc2l6ZS5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHVwZGF0ZSBmb3IgbmV3IHNjaGVkdWxpbmcgcXVlcnkKKworMjAxMS0xMS0xOCAxMzo1NzoyMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBhZGQgcGFyZW50IHRvIGFjdGl2YXRlIGZ1bmN0aW9ucworCisyMDExLTExLTE3IDE3OjM2OjA1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFjdGl2YXRlIHBhZCBiZWZvcmUgc2V0dGluZyBjYXBzCisJICBTZXRpbmcgY2FwcyBvbiBhbiBpbmFjdGl2ZSBmbHVzaGluZyBwYWQgZG9lcyBub3RoaW5nLgorCisyMDExLTExLTE3IDE3OjE3OjExICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYworCSAgZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jCisKKzIwMTEtMTEtMTcgMTU6MDI6NTUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuYzoKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxlbmMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZWF1ZGlvc2luay5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZpZ2F0aW9udGVzdC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ3ZvbHVtZS5jOgorCSogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdGFzcGVjdHJhdGlvY3JvcC5jOgorCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIGFkZCBwYXJlbnQgdG8gcGFkIGZ1bmN0aW9ucworCisyMDExLTExLTE3IDA4OjI0OjU4ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgY29sbGVjdHBhZHM6IHBvcnQgQVBJIGNoYW5nZXMKKworMjAxMS0xMS0xNiAxOTowODowNSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgc3BlZXhlbmM6IGVuc3VyZSB0byBmcmVlIGFsbG9jYXRlZCBwYWRkZWQgZGF0YQorCisyMDExLTExLTE2IDE4OjU3OjM4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJICBzcGVleGVuYzogcmVzZXQgdGFnIHNldHRlciBpbnRlcmZhY2Ugd2hlbiBhcHByb3ByaWF0ZQorCisyMDExLTExLTE2IDE4OjU3OjIxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogcmVzZXQgdGFnIHNldHRlciBpbnRlcmZhY2Ugd2hlbiBhcHByb3ByaWF0ZQorCisyMDExLTExLTE2IDE3OjU0OjQ5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgYWRkIHBhcmVudCB0byBpbnRlcm5hbCBsaW5rcworCisyMDExLTExLTE2IDE3OjI3OjEzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvYW5ub2RleC9nc3RjbW1sZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RwdXNoZmlsZXNyYy5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdGFzcGVjdHJhdGlvY3JvcC5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBhZGQgcGFyZW50IHRvIHF1ZXJ5IGZ1bmN0aW9uCisKKzIwMTEtMTEtMTYgMTI6NDA6MDggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkgIGdvb206IHVwZGF0ZSBmb3IgcmVuYW1lZCBmbGFncworCSAgVXNlIHRoZSBfY2hlY2tfcmVjb25maWd1cmUgbWV0aG9kIGluc3RlYWQgb2YgY2hlY2tpbmcgZmxhZ3MuCisJICBEb24ndCBuZWVkIHRvIHJlZiB0aGUgcGFyZW50IGFueW1vcmUsIGNvcmUgZG9lcyB0aGF0LgorCisyMDExLTExLTE1IDE4OjAxOjE2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2RlYnVndXRpbHMvcHJvZ3Jlc3NyZXBvcnQuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgX3F1ZXJ5X3BlZXJfKigpIC0+IF9wZWVyX3F1ZXJ5XyooKQorCisyMDExLTExLTE1IDE3OjQ1OjMxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYzoKKwkgIF9hY2NlcHRfY2FwcygpIC0+IF9xdWVyeV9hY2NlcHRfY2FwcygpCisKKzIwMTEtMTEtMTUgMTc6Mjk6NDUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZWF1ZGlvc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBfcGVlcl9nZXRfY2FwcygpIC0+IF9wZWVyX3F1ZXJ5X2NhcHMoKQorCisyMDExLTExLTE1IDE2OjU1OjI3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiB0ZXN0cy9pY2xlcy9nZGtwaXhidWZzaW5rLXRlc3QuYzoKKwkgIHVwZGF0ZSBmb3IgX2dldF9jYXBzKCkgLT4gX3F1ZXJ5X2NhcHMoKQorCisyMDExLTExLTE1IDE2OjMxOjQ1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkgIGNoYW5nZSBnZXRjYXBzIHRvIHF1ZXJ5CisJICBDaGFpbiB1cCBldmVudCBmdW5jdGlvbiBpbiBwYXlsb2FkZXJzLgorCisyMDExLTExLTE1IDEzOjIzOjU2ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogZml4IHNwdXJpb3VzIHRpbWVzdGFtcCBkaXNjb250aW51aXR5CisJICBXZSBuZWVkIHRvIHRlbGwgdGhlIGJhc2UgY2xhc3MgdGhhdCB3ZSdyZSBkcm9wcGluZyBidWZmZXJzLAorCSAgc28gaXQgZHJvcHMgdGhlIGlucHV0IHRpbWVzdGFtcHMgY29ycmVzcG9uZGluZyB0byB0aGVzZS4KKwkgIE90aGVyd2lzZSwgdGhlIGZpcnN0IGFjdHVhbCBhdWRpbyBidWZmZXJzIHdlIG91dHB1dCB3aWxsIGJlCisJICBzdGFtcGVkIHdpdGggdGhvc2UgLSBHU1RfQ0xPQ0tfVElNRVNUQU1QX05PTkUuIFRoYXQgbWlzbWF0Y2gKKwkgIGJldHdlZW4gaW5wdXQgYnVmZmVyIGNvdW50IGFuZCBvdXRwdXQgYnVmZmVyIGNvdW50IHdpbGwgc3RheQorCSAgd2hpbGUgcGxheWluZy4gV2l0aCBlbm91Z2ggaGVhZGVycyBhbmQgbG9uZyBlbm91Z2ggYnVmZmVyCisJICBkdXJhdGlvbnMsIHRoZSBzaW5rIHdpbGwgaGF2ZSBwbGF5ZWQgZW5vdWdoIGJlZm9yZSByZWNlaXZpbmcKKwkgIHRoZSBmaXJzdCB2YWxpZCB0aW1lc3RhbXAgKHVzdWFsbHkgMCksIGFuZCB3aWxsIHRyaWdnZXIgYW4KKwkgIGF1ZGlibGUgZGlzY29udGludWl0eS4KKworMjAxMS0xMS0xNCAxNTozNDo1NyArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5oOgorCSAgZmxhY3BhcnNlOiBkZXRlY3Qgd2hlbiBhIGZpbGUgbGllcyBhYm91dCBmaXhlZCBibG9jayBzaXplCisJICBJZiB0aGUgc2FtcGxlL2Jsb2NrIG51bWJlciBoYXBwZW5zIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBibG9jaworCSAgc2l6ZSwgd2UgYXNzdW1lIHZhcmlhYmxlIGJsb2NrIHNpemUsIGFuZCB0aHVzIGNvdW50ZXJzIGluIHNhbXBsZXMKKwkgIGluIHRoZSBoZWFkZXJzLiBUaGlzIGNhbiBvbmx5IGdldCB1cyBhIGZhbHNlIHBvc2l0aXZlIGZvciBhIGJsb2NrCisJICBzaXplIG9mIDEsIHdoaWNoIGlzIGludmFsaWQuIFdlIGNhbiBnZXQgZmFsc2UgbmVnYXRpdmVzIG1vcmUKKwkgIG9mdGVuIHRob3VnaCAoZWcsIGlmIG5vdCBzdGFydGluZyBhdCB0aGUgc3RhcnQgb2YgdGhlIHN0cmVhbSksCisJICBidXQgdGhlbiB0aGF0J3MgYWxyZWFkeSBHSUdPLgorCisyMDExLTA5LTAyIDE5OjIwOjA3IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBnc3RydHBzZXNzaW9uOiBBZGQgc3BlY2lhbCBtb2RlIHRvIHVzZSBGSVIgYXMgcmVwYWlyIGFzIEdvb2dsZSBkb2VzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU4NDE5CisKKzIwMTEtMDktMDEgMTc6NDc6MzggLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oOgorCSAgcnRwc2Vzc2lvbjogU2VuZCBGSVIgcmVxdWVzdHMgaW4gcmVzcG9uc2UgdG8ga2V5IHVuaXQgcmVxdWVzdHMgd2l0aCBhbGwtaGVhZGVycz1UUlVFCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU4NDE5CisKKzIwMTEtMDktMDEgMTY6MjU6MjEgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oOgorCSAgcnRwc2Vzc2lvbjogUHV0IHRoZSBQTEkgcmVxdWVzdHMgaW4gZWFjaCBSVFBTb3VyY2UKKwkgIEFsc28gcmVmYWN0b3IgYSBiaXQgYW5kIHB1dCBhbGwgdGhlIGtleWZyYW1lIHJlcXVlc3QgY29kZSBpbiBvbmUKKwkgIHBsYWNlIGluc2lkZSBydHBzZXNzaW9uLmMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTg0MTkKKworMjAxMS0wOC0zMSAxNDozNTozMyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogSGFjayB0byBGSVIgYmVjYXVzZSBHb29nbGUgZG9lc24ndCBzZXQgdGhlIHNlbmRlciBzc3JjIGNvcnJlY3RseQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1ODQxOQorCisyMDExLTA4LTMwIDE5OjA2OjEzIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBzZXNzaW9uOiBQcm9jZXNzIHJlY2VpdmVkIEZ1bGwgSW50cmEgUmVxdWVzdHMKKwkgIFByb2Nlc3MgRklSIHJlcXVlc3RzIGFjY29yZGluZyB0byBSRkMgNTEwNAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1ODQxOQorCisyMDExLTExLTA3IDE4OjQzOjI2ICswMDAwICBTam9lcmQgU2ltb25zIDxzam9lcmQuc2ltb25zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogU2V0IHBpeGVsLWFzcGVjdC1yYXRpbyB0byAxLzEKKwkgIFdlIGRvbid0IGN1cnJlbnRseSBzdXBwb3J0IHNldHRpbmcgdGhlIHBpeGVsLWFzcGVjdC1yYXRpbyBmcm9tIFY0TDIuIFNvCisJICBzaW1wbHkgc2V0IGl0IHRvIGJlIDEvMSBpbiB0aGUgY2FwcyB0byBwcmV2ZW50IG5lZ290aWF0aW9uIGZhaWx1cmVzIHdoZW4KKwkgIGZpeGF0aW5nIHRvIHdlaXJkIHZhbHVlcyAoZS5nLiB3aGVuIHRoZSBkb3duc3RyZWFtIGNhcHMgaGFzCisJICBwaXhlbC1hc3BlY3QtcmF0aW8gPSBbIE1JTiwgTUFYIF0gKQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2MzU4MAorCisyMDExLTExLTE0IDA5OjM5OjE1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzZGVtdXguYzoKKwkgIHRlc3RzOiBtYWtlIGlkM2RlbXV4IHRlc3QgY29tcGlsZQorCSAgU3RpbGwgZmFpbHMgdGhvdWdoLgorCisyMDExLTExLTEyIDE1OjQyOjI3ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvY2FtY3RybC5jOgorCSAgY29udHJvbGxlcjogbm8gbmVlZCB0byBleHBsaWNpdGVseSBhZGQgY29udHJvbGxlZCBwcm9wZXJ0aWVzIGFueW1vcmUKKworMjAxMS0xMS0xMyAyMzo0Mjo0NCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RwdXNoZmlsZXNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnJhZGlvLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBVcGRhdGUgZm9yIEdzdFVSSUhhbmRsZXIgZ2V0X3Byb3RvY29scygpIGNoYW5nZXMKKworMjAxMS0xMS0xMyAxODo1MDo1MSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RwdXNoZmlsZXNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnJhZGlvLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBzb3VwLCBwdXNoZmlsZSwgcnRzcCwgdWRwLCB2NGwyOiB1cGRhdGUgZm9yIEdzdFVSSUhhbmRsZXIgQVBJIGNoYW5nZXMKKworMjAxMS0xMS0xMSAxOToyNDoyNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmMKKworMjAxMS0xMS0xMSAxOToyMTo1MCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6CisJICBydHA6IGZpeCBmb3IgcnRwIGhlYWRlciBjaGFuZ2VzCisKKzIwMTEtMTEtMTEgMTA6MDY6MjUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJICBwdWxzZWF1ZGlvc2luazogZml4IGNhcHMgbGVhaworCisyMDExLTExLTExIDE0OjU1OjQ4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBkbyBub3QgbGVhayBjbGllbnRuYW1lIHdoZW4gc2V0dGluZyB1cCBwcm9wZXJ0eQorCisyMDExLTExLTExIDE4OjA1OjM1ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJICBwdWxzZTogQ2hhaW4gdXAgZGlzcG9zZSgpIGluIHB1bHNlYXVkaW9zaW5rCisKKzIwMTEtMTEtMTEgMTI6MzI6NDEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvZ3N0cnRweHF0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZm52MWhhc2guaDoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBidnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdHBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBkdmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGR2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzIycGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjNkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcGFyb2J1c3RkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcHZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuaDoKKwkgIHVwZGF0ZSBmb3IgYmFzZSBjbGFzcyByZW5hbWUKKworMjAxMS0xMS0xMSAxMjoyNTowMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RydHB4cXRkZXBheS5jOgorCSogZ3N0L2lzb21wNC9nc3RydHB4cXRkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhYzNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBidmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGR2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIycGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFjZWxwZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwcWRtZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWRtZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwc2lyZW5kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5oOgorCSAgdXBkYXRlIGZvciBiYXNlIGNsYXNzIHJlbmFtZQorCisyMDExLTExLTExIDEyOjAxOjE3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmg6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHVwZGF0ZSBmb3IgYXVkaW9iYXNlKiByZW5hbWUKKworMjAxMS0xMS0xMSAxMTo1Mzo0NSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5oOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZWF1ZGlvc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBhdWRpbzogdXBkYXRlIGZvciBiYXNlIGNsYXNzIHJlbmFtZQorCisyMDExLTExLTExIDExOjMzOjQ0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2V1dGlsLmg6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5oOgorCSAgZml4IGZvciByaW5nYnVmZmVyIHJlbmFtZQorCisyMDExLTExLTExIDExOjI0OjAwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2tyaW5nYnVmZmVyLmg6CisJKiBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5oOgorCSAgdXBkYXRlIGZvciByaW5nYnVmZmVyIGNoYW5nZQorCisyMDExLTExLTEwIDIzOjE1OjMwICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvY2FtY3RybC5jOgorCSAgY29udHJvbGxlcjogcG9ydCBhcGkgY2hhbmdlcworCisyMDExLTExLTEwIDIzOjA5OjIzICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvYW5ub2RleC9nc3Rhbm5vZGV4LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJICB2YXJpb3VzOiBhZGQgbWlzc2luZyBpbmNsdWRlcworCisyMDExLTExLTEwIDIxOjM1OjI0ICswMTAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGZpeCBjb21waWxhdGlvbiB3aXRoIHB1bHNlYXVkaW8gMC45CisKKzIwMTEtMTEtMTAgMTg6MzI6NTggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzoKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB1cGRhdGUgZm9yIGFkYXB0ZXIgYXBpIGNoYW5nZXMKKworMjAxMS0xMS0xMCAxNzoyMzo0NyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBidnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJICB1cGRhdGUgZm9yIGNoYW5nZWQgYmFzZSBjbGFzc2VzCisKKzIwMTEtMTEtMTAgMTM6NTA6MzQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIGZpeCBmb3IgYXVkaW8gY2xvY2sgY2hhbmdlCisKKzIwMTEtMTEtMTAgMTE6MDM6MTggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHVwZGF0ZSBmb3IgcmVtb3ZlZCBmaXhhdGUgZnVuY3Rpb24KKworMjAxMS0xMS0wOSAxNzo0MDoxMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDExLTExLTA5IDE3OjM4OjAzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHVwZGF0ZXMgZm9yIG5ldyBhY2NlcHRjYXBzIHF1ZXJ5CisKKzIwMTEtMTEtMDggMTU6MzU6MjYgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogZml4IHdyb25nIHN0cmlkZSB3aGVuIGludmVydGluZyB1bmNvbXByZXNzZWQgdmlkZW8KKwkgIFN1Y2ggZnJhbWVzIGhhdmUgYSBzdHJpZGUgbXVsdGlwbGUgb2YgNCwgc2VlCisJICBodHRwOi8vbHNjdWJlLm9yZy9waXBlcm1haWwvZmZtcGVnLWlzc3Vlcy8yMDEwLUFwcmlsLzAxMDI0Ny5odG1sLgorCSAgVGhpcyBzaG93ZWQgdXAgb24gYSBzYW1wbGUgdXNpbmcgYSBvZGQgd2lkdGggb2YgMjQgYml0IHZpZGVvLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MjI4OAorCisyMDExLTExLTA5IDEyOjI1OjAxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJICBoMjYzcHBheTogcmVwb3J0IHRvIDAuMTEKKworMjAxMS0xMS0wOSAxMjoxODowMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jCisJICBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jCisJICBnc3QvaXNvbXA0L3F0ZGVtdXguYworCisyMDExLTExLTA5IDExOjU2OjA3ICswMTAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBkdG1mOiBmaXggY29tcGlsZXIgd2FybmluZyBmb3IgdW5pbml0aWFsaXplZCB2YWx1ZXMKKworMjAxMS0xMS0wOSAxMTo1MzowMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICByZW1vdmUgcXVlcnkgdHlwZXMKKworMjAxMS0xMS0wOSAxMDozMjowNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogbWluaW1hbCBzYW5pdHkgY2hlY2sgb24gY3JlYXRpb24gZGF0ZXRpbWUKKworMjAxMS0xMS0wNCAxNzo1NDowNCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5oOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5oOgorCSAgZHRtZnNyYzogUmVqZWN0IHN0YXJ0L3N0b3AgcmVxdWVzdHMgdGhhdCBjb21lIG91dCBvZiBvcmRlcgorCisyMDExLTEwLTI5IDE4OjI0OjI2ICswMjAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBkdG1mOiBQb3N0IG1lc3NhZ2VzIHdoZW4gc3RhcnRpbmcgdG8gc2VuZC9yZWNlaXZlIERUTUYKKwkgIFRoaXMgd2F5LCB0aGUgVUkgY2FuIGRpc3BsYXkgdGhlIERUTUYgZXZlbnRzIGFzIHRoZXkgYXMgYmVpbmcgc2VudC4KKworMjAxMS0xMS0wMiAxMjo1ODoxMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSAgcnRwaDI2M3BwYXk6IFJldHVybiB0aGUgc2luayBwYWQgdGVtcGxhdGUgYXMgc2luayBjYXBzLCBub3QgdGhlIHNyYydzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTc3Nzg0CisKKzIwMDktMDMtMTUgMTk6MjY6NDggLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSAgcnRwaDI2M3BwYXk6IEFsc28gaW1wbGVtZW50IHNpemUvZnJhbWVyYXRlIHJlc3RyaWN0aW9ucyBpbiBnZXRjYXBzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTc3Nzg0CisKKzIwMDktMDMtMDQgMjA6NTA6MTkgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSAgcnRwaDI2M3BwYXk6IEltcGxlbWVudCBnZXRjYXBzIGZvbGxvd2luZyBSRkMgNDYyOSwgcGlja3MgdGhlIHJpZ2h0IGFubmV4ZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD01Nzc3ODQKKworMjAxMS0xMS0wOCAxNDozMTozNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogYWxzbyBzZXQgc2VnbWVudCBzdG9wIGF0IHN0YXJ0dXAgcmF0aGVyIHRoYW4gb25seSBwb3N0IHNlZWsKKwkgIC4uLiBzbyBhcyB0byBlbnN1cmUgY29uc2lzdGVudCBwbGF5YmFjayB3aXRoIG9yIHdpdGhvdXQgc2VlaywgZXNwZWNpYWxseQorCSAgaW4gcHJlc2VuY2Ugb2Ygc29tZSBib2d1cyBlZGl0IGxpc3QgZW50cmllcy4KKworMjAxMS0xMS0wOCAxMToxODowNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICB1cGRhdGUgZm9yIHByb2JlIGFwaSBjaGFuZ2VzCisKKzIwMTEtMTEtMDggMDg6NTA6MTkgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkgIGdvb206IGNvZGUgY2xlYW51cHMKKwkgIE1vdmUgdmFyaWFibGVzIHRvIHRoZSBzY29wZSB3aGVyZSB0aGV5IGFyZSBuZWVkZWQuIFVzZSBvdXIgbWFjcm9zIGFuZCBmdW5jdGlvbnMKKwkgIG1vcmUuCisKKzIwMTEtMTEtMDggMDg6NDk6MDUgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkgIGdvb206IGFkZCBhIHNpbmtfcXVlcnkgdG8gZWF0IGFsbG9jYXRpb24gcXVlcmllcworCSAgV2Ugc2hvdWxkIG5vdCBmb3J3YXJkIGFsbG9jYXRpb24gcXVlcmllcyBmb3IgYXVkaW8gdG8gdGhlIHZpZGVvIHNpbmsuCisKKzIwMTEtMTEtMDIgMTc6MDI6NTQgKzAwMDAgIFJhdWwgR3V0aWVycmV6IFNlZ2FsZXMgPHJnc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvTWFrZWZpbGUuYW06CisJICBnc3QvZmx2LzogYWRkIGFtZmRlZnMuaCB0byBub2luc3RfSEVBREVSUworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2MzMzNAorCisyMDExLTExLTA3IDE3OjE0OjE3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIGZpeCBmb3IgcHJvYmUgdXBkYXRlcworCisyMDExLTEwLTAzIDE3OjUwOjQzICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5oOgorCSAgZmx2ZGVtdXg6IGRldGVjdCBsYXJnZSBwdHMgZ2FwcyBhbmQgcmVzeW5jCisJICBTaG91bGQgd29yayBvbiBtdWx0aXBsZSBnYXBzLCBidXQgdGVzdGVkIG9uIG9ubHkgb25lLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzMTQzMAorCisyMDExLTA4LTIyIDEwOjQwOjQ1ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogZml4IG9mZiBieSBvbmUgYmV0d2VlbiBncmFucG9zIGFuZCBsYXN0X3N0b3AKKworMjAxMS0xMC0wNyAxOTo0MTozNSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGZpeCBsYXN0IGZyYW1lIHRpbWVzdGFtcCBpbiBmaXhlZCBibG9jayBzaXplIG1vZGUKKwkgIFRoZSBsYXN0IGJsb2NrIG1heSBoYXZlIGEgZGlmZmVyZW50IGJsb2NrIHNpemUsIHNvIHdlIHNob3VsZCBub3QKKwkgIHVzZSBpdCB0byBzY2FsZSBvciB3ZSdsbCBlbmQgdXAgd2l0aCBhIHdyb25nIHRpbWVzdGFtcC4KKwkgIFNlZSBjb21tZW50IGFuZCBxdW90ZSBmcm9tIHRoZSBGTEFDIGZvcm1hdCBkb2N1bWVudGF0aW9uIGluIHRoZSBjb2RlLgorCSAgRml4ZXMgbG9vcGVkIHBsYXliYWNrIG9mIEZMQUMgZmlsZXMgKHZpYSBhYm91dC10by1maW5pc2gpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2MTIxNQorCisyMDExLTEwLTI3IDE1OjUyOjQ3ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuaDoKKwkgIGNhaXJvdGV4dG92ZXJsYXk6IGFkZCBhICdzaWxlbnQnIHByb3BlcnR5IHRvIHNraXAgcmVuZGVyaW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjYyODU2CisKKzIwMTEtMTEtMDcgMTI6MDA6MTIgKzAxMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJICBtYXRyb3NrYW11eDogZml4IHJlZ3Jlc3Npb24gY2F1c2luZyBtYWxmb3JtZWQgZmlsZXMKKwkgIFRoaXMgd2FzIGNhdXNlZCBieSBtZSBpbiAxYjIxM2QuIEl0IHNlZW1zIEkgd2FzIHRvbyBmb2N1c2VkIG9uIDAuMTEgd2hlbiBJIGRpZAorCSAgdGhpcyBhbmQgdGVzdGVkIHRoZSB3cm9uZyBicmFuY2guCisJICBUaGUgcHJvYmxlbSB3YXMgcmVwb3J0ZWQgYnkgQWxleGV5IEZpc2hlci4KKworMjAxMS0xMS0wNCAxODo0MTozNiArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5oOgorCSogZ3N0L2FscGhhL01ha2VmaWxlLmFtOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuaDoKKwkqIGdzdC9hdWRpb2Z4L01ha2VmaWxlLmFtOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaWlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2ludmVydC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9rYXJhb2tlLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jYmFuZC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2xpbWl0LmM6CisJKiBnc3QvZWZmZWN0di9NYWtlZmlsZS5hbToKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJldi5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmlwcGxlLmM6CisJKiBnc3QvZWZmZWN0di9nc3R2ZXJ0aWdvLmM6CisJKiBnc3QvZXF1YWxpemVyL01ha2VmaWxlLmFtOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmg6CisJKiBnc3Qvc2hhcGV3aXBlL01ha2VmaWxlLmFtOgorCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkqIGdzdC9zbXB0ZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJKiBnc3QvdmlkZW9ib3gvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL3BsdWdpbi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogc3lzL3Y0bDIvTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvY2FtY3RybC5jOgorCSAgY29udHJvbGxlcjogcG9ydCB0byBuZXcgY29udHJvbGxlciBsb2NhdGlvbiBhbmQgYXBpCisKKzIwMTEtMTEtMDQgMTc6Mzk6MTUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIG1vcmUgdGVtcGxhdGUgZml4ZXMKKworMjAxMS0xMS0wNCAxNjoyMToxMyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJICBwdWxzZWF1ZGlvc2luazogbW9yZSAwLjExIGZpeGluZworCSAgTWFrZSBzdXJlIHRoZSBjYXBzIGV2ZW50IGdldHMgdG8gdGhlIHNpbmsuCisKKzIwMTEtMTEtMDQgMTU6MzU6NDIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWF1ZGlvc2luay5jOgorCSAgcHVsc2VhdWRpb3Npbms6IHBvcnQgc29tZSBtb3JlCisJICBSZW5hbWUgZGVjb2RlYmluMiAtPiBkZWNvZGViaW4gc29tZSBtb3JlCisJICBDbGVhbnVwIHVwIHNpbmtwYWQgZXZlbnQgaGFuZGxpbmcKKworMjAxMS0xMS0wNCAxMzo1NjowNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJICBwdWxzZWF1ZGlvc2luazogcG9ydCBzb21lIG1vcmUgdG8gMC4xMQorCSAgV2UgbXVzdCBub3QgZm9yd2FyZCB0aGUgY2FwcyBldmVudC4gaW5zdGVhZCB3ZSB3aWxsIGRlY2lkZSB3aGF0IHRvIGRvIHdoZW4gdGhlCisJICBwYWQgYmxvY2sgaXMgdGFrZW4uCisJICBVc2UgZGVjb2RlYmluIGluc3RlYWQgb2YgZGVjb2RlYmluMgorCisyMDExLTExLTA0IDEzOjEyOjM3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4Lmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIG1vcmUgdGVtcGxhdGUgZml4ZXMKKworMjAxMS0xMS0wNCAxMTo1ODoyMiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS93ZWJtLW11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSogZ3N0L3J0c3AvZ3N0cnRwZGVjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdmltdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ludGVybGVhdmUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluLmM6CisJICBtYWtlICV1IGluIGFsbCByZXF1ZXN0IHBhZCB0ZW1wbGF0ZXMKKworMjAxMS0xMS0wNCAxMTowMTowMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYworCisyMDExLTExLTA0IDEwOjMyOjQ2ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOgorCSAgUG9ydCBhcGVkZW11eAorCisyMDExLTExLTAzIDIzOjI4OjMxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkgIHJ0cDogdXNlIEdMaWIncyBHX0JJR19FTkRJQU4gZGVmaW5lIGluc3RlYWQgb2YgQklHX0VORElBTgorCSAgRml4ZXMgY29tcGlsZXIgd2FybmluZyBvbiBtaW5ndzMyCisKKzIwMTEtMTEtMDMgMTY6NDM6MDAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSogZ3N0L3VkcC9NYWtlZmlsZS5hbToKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHAuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1cGRhdGUgZm9yIG5ldyBuZXQgbGlicmFyeQorCisyMDExLTExLTAyIDEyOjA5OjIwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvYW5ub2RleC9nc3RjbW1sZGVjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjdGFnLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0dGFnaW5qZWN0LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHRhZ3M6IHVwZGF0ZSBmb3IgdGFnIEFQSSByZW1vdmFsCisKKzIwMTEtMTEtMDIgMTA6NDA6MTIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0xMC0zMSAwMjo0MDowOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1cGRhdGUgZm9yIG5ldGJ1ZmZlciBhcGkgY2hhbmdlCisKKzIwMTEtMTAtMzEgMDI6MzU6NTEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHAuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1cGRhdGUgZm9yIG5ldGFkZHJlc3MgY2hhbmdlCisKKzIwMTEtMTAtMzEgMDI6MjQ6MDQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdXBkYXRlIGZvciBtZXRhIGFwaSBjaGFuZ2UKKworMjAxMS0xMC0yOSAwOToyOToyNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RxdG1vb3ZyZWNvdmVyLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICB1cGRhdGUgZm9yIG5ldyB0YXNrIGFwaQorCisyMDExLTEwLTI5IDA5OjA5OjQ1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgc3RydWN0dXJlOiBmaXggZm9yIGFwaSB1cGRhdGUKKworMjAxMS0xMC0yOSAwODoyNToyNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBidWZmZXJsaXN0OiB1cGRhdGUgZm9yIG5ldyBBUEkKKworMjAxMS0xMS0wMSAwMDo0MDo0MCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWF1ZGlvc2luay5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgVXBkYXRlIGZvciBwYWQgQVBJIGNoYW5nZXMKKwkgIEdzdFByb2JlVHlwZSwgR3N0UHJvYmVSZXR1cm4gYW5kIEdzdEFjdGl2YXRlTW9kZSAtPiBHc3RQYWQqCisKKzIwMTEtMTAtMzEgMTg6Mzg6NTUgKzAxMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkgIGFjM3BhcnNlOiBmaXggb2J2aW91cyBjcmFzaAorCisyMDExLTEwLTMxIDE2OjE4OjMyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGF2b2lkIHNob3J0Y3V0IGV2YWx1YXRpb24gd2hlbiBhZGRpbmcgcGFpcmVkIG1wNCB0YWcKKwkgIEZpeGVzIChwYXJ0IG9mKSAjNjM4NzExLgorCisyMDExLTEwLTMxIDE1OjQzOjI1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGRvIG5vdCB1c2UgdW5vZmZpY2FsIFZfTUpQRUcgY29kZWMgaWQKKwkgIC4uLiBidXQgYXMgbm90IHNwZWMnZWQgZXNwZWNpYWxseSwgY29uc2lkZXIgaXQgYSBWZlcgY29tcGF0aWJpbGl0eSBjYXNlLgorCSAgRml4ZXMgIzY1OTgzNy4KKworMjAxMS0xMC0zMCAxOTozMDoxNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuaDoKKwkgIGZsYWNlbmM6IHJlbW92ZSBkZWFkIGNvZGUgZnJvbSBoZWFkZXIKKwkgIFdlIHJlcXVpcmUgYSBuZXctZW5vdWdoIGxpYmZsYWMgdGhhdCB0aGlzIGNvbmRpdGlvbiB3aWxsIG5ldmVyIGFwcGx5LgorCisyMDExLTEwLTMwIDE5OjA5OjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogcGFyc2Ugc3RyZWFtIGhlYWRlcnMgZnJvbSBjYXBzIGluIHNldF9mb3JtYXQgZnVuY3Rpb24KKwkgIE5vdCB0aGF0IHRoaXMgc2VlbXMgdG8gYmUgYWN0dWFsbHkgbmVlZGVkLCBsaWJmbGFjIGhhcHBpbHkgZGVjb2RlcworCSAgc3R1ZmYgZXZlbiBpZiB3ZSBqdXN0IGRyb3AgYWxsIGhlYWRlcnMgYW5kIG5ldmVyIGZlZWQgaXQgdG8gdGhlCisJICBsaWJyYXJ5LgorCisyMDExLTEwLTMwIDE4OjQ5OjIxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oOgorCSAgZmxhY2RlYzogZG9uJ3QgZXh0cmFjdCBtZXRhZGF0YSwgbGVhdmUgdGhhdCB0byB0aGUgcGFyc2VyIG9yIGNvbnRhaW5lcgorCisyMDExLTEwLTMwIDE4OjQ1OjQ1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oOgorCSAgZmxhY2RlYzogd2UgZXhwZWN0IGZyYW1lZCBpbnB1dCBub3csIHJlbW92ZSBzb21lIG1vcmUgY29kZQorCisyMDExLTEwLTA5IDE2OjE4OjA5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oOgorCSAgZmxhY2RlYzogbmFpdmUgcG9ydCB0byBHc3RBdWRpb0RlY29kZXIKKwkgIFRoaXMgd291bGQgcHJvYmFibHkgaGF2ZSBiZWVuIHRvbyBpbnZhc2l2ZSB0byBkbyBpbiB0aGUgMC4xMAorCSAgYnJhbmNoLCB3aXRoIGFsbCB0aGUgcHVsbC1tb2RlIGFuZCBwYXJzZXIgaGFuZGxpbmcgY29kZSBpbgorCSAgdGhlcmUuCisKKzIwMTEtMTAtMzAgMTE6NDQ6NTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvYW5ub2RleC9nc3RjbW1sZGVjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIGV4dCwgZ3N0OiB1cGRhdGUgZm9yIHRhZ2xpc3QgQVBJIGNoYW5nZXMKKworMjAxMS0xMC0zMCAxMTo0MTozMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgdGVzdHM6IGZpeCBjb21waWxhdGlvbiBvZiBhdWRpbyB0ZXN0cyBpbiB1bmluc3RhbGxlZCBzZXR1cAorCisyMDExLTEwLTI4IDIxOjI2OjMzICswMjAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hLmM6CisJICBhdWRpb3Bhbm9yYW1hOiBzaW1wbGlmeSBnZXRfdW5pdF9zaXplCisKKzIwMTEtMTAtMjggMjE6MTk6NDIgKzAyMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZWNoby5jOgorCSAgdGVzdHM6IGF1ZGlvZWNobzogcG9ydCB0byAwLjExCisKKzIwMTEtMTAtMjggMjE6MTg6MzMgKzAyMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5jOgorCSAgYXVkaW9lY2hvOiBmaXggaW50ZXJuYWwgYnVmZmVyIHNpemUgY2FsY3VsYXRpb24KKworMjAxMS0xMC0yOCAxNDowNTo0OCArMDIwMCAgUmVuw6kgU3RhZGxlciA8cmVuZS5zdGFkbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9jaGViYmFuZC5jOgorCSAgdGVzdHM6IGF1ZGlvY2hlYmJhbmQ6IHBvcnQgdG8gMC4xMQorCisyMDExLTEwLTI4IDE2OjUyOjA4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisKKzIwMTEtMTAtMjggMTU6MDg6MjUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWF1ZGlvc2luay5jOgorCSAgcHVsc2VhdWRpb3Npbms6IGZpeCBwb3J0aW5nIGVycm9ycworCSAgVGhlIHByb2JlcyB3ZXJlIHBvcnRlZCB3cm9uZ2x5IGFuZCBjYXVzZWQgZGVhZGxvY2tzLgorCisyMDExLTEwLTI4IDA5OjU3OjM2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogYWRkIHNvZi1tYXJrZXIgdG8gdGVtcGxhdGUgY2Fwcywgc28gd2UgZG9uJ3QgZ2V0IHBsdWdnZWQgZm9yIGxvc3NsZXNzIGpwZWcKKwkgIGpwZWdkZWMgKHVzaW5nIGxpYmpwZWcgNi4yLzgpIGNhbid0IGRlY29kZSBzb21lIGxvc3NsZXNzIHR5cGVzIG9mIEpQRUcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTU2NjQ4CisKKzIwMTEtMTAtMjggMTM6MDY6MjAgKzAyMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYmxpbWl0LmM6CisJICB0ZXN0czogYXVkaW9jaGVibGltaXQ6IHBvcnQgdG8gMC4xMQorCisyMDExLTEwLTI4IDEzOjAyOjU2ICswMjAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWlpcmZpbHRlci5jOgorCSAgYXVkaW9meDogZml4IGNyYXNoIGluIHByb2Nlc3MoKQorCisyMDExLTEwLTI4IDExOjQ4OjMxICswMjAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2FtcGxpZnkuYzoKKwkgIHRlc3RzOiBhdWRpb2FtcGxpZnk6IHBvcnQgdG8gMC4xMQorCisyMDExLTEwLTI4IDEyOjUxOjMxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYzoKKwkgIHB1bHNlOiBmaXggY2hlY2sgZm9yIGVtcHR5IGNhcHMKKworMjAxMS0xMC0yOCAxMjozMDozMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZWxhYm9yYXRlIHNvbWUgZGVidWcgc3RhdGVtZW50cworCisyMDExLTEwLTExIDIwOjU2OjUxICswNDAwICBTdGFzIFNlcmdlZXYgPHN0c3BAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogYmUgY2FyZWZ1bCB3aXRoIG5lZ2F0aXZlIGN0cworCSAgRml4ZXMgIzY2MTQ3Ny4KKworMjAxMS0xMC0wNiAxMzowNDo1NCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogdHVuZSBub24tdXBkYXRlIHNlZWsgaGFuZGxpbmcgY2FzZXMKKwkgIEZpeGVzICM2NjEwNDkuCisKKzIwMTEtMTAtMjggMTE6NDY6NDAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIGdzdC92aWRlb21peGVyL2dzdGNvbGxlY3RwYWRzMi5jCisKKzIwMTEtMTAtMjggMTE6MTY6MzggKzAyMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5jOgorCSAgYXVkaW9keW5hbWljOiBkb24ndCBzZXQgcHJvY2VzcyBmdW5jdGlvbiB0b28gZWFybHkKKwkgIEdzdEF1ZGlvSW5mbyBhbmQgR3N0QXVkaW9GaWx0ZXIgaGF2ZSBiZWVuIGNoYW5nZWQgc28gdGhhdCB0aGlzIGNvZGUgZG9lc24ndAorCSAgY3Jhc2ggYW55bW9yZSB3aGVuIGEgcHJvcGVydHkgaXMgc2V0IGluIE5VTEwgc3RhdGUuCisKKzIwMTEtMTAtMjggMTA6NDI6MDQgKzAyMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZHluYW1pYy5jOgorCSAgdGVzdHM6IGF1ZGlvZHluYW1pYzogcG9ydCB0byAwLjExCisKKzIwMTEtMTAtMjggMDA6MjQ6MTQgKzAyMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwZWN0cnVtLmM6CisJICB0ZXN0czogc3BlY3RydW06IHBvcnQgdG8gMC4xMQorCisyMDExLTEwLTI3IDIzOjU3OjE3ICswMjAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3Bhbm9yYW1hLmM6CisJICB0ZXN0czogYXVkaW9wYW5vcmFtYTogcG9ydCB0byAwLjExCisKKzIwMTEtMTAtMjcgMjM6NTY6MTIgKzAyMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkgIGF1ZGlvcGFub3JhbWE6IGZpeCBnZXRfdW5pdF9zaXplCisKKzIwMTEtMTAtMjggMTA6NDA6MzYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjI6IFVzZSB0aGUgY2xpcCBmdW5jdGlvbiBpbnN0ZWFkIG9mIHRoZSBwcmVwYXJlX2J1ZmZlciBmdW5jdGlvbgorCisyMDExLTEwLTI4IDA5OjA1OjI3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgcnRwbWFuYWdlciwgdjRsMjogZml4IGNvbXBpbGVyIHdhcm5pbmdzIGFmdGVyIGdzdF9jYXBzX25ld19zaW1wbGUoKSBjaGFuZ2UKKworMjAxMS0xMC0yOCAwOTowMTo1NyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IGNvbXBpbGVyIHdhcm5pbmdzIGFmdGVyIGdzdF9jYXBzX25ld19zaW1wbGUoKSBjaGFuZ2UKKworMjAxMS0xMC0yOCAwOTozNjoxNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvZ3N0Y29sbGVjdHBhZHMyLmM6CisJKiBnc3QvdmlkZW9taXhlci9nc3Rjb2xsZWN0cGFkczIuaDoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMnBhZC5oOgorCSAgdmlkZW9taXhlcjI6IFVzZSBjb2xsZWN0cGFkczIgZnJvbSBjb3JlCisKKzIwMTEtMTAtMjcgMTk6Mzk6MjAgKzAyMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZlbmMvTWFrZWZpbGUuYW06CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSAgd2F2ZW5jOiBwb3J0IHRvIDAuMTEgcmF3IGF1ZGlvIGNhcHMKKworMjAxMS0xMC0yNyAxOTowNjowNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L2Zsdi9nc3RmbHZtdXguYworCisyMDExLTEwLTI3IDE5OjAwOjUyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJKiBnc3QvcnRwL1JFQURNRToKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkgIG1ha2Ugc29tZSBtb3JlIHRoaW5ncyBjb21waWxlIGFnYWluCisKKzIwMTEtMTAtMjcgMTY6MDg6MjIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIGV4dC9wdWxzZS9wdWxzZWF1ZGlvc2luay5jCisJICBleHQvcHVsc2UvcHVsc2VzaW5rLmMKKworMjAxMS0xMC0yNyAxNjowMzoxNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIGZpeCBjb21waWxhdGlvbgorCisyMDExLTEwLTI4IDAwOjQxOjQ1ICsxMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IERvbid0IHBvaW50bGVzc2x5IGhvbGQgb2JqZWN0IGxvY2sgb3ZlciBjYXBzIG9wZXJhdGlvbnMKKwkgIEF2b2lkcyBhIGRlYWRsb2NrIHdoZW4gZ2V0Y2FwcyBpcyByZWN1cnNpdmUgZHVlIHRvIHRoZSBnZXRjYXBzIGJlaW5nCisJICByZWZsZWN0ZWQgdXBzdHJlYW0vZG93bnN0cmVhbS4gVGhlIGxvY2sgaXNuJ3QgYWN0dWFsbHkgcHJvdGVjdGluZworCSAgYW55dGhpbmcgaGVyZS4KKworMjAxMS0xMC0yNyAwMDozNzowMyArMTEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBnc3QvZmx2L2FtZmRlZnMuaDoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IGFkZCBzb21lIGNvbW1lbnRzIGFuZCBkZWZpbmVzIHRvIGNsYXJpZnkgY29kZS4KKworMjAxMS0xMC0xMCAxNTozNjoxNCArMDIwMCAgUmVuw6kgU3RhZGxlciA8cmVuZS5zdGFkbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkgIG1hdHJvc2thOiByZWZhY3RvciBlYm1sLXdyaXRlIHRvIGJlIG1vcmUgMC4xMSBmcmllbmRseQorCSAgU3dpdGNoaW5nIHRvIGEgbW9yZSAwLjExLWZyaWVuZGx5IHBhdHRlcm4sIHdoZXJlIGdldHRpbmcgdGhlIGJ1ZmZlcidzIGRhdGEKKwkgIHBvaW50ZXIgYW5kIHNldHRpbmcgdGhlIHNpemUgbWFueSB0aW1lcyBpcyBsZXNzIG5hdHVyYWwuIFRoaXMgaXMgb2YgY291cnNlIGluCisJICBwcmVwYXJhdGlvbiB0byB0aGUgdXBjb21pbmcgcG9ydCBvZiB0aGUgcGx1Z2luLgorCisyMDExLTEwLTExIDIxOjQ1OjQ2ICswMjAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOgorCSAgbWF0cm9za2E6IHJlbW92ZSBzdGFsZSBmbG9hdGNhc3QgaW5jbHVkZQorCSAgR0RPVUJMRV9UT19CRSB3YXMgbW92ZWQgdG8gY29yZSBhIGxvbmcgdGltZSBhZ28uCisKKzIwMTEtMTAtMTEgMjI6MTA6MjcgKzAyMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBmaXggcG9zc2libGUgY3Jhc2ggd2l0aCBtYWxmb3JtZWQgZGlyYWMgY29kZWNfZGF0YQorCSAgU2luY2Ugc2l6ZSBpcyB1bnNpZ25lZCwgd2UgbmVlZCB0byBzYWZlZ3VhcmQgYWdhaW5zdCB3cmFwcGluZyBiZWxvdyB6ZXJvLgorCisyMDExLTEwLTIxIDIyOjMzOjM0ICswMjAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSAgZXF1YWxpemVyOiByZW1vdmUgYXZvaWRhYmxlIGNhbGwgdG8gZ3N0X29iamVjdF9zZXRfbmFtZQorCisyMDExLTEwLTIxIDIyOjMyOjM4ICswMjAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiByZW1vdmUgYXZvaWRhYmxlIGNhbGwgdG8gZ3N0X29iamVjdF9zZXRfbmFtZQorCisyMDExLTEwLTIxIDE0OjUxOjIzICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VtaXhlcmN0cmwuaDoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkqIHN5cy9vc3MvZ3N0b3NzbWl4ZXIuaDoKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXIuYzoKKwkqIHN5cy9vc3M0L29zczQtc291cmNlLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9lbGVtZW50LmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJyYWRpby5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9vdmVybGF5LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9vdmVybGF5Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkb3JpZW50LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkb3JpZW50Lmg6CisJICBpbnRlcmZhY2VzOiBjbGVhbiB1cCB0aGUgdXNlIG9mIGlmYWNlIGFuZCBjbGFzcy9rbGFzcworCisyMDExLTEwLTIxIDExOjM3OjA1ICswMTAwICBDaHJpc3RpYW4gRnJlZHJpayBLYWxhZ2VyIFNjaGFsbGVyIDxjaHJpc3RpYW4uc2NoYWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBVcGRhdGUgc3BlYyBmaWxlIHNvIGl0cyBwYXJhbGVsLWluc3RhbGxhYmxlIGFuZCBvbmx5IHRyaWVzIHRvIHBhY2thZ2UgcG9ydGVkIHBsdWdpbnMKKworMjAxMS0xMC0xNiAyMDozMDoyNSArMDIwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkgIHBuZ2VuYzogaW5jcmVhc2UgYXJiaXRyYXJ5IHJlc29sdXRpb24gbGltaXRzCisJICBBcHBhcmVudGx5IGxpYnBuZyBjYW4gdGVjaG5pY2FsbHkgZG8gdXAgdG8gMl4zMS0xIHJvd3MgYW5kIGNvbHVtbnMuIEhvd2V2ZXIgaXQKKwkgIGltcG9zZXMgYW4gKGFyYml0cmFyeSkgZGVmYXVsdCBsaW1pdCBvZiAxIG1pbGxpb24gKHRoYXQgY291bGQgdGhlb3JldGljYWxseSBiZQorCSAgbGlmdGVkIGJ5IHVzaW5nIHNvbWUgYWRkaXRpb25hbCBBUEkpLgorCSAgTW92ZWQgYXJyYXkgYWxsb2NhdGlvbiB0byB0aGUgaGVhcCBub3cuCisKKzIwMTEtMTAtMTYgMjA6MjU6NDEgKzAyMDAgIFJlbsOpIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJICBwbmdlbmM6IGRvbid0IHVuY29uZGl0aW9uYWxseSBhbGxvY2F0ZSA0MDk2IHBvaW50ZXJzIG9uIHRoZSBzdGFjaworCSAgSW5zdGVhZCBhbGxvY2F0ZSBhcyBtYW55IGFzIG5lZWRlZCAob24gdGhlIHN0YWNrIHN0aWxsKS4KKworMjAxMS0xMC0xNiAyMDowNToyOCArMDIwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkgIHBuZ2VuYzogZW5zdXJlIHNldGNhcHMgd2FzIGNhbGxlZCBiZWZvcmUgY2hhaW4gZnVuY3Rpb24KKwkgIFRoaXMgaXMgbmVlZGVkIHRvIHByb3Blcmx5IGVycm9yIG91dCBmb3IgZS5nLiAiZmFrZXNyYyAhIHBuZ2VuYyAhIGZha2VzaW5rIi4KKworMjAxMS0xMC0xNiAxOTo0NDoyNyArMDIwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkgIHBuZ2VuYzogdmFsaWRhdGUgaW5wdXQgYnVmZmVyIHNpemUKKwkgIEp1c3QgZm9yIHNhZmV0eTsgb2YgY291cnNlIHN1Y2ggbWlzbWF0Y2ggcmVwcmVzZW50cyBhIGJ1ZyBpbiBhbm90aGVyIGVsZW1lbnQuCisKKzIwMTEtMTAtMTYgMTk6NDE6MjggKzAyMDAgIFJlbsOpIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisKKwkqIGV4dC9saWJwbmcvTWFrZWZpbGUuYW06CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuaDoKKwkgIHBuZ2VuYzogbWFrZSBzZXRjYXBzIG1vcmUgcm9idXN0LCB1c2UgZ3N0dmlkZW8gZnVuY3Rpb25zCisJICBBIHNldGNhcHMgZnVuY3Rpb24gbmVlZHMgdG8gYWN0dWFsbHkgdmVyaWZ5IHRoZSBjYXBzIGNhcmVmdWxseS4gSW4gdGhpcyBjYXNlLAorCSAgaXQgd2FzIHBvc3NpYmxlIHRvIGUuZy4gbGluayBhIHZpZGVvIGRlY29kZXIgd2l0aCBZVVYrUkdCIHRlbXBsYXRlIGNhcHMgdG8KKwkgIHBuZ2VuYy4gIFRoYXQgd291bGQgY2F1c2UgYSBjcmFzaCB3aGVuIHRoZSBkZWNvZGVyIHB1c2hlcyBhIFlVViBidWZmZXIuIFNhbWUKKwkgIHRoaW5nIHdoZW4gcHVzaGluZyBhIHZhbGlkIGJ1ZmZlciB0aGF0IGV4Y2VlZHMgdGhlIHJlc29sdXRpb24gbGltaXRzLgorCSAgQWxzbywgbWlzc2luZyBmcmFtZXJhdGUgY2FwcyBmaWVsZCB3b3VsZCBjYXVzZSBhIGdsaWIgY3JpdGljYWwgd2FybmluZyBkdWUgdG8KKwkgIGludmFsaWQgR1ZhbHVlLiBUaGlzIGZhaWxzIGhhcmQgbm93LgorCisyMDExLTEwLTIxIDEwOjAxOjQzICswMjAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIGVibWw6IHNtYWxsIGNvcnJlY3Rpb24gdG8gcHJldmlvdXMgY29tbWl0CisJICBTaWduYWwgYSBzaG9ydCByZWFkIHdpdGggVU5FWFBFQ1RFRCwgZXhhY3RseSBsaWtlIHRoZSBwZWVrX2J5dGVzIGZ1bmN0aW9uLgorCisyMDExLTEwLTE5IDEzOjA5OjUxICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBlYm1sOiBGaXggcHVzaC1iYXNlZCBiZWhhdmlvdXIKKwkgIFRoZSAncGVlaycgbWV0aG9kIHdhcyBjb21wbGV0ZWx5IHdyb25nICghPykKKworMjAxMS0xMC0xOCAxODozMToxNyArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWF1ZGlvc2luay5jOgorCSAgcHVsc2U6IEdldCBjYXBzIGNvcnJlY3RseSBvbiBwYWQgYmxvY2sKKwkgIEluc3RlYWQgb2YgYWx3YXlzIGdvaW5nIHVwc3RyZWFtLCB3ZSBzaG91bGQgZmlyc3Qgc2VlIGlmIGFscmVhZHkgZ290CisJICBjYXBzIGZyb20gYSBzZXRjYXBzKCkgY2FsbC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjEyNjIKKworMjAxMS0xMC0xOCAxMjoyNToxNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzoKKwkgIHdhdnBhY2tlbmM6IGRvbid0IHVucmVmIGJ1ZmZlciB3aXRoIGdzdF9vYmplY3RfdW5yZWYoKQorCisyMDExLTEwLTE4IDEyOjA1OjAxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IG9ubHkgdXNlIGlzX3BjbSBmb3IgMS4wIG9mIHB1bHNlYXVkaW8KKworMjAxMS0xMC0xOCAxMTo1ODo1NyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBvbmx5IGRpc2FibGUgdHJpY2ttb2RlcyBmb3IgIXBjbQorCSAgT25seSBkaXNhYmxlIHRyaWNrbW9kZXMgd2hlbiB3ZSBhcmUgbm90IGRlYWxpbmcgd2l0aCByYXcgUENNIHNhbXBsZXMuCisKKzIwMTEtMTAtMTYgMTU6MzI6NTAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJICB2aWRlb2Nyb3A6IGZpeCBjb21waWxhdGlvbgorCisyMDExLTEwLTE2IDE1OjI2OjM4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jCisKKzIwMTEtMTAtMTQgMTA6NTY6MTYgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjI6IEZpeCBhIGxlYWsKKwkgIEJ1ZmZlcnMgd2VyZW4ndCBiZWluZyB1bnJlZidlZCBpbiBvbmUgY2FzZSBpbnNpZGUsIGNhdXNpbmcgbWVtb3J5IHVzYWdlCisJICB0byBibG93IHVwLgorCisyMDExLTEwLTE0IDA5OjEwOjAxICswMjAwICBNYXJjIExlZW1hbiA8bWFyYy5sZWVtYW5AZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSAgc2V0IGNvbG91ciBtYXNrcyBmb3IgdmlkZW8veC1yYXctcmdiIGluIHJ0cHZyYXdkZXBheQorCisyMDExLTEwLTEzIDAxOjA1OjEzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogcmUtZW5hYmxlIHZpZGVvY3JvcCBwbHVnaW4KKwkgIEFscmVhZHkgcG9ydGVkIHRvIDAuMTEKKworMjAxMS0xMC0xMyAwMTowNTowNCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvdmlkZW9jcm9wL2dzdGFzcGVjdHJhdGlvY3JvcC5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuaDoKKwkgIGFzcGVjdHJhdGlvY3JvcDogUG9ydCB0byAwLjExCisKKzIwMTEtMTAtMTMgMDA6Mzk6MjggLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3ZpZGVvY3JvcC9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5oOgorCSAgdmlkZW9jcm9wOiBQb3J0IHRvIDAuMTEKKworMjAxMS0xMC0xMiAxNzo0Mzo0NyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hc3BlY3RyYXRpb2Nyb3AuYzoKKwkgIHRlc3RzOiBhc3BlY3RyYXRpb2Nyb3A6IFBvcnQgdG8gMC4xMQorCisyMDExLTEwLTEyIDA4OjI0OjI4IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FscGhhY29sb3IuYzoKKwkgIHRlc3RzOiBhbHBoYWNvbG9yOiBQb3J0IHRvIDAuMTEKKworMjAxMS0xMC0xMyAxNzoxMjoyMyArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IFByb3Blcmx5IHJlZ2lzdGVyIHR5cGUKKwkgIEl0J3MgYSBzdWJjbGFzcyBvZiBHc3RBdWRpb0VuY29kZXIgYW5kIG5vdCBvZiBHc3RFbGVtZW50CisKKzIwMTEtMTAtMTMgMTY6NTk6NTAgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjI6IEZpeCBpbmNvcnJlY3QgZ3N0X2J1ZmZlcl9yZXBsYWNlKCkgY2FsbAorCSAgVGhpcyBnb3QgZXhwb3NlZCB3aGVuIGdzdF9idWZmZXJfcmVwbGFjZSgpIHdhcyBjaGFuZ2VkIGZyb20gYSBtYWNybyB0byBhCisJICBmdW5jdGlvbi4KKworMjAxMS0xMC0xMyAwOTozNDowNCArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgcnRwc3NyY2RlbXV4OiBGaXggd3JvbmcgdXNhZ2Ugb2YgZ3N0X2l0ZXJhdG9yX2ZpbHRlcgorCSAgSXQgdGFrZXMgYSBHVmFsdWUqIGFzIHRoZSB1c2VyX2RhdGEuCisJICBBbmQgZG9uJ3QgZm9yZ2V0IHRvIHVucmVmIHRoZSBkZW11eGVyIGJlZm9yZSByZXR1cm5pbmcuCisKKzIwMTEtMTAtMTMgMDk6MDI6NDcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGZpeCBjb21waWxlCisKKzIwMTEtMTAtMTMgMDg6NTg6MDYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIGV4dC9qcGVnL2dzdGpwZWdkZWMuYworCSAgZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmMKKworMjAxMS0xMC0xMiAwODowOToyMCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZW5jLmM6CisJICB0ZXN0czogY21tbGVuYzogUG9ydCB0byAwLjExCisKKzIwMTEtMTAtMTIgMDg6MDI6MDggLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvY21tbGRlYy5jOgorCSAgdGVzdHM6IGNtbWxkZWM6IFBvcnQgdG8gMC4xMQorCisyMDExLTEwLTEyIDA3OjI5OjMwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWF1ZGlvc2luay5jOgorCSAgcHVsc2VhdWRpb3Npbms6IFVzZSBuZXcgR3N0SXRlcmF0b3IgQVBJIGNvcnJlY3RseQorCSAgR3N0SXRlcmF0b3Igbm93IHVzZXMgR1ZhbHVlLCB1c2UgaXQgY29ycmVjdGx5LgorCisyMDExLTEwLTEyIDExOjI2OjUwICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJICBydHB2cmF3cGF5OiBPbmx5IHVzZSAyNCBMU0IgZm9yIGRlcHRoPTI0IFJHQiBjYXBzCisJICAuLi4gYW5kIGluZGVudCB0aGUgbWFza3MgZm9yIGNsYXJpdHkKKworMjAxMS0xMC0xMSAxNDo1ODo0MyArMDIwMCAgUmVuw6kgU3RhZGxlciA8cmVuZS5zdGFkbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGZpeCBzZWdtZW50IGhhbmRsaW5nLCBzbyB3ZSBhY3R1YWxseSB1c2UgcnVubmluZyB0aW1lCisJICBnc3RfbWF0cm9za2FfbXV4X2Jlc3RfcGFkIGFkanVzdHMgdGhlIGJ1ZmZlciB0aW1lc3RhbXAgdG8gcnVubmluZyB0aW1lIHVzaW5nCisJICB0aGUgc2VnbWVudCBzdG9yZWQgaW4gdGhlIHBhZCdzIGNvbGxlY3QgZGF0YS4gSG93ZXZlciwgdGhlIGV2ZW50IGhhbmRsZXIgZGlkbid0CisJICBwYXNzIHRoZSBuZXdzZWdtZW50IGV2ZW50IG9uIHRvIGNvbGxlY3RwYWRzJyBoYW5kbGVyLCBzbyB0aGlzIHNlZ21lbnQgd2FzIG5ldmVyCisJICB1cGRhdGVkIGF0IGFsbC4KKwkgIFJlLWZpeGVzIGJ1ZyAjNDMyNjEyLgorCisyMDExLTEwLTEwIDE5OjAxOjIzICswMTAwICBTam9lcmQgU2ltb25zIDxzam9lcmQuc2ltb25zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnNzIycGF5LmM6CisJICBnc3RydHBnNzIycGF5OiBDb21wZW5zYXRlIGZvciBjbG9ja3JhdGUgdnMuIHNhbXBsZXJhdGUgZGlmZmVyZW5jZQorCSAgVGhlIFJUUCBjbG9jay1yYXRlIHVzZWQgZm9yIEc3MjIgaXMgODAwMCwgZXZlbiB0aG91Z2ggdGhlIHNhbXBsZXJhdGUgaXMKKwkgIDE2MDAwLiBDb21wZW5zYXRlIGZvciB0aGlzIGJ5IHByZXRlbmRpbmcgRzcyMiBoYXMgOCBiaXRzIHBlciBzYW1wbGUKKwkgIGluc3RlYWQgb2YgdGhlIDQgYml0cyBhcyBpZiBpdCB3ZXJlIGEgY29kZWMgdGhhdCByYW4gYXQgaGFsZiB0aGUgc3BlZWQsCisJICBidXQgd2l0aCB0d2ljZSB0aGUgbnVtYmVyIG9mIGJpdHMuIEZpeGVzICM2NjEzNzYKKworMjAxMS0wOS0yNyAxOToyNTo1MyArMDEwMCAgU2pvZXJkIFNpbW9ucyA8c2pvZXJkLnNpbW9uc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IEltcGxlbWVudCB1cHN0cmVhbSBuZWdvdGlhdGlvbgorCSAgQWRkIHVwc3RyZWFtIG5lZ290aWF0aW9uIGZvciBqcGVnZGVjLiBGaXhlcyAjNjYwMjc1CisKKzIwMTEtMTAtMTAgMTk6MDI6NTggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thLWRlbXV4OiBkb24ndCBsZWFrIGF1ZGlvIGNvZGVjX2RhdGEgYnVmZmVyCisKKzIwMTEtMTAtMTAgMTc6NDE6MTAgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJICBhbHBoYTogRG9uJ3QgdXNlIHN0YXJ0KCkgdm1ldGhvZAorCSAgVGhlIG9ubHkgdGhpbmcgd2UncmUgZG9pbmcgaXMgaW5pdGlhbGl6aW5nIHBhcmFtZXRlcnMgLi4uCisJICAqIHdoaWNoIHdvbid0IHdvcmsgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHVwc3RyZWFtL2Rvd25zdHJlYW0gY2FwcworCSAgKiB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkIHdoZW4gOjpzZXRfY2FwcygpIGlzIGNhbGxlZAorCisyMDExLTEwLTEwIDE0OjA4OjI5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisKKzIwMTEtMTAtMTAgMTM6MjI6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOgorCSAgaWQzZGVtdXg6IHBvcnQgdG8gMC4xMQorCisyMDExLTEwLTEwIDEzOjIwOjA0ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9jYWlyby9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiBhZGQgbWlzc2luZyBQTFVHSU5fQVNFX0xJQlMgdG8gTERBREQKKworMjAxMS0xMC0xMCAxMjo1NDoyMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJICBpY3lkZW11eDogcG9ydCB0byAwLjExCisKKzIwMTEtMTAtMTAgMTI6Mjc6MDYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuYzoKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxlbmMuYzoKKwkgIGFubm9kZXg6IHBvcnQgdG8gMC4xMQorCisyMDExLTEwLTEwIDExOjQ4OjIwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYworCisyMDExLTEwLTEwIDAwOjE4OjU2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuaDoKKwkgIHB1bHNlOiBwb3J0IHB1bHNldXRpbCB0byAwLjExCisKKzIwMTEtMTAtMDkgMjE6MTc6MjQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJICBwdWxzZWF1ZGlvc2luazogcG9ydCB0byAwLjExCisKKzIwMTEtMTAtMDkgMTg6NTg6MjkgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBGaXhpbmcgZ2V0Y2FwcyBmdW5jdGlvbgorCSAgVXBkYXRlIGdldGNhcHMgZnVuY3Rpb24gdG8gMC4xMSBBUEkKKworMjAxMS0xMC0wOSAyMTozMToyNyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmg6CisJICBzcGVleGVuYzogb25seSBwdXNoIGhlYWRlciBidWZmZXJzIGZvbGxvd2luZyBpbml0aWFsIGV2ZW50cworCisyMDExLTEwLTA5IDE2OjI5OjA1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgcmVtb3RlLXRyYWNraW5nIGJyYW5jaCAnb3JpZ2luL21hc3RlcicgaW50byAwLjExCisKKzIwMTEtMTAtMDkgMTY6MjQ6MzYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5jOgorCSAgcXRkZW11eDogdXBkYXRlIGZvciBfX2dzdF9kZWJ1Z19taW4gbmFtZSBjaGFuZ2UKKworMjAxMS0xMC0wOSAxMToxODoxOCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zcmVjb3ZlcnkuYzoKKwkgIHF0bXV4OiBGaXggbWVtb3J5IGxlYWsgb24gYXRvbXMgcmVjb3ZlcnkgZnVuY3Rpb24KKwkgIFJlbWVtYmVyIHRvIGZyZWUgdGhlIGZ0eXAgZGF0YSBhZnRlciB3cml0aW5nIGl0IHRvIGEgZmlsZS4KKwkgIEZpeGVzICM2NjA5NjkKKworMjAxMS0xMC0wNiAxMjoyNjozMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHJlcG9ydCBuZXcgYml0cworCisyMDExLTEwLTA2IDEyOjIzOjM5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYworCSAgZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmMKKwkgIGdzdC9pc29tcDQvYXRvbXMuYworCSAgZ3N0L2lzb21wNC9nc3RxdG11eC5jCisKKzIwMTEtMDktMjEgMTg6NDU6NDIgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgbWF0cm9za2FkZW11eDogaW1wcm92ZSBzZWdtZW50IGhhbmRsaW5nIHdpdGggbm9uLXplcm8gc3RhcnRpbmcgdGltZXN0YW1wCisJICAuLi4gYXMgd2VsbCBhcyByZWxhdGVkIGl0ZW1zLCBzdWNoIGFzIHNlZWtpbmcgYW5kIHBvc2l0aW9uIHJlcG9ydGluZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTk4MDgKKworMjAxMS0wOS0yOSAxODo0MTo1MyArMDQwMCAgU3RhcyBTZXJnZWV2IDxzdHNwQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHY0bDIsIHhpbWFnZXNyYzogZml4IHNvbWUgcHJpbnRmIGZvcm1hdCBjb21waWxlciB3YXJuaW5ncworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2MDE1MAorCisyMDExLTA5LTMwIDEyOjQyOjIyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkgIHRlc3RzOiBxdG11eDogUmVmYWN0b3IgYml0cmF0ZSBjaGVjayB0ZXN0CisJICBSZWZhY3RvciBiaXRyYXRlIGNoZWNrIHRlc3QgdG8gYWNjb21vZGF0ZSBtdWx0aXBsZSB0ZXN0cworCSAgZm9yIGJpdHJhdGUKKworMjAxMS0wOS0zMCAxMzowMjozMSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkgIHF0bXV4OiB1cGRhdGUgZXNkcyBhdG9tIHVuZGVyIHdhdmUgYXRvbSBmb3IgYWFjIGJpdHJhdGVzCisJICBBQUMgaW4gbW92IGZvcm1hdCBwdXRzIGFuIEVTRFMgYXRvbSBpbnNpZGUgb2YgYSBXQVZFIGF0b20gaW4KKwkgIFNUU0QgYXRvbSwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGJpdHJhdGUgb24gdGhpcyBFU0RTLiBUaGlzIHBhdGNoCisJICBmaXhlcyBpdC4KKworMjAxMS0wOS0zMCAxMjo0MTo1MiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvZm91cmNjLmg6CisJICBxdG11eDogQWxzbyB1cGRhdGUgYnRydCBhdG9tCisJICBXaGVuIHJld3JpdGluZyBiaXRyYXRlcywgYWxzbyB1cGRhdGUgdGhlIGJ0cnQgYXRvbSB1bmRlciBzdHNkCisKKzIwMTEtMDktMzAgMTA6NTU6NTMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgdGVzdHM6IHF0bXV4OiBhZGQgdGVzdHMgZm9yIGJpdHJhdGUgYXZlcmFnZSBjYWxjdWxhdGlvbgorCSAgQWRkcyB0ZXN0cyB0byBtYWtlIHN1cmUgcXRtdXgvbXA0bXV4IHNldHMgYXZlcmFnZSBiaXRyYXRlCisJICBjb3JyZWN0bHkKKworMjAxMS0wOS0yOCAxMTo0MTo0OSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvYXRvbXMuaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBDYWxjdWxhdGUgYXZlcmFnZSBiaXRyYXRlIGZvciBzdHJlYW1zCisJICBDYWxjdWxhdGUgYW5kIHVzZSBhdmVyYWdlIGJpdHJhdGUgZm9yIHN0cmVhbXMgd2hlbiBubworCSAgYml0cmF0ZSB0YWcgd2FzIHJlY2VpdmVkCisKKzIwMTEtMDktMjggMTA6NDE6MTQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogQXZvaWQgYSBidWZmZXIgbWV0YWRhdGEgY29weSBpZiBwb3NzaWJsZQorCSAgSWYgZmlyc3RfdHMgaXMgMCB0aGVyZSBpcyBubyBuZWVkIHRvIHN1YnRyYWN0LCBzbyB3ZSBtaWdodAorCSAgc2tpcCBzb21lIGNvcHlpbmcgdG8gbWFrZSB0aGUgYnVmZmVyIG1ldGFkYXRhIHdyaXRhYmxlLgorCisyMDExLTA5LTI5IDIzOjIxOjQ2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJICBzcGVleGVuYzogaW5pdGlhbGlzZSB2YXJpYWJsZSBiZWZvcmUgYWRkaW5nIHRvIGl0CisKKzIwMTEtMDktMjkgMTc6MjE6MjIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5oOgorCSAgc3BlZXhkZWM6IHBvcnQgdG8gYXVkaW9kZWNvZGVyCisKKzIwMTEtMDktMjkgMTY6MzM6MDEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuaDoKKwkgIHNwZWV4ZW5jOiBjbGVhbiB1cCBzb21lIHVudXNlZCByZW1uYW50cworCisyMDExLTA5LTI5IDE3OjMyOjIzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NwZWV4L01ha2VmaWxlLmFtOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuaDoKKwkgIHNwZWV4ZW5jOiBwb3J0IHRvIGF1ZGlvZW5jb2RlcgorCisyMDExLTA5LTI4IDE5OjEwOjI3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogZ2V0IHJpZCBvZiBncmFudWxlcG9zIGhhbmRsaW5nCisJICBMZWF2ZSB0aGF0IHRvIHRoZSBwYXJzZXIgb3IgZGVtdXhlci4gVGhlcmUncyBzdGlsbCBzb21lCisJICBjb2RlIGZvciBvcGVyYXRpbmcgaW4gREVGQVVMVCAoc2FtcGxlcykgZm9ybWF0LCBidXQgdGhhdAorCSAgd2lsbCBiZSByZW1vdmVkIGxhdGVyLgorCisyMDExLTA5LTI4IDE4OjMyOjAwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oOgorCSAgZmxhY2RlYzogZ2V0IHJpZCBvZiBwdWxsLW1vZGUgc3VwcG9ydCBhbmQgZm9jdXMgb24gYmVpbmcgYSBkZWNvZGVyCisJICBMZWF2ZSBhbGwgdGhlIG90aGVyIHN0dWZmIHRvIGZsYWNwYXJzZS4KKworMjAxMS0wOS0yOCAxNzoyOTowOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGZsYWMsIGpwZWc6IGZpeCBjb21waWxlciB3YXJuaW5nCisKKzIwMTEtMDktMjggMTc6NDA6MDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzoKKwkgIGZsYWM6IHBvcnQgdG8gMC4xMQorCisyMDExLTA5LTI4IDE3OjM5OjEyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBleHQvZmxhYy9nc3RmbGFjZW5jLmMKKworMjAxMS0wOS0yOCAxNjoxODo1NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDExLTA5LTI4IDE2OjA5OjU4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvTWFrZWZpbGUuYW06CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmg6CisJICBmbGFjZW5jOiBwb3J0IHRvIGF1ZGlvZW5jb2RlcgorCisyMDExLTA5LTI3IDE1OjU5OjI0ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkgIG1hdHJvc2thZGVtdXg6IGVuc3VyZSBtaW5pbWFsIGFsaWdubWVudCBmb3IgYXVkaW8veC1yYXctKiBidWZmZXJzCisJICBTaW5jZSBtYXRyb3NrYWRlbXV4IHdpbGwgYXR0ZW1wdCB0byBwdXNoIHVuYWxpZ25lZCBidWZmZXJzLAorCSAgZG93bnN0cmVhbSBtaWdodCBoYXZlIHRyb3VibGUgd2l0aCB0aG9zZSwgZXNwZWNpYWxseSBpZiBkb3duc3RyZWFtCisJICB1c2VzIE9SQywgc3VjaCBhcyBhdWRpb2NvbnZlcnQuCisJICBFbnN1cmUgd2UgcHVzaCBidWZmZXJzIGFsaWduZWQgdG8gdGhlIGJhc2ljIHR5cGUgYXQgbGVhc3QgZm9yCisJICB0aG9zZSByYXcgYnVmZmVycy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTk3OTgKKworMjAxMS0wOS0yOCAxMjo0NDo1OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgY29tbW9uCisJICBleHQvcHVsc2UvcHVsc2VzaW5rLmMKKwkgIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5jCisJICBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmMKKwkgIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYworCSAgZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmMKKwkgIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmMKKwkgIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmMKKworMjAxMS0wOS0yOCAwMDoxMDowOSArMDMwMCAgUmFpbW8gSsOkcnZpIDxyYWltby5qYXJ2aUBnbWFpbC5jb20+CisKKwkqIGdzdC9nb29tMmsxL2dvb21fY29yZS5jOgorCSAgZ29vbTJrMTogRml4IGNvbXBpbGVyIHdhcm5pbmdzIG9uIDY0IGJpdCBtaW5ndy13NjQKKwkgIEZpeGVzIGJ1ZyAjNjYwMjk0LgorCisyMDExLTA5LTI1IDE1OjEzOjM5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvTWFrZWZpbGUuYW06CisJKiBleHQvc291cC9nc3Rzb3VwLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5oOgorCSAgc291cDogcmVuYW1lIHNvdXBodHRwc2luayB0byBzb3VwaHR0cGNsaWVudHNpbmsKKwkgIFRvIGF2b2lkIGNvbmZ1c2lvbiwgYW5kIGJlY2F1c2Ugd2UgbWlnaHQgd2FudCBhIHNlcnZlcgorCSAgc2luayBhdCBzb21lIHBvaW50IHRvby4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTk5NDcKKworMjAxMS0wOS0yMyAxNjozOTo0NiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc2luay5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzaW5rLmg6CisJICBzb3VwaHR0cHNpbms6IGRvbid0IGNyZWF0ZSB1bnVzZWQgc2Vjb25kIHNpbmsgcGFkIG9iamVjdAorCSAgVGhlIGJhc2UgY2xhc3Mgd2lsbCBjcmVhdGUgdGhlIHNpbmsgcGFkLgorCisyMDExLTA5LTIzIDE1OjM2OjM2ICswMjAwICBKdWxpZW4gSXNvcmNlIDxqdWxpZW4uaXNvcmNlQGdtYWlsLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IGNvcnJlY3RseSBjaGVjayBmb3IgYWMzL2UtYWMzIHN3aXRjaAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1OTk0MworCisyMDExLTA5LTIxIDE0OjAxOjIwICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBjb21tb246CisJICBVcGRhdGUgY29tbW9uIHRvIDAuMTEgYnJhbmNoCisKKzIwMTEtMDktMjAgMTM6Mzg6NTMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgcnRwaDI2NGRlcGF5OiBpbXByb3ZlIGRvd25zdHJlYW0gZmxvdyByZXR1cm4gZmVlZGJhY2sgdG8gdXBzdHJlYW0KKwkgIC4uLiBhbHRob3VnaCBiYXNlcnRwZGVwYXkgZG9lcyBub3QgcmVhbGx5IG1ha2UgaXQgZWFzeS9wb3NzaWJsZSB0byBkbyBzbworCSAgYWxsIHRoZSB3YXkuCisKKzIwMTEtMDktMjAgMTI6MTE6NDcgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuaDoKKwkgIHhpbWFnZXNyYzogYWRkIHhpZCBhbmQgeG5hbWUgcHJvcGVydGllcyB0byBhbGxvdyBjYXB0dXJpbmcgYSBwYXJ0aWN1bGFyIHdpbmRvdworCSAgQSBwYXJ0aWN1bGFyIHdpbmRvdyBtYXkgYmUgc2VsZWN0ZWQgdXNpbmcgdGhlIG5ldyB4aWQgKFgtV2luZG93CisJICBYSUQsIGVnIGEgcG9pbnRlcikgYW5kIHhuYW1lICh3aW5kb3cgdGl0bGUpIHByb3BlcnRpZXMuIElmIGJvdGgKKwkgIGFyZSBzcGVjaWZpZWQsIHRoZSBYSUQgaXMgdXNlZCBpbiBwcmVmZXJlbmNlLCBmYWxsaW5nIGJhY2sgdG8KKwkgIHhuYW1lIGlmIG5vdCBmb3VuZC4KKwkgIERlZmF1bHQgKGlmIG5vbmUgb2YgeGlkIGFuZCB4bmFtZSBhcmUgc3BlY2lmaWVkLCBvciBpZiBubyBzdWNoCisJICB3aW5kb3cgaXMgZm91bmQpIGlzIHRvIGNhcHR1cmUgdGhlIHJvb3Qgd2luZG93LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU0NjkzMgorCisyMDExLTA4LTAyIDE3OjM5OjQ0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkgIHRlc3RzOiBhZGQgdW5pdCB0ZXN0IHRvIG1ha2Ugc3VyZSBlbmNvZGViaW4gcGlja3MgbXA0bXV4IGZvciB2YXJpYW50PWlzbworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MTQ5NgorCisyMDExLTA5LTE5IDEyOjE1OjExICswMjAwICBIYSBOZ3V5ZW4gPGhhbmd1eXR2QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IEZpeCBhIGxlYWtlZCBjbG9jayBmb3IgZWFjaCBidWZmZXJpbmcgbWVzc2FnZQorCSAgRml4ZXMgYnVnICM2NTkyMzcuCisKKzIwMTEtMDktMTkgMTI6MTE6MzIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9mb3VyY2MuaDoKKwkgIHF0ZGVtdXg6IHBhcnNlIGVtYmVkZGVkIElEMzIgdGFncworCisyMDExLTA5LTAyIDEzOjQxOjQxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzZXNzaW9uOiBhdm9pZCBzb3VyY2UgcHJlbWF0dXJlIHRpbWluZyBvdXQKKwkgIFVzZSBzbGlnaHRseSBhZGp1c3RlZCBzZW5kZXIgaW50ZXJ2YWwgdG8gZGV0ZXJtaW5lIHNlbmRlciB0aW1lb3V0IHJhdGhlciB0aGFuCisJICBvdXIgb3duIHNlbmRlciBzaWRlIGludGVydmFsICh3aGljaCBtYXkgaGF2ZSBiZWVuIGZvcmNlZCBzbWFsbCkuCisKKzIwMTEtMDgtMjUgMTI6NDA6NTIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBzZXNzaW9uOiBhdm9pZCB0aW1pbmcgb3V0IHNvdXJjZSB0b28gcXVpY2tseQorCSAgLi4uIGZvbGxvd2luZyBhIFBBVVNFL1BMQVkgY3ljbGUsIHBhcnRpY3VsYXJseSBhcHBsaWNhYmxlIHdoZW4gb3BlcmF0aW5nCisJICB3aXRoIGEgc2hvcnQgUlRDUCBpbnRlcnZhbCAocG9zc2libHkgZm9yY2VkIHNvIHNlcnZlci1zaWRlKS4KKworMjAxMS0wOC0yNCAxNDozNzo1MiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXIvcnRwYmluOiByZWxheCBkcm9wcGluZyBydGNwIHBhY2tldHMKKwkgIC4uLiB0byBhdCBsZWFzdCBoYXZpbmcgaXQgdHJpZ2dlciBhL3Ygc3luY2hyb25pemF0aW9uLCBwb3NzaWJseSB3aXRob3V0CisJICB1c2luZyBwcm92aWRlZCB2YWx1ZXMgd2hpY2ggYXJlIHN0aWxsIG5vdCBjb25zaWRlcmVkIHNhbmUKKwkgIChhcyBwcmV2aW91c2x5IGRyb3BwZWQpLgorCisyMDExLTA4LTI0IDE0OjM0OjIzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHNvbWUgbW9yZSByZXNldCB3aGVuIGNsZWFyaW5nIHB0IG1hcAorCSAgLi4uIHdoaWNoIGluIHBhcnRpY3VsYXIgY2F0ZXJzIGZvciBzb21lIG1vcmUgcmVzZXQgZm9sbG93aW5nIGEgcG9zc2libGUKKwkgIHJ0c3AgUExBWS4KKworMjAxMS0wOC0yMSAyMTo1ODozOCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGRvIG5vdCBzZXQgZWxlbWVudHMgdG8gUExBWUlORyB3aGVuIGRvaW5nIHNlZWsgaW4gUEFVU0VECisKKzIwMTEtMDktMDEgMTQ6NDc6NDggKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogb25seSByZXNldCBza2V3IG9uIGdhcCBpZiBpbnB1dCB0cyBhdmFpbGFibGUKKworMjAxMS0wOC0xOCAxNDoxMjoyMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBjaGVjayBzb21lIG1vcmUgZm9yIHBvc3NpYmxlIHJ0cCB0aW1lc3RhbXAgZGlzY29udGludWl0eQorCSAgLi4uIHdoZW4gb3BlcmF0aW5nIGluIG5vbiBzbGF2ZSBtb2RlLCBhbmQgcmVzZXQgaWYgZGV0ZWN0ZWQuCisJICBUaGlzIHNob3VsZCBhdm9pZCBzb21lIChsYXJnZSkgYm9ndXMgb3V0Z29pbmcgdGltZXN0YW1wIGR1ZSB0byBqdW1wcworCSAgaW4gcnRwIHRpbWUsIGFzIHJlc3VsdCBvZiBQQVVTRS9QTEFZIG9yIHNlZWsgb3IgLi4uCisKKzIwMTEtMDgtMDggMTI6NDg6NTAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBzd2l0Y2ggdG8gcnRwIHRpbWUgYmFzZWQgc3luY2luZyB3aGVuIGd1ZXNzZWQgYXBwcm9wcmlhdGUKKworMjAxMS0wOC0wOCAxMjoxNToyMCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICBydHBiaW46IGFsdGVybmF0aXZlIGludGVyLXN0cmVhbSBzeW5jaW5nIG1ldGhvZHMKKwkgIC4uLiBhdCBsZWFzdCBpZiBub3Qgc3luY2luZyB0byBOUFQgdGltZToKKwkgICogZWl0aGVyIHN5bmMgdXNpbmcgUlRDUCBTUiBkYXRhIChhcyBjdXJyZW50bHkpCisJICAqIG9ubHkgcGVyZm9ybSB0aGUgYWJvdmUgb25jZSB1c2luZyBpbml0aWFsIFJUQ1AgU1IgcGFja2V0cworCSAgKiBkaXNjYXJkIFJUQ1AgYW5kIHN5bmMgYnkgZXF1YXRpbmcgcHJvdmlkZWQgc3RyZWFtJ3MgY2xvY2stYmFzZSBydHB0aW1lLAorCSAgYXMgcHJvdmlkZWQgYnkgaml0dGVyYnVmZmVyICh0eXBpY2FsbHkgb2J0YWluZWQgZnJvbSBSVFAtSW5mbyBpbiBSVFNQKS4KKworMjAxMS0wOC0wOCAxMjoxMToyNCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBhbHNvIHByb3ZpZGUgY2xvY2stYmFzZSB0byBzeW5jIHNpZ25hbAorCisyMDExLTA4LTA4IDEyOjA5OjQxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgIHJ0cGJpbjogYWxsb3cgY29uZmlndXJhYmxlIHJ0Y3Agc3RyZWFtIHN5bmNpbmcgaW50ZXJ2YWwKKwkgIC4uLiByYXRoZXIgdGhhbiBuZWNlc3NhcmlseSBzeW5jaW5nIGF0IGVhY2ggUlRDUCBTUi4KKworMjAxMS0wOC0wMSAwODozNTowMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IHRyaWdnZXIgcmVjb25zaWRlcmF0aW9uIGlmIHJ0Y3AgaW50ZXJ2YWwgc2V0CisKKzIwMTEtMDgtMDEgMDg6MzI6MjQgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBjb25maWd1cmUgcnRjcCBpbnRlcnZhbCBpZiBwcm92aWRlZAorCSAgLi4uIGluIFBMQVkgcmVzcG9uc2UuCisKKzIwMTEtMDktMTYgMTY6NTM6MjIgKzAzMDAgIExhc3NlIExhdWtrYW5lbiA8bGFzc2UubGF1a2thbmVuQGRpZ2lhLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgaXNvbXA0OiBGaXggYWxsb3dpbmcgemVybyBkdXJhdGlvbiB0cmFja3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Mzc0ODYKKworMjAxMS0wOS0wNSAxMDoxMToxOCArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuYzoKKwkgIHVkcHNyYzogZXJyb3Igb3V0IHdoZW4gbm8gcHJvdG9jb2wgaXMgc3BlY2lmaWVkIGluIHRoZSB1cmkKKwkgIEl0IGlzIGNlcnRhaW5seSBiZXR0ZXIgdGhhbiB0byBjcmFzaC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTgxNzgKKworMjAxMS0wOS0xOSAwOTozNzo1OCArMDIwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgc3BlZXhlbmM6IGRvIG5vdCB1c2UgaW52YWxpZCBidWZmZXIgdGltZXN0YW1wcworCisyMDExLTAzLTI5IDEyOjA5OjE4ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL01ha2VmaWxlLmFtOgorCSogZXh0L3B1bHNlL3BsdWdpbi5jOgorCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJKiBleHQvcHVsc2UvcHVsc2V1dGlsLmg6CisJICBwdWxzZTogTmV3IHB1bHNlYXVkaW9zaW5rIGVsZW1lbnQgdG8gaGFuZGxlIGZvcm1hdCBjaGFuZ2VzCisJICBUaGlzIGludHJvZHVjZXMgYSBuZXcgYmluIHdoaWNoIHdyYXBzIGFyb3VuZCBwdWxzZXNpbmsgYW5kIGRlcGVuZGluZyBvbgorCSAgdGhlIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IHRoZSBzaW5rLCBwbHVncyBpbi9vdXQgYSBkZWNvZGViaW4yIGFzCisJICByZXF1aXJlZC4gVGhpcyBhbGxvd3MgdXNlcnMgdG8gc3dpdGNoIHNpbmtzIG9uIHRoZSBzdHJlYW0gYW5kIGFkYXB0cworCSAgYWNjb3JkaW5nbHkgKGZvciBleGFtcGxlLCB5b3UgY291bGQgd2F0Y2ggYSBtb3ZpZSBpbiBwYXNzdGhyb3VnaCBtb2RlIG9uCisJICB5b3VyIHJlY2VpdmVyIHdoaWNoIHN1cHBvcnRzIEFDMyBkZWNvZGUsIHRoZW4gcGx1ZyBvdXQgYW5kIHN3aXRjaCB0byBhCisJICBub24tZGlnaXRhbCBwcm9maWxlIHRvIGNvbnRpbnVlIHVuaW50ZXJydXB0ZWQgb24gYW5hbG9nIG91dHB1dCkuCisJICBUaGUgYmluIGlzIHJlcXVpcmVkIGJlY2F1c2UgZG9pbmcgdGhlIHNhbWUgd2l0aCBwbGF5YmluMi9wbGF5c2luayB3aWxsCisJICByZXF1aXJlIEFQSSBjaGFuZ2VzIHRoYXQgY2Fubm90IGJlIG1hZGUgaW4gMC4xMC4gV2l0aCAwLjExLzEuMCwgd2UKKwkgIHNob3VsZCBiZSBhYmxlIHRvIGFzayBmb3IgdXBzdHJlYW0gY2FwcyByZW5lZ290aWF0aW9uIHRvIGRlYWwgd2l0aCBhbGwKKwkgIHRoaXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU3MTc5CisKKzIwMTEtMDktMTYgMTU6MDM6MjMgKzAyMDAgIEJyYW5rbyBTdWJhc2ljIDxicmFua29AYXhpcy5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWF0cm9za2FkZW11eDogQXZvaWQgc2VuZGluZyBFT1Mgd2hlbiBpbiBwYXVzZWQgc3RhdGUKKwkgIENoYW5nZWQgdGhlIGVibWwgcmVhZGVyJ3MgZ3N0X2VibWxfcGVla19pZF9sZW5ndGgoKSBmdW5jdGlvbiBzbworCSAgdGhhdCBpdCByZXR1cm5zIHRoZSBhY3R1YWwgcmVhc29uIGZvciB3aHkgdGhlIHBlZWsgZmFpbGVkLCBpbnN0ZWFkCisJICBvZiAoYWxtb3N0KSBhbHdheXMgcmV0dXJuaW5nIEdTVF9GTE9XX1VORVhQRUNURUQuIFRoaXMgcHJldmVudHMKKwkgIHRoZSBwdWxsaW5nIHRhc2sgZnJvbSBzZW5kaW5nIEVPUyB3aGVuIGRvaW5nIGEgZmx1c2hpbmcgc2Vlay4KKworMjAxMS0wOS0xNSAxNTo1Mzo0NyArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogZml4IHN0dXR0ZXJpbmcgQS9WCisJICBTb21lb25lIGdvdCBoYWQgYnkgaW1wbGljaXQgcHJvbW90aW9uIHRvIHVuc2lnbmVkIGluIG9wcyB3aXRoCisJICBhIHNpZ25lZCBhbmQgYW4gdW5zaWduZWQgdmFsdWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU5MTUzCisKKzIwMTEtMDktMTQgMTY6Mzc6MTIgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZzZWVrLmM6CisJICBuYXZzZWVrOiB0b2dnbGUgcGF1c2UvcGxheSBvbiBzcGFjZSBiYXIKKwkgIEEgdXNlZnVsIHRoaW5nIHRvIGhhdmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU5MDY1CisKKzIwMTEtMDktMTQgMTQ6NDY6MDAgKzAyMDAgIERhdmlkIFN2ZW5zc29uIEZvcnMgPGRhdmlkc2ZAYXhpcy5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICBtYXRyb3NrYWRlbXV4OiBjb25maWd1cmFibGUgdGltZXN0YW1wIGdhcCBoYW5kbGluZworCSAgbWF0cm9za2FkZW11eCBwZXJmb3JtcyBzZWdtZW50IHRyaWNrcyB0byBza2lwIGdhcHMgaW4gc3RyZWFtcywKKwkgIG5vdGFibHkgYXQgc3RhcnQgZm9yIG5vbiAwIGJhc2VkIGZpbGVzLiAgVGhlcmUgbWF5IGhvd2V2ZXIgYmUKKwkgIGNhc2VzIHdoZW4gZnVsbCBwcmVzZW50YXRpb24gKGluY2x1ZGluZyBpbnRlcm1lZGlhdGUgZ2FwcykgaXMKKwkgIGRlc2lyZWQsIHNvIGEgcHJvcGVydHkgYWxsb3dzIHRvIGNvbmZpZ3VyZSBhcyBvZiB3aGljaCBnYXAKKwkgIHRvIGFjdCAob3Igbm90IGF0IGFsbCkuCisJICBBUEk6IEdzdE1hdHJvc2thRGVtdXg6Om1heC1nYXAtdGltZQorCSAgRml4ZXMgIzY1OTAwOS4KKworMjAxMS0wOS0xMiAwOToyMTo0NyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2Zsdm11eC5jOgorCSAgdGVzdHM6IGZsdm11eDogRml4IGZsdm11eCdzIHRlc3RzIGFmdGVyIGZpeCBmb3IgcmVxdWVzdCBwYWRzIGhhbmRsaW5nCisJICBOb3cgdGhhdCBmbHZtdXggZG9lc24ndCByZWxlYXNlIGl0cyByZXF1ZXN0IHBhZHMgb24gUEFVU0VELT5SRUFEWSB0aGUKKwkgIHRlc3QgZG9lc24ndCBuZWVkIHRvIHJlLXJlcXVlc3QgdGhlbSBmb3IgZXZlcnkgcmV1c2UgdGVzdCBzdGFydC4KKworMjAxMS0wOS0wOSAwOToxMjo1NiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBGaXggY3R0cyBnZW5lcmF0aW9uIGZvciBzdHJlYW1zIHRoYXQgZG9uJ3Qgc3RhcnQgYXQgMCB0aW1lc3RhbXBzCisJICBTdWJ0cmFjdCB0aGUgZmlyc3QgdGltZXN0YW1wIG9mIGEgc3RyZWFtIGZyb20gYWxsIGlucHV0IGJ1ZmZlcnMgdG8KKwkgIGdldCAwLWJhc2VkIHRpbWVzdGFtcHMgZm9yIGNyZWF0aW5nIGEgc2FuZSBjdHRzIHRhYmxlLiBXaXRob3V0IHRoaXMKKwkgIHBhdGNoIHRoZSBjdHRzIGNvdWxkIGhhdmUgbGFyZ2VyIHZhbHVlcyB0aGFuIG5lZWRlZCwgY2F1c2luZyB0aGUKKwkgIHBsYXliYWNrIHRvIGhhdmUgYSBkZWxheSBhdCBzdGFydHVwLgorCSAgQXMgdGhlIGZpcnN0IHRpbWVzdGFtcCBpcyBvbmx5IGZvdW5kIGFmdGVyIGEgZmV3IGJ1ZmZlcnMgYXJlIHF1ZXVlZAorCSAgKGR1ZSB0byBwb3NzaWJsZSByZW9yZGVyZWQgYnVmZmVycyksIG9uY2Ugd2UgZmluZCB0aGUgZmlyc3QgdGltZXN0YW1wCisJICB3ZSBzdWJ0cmFjdCBpdCBmcm9tIGFsbCBidWZmZXJzIG9uIHRoZSBxdWV1ZSwgZnJvbSB0aGF0IHBvaW50IG9uLAorCSAgYWxsIGJ1ZmZlcnMgaGF2ZSB0aGVpciB0aW1lc3RhbXBzIHN1YnRyYWN0IHdoZW4gdGhleSBhcmUgY29sbGVjdGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1ODY1OQorCisyMDExLTA5LTEyIDA3OjU1OjE5ICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogZG9uJ3QgcmVsZWFzZSByZXF1ZXN0IHBhZHMgZ29pbmcgUEFVU0VELT5SRUFEWQorCSAgRG9uJ3QgcmVsZWFzZSByZXF1ZXN0IHBhZHMgYnV0IGp1c3QgcmVzZXQgdGhlbS4gVGhpcyBtYWtlcyBwaXBlbGluZXMgdXNpbmcKKwkgIGZsdm11eCByZXVzYWJsZS4KKworMjAxMS0wOS0wOSAxMjozNTo1MCArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkgIGFjM3BhcnNlOiB1c2UgYnNpZCA5IGFuZCAxMCB0byBjb250cm9sIHNhbXBsZSByYXRlCisJICBTZWUgaHR0cDovL21hdHJvc2thLm9yZy90ZWNobmljYWwvc3BlY3MvY29kZWNpZC9pbmRleC5odG1sCisJICBUaGUgc3BlYyBpcyBzaWxlbnQgYWJvdXQgdGhpcyB0aG91Z2guLi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTg1NDYKKworMjAxMS0wOS0wNyAxNDoxMzowMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGVuc3VyZSBzb21lIGluaXRpYWwgc3RhdGUgdmFyaWFibGUgc2V0dXAKKwkgIC4uLiB3aGljaCBtaWdodCBvdGhlcndpc2UgYmUgc2tpcHBlZCBpZiB0aGUgUExBWSBjb21tYW5kIGlzIGlzc3VlZCBiZWZvcmUKKwkgIHRoZSBPUEVOIGNvbW1hbmQgaGFkIGEgY2hhbmNlIHRvIGFjdHVhbGx5IGJlIGFjdGVkIHVwb24uCisJICBGaXhlcyAjNjU3Mzc2LgorCisyMDExLTA5LTA4IDE1OjAyOjA1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiB0d2VhayBnYXAgaGFuZGxpbmcKKwkgIC4uLiBzbyBhcyB0byBhdm9pZCBidWZmZXJzIGJlZm9yZSBhbmQgYWZ0ZXIgZ2FwIHRvIGhhdmUgaWRlbnRpY2FsIHJ1bm5pbmcgdGltZS4KKworMjAxMS0wOS0wOCAxMzoyODoyNCArMDIwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IHVzZSBHU1RfUkVTT1VSQ0VfRVJST1JfQlVTWSBpZiB2NGwyX2lvY3RsIGZhaWxzIHdpdGggRUJVU1kKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTg1NDMKKworMjAxMS0wOS0wNyAwODo1NDoxNyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiByZW1vdmUgb25lIEdfVU5MSUtFTFkgZm9yIHVzZXIgcHJvcGVydHkKKwkgIFVzaW5nIEdfVU5MSUtFTFkgb24gdXNlciBwcm9wZXJ0aWVzIGlzbid0IG5pY2UsIHNwZWNpYWxseSB3aGVuCisJICB0aGF0IGlzIHRoZSBkZWZhdWx0IG9wdGlvbi4KKworMjAxMS0wMy0xNSAxMTowMzo1MyArMDEwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDxhbW9yYWxlc0BmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJICBtYXRyb3NrYW11eDogaGFuZGxlIEdzdEZvcmNlS2V5VW5pdCBldmVudAorCSAgLi4uIGJ5IHN0YXJ0aW5nIGEgbmV3IGNsdXN0ZXIgYWZ0ZXIgZm9yd2FyZGluZyBldmVudC4KKwkgIEZpeGVzICM2NDQxNTQuCisKKzIwMTEtMDktMDcgMTQ6Mjc6MzYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZGVjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZW5jLmM6CisJICBjbW1sOiBVc2UgY29tcGxldGUgY21tbCBjYXBzIGluIHRoZSB1bml0IHRlc3QKKworMjAxMS0wOS0wNyAxNDoyNjowMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6CisJICBxdG11eDogVXNlIGNvbXBsZXRlIE1QRUcgY2FwcyBpbiB0aGUgdW5pdCB0ZXN0CisKKzIwMTEtMDktMDcgMTQ6MTg6NTggKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgIGRvY3M6IGNsZWFudXAgbWFrZWZpbGVzCisJICBSZW1vdmUgY29tbWVudGVkIG91dCBwYXJ0cyB0aGF0IHdlIGRvbid0IG5lZWQuIFJlbW92ZSAidGhlIHdpbmdvIGFkZGl0aW9uIiAtIG5vCisJICBzbyB1c2VmdWwgYWZ0ZXIgYWxsLiBOYXJyb3cgZG93biBmaWxlLWdsb2JzIGZvciBwbHVnaW4gZG9jcy4KKworMjAxMS0wOC0yOSAxNDoxMjoyMiArMDIwMCAgS29uc3RhbnRpbiBNaWxsZXIgPGtvbnN0YW50aW4ubWlsbGVyQGdtYWlsLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBEb24ndCBoYW5kbGUgSFRUUCByZXNwb25zZSA0MDcgYXMgZXJyb3IgaWYgcHJveHkgYXV0aGVudGljYXRpb24gZGF0YSBpcyBhdmFpbGFibGUKKwkgIEZpeGVzIGJ1ZyAjNjU3NDIyLgorCisyMDExLTA5LTA3IDEyOjExOjM5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IEFkZCBDb252ZXJ0ZXIgdG8gdGhlIGNsYXNzaWZpY2F0aW9uIGJlY2F1c2UgaXQgY2FuIGNvbnZlcnQgYmV0d2VlbiBkaWZmZXJlbnQgYWxpZ25tZW50cworCSAgVGhpcyBhbGxvd3MgZGVjb2RlYmluMiB0byBsZXQgaXQgbmVnb3RpYXRlIHByb3Blcmx5LgorCisyMDExLTA5LTA3IDEyOjEwOjQ4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2VyczogSW1wcm92ZSBzcmMgdGVtcGxhdGUgY2FwcworCSAgUmVtb3ZlIHRoZSBwYXJzZWQvZnJhbWVkIGZpZWxkcyBhbmQgYWRkIGFsbCBmaWVsZHMgdG8gdGhlIHRlbXBsYXRlCisJICBjYXBzIHRoYXQgYWx3YXlzIGV4aXN0LgorCisyMDExLTA5LTA2IDE1OjU5OjQ5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5oOgorCSAgYWFjcGFyc2U6IHBhcnNlIGNvZGVjX2RhdGEgdG8gZGV0ZXJtaW5lIG51bWJlciBvZiBzYW1wbGVzIHBlciBmcmFtZQorCSAgRml4ZXMgIzY1NjczNC4KKworMjAxMS0wOS0wNiAyMToyNDo0NiArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGEzOWViODMgdG8gMTFmMGNkNQorCisyMDExLTA5LTA2IDE2OjU3OjEyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IHRyeSB0byBkaXNhYmxlIGRlaW50ZXJsYWNlLi4KKworMjAxMS0wOS0wNiAxNTo0MDozMiArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDYwNWNkOWEgdG8gYTM5ZWI4MworCisyMDExLTA5LTA2IDE2OjM3OjAzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBjb21tb24KKworMjAxMS0wOS0wNiAxNjowNjoyNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jCisJICBnc3QvaXNvbXA0L3F0ZGVtdXguYworCisyMDExLTA5LTA2IDE1OjQwOjMyICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNjA1Y2Q5YSB0byBhMzllYjgzCisKKzIwMTEtMDktMDYgMTU6MDU6MzcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJICBtYXRyb3NrYW11eDogbWFrZSBkZWZhdWx0IGR1cmF0aW9uIGNoZWNrIGxlc3Mgc2Vuc2l0aXZlCisJICBGcmFtZSBkdXJhdGlvbiBtaWdodCB2YXJ5IGZvciAxIHVzZWNvbmQsIGluIHRoaXMgY2FzZSBtYXRyb3NrYW11eAorCSAgZGVjaWRlcyB0byBjcmVhdGUgQkxPQ0tHUk9VUCBpbnN0ZWFkIG9mIFNJTVBMRUJMT0NLLgorCSAgQ29udmVydCBkdXJhdGlvbiB0byB0aW1lY29kZXNjYWxlIHdoaWNoIGlzICh0eXBpY2FsbHkpIGxlc3MgcHJlY2lzZSwgYW5kCisJICB0aGVuIGFsc28gYWxsb3cgdGhlIGRpZmZlcmVuY2Ugb2YgMS8tMSB0byBhcnJhbmdlIGZvciBsZXNzIHNlbnNpdGl2ZSBjaGVjay4KKwkgIEJhc2VkIG9uIHBhdGNoIGJ5IEFsZXhleSBGaXNoZXIgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKwkgIEZpeGVzICM2NTMwODAuCisKKzIwMTEtMDktMDYgMTM6MTg6NDAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSAgcnRwbXA0Z2RlcGF5OiBpbXByb3ZlIGJvZ3VzIGludGVybGVhdmVkIGluZGV4IGNvbXBlbnNhdGluZworCSAgUGF0Y2ggYnkgPGd1ZGFrZUBnbWFpbC5jb20+CisJICBGaXhlcyAjNjU0NTg1LgorCisyMDExLTA5LTA2IDEzOjE2OjI3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvamFjay9nc3RqYWNrLmg6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuaDoKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9sYXcvYWxhdy5jOgorCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXcuYzoKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICAtZ29vZDogcG9ydCB0byBuZXcgYXVkaW8gY2FwcworCisyMDExLTA5LTA2IDEwOjMzOjIxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBBbGxvdyBwb3NpdGl2ZSwgbm9uLTEuMCBzZWdtZW50IHJhdGVzCisJICBPbmx5IG5lZ2F0aXZlIHJhdGVzIGFyZSBub3Qgc3VwcG9ydGVkLiBGaXhlcyBidWcgIzY1ODMwNS4KKworMjAxMS0wOS0wNSAxNTo1MDo1NiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3BhcnNlci5jOgorCSAgdGVzdHM6IHBhcnNlcnM6IHByb3ZpZGUgbW9yZSByZWFsIGRhdGEgd2hlbiB0ZXN0aW5nIGRyYWluaW5nIG9mIGdhcmJhZ2UKKworMjAxMS0wOS0wNSAxNTo1MDowNCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkgIGFtcnBhcnNlOiBmaXggYW5kIHN0cmVhbWxpbmUgdmFsaWQgZnJhbWUgY2hlY2tpbmcKKwkgIC4uLiB0byBoYW5kbGUgdmFyaW91cyBjb21iaW5hdGlvbnMgb2Ygc3luYyBvciBub3QsIGFuZCBzdWZmaWNpZW50IGRhdGEKKwkgIG9yIG5vdCBhcyBtaWdodCBiZSBleHBlY3RlZC4KKwkgIEZpeGVzICM2NTA3MTQuCisKKzIwMTEtMDktMDUgMTQ6NDk6MzIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZyYWdtZW50ZWQgc3VwcG9ydDsgYXZvaWQgYWRqdXN0bWVudCBmb3Iga2V5ZnJhbWUgc2VlaworCSAgLi4uIHNpbmNlIGFsbCBpbmRleCBkYXRhIG1heSBub3QgeWV0IGJlIGF2YWlsYWJsZSBhdCB0aGF0IHRpbWUuCisKKzIwMTEtMDktMDUgMTQ6NDg6MDIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZyYWdtZW50ZWQgc3VwcG9ydDsgbWFyayBhbGwgYXVkaW8gdHJhY2sgc2FtcGxlcyBhcyBrZXlmcmFtZQorCisyMDExLTA5LTA1IDE0OjQ2OjI5ICswMjAwICBCcmlhbiBMaSA8YnJpYW43MDAzQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmcmFnbWVudGVkIHN1cHBvcnQ7IHByb3Blcmx5IGluaXQgcmV0dXJuIHZhcmlhYmxlIHZhbHVlCisJICBGaXhlcyAjNjU1OTE4LgorCisyMDExLTA5LTA1IDEzOjMxOjIwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYWRkIGd0ay1kb2MgZm9yIG5ldyBzaG9ydC1oZWFkZXIgcHJvcGVydHkKKworMjAxMS0wOS0wNSAxMzoxODozOSArMDIwMCAgTWFyYyBMZWVtYW4gPG1hcmMubGVlbWFuQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogYWxsb3cgc2VuZGluZyBzaG9ydCBSVFNQIHJlcXVlc3RzIHRvIGEgc2VydmVyCisJICBTb21lIGVuY29kZXJzIChBcmVjb250KSBkbyBub3QgbGlrZSB0aGUgbG9uZyBPUFRJT05TIHNlbnQgYXQgc3RhcnR1cCBhcyBzZW50IGJ5CisJICBHU3RyZWFtZXIsIGJ1dCBkbyBhY2NlcHQgdGhlIHNob3J0IGhlYWRlciBhcyBzZW50IGJ5IExpdmU1NTUuCisJICBUaGlzIHBhdGNoIG1ha2VzIHRoZSBleHRlbmRpbmcgdGhlIHJlcXVlc3Qgb3B0aW9uYWwgYnkgYWRkaW5nIGEgcHJvcGVydHkKKwkgIChzaG9ydC1oZWFkZXIpLgorCSAgRml4ZXMgIzY1NTgwNS4KKwkgIEFQSTogR3N0UlRTUFNyYzpzaG9ydC1oZWFkZXIKKworMjAwOS0wMy0wNCAxNDo1MTowOSAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJICBydHBoMjYzcHBheTogU2V0IEgyNjMtMjAwMCBpZiB0aGF0cyB3aGF0IHRoZSBvdGhlciBzaWRlIHdhbnRzCisJICBUaGUgc3RhdGljIGNhcHMgc3RhdGVzIHRoaXMgZWxlbWVudCBzdXBwb3J0cyBIMjYzLTIwMDAsIGJ1dCBzZXRjYXBzIG5ldmVyCisJICBzZXRzIGl0LCBzbyBpdCB3YXMgbGllLgorCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD01Nzc3ODQKKworMjAxMS0wOC0zMCAxOTowMjo1MSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogSW5pdGlhbGlzZSB0aGUgbGFzdF9rZXlmcmFtZV9yZXF1ZXN0IHZhcmlhYmxlCisKKzIwMTEtMDgtMzEgMTY6MDQ6MjQgKzAyMDAgIFBldGVyIEtvcnNnYWFyZCA8amFjbWV0QHN1bnNpdGUuZGs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICBtdWx0aXVkcHNpbms6IG1ha2UgYWRkL3JlbW92ZS9jbGVhci9nZXQtc3RhdHMgYWN0aW9uIHNpZ25hbHMKKwkgIGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1NzgzMAorCSAgU2lnbmVkLW9mZi1ieTogUGV0ZXIgS29yc2dhYXJkIDxqYWNtZXRAc3Vuc2l0ZS5kaz4KKworMjAxMS0wOC0zMSAxODo0NToxNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydHBheS5jOgorCSAgbXAydDogZml4IGVuY29kaW5nIG5hbWUgYWNjb3JkaW5nIHRvIFJGQzM1NTEKKworMjAxMS0wOC0zMCAxMzozMzo0OSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4Lmg6CisJICBxdGRlbXV4OiBwdXNoIG1vZGU7IHBlcmZvcm0gc29tZSBleHRyYSBjaGVja3MgcHJpb3IgdG8gdXBzdHJlYW0gc2Vla2luZworCisyMDExLTA4LTMwIDEzOjI4OjIxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwdXNoIG1vZGU7IGZpeCBidWZmZXJlZCBzdHJlYW1pbmcKKwkgIFRoYXQgaXMsIGluIGNhc2Ugd2hlcmUgbm8gc2VlayBpcyBwZWZvcm1lZCB0byBtb292LCBidXQgcHJlY2VkaW5nCisJICBsaW1pdGVkIG1kYXQgaXMgYnVmZmVyZWQuCisKKzIwMTEtMDgtMzAgMTQ6MDY6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5oOgorCSAgc2hhcGV3aXBlOiBwb3J0IHRvIDAuMTEKKworMjAxMS0wOC0zMCAxMjo0OTowOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgbGF3IGlzIHBvcnRlZCBub3cKKworMjAxMS0wOC0zMCAxMjoyNTozNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2xhdy9hbGF3LmM6CisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXcuYzoKKwkgIGxhdzogcG9ydCB0byAwLjExCisKKzIwMTEtMDgtMjkgMTk6MTE6MjUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzoKKwkgIGFsYXc6IHBvcnQgdG8gMC4xMQorCisyMDExLTA4LTI5IDE5OjEwOjM1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJICBnb29tOiBmaXggY29tbWVudAorCisyMDExLTA4LTI5IDE4OjAyOjE1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNpbmsuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwOiBwb3J0IHNvdXAgZWxlbWVudHMgdG8gMC4xMQorCisyMDExLTA4LTI5IDE1OjEzOjU2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhdm9pZCBvdmVyZmxvdyB3cmFwYXJvdW5kIGluIHRpbWVzdGFtcCB3aGVuIGFkZGluZyBkdXJhdGlvbnMKKwkgIERvIHNvbWUgdHlwZSBqdWdnbGluZyB0byBhdm9pZCBvdmVyZmxvdywgd2hpbGUgc3RpbGwgYWxsb3dpbmcgZm9yICduZWdhdGl2ZScKKwkgIGR1cmF0aW9ucyAod2hpY2ggd291bGQgbmVlZCBhIHdyYXBhcm91bmQgZWZmZWN0KS4KKworMjAxMS0wOC0yOSAxMzo0Mzo1OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jCisKKzIwMTEtMDgtMjYgMTQ6MjA6NDkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBhbGxvY2F0aW9uOiBmaXggZm9yIHZtZXRob2QgY2hhbmdlcworCisyMDExLTA4LTI1IDIzOjM3OjQ3ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSAgdjRsMnNyYzogbWFrZSB0aGlzIHdvcmsgbW9yZSB0aGFuIG9uY2UgaW4gYSByb3cKKwkgIFdlIHVzZWQgdG8gc2tpcCBmcmFtZSByYXRlIHNldHVwIGlmIHRoZSBjYW1lcmEgd2FzIGFscmVhZHkgc2V0dXAKKwkgIHdpdGggdGhlIHJlcXVlc3RlZCBmcmFtZSByYXRlLiBUaGlzIGJyZWFrcyBzb21lIGNhbWVyYXMgdGhvdWdoLAorCSAgY2F1c2luZyB0aGVtIHRvIG5vdCBvdXRwdXQgZGF0YSAoc2V2ZXJhbCBtb2RlbHMgb2YgVGhpbmtwYWQgY2FtZXJhcworCSAgaGF2ZSB0aGlzIHByb2JsZW0gYXQgbGVhc3QpLgorCSAgU28sIGRvbid0IHNraXAuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjM4MzAwCisKKzIwMTEtMDgtMjUgMTY6NDE6MjMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHBvcnQgdG8gbmV3IHZpZGVvIGZsYWdzCisKKzIwMTEtMDgtMjQgMTg6NDA6MDcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkgIHB1bHNlOiBhZGQgc29tZSBtb3JlIGNoYW5uZWxzCisKKzIwMTEtMDctMTIgMjE6NDg6MzcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIGR0bWY6IEFkZCBtb3JlIGRlYnVnCisKKzIwMTEtMDctMTIgMTk6MDk6MDIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZjb21tb24uaDoKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIGR0bWY6IE1heCBldmVudCB0eXBlIGlzIDE1CisKKzIwMTEtMDQtMTQgMTU6NDY6MDggLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5oOgorCSAgZHRtZnNyYzogQWxpZ24gRFRNRiBzb3VuZCBidWZmZXJzIHdpdGggbGFzdC1zdG9wIGZyb20gZXZlbnQKKwkgIEFsc28gbWFrZSBzdXJlIHRoZSB0aW1lc3RhbXBzIG5ldmVyIGdvIGJhY2t3YXJkcworCisyMDExLTA3LTExIDIxOjMxOjA3IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBydHBkdG1mc3JjOiBDb3JyZWN0bHkgcmVjb2duaXplIHRoZSBlbmQgb2YgYSBidWZmZXIKKworMjAxMS0wNy0xMSAyMDo0NzoyMyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgcnRwZHRtZnNyYzogTWFrZSBzdXJlIHJ0cGR0bWZzcmMgdGltZXN0YW1wcyBkb24ndCBvdmVybGFwCisKKzIwMTEtMDctMTEgMjA6NDY6MjAgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIHJ0cGR0bWZzcmM6IFB1dCB0aGUgaW50ZXIgZGlnaXQgaW50ZXJ2YWwgYXQgdGhlIGVuZCwgbm90IGF0IHRoZSBzdGFydAorCSAgVGhlIHJlYXNvbiBpcyB0byBsZXQgcnRwZHRtZm11eCBkcm9wIGJ1ZmZlcnMgZHVyaW5nIHRoZSBpbnRlciBkaWdpdCBpbnRlcnZhbCwKKwkgIHRoaXMgd2F5LCB0aGVyZSB3aWxsIGJlIG1vcmUgc2lsZW5jZSBhcm91bmQgdGhlIERUTUYgdG9uZXMgc28gSVZGcyB3aWxsIGhhdmUKKwkgIGEgYmV0dGVyIGNoYW5jZSByZWNvZ25pemluZyB0aGVtLgorCisyMDExLTA0LTE0IDE3OjA4OjU3IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuaDoKKwkgIHJ0cGR0bWZzcmM6IFN0YXJ0IGF0IHRoZSBsYXN0X3N0b3AgZnJvbSB0aGUgc3RhcnQgZXZlbnQgaWYgdGhlcmUgd2FzIG9uZQorCSAgVGhlIGdvYWwgaXMgdG8gdHJ5IHRvIG5vdCBoYXZlIGEgR0FQIGJldHdlZW4gdGhlIGF1ZGlvIGFuZCB0aGUgRFRNRgorCisyMDExLTA0LTE0IDE2OjQ5OjM5IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuaDoKKwkgIHJ0cGR0bWZzcmM6IFJlc3BlY3QgcHRpbWUgZnJvbSB0aGUgY2FwcworCSAgUmVzcGVjdCB0aGUgcHRpbWUgZnJvbSB0aGUgY2FwcyBmb3IgdGhlIERUTUYgcGFja2V0cworCisyMDExLTA3LTExIDIxOjMwOjI4IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBydHBkdG1mc3JjOiBKdXN0IGVycm9yIG91dCBpZiB0aGVyZSBpcyBubyBjbG9jaworCisyMDExLTA4LTI0IDE0OjE2OjQ0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisKKzIwMTEtMDgtMjMgMTI6MTI6MTUgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogb25seSByZXF1aXJlIHR3byBmcmFtZXMgaW4gYSByb3cgd2hlbiB3ZSBkbyBub3QgaGF2ZSBzeW5jCisJICBUaGlzIGF2b2lkcyBhIHNpbmdsZSBiaXQgZXJyb3IgZHJvcHBpbmcgdHdvIGZyYW1lcyB1bm5lY2Vzc2FyaWx5LgorCSAgVGhlIHR3byBjb25zZWN1dGl2ZSBmcmFtZXMgY2hlY2sgaXMgc3RpbGwgcmVxdWlyZWQgd2hlbiB3ZSBkb24ndAorCSAgaGF2ZSBzeW5jLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1NzA4MAorCisyMDExLTA4LTIzIDIxOjQxOjE1ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBUcml2aWFsIGluZGVudGF0aW9uIGZpeAorCisyMDExLTA4LTIzIDE5OjA5OjMxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkgIHZpZGVvOiBwb3J0IHRvIG5ldyBjb2xvcmltZXRyeSBpbmZvCisKKzIwMTEtMDctMjEgMTc6MjM6MjggLTA0MDAgIE1vbnR5IE1vbnRnb21lcnkgPGNtb250Z29tQHJlZGhhdC5jb20+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGZsYWNkZWM6IENvcnJlY3Qgc2FtcGxlIG51bWJlciByb3VuZGluZyByZXN1bHRpbmcgaW4gdGltZXN0YW1wIGppdHRlcgorCSAgZmxhY2RlYyBjb252ZXJ0cyB0aGUgc3JjIHRpbWVzdGFtcCB0byBhIHNhbXBsZSBudW1iZXIsIHVzZXMgdGhhdCBpbnRlcm5hbGx5LCB0aGVuIHJlY29udmVydHMgdGhlIHNhbXBsZSBudW1iZXIgdG8gYSB0aW1lc3RhbXAgZm9yIHRoZSBvdXRwdXQgYnVmZmVyLiAgVW5mb3J0dW5hdGVseSwgc2FtcGxlIG51bWJlcnMgY2FuJ3QgYmUgcmVwcmVzZW50ZWQgaW4gYW4gaW50ZWdlciBudW1iZXIgb2YgbmFub3NlY29uZHMsIGFuZCB0aGUgY29udmVyc2lvbiBwcm9jZXNzIHdhcyB0cnVuY2F0aW5nIHJhdGhlciB0aGFuIHJvdW5kaW5nLCByZXN1bHRpbmcgaW4gc2FtcGxlIG51bWJlcnMgYW5kIG91dHB1dCB0aW1lc3RhbXBzIHRoYXQgd2VyZSBvZnRlbiBvZmYgYnkgYSBmdWxsIHNhbXBsZS4KKwkgIFRoaXMgY29ycmVjdHMgdGhlIHRpbWUtPnNhbXBsZSBjb252ZXNpb24KKworMjAxMS0wOC0yMiAxMzoxMDowNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDExLTA4LTIyIDEyOjI0OjE1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuYzoKKwkgIGZvdXJjYzogcmVtb3ZlIGZvdXJjYyBmcm9tIGNhcHMKKworMjAxMS0wOC0yMCAxNDo0ODoyMCAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL2JyZWFrbXlkYXRhLmM6CisJICBicmVha215ZGF0YTogZWxlbWVudCBpcyBub3QgcGFzc3Rocm91Z2gKKworMjAxMS0wNy0xMyAxMToyMDozNCAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJICBtdWx0aWZpbGVzcmM6IHF1aWV0IGRlYnVnZ2luZworCisyMDExLTA3LTEwIDIxOjQwOjIwIC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuaDoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlbWV0aG9kLmg6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHloLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2xpbmVhcmJsZW5kLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3NjYWxlcmJvYi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwuaW5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS92ZmlyLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlYmZmLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZldGZmLmM6CisJICBkZWludGVybGFjZTogY2hhbmdlIGZpZWxkIGhhbmRsaW5nIHRocm91Z2ggbWV0aG9kcworCSAgVGhpcyBsaWtlbHkgYnJlYWtzIHN0dWZmLiAgVGhlIGdvb2Q6IGFsbCBvZiB0aGUgbWV0aG9kcyBub3cgY3JlYXRlCisJICBmaWVsZCBpbWFnZXMgYWxpZ25lZCB3aXRoIGlucHV0IGZyYW1lcywgd2l0aG91dCB0aW1lc3RhbXAgbWFuZ2xpbmcuCisJICBUaGUgYmFkOiB0aGlzIHRvdWNoZXMgYSBsb3Qgb2YgY29kZSwgbXVjaCBvZiB3aGljaCBpcyBoYWlyeSBhbmQgaW4KKwkgIG5lZWQgb2YgY2xlYW51cC4gIEhvd2V2ZXIsIGF0IHRoaXMgcG9pbnQgd2UgY2FuIHJlYXNvbmFibHkgY3JlYXRlIGEKKwkgIFBTTlItYmFzZWQgdGVzdC4KKworMjAxMS0wOC0yMSAxNDo0MToxNCArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZEBnbWFpbC5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgbXVsdGlmaWxlc2luazogcmVzZXQgLT5zdHJlYW1oZWFkZXJzIHRvIE5VTEwgb24gX3N0b3AKKwkgIEZpeGVzIGludmFsaWQgbWVtb3J5IGFjY2VzcyByZXVzaW5nIG11bHRpZmlsZXNpbmsKKworMjAxMS0wOC0yMCAxMDo0NjoxOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzoKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmg6CisJICBjdXR0ZXI6IGJyaW5nIGN1dHRlciBzb21ld2hhdCBpbnRvIHRoaXMgbWlsbGVubml1bQorCisyMDExLTA4LTE5IDE2OjI3OjIwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJICByZzogZml4IGNhcHMKKworMjAxMS0wOC0xOSAxNjoxMzoyMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBwb3J0IGFmdGVyIG1lcmdlCisKKzIwMTEtMDgtMTkgMTY6MTI6MDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0wOC0xOSAxNjowOTo0OCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaWlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2ludmVydC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9rYXJhb2tlLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jYmFuZC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2xpbWl0LmM6CisJKiBnc3QvYXVwYXJzZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJKiBnc3QvbGV2ZWwvTWFrZWZpbGUuYW06CisJKiBnc3QvcmVwbGF5Z2Fpbi9NYWtlZmlsZS5hbToKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJnYW5hbHlzaXMuYzoKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJnbGltaXRlci5jOgorCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYzoKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgcG9ydCB0byBtb3JlIGF1ZGlvIGFwaSBjaGFuZ2VzCisKKzIwMTEtMDgtMTkgMTQ6MDE6NDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5oOgorCSogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5oOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkqIHN5cy9vc3MvZ3N0b3NzaGVscGVyLmM6CisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzoKKwkqIHN5cy9vc3MvZ3N0b3Nzc3JjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2ludmVydC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL2xldmVsL2xldmVsLWV4YW1wbGUuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL3NwZWN0cnVtLWV4YW1wbGUuYzoKKwkgIHBvcnQgbW9yZSBlbGVtZW50cyB0byBuZXcgYXVkaW8gY2FwcyBhbmQgQVBJCisKKzIwMTEtMDgtMTkgMTE6NDk6NDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5Lmg6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2ZpcmZpbHRlci5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlaWlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9paXJmaWx0ZXIuaDoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2thcmFva2UuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNiYW5kLmg6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYzoKKwkgIHBvcnQgdG8gbmV3IGF1ZGlvIEFQSSBhbmQgY2FwcworCisyMDExLTA4LTE4IDEzOjM3OjM5ICswMjAwICBEYXZpZCBIZW5uaW5nc3NvbiA8ZGF2aWQuaGVubmluZ3Nzb25AY2Fub25pY2FsLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBBbGxvdyB3cml0ZXMgaW4gYmlnZ2VyIGNodW5rcworCSAgVGhlcmUncyBubyB1c2UgaW4gc3BsaXR0aW5nIHRoZSBpbmNvbWluZyBkYXRhIGRvd24gdG8gdGhlIHNlZ3NpemUKKwkgIGxpbWl0IC0gYnkgd3JpdGluZyBhcyBtdWNoIGFzIHBvc3NpYmxlIGluIG9uZSBjaHVuaywgd2UgaW5jcmVhc2UKKwkgIHBlcmZvcm1hbmNlIGFuZCBhdm9pZCBQdWxzZUF1ZGlvIHVubmVjZXNzYXJ5IHJld2luZHMuCisJICBTaWduZWQtb2ZmLWJ5OiBEYXZpZCBIZW5uaW5nc3NvbiA8ZGF2aWQuaGVubmluZ3Nzb25AY2Fub25pY2FsLmNvbT4KKworMjAxMS0wOC0xOCAxOTozNzozOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDExLTA4LTE4IDE5OjIxOjA3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvamFjay9nc3RqYWNrLmg6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJICBwb3J0IHRvIG5ldyBhdWRpbyBjYXBzLgorCisyMDExLTA4LTA4IDIyOjE0OjI4ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBlbnN1cmUgbm8tbW9yZS1wYWRzIGlzIGFsd2F5cyBlbWl0dGVkCisJICBJbiBwYXJ0aWN1bGFyLCBkbyBzbyBldmVuIGlmIGZhaWxpbmcgdG8gcmVhZCB3aGlsZSBwcmVyb2xsaW5nLAorCSAgc3VjaCBhcyB3aGVuIHJlYWRpbmcgZnJvbSBhIHBhcnRpYWwgZmlsZSAoZWcsIHdoaWxlIGl0IGlzIGJlaW5nCisJICBkb3dubG9hZGVkKS4KKwkgIFRoaXMgZml4ZXMgYSB3ZWRnZSBpbiBwbGF5YmluMi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTE5NjUKKworMjAxMS0wOC0xNyAxNzo1NzoxMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogaW1wcm92ZSBmaXhhdGUgZnVuY3Rpb24KKwkgIFVzZSBuZXcgY29yZSBmdW5jdGlvbiB0byBmaXhhdGUgYSBmaWVsZC4KKwkgIENoYWluIHVwIHRvIHBhcmVudCBmaXhhdGUgZnVuY3Rpb24uCisKKzIwMTEtMDgtMTcgMTU6NTI6MTggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIGV4dC9mbGFjL2dzdGZsYWNkZWMuYworCisyMDExLTA4LTE3IDE1OjM5OjI3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvanBlZy9NYWtlZmlsZS5hbToKKwkqIGV4dC9qcGVnL2dzdGpwZWcuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuaDoKKwkgIGpwZWc6IHBvcnQgdG8gMC4xMQorCSAgQWxzbyBkaXNhYmxlIHNtb2tlIGZvciBub3cuCisKKzIwMTEtMDgtMTYgMTc6Mjc6MTMgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBmbGFjZGVjOiBhdm9pZCB0aW1lc3RhbXAvb2Zmc2V0IHRyYWNraW5nIGdvaW5nIG91dCBvZiBzeW5jCisJICBUaGUgbGliRkxBQyBBUEkgaXMgY2FsbGJhY2sgYmFzZWQsIGFuZCB3ZSBtdXN0IG9ubHkgY2FsbCBpdCB0bworCSAgb3V0cHV0IGRhdGEgd2hlbiB3ZSBrbm93IHdlIGhhdmUgZW5vdWdoIGlucHV0IGRhdGEuIEZvciB0aGlzCisJICByZWFzb24sIGEgc2luZ2xlIHByb2Nlc3Npbmcgc3RlcCBpcyBkb25lIHdoZW4gcmVjZWl2aW5nIGEgYnVmZmVyLgorCSAgSG93ZXZlciwgaWYgdGhlcmUgd2VyZSBtZXRhZGF0YSBidWZmZXJzIHN0aWxsIHBlbmRpbmcsIGEgc3RlcAorCSAgaW50ZW5kZWQgZm9yIHRoZSBmaXJzdCBhdWRpbyBmcmFtZSBtaWdodCBlbmQgdXAgd3JpdGluZyB0aGF0CisJICBsZWZ0b3ZlciBtZXRhZGF0YS4gU2luY2UgYSBzaW5nbGUgc3RlcCBpcyBkb25lIHBlciBidWZmZXIsIHRoaXMKKwkgIHdpbGwgY2F1c2UgZXZlcnkgYnVmZmVyIHRvIGJlIHdyaXR0ZW4gb25lIHN0ZXAgbGF0ZS4KKwkgIFRoaXMgd291bGQgYWRkIHNvbWUgbGF0ZW5jeSAoYSBidWZmZXJmdWxsJ3Mgd29ydGgpLCBwb3NzaWJseQorCSAgbG9zZSBhIGJ1ZmZlciB3aGVuIHNlZWtpbmcgb3IgdGhlIGxpa2UsIGFuZCBhbHNvIGNhdXNlIHRpbWVzdGFtcAorCSAgYW5kIG9mZnNldCB0byBiZSBhcHBsaWVkIHRvIHRoZSB3cm9uZyBidWZmZXIsIGFzIHVwZGF0ZXMgdG8KKwkgIHRoZSAiY3VycmVudCIgc2VnbWVudCBsYXN0X3N0b3AgKGZyb20gaW5jb21pbmcgYnVmZmVyIHRpbWVzdGFtcCkKKwkgIHdpbGwgYmUgYXBwbGllZCB0byBhbiBvdXRwdXQgYnVmZmVyIG9yaWdpbmF0aW5nIGZyb20gdGhlIHByZXZpb3VzCisJICBpbmNvbWluZyBidWZmZXIuCisJICBUaGlzIGZpeGVzIHRoZSBpc3N1ZSBieSBlbnN1cmluZyB0aGF0LCB1cG9uIHJlY2VpdmluZyB0aGUgZmlyc3QKKwkgIGF1ZGlvIGZyYW1lLCBwcm9jZXNzaW5nIGlzIGRvbmUgdGlsbCBhbGwgbWV0YWRhdGEgaXMgcHJvY2Vzc2VkLAorCSAgc28gdGhlIG5leHQgInNpbmdsZSBzdGVwIiBkb25lIHdpbGwgYmUgZm9yIHRoZSBhdWRpbyBmcmFtZS4gQWZ0ZXIKKwkgIHRoaXMsIHdlIHNob3VsZCBrZWVwIHRvIDEgaW5wdXQgYnVmZmVyIC0+IDEgb3V0cHV0IGJ1ZmZlciBhbmQgc28KKwkgIGF2b2lkIGdldHRpbmcgb3V0IG9mIHN5bmMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwOTYwCisKKzIwMTEtMDgtMTcgMTE6MTc6MzggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0wOC0xNiAxNTozMjowNyArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGZsYWNkZWM6IGJhaWwgb24gcmVzZXJ2ZWQgdmFsdWUKKwkgIE5vdyB0aGF0IHdlIGxvb2sgYXQgdGhlIHJpZ2h0IGJpdHMsIHdlIGNhbiB0ZXN0IGFnYWluc3QgdGhlIHJlc2VydmVkCisJICB2YWx1ZSBhcyB3ZSBkbyBmb3Igb3RoZXIgZmllbGRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDk2MAorCisyMDExLTA4LTE2IDE1OjI3OjQzICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogZml4IGJpdCB0d2lkZGxpbmcKKwkgIFJpZ2h0IHNoaWZ0aW5nIGEgOCBiaXQgdmFsdWUgYnkgOCBiaXRzIGlzIHR3aWNlIHRvbyBtdWNoCisJICB0byBnZXQgdGhlIGhpZ2ggNCBiaXRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDk2MAorCisyMDExLTA4LTE2IDE1OjIyOjQ2ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogd2FybiBpZiB3ZSBzZWUgYSB2YXJpYWJsZSBibG9jayBzaXplIHdoZXJlIHVuc3VwcG9ydGVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwOTYwCisKKzIwMTEtMDgtMTYgMTg6MjU6MjkgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgIHNwZWN0cnVtOiBhdm9pZCBjcmFzaGluZyBieSByZXNldHRpbmcgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGNoYW5uZWxzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU2NjA2CisKKzIwMTEtMDgtMTYgMTg6MzU6NTMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYworCisyMDExLTA4LTE2IDEzOjE2OjIyICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogZml4IG9mZiBieSBvbmUgaW4gZnJhbWUgc2l6ZSBjaGVjaworCSAgWWVzLCBJIHdhcyB0cmFja2luZyBhbm90aGVyIGJ1ZyBhbmQgdGhlIHNtYWxsIHRlc3QgZmlsZSBJIGdlbmVyYXRlZAorCSAgdG8gdGVzdCB3aXRoIGltcHJvYmFibHkganVzdCBoYXBwZW5lZCB0byB0cmlnZ2VyIHRoaXMsIHdpdGggYSBzZWNvbmQKKwkgIGFuZCBsYXN0IGZyYW1lIG9mIDE2MTUgYnl0ZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU2NjQ5CisKKzIwMTEtMDgtMTUgMTI6MTk6MTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3BhcnNlci5jOgorCSAgdGVzdHM6IHVwZGF0ZSBmb3IgX25lZ290aWF0ZWRfY2FwcygpIGNoYW5nZQorCisyMDExLTA4LTE0IDIwOjQ2OjAxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lkM2RlbXV4L2lkM3YyLjMuMC5odG1sOgorCSogZ3N0L2lkM2RlbXV4L2lkM3YyLjQuMC1mcmFtZXMudHh0OgorCSogZ3N0L2lkM2RlbXV4L2lkM3YyLjQuMC1zdHJ1Y3R1cmUudHh0OgorCSAgaWQzZGVtdXg6IHJlbW92ZSBzcGVjcyBmcm9tIGdpdCBhcyB3ZWxsIG5vdyB0aGF0IHBhcnNpbmcgY29kZSBpcyBpbiAtYmFzZQorCisyMDExLTA3LTE0IDE1OjQyOjM2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2lkM2RlbXV4L01ha2VmaWxlLmFtOgorCSogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6CisJKiBnc3QvaWQzZGVtdXgvaWQzdGFncy5jOgorCSogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuaDoKKwkqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOgorCSAgaWQzZGVtdXg6IHVzZSAtYmFzZSBwcm92aWRlZCBpZDMgdGFnIHBhcnNpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTQzODgKKworMjAxMS0wOC0xMyAxNjo1MToyMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSAgamFja2F1ZGlvc3JjOiBmaXggZXJyb3IgbWVzc2FnZSBjb2RlCisJICBBbmQgYWxzbyBwb3N0ICdub3QgZm91bmQnIGVycm9yIGlmIGphY2tkIGlzIG5vdCBldmVuIGluc3RhbGxlZC4KKworMjAxMS0wOC0xMiAxNjozMjo1OCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGluaXRpYWxpemUgYml0cmF0ZSB2YXJpYWJsZSBhbmQgcmVzZXQgZm9yIGVhY2ggbG9vcAorCSAgRG9uJ3QgY2hlY2sgZXZlbnR1YWxseSB1bnNldCB2YXJpYWJsZSBhbmQgZG9uJ3QgYWNjaWRlbnRpYWxseSB1c2UgdmFsdWVzIGZyb20gbGFzdAorCSAgY3ljbGUuCisKKzIwMTEtMDgtMTAgMTE6Mjg6MjYgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6CisJICBhYXNpbms6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzCisKKzIwMTEtMDgtMDkgMTE6Mjg6MTcgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBQcm9wZXJseSBlcnJvciBvdXQgaWYgU0RQIGNvbnRhaW5zIG5vIHN0cmVhbXMKKwkgIEFsc28gZml4ZXMgdW5pdGlhbGl6ZWQgdmFyaWFibGUgZXJyb3Igb24gbWFjb3N4LgorCisyMDExLTA4LTA5IDA5OjA1OjMxICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHhpbWFnZXNyYzogY2xlYXIgZmxhZ3Mgb24gYnVmZmVyIHJldXNlCisJICBUaGlzIHdpbGwgZW5zdXJlIGEgbG9naWNhbGx5IG5ldyBidWZmZXIgZG9lcyBub3Qga2VlcCBmbGFncyBmcm9tCisJICBhIHByZXZpb3VzIHVzZSBvZiB0aGF0IGJ1ZmZlciAoZWcsIERJU0NPTlQgd291bGQgYmUgc2V0IG9uIHRoZSBmaXJzdAorCSAgYnVmZmVyLCBhbmQgbWlzdGFrZW5seSBrZXB0IHdoZW4gcmV1c2VkKS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTM3MDkKKworMjAxMS0wOC0wOCAxMDo1NDoyNiArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IHRha2UgY2FyZSBub3QgdG8gY2hhbmdlIHRoZSBjdXJyZW50IGZvcm1hdCB3aGVyZSBhcHByb3ByaWF0ZQorCSAgU29tZSBkcml2ZXJzIGFyZSBidWdneSBhcmUgd2lsbCBjaGFuZ2UgdGhlIGN1cnJlbnQgZm9ybWF0IHdoZW4KKwkgIHByb2Nlc3NpbmcgVklESU9DX1RSWV9GTVQuIFNhdmUgYW5kIHJlc3RvcmUgdGhlIGN1cnJlbnQgZm9ybWF0CisJICB0byBlbnN1cmUgdGhlIGZvcm1hdCBpcyBrZXB0IHVuY2hhbmdlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDkwNjcKKworMjAxMS0wOC0wOCAxNToyNzoxMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTEtMDgtMDggMTU6MjY6MDAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvYWFsaWIvTWFrZWZpbGUuYW06CisJICBhYWxpYjogbWFrZSBzdXJlIC1ER1NUX1VTRV9VTlNUQUJMRV9BUEkgaXMgZGVmaW5lZAorCSAgU28gd2UgZG9uJ3QgZ2V0IHdhcm5pbmdzLgorCisyMDExLTA4LTA4IDE1OjI1OjMxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvb3ZlcmxheS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvb3ZlcmxheS5oOgorCSAgdjRsMjogdXBkYXRlIGZvciBHc3RYT3ZlcmxheSA9PiBHc3RWaWRlb092ZXJsYXkgcmVuYW1lCisKKzIwMTEtMDgtMDcgMTI6MjM6MjYgKzAyMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZC5zaW1vbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICB2NGwyc3JjOiBVc2UgZnJhY3Rpb24gY29tcGFyZSB1dGlsIGZ1bmN0aW9uLgorCSAgVXNlIHRoZSBmcmFjdGlvbiBjb21wYXJlIHV0aWxpdHkgdG8gY29tcGFyZSBmdW5jdGlvbiwgbm90IHRoZQorCSAgaGFuZGNyYWZ0ZWQgb25lLiBUaGUgaGFuZGNyYWZ0ZWQgb25lIGlzIGJ1Z2d5IGFzIGl0IGRvZXNuJ3QgdGFrZSBpbnRvCisJICBhY2NvdW50IHJvdW5kaW5nIGVycm9yLiBGb3IgZXhhbXBsZSBjb21wYXJpbmcgYSBmcmFtZXJhdGUgb2YgMjAvMSBvbiBhCisJICBjYW1lcmEgY29uZmlndXJlZCBhcyAzMC8xIGZwcyB3b3VsZCB5aWVsZCB0cnVlOiAxID09ICgxICogMjApLzMwIGFuZCBub3QKKwkgIHJlLWNvbmZpZ3VyZSB0aGUgY2FtZXJhLiBGaXhlcyAjNjU2MTA0CisKKzIwMTEtMDgtMDcgMTE6MTQ6NTAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmg6CisJICBwdWxzZXNyYzogYXZvaWQgcmFjZSBpbiBzdGFydGluZworCSAgU2luZSB0aGUgYmFzZSBjbGFzcyBub3cgZG9lcyB0aGUgbmVnb3RpYXRpb24gZnJvbSB0aGUgc3RyZWFtaW5nIHRocmVhZCB3ZSBoYXZlCisJICB0byBiZSBjYXJlZnVsIGFuZCBjaGVjayBpZiB0aGUgc3RyZWFtIGlzIHJlYWR5IGJlZm9yZSBjaGFuZ2luZyBpdHMgY29ya2VkIHN0YXRlLgorCisyMDExLTA4LTA1IDEyOjI3OjE4ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBjaGVjazogVXNlIEdTVF9DRkxBR1Mgd2hlbiBidWlsZGluZyB0ZXN0cworCSAgRW5zdXJlcyB3ZSBoYXZlIHRoZSBwcm9wZXIgZGVmaW5lIGZvciB1c2luZyB1bnN0YWJsZSBBUEkKKworMjAxMS0wOC0wNSAwODo1OTo1OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBpc29tcDQ6IGZpeHVwIGFmdGVyIHNtYWxsIGFwaSBjaGFuZ2VzCisJICBQb3J0IHRvIHJlY2VudGx5IGNoYW5nZWQgYXBpIHNvIHRoYXQgaXQgY29tcGlsZXMgYWdhaW4uCisKKzIwMTEtMDgtMDUgMTE6MzI6NDUgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QveTRtL01ha2VmaWxlLmFtOgorCSAgeTRtZW5jOiBOb3cgZGVwZW5kcyBvbiBsaWJnc3R2aWRlbworCisyMDExLTA4LTA0IDE4OjQxOjI5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlOiBtb3JlIGNsZWFudXBzCisKKzIwMTEtMDgtMDQgMTg6MTU6NTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2VzcmM6IHNtYWxsIGNsZWFudXBzCisKKzIwMTEtMDgtMDQgMTY6MzU6NDYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IGNhbGwgc2V0X2NhcHMgbWV0aG9kIG9mIGJhc2VjbGFzcworCSAgQ2FsbCB0aGUgYmFzZWNsYXNzIHNldF9jYXBzIGZ1bmN0aW9uIHRvIG1ha2UgaXQgc2VuZCB0aGUgY2FwcyBldmVudCBhbmQKKwkgIHByb3Blcmx5IHRyaWdnZXIgdGhlIG5lZ290aWF0aW9uIGZ1bmN0aW9ucy4KKworMjAxMS0wOC0wNCAxNjoyNTowNCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogc21hbGwgY2xlYW51cHMKKworMjAxMS0wOC0wNCAxNToyNToyMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSAgZ29vbTogcG9ydCB0byBuZXcgY2FwcworCisyMDExLTA4LTA0IDEzOjUyOjE4ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDJzaW5rOiBTaXplIHZhcmlhYmxlIHNob3VsZCBiZSBhIGd1aW50IGFuZCBub3QgYSBnc2l6ZQorCisyMDExLTA4LTA0IDEyOjUwOjAxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogYWN0aXZhdGUgdGhlIHBvb2wgaW4gZmFsbGJhY2sKKwkgIFdoZW4gbm9ib2R5IGlzIHVzaW5nIG91ciBwb29sLCBhY3RpdmF0ZSBpdCBvdXJzZWx2ZXMuCisJICBBdm9pZCBsZWFraW5nIHRoZSBidWZmZXIgYXJyYXkuCisJICBTZXQgZGVmYXVsdCBwb29sIGNvbmZpZ3VyYXRpb24gd2l0aCBjYXBzLgorCSAgRG9uJ3Qga2VlcCBjdXJyZW50X2NhcHMsIGNvcmUgZG9lcyB0aGF0IGZvciB1cyBub3cuCisKKzIwMTEtMDgtMDMgMjI6NTc6NDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6CisJICBmaXggY29tcGlsYXRpb24KKwkgIGhhbCBlbGVtZW50cyB3ZXJlIHJlbW92ZWQsIHJlbW92ZSB0aGVtIGZyb20gZG9jcyB0b28KKwkgIGNoYW5nZSBleGFtcGxlIGZvciBwYWQtYmxvY2sgQVBJIChhY3R1YWxseSByZW1vdmUgdGhlIHBhZCBibG9jaywgYW4gYXBwbGljYXRpb24KKwkgIHNob3VsZCBub3QgYmUgYm90aGVyZWQgd2l0aCB3b3JraW5nIGFyb3VuZCBidWdzIGluIGVsZW1lbnRzKQorCisyMDExLTA4LTAzIDE4OjM3OjI3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgcG9ydCB0byBuZXcgQVBJCisKKzIwMTEtMDgtMDMgMTg6MjU6MzAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIGV4dC9wdWxzZS9wdWxzZXNpbmsuYworCSAgZXh0L3B1bHNlL3B1bHNlc3JjLmMKKwkgIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYworCSAgZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYworCSAgZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmMKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jCisKKzIwMTEtMDgtMDMgMjI6NTA6MDUgKzEwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS5jOgorCSAgbWF0cm9za2E6IFJlZ2lzdGVyIG5ldyBkZWJ1ZyBjYXRlZ29yeQorCSAgUmVnaXN0ZXIgdGhlIG1hdHJvc2thcmVhZGNvbW1vbiBkZWJ1ZyBjYXRlZ29yeSB3aGVuIHRoZQorCSAgcGx1Z2luIGlzIGxvYWRlZCB0byBhdm9pZCBhc3NlcnRpb24gb3V0cHV0IHdoZW4gZGVidWcgaXMgdHVybmVkIG9uLgorCisyMDExLTA4LTAzIDEzOjM4OjAxICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvaWNsZXMvZ2RrcGl4YnVmc2luay10ZXN0LmM6CisJICB0ZXN0L2lja2xlczogUG9ydCBnZGtwaXhidWZzaW5rIHRlc3QKKworMjAxMS0wOC0wMyAxMzozMzo1OSArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXV0b2RldGVjdC5jOgorCSAgUmV2ZXJ0ICJ0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogRGlzYWJsZSBhdXRvZGV0ZWN0IHRlc3QgdGVtcG9yYXJpbHksIHNvIHRoYXQgdGhlIGJ1aWxkIGJvdHMgdXBkYXRlIC1iYWQgYW5kIHRoZSByYW5rcyBvZiB1bnIuLi4iCisJICBUaGlzIHJldmVydHMgY29tbWl0IDQ3NWFlZDhhZjZkMmE1N2MxZDIxNDkwYzgyNGU3NTRhNmIyMzY3YTkuCisJICBJdCB3b24ndCBjb25zaWRlciBlbGVtZW50cyBmcm9tIGFueXdoZXJlIGVsc2UgYW55bW9yZQorCisyMDExLTA4LTAzIDEzOjEwOjQ2ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9wYXJzZXIuYzoKKwkgIGNoZWNrOiBVcGRhdGUgcGFyc2VyIG1pbmktbGliIHRvIDAuMTEgQVBJCisKKzIwMTEtMDgtMDMgMTM6MDk6MDcgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBwby9QT1RGSUxFUy5pbjoKKwkgIHBvOiB1cGRhdGUgZm9yIG1vZGlmaWVkIHNvdXJjZSBmaWxlIGxvY2F0aW9uCisKKzIwMTEtMDgtMDMgMTM6MDg6NDMgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmUuYWM6IGNhaXJvX2dvYmplY3QgaXNuJ3QgcG9ydGVkIGVpdGhlcgorCisyMDExLTA4LTAzIDEwOjU5OjU2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L2hhbC9NYWtlZmlsZS5hbToKKwkqIGV4dC9oYWwvZ3N0aGFsYXVkaW9zaW5rLmM6CisJKiBleHQvaGFsL2dzdGhhbGF1ZGlvc2luay5oOgorCSogZXh0L2hhbC9nc3RoYWxhdWRpb3NyYy5jOgorCSogZXh0L2hhbC9nc3RoYWxhdWRpb3NyYy5oOgorCSogZXh0L2hhbC9nc3RoYWxlbGVtZW50cy5jOgorCSogZXh0L2hhbC9nc3RoYWxlbGVtZW50cy5oOgorCSogZXh0L2hhbC9oYWwuYzoKKwkqIGV4dC9oYWwvaGFsLmg6CisJICBoYWw6IFJlbW92ZSBoYWwgcGx1Z2luCisJICBoYWwgaXMgbm90IGRldmVsb3BlZCBhbnltb3JlIGFuZCBub2JvZHkgaXMgdXNpbmcgdGhlIHBsdWdpbiBub3dhZGF5cy4KKworMjAxMS0wNy0yOSAxMzowMzo1NSArMDIwMCAgUGhpbGlwcGUgTm9ybWFuZCA8cG5vcm1hbmRAaWdhbGlhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBzb2Z0ZW4gYXNzZXJ0aW9uIGNoZWNrIG9uIHN0cmVhbSBzaXplCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU1NTcwCisKKzIwMTEtMDgtMDMgMTA6MDk6NDIgKzAyMDAgIFJvYmVydCBLcmFrb3JhIDxyb2Iua3Jha29yYUBtZXNzYWdlbmV0c3lzdGVtcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAgcnRwanBlZ3BheTogQWRkIHN1cHBvcnQgZm9yIEguMjY0IHBheWxvYWQgaW4gTUpQRUcgY29udGFpbmVyCisJICBTZWUgaHR0cDovL3d3dy5xdWlja2NhbXRlYW0ubmV0L3V2Yy1oMjY0L1VTQl9WaWRlb19QYXlsb2FkX0guMjY0XzAuODcucGRmCisJICBGaXhlcyBidWcgIzY1NTUzMC4KKworMjAxMS0wOC0wMiAyMjowNTowOCAtMDQwMCAgVHJpc3RhbiBNYXR0aGV3cyA8dHJpc3RhbkBzYXQucWMuY2E+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuaDoKKwkgIGphY2thdWRpb3Npbms6IERvbid0IGNhbGwgZ19hbGxvY2EoKSBpbiBwcm9jZXNzX2NiCisJICBnX2FsbG9jYSgpIGlzIG5vdCBSVC1zYWZlLCBzbyBpbnN0ZWFkIHdlIHNob3VsZCBhbGxvY2F0ZSB0aGUKKwkgIG1lbW9yeSBuZWVkZWQgaW4gYWR2YW5jZS4gRml4ZXMgIzY1NTg2NgorCisyMDExLTA4LTAzIDA4OjU4OjAwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBBZGQgaGFsIHRvIHRoZSBsaXN0IG9mIG5vbi1wb3J0ZWQgcGx1Z2lucworCisyMDExLTA4LTAzIDA4OjUzOjI0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBBZGQgbW9ub3Njb3BlIHRvIHRoZSBsaXN0IG9mIG5vbi1wb3J0ZWQgcGx1Z2lucworCisyMDExLTA4LTAzIDA4OjUxOjE5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkgIGVmZmVjdHY6IEZpeCB1bnVzZWQgYnV0IHNldCB2YXJpYWJsZSBjb21waWxlciB3YXJuaW5ncworCisyMDExLTA4LTAyIDIzOjQyOjU4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgZG9jczogZml4IHR3byBtb3JlIFNpbmNlOiB0YWdzCisKKzIwMTEtMDctMzEgMDQ6MTk6MDAgKzAzMDAgIE1hcnQgUmF1ZHNlcHAgPGxlaW9AZ2VudG9vLm9yZz4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogRml4IFNpbmNlIHRhZ3MgZm9yIGZpZWxkYW5hbHlzaXMgcmVsYXRlZCBuZXcgcHJvcGVydGllcworCSAgY29tbWl0IGMxYjEwMGNmOWMgaXMgYWZ0ZXIgMC4xMC4yOSBhbmQgMC4xMC4zMCB3YXMgYSBicmFuY2hlZCByZWxlYXNlLgorCSAgU28gZml4IFNpbmNlIHRhZ3MgZnJvbSAwLjEwLjI5IHRvIDAuMTAuMzEgZm9yIHRoZSBuZXcgcHJvcGVydGllcy4KKworMjAxMS0wOC0wMiAxMTo1MTo0NSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkgIHJ0cHZvcmJpc3BheTogZml4IHBvcnRpbmcgZXJyb3IKKworMjAxMS0wOC0wMiAxMToyOTo0MCArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZS5hYzogRGVmaW5lIGxpc3Qgb2Ygbm9uLXBvcnRlZCBwbHVnaW5zCisKKzIwMTEtMDgtMDIgMTE6Mjk6MjUgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBVcGRhdGUgY29tbW9uIHN1Ym1vZHVsZQorCisyMDExLTA4LTAyIDExOjE3OjM4ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlLmFjOiBTb3J0IEFHX0dTVF9DSEVDS19QTFVHSU4gYWxwaGFiZXRpY2FsbHkKKworMjAxMS0wNy0yOSAxNzoyNzowNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5Lmg6CisJICAtZ29vZDogZml4IGZvciBidWZmZXJwb29sIEFQSSBjaGFuZ2UKKworMjAxMS0wNy0yOSAxNzoyMTowMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDogY2hhbmdlIGZvciBuZXcgQVBJCisKKzIwMTEtMDctMjkgMTM6MDU6NDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGZpeCB2YXJpYWJsZS1zZXQtYnV0LW5vdC11c2VkIGNvbXBpbGVyIHdhcm5pbmcgd2l0aCBvbGRlciBwdWxzZSB2ZXJzaW9ucworCisyMDExLTA3LTI5IDEyOjA3OjI0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogcHJvcGVybHkgaW5pdCBydGNwX21pbl9pbnRlcnZhbAorCisyMDExLTAzLTA5IDExOjA0OjM2ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSAgcHVsc2VzaW5rOiBBZGQgc3VwcG9ydCBmb3IgY29tcHJlc3NlZCBmb3JtYXRzCisJICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgdmFyaW91cyBjb21wcmVzc2VkIGZvcm1hdHMgKEFDMywgRS1BQzMsIERUUyBhbmQKKwkgIE1QMykgcGF5bG9hZGVkIGluIElFQyA2MTkzNyBmb3JtYXQgKHVzZWQgZm9yIHRyYW5zbWlzc2lvbiBvdmVyIFMvUERJRiwKKwkgIEhETUkgYW5kIEJsdWV0b290aCkuCisJICBUaGUgYWNjZXB0Y2FwcygpIGZ1bmN0aW9uIGFsbG93cyBiaW5zIHRvIHByb2JlIGZvciB3aGF0IGZvcm1hdHMgdGhlIHNpbmsKKwkgIGJlaW5nIGNvbm5lY3RlZCB0byBzdXBwb3J0LiBUaGlzIG9ubHkgd29ya3MgYWZ0ZXIgdGhlIGVsZW1lbnQgaXMgc2V0IHRvCisJICBhdCBsZWFzdCBSRUFEWS4KKwkgIElmIHRoZSB1bmRlcmx5aW5nIHNpbmsgY2hhbmdlcyBhbmQgdGhlIGZvcm1hdCB3ZSBhcmUgc3RyZWFtaW5nIGlzIG5vdAorCSAgYXZhaWxhYmxlLCB3ZSBlbWl0IGEgbWVzc2FnZSB0aGF0IHdpbGwgYWxsb3cgdXBzdHJlYW0gZWxlbWVudHMvYmlucyB0bworCSAgYmxvY2sgYW5kIHJlbmVnb3RpYXRlIGEgbmV3IGZvcm1hdC4KKworMjAxMS0wMy0wMSAxNTozNDo0NiArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuaDoKKwkgIHB1bHNlc2luazogVXNlIHRoZSBleHRlbmRlZCBzdHJlYW0gQVBJIGlmIGF2YWlsYWJsZQorCSAgVGhpcyB1c2VzIHRoZSBuZXcgZXh0ZW5kZWQgQVBJIGZvciBjcmVhdGluZyBzdHJlYW1zLiBUaGlzIHdpbGwgYWxsb3cgdXMKKwkgIHRvIHN1cHBvcnQgY29tcHJlc3NlZCBmb3JtYXRzIG5hdGl2ZWx5IGluIHB1bHNlc2luayBhcyB3ZWxsLgorCisyMDExLTA3LTI5IDAwOjA3OjUyICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuaDoKKwkgIHB1bHNlc3JjOiBBZGQgYSBzb3VyY2Utb3V0cHV0LWluZGV4IHByb3BlcnR5CisJICBUaGlzIGV4cG9zZXMgdGhlIHNvdXJjZSBvdXRwdXQgaW5kZXggb2YgdGhlIHJlY29yZCBzdHJlYW0gdGhhdCB3ZSBvcGVuCisJICBzbyB0aGF0IGNsaWVudHMgY2FuIHVzZSB0aGlzIHdpdGggdGhlIGludHJvc3BlY3Rpb24gaWYgdGhleSB3YW50ICh0bworCSAgbW92ZSB0aGUgc3RyZWFtLCBmb3IgZXhhbXBsZSkuCisKKzIwMTEtMDctMjggMTQ6NDQ6NTcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHJ0cHNzcmNkZW11eDoga2VlcCBhIHJlZiBvbiB0aGUgc3JjIHBhZCB3aGlsZSB1c2luZyBpdAorCSAgUHJldmVudCBhIHBvc3NpYmxlIHJhY2UgaWYgY2xlYXJfc3NyYygpIGlzIGNhbGxlZCBiZXR3ZWVuIGdldHRpbmcgdGhlIHBhZCBhbmQKKwkgIGRvaW5nIHRoZSBwdXNoLgorCSAgQmFzZWQgb24gcGF0Y2ggYnkgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA5MTYKKworMjAxMS0wNS0yNCAxMToyOTo1NyArMDMwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguaDoKKwkgIHJ0cHNzcmNkZW11eDogTWFrZSB0aGUgcGFkcyBsb2NrIHJlY3Vyc2l2ZSBhbmQgaG9sZCBpdCBhY3Jvc3MgdGhlIHNpZ25hbCBlbWl0CisJICBXZSBuZWVkIHRvIGtlZXAgdGhlIGxvY2sgaGVsZCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgYSBwdXNoIGJlZm9yZSB0aGUgIm5ldy1zc3JjLXBhZCIKKwkgIGhhbmRsZXIgaGFzIGNvbXBsZXRlZC4gQnV0IHdlIG1heSB3YW50IHRvIHB1c2ggYW4gZXZlbnQgZnJvbSBpbnNpZGUgdGhhdCBoYW5kbGVyLCBoZW5jZQorCSAgdGhlIHJlY3Vyc2l2ZSBtdXRleC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA5MTYKKworMjAxMS0wNS0yNCAxMToxNzoyNSArMDMwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICBydHBzc3JjZGVtdXg6IFVzZSBQQURzIGxvY2sKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA5MTYKKworMjAxMS0wNy0yOCAxMTowOTowOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJICBzcGVleDogdXBkYXRlIGZvciBwb3NpdGlvbi9xdWVyeS9jb252ZXJ0IEFQSSBjaGFuZ2VzCisKKzIwMTEtMDctMjggMTA6NTQ6MzggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2c2Vlay5jOgorCSogZ3N0L2RlYnVndXRpbHMvcHJvZ3Jlc3NyZXBvcnQuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgZ3N0OiB1ZHBhdGUgZm9yIHBvc2l0aW9uL2R1cmF0aW9uL2NvbnZlcnQgcXVlcnkgQVBJIGNoYW5nZXMKKworMjAxMS0wNy0yOCAwMDozNzoxMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggY29tcGlsZXIgd2FybmluZworCSAgZ3N0YXZpZGVtdXguYzogSW4gZnVuY3Rpb24gJ2dzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtJzoKKwkgIGdzdGF2aWRlbXV4LmM6MTI2MToyNDogZXJyb3I6ICdkYXRhJyBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24gWy1XZXJyb3I9dW5pbml0aWFsaXplZF0KKwkgIGdzdGF2aWRlbXV4LmM6MTIwNDoxMTogbm90ZTogJ2RhdGEnIHdhcyBkZWNsYXJlZCBoZXJlCisKKzIwMTEtMDctMjcgMTg6MTU6MjAgKzAxMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZC5zaW1vbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuaDoKKwkgIHJ0cGgyNjRkZXBheTogQ29wZSB3aXRoIEZVLUEgRSBiaXQgbm90IGJlaW5nIHNldAorCSAgU29tZSBoMjY0IHBheWxvYWRlcnMgYXJlIHVuZm9ydHVuYXRlbHkgYnVnZ3kgYW5kIGRvbid0IGNvcnJlY3RseSBzZXQgdGhlCisJICBFIGJpdCBpbiBGVS1BIE5BTCB3aGVuIHRoZXkgaGF2ZSBlbmRlZC4gV29yayBhcm91bmQgdGhpcyBieSBhc3N1bWluZworCSAgc3VjaCBhIGZyYWdtZW50YXRpb24gdW5pdCBoYXMgZW5kZWQgd2hlbiB0aGVyZSB3YXMgbm8gcGFja2V0IGxvc3MgYW5kIGEKKwkgIG5ldyBOQUwgaXMgc3RhcnRlZAorCisyMDExLTA0LTEyIDE3OjAxOjQ3ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5oOgorCSAgYWMzcGFyc2U6IFN1cHBvcnQgc3dpdGNoaW5nIGFsaWdubWVudCBvbi10aGUtZmx5CisJICBUaGlzIGFsbG93cyBzd2l0Y2hpbmcgb2YgYWxpZ25tZW50IGZvciBFLUFDMyBzdHJlYW1zIGF0IHJ1bi10aW1lLiBUaGlzCisJICBpcyByZXF1ZXN0ZWQgYnkgZG93bnN0cmVhbSBlbGVtZW50cyB2aWEgYSBjdXN0b20gZXZlbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwMzEzCisKKzIwMTEtMDctMjcgMTY6NDY6NDYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDI6IHJlbW92ZSB1bnVzZWQgdmFyaWFibGVzCisJICBVc2UgdGhlIG1vcmUgc3BlY2lhbGl6ZWQgdHlwZSBmb3IgdGhlIGJ1ZmZlcnBvb2wuCisJICBVc2UgdGhlIHNpemUgZnJvbSB0aGUgZHJpdmVyIGFzIHRoZSBzaXplIG9mIHRoZSBpbWFnZSB0byByZWFkLgorCSAgRG9uJ3QgY29uZmlndXJlIHRoZSBwb29sIHdoZW4gY3JlYXRlZC4gVGhpcyB3aWxsIGJlIGRvbmUgaW4gdGhlIHNldHVwX2FsbG9jYXRpb24KKwkgIG1ldGhvZCBsYXRlciBvciBieSB1cHN0cmVhbSBmb3Igc2lua3MuCisJICBSZW1vdmUgdW51c2VkIHByb3BlcnRpZXMgYW5kIHZhcmlhYmxlcy4gQnVmZmVycG9vbCBzaXplcyBhcmUgbm93IGNvbmZpZ3VyZWQgaW4KKwkgIHRoZSBidWZmZXJwb29sIGJ5IHRoZSBlbGVtZW50cyBpbiB0aGUgcGlwZWxpbmUuIFdlIG1pZ2h0IHdhbnQgdG8gaW5mbHVlbmNlIHRoZQorCSAgcG9vbCBzaXplIGxhdGVyIHNvbWVob3cuCisKKzIwMTEtMDctMjcgMTM6NDY6MDkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJICB2NGwyYnVmZmVycG9vbDogcmVtb3ZlIHVudXNlZCB2YXJpYWJsZQorCisyMDExLTA3LTI3IDEzOjQzOjA4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBhZGQgbWV0YWRhdGEKKworMjAxMS0wNy0yNyAxMzo0MToyOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJICBidWZmZXJwb29sOiBjaGVjayBmb3IgbWV0YWRhdGEKKwkgIE9ubHkgYWRkIHZpZGVvIG1ldGFkYXRhIHdoZW4gaXQgd2FzIGNvbmZpZ3VyZWQgaW4gdGhlIHBvb2wuIEZhaWwgaWYgdGhlcmUgd2FzIG5vCisJICB2aWRlbyBtZXRhZGF0YSBjb25maWd1cmVkIGFuZCB0aGUgc3RyaWRlcyBhcmUgbm90IHRoZSBkZWZhdWx0IG9uZXMuCisKKzIwMTEtMDctMjcgMTI6NDI6MjEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuaDoKKwkgIHdhcnA6IGFkZCBzdHJpZGUgc3VwcG9ydAorCisyMDExLTA3LTI3IDEyOjQxOjMzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBhZGQgY29sb3JzcGFjZSB0byBkZWJ1ZworCisyMDExLTA3LTI2IDE3OjQ1OjAxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cDogZml4IGNvbXBpbGF0aW9uCisKKzIwMTEtMDctMjYgMTY6MTU6MDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDI6IHJlbmFtZSBhIHZhcmlhYmxlCisJICBSZW5hbWUgdGhlIHNpemUgdmFyaWFibGUgdG8gc2l6ZWltYWdlIGFuZCBmaWxsIGl0IHdpdGggdGhlIHNpemUgdGhhdCBoYXMgYmVlbgorCSAgZ2l2ZW4gdG8gdXNlIGJ5IHRoZSB2NGwyIGRyaXZlciBpbnN0ZWFkIG9mIG1ha2luZyBzb21ldGhpbmcgdXAuLgorCisyMDExLTA3LTI2IDEzOjE4OjU1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMjogdXNlIG5ldyBzZXR1cF9hbGxvY2F0aW9uIHZtZXRob2QKKworMjAxMS0wNy0yNiAxMDo1NjowNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGltcGxlbWVudCBtb3JlIGJpdHMgb2YgUlcgSS9PIG1vZGUKKwkgIEltcGxlbWVudCB0aGUgcmVsYWVzZSBvZiBSVyBidWZmZXJzIGluIHRoZSBwb29sLgorCSAgV2FybiBmb3IgdW5zdXBwb3J0ZWQgd3JpdGUoKSBtb2RlIGZvciBzaW5rcy4KKworMjAxMS0wNy0yNiAxMDo1NDoyMyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogaW1wcm92ZSBJTyBtb2RlIGVycm9yIGhhbmRsaW5nCisJICBFcnJvciBvdXQgd2hlbiBhbiB1bnN1cHBvcnRlZCBJTyBtb2RlIHdhcyBzZWxlY3RlZAorCisyMDExLTA0LTA5IDEyOjI2OjU2ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYWMzcGFyc2UuYzoKKwkgIGFjM3BhcnNlOiBBZGQgc3VwcG9ydCBmb3IgSUVDIDYxOTM3IGFsaWdubWVudAorCSAgV2hlbiBwdXNoaW5nIG91dCBidWZmZXJzIG92ZXIgUy9QRElGIG9yIEhETUksIElFQyA2MTkzNyBwYXlsb2FkaW5nCisJICByZXF1aXJlcyBlYWNoIGJ1ZmZlciB0byBjb250YWluIDYgYmxvY2tzIGZyb20gZWFjaCBzdWJzdHJlYW0uIFRoaXMgYWRkcworCSAgY29kZSB0byBjb2xsZWN0IGFsbCB0aGUgZnJhbWVzIG5lZWRlZCB0byBtZWV0IHRoaXMgcmVxdWlyZW1lbnQgYmVmb3JlCisJICBwdXNoaW5nIG91dCBhIGJ1ZmZlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTAzMTMKKworMjAxMS0wNi0wOCAxNTo1NzozNyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjogQWx3YXlzIHNlbmQgYXBwbGljYXRpb24gcmVxdWVzdGVkIGZlZWRiYWNrIGluIGltbWVkaWF0ZSBtb2RlCisJICBTZW5kIGFzIG1hbnkgYXBwbGljYXRpb24gcmVxdWVzdGVkIGZlZWRiYWNrIG1lc3NhZ2VzIGluIGltbWVkaWF0ZSBtb2RlLCBldmVuIGlmIHRoZXkKKwkgIGhhdmUgYWxyZWFkeSBiZWVuIHNlbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0NTgzCisKKzIwMTEtMDYtMDggMTQ6NDg6MDEgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IERvbid0IGxldCB0aGUgY29tcHV0ZWQgUlRQIGJhbmR3aWR0aCBmYWxsIHRvbyBsb3cKKwkgIElmIGl0IGZhbGxzIHRvbyBsb3csIHRoZSBjb21wdXRlZCBSVENQIGJhbmR3aWR0aCB3aWxsIGJlIG5lYXIgemVybyBhbmQKKwkgIHRoZSBSVENQIHRocmVhZCB3aWxsIGJlIHN0b3BwZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0NTgzCisKKzIwMTEtMDQtMjUgMTY6MTM6MzggLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogV2FpdCBsb25nZXIgdG8gdGltZW91dCBTU1JDIGNvbGxpc2lvbgorCSAgVXNpbmcgdGhlIGN1cnJlbnQgUlRDUCBpbnRlcnZhbCB0byB0aW1lb3V0IFNTUkMgY29sbGlzaW9uIGNhbiBsZWFkIHRvCisJICBjb2xsaXNpb25zIGJlaW5nIHRpbWVkIG91dCBpbW1lZGlhdGVseSBpZiBhIEJZRSBwYWNrZXQgaXMgc2VudCBiZWNhdXNlCisJICBpdCBpcyBzZW50IGltbWVkaWF0ZWx5LCBzbyB0aGUgaW50ZXJ2YWwgaXMgMC4gVGhpcyBpcyBub3Qgd2hhdCB3ZQorCSAgd2FudC4gU28ganVzdCBzZXQgYSBzdGF0aWMgMTAgdGltZXMgdGhlIGRlZmF1bHQgUlRDUCBpbnRlcnZhbCwgaXQKKwkgIHNob3VsZCBiZSBlbm91Z2gKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDg2NDIKKworMjAxMS0wNy0yNSAxNTo1MToyMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJICB2NGwyOiByZW1vdmUgdW51c2VkIG1ldGhvZAorCisyMDExLTA3LTI1IDE1OjM4OjM4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogZml4IGZsdXNoaW5nIHN0YXJ0IGFuZCBzdG9wCisJICBNb3ZlIHRoZSBmbHVzaGluZyBjYWxscyB0byB0aGUgcmlnaHQgcGxhY2UgaW4gdGhlIGJ1ZmZlcnBvb2wuCisJICBGaXggdGhlIG1pbiBhbmQgbWF4IGJ1ZmZlciBzaXplcy4KKworMjAxMS0wNy0yNSAxNDo0NzowNSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJICB2NGwyOiBkZXF1ZXVlIGJ1ZmZlcnMgd2hlbiBhbGwgYXJlIHF1ZXVlZAorCSAgUHJlZmVyIHRvIGFsd2F5cyB1c2UgdGhlIGRlZmF1bHQgYnVmZmVycG9vbCBxdWV1ZSBmb3IgdGhlIF9hY3F1aXJlIGZ1bmN0aW9uCisJICBiZWNhdXNlIGl0IHByb3Blcmx5IHN1cHBvcnRzIHVuYmxvY2tpbmcgd2hlbiBzZXR0aW5nIGluYWN0aXZlIGV0Yy4gQXMgYSByZXN1bHQsCisJICB3ZSBuZWVkIHRvIGRlcXVldWUgYnVmZmVycyBhbmQgcHV0IHRoZW0gYmFjayBpbiB0aGUgYnVmZmVycG9vbCBxdWV1ZSB3aGVuIHdlCisJICBoYXZlIHF1ZXVlZCBhbGwgYnVmZmVycyBpbiB0aGUgc2luay4KKwkgIFJlbmFtZSBzb21lIHZhcmlhYmxlcyB0byBtb3JlIG1lYW5pbmdmdWxsIG5hbWVzIHRvIGF2b2lkIGEgcHJvYmxlbSB3aXRoCisJICBmcmVlaW5nIHRoZSB3cm9uZyBhbW91bnQgb2YgYnVmZmVycy4KKworMjAxMS0wNy0xOSAxMzozODowMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHNldCBTT1VSQ0UgZmxhZyBhdCBpbml0IHRpbWUKKwkgIEZpeGVzICM2NTQ4MTYuCisKKzIwMTEtMDctMjUgMTA6MTA6NTggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkgIHZlcnRpZ290djogYWRkIHN0cmlkZSBzdXBwb3J0CisKKzIwMTEtMDctMTkgMTg6MjU6MjkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBvbmx5IHRvIFNUUkVBTU9GRiB3aGVuIHN0cmVhbWluZworCSAgT25seSBjYWxsIFNUUkVBTU9GRiB3aGVuIHdlIHByZXZpb3VzbHkgY2FsbGVkIFNUUkVBTU9OCisKKzIwMTEtMDctMjIgMjE6MjY6MzIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJnYW5hbHlzaXMuYzoKKwkgIHJlcGxheTogZml4IGZvciBldmVudCBoYW5kbGVyCisKKzIwMTEtMDctMjIgMjE6MTk6NDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZzZWVrLmM6CisJKiBnc3QvZGVidWd1dGlscy9wcm9ncmVzc3JlcG9ydC5jOgorCSAgZml4ZXMgZm9yIGV2ZW50IGhhbmRsZXIgY2hhbmdlcworCisyMDExLTA3LTE4IDE2OjQ2OjI3IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgcnRwaDI2NGRlcGF5OiBDb21wbGV0ZSBtZXJnZWQgQVUgb24gbWFya2VyIGJpdAorCSAgVGhlIG1hcmtlciBiaXQgb24gYSBSVFAgcGFja2V0IG1lYW5zIHRoZSBBVSBoYXMgYmVlbiBjb21wbGV0ZWQsIHNvIHB1c2ggaXQgb3V0CisJICBpbW1lZGlhdGVseSB0byByZWR1Y2UgdGhlIGxhdGVuY3kuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0ODUwCisKKzIwMTEtMDctMTggMjA6Mjc6MzggLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJICBydHBoMjY0cGF5OiBPbmx5IHNldCB0aGUgbWFya2VyIGJpdCBvbiB0aGUgbGFzdCBOQUxVIG9mIGEgbXVsdGktTkFMVSBhY2Nlc3MgdW5pdAorCSAgQW4gYWNjZXNzIHVuaXQgY291bGQgY29udGFpbiBtdWx0aXBsZSBOQUwgdW5pdHMsIGluIHRoYXQgY2FzZSwgb25seSB0aGUgbGFzdAorCSAgUlRQIHBhY2tldCBvZiB0aGUgbGFzdCBOQUxVIHNob3VsZCBoYXZlIGl0cyBtYXJrZXIgYml0IHNldC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTQ4NTAKKworMjAxMS0wNy0yMCAwODo1Mjo1OCArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZEBnbWFpbC5jb20+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJICBtdWx0aXBhcnQ6IGZpeCBjb21waWxlciB3YXJuaW5nCisKKzIwMTEtMDctMTkgMTg6MjA6NDMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJICB2NGwyOiBoYW5kbGUgdW5zdXBwb3J0ZWQgZm9ybWF0cworCisyMDExLTA3LTE5IDE2OjU5OjU1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDI6IEZpeCBzaW5rIGJ1ZmZlcnBvb2wgaGFuZGxpbmcKKwkgIFJlbW92ZSBvbGQgbWV0aG9kLCB1c2UgbmV3dyBfcHJvY2VzcyBtZXRob2QgZm9yIHRoZSBzaW5rLgorCSAgSW5mb3JtIHRoZSBwYXJlbnQgYnVmZmVycG9vbCBjbGFzcyBhYm91dCB0aGUgc2V0dGluZ3MgdG9vLiBUaGlzIGlzIG5lZWRlZCB0byBsZXQKKwkgIGl0IGtub3cgYWJvdXQgdGhlIG1heC1idWZmZXJzLgorCSAgQWxsb2NhdGUgdGhlIG5lZ290aWF0ZWQgbWF4LWJ1ZmZlcnMgYW5kIGluaXRpYWxseSBtbWFwIG1pbi1idWZmZXJzLiBUaGUgaWRlYSBpcworCSAgdGhhdCB0aGUgYnVmZmVycG9vbCB3aWxsIGFsbG9jYXRlIG1vcmUgd2hlbiBuZWVkZWQuCisJICBJbXByb3ZlIGRlYnVnZ2luZy4KKwkgIE9ubHkgcG9sbCBpbiBjYXB0dXJlIG1vZGUsIGl0IGRvZXMgbm90IHNlZW0gdG8gd29yayBpbiBwbGF5YmFjayBtb2RlIG9uIHRoaXMKKwkgIGJlYWdsZWJvYXJkLgorCisyMDExLTA3LTE5IDEyOjA1OjUxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSAgYXVwYXJzZTogYXZvaWQgaGFuZ2luZyBvbiBpbnZhbGlkIHNob3J0IGlucHV0CisJICAuLi4gYXMgaW4gc3VjaCBjYXNlIHRoZXJlIGlzIG5vIHNyY3BhZCB5ZXQgb24gd2hpY2ggdG8gZm9yd2FyZCBFT1MuCisKKzIwMTEtMDctMTggMTU6MTM6MzMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBGaXggZGVmYXVsdCB2YWx1ZSBsZWFraW5nCisJICBSZW1lbWJlciB0byBmcmVlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGNsaWVudCBuYW1lLCBhdm9pZGluZyBhCisJICBsZWFrCisKKzIwMTEtMDctMTggMTg6NTQ6NDkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkgIHY0bDI6IE1vcmUgd29yayBvbiBidWZmZXJwb29scworCSAgQWRkIGRpZmZlcmVudCB0cmFuc3BvcnQgbWV0aG9kcyB0byB0aGUgYnVmZmVycG9vbCAoTU1BUCBhbmQgUkVBRC9XUklURSkKKwkgIERvIG1vcmUgcGFyc2luZyBvZiB0aGUgYnVmZmVycG9vbCBjb25maWcuCisJICBTdGFydCBhbmQgc3RvcCBzdHJlYW1pbmcgYmFzZWQgb24gdGhlIGJ1ZmZlcnBvb2wgc3RhdGUuCisJICBNYWtlIHNlcGFyYXRlIG1ldGhvZHMgZm9yIGdldHRpbmcgYSBidWZmZXIgZnJvbSB0aGUgcG9vbCBhbmQgZmlsbGluZyBpdCB3aXRoCisJICBkYXRhLiBUaGlzIGFsbG93cyB1cyB0byBmaWxsIGJ1ZmZlcnMgZnJvbSBvdGhlciBwb29scyB0b28uIEVpdGhlciB1c2UgY29weSBvcgorCSAgcmVhZCB0byBmaWxsIHVwIHRoZSB0YXJnZXQgYnVmZmVycy4KKwkgIEFkZCBwcm9wZXJ0eSB0byBmb3JjZSBhIHRyYW5zZmVyIG1vZGUgaW4gdjRsMnNyYy4KKwkgIEluY3JlYXNlIGRlZmF1bHQgbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gNC4KKwkgIE5lZ290aWF0ZSBidWZmZXJwb29sIGFuZCBpdHMgcHJvcGVydGllcyBpbiB2NGwyc3JjLgorCisyMDExLTA3LTE4IDE0OjI0OjQ4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIHJ0cGgyNjRkZXBheTogcmVzZXQgdXBvbiBGTFVTSF9TVE9QCisJICAuLi4gd2hpY2ggaXMgcGFydGljdWxhcmx5IG5lZWRlZCB3aGVuIG1lcmdpbmcgTkFMIHVuaXRzLCB3aGVyZSBub3QgcmVzZXR0aW5nCisJICB3b3VsZCBsZWFkIHRvIG91dHB1dCBvZiBhbiBvbGRlciAocHJlLWZsdXNoKSBBVSAod2l0aCB1bmludGVuZGVkIHRpbWVzdGFtcCkuCisKKzIwMTEtMDctMTggMTQ6MzA6NTEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIG11bHRpZmlsZXNpbms6IGRvIG5vdCB1c2UgZ19zbGlzdF9mcmVlX2Z1bGwKKwkgIC4uLiBhcyB0aGF0IGlzIG9ubHkgaW4gR0xpYiAyLjI4LCB3aGljaCBpcyBub3QgeWV0IHJlcXVpcmVkIGF0IHRoaXMgdGltZS4KKworMjAxMS0wNy0xOCAxMDo1MjoyMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSAgdjRsMjogYWRkIElPIG1ldGhvZCBlbnVtCisKKzIwMTEtMDctMTggMTA6NTE6MjEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICBidWZmZXJwb29sOiBpbXByb3ZlIF9uZXcgZnVuY3Rpb24KKworMjAxMS0wNy0xOCAwOTozODoyNiArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZEBnbWFpbC5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmg6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWx0aWZpbGUuYzoKKwkgIG11bHRpZmlsZXNpbms6IGFkZCBtYXgtZmlsZXMgcHJvcGVydHkKKwkgIEFkZCBtYXgtZmlsZXMgcHJvcGVydHkgdG8gbGltaXQgdGhlIG51bWJlciBvZiBmaWxlcyBzYXZlZCBvbiBkaXNrLgorCSAgQVBJOiBtdWx0aWZpbGVzaW5rOjptYXgtZmlsZXMKKworMjAxMS0wNy0xNyAyMzozNjo1NSArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZEBnbWFpbC5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgbXVsdGlmaWxlc2luazogcmVmYWN0b3IgZmlsZSBvcGVuaW5nIGFuZCBjbG9zaW5nIGNvZGUKKworMjAxMS0wNy0xNiAxOTozODo1MSArMDIwMCAgQWxleGV5IEZpc2hlciA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGZpeCBwaXhlbC1hc3BlY3QtcmF0aW8gaWYgaGVhZGVyIGhhcyBvbmx5IG9uZSBkaXNwbGF5IHZhcmlhYmxlCisJICBDdXJyZW50IG1hdHJvc2thIGRlbXV4IGNhbGN1bGF0ZXMgdGhlIHBpeGVsIGFzcGVjdCByYXRpbyBvbmx5IGlmIGJvdGgKKwkgIERpc3BsYXlIZWlnaHQgYW5kIERpc3BsYXlXaWR0aCBhcmUgc2V0LCBidXQgaXQgaXMgbGVnYWwgdG8gdXNlIG9ubHkKKwkgIG9uZSB2YXJpYWJsZSBpZiB0aGUgb3RoZXIgaXMgZXF1YWwgdG8gUGl4ZWxXaWR0aCBvciBQaXhlbEhlaWdodCwgYXQKKwkgIGxlYXN0IHRoZSBta2NsZWFuIHV0aWxpdHkgaXMgZG9pbmcgdGhhdC4gU28gdGhpcyBtYWtzZSBta2NsZWFuZWQKKwkgIGZpbGVzIHBsYXkgY29ycmVjdGx5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1NDc0NAorCisyMDExLTA3LTE2IDIzOjQ3OjUwICswMTAwICBBbnRvaW5lIEphY291dG90IDxhamFjb3V0b3RAb3BlbmJzZC5vcmc+CisKKwkqIGdzdC9nb29tL3BsdWdpbl9pbmZvLmM6CisJICBnb29tOiBmaXggYnVpbGQgb24gUFBDIG9uIG9wZW5ic2QKKwkgIEEgbWlzc2luZyBzeXMvcGFyYW0uaCBpbmNsdWRlIHJlc3VsdHMgaW46CisJICAvdXNyL2luY2x1ZGUvc3lzL3Byb2MuaDo2NDogZXJyb3I6ICdNQVhMT0dOQU1FJyB1bmRlY2xhcmVkIGhlcmUgKG5vdCBpbiBhCisJICBmdW5jdGlvbikKKwkgIC91c3IvaW5jbHVkZS9zeXMvcHJvYy5oOjI4NTogZXJyb3I6ICdNQVhDT01MRU4nIHVuZGVjbGFyZWQgaGVyZSAobm90IGluIGEKKwkgIGZ1bmN0aW9uKQorCSAgd2hlbiBjb21waWxpbmcgZ29vbSBvbiBvcGVuYnNkL3BwYy4gV2UgY2FuIGp1c3QgcmVtb3ZlIHRoZSB0d28gc3lzLyBpbmNsdWRlcworCSAgaGVyZSwgdGhleSBhcmUgbm90IG5lZWRlZCBmb3IgYW55dGhpbmcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0NzQ5CisKKzIwMTEtMDctMTUgMTc6MDY6MzkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0wNy0xNSAxNjo1NTo1MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogaW1wbGVtZW50IHNldHVwX2FsbG9jYXRpb24KKwkgIEltcGxlbWVudCB0aGUgc2V0dXBfYWxsb2NhdGlvbiB2bWV0aG9kLCB3ZSdsbCBob3BlZnVsbHkgZG8gc29tZXRoaW5nIGNsZXZlciBpbgorCSAgdGhlcmUgbGF0ZXIuCisKKzIwMTEtMDctMTUgMTY6MjY6MDYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IGltcHJvdmUgYnVmZmVycG9vbCBjb25maWcgc2V0dGluZworCSAgUGFzcyB0aGUgY2FwcyBhbmQgdGhlIGRlZmF1bHQgdmlkZW8gc2l6ZSB0byB0aGUgYnVmZmVycG9vbCBjb25maWcuCisJICBEb24ndCBhY3RpdmF0ZSB0aGUgYnVmZmVycG9vbCwgdGhpcyB3aWxsIGJlIGRvbmUgYnkgdGhlIG9iamVjdCB0aGF0IGRlY2lkZXMgdG8KKwkgIHVzZSB0aGUgYnVmZmVycG9vbC4KKwkgIEltcHJvdmUgZGVidWdnaW5nIGFuZCBlcnJvciByZXBvcnRpbmcuCisKKzIwMTEtMDctMTUgMTM6NTI6MzggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBoYW5kbGUgZGVxdWV1ZWluZyBjb3JyZWNseQorCSAgRmlyc3QgY2xlYW4gdXAgdGhlIGJ1ZmZlcnMgaW4gdGhlIHF1ZXVlLCB0aGVuIHRoZSByZW1haW5pbmcgb25lcyBpbiB0aGUKKwkgIGRldmljZS4KKworMjAxMS0wNy0xNSAxMzoyOTo0MiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogdW5yZWYgY29waWVkIGJ1ZmZlcgorCSAgQWZ0ZXIgd2UgY29weSB0aGUgaW5jb21taW5nIGJ1ZmZlciB0byBvbmUgb2Ygb3VyIGJ1ZmZlcnBvb2wgYnVmZmVycywgdW5yZWYgdGhlCisJICB0YXJnZXQgYnVmZmVyIGFmdGVyIHJlbmRlcmluZyBzbyB0aGF0IGl0IGlzIHB1dCBiYWNrIGluIHRoZSBwb29sLgorCisyMDExLTA3LTE1IDEzOjA3OjExICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkgIHY0bDI6IGRlcXVldWUgYnVmZmVycyBmb3IgdGhlIHNpbmsKKwkgIFdoZW4gd2UgaGF2ZSBhbGwgYnVmZmVycyBxdWV1ZWQgZm9yIHBsYXliYWNrIGFuZCB3ZSBuZWVkIGEgbmV3IGVtcHR5IGJ1ZmZlciwKKwkgIGRlcXVldWUgb25lIGFuZCByZXR1cm4gaXQuCisJICBTZXQgdGhlIHJpZ2h0IHNpemUgZm9yIHNpbmsgYnVmZmVycy4KKwkgIEltcHJvdmUgY291bnRpbmcgb2YgcXVldWVkIGJ1ZmZlcnMuCisKKzIwMTEtMDctMTUgMTI6MzU6MTQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiB1c2UgdGhlIHBhcmVudCBxdWV1ZSBmb3IgdGhlIHNpbmsKKwkgIFdlIHdhbnQgdG8gbWFpbnRhaW4gYSBxdWV1ZSBvZiBmcmVlIGJ1ZmZlcnMgZm9yIHRoZSBzaW5rLCB1c2UgdGhlIHBhcmVudCBtZXRob2RzCisJICB0byBkbyB0aGF0LgorCisyMDExLTA3LTE1IDEyOjAwOjU0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogZml4IGVycm9yIG1lc3NhZ2VzCisKKzIwMTEtMDctMTUgMTE6MzA6MjUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJICB2NGwyOiBhZGQgQUxMT0NBVElPTiBxdWVyeSB0byB0aGUgc2luaworCisyMDExLTA3LTE1IDExOjI3OjE4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIHY0bDI6IGNvbnZlcnQgdG8gR3N0QnVmZmVyUG9vbAorCSAgRXh0ZW5kIGZyb20gR3N0QnVmZmVyUG9vbC4KKwkgIEhhbmRsZSB0aGUgbGlmZXRpbWUgb2YgdGhlIHBvb2wgYnVmZmVycyBjb3JyZWN0bHkgd2l0aCB0aGUgc3RhcnQvc3RvcCB2bWV0aG9kcy4KKwkgIE1hcCBhY3F1aXJlIGFuZCByZWxlYXNlIGRpcmVjdGx5IHRvIFFCVUYgYW5kIERRQlVGLiBXZSBzdGlsbCBleHBvc2UgYW4gZXhwbGljaXQKKwkgIHFidWYgZm9yIHRoZSB2NGwyc2luayBmb3Igbm93LgorCisyMDExLTA3LTE1IDExOjE4OjAzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiByZW1vdmUgZXhwZXJpbWVudGFsIG1hcmtlcnMKKworMjAxMS0wNy0xNCAyMDoxMDowMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOgorCSAgcnRwcGNtQXBheS9kZXBheTogU3RhdGljIGNsb2NrIHJhdGVzIG9uIHN0YXRpYyBwYXlsb2FkcywgZHluYW1pYyBvbiBkeW5hbWljCisJICBQYXJ0aWFsbHkgcmV2ZXJ0cyAzOTdkYzYwYgorCisyMDExLTA3LTE0IDE2OjIxOjM2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBtZXJnZSBjb2RlCisKKzIwMTEtMDctMTQgMTY6MTI6MTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuaDoKKwkgIHY0bDI6IE1vdmUgb3V0cHV0IGRldGFpbHMgdG8gZGV2aWNlIG9iamVjdAorCSAgTW92ZSB0aGUgZGV0YWlscyBvZiBob3cgYSBidWZmZXIgaXMgcmVuZGVyZWQgdG8gdGhlIGRldmljZSBvYmplY3QuCisKKzIwMTEtMDMtMDQgMTU6NDE6MjIgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwaDI2NHBheTogSW1wbGVtZW50IGdldGNhcHMKKwkgIENvbnZlcnQgcHJvZmlsZS1sZXZlbC1pZCBmcm9tIFJUUCBjYXBzIGludG8gdmlkZW8veC1oMjY0IHN0eWxlIGNhcHMgKHdpdGggcHJvZmlsZSBhbmQgbGV2ZWwpCisKKzIwMTEtMDctMTMgMTg6MzI6MDAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZG9yaWVudC5jOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5oOgorCSAgdjRsMjogbW92ZSBjYXB0dXJlIGNvZGUgdG8gZGV2aWNlIG9iamVjdAorCSAgTW92ZSB0aGUgZGV0YWlscyBvZiBob3cgdG8gY2FwdHVyZSB0byB0aGUgZGV2aWNlIG9iamVjdC4gUmVtb3ZlIHRoZQorCSAgdjRsMnNyY19jYWxscy5bY2hdIGZpbGVzIGJlY2F1c2UgdGhleSBhcmUgZW1wdHkgbm93LgorCSAgUHJvdmlkZSB0d28gc2ltcGxlIG1ldGhvZHMgdG8gZ2V0IGFuZCByZXR1cm4gYSBidWZmZXIgdG8gdGhlIGRldmljZS4KKwkgIEFsc28gZG8gYSBzbG93IGNvcHkgd2hlbiB0aGUgYnVmZmVyIGlzIG5vdCBmcm9tIG91ciBwb29sLgorCisyMDExLTA3LTEzIDE2OjU4OjA4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBhZGQgc29tZSBtb3JlIGRlYnVnCisKKzIwMTEtMDctMTMgMTY6NTY6MjEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJICB2NGwyOiBzdG9wIHN0cmVhbWluZyBpbiBSRUFEWSBhbmQgTlVMTAorCisyMDExLTA3LTEzIDE2OjQwOjM5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBzdGFydCBzdHJlYW1pbmcgZm9yIHRoZSBvdXRwdXQgYXMgd2VsbAorCisyMDExLTA3LTEzIDE2OjMzOjU4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnJhZGlvLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuaDoKKwkgIHY0bDI6IExldCB0aGUgZGV2aWNlIG9iamVjdCBtYW5hZ2UgdGhlIHBvb2wKKwkgIFJlbmFtZSBzdGFydCBhbmQgc3RvcCBtZXRob2RzIHRvIG9wZW4gYW5kIGNsb3NlIGJlY2F1c2UgdGhhdCBpcyB3aGF0IHRoZXkgZG8uCisJICBBZnRlciBzZXR0aW5nIHRoZSBmb3JtYXQgb24gdGhlIGRldmljZSBvYmplY3QsIHNldHVwIHRoZSBidWZmZXJwb29scy4gTW92ZSB0aGlzCisJICBjb2RlIGZyb20gdGhlIHY0bDJzcmNfY2FsbHMuYyBmaWxlLCBpdCBpcyBzaGFyZWQgYmV0d2VlbiBzb3VyY2UgYW5kIHNpbmsuCisJICBNYWtlIG5ldyBkZXZpY2Ugc3RhcnQgYW5kIHN0b3AgbWV0aG9kIHRoYXQgbWVyZ2VzIHZhcmlvdXMgYml0cyBvZiBjb21tb24gY29kZQorCSAgc3ByZWFkIG92ZXIgc2V2ZXJhbCBmaWxlcy4KKworMjAxMS0wNy0xMyAxMzo1MjozMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIHY0bDI6IGRvbid0IHN0b3JlIHN0cmlkZSBpbiB0aGUgdmlkZW9pbmZvCisJICBXZSB3YW50IHRvIGtlZXAgdGhlIGRlZmF1bHQgc3RyaWRlcyBpbiB0aGUgdmlkZW9pbmZvLiBLZWVwIHRoZSBzdHJpZGUgb2YgdGhlCisJICB2aWRlbyBmcmFtZXMgc2VwYXJhdGUgc28gdGhhdCB3ZSBjYW4gdXNlIGJvdGggdG8gY29weSBhIHZpZGVvIGZyYW1lIGFuZCBkbworCSAgY29ycmVjdCBzdHJpZGUgY29udmVyc2lvbi4KKworMjAxMS0wNy0xMyAxMzozODoxNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDI6IFVzZSB2aWRlbyBmcmFtZSBjb3B5IGZvciByYXcgdmlkZW8KKwkgIFVzZSB0aGUgdmlkZW8gZnJhbWUgY29weSBBUEkgZm9yIHJhdyB2aWRlbyBmcmFtZXMgc28gdGhhdCB3ZSBjb3B5IHdpdGggdGhlIHJpZ2h0CisJICBzdHJpZGVzLgorCisyMDExLTA3LTEzIDEzOjM3OjU4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMjogYWRkIHZpZGVvIG1ldGFkYXRhIHRvIHJhdyB2aWRlbyBidWZmZXJzCisKKzIwMTEtMDctMTMgMTM6MTU6MDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBzbWFsbCBjbGVhbnVwcworCisyMDExLTA3LTEzIDEzOjAwOjQyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyOiBpbXByb3ZlIGNhcHMgcGFyc2luZworCSAgVXNlIEdzdFZpZGVvSW5mbyB0byBzdG9yZSB0aGUgcGFyc2VkIGNhcHMuCisJICBSZW1vdmUgb3V0c2l6ZSBmcm9tIHRoZSBjYXBzIHBhcnNpbmcgY29kZSwgaXQncyB3cm9uZyBiZWNhdXNlIGl0IGRvZXMgbm90IHVzZQorCSAgdGhlIHN0cmlkZSBnaXZlbiBieSB0aGUgZHJpdmVyLgorCisyMDExLTA3LTEzIDExOjQwOjExICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiB1c2UgZXJybm8KKworMjAxMS0wNy0xMyAxMTozNjo1NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogaGFuZGxlIEVJTlZBTCB3aXRob3V0IHBvc3RpbmcgYSB3YXJuaW5nCisJICBFSU5WQUwgbWVhbnMgdGhhdCBhIGNhbGwgaXMgbm90IHN1cHBvcnRlZCwgd2Ugb25seSB3YW50IHRvIHBvc3QgYSBXQVJOSU5HIHdoZW4KKwkgIHNvbWV0aGluZyBpcyByZWFsbHkgd3JvbmcuCisKKzIwMTEtMDctMTMgMTE6Mjk6MjYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IG9ubHkgc2V0IGZyYW1lcmF0ZSBmb3IgY2FwdHVyZSBmb3Igbm93CisKKzIwMTEtMDctMTMgMTE6MTk6MjggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmg6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmg6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmg6CisJICB2NGwyOiBNb3ZlIGNvbmZpZ3VyYXRpb24gb2YgZnJhbWVyYXRlIHRvIF9zZXRfZm9ybWF0CisJICBNb3ZlIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBmcmFtZXJhdGUgdG8gd2hlcmUgd2Ugc2V0IHRoZSBvdGhlciBmb3JtYXQKKwkgIHBhcmFtZXRlcnMuCisJICBSZW1vdmUgaGFjayB0byBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIGFjdGl2ZS4KKwkgIFN0b3JlIHN0cmVhbXBhcm0gaW4gdGhlIGRldmljZSBpbmZvLgorCSAgVXNlIHNvbWUgbWFjcm9zIHRvIGFjY2VzcyB0aGUgY3VycmVudCBkZXZpY2UgY29uZmlndXJhdGlvbi4KKwkgIFJlbW92ZSBzb21lIGR1cGxpY2F0ZSBmaWVsZHMgaW4gc3JjIGFuZCBzaW5rIGFuZCB1c2UgdGhlIGRldmljZSBjb25maWd1cmF0aW9uCisJICBpbnN0ZWFkLgorCisyMDExLTA3LTEyIDE5OjEzOjQ1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBmaXggcmV0dXJuIHZhbHVlLi4uCisKKzIwMTEtMDctMTIgMTk6MDM6MzIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmg6CisJICB2NGwyOiBzaW1wbGlmeSBzZXR0aW5nIHRoZSBjYXB0dXJlIGZvcm1hdAorCSAgUGFzcyB0aGUgY2FwcyB0byB0aGUgc2V0X2Zvcm1hdCBmdW5jdGlvbiBhbmQgbWFrZSBfc2V0X2Zvcm1hdCBwYXJzZSB0aGUgY2Fwcy4KKwkgIEFsc28ga2VlcCB0aGUgcGFyc2VkIHZhbHVlcyBpbiB0aGUgdjRsMm9iamVjdCBzbyB0aGF0IHdlIGNhbiByZWZlciB0byB0aGVtIHdoZW4KKwkgIHdlIHdhbnQuCisKKzIwMTEtMDctMTIgMTg6NDE6NDcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuaDoKKwkgIHY0bDI6IHJlbW92ZSBtb3JlIHVudXNlZCBwYXJhbWV0ZXJzCisKKzIwMTEtMDctMTIgMTg6Mjk6MzUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDogaGFuZGxlIG9iamVjdCBvdXQgb2YgdGhlIG5vcm1hbCBmbG93CisKKzIwMTEtMDctMTIgMTg6MTM6NDIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDI6IExldCB0aGUgYnVmZmVycG9vbCBvd24gdGhlIFY0bDJPYmplY3QKKwkgIEtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIGZvcm1hdCBhbmQgc2V0dGluZyBpbiB0aGUKKwkgIHY0bDJvYmplY3QuCisJICBQYXNzIHRoZSB2NGwyb2JqZWN0IHRvIHRoZSBidWZmZXJwb29sIGNvbnN0cnVjdG9yIHNvIHRoYXQgdGhlIGJ1ZmZlcnBvb2wgY2FuCisJICBrbm93IGV2ZXJ5dGhpbmcgYWJvdXQgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIHNldHRpbmdzLiBUaGlzIGFsc28gYWxsb3dzIHVzCisJICB0byByZW1vdmUgc29tZSBhd2t3YXJkIGNvZGUuCisKKzIwMTEtMDctMTIgMTc6MDY6NDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDogcmVtb3ZlIGNhcHMgYXJndW1lbnQsIGl0J3Mgbm90IG5lZWRlZAorCSAgUmVtb3ZlIHRoZSBjYXBzIHBhcmFtZXRlciwgd2UgZG9uJ3QgbmVlZCBpdCBhbnltb3JlIGJlY2F1c2Ugd2UgZG9uJ3Qgc2V0CisJICBjYXBzIG9uIGJ1ZmZlcnMgYW55bW9yZS4KKworMjAxMS0wNy0xMiAxNjo0NjoyMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDogcGFzcyB0aGUgYnl0ZXNwZXJsaW5lIGFyb3VuZAorCSAgV2hlbiBzZXR0aW5nIGEgZm9ybWF0LCByZXR1cm4gdGhlIGJ5dGVzcGVybGluZSB0byB0aGUgY2FsbGVyIHNvIHRoYXQgaXQgY2FuIGJlCisJICB1c2VkIHRvIGFsbG9jYXRlIGJ1ZmZlcnMuCisKKzIwMTEtMDctMTIgMTY6NDM6MDQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICBwb29sOiBtYWtlIGJ1ZmZlciB3cml0YWJsZQorCSAgV2UgbmVlZCB3cml0YWJsZSBidWZmZXJzIHdoZW4gd2UgbmVlZCB0byBkbyBhIHNsb3cgbWVtY3B5LgorCisyMDExLTA3LTEyIDE1OjA0OjM4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IHNlZWtpbmcgcmVncmVzc2lvbgorCSAgLi4uIGludHJvZHVjZWQgd2hlbiBzaHVmZmxpbmcgYXJvdW5kIGNvZGUgZm9yIHRoZSBhc3luYyBpbXBsZW1lbnRhdGlvbgorCSAgYnkgc2V0dGluZyBzdGF0ZSBvZiBzb3VyY2UgKGFuZCB1ZHAgc291cmNlcykgaW4gX3BsYXkgYmVmb3JlIGRvd25zdHJlYW0KKwkgIGZsdXNoaW5nIGlzIHVuZG9uZS4KKworMjAxMS0wNy0xMSAxNToyMzo0MSArMDMwMCAgUmVuw6kgU3RhZGxlciA8cmVuZS5zdGFkbGVyQG5va2lhLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5oOgorCSAgYWMzcGFyc2U6IGZpeCBidWZmZXIgZHVyYXRpb24gb24gYmxvY2tzLXBlci1mcmFtZSBjaGFuZ2UKKwkgIFRoZSBnc3RfYmFzZV9wYXJzZV9zZXRfZnJhbWVfcmF0ZSBjYWxsIHdhcyBwcmVkaWNhdGVkIG9uIGEgY2hhbmdlIHRvCisJICBzYW1wbGUgcmF0ZSwgZHVyYXRpb24gb3IgcHJvZmlsZS4gSG93ZXZlciwgdGhlIGJsb2NrIGNvdW50IHBlciBmcmFtZSBjYW4KKwkgIGFsc28gY2hhbmdlIGJldHdlZW4gcGFja2V0cywgd2hpY2ggd291bGQgcmVzdWx0IGluIGluY29ycmVjdCBidWZmZXIKKwkgIGR1cmF0aW9ucy4KKworMjAxMS0wNy0xMSAxMzo1MTo1MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDJzaW5rOiBoYW5kbGUgcG9vbHMKKwkgIENyZWF0ZSBhIG5ldyBwb29sIGluIHNldGNhcHMgYW5kIHN0b3AvZGVzdHJveSB0aGUgb2xkIG9uZS4KKwkgIFJlbW92ZSBidWZmZXJfYWxsb2MgZnVuY3Rpb25zLgorCSAgQ2hlY2sgdGhhdCB3ZSBoYXZlIHY0bDIgbWV0YWRhdGEgaW4gc2hvd19mcmFtZSBhbmQgZmFsbCBiYWNrIHRvIG1lbWNweSBpbnRvIGEKKwkgIGJ1ZmZlciBmcm9tIG91ciBwb29sIGlmIHdlIGRvbid0IHJlY2VpdmUgb25lIG9mIG91ciBvd24gYnVmZmVycy4KKworMjAxMS0wNy0xMSAxMjowNDo1NyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSAgdjRsMjogdmFyaW91cyBjbGVhbnVwcworCSAgVmFyaW91cyBjbGVhbnVwcywgYXZvaWRzIHVzZWxlc3MgY2FzdHMsIG1vdmUgZXJyb3IgaGFuZGxpbmcgb3V0c2lkZSBvZiB0aGUgbWFpbgorCSAgY29kZSBmbG93LgorCSAgTmVnb3RpYXRlIHRvIGEgcmVzb25hYmxlIHJlc29sdXRpb24gaW5zdGVhZCBvZiB0aGUgbWF4IHJlc29sdXRpb24uCisKKzIwMTEtMDctMTAgMjE6NTA6MTkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFjZWxwZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWRtZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc2lyZW5kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5Lmg6CisJICBydHA6IHBvcnQgcmVtYWluaW5nIHRvIDAuMTEKKworMjAxMS0wNy0xMCAxNDo1NjowMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkqIHN5cy94aW1hZ2UveGltYWdldXRpbC5jOgorCSAgeGltYWdlOiBwb3J0IHRvIDAuMTEKKworMjAxMS0wNy0xMCAxMzo0NDo0OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmg6CisJICB5NG06IHBvcnQgc29tZSBtb3JlCisJICBVc2UgdmlkZW8gaGVscGVycy4KKworMjAxMS0wNy0xMCAxMzoyODoyNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIHk0bTogcG9ydCB0byAwLjExCisKKzIwMTEtMDctMTAgMTI6NDY6MDMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5oOgorCSAgbXVsdGlwYXJ0OiBwb3J0IHRvIDAuMTEKKworMjAxMS0wNy0xMCAxMTo0MjozNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDExLTA3LTEwIDExOjQwOjQwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVidWd1dGlscy9NYWtlZmlsZS5hbToKKwkqIGdzdC9kZWJ1Z3V0aWxzL2JyZWFrbXlkYXRhLmM6CisJKiBnc3QvZGVidWd1dGlscy9lZmVuY2UuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNzZXR0ZXIuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdGRlYnVnLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZpZ2F0aW9udGVzdC5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2aWdhdGlvbnRlc3QuaDoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHB1c2hmaWxlc3JjLmM6CisJKiBnc3QvZGVidWd1dGlscy9wcm9ncmVzc3JlcG9ydC5jOgorCSogZ3N0L2RlYnVndXRpbHMvcm5kYnVmZmVyc2l6ZS5jOgorCSogZ3N0L2RlYnVndXRpbHMvdGVzdHMuYzoKKwkgIGRlYnVnOiBwb3J0IHRvIDAuMTEsIGRpc2FibGUgb3RoZXJzCisJICBEaWFzYWJsZSB0aGUgZWZlbmNlIGFuZCBjYXBzZGVidWcgZWxlbWVudHMsIHBvcnQgdGhlbSBsYXRlci4KKworMjAxMS0wNy0wOSAxOToyMzo0MSAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5oOgorCSAgbXVsdGlmaWxlc3JjOiBJbXByb3ZlIGxvb3BpbmcKKwkgIEFkZCBzdGFydC1pbmRleCBhbmQgc3RvcC1pbmRleCBwcm9wZXJ0aWVzLgorCisyMDExLTA2LTE2IDEzOjU3OjAzICswMTAwICBKb25ueSBMYW1iIDxqb25ueWxhbWJAam9ubnlsYW1iLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmg6CisJICBtdWx0aWZpbGU6IGFkZCBsb29wIHByb3BlcnR5IHRvIG11bHRpZmlsZXNyYworCSAgRml4ZXM6ICM2NTI3MjcKKwkgIFNpZ25lZC1vZmYtYnk6IEpvbm55IExhbWIgPGpvbm55bGFtYkBqb25ueWxhbWIuY29tPgorCSAgU2lnbmVkLW9mZi1ieTogRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKzIwMDktMTEtMjAgMTA6MDc6NDMgKzAxMDAgIFBoaWxpcCBKw6RnZW5zdGVkdCA8cGhpbGlwakBvcGVyYS5jb20+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIGRpcmVjdHNvdW5kc2luazogMTYtYml0IGF1ZGlvIGlzIHNpZ25lZCwgOC1iaXQgaXMgdW5zaWduZWQuCisJICBQcmV0ZW5kaW5nIHRvIGhhbmRsZSA4LWJpdCBzaWduZWQgY2F1c2VzIGRpc3RvcnRlZCBhdWRpbyB3aGVuCisJICBhY3R1YWxseSBnaXZlbiBzdWNoIGF1ZGlvLCB3aGljaCB5b3Ugd2lsbCBnZXQgaWYgcGFzc2luZyA4LWJpdAorCSAgdW5zaWduZWQgdGhyb3VnaCBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlLCBhcyBhdWRpb3Jlc2FtcGxlCisJICBvbmx5IGhhbmRsZXMgOC1iaXQgc2lnbmVkLiAgRml4ZXMgIzYwNTgzNC4KKwkgIFNpZ25lZC1vZmYtYnk6IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisyMDExLTA3LTA4IDE2OjM3OjExICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMjogZml4IGdyYXkgZm9ybWF0LCB1c2UgZmlsdGVyIGluIGdldGNhcHMKKworMjAxMS0wNy0wOCAxNjoxMDo0NyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDI6IHBvcnQgYW5kIGVuYWJsZSB2NGwyc2luaworCisyMDExLTA3LTA4IDE0OjM0OjQwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBwb3J0IHRvIG5ldyB2aWRlbyBmb3JtYXRzCisKKzIwMTEtMDctMDggMTI6NTE6MTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0wNy0wOCAxMjo0OToxMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwycmFkaW8uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDI6IHBvcnQgdG8gMC4xMQorCisyMDExLTA3LTA3IDE4OjI3OjM2ICswMjAwICBBbGV4ZXkgRmlzaGVyIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogaGFuZGxlIGJsb2NrcyB3aXRoIGR1cmF0aW9uPTAKKwkgIFNvbWUgdmlkZW8gZnJhbWVzLCBmb3IgZXhhbXBsZSBhbHQtcmVmIGZyYW1lIGluIFZQOCwgd2lsbCBiZQorCSAgbmV2ZXIgZGlzcGxheWVkLiBUaGlzIGlzIHdoeSBpdCBoYXMgZHVyYXRpb249MC4KKwkgIFRoaXMgcGF0Y2ggYWxsb3cgdG8gdXNlIHRoaXMgZHVyYXRpb24uCisJICBCdWc6IDY1NDE3NQorCSAgU2lnbmVkLW9mZi1ieTogQWxleGV5IEZpc2hlciA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisyMDExLTA3LTA2IDE3OjE4OjA1IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eG1hcC5jOgorCSAgcXRtdXg6IEFkZCBkaXJlY3QgZGlyYWMgbWFwcGluZworCisyMDExLTA3LTA3IDE3OjU5OjA0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RyaXBwbGUuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJpcHBsZS5oOgorCSAgZWZmZWN0djogcG9ydCBsYXN0IGVmZmVjdHYgZWxlbWVudCB0byAwLjExCisKKzIwMTEtMDctMDcgMTc6NDk6MzQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHN0cmVhay5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c3RyZWFrLmg6CisJICBlZmZlY3R2OiBwb3J0IHN0cmVha3R2IHRvIDAuMTEKKworMjAxMS0wNy0wNyAxNzo0MDoyMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5oOgorCSAgZWZmZWN0djogcG9ydCByYWRpb2FjdHYgdG8gMC4xMQorCisyMDExLTA3LTA3IDE3OjI5OjU4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJldi5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmlwcGxlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzdHJlYWsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkgIGVmZmVjdHY6IGZpeCBkb2NzCisKKzIwMTEtMDctMDcgMTc6Mjk6NDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdG9wLmM6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5oOgorCSAgZWZmZWN0djogcG9ydCBvcCB0byAwLjExCisKKzIwMTEtMDctMDcgMTc6MTg6MjEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmV2LmM6CisJICBlZmZlY3R2OiBwb3J0IHF1YXJrIHR2CisKKzIwMTEtMDctMDcgMTY6NTc6MzkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHJldi5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmV2Lmg6CisJICBlZmZlY3R2OiBwb3J0IHJldnR2IHRvIDAuMTEKKworMjAxMS0wNy0wNyAxNjo0Njo1MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5oOgorCSAgZWZmZWN0djogcG9ydCB2ZXJ0aWdvdHYgdG8gMC4xMQorCisyMDExLTA3LTA3IDE2OjM4OjEwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5oOgorCSAgZWZmZWN0djogcG9ydCBzaGFnYWRlbGljdHYgdG8gMC4xMQorCisyMDExLTA3LTA3IDExOjIyOjI2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSAgYXVwYXJzZTogdXNlIEFMV0FZUyBzcmMgcGFkIHJhdGhlciB0aGFuIFNPTUVUSU1FUworCisyMDExLTA3LTA3IDExOjE0OjE2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSAgYXVwYXJzZTogcG9ydCB0byAwLjExCisKKzIwMTEtMDctMDYgMTk6MDM6NTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJICBzaGFwZXdpcGU6IGJlZ2lubmluZ3Mgb2YgcG9ydGluZworCisyMDExLTA3LTA2IDE4OjUwOjI2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3R3YXJwLmM6CisJKiBnc3QvZWZmZWN0di9nc3R3YXJwLmg6CisJICB3YXJwdHY6IHBvcnQgdG8gMC4xMQorCisyMDExLTA3LTA2IDE4OjUwOjE1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJICBkaWNlOiBrZWVwIHRyYWNrIG9mIGluZm8KKworMjAxMS0wNy0wNiAxODozMjo0NSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5oOgorCSAgZWZmZWN0djogcG9ydCBkaWNlCisKKzIwMTEtMDctMDYgMTg6MDk6NDkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5oOgorCSAgZWZmZWN0djogcG9ydCBhZ2luZ3R2CisKKzIwMTEtMDctMDYgMTc6NTA6NTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hYWxpYi9NYWtlZmlsZS5hbToKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzoKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuaDoKKwkgIGFhc2luazogcG9ydCB0byBuZXcgdmlkZW8gQVBJCisKKzIwMTEtMDctMDYgMTc6NDA6MjAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9saWJjYWNhL01ha2VmaWxlLmFtOgorCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzoKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmg6CisJICBjYWNhc2luazogcG9ydCB0byAwLjExCisKKzIwMTEtMDctMDYgMTY6NTA6MzIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWc6IGJlZ2lubmluZ3Mgb2YgcG9ydGluZyB0byAwLjExCisKKzIwMTEtMDctMDYgMTY6MzE6MTggKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiB1c2UgQUxXQVlTIHNvdXJjZSBwYWQgcmF0aGVyIHRoYW4gU09NRVRJTUVTCisKKzIwMTEtMDctMDYgMTY6MTA6MzQgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5oOgorCSAgd2F2cGFyc2U6IHBvcnQgdG8gMC4xMQorCisyMDExLTA3LTA2IDE2OjEwOjIzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkgIHdhdmVuYzogcG9ydCB0byAwLjExCisKKzIwMTEtMDctMDYgMTI6MjI6NDMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFkanVzdCB0byB1bnNpZ25lZCBzZWdtZW50IGZpZWxkcworCisyMDExLTA3LTA2IDE1OjU3OjIzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgc3BlZXg6IHBvcnQgc3BlZXggZWxlbWVudHMKKworMjAxMS0wNy0wNiAxMjowNToxMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDExLTA3LTA2IDEwOjExOjUyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwbWFuYWdlcjogcG9ydCB0byAwLjExCisJICAqIHVzZSBHX0RFRklORV9UWVBFCisJICAqIGFkanVzdCB0byBuZXcgR3N0QnVmZmVyIGFuZCBjb3JyZXNwb25kaW5nIHJ0cCBhbmQgcnRjcCBidWZmZXIgaW50ZXJmYWNlcworCSAgKiBtaXNjIGNhcHMgYW5kIHNlZ21lbnQgaGFuZGxpbmcgY2hhbmdlcworCSAgRklYTUU6IGFsc28gcmVsaWVzIG9uIGJlaW5nIGFibGUgdG8gcGFzcyBjYXBzIGFsb25nIHdpdGggYSBidWZmZXIsCisJICB3aGljaCBoYXMgbm8gZXZpZGVudCBlcXVpdmFsZW50IHlldCwgc28gdGhhdCBlaXRoZXIgbmVlZHMgb25lLAorCSAgb3Igc3RpbGwgbmVlZHMgcXVpdGUgc29tZSBjb2RlIHBhdGggbW9kaWZpY2F0aW9uIHRvIGRyYWcgYWxvbmcgY2Fwcy4KKworMjAxMS0wNi0yOSAyMDo1OToyNiArMDMwMCAgUmVuw6kgU3RhZGxlciA8cmVuZS5zdGFkbGVyQG5va2lhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSAgcHVsc2VzaW5rOiBwcmV2ZW50IHJhY2UgY29uZGl0aW9uIGNhdXNpbmcgcmVmIGxlYWsKKwkgIFNpbmNlIGNvbW1pdCA4YmZkODAsIGdzdF9wdWxzZXJpbmdidWZmZXJfc3RvcCBkb2Vzbid0IHdhaXQgZm9yIHRoZQorCSAgZGVmZXJyZWQgY2FsbCB0byBiZSBydW4gYmVmb3JlIHJldHVybmluZy4gVGhpcyBjYXVzZXMgYSByYWNlIHdoZW4KKwkgIFJFQURZLT5OVUxMIGlzIGV4ZWN1dGVkIHNob3J0bHkgYWZ0ZXIsIHdoaWNoIHN0b3BzIHRoZSBtYWlubG9vcC4gVGhpcworCSAgbGVha3MgdGhlIGVsZW1lbnQgcmVmZXJlbmNlIHdoaWNoIGlzIHBhc3NlZCBhcyB1c2VyZGF0YSBmb3IgdGhlIGNhbGxiYWNrCisJICAoaW50cm9kdWNlZCBpbiBjb21taXQgN2NmOTk2LCBidWcgIzYxNDc2NSkuCisJICBUaGUgY29ycmVjdCBmaXggaXMgdG8gd2FpdCBpbiBSRUFEWS0+TlVMTCBmb3IgYWxsIG91dHN0YW5kaW5nIGNhbGxzIHRvCisJICBiZSBmaXJlZCAoc2luY2UgbGlicHVsc2UgZG9lc24ndCBwcm92aWRlIGEgRGVzdHJveU5vdGlmeSBmb3IgdGhlCisJICB1c2VyZGF0YSkuIFdlIGdldCByaWQgb2YgdGhlIHJlZmVyZW5jZSBwYXNzaW5nIGZyb20gN2NmOTk2IGFsdG9nZXRoZXIsCisJICBzaW5jZSBmaW5hbGl6YXRpb24gZnJvbSB0aGUgY2FsbGJhY2sgd291bGQgYW55d2F5cyBsZWFkIHRvIGEgZGVhZGxvY2suCisJICBSZS1maXhlcyBidWcgIzYxNDc2NS4KKworMjAxMS0wNy0wNCAwODo1ODoxNCArMDMwMCAgUmVuw6kgU3RhZGxlciA8cmVuZS5zdGFkbGVyQG5va2lhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBzbWFsbCBjbGVhbnVwIG9mIGNvcHktcGFzdGUgY29kZQorCisyMDExLTA2LTI5IDE5OjUwOjQyICswMzAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAbm9raWEuY29tPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJICBwdWxzZXNpbms6IHJlbW92ZSB1bnVzZWQgbWVtYmVyIHZhcmlhYmxlIGFuZCBtaXNsZWFkaW5nIGxvZyBtZXNzYWdlCisJICBXaW0gY2hhbmdlZCBpdCBpbiBjb21taXQgOGJmZDgwIHNvIHRoYXQgcGFfZGVmZXJfcmFuIGlzIG5vdCByZWFkCisJICBhbnl3aGVyZS4KKwkgIFRoZSBsb2cgbWVzc2FnZSB1c2VkIHRvIGFubm90YXRlIGEgbWFpbmxvb3Bfd2FpdCBjYWxsIHdoaWNoIGlzIGdvbmUuCisKKzIwMTEtMDctMDUgMTU6Mzc6NTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkgIHZpZGVvZmxpcDogZml4IGNhcHMKKworMjAxMS0wNy0wNSAxMTo0MDo1NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5oOgorCSAgZWZmZWN0djogcG9ydCBlZGdldHYKKworMjAxMS0wNy0wNSAxMDoxMjoyNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEFkZCAtREdTVF9VU0VfVU5TVEFCTEVfQVBJIHRvIHRoZSBjb21waWxlciBmbGFncyB0byBhdm9pZCB3YXJuaW5ncworCisyMDExLTA3LTA0IDEyOjU4OjM4IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSAgZ29vbTogRG9uJ3QgYW5zd2VyIGxhbnRlbmN5IHF1ZXJpZXMgYmVmb3JlIG5lZ290aWF0aW9uCisKKzIwMTEtMDctMDQgMTg6MTU6NDIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcDogcG9ydCB0byBuZXcgQVBJCisKKzIwMTEtMDctMDQgMTg6MTI6NTYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZW1peGVyLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlOiByZW1vdmUgaW1wbGVtZW50c2ludGVyZmFjZQorCisyMDExLTA3LTA0IDE4OjEwOjU1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkgIGFscGhhOiBmaXggY2FwcworCisyMDExLTA3LTA0IDE4OjA2OjQ4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5oOgorCSAgYWxwaGE6IHBvcnQgdG8gbmV3IHZpZGVvIEFQSQorCisyMDExLTA3LTA0IDE3OjAwOjM0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkgIGFscGhhOiBtb3JlIHBvcnRpbmcKKworMjAxMS0wNy0wNCAxNjowOTozMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuaDoKKwkgIHBvcnQgdG8gbmV3IHZpZGVvIGFwaQorCisyMDExLTA2LTI4IDE0OjAzOjQzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5oOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5oOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5oOgorCSAgdmlkZW86IHBvcnQgdG8gbmV3IHZpZGVvIGFwaXMKKworMjAxMS0wNy0wNCAxNDozMDowOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGF2b2lkIGNyYXNoaW5nIG9uIGludmFsaWQgaW5wdXQgd2l0aG91dCBjb21wb25lbnRzCisKKzIwMTEtMDctMDQgMTE6MDk6MTkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4Lmg6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2OiBwb3J0IHRvIDAuMTEKKwkgICogdXNlIEdfREVGSU5FX1RZUEUKKwkgICogYWRqdXN0IHRvIG5ldyBHc3RCdWZmZXIKKwkgICogbWlzYyBzZWdtZW50IGFuZCBjYXBzIGNoYW5nZXMKKworMjAxMS0wNy0wNCAxMTo0ODoxMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIGV4dC9wdWxzZS9wdWxzZXNpbmsuYworCisyMDExLTA3LTA0IDExOjI1OjI4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogcGFzcyBhbG9uZyBzZWdtZW50IGluZm8gdG8gY29sbGVjdHBhZHMKKwkgIC4uLiBzbyBpdCBjYW4gdHJhY2sgdGhpcyBhbmQgYmUgc3Vic2VxdWVudGx5IHVzZWQgdG8gZGV0ZXJtaW5lIHJ1bm5pbmcgdGltZSBldGMuCisKKzIwMTEtMDctMDQgMTE6MjQ6MjMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogaW5kaWNhdGUgcmF3IGZvcm1hdCBpbiBhYWMgY2FwcworCisyMDExLTA3LTA0IDExOjA3OjEzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IG1pbmQgcmVxdWVzdGVkIG5hbWUgZm9yIHJlcXVlc3QgcGFkCisKKzIwMTEtMDctMDQgMTE6MDY6NTQgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogZnJlZSBzY2hlZHVsaW5nIHF1ZXJ5CisKKzIwMTEtMDctMDMgMTk6NTE6MzIgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvcHVsc2UvcGx1Z2luLmM6CisJICBwdWxzZTogSW5jcmVhc2UgcmFua3MgdG8gUFJJTUFSWSArIDEwCisJICBTbyB0aGF0IHB1bHNlc3JjL3B1bHNlc2luayBnZXQgY2hvc2VuIG92ZXIgb3RoZXIgcG9zc2libGUgUFJJTUFSWQorCSAgc3JjL3NpbmtzIGJ5IGF1dG9hdWRpb3NpbmsuICBQcmVzdW1hYmx5LCBpZiBwdWxzZSBpcyBhdmFpbGFibGUsIGl0CisJICBpcyBhbHdheXMgcHJlZmVycmVkIG92ZXIgYW5vdGhlciBzcmMvc2luay4KKwkgIEZpeGVzOiAjNjQ3NTQwLgorCisyMDExLTA2LTMwIDE4OjQ3OjQ4IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzoKKwkgIG11bHRpcGFydG11eDogQWRkIFxyXG4gdG8gdGFpbCBvZiBwdXNoZWQgYnVmZmVycworCSAgQ2xpZW50cyBzdWNoIGFzIEZpcmVmb3ggcmVxdWlyZSB0aGUgXHJcbiBhZnRlciB0aGUgcGF5bG9hZC4KKworMjAxMS0wNi0xNiAxNDo1Mjo1MSArMDIwMCAgQnJhbmtvIFN1YmFzaWMgPGJyYW5rb0BheGlzLmNvbT4KKworCSogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBhdm9pZCBsb29waW5nIHdoZW4gc2VhcmNoaW5nIGZvciBjbHVzdGVycworCSAgRml4ZXMgc29tZSBidWdzIHRoYXQgcmVzdWx0cyBpbiB0aGUgZGVtdXhlciBsb29waW5nIHdoZW4gc2VhY2hpbmcKKwkgIGZvciBjbHVzdGVycyBpbiBub24tZmluYWxpemVkIGZpbGVzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MjE5NQorCisyMDExLTA2LTMwIDEyOjMwOjIyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOgorCSAgbXVsdGlmaWxlOiBwb3J0IHRvIDAuMTAKKwkgICogdXNlIEdfREVGSU5FX1RZUEUKKwkgICogYWRqdXN0IHRvIG5ldyBHc3RCdWZmZXIKKwkgICogbWlzYyBjYXBzIGhhbmRsaW5nCisKKzIwMTEtMDYtMzAgMTE6MzU6MjEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOgorCSAgY3V0dGVyOiBwb3J0IHRvIDAuMTEKKwkgICogdXNlIEdfREVGSU5FX1RZUEUKKwkgICogYWRqdXN0IHRvIG5ldyBHc3RCdWZmZXIKKwkgICogbWlub3IgbWlzYworCisyMDExLTA2LTMwIDExOjE3OjE5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmdhbmFseXNpcy5jOgorCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmdsaW1pdGVyLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ3ZvbHVtZS5jOgorCSAgcmVwbGF5Z2FpbjogcG9ydCB0byAwLjExCisJICAqIHVzZSBHX0RFRklORV9UWVBFCisJICAqIGFkanVzdCB0byBuZXcgR3N0QnVmZmVyCisKKzIwMTEtMDYtMzAgMTA6NTM6MDkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgIHNwZWN0cnVtOiByZW1vdmUgZGVwcmVjYXRlZCBwcm9wZXJ0eQorCisyMDExLTA2LTMwIDEwOjUxOjU1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBzcGVjdHJ1bTogcG9ydCB0byAwLjExCisJICAqIHVzZSBHX0RFRklORV9UWVBFCisJICAqIGFkanVzdCB0byBuZXcgR3N0QnVmZmVyCisKKzIwMTEtMDYtMzAgMTA6Mzg6NDkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIGxldmVsOiBwb3J0IHRvIDAuMTEKKwkgICogdXNlIEdfREVGSU5FX1RZUEUKKwkgICogYWRqdXN0IHRvIG5ldyBHc3RCdWZmZXIKKworMjAxMS0wNi0zMCAxMDozMDoxNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjEwYmFuZHMuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5jOgorCSAgZXF1YWxpemVyOiBwb3J0IHRvIDAuMTEKKworMjAxMS0wNi0xMCAxODo1NDo0OCArMDUzMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkgIG1hdHJvc2thcGFyc2U6IGZpeCByZWZlcmVuY2UgY291bnRpbmcgb2YgcGFyc2UtPnN0cmVhbWhlYWRlcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MjI4NgorCSAgU2lnbmVkLW9mZi1ieTogRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKzIwMTEtMDYtMjkgMTQ6Mzk6NTIgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJICBqcGVnZW5jOiBEb24ndCByb3VuZCB1cCBzaXplIG9mIGVuY29kZWQgYnVmZmVycworCSAgRm9yIHNvbWUgcmVhc29uLCBpbiBjb2RlIGRhdGluZyB0byAyMDAxLCBlbmNvZGVkIGpwZWcgYnVmZmVycyB3ZXJlCisJICByb3VuZGVkIHVwIHRvIG11bHRpcGxlcyBvZiA0IGJ5dGVzLiAgV2l0aCB0aGUgYWRkZWQgYm9udXMgdGhhdCB0aGUKKwkgIGV4dHJhIGJ5dGVzIGFyZSB1bndyaXR0ZW4sIGNhdXNpbmcgdmFsZ3JpbmQgaXNzdWVzLiAgT29wcy4gIEkgY2FuJ3QKKwkgIHRoaW5rIG9mIGFueSByZWFzb24gd2h5IEpQRUcgYnVmZmVycyBuZWVkIHRvIGJlIG11bHRpcGxlcyBvZiA0IGJ5dGVzLAorCSAgc28gSSByZW1vdmVkIHRoZSBwYWRkaW5nLiAgVGhlcmUgbWlnaHQgYmUgc29tZSBjb2RlIHNvbWV3aGVyZSB0aGF0CisJICBkZXBlbmRzIG9uIHRoaXMgYmVoYXZpb3IsIHNvIGlmIHRoaXMgbmVlZHMgdG8gYmUgcmV2ZXJ0ZWQsIHBsZWFzZSBmaXgKKwkgIHRoZSB2YWxncmluZCBpc3N1ZXMuCisKKzIwMTEtMDYtMjkgMTI6NDY6MjAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L01ha2VmaWxlLmFtOgorCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSogZ3N0L2lzb21wNC9hdG9tc3JlY292ZXJ5LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bW9vdnJlY292ZXIuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXhtYXAuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cnRweHF0ZGVwYXkuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4Lmg6CisJICBpc29tcDQ6IHBvcnQgdG8gMC4xMQorCisyMDExLTA2LTI4IDEyOjU1OjQ1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHR3ZWFrIHNvbWUgcG9ydGVkIHNlZ21lbnQgaGFuZGxpbmcKKwkgIC4uLiB0byBhdm9pZCBsb3NpbmcgZHVyYXRpb24gZHVyaW5nIHB1c2ggbW9kZSBzZWVraW5nLCBhbmQgdG8gcHJvcGVybHkKKwkgIGFjY3VtdWxhdGUgcnVubmluZyB0aW1lIHdoZW4gc2VnbWVudCBzZWVraW5nLgorCisyMDExLTA2LTI5IDEyOjA1OjA0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGZyZWUgZGF0ZSB0YWcKKworMjAxMS0wNi0yOCAxMjoyNjozNyArMDIwMCAgSm9uYXMgTGFyc3NvbiA8am9uYXMubGFyc3NvbkBoaXEuc2U+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBub3Qgc28gZ3JlZWR5IG1pbmltdW0gZnJhbWUgc2l6ZQorCSAgRml4ZXMgIzY1MzU1OS4KKworMjAxMS0wNi0yNSAxMTozOToyMyAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogcmVtb3ZlIG5vbi1wa2ctY29uZmlnIGNoZWNrIGZvciBzaG91dAorCSAgRml4ZXM6IDY1MzMyNworCisyMDExLTA2LTIwIDE4OjQ5OjU3ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPGFtb3JhbGVzQGZsdW1vdGlvbi5jb20+CisKKwkqIGV4dC9yYXcxMzk0L2dzdDEzOTRjbG9jay5jOgorCSAgZHYxMzk0c3JjOiBtYWtlIHRoZSBpbnRlcm5hbCBjbG9jayB0aHJlYWQgc2FmZQorCSAgRml4ZXM6ICM2NTMwOTEuCisKKzIwMTEtMDYtMjQgMTE6NTQ6MjkgKzAyMDAgIE1pZ3VlbCBBbmdlbCBDYWJyZXJhIE1veWEgPG1hZG1hYzI1MDFAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogcmV0dXJuIGNvcnJlY3QgdHlwZSB3aGVuIGFzc2VydGlvbiBmYWlscworCisyMDExLTA2LTIzIDExOjI4OjI3IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDY5Yjk4MWYgdG8gNjA1Y2Q5YQorCisyMDExLTA2LTIyIDE2OjQxOjEzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwOiBmaXggZm9yIHVyaSBjaGFuZ2VzCisKKzIwMTEtMDItMDIgMTY6MTg6NTQgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuaDoKKwkgIHB1bHNlOiBEcm9wIHN1cHBvcnQgZm9yIFBBIHZlcnNpb25zIGJlZm9yZSAwLjkuMTYKKwkgIFRoaXMgZHJvcHMgc3VwcG9ydCBmb2YgUHVsc2VBdWRpbyB2ZXJzaW9ucyBwcmlvciB0byAwLjkuMTYsIHdoaWNoIHdhcworCSAgcmVsZWFzZWQgYWJvdXQgMS41IHllYXJzIGFnby4gVGVzdGluZyB3aXRoIHZlcnkgb2xkIHZlcnNpb25zIGlzIG5vdAorCSAgZmVhc2libGUgYW5kIHdlIGRvbid0IHdhbnQgdG8gbWFpbnRhaW4gMiBpbmRlcGVuZGVudCBjb2RlLXBhdGhzLgorCisyMDExLTA2LTIxIDE4OjI0OjQxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBjb25maWd1cmUuYWMKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sCisKKzIwMTEtMDYtMjEgMTg6MTk6MDIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogZml4IGZvciBoZWFkZXIgY2xlYW51cHMKKworMjAxMS0wNi0yMSAxNToxNTowNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJICBydHBtcDRhZGVwYXk6IGZpeCBvdXRwdXQgYnVmZmVyIHRpbWVzdGFtcHMgaW4gY2FzZSBvZiBtdWx0aXBsZSBmcmFtZXMKKworMjAxMS0wNi0yMCAxNjo0NzozNiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogVGhlIHNpZ25hbCBoYXMgNSBhcmd1bWVudHMsIG5vdCA0CisKKzIwMTEtMDYtMjAgMTI6MTM6MTEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IHVzZSBzdHJpbmcgZm9yIHZpZGVvIGZvcm1hdCBub3cKKworMjAxMS0wNi0yMCAxMjowNDo0OCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9NYWtlZmlsZS5hbToKKwkgIGF2aTogbGluayBhZ2FpbnN0IGdzdHZpZGVvIG5vdworCisyMDExLTA2LTIwIDEyOjAzOjI0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpOiBwb3J0IHRvIG5ldyBjYXBzCisKKzIwMTEtMDYtMTggMTM6NDM6MDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJICBCdW1wIGdpdCB2ZXJzaW9uIGFmdGVyIHVucGxhbm5lZCAwLjEwLjMwIHJlbGVhc2UKKwkgIE1lcmdlIGJyYW5jaCAnMC4xMC4zMCcKKwkgIENvbmZsaWN0czoKKwkgIGNvbmZpZ3VyZS5hYworCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWwKKwkgIHdpbjMyL2NvbW1vbi9jb25maWcuaAorCisyMDExLTA2LTE3IDEwOjM3OjMzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5oOgorCSAgc3VuYXVkaW86IGZpeCB0eXBvIGluIGNvbW1lbnQKKworMjAxMS0wNi0xNyAxODoxMjo1MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDExLTA2LTE3IDE4OjExOjM4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkgIGF1dG9kZXRlY3Q6IGZpeCBjYXBzCisKKzIwMTEtMDYtMTYgMTU6Mzg6MTAgKzAyMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuZGViZXRoZW5jb3VydEBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJICBnb29tOiBmaXggdW51c2VkLWJ1dC1zZXQtY29tcGlsZXIgd2FybmluZ3MKKwkgIFJlbW92ZSB1bm5lY2Vzc2FyeSByZXMgdmFyaWFibGVzLCBjb3JlIGNoZWNrcyBleGlzdGFuY2UKKwkgIGFuZCB0eXBlIG9mIHRoZXNlIGZpZWxkcyBmb3IgdXMgYWxyZWFkeSB2aWEgdGhlIHRlbXBsYXRlCisJICBjYXBzLCBhbmQgd2Uga25vdyB0aGF0IHRoZXNlIGZpZWxkcyBleGlzdCBiZWNhdXNlIHdlJ3ZlCisJICBmaXhhdGVkIHRoZW0gYmVmb3JlIGluIF9uZWdvdGlhdGUoKS4KKworMjAxMS0wNi0xNyAwMzowNzowOSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uYzoKKwkgIGF1ZGlvZWNobzogZml4IHBhcmFtIGZsYWdzCisJICBJZiB0aGUgcGFyYW1ldGVyIGNhbm5vdCBiZSBjaGFuZ2VkIGluIHBhdXNlZCZwbGF5aW5nLCBpdCBpcyBub3QgY29udHJvbGFibGUuIFNldAorCSAgdGhlIGFwcHJvcHJpYXRlIG11dGFiaWxpdHkgZmxhZyBpbnN0ZWFkLgorCis9PT0gcmVsZWFzZSAwLjEwLjMwID09PQorCisyMDExLTA2LTE1IDIzOjU3OjM0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAwLjEwLjMwCisJICBUaGlzIGlzIGFuIGFkLWhvYyByZWxlYXNlIHRoYXQgaXMgYWxtb3N0IGlkZW50aWNhbCB0byAwLjEwLjI5OgorCSAgKiB3b3JrIGFyb3VuZCBHTGliIGF0b21pYyBvcHMgQVBJIGNoYW5nZQorCSAgKiBiZXR0ZXIgaGFuZGxpbmcgb2YgbWFsZm9ybWVkIGJ1ZmZlcnMgaW4gUlRQIGRlcGF5bG9kZXJzCisJICAqIHNvbWUgbWlub3IgY29tcGlsYXRpb24gZml4ZXMKKworMjAxMS0wNi0wOCAxODozMzoxMCArMDMwMCAgUmFpbW8gSsOkcnZpIDxyYWltby5qYXJ2aUBnbWFpbC5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuaDoKKwkgIHVkcDogRml4IGNvbXBpbGVyIHdhcm5pbmcgb24gbWluZ3ctdzY0CisJICBGaXhlczogIzY1MjE0NC4KKwkgIGdzdHVkcG5ldHV0aWxzLmg6MzI6MDogZXJyb3I6ICJXSU5WRVIiIHJlZGVmaW5lZAorCSAgL3Vzci9pNjg2LXc2NC1taW5ndzMyL3N5cy1yb290L21pbmd3L2luY2x1ZGUvX21pbmd3Lmg6MjMxOjA6IG5vdGU6IHRoaXMgaXMgdGhlCisJICBsb2NhdGlvbiBvZiB0aGUgcHJldmlvdXMgZGVmaW5pdGlvbgorCisyMDExLTA2LTA0IDEzOjQ5OjUyIC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSAgaW50ZXJsZWF2ZTogV29yayBhcm91bmQgY2hhbmdlcyBpbiBnX2F0b21pYyBBUEkKKwkgIFNlZSAjNjUxNTE0IGZvciBkZXRhaWxzLgorCisyMDExLTA1LTE4IDEyOjM2OjQwICswMjAwICBKb3NlIEFudG9uaW8gU2FudG9zIENhZGVuYXMgPHNhbnRvc2NhZGVuYXNAZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkgIHJ0cDogRml4IHNlZ21lbnRhdGlvbiBmYXVsdCBwcm9jZXNzaW5nIHBheWxvYWQgYnVmZmVycworCSAgVGhpcyBjb21taXQgY2hlY2tzIGlmIHRoZSB2YWx1ZSByZXR1cm5lZCBieQorCSAgZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfYnVmZmVyIGFuZAorCSAgZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfc3ViYnVmZmVyIGlzIE5VTEwgYmVmb3JlIHVzaW5nIGl0LgorCisyMDExLTA1LTE2IDA5OjA0OjMxICswMjAwICBQaW5vIFRvc2Nhbm8gPHRvc2Nhbm8ucGlub0B0aXNjYWxpLml0PgorCisJKiBleHQvcHVsc2UvcHVsc2V1dGlsLmM6CisJICBwdWxzZTogRGVmaW5lIFBBVEhfTUFYIGlmIGl0IGlzbid0IGRlZmluZWQKKwkgIEdOVSBIdXJkIGZvciBleGFtcGxlIGRvZXNuJ3QgZGVmaW5lIGl0LgorCisyMDExLTA0LTI5IDA4OjU1OjE5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkgIHdhdmVuYzogQWxsb3cgc2V0Y2FwcyB0byBiZSBjYWxsZWQgYWZ0ZXIgYSBmb3JtYXQgd2FzIG5lZ290aWF0ZWQgaWYgaXQncyBjb21wYXRpYmxlCisJICBPdGhlcndpc2Ugd2F2ZW5jIHdpbGwgZmFpbCBpZiB1cHN0cmVhbSBkZWNpZGVzIHRvIHNldCBlcXVpdmFsZW50IGNhcHMgb3IgY2FwcworCSAgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGxhdGVyLgorCSAgVGhhbmtzIHRvIEFsZXhhbmRlciBTY2hyZW1tZXIgZm9yIGZpbmRpbmcgdGhpcyBidWcuCisKKzIwMTEtMDYtMTUgMTU6MDY6MjMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBSRVFVSVJFTUVOVFM6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L2VzZC9NYWtlZmlsZS5hbToKKwkqIGV4dC9lc2QvZXNkbW9uLmM6CisJKiBleHQvZXNkL2VzZG1vbi5oOgorCSogZXh0L2VzZC9lc2RzaW5rLmM6CisJKiBleHQvZXNkL2VzZHNpbmsuaDoKKwkqIGV4dC9lc2QvZ3N0ZXNkLmM6CisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJKiBtNC9NYWtlZmlsZS5hbToKKwkqIG00L2FzLWFydHMubTQ6CisJKiBtNC9lc2QubTQ6CisJKiBwby9QT1RGSUxFUy5pbjoKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFJlbW92ZSBlc291bmQvZXNkc2luayBwbHVnaW4KKworMjAxMS0wNi0xNSAxNDozNzoyOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogUkVRVUlSRU1FTlRTOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkqIGV4dC9nY29uZi9NYWtlZmlsZS5hbToKKwkqIGV4dC9nY29uZi9nc3RnY29uZi5jOgorCSogZXh0L2djb25mL2dzdGdjb25mLmg6CisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NpbmsuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5oOgorCSogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc3JjLmg6CisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZlbGVtZW50cy5jOgorCSogZXh0L2djb25mL2dzdGdjb25mZWxlbWVudHMuaDoKKwkqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc2luay5jOgorCSogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zaW5rLmg6CisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NyYy5jOgorCSogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zcmMuaDoKKwkqIGV4dC9nY29uZi9nc3Rzd2l0Y2hzaW5rLmM6CisJKiBleHQvZ2NvbmYvZ3N0c3dpdGNoc2luay5oOgorCSogZXh0L2djb25mL2dzdHN3aXRjaHNyYy5jOgorCSogZXh0L2djb25mL2dzdHN3aXRjaHNyYy5oOgorCSogZ2NvbmYvLmdpdGlnbm9yZToKKwkqIGdjb25mL01ha2VmaWxlLmFtOgorCSogZ2NvbmYvZ3N0cmVhbWVyLnNjaGVtYXMuaW46CisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJKiBtNC9NYWtlZmlsZS5hbToKKwkqIG00L2djb25mLTIubTQ6CisJKiBwby9QT1RGSUxFUy5pbjoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgUmVtb3ZlIGdjb25mIGVsZW1lbnRzIGFuZCBwbHVnaW4KKwkgIEdDb25mIHdhcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBHU2V0dGluZ3MgZXRjLgorCisyMDExLTA2LTE1IDE1OjE3OjE5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBmaXggdW5pdGlhbGl6ZWQgYWNjZXNzCisKKzIwMTEtMDYtMDkgMjE6MDY6MjggKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYTogYWRkIG1pc3Npbmcgc3RkaW8gaW5jbHVkZSBmb3Igc3NjYW5mCisKKzIwMTEtMDYtMTMgMTk6MDg6MzggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0wNi0xMyAxNzo1MTo0MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIC1nb29kOiBwb3J0IHNvbWUgbW9yZSBwbHVnaW5zCisKKzIwMTEtMDYtMTMgMTc6MTQ6NTEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3A6IGZpeCBmb3IgZmx1c2hfc3RvcCBBUEkgY2hhbmdlCisKKzIwMTEtMDYtMTMgMTc6MTQ6MDAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJICBydHA6IHBvcnQgc29tZSBtb3JlIChkZSlwYXlsb2FkZXIKKworMjAxMS0wNi0xMyAxNzowNToxOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2Vyczogbm90IHNvIGdyZWVkeSBtaW5pbXVtIGZyYW1lIHNpemUKKwkgIC4uLiB3aGljaCB3aWxsIGJlIGRldGVybWluZWQgYnkgcGFyc2luZyBhbnl3YXksIGFuZCBhdm9pZHMgaW50cm9kdWNpbmcKKwkgIHJlZHVuZGFudCBhZGRpdGlvbmFsIGxhdGVuY3kuCisKKzIwMTEtMDYtMTMgMTY6MzM6NTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgLWdvb2Q6IHVwZGF0ZSBmb3IgYnVmZmVyIEFQSSBjaGFuZ2UKKworMjAxMS0wNi0xMyAxNjozMzo0NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHA6IHBvcnQgdG8gMC4xMQorCisyMDExLTA2LTEzIDEzOjI1OjQ5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcHZwYXkuYzoKKwkgIHJ0cDogZml4IGZvciBBUEkgY2hhbmdlcyBpbiB0aGUgYmFzZSBjbGFzc2VzCisKKzIwMTEtMDYtMTMgMTM6MDc6NTAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IHVzZSBjYXBzIGV2ZW50IGZvciBuZWdvdGlhdGlvbgorCisyMDExLTA2LTEzIDEzOjA3OjI3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogZml4IGZvciBmbHVzaCBzdG9wIGV2ZW50IGNoYW5nZXMKKworMjAxMS0wNi0wOCAxODozMzoxMCArMDMwMCAgUmFpbW8gSsOkcnZpIDxyYWltby5qYXJ2aUBnbWFpbC5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuaDoKKwkgIHVkcDogRml4IGNvbXBpbGVyIHdhcm5pbmcgb24gbWluZ3ctdzY0CisJICBGaXhlczogIzY1MjE0NC4KKwkgIGdzdHVkcG5ldHV0aWxzLmg6MzI6MDogZXJyb3I6ICJXSU5WRVIiIHJlZGVmaW5lZAorCSAgL3Vzci9pNjg2LXc2NC1taW5ndzMyL3N5cy1yb290L21pbmd3L2luY2x1ZGUvX21pbmd3Lmg6MjMxOjA6IG5vdGU6IHRoaXMgaXMgdGhlCisJICBsb2NhdGlvbiBvZiB0aGUgcHJldmlvdXMgZGVmaW5pdGlvbgorCisyMDExLTA2LTExIDE4OjU4OjA3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJICBnb29tOiBmaXggZm9yIGJ1ZmZlcnBvb2wgdXBkYXRlCisKKzIwMTEtMDYtMTAgMTg6MDU6MDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkgIGdvb206IHVwZGF0ZSBmb3IgYWxpZ25tZW50IGNoYW5nZQorCisyMDExLTA2LTA5IDE3OjU2OjE4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgIGphY2s6IHBvcnQgc29tZSBtb3JlCisKKzIwMTEtMDYtMDkgMTc6NTI6MzQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcDogcG9ydCB0byAwLjExCisKKzIwMTEtMDYtMDkgMTc6NTA6MDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHA6IHBvcnQgdG8gMC4xMQorCisyMDExLTA2LTA5IDExOjM3OjQ3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6CisJICBhYXNpbms6IHJlZ2lzdGVyIHRlbXBsYXRlIGFuZCBrbGFzcyBjb3JyZWN0bHkKKworMjAxMS0wNi0wOSAxMDo1MDo0NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5oOgorCSAgZ29vbTogcG9ydCBnb29tCisKKzIwMTEtMDYtMDggMTg6MDY6NTYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0wNi0wOCAxODowNToyMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSAgYXNzaW5rOiBwb3J0IGFhc2luayB0byAwLjExCisKKzIwMTEtMDYtMDcgMTI6MDY6MDggKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVidWd1dGlscy9icmVha215ZGF0YS5jOgorCSogZ3N0L2RlYnVndXRpbHMvY3B1cmVwb3J0LmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RjYXBzZGVidWcuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNzZXR0ZXIuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdG5hdnNlZWsuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHB1c2hmaWxlc3JjLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Byb2dyZXNzcmVwb3J0LmM6CisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJKiBnc3QvZGVidWd1dGlscy90ZXN0cGx1Z2luLmM6CisJICBkZWJ1Z3V0aWxzOiBTd2l0Y2ggZnJvbSBHU1RfQk9JTEVSUExBVEUgdG8gR19ERUZJTkVfVFlQRQorCisyMDExLTA2LTA3IDExOjI1OjE4ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSAgdmlkZW9maWx0ZXI6IFVzZSBuZXcgR3N0QmFzZVRyYW5zZm9ybTo6dHJhbnNmb3JtX2NhcHMgQVBJCisKKzIwMTEtMDYtMDcgMTE6MjM6NTUgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6CisJICBhdXBhcnNlOiBEb24ndCB1c2UgR1NUX0JPSUxFUlBMQVRFCisKKzIwMTEtMDYtMDcgMTE6MjI6MzUgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSAgYXVkaW9meGJhc2VmaXJmaWx0ZXI6IEJ1ZmZlcnMgbm8gbG9uZ2VyIGhhdmUgY2FwcworCisyMDExLTA2LTA3IDExOjIwOjAwICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSAgYWxwaGE6IFVzZSBuZXcgdHJhbnNmb3JtX2NhcHMgdm1ldGhvZCAod2l0aCBmaWx0ZXIpCisKKzIwMTEtMDYtMDYgMjA6NDM6MzEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSAgYXVkaW9wYXJzZXJzOiBmaXggc29tZSBtb3JlIHBhcnNlcnMKKworMjAxMS0wNi0wNiAxODoyMTowNCArMDUzMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiByZWZhY3RvciBjb2RlIGNvbW1vbiB0byBtYXRyb3NrYWRlbXV4IGFuZCBtYXRyb3NrYXBhcnNlCisJICBNb3ZlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdG8gbWF0cm9za2EtcmVhZC1jb21tb24uW2NoXSBmcm9tCisJICBtYXRyb3NrYS1kZW11eC5jIGFuZCBtYXRyb3NrYS1wYXJzZS5jOgorCSAgLSBnc3RfbWF0cm9za2Ffe2RlbXV4LHBhcnNlfV9wYXJzZV9jaGFwdGVycworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDg3NworCisyMDExLTA2LTA2IDE0OjQ3OjI3ICswNTMwICBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiByZWZhY3RvciBjb2RlIGNvbW1vbiB0byBtYXRyb3NrYWRlbXV4IGFuZCBtYXRyb3NrYXBhcnNlCisJICBNb3ZlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdG8gbWF0cm9za2EtcmVhZC1jb21tb24uW2NoXSBmcm9tCisJICBtYXRyb3NrYS1kZW11eC5jIGFuZCBtYXRyb3NrYS1wYXJzZS5jOgorCSAgLSBnc3RfbWF0cm9za2Ffe2RlbXV4LHBhcnNlfV9wYXJzZV9hdHRhY2htZW50cworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDg3NworCisyMDExLTA2LTA2IDEyOjQzOjE0ICswNTMwICBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSAgbWF0cm9za2E6IHJlZmFjdG9yIGNvZGUgY29tbW9uIHRvIG1hdHJvc2thZGVtdXggYW5kIG1hdHJvc2thcGFyc2UKKwkgIE1vdmUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiB0byBtYXRyb3NrYS1yZWFkLWNvbW1vbi5bY2hdIGZyb20KKwkgIG1hdHJvc2thLWRlbXV4LmMgYW5kIG1hdHJvc2thLXBhcnNlLmM6CisJICAtIGdzdF9tYXRyb3NrYV97ZGVtdXgscGFyc2V9X3BhcnNlX2F0dGFjaGVkX2ZpbGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA4NzcKKworMjAxMS0wNi0wNSAyMjo0NTo1NSArMDUzMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYTogcmVmYWN0b3IgY29kZSBjb21tb24gdG8gbWF0cm9za2FkZW11eCBhbmQgbWF0cm9za2FwYXJzZQorCSAgTW92ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIHRvIG1hdHJvc2thLXJlYWQtY29tbW9uLltjaF0gZnJvbQorCSAgbWF0cm9za2EtZGVtdXguYyBhbmQgbWF0cm9za2EtcGFyc2UuYzoKKwkgIC0gZ3N0X21hdHJvc2thX3tkZW11eCxwYXJzZX1fcGFyc2VfaW5mbworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDg3NworCisyMDExLTA2LTA1IDEwOjE1OjIzICswNTMwICBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiByZWZhY3RvciBjb2RlIGNvbW1vbiB0byBtYXRyb3NrYWRlbXV4IGFuZCBtYXRyb3NrYXBhcnNlCisJICBNb3ZlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdG8gbWF0cm9za2EtcmVhZC1jb21tb24uW2NoXSBmcm9tCisJICBtYXRyb3NrYS1kZW11eC5jIGFuZCBtYXRyb3NrYS1wYXJzZS5jOgorCSAgLSBnc3RfbWF0cm9za2Ffe2RlbXV4LHBhcnNlfV9wYXJzZV9tZXRhZGF0YQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDg3NworCisyMDExLTA2LTA1IDA5OjU0OjQyICswNTMwICBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSAgbWF0cm9za2E6IHJlZmFjdG9yIGNvZGUgY29tbW9uIHRvIG1hdHJvc2thZGVtdXggYW5kIG1hdHJvc2thcGFyc2UKKwkgIE1vdmUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiB0byBtYXRyb3NrYS1yZWFkLWNvbW1vbi5bY2hdIGZyb20KKwkgIG1hdHJvc2thLWRlbXV4LmMgYW5kIG1hdHJvc2thLXBhcnNlLmM6CisJICAtIGdzdF9tYXRyb3NrYV97ZGVtdXgscGFyc2V9X3BhcnNlX21ldGFkYXRhX2lkX3RhZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDg3NworCisyMDExLTA2LTA1IDAyOjI0OjQxICswNTMwICBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSAgbWF0cm9za2E6IHJlZmFjdG9yIGNvZGUgY29tbW9uIHRvIG1hdHJvc2thZGVtdXggYW5kIG1hdHJvc2thcGFyc2UKKwkgIE1vdmUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiB0byBtYXRyb3NrYS1yZWFkLWNvbW1vbi5bY2hdIGZyb20KKwkgIG1hdHJvc2thLWRlbXV4LmMgYW5kIG1hdHJvc2thLXBhcnNlLmM6CisJICAtIGdzdF9tYXRyb3NrYV97ZGVtdXgscGFyc2V9X3BhcnNlX21ldGFkYXRhX2lkX3NpbXBsZV90YWcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA4NzcKKworMjAxMS0wNi0wNiAxMjo0Mjo1MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHJlc2V0IHN0YXRlIHRyYWNraW5nIHZhcmlhYmxlIHdoZW4gYXBwcm9wcmlhdGUKKwkgIC4uLiBzbyB3ZSBkb24ndCBlbmQgdXAgaW50ZXJydXB0aW5nIGFuIG9wZXJhdGlvbiB0aGF0IHNob3VsZCBub3QgYmUgaW50ZXJydXB0ZWQKKwkgIGJhc2VkIG9uIHRoZSBpbmRpY2F0aW9uIG9mIGEgcHJldmlvdXMgaW50ZXJydXB0YWJsZSBvcGVyYXRpb24uCisKKzIwMTEtMDYtMDQgMTM6NDk6NTIgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJICBpbnRlcmxlYXZlOiBXb3JrIGFyb3VuZCBjaGFuZ2VzIGluIGdfYXRvbWljIEFQSQorCSAgU2VlICM2NTE1MTQgZm9yIGRldGFpbHMuCisKKzIwMTEtMDYtMDQgMTM6NDM6MDAgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNpbmsuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc2luay5oOgorCSAgc291cGh0dHBzaW5rOiBjb2RlIGNsZWFudXAKKworMjAxMS0wNi0wNSAwMjowMDowOCArMDUzMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkgIG1hdHJvc2thcGFyc2U6IFVzZSBBUlRJU1QgdGFnIGluc3RlYWQgb2YgQVVUSE9SIGZvciBHU1RfVEFHX0FSVElTVAorCSAgQVVUSE9SIG9ubHkgZXhpc3RlZCBpbiBhbiBvbGQgdmVyc2lvbiBvZiB0aGUgc3BlYyBhbmQgQVJUSVNUIGlzCisJICB0aGUgbmV3IHJlcGxhY2VtZW50IGZvciB0aGlzLiBXZSBhcmUgc3RpbGwgcmVhZGluZyBib3RoIHRvIHN0aWxsCisJICBiZSBjb21wYXRpYmxlIHdpdGggb2xkIGZpbGVzLgorCSAgRml4ZXMgYnVnICM2NDQ4NzUuCisKKzIwMTEtMDYtMDIgMTg6NTE6MjkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIHN5cy94aW1hZ2UveGltYWdldXRpbC5jCisKKzIwMTEtMDYtMDIgMTg6NDc6MzYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmM6CisJICBhdmk6IHBvcnQgQVZJIGVsZW1lbnRzIHRvIG5ldyBBUEkKKworMjAxMS0wNi0wMiAxMzozODozMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJICBkdmRlbXV4OiBGaXJzdCBxdWVyeSB0aGUgcGVlciBkdXJhdGlvbiBpbiB0aGUgcmVxdWVzdGVkIGZvcm1hdCBiZWZvcmUgY29udmVydGluZyB0byBCWVRFUworCSAgRml4ZXMgdXNhZ2Ugb2YgZHZkZW11eCBhZnRlciBhbm90aGVyIGRlbXV4ZXIsIGUuZy4gbXhmZGVtdXguCisJICBGaXhlcyBidWcgIzY1MDUwMy4KKworMjAxMS0wNi0wMiAxMDo0MTo1MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc2luay5jOgorCSAgc291cGh0dHBzaW5rOiBGaXggcmVmY291bnRpbmcgb2YgdGhlICJzZXNzaW9uIiBwcm9wZXJ0eQorCSAgUHJvcGVydGllcyBzaG91bGQgbmV2ZXIgdGFrZSBvd25lcnNoaXAgb2YgdGhlIHZhbHVlcworCSAgcGFzc2VkIHRvIHRoZW0uCisKKzIwMTEtMDYtMDEgMTc6MDQ6MjcgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogRm9yIHN0cmVhbWluZyBmaWxlcywgcHVzaCB0YWdzIGZpcnN0CisKKzIwMTEtMDUtMjQgMTQ6NTI6MDEgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvc291cC9NYWtlZmlsZS5hbToKKwkqIGV4dC9zb3VwL2dzdHNvdXAuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc2luay5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzaW5rLmg6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cDogQWRkIHNvdXBodHRwc2luaworCisyMDExLTA2LTAxIDEwOjE5OjMxICswMjAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBhbGxvdyBza2lwLWZpcnN0LWJ5dGVzIG9mIGZ1bGwgYnVmZmVyIHNpemUKKworMjAxMS0wNS0zMCAxODozMTo1MCArMDUzMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiByZWZhY3RvciBjb2RlIGNvbW1vbiB0byBtYXRyb3NrYWRlbXV4IGFuZCBtYXRyb3NrYXBhcnNlCisJICBNb3ZlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHRvIG1hdHJvc2thLXJlYWQtY29tbW9uLltjaF0gZnJvbQorCSAgbWF0cm9za2EtZGVtdXguYyBhbmQgbWF0cm9za2EtcGFyc2UuYzoKKwkgIC0gZ3N0X21hdHJvc2thX3tkZW11eCxwYXJzZX1fcGFyc2VfaGVhZGVyCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwODc3CisKKzIwMTEtMDUtMzAgMTI6MDk6MzEgKzAyMDAgIEFudG9uaW8gRnJlZGlhbmkgPGFudG9uaW8uZnJlZGlhbmlAaW53aW5kLml0PgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogVXNlIEdTVF9UQUdfSU1BR0UgZm9yIGNvdmVyYXJ0IHRvbworCSAgRml4ZXMgYnVnICM2MzgxMDcuCisKKzIwMTEtMDUtMzAgMTA6NDA6MDggKzA1MzAgIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYTogcmVmYWN0b3IgY29kZSBjb21tb24gdG8gbWF0cm9za2FkZW11eCBhbmQgbWF0cm9za2FwYXJzZQorCSAgTW92ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB0byBtYXRyb3NrYS1yZWFkLWNvbW1vbi5bY2hdIGZyb20KKwkgIG1hdHJvc2thLWRlbXV4LmMgYW5kIG1hdHJvc2thLXBhcnNlLmM6CisJICAtIGdzdF9tYXRyb3NrYV97ZGVtdXgscGFyc2V9X2dldF9zZWVrX3RyYWNrCisJICAtIGdzdF9tYXRyb3NrYV97ZGVtdXgscGFyc2V9X3Jlc2V0X3N0cmVhbXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA4NzcKKworMjAxMS0wNS0yOCAyMjowNDozNCArMDUzMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYTogcmVmYWN0b3IgY29kZSBjb21tb24gdG8gbWF0cm9za2FkZW11eCBhbmQgbWF0cm9za2FwYXJzZQorCSAgTW92ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIHRvIG1hdHJvc2thLXJlYWQtY29tbW9uLltjaF0gZnJvbQorCSAgbWF0cm9za2EtZGVtdXguYyBhbmQgbWF0cm9za2EtcGFyc2UuYzoKKwkgIC0gZ3N0X21hdHJvc2the2RlbXV4LHBhcnNlfV9mb3VuZF9nbG9iYWxfdGFnCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwODc3CisKKzIwMTEtMDUtMjggMTA6NTk6MDkgKzA1MzAgIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYTogcmVmYWN0b3IgY29kZSBjb21tb24gdG8gbWF0cm9za2FkZW11eCBhbmQgbWF0cm9za2FwYXJzZQorCSAgTW92ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB0byBtYXRyb3NrYS1yZWFkLWNvbW1vbi5bY2hdIGZyb20KKwkgIG1hdHJvc2thLWRlbXV4LmMgYW5kIG1hdHJvc2thLXBhcnNlLmM6CisJICAtIGdzdF9tYXRyb3NrYV9pbmRleF9zZWVrX2ZpbmQKKwkgIC0gZ3N0X21hdHJvc2the2RlbXV4LHBhcnNlfV9kb19pbmRleF9zZWVrCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwODc3CisKKzIwMTEtMDUtMjcgMjM6MTU6MjMgKzA1MzAgIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYTogcmVmYWN0b3IgY29kZSBjb21tb24gdG8gbWF0cm9za2FkZW11eCBhbmQgbWF0cm9za2FwYXJzZQorCSAgTW92ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIHRvIG1hdHJvc2thLXJlYWQtY29tbW9uLltjaF0gZnJvbQorCSAgbWF0cm9za2EtZGVtdXguYyBhbmQgbWF0cm9za2EtcGFyc2UuYzoKKwkgIC0gZ3N0X21hdHJvc2thX3tkZW11eCxwYXJzZX1fdHJhY2tudW1iZXJfdW5pcXVlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwODc3CisKKzIwMTEtMDUtMjcgMjA6Mjg6MTkgKzA1MzAgIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYTogcmVmYWN0b3IgY29kZSBjb21tb24gdG8gbWF0cm9za2FkZW11eCBhbmQgbWF0cm9za2FwYXJzZQorCSAgTW92ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIHRvIG1hdHJvc2thLXJlYWQtY29tbW9uLltjaF0gZnJvbQorCSAgbWF0cm9za2EtZGVtdXguYyBhbmQgbWF0cm9za2EtcGFyc2UuYzoKKwkgIC0gZ3N0X21hdHJvc2thX3tkZW11eCxwYXJzZX1fZGVjb2RlX2RhdGEKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA4NzcKKworMjAxMS0wNS0yNyAxOTozMDo0OCArMDUzMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiByZWZhY3RvciBjb2RlIGNvbW1vbiB0byBtYXRyb3NrYWRlbXV4IGFuZCBtYXRyb3NrYXBhcnNlCisJICBNb3ZlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdG8gbWF0cm9za2EtcmVhZC1jb21tb24uW2NoXSBmcm9tCisJICBtYXRyb3NrYS1kZW11eC5jIGFuZCBtYXRyb3NrYS1wYXJzZS5jOgorCSAgLSBnc3RfbWF0cm9za2Ffe2RlbXV4LHBhcnNlfV9nZXRfbGVuZ3RoCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwODc3CisKKzIwMTEtMDUtMjcgMDk6MTc6NDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBSZXZlcnQgMWE5MGE2YzQgYW5kIGRyb3AgRGlyYWMgc3VwcG9ydCBhZ2FpbgorCSAgSXQgZG9lcyBub3Qgd29yayBhdCBhbGwgKEEvViBzeW5jIGlzc3VlcyksIGlzIG5vdCB2ZXJ5IHVzZWZ1bCwKKwkgIG90aGVyIGNvbnRhaW5lcnMgd29yayBtdWNoIGJldHRlciB3aXRoIERpcmFjIGFuZCBEaXJhYyBpbiBBVkkKKwkgIGlzIG5vdCBzdXBwb3J0ZWQgYnkgb3RoZXIgc29mdHdhcmUuCisJICBGaXhlcyBidWcgIzU0MTIxNS4KKworMjAxMS0wNS0yNiAyMzozNTo1MiArMDUzMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiByZWZhY3RvciBjb2RlIGNvbW1vbiB0byBtYXRyb3NrYWRlbXV4IGFuZCBtYXRyb3NrYXBhcnNlCisJICBNb3ZlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHRvIG1hdHJvc2thLXJlYWQtY29tbW9uLltjaF0gZnJvbQorCSAgbWF0cm9za2EtZGVtdXguYyBhbmQgbWF0cm9za2EtcGFyc2UuYzoKKwkgIC0gZ3N0X21hdHJvc2thX3tkZW11eCxwYXJzZX1fZW5jb2RpbmdfY21wCisJICAtIGdzdF9tYXRyb3NrYV97ZGVtdXgscGFyc2V9X3JlYWRfdHJhY2tfZW5jb2RpbmdzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwODc3CisKKzIwMTEtMDUtMjMgMTg6MDY6NDQgKzAzMDAgIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYTogcmVmYWN0b3IgY29kZSBjb21tb24gdG8gbWF0cm9za2FkZW11eCBhbmQgbWF0cm9za2FwYXJzZQorCSAgTW92ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB0byBtYXRyb3NrYS1yZWFkLWNvbW1vbi5bY2hdIGZyb20KKwkgIG1hdHJvc2thLWRlbXV4LmMgYW5kIG1hdHJvc2thLXBhcnNlLmM6CisJICAtIGdzdF9tYXRyb3NrYV97ZGVtdXgscGFyc2V9X3BlZWtfaWRfbGVuZ3RoX3B1bGwKKwkgIC0gZ3N0X21hdHJvc2thX3tkZW11eCxwYXJzZX1fcGVla19pZF9sZW5ndGhfcHVzaAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDg3NworCisyMDExLTA1LTIzIDE4OjA2OjQ0ICswMzAwICBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiByZWZhY3RvciBjb2RlIGNvbW1vbiB0byBtYXRyb3NrYWRlbXV4IGFuZCBtYXRyb3NrYXBhcnNlCisJICBNb3ZlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdG8gbWF0cm9za2EtcmVhZC1jb21tb24uW2NoXSBmcm9tCisJICBtYXRyb3NrYS1kZW11eC5jIGFuZCBtYXRyb3NrYS1wYXJzZS5jOgorCSAgLSBnc3RfbWF0cm9za2Ffe2RlbXV4LHBhcnNlfV9wZWVrX2FkYXB0ZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA4NzcKKworMjAxMS0wNS0yNiAxMjo0ODozNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy94aW1hZ2UveGltYWdldXRpbC5jOgorCSAgeHZpbWFnZXNpbms6IEZhbGxiYWNrIHRvIG5vbi1YU2htIG1vZGUgaWYgYWxsb2NhdGluZyB0aGUgWFNobSBpbWFnZSBmYWlsZWQKKwkgIEZpeGVzIGJ1ZyAjNjMwNDU2LgorCisyMDExLTA1LTI2IDEyOjIyOjUyICswMjAwICBNYXJjIExlZW1hbiA8bWFyYy5sZWVtYW5AZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkgIHJ0cG1wNHZwYXk6IERlcHJlY2F0ZWQgc2VuZC1jb25maWcgcHJvcGVydHkgYW5kIHJlcGxhY2UgYnkgY29uZmlnLWludGVydmFsCisJICBGaXhlcyBidWcgIzYyMjQxMi4KKworMjAxMC0wNi0yMyAxMToxMjowMCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgbWF0cm9za2FkZW11eDogVVRGLTggc3VidGl0bGVzIG1heSBoYXZlIG1hcmt1cAorCSAgRml4ZXMgIzYxNjkzNi4KKworMjAxMS0wMS0yMyAxNTo1Njo0OSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOgorCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5Lmg6CisJICBjYWlyb3RleHRvdmVybGF5OiBmb3J3YXJkIG5ldyBzZWdtZW50IGV2ZW50cyBmcm9tIHRoZSBzaW5rIHRvIHRoZSBzb3VyY2UKKwkgIE5vdCBkb2luZyBzbyB3aWxsIGNhdXNlIGJ1ZmZlcnMgdG8gYmUgcmVjZWl2ZWQgYnkgZG93bnN0cmVhbSB3aXRob3V0CisJICBhIHRpbWUgYmFzZSBzZXQuCisJICBXZSB1c2UgdGhlIHNhbWUgbWV0aG9kIGF2aW11eCB1c2VzIHRvIGdldCBhY2Nlc3MgdG8gdGhlIGV2ZW50IHdoZW4KKwkgIGNvbGxlY3RwYWRzIGdvdCB0aGUgc2luayBldmVudCBmdW5jdGlvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDAzMjMKKworMjAxMS0wMS0yNCAxMToxMTo0OCArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOgorCSAgdGV4dG92ZXJsYXk6IGZvcndhcmQgc291cmNlIGV2ZW50cyB0byBzaW5rcworCSAgRXZlbnRzIGFyZSBwYXNzZWQgdG8gdGhlIHZpZGVvIHNpbmssIGFuZCB0byB0aGUgdGV4dCBzaW5rIGlmIGl0IGlzCisJICBsaW5rZWQuCisJICBUaGlzIHdpbGwgYWxsb3cgc2Vla2luZywgZm9yIGluc3RhbmNlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU4NjQ1MAorCisyMDExLTA1LTI1IDIxOjEyOjEyICswMjAwICBEYXZpZCBIb3l0IDxkaG95dEBsbG5sLmdvdj4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5oOgorCSAgbXVsdGlwYXJ0ZGVtdXg6IEFkZCBwcm9wZXJ0eSB0byBhc3N1bWUgYSBzaW5nbGUgc3RyZWFtIGFuZCBlbWl0IG5vLW1vcmUtcGFkcworCSAgRml4ZXMgYnVnICM2MTY2ODYuCisKKzIwMTEtMDUtMjUgMTQ6NTA6MjYgKzAyMDAgIE1pZ3VlbCBBbmdlbCBDYWJyZXJhIE1veWEgPG1hZG1hYzI1MDFAZ21haWwuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiB1bmlmb3JtIHVua25vd24gbWVzc2FnZSBoYW5kbGluZworCSAgRG8gdGhlIHNhbWUgcHJvY2Vzc2luZyBpbiBhbGwgdGhlIGNhc2VzIHdoZW4gYW4gdW5rbm93biBtZXNzYWdlIGlzIHJlY2VpdmVkLgorCSAgVGhhdCBpcywgZ2l2ZSBhIHdhcm5pbmcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUxMDU5CisKKzIwMTEtMDUtMjMgMTg6MDY6NDQgKzAzMDAgIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYTogcmVmYWN0b3IgY29kZSBjb21tb24gdG8gbWF0cm9za2FkZW11eCBhbmQgbWF0cm9za2FwYXJzZQorCSAgTW92ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIHRvIG1hdHJvc2thLXJlYWQtY29tbW9uLltjaF0gZnJvbQorCSAgbWF0cm9za2EtZGVtdXguYyBhbmQgbWF0cm9za2EtcGFyc2UuYzoKKwkgIC0gZ3N0X21hdHJvc2thX3tkZW11eCxwYXJzZX1fcGVla19wdWxsCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwODc3CisKKzIwMTEtMDUtMjMgMTg6MDY6NDQgKzAzMDAgIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSAgbWF0cm9za2E6IHJlZmFjdG9yIGNvZGUgY29tbW9uIHRvIG1hdHJvc2thZGVtdXggYW5kIG1hdHJvc2thcGFyc2UKKwkgIE1vdmUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiB0byBtYXRyb3NrYS1yZWFkLWNvbW1vbi5bY2hdIGZyb20KKwkgIG1hdHJvc2thLWRlbXV4LmMgYW5kIG1hdHJvc2thLXBhcnNlLmM6CisJICAtIGdzdF9tYXRyb3NrYV97ZGVtdXgscGFyc2V9X3BlZWtfYnl0ZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA4NzcKKworMjAxMS0wNS0yMyAxODowNjo0NCArMDMwMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiByZWZhY3RvciBjb2RlIGNvbW1vbiB0byBtYXRyb3NrYWRlbXV4IGFuZCBtYXRyb3NrYXBhcnNlCisJICBNb3ZlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHRvIG1hdHJvc2thLXJlYWQtY29tbW9uLltjaF0gZnJvbQorCSAgbWF0cm9za2EtZGVtdXguYyBhbmQgbWF0cm9za2EtcGFyc2UuYzoKKwkgIC0gZ3N0X21hdHJvc2thX3tkZW11eCxwYXJzZX1fZW5jb2Rpbmdfb3JkZXJfdW5pcXVlCisJICAtIGdzdF9tYXRyb3NrYV97ZGVtdXgscGFyc2V9X3JlYWRfdHJhY2tfZW5jb2RpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA4NzcKKworMjAxMS0wNS0yNCAxODoyNzoxMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkgIGF1dG9kZXRlY3Q6IHBvcnQgdG8gbmV3IEFQSQorCisyMDExLTA1LTI0IDE3OjM0OjE5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmMKKwkgIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYworCSAgZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYworCSAgZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jCisJICBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYworCisyMDExLTA1LTI0IDEzOjEyOjE5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkgIHBjbXVkZXBheTogYWxsb3cgdmFyaWFibGUgc2FtcGxlIHJhdGUKKworMjAxMS0wNS0yNCAxMzoxMTo1NCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6CisJICBwY21hZGVwYXk6IGFsbG93IHZhcmlhYmxlIHNhbXBsZSByYXRlCisKKzIwMTAtMDQtMDQgMDY6NDM6NDEgLTA1MDAgIFJvYiBDbGFyayA8cm9iQHRpLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmg6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBhZGQgbm9ybSBwcm9wZXJ0eQorCSAgQmFzZWQgb24gYSBwYXRjaCBieSBHdWVubmFkaSBMaWFraG92ZXRza2kuCisJICB2MjogdXBkYXRlcyBiZWNhdXNlIEkgZm9yZ290IHRvIGFkZCBHc3RUdW5lciBpbnRlcmZhY2UgdG8gdjRsMnNpbmsKKwkgIHYzOiB1cGRhdGUgdG8gYWRkIGFsbCBwb3NzaWJsZSB2YWx1ZXMgdG8gbm9ybSBlbnVtCisKKzIwMTEtMDUtMjMgMjA6NDY6MDQgKzAzMDAgIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiBmaXhlZCBjb3B5cmlnaHQgaGVhZGVycworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDg3NworCisyMDExLTA1LTIzIDE4OjA2OjQ0ICswMzAwICBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSAgbWF0cm9za2E6IHJlZmFjdG9yIGNvZGUgY29tbW9uIHRvIG1hdHJvc2thZGVtdXggYW5kIG1hdHJvc2thcGFyc2UKKwkgIE1vdmUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgdG8gbWF0cm9za2EtcmVhZC1jb21tb24uW2NoXSBmcm9tCisJICBtYXRyb3NrYS1kZW11eC5jIGFuZCBtYXRyb3NrYS1wYXJzZS5jOgorCSAgLSBnc3RfbWF0cm9za2FfZGVjb2RlX2NvbnRlbnRfZW5jb2RpbmdzCisJICAtIGdzdF9tYXRyb3NrYV9kZWNvbXByZXNzX2RhdGEKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA4NzcKKworMjAxMS0wNS0yMyAxODo0ODo1NyArMDMwMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSAgbWF0cm9za2E6IG1vdmUgR3N0TWF0cm9za2F7RGVtdXgsUGFyc2V9OjpzdGF0ZSB0byBHc3RNYXRyb3NrYVJlYWRDb21tb24KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA4NzcKKworMjAxMS0wNS0yNCAwOTo0ODo1NiArMDIwMCAgSm9uYXMgTGFyc3NvbiA8am9uYXMubGFyc3NvbkBoaXEuc2U+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IGJ1ZmZlciBsZWFrIHdpdGggY29ycnVwdGVkIGZpbGVzCisJICBGaXhlcyBidWcgIzY1MDkxMi4KKworMjAxMS0wNS0yMyAwMjo0NjozOCAtMDcwMCAgTWlndWVsIEFuZ2VsIENhYnJlcmEgTW95YSA8bWFkbWFjMjUwMUBnbWFpbC5jb20+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IGZpeCBwYXJhbWV0ZXIgdHlwZSBpbiB0cmFjZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDkzNworCisyMDExLTA1LTIzIDE4OjA2OjQ0ICswMzAwICBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9NYWtlZmlsZS5hbToKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiByZWZhY3RvciBjb2RlIGNvbW1vbiB0byBtYXRyb3NrYWRlbXV4IGFuZCBtYXRyb3NrYXBhcnNlCisJICBSZXBsYWNlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHdpdGggdGhlaXIgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uXyoKKwkgIGNvdW50ZXJwYXJ0czoKKwkgIC0gZ3N0X21hdHJvc2thX3tkZW11eCxwYXJzZX1fcGFyc2VfaW5kZXgKKwkgIC0gZ3N0X21hdHJvc2thX3tkZW11eCxwYXJzZX1fcGFyc2Vfc2tpcAorCSAgLSBnc3RfbWF0cm9za2Ffe2RlbXV4LHBhcnNlfV9zdHJlYW1fZnJvbV9udW0KKwkgIEludHJvZHVjZSBHc3RNYXRyb3NrYVJlYWRDb21tb24gdG8gY29udGFpbiB0aG9zZSBtZW1iZXJzIG9mCisJICBHc3RNYXRyb3NrYURlbXV4IGFuZCBHc3RNYXRyb3NrYVBhcnNlIHRoYXQgd2VyZSB1c2VkIGJ5IHRoZSBhYm92ZQorCSAgZnVuY3Rpb25zLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDg3NworCisyMDExLTA1LTIzIDEzOjUwOjQ2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogdGVsbCBiYXNlcGFyc2UgdGhlIGR1cmF0aW9uIGluIHNhbXBsZXMgZm9yIGJldHRlciBhY2N1cmFjeQorCSAgVGVsbCBHc3RCYXNlUGFyc2UgdGhlIGR1cmF0aW9uIGluIHNhbXBsZXMgaW5zdGVhZCBvZiB0aW1lLCBzbyB0aGF0CisJICBhIGR1cmF0aW9uIHF1ZXJ5IGluIERFRkFVTFQgZm9ybWF0IHdpbGwgcmV0dXJuIHRoZSBjb3JyZWN0IG51bWJlcgorCSAgb2Ygc2FtcGxlcyB3aXRob3V0IHJvdW5kaW5nIGVycm9ycy4gQmFzZXBhcnNlIHdpbGwgY29udmVydCB0aGlzCisJICBpbnRvIHRpbWUgaXRzZWxmIHdoZW4gbmVlZGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDc4NQorCisyMDExLTA1LTIzIDEzOjI1OjQ0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogYWxzbyB0cnkgdXBzdHJlYW0gZmlyc3QgZm9yIGR1cmF0aW9uIHF1ZXJ5IGluIERFRkFVTFQgZm9ybWF0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwNzg1CisKKzIwMTEtMDUtMjMgMTM6MjM6MjEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBtYWtlIGNvbnZlcnNpb24gZnJvbSBUSU1FIHRvIERFRkFVTFQgZm9ybWF0IChzYW1wbGVzKSB3b3JrCisJICBGaXggY29weSduJ3Bhc3RlIGVycm9yIGluIHRoZSBwcmV2aW91cyBjb21taXQuCisKKzIwMTEtMDUtMjMgMTE6MzY6MzYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBJbXBsZW1lbnQgY29udmVyc2lvbnMgYmV0d2VlbiBUSU1FIGFuZCBERUZBVUxUIGZvcm1hdAorCSAgRml4ZXMgYnVnICM2NTA3ODUuCisKKzIwMTEtMDUtMjIgMTg6NTA6NTEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBkb24ndCBlcnJvciBvdXQgb24gaW52YWxpZCBtaW5pbXVtX2Jsb2Nrc2l6ZSB2YWx1ZSBpbiBzdHJlYW1pbmZvIGhlYWRlcgorCSAgV2UgZG9uJ3QgdXNlIGl0LCBzbyBtYXkganVzdCBhcyB3ZWxsIGFjY2VwdCBhbiBpbnZhbGlkIHZhbHVlCisJICBvZiAwIGhlcmUsIHdoaWNoIGlzIGxpa2VseSBpbmNvbnNlcXVlbnRpYWwgYW55d2F5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDY5MQorCisyMDExLTA1LTIwIDEwOjM0OjQ3ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5jOgorCSAgcnRwOiBmaXggc3RhdGljIGFycmF5IG92ZXJydW5zIGluIGEgbmljZXIgd2F5CisJICBVc2UgR19OX0VMRU1FTlRTIGluc3RlYWQgb2YgaGFyZC1jb2RpbmcgdGhlIGFycmF5IHNpemUuCisKKzIwMTEtMDUtMjAgMDA6NTM6NDQgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmM6CisJICBydHA6IGZpeCBzdGF0aWMgYXJyYXkgb3ZlcnJ1bnMKKwkgIFllcyBhcnJheVsxMF0gaGFzIGVsZW1lbnRzIGZyb20gMC4uLjkuCisKKzIwMTEtMDUtMTkgMjM6MzE6MTkgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJICBkb2NzOiB1cGRhdGUgcGx1Z2luIGludHJvc3BlY3Rpb24gZGF0YQorCSAgTm93IG1vcmUgZmlsZXMgYXJlIG1lcmdlZCBhbmQgcHJvZHVjZWQgaW4gYSBjYW5vbmljYWwgZmFzaGlvbiwgd2hpY2ggaG9wZWZ1bGx5CisJICBjcmVhdGVzIGxlc3Mgb3Igbm8gZGVsdGEgaW4gdGhlIGZ1dHVyZS4KKworMjAxMS0wNS0xOSAyMjo1NzoxNSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gOWU1YmJkNSB0byA2OWI5ODFmCisKKzIwMTEtMDUtMTkgMTg6MjE6MzMgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgbWlzc2luZyBicmVhaworCisyMDEwLTExLTA4IDE0OjA2OjE1ICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmg6CisJICBkZWludGVybGFjZTogQWRkIHN1cHBvcnQgZm9yIGRlaW50ZXJsYWNpbmcgdXNpbmcgYnVmZmVyIGNhcHMvZmxhZ3MKKwkgIFdoZW4gbm90IHVzaW5nIHRoZSBmaWVsZGFuYWx5c2lzIGVsZW1lbnQgaW1tZWRpYXRlbHkgdXBzdHJlYW0gb2YgZGVpbnRlcmxhY2UsCisJICBiZWhhdmlvdXIgc2hvdWxkIHJlbWFpbiB1bmNoYW5nZWQuIGZpZWxkYW5hbHlzaXMgd2lsbCBzZXQgdGhlIGNhcHMgYW5kIGZsYWdzIG9uCisJICB0aGUgYnVmZmVycyBzdWNoIHRoYXQgdGhleSBjYW4gYmUgaW50ZXJwcmV0ZWQgYW5kIGFjdGVkIHVwb24gdG8gcHJvZHVjZQorCSAgcHJvZ3Jlc3NpdmUgb3V0cHV0LgorCSAgVGhlcmUgYXJlIHR3byBtYWluIG1vZGVzIG9mIG9wZXJhdGlvbjoKKwkgIC0gUGFzc2l2ZSBwYXR0ZXJuIGxvY2tpbmcKKwkgIFBhc3NpdmUgcGF0dGVybiBsb2NraW5nIGlzIGEgbm9uLWJsb2NraW5nLCBsb3ctbGF0ZW5jeSBtb2RlIG9mIG9wZXJhdGlvbiB0aGF0CisJICBpcyBzdWl0YWJsZSBmb3IgY2xvc2UtdG8tbGl2ZSB1c2FnZS4gSW5pdGlhbGx5IGEgdGVsZWNpbmUgc3RyZWFtIHdpbGwgYmUKKwkgIG91dHB1dCBhcyB2YXJpYWJsZSBmcmFtZXJhdGUgd2l0aCBuYcOvdmUgdGltZXN0YW1wIGFkanVzdG1lbnQuIFdpdGggZWFjaAorCSAgaW5jb21pbmcgYnVmZmVyLCBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gbG9jayBvbnRvIGEgcGF0dGVybi4gV2hlbiBhIGxvY2sgaXMKKwkgIG9idGFpbmVkLCB0aGUgc3JjIHBhZCBhbmQgb3V0cHV0IGJ1ZmZlciBjYXBzIHdpbGwgcmVmbGVjdCB0aGUgcGF0dGVybiBhbmQKKwkgIHRpbWVzdGFtcHMgd2lsbCBiZSBhY2N1cmF0ZWx5IGludGVycG9sYXRlZCBiZXR3ZWVuIHBhdHRlcm4gcmVwZWF0cy4gVGhpcworCSAgbWVhbnMgdGhhdCBpbml0aWFsbHkgYW5kIGF0IHBhdHRlcm4gdHJhbnNpdGlvbnMgdGhlcmUgd2lsbCBiZSBzaG9ydCBwZXJpb2RzCisJICBvZiBpbmFjY3VyYXRlIHRpbWVzdGFtcGluZy4KKwkgIC0gQWN0aXZlIHBhdHRlcm4gbG9ja2luZworCSAgQWN0aXZlIHBhdHRlcm4gbG9ja2luZyBpcyBhIGJsb2NraW5nLCBoaWdoLWxhdGVuY3kgbW9kZSBvZiBvcGVyYXRpb24gdGhhdCBpcworCSAgdGFyZ2V0ZWQgYXQgdXNlLWNhc2VzIHdoZXJlIHRpbWVzdGFtcCBhY2N1cmFjeSBpcyBwYXJhbW91bnQuIEJ1ZmZlcnMgd2lsbCBiZQorCSAgcXVldWVkIHVudGlsIGVub3VnaCBhcmUgcHJlc2VudCB0byBtYWtlIGEgbG9jay4gV2hlbiBsb2NrZWQsIHRpbWVzdGFtcHMgd2lsbAorCSAgYmUgYWNjdXJhdGVseSBpbnRlcnBvbGF0ZWQgYmV0d2VlbiBwYXR0ZXJuIHJlcGVhdHMuIE9ycGhhbiBmaWVsZHMgY2FuIGJlCisJICBkcm9wcGVkIG9yIGRlaW50ZXJsYWNlZC4gSWYgbm8gbG9jayBjYW4gYmUgb2J0YWluZWQsIGEgc2luZ2xlIGZpZWxkIG1pZ2h0IGJlCisJICBwdXNoZWQgdGhyb3VnaCB0byBiZSBkZWludGVybGFjZWQuCisJICBMb2NraW5nIGNhbiBhbHNvIGJlIGRpc2FibGVkIG9yICdhdXRvJyBjaG9vc2VzIGJldHdlZW4gcGFzc2l2ZSBhbmQgYWN0aXZlCisJICBsb2NraW5nIG1vZGVzIGRlcGVuZGluZyBvbiB3aGV0aGVyIHVwc3RyZWFtIGlzIGxpdmUuCisKKzIwMTEtMDUtMTAgMTY6MjU6NDAgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IFJlbW92ZSBjb25maWcgc2NyaXB0IGNoZWNrIGZvciBjYWNhCisKKzIwMTEtMDUtMTggMTI6MzY6NDAgKzAyMDAgIEpvc2UgQW50b25pbyBTYW50b3MgQ2FkZW5hcyA8c2FudG9zY2FkZW5hc0BnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOgorCSAgcnRwOiBGaXggc2VnbWVudGF0aW9uIGZhdWx0IHByb2Nlc3NpbmcgcGF5bG9hZCBidWZmZXJzCisJICBUaGlzIGNvbW1pdCBjaGVja3MgaWYgdGhlIHZhbHVlIHJldHVybmVkIGJ5CisJICBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9idWZmZXIgYW5kCisJICBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgaXMgTlVMTCBiZWZvcmUgdXNpbmcgaXQuCisKKzIwMTEtMDUtMTggMTY6MTA6MDcgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGZkMzUwNzMgdG8gOWU1YmJkNQorCisyMDExLTA1LTE4IDEyOjUyOjMxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGVuc3VyZSAwLXBhZGRpbmcgd2hlbiBjb3JyZWN0aW5nIGR1YmlvdXMgbGlzdCBzaXplCisKKzIwMTEtMDUtMTggMTI6MjQ6MjUgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDQ2ZGZjZWEgdG8gZmQzNTA3MworCisyMDExLTA1LTE4IDEwOjIyOjI3ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHVzZSBFSU5WQUwgZm9yIG1pc3NpbmcgdXJsIHBhcmFtZXRlcgorCSAgRml4ZXMgZ2NjIHdhcm5pbmcgYWJvdXQgdXNpbmcgdW5pbml0aWFsaXplZCB2YXJpYWJsZSAncmVzJy4KKworMjAxMS0wNC0yOCAxNTozNzo0MCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkgIHZhcmlvdXM6IGZpeCBhdXRob3IgdGFnIGluIGVsZW1lbnQgZGV0YWlscworCisyMDExLTA0LTIwIDE1OjI1OjU4IC0wNDAwICBDaHJpcyBFIEpvbmVzIDxjaHJpc0BjaHJpc2Vqb25lcy5jb20+CisKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzoKKwkgIGF1cGFyc2U6IGltcGxlbWVudCBzZWVraW5nCisJICBJbXBsZW1lbnQgc2Vla2luZyBhbmQgc2Vla2luZyBxdWVyeS4gRml4ZXMgIzY0NDUxMgorCisyMDExLTA1LTE3IDE2OjEzOjU5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisKKzIwMTEtMDQtMDYgMTY6MDU6NTUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBhbHNvIGFsbG93IFBBVVNFIHRvIGJlIGludGVycnVwdGVkCisJICAuLi4gYXMgaXQgaXMgb24gdGhlIHdheSBvdXQgdG8gTlVMTC4KKwkgIFNlZSAjNjMyNTA0LgorCisyMDExLTA0LTA2IDE1OjUxOjQ5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZW5zdXJlIHByb3BlciBjbG9zaW5nIGFuZCBjbGVhbnVwCisJICAuLi4gc2luY2UgdGhlIFRFQVJET1dOIHNlcXVlbmNlIG1pZ2h0IG5vdCBoYXZlIGhhZCBhIGNoYW5jZSB0byBldmVuIHN0YXJ0LAorCSAgYnV0IGF0IGxlYXN0IGNvbm5lY3Rpb25zIHNob3VsZCBiZSBjbG9zZWQgKHN5bmNocm9ub3VzbHkpIGFuZCBzdGF0ZSBjbGVhbmVkIHVwLgorCSAgU2VlICM2MzI1MDQuCisKKzIwMTEtMDQtMDYgMTU6NDk6MDEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBmaXggYW5kIGltcHJvdmUgYXN5bmMgaGFuZGxpbmcKKwkgIFNpbXBsaWZ5IHRoZSBjb21tYW5kIGhhbmRsaW5nOyBwYXNzaW5nIGEgY29tbWFuZCB0byB0aHJlYWQgbWVhbnMgd2UgcmVhbGx5CisJICB3YW50IGl0IHRvIGdldCB0aGUgbWVzc2FnZSwgd2hpY2ggbWVhbnMgdG8gYWx3YXlzIGZsdXNoIHByb3ZpZGVkIHRoZSBjb21tYW5kCisJICBjYW4gaGFuZGxlIGJlaW5nIGludGVycnVwdGVkLiAgQ29tbWFuZCB0aHJlYWQgaW5kaWNhdGVzIHdoZXRoZXIgY29tbWFuZAorCSAgYWxsb3dzIGludGVycnVwdGlvbiBhbmQgZW5zdXJlIG5vbi1mbHVzaGluZyBjb25uZWN0aW9uIGFzIGl0IHN1YnNlcXVlbnRseQorCSAgbmVlZHMgaXQuCisJICBJbiBwYXJ0aWN1bGFyLCB0aGlzIGFsc28gbWFrZXMgdGhlIFRFQVJET1dOIHNlcXVlbmNlIGludGVycnVwdGFibGUKKwkgIGFuZCBhbHNvIHByZXZlbnRzIHJhY2VzIHdoZXJlIF9sb29wXyBjb3VsZCBtaXNzIGEgY29tbWFuZCBhbmQgd291bGQKKwkgIGNvbnRpbnVlIHJlY2VpdmluZyAob3IgYXQgbGVhc3QgdHJ5aW5nIHRvKS4KKwkgIFNlZSAjNjMyNTA0LgorCisyMDExLTA0LTA2IDE0OjUzOjI3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogdHdlYWsgcG9zdC1zZWVrIGxvb3AgaGFuZGxpbmcKKworMjAxMS0wMS0xMCAxMjo0NjozNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogb3BlbiBvbiBwbGF5IGFuZCBwYXVzZSB3aGVuIG5vdCBkb25lIHlldAorCSAgV2l0aCB0aGUgYXN5bmMgc3RhdGUgY2hhbmdlcywgaXQgaXMgcG9zc2libGUgdGhhdCB3ZSBuZWVkIHRvIG9wZW4gdGhlIHN0cmVhbQorCSAgYmVmb3JlIHBsYXkgYW5kIHBhdXNlLgorCSAgQWxzbyBtYWtlIHN1cmUgd2UgcmVtZW1iZXIgYSBwcmV2aW91cyBvcGVuIGZhaWx1cmUgc28gdGhhdCB3ZSBkb24ndCBrZWVwIHRyeWluZworCSAgYWdhaW4uCisKKzIwMTEtMDEtMTAgMTE6NDU6MDMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGltcHJvdmUgYXN5bmMgaGFuZGxpbmcKKwkgIFNpbXBsaWZ5IHRoZSBjb21tYW5kIGhhbmRsaW5nLCBvbmx5IGNvbnRpbnVlIGxvb3Bpbmcgd2hlbiB3ZSBoYXZlIG5vdCByZWNlaXZlZAorCSAgYW5vdGhlciBjb21tYW5kIG9yIHdoZW4gdGhlIHByZXZpb3VzIGxvb3Agd2FzIHN1Y2Nlc3NmdWxsLgorCSAgQXZvaWQgbG9vcGluZyBvbiBhIGRpc2Nvbm5lY3RlZCBzb2NrZXQuCisKKzIwMTEtMDEtMDcgMTg6MDI6NDkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHJld29yayByZWNvbm5lY3QgY29kZQorCSAgVXNlIHRoZSBzYW1lIGFzeW5jIGNvZGUgcGF0aCB0byBpbXBsZW1lbnQgcmVjb25uZWN0cy4KKwkgIE1ha2Ugc3VyZSB3ZSBvbmx5IHBvc3QgcHJvZ3Jlc3MgbWVzc2FnZXMgd2hlbiBkb2luZyBhc3luYyB0aGluZ3MuCisKKzIwMTEtMDEtMDcgMTc6MTk6NTkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHNtYWxsIGNsZWFudXBzCisJICBNYWtlIHN1cmUgd2UgY2FuY2VsIHRoZSBwcmV2aW91cyB0YXNrIHdoZW4gcXVldWluZyBhIG5ldyBvbmUuCisJICBNb3ZlIHRoZSBtZXNzYWdlcyB0byBhIGNlbnRyYWwgcGxhY2Ugc28gd2UgY2FuIG1vcmUgZWFzaWx5IHBvc3QgdGhlbS4KKworMjAxMS0wMS0wNyAxNToxNTo0OSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZG9uJ3QgcG9zdCBlcnJvcnMgd2hlbiBpbnRlcnJ1cHRpbmcKKworMjAxMS0wMS0wNyAxMzo0MzowNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogaW1wbGVtZW50IG1vcmUgYXN5bmMgaGFuZGxpbmcKKwkgIFJlbW92ZSBzb21lIG9sZCBsb2Nrcy4KKwkgIE1ha2Ugc3VyZSB3ZSBuZXZlciBnbyBpbnRvIHRoZSBsb29wIGZ1bmN0aW9uIHdoZW4gZmx1c2hpbmcuCisKKzIwMTEtMDEtMDcgMTE6NDA6MzIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGZpcnN0IGF0dGVtcHQgYXQgYXN5bmMgaW1wbGVtZW50YXRpb24KKworMjAxMS0wMS0wNyAxMTo0MDoxMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogc21hbGwgaGVhZGVyIGNsZWFudXBzCisKKzIwMTEtMDUtMTcgMTA6NDc6MzIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHNzcmNkZW11eDogRml4IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgY29tcGlsZXIgd2FybmluZyBmb3IgKHByZS0pIHJlbGVhc2VzIHRvbworCisyMDExLTA0LTI4IDE1OjU3OjA0ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdHM6IE9ubHkgYWxsb3cgbXBlZy10cyBvbiBzb3VyY2Ugb2JqZWN0cworCSAgVWdseSBmaXggZm9yICM2NDgzMTIKKworMjAxMS0wNS0xNyAwOToyNDowOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgcnRwc3NyY2RlbXV4OiBGaXggdW5pbml0aWFsaXplZCB2YXJpYWJsZSBjb21waWxlciB3YXJuaW5nCisKKzIwMTEtMDUtMDYgMTk6MDk6MTcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICBzc3JjZGVtdXg6IEltcGxlbWVudCBpdGVyYXRlIGludGVybmFsIGxpbmtzIGZvciBzaW5rIHBhZHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDk2MTcKKworMjAxMS0wNS0wNiAxODo0MTowMSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHJ0cHNzcmNkZW11eDogaXRlcmF0ZSBwYWQgZnVuY3Rpb24gaXMgb25seSB2YWxpZCBmb3Igc3JjIHBhZHMKKwkgIFRoZSBpdGVyYXRlIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCBmb3Igc3JjIHBhZHMsIHNvIG1hcmsgaXQgYXMgc3VjaCBhbmQgcmVtb3ZlCisJICBkZWFkIGNvZGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ5NjE3CisKKzIwMTEtMDUtMDYgMTg6MTI6NTMgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICBydHBzc3JjZGVtdXg6IFJlbGVhc2UgbG9jayBiZWZvcmUgZW1pdHRpbmcgc2lnbmFsCisJICBJZiB0aGUgbG9jayBpcyBub3QgcmVsZWFzZWQgYmVmb3JlIGVtaXR0aW5nIGEgc2lnbmFsLCBpdCBtYXkgY2F1c2UgYSBkZWFkbG9jaworCSAgaWYgYW55IG90aGVyIGZ1bmN0aW9uIGluIHRoZSBlbGVtZW50IGlzIGNhbGxlZC4KKwkgIEFsc28gcmVtb3ZlZCBhbiB1bnVzZWQgdGltZXN0YW1wIHBhcmFtZXRlcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0OTYxNworCisyMDExLTA1LTE1IDIzOjI1OjE1ICswMzAwICBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSAgbWF0cm9za2FwYXJzZTogY2FsY3VsYXRlIHNlZ21lbnQgZHVyYXRpb24gYWZ0ZXIgcGFyc2luZyBhbGwgdGhlIElEcworCSAgU2luY2UgdGhlIHNlZ21lbnQgZHVyYXRpb24gaXMgZ2l2ZW4gaW4gdGVybXMgb2YgdGhlCisJICBHU1RfTUFUUk9TS0FfSURfVElNRUNPREVTQ0FMRSB3ZSBzaG91bGQgb25seSBjb252ZXJ0IGl0IGludG8KKwkgIG5hbm9zZWNvbmRzIHdoZW4gd2UgYXJlIHN1cmUgdGhhdCBhbnkgc2NhbGUgc3BlY2lmaWVkIGluIHRoZSBmaWxlIGhhcworCSAgYmVlbiByZWFkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDI1OAorCisyMDExLTA1LTE2IDE3OjUyOjExICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBjb25maWd1cmUuYWMKKworMjAxMS0wNS0xNiAxNzo1MDoxNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5jOgorCSAgLWdvb2Q6IGZpeCBmb3IgbmV3IEFQSQorCisyMDExLTA1LTA0IDExOjU1OjIxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBhZGRpdGlvbmFsIGxvY2sgc2FmZXR5CisJICBGaXhlcyAjNjE5NTkwLgorCisyMDExLTA0LTI2IDE2OjA2OjU2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhbHNvIGNoZWNrIGZvciBiaXRyYXRlIGluZm8gaW4gY2FwcworCisyMDEwLTA1LTI1IDAxOjA0OjQzICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IGd1ZXNzIGJpdHJhdGUgaWYgb25seSBvbmUgc3RyZWFtJ3MgYml0cmF0ZSBpcyB1bmtub3duCisJICBJZiB0aGUgYml0cmF0ZXMgZm9yIGFsbCBidXQgb25lIGF1ZGlvL3ZpZGVvIHN0cmVhbXMgYXJlIGtub3duLCBhbmQgdGhlCisJICB0b3RhbCBzdHJlYW0gc2l6ZSBhbmQgZHVyYXRpb24gY2FuIGJlIGRldGVybWluZWQsIHRoaXMgY2FsY3VsYXRlcyB0aGUKKwkgIHVua293biBiaXRyYXRlIGFzIChzdHJlYW0gc2l6ZSAvIGR1cmF0aW9uKSAtIChzdW0gb2Yga25vd24gYml0cmF0ZXMpLgorCSAgV2hpbGUgdGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSB2ZXJ5IGFjY3VyYXRlLCBpdCBzaG91bGQgYmUgZ29vZAorCSAgZW5vdWdoIGZvciBtb3N0IHB1cnBvc2VzLgorCSAgRm9yIGV4YW1wbGUsIHRoaXMgaXMgdXNlZnVsIGZvciBILjI2MyArIEFBQyBzdHJlYW1zIHdoZXJlIG5vICdidHJ0JyBhdG9tCisJICBpcyBhdmFpbGFibGUgZm9yIHRoZSB2aWRlbyBwb3J0aW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxOTU0OAorCisyMDEwLTA1LTMxIDIzOjU5OjU5ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBFeHBvcnQgbWF4IGJpdHJhdGUgZm9yIEFNUi1OQi8tV0Igc3RyZWFtcworCSAgVGhpcyBwYXJzZXMgdGhlICdkYW1yJyBhdG9tIGlmIHByZXNlbnQsIGFuZCBleHBvcnRzIHRoZSBtYXhpbXVtIGJpdHJhdGUKKwkgIG9mIHRoZSBzdHJlYW0gdXNpbmcgdGhlIG1vZGUgc2V0IGZpZWxkIHRvIGRldGVybWluZSB0aGUgaGlnaGVzdCBiaXRyYXRlCisJICBmcmFtZSB0eXBlIHRoYXQgbWlnaHQgYmUgcHJlc2VudC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MjAxODYKKworMjAxMS0wNS0xNiAwOTowNDozMSArMDIwMCAgUGlubyBUb3NjYW5vIDx0b3NjYW5vLnBpbm9AdGlzY2FsaS5pdD4KKworCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSAgcHVsc2U6IERlZmluZSBQQVRIX01BWCBpZiBpdCBpc24ndCBkZWZpbmVkCisJICBHTlUgSHVyZCBmb3IgZXhhbXBsZSBkb2Vzbid0IGRlZmluZSBpdC4KKworMjAxMS0wNS0xNSAyMzoyNToxNSArMDMwMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGNhbGN1bGF0ZSBzZWdtZW50IGR1cmF0aW9uIGFmdGVyIHBhcnNpbmcgYWxsIHRoZSBJRHMKKwkgIFNpbmNlIHRoZSBzZWdtZW50IGR1cmF0aW9uIGlzIGdpdmVuIGluIHRlcm1zIG9mIHRoZQorCSAgR1NUX01BVFJPU0tBX0lEX1RJTUVDT0RFU0NBTEUgd2Ugc2hvdWxkIG9ubHkgY29udmVydCBpdCBpbnRvCisJICBuYW5vc2Vjb25kcyB3aGVuIHdlIGFyZSBzdXJlIHRoYXQgYW55IHNjYWxlIHNwZWNpZmllZCBpbiB0aGUgZmlsZSBoYXMKKwkgIGJlZW4gcmVhZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTAyNTgKKworMjAxMS0wNS0wOSAxOTowMDo0NSArMDIwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDxhbW9yYWxlc0BmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBBZGQgc3VwcG9ydCBmb3IgbXBlZ3ZlcnNpb24gMiwgd2hpY2ggaXMgYWxzbyBBQUMKKworMjAxMS0wNS0xMSAxMDoyNToxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuaDoKKwkgIGZsYWNkZWM6IFNlbmQgRU9TIHdoZW4gc2Vla2luZyBhZnRlciB0aGUgZW5kIG9mIGZpbGUgaW5zdGVhZCBvZiBmYWlsaW5nCisJICBGaXhlcyBidWcgIzY0OTc4MC4KKworMjAxMS0wNC0yOSAwODo1OToyMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6CisJICB3YXZlbmM6IFNldCBmaXhlZGNhcHMgZ2V0Y2FwcyBmdW5jdGlvbiBvbiB0aGUgc2lua3BhZAorCSAgd2F2ZW5jIGRvZXMgbm90IGFsbG93IHRvIGNoYW5nZSB0aGUgY2FwcyBkdXJpbmcgcGxheWJhY2sKKwkgIGFuZCBhbHdheXMgcmV0dXJuaW5nIHRoZSB0ZW1wbGF0ZSBjYXBzIGlzIGp1c3Qgd3JvbmcuCisKKzIwMTEtMDQtMjkgMDg6NTU6MTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSAgd2F2ZW5jOiBBbGxvdyBzZXRjYXBzIHRvIGJlIGNhbGxlZCBhZnRlciBhIGZvcm1hdCB3YXMgbmVnb3RpYXRlZCBpZiBpdCdzIGNvbXBhdGlibGUKKwkgIE90aGVyd2lzZSB3YXZlbmMgd2lsbCBmYWlsIGlmIHVwc3RyZWFtIGRlY2lkZXMgdG8gc2V0IGVxdWl2YWxlbnQgY2FwcyBvciBjYXBzCisJICB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbGF0ZXIuCisJICBUaGFua3MgdG8gQWxleGFuZGVyIFNjaHJlbW1lciBmb3IgZmluZGluZyB0aGlzIGJ1Zy4KKworMjAxMS0wNS0xNCAxMDowMjoyMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQKKworPT09IHJlbGVhc2UgMC4xMC4yOSA9PT0KKworMjAxMS0wNS0xMCAxMDowNDoyOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAwLjEwLjI5CisJICBIaWdobGlnaHRzOgorCSAgLSBhbXJwYXJzZSwgYWFjcGFyc2UsIGFjM3BhcnNlLCBmbGFjcGFyc2UsIG1wZWdhdWRpb3BhcnNlLCBkY2FwYXJzZSBhdWRpbyBwYXJzZXJzIChtb3ZlZCBmcm9tIC1iYWQpCisJICAtIG11eGVycyBub3cgbXV4IGJhc2VkIG9uIHJ1bm5pbmcgdGltZQorCSAgLSBJU08gTVA0IG11eGVyczogbXA0bXV4LzNncHBtdXgvcXRtdXgvbWoybXV4IChtb3ZlZCBmcm9tIC1iYWQpCisJICAtIG5ldyBtYXRyb3NrYXBhcnNlIGVsZW1lbnQKKwkgIC0gbmV3IHY0bDJyYWRpbyBlbGVtZW50CisJICAtIHJ0cHNlc3Npb246IHN1cHBvcnQgUlRDUCBFYXJseSBGZWVkYmFjayAodGhlIEFWUEYgcHJvZmlsZSkKKwkgIC0gb3JjIDAuNC4xNCBvciBuZXdlciByZWNvbW1lbmRlZAorCSAgLSBtYW55IG90aGVyIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMKKworMjAxMS0wNS0wNSAxMzoyNDoyMyArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBGaXggc2lnbmVkIGZsb2F0aW5nIHBvaW50IHZhbHVlcyB3cml0aW5nCisJICBZb3Ugd291bGQgZW5kIHVwIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcyB3aXRoIDAgYmVpbmcgd3JpdHRlbiBvdXQKKwkgIGluc3RlYWQgb2YgdGhlIHByb3BlciB2YWx1ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDk0NDkKKworMjAxMS0wNS0wNCAxMjowNDoxNSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBhdm9pZCBidWlsZGluZyBpbmRleCB3aGVuIHN0cmVhbWFibGUKKwkgIC4uLiBhcyBpdCB3aWxsIG5vdCBiZSB3cml0dGVuIGFueXdheS4KKwkgIEZpeGVzICM2NDg5MzcgKD8pLgorCisyMDExLTA1LTAyIDEyOjA5OjAyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogTWFrZWZpbGUuYW06CisJICBidWlsZDogYWRkIG9sZCBxdGRlbXV4L3F1aWNrdGltZSBkaXJlY3RvcmllcyB0byBDUlVGVF9ESVJTIGFuZCBDUlVGVF9GSUxFUworCisyMDExLTA1LTAxIDAwOjA0OjAzIC0wNDAwICBUb20gSmFuaXN6ZXdza2kgPHRvbS5qYW5pc3pld3NraUBhbGNhdGVsLWx1Y2VudC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IGRvbid0IG92ZXJ3cml0ZSBtZXRhZGF0YSB0YWcgd2l0aCBkdXJhdGlvbiBpbiBzdHJlYW1pbmcgbW9kZQorCSAgQSBkdXJhdGlvbiB0YWcgZ2V0cyBpbnNlcnRlZCBvbmx5IGZvciBzdHJlYW1hYmxlPWZhbHNlLCBzbyBvbmx5CisJICB1cGRhdGUvd3JpdGUgdGhlIGR1cmF0aW9uIGxhdGVyIGlmIHdlIGFjdHVhbGx5IGluc2VydGVkIHRoYXQgdGFnLAorCSAgb3RoZXJ3aXNlIHdlIHdyaXRlIGdhcmJhZ2UgaW50byBvdGhlciB0YWdzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0OTA2MAorCisyMDExLTA0LTMwIDE4OjE2OjM2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBwby9mci5wbzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIDAuMTAuMjguNCBwcmUtcmVsZWFzZQorCisyMDExLTA0LTMwIDE3OjQ2OjM2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogQW5kcm9pZC5tazoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJKiBnc3QvaXNvbXA0L0xFR0FMOgorCSogZ3N0L2lzb21wNC9NYWtlZmlsZS5hbToKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvYXRvbXMuaDoKKwkqIGdzdC9pc29tcDQvYXRvbXNyZWNvdmVyeS5jOgorCSogZ3N0L2lzb21wNC9hdG9tc3JlY292ZXJ5Lmg6CisJKiBnc3QvaXNvbXA0L2Rlc2NyaXB0b3JzLmM6CisJKiBnc3QvaXNvbXA0L2Rlc2NyaXB0b3JzLmg6CisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9mdHlwY2MuaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtb292cmVjb3Zlci5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG1vb3ZyZWNvdmVyLmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LWRvYy5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC1kb2MuaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXhtYXAuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXhtYXAuaDoKKwkqIGdzdC9pc29tcDQvZ3N0cnRweHF0ZGVwYXkuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cnRweHF0ZGVwYXkuaDoKKwkqIGdzdC9pc29tcDQvaXNvbXA0LXBsdWdpbi5jOgorCSogZ3N0L2lzb21wNC9wcm9wZXJ0aWVzLmM6CisJKiBnc3QvaXNvbXA0L3Byb3BlcnRpZXMuaDoKKwkqIGdzdC9pc29tcDQvcXRhdG9tcGFyc2VyLmg6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LnZjcHJvajoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9kdW1wLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X2xhbmcuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9sYW5nLmg6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF90eXBlcy5oOgorCSogZ3N0L2lzb21wNC9xdHBhbGV0dGUuaDoKKwkqIHBvL1BPVEZJTEVTLmluOgorCSAgcXVpY2t0aW1lOiByZW5hbWUgcGx1Z2luIHRvIGlzb21wNAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0ODAwNAorCisyMDExLTA0LTI5IDE3OjU1OjI4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IGZpeCBzb21lIHBhcnNlcnMKKworMjAxMS0wNC0yOSAxNzo1NDo0MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgZml4IGVycm9yIGNhdXNlZCBieSBtZXJnaW5nCisKKzIwMTEtMDQtMjkgMTU6NDk6NDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIGNvbmZpZ3VyZS5hYworCSAgZ3N0L3J0cC9nc3RydHBnc3RwYXkuYworCisyMDExLTA0LTI5IDE1OjQ2OjIxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSAgYXVkaW9meDogZml4IHBhZF9hbGxvYworCisyMDExLTA0LTI3IDEyOjQ1OjUxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogcG8vYmcucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vcnUucG86CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjI4LjMgcHJlLXJlbGVhc2UKKworMjAxMS0wNC0yNiAxNTo1ODoxMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIHJ0cGdzdHBheTogZml4IGJ1ZmZlciBsZWFrCisKKzIwMTEtMDQtMjYgMTU6NTg6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJICBydHBnc3RwYXk6IGZpeCBidWZmZXIgbGVhaworCisyMDExLTA0LTI2IDE1OjQyOjQ3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgIGphY2s6IHBvcnQgamFjayBlbGVtZW50cworCisyMDExLTA0LTI1IDEwOjA0OjUyICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcGpAb3BlcmEuY29tPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBkb2N1bWVudGF0aW9uIHR5cG8gImpwZWdkZGVjIgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0ODU4OQorCisyMDExLTA0LTI1IDE4OjE0OjQ1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSAgcnRwOiBwb3J0IHNvbWUgbW9yZSBlbGVtZW50cworCisyMDExLTA0LTI1IDE3OjI3OjQwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIycGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY21hcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211cGF5LmM6CisJICBydHA6IHBvcnQgbW9yZSB0byAwLjExCisKKzIwMTEtMDQtMjUgMTM6MTY6NTggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJICBydHA6IHBvcnQgc29tZSBtb3JlIChkZSlwYXlsb2FkZXJzCisKKzIwMTEtMDQtMjUgMTI6NDk6MzYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9lY2hvLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2ZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlaWlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICBwb3J0IHNvbWUgbW9yZSBlbGVtZW50cyB0byAwLjExCisKKzIwMTEtMDQtMjUgMTE6Mzg6MjggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0wNC0yNCAxNjo0NTowNyAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBhdmltdXgsbWF0cm9za2FtdXg6IEFkZCBzdHJlYW0tZm9ybWF0IHRvIGgyNjQgY2FwcworCSAgRml4ZXMgIzYwNjY2Mi4KKworMjAxMS0wMi0yMCAxMjoxMzo0OSAtMDgwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJICBwbmdkZWM6IFJlbW92ZSB0ZW1wb3JhcnkgY29kZQorCSAgTm93IHRoYXQgd2UgZGVwZW5kIG9uICh3aGF0IHdpbGwgYmUpIC1iYXNlLTAuMTAuMzMuCisKKzIwMTEtMDQtMjQgMTQ6MDM6NTYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IGRvbid0IHBhc3MgLVdhZGRyZXNzIHRvIE9iakMgY29tcGlsZXIgb24gT1NYIHdoZW4gY29tcGlsaW5nIG9zeHZpZGVvc2luaworCSAgVGVtcG9yYXJ5IHdvcmthcm91bmQgdW50aWwgd2UgZml4IHRoaXMgcHJvcGVybHkgYW5kIGNoZWNrIGZvcgorCSAgdGhlIE9iakMgd2FybmluZy9lcnJvciBmbGFncyBpbnN0ZWFkIG9mIGp1c3QgcGFzc2luZyBDRkxBR1MgdG8gdGhlCisJICBPYmpDIGNvbXBpbGVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0MzkzOQorCisyMDExLTA0LTI0IDEzOjI5OjMyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJKiBnc3QvcXVpY2t0aW1lL01ha2VmaWxlLmFtOgorCSAgcXVpY2t0aW1lOiByZW5hbWUgcGx1Z2luIGZpbGVuYW1lIGZyb20gKnF0ZGVtdXgqIHRvICpxdWlja3RpbWUqCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ4MDA0CisKKzIwMTEtMDQtMjQgMTQ6MDM6NDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gYzNjYWZlMSB0byA0NmRmY2VhCisKKzIwMTEtMDQtMjEgMjM6MzA6MjYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZ3N0L3F1aWNrdGltZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtb292cmVjb3Zlci5jOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC1kb2MuYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXgtZG9jLmg6CisJICBkb2NzOiBhZGQgdmFyaW91cyBxdG11eCB2YXJpYW50cyB0byBkb2N1bWVudGF0aW9uCisKKzIwMTEtMDQtMjEgMjI6NTE6NTIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmg6CisJICBxdWlja3RpbWU6IHJlZ2lzdGVyIDNncHBtdXggZWxlbWVudCBpbiBhZGRpdGlvbiB0byB0aGUgbWlzbmFtZWQgZ3BwbXV4CisKKzIwMTEtMDQtMTggMTg6MDg6MzAgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjogUmVtb3ZlIGluY29tcGxldGUgc3VwcG9ydCBmb3IgUlRDUCBGSVIKKwkgIFJlbW92ZSBiaXRzIHRoYXQgd2VyZSBtZWFudCB0byBzdXBwcG9ydCBSVENQIEZJUgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0ODE2MAorCisyMDExLTA0LTE5IDE4OjU1OjMxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjdGFnLmM6CisJICBmbGFjOiBwb3J0IHRvIDAuMTEKKworMjAxMS0wNC0xOSAxNzozNTo0NyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRwZGVjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1c2UgR19ERUZJTkVfVFlQRSBzb21lIG1vcmUKKworMjAxMS0wNC0xOSAxNzoyMDoxOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkgIGF2aTogdXNlIEdfREVGSU5FX1RZUEUKKworMjAxMS0wNC0xOSAxNzowNzoxOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlbWl4ZXIuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkgIHVzZSBHX0RFRklORV9UWVBFCisKKzIwMTEtMDQtMTkgMTY6MjU6MjggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0wNC0xOSAxNDozMzoyNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZ2VuZXJpYy8uZ2l0aWdub3JlOgorCSogdGVzdHMvY2hlY2svZ2VuZXJpYy9pbmRleC5jOgorCSAgdGVzdHM6IGFkZCBnZW5lcmljIHNldF9pbmRleCB0ZXN0CisKKzIwMTEtMDQtMTkgMTQ6MzM6NDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogZml4IGRlYWRsb2NrIG9uIHNldHRpbmcgaW5kZXggb24gZmx2ZGVtdXgKKworMjAxMS0wNC0xOSAxNDoxNjoxMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsYWNwYXJzZS5jOgorCSAgdGVzdHM6IGFkZCBpbmRleC1zZXR0aW5nIHRlc3QgZm9yIGJhc2VwYXJzZS9mbGFjcGFyc2UKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDY4MTEKKworMjAxMS0wNC0xOCAxMToyOToxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZwYWNrLmM6CisJICB3YXZwYWNrOiBSZW1vdmUgYnVzIEdTb3VyY2UgdG8gcHJldmVudCBhIHZhbGdyaW5kIHdhcm5pbmcKKworMjAxMS0wNC0xOCAxMToxNDozMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZlbmMuYzoKKwkgIHdhdmVuYzogUmVtb3ZlIGJ1cyBHU291cmNlIHRvIHByZXZlbnQgYSB2YWxncmluZCB3YXJuaW5nCisKKzIwMTEtMDQtMTggMTE6MTE6NTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvdGFnc2NoZWNraW5nLmM6CisJICB0YWdzY2hlY2tpbmc6IFJlbW92ZSBidXMgR1NvdXJjZSB0byBwcmV2ZW50IGEgdmFsZ3JpbmQgd2FybmluZworCisyMDExLTA0LTE4IDExOjEwOjAxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW1hZ2VmcmVlemUuYzoKKwkgIGltYWdlZnJlZXplOiBSZW1vdmUgYnVzIEdTb3VyY2UgdG8gcHJldmVudCBhIHZhbGdyaW5kIHdhcm5pbmcKKworMjAxMS0wNC0xOCAxMDo1NDo0MyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSAgcG9ydCBtb3JlIHBsdWdpbnMgdG8gMC4xMQorCisyMDExLTA0LTE4IDEwOjIzOjQ1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBhbmRyb2lkL2FwZXRhZy5taworCSAgYW5kcm9pZC9hdmkubWsKKwkgIGFuZHJvaWQvZmx2Lm1rCisJICBhbmRyb2lkL2ljeWRlbXV4Lm1rCisJICBhbmRyb2lkL2lkM2RlbXV4Lm1rCisJICBhbmRyb2lkL3F0ZGVtdXgubWsKKwkgIGFuZHJvaWQvcnRwLm1rCisJICBhbmRyb2lkL3J0cG1hbmFnZXIubWsKKwkgIGFuZHJvaWQvcnRzcC5taworCSAgYW5kcm9pZC9zb3VwLm1rCisJICBhbmRyb2lkL3VkcC5taworCSAgYW5kcm9pZC93YXZlbmMubWsKKwkgIGFuZHJvaWQvd2F2cGFyc2UubWsKKwkgIGNvbmZpZ3VyZS5hYworCisyMDExLTA0LTE3IDAxOjI5OjAxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGZpeCAndmFyaWFibGUgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZCcgd2FybmluZ3MgY2F1c2VkIGJ5IC1ER19ESVNBQkxFX0FTU0VSVAorCisyMDExLTA0LTE2IDE4OjUwOjExICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSogd2luMzIvY29tbW9uL2dzdHJ0cGJpbi1tYXJzaGFsLmM6CisJKiB3aW4zMi9jb21tb24vZ3N0cnRwYmluLW1hcnNoYWwuaDoKKwkgIDAuMTAuMjguMiBwcmUtcmVsZWFzZQorCisyMDExLTA0LTE2IDE4OjQ5OjI3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0LmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLWRpc3QuaDoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy1kaXN0LmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMtZGlzdC5oOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRvcmMtZGlzdC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRvcmMtZGlzdC5oOgorCSAgZ3N0OiB1cGRhdGUgZGlzdGVkIG9yYyBiYWNrdXAgY29kZQorCisyMDExLTA0LTE2IDE4OjI5OjQ1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb25vc2NvcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSAgZG9jczogdXBkYXRlIGZvciBwcmUtcmVsZWFzZQorCisyMDExLTA0LTE2IDE4OjI3OjU0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vYmcucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZXMucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL3NsLnBvOgorCSAgcG86IHVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAxMS0wNC0xNiAxODoxNzowMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiByZWZ1c2UgaW5jb21wbGV0ZSBsZWdhY3kgaDI2NCBjYXBzCisJICBSZWZ1c2UgaDI2NCBjYXBzIHdpdGhvdXQgc3RyZWFtLWZvcm1hdCBhbmQgY29kZWNfZGF0YSBmaWVsZHMgZm9yCisJICBub3csIHRvIGF2b2lkIGNyZWF0aW5nIGJyb2tlbiBmaWxlcy4gVGhpcyBtaWdodCBjYXVzZSBzb21lIHBpcGVsaW5lcworCSAgdGhhdCB3b3JrZWQgcHJldmlvdXNseSB0byBmYWlsLiBIb3dldmVyLCB0aGUgbW92ZSBmcm9tIC1iYWQgdG8gLWdvb2QKKwkgIGlzIG91ciBvbmx5IGNoYW5jZSB0byBmaXggdGhpcyB1cCwgc28gbWFrZSBpdCBzdHJpY3QgZm9yIG5vdy4gV2UgY2FuCisJICBhbHdheXMgY2hhbmdlIGl0IGJhY2sgdG8gYmUgbGVzcyBzdHJpY3QgaW4gZnV0dXJlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0NzkxOQorCisyMDExLTA0LTE2IDE4OjE2OjExICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDJzaW5rOiBmaXggYW5vdGhlciB1bnVzZWQtYnV0LXNldC12YXJpYWJsZSB3YXJuaW5nCisKKzIwMTEtMDQtMTYgMTg6MTA6MjQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkgIHB1bHNlLCBzcGVleGVuYywgcnRwZ3NtcGF5OiBkb24ndCB1c2UgZ19hc3NlcnQoKSBmb3IgZXJyb3IgaGFuZGxpbmcKKwkgIERvbid0IHVzZSBnX2Fzc2VydCgpIGZvciBlcnJvciBoYW5kbGluZywgZXZlbiBpZiB0aGV5J3JlIGhpZ2hseSB1bmxpa2VseS4KKwkgIEVpdGhlciB3ZSAqa25vdyogdGhhdCBzb21ldGhpbmcgY2FuJ3QgaGFwcGVuLCBpbiB3aGljaCBjYXNlIHdlCisJICBzaG91bGQganVzdCBub3QgaGFuZGxlIGl0LCBvciB3ZSB0aGluayBzb21ldGhpbmcgY2FuIGhhcHBlbiwgYnV0IGl0IGlzCisJICB2ZXJ5IHZlcnkgdW5saWtlbHkgdGhhdCBpdCB3aWxsIGV2ZXIgaGFwcGVuLCBpbiB3aGljaCBjYXNlIHdlIHNob3VsZAorCSAgaGFuZGxlIGl0IGxpa2UgYW55IG90aGVyIGVycm9yIGluc3RlYWQgb2YgYXNzZXJ0aW5nLgorCSAgZ19hc3NlcnQoKSBpcyBiZXN0IGxlZnQgZm9yIGNvbmRpdGlvbnMgd2UgaGF2ZSBjb250cm9sIG9mLCBsaWtlIGNoZWNraW5nCisJICBpbnRlcm5hbCBjb25zaXN0ZW5jeSBvZiBvdXIgY29kZSwgbm90IGNoZWNraW5nIHJldHVybiB2YWx1ZXMgb2YgZXh0ZXJuYWwKKwkgIGNvZGUuCisJICBGaXhlcyBhIGJ1bmNoIG9mIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIHdpdGggLURHX0RJU0FCTEVfQVNTRVJUOgorCSAgZ3N0cnRwZ3NtcGF5LmM6IEluIGZ1bmN0aW9uICdnc3RfcnRwX2dzbV9wYXlfaGFuZGxlX2J1ZmZlcic6CisJICBnc3RydHBnc21wYXkuYzoxMzA6MTc6IHdhcm5pbmc6IHZhcmlhYmxlICdydHBnc21wYXknIHNldCBidXQgbm90IHVzZWQKKwkgIGdzdHNwZWV4ZW5jLmM6IEluIGZ1bmN0aW9uICdnc3Rfc3BlZXhfZW5jX2VuY29kZSc6CisJICBnc3RzcGVleGVuYy5jOjkwNDoxOTogd2FybmluZzogdmFyaWFibGUgJ3dyaXR0ZW4nIHNldCBidXQgbm90IHVzZWQKKwkgIHB1bHNlc2luay5jOiBJbiBmdW5jdGlvbiAnZ3N0X3B1bHNlc2lua19jaGFuZ2Vfc3RhdGUnOgorCSAgcHVsc2VzaW5rLmM6MjcyNTo5OiB3YXJuaW5nOiB2YXJpYWJsZSAncmVzJyBzZXQgYnV0IG5vdCB1c2VkCisJICBwdWxzZXNyYy5jOiBJbiBmdW5jdGlvbiAnZ3N0X3B1bHNlc3JjX2NoYW5nZV9zdGF0ZSc6CisJICBwdWxzZXNyYy5jOjEyNTM6Nzogd2FybmluZzogdmFyaWFibGUgJ2UnIHNldCBidXQgbm90IHVzZWQKKworMjAxMS0wNC0xNiAxODowNzozNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLmM6CisJICBleGFtcGxlczogZml4IHNvbWUgd2FybmluZ3MgaW4gcnRwIGV4YW1wbGUKKwkgIENhdXNlZCBieSAtREdfRElTQUJMRV9BU1NFUlQKKworMjAxMS0wNC0xNiAxNzo1NzozMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL2xldmVsL2xldmVsLWV4YW1wbGUuYzoKKwkgIGV4YW1wbGVzOiBkb24ndCBwdXQgY29kZSB3aXRoIHNpZGUtZWZmZWN0cyBpbnRvIGdfYXNzZXJ0KCkKKwkgIE90aGVyd2lzZSB0aGluZ3Mgd29uJ3Qgd29yayB0b28gd2VsbCB3aGVuIGNvbXBpbGluZyB3aXRoCisJICAtREdfRElTQUJMRV9BU1NFUlQgKGFzIHdlIGRvIGZvciBwcmUtcmVsZWFzZXMgYW5kIHJlbGVhc2VzKS4KKworMjAxMS0wNC0xNiAxNjo1MTozMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgZGVpbnRlcmxhY2UsIG1hdHJvc2thOiBmaXggdHdvIHZhcmlhYmxlLW1heS1iZS11c2VkLXVuaW5pdGlhbGl6ZWQgY29tcGlsZXIgd2FybmluZ3MKKwkgIFdlIHVzZSAtREdfRElTQUJMRV9BU1NFUlQgZm9yIHRoZSBwcmUtcmVsZWFzZXMsIHdoaWNoIG1ha2VzIHRoZXNlCisJICB3YXJuaW5ncyBwb3AgdXAgaW4gY2FzZXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgY292ZXJlZCBieSBnX2Fzc2VydF9ub3RfcmVhY2hlZCgpCisJICBhbmQgdGhlIGxpa2U6CisJICB0dnRpbWUvZ3JlZWR5aC5jOjgwMToxNDogd2FybmluZzogJ3NjYW5saW5lJyBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24KKwkgIG1hdHJvc2thLW11eC5jOjUwMToxOTogd2FybmluZzogJ2NvbnRleHQnIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbgorCisyMDExLTA0LTE2IDE0OjQ1OjI1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOgorCSAgYXBlZGVtdXg6IFBvcnQgdG8gMC4xMQorCisyMDExLTA0LTE2IDEzOjMzOjQ1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICBqYWNrOiBmaXggdW51c2VkLWJ1dC1zZXQtdmFyaWFibGUgd2FybmluZ3Mgd2l0aCBnY2MtNC42CisKKzIwMTEtMDQtMTYgMTM6MjM6NTAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9jYWlyby9jYWlyb19vdmVybGF5LmM6CisJICBleGFtcGxlczogZml4ICdjb250cm9sIHJlYWNoZXMgZW5kIG9mIG5vbi12b2lkIGZ1bmN0aW9uJyB3YXJuaW5nIGluIGNhaXJvIGV4YW1wbGUKKworMjAxMS0wNC0xNSAxNTo0NzoyNCArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBBZGRyZXNzIHVudXNlZCBidXQgc2V0IHZhcmlhYmxlCisJICBUaGUgdjRsMm9iamVjdCBmb3JtYXRzIGxpc3Qgd2FzIGJlaW5nIG9idGFpbmVkIGludG8gYSBsb2NhbCB2YXJpYWJsZSBhbmQKKwkgIHRoZW4gc3RpbGwgdXNlZCBmcm9tIHRoZSBjb250ZXh0LiBNYWtlIHVzZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUuCisKKzIwMTEtMDQtMTUgMTU6MTc6MzQgKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zczQvb3NzNC1taXhlci1zbGlkZXIuYzoKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXItc3dpdGNoLmM6CisJKiBzeXMvb3NzNC9vc3M0LXByb3BlcnR5LXByb2JlLmM6CisJKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOgorCSAgb3NzNDogQWRkcmVzcyB1bnVzZWQgYnV0IHNldCB2YXJpYWJsZXMKKwkgIEdDQyA0LjYueCBjb21wbGFpbnMgYWJvdXQgc3VjaCB2YXJpYWJsZSB1c2FnZS4gVW51c2VkIGJ1dCBzZXQgdmFyaWFibGVzCisJICB3ZXJlIHJlbW92ZWQgZXhjZXB0IHRoYXQgZ3N0X29zczRfbWl4ZXJfc2xpZGVyX3NldF9tdXRlICgpIG5vdyByZXR1cm5zCisJICB0aGUgdmFsdWUgZnJvbSB0aGUgY2FsbCB0byBnc3Rfb3NzNF9taXhlcl9zZXRfY29udHJvbF92YWwgKCkuCisKKzIwMTEtMDQtMTUgMTU6MTQ6MTMgKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJICBqcGVnZW5jOiBwdWxzZXNpbms6IHJhdzEzOTQ6IEFkZHJlc3MgdW51c2VkIGJ1dCBzZXQgdmFyaWFibGVzCisJICBHQ0MgNC42Lnggc3BpdHMgd2FybmluZ3MgYWJvdXQgc3VjaCB1c2FnZSBvZiB2YXJpYWJsZXMuIFRoZSB2YXJpYWJsZXMgaW4KKwkgIHJhdzEzOTQgd2VyZSBtYXJrZWQgd2l0aCBHX0dOVUNfVU5VU0VEIGFzIHRoaXMgc2VlbWVkIG9tcmUgYXBwcm9wcmlhdGUuCisJICBUaGUgb3RoZXJzIHdlcmUgcmVtb3ZlZC4KKworMjAxMS0wNC0xNSAxNToxMjo0NCArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIHk0bWVuY29kZTogc2hhcGV3aXBlOiBBZGRyZXNzIHVudXNlZCBidXQgc2V0IHZhcmlhYmxlcworCSAgR0NDIDQuNi54IGNvbXBsYWlucyBhYm91dCBzdWNoIHVzYWdlLgorCisyMDExLTA0LTE1IDE1OjExOjM1ICswMjAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsYWNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL2ZsYWNkZWMuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL2xldmVsL2xldmVsLWV4YW1wbGUuYzoKKwkqIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6CisJKiB0ZXN0cy9pY2xlcy94aW1hZ2VzcmMtdGVzdC5jOgorCSAgdGVzdHM6IEFkZHJlc3MgdW51c2VkIGJ1dCBzZXQgdmFyaWFibGVzCisJICBHQ0MgNC42Lnggc3BpdHMgd2FybmluZ3MgYWJvdXQgc3VjaCB1c2FnZSBvZiB2YXJpYWJsZXMuCisKKzIwMTEtMDQtMTUgMTU6MzY6NDEgKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRvcmMub3JjOgorCSAgdmlkZW9taXhlcjogRml4IGFyZ2IvcmdiYSBvdmVybGF5IG9yYyBjb2RlCisJICBSZW1vdmUgc29tZSByZWR1bmRhbnQgb3BlcmF0aW9ucyAoY29udnVidykgYW5kIHVzZSB0aGUgY29ycmVjdCB2YXJpYWJsZSwKKwkgIHQyLCBpbiB0aGUgb3JjX292ZXJsYXlfYmdyYSBmdW5jdGlvbi4KKworMjAxMS0wNC0xNSAxNTozMzozNSArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvZ3N0Y29sbGVjdHBhZHMyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogYWRkcmVzcyB1bnVzZWQgYnV0IHNldCB2YXJpYWJsZXMKKwkgIEdDQyA0LjYueCBzcGl0cyB3YXJuaW5ncyBhYm91dCB2YXJpYWJsZXMgdGhhdCBhcmUgc2V0IGJ1dCB1bnVzZWQuIFN1Y2gKKwkgIHZhcmlhYmxlcyBoYXZlIGJlZW4gcmVtb3ZlZCBpbiBibGVuZCwgY29sbGVjdHBhZHMyIGFuZCB2aWRlb21peGVyMi4KKworMjAxMS0wNC0xNSAxNDo1NzoyMCArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cCwgcnRwbWFuYWdlcjogQWRkcmVzcyB1bnVzZWQgYnV0IHNldCB2YXJpYWJsZXMKKwkgIEdDQyA0LjYueCBzcGl0cyB3YXJuaW5ncyBhYm91dCB2YXJpYWJsZXMgdGhhdCBhcmUgdW51c2VkIGJ1dCBzZXQuIFN1Y2gKKwkgIHZhcmlhYmxlcyBoYXZlIGJlZW4gcmVtb3ZlZCB3aGVyZSB0cml2aWFsIGJ1dCB3aXRoIGNvbW1lbnRzIGxlZnQgYmVoaW5kCisJICBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBpbiBzb21lIGNhc2VzLgorCSAgZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3JlY3ZfcnRjcCAoKSB3YXMgY2hhbmdlZCBpbiBjb21taXQgNDkwMTEzZDQKKwkgIHRvIGFsd2F5cyByZXR1cm4gR1NUX0ZMT1dfT0sgaW5zdGVhZCBvZiB0aGUgcmV0dXJuIHZhbHVlIG9mCisJICBydHBfc2Vzc2lvbl9wcm9jZXNzX3J0Y3AgKCksIHNvIHdlJ2xsIGtlZXAgaXQgdGhhdCB3YXkuCisKKzIwMTEtMDQtMTUgMTE6Mjk6MzAgKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9kZXNjcmlwdG9ycy5jOgorCSogZ3N0L3F1aWNrdGltZS9nc3RydHB4cXRkZXBheS5jOgorCSogZ3N0L3F1aWNrdGltZS9xdGRlbXV4LmM6CisJICBxdWlja3RpbWU6IFJlbW92ZSB1bnVzZWQgYnV0IHNldCB2YXJpYWJsZXMKKwkgIEdDQyA0LjYueCBzcGl0cyB3YXJuaW5ncyBhYm91dCBzdWNoIHZhcmlhYmxlIHVzYWdlLiBOb3RlIHRoYXQgc29tZQorCSAgY2FsY3VsYXRpb25zIGFyZSBsZWZ0IGFzIGNvbW1lbnRzIGZvciBpbmZvcm1hdGl2ZSBwdXJwb3Nlcy4KKworMjAxMS0wNC0xNSAxMToyMzozOCArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSAgbWF0cm9za2E6IFJlbW92ZSB1bnVzZWQgYnV0IHNldCB2YXJpYWJsZXMKKwkgIEdDQyA0LjYueCBzcGl0cyB3YXJuaW5ncyBhYm91dCBzdWNoIHZhcmlhYmxlIHVzYWdlLgorCisyMDExLTA0LTE1IDExOjE5OjI2ICswMjAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IFJlbW92ZSB1bnVzZWQgYnV0IHNldCBkdXJhdGlvbiB2YXJpYWJsZQorCSAgR0NDIDQuNi54IHNwaXRzIHdhcm5pbmdzIGFib3V0IHN1Y2ggdmFyaWFibGUgdXNhZ2UuCisKKzIwMTEtMDQtMTUgMTE6MTg6MTkgKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx4ZGVtdXg6IFJlbW92ZSB1bnVzZWQgYnV0IHNldCBrZXlmcmFtZSB2YXJpYWJsZXMKKwkgIFRoZSBGSVhNRXMgYWJvdXQgdGhlIGtleWZyYW1lIGZsYWcgbmV2ZXIgYmVpbmcgdXNlZCBhcmUgbGVmdCBmb3IgbGF0ZXIKKwkgIGZpeGluZywgYXQgd2hpY2ggcG9pbnQgdGhlIGtleWZyYW1lIHZhcmlhYmxlcyBjb3VsZCBiZSBhZGRlZCBiYWNrLgorCisyMDExLTA0LTE1IDExOjE2OjQyICswMjAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdGVkZ2UuYzoKKwkgIGVkZ2V0djogUmVtb3ZlIHVudXNlZCBidXQgc2V0IGhlaWdodCB2YXJpYWJsZQorCSAgR0NDIDQuNi54IHNwaXRzIHdhcm5pbmdzIGFib3V0IHN1Y2ggdmFyaWFibGVzLgorCisyMDExLTA0LTE1IDE4OjUxOjIwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogdXBkYXRlIGZvciBnc3RfYmFzZV9wYXJzZV9mcmFtZV9pbml0KCkgQVBJIGNoYW5nZQorCisyMDExLTAyLTAxIDE1OjU3OjAxIC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IFVzZSBleGlzdGluZyBmdW5jdGlvbnMgdG8gcGFyc2UgUlRDUCBGQiBwYWNrZXRzCisJICBVc2UgZXhpc3RpbmcgZnVuY3Rpb25zIHRvIGdldCB0aGUgRkNJIGZyb20gRkIgcGFja2V0cy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MjI1NTMKKworMjAxMS0wMi0wMSAxNjoyMzo1MiAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4tbWFyc2hhbC5saXN0OgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogbWFyc2hhbCBHc3RCdWZmZXIgYXMgYSBNaW5pT2JqZWN0IGluc3RlYWQgb2YgYSBwb2ludGVyCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjIyNTUzCisKKzIwMTEtMDQtMTQgMjM6MjQ6NTYgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IEJldHRlciBjYWxjdWxhdGlvbiBvZiBmcmFtZXJhdGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDc4MzMKKworMjAxMS0wNC0xMyAxMjozNzowOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBkZWZhdWx0IHRvIGR0cy1tZXRob2Q9cmVvcmRlciBhbmQgcHJlc2VudGF0aW9uLXRpbWU9dHJ1ZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzNjY5OQorCisyMDExLTA0LTE1IDEyOjQ3OjUyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkgIHRlc3RzOiBxdG11eDogdGVzdCB2YXJpb3VzIGR0cy1tZXRob2RzCisKKzIwMTEtMDQtMTUgMTI6MzQ6MDUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogZml4IGNvcm5lciBjYXNlIGJ1ZmZlciBoYW5kbGluZyBmb3IgcmVvcmRlciBtZXRob2QKKworMjAxMS0wNC0xNCAxMzo0NzowNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBEb24ndCBsZWFrIHRoZSBTRUVLSU5HIHF1ZXJ5CisKKzIwMTEtMDQtMTQgMTM6NDM6MDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bW9vdnJlY292ZXIuYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtb292cmVjb3Zlci5oOgorCSAgcXRtb292cmVjb3ZlcjogRG9uJ3QgbGVhayB0aGUgc3RhdGljIHJlY3Vyc2l2ZSBtdXRleAorCisyMDExLTA0LTE0IDEzOjM3OjUyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnJhZGlvLmM6CisJICB2NGwycmFkaW86IEZyZWUgdmlkZW9kZXYgc3RyaW5nIGJlZm9yZSByZXBsYWNpbmcgaXQKKworMjAxMS0wNC0xNCAxMzoyNDoyMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSAgbWF0cm9za2FwYXJzZTogQWxsb3cgd2VibSBhbmQgbWF0cm9za2EgY2FwcyBhbmQgZG9uJ3QgbGVhayBjYXBzCisKKzIwMTEtMDQtMTQgMDc6MzU6MjkgKzAxMDAgIENocmlzdGlhbiBGcmVkcmlrIEthbGFnZXIgU2NoYWxsZXIgPGNocmlzdGlhbi5zY2hhbGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIEFkZCBwYXJzZXIgcGx1Z2luCisKKzIwMTEtMDQtMTMgMjE6NTg6MzYgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvTWFrZWZpbGUuYW06CisJKiBnc3QvZHRtZi9nc3RkdG1mY29tbW9uLmg6CisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5oOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5oOgorCSAgZHRtZjogTW92ZSBkdXBsaWNhdGUgI2RlZmluZXMgaW50byBhIGNvbW1vbiBpbmNsdWRlCisJICBDZW50cmFsaXplIGR1cGxpY2F0ZWQgY29uc3RhbnRzIHNvIHRoZXkgaGF2ZSB0aGUgc2FtZSB2YWx1ZS4KKwkgIEFsc28gc3RhbmRhcmRpc2UgbWluaW11bSB0b25lIGR1cmF0aW9uIHRvIDI1MG1zIGFuZCBtaW5pbXVtIGludGVyLXRvbmUKKwkgIGludGVydmFsIHRvIDEwMG1zLgorCisyMDExLTAzLTI0IDE0OjM0OjI0IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BlbnRyb3B5d2F2ZS5jb20+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIGRpcmVjdHNvdW5kc2luazogQWRkIGNvbmRpdGlvbmFscyBvbiBXQVZFX0ZPUk1BVF9ET0xCWV9BQzNfU1BESUYKKworMjAxMS0wNC0xMSAyMDowOToxNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNkZWJ1Zy5jOgorCSAgY2Fwc2RlYnVnOiBmaXggdW51c2VkLWJ1dC1zZXQtdmFyaWFibGUgd2FybmluZ3Mgd2l0aCBnY2MgNC42CisKKzIwMTEtMDQtMTEgMjA6MDU6NTQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogZml4IHVudXNlZC1idXQtc2V0LXZhcmlhYmxlIHdhcm5pbmcgd2l0aCBnY2MgNC42CisJICBNb3N0IGxpa2VseSBhIGxlZnRvdmVyIGZyb20gd2hlbiB0aGUgaW5kZXggcGFyc2luZyBjb2RlIHdhcyByZXdyaXR0ZW4uCisKKzIwMTEtMDQtMTEgMTk6NTQ6MDAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJICBhYzNwYXJzZTogZml4IHVudXNlZC1idXQtc2V0LXZhcmlhYmxlIHdhcm5pbmcgd2l0aCBnY2MgNC42CisKKzIwMTEtMDQtMTEgMTk6NTA6MDcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJICB2aWRlb2JhbGFuY2U6IGZpeCBoYW5kbGluZyBvZiBZVVYgaW1hZ2VzIHdpdGggJ29kZCcgd2lkdGhzCisJICBGaXhlcyB1bnVzZWQtYnV0LXNldC12YXJpYWJsZSB3YXJuaW5ncyB3aXRoIGdjYyA0LjYuCisKKzIwMTEtMDQtMTEgMTk6NDk6MjIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICB2aWRlb2ZsaXA6IGZpeCB1bnVzZWQtYnV0LXNldC12YXJpYWJsZSB3YXJuaW5ncyB3aXRoIGdjYyA0LjYKKworMjAxMS0wNC0xMyAxODoxMTozNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYzoKKwkgIGF1ZGlvd3NpbmN7YmFuZCxsaW1pdH06IEZpeCBjaGVjayBmb3IgZGl2aXNvbiBieSB6ZXJvCisKKzIwMTEtMDQtMTMgMTg6MDE6MDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jYmFuZC5jOgorCSAgYXVkaW93c2luY2JhbmQ6IEZpeCByYW5nZSBvZiBrZXJuZWwgZWxlbWVudHMgKGxpbSAtPiBsaW0tMSkKKworMjAxMS0wNC0xMyAxODowMDo0NCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5jOgorCSAgYXVkaW93c2luY2xpbWl0OiBBZGQgc29tZSBtb3JlIGJyYWNlcyB0byBtYWtlIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUKKworMjAxMS0wNC0xMSAxODo0MDozMCAtMDUwMCAgSm9yZGkgQnVyZ3VldC1DYXN0ZWxsIDxqb3JkaS5idXJndWV0LWNhc3RlbGxAbGlnby5vcmc+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5jOgorCSAgYXVkaW93c2luY2xpbWl0OiBGaXggcmFuZ2Ugb2Yga2VybmVsIGVsZW1lbnRzIChsaW0gLT4gbGltLTEpIGluIGhpZ2gvbG93LXBhc3MgZmlsdGVycworCisyMDExLTA0LTEzIDE3OjQ5OjIyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYzoKKwkgIGF1ZGlvd3NpbmNiYW5kOiBBZGQgbmV3IHdpbmRvd2luZyBmdW5jdGlvbnM6IGdhdXNzaWFuLCBjb3MgYW5kIGhhbm4KKworMjAxMS0wNC0xMSAxODo0MTo0MyAtMDUwMCAgSm9yZGkgQnVyZ3VldC1DYXN0ZWxsIDxqb3JkaS5idXJndWV0LWNhc3RlbGxAbGlnby5vcmc+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5jOgorCSAgYXVkaW93c2luY2xpbWltdDogQWRkIG5ldyB3aW5kb3dzIHRvIGhpZ2gvbG93LXBhc3MgZmlsdGVyczogZ2F1c3NpYW4sIGNvc2luZSwgaGFubgorCisyMDExLTA0LTEzIDE2OjQ3OjA1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBzZXQgc3RyZWFtLWZvcm1hdD1ieXRlLXN0cmVhbSBvbiBoMjY0IGNhcHMgaWYgdGhlcmUncyBubyBjb2RlYyBkYXRhCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjA2NjYyCisKKzIwMTEtMDQtMTMgMTY6Mzc6MDcgKzAxMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogcmVzdHJpY3QgaDI2NCBzb21lIG1vcmUgdG8gb25seSBhY2NlcHQgQVUtYWxpZ25lZCBBVkMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MDY2NjIKKworMjAxMS0wNC0xMyAxNzoxMToyNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIG1wZWdhdWRpb3BhcnNlOiBUaGUgVkJSSSBoZWFkZXIgaXMgYWx3YXlzIGF0IG9mZnNldCAweDIwLCBpbmRlcGVuZGVudCBvZiBNUEVHIHZlcnNpb24KKwkgIEFsc28gY2xlYW4gdXAgYWR2YW5jaW5nIG9mIHRoZSBkYXRhIHBvaW50ZXIgYSBiaXQuCisJICBGaXhlcyBidWcgIzY0NzY1OS4KKworMjAxMS0wNC0xMyAxNToxODoxMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuYzoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkgIHF0bXV4OiBhZGQgdmFyaWFudC1sZXNzIHZpZGVvL3F1aWNrdGltZSB0byBzb3VyY2UgcGFkIHRlbXBsYXRlIGNhcHMKKwkgIFRoaXMgaXMgbmVlZGVkIGZvciBhdXRvbWF0aWMgdHJhbnNjb2RpbmcgdXNpbmcgZW5jb2RlYmluLiBPdXIgdHlwZWZpbmRlcgorCSAgZG9lcyBub3QgYWx3YXlzIGFkZCBhIHZhcmlhbnQgdG8gdGhlIGZvdW5kIGNhcHMsIGFuZCBlbmNvZGViaW4gbmVlZHMKKwkgIGFuICpleGFjdCogbWF0Y2ggdG8gdGhlIGNhcHMgb24gdGhlIHNvdXJjZSBwYWQgdGVtcGxhdGUsIHNvIHdlIG5lZWQKKwkgIHRvIGFkZCB0aGUgdmFyaWFudC1sZXNzIHZpZGVvL3F1aWNrdGltZSBjYXBzIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsCisJICBmb3IgZW5jb2RlYmluIHRvIGJlIGFibGUgdG8gZmluZCBpdC4gQWRkIHVuaXQgdGVzdCBmb3IgdGhpcyBhcyB3ZWxsLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0Mjg3OQorCisyMDExLTA0LTEzIDE2OjE3OjQxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogUHJvcGVybHkgaW50ZXJwcmV0ZSB0aGUgcmVzdWx0IG9mIHN0cmNtcCgpCisKKzIwMTEtMDQtMTMgMTY6MDk6MDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBEb24ndCBzdG9yZSBpbWFnZSB0YWdzIGluc2lkZSB0aGUgdm9yYmlzY29tbWVudHMgYW5kIHRoZSBmbGFjIG1ldGFkYXRhCisJICBJbnN0ZWFkIG9ubHkgc3RvcmUgdGhlbSBpbnNpZGUgdGhlIGZsYWMgbWV0YWRhdGEuIFRoZXJlJ3MKKwkgIG5vIHBvaW50IGluIHN0b3JpbmcgdGhlbSB0d2ljZSBhbmQgdGhlIGZsYWMgbWV0YWRhdGEgaXMKKwkgIHN0aWxsIHRoZSBvZmZpY2lhbCB3YXkgdG8gc3RvcmUgaW1hZ2UgdGFncyBpbnNpZGUgZmxhYy4KKworMjAxMS0wNC0xMyAxMjozODoxNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvLmdpdGlnbm9yZToKKwkgIHRlc3RzOiBpZ25vcmUgbmV3IHF0bXV4LXJlbGF0ZWQgdGVzdCBiaW5hcmllcworCisyMDExLTA0LTEzIDExOjI1OjExICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZ3N0L3F1aWNrdGltZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhwbHVnaW4uYzoKKwkqIGdzdC9xdWlja3RpbWUvcXVpY2t0aW1lLmM6CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHF1aWNrdGltZTogbW92ZSBxdG11eCBwbHVnaW4gZnJvbSAtYmFkIHRvIC1nb29kCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjM2Njk5CisKKzIwMTEtMDQtMTIgMTY6NDI6MTcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgZHRtZjogUmVtb3ZlIGxlZnRvdmVyIE1BRU1PX0JST0tFTiBkZWZpbmVzCisJICBSZW1vdmUgZGVmaW5lcyB0byB3b3JrIGFyb3VuZCBidWdzIGluIG9sZCBNYWVtbyByZWxlYXNlcworCisyMDExLTA0LTA0IDEyOjIxOjIzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IG1vcmUgaGVscGZ1bCBkZWJ1ZyBlcnJvciBtZXNzYWdlIHdoZW4gbm8gbmVlZGVkIGR1cmF0aW9uIG9uIGlucHV0IGJ1ZmZlcnMKKwkgIEZpeGVzICM2NDYyNTYuCisKKzIwMTEtMDMtMjEgMTA6NTY6NTEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmg6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogQWRkaW5nIEdzdFRhZ1htcFdyaXRlciBpbnRlcmZhY2UKKwkgIEFkZHMgR3N0VGFnWG1wV3JpdGVyIGludGVyZmFjZSBzdXBwb3J0IHRvIHF0bXV4CisKKzIwMTEtMDMtMjIgMjA6NTM6MDggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogdXNlIHJ1bm5pbmcgdGltZSBmb3Igc3luY2hyb25pemF0aW9uCisJICBTZWUgYWxzbyAjNDMyNjEyLgorCisyMDExLTAzLTEwIDE2OjAzOjU4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHByb3ZpZGUgZm9yIFBUUyBtZXRhZGF0YSB3aGVuIHNvIGNvbmZpZ3VyZWQKKwkgIC4uLiBhbmQgbm90IG9ubHkgd2hlbiBzb3J0LW9mIGZlZWxpbmcgbGlrZSBpdC4KKwkgIEluIGFueSBjYXNlLCBpZiBpdCB0dXJucyBvdXQgYWxsIHJlYWxseSBpcyBpbiBvcmRlciwKKwkgIGFuZCBwcmVzdW1hYmx5IERUUyA9PSBQVFMsIHRoZW4gbm8gY3R0cyB3aWxsIGJlIHByb2R1Y2VkIGFueXdheS4KKworMjAxMS0wMy0xMCAxNjowMjo0MiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBhbHNvIHRyYWNrIG9yaWdpbmFsIFBUUyBidWZmZXIgdGltZXN0YW1wIGluIHJlb3JkZXIgZHRzLW1ldGhvZAorCisyMDExLTAyLTIxIDEyOjE0OjU5ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgUmV2ZXJ0ICJDaGVjayB0aGF0IGNvbGxlY3RwYWRzIGV4aXN0cyBiZWZvcmUgcmVtb3ZpbmcgcGFkIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCA2ZDg3NDA0NzZjY2QzYTM0OThkYzRmMThjMTk3MzM2NDM4MjVjN2I4LgorCSAgRGVwZW5kcyBvbiBhIGNvcmUgY29tbWl0IHRoYXQgd2FzIHJldmVydGVkCisKKzIwMTEtMDItMjAgMjM6NTc6MTkgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBDaGVjayB0aGF0IGNvbGxlY3RwYWRzIGV4aXN0cyBiZWZvcmUgcmVtb3ZpbmcgcGFkCisJICBUaGUgY29yZSBub3cgY2FsbHMgcmVsZWFzZSBwYWQgZnJvbSBmaW5hbGl6ZSwgYXQgd2hpY2ggcG9pbnQKKwkgIHRoZSBjb2xsZWN0cGFkcyBtaWdodCBoYXZlIGFscmVhZHkgYmVlbiBmcmVlZC4KKworMjAxMS0wMS0xMyAxMToyODozMiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6CisJICB0ZXN0OiBxdG11eDogVGVzdHMgcXRtdXggcmV1c2UKKwkgIEZvcmNlcyB0aGUgdXNlIG9mIHF0bXV4IGFmdGVyIGl0IGhhcyBiZWVuIHB1dCB0byBQTEFZSU5HIGFuZCBiYWNrCisJICB0byBOVUxMIG9uY2UKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MzkzMzgKKworMjAxMS0wMS0xMyAxNToyNzozNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBzZXQgc3JjIHBhZHMgd2hlbiBzdGFydGluZyBmaWxlCisJICAuLi4gcmF0aGVyIHRoYW4gYXQgX2luaXQgdGltZSwgc28gdGhleSBhcmUgYWxzbyBhdmFpbGFibGUgZm9sbG93aW5nIGEKKwkgIHBhZCAoZGUpYWN0aXZhdGlvbiBjeWNsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MzkzMzgKKworMjAxMS0wMS0wMyAxNzoyNDoyMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBhZGp1c3QgbmFzdHkgY2FzZSB0aW1lc3RhbXAgdHJhY2tpbmcKKwkgIFRoYXQgaXMsIGFsbCBzb3J0cyBvZiBwcm9ibGVtcyBhcmlzZSB3aXRoIHJlLW9yZGVyZWQgaW5wdXQgdGltZXN0YW1wcyB0aGF0CisJICB0ZW5kIHRvIGRlZnkgYXV0b21hZ2ljIGhhbmRsaW5nIGZvciBldmVyeSBjYXNlLCBzbyBhbGxvdyBmb3IgYSBmZXcgdmFyaWF0aW9ucworCSAgdGhhdCBjYW4gYmUgdHJpZWQgZGVwZW5kaW5nIG9uIGNpcmN1bXN0YW5jZXMuCisJICBBbHNvIHRyeSB0byBkb2N1bWVudCBhY2NvcmRpbmdseS4KKwkgIEFsc28gZml4ZXMgIzYzODI4OC4KKworMjAxMC0xMi0zMCAyMTo0ODo0MSArMDIwMCAgRmVsaXBlIENvbnRyZXJhcyA8ZmVsaXBlLmNvbnRyZXJhc0Bub2tpYS5jb20+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBnZXQgcmlkIG9mIHRpbWVzdGFtcCBvdmVycHJvdGVjdGl2ZW5lc3MKKwkgIFNpZ25lZC1vZmYtYnk6IEZlbGlwZSBDb250cmVyYXMgPGZlbGlwZS5jb250cmVyYXNAbm9raWEuY29tPgorCisyMDExLTAxLTAzIDE2OjU2OjU3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5oOgorCSogZ3N0L3F1aWNrdGltZS9hdG9tc3JlY292ZXJ5LmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogc2ltcGxpZnkgYW5kIGZpeCBwdHNfb2Zmc2V0IHN0b3JpbmcKKwkgIEluIHBhcnRpY3VsYXIsIG9ubHkgd3JpdGUgYSBjdHRzIGF0b20gaWYgYW5kIG9ubHkgaWYgZXZlciBhIG5vbi16ZXJvIG9mZnNldC4KKworMjAxMS0wMS0wMyAxMDo0MzoxNSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBhZGQgc29tZSBtb3JlIGRvY3VtZW50YXRpb24KKworMjAxMC0xMi0wMyAxNToyMzowMCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiByZW1vdmUgbGFyZ2UtZmlsZSBwcm9wZXJ0eQorCSAgUmF0aGVyLCBhdXRvLWRldGVybWluZSBpZiA2NC1iaXRzIGZpZWxkcyBhcmUgbmVlZGVkIGZvciBhIHZhbGlkIHJlc3VsdCwgYW5kCisJICBzdGljayB0byBwbGFpbiAzMi1iaXRzIGlmIG5vdCBuZWVkZWQuCisJICBBUEk6IEdzdFFUTXV4OmxhcmdlLWZpbGUgKHJlbW92ZWQpCisKKzIwMTAtMTItMTkgMTI6NTM6MzQgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogRnJlZSBBdG9tSW5mbyBzdHJ1Y3RzCisKKzIwMTAtMTItMTkgMTI6NTA6MzAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogRnJlZSB0YWcgc3RyaW5nIGFmdGVyIHVzZQorCisyMDEwLTEyLTE5IDEyOjEyOjI1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3RhZ3NjaGVja2luZy5jOgorCSAgdGFnc2NoZWNraW5nOiBGaXggc29tZSBtb3JlIG1lbW9yeSBsZWFrcworCisyMDEwLTEyLTE3IDE5OjQxOjI1ICswMjAwICBMYXNzZSBMYXVra2FuZW4gPGxhc3NlLmxhdWtrYW5lbkBkaWdpYS5jb20+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBhbGxvdyB6ZXJvIGR1cmF0aW9uIHRyYWNrcworCisyMDEwLTEyLTAzIDE4OjA5OjQxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGFkZCBkb2N1bWVudGF0aW9uCisKKzIwMTAtMTItMDEgMTA6NDU6NDkgKzAxMDAgIERhdmlkIEhveXQgPGRob3l0QGxsbmwuZ292PgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogaGFuZGxlIG1zdmMgZnRydW5jYXRlIGluY29tcGF0aWJpbGl0eQorCSAgRml4ZXMgIzYzNjE4NS4KKworMjAxMC0xMS0yNyAxNjowNzoxOSAtMDYwMCAgQWxlamFuZHJvIEdvbnphbGV6IDxhZ29uemFsZXpAZGV4dHJhdGVjaC5jb20+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBnc3RfcXRtdXhfY2hlY2tfZGlmZmVyZW5jZSB2ZXJpZnkgYmVmb3JlIHN1YnRyYWN0CisJICBBdm9pZCBuZWdhdGl2ZSBvdmVyZmxvdyBieSBjaGVja2luZyB0aGUgb3JkZXIgb2Ygb3BlcmFuZHMKKwkgIG9uIHN1YnRyYWN0aW9uIG9mIHVuc2lnbmVkIGludGVnZXJzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzNTg3OAorCisyMDEwLTExLTE5IDE3OjU1OjM2ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHJlbW92ZSByZW1uYW50IG9mIG9ic29sZXRlIHByb3BlcnR5CisKKzIwMTAtMTEtMTkgMTU6MTg6NTggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgdGVzdHM6IHF0bXV4OiBhbHNvIHVuaXQgdGVzdCBmcmFnbWVudGVkIGZpbGUgY2FzZXMKKworMjAxMC0wNy0zMCAxMjo0ODoyOSArMDIwMCAgTWFyYy1BbmRyw6kgTHVyZWF1IDxtbHVyZWF1QGZsdW1vdGlvbi5jb20+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBhbGxvdyBzcGVjaWZ5aW5nIHRyYWsgdGltZXNjYWxlCisJICBUaGlzIGlzIG1haW5seSBiZWNhdXNlIFNtb290aHN0cmVhbWluZyBjbGllbnQgYXJlIGJyb2tlbiBhbmQgZG9uJ3QKKwkgIHRha2UgdGhlIFRpbWVTY2FsZSBwcm9wZXJ0eSBpbnRvIGFjY291bnQuCisKKzIwMTAtMTEtMTkgMTc6NDE6NDEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmg6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogaW5jbHVkZSBzZHRwIGF0b21zIGZvciBpc212IGZyYWdtZW50ZWQgZmlsZXMKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5IE1hcmMtQW5kcsOpIEx1cmVhdSA8bWx1cmVhdUBmbHVtb3Rpb24uY29tPgorCisyMDEwLTExLTE5IDE5OjE3OjQ1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGVuYWJsZSBkZWZhdWx0IGZyYWdtZW50ZWQgZmlsZSBmb3IgaXNtbG11eAorCisyMDEwLTA5LTAyIDEzOjU4OjA1ICswMjAwICBNYXJjLUFuZHLDqSBMdXJlYXUgPG1sdXJlYXVAZmx1bW90aW9uLmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5oOgorCSogZ3N0L3F1aWNrdGltZS9mdHlwY2MuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuaDoKKwkgIHF0bXV4OiBhZGQgaXNtbG11eCwgZm9yIGZyYWdtZW50ZWQgaXNtbCBtYWpvciBicmFuZAorCisyMDEwLTExLTE5IDE0OjQ0OjQ1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGZpbmFsaXplIHNpbmtwYWRzIGxpc3QKKworMjAxMC0wNy0yMiAxOTo0MDowNyArMDIwMCAgTWFyYy1BbmRyw6kgTHVyZWF1IDxtbHVyZWF1QGZsdW1vdGlvbi5jb20+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBhZGQgbW9vdiBpbiBzdHJlYW1oZWFkZXIKKworMjAxMC0wOC0wNiAxMzoyNjoyNyArMDIwMCAgTWFyYy1BbmRyw6kgTHVyZWF1IDxtbHVyZWF1QGZsdW1vdGlvbi5jb20+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBhZGQgc3RyZWFtYWJsZSBwcm9wZXJ0eSB0byBhdm9pZCBidWlsZGluZyBmcmFnbWVudGVkIG1mcmEgaW5kZXgKKworMjAxMC0xMS0xOCAxNjo0ODowNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBhZGQgbWZyYSB0byBmcmFnbWVudGVkIGZpbGUKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5IE1hcmMtQW5kcsOpIEx1cmVhdSA8bWx1cmVhdUBmbHVtb3Rpb24uY29tPgorCisyMDEwLTExLTE1IDE1OjE3OjU5ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5oOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5oOgorCSAgcXRtdXg6IG9wdGlvbmFsbHkgY3JlYXRlIGZyYWdtZW50ZWQgZmlsZQorCSAgSW4gdGhpcyBtb2RlLCBhbiBpbml0aWFsIGVtcHR5IG1vb3YgKGNvbnRhaW5pbmcgb25seSBzdHJlYW0gbWV0YWRhdGEpIGlzIHdyaXR0ZW4sCisJICBmb2xsb3dlZCBieSBmcmFnbWVudHMgY29udGFpbmluZyBhY3R1YWwgZGF0YSAoYWxvbmcgd2l0aCByZXF1aXJlZCBtZXRhZGF0YSkuCisJICBOZXcgZnJhZ21lbnRzIGFyZSBzdGFydGVkIGVpdGhlciBhdCBrZXlmcmFtZSAoaWYgc3VjaCBhcmUgc3BhcnNlKSBvciB3aGVuCisJICBwcm9wZXJ0eSBjb25maWd1cmVkIGR1cmF0aW9uIGV4Y2VlZGVkLgorCSAgQmFzZWQgb24gcGF0Y2ggYnkgTWFyYy1BbmRyw6kgTHVyZWF1IDxtbHVyZWF1QGZsdW1vdGlvbi5jb20+CisJICBGaXhlcyAjNjMyOTExLgorCisyMDEwLTExLTE1IDE1OjEyOjQ1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgcXRtdXg6IHVzZSBoZWxwZXIgdG8gc2V0IGF0b20gZmxhZ3MgZnJvbSBnaXZlbiB1aW50CisKKzIwMTAtMTEtMDkgMTY6NDk6MDcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogcmVmYWN0b3IgY29uZmlndXJpbmcgYW5kIHNlbmRpbmcgb2YgbW9vdgorCSAgQmFzZWQgb24gcGF0Y2ggYnkgTWFyYy1BbmRyw6kgTHVyZWF1IDxtbHVyZWF1QGZsdW1vdGlvbi5jb20+CisKKzIwMTAtMTEtMDkgMTU6NTQ6NDQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogcmVmYWN0b3IgZXh0cmEgdG9wLWxldmVsIGF0b20gaGFuZGxpbmcKKwkgIEFsc28gY2hlY2sgYSBiaXQgbW9yZSBmb3IgcG9zc2libGUgZXJyb3JzLCBhbmQgZnJlZSBwcm9wZXIgaXRlbXMgaW4gc3VjaCBjYXNlLgorCisyMDEwLTExLTA5IDE1OjAxOjE1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHJlZmFjdG9yIHNsaWdodGx5IHVzaW5nIGJ1ZmZlciBoZWxwZXIKKworMjAxMC0xMS0wNSAxMzo0ODo1NyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBmaXggbWlzaW5mb3JtaW5nIGNvbW1lbnQKKworMjAxMC0xMS0wNSAxMjowODoxNSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBkZWxlZ2F0ZSBtdmV4IGhhbmRsaW5nIHRvIGF0b21zCisJICAuLi4gd2hpY2gga2VlcHMgcXRtdXggc2ltcGxlci4KKworMjAwOS0wOS0yOCAxNjoxMTozNSArMDIwMCAgTWFyYy1BbmRyw6kgTHVyZWF1IDxtbHVyZWF1QGZsdW1vdGlvbi5jb20+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBhZGQgbXZleC90cmV4IGluIGhlYWRlciBpZiBmcmFnbWVudGVkCisJICBPbmUgInRyZXgiIGlzIGFkZGVkIHBlciAidHJhayIuIFdlIGRvbid0IHN1cHBvcnQgZGVmYXVsdCB2YWx1ZXMsCisJICBidXQgdGhlICJ0cmV4IiBib3ggaXMgbWFuZGF0b3J5LgorCisyMDA5LTA5LTI4IDEzOjAxOjMwICswMjAwICBNYXJjLUFuZHLDqSBMdXJlYXUgPG1sdXJlYXVAZmx1bW90aW9uLmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkgIHF0bXV4OiBhZGQgYSBjb3VwbGUgb2YgZm91cmNjIGZvciBmcmFnbWVudGVkIG1wNAorCisyMDEwLTExLTA1IDExOjA4OjAxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGF2b2lkIHJlbW92aW5nIHRlbXAgZmlsZSB3aGVuIGVycm9yIG9jY3VycmVkCisKKzIwMDktMDktMzAgMTc6MTY6MzAgKzAyMDAgIE1hcmMtQW5kcsOpIEx1cmVhdSA8bWx1cmVhdUBmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogdHJ1bmNhdGUgYnVmZmVyIGZpbGUgYWZ0ZXIgZWFjaCBzZW5kCisKKzIwMDktMDktMjggMTY6NTM6NTEgKzAyMDAgIE1hcmMtQW5kcsOpIEx1cmVhdSA8bWx1cmVhdUBmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogcmVtb3ZlIHRlbXAgZmlsZSB3aGVuIHJlc2V0L2ZpbmFsaXplCisKKzIwMTAtMTAtMTkgMTM6NDM6MTQgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG1vb3ZyZWNvdmVyLmM6CisJICB2YXJpb3VzIChnc3QpOiBhZGQgbWlzc2luZyBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIGZsYWdzCisJICBDYW5vbmljYWxpemUgcHJvcGVydHkgbmFtZXMgYXMgbmVlZGVkLgorCisyMDEwLTEwLTEzIDE3OjQ3OjI5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHByZXZlbnQgaW5maW5pdGUgbG9vcCB3aGVuIGFkanVzdGluZyBmcmFtZXJhdGUKKwkgIEZpeGVzICM2MzIwNzAuCisKKzIwMTAtMTAtMDMgMjM6NDU6NDYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogQWRkIEdfUEFSQU1fU1RBVElDX1NUUklOR1MKKwkgIEFkZCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHRvIHF0bXV4IHByb3BlcnRpZXMKKworMjAxMC0wOS0xNSAxNzo1NDo0OSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkqIGdzdC9xdWlja3RpbWUvZm91cmNjLmg6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4Lmg6CisJICBxdG11eDogRm9sbG93IHhtcCBzZXJpYWxpemF0aW9uIGd1aWRlbGluZXMgY2xvc2VyCisJICBxdCBhbmQgaXNvbSB2YXJpYW50cyBoYXZlIGRpZmZlcmVudCB3YXlzIG9mIHNlcmlhbGl6aW5nCisJICB4bXAsIGZvbGxvdyB0aGVzZSBndWlkZWxpbmVzLgorCSAgVGhvc2UgY2FuIGJlIGZvdW5kIGluIEFkb2JlJ3MgeG1wIGRvY3MuCisKKzIwMTAtMDgtMTYgMTI6MzY6MjQgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogYXV0b2RldGVjdCBvdXQtb2Ytb3JkZXIgaW5wdXQgdGltZXN0YW1wcyBhbmQgZGV0ZXJtaW5lIERUUyBhY2NvcmRpbmdseQorCSAgRmF2b3VyIHVzaW5nIGlucHV0IGJ1ZmZlciB0aW1lc3RhbXBzIGZvciBEVFMsIGJ1dCBmYWxsYmFjayB0byB1c2luZyBidWZmZXIKKwkgIGR1cmF0aW9uIChhY2N1bXVsYXRpb24pIGlmIGlucHV0IHRzIGRldGVjdGVkIG91dC1vZi1vcmRlci4KKwkgIEZpeGVzICM2MjQyMTIuCisKKzIwMTAtMDctMjggMTY6MTU6NTMgKzAyMDAgIE1hcmMtQW5kcsOpIEx1cmVhdSA8bWx1cmVhdUBmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogdXNlIGNhcHMgYml0cmF0ZSBhdCBsYXN0IGNoYW5jZQorCSAgSWYgd2UgZGlkbid0IGdldCB0aGUgc3RyZWFtJ3MgYml0cmF0ZSBmcm9tIG9uZSBvZiB0aGUgYXRvbXMsCisJICB0cnkgZ2V0dGluZyBpdCBmcm9tIHRoZSBjYXBzIGFzIGEgbGFzdCByZXNvcnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjI1NDk2CisKKzIwMTAtMDctMjggMTY6MTI6MTEgKzAyMDAgIE1hcmMtQW5kcsOpIEx1cmVhdSA8bWx1cmVhdUBmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJICBxdG11eDogYnRydCAtIG1heCBiaXRyYXRlIGJlZm9yZSBhdmVyYWdlCisJICBBY2NvcmRpbmcgdG8gaXNvIGJhc2UgbWVkaWEgZmlsZSBmb3JtYXQsIHRoZSBtYXggYml0cmF0ZQorCSAgaXMgYmVmb3JlIHRoZSBhdmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MjU0OTYKKworMjAxMC0wNy0wNiAxNDo0ODowOCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBXcml0ZSAnYnRydCcgYXRvbSBmb3IgSC4yNjQgbWVkaWEgaWYgcG9zc2libGUKKwkgIFRoaXMgd3JpdGVzIG91dCB0aGUgb3B0aW9uYWwgJ2J0cnQnIGF0b20gKE1QRUc0Qml0cmF0ZUJveCkgZm9yIEguMjY0CisJICBtZWRpYSBpZiBlaXRoZXIgb3IgYm90aCBvZiBhdmVyYWdlIGFuZCBtYXhpbXVtIGJpdHJhdGUgYXJlIGF2YWlsYWJsZSBmb3IKKwkgIHRoZSBzdHJlYW0uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjIzNjc4CisKKzIwMTAtMDctMDUgMTQ6MDk6NTAgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmg6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4Lmg6CisJICBxdG11eDogV3JpdGUgYXZnL21heCBiaXRyYXRlIHRvIEVTRFMgaWYgYXZhaWxhYmxlCisJICBUaGlzIGNvbGxlY3RzIHRoZSAnYml0cmF0ZScgYW5kICdtYXhpbXVtLWJpdHJhdGUnIHRhZ3Mgb24gdGhlCisJICBjb3JyZXNwb25kaW5nIHBhZCBhbmQgdXNlcyB0aGVzZSB0byBwb3B1bGF0ZSB0aGVzZSBmaWVsZHMgaW4gdGhlIEVTRFMKKwkgIHdoZXJlIGFwcGxpY2FibGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjIzNjc4CisKKzIwMTAtMDctMDIgMTI6NDU6MjAgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBEb24ndCB1c2UgYm9ndXMgY29kZWMvZm9ybWF0IHRhZ3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MjMzNjUKKworMjAxMC0wNi0yNSAyMDoxOToyMCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBXcml0ZSB1aW50IHRhZ3MgdGhhdCBkb24ndCBoYXZlIGEgY29tcGxlbWVudAorCSAgV3JpdGUgdWludCB0YWdzIHRoYXQgaGF2ZSBjb21wbGVtZW50cyAoZS5nLiB0cmFjay1udW1iZXIvCisJICB0cmFjay1jb3VudCkgZXZlbiB3aGVuIHdlIG9ubHkgaGF2ZSBvbmUgb2YgdGhlbSBhdmFpbGFibGUKKwkgIGFuZCBzZXQgdGhlIG90aGVyIG9uZSB0byAwLgorCSAgRml4ZXMgIzYyMjQ4NAorCisyMDEwLTA2LTIxIDE5OjM5OjU0ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogUmVtb3ZlIHRoZSBwYWQgZnJvbSBvdXIgaW50ZXJuYWwgbGlzdCBiZWZvcmUgY2FsbGluZyBjb2xsZWN0cGFkcworCSAgUHJldmlvdXNseSB3ZSB3b3VsZCBlbmQgdXAgd2l0aCB0aGUgY29sbGVjdHBhZGRhdGEgc3RydWN0dXJlIGFscmVhZHkgZnJlZWQuCisJICBUaGlzIHdvdWxkIHJlc3VsdCBpbiBhIGJvZ3VzIGl0ZXJhdGlvbiBvZiBtdXgtPnNpbmtwYWRzIChhbGwgdGhlCisJICBHc3RRVFBhZCBiZWluZyBmcmVlZCkgYW5kIGl0IHdvdWxkbid0IGJlIHJlbW92ZWQgZnJvbSB0aGF0IGxpc3QuCisJICBGaW5hbGx5LCBkdWUgdG8gaXQgbm90IGJlaW5nIHJlbW92ZWQgZnJvbSB0aGF0IGxpc3QsIHdlIHdvdWxkIGVuZCB1cAorCSAgY2FsbGluZyBhIGJvZ3VzIGdzdF9xdF9tdXhfcGFkX3Jlc2V0IG9uIHRob3NlIHN0cnVjdHVyZXMgPT4gU0VHRkFVTFQKKworMjAxMC0wNS0xMiAxODo1MDozNCAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9xdWlja3RpbWUvZm91cmNjLmg6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogQWRkIFZQOAorCisyMDEwLTA1LTExIDEzOjE1OjM3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3RhZ3NjaGVja2luZy5jOgorCSAgdGVzdHM6IGRvbid0IGZhaWwgdGFnc2NoZWNraW5nIHRlc3QgaWYgcXRkZW11eCBpcyBub3QgYXZhaWxhYmxlIG9yIHRvbyBvbGQKKworMjAxMC0wMy0yNyAwOTo0NjozMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhwbHVnaW4uYzoKKwkgIHF0bXV4OiB1c2UgR1N0cmVhbWVyIHBhY2thZ2UgbmFtZSBhbmQgb3JpZ2luIGluIHRoZSBwbHVnaW4gaW5mbworCisyMDEwLTAzLTIzIDE3OjM0OjMwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3RhZ3NjaGVja2luZy5jOgorCSAgdGVzdHM6IHRhZ3NjaGVja2luZzogTmV3IHRhZ3MgdGVzdHMKKwkgIEFkZHMgbmV3IHRhZ3MgY2hlY2tpbmcgdGVzdHMuCisKKzIwMTAtMDMtMjUgMDA6MjA6NTQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogaW5pdCBkZWJ1ZyBjYXRlZ29yeSBiZWZvcmUgdXNpbmcgaXQKKworMjAxMC0wMy0yMiAxNjo1NjowMyArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJICBBZGQgLVdvbGQtc3R5bGUtZGVmaW5pdGlvbgorCSAgYW5kIGZpeCB0aGUgd2FybmluZ3MKKworMjAxMC0wMy0yMiAxMzoxNjozMyArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmg6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgQWRkIC1Xd3JpdGUtc3RyaW5ncworCSAgYW5kIGZpeCBpdHMgd2FybmluZ3MKKworMjAxMC0wMy0yMSAyMTozOToxOCArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmg6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zcmVjb3ZlcnkuYzoKKwkqIGdzdC9xdWlja3RpbWUvZGVzY3JpcHRvcnMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvdGFnc2NoZWNraW5nLmM6CisJICBBZGQgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV21pc3NpbmctcHJvdG90eXBlcyB0byBjb25maWd1cmUgZmxhZ3MKKwkgIEFuZCBmaXggYWxsIHdhcm5pbmdzCisKKzIwMTAtMDMtMTggMTc6MzA6MjYgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG1vb3ZyZWNvdmVyLmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlscyA9PiBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUKKworMjAxMC0wMy0xMiAxMToyODo1MSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy90YWdzY2hlY2tpbmcuYzoKKwkgIHRlc3RzOiB0YWdzY2hlY2tpbmc6IEltcHJvdmVtZW50cyBhbmQgbmV3IGdlby1sb2NhdGlvbiB0ZXN0cworCSAgTWFrZXMgc29tZSBpbXByb3ZlbWVudHMgdG8gdGFnc2NoZWNraW5nLmMsIG1ha2luZyBpdCB1c2UKKwkgIGZha2VzcmMgaW5zdGVhZCBvZiB2aWRlb3Rlc3RzcmMgYW5kIGFsbG93aW5nIHRvIHNldCBpbnB1dAorCSAgY2FwcyBzbyB0aGF0IG1vcmUgbXV4ZXJzIGNhbiBiZSB1c2VkLiBQcmV2aW91c2x5IHdlIGNvdWxkCisJICBvbmx5IHVzZSB0aG9zZSB0aGF0IGFjY2VwdGVkIHJhdyB2aWRlbyBjYXBzLgorCSAgQWxzbyBhZGRzIHNvbWUgdGVzdHMgZm9yIGdlby1sb2NhdGlvbiB0YWdzCisKKzIwMTAtMDMtMTIgMTA6NTM6MzYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogVXNlIHhtcCBvbiBtcDRtdXggYW5kIGdwcG11eCB0b28KKwkgIERvIG5vdCByZXN0cmljdCB4bXAgdG8gcXRtdXgsIGJ1dCB1c2UgaXQgdG9vCisJICBvbiBtcDRtdXggYW5kIGdwcG11eAorCisyMDEwLTAzLTA1IDEzOjMzOjM3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3RhZ3NjaGVja2luZy5jOgorCSAgY2hlY2s6IHRhZ3NjaGVja2luZzogdGVzdHMgZm9yIHRhZ3Mgc2VyaWFsaXphdGlvbiBpbiBtdXhlcnMKKwkgIEFkZHMgYSBjaGVjayB1bml0IHRlc3QgdGhhdCBhaW1zIHRvIHRlc3QgdGFncyBzZXJpYWxpemF0aW9uCisJICBhbmQgZGVzZXJpYWxpemF0aW9uIGNvbnNpc3RlbmN5IChpbiBtdXhlcnMpLiBJdCBwcm92aWRlcyBhCisJICBiYXNpYyBmdW5jdGlvbiB0aGF0IGFsbG93cyBvbmUgdG8gZWFzaWx5IHNwZWNpZnkgdGFncywgYQorCSAgbXV4ZXIgYW5kIGEgZGVtdXhlciBhbmQgYSB0ZXN0IHdpbGwgYmUgZG9uZSB0byBjaGVjayBpZgorCSAgdGhlIHRhZ3MgaGF2ZSBiZWVuIGNvbnNpc3RlbnRseSBtdXhlZCBhbmQgZGVtdXhlZAorCisyMDEwLTAyLTIyIDE2OjQ1OjM0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5oOgorCSogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBhZGQgeG1wIHN1cHBvcnQKKwkgIEFkZHMgeG1wIG1ldGF0YWdzIGFkZGluZyB0byBxdG11eC4KKwkgIEZpeGVzICM2MDk1MzkKKworMjAxMC0wMy0xMSAxNzoxNzoxNSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtb292cmVjb3Zlci5jOgorCSAgcXRtdXg6IGZpeCBHU1RfRUxFTUVOVF9FUlJPUiB1c2FnZQorCSAgV2UgbmVlZCB0byBwYXNzIChOVUxMKSByYXRoZXIgdGhhbiBOVUxMIGZvciBlbXB0eSBhcmd1bWVudHMuCisKKzIwMTAtMDMtMTAgMTA6MjM6MjMgLTA2MDAgIFJvYiBDbGFyayA8cm9iQHRpLmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG1vb3ZyZWNvdmVyLmM6CisJICBxdG11eDogZml4IGNvbXBpbGUgZXJyb3IKKwkgIGdzdC9xdWlja3RpbWUvZ3N0cXRtb292cmVjb3Zlci5jOjI2ODogd2FybmluZzogZm9ybWF0IG5vdCBhIHN0cmluZyBsaXRlcmFsIGFuZCBubyBmb3JtYXQgYXJndW1lbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjEyNDU0CisKKzIwMTAtMDItMjIgMTk6Mzg6MTUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogUmVuYW1lICdhdmMtc2FtcGxlJyB0byAnYXZjJyBpbiBjYXBzCisJICBGaXhlcyAjNjA2NjYyCisKKzIwMTAtMDItMjYgMTE6NTA6MjUgLTA4MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEBzb25nYmlyZG5lc3QuY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogVGFrZSBsb2NrIGFyb3VuZCB1c2Ugb2YgKG5vbi10aHJlYWRzYWZlKSB0YWdzZXR0ZXIgaW50ZXJmYWNlLgorCisyMDEwLTAyLTIyIDE2OjUxOjAwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgcXRtdXg6IHdyaXRlIGFsbCB1ZHRhIGNoaWxkcmVuIGF0b21zCisJICBVRFRBIG1pZ2h0IGhhdmUgTUVUQSBhbmQgb3RoZXIgY2hpbGRyZW4gYXRvbXMKKwkgIHRvZ2V0aGVyLCB3cml0ZSB0aGVtIGFsbC4KKworMjAxMC0wMi0yMiAxMDo0ODoxMSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBVc2UgaW50ZXJuYWwgc2luayBwYWRzIGxpc3QKKwkgIER1ZSB0byBHc3RDb2xsZWN0UGFkcyBzaW5rIHBhZHMgbGlzdCBiZWluZyBub3QgcmVsaWFibHkKKwkgIGl0ZXJhdGFibGUgKHdoZW4gbm90IGluc2lkZSB0aGUgY29sbGVjdGVkIGZ1bmN0aW9uKSB0aGlzCisJICBwYXRjaCBhZGRzIGEgc2luayBwYWRzIGxpc3QgdG8gcXRtdXggdG8gYmUgdXNlZCB3aGVuIGl0ZXJhdGluZworCSAgc2luayBwYWRzIG9uIHJlc2V0IGZ1bmN0aW9uLgorCSAgRml4ZXMgIzYwOTA1NQorCisyMDEwLTAyLTE2IDE3OjEzOjA5ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgcXRtdXg6IHByZXZlbnQgbGVha2luZyBoZGxyIG5hbWUKKworMjAxMC0wMi0xNiAxNjoyNDoxMiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuYzoKKwkgIHF0bXV4OiBzdXBwb3J0IGZvciBBTEFDCisJICBGaXhlcyAjNTgwNzMxLgorCisyMDEwLTAyLTE2IDE0OjE5OjA0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgcXRtdXg6IHJlZmFjdG9yIGJ1aWxkaW5nIHN0c2QgZW50cnkgJ3dhdmUnIGV4dGVuc2lvbgorCisyMDEwLTAyLTA4IDExOjUxOjUyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tc3JlY292ZXJ5LmM6CisJICBxdG11eDogYXRvbXNyZWNvdmVyeTogRml4IGNvbXBpbGF0aW9uIHByb2JsZW0KKwkgIEZpeGVzIGEgY29tcGlsYXRpb24gZXJyb3IgZHVlIHRvIHVudXNlZCBmdW5jdGlvbiByZXN1bHQuCisKKzIwMDktMTItMTIgMTY6MDc6MTUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmg6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zcmVjb3ZlcnkuYzoKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXNyZWNvdmVyeS5oOgorCSogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtb292cmVjb3Zlci5jOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG1vb3ZyZWNvdmVyLmg6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4Lmg6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4cGx1Z2luLmM6CisJICBxdG11eDogQWRkcyBtb292IHJlY292ZXJ5IGZlYXR1cmUKKwkgIEFkZHMgYSBuZXcgcHJvcGVydHkgdG8gcXRtdXggdGhhdCBzZXRzIGEgcGF0aCB0byBhIGZpbGUgdG8gd3JpdGUKKwkgIGFuZCB1cGRhdGUgZGF0YSBhYm91dCB0aGUgbW9vdiBhdG9tICh0aGF0IGlzIG5vdCB3cml0ZW4gdGlsbCB0aGUKKwkgIGVuZCBvZiB0aGUgZmlsZSkuIElmIHRoZSBwaXBlbGluZS9hcHAgY3Jhc2hlcyBkdXJpbmcgZXhlY3V0aW9uIGl0CisJICBtaWdodCBiZSBwb3NzaWJsZSB0byByZWNvdmVyIHRoZSBtb3ZpZSB1c2luZyB0aGUgcXRtb292cmVjb3ZlciBlbGVtZW50LgorCSAgcXRtb292cmVjb3ZlciBpcyBhbiBlbGVtZW50IHRoYXQgaXMgYWxzbyBhIHBpcGVsaW5lLiBJdCBpcyBub3QKKwkgIG1lYW50IHRvIGJlIHVzZWQgd2l0aCBvdGhlciBlbGVtZW50cyAoaXQgaGFzIG5vIHBhZHMpLiBJdCBpcyBtZXJlbHkKKwkgIGEgdG9vbC91dGlsaXRhcnkgdG8gcmVjb3ZlciB1bmZpbmlzaGVkIHF0bXV4IGZpbGVzLgorCSAgRml4ZXMgIzYwMTU3NgorCisyMDEwLTAxLTI3IDE5OjA2OjUzIC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgcXRtdXg6IGZvciBmaXhlZC1zYW1wbGUgc2l6ZSBzdHJlYW1zIChQQ00gYXVkaW8sIGV0YykgZG9uJ3QgYWxsb2NhdGUgYW4gZW5vcm1vdXMgYnVmZmVyIHRoYXQgd2UgdGhlbiB3b24ndCB1c2UgYXQgYWxsLgorCisyMDEwLTAxLTI3IDE1OjM3OjM3IC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGhhbmRsZSBtdXhpbmcgYWRwY20gY29ycmVjdGx5LgorCisyMDEwLTAxLTIyIDEzOjM2OjA0IC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgcXRtdXg6IFNldCB0aGUgbWRpYSBoZGxyIG5hbWUgZmllbGQgdG8gd2hhdCBxdWlja3RpbWUgdXNlcy4gRml4IHdyaXRpbmcgaXQgc2luY2UgaXQncyBub3QgbnVsbC10ZXJtaW5hdGVkLiBJbXByb3ZlcyBjb21wYXRpYmlsaXR5IHdpdGggc29tZSBoYXJkd2FyZSBwbGF5ZXJzLgorCisyMDEwLTAxLTIyIDEzOjMwOjA3IC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGVuZGlhbm5lc3MgaW4gZ3N0cmVhbWVyIGlzIGFuIGludCwgbm90IGJvb2xlYW4uCisKKzIwMTAtMDEtMjYgMTc6NTQ6MjggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmg6CisJICBxdG11eDogc3RyZWFtbGluZSBtb292IGRhdGEgbWVtb3J5IHN0b3JhZ2UKKwkgIEluIHBhcnRpY3VsYXIsIHVzZSBhcnJheXMgcmF0aGVyIHRoYW4gKGRvdWJsZSkgbGlua2VkIGxpc3RzLgorCisyMDEwLTAxLTI2IDEzOjQ0OjA0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGdfZnJlZSBpcyBOVUxMIHNhZmUKKworMjAxMC0wMS0yMCAxMzozMDo0OCArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2Rlc2NyaXB0b3JzLmM6CisJKiBnc3QvcXVpY2t0aW1lL2Rlc2NyaXB0b3JzLmg6CisJKiBnc3QvcXVpY2t0aW1lL3Byb3BlcnRpZXMuYzoKKwkgIFtjbGVhbnVwXSBWYXJpb3VzIHN0eWxlIGFuZCBjbGVhbnVwcworCSAgVmFyaW91cyBmaXhlcyBmb3IgZ3RrLWRvYyB3YXJuaW5ncyBhbmQgbWFraW5nIGZ1bmN0aW9ucyB3aXRob3V0CisJICBhcmd1bWVudHMgdGFrZSB2b2lkIGFzIHBhcmFtZXRlci4KKworMjAxMC0wMS0xNCAwODowOTowMyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBBY3R1YWxseSB1c2UgbmV3IGNhcHMgaW5mbyBvbiByZW5lZ290aWF0aW9uCisJICBGb2xsb3dpbmcgdGhlIHByZXZpb3VzIHF0bXV4IGNvbW1pdCwgdGhpcyBwYXRjaCB0cmllcworCSAgdG8gdXNlIHRoZSBuZXcgaW5mbyBhZGRlZCB0byB0aGUgY2FwcyB0byBmaWxsIHRoZSAndHJhaycKKwkgIGF0b20ncyBmaWVsZHMgYW5kIGNoaWxkcmVuIGF0b21zLiBUaGlzIHdheSBxdG11eCB3aWxsCisJICB1c2UgdGhlIGxhdGUgYWRkZWQgJ2NvZGVjX2RhdGEnIHdoZW4gaDI2NHBhcnNlIGFkZHMKKwkgIGl0IGluIHRoZSBmb2xsb3dpbmcgcGlwZWxpbmU6CisJICB2aWRlb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9MjAwICEgeDI2NGVuYyBieXRlLXN0cmVhbT10cnVlICEgXAorCSAgaDI2NHBhcnNlIG91dHB1dC1mb3JtYXQ9MCAhIHF0bXV4ICEgXAorCSAgZmlsZXNpbmsgbG9jYXRpb249dGVzdC5tb3YKKworMjAxMC0wMS0xMyAyMzozMzo1MSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBEbyBjYXBzIHJlbmVnb3RpYXRpb24gd2hlbiBpdCBvbmx5IGFkZHMgZmllbGRzCisJICBRdG11eCBjYW4gYWNjZXB0IGNhcHMgcmVuZWdvdGlhdGlvbiBpZiB0aGUgbmV3IGNhcHMgaXMgYQorCSAgc3VwZXJzZXQgb2YgdGhlIG9sZCBvbmUsIG1lYW5pbmcgdXBzdHJlYW0gYWRkZWQgbmV3IGluZm8gdG8KKwkgIHRoZSBjYXBzLiBUaGlzIHBhdGNoIHN0aWxsIGRvZXNuJ3QgbWFrZSBxdG11eCB1cGRhdGUgYW55CisJICBhdG9tcyBpbmZvIGZyb20gdGhlIG5ldyBpbmZvLCBidXQgYXQgbGVhc3QgaXQgZG9lc24ndAorCSAgcmVqZWN0IHRoZSBuZXcgY2FwcyBhbnltb3JlLgorCSAgQSBwaXBlbGluZSB0aGF0IHJlcHJvZHVjZXMgdGhpcyB1c2UgY2FzZSBpczoKKwkgIHZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz0yMDAgISB4MjY0ZW5jIGJ5dGUtc3RyZWFtPXRydWUgISBcCisJICBoMjY0cGFyc2Ugb3V0cHV0LWZvcm1hdD0wICEgcXRtdXggISBcCisJICBmaWxlc2luayBsb2NhdGlvbj10ZXN0Lm1vdgorCisyMDEwLTAxLTEzIDE5OjMwOjQ1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHByb3ZpZGUgcmVxdWVzdCBwYWRzIHVuZGVyIHdpZGVyIGNvbmRpdGlvbnMKKwkgIEZpeGVzICM2MDY4NTkuCisKKzIwMTAtMDEtMTMgMTA6MzU6MDAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogT25seSBhY2NlcHQgYXZjLXNhbXBsZSBoMjY0CisJICBxdG11eCBhbmQgbXA0bXV4IHNob3VsZCBvbmx5IGFjY2VwdCBoMjY0IGluIGF2Yy1zYW1wbGUKKwkgIGZvcm1hdAorCisyMDEwLTAxLTExIDEzOjEzOjQxIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eG1hcC5jOgorCSAgUmVuYW1lIGFhYydzIHN0cmVhbS1mb3JtYXQgJ25vbmUnIHRvICdyYXcnCisJICBSZW5hbWVzIGFhYydzIHN0cmVhbS1mb3JtYXQgZnJvbSBwcmV2aW91cyBjb21taXRzIGZyb20gbm9uZSB0bworCSAgcmF3CisKKzIwMTAtMDEtMTEgMTA6MzQ6MzIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogT25seSBhY2NlcHQgc3RyZWFtLWZvcm1hdD0nbm9uZScgYWFjCisJICBPbmx5IGFjY2VwdCByYXcgYWFjIHN0cmVhbXMgKHN0cmVhbS1mb3JtYXQ9bm9uZSkgdG8gYXZvaWQKKwkgIGdlbmVyYXRpbmcgaW52YWxpZCBmaWxlcy4KKwkgIEZpeGVzICM2MDQ5MjUKKworMjAwOS0xMi0yOCAxMTozNDozNSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4Lmg6CisJICBxdG11eDogYWxzbyBhZGQgLmggZmlsZSBjaGFuZ2VzIHRvIHVuYnJlYWsgdGhlIGJ1aWxkCisKKzIwMDktMTItMjcgMjM6NTE6NTAgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHVzZSBjb3JyZWN0IG5hbWVzIGZyb20gdGVtcGxhdGUgZm9yIHJlcXVlc3QgcGFkcworCSAgVGhlIHBhZHMgd2hlcmUgbmFtZXMgcGFkMCwgcGFkMSwgLi4uCisKKzIwMDktMTItMjcgMjM6MzI6NTggKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IG1vdmUgZXJyb3JzIF9uZXdfcGFkIHRvIHRoZSBlbmQKKworMjAwOS0xMi0yMSAxMzo1ODozMCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBBY2NlcHQgbm9uLXBhaXJlZCB1aW50IHRhZ3MKKwkgIEFkZHMgc3VwcG9ydCBmb3IgdW5wYWlyZWQgdW5zaWduZWQgaW50ZXJnZXIgdGFncworCisyMDA5LTEyLTIxIDEyOjA1OjM3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBBZGRzIG5ldyB0YWdzCisJICBNYXBzIG1vcmUgdGFncyB0aGF0IGFyZSBhbHJlYWR5IHBvc3RlZCBieSBxdGRlbXV4CisJICBGaXhlcyAjNTk5NzU5CisKKzIwMDktMTItMTAgMjI6MjA6NDUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmg6CisJKiBnc3QvcXVpY2t0aW1lL2ZvdXJjYy5oOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5oOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eG1hcC5jOgorCSAgcXRtdXg6IHN1cHBvcnQgbW9yZSBvZiBqMmsKKwkgIFJlYWRzIHRoZSBuZXcgY2FwcyBhZGRlZCB0byBxdGRlbXV4IGJ5IGNvbW1pdAorCSAgYzkxN2Q2NWU2ZGYwYjVkNTg1ZjkwNWM3YWQ3OGE4YTBhNDRiMmNiMAorCSAgYW5kIGFkZHMgaXRzIGNvcnJlc3BvbmRpbmcgYXRvbXMuCisJICBBbHNvIGFkZHMgc3VwcG9ydCBmb3IgaW1hZ2UveC1qcGMgYXMgaXQgaXMgdGhlIHNhbWUKKwkgIGFzIGltYWdlL3gtanAyLCBleGNlcHQgdGhhdCB0aGUgYnVmZmVycyBuZWVkIHRvIGJlCisJICBib3hlZCBpbnNpZGUgYSBqcDJjIGlzb20gYm94IGJlZm9yZSBtdXhpbmcuIFRvIHNvbHZlCisJICB0aGlzIHRoZSBRVFBhZHMgbm93IGhhdmUgYSBmdW5jdGlvbiB0aGF0IChpZgorCSAgbm90IE5VTEwpIGlzIGNhbGxlZCB3aGVuIGEgYnVmZmVyIGlzIGNvbGxlY3RlZC4gVGhpcworCSAgZnVuY3Rpb24gcmV0dXJucyBhIHJlcGxhY2VtZW50IHRvIHRoZSBjdXJyZW50IGNvbGxlY3RlZAorCSAgYnVmZmVyLgorCSAgRml4ZXMgIzU5ODkxNgorCisyMDA5LTEyLTEwIDE2OjUzOjE5IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBNYXBzICdjbGFzc2lmaWNhdGlvbicgdGFnIGZvciAzZ3BwIGZpbGVzCisJICBBZGRzIHRoZSBtYXBwaW5nIG9mICdjbGFzc2lmaWNhdGlvbicgdGFncyB0byB3cml0aW5nIG9mCisJICAnY2xzZicgYXRvbXMgZm9yIGdwcG11eC4KKwkgIEJhc2VkIG9uIGEgcGF0Y2ggYnk6IExhc3NlIExhdWtrYW5lbiA8ZXh0LWxhc3NlLjIubGF1a2thbmVuQG5va2lhLmNvbT4KKworMjAwOS0xMi0wOCAxNzo1OTowNCAtMDgwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHNvbmdiaXJkbmVzdC5jb20+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiByZW1vdmUgYysrIGNvbW1lbnRzIGFuZCBhZGQgc29tZSBtb3JlIGNvbW1lbnRzLgorCisyMDA5LTEyLTA4IDE3OjU1OjU2IC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5oOgorCSogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuYzoKKwkgIHF0bXV4OiBhZGQgaW1hIGFkcGNtIHN1cHBvcnQKKworMjAwOS0xMS0yNSAyMTo0MToyNyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiByZXBsYWNlIF9zY2FsZSB3aXRoIF9zY2FsZV9yb3VuZAorCSAgVXNlIHRoZSByb3VuZGluZyB2ZXJzaW9uIGZvciBpbXByb3ZlZCBzeW5jIGJldHdlZW4gc3RyZWFtcy4KKwkgIFNtYWxsIHZhcmlhdGlvbnMgaW4gdGhlIGR1cmF0aW9uIHdoZW4gbXV4aW5nIG1pZ2h0IGxlYWQgdG8KKwkgIGN1bXVsbGF0aXZlIHdyb25nIHRpbWVzdGFtcGluZyB3aGVuIGRlbXV4aW5nLgorCSAgRml4ZXMgIzYwMjkzNgorCisyMDA5LTExLTI0IDE2OjE2OjU2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHVzZSB0aW1lc3RhbXBzIGZvciBtdXhpbmcKKwkgIFRyeSB0byB1c2UgdGltZXN0YW1wcyBldmVuIHdoZW4gdGhlIHN0cmVhbSBoYXMgb3V0IG9mIG9yZGVyCisJICB0aW1lc3RhbXBzLCBvbmx5IGZhbGwgYmFjayB0byBkdXJhdGlvbnMgd2hlbiB3ZSBkZXRlY3QgYW4KKwkgIG91dCBvZiBvcmRlciBidWZmZXIuIEltcHJvdmVzIHN5bmMgYmV0d2VlbiBzdHJlYW1zLgorCisyMDA5LTExLTE5IDE4OjI4OjUyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGZpeCBtaXNzaW5nIGRlYnVnIGFyZ3VtZW50CisJICBBZGRzIGEgbWlzc2luZyBkZWJ1ZyBhcmd1bWVudAorCisyMDA5LTExLTE5IDExOjM2OjE0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGZpeCBtaXNpbmZvcm1pbmcgZGVidWcgc3RhdGVtZW50CisKKzIwMDktMTEtMTkgMTE6MTQ6NTcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogZW5zdXJlIHdyaXRhYmxlIGJ1ZmZlciBtZXRhZGF0YSBiZWZvcmUgc2V0dGluZyBjYXBzCisKKzIwMDktMTAtMjkgMDg6MzY6MDIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmg6CisJKiBnc3QvcXVpY2t0aW1lL2ZvdXJjYy5oOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eG1hcC5jOgorCSAgcXRtdXg6IHN1cHBvcnQgZm9yIFNWUTMKKwkgIEFkZHMgc3VwcG9ydCBmb3IgbXV4aW5nIFNWUTMgY29udGVudC4gVXN1YWxseSB0aGlzIGZvcm1hdAorCSAgaGFzIGRlY29kZXIgaW5mbyB0aGF0IG11c3QgYmUgcGFzc2VkIGluIHRoZSAnc2VxaCcgZmllbGQKKwkgIGluIHRoZSBjYXBzLiBJdCBpcyBhbHNvIGdvb2QgdG8gYWRkIHRoZSBnYW1hIGF0b20gdG8gbWFrZQorCSAgcXVpY2t0aW1lIG5vdCBjcmFzaC4KKwkgIEZpeGVzICM1ODc5MjIKKworMjAwOS0xMS0xNyAwOToyNjowNSAtMDMwMCAgVGhpYWdvIFNvdXNhIFNhbnRvcyA8dGhpYWdvc3NAcmVkbW9vbi4obm9uZSk+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBkbyBub3QgbGVhayBhIHN0cmluZworCSAgRnJlZXMgYSBzdHJpbmcgYWZ0ZXIgdXNlLiBBbHNvIGRvZXMgc29tZSBjb2RlIG9yZ2FuaXphdGlvbgorCisyMDA5LTExLTE2IDE0OjU3OjUzIC0wMzAwICBUaGlhZ28gU291c2EgU2FudG9zIDx0aGlhZ29zc0ByZWRtb29uLihub25lKT4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgcXRtdXg6IGRvIG5vdCBhZGQgc2l6ZSB0byB0aGUgcG9pbnRlciB2YXJpYWJsZQorCSAgRG8gbm90IHdyb25nbHkgYWRkIHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIHRvIHRoZQorCSAgcG9pbnRlciB0byB0aGUgYnVmZmVyIHNpemUuIEluc3RlYWQsIGNoZWNrIHRoZSByZXN1bHQKKwkgIHRvIHNlZSBpZiB0aGUgc2VyaWFsaXphdGlvbiB3YXMgb2suCisJICBCYXNlZCBvbiBhIHBhdGNoIGJ5OiAiQ2Fyc3RlbiBLcm9sbCA8Y2FyQHhpbWlkaS5jb20+IgorCSAgRml4ZXMgIzYwMjEwNgorCisyMDA5LTExLTA2IDEwOjM0OjM5IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5oOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5oOgorCSAgcXRtdXg6IGhhbmRsZSAnbGF0ZScgc3RyZWFtcworCSAgV2hlbiBtdXhpbmcgc3RyZWFtcywgc29tZSBjYW4gc3RhcnQgbGF0ZXIgdGhhbiBvdGhlcnMuIHF0bXV4CisJICBub3cgaGFuZGxlIHRoaXMgYnkgYWRkaW5nIGFuIGVtcHR5IGVkdHMgZW50cnkgd2l0aCB0aGUKKwkgIGR1cmF0aW9uIG9mIHRoZSAnbGF0ZW5lc3MnIHRvIHRoZSBzdHJlYW0ncyB0cmFrLgorCSAgSXQgdG9sZXJhdGVzIGEgc3RyZWFtIHRvIGJlIHVwIHRvIDAuMXMgbGF0ZS4KKwkgIEZpeGVzICM1ODY4NDgKKworMjAwOS0xMS0wNSAyMTozNTo1NiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkgIHF0bXV4OiBhZGRzIHRoZSBFRFRTIGFuZCBFTFRTIGF0b21zIHRvIGF0b21zLmMKKwkgIFRoZXNlIGF0b21zIHdpbGwgYmUgdXNlZnVsIGZvciBzaWduYWxpbmcgc3RyZWFtcworCSAgdGhhdCBzdGFydCBsYXRlciBpbiB0aGUgZmlsZS4gQXMgd2VsbCBmb3IgYWRkaW5nCisJICBlZGl0IGxpc3RzIGlmIG5lZWRlZCBzb21ldGltZSBsYXRlci4KKworMjAwOS0xMS0wNiAwMDo0NjoxMiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBBZGRpbmcgc29tZSBpZnMgZm9yIHByb3RlY3Rpb24KKwkgIEFkZGluZyBzb21lcyBpZnMgdG8gcHJvdGVjdCBhZ2FpbnN0IHdhcm5pbmcgY29uZGl0aW9ucworCSAgdGhhdCBtaWdodCBoYXBwZW4gd2hlbiB1cHN0cmVhbSBlbGVtZW50IGlzIG5vdCBzYW5lCisJICBGaXhlcyAjNjAwODk1CisKKzIwMDktMTAtMTYgMTA6NDc6MzIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyPgorCisJKiBnc3QvcXVpY2t0aW1lL2Z0eXBjYy5oOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5oOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eG1hcC5jOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eG1hcC5oOgorCSAgZ3BwbXV4OiBBZGQgc3VwcG9ydCBmb3IgM2dyNgorCSAgS2VlcCB0cmFjayBvZiB0aGUgY2h1bmsgZHVyYXRpb25zIHRvIGJlIGFibGUgdG8gYWRkIDNncjYKKwkgIGJyYW5kIGlmIGl0IGlzIGEgZmFzdHN0YXJ0IGZpbGUgYW5kIHRoZSBsb25nZXN0IGNodW5rIGlzCisJICBzbWFsbGVyIHRoYW4gYSBzZWMuIEltcGxlbWVudGVkIGFjY29yZGluZyB0byAzZ3BwCisJICBUUyAyNi4yNDQgdjYuNC4wICgyMDA1LTA5KQorCSAgRml4ZXMgIzU4NDM2MQorCisyMDA5LTEwLTE1IDIxOjExOjE2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5icj4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IE9ubHkgcHVzaCBmdHlwIGxhdGVyIChpbiBmYXN0c3RhcnQgbW9kZSkKKwkgIEluIGZhc3RzdGFydCBtb2RlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHNlbmQgdGhlIGZ0eXAKKwkgIHJpZ2h0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbS4gV2FpdGluZyBhbmQgc2VuZGluZyBpdAorCSAgb25seSBsYXRlciAod2hlbiB0aGUgbW9vdiBhdG9tIGlzIHJlYWR5IHRvIGJlIHNlbnQpIHByb3ZpZGVzCisJICB1cyB3aXRoIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0cmVhbSBhbmQgd2UgY2FuIGJldHRlcgorCSAgc2VsZWN0IHRoZSBjb21wYXRpYmxlIGJyYW5kcy4KKworMjAwOS0xMC0xNSAxNzo1MTozOSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnI+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBJbXByb3ZlIGVycm9yIG1lc3NhZ2UKKwkgIEltcHJvdmUgZXJyb3IgbWVzc2FnZSB3aGVuIHdlIGNhbid0IGdldCBvciBlc3RpbWF0ZSB0aGUKKwkgIHRpbWVzdGFtcC9kdXJhdGlvbiBvZiBhIGJ1ZmZlcgorCisyMDA5LTA5LTI5IDE1OjQ3OjEzICswMjAwICBNYXJjLUFuZHLDqSBMdXJlYXUgPG1sdXJlYXVAZmx1bW90aW9uLmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgcXRtdXg6IGZpeCBmbGFnc19hc191aW50IHRvIGZsYWdzW10KKworMjAwOS0wOC0wNCAxMjo1ODozNSArMDIwMCAgSmFuIFVyYmFuc2tpIDx3dWxjemVyQHd1bGN6ZXIub3JnPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogRG9uJ3QgcmVxdWlyZSBlbmRpYW5uZXNzIGZpZWxkIGZvciA4IGJpdCByYXcgYXVkaW8KKwkgIEZpeGVzIGJ1ZyAjNTkwMzYwLgorCisyMDA5LTA2LTI1IDA4OjM4OjIxICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJICBxdG11eDogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZS4KKworMjAwOS0wNi0yNSAwODozODoxMCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IEZpeCBkZWJ1ZyBzdGF0ZW1lbnQuCisKKzIwMDktMDYtMTEgMTU6NTQ6NDIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4Lmg6CisJICBxdG11eDogb25seSB1c2UgKDY0LWJpdCkgZXh0ZW5kZWQgKG1kYXQpIGF0b20gc2l6ZSBpZiBuZWVkZWQuICBGaXhlcyAjNTg1MzE5LgorCisyMDA5LTA2LTEwIDE0OjQ2OjE0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHNldCBkZWZhdWx0IG1vdmllIHRpbWVzY2FsZSB0byBtaWNyb3NlY29uZCB1bml0cworCisyMDA5LTA2LTEwIDEzOjI0OjIwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgcXRtdXg6IGNvbXByZXNzL29wdGltaXplIHN0c2Mgd3JpdGluZworCisyMDA5LTA2LTEwIDEyOjQyOjQ0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5oOgorCSogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuYzoKKwkgIHF0bXV4OiBhZGQgM0dQIHN0eWxlIHRhZ2dpbmcgKGFuZCByZWZhY3RvciBhcHByb3ByaWF0ZWx5KQorCisyMDA5LTA2LTAxIDIzOjAwOjQ0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5oOgorCSogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4IChhbmQgdmFyaWFudHMpOiBoYW5kbGUgcGl4ZWwtYXNwZWN0LXJhdGlvLiAgRml4ZXMgIzU4NDM1OC4KKworMjAwOS0wNi0wMSAyMjo0MjowOCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkqIGdzdC9xdWlja3RpbWUvZnR5cGNjLmg6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6CisJICBncHBtdXg6IGVuaGFuY2UgZnR5cCBicmFuZCBoZXVyaXN0aWMuICBGaXhlcyAjNTg0MzYwLgorCisyMDA5LTA1LTI4IDEzOjU2OjEwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiB1c2UgZGlmZmVyZW50IHN0c2QgYXRvbSB0eXBlIGZvciBIMjYzIGZvciBJU08gYW5kIFFUIHZhcmlhbnRzCisJICBGaXhlcyAjNTg0MTE0LgorCisyMDA5LTA1LTE1IDAxOjU0OjQ0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5icj4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgW3F0bXV4XSBGaXhlcyBzZWdmYXVsdCB3aGVuIGFkZGluZyBhIGJsb2IgYXMgZmlyc3QgdGFnLgorCSAgTW92ZXMgdGFncyBkYXRhIGluaXRpYWxpemF0aW9uIHRvIHRoZSBmdW5jdGlvbiB0aGF0IGFjdHVhbGx5IGFwcGVuZHMKKwkgIHRoZSB0YWdzIHRvIHRoZSBsaXN0LiBGaXhlcyAjNTgyNzAyCisJICBBbHNvIGZpeGVzIHNvbWUgc3R5bGUgY2F1Z2h0IGJ5IHRoZSBwcmUtY29tbWl0IGhvb2suCisKKzIwMDktMDUtMTAgMjE6MjE6MzYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6CisJICBncHBtdXg6IEFkZCBNUEVHLTQgcGFydCAyIHRvIHN1cHBvcnRlZCBmb3JtYXRzLiAgRml4ZXMgIzU4MTU5My4KKworMjAwOS0wNS0wNyAxNzo1Mzo0MiArMDEwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDxjaHJpc3RpYW4uc2NoYWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBBZGQgcmFua3MgdG8gdmFyaW91cyBtdXhlcnMgYW5kIGVuY29kZXJzIGluIC1iYWQKKworMjAwOS0wNC0zMCAxNDo0MzozNiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnI+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuYzoKKwkgIHF0bXV4OiBjaGFuZ2VzIGNhcHMgb2Ygc3JjIHBhZHMgdG8gdmlkZW8vcXVpY2t0aW1lLCB2YXJpYW50PXNvbWV0aGluZworCSAgVGFrZSBhIGxvb2sgYXQgYnVnICM1ODAwMDUgZm9yIGZ1cnRoZXIgaW5mby4KKworMjAwOS0wNC0yNCAxODo1MzozNiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnI+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuYzoKKwkgIG1wNG11eDogQ2hhbmdlcyBzcmMgY2FwcyB0byBhcHBsaWNhdGlvbi94LWlzby1tcDQKKwkgIEZpeGVzICM1ODAwMDUKKworMjAwOS0wMy0yNSAyMToyNDo0NCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBmaXggcmV1c2luZyBlbGVtZW50CisJICBTdGF0ZSBjaGFuZ2UgdG8gUkVBRFkgYW5kIHRoZW4gYmFjayB0byBQQVVTRUQgc2hvdWxkIHN0aWxsIHByb3ZpZGUKKwkgIHRoZSBwcm9wZXIgc3RydWN0dXJlcyBhcyBhcmUgb3RoZXJ3aXNlIGZyZXNobHkgYXZhaWxhYmxlIGZvbGxvd2luZworCSAgYSByZXF1ZXN0X25ld19wYWQuCisJICBQb2ludGVkIG91dCBieSBUaGlhZ28gU2FudG9zLgorCisyMDA5LTAzLTIzIDExOjE3OjM5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogZml4IGluY2x1ZGVzIGZvciBsc2VlaworCSAgLS0KKworMjAwOS0wMy0yMCAxNDoyMDoxNiArMDEwMCAgTFJOIDxscm4xOTg2IGF0IGdtYWlsIGRvdCBjb20+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHdpbjMyOiBmaXggc2Vla2luZyBpbiBsYXJnZSBmaWxlcworCSAgVXNlIF9sc2Vla2k2NCgpIG9uIFdpbmRvd3MgdG8gc2VlayBpbiBsYXJnZSBmaWxlcy4KKwkgIEZpeGVzICM1NzYwMjEuCisKKzIwMDktMDMtMDIgMTA6NTc6MzUgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBCZSBhIGJpdCBtb3JlIHZlcmJvc2UgaW4gb3VyIGRlYnVnIG1lc3NhZ2Ugd2hlbiBmYWlsaW5nIHRvIHJlbmVnb3RpYXRlCisKKzIwMDktMDEtMjggMTM6MjU6MTQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmg6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6CisJICBBZGRpdGlvbmFsIG1lZGlhIHR5cGUgc3VwcG9ydCBpbiBxdG11eCAoYW5kIGZyaWVuZHMpLgorCSAgU3VwcG9ydCBBTVIgYW5kIEgyNjMgZm9yIGJvdGggcXRtdXggYW5kIGdwcG11eCwKKwkgIGFuZCBhZGQgZXh0ZW5zaW9ucyBpbiBzYW1wbGUgdGFibGUgZGVzY3JpcHRpb24uCisKKzIwMDktMDEtMDkgMjE6NTk6NDggKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6IEFkZCB2aWRlby94LXF0LXBhcnQgYW5kIHZpZGVvL3gtbTQtcGFydCB0byBjYXBzIHNvIHNjaHJvZW5jL3NjaHJvcGFyc2UgY2FuIHVzZSBpdC4gIEZpeGVzICM1Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eG1hcC5jOiBBZGQgdmlkZW8veC1xdC1wYXJ0IGFuZCB2aWRlby94LW00LXBhcnQKKwkgIHRvIGNhcHMgc28gc2Nocm9lbmMvc2Nocm9wYXJzZSBjYW4gdXNlIGl0LiAgRml4ZXMgIzU2Njk1OAorCisyMDA4LTEyLTE5IDE4OjUzOjQ3ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOiBEbyBub3QgdGVtcHQgb3Igc3VnZ2VzdCB0byB2aW9sYXRlIGdzdF9jb2xsZWN0X3BhZHMgQVBJIHNwZWNpZmljYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOiAoZ3N0X3F0X211eF9jaGFuZ2Vfc3RhdGUpOgorCSAgRG8gbm90IHRlbXB0IG9yIHN1Z2dlc3QgdG8gdmlvbGF0ZSBnc3RfY29sbGVjdF9wYWRzIEFQSSBzcGVjaWZpY2F0aW9uLgorCisyMDA4LTEyLTE5IDE4OjMzOjQ3ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L3F1aWNrdGltZS86IER1YWwgbGljZW5zZSBxdG11eCBMR1BML01JVC4gIEZpeGVzICM1NjQyMzIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgKiBnc3QvcXVpY2t0aW1lL2F0b21zLmg6CisJICAqIGdzdC9xdWlja3RpbWUvZGVzY3JpcHRvcnMuYzoKKwkgICogZ3N0L3F1aWNrdGltZS9kZXNjcmlwdG9ycy5oOgorCSAgKiBnc3QvcXVpY2t0aW1lL2ZvdXJjYy5oOgorCSAgKiBnc3QvcXVpY2t0aW1lL2Z0eXBjYy5oOgorCSAgKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICAqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguaDoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eG1hcC5jOgorCSAgKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmg6CisJICAqIGdzdC9xdWlja3RpbWUvcHJvcGVydGllcy5jOgorCSAgKiBnc3QvcXVpY2t0aW1lL3Byb3BlcnRpZXMuaDoKKwkgIER1YWwgbGljZW5zZSBxdG11eCBMR1BML01JVC4gIEZpeGVzICM1NjQyMzIuCisKKzIwMDgtMTItMTYgMTY6MjY6NTIgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgVG90YWxseSByZW1vdmUgdGhlIGludGVybmFsIHRhZ2xpc3RzIGFuZCBmdWxseSB1c2UgdGFnc2V0dGVyLiBGaXhlcyB2YXJpb3VzIHRhZyBtdXhpbmcgaXNzdWVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9jZWx0L2dzdGNlbHRlbmMuYzoKKwkgICogZXh0L2NlbHQvZ3N0Y2VsdGVuYy5oOgorCSAgKiBleHQvbWV0YWRhdGEvZ3N0bWV0YWRhdGFtdXguYzoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4Lmg6CisJICBUb3RhbGx5IHJlbW92ZSB0aGUgaW50ZXJuYWwgdGFnbGlzdHMgYW5kIGZ1bGx5IHVzZSB0YWdzZXR0ZXIuIEZpeGVzCisJICB2YXJpb3VzIHRhZyBtdXhpbmcgaXNzdWVzLgorCisyMDA4LTEyLTAxIDE2OjM3OjQ1ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L3F1aWNrdGltZS9hdG9tcy5jOiBGaXggbWoyIHNhbXBsZSBkZXNjcmlwdGlvbiBtZXRhZGF0YSBjb25zdHJ1Y3Rpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOiAoYnVpbGRfanAyaF9leHRlbnNpb24pOgorCSAgRml4IG1qMiBzYW1wbGUgZGVzY3JpcHRpb24gbWV0YWRhdGEgY29uc3RydWN0aW9uLgorCisyMDA4LTExLTE4IDAxOjA5OjA5ICswMDAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSAgZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOiBRdWlldCBhIGRlYnVnZ2luZyBtZXNzYWdlIHRoYXQgSSByZWNlbnRseSBhZGRlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6IFF1aWV0IGEgZGVidWdnaW5nIG1lc3NhZ2UgdGhhdCBJIHJlY2VudGx5CisJICBhZGRlZC4KKworMjAwOC0xMS0xNSAwMjo1NjozMSArMDAwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkgIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguKjogVXNlIGR0cyBmcm9tIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCgpIGZvciB2aWRlby94LXF0LXBhcnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4Lmg6CisJICBVc2UgZHRzIGZyb20gR1NUX0JVRkZFUl9PRkZTRVRfRU5EKCkgZm9yIHZpZGVvL3gtcXQtcGFydC4KKworMjAwOC0xMS0xNCAyMToyNDo1MSArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIGdzdC9xdWlja3RpbWUvOiBSZXZlcnQgcHJldmlvdXMgY29tbWl0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkgICogZ3N0L3F1aWNrdGltZS9hdG9tcy5oOgorCSAgKiBnc3QvcXVpY2t0aW1lL2Rlc2NyaXB0b3JzLmM6CisJICAqIGdzdC9xdWlja3RpbWUvZGVzY3JpcHRvcnMuaDoKKwkgICogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkgICogZ3N0L3F1aWNrdGltZS9mdHlwY2MuaDoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4Lmg6CisJICAqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuYzoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eG1hcC5oOgorCSAgKiBnc3QvcXVpY2t0aW1lL3Byb3BlcnRpZXMuYzoKKwkgICogZ3N0L3F1aWNrdGltZS9wcm9wZXJ0aWVzLmg6CisJICBSZXZlcnQgcHJldmlvdXMgY29tbWl0LgorCisyMDA4LTExLTE0IDIwOjM4OjE4ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L3F1aWNrdGltZS86IER1YWwgbGljZW5zZSBMR1BML01JVCwgYXMgYXBwYXJlbnRseSBzdXBwb3NlZCB0by4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJICAqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkgICogZ3N0L3F1aWNrdGltZS9kZXNjcmlwdG9ycy5jOgorCSAgKiBnc3QvcXVpY2t0aW1lL2Rlc2NyaXB0b3JzLmg6CisJICAqIGdzdC9xdWlja3RpbWUvZm91cmNjLmg6CisJICAqIGdzdC9xdWlja3RpbWUvZnR5cGNjLmg6CisJICAqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5oOgorCSAgKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6CisJICAqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuaDoKKwkgICogZ3N0L3F1aWNrdGltZS9wcm9wZXJ0aWVzLmM6CisJICAqIGdzdC9xdWlja3RpbWUvcHJvcGVydGllcy5oOgorCSAgRHVhbCBsaWNlbnNlIExHUEwvTUlULCBhcyBhcHBhcmVudGx5IHN1cHBvc2VkIHRvLgorCisyMDA4LTExLTE0IDIwOjE3OjEwICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L3F1aWNrdGltZS86IEN1dCBkZXRvdXIgaW4gc2FtcGxlIGRlc2NyaXB0aW9uIGV4dGVuc2lvbiBjb25zdHJ1Y3Rpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOiAoYnVpbGRfZXNkc19leHRlbnNpb24pLAorCSAgKGJ1aWxkX21vdl9hYWNfZXh0ZW5zaW9uKSwgKGJ1aWxkX2pwMmhfZXh0ZW5zaW9uKSwKKwkgIChidWlsZF9jb2RlY19kYXRhX2V4dGVuc2lvbik6CisJICAqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkgICogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOiAoZ3N0X3F0X211eF9hdWRpb19zaW5rX3NldF9jYXBzKSwKKwkgIChnc3RfcXRfbXV4X3ZpZGVvX3Npbmtfc2V0X2NhcHMpOgorCSAgKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6IChnc3RfcXRfbXV4X21hcF9mb3JtYXRfdG9faGVhZGVyKToKKwkgIEN1dCBkZXRvdXIgaW4gc2FtcGxlIGRlc2NyaXB0aW9uIGV4dGVuc2lvbiBjb25zdHJ1Y3Rpb24uCisJICBBbHNvIGFjdHVhbGx5IGltcGxlbWVudCBJU08gSlBFRzIwMDAgbWoyIGZvcm1hdC4KKworMjAwOC0xMS0xMSAxOTozMTozNSArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIHRlc3RzL2NoZWNrLzogQWRkIHVuaXQgdGVzdCBmb3IgcXRtdXguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6IChzZXR1cF9zcmNfcGFkKSwKKwkgICh0ZWFyZG93bl9zcmNfcGFkKSwgKHNldHVwX3F0bXV4KSwgKGNsZWFudXBfcXRtdXgpLAorCSAgKGNoZWNrX3F0bXV4X3BhZCksIChHU1RfU1RBUlRfVEVTVCksIChxdG11eF9zdWl0ZSksIChtYWluKToKKwkgIEFkZCB1bml0IHRlc3QgZm9yIHF0bXV4LgorCisyMDA4LTExLTExIDE5OjI0OjEyICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOiBBZGQgc29tZSBtb3JlIHNhZmV0eS9zYW5pdHkgY2hlY2tzIGluIHRhZyBtYW5pcHVsYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOiAoZ3N0X3F0X211eF9hZGRfbWV0YWRhdGFfdGFncyk6CisJICBBZGQgc29tZSBtb3JlIHNhZmV0eS9zYW5pdHkgY2hlY2tzIGluIHRhZyBtYW5pcHVsYXRpb24uCisKKzIwMDgtMTEtMDggMDI6MDA6NTggKzAwMDAgIFRoaWFnbyBTb3VzYSBTYW50b3MgPHRoaWFnb3NzYW50b3NAZ21haWwuY29tPgorCisJICBDb3B5IHF0bXV4IGZyb20gcmV2aXNpb24gMTQ4IG9mIHRoZSBnc3QtcXRtdXggcmVwb3NpdG9yeS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcGF0Y2ggYnk6IFRoaWFnbyBTb3VzYSBTYW50b3MgPHRoaWFnb3NzYW50b3NAZ21haWwuY29tPgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9xdWlja3RpbWUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkgICogZ3N0L3F1aWNrdGltZS9hdG9tcy5oOgorCSAgKiBnc3QvcXVpY2t0aW1lL2Rlc2NyaXB0b3JzLmM6CisJICAqIGdzdC9xdWlja3RpbWUvZGVzY3JpcHRvcnMuaDoKKwkgICogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkgICogZ3N0L3F1aWNrdGltZS9mdHlwY2MuaDoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4Lmg6CisJICAqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuYzoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eG1hcC5oOgorCSAgKiBnc3QvcXVpY2t0aW1lL3Byb3BlcnRpZXMuYzoKKwkgICogZ3N0L3F1aWNrdGltZS9wcm9wZXJ0aWVzLmg6CisJICBDb3B5IHF0bXV4IGZyb20gcmV2aXNpb24gMTQ4IG9mIHRoZSBnc3QtcXRtdXggcmVwb3NpdG9yeS4KKwkgIEZpeGVzICM1NTAyODAuCisKKzIwMTEtMDQtMTIgMTg6MjU6MzQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBBbmRyb2lkLm1rOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBnc3QvcXVpY2t0aW1lL0xFR0FMOgorCSogZ3N0L3F1aWNrdGltZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cnRweHF0ZGVwYXkuYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cnRweHF0ZGVwYXkuaDoKKwkqIGdzdC9xdWlja3RpbWUvcXRhdG9tcGFyc2VyLmg6CisJKiBnc3QvcXVpY2t0aW1lL3F0ZGVtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvcXRkZW11eC5oOgorCSogZ3N0L3F1aWNrdGltZS9xdGRlbXV4LnZjcHJvajoKKwkqIGdzdC9xdWlja3RpbWUvcXRkZW11eF9kdW1wLmM6CisJKiBnc3QvcXVpY2t0aW1lL3F0ZGVtdXhfZHVtcC5oOgorCSogZ3N0L3F1aWNrdGltZS9xdGRlbXV4X2ZvdXJjYy5oOgorCSogZ3N0L3F1aWNrdGltZS9xdGRlbXV4X2xhbmcuYzoKKwkqIGdzdC9xdWlja3RpbWUvcXRkZW11eF9sYW5nLmg6CisJKiBnc3QvcXVpY2t0aW1lL3F0ZGVtdXhfdHlwZXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvcXRkZW11eF90eXBlcy5oOgorCSogZ3N0L3F1aWNrdGltZS9xdHBhbGV0dGUuaDoKKwkqIGdzdC9xdWlja3RpbWUvcXVpY2t0aW1lLmM6CisJKiBwby9QT1RGSUxFUy5pbjoKKwkgIHF0ZGVtdXg6IHJlbmFtZSBkaXJlY3RvcnkgdG8gcXVpY2t0aW1lIHRvIG1hdGNoIHBsdWdpbiBuYW1lCisJICBJbiBwcmVwYXJhdGlvbiBmb3IgcXRtdXggbW92aW5nIHRvIC1nb29kLgorCisyMDExLTA0LTEyIDExOjQ5OjU0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IHNpbXBsaWZ5IGZyYW1lcmF0ZSBmcmFjdGlvbiBjYWxjdWxhdGlvbgorCisyMDExLTAxLTI0IDE1OjQ1OjI4IC0wNjAwICBMZW9uYXJkbyBTYW5kb3ZhbCA8bHNhbmRvdmFsQHRpLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5oOgorCSAgZmx2ZGVtdXg6IGFkZCB3aWR0aCwgaGVpZ2h0IGFuZCBmcmFtZXJhdGUgdG8gY2FwcyB3aGVuIHByZXNlbnQgb24gb25NZXRhRGF0YQorCSAgRml4ZXMgIzY0MDQ4My4KKworMjAxMC0wOC0yNCAxMzo1Nzo1NSArMDIwMCAgUGFzY2FsIEJ1aGxlciA8cGFzY2FsLmJ1aGxlckB0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgcnRwc3NyY2RlbXV4OiBVbmtub3duIFNTUkMgaXMgbm90IGZhdGFsCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ2OTY2CisKKzIwMTAtMDgtMjQgMTM6NTQ6NTggKzAyMDAgIFBhc2NhbCBCdWhsZXIgPHBhc2NhbC5idWhsZXJAdGFuZGJlcmcuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBOdW1iZXIgb2YgYWN0aXZlIHNvdXJjZXMgc2hvdWxkIGJlIHVwZGF0ZWQgd2hlbmV2ZXIgdGhlIHN0YXR1cyBvZiB0aGUgc291cmNlIGNoYW5nZXMgdG8gYWN0aXZlCisJICBGb3J3YXJkLXBvcnRlZCBieSBPbGl2aWVyIENyw6p0ZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0Njk2NQorCisyMDEwLTA2LTIzIDExOjI5OjU4ICswMjAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cG1hbmFnZXI6IGlnbm9yZSBhIEJZRSBpZiBpdCBpcyBzZW50IHdpdGggb3VyIGludGVybmFsIFNTUkMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDY5NjQKKworMjAxMC0wMS0yOSAwOTo0OTo0OCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEFkZHMgbW9yZSBoMjY0IGZpZWxkcyB0byBpdHMgY2FwcworCSAgQWRkcyBhbGlnbm1lbnQ9YXUgYW5kIHN0cmVhbS1mb3JtYXQ9YXZjIHRvIGgyNjQgY2FwcworCSAgRml4ZXMgIzYwNjY2MgorCisyMDExLTA0LTExIDEyOjQ0OjE5ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSAgamFjazogYWxzbyBoYW5kbGUgZGVwcmVjYXRpb25zIGZvciBqYWNrIDEuOS43CisJICBKYWNrIDEuOS43IHdhcyByZWxlYXNlZCAyMC5NYXIuMjAxMSwgbmVlZCB0byBoYW5kbGUgdGhlIGRlcHJlY2F0ZWQgYXBpIGZvciB0aGlzCisJICB2ZXJzaW9uIHRvby4KKworMjAxMS0wNC0xMSAwMDozNjozNSAtMDQwMCAgVGhpYmF1bHQgU2F1bmllciA8dGhpYmF1bHQuc2F1bmllckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL01ha2VmaWxlLmFtOgorCSAgYW5kcm9pZDogbWFrZSBpdCByZWFkeSBmb3IgYW5kcm9nZW5pemVyCisJICBSZW1vdmUgdGhlIGFuZHJvaWQvIHRvcCBkaXIKKwkgIEZpeGUgdGhlIE1ha2VmaWxlLmFtIHRvIGJlIGFuZHJvZ2VuaXplZAorCSAgVG8gYnVpbGQgZ3N0cmVhbWVyIGZvciBhbmRyb2lkIHdlIGFyZSBub3cgdXNpbmcgYW5kcm9nZW5pemVyIHdoaWNoIGdlbmVyYXRlcyB0aGUgbmVlZGVkIEFuZHJvaWQubWsgZmlsZXMuCisJICBBbmRyb2dlbml6ZXIgY2FuIGJlIGZvdW5kIGhlcmU6IGh0dHA6Ly9naXQuY29sbGFib3JhLmNvLnVrLz9wPXVzZXIvZGVyZWsvYW5kcm9nZW5pemVyLmdpdAorCisyMDExLTA0LTEwIDE4OjU2OjUyIC0wNDAwICBUaGliYXVsdCBTYXVuaWVyIDx0aGliYXVsdC5zYXVuaWVyQGNvbGxhYm9yYS5jby51az4KKworCSogQW5kcm9pZC5tazoKKwkqIGFuZHJvaWQvTk9USUNFOgorCSogYW5kcm9pZC9hcGV0YWcubWs6CisJKiBhbmRyb2lkL2F2aS5tazoKKwkqIGFuZHJvaWQvZmx2Lm1rOgorCSogYW5kcm9pZC9nc3QvcnRwbWFuYWdlci9nc3RydHBiaW4tbWFyc2hhbC5jOgorCSogYW5kcm9pZC9nc3QvcnRwbWFuYWdlci9nc3RydHBiaW4tbWFyc2hhbC5oOgorCSogYW5kcm9pZC9nc3QvdWRwL2dzdHVkcC1lbnVtdHlwZXMuYzoKKwkqIGFuZHJvaWQvZ3N0L3VkcC9nc3R1ZHAtZW51bXR5cGVzLmg6CisJKiBhbmRyb2lkL2dzdC91ZHAvZ3N0dWRwLW1hcnNoYWwuYzoKKwkqIGFuZHJvaWQvZ3N0L3VkcC9nc3R1ZHAtbWFyc2hhbC5oOgorCSogYW5kcm9pZC9pY3lkZW11eC5tazoKKwkqIGFuZHJvaWQvaWQzZGVtdXgubWs6CisJKiBhbmRyb2lkL3F0ZGVtdXgubWs6CisJKiBhbmRyb2lkL3J0cC5tazoKKwkqIGFuZHJvaWQvcnRwbWFuYWdlci5tazoKKwkqIGFuZHJvaWQvcnRzcC5tazoKKwkqIGFuZHJvaWQvc291cC5tazoKKwkqIGFuZHJvaWQvdWRwLm1rOgorCSogYW5kcm9pZC93YXZlbmMubWs6CisJKiBhbmRyb2lkL3dhdnBhcnNlLm1rOgorCSogZ3N0L2FscGhhL01ha2VmaWxlLmFtOgorCSogZ3N0L2FwZXRhZy9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb2Z4L01ha2VmaWxlLmFtOgorCSogZ3N0L2F1cGFyc2UvTWFrZWZpbGUuYW06CisJKiBnc3QvYXV0b2RldGVjdC9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdmkvTWFrZWZpbGUuYW06CisJKiBnc3QvY3V0dGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L2RlYnVndXRpbHMvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUuYW06CisJKiBnc3QvZWZmZWN0di9NYWtlZmlsZS5hbToKKwkqIGdzdC9lcXVhbGl6ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvZmx2L01ha2VmaWxlLmFtOgorCSogZ3N0L2ZseC9NYWtlZmlsZS5hbToKKwkqIGdzdC9nb29tL01ha2VmaWxlLmFtOgorCSogZ3N0L2dvb20yazEvTWFrZWZpbGUuYW06CisJKiBnc3QvaWN5ZGVtdXgvTWFrZWZpbGUuYW06CisJKiBnc3QvaWQzZGVtdXgvTWFrZWZpbGUuYW06CisJKiBnc3QvaW1hZ2VmcmVlemUvTWFrZWZpbGUuYW06CisJKiBnc3QvaW50ZXJsZWF2ZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9sYXcvTWFrZWZpbGUuYW06CisJKiBnc3QvbGV2ZWwvTWFrZWZpbGUuYW06CisJKiBnc3QvbWF0cm9za2EvTWFrZWZpbGUuYW06CisJKiBnc3QvbW9ub3Njb3BlL01ha2VmaWxlLmFtOgorCSogZ3N0L211bHRpZmlsZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9tdWx0aXBhcnQvTWFrZWZpbGUuYW06CisJKiBnc3QvcXRkZW11eC9NYWtlZmlsZS5hbToKKwkqIGdzdC9yZXBsYXlnYWluL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0c3AvTWFrZWZpbGUuYW06CisJKiBnc3Qvc2hhcGV3aXBlL01ha2VmaWxlLmFtOgorCSogZ3N0L3NtcHRlL01ha2VmaWxlLmFtOgorCSogZ3N0L3NwZWN0cnVtL01ha2VmaWxlLmFtOgorCSogZ3N0L3VkcC9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2JveC9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2Nyb3AvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9taXhlci9NYWtlZmlsZS5hbToKKwkqIGdzdC93YXZlbmMvTWFrZWZpbGUuYW06CisJKiBnc3Qvd2F2cGFyc2UvTWFrZWZpbGUuYW06CisJKiBnc3QveTRtL01ha2VmaWxlLmFtOgorCSAgYW5kcm9pZDogTWFrZSBpdCByZWFkeSBmb3IgYW5kcm9nZW5pemVyCisJICBSZW1vdmUgdGhlIGFuZHJvaWQvIHRvcCBkaXIKKwkgIEZpeGUgdGhlIE1ha2VmaWxlLmFtIHRvIGJlIGFuZHJvZ2VuaXplZAorCSAgVG8gYnVpbGQgZ3N0cmVhbWVyIGZvciBhbmRyb2lkIHdlIGFyZSBub3cgdXNpbmcgYW5kcm9nZW5pemVyIHdoaWNoIGdlbmVyYXRlcyB0aGUgbmVlZGVkIEFuZHJvaWQubWsgZmlsZXMuCisJICBBbmRyb2dlbml6ZXIgY2FuIGJlIGZvdW5kIGhlcmU6IGh0dHA6Ly9naXQuY29sbGFib3JhLmNvLnVrLz9wPXVzZXIvZGVyZWsvYW5kcm9nZW5pemVyLmdpdAorCisyMDExLTA0LTA1IDIxOjE0OjQzICswMjAwICBIYWFrb24gU3BvcnNoZWltIDxoYWFrb24uc3BvcnNoZWltQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIHJ0cGdzdHBheTogZGVjbGFyZSBmcmFnX29mZnNldCB0byBob2xkIDMyYml0cy4KKwkgIEFzIHNwZWNpZmllZCBpbiBkb2N1bWVuYXRpb24gYWJvdmUgYW5kIGJlbG93LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0Njk1NAorCisyMDExLTA0LTA5IDEyOjQxOjQ4ICswMjAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGZpeCB3cm9uZ2x5IGFwcGxpZWQgcGF0Y2gKKwkgIE9idmlvdXNseSByZWN2X3J0cF9zaW5rIGRvZXMgbm90IGhhdmUgbXVjaCB0byBkbyB3aXRoIHNlbmRfcnRjcF9zcmMuLi4KKwkgIFNlZSBjb21taXQgMDQ2ZmYxNzAuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ3MjYzCisKKzIwMTEtMDQtMDggMTU6NTk6NTggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IHVwZGF0ZSBmb3Igc2V0X2ZyYW1lX3Byb3BzIC0+IHNldF9mcmFtZV9yYXRlIEFQSSBjaGFuZ2UKKworMjAxMS0wNC0wOCAwMDowMzoyMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkgIHRlc3RzOiBob29rIHVwIGF1ZGlvcGFyc2VyIHVuaXQgdGVzdHMKKworMjAxMS0wNC0wNyAxODozMDo0OSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIG1wZWdhdWRpb3BhcnNlOiByZWxheCBzeW5jIG1hdGNoIGEgYml0IHdoZW4gZHJhaW5pbmcKKwkgIC4uLiB0byBhdCBsZWFzdCBhbGxvdyBpbml0aWFsIGNhcHMgY2hhbmdlIChidXQgbm8gZnVydGhlciBjYXBzIGppdHRlcikuCisJICBGaXhlcyB1bml0IHRlc3QgYWdhaW4gYWZ0ZXIgcHJldmlvdXMgY2hhbmdlLgorCisyMDExLTA0LTA3IDE1OjIxOjEwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSAgZG9jczogdXBkYXRlIGZvciBjaGFuZ2VzIGluIGdpdAorCisyMDExLTA0LTA3IDE1OjIwOjE5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSAgZG9jczogYWRkIGF1ZGlvcGFyc2VycyB0byBkb2NzCisKKzIwMTEtMDQtMDcgMTU6MDc6MTUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL3BsdWdpbi5jOgorCSAgYWFjcGFyc2UsIGFtcnBhcnNlOiBnc3RfZm9vcGFyc2VfeHl6IC0+IGdzdF9mb29fcGFyc2VfeHl6IHRvIG1hdGNoIEdzdEZvb1BhcnNlCisJICBTZWUgbW92aW5nLXBsdWdpbnMgY2hlY2tsaXN0LgorCisyMDExLTA0LTA3IDE0OjQzOjQyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb3BhcnNlcnMvcGx1Z2luLmM6CisJICBhdWRpb3BhcnNlcnM6IGhvb2sgdXAgdG8gYnVpbGQKKworMjAxMS0wNC0wNyAxMzoyNjo0MSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuaDoKKwkgIGF1ZGlvcGFyc2VyczogcG9ydCB0byBuZXcgR3N0QmFzZVBhcnNlIGluIGNvcmUKKworMjAxMS0wNC0wNCAyMDo1NTozOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIG1wZWdhdWRpb3BhcnNlOiByZXF1aXJlIHRpZ2h0ZXIgc3luYyBtYXRjaCB3aGVuIGRyYWluaW5nCisKKzIwMTEtMDQtMDEgMTQ6NDc6NDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmg6CisJICBtcGVnYXVkaW9wYXJzZTogUGFyc2UgZW5jb2RlciBkZWxheSBhbmQgZW5jb2RlciBwYWRkaW5nIGZyb20gdGhlIExBTUUgaGVhZGVyIGlmIHByZXNlbnQKKworMjAxMS0wMy0wOSAyMzowNjoxNCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvcGx1Z2luLmM6CisJICBkY2FwYXJzZTogQnVtcCByYW5rIHRvIHByaW1hcnkrMQorCSAgU2VlbXMgdG8gd29yayBmaW5lIHdpdGggYSByZWFzb25hYmx5IHdpZGUgcmFuZ2Ugb2YgbWVkaWEsIHNvIGJ1bXBpbmcKKwkgIHJhbmsuCisKKzIwMTEtMDMtMjMgMjI6MDI6MzcgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmg6CisJICBkY2FwYXJzZTogRXhwb3NlIGZyYW1lIHNpemUgaW4gY2FwcworCSAgVGhpcyBleHBvcnRzIHRoZSBzaXplIG9mIHRoZSBmcmFtZSAobnVtYmVyIG9mIGJ5dGVzIGZyb20gb25lIHN5bmMgcG9pbnQKKwkgIHRvIHRoZSBuZXh0KSBhcyB0aGUgImZyYW1lX3NpemUiIGZpZWxkIGluIGNhcHMuCisKKzIwMTEtMDMtMDkgMjM6MDM6MTAgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmg6CisJICBkY2FwYXJzZTogRXhwb3NlIGJsb2NrIHNpemUgaW4gY2FwcworCSAgVGhpcyBzZXRzIHRoZSAiYmxvY2tfc2l6ZSIgZmllbGQgb24gY2FwcyBhcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMKKwkgIGVuY29kZWQgaW4gb25lIGZyYW1lLgorCisyMDExLTAzLTE2IDE1OjUzOjEzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSAgbXBlZ2F1ZGlvcGFyc2U6IGFkZCBGSVhNRSBmb3IgbWFraW5nIHRoZSBiYXNlIGNsYXNzIHVzZSB4aW5nIHNlZWsgdGFibGVzIGJldHRlcgorCisyMDExLTAzLTE0IDE4OjI1OjI1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5oOgorCSAgZGNhcGFyc2U6IEFkZCBkZXB0aCBhbmQgZW5kaWFubmVzcyB0byB0aGUgY2FwcworCSAgU29tZSBkZWNvZGVycyBjYW4gb25seSBoYW5kbGUgc3BlY2lmaWMgZW5kaWFubmVzcyBvciBhIGZpeGVkCisJICBkZXB0aCBhbmQgdGhpcyBhbGxvd3MgYmV0dGVyIG5lZ290aWF0aW9uLgorCSAgRml4ZXMgYnVnICM2NDQyMDguCisKKzIwMTEtMDItMjYgMTM6NTM6NDQgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBSZXZlcnQgImFhY3BhcnNlOiBhbGxvdyBwYXJzZWQgZnJhbWVzIG9uIHNpbmsgcGFkIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCBlNDliODlkNWM1YTEyNDRmYTBkY2I4YmI0OTk2ZTM4ZmI5YmZmOWU1LgorCisyMDExLTAyLTIzIDE3OjI1OjAzIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IGFsbG93IHBhcnNlZCBmcmFtZXMgb24gc2luayBwYWQKKworMjAxMC0xMC0xMyAxNjoxMjowMiAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3BhcnNlci5jOgorCSAgdGVzdHM6IGZpeCBiYXNlcGFyc2UgdGVzdAorCisyMDEwLTEwLTEzIDE1OjM5OjU1IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5oOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5oOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuaDoKKwkgIGJhc2VwYXJzZTogQ3JlYXRlIGJhc2VwYXJzZSBsaWJyYXJ5CisKKzIwMTEtMDItMDcgMTQ6NDY6NTcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiB0dW5lIFFVRVJZX1NFRUtJTkcgcmVzcG9uc2UKKwkgIEV2ZW4gaWYgd2UgY3VycmVudGx5IGRvIG5vdCBoYXZlIGEgZHVyYXRpb24geWV0LCBhc3N1bWUgc2Vla2FibGUgaWYKKwkgIGl0IGxvb2tzIGxpa2Ugd2UnbGwgbGlrZWx5IGJlIGFibGUgdG8gZGV0ZXJtaW5lIGl0IGxhdGVyIG9uCisJICAod2hpY2ggY29pbmNpZGVzIHdpdGggbmVlZGVkIGluZm9ybWF0aW9uIHRvIHBlcmZvcm0gc2Vla2luZykuCisJICBGaXhlcyAjNjQxMDQ3LgorCisyMDExLTAyLTA4IDIzOjM5OjI0ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogVXBkYXRlIG1pbi9tYXggYml0cmF0ZSBiZWZvcmUgZmlyc3QgcG9zdGluZyB0aGVtCisJICBUaGlzIGF2b2lkcyBwb3N0aW5nIGFuIGluaXRpYWwgbWluLWJpdHJhdGUgb2YgR19VSU5UTUFYIGFuZCBtYXgtYml0cmF0ZQorCSAgb2YgMC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDE4NTcKKworMjAxMS0wMi0wOCAyMzo1MDoxMyArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuaDoKKwkgIG1wZWdhdWRpb3BhcnNlOiBQb3N0IENCUiBiaXRyYXRlIGFzIG5vbWluYWwgYml0cmF0ZQorCSAgRXZlbiBpZiBWQlIgaGVhZGVycyBhcmUgbWlzc2luZywgd2UgY2FuJ3QgZ3VhcmFudGVlIHRoYXQgYSBzdHJlYW0gaXMgaW4KKwkgIGZhY3QgYSBDQlIgc3RyZWFtLCBzbyBpdCdzIHNhZmVyIHRvIGxldCBiYXNlcGFyc2UgY2FsY3VsYXRlIHRoZSBhdmVyYWdlCisJICBiaXRyYXRlIHJhdGhlciB0aGFuIGFzc3VtZSBhIENCUiBzdHJlYW0uIEhvd2V2ZXIsIGluIG9yZGVyIHRvIG1ha2UKKwkgIC9zb21lLyBtZXRhZGF0YSBhdmFpbGFibGUgYmVmb3JlIHRoZSByZXF1aXNpdGUgbnVtYmVyIG9mIGZyYW1lcyBoYXZlCisJICBiZWVuIHBhcnNlZCwgdGhpcyBwb3N0cyB0aGUgYml0cmF0ZSBmcm9tIHRoZSBub24tVkJSIGhlYWRlcnMgYXMgdGhlCisJICBub21pbmFsIGJpdHJhdGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQxODU4CisKKzIwMTAtMDktMDYgMTQ6MTA6MTEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmM6CisJICBhbXJwYXJzZTogYSB2YWxpZCBhbXItd2IgZnJhbWUgc2hvdWxkIG5vdCBoYXZlIHJlc2VydmVkIGZyYW1lIHR5cGUgaW5kZXgKKwkgIFNlZSAjNjM5NzE1LgorCisyMDExLTAxLTI3IDE2OjUyOjM0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IGltcHJvdmUgaGFuZGxpbmcgb2YgZGVwZW5kZW50IHN1YnN0cmVhbSBmcmFtZXMKKwkgIEluIHBhcnRpY3VsYXIsIHRpbWVzdGFtcHMgb2YgdGhlc2Ugc2hvdWxkIHRyYWNrIG1haW4tc3RyZWFtIHRpbWVzdGFtcHMuCisKKzIwMTEtMDEtMjEgMTQ6NTM6MzkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiB0dW5lIGRlZmF1bHQgZHVyYXRpb24gZXN0aW1hdGUgdXBkYXRlIGludGVydmFsCisJICBSYXRoZXIgdGhhbiBhIGZpeGVkIGRlZmF1bHQgZnJhbWUgY291bnQsIGVzdGltYXRlIGZyYW1lIGNvdW50IHRvIGFpbSBmb3IKKwkgIGFuIGludGVydmFsIGR1cmF0aW9uIGRlcGVuZGluZyBvbiBmcHMgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIG9sZAorCSAgZml4ZWQgZGVmYXVsdC4KKworMjAxMS0wMS0xNCAxNToxNjowNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IHJldmVyc2UgcGxheWJhY2s7IG1pbmQga2V5ZnJhbWVzIGZvciBmcmFnbWVudCBib3VuZGFyeQorCisyMDExLTAxLTEzIDE1OjI2OjIxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSAgYW1ycGFyc2U6IHByb3Blcmx5IGNoZWNrIGZvciBzdWZmaWNpZW50IGF2YWlsYWJsZSBkYXRhIHByaW9yIHRvIGFjY2VzcworCisyMDExLTAxLTEyIDE0OjQwOjM3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogZW5zdXJlIG5vbi1lbXB0eSBjYW5kaWRhdGUgZnJhbWVzCisKKzIwMTEtMDEtMTEgMTU6MjQ6MjMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBjbGFyaWZ5IHNvbWUgZGVidWcgc3RhdGVtZW50cworCisyMDExLTAxLTExIDE1OjI0OjAyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogcHJvcGVybHkgdHJhY2sgdXBzdHJlYW0gdGltZXN0YW1wcworCSAgLi4uIHJhdGhlciB0aGFuIHdpdGggYSBkZWxheS4KKworMjAxMS0wMS0xMSAxNToyMzoyOSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IG5lZWQgcHJvcGVyIGZyYW1lIGR1cmF0aW9uIHRvIG9idGFpbiBzZW5zaWJsZSBmcmFtZSBiaXRyYXRlCisKKzIwMTEtMDEtMTEgMTU6MjI6NTEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBwcm9wZXIgaW5pdGlhbCB2YWx1ZXMgZm9yIGluZGV4IHRyYWNraW5nIHZhcmlhYmxlcworCisyMDExLTAxLTExIDEyOjA1OjEzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogYXJyYW5nZSBmb3IgY29uc2lzdGVudCBldmVudCBoYW5kbGluZworCisyMDExLTAxLTEwIDE2OjU5OjU5ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuaDoKKwkgIGJhc2VwYXJzZTogaGVhZGVyIHN0eWxlIGNsZWFuaW5nCisKKzIwMTEtMDEtMTAgMTc6MDc6MzggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBwcm92aWRlIHNvbWUgbW9yZSBpbml0aWFsIGZyYW1lIG1ldGFkYXRhIGluIHBhcnNlX2ZyYW1lCisJICAuLi4gYW5kIGRvY3VtZW50IGFjY29yZGluZ2x5LgorCisyMDExLTAxLTEwIDE2OjU2OjM2ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiByZWZhY3RvciBwYXNzdGhyb3VnaCBpbnRvIGZvcm1hdCBmbGFncworCSAgQWxzbyBhZGQgYSBmb3JtYXQgZmxhZyB0byBzaWduYWwgYmFzZXBhcnNlIHRoYXQgc3ViY2xhc3MvZm9ybWF0IGNhbiBwcm92aWRlCisJICAocGFyc2VkKSB0aW1lc3RhbXAgcmF0aGVyIHRoYW4gYW4gZXN0aW1hdGVkIG9uZS4gIEluIHBhcnRpY3VsYXIsIHN1Y2ggInN0cm9uZyIKKwkgIHRpbWVzdGFtcCB0aGVuIGFsbG93cyB0byBlLmcuIGRldGVybWluZSBkdXJhdGlvbi4KKworMjAxMS0wMS0xMCAxNTozNDo0OCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5oOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogaW50cm9kdWNlIGEgYmFzZXBhcnNlIGZyYW1lIHRvIHNlcnZlIGFzIGNvbnRleHQKKwkgIC4uLiBhbmQgYWRqdXN0IHN1YmNsYXNzIHBhcnNlcnMgYWNjb3JkaW5nbHkKKworMjAxMS0wMS0wNyAxNjozOTo1MSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5oOgorCSAgYmFzZXBhcnNlOiByZXN0cmljdCBkdXJhdGlvbiBzY2FubmluZyB0byBwdWxsIG1vZGUgYW5kIGF2b2lkIGV4dHJhIHNldF9jYXBzIGNhbGwKKworMjAxMS0wMS0wNyAxNTo1ODo0OSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5oOgorCSAgYmFzZXBhcnNlOiB1cGRhdGUgc29tZSBkb2N1bWVudGF0aW9uCisJICBBbHNvIGFkZCBzb21lIG1vcmUgZGVidWcuCisKKzIwMTEtMDEtMDYgMTE6NDE6NDQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBhbGxvdyBpbmNyZWFzaW5nIG1pbl9zaXplIGZvciBjdXJyZW50IGZyYW1lIHBhcnNpbmcgb25seQorCSAgQWxzbyBjaGVjayB0aGF0IHN1YmNsYXNzIGFjdHVhbGx5IGVpdGhlciBkaXJlY3RzIHRvIHNraXAgYnl0ZXMgb3IKKwkgIGluY3JlYXNlcyBleHBlY3RlZCBmcmFtZSBzaXplIHRvIGF2b2lkIGdvaW5nIG5vd2hlcmUgaW4gYm9ndXMKKwkgIGluZGVmaW5pdGUgbG9vcGluZy4KKworMjAxMS0wMS0xNCAxNToyNjozNyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYWVzcGFyc2U6IGZpeCByZWZhY3RvciByZWdyZXNzaW9uIGluIGxvb3AgYmFzZWQgcGFyc2luZworCisyMDExLTAxLTA2IDExOjE2OjU2ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogcGFzcyBhbGwgYXZhaWxhYmxlIGRhdGEgdG8gc3ViY2xhc3MgcmF0aGVyIHRoYW4gbWluaW11bQorCSAgQWxzbyByZWR1Y2Ugc29tZSBhZGFwdGVyIGNhbGxzIGFuZCBhZGQgYSBmZXcgZGVidWcgc3RhdGVtZW50cy4KKworMjAxMC0xMi0xMCAxNTo1OTo0OSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IGZpeCByZXZlcnNlIHBsYXliYWNrIGhhbmRsaW5nCisKKzIwMTAtMTItMTAgMTQ6NTY6MTMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBtaW5vciB0eXBvIGFuZCBkZWJ1ZyBzdGF0ZW1lbnQgY2xlYW51cAorCisyMDEwLTEyLTEwIDE0OjQwOjA1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmg6CisJICBiYXNlcGFyc2U6IHJlZHVjZSBsb2NraW5nCisJICAuLi4gd2hpY2ggaXMgZWl0aGVyIGFscmVhZHkgbXV0ZSBhbmQvb3IgaW1wbGljaXRseSBoYW5kbGVkIGJ5IFNUUkVBTV9MT0NLLgorCisyMDExLTAxLTE0IDE0OjA4OjM4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogYXZvaWQgbG9vcCBpbiBmcmFtZSBsb2NhdGluZyBpbnRlcnBvbGF0aW9uCisKKzIwMTEtMDEtMTkgMTg6MjY6MzAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBtaW5kIGdzdF9idWZmZXJfdW5yZWYgbm90IGxpa2luZyBOVUxMCisJICBGaXhlcyAjNjM5OTUwLgorCisyMDExLTAxLTE0IDE2OjMwOjExIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2VyczogYmFzZXBhcnNlOiBCZSBjYXJlZnVsIHRvIG5vdCBsb3NlIHRoZSBldmVudCByZWYKKwkgIERvbid0IHVucmVmIHRoZSBldmVudCBpZiBpdCBoYXNuJ3QgYmVlbiBoYW5kbGVkLCBiZWNhdXNlIHRoZSBjYWxsZXIKKwkgIGFzc3VtZXMgaXQgaXMgc3RpbGwgdmFsaWQgYW5kIG1pZ2h0IHJldXNlIGl0LgorCSAgSSByYW4gaW50byB0aGlzIHByb2JsZW0gd2hlbiB0cmFuc2NvZGluZyBhbiBBVkkgKHdpdGggbXAzIGluc2lkZSkKKwkgIHRvIGdwcC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Mzk1NTUKKworMjAxMS0wMS0xMyAxNzoxMDoxMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkgIGRjYXBhcnNlOiBmaXggc3luYyB3b3JkIGZvciAxNC1iaXQgbGl0dGxlIGVuZGlhbiBjb2RpbmcKKwkgIEZpeCBjb3B5J24ncGFzdGUgYnVnIHRoYXQgbWFkZSB1cyBsb29rIGZvciB0aGUgcmF3IGxpdHRsZSBlbmRpYW4KKwkgIHN5bmMgd29yZCB0d2ljZSBpbnN0ZWFkIG9mIGxvb2tpbmcgZm9yIHRoZSAxNC1iaXQgTEUgc3luYyB3b3JkCisJICBhcyB3ZWxsLiBGaXhlcyBwYXJzaW5nIG9mIHN1Y2ggc3RyZWFtcyAoc2VlICM2MzYyMzQgZm9yIHNhbXBsZSBmaWxlKS4KKworMjAxMS0wMS0xMyAxNjoyNzowNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBkb2NzOiBtaW5vciBiYXNlcGFyc2UgZG9jcy9jb21tZW50IGZpeGVzCisJICBSZW1vdmUgY29weSduJ3Bhc3RlIGxlZnRvdmVycy4KKworMjAxMS0wMS0wNiAxMjo0OTo0MyArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IEZpeCB1bml0aWFsaXplZCB2YXJpYWJsZSBvbiBtYWNvc3gKKworMjAxMC0xMi0xMyAxNToxNzoyOSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkgIGFjM3BhcnNlOiByZWxheCBic2lkIGNoZWNraW5nCisJICAuLi4gdG8gdGhlIHdpZGVzdCBwb3NzaWJsZSBzcGVjIGludGVycHJldGF0aW9uLgorCSAgRml4ZXMgIzYzNzA2Mi4KKworMjAxMC0xMi0wMyAxODoxMTo1NiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2VyczogdXBkYXRlIHNvbWUgZG9jdW1lbnRhdGlvbgorCisyMDEwLTEyLTAzIDE4OjExOjM4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSAgbXBlZ2F1ZGlvcGFyc2U6IGFkZCB0byBkb2N1bWVudGF0aW9uCisKKzIwMTAtMTItMDMgMTg6MTE6MDkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJICBkY2FwYXJzZTogYWRkIHRvIGRvY3VtZW50YXRpb24KKworMjAxMC0xMS0wOCAxOTo1ODozMSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IGluY3JlYXNlIGtleWZyYW1lIGF3YXJlbmVzcworCSAgLi4uIHdoaWNoIGlzIG5vdCBwYXJ0aWN1bGFyIHJlbGV2YW50IGZvciBhdWRpbyBwYXJzaW5nLCBidXQgbW9yZSBzbworCSAgaW4gdmlkZW8gY2FzZXMuICBJbiBwYXJ0aWN1bGFyLCBhdXRvLWRldGVybWluZSBpZiBkZWFsaW5nIHdpdGggdmlkZW8gKGNhcHMpLgorCisyMDEwLTEyLTAxIDE1OjI4OjUzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5oOgorCSAgYWMzcGFyc2U6IHVzZSBwcm9wZXIgRUFDLTMgY2FwcworCisyMDEwLTExLTMwIDE1OjQxOjAyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogYXZvaWQgdW5leHBlY3RlZCBzdHJheSBtZXRhZGF0YQorCisyMDEwLTExLTMwIDE1OjQwOjI4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogdXNlIHByb3BlciBfTk9ORSBvdXRwdXQgdmFsdWUgd2hlbiBhcHBsaWNhYmxlCisKKzIwMTAtMTEtMjUgMTg6NTY6NDIgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IFJlbW92ZSBkZWFkIGFzc2lnbm1lbnRzCisKKzIwMTAtMTEtMjUgMTc6MTQ6MjMgKzAxMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8YW1vcmFsZXNAZmx1bW90aW9uLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2U6IGZpeCBwb3NzaWJsZSBkaXZpc2lvbi1ieS16ZXJvCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjM1Nzg2CisKKzIwMTAtMTEtMTcgMTY6MjM6NDIgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiB1c2UgY29ycmVjdCBvZmZzZXQgd2hlbiBhZGRpbmcgaW5kZXggZW50cnkKKwkgIC4uLiBiZWFyaW5nIGluIG1pbmQgdGhhdCBCVUZGRVJfT0ZGU0VUIGlzIG1lZGlhIHNwZWNpZmljIGFuZCBtYXkgbm90CisJICByZWZsZWN0IHRoZSBiYXNpYyBvZmZzZXQgYWZ0ZXIgaGF2aW5nIGJlZW4gcGFyc2VkLgorCisyMDEwLTExLTE3IDE0OjMwOjA5ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogZW5oYW5jZW1lbnRzIGZvciB0aW1lc3RhbXAgbWFya2VkIGZyYW1lZCBmb3JtYXRzCisJICBUaGF0IGlzLCBhcyBzdWNoIGZvcm1hdHMgYWxsb3cgc3ViY2xhc3MgdG8gZXh0cmFjdCBwb3NpdGlvbiBmcm9tIGZyYW1lLAorCSAgaXQgaXMgcG9zc2libGUgdG8gZXh0cmFjdCBkdXJhdGlvbiAoaWYgbm90IG90aGVyd2lzZSBwcm92aWRlZCkKKwkgIGZyb20gKG5lYXIpIGxhc3QgZnJhbWUsIGFuZCBhIHNlZWsgY2FuIGZhaXJseSBhY2N1cmF0ZWx5IHRhcmdldCB0aGUgcmVxdWlyZWQKKwkgIHBvc2l0aW9uLgorCSAgRml4ZXMgIzYzMTM4OS4KKworMjAxMC0xMS0xNiAxNzowNjoxNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IHJlZmFjdG9yIGZyYW1lIHNjYW5uaW5nIHBlZm9ybWVkIGJ5IF9sb29wCisKKzIwMTAtMTEtMTYgMTg6MDQ6MDAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBzbGlnaHRseSBvcHRpbWl6ZSBzZW5kaW5nIG9mIHBlbmRpbmcgbmV3c2VnbWVudCBldmVudHMKKworMjAxMC0xMS0xNiAxNzowNDozNSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IG1pbm9yIGZpeGVzIGFuZCBlbmhhbmNlbWVudHMKKwkgIEFycmFuZ2UgZm9yIHVwc3RyZWFtIGFzIHdlbGwgYXMgZG93bnN0cmVhbSBmbHVzaGluZyB3aGVuIHNlZWtpbmcuCisJICBBbHNvIGRldGVybWluZSB1cHN0cmVhbSBzaXplIGFzIHdlbGwgYXMgc2Vla2FiaWxpdHkuICBBZGp1c3Qgc29tZSBjb21tZW50cworCSAgdG8gcmVhbGl0eSBhbmQgZW1wbG95IGRlYnVnIHN0YXRlbWVudCBpbiBwcm9wZXIgb3JkZXIuCisKKzIwMTAtMTEtMTcgMTU6MzM6MzYgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogbWlub3IgY2xlYW51cHMKKworMjAxMC0xMS0xNyAxNToyNDozNyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBmaXggcmVncmVzc2lvbiBpbiBBRElGIHNyYyBjYXBzIHNldHRpbmcKKworMjAxMC0xMS0xNiAxMjoxMTo1MyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5oOgorCSAgZmxhY3BhcnNlOiBwYXJzZSBzZWVrdGFibGUKKwkgIEZpeGVzICM2MzEzODkgKHBhcnRpYWxseSkuCisKKzIwMTAtMTEtMTYgMTI6MDg6NTQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBtaW5vciByZWZhY3RvciBhbmQgZW5hYmxlIGRlZmF1bHQgYmFzZXBhcnNlIHNlZ21lbnQgY2xpcHBpbmcKKworMjAxMC0xMS0wOSAxOTozODoyNSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIG1wZWdhdWRpb3BhcnNlOiBmaXggc2lsbHkgbGVhayBpbiBfcmVzZXQKKworMjAxMC0xMC0yOSAxNDowODo1OCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IHVzZSBvbmx5IHVwc3RyZWFtIGR1cmF0aW9uIGlmIGl0IHByb3ZpZGVzIG9uZQorCisyMDEwLTEwLTI1IDE0OjE1OjUwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogcmVmbG93IHVwZGF0ZV9iaXRyYXRlIGNvZGUKKwkgIC4uLiB3aGljaCBtYWtlcyBsb2NhbCB2YXJpYWJsZXMgcmVwcmVzZW50IHJlYWwgc3RhdGUgYmV0dGVyLCBhbmQgYXZvaWRzCisJICB0cmlnZ2VyaW5nIHVubmVlZGVkIHVwZGF0ZXMvYWN0aW9ucy4KKworMjAxMC0xMC0yNSAxNDoxMzo1MSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IGFkZCBzb21lIGRlYnVnIHN0YXRlbWVudHMKKworMjAxMC0xMC0xOSAyMzoyNTo1NCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkgIGRjYXBhcnNlOiBpbml0IHZhcmlhYmxlIHRvIG1ha2Ugb3N4IGJ1aWxkIGJvdCBoYXBweQorCSAgZ3N0ZGNhcGFyc2UuYzogSW4gZnVuY3Rpb24gJ2dzdF9kY2FfcGFyc2VfY2hlY2tfdmFsaWRfZnJhbWUnOgorCSAgZ3N0ZGNhcGFyc2UuYzoyNDY6IHdhcm5pbmc6ICdiZXN0X3N5bmMnIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbgorCisyMDEwLTEwLTE5IDAwOjE1OjIwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvcGx1Z2luLmM6CisJICBhdWRpb3BhcnNlcnM6IGFkZCB2ZXJ5IGJhc2ljIGR0cy9kY2EgcGFyc2VyCisJICBTdGlsbCBzb21lIGlzc3VlcywgZS5nLiB3aXRoIHNlZWthYmxlIHF1ZXJpZXMgaW4gdG90ZW0sIGJ1dCBhbHNvCisJICBwcm9jZXNzaW5nIGFscmVhZHktY2h1bmtlZCBpbnB1dCAoY3JlYXRlZCB3aXRoIG1hdHJvc2thZGVtdXggISBnZHBwYXkpLgorCisyMDEwLTEwLTE0IDE2OjQ4OjIxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IHByb3Blcmx5IHBhcnNlIGUtYWMzIGZyYW1lIGhlYWRlcgorCSAgQWxzbyBhZGQgYSBmZXcgZGVidWcgc3RhdGVtZW50cy4KKworMjAxMC0xMC0xMyAxMTowMDowMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IHR3ZWFrIHNldHRpbmcgYnVmZmVyIG1ldGFkYXRhOyBhdm9pZCB0aW1lc3RhbXAgaml0dGVyCisJICBGaXhlcyAjNjMxOTkzLgorCisyMDEwLTEwLTEyIDE4OjA3OjQ5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5oOgorCSAgYWFjcGFyc2U6IHN0cmVhbWxpbmUgc3JjIGNhcHMgc2V0dGluZworCSAgSW4gcGFydGljdWxhciwgYWxzbyBzZXQgc3JjIGNhcHMgd2hlbmV2ZXIgY2hhbmdlcyBpbiBzdHJlYW0gd2FycmFudCBkb2luZyBzby4KKworMjAxMC0xMC0xMiAxMDoyODozMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBBZGp1c3QgdW5pdCB0ZXN0cyB0byBuZXcgZmxhY3BhcnNlIGJlaGF2aW91cgorCSAgR2FyYmFnZSBhZnRlciBmcmFtZXMgaXMgbm93IGluY2x1ZGVkIGluIHRoZSBmcmFtZXMgYmVjYXVzZSBmbGFjcGFyc2UKKwkgIGhhcyBubyBlYXN5IHdheSB0byBkZXRlY3QgdGhlIHJlYWwgZW5kIG9mIGEgZnJhbWUuIERlY29kZXJzIGFyZQorCSAgZXhwZWN0ZWQgdG8gZXZlcnl0aGluZyBhZnRlciB0aGUgZnJhbWUgYmVjYXVzZSBvbmx5IGRlY29kaW5nIHRoZQorCSAgYml0c3RyZWFtIHdpbGwgcmV2ZWFsIHRoZSByZWFsIGVuZCBvZiB0aGUgZnJhbWUuCisJICBGaXhlcyBidWcgIzYzMTgxNC4KKworMjAxMC0xMC0xMiAxMDoyNzo1MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IERvbid0IGRyb3AgdGhlIGxhc3QgZnJhbWUgaWYgaXQgaXMgZm9sbG93ZWQgYnkgZ2FyYmFnZQorCSAgU2VlIGJ1ZyAjNjMxODE0LgorCisyMDEwLTEwLTExIDE3OjQ5OjQ2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogcGVyZm9ybSBiaXRyYXRlIGhhbmRsaW5nIGFuZCBwb3N0aW5nIGFmdGVyIG5ld3NlZ21lbnQgc2VuZGluZworCisyMDEwLTEwLTExIDE3OjM2OjE5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogaW1tZWRpYXRlbHkgcG9zdCBzdWJjbGFzcyBwcm92aWRlZCBiaXRyYXRlCisKKzIwMTAtMTAtMTEgMTc6MDY6NDggKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBmaXggcGFyc2luZyB3aXRoIHVua25vd24gZnJhbWVzaXplcworCSAgRml4ZXMgIzYzMTgxNCAobW9zdGx5KS4KKworMjAxMC0xMC0wNyAyMzozNzozNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IFNpbXBsaWZ5IGZyYW1lIGhlYWRlciBwYXJzaW5nIGJ5IHVzaW5nIGxvb2t1cCB0YWJsZXMKKwkgIEJhc2VkIG9uIGEgcGF0Y2ggYnkgRmVsaXBlIENvbnRyZXJhcy4KKwkgIFNlZSBidWcgIzYzMTIwMC4KKworMjAxMC0xMC0wNyAyMzoyODowOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5oOgorCSAgZmxhY3BhcnNlOiBEb24ndCBwYXJzZSB0aGUgY29tcGxldGUgRkxBQyBmcmFtZXMgYnV0IG9ubHkgbG9vayBmb3IgdmFsaWQgZnJhbWUgaGVhZGVycworCSAgVGhhbmtzIHRvIEZlbGlwZSBDb250cmVyYXMgZm9yIHRoZSBzdWdnZXN0aW9uLiBUaGlzIGlzIHBhcnRpYWxseQorCSAgYmFzZWQgb24gaGlzIHBhdGNoZXMgYW5kIG1ha2VzIGZsYWNwYXJzZSBtb3JlIHRoYW4gMy41IHRpbWVzIGZhc3Rlci4KKwkgIExvb2tpbmcgZm9yIHZhbGlkIGZyYW1lIGhlYWRlcnMgaXMgdW5saWtlbHkgdG8gZ2l2ZSBmYWxzZSBwb3NpdGl2ZXMKKwkgIGJlY2F1c2UgZXZlcnkgZnJhbWUgaGVhZGVyIGlzIGF0IGxlYXN0IDkgYnl0ZXMgbG9uZywgY29udGFpbnMgYQorCSAgMTQgYml0IHN5bmMgY29kZSBhbmQgYSA4IGJpdCBjaGVja3N1bSBvdmVyIHRoZSBmaXJzdCA4IGJ5dGVzLgorCSAgRml4ZXMgYnVnICM2MzEyMDAuCisKKzIwMTAtMTAtMDYgMTg6MzI6NTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBSZWFsbHkgcG9zdCB0YWdzIG9ubHkgYWZ0ZXIgdGhlIGluaXRpYWwgbmV3c2VnbWVudCBldmVudAorCSAgVGhlIGZpcnN0IG5ld3NlZ21lbnQgZXZlbnQgd2lsbCBiZSBzZW5kIGJ5IHRoZSBmaXJzdCBjYWxsIHRvCisJICBnc3RfYmFzZV9wYXJzZV9wdXNoX2J1ZmZlcigpIGlmIG5lY2Vzc2FyeSwgcG9zdGluZyB0aGUgdGFncworCSAgYmVmb3JlIHRoYXQgaXMgbm90IGEgZ29vZCBpZGVhLiBJbnN0ZWFkIGRvIGl0IGZyb20gdGhlCisJICBHc3RCYXNlUGFyc2U6OnByZV9wdXNoX2J1ZmZlciB2ZnVuYy4KKworMjAxMC0xMC0wNSAxMToxNzo1MiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBSZXZlcnQgImJhc2VwYXJzZTogYWRkIHNraXAgcHJvcGVydHkiCisJICBUaGlzIHJldmVydHMgY29tbWl0IGI1YTNkNjAzNjNkODM3YTEwZjA1MzNjMTQxZWM5M2QxMGI3NDIzMTIuCisJICBSZXZlcnRpbmcgdGhpcyBmb3Igbm93LCBzaW5jZSBubyBvbmUgcmVhbGx5IHNlZW1zIHRvIHJlbWVtYmVyIHdoeSB0aGlzCisJICBwcm9wZXJ0eSBleGlzdHMgb3Igd2hhdCBpdCBjb3VsZCBwb3NzaWJseSBiZSBnb29kIGZvci4gSXQgc2VlbXMgdG8gaGF2ZQorCSAgYmVlbiBpbiB0aGUgb3JpZ2luYWwgbXAzcGFyc2Ugc2luY2UgdGhlIGJlZ2lubmluZyBvZiB0aW1lIGFuZCB3YXMgYmFjay0KKwkgIHBvcnRlZCBmcm9tIHRoZXJlLgorCisyMDEwLTEwLTA0IDEwOjQxOjUyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogRml4IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgY29tcGlsZXIgd2FybmluZ3MKKwkgIFRoZXNlIHdhcm5pbmdzIGFyZSB3cm9uZywgdGhlIHZhcmlhYmxlcyBhcmUgb25seSB1c2VkIGlmIHRoZXkgd2VyZQorCSAgaW5pdGlhbGl6ZWQgYnkgdGhlIGJpdCByZWFkZXIuCisKKzIwMTAtMDktMTQgMDI6NDg6NTggKzAzMDAgIEZlbGlwZSBDb250cmVyYXMgPGZlbGlwZS5jb250cmVyYXNAZ21haWwuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBmaXggcGljdHVyZSBwYXJzaW5nCisJICBTaWduZWQtb2ZmLWJ5OiBGZWxpcGUgQ29udHJlcmFzIDxmZWxpcGUuY29udHJlcmFzQGdtYWlsLmNvbT4KKworMjAxMC0xMC0wMyAyMzo1NDo0OSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IFB1c2ggdGFncyBiZWZvcmUgdGhlIGhlYWRlciBidWZmZXJzIGFyZSBwdXNoZWQKKworMjAxMC0wOC0wMiAyMDo1MDoyMSArMDMwMCAgRmVsaXBlIENvbnRyZXJhcyA8ZmVsaXBlLmNvbnRyZXJhc0BnbWFpbC5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IHRyaXZpYWwgY2FwcyBmaXgKKwkgIFNpZ25lZC1vZmYtYnk6IEZlbGlwZSBDb250cmVyYXMgPGZlbGlwZS5jb250cmVyYXNAZ21haWwuY29tPgorCisyMDEwLTEwLTAzIDIzOjUwOjI5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2VyOiBMZXQgdGhlIGZvcm1hdCBzdHJpbmcgYWdyZWUgd2l0aCB0aGUgcGFyYW1ldGVycyB0byBmaXggY29tcGlsZXIgd2FybmluZworCisyMDEwLTEwLTAzIDE1OjQxOjIwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IFVzZSB1bmNoZWNrZWQgdmVyc2lvbnMgb2YgdGhlIGJpdHJlYWRlciBnZXQgZnVuY3Rpb25zCisJICBXZSBkaWRuJ3QgY2hlY2sgdGhlIHJldHVybiB2YWx1ZXMgYW55d2F5Li4uCisKKzIwMTAtMDktMjIgMTU6NDQ6NDMgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBGaXggZGVidWcgb3V0cHV0CisJICBXZSBsb3NlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBhZnRlciBnc3RfcGFkX3B1c2goKSwgc28gdGhlIGRlYnVnCisJICBwcmludCBzaG91bGQgaGFwcGVuIGJlZm9yZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MjIyNzYKKworMjAxMC0xMC0wMSAxMjozNDo1NSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsYWNwYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcGFyc2VyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9wYXJzZXIuaDoKKwkgIGF1ZGlvcGFyc2VyczogYWRkIGZsYWNwYXJzZSB1bml0IHRlc3QKKwkgIC4uLiBhbmQgdHdlYWsgcGFyc2VyIHRlc3QgaGVscGVyIGluIHRoZSBwcm9jZXNzLgorCisyMDEwLTA5LTI5IDE2OjEyOjQyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogc3VwcG9ydCByZXZlcnNlIHBsYXliYWNrCisJICAuLi4gaW4gcHVsbCBtb2RlIG9yIHVwc3RyZWFtIGRyaXZlbi4KKworMjAxMC0wOS0yNyAxMjoxNjo0MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IHJlbW92ZSBkb25lIFRPRE9zIGFuZCB1cGRhdGUgZG9jdW1lbnRhdGlvbgorCisyMDEwLTA5LTI1IDE0OjQwOjU0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogdXNlIGRldGVybWluZWQgc2Vla2FiaWxpdHkgaW4gYW5zd2VyaW5nIFNFRUtJTkcgcXVlcnkKKworMjAxMC0wOS0yNSAxNDozMjowNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IGFkZCBza2lwIHByb3BlcnR5CisKKzIwMTAtMDktMjUgMTM6NTk6MzkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hYzNwYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2VyczogYWRkIGFjM3BhcnNlIGFuZCBtcGVnYXVkaW9wYXJzZSB1bml0IHRlc3QKKworMjAxMC0wOS0yNSAxMzo1OToxOCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL3BsdWdpbi5jOgorCSAgbXBlZ2F1ZGlvcGFyc2U6IGluaXRpYWwgdmVyc2lvbgorCSAgLi4uIGFkZXF1YXRlbHkgZXF1aXZhbGVudCB0byBtcDNwYXJzZSwgc28gbGV0cyBib2xkbHkgc2V0IGl0CisJICB0byBoaWdoZXIgcmFuay4KKworMjAxMC0wOS0yNSAxNDowMTowNyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBzZXQgbWluaW11bSBmcmFtZSBzaXplIGF0IF9zdGFydAorCSAgLi4uIHJhdGhlciB0aGFuIG9uZSB0aW1lIGF0IF9pbml0LgorCisyMDEwLTA5LTI1IDEzOjUwOjUxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYWFjcGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FtcnBhcnNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9wYXJzZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3BhcnNlci5oOgorCSAgYXVkaW9wYXJzZXJzOiByZWZhY3RvciBleGlzdGluZyB1bml0IHRlc3RzIHVzaW5nIGNvbW1vbiBoZWxwZXIKKworMjAxMC0wOS0yMiAxNTowNzowOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5oOgorCSAgYmFzZXBhcnNlOiB1c2UgX3NldF9mcmFtZV9wcm9wcyB0byBjb25maWd1cmUgZnJhbWUgbGVhZF9pbiBhbmQgbGVhZF9vdXQKKwkgIC4uLiBwcm92aWRlZCBhIGNvcnJlc3BvbmRpbmcgZGVjb2RlciB3aXRoIHN1ZmZpY2llbnQgbGVhZGluZyBhbmQgZm9sbG93aW5nCisJICBmcmFtZXMgdG8gY2Fycnkgb3V0IGZ1bGwgZGVjb2RpbmcgZm9yIGEgcGFydGljdWxhciBzZWdtZW50LgorCisyMDEwLTA5LTIyIDE0OjEzOjE3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiB1c2UgX3NldF9kdXJhdGlvbiB0byBjb25maWd1cmUgZHVyYXRpb24gdXBkYXRlIGludGVydmFsCisJICAuLi4gYXMgaXQgbG9naWNhbGx5IGJlbG9uZ3MgdGhlcmUgYXMgb25lIG9yIHRoZSBvdGhlcjsgZWl0aGVyIHN1YmNsYXNzCisJICBjYW4gcHJvdmlkZSBhIGR1cmF0aW9uLCBvciBhbiBlc3RpbWF0ZSBtdXN0IGJlIG1hZGUgKHJlZ3Vhcmx5IHVwZGF0ZWQpLgorCisyMDEwLTA5LTIyIDEzOjU1OjIwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogbG9jYWxpemUgdXNlIG9mIHByb3ZpZGVkIGZwcyBpbmZvcm1hdGlvbgorCisyMDEwLTA5LTIyIDEyOjEzOjEyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogc2VlayB0YWJsZSBhbmQgYWNjdXJhdGUgc2VlayBzdXBwb3J0CisKKzIwMTAtMDktMjEgMTM6NTc6MTAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBwcm9wZXIgYW5kIG1vcmUgZXh0ZW5kZWQgc2VnbWVudCBhbmQgc2VlayBoYW5kbGluZworCSAgVGhhdCBpcywgbG9vcCBwYXVzZSBoYW5kbGluZywgc2VnbWVudCBzZWVrIHN1cHBvcnQsIG5ld3NlZ21lbnQgZm9yIGdhcHMsIGV0YworCisyMDEwLTA5LTIxIDEwOjU3OjA0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmg6CisJICBiYXNlcGFyc2U6IGFkZCBpbmRleCBzdXBwb3J0CisKKzIwMTAtMDktMjEgMDk6NTk6NTYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiByZWZhY3RvciBzdGF0ZSByZXNldAorCisyMDEwLTA5LTIwIDE2OjM5OjM3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogcHJldmVudCBpbmRlZmluaXRlIHJlc3luY2luZworCisyMDEwLTA5LTIwIDEzOjU3OjU1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogc3BlY2lmaWMgRU9TIGhhbmRsaW5nIGlmIG5vIG91dHB1dCBzbyBmYXIKKworMjAxMC0wOS0yMCAxMzozMTo1NyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IGFkanVzdCBfc2V0X2ZyYW1lX3Byb3AgZG9jdW1lbnRhdGlvbiBhbmQgc2V0IGRlZmF1bHQgYXMgY2xhaW1lZAorCisyMDEwLTA5LTIwIDEzOjMwOjU0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogZml4IGJpdHJhdGUgY29weS1hbmQtcGFzdGUgYW5kIHVwZGF0ZSBoZXVyaXN0aWMKKworMjAxMC0wOS0xNyAxODozMzoyOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IHBvc3QgZHVyYXRpb24gbWVzc2FnZSBpZiBhdmVyYWdlIGJpdHJhdGVzIGlzIHVwZGF0ZWQKKworMjAxMC0wOS0xNyAxODoyNDoyMiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5oOgorCSAgYmFzZXBhcnNlOiByZW1vdmUgaXNfc2Vla2FibGUgdm1ldGhvZCBhbmQgdXNlIGEgc2V0X3NlZWsgaW5zdGVhZAorCSAgU2Vla2FiaWxpdHksIGxpa2UgZHVyYXRpb24sIGV0YyBpcyB1bmxpa2VseSB0byBjaGFuZ2UgKGZyZXF1ZW50bHkpLCBhbmQKKwkgIHRoZSBkZWZhdWx0IGFzc3VtcHRpb24gY292ZXJzIG1vc3QgY2FzZXMsIHNvIGxldCBzdWJjbGFzcyBzZXQgd2hlbiBuZWVkZWQuCisJICBBdCB0aGUgc2FtZSB0aW1lLCBhbGxvdyBzdWJjbGFzcyB0byBpbmRpY2F0ZSBpZiBpdCBoYXMgc2Vlay1tZXRhZGF0YSAodGFibGUpCisJICBhdmFpbGFibGUsIGFuZCBwb3NzaWJseSBoYXZlIGl0IHByb3ZpZGUgYW4gYXZlcmFnZSBiaXRyYXRlLgorCisyMDEwLTA5LTE3IDE3OjM1OjQwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IHJlbW92ZSByZWR1bmRhbnQgZGVmYXVsdCBpc19zZWVrYWJsZQorCisyMDEwLTA5LTE3IDE3OjIxOjQ2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmg6CisJICBiYXNlcGFyc2U6IGFkZCBhbm90aGVyIGhvb2sgZm9yIHN1YmNsYXNzIHByaW9yIHRvIHB1c2hpbmcgYnVmZmVyCisJICAuLi4gYW5kIGFsbG93IHN1YmNsYXNzIHRvIHBlcmZvcm0gY3VzdG9tIHNlZ21lbnQgY2xpcHBpbmcsIG9yIHRvCisJICBlbWl0IHRhZ3Mgb3IgbWVzc2FnZXMgYXQgdGhpcyB0aW1lLgorCisyMDEwLTA5LTE3IDE3OjE5OjM3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogMCBjb252ZXJ0cyB0byAwIGJ5IGRlZmF1bHQKKworMjAxMC0wOS0xNiAxODo1Njo0NiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5oOgorCSAgYmFzZXBhc2U6IHJlZmFjdG9yIGNvbnZlcnNpb24gdXNpbmcgaGVscGVyIGZ1bmN0aW9uIGFuZCBleHBvcnQgZGVmYXVsdCBjb252ZXJ0CisKKzIwMTAtMDktMTYgMTg6MzU6NDcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBzdHJlYW1saW5lIHF1ZXJ5IGhhbmRsaW5nCisKKzIwMTAtMDktMTYgMTE6NTE6MjAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuaDoKKwkgIGJhc2VwYXJzZTogY2xlYW51cCBzdHJ1Y3QgYW5kIHJlbW92ZSB1bnVzZWQgbWVtYmVyCisKKzIwMTAtMDgtMTYgMTE6MDQ6MzcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL3BsdWdpbi5jOgorCSAgYXVkaW9wYXJzZXJzOiBpbmNyZWFzZSByYW5rcyB0byBlbmFibGUgYXV0by1wbHVnZ2luZworCSAgQmVjYXVzZSB3ZSBjYW4sIGFuZCBzaG91bGQsIGhhdmUgc29tZSBzaGFrZWRvd24gdGVzdGluZyBiZWZvcmUgaGF2aW5nCisJICB0aGVzZSBtYWtlIGl0IGludG8gLWdvb2QgbGF0ZXIgb24gLi4uCisKKzIwMTAtMDktMjIgMTY6MDc6MjQgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBBbGxvdyBjaGFpbmluZyBvZiBzdWJjbGFzcyBldmVudCBoYW5kbGVycworCSAgVGhpcyBhbGxvd3MgdGhlIGNoaWxkIGNsYXNzIHRvIGNoYWluIGl0cyBldmVudCBoYW5kbGVyIHdpdGgKKwkgIEdzdEJhc2VQYXJzZSwgc28gdGhhdCBzdWJjbGFzc2VzIGRvbid0IGhhdmUgdG8gZHVwbGljYXRlIGFsbCB0aGUgZGVmYXVsdAorCSAgZXZlbnQgaGFuZGxpbmcgbG9naWMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjIyMjc2CisKKzIwMTAtMDgtMjcgMTg6MzU6MTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBEb24ndCB1c2UgR1NUX0ZMT1dfSVNfRkFUQUwoKQorCSAgQWxzbyBkb24ndCBwb3N0IGFuIGVycm9yIG1lc3NhZ2UgZm9yIFVORVhQRUNURUQgYW5kIGRvIGl0CisJICBmb3IgTk9UX0xJTktFRC4KKworMjAxMC0wOS0wNiAxNDoxMjowMCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IG5vbi1USU1FIHNlZWsgZXZlbnQgaXMgc2ltcGx5IG5vdCBoYW5kbGVkCisKKzIwMTAtMDYtMTUgMTU6MzQ6MDUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBmaXggc2VlayBldmVudCByZWYgaGFuZGxpbmcKKworMjAxMC0wNi0xNSAxNTozMzozNyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IHByZXZlbnQgYXJpdGhtZXRpYyBvdmVyZmxvd3MgaW4gcHVsbCBtb2RlIGJ1ZmZlciBjYWNoZSBoYW5kbGluZworCisyMDEwLTA2LTE1IDE1OjMyOjM0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogZml4IHNlZWsgaGFuZGxpbmcKKwkgIEFsbG93IGEgZmV3IG1vcmUgc2VlayBldmVudCB0eXBlIGNvbWJpbmF0aW9ucywgYW5kIHJlYWxseSB1c2UgdGhlIHJlc3VsdAorCSAgb2YgZ3N0X3NlZ21lbnRfc2V0X3NlZWsgdG8gcGVyZm9ybSB0aGUgc2Vlay4gIEFsc28gYWRkIHNvbWUgZGVidWcuCisKKzIwMTAtMDQtMTIgMTg6MDc6MjkgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FhY3BhcnNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hbXJwYXJzZS5jOgorCSAgY2hlY2s6IERvbid0IHJlLWRlY2xhcmUgJ0dMaXN0ICpidWZmZXJzJyBpbiB0aGUgdGVzdHMKKwkgIEl0J3MgYW4gZXh0ZXJuYWwgd2hpY2ggbGl2ZXMgaW4gZ3N0Y2hlY2suYy4gUmVkZWNsYXJpbmcgaXQgbWFrZXMgc29tZQorCSAgY29tcGlsZXJzL2FyY2hpdGVjdHVyZXMgdGhpbmsgdGhlICdidWZmZXJzJyBpbiB0aGUgaW5kaXZpZHVhbCB0ZXN0cyBhcmUKKwkgIGEgZGlmZmVyZW50IHN5bWJvbC4uLiBhbmQgdGhlcmVmb3JlIHdlIGVuZCB1cCBjb21wYXJpbmcgaG9sb2RlY2tzIHdpdGgKKwkgIG9yYW5nZXMuCisKKzIwMTAtMDMtMjYgMTg6NTY6NDkgKzAwMDAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBEb24ndCBlbWl0IGJpdHJhdGUgdGFncyB0b28gZWFybHkKKwkgIFdlIHdhaXQgdG8gcGFyc2UgYSBtaW5pbXVtIG51bWJlciBvZiBmcmFtZXMgKDEwLCBhcmJpdHJhcmlseSkgYmVmb3JlCisJICBlbWl0aW5nIGJpdHJhdGUgdGFncyBzbyB0aGF0IG91ciBlYXJseSBlc3RpbWF0ZXMgYXJlIG5vdCB3aWxkbHkKKwkgIGluYWNjdXJhdGUgZm9yIHN0cmVhbXMgdGhhdCBzdGFydCB3aXRoIGEgc2lsZW5jZS4gSWYgdGhlIHN0cmVhbSBlbmRzCisJICBiZWZvcmUgdGhhdCwgd2UganVzdCBlbWl0IHRoZSB0YWdzIGFueXdheS4KKwkgIFdoaWxlIGl0IF93b3VsZF8gYmUgbmljZXIgdG8gYmUgc3BlY2lmeSB0aGUgdGhyZXNob2xkIHRvIHN0YXJ0IHB1c2hpbmcKKwkgIHRoZSB0YWdzIGluIHRlcm1zIG9mIGR1cmF0aW9uLCB0aGlzIHdvdWxkIGludHJvZHVjZSBtb3JlIGNvbXBsZXhpdHkgdGhhbgorCSAgdGhpcyBtZXJpdHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjE0OTkxCisKKzIwMTAtMDMtMjYgMTg6NTg6MzUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuaDoKKwkgIGZsYWNwYXJzZTogT3B0aW9uYWxseSBjaGVjayB0aGUgb3ZlcmFsbCBmcmFtZSBjaGVja3N1bXMgdG9vIGJlZm9yZSBhY2NlcHRpbmcgYSBmcmFtZSBhcyB2YWxpZAorCSAgVGhpcyBpcyBvcHRpb25hbCBiZWNhdXNlIGl0J3MgYSBxdWl0ZSBleHBlbnNpdmUgb3BlcmF0aW9uIGFuZCBpdCdzIHZlcnkKKwkgIHVubGlrZWx5IHRoYXQgYSBub24tZnJhbWUgaXMgZGV0ZWN0ZWQgYXMgZnJhbWUgYWZ0ZXIgdGhlIGhlYWRlciBDUkMgY2hlY2sKKwkgIGFuZCBjaGVja2luZyBhbGwgYml0cyBmb3IgdmFsaWQgdmFsdWVzLiBUaGUgb3ZlcmFsbCBmcmFtZSBjaGVja3N1bXMgYXJlCisJICBtYWlubHkgdXNlZnVsIHRvIGRldGVjdCBpbmNvbnNpc3RlbmNpZXMgaW4gdGhlIGVuY29kZWQgcGF5bG9hZC4KKworMjAxMC0wMy0yNiAxODo0MjoyOCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IENoZWNrIHRoZSBDUkMtOCBvZiB0aGUgaGVhZGVycyBiZWZvcmUgYWNjZXB0aW5nIGEgZnJhbWUgYXMgdmFsaWQKKwkgIFRoaXMgbWFrZXMgZmFsc2UtcG9zaXRpdmVzIGR1cmluZyBzZWVraW5nIG11Y2ggbGVzcyBsaWtlbHkgYW5kIGRldGVjdGlvbiBvZgorCSAgdGhlbSBtdWNoIGZhc3Rlci4KKworMjAxMC0wMy0yNiAxODoyMDoyNCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IFNldCB0aGUgbGFzdCBzdG9wIHRvIHRoZSBidWZmZXIgc3RhcnR0aW1lIGlmIHRoZSBkdXJhdGlvbiBpcyBpbnZhbGlkCisJICAuLi5pbnN0ZWFkIG9mIG5vdCBzZXR0aW5nIGl0IGF0IGFsbC4KKworMjAxMC0wMy0yNiAxODoxOTowMCArMDEwMCAgSm9zaHVhIE0uIERvZSA8am9zaEBqb3NoZG9lLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogU2VuZCBORVdTRUdNRU5UIGV2ZW50IHdpdGggY29ycmVjdCBzdGFydCBhbmQgcG9zaXRpb24KKwkgIEluc3RlYWQgb2YgdGFraW5nIHRoZSBsYXN0IHN0b3AgKHdoaWNoIGNvdWxkIGJlIGJ1ZmZlciBlbmR0aW1lIGluc3RlYWQKKwkgIG9mIHN0YXJ0dGltZSkgYWx3YXlzIHRha2UgdGhlIGJ1ZmZlciBzdGFydHRpbWUuCisJICBGaXhlcyBidWcgIzYxNDAxNi4KKworMjAxMC0wMy0yNiAxNjo0OTowMSArMDAwMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IEZpeCBidWZmZXIgcmVmY291bnQgaXNzdWUKKwkgIFdoZW4gY2FsbGVkIGZyb20gdGhlIEdTVF9GTEFDX1BBUlNFX1NUQVRFX0hFQURFUlMgY2FzZSwKKwkgIGdzdF9mbGFjX3BhcnNlX2hhbmRfaGVhZGVycygpIGRvZXMgYSBnc3RfYnVmZmVyX3NldF9jYXBzKCkgb24gYSBidWZmZXIKKwkgIHdpdGggcmVmY291bnQgPiAxLiBUaGlzIGNoYW5nZSBoYW5kbGVzIHRoaXMgY2FzZSBieSBtYWtpbmcgdGhlIGJ1ZmZlcgorCSAgbWV0YWRhdGFfV3JpdGFibGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjE0MDM3CisKKzIwMTAtMDMtMjUgMTc6MDk6MTcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuaDoKKwkgIGF1ZGlvcGFyc2VyczogcmVtb3ZlIHVudXNlZCBHc3RCYXNlUGFyc2VDbGFzc1ByaXZhdGUgc3RydWN0dXJlCisKKzIwMTAtMDMtMjUgMTI6NTU6MDIgKzAwMDAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBNYWtlIGJpdHJhdGUgZXN0aW1hdGlvbiBtb3JlIGFjY3VyYXRlCisJICBUaGlzIGltcGxlbWVudHMgdGhlIGdldF9mcmFtZV9vdmVyaGVhZCgpIHZmdW5jIHNvIHRoYXQgYmFzZXBhcnNlIGNhbgorCSAgbWFrZSBtb3JlIGFjY3VyYXRlIGJpdHJhdGUgZXN0aW1hdGVzLgorCisyMDEwLTAzLTI1IDExOjQ4OjQ2ICswMDAwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IEZpeCBiaXRyYXRlIGNhbGN1bGF0aW9uCisJICBUaGlzIHBhdGNoIGFkZHMgdGhlIGdldF9mcmFtZV9vdmVyaGVhZCgpIHZmdW5jIHNvIHRoYXQgYmFzZXBhcnNlIGNhbgorCSAgYWNjdXJhdGVseSBjYWxjdWxhdGUgdGhlIG1pbi9hdmcvbWF4IGJpdHJhdGVzIGZvciBhYWNwYXJzZS4KKwkgIE5vdGU6IFRoZSBiaXRyYXRlIHdhcyBiZWluZyBpbmNvcnJlY3RseSBjYWxjdWxhdGVkIGZvciBBRFRTIHN0cmVhbXMKKwkgIChpdCdzIG5vdCBpbiB0aGUgaGVhZGVyIGFzIHRoZSBjb2RlIHN1Z2dlc3RzKS4KKworMjAxMC0wMy0yNSAxMToyMjo1OCArMDAwMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5oOgorCSAgYXVkaW9wYXJzZXJzOiBBZGQgYml0cmF0ZSBjYWxjdWxhdGlvbiB0byBiYXNlcGFyc2UKKwkgIFRoaXMgbWFrZXMgYmFzZXBhcnNlIGtlZXAgYSBydW5uaW5nIGF2ZXJhZ2Ugb2YgdGhlIHN0cmVhbSBiaXRyYXRlLCBhcworCSAgd2VsbCBhcyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBiaXRyYXRlcy4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgYQorCSAgdmZ1bmMgdG8gbWFrZSBzdXJlIHRoYXQgcGVyLWZyYW1lIG92ZXJoZWFkIGZyb20gdGhlIGNvbnRhaW5lciBpcyBub3QKKwkgIGFjY291bnRlZCBmb3IgaW4gdGhlIGJpdHJhdGUgY2FsY3VsYXRpb24uCisJICBXZSB0YWtlIGNhcmUgbm90IHRvIG92ZXJyaWRlIHRoZSBiaXRyYXRlLCBtaW5pbXVtLWJpdHJhdGUsIGFuZAorCSAgbWF4aW11bS1iaXRyYXRlIHRhZ3MgaWYgdGhleSBoYXZlIGJlZW4gcG9zdGVkIHVwc3RyZWFtLiBXZSBhbHNvCisJICByYXRlLWxpbWl0IHRoZSBlbWlzc2lvbiBvZiBiaXRyYXRlIHNvIHRoYXQgaXQgaXMgb25seSB0cmlnZ2VyZWQgYnkgYQorCSAgY2hhbmdlIG9mID4xMCBrYnBzLgorCisyMDEwLTAzLTIyIDE2OjU2OjAzICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FtcnBhcnNlLmM6CisJICBBZGQgLVdvbGQtc3R5bGUtZGVmaW5pdGlvbgorCSAgYW5kIGZpeCB0aGUgd2FybmluZ3MKKworMjAxMC0wMy0yMSAyMTozOToxOCArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hYWNwYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYW1ycGFyc2UuYzoKKwkgIEFkZCAtV21pc3NpbmctZGVjbGFyYXRpb25zIC1XbWlzc2luZy1wcm90b3R5cGVzIHRvIGNvbmZpZ3VyZSBmbGFncworCSAgQW5kIGZpeCBhbGwgd2FybmluZ3MKKworMjAxMC0wMy0xOCAxNzozMDoyNiArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmM6CisJICBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlscyA9PiBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUKKworMjAxMC0wMS0xNCAxMTo1MDozMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IHJlbmFtZSBiYXNlcGFyc2UgR1R5cGUgbmFtZSB0byBhdm9pZCBwb3NzaWJsZSBjb25mbGljdHMKKworMjAxMC0wMS0xMiAxODo1NTo1MyArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogSW5pdGlhbGl6ZSB2YXJpYWJsZXMuCisJICBGaXhlcyBidWlsZCBvbiAkI0AqKCBtYWNvc3gKKworMjAxMC0wMS0xMSAyMjo0MTo1NyArMDMwMCAg0PPx6+DtIMjm4fPr4PLu4iA8bHJuMTk4NkBnbWFpbC5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkgIHdpbjMyOiBJbmNsdWRlIGNvbmZpZy5oIGJlZm9yZSBhbnl0aGluZyBlbHNlLiBGaXggbXBlZ2RlbXV4IExJQkFERAorCSAgQmVjYXVzZSBjb25maWcuaCBkZWZpbmVzIF9fTVNWQ1JUX1ZFUlNJT05fXywgd2hpY2ggc2hvdWxkIGJlIGRlZmluZWQKKwkgIGJlZm9yZSBpbmNsdXNpb24gb2YgYW55IHN5c3RlbSBoZWFkZXIuCisJICBBbHNvIGZpeGVzIG1wZWdkZW11eCBNYWtlZmlsZS5hbSBMSUJBREQgdHlwby4KKwkgIEZpeGVzICM2MDY2NjUKKworMjAxMC0wMS0xMSAxMzoyMDoyNiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBBbHNvIGFkZCBzdHJlYW0tZm9ybWF0IHRvIHRlbXBsYXRlIGNhcHMKKwkgIERvIG5vdCBmb3JnZXQgdG8gYWRkIHN0cmVhbS1mb3JtYXQgdG8gdGVtcGxhdGUgY2FwcworCSAgb2ZmIGFhY3BhcnNlCisKKzIwMTAtMDEtMTEgMTM6MTM6NDEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hYWNwYXJzZS5jOgorCSAgUmVuYW1lIGFhYydzIHN0cmVhbS1mb3JtYXQgJ25vbmUnIHRvICdyYXcnCisJICBSZW5hbWVzIGFhYydzIHN0cmVhbS1mb3JtYXQgZnJvbSBwcmV2aW91cyBjb21taXRzIGZyb20gbm9uZSB0bworCSAgcmF3CisKKzIwMTAtMDEtMTEgMTI6MTA6MDIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IHVwZGF0ZSB0ZXN0cyB0byBzdHJlYW0tZm9ybWF0IGNoYW5nZXMKKwkgIFVwZGF0ZXMgYWFjcGFyc2UgdW5pdCB0ZXN0cyB0byBjaGVjayBmb3Igc3RyZWFtLWZvcm1hdAorCSAgY29ycmVjdG5lc3MgYXMgd2VsbC4KKworMjAxMC0wMS0xMSAxMDo1MToxOCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBBZGQgc3RyZWFtLWZvcm1hdCB0byBvdXRwdXQgY2FwcworCSAgQWRkcyBzdHJlYW0tZm9ybWF0IGZpZWxkIHRvIG91dHB1dCBjYXBzCisKKzIwMTAtMDEtMDUgMTU6MDU6MDUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYXVkaW9wYXJzZXJzOiBkb2N1bWVudGF0aW9uIGZpeGVzCisKKzIwMTAtMDEtMDUgMTU6MDQ6MzggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJICBhYzNwYXJzZTogYWRkIGRvY3VtZW50YXRpb24KKworMjAxMC0wMS0wNSAxNDo0ODo0OSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5oOgorCSAgZmxhY3BhcnNlOiBhZGQgZG9jdW1lbnRhdGlvbgorCisyMDA5LTEyLTIxIDE4OjI5OjQzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogcGVyZm9ybSBhZGRpdGlvbmFsIGZyYW1lIGNoZWNrcyB3aGVuIHJlc3luY2luZworCisyMDEwLTAxLTA1IDE2OjM1OjUyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogZml4IChtdWx0aXBsZSBjaGFubmVsKSBmcmFtZSBwYXJzaW5nCisKKzIwMTAtMDEtMDUgMTY6MzU6NDQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBkZWNsYXJlIHVucGFyc2VkIGlucHV0IGFuZCBwYXJzZWQgb3V0cHV0CisKKzIwMDktMTItMjEgMTg6MTk6MjMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJICBhYzNwYXJzZTogZml4IHNjYW5uaW5nIGZvciBuZXh0IHN5bmN3b3JkCisKKzIwMDktMTItMjEgMTg6MTg6MzkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBhZGp1c3Qgc2VlayBoYW5kbGluZyBhbmQgbmV3c2VnbWVudCBzZW5kaW5nCisJICBQZXJmb3JtIHNhbml0eSBjaGVjayBvbiB0eXBlIG9mIHNlZWssIGFuZCBvbmx5IHBlcmZvcm0gb25lIHRoYXQgaXMKKwkgIGFwcHJvcHJpYXRlbHkgc3VwcG9ydGVkLiAgQWRqdXN0IGRvd25zdHJlYW0gbmV3c2VnbWVudCBldmVudAorCSAgdG8gZmlyc3QgYnVmZmVyIHRpbWVzdGFtcCB0aGF0IGlzIHNlbnQgZG93bnN0cmVhbS4KKworMjAwOS0xMi0yMSAxMTo1OTo0NSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IG1pbm9yIHJlZmFjdG9yIGNsZWFudXAKKwkgIEFsc28gYWRkIHNvbWUgZGVidWcgbG9nZ2luZy4KKworMjAwOS0xMi0xOCAyMTowNToxMSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGxvY2F0ZSBuZXh0IHN5bmMgY29kZSBtb3JlIGVmZmljaWVudGx5CisKKzIwMDktMTItMTggMjE6MDQ6MTIgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBiYXNlcGFyc2UgdGFrZXMgY2FyZSBvZiBoYW5kbGluZyBsZWZ0b3ZlciBwaWVjZXMKKworMjAwOS0xMi0xOCAyMTowMjo0MCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IGltcGxlbWVudCBsZWZ0b3ZlciBkcmFpbmluZyBpbiBwdWxsIG1vZGUKKworMjAwOS0xMi0xNyAxMjo0NTozNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IHNldCBfT0ZGU0VUIGFuZCBfT0ZGU0VUX0VORCBvbiBvdXRnb2luZyBidWZmZXJzCisKKzIwMDktMTItMTcgMTI6NDQ6MjAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL01ha2VmaWxlLmFtOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL3BsdWdpbi5jOgorCSAgYXVkaW9wYXJzZXJzOiBtb3ZlICdmbGFjcGFyc2UnIGludG8gaXQKKworMjAwOS0xMi0xNiAxODozODozMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IHByb3ZpZGUgZGVmYXVsdCBjb252ZXJzaW9uIHVzaW5nIGJwcyBpZiBubyBmcHMgYXZhaWxhYmxlCisJICBBbHNvIHN0b3JlIGVzdGltYXRlZCBkdXJhdGlvbiBhcyBzdWNoLCByYXRoZXIgdGhhbiBwcmV0ZW5kaW5nIG90aGVyd2lzZQorCSAgKGUuZy4gc2V0IGJ5IHN1YmNsYXNzKS4KKworMjAwOS0xMi0xOCAxMzozMDoyOSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IGNoZWNrIGZvciByZW1haW5pbmcgZGF0YSB3aGVuIGRyYWluaW5nIGluIHB1c2ggbW9kZQorCisyMDA5LTEyLTE4IDEzOjMwOjA3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogZml4IHB1bGwgbW9kZSBjYWNoZSBzaXplIGNvbXBhcmlzb24KKworMjAwOS0xMi0xOCAxMzowMToxNyArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IEZpeCB1bml0aWFsaXplZCB2YXJpYWJsZS4KKworMjAwOS0xMi0xNyAxNDo0NjowMSArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDxjaHJpc3RpYW4uc2NoYWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL01ha2VmaWxlLmFtOgorCSAgVXBkYXRlIHNwZWMgZmlsZSBhbmQgZml4IGFjM3BhcnNlciBoZWFkZXIgbGlzdGluZyBpbiBNYWtlZmlsZS5hbQorCisyMDA5LTEyLTExIDEwOjI1OjE2IC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2U6IGZpeCBhIGZvcm1hdCBzdHJpbmcgYXMgcmVwb3J0ZWQgb24gaXJjLgorCisyMDA5LTExLTIzIDE2OjM0OjUwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IGVuc3VyZSBzdWZmaWNpZW50IGRhdGEgYXZhaWxhYmxlIGZvciBwYXJzaW5nCisKKzIwMDktMTAtMjkgMTU6MTk6MDQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJICBhYzNwYXJzZTogZXh0cmFjdCBhbmQgdXNlIHNvbWUgbW9yZSBkZXRhaWxzIGZvciBFbmhhbmNlZCBBYy0zIHN0cmVhbXMKKworMjAwOS0xMC0yOSAxNToxODozNyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5oOgorCSAgYmFzZXBhcnNlOiBjdXN0b20gYnVmZmVyZmxhZyBpbmRpY2F0ZXMgbm90IHRvIGNvdW50IGZyYW1lIGluIHN0YXRzCisKKzIwMDktMTAtMjggMTQ6MDg6NDMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJICBhYzNwYXJzZTogcGVyZm9ybSBhZGRpdGlvbmFsIGZyYW1lIGNoZWNrcyB3aGVuIHJlc3luY2luZworCisyMDA5LTEwLTI4IDE0OjA3OjE3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IGluZm9ybSBiYXNlIHBhcnNlciBvZiBmcmFtZSBkdXJhdGlvbgorCisyMDA5LTEwLTI3IDE2OjE2OjUwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IGltcHJvdmUgc3JjIGNhcHMgc2V0dGluZ3MKKworMjAwOS0xMS0yNyAxNzo1OTowMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL3BsdWdpbi5jOgorCSAgYWMzcGFyc2U6IGluaXRpYWwgdmVyc2lvbgorCSAgTUFSR0lOQUwgcmFuayBmb3Igbm93OyBtaWdodCB0YWtlIHNvbWUgdGltZSBmb3Igc29tZSAodXNlZnVsKQorCSAgZnJhbWVkPXRydWUvZmFsc2UgdG8gYXBwZWFyIGhlcmUgYW5kIHRoZXJlLgorCisyMDA5LTExLTI2IDE4OjM0OjQ1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5oOgorCSAgYW1ycGFyc2U6IHVzZSAoZGVmYXVsdCkgdGltZSBoYW5kbGluZyBvZiBiYXNlcGFyc2VyIGNsYXNzCisKKzIwMDktMTEtMjYgMTg6MTU6MjEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL01ha2VmaWxlLmFtOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5oOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9wbHVnaW4uYzoKKwkgIGF1ZGlvcGFyc2VyczogbW92ZSAnYW1ycGFyc2UnIGludG8gaXQKKworMjAwOS0xMS0yNyAxNzoyNzozMiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IHJlZmVyZW5jZSBHc3RCYXNlUGFyc2Ugbm93IGxpdmVzIGhlcmUKKworMjAwOS0xMS0yOCAxODoxMzozMSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hYWNwYXJzZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb3BhcnNlcnMvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvcGx1Z2luLmM6CisJICBhdWRpb3BhcnNlcnM6IHJlbmFtZSAnYWFjcGFyc2UnIHBsdWdpbiB0byBnZW5lcmljICdhdWRpb3BhcnNlcnMnIHBsdWdpbgorCisyMDA5LTExLTI2IDE3OjA0OjQzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FhY3BhcnNlL01ha2VmaWxlLmFtOgorCSogZ3N0L2FhY3BhcnNlL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYWFjcGFyc2UvcGx1Z2luLmM6CisJICBhYWNwYXJzZTogc2VwYXJhdGUgcGx1Z2luIHJlZ2lzdHJhdGlvbiBhbmQgcmVuYW1lIHBsdWdpbgorCisyMDA5LTExLTI2IDE3OjA0OjM2ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogZW5zdXJlIHN1ZmZpY2llbnQgZGF0YSBhdmFpbGFibGUgYmVmb3JlIGFjY2Vzc2luZworCisyMDA5LTExLTA1IDE0OjMxOjQwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYWFjcGFyc2UvZ3N0YWFjcGFyc2UuaDoKKwkgIGFhY3BhcnNlOiB1c2UgKGRlZmF1bHQpIHRpbWUgaGFuZGxpbmcgb2YgYmFzZXBhcnNlciBjbGFzcworCisyMDA5LTEwLTI5IDE1OjE5OjM1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogZml4dXAgY29tbWVudHMgdG8gQy1zdHlsZQorCisyMDA5LTEwLTI5IDE2OjA1OjAwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiByZXNldCBwYXNzdGhyb3VnaCBtb2RlIHRvIGRlZmF1bHQgKGRpc2FibGVkKSBvbiBhY3RpdmF0aW9uCisKKzIwMDktMTAtMjkgMTU6MTY6NTkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWFjcGFyc2UvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IGVuc3VyZSBidWZmZXIgbWV0YWRhdGEgaXMgd3JpdGFibGUKKworMjAwOS0xMC0yOCAxNDowNjoxMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuaDoKKwkgIGJhc2VwYXJzZTogZml4L2VuaGFuY2UgRElTQ09OVCBtYXJraW5nCisJICBJbiBwYXJ0aWN1bGFyLCBjb25zaWRlciBESVNDT05UID09ICFzeW5jLCBhbmQgYWxsb3cgc3ViY2xhc3MgdG8gcXVlcnkKKwkgIHN5bmMgc3RhdGUsIGFzIGl0IG1heSB3YW50IHRvIHBlcmZvcm0gYWRkaXRpb25hbCBjaGVja3MgZGVwZW5kaW5nCisJICBvbiB3aGV0aGVyIHN5bmMgd2FzIGFjaGlldmVkIGVhcmxpZXIgb24uCisJICBBbHNvIGFycmFuZ2UgZm9yIHN1YmNsYXNzIHRvIHF1ZXJ5IHdoZXRoZXIgbGVmdG92ZXIgZGF0YSBpcyBiZWluZyBkcmFpbmVkLgorCisyMDA5LTExLTIzIDE1OjQ4OjI1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGJhc2VwYXJzZS5jOgorCSogZ3N0L2FhY3BhcnNlL2dzdGJhc2VwYXJzZS5oOgorCSAgYmFzZXBhcnNlOiBhZGQgdGltZXN0YW1wIGhhbmRsaW5nLCBhbmQgZGVmYXVsdCBjb252ZXJzaW9uCisJICBJbiBwYXJ0aWN1bGFyLCAob3B0aW9uYWxseSkgcHJvdmlkZSBiYXNlcGFyc2Ugd2l0aCBhIG5vdGlvbiBvZiBmcmFtZXMgcGVyIHNlY29uZAorCSAgKGFuZCB0aGVyZWZvcmUgYWxzbyBmcmFtZSBkdXJhdGlvbikgYW5kIGhhdmUgaXQgdHJhY2sgZnJhbWUgYW5kIGJ5dGUgY291bnRzLgorCSAgVGhpcyB3YXksIHN1YmNsYXNzIGNhbiBwcm92aWRlIGJhc2VwYXJzZSB3aXRoIGZwcyBhbmQgaGF2ZSBpdCBwcm92aWRlIGRlZmF1bHQKKwkgIGJ1ZmZlciB0aW1lIG1ldGFkYXRhIGFuZCBjb252ZXJzaW9ucywgdGhvdWdoIHN1YmNsYXNzIGNhbiBzdGlsbCBpbnN0YWxsCisJICBjYWxsYmFja3MgdG8gaGFuZGxlIHN1Y2ggaXRzZWxmLgorCisyMDA5LTEwLTI4IDEyOjAyOjAzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBkb2N1bWVudGF0aW9uIGZpeGVzCisKKzIwMDktMTAtMjggMTI6MDA6MDggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWFjcGFyc2UvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IHVzZV9maXhlZF9jYXBzIGZvciBzcmMgcGFkCisJICBBZnRlciBhbGwsIHN0cmVhbSBpcyBhcy1pcywgYW5kIHRoZXJlIGlzIGxpdHRsZSBtb2xkaW5nIHRvIGRvd25zdHJlYW0ncworCSAgdGFzdGUgdGhhdCBjYW4gYmUgZG9uZS4gIElmIHN1YmNsYXNzIGNhbiBhbmQgd2FudHMgdG8gZG8gc28sIGl0IGNhbgorCSAgc3RpbGwgb3ZlcnJpZGUgYXMgc3VjaC4KKworMjAwOS0xMS0yMCAxNzozMjoxMyArMDEwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQGZsdWVuZG8uY29tPgorCisJKiBnc3QvYWFjcGFyc2UvZ3N0YmFzZXBhcnNlLmM6CisJICBhYWNwYXJzZTogRml4IGNvbXBpbGF0aW9uIHdhcm5pbmdzCisKKzIwMDktMTAtMTEgMTE6MjI6MTEgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYWFjcGFyc2UvZ3N0YmFzZXBhcnNlLmM6CisJICBhYWNwYXJzZTogZml4IHdhcm5pbmdzIGluIG1hY29zeCBzbm93IGxlb3BhcmQKKworMjAwOS0wOS0yNSAxNzowMjo1MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2FhY3BhcnNlL2dzdGJhc2VwYXJzZS5jOgorCSogZ3N0L2FhY3BhcnNlL2dzdGJhc2VwYXJzZS5oOgorCSAgYWFjcGFyc2U6IGZvcmVnbyAoYm9ndXMpIHBhcnNpbmcgb2YgYWxyZWFkeSBwYXJzZWQgKHJhdykgaW5wdXQKKworMjAwOS0wOC0wNyAxMzowNzoxNyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogcHJldmVudCBpbmZpbml0ZSBsb29wIHdoZW4gZHJhaW5pbmcKKworMjAwOS0wOC0wNyAxMzowNjoyOCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogZml4IG1pbm9yIG1lbW9yeSBsZWFrCisKKzIwMDktMDctMTQgMTQ6MDg6MDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWFjcGFyc2UvZ3N0YmFzZXBhcnNlLmM6CisJKiBnc3QvYWFjcGFyc2UvZ3N0YmFzZXBhcnNlLmg6CisJICBhYWNwYXJzZTogQWRkIGZ1bmN0aW9uIGZvciB0aGUgYmFzZXBhcnNlIHN1YmNsYXNzIHRvIHB1c2ggYnVmZmVycyBkb3duc3RyZWFtCisJICBBbHNvIGhhbmRsZSB0aGUgY2FzZSBncmFjZWZ1bGx5IHdoZXJlIHRoZSBzdWJjbGFzcyBkZWNpZGVzIHRvIGRyb3AKKwkgIHRoZSBmaXJzdCBidWZmZXJzIGFuZCBoYXMgbm8gY2FwcyBzZXQgeWV0LiBJdCdzIHN0aWxsIHJlcXVpcmVkIHRvCisJICBoYXZlIHZhbGlkIGNhcHMgc2V0IHdoZW4gdGhlIGZpcnN0IGJ1ZmZlciBzaG91bGQgYmUgcGFzc2VkIGRvd25zdHJlYW0uCisKKzIwMDktMDctMTQgMTQ6MDc6NDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWFjcGFyc2UvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IEZpeCBzZWVrIGV2ZW50IGxlYWtpbmcKKworMjAwOS0wNi0xOCAxMjoxMzoyOCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IEFESUY6IGRvIG5vdCBzZW5kIGJvZ3VzIHRpbWVzdGFtcHMsIGxlYXZlIHRvIGRvd25zdHJlYW0gKGRlY29kZXIpCisKKzIwMDktMDYtMDEgMTU6NTM6MjcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWFjcGFyc2UvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBmaXggc2FtcGxlIHJhdGUgZXh0cmFjdGlvbiBmcm9tIGNvZGVjIGRhdGEKKwkgIEluIG9uZSBjYXNlIHdlIGV4dHJhY3RlZCB0aGUgc2FtcGxlIHJhdGUgaW5kZXggZnJvbSB0aGUgY29kZWMgZGF0YQorCSAgYW5kIHNhdmVkIGl0IGFzIHNhbXBsZSByYXRlIHJhdGhlciB0aGFuIGdldHRpbmcgdGhlIHJlYWwgc2FtcGxlCisJICByYXRlIGZyb20gdGhlIHRhYmxlLiBGaXggdGhhdCwgYW5kIGFsc28gbWFrZSBzdXJlIHdlIGRvbid0IGFjY2VzcworCSAgbm9uLWV4aXN0YW50IHRhYmxlIGVudHJpZXMgYnkgYWRkaW5nIGEgc21hbGwgaGVscGVyIGZ1bmN0aW9uIHRoYXQKKwkgIGd1YXJkcyBhZ2FpbnN0IG91dC1vZi1ib3VuZHMgYWNjZXNzIGluIGNhc2Ugb2YgaW52YWxpZCBpbnB1dCBkYXRhLgorCisyMDA5LTA2LTAxIDE0OjAyOjMzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZSwgYW1ycGFyc2U6IHJlbW92ZSBib2d1cyBnc3RfcGFkX2ZpeGF0ZV9jYXBzKCkgY2FsbHMKKworMjAwOS0wNi0wMSAxMzo1NjoxOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogcHJvcGFnYXRlIHJldHVybiB2YWx1ZSBvZiBHc3RCYXNlUGFyc2U6OnNldF9zaW5rX2NhcHMoKQorCSAgZ3N0X2Jhc2VfcGFyc2Vfc2lua19zZXRjYXBzKCkgcHJlc3VtYWJseSBzaG91bGQgZmFpbCBpZiB0aGUgc3ViY2xhc3MKKwkgIHJldHVybnMgRkFMU0UgZnJvbSBpdHMgOjpzZXRfc2lua19jYXBzKCkgZnVuY3Rpb24uCisKKzIwMDktMDYtMDEgMTM6NDc6MDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWFjcGFyc2UvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IGRvbid0IHRyeSB0byBHU1RfTE9HIGFuIGFscmVhZHktZnJlZWQgY2FwcyBzdHJpbmcKKwkgIFRoZSBwcm9wZXIgd2F5IHRvIGxvZyBjYXBzIGlzIHZpYSBHU1RfUFRSX0ZPUk1BVCBhbnl3YXkuCisKKzIwMDktMDYtMDEgMTM6MDU6MzUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWFjcGFyc2UvZ3N0YWFjcGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogc2V0IGNoYW5uZWxzIGFuZCByYXRlIG9uIG91dHB1dCBjYXBzLCBhbmQga2VlcCBjb2RlY19kYXRhCisJICBDcmVhdGUgb3V0cHV0IGNhcHMgZnJvbSBpbnB1dCBjYXBzLCBzbyB3ZSBtYWludGFpbiBhbnkgZmllbGRzIHdlCisJICBtaWdodCBnZXQgb24gdGhlIGlucHV0IGNhcHMsIHN1Y2ggYXMgY29kZWNfZGF0YSBvciByYXRlIGFuZCBjaGFubmVscy4KKwkgIFNldCBjaGFubmVscyBhbmQgcmF0ZSBvbiB0aGUgb3V0cHV0IGNhcHMgaWYgd2UgZG9uJ3QgaGF2ZSBpbnB1dCBjYXBzCisJICBvciB0aGV5IGRvbid0IGNvbnRhaW4gc3VjaCBmaWVsZHMuIFdlIGRvIHRoaXMgcGFydGx5IGJlY2F1c2Ugd2UgY2FuLAorCSAgYnV0IGFsc28gYmVjYXVzZSBzb21lIG11eGVycyBuZWVkIHRoaXMgaW5mb3JtYXRpb24uIFRhZ3JlYWRiaW4gd2lsbAorCSAgYWxzbyBiZSBoYXBweSBhYm91dCB0aGlzLgorCisyMDA5LTA1LTI2IDE5OjQzOjUzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBmaXggZGVidWcgY2F0ZWdvcnkKKworMjAwOS0wNC0yNyAyMjozOToxNSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogZml4IChyZWdyZXNzaW9uIGluKSBuZXdzZWdtZW50IGhhbmRsaW5nCisJICAoYWFjcGFyc2UsIGFtcnBhcnNlLCBmbGFjcGFyc2UpLiAgRml4ZXMgIzU4MDEzMy4KKworMjAwOS0wNC0wNyAwNDo1MzowMiArMDMwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBGaXggc2xpZ2h0bHkgYnJva2VuIGJ1ZmZlci1pbi1zZWdtZW50IGNoZWNrIChhYWNwYXJzZSwgYW1ycGFyc2UsIGZsYWNwYXJzZSkKKworMjAwOS0wNC0wNSAwMzo1MDoxOSArMDMwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBGaXggcHVzaCBtb2RlIHNlZWtpbmcgKGFhY3BhcnNlLCBhbXJwYXJzZSkKKwkgIFNlbmRpbmcgdGhlIGZsdXNoLXN0YXJ0IGV2ZW50IGZvcndhcmQgYmVmb3JlIHRha2luZyB0aGUgc3RyZWFtIGxvY2sgYWN0dWFsbHkKKwkgIHdvcmtzLCBpbiBjb250cmFzdCB0byBkZWFkbG9ja2luZyBpbiBkb3duc3RyZWFtIHByZXJvbGxfd2FpdCAoaHVuayAxKS4KKwkgIEFmdGVyIHRoYXQgd2UgZ2V0IHRoZSBjaGFpbiBmdW5jdGlvbiBiZWluZyBzdHVjayBpbiBhIGJ1c3kgbG9vcC4gVGhpcyBpcyBmaXhlZAorCSAgYnkgdXBkYXRpbmcgdGhlIG1pbmltdW0gZnJhbWUgc2l6ZSBpbnNpZGUgdGhlIHN5bmNocm9uaXphdGlvbiBsb29wIGJlY2F1c2UgdGhlCisJICBzdWJjbGFzcyBhc2tzIGZvciBtb3JlIGRhdGEgaW4gdGhpcyB3YXkgKGh1bmsgMikuCisJICBGaW5hbGx5LCB0aGlzIGxlYWRzIHRvIGEgdmVyeSBwcm9iYWJsZSBjcmFzaCBiZWNhdXNlIHRoZSBzdWJjbGFzcyBjYW4gZmluZCBhCisJICB2YWxpZCBmcmFtZSB3aXRoIGEgc2l6ZSBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnRseSBhdmFpbGFibGUgZGF0YSBpbiB0aGUKKwkgIGFkYXB0ZXIuIFRoaXMgbWFrZXMgdGhlIHN1YnNlcXVlbnQgZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgY2FsbCByZXR1cm4gTlVMTCwKKwkgIHdoaWNoIGlzIG5vdCBleHBlY3RlZCAoaHVuayAzKS4KKworMjAwOS0wMy0zMSAxNjowNzo0NiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogRGVsYXkgbmV3c2VnbWVudCBhcyBsb25nIGFzIHBvc3NpYmxlLgorCSAgSWYgbmV3c2VnbWVudCBpcyBzZW50ICh0b28pIGVhcmx5LCBjYXBzIG1heSBub3QgeWV0IGJlIGZpeGVkL3NldCwKKwkgIGFuZCBkb3duc3RyZWFtIG1heSBub3QgaGF2ZSBiZWVuIGxpbmtlZC4KKworMjAwOS0wMy0xOSAwMToxNzoyNSArMDIwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogRml4IGJ1c3lsb29wIHdoZW4gc2Vla2luZy4gRml4ZXMgIzU3NTM4OAorCSAgVGhlIHByb2JsZW0gaXMgdGhhdCBhZnRlciBhIGRpc2NvbnQsIHNldF9taW5fZnJhbWVfc2l6ZSgxMDI0KSBpcyBjYWxsZWQgd2hlbgorCSAgZGV0ZWN0X3N0cmVhbSByZXR1cm5zIEZBTFNFLiBIb3dldmVyLCBkZXRlY3Rfc3RyZWFtIGNhbGxzIGNoZWNrX2FkdHNfZnJhbWUKKwkgIHdoaWNoIHNldHMgdGhlIGZyYW1lIHNpemUgb24gaXRzIG93biB0byBzb21ldGhpbmcgbGFyZ2VyIHRoYW4gMTAyNC4gVGhpcyBpcyB0aGUKKwkgIHNhbWUgc2l0dWF0aW9uIGFzIGluIHRoZSBiZWdpbm5pbmcsIHNvIHRoZSBiYXNlIGNsYXNzIGVuZHMgdXAgY2FsbGluZworCSAgY2hlY2tfdmFsaWRfZnJhbWUgaW4gYW4gZW5kbGVzcyBsb29wLgorCisyMDA5LTAzLTE5IDAwOjMyOjQwICswMjAwICBSZW7DqSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorCisJKiBnc3QvYWFjcGFyc2UvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBSZWZhY3RvciBjaGVja192YWxpZF9mcmFtZSB0byBleHBvc2UgYnJva2VuIGNvZGUKKwkgIEp1c3QgbW92aW5nIGNvZGUgYXJvdW5kIGFuZCByZW1vdmluZyBhbiB1bmhlbHBmdWwvbWlzbGVhZGluZyBjb21tZW50LgorCisyMDA5LTAyLTI3IDExOjI0OjM3ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogcmV2ZXJ0IGxhc3QgY2hhbmdlIGFuZCBwcm9wZXJseSBmaXgKKwkgIEJhc2VwYXJzZSBpbnRlcm5hbHkgYnJlYWtzIHRoZSBzZW1hbnRpY3Mgb2YgYSBfY2hhaW4gZnVuY3Rpb24gYnkgY2FsbGluZyBpdCB3aXRoCisJICBidWZmZXI9PU5VTEwuIFRoZSByZXNvbiBJIGJlbGl2ZWQgaXQgd2FzIG9rYXkgdG8gcmVtb3ZlIGl0IHdhcyB0aGF0IHRoZXJlIGlzCisJICBhbHNvIGFuIHVuY2hlY2tlZCBhY2Nlc3MgdG8gYnVmZmVyIGxhdGVyIGluIF9jaGFpbi4gQWN0dWFsbHkgdGhhdCBjb2RlIGlzIHdyb25nLAorCSAgYXMgaXQgbW9zdCBwcm9iYWJseSB3YW50cyB0byBzZXQgZGlzY29udCBvbiB0aGUgb3V0Z29pbmcgYnVmZmVyLgorCisyMDA5LTAyLTI2IDExOjAyOjA2ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogcmVtb3ZlIGNoZWNrcyBmb3IgYnVmZmVyPT1OVUxMCisJICBBY2NvcmRpZm4gdG8gZG9jcyBmb3IgR3N0UGFkQ2hhaW5GdW5jdGlvbiBidWZmZXIgY2Fubm90IGJlIE5VTEwuIElmIHdlIHdvdWxkCisJICBsZWF2ZSB0aGUgY2hlY2ssIHdlIHdvdWxkIGFsc28gbmVlZCBtb3JlIHN1Y2ggY2hlY2sgYmVsb3cuCisKKzIwMDktMDItMTEgMDA6MTU6NDMgKzAyMDAgIFJlbsOpIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IEZpeCBsaWNlbnNlIHNwZWNpZmllZCBpbiBwbHVnaW4gZGV0YWlscy4KKworMjAwOS0wMS0zMCAxODoxODoxMCArMDAwMCAgSmFuIFNjaG1pZHQgPGphbi5zY2htaWR0QHN1bi5jb20+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkgIEZpeCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBkZWZhdWx0IHBhcnNlX2ZyYW1lIGZ1bmN0aW9uLgorCSAgRml4IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGRlZmF1bHQgcGFyc2VfZnJhbWUgZnVuY3Rpb24gaW4gYm90aAorCSAgY29waWVzIG9mIEdzdEJhc2VQYXJzZQorCisyMDA5LTAxLTIzIDE2OjAwOjEwICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RhYWNwYXJzZS5jOgorCSAgTG9nIGFhYyBkZXRhaWxzIGZvdW5kIGluIGNvZGVjX2RhdGEuCisKKzIwMDgtMTEtMTMgMTc6MjQ6NTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hYWNwYXJzZS9nc3RhYWNwYXJzZS5jOiBEb24ndCBhdXRvcGx1ZyBhYWNwYXJzZSB1bnRpbCBpdCB3b3Jrcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYWFjcGFyc2UvZ3N0YWFjcGFyc2UuYzogKHBsdWdpbl9pbml0KToKKwkgIERvbid0IGF1dG9wbHVnIGFhY3BhcnNlIHVudGlsIGl0IHdvcmtzLgorCisyMDA4LTExLTEzIDE1OjIwOjE1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHRlc3RzL2NoZWNrLzogQWRkIHVuaXQgdGVzdHMgZm9yIG5ldyBwYXJzZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hYWNwYXJzZS5jOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hbXJwYXJzZS5jOgorCSAgQWRkIHVuaXQgdGVzdHMgZm9yIG5ldyBwYXJzZXJzLgorCisyMDA4LTExLTEzIDE0OjIxOjM5ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC86IEZpeCBiYXNlcGFyc2UgdHlwZSBuYW1lLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkgICogZ3N0L2FtcnBhcnNlL2dzdGJhc2VwYXJzZS5jOgorCSAgRml4IGJhc2VwYXJzZSB0eXBlIG5hbWUuCisKKzIwMDgtMTEtMTMgMTI6NTk6MzQgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgQWRkIHR3byBuZXcgYmFzZXBhcnNlIGJhc2VkIHBhcnNlcnMgKGFhYyBhbmQgYW1yKSBmcm9tIEJ1ZyAjNTE4ODU3LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L2FhY3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYWFjcGFyc2UvZ3N0YWFjcGFyc2UuYzoKKwkgICogZ3N0L2FhY3BhcnNlL2dzdGFhY3BhcnNlLmg6CisJICAqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkgICogZ3N0L2FhY3BhcnNlL2dzdGJhc2VwYXJzZS5oOgorCSAgKiBnc3QvYW1ycGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hbXJwYXJzZS9nc3RhbXJwYXJzZS5jOgorCSAgKiBnc3QvYW1ycGFyc2UvZ3N0YW1ycGFyc2UuaDoKKwkgICogZ3N0L2FtcnBhcnNlL2dzdGJhc2VwYXJzZS5jOgorCSAgKiBnc3QvYW1ycGFyc2UvZ3N0YmFzZXBhcnNlLmg6CisJICBBZGQgdHdvIG5ldyBiYXNlcGFyc2UgYmFzZWQgcGFyc2VycyAoYWFjIGFuZCBhbXIpIGZyb20gQnVnICM1MTg4NTcuCisKKzIwMTEtMDMtMjAgMDE6MDg6MzggKzAxMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQHRhbmRiZXJnLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IE1ha2Ugc3JjX3F1ZXJ5IE1ULXNhZmUKKwkgIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGVsZW1lbnQgbWlnaHQgYmUgZ29pbmcgZG93biB3aGlsZSB0aGUgZXZlbnQgYXJyaXZlcworCisyMDExLTA0LTA4IDE1OjIyOjQ3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogVW5yZWYgZXZlbnQgaWYgdGhlIHBhcmVudCBlbGVtZW50IGRpc2FwcGVhcmVkCisKKzIwMTEtMDQtMDggMTU6MjI6MTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogVW5yZWYgZXZlbnQgaWYgdGhlIHBhcmVudCBlbGVtZW50IGRpc2FwcGVhcmVkCisKKzIwMTEtMDMtMjEgMTY6MDQ6MzQgKzAxMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQHRhbmRiZXJnLmNvbT4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogTWFrZSB1cHN0cmVhbSBldmVudHMgTVQtc2FmZQorCisyMDExLTAzLTIxIDE2OjA0OjM0ICswMTAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBNYWtlIHVwc3RyZWFtIGV2ZW50cyBNVC1zYWZlCisKKzIwMTEtMDQtMDggMTU6MjA6NTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgcnRwOiBVbnJlZiBldmVudHMgaWYgdGhlIHBhcmVudCBlbGVtZW50IGRpc2FwcGVhcmVkCisKKzIwMTEtMDEtMDYgMTg6MjQ6MzYgKzAxMDAgIE9sZSBBbmRyw6kgVmFkbGEgUmF2bsOlcyA8b3Jhdm5hc0BjaXNjby5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICBydHBtYW5hZ2VyOiBmaXggcGFkIGNhbGxiYWNrcyBzbyB0aGV5IGhhbmRsZSB3aGVuIHBhcmVudCBnb2VzIGF3YXkKKwkgIDEpIFdlIG5lZWQgdG8gbG9jayBhbmQgZ2V0IGEgc3Ryb25nIHJlZiB0byB0aGUgcGFyZW50LCBpZiBzdGlsbCB0aGVyZS4KKwkgIDIpIElmIGl0IGhhcyBnb25lIGF3YXksIHdlIG5lZWQgdG8gaGFuZGxlIHRoYXQgZ3JhY2VmdWxseS4KKwkgIFRoaXMgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIHNhZmVseSBtb2RpZnkgYSBydW5uaW5nIHBpcGVsaW5lLiBIYXMgYmVlbgorCSAgb2JzZXJ2ZWQgd2hlbiBhIHN0cmVhbWluZyB0aHJlYWQgaXMgZG9pbmcgYSBidWZmZXJfYWxsb2MoKSB3aGlsZSBhbgorCSAgYXBwbGljYXRpb24gdGhyZWFkIHNlbmRzIGFuIGV2ZW50IG9uIGEgcGFkIGZ1cnRoZXIgZG93bnN0cmVhbSwgYW5kIGZyb20KKwkgIHdpdGhpbiBhIHBhZCBwcm9iZSAoaG9sZGluZyBTVFJFQU1fTE9DSykgY2FycmllcyBvdXQgdGhlIHBpcGVsaW5lIHBsdW1iaW5nCisJICB3aGlsZSB0aGUgc3RyZWFtaW5nIHRocmVhZCBoYXMgaXRzIGJ1ZmZlcl9hbGxvYygpIGluIHByb2dyZXNzLgorCisyMDEwLTExLTI2IDE1OjIwOjA0ICswMTAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IG1ha2UgaXRlcmF0ZV9pbnRlcm5hbF9saW5rcyBNVC1zYWZlCisKKzIwMTEtMDQtMDggMTQ6MzU6MDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBSZXZlcnQgIlB1bHNlc2luazogQWxsb3cgY2h1bmtzIHVwIHRvIGJ1ZnNpemUgaW5zdGVhZCBvZiBzZWdzaXplIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCAxZTJjMTQ2N2FlMDQyYTNjNmJiMWE2YmMwYzA3YWVmZjEzZWM1ZWRiLgorCSAgVGhlIGNvbW1pdCBjYXVzZXMgcHVsc2VzaW5rIHRvIGlnbm9yZSB0aGUgbGF0ZW5jeS10aW1lIGJhc2VhdWRpb3NpbmsgcHJvcGVydHkuCisKKzIwMTEtMDQtMDggMTE6MTM6MDcgKzAyMDAgIEFsZXhleSBGaXNoZXIgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKworCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSAgcnRwc3BlZXhwYXk6IERvIG5vdCB0cmFuc21pdHQgc2FtcGxlcyB3aXRoIEdBUCBmbGFnCisJICBJZiB3ZSBnZXQgR0FQIHNhbXBsZXMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gdHJhbnNtaXR0IGl0LgorCSAgSW4gc29tZSBzaXR1YXRpb25zLCBtaWNyb3Bob25lIGlzIG11dGVkLCB3ZSBjYW4gZHJvcCBuZXQgdHJhZmZpY2sKKwkgIHVzYWdlIHRvIH4xIGtiaXQvcy4gV2l0aG91dCBwYXRjaCBpdCB3aWxsIHN0YXkgfjIwIGtiaXQvcworCisyMDExLTA0LTA4IDExOjExOjU4ICswMjAwICBBbGV4ZXkgRmlzaGVyIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgc3BlZXhlbmM6IFVzZSBzcGVleCBpbnRlcm4gc2lsZW5jZSBkZXRlY3Rpb24KKwkgIFNwZWV4IGhhcyBidWlsZCBpbiBzaWxlbmNlIGRldGVjdGlvbi4gSWYgc3BlZXhfZW5jb2RlX2ludCByZXR1cm5zIDAsCisJICB0aGFuIHRoZXJlIGlzIHNpbGVuY2UgYW5kIHNhbXBsZSBkbyBub3QgbmVlZCB0byBiZSB0cmFuc21pdHRlZC4KKwkgIFRoaXMgd29yayBvbmx5IGlmIHZicj0xIGFuZCBkdHg9MSBvcHRpb25hcyBhcmUgZW5hYmxlZC4KKwkgIFNvIGlmIHdlIGdldCAwLCB3ZSBhZGQgR0FQIGZsYWcgdG8gdGhlIHNhbXBsZS4KKworMjAxMS0wNC0wNyAxOTowNDozMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhYzNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGR2cGF5LmM6CisJICBydHA6IHBvcnQgc29tZSBwYXkvZGVwYXlsb2FkZXJzCisKKzIwMTEtMDQtMDUgMTk6MTU6MTEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICB1ZHBzaW5rOiBoYW5kbGUgc2NhdGhlciBnYXRoZXIgZnJvbSBidWZmZXJzCisJICBJdGVyYXRlIHRoZSBtZW1vcnkgYmxvY2tzIG9uIHRoZSBidWZmZXIgYW5kIHNlbmQgdGhlbSB1c2luZyBzZW5kbXNnLgorCisyMDExLTA0LTA1IDE3OjI2OjQ0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkgIHJ0cGRlYzogcmVzZXQgc3RydWN0dXJlIGJlZm9yZSB1c2UKKworMjAxMS0wNC0wNSAxNzoyMDowOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jCisKKzIwMTEtMDQtMDUgMTc6MTI6MjggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGhhbmRsZSAqIGNvbnRyb2wgY29ycmVjdGx5CisJICBQYXJzZSBzZXNzaW9uIGNvbnRyb2wgYXR0cmlidXRlcyB3aGVuIG5vIG1lZGlhIGNvbnRyb2wgYXR0cmlidXRlIGlzCisJICBwcmVzZW50LiBUaHJlYXQgKiBjb250cm9sIGF0dHJpYnV0ZXMgYXMgYW4gZW1wdHkgc3RyaW5nLCBqdXN0IGxpa2UgdGhlCisJICBzcGVjIHNheXMuCisJICBGaXhlcyAjNjQ2ODAwCisKKzIwMTEtMDQtMDUgMTc6MDY6NDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHJ0c3AvdWRwOiBwb3J0IHRvIDAuMTEKKworMjAxMS0wNC0wNSAxNDoyODo1NCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBBZGQgc3VwcG9ydCBmb3IgQS1MYXcgYW5kIMK1LUxhdworCSAgRml4ZXMgYnVnICM2NDY1NjcuCisKKzIwMTEtMDQtMDUgMDk6NDQ6MDEgKzAyMDAgIEpvbiBOb3JkYnkgPGpvbm9ub3JAZ21haWwuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgIGphY2s6IEZpeCBidWlsZCB3aXRoIGphY2sgMC4xMjAuMQorCSAgOTU0NDYyMjY3NGMwZDBhMzE0N2E5YjUxMTQ1MTU5YjAyZWVjNjhlOSBjaGVja2VkCisJICBmb3IgMC4xMjAuMiBhbmQgbGF0ZXIsIGJ1dCB0aGUgZGVwcmVjYXRpb24gd2FzIGludHJvZHVjZWQgaW4KKwkgIDAuMTIwLjEKKworMjAxMS0wNC0wNSAxMToxMzozNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlzdWJ0aXRsZS5jOgorCSAgYXZpOiBtb3JlIHBvcnRpbmcgdG8gMC4xMQorCisyMDExLTA0LTA1IDEyOjA1OjE5ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJyYWRpby5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnhvdmVybGF5LmM6CisJICBkb2NzOiBmaXggZG9jdWVtbnRhdGlvbiB3YXJuaW5ncyAoYW5kIHJlaW5kZW50KQorCisyMDExLTA0LTA0IDE5OjE3OjQzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpOiBwb3J0IHRvIDAuMTEgQVBJCisKKzIwMTEtMDQtMDQgMTc6MzQ6MTcgKzAyMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRAZ21haWwuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0LmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0Lmg6CisJICB2aWRlb21peGVyOiB1cGRhdGUgb3JjIGRpc3QgZmlsZXMKKworMjAxMS0wNC0wNCAxNTo1NzoxMCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMWNjYmUwOSB0byBjM2NhZmUxCisKKzIwMTEtMDMtMDEgMTQ6MDg6MTIgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IEFsd2F5cyBjYWxsIHBhX3N0cmVhbV9uZXdfd2l0aF9wcm9wbGlzdCgpCisJICBwYV9zdHJlYW1fbmV3X3dpdGhfcHJvcGxpc3QoKSBjYW4gdGFrZSBhIE5VTEwgcHJvcGxpc3QsIHNvIHdlIGRvbid0IG5lZWQKKwkgIHRvIGNvbmNlcm4gb3Vyc2VsdmVzIHdpdGggd2hldGhlciBpdCdzIE5VTEwgb3Igbm90LgorCisyMDExLTA0LTA0IDExOjMzOjEwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcGVyZm9ybSBwb3N0LWZsdXNoIHN0YXRlIHRyaWNrcyBkb3duc3RyZWFtIHRvIHVwc3RyZWFtCisJICAuLi4gc28gZG93bnN0cmVhbSBpcyBzZXQgd2hlbiB1cHN0cmVhbSByZXN1bWVzIGRhdGEgZmxvdy4KKworMjAxMS0wNC0wNCAxMToyNzoyOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGRpc3RyaWJ1dGUgbmV3IGJhc2VfdGltZSB0byBtYW5hZ2VyIGNoaWxkcmVuIGZvbGxvd2luZyBmbHVzaCBzZWVrCisJICAuLi4gYnkgZm9yY2luZyBhIHN0YXRlIGNoYW5nZWQgdG8gUExBWUlORywgd2hpY2ggc2hvdWxkIG90aGVyd2lzZSBiZSBhCisJICBuby1vcCBhcyBlbGVtZW50cyBzaG91bGQgYWxyZWFkeSBiZSBpbiB0aGF0IHN0YXRlLgorCSAgSW4gcGFydGljdWxhciwgaml0dGVyYnVmZmVyIG5lZWRzIG5ldyBiYXNlX3RpbWUgYXMgc29vbiBhcyBwb3NzaWJsZSB0byBwZXJmb3JtCisJICBwcm9wZXIgdGltaW5nIChlLmcuIGVvcyB0aW1lb3V0IGhhbmRsaW5nKSBhbmQgY2FuJ3Qgd2FpdCBmb3IgdGhlIG5ldyBiYXNlX3RpbWUKKwkgIHRoYXQgd2lsbCBiZSBkaXN0cmlidXRlZCB3aGVuIHRoZSB3aG9sZSBwaXBlbGluZSByZXR1cm5zIHRvIFBMQVlJTkcuCisJICBTZWUgYnVnICM2NDYzOTcuCisKKzIwMTEtMDQtMDQgMTE6MzU6NTkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIFJldmVydCAiaml0dGVyYnVmZmVyOiByZXNldCBlbGVtZW50IGJhc2VfdGltZSB1cG9uIGZsdXNoIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCBmODRiOGE2OWNiYTljNTM4ZjU1NDY4NjljYjRlZjQ1NGFkNWVmYjlkLgorCSAgRml4ZXMgYnVnICM2NDYzOTcuCisKKzIwMTEtMDQtMDQgMTA6MzE6NDQgKzAxMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHY6IFNwZWNpZnkgdGhlIG9ubHkgcG9zc2libGUgc3RyZWFtLWZvcm1hdCBmb3IgaDI2NCBpbiB0aGUgcGFkIHRlbXBsYXRlcy4KKworMjAxMS0wNC0wNCAxMDowNzo0MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IENoZWNrIGZvciBpbnZhbGlkIChlbXB0eSkgY2xhc3NpZmljYXRpb24gaW5mbyBlbnRpdHkgc3RyaW5ncworCSAgT3RoZXJ3aXNlIHRoZSBjbGFzc2lmaWNhdGlvbiBzdHJpbmcgY2FuIGJlIGVtcHR5IGFuZCBnc3RfdGFnX2xpc3RfYWRkKCkgd2lsbAorCSAgY29tcGxhaW4gb3IgaGF2ZSBhIFwwIGluIHRoZSBmaXJzdCBmb3VyIGJ5dGVzLCB3aGljaCBpcyB3cm9uZyB0b28uCisKKzIwMTEtMDQtMDQgMTA6MDE6MjYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBZZWFyIDAgaXMgbm90IGEgdmFsaWQgeWVhciBmb3IgR0RhdGUgYW5kIHRoZSBwcm9sZXB0aWMgZ3JlZ29yaWFuIGNhbGVuZGFyCisKKzIwMTEtMDQtMDEgMTM6MTg6NTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBBZGQgc3VwcG9ydCBmb3Igd3JpdGluZyBNRVRBREFUQV9CTE9DS19QSUNUVVJFIGJsb2NrcyBmb3IgR1NUX1RBR19JTUFHRSBhbmQgR1NUX1RBR19QUkVWSUVXX0lNQUdFCisKKzIwMTEtMDQtMDEgMTE6MzM6NTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlclsyXTogVXNlIG9yY19tZW1zZXQoKSBpbnN0ZWFkIG9mIG1lbXNldCgpCisKKzIwMTEtMDEtMTkgMTg6MDY6NDUgLTA3MDAgIExhbmUgQnJvb2tzIDxkaXJqdWRAZ21haWwuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmg6CisJICB2aWRlb21peGVyOiBBZGQgdHJhbnNwYXJlbnQgYmFja2dyb3VuZCBvcHRpb24gZm9yIGFscGhhIGNoYW5uZWwgZm9ybWF0cworCisyMDExLTAxLTE5IDEyOjA3OjE3IC0wNzAwICBMYW5lIEJyb29rcyA8ZGlyanVkQGdtYWlsLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kLmg6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy5vcmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuaDoKKwkgIHZpZGVvbWl4ZXIyOiBBZGQgdHJhbnNwYXJlbnQgYmFja2dyb3VuZCBvcHRpb24gZm9yIGFscGhhIGNoYW5uZWwgZm9ybWF0cworCSAgVGhpcyBvcHRpb24gYWxsb3dzIHRoZSB2aWRlb21peGVyMiBlbGVtZW50IHRvIG91dHB1dCBhIHZhbGlkIGFscGhhCisJICBjaGFubmVsIHdoZW4gdGhlIGlucHV0cyBjb250YWluIGEgdmFsaWQgYWxwaGEgY2hhbm5lbC4gVGhpcyBhbGxvd3MKKwkgIG1peGluZyB0byBvY2N1ciBpbiBtdWx0aXBsZSBzdGFnZXMgc2VyaWFsbHkuCisJICBUaGUgZm9sbG93aW5nIHBpcGVsaW5lIHNob3dzIGFuIGV4YW1wbGUgb2Ygc3VjaCBhIHBpcGVsaW5lOgorCSAgZ3N0LWxhdW5jaCB2aWRlb3Rlc3RzcmMgYmFja2dyb3VuZC1jb2xvcj0weDAwMDAwMCBwYXR0ZXJuPWJhbGwgISB2aWRlby94LXJhdy15dXYsZm9ybWF0PVwoZm91cmNjXClBWVVWICEgdmlkZW9taXhlcjIgYmFja2dyb3VuZD10cmFuc3BhcmVudCBuYW1lPW1peDEgISB2aWRlb21peGVyMiBuYW1lPW1peDIgISBmZm1wZWdjb2xvcnNwYWNlICEgYXV0b3ZpZGVvc2luayAgdmlkZW90ZXN0c3JjICEgdmlkZW8veC1yYXcteXV2LGZvcm1hdD1cKGZvdXJjY1wpQVlVViAhIG1peDIuCisJICBUaGUgZmlyc3QgdmlkZW90ZXN0c3JjIGluIHRoaXMgcGlwZWxpbmUgY3JlYXRlcyBhIG1vdmluZyBiYWxsIG9uIGEKKwkgIHRyYW5zcGFyZW50IGJhY2tncm91bmQuIEl0IGlzIHRoZW4gcGFzc2VkIHRvIHRoZSBmaXJzdCB2aWRlb21peGVyMi4KKwkgIFByZXZpb3VzbHksIHRoaXMgdmlkZW9taXhlcjIgd291bGQgaGF2ZSBmb3JjZWQgdGhlIGFscGhhIGNoYW5uZWwgdG8KKwkgIDEuMCBhbmQgZ2l2ZW4gYSBiYWNrZ3JvdW5kIG9mIGNoZWNrZXIsIGJsYWNrLCBvciB3aGl0ZSB0byB0aGUKKwkgIHN0cmVhbS4gV2l0aCB0aGlzIHBhdGNoLCBob3dldmVyLCB5b3UgY2FuIG5vdyBzcGVjaWZ5IHRoZSBiYWNrZ3JvdW5kCisJICBhcyB0cmFuc3BhcmVudCwgYW5kIHRoZSBhbHBoYSBjaGFubmVsIG9mIHRoZSBpbnB1dCB3aWxsIGJlCisJICBwcmVzZXJ2ZWQuIFRoaXMgYWxsb3dzIGZvciBmdXJ0aGVyIG1peGluZyBkb3duc3RyZWFtLCBhcyBpcyBzaG93biBpbgorCSAgdGhlIGFib3ZlIHBpcGVsaW5lIHdoZXJlIHRoZSBhIHNlY29uZCB2aWRlb21peGVyMiBpcyB1c2VkIHRvIG1peCBpbiBhCisJICBiYWNrZ3JvdW5kIG9mIGFuIHNtcHRlIHZpZGVvdGVzdHNyYy4gU28gdGhlIHJlc3VsdCBpcyBhIGJhbGwgaG92ZXJpbmcKKwkgIG92ZXIgdGhlIHNtcHRlIHRlc3Qgc291cmNlLiBUaGlzIGNvdWxkLCBvZiBjb3Vyc2UsIGhhdmUgYmVlbgorCSAgYWNjb21wbGlzaGVkIHdpdGggYSBzaW5nbGUgbWl4ZXIgZWxlbWVudCwgYnV0IHN0YWdlZCBtaXhpbmcgaXMgdXNlZnVsCisJICB3aGVuIGl0IGlzIG5vdCBjb252ZW5pZW50IHRvIG1peCBhbGwgdmlkZW8gYXQgb25jZSAoZS5nLiBhIHBpcGVsaW5lCisJICB3aGVyZSBhIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgYmluIGV4aXN0IGFuZCBhcmUgbWl4ZWQgYXQgdGhlIGZpbmFsCisJICBvdXRwdXQsIGJ1dCB0aGUgZm9yZWdyb3VuZCBiaW4gbmVlZHMgYW4gaW50ZXJuYWwgbWl4ZXIgdG8gY3JlYXRlCisJICB0cmFuc2l0aW9ucyBiZXR3ZWVuIGNsaXBzKS4KKwkgIEZpeGVzIGJ1ZyAjNjM5OTk0LgorCisyMDExLTAzLTMxIDEzOjI1OjAwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBhbHNvIHVuY29yayBkdXJpbmcgRU9TIHdhaXRpbmcgKGFuZCBhZnRlciBFT1MgaXMgcmVuZGVyZWQpCisJICBQdWxzZXNpbmsgd2FzIHJlY2VudGx5IGNoYW5nZWQgdG8gZGVmZXIgdW5jb3JraW5nIHVudGlsIHRoZXJlIGlzIGRhdGEKKwkgIHRvIHdyaXRlLiBUaGlzIGNvbmRpdGlvbiB3aWxsIGhvd2V2ZXIgbmV2ZXIgb2NjdXIgd2hlbiBFT1MgaW4gYmVpbmcKKwkgIHJlbmRlcmVkIChzaW5jZSB0aGF0IG1hcmtzIHRoZSBlbmQgb2YgZGF0YSkuIENoYW5naW5nIHRvIFBBVVNFRCBzdGF0ZQorCSAgd2hpbGUgRU9TIGlzIGJlaW5nIHdhaXRlZCBvbiByZXN1bHRzIGluIGEgaGFuZzogcGF1c2luZyBjb3JrcyB0aGUKKwkgIHN0cmVhbSwgd2hpY2ggd2lsbCBuZXZlciBiZSB1bmRvbmUgc2luY2UgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIHdoZW4KKwkgIGdvaW5nIGJhY2sgdG8gUExBWUlORy4gSWYgcHVsc2VzaW5rIGlzIHRoZSBjbG9jayBwcm92aWRlciwgZGVhZGxvY2sKKwkgIGVuc3VlcyBzaW5jZSB0aW1lIGRvZXNuJ3QgY29udGludWUgaW4gY29ya2VkIHN0YXRlIGFuZCB0aGUgY2xvY2sgaWQKKwkgIGZvciBFT1Mgd2FpdCBuZXZlciBmaXJlcy4KKwkgIEZpeGVzICM2NDU5NjEuCisKKzIwMTEtMDMtMjkgMTY6MzM6NDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW4uYzoKKwkgIHJ0cGJpbjogRG9uJ3QgdHJ5IHRvIHJlcXVlc3QgdGhlIHNhbWUgcmVxdWVzdCBwYWQgdHdpY2UKKworMjAxMS0wMy0yOCAyMzo0Njo0NyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuaDoKKwkgIGZsYWNkZWM6IGZpeCBpc3N1ZXMgd2l0aCBsYXJnZSBtZXRhZGF0YSBibG9ja3Mgd2hlbiBzdHJlYW1pbmcgdW5mcmFtZWQgZmxhYworCSAgUGFyc2UgbWV0YWRhdGEgYmxvY2tzIHdoZW4gaGFuZGxpbmcgdW5wYXJzZWQgZmxhYyBpbiBwdXNoIG1vZGUuIFRoaXMKKwkgIHdvcmtzIGFyb3VuZCBhIGJ1bmNoIG9mIGlzc3VlcyB3aXRoIHRoZSBmbGFjIGRlY29kZXIgd2hlbiBoYW5kbGluZworCSAgbWV0YWRhdGEgYmxvY2tzIHRoYXQgYXJlIGxhcmdlciB0aGFuIHRoZSBtYXguIGZsYWMgZnJhbWVzaXplLCB3aGljaAorCSAgY292ZXJhcnQgYmxvY2tzIG9mdGVuIGFyZS4gV2UgbmVlZCB0byBoYXZlIGFsbCB0aGUgZGF0YSBmb3IgdGhlc2UKKwkgIGJsb2NrcyBhdmFpbGFibGUgd2hlbiB3ZSBwYXNzIGRhdGEgdG8gbGliZmxhYy4KKwkgIGh0dHA6Ly9nc3RyZWFtZXItZGV2ZWwuOTY2MTI1Lm40Lm5hYmJsZS5jb20vRmxhYy1maWxlcy10aGF0LXdpbGwtcGxheWJhY2stYnV0LW5vdC1zdHJlYW0tdGQzMzM4MTk4Lmh0bWwjYTMzOTUyNzYKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD01NjY3NjkKKworMjAxMS0wMy0yOCAyMTowNTozMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSogZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICBwbHVnaW5zOiBwb3J0IHRvIG5ldyBtZW1vcnkgQVBJCisKKzIwMTEtMDMtMjggMjA6NTA6NTkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEtZmRvCisKKzIwMTEtMDMtMjcgMjE6Mzk6NTAgKzAyMDAgIEphbiBVcmJhxYRza2kgPHd1bGN6ZXJAd3VsY3plci5vcmc+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkgIGZsdmRlbXV4OiBEbyBub3QgYnVpbGQgYW4gaW5kZXggaWYgdXBzdHJlYW0gaXMgbm90IHNlZWthYmxlCisJICBBbiBpbmRleCBpcyBub3QgdXNlZnVsIGlmIHVwc3RyZWFtIGNhbm5vdCBoYW5kbGUgc2Vla3MgYW5kIGJ1aWxkaW5nIGl0CisJICBmb3IgaW5maW5pdGUgZmlsZXMsIGZvciBpbnN0YW5jZSBGTFYgc3RyZWFtcywgcmVzdWx0cyBpbiBhIG1lbW9yeSBsZWFrLgorCisyMDExLTAzLTI3IDAxOjE5OjU4ICswMzAwICBBbGV4ZXkgQ2hlcm5vdiA8NGVybm92QGdtYWlsLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogc3lzL3Y0bDIvTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwycmFkaW8uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJyYWRpby5oOgorCSAgdjRsMjogbmV3IHY0bDJyYWRpbyBlbGVtZW50IHRvIGNvbnRyb2wgYW5hbG9nIHJhZGlvIGRldmljZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDAxMTgKKworMjAxMS0wMy0yNSAyMjoyMjo0MyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSAxOTNiNzE3IHRvIDFjY2JlMDkKKworMjAxMS0wMy0yNSAxNDo1NjowNiArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gYjc3ZTJiZiB0byAxOTNiNzE3CisKKzIwMTEtMDMtMjUgMTI6NTM6NDMgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2NhaXJvL01ha2VmaWxlLmFtOgorCSAgY2Fpcm86IGZpeCB0aGUgbmFtZSBvZiB0aGUgKi1tYXJzaGFsbC5saXN0IGZpbGUgdG8gdW5icmVhayBtYWtlIGRpc3RjaGVjaworCisyMDExLTAzLTI1IDA5OjMxOjAzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGQ4ODE0YjYgdG8gYjc3ZTJiZgorCisyMDExLTAzLTI1IDA5OjA2OjE2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDZhYWEyODYgdG8gZDg4MTRiNgorCisyMDExLTAzLTI1IDAwOjEwOjU2ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJICBzcGVjdHJ1bTogcmVmYWN0b3IgcHJvY2Vzc2luZyBsb29wIGZvciBibG9jayBiYXNlZCBvcGVyYXRpb24KKwkgIFByZXZpb3VzbHkgdGhlIGNoYWluIGZ1bmN0aW9uIHdhcyB3b3JraW5nIHNhbXBsZSBmcmFtZSBiYXNlZC4gSW4gZWFjaCBjeWNsZSBpdAorCSAgd2FzIGNoZWNraW5nIGlmIGl0IGlzIHRpbWUgdG8gcnVuIGEgZmZ0IG9yIGlmIGl0IGlzIHRpbWUgdG8gc2VuZCBhIG1lc3NhZ2UuCisJICBOb3cgd2UgY2hhbmdlZCB0aGUgZGF0YSB0cmFuc2Zvcm0gZnVuY3Rpb25zIHRvIHdvcmsgb24gYSBibG9jayBvZiBkYXRhIGFuZAorCSAgY2FsY3VsYXRlIHRoZSBtYXggbGVuZ3RoIHVudGlsIGVpdGhlciB7ZW5kLW9mLWRhdGEsIGRvLWZmdCwgZG8tbXNnfS4gVGhpcyBhbGxvd3MKKwkgIHVzIGFsc28gdG8gYXZvaWQgdGhlIGR1cGxpY2F0ZWQgY29kZSBmb3IgdGhlIHNpbmdsZSBhbmQgbXVsdGktY2hhbm5lbCBjYXNlIChhcworCSAgdGhlIHRyYW5zZm9ybWVycyBoYXZlIHRoZSBzYW1lIHNpZ25hdHVyZSBub3cpLgorCisyMDExLTAzLTI0IDIzOjQ3OjMzICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGphY2s6IHVuYnJlYWsgdGhlIGJ1aWxkIGZvciBqYWNrMiB1c2VycworCSAgSmFjazIgKHZlcnNpb25zIDEuWC5YKSBkb2VzIG9ubHkgaGF2ZSB0aGF0IEFQSSBpbiBzdm4uIExpbW1pdCB0aGUgdXNlIG9mIHRoZSBuZXcKKwkgIEFQSSBmb3IgamFjazEgdmVyc2lvbnMuCisKKzIwMTEtMDMtMjQgMTg6NDk6MTkgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDZhZWM2YjkgdG8gNmFhYTI4NgorCisyMDExLTAzLTI0IDE0OjE0OjA5ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IGZpeCB0aGUgZXJyb3IgYWNjdW11bGF0aW9uIGFuZCBmcmFtZXNfdG9kbyBoYW5kbGluZworCSAgRXZlbiB0aG91Z2ggd2Ugd3JhcCBhcm91bmQgdGhlIGFjY3VtdWxhdGVkIHNlY29uZCwgd2Ugc3RpbGwgbmVlZCB0byBhZGQgdGhlCisJICBlcnJvciBpbiB0aGUgc2FtZSBjeWNsZS4gSW5jcmVhc2UgdGhlIHRvZG8gaW4gdGhlIHNhbWUgY29uZGl0aW9uYWwgYXMgYWZ0ZXJ3YXJkcworCSAgdGhlIGFjY3VtdWxhdGVkIGVycm9yIHdpbGwgYmUgYmVsb3cgb25lIHNlY29uZC4KKworMjAxMS0wMy0yNCAxMzo1MzoxMiArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgIHNwZWN0cnVtOiBmaXggYnJva2VuIGNvZGUgcmVzdWx0aW5nIGZvciBhIHdyb25nIHNwbGl0dXAgb2YgY2hhbmdlcworCisyMDExLTAzLTIyIDE2OjI5OjUzICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJICBzcGVjdHJ1bTogc2ltcGxpZnkgdGhlIGhhdmVfaW50ZXJ2YWwgY2FsY3VsYXRpb24KKwkgIE1vdmUgc29tZSBvZiB0aGUgY29uZGl0aW9ucyB0byB0aGUgcGxhY2VzIHdoZXJlIHRoZSBkZXBlbmRlbnQgdmFyaWFibGVzIGNoYW5nZS4KKworMjAxMS0wMy0yMiAxNjoyNjo0NSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgIHNwZWN0cnVtOiB1c2UgbG9jYWwgdmFyIGZvciBpbnB1dF9kYXRhIGZ1bmN0aW9uCisJICBBdm9pZCBkZXJlZmVyZW5jaW5nIHRoZSBpbnB1dF9kYXRhIGZyb20gdGhlIGluc3RhbmNlIGZyb20gd2l0aGluIGFuIGlubmVyIGxvb3AuCisKKzIwMTEtMDMtMjMgMTY6MzQ6MTYgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5oOgorCSAgc3BlZXhkZWM6IEdldCBhbmQgdXNlIHN0cmVhbWhlYWRlciBmcm9tIHRoZSBjYXBzIGlmIHBvc3NpYmxlCisJICBUaGlzIGFsbG93cyBwbGF5YmFjayBvZiBzdHJlYW1zIHdoZXJlIHRoZSBzdHJlYW1oZWFkZXIgYnVmZmVycworCSAgd2VyZSBkcm9wcGVkIGZyb20gdGhlIHN0cmVhbSBmb3Igc29tZSByZWFzb24uCisKKzIwMTEtMDMtMjIgMTk6MzY6MzEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiB1c2UgcnVubmluZyB0aW1lIGZvciBzeW5jaHJvbml6YXRpb24KKwkgIEZpeGVzICM0MzI2MTIuCisKKzIwMTEtMDMtMjIgMTk6MzY6MjEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogdXNlIHJ1bm5pbmcgdGltZSBmb3Igc3luY2hyb25pemF0aW9uCisJICBGaXhlcyAjNDMyNjEyLgorCisyMDExLTAzLTIyIDE5OjM1OjU4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogdXNlIHJ1bm5pbmcgdGltZSBmb3Igc3luY2hyb25pemF0aW9uCisJICBTZWUgYnVnICM0MzI2MTIuCisKKzIwMTEtMDMtMjIgMTI6NTM6MjIgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNAZGViZXRoZW5jb3VydC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZS5hYzogcmVkdW5kYW50IHVzZXMgb2YgQUNfTVNHX1JFU1VMVCgpCisJICBjbGVhbmVkIHRoZSByZWR1bmRhbnQgdXNlcyBvZiBBQ19NU0dfUkVTVUxUKCkgaW4gY29uZmlndXJlLmFjCisKKzIwMTEtMDMtMTggMTk6MzQ6NTcgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNAZGViZXRoZW5jb3VydC5jb20+CisKKwkqIGF1dG9nZW4uc2g6CisJICBhdXRvZ2VuOiB3aW5nbyBzaWduZWQgY29tbWVudAorCisyMDExLTAzLTE2IDEwOjQzOjQ3ICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkgIGphY2thdWRpb3Npbms6IEZpeCB0eXBvIGZyb20gOTU0NDYyMjY3NGMwZDBhMzE0N2E5YjUxMTQ1MTU5YjAyZWVjNjhlOQorCisyMDExLTAzLTE2IDA5OjM4OjQzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYTogTWFyayB0YWcgbWFwcGluZyB0YWJsZXMgYXMgc3RhdGljIGNvbnN0CisKKzIwMTEtMDMtMTYgMDk6Mzc6NTggKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogVXNlIEFSVElTVCBpbnN0ZWFkIG9mIEFVVEhPUiBmb3IgR1NUX1RBR19BUlRJU1QKKworMjAxMS0wMy0xNiAwOTozNTo1MCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgbWF0cm9za2FkZW11eDogVXNlIEFSVElTVCBNYXRyb3NrYSB0YWcgaW5zdGVhZCBvZiBBVVRIT1IgZm9yIEdTVF9UQUdfQVJUSVNUCisJICBBVVRIT1Igb25seSBleGlzdGVkIGluIGFuIG9sZCB2ZXJzaW9uIG9mIHRoZSBzcGVjIGFuZCBBUlRJU1QgaXMKKwkgIHRoZSBuZXcgcmVwbGFjZW1lbnQgZm9yIHRoaXMuIFdlIGFyZSBzdGlsbCByZWFkaW5nIGJvdGggdG8gc3RpbGwKKwkgIGJlIGNvbXBhdGlibGUgd2l0aCBvbGQgZmlsZXMuCisJICBGaXhlcyBidWcgIzY0NDg3NS4KKworMjAxMS0wMy0xNSAyMDoxOTo0OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvZmlsdGVyLmM6CisJICB0ZXN0czogZW5hYmxlIG1vcmUgZm9ybWF0cyBpbiB2aWRlb2ZpbHRlciB1bml0IHRlc3QsIGNoZWNrIG1vcmUgcmVzb2x1dGlvbnMKKworMjAxMS0wMy0xNCAxOToxNDowNyAtMDQwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSAgdmlkZW9mbGlwOiBGaXggYnVmZmVyIG92ZXJmbG93IGJ1ZyBmb3Igb2RkIHJlc29sdXRpb25zIGFuZCBZNDIyIGNvbG9yc3BhY2VzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ0NzczCisKKzIwMTEtMDMtMTUgMTk6MzY6MDEgKzAyMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkgIHNwZWV4ZGVjOiBzaWxlbmNlIHdhcm5pbmcgbWVzc2FnZSB3aGVuIGFwcHJvcHJpYXRlCisJICBJZiB3ZSBkaWQgbm90IGtub3cgaG93IG1hbnkgZnJhbWVzIHRvIGV4cGVjdCwgdGhlbiB3ZSBnZXQgYW4gdW5leHBlY3RlZAorCSAgZW5kIG9mIHN0cmVhbSB3aGVuIHRyeWluZyB0byBkZWNvZGUgbW9yZSBmcmFtZXMgdGhhdCBhcmUgdGhlcmUsIGlmIHRoZXJlCisJICBhcmUgbGVmdG92ZXIgYml0cyB0byBwYWQgdG8gdGhlIG5leHQgYnl0ZQorCisyMDExLTAzLTE0IDE5OjE0OjA3IC0wNDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICB2aWRlb2ZsaXA6IEFkZCBzdXBwb3J0IGZvciBZVVkyLCBVVllWIGFuZCBZVllVIGNvbG9yc3BhY2VzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ0NzczCisKKzIwMTEtMDMtMTUgMDk6NDM6MzUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2ZpbHRlci5jOgorCSAgdGVzdHM6IGluIHZpZGVvZmlsdGVyIHVuaXQgdGVzdCBhbHNvIGNoZWNrIHdpdGggJ29kZCcgd2lkdGhzIGFuZCBoZWlnaHRzCisJICBBbmQgb25seSB1c2Ugb25lIHRlc3Qgc3VpdGUuCisKKzIwMTEtMDMtMTQgMTk6Mjg6MDcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkgIHNwZWV4ZGVjOiBBbHdheXMgcHJvY2VzcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBwZXIgcGFja2V0IGFzIHNwZWNpZmllZCBpbiB0aGUgaGVhZGVyCisJICBMb29raW5nIGF0IHRoZSByZW1haW5pbmcgYml0cyBpbiB0aGUgYml0c3RyZWFtIGFmdGVyIGRlY29kaW5nIGEKKwkgIHNpbmdsZSBmcmFtZSBjYW4ndCBiZSB1c2VkIGFzIGxvb3AgY29uZGl0aW9uLiBUaGUgcmVtYWluaW5nCisJICBiaXRzIG1pZ2h0IG5vdCBnaXZlIGEgY29tcGxldGUgZnJhbWUgYW5kIHRoZSBzcGVleCBkZWNvZGVyIHdpbGwKKwkgIHRoZW4gb3V0cHV0IG5vdGhpbmcgYnV0IGFjY2VzcyB1bmluaXRpYWxpemVkIG1lbW9yeSwgd2hpY2ggbGVhZHMKKwkgIHRvIHZhbGdyaW5kIHdhcm5pbmdzLgorCSAgRml4ZXMgYnVnICM2NDQ2NjkuCisKKzIwMTEtMDMtMTQgMTU6NDY6NTAgKzAxMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8YW1vcmFsZXNAZmx1bW90aW9uLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHJldHVybiBUUlVFIGZyb20gc2luayBwYWQgZXZlbnQgZnVuY3Rpb24gZm9yIHRhZyBldmVudHMsIHdoaWNoIGFyZSBoYW5kbGVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ0NzMwCisKKzIwMTEtMDMtMTIgMDA6NDQ6MzEgKzA1MzAgIFBoaWxpcCBKw6RnZW5zdGVkdCA8cGhpbGlwakBvcGVyYS5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogQmV0dGVyIGZpeCBmb3IgZGVhZGxvY2sgb24gZmFpbGVkIGNvbm5lY3QKKwkgIFRoaXMgcmV2ZXJ0cyB0aGUgcHJldmlvdXMgZml4IHRoYXQgd291bGQgY2F1c2UgYSBkb3VibGUtdW5sb2NrIHdoZW4gdGhlCisJICBzdHJlYW0gY29ubmVjdCBmYWlsZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ0NTEwCisKKzIwMTEtMDMtMTEgMjM6MDY6MzEgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IEZpeCBkZWFkbG9jayBpZiBjb25uZWN0aW5nIHRvIFBBIGZhaWxzCisJICBDb21taXQgZGQ0ZWMyMmUgaW50cm9kdWNlZCBhIGRlYWRsb2NrIGluIHRoZSBmYWlsdXJlIHBhdGggd2hpbGUgdHJ5aW5nCisJICB0byBjb25uZWN0IHRvIFB1bHNlQXVkaW8uIFRoaXMgbWFrZXMgc3VyZSB3ZSBkcm9wIHRoZSBsb2NrIG9uIHRoZQorCSAgcmVzb3VyY2UgbXV0ZXggdG8gYXZvaWQgdGhpcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDQ1MTAKKworMjAxMS0wMy0xMSAxNjo1OToxMCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiBvcmRlciBzdGF0ZS10ZXN0IGJsYWNrbGlzdCBhbmQgYWRkIGphY2sgZWxlbWVudHMKKwkgIEphY2sgYXVkaW8gc3JjL3NpbmsgZWxlbWVudHMgcmVjZW50bHkgZ290IG1vdmVkIGZyb20gYmFkIGFuZCBzaG91bGQgYmUgZXhjbHVkZWQKKwkgIGZyb20gdGhlIHRlc3QgKGxpa2UgdGhlIG90aGVyIGRldmljZSBzcGVjaWZpYyBzb3VyY2UgYW5kIHNpbmtzKS4KKwkgIEZpeGVzICM2NDQyODgKKworMjAxMS0wMy0xMSAxMzo0NzoyNiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJICBkdmRlbXV4OiBDaGFpbiB1cCB0byB0aGUgcGFyZW50IGNsYXNzJyA6OnNlbmRfZXZlbnQgZm9yIG5vbi1zZWVrIGV2ZW50cworCisyMDExLTAzLTExIDEzOjQ2OjA1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkgIGR2ZGVtdXg6IEZpeCByZWZjb3VudCBpc3N1ZXMgd2l0aCB0aGUgc2VlayBldmVudAorCSAgRml4ZXMgYnVnICM2NDI5NjMuCisKKzIwMTEtMDMtMTEgMDk6NTQ6MDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBkb2NzOiBmaXggcHVsc2VzaW5rIGd0ay1kb2MgbWFya3VwCisKKzIwMTEtMDMtMTEgMTA6Mjk6MDggKzAxMDAgIFBoaWxpcHBlIE5vcm1hbmQgPHBub3JtYW5kQGlnYWxpYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSAgamFjazogZml4IGJ1aWxkIGFnYWluc3QgamFjayAwLjEyMC4yCisJICBqYWNrX3BvcnRfZ2V0X3RvdGFsX2xhdGVuY3koKSBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mCisJICBqYWNrX3BvcnRfZ2V0X2xhdGVuY3lfcmFuZ2UoKS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDQ0NzcKKworMjAxMS0wMy0xMCAxNDoyOToyNSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgIHNwZWN0cnVtOiBtb3JlIGNvbW1lbnRzIGFuZCB0dW5lIGFuZCBsb2dnaW5nCisKKzIwMTEtMDMtMTAgMTQ6MTU6NDIgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBzcGVjdHJ1bTogYXZvaWQgdW5uZWNjZXNhcnkgZXh0cmEgZmZ0IHJ1bnMKKwkgIEJlZm9yZSBpdCB3YXMgcG9zc2libGUgdGhhdCB3ZSBydW4gYW4gZXh0cmEgZmZ0IHdoZW4gdGhlIHRpbWUgZm9yIHNlbmRpbmcgYSBuZXcKKwkgIG1lc3NhZ2UgaXMgZHVlLiBPbmx5IGRvIHRoaXMgaWYgd2UgaGF2ZSBub3QgcnVuIHRoZSBmZnQgZm9yIHRoZSBpbnRlcnZhbCBhdCBhbGwuCisKKzIwMTEtMDMtMTAgMTQ6MTI6MDEgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBzcGVjdHJ1bTogb25seSBzY2FsZSB0aGUgdmVjdG9ycyB0aGF0IHdlIGFyZSBwcm9jZXNzaW5nCisJICBQaGFzZSBpcyBub3QgcHJvZHVjZWQgYnkgZGVmYXVsdCwgc28gbGV0cyBub3Qgc2NhbGUgaXQgdW5jb25kaXRpb25hbGx5IHRvIHNhdmUgYQorCSAgZmV3IGN5Y2xlcy4KKworMjAxMS0wMy0xMCAxNDoxMDoyNSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5oOgorCSAgc3BlY3RydW06IHB1dCBudW1iZXIgb2YgY2hhbm5lbHMgdG8gaW5zdGFuY2UgdmFyaWFibGUKKwkgIFdoZW4gZnJlZWluZyBkYXRhIHRoZSBmb3JtYXQgbWlnaHQgaGF2ZSBjaGFuZ2VkLiBUaHVzIHdlIG5lZWQgdG8gcmVtZW1iZXIgZm9yCisJICB3aGljaCBmb3JtYXQgd2UgYWxsb2NhdGVkIG1lbW9yeS4KKworMjAxMS0wMy0xMCAxMDoyNzoxNCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgIHNwZWN0cnVtOiB1cGRhdGUgZG9jIHJldmlldyBzdGFtcAorCisyMDExLTAzLTEwIDEwOjIyOjI5ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJICBzcGVjdHJ1bTogdXNlIGZ1bmN0aW9uIHBvaW50ZXJzIGZvciBkYXRhIHJlYWRlcnMKKwkgIERvbid0IGNoZWNrIHRoZSBmb3JtYXQgZm9yIGVhY2ggc2FtcGxlIGZyYW1lIHRvIHJlYWQuIFdlIGNhbiBtYWtlIHRoYXQgZGVjaXNzaW9uCisJICBpbiBfc2V0dXAgYWxyZWFkeS4gVGhpcyBpcyBzdGlsbCBub3QgaWRlYWwgYXMgd2UgY2FsbCB0aGUgZnVuY3Rpb24gcGVyIGZyYW1lLgorCSAgSWRlYWxseSB3ZSBkZXRlcm1pbmUgaG93IG1hbnkgc2FtcGxlcyB3ZSBjYW4gY29weSBhbmQgaGF2ZSBhIGxvb3AgaW4gdGhlIGlucHV0CisJICByZWFkZXIuIEFzIGFuIGFsdGVybmF0aXZlIHdlIG1pZ2h0IGFsc28gY29uc2lkZXIgdG8gdXNlIHRoZSBmZnQgdmFyaWFudHMgZm9yIHRoZQorCSAgdmFyaW91cyBmb3JtYXRzIGFuZCBub3QgY29udmVydCB0byBmbG9hdCBmb3IgYWxsIGNhc2VzIC0gd2Ugd291bGQgc3RpbGwgbmVlZCB0bworCSAgbWl4IG9yIGRlaW50ZXJsZWF2ZSB0aG91Z2guCisKKzIwMTEtMDMtMDkgMTc6MDc6NDcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBpbXByb3ZlIHJlY292ZXJ5IGZyb20gZmFpbGVkIHNlZWsKKwkgIEluIGNhc2Ugc2VydmVyLXNpZGUgZmFpbHMgdG8gcGVyZm9ybSBzZWVrLCBpLmUuIFBMQVkgYXQgbm9uLXplcm8gcmVxdWVzdGVkCisJICBwb3NpdGlvbiwgcmVjb3Zlcnkgc28gZmFyIHdvdWxkIGFycmFuZ2UgZm9yIHN0cmVhbWluZyB0byBjb250aW51ZSwgYWxiZWl0CisJICBoYXZpbmcgbG9zdCBwb3NpdGlvbiB0cmFja2luZyBpbiB0aGUgcHJvY2Vzcy4gIFNvLCBxdWVyeSBwb3NpdGlvbiBwcmlvcgorCSAgdG8gc2VlayBhbmQgdXNlIHVwb24gZmFpbGVkIHNlZWsuCisKKzIwMTEtMDMtMDkgMTY6NTE6MDAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogaGFuZGxlIHBvc2l0aW9uIHF1ZXJ5CisKKzIwMTEtMDMtMDkgMTY6NTc6MjggKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uaDoKKwkgIHNwZWN0cnVtOiAgbXVsdGktY2hhbm5lbCBzdXBwb3J0CisJICBBZGQgYSBib29sZWFuIG11bHRpLWNoYW5uZWwgcHJvcGVydHkgd2l0aCBhIGRlZmF1bHQgb2YgRkFMU0UuIFdoZW4gc2V0IHRvIFRSVUUKKwkgIHRoZSBlbGVtZW50IHdvbid0IG1peCBhbGwgaW5wdXQgY2hhbm5lbHMgdG8gbW9ubywgYnV0IGluc3RlYWQgcnVuIGEgRkZUIG9uIGVhY2gKKwkgIGNoYW5uZWwuIEluIHRoYXQgY2FzZSB0aGUgcmVzdWx0IG1lc3NhZ2Ugd291bGQgY29udGFpbiBhIDIgZGltZW5zaW9uYWwgYXJyYXkKKwkgIG9mIGNoYW5uZWwgeCBkYXRhIGZvciBtYWduaXR1ZGUgYW5kIHBoYXNlLgorCSAgQVBJOiBHc3RTcGVjdHJ1bTptdWx0aS1jaGFubmVsCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTkzNDgyCisKKzIwMTEtMDMtMDkgMTY6NTU6NTYgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBzcGVjdHJ1bTogbW9yZSB4cmVmcyBpbiB0aGUgZG9jcworCisyMDExLTAzLTA5IDEyOjQxOjE1ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IGZhY3RvciBvdXQgdGhlIGNvZGUgdGhhdCBhY2N1bXVsYXRlZCBzYW1wbGVzIGludG8gdGhlIHJpbmctYnVmZmVyCisJICBVc2UgYSBzZXBhcmF0ZSBmdW5jdGlvbiB0byByZWFkIGEgc2FtcGxlIGZyYW1lIGludG8gYSByaW5nYnVmZmVyIHNsb3QuIEluIHRoZQorCSAgZnV0dXJlIHdlIGNhbiB1c2UgZm9ybWF0LXNwZWNpZmljIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYXZvaWQgdGhlIHJlb2NjdXJpbmcKKwkgIGZvcm1hdCBjaGVja3MuCisKKzIwMTEtMDMtMDkgMTI6Mzg6NTIgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBzcGVjdHJ1bTogcHVsbCBmb3JtYXQgdG8gdGVtcCB2YXIgdG8gaW1wcm92ZSByZWFkYWJpbGl0eSBvZiBsaW5lcyB1c2luZyBpdAorCisyMDExLTAzLTA5IDEyOjIwOjExICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IGNvZGUgY2xlYW51cCBmb3IgY29weWluZyBkYXRhIHRvIHJpbmctYnVmZmVyCisJICBSZW5hbWUgZnAgdG8gaXNfZmxvYXQgYW5kIHJlc3RydWN0dXJlIGlmLWVsc2UgcGFydCBmb3IgaGFuZGxpbmcgdGhlIGRpZmZlcmVudCBmb3JtYXRzLgorCisyMDExLTAzLTA5IDExOjQwOjQ4ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJICBzcGVjdHJ1bTogYWRkIGEgR3N0U3BlY3J0dW1DaGFubmVsIGNvbnRleHQgc3RydWN0dXJlCisJICBXZSBub3cga2VlcCB0aGUgZmZ0IGRhdGEgdGhhdCBpcyByZWxhdGVkIHRvIG9uZSBjaGFubmVsIGluIGEgc2VwYXJhdGUgc3RydWN0dXJlCisJICB0byBwcmVwYXJlIGZvciBtdWx0aWNoYW5uZWwgc3VwcG9ydC4gV2UgYWxzbyByZWZhY3RvciB0aGUgY29kZSB0byBvcGVyYXRlIG1vcmUKKwkgIG9mdGVuIG9uIHRoZSBjaGFubmVsIGNvbnRleHQuCisKKzIwMTEtMDMtMDkgMTE6MTg6MTkgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBzcGVjdHJ1bTogY2FsbCB0aGUgaW5zdGFuY2UgdmFyIHNwZWN0cnVtIGluc3RlYWQgb2YgZmlsdGVyCisKKzIwMTEtMDMtMDkgMTE6MTQ6MzcgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBzcGVjdHJ1bTogZG9uJ3QgdmFsdWUgd2UgYWxyZWFkeSB0b29rIGZyb20gdGhlIGd2YWx1ZQorCisyMDExLTAzLTA4IDE3OjI2OjE3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBjb25maWd1cmUuYWMKKworMjAxMS0wMy0wOCAxNzowMjozMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlYnVndXRpbHMvZWZlbmNlLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmM6CisJICBtZXRhOiB1cGRhdGUgZm9yIG5ldyBBUEkKKworMjAxMS0wMy0wOCAxNjoyODoyNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGFkLWhvYyByZWxlYXNlIGJyYW5jaCAnMC4xMC4yOCcKKworPT09IHJlbGVhc2UgMC4xMC4yOCA9PT0KKworMjAxMS0wMy0wOCAxNTo0Nzo1MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTAuMjgKKwkgIEFkLWhvYyByZWxlYXNlIHRvIGZpeCBidWlsZCBpc3N1ZSB3aXRoIG5ld2VyIGtlcm5lbHMuCisKKzIwMTEtMDMtMDMgMDA6MTY6NDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmg6CisJICB2NGwyOiByZW1vdmUgdW5uZWNlc3NhcnkgbGludXgvdmlkZW9kZXYuaCBpbmNsdWRlCisJICBDYXVzZXMgY29tcGlsYXRpb24gaXNzdWVzIHdpdGggbmV3ZXIga2VybmVsIGhlYWRlcnMgd2hlcmUgdGhlIG9sZAorCSAgdjRsIGludGVyZmFjZSBoYXMgYmVlbiByZW1vdmVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0MzcxNgorCisyMDExLTAzLTA4IDEwOjE0OjIwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICB0ZXN0cy9leGFtcGxlcy9jYWlyby9NYWtlZmlsZS5hbQorCisyMDExLTAzLTA3IDE2OjU2OjQzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGFsc28gZXN0aW1hdGUgZW9zIGlmIHZlcnkgbmVhciBlb3MKKworMjAxMS0wMy0wNyAxNjo1NjoxOCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBhdm9pZCB0cnlpbmcgdG8gYnVmZmVyIG1vcmUgdGhhbiBpcyBhdmFpbGFibGUuCisJICBUaGF0IGlzLCBpbiBjYXNlIG9mIHNob3J0IChvciBuZWFyIGVvcyBvZikgc3RyZWFtLCBkZWFkbG9jayAodW50aWwgdGltZW91dCkKKwkgIHdvdWxkIG9jY3VyIHRyeWluZyB0byBidWZmZXIgbW9yZSB0aGFuIGlzIHlldCBmb3J0aGNvbWluZy4KKworMjAxMS0wMy0wNyAxMTowMTowNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiByZXNldCBlbGVtZW50IGJhc2VfdGltZSB1cG9uIGZsdXNoCisJICAuLi4gdG8gYXJyYW5nZSBmb3IgcHJvcGVybHkgc2NoZWR1bGVkIHRpbWVvdXQgKGZvbGxvd2luZyBzZWVrKS4KKworMjAxMS0wMy0wNyAxMDo1NDoyMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL2NhaXJvL2NhaXJvX292ZXJsYXkuYzoKKwkgIGNhaXJvb3ZlcmxheTogQWRkIGEgYnVzIGhhbmRsZXIgdG8gdGhlIGV4YW1wbGUgdG8gaGFuZGxlIEVPUy9FUlJPUi9XQVJOSU5HCisJICBBbHNvIGNsZWFuIHVwIHRoZSBwaXBlbGluZSBwcm9wZXJseS4KKworMjAxMS0wMy0wNyAxMDo0NzoyMyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL01ha2VmaWxlLmFtOgorCSAgZXhhbXBsZXM6IEFsd2F5cyBkaXN0IHRoZSBjYWlybyBleGFtcGxlCisKKzIwMTEtMDMtMDcgMTA6NDY6MTIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9jYWlyby9NYWtlZmlsZS5hbToKKwkgIGNhaXJvb3ZlcmxheTogVXNlIExEQUREIGluc3RlYWQgb2YgTERGTEFHUyBmb3IgbGlicyBhbmQgYWRkICQoR1NUX0xJQlMpCisKKzIwMTEtMDMtMDUgMjM6MjI6NTggKzAwMDAgIEpvbiBOb3JkYnkgPGpvbm9ub3JAZ21haWwuY29tPgorCisJKiB0ZXN0cy9leGFtcGxlcy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL2NhaXJvL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvY2Fpcm8vY2Fpcm9fb3ZlcmxheS5jOgorCSAgY2Fpcm9vdmVybGF5OiBSZW1vdmUgdW5uZWNlc3NhcnkgZ3RrL2d0ay14MTEgdXNlIGluIGV4YW1wbGUuCisJICBUaGlzIHJlbW92ZXMgY29kZSwgYW5kIGFsbG93cyB0aGUgZXhhbXBsZSB0byBiZSB1c2VkIG9uIGFueSBwbGF0Zm9ybS4KKwkgIEZpeGVzIGJ1ZyAjNjQzOTgxLgorCisyMDExLTAzLTA0IDE4OjM3OjM4IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogVXNlICNpZmRlZnMgZm9yIFY0TDJfUElYX0ZNVF9QSlBHCisJICBJdCdzIG9ubHkgcmVjZW50bHkgYWRkZWQgdG8ga2VybmVsIGhlYWRlcnMuCisKKzIwMTEtMDItMjMgMTY6NTA6NDMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5oOgorCSAgd2F2cGFyc2U6IHR1bmUgb3V0cHV0IG1heCBidWZmZXIgc2l6ZSB0byBtYXRlcmlhbAorCSAgLi4uIHRvIGF2b2lkIGVuZGluZyB1cCB3aXRoIHRvbnMgb2Ygc2hvcnQgdGltZSBidWZmZXJzIGZvciBlLmcuIGhpZ2ggc2FtcGxlCisJICByYXRlIGF1ZGlvLgorCisyMDExLTAzLTA0IDE3OjA0OjM3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9jYWlyby9NYWtlZmlsZS5hbToKKwkgIGV4YW1wbGVzOiBkb24ndCB1c2UgaGFyZGNvZGVjIDAuMTAKKworMjAxMS0wMy0wNCAxNjozMDozNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDExLTAzLTA0IDE1OjUwOjAxICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogYWRkIGEgZG9jIGV4YW1wbGUgZm9yIHNldHRpbmcgc3RyZWFtLXByb3BlcnRpZXMKKworMjAxMS0wMy0wNCAxNTo0MjoxOSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGZpeCB0aGUgeG1sIGluIHRoZSBkb2NzCisKKzIwMTEtMDMtMDMgMDA6MTY6NDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmg6CisJICB2NGwyOiByZW1vdmUgdW5uZWNlc3NhcnkgbGludXgvdmlkZW9kZXYuaCBpbmNsdWRlCisJICBDYXVzZXMgY29tcGlsYXRpb24gaXNzdWVzIHdpdGggbmV3ZXIga2VybmVsIGhlYWRlcnMgd2hlcmUgdGhlIG9sZAorCSAgdjRsIGludGVyZmFjZSBoYXMgYmVlbiByZW1vdmVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0MzcxNgorCisyMDExLTAzLTAyIDIzOjIxOjE1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogdGVzdHMvZXhhbXBsZXMvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9leGFtcGxlcy9jYWlyby9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL2NhaXJvL2NhaXJvX292ZXJsYXkuYzoKKwkgIGNhaXJvb3ZlcmxheTogVGhlIGV4YW1wbGUgYWx3YXlzIHJlcXVpcmVzIGd0ay14MTEKKwkgIENoZWNrIGZvciBndGsteDExIGFuZCBvbmx5IGJ1aWxkIHRoZSBleGFtcGxlIGlmIGl0J3MgYXZhaWxhYmxlLgorCisyMDExLTAzLTAyIDIzOjE0OjM2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdGNhaXJvb3ZlcmxheS5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvb3ZlcmxheS5oOgorCSAgY2Fpcm9vdmVybGF5OiBTb21lIG1pbm9yIGNsZWFudXAKKworMjAxMS0wMy0wMiAyMzowOToyMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5zaWduYWxzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkgIGRvY3M6IFVwZGF0ZSBpbnNwZWN0ZWQgcGx1Z2luIGRhdGEKKworMjAxMS0wMS0yOCAwMjoxNDowNCArMDIwMCAgSm9uIE5vcmRieSA8am9ub25vckBnbWFpbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBleHQvY2Fpcm8vLmdpdGlnbm9yZToKKwkqIGV4dC9jYWlyby9NYWtlZmlsZS5hbToKKwkqIGV4dC9jYWlyby9nc3RjYWlyby1tYXJzaGFsLmxpc3Q6CisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm8uYzoKKwkqIGV4dC9jYWlyby9nc3RjYWlyb292ZXJsYXkuYzoKKwkqIGV4dC9jYWlyby9nc3RjYWlyb292ZXJsYXkuaDoKKwkqIHRlc3RzL2V4YW1wbGVzL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvY2Fpcm8vLmdpdGlnbm9yZToKKwkqIHRlc3RzL2V4YW1wbGVzL2NhaXJvL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvY2Fpcm8vY2Fpcm9fb3ZlcmxheS5jOgorCSAgY2Fpcm9vdmVybGF5OiBBZGQgZ2VuZXJpYyBDYWlybyBvdmVybGF5IHZpZGVvIGVsZW1lbnQuCisJICBBbGxvd3MgYXBwbGljYXRpb25zIHRvIGNvbm5lY3QgdG8gdGhlICJkcmF3IiBzaWduYWwgb2YKKwkgIHRoZSBlbGVtZW50IGFuZCBkbyB0aGVpciBjdXN0b20gZHJhd2luZyB0aGVyZS4KKwkgIEluY2x1ZGVzIGFuIGV4YW1wbGUgYXBwbGljYXRpb24gZGVtb25zdHJhdGluZyB1c2FnZS4KKwkgIEZpeGVzOiBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTk1NTIwCisKKzIwMTEtMDMtMDIgMTM6MDA6MzEgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L21vbm9zY29wZS9tb25vc2NvcGUuYzoKKwkgIG1vbm9zY29wZTogZG9uJ3QgbGVhayB0aGUgbW9ub3Njb3BlX3N0YXRlIGRhdGEKKwkgIFRoZSBtb25vc2NvcGVfY2xvc2UoKSBpbXBsZW1lbnRhdGlvbiB3YXMgZW1wdHkuCisKKzIwMTEtMDMtMDIgMTI6NTk6MzUgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L21vbm9zY29wZS9tb25vc2NvcGUuYzoKKwkgIG1vbm9zY29wZTogd2UgaGF2ZSA2NCBjb2xvcnMsIGRvbid0IGFjY2VzcyBjb2xvcnNbNjRdCisJICBGaXhlcyByZW1haW5pbmcgaW52YWxpZCByZWFkLgorCisyMDExLTAzLTAyIDEwOjI1OjI5ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogYXJyYW5nZSBmb3Igbm9uLWZhdGFsIGVycm9yIHdoZW4gcGFyc2luZyBub24tdml0YWwgcGFydHMKKworMjAxMS0wMy0wMiAxMDo1NjozMyArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvbW9ub3Njb3BlL2NvbnZvbHZlLmM6CisJICBtb25vc2NvcGU6IHN0YWNrIG5lZWRzIHRvIGJlIHNpemUrMSBhcyB3ZSBwdXQgYSBlbmQtbWFya2VyIGludG8gaXQKKwkgIFZhbGdyaW5kIGlzIHN0aWxsIGNvbXBsYWluaW5nIGFib3V0IG9uZSBiYWQgcmVhZCwgYnV0IHRoaXMgdGFrZXMgY2FyZSBvZiB0aGUKKwkgIGNyYXNoIG1lbnRpb25lZCBpbiB0aGUgY29tbWVudCBhbmQgaW4gYnVnICM1NjQxMjIuCisKKzIwMTEtMDMtMDEgMjI6NDA6MTkgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci12NGwyLUgyNjNwLWFsc2FzcmMtQU1SLnNoOgorCSAgZXhhbXBsZTogZml4IHRoZSB2YXJpYWJsZSBuYW1lIGZvciB0aGUgaXAtYWRkcmVzcworCSAgRml4IHRoZSBuYW1lIGluIHRoZSBsYXVuY2ggcGlwZWxpbmUgYW5kIHVzZSBhIHZhbHVlIG9mICJsb2NhbGhvc3QiIGJ5IGRlZmF1bHQuCisKKzIwMTEtMDItMjggMTk6MTY6MDAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmUuYWM6IGN5Z3dpbi9taW5ndzsgZW5hYmxlIHBsdWdpbiBsaW5raW5nIHRvIHN0YXRpYyBsaWIKKwkgIFVzZWZ1bCBmb3IgRGlyZWN0WCBwbHVnaW4ocykuCisJICBGaXhlcyAjNjQyNTA3LgorCisyMDExLTAyLTI4IDE5OjEzOjQxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlLmFjOiBleHBvcnQgcGx1Z2luIGRlc2NyaXB0aW9uIG1vcmUgcGxhdGZvcm0gaW5kZXBlbmRlbnQKKwkgIEZpeGVzICM2NDI1MDQuCisKKzIwMTEtMDItMjggMTg6MzI6NTQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMWRlN2Y2YSB0byA2YWVjNmI5CisKKzIwMTEtMDItMjggMTM6Mjk6NDcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0wMi0yOCAxMzoyODoyOSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogdXNlIE5ldEFkZHJlc3MgbWV0YWRhdGEKKworMjAxMS0wMi0yOCAxMzoxNDozNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcC5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcDogaW1wbGVtZW50IE5ldEFkZHJlc3Mgd2l0aCBtZXRhZGF0YQorCisyMDExLTAyLTI4IDEwOjE2OjUyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMjogcmVnaXN0ZXIgbWV0YWRhdGEKKworMjAxMS0wMi0yNyAxOTo0MzoxMyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlYnVndXRpbHMvZWZlbmNlLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzoKKwkqIHN5cy94aW1hZ2UveGltYWdldXRpbC5oOgorCSAgbWV0YTogZml4IGZvciBuZXcgQVBJCisKKzIwMTEtMDItMjUgMTY6Mjk6MzggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL2VmZW5jZS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmM6CisJKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuaDoKKwkgIG1ldGFkYXRhOiB1c2UgbWV0YWRhdGEgZm9yIHByaXZhdGUgYnVmZmVyIGRhdGEKKwkgIFVzZSBidWZmZXIgbWV0YWRhdGEgdG8gc3RvcmUgZWxlbWVudCBwcml2YXRlIGRhdGEuCisKKzIwMTEtMDItMjQgMTM6NTE6MzIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmg6CisJKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzoKKwkqIHN5cy94aW1hZ2UveGltYWdldXRpbC5oOgorCSAgbWluaW9iamVjdDogcG9ydCB0byAwLjExCisJICBVc2UgYnVmZmVyIHByaXZhdGUgZGF0YSBpbnN0ZWFkIG9mIHN1YmNsYXNzaW5nLgorCisyMDExLTAyLTI0IDEzOjUwOjQ4ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9wdWxzZS9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgIGJ1aWxkOiBkb24ndCBoYXJkY29kZSB2ZXJzaW9uIG51bWJlcgorCisyMDExLTAyLTI0IDEzOjAzOjQ0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSAgaWQzOiB1c2UgYm94ZWQgdHlwZSBpbnN0ZWFkIG9mIG1pbmlvYmplY3QKKworMjAxMS0wMi0yNCAxMzowMDo0OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlYnVndXRpbHMvZWZlbmNlLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHAuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICBtaW5pb2JqZWN0OiB1c2UgYnVmZmVyIHByaXZhdGUgZmllbGQgZm9yIGV4dHJhIGRhdGEKKwkgIFVzZSB0aGUgb3duZXIgcHJpdmF0ZSBmaWVsZCB0byBzdG9yZSBleHRyYSBidWZmZXIgZGF0YSBpbnN0ZWFkIG9mIHVzaW5nCisJICBzdWJjbGFzc2luZy4KKworMjAxMS0wMi0yNCAxMjoyMzo0NCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogYWRkIGR1cmF0aW9uIHdoZW4gZXh0aW1hdGluZyBRb1MgdGltZQorCSAgV2hlbiB3ZSBuZWVkIHRvIGRlY2lkZSBvbiB0aGUgbmV4dCBRb1MgdGltZSwgdGFrZSBpbnRvIGFjY291bnQgdGhlIGR1cmF0aW9uIG9mCisJICB0aGUgYnVmZmVycy4KKworMjAxMS0wMi0yOCAxMTo1ODowNSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgY29uZmlndXJlLmFjCisKKzIwMTEtMDItMjMgMTc6NDE6MjIgKzAxMDAgIFBoaWxpcCBKw6RnZW5zdGVkdCA8cGhpbGlwakBvcGVyYS5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogcmVsZWFzZSBwYV9zaGFyZWRfcmVzb3VyY2VfbXV0ZXggYmVmb3JlIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQKKwkgIE5vdCBkb2luZyBzbyBjYW4gcmVzdWx0IGluIGEgZGVhZGxvY2sgd2hlbiB0d28gdGhyZWFkcyBlbnRlcgorCSAgZ3N0X3B1bHNlcmluZ2J1ZmZlcl9vcGVuX2RldmljZSBhdCB0aGUgc2FtZSB0aW1lLCBhcworCSAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCByZWxlYXNlcyB0aGUgbWFpbmxvb3AgbG9jayB3aGlsZSB3YWl0aW5nLAorCSAgYWxsb3dpbmcgYW5vdGhlciB0aHJlYWQgdG8gdGFrZSBpdCwgcmVzdWx0aW5nIGluIGEgZGVhZGxvY2sgYXMgdHdvCisJICB0aHJlYWRzIHdhaXRzIGZvciB0aGUgbG9jayB0aGUgb3RoZXIgaXMgaG9sZGluZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDMwODcKKworMjAxMS0wMi0yMyAxNzoxODoxOSArMDEwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBzL3Jlc3NvdXJjZS9yZXNvdXJjZS8KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDMwODcKKworMjAxMS0wMi0yNSAyMDoxMjozNSAtMDgwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJlbW92ZSBhY2NpZGVudGFsIGRlYnVnIG1lc3NhZ2UKKwkgIGluIHByZXZpb3VzIGNvbW1pdAorCisyMDExLTAyLTI1IDE5OjM1OjUxIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWRkIHN1cHBvcnQgZm9yIDJWdXkgYW5kIHIyMTAKKworMjAxMS0wMi0yNCAxNDowODoyNSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlbWV0aG9kLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaDoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2xpbmVhcmJsZW5kLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3NjYWxlcmJvYi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS92ZmlyLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlYmZmLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZldGZmLmM6CisJICBkZWludGVybGFjZTogQWRkIHN1cHBvcnQgZm9yIE5WMjEgY29sb3JzcGFjZQorCisyMDExLTAyLTI0IDE0OjAwOjM3ICswMTAwICBDYXJzdGVuIEtyb2xsIDxjYXJAeGltaWRpLmNvbT4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyYmxlbmQuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvc2NhbGVyYm9iLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3ZmaXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmUuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmViZmYuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmV0ZmYuYzoKKwkgIGRlaW50ZXJsYWNlOiBBZGQgc3VwcG9ydCBmb3IgTlYxMiBjb2xvcnNwYWNlCisJICBGaXhlcyBidWcgIzY0Mjk2MS4KKworMjAxMS0wMi0yNCAxMzo1NjowNCArMDEwMCAgQ2Fyc3RlbiBLcm9sbCA8Y2FyQHhpbWlkaS5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJICBkdmRlbXV4OiBGaXJzdCB0cnkgaWYgdXBzdHJlYW0gaGFuZGxlcyBUSU1FIHNlZWtzIGJlZm9yZSBoYW5kbGluZyB0aGVtIGhlcmUKKwkgIEZpeGVzIGJ1ZyAjNjQyOTYzLgorCisyMDEwLTExLTA4IDE0OjI1OjU5ICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmg6CisJICBkZWludGVybGFjZTogU2ltcGxpZnkgc2V0Y2FwcworCSAgVGhlIGN1cnJlbnQgY29kZSBuZXZlciB1c2VzIHVwc3RyZWFtIG5lZ290aWF0aW9uIHNvIHRoZSBjb2RlIGNhbiBiZQorCSAgc2lnbmlmaWNhbnRseSBzaW1wbGlmaWVkLgorCisyMDExLTAxLTI0IDEyOjQ4OjE4ICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5LmM6CisJICBkZWludGVybGFjZTogUG9ydCBncmVlZHlsIHRvIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kCisJICBUaGUgbWFpbiBnb2FsIG9mIHRoaXMgY2hhbmdlIGlzIHRvIHJldXNlIHRoZSBjb21wbGV4IGJ1dCBub3cgbmVhdGx5CisJICB3cml0dGVuIHNjYW5saW5lIHBvaW50ZXIgY2FsY3VsYXRpb24gY29kZSBmcm9tIHRoZSBzaW1wbGUgbWV0aG9kcy4KKworMjAxMS0wMi0yMiAxNToyMDoxMSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzoKKwkgIFJldmVydCAiaWQzZGVtdXg6IGVuc3VyZSBhIHRhZ2xpc3QgYmVmb3JlIGFkZGluZyB0aGUgY29udGFpbmVyIHRhZyIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgYTg2YmFiNjY4OTNiYjFhMzMyM2E3NTY0MTA1NzNjMTE3YjgyMTllZi4gVGhlIGlzc3VlIGlzCisJICBmaXhlZCB3aXRoIGNvbW1pdCBmZjVlNWE4ZjBkYWExZmRmODk3OTJkMDcyNmVhMDYzYmJkOTlkYjE4IGluc3RlYWQuCisKKzIwMTEtMDItMjIgMTU6MTk6MDAgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzoKKwkgIGlkM2RlbXV4OiByZXR1cm4gSUQzVEFHU19CUk9LRU5fVEFHIGZvciB1bnN1cHBvcnRlZCB2ZXJzaW9ucworCSAgVGhpcyBwcmV2ZW50cyB1cyBmb3IgdHJ5aW5nIHRvIHdvcmsgd2l0aCBhIE5VTEwgdGFnbGlzdC4KKworMjAxMS0wMi0yMiAxNDoxNToyNyArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCB1bml0aWFsaXplZCB2YXJpYWJsZS4KKworMjAxMS0wMi0yMiAxNDowMToyNyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBlbnN1cmUgc2FuZSBwYXJhbWV0ZXJzIHdoZW4gcGFyc2luZyBzdXBlcmluZGV4CisKKzIwMTEtMDItMjIgMTQ6MDA6MTEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogY2hlY2sgZm9yIE5VTEwgYXVkaW8gc3RyZWFtIGZvcm1hdCBoZWFkZXIgd2hlbiBwYXJzaW5nIHN0cmVhbQorCisyMDExLTAyLTIyIDE0OjUyOjE4ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItdjRsMi1IMjYzcC1hbHNhc3JjLUFNUi5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItdjRsMi1IMjY0LWFsc2FzcmMtUENNQS5zaDoKKwkgIHJ0cC1leGFtcGxlczogbW92ZSBjYXBzZmlsdGVyIGJlaGluZCBjb252ZXJ0ZXJzCisJICBXZSBuZWVkIHRvIGhhdmUgdGhlIGNhcHNmaWx0ZXIgYmVoaW4gdGhlIGNvbnZlcnRlcnMgdG8gbWFrZSB0aGUgY29udmVydGVycworCSAgY29udmVydCBmcm9tIHRoZSBmb3JtYXRzIHY0bDJzcmMgY2FuIGRvIHRvIHdoYXQgd2UgcmVxdWVzdCB3aXRoIHRoZQorCSAgY2Fwc2ZpbHRlci4KKworMjAxMS0wMi0yMiAxNDo1MDo1OSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjQtUENNQS5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtUENNQS5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci12NGwyLUgyNjNwLWFsc2FzcmMtQU1SLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci12NGwyLUgyNjQtYWxzYXNyYy1QQ01BLnNoOgorCSAgcnRwLWV4YW1wbGVzOiBmaXggYXNjaWktYXJ0CisJICBTb21lIGJveGVzIHdoZXJlIG1pc2FsaWduZWQgZHVlIHRvIGxvbmcgImF1ZGlvdGV0c3NyYyIgbmFtZS4gVHJpbSB0cmFpbGluZworCSAgd2hpdGVzcGFjZS4KKworMjAxMS0wMi0yMiAxMzoyOToyNiArMDEwMCAgQmxhaXNlIEdhc3NlbmQgPGJsYWlzZSBhdCB3aWxsb3dnYXJhZ2UgZG90IGNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IGhhbmRsZSBOVUxMIGRlbXV4IGVsZW1lbnRzCisJICBXaGVuIHVzaW5nIGdzdHJ0cGJpbiB3aXRoIGlnbm9yZS1wdD10cnVlLCB0aGUgZnJlZV9zdHJlYW0gZnVuY3Rpb24gdHJpZXMgdG8KKwkgIGNhbGwgZ3N0X2VsZW1lbnRfc2V0X2xvY2tlZF9zdGF0ZSBhbmQgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIG9uIGEgc3RyZWFtLT5kZW11eAorCSAgd2hpY2ggaXMgTlVMTC4KKwkgIGZpeGVzICM2NDI0MTIKKworMjAxMS0wMS0yNCAxMjoxODozOSArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5jOgorCSAgZGVpbnRlcmxhY2U6IHNtYWxsIGNsZWFuLXVwcworCSAgSW1wcm92ZSBkZWJ1ZyBvdXRwdXQgYnkgcHJpbnRpbmcgdGhlIGJ1ZmZlciBwb2ludGVyIHdoZW4KKwkgIHBvcHBpbmcgYSBidWZmZXIgYW5kIHNpbXBsaWZ5IGNvZGUgdG8gdXNlIHNjYW5saW5lcy5ib3R0b21fZmllbGQKKwkgIGFzIGFwcHJvcHJpYXRlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0MjY5MQorCisyMDExLTAxLTI0IDEyOjE4OjM5ICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IGZpeCBhc3NpZ25lZCBtZXRob2RfaWQgd2hlbiB1c2luZyBmYWxsYmFjaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0MjY5MQorCisyMDExLTAyLTIxIDE3OjE3OjMyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogZml4IHNldHRpbmcgdGhlIFNERVMgcHJvcGVydHkKKwkgIE9ubHkgdGhlIHNkZXMgdmVyaWFibGUgaXMgcHJvdGVjdGVkIHdpdGggdGhlIG9iamVjdCBsb2NrLgorCSAgVXNlIHRoZSByaWdodCBvYmplY3Qgd2hlbiBzZXR0aW5nIHRoZSBzZGVzIHByb3BlcnR5LgorCisyMDExLTAyLTIxIDEyOjA5OjA3ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIFJldmVydCAiQ2hlY2sgdGhhdCBjb2xsZWN0cGFkcyBleGlzdHMgYmVmb3JlIHJlbW92aW5nIHBhZCIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgOGU2Yjg3NmU3NmM5NDQxMGRiMTYwYWZlNWViMzBmMjE0NTJlNDE5Zi4KKwkgIERlcGVuZHMgb24gYSBjb3JlIGNvbW1pdCB0aGF0IHdhcyByZXZlcnRlZAorCisyMDExLTAyLTIxIDAwOjU1OjQ5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJICBpY3lkZW11eDogZml4IHRhZyBsaXN0IGhhbmRsaW5nIGlzc3VlcyB0aGF0IG1pZ2h0IGhhdmUgY2F1c2VkIGNyYXNoZXMKKwkgIEZpeCBzbGlnaHRseSBjb25mdXNlZCB0YWcgaGFuZGxpbmcgaW4gc29tZSBwbGFjZXM6IG1ha2UgaXQgY2xlYXIgd2hlbgorCSAgd2UncmUgdGFraW5nIG93bmVyc2hpcCBvZiBhIHRhZyBsaXN0IGFuZCB3aGVuIG5vdC4gRm9yIGV4YW1wbGUsCisJICBnc3RfaWN5ZGVtdXhfdGFnX2ZvdW5kKCkgd2FzIHRha2luZyBvd25lcnNoaXAgd2hlbiB0aGUgc291cmNlIHBhZAorCSAgZXhpc3RlZCwgYnV0IG90aGVyd2lzZSBub3QgKGxlYWspLiBBbHNvLCBnc3RfZXZlbnRfcGFyc2VfdGFnKCkgZG9lcworCSAgbm90IHJldHVybiBhIG5ld2x5LWFsbG9jYXRlZCB0YWdsaXN0LCBidXQgYSB0YWcgbGlzdCB0aGF0IGJlbG9uZ3MgdG8KKwkgIHRoZSB0YWcgZXZlbnQsIHNvIGRvbid0IGdpdmUgb3duZXJzaGlwIG9mIGl0IGF3YXkuCisJICBXaGlsZSB3ZSdyZSBhdCBpdCwgc29tZSBtaW5vciBjbGVhbi11cHM6IGRvbid0IHJlLWludmVudCBnX3N0cm5kdXAoKQorCSAgYW5kIHNpbXBsaWZ5IGdzdF9pY3lkZW11eF9wYXJzZV9hbmRfc2VuZF90YWdzKCkgYSBiaXQsIGFuZCBkb24ndAorCSAgbGVhayB0aGUgdGFnIGxpc3QgaW4gY2FzZSBubyB2YWxpZCB0YWdzIHdoZXJlIGZvdW5kLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0MTMzMAorCisyMDExLTAyLTIwIDIzOjM5OjQxIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIENoZWNrIHRoYXQgY29sbGVjdHBhZHMgZXhpc3RzIGJlZm9yZSByZW1vdmluZyBwYWQKKwkgIFRoZSBjb3JlIG5vdyBjYWxscyByZWxlYXNlIHBhZCBmcm9tIGZpbmFsaXplLCBhdCB3aGljaCBwb2ludAorCSAgdGhlIGNvbGxlY3RwYWRzIG1pZ2h0IGhhdmUgYWxyZWFkeSBiZWVuIGZyZWVkLgorCisyMDExLTAyLTE5IDE1OjQ4OjIyIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkgIHBuZ2RlYzogSGFuZGxlIDE2LWJpdC1wZXItY2hhbm5lbCBpbWFnZXMKKworMjAxMS0wMi0xOCAxMDoxMjo0NyArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogc3RyZWFtLT5jdXJyZW50X3RvdGFsIGlzIGFjY3VtdWxhdGVkIGJ5dGUgc2l6ZSBhbmQgbm90IHRpbWUKKwkgIFVzZSB0aW1lc3RhbXAgZm9yIHRoZSBzdHJlYW0gaW5kZXggYXMgd2VsbC4KKworMjAxMS0wMi0xNSAxOTozMzo0NSAtMDgwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICB1ZHBzaW5rOiB3YXJuIHdoZW4gcGFja2V0IGlzIHRvbyBsYXJnZQorCisyMDExLTAyLTE3IDE3OjU5OjI1IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS5jOgorCSAgbWF0cm9za2FwYXJzZTogTmV3IGVsZW1lbnQKKwkgIENvcGllZCBmcm9tIGRlbXV4LiAgRHVwbGljYXRlcyBtdWNoIGNvZGUsIGFsc28gc29tZSBkZWFkIGNvZGUKKwkgIHJlbWFpbmluZy4KKworMjAxMS0wMi0xNyAxNzo1Nzo1NSAtMDgwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogRWFybGllciBkZWJ1ZyBjYXRlZ29yeSBpbml0aWFsaXphdGlvbgorCisyMDExLTAxLTIyIDAwOjEzOjE2IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogZG9uJ3Qgc2V0IGR1cmF0aW9uIGZvciBsaXZlIHN0cmVhbQorCisyMDExLTAxLTA2IDE1OjQ0OjI0IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2RlYnVndXRpbHMvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVidWd1dGlscy9uZWdvdGlhdGlvbi5jOgorCSAgZGVidWd1dGlsczogcmVtb3ZlIGJpdHJvdHRlbiBuZWdvdGlhdGlvbiBlbGVtZW50CisJICBXYXNuJ3QgZW5hYmxlZCwgZGlkbid0IHdvcmssIGFuZCBwbGFubmVkIGZlYXR1cmVzIGhhdmUgYmVlbgorCSAgc3VwZXJjZWRlZCBieSBjYXBzZmlsdGVyIGFuZCBjYXBzZGVidWcuCisKKzIwMTAtMDktMTcgMTI6MTA6MzggLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5oOgorCSAgcnRwdnJhd3BheTogSW1wbGVtZW50IGludGVybGFjaW5nCisKKzIwMTEtMDItMTcgMTc6NTc6NDIgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGFsc28gYWRkIHRoZSBmcmFtZS10eXBlIGZvciB0aGUgc3RyZWFtIGluZGV4CisKKzIwMTEtMDItMTcgMTc6NTY6MjkgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGdldCB0aGUgaW5kZXggd3JpdGVyIGlkIHdoZW4gdGhlIHBhZCBoYXMgYSBwYXJlbnQKKwkgIE90aGVyd2lzZSB0aGUgaW5kZXggd3JpdGVyIGhhcyBhIHdlaXJlZCBuYW1lLCBhcyB0aGUgcGFkIGhhcyBubyBwYXJlbnQgeWV0LgorCisyMDExLTAyLTE3IDE0OjAwOjQ4ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGF2aWRlbXV4LCBmbHZkZW11eDogZm9ybWF0dGluZyBjbGVhbnVwCisJICBUcmltIHRyYWlsaW5nIHdoaXRlc3BhY2VzIGFuZCBmaXggdGhlIGZvcm1hdHRpbmcgb2YgZG91YmxlIG5lZ2F0aW9uLgorCisyMDExLTAyLTE3IDEzOjU3OjM3ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGF2aWRlbXV4LCBmbHZkZW11eDogbWFyayBkZWx0YS11bml0cyBpbiB0aGUgaW5kZXgKKwkgIFdlIG5lZWQgdG8gdXNlIHRoZSAnZGVsdGEnIGZsYWcgZm9yIGRlbHRhIHVuaXRzIGFuZCBub3QgdGhlICdub25lJyBmbGFnLgorCisyMDExLTAyLTE3IDExOjU4OjQyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvaWNsZXMvLmdpdGlnbm9yZToKKwkgIC5naXRpZ25vcmU6IGlnbm9yZSBtb3ZlZCBlcXVhbGl6ZXIgdGVzdCBiaW5hcnkKKworMjAxMS0wMi0xNyAxMjo0NjoxNCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBtYXJrIGRlbHRhLXVuaXQgaW4gdGhlIGluZGV4CisJICBXZSBuZWVkIHRvIHVzZSB0aGUgZGVsdGEgZmxhZyBmcm8gZGVsdGEgdW5pdHMgYW5kIG5vdCBub25lLiBQcmludCBtb3JlIGRldGFpbHMKKwkgIHRvIHRoZSBkZWJ1ZyBsb2cuCisKKzIwMTEtMDItMTcgMTI6NDQ6MDEgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZm9ybWF0dGluZyBjbGVhbnVwCisJICBUcmltIHRyYWlsaW5nIHdoaXRlc3BhY2VzIGFuZCBmaXggdGhlIGZvcm1hdHRpbmcgb2YgZG91YmxlIG5lZ2F0aW9uLgorCisyMDExLTAyLTE2IDE3OjA5OjIwICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiByZXdvcmsgX3JlcXVlc3RfbmV3X3BhZCB0byBoYW5kbGUgZXhwbGljdCByZXEtcGFkLW5hbWVzCisJICBEb24ndCBpZ25vcmUgZXhwbGljaXQgcGFkLW5hbWVzLgorCisyMDExLTAyLTE2IDE3OjA2OjUxICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IHJld29yayBfcmVxdWVzdF9uZXdfcGFkIHRvIGhhbmRsZSBleHBsaWN0IHJlcS1wYWQtbmFtZXMKKwkgIERvbid0IGlnbm9yZSBleHBsaWNpdCBwYWQtbmFtZXMuIFJlYXJyYW5nZSB0aGUgY29kZSBhbmQgdGhlIGVycm9yIGhhbmRsaW5nIGEKKwkgIGJpdC4gQWRkIGEgRklYTUUtMC4xMSBmb3IgdGhlIGJhZCBwYWQtbmFtZXMuCisKKzIwMTEtMDItMTYgMTU6Mjg6NTMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgIGljbGVzOiBBZGQgZXF1YWxpemVyLXRlc3QgdG8gdGhlIGJ1aWxkIHN5c3RlbQorCisyMDExLTAyLTE2IDE1OjIzOjUwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvaWNsZXMvZXF1YWxpemVyLXRlc3QuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA1LzVdIGVxdWFsaXplci10ZXN0OiBJbml0aWFsaXplIGRlYnVnIGNhdGVnb3J5IGFmdGVyIGdzdF9pbml0KCkgdG8gZml4IHNlZ2ZhdWx0CisKKzIwMDctMTEtMDcgMTU6MzY6NTkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDQvNV0gdGVzdHMvaWNsZXMvZXF1YWxpemVyLXRlc3QuYzogRml4IGdhaW4gcmFuZ2VzIGZvciB0aGUgbGF0ZXN0IGVxdWFsaXplciBjaGFuZ2VzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2ljbGVzL2VxdWFsaXplci10ZXN0LmM6IChkb19zbGlkZXJfZmlkZGxpbmcpOgorCSAgRml4IGdhaW4gcmFuZ2VzIGZvciB0aGUgbGF0ZXN0IGVxdWFsaXplciBjaGFuZ2VzLgorCisyMDA3LTA1LTIxIDE0OjAxOjE2ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAzLzVdIENoYW5nZUxvZzogQ2hhbmdlTG9nIHN1cmdlcnkuIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmMgKEFSR19CQU5EX1dJRFRILCBfZG9faW5pdCwgQVJHX0dBSU4sIF9Hc3RJaXJFcXVhbGl6ZXJCYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIENoYW5nZUxvZzoKKwkgIENoYW5nZUxvZyBzdXJnZXJ5LgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jIChBUkdfQkFORF9XSURUSCwgX2RvX2luaXQsIEFSR19HQUlOLAorCSAgX0dzdElpckVxdWFsaXplckJhbmQsIG9iamVjdCwgX0dzdElpckVxdWFsaXplckJhbmRDbGFzcywKKwkgIHBhcmVudF9jbGFzcywgZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9zZXRfcHJvcGVydHksCisJICBnc3RfaWlyX2VxdWFsaXplcl9iYW5kX2NsYXNzX2luaXQsIGdzdF9paXJfZXF1YWxpemVyX2JhbmRfZ2V0X3R5cGUsCisJICBnc3RfaWlyX2VxdWFsaXplcl9jaGlsZF9wcm94eV9nZXRfY2hpbGRfYnlfaW5kZXgsCisJICBnc3RfaWlyX2VxdWFsaXplcl9jaGlsZF9wcm94eV9nZXRfY2hpbGRyZW5fY291bnQsCisJICBnc3RfaWlyX2VxdWFsaXplcl9jaGlsZF9wcm94eV9pbnRlcmZhY2VfaW5pdCwgc2V0dXBfZmlsdGVyLAorCSAgZ3N0X2lpcl9lcXVhbGl6ZXJfY29tcHV0ZV9mcmVxdWVuY2llcywgcGx1Z2luX2luaXQpOgorCSAgKiB0ZXN0cy9pY2xlcy9lcXVhbGl6ZXItdGVzdC5jOgorCSAgQWRkIGZpeG1lIGFuZCBjb21tZW50IGZvciBleGFtcGxlLgorCisyMDA3LTAzLTE0IDE2OjMzOjAzICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAyLzVdIHRlc3RzL2ljbGVzL2VxdWFsaXplci10ZXN0LmM6IFBvcnQgdGhlIGV4YW1wbGUgdG8gbmV3IGVxdWFsaXplciBhcGkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvaWNsZXMvZXF1YWxpemVyLXRlc3QuYzogKGVxdWFsaXplcl9zZXRfYmFuZF92YWx1ZSksCisJICAoZXF1YWxpemVyX3NldF9hbGxfYmFuZF92YWx1ZXMpLAorCSAgKGVxdWFsaXplcl9zZXRfYmFuZF92YWx1ZV9hbmRfd2FpdCksCisJICAoZXF1YWxpemVyX3NldF9hbGxfYmFuZF92YWx1ZXNfYW5kX3dhaXQpLCAoZG9fc2xpZGVyX2ZpZGRsaW5nKSwKKwkgIChtYWluKToKKwkgIFBvcnQgdGhlIGV4YW1wbGUgdG8gbmV3IGVxdWFsaXplciBhcGkuCisKKzIwMDctMDItMDMgMjM6MzU6MjYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxLzVdIEZpeCB1cCB0byB1c2UgdGhlIG5ld2x5IHBvcnRlZCAoYWN0dWFsbHkgd29ya2luZykgR3N0QXVkaW9GaWx0ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvZXF1YWxpemVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOiAoZ3N0X2lpcl9lcXVhbGl6ZXJfYmFzZV9pbml0KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9jbGFzc19pbml0KSwgKGdzdF9paXJfZXF1YWxpemVyX2luaXQpLAorCSAgKHNldHVwX2ZpbHRlciksIChnc3RfaWlyX2VxdWFsaXplcl9jb21wdXRlX2ZyZXF1ZW5jaWVzKSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9zZXRfcHJvcGVydHkpLCAoZ3N0X2lpcl9lcXVhbGl6ZXJfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl90cmFuc2Zvcm1faXApLCAoZ3N0X2lpcl9lcXVhbGl6ZXJfc2V0dXApLAorCSAgKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuaDoKKwkgIEZpeCB1cCB0byB1c2UgdGhlIG5ld2x5IHBvcnRlZCAoYWN0dWFsbHkgd29ya2luZykgR3N0QXVkaW9GaWx0ZXIuCisJICBCdW1wIGNvcmUvYmFzZSByZXF1aXJlbWVudHMgdG8gQ1ZTIGZvciB0aGlzLgorCSAgKiB0ZXN0cy9pY2xlcy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvaWNsZXMvZXF1YWxpemVyLXRlc3QuYzogKGNoZWNrX2J1cyksCisJICAoZXF1YWxpemVyX3NldF9iYW5kX3ZhbHVlKSwgKGVxdWFsaXplcl9zZXRfYWxsX2JhbmRfdmFsdWVzKSwKKwkgIChlcXVhbGl6ZXJfc2V0X2JhbmRfdmFsdWVfYW5kX3dhaXQpLAorCSAgKGVxdWFsaXplcl9zZXRfYWxsX2JhbmRfdmFsdWVzX2FuZF93YWl0KSwgKGRvX3NsaWRlcl9maWRkbGluZyksCisJICAobWFpbik6CisJICBBZGQgYnJhaW4tZGVhZCBpbnRlcmFjdGl2ZSB0ZXN0IGZvciBlcXVhbGl6ZXIuCisKKzIwMTEtMDItMTUgMTU6NTk6MzIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBBZGQgUEpQRyBtYXBwaW5nCisJICBBZGRzIG1hcHBpbmcgb2YgcHJvZ3Jlc3NpdmUganBlZyBmb3JtYXQKKworMjAxMS0wMi0xNSAxNjozMDoyMCArMDEwMCAgQW5keSBXaW5nbyA8d2luZ29Ab2Jsb25nLmNvbT4KKworCSAgcGx1ZyBxdGRlbXV4IHJlZmNvdW50IGxlYWtzCisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYyAoZ3N0X3F0ZGVtdXhfc3JjX2NvbnZlcnQpOiBVbnJlZiB0aGUgcXRkZW11eDsgd2UKKwkgIHdlcmVuJ3QgZG9pbmcgc28gYmVmb3JlLgorCSAgKGdzdF9xdGRlbXV4X2hhbmRsZV9zcmNfZXZlbnQsIGdzdF9xdGRlbXV4X2NoYWluKTogRml4IHNvbWUgZXJyb3IKKwkgIGNhc2VzIHdoaWNoIHdvdWxkIGxlYWsgYSByZWYgdG8gdGhlIHF0ZGVtdXguCisKKzIwMTEtMDItMTQgMjA6MjA6MDggKzAxMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8YW1vcmFsZXNAZmx1bW90aW9uLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBBZGQgVVJJIHF1ZXJ5IGhhbmRsZXIKKwkgIEZpeGVzIGJ1ZyAjNjQyMzM3LgorCisyMDExLTAyLTE0IDE3OjQ5OjU0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBhdm9pZCBzb3J0aW5nIE5VTEwgYXJyYXkgb2YgY2x1c3RlciBwb3NpdGlvbnMKKworMjAxMS0wMi0xNCAxNjo0Njo0NiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkgIHRoZW9yYXBheTogaGFuZGxlIDAgc2l6ZWQgcGFja2V0cworCSAgSGFuZGxlIDAgc2l6ZWQgcGFja2V0cyAocmVwZWF0IGZyYW1lKSBpbiB0aGUgcGF5bG9hZGVyIGFuZCBkZXBheWxvYWRlci4KKwkgIEZpeGVzICM2NDE4MjcKKworMjAxMS0wMi0xNCAxNToyMToyOSArMDIwMCAgVHV1a2thIFBhc2FuZW4gPHR1dWtrYS5wYXNhbmVuQGlsbWkuZmk+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHRhZ2luamVjdC5jOgorCSAgdGFnaW5qZWN0OiByZXNlbmQgdGFncyB3aGVuIHRoZXkgYXJlIGNoYW5nZWQKKwkgIEFsbG93IHNldHRpbmcgbmV3IHRhZ3Mgb24gdGhlIHByb3BlcnR5IHdoaWxlIHJ1bm5pbmcgYW5kIHNlbmQgdGhlbS4KKwkgIEZpeGVzICM2NDAyNDkKKworMjAxMS0wMi0xNCAxMjo1MzoyNyArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZjk0ZDczOSB0byAxZGU3ZjZhCisKKzIwMTEtMDItMDcgMjM6MzI6NTMgKzAxMDAgIE1pZ3VlbCBBbmdlbCBDYWJyZXJhIE1veWEgPG1hZG1hYzI1MDFAZ21haWwuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaXggbWlub3IgbGVha3Mgd2hlbiBoYW5kbGluZyBzZXJ2ZXIgcmVxdWVzdHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQwMTYzCisKKzIwMTEtMDItMTQgMDA6NDk6MDAgKzAwMDAgIEhlYXRoIE5pZWxzb24gPGhlYXRobkBnbWFpbC5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGV4dHJhY3QgTXVzaWNCcmFpbnogdGFncworCSAgRXh0cmFjdCBNdXNpY0JyYWlueiB0YWdzIGFkZGVkIGJ5IE11c2ljQnJhaW56J3MgUGljYXJkCisJICB0YWdnZXIgYXBwbGljYXRpb24uIFRoZXNlIHRhZ3MgKGVzcC4gdGhlIGFsYnVtIGlkKSBhcmUKKwkgIGhlbHBmdWwgZm9yIHJoeXRobWJveCBldC5hbC4gdG8gYXV0b21hdGljYWxseSBkb3dubG9hZHMKKwkgIGNvdmVyIGFydC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDIyMDUKKworMjAxMS0wMi0xNCAwMDozODo0NSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJlZmFjdG9yIGlUdW5lcyB0YWcgcGFyc2luZyBhIGJpdAorCisyMDExLTAyLTEwIDIzOjUyOjUxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSAgZG9hcDogdXBkYXRlIG1haWxpbmcgbGlzdCBsb2NhdGlvbgorCisyMDExLTAyLTEwIDE4OjExOjQ2ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcHJvcGFnYXRlIGVycm9yIGR1cmluZyBleHBvc2Vfc3RyZWFtcworCSAgLi4uIGFzIGl0IG1heSBvY2N1ciBkdXJpbmcgaW5pdGlhbCBwYXJzaW5nIG9mIGZyYWdtZW50ZWQgZmlsZS4KKworMjAxMS0wMi0xMCAxODowMDoxMSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGF2b2lkIHNraXBwaW5nIGV4cG9zaW5nIGEgc3RyZWFtIGZvbGxvd2luZyBhIHJlbW92ZWQgc3RyZWFtCisKKzIwMTEtMDItMTAgMTE6NTY6MzMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgbWF0cm9za2FkZW11eDogc3RvcmUgY2x1c3RlciBwb3NpdGlvbnMgcHJvdmlkZWQgYnkgU2Vla0hlYWQKKwkgIC4uLiBhbmQgdXNlIHRob3NlLCBpZiBhdmFpbGFibGUsIHRvIGxvY2F0ZSBhIGNsdXN0ZXIgcmF0aGVyIHRoYW4gc2Nhbm5pbmcuCisKKzIwMTEtMDItMDkgMTY6MjI6NDcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IHByb3Blcmx5IHJlc3VtZSBjbHVzdGVyIHNjYW5uaW5nCisJICAuLi4gcmF0aGVyIHRoYW4gZ2V0dGluZyBvZmZzZXQgdHJhY2tpbmcgbWVzc2VkIHVwLCBhbmQgdGhlbiBsaWtlbHkKKwkgIGZhaWxpbmcgYSBzdWJzZXF1ZW50IGFzc2VydC4KKworMjAxMS0wMi0wOCAxMDowNzo0MyArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzoKKwkgIGlkM2RlbXV4OiBlbnN1cmUgYSB0YWdsaXN0IGJlZm9yZSBhZGRpbmcgdGhlIGNvbnRhaW5lciB0YWcKKwkgIEluIHRoZSBjYXNlIG9mIGlkM3YxIGFsc28gZG9uJ3QgcmV0dXJuIE5VTEwgb24gZW1wdHkgdGFncywgYnV0IGFsc28gY3JlYXRlIGEgbmV3CisJICB0YWdsaXN0IGFuZCBhZGQgdGhlIGNvbnRhaW5lciB0YWcgZm9yIGNvbnNpc3RlbmN5LgorCisyMDExLTAyLTA3IDE3OjA4OjQ3ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHN0cmlwIHRyYWlsaW5nIHNwYWNlcworCisyMDExLTAyLTA3IDE3OjA3OjQyICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0cHNyYzogc2V0IG11bHRpcGxlIHByb3BlcnRpZXMgaW4gb25lIGdvCisJICBUaGVyZSBpcyBubyBuZWVkIGZvciBzZXBhcmF0ZSBnX29iamVjdF9zZXQoKSBjYWxscyBoZXJlLgorCisyMDExLTAyLTAzIDE2OjEwOjQ5IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IEhhbmRsZSBpbWFnZSBjYXBzIHdpdGhvdXQgYXNzZXJ0aW5nCisJICBJbWFnZXMgbWlnaHQgaGF2ZSBmcmFtZXJhdGU9MC8xIGluIHRoZSBjYXBzLCB3aGljaCBjYXVzZWQgYW4KKwkgIGFzc2VydGlvbiBvbiBkZWludGVybGFjZS4gSSBkb24ndCBrbm93IG9mIGludGVybGFjZWQgaW1hZ2UgZm9ybWF0cworCSAgYnV0IGRlaW50ZXJsYWNlIG1pZ2h0IGJlIGhhcmRjb2RlZCBvbiBzb21lIGdlbmVyaWMgcGlwZWxpbmVzIGFuZAorCSAgaXQgc2hvdWxkbid0IGFzc2VydC4KKwkgIFRoZSBmaXggd2FzIHRvIHNldCBmaWVsZF9kdXJhdGlvbiB0byAwIGlmIHRoZSBpbnB1dCBoYXMgYSBmcmFtZXJhdGUKKwkgIHdpdGggYSAwIG51bWVyYXRvci4KKwkgIFRoaXMgcGF0Y2ggYWxzbyBhZGRzIGNoZWNrcyBmb3IgdGhpcyBzaXR1YXRpb24gb24gdGhlIHVuaXQgdGVzdHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQxNDAwCisKKzIwMTEtMDItMDQgMTI6MzM6MDkgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIGRvY3M6IGZpeCBwYXJhbWV0ZXIgbmFtZSBpbiB1ZHBzcmMgZG9jcworCSAgSXQgaXMgImJ1ZmZlci1zaXplIiBhbmQgbm90ICJidWZmZXIiLiBBbHNvIHRyaW0gdHJhaWxpbmcgd2hpdGVzcGFjZS4KKworMjAxMS0wMi0wMyAyMzo0Mjo1OSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IGZpeCBpbnRlcmxhY2VkIHNldF9mb3JtYXQgY29uZmlndXJhdGlvbgorCSAgQ29tbWl0IDZjODI2OGRiZmQ1Yzg4ZmFjMjhjODgyZWYyZTQ1OThhNjUyMmUyZDYgYnJva2UgcmVjb3JkaW5nCisJICBmcm9tIGludGVybGFjZWQgdjRsMiBzb3VyY2UgKGUuZy4gdHlwaWNhbCB0diBjYXB0dXJlIGNhcmQpIHNpbmNlCisJICBWNEwyX0ZJRUxEX1NFUV9UQiAod2l0aCBmaWVsZHMgc3RvcmVkIHNlcGFyYXRlbHkpIGRvZXMgbm90IG1hcAorCSAgdG8gY3VycmVudGx5IGRlZmluZWQgaW50ZXJsYWNlZCBmb3JtYXQgKGZpZWxkcyBzdG9yZWQgaW50ZXJsZWF2ZWQpLgorCSAgQmVzaWRlcyB0aGlzIG1pc21hdGNoLCBoYXJkd2FyZSBtaWdodCBxdWl0ZSBsaWtlbHkgbm90IHN1cHBvcnQgb3IKKwkgIGFwcHJlY2lhdGUgdGhpcyBmaWVsZCB2YWx1ZSwgc2luY2UgcXVlcnlpbmcgc3VwcG9ydGVkIGZvcm1hdHMgbWFwcGVkCisJICBfSU5URVJMQUNFRCBmaWVsZCBmb3JtYXRzIHRvIGludGVybGFjZWQ9dHJ1ZSBjYXBzIChzbyB0aGUgbGF0dGVyIHNob3VsZAorCSAgbm90IGJlIG1hcHBlZCB0byBmaWVsZCB2YWx1ZSB0aGF0IGlzIG5vdCBrbm93biB0byBiZSBzdXBwb3J0ZWQpLgorCisyMDExLTAyLTAyIDE4OjI3OjUyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHNvdXJjZTogZml4IHR5cGUgb2YgbnRwbnN0aW1lCisKKzIwMTEtMDItMDIgMTg6MjE6MjYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgcnRwYmluOiBHZXQgYW5kIHVzZSB0aGUgTlRQIHRpbWUgd2hlbiByZWNlaXZpbmcgUlRDUAorCSAgV2hlbiB3ZSByZWNlaXZlIGFuIFJUQ1AgcGFja2V0LCBnZXQgdGhlIGN1cnJlbnQgTlRQIHRpbWUgaW4gbmFuc2Vjb25kcyBzbyB0aGF0CisJICB3ZSBjYW4gY29ycmVjdGx5IGNhbGN1bGF0ZSB0aGUgcm91bmQtdHJpcCB0aW1lLgorCisyMDExLTAyLTAxIDE5OjQwOjU4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgZGlyZWN0c291bmQ6IGFycmFuZ2UgZm9yIGRlZmluaXRpb24gb2YgX3N3YWIgb24gQ3lnd2luCisJICBnc3RkaXJlY3Rzb3VuZHNpbmsuYzogSW4gZnVuY3Rpb24gJ2dzdF9kaXJlY3Rzb3VuZF9zaW5rX3dyaXRlJzoKKwkgIGdzdGRpcmVjdHNvdW5kc2luay5jOjU1NzogZXJyb3I6IGltcGxpY2l0IGRlY2xhcmF0aW9uIG9mIGZ1bmN0aW9uICdfc3dhYicKKwkgIGdzdGRpcmVjdHNvdW5kc2luay5jOjU1NzogZXJyb3I6IG5lc3RlZCBleHRlcm4gZGVjbGFyYXRpb24gb2YgJ19zd2FiJworCisyMDEwLTEwLTA2IDIxOjE3OjI4IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuaDoKKwkgIHJ0cHRoZW9yYWRlcGF5OiBSZXF1ZXN0IG5ldyBrZXlmcmFtZSBvbiBsb3N0IHBhY2tldHMKKwkgIFRoZW9yYSBjYW4gb25seSB1c2UgdGhlIGxhc3QgZnJhbWUgKG9yIHRoZSBrZXlmcmFtZSkgYXMgYSByZWZlcmVuY2UsIHNvIGluCisJICBwcmFjdGljZS4gSWYgd2UgcmVjZWl2ZSBhIGJ1ZmZlciB0aGF0IHJlZmVyZW5jZXMgYW4gdW5rbm93biBjb2RlYm9vaywgcmVxdWVzdAorCSAgbmV3IGhlYWRlcnMuIEl0IHByb2JhYmx5IG1lYW5zIHRoYXQgaGVhZGVycyB3ZXJlIGxvc3QuCisKKzIwMTAtMDgtMjcgMTQ6MTE6NTMgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLW1hcnNoYWwubGlzdDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIHJ0cHNlc3Npb246IEFkZCBhY3Rpb24gc2lnbmFsIHRvIHJlcXVlc3QgZWFybHkgUlRDUAorCisyMDEwLTA4LTI3IDE2OjExOjA2IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIHJ0cHNlc3Npb246IEFkZCBjYWxsYmFjayB0byBnZXQgdGhlIGN1cnJlbnQgdGltZQorCisyMDEwLTEwLTE5IDIyOjIxOjU0ICswMjAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIHJ0cHNlc3Npb246IERvbid0IHJlbGF5IG1vcmUgdGhhbiBvbmUgUExJIHJlcXVlc3QgcGVyIFJUVAorCSAgRHJvcCBQTEkgcmVxdWVzdHMgaWYgb25lIHdhcyByZWxheSBpbiB0aGUgbGFzdCBSVFQsIHRoZSBvdGhlciBzaWRlIG1heQorCSAganVzdCBub3QgaGF2ZSByZWNlaXZlZCB0aGUga2V5ZnJhbWUgeWV0LgorCisyMDEwLTA2LTIzIDE2OjQzOjI0IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIHJ0cHNlc3Npb246IFNlbmQgR3N0Rm9yY2VLZXlVbml0IGV2ZW50IGluIHJlc3BvbnNlIHRvIHJlY2VpdmVkIFJUQ1AgUExJCisKKzIwMTAtMTEtMjQgMTU6Mjc6NDYgLTA1MDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZC5zaW1vbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBnc3RydHBzZXNzaW9uOiBGYWxsYmFjayBmb3IgRklSIHRvIFBMSSBpZiBQTEkgaXNuJ3QgYXZhaWxhYmxlCisKKzIwMTAtMDYtMjIgMTk6NTY6NTAgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjogSW1wbGVtZW50IHNlbmRpbmcgUExJIHBhY2tldHMgaW4gcmVzcG9uc2UgdG8gR3N0Rm9yY2VLZXlVbml0CisKKzIwMTAtMDYtMjIgMTM6MzM6MzIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIHJ0cHNvdXJjZTogUmV0YWluIFJUQ1AgRmVlZGJhY2sgcGFja2V0cyBmb3IgYSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUKKworMjAxMC0wOS0wNyAxMzozNToxNiArMDMwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBNYWtlIHJ0Y3AgYnVmZmVyIG1ldGFkYXRhIHdyaXRhYmxlIGFmdGVyIHByb2Nlc3NpbmcgaXQKKwkgIEZ1bmN0aW9ucyB0aGF0IHByb2Nlc3MgdGhlIHJ0Y3AgYnVmZmVyIGNvdWxkIGRlY2lkZSB0byBrZWVwIGEgcmVmCisJICBvbiB0aGUgYnVmZmVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuIFNvIG1ha2UgdGhlIG1ldGFkYXRhIHdyaXRhYmxlCisJICBvbmx5IGFmdGVyIHRoZXkgYXJlIGRvbmUuCisKKzIwMTAtMDYtMTcgMTc6MzQ6MTkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLW1hcnNoYWwubGlzdDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIHJ0cHNlc3Npb246IEVtaXQgc2lnbmFsIG9uIGluY29taW5nIFJUQ1AgRkIgcGFja2V0CisKKzIwMTEtMDItMDEgMTg6MTc6MTMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGZpeCBjb21waWxhdGlvbgorCisyMDEwLTA2LTE1IDE4OjM5OjQ3IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIHJ0cHNlc3Npb246IEFkZCBtZXRob2QgdG8gcmVxdWVzdCBlYXJseSBSVENQIHBhY2tldAorCSAgSW1wbGVtZW50IHRoZSBlYXJseSBtb2RlIGRlZmluZWQgaW4gUkZDIDQ1ODUuIEluIHRoaXMgbW9kZSwgUlRDUCBmZWVkYmFjaworCSAgcGFja2V0cyBhcmUgc2VudCBlYXJseSB0byBub3RpZmllci4KKworMjAxMC0wNi0wMSAxOToyODowMSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaDoKKwkgIHJ0cHNlc3Npb246IEFkZCBwcm9wZXJ0eSBmb3IgbWluaW11bSBpbnRlcnZhbCBiZXR3ZWVuIFJlZ3VsYXIgUlRDUCBtZXNzYWdlcworCSAgVGhpcyBjYW4gYmUgY2hhbmdlZCBhY2NvcmRpbmcgdG8gUkZDIDQ1ODUKKworMjAxMC0wNi0xNCAxODo0MDozMyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4tbWFyc2hhbC5saXN0OgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjogRW1pdCBzaWduYWwgd2hlbiBzZW5kaW5nIGEgY29tcG91bmQgUlRDUCBwYWNrZXQKKwkgIFRoaXMgYWxsb3dzIHVzZXJzIHRvIGFkZCBleHRyYSBSVENQIHBhY2tldHMgdG8gdGhlIGNvbXBvdW5kCisJICBSVENQIHBhY2tldC4KKworMjAxMC0wNi0xOSAxOToxMTowNiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJICBydHBwdGRlbXV4OiBUYWcgdXBzdHJlYW0gY3VzdG9tIGV2ZW50cyB3aXRoIHBheWxvYWQgdHlwZQorCisyMDEwLTA2LTE4IDE5OjEyOjQwIC0wNDAwICBPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICBydHBzc3JjZGVtdXg6IFRhZyB1cHN0cmVhbSBjdXN0b20gZXZlbnRzIHdpdGggU1NSQworCisyMDEwLTEwLTAxIDE3OjE5OjE2IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IEVtaXQgIm9uLXNzcmMtdmFsaWRhdGVkIiB3aGVuIHZhbGlkYXRpbmcgYnkgUlRDUAorCSAgRW1pdCAib24tc3NyYy12YWxpZGF0ZWQiIGlmIHRoZSBTU1JDIGlzIHZhbGlkYXRlZCBieSByZWNlaXZpbmcKKwkgIGEgUlRDUCBTREVTIHBhY2tldC4KKworMjAxMS0wMi0wMSAxNjozODoyMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkgIGoya3BheTogc2tpcCBFUEggcGFja2V0cworCSAgSW5jbHVkZSBFUEggbWFya2VycyBpbnRvIHRoZSBwcmV2aW91cyBjaHVuayBvZiBwYWNrZXRzLgorCisyMDExLTAxLTMxIDE3OjU2OjE4IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY21hcGF5Lmg6CisJICBydHBwY21hcGF5OiBSZW5hbWUgdGhlIGNsYXNzIHRvIGhhdmUgdGhlIHJpZ2h0IG5hbWUKKwkgIEl0IHdhcyBuYW1lIHBtY2EgaW5zdGVhZCBvZiBwY21hIGFuZCBtYWRlIGRlYnVnIGxvZ3MgaGFyZCB0byBzZWFyY2guCisKKzIwMTEtMDEtMzEgMDU6NTg6MzYgKzAxMDAgIERhdmlkIEhlbm5pbmdzc29uIDxkYXZpZC5oZW5uaW5nc3NvbkBjYW5vbmljYWwuY29tPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBQdWxzZXNpbms6IEFsbG93IGNodW5rcyB1cCB0byBidWZzaXplIGluc3RlYWQgb2Ygc2Vnc2l6ZQorCSAgQnkgYWxsb3dpbmcgbGFyZ2VyIGNodW5rcyB0byBiZSBzZW50LCBQdWxzZUF1ZGlvIHdpbGwgaGF2ZSBhCisJICBsb3dlciBDUFUgdXNhZ2UuIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgb24gbG93LWVuZCBtYWNoaW5lcywKKwkgIHdoZXJlIFB1bHNlQXVkaW8gY2FuIGNyYXNoIGlmIHBhY2tldHMgYXJlIGNvbWluZyBpbiBhdCBhIGhpZ2hlcgorCSAgcmF0ZSB0aGFuIFB1bHNlQXVkaW8gY2FuIHByb2Nlc3MgdGhlbS4KKwkgIFNpZ25lZC1vZmYtYnk6IERhdmlkIEhlbm5pbmdzc29uIDxkYXZpZC5oZW5uaW5nc3NvbkBjYW5vbmljYWwuY29tPgorCisyMDExLTAxLTMxIDEzOjQ0OjQ1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogc2ltcGxpZnkgdGVtcGxhdGUgY2FwcworCSAgV2UgY2FuIG1lcmdlIGFsbCB0aGUgWVVWIHZhcmlhbnRzIGludG8gb25lIHNpbmdsZSBzdHJ1Y3R1cmUuCisKKzIwMTEtMDEtMjcgMTU6MzU6MDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICB3aW4zMjogZml4IERFRkFVTFRfQVVESU9TSU5LLCBzaG91bGQgYmUgZGlyZWN0KnNvdW5kKnNpbmsKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDA3MDUKKworMjAxMS0wMS0yNyAxNjowMjo0NiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBpbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlIHRvIHBsZWFzZSBtaW5ndzMyIGNvbXBpbGVyCisKKzIwMTEtMDEtMjYgMjI6MjE6MzEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5oOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcDogdXNlIHNvY2tsZW5fdCB3aGVyZSBhcHByb3ByaWF0ZSByYXRoZXIgdGhhbiBjdXN0b20gdHlwZQorCSAgSW4gcGFydGljdWxhciwgZml4ZXMgQ3lnd2luIGJ1aWxkIHdoZXJlIHNvY2tsZW5fdCBpcyBkZWZpbmVkIGFzIGludAorCSAgaW4gbGluZSB3aXRoIG5hdGl2ZSB3aW4zMiBhcGkgZGVmaW5pdGlvbi4KKworMjAxMS0wMS0yNyAxMjoxNjo0NiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IG1pbmQgcm91bmRpbmcgaXNzdWVzIHdoZW4gY29udmVydGluZyBmcm9tIGdsb2JhbCB0aW1lIHRvIG1vdiB0aW1lCisJICBJbiBwYXJ0aWN1bGFyLCB0aGlzIGF2b2lkcyBtaXNzaW5nIHRoZSBpbnRlbmRlZCBrZXlmcmFtZSB3aGVuIGZpcnN0IGNvbnZlcnRpbmcKKwkgIGZyb20gdGhlIGZyYW1lJ3MgbW92IHRpbWUgdG8gZ2xvYmFsIHNlZ21lbnQgdGltZSwgYW5kIHRoZW4gYmFjayBmcm9tIGdsb2JhbAorCSAgdGltZSB0byBtb3YgdGltZSB3aGVuIGFjdGl2YXRpbmcgdGhlIHNlZ21lbnQuCisKKzIwMTEtMDEtMjYgMDg6NDg6NDMgKzAwMDAgIE9nbnlhbiBUb25jaGV2IDxvZ255YW4udG9uY2hldkBheGlzLmNvbT4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6CisJICBtYXRyb3NrYW11eDogZG9uJ3QgbGVhayBlYm1sIHdyaXRlciBjYXBzIHdoZW4gcmUtdXNpbmcgbWF0cm9za2FtdXgKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDA1NDIKKworMjAxMS0wMS0yNSAyMTo1NjoxOSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogZG9uJ3QgZGl2aWRlIGJ5IDAKKworMjAxMS0wMS0xOCAxNDo0ODowNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogcHVsbCBtb2RlIHNob3VsZCBhbHdheXMgcmVwb3J0IHNlZWthYmxlCisJICAuLi4gYXMgaXQgbm8gbG9uZ2VyIHJlcXVpcmVzIGFuIGluZGV4LCBidXQgY2FuIHNlZWsgYnkgc2Nhbm5pbmcgYXMgd2VsbC4KKworMjAxMS0wMS0xMCAxMjozNDoyMiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZm91cmNjLmg6CisJICBxdGRlbXV4OiBzdXBwb3J0IHNvbWUgbW9yZSBtcGVnLTQgZm91cmNjIHZhcmlhbnRzCisKKzIwMTEtMDEtMTAgMTI6MzQ6MDMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBzaW1wbGlmeSByZXRyaWV2aW5nIHN0c2QgY2hpbGQgZW50cnkgYXRvbQorCisyMDExLTAxLTI0IDE4OjI3OjUyICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IERvbid0IGNvbnNpZGVyIDAgZmNjX2hhbmRsZXIgYXMgdW5jb21wcmVzc2VkLgorCSAgSnVzdCBhdm9pZHMgYSB3YXJuaW5nCisKKzIwMTEtMDEtMjAgMTI6MTQ6MDggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHRha2UgY29uZmlndXJlZCBzdGFydCB0aW1lIGludG8gYWNjb3VudAorCSAgd2hlbiBjcmVhdGluZyB0aGUgbmV3c2VnbWVudCBldmVudCwgdGFrZSB0aGUgY29uZmlndXJlZCBzdGFydCB0aW1lCisJICBpbnRvIGFjY291bnQuCisKKzIwMTEtMDEtMjQgMTU6MTE6MDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggcHJpbnRmIGZvcm1hdCB3YXJuaW5nIG9uIG1pbmd3MzIKKwkgIE1ha2Ugd2luMzIgYnVpbGQgYm90IGhhcHB5IGFnYWluLCBhbmQgbmljZWZ5IG91dHB1dCB3aGlsZSB3ZSdyZSBhdCBpdC4KKwkgIHF0ZGVtdXguYzogSW4gZnVuY3Rpb24gJ3F0ZGVtdXhfcGFyc2VfdHJ1bic6CisJICBxdGRlbXV4LmM6MjE2MjozOiBlcnJvcjogZm9ybWF0ICclbHUnIGV4cGVjdHMgdHlwZSAnbG9uZyB1bnNpZ25lZCBpbnQnLCBidXQgYXJndW1lbnQgOSBoYXMgdHlwZSAnZ3VpbnQzMicKKworMjAxMS0wMS0yNCAxMzozOTo1OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3AtQU1SLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC1QQ01BLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEuc2g6CisJICBleGFtcGxlczogYXV0b2F1ZGlzaW5rIC0+IGF1dG9hdWRpb3NpbmsgaW4gUlRQIGV4YW1wbGVzCisKKzIwMTEtMDEtMjQgMDA6MzI6NDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb25vc2NvcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisKKz09PSByZWxlYXNlIDAuMTAuMjcgPT09CisKKzIwMTEtMDEtMjEgMTI6NTQ6MTYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAwLjEwLjI3CisKKzIwMTEtMDEtMjAgMTQ6MTA6NTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgaDI2NGRlcGF5OiBkb24ndCBsZWFrIGNvZGVjIGRhdGEgYnVmZmVyIGluIGJ5dGUtc3RyZWFtPXRydWUgbW9kZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0MDA2MworCisyMDExLTAxLTIwIDEzOjQxOjMzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZG9uJ3QgbGVhayB1cmwgc3RyaW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQwMDY0CisKKzIwMTEtMDEtMjAgMTE6NDU6NDcgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBHcmFjZWZ1bGx5IGhhbmRsZSBtb3YgZmlsZXMgbWlzdXNpbmcgdGhlIFdBVkUgYXRvbXMKKwkgIENoZWNrIHRoYXQgdGhlIFdBVkVIRUFERVIgbm9kZSBpcyBwcmVzZW50IGluc3RlYWQgb2YgYmxpbmRseSB1c2luZyBpdC4KKwkgIElmIG5vdCBwcmVzZW50IHdlIHdvbid0IGJlIGFibGUgdG8gcHJvdmlkZSBhIG1vcmUgcmVmaW5lZCBjYXBzLCBidXQgYXQKKwkgIGxlYXN0IHdlIHdvbid0IGNyYXNoLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0MDAyOAorCisyMDExLTAxLTIwIDAwOjA3OjMzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDJzaW5rOiBmaXggYWNjaWRlbnRhbCBicmVha2FnZSBvZiBuYXZpZ2F0aW9uIGludGVyZmFjZSBzdXBwb3J0CisKKzIwMTEtMDEtMTggMTI6NTg6MjkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjI2LjQgcHJlLXJlbGVhc2UKKworMjAxMS0wMS0xMiAxNDowMzo1NyAtMDgwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5jOgorCSAgZGVpbnRlcmxhY2U6IHJld3JpdGUgaG93IG5laWdoYm9yaW5nIHNjYW4gbGluZXMgYXJlIGNhbGN1bGF0ZWQKKwkgIE9sZCBjb2RlIHdhcyBkaWZmaWN1bHQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0aGUgbmVpZ2hib3JpbmcKKwkgIHNjYW4gbGluZXMgYXJlIGNhbGN1bGF0ZWQsIGFuZCBpdCBhcHBlYXJlZCB0aGF0IHNvbWUgd2VyZSBvZmYgYnkKKwkgICsyIG9yIC0yLCBkZXBlbmRpbmcgb24gdGhlIGZpZWxkIGZsYWcuICBGaXhlcyAjNjM5MzIxLgorCisyMDExLTAxLTE4IDA5OjMzOjA2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlzdWJ0aXRsZS5jOgorCSAgYXZpc3VidGl0bGU6IHNldCBjYXBzIG9uIHNyY3BhZCB0byBmaXggaXNzdWUgd2l0aCBkaXNjb3ZlcmVyCisJICBTZXQgY2FwcyBmcm9tIHRoZSBzdGFydCBzbyBkaXNjb3ZlcmVyIGRvZXNuJ3QgYmxvdyB1cCBvbgorCSAgc2VlaW5nIG5vIG5lZ290aWF0ZWQgY2FwcyBiZXR3ZWVuIGVsZW1lbnRzIG9uIHByZXJvbGwsCisJICB3aGljaCBtaWdodCBoYXBwZW4gaWYgbm8gc3VidGl0bGUgYnVmZmVycyBoYXZlIGJlZW4KKwkgIHB1c2hlZCB5ZXQgYXQgdGhlIHRpbWUuIFNlZSBmaWxlIGZyb20gYnVnICM2MDMzMDguCisKKzIwMTEtMDEtMTcgMjA6MDk6MTYgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IFVuY29yayBzdHJlYW0gd2hpbGUgZmx1c2hpbmcgdGhlIHJpbmdidWZmZXIKKwkgIEFmdGVyIHN0YXJ0aW5nIHRoZSByaW5nYnVmZmVyLCB3ZSB3YWl0IGZvciBlbm91Z2ggZGF0YSB0byBhcnJpdmUgYmVmb3JlCisJICB1bmNvcmtpbmcgdGhlIHN0cmVhbS4gVGhpcyB3aWxsIGNhdXNlIHRoZSBwaXBlbGluZSB0byBzdGFsbCBpZiB3ZSBnZXQgYW4KKwkgIEVPUyAob3Igb3RoZXJ3aXNlIG5lZWQgdG8gZmx1c2ggdGhlIHN0cmVhbSkgYmVmb3JlIHN1ZmZpY2llbnQgZGF0YQorCSAgYmVjb21lcyBhdmFpbGFibGUuIFRoaXMgcGF0Y2ggbWFrZXMgc3VyZSB0aGF0IHRoZSBzdHJlYW0gaXMgdW5jb3JrZWQKKwkgIHdoaWxlIGZsdXNoaW5nIHRvIGF2b2lkIHRoaXMgcHJvYmxlbS4KKwkgIEZpeGVzIGlzc3VlIHdpdGggYSB3ZWJraXQgdW5pdCB0ZXN0IHRlc3RpbmcgcmV2ZXJzZSBwbGF5YmFjayBvZgorCSAgYW4gTVA0IEguMjY0L0FBQyBmaWxlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzOTc0MAorCisyMDExLTAxLTE0IDE0OjUxOjUxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGF2b2lkIGNyZWF0aW5nIGNhcHMgZnJvbSBzdHJpbmcgd2hlbiBwb3NzaWJsZQorCSAgRml4ZXMgIzYzOTUxNi4KKworMjAxMS0wMS0xNCAxNDo0ODo0OSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IHNldCBzcmMgcGFkIGNhcHMgd2hlbiBzdGFydGluZyBmaWxlCisJICBGaXhlcyAjNjM5NTE2LgorCisyMDExLTAxLTEyIDIwOjM4OjU5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IGRlZmluZSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfe1RCLEJUfSBpZiBub3QgYXZhaWxhYmxlIGluIGhlYWRlcgorCSAgT2xkZXIga2VybmVscyBkb24ndCBoYXZlIHRoZXNlLCBhbmQgdGhlcmUncyBubyBlYXN5IHdheSB0byBjaGVjayBmb3IgdGhlCisJICBleGlzdGFuY2Ugb2YgZW51bXMgdGhhdCBkb2Vzbid0IGludm9sdmUgYSBjb25maWd1cmUgY2hlY2ssIHNvIGp1c3QgZGVmaW5lCisJICB0aGVzZSBpZiB0aGUgVjRMMl9DQVBfVklERU9fT1VUUFVUX09WRVJMQVkgZGVmaW5lIGlzIG5vdCB0aGVyZSwgd2hpY2ggd2FzCisJICBhZGRlZCBpbiB0aGUgc2FtZSBjb21taXQgYXMgdGhlIFRCL0JUIGVudW0uIEZpeGVzIGNvbXBpbGF0aW9uIG9uIENlbnRPUyA1LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzOTMzOQorCisyMDExLTAxLTExIDIzOjE4OjU5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgMC4xMC4yNi4zIHByZS1yZWxlYXNlCisKKzIwMTEtMDEtMTEgMjI6NDI6NDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSAgZG9jczogdXBkYXRlIGRvY3MKKworMjAxMS0wMS0xMSAyMzozOToxMiArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogTWFrZSBjb3JraW5nIGR1cmluZyBwYXVzZSBzeW5jaHJvbm91cworCSAgVGhpcyBtYWtlcyB0aGUgY2FsbCB0byBwYV9zdHJlYW1fY29yaygpIGR1cmluZyByaW5nYnVmZmVyIHBhdXNlKCkKKwkgIHN5bmNocm9ub3VzLCB3aGljaCBtYWtlcyBzdXJlIHRoYXQgdGhlIGNsb2NrIGRvZXMgbm90IGFkdmFuY2UgYWZ0ZXIgd2UKKwkgIHRha2UgYSBzbmFwc2hvdCBmb3Igc3RhcnRfdGltZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MzkyNDAKKworMjAxMS0wMS0xMSAxOTozMzoxNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2RhLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSAgcG86IHVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAxMS0wMS0xMSAxNTo1MDoyOCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZTU3MmM4NyB0byBmOTRkNzM5CisKKzIwMTEtMDEtMTAgMTY6MzY6MTkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gY2NiYWE4NSB0byBlNTcyYzg3CisKKzIwMTEtMDEtMTAgMTQ6NTM6MzkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNDY0NDVhZCB0byBjY2JhYTg1CisKKzIwMTEtMDEtMDcgMTM6MjQ6MDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjI2LjIgcHJlLXJlbGVhc2UKKworMjAxMS0wMS0wNyAxMzowNjozOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTEtMDEtMDcgMDI6MzI6MjAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkgIGFscGhhOiBmaXggY29tcGlsZXIgd2FybmluZ3MgY2F1c2VkIGJ5IC1ER19ESVNBQkxFX0FTU0VSVAorCisyMDExLTAxLTA3IDAyOjA2OjUxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOgorCSAgbWF0cm9za2E6IGRvbid0IHB1dCBlc3NlbnRpYWwgZnVuY3Rpb24gY2FsbHMgaW50byBnX2Fzc2VydCgpCisJICBnX2Fzc2VydCgpIHdpbGwgZXhwYW5kIHRvIE5PT1BzIGlmIC1ER19ESVNBQkxFX0FTU0VSVCBpcyBwYXNzZWQuCisKKzIwMTEtMDEtMDcgMDE6MzU6NDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMnNpbms6IGRvbid0IHB1dCBmdW5jdGlvbmFsIGNvZGUgbGlrZSBpb2N0bCBjYWxscyBpbnRvIGdfcmV0dXJuX2lmX2ZhaWwoKQorCSAgVGhlc2UgbWFjcm9zIHdpbGwgZXhwYW5kIHRvIE5PT1BzIGdpdmVuIHRoZSByaWdodCBkZWZpbmVzLiBBbHNvLAorCSAgZ19yZXR1cm5faWZfZmFpbCgpIGFuZCBmcmllbmRzIGFyZSBtZWFudCB0byBiZSB1c2VkIHRvIGNhdGNoIHByb2dyYW1taW5nCisJICBlcnJvcnMgKGxpa2UgaW52YWxpZCBpbnB1dCB0byBmdW5jdGlvbnMpLCBub3QgcnVudGltZSBlcnJvciBoYW5kbGluZy4KKworMjAxMS0wMS0wNyAwMToxMTowMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgdGVzdHM6IG5ldmVyIGRpc2FibGUgZ19hc3NlcnQoKSBhbmQgY2FzdCBjaGVja3MgZm9yIHRoZSB1bml0IHRlc3RzCisJICBUaGUgdW5pdCB0ZXN0cyBhcmUgcmlkZGxlZCB3aXRoIGdfYXNzZXJ0KCkgYW5kIGZyaWVuZHMsIG1ha2Ugc3VyZSB3ZQorCSAgZG9uJ3QgZGlzYWJsZSBhc3NlcnQgYW5kIGNhc3QgY2hlY2tzIGZvciB0aGUgdW5pdCB0ZXN0cyBldmVuIGlmCisJICB0aGlzIGhhcyBiZWVuIHNwZWNpZmllZCBmb3IgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgYmFzZSwgZS5nLiB2aWEKKwkgIC0tZGlzYWJsZS1nbGliLWFzc2VydHMuCisKKzIwMTEtMDEtMDYgMTI6Mjk6MjEgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSAgcnRwOiBGaXggdW5pdGlhbGl6ZWQgdmFyaWFibGVzIG9uIG1hY29zeAorCisyMDExLTAxLTA2IDEyOjI4OjU4ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6CisJICBxdGRlbXV4OiBGaXggdW5pdGlhbGl6ZWQgdmFyaWFibGVzIG9uIG1hY29zeAorCisyMDExLTAxLTA1IDE3OjQ5OjE2IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2RlYnVndXRpbHMvZ3N0Y2Fwc2RlYnVnLmM6CisJICBjYXBzZGVidWc6IEFkZCBjYXBkZWJ1ZyBkZWJ1ZyBjYXRlZ29yeQorCisyMDEwLTEyLTExIDEyOjQyOjEwIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogQ2hhbmdlIHRoZSBkZWZhdWx0IHRvIGxpbmVhcgorCSAgVGhlIHByZXZpb3VzIGRlZmF1bHQsIGdyZWVkeWgsIHRha2VzIDQgdGltZXMgYXMgbG9uZyBhcyBNUEVHLTIKKwkgIHZpZGVvIGRlY29kaW5nLCBhbmQgaXMgdW5saWtlbHkgZmFzdCBlbm91Z2ggb24gYW55IGN1cnJlbnQgQ1BVCisJICB0byBwbGF5IDEwODBpIHZpZGVvIGluIHJlYWwtdGltZS4gIGdyZWVkeWwgaXNuJ3QgbXVjaCBmYXN0ZXIuCisJICBsaW5lYXIgd2FzIGNob3NlbiBvdmVyIHZmaXIsIHNpbmNlIHRoZSBxdWFsaXR5IGFkdmFudGFnZSBvZiB2ZmlyCisJICBpcyBtaW5pbWFsIGNvbXBhcmVkIHRvIHRoZSBvY2Nhc2lvbmFsIHZpc3VhbCBhcnRpZmFjdHMgYW5kIHNsb3dlcgorCSAgcHJvY2Vzc2luZy4KKworMjAxMS0wMS0wNSAxODozMjo1OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZG9uJ3QgY29uZnVzZSByZXR1cm4gdmFsdWVzCisJICBSZXR1cm4gYSByZXR1cm4gdmFsdWUgb2YgdGhlIHJpZ2h0IHR5cGUuCisKKzIwMTEtMDEtMDUgMTY6MjQ6MTMgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2R1bXAuYzoKKwkgIHF0ZGVtdXg6IEZpeCB1bml0aWFsaXplZCB2YXJpYWJsZXMgb24gbWFjb3N4CisKKzIwMTEtMDEtMDUgMTU6MDM6MzIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJICB2cmF3ZGVwYXk6IGZpeCBsZW5ndGggY2hlY2sKKwkgIEFkZCBzb21lIG1vcmUgZGVidWdnaW5nLgorCSAgQWRkIHRoZSBsZW5ndGggY2hlY2sgc28gd2UgZG9uJ3QgY2F1c2UgdW5uZWVkZWQgd2FybmluZ3MuCisKKzIwMTEtMDEtMDUgMTI6MDQ6MDMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSAgbXVsdGl1ZHBzaW5rOiBhZGQgYnVmZmVyLXNpemUgcHJvcGVydHkKKwkgIEFkZCBidWZmZXItc2l6ZSBwcm9wZXJ0eSB0byBjb25maWd1cmUgdGhlIGtlcm5lbCBzZW5kIGJ1ZmZlci4KKworMjAxMS0wMS0wMyAyMDoxNjoyMiArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiByZW1vdmUgdW51c2VkIHZhcmlhYmxlcyB3aGVuIGRlYnVnLWxvZ2dpbmcgZGlzYWJsZWQKKworMjAxMS0wMS0wMyAyMDowNjozNSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thLWRlbXV4OiByZW1vdmUgdW51c2VkIHZhcmlhYmxlcyB3aGVuIGRlYnVnLWxvZ2dpbmcgZGlzYWJsZWQKKworMjAxMS0wMS0wMyAxODowNToxNSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzoKKwkgIGNhY2FzaW5rOiBmaXggbWFza3MgYW5kIHN0cmlkZXMKKwkgIFVzZSB0aGUgcmlnaHQgZW5kaWFubmVzcyB0byByZWFkIHRoZSBtYXNrcy4KKwkgIFVzZSB0aGUgcmlnaHQgc3RyaWRlcyBmb3IgdGhlIGJpdG1hcC4KKwkgIEZpeGVzICM2Mzg1NjkKKworMjAxMS0wMS0wMyAwMToxODowNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IHVuZG8gcHJlc3VtYWJseSBhY2NpZGVudGFsIGVuYWJsZW1lbnQgb2YgdGhlIEdzdFhPdmVybGF5IGludGVyZmFjZQorCSAgTG9va3MgbGlrZSB0aGlzIGdvdCBlbmFibGVkIGJ5IGFjY2lkZW50IHdoZW4gYWRkaW5nIGl0IHRvIHY0bDJzaW5rLAorCSAgc28gdW5kbyB0aGlzIGZvciBub3cuIE5vdCBzdXJlIGl0IG1ha2VzIG11Y2ggc2Vuc2UgaW4gYSBHU3RyZWFtZXIKKwkgIGNvbnRleHQgd2l0aCBjdXJyZW50IGhhcmR3YXJlLgorCisyMDExLTAxLTAzIDE1OjQwOjExICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBpbmNyZWFzZSB1ZHAgYnVmZmVyIHNpemUKKwkgIFNldCBhIGJpZ2dlciBVRFAgYnVmZmVyIHNpemUgYnkgZGVmYXVsdCB0byByZWR1Y2UgcGFja2V0IGxvc3Mgd2l0aAorCSAgaGlnaCBiaXRyYXRlIHN0cmVhbXMuCisKKzIwMTEtMDEtMDIgMTk6MTk6MjcgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oOgorCSAgbXVsdGlmaWxlc2luazogc2VuZCBzdHJlYW0gaGVhZGVycyBpbiBrZXktZnJhbWUgbW9kZQorCisyMDExLTAxLTAyIDE5OjQzOjAyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2phY2svTWFrZWZpbGUuYW06CisJKiBleHQvamFjay9SRUFETUU6CisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgIGphY2s6IGZpeCB1cCBlbGVtZW50IGRldGFpbHMgYW5kIHNvbWUgb3RoZXIgbWlub3IgY2xlYW4tdXBzCisKKzIwMTEtMDEtMDIgMTk6MjM6NTEgKzAwMDAgIEVyaWNoIFNjaHViZXJ0IDxlcmljaEBkZWJpYW4ub3JnPgorCisJKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzoKKwkgIGlkM2RlbXV4OiBmaXggcGFyc2luZyBvZiBJRDN2Mi40IGdlbnJlIGZyYW1lcyB3aXRoIG11bHRpcGxlIGdlbnJlcworCSAgV2UnZCBvbmx5IGV4dHJhY3QgdGhlIGZpcnN0IGdlbnJlIChtdWx0aXBsZSB0aW1lcykgaW5zdGVhZCBvZiBhbGwKKwkgIGdlbnJlcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Mzg1MzUKKworMjAxMS0wMS0wMiAxNzo0MDo0MSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSAgamFjazogdGVtcGxhdGUgY2FwcyBoYWQgbGlzdHMgd2l0aCBvbmUgdmFsdWUsIGp1c3QgdXNlIHZhbHVlIGRpcmVjdGx5CisKKzIwMTEtMDEtMDIgMTc6MDc6MTkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgIGphY2s6IG1ha2UgZ2V0X3R5cGUgZnVuY3Rpb25zIHRocmVhZC1zYWZlCisJICBCZWNhdXNlIHdlIGNhbiAoc2hvdWxkbid0IGJlIG5lZWRlZCB3aXRoIG90aGVyIHdvcmthcm91bmRzIHN0aWxsIHRoZXJlKS4KKworMjAxMS0wMS0wMiAxNToyNzoxOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSAgZG9jczogdXBkYXRlIHBsdWdpbiBkb2NzCisKKzIwMTEtMDEtMDIgMTU6MjU6NDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiAuZ2l0aWdub3JlOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkqIHRlc3RzL2V4YW1wbGVzL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvamFjay9NYWtlZmlsZS5hbToKKwkgIGphY2s6IG5ldyBqYWNrYXVkaW9zcmMgYW5kIGphY2thdWRpb3NpbmsgZWxlbWVudHMsIG1vdmVkIGZyb20gZ3N0LXBsdWdpbnMtYmFkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjIxOTI5CisKKzIwMTAtMTAtMTkgMTY6MjM6MjMgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICB2YXJpb3VzIChleHQpOiBhZGQgbWlzc2luZyBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIGZsYWdzCisJICBDYW5vbmljYWxpemUgcHJvcGVydHkgbmFtZXMgYXMgbmVlZGVkLgorCisyMDEwLTA5LTA5IDE0OjQ5OjA2IC0wNDAwICBUcmlzdGFuIE1hdHRoZXdzIDxsZS5idXNpbmVzc21hbkBnbWFpbC5jb20+CisKKwkqIGV4dC9qYWNrL01ha2VmaWxlLmFtOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICBqYWNrOiBhZGRlZCB0cmFuc2xhdGFibGUgdGV4dCBmb3Igc2VydmVyIG5vdCBmb3VuZCBlcnJvcgorCisyMDEwLTA5LTA2IDE3OjE3OjU0IC0wNDAwICBUcmlzdGFuIE1hdHRoZXdzIDxsZS5idXNpbmVzc21hbkBnbWFpbC5jb20+CisKKwkqIHRlc3RzL2V4YW1wbGVzL2phY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9leGFtcGxlcy9qYWNrL2phY2tfY2xpZW50LmM6CisJICBleGFtcGxlczogYWRkIHRlc3QgdG8gZGVtb25zdHJhdGUgamFja19jbGllbnRfdCB1c2FnZQorCisyMDEwLTA5LTA2IDE2OjExOjMxIC0wNDAwICBUcmlzdGFuIE1hdHRoZXdzIDxsZS5idXNpbmVzc21hbkBnbWFpbC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvY2xpZW50Lmg6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmg6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5oOgorCSAgamFjazogYWRkZWQgY2xpZW50IHByb3BlcnR5CisKKzIwMTAtMDYtMTcgMTY6MjY6MDcgLTA0MDAgIFRyaXN0YW4gTWF0dGhld3MgPHRyaXN0YW5Ac2F0LnFjLmNhPgorCisJKiBleHQvamFjay9nc3RqYWNrYmluLmM6CisJICBqYWNrOiByZW1vdmVkIHVudXNlZCBmaWxlIGdzdGphY2tiaW4uYworCSAgVGhpcyBpcyBhIDAuOCBsZWZ0b3Zlci4KKworMjAxMC0wNS0xMyAxMjo1NToyOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICBqYWNrc3JjOiBtYWtlIHN1cmUgd2UgYWx3YXlzIHJlYWQgbmZyYW1lcworCSAgRXJyb3Igb3V0IHdoZW4gd2UgYXJlIGFza2VkIHRvIHJlYWQgYSBkaWZmZXJlbnQgc2l6ZSB0aGF0IHdoYXQgd2FzIGNvbmZpZ3VyZWQgYXMKKwkgIHRoZSBqYWNrIHBlcmlvZCBzaXplIGJlY2F1c2UgdGhhdCB3b3VsZCBtZWFuIHNvbWV0aGluZyBlbHNlIGlzIHdyb25nLgorCSAgRml4ZXMgIzYxODQwOQorCisyMDEwLTA1LTExIDE3OjU2OjMxIC0wNDAwICBUcmlzdGFuIE1hdHRoZXdzIDx0cmlzdGFuQHNhdC5xYy5jYT4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuaDoKKwkgIGphY2s6IGltcHJvdmUgcHJvY2Vzc19jYgorCisyMDEwLTA0LTI3IDEwOjQ4OjMyIC0wNDAwICBUcmlzdGFuIE1hdHRoZXdzIDx0cmlzdGFuQHRyaXN0YW4tbGFwdG9wLihub25lKT4KKworCSogZXh0L2phY2svTWFrZWZpbGUuYW06CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2t1dGlsLmM6CisJKiBleHQvamFjay9nc3RqYWNrdXRpbC5oOgorCSAgamFjazogaW1wbGVtZW50IG11bHRpY2hhbm5lbCBzdXBwb3J0IGNvcnJlY3RseSBmb3IgamFja2F1ZGlvc3JjCisJICBGaXhlcyBwYXJ0cyBvZiBidWcgIzYxNjU0MS4KKworMjAxMC0wNC0yNyAxMToyMToxNiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2tyaW5nYnVmZmVyLmg6CisJICBqYWNrOiByZW1vdmUgZW1wdHkgZGlzcG9zZSBhbmQgZmluYWxpemUgbWV0aG9kcworCisyMDEwLTA0LTI3IDEwOjU5OjAwICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSAgamFjazogZG9uJ3QgbGVhayBjYXBzCisJICBBZGQgZGlzcG9zZSBtZXRob2RzIHRvIGNsZWFyIGNhcHMuCisKKzIwMTAtMDQtMjcgMTA6MzQ6MjQgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICBqYWNrOiBkb24ndCB1c2UgR1NUX0RFQlVHX0ZVTkNQVFIgZm9yIGdvYmplY3Qgdm1ldGhvZHMKKworMjAxMC0wMy0yNCAxNTo1OTo1MyArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgIGphY2s6IGZpeCBlbGVtZW50IG5hbWUgaW4gc2VjdGlvbiBkb2MgYmxvYgorCisyMDEwLTAzLTIyIDE2OjU2OjAzICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSAgQWRkIC1Xb2xkLXN0eWxlLWRlZmluaXRpb24KKwkgIGFuZCBmaXggdGhlIHdhcm5pbmdzCisKKzIwMTAtMDMtMjEgMjE6Mzk6MTggKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZXh0L2phY2svZ3N0amFjay5oOgorCSAgQWRkIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVdtaXNzaW5nLXByb3RvdHlwZXMgdG8gY29uZmlndXJlIGZsYWdzCisJICBBbmQgZml4IGFsbCB3YXJuaW5ncworCisyMDEwLTAzLTE4IDE3OjMwOjI2ICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X2RldGFpbHMgPT4gZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X2RldGFpbHNfc2ltcGxlCisKKzIwMDktMTAtMTIgMDk6MDY6MzcgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICBqYWNrOiBlbnN1cmUgc2VndG90YWwgaXMgYXQgbGVhc3QgMgorCSAgTm90IG9ubHkgYWRqdXN0IGJ1ZmZlci10aW1lIGFuZCBhdm9pZCBzZWd0b3RhbD0wLCBidXQgaW5zdGVhZCBlbnN1cmUgc2VndG90YWwgaXMKKwkgIGF0bGVhc3QgMi4gRG8gc2FtZSBjaGFuZ2Ugb24gamFja3NyYy4gV2UgY291bGQgYWxzbyBjaGVjayB0aGUgbGF0ZW5jeSBhbmQgYnVmZmVyCisJICB0aW1lIGNvbmZpZ3VyZWQgYnkgdGhlIGNsaWVudCBhbmQgYWRqdXN0IGJ1ZmZlci10aW1lIHNvIHRoYXQgd2UgZ2V0IHRvIHRoZSBzYW1lCisJICBudW1iZXIgb2Ygc2VnbWVudHMuCisKKzIwMDktMTAtMTIgMDA6NTE6MjcgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSAgamFjazogZG9uJ3QgY3Jhc2ggaW4gcmluZ2J1ZmZlciB3aXRoIFNJR0ZQRSBvbiBzbWFsbCBidWZmZXItdGltZXMKKwkgIEphY2sgb3ZlcnJpZGVzIHVzZXItc3BlY2lmaWVkIGxhdGVuY3ktdGltZSB3aXRoIHRoZSBvbmUgaXQgZ2V0cyBmcm9tIGphY2sKKwkgIGl0c2VsZi4gSXQgYWxzbyBuZWVkcyB0byBhZGp1c3QgYnVmZmVyLXRpbWUgc29tZXdoYXQgdG8gYXZvaWQgc2VndG90YWwgYmVpbmcgMAorCisyMDA5LTA1LTExIDE2OjEyOjU0ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSAgamFjazogd2hlbiBzdG9wcGluZyBwbGF5YmFjaywgZG8gb25lIG1vcmUgY3ljbGUgdG8gZmx1c2ggdGhlIHBvcnQuIEZpeGVzICM1ODIxNjcKKwkgIFRoZSBnc3RfamFja19hdWRpb19jbGllbnRfc2V0X2FjdGl2ZSgpIGZsYWdzIHRoZSBwb3J0IGFzIGRlYWN0aXZhdGluZyBhbmQgdXNlcworCSAgYSBHQ29uZCB0byB3YWl0IHVudGlsIHRoZSBqYWNrX3Byb2Nlc3NfY2IoKSBoYXMgcnVuIG9uY2UgbW9yZSBhbmQgY2xlYXJlZCB0aGUKKwkgIGZsYWcuIFRoaXMgd2F5IHRoZSBjbGllbnQgemVybydzIHRoZSBidWZmZXIuIFRoaXMgaGFwcGVucyBpZiBvbmUgbWFueWFsbHkgZ28KKwkgIHRvIFBBVVNFRCBhbmQgdGhlbiB0byBSRUFEWSwgd2hpbGUgbGV0aW5nIHRoZSBtYWlubG9vcCBydW4gaW5iZXR3ZWVuLgorCisyMDA5LTAzLTE2IDExOjIxOjAyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJKiBleHQvamFjay9nc3RqYWNrLmg6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgIGphY2s6IEFkZCBuZXcgY29ubmVjdGlvbiBtb2RlCisJICBBZGQgYSBuZXcgY29ubmVjdGlvbiBtb2RlIHRvIGphY2tzcmMgYW5kIGphY2tzaW5rLiBJbiB0aGlzIG5ldyBhdXRvLWZvcmNlCisJICBjb25uZWN0aW9uIG1vZGUgamFjayB3aWxsIGNyZWF0ZSBhcyBtYW55IHBvcnRzIGFzIHJlcXVlc3RlZC9uZWVkZWQgaW4gdGhlCisJICBwaXBlbGluZSBhbmQgd2lsbCB0aGVuIGNvbm5lY3QgYXMgbWFueSBwaHlzaWNhbCBwb3J0cyBhcyBwb3NzaWJsZSwgcG9zc2libHkKKwkgIGxlYXZpbmcgc29tZSBwb3J0cyB1bmNvbm5lY3RlZC4KKwkgIEFsc28gZ2V0IHJpZCBvZiBzb21lIGxlZnRvdmVyIGdfcHJpbnQuCisJICBGaXhlcyAjNTc1Mjg0LgorCisyMDA4LTExLTIzIDE3OjUwOjA4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGV4dC9qYWNrLzogUXVlcnkgcG9ydCBsYXRlbmNpZXMgZm9yIHNpbmsvc3JjIGRlbGF5cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSAgUXVlcnkgcG9ydCBsYXRlbmNpZXMgZm9yIHNpbmsvc3JjIGRlbGF5cy4KKwkgICogZXh0L2phY2svZ3N0amFja2Jpbi5jOgorCSAgTm8gcHJpbnRmIHBsZWFzZS4KKworMjAwOC0xMS0wNCAxMjo0MjozMCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBEb24ndCBpbnN0YWxsIHN0YXRpYyBsaWJzIGZvciBwbHVnaW5zLiBGaXhlcyAjNTUwODUxIGZvciAtYmFkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9hbHNhc3BkaWYvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hbXJ3Yi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2FwZXhzaW5rL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXJ0cy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2FydHNkL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXVkaW9maWxlL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXVkaW9yZXNhbXBsZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2J6Mi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2NkYXVkaW8vTWFrZWZpbGUuYW06CisJICAqIGV4dC9jZWx0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvZGMxMzk0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvZGlyYWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kaXJlY3RmYi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2RpdngvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kdHMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9mYWFjL01ha2VmaWxlLmFtOgorCSAgKiBleHQvZmFhZC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2dzbS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2hlcm1lcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2l2b3JiaXMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9qYWNrL01ha2VmaWxlLmFtOgorCSAgKiBleHQvanAyay9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xhZHNwYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xjcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xpYmZhbWUvTWFrZWZpbGUuYW06CisJICAqIGV4dC9saWJtbXMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9tZXRhZGF0YS9NYWtlZmlsZS5hbToKKwkgICogZXh0L21wZWcyZW5jL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXBsZXgvTWFrZWZpbGUuYW06CisJICAqIGV4dC9tdXNlcGFjay9NYWtlZmlsZS5hbToKKwkgICogZXh0L211c2ljYnJhaW56L01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXl0aHR2L01ha2VmaWxlLmFtOgorCSAgKiBleHQvbmFzL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbmVvbi9NYWtlZmlsZS5hbToKKwkgICogZXh0L29mYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3BvbHlwL01ha2VmaWxlLmFtOgorCSAgKiBleHQvcmVzaW5kdmQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zZGwvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zaG91dC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NuYXBzaG90L01ha2VmaWxlLmFtOgorCSAgKiBleHQvc25kZmlsZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NvdW5kdG91Y2gvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zcGMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zd2ZkZWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC90YXJraW4vTWFrZWZpbGUuYW06CisJICAqIGV4dC90aGVvcmEvTWFrZWZpbGUuYW06CisJICAqIGV4dC90aW1pZGl0eS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3R3b2xhbWUvTWFrZWZpbGUuYW06CisJICAqIGV4dC94MjY0L01ha2VmaWxlLmFtOgorCSAgKiBleHQveGluZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3h2aWQvTWFrZWZpbGUuYW06CisJICAqIGdzdC1saWJzL2dzdC9hcHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC1saWJzL2dzdC9kc2hvdy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2FpZmZwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2FwcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvYnVmZmVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYmF5ZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9jZHhhcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9jaGFydC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2NvbG9yc3BhY2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kY2NwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWludGVybGFjZTIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kdmRzcHUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9mZXN0aXZhbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ZpbHRlci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ZsYWNwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2dhbWVzL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvaDI2NHBhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbGlicmZiL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbWl4bWF0cml4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbW9kcGx1Zy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21wZWcxc3lzL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZzR2aWRlb3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ2RlbXV4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ3RzbXV4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ3ZpZGVvcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tdmUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9uc2YvTWFrZWZpbGUuYW06CisJICAqIGdzdC9udXZkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L292ZXJsYXkvTWFrZWZpbGUuYW06CisJICAqIGdzdC9wYXNzdGhyb3VnaC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3BjYXBwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3BsYXlvbmRlbWFuZC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3Jhd3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcmVhbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0anBlZy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zY2FsZXRlbXBvL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc2RwL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc2VsZWN0b3IvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zbW9vdGgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zbW9vdGh3YXZlL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3BlZWQvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zcGVleHJlc2FtcGxlL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3RlcmVvL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3ViZW5jL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdHRhL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmJpZGVjL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9kcm9wL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9zaWduYWwvTWFrZWZpbGUuYW06CisJICAqIGdzdC92aXJ0dWFsZHViL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvdm1uYy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3k0bS9NYWtlZmlsZS5hbToKKwkgICogc3lzL2FjbWVuYy9NYWtlZmlsZS5hbToKKwkgICogc3lzL2Nkcm9tL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHNob3dkZWN3cmFwcGVyL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHNob3dzcmN3cmFwcGVyL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHZiL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHhyMy9NYWtlZmlsZS5hbToKKwkgICogc3lzL2ZiZGV2L01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3NzNC9NYWtlZmlsZS5hbToKKwkgICogc3lzL3FjYW0vTWFrZWZpbGUuYW06CisJICAqIHN5cy9xdHdyYXBwZXIvTWFrZWZpbGUuYW06CisJICAqIHN5cy92Y2QvTWFrZWZpbGUuYW06CisJICAqIHN5cy93aW5pbmV0L01ha2VmaWxlLmFtOgorCSAgKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBEb24ndCBpbnN0YWxsIHN0YXRpYyBsaWJzIGZvciBwbHVnaW5zLiBGaXhlcyAjNTUwODUxIGZvciAtYmFkLgorCisyMDA4LTA5LTE3IDEzOjU5OjIxICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgRml4IGNvbXBpbGVyIHdhcm5pbmdzIG9uIE9TL1gKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6IChqYWNrX3Byb2Nlc3NfY2IpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzogKGNhbGN1bGF0ZV9za2V3KToKKwkgIEZpeCBjb21waWxlciB3YXJuaW5ncyBvbiBPUy9YCisKKzIwMDgtMDgtMDcgMTM6MTU6MjEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6IFRyeSBjb21taXR0aW5nIHRoaXMgb25jZSBhZ2Fpbi4gTm93IHByb3Blcmx5IHJlbmFtZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICBUcnkgY29tbWl0dGluZyB0aGlzIG9uY2UgYWdhaW4uIE5vdyBwcm9wZXJseSByZW5hbWVkLgorCisyMDA4LTA4LTA3IDA5OjA5OjQ0ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGRvY3MvcGx1Z2lucy86IGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sCisJICBBZGQgbmV3IGVsZW1lbnQgdG8gZG9jcy4KKwkgICogZXh0L2phY2svZ3N0amFjay5oCisJICBBZGQgbWlzc2luZyBmaWxlLgorCSAgKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgICogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmg6CisJICBSZW5hbWUgamFja2F1ZGlvc3JjIHRvIGphY2tfYXVkaW9fc3JjLgorCisyMDA4LTA4LTA3IDA4OjQ3OjQwICswMDAwICBUcmlzdGFuIE1hdHRoZXdzIDx0cmlzdGFuQHNhdC5xYy5jYT4KKworCSAgZXh0L2phY2svOiBBZGQgYSBqYWNrYXVkaW9zcmMuIFJlZmFjdG9yIHNpbmsgc2xpZ2h0bHkgZm9yIGJldHRlciBjb2RlIHJldXNlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBwYXRjaCBieTogVHJpc3RhbiBNYXR0aGV3cyA8dHJpc3RhbkBzYXQucWMuY2E+CisJICAqIGV4dC9qYWNrL01ha2VmaWxlLmFtOgorCSAgKiBleHQvamFjay9nc3RqYWNrLmM6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5jOgorCSAgKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuaDoKKwkgICogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5oOgorCSAgKiBleHQvamFjay9nc3RqYWNrcmluZ2J1ZmZlci5oOgorCSAgQWRkIGEgamFja2F1ZGlvc3JjLiBSZWZhY3RvciBzaW5rIHNsaWdodGx5IGZvciBiZXR0ZXIgY29kZSByZXVzZS4KKwkgIEZpeGVzICM1NDUxOTcuCisKKzIwMDgtMDYtMTMgMTE6NTk6MjMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW15dGh0di54bWwKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5zaWduYWxzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxzYXNwZGlmLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFtcndiLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1iYXllci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1iejIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2RhdWRpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jZHhhcGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRzZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2Yi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdmRzcHUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmFhYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mYWFkLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZiZGV2c2luay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mZXN0aXZhbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1maWx0ZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2ZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZnJlZXplLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzbS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RpbnRlcmxhY2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oMjY0cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxhZHNwYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tZXRhZGF0YS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tbXMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9kcGx1Zy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tcGVnMmVuYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tcGVnNHZpZGVvcGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXBlZ3RzcGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXBlZ3ZpZGVvcGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVzZXBhY2sueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVzaWNicmFpbnoueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXZlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW15dGh0di54bWwKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hcy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uZW9uLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5zZmRlYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1udXZkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbAorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmF3cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVhbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJmYnNyYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zZGwueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2RwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNlbGVjdG9yLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNuZGZpbGUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291bmR0b3VjaC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGNkZWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZWQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXhyZXNhbXBsZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zdGVyZW8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3ViZW5jLnhtbAorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGltaWRpdHkueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdHRhLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZjZHNyYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb3NpZ25hbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12bW5jLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdpbGRtaWRpLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXgyNjQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teHZpZC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSAgKiBleHQvYW1yd2IvZ3N0YW1yd2JkZWMuYzoKKwkgICogZXh0L2FtcndiL2dzdGFtcndiZW5jLmM6CisJICAqIGV4dC9hbXJ3Yi9nc3RhbXJ3YnBhcnNlLmM6CisJICAqIGV4dC9kYzEzOTQvZ3N0ZGMxMzk0LmM6CisJICAqIGV4dC9kaXJlY3RmYi9kZmJ2aWRlb3NpbmsuYzoKKwkgICogZXh0L2l2b3JiaXMvdm9yYmlzZGVjLmM6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkgICogZXh0L21wZWcyZW5jL2dzdG1wZWcyZW5jLmNjOgorCSAgKiBleHQvbXBsZXgvZ3N0bXBsZXguY2M6CisJICAqIGV4dC9tdXNpY2JyYWluei9nc3R0cm0uYzoKKwkgICogZXh0L215dGh0di9nc3RteXRodHZzcmMuYzoKKwkgICogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzoKKwkgICogZXh0L3RpbWlkaXR5L2dzdHRpbWlkaXR5LmM6CisJICAqIGV4dC90aW1pZGl0eS9nc3R3aWxkbWlkaS5jOgorCSAgKiBnc3QtbGlicy9nc3QvYXBwL2dzdGFwcHNpbmsuYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICAqIGdzdC9kdmRzcHUvZ3N0ZHZkc3B1LmM6CisJICAqIGdzdC9mZXN0aXZhbC9nc3RmZXN0aXZhbC5jOgorCSAgKiBnc3QvZnJlZXplL2dzdGZyZWV6ZS5jOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkgICogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSAgKiBnc3QvbW9kcGx1Zy9nc3Rtb2RwbHVnLmNjOgorCSAgKiBnc3QvbnV2ZGVtdXgvZ3N0bnV2ZGVtdXguYzoKKwkgIEFkZCBtaXNzaW5nIGVsZW1lbnRzIHRvIGRvY3MuIEZpeCBkb2MtbWFya3VwOiB1c2UgY29udmluaWVuY2Ugc3ludGF4CisJICBmb3IgZXhhbXBsZXMgKHByb2R1Y2VzIHZhbGlkIGRvY2Jvb2spLCBhZGQgc2V2ZXJhbCByZWZzZWMyIHdoZW4gd2UKKwkgIGhhdmUgc2V2ZXJhbCB0aXRsZXMuIEZpeCBzb21lIHR5cGVzLgorCisyMDA4LTA2LTEyIDE0OjQ5OjE4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIERvIG5vdCB1c2Ugc2hvcnRfZGVzY3JpcHRpb24gaW4gc2VjdGlvbiBkb2NzIGZvciBlbGVtZW50cy4gV2UgZXh0cmFjdCB0aGVtIGZyb20gZWxlbWVudCBkZXRhaWxzIGFuZCB0aGVyZSB3aWxsIGJlIHdhci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9kYzEzOTQvZ3N0ZGMxMzk0LmM6CisJICAqIGV4dC9pdm9yYmlzL3ZvcmJpc2RlYy5jOgorCSAgKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJICAqIGV4dC9tZXRhZGF0YS9nc3RtZXRhZGF0YWRlbXV4LmM6CisJICAqIGV4dC9teXRodHYvZ3N0bXl0aHR2c3JjLmM6CisJICAqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6CisJICAqIGdzdC1saWJzL2dzdC9hcHAvZ3N0YXBwc2luay5jOgorCSAgKiBnc3QvYmF5ZXIvZ3N0YmF5ZXIycmdiLmM6CisJICAqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgKiBnc3QvcmF3cGFyc2UvZ3N0YXVkaW9wYXJzZS5jOgorCSAgKiBnc3QvcmF3cGFyc2UvZ3N0dmlkZW9wYXJzZS5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwY2xpZW50LmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICAqIGdzdC9zZWxlY3Rvci9nc3RpbnB1dHNlbGVjdG9yLmM6CisJICAqIGdzdC9zZWxlY3Rvci9nc3RvdXRwdXRzZWxlY3Rvci5jOgorCSAgKiBnc3QvdmlkZW9zaWduYWwvZ3N0dmlkZW9hbmFseXNlLmM6CisJICAqIGdzdC92aWRlb3NpZ25hbC9nc3R2aWRlb2RldGVjdC5jOgorCSAgKiBnc3QvdmlkZW9zaWduYWwvZ3N0dmlkZW9tYXJrLmM6CisJICAqIHN5cy9vc3M0L29zczQtbWl4ZXIuYzoKKwkgICogc3lzL29zczQvb3NzNC1zaW5rLmM6CisJICAqIHN5cy9vc3M0L29zczQtc291cmNlLmM6CisJICBEbyBub3QgdXNlIHNob3J0X2Rlc2NyaXB0aW9uIGluIHNlY3Rpb24gZG9jcyBmb3IgZWxlbWVudHMuIFdlIGV4dHJhY3QKKwkgIHRoZW0gZnJvbSBlbGVtZW50IGRldGFpbHMgYW5kIHRoZXJlIHdpbGwgYmUgd2FybmluZ3MgaWYgdGhleSBkaWZmZXIuCisJICBBbHNvIGZpeGluZyB1cCB0aGUgQ2hhbmdlTG9nIG9yZGVyLgorCisyMDA4LTA1LTI2IDE3OjUyOjIxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6IEluY2x1ZGUgdGhlIGVsZW1lbnQgbmFtZSBpbiB0aGUgcG9ydCBuYW1lIHRvIGF2b2lkIGR1cGxpY2F0ZSBwb3J0IG5hbWVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkgIChnc3RfamFja19hdWRpb19zaW5rX2FsbG9jYXRlX2NoYW5uZWxzKToKKwkgIEluY2x1ZGUgdGhlIGVsZW1lbnQgbmFtZSBpbiB0aGUgcG9ydCBuYW1lIHRvIGF2b2lkIGR1cGxpY2F0ZSBwb3J0IG5hbWVzLgorCisyMDA4LTA0LTA2IDIwOjE4OjE2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6IFdvcmsgYXJvdW5kIG1pc3NpbmcgYml0cyBvZiB0aHJlYWQtc2FmZXR5IG9uIG9sZGVyIEdMaWJzIHNvbWUgbW9yZSB0byBhdm9pZCBhc3NlcnRpb25zIHcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6IChnc3RfamFja19hdWRpb19zaW5rX2NsYXNzX2luaXQpOgorCSAgV29yayBhcm91bmQgbWlzc2luZyBiaXRzIG9mIHRocmVhZC1zYWZldHkgb24gb2xkZXIgR0xpYnMgc29tZQorCSAgbW9yZSB0byBhdm9pZCBhc3NlcnRpb25zIHdoZW4gc3RhcnRpbmcgdXAgbXVsdGlwbGUgcGxheWJpbgorCSAgb2JqZWN0cyBjb25jdXJyZW50bHkgKHNlZSAjNTEyMzgyKS4KKworMjAwOC0wMy0xMyAxNDoyNToyMCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBVc2UgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUgYW5kIEdTVF9QQUNLQUdFX09SSUdJTiBpbnN0ZWFkIG9mIGhhcmRjb2RpbmcgdmFsdWVzIHdoZXJlIHBvc3NpYmxlLiBGaXhlcyBidWcgIzUyMjIxMi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYWxzYXNwZGlmL2Fsc2FzcGRpZnNpbmsuYzoKKwkgICogZXh0L2dzbS9nc3Rnc20uYzoKKwkgICogZXh0L2phY2svZ3N0amFjay5jOgorCSAgKiBleHQvbGlibW1zL2dzdG1tcy5jOgorCSAgKiBleHQvbmVvbi9nc3RuZW9uaHR0cHNyYy5jOgorCSAgKiBleHQvc2hvdXQvZ3N0c2hvdXQuYzoKKwkgICogZXh0L3RpbWlkaXR5L2dzdHRpbWlkaXR5LmM6CisJICAqIGV4dC90aW1pZGl0eS9nc3R3aWxkbWlkaS5jOgorCSAgKiBnc3QvbnV2ZGVtdXgvZ3N0bnV2ZGVtdXguYzoKKwkgICogZ3N0L3R0YS9nc3R0dGEuYzoKKwkgIFVzZSBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSBhbmQgR1NUX1BBQ0tBR0VfT1JJR0lOIGluc3RlYWQKKwkgIG9mIGhhcmRjb2RpbmcgdmFsdWVzIHdoZXJlIHBvc3NpYmxlLiBGaXhlcyBidWcgIzUyMjIxMi4KKworMjAwNy0wNy0xOCAwNzo0Mjo0NyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6IEFkZCBzdGRsaWIgaW5jbHVkZSBoZXJlIHRvby4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6IChnc3RfamFja19yaW5nX2J1ZmZlcl9vcGVuX2RldmljZSksCisJICAoZ3N0X2phY2tfcmluZ19idWZmZXJfYWNxdWlyZSk6CisJICBBZGQgc3RkbGliIGluY2x1ZGUgaGVyZSB0b28uCisKKzIwMDctMDQtMDQgMDc6MzY6MjggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOiBUcnkgdCBiZXR0ZXIgbmFtZSBjbGllbnRzLiBwcm9wZXJseSBoYW5kbGUgcmV0dXJuIGNvZGVzIHdoZW4gcmUtIGVzdGFibGlzaGluZyBsaW5rcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6IChnc3RfamFja19yaW5nX2J1ZmZlcl9vcGVuX2RldmljZSksCisJICAoZ3N0X2phY2tfcmluZ19idWZmZXJfYWNxdWlyZSk6CisJICBUcnkgdCBiZXR0ZXIgbmFtZSBjbGllbnRzLiBwcm9wZXJseSBoYW5kbGUgcmV0dXJuIGNvZGVzIHdoZW4gcmUtCisJICBlc3RhYmxpc2hpbmcgbGlua3MuCisKKzIwMDctMDMtMTggMTc6NTc6NDggKzAwMDAgIFBhdWwgRGF2aXMgPHBhdWxAbGludXhhdWRpb3N5c3RlbXMuY29tPgorCisJICBleHQvamFjay9nc3RqYWNrYXVkaW9jbGllbnQuYzogRG9uJ3QgbmVlZCB0byB0YWtlIHRoZSBjb25uZWN0aW9uIGxvY2ssIGl0IHdpbGwgbm90IGJlIHVzZWQgYW5kIGNvdWxkIGNhdXNlIGRlYWRsb2Nrcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IFBhdWwgRGF2aXMgPHBhdWwgYXQgbGludXhhdWRpb3N5c3RlbXMgZG90IGNvbT4KKwkgICogZXh0L2phY2svZ3N0amFja2F1ZGlvY2xpZW50LmM6IChnc3RfamFja19hdWRpb191bnJlZl9jb25uZWN0aW9uKToKKwkgIERvbid0IG5lZWQgdG8gdGFrZSB0aGUgY29ubmVjdGlvbiBsb2NrLCBpdCB3aWxsIG5vdCBiZSB1c2VkIGFuZCBjb3VsZAorCSAgY2F1c2UgZGVhZGxvY2tzLgorCisyMDA3LTAzLTA4IDE1OjI0OjUyICswMDAwICBQYXVsIERhdmlzIDxwYXVsQGxpbnV4YXVkaW9zeXN0ZW1zLmNvbT4KKworCSAgZXh0L2phY2svOiBNYWtlIGFuIG9iamVjdCB0byBtYW5hZ2UgY2xpZW50IGNvbm5lY3Rpb25zIHRvIHRoZSBqYWNrIHNlcnZlciB3aGljaCB3ZSB3aWxsIHVzZSBpbiB0aGUgZnV0dXJlIHRvIHJ1biBzZWxlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEluY2x1ZGVzIHBhdGNoIGJ5OiBQYXVsIERhdmlzIDxwYXVsIGF0IGxpbnV4YXVkaW9zeXN0ZW1zIGRvdCBjb20+CisJICAqIGV4dC9qYWNrL01ha2VmaWxlLmFtOgorCSAgKiBleHQvamFjay9nc3RqYWNrYXVkaW9jbGllbnQuYzogKGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9pbml0KSwKKwkgIChqYWNrX3Byb2Nlc3NfY2IpLCAoamFja19zYW1wbGVfcmF0ZV9jYiksIChqYWNrX2J1ZmZlcl9zaXplX2NiKSwKKwkgIChqYWNrX3NodXRkb3duX2NiKSwgKGNvbm5lY3Rpb25fZmluZCksCisJICAoZ3N0X2phY2tfYXVkaW9fbWFrZV9jb25uZWN0aW9uKSwgKGdzdF9qYWNrX2F1ZGlvX2dldF9jb25uZWN0aW9uKSwKKwkgIChnc3RfamFja19hdWRpb191bnJlZl9jb25uZWN0aW9uKSwKKwkgIChnc3RfamFja19hdWRpb19jb25uZWN0aW9uX2FkZF9jbGllbnQpLAorCSAgKGdzdF9qYWNrX2F1ZGlvX2Nvbm5lY3Rpb25fcmVtb3ZlX2NsaWVudCksCisJICAoZ3N0X2phY2tfYXVkaW9fY2xpZW50X25ldyksIChnc3RfamFja19hdWRpb19jbGllbnRfZnJlZSksCisJICAoZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF9jbGllbnQpLAorCSAgKGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9zZXRfYWN0aXZlKToKKwkgICogZXh0L2phY2svZ3N0amFja2F1ZGlvY2xpZW50Lmg6CisJICBNYWtlIGFuIG9iamVjdCB0byBtYW5hZ2UgY2xpZW50IGNvbm5lY3Rpb25zIHRvIHRoZSBqYWNrIHNlcnZlciB3aGljaCB3ZQorCSAgd2lsbCB1c2UgaW4gdGhlIGZ1dHVyZSB0byBydW4gc2VsZWN0ZWQgamFjayBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIGphY2sKKwkgIGNvbm5lY3Rpb24uCisJICBNYWtlIHNvbWUgc3R1ZmYgYSBiaXQgbW9yZSB0aHJlYWRzYWZlLgorCSAgQWN0aXZhdGUgdGhlIGphY2sgY2xpZW50IEFTQVAuCisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkgIChnc3RfamFja19hdWRpb19zaW5rX2FsbG9jYXRlX2NoYW5uZWxzKSwKKwkgIChnc3RfamFja19hdWRpb19zaW5rX2ZyZWVfY2hhbm5lbHMpLCAoamFja19wcm9jZXNzX2NiKSwKKwkgIChnc3RfamFja19yaW5nX2J1ZmZlcl9vcGVuX2RldmljZSksCisJICAoZ3N0X2phY2tfcmluZ19idWZmZXJfY2xvc2VfZGV2aWNlKSwKKwkgIChnc3RfamFja19yaW5nX2J1ZmZlcl9hY3F1aXJlKSwgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX3JlbGVhc2UpLAorCSAgKGdzdF9qYWNrX2F1ZGlvX3NpbmtfY2xhc3NfaW5pdCksIChnc3RfamFja19hdWRpb19zaW5rX2luaXQpLAorCSAgKGdzdF9qYWNrX2F1ZGlvX3NpbmtfZ2V0Y2Fwcyk6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuaDoKKwkgIFVzZSBuZXcgY2xpZW50IG9iamVjdCB0byBtYW5hZ2UgY29ubmVjdGlvbnMuCisJICBEb24ndCByZW1vdmUgYW5kIHJlY3JlYXRlIGFsbCBwb3J0cywgdHJ5IHRvIHJldXNlIHRoZW0uCisKKzIwMDctMDEtMTIgMTA6MjU6NDAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuKjogSW1wcm92ZSBkb2NzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzogKGphY2tfc2FtcGxlX3JhdGVfY2IpLAorCSAgKGphY2tfYnVmZmVyX3NpemVfY2IpLCAoamFja19zaHV0ZG93bl9jYiksCisJICAoZ3N0X2phY2tfcmluZ19idWZmZXJfYWNxdWlyZSk6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuaDoKKwkgIEltcHJvdmUgZG9jcy4KKworMjAwNi0xMi0wNiAxNjo1NzoxNyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGV4dC9qYWNrLy5jdnNpZ25vcmU6IElnbm9yZSBvbGQgZmlsZXMgYXMgcmVxdWVzdGVkIGJ5IHRoZSBidWlsZCBzbGF2ZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvamFjay8uY3ZzaWdub3JlOgorCSAgSWdub3JlIG9sZCBmaWxlcyBhcyByZXF1ZXN0ZWQgYnkgdGhlIGJ1aWxkIHNsYXZlLgorCisyMDA2LTExLTMwIDExOjU5OjA0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvTWFrZWZpbGUuYW06IEZpeCBidWlsZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvTWFrZWZpbGUuYW06CisJICBGaXggYnVpbGQuCisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzogKGphY2tfcHJvY2Vzc19jYiksCisJICAoamFja19zYW1wbGVfcmF0ZV9jYiksIChqYWNrX2J1ZmZlcl9zaXplX2NiKSwgKGphY2tfc2h1dGRvd25fY2IpLAorCSAgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX2FjcXVpcmUpOgorCSAgU21hbGwgY2xlYW51cHMuCisKKzIwMDYtMTEtMzAgMTE6NDk6MzYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIEFkZGVkIGZ1bGx5IGZ1bmN0aW9uYWwgamFja2F1ZGlvc2luay4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGV4dC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2phY2svTWFrZWZpbGUuYW06CisJICAqIGV4dC9qYWNrL2dzdGphY2suYzogKHBsdWdpbl9pbml0KToKKwkgICogZXh0L2phY2svZ3N0amFjay5oOgorCSAgKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6IChnc3RfamFja19yaW5nX2J1ZmZlcl9nZXRfdHlwZSksCisJICAoZ3N0X2phY2tfcmluZ19idWZmZXJfY2xhc3NfaW5pdCksIChqYWNrX3Byb2Nlc3NfY2IpLAorCSAgKGphY2tfc2FtcGxlX3JhdGVfY2IpLCAoamFja19idWZmZXJfc2l6ZV9jYiksIChqYWNrX3NodXRkb3duX2NiKSwKKwkgIChnc3RfamFja19yaW5nX2J1ZmZlcl9pbml0KSwgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX2Rpc3Bvc2UpLAorCSAgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX2ZpbmFsaXplKSwKKwkgIChnc3RfamFja19yaW5nX2J1ZmZlcl9vcGVuX2RldmljZSksCisJICAoZ3N0X2phY2tfcmluZ19idWZmZXJfY2xvc2VfZGV2aWNlKSwKKwkgIChnc3RfamFja19yaW5nX2J1ZmZlcl9hY3F1aXJlKSwgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX3JlbGVhc2UpLAorCSAgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX3N0YXJ0KSwgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX3BhdXNlKSwKKwkgIChnc3RfamFja19yaW5nX2J1ZmZlcl9zdG9wKSwgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX2RlbGF5KSwKKwkgIChnc3RfamFja19jb25uZWN0X2dldF90eXBlKSwgKGdzdF9qYWNrX2F1ZGlvX3NpbmtfYmFzZV9pbml0KSwKKwkgIChnc3RfamFja19hdWRpb19zaW5rX2NsYXNzX2luaXQpLCAoZ3N0X2phY2tfYXVkaW9fc2lua19pbml0KSwKKwkgIChnc3RfamFja19hdWRpb19zaW5rX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2phY2tfYXVkaW9fc2lua19nZXRfcHJvcGVydHkpLCAoZ3N0X2phY2tfYXVkaW9fc2lua19nZXRjYXBzKSwKKwkgIChnc3RfamFja19hdWRpb19zaW5rX2NyZWF0ZV9yaW5nYnVmZmVyKToKKwkgICogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5oOgorCSAgQWRkZWQgZnVsbHkgZnVuY3Rpb25hbCBqYWNrYXVkaW9zaW5rLgorCisyMDA2LTA0LTA4IDIxOjQ4OjAxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIEZpeCAjMzM3MzY1IChnX3R5cGVfY2xhc3NfcmVmIDwtPiBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2FtcndiL2dzdGFtcndiZGVjLmM6IChnc3RfYW1yd2JkZWNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9hbXJ3Yi9nc3RhbXJ3YmVuYy5jOiAoZ3N0X2FtcndiZW5jX2NsYXNzX2luaXQpOgorCSAgKiBleHQvYW1yd2IvZ3N0YW1yd2JwYXJzZS5jOiAoZ3N0X2FtcndicGFyc2VfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9hcnRzL2dzdF9hcnRzLmM6IChnc3RfYXJ0c19jbGFzc19pbml0KToKKwkgICogZXh0L2FydHNkL2dzdGFydHNkc2luay5jOiAoZ3N0X2FydHNkc2lua19jbGFzc19pbml0KToKKwkgICogZXh0L2F1ZGlvZmlsZS9nc3RhZnNpbmsuYzogKGdzdF9hZnNpbmtfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzcmMuYzogKGdzdF9hZnNyY19jbGFzc19pbml0KToKKwkgICogZXh0L2F1ZGlvcmVzYW1wbGUvZ3N0YXVkaW9yZXNhbXBsZS5jOgorCSAgKiBleHQvY2RhdWRpby9nc3RjZGF1ZGlvLmM6IChnc3RfY2RhdWRpb19jbGFzc19pbml0KToKKwkgICogZXh0L2RpcmVjdGZiL2RmYnZpZGVvc2luay5jOiAoZ3N0X2RmYnZpZGVvc2lua19jbGFzc19pbml0KToKKwkgICogZXh0L2RpdngvZ3N0ZGl2eGRlYy5jOiAoZ3N0X2RpdnhkZWNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9oZXJtZXMvZ3N0aGVybWVzY29sb3JzcGFjZS5jOgorCSAgKGdzdF9oZXJtZXNfY29sb3JzcGFjZV9jbGFzc19pbml0KToKKwkgICogZXh0L2l2b3JiaXMvdm9yYmlzZmlsZS5jOiAoZ3N0X2l2b3JiaXNmaWxlX2NsYXNzX2luaXQpOgorCSAgKiBleHQvamFjay9nc3RqYWNrLmM6IChnc3RfamFja19jbGFzc19pbml0KToKKwkgICogZXh0L2phY2svZ3N0amFja2Jpbi5jOiAoZ3N0X2phY2tfYmluX2NsYXNzX2luaXQpOgorCSAgKiBleHQvbGNzL2dzdGNvbG9yc3BhY2UuYzogKGdzdF9jb2xvcnNwYWNlX2NsYXNzX2luaXQpOgorCSAgKiBleHQvbGliZmFtZS9nc3RsaWJmYW1lLmM6IChnc3RfZmFtZWVuY19jbGFzc19pbml0KToKKwkgICogZXh0L211c2ljYnJhaW56L2dzdHRybS5jOiAoZ3N0X211c2ljYnJhaW56X2NsYXNzX2luaXQpOgorCSAgKiBleHQvbmFzL25hc3NpbmsuYzogKGdzdF9uYXNzaW5rX2NsYXNzX2luaXQpOgorCSAgKiBleHQvc2hvdXQvZ3N0c2hvdXQuYzogKGdzdF9pY2VjYXN0c2VuZF9jbGFzc19pbml0KToKKwkgICogZXh0L3NuYXBzaG90L2dzdHNuYXBzaG90LmM6IChnc3Rfc25hcHNob3RfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9zbmRmaWxlL2dzdHNmLmM6IChnc3Rfc2ZfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9zd2ZkZWMvZ3N0c3dmZGVjLmM6IChnc3Rfc3dmZGVjYnVmZmVyX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zd2ZkZWNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC90YXJraW4vZ3N0dGFya2luZGVjLmM6IChnc3RfdGFya2luZGVjX2NsYXNzX2luaXQpOgorCSAgKiBleHQvdGFya2luL2dzdHRhcmtpbmVuYy5jOiAoZ3N0X3RhcmtpbmVuY19jbGFzc19pbml0KToKKwkgICogZ3N0L2NkeGFwYXJzZS9nc3RjZHhhc3RyaXAuYzogKGdzdF9jZHhhc3RyaXBfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9jaGFydC9nc3RjaGFydC5jOiAoZ3N0X2NoYXJ0X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvY29sb3JzcGFjZS9nc3Rjb2xvcnNwYWNlLmM6IChnc3RfY29sb3JzcGFjZV9jbGFzc19pbml0KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6IChnc3RfZGVpbnRlcmxhY2VfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9mZXN0aXZhbC9nc3RmZXN0aXZhbC5jOiAoZ3N0X2Zlc3RpdmFsX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYzogKGdzdF9icHdzaW5jX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZmlsdGVyL2dzdGlpci5jOiAoZ3N0X2lpcl9jbGFzc19pbml0KToKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6IChnc3RfbHB3c2luY19jbGFzc19pbml0KToKKwkgICogZ3N0L2xpYnJmYi9nc3RyZmJzcmMuYzogKGdzdF9yZmJzcmNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9taXhtYXRyaXgvbWl4bWF0cml4LmM6IChnc3RfbWl4bWF0cml4X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvbXBlZzFzeXMvZ3N0bXBlZzFzeXN0ZW1lbmNvZGUuYzoKKwkgIChnc3Rfc3lzdGVtX2VuY29kZV9jbGFzc19pbml0KToKKwkgICogZ3N0L21wZWcxdmlkZW9wYXJzZS9nc3RtcDF2aWRlb3BhcnNlLmM6CisJICAoZ3N0X21wMXZpZGVvcGFyc2VfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9tcGVnMnN1Yi9nc3RtcGVnMnN1YnQuYzogKGdzdF9tcGVnMnN1YnRfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9tcGVnYXVkaW9wYXJzZS9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSAgKGdzdF9tcDNwYXJzZV9jbGFzc19pbml0KToKKwkgICogZ3N0L292ZXJsYXkvZ3N0b3ZlcmxheS5jOiAoZ3N0X292ZXJsYXlfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9wYXNzdGhyb3VnaC9nc3RwYXNzdGhyb3VnaC5jOiAocGFzc3Rocm91Z2hfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9wbGF5b25kZW1hbmQvZ3N0cGxheW9uZGVtYW5kLmM6IChwbGF5X29uX2RlbWFuZF9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0anBlZy9nc3RydGpwZWdkZWMuYzogKGdzdF9ydGpwZWdkZWNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydGpwZWcvZ3N0cnRqcGVnZW5jLmM6IChnc3RfcnRqcGVnZW5jX2NsYXNzX2luaXQpOgorCSAgKiBnc3Qvc21vb3RoL2dzdHNtb290aC5jOiAoZ3N0X3Ntb290aF9jbGFzc19pbml0KToKKwkgICogZ3N0L3Ntb290aHdhdmUvZ3N0c21vb3Rod2F2ZS5jOiAoZ3N0X3Ntb290aHdhdmVfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX2NsYXNzX2luaXQpOgorCSAgKiBnc3Qvc3RlcmVvL2dzdHN0ZXJlby5jOiAoZ3N0X3N0ZXJlb19jbGFzc19pbml0KToKKwkgICogZ3N0L3N3aXRjaC9nc3Rzd2l0Y2guYzogKGdzdF9zd2l0Y2hfY2xhc3NfaW5pdCk6CisJICAqIGdzdC90dGEvZ3N0dHRhZGVjLmM6IChnc3RfdHRhX2RlY19jbGFzc19pbml0KToKKwkgICogZ3N0L3R0YS9nc3R0dGFwYXJzZS5jOiAoZ3N0X3R0YV9wYXJzZV9jbGFzc19pbml0KToKKwkgICogZ3N0L3ZiaWRlYy9nc3R2YmlkZWMuYzogKGdzdF92YmlkZWNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6IChnc3RfdmlkZW9fY3JvcF9jbGFzc19pbml0KToKKwkgICogZ3N0L3ZpcnR1YWxkdWIvZ3N0eHNoYXJwZW4uYzogKGdzdF94c2hhcnBlbl9jbGFzc19pbml0KToKKwkgICogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzogKGdzdF95NG1lbmNvZGVfY2xhc3NfaW5pdCk6CisJICAqIHN5cy9jZHJvbS9nc3RjZHBsYXllci5jOiAoY2RwbGF5ZXJfY2xhc3NfaW5pdCk6CisJICAqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIChnc3RfZGlyZWN0c291bmRzaW5rX2NsYXNzX2luaXQpOgorCSAgKiBzeXMvZHhyMy9keHIzYXVkaW9zaW5rLmM6IChkeHIzYXVkaW9zaW5rX2NsYXNzX2luaXQpOgorCSAgKiBzeXMvZHhyMy9keHIzc3B1c2luay5jOiAoZHhyM3NwdXNpbmtfY2xhc3NfaW5pdCk6CisJICAqIHN5cy9keHIzL2R4cjN2aWRlb3NpbmsuYzogKGR4cjN2aWRlb3NpbmtfY2xhc3NfaW5pdCk6CisJICAqIHN5cy9xY2FtL2dzdHFjYW1zcmMuYzogKGdzdF9xY2Ftc3JjX2NsYXNzX2luaXQpOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmM6CisJICAoZ3N0X3Y0bDJfY29sb3JfYmFsYW5jZV9jaGFubmVsX2NsYXNzX2luaXQpOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuYzogKGdzdF92NGwyX3R1bmVyX2NoYW5uZWxfY2xhc3NfaW5pdCksCisJICAoZ3N0X3Y0bDJfdHVuZXJfbm9ybV9jbGFzc19pbml0KToKKwkgICogc3lzL3hpbWFnZXNyYy94aW1hZ2VzcmMuYzogKGdzdF94aW1hZ2VzcmNfY2xhc3NfaW5pdCk6CisJICBGaXggIzMzNzM2NSAoZ190eXBlX2NsYXNzX3JlZiA8LT4gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50KQorCisyMDA2LTA0LTAxIDEwOjA5OjExICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSAgcmV3b3JrIGJ1aWxkOyBhZGQgdHJhbnNsYXRpb25zIGZvciB2NGwyCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJld29yayBidWlsZDsgYWRkIHRyYW5zbGF0aW9ucyBmb3IgdjRsMgorCisyMDA1LTEwLTEyIDE0OjI5OjU1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHJlbmFtZWQgR1NUX0ZMQUdTIG1hY3JvcyB0byBHU1RfT0JKRUNUX0ZMQUdTIG1vdmVkIGJpdHNoaWZ0IGZyb20gbWFjcm8gdG8gZW51bSBkZWZpbml0aW9uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXhhbXBsZXMvaW5kZXhpbmcvaW5kZXhtcGVnLmM6IChtYWluKToKKwkgICogZXh0L2FydHNkL2dzdGFydHNkc2luay5jOiAoZ3N0X2FydHNkc2lua19vcGVuX2F1ZGlvKSwKKwkgIChnc3RfYXJ0c2RzaW5rX2Nsb3NlX2F1ZGlvKSwgKGdzdF9hcnRzZHNpbmtfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2FydHNkL2dzdGFydHNkc2luay5oOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmcGFyc2UuYzogKGdzdF9hZnBhcnNlX29wZW5fZmlsZSksCisJICAoZ3N0X2FmcGFyc2VfY2xvc2VfZmlsZSk6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZwYXJzZS5oOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmc2luay5jOiAoZ3N0X2Fmc2lua19vcGVuX2ZpbGUpLAorCSAgKGdzdF9hZnNpbmtfY2xvc2VfZmlsZSksIChnc3RfYWZzaW5rX2NoYWluKSwKKwkgIChnc3RfYWZzaW5rX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzaW5rLmg6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzcmMuYzogKGdzdF9hZnNyY19vcGVuX2ZpbGUpLAorCSAgKGdzdF9hZnNyY19jbG9zZV9maWxlKSwgKGdzdF9hZnNyY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmc3JjLmg6CisJICAqIGV4dC9jZGF1ZGlvL2dzdGNkYXVkaW8uYzogKGdzdF9jZGF1ZGlvX2luaXQpOgorCSAgKiBleHQvZGlyZWN0ZmIvZGlyZWN0ZmJ2aWRlb3NpbmsuYzogKGdzdF9kaXJlY3RmYnZpZGVvc2lua19pbml0KToKKwkgICogZXh0L2R0cy9nc3RkdHNkZWMuYzogKGdzdF9kdHNkZWNfaW5pdCk6CisJICAqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkgICogZXh0L2phY2svZ3N0amFja2Jpbi5jOiAoZ3N0X2phY2tfYmluX2luaXQpLAorCSAgKGdzdF9qYWNrX2Jpbl9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvbXVzZXBhY2svZ3N0bXVzZXBhY2tkZWMuYzogKGdzdF9tdXNlcGFja2RlY19pbml0KToKKwkgICogZXh0L211c2ljYnJhaW56L2dzdHRybS5jOiAoZ3N0X211c2ljYnJhaW56X2luaXQpOgorCSAgKiBleHQvbmFzL25hc3NpbmsuYzogKGdzdF9uYXNzaW5rX29wZW5fYXVkaW8pLAorCSAgKGdzdF9uYXNzaW5rX2Nsb3NlX2F1ZGlvKSwgKGdzdF9uYXNzaW5rX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9uYXMvbmFzc2luay5oOgorCSAgKiBleHQvcG9seXAvcG9seXBzaW5rLmM6IChnc3RfcG9seXBzaW5rX2luaXQpOgorCSAgKiBleHQvc2RsL3NkbHZpZGVvc2luay5jOiAoZ3N0X3NkbHZpZGVvc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvc2RsL3NkbHZpZGVvc2luay5oOgorCSAgKiBleHQvc21vb3Rod2F2ZS9nc3RzbW9vdGh3YXZlLmM6IChnc3Rfc21vb3Rod2F2ZV9pbml0KToKKwkgICogZXh0L3NuZGZpbGUvZ3N0c2YuYzogKGdzdF9zZl9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9zZl9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3NmX3JlbGVhc2VfcmVxdWVzdF9wYWQpLAorCSAgKGdzdF9zZl9vcGVuX2ZpbGUpLCAoZ3N0X3NmX2Nsb3NlX2ZpbGUpLCAoZ3N0X3NmX2xvb3ApOgorCSAgKiBleHQvc25kZmlsZS9nc3RzZi5oOgorCSAgKiBleHQvc3dmZGVjL2dzdHN3ZmRlYy5jOiAoZ3N0X3N3ZmRlY19pbml0KToKKwkgICogZXh0L3Rhcmtpbi9nc3R0YXJraW5kZWMuYzogKGdzdF90YXJraW5kZWNfaW5pdCk6CisJICAqIGdzdC9hcGV0YWcvYXBlZGVtdXguYzogKGdzdF9hcGVfZGVtdXhfaW5pdCk6CisJICAqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXBhcnNlLmM6IChnc3RfY2R4YXBhcnNlX2luaXQpOgorCSAgKiBnc3QvY2R4YXBhcnNlL2dzdGNkeGFzdHJpcC5jOiAoZ3N0X2NkeGFzdHJpcF9pbml0KToKKwkgICogZ3N0L2Zlc3RpdmFsL2dzdGZlc3RpdmFsLmM6IChnc3RfZmVzdGl2YWxfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L2Zlc3RpdmFsL2dzdGZlc3RpdmFsLmg6CisJICAqIGdzdC9tcGVnMnN1Yi9nc3RtcGVnMnN1YnQuYzogKGdzdF9tcGVnMnN1YnRfaW5pdCk6CisJICAqIGdzdC9tdWx0aWZpbGVzaW5rL2dzdG11bHRpZmlsZXNpbmsuYzogKGdzdF9tdWx0aWZpbGVzaW5rX2luaXQpLAorCSAgKGdzdF9tdWx0aWZpbGVzaW5rX3NldF9sb2NhdGlvbiksIChnc3RfbXVsdGlmaWxlc2lua19vcGVuX2ZpbGUpLAorCSAgKGdzdF9tdWx0aWZpbGVzaW5rX2Nsb3NlX2ZpbGUpLCAoZ3N0X211bHRpZmlsZXNpbmtfbmV4dF9maWxlKSwKKwkgIChnc3RfbXVsdGlmaWxlc2lua19wYWRfcXVlcnkpLCAoZ3N0X211bHRpZmlsZXNpbmtfaGFuZGxlX2V2ZW50KSwKKwkgIChnc3RfbXVsdGlmaWxlc2lua19jaGFpbiksIChnc3RfbXVsdGlmaWxlc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvbXVsdGlmaWxlc2luay9nc3RtdWx0aWZpbGVzaW5rLmg6CisJICAqIGdzdC92aWRlb2Ryb3AvZ3N0dmlkZW9kcm9wLmM6IChnc3RfdmlkZW9kcm9wX2luaXQpOgorCSAgKiBzeXMvY2Ryb20vZ3N0Y2RwbGF5ZXIuYzogKGNkcGxheWVyX2luaXQpOgorCSAgKiBzeXMvZHhyMy9keHIzYXVkaW9zaW5rLmM6IChkeHIzYXVkaW9zaW5rX2luaXQpLAorCSAgKGR4cjNhdWRpb3Npbmtfb3BlbiksIChkeHIzYXVkaW9zaW5rX2Nsb3NlKSwKKwkgIChkeHIzYXVkaW9zaW5rX2NoYWluX3BjbSksIChkeHIzYXVkaW9zaW5rX2NoYWluX2FjMyksCisJICAoZHhyM2F1ZGlvc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBzeXMvZHhyMy9keHIzYXVkaW9zaW5rLmg6CisJICAqIHN5cy9keHIzL2R4cjNzcHVzaW5rLmM6IChkeHIzc3B1c2lua19pbml0KSwgKGR4cjNzcHVzaW5rX29wZW4pLAorCSAgKGR4cjNzcHVzaW5rX2Nsb3NlKSwgKGR4cjNzcHVzaW5rX2NoYWluKSwKKwkgIChkeHIzc3B1c2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBzeXMvZHhyMy9keHIzc3B1c2luay5oOgorCSAgKiBzeXMvZHhyMy9keHIzdmlkZW9zaW5rLmM6IChkeHIzdmlkZW9zaW5rX2luaXQpLAorCSAgKGR4cjN2aWRlb3Npbmtfb3BlbiksIChkeHIzdmlkZW9zaW5rX2Nsb3NlKSwKKwkgIChkeHIzdmlkZW9zaW5rX3dyaXRlX2RhdGEpLCAoZHhyM3ZpZGVvc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBzeXMvZHhyMy9keHIzdmlkZW9zaW5rLmg6CisJICAqIHN5cy9nbHNpbmsvZ2xpbWFnZXNpbmsuYzogKGdzdF9nbGltYWdlc2lua19pbml0KToKKwkgICogc3lzL3FjYW0vZ3N0cWNhbXNyYy5jOiAoZ3N0X3FjYW1zcmNfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcWNhbXNyY19vcGVuKSwgKGdzdF9xY2Ftc3JjX2Nsb3NlKToKKwkgICogc3lzL3FjYW0vZ3N0cWNhbXNyYy5oOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19pbml0KToKKwkgICogc3lzL3ZjZC92Y2RzcmMuYzogKGdzdF92Y2RzcmNfc2V0X3Byb3BlcnR5KSwgKGdzdF92Y2RzcmNfZ2V0KSwKKwkgIChnc3RfdmNkc3JjX29wZW5fZmlsZSksIChnc3RfdmNkc3JjX2Nsb3NlX2ZpbGUpLAorCSAgKGdzdF92Y2RzcmNfY2hhbmdlX3N0YXRlKSwgKGdzdF92Y2RzcmNfcmVjYWxjdWxhdGUpOgorCSAgKiBzeXMvdmNkL3ZjZHNyYy5oOgorCSAgcmVuYW1lZCBHU1RfRkxBR1MgbWFjcm9zIHRvIEdTVF9PQkpFQ1RfRkxBR1MKKwkgIG1vdmVkIGJpdHNoaWZ0IGZyb20gbWFjcm8gdG8gZW51bSBkZWZpbml0aW9uCisKKzIwMDUtMDktMDUgMTc6MjA6MjkgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJKiBleHQvamFjay9nc3RqYWNrYmluLmM6CisJICBGaXggdXAgYWxsIHRoZSBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb25zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGaXggdXAgYWxsIHRoZSBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb25zLgorCisyMDA0LTA4LTAzIDE0OjI4OjEyICswMDAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQGdub21lLm9yZz4KKworCSAgZml4ZXMgZm9yIEdfRElTQUJMRV9BU1NFUlQgYW5kIGZyaWVuZHMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleGFtcGxlcy9keW5wYXJhbXMvZmlsdGVyLmM6ICh1aV9jb250cm9sX2NyZWF0ZSk6CisJICAqIGV4YW1wbGVzL2dzdHBsYXkvcGxheWVyLmM6IChwcmludF90YWcpOgorCSAgKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9yZXF1ZXN0X25ld19wYWQpOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGthbmltYXRpb24uYzoKKwkgIChnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX21heV9hZHZhbmNlKToKKwkgICogZXh0L2phY2svZ3N0amFjay5jOiAoZ3N0X2phY2tfcmVxdWVzdF9uZXdfcGFkKToKKwkgICogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9tYWRfaWQzX3RvX3RhZ19saXN0KSwKKwkgICh0YWdfbGlzdF90b19pZDNfdGFnX2ZvcmVhY2gpLCAoZ3N0X2lkM190YWdfaGFuZGxlX2V2ZW50KToKKwkgICogZXh0L3ZvcmJpcy9vZ2d2b3JiaXNlbmMuYzogKGdzdF9vZ2d2b3JiaXNlbmNfZ2V0X3RhZ192YWx1ZSk6CisJICAqIGV4dC92b3JiaXMvdm9yYmlzZW5jLmM6IChnc3Rfdm9yYmlzZW5jX2dldF90YWdfdmFsdWUpOgorCSAgKiBleHQveGluZS94aW5lYXVkaW9kZWMuYzogKGdzdF94aW5lX2F1ZGlvX2RlY19jaGFpbik6CisJICAqIGdzdC1saWJzL2dzdC9tZWRpYS1pbmZvL21lZGlhLWluZm8tdGVzdC5jOiAocHJpbnRfdGFnKToKKwkgICogZ3N0L3NpbmUvZGVtby1kcGFyYW1zLmM6IChtYWluKToKKwkgICogZ3N0L3RhZ3MvZ3N0dm9yYmlzdGFnLmM6IChnc3RfdGFnX3RvX3ZvcmJpc19jb21tZW50cyk6CisJICAqIHRlc3RzdWl0ZS9hbHNhL2Zvcm1hdHMuYzogKGNyZWF0ZV9waXBlbGluZSk6CisJICAqIHRlc3RzdWl0ZS9hbHNhL3NpbmVzcmMuYzogKHNpbmVzcmNfZm9yY2VfY2FwcyksIChzaW5lc3JjX2dldCk6CisJICBmaXhlcyBmb3IgR19ESVNBQkxFX0FTU0VSVCBhbmQgZnJpZW5kcworCSAgKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKGFhY190eXBlX2ZpbmQpLAorCSAgKG1wM190eXBlX2ZyYW1lX2xlbmd0aF9mcm9tX2hlYWRlciksIChtcDNfdHlwZV9maW5kKSwKKwkgIChwbHVnaW5faW5pdCk6CisJICByZXF1aXJlIG1wMyB0eXBlZmluZGluZyB0byBoYXZlIGF0IGxlYXN0IE1JTl9IRUFERVJTIHZhbGlkIGhlYWRlcnMKKwkgIGFkZCB0eXBlZmluZGluZyBmb3IgQUFDIGFkdHMgZmlsZXMKKworMjAwNC0wNS0yMSAyMzoyODo1NyArMDAwMCAgU3TDqXBoYW5lIExvZXVpbGxldCA8Z3N0cmVhbWVyQGxlcm91dGllci5uZXQ+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkgIHNlY29uZCBiYXRjaCA6IHJlbW92ZSAnLCcgYXQgZW5kIG9mIGVudW1zIGFzIHRoZXkgY291bGQgY29uZnVzZSBvbGRlciBnY2MsIGZvcmVpZ24gY29tcGlsZXJzIChmb3J0ZSkgYW5kIGd0ay1kb2MgKGluIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBzZWNvbmQgYmF0Y2ggOgorCSAgcmVtb3ZlICcsJyBhdCBlbmQgb2YgZW51bXMgYXMgdGhleSBjb3VsZCBjb25mdXNlIG9sZGVyIGdjYywgZm9yZWlnbiBjb21waWxlcnMgKGZvcnRlKSBhbmQgZ3RrLWRvYworCSAgKGluIGdzdC1wbHVnaW5zL2V4dC8gdGhpcyB0aW1lKQorCisyMDA0LTAzLTE1IDE5OjMyOjI3ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSogZXh0L2phY2svZ3N0amFja2Jpbi5jOgorCSAgZG9uJ3QgbWl4IHRhYnMgYW5kIHNwYWNlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBkb24ndCBtaXggdGFicyBhbmQgc3BhY2VzCisKKzIwMDQtMDMtMTUgMTY6MzI6NTQgKzAwMDAgIEpvaGFuIERhaGxpbiA8am9oYW5AZ25vbWUub3JnPgorCisJICAqLmg6IFJldmVydCBpbmRlbnRpbmcKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiAqLmg6IFJldmVydCBpbmRlbnRpbmcKKworMjAwNC0wMy0xNCAyMjozNDozMyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkqIGV4dC9qYWNrL2dzdGphY2tiaW4uYzoKKwkgIGdzdC1pbmRlbnQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZ3N0LWluZGVudAorCisyMDA0LTAxLTEyIDAzOjQwOjE4ICswMDAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSAgUmVtb3ZlIGFsbCB1c2FnZSBvZiBnc3RfcGFkX2dldF9jYXBzKCksIGFuZCByZXBsYWNlIGl0IHdpdGggZ3N0X3BhZF9nZXRfYWxsb3dlZF9jYXBzKCkgb3IgZ3N0X3BhZF9nZXRfbmVnb3RpYXRlZF9jYXAoKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUmVtb3ZlIGFsbCB1c2FnZSBvZiBnc3RfcGFkX2dldF9jYXBzKCksIGFuZCByZXBsYWNlIGl0IHdpdGgKKwkgIGdzdF9wYWRfZ2V0X2FsbG93ZWRfY2FwcygpIG9yIGdzdF9wYWRfZ2V0X25lZ290aWF0ZWRfY2FwKCkuCisKKzIwMDMtMTItMjIgMDE6NDc6MDkgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJICBNZXJnZSBDQVBTIGJyYW5jaAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBNZXJnZSBDQVBTIGJyYW5jaAorCisyMDAzLTEyLTEzIDE2OjU5OjUxICswMDAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L2phY2svZ3N0amFja2Jpbi5jOgorCSAgcmVtb3ZlZCBHU1RfKl9DQVNULiBEaXNhYmxpbmcgb2YgdHlwZSBjaGVja2luZyBpcyBkb25lIGluIGdsaWIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbW92ZWQgR1NUXypfQ0FTVC4gRGlzYWJsaW5nIG9mIHR5cGUgY2hlY2tpbmcgaXMgZG9uZSBpbiBnbGliLgorCisyMDAzLTEyLTA0IDEwOjM3OjM4ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkgIHJlbW92ZSBjb3B5cmlnaHQgZmllbGQgZnJvbSBwbHVnaW5zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbW92ZSBjb3B5cmlnaHQgZmllbGQgZnJvbSBwbHVnaW5zCisKKzIwMDMtMTEtMDcgMTI6NDc6MDIgKzAwMDAgIFJvbmFsZCBTLiBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFja2Jpbi5jOgorCSAgUmVtb3ZlIGFsbCBjb25maWcuaCBpbmNsdWRlcyBmcm9tIGhlYWRlciBmaWxlcywgYWRkIGl0IHRvIGVhY2ggc291cmNlIGZpbGUgYW5kIHJlbW92ZSBkdXBsaWNhdGUgY29uZmlnLmggaW5jbHVkZXMgZnJvLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJlbW92ZSBhbGwgY29uZmlnLmggaW5jbHVkZXMgZnJvbSBoZWFkZXIgZmlsZXMsIGFkZCBpdCB0byBlYWNoIHNvdXJjZSBmaWxlIGFuZCByZW1vdmUgZHVwbGljYXRlIGNvbmZpZy5oIGluY2x1ZGVzIGZyb20gc2V2ZXJhbCBzb3VyY2UgZmlsZXMKKworMjAwMy0xMS0wMSAyMzo0MzoxMyArMDAwMCAgSWFpbiBIb2xtZXMgPGlhaW5AcHJldHR5cGVvcGxlLm9yZz4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSAgSmFjayBmaXhlZCB0b28KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgSmFjayBmaXhlZCB0b28KKworMjAwMy0xMC0yOSAwMzoxNTo1NSArMDAwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkgIGNoYW5nZSBnc3QvYnl0ZXN0cmVhbS5oIHRvIGdzdC9ieXRlc3RyZWFtL2J5dGVzdHJlYW0uaAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBjaGFuZ2UgZ3N0L2J5dGVzdHJlYW0uaCB0byBnc3QvYnl0ZXN0cmVhbS9ieXRlc3RyZWFtLmgKKworMjAwMy0xMC0yOCAyMDo1Mjo0MSArMDAwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkgIG1lcmdlIFRZUEVGSU5EIGJyYW5jaC4gTWFqb3IgY2hhbmdlczoKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgbWVyZ2UgVFlQRUZJTkQgYnJhbmNoLiBNYWpvciBjaGFuZ2VzOgorCSAgLSB0b3RhbGx5IHJld29ya2VkIHR5cGUoZmluZCkgc3lzdGVtCisJICAtIGFsbCB0eXBlZmluZCBmdW5jdGlvbnMgYXJlIGluIGdzdC90eXBlZmluZCBub3cKKwkgIC0gbW9yZSB0eXBlZmluZCBmdW5jdGlvbnMgdGhlbiBiZWZvcmUKKwkgIC0gc29tZSBwbHVnaW5zIG1pZ2h0IGZhaWwgdG8gY29tcGlsZSBub3cgYmVjYXVzZSBJIGRvbid0IGhhdmUgdGhlbSBpbnN0YWxsZWQgYW5kIHRoZXkKKwkgIGEpIHJlcXVpcmUgYnl0ZXN0cmVhbSBvcgorCSAgYikgaGF2ZW4ndCBoYWQgdGhlaXIgdHlwZWZpbmQgZml4ZWQuCisJICBQbGVhc2UgZml4IHRob3NlIHBsdWdpbnMgYW5kIHB1dCB0aGUgdHlwZWZpbmQgZnVuY3Rpb25zIGludG8gZ3N0L3R5cGVmaW5kIGlmIHRoZXkgZG9uJ3QgaGF2ZSBkZXBlbmRlbmNpZXMKKworMjAwMy0xMC0wOCAxNjowODoxOSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJICAvR3N0QnVmZmVyL0dzdERhdGEvIGluIHRoZSBBUEkgd2hlcmUgeW91IGNhbiBwYXNzIGV2ZW50cy4gRml4IHRoZSBwbHVnaW5zIHRvIGRlYWwgd2l0aCB0aGF0LiBGaXhlcyAjMTEzNDg4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAvR3N0QnVmZmVyL0dzdERhdGEvIGluIHRoZSBBUEkgd2hlcmUgeW91IGNhbiBwYXNzIGV2ZW50cy4gRml4IHRoZSBwbHVnaW5zIHRvIGRlYWwgd2l0aCB0aGF0LiBGaXhlcyAjMTEzNDg4LgorCisyMDAzLTEwLTAxIDEzOjE0OjUwICswMDAwICBSb25hbGQgUy4gQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkgIE5ldyB0eXBlZmluZCBzeXN0ZW06IGJ5dGVzdHJlYW0gaXMgbm93IHBhcnQgb2YgdGhlIGNvcmUgYWxsIHBsdWdpbnMgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIHVzZSB0aGlzIG5ldyB0eXBlZmluZCBzeXN0ZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBOZXcgdHlwZWZpbmQgc3lzdGVtOgorCSAgKiBieXRlc3RyZWFtIGlzIG5vdyBwYXJ0IG9mIHRoZSBjb3JlCisJICAqIGFsbCBwbHVnaW5zIGhhdmUgYmVlbiBtb2RpZmllZCB0byB1c2UgdGhpcyBuZXcgdHlwZWZpbmQgc3lzdGVtCisJICAqIGFzZiB0eXBlZmluZGluZyBhZGRlZAorCSAgKiBtcGVnIHZpZGVvIHN0cmVhbSB0eXBlZmlkaW5nIHJlbW92ZWQgYmVjYXVzZSBpdCdzIGJyb2tlbgorCSAgKiBkdXBsaWNhdGUgdHlwZWZpbmQgZW50cmllcyByZW1vdmVkCisJICAqIGV4dHJhIGlkMyB0eXBlZmluZGluZyBhZGRlZCwgYmVjYXVzZSB3ZSd2ZSBzZWVuIDQgdHlwZXMgb2YgZmlsZXMKKwkgIChyaWZmL3dhdiwgZmxhYywgdm9yYmlzLCBtcDMpIHdpdGggaWQzIGhlYWRlcnMgYW5kIGVhY2ggb2YgdGhlc2UgbmVlZHMKKwkgIHRvIHdvcmsuIEluc3RlYWQsIEkndmUgYWRkZWQgYW4gaWQzIGVsZW1lbnQgYW5kIGxldCBpdCByZWRvIHR5cGVmaWRpbmcKKwkgIGFmdGVyIHRoZSBpZDMgaGVhZGVyLiB0aGlzIG5lZWRzIGEgaGFjayBiZWNhdXNlIHNwaWRlciBvbmx5IHR5cGVmaW5kcworCSAgb25jZS4gV2UgY2FuIHJlbW92ZSB0aGlzIGhhY2sgb25jZSBzcGlkZXIgc3VwcG9ydHMgbXVsdGlwbGUgdHlwZWZpbmRzLgorCSAgKiB3aXRoIGFsbCB0aGlzLCBtcDMgdHlwZWZpbmRpbmcgaXMgc2VtaS1yZXdyaXR0ZW4KKwkgICogaWQzIHR5cGVmaW5kaW5nIGluIGZsYWMvdm9yYmlzIGlzIHJlbW92ZWQsIGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZAorCSAgKiBmaXhlZCBzcGlkZXIgYW5kIGdzdC10eXBlZmluZCB0byB1c2UgdGhpcywgdG9vLgorCSAgKiBPdGhlciBnZW5lcmFsIGNsZWFudXBzCisKKzIwMDMtMDktMzAgMTI6NTY6MjcgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSogZXh0L2phY2svZ3N0amFjay5oOgorCSogZXh0L2phY2svZ3N0amFja2Jpbi5jOgorCSAgY29uZm9ybSB0byB0aGUgYnVmZmVyLWZyYW1lcyBwcm9wcyBlbnRyeSAtLSBtdWNoIG5pY2VyIG5vdy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBjb25mb3JtIHRvIHRoZSBidWZmZXItZnJhbWVzIHByb3BzIGVudHJ5IC0tIG11Y2ggbmljZXIgbm93Li4uCisKKzIwMDMtMDgtMTAgMDA6MDE6NTggKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvamFjay9NYWtlZmlsZS5hbToKKwkgIFJlbW92ZSByZWR1bmRhbnQgcGx1Z2luZGlyIGRlZmluaXRpb24KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUmVtb3ZlIHJlZHVuZGFudCBwbHVnaW5kaXIgZGVmaW5pdGlvbgorCisyMDAzLTA3LTE5IDIzOjI1OjI1ICswMDAwICBMZWlmIEpvaG5zb24gPGxlaWZAYW1iaWVudC4yeS5uZXQ+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkgICsgY2hhbmdlcyBmb3IgbmV3IGZsb2F0IGNhcHMgd2l0aG91dCBzbG9wZS9pbnRlcmNlcHQgKyBzb21lIGNhdGVnb3J5IGNoYW5nZXMgZm9yIHBsdWdpbnMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKyBjaGFuZ2VzIGZvciBuZXcgZmxvYXQgY2FwcyB3aXRob3V0IHNsb3BlL2ludGVyY2VwdAorCSAgKyBzb21lIGNhdGVnb3J5IGNoYW5nZXMgZm9yIHBsdWdpbnMKKworMjAwMy0wNy0wNiAyMDo0OTo1MiArMDAwMCAgUm9uYWxkIFMuIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJICBOZXcgbWltZXR5cGVzIGdvbmUgaW50byBlZmZlY3QgdG9kYXkgLSB0aGlzIGNvbW1pdCBjaGFuZ2VzIGFsbCBvbGQgbWltZXR5cGVzIG92ZXIgdG8gdGhlIG5ldyBtaW1ldHlwZXMgc3BlYyBhcyBkZXNjcmkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgTmV3IG1pbWV0eXBlcyBnb25lIGludG8gZWZmZWN0IHRvZGF5IC0gdGhpcyBjb21taXQgY2hhbmdlcyBhbGwgb2xkIG1pbWV0eXBlcyBvdmVyIHRvIHRoZSBuZXcgbWltZXR5cGVzIHNwZWMgYXMgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBjb21taXQncyBkb2N1bWVudC4gTm90ZTogc29tZSBwbHVnaW5zIHdpbGwgYnJlYWssIHNvbWUgcGlwZWxpbmVzIHdpbGwgYnJlYWssIGV4cGVjdCBIRUFEIHRvIGJlIGJyb2tlbiBvciBhdCBsZWFzdCBub3QgMTAwJSB3b3JraW5nIGZvciBhIGZldyBkYXlzLCBidXQgZG9uJ3QgZm9yZ2V0IHRvIHJlcG9ydCBidWdzCisKKzIwMDMtMDctMDEgMDI6Mjc6MDYgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJICBmaXggdHlwZSBwdW5uaW5nCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZpeCB0eXBlIHB1bm5pbmcKKworMjAwMy0wNi0yOSAxOTo0NjoxMyArMDAwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qYWNrL2dzdGphY2tiaW4uYzoKKwkgIGNvbXBhdGliaWxpdHkgZml4IGZvciBuZXcgR1NUX0RFQlVHIHN0dWZmLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBjb21wYXRpYmlsaXR5IGZpeCBmb3IgbmV3IEdTVF9ERUJVRyBzdHVmZi4KKwkgIEluY2x1ZGVzIGZpeGVzIGZvciBtaXNzaW5nIGluY2x1ZGVzIGZvciBjb25maWcuaCBhbmQgdW5pc3RkLmgKKwkgIEkgb25seSBlbnN1cmVkIGZvciBwbHVnaW5zIEkgY2FuIGJ1aWxkIHRoYXQgdGhleSB3b3JrLCBzbyBpZiBzb21lIG9mIHRoZW0gYXJlIHN0aWxsIGJyb2tlbiwgeW91IGdvdHRhIGZpeCB0aGVtIHlvdXJzZWx2ZXMgdW5mb3J0dW5hdGVseS4KKworMjAwMy0wNi0xMyAyMToyMToxNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSAgUmVtb3ZlZCB1Z2x5IGNhcHMgZml4ZWQgZmxhZyBoYWNrLCB3aWxsIGJlIGRvbmUgYXV0b21hdGljYWxseSBpbiBjb3JlIHNvb24KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUmVtb3ZlZCB1Z2x5IGNhcHMgZml4ZWQgZmxhZyBoYWNrLCB3aWxsIGJlIGRvbmUgYXV0b21hdGljYWxseSBpbgorCSAgY29yZSBzb29uCisKKzIwMDMtMDMtMDQgMTU6MzQ6MjAgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSogZXh0L2phY2svZ3N0amFjay5oOgorCSogZXh0L2phY2svZ3N0amFja2Jpbi5jOgorCSAgdXBkYXRlIGZvciB0aGUgbGF0ZXN0IGphY2sgY3ZzIGFuZCBub24tY290aHJlYWRlZCBnc3Qgc2NoZWR1bGVyCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHVwZGF0ZSBmb3IgdGhlIGxhdGVzdCBqYWNrIGN2cyBhbmQgbm9uLWNvdGhyZWFkZWQgZ3N0IHNjaGVkdWxlcgorCisyMDAzLTAyLTA1IDIwOjM4OjQxICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSAgQ2hhbmdlZCBjYXBzLT5maXhlZCB0byB1c2UgRkxBR19TRVQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQ2hhbmdlZCBjYXBzLT5maXhlZCB0byB1c2UgRkxBR19TRVQKKworMjAwMy0wMS0xMCAxMzozODozMiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkgIFBhZENvbm5lY3QgLT4gUGFkTGluaworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYWRDb25uZWN0IC0+IFBhZExpbmsKKworMjAwMy0wMS0xMCAxMDoyMjoyNSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkgIGFub3RoZXIgYmF0Y2ggb2YgY29ubmVjdC0+bGluayBmaXhlcyBwbGVhc2UgbGV0IG1lIGtub3cgYWJvdXQgaXNzdWVzIGFuZCBwbGVhc2UgcmVmcmFpbiBvZiBtYWtpbmcgdGhlbSB5b3Vyc2VsZiwgc28gdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhbm90aGVyIGJhdGNoIG9mIGNvbm5lY3QtPmxpbmsgZml4ZXMKKwkgIHBsZWFzZSBsZXQgbWUga25vdyBhYm91dCBpc3N1ZXMKKwkgIGFuZCBwbGVhc2UgcmVmcmFpbiBvZiBtYWtpbmcgdGhlbSB5b3Vyc2VsZiwgc28gdGhhdCBJIGRvbid0IHNwZW5kIGRvdWJsZQorCSAgdGhlIHRpbWUgcmVzb2x2aW5nIGNvbmZsaWN0cworCisyMDAyLTEyLTA4IDE0OjUwOjEwICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZXh0L2phY2svTWFrZWZpbGUuYW06CisJICBwYXJhbGxlbCBpbnN0YWxsIGZpeGVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHBhcmFsbGVsIGluc3RhbGwgZml4ZXMKKworMjAwMi0wOS0yOSAxODoxMjoxOCArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJKiBleHQvamFjay9nc3RqYWNrYmluLmM6CisJICBsaWNlbnNlcyBhZ2FpbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBsaWNlbnNlcyBhZ2FpbgorCisyMDAyLTA5LTE4IDE5OjAyOjUyICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkgIHBsdWdpbnMgcGFydCBvZiBsaWNlbnNlIGZpZWxkIHBhdGNoCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHBsdWdpbnMgcGFydCBvZiBsaWNlbnNlIGZpZWxkIHBhdGNoCisKKzIwMDItMDktMTAgMDk6MzE6NDAgKzAwMDAgIFJvbmFsZCBTLiBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSAgVGhpcyB1cGRhdGVzIGFsbCBwbHVnaW5zIHRvIHRoZSBuZXcgQVBJIGZvciBnc3RfcGFkX3RyeV9zZXRfY2FwcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBUaGlzIHVwZGF0ZXMgYWxsIHBsdWdpbnMgdG8gdGhlIG5ldyBBUEkgZm9yIGdzdF9wYWRfdHJ5X3NldF9jYXBzCisKKzIwMDItMDktMDkgMjM6Mjc6MzggKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJICByZW1vdmluZyB3YXJuaW5ncyBhcyBhcHByb3ZlZCBieSB3aW0KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmVtb3Zpbmcgd2FybmluZ3MgYXMgYXBwcm92ZWQgYnkgd2ltCisKKzIwMDItMDgtMjMgMDQ6MDQ6MTEgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSogZXh0L2phY2svZ3N0amFja2Jpbi5jOgorCSAgZml4IGphY2sgaW5wdXQgcG9ydCBjb25uZWN0aW9uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZpeCBqYWNrIGlucHV0IHBvcnQgY29ubmVjdGlvbgorCisyMDAyLTA3LTA5IDE3OjM5OjE3ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkgIGNvbXBpbGUgZml4ZW4sIGFuZCBwcmVwYXJlIHRvIG1vdmUgTUFJTlRBSU5FUl9NT0RFIHRvIGFzLXZlcnNpb24ubTQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgY29tcGlsZSBmaXhlbiwgYW5kIHByZXBhcmUgdG8gbW92ZSBNQUlOVEFJTkVSX01PREUgdG8gYXMtdmVyc2lvbi5tNAorCisyMDAyLTA3LTAyIDIzOjM1OjA3ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qYWNrL2dzdGphY2tiaW4uYzoKKwkgIG1ha2UgamFjayB3b3JrIGluIGFsbCBpdHMgZnVsbCBkdXBsZXggZ2xvcnkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgbWFrZSBqYWNrIHdvcmsgaW4gYWxsIGl0cyBmdWxsIGR1cGxleCBnbG9yeQorCisyMDAyLTA2LTEyIDAzOjMyOjAyICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qYWNrL2dzdGphY2tiaW4uYzoKKwkgIHdvcmtpbmcgamFjayBlbGVtZW50cyAoZml4ZWQgYSBwcm9ibGVtIGluIHVwc3RyZWFtIGphY2spIHJhbmRvbSBvdGhlciBmaXhlbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHdvcmtpbmcgamFjayBlbGVtZW50cyAoZml4ZWQgYSBwcm9ibGVtIGluIHVwc3RyZWFtIGphY2spCisJICAqIHJhbmRvbSBvdGhlciBmaXhlbi4uLgorCisyMDAyLTA1LTE1IDE5OjA4OjQ5ICswMDAwICBTdGV2ZSBCYWtlciA8c3RldmVAc3RldmViYWtlci5vcmc+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkgIHVzZSBuZXcgYnl0ZXN0cmVhbSBhcGkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdXNlIG5ldyBieXRlc3RyZWFtIGFwaQorCisyMDAyLTA1LTEzIDE4OjA4OjMzICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkqIGV4dC9qYWNrL2dzdGphY2tiaW4uYzoKKwkgIHVwZGF0ZSB0byBuZXcgamFjayBhcGkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdXBkYXRlIHRvIG5ldyBqYWNrIGFwaQorCisyMDAyLTA1LTA1IDE5OjM5OjE3ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkgIGFkZCBzb21lIGluY2x1ZGVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCBzb21lIGluY2x1ZGVzCisKKzIwMDItMDUtMDUgMDE6MDg6MDUgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSogZXh0L2phY2svZ3N0amFjay5oOgorCSogZXh0L2phY2svZ3N0amFja2Jpbi5jOgorCSAgYmV0dGVyIGluaXRpYWxpemF0aW9uLiBpdCBkb2Vzbid0IHdvcmsgb3ZlciBoZXJlLCB0aG91Z2guCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGJldHRlciBpbml0aWFsaXphdGlvbi4gaXQgZG9lc24ndCB3b3JrIG92ZXIgaGVyZSwgdGhvdWdoLgorCisyMDAyLTA1LTA0IDIxOjM4OjU2ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2tiaW4uYzoKKwkgIGEgY29tbWl0IHNvIHRoYXQgamFjayB3aWxsIGJ1aWxkIHdpdGhvdXQgZXJyb3JzIG9uIFVyYWV1cydzIHN5c3RlbSA7KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhIGNvbW1pdCBzbyB0aGF0IGphY2sgd2lsbCBidWlsZCB3aXRob3V0IGVycm9ycyBvbiBVcmFldXMncyBzeXN0ZW0gOykKKworMjAwMi0wNS0wNCAyMDo1MzozNSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJICBzZXQgY2FwcyBvbmNlIHdlIGtub3cgdGhlIHNhbXBsZSByYXRlIG9mIHRoZSBzeXN0ZW0KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgc2V0IGNhcHMgb25jZSB3ZSBrbm93IHRoZSBzYW1wbGUgcmF0ZSBvZiB0aGUgc3lzdGVtCisKKzIwMDItMDUtMDQgMTg6NTc6NDQgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSogZXh0L2phY2svZ3N0amFjay5oOgorCSogZXh0L2phY2svZ3N0amFja2Jpbi5jOgorCSAgc29tZSBqYWNrIGZpeGVzLCBhbHNhIHRvdWNodXBzLCBhbmQgYWRkIHJ0cCBieSBkZWZhdWx0IHRvIHRoZSBidWlsZCBpZiB0aGVyZSBhcmUgYW55IHByb2JsZW1zIGJ1aWxkaW5nIHJ0cCwgd2UncmUgbW92Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHNvbWUgamFjayBmaXhlcywgYWxzYSB0b3VjaHVwcywgYW5kIGFkZCBydHAgYnkgZGVmYXVsdCB0byB0aGUgYnVpbGQKKwkgIGlmIHRoZXJlIGFyZSBhbnkgcHJvYmxlbXMgYnVpbGRpbmcgcnRwLCB3ZSdyZSBtb3ZpbmcgaXQgYmFjayB0byBleHBlcmltZW50YWwgOykKKworMjAwMi0wNC0yMCAyMTo0Mjo1MSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJICBhIGhhY2sgdG8gd29yayBhcm91bmQgaW50bHRvb2wncyBicm9rZW5uZXNzIGEgY3VycmVudCBjaGVjayBmb3IgbXBlZzJkZWMgZGV0YWlscy0+a2xhc3MgcmVvcmdhbml6YXRpb25zIGFuIGVsZW1lbnQgYnIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBhIGhhY2sgdG8gd29yayBhcm91bmQgaW50bHRvb2wncyBicm9rZW5uZXNzCisJICAqIGEgY3VycmVudCBjaGVjayBmb3IgbXBlZzJkZWMKKwkgICogZGV0YWlscy0+a2xhc3MgcmVvcmdhbml6YXRpb25zCisJICAqIGFuIGVsZW1lbnQgYnJvd3NlciB0aGF0IHVzZXMgZGV0YWlscy0+a2xhc3MKKwkgICogc2VwYXJhdGVkIGNkeGEgcGFyc2Ugb3V0IGZyb20gdGhlIGF2aSBkaXJlY3RvcnkKKworMjAwMi0wNC0xNiAxNzoxNDowNSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvamFjay9NYWtlZmlsZS5hbToKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkqIGV4dC9qYWNrL2dzdGphY2tiaW4uYzoKKwkgIEZpbmFsbHkgd2UncmUgb24gdG8gYSBwcm9wZXIgamFjayBzZXR1cCwgd2l0aCBhIHNwZWNpYWxpemVkIGJpbiBhbmQgZWxlbWVudHMgdGhhdCBjYW4gb25seSBnbyBpbiBhIGphY2sgYmluLiBJIGhhZCB0by4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGaW5hbGx5IHdlJ3JlIG9uIHRvIGEgcHJvcGVyIGphY2sgc2V0dXAsIHdpdGggYSBzcGVjaWFsaXplZCBiaW4gYW5kIGVsZW1lbnRzCisJICB0aGF0IGNhbiBvbmx5IGdvIGluIGEgamFjayBiaW4uIEkgaGFkIHRvIGZpeCB0aGUgcGFyc2VyIGZpcnN0IHRvIGRvIHRoaXMsIGJ1dAorCSAgdG8gcnVuIGl0LCB0aGUgc3ludGF4IGlzIGxpa2Ugc286CisJICBnc3QtbGF1bmNoIGphY2tiaW4uKCBmaWxlc3JjICEgbWFkICEgamFja3NpbmsgKQorCSAgQnV0IG9mIGNvdXJzZSBpdCdzIG5vdCBmdWxseSBmdW5jdGlvbmFsIHlldC4gU2lnaC4KKworMjAwMi0wNC0xMSAyMDo0MjoyNiArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJICBHc3RQYWRUZW1wbGF0ZSA8LT4gZ3N0X3BhZF90ZW1wbGF0ZSA8LT4gR1NUX1BBRF9URU1QTEFURSBzYW1lIHdpdGggKmZhY3RvcnkgYW5kIHR5cGVmaW5kLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBHc3RQYWRUZW1wbGF0ZSA8LT4gZ3N0X3BhZF90ZW1wbGF0ZSA8LT4gR1NUX1BBRF9URU1QTEFURQorCSAgc2FtZSB3aXRoICpmYWN0b3J5IGFuZCB0eXBlZmluZC4KKwkgIGFsc28sIHNvbWUgLVdlcnJvciBmaXhlcy4KKworMjAwMi0wMy0zMCAyMTowNzo1MSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJICBhbHBoYWJldGl6YXRpb24gZml4ZW4gYSBqYWNrIGNhcHMgZml4CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogYWxwaGFiZXRpemF0aW9uIGZpeGVuCisJICAqIGEgamFjayBjYXBzIGZpeAorCisyMDAyLTAzLTMwIDE5OjMxOjEzICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkgIGFkZCBub3RpZnkgYmFjayB0byBmaWxlc3JjLCBpdCdzIG5lZWRlZCBmb3IgTVZDIGFwcGxpY2F0aW9ucyByZW1vdmUgbm90aWZ5IHByaW50b3V0cyBmcm9tIGdzdC1sYXVuY2ggY2xlYW51cCBpbiBnc3QtcC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGFkZCBub3RpZnkgYmFjayB0byBmaWxlc3JjLCBpdCdzIG5lZWRlZCBmb3IgTVZDIGFwcGxpY2F0aW9ucworCSAgKiByZW1vdmUgbm90aWZ5IHByaW50b3V0cyBmcm9tIGdzdC1sYXVuY2gKKwkgICogY2xlYW51cCBpbiBnc3QtcGx1Z2lucyBjb25maWd1cmUuYWMKKwkgICogc29tZSBqYWNrIHVwZGF0ZXMKKwkgICogcmVtb3ZlIFNFTEZfSVRFUkFUSU5HIGZsYWcgaW4gZmF2b3Igb2YgU0VGX1NDSEVEVUxBQkxFIChub3QgYSBjbGVhciBuYW1lLAorCSAgYnV0IGl0J3Mgd2hhdCB3ZSBoYXZlIGZvciB0aGUgbW9tZW50KQorCSAgKiBpbXByb3ZlIHBhcnNpbmcgb2YgcmVxdWVzdCBwYWQgbmFtZXMsIG5vIG1vcmUgc3NjYW5mCisJICAqIGZpeGVzIHRvIHRoZSBmYXN0c2NoZWR1bGVyIE1ha2VmaWxlLmFtCisKKzIwMDItMDMtMjAgMjE6NDU6MDQgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSAgcy9Hbm9tZS1TdHJlYW1lci9HU3RyZWFtZXIvCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHMvR25vbWUtU3RyZWFtZXIvR1N0cmVhbWVyLworCisyMDAyLTAzLTE5IDA0OjEwOjA2ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9qYWNrL01ha2VmaWxlLmFtOgorCSogZXh0L2phY2svZ3N0amFjay5jOgorCSAgcmVtb3ZhbCBvZiAvLy1zdHlsZSBjb21tZW50cyBkb24ndCBsaW5rIHBsdWdpbnMgdG8gY29yZSBsaWJzIC0tIHRoZSB2ZXJzaW9uaW5nIGlzIGRvbmUgaW50ZXJuYWxseSB0byB0aGUgcGx1Z2lucyB3aXRoLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogcmVtb3ZhbCBvZiAvLy1zdHlsZSBjb21tZW50cworCSAgKiBkb24ndCBsaW5rIHBsdWdpbnMgdG8gY29yZSBsaWJzIC0tIHRoZSB2ZXJzaW9uaW5nIGlzIGRvbmUgaW50ZXJuYWxseSB0byB0aGUgcGx1Z2lucyB3aXRoIHRoZSBwbHVnaW5faW5mbyBzdHJ1Y3QsCisJICBhbmQgc3ltYm9sIHJlc29sdXRpb24gaXMgbGF6eSwgc28gd2UgY2FuIGFsd2F5cyBrbm93IGlmIGEgcGx1Z2luIGNhbiBiZSBsb2FkZWQgYnkgdGhlIHBsdWdpbl9pbmZvIGRhdGEuIGluIHRoZW9yeS4KKworMjAwMi0wMy0xOSAwMTozOTo0MyArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvamFjay9NYWtlZmlsZS5hbToKKwkgIHMvQEdTVF9QTFVHSU5fTERGTEFHU0AvJChHU1RfUExVR0lOX0xERkxBR1MpLyBALXN1YnN0aXR1ZWQgdmFyaWFibGVzIHZhcmlhYmxlcyBhcmUgZGVmaW5lZCBhcyBtYWtlIHZhcmlhYmxlcyBhdXRvbWFnaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBzL0BHU1RfUExVR0lOX0xERkxBR1NALyQoR1NUX1BMVUdJTl9MREZMQUdTKS8KKwkgIEAtc3Vic3RpdHVlZCB2YXJpYWJsZXMgdmFyaWFibGVzIGFyZSBkZWZpbmVkIGFzIG1ha2UgdmFyaWFibGVzIGF1dG9tYWdpY2FsbHksCisJICBhbmQgdGhpcyBnaXZlcyB0aGUgdXNlciB0aGUgZnJlZWRvbSB0byBzYXkgbWFrZSBHU1RfUExVR0lOX0xERkxBR1M9LW15ZmxhZworCisyMDAyLTAzLTE4IDA0OjQxOjM1ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9qYWNrL01ha2VmaWxlLmFtOgorCSogZXh0L2phY2svUkVBRE1FOgorCSogZXh0L2phY2svZ3N0amFjay5jOgorCSogZXh0L2phY2svZ3N0amFjay5oOgorCSAgcy9nc3RfZWxlbWVudF9pbnN0YWxsX3N0ZF9wcm9wcy9nc3RfZWxlbWVudF9jbGFzc19pbnN0YWxsX3N0ZF9wcm9wcy8gLS0gaXQganVzdCBtYWtlcyBtb3JlIHNlbnNlIHRoYXQgd2F5IGFkZGVkIGphY2sgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogcy9nc3RfZWxlbWVudF9pbnN0YWxsX3N0ZF9wcm9wcy9nc3RfZWxlbWVudF9jbGFzc19pbnN0YWxsX3N0ZF9wcm9wcy8gLS0gaXQganVzdCBtYWtlcyBtb3JlIHNlbnNlIHRoYXQgd2F5CisJICAqIGFkZGVkIGphY2sgZWxlbWVudCwgZG9lc24ndCBxdWl0ZSB3b3JrIHJpZ2h0IHlldCBidXQgaSBkaWRuJ3Qgd2FudCB0byBsb3NlIHRoZSB3b3JrIC0tIGl0IGRvZXMgYnVpbGQsIHJlZ2lzdGVyLAorCSAgYW5kIGF0dGVtcHQgdG8gcnVuIHRob3VnaAorCSAgKiBpbXBvc2VkIHNvbWUgcmVzdHJpY3Rpb25zIG9uIHRoZSBuYW1pbmcgb2YgcmVxdWVzdCBwYWRzIHRvIGJldHRlciBhbGxvdyBmb3IgcmV2ZXJzZSBwYXJzaW5nCisJICAqIGFkZGVkICclcycgdG8gcmV2ZXJzZSBwYXJzaW5nCisJICAqIGFkZGVkIG5ldyBiaW4gZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIHNlbGYtaXRlcmF0aW5nLCBhbmQgc29tZSBsYW1lIGNvZGUgaW4gZ3N0LWxhdW5jaCB0byB0ZXN0IGl0IG91dAorCSAgKiBmaXhlbiBvbiBsYXVuY2gtZ3VpCisJICAqIGFkZGVkIHBrZy1jb25maWcgc3R1ZmYgZm9yIHRoZSBlZGl0b3IncyBsaWJzCisKKzIwMTEtMDEtMDIgMTE6Mzc6MTQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBtYXJrIHY0bDJzaW5rIGFzIGV4cGVyaW1lbnRhbCBhbmQgYnVpbGQgb25seSBpZiAtLWVuYWJsZS1leHBlcmltZW50YWwgaXMgcGFzc2VkCisJICBJdCdzIG5vdCByZWFsbHkgb2YgJ2dvb2QnIHF1YWxpdHkgeWV0LCBidXQgdGhlcmUncyBhIGxvdCBvZgorCSAgY29kZSBzaGFyZWQgd2l0aCB2NGwyc3JjLCBzbyBub3Qgc28gZWFzeSB0byBtb3ZlIGl0IGVsc3doZXJlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxMjI0NAorCisyMDExLTAxLTAyIDAxOjI0OjIxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmg6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICBSZXZlcnQgInY0bDI6IGFkZCBub3JtIHByb3BlcnR5IgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCA5ZTFkNDE5ZDA3MzM3ZTZkYjJjYzM5MzY0NzJiZTIwNWNlOTI3ZTU0LgorCSAgUmV2ZXJ0aW5nIHRoaXMgc2luY2UgaXQgYWRkcyB1bnJldmlld2VkIGFuZCBiYWQgQVBJIHRvIHY0bDJzcmMKKwkgIChwcm9wZXJ0eSBvZiB0eXBlIGVudW0sIHdpdGggc2VlbWluZ2x5IHJhbmRvbSBhbmQgdW5zb3J0ZWQgdmFsdWVzKS4KKworMjAxMS0wMS0wMSAyMzoyNjozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRvb2xzLy5naXRpZ25vcmU6CisJKiB0b29scy9NYWtlZmlsZS5hbToKKwkqIHRvb2xzL1JFQURNRS5maWx0ZXJzdGFtcDoKKwkqIHRvb2xzL2ZpbHRlcnN0YW1wLnNoOgorCSogdG9vbHMvZ3N0LWxhdW5jaC1leHQtbS5tOgorCSogdG9vbHMvZ3N0LWxhdW5jaC1leHQuMS5pbjoKKwkqIHRvb2xzL2dzdC12aXN1YWxpc2UtbS5tOgorCSogdG9vbHMvZ3N0LXZpc3VhbGlzZS4xLmluOgorCSAgdG9vbHM6IHJlbW92ZSB1bnVzZWQgbGVmdC1vdmVyIGRpcmVjdG9yeQorCSAgVGhlc2UgYXJlIGFsbCBpbiAtYmFzZS90b29scy4KKworMjAxMC0xMi0zMSAxMzo1NzowNSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5Lmg6CisJICBtcDRhZGVwYXk6IGltcHJvdmUgdGltZXN0YW1wcyBvbiBvdXRnb2luZyBwYWNrZXRzCisJICBJbXByb3ZlIHBhcnNpbmcgb2YgdGhlIHNhbXBsZXJhdGUuCisJICBQYXJzZSB0aGUgZnJhbWVsZW4gc28gdGhhdCB3ZSBjYW4gY2FsY3VsYXRlIHRpbWVzdGFtcHMuCisJICBXaGVuIGludGVycG9sbGF0ZSB0aGUgaW5jb21taW5nIHRpbWVzdGFtcCBvbiBvdXRnb2luZyBidWZmZXJzIHdoZW4gdGhlcmUgYXJlCisJICBtdWx0aXBsZSBzdWJmcmFtZXMuCisJICBmaXhlcyAjNjI1ODI1CisKKzIwMTAtMTItMzEgMDA6MTI6NTMgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvZHRtZi90b25lX2RldGVjdC5jOgorCSAgZHRtZjogRml4IGJ1aWxkIGZhaWx1cmUgY2F1c2VkIGJ5IHByZXZpb3VzIGNvbW1pdAorCisyMDEwLTEyLTMwIDE4OjIwOjQ3IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZmRldGVjdC5jOgorCSogZ3N0L2R0bWYvdG9uZV9kZXRlY3QuYzoKKwkqIGdzdC9kdG1mL3RvbmVfZGV0ZWN0Lmg6CisJICBkdG1mOiBidWlsZCBmaXhlcyBmb3IgTVNWQworCSAgVXNlIGdpbnQxNiBhbmQgR19QSS4KKworMjAxMC0xMi0zMCAxODoxOTo0NyAtMDgwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9kdG1mL3RvbmVfZGV0ZWN0LmM6CisJICBkdG1mOiByZWluZGVudAorCisyMDEwLTEyLTMxIDAyOjE2OjU0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5LmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJICBjYWlybywgdmlkZW9maWx0ZXI6IHVzZSBnc3QvbWF0aC1jb21wYXQuaCBoZWFkZXIgZm9yIHJpbnQKKworMjAxMC0xMi0zMCAxNDozMDoyNyAtMDgwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkgIHZpZGVvYmFsYW5jZTogQ2hlY2sgZm9yIEhBVkVfUklOVCBpbnN0ZWFkCisJICBBbHNvIGNoYW5nZSBNX1BJIHRvIEdfUEkgZm9yIGdpZ2dsZXMuCisKKzIwMTAtMTItMzAgMTQ6MjE6MzcgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm9yZW5kZXIuYzoKKwkgIGNhaXJvOiBEb24ndCB1c2UgI2lmZGVmcyBpbnNpZGUgbWFjcm9zCisKKzIwMTAtMTItMzAgMTQ6MjA6NTIgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9rYXJhb2tlLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jYmFuZC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2xpbWl0LmM6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkqIGdzdC9nb29tL2NvbnZvbHZlX2Z4LmM6CisJKiBnc3QvZ29vbS9pZnMuYzoKKwkqIGdzdC9nb29tL2xpbmVzLmM6CisJKiBnc3QvZ29vbS90ZW50YWNsZTNkLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L2ZpcmZpbHRlci1leGFtcGxlLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L2lpcmZpbHRlci1leGFtcGxlLmM6CisJICBDaGFuZ2UgTV9QSSB0byBHX1BJCisKKzIwMTAtMTItMzAgMTI6MDc6NTIgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJICB2aWRlb2JhbGFuY2U6IHVzZSBHX09TX1dJTjMyIGZvciB3aW5kb3dzIGNoZWNrCisKKzIwMTAtMTItMzAgMTY6MjQ6MTYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJICBtcDRhZGVwYXk6IGZpeCB0aW1lc3RhbXBzIG9uIGJ1ZmZlcnMKKworMjAxMC0xMi0zMCAxNjoyMjo0OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcHZwYXkuYzoKKwkgIG1wdnBheTogZml4IGZsdXNoaW5nIGFuZCBkaXNjb250CisJICBGaXggZmx1c2hpbmcgYW5kIGRpc2NvbnRzLgorCSAgQ2xlYW4gdXAgaW4gc3RhdGUgY2hhbmdlcy4KKworMjAxMC0xMi0yOSAyMzozODoxOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2EtZGVtdXg6IGluY3JlYXNlIGFsbG93ZWQgbWF4LiBibG9jayBzaXplIGZvciBwdXNoIG1vZGUgZnJvbSAxME0gdG8gMTVNCisJICBJdCB3YXMgYW4gYXJiaXRyYXJ5IGxpbWl0IGZyb20gdGhlIHN0YXJ0LCBtZWFudCBhcyBhIGJhc2ljIHNhbml0eSBjaGVjaywKKwkgIHNvIG1heSBqdXN0IGFzIHdlbGwgaW5jcmVhc2UgaXQgYSBsaXR0bGUuIFdvdWxkIGJlIGdvb2QgdG8gcHJvdmlkZQorCSAgcHJvZ3Jlc3MgcmVwb3J0aW5nIHdoaWxlIGNvbXBsZXRpbmcgdGhlIGJsb2NrIGluIGFueSBjYXNlLi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MzcwNjAKKworMjAxMC0xMi0yOSAyMzowOTowNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2EtZGVtdXg6IGFzc3VtZSBtYXRyb3NrYSBpZiBubyBkb2N0eXBlIGlzIHNwZWNpZmllZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzODAxOQorCisyMDEwLTEyLTA0IDEzOjQzOjExIC0wNjAwICBSb2IgQ2xhcmsgPHJvYkB0aS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmg6CisJICB2NGwyOiBhZGQgaW50ZXJsYWNlZCBzdXBwb3J0CisKKzIwMTAtMTAtMDIgMTQ6NDU6MTQgLTA1MDAgIFJvYiBDbGFyayA8cm9iQHRpLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ4b3ZlcmxheS5oOgorCSAgdjRsMnNpbms6IGFkZCBuYXZpZ2F0aW9uIHN1cHBvcnQKKworMjAxMC0wNC0wNCAwNjo0Mzo0MSAtMDUwMCAgUm9iIENsYXJrIDxyb2JAdGkuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuaDoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDI6IGFkZCBub3JtIHByb3BlcnR5CisJICBCYXNlZCBvbiBhIHBhdGNoIGJ5IEd1ZW5uYWRpIExpYWtob3ZldHNraS4KKworMjAxMC0wNy0xMyAxMDowMzo1MSAtMDUwMCAgUm9iIENsYXJrIDxyb2JAdGkuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5oOgorCSAgdjRsMjogY2xlYW51cCBnZXQvc2V0IGlucHV0L291dHB1dAorCSAgb3V0cHV0IGRldmljZXMgc2hvdWxkIHVzZSBnZXQvc2V0IG91dHB1dCwgYW5kIGluIGVpdGhlciBjYXNlIHdlIHNob3VsZAorCSAgbm90IHByaW50IGEgd2FybmluZyBtZXNzYWdlIGlmIHRoZSBpb2N0bCBmYWlscyBidXQgdGhlIGRldmljZSBkb2VzIG5vdAorCSAgY2xhaW0gdG8gc3VwcG9ydCB0aGUgdHVuZXIgaW50ZXJmYWNlCisKKzIwMTAtMDYtMTAgMTE6MTU6NDYgLTA1MDAgIFJvYiBDbGFyayA8cm9iQHRpLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ4b3ZlcmxheS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnhvdmVybGF5Lmg6CisJICB2NGwyeG92ZXJsYXk6IGFkZCBzdXBwb3J0IHRvIGNyZWF0ZSB3aW5kb3cKKwkgIElmIHhvdmVybGF5IGlzIGF2YWlsYWJsZSwgdjRsMnNpbmsgc2hvdWxkIGNyZWF0ZSBhIHdpbmRvdyBmb3IgdGhlIG92ZXJsYXkgdG8KKwkgIGRpc3BsYXkgaW4uCisJICBUaGUgd2luZG93IGF1dG9tYXRpY2FsbHkgdHJpZXMgdG8gbWFrZSBpdHNlbGYgYXMgbGFyZ2UgYXMgcG9zc2libGUuCisJICBUaGlzIHdvcmtzIHdlbGwgb24gYSBzbWFsbCBzY3JlZW4sIGJ1dCBwZXJoYXBzIHNob3VsZCBmaXJzdCBhdHRlbXB0IHRvIHVzZQorCSAgdGhlIHNpemUgb2YgdGhlIHZpZGVvIHRoYXQgaXMgcGxheWVkIChubyBzY2FsaW5nKS4KKworMjAxMC0wNC0wNCAwNjo0MToyOCAtMDUwMCAgUm9iIENsYXJrIDxyb2JAdGkuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMnNpbms6IHNwZWNpYWwgaGFuZGxpbmcgZm9yIGNhc2VzIGdzdF9idWZmZXJfbWFrZV9tZXRhZGF0YV93cml0YWJsZSgpCisJICBTcGVjaWFsIGNhc2UgY2hlY2sgZm9yIHN1Yi1idWZmZXJzOiAgSW4gY2VydGFpbiBjYXNlcywgcGxhY2VzIGxpa2UKKwkgIEdzdEJhc2VUcmFuc2Zvcm0sIHdoaWNoIG1pZ2h0IGNoZWNrIHRoYXQgdGhlIGJ1ZmZlciBpcyB3cml0YWJsZSBiZWZvcmUgY29weWluZworCSAgbWV0YWRhdGEsIHRpbWVzdGFtcCwgYW5kIHN1Y2gsIHdpbGwgZmluZCB0aGF0IHRoZSBidWZmZXIgaGFzIG1vcmUgdGhhbiBvbmUKKwkgIHJlZmVyZW5jZSB0byBpdC4gIEluIHRoZXNlIGNhc2VzLCB0aGV5IHdpbGwgY3JlYXRlIGEgc3ViLWJ1ZmZlciB3aXRoIGFuIG9mZnNldD0wCisJICBhbmQgbGVuZ3RoIGVxdWFsIHRvIHRoZSBvcmlnaW5hbCBidWZmZXIgc2l6ZS4KKwkgIFRoaXMgY291bGQgaGFwcGVuIGluIHR3byBzY2VuYXJpb3M6ICgxKSBhIHRlZSBpbiB0aGUgcGlwZWxpbmUsIGFuZCAoMikgYmVjYXVzZQorCSAgdGhlIHJlZmNudCBpcyBpbmNyZW1lbnRlZCBpbiBnc3RfbWluaV9vYmplY3RfZnJlZSgpIGJlZm9yZSB0aGUgZmluYWxpemUgZnVuY3Rpb24KKwkgIGlzIGNhbGxlZCwgYW5kIGRlY3JlbWVudGVkIGFmdGVyIGl0IHJldHVybnMuLiAgYnV0IHJldHVybmluZyB0aGlzIGJ1ZmZlciB0byB0aGUKKwkgIGJ1ZmZlciBwb29sIGluIHRoZSBmaW5hbGl6ZSBmdW5jdGlvbiwgY291bGQgd2FrZSB1cCBhIHRocmVhZCBibG9ja2VkIGluCisJICBfYnVmZmVyX2FsbG9jKCkgd2hpY2ggY291bGQgcnVuIGFuZCBnZXQgYSBidWZmZXIgdy8gcmVmY250PT0yIGJlZm9yZSB0aGUgdGhyZWFkCisJICBvcmlnaW5hbGx5IHVucmVmJ2luZyB0aGUgYnVmZmVyIHJldHVybnMgZnJvbSBmaW5hbGl6ZSBmdW5jdGlvbiBhbmQgZGVjcmVtZW50cworCSAgdGhlIHJlZmNudCBiYWNrIHRvIDEhCisJICBUaGlzIGlzIHJlbGF0ZWQgdG8gaXNzdWUgIzU0NTUwMQorCisyMDEwLTA0LTA0IDA2OjM5OjUyIC0wNTAwICBSb2IgQ2xhcmsgPHJvYkB0aS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBmaXggcmFjZSBjb25kaXRpb24KKwkgIFRoZSBzaXplIG9mIHRoZSBidWZmZXIgd291bGQgYmUgemVybydkIG91dCBpbiBnc3RfdjRsMl9idWZmZXJfZmluYWxpemUoKQorCSAgYWZ0ZXIgdGhlIGJ1ZmZlciBpcyBxYnVmJ2Qgb3IgcHVzaGVkIG9udG8gdGhlIHF1ZXVlIG9mIGF2YWlsYWJsZSBidWZmZXJzLi4KKwkgIGxlYXZpbmcgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSB0aGUgdGhyZWFkIHdhaXRpbmcgZm9yIHRoZSBidWZmZXIgY291bGQgYXdha2UKKwkgIGFuZCBzZXQgYmFjayBhIHZhbGlkIHNpemUgYmVmb3JlIHRoZSBmaW5hbGl6aW5nIHRocmVhZCB6ZXJvcyBvdXQgdGhlIGxlbmd0aC4KKwkgIFRoaXMgd291bGQgcmVzdWx0IHRoYXQgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgaGFzIGxlbmd0aCBvZiB6ZXJvLgorCisyMDEwLTA0LTA0IDA2OjM5OjA4IC0wNTAwICBSb2IgQ2xhcmsgPHJvYkB0aS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5oOgorCSAgdjRsMnNpbms6IGFkZCBwcm9wZXJ0aWVzIHRvIGNvbnRyb2wgY3JvcAorCisyMDEwLTA0LTA0IDA2OjM3OjE2IC0wNTAwICBSb2IgQ2xhcmsgPHJvYkB0aS5jb20+CisKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ4b3ZlcmxheS5jOgorCSAgdjRsMjogcmUtZW5hYmxlIHgtb3ZlcmxheSBzdXBwb3J0CisKKzIwMTAtMTItMjUgMTE6NTI6MzYgLTA2MDAgIFJvYiBDbGFyayA8cm9iQHRpLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDJzaW5rOiBmaXggZm9yIFBBVVNFRC0+UkVBRFktPlBBVVNFRCBzdGF0ZSB0cmFuc2l0aW9ucworCSAgV2hlbiB2NGwyc2luayBnb2VzIHRvIFBBVVNFRC0+UkVBRFkgaXQgb25seSBzdG9wcyBzdHJlYW1pbmcsIHNvIHRoZSBzdGF0ZQorCSAgc2hvdWxkIGJlIHNldCB0byBTVEFURV9QRU5ESU5HX1NUUkVBTU9OIGluIGNhc2UgdGhlIGVsZW1lbnQgdHJhbnNpdGlvbnMKKwkgIGJhY2sgdG8gUExBWUlORy4KKworMjAxMC0wNC0wNCAwNjoyODo1MSAtMDUwMCAgUm9iIENsYXJrIDxyb2JAdGkuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuaDoKKwkgIHY0bDJzaW5rOiBhZGQgIm1pbi1xdWV1ZWQtYnVmcyIgcHJvcGVydHkKKworMjAxMC0wNC0wNCAwNjoyNjo1MCAtMDUwMCAgUm9iIENsYXJrIDxyb2JAdGkuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICB2NGwyc2luazogQWRkIHN1cHBvcnQgZm9yIGJsb2NraW5nIGRlcXVldWUuCisJICBXZSdkIHByZWZlciB0byB0aHJvdHRsZSB0aGUgZGVjb2RlciBpZiB3ZSBydW4gb3V0IG9mIGJ1ZmZlcnMsIHRvIGtlZXAgYSBib3VuZAorCSAgb24gbWVtb3J5IHVzYWdlLiAgQWxzbywgZm9yIE9NQVA0IGl0IGlzIGEgcmVxdWlyZW1lbnQgb2YgdGhlIGRlY29kZXIgdG8gbm90CisJICBhbHRlcm5hdGUgYmV0d2VlbiBtZW1vcnkgYWxsb2NlZCBieSB0aGUgZGlzcGxheSBkcml2ZXIgYW5kIG1hbGxvYydkIHVzZXJzcGFjZQorCSAgbWVtb3J5LgorCisyMDEwLTA0LTA0IDA2OjI0OjQxIC0wNTAwICBSb2IgQ2xhcmsgPHJvYkB0aS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBjbGVhciBmbGFncyBiZWZvcmUgcmV1c2luZyBidWZmZXIgZnJvbSBidWZmZXIgcG9vbAorCSAgbm90ZTogdGhpcyByZWFsbHkgb25seSBhZmZlY3RzIHY0bDJzaW5rIHNpbmNlIGdzdF92NGwyX2J1ZmZlcl9wb29sX2dldCgpIGlzCisJICBvbmx5IGNhbGxlZCBvbmNlIHBlciBidWZmZXIgaW4gdGhlIHY0bDJzcmMgY2FzZSAoaW4KKwkgIGdzdF92NGwyc3JjX2J1ZmZlcl9wb29sX2FjdGl2YXRlKCkpCisKKzIwMTAtMDQtMDQgMDY6MjM6MzEgLTA1MDAgIFJvYiBDbGFyayA8cm9iQHRpLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDJzaW5rOiBkb24ndCByZW5kZXIgcHJlcm9sbCBidWZmZXJzCisJICBNb3N0IHY0bDIgZHJpdmVycyB3aWxsIGdldCB1cHNldCB3aGVuIHlvdSBxdWV1ZSB0aGUgc2FtZSBidWZmZXIgdHdpY2UgaW4gYQorCSAgcm93IHdpdGhvdXQgZmlyc3QgZGVxdWV1ZWluZyBpdC4KKwkgIFJlbmRlcmluZyBvZiBwcmUtcm9sbCBidWZmZXJzIGNhbiBiZSByZS1pbnRyb2R1Y2VkIGxhdGVyLCBidXQgd2lsbCByZXF1aXJlCisJICB0cmFja2luZyB0aGUgc3RhdGUgb2YgdGhlIGJ1ZmZlciwgYW5kIGF2b2lkaW5nIHRvIHJlLVFCVUYgaWYgdGhlIGJ1ZmZlciBoYXMKKwkgIGFscmVhZHkgYmVlbiBwYXNzZWQgdG8gdGhlIGRyaXZlci4KKworMjAxMC0wNC0wNCAwNjoyMjo0MyAtMDUwMCAgUm9iIENsYXJrIDxyb2JAdGkuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMnNpbms6IEltcHJvdmUgYmVoYXZpb3IgZm9yIHNoYXJlZCBidWZmZXJzLgorCSAgV2hlbiB0aGUgZGVjb2RlciBpcyB1c2luZyBwYWRfYWxsb2MoKSwgdjRsMnNpbmsgd291bGQgYmVoYXZlIGJhZGx5IGlmCisJICB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgKCdxdWV1ZS1zaXplJyBwcm9wZXJ0eSkgd2FzIG5vdCBoaWdoIGVub3VnaCB0bworCSAgYWNjb3VudCBmb3IgYWxsIHRoZSBidWZmZXJzIG5lZWRlZCBieSB0aGUgZGVjb2RlciwgYW5kIG90aGVyIGVsZW1lbnRzCisJICAoc3VjaCBhcyBxdWV1ZXMpIGJldHdlZW4gdGhlIGRlY29kZXIgYW5kIHY0bDJzaW5rLiAgVGhpcyBwYXRjaAorCSAgc2xpZ2h0bHkgaW5jcmVhc2VzIHRoZSBkZWZhdWx0IG51bWJlciBvZiBidWZmZXJzLCBhbmQgY2hhbmdlcyB2NGwyc2luaworCSAgdG8gZHJvcCBmcmFtZXMgcmF0aGVyIHRoYW4gcmV0dXJuIGFuIGVycm9yIGluIGNhc2UgdGhlIG51bWJlciBvZgorCSAgYnVmZmVycyBpcyBub3QgaGlnaCBlbm91Z2guCisKKzIwMTAtMTEtMTUgMTU6NTg6MjggKzAxMDAgIEFuZHkgV2luZ28gPHdpbmdvQG9ibG9uZy5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmg6CisJICBhZGQgImNsaWVudCIgcHJvcGVydHkKKwkgICogZXh0L3B1bHNlL3B1bHNlc3JjLmMgKGdzdF9wdWxzZXNyY19jbGFzc19pbml0LCBnc3RfcHVsc2VzcmNfaW5pdCkKKwkgIChnc3RfcHVsc2VzcmNfc2V0X3Byb3BlcnR5LCBnc3RfcHVsc2VzcmNfZ2V0X3Byb3BlcnR5KQorCSAgKGdzdF9wdWxzZXNyY19vcGVuKTogQWRkIGEgImNsaWVudCIgcHJvcGVydHksIGFzIGluIHB1bHNlc2luay4KKwkgIEZpeGVzICM2MzQ5MTQKKworMjAxMC0xMi0yOSAxNTo1NDo0NiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHNlcmlhbGlzZS9kZXNlcmlhbGlzZSBmbG9hdHMgd2l0aG91dCBjaGFuZ2luZyBsb2NhbGUKKwkgIFVzZSBnX2FzY2lpX2R0b3N0cigpIGFuZCBnX2FzY2lpX3N0cnRvZCgpIHRvIHNlcmlhbGlzZS9kZXNlcmlhbGlzZQorCSAgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgaW5zdGVhZCBvZiB1Z2x5IGhhY2tzIHRoYXQgc3dpdGNoIGxvY2FsZQorCSAgYmVmb3JlIGFuZCBhZnRlciBjYWxsaW5nIGxpYmMgZnVuY3Rpb25zICh3aGljaCBpcyBub3QgYSBnb29kIGlkZWEKKwkgIGluIGEgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb24pLgorCisyMDEwLTEyLTI5IDE0OjQwOjA1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkgIHJ0cGpwZWdkZXBheTogZml4IGZyYW1lcmF0ZSBwYXJzaW5nIGZvciBsb2NhbGVzIHRoYXQgdXNlIGEgY29tbWEgYXMgZmxvYXRpbmcgcG9pbnQKKwkgIGF0b2YoKSBjb252ZXJ0cyBzdHJpbmdzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBsb2NhbGUsIGJ1dCB0aGUKKwkgIGZyYW1lcmF0ZSBzdHJpbmcgd2lsbCBsaWtlbHkgYWx3YXlzIHVzZSBhIGRvdCBhcyBmbG9hdGluZyBwb2ludAorCSAgc2VwYXJhdG9yLCBzbyB1c2UgZ19hc2NpaV9zdHJ0b2QoKSBpbnN0ZWFkIChidXQgYWxzbyBjYW5vbmljYWxpc2UKKwkgIHRoZSBzdHJpbmcgYmVmb3JlLCBzbyB3ZSBjYW4gaGFuZGxlIGJvdGggZm9ybWF0cyBhcyBpbnB1dCkuCisKKzIwMTAtMTItMjcgMTM6MTE6NTkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291cmNlOiB1c2UgdGhlIHJpZ2h0IHZhcmlhYmxlCisJICBVc2UgdGhlIHJpZ2h0IHZhcmlhYmxlIGZvciBzcGVjaWZ5aW5nIHRoYXQgd2Ugc2VudCBhIHJlY2VpdmVyIHJlcG9ydC4KKworMjAxMC0xMi0yMyAxNjo0MjoyOSAtMDYwMCAgUm9iIENsYXJrIDxyb2JAdGkuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMjogZml4IHR5cG8KKworMjAxMC0xMi0yMyAxNjowMzowMCAtMDYwMCAgUm9iIENsYXJrIDxyb2JAdGkuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thLWRlbXV4OiBhZGQgc3RyZWFtLWZvcm1hdCBhbmQgYWxpZ25tZW50IHByb3BlcnRpZXMgZm9yIGgyNjQKKworMjAxMC0xMi0yMiAxMTo0MTo1OSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIGdzdHBheTogZml4IGtsYXNzLCBhZGQgUlRQIGFzIGEgdXNlIGNhc2UKKworMjAxMC0xMi0xMiAxNToxMDo0NyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jOgorCSAgZ3N0ZGVwYXk6IGNsZWFudXAgdGhlIGNhY2hlCisKKzIwMTAtMTItMTIgMDU6MTA6MDEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5Lmg6CisJICBnc3RwYXkvZGVwYXk6IGFkZCBnZW5lcmljIGdzdHJlYW1lciBwYXlsb2FkZXIKKwkgIEFkZCB0aGUgYmVnaW5uaW5ncyBvZiBhIGdlbmVyaWMgR1N0cmVhbWVyIGJ1ZmZlcnMgcGF5bG9hZGVyLgorCisyMDEwLTEyLTIzIDE3OjA2OjU4ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkgIG1wNGdwYXk6IHJlc2V0IHN0YXRlIG9uIGZsdXNoLXN0b3AKKworMjAxMC0xMi0yMyAxNjoyNjowNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzoKKwkgIG1wNGdkZXBheTogZmx1c2ggc3RhdGUgb24gZmx1c2gtc3RvcAorCisyMDEwLTEyLTIzIDE2OjI1OjE1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBvbi1ucHQtc3RvcCBpcyBhIG1hbmFnZXIgc2lnbmFsCisKKzIwMTAtMTItMjMgMTU6MjQ6MjkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IGltcHJvdmUgUlRQIHNlc3Npb24gaGFuZGxpbmcKKwkgIFN0b3JlIHRoZSBSVFAgc2Vzc2lvbiBpbiB0aGUgc3RyZWFtIHNvIHRoYXQgd2UgY2FuIG1vcmUgZWZmaWNpZW50bHkKKwkgIHBlcmZvcm0gYWN0aW9ucyBvbiB0aGUgc3RyZWFtIGJhc2VkIG9uIFJUUCBzaWduYWxzLgorCisyMDEwLTEyLTIzIDEzOjU1OjMxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cHNvdXJjZTogaW5jbHVkZSBsYXN0IHNlbmQgUkIgYmxvY2sKKwkgIE9ubHkgcmVwb3J0IFJCIHZhbHVlcyBmb3Igbm9uLWludGVybmFsIHNvdXJjZXMuCisJICBSZXBvcnQgbm90IG9ubHkgdGhlIFJCIGJsb2NrcyB3ZSBsYXN0IHJlY2VpdmVkIGZyb20gYnV0IGFsc28gdGhlIGxhc3QgUkIKKwkgIGJsb2NrIHdlIHNlbnQgdG8gYSBzb3VyY2UuCisKKzIwMTAtMTItMjMgMTM6NTI6NTcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oOgorCSAgcnRwc2Vzc2lvbjogcmVtZW1iZXIgbGFzdCBzZW50IFJCIHZhbHVlcy4KKworMjAxMC0xMi0yMyAxMzowMDo0OSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzb3VyY2U6IGluY2x1ZGUgYWxsIHN0YXRzIGFuZCBkb2N1bWVudAorCSAgSW5jbHVkZSBhbGwgcG9zc2libGUgc3RhdHMgb2YgYSBzb3VyY2UgaW4gdGhlIHN0YXRzIHN0cnVjdHVyZSBiZWNhdXNlIHdlIG1pZ2h0CisJICBiZSBpbnRlcmVzdGVkIGluIHdoYXQgaGFwcGVuZWQgaW4gdGhlIHBhc3QuCisJICBEb2N1bWVudCB0aGUgc3RhdHMgcHJvcGVydHkgYW5kIHRoZSBmaWVsZHMuCisKKzIwMTAtMTItMjMgMTI6NTk6NTkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtUENNQS5jOgorCSAgZXhhbXBsZXM6IGFkZCBleGFtcGxlIFJUUCBzdGF0cworCSAgQWRkIHNvbWUgbW9yZSBSVFAgZXhhbXBsZXMgZm9yIGhvdyB0byByZXRyaWV2ZSBSVFAgc3RhdHMgaW4gYSByZWNlaXZlci4KKworMjAxMC0xMi0yMyAxMjo1ODowNSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogYWxzbyBlbWl0IFJUQ1AgYWN0aXZpdHkgb24gU1IKKwkgIEFsc28gZW1pdCBSVENQIGFjdGl2aXR5IHNpZ25hbHMgd2hlbiB3ZSByZWNlaXZlIGFuIFNSIHBhY2tldCB3aXRob3V0IFJCIGJsb2NrcywKKwkgIHN1Y2ggYXMgZnJvbSBhIHNlbmRlciB0aGF0IGlzIG5vdCByZWNlaXZpbmcgYW55dGhpbmcuCisKKzIwMTAtMTItMjMgMTE6MTA6NTUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgZG9jczogYWRkIHNvbWUgbW9yZSBnc3RydHBiaW4gZG9jcworCisyMDEwLTEyLTIyIDIxOjI3OjExICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSAgeGltYWdlc3JjOiByZW1vdGUgaXMgYSBib29sZWFuIChhbmQgbm90IHVpbnQpIHByb3BlcnR5CisKKzIwMTAtMTItMjIgMTk6NTg6MjEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IERvbid0IHVzZSBnc3RfcGFkX2FsbG9jX2J1ZmZlcigpCisJICBVc2luZyB0aGlzIGluIGEgZGVtdXhlciB3aWxsIGNhdXNlIGRlYWRsb2NrcyBpZiB0aGVyZSdzCisJICBhIHBhZCB3aXRoIGEgcGVuZGluZyBwYWQtYmxvY2sgZG93bnN0cmVhbSwgbm8gbWF0dGVyIGlmCisJICB0aGVyZSBpcyBhIHF1ZXVlIGJldHdlZW4gdGhlIHBhZCBvciBub3QuIFF1ZXVlcyBwYXNzCisJICBidWZmZXJhbGxvYyBkb3duc3RyZWFtIGZyb20gdGhlIHNhbWUgdGhyZWFkIGFuZCBvbmx5CisJICBhY3QgYXMgYSB0aHJlYWQgYm91bmRhcnkgZm9yIGV2ZW50cyBhbmQgYnVmZmVycy4KKworMjAxMC0xMi0yMiAxNDoxNDowOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBmaXggc3VidGl0bGUgcGFkIHRlbXBsYXRlLCB3ZSBvbmx5IGhhbmRsZSBrYXRlIGZvciBub3cKKworMjAxMC0xMi0xNiAxMTo0NDo0NCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIGRvY3M6IHVwZGF0ZSBydHNwc3JjIGRvY3MsIHJ0cGJpbiBpcyBub3QgaW4gLWJhZCBhbnkgbW9yZQorCisyMDEwLTEyLTIyIDExOjQyOjMxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiB1bmxvY2sgYmVmb3JlIGVtaXR0aW5nIHNpZ25hbHMKKworMjAxMC0xMi0yMSAyMjozNDo0OSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhYzNwYXkuaDoKKwkgIHJ0cGFjM3BheTogYWRkIEFDMyBwYXlsb2FkZXIKKworMjAxMC0xMi0yMSAyMjoxNzoxOSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5jOgorCSAgYWMzZGVwYXk6IGZpeCBkZWJ1ZyBjYXRlZ29yeSBkZXNjcmlwdGlvbgorCisyMDEwLTEyLTIxIDIyOjE2OjQyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSAgbXBhcGF5OiBhZGQgZGVidWcgY2F0ZWdvcnkKKworMjAxMC0xMi0yMCAxNDo0OTowMiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvanBlZ2VuYy5jOgorCSAganBlZ2VuYzogQWRkcyBhbm90aGVyIHRlc3QgY2FzZQorCSAgQWRkcyBhIHRlc3QgZm9yIGpwZWdlbmMgdG8gY2hlY2sgdGhhdCBpcyBwb3NzaWJsZSB0byBuZWdvdGlhdGUgYW5kCisJICBwdXNoIGJ1ZmZlcnMgd2l0aCBkaWZmZXJlbnQgcmVzb2x1dGlvbiBvbmUgYWZ0ZXIgYW5vdGhlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Mzc2ODYKKworMjAxMC0xMi0yMSAxMzozNzo0MCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWdlbmM6IHNpbmsgcGFkJ3MgZ2V0Y2FwcyBzaG91bGRuJ3QgdXNlIHRoZSBzcmMgcGFkIGdldGNhcHMKKwkgIEluc3RlYWQgb2YgdXNpbmcgZ2V0X2FsbG93ZWRfY2FwcyBvbiB0aGUgc3JjcGFkLCB0aGUgc2lua3BhZCBnZXRjYXBzCisJICBzaG91bGQgdXNlIHRoZSBnZXRjYXBzIG9mIHRoZSBzcmNwYWQncyBwZWVyLiBUaGlzIHdheSB0aGUgc3JjcGFkCisJICBjYW4ga2VlcCB1c2luZyBmaXhlZF9jYXBzIGFuZCBzaW5rcGFkIGdldGNhcHMgZXhwb3NlcyBhbGwgY2FwcworCSAgdGhhdCBjYW4gYmUgbmVnb3RpYXRlZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzNzY4NgorCisyMDEwLTEyLTIxIDE2OjU4OjQ3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFyb2J1c3RkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkgIHJ0cDogYWRkIFJUUCBoaW50IHRvIHRoZSBrbGFzcworCisyMDEwLTEyLTIxIDE2OjQ5OjI4ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFyb2J1c3RkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkgIHJ0cDogZml4IHJhbmsgb2YgcGF5bG9hZGVycyBhbmQgZGVwYXlsb2FkZXJzCisJICBTZXQgdGhlIHBheWxvYWRlcnMgYW5kIGRlcGF5bG9hZGVycyB0byBhIHJlYXNvbmFibGUgcmFuay4KKworMjAxMC0xMi0yMSAxNToyNDoxOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkgIHZyYXdkZXBheTogcmVzZXQgZGVwYXlsb2FkZXIgc3RhdGUKKwkgIFJlc2V0IHRoZSBkZXBheWxvYWRlciBzdGF0ZSBvbiBmbHVzaC1zdG9wLgorCisyMDEwLTEyLTIxIDE1OjA3OjE0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5oOgorCSAgbXA0cGF5OiB1c2Ugdm1ldGhvZCBmb3IgaW50ZXJjZXB0aW5nIGV2ZW50cworCisyMDEwLTEyLTIxIDEzOjU1OjQwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgdGhlb3JhcGF5OiBjbGVhciBwYWNrZXQgb24gZmx1c2gtc3RvcAorCisyMDEwLTEyLTIxIDEzOjQ5OjQxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSAgdm9yYmlzcGF5OiBjbGVhciBwYWNrZXQgb24gZmx1c2gtc3RvcAorCisyMDEwLTEyLTIxIDEyOjMxOjQ0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSAgbXA0Z2RlcGF5OiByZXNldCBkZXBheWxvYWRlciBzdGF0ZQorCisyMDEwLTEyLTIxIDEyOjI5OjU4ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIGgyNjRwYXk6IGZsdXNoIGFkYXB0ZXIgb24gZmx1c2gtc3RvcAorCisyMDEwLTEyLTIwIDE4OjQ5OjQ5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSAgbXBhcGF5OiBmbHVzaCBsYXN0IHBhY2tldHMgb24gRU9TCisKKzIwMTAtMTItMjAgMTc6NDc6MDUgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMTY5NDYyYSB0byA0NjQ0NWFkCisKKzIwMTAtMTItMjAgMTY6NTE6NDcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJICBtcGFwYXk6IHJlc2V0IHBheWxvYWRlciBvbiBzdGF0ZSBjaGFuZ2UKKworMjAxMC0xMi0yMCAxNjowNTozNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzoKKwkgIG1wYXBheTogcmVzZXQgcGF5bG9hZGVyIG9uIGZsdXNoCisJICBSZXNldCB0aGUgcGF5bG9hZGVyIG9uIGEgZmx1c2ggZXZlbnQuCisJICBIYW5kbGUgRElTQ09OVCBiZXR0ZXIuCisKKzIwMTAtMTItMjAgMTU6NTQ6NDUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBnZXQgYmV0dGVyIGJ1ZmZlcmluZyBsZXZlbAorCSAgV2hlbiB0aGUgaml0dGVyYnVmZmVyIGNvbnRhaW5zIC0xIHRpbWVzdGFtcHMsIG1ha2Ugc3VyZSB3ZSBzdGlsbCBjYWxjdWxhdGUgdGhlCisJICBidWZmZXIgZmlsbCBsZXZlbCBieSBza2lwcGluZyB0aGUgLTEgYnVmZmVycy4KKwkgIFRyeSB0byBiZSBtb3JlIHJlc2lsaWVudCB0byB3ZWlyZCBpbnB1dCB0aW1lc3RhbXBzLgorCisyMDEwLTEyLTIwIDExOjEwOjIyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogcHJvdmlkZSBhIGNsb2NrLgorCSAgc2luY2Ugd2UgYXJlIHVzaW5nIHRoZSBjbG9jayBmb3Igc3luYywgd2UgbmVlZCB0byBhbHNvIHByb3ZpZGUgYSBjbG9jayBmb3IgZ29vZAorCSAgbWVhc3VyZS4gVGhlIHJlYXNvbiBpcyB0aGF0IGV2ZW4gaWYgZG93bnN0cmVhbSBlbGVtZW50cyBwcm92aWRlIGEgY2xvY2ssIHdlCisJICBkb24ndCB3YW50IHRvIGhhdmUgdGhhdCBjbG9jayBzZWxlY3RlZCBiZWNhdXNlIGl0IG1pZ2h0IG5vdCBiZSBydW5uaW5nIHlldC4KKworMjAxMC0xMi0yMCAxMDo0OTo1NiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IGNvcHkgYnVmZmVyaW5nIHN0YXRzCisJICB3aGVuIHdlIGNyZWF0ZSBhbiBhZ2dyZWdhdGUgYnVmZmVyaW5nIG1lc3NhZ2UsIGNvcHkgdGhlIGJ1ZmZlcmluZyBzdGF0cyBmb3JtIHRoZQorCSAgbGFzdCBtZXNzYWdlLiBBdCBsZWFzdCB3ZSBnZXQgY29ycmVjdCBidWZmZXJpbmcgbW9kZSB0aGVuLgorCisyMDEwLTEyLTE5IDExOjAyOjQxICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3dhdmVuYy5jOgorCSAgd2F2ZW5jOiBGaXggbWVtb3J5IGxlYWtzIGluIHRoZSB1bml0IHRlc3QKKworMjAxMC0xMi0xOSAxMDo1ODoxNiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuaDoKKwkgIHJhZGlvYWN0djogUHJldmVudCB1c2Ugb2YgdW5pbml0aWFsaXplZCB2YWx1ZXMKKwkgIEZpeGVzIGJ1ZyAjNjE4NjUyLgorCisyMDEwLTEyLTE5IDEwOjIyOjI5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlYnVndXRpbHMvZ3N0Y2Fwc2RlYnVnLmM6CisJICBjYXBzZGVidWc6IERvbid0IGxlYWsgcGFkIHRlbXBsYXRlcyBjcmVhdGVkIGZyb20gc3RhdGljIHBhZCB0ZW1wbGF0ZXMKKworMjAxMC0xMS0yOSAxMjozNjowNiArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5oOgorCSAgeGltYWdlc3JjOiBjaGFuZ2UgZnJvbSBYR2V0SW1hZ2UgdG8gWEdldFN1YkltYWdlIGRlcGVuZGFudCBvbiBhIHByb3BlcnR5CisJICB4aW1hZ2VzcmM6IGNoYW5nZSBmcm9tIFhHZXRJbWFnZSB0byBYR2V0U3ViSW1hZ2UgZGVwZW5kYW50IG9uIGEgcHJvcGVydHkKKwkgIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHBlcmZvcm1hbmNlIGhpdHMgYnkgZGVmYXVsdC4KKworMjAxMC0xMS0yOCAxNjowNDozNSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICB4aW1hZ2VzcmM6IHVzZSBYR2V0U3ViSW1hZ2UgaW5zdGVhZCBvZiBYR2V0SW1hZ2UsIHdvcmtzIHdpdGggcmVtb3RlIFgKKwkgIHhpbWFnZXNyYzogdXNlIFhHZXRTdWJJbWFnZSBpbnN0ZWFkIG9mIFhHZXRJbWFnZSwgd29ya3Mgd2l0aCByZW1vdGUgWAorCSAgKG9uIG15IHNldHVwIGFueXdheS4uLikKKworMjAxMC0xMS0yNyAxNzoxNTozMiArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICB4aW1hZ2VzcmM6IGZpeCB2YXJpb3VzIHdpZHRoL2hlaWdodCBjYWxjdWxhdGlvbnMgYmVpbmcgb2ZmIGJ5IG9uZSwKKwkgIHhpbWFnZXNyYzogZml4IHZhcmlvdXMgd2lkdGgvaGVpZ2h0IGNhbGN1bGF0aW9ucyBiZWluZyBvZmYgYnkgb25lLAorCSAgYW5kIG1ha2UgaXQgc28gYSBzaW5nbGUgcGl4ZWwgd2lkdGgvaGVpZ2h0IGNhbiBiZSBjYXB0dXJlZCAoZXhjZXB0CisJICB0aGUgdG9wIGxlZnQgb25lLCBhcyAwLDAsMCwwIGlzIHJlc2VydmVkIGZvciBmdWxsIHNjcmVlbiBhcyBwZXIKKwkgIHRoZSBwcm9wZXJ0eSBjb21tZW50cykuCisKKzIwMTAtMTItMTcgMTk6MTk6MzUgLTA2MDAgIFJvYiBDbGFyayA8cm9iQHRpLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgZml4IGNvbXBpbGUgZXJyb3JzIG9uIG1hY29zeAorCSAgd2l0aCBpNjg2LWFwcGxlLWRhcndpbjEwLWdjYy00LjIuMToKKwkgIGdzdHY0bDJvYmplY3QuYzogSW4gZnVuY3Rpb24gJ2dzdF92NGwyX29iamVjdF9nZXRfbmVhcmVzdF9zaXplJzoKKwkgIGdzdHY0bDJvYmplY3QuYzoxOTg4OiB3YXJuaW5nOiBmb3JtYXQgJyV1JyBleHBlY3RzIHR5cGUgJ3Vuc2lnbmVkIGludCcsIGJ1dCBhcmd1bWVudCAxMiBoYXMgdHlwZSAnZ2ludCAqJworCSAgZ3N0djRsMm9iamVjdC5jOjE5ODg6IHdhcm5pbmc6IGZvcm1hdCAnJXUnIGV4cGVjdHMgdHlwZSAndW5zaWduZWQgaW50JywgYnV0IGFyZ3VtZW50IDEzIGhhcyB0eXBlICdnaW50IConCisKKzIwMTAtMTItMTcgMTU6Mzg6MTUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgcnRwaDI2NGRlcGF5OiBkZXRlcm1pbmUgb3V0cHV0IGgyNjQgbGF5b3V0IHVzaW5nIGNhcHMgbmVnb3RpYXRpb24KKwkgIC4uLiB0aGVyZWJ5IChwYXJ0aWFsbHkpIGRlcHJlY2F0aW5nIHByb3BlcnRpZXMgY3VycmVudGx5IGNvbnRyb2xsaW5nIHdoZXRoZXIKKwkgIG9yIG5vdCBieXRlLXN0cmVhbSBvdXRwdXQgb3IgTkFML0FVIGFsaWdubWVudCAodGhvdWdoIHByb3BlcnRpZXMgc3RpbGwgZGV0ZXJtaW5lCisJICBmYWxsYmFjayBpZiBub3RoaW5nIHNwZWNpZmllZCBpbiBjYXBzKS4KKwkgIEZpeGVzICM2MDY2NjIuCisKKzIwMTAtMTItMTYgMTg6NTU6NDMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJICBqMmtwYXk6IGhhbmRsZSBFT0MgY29ycmVjdGx5CisJICBEb24ndCBpbmNsdWRlIHRoZSBuZXh0IDIgYnl0ZXMgd2hlbiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZGF0YSBhbmQgdGhlcmUgYXJlCisJICBubyBtb3JlIGJ5dGVzIGxlZnQuCisKKzIwMTAtMTItMTYgMTU6MTU6NDkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGZsdXNoIHJlbWFpbmluZyBidWZmZXJlZCBzYW1wbGVzIG9uIEVPUworCSAgLi4uIHdoaWNoIGNhbiBtYWtlIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGFsbCBvciBub3RoaW5nIHdoZW4gZGVhbGluZworCSAgd2l0aCBzaG9ydCBzdHJlYW1zIGFuZCByZWxhdGl2ZWx5IGxhcmdlIHJpbmdidWZmZXIgc2VnbWVudC4KKworMjAxMC0xMi0xNiAxMDowNDoxOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IENoYW5nZSBjbGFzc2lmaWNhdGlvbiB0byBGaWx0ZXIvRWZmZWN0L1ZpZGVvL0RlaW50ZXJsYWNlCisKKzIwMTAtMTItMTUgMTg6MjE6MzQgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5jOgorCSAgcnRwajJrcGF5OiBJbml0aWFsaXplIGFsbCBmaWVsZHMKKwkgIE1ha2VzIHNhZCBjb21wbGllcnMgaGFwcHkKKworMjAxMC0xMi0xNSAxNjoyMjo1NCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkgIGoya3BheTogY2xlYW51cCBoZWFkZXIgY29uc3RydWN0aW9uCisJICBVc2UgYSBzaW1wbGVyIHdheSBvZiBjb25zdHJ1Y3RpbmcgdGhlIGhlYWRlciB0aGF0IGRvZXNuJ3QgZGVwZW5kIG9uCisJICB0aGUgZW5kaWFubmVzcy4KKworMjAxMC0xMi0xNSAxMzozMDo1MCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogZGVwZW5kIG9uIC1iYXNlIGZyb20gZ2l0IGZvciBuZXcgcnRwIGJhc2UgZGVwYXlsb2FkZXIgZmVhdHVyZXMKKwkgIFRoaXMgaXMgb2sgaW4gdGhpcyBjYXNlLCBzaW5jZSB0aGUgcGxhbiBpcyB0byByZWxlYXNlIGNvcmUvYmFzZSBhZ2FpbgorCSAgYWxvbmcgd2l0aCBnb29kL3VnbHkvYmFkIGluIHRoZSBuZXh0IGN5Y2xlLgorCisyMDEwLTEyLTE1IDE0OjU1OjU4ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSAyMDc0MmFlIHRvIDE2OTQ2MmEKKworMjAxMC0xMi0xNSAxMzoxMjowOSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5oOgorCSAgajJrZGVwYXk6IGFkZCBzdXBwb3J0IGZvciBidWZmZXIgbGlzdHMKKworMjAxMC0xMi0xNCAxODoxMjo0MyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogZml4IGF2ZXJhZ2UgUlRDUCBwYWNrZXQgc2l6ZSBzb21lIG1vcmUuCisJICBGaXggc3R1cGlkIGVycm9yIGluIGF2ZXJhZ2luZyBtYWNyby4KKwkgIEluY2x1ZGUgdWRwIGhlYWRlcnMgaW4gcGFja2V0IGxlbmd0aCBlc3RpbWF0aW9uLgorCisyMDEwLTEyLTE0IDE3OjE1OjIzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSAgcnRwYmluOiBjb3JyZWN0bHkgY2FsY3VsYXRlIFJUQ1AgcGFja2V0IHNpemUKKworMjAxMC0xMi0xNCAxNToyNzo1MiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkgIGoya3BheTogc3RvcCBzY2FubmluZyB3aGVuIHdlIHJlYWNoZWQgdGhlIGVuZAorCSAgU3RvcCBzY2FubmluZyBmb3IgbWFya2VycyB3aGVuIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZGF0YS4KKworMjAxMC0xMi0xMyAxNjoyMzoyNCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMDExYmNjOCB0byAyMDc0MmFlCisKKzIwMTAtMTItMTMgMTI6NTY6MTIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBhdm9pZCBsZWFraW5nIHNpbmsgZXZlbnRzCisJICBBdm9pZCBsZWFraW5nIHRoZSBuZXdzZWdtZW50IGV2ZW50IHdoZW4gaXQgaGFzIHRoZSB3cm9uZyBmb3JtYXQuCisKKzIwMTAtMTItMTIgMTQ6NTM6MTcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSAgbXA0dnBheTogd2UgY2FuIGFsc28gYWNjZXB0IHh2aWQgY2FwcworCisyMDEwLTEyLTEyIDAxOjM5OjA2ICsxMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IEF2b2lkIGluZmluaXRlIGxvb3AgZHJhaW5pbmcgZnJhbWVzCisJICBXaGVuIHRoZSBwaXBlbGluZSBpcyBmbHVzaGVkIGp1c3QgYXMgd2UncmUgZHJhaW5pbmcgaGlzdG9yeSwKKwkgIGRvbid0IGxvb3AgaW5maW5pdGVseSwganVzdCBkaXNjYXJkIHRoZSBoaXN0b3J5IGFuZCBhYm9ydC4KKworMjAxMC0xMi0xMSAxNzozOToyMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkgIGpwZWdkZWM6IGFkZCAibWF4LWVycm9ycyIgcHJvcGVydHkgdG8gaWdub3JlIGRlY29kaW5nIGVycm9ycworCSAgQWRkIHByb3BlcnR5IHRvIGlnbm9yZSBkZWNvZGluZyBlcnJvcnMuIERlZmF1bHQgaXMgdG8gaWdub3JlIGEgZmV3CisJICBkZWNvZGluZyBlcnJvcnMgaWYgdGhlIGlucHV0IGlzIHBhY2tldGl6ZWQsIGJ1dCBlcnJvciBvdXQgaW1tZWRpYXRlbHkKKwkgIGlmIHRoZSBpbnB1dCBpcyBub3QgcGFja2V0aXplZC4KKwkgIElnbm9yaW5nIGVycm9ycyBmb3IgcGFja2V0aXplZCBpbnB1dCBtb3N0IGxpa2VseSBkb2Vzbid0IHdvcmsKKwkgIHByb3Blcmx5IHlldCwgc28gZG9uJ3QgZG8gdGhhdCBmb3Igbm93LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYyMzA2MworCisyMDEwLTA1LTI4IDE1OjI3OjE0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAganBlZ2VuYzogZnJlZS9tYWxsb2MgaW5zdGVhZCBvZiByZWFsbG9jLCBhdm9pZHMgbWVtY3B5CisKKzIwMTAtMTItMTEgMTc6NDk6MDMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBDaGVjayBpZiB0aGVyZSdzIGFjdHVhbGx5IGEgc2VlayB0YWJsZSBiZWZvcmUgcGFyc2luZyBpdAorCisyMDEwLTEyLTExIDE3OjQ2OjE3ICswMTAwICBLaXNob3JlIEFyZXBhbGxpIDxraXNob3JlLmFyZXBhbGxpQGdtYWlsLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogSW1wbGVtZW50IENPTlZFUlQgYW5kIEZPUk1BVFMgcXVlcnkKKwkgIEZpeGVzIGJ1ZyAjNjM2Nzg0LgorCisyMDEwLTA3LTAxIDAwOjIyOjA3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYS1kZW11eDogcHV0IHVucmVjb2duaXNlZCBSSUZGIGZvcm1hdCBJRHMgaW50byB0aGUgdW5rbm93biBjYXBzCisJICBFeHRyYSBpbmZvIGNhbid0IGh1cnQuIEZpZWxkIG5hbWVzIGFyZW4ndCBuZWNlc3NhcmlseSBjb25zaXN0ZW50IHdpdGgKKwkgIHdoYXQncyB1c2VkIGVsc2V3aGVyZSB0aG91Z2ggKGUuZy4gYXZpZGVtdXgpLCBidXQgdGhlbiBuZWl0aGVyIGFyZSB0aGUKKwkgIGNhcHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjIzMTc4CisKKzIwMTAtMTAtMjkgMjI6NTA6MTQgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlbWl4ZXJjdHJsLmM6CisJKiBleHQvcHVsc2UvcHVsc2VtaXhlcmN0cmwuaDoKKwkgIHB1bHNlbWl4ZXI6IEltcGxlbWVudCBNSVhFUl9GTEFHX0FVVE9fTk9USUZJQ0FUSU9OUworCSAgQWRkIHRoZSBtaXhlciBmbGFnIGFuZCBzZW5kIG5vdGlmaWNhdGlvbnMgd2hlbiBlaXRoZXIgdGhlIHZvbHVtZSBvciBtdXRlZAorCSAgc3RhdHVzIGNoYW5nZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjE4Mzg5CisKKzIwMTAtMDItMDggMjE6NDE6MjkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBtYXJrIERJU0NPTlQgd2hlbiByZXN1bWluZyBQTEFZCisJICBJbiBwYXJ0aWN1bGFyLCB3aGVuIHN0cmVhbWluZyBpbnRlcmxlYXZlZCwgdGhpcyBhcnJhbmdlcyBmb3Igc2V0dGluZyBhIG5ldworCSAgdGltZXN0YW1wIG9uIG91dGdvaW5nIGJ1ZmZlciBzbyBkb3duc3RyZWFtIGNhbiBhcHByb3ByaWF0ZSByZXNldAorCSAgdG8gYSBjaGFuZ2UgaW4gKHJ0cCl0aW1lLgorCisyMDEwLTEyLTAyIDE2OjA4OjM0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogZGVncmFkZSBncmFjZWZ1bGx5IHVwb24gZmFpbGluZyBzZWVrIGFuZCB0d2VhayBRVUVSWV9TRUVLSU5HIHJlc3BvbnNlCisKKzIwMTAtMTAtMjUgMTE6NTE6MDYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBhZGQgYW5kIHVzZSBhdXRvIGJ1ZmZlcmluZyBtb2RlCisJICAuLi4gd2hpY2ggc2VsZWN0cyBCVUZGRVIgZm9yIGEgbm9uLWxpdmUgc3RyZWFtLCBhbmQgb3RoZXJ3aXNlIFNMQVZFLgorCSAgRml4ZXMgIzYzMzA4OC4KKworMjAxMC0xMi0wNiAxMjoxNjoxMiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5oOgorCSAgajJrZGVwYXk6IG1ha2UgdGhlIGRlcGF5bG9hZGVyIG1vcmUgcmVzaWxpZW50CisJICBVc2UgMyBhZGFwdGVycywgb25lIHRvIGFjY3VtdWxhdGUgcGFrZXRpemF0aW9uIHVuaXRzLCBhbm90aGVyIG9uIHRvIGFjY3VtdWxhdGUKKwkgIHRpbGVzIGFuZCBhIGxhc3Qgb25lIHRvIGFjY3VtdWxhdGUgdGhlIGZpbmFsIGZyYW1lLgorCSAgRG9uJ3QganVzdCBibGluZGx5IGZsdXNoIHRoZSBhZGFwdGVyIG9uIERJU0NPTlQgYnV0IG9ubHkgZGlzY2FyZCB0aGUgY3VycmVudAorCSAgcGFja2V0aXphdGlvbiB1bml0LgorCSAgV2hlbiB3ZSBkcm9wcGVkIGpwZWcyMDAwIHBhY2tldHMgYmV0d2VlbiBTT1AgbWFya2VycywgYWRqdXN0IHRoZSBTT1QgaGVhZGVyIHdpdGgKKwkgIHRoZSBuZXcgbGVuZ2h0LgorCisyMDEwLTEyLTA5IDEzOjQ5OjA0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IGZsb3cgcmV0dXJuIGFnZ3JlZ2F0aW9uCisKKzIwMTAtMTItMDggMTE6MzU6MzMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggaGFuZGxpbmcgbmVhciBlbmQtb2YtZmlsZSBjb3JuZXIgY2FzZXMKKwkgIEFsc28sIHJlbGF4IHNvbWUgZXJyb3IgaGFuZGxpbmcgdG8gbm90IGJhaWwgb3V0IGNvbXBsZXRlbHkgd2hlbiBzb21ldGhpbmcKKwkgIGZlZWxzIGFtaXNzLCBidXQgY29uc2lkZXIgdGhpcyBFT0YgYW5kIGNvbnRpbnVlIHdpdGggd2FzIG9idGFpbmVkIHNvIGZhci4KKworMjAxMC0xMi0wNyAxNzoxOTowMCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZyYWdtZW50ZWQgc3VwcG9ydDsgZml4IG9mZnNldCBoYW5kbGluZyBhbmQgcmVsYXggZXJyb3IgcmFpc2luZworCSAgSW4gcGFydGljdWxhciwgYWNjZXB0IHVua25vd24gc3RyZWFtIGluIHRyYWNrIGZyYWdtZW50LCBhbmQgb25seSBlcnJvciBvdXQKKwkgIGlmIHRoYXQgcmFpc2VzIHByb2JsZW1zIGxhdGVyIG9uIHdpdGggcmVzcGVjdCB0byBvZmZzZXQgdHJhY2tpbmcuCisJICBGaXhlcyAjNjIwMjgzLgorCisyMDEwLTEyLTA3IDEzOjExOjQ4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiB1c2UgYWFjIGNvZGVjLWRhdGEgdG8gYWRqdXN0IHNhbXBsZXJhdGUgaWYgbmVlZGVkCisJICBCYXNlZCBvbiBwYXRjaCBieSBGYWJpZW4gTGViYWlsbGlmLURlbGFtYXJlIDxmYWJpZW5AYXJxLW1lZGlhLmNvbT4KKwkgIEZpeGVzICM2MzY2MjEuCisKKzIwMTAtMTItMDcgMTE6NDM6MTMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogZG9uJ3QgdW5jb3JrIGluIF9zdGFydAorCSAgRG9uJ3QgdW5jb3JrIGluIHRoZSBfc3RhcnQgbWV0aG9kIGp1c3QgeWV0IGJ1dCB3YWl0IHVudGlsIHdlIGhhdmUgd3JpdHRlbiBzb21lCisJICBzYW1wbGVzIHRvIHB1bHNlYXVkaW8uIFRoaXMgYXZvaWQgdW5kZXJydW5zIG9uIHB1bHNlYXVkaW8gYW5kIGxlc3MgY3JhY2tsaW5nCisJICBub2lzZXMgd2hlbiBzdGFydGluZy4KKworMjAxMC0xMi0wNyAxMTo0Nzo0MSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDEwLTEyLTA3IDExOjQzOjEzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGRvbid0IHVuY29yayBpbiBfc3RhcnQKKwkgIERvbid0IHVuY29yayBpbiB0aGUgX3N0YXJ0IG1ldGhvZCBqdXN0IHlldCBidXQgd2FpdCB1bnRpbCB3ZSBoYXZlIHdyaXR0ZW4gc29tZQorCSAgc2FtcGxlcyB0byBwdWxzZWF1ZGlvLiBUaGlzIGF2b2lkIHVuZGVycnVucyBvbiBwdWxzZWF1ZGlvIGFuZCBsZXNzIGNyYWNrbGluZworCSAgbm9pc2VzIHdoZW4gc3RhcnRpbmcuCisKKzIwMTAtMTItMDcgMTE6NDI6MTUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHVzZSBfb2JqZWN0X3JlZl9zaW5rKCkgd2hlbiB3ZSBjYW4KKworMjAxMC0xMi0wNyAxMTo0MDo1OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogZG9uJ3QgYWJ1c2UgdGhlIGNsYXNzIGxvY2sKKwkgIFVzZSBhIG5ldyBzdGF0aWMgbG9jayB0byBwcm90ZWN0IHRoZSBwcm9iZWQgZGV2aWNlIGxpc3QgaW5zdGVhZCBvZiB0aGUgb2JqZWN0CisJICBjbGFzcyBsb2NrLgorCisyMDEwLTEyLTA2IDE5OjU5OjQ5ICswMTAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IGNvbXBpbGVyIHdhcm5pbmdzIG9uIE9TWC4KKworMjAxMC0xMi0wNiAxODoxNzoyNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGFkZCBkZWJ1ZyB0byBub3RpZnkgd2hlbiBza2lwcGluZyB0byBqcGVnIGhlYWRlcgorCisyMDEwLTEyLTA2IDE4OjE2OjE5ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogZGlzY2FyZCBpbmNvbXBsZXRlIGltYWdlCisJICAuLi4gYXMgZGV0ZXJtaW5lZCB3aGVuIGZpbmRpbmcgU09JIG5leHQgaW1hZ2UgYmVmb3JlIGFuIEVPSS4KKwkgIEJhc2VkIG9uIHBhdGNoIGJ5IERhdmlkIEhveXQgPGRhdmlkLmhveXRAbGxubC5nb3Y+CisJICBGaXhlcyAjNjM1NzM0LgorCisyMDEwLTEyLTA2IDE3OjQ1OjM4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogYXZvaWQgaW5maW5pdGUgbG9vcCB3aGVuIHJlc3luY2luZworCSAgRml4ZXMgIzYzNTczNCAocGFydGx5KS4KKworMjAxMC0xMi0wNiAxNzoyODozMiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIG9mIHNzaDovL2dpdC5mcmVlZGVza3RvcC5vcmcvZ2l0L2dzdHJlYW1lci9nc3QtcGx1Z2lucy1nb29kIGludG8gMC4xMQorCisyMDEwLTEyLTA2IDE3OjI3OjUxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBhbmRyb2lkL2FwZXRhZy5tazoKKwkqIGFuZHJvaWQvYXZpLm1rOgorCSogYW5kcm9pZC9mbHYubWs6CisJKiBhbmRyb2lkL2ljeWRlbXV4Lm1rOgorCSogYW5kcm9pZC9pZDNkZW11eC5tazoKKwkqIGFuZHJvaWQvcXRkZW11eC5tazoKKwkqIGFuZHJvaWQvcnRwLm1rOgorCSogYW5kcm9pZC9ydHBtYW5hZ2VyLm1rOgorCSogYW5kcm9pZC9ydHNwLm1rOgorCSogYW5kcm9pZC9zb3VwLm1rOgorCSogYW5kcm9pZC91ZHAubWs6CisJKiBhbmRyb2lkL3dhdmVuYy5tazoKKwkqIGFuZHJvaWQvd2F2cGFyc2UubWs6CisJKiBjb25maWd1cmUuYWM6CisJICBtb3JlIDAuMTAgLT4gMC4xMSBjaGFuZ2VzCisKKzIwMTAtMTItMDYgMTU6MjE6NTMgKzAxMDAgIERhdmlkIEhveXQgPGRob3l0QGxsbmwuZ292PgorCisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYzoKKwkgIGltYWdlZnJlZXplOiBwYXNzIGFsb25nIGVvcyBpZiByZWNlaXZlZCBiZWZvcmUgYnVmZmVyIGFycml2ZXMKKwkgIEZpeGVzICM2MzYxNzIuCisKKzIwMTAtMTAtMjAgMTE6MDU6NDkgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8YW1vcmFsZXNAZmx1bW90aW9uLmNvbT4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogdHJ5IHRvIHdyaXRlIHRpbWVzdGFtcHMgaW4gYWxsIHRoZSBvdXRnb2luZyBidWZmZXJzCisJICBGaXhlcyAjNjMyNjU0LgorCisyMDEwLTEyLTA2IDEyOjIxOjAwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IHN0YXJ0IDAuMTEgYnJhbmNoCisKKzIwMTAtMTItMDYgMTI6MTc6MjEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVidWd1dGlscy9wcm9ncmVzc3JlcG9ydC5jOgorCSogZ3N0L2RlYnVndXRpbHMvcHJvZ3Jlc3NyZXBvcnQuaDoKKwkgIHByb2dyZXNzcmVwb3J0OiBvcHRpb25hbGx5IGRldGVybWluZSBwcm9ncmVzcyB1c2luZyBidWZmZXIgbWV0YWRhdGEKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5IExlbyBTaW5nZXIgPGxzaW5nZXIgYXQgY2FsdGVjaC5lZHU+CisJICBGaXhlcyAjNjI5NDE4LgorCisyMDEwLTEyLTA1IDE0OjM5OjE5ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbnRlcmxlYXZlLmM6CisJICBjaGVjazogRml4dXAgdGhlIHNodXR0aW5nIGRvd24gb3JkZXIKKwkgIEZpcnN0IGJyaW5nIGRvd24gZXZlcnl0aGluZyB0byBOVUxMIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHVubGluaworCSAgb3IgdW5yZWYgYW55dGhpbmcuCisJICBBdm9pZHMgdGhlIHRlc3RzIGp1c3QgaGFuZ2luZyB0aGVyZSBmb3IgZXZlciB3YWl0aW5nIHRvIGFjcXVpcmUgYQorCSAgbG9jayB0aGF0IGRvZXNuJ3QgZXhpc3QgYW55bW9yZS4KKworMjAxMC0xMS0wNCAxOTozMTo0NSArMDEwMCAgSmFubmUgR3J1bmF1IDxqYW5uZS5ncnVuYXVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMnNyYzogc2V0IHRvcCBmaWVsZCBmaXJzdCBmb3IgaW50ZXJsYWNlZCBidWZmZXJzIGlmIHY0bDIgZXhwb3J0cyBpdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzNDM5MworCisyMDEwLTExLTA0IDE4OjM2OjA5ICswMTAwICBKYW5uZSBHcnVuYXUgPGphbm5lLmdydW5hdUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJzcmM6IGNoZWNrIGZpZWxkIGluZm9ybWF0aW9uIGFuZCBzZXQgaW50ZXJsYWNlZCBjYXBzIGFjY29yZGluZ2x5CisJICBSZWplY3QgdGhlIGZvcm1hdCBpZiB0aGUgZmllbGQgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzNDM5MQorCisyMDEwLTEyLTAzIDE3OjQyOjE0ICswMTAwICBCZW5qYW1pbiBHYWlnbmFyZCA8YmVuamFtaW4uZ2FpZ25hcmRAc3Rlcmljc3Nvbi5jb20+CisKKwkqIEFuZHJvaWQubWs6CisJKiBhbmRyb2lkL05PVElDRToKKwkqIGFuZHJvaWQvYXBldGFnLm1rOgorCSogYW5kcm9pZC9hdmkubWs6CisJKiBhbmRyb2lkL2Zsdi5tazoKKwkqIGFuZHJvaWQvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLW1hcnNoYWwuYzoKKwkqIGFuZHJvaWQvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLW1hcnNoYWwuaDoKKwkqIGFuZHJvaWQvZ3N0L3VkcC9nc3R1ZHAtZW51bXR5cGVzLmM6CisJKiBhbmRyb2lkL2dzdC91ZHAvZ3N0dWRwLWVudW10eXBlcy5oOgorCSogYW5kcm9pZC9nc3QvdWRwL2dzdHVkcC1tYXJzaGFsLmM6CisJKiBhbmRyb2lkL2dzdC91ZHAvZ3N0dWRwLW1hcnNoYWwuaDoKKwkqIGFuZHJvaWQvaWN5ZGVtdXgubWs6CisJKiBhbmRyb2lkL2lkM2RlbXV4Lm1rOgorCSogYW5kcm9pZC9xdGRlbXV4Lm1rOgorCSogYW5kcm9pZC9ydHAubWs6CisJKiBhbmRyb2lkL3J0cG1hbmFnZXIubWs6CisJKiBhbmRyb2lkL3J0c3AubWs6CisJKiBhbmRyb2lkL3NvdXAubWs6CisJKiBhbmRyb2lkL3VkcC5tazoKKwkqIGFuZHJvaWQvd2F2ZW5jLm1rOgorCSogYW5kcm9pZC93YXZwYXJzZS5tazoKKwkgIEFkZCBidWlsZCBzeXN0ZW0gZm9yIEFuZHJvaWQKKworMjAxMC0wMy0yNiAxMzo1MTo1OCArMDEwMCAgR3VpbGxhdW1lIEVtb250IDxnZW1vbnRAaWdhbGlhLmNvbT4KKworCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2c2Vlay5jOgorCSAgbmF2c2VlazogYWRkIGJhc2ljIHN1cHBvcnQgdG8gY2hhbmdlIHBsYXliYWNrIHJhdGUKKwkgIFRoZSBmb2xsb3dpbmcga2V5cyB3aWxsIG5vdyBiZSBpbnRlcnByZXRlZCBieSBuYXZzZWVrOgorCSAgJ2YnIG1lYW5zIGZhc3QgZm9yd2FyZDogdGhlIHN0cmVhbSBnZXRzIHBsYXllZCBhdCByYXRlIDIuMAorCSAgJ3InIG1lYW5zIHJld2luZDogdGhlIHN0cmVhbSBnZXRzIHBsYXllZCBhdCByYXRlIC0yLjAKKwkgICduJyBtZWFucyBub3JtYWw6IHRoZSBzdHJlYW0gZ2V0cyBwbGF5ZWQgYXQgcmF0ZSAxLjAKKwkgIEZpeGVzICM2MzE1MTYuCisKKzIwMTAtMTItMDEgMTM6MTI6MDQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgc3VwcG9ydCBmb3IgZShhKWMtMyBhdWRpbworCisyMDEwLTExLTE5IDEyOjQ0OjM1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogYXZvaWQgc2VuZGluZyBFT1MgZXZlbnQgdHdpY2UKKworMjAxMC0xMS0xOSAxMjo0NDoxOCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJlbW92ZSBkZWFkIGNvZGUgdHJ5aW5nIHRvIHVwZGF0ZSBzdHJlYW0gZHVyYXRpb24KKwkgIE9uIHRoZSBvbmUgaGFuZCwgaXQgaW5zdWZmaWNpZW50bHkgY2hlY2tzIHdoZXRoZXIgaXQgb25seSB1cGRhdGVzIGEgZHVtbXkKKwkgIHNlZ21lbnQuICBPbiB0aGUgb3RoZXIgaGFuZCwgb25seSBkb2luZyB0aGlzIGF0IHRoZSB0aW1lIHRoZSBsYXN0IHNhbXBsZWQgaXMKKwkgIHByZXBhcmVkIChhbmQgc2VudCBkb3duc3RyZWFtKSBpcyB0b28gbGl0dGxlIHRvbyBsYXRlLgorCisyMDEwLTExLTA5IDEwOjU4OjU3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZnJhZ21lbnRlZCBzdXBwb3J0OyBoYW5kbGUgaXNtdiBzYW1wbGUgZmxhZ3MKKworMjAxMC0xMS0wOCAxMTo0MToyMSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZyYWdtZW50ZWQgc3VwcG9ydDsgaGFuZGxlIGlzbXYgc3RibCBhdG9tcworCSAgLi4uIG9yIGxhY2sgb2Ygc29tZSB0aGVyZW9mLCBzdWNoIGFzIG1hbmRhdG9yeSBzdHN6LiAgU2h1ZmZsZSBzb21lIGNvZGUKKwkgIGluIF9zdGJsX2luaXQgdG8gZGV0ZWN0IHRoaXMgZWFybHkgZW5vdWdoLgorCisyMDEwLTExLTA4IDExOjM5OjM3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZnJhZ21lbnRlZCBzdXBwb3J0OyBjb21wZW5zYXRlIGZvciBpc212IG9mZnNldCBoYW5kbGluZworCSAgLi4uIG9yIGxhY2sgdGhlcmVvZiwgd2hpY2ggYWNjb3JkaW5nIHRvIHNwZWNzIHdvdWxkIHB1dCBtZWRpYSBkYXRhIGluCisJICB1bmxpa2VseSBwb3NpdGlvbi4KKworMjAxMC0xMS0wNCAxNDowNzo1NiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IGZyYWdtZW50ZWQgc3VwcG9ydCBmb3IgcHVzaCBtb2RlCisKKzIwMTAtMTEtMDQgMTA6MTc6MzcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJICBxdGRlbXV4OiBmcmFnbWVudGVkIHN1cHBvcnQ7IHByb3BlciBhbmQgaW5jcmVtZW50YWwgbW9vZiBwYXJzaW5nCisJICBUaGF0IGlzLCBwYXJzZSBlYWNoIG1vb2YgaW4gb25lIHBhc3MgKGNvbnNpZGVyaW5nIGFsbCBjb250YWluZWQgc3RyZWFtcycKKwkgIG1ldGFkYXRhKSwgYW5kIGRvIHNvIGluY3JlbWVudGFsbHkgYXMgbmVlZGVkIGZvciBwbGF5YmFjayByYXRoZXIgdGhhbgorCSAgYW4gaW5pdGlhbCBjb21wbGV0ZSBzY2FuIG9mIGFsbCBtb29mICh0aG91Z2ggYWxsIG1vb3Ygc2FtcGxlIG1ldGFkYXRhCisJICBpcyBmdWxseSBwYXJzZWQgYXQgc3RhcnR1cCkuCisKKzIwMTAtMTEtMDQgMTA6MDY6MzAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiByZWZhY3RvciBzdHJlYW0gZnJlZWluZworCisyMDEwLTExLTA0IDEwOjA1OjE1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZGVsZWdhdGUgbGluZWFyIHNlYXJjaCBmb3Igc2FtcGxlIHRvIGJpbmFyeSBzZWFyY2ggd2hlbiBwb3NzaWJsZQorCSAgQWxzbyBhcnJhbmdlIGZvciBwYXJzaW5nIGEgc2FtcGxlIHByaW9yIHRvIHRha2luZyBhIHJlZmVyZW5jZSB0byBpdCwKKwkgIHdoaWNoIHJlcXVpcmVzIGxlc3MgbWVtb3J5IGxheW91dCBhc3N1bXB0aW9ucyBmb3IgY29ycmVjdG5lc3MuCisKKzIwMTAtMTEtMDEgMTU6NTI6MjkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmcmFnbWVudGVkIHN1cHBvcnQ7IGhhbmRsZSBtb292IHNhbXBsZXMgYW5kIHByb3BlciBzdHJlYW0gZHVyYXRpb24KKworMjAxMC0xMS0wMSAxMzo0MDowNSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZyYWdtZW50ZWQgc3VwcG9ydDsgY29uc2lkZXIgbXZleCBhbmQgaGFuZGxlIGZsYWdzIGFuZCBvZmZzZXQgZmllbGRzCisKKzIwMTAtMTAtMjggMTY6NDk6NDEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmcmFnbWVudGVkIHN1cHBvcnQ7IGZvcmVnbyBjaGVjayBmb3Igc2hvcnQgc3RyZWFtcworCSAgLi4uIGFzIHNvbWUgYm9ndXMgZmlsZXMgbWF5IGluZGljYXRlIHN0cmVhbXMgb2YgMCBkdXJhdGlvbiBpbiBtb292LAorCSAgd2hpbGUgaW5kaWNhdGluZyB0aGUgY29tcGxldGUgbW92aWUgZHVyYXRpb24gaW4gbXZoZCAodGhlIGxhdHRlciBzaG91bGQKKwkgIGJlIGluIG1laGQpLgorCisyMDEwLTEwLTI4IDE2OjQ2OjQ4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF90eXBlcy5oOgorCSAgcXRkZW11eDogZnJhZ21lbnRlZCBzdXBwb3J0OyBjb2RlIGNsZWFudXBzIGFuZCBvcHRpbWl6YXRpb25zIGluIGF0b20gcGFyc2luZworCSAgQXZvaWQgZXh0cmEgYWxsb2NhdGlvbiBpbiBfcGFyc2VfdHJ1biwgYWRkIG1vcmUgY2hlY2tzIGZvciBwYXJzaW5nIGVycm9ycywKKwkgIGFkZCBvciBhZGp1c3Qgc29tZSBkZWJ1ZyBzdGF0ZW1lbnQsIGZpeCBjb21tZW50cywgc3ByaW5rbGUgc29tZSBicmFuY2gKKwkgIHByZWRpY3Rpb24uCisKKzIwMTAtMDktMTMgMjM6MTk6NDQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwYXJzZV9tb29mIHNob3VsZCByZXR1cm4gVFJVRSBvbiBzdWNjZXNzCisKKzIwMTAtMDktMTAgMjI6NDE6MDMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBGaXggaXRlcmF0aW9uIGJ1ZworCSAgQXZvaWQgaW5maW5pdGUgbG9vcCB3aGVuIGl0ZXJhdGluZyB0cmFmCisKKzIwMTAtMDktMTAgMjE6MzI6MjYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBSZWZhY3RvciB0cnVuIHBhcnNpbmcKKwkgIFRoZSBhbGxvY2F0aW9uIG9mIHRoZSBzYW1wbGVzIGNhbiBiZSBwbGFjZWQgb3V0IG9mIHRoZSBsb29wLgorCSAgTWFrZXMgdGhlIGNvZGUgY2xlYXJlci4KKwkgIEFsc28gYXZvaWQgcmVseWluZyBvbiB0cmFmIGluZm9ybWF0aW9uIGFzIGl0IGlzIHBsYWNlZCBvbiB0aGUKKwkgIGVuZCBvZiB0aGUgZmlsZSBhbmQgbWlnaHQgbm90IGJlIGFjZXNzaWJsZSBvbiBwdXNoIG1vZGUuCisKKzIwMTAtMDktMTAgMDA6Mjk6MjYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBSZW1vdmUgcGFyc2luZyBvZiB1bnVzZWQgYXRvbQorCSAgc2R0cCBhdG9tIGlzIHBhcnNlZCBidXQgbm90IHVzZWQsIHNvIHdlIGRvbid0IGhhdmUgdG8KKwkgIHBhcnNlIGl0LgorCisyMDEwLTExLTA5IDExOjQ1OjAwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogdHdlYWsgd2FtIHN1cHBvcnQKKwkgIC4uLiB3aXRoIHNvbWUgY29tbWVudCBhbmQgcG9ydGFiaWxpdHkgbWFjcm9zLgorCisyMDA5LTA5LTIzIDE4OjQ3OjQyICswMjAwICBNYXJjLUFuZHLDqSBMdXJlYXUgPG1sdXJlYXVAZmx1bW90aW9uLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfdHlwZXMuYzoKKwkgIHF0ZGVtdXg6IHN1cHBvcnQgd21hICYgdmMtMQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU5NjMyMQorCisyMDEwLTAzLTExIDA5OjU2OjA0ICswMTAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPGFtb3JhbGVzQGZsdW1vdGlvbi5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IHBhcnNlIGZtcDQgc2FtcGxlcyBpbmZvcm1hdGlvbgorCSAgVGhlIGZyYWdtZW50ZWQgbXA0IGZvcm1hdCBzdG9yZXMgdGhlIHRyYWNrcyBhbmQgc2FtcGxlcyBpbmZvcm1hdGlvbiBpbiB0aGUKKwkgICdtb29mJyBib3hlcywgd2hpY2ggYXJlIGFwcGVuZGVkIGJlZm9yZSBlYWNoIGZyYWdtZW50IChmcmFnbWVudC0+J21vb2YnKydtZGF0JykuCisJICBUaGUgJ21mcmEnIGJveCBzdG9yZXMgdGhlIG9mZnNldCBvZiBlYWNoICdtb29mJyBib3ggYW5kIHRoZWlyIHByZXNlbnRhdGlvbgorCSAgdGltZS4gVGhlIGxvY2F0aW9uIG9mIHRoaXMgYm94IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgJ21mcm8nIGJveCwgd2hpY2ggaXMKKwkgIGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKwkgIFRoZSAnbWZyYScgYm94IGlzIHBhcnNlZCB0byBnZXQgdGhlIG9mZnNldCBvZiBlYWNoICdtb29mJyBib3ggYW5kIHRoZWlyCisJICBwcmVzZW50YXRpb24gdGltZS4KKwkgIEVhY2ggJ21vb2YnIGJveCBjYW4gY29udGFpbiBpbmZvcm1hdGlvbiBmb3Igb25lIG9yIG1vcmUgdHJhY2tzIGluc2lkZQorCSAgJ3RmaGQnIGJveGVzLiBGb3IgZWFjaCB0cmFjayBpbiBhICdtb29mJywgd2UgaGF2ZSBhICd0cnVuJyBib3gsIHdoaWNoCisJICBjb250YWlucyBpbmZvcm1hdGlvbiBvZiBlYWNoIHNhbXBsZSAob2Zmc2V0IGFuZCBkdXJhdGlvbikgdXNlZCB0byBidWlsZAorCSAgdGhlIHNhbXBsZXMgdGFibGUuCisJICBCYXNlZCBvbiBwYXRjaCBieSBNYXJjLUFuZHLDqSBMdXJlYXUgPG1sdXJlYXVAZmx1bW90aW9uLmNvbT4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD01OTYzMjEKKworMjAxMC0wMy0xMSAxNTozNDo0OSArMDEwMCAgTWFyYy1BbmRyw6kgTHVyZWF1IDxtbHVyZWF1QGZsdW1vdGlvbi5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0YXRvbXBhcnNlci5oOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2R1bXAuaDoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZm91cmNjLmg6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X3R5cGVzLmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X3R5cGVzLmg6CisJICBxdGRlbXV4OiBhZGQgZnJhZ21lbnRlZCBtcDQgZm91cmNjcworCSAgQWRkcyBmb3VyY2MncyBmb3IgdGZyYSwgdGZoZCwgdHJ1biwgc2R0cCwgdHJleCwgbWVoZCBhbmQKKwkgIHRoZWlyIGR1bXBzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTk2MzIxCisKKzIwMTAtMDMtMTEgMTA6MjQ6NTYgKzAxMDAgIE1hcmMtQW5kcsOpIEx1cmVhdSA8bWx1cmVhdUBmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwYXJzZSB0aGUgdHJhY2sgaWQgZnJvbSB0aGUgdHJhY2sgaGVhZGVyCisJICBTaWduZWQtb2ZmLWJ5OiBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPGFtb3JhbGVzQGZsdW1vdGlvbi5jb20+CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTk2MzIxCisKKzIwMTAtMDMtMTEgMTQ6MTA6MTIgKzAxMDAgIE1hcmMtQW5kcsOpIEx1cmVhdSA8bWx1cmVhdUBmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhbGxvdyBwdWxsaW5nIGF0b21zIHdpdGggdW5rbm93biBzaXplCisJICBTaWduZWQtb2ZmLWJ5OiBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPGFtb3JhbGVzQGZsdW1vdGlvbi5jb20+CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTk2MzIxCisKKzIwMTAtMDctMTQgMjA6MTM6NTUgKzAyMDAgIE1hcmMtQW5kcsOpIEx1cmVhdSA8bWx1cmVhdUBmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2R1bXAuYzoKKwkgIHF0ZGVtdXg6IG1ha2UgcXRkZW11eF9kdW1wX212aGQgcGFyc2UgdmVyc2lvbiAxIGNvcnJlY3RseQorCSAgVmVyc2lvbnMgMCBhbmQgMSBvZiBtdmhkIGhhdmUgZGlmZmVyZW50IHNpemVzIG9mIGl0cyB2YWx1ZXMKKwkgICgzMmJpdHMvNjRiaXRzKS4gVGhpcyBwYXRjaCBtYWtlcyBpdCBkdW1wIHRoZW0gY29ycmVjdGx5LgorCSAgQWxzbyB1c2UgdGhlIHJpZ2h0IG5vZGUgaW4gdGhlIHBhcmFtZXRlciBhbmQgbm90IHRoZSByb290IG5vZGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTk2MzIxCisKKzIwMTAtMTEtMTkgMTI6NDU6MDAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBtaW5vciBjbGVhbnVwcyBpbiBzZXR0aW5nIHN0cmVhbWhlYWRlciBvbiBjYXBzCisKKzIwMTAtMTEtMDIgMTc6MDQ6MDQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IG5vcm1hbGl6ZSBlbXB0eSBDdWVzIHRvIG5vIEN1ZXMKKwkgIC4uLiB0byB0cmlnZ2VyIGluZGV4bGVzcyBzZWVraW5nLgorCisyMDEwLTEwLTI2IDExOjE1OjQ5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGFkZCB3b3JrYXJvdW5kIGZvciBidWdneSBsaXN0IHNpemUKKwkgIEZpeGVzIHRydW5jYXRlZCBleHRyYS1kYXRhIGluIGhkcmwvc3RybC9zdHJmIGR1ZSB0byBidWdneSBjb250YWluaW5nCisJICBsaXN0IHNpemUgbm90IGFjY291bnRpbmcgZm9yIHBhZGRpbmcgaW4gY29udGFpbmVkIGNodW5rcy4KKworMjAxMC0xMi0wMiAxNjoxMTowMSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgcnRwc3NyY2RlbXV4OiBkbyBub3QgaG9sZCBjdXN0b20gUEFEX0xPQ0sgd2hlbiBwdXNoaW5nIGRvd25zdHJlYW0KKworMjAxMC0xMi0wMiAxNjoxMDoxNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHJlc2V0IHNlc3Npb24gbWFuYWdlciBiYXNlIHRpbWUgd2hlbiBmbHVzaGluZworCSAgLi4uIGFzIHJ0cGJpbiB1c2VzIHJ1bm5pbmcgdGltZSB0byBoYW5kbGUgcnRwaml0dGVyYnVmZmVyJ3MgYnVmZmVyIG1vZGUgcGF1c2VzLgorCisyMDEwLTEyLTAxIDE2OjUxOjMzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogaW5jbHVkZSByYW5nZSByZXF1ZXN0IGZvciBhbGwgc3RyZWFtcyB3aXRoIG5vbi1hZ2dyZWdhdGUgY29udHJvbAorCisyMDEwLTEwLTA3IDE0OjUwOjUzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IGRlYnVnIHN0YXRlbWVudAorCisyMDEwLTEyLTAzIDE1OjM4OjAwICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogUGFyc2UgbW9yZSB2YXJpYW50cyBvZiBudW1lcmljYWwgSURJVCB0YWcKKworMjAxMC0wNS0wNyAxNzozMDozMCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkgIHBuZ2VuYzogVXNlIHByb3BlciBmcmFtZXJhdGUgcmFuZ2UgaW4gY2FwcworCisyMDEwLTEyLTAzIDE1OjA0OjI2ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvd2F2ZW5jLmM6CisJICB0ZXN0czogRml4IHByZXZpb3VzbHkgdW5idWlsZGFibGUvdW50ZXN0ZWQgd2F2ZW5jIHRlc3QKKworMjAxMC0xMC0yNCAxNToyMTowOCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IFJlZmFjdG9yIHRhZyBwdXNoaW5nIGxvZ2ljCisJICBUaGUgbG9naWMgb2Ygd2hlbiB0byBwdXNoIHdhcyB3cm9uZyBhbHNvIChyZXN1bHRpbmcgaW4gc29tZSB0YWdzIG5ldmVyCisJICBiZWluZyBwdXNoZWQpLgorCisyMDEwLTEwLTI0IDE1OjIwOjI3ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvZmx2L01ha2VmaWxlLmFtOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IFVzZSBwYnV0aWxzIGZvciBjb2RlYyBkZXNjcmlwdGlvbnMKKworMjAxMC0wNC0xMyAxMToyOTozMCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdWRwc2luay5jOgorCSAgY2hlY2s6IFVzZSBmYWlsX3VubGVzc19lcXVhbHNfaW50IGluc3RlYWQgb2YgZmFpbF9pZgorCSAgTWFrZXMgdGhlIGVycm9yIG1lc3NhZ2UgbW9yZSBpbnRlcmVzdGluZworCisyMDEwLTExLTMwIDE5OjIyOjExICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogQWxzbyBleHRyYWN0IElESVQgdGFncyBwcmVzZW50IHRvbyBlYXJseQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzNjE0MworCisyMDEwLTExLTMwIDE5OjIxOjIzICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogQWxzbyBlbWl0IERhdGVUaW1lIHRhZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzNjE0MworCisyMDEwLTEyLTAzIDAwOjIyOjQ4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogZGV0ZWN0IERUUyBhZHZlcnRpc2VkIGFzIFBDTSBjb3JyZWN0bHkgaW4gc29tZSBtb3JlIGNhc2VzCisJICBUaGUgRFRTIHR5cGVmaW5kZXIgbWF5IHJldHVybiBhIGxvd2VyIHByb2JhYmlsaXR5IGZvciBmcmFtZXMgdGhhdCBzdGFydAorCSAgYXQgbm9uLXplcm8gb2Zmc2V0cyBhbmQgd2hlcmUgdGhlcmUncyBubyBzZWNvbmQgZnJhbWUgc3luYyBpbiB0aGUgZmlyc3QKKwkgIGJ1ZmZlci4gSXQncyBmYWlybHkgdW5saWtlbHkgdGhhdCB3ZSdsbCBhY2lkZW50YWxseSBpZGVudGlmeSBQQ00gZGF0YQorCSAgYXMgRFRTLCBzbyB3ZSBkb24ndCBkbyBhZGRpdGlvbmFsIGNoZWNrcyBmb3Igbm93LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzNjIzNAorCisyMDEwLTExLTA4IDE3OjExOjQyICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgdGVzdHM6IG1ha2VmaWxlIGNsZWFudXAKKwkgIEZpeCBpbmRlbnRhdGlvbi4gVXNlICQoR1NUX01BSk9STUlOT1IpIGluc3RlYWQgb2YgaGFyZGNvZGVkIDAuMTAuCisKKzIwMTAtMTEtMDggMTc6MDI6NTYgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvLmdpdGlnbm9yZToKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZlbmMuYzoKKwkgIHRlc3RzOiBhZGQgYSB0ZXN0IGZvciB3YXYgbXV4aW5nCisKKzIwMTAtMTEtMDggMTY6NTc6MTcgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW50ZXJsZWF2ZS5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3dhdnBhY2suYzoKKwkgIHRlc3RzOiByZW1vdmUgbmV3bGluZXMgYmV0d2VlbiB2YXJpYWJsZSBkZWNscyAob2xkIGdzdC1pbmRlbnQgZmFpbHVyZSkKKworMjAxMC0xMS0wOCAxNDo0NzowNCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgcG5nZGVjOiB1c2UgcG5nX2Vycm9yKCkgYXMgcmVjb21tZW5kZWQgYnkgbGlicG5nIGRvY3MgdG8gc2lnbmFsIGFuIGVycm9yCisJICBXaXRob3V0IHRoYXQgdGhlIGVsZW1lbnQgbG9vcHMgZW5kbGVzc2x5IG9uIGJyb2VrbiBwbmdzLiBGaXhlcyAjNjM0MzE0CisKKzIwMTAtMTEtMTYgMTc6NDg6MTYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBQYXJzZSBhbmQgdXNlIGNyZWF0aW9uIHRpbWUgdGFnIGZyb20gbXZoZAorCSAgRXhwb3NlIGNyZWF0aW9uIHRpbWUgZnJvbSBtdmhkIGFzIGEgZGF0ZXRpbWUgdGFnCisJICBGaXhlcyAjNjM0OTI4CisKKzIwMTAtMTAtMjcgMTk6MTU6MjAgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8YW1vcmFsZXNAZmx1bW90aW9uLmNvbT4KKworCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJICBpY3lkZW11eDogQWRkICdTdHJlYW1VcmwnIG1ldGFkYXRhIGFzIEdTVF9UQUdfSE9NRVBBR0UgdGFnCisKKzIwMTAtMTAtMjMgMTk6MzQ6MDAgLTA0MDAgIFRvbSBKYW5pc3pld3NraSA8VG9tLkphbmlzemV3c2tpQGFsY2F0ZWwtbHVjZW50LmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogRml4IGZvciBuZWxseW1vc2VyIGNvZGVjaWQgc2V0dGluZworCSAgRml4ZXMgYnVnICM2MzI4OTcuCisKKzIwMTAtMTAtMjEgMTY6MTU6MDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogQWRkIHN1cHBvcnQgZm9yIEUtQUMzCisKKzIwMTAtMTAtMjEgMTY6MTQ6NDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogQWRkIHN1cHBvcnQgZm9yIERUUworCisyMDEwLTEwLTMxIDE4OjA4OjE3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBEb24ndCBzZW5kIHNlZWtzIGJlaGluZCB0aGUgZW5kIG9mIGZpbGUgdG8gdGhlIHNlcnZlcgorCSAgQWxzbyBpbXByb3ZlIGRlYnVnIG91dHB1dCwgcmUtaW5pdGlhbGl6ZSB0aGUgY29udGVudCBzaXplIGFuZCBsZXQgdGhlCisJICBzZWVrIGhhbmRsZXIgZXJyb3Igb3V0IG9uIGludmFsaWQgc2VlayBzZWdtZW50cy4KKwkgIEZpeGVzIGJ1ZyAjNjMyOTc3LgorCisyMDEwLTEyLTAyIDE3OjUzOjQyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5jOgorCSAgajJrcGF5OiB1c2UgU09QIG1hcmtlcnMgdG8gc3BsaXQgYml0c3RyZWFtCisJICBXaGVuIHBhcnNpbmcgdGhlIGJpdHN0cmVhbSwgbG9vayBmb3IgU09QIG1hcmtlcnMgYmVjYXVzZSB3ZSBhcmUgYWxsb3dlZCB0byBzcGxpdAorCSAgcGFja2V0cyBvbiB0aG9zZSBtYXJrZXIgYm91bmRhcmllcy4KKwkgIFJld29yayB0aGUgcGFyc2luZyBjb2RlIGEgbGl0dGxlIHNvIHRoYXQgd2UgY2FuIHBhY2sgbXVsdGlwbGUgUGFja2V0aXphdGlvbgorCSAgdW5pdHMgaW4gb25lIFJUUCBwYWNrZXQuCisKKzIwMTAtMTEtMTggMTI6NDk6NDcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5oOgorCSAgcnRwajJrcGF5OiB1c2UgYnVmZmVyIGxpc3RzCisJICBVc2UgYnVmZmVyIGxpc3RzIGZvciBkb2luZyB6ZXJvY29weSBwYXlsb2FkaW5nLgorCSAgQWRkIHByb3BlcnR5IHRvIGRpc2FibGUgYnVmZmVyIGxpc3RzLgorCisyMDEwLTExLTE2IDE2OjU0OjI1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIGgyNjRwYXk6IHNtYWxsIGNsZWFudXBzCisJICBBbGxvY2F0ZSBhZGFwdGVyIG9ubHkgb25jZS4KKwkgIE1ha2Ugc29tZSBndWludDggKiBjb25zdC4KKworMjAxMC0xMS0xNiAxNTozOToyNCArMDEwMCAgVGFtYmV0IEluZ28gPHRhbWJldCBhdCBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJICBydHBoMjY0cGF5OiBpbXBsZW1lbnQgZnVsbCBieXRlc3RyZWFtIHNjYW4gbW9kZS4KKwkgIEltcGxlbWVudCB0aGUgZnVsbCBieXRlc3RyZWFtIHNjYW4gbW9kZS4KKwkgIEZpeGVzICM2MzQ5MTAKKworMjAxMC0xMS0xNSAxMDo1MjozMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC1BTVIuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjQuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXY0bDItSDI2NC1hbHNhc3JjLVBDTUEuc2g6CisJICBleGFtcGxlczogaW1wcm92ZSBSVFAgZXhhbXBsZXMKKwkgIE1ha2UgdGhlIGV4YW1wbGVzIHVzZSBhdXRvdmlkZW9zaW5rIGFuZCBmZm1wZWdjb2xvcnNwYWNlIGZvciBiZXR0ZXIKKwkgIGNvbXDDoHRpYmlsaXR5LgorCSAgTWFrZSBzb21lIG1vcmUgdmFyaWFibGVzIGZvciB0aGUgc2luayBhbmQgdGhlIGRlY29kZXJzLgorCSAgU2V0IHplcm9sYXRlbmN5IHR1bmluZyBvbiB4MjY0ZW5jIGZvciBiZXR0ZXIgcmVhbHRpbWUgcmVzdWx0cy4KKworMjAxMC0xMS0xMCAxMTowNDo0OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogc2VsZWN0IG11bHRpY2FzdCB0cmFuc3BvcnRzIGluIGEgc21hcnRlciB3YXkKKwkgIFdoZW4gd2Ugc2VlIGEgbXVsdGljYXN0IGFkZHJlc3MgaW4gdGhlIFNEUCBjb25uZWN0aW9uLCBvbmx5IHRyeSB0byBuZWdvdGlhdGUgYQorCSAgbXVsdGljYXN0IHRyYW5zcG9ydCB3aXRoIHRoZSBzZXJ2ZXIuCisJICBGaXhlcyAjNjM0MDkzCisKKzIwMTAtMTItMDIgMTg6MTQ6MTYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBCdW1wIEdMaWIgcmVxdWlyZW1lbnQgdG8gaW1wbGljaXQgcmVxdWlyZW1lbnQKKwkgIGllLiA+PSAyLjIwIHdoaWxlIHdlIGRlcGVuZCBvbiBjb3JlL2Jhc2UgMC4xMC4zMQorCisyMDEwLTEyLTAyIDE4OjEzOjU3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQKKworPT09IHJlbGVhc2UgMC4xMC4yNiA9PT0KKworMjAxMC0xMi0wMSAyMToxNTowOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMC4xMC4yNgorCisyMDEwLTExLTMwIDE1OjI4OjUwIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogYW5hbHlzZSBSRkYgZmllbGRzIGluIGNvcnJlY3Qgb3JkZXIKKwkgIENvZGUgd2FzIHJlcGVhdGluZyB0aGUgc2Vjb25kIGZpZWxkLCBub3QgdGhlIGZpcnN0LgorCSAgRml4ZXM6ICM2MzYxNzkuCisKKzIwMTAtMTEtMjkgMTU6MzI6NDAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBoYW5kbGUgc3RhbGUgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIHNlc3Npb24gZGF0YQorCSAgSW4gcGFydGljdWxhciwgaGFuZGxlIFVuYXV0aG9yaXplZCBzZXJ2ZXIgcmVzcG9uc2Ugd2hlbiB0cnlpbmcgdG8gY29udmV5CisJICBrZWVwLWFsaXZlLgorCSAgRml4ZXMgIzYzNTUzMi4KKworMjAxMC0xMS0yNiAxNTowMDoyOSArMDEwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIHJ0cGgyNjRkZXBheTogZml4IHNlZ2ZhdWx0IG9uIGVtcHR5IHBheWxvYWQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MzU4NDMKKworMjAxMC0xMS0yNSAxOTowNjoyNyArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJICBkdG1mOiBSZW1vdmUgZGVhZCBhc3NpZ25tZW50cworCisyMDEwLTExLTE4IDAwOjQ1OjI5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgMC4xMC4yNS41IHByZS1yZWxlYXNlCisKKzIwMTAtMTEtMTggMDA6NDQ6NDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBwby9iZy5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vaHUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3RyLnBvOgorCSAgcG86IHVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAxMC0xMS0xNCAwMDoxODoxNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IGZpeCByZWZlcmVuY2UgbGVhaworCisyMDEwLTExLTEyIDIzOjU5OjA2ICsxMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IEZsdXNoIFFvUyBhbmQgaGlzdG9yeSBiZWZvcmUgYXBwbHlpbmcgc2VnbWVudAorCSAgV2hlbiBoYW5kbGluZyBuZXdzZWdtZW50LCBmbHVzaCBvdXQgdGhlIGJ1ZmZlciBoaXN0b3J5IGluIHRoZQorCSAgZXhpc3Rpbmcgc2VnbWVudCwgbm90IHRoZSBuZXcgb25lLiBGaXhlcyBwbGF5YmFjayBpbiBzb21lIERWRAorCSAgY2FzZXMuCisJICBQYXJ0aWFsbHkgZml4ZXMgIzYzMzI5NAorCisyMDEwLTExLTEyIDEyOjIwOjE2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogaW1wcm92ZSBldmVudCBsb2dnaW5nCisKKzIwMTAtMTEtMDUgMTc6MDA6MTUgKzAxMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuaDoKKwkgIGRlaW50ZXJsYWNlOiBJbXBsZW1lbnQgZmllbGQgaGlzdG9yeSBmbHVzaGluZworCSAgSW4gYSBudW1iZXIgb2YgY2FzZXMgaXQgaXMgbmVjZXNzYXJ5IHRvIGZsdXNoIHRoZSBmaWVsZCBoaXN0b3J5IGJ5CisJICBwZXJmb3JtaW5nICdkZWdyYWRlZCcgZGVpbnRlcmxhY2luZyAtIHRoYXQgaXMsIHVzaW5nIHRoZSB1c2VyLWNob3NlbgorCSAgbWV0aG9kIGZvciBhcyBtYW55IGZpZWxkcyBhcyBwb3NzaWJsZSwgdGhlbiB1c2luZyB2ZmlyIGZvciBhcyBsb25nIGFzCisJICB0aGVyZSBhcmUgPj0gMiBmaWVsZHMgcmVtYWluaW5nIGluIHRoZSBoaXN0b3J5LCB0aGVuIHVzaW5nIGxpbmVhciBmb3IKKwkgIHRoZSBsYXN0IGZpZWxkLgorCSAgVGhpcyBzaG91bGQgYXZvaWQgbG9zaW5nIGZpZWxkcyBiZWluZyBrZXB0IGZvciBoaXN0b3J5IGZvciBleGFtcGxlIGF0CisJICBFT1MuCisJICBUaGlzIG1heSBhZGRyZXNzIHBhcnQgb2YgIzYzMzI5NAorCisyMDEwLTExLTA1IDE1OjQ0OjM1ICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IFJlZmFjdG9yIGNoYWluIGZ1bmN0aW9uCisJICBUaGlzIGlzIG5lZWRlZCB0byBiZSBhYmxlIHRvIG91dHB1dCBhIGZyYW1lIGZyb20gb3V0c2lkZSB0aGUgY2hhaW4KKwkgIGZ1bmN0aW9uLCBpLmUuIGluIHRoZSBmb2xsb3dpbmcgY29tbWl0IHRoYXQgYWRkcyBmbHVzaGluZyBvZiB0aGUgZmllbGQKKwkgIGhpc3RvcnkuCisKKzIwMTAtMTEtMDUgMTc6MTc6NTYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IHdlIHN0aWxsIHJlcXVpcmUgR3RrKyA+PSAyLjE0LjAgd2hlbiBjb21waWxpbmcgYWdhaW5zdCAyLjAKKwkgIFRoZSBjaGVjayBmb3IgdGhlIG1pbm9yIHZlcnNpb24gd2FzIGRyb3BwZWQgaW4gdGhlIHByZXZpb3VzIGNvbW1pdC4KKworMjAxMC0xMS0wNSAxNjoyNDo0MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogYWRkIC0td2l0aC1ndGsgb3B0aW9uIGFuZCBkZWZhdWx0IHRvIEd0aysgMi4wIHdoaWxlIHRoZSAzLjAgQVBJIGlzIHN0aWxsIGluIGZsdXgKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MzQwMTQKKworMjAxMC0xMS0wNCAxNjo0MjowNyArMTAwMCAgSm9uYXRoYW4gTWF0dGhldyA8am9uYXRoYW5AZDE0bi5vcmc+CisKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSAgaWN5ZGVtdXg6IGZpeCB1c2UtYWZ0ZXItZnJlZSBvZiB0YWdsaXN0CisJICBCcm9rZW4gYnkgY29tbWl0IDRjMmY1MzMzIChidWcgIzYzMDIwNSkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjMzOTcwCisKKzIwMTAtMTEtMDEgMTc6Mjk6MDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjI1LjQgcHJlLXJlbGVhc2UKKworMjAxMC0xMS0wMSAxNzoyODozNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZXMucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zdi5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTAtMTEtMDEgMTY6MDQ6MjAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IGZpeCAtLWRpc2FibGUtZXh0ZXJuYWwKKworMjAxMC0xMS0wMSAxNDo1NjoyOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5Lmg6CisJICBydHBoMjY0ZGVwYXk6IG9ubHkgc2V0IGRlbHRhIHVuaXQgb24gYWxsLW5vbi1rZXkgdW5pdHMKKwkgIE9ubHkgc2V0IHRoZSBkZWx0YSBmbGFnIHdoZW4gYWxsIG9mIHRoZSB1bml0cyBpbiB0aGUgcGFja2V0IGFyZSBkZWx0YSB1bml0cy4KKwkgIEJhc2VkIG9uIHBhdGNoIGZyb20gT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCSAgRml4ZXMgIzYzMjk0NQorCisyMDEwLTEwLTI2IDE1OjQ0OjM3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSAgZ29vbTogUmV0dXJuIG5vdC1uZWdvdGlhdGVkIHdoZW4gYnBzIGlzIHVua25vd24KKwkgIElmIGNhcHMgd2VyZW4ndCBuZWdvdGlhdGVkLCBnb29tIHNob3VsZCByZXR1cm4gbm90LW5lZ290aWF0ZWQKKwkgIGZyb20gaXRzIGNoYWluIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIHVzaW5nIGJwcyB1bml0aWFsaXplZCwgd2hpY2gKKwkgIGxlYWRzIHRvIGEgZGl2aXNpb24gYnkgMAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzMzIxMgorCisyMDEwLTEwLTI3IDEzOjE2OjU0ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA3YmJkNzA4IHRvIDAxMWJjYzgKKworMjAxMC0xMC0yNiAxNjo1NDoxMSArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICB2aWRlb2ZsaXA6IEZvcndhcmQgc3JjIHBhZCBldmVudHMgdXBzdHJlYW0uCisJICBGaXggcGFzc2luZyBuYXZpZ2F0aW9uIGFuZCBvdGhlciBldmVudHMgdXBzdHJlYW0gYnkgYWN0dWFsbHkgc2VuZGluZyB0aGVtLgorCSAgRml4ZXM6ICM2MzMyMDUKKworMjAxMC0xMC0yNCAxODo1MDozMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBkZWFkbG9jayBpbiBlcnJvciBjb2RlIHBhdGgKKwkgIEdTVF9FTEVNRU5UX0VSUk9SIG11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIHRoZSBvYmplY3QgbG9jayBoZWxkLAorCSAgc2luY2UgaXQgd2lsbCBjYWxsIGdzdF9vYmplY3RfZ2V0X3BhcmVudCgpIGludGVybmFsbHksIHdoaWNoCisJICB0YWtlcyB0aGUgb2JqZWN0IGxvY2sgYXMgd2VsbC4KKworMjAxMC0xMC0yMCAxMDoyMTo0OCArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBSZW1vdmUgdXNlbGVzcyBjbGVhcmluZyBvZiBzZW5kX3hpcGhfaGVhZGVycyBmb3IgRGlyYWMKKwkgIFRoaXMgbG9va3MgbGlrZSBhIG1pc3Rha2Ugd2hlbiBjb3B5LXBhc3RpbmcgdGhlIFRoZW9yYSBjb2RlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzMjY4MgorCisyMDEwLTEwLTIwIDEzOjI4OjI4ICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcGpAb3BlcmEuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGRvbid0IGNyYXNoIGlmIHZvcmJpcy90aGVvcmEgY29kZWMgZGF0YSBpcyBtaXNzaW5nCisJICBFcnJvciBvdXQgcHJvcGVybHkgaW4gdGhpcyBjYXNlIGluc3RlYWQgb2YgY3Jhc2hpbmcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjMyNjgyCisKKzIwMTAtMTAtMjIgMTg6MTE6NDYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjI1LjMgcHJlLXJlbGVhc2UKKworMjAxMC0xMC0xOSAxNjo0NTo1MSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGZpeCBkdXJhdGlvbiByZXBvcnRpbmcKKwkgIEluaXQgc2VnbWVudCBwcmlvciB0byBzdG9yaW5nIGR1cmF0aW9uIGluZm8gaW4gaXQuCisJICBGaXhlcyAjNjMyNTQ4LgorCisyMDEwLTEwLTE5IDE0OjIxOjUzICswMTAwICBCYXN0aWVuIE5vY2VyYSA8aGFkZXNzQGhhZGVzcy5uZXQ+CisKKwkqIGdjb25mL01ha2VmaWxlLmFtOgorCSAgZ2NvbmY6IERvbid0IGluc3RhbGwgc2NoZW1hcyB3aGVuIEdDb25mIGlzIGRpc2FibGVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjMyNTUzCisKKzIwMTAtMTAtMTkgMTM6NDM6MTQgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICB2YXJpb3VzIChnc3QpOiBhZGQgbWlzc2luZyBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIGZsYWdzCisJICBDYW5vbmljYWxpemUgcHJvcGVydHkgbmFtZXMgYXMgbmVlZGVkLgorCisyMDEwLTEwLTE5IDEzOjQ0OjI1ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIGR0bWZzcmM6IHJlbW92ZSBERUJVR19GVU5DUFRSIGZyb20gZ29iamVjdCB2bWV0aG9kcworCisyMDEwLTEwLTE2IDE1OjQzOjUzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgd2luMzI6IHNldCBHU1RfUEFDS0FHRV9SRUxFQVNFX0RBVEVUSU1FIGFsc28gaW4gd2luMzIgY29uZmlnLmgKKworMjAxMC0xMC0xNiAwMTozMzo1MiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIDAuMTAuMjUuMiBwcmUtcmVsZWFzZQorCisyMDEwLTEwLTE2IDAxOjI2OjAxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vZWwucG86CisJKiBwby92aS5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTAtMTAtMTUgMTM6MjI6MDMgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiBEb24ndCBkaXN0IGdlbmVyYXRlZCBvcmMgZmlsZXMKKworMjAxMC0xMC0xNSAxNDowMjoxOSAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUtZGlzdC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0Lmg6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMtZGlzdC5jOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLWRpc3QuaDoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kb3JjLWRpc3QuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kb3JjLWRpc3QuaDoKKwkgIFVwZGF0ZSBnZW5lcmF0ZWQgb3JjIGNvZGUKKworMjAxMC0xMC0xNSAxODowMDoxMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogYnVtcCBPcmMgcmVxdWlyZW1lbnQgdG8gMC40LjExCisKKzIwMTAtMTAtMTQgMTc6NDE6MzAgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IFVzZSB0aGUgcmlnaHQgY29uc3RhbnQgdG8gZGVmaW5lIHRoZSAidXNlLXBpcGVsaW5lLWNsb2NrIiBwcm9wZXJ0eQorCSAgVGhlIHdyb25nICNkZWZpbmUgd2FzIGJlaW5nIHVzZWQsIG5vdyB1c2UgdGhlIGNvcnJlY3Qgb25lLgorCisyMDEwLTEwLTE0IDEyOjMxOjQ4IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDVhNjY4YmYgdG8gN2JiZDcwOAorCisyMDEwLTEwLTE0IDE3OjI2OjE0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBhYzM6IGRlbXV4ZXJzIHByb3ZpZGUgZnJhbWVkIG91dHB1dAorCisyMDEwLTEwLTE0IDAwOjExOjI3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmg6CisJICBtYXRyb3NrYW11eDogcmVkdWNlIG5ld3NlZ21lbnQgZXZlbnQgc3BhbSBhbmQgc2V0IGRpc2NvbnQgZmxhZyB3aGVyZSBuZWVkZWQKKwkgIE9ubHkgc2VuZCBuZXdzZWdtZW50IGV2ZW50cyB3aXRoIG5ldyBwb3NpdGlvbnMgZG93bnN0cmVhbSB3aGVuIGFjdHVhbGx5CisJICBuZWVkZWQsIGluc3RlYWQgb2Ygc2VuZGluZyBtdWx0aXBsZSBuZXdzZWdtZW50IGV2ZW50cyB3aXRoIG5ldyBzZWVrCisJICBwb3NpdGlvbnMgaW4gYSByb3cuIEFsc28gc2V0IHRoZSBkaXNjb250IGZsYWcgb24gYnVmZmVycyBhZnRlciBhCisJICBkaXNjb250aW51aXR5LgorCisyMDEwLTEwLTEzIDIzOjQ2OjAyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmg6CisJICBtYXRyb3NrYW11eDogc2V0IGNvcnJlY3QgYnVmZmVyIG9mZnNldHMgYWZ0ZXIgc2Vla3MKKwkgIFJlLXVzZSB0aGUgZXhpc3RpbmcgJ3BvcycgZmllbGQgbWFpbnRhaW5lZCBieSBlYm1sIHdyaXRlciB0byBzZXQKKwkgIGJ1ZmZlciBvZmZzZXRzLiBUaGlzIGFsc28gbWFrZXMgc3VyZSB0aGF0IHdlIHNldCB0aGUgcmlnaHQgb2Zmc2V0cworCSAgb24gYnVmZmVycyBhZnRlciBhIHNlZWsgKGUuZy4gd2hlbiB3cml0aW5nIGFuIGluZGV4IGF0IHRoZSBlbmQpLgorCisyMDEwLTEwLTE0IDAwOjIyOjAzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGRvbid0IGZvcndhcmQgdGFnIGV2ZW50cyBkb3duc3RyZWFtCisJICBEb24ndCBmb3J3YXJkIHN0cmVhbS1zcGVjaWZpYyB0YWcgZXZlbnRzIGRvd25zdHJlYW0gKGVzcC4gbm90CisJICBiZWZvcmUgYW55IG5ld3NlZ21lbnQgZXZlbnQpLngKKworMjAxMC0xMC0xMyAxNzoxNToyNSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZm91cmNjLmg6CisJICBxdGRlbXV4OiBoYW5kbGUgYW5vdGhlciBtcDR2IHZhcmlhdGlvbgorCSAgLi4uIGluY2x1ZGluZyB0aGUgZ2xibCBhdG9tIGNvbnRhaW5pbmcgY29kZWMtZGF0YS4KKworMjAxMC0xMC0xMyAxNzoyMToyMyArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOgorCSogZ3N0L2RlYnVndXRpbHMvYnJlYWtteWRhdGEuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2VmZW5jZS5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2c2Vlay5jOgorCSogZ3N0L2RlYnVndXRpbHMvbmVnb3RpYXRpb24uYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Byb2dyZXNzcmVwb3J0LmM6CisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzoKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21lZGlhbi9nc3RtZWRpYW4uYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYzoKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJndm9sdW1lLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW90ZW1wbGF0ZS5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJICB2YXJpb3VzIChnc3QpOiBhZGQgYSBtaXNzaW5nIEdfUEFSQU1fU1RBVElDX1NUUklOR1MgZmxhZ3MKKworMjAxMC0xMC0xMyAxNzoxMzowNCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBzeXMvb3NzL2dzdG9zc21peGVyZWxlbWVudC5jOgorCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6CisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jOgorCSogc3lzL29zczQvb3NzNC1taXhlci5jOgorCSogc3lzL29zczQvb3NzNC1zaW5rLmM6CisJKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc3JjLmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSAgdmFyaW91cyAoc3lzKTogYWRkIGEgbWlzc2luZyBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIGZsYWdzCisKKzIwMTAtMTAtMTMgMTY6MjU6MTUgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbHRhZy5jOgorCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJKiBleHQvZHYvZ3N0ZHZkZWMuYzoKKwkqIGV4dC9lc2QvZXNkbW9uLmM6CisJKiBleHQvZXNkL2VzZHNpbmsuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5jOgorCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuYzoKKwkqIGV4dC9oYWwvZ3N0aGFsYXVkaW9zaW5rLmM6CisJKiBleHQvaGFsL2dzdGhhbGF1ZGlvc3JjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvanBlZy9nc3RzbW9rZWVuYy5jOgorCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJKiBleHQvbWlrbW9kL2dzdG1pa21vZC5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6CisJICB2YXJpb3VzIChleHQpOiBhZGQgYSBtaXNzaW5nIEdfUEFSQU1fU1RBVElDX1NUUklOR1MgZmxhZ3MKKworMjAxMC0xMC0xMyAxNjozNDowOSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6CisJKiBleHQvZXNkL2VzZG1vbi5jOgorCSogZ3N0L21lZGlhbi9nc3RtZWRpYW4uYzoKKwkgIHZhcmlvdXM6IHdyYXAgcHJvcGVydHkgcmVnaXN0cmF0aW9uIGFuZCBhZGQgYSBzaW5nbGUgZml4bWUgZm9yIGxvbmcgZGVzYy4KKworMjAxMC0xMC0xMyAxMTo0Njo1OCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIGgyNjRkZXBheTogYWx3YXlzIG1hcmsgdGhlIGNvZGVjX2RhdGEgYXMga2V5ZnJhbWUKKwkgIFdlIG5lZWQgdG8gbWFyayB0aGUgY29kZWNfZGF0YSBhcyBhIGtleWZyYW1lIG9yIGVsc2UgZG93bnN0cmVhbSBkZWNvZGVycyBtaWdodAorCSAgZGVjaWRlIHRvIHNraXAgaXQsIHdhaXRpbmcgZm9yIGEga2V5ZnJhbWUuCisJICBGaXhlcyAjNjMxOTk2CisKKzIwMTAtMTAtMTMgMDc6MTY6NDcgKzAxMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJICBtYXRyb3NrYW11eDogbWFrZSBidWZmZXIgb2Zmc2V0cyBhIGJ5dGUgY291bnQgcmF0aGVyIHRoYW4gYSBidWZmZXIgY291bnQKKworMjAxMC0xMC0wNyAyMToxMjo0OCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzoKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSogZXh0L2VzZC9lc2Rtb24uYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGV4dC9taWttb2QvZ3N0bWlrbW9kLmM6CisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2VmZW5jZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBleHQsIGdzdDogY2Fub25pY2FsaXNlIHByb3BlcnR5IG5hbWVzIHdoZXJlIHRoaXMgd2Fzbid0IHRoZSBjYXNlCisJICBpZS4gImZvb19iYXIiIC0+ICJmb28tYmFyIgorCisyMDEwLTEwLTEyIDE1OjAyOjQyICswMjAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5jOgorCSAgcnRwbXB2cGF5OiBmaXggdGltZXN0YW1waW5nIG9mIHJ0cCBidWZmZXJzCisJICBJbmNvbW1pbmcgYnVmZmVyIGlzIG9ubHkgcHVzaGVkIG9uIHRoZSBhZGFwdGVyIGF0IHRoZSBlbmQgb2YgdGhlCisJICBoYW5kbGVfYnVmZmVyIGZ1bmN0aW9uLiBCdXQgZHVyYXRpb24vdGltZXN0YW1wIG9mIHRoaXMgYnVmZmVyIGlzIGFscmVhZHkKKwkgIHRha2VuIGludG8gYWNjb3VudCBmb3IgdGhlIGN1cnJlbnQgZGF0YSBpbiB0aGUgYWRhcHRlci4gVGhpcyBsZWFkcyB0bworCSAgd3JvbmcgcnRwIHRpbWVzdGFtcHMgYW5kIGV4dHJhIGxhdGVuY3kuCisKKzIwMTAtMTAtMTIgMTE6Mzc6NDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1hdWRpb3Rlc3QuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tb3Nzc3JjLmM6CisJICBleGFtcGxlczogRml4IGJ1aWxkIHdpdGggR1RLKyAzLjAKKworMjAxMC0xMC0xMSAxNToxMjowMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogbWFyayBhcyBhIHNvdXJjZQorCSAgTWFyayB0aGUgcnRzcHNyYyBlbGVtZW50IGFzIGEgc291cmNlLgorCSAgUmVxdWlyZXMgMC4xMC4zMS4xIG5vdworCisyMDEwLTEwLTExIDE0OjI0OjEzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkgIGF1dG9kZXRlY3Q6IFNldCBHU1RfRUxFTUVOVF9JU19TT1VSQ0UgZmxhZyBvbiBzb3VyY2VzCisKKzIwMTAtMTAtMTEgMTQ6MjE6MDcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZ2NvbmYvZ3N0c3dpdGNoc3JjLmM6CisJICBzd2l0Y2hzcmM6IFNldCB0aGUgR1NUX0VMRU1FTlRfSVNfU09VUkNFIGZsYWcKKworMjAxMC0xMC0xMSAxNDoxNzozMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogUmVxdWlyZSBjb3JlIDAuMTAuMzAuMQorCisyMDEwLTEwLTEwIDE0OjQzOjU4ICswMTAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOgorCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuaDoKKwkgIG1hdHJvc2thbXV4OiBzZXQgb2Zmc2V0cyBvbiBvdXRnb2luZyBidWZmZXJzCisKKzIwMTAtMTAtMDkgMTQ6MTQ6MjcgKzAyMDAgIElPaGFubmVzIG0gem3DtmxuaWcgPHptb2VsbmlnQGllbS5hdD4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDJzaW5rOiBPbmx5IGdldC9zZXQgb3ZlcmxheSBwYXJhbXMgaWYgbmVlZGVkCisJICBpdCdzIHBlcmZlY3RseSBvayBmb3IgYSB2aWRlbyBvdXRwdXQgZGV2aWNlIHRvIG5vdCBoYXZlIG92ZXJsYXkgY2FwYWJpbGl0aWVzLgorCSAgdGhpcyBwYXRjaCByZW1vdmVzIHRoZSBuZWVkIHRvIGdldC9zZXQgdGhlIG92ZXJsYXkgcGFyYW1ldGVycyBpZiB0aGUgdXNlcgorCSAgZG9lcyBub3QgZXhwbGljaXRlbHkgcmVxdWVzdCBvbmUgb2YgdGhlIG92ZXJsYXkgcHJvcGVydGllcworCisyMDEwLTA5LTMwIDE1OjI4OjIzICswMjAwICBJT2hhbm5lcyBtIHptw7ZsbmlnIDx6bW9lbG5pZ0BpZW0uYXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJICB2NGwyc2luazogUHJvdGVjdCBhZ2FpbnN0IE5VTEwtcG9pbnRlciBhY2Nlc3MKKwkgIGdzdF92NGwyc2lua19jaGFuZ2Vfc3RhdGUoKSB3b3VsZCBmcmVlIHRoZSBwb29sIHdpdGhvdXQgY2hlY2tpbmcgd2hldGhlciB0aGVyZQorCSAgd2FzIGEgdmFsaWQgcG9vbC4uLgorCisyMDEwLTEwLTA4IDEyOjQzOjUxIC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGM0YThhZGMgdG8gNWE2NjhiZgorCisyMDEwLTEwLTA4IDEyOjUzOjMzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDVlM2M5YmYgdG8gYzRhOGFkYworCisyMDEwLTEwLTA2IDExOjI5OjU1ICswMjAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IEZpeCByZXF1aXJlZCBmaWVsZHMgbG9naWMKKwkgIEJvdGggaGlzdG9yeV9jb3VudCBhbmQgZmllbGRzX3JlcXVpcmVkIGNvdW50IGZyb20gMS4gQXMgcGVyIHRoZSB3aGlsZSBsb29wCisJICBjb25kaXRpb24gdGhhdCBmb2xsb3dzIHRoaXMgY29kZSwgdG8gcGVyZm9ybSB0aGUgZGVpbnRlcmxhY2luZyBtZXRob2QsIHdlIG5lZWQKKwkgIGhpc3RvcnlfY291bnQgPj0gZmllbGRzX3JlcXVpcmVkIGZpZWxkcyBpbiB0aGUgaGlzdG9yeS4gVGhlcmVmb3JlIGlmIHdlIGhhdmUKKwkgIGhpc3RvcnlfY291bnQgPCBmaWVsZHNfcmVxdWlyZWQgKG5vdCBmaWVsZHNfcmVxdWlyZWQgKyAxKSwgd2UgbmVlZCBtb3JlIGZpZWxkcy4KKworMjAxMC0wOS0yMCAxOTo0Mzo0NSArMDIwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDxhbW9yYWxlc0BmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguaDoKKwkgIGZsdm11eDogcmVzZW5kIG9uTWV0YWRhIHRhZyB3aGVuIHRhZ3MgY2hhbmdlcyBpbiBzdHJlYW1hYmxlIG1vZGUKKworMjAxMC0xMC0wNSAxOTo0MDo1MCArMDEwMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEFBQyBjb2RlY19kYXRhIGNhbiBiZSA+IDIgYnl0ZXMgbG9uZworCSAgVGhpcyBmaXhlcyB0aGUgYXNzdW1wdGlvbiB0aGF0IERlY29kZXJTcGVjaWZpY0luZm8gbXVzdCBiZSAyIGJ5dGVzIGxvbmcKKwkgIGZvciBBQUMgZmlsZXMuIFRoZSBzcGVjaWZpY2F0aW9uIGFsbG93cyBIRS1BQUMgdG8gYmUgZXhwbGljaXRseQorCSAgc2lnbmFsbGVkIGluIGEgYmFja3dhcmQgY29tcGF0aWJsZSB3YXkuIFRoaXMgaXMgZG9uZSBieSBtZWFucyBvZiBhbgorCSAgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhZnRlciB0aGUgcmVndWxhciBBQUMgaGVhZGVyLiBJdCBpcyBleHBlY3RlZCB0aGF0CisJICBkZWNvZGVycyB0aGF0IGNhbiBwbGF5IEFBQyBidXQgbm90IEhFLUFBQyB3aWxsIHBhcnNlIHRoZSBoZWFkZXIgbm9ybWFsbHkKKwkgIGFuZCBpZ25vcmUgZXh0ZW5kZWQgYml0cywgbXVjaCBhcyB0aGV5IGRvIGZvciB0aGUgSEUtQUFDIHNwZWNpZmljIHBheWxvYWQKKwkgIGluIHRoZSBhY3R1YWwgc3RyZWFtLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxMjMxMworCisyMDEwLTEwLTA1IDE2OjAxOjE5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBvbmx5IHVucmVmIGJ1ZmZlciB3aGVuIG5vIGxvbmdlciBuZWVkZWQgZm9yIGNsdXN0ZXIgc2Nhbm5pbmcKKwkgIEZpeGVzICM2MjkwNDcuCisKKzIwMTAtMTAtMDUgMTY6MDA6NDUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGF2b2lkIGluZmluaXRlIGNsdXN0ZXIgc2Nhbm5pbmcKKworMjAxMC0xMC0wNSAxMjoyMDo1MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSAgZ29vbTogdGFrZSBkdXJhdGlvbiBpbnRvIGFjY291bnQgd2hlbiBkb2luZyBRb1MKKwkgIFRha2UgdGhlIGR1cmF0aW9uIG9mIHRoZSBmcmFtZXMgaW50byBhY2NvdW50IHNvIHRoYXQgd2UgZG9uJ3QgZHJvcCBmcmFtZXMgdGhhdAorCSAgYXJlIG9ubHkgcGFydGlhbGx5IHBhc3QgdGhlIFFvUyBkZWFkbGluZS4KKworMjAxMC0xMC0wNSAxMDo0MDoxNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5oOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5oOgorCSAgZ29vbTogdXNlIGFkYXB0ZXIgZm9yIHRpbWVzdGFtcGluZworCSAgVXNlIHRoZSBhZGFwdGVyIHRpbWVzdGFtcCBjb2RlIHRvIGdldCBtb3JlIGFjY3VyYXRlIHRpbWVzdGFtcHMuCisJICBGaXggbGF0ZW5jeSBjYWxjdWxhdGlvbiwgd2UgYWRkIG91ciBvd24gbGF0ZW5jeSBpbiB0aGUgd29yc3QgY2FzZS4KKworMjAxMC0xMC0wNCAyMjozMTozMiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L3JhdzEzOTQvTWFrZWZpbGUuYW06CisJKiBleHQvcmF3MTM5NC9nc3QxMzk0LmM6CisJICByYXcxMzk0OiBEb24ndCBjb21waWxlIGhkdjEzOTRzcmMgaWYgbGliaWVjNjE4ODMgaXNuJ3QgYXZhaWxhYmxlCisJICBGaXhlcyAjNjI5ODk2CisKKzIwMTAtMDktMjAgMTk6NDQ6MDkgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8YW1vcmFsZXNAZmx1bW90aW9uLmNvbT4KKworCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJICBpY3lkZW11eDogZm9yd2FyZCB0YWcgZXZlbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjMwMjA1CisKKzIwMTAtMTAtMDQgMTk6MDA6NDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9nb29tMmsxL2dzdGdvb20uYzoKKwkgIGdvb20yazE6IHJlcG9ydCBvdXIgbGF0ZW5jeSBjb3JyZWN0bHkKKwkgIEZpeGVzICM2MzEzMDMKKworMjAxMC0xMC0wNCAxODo1NjoxNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSAgZ29vbTJrMTogYWRkIGRlZmluZXMgZm9yIGRlZmF1bHQgd2lkdGgvaGVpZ2h0L2ZwcworCSAgQWRkIHNvbWUgZGVmaW5lcyBmb3IgdGhlIGRlZmF1bHQgd2lkdGgvaGVpZ2h0L2ZwcyBpbnN0ZWFkIG9mIHVzaW5nIGRpZmZlcmVudAorCSAgdmFsdWVzIGluIGRpZmZlcmVudCBwbGFjZXMuCisKKzIwMTAtMTAtMDQgMTg6NTI6MTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkgIGdvb206IGFkZCBsYXRlbmN5IGNvbXBlbnNhdGlvbiBjb2RlLgorCSAgSW1wbGVtZW50IGEgbGF0ZW5jeSBxdWVyeSBhbmQgcmVwb3J0IGhvdyBtdWNoIGxhdGVuY3kgd2Ugd2lsbCBhZGQgdG8gdGhlCisJICBzdHJlYW0uCisJICBBbHNlIG1ha2Ugc29tZSBkZWZhdWx0cyBmb3IgdGhlIGRlZmF1bHQgd2lkdGgvaGVpZ2h0L2ZyYW1lcmF0ZQorCSAgRml4ZXMgIzYzMTMwMworCisyMDEwLTEwLTA0IDE3OjU2OjU3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWFsc2FzcmMtUENNQS5weToKKwkgIHRlc3Q6IGFkZCBweXRob24gdmVyc2lvbiBvZiB0aGUgYXVkaW8gc2VuZGVyCisJICBBZGQgYSBweXRob24gdmVyc2lvbiBvZiB0aGUgYXVkaW8gc2VuZGVyIHBpcGVsaW5lLgorCSAgUG9ydGVkIGJ5IFNwNHJjIG9uIElSQy4KKworMjAxMC0xMC0wNCAxNzo1MjoyMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLnB5OgorCSAgdGVzdHM6IEFkZCBweXRob24gUlRQIGNsaWVudCBleGFtcGxlCisJICBBZGQgYSBweXRob24gdmVyc2lvbiBvZiB0aGUgUENNQSBjbGllbnQgYXBwLgorCSAgUG9ydGVkIGJ5IFNwNHJjIG9uIElSQy4KKworMjAxMC0xMC0wNCAwOTozOTo1OSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSAgcnRwOiBGaXggdW5pdGlhbGl6ZWQgY29tcGlsZXIgd2FybmluZ3Mgb24gT1MgWCBidWlsZCBib3QKKwkgIFRoZXNlIHdhcm5pbmdzIGFyZSB3cm9uZyB0aG91Z2gsIHRoZSB2YXJpYWJsZXMgYXJlIG9ubHkgdXNlZCBpbgorCSAgdGhlIGNhc2VzIHdoZXJlIHRoZXkgKmFyZSogaW5pdGlhbGl6ZWQgYnkgdGhlIGJpdCByZWFkZXIuCisKKzIwMTAtMTAtMDMgMjM6NDk6MDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJwYXkuYzoKKwkgIHJ0cGc3MjJwYXk6IEZpeCB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGNvbXBpbGVyIHdhcm5pbmcKKwkgIFRoZSBjbG9jayByYXRlIGlzIGFsd2F5cyA4MDAwIEh6IGFjY29yZGluZyB0byB0aGUgUkZDIGFuZAorCSAgdGhlIHNhbXBsaW5nIHJhdGUgbXVzdCBhbHdheXMgYmUgMTYwMDAgSHouCisKKzIwMTAtMTAtMDEgMTM6NTk6MTAgKzA0MDAgIFZsYWRpbWlyIEVyZW1lZXYgPGVyZW1lZXZAYXRsYW50aXMucnU+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBpbXByb3ZlIGFydGljbGUgcmVmZXJlbmNlIGluIGNvbW1lbnQgYmxvY2sKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MzEwODIKKworMjAxMC0wNC0zMCAyMTowMDozMSArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9xdGRlbXV4L3F1aWNrdGltZS5jOgorCSAgcXRkZW11eDogVXNlIHBidXRpbHMgZm9yIEguMjY0IHByb2ZpbGUvbGV2ZWwgZXh0cmFjdGlvbgorCSAgVGhlIGZ1bmN0aW9ucyB1c2VkIHRvIGV4dHJhY3QgdGhpcyBkYXRhIGhhdmUgYmVlbiBtb3ZlZCB0byBnc3RwYnV0aWxzIHRvCisJICBmYWNpbGl0YXRlIHJldXNlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxNzMxOAorCisyMDEwLTA0LTMwIDIxOjAwOjMxICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EuYzoKKwkgIG1hdHJvc2thZGVtdXg6IFVzZSBwYnV0aWxzIGZvciBILjI2NCBwcm9maWxlL2xldmVsIGV4dHJhY3Rpb24KKwkgIFRoZSBmdW5jdGlvbnMgdXNlZCB0byBleHRyYWN0IHRoaXMgZGF0YSBoYXZlIGJlZW4gbW92ZWQgdG8gZ3N0cGJ1dGlscyB0bworCSAgZmFjaWxpdGF0ZSByZXVzZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MTczMTgKKworMjAxMC0wNC0yMiAxOTozOTo0NyArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEV4cG9ydCBNUEVHLTQgdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwgaW4gc3RyZWFtIGNhcHMKKwkgIFRoaXMgdXNlcyBnc3RwYnV0aWxzIHRvIGV4dHJhY3QgdGhlIHByb2ZpbGUgYW5kIGxldmVsIGZyb20gdGhlIHZpZGVvCisJICBvYmplY3Qgc2VxdWVuY2UgYW5kIGFkZHMgdGhpcyB0byBzdHJlYW0gY2Fwcy4gVGhpcyBjYW4gYmUgdXNlZCBhcworCSAgbWV0YWRhdGEgYW5kIGZvciBmaW5lLWdyYWluZWQgZGVjb2RlciBzZWxlY3Rpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjE2NTIxCisKKzIwMTAtMDktMzAgMTI6NDQ6NTIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggYWFjIGNoYW5uZWwgb3ZlcnJpZGUgYmFzZWQgb24gY29kZWMgZGF0YSBmb3IgNy4xIGNhc2UKKworMjAxMC0wNC0zMCAxNDowNjoyNyArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L01ha2VmaWxlLmFtOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRXhwb3J0IEFBQyBwcm9maWxlIGFuZCBsZXZlbCBpbiBjYXBzCisJICBUaGlzIGV4cG9ydHMgdGhlIEFBQyBwcm9maWxlIGFuZCBsZXZlbCBpbiBjYXBzIGZvciB1c2UgYXMgbWV0YWRhdGEgYW5kCisJICAoZXZlbnR1YWxseSkgZm9yIG1vcmUgZmluZS1ncmFpbmVkIHNlbGVjdGlvbiBvZiBkZWNvZGVycyBhdAorCSAgY2Fwcy1uZWdvdGlhdGlvbiB0aW1lLiAoRG9lc24ndCB3b3JrIGZvciBIRS1BQUMgeWV0IHRob3VnaC4pCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjEyMzEzCisKKzIwMTAtMDktMzAgMTg6MzQ6MDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5oOgorCSAgcnRwOiBhZGQgRzcyMiBwYXkgYW5kIGRlcGF5bG9hZGVyCisKKzIwMTAtMDktMzAgMTI6MDg6NDkgKzAyMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiB1cGRhdGUgbGluayB0byBkb2N1bWVudGF0aW9uCisKKzIwMTAtMDktMzAgMTE6MzQ6NTYgKzAyMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2NC5zaDoKKwkgIGV4YW1wbGVzOiBmaXggaW5kZW50YXRpb24gb24gcnRwIGNsaWVudCBleGFtcGxlCisKKzIwMTAtMDktMzAgMTE6MzM6MjQgKzAyMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2NC1QQ01BLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LnNoOgorCSAgZXhhbXBsZXM6IGZpeCB0eXBvIGluIHBvcnQgb2YgcnRwIGV4YW1wbGVzCisKKzIwMTAtMDktMjkgMTM6MjA6MjIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSAgd2F2ZW5jOiBtaW5pc2N1bGUgY29kZSBjbGVhbi11cAorCSAgR1NUX0NMT0NLX1RJTUVfTk9ORSBpcyBub3Qgc29tZXRoaW5nIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW4gY29ubmVjdGlvbiB3aXRoCisJICBHU1RfRk9STUFUX0JZVEVTLgorCisyMDEwLTA5LTI5IDEwOjM0OjM2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHJldmVyc2UgcGxheWJhY2s7IHByZXZlbnQgb3ZlcmxhcCBvZiBzdWJzZXF1ZW50IGZyYWdtZW50cworCisyMDEwLTA5LTI4IDE2OjIxOjQ4ICswMzAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAbm9raWEuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaXggbWlzc2luZyBudWxsLXRlcm1pbmF0b3IgaW4gcHJvdG9jb2xzIGFycmF5CisJICBGaXhlcyByYW5kb20gY3Jhc2ggcmVncmVzc2lvbiBmcm9tIGNvbW1pdCBhZTg0YWUuCisKKzIwMTAtMDktMjQgMTY6MjY6MjAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGRvbid0IGFkZCAvVURQIGluIHRoZSB0cmFuc3BvcnQsIGl0J3MgdGhlIGRlZmF1bHQKKwkgIGRvbid0IGFkZCB0aGUgZGVmYXVsdCBVRFAgbG93ZXItdHJhbnNwb3J0LCBzb21lIHNlcnZlcnMgZG9uJ3Qgc2VlbSB0byBsaWtlIGl0LgorCSAgRml4ZXMgIzYzMDUwMAorCisyMDEwLTA2LTI1IDE3OjA4OjAzICswMjAwICBQYXNjYWwgQnVobGVyIDxwYXNjYWwuYnVobGVyQHRhbmRiZXJnLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBtYW5hZ2VyOiBwYWNrZXQgbG9zdCBzaG91bGQgbm90IGJlIGEgd2FybmluZy4gSXQgaGFwcGVucyBhbGwgdGhlIHRpbWUuLi4KKworMjAxMC0wOS0yNCAxNTozMzo0MCArMDIwMCAgUGFzY2FsIEJ1aGxlciA8cGFzY2FsLmJ1aGxlckB0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBydHBiaW46IE1ha2UgY2xlYW5pbmcgdXAgc291cmNlcyBpbiBydHBfc2Vzc2lvbl9vbl90aW1lb3V0IE1UIHNhZmUKKwkgIFVzaW5nIF9mb3JlYWNoX3JlbW92ZSBvbiB0aGUgaGFzaHRhYmxlLCB3aGlsZSByZWxlYXNpbmcgdGhlIGxvY2sgcHJvdGVjdGluZworCSAgdGhhdCB0YWJsZSBpbnNpZGUgdGhlIGNhbGxiYWNrIGlzIG5vdCBhIGdvb2QgaWRlYS4gVGhlIGhhc2h0YWJsZSBtaWdodAorCSAgdGhlbiBjaGFuZ2UgKGEgc291cmNlIHJlbW92ZWQgb3IgYWRkZWQpIHdoaWxlIHNpZ25hbHMgbGlrZSBvbl90aW1lb3V0CisJICBhcmUgYmVpbmcgc2VudC4KKwkgIFRoaXMgc29sdXRpb24gbWFrZXMgYSBjb3B5IG9mIHRoZSB0YWJsZSwgcGVyZm9ybXMgdGhlIF9mb3JlYWNoIHdpdGhvdXQKKwkgIGFjdHVhbGx5IHJlbW92aW5nIGFueSBzb3VyY2VzLCBidXQgbWFya3MgdGhlbSBmb3IgcmVtb3ZhbCBvbiBhIHNlY29uZAorCSAgaXRlcmF0aW9uIHdpdGggdGhlIHJlYWwgbGlzdCwgYnV0IHRoaXMgdGltZSBub3QgbGV0dGluZyBnbyBvZiB0aGUgbG9jay4KKwkgIEZpeGVzICM2MzA0NTIKKworMjAxMC0wOS0yNCAxNToxOToxNSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzoKKwkgIGlkM2RlbXV4OiBTYW5pdGl6ZSBpZDMgZnJhbWUgbmFtZXMKKwkgIFRoaXMgaXMgc2ltaWxhciB0byB3aGF0IGlzIGRvbmUgaW4gcXRkZW11eC4gQXZvaWRzIHByb3ZpZGluZyBpbnZhbGlkCisJICBzdHJ1Y3R1cmUvdGFncyBuYW1lcworCisyMDEwLTA5LTI0IDE0OjU5OjQ1ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6CisJICBhcGVkZW11eDogU2tpcCBlbXB0eSB0YWdzCisJICBBdm9pZCBjcmVhdGluZyBib2d1cyBzdHJpbmcgdGFncy4gQWxzbyBhZGRlZCBsb2dnaW5nIG9mIHRoZSBzdHJpbmcKKwkgIHZhbHVlcyBvZiB0aGUgdGFnIG5hbWUgYW5kIHZhbHVlLgorCisyMDEwLTA5LTI0IDA4OjU2OjM2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXA6IGluaXQgZGVidWcgY2F0ZWdvcnkgYmVmb3JlIHVzaW5nIGl0CisKKzIwMTAtMDQtMTIgMDk6NDk6MTQgKzAyMDAgIFBhc2NhbCBCdWhsZXIgPHBhc2NhbC5idWhsZXJAdGFuZGJlcmcuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogSGFuZGxlIHJ5c25jIG9mIGl0ZXJhdG9yIHdoZW4gbG9va2luZyBmb3IgZnJlZSBwYWQgbmFtZQorCSAgSWYgYSBuZXcgcGFkIHdhcyBhZGRlZCB3aGlsZSBpdGVyYXRpbmcgdGhlbiBhIHBhZCBjb3VsZCBiZQorCSAgcmV0dXJuZWQgdGhhdCB3YXMgYWxyZWFkeSBpbiB1c2UuCisJICBGaXhlcyAjNjMwNDUxCisKKzIwMTAtMDktMjQgMTQ6MDk6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGZpeCBjb21waWxhdGlvbgorCisyMDEwLTA0LTA3IDE1OjMxOjUyICswMjAwICBUcm9uZCBBbmRlcnNlbiA8dHJvbmQuYW5kZXJzZW5AdGFuZGJlcmcuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogVW5sb2NrIGJlZm9yZSBhZGRpbmcgcGFkIGluIG5ld19wYXlsb2FkX2ZvdW5kCisJICBIb2xkaW5nIGludGVybmFsIGxvY2tzIHdoaWxlIHBvdGVudGlhbGx5IGNhbGxpbmcgb3V0IGlzIGEgc291cmNlCisJICBvZiBkZWFkbG9ja3MsIGFuZCBpbiB0aGlzIGNhc2UgdGhlIGFwcGxpY2F0aW9uIG1pZ2h0IHN1YnNjcmliZSB0byB0aGUKKwkgIHBhZC1hZGRlZCBzaWduYWwuCisJICBGaXhlcyAjNjMwNDQ5CisKKzIwMDktMDgtMzEgMTg6Mzc6NDAgKzAyMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQHRhbmRiZXJnLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogcmVsYXggdGhpcmQtcGFydHkgY29sbGlzaW9uIGRldGVjdGlvbgorCSAgSWYgdGhlIHNvdXJjZSBoYXMgYmVlbiBpbmFjdGl2ZSBmb3Igc29tZSB0aW1lLCB3ZSBhc3N1bWUgdGhhdCBpdCBoYXMKKwkgIHNpbXBseSBjaGFuZ2VkIGl0cyB0cmFuc3BvcnQgc291cmNlIGFkZHJlc3MuIEhlbmNlLCB0aGVyZSBpcyBubyB0cnVlCisJICB0aGlyZC1wYXJ0eSBjb2xsaXNpb24gLSBvbmx5IGEgc2ltdWxhdGVkIG9uZS4KKwkgIEZpeGVzICM2MzA0NDcKKworMjAxMC0wOS0yNCAxMzo1MDowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzb3VyY2U6IHdoaXRlc3BhY2UgZml4ZXMKKworMjAxMC0wOS0yNCAxMzo0ODo1MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzb3VyY2U6IHNpbXBsaWZ5IHRoZSByYXRlIGVzdGltYXRpb24gc29tZSBtb3JlCisKKzIwMDktMDgtMzEgMTg6MzQ6MDggKzAyMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQHRhbmRiZXJnLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaDoKKwkgIHJ0cG1hbmFnZXI6IHByb3ZpZGUgYWRkaXRpb25hbCBzdGF0aXN0aWNzCisKKzIwMTAtMDktMjQgMDA6MDE6MDUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IHNldCBwbHVnaW4gcmVsZWFzZSBkYXRldGltZQorCisyMDEwLTA5LTIzIDIxOjIxOjI5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmg6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5oOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXJuYmFuZHMuaDoKKwkgIGVxdWFsaXplcjogZml4IGNsYXNzIGRlZmluaXRpb25zCisJICBDbGFzcyBzdHJ1Y3R1cmVzIG11c3QgYmUgYmFzZWQgb24gdGhlIHBhcmVudCBjbGFzcyBzdHJ1Y3QsIG5vdCBvbgorCSAgdGhlIHBhcmVudCBpbnN0YW5jZSBzdHJ1Y3QuCisKKzIwMTAtMDktMTUgMjA6MzY6MzMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjI6IHByZS1yZWdpc3RlciBwYWQgY2xhc3MgcHJvcGVybHkgd2l0aCBnX3R5cGVfY2xhc3NfcmVmCisJICBGaXggY29kZSB0byBtYXRjaCB0aGUgY29tbWVudC4gQWxzbywgdGhlcmUncyBubyBuZWVkIHRvIHJlZ2lzdGVyIHRoZQorCSAgYmFja2dyb3VuZCBlbnVtIHR5cGUgYWdhaW4sIHRoaXMgaXMgYWxyZWFkeSBkb25lIHZpYSBpbnN0YWxsX3Byb3BlcnR5LgorCisyMDEwLTA5LTIzIDIxOjU3OjE4ICswMjAwICBEYXZpZCBIb3l0IDxkaG95dEBsbG5sLmdvdj4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkgIHNwZWV4OiBGaXggY3Jhc2hlcyB3aXRoIE1TVkMKKwkgIFVzaW5nIHRoZSBzeW1ib2xzIGZvciB0aGUgZGlmZmVyZW50IFNwZWV4IG1vZGVzIHJlc3VsdHMKKwkgIGluIGNyYXNoZXMgd2hlbiB1c2luZyBNU1ZDLiBVc2UgdGhlIGxpYnJhcnkgZnVuY3Rpb25zIHRvCisJICBnZXQgdGhlIG1vZGVzIGluc3RlYWQuCisJICBGaXhlcyBidWcgIzYzMDM3OC4KKworMjAxMC0wOC0yNCAxMzoyNTowMiArMDIwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAdGFuZGJlcmcuY29tPgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIGxldmVsOiBhdm9pZCBkaXZpc2lvbiBieSB6ZXJvIG9uIHNpbGVuY2UKKwkgIEZpeGVzIGJ1ZyAjNjMwNDU4LgorCisyMDEwLTA5LTIzIDE2OjQ2OjMxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogcGFyc2UgYW5kIHVzZSBjdHMKKwkgIEZvciBIMjY0LCB0aGVyZSBpcyBhbiBleHRyYSBoZWFkZXIgY29udGFpbmluZyB0aGUgQ1RTLCB3aGljaCBpcyBhIHRpbWVzdGFtcAorCSAgb2Zmc2V0IHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIFBUUy4gUGFyc2UgdGhpcyB2YWx1ZSBhbmQgdXNlIGl0IHRvIGFkanVzdAorCSAgdGhlIHB0cy4KKwkgIEZpeGVzICM2MzAwODgKKworMjAxMC0wOS0yMyAxNjo0NTo0MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IGltcHJvdmUgcHRzIGRlYnVnZ2luZworCisyMDEwLTA5LTIyIDE5OjAxOjQwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB0ZXN0cy9leGFtcGxlcy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3B1bHNlLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9leGFtcGxlcy9wdWxzZS9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3B1bHNlL3B1bHNlLmM6CisJICBwdWxzZTogYWRkIHRlc3QgYXBwIGZvciBwdWxzZSBkZXZpY2UgcHJvYmUKKworMjAxMC0wOS0yMiAxODo1MDo0NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZTogZml4IGRldmljZV9kZXNjcmlwdGlvbiBpbiBSRUFEWQorCSAgTWFrZSB0aGUgaXNfZGVhZCBjaGVjayBtb3JlIGNsZWFyIGFuZCBhZGQgYW4gb3B0aW9uIHRvIGNoZWNrIGZvciB0aGUgc3RhdHVzIG9mCisJICB0aGUgc3RyZWFtIGluIGFkZGl0aW9uIHRvIHRoZSBjb250ZXh0LgorCSAgV2UgZG9uJ3QgbmVlZCBhIHN0cmVhbSB0byBnZXQgdGhlIGRldmljZV9kZXNjcmlwdGlvbiBzdHJpbmcuCisJICBGaXhlcyAjNjMwMzE3CisKKzIwMTAtMDktMjIgMTI6NTY6MDAgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IERvbid0IHBvc3QgdGFncyBpZiB0aGVyZSBhcmUgbm9uZQorCSAgQW5kIG1ha2UgYWxsIGNvZGUgZ28gdGhyb3VnaCBfcG9zdF9nbG9iYWxfdGFncy4KKworMjAxMC0wOS0yMiAxMjozNzozMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5Lmg6CisJICBydHBoMjY0ZGVwYXk6IHJlZmFjdG9yIGFuZCBzaW1wbGlmeSBBVSBtZXJnaW5nCisJICBNb3ZlIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBOQUxVIHRvIGEgc2VwYXJhdGUgbWV0aG9kLgorCSAgU2ltcGxpZnkgdGhlIG1lcmdpbmcgb2YgTkFMVSBpbnRvIEFVIGFuZCB1c2UgY29tbW9uIGNvZGUgd2hlbiBwb3NzaWJsZS4KKworMjAxMC0wOS0yMSAyMzoyMzowNyArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkgIHNoYXBld2lwZTogYWRkIG9wdGlvbmFsIGJvcmRlciBwYXJhbWV0ZXIgYW5kIHNsb3dkb3duIGFuaW1hdGlvbgorCSAgQWxsb3cgdG8gcGxheSB3aXRoIHRoZSBib3JkZXIgcHJvcGVydHkgKHNoYXJwL3NvZnQgZWRnZXMpLgorCisyMDEwLTA5LTIxIDE5OjE0OjQwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkgIHNoYXBld2lwZTogRm9yY2UgZm9ybWF0IHRvIEFZVVYgaW4gdGhlIGV4YW1wbGUgcGlwZWxpbmUgZm9yIHRoZSBzYW1lIHJlYXNvbgorCisyMDEwLTA5LTIxIDE5OjEzOjA3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlL3NoYXBld2lwZS1leGFtcGxlLmM6CisJICBzaGFwZXdpcGU6IEZvcmNlIHRoZSBpbnB1dCB0byBBWVVWIHRvIHByZXZlbnQgbmVnb3RpYXRpb24gZmFpbHVyZXMgaW4gdmlkZW9taXhlcgorCSAgVGhlIHNlY29uZCB2aWRlb3Rlc3RzcmMgY2hhaW4gbWlnaHQgcHJvZHVjZSBZVVkyIGJlY2F1c2UgZXZlcnl0aGluZyBpcworCSAgYWNjZXB0ZWQgZG93bnN0cmVhbSBiZWZvcmUgdGhlIGZpcnN0IHNoYXBld2lwZSBjaGFpbiBnZXRzIG5lZ290aWF0ZWQuCisKKzIwMTAtMDktMjEgMTk6MTI6NDUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSAgc2hhcGV3aXBlOiBJbXByb3ZlIGRlYnVnZ2luZyBhbmQgaW1tZWRpYXRlbHkgcmV0dXJuIGVtcHR5IGNhcHMgZnJvbSB0aGUgZ2V0Y2FwcyBmdW5jdGlvbnMKKworMjAxMC0wOS0yMSAxODozMzo1NSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGFhMGQxZDAgdG8gNWUzYzliZgorCisyMDEwLTA5LTIxIDEyOjQ5OjMxICswMjAwICBQaGlsaXBwZSBOb3JtYW5kIDxwbm9ybWFuZEBpZ2FsaWEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ4b3ZlcmxheS5oOgorCSAgdjRsMjogdXNlIHRoZSB4b3ZlcmxheSBBUElzCisKKzIwMTAtMDktMjEgMTI6NDg6MzQgKzAyMDAgIFBoaWxpcHBlIE5vcm1hbmQgPHBub3JtYW5kQGlnYWxpYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogdXNlIHRoZSBuZXcgeG92ZXJsYXkgQVBJcworCSAgQWxzbyBidW1wZWQgLWJhc2UgcmVxdWlyZW1lbnRzLgorCisyMDEwLTA5LTIxIDEyOjMxOjU5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBVc2UgLURHU1RfRElTQUJMRV9ERVBSRUNBVEVEIGFnYWluIGZvciBHSVQgdmVyc2lvbnMKKworMjAxMC0wOS0yMSAxMTo1MjoyMiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBGaXggZGVidWcgc3RhdGVtZW50CisKKzIwMTAtMDktMjAgMjM6MTc6MzUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBQYXJzZSB1dWlkIGF0b21zIGluIHB1c2ggbW9kZQorCSAgUGFyc2VzIHV1aWQgYXRvbXMgaW4gcHVzaCBtb2RlIHdoZW4gdGhleSBhcmUgZm91bmQsIHRoZXkgbWlnaHQKKwkgIGNvbnRhaW4geG1wIHRhZ3MuCisJICBBbHNvIGRvZXMgYSBtaW5vciByZWZhY3RvcmluZyB0byBwdXQgdGhlIGdsb2JhbCB0YWdzIHBvc3RpbmcKKwkgIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gaW5zdGVhZCBvZiByZXBlYXRpbmcgaXQgaW4gMyBkaWZmZXJlbnQKKwkgIHBsYWNlcy4KKwkgIEZpeGVzICM2Mjk4MzkKKworMjAxMC0wOS0xNiAwODowNDowMiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IERlbGF5IHRhZ3MgcG9zdGluZyBhIGxpdHRsZQorCSAgRGVsYXkgdGFncyBwb3N0aW5nIHVudGlsIHdlJ3ZlIHBhcnNlZCBhbGwgdGhlIGhlYWRlcnMgc28KKwkgIHRoYXQgdGhlIG5hdGl2ZSBhbmQgeG1wIHRhZ3MgZ2V0IG1lcmdlZCBiZWZvcmUgcG9zdGluZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYyOTgzOQorCisyMDEwLTA5LTE1IDIyOjEzOjQzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkgIHF0ZGVtdXg6IFBhcnNlIHhtcCBwYWNrZXQgaW4gdXVpZCBhdG9tCisJICB4bXAgcGFja2V0IGlzIHBsYWNlZCBpbnRvIGEgdG9wLWxldmVsIHV1aWQgYXRvbSBmb3IKKwkgIGlzb20vbXA0IHZhcmlhbnRzLgorCSAgVGhpcyBwYXRjaCBtYWtlcyBxdGRlbXV4IHBhcnNlIGFsbCB0b3AtbGV2ZWwgYXRvbXMKKwkgIGluIHB1bGwtbW9kZSBiZWZvcmUgc3RhcnRpbmcgdG8gcHVzaCBkYXRhLCBtYWtpbmcKKwkgIGl0IGFibGUgdG8gZmluZCB0aG9zZSB0YWdzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYyOTgzOQorCisyMDEwLTA5LTE3IDExOjA3OjUyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSAgcnRwc3RhdHM6IHByaW50ZiBmb3JtYXQgZml4ZXMKKworMjAxMC0wOS0xNyAxMTowNzowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSAgcnRwcGF5OiBzb21lIHByaW50ZiBmb3JtYXQgZml4ZXMKKworMjAxMC0wOS0xNSAxODoyMToxMSArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZGVjaW5hQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IGxvZ2ljIHdoZW4gcHVzaGluZyBFT1MuCisJICBEb24ndCBjaGVjayBmb3IgcmV0dXJuIHZhbHVlcyB3aGVuIHB1c2hpbmcgRU9TLiBTdGlsbCBwb3N0IGFuIGVycm9yIGlmIEVPUyBpcworCSAgcmVhY2hlZCBhbmQgbm8gc3RyZWFtcyBoYXZlIGJlZW4gZm91bmQuCisKKzIwMTAtMDktMTUgMTc6MDI6NTcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBkb2NzOiBhZGQgZ3RrLWRvYyBjaHVua3Mgd2l0aCBTaW5jZTogbWFya2VycyBmb3IgbmV3IHY0bDJzcmMgcHJvcGVydGllcworCisyMDEwLTA5LTE1IDE4OjQzOjUwICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvY2FtY3RybC5jOgorCSAgY2FtY3RybDogYWRkIGxpY2Vuc2UgaGVhZGVyIHRvIGRlbW8KKworMjAxMC0wOS0xNCAxNzo0MToyOCArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZGVjaW5hQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZG9uJ3Qgc2VuZCBFT1MgdHdpY2Ugb24gdGhlIHNhbWUgcGFkLgorCisyMDEwLTA5LTE0IDEwOjA3OjU4ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkgIHB1bHNlc2luazogbW92ZSB0aGUgc2hhcmVkIG1haW5sb29wIGZyb20gY2xhc3MgdG8gc3RhdGljIHZhcgorCSAgSnVzdCBoYXZlIG9uZSBzdGF0aWMgdmFyIGZvciB0aGUgc2hhcmVkIG1haW5sb29wIGluc3RlYWQgb2Ygb25lIGNsYXNzIHZhcmlhYmxlCisJICBhbmQgY29waWVzIGluIHRoZSBpbnN0YW5jZS4KKworMjAxMC0wOS0xMyAxNzozMTozNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBydHBqcGVncGF5OiBjbGVhbnVwcyBmb3IgRFJJIG1hcmtlcnMKKwkgIFByb3RlY3QgYWdhaW5zdCBpbnZhbGlkIERSSSBtYXJrZXJzLgorCSAgZG8gc29tZSBjbGVhbnVwcworCisyMDEwLTA5LTEwIDExOjM1OjUzIC0wNDAwICBBbWVyaWNhbiBEeW5hbWljcyA8R1N0cmVhbWVyLUJ1Z3NAdHljb3NwLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBnc3RydHBqcGVncGF5OiBBZGRlZCBEZWZpbmUgUmVzdGFydCBJbnRlcnZhbCAoRFJJKSBNYXJrZXIKKwkgIEFkZGVkIGFiaWxpdHkgdG8gZGV0ZWN0IGFuZCByZXNwb25kIHRvIGEgSlBFRy1kZWZpbmVkIERSSSBtYXJrZXIKKworMjAxMC0wNi0xOSAxOToyMDoxOCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBnc3RydHBzZXNzaW9uOiBTcGxpdCBnZXR0aW5nIHRoZSBjYXBzIGludG8gaXRzIG93biBmdW5jdGlvbgorCisyMDEwLTA5LTEzIDE2OjAzOjUwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogc21hbGwgY2xlYW51cC4KKworMjAxMC0wOS0xMyAxNjoyNDoyNiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJICBwdWxzZXNpbms6IHJld29yayBjb250ZXh0IHNoYXJpbmcKKwkgIFdlIGFsc28gbmVlZCB0byBzaGFyZSB0aGUgbWFpbi1sb29wIHRocmVhZHMgYXMgdGhpcyBvd25zIHRoZSBjb250ZXh0LiBUaHVzIGhhdmUKKwkgIGEgY2xhc3Mgd2lkZSBtYWluLWxvb3AgdGhyZWFkLiBGcm9tIHRoaXMgd2UgY3JlYXRlIGEgY29udGV4dCBwZXIgY2xpZW50LW5hbWUuCisJICBJbnN0ZWFkIG9mIGFsd2F5cyBsb29raW5nIHVwIHRoZSBjb250ZXh0LCB3ZSBrZWVwIHRoaXMgd2l0aCB0aGUgaW5zdGFuY2UuIFRoZQorCSAgcmV2ZXJzZSBtYXBwaW5nIGlzIG9ubHkgbmVlZGVkIGluIHB1bHNlIHNpbmdhbCBoYW5kbGVycy4gVGhpcyBzYXZlcyBhIGxvdCBvZgorCSAgbG9ja2luZy4gQWxzbyBvbmUgc2lnbmFsIGhhbmRsZXIgYmVjb21lcyBzaW1wbGVyIGFzIHRoZXIgZWlzIG9ubHkgb25lIG1haW5sb29wCisJICB0byBub3RpZnkuCisJICBOb3cgdmFsZ2luZCBoYXBweSAtIG5vIGxlYWtzLCBubyBiYWQgcmVhZHMvd3JpdGVzLgorCSAgVGhpcyByZXZlcnRzIG1ham9yIHBhcnRzIG9mIGNvbW1pdCA2OWEzOTdjMzJmNGJhZjA3YTdiMjkzN2M2MTBmOWU4ZjM4M2U5YWU5LgorCSAgRml4ZXMgIzYyODk5NgorCisyMDEwLTA5LTEzIDE1OjQ0OjUyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSAgcnRwc2Vzc2lvbjogU21hbGwgY2xlYW51cHMKKwkgIE1ha2UgdGhlIHByb3BlcnR5IGRlc2NyaXB0aW9uIHByZXR0aWVyLgorCSAgQWN0dWFsbHkgbXVsdGlwbGUgdGhlIGJhbmR3aWR0aCB3aXRoIHRoZSBmcmFjdGlvbi4KKworMjAxMC0wNi0wMSAyMTozNTo0MCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaDoKKwkgIHJ0cHNlc3Npb246IENhbGN1bGF0ZSBSVENQIGJhbmR3aWR0aCBhcyBhIGZyYWN0aW9uIG9mIHRoZSBSVFAgYmFuZHdpZHRoCisJICBDYWxjdWxhdGUgdGhlIFJUQ1AgYmFuZHdpZHRoIHRvIGJlIGEgZnJhY3Rpb24gb2YgdGhlIFJUUCBiYW5kd2lkdGggaWYgaXQgaXMKKwkgIHNwZWNpZmllZCBhcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMS4KKworMjAxMC0wOS0xMyAxNToyOTowNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogaW1wcm92ZSBiYW5kd2lkdGggcmVjYWxjdWxhdGlvbgorCSAgQWxzbyByZWNhbGN1bGF0ZSBiYW5kd2lkdGggd2hlbiBvbmUgb2YgdGhlIHNvdXJjZSBiYW5kd2lkdGhzIGNoYW5nZWQuCisJICBVc2UgdGhlIG5ld2x5IGNhbGN1bGF0ZWQgYmFuZHdpZHRoLgorCisyMDEwLTA2LTAxIDIxOjE3OjI2IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IEFkZCB0aGUgb3B0aW9uIHRvIGF1dG8tZGlzY292ZXIgdGhlIFJUUCBiYW5kd2lkdGgKKworMjAxMC0wOS0xMyAxNDozODoxMSArMDIwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IHNldCB1c2UtcGlwZWxpbmUtY2xvY2sgb24gY29ycmVjdCBHT2JqZWN0CisKKzIwMTAtMDYtMDIgMTc6NTE6MTIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogSW5pdGlhbGlzZSB0aGUgYXZlcmFnZSBzY2FsZWQgYnkgMTYKKworMjAxMC0wOS0xMyAxMjo0MToxMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogYWRkIHJ1bm5pbmdfdGltZSBhcmd1bWVudCBkb2NzCisKKzIwMTAtMDYtMjMgMTY6MTM6MDEgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaDoKKwkgIHJ0cHN0YXRzOiBSZWN0aWZ5IGRlc2NyaXB0aW9uIG9mIGN1cnJlbnRfdGltZSBpbiBSVFBBcnJpdmFsU3RhdHMKKwkgIEl0IGlzIHRoZSBjdXJyZW50IHRpbWUsIGl0IGlzIHVucmVsYXRlZCB0byB3aGVuIHRoZSBwYWNrZXQgd2FzIGFjdHVhbGx5IHJlY2VpdmVkLgorCisyMDEwLTA5LTEzIDEyOjMxOjQwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBjb21wdXRlIHRoZSBhdmVyYWdlIGNvcnJlY3RseSBzY2FsZWQKKworMjAxMC0wNi0wMSAyMDozMToxOCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBDb3VudCBzZW50IFJUQ1AgcGFja2V0cyBhZnRlciB0aGV5IGhhdmUgYmVlbiBmaW5pc2hlZAorCSAgSWYgdGhleSBhcmUgY291bnRlZCBiZWZvcmUgY2FsbGluZyBnc3RfcnRjcF9idWZmZXJfZW5kKCksIHRoZW4gdGhlCisJICBzaXplIGlzIHdheSB0b28gYmlnLgorCisyMDEwLTA2LTAxIDE5OjUxOjM0IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIGdzdHJ0cHNlc3Npb246IERvbid0IHVucmVmICBwYWRzIGluIGZpbmFsaXplCisJICBUaGUgZ3N0cnRwc2Vzc2lvbiBvYmplY3QgaXMgbm90IGhvbGRpbmcgYW55IHJlZmVyZW5jZSB0byB0aGVtIGRpcmVjdGx5CisKKzIwMTAtMDktMTIgMDA6MDk6MDkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBwby9QT1RGSUxFUy5pbjoKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zIGZvciBuZXcgc291cGh0dHBzcmMgbWVzc2FnZXMKKworMjAxMC0wOS0xMiAwMDowODowNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwOiBob29rIHVwIGkxOG4gYml0cyBmb3IgcGx1Z2luCisJICBDYWxsIGJpbmR0ZXh0ZG9tYWluKCkgZXRjLgorCisyMDEwLTA5LTEyIDAwOjA0OjQyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXA6IGZpeCBlcnJvciBtZXNzYWdlcworCSAgRXJyb3IgbWVzc2FnZXMgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuIFVSSXMgYW5kIGZpbGVuYW1lcyBzaG91bGQgbm90CisJICBiZSBwYXJ0IG9mIHRoZSBlcnJvciBtZXNzYWdlIHN0cmluZyB0aGF0J3Mgc2hvd24gdG8gdGhlIHVzZXIuCisJICBzb3VwX21lc3NhZ2UtPnJlYXNvbl9waHJhc2UgaXMgbm90IHRyYW5zbGF0ZWQgYW5kIG5vdCBzdWl0YWJsZSBhcworCSAgZXJyb3IgbWVzc2FnZSBmb3IgdXNlcnMgKHNlZSBsaWJzb3VwIGRvY3VtZW50YXRpb24pLiBBbHNvIGZpeCB1cAorCSAgZXJyb3IgY29kZXMgYSBiaXQsIGFzIGZhciBhcyBwb3NzaWJsZSB3aXRoIHRoZSBleGlzdGluZyBjb2Rlcy4KKworMjAxMC0wOS0xMCAwOTo0MzoyNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGRvbid0IHBvc3QgYW4gZXJyb3IgbWVzc2FnZSBpZiBidWZmZXIgYWxsb2MgZmFpbHMgd2l0aCBOT1RfTElOS0VEIGZsb3cKKwkgIFRoaXMgaXMgbm90IGZhdGFsLCBsZXQgdXBzdHJlYW0gaGFuZGxlIGl0LgorCisyMDEwLTA5LTEwIDE4OjA2OjQ4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBkb24ndCBjbGVhciBzZHAgd2hlbiBzZXQgYXMgdXJpCisJICB3aGVuIHdlIHNldCB0aGUgU0RQIHdpdGggYW4gdXJpLCBkb24ndCBjbGVhciBpdCB3aGVuIHdlIGdvIHRvIFJFQURZLgorCisyMDEwLTA5LTEwIDE4OjAxOjE4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiB1c2Ugc2RwIHVyaSBwYXJzZSBtZXRob2QKKwkgIFVzZSB0aGUgc2RwIHBhcnNlIG1ldGhvZCB0aGF0IGRvZXMgcHJvcGVyIHVyaSBlc2NhcGluZy4KKworMjAxMC0wOS0xMCAxNjo1OToxMCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy92NGwyLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9leGFtcGxlcy92NGwyL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvdjRsMi9jYW1jdHJsLmM6CisJICBleGFtcGxlOiBhZGQgdjRsMiBleGFtcGxlLCBkZW1vbnN0cmF0aW5nIHRoZSB1c2Ugb2YgZ3N0IGNvbnRyb2xsZXIKKworMjAxMC0wOS0xMCAxNjo1NToyNSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICB2NGwyc3JjOiBkb24ndCBza2lwIGNhbGN1bGF0aW5nIHRoZSBkdXJhdGlvbgorCisyMDEwLTA2LTIyIDE1OjQ4OjA0ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSogc3lzL3Y0bDIvZ3N0djRsMi5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSAgdjRsMnNyYzogYWRkIGNvbnRyb2xhYmxlIGNvbG9yYmFsYW5jZSBwYXJhbWV0ZXJzCisJICBFeHBvc2UgY29sb3JiYWxhbmNlIGNvbnRyb2xzIGFzIG9iamVjdCBwcm9wZXJ0aWVzIChsaWtlIHdlIGRvIG9uIHh2aW1hZ2VzaW5rKS4KKwkgIE1ha2UgdGhlbSBjb250cm9sYWJsZS4KKworMjAxMC0wOS0xMCAxMzoyNTozOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYzoKKwkgIHJ0cG1wYXJvYnVzdGRlcGF5OiBmaXggc29tZSBtaXMtaW1wbGVtZW50YXRpb24KKwkgIEFsc28gYWRkIHNvbWUgZGVidWcuCisKKzIwMTAtMDktMTAgMTM6MjQ6MDIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJICBydHBtcGFyb2J1c3RkZXBheTogcHJvcGVybHkgaW5zZXJ0IGR1bW15IGJ1ZmZlcnMKKworMjAxMC0wOS0xMCAxMTo1NToyNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogYWRkIHJ0c3Atc2RwIHByb3RvY29sIHN1cHBvcnQKKwkgIEFsbG93IHNldHRpbmcgYW4gU0RQIHdpdGggdGhlIHJ0c3Atc2RwOi8vIHVybC4KKwkgIEJhc2VkIG9uIHBhdGNoIGZyb20gTWFyY28gQmFsbGVzaW8uCisJICBTZWUgIzYyODIxNAorCisyMDEwLTA5LTEwIDExOjM1OjU4ICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kZWNpbmFAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSAgYWxwaGFjb2xvcjogbWFrZSBwYXNzdGhyb3VnaCB3b3JrLgorCisyMDEwLTA5LTA5IDIxOjQzOjQwICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJICBtcDRhZGVwYXk6IHNtYWxsIGxvZ2dpbmcgY2xlYW51cCBhbmQgYWRkaXRpb24gdG8gZGVidWcgY29uZmlnIHBhcnNpbmcKKworMjAxMC0wOS0wOSAyMTo0Mjo0NiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6CisJICBhYXNpbms6IGZpeCBjb250ZXh0IGluaXRpYWxpc2F0aW9uIGFuZCBmcmVlaW5nIHRvIG5vdCBsZWFrCisKKzIwMTAtMDktMDkgMjE6NDA6NTEgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9nZW5lcmljL3N0YXRlcy5jOgorCSAgdGVzdHM6IGFsbG93IHJ1bm5pbmcgc3RhdGUgdGVzdHMgZm9yIGFsbCBlbGVtZW50cworCSAgTm93IG9uZSBjYW4gdXNlIEdTVF9OT19TVEFURV9JR05PUkVfRUxFTUVOVFM9MSBtYWtlIGdlbmVyaWMvc3RhdGVzLmNoZWNrCisJICB0byB0cnkgZWxlbWVudHMgdGhhdCB3b3VsZCBub3JtYWx5IGJlIHNraXBwZWQuCisKKzIwMTAtMDktMDkgMTg6NDc6NTYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6CisJICB0ZXN0czogZml4IHJ0cGpwZWdwYXkgdGVzdAorCSAgTWFrZSB0aGUgZGF0YSB3ZSBzZW5kIHRvIHRoZSBqcGVnIHBheWxvYWRlciBiZSBhIHZhbGlkIGpwZWcgZmlsZSBiZWNhdXNlIHRoZQorCSAgcGF5bG9hZGVyIG5vdyBleHBlY3RzIHRoaXMuCisKKzIwMTAtMDktMDkgMTg6NDc6MTEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAgcnRwanBlZ3BheTogaW1wcm92ZSBkZWJ1Z2dpbmcKKworMjAxMC0wOS0wOSAxNjozMTo1NiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYzoKKwkgIHJ0cG1wYXJvYnVzdGRlcGF5OiB1c2UgdmFsaWQgYml0cmF0ZSBmb3IgZHVtbXkgZnJhbWUKKworMjAxMC0wOS0wOCAxNzowNzo1MyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJICBpZDN2Mm11eDogQWRkcyBtYXBwaW5nIGZvciBhbGJ1bSBhcnRpc3QKKwkgIE1hcHMgR1NUX1RBR19BTEJVTV9BUlRJU1QgdG8gVFBFMiBpbiBpZDN2Mm11eAorCisyMDEwLTA5LTA4IDE4OjM1OjA4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBSZXF1aXJlIG9yYyAwLjQuOAorCSAgVGhlIGRlaW50ZXJsYWNlIHBsdWdpbiBhcHBhcmVudGx5IGZhaWxzIHRvIGNvbXBpbGUgd2l0aCBvbGRlciB2ZXJzaW9ucy4KKworMjAxMC0wOS0wOCAxNzo1MDoxMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogUW9TIGhhbmRsaW5nIGxvZ2ljIG9ubHkgYXBwbGllcyB0byBmb3J3YXJkIHBsYXliYWNrCisJICBGaXhlcyAjNjI4ODk0LgorCisyMDEwLTA5LTA4IDE3OjQzOjQ3ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogcmVtb3ZlIHVudXNlZCBjb2RlCisKKzIwMTAtMDktMDggMTQ6MzY6NDggKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBmaXh1cCBsYXN0IGNvbW1pdAorCSAgV2UgbmVlZCB0byBwcmV2ZW50IHRoZSBldmVudHVhbCBsZWFrIGJldHRlci4KKworMjAxMC0wOS0wOCAxNDoxNjo1OCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGNvZGUgY2xlYW51cHMKKwkgIFVzZSBnX3NsaXN0X3ByZXBlbmQgYXMgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgb3JkZXIuIENoZWNrIGZvciBsaXN0ID09IE5VTEwKKwkgIGluc3RlYWQgb2YgaXRlcmF0aW5nIHRoZSBsaXN0IHRvIHNlZSBpZiBpdCBpcyBlbXB0eS4gTW92ZSBjdHggYWxsb2NhdGlvbiBkb3duCisJICB0byBwcmV2ZW50IGxlYWsgaW4gY2FzZSBvZiBmYWlsdXJlLgorCisyMDEwLTA5LTA4IDA3OjEzOjQyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBydHBqcGVncGF5OiBGaXggdW5pbml0aWFsaXplZCB2YXJpYWJsZSBjb21waWxlciB3YXJuaW5nCisJICBGaXhlcyBidWcgIzYyOTAxOC4KKworMjAxMC0wOS0wNyAxOTowMjowMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBzaW1wbGlmeSBjbG9jayBwcm92aWRlIGNvZGUKKwkgIERvbid0IGxlYWsgdGhlIHB1bHNlc2luayBlbGVtZW50IGJ5IGhhdmluZyB0aGUgY2xvY2sga2VlcCBhIHJlZiB0byB0aGUgc2luay4KKwkgIENyZWF0ZSB0aGUgY2xvY2sgb25seSBvbmNlIGluIHRoZSBjb25zdHJ1Y3RvciBhbmQgdXNlIHRoZSBiYXNlYXVkaW9zaW5rIGNsb2NrCisJICBjbGVhbnVwIGNvZGUuCisKKzIwMTAtMDktMDcgMTc6NDk6MDUgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBtb3ZlIHRoZSBjb250ZXh0IHRhYmxlIGluaXQgdG8gX2dldF90eXBlIHBoYXNlCisJICBUaGlzIHNlZW1zIHRvIGZpeCB0aGUgaW52YWxpZCByZWFkcyBvbiBjb250ZXh0IHNodXRkb3duIGJldHRlciwgYWx0b3VnaAorCSAgSSBjYW4ndCByZWFsbHkgZXhwbGFpbi4KKworMjAxMC0wOS0wNyAxNzowNjowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogdXNlIG9sZGVyIGdfYXJyYXlfZnJlZQorCSAgZ19hcnJheV91bnJlZigpIGlzIG9ubHkgc2luY2UgMi4yMgorCisyMDEwLTA5LTA3IDE2OjQ5OjE2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBhdm9pZCBpbnZhbGlkIGFkYXB0ZXIgZmx1c2ggb24gUW9TCisJICBGaXJzdCBzdG9yZSB0aGUgYXZhaWxhYmxlIGRhdGEgaW4gdGhlIGFkYXB0ZXIgaW4gdGhlIHJlbV9pbWdfbGVuIGluc3RhbmNlIGZpZWxkCisJICBiZWZvcmUgdHJ5aW5nIHRvIGZsdXNoIHRoZSBhZGFwdGVyIHdpdGggdGhhdCB2YWx1ZSBvbiBRb1MuCisKKzIwMTAtMDktMDcgMTY6NDA6MDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAgcnRwanBlZ3BheTogZG8gc29tZSBtb3JlIHNhbml0aXR5IGNoZWNrcworCSAgUHJvdGVjdCBzb21lIG1vcmUgYWdhaW5zdCBpbnZhbGlkIGlucHV0LgorCisyMDEwLTA5LTA3IDE1OjIwOjEyICswMjAwICBBbWVyaWNhbiBEeW5hbWljcyA8R1N0cmVhbWVyLUJ1Z3MgYXQgdHljb3NwLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBqcGVncGF5OiBoYW5kbGUgY29ycnVwdGVkIGpwZWcgYmV0dGVyCisJICBQcm90ZWN0IGFnYWluc3QgY29ycnVwdGVkIGpwZWcgaW5wdXQuCisKKzIwMTAtMDktMDcgMTM6NTU6MDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJICBydmF3ZGVwYXk6IGNsZWFudXAgdW51c2VkIGZpZWxkcworCisyMDEwLTA5LTA3IDEzOjUxOjM3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSAgdnJhd2RlcGF5OiBoYW5kbGUgaW52YWxpZCBwYXlsb2FkIGJldHRlcgorCSAgTWFrZSBzdXJlIHdlIGRvbid0IHJlYWQgbW9yZSBkYXRhIHRoYW4gYXZhaWxhYmxlIGluIHRoZSBpbnB1dCBidWZmZXIuCisJICBDbGlwIHRoZSBpbnB1dCBkYXRhIGludG8gdGhlIG91dHB1dCBidWZmZXIuCisKKzIwMTAtMDgtMTYgMTU6MzU6NTEgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuaDoKKwkgIHB1bHNlOiBhbGxvdyBzZXR0aW5nIHN0cmVhbSBwcm9wZXJ0aWVzCisJICBBZGQgYSAicHJvcGVydGllcyIgcHJvcGVydHkgdG8gdGhlIGVsZW1lbnRzIHRvIGFsbG93IHNldHRpbmcgZXh0cmEgc3RyZWFtCisJICBwcm9wZXJ0aWVzLgorCSAgRml4ZXMgIzUzNzU0NAorCisyMDEwLTA5LTA3IDEyOjA4OjEwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1ZjMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJICBkb2NzOiByZW1vdmUgaW50cm9zcGVjdGlvbiBpbmZvIGZvciBnZGtwaXhidWYzIHBsdWdpbiBhbmQgdXBkYXRlIHZlcnNpb24gZm9yIG90aGVycworCSAgVGhlIHZlcnNpb25zIGdvdCBhY2NpZGVudGFsbHkgcmV2ZXJ0ZWQgdG8gYSBwcmUtcmVsZWFzZSB2ZXJzaW9uLCBmaXggdGhhdC4KKworMjAxMC0wOS0wNyAxMTo0MjoxMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBjMmUxMGJmIHRvIGFhMGQxZDAKKworMjAxMC0wOS0wNyAwOToyMDowMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuYzoKKwkgIGNtbWxkZWM6IGZpeCBmbG93IHJldHVybiBoYW5kbGluZworCSAgRml4IGJ1Z2d5IEdTVF9GTE9XX0lTX0ZBVEFMIHN1YnN0aXR1dGlvbiwgYW5kICdtYWtlIGNoZWNrJzoKKwkgIC0gIGlmICghR1NUX0ZMT1dfSVNfRkFUQUwgKGRlYy0+Zmxvd19yZXR1cm4pICYmICFkZWMtPnNlbnRfcm9vdCkgeworCSAgKyAgaWYgKGRlYy0+Zmxvd19yZXR1cm4gIT0gR1NUX0ZMT1dfT0sgJiYgIWRlYy0+c2VudF9yb290KSB7CisKKzIwMTAtMDktMDcgMDA6Mjc6MDcgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBkb24ndCBmcmVlIHRoZSBjb250ZXh0IG11bHRpcGxlIHRpbWVzCisJICBBcHBhcmVudGx5IHRoZSBjbG9zZSBmdW5jdGlvbiBvZiB0aGUgcmluZy1idWZmZXIgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KKworMjAxMC0wOC0xMiAxMjozMzowNiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSAgcnRwbXA0YWRlcGF5OiBncmFiIHRoZSBzYW1wbGluZyBhcnRlIGFuZCBwdXQgaW50byBjYXBzCisJICBUaGlzIGlzIG5lZWRlZCB0byBiZSBhYmxlIHRvIG11eCB0aGUgcmVjZWl2ZWQgYXVkaW8gaW50byBtcDQgKGluIHRoZSBjYXNlIG9mCisJICBhYWMpLiBGaXhlcyAjNjI1ODI1LgorCisyMDEwLTA5LTA2IDE0OjQwOjAyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5jOgorCSAgcnRwOiBtYXJrIGNvbnN0YW50IHRhYmxlcyBhcyBjb25zdAorCisyMDEwLTA4LTE4IDE0OjQwOjQ4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5Lmg6CisJICBydHBhbXJwYXk6IHByb3Blcmx5IHN1cHBvcnQgcGVyZmVjdC1ydHB0aW1lCisKKzIwMTAtMDgtMTggMTE6NDI6MzMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSAgcnRwYW1ycGF5OiBwcm9wZXIgZHVyYXRpb24gZm9yIG11bHRpcGxlIGZyYW1lIHBheWxvYWQKKworMjAxMC0wOC0xOCAxMTo0MjowNyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJICBydHBhbXIoZGUpcGF5OiBzdXBwb3J0IEFNUi1XQiBTSUQgZnJhbWUKKworMjAxMC0wOC0xOCAxMTozOTowNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5Lmg6CisJICBydHBnNzI5cGF5OiBwcm9wZXJseSBzdXBwb3J0IHBlcmZlY3QtcnRwdGltZQorCisyMDEwLTA4LTE2IDE2OjA4OjA0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogaW1wcm92ZSBmcmFtZXJhdGUgZGV0ZXJtaW5pbmcKKwkgIENvbGxlY3QgYSBsaW1pdGVkIG51bWJlciBvZiBzdGFydGluZyBzYW1wbGUgZHVyYXRpb25zIGFuZCB1c2UgdGhlIG1lZGlhbiBvZgorCSAgdGhvc2UgdG8gZGV0ZXJtaW5lIGNhcHMgZnJhbWVyYXRlLgorCisyMDEwLTA4LTE3IDEyOjA4OjEwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBhdHRlbXB0IG1vcmUgcmVzeW5jIHVwb24gKGNsdXN0ZXIpIHBhcnNlIGVycm9yCisJICBUaGF0IGlzLCBpZiBwYXJzZSBlcnJvciBvY2N1cnMgaW4gc3RhdGUgcmVxdWlyaW5nIHRvIG1vdmUgdG8gbmV4dCBjbHVzdGVyLAorCSAgYW5kIGRvaW5nIHNvIHRvIHRoZSBleHBlY3RlZCBuZXh0IHBvc2l0aW9uIG9mIGNsdXN0ZXIgZmFpbHMsIHRoZW4gc2NhbiBmb3IgYQorCSAgbmV4dCBjbHVzdGVyIGZyb20gcHJlc2VudCBwb3NpdGlvbiBhbmQgcmVzdW1lIGZyb20gdGhlcmUuCisJICBGaXhlcyAjNjIwNzkwLgorCisyMDEwLTA4LTE2IDE2OjA1OjQxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBub3Qgc28gZmF0YWwgZXJyb3IgaGFuZGxpbmcKKwkgIElmIHNvbWUgYml0cyBvdXQgb2YgcGxhY2UgaW4gYmxvY2soZ3JvdXApIHBhcnNpbmcsIGZvcmVnbyBhbmQgbW92ZSB0byBuZXh0LgorCSAgQWxzbyBza2lwIGxhcmdlIGJsb2NrcyBpbiBwdWxsIG1vZGUsIGJ1dCBuZWVkIHRvIGdpdmUgdXAgaW4gcHVzaCBtb2RlLgorCSAgRml4ZXMgIzYyNjQ2My4KKwkgIEltcHJvdmVzICM2MjA3OTAuCisKKzIwMTAtMDctMjYgMTU6NTE6NDkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgbWF0cm9za2FkZW11eDogYWRkaXRpb25hbCBwYXJzZSByZWNvdmVyeQorCSAgSW4gcGFydGljdWxhciwgdXBvbiBwYXJzZSBmYWlsdXJlIGluIG9uZSBjbHVzdGVyLCB3ZSBtYXkgZm9yZWdvIHJlbWFpbmluZworCSAgY29udGVudCBhbmQgdHJ5IHJlc3VtaW5nIGZyb20gbmV4dCBjbHVzdGVyIG9ud2FyZHMuCisJICBGaXhlcyAjNjIwNzkwLgorCisyMDEwLTA4LTI2IDAyOjU0OjU1IC0wNDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJICBkdG1mc3JjOiBNYWtlIHRoZSBkdG1mc3JjIGFjY2VwdCBldmVudHMgc2VudCB3aXRoIGdzdF9lbGVtZW50X3NlbmRfZXZlbnQKKwkgIFRoZSBkb2Mgc2F5cyB0byB1c2UgZ3N0X2VsZW1lbnRfc2VuZF9ldmVudCBvbiB0aGUgcGlwZWxpbmUsIGJ1dCBpZgorCSAgd2UgYXJlIHRvIGNhbGwgaXQgb24gdGhlIGVsZW1lbnQgaXRzZWxmLCBpdCdzIGEgbm9vcC4gVGhpcyBzaG91bGQgbWFrZSBpdAorCSAgaGFuZGxlIHRoZSBldmVudCBwcm9wZXJseSBiZWZvcmUgZGVsZWdhdGluZyBpdCB0byBiYXNlc3JjLgorCisyMDEwLTA5LTA2IDEyOjIyOjExICswMjAwICBBbWVyaWNhbiBEeW5hbWljcyA8R1N0cmVhbWVyLUJ1Z3MgYXQgdHljb3NwLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogQWRkIHByb3BlcnR5IHRvIGNvbmZpZ3VyZSB1ZHBzcmMgYnVmZmVyIHNpemUKKwkgIEFkZCBhIG5ldyB1ZHAtYnVmZmVyLXNpemUgcHJvcGVydHkgdG8gY29uZmlndXJlIHRoZSBidWZmZXItc2l6ZSBvbiB0aGUgdWRwc3JjCisJICBlbGVtZW50cy4KKwkgIEZpeGVzICM2MjgwNTgKKworMjAxMC0wOC0yNyAxNzo1ODo0NyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgIHJ0cGJpbjogYWRkIG50cC1zeW5jIHByb3BlcnR5CisJICBBZGQgYW4gbnRwLXN5bmMgcHJvcGVydHkgdGhhdCB3aWxsIHN5bmMgdGhlIHJlY2VpdmVkIHN0cmVhbXMgdG8gdGhlIHNlcnZlcgorCSAgTlRQIHRpbWUuIFRoaXMgcmVxdWlyZXMgc3luY2hyb25pemVkIE5UUCB0aW1lcyBiZXR3ZWVuIHRoZSBzZW5kZXIgYW5kIHJlY2VpdmVycywKKwkgIGxpa2Ugd2l0aCBudHBkLgorCSAgQmFzZWQgb24gcGF0Y2ggZnJvbSBUaGlqcyBWZXJtZWlyLgorCSAgRml4ZXMgIzYyNzc5NgorCisyMDEwLTA4LTI3IDEyOjE0OjI1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogcmVuYW1lIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW9uCisKKzIwMTAtMDgtMjcgMTE6MDc6MzQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiByZW5hbWUgc29tZSB2YXJpYWJsZXMgZm9yIGxlc3MgY29uZnVzaW9uCisKKzIwMTAtMDgtMjcgMTA6NDE6MDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBtb3ZlIGNvbW1lbnQgd2hlcmUgaXQgYmVsb25ncworCisyMDEwLTA4LTI2IDE2OjAwOjM4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBtaW5vciBjbGVhbnVwcworCSAgTWFrZSBjbG9jayBzbmFwc2hvdHMgbW9yZSBhY2N1cmF0ZSBieSBvbmx5IHNhbXBsaW5nIHRoZSBzYW1lIGNsb2NrIG9uY2UuCisKKzIwMTAtMDgtMjYgMTA6NTg6MjYgKzAyMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBiaW46IGFkZCB1c2UtcGlwZWxpbmUtY2xvY2sgcHJvcGVydHkKKwkgIFdpdGggdGhpcyBwcm9wZXJ0eSBSVENQIFNSIE5UUCB0aW1lcyBjYW4gYmUgYmFzZWQKKwkgIG9uIHRoZSBzeXN0ZW0gY2xvY2sgKG1heWJlIHN5bmNlZCB3aXRoIG50cGQpIG9yIHRoZQorCSAgY3VycmVudCBwaXBlbGluZSBjbG9jay4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Mjc3OTYKKworMjAxMC0wOC0yNSAwOTo1ODoyMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcGV4dC5jOgorCSAgcnRzcGV4dDogc3RvcCBjb25maWd1cmF0aW9uIG9uIGZpcnN0IGZhaWx1cmUKKwkgIFN0b3AgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBzdHJlYW0gYXMgc29vbiBhcyBzb21lIG9mIHRoZSBleHRlbnNpb25zIHJldHVybgorCSAgRkFMU0UuCisJICBGaXhlcyAjNTgxMjk0CisKKzIwMTAtMDgtMjAgMTU6MzU6MjcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSAgbXVsdGlmZHNpbms6IHVzZSByZWZjb3VudCB0byBjb3VudCBob3N0L3BvcnQgZHVwbGljYXRlcworCSAgSW5zdGVhZCBvZiBhZGRpbmcgbXVsdGlwbGUgY2xpZW50IHN0cnVjdHVyZXMgZm9yIHRoZSBzYW1lIGhvc3QvcG9ydCBwYWlyLCB1c2UgYQorCSAgcmVmY291bnQuCisJICBBZGQgYSBzZW5kLWR1cGxpY2F0ZXMgZmVhdHVyZSB0aGF0IGFsbG93cyB5b3UgdG8gZGlzYWJsZSBzZW5kaW5nIG11bHRpcGxlIGNvcGllcworCSAgb2YgdGhlIHNhbWUgcGFja2V0IHRvIHRoZSBzYW1lIGhvc3Qgd2hlbiBpdCB3YXMgYWRkZWQgbXVsdGlwbGUgdGltZXMuIFRoZQorCSAgc2VuZC1kdXBsaWNhdGVzIHByb3BlcnR5IGlzIGJ5IGRlZmF1bHQgc2V0IHRvIFRSVUUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisJICBhbHRob3VnaCBpdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IHRoaXMgaXMgbm90IGRlc2lyZWQgYmVoYXZpb3VyLgorCisyMDEwLTA4LTE5IDE3OjA2OjI2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBpbXBsZW1lbnQgY3VzdG9tIGV2ZW50IGhhbmRsZXIKKwkgIEV4dGVuZCB0aGUgX3B1c2hfZXZlbnQoKSBmdW5jdGlvbiBzbyB0aGF0IGl0IGNhbiBhbHNvIHNlbmQgZXZlbnRzIHRvIHRoZSB1ZHAKKwkgIHNvdXJjZXMgd2hlbiBhc2tlZC4KKwkgIEltcGxlbWVudCBhIGN1c3R1bSBzZW5kX2V2ZW50IGZ1bmN0aW9uIHRoYXQgY29ycmVjdGx5IGRpc3BhdGNoZXMgdGhlIGRvd25zdHJlYW0KKwkgIGV2ZW50cyBpbiBUQ1AgbW9kZS4gVGhpcyBmaXhlcyBzZW5kaW5nIEVPUyB0byBydHNwc3JjIGFuZCBoYXZlIGl0IHB1c2ggdGhlIEVPUworCSAgZG93bnN0cmVhbS4KKworMjAxMC0wOC0xOSAxMTozNzowNCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogdXNlIF9nZXRfY2Fwc19yZWZmZWQoKSB3aGVuIHdlIGNhbgorCSAgVXNlIF9nZXRfY2Fwc19yZWZmZWQoKQorCSAgQWRkIHNvbWUgbW9yZSBkZWJ1ZyB3aGVuIG9wZW5pbmcgdGhlIHNlcnZlciBjb25uZWN0aW9uLgorCisyMDEwLTA4LTE2IDExOjI5OjA3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuaDoKKwkgIGpwZWdkZXBheTogaGFuZGxlIERJU0NPTlQgYW5kIHJlc2V0IHN0YXRlCisJICBQdXQgYSBESVNDT05UIGV2ZW50IG9uIHRoZSBuZXh0IG91dHB1dCBidWZmZXIgd2hlbiB0aGUgaW5wdXQgYnVmZmVyIGhhZCBhCisJICBESVNDT05ULgorCSAgTWFrZSBzdXJlIHdlIGNsZWFyIG91ciBhZGFwdGVyIGFuZCByZXNldCBvdXIgc3RhdGUgYmVmb3JlIGdvaW5nIHRvIFBBVVNFRC4KKwkgIEZyZWUgdGhlIHF0YWJsZXMuCisJICBGaXhlcyAjNjI2ODY5CisKKzIwMTAtMDgtMTYgMTE6Mjc6NTMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5oOgorCSAgZzcyOXBheTogZXh0ZW5kIGZyb20gcmlnaHQgcGFyZW50CisKKzIwMTAtMDktMDYgMDk6NTc6MTAgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBhZGQgc2luY2UgZG9jcyBmb3IgbmV3IHByb3BlcnR5LgorCisyMDEwLTA4LTMwIDE2OjQ1OjQ4ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHVzZSBHU1RfQk9JTEVSUExBVEUgbWFjcm8KKworMjAxMC0wOC0xNiAxNzoyMzo1OCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlbWl4ZXI6IGFkZCBhIGV4YW1wbGUgc2hvd2luZyBob3cgdG8gdXNlIHRoZSBjaGlsZCBwcm9wZXJ0aWVzCisJICBTaG93IGhvdyB0byBwb3NpdGlvbiBhbmQgc2V0IHRoZSBhbHBobyBvZiB0aGUgdmlkZW9zIG9uIGdzdC1sYXVuY2guCisKKzIwMTAtMDgtMTYgMTU6MTk6MzggKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogbW92ZSB0aGUgcHJvcGVydHktc2V0dGVyIHRvIHRoZSBnZXR0ZXIuCisKKzIwMTAtMDgtMTEgMTU6NDg6MTggKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBzcGVjdHJ1bSBvbmx5IGFnZ3JlZ2F0ZSBtYWduaXR1ZGUvcGhhc2UgaWYgdXNlciBhc2tzIGZvciBpdAorCisyMDEwLTA4LTExIDE1OjQ1OjU2ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IGltcHJvdmUgcGVyZm9ybWFuY2Ugd2l0aCBsb2NhbCB2YXJzCisJICBVc2UgJ2lucHV0JyBpbnN0ZWFkIG9mICdzcGVjdHJ1bS0+aW5wdXQnIHdoaWNoIHdhcyBpbnRlbmRlIGFscmVhZHkgKHZhcmlhYmxlCisJICBleGlzdHMsIGJ1dCBub3QgdXNlZCBldmVyeXdoZXJlKS4gQWxzbyB1c2UgYSBsb2NhbCB2ZXJzaW9uIG9mCisJICAnc3BlY3RydW0tPmlucHV0X3BvcycuCisKKzIwMTAtMDgtMTEgMTU6NDQ6MDMgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBzcGVjdHJ1bTogY29kZSBjbGVhbnVwCisJICBNb3JlIGNvbW1lbnRzIGFuZCBsb2dnaW5nLiBFeHRyYWN0IG9uZSBjb21wbGV4IGNvbmRpdGlvbiB0byBhIHZhcmlhYmxlLiBSZW9yZGVyCisJICBzb21lIGNvZGUgZm9yIHJlYWRhYmlsaXR5LgorCisyMDEwLTA4LTExIDE1OjQwOjA5ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IGltcHJvdmUgcHJvcGVydHkgc2V0dGVyCisJICBjb25zaXN0ZW50bHkgb25seSB1cGRhdGUgaWYgdGhlIHByb3BlcnR5IGFjdHVhbHkgY2hhbmdlZCB0aGUgdmFsdWUuIERvIGl0CisJICB3aXRob3V0IHJlYWRpbmcgdGhlIGd2YWx1ZSB0d2ljZS4gTm8gbmVlZCB0byByZXNldCB0aGUgc3BlY3RydW0gYW5hbHl6ZXIgZm9yCisJICB0aHJlc2hvbGQgY2hhbmdlcy4KKworMjAxMC0wOC0xMSAxNTozODoyNCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgIHNwZWN0cnVtOiBhZGQgaGVscGVyIHRvIG9ubHkgZmx1c2ggcmluZ2J1ZmZlciBkYXRhIHdpdGhvdXQgcmVzZXR0aW5nIHRoZSBmZnQKKwkgIFJlZHVjZXMgc29tZSBkdXBsaWNhdGVkIGNvZGUgYXMgd2VsbC4KKworMjAxMC0wOC0xMSAxMjo0NTo1MyArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5oOgorCSAgc3BlY3RydW06IG1vcmUgY29tbWVudHMKKworMjAxMC0wOS0wNSAyMjoyMjo0MiAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IERvY3VtZW50IG1ldGhvZHMgd2l0aCBiYWQgcXVhbGl0eQorCisyMDEwLTA5LTA1IDIyOjE5OjU2IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlbWV0aG9kLmM6CisJICBkZWludGVybGFjZTogaW5pdGlhbGl6ZSBhbGwgZGVpbnRlcmxhY2UgY2xhc3MgbWVtYmVycworCSAgVGhpcyBmaXhlcyBVWVZZIGRlaW50ZXJsYWNpbmcuCisKKzIwMTAtMDktMDUgMTg6NTg6MTMgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZDNkOWFjZiB0byBjMmUxMGJmCisKKzIwMTAtMDktMDUgMTg6NDU6MjEgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSAgdmlkZW9taXhlcjogb3JjX2luaXQoKSBkb2Vzbid0IG5lZWQgdG8gYmUgY2FsbGVkCisJICBUaGVyZSdzIG5vIG5lZWQgdG8gY2FsbCBvcmNfaW5pdCgpIHVubGVzcyB5b3UncmUgdXNpbmcgdGhlIE9yYworCSAgQVBJIGRpcmVjdGx5LiAgQWxsIGNvZGUgY3JlYXRlZCBieSBvcmNjIGlzIGd1YXJhbnRlZWQgdG8gd29yaworCSAgd2l0aG91dCBjYWxsaW5nIG9yY19pbml0KCkuCisKKzIwMTAtMDktMDUgMTg6NDA6NDggLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLWRpc3QuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUub3JjOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHkuYzoKKwkgIGRlaW50ZXJsYWNlOiBGaXggZ3JlZWR5bCBPcmMgaW1wbGVtZW50YXRpb24KKwkgIFRvIGFncmVlIHdpdGggdGhlIHByZXZpb3VzIEMvYXNtIGNvZGUuCisKKzIwMTAtMDktMDUgMjI6MzE6MzQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjI6IEZhaWwgd2hlbiBjYXBzIGFyZSBpbmNvbXBhdGlibGUKKwkgIERvIG5vdCBmb3JnZXQgdG8gcmV0dXJuIGZhbHNlIHdoZW4gY2FwcyBhcmUgaW5jb21wYXRpYmxlLgorCisyMDEwLTA5LTA1IDIwOjU2OjUyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkgIHZpZGVvbWl4ZXI6IE9ubHkgaW5pdCBvcmMgaWYgaXQgaXMgYXZhaWxhYmxlCisJICBQdXQgc29tZSBpZmRlZiBhcm91bmQgb3JjX2luaXQgdG8gcHJldmVudCBidWlsZCBlcnJvcnMKKworMjAxMC0wOS0wNSAxMjoxNzowOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBlYzYwMjE3IHRvIGQzZDlhY2YKKworMjAxMC0wOS0wNCAxMjo0NjozMSAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUtZGlzdC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0Lmg6CisJICBkZWludGVybGFjZTogVXBkYXRlIGRpc3RlZCBPcmMgZmlsZXMKKworMjAwOS0wNi0yOSAxMTo0MzowNyAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkgIHY0bDJzcmM6IGFkZCBkZWNpbWF0ZSBwcm9wZXJ0eQorCisyMDEwLTA2LTA0IDEyOjA5OjIzIC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2R2L01ha2VmaWxlLmFtOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9kdi9nc3RzbXB0ZXRpbWVjb2RlLmg6CisJICBkdmRlbXV4OiBQYXJzZSBTTVBURSB0aW1lIGNvZGVzCisKKzIwMTAtMDgtMjMgMDI6NTA6MzYgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2xpbmVhci5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXJibGVuZC5jOgorCSAgZGVpbnRlcmxhY2U6IHJlbW92ZSBhc3NlbWJseSBjb2RlIGluIGZhdm9yIG9mIG9yYworCisyMDEwLTA2LTA4IDE0OjU0OjQ5IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS5vcmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeS5jOgorCSAgZGVpbnRlcmxhY2U6IGltcGxlbWVudCBncmVlZHkgaW4gT3JjCisKKzIwMTAtMDktMDQgMTE6NDM6MjEgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLWRpc3QuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUtZGlzdC5oOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLWRpc3QuYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy1kaXN0Lmg6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0LmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0Lmg6CisJICB1cGRhdGUgZGlzdGVkIE9yYyBmaWxlcworCisyMDEwLTA5LTAyIDE0OjM0OjUwICswMjAwICBUaGliYXVsdCBTYXVuaWVyIDx0c2F1bmllckBnbm9tZS5vcmc+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJICBhbHBoYWNvbG9yOiBGaXggY2xhc3NpZmljYXRpb24KKwkgIFRoaXMgaXMgbm8gZWZmZWN0IGJ1dCBhIGNvbnZlcnRlci4gRml4ZXMgYnVnICM2Mjg2MDguCisKKzIwMTAtMDktMDIgMTE6MTk6MDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnR5cGVzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1ZjMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMnBhZC5oOgorCSAgdmlkZW9taXhlcjI6IEFkZCBkb2N1bWVudGF0aW9uIGFuZCBhZGQgdG8gdGhlIGRvY3MKKworMjAxMC0wNy0yNiAxNjowNzoxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvZ3N0Y29sbGVjdHBhZHMyLmM6CisJKiBnc3QvdmlkZW9taXhlci9nc3Rjb2xsZWN0cGFkczIuaDoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5oOgorCSAgdmlkZW9taXhlcjI6IEFkZCB2aWRlb21peGVyMiBlbGVtZW50CisJICBUaGlzIGlzIGJhc2VkIG9uIGNvbGxlY3RwYWRzMiBhbmQgaXMgc3luY2hyb25pemluZworCSAgYWxsIHN0cmVhbXMgYmFzZWQgb24gdGhlIHJ1bm5pbmcgdGltZS4KKwkgIE5ldyBmZWF0dXJlcyBjb21wYXJlZCB0byBvbGQgdmlkZW9taXhlcjoKKwkgICogU3luY2hyb25pemluZyBmcmFtZXMgb24gdGhlIHJ1bm5pbmcgdGltZQorCSAgKiBJbXByb3ZlZCBhbmQgc2ltcGxpZmllZCBuZWdvdGlhdGlvbgorCSAgKiBGdWxsIFFvUyBzdXBwb3J0CisJICAqIFZhcmlhYmxlIGZyYW1lcmF0ZSBzdXBwb3J0CisJICBGaXhlcyBidWcgIzYyNjA0OCwgIzYyNDkwNS4KKworMjAxMC0wOS0wMSAxMToxMTozNCArMDIwMCAgUGF2ZWwgS29zdHl1Y2hlbmtvIDxzaHByb3R4QGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBSZWxheCBwYXJzaW5nIG9mIGRhdGUgdGFncworCSAgQmVmb3JlIHdlIHJlcXVpcmVkIGEgY29tcGxldGUgZGF0ZSBpbiBtYXRyb3NrYWRlbXV4IGJ1dCBpbgorCSAgaWQzZGVtdXggZm9yIGV4YW1wbGUgb25seSB0aGUgeWVhciBvciB5ZWFyIGFuZCBtb250aCB3YXMgcG9zc2libGUgdG9vLgorCSAgRml4ZXMgYnVnICM2Mjg0NTQuCisKKzIwMTAtMDgtMzAgMTk6MDM6NTIgKzAxMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZC5zaW1vbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBVc2UgR3N0QmFzZVNyYzo6YmxvY2stc2l6ZSBhcyBmYWxsYmFjayBzaXplCisKKzIwMTAtMDgtMzAgMTg6MzY6NTQgKzAxMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZC5zaW1vbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBGaXggdXNpbmcgbXBlZ3RzIHZpYSB0aGUgbW1hcCBpbnRlcmZhY2UKKwkgIE1QRUcgZG9lc24ndCBoYXZlIGEgc3RhdGljIHNpemUgcGVyIGZyYW1lLCBzbyBkb24ndCBwcmV0ZW5kIGl0IGhhcyBvbmUKKwkgIGFuZCBmYWlsIHdoZW4gY2FwdHVyaW5nIGJlY2F1c2UgaXQgZG9lc24ndCBtYXRjaC4gSW5zdGVhZCBtYXJrIHRoZSBzaXplCisJICBhcyB1bmtub3duIGFuZCBsZXQgdGhlIHJlYWQgZnJhbWUgZ3JhYmJpbmcgbWV0aG9kIHVzZSBhIHJlYXNvbmFibGUgZmFsbGJhY2sKKwkgIHZhbHVlIChhc3N1bWluZyB0aGF0J3Mgb25seSBmb3IgYWN0dWFsIHN0cmVhbWluZyBmb3JtYXRzKQorCSAgRml4ZXMgYnVnICM2MjgzNDkuCisKKzIwMTAtMDgtMjcgMTg6MTU6MDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgIHdhdnBhY2twYXJzZTogRG9uJ3QgdXNlIEdTVF9GTE9XX0lTX0ZBVEFMKCkKKworMjAxMC0wOC0yNyAxODoxMzoyMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJICBwbmdkZWM6IERvbid0IHVzZSBHU1RfRkxPV19JU19GQVRBTCgpCisJICBBbmQgZG9uJ3QgcG9zdCBhbiBlcnJvciBtZXNzYWdlIGlmIGRvd25zdHJlYW0gcmV0dXJucyBVTkVYUEVDVEVELgorCisyMDEwLTA4LTI3IDE4OjA5OjExICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkgIGR2ZGVtdXg6IERvbid0IHVzZSBHU1RfRkxPV19JU19GQVRBTCgpCisKKzIwMTAtMDgtMjcgMTg6MDU6NTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBEb24ndCB1c2UgR1NUX0ZMT1dfSVNfRkFUQUwoKQorCSAgQW5kIGRvbid0IHBvc3QgYW4gZXJyb3IgbWVzc2FnZSBpZiBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWQgYmVjYXVzZQorCSAgb2YgVU5FWFBFQ1RFRCwgd2hpY2ggb25seSBtZWFucyB0aGF0IGRvd25zdHJlYW0gd2FudHMgdXMgdG8gRU9TIG5vdy4KKworMjAxMC0wOC0yNyAxODowMjo1NyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmMvZGVjOiBEb24ndCB1c2UgR1NUX0ZMT1dfSVNfRkFUQUwoKQorCSAgQW5kIHByb3Blcmx5IGhhbmRsZSBVTkVYUEVDVEVEIGFuZCBXUk9OR19TVEFURS4KKworMjAxMC0wOC0yNyAxNzo1MjoxOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuYzoKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxlbmMuYzoKKwkgIGNtbWxkZWMvZW5jOiBEb24ndCB1c2UgR1NUX0ZMT1dfSVNfRkFUQUwoKQorCSAgQW5kIGFzIGEgcmVzdWx0LCBkb24ndCBpZ25vcmUgV1JPTkdfU1RBVEUgYW5kIE5PVF9MSU5LRUQuCisJICBCb3RoIG1lYW4gdGhhdCBpdCdzIGEgZ29vZCBpZGVhIHRvIHBhc3MgdGhlbSB1cHN0cmVhbSBpbnN0ZWFkCisJICBvZiBwcmV0ZW5kaW5nIHRoYXQgZXZlcnl0aGluZyBpcyBnb29kLgorCisyMDEwLTA4LTI3IDE3OjQ3OjIyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogRG9uJ3QgdXNlIEdTVF9GTE9XX0lTX0ZBVEFMKCkKKworMjAxMC0wOC0yNyAxNzo0NTo1MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IERvbid0IHVzZSBHU1RfRkxPV19JU19GQVRBTCgpIGFuZCBHU1RfRkxPV19JU19TVUNDRVNTKCkKKworMjAxMC0wOC0yNyAxNzozOTozMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IERvbid0IHVzZSBHU1RfRkxPV19JU19GQVRBTCgpCisKKzIwMTAtMDgtMjcgMTc6Mzc6MzMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IERvbid0IHVzZSBHU1RfRkxPV19JU19GQVRBTCgpCisKKzIwMTAtMDgtMjcgMTc6MzU6NDcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJICBybmRidWZmZXJzaXplOiBEb24ndCB1c2UgR1NUX0ZMT1dfSVNfRkFUQUwoKQorCisyMDEwLTA4LTI3IDE3OjM1OjM4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IERvbid0IHVzZSBHU1RfRkxPV19JU19GQVRBTCgpCisKKzIwMTAtMDgtMjcgMTc6MzI6MDkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogRG9uJ3QgdXNlIEdTVF9GTE9XX0lTX0ZBVEFMKCkKKwkgIEFuZCBkb2N1bWVudCB3aHkgd3Jvbmctc3RhdGUgZG9lc24ndCBuZWVkIGFuIGVycm9yIG1lc3NhZ2UuCisKKzIwMTAtMDgtMjYgMTM6NDQ6NDkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IEZhaWwgZ3JhY2VmdWxseSBpZiBubyB0aHJlYWRlZCBQQSBtYWlubG9vcCBjYW4gYmUgY3JlYXRlZAorCSAgRml4ZXMgYnVnICM2MjgwMjAuCisKKzIwMTAtMDgtMjQgMTU6MTE6MjAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0LmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0Lmg6CisJICB2aWRlb21peGVyOiBVcGRhdGUgZGlzdGVkIE9SQyBmaWxlcworCisyMDEwLTA4LTIzIDE1OjQ0OjUwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L3ZpZGVvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfbW14Lmg6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy5vcmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBPcHRpbWl6ZSBBUkdCIGJsZW5kaW5nIGFuZCBpbXBsZW1lbnQgQkdSQSBibGVuZGluZyB3aXRoIG9yYworCSAgVGhpcyBub3cgbWVhbnMsIHRoYXQgd2UgaGF2ZSBhYnNvbHV0ZWx5IG5vIGhhbmR3cml0dGVuIGFzc2VtYmx5IGFueW1vcmUKKwkgIGluIHZpZGVvbWl4ZXIgYW5kIGl0J3MgYWxzbyBmYXN0ZXIgbm93IHdoZW4gdXNpbmcgU1NFLgorCisyMDEwLTA4LTIyIDAxOjU4OjA1IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kb3JjLm9yYzoKKwkgIHZpZGVvbWl4ZXI6IEFkZCBvcmMgaW1wbGVtZW50YXRpb24gZm9yIGJsZW5kaW5nCisJICB2aWRlb21peGVyOiBBZGQgb3JjIGltcGxlbWVudGF0aW9uIGZvciBibGVuZGluZworCisyMDEwLTA4LTIyIDAxOjU0OjE2IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogRml4IGV4YW1wbGUgcGlwZWxpbmVzCisJICB2aWRlb21peGVyOiBGaXggZXhhbXBsZSBwaXBlbGluZXMKKworMjAxMC0wOC0yMCAxMTo0MTo1NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogQWRkIHRlc3QgZm9yIGNoZWNraW5nIGlmIGltYWdlZnJlZXplIGNvcnJlY3RseSByZXR1cm5zIFVORVhQRUNURUQgYWZ0ZXIgdGhlIGZpcnN0IGJ1ZmZlcgorCisyMDEwLTA4LTIwIDExOjM4OjA5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW1hZ2VmcmVlemUuYzoKKwkgIGltYWdlZnJlZXplOiBBZGQgdGVzdCBmb3IgYnVmZmVyYWxsb2MgcGFzc3Rocm91Z2gKKworMjAxMC0wOC0yMCAxMDozNToxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogRml4IHJhY2UgY29uZGl0aW9ucyBpbiB0aGUgdW5pdCB0ZXN0CisJICBJZiBzZXR0aW5nIHRoZSBwaXBlbGluZSB0byBQTEFZSU5HIGJlZm9yZSBpc3N1aW5nIHRoZSBzZWVrLCBidWZmZXJzCisJICBhcmUgYWxyZWFkeSBhcnJpdmluZyBhdCB0aGUgc2luayBiZWZvcmUgdGhlIHNlZWsgaXMgaGFuZGxlZCBhbmQKKwkgIHdpbGwgaGF2ZSB0aGUgd3JvbmcgdGltZXN0YW1wcyBhbmQgZXZlcnl0aGluZy4KKwkgIEZpeGVzIGJ1ZyAjNjI1NTQ3LgorCisyMDEwLTA4LTIwIDEwOjM0OjE3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuaDoKKwkgIGltYWdlZnJlZXplOiBGaXggYW5vdGhlciBzdWJ0bGUgcmFjZSBjb25kaXRpb24gcmVsYXRlZCB0byBzdGFydGluZyB0aGUgc3JjcGFkIHRhc2sKKwkgIER1ZSB0byBhIHNlZWsgdGhlIHNyY3BhZCB0YXNrIGNvdWxkIGJlIHN0YXJ0ZWQgaW4gcmFyZSBjaXJjdW1zdGFuY2VzIGFsdGhvdWdoCisJICBpdCBzaG91bGRuJ3QgYmUgc3RhcnRlZCBhbnltb3JlIGJlY2F1c2Ugbm8gdXBzdHJlYW0gYnVmZmVyIGlzIGF2YWlsYWJsZS4KKworMjAxMC0wOC0yMCAxMDoyNDozMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmg6CisJICBpbWFnZWZyZWV6ZTogUHJvdGVjdCB0aGUgZmx1c2hpbmctc2VlayB2YXJpYWJsZSBieSB0aGUgc3JjcGFkJ3Mgc3RyZWFtIGxvY2sKKwkgIFRoaXMgZml4ZXMgYSBzdWJ0bGUgcmFjZSBjb25kaXRpb24sIHRoYXQgY2F1c2VkIGJ1ZmZlcmFsbG9jIHRvIGZhaWwKKwkgIHdpdGggd3Jvbmctc3RhdGUgZHVlIHRvIGEgc2VlayBidXQgY2F1c2VkIGl0IHRvIGJlIG5vdCByZXRyaWVkIGFzCisJICBpdCBzaG91bGQuCisKKzIwMTAtMDgtMjAgMDk6MTQ6NTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYzoKKwkgIGltYWdlZnJlZXplOiBBbHdheXMgZ2VuZXJhdGUgYSBwZXJmZWN0bHkgdGltZXN0YW1wZWQgc3RyZWFtCisJICBCZWZvcmUgdGhlcmUgY291bGQgYmUgcm91bmRpbmcgZXJyb3JzIHdoZW4gY2FsY3VsYXRpbmcgdGhlIGR1cmF0aW9uLAorCSAgcmVzdWx0aW5nIGluIHRpbWVzdGFtcCArIGR1cmF0aW9uIGJlaW5nIHNtYWxsZXIgdGhhbiB0aGUgbmV4dCBidWZmZXIncworCSAgdGltZXN0YW1wLgorCisyMDEwLTA4LTE5IDE4OjM4OjM5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBPbmx5IGluY2x1ZGUgdGhlIHNlcnZlciBuYW1lIGluIHRoZSBjb250ZXh0IG5hbWUgaWYgaXQncyBub3QgTlVMTAorCisyMDEwLTA4LTE4IDE2OjM3OjQxICswMjAwICBQaGlsaXBwZSBOb3JtYW5kIDxwbm9ybWFuZEBpZ2FsaWEuY29tPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJICBwdWxzZXNpbms6IEFkZCAiY2xpZW50IiBwcm9wZXJ0eSB0byBzZXQgdGhlIFBBIGNsaWVudCBuYW1lCisJICBBbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIG1vZGlmeSB0aGUgY2xpZW50IG5hbWUgdXNlZCB0byBjb25uZWN0IHdoZW4KKwkgIGNvbm5lY3RpbmcgdG8gdGhlIFB1bHNlQXVkaW8gZGFlbW9uLiBOb3RlIGhvd2V2ZXIgdGhhdCB1cGRhdGluZyB0aGUKKwkgIHByb3BlcnR5IGFmdGVyIHRoZSBlbGVtZW50IHJlYWNoZWQgdGhlIFJFQURZIHN0YXRlIHdpbGwgaGF2ZSBubworCSAgZWZmZWN0IHVudGlsIHRoZSBuZXh0IE5VTEwtPlJFQURZIHRyYW5zaXRpb24uCisJICBGaXhlcyBidWcgIzYyNzE3NC4KKworMjAxMC0wOC0xOSAxNzo1OTowOSArMDIwMCAgRGF2aWQgSG95dCA8ZGhveXRAbGxubC5nb3Y+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogSW1wcm92ZSBlcnJvciBtZXNzYWdlcworCSAgQmVmb3JlIHRoZXkgY29udGFpbmVkIHRoZSBVUkwgYmVmb3JlIHRoZSBhY3R1YWwgZmFpbHVyZS4gVGhlIG90aGVyCisJICB3YXkgYXJvdW5kIG1ha2VzIG1vcmUgc2Vuc2UgYW5kIHdlIGRvIHRoZSBzYW1lIGluIG90aGVyIGVsZW1lbnRzCisJICBsaWtlIGZpbGVzcmMuCisJICBGaXhlcyBidWcgIzYyNzI4OS4KKworMjAxMC0wOC0xOSAxMjo0Njo1MCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogRnJlZSB0aGUgY2xvY2sgb24gc3RhdGUgY2hhbmdlIGZhaWx1cmVzIHRvbworCisyMDEwLTA4LTE3IDE2OjI2OjQxICswMjAwICBQaGlsaXBwZSBOb3JtYW5kIDxwbm9ybWFuZEBpZ2FsaWEuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvcHVsc2UvcHVsc2V1dGlsLmM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBwdWxzZXV0aWw6IGluY2x1ZGUgcGlkIHZhbHVlIGluIGdzdF9wdWxzZV9jbGllbnRfbmFtZSgpIGZhbGxiYWNrIHJldHVybiB2YWx1ZQorCSAgRml4ZXMgYnVnICM2MjcxNjIKKworMjAxMC0wOC0xOSAxMjozMjo1OSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogRnJlZSB0aGUgR3N0UHVsc2VDb250ZXh0IGFmdGVyIHVzYWdlCisKKzIwMTAtMDgtMTYgMDk6MTI6MDQgKzAyMDAgIFBoaWxpcHBlIE5vcm1hbmQgPHBub3JtYW5kQGlnYWxpYS5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogc2hhcmUgdGhlIFBBIGNvbnRleHQgYmV0d2VlbiBhbGwgY2xpZW50cyB3aXRoIHRoZSBzYW1lIG5hbWUKKwkgIEF2b2lkIHRvIGNyZWF0ZSBhIG5ldyBQQSBjb250ZXh0IGZvciBlYWNoIG5ldyBjbGllbnQgYnkgdXNpbmcgYSBoYXNoCisJICB0YWJsZSBjb250YWluaW5nIHRoZSBsaXN0IG9mIHJpbmctYnVmZmVycyBhbmQgdGhlIHNoYXJlZCBQQSBjb250ZXh0CisJICBmb3IgZWFjaCBjbGllbnQuIERvaW5nIHRoaXMgd2lsbCBpbXByb3ZlIGFwcGxpY2F0aW9uIG1lbW9yeSB1c2FnZSBpbgorCSAgdGhlIGNhc2VzIHdoZXJlIG11bHRpcGxlIHBpcGVsaW5lcyBpbnZvbHZpbmcgbXVsdGlwbGUgcHVsc2VzaW5rCisJICBlbGVtZW50cyBhcmUgdXNlZC4KKwkgIEZpeGVzIGJ1ZyAjNjI0MzM4LgorCisyMDEwLTA4LTE3IDEzOjQxOjQ5ICswMjAwICBQaGlsaXBwZSBOb3JtYW5kIDxwaGlsQGJhc2UtYXJ0Lm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBjbGVhciB0aGUgUEEgbWFpbmxvb3AgaWYgYmFzZWF1ZGlvc2luayBmYWlsZWQgdG8gb3BlbiB0aGUgcmluZ19idWZmZXIKKwkgIElmIHRoZSBhcHBsaWNhdGlvbiByZXF1ZXN0cyBhIHN0YXRlLWNoYW5nZSBhbmQgcHVsc2VzaW5rIGZhaWxzIHRvIG9wZW4KKwkgIHRoZSByaW5nX2J1ZmZlciBkZXZpY2UgdGhlIG1haW5sb29wIGF0dHJpYnV0ZSBvZiB0aGUgc2luayBzaG91bGQgYmUKKwkgIGNsZWFuZWQgdXAgdG8gYXZvaWQgZnV0dXJlIHN0YXRlLWNoYW5nZSAoTlVMTC0+UkVBRFkpIGZhaWx1cmVzLgorCisyMDEwLTA4LTE5IDEyOjIzOjE2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogUG9zdCBhbiBlcnJvciBtZXNzYWdlIGlmIEVPUyBoYXBwZW5zIGJlZm9yZSB2YWxpZCBpbnB1dCBpcyBmb3VuZAorCSAgRml4ZXMgYnVnICM2MjczNDEuCisKKzIwMTAtMDgtMTIgMTE6NDk6NDcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogU2VuZCBjbG9zZSBuZXdzZWdtZW50IGV2ZW50IGZyb20gdGhlIHN0cmVhbWluZyB0aHJlYWQKKworMjAxMC0wOC0xMSAxMTozNjozMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmg6CisJICBpbWFnZWZyZWV6ZTogUmV0cnkgYnVmZmVyYWxsb2MgaWYgaXQgd2FzIGFib3J0ZWQgd2l0aCBXUk9OR19TVEFURSBiZWNhdXNlIG9mIGEgZmx1c2hpbmcgc2VlaworCisyMDEwLTA4LTExIDA4OjQ2OjE0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogUmV0dXJuIEdTVF9GTE9XX1VORVhQRUNURUQgd2hlbiBnZXR0aW5nIGEgc2Vjb25kIGJ1ZmZlcgorCSAgVGhpcyBwcmV2ZW50cyB1cHN0cmVhbSBmcm9tIHB1c2hpbmcgbWFueSB1c2VsZXNzIGJ1ZmZlcnMgYW5kIG1ha2VzCisJICBpdCBnbyBpbnRvIEVPUyBzdGF0ZS4KKworMjAxMC0wOC0xMCAyMDoxMToyNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IFBhc3N0aHJvdWdoIGJ1ZmZlciBhbGxvY2F0aW9ucworCisyMDEwLTA5LTA0IDEzOjEwOjMwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisJICBUZW1wb3JhcmlseSBkaXNhYmxlIC1ER1NUX0RJU0FCTEVfREVQUkVDQVRFRCBmb3IgZ2l0IGJ1aWxkcyB1bnRpbAorCSAgdGhlIGNvZGUgaXMgdXBkYXRlZCBmb3IgdGhlIEdTVF9GTE9XX0lTXyogbWFjcm8gZGVwcmVjYXRpb25zLgorCis9PT0gcmVsZWFzZSAwLjEwLjI1ID09PQorCisyMDEwLTA5LTAyIDIzOjQ0OjE5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLWRpc3QuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUtZGlzdC5oOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLWRpc3QuYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy1kaXN0Lmg6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0LmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0Lmg6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTAuMjUKKworMjAxMC0wOS0wMiAyMzoxMjo0OCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJICBkb2NzOiB1cGRhdGUgZG9jcyBmb3IgcmVsZWFzZQorCisyMDEwLTA5LTAyIDIzOjA3OjM2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vTElOR1VBUzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9zdi5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTAtMDgtMjUgMTk6MDE6NTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIDAuMTAuMjQuNSBwcmUtcmVsZWFzZQorCisyMDEwLTA4LTIyIDIxOjE1OjA3IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogdXNlIHNlcGFyYXRlIGJ1ZmZlciBtZXRhZGF0YSBmb3IgZmllbGRzCisJICBDYWxsIGdzdF9idWZmZXJfbWFrZV9tZXRhZGF0YV93cml0YWJsZSgpIG9uIGJ1ZmZlcnMgdGhhdCBhcmUKKwkgIGR1cGxpY2F0ZWQgaW50byBmaWVsZHMuICBGaXhlcyAjNjI3Njg5LgorCisyMDEwLTA4LTIxIDIxOjQxOjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0LmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLWRpc3QuaDoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy1kaXN0LmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMtZGlzdC5oOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRvcmMtZGlzdC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRvcmMtZGlzdC5oOgorCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICAwLjEwLjI0LjQgcHJlLXJlbGVhc2UKKworMjAxMC0wOC0xOSAxODozMDowNSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IFByZXZlbnQgY3Jhc2ggd2hlbiByZWFkaW5nIGltYWdlIHdpdGggcHJvYmxlbXMKKwkgIENoZWNrIGlmIHdlIGhhdmUgZGF0YSBvbiB0aGUgYWRhcHRlciBhbmQgZmFpbCBpZiBub3QuCisJICBGaXhlcyAjNjI3NDEzCisKKzIwMTAtMDgtMTMgMTc6MjQ6MDEgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDNlOGRiMWQgdG8gZWM2MDIxNworCisyMDEwLTA4LTExIDIyOjIwOjI1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogU2VuZCBjbG9zZSBzZWdtZW50cyB3aGVuIHNlZWtpbmcgb25seSBmb3Igbm9uLWZsdXNoaW5nIHNlZWtzIGFuZCBpZiB3ZSBhbHJlYWR5IHNlbnQgYSBuZXdzZWdtZW50IGV2ZW50CisJICBGaXhlcyBidWcgIzYyNjYxOS4KKworMjAxMC0wOC0xMSAxNjo1MDo0MiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSogd2luMzIvY29tbW9uL2dzdHJ0cGJpbi1tYXJzaGFsLmM6CisJKiB3aW4zMi9jb21tb24vZ3N0dWRwLWVudW10eXBlcy5jOgorCSogd2luMzIvY29tbW9uL2dzdHVkcC1lbnVtdHlwZXMuaDoKKwkqIHdpbjMyL2NvbW1vbi9nc3R1ZHAtbWFyc2hhbC5jOgorCSAgMC4xMC4yNC4zIHByZS1yZWxlYXNlCisKKzIwMTAtMDgtMTEgMTE6MTc6MTggKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwcmV2ZW50IHJlYWRpbmcgcGFzdCBhdmMxIGF0b20gd2hlbiBwYXJzaW5nCisJICAuLi4gd2hlbiBvbmUgb2YgdGhlIHN1YmF0b21zIGhhcyBhIGxhcmdlL2ludmFsaWQgc2l6ZS4KKwkgIEZpeGVzICM2MjY2MDkuCisKKzIwMTAtMDgtMTAgMjM6Mzc6MjMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgMC4xMC4yNC4yIHByZS1yZWxlYXNlCisKKzIwMTAtMDgtMTAgMTA6NTc6NDUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gYmQyMDU0YiB0byAzZThkYjFkCisKKzIwMTAtMDgtMDkgMDA6MzY6MzYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZTogZml4IHByaW50ZiBmb3JtYXQgaW4gc29tZSBkZWJ1Z2dpbmcgbWVzc2FnZXMKKworMjAxMC0wOC0wOCAyMzozMTo0MiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBrZ2NvbmZpZy9nc3RyZWFtZXItcGx1Z2lucy1nb29kLXVuaW5zdGFsbGVkLnBjLmluOgorCSAgcGtnY29uZmlnOiBzZXQgcGx1Z2luc2RpciB0byB0b3AtbGV2ZWwgYnVpbGRkaXIgd2l0aG91dCB0aGUgcGtnY29uZmlnLy4uIGJpdHMKKwkgIFJlbW92ZXMgY2x1dHRlciBpbiBwbHVnaW4gZGlyIHBhdGhzLiBUaGlzIGlzIG9ubHkgdXNlZCB0byBmaW5kIHRoZSAtZ29vZAorCSAgcGx1Z2lucyBmb3IgdW5pdCB0ZXN0cyBvZiB1Z2x5L2JhZC9mZm1wZWcvZXRjLiBpbiBhbiB1bmluc3RhbGxlZCBzZXR1cC4KKworMjAxMC0wOC0wNiAyMDowNDo1OSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJzcmM6IGFsc28gbG9nIHBpeGVsIGZvcm1hdHMgaW4gc29ydGVkIG9yZGVyCisKKzIwMTAtMDgtMDYgMTg6MDc6NDYgKzAxMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZC5zaW1vbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBzb3J0IGZvcm1hdHMgaW4gdGhlIHJpZ2h0IG9yZGVyIHNvIHRoYXQgbm9uLWVtdWxhdGVkIGZvcm1hdHMgYXJlIHByZWZlcmVkCisJICBUaGUgZm9ybWF0IGxpc3Qgc2hvdWxkIGJlIHNvcnRlZCBmcm9tIGhpZ2ggcmFua3MgdG8gbG93IHJhbmtzLiBJbiB0aGUgR1NMaXN0CisJICBzb3J0aW5nIGZ1bmN0aW9uIHRoaXMgbWVhbnMgdGhlIGNvbXBhcmUgbmVlZHMgdG8gcmV0dXJuIGEgcG9zaXRpdmUgdmFsdWUgaWYKKwkgIGZvcm1hdCBhIGhhcyBhIGxvd2VyIHJhbmsgdGhhbiBmb3JtYXQgYi4KKwkgIEFtb25nIG90aGVyIHRoaW5ncyB0aGlzIGZpeGVzIHY0bDJzcmMgdG8gcHJlZmVyIG5vbi1lbXVsYXRlZCBmb3JtYXRzCisJICB0byBlbXVsYXRlZCBmb3JtYXRzIHdoZW4gYnVpbHQgYWdhaW5zdCBsaWJ2NGwuCisKKzIwMTAtMDgtMDYgMTk6MjQ6MDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBGaXggcGlwZWxpbmUgaW4gdGhlIGRvY3VtZW50YXRpb24KKwkgIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgdGhlIHNhbWUgY29sb3IgZm9ybWF0IG9uIGFsbCBzdHJlYW1zLCBpLmUuIEFZVVYKKwkgIEZpeGVzIGJ1ZyAjNjI1NDUyLgorCisyMDEwLTA4LTA1IDEzOjU2OjQ0ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBhNTE5NTcxIHRvIGJkMjA1NGIKKworMjAxMC0wNi0xNCAxOTo1ODoxMSArMTAwMCAgSm9uYXRoYW4gTWF0dGhldyA8am9uYXRoYW5AZDE0bi5vcmc+CisKKwkqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDN2Mm11eC5jOgorCSAgaWQzdjJtdXg6IHdyaXRlIGJlYXRzLXBlci1taW51dGUgdGFnIHVzaW5nIFRCUE0gZnJhbWUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MjE1MjAKKworMjAxMC0wNy0yNSAxMTo0Nzo0MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmg6CisJICB2aWRlb21peGVyOiBNb3ZlIGRlYnVnIGNhdGVnb3JpZXMgaW50byB0aGUgc291cmNlIGZpbGVzIGFuZCBhZGQgZGVidWcgY2F0ZWdvcnkgZm9yIHRoZSBibGVuZCBmdW5jdGlvbnMKKworMjAxMC0wOC0wNCAxOToyNTozMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogQ2hlY2sgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIElTTyBDODkgb3IgQzk5IGFuZCB3aGljaCBwYXJhbWV0ZXJzIGFyZSByZXF1aXJlZAorCSAgVGhpcyBmaXJzdCBjaGVja3Mgd2hhdCBpcyByZXF1aXJlZCBmb3IgSVNPIEM5OSBzdXBwb3J0IGFuZCBzZXRzIHRoZSByZWxldmFudAorCSAgY29tcGlsZXIgcGFyYW1ldGVycyBhbmQgaWYgbm8gQzk5IGNvbXBpbGVyIGlzIGZvdW5kLCBpdCBjaGVja3MgZm9yIGEKKwkgIEM4OSBjb21waWxlci4gVGhpcyBlbmFibGVzIHVzIHRvIGNoZWNrIGZvciBhbmQgdXNlIEM4OS9DOTkgZnVuY3Rpb25zCisJICB0aGF0IGdjYyBoaWRlcyBmcm9tIHVzIHdpdGhvdXQgdGhlIGNvcnJlY3QgY29tcGlsZXIgcGFyYW1ldGVycy4KKworMjAxMC0wNy0xNSAxMDoxMDozMSArMDIwMCAgUGhpbGlwcGUgTm9ybWFuZCA8cG5vcm1hbmRAaWdhbGlhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiB1c2UgR19UWVBFX0RFRklORSB0byBkZWZpbmUgcmluZyBidWZmZXIgdHlwZQorCSAgVGhlIGV4aXN0aW5nIGdldF90eXBlKCkgaW1wbGVtZW50YXRpb24gaXMgcmFjeSwgYW5kIHRoZQorCSAgZ190eXBlX2NsYXNzX3JlZigpIHdvcmthcm91bmQgZGlkbid0IGFjdHVhbGx5IHdvcmsgYmVjYXVzZQorCSAgaXQgd2FzIGluIHRoZSB3cm9uZyBmdW5jdGlvbi4gU2luY2UgY2xhc3MgY3JlYXRpb24gaW4gR09iamVjdAorCSAgaXMgdGhyZWFkLXNhZmUgdGhlc2UgZGF5cyAoc2luY2UgMi4xNiksIHRoZSBjbGFzc19yZWYgd29ya2Fyb3VuZAorCSAgaXMgbm8gbG9uZ2VyIG5lZWRlZCBhbmQgaXQgaXMgc3VmZmljaWVudCB0byBlbnN1cmUgdGhlIF9nZXRfdHlwZSgpCisJICBmdW5jdGlvbiBpcyB0aHJlYWQtc2FmZSwgd2hpY2ggR19UWVBFX0RFRklORSBkb2VzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYyNDMzOAorCisyMDEwLTA4LTA0IDE1OjIwOjQyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBQb3N0IENMT0NLLUxPU1QvQ0xPQ0stUFJPVklERSB3aGVuIGdvaW5nIHRvL2Zyb20gUkVBRFkKKwkgIE90aGVyd2lzZSB0aGUgY2xvY2tzIGFyZSByZWRpc3RyaWJ1dGVkIGV2ZXJ5IHRpbWUgdGhlIHBpcGVsaW5lCisJICBnb2VzIHRvIFBBVVNFRCwgd2hpY2ggaXMgcXVpdGUgZXhwZW5zaXZlLgorCisyMDEwLTA3LTEyIDEyOjM1OjE1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5oOgorCSAgcnRwbXA0Z3BheTogaW1wbGVtZW50IHBlcmZlY3QgdGltZXN0YW1wcworCSAgVXNlIGJpdHJlYWRlciBmb3IgcGFyc2luZyB0aGUgY29uZmlnIHN0cmluZworCSAgUmVzZXQgc3RhdGUgdmFyaWFibGVzIHdoZW4gZ29pbmcgdG8gUkVBRFkKKwkgIFBhcnNlIGZyYW1lIGxlbmd0aCBhbmQgdXNlIGl0IHRvIGtlZXAgdHJhY2sgb2YgdGhlIHJ0cHRpbWVzdGFtcHMKKworMjAxMC0wNy0wOSAxNDowNzo0OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJICBydHBoMjYzcGRlcGF5OiBhbGxvdyBtb3JlIGNsb2NrLXJhdGVzIGFzIGlucHV0CisJICBBbHRob3VnaCB0aGUgc3BlYyBzYXlzIHRoYXQgdGhlIGNsb2NrLXJhdGUgc2hvdWxkIGFsd2F5cyBiZSA5MDAwMCwgc29tZSBydHNwCisJICBzZXJ2ZXJzIHNlbmQgZGlmZmVyZW50IGNsb2NrLXJhdGVzIHNvIHdlIG11c3QgYWNjZXB0IHRoZW4gaW4gb3JkZXIgdG8gaGFuZGxlCisJICB0aG9zZSBzdHJlYW1zIHRvby4KKworMjAxMC0wNy0wNiAxOTowMjoxNCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSAgTDE2ZGVwYXk6IGRlZmF1bHQgdG8gMSBjaGFubmVsCisJICBXaGVuIHdlIGNhbid0IGZpbmQgYW55IGNoYW5uZWwgb3IgZW5jb2RpbmctcGFyYW1zIG9uIHRoZSBjYXBzIGZvciBkeW5hbWljCisJICBwYXlsb2FkIHR5cGVzLCBzZXQgdGhlIGRlZmF1bHQgbnVtYmVyIG9mIGNoYW5uZWxzIHRvIDEsIGFzIHRoZSBzcGVjIHNheXMgd2UKKwkgIHNob3VsZC4KKwkgIFNlZSAjNjIzMjA5CisKKzIwMTAtMDctMDYgMTg6MjI6MjQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGRvbid0IHJldXNlIHVkcCBzb2NrZXRzCisJICBEb24ndCByZXVzZSBzb2NrZXRzIGJ1dCBtYWtlIHRoZSB1ZHBzcmMgZWxlbWVudCBmYWlsIHRoZSBzdGF0ZSBjaGFuZ2Ugd2hlbiB0aGUKKwkgIHNvY2tldCBpcyBhbHJlYWR5IGluIHVzZS4gSWYgd2UgZG9uJ3QgcHJldmVudCByZXVzZSwgd2UgbWlnaHQgZW5kIHVwIHVzaW5nIHRoZSBzYW1lCisJICBwb3J0IGZvciBkaWZmZXJlbnQgc3RyZWFtcyBpbiBzb21lIGNhc2VzLgorCSAgRml4ZXMgIzYyMjAxNworCisyMDEwLTA3LTA2IDE4OjExOjIxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwkgIHVkcHNyYzogYWRkIHByb3BlcnR5IHRvIGVuYWJsZSBwb3J0IHJldXNlCisKKzIwMTAtMDctMDUgMTA6MjM6MzcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkgIEwxNmRlcGF5OiB1c2UgZW5jb2RpbmctcGFyYW1zIGZvciB0aGUgY2hhbm5lbHMKKwkgIFdoZW4gcGFyc2luZyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzLCB1c2UgdGhlIGVuY29kaW5nLXBhcmFtcyBwcm9wZXJ0eSBmcm9tIHRoZQorCSAgUlRQIGNhcHMgYmVjYXVzZSB0aGF0IGlzIHdoZXJlIHdlIGNhbiBmaW5kIHRoZSBjaGFubmVscyBhY2NvcmRpbmcgdG8gdGhlIHNwZWMuCisJICBGYWxsIGJhY2sgdG8gdGhlIGNoYW5uZWxzIHByb3BlcnR5IGluIHRoZSBjYXBzIHdoZW4gbmVlZGVkLgorCSAgRml4ZXMgIzYyMzIwOQorCisyMDEwLTA2LTI5IDEwOjQ2OjQxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBpbXByb3ZlIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2UKKwkgIEltcHJvdmUgZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZS4KKwkgIEZpeGVzICM2MjI1NzcKKworMjAxMC0wOC0wMiAyMzoxNTo1NiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1vc3NzcmMuYzoKKwkgIGV4YW1wbGVzOiBubyBuZWVkIHRvIHNldCB0aGUgY29sb3IgZm9yIGVhY2ggZnJxLWJhbmQKKworMjAxMC0wOC0wMiAxMjo1NjoyOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5Lmg6CisJICBydHBnNzI5cGF5OiBhdm9pZCBiYXNlcnRwcGF5bG9hZCBwZXJmZWN0LXJ0cHRpbWUgbW9kZQorCSAgRzcyOSBwYWNrZXRzIG1heSBvbmx5IG9jY3VyIGludGVybWl0dGVudGx5IChlLmcuIGNuIHBhY2tldHMpLCBhbmQgYXMgc3VjaAorCSAgZG8gbm90IGFsbG93IGZvciBwZXJmZWN0LXJ0cHRpbWUgY2FsY3VsYXRpbmcgcnRwIHRpbWVzIGJhc2VkIG9uIGZyYW1lIG9yIGJ5dGUKKwkgIGNvdW50LiAgSW4gcGFydGljdWxhciwgZG8gbm90IHVzZSBydHAgYXVkaW8gYmFzZSBwYXlsb2FkZXIgYXMgYmFzZSBjbGFzcywgYnV0CisJICByYXRoZXIgYmFzZSBwYXlsb2FkZXIgZGlyZWN0bHkuCisKKzIwMTAtMDgtMDIgMTI6NDg6MDIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IGZpeCBlbGVtZW50IGxlYWsKKworMjAxMC0wOC0wMiAxMjo0Njo0MSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJICBydHBtcDR2ZGVwYXk6IGZpeCBidWZmZXIgbGVhaworCisyMDEwLTA4LTAyIDEyOjQ2OjIwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHRlc3RzOiBydHAgcGF5bG9hZGluZzogZml4IHBhZCBsZWFrCisKKzIwMTAtMDctMjkgMTc6MTg6MTEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogcHVzaCBtb2RlOyB1c2UgcHJvcGVyIG1vdmkgb2Zmc2V0IGZvciBtb3ZpIGJhc2VkIGluZGV4CisJICBGaXhlcyAjNjIzMzU3LgorCisyMDEwLTA3LTI5IDEwOjAwOjE1IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSAgcXRkZW11eDogQ29ycmVjdGx5IHBhcnNlIG12aGQgYXRvbXMKKwkgIFBhcnNlIG12aGQgZGF0YSBhY2NvcmRpbmcgdG8gaXRzIHZlcnNpb24gdG8gYXZvaWQgZmFpbGluZworCSAgb24gdmFsaWQgZmlsZXMuCisKKzIwMTAtMDctMjggMTI6MjE6NDEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBGaXggdGhlIG1heC9hdmcgaW4gYnRydCBhdG9tIHJlYWRpbmcKKwkgIEFjY29yZGluZyB0byBJU08gbWVkaWEgYmFzZSBmb3JtYXQsIHRoZSBtYXggYml0cmF0ZSBpcyB0aGUKKwkgIGZpcnN0IG9uZSwgYW5kIHRoZSBhdmcgY29tZXMgbmV4dC4KKworMjAxMC0wNy0yNyAxNTo1ODowMiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogcHJvcGVyIGhhbmRsaW5nIG9mIHN0cmVhbWluZyB1cHN0cmVhbSB3aXRob3V0IGR1cmF0aW9uCisJICBGaXhlcyAjNjI1MzcxLgorCisyMDEwLTA3LTI2IDE4OjMzOjA5ICswMjAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBpbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHRvIGZpeCBjb21waWxlciB3YXJuaW5ncyBvbiBPU1ggYnVpbGQgYm90CisKKzIwMTAtMDctMjYgMTg6MTU6MjUgKzAyMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGNvcnJlY3RseSBjaGVjayB3aGF0IHZlcnNpb24gb2YgZ3N0LXBsdWdpbnMtYmFzZSB3ZSdyZSBjb21waWxpbmcgYWdhaW5zdAorCSAgV2UgbmVlZCB0byBjaGVjayB0aGUgZ3N0LXBsdWdpbnMtYmFzZSB2ZXJzaW9uLCBub3QgdGhlIGNvcmUgdmVyc2lvbgorCSAgKGV2ZW4gaWYgYm90aCBzaG91bGQgYmUgdGhlIHNhbWUgaW4gYW55IHNhbmUgc2V0dXApLgorCisyMDEwLTA3LTI2IDE3OjQ1OjQyICswMjAwICBBcm5hdWQgVnJhYyA8cmF3b3VsIGF0IGdtYWlsLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogYWRkIHBvcnQtcmFuZ2UgcHJvcGVydHkgdG8gcnRzcHNyYworCSAgVG8gc3VwcG9ydCBzZXR1cHMgd2l0aCBmaXJld2FsbC9pcHNlYywgaXQgaXMgdXNlZnVsIGZvciBhbiBydHNwIGNsaWVudCB0byBiZQorCSAgYWJsZSB0byBzZXQgdGhlIHJhbmdlIG9mIHBvcnRzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHJ0cC9ydGNwIHJlY2VwdGlvbi4KKwkgIEFsbG93cyB0aGlzIGJ5IGFkZGluZyBhICJwb3J0LXJhbmdlIiBwcm9wZXJ0eSB0byB0aGUgcnRzcHNyYyBlbGVtZW50LgorCSAgRml4ZXMgIzYyNTE1MworCisyMDEwLTA3LTI2IDEzOjM4OjMxICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPGFtb3JhbGVzQGZsdW1vdGlvbi5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHNldCB0aGUgcGl4ZWwtYXNwZWN0LXJhdGlvIGZpZWxkIGFsc28gZm9yIHBhcj0xLzEKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MjUzMDIKKworMjAxMC0wNy0yNiAxNTozMToxNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IG1lbW9yeSBsZWFrIGluIHNlcnZlciByZXF1ZXN0IHJlcGx5CisJICBUaGUgUlRTUCBzZXJ2ZXIgcnRzcHNyYyBpcyBjb21tdW5pY2F0aW5nIHdpdGgsIHNlbmRzIGEgR0VUX1BBUkFNRVRFUiByZXF1ZXN0CisJICBwZXJpb2RpY2FsbHkgYXMgYSBwaW5nLiAgVGhlIGNvZGUgaW4gZ3N0X3J0c3BzcmNfaGFuZGxlX3JlcXVlc3QgZm9ybXMgYW4gT0sKKwkgIHJlc3BvbnNlIGFuZCBzZW5kcywgYnV0IGRvZXNuJ3QgY2FsbCBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0IHRvIGZyZWUgdGhlIG1lbW9yeQorCSAgYWZ0ZXIgc2VuZGluZyB0aGUgcmVzcG9uc2UuICBUaGlzIHJlc3VsdHMgaW4gYSBjb25zdGFudCBzbG93IG1lbW9yeSBsZWFrLgorCSAgRml4ZXMgIzYyNDc3MAorCisyMDEwLTA3LTI0IDIyOjM5OjU0ICswMTAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJKiBnc3QvZGVidWd1dGlscy9jcHVyZXBvcnQuYzoKKwkgIGNwdXJlcG9ydDogcmVtb3ZlIGJvZ3VzIGRvY3MKKworMjAxMC0wNy0yNCAyMjozNzoxMSArMDEwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogZ3N0L2RlYnVndXRpbHMvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVidWd1dGlscy9jcHVyZXBvcnQuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2NwdXJlcG9ydC5oOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0ZGVidWcuYzoKKwkgIGRlYnVndXRpbHM6IG5ldyBlbGVtZW50IGNwdXJlcG9ydAorCSAgY3B1cmVwb3J0IHBvc3RzIGJ1cyBtZXNzYWdlcyBhZnRlciBldmVyeSBidWZmZXIgcmVjZWl2ZWQgb2YgY3B1IHVzZWQsIHN5c3RlbQorCSAgY2xvY2sgdGltZSwgYnVmZmVyIHRpbWUKKworMjAxMC0wNy0yNCAxMDoyOTowMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL2VxdWFsaXplci9kZW1vLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1vc3NzcmMuYzoKKwkgIGV4YW1wbGVzOiBEZXN0cm95IHRoZSBjYWlybyBjb250ZXh0IGFmdGVyIHVzYWdlCisKKzIwMTAtMDctMjQgMTA6MjE6MDUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvZ2RrX3BpeGJ1Zi9NYWtlZmlsZS5hbToKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5jOgorCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuYzoKKwkgIFJldmVydCAiZ2RrcGl4YnVmOiBBZGQgYSBnZGtwaXhidWYzIHBsdWdpbiB0aGF0IHVzZXMgZ2RrcGl4YnVmMyIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgYjY3ODgxNTMxNjFiNGUwN2ZiZjNkNDJhMmQ4OTIxZWEwNDkzMDVkMC4KKwkgIFRoZXJlJ3Mgbm8gZ2RrLXBpeGJ1ZjMgYW55bW9yZS4gZ2RrLXBpeGJ1ZiB3YXMgc2VwYXJhdGVkIGZyb20gR1RLKworCSAgYW5kIHdpbGwgc3RheSBhdCB2ZXJzaW9uIDIuMCBmb3IgR1RLKyAzLjAuCisKKzIwMTAtMDctMjQgMTA6MTk6MzcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1hdWRpb3Rlc3QuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tb3Nzc3JjLmM6CisJICBleGFtcGxlczogVXNlIGNhaXJvIGluc3RlYWQgb2YgdG8tYmUtZGVwcmVjYXRlZCBHREsgQVBJCisJICBGaXhlcyBidWcgIzYyNTAwMi4KKworMjAxMC0wNy0yMiAxNjoyNDo0MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGZsYWNkZWM6IGZpeCBldmVudCBsZWFrCisKKzIwMTAtMDctMjIgMTI6MDU6MjYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgbWF0cm9za2FkZW11eDogcHVsbCBtb2RlIG5vbi1jdWUgc2Vla2luZworCSAgVGhhdCBpcywgaW4gZmlsZXMgdGhhdCBoYXZlIG5vIGluZGV4IChDdWUpLCBwZXJmb3JtIHNlZWsgYnkgc2Nhbm5pbmcgZm9yCisJICBuZWFyZXN0IGNsdXN0ZXIgd2l0aCB0aW1lY29kZSBiZWZvcmUgcmVxdWVzdGVkIHBvc2l0aW9uLiAgU2Nhbm5pbmcgaXMgZG9uZQorCSAgYXMgYSBjb21iaW5hdGlvbiBvZiBpbnRlcnBvbGF0aW9uIGFuZCBzZXF1ZW50aWFsIHNjYW4uCisJICBGaXhlcyAjNjE3MzY4LgorCisyMDEwLTA3LTE2IDEyOjQ2OjUwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHN0cmVhbWFibGUgZmlsZXMgbmVlZCBubyBfZmluaXNoCisJICBGaXhlcyAjNjI0NDU1LgorCisyMDEwLTA3LTIyIDExOjQ2OjM1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHB1c2ggbW9kZTsgaGFuZGxlIDAtc2l6ZSBkYXRhIGNodW5rcworCSAgRml4ZXMgIzYxODUzNS4KKworMjAxMC0wNy0yMSAwODoxMToyMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIHZpZGVvbWl4ZXI6IE9ubHkgcmVzZXQgUW9TIGluZm9ybWF0aW9uIGFuZCBzZW5kIGEgTkVXU0VHTUVOVCBldmVudCBkb3duc3RyZWFtIGZvciBORVdTRUdNRU5UIGV2ZW50cyBvbiB0aGUgbWFzdGVyIHBhZAorCisyMDEwLTA3LTE0IDIwOjMxOjQ0IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2RlYnVndXRpbHMvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVidWd1dGlscy9nc3RjYXBzZGVidWcuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNkZWJ1Zy5oOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0ZGVidWcuYzoKKwkgIGNhcHNkZWJ1ZzogQWRkIG5ldyBlbGVtZW50CisKKzIwMTAtMDctMjAgMTY6MTE6MjUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogZGVtb3RlIFdBUk5JTkcgbWVzc2FnZSB0byBMT0cgbGV2ZWwKKwkgIEl0J3Mgbm90IGEgd2FybmluZy4KKworMjAxMC0wNy0xOSAxNDo0NzozMiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IEZpeCByZWdyZXNzaW9uIG9uIG1hcmtlcnMgcGFyc2luZworCSAgRml4ZXMgYSByZWdyZXNzaW9uIGludHJvZHVjZWQgd2hlbiBmaXhpbmcgYnVnICM1ODMwNDcgaW4KKwkgIGNvbW1pdCBhMzkxYmY1MmNjM2M1ODBjN2EwYTIzMTZjYTUyZWI2NmRhM2I4NWMxCisJICBTa2lwIHRoZSBkYXRhIHdoZW4gbGlianBlZyBhc2tzIGl0IHRvIGJlIHNraXBwZWQgb24KKwkgIG9uZSBvZiBpdHMgY2FsbGJhY2tzLgorCisyMDEwLTA3LTE2IDE4OjA0OjQ0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBhZGQgbWlzc2luZyBhcmd1bWVudCBpbiBkZWJ1ZyBtZXNzYWdlCisKKzIwMTAtMDctMTYgMTc6NTM6NTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VtaXhlcmN0cmwuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2VzaW5rOiBPbmx5IHVzZSBnc3RfYXVkaW9fY2xvY2tfbmV3KCkgd2hlbiBjb21waWxpbmcgYWdhaW5zdCBuZXdlciBiYXNlCisKKzIwMTAtMDctMDkgMTc6MzM6NTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkgIGR2MTM5NHNyYzogUG9zdCBjbG9jay1wcm92aWRlIGFuZCBjbG9jay1sb3N0IG1lc3NhZ2VzIHdoZW4gZ29pbmcgZnJvbS90byBQTEFZSU5HCisJICBJbiBQQVVTRUQgYW5kIGJlbG93IHRoZSBjbG9jayBpcyBub3Qgd29ya2luZy4KKworMjAxMC0wNy0wNCAxNjo1Nzo1NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9nY29uZi9nc3Rzd2l0Y2hzaW5rLmM6CisJKiBleHQvZ2NvbmYvZ3N0c3dpdGNoc2luay5oOgorCSogZXh0L2djb25mL2dzdHN3aXRjaHNyYy5jOgorCSogZXh0L2djb25mL2dzdHN3aXRjaHNyYy5oOgorCSAgZ2NvbmY6IEZpeCByZWYgaGFuZGxpbmcgb2YgbmV3IGNoaWxkIGVsZW1lbnRzIGFuZCBtaW5vciBjbGVhbnVwCisKKzIwMTAtMDctMDQgMDk6NDU6NTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NyYy5jOgorCSAgZ2NvbmZ2aWRlb3NyYzogVXNlIGNvcnJlY3QgR0NvbmYga2V5CisKKzIwMTAtMDctMDMgMTQ6MTY6NDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NyYy5jOgorCSogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuaDoKKwkgIGdjb25mOiBQb3J0IGdjb25mYXVkaW9zcmMgdG8gR3N0U3dpdGNoU3JjCisKKzIwMTAtMDctMDMgMTQ6MTI6MTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NyYy5jOgorCSogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zcmMuaDoKKwkgIGdjb25mOiBQb3J0IGdjb25mdmlkZW9zcmMgdG8gR3N0U3dpdGNoU3JjCisKKzIwMTAtMDctMDMgMTQ6MTE6NTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZ2NvbmYvTWFrZWZpbGUuYW06CisJKiBleHQvZ2NvbmYvZ3N0c3dpdGNoc3JjLmM6CisJKiBleHQvZ2NvbmYvZ3N0c3dpdGNoc3JjLmg6CisJICBnY29uZjogQWRkIEdzdFN3aXRjaFNyYyBiYXNlIGNsYXNzCisKKzIwMTAtMDctMDMgMTM6NTY6MzMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZ2NvbmYvZ3N0c3dpdGNoc2luay5jOgorCSAgZ2NvbmY6IENyZWF0ZSB0aGUgZ2hvc3RwYWQgb2YgdGhlIHN3aXRjaHNpbmsgZnJvbSB0aGUgdGVtcGxhdGUKKworMjAxMC0wNy0wNyAxMDoxMDo1MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogUG9zdCBjbG9jay1wcm92aWRlL2Nsb2NrLWxvc3Qgd2hlbiBnb2luZyB0by9mcm9tIFBBVVNFRAorCSAgQWxzbyB1c2UgZ3N0X2F1ZGlvX2Nsb2NrX25ld19mdWxsKCkgdG8gcHJldmVudCBjcmFzaGVzIHdoZW4gdGhlCisJICBjbG9jayBpcyB1c2VkIGFmdGVyIHRoZSBlbGVtZW50IHdhcyBkZXN0cm95ZWQuCisKKzIwMTAtMDctMTUgMTE6NDk6MDMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IHJlbW92ZSBib2d1cyBVTkxPQ0sKKworMjAxMC0wNy0xMyAxMjozNDo0NCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFsc28gY2FsY3VsYXRlIFBBUiB1c2luZyB0cmFjayB3aWR0aCBhbmQgaGVpZ2h0IGZvciBRVCBmaWxlcworCSAgKC4uLiBhcyBvcHBvc2VkIHRvIG9ubHkgZm9yIElTTyBzdHlsZSBmaWxlcykuCisJICBGaXhlcyAjNjI0MTczLgorCisyMDEwLTA3LTEyIDE3OjI5OjEyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBoYW5kbGUgYm9ndXMgZmlsZXMgc3RvcmluZyBBRFRTIEFBQyBkYXRhCisKKzIwMTAtMDctMDkgMTY6NTc6MzMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGRvIG5vdCBlcnJvciBvdXQgb24gYSBibG9jayB3aXRoIHVua25vd24gdHJhY2tudW1iZXIKKworMjAxMC0wNy0wOCAxODo1NzoyMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGRvIG5vdCBhbGlnbiByZXZlcnNlIHBsYXliYWNrIHJlZmVyZW5jZSBzdHJlYW0gdHdpY2UKKwkgIFRpbWVzdGFtcCByb3VuZGluZyBpc3N1ZXMgY291bGQgbGVhZCB0byBnb2luZyBiYWNrd2FyZHMgMiBrZXlmcmFtZSBwZXJpb2RzCisJICAocmF0aGVyIHRoYW4gb25seSAxKS4gIFdoaWxlIHRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IGEgcHJvYmxlbSwgaXQgbWlnaHQKKwkgIHBvdGVudGlhbGx5IHBsYWNlIGFkZGl0aW9uYWwgKGJ1ZmZlcmluZykgbG9hZCBvbiBkb3duc3RyZWFtIGFuZCBjb3VsZCBiZQorCSAgYXZvaWRlZCAoYmVjYXVzZSBXZSBDYW4pLgorCSAgRml4ZXMgIzYyMzYyOS4KKworMjAxMC0wNy0wOCAxNjowNzoxNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGNvbnZlcnQgc29tZSBtb3JlIG1vdiBmb3JtYXQgdGltZXN0YW1wIHRvIGdzdCB0aW1lCisKKzIwMTAtMDctMDcgMTQ6MTY6NTkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogYWRkaXRpb25hbCB2ZXJpZmljYXRpb24gaGV1cmlzdGljcyBmb3IgVkJSIGF1ZGlvIHN0cmVhbQorCSAgQ2hlY2sgZm9yIGFuZCBvdmVycmlkZSBzb21lIGhlYWRlciBmaWVsZChzKSBmb3IgcmVhc29uYWJsZSB2YWx1ZXMsIGFjY29yZGluZworCSAgdG8gbGF0ZXIgZXhwZWN0ZWQgdXNlIGluIGNhbGN1bGF0aW9ucy4KKworMjAxMC0wNy0xNCAxNToyMToyMSArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZEBnbWFpbC5jb20+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkgIHZpZGVvYmFsYW5jZTogRml4IHdyb25nIGxvY2sgb3JkZXIgdGhhdCBjb3VsZCBsZWFkIHRvIGEgZGVhZGxvY2suIEZpeGVzICM2MjQzMzEuCisKKzIwMTAtMDctMTYgMTE6MzE6MDggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAwLjEwLjI0ID09PQorCisyMDEwLTA3LTE1IDAxOjQ5OjA0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMC4xMC4yNAorCisyMDEwLTA3LTE1IDAxOjM1OjA2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vY3MucG86CisJKiBwby9sdi5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTAtMDctMDcgMDA6NDI6NDYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIDAuMTAuMjMuNCBwcmUtcmVsZWFzZQorCisyMDEwLTA3LTA3IDAwOjMxOjE3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vTElOR1VBUzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vaWQucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vdHIucG86CisJKiBwby96aF9DTi5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTAtMDYtMjMgMTE6NDc6NDMgKzAyMDAgIE1pY2hhZWwgR3J6ZXNjaGlrIDxtLmdyemVzY2hpa0BwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDJzaW5rOiBkZXN0cm95IGJ1ZmZlciBwb29sIHdoZW4gY2hhbmdpbmcgc3RhdGUgdG8gTlVMTAorCSAgSW4gdGhlIGNhc2Ugd2UgY2hhbmdlIHRoZSBTdGF0ZSBmcm9tIFJFQURZX1RPX05VTEwgdGhlIGJ1ZmZlcnMgaW4gdGhlIHBvb2wKKwkgIHN0aWxsIGhvbGQgYW4gb3BlbiBkdXAgZmlsZSBkZXNjcmlwdG9yIHRvIHRoZSBkZXZpY2UsIHRoZXJlZm9yZSB0aGUgZGV2aWNlCisJICByZWxlYXNlIGZ1bmN0aW9uIHdpbGwgbm90IGJlIGNhbGxlZCBhbmQgdGhlIGRldmljZSB3aWxsIHByb2JhYmx5IGFuc3dlciB3aXRoCisJICAtRUJVU1kgd2hlbiB3ZSByZW9wZW4gaXQgaW4gdGhlIG5leHQgTlVMTF9UT19SRUFEWSB0cmFuc2l0aW9uLgorCSAgU2lnbmVkLW9mZi1ieTogTWljaGFlbCBHcnplc2NoaWsgPG0uZ3J6ZXNjaGlrQHBlbmd1dHJvbml4LmRlPgorCSAgU2VlIGJ1ZyAjNjIyNTAwIGFuZCAjNjEyMjQ0LgorCisyMDEwLTA3LTA2IDEzOjIxOjE5ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IG9yZGVyIG9mIGJpdHJhdGVzIGluICdidHJ0JyBhdG9tCisJICBUaGVyZSBzZWVtcyB0byBiZSBhIGJ1ZyBpbiBsaWJtcDR2MiB0aGF0IGdlbmVyYXRlcyBhIE1QRUc0Qml0UmF0ZUJveCBhcworCSAgKGJ1ZmZlclNpemVEQiwgYXZnQml0cmF0ZSwgbWF4Qml0cmF0ZSkgaW5zdGVhZCBvZiAoYnVmZmVyU2l6ZURCLAorCSAgbWF4Qml0cmF0ZSwgYXZnQml0cmF0ZSksIGFjY29yZGluZyB0byB0aGUgc3BlYy4gSSB1c2VkIHRoZSBtcDRmaWxlCisJICBvdXRwdXQgd2hpbGUgd3JpdGluZyB0aGlzIGNvZGUsIHNvIHRoZSBvcmRlciBpcyB3cm9uZy4gVGhpcyBwYXRjaGVzCisJICBmaXhlcyB0aGF0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYyMzY1NAorCisyMDEwLTA3LTA1IDEyOjA1OjU3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogZml4IHNraXBwaW5nIGV4dHJhIDB4ZmYgbWFya2VycworCSAgRml4ZXMgIzYyMzU4NS4KKworMjAxMC0wNi0yOSAyMzoxODoyMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkgIGpwZWdkZWM6IGZpeCBtZW1vcnkgbGVhaworCSAgRG9uJ3QgbGVhayByZXN1bHQgb2YgZ3N0X2FkYXB0ZXJfdGFrZSgpLiBUaGVyZSBhcmUgbW9zdCBsaWtlbHkKKwkgIHNtYXJ0ZXIgdGhpbmdzIHdlIGNhbiBkbywgYnV0IGxldCdzIGtlZXAgdGhpbmdzIHNpbXBsZSBmb3IgdGhlCisJICByZWxlYXNlLgorCSAgRml4ZXMgIzYyMzE3Mi4KKworMjAxMC0wNy0wMiAxMjozMTozMSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogc3RyaXAgb3V0IGJvZ3VzIHRhZ3MgZnJvbSBYTVAgYXRvbQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYyMzM2NgorCisyMDEwLTA3LTAyIDE0OjI1OjIyICswMjAwICBBbmRyemVqIEsuIEhhY3pld3NraSA8YWhhY3pld3NraUBnbWFpbC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IFdyaXRlIGR1cmF0aW9uIGF0IHRoZSBjb3JyZWN0IHBvc2l0aW9uCisKKzIwMTAtMDYtMzAgMTE6MTI6MDggKzAyMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzoKKwkgIHJ0cHB0ZGVtdXg6IGZpeCBtZW1sZWFrIG9uIGN1c3RvbSBkb3duc3RyZWFtIGV2ZW50cworCSAgYnkgbm90IHNlbmRpbmcgY3VzdG9tIGRvd25zdHJlYW0gZXZlbnQgdHdpY2UgYW5kIGZpeCBtZW1sZWFrIHdoZW4KKwkgIG5vdCBoYW5kbGluZyB0aGUgZXZlbnQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MjMxOTYKKworMjAxMC0wNi0yOSAyMDoxODo1MSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjIzLjMgcHJlLXJlbGVhc2UKKworMjAxMC0wNi0yOSAyMDoxNDo1MyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IGZpeCB1bnBvcnRhYmxlIHByaW50ZiBmb3JtYXQgc3BlY2lmaWVycyBpbiBjb21tZW50ZWQgb3V0IGNvZGUKKwkgIFRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlcyB3aGVuIGdyZXBwaW5nIGZvciB1bnBvcnRhYmxlIHNwZWNpZmllcnMuCisKKzIwMTAtMDYtMjkgMTk6MTI6MzYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IGZpeCAtLWRpc2FibGUtZXh0ZXJuYWwKKworMjAxMC0wNi0yOCAxNTo0NDowNiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGF1dG9nZW4uc2g6CisJKiBjb25maWd1cmUuYWM6CisJICBCdW1wIGF1dG9tYWtlIHJlcXVpcmVtZW50IHRvIDEuMTAgYW5kIGF1dG9jb25mIHRvIDIuNjAKKwkgIEZvciBtYWludGFpbmFiaWxpdHkgcmVhc29ucyBhbmQgJChidWlsZGRpcikuCisJICBTZWUgIzYyMjk0NC4KKworMjAxMC0wNi0yOCAwOTowNzo1OCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9nb29tL3BsdWdpbl9pbmZvLmM6CisJICBnb29tOiBkb24ndCBhbGxvY2F0ZSAyNjBrQiBzdHJ1Y3Qgb24gdGhlIHN0YWNrCisJICBQbHVnaW5JbmZvIGlzIHF1aXRlIGEgc2l6ZWFibGUgc3RydWN0LCBsZXQncyBub3QgYWxsb2NhdGUgaXQgb24gdGhlCisJICBzdGFjaywgZXNwZWNpYWxseSBub3QgaWYgd2UncmUgY29weWluZyBpdCBvdmVyIGludG8gYW5vdGhlciBkeW5hbWljYWxseQorCSAgYWxsb2NhdGVkIGNvcHkgYW55d2F5LgorCSAgRml4ZXMgIzU3MDc2MS4KKworMjAxMC0wNi0yNyAxMDozMToxNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogUmVxdWlyZSBHVEsrID49IDIuMTQgZm9yIHRoZSBleGFtcGxlcworCisyMDEwLTA2LTI2IDIwOjEyOjI1ICswMjAwICBHdWlkbyBHw7xudGhlciA8YWd4QHNpZ3hjcHUub3JnPgorCisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1hdWRpb3Rlc3QuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tb3Nzc3JjLmM6CisJICBleGFtcGxlczogTWFrZSBkZW1vcyAtRFNFQUwgc2FmZSB0byBmaXggYnVpbGQgd2l0aCBHVEsrIDMuMAorCisyMDEwLTA2LTI2IDIxOjM5OjM0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvTWFrZWZpbGUuYW06CisJICBqcGVnOiBFeHBsaWNpdGVseSBsaW5rIHdpdGggbGliZ3N0YmFzZQorCisyMDEwLTA2LTI2IDE4OjQyOjI5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgMC4xMC4yMy4yIHByZS1yZWxlYXNlCisKKzIwMTAtMDYtMjYgMTg6NDE6NDkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLWRpc3QuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUtZGlzdC5oOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLWRpc3QuYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy1kaXN0Lmg6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0LmM6CisJICBnc3Q6IHVwZGF0ZSBvcmMgZmlsZXMKKworMjAxMC0wNi0yNiAxODo0MTozOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTAtMDYtMjUgMTk6NDA6MDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogRml4IGxlYWtpbmcgb2YgdGhlIHN0cmVhbWhlYWRlciBidWZmZXJzCisJICBnc3RfdmFsdWVfc2V0X2J1ZmZlcigpIGluY3JlYXNlcyB0aGUgcmVmY291bnQgYW5kIGRvZXNuJ3QKKwkgIHRha2Ugb3duZXJzaGlwIG9mIHRoZSBidWZmZXIuCisKKzIwMTAtMDYtMjQgMTY6MzI6MjMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkgIG1hdHJvc2thLCB2aWRlb2JveCwgdmlkZW9maWx0ZXI6IGZpeCBjb21waWxlciB3YXJuaW5ncyB3aGVuIGRlYnVnZ2luZyBpcyBkaXNhYmxlZCBpbiBnc3RyZWFtZXIKKwkgIEZpeGVzIHVudXNlZCB2YXJpYWJsZSB3YXJuaW5ncyB3aGVuIEdTdHJlYW1lcidzIGRlYnVnZ2luZyBzeXN0ZW0gaGFzIGJlZW4gZGlzYWJsZWQuCisKKzIwMTAtMDYtMjQgMTU6MTc6MTEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiBhZGQgcGx1Z2luIGxvYWRpbmcgd2hpdGVsaXN0IHRvIHRlc3QgZW52aXJvbm1lbnQKKwkgIE9ubHkgd2FudCB0byBsb2FkIGNvcmUvYmFzZS9nb29kIHBsdWdpbnMgaGVyZS4KKwkgIEZpeGVzICM2MTk3MTcuCisKKzIwMTAtMDYtMjQgMTU6MDk6MTYgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDczZmY5M2EgdG8gYTUxOTU3MQorCisyMDEwLTA2LTI0IDEzOjAyOjA0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJICBnZGtwaXhidWZkZWM6IGJ1bXAgcmFuayB0byBTRUNPTkRBUlkKKwkgIEJ1bXAgZ2RrcGl4YnVmZGVjJ3MgcmFuayB0byBTRUNPTkRBUlkgdG8gZ2l2ZSBpdCBhbiBlZGdlIG92ZXIgbWlzYy4KKwkgIGltYWdlIGRlY29kZXJzIGluIGdzdC1mZm1wZWcgdGhhdCBhbHNvIGhhdmUgYSBNQVJHSU5BTCByYW5rLgorCSAgRml4ZXMgIzYyMDE2Mi4KKworMjAxMC0wNi0yMyAxMjoxNToxMyArMDIwMCAgTWljaGFlbCBHcnplc2NoaWsgPG0uZ3J6ZXNjaGlrQHBlbmd1dHJvbml4LmRlPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICByZXNldCB0aGUgaGF2ZV9pbmRleCBmbGFnIGF0IHRyYW5zaXRpb24gUEFVU0VEX1RPX1JFQURZCisJICBJZiB3ZSByZXN0YXJ0IHRoZSBTdHJlYW0gaW4gdGhlIGNhc2Ugb2YgZG9pbmcgYSB0cmFuc2l0aW9uIGZyb20KKwkgIFBBVVNFRF9UT19SRUFEWSBhbmQgYmFjayB3aXRoIFJFQURZX1RPX1BBVVNFRCBhc28uIHRoZSBkdXJhdGlvbiBvZiB0aGUgdmlkZW8KKwkgIHdpbGwgZ2V0IGNhbGN1bGF0ZWQgZXZlbiBpZiB3ZSBoYXZlIGEgYXZpIGhlYWRlciB3aXRoIHRoYXQgaW5mb3JtYXRpb24uCisJICBTaWduZWQtb2ZmLWJ5OiBNaWNoYWVsIEdyemVzY2hpayA8bS5ncnplc2NoaWtAcGVuZ3V0cm9uaXguZGU+CisKKzIwMTAtMDYtMjMgMjA6Mjk6MTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBGaXggbmVnb3RpYXRpb24gZm9yIEk0MjAvWVYxMgorCSAgV2UgZG9uJ3Qgc3VwcG9ydCBjb252ZXJzaW9uIGludG8gKmFsbCogWVVWCisJICBmb3JtYXRzIGZvciB0aGVtLCBvbmx5IGludG8gSTQyMC9ZVjEyL0FZVVYuCisJICBGaXhlcyBidWcgIzYyMjUwMS4KKworMjAxMC0wNi0yMiAxNToyMjo0NCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IHByb3BlciBjbG9zaW5nIHNlZ21lbnQgY29uc3RydWN0aW9uCisJICBGaXhlcyAjNjE4OTgyLgorCisyMDEwLTA2LTIyIDE1OjQ2OjUxICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDI6IHByZWNhbGN1bGF0ZSBkdXJhdGlvbgorCSAgSGF2ZSBmcmFtZSBkdXJhdGlvbiBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0IGFuZCBjYWxjdWxhdGUgaXQgYWZ0ZXIgY2hhbmdpbmcgdGhlIGNhcHMuCisKKzIwMTAtMDYtMjEgMTI6MTc6MzkgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDJzaW5rOiB1c2UgZ2xpYiBkZWZpbmVzIGluIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBmb3IgcmVhZGFiaWxpdHkKKworMjAxMC0wNi0yMSAxMjoxNToxNCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogdXNlIEdfUEFSQU1fU1RBVElDX1NUUklOR1MgdG8gc2F2ZSBhIGZldyBieXRlcyBhbmQgc3RyZHVwcworCisyMDEwLTA2LTE4IDIwOjAyOjQ5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaXggbG9ja2luZyBhZnRlciBtb3ZpbmcgdGhpbmdzIGFyb3VuZAorCisyMDEwLTA2LTE4IDE0OjEzOjU4IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3RhZ2xpYi9nc3RhcGV2Mm11eC5jYzoKKwkgIHRhZ2xpYjogVXNlIG5ld2x5IGFkZGVkIGdzdF90YWdfbGlzdF9wZWVrX3N0cmluZ19pbmRleAorCSAgUmVwbGFjZSBjYWxscyB0byBnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZ19pbmRleCB3aXRoCisJICBnc3RfdGFnX2xpc3RfcGVla19zdHJpbmdfaW5kZXggdG8gYXZvaWQgYSBzdHJpbmcgY29weQorCisyMDEwLTA2LTE4IDE2OjU2OjE5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBtYWtlIHNvbWUgZXJyb3JzIGFzIHdhcm5pbmdzCisJICBBdm9pZCBzcGFtbWluZyB0aGUgdGVzdHN1aXRlIHdpdGggdGhlc2UgZXJyb3IgZGVidWcgbGluZXMuCisKKzIwMTAtMDYtMTggMTY6NDk6MDggKzAyMDAgIEtlaXRoIE5pY2hvbHNvbiA8a2VpdGgubmljaG9sc29uIGF0IHVsdHJhLWNjcy5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IGZpeCBtdWx0aWNhc3Qgc3VwcG9ydCBvbiB3aW5kb3dzIGJ1aWxkcworCSAgT24gd2luZG93cyBidWlsZHMsIHNldHMgc291cmNlIGFkZHJlc3MgZm9yIGJpbmQgdG8gSU5BRERSX0FOWSwgd2hpbGUKKwkgIG1haW50YWluaW5nIHRoZSBvcmlnaW5hbCBtdWx0aWNhc3QgZ3JvdXAgYWRkcmVzcyBmb3Igc3Vic2VxdWVudCBqb2luLgorCSAgRml4ZXMgIzU5NTk3OAorCisyMDEwLTA2LTE4IDE2OjE2OjI4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmM6CisJICB1ZHA6IG1ha2UgdXJsIHBhcnNpbmcgY29tcGF0aWJsZSB3aXRoIFZMQyBzeW50YXgKKwkgIFNraXAgZXZlcnl0aGluZyBiZWZvcmUgdGhlIEAgc2lnbiBpbiB0aGUgdXJsIGxvY2F0aW9uLiBWTEMgdXNlcyB0aGF0IGFzIHRoZQorCSAgcmVtb3RlIGFkZHJlc3MgdG8gY29ubmVjdCB0byAoYnV0IHdlIGlnbm9yZSBpdCBmb3Igbm93KS4gVGhpcyBtYWtlcyBvdXIgdWRwIHVybHMKKwkgIGNvbXBhdGlibGUgd2l0aCB0aGUgb25lcyB1c2VkIGJ5IFZMQy4KKwkgIEZpeGVzICM1OTc2OTUKKworMjAxMC0wNi0xOCAxNTowODoyMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogZmFjdG9yIG91dCB0aGUgY29ubmVjdGlvbnMKKwkgIEtlZXAgYSBnbG9iYWwgY29ubmVjdGlvbiBmb3IgYWdncmVnYXRlIGNvbnRyb2wgYnV0IGFsc28ga2VlcCBzdHJlYW0gY29ubmVjdGlvbnMKKwkgIGZvciBub24tYWdncmVnYXRlIGNvbnRyb2wuCisJICBBZGQgc29tZSBoZWxwZXIgbWV0aG9kcyB0byBjb25uZWN0L2Nsb3NlL2ZsdXNoIHRoZSBjb25uZWN0aW9ucy4KKworMjAxMC0wNi0xNyAxMzowNjo1NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYWRkIG5vbi1hZ2dyZWdhdGUgY29udHJvbAorCSAgQWRkIG5vbi1hZ2dyZWdhdGUgY29udHJvbC4KKwkgIFNlcGFyYXRlIHJldHJpZXZpbmcgdGhyIFNEUCBmcm9tIHBhcnNpbmcgYW5kIHNldHRpbmcgdXAgdGhlIHN0cmVhbWluZyBmcm9tIHRoZQorCSAgU0RQLgorCisyMDEwLTA2LTE3IDIyOjEwOjAzICswMTAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJKiBjb21tb246CisJICBjb21tb246IHVwZGF0ZSBjb21tb24gYmFjayB0byB3aGF0IGl0IHdhcworCisyMDEwLTA2LTE3IDE3OjI0OjIyICswMTAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJKiBjb21tb246CisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBhZGQgZG9jdW1lbnRhdGlvbiBmb3Igc3RyZWFtYWJsZSBwcm9wZXJ0eQorCisyMDEwLTA2LTE3IDE2OjQzOjQ0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkgIGRvY3M6IHVwZGF0ZSBpbnRyb3NwZWN0ZWQgcGx1Z2luIGRvY3MgZm9yIGdzdGRvYy1zY2FuZ29iaiBhbmQgb3RoZXIgY2hhbmdlcworCSAgVXBkYXRlIGNvbW1vbiBmb3IgbGF0ZXN0IGdzdGRvYy1zY2FuZ29iaiwgYW5kIGluc3BlY3QgeG1sIGZpbGVzIGZvcgorCSAgZXNjYXBpbmcgYW5kIHBhZCB0ZW1wbGF0ZSBvcmRlciBjaGFuZ2VzLgorCisyMDEwLTA2LTE3IDE2OjQxOjU2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svLmdpdGlnbm9yZToKKwkgIHRlc3RzOiBpZ25vcmUgc3ViLWRpcmVjdG9yeSB3aXRoIG9yYyB0ZXN0cworCisyMDEwLTA2LTE3IDEwOjQ0OjMzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBGaXggYW4gdW5pbml0aWFsaXplZCB2YXJpYWJsZSBjb21waWxlciB3YXJuaW5nCisKKzIwMTAtMDYtMTYgMjE6MDI6MTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6CisJICBlYm1sLXJlYWQ6IFplcm8tc2l6ZWQgaW50cy91aW50cy9mbG9hdHMgaGF2ZSBhIHZhbHVlIG9mIDAgYWNjb3JkaW5nIHRvIHRoZSBFQk1MIHNwZWMKKworMjAxMC0wNi0xNiAyMDowMjo1OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogRml4IHBvc3NpYmxlIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSBhbmQgYXNzZXJ0aW9uIHRoYXQgY291bGQgYmUgY2F1c2VkIGJ5IGludmFsaWQgZmlsZXMKKworMjAxMC0wNi0xNiAxOTo1MDozNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogQ2xlYW4gdXAvZml4IHNvbWUgbWlub3IgZXJyb3IgaGFuZGxpbmcgYnVncworCisyMDEwLTA2LTE2IDE5OjMwOjI1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHhpbWFnZXNyYzogRml4IE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSB3aGVuIGFsbG9jYXRpb24gb2YgdGhlIHhpbWFnZSBmYWlscworCisyMDEwLTA2LTE2IDE5OjI4OjA0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOgorCSAgZmxhY3RhZzogRml4IHBvc3NpYmxlIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZQorCisyMDEwLTA2LTE2IDE5OjI0OjU0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9paXJmaWx0ZXIuYzoKKwkgIGF1ZGlvaWlyZmlsdGVyOiBGaXggcG9zc2libGUgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlCisKKzIwMTAtMDYtMTYgMTk6MjA6MDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3R3YXJwLmM6CisJICB3YXJwdHY6IERvbid0IHVzZSBmbG9hdHMgYXMgbG9vcCBjb3VudGVycworCisyMDEwLTA2LTE2IDExOjIxOjM1IC0wNDAwICBIYXZvYyBQZW5uaW5ndG9uIDxocEBwb2JveC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJzcmM6IGRvIG5vdCB0cnkgdG8gY2hhbmdlIGRldmljZSBmb3JtYXQgaWYgaXQncyBhbHJlYWR5IGNvcnJlY3QKKwkgIFRoaXMgYWxsb3dzIHNldF9jYXBzIHRvIHN1Y2NlZWQgaWYgY2FwcyBjaGFuZ2UgaW4gYSB3YXkgdGhhdAorCSAgd291bGQgbm90IG1vZGlmeSB0aGUgZm9ybWF0IHdlJ3JlIGdldHRpbmcgZnJvbSB0aGUgaGFyZHdhcmUuCisJICBPdGhlcndpc2UgaWYgbm90IGluIE5VTEwgc3RhdGUsIHNldHRpbmcgY2FwcyB3b3VsZCBmYWlsCisJICB3aXRoIEVCVVNZLgorCSAgV2l0aCB0aGlzIGNoYW5nZSwgaW4gc29tZSBjYXNlcyBpdCdzIE9LIHRvIGdvIFBMQVlJTkctPlJFQURZLT5QTEFZSU5HCisJICByYXRoZXIgdGhhbiBQTEFZSU5HLT5OVUxMLT5QTEFZSU5HIHRvIGF2b2lkIGEgdGltZS1jb25zdW1pbmcgY2xvc2UKKwkgIGFuZCByZW9wZW4gb2YgdGhlIGRldmljZS4KKwkgIEZpeGVzICM2MjE3MjMKKworMjAxMC0wNi0xNiAxMTowOToxNyAtMDQwMCAgSGF2b2MgUGVubmluZ3RvbiA8aHBAcG9ib3guY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBpbiBuZWdvdGlhdGUsIGNoZWNrIGZvciBlcnJvciByZXR1cm4gZnJvbSBzZXRfY2FwcworCSAgRml4ZXMgIzYyMTcyMyAgKHBhcnRpYWxseSkKKwkgIHNldF9jYXBzIGNhbiBmYWlsIGlmIHRoZSB2aWRlbyBkZXZpY2UgaXMgcnVubmluZywgaW4gdGhhdCBjYXNlCisJICBzZXR0aW5nIGl0cyBmb3JtYXQgbGVhZHMgdG8gRUJVU1kuCisJICBJZiBzZXRfY2FwcyBmYWlscyB0aGVuIHdlIHdpbGwgbm90IGhhdmUgc2V0IHVwIHRoZSBidWZmZXIgcG9vbAorCSAgKGl0IHdpbGwgYmUgTlVMTCkgd2hpY2ggbGVhZHMgdG8gYSBjcmFzaCB3aGVuIHdlIHRyeSB0byBwdWxsCisJICBidWZmZXJzLiBJZiB3ZSBmYWlsIHRoZSBuZWdvdGlhdGUgb24gc2V0X2NhcHMgZmFpbHVyZSwgdGhlbiB3ZQorCSAgd29uJ3QgZ28gdG8gcGxheWluZyBzdGF0ZSBhbmQgd29uJ3QgY3Jhc2guCisJICBUaGlzIGlzIGEgc21hbGwgaW1wcm92ZW1lbnQuIE9mIGNvdXJzZSwgYSBuaWNlciBmaXggd291bGQKKwkgIGJlIHRvIG1ha2Ugc2V0X2NhcHMgd29yayBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgZm9ybWF0IGlzCisJICB1bmNoYW5nZWQuIElmIHRoZSBmb3JtYXQgaGFzIGNoYW5nZWQsIGZhaWxpbmcgaXMKKwkgIHByb2JhYmx5IGNvcnJlY3QgYmVjYXVzZSB3ZSBuZWVkIHRvIGNsb3NlIHRoZSBkZXZpY2UKKwkgIChnbyB0byBOVUxMIHN0YXRlKSBpbiBvcmRlciB0byBzZXQgY2Fwcy4KKworMjAxMC0wNi0xNiAxNTo0MDozNCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBpbXByb3ZlIGF1ZGlvIHZiciBkZXRlY3Rpb24KKwkgIFN1YnNlcXVlbnQgZW50cnkgdGltZSBjYWxjdWxhdGlvbnMgdXNlIGJsb2NrYWxpZ24gdmFsdWUgdG8gZGV0ZXJtaW5lCisJICBudW1iZXIgb2YgZnJhbWVzIHBlciBjaHVuaywgYW5kIGJsb2NrYWxpZ24gPT0gMSBpcyB0aGVuIG1vc3QgdW5saWtlbHkgdG8gcmVzdWx0CisJICBpbiByZWFzb25hYmxlIHZhbHVlcyAod2hpY2ggYWxzbyBhbGlnbnMgd2l0aCAic3BlYyIpLgorCisyMDEwLTA2LTE2IDE1OjUyOjU3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIHJ0cGgyNjRkZXBheTogdHdlYWsgREVMVEFfVU5JVCBsYWJlbGluZworCSAgQ29uc2lkZXIgU1BTLCBQUFMgYW5kIElEUiBhcyBrZXlmcmFtZSwgYWxsIG90aGVycyBhcyBERUxUQV9VTklULgorCSAgU2VlICM2MjAxNTQuCisKKzIwMTAtMDYtMTUgMjA6MDY6MTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6CisJICB3YXZwYWNrZGVjOiBJbml0aWFsaXplIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgYW5kIGRvbid0IHVucmVmIGl0IGlmIGl0J3MgTlVMTAorCisyMDEwLTA2LTE1IDIwOjA0OjM1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IEFzc2lnbiB2YXJpYWJsZXMgYmVmb3JlIHByaW50aW5nIHRoZW0KKworMjAxMC0wNi0xNSAyMDowMDoyOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IEluaXRpYWxpemUgdW5pbml0aWFsaXplZCB2YXJpYWJsZQorCisyMDEwLTA2LTE1IDE5OjQ3OjE2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogSW5pdGlhbGl6ZSB2YXJpYWJsZQorCisyMDEwLTA2LTE1IDE5OjQ1OjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogRml4IE5FV1NFR01FTlQgcGFyc2luZyBsb2dpYyBhbmQgZG9uJ3QgdXNlIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCisKKzIwMTAtMDYtMTUgMTc6MjA6MjAgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkgIG1hdHJvc2thOiBGaXggdW5pdGlhbGl6ZWQgdmFyaWFibGUKKworMjAxMC0wNi0xNSAxNjo0OTo0OSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDkzMzljY2MgdG8gMzU2MTdjMgorCisyMDEwLTA2LTE1IDE2OjU0OjA0ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA1YWRiMWNhIHRvIDkzMzljY2MKKworMjAxMC0wNi0xNSAxNjozNToxOCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNTdjODliNyB0byA1YWRiMWNhCisKKzIwMTAtMDYtMTUgMTQ6MDg6MjYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiAuZ2l0aWdub3JlOgorCSAgLmdpdGlnbm9yZTogaWdub3JlIGdlbmVyYXRlZCB0dnRpbWUuaCBmaWxlCisKKzIwMTAtMDYtMTUgMTU6MzY6MzMgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGM4MDQ5ODggdG8gNTdjODliNworCisyMDEwLTA1LTE3IDEzOjU0OjAzICswMjAwICBNYXJjLUFuZHLDqSBMdXJlYXUgPG1sdXJlYXVAZmx1bW90aW9uLmNvbT4KKworCSogZXh0L3JhdzEzOTQvZ3N0MTM5NGNsb2NrLmM6CisJKiBleHQvcmF3MTM5NC9nc3QxMzk0Y2xvY2suaDoKKwkgIHJhdzEzOTQ6IHJlbW92ZSB1c2VsZXNzIGxhc3RfdGltZQorCSAgSXQgc2VlbXMgdG8gbWUgdGhpcyBjb2RlIGlzIHVzZWxlc3M6IHJlbW92aW5nIGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxODg3MQorCisyMDEwLTA2LTE0IDE5OjIxOjIyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiByZXNwZWN0IGFnZ3JlZ2F0ZSBjb250cm9sIGF0dHJpYnV0ZXMKKwkgIHdoZW4gdGhlIFNEUCBzcGVjaWZpZXMgYW4gYWdncmVnYXRlIGNvbnRyb2wgdXJsLCB1c2UgdGhhdCBmb3IgcGxheWJhY2sKKwkgIGNvbnRyb2wuCisJICBGaXhlcyAjNjE5NTMxCisKKzIwMTAtMDYtMTQgMTU6MzY6MDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJICBnb29tOiBDYWxsIG9yY19pbml0KCkgYmVmb3JlIHRyeWluZyB0byBnZXQgdGFyZ2V0IGZsYWdzCisKKzIwMTAtMDYtMTQgMTU6MzU6MDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBDYWxsIG9yY19pbml0KCkgYmVmb3JlIHRyeWluZyB0byBnZXQgdGFyZ2V0IGZsYWdzCisKKzIwMTAtMDYtMTQgMTQ6MjY6MjIgKzAxMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6CisJICBtYXRyb3NrYW11eDogcmV2ZXJ0IGNoYW5nZSB0aGF0IHNldCBhIHJlc2VydmVkIGZsYWcgb24gdGhlIEJsb2NrLgorCSAgU28gbWF0cm9za2EncyBCbG9jayBzdHJ1Y3R1cmUgaGFzIG5vIGtleWZyYW1lIGZsYWcsIG9ubHkgdGhlIFNpbXBsZUJsb2NrIGhhcyBpdC4KKwkgIFRvIGRldGVjdCBrZXlmcmFtZXMgaW4gQmxvY2tzLCBpdCBpcyBqdXN0IHRoZSBCbG9ja0dyb3VwIGNvbnRhaW5lciB0aGF0IG5lZWRzCisJICB0byBoYXZlIGEgUmVmZXJlbmNlQmxvY2sgYXR0YWNoZWQgaWYgaXQgaXMgYSBkZWx0YSBmcmFtZSBpbiB2aWRlby4KKworMjAxMC0wNS0zMSAxMjo0NTowMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkgIGpwZWdkZWM6IHVzZSBsaWJqcGVnIHNjYXR0ZXItZ2F0aGVyIG9wZXJhdGlvbiB0byBhdm9pZCBkYXRhIGNvcHlpbmcKKwkgIEZpeGVzICM1ODMwNDcgKG1vcmUpLgorCisyMDEwLTA1LTI3IDE1OjQ1OjIzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAganBlZ2RlYzogb3B0aW1pemUgYnVmZmVyIGhhbmRsaW5nIHdoZW4gcGFyc2luZworCSAgVXNlIGFuIGFkYXB0ZXIgdG8gY29sbGVjdCBpbmNvbWluZyBkYXRhLCBhbmQgdXNlIGFkYXB0ZXIgQVBJIHRvIHNjYW4gYW5kIHBlZWsuCisJICBGaXhlcyAjNTgzMDQ3LgorCisyMDEwLTA2LTE0IDEzOjQ4OjI4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zczQvb3NzNC1taXhlci5jOgorCSAgb3NzNDogVXNlIGdfYXNjaWlfc3RyY2FzZWNtcCgpIGluc3RlYWQgb2YgdGhlIGRlcHJlY2F0ZWQgZ19zdHJjYXNlY21wKCkKKworMjAxMC0wNi0xNCAxMzoyNzozMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogVXNlIEdMSUJfRVhUUkFfQ0ZMQUdTCisKKzIwMTAtMDYtMTQgMTM6MDM6NTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gN2EwZmRmNSB0byBjODA0OTg4CisKKzIwMTAtMDYtMTQgMTE6NDY6MzIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgcnRwaDI2NGRlcGF5OiBhbHNvIGNvbnNpZGVyIEFVIGFuZCBTRUkgTkFMVXMgYXMgREVMVEFfVU5JVAorCSAgRml4ZXMgIzYyMDE1NC4KKworMjAxMC0wNi0xNCAxMTozMjo0MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA2ZGEzYmFiIHRvIDdhMGZkZjUKKworMjAxMC0wNi0xMiAyMToyNjoxNiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJICBidWlsZDogaW5jbHVkZSBzdGRpby5oIGZvciBzc2NhbmYKKworMjAxMC0wNi0xMiAxNDoxMjo1MCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgdGVzdHM6IEFkZCBjbGVhbiBydWxlIGZvciB0aGUgb3JjIHRlc3RzCisKKzIwMTAtMDYtMTIgMTQ6MTI6MDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiBBZGQgYXV0b2dlbmVyYXRlZCBvcmMgdGVzdHMKKworMjAxMC0wNi0xMiAwODoyNzo0MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA3MzNmY2E5IHRvIDZkYTNiYWIKKworMjAxMC0wNi0xMSAxNjoyMzoyOSAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IEZpeCBlbGVtZW50IGRlc2NyaXB0aW9uCisKKzIwMTAtMDYtMTEgMjE6MTM6NTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJICBydHBtcGFyb2J1c3RkZXBheTogZG9uJ3QgdHJ5IHRvIHVucmVmIE5VTEwgYnVmZmVycworCSAgRml4ZXMgZ2VuZXJpYy9zdGF0ZXMgdW5pdCB0ZXN0LgorCisyMDEwLTA2LTExIDIwOjUwOjIzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogdXNlIHR5cGVmaW5kIGZ1bmN0aW9ucyB0byBjaGVjayBpZiBQQ00gZGF0YSBjb250YWlucyBkdHMgc3RyZWFtCisJICBVc2UgbmV3IGR0cyBhdWRpbyB0eXBlZmluZGVyIGZyb20gLWJhc2UgdG8gY2hlY2sgaWYgdGhlIFBDTSBkYXRhCisJICBjb250YWlucyBhIGR0cyBzdHJlYW0uIFRoaXMgd2F5IHdlIHJlY29nbmlzZSBtb3JlIHZhcmlldGllcyBtb3JlCisJICByZWxpYWJseSBhbmQgYWxzbyBkZXRlY3QgdGhlIGR0cyBzdHJlYW0gaWYgdGhlcmUgaXNuJ3QgYSBmcmFtZQorCSAgc3luYyByaWdodCBhdCB0aGUgc3RhcnQgb2YgdGhlIGRhdGEuCisJICBGaXhlcyAjNDEzOTQyLgorCisyMDEwLTA2LTExIDIwOjQ3OjIyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogc2V0IGJ1ZmZlciBvZmZzZXRzIGJlZm9yZSB1c2luZyB0aGUgYnVmZmVyIGZvciB0aGUgZmlyc3QgdGltZQorCSAgZ3N0X3R5cGVfZmluZF9oZWxwZXJfZm9yX2J1ZmZlcigpIHdpbGwgbmVlZCB0aGUgY29ycmVjdCBvZmZzZXQKKwkgIHNldCBvbiB0aGUgYnVmZmVyIChpZS4gMCkgYW5kIG5vdCB0aGUgYnl0ZSBvZmZzZXQgd2Ugc3RhcnRlZAorCSAgcHVsbGluZyB0aGUgZGF0YSBmcm9tLgorCisyMDEwLTA2LTEwIDE2OjE0OjQzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5Lmg6CisJICBydHA6IGFkZCBtcGEtcm9idXN0IGRlcGF5bG9hZGVyCisJICBGaXhlcyAjNTg5OTk3LgorCisyMDEwLTA2LTExIDEwOjU3OjQxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogZml4IGF2aSBoZWFkZXIgYnl0ZXdyaXRpbmcKKwkgIC4uLiBieSB1c2luZyBwcm9wZXIgb2Zmc2V0cyBmb3IgdGFnIGxpc3Qgd3JpdGluZy4KKwkgIEFsc28gdXNlIF9yZXNldCByYXRoZXIgdGhhbiBfZnJlZSBhbmQgY29uc2lzdGVudGx5IHVzZSBieXRld3JpdGVyIHBvc2l0aW9uLgorCSAgU2VlICM2MTkyOTMuCisKKzIwMTAtMDYtMTAgMjI6NTg6NDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiAuZ2l0aWdub3JlOgorCSAgVXBkYXRlIC5naXRpZ25vcmUKKwkgIEFkZCB0aGUgZ2VuZXJhdGVkIG9yYyBzb3VyY2UgZmlsZXMKKworMjAxMC0wNi0xMCAyMjo1NToxNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6CisJICBtYXRyb3NrYW11eDogRml4IHVuaXQgdGVzdCBmb3IgY2hhbmdlZCBrZXktZnJhbWUgYmVoYXZpb3VyCisJICBBbGwgYXVkaW8gZnJhbWVzIGFyZSBtYXJrZWQgYXMga2V5ZnJhbWUgbm93IGluc3RlYWQgb2YgbWFya2luZworCSAgdGhlbSBhbGwgYXMgZGVsdGEgdW5pdC4uLgorCisyMDEwLTA2LTEwIDIyOjQ1OjEzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfbW14Lmg6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0LmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0Lmg6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy5vcmM6CisJICB2aWRlb21peGVyOiBQb3J0IG1vc3QgYmxlbmRpbmcgcmVsYXRlZCBmdW5jdGlvbnMgdG8gb3JjCisJICBPbmx5IHJlbWFpbmluZyBNTVggaW1wbGVtZW50YXRpb24gaXMgdGhlIEFSR0IvQkdSQS9BWVVWIGJsZW5kaW5nCisJICBmb3Igd2hpY2ggd2UgZmlyc3QgbmVlZCB0aGUgb3JjIGNvbXBvc2l0aW5nIG9wY29kZXMuCisKKzIwMTAtMDYtMTAgMjA6MTc6MDcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9tbXguaDoKKwkgIHZpZGVvbWl4ZXI6IFJlcGxhY2Ugc29tZSB0YWJzIGJ5IHNwYWNlcworCisyMDEwLTA2LTEwIDExOjA0OjM4ICswMTAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPGFtb3JhbGVzQGZsdW1vdGlvbi5jb20+CisKKwkqIGV4dC9yYXcxMzk0L2dzdDEzOTRjbG9jay5jOgorCSAgZHYxMzk0OiBGaXggdGhlIGludGVybmFsIGNsb2NrIGV2ZW4gbW9yZQorCSAgVGhlIGN5Y2xlQ291bnQgcmVnaXN0ZXIgaXMgMTMgYml0cyBsb25nIGFuZCB0aGUgY3ljbGVPZmZzZXQgb25lCisJICBpcyAxMiBiaXRzIGxvbmcuIFRvIHJlYWQgdGhlIGN5Y2xlQ291bnQgcmVnaXN0ZXIgd2UgbmVlZCB0byBzaGlmdAorCSAgMTIgYml0cyBhbmQgbm90IDEzLiBGaXhlcyAjNjE1NDYxCisKKzIwMTAtMDYtMDkgMTg6Mzc6MjkgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IHVzZSBtNCBtYWNybyB0byBjaGVjayBmb3IgT3JjCisKKzIwMTAtMDYtMDkgMjI6NDA6MjMgKzAyMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBzb21lIG5vbi1kZWx0YSBidWZmZXJzIHdlcmUgbm90IG1hcmtlZCBhcyBrZXlmcmFtZXMKKworMjAxMC0wNi0wOSAyMjowMDoxNiArMDIwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgbWF0cm9za2FtdXg6IGNoYW5nZSAyIHNlY29uZCBsaW1pdCBwZXIgY2x1c3RlcgorCSAgU3RhcnQgY2x1c3RlciBhdCBldmVyeSBrZXlmcmFtZSBvciB3aGVuIHdlIHdvdWxkIG92ZXJmbG93IHRoZSBwcmV2aW91cworCSAgY2x1c3RlcidzIHJlbGF0aXZlIHRpbWVzdGFtcCBmaWVsZC4gVGhpcyB3b3VsZCBhdm9pZCBhcyBtdWNoIGFzIHBvc3NpYmxlCisJICBzdGFydGluZyBjbHVzdGVycyBhdCBub24ta2V5ZnJhbWVzLgorCisyMDEwLTA2LTA5IDEyOjQwOjA5IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGZhZDE0NWIgdG8gNzMzZmNhOQorCisyMDEwLTA2LTA5IDEyOjM0OjAxIC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDQ3NjgzYzEgdG8gZmFkMTQ1YgorCisyMDEwLTA2LTA5IDIwOjUzOjA2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBEb24ndCByZXF1ZXN0IG1vcmUgc2hhcmVkIG1lbW9yeSB0aGFuIG5lZWRlZAorCisyMDEwLTA2LTA5IDIwOjQ1OjA0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2djb25mL2dzdHN3aXRjaHNpbmsuYzoKKwkgIHN3aXRjaHNpbms6IFNldCB0aGUgR1NUX0VMRU1FTlRfSVNfU0lOSyBmbGFnIG9uIHRoZSBzaW5rCisKKzIwMTAtMDYtMDkgMjA6NDM6NTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NpbmsuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc2luay5oOgorCSAgZ2NvbmZ2aWRlb3Npbms6IFVzZSBHc3RTd2l0Y2hTaW5rIGFzIGJhc2UgY2xhc3MKKworMjAxMC0wNi0wOSAyMDozMDozMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOgorCSAgZ2NvbmZhdWRpb3Npbms6IFVzZSBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTCisKKzIwMTAtMDYtMDkgMjA6Mjk6MDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NpbmsuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5oOgorCSAgZ2NvbmZhdWRpb3Npbms6IFJlbmFtZSBpbnN0YW5jZSB2YXJpYWJsZSB0byBiZSBtb3JlIGRlc2NyaXB0aXZlCisKKzIwMTAtMDYtMDkgMjA6MjI6MzAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJICBhdXRve2F1ZGlvLHZpZGVvfXNpbms6IERvbid0IGxvc2UgdGhlIEdTVF9FTEVNRU5UX0lTX1NJTksgZmxhZyBhZnRlciByZW1vdmluZyB0aGUgY2hpbGQKKworMjAxMC0wNi0wOSAyMDowNzowOSArMDIwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQGZsdWVuZG8uY29tPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBkaXJlY3Rzb3VuZHNpbms6IFBsdWcgc29tZSBtZW1sZWFrIGFuZCBzdXBwb3J0IDIyMDUwSHogbW9ubyBzb3VuZC4KKwkgIFNlZ21lbnQgc2l6ZSBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIHRoZSBzYW1wbGUgc2l6ZSBpbiBieXRlcy4KKworMjAxMC0wNi0wOSAxNjoyMjoyNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogRmx1c2ggc2htIGJ1ZmZlciBpbW1lZGlhdGVseSBpZiBpdCdzIGZ1bGwKKworMjAxMC0wNi0wOSAxNjoyMTo1NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogRml4IHdyaXRpbmcgb2YgYnVmZmVycyBsYXJnZXIgdGhhbiBzZWdzaXplCisJICBGaXhlcyBidWcgIzYyMDU0MC4KKworMjAxMC0wNi0wOSAxNTo0MjozNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogRml4IHBsYXliYWNrIGlmIFBBIGRvZXNuJ3QgZ2l2ZSB1cyBhIGxhcmdlIGVub3VnaCBzaGFyZWQgbWVtb3J5IGJ1ZmZlcgorCisyMDEwLTA2LTA5IDE1OjQyOjE5ICswMjAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJICBtYXRyb3NrYW11eDogY2hhbmdlIGluZGV4ZWQgcHJvcGVydHkgdG8gc3RyZWFtYWJsZQorCSAgVGhlIHByb3BlcnR5IHN0cmVhbWFibGUgaGFzIHJldmVyc2Ugc2VtYW50aWNzIHRvIGluZGV4ZWQuCisKKzIwMTAtMDYtMDkgMDk6MTM6MDkgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguaDoKKwkgIGZsdm11eDogUmVuYW1lIHVucmVsZWFzZWQgcHJvcGVydHkgJ2luZGV4ZWQnIHRvICdzdHJlYW1hYmxlJworCSAgUmVuYW1lICdpbmRleGVkJyB0byAnc3RyZWFtYWJsZScgZm9yIGEgYmV0dGVyIG5hbWUgd2hpbGUgaXQKKwkgIGhhc24ndCBiZWVuIHJlbGVhc2VkCisKKzIwMTAtMDYtMDggMTU6MjM6NTEgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBSRVFVSVJFTUVOVFM6CisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IHJlbW92ZSBsaWJvaWwgY2hlY2sKKworMjAxMC0wNi0wOCAxNDo0NDoxOSAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgbGV2ZWw6IHJlbW92ZSB1bnVzZWQgbGlib2lsIGluY2x1ZGUKKworMjAxMC0wNi0wNCAxODoyMjo0MiAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkgIHZpZGVvbWl4ZXI6IGxpYm9pbCB0byBvcmMgY29udmVyc2lvbgorCisyMDEwLTA2LTA0IDE4OjIxOjIxIC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3ZpZGVvYm94L01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMtZGlzdC5jOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLWRpc3QuaDoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy5vcmM6CisJICB2aWRlb2JveDogbGlib2lsIHRvIG9yYyBjb252ZXJzaW9uCisKKzIwMTAtMDYtMDQgMTg6MTY6MjUgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvZ29vbS9NYWtlZmlsZS5hbToKKwkqIGdzdC9nb29tL1JFQURNRToKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkqIGdzdC9nb29tL3BsdWdpbl9pbmZvLmM6CisJICBnb29tOiBsaWJvaWwgdG8gb3JjIGNvbnZlcnNpb24KKworMjAxMC0wNi0wOCAxNjowNDoyMyAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9kZWludGVybGFjZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUtZGlzdC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0Lmg6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLm9yYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2xpbmVhcmJsZW5kLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3ZmaXIuYzoKKwkgIGRlaW50ZXJsYWNlOiBvcmNpZnkgc29tZSBkZWludGVybGFjaW5nIG1ldGhvZHMKKworMjAxMC0wNi0wOCAxNjowMzozNiAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9kZWludGVybGFjZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmg6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHkuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyYmxlbmQuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvc2NhbGVyYm9iLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdmZpci5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZWJmZi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZXRmZi5jOgorCSAgZGVpbnRlcmxhY2U6IGNvbnZlcnQgZnJvbSBsaWJvaWwgdG8gb3JjCisKKzIwMTAtMDYtMDggMTU6MjM6MjggLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBSRVFVSVJFTUVOVFM6CisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IEFkZCBvcmMgY2hlY2sKKworMjAxMC0wNi0wOCAxNDowOTowMCArMDIwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4Lmg6CisJICBmbHZtdXg6IEFkZCBpbmRleGVkIHByb3BlcnR5IHRvIHJlcGxhY2UgZGlzYWJsZWQgaXMtbGl2ZS4KKwkgIEFkZCBpbmRleGVkIHByb3BlcnR5IHRvIGJlIHRoZSBuZWdhdGlvbiBvZiB3aGF0IHRoZSBkaXNhYmxlZCBpcy1saXZlIHByb3BlcnR5CisJICB3YXMuIEZpeGVzIGJ1ZyAjNjEzMDY2LgorCisyMDEwLTA2LTA4IDA5OjIyOjMwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgcmF3MTM5NDogUmVxdWlyZSBsaWJyYXcxMzk0ID49IDIuMC4wIGZvciByYXcxMzk0X3JlYWRfY3ljbGVfdGltZXIKKwkgIEZpeGVzIGJ1ZyAjNjIwOTI5LgorCisyMDEwLTA2LTA4IDA3OjM1OjAwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOgorCSAgY21tbGVuYzogUmVtb3ZlIGhhY2sgdG8gbGV0IG9nZ211eCBzdGFydCBhIG5ldyBwYWdlIGZvciBldmVyeSBDTU1MIGJ1ZmZlcgorCSAgb2dnbXV4IGRvZXMgdGhpcyBmb3IgQ01NTCBieSBpdHMgb3duIG5vdworCisyMDEwLTA2LTA3IDE4OjMyOjE2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IERvbid0IGhhbmRsZSBub24tVElNRSBzZWVrcworCSAgRG9uJ3Qgc2VuZCB0aGVtIHVwc3RyZWFtIGJlY2F1c2UgZm9yIHVwc3RyZWFtIGEgQllURVMgc2VlaworCSAgbWlnaHQgbWFrZSBzZW5zZSBidXQgaXMgY29tcGxldGVseSB3cm9uZyBiZWNhdXNlIHVwc3RyZWFtCisJICBjYW4ndCBzZWVrIHRvIGEgYnl0ZSBwb3NpdGlvbiBvZiB0aGUgYXVkaW8gb3IgdmlkZW8gc3RyZWFtLgorCSAgQWxzbyBkb24ndCBidWlsZCB0aGUgaW5kZXggaW4gcHVzaCBtb2RlIGZvciBub24tVElNRSBzZWVrcywKKwkgIHRoaW5ncyB3aWxsIGdvIHdyb25nIGhlcmUgb3RoZXJ3aXNlLgorCisyMDEwLTA2LTA3IDExOjE1OjI2IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZmRldGVjdC5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZmRldGVjdC5oOgorCSAgZHRtZmRldGVjdDogT25seSB3b3JrcyB3aXRoIHJhdGU9ODAwMCwgZml4IGluIGNhcHMKKworMjAxMC0wNi0wMiAxOToxNjoyMCArMDEwMCAgU2pvZXJkIFNpbW9ucyA8c2pvZXJkLnNpbW9uc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgQ29wZSB3aXRoIHNob3J0IHN0YXJ0Y29kZXMgaW4gdGhlIGgyNjQgYnl0ZXN0cmVhbQorCisyMDEwLTA2LTA2IDE3OjI1OjE2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2U6IGxvZyBtZXNzYWdlIHByaW50ZiBmb3JtYXQgZml4ZXMKKworMjAxMC0wNi0wNiAxODowMDoyMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJKiBleHQvcHVsc2UvcHVsc2VtaXhlci5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4LmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgIGV4dDogRG9uJ3QgdXNlIEdTVF9ERUJVR19GVU5DUFRSIGZvciBHT2JqZWN0IHZmdW5jcworCisyMDEwLTA2LTA2IDE3OjU3OjAzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSogc3lzL29zcy9nc3Rvc3NkbWFidWZmZXIuYzoKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkqIHN5cy9vc3M0L29zczQtc2luay5jOgorCSogc3lzL29zczQvb3NzNC1zb3VyY2UuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeHJpbmdidWZmZXIuYzoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NpbmsuYzoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5jOgorCSogc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5jOgorCSAgc3lzOiBEb24ndCB1c2UgR1NUX0RFQlVHX0ZVTkNQVFIgZm9yIEdPYmplY3QgdmZ1bmNzCisKKzIwMTAtMDYtMDYgMTc6NTI6NDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5jOgorCSogZ3N0L2RlYnVndXRpbHMvYnJlYWtteWRhdGEuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHRhZ2luamVjdC5jOgorCSogZ3N0L2RlYnVndXRpbHMvcm5kYnVmZmVyc2l6ZS5jOgorCSogZ3N0L2RlYnVndXRpbHMvdGVzdHBsdWdpbi5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIGdzdDogRG9uJ3QgdXNlIEdTVF9ERUJVR19GVU5DUFRSIGZvciBHT2JqZWN0IHZmdW5jcworCisyMDEwLTA2LTA2IDE1OjEyOjE2ICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcGpAb3BlcmEuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IHJlZmFjdG9yIGRlbHRhIHVuaXQgaGFuZGxpbmcKKwkgIFRoaXMgYWxsb3dzIHVzIHRvIHNraXAgZGVsdGEgdW5pdHMgZWFybGllciBhbmQgaXMgYSBiaXQgY2xlYXJlciBpbiBteQorCSAgb3Bpbmlvbi4gSXQgYWxzbyBtYWtlcyBvbmx5IHZpZGVvIGJ1ZmZlcnMgZXZlciBiZSBkZWx0YSB1bml0cywgbm90CisJICBqdXN0IGZvciBTaW1wbGVCbG9jayBhcyBiZWZvcmUuCisKKzIwMTAtMDYtMDYgMTU6MTc6MDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogQ2xlYXIgYWRhcHRlciBvbiBkaXNjb250aW51aXRpZXMKKworMjAxMC0wNi0wNiAxNDowMzo1MyArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBJZ25vcmUga2V5ZnJhbWUgZmxhZyBmb3Igbm9uLXZpZGVvIHN0cmVhbXMKKwkgIFdoZW4gdGhlIGtleWZyYW1lIGJpdCBvZiBTaW1wbGVCbG9jayBGbGFncyB3YXNuJ3Qgc2V0LCB0aGUgYnVmZmVyIHdhcyBiZWluZworCSAgbWFya2VkIHdpdGggR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQsIGNhdXNpbmcgYWxsIGJ1ZmZlcnMgdG8gYmUgc2tpcHBlZAorCSAgYWZ0ZXIgYSBzZWVrLiBUaGlzIG1heSBiZSBhIHByb2JsZW0gd2l0aCB0aGUgU29yZW5zb24gU3F1aXNoIGVuY29kZXIsIGJ1dAorCSAgYXJndWFibHkgdGhlIGtleWZyYW1lIGJpdCBzaG91bGQgb25seSBiZSBhcHBsaWVkIHRvIHZpZGVvLgorCSAgRml4ZXMgYnVnICM2MjAzNTguCisKKzIwMTAtMDYtMDYgMTQ6NTY6NTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogRmlyc3QgdHJ5IHVwc3RyZWFtIHdoZW4gaGFuZGxpbmcgc2VlayBldmVudHMvcXVlcmllcworCisyMDEwLTA2LTA0IDE0OjU0OjU5IC0wNDAwICBUcmlzdGFuIE1hdHRoZXdzIDx0cmlzdGFuQHNhdC5xYy5jYT4KKworCSogZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmM6CisJICBnc3RydHBjZWx0cGF5OiBkb24ndCBhbHdheXMgZml4YXRlIHNpbmsgY2FwcyB0byAxIGNoYW5uZWwKKwkgIFRoZSBnZXRjYXBzIGZ1bmN0aW9uIHNob3VsZCBub3QgZml4YXRlIHRoZSBjaGFubmVscyBmaWVsZCB1bnRpbCB3ZQorCSAgZ2V0IHRoZSBlbmNvZGluZy1wYXJhbXMgZmllbGQgZnJvbSBvdXIgc3JjcGFkJ3MgY2Fwcy4gRml4ZXMgIzYyMDU5MQorCisyMDEwLTA2LTA0IDEzOjU3OjI4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwOiB0cnkgYWxsIHJhbmdlcyBmcm9tIHRoZSBzZHAKKwkgIFRyeSBhbGwgcmFuZ2VzIGluIHRoZSBTRFAgYmVmb3JlIGdpdmluZyB1cC4KKworMjAxMC0wNi0wNCAxMzo1NjowNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogbWFrZSBwYXJzZV9yYW5nZSByZXR1cm4gcmVzdWx0CisJICBNYWtlIHRoZSBwYXJzZV9yYW5nZSBmdW5jdGlvbiByZXR1cm4gaWYgdGhlIHBhcnNpbmcgc3VjY2VlZGVkIG9yIGZhaWxlZC4KKworMjAxMC0wNi0wNCAxMTo0NDowOSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogaWYgd2UncmUgbm90IGxpbmtlZCBkb3duc3RyZWFtLCB3ZSBjYW4gZG8gYW55IGZvcm1hdAorCSAgU3R1cGlkIG1lLCBhc3N1bWluZyBfZ2V0X2FsbG93ZWRfY2FwcygpIHdvdWxkIGFjdHVhbGx5IHJldHVybiB0aGUKKwkgIHBhZCB0ZW1wbGF0ZXMgaWYgdGhlcmUgd2FzIG5vIHBlZXIuCisKKzIwMTAtMDUtMzEgMTY6MjY6MTkgKzAxMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZC5zaW1vbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgS2VlcCBhbm5vdW5jaW5nIHRoZSBkZWxpdmVyeS1tZXRob2QgaW4gdGhlIGNhcGFiaWxpdGllcworCSAgRXZlbiB0aG91Z2ggd2UgZG9uJ3QgdXNlIGRlbGl2ZXJ5LW1ldGhvZCBpbiBvdXIgcGF5bG9hZGVyLCBvbGRlciB2ZXJzaW9ucyBvZgorCSAgdGhlIHRoZW9yYSBwYXlsb2FkZXIgaW4gZ3N0cmVhbWVyIHJlcXVpcmVkIGl0LiBBcyBzdWNoIHdlIG5lZWQgdG8ga2VlcCB0aGlzCisJICBhcm91bmQgaW4gdGhlIGNhcHMgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LgorCSAgVGhpcyByZXZlcnRzIHBhcnQgb2YgNDk0NjNhMzdjYmFhOTUyZTE0MDEyOTFmMGEyNjIzZGU2Y2FiMzg4MAorCSAgRml4ZXMgIzYxODk0MAorCisyMDEwLTA2LTAzIDE3OjUyOjExICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSogc3lzL29zczQvb3NzNC1taXhlci5jOgorCSAgb3NzNDogYWRkIHNvbWUgY29tbWVudHMgZm9yIHRyYW5zbGF0b3JzIHRvIGNsYXJpZnkgbWVhbmluZyBvZiAiTG93IgorCSAgIkxvdyIgZXRjLiBhcmUgcXVhbGl0eSBzZXR0aW5ncyBoZXJlIChlLmcuIGZvciB0aGUgaW50ZXJuYWwgcmVzYW1wbGVyKS4KKwkgIFNvbWUgZGF5IHdoZW4gd2UgdXNlIEdMaWIncyBpMThuIGZ1bmN0aW9ucyB3ZSBtaWdodCB3YW50IHRvIHVzZQorCSAgTkNfKCkgYW5kIGdfZHBnZXR0ZXh0MigpIGhlcmUgaW5zdGVhZCBvZiB0aGUgY29tbWVudHMuCisJICBGaXhlcyAjNTU1OTY3LgorCisyMDEwLTA2LTAzIDE5OjIzOjAxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuaDoKKwkgIG1wNGdkZXBheTogY2FsY3VsYXRlIHRoZSBmcmFtZSBkdXJhdGlvbiBjb3JyZWN0bHkKKwkgIFdoZW4gd2UgY2FsY3VsYXRlIHRoZSBmcmFtZSBkdXJhdGlvbiwgd2UgbmVlZCB0byB1c2UgdGhlIGFtb3VudCBvZgorCSAgZnJhbWVzIGluIHRoZSBfcHJldmlvdXNfIHBhY2tldCwgbm90IHRoZSBjdXJyZW50IHBhY2tldC4gVGhlIGZyYW1lIGR1cmF0aW9uIGlzCisJICBuZWVkZWQgdG8gY29ycmVjdGx5IGRlLWludGVybGVhdmUgaW50ZXJsZWF2ZWQgc3RyZWFtcy4gVGhpcyBmaXhlcyB0aGUgY2FzZSB3aGVyZQorCSAgdGhlcmUgYXJlIGEgdmFyaWFibGUgbnVtYmVyIG9mIGZyYW1lcyBpbiBhIHBhY2tldC4KKwkgIEZpeGVzICM2MjA0OTQKKworMjAxMC0wNi0wMyAxODo1ODo0MiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogRG9uJ3QgcmV0dXJuIGNhcHMgaW4gZ2V0X2NhcHMoKSB0aGF0IHdpbGwgYmUgcmVqZWN0ZWQKKwkgIFRoaXMgY29tbWl0IGJhc2ljYWxseSBwdXRzIF9nZXRfY2FwcygpIGluIHN5bmMgd2l0aCBhY2NlcHRfY2FwcygpLgorCSAgSWYgd2UgZG9uJ3QgaGF2ZSBhIG1hc3RlciBwYWQgT1IgdGhlIG1hc3RlciBwYWQgY2FwcyBhcmVuJ3QgbmVnb3RpYXRlZAorCSAgdGhlbiB3ZSBqdXN0IHJldHVybiB0aGUgZG93bnN0cmVhbSBhbGxvd2VkIGNhcHMuCisJICBJZiB3ZSBoYXZlIGEgbWFzdGVyIHBhZCB3aXRoIG5lZ290aWF0ZWQgY2Fwcywgd2UgcmV0dXJuIHRob3NlIGNhcHMKKwkgIHdpdGggYSBmcmVlIHJhbmdlIG9mIHdpZHRoL2hlaWdodC9mcmFtZXJhdGUKKworMjAxMC0wNi0wMyAxMzo0NTozMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIFJldmVydCAicHVsc2VzaW5rOiBBZGQgY29tbWVudHMgdG8gcmVtb3ZlIHRoZSBwcm92aWRlLWNsb2NrIG1lc3NhZ2UgcG9zdGluZyBvbmNlIHdlIGRlcGVuZCBvbiBiYXNlIDAuMTAuMzAiCisJICBUaGlzIHJldmVydHMgY29tbWl0IDhmMzcwOGYzOGFhMzgzOWE2YTYyNWNhN2QxYzE2NjEwMWM5ZmJiN2YuCisJICBUaGUgYmFzZWF1ZGlvc2luayBjb21taXQgd2FzIHJldmVydGVkCisKKzIwMTAtMDYtMDMgMTA6Mjc6MjUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IEFkZCBjb21tZW50cyB0byByZW1vdmUgdGhlIHByb3ZpZGUtY2xvY2sgbWVzc2FnZSBwb3N0aW5nIG9uY2Ugd2UgZGVwZW5kIG9uIGJhc2UgMC4xMC4zMAorCSAgYmFzZWF1ZGlvc2luayBkb2VzIGFsbCB0aGlzIGZvciB1cyBub3cuCisKKzIwMTAtMDUtMDcgMTg6NDI6MDYgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgZHRtZjogUmVtb3ZlIHJ0cGR0bWZtdXggc3RyZWFtLWxvY2sgY29kZQorCisyMDEwLTA2LTAyIDE2OjM2OjExICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IGRlbGF5ZWQgc2VlayBoYW5kbGluZyBhbHNvIGRlc2VydmVzIFRSVUUgZXZlbnQgcmVzcG9uc2UKKworMjAxMC0wNi0wMiAxNTozMDo0NyArMDIwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGZpeCBjb21waWxlciB3YXJuaW5nCisJICB1bnVzZWQgdmFyaWFibGUg4oCYZXN0aW1hdGVk4oCZCisKKzIwMTAtMDYtMDIgMTU6MDQ6MDAgKzAyMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRAZ21haWwuY29tPgorCisJKiBjb21tb246CisJICBjb21tb246IHJldmVydCB0aGUgY2hhbmdlIGkgZGlkIGluIG15IHByZXZpb3VzIGNvbW1pdAorCisyMDEwLTA2LTAyIDEzOjM5OjEwICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogY29tbW9uOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHN0b3AgYnVmZmVyaW5nIGFuZCBlbWl0IEVPUyBhdCB0aGUgZW5kIG9mIGEgc3RyZWFtCisJICBXaGVuIHVzaW5nIFJUUF9KSVRURVJfQlVGRkVSX01PREVfQlVGRkVSLCBtYWtlIHN1cmUgdGhhdCB0aGUgcmluZ2J1ZmZlciBkb2Vzbid0CisJICBnZXQgc3R1Y2sgYnVmZmVyaW5nIGZvcmV2ZXIgd2hlbiB0aGVyZSBpc24ndCBlbm91Z2ggZGF0YSBsZWZ0IHRvIGZpbGwgdGhlCisJICBidWZmZXIuCisKKzIwMTAtMDYtMDEgMjE6NTI6NTkgKzAyMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZ3N0L2RlYnVndXRpbHMvdGVzdHBsdWdpbi5jOgorCSAgZGVidWd1dGlsczogRG9uJ3QgY29uc3VtZSBwcmVyb2xsIGJ1ZmZlciB0d2ljZQorCisyMDEwLTA2LTAxIDIxOjMyOjExICswMjAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkgIHB1bHNlOiBTdHlsZSBmaXg6IHVzZSBnX3N0cmR1cCgpIGluc3RlYWQgb2YgcHJpbnRmKClpbmcgYSBzaW1wbGUgc3RyaW5nCisKKzIwMTAtMDUtMjcgMTY6MDc6MzEgKzAyMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZ3N0L2RlYnVndXRpbHMvdGVzdHMuYzoKKwkgIGRlYnVndXRpbHM6IFJlcGxhY2UgbWQ1IGltcGxlbWVudGF0aW9uIHdpdGggZ2xpYidzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjE5ODI0CisKKzIwMTAtMDUtMjIgMTE6NTU6MzcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBjbGVhbiB1cCBjb2RlIGZvciBhdmkgaGVhZGVyIHVzaW5nIGEgYnl0ZXdyaXRlcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxOTI5MworCisyMDEwLTA2LTAxIDE4OjU0OjQxIC0wNTAwICBQaWVycmUtTG91aXMgQm9zc2FydCA8cGllcnJlLWxvdWlzLmJvc3NhcnRAaW50ZWwuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IG9wdGltaXplIGNvbW11bmljYXRpb24gd2l0aCBQdWxzZUF1ZGlvIHVzaW5nIHBhX3N0cmVhbV9iZWdpbl93cml0ZQorCisyMDEwLTA2LTAyIDEwOjUyOjU2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBQb3N0IHByb3ZpZGUtY2xvY2sgbWVzc2FnZSBvbiB0aGUgYnVzIGlmIHRoZSBjbG9jayBhcHBlYXJzL2Rpc2FwcGVhcnMKKwkgIEZpeGVzIGJ1ZyAjNjIwMjc3LgorCisyMDEwLTA2LTAxIDIzOjQ5OjE3IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDE3Zjg5ZTUgdG8gNDc2ODNjMQorCisyMDEwLTA2LTAxIDIyOjU0OjQ5IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGNkZmYwZmIgdG8gMTdmODllNQorCisyMDEwLTA2LTAxIDIwOjQ1OjI5ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBmaWx0ZXIgY2FwcyByZXR1cm5lZCBmcm9tIGRvd25zdHJlYW0gd2l0aCBvdXIgcGFkIHRlbXBsYXRlLgorCisyMDEwLTA2LTAxIDE2OjU2OjMyICswMTAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogUmVtb3ZlIG1vcmUgdW5uZWVkZWQgd2FybmluZ3MKKworMjAxMC0wNi0wMSAxNjo1NDowMyArMDEwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkgIG1hdHJvc2thbXV4OiByZW1vdmUgdW5uZWVkZWQgd2FybmluZworCisyMDEwLTA2LTAxIDE2OjQ5OjE0ICswMTAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOgorCSAgbWF0cm9za2FtdXg6IHJlbW92ZSB1bm5lZWRlZCBkZWJ1ZyBzdGF0ZW1lbnQKKworMjAxMC0wNi0wMSAxNjoyNDo1MyArMDEwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgbWF0cm9za2FtdXg6IGNoYW5nZSBpcy1saXZlIHByb3BlcnR5IHRvIGluZGV4ZWQKKworMjAxMC0wNS0yMyAxMzo1NjoxNiArMDEwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYTogdXNlIHRoZSB1aW50NjQgc2NhbGluZyBmdW5jdGlvbnMKKwkgIEluIGRlbXV4ZXIgYW5kIG11eGVyIHVzZSB0aGUgZ3N0X3V0aWxfdWludDY0IHNjYWxpbmcgZnVuY3Rpb25zIHJhdGhlciB0aGFuCisJICBzdGFuZGFyZCBpbnRlZ2VyIGRpdmlzaW9uLiBBZGQgd2FybmluZ3MgKHRvIGJlIGNoYW5nZWQgdG8gZGVidWcpIGZvciBkZWJ1Z2dpbmcKKwkgIHRoZSB0aW1lc3RhbXAgYW5kIGR1cmF0aW9uLgorCisyMDEwLTA1LTIxIDE0OjM1OjM0ICswMTAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOgorCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBzZXQgZGVsdGEgdW5pdCBvbiBhbGwgYnVmZmVycyBleGNlcHQgY2x1c3RlciBzdGFydCBvbmVzCisKKzIwMTAtMDUtMjEgMTM6Mzg6MTEgKzAxMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHN0b3JlIGNhcHMgYW5kIHNldCBvbiBidWZmZXJzIHJhdGhlciB0aGFuIHVzaW5nIHBhZCBjYXBzCisKKzIwMTAtMDUtMjEgMTM6MjU6MjQgKzAxMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBtYWtlIHN1cmUgcGFkcyBjYXBzIGFyZSBzZXQgYmVmb3JlIGFueSBidWZmZXJzIHB1c2hlZC4KKworMjAxMC0wNS0yMSAxMzoxNDowNCArMDEwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogYWRkIHN0cmVhbWhlYWRlcnMKKworMjAxMC0wNS0yMSAxMjoyMzowOCArMDEwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IG5vIG5lZWQgdG8gc2V0IGNhY2hlIHR3aWNlCisKKzIwMTAtMDUtMjEgMDE6NTk6NTMgKzAyMDAgIFhhdmllciBRdWVyYWx0IDx4cXVlcmFsdEBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIERvIG5vdCBjcmVhdGUgYSBTZWVrSGVhZGVyLCBDdWVzLCAuLiB3aGVuIGRvaW5nIGxpdmUKKworMjAxMC0wNS0yMCAyMzozOTo1OSArMDIwMCAgWGF2aWVyIFF1ZXJhbHQgPHhxdWVyYWx0QGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgQWRkIGlzLWxpdmUgcHJvcGVydHkKKworMjAxMC0wNi0wMSAxMzoyMjoyNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGZpeCB2YXJpYWJsZSBpbml0CisKKzIwMTAtMDUtMjggMTY6Mzc6MzIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgbWF0cm9za2FkZW11eDogaW1wcm92ZSByZXZlcnNlIHBsYXliYWNrCisJICBTbGlnaHRseSBtb2RpZnkgYXBwcm9hY2ggdG8gYWxzbyBoYW5kbGUgY2FzZXMgd2hlcmUgY3VlIGVudHJpZXMgZG8gbm90IHJlbGlhYmx5CisJICBsZWFkIHRvIGluaXRpYWwga2V5ZnJhbWVzLgorCSAgRml4ZXMgIzYxOTgxNy4KKworMjAxMC0wNS0yNCAxNjowMjo1OCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyYmxlbmQuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvc2NhbGVyYm9iLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdmZpci5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZWJmZi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZXRmZi5jOgorCSAgZGVpbnRlcmxhY2U6IGF2b2lkIGd0ay1kb2MgY29uZnVzaW5nIGNvbW1lbnRzCisKKzIwMTAtMDUtMjEgMTE6MjE6NTggKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6CisJICBtYXRyb3NrYW11eDogYWRqdXN0IHVuaXQgdGVzdCB0byBtb2RpZmllZCBiZWhhdmlvdXIKKworMjAxMC0wNS0yMCAxNDozMzo0MSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHVzZSB3cml0ZSBjYWNoaW5nIGFsc28gd2hlbiB3cml0aW5nIGJ1ZmZlciBkYXRhCisJICBTcGVjaWZpY2FsbHksIHRoaXMgcmVkdWNlcyBwdXNoaW5nIHNldmVyYWwgc21hbGwgYnVmZmVycyBmb3IgZWFjaAorCSAgZGF0YSBidWZmZXIgYW5kIGFsc28gYXZvaWRzIGEgc2VlayBmb3IgZWFjaCBidWZmZXIgYWx0b2dldGhlcgorCSAgKHRob3VnaCBhIHNlZWsgaXMgc3RpbGwgbmVlZGVkIGZvciBlYWNoIGNsdXN0ZXIpLgorCSAgRml4ZXMgIzYxOTI3My4KKworMjAxMC0wNS0yMCAxNDoyMzowNyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGZpeCBlYm1sIHdyaXRlIGNhY2hpbmcgd2l0aCBieXRld3JpdGVyIGltcGxlbWVudGF0aW9uCisJICBBbHNvIGNhY2hlIGEgYml0IG1vcmUgZHVyaW5nIGhlYWRlciB3cml0aW5nLgorCSAgRml4ZXMgIzYxOTI3My4KKworMjAxMC0wNS0yMCAxNDowODo0MiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJICBtYXRyb3NrYW11eDogdXNlIGNvbnNpc3RlbnQgZGVidWcgY2F0ZWdvcnkgbmFtZSBmb3IgZWJtbHdyaXRlCisKKzIwMTAtMDUtMTggMTQ6NDQ6MTUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgbWF0cm9za2FkZW11eDogdXNlIGJ5dGVyZWFkZXIgYmFzZWQgR3N0RWJtbFJlYWQgYXMgYSBoZWxwZXIKKwkgIC4uLiByYXRoZXIgdGhhbiBiYXNpbmcgb24gaXQgYnkgaW5oZXJpdGFuY2UuCisJICBBbHNvIHVzZSBtb3JlIGNvbW1vbiBjb2RlIGZvciBwdXNoIGFuZCBwdWxsIG1vZGUuCisJICBGaXhlcyAjNjE5MTk4LgorCSAgRml4ZXMgIzYxMTExNy4KKworMjAxMC0wNi0wMSAxNTo0NzozMiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBfZ2V0X3BhZF90ZW1wbGF0ZSByZXN1bHQgbmVlZHMgbm8gdW5yZWYKKworMjAxMC0wNS0xOCAxOTo0Mjo1OCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJICBwbmdlbmM6IFN1cHBvcnQgOCBiaXQgZ3JheXNjYWxlCisJICBBZGRzIHN1cHBvcnQgdG8gOCBiaXQgZ3JheXNjYWxlIGlucHV0CisKKzIwMTAtMDUtMTggMTQ6NDY6NTQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBBZGRzIDhiaXQgZ3JheXNjYWxlIHN1cHBvcnQKKwkgIEFkZHMgZGVjb2Rpbmcgc3VwcG9ydCBmb3IganBlZyBpbWFnZXMgaW4gOCBiaXQgZ3JheXNjYWxlIGZvcm1hdC4KKworMjAxMC0wNS0xOCAwMTo1NzoxNCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWdlbmM6IEFjY2VwdCBncmF5c2NhbGUgYXMgaW5wdXQKKwkgIEFkZHMgdmlkZW8veC1yYXctZ3JheXNjYWxlICg4IGJpdCkgc3VwcG9ydCB0byBqcGVnZW5jCisKKzIwMTAtMDUtMzEgMTM6MzA6MDUgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIHZpZGVvbWl4ZXI6IEltcGxlbWVudCBzaW5rcGFkIEdldENhcHNGdW5jdGlvbi4KKwkgIFRoaXMgYWxsb3dzIHJldHVybmluZyBvbmx5IHRoZSBmb3JtYXRzLCB3aWR0aCwgaGVpZ2h0LCBmcmFtZXJhdGUKKwkgIGFuZCBwaXhlbC1hc3BlY3QtcmF0aW8gdGhhdCBkb3duc3RyZWFtIGNhbiBzdXBwb3J0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYyMDE0OAorCisyMDEwLTA1LTMxIDA3OjQ5OjIxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBEb24ndCBjb21wYXJlIHJ1bm5pbmcgdGltZXMgd2l0aCBzdHJlYW0gdGltZXMgd2hlbiBkb2luZyBRb1MKKworMjAxMC0wNS0yNyAyMTowNjo0MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmg6CisJICBkZWludGVybGFjZTogRG9uJ3QgcmVjb25maWd1cmUgdGhlIGNhcHMgd2hlbiBjaGFuZ2luZyBwcm9wZXJ0aWVzCisJICBGaXhlcyBidWcgIzYxOTg0OC4KKworMjAxMC0wNS0yNiAxMzoxMzo0NCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmg6CisJICBhbHBoYTogQWRkIHByb3BlcnR5IHRvIGFsbG93IHBhc3N0aHJvdWdoIG1vZGUKKwkgIFRoaXMgcGFzc3Rocm91Z2ggbW9kZSBpcyB1c2VkIGlmIHRoZSBhbHBoYSBtZXRob2QgaXMgInNldCIKKwkgIGFuZCB0aGUgYWxwaGEgdmFsdWUgaXMgMS4wLgorCSAgRml4ZXMgYnVnICM2MTc1MTIuCisKKzIwMTAtMDUtMjUgMTU6MTY6MDYgKzEwMDAgIEFsZXhhbmRlciBLb2pldm5pa292IDxhbGV4YW5kZXJAa29qZXZuaWtvdi5jb20+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IHN1cHBvcnQgMjQtYml0IHdpZHRoCisJICBGaXhlcyAjNjE5MDQ1CisKKzIwMTAtMDUtMjQgMjE6NTA6NTggKzEwMDAgIEFsZXhhbmRlciBLb2pldm5pa292IDxhbGV4YW5kZXJAa29qZXZuaWtvdi5jb20+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IHN1cHBvcnQgYXJiaXRyYXJ5IGJpdCBkZXB0aAorCSAgUGFydGlhbGx5IGZpeGVzICM2MTkwNDUKKworMjAxMC0wNS0yNSAwNTozNjo0NiArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBmaXggZGVhZGxvY2sgaW50cm9kdWNlZCBieSB2aWRlbyBrZXlmcmFtZSBRb1MKKworMjAxMC0wNS0yMyAwOTozMjowOCArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICBtYXRyb3NrYWRlbXV4OiBza2lwIGJ1ZmZlcnMgYmVmb3JlIGEgbGF0ZSBrZXlmcmFtZSAoUW9TKQorCSAgQmVmb3JlLCB2cDhkZWMgaGFkIG5vIG9wdGlvbiBidXQgdG8gZGVjb2RlIGFsbCBmcmFtZXMgZXZlbiBpZiBzb21lL2FsbAorCSAgb2YgdGhlbSB3b3VsZCBiZSBsYXRlLiBXaXRoIHRoaXMgY2hhbmdlLCBwZXJmb3JtYW5jZSB3aGVuIGtleWZyYW1lcyBhcmUKKwkgIGZyZXF1ZW50IGlzIGhlbHBlZCBhIGdyZWF0IGRlYWwuIE9uIG15IFRoaW5rcGFkIFg2MHMsIGRlY29kaW5nIGEgMjAgcworCSAgMTA4MHAgc3VuZmxvd2VyIGVuY29kZSB3aXRoIGtleWZyYW1lcyBldmVyeSAxMCBmcmFtZXMgd2VudCBmcm9tIHRha2luZworCSAgNDIgcyB3aXRoIDUgZnJhbWVzIHNob3duIHRvIDIxIHMgd2l0aCAxNSBmcmFtZXMgc2hvd24gKHN0aWxsIHNsb3cKKwkgIGVub3VnaCB0byBjb3VudCBieSBoYW5kKS4gV2hlbiBrZXlmcmFtZXMgYXJlIG1vcmUgc3BhcnNlLCB5b3Ugd2lsbAorCSAgc3RpbGwgYmUgYWJsZSB0byBjYXRjaCB1cCBldmVudHVhbGx5LCBidXQgdGhlIHJlc3VsdHMgd29uJ3QgYmUgYXMKKwkgIG5vdGljYWJsZS4KKworMjAxMC0wNS0xNCAxNzo1Nzo1OSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuaDoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXJwYWQuaDoKKwkgIHZpZGVvbWl4ZXI6IERvbid0IG1peCBpbnB1dCB3aXRoIGRpZmZlcmVudCBwaXhlbCBhc3BlY3QgcmF0aW9zCisJICBGaXhlcyBidWcgIzYxODUzMC4KKworMjAxMC0wNS0xNyAxOTo1NDoyMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5hc206CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWguYzoKKwkgIGRlaW50ZXJsYWNlOiBBZGQgTU1YLzNETm93IGltcGxlbWVudGF0aW9ucyBvZiBncmVlZHloIGZvciBVWVZZCisKKzIwMTAtMDUtMTcgMTk6MTY6NDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWguYzoKKwkgIGRlaW50ZXJsYWNlOiBGaXggVVlWWSBpbXBsZW1lbnRhdGlvbiBvZiBncmVlZHloIHRvIGJlIGFjdHVhbGx5IHVzZWQKKworMjAxMC0wNS0xMSAxMTo0MzowNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkqIGV4dC9nZGtfcGl4YnVmL01ha2VmaWxlLmFtOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5jOgorCSAgZ2RrcGl4YnVmOiBBZGQgYSBnZGtwaXhidWYzIHBsdWdpbiB0aGF0IHVzZXMgZ2RrcGl4YnVmMworCisyMDEwLTA2LTAxIDEwOjA2OjEwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogTWFrZWZpbGUuYW06CisJKiBjb21tb246CisJKiB3aW4zMi9jb21tb24vZ3N0cnRwYmluLW1hcnNoYWwuYzoKKwkqIHdpbjMyL2NvbW1vbi9nc3RydHBiaW4tbWFyc2hhbC5oOgorCSogd2luMzIvY29tbW9uL2dzdHVkcC1lbnVtdHlwZXMuYzoKKwkqIHdpbjMyL2NvbW1vbi9nc3R1ZHAtbWFyc2hhbC5jOgorCSogd2luMzIvY29tbW9uL2dzdHVkcC1tYXJzaGFsLmg6CisJICB3aW4zMjogYWRkIG1vcmUgZ2VuZXJhdGVkIG1hcnNoYWwgYW5kIGVudW10eXBlIGZpbGVzIHRvIHdpbjMyLXVwZGF0ZQorCisyMDEwLTA2LTAxIDA5OjI3OjAwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLmM6CisJICBSZXZlcnQgIm1hdHJvc2thOiBhZGQgdGVtcG9yYXJ5IHdlYm0gdHlwZWZpbmRlciIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgZDE0OGVjMGFkMjA1M2FiYjBjMzhmYzY4MWE4OTUzMjkyOTg1Mzg4Zi4KKwkgIFdlIGRlcGVuZCBvbiAtYmFzZSBnaXQgbm93LCB3aGljaCBoYXMgYSB3ZWJtIHR5cGVmaW5kZXIgaW4gdGhlIHVzdWFsCisJICBwbGFjZS4KKworMjAxMC0wNi0wMSAwOToyNjoxMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgUmV2ZXJ0ICJhdmltdXgsIGZsdm11eCwgbWF0cm9za2FtdXg6IGRvbid0IGNyYXNoIGlmIHRhZ3MgYXJyaXZlIG9uIG11bHRpcGxlIGlucHV0IHBhZHMgYXQgdGhlIHNhbWUgdGltZSIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgNmE5OTgzY2QyMGM0OGI5NjM5NjIyOWIzZjk0ZDAyNTRhMDVkZGY0OC4KKwkgIFJlbHkgb24gbG9ja2luZyBkb25lIGluIEdzdFRhZ1NldHRlciBpbiBjb3JlIGdpdC4KKworMjAxMC0wNi0wMSAwOToyMzoxOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogcmVxdWlyZSBjb3JlL2Jhc2UgZ2l0CisJICBGb3IgV2ViTSB0eXBlZmluZGluZyBhbmQgR3N0VGFnc2V0dGVyIGZpeGVzLgorCisyMDEwLTA2LTAxIDA5OjE3OjUyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisKKz09PSByZWxlYXNlIDAuMTAuMjMgPT09CisKKzIwMTAtMDUtMzAgMTQ6MDM6NTMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAwLjEwLjIzCisKKzIwMTAtMDUtMzAgMTQ6MDI6MDQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisKKzIwMTAtMDUtMjkgMTA6MjM6NDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogRml4IHBvc2l0aW9uIHF1ZXJ5CisKKzIwMTAtMDUtMjggMTU6MTQ6MDcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2Evd2VibS1tdXguYzoKKwkgIGRvY3M6IHJlbW92ZSB1bm5lY2Vzc2FyeSB2aWRlb3JhdGUgZWxlbWVudCBmcm9tIHdlYm1tdXggZXhhbXBsZSBwaXBlbGluZQorCisyMDEwLTA1LTI4IDEwOjQzOjM2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAganBlZ2VuYzogS2VlcCB2YXJpYWJsZXMgaW4gc2FuZSBzdGF0ZSBhZnRlciBfcmVzZXQKKwkgIFdoZW4gcmVzZXRpbmcsIGtlZXAgJ3JvdycgdmFyaWFibGVzIGF0IGEgc2FuZSBzdGF0ZSBhZnRlcgorCSAgZnJlZWluZyB0byBhdm9pZCBpdCBiZWluZyBmcmVlZCBhZ2FpbiBvbiBfcmVzeW5jIHJlYWxsb2MKKwkgIHdoZW4gdGhlIGVsZW1lbnQgaXMgcmV1c2VkLgorCSAgRml4ZXMgIzYxOTk0MworCisyMDEwLTA1LTI3IDE4OjA4OjE3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogRml4IGZsb2F0aW5nIHBvaW50IHRvIGludGVnZXIgY29udmVyc2lvbiBmb3IgdGhlIGFscGhhIHZhbHVlcworCSAgRml4ZXMgYnVnICM2MTk4MzUuCisKKzIwMTAtMDUtMjYgMDg6NTQ6MzMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjIyLjMgcHJlLXJlbGVhc2UKKworMjAxMC0wNS0yNiAwMDozMzo1OSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTAtMDUtMjUgMTU6MzQ6MTEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBoYW5kbGUgdHJ1bmNhdGVkIGlucHV0IGRhdGEgYXQgRU9TIGluIHB1bGwgbW9kZQorCSAgRml4ZXMgIzYxNzczMy4KKworMjAxMC0wNS0yNiAxMTo1NToxMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSAzNTdiMGRiIHRvIGZkN2NhMDQKKworMjAxMC0wNS0yNSAyMToxNDowNSArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBSb3VuZCB0aW1lc3RhbXAgdXAgd2hlbiBzY2FsaW5nIHRvIG1vdiBmb3JtYXQKKwkgIEZpeCB0aW1lc3RhbXAgcm91bmRpbmcgdG8gYWxsb3cgdGhlIGNvcnJlY3QgaW5kZXggdG8gYmUgbG9jYXRlZC4KKwkgIFRoZSBpc3N1ZSB3YXMgdGhhdCBzY2FsaW5nIGZyb20gR1N0cmVhbWVyIHRpbWUgZm9ybWF0IHRvIG1vdiB0aW1lIGZvcm1hdCB3YXMKKwkgIHJvdW5kaW5nIGRvd24gY2F1c2luZyB0aGUgdGltZXN0YW1wIG9mIHRoZSBuZXdzZWdtZW50IGV2ZW50IHJlY2VpdmVkIGFmdGVyIGEKKwkgIGZsdXNoaW5nIGtleWZyYW1lIHNlZWsgdG8gZmluZCB0aGUgc2FtcGxlIGluZGV4IGJlZm9yZSB0aGUgb25lIGl0IHNob3VsZAorCSAgY2F1c2luZyBmdXJ0aGVyIGJhY2t3YXJkIHNlZWtpbmcgdG8gdGhlIGtleWZyYW1lIHByaW9yIHVudGlsIG5vIHJvdW5kaW5nIGVycm9yCisJICBvY2N1cnJlZC4KKwkgIFJvdW5kaW5nIHVwIHdoZW4gc2NhbGluZyB0byBtb3YgZm9ybWF0IGhhcyB0aGUgZGVzaXJlZCBlZmZlY3QsIGFuZCBpdCBpcworCSAgbm90IGNsZWFyIHdoZXRoZXIganVzdCB0aGUgX3JvdW5kICgpIHZhcmlhbnQgd291bGQgYmUgc3VmZmljaWVudC4KKwkgIEZpeGVzIGJ1ZyAjNjE5MTA1CisKKzIwMTAtMDUtMjQgMTc6MjY6NDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIGF2aW11eCwgZmx2bXV4LCBtYXRyb3NrYW11eDogZG9uJ3QgY3Jhc2ggaWYgdGFncyBhcnJpdmUgb24gbXVsdGlwbGUgaW5wdXQgcGFkcyBhdCB0aGUgc2FtZSB0aW1lCisJICBUaGlzIGlzIGEgdGVtcG9yYXJ5IGZpeCBmb3IgdGhlIHJlbGVhc2Ugb25seS4KKwkgIEZpeGVzICM2MTk1MzMuCisKKzIwMTAtMDUtMjUgMTc6MDU6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJICBydHB0aGVvcmE6IHJlbW92ZSBkZWxpdmVyeS1tZXRob2QgZnJvbSBjYXBzCisJICBXZSBjYW4gYWNjZXB0IGFsbCBkZWxpdmVyeSBtZXRob2RzIHNvIGRvbid0IGFkdmVydGlzZSBhbnl0aGluZyBvbiB0aGUgY2FwcyBvcgorCSAgcGFyc2UgYW55dGhpbmcsIHdlIHdpbGwgaGFuZGxlIHdoYXRldmVyIHdlIHJlY2VpdmUuCisJICBGaXhlcyAjNjE4OTQwCisKKzIwMTAtMDUtMjUgMTU6NDA6MDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EuYzoKKwkgIG1hdHJvc2thOiBhZGQgdGVtcG9yYXJ5IHdlYm0gdHlwZWZpbmRlcgorCSAgQWRkIHdlYm0gdHlwZWZpbmRlciBqdXN0IGZvciB0aGUgcmVsZWFzZSwgc28gd2VibSB3b3JrcyBmb3IKKwkgIHBlb3BsZSB3aG9zZSBkaXN0cm9zIGRvbid0IHBhdGNoIGdzdC1wbHVnaW5zLWJhc2UgYXMgd2VsbC4KKwkgIFdlJ2xsIHJlbW92ZSB0aGlzIGFnYWluIGFmdGVyIHRoZSByZWxlYXNlLgorCisyMDEwLTA1LTIzIDExOjE3OjI3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL3dlYm0tbXV4LmM6CisJICBkb2NzOiBhZGQgc29tZSBwaXBlbGluZSBleGFtcGxlcyB0byB3ZWJtbXV4IGRvY3MKKworMjAxMC0wNS0yMSAxMjoyNzowNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSAgZG9jczogYWRkIHdlYm1tdXggdG8gZG9jcworCisyMDEwLTA1LTIxIDEzOjAxOjMwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLmM6CisJKiBnc3QvbWF0cm9za2Evd2VibS1tdXguYzoKKwkgIG1hdHJvc2thOiBmaXggdXAgcGx1Z2luIGFuZCBlbGVtZW50IGRlc2NyaXB0aW9ucyBhIGJpdAorCisyMDEwLTA1LTIxIDEyOjQ3OjAzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLmM6CisJKiBnc3QvbWF0cm9za2Evd2VibS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS93ZWJtLW11eC5oOgorCSAgbWF0cm9za2E6IG1vdmUgd2VibW11eCBpbnRvIG93biBzb3VyY2UgZmlsZXMKKwkgIE1ha2VzIHRoaW5ncyBlYXNpZXIgZm9yIGd0ay1kb2MuCisKKzIwMTAtMDUtMjEgMTI6MjY6MDUgKzA1MDAgIENocmlzdGlhbiBTY2hhbGxlciA8Y2hyaXN0aWFuLnNjaGFsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgVXBkYXRlIHNwZWMgZmlsZSB3aXRoIGxhdGVzdCBjaGFuZ2VzCisKKzIwMTAtMDUtMjAgMjA6MDE6NTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thOiBSZW1vdmUgdGhlIGRvY3R5cGUgZW51bSwgaXQncyBub3QgbmVlZGVkIGFueW1vcmUKKworMjAxMC0wNS0yMCAxOTo1NzoxNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkgIHdlYm1tdXg6IEFkZCBuZXcgd2VibW11eCBlbGVtZW50IHRoYXQgb25seSBzdXBwb3J0cyBtdXhpbmcgb2YgV2ViTQorCSAgLi4uYW5kIHJlbW92ZSB0aGUgZG9jdHlwZSBwcm9wZXJ0eSBmcm9tIG1hdHJvc2thbXV4IGFnYWluLgorCisyMDEwLTA1LTIwIDE3OjMxOjU5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbWF0cm9za2FtdXguYzoKKwkgIG1hdHJvc2thbXV4OiB1bml0IHRlc3QgY2hlY2tzIHZlcnNpb24gMSBmaWxlcworCisyMDEwLTA1LTE4IDE1OjI3OjA2IC0wNDAwICBUcmlzdGFuIE1hdHRoZXdzIDx0cmlzdGFuQHNhdC5xYy5jYT4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJICBzcGVleDogZml4IGxhdGVuY3kgcXVlcnkKKwkgIFNwZWV4IHNob3VsZCByZXBvcnQgMzAgbXMgbGF0ZW5jeSBmb3IgbmFycm93YmFuZCBtb2RlLCAzNCBvdGhlcndpc2UuCisJICBGaXhlcyAjNjE5MDE4CisKKzIwMTAtMDUtMTggMjE6MDQ6MzIgKzA4MDAgIFBoaWxpcCA8cGhpbGlwakBvcGVyYS5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkgIGVibWxyZWFkOiBybSBmbG9hdGNhc3QuaCBpbmNsdWRlIChub3QgdXNlZCkKKworMjAxMC0wNS0xNyAwNTozNjowMCArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGJ1bXAgZGVmYXVsdCBkb2N0eXBlIHZlcnNpb24gdG8gMgorCSAgSW4gdGhpcyBkYXkgYW5kIGFnZSB0aGlzIHNob3VsZCBiZSBzYWZlLiBUaGVyZSdzIG90aGVyd2lzZSBhIHJpc2sgcGVvcGxlCisJICB3aWxsIGJlIGNyZWF0aW5nIHVubmVjY2Vzc2FyaWx5IGJpZyBXZWJNIGZpbGVzIGFzIHRoZXkgY2FuJ3QgdXNlCisJICBTaW1wbGVCbG9jayBpbiB2MS4KKworMjAxMC0wNS0xNyAwNToyNzo0NCArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYTogaGFuZGxlIG1hdHJvc2thIGFuZCB3ZWJtIGRvY3R5cGUgdmVyc2lvbnMgZXF1YWxseQorCSAgVGhlIG9yaWdpbmFsIHBsYW4gd2FzIHRvIGxldCBXZWJNIHYxIGJlIHRoZSBzYW1lIGFzIE1hdHJvc2thIHYyICh3aXRoCisJICBleHRyYSBjb25zdHJhaW50cyksIGJ1dCBmb3Igc2ltcGxpY2l0eSBpdCB3YXMgZGVjaWRlZCB0byBoYW5kbGUgdGhlCisJICB2ZXJzaW9ucyBlcXVhbGx5LCBzdWNoIHRoYXQgZS5nLiBTaW1wbGVCbG9jayBpcyBvbmx5IGFsbG93ZWQgaW4gV2ViTSB2Mi4KKworMjAxMC0wNS0xMyAxMjoxMDo1NCArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBWZXJpZnkgbGFjZSBzaXplIGluIF9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrCisJICBGYWlsdXJlIHRvIGRvIHRoaXMgZm9yIGNvcnJ1cHQgaW5wdXQgY2FuIGNhdXNlIGEgc3ViYnVmZmVyIGJpZ2dlcgorCSAgdGhhbiB0aGUgYWN0dWFsIGJ1ZmZlciB0byBiZSBjcmVhdGVkLCBxdWlja2x5IGxlYWRpbmcgdG8gc2VnZmF1bHQuCisJICBUZXN0IGNhc2U6CisJICBidWdfczIyMjAwNTc1MV9yMC4wMDFfX19fbWVtY3B5LndlYm0KKworMjAxMC0wNS0xMyAxMDoyMzoxMCArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBlYm1sOiBjcnVkZSBoYWNrIHRvIGF2b2lkIGNyYXNoaW5nIG9uIHVuZXhwZWN0ZWQgbWV0YWRhdGEKKwkgIFRoZSBjb21tZW50IHNheXMgdGhpcyBjYW5ub3QgaGFwcGVuLCBidXQgaXQgZGlkIGFuZCBJIGRvbid0IGtub3cKKwkgIHdoeS4gVGhpcyBpcyBub3QgdGhlIGNvcnJlY3QgZml4LCBuZWVkcyBpbnZlc3RpZ2F0aW9uLiBUZXN0IGNhc2U6CisJICBidWdfczU1NTAxMDA5NF9yMC4wMDA1OjAuMDA4X19fX0lBX19nX2Fzc2VydGlvbl9tZXNzYWdlX2V4cHIud2VibQorCisyMDEwLTA1LTEzIDA5OjE4OjU2ICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcGpAb3BlcmEuY29tPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6CisJICBlYm1sOiBkb24ndCBtb2RpZnkgb3V0IHN0ciBpZiByZXR1cm5pbmcgYW4gZXJyb3IgaW4gX3JlYWRfYXNjaWkKKwkgIFRoaXMgaXMgYSByZWdyZXNzaW9uIGZyb20gQVNDSUkgdmFsaWRhdGlvbiBjaGFuZ2VzLiBUZXN0IGNhc2U6CisJICBidWdfczY2ODc2MzkwX3IwLjAwMV9fX19tYWxsb2NfcHJpbnRlcnIud2VibQorCisyMDEwLTA1LTEyIDEzOjE2OjI4ICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcGpAb3BlcmEuY29tPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6CisJICBlYm1sOiBWYWxpZGF0ZSA3LWJpdCBBU0NJSSBpbiBnc3RfZWJtbF9yZWFkX2FzY2lpCisJICBUaGlzIHdhcyB0cmlnZ2VyaW5nIGFuIFVURi04IGFzc2VydGlvbiBpbiBnc3RfY2Fwc19zZXRfc2ltcGxlIGZvcgorCSAgY29ycnVwdCBmaWxlcyB3aXRoIGdhcmJhZ2UgYXMgY29kZWMgaWQuIFRlc3QgY2FzZToKKwkgIGdzdHJlYW1lcl9lcnJvcl90cnlpbmdfdG9fc2V0X2ludmFsaWRfdXRmOF9hc19jb2RlY19pZC53ZWJtCisJICBPbGQgZ3N0X2VibWxfcmVhZF9hc2NpaSByZW5hbWVkIHRvIGdzdF9lYm1sX3JlYWRfc3RyaW5nLCBhbHNvIHVzZWQgYnkKKwkgIGdzdF9lYm1sX3JlYWRfdXRmOC4gVW5saWtlIGZvciBVVEYtOCwgZmFpbHVyZSB0byB2YWxpZGF0ZSBpcyBhbiBlcnJvciwKKwkgIGFzIGdzdF9lYm1sX3JlYWRfYXNjaWkgaXMgdXNlZCBmb3IgcmVhZGluZyBkb2N0eXBlIGFuZCBjb2RlYyBpZCBhbmQgd2UKKwkgIG1pZ2h0IGp1c3QgYXMgd2VsbCBnaXZlIHVwIGVhcmx5IGluIHRob3NlIGNhc2VzLgorCisyMDEwLTA1LTEyIDE0OjMwOjE4ICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcGpAb3BlcmEuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IElnbm9yZSB1bmV4cGVjdGVkIENvZGVjU3RhdGUKKwkgIEJlY2F1c2UgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKnN0cmVhbSBpcyBzZXQgdXAgaW4gdGhlIGZpcnN0CisJICBTaW1wbGVCbG9jayBvciBCbG9jaywgYSByb2d1ZSBDb2RlY1N0YXRlIG90aGVyd2lzZSBjYXVzZXMgYSBzZWdmYXVsdCBvbgorCSAgZGVyZWZlbmNpbmcgdGhlIE5VTEwgcG9pbnRlci4gVGVzdCBjYXNlOgorCSAgYnVnX3M1NTA2MTY3X3IwLjAwMV9fX19nc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jay53ZWJtCisKKzIwMTAtMDUtMTAgMDY6MDA6NDkgKzAyMDAgIFBoaWxpcCBKw6RnZW5zdGVkdCA8cGhpbGlwakBvcGVyYS5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogQWRkIHZpZGVvL3dlYm0gc2luayBjYXBzCisKKzIwMTAtMDUtMDkgMTk6NDY6NTEgKzAyMDAgIFBoaWxpcCBKw6RnZW5zdGVkdCA8cGhpbGlwQGZvb2xpcC5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBVc2UgU2ltcGxlQmxvY2sgZm9yIFdlYk0gd2hlbiBwb3NzaWJsZQorCisyMDEwLTA1LTA5IDE5OjI4OjU5ICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcEBmb29saXAub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IFN1cHBvcnQgIndlYm0iIERvY1R5cGUKKworMjAxMC0wNS0wOSAxMjozNToxMCArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBAZm9vbGlwLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgbWF0cm9za2FtdXg6IHJlbmFtZSBtYXRyb3NrYV92ZXJzaW9uIHRvIGRvY3R5cGVfdmVyc2lvbgorCisyMDEwLTA1LTA5IDEyOjA5OjU3ICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcEBmb29saXAub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJICBtYXRyb3NrYW11eDogU3VwcG9ydCAid2VibSIgRG9jVHlwZQorCisyMDEwLTA1LTEyIDE4OjM4OjQ4IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWRkIFZQOAorCisyMDEwLTA0LTI3IDE1OjI2OjEzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogQWRkIHN1cHBvcnQgZm9yIE9uMiBWUDgKKwkgIC4uLm1hdHJvc2thZGVtdXggYXV0b21hdGljYWxseSBzdXBwb3J0cyBpdCB0aHJvdWdoIGxpYmdzdHJpZmYuCisKKzIwMTAtMDQtMjcgMTU6MjU6MzIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBBZGQgc3VwcG9ydCBmb3IgT24yIFZQOAorCSAgLi4uYXZpZGVtdXggYXV0b21hdGljYWxseSBzdXBwb3J0cyBpdCB0aHJvdWdoIGxpYmdzdHJpZmYuCisKKzIwMTAtMDUtMTcgMTc6MTc6MDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlOiBEb24ndCBsb2NrIHRoZSBtYWlubG9vcCBpbiBOVUxMCisKKzIwMTAtMDUtMTUgMjE6MTU6NTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IFVzZSA9IGluc3RlYWQgb2YgPT0gaW4gc2hlbGwgc2NyaXB0cyBmb3IgZXF1YWxpdHkgY2hlY2tzCisKKzIwMTAtMDUtMTQgMTg6MzM6MzIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjIyLjIgcHJlLXJlbGVhc2UKKworMjAxMC0wNS0xNCAxODoyNDoxNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA0ZDY3YmQ2IHRvIDM1N2IwZGIKKworMjAxMC0wNS0xNCAxODoxNjo0NSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6CisJICB0ZXN0czogZml4IGxlYWsgaW4gc291cGh0dHBzcmMgdW5pdCB0ZXN0CisJICBVbnJlZiBzZXJ2ZXIgb2JqZWN0cyB3aGVuIGRvbmUuIEZpeGVzIGNoZWNrLXZhbGdyaW5kLgorCisyMDEwLTA1LTE0IDE3OjMwOjQwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAganBlZ2VuYzogZml4IHR3byBsZWFrcworCSAgRG9uJ3QgbGVhayBvdGhlcmNhcHMgb3IganBlZ2VuYyByZWYuCisKKzIwMTAtMDUtMTMgMTM6MDE6MjYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBmaXggZG9jcworCSAgRG9jdW1lbnRhdGlvbiBlcnJvciBzcG90dGVkIGJ5IHRvbnkgPGNhaWNhaTAxMTkgYXQgZ21haWwuY29tPgorCSAgRml4ZXMgIzYxODQxOQorCisyMDEwLTA1LTExIDEzOjE4OjQyIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkgIHJ0cHRoZW9yYWRlcGF5OiBtYWtlIGRlbGl2ZXJ5LW1ldGhvZCBwYXJhbWV0ZXIgb3B0aW9uYWwKKwkgIEl0IHByb2JhYmx5IHdpbGwgbm90IGJlIGluIHRoZSBmaW5hbCBSRkMgYXMgaXQgaXMgbm90IGluIFJGQyA1MjE1IGZvciBWb3JiaXMuCisJICBJZiB0aGVyZSBpcyBhIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLCBhc3N1bWUgaXQgaXMgaW4tbGluZSBhbmQgaWYgbm90aGluZyBpcworCSAgc3BlY2lmaWVkLCBhc3N1bWUgaXQgaXMgaW4tYmFuZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MTgzODYKKworMjAxMC0wNS0xMyAxMjoxNjo1OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogaW5jcmVhc2UgYWNjZXB0YWJsZSBvdXRwdXQgc2l6ZXMKKwkgIFdlIGNhbiBwZXJmZWN0bHkgZGVjb2RlIDF4MSBpbWFnZXMgc28gbG93ZXIgdGhlIG1pbiB3aWR0aCBhbmQgaGVpZ2h0IHRvIDEuCisJICBGaXhlcyAjNjE4MzkyCisKKzIwMTAtMDUtMTMgMTE6MzA6MjcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdHBheS5jOgorCSAgY2VsdHBheTogZml4IHF1ZXVlIGR1cmF0aW9uIGNhbGN1bGF0aW9ucworCSAgRG9uJ3QgYmxpbmRseSBhZGQgdGhlIGR1cmF0aW9ucyBvZiBpbmNvbW1pbmcgYnVmZmVycyB0byB0aGUgdG90YWwgcXVldWVkCisJICBkdXJhdGlvbiBiZWNhdXNlIGl0IG1pZ2h0IGJlIGludmFsaWQuIE1hcmsgdGhlIHRvdGFsIHF1ZXVlZCBkdXJhdGlvbiBpbnZhbGlkCisJICB3aGVuIHdlIHJlY2VpdmUgYW4gaW52YWxpZCBpbmNvbW1pbmcgdGltZXN0YW1wIGJlY2F1c2UgdGhhdCdzIHdoZW4gd2UgbG9zZSB0cmFjaworCSAgb2YgdGhlIHRvdGFsIHF1ZXVlZCBkdXJhdGlvbi4KKwkgIEZpeGVzICM2MTgzMjQKKworMjAxMC0wNS0xMCAxMToxNDozOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwaDI2NHBheTogZXh0cmFjdCBTUFMgYW5kIFBQUyBmcm9tIHByb3BlcnR5IHByb3ZpZGVkIHBhcmFtZXRlciBzZXQKKwkgIC4uLiBzbyBpdCBjYW4gYWxzbyBiZSByZWd1bGFybHkgaW5zZXJ0ZWQgaW50byB0aGUgc3RyZWFtIGlmIHNvIGNvbmZpZ3VyZWQuCisJICBGaXhlcyAjNjE3MTY0LgorCisyMDEwLTA1LTExIDIyOjI4OjA4ICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiBhbGxvdyBzd2l0Y2hpbmcgdmlld3MgYXQgcnVudGltZS4KKworMjAxMC0wNS0xMSAyMDoyNjozNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICBydHA6IGRpc3QgbWlzc2luZyBoZWFkZXIgZmlsZSB0byBmaXggbWFrZSBkaXN0Y2hlY2sKKworMjAxMC0wNS0xMSAxOTowNTowOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3M0L29zczQtc2luay5jOgorCSAgb3NzNDogbWlub3IgY2xlYW51cAorCSAgUmVtb3ZlIGZpeGVkIEZJWE1FLCBjaGFuZ2UgZmluYWxpc2UgdG8gZmluYWxpemUgZm9yIGNvbnNpc3RlbmN5LgorCisyMDEwLTA1LTExIDE5OjAxOjUxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSAgZG9jczogYWRkIG9zczQgZWxlbWVudHMgdG8gZG9jcworCisyMDEwLTA1LTExIDE2OjA5OjEwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2t5LnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBwbzogbW92ZSBvc3M0IHN0cmluZ3MgZnJvbSAtYmFkIHRvIC1nb29kCisKKzIwMTAtMDUtMTEgMTY6MDg6MjEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJKiBwby9QT1RGSUxFUy5pbjoKKwkqIHN5cy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2ljbGVzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgIE1vdmUgb3NzNCBwbHVnaW4gZnJvbSAtYmFkIHRvIC1nb29kCisJICBIb29rIHVwIGJ1aWxkIGluZnJhc3RydWN0dXJlLCBkb2NzIGFuZCB0ZXN0cy4KKwkgIEZpeGVzICM2MTQzMDUuCisKKzIwMTAtMDQtMjkgMTM6MTg6NTggKzAxMDAgIEJyaWFuIENhbWVyb24gPGJyaWFuLmNhbWVyb25Ab3JhY2xlLmNvbT4KKworCSogc3lzL29zczQvb3NzNC1zaW5rLmM6CisJKiBzeXMvb3NzNC9vc3M0LXNpbmsuaDoKKwkgIG9zczRzaW5rOiBpbXBsZW1lbnQgR3N0U3RyZWFtVm9sdW1lIGludGVyZmFjZSBhbmQgYWRkIG11dGUgYW5kIHZvbHVtZSBwcm9wZXJ0aWVzCisJICBPU1M0IHN1cHBvcnRzIHBlci1zdHJlYW0gdm9sdW1lIGNvbnRyb2wsIHNvIGV4cG9zZSB0aGlzIHVzaW5nIHRoZSByaWdodAorCSAgQVBJLCBzbyB0aGF0IHBsYXliaW4yIGFuZCBhcHBsaWNhdGlvbnMgbGlrZSB0b3RlbSBjYW4gbWFrZSB1c2Ugb2YgaXQKKwkgIChpbnN0ZWFkIG9mIHVzaW5nIGEgdm9sdW1lIGVsZW1lbnQgZm9yIHZvbHVtZSBjb250cm9sKS4KKwkgIEZpeGVzICM2MTQzMDUuCisKKzIwMTAtMDQtMDggMTA6NDU6MzMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvb3NzNC9vc3M0LWF1ZGlvLmM6CisJICBvc3M0OiA4LWJpdCBQQ00gYXVkaW8gY2FwcyBkb24ndCBuZWVkIGFuIGVuZGlhbm5lc3MgZmllbGQKKworMjAxMC0wNC0wOCAxMDo0MDowMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3M0L29zczQtYXVkaW8uYzoKKwkgIG9zczQ6IGRvbid0IGl0ZXJhdGUgdGhlIGZvcm1hdHMgdGFibGUgdHdpY2UgZm9yIGVhY2ggZW50cnkKKwkgIFdoZW4gaXRlcmF0aW5nIHRoZSBmb3JtYXRzIHRhYmxlLCB3ZSBjYW4ganVzdCBwYXNzIHRoZSB3aG9sZQorCSAgZW50cnkgdG8gb3VyIGhlbHBlciBmdW5jdGlvbiwgd2hpY2ggYXZvaWRzIGl0ZXJhdGluZyB0aGUgdGFibGUKKwkgIGFnYWluIHRvIGZpbmQgdGhlIGVudHJ5IHN0cnVjdHVyZSBmcm9tIHRoZSBwYXNzZWQgZm9ybWF0IGlkLgorCisyMDEwLTAzLTMwIDExOjQzOjA0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zczQvb3NzNC1hdWRpby5jOgorCSAgb3NzNDogYWxzbyBhY2NlcHQgZm9ybWF0cyBub3QgbmF0aXZlbHkgc3VwcG9ydGVkCisJICBBbHNvIGFjY2VwdCBmb3JtYXRzIHRoYXQgYXJlIG5vdCBuYXRpdmVseSBzdXBwb3J0ZWQgYnkgdGhlCisJICBoYXJkd2FyZSwgT1NTNCBjYW4gY29udmVydCB0aGVtIGludGVybmFsbHkuIExpc3QgdGhlIG5hdGl2ZQorCSAgZm9ybWF0cyBmaXJzdCBpbiB0aGUgY2FwcyB0aG91Z2gsIHRvIGV4cHJlc3Mgb3VyIHByZWZlcmVuY2UKKwkgIGZvciB0aGUgbmF0aXZlIGZvcm1hdHMuIFdlIG5lZWQgdGhpcyBpbiBvcmRlciB0byBzdXBwb3J0IHRoZQorCSAgY2FzZSBwcm9wZXJseSB3aGVyZSB0aGUgYXVkaW8gaGFyZHdhcmUgc3VwcG9ydHMgb25seSBlLmcuCisJICBsaXR0bGUgZW5kaWFuIFBDTSwgYnV0IHRoZSBob3N0IGlzIGJpZyBlbmRpYW4sIHNpbmNlIG1hbnkKKwkgIGF1ZGlvIGVsZW1lbnRzIG9ubHkgc3VwcG9ydCBuYXRpdmUgZW5kaWFubmVzcyBhbmQgbWFrZSB0aGUKKwkgIHJlYXNvbmFibGUgYXNzdW1wdGlvbiB0aGF0IGFueSBhdWRpb3Npbmsgd2lsbCBiZSBhYmxlIHRvCisJICBoYW5kbGUgYXVkaW8gaW4gbmF0aXZlIGVuZGlhbm5lc3MuCisJICBCYXNlZCBvbiBwYXRjaCBieSBKZXJyeSBUYW4gPGplcnJ5LnRhbkBzdW4uY29tPgorCSAgRml4ZXMgIzYxNDMxNy4KKworMjAxMC0wMy0zMCAwMToxNDo1OCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXIuYzoKKwkgIG9zczQ6IGFkZCBjb21tZW50IGZvciB0cmFuc2xhdG9ycworCSAgTm90IHRoYXQgdGhhdCB3aWxsIG1ha2UgdGhlc2Ugc3RyaW5ncyBtdWNoIGJldHRlci4gQWxzbyByZW1vdmUgaTE4bgorCSAgbWFya2VyIHdoZXJlIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZS4KKworMjAxMC0wMy0yMiAxNjoxMzoxMiArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6CisJICBvc3M0OiBSZWZhY3RvciBjb2RlIHRvIG1ha2UgaXQgbG9vayBtb3JlIG1vZGVybgorCSAgQSBzaWRlIGVmZmVjdCBpcyB0aGF0IGl0IHBhc3NlcyAtV2Zvcm1hdC1ub25saXRlcmFsIGFuZCBkb2Vzbid0IHJlYWQKKwkgIGludmFsaWQgbWVtb3J5IGluIHNvbWUgY2FzZXMsIGxpa2Ugd2hlbiB0aGUgbWl4ZXIgdHJhY2sgY29udGFpbnMKKwkgIGEgJSBzaWduIG9yIHRoZXJlIGlzIGEgbnVtYmVyIGJ1dCBub3QgYSBrbm93biBtaXhlciBuYW1lLgorCisyMDEwLTAzLTIyIDE0OjA5OjI0ICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXIuYzoKKwkgIG9zczQ6IEF2b2lkIGdfcXVhcmtfdG9fc3RyaW5nIChnX3F1YXJrX2Zyb21fc3RyaW5nICgpKSBtYWRuZXNzCisJICBXZSB0byB0aGUgc3RyZHVwIGluc2lkZSBnc3Rfb3NzNF9taXhlcl9jb250cm9sX2dldF90cmFuc2xhdGVkX25hbWUoKQorCSAgaW5zdGVhZCBvZiBpbiB0aGUgb25seSBjYWxsZXIuCisKKzIwMTAtMDMtMjEgMjE6Mzk6MTggKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogc3lzL29zczQvb3NzNC1taXhlci5jOgorCSAgQWRkIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVdtaXNzaW5nLXByb3RvdHlwZXMgdG8gY29uZmlndXJlIGZsYWdzCisJICBBbmQgZml4IGFsbCB3YXJuaW5ncworCisyMDEwLTAxLTIwIDEzOjI5OjUyICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXIuYzoKKwkgIEZpeCBjb21waWxlciB3YXJuaW5nIGFib3V0IHVudXNlZCByZXR1cm4gdmFsdWUKKworMjAwOS0wOC0yMSAwMToxNzoxOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2ljbGVzL3Rlc3Qtb3NzNC5jOgorCSAgdGVzdHM6IGZpeCB0ZXN0LW9zczQgdG8gdHJlYXQgYW4gZW1wdHkgZGV2aWNlIG5hbWUgdGhlIHNhbWUgYXMgYSBOVUxMIG5hbWUKKworMjAwOS0wNy0xNiAxMzo1NToxNCArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6CisJICBvc3M0OiBBdHRlbXB0IHRvIGZpeCBhIGNvbXBpbGVyIHdhcm5pbmcKKwkgIERvbid0IHN0b3JlIGEgY29uc3QgZ2NoYXIgKiBpbiBhIG5vbi1jb25zdCBnY2hhciAqIGxvY2FsIHZhci4KKwkgIEFsc28sIG1ha2UgdGhlIHRyYW5zbGF0aW9uIHN0cmluZyBmdW5jdGlvbiBzdGF0aWMgc2luY2UgaXQncyBvbmx5CisJICB1c2VkIGluIHRoZSBvbmUgZmlsZS4KKworMjAwOS0wNi0xMCAxOToyMToyMSArMDEwMCAgR2FycmV0dCBEJ0Ftb3JlIDxnYXJyZXR0LmRhbW9yZUBzdW4uY29tPgorCisJKiBzeXMvb3NzNC9vc3M0LWF1ZGlvLmM6CisJKiBzeXMvb3NzNC9vc3M0LW1peGVyLXNsaWRlci5jOgorCSogc3lzL29zczQvb3NzNC1taXhlci1zd2l0Y2guYzoKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXIuYzoKKwkgIG9zczQ6IEVuaGFuY2VtZW50cyB0byB0aGUgbWl4ZXIgYW5kIGF1ZGlvIG91dHB1dAorCSAgQ29kZSBjbGVhbnVwcywgZ2VuZXJhbCBpbXByb3ZlbWVudHMsIHN1cHBvcnQgZm9yIHRoZQorCSAgbmV3IG1peGVyIGZsYWdzIGluIGxhdGVzdCBnc3QtcGx1Z2lucy1iYXNlLgorCSAgRml4ZXM6ICM1ODQyNTIKKwkgIFBhdGNoIEJ5OiBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uQHN1bi5jb20+CisJICBQYXRjaCBCeTogR2FycmV0dCBEJ0Ftb3JlIDxnYXJyZXR0LmRhbW9yZUBzdW4uY29tPgorCisyMDA5LTA2LTE5IDE2OjIxOjI4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zczQvb3NzNC1taXhlci5jOgorCSAgTWFrZSBidWlsZCB3aXRob3V0IHdhcm5pbmdzIHdpdGggZGVidWdnaW5nIGRpc2FibGVkCisKKzIwMDgtMTEtMDQgMTI6NDI6MzAgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgRG9uJ3QgaW5zdGFsbCBzdGF0aWMgbGlicyBmb3IgcGx1Z2lucy4gRml4ZXMgIzU1MDg1MSBmb3IgLWJhZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYWxzYXNwZGlmL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYW1yd2IvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hcGV4c2luay9NYWtlZmlsZS5hbToKKwkgICogZXh0L2FydHMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hcnRzZC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2F1ZGlvZmlsZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2F1ZGlvcmVzYW1wbGUvTWFrZWZpbGUuYW06CisJICAqIGV4dC9iejIvTWFrZWZpbGUuYW06CisJICAqIGV4dC9jZGF1ZGlvL01ha2VmaWxlLmFtOgorCSAgKiBleHQvY2VsdC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2RjMTM5NC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2RpcmFjL01ha2VmaWxlLmFtOgorCSAgKiBleHQvZGlyZWN0ZmIvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kaXZ4L01ha2VmaWxlLmFtOgorCSAgKiBleHQvZHRzL01ha2VmaWxlLmFtOgorCSAgKiBleHQvZmFhYy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2ZhYWQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9nc20vTWFrZWZpbGUuYW06CisJICAqIGV4dC9oZXJtZXMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9pdm9yYmlzL01ha2VmaWxlLmFtOgorCSAgKiBleHQvamFjay9NYWtlZmlsZS5hbToKKwkgICogZXh0L2pwMmsvTWFrZWZpbGUuYW06CisJICAqIGV4dC9sYWRzcGEvTWFrZWZpbGUuYW06CisJICAqIGV4dC9sY3MvTWFrZWZpbGUuYW06CisJICAqIGV4dC9saWJmYW1lL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbGlibW1zL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbWV0YWRhdGEvTWFrZWZpbGUuYW06CisJICAqIGV4dC9tcGVnMmVuYy9NYWtlZmlsZS5hbToKKwkgICogZXh0L21wbGV4L01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXVzZXBhY2svTWFrZWZpbGUuYW06CisJICAqIGV4dC9tdXNpY2JyYWluei9NYWtlZmlsZS5hbToKKwkgICogZXh0L215dGh0di9NYWtlZmlsZS5hbToKKwkgICogZXh0L25hcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L25lb24vTWFrZWZpbGUuYW06CisJICAqIGV4dC9vZmEvTWFrZWZpbGUuYW06CisJICAqIGV4dC9wb2x5cC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3Jlc2luZHZkL01ha2VmaWxlLmFtOgorCSAgKiBleHQvc2RsL01ha2VmaWxlLmFtOgorCSAgKiBleHQvc2hvdXQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zbmFwc2hvdC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NuZGZpbGUvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zb3VuZHRvdWNoL01ha2VmaWxlLmFtOgorCSAgKiBleHQvc3BjL01ha2VmaWxlLmFtOgorCSAgKiBleHQvc3dmZGVjL01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGFya2luL01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGhlb3JhL01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGltaWRpdHkvTWFrZWZpbGUuYW06CisJICAqIGV4dC90d29sYW1lL01ha2VmaWxlLmFtOgorCSAgKiBleHQveDI2NC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3hpbmUvTWFrZWZpbGUuYW06CisJICAqIGV4dC94dmlkL01ha2VmaWxlLmFtOgorCSAgKiBnc3QtbGlicy9nc3QvYXBwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QtbGlicy9nc3QvZHNob3cvTWFrZWZpbGUuYW06CisJICAqIGdzdC9haWZmcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hcHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdWRpb2J1ZmZlci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2JheWVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvY2R4YXBhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvY2hhcnQvTWFrZWZpbGUuYW06CisJICAqIGdzdC9jb2xvcnNwYWNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZGNjcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RlaW50ZXJsYWNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZHZkc3B1L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZmVzdGl2YWwvTWFrZWZpbGUuYW06CisJICAqIGdzdC9maWx0ZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9mbGFjcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9mbHYvTWFrZWZpbGUuYW06CisJICAqIGdzdC9nYW1lcy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2gyNjRwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2xpYnJmYi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21peG1hdHJpeC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21vZHBsdWcvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tcGVnMXN5cy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21wZWc0dmlkZW9wYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21wZWdkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21wZWd0c211eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21wZWd2aWRlb3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXZlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbnNmL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbnV2ZGVtdXgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9vdmVybGF5L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcGFzc3Rocm91Z2gvTWFrZWZpbGUuYW06CisJICAqIGdzdC9wY2FwcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9wbGF5b25kZW1hbmQvTWFrZWZpbGUuYW06CisJICAqIGdzdC9yYXdwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3JlYWwvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydGpwZWcvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc2NhbGV0ZW1wby9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NkcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NlbGVjdG9yL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc21vb3RoL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc21vb3Rod2F2ZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NwZWVkL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3BlZXhyZXNhbXBsZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3N0ZXJlby9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3N1YmVuYy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3R0YS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3ZiaWRlYy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3ZpZGVvZHJvcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3ZpZGVvc2lnbmFsL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlydHVhbGR1Yi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3ZtbmMvTWFrZWZpbGUuYW06CisJICAqIGdzdC95NG0vTWFrZWZpbGUuYW06CisJICAqIHN5cy9hY21lbmMvTWFrZWZpbGUuYW06CisJICAqIHN5cy9jZHJvbS9NYWtlZmlsZS5hbToKKwkgICogc3lzL2RzaG93ZGVjd3JhcHBlci9NYWtlZmlsZS5hbToKKwkgICogc3lzL2RzaG93c3Jjd3JhcHBlci9NYWtlZmlsZS5hbToKKwkgICogc3lzL2R2Yi9NYWtlZmlsZS5hbToKKwkgICogc3lzL2R4cjMvTWFrZWZpbGUuYW06CisJICAqIHN5cy9mYmRldi9NYWtlZmlsZS5hbToKKwkgICogc3lzL29zczQvTWFrZWZpbGUuYW06CisJICAqIHN5cy9xY2FtL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvcXR3cmFwcGVyL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvdmNkL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvd2luaW5ldC9NYWtlZmlsZS5hbToKKwkgICogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgRG9uJ3QgaW5zdGFsbCBzdGF0aWMgbGlicyBmb3IgcGx1Z2lucy4gRml4ZXMgIzU1MDg1MSBmb3IgLWJhZC4KKworMjAwOC0xMC0xMiAyMTo1MjoyNyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHN5cy9vc3M0LzogQWRkIHNvbWUgc3BhY2VzIGluIHRyYW5zbGF0ZWFibGUgc3RyaW5ncy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6CisJICAqIHN5cy9vc3M0L29zczQtc2luay5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOgorCSAgQWRkIHNvbWUgc3BhY2VzIGluIHRyYW5zbGF0ZWFibGUgc3RyaW5ncy4KKwkgIEZpeGVzOiAjNTU1OTY5ICM1NTU5NjggIzU1NTk2NQorCisyMDA4LTA4LTA3IDE2OjIwOjMwICswMDAwICBGcmVkZXJpYyBDcm96YXQgPGZjcm96YXRAbWFuZHJpdmEub3JnPgorCisJICBNYWtlIHN1cmUgZ2V0dGV4dCByZXR1cm5zIHRyYW5zbGF0aW9ucyBpbiBVVEYtOCBlbmNvZGluZyByYXRoZXIgdGhhbiBpbiB0aGUgY3VycmVudCBsb2NhbGUgZW5jb2RpbmcgKCM1NDY4MjIpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogRnJlZGVyaWMgQ3JvemF0IDxmY3JvemF0QG1hbmRyaXZhLm9yZz4KKwkgICogZXh0L3NuZGZpbGUvZ3N0c2YuYzogKHBsdWdpbl9pbml0KToKKwkgICogc3lzL2R2Yi9nc3RkdmJzcmMuYzogKGdzdF9kdmJzcmNfcGx1Z2luX2luaXQpOgorCSAgKiBzeXMvb3NzNC9vc3M0LWF1ZGlvLmM6IChwbHVnaW5faW5pdCk6CisJICBNYWtlIHN1cmUgZ2V0dGV4dCByZXR1cm5zIHRyYW5zbGF0aW9ucyBpbiBVVEYtOCBlbmNvZGluZyByYXRoZXIKKwkgIHRoYW4gaW4gdGhlIGN1cnJlbnQgbG9jYWxlIGVuY29kaW5nICgjNTQ2ODIyKS4KKworMjAwOC0wNi0xNiAwNzozMDozNCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBGaW5hbCByb3VuZCBvZiBkb2MgdXBkYXRlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgICogZ3N0L3NwZWVkL2dzdHNwZWVkLmM6CisJICAqIGdzdC9zcGVleHJlc2FtcGxlL2dzdHNwZWV4cmVzYW1wbGUuYzoKKwkgICogZ3N0L3ZpZGVvc2lnbmFsL2dzdHZpZGVvYW5hbHlzZS5jOgorCSAgKiBnc3QvdmlkZW9zaWduYWwvZ3N0dmlkZW9kZXRlY3QuYzoKKwkgICogZ3N0L3ZpZGVvc2lnbmFsL2dzdHZpZGVvbWFyay5jOgorCSAgKiBzeXMvZHZiL2dzdGR2YnNyYy5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6CisJICAqIHN5cy9vc3M0L29zczQtc2luay5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOgorCSAgKiBzeXMvd2luaW5ldC9nc3R3aW5pbmV0c3JjLmM6CisJICBGaW5hbCByb3VuZCBvZiBkb2MgdXBkYXRlcy4KKworMjAwOC0wNi0xMiAxNDo0OToxOCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBEbyBub3QgdXNlIHNob3J0X2Rlc2NyaXB0aW9uIGluIHNlY3Rpb24gZG9jcyBmb3IgZWxlbWVudHMuIFdlIGV4dHJhY3QgdGhlbSBmcm9tIGVsZW1lbnQgZGV0YWlscyBhbmQgdGhlcmUgd2lsbCBiZSB3YXIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZGMxMzk0L2dzdGRjMTM5NC5jOgorCSAgKiBleHQvaXZvcmJpcy92b3JiaXNkZWMuYzoKKwkgICogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSAgKiBleHQvbWV0YWRhdGEvZ3N0bWV0YWRhdGFkZW11eC5jOgorCSAgKiBleHQvbXl0aHR2L2dzdG15dGh0dnNyYy5jOgorCSAgKiBleHQvdGhlb3JhL3RoZW9yYWRlYy5jOgorCSAgKiBnc3QtbGlicy9nc3QvYXBwL2dzdGFwcHNpbmsuYzoKKwkgICogZ3N0L2JheWVyL2dzdGJheWVyMnJnYi5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgICogZ3N0L3Jhd3BhcnNlL2dzdGF1ZGlvcGFyc2UuYzoKKwkgICogZ3N0L3Jhd3BhcnNlL2dzdHZpZGVvcGFyc2UuYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGNsaWVudC5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgKiBnc3Qvc2VsZWN0b3IvZ3N0aW5wdXRzZWxlY3Rvci5jOgorCSAgKiBnc3Qvc2VsZWN0b3IvZ3N0b3V0cHV0c2VsZWN0b3IuYzoKKwkgICogZ3N0L3ZpZGVvc2lnbmFsL2dzdHZpZGVvYW5hbHlzZS5jOgorCSAgKiBnc3QvdmlkZW9zaWduYWwvZ3N0dmlkZW9kZXRlY3QuYzoKKwkgICogZ3N0L3ZpZGVvc2lnbmFsL2dzdHZpZGVvbWFyay5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6CisJICAqIHN5cy9vc3M0L29zczQtc2luay5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOgorCSAgRG8gbm90IHVzZSBzaG9ydF9kZXNjcmlwdGlvbiBpbiBzZWN0aW9uIGRvY3MgZm9yIGVsZW1lbnRzLiBXZSBleHRyYWN0CisJICB0aGVtIGZyb20gZWxlbWVudCBkZXRhaWxzIGFuZCB0aGVyZSB3aWxsIGJlIHdhcm5pbmdzIGlmIHRoZXkgZGlmZmVyLgorCSAgQWxzbyBmaXhpbmcgdXAgdGhlIENoYW5nZUxvZyBvcmRlci4KKworMjAwOC0wNi0xMiAxMzowNjozNyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICB0ZXN0cy9pY2xlcy90ZXN0LW9zczQuYzogSW5jbHVkZSBzdGRsaWIuaC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9pY2xlcy90ZXN0LW9zczQuYzoKKwkgIEluY2x1ZGUgc3RkbGliLmguCisKKzIwMDgtMDUtMjIgMTY6MzM6MjUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHRlc3RzL2ljbGVzLzogU21hbGwgb3NzNCB0ZXN0IHRoYXQgcHJvYmVzIGZvciBhdmFpbGFibGUgZGV2aWNlcyBhbmQgcmV0cmlldmVzIHRoZWlyIGNhcHMgYW5kIG1peGVyIHRyYWNrcyBhbmQgYWxsIHRoYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2ljbGVzLy5jdnNpZ25vcmU6CisJICAqIHRlc3RzL2ljbGVzL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9pY2xlcy90ZXN0LW9zczQuYzogKG9wdF9zaG93X21peGVyX21lc3NhZ2VzKSwgKFdBSVRfVElNRSksCisJICAoc2hvd19taXhlcl9tZXNzYWdlcyksIChwcm9iZV9taXhlcl90cmFja3MpLCAocHJvYmVfcGFkKSwKKwkgIChwcm9iZV9kZXRhaWxzKSwgKHByb2JlX2VsZW1lbnQpLCAobWFpbik6CisJICBTbWFsbCBvc3M0IHRlc3QgdGhhdCBwcm9iZXMgZm9yIGF2YWlsYWJsZSBkZXZpY2VzIGFuZCByZXRyaWV2ZXMKKwkgIHRoZWlyIGNhcHMgYW5kIG1peGVyIHRyYWNrcyBhbmQgYWxsIHRoYXQuIEFsc28gYWxsb3dzIHRlc3Rpbmcgb2YKKwkgIG1peGVyIGNoYW5nZSBtZXNzYWdlcyBvbiB0aGUgYnVzLgorCisyMDA4LTA1LTIyIDE1OjE0OjI2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvb3NzNC86IE1ha2UgZGV2aWNlLW5hbWUgcHJvYmluZyBpbiBOVUxMIHN0YXRlIHdvcmsgYmV0dGVyIChlLmcuIGZvciB0aGUgZ25vbWUtY29udHJvbC1jZW50ZXIgc291bmQgY2FwcGxldCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL29zczQvb3NzNC1taXhlci5jOiAoZ3N0X29zczRfbWl4ZXJfb3Blbik6CisJICAqIHN5cy9vc3M0L29zczQtcHJvcGVydHktcHJvYmUuYzoKKwkgIChnc3Rfb3NzNF9wcm9wZXJ0eV9wcm9iZV9maW5kX2RldmljZV9uYW1lKSwKKwkgIChnc3Rfb3NzNF9wcm9wZXJ0eV9wcm9iZV9maW5kX2RldmljZV9uYW1lX25vZmQpOgorCSAgKiBzeXMvb3NzNC9vc3M0LXByb3BlcnR5LXByb2JlLmg6CisJICAqIHN5cy9vc3M0L29zczQtc2luay5jOiAoZ3N0X29zczRfc2lua19nZXRfcHJvcGVydHkpOgorCSAgKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOiAoZ3N0X29zczRfc291cmNlX2dldF9wcm9wZXJ0eSk6CisJICBNYWtlIGRldmljZS1uYW1lIHByb2JpbmcgaW4gTlVMTCBzdGF0ZSB3b3JrIGJldHRlciAoZS5nLiBmb3IgdGhlCisJICBnbm9tZS1jb250cm9sLWNlbnRlciBzb3VuZCBjYXBwbGV0KS4KKworMjAwOC0wNS0wOCAxOToxNjoxNyArMDAwMCAgQ2xpdmUgV3JpZ2h0IDxjbGl2ZV93cmlnaHRAbnRsd29ybGQuY29tPgorCisJICBzeXMvb3NzNC9vc3M0LW1peGVyLXNsaWRlci5jOiBBcHBhcmVudGx5IG1vbm8gc2xpZGVycyBoYXZlIHRoZSBtb25vIHZhbHVlIHJlcGVhdGVkIGluIHRoZSB1cHBlciBiaXRzLCBzbyBtYXNrIHRob3NlIG8uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IENsaXZlIFdyaWdodCA8Y2xpdmVfd3JpZ2h0IG50bHdvcmxkIGNvbT4KKwkgICogc3lzL29zczQvb3NzNC1taXhlci1zbGlkZXIuYzogKGdzdF9vc3M0X21peGVyX3NsaWRlcl91bnBhY2tfdm9sdW1lKToKKwkgIEFwcGFyZW50bHkgbW9ubyBzbGlkZXJzIGhhdmUgdGhlIG1vbm8gdmFsdWUgcmVwZWF0ZWQgaW4gdGhlIHVwcGVyIGJpdHMsCisJICBzbyBtYXNrIHRob3NlIG91dCB3aGVuIHJlYWRpbmcgdGhlbS4gUHJvYmFibHkgbWFrZXMgdGhlIG1peGVyIGFwcGxldAorCSAgd29yayBwcm9wZXJseSBpbiBzb21lIG1vcmUgY2FzZXMuCisKKzIwMDgtMDQtMTEgMDg6MTM6MjIgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBzeXMvb3NzNC86IEZpeCBhcmd1bWVudHMgZm9ybWF0IGluIGRlYnVnIHN0YXRlbWVudHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDgtMDQtMTEgIEp1bGllbiBNb3V0dGUgIDxqdWxpZW5AZmx1ZW5kby5jb20+CisJICAqIHN5cy9vc3M0L29zczQtbWl4ZXItZW51bS5jOgorCSAgKGdzdF9vc3M0X21peGVyX2VudW1fZ2V0X3ZhbHVlc19sb2NrZWQpOgorCSAgKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOiAoZ3N0X29zczRfc291cmNlX2RlbGF5KTogRml4IGFyZ3VtZW50cworCSAgZm9ybWF0IGluIGRlYnVnIHN0YXRlbWVudHMuCisKKzIwMDgtMDQtMDIgMjA6MTg6NTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIE9TU3Y0LiBNaXhlciBzdGlsbCBuZWVkcyBhIGJpdCBtb3JlIGxvdmUsIGJ1dCBldmVuIG1hZ2ljIGhhcyBpdHMgbGltaXRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogc3lzL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3NzNC9NYWtlZmlsZS5hbToKKwkgICogc3lzL29zczQvb3NzNC1hdWRpby5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LWF1ZGlvLmg6CisJICAqIHN5cy9vc3M0L29zczQtbWl4ZXItZW51bS5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LW1peGVyLWVudW0uaDoKKwkgICogc3lzL29zczQvb3NzNC1taXhlci1zbGlkZXIuYzoKKwkgICogc3lzL29zczQvb3NzNC1taXhlci1zbGlkZXIuaDoKKwkgICogc3lzL29zczQvb3NzNC1taXhlci1zd2l0Y2guYzoKKwkgICogc3lzL29zczQvb3NzNC1taXhlci1zd2l0Y2guaDoKKwkgICogc3lzL29zczQvb3NzNC1taXhlci5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LW1peGVyLmg6CisJICAqIHN5cy9vc3M0L29zczQtcHJvcGVydHktcHJvYmUuYzoKKwkgICogc3lzL29zczQvb3NzNC1wcm9wZXJ0eS1wcm9iZS5oOgorCSAgKiBzeXMvb3NzNC9vc3M0LXNpbmsuYzoKKwkgICogc3lzL29zczQvb3NzNC1zaW5rLmg6CisJICAqIHN5cy9vc3M0L29zczQtc291bmRjYXJkLmg6CisJICAqIHN5cy9vc3M0L29zczQtc291cmNlLmM6CisJICAqIHN5cy9vc3M0L29zczQtc291cmNlLmg6CisJICBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBPU1N2NC4gTWl4ZXIgc3RpbGwgbmVlZHMgYSBiaXQgbW9yZSBsb3ZlLAorCSAgYnV0IGV2ZW4gbWFnaWMgaGFzIGl0cyBsaW1pdHMuCisKKzIwMTAtMDUtMTEgMTA6NTI6NTggKzAyMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cuaDoKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5tOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiBpbXBsZW1lbnQgdGhlIHhvdmVybGF5IGludGVyZmFjZS4gRml4ZXMgIzYxODM0OS4KKworMjAxMC0wNS0xMSAxODo0MjozMiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBwdXNoIGJhc2VkIHNlZWtpbmcKKwkgIC4uLiB3aGVyZSBpdCBjb21lcyBkb3duIHRvIHRyYW5zZm9ybWluZyBpbmNvbWluZyBCWVRFIHNlZ21lbnQKKwkgIHRvIGEgY29ycmVzcG9uZGluZyBUSU1FIHNlZ21lbnQuCisJICBBbHNvIGZpeGVzICM2MDk0MDUuCisKKzIwMTAtMDUtMTEgMTQ6MjM6NDcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSAgTW92ZSBpbWFnZWZyZWV6ZSBwbHVnaW4gZnJvbSAtYmFkIHRvIC1nb29kCisJICBIb29rIHVwIGJ1aWxkIGluZnJhc3RydWN0dXJlLCBkb2NzIGFuZCB1bml0IHRlc3QgZm9yIG5ldyBwbHVnaW4uCisJICBGaXhlcyAjNjEzNzg2LgorCisyMDEwLTA1LTA1IDEyOjIzOjU2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogU2V0IGZpeGVkIGNhcHMgb24gdGhlIGNvcnJlY3QgcGFkCisJICBUaGlzIG1ha2VzIHRoZSBzaW5rIGdldGNhcHMgZnVuY3Rpb24gYWN0dWFsbHkgdXNlZCBpbnN0ZWFkIG9mIHVzaW5nCisJICB0aGUgZml4ZWQgY2FwcyBmdW5jdGlvbiBmb3IgaXQuCisKKzIwMTAtMDMtMjEgMjE6Mzk6MTggKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW1hZ2VmcmVlemUuYzoKKwkgIEFkZCAtV21pc3NpbmctZGVjbGFyYXRpb25zIC1XbWlzc2luZy1wcm90b3R5cGVzIHRvIGNvbmZpZ3VyZSBmbGFncworCSAgQW5kIGZpeCBhbGwgd2FybmluZ3MKKworMjAxMC0wMy0xNSAxMTo1NDowMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IE9ubHkgc3RhcnQgdGhlIHRhc2sgYWZ0ZXIgYSBzZWVrIGlmIGEgYnVmZmVyIHdhcyByZWNlaXZlZCBhbHJlYWR5CisKKzIwMTAtMDItMjggMTY6MDg6MTQgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IEFkZCBzb21lIHVuaXQgdGVzdHMKKworMjAxMC0wMi0yOCAxNjowNDozMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IFNldCB1bmRlZmluZWQgZnJhbWVyYXRlIGluIHNpbmsgZ2V0Y2FwcyBmdW5jdGlvbgorCisyMDEwLTAyLTI4IDE1OjAyOjAyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogSW1wbGVtZW50IHJldmVyc2UgcGxheWJhY2sgYW5kIHNldCBidWZmZXIgb2Zmc2V0cworCisyMDEwLTAyLTI3IDE3OjMzOjA1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ltYWdlZnJlZXplL01ha2VmaWxlLmFtOgorCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuaDoKKwkgIGltYWdlZnJlZXplOiBBZGQgc3RpbGwgZnJhbWUgc3RyZWFtIGdlbmVyYXRvciBlbGVtZW50CisKKzIwMTAtMDUtMTEgMTM6MDc6MTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZ3N0L2RlYnVndXRpbHMvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVidWd1dGlscy9nc3RkZWJ1Zy5jOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSAgTW92ZSBjYXBzZmlsdGVyIGVsZW1lbnQgZnJvbSAtYmFkIHRvIC1nb29kCisJICBIb29rIHVwIG1vdmVkIGZpbGVzIHRvIHRoZSBidWlsZCBpbmZyYXN0cnVjdHVyZSBhbmQgZG9jcy4KKwkgIEZpeGVzICM2MTc3MzkuCisKKzIwMTAtMDUtMDYgMTM6MTI6MzIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmg6CisJICBjYXBzc2V0dGVyOiBTb21lIG1pbm9yIGNsZWFudXAKKworMjAxMC0wMy0yMiAxNjo1NjowMyArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jYXBzc2V0dGVyLmM6CisJICBBZGQgLVdvbGQtc3R5bGUtZGVmaW5pdGlvbgorCSAgYW5kIGZpeCB0aGUgd2FybmluZ3MKKworMjAxMC0wMy0xOCAxNzozMDoyNiArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBnc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmM6CisJICBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlscyA9PiBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUKKworMjAwOS0xMC0wOCAxOTo1MTozMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NhcHNzZXR0ZXIuYzoKKwkgIGNhcHNzZXR0ZXI6IGFkZCB1bml0IHRlc3QKKworMjAwOS0wNi0yNSAxNjo0MTo0OSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNzZXR0ZXIuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNzZXR0ZXIuaDoKKwkgIGNhcHNzZXR0ZXI6IGltcG9ydCBlbGVtZW50IGludG8gLWJhZAorCisyMDEwLTA1LTExIDEyOjA2OjEwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogY2hlY2sgdGhhdCBwYWRzIGhhdmUgYmVlbiBuZWdvdGlhdGVkCisJICBBbHNvIHNldCBmY2NfaGFuZGxlciBmaWVsZCBpbiBhdWRpbyBzdHJlYW0gaGVhZGVyLgorCSAgRml4ZXMgIzYxODM1MS4KKworMjAxMC0wNS0xMCAxODozMzowMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBwYXJ0aWFsIHBhcnNpbmcgb2YgY3R0cyB0YWJsZQorCSAgRml4ZXMgIzYxNjUxNi4KKworMjAxMC0wNS0xMCAxODozMjoxNSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGNsZWFudXAgYSBjb21tZW50IGFuZCBhZGQgc29tZSBkZWJ1ZyBhbmQgY29uZGl0aW9uYWwgY29tcGlsYXRpb24KKworMjAxMC0wNS0xMSAxMDowMTo1MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogQ2hlY2sgZm9yIEdUSysgMy4wIGFuZCBpZiBpdCdzIG5vdCBhdmFpbGFibGUgZm9yIEdUSysgMi4wCisKKzIwMTAtMDUtMTAgMjI6MTE6MTAgKzAyMDAgIEphbiBVcmJhxYRza2kgPHd1bGN6ZXJAd3VsY3plci5vcmc+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IG9ubHkgc3RvcmUgdGhlIGxhc3QgYnVmZmVyIHRpbWVzdGFtcCBpZiBpdCdzIHZhbGlkCisJICBGaXhlcyBidWcgIzYxODMwNQorCisyMDEwLTAxLTA4IDIyOjEzOjU5IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwaDI2NHBheTogUmUtc2VuZCBTUFMvUFBTIHdoZW4gcmVxdWVzdGVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjA2Njg5CisKKzIwMTAtMDUtMDcgMTc6MDk6MTYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IGZpeCB0eXBvIGluIGRlYnVnIG1lc3NhZ2UKKworMjAxMC0wNS0wNyAxNTo0MjoyMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5oOgorCSAgcnRwdGhlb3JhcGF5OiBhZGQgY29uZmlnLWludGVydmFsIHBhcmFtZXRlciB0byByZS1pbnNlcnQgY29uZmlnIGluIHN0cmVhbQorCSAgQWRkIGEgbmV3IGNvbmZpZy1pbnRlcnZhbCBwcm9wZXJ0eSB0byBpbnN0cnVjdCB0aGUgcGF5bG9hZGVyIHRvIGluc2VydAorCSAgY29uZmlndXJhdGlvbiBoZWFkZXJzIGF0IHBlcmlvZGljIGludGVydmFscyBpbiB0aGUgc3RyZWFtCisJICAod2hlbiBhIGtleWZyYW1lIGlzIGNvdW50ZXJlZCkuCisKKzIwMTAtMDUtMDcgMTU6MzE6MDMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJICBydHB0aGVvcmFkZXBheTogZml4IGluLWJhbmQgY29uZmlndXJhdGlvbiBwYXJzaW5nCisJICBBbHNvIG1ha2UgY29uZmlndXJhdGlvbiBoZWFkZXIgcGFyc2luZyBhIGJpdCBtb3JlIHJlbGF4ZWQgd2l0aCByZXNwZWN0CisJICB0byBsZW5ndGggZmllbGQgaW50ZXJwcmV0YXRpb24uCisKKzIwMTAtMDUtMDcgMTU6MzA6MzAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJICBydHB2b3JiaXNkZXBheTogZml4IGluLWxpbmUgY29uZmlndXJhdGlvbiBwYXJzaW5nCisJICBBbHNvIG1ha2UgY29uZmlndXJhdGlvbiBoZWFkZXIgcGFyc2luZyBhIGJpdCBtb3JlIHJlbGF4ZWQgd2l0aCByZXNwZWN0CisJICB0byBsZW5ndGggZmllbGQgaW50ZXJwcmV0YXRpb24uCisKKzIwMTAtMDUtMDQgMTY6NTc6MzUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgcnRwdGhlb3JhcGF5OiBkbyBub3QgZGlzY2FyZCBkb3duc3RyZWFtIGZsb3cgcmV0dXJuCisKKzIwMTAtMDUtMDQgMTY6NTc6MTEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgcnRwdGhlb3JhcGF5OiByZWZhY3RvciBidWZmZXIgcGF5bG9hZGluZworCisyMDEwLTA1LTA3IDIwOjQxOjA0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHkuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyYmxlbmQuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvc2NhbGVyYm9iLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3ZmaXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmUuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmViZmYuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmV0ZmYuYzoKKwkgIGRlaW50ZXJsYWNlOiBBZGQgc3VwcG9ydCBmb3IgVVlWWQorCisyMDEwLTA1LTA3IDE5OjA2OjM1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBmaXggcmV0dXJuIHZhbHVlCisKKzIwMTAtMDUtMDcgMTk6MDI6MjEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGRvbid0IGxlYWsgdGhlIHNlc3Npb24KKworMjAxMC0wNS0wNyAxODo1OTo0MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcDogY29uZmlndXJlIGJhbmR3aWR0aCBwcm9wZXJ0aWVzIGluIHRoZSBzZXNzaW9uCisKKzIwMTAtMDUtMDcgMTg6NTg6NTggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGFkZCBwcm9wZXJ0aWVzIHRvIGNvbmZpZ3VyZSB0aGUgYmFuZHdpZHRoCisJICBBZGQgcHJvcGVydGllcyB0byBwcm94eSB0aGUgYmFuZHdpZHRoIGNvbmZpZ3VyYXRpb24gdG8gdGhlIHNlc3Npb24gb2JqZWN0LgorCisyMDEwLTA1LTA3IDE4OjU3OjEzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBzZXNzaW9uOiBhZGQgcHJvcGVydGllcyB0byBjb25maWd1cmUgYmFuZHdpZHRocworCSAgQWRkIHByb3BlcnRpZXMgdG8gY29uZmlndXJlIHRoZSBzZW5kZXIgYW5kIHJlY2VpdmVyIGJhbmR3aWR0aHMuCisJICBDb25maWd1cmUgdGhlIGJhbmR3aWR0aHMgYmVmb3JlIGNhbGN1bGF0aW5nIHRoZSBSVENQIHRpbWVvdXQgd2hlbiB3ZSBuZWVkIHRvLgorCisyMDEwLTA1LTA3IDE4OjU2OjMwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSAgcnRwc3RhdHM6IGFkZCBzb21lIGRlYnVnIGluZm8KKworMjAxMC0wNS0wNyAxODo1NTozNCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogc21hbGwgY2xlYW51cHMKKworMjAxMC0wNS0wNyAxNjo1NToxMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmg6CisJICBydHBzdGF0czogbWFrZSBiYW5kd2lkdGhzIG1vcmUgY29uZmlndXJhYmxlCisJICBBZGQgYSBtZXRob2QgdG8gY29uZmlndXJlIHRoZSB2YXJpb3VzIGJhbmR3aWR0aHMgaW4gdGhlIHNlc3Npb24uCisKKzIwMTAtMDUtMDcgMTM6MzI6MzAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGhhbmRsZSBOT05FIFJUQ1AgaW50ZXJ2YWxzCisJICBQcmVwYXJlIGZvciBoYW5kbGluZyBSVENQIHJlcG9ydGluZyBpbnRlcnZhbHMgb2YgR1NUX0NMT0NLX1RJTUVfTk9ORSwgd2hpY2gKKwkgIG1lYW5zIGRvbid0IHNlbmQgUlRDUCBhdCBhbGwuCisKKzIwMTAtMDUtMDcgMTI6NTE6MDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IGZhbGwgYmFjayB0byBTRFAgcG9ydHMgaW5zdGVhZCBvZiBzZXJ2ZXJfcG9ydAorCSAgSW4gbXVsdGljYXN0LCBmYWxsIGJhY2sgdG8gdGhlIHBvcnRzIGluIHRoZSBTRFAgaW5zdGVhZCBvZiB0aGUgc2VydmVyX3BvcnQKKwkgIGF0dHJpYnV0ZSBhcyB0aGlzIGlzIG1vcmUgaW4gbGluZSB3aXRoIHRoZSBSRkMuCisKKzIwMTAtMDUtMDcgMTI6MjQ6NTEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHJlZmFjdG9yIGNvbGxlY3RpbmcgdGhlIHRyYW5zcG9ydCBpbmZvCisJICBNYWtlIGEgbWV0aG9kIHRvIGNvbGxlY3QgdGhlIHBvcnRzIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzLgorCisyMDEwLTA1LTA3IDExOjI4OjM2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBoYW5kbGUgc2VydmVycyB0aGF0IHNlbmQgYnJva2VuIFRyYW5zcG9ydHMKKwkgIEhhbmRsZSBzZXJ2ZXJzIHRoYXQgc2VuZCB0aGVpciBwb3J0IHBhaXJzIHdpdGggdGhlIHdyb25nIG5hbWUuCisJICBGaXhlcyAjNjE3NTM3CisKKzIwMTAtMDUtMDYgMTY6NTI6MjYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IHVzZSB0aGUgU0RQIGNvbm5lY3Rpb24gaW5mbyBpbiBtdWx0aWNhc3QKKwkgIFBhcnNlIHRoZSBjb25uZWN0aW9uIGluZm8gZnJvbSB0aGUgU0RQLgorCSAgV2hlbiB3ZSBuZWVkIHRvIGNvbmZpZ3VyZSB0aGUgbXVsdGljYXN0IGRlc3RpbmF0aW9uLCBmYWxsIGJhY2sgdG8gdGhlIFNEUAorCSAgY29ubmVjdGlvbiBpbmZvIHdoZW4gdGhlIHRyYW5zcG9ydCBkaWQgbm90IHNwZWNpZnkgYSBkZXN0aW5hdGlvbiBhbmQgdHRsLgorCSAgRml4ZXMgIzYxNzUzNworCisyMDEwLTA1LTA2IDE1OjQyOjM4ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkqIGdzdC9nb29tMmsxL2dzdGdvb20uYzoKKwkqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6CisJICBnb29tLG1vbm9zY29wZTogdHJ1bmNhdGUgb3duIGNhcHMsIGluc3RlYWQgb2YgY29weWluZyBhbmQgdXNpbmcgdGhlIGZpcnN0IG9ubHkKKwkgIFdlIGdvdCB0aGUgY2FwcyBmcm9tIGFuIGludGVyc2VjdCwgaXQgaXMgb3VyIG93biwgaGVuY2Ugd2UgY2FuIHRydW5jYXRlIGl0LgorCisyMDEwLTA1LTA2IDE1OjQwOjMzICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2VzcmM6IHJlZmxvdyB0byB0cnVuY2F0ZSBjYXBzIGp1c3Qgb25jZQorCSAgV2UgZ2V0IHdyaXRhYmxlIGNwYXMgZnJvbSB0aGUgaW50ZXJzZWN0aW9uICh1bmxlc3MgaXQgZmFpbGVkKS4gQXMgd2UgdHJ1bmNhdGUKKwkgIHRob3NlIGFueXdheSwgd2UgZG9uJ3QgbmVlZCB0byBtYW55YWx5IGNvcHkgdGhlIGZpcnN0IHN0cnVjdHVyZS4KKworMjAxMC0wNS0wNiAxNTozOTozMSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzoKKwkgIGdka3BpeGJ1ZjogZG9uJ3QgbGVhayB0ZW1wbGF0ZSBjYXBzCisKKzIwMTAtMDUtMDYgMTU6Mzg6MzUgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkgIGF1dG97YXVkaW8sdmlkZW99e3NyYyxzaW5rfTogdXNlIGNhbl9pbnRlcnNlY3QgdG8gYXZvaWQgYSBjYXBzIGNvcHkKKworMjAxMC0wNC0yNyAxMzozNjozNSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogdGVsbCB3aGF0IHdlIGNhbiBkbworCSAgQW55LWNhcHMgYXJlIGJhZC4gSWYgYXBwcyBzY2FuIHRoZSByZWdpc3RyeSwgdGhleSdkIGxpa2UgdG8ga25vdyB3aGF0IHdlIGNhbgorCSAgb3V0cHV0LgorCisyMDEwLTA0LTI3IDEzOjQzOjI5ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWdlbmM6IGFsc28gbGlmdCB0aGUgYXJiaXRyYXJ5IHJlc3RyaWN0aW9ucyBmb3Igd2lkdGggYW5kIGhlaWdodAorCSAgVGhpcyB3YXMgYWxyZWFkeSBkb25lIGZvciBqcGVnZGVjLgorCisyMDEwLTA1LTA2IDE0OjAzOjExICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogQWxsb2NhdGUvZnJlZSBQQSBtYWlubG9vcCBkdXJpbmcgc3RhdGUgY2hhbmdlcworCSAgLi4uYWxzbyBkZXN0cm95IHRoZSBzdHJlYW0gYW5kIGNvbnRleHQgZHVyaW5nIHN0YXRlIGNoYW5nZXMuCisKKzIwMTAtMDUtMDYgMTM6NTc6MDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IEFsbG9jYXRlIGFuZCBmcmVlIHRoZSBjdXN0b20gY2xvY2sgaW4gTlVMTDwtPlJFQURZCisKKzIwMTAtMDUtMDYgMTM6NTE6NTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IENyZWF0ZSBhbmQgZnJlZSB0aGUgUEEgbWFpbmxvb3AgaW4gTlVMTC0+UkVBRFkvUkVBRFktPk5VTEwKKwkgIFRoaXMgZml4ZXMgYSByYWNlIGNvbmRpdGlvbiwgd2hlbiBzdG9wcGluZyB0aGUgbWFpbmxvb3AgZHVyaW5nIGZpbmFsaXphdGlvbgorCSAgaXMgZG9uZSBmcm9tIGEgbWFpbmxvb3AgY2FsbGJhY2suCisJICBGaXhlcyBidWdzICM2MTQ3NjUgYW5kICM1OTA2NjIuCisKKzIwMTAtMDUtMDUgMTk6MzU6NDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBNYWtlIHNlbGVjdGlvbiBvZiBhIHNpbmtwYWQgbnVtYmVyIHRocmVhZHNhZmUKKworMjAxMC0wNS0wNSAxNzozOTozMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlbWV0aG9kLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaDoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5LmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2xpbmVhci5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXJibGVuZC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9zY2FsZXJib2IuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdmZpci5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZWJmZi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZXRmZi5jOgorCSAgZGVpbnRlcmxhY2U6IEFkZCBzdXBwb3J0IGZvciBhbGwgY29tbW9uIFJHQiBmb3JtYXRzCisKKzIwMTAtMDUtMDUgMTY6MDY6NTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlbWV0aG9kLmg6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHloLmFzbToKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyYmxlbmQuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvc2NhbGVyYm9iLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3ZmaXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmUuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmViZmYuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmV0ZmYuYzoKKwkgIGRlaW50ZXJsYWNlOiBBZGQgc3VwcG9ydCBmb3IgQVlVVgorCisyMDEwLTA1LTA0IDE2OjM0OjI3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBtYWtlIHNldHVwIHVybCBpbiBhIHNtYXJ0ZXIgd2F5CisJICBNYWtlIHN1cmUgd2UgYWx3YXlzIHNlcGFyYXRlIHRoZSBiYXNlIGFuZCBjb250cm9sIHVybCBwYXJ0cyB3aXRoIGEgLyB3aGVuCisJICBjcmVhdGluZyB0aGUgc2V0dXAgdXJsLgorCisyMDEwLTA1LTA0IDE2OjA0OjM5ICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogaGFuZGxlIFNFRUtJTkcgcXVlcmllcy4KKworMjAxMC0wNS0wNCAxMToxMzo0NSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5Lmg6CisJICBydHBtcDR2cGF5OiBhZGQgY29uZmlnLWludGVydmFsIHBhcmFtZXRlciB0byByZS1pbnNlcnQgY29uZmlnIGluIHN0cmVhbQorCSAgQWRkIGEgbmV3IGNvbmZpZy1pbnRlcnZhbCBwcm9wZXJ0eSB0byBpbnN0cnVjdCB0aGUgcGF5bG9hZGVyIHRvIGluc2VydAorCSAgY29uZmlnIChWT1NILCBWT1MsIGV0YykgYXQgcGVyaW9kaWMgaW50ZXJ2YWxzIGluIHRoZSBzdHJlYW0KKwkgICh3aGVuIGEgR09QIG9yIFZPUC1JIGlzIGVuY291bnRlcmVkKS4KKwkgIEJhc2VkIG9uIHBhdGNoIGJ5IDxtYXJjLmxlZW1hbiBhdCBnbWFpbC5jb20+CisJICBGaXhlcyAjNjA3NDUyLgorCisyMDEwLTA1LTAzIDEzOjI2OjMyICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kZWNpbmFAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogbW92ZSBzb21lIGluaXRpYWxpemF0aW9uIGNvZGUgZnJvbSBjaGFuZ2Vfc3RhdGUgdG8gX2luaXQuCisJICBTZXQgLT5hY3RpdmUgdG8gVFJVRSBpbiBfaW5pdCBzbyBpdCBjYW4gYmUgc2V0IHRvIEZBTFNFIGFmdGVyIGNyZWF0aW5nIHRoZQorCSAgaml0dGVyYnVmZmVyIGFuZCBpdCB3b24ndCBiZSBtaXN0YWtlbmx5IHJlc2V0IHRvIFRSVUUgaW4gdGhlIGNoYW5nZV9zdGF0ZQorCSAgZnVuY3Rpb24uCisJICBUaGlzIGlzIG5lZWRlZCB0byBzdGFydCB0aGUgaml0dGVyYnVmZmVyIGFzIGluYWN0aXZlIHdoZW4gcnRwYmluIGlzIGJ1ZmZlcmluZy4KKworMjAxMC0wNS0wMyAxMTo1Njo1OCArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZGVjaW5hQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IGZpeCBhIGJ1ZyBoYW5kbGluZyBCVUZGRVJJTkcgbWVzc2FnZXMuCisJICBJZiBhIHNlc3Npb24gZXhpc3RzIGJ1dCBoYXMgbm8gc3RyZWFtcywgc2V0IHRoZSBtaW4gYnVmZmVyaW5nIHBlcmNlbnQgdG8gMAorCSAgc2luY2UgaXQgbWVhbnMgdGhhdCB3ZSBoYXZlbid0IHJlY2VpdmVkIGFueXRoaW5nIGZvciB0aGF0IHNlc3Npb24geWV0LgorCisyMDEwLTA1LTAzIDExOjUxOjM3ICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kZWNpbmFAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogd2hlbiBhIHN0cmVhbSBpcyBjcmVhdGVkLCBwYXVzZSB0aGUgaml0dGVyYnVmZmVyIGlmIHJ0cGJpbiBpcyBidWZmZXJpbmcuCisKKzIwMTAtMDUtMDMgMTE6MjM6NTkgKzAyMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRlY2luYUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBmaXggYSBidWcgY2FsY3VsYXRpbmcgc3RyZWFtIG9mZnNldHMuCisKKzIwMTAtMDUtMDEgMTQ6MjA6NTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJICBtYXRyb3NrYW11eDogV3JpdGUgcHJldmlvdXMgY2x1c3RlcidzIHNpemUKKwkgIFRoaXMgaXMgdXNlZnVsIGZvciBiYWNrd2FyZHMgcGxheWJhY2ssIHdoaWNoIHNob3VsZCBiZSBpbXBsZW1lbnRlZAorCSAgaW4gbWF0cm9za2FkZW11eCBhdCBzb21lIHBvaW50LgorCisyMDEwLTA1LTAxIDE0OjE1OjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBTZXQgaW50ZXJsYWNlZCBmbGFnIGluIHRoZSBjYXBzIGlmIHRoZSBmbGFnIGlzIHNldCBpbiB0aGUgTWF0cm9za2EgZmlsZQorCisyMDEwLTA1LTAxIDE0OjEyOjI4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IFdyaXRlIGludGVybGFjZWQgZmxhZyBpZiB0aGUgaW5wdXQgdmlkZW8gY29udGVudCBpcyBpbnRlcmxhY2VkCisJICBVbmZvcnR1bmF0ZWx5IE1hdHJvc2thIGhhcyBubyB3YXkgdG8gc3BlY2lmeSBURkYgYW5kIGZyaWVuZHMuLi4KKworMjAxMC0wNS0wMSAxMToyNToyNiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkgIHJ0cDogZml4IHByaW50ZiBmb3JtYXQgb2Ygc29tZSBkZWJ1ZyBtZXNzYWdlcworCisyMDEwLTA1LTAxIDExOjA2OjUzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYTogaW5pdCB2YXJpYWJsZSB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nIG9uIE9TWAorCSAgRml4ZXMgKGJvZ3VzKSAiJ29mZnNldCcgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZCBpbiB0aGlzIGZ1bmN0aW9uIgorCSAgd2FybmluZyBvbiBidWlsZCBib3QgKGFsc28gc3BvdHRlZCBieSBwaGlsbikuCisKKzIwMTAtMDQtMzAgMTc6MTk6NDQgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBVWVZZIGlzIDQ6MjoyLCBub3QgNDoyOjAKKworMjAxMC0wNC0zMCAyMjoyMjoyNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkgIHB1bHNlOiBEb24ndCBjb21wYXJlIHZhbHVlcyBvZiB0d28gZGlmZmVyZW50IGVudW0gdHlwZXMKKworMjAxMC0wNC0zMCAyMjoxMzozMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IE1ha2UgYXV0b21hdGljIGRldGVjdGlvbiBvZiBpbnRlcmxhY2luZyB0aGUgZGVmYXVsdAorCSAgUHJldmlvdXNseSAiZm9yY2UgZGVpbnRlcmxhY2luZyIgd2FzIHRoZSBkZWZhdWx0LCB3aGljaCBpcyBhIG5vdCB2ZXJ5CisJICBzZW5zaWJsZSBkZWZhdWx0IGZvciB0aGUgbm9ybWFsIHVzZSBjYXNlIHdoZXJlIGRlaW50ZXJsYWNlIHNob3VsZCBhY3QKKwkgIGluIHBhc3N0aHJvdWdoIG1vZGUgdW5sZXNzIGludGVybGFjZWQgY29udGVudCBpcyBwcmVzZW50LgorCisyMDEwLTA0LTI5IDE2OjI2OjQ5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAganBlZ2RlYzogb3B0aW1pc2UgYnVmZmVyIHNjYW5uaW5nCisJICBTcGVjaWZpY2FsbHksIHdoZW4gbmVlZGluZyBtb3JlIGRhdGEsIGRvIG5vdCByZXNjYW4gZnJvbSBzdGFydCBuZXh0IHRpbWUKKwkgIGFyb3VuZCwgYnV0IHJlc3VtZSBmcm9tIGxhc3QgcG9zaXRpb24uCisJICBTZWUgYWxzbyAjNTgzMDQ3LgorCisyMDEwLTA0LTI5IDE1OjM4OjQ5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogZGlzcmVnYXJkIHN1cGVyZmx1b3VzIGxpbmVzIHdoZW4gaW5kaXJlY3QgZGVjb2RpbmcKKworMjAxMC0wNC0yNyAxNTo0NDozOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkgIGpwZWdkZWM6IGFkZCBzdXBwb3J0IGZvciBSR0IgYW5kIGdyYXlzY2FsZSBjb2xvciBzcGFjZQorCSAgQWxzbyByZWZhY3RvciBzcmMgY2FwcyBuZWdvdGlhdGlvbiBhbmQgc2V0dGluZy4KKworMjAxMC0wNC0yNyAxMjoxOToyMiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL01ha2VmaWxlLmFtOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5oOgorCSAganBlZ2VuYzogc3VwcG9ydCBtb3JlIGNvbG91ciBzcGFjZXMgYW5kIHNvbWUgY2xlYW51cHMKKworMjAxMC0wNC0zMCAxMjo0NzowMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWdlbmM6IG1vcmUgZ2VuZXJpYyBzaW5rIGdldGNhcHMKKworMjAxMC0wNC0zMCAxMjo0Mjo0MiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IG1vcmUgc2FuaXR5IGNoZWNrcyBvbiBpbnB1dAorCSAgU3BlY2lmaWNhbGx5LCB2ZXJpZnkgaW5wdXQgY29tcG9uZW50cyAvIGNvbG91ciBzcGFjZSBpcyBhcyBjb2RlCisJICBzdWJzZXF1ZW50bHkgZXhwZWN0cywgdGhlcmVieSBhdm9pZGluZyBjcmFzaGVzIG9yIG90aGVyd2lzZSBib2d1cyBvdXRwdXQuCisJICBQcmVzZW50bHksIHRoYXQgbWVhbnMgMyBjb21wb25lbnRzIFlDYkNyIGNvbG91ciBzcGFjZSwgYW5kIHNvbWV3aGF0CisJICBsaW1pdGVkIHNhbXBsaW5nIGZhY3RvcnMuCisJICBGaXhlcyAjNjAwNTUzLgorCisyMDEwLTA0LTIyIDEyOjI4OjIyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSAgcnRwdGhlb3JhZGVwYXk6IGFsc28gYWNjZXB0IGluLWJhbmQgY29uZmlndXJhdGlvbgorCSAgRml4ZXMgIzU3NDQxNiAodGhlb3JhKS4KKworMjAxMC0wNC0yMiAxMjoyNzozNSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkgIHJ0cHZvcmJpc2RlcGF5OiBhbHNvIGFjY2VwdCBpbi1saW5lIGNvbmZpZ3VyYXRpb24KKwkgIEZpeGVzICM1NzQ0MTYgKHZvcmJpcykuCisKKzIwMTAtMDQtMDcgMTc6MjE6NTUgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSAgcnRwdGhlb3JhZGVwYXk6IElnbm9yZSBwYWNrZXRzIHdpdGhvdXQgYSBrbm93biBjb2RlYm9vaworCSAgRG9uJ3QgcHJvZHVjZSBhbiBlcnJvciBpZiBhIHBhY2tldCBpcyByZWNlaXZlZCB3aXRob3V0IGEgdmFsaWQgY29kZWJvb2ssCisJICBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlIGNvZGVib29rIHdpbGwganVzdCBiZSBjb21pbmcgbGF0ZXIuCisJICBTZWUgIzU3NDQxNi4KKworMjAxMC0wNC0yMCAxMjoxNzoyNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3k0bWVuYy5jOgorCSAgeTRtZW5jOiBhZGp1c3QgdW5pdCB0ZXN0IHRvIGVsZW1lbnQgYmVoYXZpb3VyCisKKzIwMTAtMDItMjMgMjI6MTY6MzkgLTA1MDAgIEJlbmphbWluIE0uIFNjaHdhcnR6IDxiZW5zQGFsdW0ubWl0LmVkdT4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmg6CisJICB5NG1lbmM6IGFkZCA0OjI6MiwgNDoxOjEsIGFuZCA0OjQ6NCBvdXRwdXQgc3VwcG9ydAorCSAgRml4ZXMgIzYxMDkwMi4KKworMjAxMC0wNC0xNSAxMjoyMTo1NiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5oOgorCSAgcnRwaDI2NGRlcGF5OiBERUxUQV9VTklUIG1hcmtpbmcgb2Ygb3V0cHV0IGJ1ZmZlcnMKKwkgIC4uLiB3aGljaCBldmlkZW50bHkgbWFrZXMgKG1vc3QpIHNlbnNlIGlmIG91dHB1dCBidWZmZXJzIGFyZQorCSAgYWN0dWFsbHkgZnJhbWVzLgorCSAgUGFydGlhbGx5IGJhc2VkIG9uIGEgcGF0Y2ggYnkKKwkgIE1pZ3VlbCBBbmdlbCBDYWJyZXJhIDxtYWRfYWx1Y2hlIGF0IGhvdG1haWwuY29tPgorCSAgRml4ZXMgIzYwOTY1OC4KKworMjAxMC0wNC0xNiAxNzoyMTo1MCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5oOgorCSAgcnRwaDI2M2RlcGF5OiBleHRyYSBrZXlmcmFtZSBpbmZvIGZyb20gUFRZUEUgaGVhZGVyCisJICAuLi4gYXMgb3Bwb3NlZCB0byB0YWtpbmcgaXQgZnJvbSBoMjYzIHBheWxvYWQgaGVhZGVyLCB3aGljaCBuZWVkIG5vdAorCSAgYmUgc28gcmVsaWFibGUuCisJICBGaXhlcyAjNjEwMTcyLgorCisyMDEwLTA0LTE2IDE3OjA4OjQ3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkgIHJ0cGgyNjNkZXBheTogYWxzbyB1c2UgUGljdHVyZSBTdGFydCBDb2RlIHRvIGRldGVjdCBwYWNrZXQgbG9zcworCSAgVGhpcyBlbnN1cmVzIGEgd2hvbGUgZnJhbWUgaXMgZHJvcHBlZCBpZiBhIChzdGFydCkgcGFja2V0IGlzIGxvc3QsCisJICByYXRoZXIgdGhhbiByZWx5aW5nIG9ubHkgb24gdGhlIERJU0NPTlQgZmxhZy4KKworMjAxMC0wNC0xNiAxNzowNjoxMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJICBydHBoMjYzZGVwYXk6IGRldGVjdCBmcmFtZSBzdGFydCB1c2luZyBQaWN0dXJlIFN0YXJ0IENvZGUKKwkgIFNvIHdlIHN0b3AgZHJvcHBpbmcgZnJhZ21lbnRzIGFzIHNvb24gYXMgdGhlcmUgaXMgYSBwaWN0dXJlIHN0YXJ0IChjb2RlKS4KKwkgIEluIHBhcnRpY3VsYXIsIHRoaXMgcHJldmVudHMgZHJvcHBpbmcgdGhlIGZpcnN0IGZyYW1lIGZvbGxvd2luZworCSAgaW5pdGlhbCBESVNDT05ULgorCisyMDEwLTA0LTE2IDE2OjM0OjA2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkgIHJ0cGgyNjNkZXBheTogaGFuZGxlIGEgZmV3IEZJWE1FcworCisyMDEwLTA0LTE2IDE2OjI3OjI1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkgIHJ0cGgyNjNkZXBheTogc2xpZ2h0bHkgcmVmYWN0b3IgcGF5bG9hZCBkcm9wcGluZworCisyMDEwLTA0LTE2IDExOjUzOjE3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaDoKKwkgIHJ0cGgyNjNwYXk6IHVzZSBmb3VuZCBHT0JzIHRvIGFwcGx5IE1vZGUgQSBwYXlsb2FkaW5nCisJICAuLi4gcmF0aGVyIHRoYW4gZmFsbGluZyBiYWNrIHRvIHNlbmRpbmcgdGhlIHdob2xlIGZyYW1lIGluIG9uZSBwYWNrZXQKKwkgIGlmIG51bWJlciBvZiBHT0Igc3RhcnRjb2RlcyA8IG1heGltdW0uCisJICBPbmUgbWlnaHQgdGFrZSB0aGlzIGZ1cnRoZXIgYW5kIHN0aWxsIHBlcmZvcm0gTW9kZSBCL0MgcGF5bG9hZGluZywKKwkgIGJ1dCBhdCBsZWFzdCB0aGlzIHNob3VsZCBjYXRlciBmb3IgZGVjZW50IGZyYWdtZW50cyBpbiB0eXBpY2FsIGNhc2VzLgorCSAgRml4ZXMgIzU5OTU4NS4KKworMjAxMC0wNC0xNCAxMTo1Mzo0NiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICBtYXRyb3NrYWRlbXV4OiBpbXBsZW1lbnQgcHVzaCBtb2RlIHNlZWtpbmcKKworMjAxMC0wNC0yOSAyMDowODo0MyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5jOgorCSAgZG9jczogdXBkYXRlIGZvciB2aWRlb2ZpbHRlciBwbHVnaW4gbWVyZ2UgYW5kIGFkZCBndGstZG9jIGJsdXJiIGZvciBuZXcgcHJvcGVydHkKKworMjAxMC0wNC0yNiAxODoxMjo0NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IEltcHJvdmUgc2VnbWVudCBoYW5kbGluZyBhIGJpdAorCisyMDEwLTA0LTI2IDE4OjA1OjAwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogT3JkZXIgY2FwcyBieSBhbW91bnQgb2YgY29udGFpbmVkIGluZm9ybWF0aW9uCisKKzIwMTAtMDQtMjYgMTc6MjU6MzggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBQcm9wZXJseSBzZXQgaW50ZXJsYWNlZCBmaWVsZCBpbiBnZXRjYXBzCisKKzIwMTAtMDQtMjQgMTY6Mjg6MTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2xpbmVhci5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXJibGVuZC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9zY2FsZXJib2IuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmUuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmViZmYuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmV0ZmYuYzoKKwkgIGRlaW50ZXJsYWNlOiBBZGQgcGxhbmFyIFlVViBzdXBwb3J0IHRvIGFsbCBvdGhlciBzaW1wbGUgbWV0aG9kcworCisyMDEwLTA0LTI0IDE2OjEwOjA2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHloLmFzbToKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5jOgorCSAgZGVpbnRlcmxhY2U6IEFkZCBwbGFuYXIgWVVWIHN1cHBvcnQgdG8gZ3JlZWR5aCBtZXRob2QKKworMjAxMC0wNC0yNCAxNTo0MjowNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5LmM6CisJICBkZWludGVybGFjZTogQWRkIHN1cHBvcnQgZm9yIHBsYW5hciBZVVYgZm9ybWF0cyBpbiBncmVlZHlsIG1ldGhvZAorCisyMDEwLTA0LTI0IDEzOjU4OjAzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS92ZmlyLmM6CisJICBkZWludGVybGFjZTogQWRkIHN1cHBvcnQgZm9yIFk0NDQsIFk0MkIsIEk0MjAsIFlWMTIgYW5kIFk0MUIKKwkgIFRoZSB2ZmlyIG1ldGhvZCBzdXBwb3J0cyB0aGVtIGFuZCB3aWxsIGJlIHVzZWQgdW50aWwgc29tZXRoaW5nIGVsc2UKKwkgIHN1cHBvcnRzIGl0LgorCisyMDEwLTA0LTI0IDA5OjE2OjIyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlbWV0aG9kLmM6CisJICBkZWludGVybGFjZTogRGVmaW5lIGRlaW50ZXJsYWNlIG1ldGhvZCBiYXNlIGNsYXNzZXMgYXMgYWJzdHJhY3QgdHlwZXMKKworMjAxMC0wNC0yMyAxNzo0MDoxMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmg6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHkuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyYmxlbmQuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvc2NhbGVyYm9iLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdmZpci5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZWJmZi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZXRmZi5jOgorCSAgZGVpbnRlcmxhY2U6IE1vdmUgZGVpbnRlcmxhY2luZyBtZXRob2RzIHRvIHRoZWlyIG93biBmaWxlCisKKzIwMTAtMDQtMjMgMTc6MjU6MTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5oOgorCSAgZGVpbnRlcmxhY2U6IFNpbXBsaWZ5IHBhc3N0aHJvdWdoIG1vZGUgZGV0ZWN0aW9uCisKKzIwMTAtMDQtMjMgMTQ6MzU6NDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IEZpeCB1bml0IHRlc3QgdGhhdCBjaGVja3MgY2FwcyBoYW5kbGluZworCSAgZGVpbnRlcmxhY2Ugbm93IGFsd2F5cyBhZGRzIHRoZSBpbnRlcmxhY2VkIGZpZWxkIHRvIHRoZSBvdXRwdXQgY2FwcywKKwkgIGlmIGl0IHdhc24ndCBwcmVzZW50IGluIHRoZSBpbnB1dCBjYXBzIHRoZSBvdXRwdXQgY2FwcyB3aWxsIHN0aWxsCisJICBjb250YWluIGludGVybGFjZWQ9ZmFsc2UuCisKKzIwMTAtMDQtMjEgMTc6MDA6MDUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHkuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5hc206CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWguYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2xpbmVhcmJsZW5kLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3NjYWxlcmJvYi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvVG9tc01vQ29tcEFsbC5pbmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3ZmaXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmUuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmViZmYuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmV0ZmYuYzoKKwkgIGRlaW50ZXJsYWNlOiBSZWZhY3RvciBkZWludGVybGFjaW5nIGFzIHByZXBhcmF0aW9uIGZvciBzdXBwb3J0aW5nIG1vcmUgY29sb3IgZm9ybWF0cworCisyMDEwLTA0LTIyIDE5OjA1OjM3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogQWRkIHN1cHBvcnQgZm9yIFk0NDQsIFk0MkIgYW5kIFk0MUIKKworMjAxMC0wNC0yMiAxNTo1NDoyMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IEFkZCBzdXBwb3J0IGZvciBZVllVIGFuZCByZW9yZGVyIHRlbXBsYXRlIGNhcHMKKworMjAxMC0wNC0xOCAyMToxMToyMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IFRyYW5zbGF0ZSBuYXZpZ2F0aW9uIGV2ZW50cyB0byBtYWtlIHNlbnNlIGFnYWluIHVwc3RyZWFtCisKKzIwMTAtMDQtMTggMjA6NTg6MTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBQcm9wZXJseSBoYW5kbGUgcmFuZ2VzL2xpc3RzIG9mIHdpZHRoIG9yIGhlaWdodCB3aGVuIHRyYW5zZm9ybWluZyBjYXBzCisJICBDb2RlIHBhcnRseSB0YWtlbiBmcm9tIHRoZSB2aWRlb2Nyb3AgZWxlbWVudC4KKworMjAxMC0wNC0yMiAxNTo0NToxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgYWxwaGE6IEZpeCBwbGFuYXIgWVVWLT5SR0IgcHJvY2Vzc2luZworCisyMDEwLTA0LTIyIDE1OjQyOjAzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICBhbHBoYTogQ29ycmVjdGx5IGNsYW1wIGFmdGVyIFlVVi0+UkdCIGNvbnZlcnNpb24KKworMjAxMC0wNC0yMiAxNToyMDoyNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgYWxwaGE6IEFkZCBzdXBwb3J0IGZvciBZVVkyLCBZVllVIGFuZCBVWVZZCisKKzIwMTAtMDQtMTggMTU6MDI6NDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBTeW5jIHByb3BlcnRpZXMgdG8gdGhlIGNvbnRyb2xsZXIgaW4gYmVmb3JlX3RyYW5zZm9ybQorCisyMDEwLTA0LTE2IDE3OjAwOjAyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogQWRkIHN1cHBvcnQgZm9yIFlVWTIgYW5kIFVZVVYKKworMjAxMC0wNC0yMSAxNzo0MTo0MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgYWxwaGE6IFJlZmFjdG9yIHByb2Nlc3NpbmcgYW5kIGFkZCBzdXBwb3J0IGZvciBvdGhlciBwbGFuYXIgWVVWIGZvcm1hdHMKKwkgIFRoaXMgcmVkdWNlcyB0aGUgZ2VuZXJhdGVkIGNvZGUgc2l6ZSBieSBhIGZhY3RvciBvZiAyLjUuCisKKzIwMTAtMDQtMjEgMTc6MTU6MzMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkgIGFscGhhOiBBZGQgc3VwcG9ydCBmb3IgWVYxMiBpbnB1dAorCisyMDEwLTA0LTIyIDEzOjU2OjU4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBBZGQgc3VwcG9ydCBmb3IgWVVZMiwgWVZZVSwgVVlWWQorCisyMDEwLTA0LTIwIDEyOjE4OjE4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBBZGQgc3VwcG9ydCBmb3IgWTQ0NCwgWTQyQiwgWTQxQiBhbmQgWVYxMgorCisyMDEwLTA0LTIxIDE3OjA3OjEwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICB2aWRlb2ZpbHRlcjogT3JkZXIgY29sb3IgZm9ybWF0cyBieSB0aGVpciBjb250YWluZWQgYW1vdW50IG9mIGluZm9ybWF0aW9uCisKKzIwMTAtMDQtMjAgMTg6MjI6MTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICB2aWRlb2ZsaXA6IERyb3AgWTQxQi9ZNDJCIHN1cHBvcnQKKwkgIFJvdGF0aW5nIDkwwrAvMjcwwrAgd2l0aCBzdWJzYW1wbGVkIFlVViB3aGVyZSBob3Jpem9udGFsCisJICBhbmQgdmVydGljYWwgc3Vic2FtcGxpbmcgYXJlIGRpZmZlcmVudCBkb2Vzbid0IHJlYWxseSB3b3JrLgorCisyMDEwLTA0LTE5IDE0OjM3OjU0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSAgdmlkZW9mbGlwOiBBbHNvIGZsaXAgdGhlIHBpeGVsLWFzcGVjdC1yYXRpbyBpZiB3aWR0aC9oZWlnaHQgYXJlIGV4Y2hhbmdlZAorCisyMDEwLTA0LTE4IDIzOjA4OjE0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2ZpbHRlci5jOgorCSAgdmlkZW9maWx0ZXI6IEV4dGVuZCB0aGUgdW5pdCB0ZXN0IHRvIHRlc3QgZGlmZmVyZW50IGNvbG9yIGZvcm1hdHMKKworMjAxMC0wNC0xOCAyMjo1NTozNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvZmlsdGVyLmM6CisJICB2aWRlb2ZpbHRlcjogQWRkIHNvbWUgbW9yZSB0ZXN0cworCSAgVGhlc2UgY2hlY2sgZGlmZmVyZW50IHByb3BlcnR5IGNvbWJpbmF0aW9ucworCisyMDEwLTA0LTE4IDIyOjU0OjIzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSAgdmlkZW9mbGlwOiBDaGFuZ2UgdGhlIGRlZmF1bHQgbWV0aG9kIHRvIGlkZW50aXR5CisKKzIwMTAtMDQtMTggMjI6NTA6MjAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmg6CisJICB2aWRlb2JhbGFuY2U6IFJlZHVjZSBudW1iZXIgb2YgYWxsb2NhdGlvbnMgcGVyIGluc3RhbmNlCisKKzIwMTAtMDQtMTggMjI6NDU6NTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkgIHZpZGVvZmlsdGVyOiBVcGRhdGUgbGFzdC1yZXZpZXdlZCBjb21tZW50cworCisyMDEwLTA0LTE4IDIyOjQwOjU1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgdmlkZW9iYWxhbmNlOiBBZGQgc3VwcG9ydCBmb3IgYWxsIFJHQiBmb3JtYXRzCisKKzIwMTAtMDQtMTggMjI6Mjg6MTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJICB2aWRlb2JhbGFuY2U6IEFkZCBzdXBwb3J0IGZvciBZVVkyLCBVWVZZLCBBWVVWIGFuZCBZVllVCisKKzIwMTAtMDQtMTggMjI6MjM6MDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJICB2aWRlb2JhbGFuY2U6IEFkZCBkZWJ1ZyBjYXRlZ29yeQorCisyMDEwLTA0LTE4IDIyOjE5OjU1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgdmlkZW9iYWxhbmNlOiBNYWtlIHByb3BlcnR5IGFjY2VzcyB0aHJlYWRzYWZlCisKKzIwMTAtMDQtMTggMjI6MTg6MjQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJICB2aWRlb2JhbGFuY2U6IEFkZCBzdXBwb3J0IGZvciBZNDFCLCBZNDJCIGFuZCBZNDQ0CisKKzIwMTAtMDQtMTggMjI6MTc6MDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmg6CisJICB2aWRlb2JhbGFuY2U6IFVzZSBsaWJnc3R2aWRlbyBmb3IgZm9ybWF0IHNwZWNpZmljIHRoaW5ncworCisyMDEwLTA0LTE4IDIyOjA5OjA2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgdmlkZW9iYWxhbmNlOiBNYWtlIHByb3BlcnRpZXMgY29udHJvbGxhYmxlCisKKzIwMTAtMDQtMTggMjI6MDY6NDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJICB2aWRlb2JhbGFuY2U6IEVtaXQgInZhbHVlLWNoYW5nZWQiIHNpZ25hbCBvZiBjb2xvciBiYWxhbmNlIGludGVyZmFjZSB3aGVuIHZhbHVlcyBjaGFuZ2UKKworMjAxMC0wNC0xOCAyMTo1ODoxMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuaDoKKwkgIHZpZGVvYmFsYW5jZTogU29tZSByYW5kb20gY2xlYW51cAorCisyMDEwLTA0LTE4IDIxOjM3OjIzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgdmlkZW9iYWxhbmNlOiBTdG9wIHVzaW5nIGxpYm9pbAorCSAgVGhlIHVzZWQgbGlib2lsIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgYW5kIGhhcyBubyBvcHRpbWl6ZWQKKwkgIGltcGxlbWVudGF0aW9uIGFueXdheS4KKworMjAxMC0wNC0xOCAyMToxNDoxMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkgIHZpZGVvZmxpcDogTWFrZSBwcm9wZXJ0eSBhY2Nlc3MgdGhyZWFkc2FmZQorCisyMDEwLTA0LTE4IDE1OjAwOjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJICBnYW1tYTogU3luYyBwcm9wZXJ0aWVzIHRvIHRoZSBjb250cm9sbGVyIGluIGJlZm9yZV90cmFuc2Zvcm0KKworMjAxMC0wNC0xOCAxNDo0NjowOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkgIHZpZGVvZmxpcDogQWRkIHN1cHBvcnQgZm9yIGFsbCBSR0IgZm9ybWF0cyBhbmQgQVlVVgorCisyMDEwLTA0LTE4IDE0OjMxOjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSAgdmlkZW9mbGlwOiBBZGQgc3VwcG9ydCBmb3IgWTQxQiwgWTQyQiBhbmQgWTQ0NAorCisyMDEwLTA0LTE4IDE0OjI5OjMwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5oOgorCSAgdmlkZW9mbGlwOiBNYWtlIHByb2Nlc3NpbmcgbW9yZSBnZW5lcmFsIGFuZCB1c2UgbGliZ3N0dmlkZW8gZm9yIGFsbCBmb3JtYXQgc3BlY2lmaWMgdGhpbmdzCisKKzIwMTAtMDQtMTggMTM6MTI6NDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICB2aWRlb2ZsaXA6IE1ha2UgbWV0aG9kIHByb3BlcnR5IGNvbnRyb2xsYWJsZSBhbmQgaW1wcm92ZSBkZWJ1ZyBvdXRwdXQKKworMjAxMC0wNC0xOCAxMzowMzo0OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuaDoKKwkgIHZpZGVvZmxpcDogU29tZSByYW5kb20gY2xlYW51cAorCisyMDEwLTA0LTE4IDEwOjE3OjUyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9wbHVnaW4uYzoKKwkgIHZpZGVvZmlsdGVyOiBNb3ZlIGFsbCBlbGVtZW50cyBpbnRvIGEgc2luZ2xlIHBsdWdpbgorCSAgSGF2aW5nIGFsbCB0aGVzZSBzbWFsbCBlbGVtZW50cyBpbiBhIHNlcGFyYXRlIHBsdWdpbgorCSAgaXMgbm90IHZlcnkgbWVtb3J5IGVmZmVjdGl2ZS4uLgorCisyMDEwLTA0LTE4IDEwOjA3OjI0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuaDoKKwkgIGdhbW1hOiBJbXByb3ZlIGRvY3MgYSBiaXQKKworMjAxMC0wNC0xOCAwOTo1OTo0MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jOgorCSAgZ2FtbWE6IEFkZCBzdXBwb3J0IGZvciBhbGwgUkdCIGZvcm1hdHMKKworMjAxMC0wNC0xOCAwOTo0NjoxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jOgorCSAgZ2FtbWE6IEFkZCBzdXBwb3J0IGZvciBtYW55IHBhY2tlZCBZVVYgZm9ybWF0cworCSAgVGhhdCBpcyBZVVkyLCBVWVZZLCBBWVVWIGFuZCBZVllVLgorCisyMDEwLTA0LTE4IDA5OjM4OjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJICBnYW1tYTogQWRkIHN1cHBvcnQgZm9yIGFsbCBvdGhlciBwbGFuYXIgWVVWIGZvcm1hdHMKKwkgIFRoYXQgaXMgWTQxQiwgWTQyQiwgWTQ0NCwgTlYxMiBhbmQgTlYyMS4KKworMjAxMC0wNC0xOCAwOTozMzo0OSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jOgorCSAgZ2FtbWE6IFN0b3AgdXNpbmcgbGlib2lsCisJICBUaGUgdXNlZCBsaWJvaWwgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCwgb25seSBoYXMgYSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24KKwkgIGFuZCBpcyBtb3JlIGNvbXBsZXggdGhhbiB3aGF0J3MgbmVlZGVkIGhlcmUuCisKKzIwMTAtMDQtMTcgMTg6MTM6NDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5oOgorCSAgZ2FtbWE6IFVzZSBsaWJnc3R2aWRlbyBmb3IgZm9ybWF0IHNwZWNpZmljIHZhbHVlcyBhbmQgbWFrZSBnYW1tYSBwcm9jZXNzaW5nIG1vcmUgZ2VuZXJpYworCSAgQWxsb3dzIHVzIHRvIGVhc2lseSBhZGQgc3VwcG9ydCBmb3IgbmV3IGNvbG9yIGZvcm1hdHMgbGF0ZXIuCisKKzIwMTAtMDQtMTcgMTg6MDE6MDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkgIGdhbW1hOiBNYWtlIGdhbW1hIHByb3BlcnR5IGNvbnRyb2xsYWJsZQorCSAgLi4uYW5kIHByb3Blcmx5IHVzZSBsaWJvaWwuCisKKzIwMTAtMDQtMTcgMTc6NTU6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkgIGdhbW1hOiBTb21lIHJhbmRvbSBjbGVhbnVwCisKKzIwMTAtMDQtMTkgMTQ6NDU6MzMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5jOgorCSAgc21wdGVhbHBoYTogU3luYyBwcm9wZXJ0aWVzIHRvIHRoZSBjb250cm9sbGVyIGluIGJlZm9yZV90cmFuc2Zvcm0KKworMjAxMC0wNC0xNyAxNzo0NzowNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJICBzbXB0ZWFscGhhOiBBZGQgc3VwcG9ydCBmb3IgWVYxMiAoY29udmVydGVkIHRvIEFZVVYpCisKKzIwMTAtMDQtMTcgMTc6NDM6NTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5jOgorCSAgc21wdGVhbHBoYTogQWRkIHN1cHBvcnQgZm9yIGFsbCA0IEFSR0IgZm9ybWF0cworCSAgLi4ud2l0aG91dCBmb3JtYXQgY29udmVyc2lvbi4KKworMjAxMC0wNC0xNiAxNzoyNzowMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5oOgorCSAgc21wdGVhbHBoYTogTWFrZSBjb2xvciBmb3JtYXQgc3VwcG9ydCBtb3JlIGdlbmVyaWMKKwkgIFRoaXMgYWxsb3dzIGVhc2llciBhZGRpdGlvbiBvZiBuZXcgZm9ybWF0cyBsYXRlci4KKworMjAxMC0wNC0xNiAxNzoxODoxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5oOgorCSAgc21wdGVhbHBoYTogU29tZSByYW5kb20gY2xlYW51cAorCisyMDEwLTA0LTE1IDIyOjI4OjU4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NtcHRlL2dzdG1hc2suYzoKKwkqIGdzdC9zbXB0ZS9nc3RtYXNrLmg6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5oOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlYWxwaGEuYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmg6CisJICBzbXB0ZTogQWRkIHByb3BlcnR5IGZvciBpbnZlcnRpbmcgdGhlIHRyYW5zaXRpb24gbWFzaworCSAgVGhpcyBjb252ZXJ0cyBhIGxlZnQtdG8tcmlnaHQgdHJhbnNpdGlvbiB0byByaWdodC10by1sZWZ0IG9yCisJICBjbG9jay13aXNlIHRvIGNvdW50ZXItY2xvY2std2lzZS4KKworMjAxMC0wNC0xNSAyMjoyNzo1NyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJICBzbXB0ZWFscGhhOiBDb3JyZWN0bHkgZGV0ZWN0IHByb3BlcnR5IGNoYW5nZXMgYW5kIHVwZGF0ZSBwcm9wZXJ0aWVzCisKKzIwMTAtMDQtMTYgMTk6MzU6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFjZWxwZGVwYXkuaDoKKwkgIHFjZWxwZGVwYXk6IGFkZCBmaXJzdCB2ZXJzaW9uIG9mIGEgUUNFTFAgZGVwYXlsb2FkZXIKKworMjAxMC0wNC0yOSAxNToxODowNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQuCisKKz09PSByZWxlYXNlIDAuMTAuMjIgPT09CisKKzIwMTAtMDQtMjggMDI6NTg6MDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTAuMjIKKworMjAxMC0wNC0yOCAwMjo1NzoyMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxMC0wNC0yNSAyMzozNjoyOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIDAuMTAuMjEuMyBwcmUtcmVsZWFzZQorCisyMDEwLTA0LTI1IDIxOjE5OjMzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogaGlkZSBpcy1saXZlIHByb3BlcnR5IGZvciByZWxlYXNlCisJICBBdCB0aGUgdmVyeSBsZWFzdCBpdCBuZWVkcyBhIGJldHRlci9sZXNzIHdyb25nIG5hbWUuCisJICBTZWUgIzYxMzA2Ni4KKworMjAxMC0wNC0yNSAxNToxMjoyMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGRvbid0IGNyYXNoIGlmIGpwZWcgaW1hZ2UgY29udGFpbnMgbW9yZSB0aGFuIHRocmVlIGNvbXBvbmVudHMKKwkgIE91ciBjb2RlIGN1cnJlbnRseSBvbmx5IGhhbmRsZXMgYSBtYXhpbXVtIG9mIDMgY29tcG9uZW50cywgc28gZXJyb3IKKwkgIG91dCBmb3Igbm93IGlmIHRoZSBpbWFnZSBoYXMgbW9yZSBjb21wb25lbnRzIHRoYW4gdGhhdC4KKwkgIEZpeGVzICM2MDQxMDYuCisKKzIwMTAtMDQtMjAgMTc6MjE6MjkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJICBkb2FwOiB1cGRhdGUgcmVwb3NpdG9yeSBpbmZvIGZyb20gY3ZzLT5naXQgYW5kIG1haW50YWluZXJzCisKKzIwMTAtMDQtMjMgMTQ6NDA6MjAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZmM4NTg2NyB0byA0ZDY3YmQ2CisKKzIwMTAtMDQtMjIgMTM6MzA6NTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSAgdmlkZW9taXhlcjogRml4IGJ5dGUgb3JkZXIgZm9yIE1NWCBBUkdCL0FZVVYgY29sb3IgZmlsbGluZworCSAgRml4ZXMgYnVnICM2MTY0MDkuCisKKzIwMTAtMDQtMjEgMTc6NTM6NDkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSAgdmlkZW9taXhlcjogRml4IEFZVVYgY2hlY2tlci9jb2xvciBmaWxsaW5nCisKKzIwMTAtMDQtMTkgMTY6NDM6MjggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9tbXguaDoKKwkgIHZpZGVvbWl4ZXI6IEFkZCBpMzg3IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyB0byB0aGUgY2xvYmJlcmVkIHJlZ2lzdGVycyBsaXN0CisJICBUaGV5IGFyZSB0aGUgc2FtZSBhcyB0aGUgbW0wLW1tNyBNTVggcmVnaXN0ZXJzIGFuZCB3aWxsIGJlIG92ZXJ3cml0dGVuCisJICBieSB0aGUgYXNzZW1ibHkgY29kZSBpZiBnY2MgZG9lc24ndCBrbm93IGFib3V0IHRoZSBNTVggcmVnaXN0ZXJzLgorCSAgTm90ZTogVGhleSdyZSBhbGwgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgY2xvYmJlcmVkIHJlZ2lzdGVycyBpbiBhbGwgY2FzZXMKKwkgIGFuZCBub3Qgb25seSB3aGVuIF9fTU1YX18gaXMgbm90IGRlZmluZWQganVzdCB0byBtYWtlIHN1cmUgdGhhdCBubyBvdGhlcgorCSAgYnVncyBoYXBwZW4gd2l0aCB0aGlzIGNvZGUganVzdCBiZWNhdXNlIHNvbWUgY29tcGlsZXIgdmVyc2lvbiBnZXRzIHRoaW5ncworCSAgd3JvbmcuCisJICBGaXhlcyBidWcgIzYxNDQ2Ni4KKworMjAxMC0wNC0xOSAxNDowOTozNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IFVzZSBsaWJnc3R2aWRlbyB0byBnZXQgdGhlIG9yZGVyIG9mIFJHQgorCisyMDEwLTA0LTE3IDEwOjA2OjQxICswMTAwICBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uQG9yYWNsZS5jb20+CisKKwkqIGdzdC9nb29tL3htbXguYzoKKwkgIGdvb206IGFkZCBlZHggdG8gY2xvYmJlciBsaXN0IGluIGlubGluZSBhc3NlbWJseSBjb2RlCisJICBtdWxsIG1vZGlmaWVzICVlZHgsIHNvIHNob3VsZCBiZSBtZW50aW9uZWQgaW4gY2xvYmJlciBsaXN0LgorCSAgRml4ZXMgY3Jhc2ggb24gU29sYXJpcyAoIzYxNTk5OCkuCisKKzIwMTAtMDQtMTUgMTM6Mzk6NDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiBkb24ndCB1c2UgR1NUX1BMVUdJTl9MREZMQUdTIHdoZW4gYnVpbGRpbmcgdGVzdCBiaW5hcmllcworCisyMDEwLTA0LTE2IDE1OjI3OjEyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogRml4IEk0MjAtPkk0MjAgY29weWluZworCSAgRml4ZXMgYnVnICM2MTUxNDMuCisKKzIwMTAtMDQtMTMgMTg6MTU6NTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBGaXggQVlVVi0+STQyMCBjb3B5aW5nCisKKzIwMTAtMDQtMTYgMTI6MTQ6MjYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgcnRwaDI2NGRlcGF5OiBwcm9maWxlLWxldmVsLWlkIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlcgorCSAgU28sIGlmIG5lZWRlZCwgZXh0cmFjdCB0aGUgY29ycmVzcG9uZGluZyBpbmZvIGZyb20KKwkgIHNwcm9wLXBhcmFtZXRlci1zZXRzLgorCSAgQmFzZWQgb24gcGF0Y2ggcHJvdmlkZWQgYnkgPGR4c3N4IGF0IGdtYWlsLmNvbT4KKwkgIEZpeGVzICM2MTI2NTcuCisKKzIwMTAtMDQtMTUgMDc6MTM6NDYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IERyb3AgLVdjYXN0LWFsaWduCisJICBDb21taXQgbWVzc2FnZSBjb3BpZWQgZnJvbSBjb3JlJ3MgY29tbWl0IGZyb20gQmVuamFtaW4gT3R0ZToKKwkgIDI0NmY1ZGJhOTZhNWI1MGJiNzQ2MjFhZjY3YjMwOTQyY2NhNzJhZjUKKwkgIEFwcGFyZW50bHkgZ2NjIHdhcm5zIHRoYXQgR3N0TWluaU9iamVjdCBpcyBub3QgY2FzdGFibGUgdG8KKwkgIEdzdEV2ZW50L01lc3NhZ2UvQnVmZmVyIGR1ZSB0byB0aGVtIGNvbnRhaW5pbmcgNjRiaXQgdmFyaWFibGVzLCBldmVuCisJICB0aG91Z2ggQVJNIGhhY2tlcnMgY2xhaW0gdGhhdCB0aG9zZSBvbmx5IG5lZWQgNGJ5dGUgYWxpZ25tZW50LiBBbmQgYXMKKwkgIGxvbmcgYXMgZ2NjIGJlaGF2ZXMgdGhhdCB3YXksIHRoaXMgd2FybmluZyBpcyBub3QgdmVyeSB1c2VmdWwuCisJICBTbyB3ZSdsbCByZW1vdmUgdGhlIHdhcm5pbmcgdW50aWwgdGhpcyBwcm9ibGVtIGlzIGZpeGVkLgorCSAgRml4ZXMgIzYxNTY5OAorCisyMDEwLTA0LTE0IDIzOjQ2OjA2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOgorCSAgZmxhY3RhZzogZml4IGFkYXB0ZXIgYXNzZXJ0aW9uIHdoZW4gdXNlZCBkaXJlY3RseSBhZnRlciBmbGFjZW5jCisJICBVbmxpa2UgZmlsZXNyYywgZmxhY2VuYyBvdXRwdXRzIHRoZSBmbGFjIGJsb2NrcyBuZWF0bHkgYWxpZ25lZCBvbmUgaW4KKwkgIGVhY2ggYnVmZmVyLiBUaGlzIG1lYW5zIHRoYXQgd2hlbiB3ZSBzd2l0Y2ggZnJvbSBtZXRhZGF0YSBtb2RlIHRvCisJICBhdWRpbyBkYXRhIHBhc3N0aHJvdWdoIG1vZGUsIHRoZXJlJ3Mgbm8gZGF0YSBsZWZ0IGluIHRoZSBhZGFwdGVyIHRvCisJICBwdXNoIG91dCBhdCB0aGlzIHBvaW50LCBzbyBjaGVjayBpZiB0aGVyZSdzIGRhdGEgaW4gdGhlIGFkYXB0ZXIKKwkgIGJlZm9yZSByZXF1ZXN0aW5nIGJ1ZmZlcnMgZnJvbSBpdCAoYWxzbyBuZWVkZWQgaW4gY2FzZSB3ZSBnZXQgaW5wdXQKKwkgIGJ1ZmZlcnMgb2YgMCBzaXplKS4KKwkgIEZpeGVzICM2MTU3OTMuCisKKzIwMTAtMDQtMTQgMjM6MTg6MjcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjIxLjIgcHJlLXJlbGVhc2UKKworMjAxMC0wNC0xNCAyMDozMTozMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiB1cGRhdGUKKworMjAxMC0wNC0xNCAyMDowNjowOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL2VxdWFsaXplci9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3NoYXBld2lwZS9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2ljbGVzL01ha2VmaWxlLmFtOgorCSAgdGVzdHM6IHVzZSBMREFERCBmb3IgbGlicyB0byBsaW5rIHRvIGluc3RlYWQgb2YgTERGTEFHUworCSAgVXNlIGZvb19MREFERCBpbnN0ZWFkIG9mIGZvb19MREZMQUdTIHRvIHNwZWNpZnkgdGhlIGxpYnJhcmllcyB0byBsaW5rIHRvLgorCSAgVGhpcyBzaG91bGQgbWFrZSBzdXJlIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIHRoZSBsaW5rZXIgaW4gdGhlIHJpZ2h0CisJICBvcmRlciwgYW5kIG1ha2VzIExERkxBR1MgdXNhYmxlIGFnYWluLgorCSAgQmFzZWQgb24gcGF0Y2ggYnkgQnJpYW4gQ2FtZXJvbiA8YnJpYW4uY2FtZXJvbkBvcmFjbGUuY29tPgorCSAgRml4ZXMgIzYxNTY5Ny4KKworMjAxMC0wNC0xNCAxODoxMzo1NiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogdHJhbnNmb3JtX2NhcHMgOiBXZSBjYW4gb25seSBjb252ZXJ0IEFZVVYgdG8geFJHQgorCSAgV2Ugd2VyZSBwcmV2aW91c2x5IHN0YXRpbmcgdGhhdCB3ZSBjb3VsZCBjb252ZXJ0IEFZVVYvSTQyMC9ZVjEyIHRvIHhSR0IuCisKKzIwMTAtMDQtMTMgMDA6MTQ6NDYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IGFsc28gcmVtb3ZlIC1XYWdncmVnYXRlLXJldHVybiBmcm9tIHdhcm5pbmcgZmxhZ3MKKwkgIEl0IGNhdXNlcyBwcm9ibGVtcyB3aXRoIE9iamVjdGl2ZS1DIGNvZGUgbGlrZSBpbiBvc3h2aWRlb3NpbmsuCisJICBGaXhlcyAjNjEzNjYzLgorCisyMDEwLTA0LTEyIDE4OjIyOjM5ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIGNoZWNrOiBJZ25vcmUgb3N4IGF1ZGlvL3ZpZGVvIHNyYy9zaW5rcyBpbiBzdGF0ZSBjaGFuZ2UgdGVzdHMKKwkgIEFuZCBtYWtlIHRoZSBsaW5lIHJlYWRhYmxlIGZvciB0aG9zZSBtZXJlIG1vcnRhbHMgdGhhdCBkb24ndCBvd24gYSAzMCIgc2NyZWVuCisKKzIwMTAtMDQtMTIgMTg6MDM6MjAgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxlbmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdsaW1pdGVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ3ZvbHVtZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc3BlY3RydW0uYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvZmlsdGVyLmM6CisJICBjaGVjazogRG9uJ3QgcmUtZGVjbGFyZSAnR0xpc3QgKmJ1ZmZlcnMnIGluIHRoZSB0ZXN0cworCSAgSXQncyBhbiBleHRlcm5hbCB3aGljaCBsaXZlcyBpbiBnc3RjaGVjay5jLiBSZWRlY2xhcmluZyBpdCBtYWtlcyBzb21lCisJICBjb21waWxlcnMvYXJjaGl0ZWN0dXJlcyB0aGluayB0aGUgJ2J1ZmZlcnMnIGluIHRoZSBpbmRpdmlkdWFsIHRlc3RzIGFyZQorCSAgYSBkaWZmZXJlbnQgc3ltYm9sLi4uIGFuZCB0aGVyZWZvcmUgd2UgZW5kIHVwIGNvbXBhcmluZyBob2xvZGVja3Mgd2l0aAorCSAgb3Jhbmdlcy4KKworMjAxMC0wNC0xMiAxNDo1MDo0NiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgbWF0cm9za2FkZW11eCwgcXRkZW11eDogbWlub3IgY29kZSBjbGVhbnVwIGluIGF2Y19sZXZlbF9pZGNfdG9fc3RyaW5nKCkKKwkgIERvIHRoZSBzYW1lIHdpdGggc2xpZ2h0bHkgZmV3ZXIgTE9DLgorCisyMDEwLTA0LTEyIDEyOjQwOjExICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IFJlbW92ZSAtV3VuZGVmIGZsYWcKKwkgIEZpeGVzICM2MTUxNjEKKworMjAxMC0wNC0xMiAxMTo0Mzo0OSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IEZpeCBJNDIwLT5BWVVWIGNvcHlpbmcKKworMjAxMC0wNC0xMiAxMToyNTo1OSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IENvcnJlY3RseSBjbGFtcCBmcmFtZS9iYWNrZ3JvdW5kIGFscGhhcyB0byBbMCwyNTVdIGJlZm9yZSB3cml0aW5nIHRoZW0KKworMjAxMC0wNC0xMiAxMToxNjo1NiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkgIGNoZWNrOiBJZ25vcmUganBlZ2VuYyB0ZXN0CisKKzIwMTAtMDQtMTEgMTM6MTQ6MzAgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5oOgorCSAgZGVpbnRlcmxhY2U6IE9ubHkgY2hlY2sgaW50ZXJsYWNlZCBmbGFnIGluIHNpbmsgY2FwcworCSAgRml4ZXMgIzYxNTQ2MC4KKworMjAxMC0wNC0wOSAxMToyMTo0NyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBiYTMzZDFmIHRvIGZjODU4NjcKKworMjAxMC0wNC0wOCAxODowNTo0NiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIGRvY3M6IGRvIHByb3BlciBlc2NhcGluZyBmb3IgIiUiCisKKzIwMTAtMDQtMDggMTc6NTA6NDkgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcGdvb2dsZS5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcGdvb2dsZS5oOgorCSAgcnRzcDogcmVtb3ZlIG9ic29sZXRlIGdvb2dsZSBleHRlbnNpb24KKwkgIFRoaXMgd2FzIG5vdCBidWlsZCBmb3IgYSB3aGlsZSBhbmQgY2FuIGJlIHJlbW92ZWQuCisKKzIwMTAtMDQtMDggMTc6NDI6NTIgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBkb2NzOiBtb3ZlIHR3byBzeW1ib2xzIHRvIHByaXZhdGUgc2VjdGlvbgorCisyMDEwLTA0LTA4IDE3OjM2OjMwICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBkb2NzOiBhZGQgZmx4ZGVjIGRvY3MKKworMjAxMC0wNC0wOCAxNzoxNzowNiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAgZG9jczogZW5hYmxlIHRoZSAyIG9mIDY1IHJ0cCBlbGVtZW50cyBpbiB0aGUgZG9jcworCisyMDEwLTA0LTA4IDExOjU0OjE5ICswMjAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmM6CisJICBzaG91dDI6IERvbid0IHdhaXQgaWYgd2UncmUgbGF0ZQorCSAgSW4gZmFjdCwgZHVlIHRvIHNpZ25lZG5lc3MgaXNzdWVzLCBhIG5lZ2F0aXZlIGRlbGF5IHdvdWxkIGJlIGNoYW5nZWQgdG8KKwkgIGFuIGFsbW9zdCBpbmZpbml0ZSB3YWl0IGNhdXNpbmcgc2hvdXQyc2VuZCB0byAibG9jayB1cCIuCisJICBSZXBvcnRlZCBieSBDaHJpc3RvcGhlciBNb250Z29tZXJ5LgorCisyMDEwLTA0LTA4IDE2OjU2OjM3ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICBkb2NzOiB1cGQgLT4gdWRwIGFuZCB2b2lsYSBpdCBzaG93cyB1cCBpbiB0aGUgZG9jcworCisyMDEwLTA0LTA4IDE2OjUxOjI3ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5oOgorCSAgZG9jczogZml4IGRvYyBibG9iIHN5bnRheAorCisyMDEwLTA0LTA4IDE2OjUxOjA1ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBkb2NzOiBhZGQgKHNwYXJzZSkgZG9jcyBmb3IgYXVwYXJzZSBlbGVtZW50CisKKzIwMTAtMDQtMDggMTQ6NDA6NDMgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBkb2NzOiBhZGQgdmlkZW9ib3ggc3ltYm9scworCisyMDEwLTA0LTA4IDE0OjQwOjE5ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgIGRvY3M6IHJlbW92ZSBkeW51ZHBzaW5rIHVudGlsIHNvbWVvbmUgZG9jdW1lbnRzIGl0CisKKzIwMTAtMDQtMDggMTQ6MzQ6NTkgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IG1ha2UgZGVidWcgY2F0ZWdvcnkgc3RhdGljCisKKzIwMTAtMDQtMDggMTQ6Mjk6MTkgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4Lmg6CisJICBmbHhkZW11eDogcmVuYW1lIEdzdEZMVkRlbXV4IGZvciBHc3RGbHZEZW11eAorCisyMDEwLTA0LTA4IDE0OjIzOjE5ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuaDoKKwkgIGZsdmRlbXV4OiBtZXJnZSBmbHZwYXJzZSBpbnRvIHRoZSBkZW11eGVyIGFuZCBtYWtlIGZ1bmN0aW9uIHN0YXRpYworCSAgTm8gbmVlZCB0byBoaWRlIGNlcnRhaW4gZnVuY3Rpb24gaW4gdGhlIGRvY3MuIEFsbG93cyB0byBkbyBtb3JlIGNsZWFudXBzLgorCisyMDEwLTA0LTA4IDEzOjEzOjM0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmg6CisJICBhbHBoYTogQWRkIGRvY3VtZW50YXRpb24KKworMjAxMC0wNC0wOCAxNDowMDowOCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgIGRvY3M6IHY0bDJidWZmZXIgcG9vbCBpcyBub3cgYSBzZXBhcmF0ZSBvYmplY3QsIHJlbW92ZSB0aGVtIGZyb20gdjRsMnNyYyBkb2NzCisKKzIwMTAtMDQtMDggMTM6NTg6MTEgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBkb2NzOiByZW1vdmUgbm9uIGV4aXN0aW5nIGZsYWdzIGFuZCBhZGQgdHdvIGludGVybmFsIG1ldGhvZHMKKwkgIElmIHNvbWVvbmUgY2FyZXMgZmx2cGFyc2UgY291bGQgYmUgbWVyZ2VkIGludG8gZmx2ZGVtdXguCisKKzIwMTAtMDQtMDggMTM6NTc6MDkgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjogcmVtb3ZlIHByb3RvdHlwZSBmb3Igbm9uIGV4aXN0aW5nIGZ1bmN0aW9uCisJICBUaGVyZSBpcyBubyBmdW5jdGlvbiBieSB0aGF0IG5hbWUgYW55d2hlcmUuCisKKzIwMTAtMDQtMDggMTI6NTY6NTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSAgZG9jczogVXBkYXRlIGluc3BlY3RlZCBwbHVnaW4gaW5mb3JtYXRpb24KKworMjAxMC0wNC0wOCAxMjo1NjozMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJICBhbHBoYWNvbG9yOiBJbXByb3ZlIGRvY3MgYSBiaXQKKworMjAxMC0wNC0wOCAxMzo0Nzo0MiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgIGRvY3M6IGFkZCBlZmZlY3R0diBkZWZpbmVzIGFuZCByZW9yZGVyIGxpc3QKKworMjAxMC0wNC0wOCAxMzo0MTo0NyArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgIGRvY3M6IHJlbW92ZSB0aHJlZSBlbnRyaWVzIHRoYXQgYXJlIG5vdCBleHBvcnRlZCBmcm9tIHRoZSBoZWFkZXJzIGFueW1vcmUKKworMjAxMC0wNC0wOCAxMzo0MDozNiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmg6CisJICBqcGVnZGVjOiBtb3ZlIG1hY3JvIHRvIGMgc291cmNlCisJICBPbmUgbGVzcyBzZW1pIHB1YmxpYyBzeW1ib2wgd2l0aG91dCBuYW1lc3BhY2UgcHJlZml4IGluIHRoZSBoZWFkZXJzLgorCisyMDEwLTA0LTA4IDEzOjQwOjA5ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5oOgorCSAgc3BlZXhlbmM6IHJlbW92ZSB1bnVzZWQgZGVmaW5lcworCisyMDEwLTA0LTA4IDEzOjIzOjM4ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thLW11eDogZml4IGxhc3QgY29tbWl0CisJICBVc2UgYSBsb2NhbCBkZWZpbmUgZm9yIFdBVkVGT1JNQVRfRVggYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIHN0cnVjdCArIDIgYnl0ZXMKKwkgIGZvciB0aGUgZXh0ZW5zaW9uIHNpemUuCisKKzIwMTAtMDQtMDggMTM6MTY6NTMgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmg6CisJICBzcGVleDogcmVtb3ZlIHVudXNlZCBkZWZpbmUKKworMjAxMC0wNC0wOCAxMzowMzo0MyArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvd2F2ZW5jL01ha2VmaWxlLmFtOgorCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIGdzdC93YXZlbmMvcmlmZi5oOgorCSAgd2F2ZW5jOiByZW1vdmUgaW50ZXJuYWwgY29weSBvZiByaWZmLmggYW5kIHVzZSByaWZmLWxpYnJhcnkgaW5zdGVhZC4KKwkgIFdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24geWV0LCBqdXN0IHRoZSBzdHJ1Y3R1cmVzIGFuZCBkZWZpbmVzLgorCisyMDEwLTA0LTA4IDEyOjU2OjA5ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkgIG1hdHJvc2thbXV4OiB1c2UgcmlmZiBsaWIgbW9yZQorCSAgUmVtb3ZlIEJJVE1BUElORk9IRUFERVIgYW5kIHVzZSB0aGUgb25lIGZyb20gcmlmZi1saWIuIEFsc28gcmVtb3ZlIHRoZQorCSAgV0FWRUZPUk1BVEVYX1NJWkUgZGVmaW5lIGFuZCB1c2UgYSBzaXplb2YgdG9nZXRoZXIgd2l0aCB0aGUgcmVzcGVjdGl2ZSBzdHJ1Y3QuCisJICBCZXNpZGVzIGJldHRlciBjb2RlIHJldXNlIHRoaXMgbGVzc2VucyB0aGUgdW51bnNlZCBzeW1ib2xzIGluIHRoZSBkb2NzLgorCisyMDEwLTA0LTA4IDEyOjE0OjA3ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuaDoKKwkgIGRvY3M6IHRyaW0gc2VjdGlvbnMgZmlsZSBtb3JlCisJICBSZW5hbWUgc29tZSBkZWZpbmVzIGFuZCBtb3ZlIHNvbWUgaXRlc20gdG8gKi5jIGZpbGVzLiBBZGQgbW9yZSBpdGVtcyB0byBpbnRlcm5hbAorCSAgc3Vic2VjdGlvbi4KKworMjAxMC0wNC0wOCAxMToxOTo0MyArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgIGRvY3N3OiB0cmltIHRoZSBzZWN0aW9uIGZpbGUKKworMjAxMC0wNC0wOCAxMDoyNjoyNSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgZG9jczogYWRkIHY0bDJzaW5rIHRvIGRvY3MKKworMjAxMC0wNC0wOCAxMDoxNTowOCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgZG9jczogZml4IHhtbAorCSAgVGhlIHRpdGxlIHRhZyBiZWxvbmdzIGludG8gdGhlIHJlZnNlY3QyLgorCisyMDEwLTA0LTA3IDE3OjQzOjU2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogQWRkIHN1cHBvcnQgZm9yIFlWMTIsIGluY2x1ZGluZyBjb252ZXJzaW9uIHN1cHBvcnQgZm9yIEk0MjAvQVlVVgorCisyMDEwLTA0LTA3IDE3OjI3OjEyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogQWRkIHN1cHBvcnQgZm9yIGdyYXlzY2FsZSBpbnB1dC9vdXRwdXQKKwkgIFRoaXMgZG9lc24ndCBkbyBhbnkgY29udmVyc2lvbiBhbmQgaXMgdGhlIG5leHQgc3RlcCB0bworCSAgcmVwbGFjaW5nIHZpZGVvY3JvcCBieSBzdXBwb3J0aW5nIGFsbCByZW1haW5pbmcgZm9ybWF0cworCSAgaW4gcGFzc3Rocm91Z2ggbW9kZS4KKworMjAxMC0wNC0wNyAxNjoyNDozOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94Lmg6CisJICB2aWRlb2JveDogQWRkIHN1cHBvcnQgZm9yIGZpbGxpbmcgdGhlIGJhY2tncm91bmQgd2l0aCByZWQsIHllbGxvdyBhbmQgd2hpdGUKKworMjAxMC0wNC0wNyAxNjoxMToxMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IEFkZCBzdXBwb3J0IGZvciBkaXJlY3QgUkdCPC0+QVlVViBjb252ZXJzaW9uCisKKzIwMTAtMDQtMDcgMTY6MTE6MDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBGaXggUkdCMjQgZmlsbGluZworCisyMDEwLTA0LTA3IDE2OjA2OjU0ICswMzAwICBNYXJjbyBCYWxsZXNpbyA8bWFyY28uYmFsbGVzaW9Abm9raWEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgaDI2NGRlcGF5OiBoYW5kbGUgcHJvcGVybHkgU1RBUHMKKwkgIGluIHJ0cGgyNjRkZXBheS5jLCBsaW5lcyA1NzctNTc2LCBOQUxVLXR5cGUgMjQgKFNpbmdsZS1UaW1lIEFnZ3JlZ2F0aW9uCisJICBQYWNrZXQpIGlzIGhhbmRsZWQgaW4gZmFsbC10aHJvdWdoIGFzIE5BTFUtdHlwZSAyNiAodW5oYW5kbGVkKS4KKwkgIFRoaXMgbGVhZHMgaGlnaCBxdWFsaXR5IGgyNjQgc3RyZWFtcyBzdWNoIGFzOgorCSAgcnRzcDovL3N0cmVhbS55bGUubW9iaS95bGUvYXJlZW5hL01FRElBX0UwMzQyNjU3X3AzLm1wNAorCSAgdG8gZmFpbCB3aXRoICJOQUwgdW5pdCB0eXBlIDI0IG5vdCBzdXBwb3J0ZWQgeWV0IiAoYnV0IGl0J3MgYWN0dWFsbHkKKwkgIHN1cHBvcnRlZCksIGFuZCB0aHVzIHRvIGNsb3NlIGFueSBzdHJlYW0gd2hpY2ggY29udGFpbnMgU1RBUHMuCisJICBUaGUgcHJvcG9zZWQgb25lLWxpbmVyIHBhdGNoIGZpeGVzIHRoZSBpc3N1ZS4KKwkgIEZpeGVzICM2MTUwNTEuCisKKzIwMTAtMDQtMDcgMTM6NDc6MDIgKzAyMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIGdzdC1saWJzL2dzdC9nc3QtaTE4bi1wbHVnaW4uaDoKKwkqIGdzdC9hdmkvZ3N0YXZpLmM6CisJICBidWlsZDogZml4IGNvbXBpbGVyIHdhcm5pbmdzCisJICBmaXggd2FybmluZ3MgZm9yIGFsbCBwbHVnaW5zIHRoYXQgdXNlOiBzZXRsb2NhbGUgKExDX0FMTC4uLgorCisyMDEwLTA0LTA3IDEzOjMxOjEzICswMjAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aS5jOgorCSAgYXZpOiBmaXggY29tcGlsZXIgd2FybmluZworCisyMDEwLTAzLTMxIDE3OjU0OjIxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiByZXN0cmljdCByZXN5bmNpbmcgdG8gc3VidGl0bGUgdHJhY2tzCisJICBUaGlzIHNob3VsZCBwcmV2ZW50IHNraXBwaW5nIGF1ZGlvIG9yIHZpZGVvIGluIG5vdCBzbyB3ZWxsIGludGVybGVhdmVkCisJICBjYXNlcy4KKwkgIEZpeGVzICM2MTQ0NjAuCisKKzIwMTAtMDQtMDYgMTM6MjE6NTEgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGZvcmRfcHJlZmVjdEBnZW50b28ub3JnPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2ZvdXJjYy5oOgorCSAgcXRkZW11eDogUG9zdCBhdmcuL21heC4gYml0cmF0ZSB0YWdzIGZvciBILjI2NAorCSAgVGhpcyByZWFkcyB0aGUgYXZlcmFnZSBhbmQgbWF4aW11bSBiaXRyYXRlcyBmcm9tIHRoZSAnYnRydCcgYXRvbSBpZgorCSAgYXZhaWxhYmxlLCBhbmQgcHVzaGVzIHRoZXNlIGFzIHRhZ3MsCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjE0OTI3CisKKzIwMTAtMDQtMDMgMjM6Mzk6MjAgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBmaXggcmFjeSBzaHV0ZG93bgorCSAgS2VlcCBhIHJlZiBvZiBwdWxzZXNpbmsgZm9yIGRlZmVycmVkIG1haW5sb29wIGludm9jYXRpb24uIEZpeGVzICM2MTQ3NjUKKworMjAxMC0wNC0wNSAxNTo0ODoxNyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvanBlZ2VuYy5jOgorCSAgdGVzdHM6IGpwZWdlbmM6IEFkZHMgc29tZSBnZXRjYXBzIHRlc3QKKwkgIEFkZHMgdGVzdHMgZm9yIHRoZSBqcGVnZW5jIGdldGNhcHMgZnVuY3Rpb24sIHRvIGF2b2lkCisJICBoYXZpbmcgaXQgcmV0dXJuaW5nIG5vbi1zdWJzZXQgY2FwcworCisyMDEwLTA0LTA1IDE0OjUxOjU4IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAganBlZ2VuYzogRml4IGdldGNhcHMgZnVuY3Rpb24KKwkgIFdoZW4gY3JlYXRpbmcgdGhlIGNhcHMgYWxsb3dlZCB0byB1cHN0cmVhbSB1c2luZyBkb3duc3RyZWFtCisJICByZXN0cmljdGlvbnMsIHVzZSBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgYXMgdGhhdCBoYXMgdGhlCisJICB1c2FibGUgZm9ybWF0cyBhbmQgcHV0cyBpbnRvIGl0IHRoZSB3aWR0aCwgaGVpZ2h0IGFuZCBmcmFtZXJhdGUKKwkgIGZpZWxkcy4gVGhpcyBhdm9pZHMgZ2V0dGluZyBlcnJvcnMgYWJvdXQgZ2V0Y2FwcyByZXR1cm5pbmcKKwkgIG5vbiBzdWJzZXQgY2FwcyBvZiBpdHMgcGFkIHRlbXBsYXRlLgorCSAgVGhpcyBlcnJvciBzaG93ZWQgdXAgb24gdGhlIG1ldGFkYXRhIHBsdWdpbiB1bml0IHRlc3QgaW4gLWJhZC4KKworMjAxMC0wNC0wNSAxNzozMTozNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IEZpeCBjb252ZXJzaW9uIGZyb20gMyBieXRlIFJHQiB0byBBUkdCCisKKzIwMTAtMDQtMDUgMTc6MDg6MTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBBZGQgc3VwcG9ydCBmb3IgMyBieXRlIFJHQiBmb3JtYXRzIGFuZCByZWZhY3RvciBSR0IgY29kZSBhIGJpdAorCisyMDEwLTA0LTA1IDE1OjUxOjEzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guaDoKKwkgIHZpZGVvYm94OiBBZGQgc3VwcG9ydCBmb3IgYWxsIDMyIGJpdCBSR0IgZm9ybWF0cworCSAgLi4uaW5jbHVkaW5nIGNvbnZlcnNpb24gYmV0d2VlbiB0aGVtLgorCisyMDEwLTA0LTA1IDE1OjI2OjAzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBhZGQgcHJvcGVydHkgdG8gY29udHJvbCB0aGUgYnVmZmVyaW5nIG1ldGhvZAorCSAgQWRkIGEgcHJvcGVydHkgdG8gY29udHJvbCBob3cgdGhlIGppdHRlcmJ1ZmZlciBwZXJmb3JtcyB0aW1lc3RhbXBpbmcgYW5kCisJICBidWZmZXJpbmcuCisKKzIwMTAtMDQtMDQgMTk6MDI6NDEgLTAzMDAgIEFuZHLDqSBEaWViIE1hcnRpbnMgPGFuZHJlLmRpZWJAZ21haWwuY29tPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSAgYWxwaGFjb2xvcjogUmVtb3ZpbmcgdW51c2VkIHZhcmlhYmxlCisJICBGaXhlcyBidWcgIzYxNDg0My4KKworMjAxMC0wNC0wNCAyMDozMTozOCAtMDMwMCAgQW5kcsOpIERpZWIgTWFydGlucyA8YW5kcmUuZGllYkBnbWFpbC5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWdlbmM6IHNob3VsZCBub3QgcmV0dXJuIGNhcHMgQU5ZIGJhc2VkIG9uIGRvd25zdHJlYW0KKwkgIFdoZW4gZG93bnN0cmVhbSBoYXMgYSBzaW5rIHBhZCB3aXRoIEFOWSBjYXBzLCBqcGVnZW5jIHNob3VsZAorCSAgdHJlYXQgaXQgdGhlIHNhbWUgYXMgTlVMTCBhbmQgcmV0dXJuIGl0cyB0ZW1wbGF0ZSBjYXBzLgorCSAgRml4ZXMgIzYxNDg0MgorCisyMDEwLTA0LTA0IDIyOjI4OjMzICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy9vc3MvZ3N0b3NzaGVscGVyLmM6CisJICBvc3M6IGFkZCBmaXhtZSBjb21tZW50CisKKzIwMTAtMDQtMDQgMjI6MjY6NTkgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ2NvbmYvTWFrZWZpbGUuYW06CisJICBidWlsZDogdXNlICQoYnVpbGRkaXIpIGZvciBpbnN0YWxsaW5nIGdlbmVyYXRlZCBmaWxlcworCisyMDEwLTA0LTA0IDIyOjA3OjMzICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIFJldmVydCAiY29uZmlndXJlOiBmaXggb3V0IG9mIHNvdXJjZSBkaXIgYnVpbGRzIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCBjYTBiZDNhOGNlYTMxZjllYTBkZjc5OGE4M2QzMDA3ZTY5Njk1OGJhLgorCisyMDEwLTA0LTA0IDIxOjM2OjM1ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogZml4IG91dCBvZiBzb3VyY2UgZGlyIGJ1aWxkcworCSAgUmVtb3ZlIG5vbi1leGlzdGluZyBnc3QtbGlicyBmcm9tIGluY2x1ZGUgYW5kIGxpYnJhcnktcGF0aHMnLgorCSAgRml4ZXMgIzYxNDM1NCBldmVuIG1vcmUuCisKKzIwMTAtMDQtMDEgMTA6MTk6MDAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2ZvdXJjYy5oOgorCSAgcXRkZW11eDogUmVhZCByZXBsYXlnYWluIHBlYWsvZ2FpbiB0YWdzCisJICBNYWtlIHF0ZGVtdXggcmVhZCB0YWdzIHJlcGxheWdhaW4gdGFncyB0aGF0IGFyZSB3aXRoaW4gJy0tLS0nIGF0b21zLgorCSAgRml4ZXMgIzYxNDQ3MQorCisyMDEwLTA0LTAxIDE4OjQ4OjQzICswNTMwICBBcnVuIFJhZ2hhdmFuIDxmb3JkX3ByZWZlY3RAZ2VudG9vLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBtYXRyb3NrYTogRXhwb3J0IGguMjY0IHByb2ZpbGUgYW5kIGxldmVsIGluIGNhcHMKKwkgIFRoaXMgcmVwbGljYXRlcyB0aGUgY29kZSBpbiBxdGRlbXV4IHRvIGV4cG9ydCB0aGUgaC4yNjQgcHJvZmlsZSBhbmQKKwkgIGxldmVsIGluIHRoZSBzdHJlYW0gY2Fwcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MTQ2NTEKKworMjAxMC0wNC0wMiAxODo1MDo0NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBvZmYtYnktb25lIGludHJvZHVjZWQgaW4gbGFzdCBjb21taXQKKworMjAxMC0wNC0wMSAxODozODozOCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Zm9yZF9wcmVmZWN0QGdlbnRvby5vcmc+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IE1pbm9yIHJlZmFjdG9yIG9mIHRoZSBjb2RlCisJICBUaGlzIHdpbGwgbWFrZSBpdCBlYXNpZXIgdG8gY2x1bXAgdG9nZXRoZXIgY29tbW9uIGNvZGUgd2hlbiBjb3B5aW5nIHRvCisJICBtYXN0cm9za2FkZW11eC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MTQ2NTEKKworMjAxMC0wNC0wMSAxODoxNzowOSArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Zm9yZF9wcmVmZWN0QGdlbnRvby5vcmc+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEV4cG9ydCBoLjI2NCBsZXZlbCBpbiBjYXBzCisJICBUaGlzIGV4cG9ydHMgdGhlIGguMjY0IGxldmVsIGluIHRoZSBzdHJlYW0gY2FwcyAoYXMgYSBzdHJpbmcpIHdoaWNoIGNhbgorCSAgYmUgdXNlZCB0byBtYXRjaCBhIGRlY29kZXIsIG9yIGFzIG1ldGFkYXRhLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxNDY1MQorCisyMDEwLTA0LTAxIDE2OjU4OjMyICswNTMwICBBcnVuIFJhZ2hhdmFuIDxmb3JkX3ByZWZlY3RAZ2VudG9vLm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRXhwb3J0IGguMjY0IHByb2ZpbGUgaW4gY2FwcworCSAgVGhpcyBhZGRzIHRoZSBoLjI2NCBwcm9maWxlIGZvciBhIGdpdmVuIHN0cmVhbSBpbnRvIGNhcHMuIFRoaXMgY2FuCisJICAoZXZlbnR1YWxseSkgYmUgdXNlZCB0byBzZWxlY3QgYW4gYXBwcm9wcmlhdGUgZGVjb2RlciBhbmQgYXMgbWV0YWRhdGEKKwkgIGZvciBjZXJ0YWluIGFwcGxpY2F0aW9ucy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MTQ2NTEKKworMjAxMC0wMy0zMSAxNDo0MzoxNCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiByZW1vdmUgb2Jzb2xldGUgcmV2ZXJzZSBwbGF5YmFjayBjb2RlIHBhdGgKKworMjAxMC0wMy0zMSAxNDo0MDo1MCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIGZsdmRlbXV4OiBzdXBwb3J0IChwdWxsIG1vZGUpIG5lZ2F0aXZlIHNlZWsgcmF0ZQorCisyMDEwLTAzLTI5IDE1OjI3OjM3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IGFsc28gY2hlY2sgZm9yIHNlZ21lbnQgc3RvcCBmb3Igbm9uLXNlZ21lbnQtc2VlaworCisyMDEwLTAzLTMwIDE2OjUwOjEwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBwdXNoIGNvcnJlY3RseSBzaXplZCBmbGFjIGhlYWRlciBidWZmZXJzCisJICBGaXhlcyAjNjE0MzUzLgorCisyMDEwLTAzLTMwIDA3OjM0OjA3IC0wNTAwICBSb2IgQ2xhcmsgPHJvYkB0aS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGJ1aWxkOiBmaXggY29tcGlsZXIgd2FybmluZyB3aGVuIHNyY2RpciAhPSBidWlsZGRpcgorCSAgRml4ZXMgJy4uLy4uL2dzdC1saWJzOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5JyB3YXJuaW5nL2Vycm9yIHdoZW4KKwkgIHRoZSBidWlsZCBkaXJlY3RvcnkgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgorCSAgRml4ZXMgIzYxNDM1NC4KKworMjAxMC0wMy0zMCAwMTo1MDozMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOgorCSAgaWQzZGVtdXg6IGZpeCBwYXJzaW5nIG9mIHVuc3luY2VkIGZyYW1lcyB3aXRoIGRhdGEgbGVuZ3RoIGluZGljYXRvcgorCSAgRml4ZXMgYnVnICM2MTQxNTguCisKKzIwMTAtMDMtMjkgMTE6MDA6MDQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBnc3QvTWFrZWZpbGUuYW06CisJKiBzeXMvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9leGFtcGxlcy9NYWtlZmlsZS5hbToKKwkgIGJ1aWxkOiBidWlsZCBwbHVnaW5zIGFuZCBleGFtcGxlcyBpbiBwYXJhbGxlbCB3aGVyZSBwb3NzaWJsZQorCisyMDEwLTAzLTE4IDE4OjQ5OjI0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgZGlyZWN0c291bmRzaW5rOiBmaXggcmVkdW5kYW50IGZ1bmN0aW9uIHJlZGVjbGFyYXRpb24gY29tcGlsZXIgd2FybmluZ3MKKwkgIFJlLWFwcGx5IHRoaXMgYWdhaW4gYXMgd2VsbCwgYXMgaXQgd2FzIHVuZG9uZSBieSB0aGUgcHJldmlvdXMgY29tbWl0Li4KKworMjAxMC0wMy0xOCAxNDozMTozNSArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlscyA9PiBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUKKwkgIEFwcGx5IHRoaXMgYWdhaW4sIGFzIGl0IHdhcyBvdmVyd3JpdHRlbiBieSB0aGUgcHJldmlvdXMgY29tbWl0LiBNZXJnaW5nCisJICBpcyBoYXJkLCBhcHBhcmVudGx5LgorCisyMDEwLTAzLTI2IDIzOjIwOjEwICswMTAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AZmx1ZW5kby5jb20+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuaDoKKwkgIGRpcmVjdHNvdW5kc2luazogSW1wbGVtZW50IFNQRElGIHN1cHBvcnQgZm9yIEFDMy4KKwkgIERldGVjdCBpZiB0aGUgc291bmQgY2FyZCBzdXBwb3J0cyBTUERJRiBwYXNzdGhydSBvZiBBQzMgYW5kIGFkZAorCSAgbmVjZXNzYXJ5IGNvZGUgdG8gc3VwcG9ydCB0aGF0IGxpa2UgYWxzYXNpbmsuCisKKzIwMTAtMDMtMjYgMTc6MDY6NTcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBNYWtlZmlsZS5hbToKKwkgIGJ1aWxkOiBhZGQgY3J1ZnQgYWxlcnQgZm9yIGNvbW1vbi9zaGF2ZSoKKworMjAxMC0wMy0yNiAxNjo1MDoyMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L01ha2VmaWxlLmFtOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9sYW5nLmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2xhbmcuaDoKKwkgIHF0ZGVtdXg6IGV4dHJhY3Qgc3RyZWFtIGxhbmd1YWdlIGluIG1vcmUgY2FzZXMKKwkgIFRoZSAxNi1iaXQgbGFuZ3VhZ2UgY29kZSBjYW4gYmUgZWl0aGVyIGEgcGFja2VkIElTTy02MzktMlQgY29kZQorCSAgb3IgYSAnTWFjaW50b3NoIGxhbmd1YWdlIGNvZGUnLiBIYW5kbGUgdGhlIGxhdHRlciB0eXBlIG9mIGxhbmd1YWdlCisJICBjb2RlcyBhcyB3ZWxsLCBhbmQgbWFwIHRvIHRoZSBtYXRjaGluZyBJU08gY29kZS4gTGFzdGx5LCBmaXgKKwkgIGxhbmd1YWdlIGNvZGUgcG9zdGluZyBmb3IgbGFuZ3VhZ2UgIzAsIHdoaWNoIGlzIHZhbGlkIGFuZCBzdGFuZHMKKwkgIGZvciAnRW5nbGlzaCcuCisJICBGaXhlcyAjNjE0MDAxLgorCisyMDEwLTAzLTI2IDE0OjU1OjUzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogSW1wcm92ZSBkZWJ1Z2dpbmcgYW5kIGFkZCBzb21lIEZJWE1FcworCisyMDEwLTAzLTI2IDE0OjQyOjA2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogU2FtcGxlIHJhdGUgbWFya2VycyAweDAxLCAweDAyIGFuZCAweDAzIGFyZSB2YWxpZAorCSAgVGhleSBhcmUgZm9yIDg4LjJrSHosIDE3Ni40a0h6IGFuZCAxOTJrSHouCisKKzIwMTAtMDMtMjYgMTQ6MTY6MzkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBmbGFjZGVjOiBUYWtlIHNhbXBsZXJhdGUsIHdpZHRoIGFuZCBudW1iZXIgb2YgY2hhbm5lbHMgZnJvbSB0aGUgU1RSRUFNSU5GTworCSAgLi4uYW5kIHVwZGF0ZSBpdCBmcm9tIHRoZSBmcmFtZSBoZWFkZXJzIGlmIGl0IHNob3VsZCBjaGFuZ2UgZm9yIHNvbWUgcmVhc29uLgorCSAgVGhpcyBhbGxvd3MgcGxheWJhY2sgb2YgZmlsZXMgd2l0aCBvZGQgc2FtcGxlIHJhdGVzLgorCisyMDEwLTAzLTI2IDEzOjQ1OjQ2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogRml4IEFZVVYtPkk0MjAgZnJhbWUgY29weWluZworCisyMDEwLTAzLTI2IDEzOjM0OjE3ICswMTAwICBSYWltbyBKw6RydmkgPHJhaW1vLmphcnZpQGdtYWlsLmNvbT4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAganBlZ2VuYzogU2V0IGNvcnJlY3QgZ2V0Y2Fwcy9zZXRjYXBzIGZ1bmN0aW9ucyBvbiBzcmNwYWRzIGFuZCBzaW1wbGlmeSB0aGVtCisJICBUaGlzIGZpeGVzIGRvd25zdHJlYW0gbmVnb3RpYXRpb24sIHVwc3RyZWFtIG5lZ290aWF0aW9uIGlzbid0IHJlYWxseQorCSAgc3VwcG9ydGVkIGJ5IGpwZWdlbmMgeWV0LgorCSAgRml4ZXMgYnVnICM2MTM3ODkuCisKKzIwMTAtMDMtMjYgMTA6MzE6MjIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5oOgorCSAgdmlkZW9ib3g6IEFsd2F5cyBmaWxsIHRoZSBjb21wbGV0ZSBmcmFtZSBpZiBib3JkZXJzIHNob3VsZCBiZSBhZGRlZAorCSAgVGhpcyBtYWtlcyBzdXJlIHRoYXQgd2UgZG9uJ3QgZ2V0IGFueSBnYXBzIGJldHdlZW4gcmVjdGFuZ2xlcyBiZWNhdXNlCisJICBvZiBjaHJvbWEgc3Vic2FtcGxpbmcgZm9yIGV4YW1wbGUuCisKKzIwMTAtMDMtMTggMjI6MTI6NDAgKzAwMDAgIERhbWllbiBMZXNwaWF1IDxkYW1pZW4ubGVzcGlhdUBpbnRlbC5jb20+CisKKwkqIGF1dG9nZW4uc2g6CisJICBhdXRvZ2VuLnNoOiBEb24ndCBjYWxsIGNvbmZpZ3VyZSB3aXRoIC0tZW5hYmxlLXBsdWdpbi1kb2NzCisJICBjb25maWd1cmUgZ2l2ZXMgYSBuaWNlIHdhcm5pbmc6CisJICBjb25maWd1cmU6IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAtLWVuYWJsZS1wbHVnaW4tZG9jcworCSAgYW5kIGluZGVlZCwgSSBjb3VsZCBub3QgZmluZCBhbnl0aGluZyBpbiB0aGUgY29uZmlndXJlLmFjIG9yIHRoZSBtNAorCSAgbWFjcm9zIHRoYXQgd291bGQgYWxsb3cgZW5hYmxpbmcgdGhhdCBvcHRpb24uIFJlbW92ZSBpdCB0aGVuLgorCisyMDEwLTAzLTIyIDE2OjU4OjI2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guaDoKKwkgIHZpZGVvYm94OiBSZWZhY3RvciBib3hpbmcgdG8gcmVkdWNlIGNvZGUgZHVwbGljYXRpb24KKworMjAxMC0wMy0yMiAxMzoxMzo1OSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgYWxwaGE6IFNpbXBsaWZ5IGNhcHMgdHJhbnNmb3JtYXRpb24KKworMjAxMC0wMy0yMSAyMDoxNDoxOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IEFkZCBjb25zdCBxdWFsaWZpZXIgdG8gdGhlIHNvdXJjZSBmcmFtZSBkYXRhCisKKzIwMTAtMDMtMjMgMTc6NDc6NDggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IG9ubHkgc2VlayB3aGVuIGluIHByb3BlciBzdGF0ZQorCSAgLi4uIGFuZCBkYXRhIHN0cnVjdHVyZXMgY2FuIGJlIHRocmVhZC1zYWZlbHkgYWNjZXNzZWQuCisJICBTZWUgIzYwMTYxNy4KKworMjAxMC0wMy0yMyAxNzozNDo1MCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICBtYXRyb3NrYWRlbXV4OiBzdXBwb3J0IChwdWxsIG1vZGUpIG5lZ2F0aXZlIHNlZWsgcmF0ZQorCisyMDEwLTAzLTE4IDE1OjI5OjAwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkgIG1hdHJvc2thZGVtdXg6IHRyYWNrIGNsaXAgZHVyYXRpb24gaW4gc2VnbWVudAorCisyMDEwLTAzLTE4IDEzOjM5OjA1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBwcmVmZXIgaW5kZXggb2YgdmlkZW8gdHJhY2sgdG8gcGVyZm9ybSBzZWVraW5nCisKKzIwMTAtMDMtMjUgMjI6NTg6NDcgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZmRldGVjdC5jOgorCSAgZHRtZmRldGVjdDogaWYgd2UgdGVsbCB0aGF0IHdlIGhhbmRsZSBnYXAgZmxhZ3MsIHRoZW4gZG8gc28KKworMjAxMC0wMy0yNSAyMjo1NTozMiArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvZHRtZi9nc3RkdG1mZGV0ZWN0LmM6CisJICBkdG1mZGV0ZWN0OiB1c2UgZ2xpYiB0eXBlcworCisyMDEwLTAzLTI1IDIyOjU0OjQ5ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZkZXRlY3QuYzoKKwkgIGR0bWZkZXRlY3Q6IGZpeCBjbGFzc2lmaWNhdGlvbgorCisyMDEwLTAzLTI1IDIyOjUzOjIwICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZkZXRlY3QuYzoKKwkgIGR0bWZkZXRlY3Q6IHJlZm9ybWF0IG1lc3NhZ2UgZG9jcworCSAgVXNlIGEgbGlzdCBsaWtlIGluIG90aGVyIGVsZW1lbnQgZG9jcyBhcyBhbiB1bnR3ZWFrZWQgZG9jYm9vayB0YWJsZSBsb29rIHVnbHkuCisKKzIwMTAtMDMtMjQgMTY6MTk6NTMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogZml4IHR5cG8gaW4gaGVhZGVyIHZhbGlkYXRpb24gY2hlY2sKKworMjAxMC0wMy0yNCAxODo1MzoyMCArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDU1Y2Q1MTQgdG8gYzFkMDdkZAorCisyMDEwLTAzLTIzIDE5OjQ2OjQzICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzoKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5oOgorCSAgaWN5ZGVtdXg6IEhhbmRsZSB1cHN0cmVhbSBDb250ZW50LVR5cGUuCisJICBBbGxvd3MgdXMgdG8gaGFuZGxlIFNob3V0Q2FzdCBUViAoTlNWKSBzdHJlYW1zLgorCSAgSWYgdGhlIHVwc3RyZWFtIGNhcHMgaGF2ZSB0aGUgJ2NvbnRlbnQtdHlwZScgZmllbGQgc2V0IHRvIHZpZGVvL25zdiwgdGhlbgorCSAgd2Ugc2hvcnRjdXQgdGhlIHR5cGVmaW5kaW5nIGFuZCBzZXQgdmlkZW8veC1uc3YgZGlyZWN0bHkuCisKKzIwMTAtMDMtMjMgMTk6MzA6NTAgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogU2V0IHRoZSBDb250ZW50LVR5cGUgSFRUUCBoZWFkZXIgb24gdGhlIGNhcHMuCisJICBGaXJzdCBzdGVwIHRvIGZpeGluZyBTaG91dENhc3QgKE5TVikgc3RyZWFtaW5nLgorCisyMDEwLTAzLTIzIDAyOjM4OjQzIC0wNDAwICBUcmlzdGFuIE1hdHRoZXdzIDx0cmlzdGFuQHNhdC5xYy5jYT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvZWxlbWVudC5jOgorCSogc3lzL29zeHZpZGVvL01ha2VmaWxlLmFtOgorCSAgb3N4OiBmaXggY29tcGlsZXIgd2FybmluZ3MKKwkgIEFkZGVkIHZvaWQgcGFyYW1ldGVyIHRvIGF2b2lkIG9sZC1zdHlsZSBkZWZpbml0aW9uIHdhcm5pbmcuCisJICBBZGRlZCAtV25vLWFnZ3JlZ2F0ZS1yZXR1cm4gZmxhZyB0byBhdm9pZCBlcnJvbmVvdXMgYWdncmVnYXRlIHJldHVybiB3YXJuaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxMzY2MworCisyMDEwLTAzLTIzIDAwOjE1OjE1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6CisJICB0ZXN0czogdXNlIGxvb3AgdGVzdCBmb3IgbG9uZy1ydW5uaW5nIHZpZGVvY3JvcCBjaGVjaworCSAgVGhpcyBzaG91bGQgYXZvaWQgdGltZW91dHMgb24gc2xvdyBtYWNoaW5lcy4KKwkgIEZpeGVzICM1OTc3MzkuCisKKzIwMTAtMDMtMjIgMTc6MjY6MzcgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhYy5jOgorCSogZXh0L3B1bHNlL3BsdWdpbi5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFjay5jOgorCSogZ3N0LWxpYnMvZ3N0L2dldHRleHQuaDoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oOgorCSAgaTE4bjogYnVpbGQgZml4ZXM6ICNpZiAtPiAjaWZkZWYgZm9yIEVOQUJMRV9OTFMKKworMjAxMC0wMy0yMiAxNzoyNTowOSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QtbGlicy9nc3QvZ3N0LWkxOG4tcGx1Z2luLmg6CisJICBpMThuOiBmaXggdGhlIGJ1aWxkCisJICBEb24ndCBpbmxjdWRlIGxvY2FsZS5oIHdoaWNoIHdlIGluY2x1ZGUgaW4gZ2V0dGV4dC5oIGlmIG5lZWRlZC4gR3VhcmQgdGhlCisJICBpbmxjdWRlIGxpa2Ugd2UgZG8gaW4gdGhlIHNpbWlsbGFyIGhlYWRlcnMgaW4gY29yZS4KKworMjAxMC0wMy0yMiAxMzoxNjozMyArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuYzoKKwkgIEFkZCAtV3dyaXRlLXN0cmluZ3MKKwkgIGFuZCBmaXggaXRzIHdhcm5pbmdzCisKKzIwMTAtMDMtMjIgMTI6MDI6MTYgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgQWRkIC1XcmVkdW5kYW50LWRlY2xzIGZsYWcKKwkgIGFuZCBmaXggd2FybmluZ3MgZnJvbSBpdAorCisyMDEwLTAzLTIxIDIxOjM5OjE4ICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5oOgorCSAgQWRkIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVdtaXNzaW5nLXByb3RvdHlwZXMgdG8gY29uZmlndXJlIGZsYWdzCisJICBBbmQgZml4IGFsbCB3YXJuaW5ncworCisyMDEwLTAzLTIxIDE3OjQ2OjA2ICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIC1Xb2xkLXN0eWxlLWRlZmluaXRpb24gaXMgbm90IHZhbGlkIGZvciBDKysKKworMjAxMC0wMy0yMSAxNzozNjoyOCArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZS5jOgorCSAgbXVsdGlmaWxlOiBJbmNsdWRlIGhlYWRlcnMgaW5zdGVhZCBmbyBkZWZpbmluZyBmdW5jdGlvbnMKKworMjAxMC0wMy0yMSAxNzoyNDoxNCArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBBZGQgYSBsYXJnZSBzZXQgb2Ygd2FybmluZyBmbGFncy4KKwkgIE5vbmUgb2YgdGhlbSB0cmlnZ2VyIHdhcm5pbmdzIGFueW1vcmUsIHNvIG5vdGhpbmcgbmVlZGVkIHRvIGJlIGZpeGVkLgorCisyMDEwLTAzLTIxIDE3OjIzOjQzICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIGdzdC9nb29tL2NvbmZpZ19wYXJhbS5jOgorCSogZ3N0L2dvb20vY29udm9sdmVfZnguYzoKKwkqIGdzdC9nb29tL2ZpbHRlcnMuYzoKKwkqIGdzdC9nb29tL2ZseWluZ19zdGFyc19meC5jOgorCSogZ3N0L2dvb20vZ29vbV9jb25maWdfcGFyYW0uaDoKKwkqIGdzdC9nb29tL2dvb21fY29yZS5jOgorCSogZ3N0L2dvb20vZ29vbV9maWx0ZXJzLmg6CisJKiBnc3QvZ29vbS9nb29tX2Z4Lmg6CisJKiBnc3QvZ29vbS9pZnMuYzoKKwkqIGdzdC9nb29tL2lmcy5oOgorCSogZ3N0L2dvb20vcGx1Z2luX2luZm8uYzoKKwkqIGdzdC9nb29tL3RlbnRhY2xlM2QuYzoKKwkqIGdzdC9nb29tL3RlbnRhY2xlM2QuaDoKKwkgIE1ha2UgZ29vbSBub3QgdXNlIGFnZ3JlZ2F0ZSByZXR1cm5zCisKKzIwMTAtMDMtMjEgMTU6MTc6NDYgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbHV0aWxzLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxlbmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsYWNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2xpbWl0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy91ZHBzaW5rLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2ZpbHRlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFja2RlYy5jOgorCSogdGVzdHMvY2hlY2svZ2VuZXJpYy9zdGF0ZXMuYzoKKwkqIHRlc3RzL2ljbGVzL3Y0bDJzcmMtdGVzdC5jOgorCSAgQWRkIC1Xb2xkLXN0eWxlLWRlZmluaXRpb24gZmxhZworCSAgQW5kIGZpeCB0aGUgd2FybmluZ3MKKworMjAxMC0wMy0yMCAwMDo1NDoxNCArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvaGFsL2hhbC5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHB1c2hmaWxlc3JjLmM6CisJKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6CisJKiBnc3QvZ29vbS9jb25maWdfcGFyYW0uYzoKKwkqIGdzdC9nb29tL2dvb21fY29uZmlnX3BhcmFtLmg6CisJKiBnc3QvaWQzZGVtdXgvaWQzdGFncy5jOgorCSogZ3N0L2xhdy9hbGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOgorCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBzeXMvb3NzL2dzdG9zc21peGVydHJhY2suYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbl9idWZmZXJfbGlzdC5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3NpbXBsZS1sYXVuY2gtbGluZXMuYzoKKwkgIEFkZCAtV3dyaXRlLXN0cmluZ3MgdG8gdGhlIGNvbmZpZ3VyZSBmbGFncworCSAgLi4uIGFuZCBmaXggYWxsIHdhcm5pbmdzCisKKzIwMTAtMDMtMjEgMTE6MTQ6MTIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSAgc2hhcGV3aXBlOiBBZGQgc3VwcG9ydCBmb3IgdGhlIHJlbWFpbmluZyBBUkdCIGZvcm1hdHMKKwkgIEFuZCBoYW5kbGUgQVlVViBsaWtlIEFSR0IsIHdlIG5lZWQgbm8gWVVWIHNwZWNpZmljIGhhbmRsaW5nLgorCisyMDEwLTAzLTIwIDIxOjMwOjU4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICBhbHBoYTogQWRkIHN1cHBvcnQgZm9yIFJHQiBhbmQgeFJHQiBpbnB1dAorCisyMDEwLTAzLTIwIDIxOjEzOjIzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICBhbHBoYTogQWRkIHN1cHBvcnQgZm9yIEFSR0IgaW5wdXQKKworMjAxMC0wMy0yMCAyMDo0NjoxOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgYWxwaGE6IEFkZCBzdXBwb3J0IGZvciBnZW5lcmF0aW5nIEFSR0Igb3V0cHV0CisKKzIwMTAtMDMtMjAgMTA6NDc6NDIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuaDoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX21teC5oOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogQWRkIHN1cHBvcnQgZm9yIEFCR1IgYW5kIFJHQkEKKwkgIE5vdyBhbGwgNCBBUkdCIHZhcmlhbnRzIGFyZSBzdXBwb3J0ZWQgYnkgdmlkZW9taXhlci4KKworMjAxMC0wMy0yMCAxMDoyNDo1NiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgYWxwaGE6IE1vdmUgY2hyb21hIGtleWluZyBwYXJhbWV0ZXJzIGludG8gc3RhY2sgdmFyaWFibGVzIHRvIHByZXZlbnQgbXVsdGlwbGUgcG9pbnRlciBkZXJlZmVyZW5jZXMgcGVyIHBpeGVsCisKKzIwMTAtMDMtMjAgMTA6MjA6NTMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkgIGFscGhhOiBNb3ZlIGNvbG9yIGNvbnZlcnNpb24gbWF0cml4ZXMgaW50byBzdGFjayB2YXJpYWJsZXMgdG8gc3BlZWQgdXAgcHJvY2Vzc2luZworCisyMDEwLTAzLTIwIDEwOjE4OjA0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICBhbHBoYTogVXNlIGNvcnJlY3QgbWF0cml4ZXMgdG8gY29udmVydCBjaHJvbWEga2V5aW5nIGNvbG9yIHRvIFlVVgorCisyMDEwLTAzLTE5IDE4OjUxOjU5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICBhbHBoYTogQWRkIHN1cHBvcnQgZm9yIGRpZmZlcmVudCBjb2xvciBtYXRyaXhlcworCisyMDEwLTAzLTE5IDE4OjIxOjE5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICBhbHBoYTogUmVuYW1lIGFuZCBtb3ZlIGZ1bmN0aW9ucyBhcyBmdXJ0aGVyIHByZXBhcmF0aW9uIGZvciBzdXBwb3J0aW5nIG1vcmUgY29sb3IgZm9ybWF0cworCisyMDEwLTAzLTE5IDE4OjE4OjA4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuaDoKKwkgIGFscGhhOiBSZW1vdmUgc29tZSB1bm5lZWRlZCBjYWxjdWxhdGlvbnMgYW5kIGluc3RhbmNlIHN0cnVjdCBmaWVsZHMKKwkgIEFuZCBkb2N1bWVudCB0aGUgaW5zdGFuY2Ugc3RydWN0IGZpZWxkcyBhIGJpdCBiZXR0ZXIKKworMjAxMC0wMy0xOSAxODoxMToxMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmg6CisJICBhbHBoYTogU29tZSBwcmVwYXJhdGlvbnMgZm9yIHN1cHBvcnRpbmcgbW9yZSBjb2xvciBmb3JtYXRzCisKKzIwMTAtMDMtMTkgMTc6MDk6MDYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgaDI2NHBheTogZml4IGNvbmZpZy1pbnRlcnZhbCBwcm9wZXJ0eQorCSAgVXNlIHRoZSBzYW1lIHVuaXRzIGZvciBjb21wYXJpbmcgdGhlIGVsYXBzZWQgdGltZSBhZ2FpbnN0IHRoZSBpbnRlcnZhbC4KKwkgIEZpeGVzICM2MTMwMTMKKworMjAxMC0wMy0xOSAxNjo0NDowMCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5oOgorCSAgYWxwaGFjb2xvcjogSW1wbGVtZW50IGNvbG9yLW1hdHJpeCBzdXBwb3J0IGFuZCB1c2UgaW50ZWdlciBhcml0aG1ldGljIG9ubHkKKwkgIEFscGhhY29sb3Igbm93IHVzZXMgdGhlIGNvcnJlY3QgbWF0cml4ZXMgZm9yIFNEVFYgYW5kIEhEVFYgYW5kIGNhbgorCSAgY29udmVydCBiZXR3ZWVuIHRoZW0uCisKKzIwMTAtMDMtMTkgMTU6MDM6NDMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3A6IHVzZSBHVHlwZSBmcm9tIC1iYXNlIGFuZCBidW1wIHJlcXVpcmVkIHZlcnNpb24KKwkgIFVzZSB0aGUgdHJhbnNwb3J0IGZsYWdzIEdUeXBlIGZyb20gLWJhc2UgYW5kIGJ1bXAgdGhlIHJlcXVpcmVkIHZlcnNpb24gb2YgLWJhc2UKKwkgIGJlY2F1c2Ugb2YgdGhpcy4KKworMjAxMC0wMy0xOSAwMDowNToxOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hcGV0YWcvTWFrZWZpbGUuYW06CisJICBhcGV0YWc6IG1pbm9yIE1ha2VmaWxlLmFtIHN1cmdlcnkKKwkgIC1JJCh0b3Bfc3JjZGlyKS9nc3QtbGlicy8gaXMgYWxyZWFkeSBpbiAkKEdTVF9DRkxBR1MpCisKKzIwMTAtMDMtMTggMTc6MzA6MjYgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZmRldGVjdC5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlscyA9PiBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUKKworMjAxMC0wMy0wNCAyMjoxMjozNSArMDEwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogZXh0L3JhdzEzOTQvZ3N0MTM5NGNsb2NrLmM6CisJICBkdjEzOTRzcmM6IEZpeCBpbnRlcm5hbCBjbG9jaworCSAgRml4ZXMgIzU5MzkxMC4KKworMjAxMC0wMy0xOCAyMToxNDoxNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9NYWtlZmlsZS5hbToKKwkqIGV4dC9lc2QvTWFrZWZpbGUuYW06CisJKiBleHQvbGliY2FjYS9NYWtlZmlsZS5hbToKKwkqIGV4dC9wdWxzZS9NYWtlZmlsZS5hbToKKwkqIGV4dC9zaG91dDIvTWFrZWZpbGUuYW06CisJKiBleHQvc3BlZXgvTWFrZWZpbGUuYW06CisJKiBleHQvd2F2cGFjay9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdXBhcnNlL01ha2VmaWxlLmFtOgorCSogZ3N0L2F2aS9NYWtlZmlsZS5hbToKKwkqIGdzdC9mbHgvTWFrZWZpbGUuYW06CisJKiBnc3QvaWN5ZGVtdXgvTWFrZWZpbGUuYW06CisJKiBnc3QvaW50ZXJsZWF2ZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9tYXRyb3NrYS9NYWtlZmlsZS5hbToKKwkqIGdzdC9xdGRlbXV4L01ha2VmaWxlLmFtOgorCSogZ3N0L3JlcGxheWdhaW4vTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3VkcC9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3dhdnBhcnNlL01ha2VmaWxlLmFtOgorCSogc3lzL2RpcmVjdHNvdW5kL01ha2VmaWxlLmFtOgorCSogc3lzL29zcy9NYWtlZmlsZS5hbToKKwkqIHN5cy93YXZlZm9ybS9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvTWFrZWZpbGUuYW06CisJICBidWlsZDogTWFrZWZpbGUuYW0gY2xlYW51cHMKKwkgIE1vc3RseSBhZGQgJChHU1RfQkFTRV9DRkxBR1MpIHdoZXJlIGl0IHdhcyBtaXNzaW5nLCBidXQgYWxzbyBmaXggdXAKKwkgIG9yZGVyIG9mIGZsYWdzIGFuZCBsaWJzIGlmIG5lZWRlZCAoc2VlIGRvY3MvcmFuZG9tL21vdmluZy1wbHVnaW5zKS4KKworMjAxMC0wMy0xOCAxODo0OToyNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIGRpcmVjdHNvdW5kc2luazogZml4IHJlZHVuZGFudCBmdW5jdGlvbiByZWRlY2xhcmF0aW9uIGNvbXBpbGVyIHdhcm5pbmdzCisKKzIwMTAtMDMtMTggMTk6MDA6MDkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5oOgorCSAgYWxwaGE6IFJlbW92ZSByZW1haW5pbmcgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYyB3aGVuIHByb2Nlc3NpbmcgYSBwaXhlbAorCisyMDEwLTAzLTE4IDE4OjU1OjM0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICBhbHBoYTogUmVmYWN0b3IgY2hyb21hIGtleWluZyBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uCisJICBUaGlzIHJlZHVjZXMgY29kZSBkdXBsaWNhdGlvbiBvbmNlIHdlIGFkZCBzdXBwb3J0IGZvciBtb3JlIGNvbG9yIGZvcm1hdHMuCisKKzIwMTAtMDMtMTggMTQ6MzE6MzUgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOgorCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJKiBleHQvY2Fpcm8vZ3N0dGltZW92ZXJsYXkuYzoKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9lc2QvZXNkbW9uLmM6CisJKiBleHQvZXNkL2VzZHNpbmsuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOgorCSogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc2luay5jOgorCSogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zcmMuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOgorCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuYzoKKwkqIGV4dC9oYWwvZ3N0aGFsYXVkaW9zaW5rLmM6CisJKiBleHQvaGFsL2dzdGhhbGF1ZGlvc3JjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvanBlZy9nc3RzbW9rZWRlYy5jOgorCSogZXh0L2pwZWcvZ3N0c21va2VlbmMuYzoKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmM6CisJKiBleHQvbGlibW5nL2dzdG1uZy5oOgorCSogZXh0L2xpYm1uZy9nc3RtbmdkZWMuYzoKKwkqIGV4dC9saWJtbmcvZ3N0bW5nZW5jLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZy5oOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJKiBleHQvbWlrbW9kL2dzdG1pa21vZC5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOgorCSogZ3N0L2RlYnVndXRpbHMvYnJlYWtteWRhdGEuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2VmZW5jZS5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2aWdhdGlvbnRlc3QuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdG5hdnNlZWsuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHB1c2hmaWxlc3JjLmM6CisJKiBnc3QvZGVidWd1dGlscy9uZWdvdGlhdGlvbi5jOgorCSogZ3N0L2RlYnVndXRpbHMvcHJvZ3Jlc3NyZXBvcnQuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Rlc3RwbHVnaW4uYzoKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmM6CisJKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzoKKwkqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOgorCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkqIGdzdC9tZWRpYW4vZ3N0bWVkaWFuLmM6CisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzoKKwkqIGdzdC9xdGRlbXV4L2dzdHJ0cHhxdGRlcGF5LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYzoKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJndm9sdW1lLmM6CisJKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWRtZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc2lyZW5kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3Bnb29nbGUuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlYWxwaGEuYzoKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW90ZW1wbGF0ZS5jOgorCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkqIHN5cy9vc3MvZ3N0b3NzbWl4ZXJlbGVtZW50LmM6CisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzoKKwkqIHN5cy9vc3MvZ3N0b3Nzc3JjLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvd2F2ZWZvcm0vZ3N0d2F2ZWZvcm1zaW5rLmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X2RldGFpbHMgPT4gZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X2RldGFpbHNfc2ltcGxlCisKKzIwMTAtMDMtMTggMTQ6MDI6MzAgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZ3N0L29sZGNvcmUvTWFrZWZpbGUuYW06CisJKiBnc3Qvb2xkY29yZS9nc3RhZ2dyZWdhdG9yLmM6CisJKiBnc3Qvb2xkY29yZS9nc3RhZ2dyZWdhdG9yLmg6CisJKiBnc3Qvb2xkY29yZS9nc3RlbGVtZW50cy5jOgorCSogZ3N0L29sZGNvcmUvZ3N0ZmRzaW5rLmM6CisJKiBnc3Qvb2xkY29yZS9nc3RmZHNpbmsuaDoKKwkqIGdzdC9vbGRjb3JlL2dzdG1kNXNpbmsuYzoKKwkqIGdzdC9vbGRjb3JlL2dzdG1kNXNpbmsuaDoKKwkqIGdzdC9vbGRjb3JlL2dzdG11bHRpZmlsZXNyYy5jOgorCSogZ3N0L29sZGNvcmUvZ3N0bXVsdGlmaWxlc3JjLmg6CisJKiBnc3Qvb2xkY29yZS9nc3RwaXBlZmlsdGVyLmM6CisJKiBnc3Qvb2xkY29yZS9nc3RwaXBlZmlsdGVyLmg6CisJKiBnc3Qvb2xkY29yZS9nc3RzaGFwZXIuYzoKKwkqIGdzdC9vbGRjb3JlL2dzdHNoYXBlci5oOgorCSogZ3N0L29sZGNvcmUvZ3N0c3RhdGlzdGljcy5jOgorCSogZ3N0L29sZGNvcmUvZ3N0c3RhdGlzdGljcy5oOgorCSAgUmVtb3ZlIG9sZGNvcmUgZGlyZWN0b3J5CisJICBUaGUgZWxlbWVudHMgaGF2ZSBiZWVuIHVudXNlZCBmb3IgYWdlcyBhbmQgYWxsIGltcG9ydGFudCBvbmVzIGhhdmUgYmVlbgorCSAgcmVwbGFjZWQgb3IgY29waWVkIGVsc2V3aGVyZS4KKworMjAxMC0wMy0xOCAxMzo0NTowOCArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlY29kZXIuYzoKKwkgIGF2aTogUmVtb3ZlIG9sZCBmaWxlCisJICBTZWVtcyB0byBiZSBsZWZ0b3ZlciBmcm9tIHRoZSAwLjQgZGF5cyBvciBzby4KKworMjAxMC0wMy0xOCAxMjo0NDo1MyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSAgcHVsc2U6IHVzZSAjaWZkZWYgcmF0aGVyIHRoYW4gI2lmIGNvbmRpdGlvbmFscworCisyMDEwLTAzLTE4IDEyOjIwOjE3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIHJ0cGgyNjRkZXBheTogZG8gbm90IGNhbGwgX3B1c2hfdHMgd2l0aCB1bm5lZWRlZCAoYW5kIHdyb25nKSB0aW1lIHBhcmFtZXRlcgorCSAgRml4ZXMgIzYxMzIwNi4KKworMjAxMC0wMy0xOCAxMTozMzo1OSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggdHlwbyBpbiBoZWFkZXIgdmFsaWRhdGlvbiBjaGVjaworCisyMDEwLTAzLTE4IDAxOjUxOjE5ICswMTAwICBKYW4gVXJiYcWEc2tpIDx3dWxjemVyQHd1bGN6ZXIub3JnPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBwdXQgbW9yZSBpbmZvcm1hdGlvbiBpbiB0aGUgbWV0YWRhdGEKKwkgIEFkZGl0aW9uYWwgdGFncyBhcmU6IGF1ZGlvY29kZWNpZCwgdmlkZW9jb2RlY2lkIGZyYW1lcmF0ZSBhbmQgKGluIHRoZQorCSAgbm9uLWxpdmUgY2FzZSkgZmlsZXNpemUuCisJICBXaGlsZSBhdCBpdCwgZml4IGluZGV4IHJld3JpdGluZyB0byB1cGRhdGUgZHVyYXRpb24gYW5kIGZpbGVzaXplCisJICB2YWx1ZXMgZXZlbiBpZiB0aGUgaW5kZXggaXMgZW1wdHkuCisJICBGaXhlcyAjNjEzMDk0LgorCisyMDEwLTAzLTE3IDIxOjMzOjI4ICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5oOgorCSogZ3N0L2dvb20vZ29vbV9jb25maWcuaDoKKwkqIGdzdC9nb29tL21hdGh0b29scy5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzoKKwkgIEFkZCAtV3VuZGVmIHRvIGNvbmZpZ3VyZSBmbGFncworCSAgYW5kIGZpeCB0aGUgcmVzdWx0aW5nIHdhcm5pbmdzCisKKzIwMTAtMDMtMTcgMjA6MDI6MTYgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgLVdtaXNzaW5nLXByb3RvdHlwZXMgaXMgbm90IHZhbGlkIGZvciBDKysKKworMjAxMC0wMy0xNyAxOTozNToxMCArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmM6CisJKiBleHQvanBlZy9nc3RqcGVnLmg6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHloLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYzoKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJndm9sdW1lLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICBBZGQgLVdyZWR1bmRhbnQtZGVjbHMgd2FybmluZyBmbGFnCisJICBBbHNvIGZpeCBjb21waWxlIGlzc3VlcworCisyMDEwLTAzLTE3IDE4OjQ5OjExICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmg6CisJICBGaXggd2FybmluZ3MgaW4gZXhwZXJpbWVudGFsIHBsdWdpbnMsIHRvbworCisyMDEwLTAzLTE3IDE4OjIzOjAwICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9hbm5vZGV4L2dzdGFubm9kZXguYzoKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuaDoKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxlbmMuaDoKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxwYXJzZXIuYzoKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWx1dGlscy5jOgorCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmg6CisJKiBleHQvanBlZy9NYWtlZmlsZS5hbToKKwkqIGV4dC9qcGVnL2dzdGpwZWcuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWcuaDoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tzdHJlYW1yZWFkZXIuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tzdHJlYW1yZWFkZXIuaDoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2JyZWFrbXlkYXRhLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZzZWVrLmM6CisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJKiBnc3QvZGVidWd1dGlscy90ZXN0cGx1Z2luLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWguYXNtOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHloLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL21teC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwuaW5jOgorCSogZ3N0L2dvb20vZ29vbV9meC5oOgorCSogZ3N0L2dvb20yazEvZmlsdGVycy5jOgorCSogZ3N0L2dvb20yazEvZmlsdGVycy5oOgorCSogZ3N0L2xhdy9tdWxhdy1jb252ZXJzaW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4Lmg6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguaDoKKwkqIGdzdC9xdGRlbXV4L2dzdHJ0cHhxdGRlcGF5LmM6CisJKiBnc3QvcnRwL2ZudjFoYXNoLmM6CisJKiBnc3QvcnRwL2ZudjFoYXNoLmg6CisJKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5oOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGoya2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuaDoKKwkqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3NtcHRlL2dzdG1hc2suYzoKKwkqIGdzdC9zbXB0ZS9nc3RtYXNrLmg6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guaDoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmg6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuaDoKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkb3JpZW50Lmg6CisJKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FzcGVjdHJhdGlvY3JvcC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9hbXBsaWZ5LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2NoZWJiYW5kLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2NoZWJsaW1pdC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9keW5hbWljLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2VjaG8uYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvaW52ZXJ0LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3Bhbm9yYW1hLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jYmFuZC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW93c2luY2xpbWl0LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdmltdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aXN1YnRpdGxlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZGVjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9lcXVhbGl6ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsdGlmaWxlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2xpbWl0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3Jndm9sdW1lLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zaGFwZXdpcGUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zcGVjdHJ1bS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9maWx0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tlbmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2twYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMveTRtZW5jLmM6CisJKiB0ZXN0cy9jaGVjay9nZW5lcmljL3N0YXRlcy5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3NpbXBsZS1sYXVuY2gtbGluZXMuYzoKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZwYWNrLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSogdGVzdHMvZXhhbXBsZXMvbGV2ZWwvbGV2ZWwtZXhhbXBsZS5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vc3BlY3RydW0tZXhhbXBsZS5jOgorCSogdGVzdHMvaWNsZXMvdjRsMnNyYy10ZXN0LmM6CisJICBBZGQgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV21pc3NpbmctcHJvdG90eXBlcyB3YXJuaW5nIGZsYWdzCisJICBBbmQgZml4IGFsbCB0aGUgd2FybmluZ3MuCisKKzIwMTAtMDMtMTcgMTY6MjM6MjQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJICBtcDRnZGVwYXk6IGltcHJvdmUgY29uc3RhbnREdXJhdGlvbiBndWVzc2luZworCSAgV2hlbiBubyBjb25zdGFudER1cmF0aW9uIGhhcyBiZWVuIGdpdmVuIGluIHRoZSBjYXBzLCB0cnkgdG8gZGVyaXZlIG9uZSBmcm9tIHRoZQorCSAgdGltZXN0YW1wIGRpZmZlcmVuY2UgYmV0d2VlbiBwYWNrZXRzLiBBbHNvIGtlZXAgZG9pbmcgdGhpcyBmb3IgZWFjaCBwYWNrZXQKKwkgIGJlY2F1c2Ugc29tZSBicm9rZW4gc3RyZWFtcyBtaWdodCBzaW1wbHkgcHJvdmlkZSB3cm9uZyB0aW1lc3RhbXBzLgorCisyMDEwLTAzLTE2IDIzOjQzOjM5ICswMTAwICBKYW4gVXJiYcWEc2tpIDx3dWxjemVyQHd1bGN6ZXIub3JnPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBQdXQgd2lkdGggYW5kIGhlaWdodCBpbiB0aGUgbWV0YWRhdGEKKwkgIFNvbWUgcGxheWVycyB1c2UgdGhhdCBpbmZvIHRvIHNjYWxlIHRoZWlyIGRpc3BsYXkuCisJICBTZWUgIzYxMzA5NC4KKworMjAxMC0wMy0xNiAyMzozMjo0NSArMDEwMCAgSmFuIFVyYmHFhHNraSA8d3VsY3plckB3dWxjemVyLm9yZz4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogZG9uJ3QgcHV0IHRpbWVzdGFtcHMgbGFyZ2VyIHRoYW4gR19NQVhJTlQzMiBpbiB0aGUgRkxWIHRhZ3MKKwkgIEZvciBub24tbGl2ZSBpbnB1dCByZXNwb25kIGJ5IHB1c2hpbmcgRU9TLCBmb3IgbGl2ZSB3cmFwIHRoZQorCSAgdGltZXN0YW1wcyBldmVyeSBHX01BWElOVDMyIG1pbGlzZWNvbmRzLgorCSAgRml4ZXMgIzYxMzAwMy4KKworMjAxMC0wMy0xNiAyMzo0MDoxMiArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cDogYWxzbyB1c2UgZ192YWx1ZV9zZXRfc3RhdGljX3N0cmluZygpIGhlcmUgZm9yIHN0YXRpYyBzdHJpbmdzCisKKzIwMTAtMDMtMTYgMjE6MjM6MTEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSAgYWxwaGFjb2xvcjogRml4IFJHQkE8LT5BWVVWIGNvbnZlcnNpb24KKworMjAxMC0wMy0xNiAyMToxNjoyNiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmg6CisJICBhbHBoYTogUmVtb3ZlIHJlZHVuZGFudCBpbnN0YW5jZSBmaWVsZAorCisyMDEwLTAzLTE2IDIxOjEwOjA4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICBhbHBoYTogUHJvdGVjdCBwcm9wZXJ0eSB2YWx1ZXMgZnJvbSBjaGFuZ2VzIGR1cmluZyBmcmFtZSBwcm9jZXNzaW5nCisKKzIwMTAtMDMtMTUgMjM6Mjk6NTUgKzAzMDAgINCg0YPRgdC70LDQvSDQmNC20LHRg9C70LDRgtC+0LIgPGxybjE5ODZAZ21haWwuY29tPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgcG5nZW5jOiBVc2UgcG5nX2dldF9pb19wdHIoKSBpbnN0ZWFkIG9mIGFjY2Vzc2luZyBpb19wdHIgZGlyZWN0bHkKKwkgIEZpeGVzICM2MTI3MDAgKGZvciB0aGUgbGFzdCB0aW1lISkKKworMjAxMC0wMy0xNSAyMzoyOTowNiArMDMwMCAg0KDRg9GB0LvQsNC9INCY0LbQsdGD0LvQsNGC0L7QsiA8bHJuMTk4NkBnbWFpbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIHBuZzogQ2hlY2sgZm9yIGxpYnBuZyA+PSAxLjIgaW5zdGVhZCBvZiBsaWJwbmcxMgorCisyMDEwLTAzLTE2IDAxOjI5OjM2ICswMTAwICBKYW4gVXJiYcWEc2tpIDx3dWxjemVyQHd1bGN6ZXIub3JnPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguaDoKKwkgIGZsdm11eDogQWx3YXlzIHB1dCBhIGR1cmF0aW9uIHRhZyBpbiB0aGUgbWV0YWRhdGEKKwkgIFNvbWUgRmxhc2ggcGxheWVycyAoZm9yIGluc3RhbmNlIEpXIFBsYXllcikgYWx3YXlzIGV4cGVjdCBhIGR1cmF0aW9uCisJICB0YWcsIG90aGVyd2lzZSB0aGV5IGRvbid0IHN0YXJ0IHBsYXliYWNrLgorCSAgSWYgZHVyYXRpb24gY2FuIGJlIHF1ZXJpZWQgZnJvbSB0aGUgc2luayBwYWRzIG9yIGlzIHByb3ZpZGVkIGFzIGEgdGFnLAorCSAgdXNlIGl0LiBPdGhlcndpc2UgdHJ5IHRvIGRldGVybWluZSBpdCBmcm9tIHRoZSBsYXN0IHNlZW4gdGltZXN0YW1wIG9mCisJICB0aGUgc2luayBwYWRzIGFmdGVyIEVPUyBhbmQgcmV3cml0ZSBpdCBpbiB0aGUgaGVhZGVyIGJlZm9yZSB3cml0aW5nCisJICB0aGUgaW5kZXguCisKKzIwMTAtMDMtMTYgMDA6MzU6NDYgKzAxMDAgIEphbiBVcmJhxYRza2kgPHd1bGN6ZXJAd3VsY3plci5vcmc+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5oOgorCSAgZmx2bXV4OiBSZW1vdmUgdGhlIHNlbmRfY29kZWNfZGF0YSBmaWVsZCBmcm9tIEdzdEZsdlBhZAorCSAgVGhhdCBmaWVsZCBpcyBub3QgdXNlZCBhbnltb3JlIGFmdGVyIHRoZSBjaGFuZ2VzIGluCisJICA5ZmRlY2JjMWMxMWY0ZTVhZjY1NzhiYmEzMmE5YjMyNzcxMDI5ZDMzLgorCisyMDEwLTAzLTE2IDEzOjUzOjI2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgbXVsdGl1ZHBzaW5rOiBnZXQgZmFtaWx5IG9mIGV4dGVybmFsIHNvY2tldHMgdG9vCisJICBHZXQgdGhlIGZhbWlseSBvZiBleHRlcm5hbGx5IGNvbmZpZ3VyZWQgc29ja2V0cyBzbyB0aGF0IHdlIGNhbiBjb25maWd1cmUgaXQKKwkgIGNvcnJlY3RseS4KKworMjAxMC0wMy0xNSAyMDozNzo1MSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJICBhbHBoYWNvbG9yOiBBZGQgc3VwcG9ydCBmb3IgdGhlIHJlbWFpbmluZyBBUkdCIGZvcm1hdHMKKworMjAxMC0wMy0xNSAxOToxNjoxOCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJICBhbHBoYWNvbG9yOiBTaW1wbGlmeSBBUkdCPC0+QVlVViBjb252ZXJzaW9ucyBieSBjb2RlIGdlbmVyYXRpb24gbWFjcm9zCisKKzIwMTAtMDMtMTUgMTk6MDc6MjggKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBnc3QvYWxwaGEvTWFrZWZpbGUuYW06CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5oOgorCSAgYWxwaGE6IE1pbm9yIGNsZWFudXBzIGFuZCBtb3ZlIGRlY2xhcmF0aW9ucyBpbnRvIGEgc2VwYXJhdGUgaGVhZGVyIGZpbGUKKworMjAxMC0wMy0xNSAxODo1ODo1MSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgYWxwaGE6IFVzZSBHc3RWaWRlb0ZpbHRlciBhcyBiYXNlIGNsYXNzIGZvciBhdXRvbWF0aWMgUW9TIHN1cHBvcnQKKworMjAxMC0wMy0xNSAxODo1MDoxMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5oOgorCSAgYWxwaGFjb2xvcjogQWRkIHN1cHBvcnQgZm9yIGlucGxhY2UgY29udmVyc2lvbnMgZnJvbSBBWVVWIHRvIEFSR0IKKworMjAxMC0wMy0xNSAxODoxNDoxOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5oOgorCSAgYWxwaGFjb2xvcjogVXNlIGxpYmdzdHZpZGVvIGZvciBjYXBzIHBhcnNpbmcKKworMjAxMC0wMy0xNSAxODowOTo1NSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5oOgorCSAgYWxwaGFjb2xvcjogVXNlIEdzdFZpZGVvRmlsdGVyIGFzIGJhc2UgY2xhc3MgZm9yIGF1dG9tYXRpYyBRb1Mgc3VwcG9ydAorCisyMDEwLTAzLTE1IDE4OjA3OjI5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkgIGFscGhhY29sb3I6IFNvbWUgbWlub3IgY2xlYW51cAorCisyMDEwLTAzLTE1IDE0OjE2OjU4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuaDoKKwkgIHNwZWV4ZGVjOiBVc2Ugc3BlZXhfc3RlcmVvX3N0YXRlX2luaXQoKSBpbnN0ZWFkIG9mIHRoZSBkZXByZWNhdGVkIGluaXRpYWxpemF0aW9uIG1hY3JvCisJICBGaXhlcyBidWcgIzYxMjc3Ny4KKworMjAxMC0wMy0xNSAwMTowOTo0OSArMDEwMCAgSmFuIFVyYmHFhHNraSA8d3VsY3plckB3dWxjemVyLm9yZz4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogQ29ycmVjdGx5IG1hcmsgYnVmZmVycyBhcyBkZWx0YSB1bml0cworCSAgTWFyayB2aWRlbyBpbnRlcmZyYW1lcywgdmlkZW8gY29kZWMgZGF0YSBidWZmZXJzIGFuZCBhdWRpbyBidWZmZXJzIChpZgorCSAgaXQncyBub3QgYW4gYXVkaW8tb25seSBzdHJlYW0pIGFzIGRlbHRhIHVuaXRzLgorCisyMDEwLTAzLTE0IDE5OjMyOjIwICswMTAwICBKYW4gVXJiYcWEc2tpIDx3dWxjemVyQHd1bGN6ZXIub3JnPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBTdXBwb3J0IHN0cmVhbWhlYWRlcnMKKwkgIFB1dCB0aGUgRkxWIGhlYWRlciwgdGhlIG1ldGFkYXRhIHRhZyBhbmQgKGlmIHByZXNlbnQpIGNvZGVjCisJICBpbmZvcm1hdGlvbiBpbiB0aGUgc3RyZWFtaGVhZGVyIHRvIGFsbG93IHRoZSBtdXhlciB0byBiZSB1c2VkIGZvcgorCSAgc3RyZWFtaW5nLgorCisyMDEwLTAzLTE0IDAxOjM4OjIxICswMTAwICBKYW4gVXJiYcWEc2tpIDx3dWxjemVyQHd1bGN6ZXIub3JnPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBQcmVhbGxvY2F0ZSBpbmRleCBzcGFjZSBhbmQgZmlsbCBpdCBhZnRlciBmaW5pc2hpbmcgb3V0cHV0CisJICBNYWtlIHRoZSBpbmRleCBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSwgd2hpY2ggaXMgd2hhdCBtb3N0CisJICBwbGF5ZXJzIGFyZSBleHBlY3RpbmcuCisJICBGaXhlcyAjNjAxMjM2LgorCisyMDEwLTAzLTE1IDEzOjQ3OjEzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogTWlub3IgY29kaW5nIHN0eWxlIGZpeGVzIGFuZCBjbGVhbnVwCisKKzIwMTAtMDMtMTQgMDE6MzQ6MDIgKzAxMDAgIEphbiBVcmJhxYRza2kgPHd1bGN6ZXJAd3VsY3plci5vcmc+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5oOgorCSAgZmx2bXV4OiBBZGQgYSBpcy1saXZlIHByb3BlcnR5CisJICBJZiBpdCBpcyBzZXQsIHRoZSBtdXhlciB3aWxsIG5vdCB3cml0ZSB0aGUgaW5kZXguIERlZmF1bHRzIHRvIGZhbHNlLgorCisyMDEwLTAzLTE0IDAxOjI1OjQyICswMTAwICBKYW4gVXJiYcWEc2tpIDx3dWxjemVyQHd1bGN6ZXIub3JnPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBPbmx5IHB1dCB2YWxpZCBzZWVrIHBvaW50cyBpbiB0aGUgaW5kZXgKKwkgIEZvciBmaWxlcyBjb250YWluaW5nIHZpZGVvIG9ubHkgdmlkZW8ga2V5ZnJhbWVzIGFyZSB2YWxpZCBwb2ludHMgdG8KKwkgIHdoaWNoIGEgcGxheWVyIGNhbiBzZWVrLiBGb3IgYXVkaW8tb25seSBmaWxlcyBhbnkgdGFnIHN0YXJ0IGlzIGEgdmFsaWQKKwkgIHNlZWsgcG9pbnQuCisJICBTZWUgIzYwMTIzNi4KKworMjAxMC0wMy0xNCAwMTowOTozNyArMDEwMCAgSmFuIFVyYmHFhHNraSA8d3VsY3plckB3dWxjemVyLm9yZz4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogRml4IGluZGV4IGJ1aWxkaW5nIHRvIG1ha2UgZW50cmllcyBwb2ludCB0byB0YWcncyBzdGFydCBvZmZzZXQKKwkgIFByZXZpb3VzIGNvZGluZyB3YXMgd3JvbmdseSBpbmNyZW1lbnRpbmcgdGhlIHRvdGFsIGJ5dGUgY291bnQgYmVmb3JlCisJICBhZGRpbmcgYW4gaW5kZXggZW50cnkuCisKKzIwMTAtMDMtMTUgMTM6NDA6MzggKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzoKKwkgIGNhaXJvdGV4dG92ZXJsYXk6IERvbid0IHJlbmRlciB0ZXh0IG91dHNpZGUgdGhlIGZyYW1lIGJvdW5kYXJpZXMKKwkgIEZpeGVzIGJ1ZyAjNjExOTg2LgorCisyMDEwLTAzLTE1IDExOjM4OjIzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBkb24ndCBmb3JnZXQgdG8gc2VuZCBrZWVwYWxpdmUgbWVzc2FnZXMKKwkgIFdoZW4gd2Ugb3BlcmF0ZSBpbiBUQ1AgbW9kZSwgc3RpbGwgc2VuZCBrZWVwYWxpdmUgbWVzc2FnZXMgd2hlbiB3ZQorCSAgbmVlZCB0by4KKwkgIEZpeGVzICM2MTI2OTYKKworMjAxMC0wMy0xMyAyMzoxOTozNSArMDMwMCAg0KDRg9GB0LvQsNC9INCY0LbQsdGD0LvQsNGC0L7QsiA8bHJuMTk4NkBnbWFpbC5jb20+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJICBwbmdlbmM6IENhbGwgcG5nX2ptcGJ1ZigpIGluc3RlYWQgb2YgYWNjZXNzaW5nIHBuZ19zdHJ1Y3RfcHRyIGRpcmVjdGx5CisJICBGaXhlcyAjNjEyNzAwIChhZ2FpbikKKworMjAxMC0wMy0xMiAxNjo0NDozMCArMDMwMCAg0KDRg9GB0LvQsNC9INCY0LbQsdGD0LvQsNGC0L7QsiA8bHJuMTk4NkBnbWFpbC5jb20+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJICBwbmdlbmM6IENhbGwgcG5nX2Vycm9yKCkgaW5zdGVhZCBvZiB1c2luZyBsb25nam1wKCkgZGlyZWN0bHkuCisJICBGaXhlcyAjNjEyNzAwCisKKzIwMTAtMDMtMTIgMTM6NTc6MjggKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBlMjcyZjcxIHRvIDU1Y2Q1MTQKKworMjAxMC0wMy0wNSAxMTowNjo0NyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZm91cmNjLmg6CisJICBxdGRlbXV4OiBhZGQgWE1QIHBhcnNpbmcgc3VwcG9ydAorCSAgVXNlIHhtcCBoZWxwZXJzIHRvIHBhcnNlIFhNUCBtZXRhZGF0YSBpbiB1ZHRhIGF0b20uCisJICBGaXhlcyAjNjA5NTM5CisKKzIwMTAtMDMtMTEgMTI6MzI6NTYgLTA4MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEBzb25nYmlyZG5lc3QuY29tPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5oOgorCSAgdWRwOiBmaXggY29tcGlsYXRpb24gZXJyb3JzIG9uIG5vbi13aW5kb3dzLgorCisyMDEwLTAzLTEwIDIyOjIzOjQzICswMTAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaDoKKwkqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuaDoKKwkgIG11bHRpdWRwc2luazogYXZvaWQgZ2V0dGluZyB0aGUgc29ja2V0IGZhbWlseSB1c2luZyBnZXRzb2NrbmFtZSgpCisKKzIwMTAtMDMtMTEgMTc6Mjg6NDcgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBwcmludCBzdGF0ZW1lbnRzIGZvciBwb2ludGVyIGRpZmZlcmVuY2VzLgorCSAgVGhpcyBmaXhlcyBpdCBmb3IgYm90aCAzMiBhbmQgNjQgYml0CisKKzIwMTAtMDMtMTEgMTc6Mjg6MzUgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCB1bml0aWFsaXplZCB2YXJpYWJsZXMKKworMjAxMC0wMy0xMSAxNzowMzo0NyArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IEZpeCBwcmludGYgZm9ybWF0dGluZyBmb3IgbWFjb3N4CisKKzIwMTAtMDMtMTEgMTc6MDM6MDUgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBGaXggdW5pdGlhbGl6ZWQgdmFyaWFibGVzCisKKzIwMTAtMDMtMTEgMTc6MDI6NDQgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBGaXggdW5pdGlhbGl6ZWQgdmFyaWFibGUuCisKKzIwMTAtMDItMTkgMTM6Mzk6MDQgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIGZsdnBhcnNlOiBNYWtlIHNjcmlwdCB0YWcgcGFyc2luZyBtb3JlIGZsZXhpYmxlLgorCSAgKiBUaGUgbmJfZWxlbWVudHMgZm9yIGFycmF5cyBpcyBqdXN0IGFuIGluZGljYXRpb24sIHdlIGNhbiB0aGVyZWZvcmUgaWdub3JlCisJICBpdCBhbmQgY2Fycnkgb24gcGFyc2luZyBtZXRhZGF0YSBpdGVtcyB1bnRpbCB3ZSByZWFjaCB0aGUgZW5kIG1hcmtlci4KKwkgICogSWYgdHlwZSA9PSAzLCB0aGVuIHRoZSBzY3JpcHQgdGFnIGNvbnRhaW5zIGEgbGlzdCBvZiBvYmplY3QgZm9sbG93ZWQKKwkgIGJ5IHRoZSBlbmQgbWFya2VyLgorCSAgUmVmYWN0b3IgY29kZSBzbGlnaHRseSB0byBoYW5kbGUgYm90aCBjYXNlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxMDQ0NworCisyMDEwLTAzLTExIDE1OjUxOjQwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZGVpbnRlcmxlYXZlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbnRlcmxlYXZlLmM6CisJICB0ZXN0czogZml4IG1ldGFkYXRhIG5vdCB3cml0YWJsZSB3YXJuaW5ncyBpbiBpbnRlcmxlYXZlIGFuZCBkZWludGVybGVhdmUgdGVzdHMKKworMjAxMC0wMy0xMSAxNTozODoxOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FwZXYybXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDN2Mm11eC5jOgorCSAgdGVzdHM6IGZpeCBtZXRhZGF0YSBub3Qgd3JpdGFibGUgd2FybmluZ3Mgd2l0aCBhcGV2Mm11eCBhbmQgaWQzdjJtdXggdGVzdHMKKworMjAxMC0wMy0xMSAxNToyNDoyMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogZml4IG1ldGFkYXRhIHdyaXRhYmxlIHdhcm5pbmdzCisJICBTZXQgbWV0YWRhdGEgb24gYnVmZmVyIGZpcnN0LCB3aGVuIHRoZSByZWZjb3VudCBpcyBzdGlsbCAxLCBhbmQgb25seQorCSAgcmVmIGFnYWluIGFmdGVyd2FyZHMuCisKKzIwMTAtMDMtMTEgMTU6MDI6NDggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogaWdub3JlIHN0cmVhbSB3aXRoIGludmFsaWQgaGVhZGVyIHRpbWUgbWV0YWRhdGEKKworMjAxMC0wMy0wOCAxNDo1NzoxNyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFNldCBzdHJlYW0tZm9ybWF0PXJhdyBvbiBBQUMgY2FwcworCSAgU2V0IHN0cmVhbS1mb3JtYXQ9cmF3IGZvciBBQUMgY2FwcywgYXMgdGhhdCBpcyB0aGUKKwkgIGV4cGVjdGVkIEFBQyBmb3JtYXQgdG8gYmUgaW4gdGhpcyBjb250YWluZXIgZmFtaWx5LgorCSAgRml4ZXMgIzU2NjI1MAorCisyMDEwLTAzLTExIDEyOjU2OjExICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBjaGVjayBmb3IgTlVMTCBiZWZvcmUgZG9pbmcgc3RyY21wCisJICBDaGVjayB0aGUgY29ubmVjdGlvbiBhbmQgYWRkcmVzcyB0eXBlIGZvciBOVUxMIGJlZm9yZSBkb2luZyBzdHJjbXAgYW5kCisJICBjcmFzaGluZy4KKwkgIEZpeGVzICM2MTI1NTMKKworMjAxMC0wMy0xMSAxMToyMDo1OSArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZGY4YTdjOCB0byBlMjcyZjcxCisKKzIwMTAtMDMtMTEgMTE6MDk6NTUgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSAgYnVpbGQ6IGluY2x1ZGUgc3RkbGliLmggZm9yIGF0b2koKQorCisyMDEwLTAzLTExIDEwOjMzOjAwICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkgIGF1ZGlvcGFub3JhbWE6IG1vdmUgaW52YXJpYW50IGNoZWNrIG91dCBvZiB0aGUgaW5uZXIgbG9vcAorCSAgSW1wcm92ZXMgcGVyZm9ybWFuY2UgZm9yIHNpbXBsZSBtZXRob2QuCisKKzIwMTAtMDMtMTAgMjI6MTU6MDQgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgVXBkYXRlIENYWEZMQUdTLCB0b28sIGp1c3QgbGlrZSBDRkxBR1MKKworMjAxMC0wMy0xMCAyMTowMToyMCArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QvcnRwbWFuYWdlci9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgVXBkYXRlIGZvciByZWNlbnQgY2hhbmdlcyB0byBjb21tb24gc3VibW9kdWxlCisJICBUaGlzIGp1c3QgcmVwbGFjZXMgZXZlcnkgIiRFUlJPUl9DRkxBR1MiIHVzYWdlIHdpdGggYSB1c2FnZSBvZgorCSAgIiRXQVJOSU5HX0NGTEFHUyAkRVJST1JfQ0ZMQUdTIiB0byBnZXQgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcworCSAgcHJldmlvdXNseS4KKwkgIEFjdHVhbGx5IHVzaW5nIHRoYXQgc2VwYXJhdGlvbiB3aWxsIGhhcHBlbiBsYXRlci4KKworMjAxMC0wMy0xMCAyMTo1MjowOSArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gOTcyMGE3ZCB0byBkZjhhN2M4CisKKzIwMTAtMDMtMTAgMjA6NDM6NTcgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDBiNmUwNzIgdG8gOTcyMGE3ZAorCisyMDEwLTAzLTEwIDEwOjUxOjI4IC0wODAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPGFtb3JhbGVzQGZsdW1vdGlvbi5jb20+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICBtdWx0aXVkcHNpbms6IFJlc2V0IHdpbmRvd3MgZXJyb3IgY29kZSBhZnRlciBnZXR0aW5nIGNvcnJlc3BvbmRpbmcgZXJyb3IgbWVzc2FnZS4KKworMjAxMC0wMy0wOSAxNzozMjoyNyAtMDgwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHNvbmdiaXJkbmVzdC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5oOgorCSAgYXZpbXV4OiBwdXQgdGhlIGNvZGVjX2RhdGEgYmxvYiBpbnRvIHRoZSBhY3R1YWwgZGF0YSBmb3IgTVBFRzQgdmlkZW8sIHRvIG1hdGNoIG90aGVyIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgd2lsZC4KKworMjAxMC0wMy0xMCAxNjowOTo1NiArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gN2NjNWViNCB0byAwYjZlMDcyCisKKzIwMTAtMDItMjMgMjE6MDY6NTUgLTAzMDAgIFRoYWRldSBMaW1hIGRlIFNvdXphIENhc2NhcmRvIDxjYXNjYXJkb0Bob2xvc2NvcGlvLmNvbT4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHhpbWFnZXNyYzogc2VuZCBuZXdfc2VnbWVudCB3aXRoIEdTVF9GT1JNQVRfVElNRSBmb3JtYXQKKwkgIEluc3RlYWQgb2YgdXNpbmcgQmFzZVNyYyBkZWZhdWx0IGZvcm1hdCBHU1RfRk9STUFUX0JZVEVTLCBzZW5kIGl0IGluCisJICBHU1RfRk9STUFUX1RJTUUuCisJICBTaWduZWQtb2ZmLWJ5OiBUaGFkZXUgTGltYSBkZSBTb3V6YSBDYXNjYXJkbyA8Y2FzY2FyZG9AaG9sb3Njb3Bpby5jb20+CisJICBGaXhlcyAjNjExNjU5CisKKzIwMTAtMDMtMTAgMTE6NDY6MDYgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogcHVzaCBtb2RlOyBhbHNvIHJlcG9ydCBzZWVrYWJsZSB3aXRob3V0IGFuIGVsZW1lbnQgaW5kZXgKKwkgIC4uLiBzaW5jZSByZWNlbnQgY29kZSBhbHNvIHNlZWtzIGFyb3VuZCB0byBvYnRhaW4gcmVxdWlyZWQgZGF0YQorCSAgZnJvbSBhdmkgaW5kZXguCisKKzIwMTAtMDMtMDkgMTg6MDY6NTIgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogYWRkIHNvbWUgY2hlY2sgYW5kIHN0YW5kYXJkaXplZCBzZWVrIGV2ZW50IGhhbmRsaW5nIGluIHB1c2ggbW9kZQorCisyMDEwLTAzLTA5IDE4OjA1OjI5ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGZpeCBvZmZzZXQgaGFuZGxpbmcgaW4gcHVzaCBtb2RlIHNlZWtpbmcKKwkgIFB1c2ggbW9kZSBzZWVraW5nIHVzZXMgc2FtZSBpbmRleCBkYXRhIGFzIHB1bGwgbW9kZSwgYW5kIHN0b3JlcworCSAgb2Zmc2V0IHRvIGRhdGEgaW4gY2h1bmssIHdoZXJlYXMgcHVzaCBtb2RlIG9wZXJhdGVzIGluIGNodW5rcywKKwkgIGFuZCBhcyBzdWNoIG5lZWRzIG9mZnNldCBjb25zaXN0ZW50bHkgY29ycmVzcG9uZGluZyB0byBjaHVuayBoZWFkZXJzLgorCSAgQWxzbyBmaXggZGV0ZXJtaW5pbmcgYmVzdCBtYXRjaGluZyBzdHJlYW0gZm9yIGluY29taW5nIG5ld3NlZ21lbnQgZXZlbnQsCisJICBhcyB3ZWxsIGFzIHNldHRpbmcgc29tZSBzdHJlYW0gc3RhdGUgYWNjb3JkaW5nbHkuCisKKzIwMTAtMDItMjYgMjE6Mjk6NDkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4Lmg6CisJICBmbHZkZW11eDogY29uZHVjdCBpbmRleCBzY2FuIGluIHRhc2sgdGhyZWFkCisJICAuLi4gcmF0aGVyIHRoYW4gaW4gc2Vla2luZyB0aHJlYWQsIHdoaWNoIG1pZ2h0IHRoZW4gb2NjdXB5IG1haW5sb29wCisJICBmb3Igc29tZSB0aW1lIHdpdGggcG9zc2libGUgdW5yZXNwb25zaXZlIHNpZGUtZWZmZWN0cy4KKworMjAxMC0wMi0yNiAyMToyNzozMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIGZsdmRlbXV4OiBhdm9pZCBpbmRlZmluaXRlIGluZGV4IGdyb3d0aAorCSAgVGhhdCBpcywgY2hlY2sgZm9yIGFuZCBkbyBub3QgYWRkIGFuIGluZGV4IGVudHJ5IHRoYXQgaGFzIGFscmVhZHkKKwkgIGJlZW4gYWRkZWQuCisKKzIwMTAtMDItMTggMTQ6NTc6MzkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6CisJICBmbHZkZW11eDogYWxzbyBjb2xsZWN0IGluZGV4IGluZm8gb24tdGhlLWZseSBpbiBwdWxsIG1vZGUKKworMjAxMC0wMi0xOCAxMjo0MjozMSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuaDoKKwkgIGZsdmRlbXV4OiBpbmNyZW1lbnRhbGx5IGJ1aWxkIGluZGV4IGluIHB1bGwgbW9kZQorCSAgU2NhbiBmb3IgbmVlZGVkIHBhcnQgdXBvbiBhIHNlZWsgYXMgb3Bwb3NlZCB0byBkb2luZyBhIGNvbXBsZXRlIHNjYW4KKwkgIGF0IHN0YXJ0dXAsIHdoaWNoIG1heSB0YWtlIHNvbWUgdGltZSBkZXBlbmRpbmcgb24gZmlsZSBhbmQvb3IgcGxhdGZvcm0uCisJICBBbHNvIGFjY2VwdCBpbmRleCBtZXRhZGF0YSBpbiBwdWxsIG1vZGUgYW5kIHBlZWsgZm9yIHNvbWUgbWV0YWRhdGEKKwkgIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgd2hlbiBkZWVtZWQgYXBwcm9wcmlhdGUuCisKKzIwMTAtMDItMTggMTI6MjY6NDYgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogc29tZSBtb3JlIHZhcmlhYmxlIGNsZWFudXAKKworMjAxMC0wMy0wOSAxODoyNToyMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIGZsdmRlbXV4OiByZWZhY3RvciBhZGRpbmcgaW5kZXggZW50cnkKKworMjAxMC0wMi0xNyAxMTozNjoxMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIGZsdmRlbXV4OiBmaXggc2V0dGluZyBERUxUQV9VTklUIGZsYWcgb24gb3V0Z29pbmcgYnVmZmVycworCSAgLi4uIHdoaWNoIHNob3VsZCBub3QgZGVwZW5kIG9uIGhhdmluZyBpbmRleCBhdmFpbGFibGUgb3Igbm90LgorCSAgQWxzbyByZWZhY3RvciByZXN1bHRpbmcgY29sbGFwc2VkIGNvZGUuCisKKzIwMTAtMDItMTEgMTk6NDM6NDcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhdm9pZCBlcnJvbmVvdXMgY29kZWMtZGF0YSBvdmVycmlkaW5nIG9mIHN0c2QgaW5mb3JtYXRpb24KKworMjAxMC0wMi0wMSAyMjozNzozMCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSAgc3BlZXhkZWM6IGFkYXB0IHRvIG5ldyBvZ2dkZW11eAorCSAgUmVtb3ZlIGFsbCBncmFudWxlcG9zIGhhY2tzIGFuZCBzaW1wbHkgdXNlIHVwc3RyZWFtIHRpbWVzdGFtcHMuCisKKzIwMTAtMDItMDEgMjI6MzY6MDIgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5oOgorCSAgc3BlZXhkZWM6IHJlZmFjdG9yIGdyYW51bGVwb3MgaGFja3MKKworMjAxMC0wMy0xMCAxMToxOTo0NiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcGFyc2UgY29ubmVjdGlvbiBpbmZvcm1hdGlvbgorCSAgUGFyc2UgdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgU0RQIGFuZCB1c2UgaXQgdG8gZmlndXJlIG91dCBpZiB3ZSBhcmUKKwkgIGRlYWxpbmcgd2l0aCBpcHY0IG9yIGlwdjYgY29ubmVjdGlvbnMuCisKKzIwMTAtMDMtMDkgMTc6NTM6MzIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHJlcXVpcmUgYSBkZXN0aW5hdGlvbiBmb3IgbXVsdGljYXN0CisJICBXaGVuIHNldHRpbmcgdXAgdGhlIG11bHRpY2FzdCBzb2NrZXRzLCB3ZSBuZWVkIGEgZGVzdGluYXRpb24gYWRkcmVzcyB0byBsaXN0ZW4KKwkgIG9uIG9yIGVsc2Ugd2UgZXJyb3IuCisKKzIwMTAtMDMtMDkgMTc6NTI6MzUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IGhhbmRsZSBpcHY2IGxpc3RlbmluZyBwb3J0cyB3aGVuIG5lZWRlZAorCSAgQWRkIHNvbWUgY29kZSB0byBtYWtlIHVkcHNyYyBsaXN0ZW4gb24gYW4gaXB2NiBhZGRyZXNzIHdoZW4gbmVlZGVkLiBUaGUKKwkgIGRldGVjdGlvbiBvZiBJUFY2IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisKKzIwMTAtMDMtMDkgMTc6MTU6MTYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmg6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwkgIHVkcDogdXNlIHVyaSBwYXJzaW5nIGNvZGUKKwkgIFVzZSB0aGUgdXJpIHBhcnNpbmcgaGVscGVyIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGhvc3QgYW5kIHBvcnQgcGFpcnMuIFRoaXMKKwkgIGFkZHMgc3VwcG9ydCBmb3IgSVBWNi4KKworMjAxMC0wMy0wOSAxNzoxMzozMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5oOgorCSAgdWRwbmV0dXRpbHM6IGFkZCBoZWxwZXIgZnVuY3Rpb25zIGZvciB1ZHAgdXJpIGhhbmRsaW5nCisJICBBZGQgc29tZSBoZWxwZXJzIHRvIHBhcnNlIHVkcCB1cmlzLiBNYWtlIHN1cmUgSVBWNiBpcyBzdXBwb3J0ZWQgdG9vLgorCisyMDEwLTAzLTA1IDE2OjA4OjQ1ICswMTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBydHBzZXNzaW9uOiBNYWtlIGl0IHBvc3NpYmxlIHRvIGZhdm9yIG5ldyBzb3VyY2VzIGluIGNhc2Ugb2YgU1NSQyBjb25mbGljdAorCSAgQWRkIGEgImZhdm9yLW5ldyIgcHJvcGVydHkgdGhhdCB0ZWxscyB0aGUgc2Vzc2lvbiB0byBmYXZvciBuZXcgc291cmNlcyB3aGVuCisJICB0aGVyZSBpcyBhIFNTUkMgY29uZmxpY3QuIFRoaXMgaXMgdXNlZnVsIGZvciBTSVAgY2FsbHMgYW5kIG90aGVyIHN1Y2ggY2FzZXMKKwkgIHdoZXJlIGEgcmVtb3RlIGxvb3AgaXMgZXh0cmVtZWx5IHVubGlrZWx5LgorCSAgRml4ZXMgIzYwNzYxNQorCisyMDEwLTAzLTA1IDE1OjQ2OjQ4ICswMTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBydHBzZXNzaW9uOiBNb3ZlIFNTUkMgY29uZmxpY3RzIGxpc3RzIGludG8gUlRQU291cmNlCisJICBXZSB3aWxsIGFsc28gbmVlZCB0byB0cmFjayBTU1JDIGNvbmZsaWN0cyBpbiByZW1vdGUgc291cmNlcy4KKwkgIFNlZSAjNjA3NjE1CisKKzIwMTAtMDItMjYgMTc6MTM6NDkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHNlbmQga2VlcCBhbGl2ZSB3aGVuIHBhdXNlZAorCSAgV2hlbiB3ZSBhcmUgcGF1c2VkLCBzZW5kIGtlZXAgYWxpdmUgbWVzc2FnZXMgdG8gdGhlIHNlcnZlciBzbyB0aGF0IG91ciBzZXNzaW9uCisJICBkb2Vzbid0IHRpbWUgb3V0IHdoZW4gd2UgZ28gYmFjayB0byBwbGF5aW5nIGxhdGVyLgorCisyMDEwLTAzLTEwIDAxOjEwOjA3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDdhYTY1YjUgdG8gN2NjNWViNAorCisyMDEwLTAyLTIzIDE5OjQ4OjEwIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuaDoKKwkgIG11bHRpZmlsZXNpbms6IEFkZCBrZXktZnJhbWUgb3B0aW9uIHRvIG5leHQtZmlsZQorCSAgVGhpcyBhbGxvd3Mgc2VnbWVudGluZyBvZiBNUEVHLVRTIGZpbGVzIGF0IGtleSBmcmFtZXMsIHdoaWNoIGlzCisJICBleGFjdGx5IHdoYXQgaXMgbmVlZGVkIGZvciBBcHBsZSdzIEhUVFAgc3RyZWFtaW5nLgorCisyMDEwLTAzLTA5IDIxOjMyOjQ3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDQ0ZWNjZTcgdG8gN2FhNjViNQorCisyMDEwLTAzLTA4IDIwOjE3OjU4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogRml4IGF1dG9jcm9wcGluZyBmb3Igb2RkIHdpZHRoL2hlaWdodCBkaWZmZXJlbmNlcworCisyMDEwLTAzLTA4IDIwOjAyOjE5ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guaDoKKwkgIHZpZGVvYm94OiBVc2UgbGliZ3N0dmlkZW8gZm9yIGZvcm1hdCBzcGVjaWZpYyBzdHVmZgorCisyMDEwLTAzLTA4IDE5OjI4OjQ3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2R5bmFtaWMuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlaWlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2ludmVydC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9rYXJhb2tlLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hLmM6CisJICBhdWRpb2Z4OiBTeW5jIHByb3BlcnRpZXMgdG8gdGhlIHN0cmVhbSB0aW1lCisKKzIwMTAtMDMtMDggMTk6MjA6NTkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBNYWtlIHByb3BlcnRpZXMgY29udHJvbGxhYmxlCisKKzIwMTAtMDMtMDggMTk6MDk6MDEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBTb21lIGNsZWFudXAKKworMjAxMC0wMi0yOCAxNTo0Nzo1MCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJldi5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmlwcGxlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzdHJlYWsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkgIGVmZmVjdHY6IFVzZSBjb250cm9sbGVyIHdoZXJlIHBvc3NpYmxlLCBvcHRpbWl6ZSBhIGJpdCBhbmQgbWFrZSBwcm9wZXJ0aWVzIHRocmVhZHNhZmUKKworMjAxMC0wMi0yNiAxNjozNToxNyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBrZ2NvbmZpZy9NYWtlZmlsZS5hbToKKwkgIGJ1aWxkOiBNYWtlIHNvbWUgbW9yZSBydWxlcyBzaWxlbnQgaWYgcmVxdWVzdGVkCisKKzIwMTAtMDItMjYgMTU6NDE6NTIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IFVzZSBhdXRvbWFrZSAxLjExIHNpbGVudCBydWxlcyBpbnN0ZWFkIG9mIHNoYXZlIGlmIGF2YWlsYWJsZQorCSAgVGhpcyBtYWtlcyBzdXJlIHRoYXQgd2UgdXNlIHNvbWV0aGluZyB0aGF0IGlzIHN0aWxsIG1haW50YWluZWQgYW5kCisJICBhbHNvIGJyaW5ncyBiYWNrIGxpYnRvb2wgMS41IHN1cHBvcnQuCisKKzIwMTAtMDMtMDggMjI6NTc6MzQgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkgIHBuZzogZnJhY3Rpb25zIGRvbid0IGFsbG93IGRvdWJsZXMKKworMjAxMC0wMy0wMSAxMjowMzo1NiArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSAgZmx4OiBmaXggZGVzY3JpcHRpb24KKwkgIEl0J3MgdmlkZW8sIG5vdCBhdWRpbworCisyMDEwLTAzLTA5IDE3OjQ1OjI3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisKKz09PSByZWxlYXNlIDAuMTAuMjEgPT09CisKKzIwMTAtMDMtMDkgMDA6Mjg6MTYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2FtbWEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JhbGFuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAwLjEwLjIxCisKKzIwMTAtMDMtMDkgMDA6MjQ6NDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisKKzIwMTAtMDMtMDkgMDA6MDk6MzQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuaDoKKwkgIFJldmVydCAiQWRkIDQ6MjoyLCA0OjE6MSwgYW5kIDQ6NDo0IG91dHB1dCBzdXBwb3J0IgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCA2MzdjMjZmNjFhMmJkOGQ3YjAxZjhiNmQwODFkOTRkYTY1Zjc0NTU3LgorCis9PT0gcmVsZWFzZSAwLjEwLjIwID09PQorCisyMDEwLTAzLTA4IDIzOjQyOjUxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMC4xMC4yMAorCisyMDEwLTAzLTA4IDIzOjQyOjA2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDEwLTAzLTA4IDE2OjQ3OjA0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogZG9uJ3Qgc2VuZCBzZWNvbmQgbmV3c2VnbWVudCBldmVudCBpbiBmcmFtZWQgbW9kZSwgZml4ZXMgbG9uZyBwbGF5YmFjayBkZWxheQorCSAgRG9uJ3Qgc2VuZCBhbm90aGVyIG5ld3NlZ21lbnQgZXZlbnQgaWYgdGhlIHVwc3RyZWFtIG11eGVyL3BhcnNlciBoYXMgYWxyZWFkeQorCSAgc2VudCBvbmUgKG90aGVyd2lzZSB0aGUgc2luayB3aWxsIHdhaXQgZm9yICRkdXJhdGlvbiBiZWZvcmUgc3RhcnRpbmcgcGxheWJhY2spLgorCSAgRml4ZXMgbG9uZyBkZWxheSB1bnRpbCBwbGF5YmFjayBzdGFydHMgd2l0aCBmbGFjLWluLW9nZyBmaWxlcy4KKwkgIEZpeGVzICM2MTA5NTkuCisKKzIwMTAtMDMtMDUgMTM6NDk6MzEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGNvbmZpZ3VyZSBtdWx0aWNhc3QgY29ycmVjdGx5CisJICBUYWtlIHRoZSB0cmFuc3BvcnQgZGVzdGluYXRpb24gZm9yIG11bHRpY2FzdC4KKwkgIERpc2FibGUgbG9vcCBhbmQgYXV0b2pvaW4gZm9yIG11bHRpY2FzdCBvbiB0aGUgdWRwc2lua3MuCisKKzIwMTAtMDMtMDUgMTM6NDc6MzMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICBtdWx0aWNhc3Q6IGFsd2F5cyBjb25maWd1cmUgbG9vcCBhbmQgdHRsCisJICBBbHNvIGNvbmZpZ3VyZSBUVEwgYW5kIGxvb3AgcGFyYW1ldGVycyB3aGVuIHdlIGFkZCBhIGNsaWVudCBhZnRlciBpbml0aWFsaXppbmcKKwkgIHRoZSBzZW5kZXIuCisKKzIwMTAtMDMtMDggMTI6MTM6MzIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJICBSZXZlcnQgInJ0cGgyNjNkZXBheTogYmFzZWNsYXNzIGhhbmRsZXMgdGltZXN0YW1wcyBmb3IgdXMiCisJICBUaGlzIHJldmVydHMgY29tbWl0IDU2NDU4MWUxYjg4ZWNkNWVjNWRhODJjM2NhZmIwZTdhMmQ1OGIzMDIuCisJICBJZiB3ZSBkb24ndCBjYWxsIHB1c2hfdHMsIHRoZXJlIHdpbGwgYmUgbm8gdGltZXN0YW1wIGF0IGFsbCBvbiB0aGUgb3V0Z29pbmcKKwkgIGJ1ZmZlci4KKwkgIEZpeGVzICM2MTIxNTQKKworMjAxMC0wMi0yMyAyMjoxNjozOSAtMDUwMCAgQmVuamFtaW4gTS4gU2Nod2FydHogPGJlbnNAYWx1bS5taXQuZWR1PgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuaDoKKwkgIEFkZCA0OjI6MiwgNDoxOjEsIGFuZCA0OjQ6NCBvdXRwdXQgc3VwcG9ydAorCisyMDEwLTAzLTAyIDEzOjIxOjI0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cHNvdXJjZTogdXNlIHBheWxvYWQgc2l6ZSB0byBlc3RpbWF0ZSBiaXRyYXRlCisJICBVc2UgdGhlIGxlbmd0aCBvZiB0aGUgcGF5bG9hZCBmb3IgZXN0aW1hdGluZyB0aGUgcmVjZWl2ZXIgYml0cmF0ZSBzbyB0aGF0IGl0CisJICBtYXRjaGVzIHRoZSBjYWxjdWxhdGlvbnMgZG9uZSBvbiB0aGUgc2VuZGVyIHNpZGUuIFRvZ2V0aGVyIHdpdGggdGhlIG51bWJlciBvZgorCSAgcGFja2V0cyBvbmUgY2FuIHNjYWxlIHRoZSBiaXRyYXRlIHdpdGggdGhlIGhlYWRlciBvdmVyaGVhZCBvZiB0aGUgbG93ZXIKKwkgIHRyYW5zcG9ydC4KKworMjAxMC0wMy0wMiAxMjozOToyMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIHJ0cHNvdXJjZTogcmVmYWN0b3IgYml0cmF0ZSBlc3RpbWF0aW9uCisJICBEb24ndCByZXVzZSB0aGUgc2FtZSB2YXJpYWJsZSB3ZSBuZWVkIGZvciBzdGF0cyBmb3IgdGhlIGJpdHJhdGUgZXN0aW1hdGlvbgorCSAgYmVjYXVzZSB3ZSdyZSB1cGRhdGluZyBpdC4KKwkgIFJlZmFjdG9yIHRoZSBiaXRyYXRlIGVzdGltYXRpb24gY29kZSBzbyB0aGF0IGJvdGggc2VuZGVyIGFuZCByZWNlaXZlcnMgdXNlIHRoZQorCSAgc2FtZSBjb2RlIHBhdGguCisKKzIwMTAtMDMtMDEgMTY6NDA6MjcgLTA1MDAgIFRyaXN0YW4gTWF0dGhld3MgPHRyaXN0YW5Ac2F0LnFjLmNhPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIGFkZGVkIGJpdHJhdGUgZXN0aW1hdGlvbiB0byByZWNlaXZlci1zaWRlIHN0YXRzLCBmaXhlcyAjNjExMjEzCisKKzIwMTAtMDMtMDEgMTY6MDE6MjQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSAgaDI2M3BheTogZml4IHR5cG8gaW4gZGVidWcKKworPT09IHJlbGVhc2UgMC4xMC4xOSA9PT0KKworMjAxMC0wMy0wNiAwMDo0MzowMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnNpZ25hbHM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMC4xMC4xOQorCisyMDEwLTAzLTA2IDAwOjQyOjA5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDEwLTAzLTAzIDIwOjI5OjMwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgMC4xOC40IHByZS1yZWxlYXNlCisKKzIwMTAtMDMtMDIgMTg6Mjk6NDEgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogTWFrZSBzdXJlIHdlIGRvbid0IHNlbmQgaW52YWxpZCBuZXdzZWdtZW50cworCSAgRml4ZXMgIzYxMTUwMQorCisyMDEwLTAzLTAyIDE0OjA5OjE0ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIG1hdHJvc2thZGVtdXg6IE1hcmsgc3RyZWFtcyBhcyBiZWluZyBFT1MgYXQgdGhlIHJpZ2h0IHRpbWUuCisJICBUaGlzIGFsbG93cyB1cyB0byBzdG9wIHN0cmVhbWluZyBvbmx5IHdoZW4gYWxsIHN0cmVhbXMgaGF2ZSBnb25lIHBhc3QgdGhlCisJICBzZWdtZW50LnN0b3AgYW5kIG5vdCBiZWZvcmUuCisJICBGaXhlcyAjNjExNTAxCisKKzIwMTAtMDItMjYgMTg6MTA6MzIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IEFkdmFuY2Ugc3BhcnNlIHN0cmVhbXMgb25seSBhcyBtdWNoIGFzIHJlcXVpcmVkIHRvIGtlZXAgdGhlIGdhcCBzbWFsbGVyIHRoYW4gNTAwbXMKKwkgIENoYW5naW5nIGl0IHRvIHRoZSBuZXdlc3QgdGltZXN0YW1wIHRoYXQgd2FzIGV2ZXIgcHVzaGVkIHdpbGwKKwkgIGluY3JlYXNlIHRoZSBzZWdtZW50IHN0YXJ0IGluIDUwMG1zIGp1bXBzLCB3aGljaCBjb3VsZCBiZSBqdXN0CisJICBhZnRlciB0aGUgbmV4dCBzcGFyc2Ugc3RyZWFtIGJ1ZmZlci4gRS5nLgorCSAgVmlkZW8gYXQgMS4wcywgc3BhcnNlIHN0cmVhbSBhdCAwLjVzIHdvdWxkIGp1bXAgdGhlCisJICBzcGFyc2Ugc3RyZWFtIHRvIDEuMHMuIE5vdyBhIG5ldyBzcGFyc2Ugc3RyZWFtIGJ1ZmZlciBjb3VsZAorCSAgYXBwZWFyIHRoYXQgaGFzIGEgdGltZXN0YW1wIG9mIDAuOXMgYW5kIHRoaXMgd291bGQgYmUKKwkgIGRyb3BwZWQgZm9yIG5vIGdvb2QgcmVhc29uIGJlY2F1c2Ugb2YgYmFkIGx1Y2suCisKKzIwMTAtMDItMjQgMDE6MzY6MDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBwby9lcy5wbzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIDAuMTAuMTguMyBwcmUtcmVsZWFzZQorCisyMDEwLTAyLTI0IDAyOjA1OjQ5ICswMTAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kZWNpbmFAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmg6CisJICBNYWtlIHN1cmUgRkxVU0hfU1RPUCBpcyBzZW50IHNvIG5vdCB0byBsZWF2ZSBkb3duc3RyZWFtIGZsdXNoaW5nLgorCisyMDEwLTAyLTIzIDE3OjI1OjU0ICswMTAwICBWb2xrZXIgR3JhYnNjaCA8YnVnemlsbGEuZ25vbWUub3JnQHYubm90anVzdGhvc3RpbmcuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IFVzZSAkUEtHX0NPTkZJRyBpbnN0ZWFkIG9mIHBrZy1jb25maWcgdG8gZml4IGNyb3NzIGNvbXBpbGF0aW9uCisJICBGaXhlcyBidWcgIzYxMDgzOS4KKworMjAxMC0wMi0yMyAxNzoyNDowMyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBSZXNldCBza2V3IGRldGVjdGlvbiBhZnRlciBpbnN0YW50aWF0aW5nIHRoZSBqaXR0ZXJidWZmZXIKKwkgIC4uLm5vdCBvbmx5IHdoZW4gZ29pbmcgdG8gUkVBRFkuIFRoaXMgc2V0cyBoaWdoX2xldmVsIGFuZCBmcmllbmRzIHRvCisJICBhIG1vcmUgdXNlZnVsIHZhbHVlLgorCisyMDEwLTAyLTIzIDE3OjE5OjE0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IFJldHVybiAxMDAgaWYgaGlnaC1sZXZlbCBpcyAwIGluc3RlYWQgb2YgZGl2aWRpbmcgYnkgemVybworCisyMDEwLTAyLTIyIDEyOjI0OjE0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSAgcnRwbXA0Z2RlcGF5OiBhdm9pZCBkaXZpc2lvbiBieSAwCisJICBBdm9pZCBhIGRpdmlzaW9uIGJ5IDAgd2hlbiBubyBjb25zdGFudER1cmF0aW9uIHdhcyBzcGVjaWZpZWQgYW5kIHdoZW4gb3V0IHR3bworCSAgdGltZXN0YW1wcyBhcmUgZXF1YWwuCisJICBGaXhlcyAjNjEwMjY1CisKKzIwMTAtMDItMjIgMTg6MjA6NDYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdmRlcGF5Lmg6CisJICBkdmRlcGF5OiBkb24ndCBvdXRwdXQgZnJhbWVzIHVudGlsIHdlIGhhdmUgYSBoZWFkZXIKKwkgIFdhaXQgZm9yIHRoZSBjb21wbGV0ZSBmaXJzdCA2IGhlYWRlciBESUYgcGFja2V0cyBiZWZvcmUgb3V0cHV0dGluZyBhIGZyYW1lLgorCSAgRGVjb2RlcnMgbmVlZCB0aGlzIGluZm8gdG8gY29ycmVjdGx5IGRlY29kZSB0aGUgZGF0YS4KKwkgIEZpeGVzICM2MTA1NTYKKworMjAxMC0wMi0yMiAyMDo1NToyOSArMDEwMCAgRGF2aWQgSG95dCA8ZGhveXRAbGxubC5nb3Y+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IEZpeCBpbnZhbGlkIG1lbW9yeSBhY2Nlc3MgYnkgZmlyc3QgY2hlY2tpbmcgYW5kIHRoZW4gcmVhZGluZworCSAgRml4ZXMgYnVnICM2MTA0ODMuCisKKzIwMTAtMDItMTggMDk6MDU6NTAgKzAxMDAgIFBoaWxpcHBlIE5vcm1hbmQgPHBoaWxAYmFzZS1hcnQubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGdzdF9wdWxzZXNpbmtfZ2V0X211dGU6IHNldCByZXN1bHQgZWFybGllci4KKwkgIEluIHRoZSBjYXNlcyB3aGVyZSBubyBidWZmZXIgd2FzIHByb2Nlc3MgeWV0IG9yIHRoZSBpbmRleCBpcyBub3QKKwkgIGF2YWlsYWJsZSwgZ2V0X3B1bHNlc2lua19nZXRfbXV0ZSgpIHdvdWxkIHVuY29uZGl0aW9uYWxseSByZXR1cm4KKwkgIEZBTFNFLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxMDMzNworCisyMDEwLTAyLTE5IDEyOjM1OjI5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcGtnY29uZmlnL2dzdHJlYW1lci1wbHVnaW5zLWdvb2QtdW5pbnN0YWxsZWQucGMuaW46CisJICBwa2djb25maWc6IGZpeCBnc3RyZWFtZXItcGx1Z2lucy1nb29kIHVuaW5zdGFsbGVkIC5wYyBmaWxlCisJICBGaXggZ3N0LXBsdWdpbnMtYmFzZSByZWZlcmVuY2UvcmVxdWlyZW1lbnQuIFRoaXMgY2F1c2VkIHNwdXJpb3VzCisJICBwcm9ibGVtcyB3aXRoIHVuaW5zdGFsbGVkIC11Z2x5Ly1iYWQgbm90IGZpbmRpbmcgLWdvb2QgcGx1Z2lucyBpbgorCSAgdGhlaXIgdW5pdCB0ZXN0cyAod2hlbiBkaXN0Y2hlY2tpbmcpLgorCisyMDEwLTAyLTE5IDAxOjAzOjMxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogcG8vbHYucG86CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjE4LjIgcHJlLXJlbGVhc2UKKworMjAxMC0wMi0xOSAwMDo1NDoxMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvLmdpdGlnbm9yZToKKwkgIE1ha2UgZ2l0IGlnbm9yZSBzaGFwZXdpcGUgZXhhbXBsZXMgYW5kIHRlc3RzCisKKzIwMTAtMDItMTkgMDA6NDY6NDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6CisJICBmbHZkZW11eDogbWlub3IgbWljcm8tb3B0aW1pc2F0aW9uCisJICBXZSBrbm93IHRoZXNlIHZhbHVlcyBkb24ndCBjaGFuZ2UgZHVyaW5nIHRoZSBsb29wLCBidXQgdGhlIGNvbXBpbGVyCisJICBkb2Vzbid0IGFuZCBoYXMgdG8gcmUtY2hlY2sgdGhlbSBmb3IgZXZlcnkgaXRlcmF0aW9uLgorCisyMDEwLTAyLTE5IDAwOjM5OjUwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOgorCSAgZmx2ZGVtdXg6IHJlbW92ZSBzdGF0aWMga2V5d29yZCBmcm9tIHZhcmlhYmxlcyB0aGF0IHNob3VsZG4ndCBiZSBzdGF0aWMKKwkgIE11bHRpcGxlIGZsdnBhcnNlL2ZsdmRlbXV4IGluc3RhbmNlcyBzaG91bGQgYmUgYWJsZSB0byBvcGVyYXRlIHdpdGhvdXQKKwkgIHRyYW1wbGluZyBvdmVyIGVhY2ggb3RoZXIgYnkgYWNjaWRlbnRhbGx5IHJlLXVzaW5nIHRoZSBzYW1lIChzdGF0aWMpCisJICB2YXJpYWJsZXMuIChTcG90dGVkIGJ5IE1hcmsgTmF1d2VsYWVydHMpCisKKzIwMTAtMDItMTYgMDI6MDc6MDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGRvY3M6IGFkZCBTaW5jZTogbWFya2VycyBmb3IgbmV3IGppdHRlcmJ1ZmZlciBwcm9wZXJ0aWVzCisKKzIwMTAtMDItMTggMTg6MjA6MjQgKzAxMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IG9mZi1ieS1vbmUgbG9naWMgZXJyb3IgaW4gZnJhbWUgcmF0ZSBjYXAgcmVncmVzc2lvbiBjb21taXQKKworMjAxMC0wMi0xNyAxNjoyNzozMyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFVzZSB0aGUgY29ycmVjdCBkdXJhdGlvbiB3aGVuIGNvbXBhcmluZyBzZWdtZW50cworCSAgRG8gbm90IGNvbmZ1c2UgUXREZW11eFNlZ21lbnRzIHdpdGggR3N0U2VnbWVudHMgd2hlbgorCSAgY29tcGFyaW5nIHRoZSB0b3RhbCBmaWxlIGR1cmF0aW9uIHdpdGggdGhlIHNlZ21lbnQgZHVyYXRpb24KKwkgIEZpeGVzICM2MTAyOTYKKworMjAxMC0wMi0xNyAxODowNjoyOSArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgZHVyYXRpb25zIG1vZHVsbyAxPDwzMgorCSAgRm9yIGNhbGN1bGF0aW5nIHRoZSBkdXJhdGlvbnMgb2YgZWFjaCBzYW1wbGUsIHdlIGFyZSBzdXBwb3NlZCB0byBhZGQgZWFjaAorCSAgZHVyYXRpb24gbW9kdWxvIDE8PDMyIHNvIG1ha2UgdGhlIGVsYXBzZWQgdGltZSBjb3VudGVyIGEgdWludDMyLgorCSAgRml4ZXMgIzYxMDI4MAorCisyMDEwLTAyLTE2IDIxOjA1OjI0ICswMTAwICBBbmRlcnMgU2thcmdyZW4gPGFuZGVycy5za2FyZ3JlbiBhdCBheGlzLmNvbT4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSAgbXVsdGlwYXJ0ZGVtdXg6IGltcHJvdmUgaGVhZGVyIG1pbWUtdHlwZSBwYXJzaW5nCisJICBNYWtlIHRoZSBoYW5kaW5nIG9mIHRoZSBtaW1lIHR5cGUgd2l0aGluIHRoZSAiYm91bmRhcnkiIGEgYml0IGxlc3MgbmFpdmUuCisJICBUaGUgc3RhbmRhcmQgZm9yIE1JTUUgYWxsb3dzIHBhcmFtZXRlcnMgdG8gZm9sbG93IHRoZSAidHlwZSIgLyAic3VidHlwZSIKKwkgIGNsYXVzZSBzZXBhcmF0ZWQgZnJvbSB0aGUgbWltZSB0eXBlIGJ5ICc7Jy4KKwkgIE1vZGlmaWVzIHRoZSBtdWx0aXBhcnRkZW11eGVyJ3MgaGVhZGVyIHBhcnNpbmcgc28gaXQgZG9lc250IGFzc3VtZQorCSAgdGhlIHdob2xlIGxpbmUgYWZ0ZXIgImNvbnRlbnQtdHlwZToiIGlzIHRoZSBtaW1lIHR5cGUgYW5kIHRodXMgbWFrZXMgaXQgYSBiaXQKKwkgIG1vcmUgcmVzaWxpZW50IHRvIGZpbmRpbmcgYWJzdXJkIG1pbWUgdHlwZXMgaW4gdGhlIGNhc2Ugd2hlcmUgcGFyYW1ldGVycyBhcmUKKwkgIGFkZGVkLgorCSAgRml4ZXMgIzYwNDcxMQorCisyMDEwLTAyLTE2IDE5OjUzOjA5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBhdm9pZCBzdG9wcGluZyBOVUxMIHRhc2tzCisJICBDaGVjayB0aGUgdGFzayBmb3IgTlVMTCwgaXQgY291bGQgYmUgcGF1c2VkIGFuZCBzZXQgdG8gTlVMTCBiZWZvcmUuCisKKzIwMTAtMDItMTYgMTY6MjI6MjggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggQUxBQyBjb2RlYy1kYXRhIGhhbmRsaW5nCisJICBBTEFDIGNvZGVjLWRhdGEgYXBwYXJlbnRseSBjb21lcyBpbiAoYXQgbGVhc3QpIHR3byBmbGF2b3VycyAobW92LCBtcDQpLAorCSAgc28gdXNlIGF0b20gYmFzZWQgcGFyc2luZyB0byByZXRyaWV2ZSByZXF1aXJlZCBkYXRhLCByYXRoZXIgdGhhbgorCSAgYWltaW5nIGZvciBhIHNwZWNpZmljIG9mZnNldC4KKwkgIFNlZSBhbHNvICM1ODA3MzEuCisKKzIwMTAtMDItMTYgMTU6NTA6MjMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggZGVidWcgbWVzc2FnZQorCisyMDEwLTAyLTExIDE5OjM5OjA0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF90eXBlcy5oOgorCSAgcXRkZW11eDogaGFuZGxlIHNpZ25lZCB2YWx1ZXMgaW4gM0dQUCBsb2NhdGlvbiB0YWcKKworMjAxMC0wMi0wOCAyMTozNTo1MyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGZpeCB0eXBvIGluIGRlYnVnIG1lc3NhZ2UKKworMjAxMC0wMi0xNiAxNTowMDoxMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiByZXNldCBzb21lIG1vcmUgc3RyZWFtIHN0YXRlIGFmdGVyIHNlZWsKKwkgIEluIHBhcnRpY3VsYXIsIGZpeGVzIG5vbi1mbHVzaGluZyBzZWVrLgorCisyMDEwLTAyLTE2IDE0OjQ0OjExICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBmcmFtZSByYXRlIGNhcCByZWdyZXNzaW9uCisJICBMb29rIGZvciBhIG5vbi16ZXJvIG1pbl9kdXJhdGlvbiBkdXJpbmcgaW5pdGlhbGlzYXRpb24gdG8gYXZvaWQKKwkgIGluY29ycmVjdCBmcmFtZSByYXRlIGNhcHMuCisKKzIwMTAtMDItMTYgMTA6MTM6MTcgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGxvZyBtb3JlIGRldGFpbHMgaW4gYnVmZmVyIHBvb2wgZmluYWxpemUKKwkgIEhlbHBzIHRvIGFsaWduIHdpdGggdGhlIGxvZ2dpbiBmcm9tIGxpYnY0bC4KKworMjAxMC0wMi0xNiAxMDoxMTo0MCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBpbml0IGRhdGFzdHJ1Y3R1cmVzIGFmdGVyIHByZS1jb25kaXRpb25zIGNoZWNrcworCisyMDEwLTAyLTE2IDEwOjEwOjQ1ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWdlbmM6IGFkZCBhIGZpeG1lIGZvciBoYW5kbGluZyBvdGhlciBZVVYgdmFyaWFudHMKKworMjAxMC0wMi0xNiAwMTo0MDoxOSArMDAwMCAgQnJpYW4gQ2FtZXJvbiA8YnJpYW4uY2FtZXJvbkBzdW4uY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thOiBmaXggR1NUX0VMRU1FTlRfRVJST1IgdXNhZ2UKKwkgIEZpeGVzICM2MTAwNTMuCisKKzIwMTAtMDItMTYgMDA6NTA6MTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IGZpeCB1cCBHU1RfQ1hYRkxBR1MgcHJvcGVybHkKKwkgIFdlIGRvbid0IHdhbnQgQyBzcGVjaWZpYyBmbGFncyBpbiBHU1RfQ1hYRkxBR1MsIHNvIGJhc2UgaXQgb24gdGhlCisJICBHU1RfQ0ZMQUdTIHRoYXQgb25seSBjb250YWlucyB0aGUgcGtnLWNvbmZpZyBDRkxBR1MgYnV0IG5vbmUgb2YKKwkgIHRoZSBHU1RfT1BUSU9OX0NGTEFHUy4gQWxzbywgd2Ugb25seSBuZWVkIHRoZSBsb2NhbCBpbmNsdWRlcyBvbmNlLgorCSAgRml4IHR5cG8gYXMgd2VsbCAoR1NUX0ZMQUdTIC0+IEdTVF9DRkxBR1MpLgorCisyMDEwLTAyLTE1IDIzOjEzOjQ2ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogYmFzZSBHU1RfQ1hYRkxBR1Mgb24gLS1jZmxhZ3MgZnJvbSBwa2ctY29uZmlnCisJICBwa2ctY29uZmlnIHNldHMgR1NUX0NGTEFHUyBhbmQgR1NUX0xJQlMuIFdlIG5lZWQgdG8gdXNlIENGTEFHUyBhcyBhIHN0YXJ0aW5nCisJICBwb2ludCBmb3IgZm9yIGJvdGggQyBhbmQgQ1hYIHNldHRpbmdzLgorCisyMDEwLTAxLTIwIDE4OjUyOjUxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cGJpbjogcmVtb3ZlIHVzZSBvZiBudHBfbnNfYmFzZQorCisyMDEwLTAxLTIwIDE4OjIyOjIwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgcnRwYmluOiByZW1vdmUgbW9yZSBudHBuc3RpbWUgYW5kIGNsZWFudXBzCisJICBSZW1vdmUgc29tZSBjb2RlIHdoZXJlIHdlIHBhc3MgbnRwbnN0aW1lIGFyb3VuZCwgd2UgY2FuIGRvIG1vc3QgdGhpbmdzIHdpdGggdGhlCisJICBydW5uaW5nX3RpbWUganVzdCBmaW5lLgorCSAgUmVuYW1lIGEgdmFyaWFibGUgaW4gdGhlIEFycml2YWxTdGF0cyBzdHJ1Y3Qgc28gdGhhdCBpdCdzIGNsZWFyIHRoYXQgdGhpcyBpcyB0aGUKKwkgIGN1cnJlbnQgc3lzdGVtIHRpbWUuCisKKzIwMTAtMDEtMjAgMTg6MTk6MzQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291cmNlOiB1c2UgcnVubmluZ190aW1lIGZvciBqaXR0ZXIKKwkgIFVzZSB0aGUgcnVubmluZ190aW1lIHRvIGNhbGN1bGF0ZSB0aGUgaml0dGVyIGluc3RlYWQgb2YgdGhlIG50cCB0aW1lLiBQYXJ0IG9mCisJICB0aGUgcGxhbiB0byBnZXQgcmlkIG9mIG50cG5zYmFzZS4KKworMjAxMC0wMS0yMCAxNzowNDowMyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIHJ0cGJpbjogY2hhbmdlIGhvdyBOVFAgdGltZSBpcyBjYWxjdWxhdGVkIGluIFJUQ1AKKwkgIERvbid0IGNhbGN1bGF0ZSB0aGUgTlRQIHRpbWUgYmFzZWQgb24gdGhlIHJ1bm5pbmdfdGltZSBvZiB0aGUgcGlwZWxpbmUgYnV0IGZyb20KKwkgIHRoZSBzeXN0ZW1jbG9jay4gVGhpcyBhbGxvd3MgdXMgdG8gZ2VuZXJhdGUgbW9yZSBhY2N1cmF0ZSBOVFAgdGltZXN0YW1wcyBpbiBjYXNlCisJICB0aGUgc3lzdGVtY2xvY2sgaXMgc3luY2hyb25pemVkIHdpdGggTlRQIG9yIHNpbWlsYXIuCisKKzIwMTAtMDItMTUgMTI6MTI6MzYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBwcmludGYgZm9ybWF0IHN0cmluZyBmaXgKKwkgIFRoZSBjb21waWxlciB3YW50cyBhIGNhc3QgaGVyZSBldmVuIHRob3VnaCB0aGUgdHlwZSBpcyBhbHJlYWR5CisJICB0eXBlZGVmZWQgYXMgNjQtYml0IGludGVnZXIgKHByZXN1bWFibHkgYmVjYXVzZSBnbGliIGhhcyB0eXBlZGVmZWQKKwkgIGd1aW50NjQgdG8gdW5zaWduZWQgbG9uZyBoZXJlKS4KKworMjAxMC0wMi0xNSAxMDozMzowMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2E6IGZpeCBwcmludGYgZm9ybWF0IHN0cmluZworCisyMDEwLTAyLTE1IDAwOjUwOjEwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3JhdzEzOTQvZ3N0MTM5NGNsb2NrLmg6CisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJICByYXcxMzk0LCBtYXRyb3NrYSwgcnRwbWFuYWdlcjogcmVtb3ZlIHBhZGRpbmcgZnJvbSBzdHJ1Y3R1cmVzCisJICBOb25lIG9mIHRoZXNlIGVsZW1lbnQgYW5kIGNsYXNzIHN0cnVjdHVyZXMgYXJlIGluIHB1YmxpYyBoZWFkZXJzLAorCSAgc28gZG9uJ3QgbmVlZCBwYWRkaW5nLgorCisyMDEwLTAyLTE1IDAwOjQ3OjExICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgcG86IHVwZGF0ZSBmb3IgbmV3IHRyYW5zbGF0b3IgY29tbWVudAorCisyMDEwLTAyLTE1IDAwOjQ1OjUxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBhZGQgY29tbWVudCBmb3IgdHJhbnNsYXRvcnMgZm9yICd4IGJ5IHknIG1lc3NhZ2UKKwkgIEZpeGVzICM2MDk3MjQuCisKKzIwMTAtMDItMTUgMDE6Mjg6NDQgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm9yZW5kZXIuYzoKKwkgIGNhaXJvcmVuZGVyOiBGaXggbGVha2luZyBvZiBwYWQgdGVtcGxhdGVzCisKKzIwMTAtMDItMTUgMDA6NTA6MjcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zaGFwZXdpcGUuYzoKKwkgIHNoYXBld2lwZTogRml4IHVuaXQgdGVzdCBmb3IgbGF0ZXN0IGNoYW5nZXMKKwkgIE5vdyB0aGUgYWxwaGEgaXMgbXVsdGlwbGllZCB3aXRoIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGFscGhhCisJICB2YWx1ZSBpbnN0ZWFkIG9mIHNpbXBseSBpZ25vcmluZyBpdCBhbmQgdGhlIGx1bWEvY2hyb21hIHZhbHVlcworCSAgYXJlIGtlcHQsIGV2ZW4gaWYgdGhlIG91dHB1dCBpcyAxMDAlIHRyYW5zcGFyZW50LgorCisyMDEwLTAyLTE1IDAwOjQ3OjA4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc2hhcGV3aXBlLmM6CisJICBzaGFwZXdpcGU6IEltcHJvdmUgdW5pdCB0ZXN0IG91dHB1dCBvbiBlcnJvcnMKKworMjAxMC0wMi0xNCAyMzoxNzoyMCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA5NmRjNzkzIHRvIDQ0ZWNjZTcKKworMjAxMC0wMi0xMyAyMzoyODowNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogYnVtcCAtYmFzZSByZXF1aXJlbWVudCB0byBnaXQKKwkgIEZvciBHU1RfUklGRl9UQUdfSlVOUS4KKworMjAxMC0wMi0xMiAxNjoxMTozMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkgIHY0bDJzaW5rOiBjaGFuZ2UgcmFuayB0byBOT05FIHNvIGl0IGlzIG5ldmVyIGF1dG9wbHVnZ2VkCisKKzIwMTAtMDItMTMgMTg6MTg6NDIgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIGZsdmRlbXV4OiBBdWRpbyB0YWdzIHdpdGhvdXQgYW55IGNvbnRlbnQgYXJlIHZhbGlkLgorCSAgV2Ugc2lsZW50bHkgaWdub3JlIHRoZW0gaW5zdGVhZCBvZiBlcnJvcmluZyBvdXQuCisKKzIwMTAtMDItMTMgMTg6MDc6NTAgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIGZsdmRlbXV4OiBGaXggR1NUX0NMT0NLX0RJRkYgdXNhZ2UuCisJICBJdCB3YXMgcHJldmlvdXNseSBjaGVja2luZyBmb3IgRElGRihhLCBiID4gNiAqIEdTVF9TRUNPTkQpIGluc3RlYWQgb2YKKwkgIHRoZSBwcm9wZXIgRElGRihhLGIpID4gNiAqIEdTVF9TRUNPTkQKKworMjAxMC0wMi0xMyAxNjoyNzowNyArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IERvbid0IGZvcmdldCB0byByZXNldCB0aGUgaW5kZXhlZCB2YXJpYWJsZSB3aGVuIGNsZWFuaW5nIHVwCisKKzIwMTAtMDItMTMgMTE6MDE6NTMgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIGZsdmRlbXV4OiBTcGVlZHVwIEdzdEluZGV4IHVzYWdlCisJICBVc2VkIHRoZSBfYWRkX2Fzc29jaWF0aW9udiB2YXJpYW50IG9mIEdzdEluZGV4IHNpbmNlIHdlIGtub3cgaG93IG1hbnkKKwkgIGFzc29jaWF0aW9ucyB3ZSdyZSBhZGRpbmcuIFRyaW1zIHVwIHRvIDUwJSBmcm9tIGluZGV4IGdlbmVyYXRpb24gdGltZS4KKwkgIE5vdGUgOiBJdCB3b3VsZCBiZSBncmVhdCBpZiB0aGUgaW5kZXggY291bGQgYmUgZ2VuZXJhdGVkIG9uIHRoZSBmbHkgb3IKKwkgIG9uIHJlcXVlc3QgYXMgb3Bwb3NlZCB0byBiZWluZyBmdWxseSBjcmVhdGVkIGF0IHN0YXJ0dXAuCisKKzIwMTAtMDItMTIgMTk6MzI6MjcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBkb24ndCByZXN5bmMgdG8gaW52YWxpZCB0aW1lc3RhbXBzCisJICBJZiB3ZSBkZXRlY3QgYmFja3dhcmQgdGltZXN0YW1wcyBvbiB0aGUgc2VydmVyLCBkb24ndCB0cnkgdG8gcmVzeW5jIHdoZW4gd2UKKwkgIGRvbid0IGhhdmUgYW4gaW5wdXQgdGltZXN0YW1wIChzdWNoIGFzIHdoZW4gdXNpbmcgUlRTUCBvdmVyIFRDUCkgaW5zdGVhZCwgZG8KKwkgIG5vdGhpbmcgYnV0IGFzc3VtZSB0aGUgdGltZXN0YW1wIHdhcyBvaywgaXQgd2lsbCBjb3JyZWN0IGl0c2VsZiB3aGVuIHRpbWUgZ29lcworCSAgZm9yd2FyZHMuCisKKzIwMTAtMDItMTIgMTc6MjE6NDMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBmaXggdHlwbworCisyMDEwLTAyLTEyIDE2OjQ3OjI5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogc3RhcnQgb3V0IGFjdGl2ZSBhbmQgbm90IGJ1ZmZlcmluZworCSAgVGhlcmUgaXMgbm8gbmVlZCB0byBzZXQgdGhlIGxhdGVuY3kgaW4gdGhlIGppdHRlYnVmZmVyIGluIF9pbml0LCB3ZSB3aWxsIHNldAorCSAgdGhhdCBsYXRlciB3aGVuIGdvaW5nIHRvIFBBVVNFRC4KKwkgIFNldCB0aGUgaml0dGVyYnVmZmVyIGFjdGl2ZSBhbmQgbm90IGJ1ZmZlcmluZyB3aGVuIHN0YXJ0aW5nLgorCisyMDEwLTAxLTI3IDE3OjU3OjU1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaDoKKwkgIHJ0cGJpbjogbW9yZSBidWZmZXJpbmcgd29yaworCSAgV2hlbiBkZWFjdGl2YXRpbmcgaml0dGVyYnVmZmVycyB3aGVuIHRoZSBidWZmZXJpbmcgc3RhcnRzLCBrZWVwIHRoZSBjdXJyZW50CisJICBwZXJjZW50IG9mIHRoZSBqaXR0ZXJidWZmZXIgYW5kIGFsc28gc2V0IHRoZSBqaXR0ZXJidWZmZXIgaW4gdGhlIGJ1ZmZlcmluZyBzdGF0ZQorCSAgc28gdGhhdCB3ZSBrbm93IHdoZW4gaXQncyBmaWxsZWQgYWdhaW4uCisJICBBZGQgcHJvcGVydHkgdG8gZ2V0IHRoZSBidWZmZXJpbmcgcGVyY2VudGFnZSBvZiB0aGUgaml0dGVyYnVmZmVyLgorCisyMDA5LTEwLTE0IDE2OjI5OjM1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogYWRqdXN0IGxhdGVuY3kgaW4gYnVmZmVyIG1vZGUKKwkgIFdoZW4gd2UgYXJlIGluIGJ1ZmZlciBtb2RlLCBhZGp1c3QgdGhlIGJ1ZmZlcmluZyBsb3cvaGlnaCB0aHJlc2hvbGRzIGJhc2VkIG9uCisJICB0aGUgdG90YWwgY29uZmlndXJlZCBsYXRlbmN5LiBJZiB3ZSBkb24ndCBhbmQgdGhlcmUgaXMgYSBodWdlIHF1ZXVlIG9yIGVsZW1lbnQKKwkgIHdpdGggYSBiaWcgbGF0ZW5jeSBkb3duc3RyZWFtIHdlIG1pZ2h0IGRyYWluIHRoZSBjb21wbGV0ZSBxdWV1ZSBpbW1lZGlhdGVseSBhbmQKKwkgIHN0YXJ0IGJ1ZmZlcmluZyBhZ2Fpbi4KKworMjAwOS0xMC0xMiAxMTo1NDowNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGFkZCB0cy1vZmZzZXQgdG8gdGltZXN0YW1wCisJICBBZGQgdGhlIHRzLW9mZnNldCB0byB0aGUgYnVmZmVyIHRpbWVzdGFtcCB0byBnZXQgdGhlIGZpbmFsIG91dHB1dCB0aW1lc3RhbXAgb2YKKwkgIHRoZSBidWZmZXIuCisKKzIwMDktMTAtMDggMTk6MjM6NTMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi1tYXJzaGFsLmxpc3Q6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGJpbjogZG8gbW9yZSBhY2N1cmF0ZSBidWZmZXIgb2Zmc2V0cworCSAgUmV0dXJuIHRoZSBuZXh0IHRpbWVzdGFtcCBpbiB0aGUgaml0dGVyYnVmZmVyLgorCSAgVXNlIHRoZSBtaW4tdGltZXN0YW1wIG9mIHRoZSBqaXR0ZXJidWZmZXJzIHRvIGNhbGN1bGF0ZSBhbiBvZmZzZXQgc28gdGhhdCB0aGUKKwkgIG5leHQgdGltZXN0YW1wIGlzIHB1c2hlZCB3aXRoIGEgdGltZXN0YW1wIGVxdWFsIHRvIHJ1bm5pbmdfdGltZS4KKwkgIFN0YXJ0IHByb2R1Y2luZyB0aW1lc3RhbXBzIGZyb20gMCBpbiB0aGUgYnVmZmVyaW5nIGNhc2UgdG9vLgorCisyMDA5LTEwLTA4IDE4OjQyOjExICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogb25seSBzdGFydCBidWZmZXJpbmcgd2hlbiA8IDEwMCUKKwkgIE9ubHkgc3RhcnQgYnVmZmVyaW5nIHdoZW4gdGhlIHBlcmNlbnRhZ2UgbWVzc2FnZSBpcyA8IDEwMCAlLgorCisyMDA5LTEwLTA2IDEzOjM0OjM0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgcnRwYmluOiBrZWVwIHRyYWNrIG9mIGVsYXBzZWQgcGF1c2UgdGltZQorCSAgS2VlcCB0cmFjayBvZiB0aGUgdGltZSB3ZSBzcGVuZCBwYXVzaW5nIHRoZSBqaXR0ZXJidWZmZXJzIHdoZW4gdGhleSB3ZXJlCisJICBidWZmZXJpbmcgYW5kIGRpc3RyaWJ1dGUgdGhpcyBlbGFwc2VkIHRpbWUgdG8gdGhlIGppdHRlcmJ1ZmZlcnMuCisJICBBbHNvIGtlZXAgdGhlIGxhdGVuY3kgaW4gbmFub3NlY29uZCBwcmVjaXNpb24uCisKKzIwMDktMTAtMDYgMTM6MzM6MTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJICBqaXR0ZXJidWZmZXI6IGtlZXAgdHJhY2sgb2Ygb2Zmc2V0CisJICBLZWVwIHRyYWNrIG9mIGFuIG91dGdvaW5nIG9mZnNldCB0aGF0IHdlIGFkZCB0byBlYWNoIG91dGdvaW5nIGJ1ZmZlciB0bworCSAgY29tcGVuc2F0ZSBmb3IgUEFVU0Ugd2hlbiBidWZmZXJpbmcuCisJICBBZGp1c3QgdGhlIG9mZnNldCB3aGVuIGFjdGl2YXRpbmcuCisKKzIwMDktMTAtMDYgMTM6MzA6NTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiByZXBvcnQgbGV2ZWwgdXNpbmcgaGlnaCB3YXRlcm1hcmsKKworMjAwOS0xMC0wNSAyMTozMTo1OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRwYmluOiBwYXNzIHJ1bm5pbmdfdGltZSB0byBqaXR0ZXJidWZmZXIgcGF1c2UKKwkgIFBhc3MgdGhlIGN1cnJlbnQgcnVubmluZyB0aW1lIHRvIHRoZSBqaXR0ZXJidWZmZXIgd2hlbiBwYXVzaW5nIG9yIHJlc3VtaW5nIHNvCisJICB0aGF0IGl0IGNhbGN1bGF0ZSB0aGUgcmlnaHQgb2Zmc2V0cy4KKwkgIFNtYWxsIGNsZWFudXBzIGFuZCBjb21tZW50cy4KKwkgIFNldCB0aGUgZGVmYXVsdCBydHNwc3JjIGxhdGVuY3kgdG8gMiBzZWNvbmRzLgorCisyMDA5LTEwLTA1IDIwOjA5OjMwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwYmluOiBhZGQgc29tZSBjb21tZW50cworCisyMDA5LTEwLTA1IDE5OjQ1OjM1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4tbWFyc2hhbC5saXN0OgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgcnRwYmluOiBtb3JlIGJ1ZmZlcmluZyB1cGRhdGVzCisJICBBZGQgc2lnbmFsIHRvIHBhdXNlIHRoZSBqaXR0ZXJidWZmZXIuIFRoaXMgd2lsbCBiZSBlbWl0dGVkIGZyb20gZ3N0cnRwYmluIHdoZW4KKwkgIG9uZSBvZiB0aGUgaml0dGVyYnVmZmVycyBpcyBidWZmZXJpbmcuCisJICBNYWtlIHJ0cGJpbiBjb2xsZWN0IHRoZSBidWZmZXJpbmcgbWVzc2FnZXMgYW5kIHBvc3QgYSBuZXcgYnVmZmVyaW5nIG1lc3NhZ2Ugd2l0aAorCSAgdGhlIG1pbiB2YWx1ZS4KKwkgIFJlbW92ZSB0aGUgc3RhdHMgY2FsbGJhY2sgZnJvbSBqaXR0ZXJidWZmZXIgYnV0IHBhc3MgYSBwZXJjZW50IGludGVnZXIgdG8KKwkgIGZ1bmN0aW9ucyB0aGF0IGFmZmVjdCB0aGUgYnVmZmVyaW5nIHN0YXRlIG9mIHRoZSBqaXR0ZXJidWZmZXIuIFRoaXMgYWxsb3dzIHVzCisJICB0aGVuIHRvIHBvc3QgYnVmZmVyaW5nIG1lc3NhZ2VzIGZyb20gb3V0c2lkZSBvZiB0aGUgaml0dGVyYnVmZmVyIGxvY2suCisKKzIwMDktMTAtMDUgMTM6MzI6MTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBydHBiaW46IHByb3BhZ2F0ZSBidWZmZXItbW9kZSBwcm9wZXJ0eQorCSAgUHJvcGFnYXRlIGJ1ZmZlci1tb2RlIHByb3BlcnR5IHRvIHRoZSBqaXR0ZXJidWZmZXJzLgorCSAgSW50ZXJjZXB0IEJVRkZFUklORyBtZXNzYWdlcyBpbiBydHBiaW4KKworMjAwOS0xMC0wMSAxNzoxNDowOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgaml0dGVyYnVmZmVyOiBkbyBtb3JlIGJ1ZmZlcmluZyBpbXBsZW1lbnRhdGlvbgorCSAgQWRkIGNhbGxiYWNrIGZvciBidWZmZXJpbmcgc3RhdHMuCisJICBDb25maWd1cmUgdGhlIGxhdGVuY3kgaW4gdGhlIGppdHRlcmJ1ZmZlciBpbnN0ZWFkIG9mIHBhc3NpbmcgaXQgd2l0aCBfaW5zZXJ0LgorCSAgQ2FsY3VsYXRlIGJ1ZmZlcmluZyBsZXZlbHMgd2hlbiBwdXNoaW5nIGFuZCBwb3BwaW5nCisJICBQb3N0IGJ1ZmZlcmluZyBtZXNzYWdlcy4KKworMjAwOS0xMC0wMSAxMjo0NjoyMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgaml0dGVyYnVmZmVyOiBmbGVzaCBvdXQgYnVmZmVyaW5nIG1vZGUgc29tZSBtb3JlCisJICBBZGQgYSBidWZmZXJpbmcgc3RhdGUgdG8gdGhlIGppdHRlcmJ1ZmZlciBhbmQgd2FpdCB1bnRpbCBidWZmZXJpbmcgZW5kcyBiZWZvcmUKKwkgIHB1c2hpbmcgb3V0IHBhY2tldHMuCisKKzIwMDktMTAtMDEgMTI6MDk6NTggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGhvb2sgdXAgdGhlIG1vZGUgcHJvcGVydHkKKwkgIEV4cG9zZSBhIG1vZGUgcHJvcGVydHkgb24gdGhlIGppdHRlcmJ1ZmZlci4KKwkgIEZpeCB0aGUgY2FzZSB3aGVyZSB0aW1lc3RhbXBzIGFyZSAtMSBpbiB0aGUgY2hlY2sgZm9yIG91dGdvaW5nIHRpbWVzdGFtcHMuCisKKzIwMDktMTAtMDEgMTE6MjA6MDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBqaXR0ZXJidWZmZXI6IGFkZCBidWZmZXJpbmcgbW9kZSBvcHRpb25zCisJICBBZGQgZ2V0dGVycyBhbmQgc2V0dGVycyBmb3IgZGlmZmVyZW50IGJ1ZmZlcmluZyBtb2RlcyB0aGF0IHRoZSBqaXR0ZXJidWZmZXIgd2lsbAorCSAgc3VwcG9ydC4gRGVmYXVsdCB0byB0aGUgY3VycmVudCBzbGF2ZSBtb2RlLgorCisyMDEwLTAyLTEyIDE1OjU0OjM3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMi5jOgorCSAgdjRsc2luazogbG93ZXIgcmFuayB0byBNQVJHSU5BTAorCisyMDEwLTAyLTEyIDE2OjA2OjQ1ICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIGZsdmRlbXV4OiBPYnRhaW4gdGhlIGluZGV4IGZyb20gdGhlIGVuZCBvZiBhbiBmbHYgZmlsZSBpbiBwdXNoIG1vZGUKKwkgIEFsbG93cyBmb3IgYmV0dGVyIHN1cHBvcnQgb2Ygc2Vla2luZyBpbiBmbHYgZmlsZXMgd2hlbiBpbiBwdXNoIG1vZGUKKworMjAxMC0wMS0yMSAxMTo1NToxNSArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogRHJvcCB2aWRlbyBmcmFtZXMgdXAgdG8gdGhlIGRlc2lyZWQga2V5ZnJhbWUgYWZ0ZXIgYSBzZWVrCisJICBUaGUgYXVkaW8gcGFja2V0cyBpbiBBVkkgYXJlIGdlbmVyYWxseSBtdXhlZCB+MC41cyBiZWZvcmUgdGhlCisJICBjb3JyZXNwb25kaW5nIHZpZGVvIHBhY2tldC4gVGhpcyBjaGFuZ2VzIGNhdXNlcyBkb3duc3RyZWFtIHRvIG9ubHkKKwkgIHJlY2VpdmUgcGFja2V0cyB3aXRoIHJvdWdobHkgY29ycmVzcG9uZGluZyB0aW1lc3RhbXBzLgorCisyMDEwLTAxLTE5IDE4OjM1OjQ5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogbW9yZSBESVNDT05UIGhhbmRsaW5nCisJICBBZGQgc29tZSBkZWJ1ZyBpbiB0aGUgRElTQ09OVCBoYW5kbGluZyBjb2RlLgorCSAgV2hlbiB3ZSByZWNlaXZlIGEgRElTQ09OVCBpbiBwdXNoIG1vZGUsIG1hcmsgYWxsIHN0cmVhbXMgYXMgRElTQ09OVC4KKworMjAxMC0wMS0xOSAxMDo1MTowOCArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogRml4IF9oYW5kbGVfc2Vla19wdXNoICgpIGFuZCBuZXcgc2VnZW1lbnQgYmVoYXZpb3VyCisKKzIwMTAtMDEtMTggMTc6MTM6MDYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBjbGVhbnVwcworCSAgTWFrZSBzdXJlIHdlIHJlc2V0IHRoZSBkZW11eGVyIGNvcnJlY3RseSB3cnQgcGFyc2luZyB0aGUgaW5kZXguCisJICBEb24ndCBsZWFrIHBlbmRpbmcgc2VlayBldmVudHMuCisJICBSZW5hbWUgc29tZSBtZXRob2RzIHRvIHJlZmxlY3Qgd2hhdCB0aGV5IGRvIGFuZCB0byBhdm9pZCBjb25mdXNpb24gd2l0aCBzaW1pbGFyCisJICBtZXRob2QgbmFtZXMuCisJICBUcnkgdG8gbWFrZSB0aGUgc2Vla2luZyB0aHJlYWRzYWZlIGJ5IHByb3RlY3RpbmcgdGhlIHNldHVwIGNvZGUgd2l0aCBhIGxvY2suCisJICBNYWtlIHN1cmUgd2UgcG9zdCBlcnJvcnMgd2hlbiBhIHNlZWsgZmFpbHMuCisKKzIwMTAtMDEtMTggMTE6NDU6MzggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIGF2aWRlbXV4OiByZW5hbWUgc29tZSB2YXJpYWJsZXMKKwkgIHNlZWtfZXZlbnQgLT4gc2VnX2V2ZW50CisJICBldmVudF9zZWVrIC0+IHNlZWtfZXZlbnQKKworMjAxMC0wMS0xNSAxODowMDo0NiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHRha2UgZmFsbGJhY2sgZHVyYXRpb24gZnJvbSBhdmloCisJICBXaGVuIHdlIGhhdmUgbm90IHBhcnNlZCBhbnkgaW5kZXhlcyB5ZXQsIHdlIGRvbid0IGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgc3RyZWFtcworCSAgYW5kIHdlIG11c3QgdGFrZSB0aGUgbGVuZ3RoIGdpdmVuIGluIHRoZSBhdmloIGFzIGEgZmFsbGJhY2suCisJICBBdm9pZCBzb21lIHR5cGVjaGVja2luZy4KKworMjAwOS0xMi0wNCAxNToxMzoxMiArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogUHVzaCBtb2RlIHNlZWtpbmcgc3VwcG9ydAorCisyMDEwLTAyLTAxIDE2OjA0OjQxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBjbGVhbnVwIHByb3BlcnRpZXMKKwkgIFVzZSBtb3JlIGRlZmF1bHQgY29uc3RhbnRzLgorCSAgVXNlIHN0YXRpYyBzdHJpbmdzIHBhcmFtIGZsYWcuCisJICBJbml0IHByb3BlcnRpZXMgZXhwbGljaXRseSBpbnN0ZWFkIG9mIGxldHRpbmcgZ29iamVjdCBkbyB0aGlzLgorCisyMDEwLTAyLTEyIDE1OjM0OjM4ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSAgc3BlZXg6IGFkZCBtaXNzaW5nIGluY2x1ZGUKKworMjAxMC0wMi0wNSAxMzoyODo1MyArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuYzoKKwkgIHRhZ2luamVjdDogZml4IG11bHRpLXZhbHVlIHRhZyBleGFtcGxlCisJICBXZSBuZWVkIHRvIHVzZSB7fSB0byBzcGVjaWZ5IGEgbGlzdC4KKworMjAxMC0wMi0wMSAxNDo0MzowNCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIGF2aSx3YXY6IGFsc28gaGFuZGxlIEpVTlEgY2h1bmsgaW4gYWRkaXRpb24gdG8gSlVOSworCisyMDEwLTAyLTA0IDE1OjU5OjI1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzoKKwkgIHJ0cHBheTogZG9uJ3QgaWdub3JlIHJlc3VsdCBmcm9tIHNldF9vdXRjYXBzCisJICBzZXRfb3V0Y2FwcyBjYW4gZmFpbCBhbmQgd2UgbmVlZCB0byBwcm9wYWdhdGUgdGhlIHJlc3VsdCB1cHN0cmVhbS4KKworMjAxMC0wMi0wNCAxNTozNjoyNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOgorCSAgZmx2cGFyc2U6IGZpeCBjb25mdXNpbmcgZGVidWcgbWVzc2FnZXMKKworMjAxMC0wMS0yNyAxMzoyODoxMyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGFkZCBzb21lIG1vcmUgZGVidWcgaW5mbworCisyMDEwLTAxLTI3IDEzOjI2OjQ2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGF2b2lkIHNlZ2ZhdWx0IHdoZW4gc2h1dHRpbmcgZG93bgorCSAgd2hlbiB3ZSBhcmUgc2h1dHRpbmcgZG93biwgd2UgbWlnaHQgc3RpbGwgcmVjZWl2ZSBzdGF0ZSB1cGRhdGVzIGZyb20gcHVsc2VhdWRpbworCSAgYnV0IHNpbmNlIHdlIGFyZSB1bnBhcmVudGVkIHdlIHNob3VsZCBub3QgZG8gYW55dGhpbmcgd2l0aCB0aGUgTlVMTCBwYXJlbnQKKwkgIGFueW1vcmUuCisKKzIwMTAtMDEtMjYgMTg6MzM6MjcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuaDoKKwkgIHZpZGVvbWl4ZXI6IGZpeCB0aW1lc3RhbXAgcHJvYmxlbXMKKwkgIFdoZW4gdGhlIHBhZCB3aXRoIHRoZSBoaWdoZXN0IGZyYW1lcmF0ZSBnb2VzIEVPUywgaW5zdGVhZCBvZiBub3QgdGltZXN0YW1waW5nCisJICBvdXRwdXQgYnVmZmVycywgaW50ZXBvbGxhdGUgdGltZXN0YW1wcyBhbmQgZHVyYXRpb25zIGZyb20gdGhlIGxhc3Qgc2VlbiBvbmVzLgorCSAgRml4ZXMgIzYwODAyNgorCisyMDEwLTAyLTEyIDExOjMyOjQwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkgIGRvY3M6IFVwZGF0ZSBkb2N1bWVudGF0aW9uCisKKzIwMTAtMDItMTIgMTE6MTg6MjYgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL01ha2VmaWxlLmFtOgorCSAgTW92ZWQgJ3NoYXBld2lwZScgZnJvbSAtYmFkIHRvIC1nb29kCisJICBGaXhlcyBidWcgIzU4NDUzNi4KKworMjAxMC0wMi0xMCAxMDo1Mjo1MyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMjkvMjldIHNoYXBld2lwZTogUHJlc2VydmUgdGhlIGlucHV0IGNvbG9yIHZhbHVlcyBpbiBhbGwgY2FzZXMKKworMjAxMC0wMi0xMCAxMDo1MDo0OSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMjgvMjldIHNoYXBld2lwZTogU2NhbGUgbWFzayBhbHBoYSB2YWx1ZXMgYnkgdGhlIHNvdXJjZSBhbHBoYSB2YWx1ZXMKKworMjAxMC0wMi0xMCAxMDo0MjozMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMjcvMjldIHNoYXBld2lwZTogRml4IEFSR0IgcHJvY2Vzc2luZworCisyMDEwLTAyLTEwIDEwOjM0OjI0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlL3NoYXBld2lwZS1leGFtcGxlLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMjYvMjldIHNoYXBld2lwZTogUHJpbnQgc29tZSBtb3JlIGRldGFpbHMgb24gZXJyb3Ivd2FybmluZyBtZXNzYWdlcworCisyMDEwLTAyLTA4IDA4OjI2OjMzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAyNS8yOV0gc2hhcGV3aXBlOiBJbXByb3ZlL2FkZCBkZWJ1ZyBvdXRwdXQKKworMjAxMC0wMi0wOCAwODoyMDo0NCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMjQvMjldIHNoYXBld2lwZTogQWx3YXlzIGhvbGQgdGhlIG1hc2sgbXV0ZXggYmVmb3JlIHNpZ25hbGxpbmcgdGhlIEdDb25kCisKKzIwMTAtMDItMDggMDg6MTk6NDggKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSAgW01PVkVEIEZST00gQkFEIDIzLzI5XSBzaGFwZXdpcGU6IE1vdmUgY2hhaW4gZnVuY3Rpb24gZXJyb3IgY2FzZXMgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24gYW5kIGFkZCB1c2VmdWwgZGVidWcgb3V0cHV0CisKKzIwMTAtMDItMDggMDg6MTI6MTEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAyMi8yOV0gc2hhcGV3aXBlOiBGaXggcmFjZSBjb25kaXRpb24gZHVyaW5nIHNodXRkb3duIHRoYXQgY2FuIGxlYWQgdG8gYSBkZWFkbG9jaworCisyMDEwLTAyLTA4IDA4OjExOjMzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAyMS8yOV0gc2hhcGV3aXBlOiBEcm9wIG1hc2sgYnVmZmVyIG9uIEZMVVNIIGV2ZW50cworCisyMDEwLTAyLTA4IDA4OjA5OjU1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMjAvMjldIHNoYXBld2lwZTogVXBkYXRlIGNvcHlyaWdodCB5ZWFyCisKKzIwMTAtMDItMDggMDg6MDg6NDQgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSAgW01PVkVEIEZST00gQkFEIDE5LzI5XSBzaGFwZXdpcGU6IERvbid0IHJlc2V0IHByb3BlcnRpZXMgd2hlbiBnb2luZyBQQVVTRUQtPlJFQURZCisJICBBbHNvIHVzZSBkZWZpbmVzIGZvciB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgdGhlIHByb3BlcnRpZXMuCisKKzIwMTAtMDEtMTYgMTY6NTI6MTEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSAgW01PVkVEIEZST00gQkFEIDE4LzI5XSBzaGFwZXdpcGU6IFJlcGxhY2UgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYyBpbiB0aGUgaW5uZXIgcHJvY2Vzc2luZyBsb29wcyBieSBpbnRlZ2VyIGFyaXRobWV0aWMKKworMjAwOS0xMi0xMCAxMDo0MDoxMCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTcvMjldIHNoYXBld2lwZTogRG9uJ3QgZG8gcG9pbnRlciBkZXJlZmVyZW5jZXMgaW4gdGhlIHByb2Nlc3NpbmcgbG9vcAorCSAgTG93ZXJzIHRoZSB0aW1lIHRha2VuIHRoZXJlIGluIG15IHRlc3RjYXNlIGZyb20gNi45MSUgdG8gNi4yMCUKKwkgIGFzIG1lYXN1cmVkIGJ5IGNhbGxncmluZC4KKworMjAwOS0wNy0wOCAxNzo1OToyOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTYvMjldIHNoYXBld2lwZTogQWRkIEJHUkEgc3VwcG9ydCBmb3IgdmlkZW8gaW4vb3V0cHV0CisKKzIwMDktMDctMDIgMTE6MjQ6NDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxNS8yOV0gc2hhcGV3aXBlOiBBZGQgc3VwcG9ydCBmb3IgQVJHQiB2aWRlbyBpbnB1dC9vdXRwdXQKKworMjAwOS0wNi0yMyAxODoyMzoxMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTQvMjldIHNoYXBld2lwZTogQ29ycmVjdGx5IGhhbmRsZSAwLzEgZnBzCisKKzIwMDktMDYtMDkgMTk6MTQ6NDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMy8yOV0gc2hhcGV3aXBlOiBJbXBsZW1lbnQgYmFzaWMgUW9TCisJICBUaGlzIGNoYW5nZSBpcyBiYXNlZCBvbiBUaW0ncyBRb1MgaW1wbGVtZW50YXRpb24KKwkgIGZvciBqcGVnZGVjLgorCisyMDA5LTA2LTA5IDE4OjQ1OjE5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMi8yOV0gc2hhcGV3aXBlOiBQcm94eSBxdWVyaWVzIG9uIHRoZSB2aWRlbyBwYWRzIHRvIHRoZSBjb3JyZWN0IHBlZXJzCisKKzIwMDktMDYtMDkgMTg6Mzc6NDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSAgW01PVkVEIEZST00gQkFEIDExLzI5XSBzaGFwZXdpcGU6IFByb3h5IGJ1ZmZlcmFsbG9jIG9uIHRoZSB2aWRlbyBzaW5rcGFkCisKKzIwMDktMDYtMDkgMTg6MjU6MTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSAgW01PVkVEIEZST00gQkFEIDEwLzI5XSBzaGFwZXdpcGU6IFRyeSB0byB3b3JrIGlucGxhY2UgaWYgcG9zc2libGUKKwkgIFRoaXMgc2F2ZXMgb25lIG5ldywgbGFyZ2UgYWxsb2NhdGlvbiBwZXIgZnJhbWUgZm9yIHRoZQorCSAgbW9zdCBjYXNlcy4KKworMjAwOS0wNi0wNCAwODo1NjoxNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NoYXBld2lwZS5jOgorCSAgW01PVkVEIEZST00gQkFEIDA5LzI5XSBzaGFwZXdpcGU6IEluY3JlYXNlIHRpbWVvdXQgb2YgdGhlIHVuaXQgdGVzdAorCisyMDA5LTA2LTAxIDIxOjI0OjI3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwOC8yOV0gc2hhcGV3aXBlOiBGaXggc29tZSBpc3N1ZXMgdGhhdCB3ZXJlIGV4cG9zZWQgYnkgdGhlIG5ldyB1bml0IHRlc3QKKworMjAwOS0wNi0wMSAyMToyNDoxMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NoYXBld2lwZS5jOgorCSAgW01PVkVEIEZST00gQkFEIDA3LzI5XSBzaGFwZXdpcGU6IEFkZCB1bml0IHRlc3QgZm9yIHNoYXBld2lwZQorCisyMDA5LTA1LTMxIDIxOjMzOjAxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNi8yOV0gc2hhcGV3aXBlOiBBZGQgZG9jdW1lbnRhdGlvbiBhbmQgaW50ZWdyYXRlIGludG8gdGhlIGJ1aWxkIHN5c3RlbQorCisyMDA5LTA1LTI5IDIxOjA3OjI2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNS8yOV0gc2hhcGV3aXBlOiBBZGp1c3QgYm9yZGVyIHRvIHN0aWxsIGhhdmUgZXZlcnl0aGluZyB0cmFuc3BhcmVudCBhdCAxLjAgYW5kIHRoZSBvdGhlciB3YXkgYXJvdW5kCisKKzIwMDktMDUtMjkgMTY6NTU6MjUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSogdGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlL3NoYXBld2lwZS1leGFtcGxlLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDQvMjldIHNoYXBld2lwZTogRGl2aWRlIHRoZSBib3JkZXIgdmFsdWUgYnkgdHdvLCBvdGhlcndpc2Ugd2UgdXNlIGEgdHdpY2UgYSB3aWRlIGJvcmRlcgorCisyMDA5LTA1LTI5IDE2OjUxOjUwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmg6CisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMy8yOV0gc2hhcGV3aXBlOiBBZGQgYm9yZGVyIHByb3BlcnR5IHRvIGFsbG93IHNtb290aCBib3JkZXJzCisJICAuLi5hbmQgdXNlIGEgYm9yZGVyIG9mIDAuMDEgaW4gdGhlIGV4YW1wbGUgYXBwbGljYXRpb24uCisKKzIwMDktMDUtMjkgMTY6MDA6MTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvTWFrZWZpbGUuYW06CisJICBbTU9WRUQgRlJPTSBCQUQgMDIvMjldIHNoYXBld2lwZTogRml4IE1ha2VmaWxlIG9mIHRoZSBleGFtcGxlIGFwcGxpY2F0aW9uCisKKzIwMDktMDUtMjkgMTU6MzI6MjQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL01ha2VmaWxlLmFtOgorCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmg6CisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMS8yOV0gc2hhcGV3aXBlOiBBZGQgYSBzaW1wbGUgc2hhcGV3aXBlIHRyYW5zaXRpb24gZmlsdGVyICYgZXhhbXBsZSBhcHBsaWNhdGlvbgorCisyMDEwLTAyLTA2IDE4OjE5OjI3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogT25seSBmbHVzaCB0aGUgRkxBQyBkZWNvZGVyIGlmIGl0IHdhc24ndCBjcmVhdGVkIHJpZ2h0IGJlZm9yZQorCSAgSWYgdGhlIEZMQUMgZGVjb2RlciBpcyBmbHVzaGVkLCBpdHMgc3RhdGUgd2lsbCBiZSBzZXQgdG8gZnJhbWUtc3luYyBtb2RlLAorCSAgd2hpY2ggd2lsbCBzeW5jIHRvIHRoZSBuZXh0ICphdWRpbyogZnJhbWUgYW5kIG1ha2VzIGl0IGlnbm9yZSBhbGwgaGVhZGVycy4KKwkgIFRoaXMgcHJldmVudGVkIHRhZ3MgYW5kIGV2ZXJ5dGhpbmcgZWxzZSB0byBzaG93IHVwIHdoZW4gdXNpbmcgZmxhY2RlYworCSAgaW4gcHVzaCBtb2RlLgorCSAgRml4ZXMgYnVnICM2MDg4NDMuCisKKzIwMTAtMDItMTEgMDE6MTI6MTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBNQUlOVEFJTkVSUzoKKwkgIFVwZGF0ZSBNQUlOVEFJTkVSUworCisyMDEwLTAyLTEyIDAwOjAzOjA5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBiYWNrIHRvIGRldmVsb3BtZW50CisJICBTbHVzaHkgZnJlZXplIHJlbWFpbnMgaW4gZWZmZWN0LgorCis9PT0gcmVsZWFzZSAwLjEwLjE4ID09PQorCisyMDEwLTAyLTEwIDIzOjE4OjIyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2FtbWEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb25vc2NvcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JhbGFuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAwLjEwLjE4CisKKzIwMTAtMDItMTAgMjM6MTc6MjEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisKKzIwMTAtMDItMTAgMjA6MzY6NTYgKzAwMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogdGVtcG9yYXJ5IHNhZmV0eSBjaGVjayB0byBhdm9pZCBjcmFzaGVzIHdpdGggYSBjZXJ0YWluIGZpbGUKKwkgIEFkZCB0ZW1wb3JhcnkgY2hlY2sgdG8gYXZvaWQgY3Jhc2hlcyB3aXRoIGEgY2VydGFpbiBmaWxlIHdoZW4gc2Vla2luZworCSAgdW50aWwgdGhlIHJlYWwgY2F1c2Ugb2YgdGhpcyBpcyBmaWd1cmVkIG91dC4gU2VlICM2MDk0MDUuCisKKzIwMTAtMDItMDUgMTg6MDU6MzkgKzAxMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSAgcXRkZW11eDogc2tpcCB1bmtub3duIGF0b21zIHdoZW4gbG9va2luZyBmb3IgbW9vdgorCSAgRml4ZXMgYnVnICM2MDkxMDcKKworMjAxMC0wMi0wNSAwMjoxMzozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIDAuMTAuMTcuMyBwcmUtcmVsZWFzZQorCisyMDEwLTAyLTA0IDE5OjEwOjM2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vYmcucG86CisJKiBwby9odS5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTAtMDItMDQgMTQ6NDY6NTYgKzAxMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSAgcXRkZW11eDogU2V0IHRoZSBzZWdtZW50IHN0YXJ0IHRpbWUgdG8gdGhlIHJlcXVlc3RlZCBzZWVrIHRpbWUgZm9yIG5vbi1rZXlmcmFtZSBzZWVrcworCisyMDEwLTAyLTA0IDEyOjAwOjAzICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCB0aW1lIHJldHVybmVkIGZvciBpbmRleCBhdCBhIGJ5dGUgb2Zmc2V0CisJICBUaGUgbG9naWMgZm9yIHNlYXJjaGluZyBmb3J3YXJkcy9iYWNrd2FyZHMgd2FzIHN3YXBwZWQKKworMjAxMC0wMi0wMSAxOToyMjoyNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSAgc3BlZXhkZWM6IGluaXRpYWxpemUgc3RlcmVvIGRlY29kaW5nIHN0YXRlCisKKzIwMTAtMDEtMjggMTg6NTg6MDggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGltcHJvdmUgc3RyZWFtIHN5bmNocm9uaXphdGlvbgorCSAgSW4gcGFydGljdWxhciwgZG8gbm90IG1ha2UgaXQgc2VuZCBuZXdzZWdtZW50IHVwZGF0ZXMgdGhhdAorCSAgc29ydC1vZiBjb250cmFkaWN0IHRoZSBpbmRlbnRlZCBwbGF5YmFjayBzZWdtZW50IChlLmcuIHN0YXJ0IHRpbWUpLgorCisyMDEwLTAxLTI4IDE4OjUzOjE4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBmaXggYnJpZGdpbmcgKHRpbWUpIGdhcHMgaW4gc3RyZWFtcworCSAgQXMgYSBzaWRlIGVmZmVjdCwgYXZvaWQgc2VuZGluZyBuZXdzZWdtZW50IHVwZGF0ZXMgd2l0aCBzdGFydCB0aW1lcworCSAgdGhhdCBnbyBiYWNrIGFuZCBmb3J0aCwgd2hpY2ggbGVhZHMgdG8gYm9ndXMgZG93bnN0cmVhbSBydW5uaW5nX3RpbWUuCisJICBBbHNvIGZpeGVzIHNlZWtpbmcgaW4gYnVnICM2MDY3NDQuCisKKzIwMTAtMDEtMjggMTg6NDk6NTcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGZpeCBzdHJlYW0gc3luY2hyb25pemF0aW9uCisJICAuLiBieSBpbml0aWFsaXppbmcgc3RyZWFtcyBzdGFydGluZyBhdCAwLCBhcyB0aGF0IGlzIGJhc2ljYWxseQorCSAgd2hlcmUgd2UgJ3NlZWsgdG8nIGF0IHRoZSBzdGFydCBhbmQgYXNzdW1lIHN0cmVhbXMgdG8gc3RhcnQgZWxzZXdoZXJlLgorCSAgQWxzbyBlbmFibGVzIG5ld3NlZ21lbnQgdXBkYXRlIGV2ZW50cyBmb3Igc3VidGl0bGUgc3RyZWFtcy4KKworMjAxMC0wMi0wMiAxMzo0MTowMyArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnOiBkb24ndCBkaXJlY3RseSBhY2Nlc3MgbWVzc2FnZSwgc29tZSBtZXNzYWdlIGhhdmUgYXJncworCSAgVGhpcyBjYXVzZWQgYm9ndXMgbWVzc2FnZXMsIHN1Y2ggYXMgcmVwb3J0ZWQgaW4gYnVnICM2MDc0NzEuCisKKzIwMTAtMDItMDIgMDA6MDI6MzQgKzAwMDAgIERhdmlkIEhveXQgPGRob3l0QGxsbmwuZ292PgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgcG5nOiBmaXggY29tcGlsYXRpb24gd2l0aCBsaWJwbmcgMS40CisJICBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQgZm9yIGEgd2hpbGUgYW5kIHdhcworCSAgZmluYWxseSByZW1vdmVkIGluIGxpYnBuZyAxLjQueC4gVXNlIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCgpCisJICBpbnN0ZWFkLgorCSAgRml4ZXMgIzYwODYyOS4KKworMjAxMC0wMi0wMSAxNjo0NjozNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZnJlZSB0cmFuc3BvcnRzIG9uIGVycm9ycworCSAgU2VlICM2MDg1NjQKKworMjAxMC0wMi0wMSAwOToxODo1MyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDI6IGZpeCB1bnBvcnRhYmxlIHByaW50ZiBmb3JtYXQKKworMjAxMC0wMS0zMCAxNToxODo0OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSAxNWQ0N2E2IHRvIDk2ZGM3OTMKKworMjAxMC0wMS0yNyAxNzo1MzowNyArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBpbmRleCB0aW1lc3RhbXBzIHNob3VsZCBiZSBpbiBzZWNvbmRzLCBub3QgbWlsbGlzZWNvbmRzCisKKzIwMTAtMDEtMjcgMTU6MjQ6NTIgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkgIHNwZWV4ZGVjOiBmcmVlIHNvbWUgbW9yZSB3aGVuIHJlc2V0dGluZworCSAgRml4ZXMgIzYwODI1NS4KKworMjAxMC0wMS0yNyAxNToyNDoyNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkgIHJ0cHNwZWV4cGF5OiBmaXggb2NjYXNpb25hbCBidWZmZXIgbGVhaworCSAgRml4ZXMgIzYwODI1NS4KKworMjAxMC0wMS0yNyAxNToyMjo0NiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgc3BlZXhlbmM6IHByZXZlbnQgaW52YWxpZCBhcml0aG1ldGljIGlmIG5vdCBzZXR1cCB5ZXQKKwkgIEZpeGVzICM2MDgyNTUuCisKKzIwMTAtMDEtMjcgMTY6MzQ6MjEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9tbXguaDoKKwkgIHZpZGVvbWl4ZXI6IEZpeCBhc3NlbWJseSByZWdpc3RlciBjb25zdHJhaW50cworCSAgRml4ZXMgYnVnICM2MDgyMDkuCisKKzIwMTAtMDEtMjcgMDE6NTY6MDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjE3LjIgcHJlLXJlbGVhc2UKKworMjAxMC0wMS0yNyAwMTo1Mjo1OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL0xJTkdVQVM6CisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBwbzogdXBkYXRlIHRyYW5zbGF0aW9ucworCisyMDEwLTAxLTI3IDAxOjQ5OjQ5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkgIGNoZWNrczogaWdub3JlIGRlaW50ZXJsYWNlIGNoZWNrIGJpbmFyeQorCisyMDEwLTAxLTI3IDAxOjE4OjUxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBwdXJnZSBhbGwgbWVudGlvbiBvZiBDVlMKKworMjAxMC0wMS0yNiAxMToxODoyOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGlnbm9yZSBzdHJlYW1zIHRoYXQgZmluaXNoZWQKKwkgIFdoZW4gd2UgcmVjZWl2ZSBhbiBVTkVYUEVDVEVEIGZyb20gYSBzdHJlYW0sIG1vdmUgdG8gdGhlIG5leHQgc3RyZWFtIGFuZCBvbmx5IGdvCisJICBFT1Mgd2hlbiBhbGwgc3RyZWFtcyBhcmUgRU9TLiBXaGVuIHNlbGVjdGluZyBhIHN0cmVhbSB0byBwdXNoLCBpZ25vcmUgc3RyZWFtcworCSAgdGhhdCB3ZW50IEVPUy4KKwkgIEZpeGVzICM2MDc5NDkKKworMjAxMC0wMS0yNSAxNzoyMzo0MyArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICB2NGwyc3JjOiBkb24ndCBkZXJlZiBOVUxMCisJICBFcnJvciBvdXQgd2hlbiB0aGUgcG9vbCBnZXRzIHNodXRkb3duLgorCisyMDEwLTAxLTI1IDE3OjIxOjEzICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgUmV2ZXJ0ICJ2NGwyc3JjOiBkb24ndCBkZXJlZiBOVUxMIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCAzZDlkMzRiZDYwZmFlYjk0MGIzNmQ5OTJhNDcxNjhmYzg5NTAzNmJhLgorCisyMDEwLTAxLTI1IDE0OjE2OjIyICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgdjRsMnNyYzogZG9uJ3QgZGVyZWYgTlVMTAorCSAgRXJyb3Igb3V0IHdoZW4gdGhlIHBvb2wgZ2V0cyBzaHV0ZG93bi4KKworMjAxMC0wMS0yMyAxNTozMjo0OCAtMDgwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJICBqcGVnZW5jOiB3aGVuIGNyZWF0aW5nIGFuIG92ZXJmbG93IGJ1ZmZlciwgY29weSB0aW1lc3RhbXBzLgorCisyMDEwLTAxLTIzIDE0OjQ3OjU1ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBkbWIxIGlzIGEgdmFsaWQgZm91cmNjIGZvciBNb3Rpb24tSlBFRworCisyMDEwLTAxLTIzIDE0OjIwOjAyICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRldXg6IElWMzIgaXMgYWxzbyB1c2VkIGZvciBJbmRlbyAzIHZpZGVvIHN0cmVhbXMKKworMjAxMC0wMS0yMiAxNjo0ODowMSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9pY2xlcy94aW1hZ2VzcmMtdGVzdC5jOgorCSAgYnVpbGQ6IG5vIHVudXNlZCB2YXJpYWJsZXMgd2hlbiBkaXNhYmxpbmcgYXNzZXJ0cworCisyMDEwLTAxLTIxIDIzOjE3OjQwIC0wMzAwICBSb2xhbmQgS3Jpa2F2YSA8cmtyaWthdmFAZ21haWwuY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBBdm9pZCBuZWdhdGl2ZSBvdmVyZmxvdyBvbiBrZXlmcmFtZSBzZWFyY2gKKwkgIERvIG5vdCBvdmVyZmxvdyBuZWdhdGl2ZWx5IHdoZW4gc2VhcmNoaW5nIGEgcHJldmlvdXMKKwkgICJrZXlmcmFtZSIgb24gYXVkaW8gc3RyZWFtcy4gQ291bGQgY2F1c2UgaW5maW5pdGUgbG9vcHMKKwkgIG9uIGJhY2t3YXJkcyBwbGF5YmFjaworCSAgRml4ZXMgIzYwNzcxOAorCisyMDEwLTAxLTIxIDE3OjIyOjM4IC0wODAwICBQZXRlciB2YW4gSGFyZGVuYmVyZyA8cHZoQHNvbmdiaXJkbmVzdC5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuaDoKKwkgIGpwZWdlbmM6IGVubGFyZ2UgYnVmZmVyIGlmIGxpYmpwZWcgdGVsbHMgdXMgaXQncyBvdXQgb2Ygc3BhY2UuIEZpeGVzIGJ1ZmZlciBvdmVyZmxvdyBvbiBzb21lIGhpZ2gtcXVhbGl0eSwgbG93LXJlc29sdXRpb24ganBlZyBlbmNvZGVzLgorCisyMDEwLTAxLTIxIDE5OjI0OjIyICswMTAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IGNvbXBpbGVyIHdhcm5pbmdzIHVuZGVyIE9TIFguCisKKzIwMTAtMDEtMjEgMTc6NTc6MzYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBkb24ndCBwYXJzZSBOVUxMIGluZGV4ZXMKKwkgIGZvciBzb21lIHN0cmVhbXMgd2UgbWlnaHQgZmFpbCB0byBmZXRjaCB0aGUgaW5kZXggb2Zmc2V0cy4gRG9uJ3QgdHJ5IHRvIHBhcnNlCisJICBOVUxMIGluZGV4ZXMgaW4gdGhvc2UgY2FzZXMuCisKKzIwMTAtMDEtMTggMjE6MTU6NTEgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6CisJICBydHBnNzI5cGF5OiBwdGltZSBzaG91bGQgaXMgaW4gbmFub3NlY29uZHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MDc0MDMKKworMjAxMC0wMS0yMCAxNToxMToxNSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5oOgorCSAgd2F2ZW5jOiBQb3N0IHdhcm5pbmcgaWYgZmlsZSBpc250IGZpbmlzaGVkIHByb3Blcmx5CisJICBXaGVuIHRoZSBwaXBlbGluZSBpcyBzaHV0IGRvd24gYW5kIHRoZSBmaWxlIGlzbid0CisJICBmaW5pc2hlZCBwcm9wZXJseSwgd2F2ZW5jIHNob3VsZCBwb3N0IGEgd2FybmluZy4KKwkgIEZpeGVzICM2MDc0NDAKKworMjAwOS0wNS0yNyAxMzo1MTo0NCArMDIwMCAgQXJub3V0IFZhbmRlY2FwcGVsbGUgPGFybm91dEBtaW5kLmJlPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJICBtYXRyb3NrYW11eDogbWFrZSBpbmRleCBzaXplIGNvbmZpZ3VyYWJsZS4KKwkgIEFkZGVkIHRoZSAnbWluLWluZGV4LWludGVydmFsJyBwcm9wZXJ0eSB0byBtYXRyb3NrYW11eCwKKwkgIHdoaWNoIGRldGVybWluZXMgaG93IG11Y2ggdGltZSAobmFub3NlY29uZHMpIGlzIGxlZnQKKwkgIGJldHdlZW4ga2V5ZnJhbWVzIHN0b3JlZCBpbiB0aGUgaW5kZXguCisJICBGaXhlcyAjNTgzOTg1LgorCisyMDEwLTAxLTIwIDE2OjI4OjMxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IHNjYWxlIHNwc3Bwc19pbnRlcnZhbCB0byBtaWxsaXNlY29uZHMKKwkgIFRoZSBzcHNwcHNfaW50ZXJ2YWwgaXMga2VwdCBpbiBzZWNvbmRzLiBDb252ZXJ0IGl0IHRvIG1pbGxpc2Vjb25kcyBiZWZvcmUKKwkgIGNvbXBhcmluZyBpdCB0byBhbm90aGVyIHZhbHVlIGluIG1pbGxpc2Vjb25kcy4KKworMjAxMC0wMS0yMCAxNToxODo0NyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFsd2F5cyBrZWVwIG1lZGlhIHNlZ21lbnRzIHdpdGhpbiB0b3RhbCBkdXJhdGlvbgorCSAgLi4uIGFzIG9wcG9zZWQgdG8gb25seSBkb2luZyBzbyBmb2xsb3dpbmcgYSBzZWVrLgorCisyMDEwLTAxLTIwIDE1OjQ0OjQwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IHJlbmFtZSBzcHNwcHMtaW50ZXJ2YWwgcHJvcGVydHkKKwkgIFJlbmFtZSB0aGUgc3BzcHBzLWludGVydmFsIHByb3BlcnR5IHRvIGNvbmZpZy1pbnRlcnZhbCBiZWNhdXNlIGl0IGlzIG5pY2VyLgorCisyMDEwLTAxLTE5IDE4OjM3OjMxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogc2tpcCBSSUZGIGFuZCBpbmRleCBpbiBwdXNoIG1vZGUKKwkgIFdoZW4gd2UgYXJlIGluIHB1c2ggbW9kZSwgd2UgY2FuIGVuY291bnRlciBSSUZGIGFuZCBpZHggdGFncyBpbiB0aGUgZGF0YSBjaHVuaworCSAgd2hlbiB3ZSBhcmUgZGVhbGluZyB3aXRoIE9ETUwgZmlsZXMuIEluIHRoZXNlIGNhc2VzLCBzaW1wbHkgc2tpcCB0aGUgY2h1bmtzIGFuZAorCSAgY29udGludWUgc3RyZWFtaW5nIGluc3RlYWQgb2YgZ29pbmcgRU9TLgorCisyMDEwLTAxLTIwIDExOjI3OjIzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogbW9yZSBESVNDT05UIGhhbmRsaW5nCisJICBBZGQgc29tZSBkZWJ1ZyBpbiB0aGUgRElTQ09OVCBoYW5kbGluZyBjb2RlLgorCSAgV2hlbiB3ZSByZWNlaXZlIGEgRElTQ09OVCBpbiBwdXNoIG1vZGUsIG1hcmsgYWxsIHN0cmVhbXMgYXMgRElTQ09OVC4KKworMjAxMC0wMS0yMCAxMToyNjozNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHJlc2V0IG9uIGZsdXNoIGV2ZW50cworCSAgV2hlbiB3ZSByZWNlaXZlIGEgZmx1c2ggZXZlbnQgb24gdGhlIHNpbmtwYWQsIHJlc2V0IHRoZSBFT1Mgc3RhdGUgYW5kIHRoZQorCSAgZmxvd3JldHVybiBvZiBhbGwgc3RyZWFtcy4gQWxzbyBtYXJrIHRoZSBzdHJlYW1zIHdpdGggYSBESVNDT05ULgorCisyMDEwLTAxLTIwIDExOjIyOjA0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogcmVuYW1lIHNvbWUgdmFyaWFibGUKKwkgIFJlbmFtZSB0aGUgc2Vla19ldmVudCB2YXJpYWJsZSB0byBzZWdfZXZlbnQgYmVjYXVzZSBpdCByZWFsbHkgY29udGFpbnMgdGhlCisJICBuZXdzZWdtZW50IGV2ZW50IHRoYXQgbmVlZHMgdG8gYmUgcHVzaGVkLgorCisyMDEwLTAxLTIwIDAwOjU0OjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDE0Y2VjODkgdG8gMTVkNDdhNgorCisyMDEwLTAxLTE4IDE0OjQ5OjI2IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJICBydHBoMjY0cGF5OiBEb24ndCBzZXQgcHJvZmlsZS1sZXZlbC1pZCBpbiBvdXQgY2FwcworCSAgVGhlIHByb2ZpbGUtbGV2ZWwtaWQgcmVwcmVzZW50cyByZXN0cmljdGlvbnMgb24gd2hhdCBjYW4gYmUgc2VudCwgaXQgZG9lcyBub3QKKwkgIGRlc2NyaWJlIHRoZSBzdHJlYW0uIFNvIGl0IHNob3VsZCBiZSByZWZsZWN0ZWQgaW4gdGhlIHNpbmsgY2FwcyBvZiB0aGUKKwkgIHBheWxvYWRlciwgbm90IHRoZSBzcmMgY2Fwcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MDczNTMKKworMjAxMC0wMS0xOCAxNDo0MToxMCAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIGZyb20gc2V0X291dGNhcHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MDczNTMKKworMjAxMC0wMS0xOCAxNzo0Mzo0MSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aG1hY3Jvcy5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyYmxlbmQuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZWJmZi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZXRmZi5jOgorCSAgZGVpbnRlcmxhY2U6IEZpeCBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgaGVhZGVycworCisyMDEwLTAxLTE4IDE0OjU3OjQyICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJICB2NGwyOiBtb3ZlIEdfRU5EX0RFQ0xTIHRvIHRoZSBlbmQKKworMjAxMC0wMS0xOCAxNDo1NTozOCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkgIHY0bDI6IGZpeCBidWZmZXJwb29sIGZpbGUgbmFtZXMgaW4gaGVhZGVyIGNvbW1lbnQKKworMjAxMC0wMS0xNSAxODoxNToxNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGF2b2lkIHNvbWUgdHlwZWNhc3RpbmcKKworMjAxMC0wMS0xNSAxODoxMzoyNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGF2b2lkIHNvbWUgdHlwZSBjaGVja3MKKworMjAxMC0wMS0xNSAxODowOToxNSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgYXZpZGVtdXg6IGZhbGxiYWNrIHRvIGF2aWggZHVyYXRpb24KKwkgIHdoZW4gd2UgaGF2ZSBub3QgeWV0IHBhcnNlZCB0aGUgaW5kZXhlcyAoaW4gcHVzaCBtb2RlLCBmb3IgZXhhbXBsZSkgdXNlCisJICB0aGUgZHVyYXRpb24gYXMgZ2l2ZW4gaW4gdGhlIGF2aWggaGVhZGVyIGluc3RlYWQgb2YgLTEuCisKKzIwMTAtMDEtMTUgMTM6MzI6MzIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBnX2ZyZWUgaXMgTlVMTCBzYWZlCisKKzIwMTAtMDEtMTUgMTM6Mjc6NDAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiB1c2UgREVNVVggZXJyb3JzLCBpbnN0ZWFkIG9mIERFQ09ERQorCSAgcXRkZW11eCBzaG91bGQgdXNlIERFTVVYIGVycm9ycywgYW5kIG5vdCBERUNPREUKKwkgIENvbmZsaWN0czoKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYworCisyMDEwLTAxLTE0IDE5OjE2OjE5IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogTWlub3IgcmVmYWN0b3IKKwkgIFJlcGxhY2UgcmVwZWF0ZWQgY29kZSB3aXRoIGEgZnVuY3Rpb24gY2FsbAorCisyMDEwLTAxLTE0IDE3OjExOjEzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkgIHF0ZGVtdXg6IEhhbmRsZSBhbm90aGVyIGtpbmQgb2YgcmVkaXJlY3QgdHJhaworCSAgU29tZSB0cmFrcyBtaWdodCBjb250YWluIGEgcmVkaXJlY3QgcnRzcCB1cmkgaW5zaWRlCisJICBobmRsIGF0b20gKHdoaWNoIGlzIGEgZHJlZiBhdG9tIGVudHJ5KS4gVGhpcyBjb21taXQgbWFrZXMgcXRkZW11eAorCSAgcG9zdCBhIG1lc3NhZ2Ugd2hlbiBpdCBmaW5kcyBvbmUgb2YgdGhlc2UgdHJha3MgYW5kIHRoZXJlIGFyZQorCSAgbm8gb3RoZXIgdHJha3MuCisJICBGaXhlcyAjNTk3NDk3CisKKzIwMTAtMDEtMTQgMTY6MTM6MDggLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJICBxdGRlbXV4OiBQb3N0IGVycm9yIHdoZW4gcmVhY2hpbmcgRU9TIHdpdGhvdXQgcGFkcworCSAgUG9zdCBhbiBlcnJvciB3aGVuIEVPUyBpcyByZWFjaGVkIGFuZCB0aGVyZSBhcmUgbm8gc3JjIHBhZHMKKworMjAxMC0wMS0xNCAxNDoxMzo1MCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IERvIG5vdCBwb3N0IGVtcHR5IHJlZGlyZWN0IG1lc3NhZ2VzCisJICBTb21lIG1pc2ludGVycHJldGVkIGRhdGEgY291bGQgcmVzdWx0IGluIHBvc3RpbmcgcmVkaXJlY3QgbWVzc2FnZXMKKwkgIHdpdGggZW1wdHkgcmVkaXJlY3Qgc3RyaW5ncy4gSXQgaXMgYmV0dGVyIG5vdCB0byBwb3N0IHRoZW0uCisJICBBbiBleGFtcGxlIGlzIHRoZSBmaWxlIG9uIGJ1ZyAjNTk3NDk3CisKKzIwMTAtMDEtMTQgMTg6MTk6MjUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IHBvbGlzaCBsYXN0IGJ1ZmZlciBlbmQgdGltZSB1c2FnZQorCSAgVGhhdCBpcywgcmVzZXQgaXQgdXBvbiBzZWVrLCBhbmQgbm90ZSB0aGF0IChyYXJlbHkpIGxhc3QgcHVzaGVkIGJ1ZmZlcgorCSAgdGltZSBtaWdodCBwcmVjZWRlIHNlZ21lbnQgc3RhcnQuCisKKzIwMTAtMDEtMTMgMTY6NDg6NDYgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfbW14Lmg6CisJICB2aWRlb21peGVyOiB1c2UgJ3EnIGNvbnN0cmFpbnQgaW5zdGVhZCBvZiAncicKKwkgIFRoaXMgYXZvaWRzIHRoZSAiYmFkIHJlZ2lzdGVyIG5hbWUgYCVkaWwnIiBjb21waWxhdGlvbiBlcnJvcnMgb24gMzJiaXQgd2hlcmUKKwkgIGJlY2F1c2Ugb2YgJ3InIGdjYyBwdXRzIHRoZSB2YWx1ZSBpbiBhIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBhbmQgdGhlbiB0cmllcworCSAgdG8gYWNjZXNzIHRoZSBsb3dlciBwYXJ0IGFzICVkaWwvJXNpbCB3aGljaCBpcyBub3QgZXhpc3Rpbmcgb24gMzJiaXQuICdxJyByZXF1ZXN0cworCSAgYS1kIHJlZ2lzdGVycworCisyMDEwLTAxLTEzIDE2OjQ0OjU4ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aTogYWRkIG1pc3NpbmcgaW5jbHVkZSBmb3Igc3NjYW5mCisKKzIwMTAtMDEtMTMgMDk6MzY6MDMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjEwYmFuZHMuYzoKKwkgIGVxdWFsaXplcjogRml4IHByb3BlcnR5IGRlc2NyaXB0aW9uIGZvciB0aGUgM3JkIGJhbmQgb2YgdGhlIDEwYmFuZCBlcXVhbGl6ZXIKKwkgIFRoZSBmcmVxdWVuY3kgaXMgYWN0dWFsbHkgMjM3IEh6LCBub3QgMjI3IEh6LgorCSAgRml4ZXMgYnVnICM2MDY2OTIuCisKKzIwMTAtMDEtMTMgMDk6MjI6MjAgKzAxMDAgIEtpcHAgQ2Fubm9uIDxrY2Fubm9uQGxpZ28uY2FsdGVjaC5lZHU+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jOgorCSAgYXVkaW9hbXBsaWZ5OiBBbGxvdyBuZWdhdGl2ZSBhbXBsaWZpY2F0aW9ucworCSAgRml4ZXMgYnVnICM2MDY4MDcuCisKKzIwMTAtMDEtMTMgMDk6MTc6MDUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdGFnbGliL2dzdGFwZXYybXV4LmNjOgorCSAgYXBldjJtdXg6IERvbid0IGNhbGwgY29uc3RydWN0b3JzIGRpcmVjdGx5LCB0aGlzIGxlYWRzIHRvIGNvbXBpbGVyIGVycm9ycyB3aXRoIGdjYyA0LjUKKworMjAxMC0wMS0xMiAxNzozOTowNSArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogdXNlIEdfR1NJWkVfRk9STUFUIGZvciBwbGF0Zm9ybSBpbmRlcGVuZGVudCBnc2l6ZSBxdWFsaWZpZXIKKwkgIEZpeGVzIGJ1aWxkIG9uIG1hY29zeAorCisyMDEwLTAxLTExIDE5OjAyOjM0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiByZWZhY3RvciBlb3Mgc2VuZGluZyB3aGVuIHBhdXNpbmcgbG9vcAorCSAgQWxzbywgcHJldmVudCBoYW5naW5nIGlmIG5vIHBhZHMgeWV0IG9uIHdoaWNoIHRvIHNlbmQgZW9zIGJ5CisJICBwb3N0aW5nIGEgbWVzc2FnZSBpbnN0ZWFkLgorCisyMDEwLTAxLTExIDE3OjUwOjM1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBzdGFuZGFyZGl6ZSBzZWVrIGhhbmRsaW5nCisJICAuLi4gd2hpY2ggaW1wbGllcyBmaXhpbmcgc29tZSBjb3JuZXIgY2FzZXMuCisKKzIwMTAtMDEtMTEgMTU6MTQ6MDYgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogdXNlIG1vcmUgZ2VuZXJpYyB4aXBoTl9zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIGhlbHBlcgorCisyMDEwLTAxLTExIDE3OjUwOjA0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHJlZmxvdyBhdWRpbyBhbmQgdmlkZW8gc2V0Y2FwcyBhbmQgaW1wcm92ZSBsb2dnaW5nCisJICBBbHNvIGVuc3VyZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBhdmFpbGFibGUgYXMgdGhleSBhcmUgbWFuZGF0b3J5CisJICBpbiBtYXRyb3NrYSBzcGVjcy4KKworMjAxMC0wMS0xMSAxMTo0Mjo0MyAtMDgwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHNvbmdiaXJkbmVzdC5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBvZmZzZXQgZm9yIHR5cGUgMiBtcDRhIHNvdW5kIHNhbXBsZSBkZXNjcmlwdGlvbnMuCisJICBBbGxvd3MgdXMgdG8gY29ycmVjdGx5IGZpbmQgdGhlIGVzZHMgKGFuZCB0aHVzIHRoZSBjb2RlYyBkYXRhKSBmb3Igc3VjaAorCSAgbXA0YSBmaWxlcy4KKworMjAxMC0wMS0xMSAxNTo0NTo0OSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkgIHJ0cG1wNGcoZGUpcGF5OiBPbmx5IGhhbmRsZSByYXcgYWFjCisJICBydHBtcDRnKGRlKXBheSBzaG91bGQgb25seSBoYW5kbGUgcmF3IEFBQyBzdHJlYW1zCisKKzIwMTAtMDEtMTEgMTg6NTk6NDMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmg6CisJICB2aWRlb21peGVyOiBJbXBsZW1lbnQgYmFzaWMgUW9TCisJICBUaGlzIGRyb3BzIGZyYW1lcyBpZiB0aGV5J3JlIHRvbyBsYXRlIGFueXdheSBiZWZvcmUgYmxlbmRpbmcgYW5kIGFsbAorCSAgdGhhdCBzdGFydHMgYnV0IFFvUyBldmVudHMgYXJlIG5vdCBmb3J3YXJkZWQgdXBzdHJlYW0uIEluIHRoZSBmdXR1cmUKKwkgIHRoZSBRb1MgZXZlbnRzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBzb21laG93IGFuZCBmb3J3YXJkZWQgdXBzdHJlYW0uCisKKzIwMTAtMDEtMTEgMTQ6NDg6MjYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJICBydHBtcDRhKGRlKXBheTogT25seSBhY2NlcHQgcmF3IGFhYworCSAgcnRwbXA0YShkZSlwYXkgc2hvdWxkIG9ubHkgaGFuZGxlIHJhdyBhYWMgdG8gY29uZm9ybSB0byB0aGUgUkZDCisKKzIwMTAtMDEtMTEgMTg6MzU6NDcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfbW14Lmg6CisJICB2aWRlb21peGVyOiBBZGQgTU1YIGltcGxlbWVudGF0aW9ucyBmb3IgSTQyMCBhbmQgYWxsIG5vbi1hbHBoYSBSR0IgZm9ybWF0cworCisyMDEwLTAxLTA0IDEwOjI0OjQ1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuaDoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2F5dXYuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2JncmEuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2k0MjAuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX21teC5oOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfcmdiLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmg6CisJICB2aWRlb21peGVyOiBSZWZhY3RvciBwcm9jZXNzaW5nIGZ1bmN0aW9ucworCSAgVGhpcyBhbGxvd3MgZWFzaWVyIHBsdWdnaW5nIG9mIG9wdGltaXplZCBwcm9jZXNzaW5nIGZ1bmN0aW9ucworCSAgaW4gdGhlIGZ1dHVyZSwgbGlrZSBmb3IgU1NFIG9yIEFsdGlWZWMuCisKKzIwMTAtMDEtMTEgMTM6MjY6MzIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgYXZpbXV4OiBtYXRyb3NrYW11eDogcmVuYW1lIGFhYydzIHN0cmVhbS1mb3JtYXQgdG8gcmF3CisJICBBQUMncyBub25lIHN0cmVhbS1mb3JtYXQgaGFzIGJlZW4gcmVuYW1lZCB0byByYXcsIHJlbmFtZQorCSAgb24gYXZpbXV4IGFuZCBtYXRyb3NrYW11eCBhcyB3ZWxsCisKKzIwMTAtMDEtMTEgMTI6MDc6MjkgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogT25seSBhY2NlcHQgcmF3IGFhYworCSAgbWFrZXMgbWF0cm9za2FtdXggcmVqZWN0IGFhYyBzdHJlYW1zIHRoYXQgYXJlIG5vdAorCSAgaW4gcmF3IGZvcm1hdCAoc3RyZWFtLWZvcm1hdD1ub25lKQorCSAgRml4ZXMgIzU5ODM1MAorCisyMDEwLTAxLTExIDEyOjA4OjU1IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogT25seSBhY2NlcHQgcmF3IGFhYworCSAgbWFrZXMgYXZpbXV4IHJlamVjdCBhYWMgc3RyZWFtcyB0aGF0IGFyZSBub3QKKwkgIGluIHJhdyBmb3JtYXQgKHN0cmVhbS1mb3JtYXQ9bm9uZSkKKwkgIEZpeGVzICM1OTgzNTAKKworMjAxMC0wMS0xMSAxMDozODoxMCArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBPb3BzLiBUaGUgZ3BvaW50ZXIgY2FzdCBpcyBuZWVkZWQgYmVjYXVzZSBvZiB0aGUgY29uc3QgcXVhbGlmaWVycyBvbiB0aGUgZGF0YSBlbGVtZW50cworCisyMDEwLTAxLTExIDEwOjE3OjU0ICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IERlYnVnIC0+IGluZm8gbGV2ZWwgZm9yIGEgbWVzc2FnZSBmb3IgYmVuY2htYXJraW5nIGluZGV4IHBhcnNpbmcKKwkgIFRoZSBleHRyYSBtZXNzYWdlIG91dHB1dCBhdCBoaWdoZXIgbGV2ZWxzIGFmZmVjdHMgdGhlIGFjY3VyYWN5IG9mIHRoZQorCSAgYmVuY2htYXJrLgorCisyMDEwLTAxLTExIDEwOjA1OjEwICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IERvbid0IGNoZWNrIGZvciBOVUxMIHBvaW50ZXJzIG9yIGNhc3QgdG8gZ3BvaW50ZXIgYXMgdGhpcyBpcyBub3QgbmVlZGVkCisKKzIwMTAtMDEtMDggMTM6NTU6MDUgKzAxMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogUmVmYWN0b3Igc3RibCBzdWItYXRvbSBmcmVlaW5nLiBGcmVlIHdoZW4gaW5kZXggaGFzIGJlZW4gY29tcGxldGVseSBwYXJzZWQuCisKKzIwMTAtMDEtMDggMTQ6MzI6MDYgKzAxMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQXZvaWQgd2hpdGVzcGFjZSBjb21taXRzIGR1ZSB0byBpbmNvbnNpc3RlbnQgR05VIGluZGVudCBiZWhhdmlvdXIKKworMjAxMC0wMS0xMSAwMDoxMDozNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJlbW92ZSBuZXdsaW5lIGF0IGVuZCBvZiBkZWJ1ZyBzdGF0ZW1lbnQKKworMjAxMC0wMS0wOCAxOToyNjoyMSArMDEwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAdGFuZGJlcmcuY29tPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgbXVsdGl1ZHBzaW5rOiBDb21waWxlciB3YXJuaW5nIGZpeGVzIGZvciBXaW5kb3dzCisJICBKdXN0IHNpbXBsZSBtaXNzaW5nIGNhc3RzCisJICBGaXhlcyBidWcgIzYwNjQzOC4KKworMjAxMC0wMS0wOCAxODowNDoxNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IGZpeCBzZWVrcG9pbnRzIHByb3BlcnR5IGNvcHktYW5kLXBhc3RlIGRvY3VtZW50YXRpb24KKworMjAxMC0wMS0wNiAxNzowNjo1MyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuaDoKKwkgIGZsYWNlbmM6IG9wdGlvbmFsbHkgYWRkIGEgc2VlayB0YWJsZQorCSAgQVBJOiBHc3RGbGFjRW5jOnNlZWtwb2ludHMKKwkgIEZpeGVzICMzNTE1OTUuCisKKzIwMTAtMDEtMDggMTE6MzM6MDIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogVXNlIG1vcmUgZ2xpYiBhbmQgYmUgc2FmZXIKKwkgIEJlIHNhZmVyIG9uIHNzY2FuZiBieSBsaW1pdGluZyBzdHJpbmcgZm9ybWF0IHNpemVzLgorCSAgUmVtb3ZlIHVzZWxlc3MgcGFyYW1ldGVyIGFuZCB1c2UgZ19zdHJuZHVwLgorCisyMDEwLTAxLTA4IDEwOjQ0OjQ0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IFNpbXBsaWZ5aW5nIGNvZGUKKwkgIEdyZWF0bHkgc2ltcGxpZnkgdGhlIElESVQgY2h1bmsgaGFuZGxpbmcgYnkgdXNpbmcgc3NjYW5mCisJICBpbnN0ZWFkIG9mICdtYW51YWxseScgcGFyc2luZy4gQWxzbyByZXBsYWNlcyBzdHJuY2FzZWNtcCBhbmQKKwkgIGlzX2FscGhhL2lzX2RpZ2l0IHdpdGggZ2xpYiB2ZXJzaW9ucy4KKworMjAxMC0wMS0wOCAxMDoxODozMCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBpdCdzIGZlYiBmb3IgZmVicnVhcnkKKwkgIEZpeCB0eXBvIGluIGxhc3QgY29tbWl0LgorCisyMDEwLTAxLTA4IDA5OjE3OjIyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IFBhcnNlIGFuZCBwb3N0IElESVQgZGF0ZXMKKwkgIFBhcnNlcyBhbmQgcG9zdCBkYXRlIHRhZ3MgY29udGFpbmVkIGluIElESVQgY2h1bmtzLgorCSAgRml4ZXMgIzUwMzU4MgorCisyMDEwLTAxLTA3IDE3OjI1OjA1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9maXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5oOgorCSAgYXVkaW9meGJhc2VmaXJmaWx0ZXI6IEFkZCBwcm9wZXJ0eSBmb3Igbm90IGRyYWluaW5nIHRoZSBoaXN0b3J5IG9uIGtlcm5lbCBjaGFuZ2VzCisJICBDdXJyZW50bHkgdGhpcyBvbmx5IHdvcmtzIGlmIHRoZSBrZXJuZWwgc2l6ZSBkb2Vzbid0IGNoYW5nZSwgaW4gdGhlIGZ1dHVyZQorCSAgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIGtlcm5lbCBzaXplIHRvbyB3aXRob3V0IGRyYWluaW5nCisJICB0aGUgY29tcGxldGUgaGlzdG9yeSBhbmQgd2l0aG91dCBsb29zaW5nIGFueXRoaW5nLgorCSAgUGFydGlhbGx5IGJhc2VkIG9uIGEgcGF0Y2ggYnkKKwkgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisyMDEwLTAxLTA3IDE2OjU4OjU1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IHJlbW92ZSB3ZWlyZCBtZW1jbXAgY29kZQorCSAgVXNlIHBsYWluIG1lbWNtcCBmb3IgY29tcGFyaW5nIG1lbW9yeSBpbnN0ZWFkIG9mIHRoZSBjdXN0b20gYnVnZ3kgb25lLgorCSAgRml4ZXMgIzYwNjE5OAorCisyMDEwLTAxLTA3IDE1OjM4OjM2ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIGxldmVsOiBmaXggdHlwbyBpbiAnbWVzc2FnZScgcHJvcGVydHkgZGVzY3JpcHRpb24KKworMjAxMC0wMS0wNiAxNDowNjoxNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGZsYWNkZWM6IHJlYWxseSB1c2UgdXBzdHJlYW0gdGltZXN0YW1wIGlmIHRoZXJlIGlzIG9uZQorCSAgU2VlL2ZpeGVzICM2MDM0NzEuCisKKzIwMTAtMDEtMDYgMTM6NDU6NTkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSAgcnRwZzcyOHBheTogcmVtb3ZlIHVudXNlZCBhZGFwdGVyIHBlZWsKKworMjAxMC0wMS0wNSAxOTowMDozNSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogSW1wcm92ZSBwYXNzdGhyb3VnaCB0ZXN0cworCSAgSW1wcm92ZSBwYXNzdGhyb3VnaCB0ZXN0cyBieSBmb3JjaW5nIG1vcmUgc3BlY2lmaWMKKwkgIGludGVybGFjZWQvZGVpbnRlcmxhY2VkIGNhcHMgdG8gYmUgdGVzdGVkCisKKzIwMTAtMDEtMDUgMTg6MjI6NDkgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IEFkZHMgc29tZSBkb2NzIHRvIHRoZSBuZXcgdGVzdHMKKwkgIEFkZHMgc29tZSBkb2NzIGV4cGxhaW5pbmcgdGhlIHV0aWxpdHkgZnVuY3Rpb25zIG9mIHRoZSBjaGVjaworCSAgdGVzdHMgb2YgZGVpbnRlcmxhY2UKKworMjAxMC0wMS0wNSAxODoxNDowOCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogQWRkcyB0ZXN0cyBmb3IgcGFzc3Rocm91Z2gKKwkgIEFkZHMgdGVzdHMgZm9yIGNoZWNraW5nIGlmIHRoZSBlbGVtZW50IHJlYWxseSBkb2VzCisJICBwYXNzdGhyb3VnaCBpbiBkaXNhYmxlZCBtb2RlIGFuZCBpbiBhdXRvIChpZiB0aGUgaW5wdXQgaXMKKwkgIG5vdCBpbnRlcmxhY2VkKQorCisyMDEwLTAxLTA1IDA3OjUwOjUxIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IEFkZHMgdGVzdHMgZm9yIGNhcHMgYWNjZXB0YW5jZQorCSAgQWRkcyBjaGVjayB1bml0IHRlc3RzIGZvciBkZWludGVybGFjZSBmb3IgdmFsaWRhdGluZworCSAgY2FwcyBhY2NlcHRpbmcgYW5kIHRoZSBleHBlY3RlZCBjYXBzIG91dHB1dCBvbiB0aGUKKwkgIG90aGVyIHBhZAorCisyMDEwLTAxLTA0IDEzOjQzOjAwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IEFkZHMgYmFzaWMgY2hlY2sgdGVzdAorCSAgQWRkcyBhIGJhc2ljIGNoZWNrIHRlc3QgZm9yIGRlaW50ZXJsYWNlIGVsZW1lbnQKKworMjAxMC0wMS0wNCAxNTo0NDoyOCAtMDgwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHNvbmdiaXJkbmVzdC5jb20+CisKKwkqIGdzdC9xdGRlbXV4L01ha2VmaWxlLmFtOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWRkIHN1cHBvcnQgZm9yIHdhdmUtc3R5bGUgYXVkaW8gaW4gcXQuCisJICBVc2VzIGdzdHJpZmYgdG8gcGFyc2UgdGhlIHdhdmUgaGVhZGVycyBhcHByb3ByaWF0ZWx5LiBUZXN0ZWQgd2l0aCBNUy1BRFBDTQorCSAgY29udGVudC4KKworMjAwOS0xMi0zMSAxNzowOTowMyAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSAgdGVzdHM6IEFkZCBHLjcyOSBSVFAgcGF5bG9hZGVyL2RlcGF5bG9hZGVyIHRlc3QKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MDYwNTAKKworMjAwOS0xMi0zMSAxNjo1MjozMCAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkgIHJ0cGc3MjlwYXk6IFNpbXBsaWZ5IGFkYXB0ZXIgdXNhZ2UKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MDYwNTAKKworMjAwOS0xMi0zMSAxNjoyNzozMCAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkgIHJ0cGc3MjlwYXk6IFN1cHBvcnQgcHRpbWUgZnJvbSBjYXBzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjA2MDUwCisKKzIwMDktMTItMDIgMTk6MzU6MjEgKzA1MzAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9SRUFETUU6CisJICBydHA6IEFkZCBtYXhwdGltZSB0byB0aGUgUkVBRE1FCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjA2MDUwCisKKzIwMTAtMDEtMDUgMTk6MDM6MDYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM2RlcGF5Lmg6CisJICBydHBnNzIzZGVwYXk6IGFkZCBHNzIzIGRlcGF5bG9hZGVyCisKKzIwMTAtMDEtMDUgMTk6MDI6MzkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5oOgorCSAgcnRwZzcyOWRlcGF5OiByZW1vdmUgdW51c2VkIHZhcmlhYmxlCisKKzIwMTAtMDEtMDUgMTg6MzM6MjUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzcGF5Lmg6CisJICBydHBnNzIzcGF5OiByZXdyaXRlIHBheWxvYWRlcgorCSAgSGFuZGxlIGFsbCAzIHBhY2tldCBzaXplcyBhY2NvcmRpbmcgdG8gUkZDIDM1NTEuCisJICBUb3RhbGx5IHVudGVzdGVkLCB3ZSBkb24ndCBoYXZlIGEgRzcyMyBlbmNvZGVyLgorCSAgRml4ZXMgIzYwNTg4MgorCisyMDEwLTAxLTA1IDExOjQ3OjIwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggY2h1bmsgY291bnRlcgorCisyMDEwLTAxLTA0IDE5OjQ0OjUzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBtb3JlIHdvcmsgYXQgcmVkdWNpbmcgbG9vcCBvdmVyaGVhZAorCSAgVHJ5IHRvIGF2b2lkIGRlcmVmcyB3aGVuIHBhcnNpbmcgdGhlIGluZGV4LiBTYXZlIHRoZSBzdGF0ZSBpbnRvIHRoZSBzdHJ1Y3R1cmVzCisJICB3aGVuIHdlIGV4aXQgdGhlIGxvb3AgaW5zdGVhZCBvZiBmb3IgZWFjaCBpdGVyYXRpb24uCisKKzIwMTAtMDEtMDQgMTY6MzM6MzAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGNsZWFudXBzIGFuZCBtYWtlIGR1cmF0aW9uIG1vcmUgYWNjdXJhdGUKKwkgIE1ha2UgdGhlIFF0RGVtdXhTYW1wbGUgc3RydWN0IHNtYWxsZXIgYnkga2VlcGluZyB0aGUgZHVyYXRpb24gYW5kIHRoZSBwdHNfb2Zmc2V0CisJICBhcyB0aGVpciAzMiBiaXQgdmFsdWVzLgorCSAgTWFrZSBzb21lIG1hY3JvcyB0byBjYWxjdWxhdGUgUFRTLCBEVFMgYW5kIGR1cmF0aW9uIG9mIGEgc2FtcGxlLgorCSAgRGVyZWYgdGhlIHNhbXBsZSBpbmRleCBsZXNzIG9mdGVuIGJ5IGtlZXBpbmcgYSByZWYgdG8gdGhlIHNhbXBsZSB3ZSdyZSBkZWFsaW5nCisJICB3aXRoLgorCisyMDEwLTAxLTA0IDEzOjQxOjE4ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBzaW1wbGlmeSBsb2dpYyB0byBjYWxjdWxhdGUgZHVyYXRpb24KKwkgIFNpbmNlIHdlIG5vIGxvbmdlciBzdG9yZSB0aGUgdGltZXN0YW1wIGFuZCBkdXJhdGlvbiBpbiBuYW5vc2Vjb25kcywgd2UgY2FuIG5vdworCSAgc2ltcGx5IHN0b3JlIHRoZSBkdXJhdGlvbiBhcy1pcy4KKworMjAxMC0wMS0wMSAxNjo0Mjo1NyArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBTdG9yZSB0aW1lc3RhbXBzIGluIG1vdiBmb3JtYXQgaW4gdGhlIGluZGV4CisJICBUaGlzIGFsbG93cyBmYXN0ZXIgYnVpbGRpbmcgb2YgdGhlIGluZGV4IHVwb24gc2Vla3Mgc28gdGhhdCBzY2FsaW5nIG9mCisJICB0aW1lc3RhbXBzIG9ubHkgb2NjdXJzIHdoZW4gYWN0dWFsbHkgbmVlZGVkLgorCisyMDA5LTEyLTE4IDEzOjU0OjQ2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBtYWtlIHNlZWtpbmcgaW4gcHVzaCBtb2RlIHdvcmsKKwkgIE1vdmUgc2FtcGxlIHBvc2l0aW9uIGNoZWNrcyBpbnRvIHF0ZGVtdXhfcGFyc2Vfc2FtcGxlcyB3aGVyZSB3ZSBjYW4gcHJvdGVjdCBpdAorCSAgd2l0aCBhIGxvY2suCisJICBSZWZhY3RvciBhbmQgbWFrZSBhbiBxdGRlbXV4X2Vuc3VyZV9pbmRleCBmdW5jdGlvbi4KKwkgIFJlbmFtZSBxdGRlbXV4X2RvX3B1c2hfc2VlayB0byBxdGRlbXV4X3NlZWtfb2Zmc2V0IGluIG9yZGVyIHRvIGF2b2lkIGNvbmZ1c2lvbgorCSAgd2l0aCBnc3RfcXRkZW11eF9kb19wdXNoX3NlZWsuCisKKzIwMDktMTItMTggMTI6NDQ6MjcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IG1vdmUgZXJyb3IgY29kZSBvdXQgb2Ygbm9ybWFsIGZsb3cKKworMjAwOS0xMS0yNCAxNjoyNzoyNiArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJICBxdGRlbXV4OiBBZGQgcHVzaCBtb2RlIHNlZWsgc3VwcG9ydCBmb3Igc2Vla2luZyB0byBvYnRhaW4gdGhlIG1vb3YgYXRvbQorCisyMDEwLTAxLTA1IDEyOjIyOjA5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaXggb24tbnB0LXN0b3Agc2lnbmFsIHdhcm5pbmdzIGZvciBSRFQKKwkgIFRoZSBSRFQgbWFuYWdlciBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBzaWduYWwgc28gd2UgbmVlZCB0byBjaGVjayBmb3IgaXQgYmVmb3JlCisJICB0cnlpbmcgdG8gY29ubmVjdCB0byBpdC4KKworMjAxMC0wMS0wNSAwOTo0NzowMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IGZpeCBtZW1vcnkgbGVhayBpbiBuZXcgdXJpIGhhbmRsZXIgY29kZQorCSAgRG9uJ3QgbGVhayBhIHN0cmluZyBldmVyeXRpbWUgZ2V0X3VyaSgpIGlzIGNhbGxlZCBhbmQgYSBkZXZpY2UKKwkgIGhhcyBiZWVuIHNldC4gVGhlcmUncyBhIGxpbWl0ZWQgbnVtYmVyIG9mIGRldmljZXMsIHNvIGp1c3QKKwkgIGludGVybiB0aGUgc3RyaW5nIGluc3RlYWQgb2YgZG9pbmcgbW9yZSBlbGFib3JhdGUgaG91c2VrZWVwaW5nCisJICBhbmQgc3RvcmluZyBpdCBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0IG9yIHNvLgorCisyMDEwLTAxLTAxIDE0OjEwOjQ5ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IGZpeCB0eXBvIGluIHdhcm5pbmcgbWVzc2FnZQorCisyMDEwLTAxLTA0IDA5OjI4OjM2IC0wMzAwICBSb2JlcnQgV2VpZGxpY2ggPGdub21lYnVnemlsbGFAcm9iZXJ0LndlaWRsaWNoLmNjPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuaDoKKwkgIHNob3V0MnNlbmQ6IEFkZCAncHVibGljJyBwcm9wZXJ0eQorCSAgQWRkcyBhIHByb3BlcnR5IHRvIHNldCAncHVibGljJyBmbGFnIG9uIGxpYnNob3V0LCBtYWtpbmcKKwkgIHRoZSBzdHJlYW0gbGlzdGVkIG9uIHRoZSBzZXJ2ZXIncyBzdHJlYW0gZGlyZWN0b3J5LgorCSAgRml4ZXMgIzYwNTI2OQorCisyMDA5LTEyLTMwIDE0OjE0OjU1ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWRkIHRhZ3MgZm9yIGF2ZXJhZ2UgYW5kIG1heGltdW0gYml0cmF0ZQorCSAgRml4ZXMgIzU5OTMwMC4KKworMjAwOS0xMi0yNiAxNjo1OToxNCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJICBhdWRpb2Z4YmFzZWZpcmZpbHRlcjogZG8gbm90IHRyeSB0byBhbGxvYyByZWFsbHkgbGFyZ2UgYnVmZmVycworCSAgV2hlbiBuc2FtcGxlc19vdXQgaXMgbGFyZ2VyIHRoYW4gbnNhbXBsZXNfaW4sIHVzaW5nIHVuc2lnbmVkCisJICBpbnRzIGxlYWQgdG8gYSBvdmVyZmxvdyBhbmQgdGhlIHJlc3VsdGluZyB2YWx1ZSBpcyB3cm9uZyBhbmQKKwkgIHdheSB0b28gbGFyZ2UgZm9yIGFsbG9jYXRpbmcgYSBidWZmZXIuIFVzZSBzaWduZWQgaW50ZWdlcnMKKwkgIGFuZCByZXR1cm5pbmcgaW1tZWRpYXRlbGx5IHdoZW4gdGhhdCBoYXBwZW5zLgorCisyMDA5LTEyLTI1IDEyOjM4OjM1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9heXV2LmM6CisJICB2aWRlb21peGVyOiBvcHRpbWl6ZSBibGVuZCBjb2RlIHNvbWUgbW9yZQorCSAgVXNlIG1vcmUgZWZmaWNpZW50IGZvcm11bGEgdGhhdCB1c2VzIGxlc3MgbXVsdGlwbGllcy4KKwkgIFJlZHVjZSB0aGUgYW1vdW50IG9mIHNjYWxhciBjb2RlLCB1c2UgTU1YIHRvIGNhbGN1bGF0ZSB0aGUgZGVzaXJlZAorCSAgYWxwaGEgdmFsdWUuCisJICBVbnJvbGwgYW5kIGhhbmRsZSAyIHBpeGVscyBpbiBvbmUgaXRlcmF0aW9uIGZvciBpbXByb3ZlZCBwYWlyaW5nLgorCisyMDA5LTEyLTI0IDIyOjU5OjA5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9heXV2LmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9iZ3JhLmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9pNDIwLmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9yZ2IuYzoKKwkgIHZpZGVvbWl4ZXI6IHNjYWxlIGFuZCBjbGFtcAorCSAgU2NhbGUgYW5kIGNsYW1wIHRvIHRoZSBtYXggYWxwaGEgdmFsdWVzLgorCisyMDA5LTEyLTI0IDIyOjUwOjMxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkgIGFscGhhOiBzY2FsZSBhbmQgY2xhbXAgYWxwaGEgdG8gaXRzIGZ1bGwgZXh0ZW5kCisJICBDb252ZXJ0IHRoZSBhbHBoYSB2YWx1ZSB0byAwLT4yNTUgd2hlbiBzZXR0aW5nIGFuZCB0byAwLT4yNTYgd2hlbiB1c2luZyBhcworCSAgYSBzY2FsaW5nIGZhY3Rvci4gVGhpcyBtYWtlcyBzdXJlIHdlIGNhbiByZWFjaCB0aGUgZnVsbCBvcGFjaXR5IHZhbHVlIG9mIDB4ZmYgaW4KKwkgIGFsbCBjYXNlcy4KKworMjAwOS0xMi0yNCAyMjoyMzowMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IHNvbWUgY29tbWVudHMsIHJlbW92ZSBwcm9wZXJ0eSBjaGVjaworCSAgRml4IHNvbWUgY29tbWVudHMsIGNsYXJpZnkgc29tZSBGSVhNRXMKKwkgIFJlbW92ZSB0aGUgb24tbnRwLXN0b3Agc2lnbmFsIGNoZWNrIG5vdyB0aGF0IHRoZSBqaXR0ZXJidWZmZXIgaXMgaW4KKwkgIC1nb29kIGFuZCB3ZSBrbm93IHRoYXQgaXQgc3VwcG9ydHMgdGhpcyBzaWduYWwuCisKKzIwMDktMTItMjQgMjA6Mjc6NTcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIHZpZGVvbWl4ZXI6IHNvbWUgdHJpdmlhbCBjbGVhbnVwcworCisyMDA5LTEyLTI0IDE3OjA0OjI4IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogUGFyc2UgYWxsIHJ0cGluZm8gZW50cmllcworCSAgRG8gbm90IGZvcmdldCB0byBwYXJzZSBhbGwgcnRwLWluZm8gZW50cmllcywgaW5zdGVhZCBvZgorCSAgcGFyc2luZyB0aGUgZmlyc3Qgb25lIG9ubHkuCisJICBGaXhlcyAjNjA1MjIyCisKKzIwMDktMTItMjIgMTI6NDQ6NTAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwZXJmIHRhZyBzaG91bGQgbWFwIHRvIEdTVF9UQUdfQVJUSVNUCisKKzIwMDktMTItMjQgMTc6MDM6MDIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkgIGludGVybGVhdmU6IGZpeCB3ZWlyZCBpbmRlbnRhdGlvbgorCisyMDA5LTEyLTI0IDE3OjAxOjU0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJICBydHBoMjYzcHBheTogdXNlIGZhc3RlciBfYWRhcHRlcl9jb3B5KCkgd2hlbSBwb3NzaWJsZQorCisyMDA5LTEyLTI0IDE3OjAxOjE1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L2ZpcmZpbHRlci1leGFtcGxlLmM6CisJICB0ZXN0czogdXNlIHJpZ2h0IHR5cGUgd2hlbiBwYXNzaW5nIHZhcmFyZyB2YWx1ZQorCisyMDA5LTEyLTIzIDE3OjUwOjM0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oOgorCSAgZmxhY2RlYzogdXNlIGEgc2luZ2xlIGRlY29kZXIgZmllbGQgZm9yIGJvdGggcHVzaCBhbmQgcHVsbCBtb2RlCisKKzIwMDktMTItMjMgMTc6MDM6MzIgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBmbGFjZGVjOiBmaXggcG9zc2libGUgaGFuZ2luZyBpbiBwdWxsIG1vZGUgc2Vla2luZworCSAgQSBzZWVrIGluIG11bHRpLXNpbmsgcGlwZWxpbmUgdHlwaWNhbGx5IGxlYWRzIHRvIHNldmVyYWwgc2VlayBldmVudHMgaW4gYSByb3csCisJICB3aGljaCBjb3VsZCBsZWFkIHRvIHNlbmRpbmcgc2V2ZXJhbCBuZXdzZWdtZW50cyBpbiBhIHJvdyB3aXRob3V0IGludGVybWVkaWF0ZQorCSAgZmx1c2hpbmcuICBUaGVzZSB3b3VsZCB0aGVuIGFjY3VtdWxhdGUsIGRpc3RvcnQgcmVuZGVyaW5nIHRpbWVzIGFuZCBhcyBzdWNoCisJICBsZWFkIHRvICdoYW5naW5nJy4KKworMjAwOS0xMi0yMyAxOTozOTowNSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwaDI2NHBheTogZml4IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUKKworMjAwOS0xMi0yMyAxMzowOTo1NCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJICBydHA6IHVzZSBib2lsZXJwbGF0ZQorCisyMDA5LTEyLTIzIDAwOjM4OjA1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cEwxNnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuaDoKKwkgIHJ0cEwxNnBheTogY29udmVydCB0byBiYXNlYXVkaW9wYXlsb2FkCisJICBVc2UgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZCBhcyB0aGUgYmFzZSBjbGFzcy4gVGhpcyBzYXZlcyBhIGxvdCBvZiBjb2RlIGFuZCBmaXhlcworCSAgYSBidW5jaCBvZiBwcm9ibGVtcyB0aGF0IHdlcmUgYWxyZWFkeSBzb2x2ZWQgaW4gdGhlIGJhc2UgY2xhc3MuCisJICBGaXhlcyAjODUzMzY3CisKKzIwMDktMTItMjMgMDA6MzA6NDkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSAgcnRwcGNtYXBheTogdGhlIGJvaWxlcnBsYXRlIG1hY3JvIHNldHMgcGFyZW50X2NsYXNzCisKKzIwMDktMTItMjIgMjI6Mjc6MjEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBydHBiaW46IGF2b2lkIHNvbWUgc3RydWN0dXJlIGNvcGllcworCSAgRG9uJ3QgbWFrZSBjb3BpZWQgaW4gdGhlIGdldHRlciBhbmQgc2V0dGVyIGZvciBTREVTIGluIHRoZSBSVFBTb3VyY2UuIFRoaXMKKwkgIGF2b2lkcyBhIGNvdXBsZSBvZiBjb3BpZXMgb2YgdGhlIFNERVMgc3RydWN0dXJlIHdoZW4gZ2VuZXJhdGluZyBSVENQCisJICBwYWNrZXRzLgorCisyMDA5LTA4LTMxIDE4OjQyOjI1ICswMjAwICBQYXNjYWwgQnVobGVyIDxwYXNjYWwuYnVobGVyQHRhbmRiZXJnLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIHJ0cG1hbmFnZXI6IGltcHJvdmUgU0RFUyBoYW5kbGluZworCSAgU3RvcmUgU0RFUyBpbnRlcm5hbGx5IGFzIGEgc3RydWN0IHRvIHN1cHBvcnQgbXVsdGlwbGUgUFJJViB2YWx1ZXMuCisJICBJbmNsdWRlIGFsbCB2YWx1ZXMgc2V0IGluIFNERVMgc3RydWN0IHdoZW4gc2VuZGluZyBSVENQIFNERVMuCisKKzIwMDktMTItMjIgMTQ6NDE6MzUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJICBydHBoMjYzZGVwYXk6IGFkZCBzb21lIGZpeG1lcworCisyMDA5LTEyLTIyIDE0OjM1OjEzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5jOgorCSAgcnRwaDI2M2RlcGF5OiBiYXNlY2xhc3MgaGFuZGxlcyB0aW1lc3RhbXBzIGZvciB1cworCisyMDA5LTEyLTIyIDE0OjI3OjQwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5jOgorCSAgcnRwaDI2M2RlcGF5OiByZXNldCBzdGFydCB2YXJpYWJsZSBwcm9wZXJseQorCisyMDA5LTA1LTI5IDE1OjQ5OjI3ICswMzAwICBNYXJjbyBCYWxsZXNpbyA8bWFyY28uYmFsbGVzaW9Abm9raWEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuaDoKKwkgIERyb3AgdGhlIHdob2xlIGZyYW1lIGlmIGEgcGFja2V0IGlzIGxvc3QuCisJICBGaXhlcyAjNTgyNTc1CisKKzIwMDktMTItMjEgMjA6Mzk6NTMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJICBydHBoMjY0cGF5OiBhZGQgb3B0aW9uIHRvIGluc2VydCBQUFMvU1BTIGluIHN0cmVhbXMKKwkgIEFkZCBhIG5ldyBzcHNwcHMtaW50ZXJ2YWwgcHJvcGVydHkgdG8gaW5zdHJ1Y3QgdGhlIHBheWxvYWRlciB0byBpbnNlcnQKKwkgIFNQUyBhbmQgUFBTIGF0IHBlcmlvZGljIGludGVydmFscyBpbiB0aGUgc3RyZWFtLgorCSAgUmV3b3JrIHRoZSBTUFMvUFBTIGhhbmRsaW5nIHNvIHRoYXQgYnl0ZXN0cmVhbSBhbmQgQVZDIHNhbXBsZSBjb2RlIGJvdGggdXNlIHRoZQorCSAgc2FtZSBjb2RlIHBhdGhzIHRvIGhhbmRsZSBzcHJvcC1wYXJhbWV0ZXItc2V0cy4gVGhpcyBhbHNvIGFsbG93cyB0byBoYXZlIHRoZSBBVkMKKwkgIGNvZGUgdG8gaW5zZXJ0IFNQUy9QUFMgbGlrZSB0aGUgYnl0ZXN0cmVhbSBjb2RlLgorCSAgRml4ZXMgIzYwNDkxMworCisyMDA5LTEyLTIxIDE5OjEyOjIyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDQ3Y2IyM2EgdG8gMTRjZWM4OQorCisyMDA5LTEyLTIxIDEyOjAxOjUzIC0wMzAwICBKb25hdGhhbiBDb25kZXIgPGpAc2t1cnZ5Lm5vLWlwLm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfdHlwZXMuYzoKKwkgIHF0ZGVtdXg6IEFkZHMgbmV3IHRhZ3MKKwkgIEFkZHMgc29tZSBuZXcgdGFncyBtYXBwaW5nIHRvIHF0ZGVtdXguCisJICBGaXhlcyAjNTk5NzU5CisKKzIwMDktMTItMjEgMTU6MDU6MDkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBhZGQgcHJvcGVydHkgdG8gcmVtb3ZlIHBhZHMgYXV0b21hdGljYWxseQorCSAgQWRkIGEgcHJvcGVydHkgY2FsbGVkIGF1dG9yZW1vdmUgdG8gYXV0b21hdGljYWxseSByZW1vdmUgdGhlIHBhZHMgb2Ygc291cmNlcworCSAgdGhhdCB0aW1lZCBvdXQuCisJICBGaXhlcyAjNTU0ODM5CisKKzIwMDktMTItMjEgMTQ6NTU6MTYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgc3NyY2RlbXV4OiBmaXggY29tcGFyaXNvbgorCSAgQSBOVUxMIG1lYW5zIG5vIHBhZCB3YXMgZm91bmQuCisKKzIwMDktMTEtMDggMTE6NDk6MTQgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IEFkZCBHc3RVUklIYW5kbGVyIGludGVyZmFjZS4gRml4ZXMgIzYwMTE0MworCSAgVGhpcyBhbGxvd3MgdXNpbmcgdjRsMjovL1s8ZGV2aWNlPl0KKworMjAwOS0xMi0yMCAxNzoyNDo0NyAtMDgwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgbXVsdGl1ZHBzaW5rOiBwYXNzIGxlbmd0aCBwYXJhbWV0ZXIgdG8gZ19jb252ZXJ0CisKKzIwMDktMTItMTggMTI6NDQ6NTAgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2E6IEZpeCB1bml0aWFsaXplZCB2YXJpYWJsZS4KKwkgIFllcywgaXQncyBzdHVwaWQsIGJ1dCBtYWNvc3ggY29tcGlsZXJzIGFyZSBldmVuIG1vcmUgc3R1cGlkLgorCisyMDA5LTEyLTE3IDE2OjAxOjI1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfYXl1di5jOgorCSAgdmlkZW9taXhlcjogRml4IGFzc2VtYmx5IGNvbXBpbGF0aW9uIG9uIHg4NgorCSAgRml4ZXMgYnVnICM2MDQ4MTQuCisKKzIwMDktMTItMTcgMTc6Mzc6MDMgKzAxMDAgIEJyYW5rbyDEjGliZWogPGJyYW5lIGF0IHhiYy5udT4KKworCSogZ3N0L3JlcGxheWdhaW4vcmdhbmFseXNpcy5jOgorCSAgcmdhbmFseXNpczogZml4IHRpbWVzdGFtcCByb3VuZGluZworCSAgVXNlIHNjYWxpbmcgZnVuY3Rpb24gdG8gcm91bmQgYW5kIGF2b2lkIG92ZXJmbG93cy4KKwkgIEZpeGVzICM2MDQzNTIKKworMjAwOS0xMi0xNyAxNzoyNzo0MiArMDEwMCAgVGlhZ28gS2F0Y2lwaXMgPHRpYWdvLmthdGNpcGlzQGRpZ2l0cm8uY29tLmJyPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzcGF5Lmg6CisJICBydHA6IGFkZCBHNzIzIHBheWxvYWRlcgorCSAgRml4ZXMgIzU5NzgyMworCisyMDA5LTEyLTE3IDE2OjIyOjU2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X3R5cGVzLmM6CisJICBxdGRlbXV4OiBGaXggQUxBQyBjb2RlY19kYXRhIHBhcnNpbmcKKwkgIEZpeGVzICM2MDQ2MTEKKworMjAwOS0xMi0xNiAxNzoyODozMCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFJlbW92ZSBjcHAgc3R5bGUgY29tZW50cworCSAgUmVtb3ZlcyAvLyBjb21tZW50cyBhbmQgcmVwbGFjZSB0aGVtIHdpdGggLyogKi8gY29tbWVudHMKKworMjAwOS0xMi0xNiAxMjo0ODowMiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICBtYXRyb3NrYWRlbXV4OiBhbHNvIGNvbnNpZGVyIEJsb2NrTnVtYmVyIGluZGljYXRlZCBpbiBpbmRleCB3aGVuIHNlZWtpbmcKKworMjAwOS0xMi0xNiAxMjo0MzoyNyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICBtYXRyb3NrYWRlbXV4OiBzdXBwb3J0IHB1c2ggYmFzZWQgbW9kZQorCSAgRml4ZXMgIzU5ODYxMC4KKworMjAwOS0xMi0xNiAxMjo0NDozNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkgIG1hdHJvc2thZGVtdXg6IGZpeCBlYm1sIHJlYWQgY2FjaGUgdXNhZ2UKKworMjAwOS0xMi0xNiAxMDo1MDozMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2F5dXYuYzoKKwkgIHZpZGVvbWl4ZXI6IFVzZSBtb3Z6YmwgaW5zdGVhZCBvZiBtb3Z6eGIgZm9yIG1vdmluZyBvbmUgYnl0ZSB0byBhIGwgcmVnaXN0ZXIKKwkgIEZvciBzb21lIHJlYXNvbiBsYXRlc3QgZ2NjL2JpbnV0aWxzIGFjY2VwdCBtb3Z6eGIgaGVyZSB3aGlsZQorCSAgbW92emJsIHdvdWxkIGJlIGNvcnJlY3QgYW5kIGlzIHRoZSBvbmx5IHRoaW5nIGFjY2VwdGVkIGJ5IG9sZGVyCisJICBnY2MvYmludXRpbHMuCisJICBGaXhlcyBidWcgIzYwNDY3OS4KKworMjAwOS0xMi0xNiAwNjo1OTowMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2F5dXYuYzoKKwkgIHZpZGVvbWl4ZXI6IHNyYy9kZXN0IGFyZSBpbnB1dCBhbmQgb3V0cHV0IG9mIHRoZSBBWVVWIGJsZW5kaW5nIE1NWCBhc3NlbWJsZXIKKworMjAwOS0xMi0xNSAxODoxODo1NCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNiYW5kLmM6CisJICBhdWRpb3dzaW5jYmFuZDogVXNlIHRoZSBzYW1lIHVwcGVyIGxlbmd0aCBsaW1pdCBhcyBhdWRpb3dzaW5jbGltaXQKKworMjAwOS0xMi0xMiAxNzowMDo1MCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYzoKKwkgIGF1ZGlvd3NpbmN7bGltaXQsYmFuZH06IEFsbG93IG11Y2ggbGFyZ2VyIGZpbHRlciBsZW5ndGhzIG5vdworCisyMDA5LTEyLTExIDEyOjI3OjMyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkgIGF1ZGlvZnhiYXNlZmlyZmlsdGVyOiBGaXggZnJlcXVlbmN5IHJlc3BvbnNlIGNhbGN1bGF0aW9uCisKKzIwMDktMTItMDggMTQ6NTc6MDIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSAgYXVkaW9meGJhc2VmaXJmaWx0ZXI6IFJlbW92ZSBkZWFkIGFzc2lnbm1lbnRzCisKKzIwMDktMTItMDYgMTY6NTg6NTEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSAgYXVkaW9meGJhc2VmaXJmaWx0ZXI6IEFkZCBzcGVjaWFsIHByb2Nlc3NpbmcgZnVuY3Rpb25zIGZvciBNb25vL1N0ZXJlbworCSAgVGhpcyBwcm92aWRlcyBhbm90aGVyIDclIHNwZWVkdXAgZm9yIHRoZSB0aW1lIGRvbWFpbiBjb252b2x1dGlvbiBhbmQgMS41JQorCSAgc3BlZWR1cCBmb3IgdGhlIEZGVCBjb252b2x1dGlvbiBvbiBNb25vIGlucHV0LgorCSAgVGhpcyBvcHRpbWl6YXRpb24gYXNzdW1lcyB0aGF0IHRoZSBjb21waWxlciBzaW1wbGlmaWVzIGNhbGN1bGF0aW9ucworCSAgYW5kIGNvbmRpdGlvbnMgb24gY29uc3RhbnQgbnVtYmVycyBhbmQgdW5yb2xscyBsb29wcyB3aXRoIGEgY29uc3RhbnQKKwkgIG51bWJlciBvZiByZXBlYXRzLgorCisyMDA5LTEyLTA0IDA5OjI1OjQ5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmg6CisJICBhdWRpb2Z4YmFzZWZpcmZpbHRlcjogQWRkIGEgImxvdy1sYXRlbmN5IiBtb2RlCisJICBUaGlzIHdpbGwgYWx3YXlzIHVzZSB0aW1lLWRvbWFpbiBjb252b2x1dGlvbiwgd2hpY2ggbG93ZXJzIHRoZSBsYXRlbmN5LgorCSAgV2l0aCBGRlQgY29udm9sdXRpb24gaXQncyBhbHdheXMgYSBtdWx0aXBsZSBvZiB0aGUga2VybmVsIGxlbmd0aCwKKwkgIHdpdGggdGltZSBkb21haW4gY29udm9sdXRpb24gaXQncyBvbmx5IHRoZSBwcmUtbGF0ZW5jeSBvZiB0aGUgZmlsdGVyIGtlcm5lbC4KKworMjAwOS0xMi0wNCAwOTowMDoyMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJICBhdWRpb2Z4YmFzZWZpcmZpbHRlcjogUmVtb3ZlIG9ic29sZXRlIFRPRE8gY29tbWVudHMKKworMjAwOS0xMi0wMyAyMDoxMjowMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJICBhdWRpb2Z4YmFzZWZpcmZpbHRlcjogVXNlIHNhbXBsZXMgZXZlcnl3aGVyZSBpbnN0ZWFkIG9mIHNhbXBsZXMqY2hhbm5lbHMgc29tZXRpbWVzCisKKzIwMDktMTItMDMgMTc6Mjc6MTMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5oOgorCSAgYXVkaW9meGJhc2VmaXJmaWx0ZXI6IEZGVCBjb252b2x1dGlvbiBpbXBsZW1lbnRhdGlvbgorCSAgVGhpcyBwcm92aWRlcyBhIGdyZWF0IHNwZWVkdXAsIGVzcGVjaWFsbHkgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGtlcm5lbAorCSAgbGVuZ3RoIGFuZCBwcm9jZXNzaW5nIHNpemUgaXMgbm93IGxvZ2FyaXRobWljIGluc3RlYWQgb2YgbGluZWFyLiBCZWxvdyBhCisJICBrZXJuZWwgc2l6ZSBvZiAzMiBpdCdzIGEgYml0IHNsb3dlciwgYWZ0ZXJ3YXJkcyBpdCdzIG11Y2ggZmFzdGVyOgorCSAgMTcgICAgIDAuNzg4MDAwIC0+IDAuOTUwMDAwCisJICAzMyAgICAgMS4yMDgwMDAgLT4gMS4xNDYwMDAKKwkgIDY1ICAgICAyLjE2NjAwMCAtPiAxLjE0NjAwMAorCSAgLi4uCisJICA0MDk3IDEwNy40NDQwMDAgLT4gMS41MDgwMDAKKwkgIEZvciBzaXplcyBzbWFsbGVyIDMyIHRoZSBub3JtYWwgdGltZS1kb21haW4gY29udm9sdXRpb24gaXMgY2hvc2VuLAorCSAgZm9yIGxhcmdlciBzaXplcyB0aGUgRkZUIGNvbnZvbHV0aW9uIGlzIGF1dG9tYXRpY2FsbHkgdXNlZC4KKwkgIEZpeGVzIGJ1ZyAjNTk0MzgxLgorCisyMDA5LTExLTI3IDIwOjMzOjE0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmg6CisJICBhdWRpb2Z4YmFzZWZpcmZpbHRlcjogTWFrZSBtb3N0IGNvZGUgcGFydHMgaW5kZXBlbmRlbnQgb2YgdGhlIHByb2Nlc3NpbmcgZnVuY3Rpb25zIGFuZCB1c2VkIGNvbnZvbHV0aW9uIGFsZ29yaXRobQorCSAgT25seSByZW1haW5pbmcgcGFydCBpcyB0aGUgcmVzaWR1ZSBwdXNoaW5nLCB3aGljaCB3aWxsIGJlIGZpeGVkIGxhdGVyLgorCisyMDA5LTExLTI2IDE1OjE3OjI3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkgIGF1ZGlvZnhiYXNlZmlyZmlsdGVyOiBPcHRpbWl6ZSB0aW1lLWRvbWFpbiBjb252b2x1dGlvbgorCSAgUmVtb3ZlIHNvbWUgcmVkdW5kYW50IGNhbGN1bGF0aW9ucywgbW92ZSBjb21wYXJpc2lvbnMgb3V0IG9mCisJICBpbm5lciBsb29wcywgZXRjLgorCSAgVGhpcyBtYWtlcyB0aGUgY29udm9sdXRpb24gYWJvdXQgMyAoISkgdGltZXMgZmFzdGVyIGJ1dAorCSAgcHJvY2Vzc2luZyB0aW1lIGlzIG9mIGNvdXJzZSBzdGlsbCBwcm9wb3J0aW9uYWwgdG8gdGhlCisJICBmaWx0ZXIgc2l6ZS4KKworMjAwOS0xMS0yNiAxMDo0NTozNyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJICBhdWRpb2Z4YmFzZWZpcmZpbHRlcjogVXNlIF9DQVNUIG1hY3JvcyBpbiBzb21lIHBsYWNlcyBhbmQgZG8gc29tZSBjYWxjdWxhdGlvbnMgb25seSBvbmNlCisKKzIwMDktMTEtMjUgMTg6MTI6MDUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuaDoKKwkgIGF1ZGlvZnhiYXNlZmlyZmlsdGVyOiBSZXdyaXRlIHRpbWVzdGFtcCB0cmFja2luZworCSAgSXQncyBtdWNoIHNpbXBsZXIgbm93IGFuZCBkb2Vzbid0IGludHJvZHVjZSBhY2N1bXVsYXRpbmcgcm91bmRpbmcKKwkgIGVycm9ycy4KKworMjAwOS0xMS0yNSAxNzozOTo1MyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5oOgorCSAgYXVkaW9meGJhc2VmaXJmaWx0ZXI6IFJlbmFtZSBzb21lIHZhcmlhYmxlcyBhbmQgY2hhbmdlIGNvbW1lbnRzCisKKzIwMDktMTEtMjQgMjA6MDY6MjUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuaDoKKwkgIGF1ZGlvZnhiYXNlZmlyZmlsdGVyOiBBZGQgY29uc3QgcXVhbGlmaWVyIHRvIHRoZSBzb3VyY2UgZGF0YSBhcnJheQorCisyMDA5LTEyLTE0IDIwOjA4OjA2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9heXV2LmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBBZGQgTU1YIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgQVlVViBibGVuZGluZyBhbmQgY29sb3IgZmlsbGluZyBmdW5jdGlvbnMKKwkgIFRoaXMgcHJvdmlkZXMgYSAyMCUgc3BlZWR1cCBmb3IgYmxlbmRpbmcgYW5kIDEwMCUgZm9yIGNvbG9yIGZpbGxpbmcuCisJICBUaGUgYmxlbmRpbmcgY2FuIHByb2JhYmx5IGJlIG9wdGltaXplZCBldmVuIG1vcmUuCisKKzIwMDktMTItMTMgMTM6MTk6NDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzoKKwkgIGlkM2RlbXV4OiBwcmVmZXIgdHdvIGxldHRlciBJU08gNjM5LTEgY29kZSBmb3IgZXh0ZW5kZWQgY29tbWVudAorCisyMDA5LTEyLTEzIDEzOjEwOjEyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IHVwIGxhbmd1YWdlIGNvZGUgZXh0cmFjdGlvbiBzb21lIG1vcmUKKwkgIFF1aWNrdGltZSB1c2VzIElTTyA2MzktMiBmb3IgbGFuZ3VhZ2UgY29kZXMsIGJ1dCBHU1RfVEFHX0xBTkdVQUdFCisJICBpcyBzdXBwb3NlZCB0byBob2xkIGEgSVNPIDYzOS0xIGNvZGUsIHNvIGNvbnZlcnQgYXMgbmVlZGVkIHVzaW5nCisJICB0aGUgbmV3IEFQSSBmcm9tIC1iYXNlLgorCSAgU2VlICM2MDIxMjYuCisKKzIwMDktMTItMTMgMTI6NDU6MjIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thOiBmaXggbGFuZ3VhZ2UgY29kZSB3cml0aW5nIGFuZCBleHRyYWN0aW9uCisJICBNYXRyb3NrYSB1c2VzIHRocmVlLWxldHRlciBJU08gNjM5LTJCIGNvZGVzLCBidXQgR1NUX1RBR19MQU5HVUFHRSBpcworCSAgc3VwcG9zZWQgdG8gY29udGFpbiB0d28tbGV0dGVyIElTTyA2MzktMSBjb2Rlcywgc28gdXNlIG5ldyBsYW5ndWFnZQorCSAgY29kZSBtYXBwaW5nIGZ1bmN0aW9ucyBpbiAtYmFzZSB0byBjb252ZXJ0IGJldHdlZW4gdGhvc2UgdHdvIGFzCisJICBuZWVkZWQuCisJICBGaXhlcyAjNTA1ODIzLgorCisyMDA5LTEyLTA3IDIwOjU0OjA3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IG1pbm9yIGRlYnVnIG1lc3NhZ2UgY2hhbmdlcworCSAgRml4IHVwIGEgZmV3IGRlYnVnIG1lc3NhZ2VzIHNvIHRoYXQgaXQncyBjbGVhcmVyIHdoYXQgdGhleSBtZWFuLgorCisyMDA5LTEyLTEyIDE3OjQ0OjA0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgUmV2ZXJ0ICJxdGRlbXV4OiBDb3JyZWN0bHkgcGFyc2UgY2xhc3NpZmljYXRpb24gdGFncyIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgY2Q4ODNhYTYwYzExMzMxOTZhNmFlMDUyODg0ZDE1YzI5NWMzN2RkZS4KKwkgIFByZXZpb3VzIGNvZGUgd2FzIGNvcnJlY3QsIDQgaXMgZHVlIHRvIHRhYmxlIGFuZCBsYW5ndWFnZSBjb2RlLAorCSAgbm90IG9ubHkgbGFuZ3VhZ2UgY29kZQorCisyMDA5LTEyLTEyIDE2OjI4OjM2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQ29ycmVjdGx5IHBhcnNlIGNsYXNzaWZpY2F0aW9uIHRhZ3MKKwkgIEluIGNsc2YgYXRvbXMsIHRoZSBsYW5ndWFnZSBjb2RlIGlzIDIgYnl0ZXMgbG9uZywgbm90IDQuCisKKzIwMDktMTItMTIgMTY6NTU6MTMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBEZXF1ZXVlIGN1cnJlbnQgYnVmZmVyIG9uIEZMVVNIX1NUT1AgYW5kIGRvbid0IHVucmVmIE5VTEwgYnVmZmVycworCSAgLi4uIE5VTEwgYnVmZmVycyBzaG91bGRuJ3QgcmVhbGx5IGhhcHBlbiBhbnltb3JlIHdoZW4gcG9wcGluZyB0aGUKKwkgIGJ1ZmZlciBmcm9tIEdzdENvbGxlY3RQYWRzIGJ1dCBiZXR0ZXIgY2hlY2sgZm9yIHRoaXMgYW5kIHByaW50IGEgd2FybmluZy4KKworMjAwOS0xMi0xMSAxMzoxMToxMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2k0MjAuYzoKKwkgIHZpZGVvbWl4ZXI6IEZpeCBzdHVwaWQgbWlzdGFrZSBpbiBsYXN0IGNvbW1pdAorCisyMDA5LTEyLTExIDEyOjM1OjU5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfaTQyMC5jOgorCSAgdmlkZW9taXhlcjogRG9uJ3QgZG8gZmxvYXRpbmcgcG9pbnQgbWF0aCBpbiB0aGUgaW5uZXIgcHJvY2Vzc2luZyBsb29wIGZvciBJNDIwIGJsZW5kaW5nCisKKzIwMDktMTItMTAgMTg6NDM6NDQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGhhbmRsZSBOVUxMIGFuZCBlbXB0eSB0cmFuc3BvcnQgc3RyaW5ncworCSAgV2hlbiBhbiBSVFNQIGV4dGVuc2lvbiByZXR1cm5zIE5VTEwgb3IgYW4gZW1wdHkgdHJhbnNwb3J0IHN0cmluZywganVzdCBpZ25vcmUgaXQKKwkgIGFuZCB0cnkgdG8gZ2V0IHRoZSBuZXh0IHBvc3NpYmxlIHRyYW5zcG9ydC4gRml4ZXMgcGxheWJhY2sgb2YgUmVhbE1lZGlhIHN0cmVhbXMuCisKKzIwMDktMTItMTAgMTg6NDI6NTEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGluc3RhbGwgZXZlbnQgZnVuY3Rpb24gb24gaW50ZXJuYWwgUlRDUCBwYWQKKwkgIEluc3RhbGwgYSBjdXN0b20gZXZlbnQgZnVuY3Rpb24gb24gdGhlIGludGVybmFsIFJUQ1AgcGFkIHNvIHRoYXQgd2UgY2FuIHJlcGx5CisJICBUUlVFIHRvIGEgbGF0ZW5jeSBldmVudC4KKworMjAwOS0xMi0xMCAxMDo0ODo0OSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2F5dXYuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2JncmEuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX3JnYi5jOgorCSAgdmlkZW9taXhlcjogUmVtb3ZlIHdyb25nIGNvbW1lbnRzLCBjb3BpZWQgZnJvbSB0aGUgSTQyMCBibGVuZCBmdW5jdGlvbgorCisyMDA5LTEyLTA5IDIxOjE1OjA3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogVGhlIHF1ZXVlZCBkdXJhdGlvbiBpcyBhIHNpZ25lZCBpbnRlZ2VyCisJICAuLi5hbmQgaXQgd2lsbCByZWFsbHkgYmUgbmVnYXRpdmUgc29tZXRpbWVzLgorCisyMDA5LTEyLTA5IDIxOjAzOjU3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogT25seSBwb3AgYnVmZmVycyBmcm9tIGNvbGxlY3RwYWRzIGFmdGVyIHRoZXkncmUgZnVsbHkgY29uc3VtZWQKKwkgIFRoaXMgZGVjcmVhc2VzIGxhdGVuY3kgYW5kIG1lbW9yeSB1c2FnZSBiZWNhdXNlIG5ldyBidWZmZXJzIGFyZSBvbmx5CisJICBhY2NlcHRlZCBieSBjb2xsZWN0cGFkcyBpZiB0aGVyZSdzIG5vIHF1ZXVlZCBidWZmZXIuCisKKzIwMDktMTItMDkgMjA6NDI6NDQgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgbWF0cm9za2FkZW11eDogQ2xlYW4gdXAgcG9zaXRpb24vZHVyYXRpb24gaGFuZGxpbmcKKwkgIEFsc28gdXNlIHRoZSBsYXN0IGVuZCB0aW1lIGZvciBjbG9zaW5nIHRoZSBzZWdtZW50LCBub3QgdGhlCisJICBzdGFydCB0aW1lIG9mIHRoZSBsYXN0IGJ1ZmZlci4KKworMjAwOS0xMi0wOSAxNjo1MDowMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogQ2xvc2UgdGhlIHNlZ21lbnQgb24gRU9TIGlmIHRoZSByZWFsIGR1cmF0aW9uIGlzIGtub3duCisKKzIwMDktMTItMDkgMTY6NDY6MTggKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IFVwZGF0ZSBkdXJhdGlvbiBpZiBjdXJyZW50IGJ1ZmZlciBpcyBhbHJlYWR5IGFmdGVyIHRoZSBvbGQgZHVyYXRpb24KKworMjAwOS0xMi0wOSAxNjo0Mzo0MSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogRHJvcCBidWZmZXJzIHRoYXQgYXJlIGFmdGVyIHNlZ21lbnQgc3RvcAorCSAgLi4uYW5kIGlmIHRoaXMgaGFwcGVuZWQgZm9yIGFsbCBzdHJlYW1zIGdvIEVPUy4KKworMjAwOS0xMi0wOSAxNjo0MTowNCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogRml4IHBvc2l0aW9uIHRyYWNraW5nIGFuZCBzZW5kaW5nIG9mIGZpbGxlciBzZWdtZW50cworCisyMDA5LTEyLTA5IDE2OjE1OjA5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogVXNlIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQoKSBmb3IgZnBzIHRvIHNlY29uZHMgcGVyIGZyYW1lIGNhbGN1bGF0aW9ucworCisyMDA5LTEyLTA4IDE3OjM0OjE1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBLZWVwIHRoZSBzZWdtZW50IHN0b3AgcG9zaXRpb24gZm9yIHVwZGF0ZSBuZXdzZWdtZW50IGV2ZW50cworCisyMDA5LTEyLTA0IDE0OjQyOjQ5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L2xhZHNwYS9NYWtlZmlsZS5hbToKKwkqIGV4dC9sYWRzcGEvZ3N0bGFkc3BhLmM6CisJKiBleHQvbGFkc3BhL2dzdGxhZHNwYS5oOgorCSogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYzoKKwkqIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmg6CisJKiBleHQvbGFkc3BhL2xvYWQuYzoKKwkqIGV4dC9sYWRzcGEvc2VhcmNoLmM6CisJKiBleHQvbGFkc3BhL3V0aWxzLmg6CisJICBsYWRzcGE6IFJlbW92ZSB0aGUgc291cmNlcyBmcm9tIGdzdC1wbHVnaW5zLWdvb2QKKwkgIEl0J3MgZGlzYWJsZWQgYW55d2F5IGFuZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgaXQgaXMgaW4KKwkgIGdzdC1wbHVnaW5zLWJhZC4gRml4ZXMgYnVnICM2MDM3NzkuCisKKzIwMDktMTItMDQgMTM6NTA6NTkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBpbml0IGN1cnJlbnRfZW50cnkgaW4gcHVzaCBtb2RlCisJICBTZXQgdGhlIGN1cnJlbnRfZW50cnkgdG8gMCAoaW5zdGVhZCBvZiAtMSkgaW4gcHVzaCBtb2RlIHNvIHRoYXQgd2UgY29ycmVjdGx5CisJICBjYWxjdWxhdGUgdGhlIGN1cnJlbnQgZnJhbWUgbnVtYmVyIGFuZCB0aW1lc3RhbXAuCisJICBBZGQgc29tZSBtb3JlIGRlYnVnIGluZm8gYW5kIGZpYyB0aGUgZHVyYXRpb24gZGVidWcuCisKKzIwMDktMTItMDQgMTE6MTQ6MDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaXggbWFqb3IgbWVtb3J5IGxlYWsgd2hlbiBwbGF5aW5nIGJhY2sgcnRzcCB2aWRlbyBzdHJlYW1zCisJICBEb24ndCBmb3JnZXQgdG8gdW5yZWYgUW9TLCBuYXZpZ2F0aW9uIGFuZCBsYXRlbmN5IGV2ZW50cyB3aGVuCisJICBkcm9wcGluZyB0aGVtLgorCisyMDA5LTEyLTAzIDA4OjU4OjA4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBvbmx5IHNlbmQgcGVuZGluZyB0YWdzIHdpdGggbmV3c2VnbWVudCBldmVudHMKKwkgIFNlbmQgcGVuZGluZyB0YWdzIG9ubHkgZnJvbSB0aGUgc3RyZWFtaW5nIHRocmVhZCwganVzdCBhZnRlciB3ZSd2ZSBzZW50CisJICB0aGUgbmV3c2VnbWVudCBldmVudCwgbm90IHdpdGggZS5nLiBmbHVzaC1zdGFydC4gVGhpcyBub3Qgb25seSBkb2VzIHRoZQorCSAgcmlnaHQgdGhpbmcsIGJ1dCBhbHNvIG1ha2VzIHN1cmUgd2UncmUgbm90IHRyYW1wbGluZyBvdmVyIHZhcmlhYmxlcyBzZXQKKwkgIHVwIGluIHRoZSBzdHJlYW1pbmcgdGhyZWFkIGZyb20gdGhlIHNlZWtpbmcgdGhyZWFkIGluIGNhc2Ugc29tZW9uZSB0cmllcworCSAgdG8gaXNzdWUgYSBzZWVrIGp1c3QgYXMgdGhlIGRlbXV4ZXIgaXMgcGFyc2luZyB0aGUgaGVhZGVycy4KKwkgIEZpeGVzICM2MDE2MTcuIFNwb3R0ZWQgYnkgT2dueWFuIFRvbmNoZXYuCisKKzIwMDktMTItMDMgMTc6NDk6NTUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggZGVidWcgbWVzc2FnZSBwcmludGYgYXJncworCSAgRml4ZXMgZGVidWcgbWVzc2FnZSBwcmludGYgZm9ybWF0IHRvIG1ha2UgaXQgYnVpbGQgaW4gbWFjJ3MgZ2NjCisKKzIwMDktMTItMDIgMTM6MzM6MjAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSAgc2hvdXQyOiBDb252ZXJ0IGRlbGF5IGNvcnJlY3RseQorCSAgVXNlIEdTVF9NU0VDT05EIHRvIGNvbnZlcnQgZGVsYXkgaW4gbXNlY3MgdG8gbmFub3NlY3MKKwkgIEZpeGVzICM2MDM1NDcKKworMjAwOS0xMi0wMSAxOToyNDowMiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogcmVzZXQgc2VnbWVudCBpbmZvIGFmdGVyIGZsdXNoCisJICBSZXNldCB0aGUgc2VnbWVudCBpbmZvIGFmdGVyIGEgZmx1c2guIFdlIHVzZSB0aGUgc2VnbWVudCBmb3IgaGFuZGxpbmcgUW9TIGFuZCBpZgorCSAgd2UgZG9uJ3QgcmVzZXQgdGhlIHNlZ21lbnQsIFFvUyBpcyBiYXNpY2FsbHkgZGlzYWJsZWQgYWZ0ZXIgYSBmbHVzaGluZyBzZWVrLgorCisyMDA5LTEyLTAxIDE1OjA3OjA2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDg3YmY0MjggdG8gNDdjYjIzYQorCisyMDA5LTEyLTAxIDE0OjE1OjQ2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGRhNGM3NWMgdG8gODdiZjQyOAorCisyMDA5LTExLTMwIDE1OjU5OjUwICswMTAwICBBdXJlbGllbiBHcmltYXVkIDxnc3RlbHp6IGF0IHlhaG9vIGRvdCBmcj4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogYXZvaWQgYnVmZmVyIHJlZi91bnJlZiBwYWlycyBmb3IgQ1NSQ3MKKwkgIFdlIHJlZiB0aGUgYnVmZmVyIGJlZm9yZSBwdXNoaW5nIGl0IGRvd25zdHJlYW0gaW4gb3JkZXIgdG8gZ2V0IHRoZSBDU1JDcyBvZiBpdAorCSAgYWZ0ZXIgcHVzaGluZy4gVGhpcyBjYXVzZXMgcGVyZm9ybWFuY2UgcHJvYmxlbXMgd2hlbiBkb3duc3RyZWFtIGVsZW1lbnRzIHdhbnQgdG8KKwkgIGNoYW5nZSB0aGUgbWV0YWRhdGEgYmVjYXVzZSB0aGUgYnVmZmVyIG5lZWRzIHRvIGJlIHN1YmJ1ZmZlcmVkLgorCSAgSW5zdGVhZCwgcmVhZCBhbmQgc3RvcmUgdGhlIENTUkNzIG9mIHRoZSBidWZmZXIgaW4gYW4gYXJyYXkgYmVmb3JlIHB1c2hpbmcgaXQKKwkgIGFuZCBwcm9jZXNzIHRoZSBhcnJheSBhZnRlciBwdXNoaW5nIHRoZSBidWZmZXIuIFRoaXMgYWxsb3dzIHVzIHRvIHJlbW92ZSB0aGUKKwkgIHJlZi91bnJlZiBwYWlyLgorCSAgRml4ZXMgIzYwMzM3NgorCisyMDA5LTExLTI4IDE5OjIzOjI2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuaDoKKwkgIHNob3V0MjogdXNlIGdzdHBvbGwgZm9yIHRpbWVvdXRzCisJICBVc2Ugb3VyIG93biBHc3RQb2xsIGJhc2VkIHRpbWVvdXQgaW5zdGVhZCBvZiB0aGUgc2hvdXQgc2xlZXAgc28gdGhhdCB3ZSBjYW4KKwkgIGludGVycnVwdCB3aGVuIGRvaW5nIGEgc3RhdGUgY2hhbmdlIGFuZCBzaHV0dGluZyBkb3duLgorCSAgRml4ZXMgIzYwMjg4NworCisyMDA5LTExLTI4IDEyOjI1OjA2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGNoZWNrOiBmaXggaml0dGVyYnVmZmVyIGNoZWNrCisJICBNYWtlIHN1cmUgd2Ugc2V0IGEgYmFzZV90aW1lIG9uIHRoZSBlbGVtZW50LgorCSAgRml4IHRoZSB0aW1lb3V0IHRvIGF0IGxlYXN0IHR3aWNlIHRoZSBqaXR0ZXJidWZmZXIgbGF0ZW5jeS4KKwkgIEVuYWJsZSBwcmV2aW91c2x5IGZhaWxpbmcgdGVzdHMuCisJICBSZW1vdmUgaW1wb3NzaWJsZSBjaGVja3MuCisKKzIwMDktMTEtMjcgMTg6NTU6MjAgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA1M2EyNDg1IHRvIGRhNGM3NWMKKworMjAwOS0xMS0yNiAxNjoxNDozMCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5oOgorCSAgcnRwaDI2NGRlcGF5OiBvcHRpb25hbGx5IG1lcmdlIE5BTFVzIGludG8gQWNjZXNzIFVuaXRzCisJICAuLi4gd2hpY2ggbWF5IGJlIGV4cGVjdGVkL2Rlc2lyZWQgYnkgc29tZSBkb3duc3RyZWFtIGRlY29kZXJzCisJICAoYW5kIHNwZWMtd2lzZSBoaWdobHkgcmVjb21tZW5kZWQgZm9yIGF0IGxlYXN0IG5vbi1ieXRlc3RyZWFtIG1vZGUpLgorCisyMDA5LTExLTI2IDE3OjI5OjAzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IHRpbWVzdGFtcCBkYXRhdHlwZQorCisyMDA5LTExLTI1IDEwOjM4OjIzIC0wNjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogYXZvaWQgdXNpbmcgd3JvbmcgY2xvY2stcmF0ZQorCSAgQ2hlY2sgZm9yIGEgdmFsaWQgY2xvY2stcmF0ZSBiZWZvcmUgYXR0ZW1wdGluZyB0byBlc3RpbWF0ZSB0aGUgbnB0CisJICBzdG9wIHRpbWUuCisKKzIwMDktMTEtMjUgMTA6Mzc6MzAgLTA2MDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBmaXggdHlwbyBpbiBjb21tZW50cworCisyMDA5LTExLTI1IDE2OjA1OjEwICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVydGVzdDogYWRkIG9uZSBtb3JlIHRlc3QgYW5kIGZpbGUgYSBidWcgbm93CisJICBDSGFuZ2UgdGhlIGJhY2t3YXJkcyB0ZXN0IHRvIGFsd2F5cyBzZW5kIGZpcnN0IGJ1ZmZlciBmaXJzdCB0byBoYXZlIGEgZGVmaW5lCisJICBiYXNldGltZS4gQWRkIGFub3RoZXIgdGVzdCB0aGF0IHNlbmRzIGJ1ZmZlcnMgYmFja3dhcmRzIHRvIGFzc2VydCB0aGF0IG9ubHkKKwkgIGZpcnN0IHNlbnQgYnVmZmVyIGlzIGtlZXAgYW5kIHVzZWQgYXMgYmFzZXRpbWUuIERpc2FibGVkIHRob3NlIHRlc3RzIHN0aWxsLAorCSAgYXMgaXRzIG5vdCBwYXNzaW5nL2ZhaWxpbmcgY29uc2l0ZW50bHkgYW5kIGZpbGUgYSBidWcgZm9yIGppdHRlcmJ1ZmZlci4KKworMjAwOS0xMS0yNSAxMDoxNzozNCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcnRlc3Q6IGltcHJvdmUgdGhlIHRlc3QKKwkgIHRoZSB0ZXN0cyBhcmUgYSBiaXQgbW9yZSBzb2xpZCBub3cgYnV0IHN0aWxsIG5vdCBwcm9kdWNlIHJlbGlhYmxlIHJlc3VsdHMuCisJICBXb25kZXIgaWYgdGhleSBhcmUgc3RpbGwgZmxhd2t5IG9yIGlmIGl0cyBhIGJ1ZyBpbiBqaXR0ZXJidWZmZXIuCisKKzIwMDktMTEtMjQgMTE6MTM6MDYgLTA4MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEBzb25nYmlyZG5lc3QuY29tPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgbXVsdGl1ZHBzaW5rOiByZXR1cm4gZXJyb3IgbWVzc2FnZSBvbiB3aW5kb3dzIHRvby4KKworMjAwOS0xMS0yNCAxMDo1ODo0OSAtMDgwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHNvbmdiaXJkbmVzdC5jb20+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICBtdWx0aXVkcHNpbms6IGZpcnN0IHBoYXNlIG9mIGZpeGluZyB1cCBlcnJvciByZXBvcnRpbmcgZm9yIHdpbmRvd3MuCisKKzIwMDktMTAtMzAgMDM6MTM6NTQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBhbHNvIHNldCB0aGUgc3VnZ2VzdGVkIGJ1ZiBzaXplIGZvciBhdWRpbworCSAgV2Ugd2VyZSBvbmx5IHNldHRpbmcgdGhlIHN1Z2dlc3RlZCBidWYgc2l6ZSBmb3IgdmlkZW8sCisJICB3ZSBjYW4gc2V0IGl0IGZvciBhdWRpbyBhcyB3ZWxsLgorCSAgVGhpcyBhbmQgMTk1ZTE0NTI5ZDgwZWYzMThjZTNhNzc4YzE5OTVlZmIxMWYyNjZjZAorCSAgZml4IGFuIGlzc3VlIHRoYXQgcHJldmVudGVkIHNlZWtpbmcgb24gbGFyZ2UgYXZpIGZpbGVzCisJICBvbiBXTVAgKG5vbi1yZWNlbnQgdmVyc2lvbnMpLgorCisyMDA5LTExLTA0IDE2OjEwOjIzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4Lmg6CisJICBhdmltdXg6IGZpeCBpbmR4IGR1cmF0aW9uIGZvciBQQ00gYXVkaW8KKwkgIEdzdEJ1ZmZlcnMgZm9yIFBDTSBhdWRpbyB1c3VhbGx5IGNvbnRhaW5zIG1vcmUgdGhhbgorCSAgMSBzYW1wbGUsIHdlIG5lZWQgdG8gZ2V0IHRoZSB0b3RhbCBudW1iZXIgb2Ygc2FtcGxlcyB0byBzZXQKKwkgIHRoZSBpbmR4IGR1cmF0aW9uLgorCisyMDA5LTExLTA0IDE2OjA0OjEwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogQXVkaW8gYnVmZmVycyBzaG91bGQgYmUgcGlja2VkIGVhcmxpZXIKKwkgIEFkZHMgYSAwLjVzIGFkdmFudGFnZSBmb3IgYXVkaW8gYnVmZmVycyB0byBiZWluZworCSAgcGlja2VkIGVhcmxpZXIgZm9yIG11eGluZy4KKworMjAwOS0xMS0yNCAxNjo0MDoxOSArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBGaXggcHVzaCBtb2RlIGJ5IG1ha2luZyBzdXJlIHN0YmwgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGluIG5leHRfZW50cnlfc2l6ZSAoKQorCisyMDA5LTExLTI0IDE2OjM1OjIwICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBvcmRlciBvZiBhcmd1bWVudHMgaW4gbG9nIG1lc3NhZ2UKKworMjAwOS0xMS0yNCAxNTo1MToyMSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJICBqcGVnZW5jOiBmaXggc3BlbGxpbmcgaW4gY29tbWVudAorCisyMDA5LTExLTIzIDE3OjU4OjE3ICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIGJ1aWxkIHN5c3RlbTogRml4IHdyb25nbHkgY29tbWl0dGVkIGNoYW5nZSB0byBjb21tb24vCisKKzIwMDktMTEtMTAgMTA6MjY6MDcgKzAxMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRWFzZSBkZWJ1Z2dpbmcgYnkgcmVtb3ZpbmcgYSBnb3RvIGZvciBhbiBlcnJvciBtZXNzYWdlCisKKzIwMDktMTEtMTQgMTU6NTI6MDkgKzAxMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogUGFyc2UgcGVyIHNhbXBsZSByYXRoZXIgdGhhbiBhbGwgYXQgb25jZSBidXQgYnVpbGQgY29tcGxldGUgaW5kZXggd2hlbiBzZWVraW5nCisKKzIwMDktMTEtMDQgMTc6MzE6MTUgKzAxMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogU2F2ZSBhdG9tIGRhdGEgZm9yIGxhdGVyIHVzZSBzbyBpdCBkb2Vzbid0IGdldCBmcmVlZCBhZnRlciBpbml0aWFsIHBhcnNpbmcKKworMjAwOS0xMS0wNiAxMTowMDowNCArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBQYXJzZSBmcm9tIHRoZSBwcmV2aW91c2x5IHBhcnNlZCBzYW1wbGUgdXAgdG8gc2FtcGxlIG4KKworMjAwOS0xMS0wNCAxNzowNDoyMiArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBNYWtlIHF0ZGVtdXhfcGFyc2Vfc2FtcGxlcyAoKSBwYXJzZSB1cCB0byBuIHNhbXBsZXMKKworMjAwOS0xMC0yOCAxNzo0OTowMiArMDAwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBTZXBhcmF0ZSBvZmYgc3RibCBzdWItYXRvbSBpbml0aWFsaXNhdGlvbgorCisyMDA5LTEwLTI2IDIyOjQyOjM2ICswMDAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IE1vdmUgdmFyaWFibGVzIGludG8gY29udGV4dCBpbiBwcmVwYXJhdGlvbiBmb3IgcmVmYWN0b3Jpc2F0aW9uCisKKzIwMDktMTAtMjYgMjA6MzY6MDggKzAwMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IGJ1ZyB3aGVyZSBzdHBzIGlzIG5ldmVyIHBhcnNlZCBkdWUgdG8gbG9naWMgZXJyb3IKKworMjAwOS0xMS0wNCAxNzozMToxNSArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBQb3J0IGN0dHMgZnJvbSBHbm9kZSAqIHRvIEdzdEJ5dGVSZWFkZXIKKworMjAwOS0xMC0yMyAxMzowNjo0NCArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AZ21haWwuY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGF0b21wYXJzZXIuaDoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZHVtcC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmg6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X3R5cGVzLmg6CisJICBxdGRlbXV4OiBTd2l0Y2ggZnJvbSBRdEF0b21QYXJzZXIgdG8gR3N0Qnl0ZVJlYWRlcgorCisyMDA5LTExLTIzIDEyOjUzOjUwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggdHlwbyBhbmQgZ3JhbW1hcgorCisyMDA5LTExLTIyIDE5OjMwOjU4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvTWFrZWZpbGUuYW06CisJICBDbGVhbiB1cCBMREZMQUdTLCBMSUJTLCBDRkxBR1MKKwkgIEZpeCBvcmRlciwgZml4IHZhcmlhYmxlcyB0aGF0IGRvbid0IGV4aXN0LCBsaWtlIEdTVF9MSUJTX0xJQlMsCisJICB1c2UgJChMSUJNKSBpbnN0ZWFkIG9mIC1sbSwgYW5kIG1vdmUgX0xJQlMgZnJvbSBMREZMQUdTIHRvIExJQkFERC4KKwkgIFNwb3R0ZWQgYnkgSGF2YXJkIEdyYWZmLgorCisyMDA5LTExLTIwIDEwOjMxOjQ3IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSogZ3N0L2R0bWYvdG9uZV9kZXRlY3QuaDoKKwkgIGR0bWY6IFVzZSBfc3RkaW50LmggZnJvbSBjb25maWd1cmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MDI0NjUKKworMjAwOS0xMS0yMCAxMDozMDowMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IGZpeCB0eXBvIGluIG1vZGUgZW51bSBkZXNjcmlwdGlvbgorCisyMDA5LTExLTIwIDExOjI1OjQ5ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgZG9jczogbW9yZSBsaW5rcyBhbmQgYmV0dGVyIHNob3J0IGRlc2NyaXB0aW9uCisJICBGaXggc3BlbGxpbmcgb2YgR3N0UnRwU3NyY0RlbXV4IHRvIGdldCBpdCBsaW5rZWQuIEFkZCBtb3JlIGxpbmtzLiBDaGFuZ2UKKwkgIHRoZSBzaG9ydCBkZXNjcmlwdGlvbiB0byBiZSBtb3JlIG1lYW5pbmdmdWwuCisKKzIwMDktMTEtMjAgMDk6NTg6MjYgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrcGFyc2UuYzoKKwkgIHdhdnBhY2twYXJzZTogRml4IHVuaXQgdGVzdCBmb3IgcmVjZW50IHBvc2l0aW9uIHJlcG9ydGluZyBjaGFuZ2VzCisKKzIwMDktMTEtMTkgMjA6MzM6MDcgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvdG9uZV9kZXRlY3QuYzoKKwkqIGdzdC9kdG1mL3RvbmVfZGV0ZWN0Lmg6CisJICBkdG1mOiBVcGRhdGUgZHRtZmRldGVjdCB0byBtYWtlIGl0IE1TVkMgZnJpZW5kbHkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MDI0NjUKKworMjAwOS0xMS0xOSAxNjowOTozOCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgd2F2cGFja3BhcnNlOiBBZnRlciBwdXNoaW5nIGEgZnJhbWUsIHVwZGF0ZSBsYXN0X3N0b3AgdG8gdGhlIGVuZCBvZiB0aGUgZnJhbWUKKwkgIFRoaXMgaW1wcm92ZXMgcG9zaXRpb24gcmVwb3J0aW5nLCBlc3BlY2lhbGx5IGJlY2F1c2Ugb2YgdGhlIGZhY3QgdGhhdAorCSAgV2F2UGFjayBmcmFtZXMgYXJlIHVzdWFsbHkgMC41LTEuMCBzZWNvbmRzIGxvbmcuCisKKzIwMDktMTEtMTkgMTY6MDg6MzMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgIHdhdnBhY2twYXJzZTogQWxsb3cgcHVsbGluZyB0aGUgbGFzdCBXYXZQYWNrIGZyYW1lIG9mIGEgZmlsZQorCSAgQmVjYXVzZSBvZiBhID49IGluc3RlYWQgb2YgYSA+LCB0aGF0IGxhc3QgZnJhbWUgb2YgYSBXYXZQYWNrIGZpbGUKKwkgIHdvdWxkIG5ldmVyIGJlIHBhcnNlZCBpbiBwdWxsIG1vZGUuCisKKzIwMDktMTEtMTkgMTA6MzA6NDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMDcwMmZlMSB0byA1M2EyNDg1CisKKzIwMDktMTAtMjkgMDg6Mjk6MzggLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2ZvdXJjYy5oOgorCSAgcXRkZW11eDogQWRkIG1vcmUgZmllbGRzIHRvIFNWUTMgY2FwcworCSAgcXRkZW11eCBvbmx5IGFkZGVkIHRoZSB3aG9sZSBzdHNkIGF0b20gYXMgJ2NvZGVjX2RhdGEnCisJICBpbiBpdHMgb3V0cHV0IGNhcHMgZm9yIFNWUTMuIFRoaXMgcGF0Y2ggbWFrZXMgaXQgYWRkCisJICB0aGUgU0VRSCAoaW5zaWRlIGEgU01JIGF0b20pIGFuZCBhIGdhbW1hIGZpZWxkICh0YWtlbgorCSAgZnJvbSB0aGUgZ2FtYSBhdG9tKSBpZiBhdmFpbGFibGUuCisJICBGaXhlcyAjNTg3OTIyCisKKzIwMDktMTEtMTggMTc6NTU6NDIgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6CisJICB3YXZlbmM6IFJhaXNlIHJhbmsgb2YgbXV4ZXIgdG8gUFJJTUFSWQorCisyMDA5LTExLTE4IDE3OjU0OjE2ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgeTRtOiBSYWlzZSByYW5rIG9mIGVuY29kZXIgdG8gUFJJTUFSWQorCisyMDA5LTExLTE4IDE3OjU0OjAyICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvbGF3L2FsYXcuYzoKKwkqIGdzdC9sYXcvbXVsYXcuYzoKKwkgIGxhdzogUmFpc2UgcmFuayBvZiBlbmNvZGVycyB0byBQUklNQVJZCisKKzIwMDktMTEtMTIgMTk6MTE6MTggKzAwMDAgIEJhc3RpZW4gTm9jZXJhIDxoYWRlc3NAaGFkZXNzLm5ldD4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgQWRkIHVzZXItaWQgYW5kIHVzZXItcHcgcHJvcGVydGllcworCSAgU28gdGhhdCBvbmUgZG9lc24ndCBuZWVkIHRvIG1vZGlmeSB0aGUgVVJMIHRvIGhhdmUgYWNjZXNzCisJICB0byBhdXRoZW50aWNhdGVkIFJUU1Agc3RyZWFtcy4KKwkgIGZpeGVzICM2MDE3MjgKKworMjAwOS0xMS0xOCAxMjoyMjoxMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiB1c2UgYWNxdWlyZWQgZmxhZyB3aGVuIGNoZWNraW5nIHZhbGlkIHN0YXRlCisJICBVc2UgdGhlIGFjcXVpcmVkIGZpZWxkIG9mIHRoZSByaW5nYnVmZmVyIGluIGdldF90aW1lIHRvIGtub3cgd2hlbiB3ZSBhcmUgaW4gYW4KKwkgIGludmFsaWQgc3RhdGUuIFdlIGRvbid0IGNsZWFyIHRoZSByYXRlIGZsYWcgd2hlbiByZWxlYXNpbmcgdGhlIHJpbmdidWZmZXIgc28KKwkgIHRoaXMgdmFsdWVzIGlzIG5vdCB1c2FibGUuCisJICBBdm9pZHMgc29tZSBlcnJvciBtZXNzYWdlcyBiZWluZyBwb3N0ZWQgYmVjYXVzZSB0aGUgcHVsc2VhdWRpbyBjb25uZWN0aW9uIGlzCisJICBkb3duLgorCisyMDA5LTExLTE4IDEwOjE3OjAyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBidW1wIGNvcmUgcmVxdWlyZW1lbnQgdG8gMC4xMC4yNS4xIGFzIHdlbGwKKwkgIE1ha2UgaW1wbGljaXQgcmVxdWlyZW1lbnQgZXhwbGljaXQuCisKKzIwMDktMTEtMTggMTI6NTM6NDQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggYm9ndXMgbWVtb3J5IGNodW5rIHNpemUgY2hlY2sKKworMjAwOS0xMS0xOCAxMjowMTo1MiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBpbXBsZW1lbnQgc29tZSBtb3JlIGNhbGxiYWNrcworCSAgSW1wbGVtZW50IHNvbWUgbW9yZSBjYWxsYmFja3MgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKworMjAwOS0xMS0xMSAxNTo1MDoxOSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHJlbGVhc2UgbG9jayBiZWZvcmUgZW1pdGluZyBzaWduYWxzCisJICBSZWxlYXNlIHRoZSBqYnVmIGxvY2sgYmVmb3JlIGVtaXRpbmcgdGhlIHJlcXVlc3QtcHQtbWFwIHNpZ25hbCB0byBhdm9pZAorCSAgZGVhZGxvY2tzLiBXZSBhbHNvIG5lZWQgdG8gY2F0Y2ggdGhlIHNodXRkb3duIGNhc2Ugd2hlbiBsb2NraW5nIGFnYWluLgorCSAgRml4ZXMgIzU5MzM1NAorCisyMDA5LTExLTExIDExOjU5OjE2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBidmRlcGF5Lmg6CisJICBydHA6IGFkZCBCcm9hZGNvbVZvaWNlIGRlcGF5bG9hZGVyCisKKzIwMDktMTEtMTEgMTE6Mzg6MzYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkgIHJ0cGJ2cGF5OiBhZGQgcmZjIHJlZmVyZW5jZQorCisyMDA5LTExLTExIDExOjM3OjA3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuaDoKKwkgIHJ0cDogYWRkIEJyb2FkY29tVm9pY2UgcGF5bG9hZGVyCisKKzIwMDktMTEtMDkgMTI6MTc6MzQgKzAxMDAgIEphbiBVcmJhxYRza2kgPHd1bGN6ZXJAd3VsY3plci5vcmc+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IHByb3Blcmx5IGZpbmlzaCB0aGUgRUNNQSBhcnJheQorCSAgVGhlIEVDTUEgYXJyYXkgd2l0aCB0aGUgZmlsZSBpbmRleCB3YXMgbWlzc2luZyBhIG1hbmRhdG9yeSBlbmQgbWFya2VyLgorCSAgRml4ZXMgYnVnICM2MDEyNDIuCisKKzIwMDktMTEtMTggMDI6MTU6MTUgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBVc2UgbmV3IHN0aWxsLWZyYW1lIEFQSSBmcm9tIGdzdC1wbHVnaW5zLWJhc2UKKworMjAwOS0xMS0xOCAwMjoxNDo0NiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJICBCdW1wIGdzdC1wbHVnaW5zLWJhc2UgcmVxdWlyZW1lbnQgdG8gMC4xMC4yNS4xCisKKzIwMDktMTEtMTcgMTc6NTk6MTMgLTA4MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEBzb25nYmlyZG5lc3QuY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBpZGVudGlmeSBJTUEgYWRwY20gaW4gcXQgcHJvcGVybHkuCisKKzIwMDktMTEtMTggMDE6Mjc6MzcgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgQmFjayB0byBkZXZlbG9wbWVudCAtPiAwLjEwLjE3LjEKKworMjAwOS0xMS0xNyAwMTo1MzowOCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJICBBZGQgcmVsZWFzZSAwLjEwLjE3IHRvIHRoZSBkb2FwIGZpbGUKKworPT09IHJlbGVhc2UgMC4xMC4xNyA9PT0KKworMjAwOS0xMS0xNyAwMToyNTozMCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5zaWduYWxzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJICBSZWxlYXNlIDAuMTAuMTcKKworMjAwOS0xMS0xNyAwMDoxODoyMiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDA5LTExLTEzIDAyOjA3OjI1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjE2LjMgcHJlLXJlbGVhc2UKKworMjAwOS0xMS0xMCAxMTo1MjoyNCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IE1ha2Ugc3VyZSB0byBpbml0aWFsaXplIHZhcmlhYmxlcyBiZWZvcmUgdXNpbmcgdGhlbQorCisyMDA5LTExLTA5IDIwOjA2OjAzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIENoYW5nZUxvZzoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjE2LjIgcHJlLXJlbGVhc2UKKworMjAwOS0xMS0wOSAxNToyMDowMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGZyZWUgdGVtcG9yYXJ5IGJ1ZmZlciB3aGVuIGNoYW5naW5nIHN0YXRlIHRvIE5VTEwKKwkgIEZyZWUgdGVtcG9yYXJ5IGFsbG9jYXRpb25zIGluIHRoZSBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24gYW5kIG5vdAorCSAgb25seSB3aGVuIHRoZSBvYmplY3QgaXMgZmluYWxpc2VkLgorCisyMDA5LTExLTA5IDExOjQwOjI1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAganBlZ2RlYzogb25seSBhbGxvY2F0ZSBhcyBtdWNoIHRlbXBvcmFyeSBtZW1vcnkgYXMgbmVlZGVkIGZvciBpbmRpcmVjdCBkZWNvZGluZworCSAgV2hlbiB3ZSBjYW4ndCBkZWNvZGUgZGlyZWN0bHkgaW50byB0aGUgb3V0cHV0IGJ1ZmZlciwgbWFrZSBvdXIgdGVtcCBidWZmZXJzCisJICBvbmx5IGFzIGJpZyBhcyBuZWVkZWQgaW5zdGVhZCBvZiBhbGxvY2F0aW5nIGZvciB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbyAod2VsbCwKKwkgIHdlIHN0aWxsIGFsbG9jIG1vcmUgdGhhbiBzdHJpY3RseSBuZWVkZWQgZm9yIHNvbWUgY2FzZXMsIGJ1dCBzaWduaWZpY2FudGx5CisJICBsZXNzIHRoYW4gYmVmb3JlKS4KKworMjAwOS0xMS0wNSAyMzo0Njo1OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogcHJpbnRmIGZvcm1hdCBmaXgKKworMjAwOS0xMS0wNSAyMzo0NDoyNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9yYXcxMzk0L2dzdDEzOTRjbG9jay5jOgorCSogZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5jOgorCSAgcmF3MTM5NDogcHJpbnRmIGZvcm1hdCBmaXhlcworCisyMDA5LTExLTA1IDIzOjQwOjE1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIGVxdWFsaXplcjogcHJpbnRmIGZvcm1hdCBmaXgKKworMjAwOS0xMS0wNCAyMjoxOTo1OCAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9NYWtlZmlsZS5hbToKKwkqIGdzdC9kdG1mL2dzdGR0bWYuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZkZXRlY3QuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZkZXRlY3QuaDoKKwkqIGdzdC9kdG1mL3RvbmVfZGV0ZWN0LmM6CisJKiBnc3QvZHRtZi90b25lX2RldGVjdC5oOgorCSAgZHRtZmRldGVjdDogQWRkIERUTUYgdG9uZSBkZXRlY3RvcgorCSAgSXQgbG9va3MgYXQgcmF3IGF1ZGlvIGRhdGEgYW5kIGVtaXRzIG1lc3NhZ2VzIHdoZW4gRFRNRiBpcyBkZXRlY3RlZC4KKwkgIFRoZSBkdG1mIGRldGVjdG9yIGlzIHRoZSBzYW1lIEdvZXJ0emVsIGltcGxlbWVudGF0aW9uIHVzZWQgaW4gRnJlZVN3aXRjaAorCSAgYW5kIEFzdGVyaXNrLiBJdCBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4KKworMjAwOS0xMS0wNSAxMjoxMzo0NCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IGRvIG5vdCB3cml0ZSBlbXB0eSBJTkZPIGxpc3QKKwkgIGF2b2lkIHdyaXRpbmcgYW4gZW1wdHkgSU5GTyBsaXN0IGNodW5rLCBib3RoIGJlY2F1c2UKKwkgIGl0IGlzIHVzZWxlc3MgYW5kIGJlY2F1c2UgdmxjIHJlZnVzZXMgdG8gcGxheSB0aGUKKwkgIHJlc3VsdGluZyBmaWxlLgorCisyMDA5LTExLTA1IDEwOjU0OjEyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIGVxdWFsaXplcjogTm90aWZ5IGFib3V0IGJhbmQgcHJvcGVydHkgY2hhbmdlcyBjYXVzZWQgYnkgY2hhbmdpbmcgbnVtYmVyIG9mIGJhbmRzCisKKzIwMDktMTEtMDUgMTA6NDU6NTkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuaDoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVybmJhbmRzLmM6CisJICBlcXVhbGl6ZXI6IE1ha2UgY2hhbmdlcyB0byBiYW5kIHByb3BlcnRpZXMgYW5kIHRoZSBudW1iZXIgb2YgYmFuZHMgdGhyZWFkc2FmZQorCisyMDA5LTExLTA1IDEwOjMwOjQ2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIGVxdWFsaXplcjogRml4IHN0dXBpZCBvZmYgYnkgdHdvIGJ1ZworCisyMDA5LTExLTA1IDA4OjE4OjA1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIGVxdWFsaXplcjogQWRkIGJhbmQgcHJvcGVydHkgdG8gc2VsZWN0IHRoZSBiYW5kIGZpbHRlciB0eXBlCisJICBUaGlzIGFsbG93cyBwZXIgYmFuZCBjb25maWd1cmF0aW9uIG9mIGEgcGVhaywgbG93IHNoZWxmIG9yCisJICBoaWdoIHNoZWxmIGZpbHRlciwgd2hpY2ggY2FuIGJlIHZlcnkgdXNlZnVsIGlmIHRoZSBiYW5kIGZyZXF1ZW5jaWVzCisJICBhbmQgd2lkdGhzIGFyZSBtYW51YWxseSBjb25maWd1cmVkLgorCisyMDA5LTExLTA1IDA4OjE3OjUzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIGVxdWFsaXplcjogRml4IGNvZGUgc3R5bGUKKworMjAwOS0xMS0wNSAwODowMzoxMyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjEwYmFuZHMuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5jOgorCSAgZXF1YWxpemVyOiBTb21lIGNsZWFudXAKKworMjAwOS0xMS0wNCAyMjoyMTozNSAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJICBkdG1mc3JjOiBSZWplY3QgZW1wdHkgY2FwcworCisyMDA5LTExLTA0IDIyOjIxOjIyIC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIGR0bWZzcmM6IFVzZSBsb2cgbGV2ZWwgZm9yIHJlcGVhdGVkIGRlYnVnIG1lc3NhZ2VzCisKKzIwMDktMTEtMDQgMjA6MDU6MTcgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgZHRtZnNyYzogQWxsb3cgZm9yIGFueSBzYW1wbGVyYXRlCisKKzIwMDktMTAtMDcgMDk6MzE6MTkgLTA0MDAgIEdhYnJpZWwgTWlsbGFpcmUgPGdhYnJpZWwubWlsbGFpcmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmM6CisJICBjZWx0cGF5L2RlcGF5IDogY2hhbmdlIEdTVF9ERUJVR19PQkpFQ1QgdG8gR1NUX0xPR19PQkpFQ1QgaW4gcGF5X2hhbmRsZV9idWZmZXIgYW5kIGRlcGF5X3Byb2Nlc3MKKworMjAwOS0xMC0wMiAxNzowNDo0MyAtMDQwMCAgR2FicmllbCBNaWxsYWlyZSA8Z2FicmllbC5taWxsYWlyZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmM6CisJICBjZWx0cGF5L2RlcGF5OiBOZWdvdGlhdGUgcGFyYW1ldGVycyB0aHJvdWdoIGNhcHMKKwkgIGNlbHRkZXBheSA6IGFkZGVkIGRlZmF1bHQgZnJhbWVzaXplKDQ4MCkgY2hhbm5lbHMoMSkgYW5kIGNsb2NrcmF0ZSgzMjAwMCkKKwkgIGRlcGF5X3NldGNhcHMgOiBub3cgZ2V0cyBjaGFubmVscyBhbmQgZnJhbWVzaXplIGZyb20gc3RyaW5nIHdpdGggZGVmYXVsdCB2YWx1ZQorCSAgZGVwYXlfcHJvY2VzcyA6IG5vdyBhZGRzIHRpbWVzdGFtcCB0byBvdXRidWYKKwkgIEFkZGVkIGZyYW1lX3NpemUgdG8gR3N0UnRwQ2VsdERlcGF5CisJICBDaGFuZ2VkIHNvbWUgR1NUX0RFQlVHIHRvIEdTVF9ERUJVR19PQkpFQ1Qgb3IgR1NUX0xPR19PQkpFQ1QKKwkgIGNlbHRwYXkgOiBnZXRjYXBzIDogZ2V0cyBjaGFubmVsIGFuZCBmcmFtZXNpemUgYW5kIHNldHMgY2FwcworCSAgQWRkZWQgZnJhbWUtc2l6ZSB0byBzdGF0aWMgY2FwcyBmb3IgYXVkaW8veC1jZWx0CisKKzIwMDktMTEtMDQgMTU6NTg6MzQgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogZ3N0L2RlaW50ZXJsYWNlL01ha2VmaWxlLmFtOgorCSAgZGVpbnRlcmxhY2U6IFB1bGwgaW4gQ0ZMQUdTIGFuZCBMSUJTIGZsYWdzIGZyb20gLWJhc2UgYmVmb3JlIGNvcmUgYmVmb3JlIHN5c3RlbS4KKworMjAwOS0xMC0xNSAxNjozMzoyNCArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBwby9NYWtldmFyczoKKwkgIHBvOiBEb24ndCBjcmVhdGUgYmFja3VwIC5wbyBmaWxlcworCSAgQXMgd2VsbCBhcyBwcmV2ZW50aW5nIGNyZWF0aW9uIG9mIHVzZWxlc3MgYmFja3VwIGZpbGVzLCBpdCB3b3JrcworCSAgYXJvdW5kIGEgYnVnIGluIGdldHRleHQgMC4xNyBvbiBPUy9YCisKKzIwMDktMTEtMDQgMTY6NDc6NDIgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAaWhhdGVzdGV2ZS5sb2NhbD4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6CisJICBxdGRlbXV4OiBpbml0IHZhcmlhYmxlcyB0byBtYWtlIGNvbXBpbGVyIG9uIG9zeCBidWlsZCBib3QgaGFwcHkKKworMjAwOS0xMS0wMyAxNjowNDozNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZHVtcC5jOgorCSAgcXRkZW11eDogaW5pdCB2YXJpYWJsZXMgdG8gbWFrZSBjb21waWxlciBvbiBvc3ggYnVpbGQgYm90IGhhcHB5CisKKzIwMDktMTEtMDMgMTc6MzU6MTUgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAganBlZ2RlYzogZG9uJ3QgYWxsb2NhdGUgYmlnIGFycmF5cyBvbiB0aGUgc3RhY2sKKwkgIEFkZCB0aGUgYXJyYXlzIHRvIHRoZSBpbnN0YW5jZSBkYXRhIGFuZCBhbGxvY2F0ZSBvbiBmaXJzdCB1c2UuCisKKzIwMDktMTEtMDEgMTU6NTc6NDQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiByZW1vdmUgcG9pbnRsZXNzIGNhbGwgdG8gZ3N0X2VsZW1lbnRfbm9fbW9yZV9wYWRzKCkKKworMjAwOS0xMS0wMSAwMDoyOTo1NyArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIGxldmVsOiBmaXggZGVjYXkgdG8gYmUgc21vb3RoCisJICBUaGUgbGVuZ3RoIG5vdCBoYXZpbmcgYW55IGZyYWN0aW9uYWwgcGFydCBhcyBpdCB3YXMgcHJvbW90ZWQgdG8gZ2RvdWJsZSBhZnRlcgorCSAgZGl2aWRpbmcgdHdvIGd1aW50NjQuCisKKzIwMDktMTEtMDEgMDA6Mjk6MjQgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuaDoKKwkgIGxldmVsOiBjYWxjdWxhdGUgdGhlIG1lc3NhZ2UtaW50ZXJ2YWxsIHdoZW4gaXQgY2hhbmdlcworCisyMDA5LTExLTAxIDAwOjE0OjA4ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgbGV2ZWw6IGNsb2NrdGltZSBpcyBhIGd1aW50NjQsIHVzZSByaWdodCBtYWNybyB0byBpbml0IGZpZWxkcworCisyMDA5LTExLTAxIDAwOjEwOjAxICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgbGV2ZWw6IHVzZSBtb3JlIGctc3R5bGUgdHlwZXMKKworMjAwOS0xMC0zMCAwOToyNzo1OSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogT25seSBzZXQgdGhlIHZvbHVtZSBvbiBzdHJlYW0gY29ubmVjdGlvbiBpZiBwdWxzZSA+PSAwLjkuMjAgaXMgYXZhaWxhYmxlCisJICBJbiBvbGRlciB2ZXJzaW9ucyB0aGUgdm9sdW1lIHNldCBkdXJpbmcgc3RyZWFtIGNvbm5lY3Rpb24gaGFkCisJICBubyBkZWZpbmVkIHNlbWF0aWMgYW5kIHVzdWFsbHkgaXQgd2FzIGEgcmVsYXRpdmUgdm9sdW1lLiBXaGF0CisJICB3YXMgbmVlZGVkIGZvciBvdXIgdXNlIGNhc2UgaXMgYW4gYWJzb2x1dGUgdm9sdW1lIHRob3VnaCwgb3RoZXJ3aXNlCisJICB0aGUgdm9sdW1lIHdpbGwgYmUgYWx3YXlzIGRlY3JlYXNlZCBvbiBzdHJlYW0gY29ubmVjdGlvbiBpZiBpdCdzCisJICBsZXNzIHRoYW4gMTAwJS4KKwkgIFNpbmNlIHB1bHNlIDAuOS4yMCB0aGF0IHZvbHVtZSBpcyBhbHdheXMgYW4gYWJzb2x1dGUgdm9sdW1lIGlmCisJICBmbGF0IHZvbHVtZXMgYXJlIHVzZWQgYW5kIHJlbGF0aXZlIG90aGVyd2lzZSwgd2hpY2ggaXMgdGhlIHNhbWUKKwkgIGFzIGZvciBwYV9jb250ZXh0X3NldF9zaW5rX2lucHV0X3ZvbHVtZSgpLgorCSAgUmVsZXZhbnQgcHVsc2UgY2hhbmdlc2V0czoKKwkgIGh0dHA6Ly9naXQuMHBvaW50ZXIuZGUvP3A9cHVsc2VhdWRpby5naXQ7YT1jb21taXQ7aD1mMjdhNTA2OTFjOGZlNDViYWM3ZGQ2YjIxZmFjOTFhMzU5ZGVmM2ExCisJICBodHRwOi8vZ2l0LjBwb2ludGVyLmRlLz9wPXB1bHNlYXVkaW8uZ2l0O2E9Y29tbWl0O2g9MjUwMTY4NzU3OWUzNTlkNTAzMmE0ZDE2NWIyZmZjOGY1YjFiOGJhNgorCisyMDA5LTEwLTI3IDE4OjA3OjE4ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogdXNlIHNlZ21lbnRfZnVsbCB3aGVuIHdlIGNhbgorCSAgVXNlIHNlZ21lbnRfZnVsbCBzbyB0aGF0IHdlIGNhbiBwYXNzIHRoZSBhcHBsaWVkIHJhdGUgdG8gdGhlIHNlZ21lbnQgdmFsdWVzLiBXZQorCSAgd2lsbCBjaGFuZ2UgdGhlIGFwcGxpZWQgcmF0ZSB3aGVuIHdlIGltcGxlbWVudCBza2lwIG1vZGUuCisKKzIwMDktMTAtMTggMDA6MTY6MDYgKzAxMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGdtYWlsLmNvbT4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkgIHdhdmVuYzogRml4IGJ1ZmZlciBvZmZzZXQgYnkgbW92aW5nIGxlbmd0aCBpbmNyZW1lbnRhdGlvbgorCisyMDA5LTEwLTIzIDE4OjMxOjE0IC0wNzAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiBDcmVhdGUgdGhlIHZpZGVvIE5TVmlldyBpbiBSRUFEWS0+UEFVU0VEIHJhdGhlciB0aGFuIE5VTEwtPlJFQURZCisKKzIwMDktMTAtMjMgMTg6Mjg6MjIgLTA3MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEBzb25nYmlyZG5lc3QuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vTWFrZWZpbGUuYW06CisJICBvc3h2aWRlbzogZXhwbGljaXRseSBsaW5rIHRvIEdTVF9MSUJTCisKKzIwMDktMTAtMjMgMTg6MDk6NDMgLTA3MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEBzb25nYmlyZG5lc3QuY29tPgorCisJKiBnc3QvYXZpL01ha2VmaWxlLmFtOgorCSogZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtOgorCSogZ3N0L3dhdnBhcnNlL01ha2VmaWxlLmFtOgorCSAgQWRkIGRlcGVuZGVuY2llcyBvZiBnc3RyaWZmIHRvIHRoaW5ncyB0aGF0IGxpbmsgdG8gZ3N0cmlmZiwgbmVlZGVkIG9uIFdpbjMyLgorCisyMDA5LTEwLTIzIDE3OjI1OjE3IC0wNzAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWFsc2FzcmMtUENNQS5jOgorCSAgcnRwIGV4YW1wbGVzOiByZW1vdmUgZXhlY3V0YWJsZSBiaXRzIGZyb20gQyBmaWxlcy4KKworMjAwOS0xMC0yMyAxMToyMTo0NCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgdGVzdHM6IGRpc2FibGUgYWxsIGppdHRlcmJ1ZmZlciB0ZXN0cyBmb3Igbm93CisJICBTaW5jZSBldmVuIHRoZSBvbmUgZW5hYmxlZCBzZWVtcyB0byBmYWlsLgorCisyMDA5LTEwLTIyIDEzOjM5OjU4ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgdGVzdHM6IGFsc28gaW5jbHVkZSB0aGUgbmV3IHRlc3QgZm9yIHByZXYgY29tbWl0CisKKzIwMDktMTAtMjIgMTM6MTk6MDcgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJICB0ZXN0czogYWRkIGEgaml0dGVyYnVmZmVyIHRlc3QKKwkgIFRlc3RzIHB1c2hpbmcgYSBmZXcgYnVmZmVycyBpbiB2YXJpb3VzIG9yZGVyIGFuZCBhc3NlcnRpbmcgdGhlIG9yZGVyIHNlbnQgYnkgdGhlCisJICBqaXR0ZXJidWZmZXIuIENvbnRhaW5zIHR3byBkaXNhYmxlZCB0ZXN0cyB0aGF0IG5lZWQgbW9yZSB3b3JrLgorCisyMDA5LTEwLTIyIDEyOjMwOjE0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IERpcmFjICJtdXhpbmciIHVuaXRzIGVuZCBvbiBFT1MgdG9vCisJICBBIERpcmFjIG11eGluZyB1bml0IGFyZSBhbGwgbm9uLXBpY3R1cmUsIG5vbi1lbmQtb2Ytc2VxdWVuY2UKKwkgIHBhY2tldHMgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgZmlyc3QgcGljdHVyZSBvciBlb3MgcGFja2V0LgorCSAgU2VlIGh0dHA6Ly93d3cuZGlyYWN2aWRlby5vcmcvd2lraS9pbmRleC5waHAvQ29udGFpbmVyRm9ybWF0TWFwcGluZ0d1aWRlbGluZXMKKworMjAwOS0xMC0yMiAwMjowOTowOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggY29tcGlsYXRpb24gd2l0aCBkZWJ1Z2dpbmcgZGlzYWJsZWQKKwkgIHRvdGFsX2lkeCBpcyBhbHdheXMgZXZhbHVhdGVkLgorCisyMDA5LTEwLTE5IDIxOjU5OjQ2ICswMzAwICBQcmlpdCBMYWVzIDxwbGFlc0BwbGFlcy5vcmc+CisKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmg6CisJICBjYWNhc2luazogbWlub3IgY2xlYW51cHMgZm9yIGhlYWRlci4KKwkgIFVzZSBHX0JFR0lOX0RFQ0xTIG1hY3JvcywgcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMgYW5kIGZpeCB0eXBvLgorCSAgU2VlICM1OTkwMTguCisKKzIwMDktMTAtMTkgMjE6NTk6MjMgKzAzMDAgIFByaWl0IExhZXMgPHBsYWVzQHBsYWVzLm9yZz4KKworCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzoKKwkgIGNhY2FzaW5rOiBleGl0IHByb3Blcmx5IHdoZW4gaW52YWxpZCBkcml2ZXIgaGFzIGJlZW4gc2VsZWN0ZWQuCisJICBTZWUgIzU5OTAxOC4KKworMjAwOS0xMC0yMCAxODoyMzoyOCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IFN0b3Agc2Nhbm5pbmcgYXQgdGhlIGxhc3QgZW50cnkuLi4gYW5kIG5vdCB0aGUgb25lIGJlZm9yZSA6KQorCSAgVGhpcyBlbnN1cmVzIHdlIGFjdHVhbGx5IHB1c2ggb3V0IGV2ZXJ5dGhpbmcKKworMjAwOS0xMC0yMCAxNzoyMDo1NSArMDIwMCAgQW5keSBXaW5nbyA8d2luZ29Ab2Jsb25nLm5ldD4KKworCSAgcXRkZW11eDogdW5wYWNrIG1vcmUgaW5mb3JtYXRpb24gaW50byBpbWFnZS94LWoyYyBjYXBzCisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZm91cmNjLmg6IEFkZCBuZXcgZm91cmNjcyBmb3IgdXNlIGJ5IHRoZSBtajIKKwkgIHVucGFja2VyLgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmMgKHF0ZGVtdXhfcGFyc2VfdHJhayk6IFVucGFjayBKUEVHMjAwMCBjb21wb25lbnQKKwkgIG1hcHBpbmcgYW5kIGNoYW5uZWwgZGVmaW5pdGlvbnMgZnJvbSB0aGUganAyaCBoZWFkZXIuIFdpbGwgYWRkCisJICBjb21wb25lbnQtbWFwIGFuZCBjaGFubmVsLWRlZmluaXRpb25zIGVsZW1lbnRzIHRvIHRoZSBjYXBzIGlmIHRoZQorCSAgY29tcG9uZW50IG1hcHMgb3IgY2hhbm5lbCBkZWZpbml0aW9ucyBhcmUgbm9uc3RhbmRhcmQsIHdoZXJlIHN0YW5kYXJkCisJICBvcmRlciBtZWFucyBSR0IsIDQ0NCBwYWNrZWQgWVVWLCBvciBncmV5c2NhbGUsIHdpdGggbm8gYWxwaGEgY2hhbm5lbC4KKwkgIEZpeGVzICM1OTg5MTUuCisKKzIwMDktMTAtMjAgMTc6MzM6NDEgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZGVpbnRlcmxlYXZlLmM6CisJICB0ZXN0czogaW5jbHVkZSBzdGRpby5oIGZvciBzc2NhbmYKKworMjAwOS0xMC0xOSAxNToyMTo1NyArMDEwMCAgQmFzdGllbiBOb2NlcmEgPGhhZGVzc0BoYWRlc3MubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBGaXggdGhlIFN0cmVhbVZvbHVtZSBpbnRlcmZhY2Ugbm90IGJlaW5nIGFkdmVydGlzZWQKKwkgIGdzdF9wdWxzZXNpbmtfaW50ZXJmYWNlX3N1cHBvcnRlZCgpIHdhcyBtaXNzaW5nIGEgY2hlY2sgZm9yIGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU5ODkzMworCisyMDA5LTEwLTE2IDIxOjE0OjE0ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgbGV2ZWw6IGNvZGUgY2xlYW51cAorCSAgVXNlIGdkb3VibGUgaW5zdGVhZCBvZiBkb3VibGUuIENhbGN1bGF0ZSBmYWxsb2ZmX3RpbWUgb25jZSBpbnN0ZWFkIG9mIHR3aWNlLgorCisyMDA5LTEwLTE4IDE1OjUyOjAyICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogTUVNRFVNUCB0aGUganVuayBibG9icworCSAgSXQgd2lsbCBvbmx5IGFjdHVhbGx5IHB1bGwgdGhlIGp1bmsgYmxvYnMgZnJvbSB1cHN0cmVhbSBpZiB0aGUgbWVtZHVtcAorCSAgbGV2ZWwgaXMgYWN0aXZhdGVkCisKKzIwMDktMTAtMTggMTU6NTE6MzQgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBTb21lIGF2aSBmaWxlcyBoYXZlIElORk8gbGlzdHMgaW4gdGhlIGhlYWRlcnMuCisKKzIwMDktMTAtMTggMTY6MDI6MDEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBEb24ndCBzZWVrIG9uIGVtcHR5IHN0cmVhbXMKKworMjAwOS0xMC0xOCAxNTo1MDozOSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IEVuc3VyZSBfY2FsY3VsYXRlX2R1cmF0aW9uc19mcm9tX2luZGV4IG9ubHkgdXNlcyB2YWxpZCBzdHJlYW1zCisKKzIwMDktMTAtMTggMTU6NDk6MjkgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBPbmx5IGNhbGwgY29udmVydCBmdW5jdGlvbiBpZiB3ZSBoYXZlIHN0cmYuYXVkcworCisyMDA5LTEwLTE4IDE1OjQ4OjA2ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogVXNlIGZpcnN0IGluZGV4ZWQgc3RyZWFtIGZvciBzZWVraW5nLgorCSAgSW4gdGhlIGZ1dHVyZSwgbWFpbl9zdHJlYW0gY2FuIGJlIGFkanVzdGVkIHRvIGNvbnRhaW4gdGhlIG9wdGltYWwgc3RyZWFtCisJICBhcyBtZW50aW9ubmVkIGluIHRoZSBGSVhNRSBsaW5lIDM0NDAKKworMjAwOS0xMC0xOCAxNTo0Njo0OCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgYXZpZGVtdXg6IE9ubHkgZXhwb3NlIHN0cmVhbXMgdGhhdCBhY3R1YWxseSBoYXZlIHNvbWV0aGluZyBpbiBpdC4KKwkgIFRoaXMgZ3VhcmFudGVlcyB0aGF0IGluIHB1bGwtbW9kZSwgYWxsIHN0cmVhbXMgaGF2ZSBhIHZhbGlkIGluZGV4IHRvCisJICB3b3JrIHdpdGguCisKKzIwMDktMTAtMTggMTU6NDA6MzcgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBQcm9wZXJseSBtYXJrIHByZXNlbmNlIG9mIGluZGV4LgorCSAgSW5zdGVhZCBvZiBibGluZGx5IHNheWluZyB3ZSBoYXZlIGFuIGluZGV4LCBvbmx5IGRvIHNvIGlmIHdlIGhhdmUgYQorCSAgbm9uLWVtcHR5IGluZGV4LgorCisyMDA5LTEwLTE3IDAyOjE4OjUzICswMjAwICBMZW5uYXJ0IFBvZXR0ZXJpbmcgPGxlbm5hcnRAcG9ldHRlcmluZy5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlOiBuZXZlciBhcHBseSB2b2x1bWUgbW9yZSB0aGFuIG9uY2UKKwkgIEdlbmVyYWxseSBkZWNpc2lvbnMgb24gdGhlIHZvbHVtZSBvZiB0aGUgc3RyZWFtIHNob3VsZCBiZSBkb25lIGluc2lkZSBvZgorCSAgUEEsIG5vdCBpbnNpZGUgb2YgR3N0LiBPbmx5IFBBIGtub3dzIGhvdyB2b2x1bWVzIHRyYW5zbGF0ZSBiZXR3ZWVuCisJICBkZXZpY2VzIGFuZCBzIG9uLgorCSAgVGhpcyBwYXRjaCBtYWtlcyBzdXJlIHRoYXQgYWxsIHZvbHVtZXMgc2V0IHZpYSB0aGUgdm9sdW1lIHByb3BlcnR5IGFyZQorCSAgb25seSBhcHBsaWVkICpvbmNlKiB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0uIEFmdGVyIGFwcGx5aW5nIHRoZW0gdGhlCisJICBjbGllbnQgc2lkZSB3aWxsIG5vdCBzdG9yZSB0aGVtIGFueW1vcmUuIFRoaXMgc2hvdWxkIG1ha2Ugc3VyZSB0aGF0CisJICByZWFsbHkgb25seSB1c2VyLXRyaWdnZXJlZCB2b2x1bWUgY2hhbmdlcyBhcmUgZm9yd2FyZGVkIHRvIHNlcnZlciwgYnV0CisJICB0aGUgY2xpZW50IG5ldmVyIHRyaWVzIHRvIHNhdmUvcmVzdG9yZSB0aGUgdm9sdW1lIGludGVybmFsbHkuCisJICBGaXhlcyBidWcgIzU5NTIzMS4KKworMjAwOS0xMC0xNyAwODo1NToxNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wbHVnaW4uYzoKKwkgIHB1bHNlc2luazogSW5pdGlhbGl6ZSBnZXR0ZXh0IGZvciB0aGUgdHJhbnNsYXRlZCBzdHJpbmdzIGluIHBsdWdpbl9pbml0KCkKKworMjAwOS0xMC0xNyAwMDoxMDozMCArMDIwMCAgTGVubmFydCBQb2V0dGVyaW5nIDxsZW5uYXJ0QHBvZXR0ZXJpbmcubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZTogdXNlICdwZXJmb3JtZXInIGFzIGEgZmFsbGJhY2sgZm9yICdhcnRpc3QnIHRhZworCisyMDA5LTEwLTE3IDAwOjA5OjM2ICswMjAwICBMZW5uYXJ0IFBvZXR0ZXJpbmcgPGxlbm5hcnRAcG9ldHRlcmluZy5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIHBvL1BPVEZJTEVTLmluOgorCSAgcHVsc2U6IHdoZW4gY29uc3RydWN0aW5nIGEgc3RyZWFtIHRpdGxlIGZyb20gdGFnIGRhdGEgbWFrZSBzdXJlIGl0IGlzIHRyYW5zbGF0YWJsZQorCisyMDA5LTEwLTE3IDAwOjA2OjE1ICswMjAwICBMZW5uYXJ0IFBvZXR0ZXJpbmcgPGxlbm5hcnRAcG9ldHRlcmluZy5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOgorCSAgcHVsc2U6IGxvb3Agd2hpbGUgY29ubmVjdGluZyB0byBzZXJ2ZXIKKwkgIHB0aHJlYWQgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgdGhlcmUgYXJlIG5vIHNwdXJpb3VzIGNvbmRpdGlvbiB2YXJpYWJsZQorCSAgd2FrZXVwcywgbmVpdGhlciBkb2VzIHBhX3RocmVhZGVkX21haW5sb29wX3h4eCgpIHdoaWNoIGlzIGEgd3JhcHBlcgorCSAgYXJvdW5kIGl0LiBTbyB3ZSBuZWVkIHRvIGxvb3AgYXJvdW5kIHRoZSBfd2FpdCgpIGZ1bmN0aW9uIHRvIG1ha2Ugc3VyZQorCSAgd2UgZ2V0IHRoZSByaWdodCB3YWtldXAuCisJICBBbHNvLCB1bmlmeSB0aGUgb3JkZXIgb2YgdGhlIHdhaXQgbG9vcHMgYWNyb3NzIHRoZSBmaWxlLgorCisyMDA5LTEwLTE3IDAwOjA1OjEwICswMjAwICBMZW5uYXJ0IFBvZXR0ZXJpbmcgPGxlbm5hcnRAcG9ldHRlcmluZy5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOgorCSogZXh0L3B1bHNlL3B1bHNlcHJvYmUuYzoKKwkgIHB1bHNlOiBtYWlubG9vcCBjcmVhdGlvbiBjYW4gZmFpbCB0b28sIHNvIGhhbmRsZSB0aGF0CisKKzIwMDktMTAtMTcgMDA6MDM6MDYgKzAyMDAgIExlbm5hcnQgUG9ldHRlcmluZyA8bGVubmFydEBwb2V0dGVyaW5nLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlbWl4ZXJjdHJsLmM6CisJICBwdWxzZTogYWRqdXN0IENIRUNLX0RFQURfR09UTyBtYWNybyB0byBnbGliIHN0eWxlCisKKzIwMDktMTAtMTYgMTc6Mjg6NDIgKzAyMDAgIExlbm5hcnQgUG9ldHRlcmluZyA8bGVubmFydEBwb2V0dGVyaW5nLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlbWl4ZXJjdHJsLmM6CisJKiBleHQvcHVsc2UvcHVsc2VtaXhlcmN0cmwuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZXByb2JlLmM6CisJKiBleHQvcHVsc2UvcHVsc2Vwcm9iZS5oOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmg6CisJICBwdWxzZTogbWFrZSBhIGZldyB0aGluZ3Mgc21hbGxlciBieSBtYWtpbmcgdGhlbSBiaXRmaWVsZHMKKworMjAwOS0xMC0xNiAxNzoyNjo0MSArMDIwMCAgTGVubmFydCBQb2V0dGVyaW5nIDxsZW5uYXJ0QHBvZXR0ZXJpbmcubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJICBwdWxzZTogYnVtcCBtaW5pbXVtIGxpYnB1bHNlIHZlcnNpb24gdG8gMC45LjEwCisJICBPbGRlciB2ZXJzaW9ucyB0aGFuIDAuOS4xMCBhcmUgcmVhbGx5IHJlYWxseSBvbGQgYW5kIGJ1Z2d5LiBEcm9wCisJICBjb21wYXRpYmlsaXR5IHdpdGggdGhlbS4gTm9ib2R5IHNob3VsZCBydW4gYW55dGhpbmcgdGhhdCBvbGQuCisJICBBbHNvIHNlZTogaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU5NTAyOQorCisyMDA5LTEwLTE2IDE4OjE4OjMxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlYnVndXRpbHMvZ3N0ZGVidWcuYzoKKwkgIGRlYnVndXRpbHM6IHJlZ2lzdGVyIHB1c2hmaWxlc3JjIGVsZW1lbnQKKworMjAwOS0xMC0xNiAxNzoyODowOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5oOgorCSAgYXZpbXV4OiBzdXBwb3J0IChzb21lKSBWQlIgYXVkaW8gbXV4aW5nCisJICBBVkkgZm9ybWF0IGNhbiBoYW5kbGUgVkJSIGF1ZGlvIHByb3ZpZGVkIGF1ZGlvIGNodW5rcyBhcmUgb2YgZml4ZWQgZHVyYXRpb24KKwkgIChjZnIgZml4ZWQgZHVyYXRpb24gdmlkZW8gZnJhbWVzKS4gIEFwcGx5IHRoaXMgYXBwcm9hY2ggdG8gKGFsd2F5cykgcGFyc2VkCisJICByYXcgQUFDIGFuZCAoaWYgcGFyc2VkKSB0byBNUEVHLTEvMiBhdWRpby4KKwkgIFNlZSAjMzY4NjgxLgorCisyMDA5LTEwLTE2IDEzOjQxOjQ1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogZml4IGJyYW5jaCBoaW50cworCSAgUmVtb3ZlIGluYXBwcm9wcmlhdGUgYnJhbmNoaW5nIGhpbnRzIGFuZCBhZGQgc29tZSBuZXcgb25lcy4KKworMjAwOS0xMC0xNiAxMjozMzowNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGZpeCByZWdyZXNzaW9uIGluIGluZGlyZWN0IGRlY29kZSBwYXRoCisJICBSZXZlcnQgdmFyaWFibGUgbmFtZSBiYWNrIHRvIHdoYXQgaXQgd2FzIGJlZm9yZSB0aGUgR19MSUtFTFkgd2FzCisJICBhZGRlZCAoaW4gY29tbWl0IDY5YzI0ZmI5KS4gVGhlIGNvZGUgd29ya3MgYmV0dGVyIHRoYXQgd2F5LgorCisyMDA5LTEwLTE2IDAyOjQ3OjM4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogZml4IHJlZ3Jlc3Npb24gd2l0aCBjZXJ0YWluIGZvcm1hdHMKKwkgIEZpeCByZWdyZXNzaW9uIGludHJvZHVjZWQgYnkgcHJldmlvdXMgY29tbWl0ICgjNTk4NTE3KS4KKworMjAwOS0xMC0xNSAxOTo0OTo1NSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGRvbid0IHVzZSBkZWNvbXByZXNzIHN0cnVjdHVyZSBtZW1iZXJzIHdlIHNob3VsZG4ndCBiZSB1c2luZworCisyMDA5LTEwLTE0IDE3OjUzOjUyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAganBlZ2RlYzogcmVtb3ZlIHNvbWUgdW51c2VkIG1lbWJlcnMgZnJvbSBqcGVnZGVjIGluc3RhbmNlIHN0cnVjdHVyZQorCisyMDA5LTEwLTE2IDExOjUzOjM4ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSogZ3N0L3VkcC9NYWtlZmlsZS5hbToKKwkgIGJ1aWxkOiB1c2UgZ3N0LWdsaWItZ2VuLm1hayB0byBmaXggdGhlIGdsaWIgYnVpbGQgcnVsZXMuCisJICBUaGUgYnVpbGQgcnVsZXMgaW4gZ2xpYi1nZW4ubWFrIHdlcmUgdXNpbmcgcGF0dGVybiBydWxlcyBpbiBhIG5vbiBzYXZlIHdheS4KKworMjAwOS0xMC0xNiAxMDoxNTozNSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gODVkMTUzMCB0byAwNzAyZmUxCisKKzIwMDktMTAtMTUgMjE6MDQ6MDIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogYWRqdXN0IGZsb3cgcmV0dXJuIGFnZ3JlZ2F0aW9uIHRvIHVwZGF0ZWQgbG9vcF9kYXRhCisJICBJbiBwYXJ0aWN1bGFyLCBlYWNoIHN0cmVhbSBpcyBub3cgdHJlYXRlZCBzZXBhcmF0ZWx5LCBhbmQgb25lIHN0cmVhbSdzCisJICBFT1Mgc2hvdWxkIG5vdCBsZWFkIHRvIG92ZXJhbGwgRU9TLgorCisyMDA5LTEwLTE1IDExOjUyOjM1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogY2hlY2sgc29tZSBtb3JlIGF0b20gc2l6ZXMgcHJpb3IgdG8gcGFyc2luZworCisyMDA5LTEwLTE1IDEzOjE5OjEzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwOiBoYW5kbGUgZXZlbnRzIGluIFRDUCBtb2RlCisJICBXZSBuZWVkIHRvIGhhbmRsZSBldmVudHMgaW4gVENQIG1vZGUgc28gdGhhdCB3ZSBjYW4gcmVwbHkgdG8gdGhlIExBVEVOQ1kgZXZlbnQKKwkgIHdpdGggVFJVRS4KKworMjAwOS0xMC0xNSAxMToyNDo0NSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBhZGQgbWlzc2luZyBhcmd1bWVudCBpbiBkZWJ1ZyBtZXNzYWdlCisKKzIwMDktMTAtMTQgMTg6NTg6MDYgKzAyMDAgIE1hcnZpbiBTY2htaWR0IDxtYXJ2QGV4aGVyYm8ub3JnPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9mbHZtdXguYzoKKwkgIGZsdm11eDogVXNlIGxvb3AgdGVzdCB0byBwcmV2ZW50IHRpbWVvdXQgb24gc2xvdyBtYWNoaW5lcworCSAgUGFydGlhbGx5IGZpeGVzIGJ1ZyAjNTk3NzM5LgorCisyMDA5LTEwLTE0IDE2OjE1OjQ4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmb3J3YXJkIGV2ZW50cyBpbnRvIHRoZSBydHBiaW4KKwkgIE9ubHkgY2F0Y2ggdGhlIFNFRUsgZXZlbnQgb24gdGhlIHNyY3BhZCBhbmQgbGV0IG90aGVyIGV2ZW50cyBlbnRlciB0aGUgcnRwYmluLgorCisyMDA5LTEwLTE0IDExOjMzOjI0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5icj4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBGaXggbGF0ZSB0YWdzIGZpbmRpbmcKKwkgIFVzZSB0aGUgY29ycmVjdCB0YWdsaXN0IHZhcmlhYmxlIHdoZW4gbm90aWZ5aW5nIG9mIGxhdGUgdGFncy4KKworMjAwOS0xMC0xNCAxMzowOTowMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIGF2aWRlbXV4OiB1c2UgR3N0SW5kZXggZm9yIChsaW1pdGVkKSBzZWVraW5nIGluIHB1c2ggbW9kZQorCSAgLi4uIGJ1dCBkaXNhYmxlIHRoaXMgZm9yIG5vdy4gIEFsdGhvdWdoIGl0IGJhc2ljYWxseSB3b3JrcyBmaW5lLAorCSAgdXNlciBleHBlcmllbmNlIG1pZ2h0IGJlIHNoYWt5IChkZXBlbmRpbmcgb24gdGFzdGUpLCBzaW5jZSB0aGVyZQorCSAgaXMgbm8ga2V5ZnJhbWUgaW5mbyBpbiBwdXNoIG1vZGUuCisKKzIwMDktMTAtMTQgMTM6MDg6NDcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogYWRkIEdzdEluZGV4IHN1cHBvcnQKKworMjAwOS0xMC0xNCAxMTo1NTozMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBhbHNvIGRldGVybWluZSBkdXJhdGlvbiBpbiBwdXNoIG1vZGUKKworMjAwOS0xMC0xNCAxMTo1NDo0NCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IGFkZCBHc3RJbmRleCBzdXBwb3J0CisKKzIwMDktMTAtMTQgMDc6Mzg6MjYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBTZXQgZHVyYXRpb24gb24gYnVmZmVycworCSAgVXNlIGZyYW1lcmF0ZSB0byBlc3RpbWF0ZSBkdXJhdGlvbiBvZiBidWZmZXJzLgorCSAgRml4ZXMgIzU5MDM2MgorCisyMDA5LTEwLTE0IDEyOjI4OjU1ICswMjAwICBIw6V2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmYgYXQgdGFuZGJlcmcuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJICBydHBwdGRlbXV4OiBvbmx5IGZvcndhcmQgdGhlIGxvc3QtZXZlbnQgdG8gdGhlIGxhc3Qgc2VlbiBwdC1udW1iZXIKKwkgIGZvcndhcmQgYWxsIGV2ZW50cyBvbiBhbGwgcGFkcyBleGNlcHQgZm9yIHRoZSBQYWNrZXRMb3N0IGV2ZW50LCB3aGljaCB3ZSB3YW50IHRvCisJICBmb3J3YXJkIHRvIHRoZSBsYXN0IHNlZW4gcHQgcGFkLgorCSAgRml4ZXMgIzU5ODM3NworCisyMDA5LTEwLTA2IDIyOjI4OjUwICswMzAwICBSZW7DqSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IHNldCBkZXNpcmVkIG1pbnJlcSB2YWx1ZSB0byBzZWdzaXplL2xhdGVuY3ktdGltZQorCSAgSWYgd2UgbGV0IHRoZSBkYWVtb24gZGVjaWRlIGZyZWVseSBieSBwYXNzaW5nIC0xLCB3ZSBlbmQgdXAgYWx3YXlzIGdldHRpbmcgMjBtcy4KKwkgIFdlIHdhbnQgdG8gc2V0IHRoaXMgdmFsdWUgYmVjYXVzZSBpbiBzb21lIGNhc2VzIHdlIHdhbnQgdG8gc2VsZWN0IGEgaGlnaGVyCisJICBsYXRlbmN5LXRpbWUgaW4gb3JkZXIgdG8gc2F2ZSBwb3dlci4KKwkgIEZpeGVzICM1OTc2MDEKKworMjAwOS0xMC0xNCAxMDo0MToyMSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGEzZTNjZTQgdG8gODVkMTUzMAorCisyMDA5LTEwLTEzIDE4OjMzOjM0ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvZmxhY2RlYy5jOgorCSAgdGVzdHMvcGlwZWxpbmUvZmxhYzogRml4IGJ1aWxkIG9uIG1hY29zeCAxMC41CisKKzIwMDktMTAtMTMgMTg6MTk6MzIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBkZW1vdGUgc29tZSB3YXJuaW5ncyB0byBkZWJ1ZworCisyMDA5LTEwLTEzIDE3OjQ3OjQwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2F2aS1pZHMuaDoKKwkgIGF2aTogYWRkIG5ldyBhdmkgZmxhZyB3ZSBtaWdodCB3YW50IHRvIHVzZQorCisyMDA5LTEwLTEzIDE3OjQ2OjIyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBjYWxjdWxhdGUgc3VnZ2VzdGVkIGJ1ZmZlciBzaXplCisJICBDYWxjdWxhdGUgdGhlIHN1Z2dlc3RlZCBidWZmZXIgc2l6ZSBiYXNlZCBvbiB0aGUgbGFyZ2VzdCBjaHVuayBpbiB0aGUgZmlsZS4KKwkgIFNlZSAjNTk3ODQ3CisKKzIwMDktMTAtMTMgMTc6NDU6MTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IGFkZCBqcGVnMjAwMCB0byBhbGxvd2VkIGNhcHMKKworMjAwOS0xMC0xMyAxNzo0MToxMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGFkZCBkZWJ1ZyBmb3IgdGhlIHN1cGVyaW5kZXggb2Zmc2V0cworCisyMDA5LTEwLTEzIDE2OjAyOjM3ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCB1bmluaXRpYWxpemVkIHZhcmlhYmxlIHdhcm5pbmcKKwkgIEZpeCBhbm90aGVyIGJvZ3VzIG1heS1iZS11c2VkLXVuaW5pdGlhbGl6ZWQgd2FybmluZyBpbiBxdGRlbXV4CisKKzIwMDktMTAtMTMgMTM6MDg6MzMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5oOgorCSAgYXZpOiBsb3dlciBtYXggZmlsZSBzaXplCisJICBNYWtlIGEgY29uc3RhbnQgb2YgdGhlIG1heCBmaWxlIHNpemUgYW5kIGxvd2VyIHRoZSB2YWx1ZSB0byB3aGF0IGZmbXBlZyBkb2VzLAorCSAgaG9wZWZ1bGx5IGltcHJvdmluZyBjb21wYXRpYmlsaXR5IHdpdGggd2luZG93cyBtZWRpYSBwbGF5ZXIuCisJICBTZWUgIzU5Nzg0NworCisyMDA5LTEwLTEzIDAxOjAyOjE1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogZml4IGJvZ3VzIHdhcm5pbmcgYWJvdXQgZGlzY29udCBmbGFnIG9uIGZpcnN0IGJ1ZmZlcgorCSAgVGhlIHZlcnkgZmlyc3QgYnVmZmVyIHNob3VsZCBhbHdheXMgaGF2ZSB0aGUgRElTQ09OVCBmbGFnIHNldCwgbm8KKwkgIG5lZWQgdG8gd2FybiBhYm91dCB0aGF0LiBPbmx5IHdhcm4gaWYgd2UgZ2V0IGEgRElTQ09OVCBidWZmZXIgaW4KKwkgIG5vbi1wYWNrZXRpc2VkIG1vZGUgYW5kIHdlIGFscmVhZHkgaGF2ZSBzb21lIGRhdGEuCisKKzIwMDktMTAtMTMgMDA6NDE6NTcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBmaXggY3Jhc2ggZm9yIHVudXN1YWwgdmVydGljYWwgY2hyb21hIHN1YnNhbXBsaW5nIGZhY3RvcnMKKwkgIEZpeGVzICM1OTczNTEuCisKKzIwMDktMTAtMTMgMDA6MTI6NDIgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgd2FybmluZ3MKKwkgIFRoZSBnY2Mgb24gdGhlIE9TL1ggYnVpbGRib3QgY29tcGxhaW5zIGFib3V0IHRoZXNlIHZhcmlhYmxlcyBub3QgYmVpbmcKKwkgIGluaXRpYWxpemVkLCBldmVuIHRob3VnaCB0aGV5IGNhbid0IHBvc3NpYmx5IGFjdHVhbGx5IGJlIHVzZWQKKwkgIHVuaW5pdGlhbGl6ZWQuCisKKzIwMDktMTAtMTEgMTE6MzU6MjMgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJICBkdG1mOiBmaXggd2FybmluZ3MgaW4gbWFjb3N4IHNub3cgbGVvcGFyZAorCisyMDA5LTEwLTEwIDAwOjM3OjA4ICswMjAwICBKb3NlcCBUb3JyYSA8bjc3MGdhbGF4eUBnbWFpbC5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGZpeGVzIHdhcm5pbmcgYnVpbGRpbmcgaW4gc25vdyBsZW9wYXJkCisKKzIwMDktMTAtMDkgMTc6MTI6NDYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhbHNvIGNvbnNpZGVyIFF1aWNrdGltZSB0ZXh0IHN1YnRpdGxlcworCisyMDA5LTEwLTA5IDE3OjAyOjU3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcHJvdmlkZSBsYW5ndWFnZSB0YWcgZm9yIHN0cmVhbQorCisyMDA5LTEwLTA5IDE2OjMwOjU3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcmVmYWN0b3IgY29tbW9uIHBhcnRzIGluIHRyYWNrIHBhcnNpbmcKKworMjAwOS0xMC0wOSAxNjoyMTowMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IHJlZmFjdG9yIGJ1ZmZlciBwcm9jZXNzaW5nIGFuZCBzZW5kaW5nCisJICAuLi4gc28gaXQgY2FuIGJlIHVzZWQgaW4gYm90aCBwdWxsIGFuZCBwdXNoIGJhc2VkIG1vZGUuCisKKzIwMDktMTAtMDggMTM6Mzk6MjUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBleHRyYWN0IHBhbGV0dGUgZGF0YSBmb3IgZHZkIHN1YnBpY3R1cmUgc3RyZWFtcworCSAgLi4uIGFuZCBzZW5kIGl0IGRvd25zdHJlYW0gdXNpbmcgY3VzdG9tIGR2ZCBldmVudAorCisyMDA5LTEwLTA3IDE0OjAzOjE3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkgIHF0ZGVtdXg6IHN1cHBvcnQgM0dQUCB0aW1lZCB0ZXh0IHN1YnRpdGxlcworCSAgSW4gcGFydGljdWxhciwgYWxzbyBtYWtlIHN1YnRpdGxlIHN1cHBvcnQgbGVzcyBzdWJwKGljdHVyZSktY2VudHJpYy4KKworMjAwOS0xMC0wNyAxNjoxNTo1NSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IE5VTEwgaXMgbm90IGEgdmFsaWQgdGFnbGlzdAorCisyMDA5LTA5LTIzIDE3OjIwOjI1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkgIHF0ZGVtdXg6IHJlY29nbml6ZSBzb21lIG1vcmUgZW5jeXB0ZWQgdHJhY2sgY2FzZXMKKworMjAwOS0xMC0wOSAxNTo1OToyNSArMDIwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiBnc3QvaWQzZGVtdXgvaWQzdGFncy5jOgorCSAgaWQzOiBmaXhlcyB3YXJuaW5ncyBidWlsZGluZyBvbiBtYWNvc3gKKwkgIEFub3RoZXIgcm91bmQgb24gdGhlIGZvcm1hdGluZyBvZiB0aGF0IGRlYnVnIGxpbmUuCisKKzIwMDktMTAtMDkgMTQ6NDQ6MDIgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzoKKwkgIGlkMzogY2FzdCBwb2ludGVyIG1hdGggcmVzdWx0cyB0byBnbG9uZworCisyMDA5LTEwLTA5IDE0OjM3OjMyICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGZsYWM6IGFwcGFyZW50bHkgb24gc29tZSBwbGF0Zm9ybXMgYSBGTEFDX191aW50NjQhPWd1aW50NjQKKworMjAwOS0xMC0wOSAxNDoyMTowOSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSAgYnVpa2Q6IGV4cGxpY2l0ZWx5IGNhc3QsIHRvIHRlbGwgc29tZSBjb21waWxlcnMgdGhhdCB0aGlzIGlzIG5vdCBsb25nIGludAorCisyMDA5LTEwLTA5IDEzOjM4OjE3ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGdzdC9pZDNkZW11eC9pZDN0YWdzLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSAgYnVpbGQ6IGRvbid0IGNhc3QsIGJ1dCB1c2UgdGhlIHJpZ2h0IGZvcm1hdCBzcGVjaWZpZWQgaW5zdGVhZAorCSAgVGhpcyBjb3JyZWN0IHNvbWUgb2YgdGhlIHByZXZpb3VzIG1hY29zIGZpeGVzLgorCisyMDA5LTEwLTA5IDEyOjQwOjQ3ICswMjAwICBKb3NlcCBUb3JyYSA8bjc3MGdhbGF4eUBnbWFpbC5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJICBkdjogZml4IHdhcm5pbmdzIG9uIG1hY29zeAorCisyMDA5LTEwLTA5IDEyOjI1OjE5ICswMjAwICBKb3NlcCBUb3JyYSA8bjc3MGdhbGF4eUBnbWFpbC5jb20+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWM6IGZpeCB3YXJuaW5ncyBvbiBtYWNvc3gKKworMjAwOS0xMC0wOSAxMjoxOTozNSArMDIwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiBleHQvYW5ub2RleC9nc3RjbW1sZGVjLmM6CisJKiBleHQvYW5ub2RleC9nc3RjbW1sZW5jLmM6CisJICBhbm5vZGV4OiBmaXggd2FybmluZ3MgaW4gbWFjb3N4CisKKzIwMDktMTAtMDkgMTI6MTQ6MjIgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJICBvc3h2aWRlbzogZml4IGEgd2FybmluZyBkb2luZyBhIGNhc3QKKworMjAwOS0xMC0wOSAxMjoxMToxMiArMDIwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4cmluZ2J1ZmZlci5jOgorCSAgb3N4YXVkaW86IGZpeCB3YXJuaW5ncyBvbiBtYWNvc3gKKworMjAwOS0xMC0wOSAxMjowMToxMCArMDIwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkgIHJ0cHZyYXdwYXk6IGZpeCB3YXJuaW5nIG9uIG1hY29zeAorCisyMDA5LTEwLTA5IDExOjU3OjU5ICswMjAwICBKb3NlcCBUb3JyYSA8bjc3MGdhbGF4eUBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSAgcnRwaDI2M3BheTogZml4IHdhcm5pbmcgb24gbWFjb3N4CisKKzIwMDktMTAtMDkgMTE6NTQ6MDMgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IHdhcm5pbmdzIGJ1aWxkaW5nIG9uIG1hY29zeAorCisyMDA5LTEwLTA5IDExOjQyOjM2ICswMjAwICBKb3NlcCBUb3JyYSA8bjc3MGdhbGF4eUBnbWFpbC5jb20+CisKKwkqIGdzdC9pZDNkZW11eC9pZDN0YWdzLmM6CisJICBpZDNkZW11eDogZml4IHByaW50ZiB3YXJuaW5ncyBvbiBtYWNvc3gKKworMjAwOS0xMC0wOSAxMTozMDowMCArMDIwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogZml4IHdhcm5pbmcgaW4gbWFjb3N4IG1ha2luZyB0aGUgZm9ybWF0IHBvcnRhYmxlCisKKzIwMDktMTAtMDkgMTA6NTE6MjkgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkgIGF1ZGlvZng6IHVzZSBHX0dVSU5UNjRfRk9STUFUIHRvIGZpeCB3YXJuaW5ncyBvbiBPU1gKKworMjAwOS0xMC0wOSAxMDoxMTozOCArMDIwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4cmluZ2J1ZmZlci5jOgorCSAgb3N4YXVkaW86IEZpeGVzIGJ1aWxkIG9uIG1hY29zeCBzbm93IGxlb3BhcmQuCisKKzIwMDktMTAtMDkgMTE6MzQ6MTYgKzAyMDAgIFBhdSBHYXJjaWEgaSBRdWlsZXMgPHBncXVpbGVzQGVscGF1ZXIub3JnPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyOiBJbmNsdWRlIHN5cy9pb2N0bC5oIGZvciB0aGUgVjRMIGlvY3RsIHJlcXVlc3RzCisJICBPbGQgdmlkZW9kZXZpY2UyLmgga2VybmVsIGhlYWRlcnMgdXNlZCBpb2N0bCBzdHVmZiB3aXRob3V0CisJICBpbmNsdWRpbmcgaW9jdGwuaCwgbWFraW5nIGNvbXBpbGF0aW9uIGZhaWwgb24gb2xkZXIgc3lzdGVtcy4KKwkgIE5vdGU6IEluY2x1ZGluZyBpb2N0bC5oIGhlcmUgaXMgb25seSBhIHdvcmthcm91bmQgZm9yIG9sZCBrZXJuZWwKKwkgIGhlYWRlcnMsIHNob3VsZCBiZSByZW1vdmVkIG9uY2UgZXZlcnlib2R5IGhhcyBuZXcgZW5vdWdoIGhlYWRlcnMuCisJICBGaXhlcyBidWcgIzU5Nzg2Ny4KKworMjAwOS0xMC0wOSAwMDoxNDowNyArMDEwMCAgSmFuIFNjaG1pZHQgPGphbi5zY2htaWR0QHN1bi5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6CisJICBjaGVjazogTWFrZSB0aGUgbGV2ZWwgdW5pdCB0ZXN0IHN1Y2NlZWQgb24gU29sYXJpcyAxMAorCSAgQWRkIGEgY29uZmlndXJlIGNoZWNrIGZvciBmdW5jdGlvbmFsIGlzaW5mKCkgYW5kIGZwY2xhc3MoKSwgYW5kCisJICB1c2UgZnBjbGFzcygpIHdoZXJlIHBvc3NpYmxlIHdoZW4gaXNpbmYoKSBpcyBub3QgYXZhaWxhYmxlLgorCisyMDA5LTA1LTE2IDEzOjUyOjUwICswMzAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAbm9raWEuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGZpeCBzdHJzdHIoKSB1c2FnZSBvbiBwb3NzaWJseSB1bnRlcm1pbmF0ZWQgc3RyaW5nCisKKzIwMDktMTAtMDggMTY6MTY6MTQgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgY2hlY2s6IExpbmsgYWdhaW5zdCBMSUJNIGFuZCBpbmNsdWRlIG1hdGguaCBmb3IgaXNpbmYoKQorCisyMDA5LTEwLTA3IDIxOjUxOjM4ICswMTAwICBTam9lcmQgU2ltb25zIDxzam9lcmQuc2ltb25zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zcy9nc3Rvc3NhdWRpby5jOgorCSAgb3NzOiBEb3duZ3JhZGUgdGhlIHJhbmsgb2Ygb3Nzc3JjIHRvIFNFQ09OREFSWQorCSAgd2hpY2ggaXMgdGhlIHNhbWUgcmFuayBhcyBvc3NzaW5rIGhhcy4KKwkgIEZpeGVzIGJ1ZyAjNTk3NzMwLgorCisyMDA5LTEwLTA4IDEwOjU5OjUzICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSAxOWZhNGYzIHRvIGEzZTNjZTQKKworMjAwOS0xMC0wOCAxMDoyMDowOSArMDEwMCAgSmFuIFNjaG1pZHQgPGphbi5zY2htaWR0QHN1bi5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgYXZpL3dhdjogRml4IHNvbWUgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgaW5jb21wYXRpYmxlIHBvaW50ZXJzLgorCisyMDA5LTEwLTA1IDE3OjM2OjU1ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlLmM6CisJICBtdWx0aWZpbGU6IEZpeCBwbHVnaW4gZGVzY3JpcHRpb24KKworMjAwOS0xMC0wNyAxNDowMzoyMCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvYW5ub2RleC9nc3RjbW1sdXRpbHMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuaDoKKwkqIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Rlc3RzLmM6CisJKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tYXVkaW90ZXN0LmM6CisJKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9kZW1vLW9zc3NyYy5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vc3BlY3RydW0tZXhhbXBsZS5jOgorCSAgYnVpbGQ6IGZwcmludGYsIHNwcmludGYsIHNzY2FuZiBuZWVkIHN0ZGlvLmgKKworMjAwOS0xMC0wNyAwMDozMzo0OSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSAgZXF1YWxpemVyOiB1c2Ugc2hlbGZpbmcgZmlsdGVycyBmb3IgZmlyc3QgYW5kIGxhc3QgYmFuZAorCSAgUmVmYWN0b3IgdGhlIGZpbHRlciBzZXR1cC4gQWRkIHR3byBuZXcgZmlsdGVycyB3aXRoIHNoZWxmIGNoYXJhY3RlcmlzdGljcyBmb3IKKwkgIGZpcnN0IGFuZCBsYXN0IGJhbmQuIENoYW5nZSBnYWluIGNhbGN1bGF0aW9uIGFzIHJlY29tbWVuZGVkIGluIHRoZSBxdW90ZWQKKwkgIGRvY3VtZW50IChubyBxcnQgbmVlZGVkKS4gUmVuYW1lIHZhcmlhYmxlcyB0byBtYXRjaCB0aGUgZm9ybXVsYXMgaW4gdGhlCisJICBkb2N1bWVudC4KKworMjAwOS0xMC0wMiAyMzo1MToyOSArMDMwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogZ3VhcmQgZnJhZ21lbnQgc2l6ZSB3aXRoIGEgbG93ZXIgbGltaXQgYmFzZWQgb24gbGF0ZW5jeS10aW1lCisJICBJbiBjYXNlIHRoYXQgdGhlIHB1bHNlIGRhZW1vbiBydW5zIHRoZSBzb3VyY2UgZGV2aWNlIGF0IGEgcmVsYXRpdmVseSBsb3cgZml4ZWQKKwkgIGZyYWdtZW50IHNpemUgY29tcGFyZWQgdG8gdGhlIHJlcXVlc3RlZCBsYXRlbmN5LXRpbWUsIGNvbmZpZ3VyZSB0aGUgcmluZyBidWZmZXIKKwkgIHNlZ3NpemUgdG8gdGhlIGxhcmdlc3QgaW50ZWdlciBtdWx0aXBsZSBvZiB0aGUgZnJhZ21lbnQgc2l6ZSB0aGF0IGlzIHN0aWxsCisJICBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJlcXVlc3RlZCBsYXRlbmN5LXRpbWUuCisJICBGaXhlcyBidWcgIzU5NzQ2My4KKworMjAwOS0xMC0wNiAxNzo0MDo0NyArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBjb21tZW50L2xvZ2dpbmcgY2xlYW51cHMgYW5kIG1vcmUgYnJhbmNoIGd1aWRlcworCisyMDA5LTEwLTA1IDIyOjQzOjExICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJICBlcXVhbGl6ZXI6IGZpeCBmaWx0ZXIgaGlzdG9yeSB1c2FnZS4gRml4ZXMgIzU5NzM5NworCSAgVGhlIHByb2Nlc3MgZnVuY3Rpb25zIHdoZXJlIG92ZXJ3cml0aW5nIHRoZSBoaXN0b3J5IGZvciBlYWNoIGNoYW5uZWwuIEFsc28gcHVsbAorCSAgc29tZSBzdGF0aWMgdGhpbmdzIG91dCBvZiB0aGUgaW5uZXIgbG9vcC4KKworMjAwOS0xMC0wNSAxNjowNzoyNCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IHVzZSBsb2NraW5nIGFyb3VuZCB0aGUgc2Vzc2lvbnMKKworMjAwOS0xMC0wNSAxMTo0NjowOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IG1ha2Ugc3VyZSBjb21wYXRpYmxlIGJyYW5kcyBidWZmZXIgZXhpc3RzIGJlZm9yZSBkZXJlZmVyZW5jaW5nIGl0CisKKzIwMDktMTAtMDQgMjE6NTk6MjQgKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGdtYWlsLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IHByaW50ZiB3YXJuaW5ncyBvbiBPU1gKKwkgIENhc3QgdmFyaWFibGVzIHBhc3NlZCB0byBwcmludGYgdG8gYXZvaWQgd2FybmluZ3MgYWJvdXQgaW5jb3JyZWN0CisJICBmb3JtYXRzIChtb3N0IGxpa2VseSBjYXVzZWQgYnkgc2l6ZW9mIHJldHVybmluZyBhIHNpemVfdCkuCisJICBGaXhlcyAjNTk3MzQ4LgorCisyMDA5LTEwLTAyIDAwOjIzOjM0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcmVtb3ZlIGludGVybmFsIGdlbnJlIHRhYmxlCisJICBObyBuZWVkIHRvIG1haW50YWluIG91ciBvd24gZ2VucmUgdGFibGUgaW4gcXRkZW11eC4gVGhlIGdlbnJlcyBhcmUKKwkgIGlkZW50aWNhbCB0byB0aGUgSUQzIGdlbnJlcywgc28gd2UgY2FuIGp1c3QgdXNlIGxpYmdzdHRhZydzCisJICBnc3RfdGFnX2lkM19nZW5yZV9nZXQoKSB0byBsb29rIHRoZW0gdXAuCisKKzIwMDktMTAtMDMgMTc6MTg6MjggKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGdtYWlsLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgRml4IHByaW50ZiBmb3JtYXRzIHRvIGF2b2lkIHdhcm5pbmdzIGluIGF2aWRlbXV4LiBGaXhlcyAjNTk3MjE0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTk3MjE0CisKKzIwMDktMTAtMDMgMDk6NTI6NTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IENoYW5nZSBvbmUgR1NUX1dBUk5JTkcgdG8gYSBHU1RfREVCVUcKKworMjAwOS0xMC0wMiAxNDozNzo1NCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIGZsdmRlbXV4OiBJZiB0aGVyZSdzIG5vIGF1ZGlvIHN0cmVhbSBhZnRlciA2IHNlY29uZHMgb2YgdmlkZW8gc2lnbmFsIG5vLW1vcmUtcGFkcworCSAgLi4uYW5kIHRoZSBvdGhlciB3YXkgYXJvdW5kLiBBbHNvIGlnbm9yZSBhbnkgYXVkaW8vdmlkZW8gc3RyZWFtcyB0aGF0IGFwcGVhcgorCSAgYWZ0ZXIgbm8tbW9yZS1wYWRzLgorCSAgRml4ZXMgYnVnICM1OTcwOTEuCisKKzIwMDktMTAtMDIgMTQ6Mzc6NDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4Lmg6CisJKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6CisJICBmbHZkZW11eDogTWFrZSBzdXJlIHRvIG9ubHkgc2lnbmFsIG5vLW1vcmUtcGFkcyBhIHNpbmdsZSB0aW1lCisKKzIwMDktMTAtMDIgMjI6NTU6NDUgKzAzMDAgIFJlbsOpIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2U6IHJlbmFtZSBwYV9idWZmZXJfYXR0ciB2YXJpYWJsZXMKKwkgIE1ha2VzIGl0IG11Y2ggZWFzaWVyIHRvIHNlZSB3aGF0IGlzIGdvaW5nIG9uIGFuZCBpcyBhIGxvdCBsZXNzIGVycm9yIHByb25lLgorCisyMDA5LTEwLTAyIDE4OjI1OjE2ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJICBydHA6IGFkZCBtaXNzaW5nIGluY2x1ZGUgdG8gZml4IHRoZSBidWlsZAorCisyMDA5LTEwLTAyIDEzOjE1OjU5ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgdmlkZW9maWx0ZXI6IGFkZCBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgdG8gcHJvcGVydHkgc2V0dGVyCisKKzIwMDktMTAtMDIgMTM6MTA6NDQgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJICBsZXZlbDogZG9uJ3QgZ2l2ZSB3cm9uZyBudW1iZXIgb2YgZmllbGRzIGluIHRoZSBtZXNzYWdlIGRvY3MKKworMjAwOS0xMC0wMSAxMjo1Mjo0MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGNhY2hlIGxhdGVuY3kgaW4gbmFub3NlY29uZHMKKwkgIENhY2hlIHRoZSBsYXRlbmN5IGluIG5hbm9zZWNvbmRzIHVuaXRzIHRvIGF2b2lkIGhhdmluZyB0byBjb252ZXJ0IHRoZQorCSAgbWlsbGlzZWNvbmRzIHZhbHVlIHRvIG5hbm9zZWNvbmRzIGFsbCB0aGUgdGltZS4KKworMjAwOS0xMC0wMSAxMjoxMjowOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGhhbmRsZSAtMSBpbnB1dCB0aW1lc3RhbXBzCisJICBEb24ndCB0cnkgdG8gY2hlY2sgYSAtMSB0aW1lc3RhbXAgYWdhaW5zdCB0aGUgbWF4IGRlbGF5LgorCisyMDA5LTEwLTAxIDEwOjU0OjU1ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aTogZG9uJ3QgbWlzdWVzIHBlcmYtY2F0ZWdvcnkgYW5kIHJlbW92ZSB1bnVzZWQgZXh0IGNhdGVnb3J5CisJICBUaGUgcGVyZm9ybWFuY2UgY2F0ZWdvcnkgaXMgbWVhbnQgdG8gYmUgdXNlZCB0byBhdWRpdCBjb2RlcGF0aHMgdGhhdCBsZWFkIHRvIGJhZAorCSAgcGVyZm9ybWFuY2UgKGUuZy4gY29waWVzLCBjb252ZXJzaW9uIHRoYXQgY2FuIGJlIGF2b2lkZWQpLgorCSAgUmVtb3ZlIHRoZSBldmVudCBjYXRlZ29yeSB3aGljaCBpcyBub3QgdXNlZC4KKworMjAwOS0wOS0xNiAxNDoyMzoyNCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6CisJICBydHBnNzI5cGF5L2RlcGF5OiBEZW1vdGUgcGVyLWJ1ZmZlciBkZWJ1ZyBtZXNzYWdlcyB0byBsb2cgbGV2ZWwKKworMjAwOS0wOS0xNiAxNDoxNjoyNyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkgIHJ0cGc3MjlwYXk6IERvbid0IGxlYWsgaW5jb21pbmcgYnVmZmVycyBhZnRlciBzdWJidWZmZXJpbmcgdGhlbQorCisyMDA5LTA5LTE2IDEzOjU3OjA1IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkgIHJ0cGc3MjlwYXkvZGVwYXk6IEFkZCBkZWJ1ZyBjYXRlZ29yaWVzCisKKzIwMDktMDktMTYgMTM6NTU6MTkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6CisJICBydHBnNzI5cGF5OiBSZW1vdmUgbG9uZyB1bm5lZWRlZCBkZWZpbmUgcmVwbGFjZW1lbnQKKworMjAwOS0wOS0zMCAxODowNjowNyArMDEwMCAgQ2hyaXN0aWFuIEYuSy4gU2NoYWxsZXIgPGNocmlzdGlhbi5zY2hhbGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9NYWtlZmlsZS5hbToKKwkgIFVwZGF0ZSBtYWtlZmlsZSB3aXRoIG1pc3NpbmcgaGVhZGVyIGZpbGUKKworMjAwOS0wOS0zMCAxODo0NToxNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3AtQU1SLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC1QQ01BLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWFsc2FzcmMtUENNQS5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItdjRsMi1IMjYzcC1hbHNhc3JjLUFNUi5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItdjRsMi1IMjY0LWFsc2FzcmMtUENNQS5zaDoKKwkgIHJ0cDogVXNlIGF1dG9hdWRpb3tzaW5rLHNyY30gaW5zdGVhZCBvZiBhbHNhIGluIHRoZSBleGFtcGxlcworCisyMDA5LTA5LTI5IDE3OjUxOjA0ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGRvbid0IGxlYWsgb3V0cHV0IGJ1ZmZlcnMgb24gZGVjb2RpbmcgZXJyb3JzCisJICBUaGUgc2V0am1wIGhhbmRsZXMgbGlianBlZyBlcnJvci4gRnJlZSB0aGUgb3V0cHV0YmZmZXIgaWYgd2UgZG9uJ3QgbmVlZCBpdC4KKworMjAwOS0wOS0yOSAwMDowMTo1OSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGZpeCAndW51c2VkIHZhcmlhYmxlJyBjb21waWxlciB3YXJuaW5nIHdoZW4gY29tcGlsaW5nIHdpdGggR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisKKzIwMDktMDktMjMgMTQ6MjU6MDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aTogc21hbGwgY2xlYW51cHMKKworMjAwOS0wOS0yMyAxMzo1NzowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpOiBmaXggdGltZXN0YW1waW5nIGluIHNvbWUgYXVkaW8gc3RyZWFtcworCSAgRm9yIHZiciBhdWRpbyBzdHJlYW1zIHdlIG5lZWQgdG8gdXNlIHRoZSBudW1iZXIgb2YgYmxvY2tzIHRvIGNhbGN1bGF0ZSB0aGUKKwkgIHRpbWVzdGFtcHMuCisJICBXaGVuIHRoZSBhbGxvY2F0aW9uIG9mIGFkZGl0aW9uYWwgaW5kZXggbWVtb3J5IGZhaWxzLCBkb24ndCB0aHJvdyBhd2F5IHdoYXQKKwkgIHdlIGhhZCBiZWZvcmUuCisJICBWYXJpb3VzIGNsZWFudXBzLgorCisyMDA5LTA5LTIzIDEyOjU2OjA3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmk6IGFkZCBzdXBwb3J0IGZvciBPRE1MIGluZGV4ZXMgYWdhaW4KKworMjAwOS0wOS0yMiAyMjoxMjo1OCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgYXZpOiBpbXBsZW1lbnQgaW5kZXggc2Nhbm5pbmcKKwkgIEltcGxlbWVudCBzY2FubmluZyBvZiB0aGUgZmlsZSB3aGVuIHdlIGNhbiBwYXJzZSB0aGUgaW5kZXguCisJICBTb21lIHJlZmFjdG9yaW5nIG9mIGNvbW1vbiBjb2RlLgorCSAgQ2xlYW51cHMgYW5kIGNvbW1lbnRzLgorCSAgUmVtb3ZlIHNvbWUgcmVpbXBsZW1lbnRlZCBjb2RlLgorCSAgUmVtb3ZlIGluZGV4IG1hc3NhZ2UgY29kZSBhbmQgcHV0IGEgRklYTUUgd2hlcmUgd2Ugc2hvdWxkIGRvIHNvbWV0aGluZworCSAgZXF1aXZhbGVudCBsYXRlci4KKworMjAwOS0wOS0yMiAxODoxODoyMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpOiBmaXggcmV2ZXJzZSBwbGF5YmFjaworCisyMDA5LTA5LTIyIDE3OjQyOjQ4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmk6IGZpeCBwcmV2IGtleWZyYW1lIHNlYXJjaCBhbmQgY2xlYW51cHMKKworMjAwOS0wOS0yMiAxNDo1MTozMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpOiByZW1vdmUgY29kZSB0aGF0IGdvdCBjb252ZXJ0ZWQKKworMjAwOS0wOS0yMiAxNDo0NDo0MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgYXZpOiBtb3JlIGNsZWFudXBzCisJICBSZW1vdmUgc29tZSBkdXBsaWNhdGUgY291bnRlcnMuCisJICBCZSBzbWFydGVyIHdoZW4gdXBkYXRlaW5nIHRoZSBjdXJyZW50IHRoZSB0aW1lc3RhbXAgYW5kIG9mZnNldCBpbiB0aGUgc3RyZWFtCisJICBiZWNhdXNlIHdlIGNhbiByZXVzZSBwcmV2aW91c2x5IGNhbGN1bGF0ZWQgdmFsdWVzIHdoZW4gc2ltcGx5IGdvIGZvcndhcmQgb25lCisJICBzdGVwLgorCSAgQ29ycmVjdGx5IHNldCBtZXRhZGF0YSBvbiBvdXRnb2luZyBidWZmZXJzLgorCisyMDA5LTA5LTIyIDEyOjM1OjMwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogc21hbGwgY2xlYW51cHMKKworMjAwOS0wOS0yMiAwMToyODo1NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpOiBmaXggcmVhZCBvZmZzZXQgYW5kIGNsZWFudXBzCisKKzIwMDktMDktMjEgMTg6MDQ6MjUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIGF2aTogcmV3cml0ZSBpbmRleCBwbGF5YmFjaworCSAgZGlzYWJsZSBjb2RlLCBzdGFydCBvbiByZWltcGxlbWVudGluZyBsb29wIGJhc2VkIG9wZXJhdGlvbi4KKwkgIFJld3JpdGUgdGhlIGluZGV4IGhhbmRsaW5nIHNvIHRoYXQgYWxsIHN0cmVhbXMgdXNlIHRoZWlyIG93biBpbmRleCBmb3IgZGVjb2RpbmcKKwkgIG1lZGlhLgorCisyMDA5LTA5LTIxIDE1OjM1OjU1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogYWRkIG5ldyBpbmRleCBwYXJzaW5nIGNvZGUKKwkgIEFkZCBhIG5ldyBmdW5jdGlvbiBhbmQgZGF0YXN0cnVjdHVyZSB0byBwYXJzZSBhbmQgaG9sZCB0aGUgaW5kZXggZW50cmllcyBvbiBhCisJICBwZXIgc3RyZWFtIGJhc2UuIEFsc28gYXZvaWQgZG9pbmcgdG9vIG11Y2ggd29yayB0cnlpbmcgdG8gZmlndXJlIG91dCB0aGUKKwkgIHRpbWVzdGFtcHMgYW5kIGR1cmF0aW9ucyBhcyB3ZSBjYW4gdHJpdmlhbGx5IGRvIHRoYXQgbGF0ZXIuCisJICBMZXNzIGluZm9ybWF0aW9uIGluIHRoZSBlbnRyaWVzIG1ha2VzIHRoZW0gMiB0aW1lcyBzbWFsbGVyIGFuZCBub3QgZG9pbmcgdG9vCisJICBtdWNoIHdvcmsgbWFrZXMgdGhpcyBjb2RlIGFib3V0IDEyIHRpbWVzIGZhc3RlciB0aGFuIHRoZSByZWd1bGFyIGNhc2UuCisJICBIb29rIGluIHRoZSBuZXcgZnVuY3Rpb24gYWxvbmdzaWRlIHRoZSBleGlzdGluZyBmdW5jdGlvbiBmb3IgY29tcGFyaXNvbiB1bnRpbAorCSAgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgaXMgdXBkYXRlZCB0byBoYW5kbGUgdGhlIG5ldyBpbmRleCBkYXRhc3RydWN0dXJlLgorCisyMDA5LTA5LTI4IDE2OjI5OjQ1ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWc6IGhhbmRsZSBtb3JlIGxpYmpwZWcgcmV0dXJuIHZhbHVlcywgYWRkIHNvbWUgbW9yZSBicmFuY2ggaGludHMKKwkgIEFsc28gcmVtb3ZlIHVudXNlZCBzaXplIHZhcmlhYmxlIGluIF9jaGFpbigpLgorCisyMDA5LTA5LTI1IDE5OjIxOjMyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogc29tZSBvcHRpb25hbCBRVCBzcGVjaWZpZWQgc3RzZCBNUEVHLTQgYXRvbXMgYWxzbyBhcHBseSB0byBIMjY0CisJICBGaXhlcyAjNTk2MzE5LgorCisyMDA5LTA5LTI1IDE2OjQwOjMxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogb25seSBzZW5kIHRhZyBldmVudHMgZG93bnN0cmVhbSBhZnRlciBuZXdzZWdtZW50CisKKzIwMDktMDktMjUgMTQ6MTQ6MDMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBpZiB0cmFuc3BvcnQgcHJvdG9jb2wgdW5zdXBwb3J0ZWQsIHRyeSBhbm90aGVyIG9uZQorCSAgQWxzbyBjaGFuZ2UgZXJyb3IgbWVzc2FnZSB0byBtb3JlIGFjY3VyYXRlbHkgcmVmbGVjdCBjYXNlcyBpbiB3aGljaAorCSAgaXQgY2FuIG9jY3VyLgorCisyMDA5LTA5LTI1IDExOjU0OjA2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgZHVyYXRpb25zIG1vZHVsbyAxPDwzMgorCSAgRm9yIGNhbGN1bGF0aW5nIHRoZSBkdXJhdGlvbnMgb2YgZWFjaCBzYW1wbGUsIHdlIGFyZSBzdXBwb3NlZCB0byBhZGQgZWFjaAorCSAgZHVyYXRpb24gbW9kdWxvIDE8PDMyIHNvIG1ha2UgdGhlIGVsYXBzZWQgdGltZSBjb3VudGVyIGEgdWludDMyLgorCSAgRml4ZXMgIzU5NTk0MgorCisyMDA5LTA5LTI0IDIwOjM4OjU0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBzbWFsbCBjbGVhbnVwCisKKzIwMDktMDktMjQgMTk6MzM6MzkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGF0b21wYXJzZXIuaDoKKwkgIHF0ZGVtdXg6IGRvbid0IHVzZSBjb3JlIEFQSSB0aGF0IGRvZXNuJ3QgZXhpc3QgeWV0CisJICBUaGVyZSdzIG5vIGdzdF9ieXRlX3JlYWRlcl9oYXNfcmVtYWluaW5nKCkgeWV0LiBGaXhlcyBidWlsZC4KKworMjAwOS0wOS0yNCAxMzoyMDo1MCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0YXRvbXBhcnNlci5oOgorCSAgcXRkZW11eDogbWFwIHNvbWUgYXRvbXBhcnNlciBmdW5jdGlvbnMgdG8gdGhlaXIgbmV3IGJ5dGVyZWFkZXIgZXF1aXZhbGVudHMKKwkgIE5vdyB0aGF0IEdzdEJ5dGVSZWFkZXIgaGFzIHVuY2hlY2tlZCBhbmQgaW5saW5lZCB2YXJpYW50cyBhcyB3ZWxsLCBtYXAKKwkgIGF0b21wYXJzZXIgZnVuY3Rpb25zIHRvIHRoZWlyIHJlc3BlY3RpdmUgYnl0ZXJlYWRlciBlcXVpdmFsZW50cy4KKworMjAwOS0wOC0yNSAxMjoxMToyOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0YXRvbXBhcnNlci5oOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6CisJICBxdGRlbXV4OiBhZGQgcXRfYXRvbV9wYXJzZXJfaGFzX2NodW5rcygpIGFuZCBmaXggaW5kZW50YXRpb24KKworMjAwOS0wOC0yMCAxODoyMTo1OSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGJhaWwgb3V0IGluc3RlYWQgb2YgdHJ5aW5nIHRvIGFsbG9jIHNpbGx5IGluZGV4IHNpemVzCisJICBJZiBpdCBsb29rcyBsaWtlIHdlIHdvdWxkIGJlIGFsbG9jYXRpbmcgYSBzaWxseSBzaXplIGZvciBvdXIgc2FtcGxlCisJICBpbmRleCwganVzdCBiYWlsIG91dCBpbnN0ZWFkIG9mIHRyeWluZyB0byBhbGxvY2F0ZSBpdC4gSGVscHMgd2l0aAorCSAgYnJva2VuIG9yIGZ1enplZCBmaWxlcyB3aGVyZSB3ZSBtaWdodCBlbmQgdXAgdHJ5aW5nIHRvIG1hbGxvYyBhCisJICBjb3VwbGUgb2YgaHVuZHJlZCBNQnMgb3RoZXJ3aXNlLgorCisyMDA5LTA4LTIwIDE2OjQ3OjI1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZXJyb3Igb3V0IGNvcnJlY3RseSBpZiB3ZSBkb24ndCBldmVuIGhhdmUgZW5vdWdoIGJ5dGVzIGZvciBhbiBhdG9tIGhlYWRlcgorCisyMDA5LTA4LTIwIDE1OjM5OjAwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogaW5pdCBmb3VyY2MgdG8gMCBhcyB3ZWxsIHRvIGF2b2lkIGludmFsaWQgcmVhZHMgd2hlbiBwcmludGYnaW5nIGVycm9yIG1lc3NhZ2UKKworMjAwOS0wOC0yMCAwMTozOToxNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0YXRvbXBhcnNlci5oOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6CisJICBxdGRlbXV4OiBhZGQgcXRfYXRvbV9wYXJzZV9oYXNfcmVtYWluaW5nKCkgdG8gYXZvaWQgb3ZlcmZsb3dzIHdpdGggX2dldF9yZW1haW5pbmcoKQorCisyMDA5LTA4LTIwIDAxOjIxOjA0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogdXNlIEdzdEJ5dGVSZWFkZXIgd2hlbiBwYXJzaW5nIHRraGQgYXRvbQorCisyMDA5LTA4LTE5IDE5OjEzOjM4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogdXNlIHVuc2lnbmVkIGludHMgZm9yIG5vZGUgbGVuZ3RoIGFuZCBkbyBtb3JlIHNhbml0eSBjaGVja2luZyBvZiB0aGUgYXRvbSBsZW5ndGgKKworMjAwOS0wOC0xOSAwMTozNjozMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0YXRvbXBhcnNlci5oOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2R1bXAuaDoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfdHlwZXMuaDoKKwkgIHF0ZGVtdXg6IHVzZSBHc3RCeXRlUmVhZGVyIGZvciBhdG9tIGR1bXBpbmcgYW5kIGZpeCBhIGZldyBidWdzCisKKzIwMDktMDgtMjEgMTQ6MjE6MDggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBtb3ZlIHN0Y28sIHN0dHMsIHN0c3MgYW5kIHN0cHMgYXRvbSBwYXJzaW5nIG92ZXIgdG8gR3N0Qnl0ZVJlYWRlcgorCSAgTWFrZSBzdXJlIHdlIGRvbid0IHJlYWQgYmV5b25kIHRoZSBhdG9tIGJvdW5kYXJ5LiBOb3RlIHRoYXQgdGhlIGNvZGUKKwkgIGJlaGF2ZXMgc2xpZ2h0bHkgZGlmZmVyZW50bHkgaW4gdGhlIGNvcm5lciBjYXNlIHdoZXJlIHRoZXJlIGlzIG5vdAorCSAgZW5vdWdoIGF0b20gZGF0YSBmb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc2FtcGxlcyAobl9zYW1wbGVzX3RpbWUpCisJICBpbiB0aGUgYXRvbSwgYnV0IHN0aWxsIGVub3VnaCBkYXRhIHRvIGZpbGwgdGhlIHByZS1hbGxvY2F0ZWQgaW5kZXggb2YKKwkgIG5fc2FtcGxlcyBlbnRyaWVzOiBiZWZvcmUgd2Ugd291bGQganVzdCBzdG9wIHBhcnNpbmcgdGhlIHN0dHMgZGF0YQorCSAgYW5kIGNvbnRpbnVlLCB3aGVyZWFzIG5vdyB3ZSB3aWxsIGxpa2VseSBlcnJvciBvdXQuIFRoaXMgc2hvdWxkIG5vdAorCSAgYmUgYSBwcm9ibGVtIGluIHByYWN0aWNlIHRob3VnaC4gV2UgY291bGQgbWFpbnRhaW4gdGhlIG9sZCBiZWhhdmlvdXIKKwkgIGJ5IGRvaW5nIHJlYWRzIHdpdGggYSBzaXplIGNoZWNrIGluc2lkZSB0aGUgbG9vcCBpZiBuZWVkZWQuCisKKzIwMDktMDYtMzAgMTk6NTE6MTUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiB1c2UgYnl0ZXJlYWRlciB0byBwYXJzZSBzdHN6IGFuZCBzdHNjIGF0b21zCisJICBVc2UgR3N0Qnl0ZVJlYWRlciB0byBwYXJzZSBzdHN6IGFuZCBzdHNjIGNodW5rcywgYW5kIGNoZWNrIHNpemUgb2YKKwkgIGF2YWlsYWJsZSBkYXRhIGJlZm9yZSBwYXJzaW5nIGl0LCBpbnN0ZWFkIG9mIGJsaW5kbHkgYXNzdW1pbmcgdGhlcmUKKwkgIHdpbGwgYmUgZW5vdWdoIGRhdGEuIEZpeGVzIGNyYXNoZXMgd2l0aCBzb21lIGZ1enplZC9icm9rZW4gZmlsZXMuCisKKzIwMDktMDgtMTUgMjA6Mzg6NDAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGF0b21wYXJzZXIuaDoKKwkgIHF0ZGVtdXg6IGFkZCBxdF9hdG9tX3BhcnNlcl9nZXRfb2Zmc2V0KCkgYW5kIG9wdGltaXNlIF9wZWVrX3N1YigpCisKKzIwMDktMDctMDEgMTM6NDk6NTcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9NYWtlZmlsZS5hbToKKwkqIGdzdC9xdGRlbXV4L3F0YXRvbXBhcnNlci5oOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogYWRkIFF0QXRvbVBhcnNlciwgYW4gaW5saW5lZCBHc3RCeXRlUmVhZGVyIHZhcmlhbnQKKworMjAwOS0wOS0yMyAxNzoxOTozNCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICBtYXRyb3NrYWRlbXV4OiB1c2UgcHJvcGVyIG9yZGVyIGZvciBuby1tb3JlLXBhZHMgYW5kIG5ld3NlZ21lbnQgYW5kIHRhZyBzZW5kaW5nCisKKzIwMDktMDktMjMgMDk6NTA6MzcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IHNwcmlua2xlIGEgZmV3IGJyYW5jaCBwcmVkaWN0aW9uIG1hY3JvcworCisyMDA5LTA5LTIyIDE1OjAzOjIwICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOgorCSogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6CisJICBGaXggY29tcGlsZSB3YXJuaW5ncyB3aXRoIGdjYyA0LjAuMS4KKworMjAwOS0wOS0yMiAxMTo0ODo1MCArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogRG9uJ3QgZ2V0IHN0dWNrIGluIGFuIGluZmluaXRlIGxvb3Agd2l0aCBEaXJhYworCSAgQXQgdGhlIGVuZCwgRGlyYWMgc3RyZWFtcyBoYXZlIGFuIEVPUyBwYWNrZXQgd2l0aCAwIGxlbmd0aC4KKwkgIERvbid0IGV2ZXIgc2l0IGluIGFuIGluZmluaXRlIGxvb3Agd2hlbiBwcm9jZXNzaW5nIG9uZS4gQWxsb3dzCisJICBtdXhpbmcgRGlyYWMgaW50byBta3YgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LgorCisyMDA5LTA5LTIyIDExOjAzOjQ2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogLmdpdGlnbm9yZToKKwkgIFVwZGF0ZSAuZ2l0aWdub3JlCisKKzIwMDktMDktMjIgMTE6MDI6MDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9NYWtlZmlsZS5hbToKKwkgIHZpZGVvbWl4ZXI6IGZpeCB1cCBNYWtlZmlsZSBzb21lIG1vcmUKKwkgIFJlbW92ZSBDRkxBR1MgZnJvbSBMSUJBREQgYW5kIG1ha2Ugb3JkZXIgb2YgdGhlIHZhcmlvdXMgQ0ZMQUdTIGFuZAorCSAgTElCUyBhdCBsZWFzdCBjb25zaXN0ZW50IHdpdGggZWFjaCBvdGhlci4KKworMjAwOS0wOS0yMiAwODowMjo0OCArMDIwMCAgQnJpYW4gQ2FtZXJvbiA8YnJpYW4uY2FtZXJvbkBzdW4uY29tPgorCisJKiBnc3QvdmlkZW9taXhlci9NYWtlZmlsZS5hbToKKwkgIHZpZGVvbWl4ZXI6IEFkZCAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgdG8gTERGTEFHUyBmb3IgbGlua2luZyBsaWJnc3R2aWRlbworCSAgRml4ZXMgYnVnICM1OTU4OTcuCisKKzIwMDktMDktMjEgMTg6MDk6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aTogZml4IHRpbWVzdGFtcHMgaW4gcHVzaCBtb2RlCisKKzIwMDktMDktMTggMTc6MjY6NDIgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogYWRkIGEgR19VTkxJS0VMWSBhbmQgcHV0IHBlcmYtY2F0IGxvZyB0byBjb2RlIHBhdGggdGhhdCBjb3BpZXMKKworMjAwOS0wOS0yMSAxMjozMjo1MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpOiBhZGQgc29tZSBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMKKwkgIE1lYXN1cmUgdGhlIHBlcmZvcm1hbmNlIG9mIHZhcmlvdXMgaW5kZXggYW5kIGhlYWRlciBwYXJzaW5nIHN0ZXBzIHRvIHRoZQorCSAgUEVSRk9STUFOQ0UgZGVidWcgY2F0ZWdvcnkuCisKKzIwMDktMDktMTggMTE6NTM6MTIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkgIHNwZWV4ZGVjOiBhbGxvdyBmb3IgdW5rbm93biB2YXJ5aW5nIG51bWJlciBvZiBmcmFtZXMgcGVyIGJ1ZmZlcgorCSAgSW4gcGFydGljdWxhciwgdGhpcyBjYXRlcnMgZm9yIFJUUCBwYXlsb2FkcyB3aXRoIG11bHRpcGxlIGZyYW1lcworCSAgcGVyIHBhY2tldC4KKworMjAwOS0wOS0xOCAxMTo0NTowNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSAgc3BlZXhkZWM6IHVzZSBjb3JyZWN0IHNhbXBsZSBzaXplIGluIGNvbnZlcnNpb25zCisKKzIwMDktMDktMTggMTE6NDM6NDYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkgIHNwZWV4ZW5jOiBmaXggYnVmZmVyIHRpbWUgYW5kIGR1cmF0aW9uIGZvciBtdWx0aXBsZSBmcmFtZXMgcGVyIHBhY2tldAorCisyMDA5LTA5LTE4IDE0OjIyOjAyICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBzb21lIGxvZ2dpbmcgY2xlYW51cCB0byBoZWxwIHVuZGVyc3RhbmRpbmcgdGhlIGluZGV4IHBhcnNpbmcgb3ZlcmhlYWQKKworMjAwOS0wOS0xNiAxMzoyODoyNyAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIHN5cy9vc3hhdWRpby9NYWtlZmlsZS5hbToKKwkgIG9zeGF1ZGlvOiBsaW5rIGFnYWluc3QgR1NUX0JBU0VfTElCUworCisyMDA5LTA5LTE1IDE3OjI0OjI0IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSAgcnRwZzcyOXBheTogRml4IGFkYXB0ZXIgbGVhaworCSAgVGhlIGFkYXB0ZXIgd291bGQgYmUgbGVha2VkIGlmIGl0IHdhcyBlbXB0eSBhbmQgdGhlIGRhdGEgY291bGQgYmUgcHVzaGVkIG91dCBkaXJlY3RseS4KKworMjAwOS0wOS0xNSAxMDowNDozMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2VzcmM6IERvbid0IGRlcmVmZXJlbmNlIE5VTEwgcG9pbnRlcnMKKwkgIHBhX3N0cmVhbV9nZXRfdGltaW5nX2luZm8oKSBjYW4gcmV0dXJuIE5VTEwuCisJICBGaXhlcyBidWcgIzU5NTIyMC4KKworMjAwOS0wOS0xNSAxMDowMTo1NCArMDIwMCAgRGF2aWQgSGVubmluZ3Nzb24gPGdub21lLndlYkBlcG9zdC5kaXdpYy5zZT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBEb24ndCBkZXJlZmVyZW5jZSBOVUxMIHBvaW50ZXJzCisJICBwYV9zdHJlYW1fZ2V0X3RpbWluZ19pbmZvKCkgY2FuIHJldHVybiBOVUxMLgorCSAgRml4ZXMgYnVnICM1OTUyMjAuCisKKzIwMDktMDktMTQgMTY6MDU6MzAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogaGFuZGxlIHN0cmVhbSBldmVudHMKKwkgIEhhbmRsZSBzdHJlYW0gZXZlbnRzIGFuZCByZXF1ZXN0IGEgUEFVU0UvUExBWSBzdGF0ZSBjaGFuZ2UgZnJvbSB0aGUgYXBwbGljYXRpb24KKwkgIHdoZW4gd2UgcmVjZWl2ZSBhIENPUksvVU5DT1JLIGV2ZW50LgorCisyMDA5LTA5LTEzIDEyOjMwOjM0IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuaDoKKwkgIG11bHRpZmlsZXNpbms6IEFkZCBuZXh0LWZpbGUgcHJvcGVydHkKKwkgIEFkZCBhIHByb3BlcnR5IHRvIGFsbG93IGNvbnRyb2wgb3ZlciB3aGF0IGV2ZW50IGNhdXNlcyBhIGZpbGUKKwkgIHRvIGZpbmlzaCBiZWluZyB3cml0dGVuIGFuZCBhIG5ldyBmaWxlIHN0YXJ0LiAgVGhlIGRlZmF1bHQgaXMKKwkgIHRoZSBzYW1lIGFzIGJlZm9yZSAtLSBlYWNoIGJ1ZmZlciBjYXVzZXMgYSBuZXcgZmlsZSB0byBiZQorCSAgd3JpdHRlbi4gIEFkZGVkIGlzIGEgY2FzZSB3aGVyZSBidWZmZXJzIGFyZSB3cml0dGVuIHRvIHRoZQorCSAgc2FtZSBmaWxlIHVudGlsIGEgZGlzY29udGludWl0eSBpbiB0aGUgc3RyZWFtLgorCisyMDA5LTA5LTEzIDE1OjU1OjAyIC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9kdi9nc3RkdmRlbXV4Lmg6CisJICBkdmRlbXV4OiBVc2UgdmFsdWVzIGZyb20gZGVjb2RlciBzdHJ1Y3R1cmUgZGlyZWN0bHkKKwkgIERvbid0IHN0b3JlIHRoZSBzYW1lIHZhbHVlcyBpbiB0aGUgR3N0RHZEZW11eC4gIFRoaXMKKwkgIGZpeGVzIGEgYnVnIHdoZXJlIGR2ZGVtdXggd291bGQgZGV0ZWN0IGEgc3RyZWFtIGFzIFBBTAorCSAgaW5zdGVhZCBvZiBOVFNDLCBhbmQgc2lsZW50bHkgcGFyc2UgaXQgd3JvbmcuCisKKzIwMDktMDktMTMgMTI6MjA6MjMgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvZHYvTWFrZWZpbGUuYW06CisJKiBleHQvZHYvZ3N0c21wdGV0aW1lY29kZS5jOgorCSogZXh0L2R2L2dzdHNtcHRldGltZWNvZGUuaDoKKwkqIGV4dC9kdi9zbXB0ZV90ZXN0LmM6CisJICBkdmRlbXV4OiBBZGQgY29kZSB0byBwYXJzZSBTTVBURSB0aW1lIGNvZGVzCisJICBDb2RlIHRvIGNvbnZlcnQgdGltZSBjb2RlcyB0by9mcm9tIHRpbWVzdGFtcHMgYW5kIGZyYW1lIG51bWJlcnMuCisKKzIwMDktMDktMTMgMTI6MDE6MjcgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguaDoKKwkgIGR2ZGVtdXg6IEZpeCBkZXRlY3Rpb24gb2YgbmV3IG1lZGlhCisJICBUaGVyZSBhcmUgNSBvciA2IEFBVVggc291cmNlIGNvbnRyb2wgcGFja3MgaW4gYSBmcmFtZSwgYW5kIGFueQorCSAgb2YgdGhlbSBjb3VsZCBoYXZlIFJFQ19TVCBjbGVhcmVkLCBpbmRpY2F0aW5nIGEgcmVjb3JkaW5nIHN0YXJ0CisJICBwb2ludC4gIGxpYmR2IG9ubHkgY2hlY2tzIHRoZSBmaXJzdC4KKworMjAwOS0wOS0xMiAxOToyNTozNiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkgIGR2ZGVtdXg6IFNldCBESVNDT05UIGZsYWcgb24gYnVmZmVycyB3aGVuIFJFQ19TVCBmbGFnIGlzIHNldC4KKwkgIEFsc28gYWRkIGEgZmV3IGJyYW5jaCBwcmVkaWN0aW9uIG1hY3JvcworCisyMDA5LTA5LTEyIDAwOjEzOjA0ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy95NG1lbmMuYzoKKwkgIGNoZWNrOiBGaXggYSBjb3VwbGUgb2YgdGVzdHMuCisJICBUaGUgc291cGh0dHBzcmMgdGVzdCB3YXNuJ3QgY29tcGlsaW5nLiBUaGUgc291cC1taXNjLmggaGVhZGVyIGlzIG5lZWRlZCBmb3IKKwkgIHNvdXBfc3NsX3N1cHBvcnRlZC4KKwkgIEZpeCB0aGUgeTRtZW5jIHRlc3QgdG8gdXNlIGEgJ3Byb2dyZXNzaXZlJyBoZWFkZXIgZm9yIHRoZSB0ZXN0IGRhdGEgbm93IHRoYXQKKwkgIHRoZSBlbGVtZW50IG91dHB1dHMgY29ycmVjdCBpbnRlcmxhY2luZyBpbmZvLgorCisyMDA5LTA5LTExIDEzOjMyOjM5IC0wNzAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogdHJlYXQgYSB6ZXJvLXNpemVkIGRhdGEgY2h1bmsgYXMgZXh0ZW5kaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUuCisJICBUaGlzIGZpeGVzIHBsYXliYWNrIG9mIHNvbWUgZmlsZXMgdGhhdCBkb24ndCBoYXZlIGEgdmFsaWQgZGF0YSBjaHVuayBsZW5ndGgsCisJICBhcHBhcmVudGx5IHNvbWUgcHJvZ3JhbSBjcmVhdGVzIHRoZXNlLgorCisyMDA5LTA5LTExIDIyOjI0OjQ3ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkgIHY0bDJzcmM6IGFkZCBhIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIGdldF9mcmFtZSBmdW5jdGlvbiBhbmQgb3B0aW1pemUgYSBiaXQKKwkgIFVzZSBhIGZ1bmN0aW9uLXBvaW50ZXIgZm9yIG1tYXAvcmVhZCwgYXMgdGhpcyBjYW4ndCBjaGFuZ2UgZHVyaW5nIGNhcHR1cmUuIEFsc28KKwkgIHNwcmlua2xlIGEgZmV3IEdfTElLRUxZL1VOTElLRUxZIHRvIGltcHJvdmUgdGhlIGVycm9yLWxlc3MgY29kZSBwYXRoLgorCisyMDA5LTA5LTExIDIyOjE1OjAxICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDI6IGxvZyBidWZmZXIgY29waWVzIG9uIHF1ZXVlIHVuZGVycnVuIGluIHBlcmYgY2F0ZWdvcnkKKwkgIHY0bDJzcmMgaGFzIGEgc2xvdyBwYXRoIHdoZXJlIGl0IGRvZXMgYnVmZmVyLWNvcGllcyB3aGVuIGl0IHJ1bnMgb3V0IG9mIHF1ZXVlZAorCSAgYnVmZmVycy4gTG9nIHRoaXMgdG8gcGVyZm9ybWFuY2UgY2F0ZWdvcnkgdG8gaGVscCBtb25pdG9yaW5nIGl0LgorCisyMDA5LTA5LTExIDE1OjE0OjE1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBJbXBsZW1lbnQgR3N0U3RyZWFtVm9sdW1lIGludGVyZmFjZQorCisyMDA5LTA5LTExIDE2OjA5OjQwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSAgcHVsc2VzaW5rOiBJbXBsZW1lbnQgbXV0ZSBwcm9wZXJ0eQorCisyMDA5LTA5LTExIDEzOjMzOjMxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmM6CisJICBnZGtwaXhidWZzaW5rOiBmaXggZG9jcyByZWZlcmluZyB0byBzZW5kLW1lc3NhZ2VzCisKKzIwMDktMDktMTEgMTM6Mjg6MzUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJICBzcGVjdHJ1bTogYWRkIHBvc3QtbWVzc2FnZXMgcHJvcGVydHkKKwkgIEFkZCBhIHBvc3QtbWVzc2FnZXMgcHJvcGVydHkgYW5kIGRlcHJlY2F0ZSB0aGUgbGVzcyBkZXNjcmlwdGl2ZSBtZXNzYWdlCisJICBwcm9wZXJ0eS4KKworMjAwOS0wOS0xMSAxMzoyMDowNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5oOgorCSAgcGl4YnVmc2luazogYWRkIHBvc3QtbWVzc2FnZXMgcHJvcGVydHkKKwkgIEFkZCBwb3N0LW1lc3NhZ2VzIGFuZCBkZXByZWNhdGUgc2VuZC1tZXNzYWdlcyBhcyB0aGUgZm9ybWVyIGlzIG1vcmUKKwkgIGRlc2NyaXB0aXZlIG9mIHdoYXQgYWN0dWFsbHkgaGFwcGVucy4KKworMjAwOS0wOS0xMSAxMzoxMjo1NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuaDoKKwkgIG11bHRpZmlsZXNpbms6IHJlbmFtZSBzaWxlbnQgdG8gcG9zdC1tZXNzYWdlcworCSAgVXNlIHRoZSBwb3N0LW1lc3NhZ2VzIHByb3BlcnR5IG5hbWUgaW5zdGVhZCBvZiBzaWxlbnQgYXMgaXQgaXMgbW9yZQorCSAgZGVzY3JpcHRpdmUuCisKKzIwMDktMDktMTEgMTI6MTY6MTggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmg6CisJICBtdWx0aWZpbGVzaW5rOiBwb3N0IG1lc3NhZ2VzIGZvciBlYWNoIGJ1ZmZlcgorCSAgQWRkIGEgc2lsZW50IHByb3BlcnR5IHRoYXQgY2FuIGJlIHNldCB0byBGQUxTRSB0byBwb3N0IG1lc3NhZ2VzIG9uIHRoZSBidXMgZm9yCisJICBlYWNoIHdyaXR0ZW4gZmlsZS4KKwkgIERvIHNvbWUgbW9yZSBjbGVhbnVwcy4KKwkgIEFkZCBzb21lIGRvY3MuCisJICBGaXhlcyAjNTk0NjYzCisKKzIwMDktMDktMDkgMTg6MTM6MjkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJICBydHBoMjYzcGF5OiBBbGxvY2F0ZSBCb3VuZHJ5IHN0cnVjdHMgb24gdGhlIHN0YWNrIGluc3RlYWQgb2YgdGhlIGhlYXAgdG8gYXZvaWQgbGVha3MKKwkgIEZpeGVzIGJ1ZyAjNTk0NjkxLgorCisyMDA5LTA5LTEwIDEwOjI4OjQ4ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSAgZG9jczogZml4IGd0ay1kb2Mgd2FybmluZ3MKKworMjAwOS0wOS0xMCAxMDoyNjoyMyArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmg6CisJICBkb2NzOiBmaXggZ3RrLWRvYyB3YXJuaW5ncworCisyMDA5LTA5LTA5IDE3OjUxOjE5IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L3JhdzEzOTQvTWFrZWZpbGUuYW06CisJKiBleHQvcmF3MTM5NC9nc3QxMzk0Y2xvY2suYzoKKwkqIGV4dC9yYXcxMzk0L2dzdDEzOTRjbG9jay5oOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuaDoKKwkgIGR2MTM5NHNyYzogQWRkIGEgY2xvY2sgYmFzZWQgb24gaXNvY2hyb25vdXMgY3ljbGUgY291bnRlcgorCSAgUGFydGlhbCBmaXggZm9yICMxNjkzODMuCisKKzIwMDktMDktMDkgMTY6MDI6MDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBGaXggQVlVVi0+STQyMCBjb252ZXJzaW9uCisJICBGb3IgdGhpcyBmaXggdGhlIGF2ZXJhZ2luZyBvZiB0aGUgY2hyb21hIHZhbHVlcy4gSXQgc2hvdWxkJ3QgYmUgKGEvMiArIGIpLzIKKwkgIGJ1dCBqdXN0IChhICsgYikvMi4KKwkgIEZpeGVzIGJ1ZyAjNTk0NTk5LgorCisyMDA5LTA5LTA5IDE2OjI1OjA2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IHJlbW92ZSByaW5nYnVmZmVyIHJlc2V0IGNvbXBlbnNhdGlvbgorCSAgUmVtb3ZlIHRoZSBjb2RlIHRvIGRlYWwgd2l0aCBhIHJpbmdidWZmZXIgcmVzZXQgYXMgdGhpcyBjb2RlIGlzIG5vdyBpbiB0aGUgYmFzZQorCSAgY2xhc3MuCisJICBCdW1wIHRoZSAtYmFzZSByZXF1aXJlbWVudCBhcyB3ZSBuZWVkIHRoZSBuZXcgYmFzZWF1ZGlvc2luayBjb2RlIHRvIGZ1bmN0aW9uCisJICBwcm9wZXJseS4KKworMjAwOS0wOS0wOSAxNjoyNDo0OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSAgcHVsc2VzaW5rOiB3aGl0ZXNwYWNlIGZpeGVzCisKKzIwMDktMDktMDkgMTA6Mjc6NTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuaDoKKwkgIHdoaXRlc3BhY2UgZml4ZXMKKworMjAwOS0wOS0wOCAxOTozNDowOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlbWl4ZXIuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOgorCSogZXh0L3B1bHNlL3B1bHNlcHJvYmUuYzoKKwkgIHB1bHNlOiBzbWFsbCBjbGVhbnVwcworCSAgQWRkIHNvbWUgZGVidWcgaW5mbworCSAgRml4IHRoZSBzdGF0ZSBjaGFuZ2VzCisKKzIwMDktMDktMDggMTg6Mjk6MzUgKzAyMDAgIE1hcmMtQW5kcsOpIEx1cmVhdSA8bWx1cmVhdUBmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSAgbXVsdGlwYXJ0bXV4OiBtYXJrIGRhdGEgYnVmZmVyIGFzIGRlbHRhLXVuaXQKKwkgIFNvIHRoYXQgbXVsdGlmZHNpbmsgYWx3YXlzIHN0YXJ0IHNlbmRpbmcgaGVhZGVyIGJ1ZmZlciBmaXJzdAorCSAgRml4ZXMgIzU5NDUyMAorCisyMDA5LTA5LTA4IDE3OjM3OjE1ICswMjAwICBNYXJjIExlZW1hbiA8bWFyYy5sZWVtYW5AZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgcnRwYmluOiBhZGQgaWdub3JlLXB0IHBhcmFtZXRlcgorCSAgQWRkIGEgcGFyYW1ldGVyICdpZ25vcmUtcHQnIHRoYXQgZGlzYWJsZXMgY3JlYXRpbmcgYSBnc3RydHBwdGRlbXV4IG1vZHVsZSBhbmQKKwkgIGdob3N0cyB0aGUgcGFkcyBvZiBnc3RydHBqaXR0ZXJidWZmZXIgaW5zdGVhZCBvZiB0aGUgb25lcyBvZiBnc3RydHBwdGRlbXV4LgorCSAgRml4ZXMgIzU5NDQ5MAorCisyMDA5LTA5LTA0IDEzOjUxOjM3ICswMjAwICBNYXJ2aW4gU2NobWlkdCA8bWFydmluX3NjaG1pZHRAZ214Lm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkgIGNoZWNrczogb25seSBydW4gSFRUUFMgdGVzdCBpZiBsaWJzb3VwIGhhcyBTU0wgc3VwcG9ydAorCisyMDA5LTA5LTA4IDEzOjU5OjU2ICswMjAwICBIw6V2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAdGFuZGJlcmcuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgcnRwYmluOiBwcm9wYWdhdGUgcGF5bG9hZC10eXBlLWNoYW5nZSBzaWduYWwgZnJvbSBkZW11eGVyCisJICBmaXhlcyAjNTk0MjU0CisKKzIwMDktMDgtMzEgMTg6NDY6MjUgKzAyMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQHRhbmRiZXJnLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGNoYW5nZSBzZXZlcml0eSBvZiBjbG9jay1yYXRlIGNoYW5nZSBkZWJ1ZworCSAgTWFrZSBsb2cgR1NUX0RFQlVHIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLCBHU1RfV0FSTklORyBvdGhlcndpc2UuCisJICBGaXhlcyAjNTk0MjUzCisKKzIwMDktMDktMDggMTM6Mzk6MzEgKzAyMDAgIEjDpXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBhdm9pZCB0aHJvd2luZyByZW9yZGVyZWQgYnVmZmVycyB3aXRoIHNhbWUgdGltZXN0YW1wcworCSAgV2hlbiB3ZSByZWNlaXZlIGEgcmVvcmRlcmVkIHBhY2tldCB3aXRoIHRoZSBzYW1lIHRpbWVzdGFtcCBhcyB0aGUgcHJldmlvdXMgb25lCisJICAod2hpY2ggY2FuIGhhcHBlbiBmb3IgZnJhZ21lbnRlZCBwYWNrZXRzKSBkb24ndCBjb25zaWRlciB0aGUgcGFja2V0IGFzIGxvc3QgYnV0CisJICBpbnN0ZWFkIHdhaXQgZm9yIHRoZSByZW9yZGVyZWQgcGFja2V0IHRvIGFycml2ZS4KKwkgIFN3aXRjaCB0aGUgd2FybmluZy1sZXZlbCwgc28gdGhhdCBhIHJlb3JkZXJpbmcgZG9lcyBub3QgZ2V0IGEgd2FybmluZywgb25seQorCSAgYW4gYWN0dWFsIHByb2R1Y2VkIGxvc3QtcGFja2V0LgorCSAgRml4ZXMgIzU5NDI1MQorCisyMDA5LTA4LTMxIDIxOjE2OjU0ICswMjAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJICBydHBqcGVnZGVwYXk6IGFkZCBtaXNzaW5nIG1hdGguaCBpbmNsdWRlCisJICBGaXhlcyAjNTk0MjQ3CisKKzIwMDktMDktMDggMTM6MzA6MjkgKzAyMDAgIEFybm91dCBWYW5kZWNhcHBlbGxlIDxhcm5vdXRAbWluZC5iZT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IG1lbW9yeSBsZWFrCisJICBJbiBnc3RfcnRzcHNyY19wYXJzZV9kaWdlc3RfY2hhbGxlbmdlKCksIHJ0c3BzcmMgZG9lcyBhIGdfc3RybmR1cCBvZiB0aGUgYXV0aAorCSAgaGVhZGVyIGl0ZW1zIGFuZCB0aGVuIHBhc3NlcyB0aGVtIHRvIGdzdF9ydHNwX2Nvbm5lY3Rpb25fc2V0X2F1dGhfcGFyYW0oKQorCSAgd2l0aG91dCBmcmVlaW5nLgorCSAgRml4ZXMgIzU5NDEzMworCisyMDA5LTA5LTA4IDEzOjE4OjI5ICswMjAwICBTdGlnIFNhbmRuZXMgPHN0aWcuc2FuZG5lc0B0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBtYWtlIGZyZWVfc2Vzc2lvbigpIHJlbW92ZSBzdHJlYW0gcmVmZXJlbmNlcworCSAgV2hlbiByZWNlaXZpbmcgYSBzeW5jLXBhY2tldCwgYWxsIHNlc3Npb25zIHdpdGggdGhlIHNhbWUgY25hbWUgd2lsbCBiZSBjb21wYXJlZAorCSAgYW5kIHN5bmNlZCB0b2dldGhlci4gSW4gdGhpcyBwcm9jZXNzLCB0aGVyZSBjb3VsZCBzdGlsbCBiZSByZWZlcmVuY2VzIHRvIGEKKwkgIHNlc3Npb24gdGhhdCBoYXMgYmVlbiBzaHV0IGRvd24gaW4gdGhlIG1lYW53aGlsZS4KKwkgIFRoaXMgcGF0Y2ggbWFrZXMgc3VyZSB0aGF0IHRoZXNlIHJlZmVyZW5jZXMgYXJlIHJlbW92ZWQgd2hlbiBzaHV0dGluZyBkb3duIGEKKwkgIHNlc3Npb24sIHNvIHRoYXQgdGhlIHN5bmNpbmcgY2FuIGJlIGRvbmUgc2FmZWx5LgorCSAgRml4ZXMgIzU5NDI4MworCisyMDA5LTA4LTMxIDE4OjQ2OjUxICswMjAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiB1c2UgbG9ja2VkIHN0YXRlIG9uIGludGVybmFsIGJpbnMKKwkgIFNldCB0aGUgbG9ja2VkIHN0YXRlIG9uIGludGVybmFsIGVsZW1lbnRzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXkgZG9uJ3QgY2hhbmdlCisJICBiYWNrIHRvIGFub3RoZXIgc3RhdGUgd2hlbiBzaHV0dGluZyBkb3duLgorCSAgRml4ZXMgIzU5NDI0OAorCisyMDA5LTA5LTA3IDE4OjI4OjUxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICB2NGwyc3JjOiBhZGQgc3VwcG9ydCBmb3IgbXBlZyBmb3JtYXRzCisKKzIwMDktMDktMDUgMjA6NTE6MTQgLTA3MDAgIFphaGVlciBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5oOgorCSAgeTRtZW5jOiBBZGQgaW50ZXJsYWNlZCBzdXBwb3J0CisJICBGaXhlcyAjNTkxNzEzCisJICBTaWduZWQtb2ZmLWJ5OiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworMjAwOS0wOC0yNCAxMzo0Mjo0MiAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOgorCSogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc2luay5jOgorCSogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zcmMuYzoKKwkqIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NyYy5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc3JjLmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBSZW1vdmUgUm9uYWxkIEJ1bHRqZSBmcm9tIEF1dGhvcnMgZmllbGQKKwkgIFJlcGxhY2VkIHdpdGggIkdTdHJlYW1lciBtYWludGFpbmVycworCSAgPGdzdHJlYW1lci1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+IiBvciBqdXN0IHJlbW92ZWQsCisJICBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBvdGhlciBhdXRob3JzLgorCisyMDA5LTA5LTA1IDEwOjIxOjMxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDAwYTg1OWUgdG8gMTlmYTRmMworCisyMDA5LTA5LTA0IDEzOjQyOjQzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcHJldmVudCBhIHNwdXJpb3VzIGRlYnVnIHdhcm5pbmcKKworMjAwOS0wOS0wNCAwOTozMjo0MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IERlZmluZSBWNEwyX0ZNVF9GTEFHX0VNVUxBVEVEIGlmIGl0J3Mgbm90IGRlZmluZWQgeWV0CisJICBsaWJ2NGwyIGFscmVhZHkgdXNlcyB0aGlzIGZsYWcsIGV2ZW4gb24gTGludXgga2VybmVsIHZlcnNpb25zCisJICBiZWZvcmUgMi42LjMyLgorCisyMDA5LTA5LTA0IDA3OjEwOjAzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBDb3JyZWN0bHkgaGFuZGxlIE5VTEwgR3N0SW5kZXgKKworMjAwOS0wOS0wMyAyMDo0MDoxNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IEZpeCBzdHVwaWQgdHlwbyBpbiBsYXN0IGNvbW1pdAorCisyMDA5LTA5LTAzIDIwOjM4OjUwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogUHV0IGVtdWxhdGVkIGZvcm1hdHMgYmVoaW5kIG5hdGl2ZSBmb3JtYXRzCisJICBGaXhlcyBidWcgIzU5Mzc2NC4KKworMjAwOS0wOS0wMyAxOTozNzoxMCArMDIwMCAgTGF1cmVudCBHbGF5YWwgPHNwZ2xlZ2xlIGF0IHlhaG9vLmZyPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cHNvdXJjZTogZml4IG1lbWxlYWsKKwkgIERvbid0IGxlYWsgdGhlIGlucHV0IGJ1ZmZlciB3aGVuIHRoZSByZWNlaXZlZCBhbmQgZXhwZWN0ZWQgc2VxbnVtIGFyZSBkaWZmZXJlbnQgd2hlbgorCSAgaW4gcHJvYmF0aW9uLgorCSAgZml4ZXMgIzU5NDAzOQorCisyMDA5LTA5LTAyIDE1OjIxOjAyIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBMb2NrIGNsb2NrX3JhdGUgdmFyaWFibGUKKwkgIFRoZSBwcml2LT5jbG9ja19yYXRlIHZhcmlhYmxlIGNvdWxkIGJlY29tZSAtMSBiZXR3ZWVuIHdoZW4gaXRzIGNoZWNrZWQgdG8gbm90CisJICBiZSAtMSBhbmQgd2hlbiBpdHMgdXNlZCwgY2F1c2luZyBhbiBhc3NlcnRpb24uIEZpeGVkIGJ5IHRha2luZyB0aGUgbXV0ZXgKKwkgIGVhcmxpZXIgaW4gdGhlIGNoYWluKCkgZnVuY3Rpb24uCisJICBGaXhlcyAjNTkzOTU1CisKKzIwMDktMDktMDMgMTk6MTI6MzkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291cmNlOiB3aGl0ZXNwYWNlIGZpeGVzCisKKzIwMDktMDktMDMgMTk6MDk6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJICBydHBtcGFwYXk6IHdoaXRlc3BhY2UgZml4ZXMKKworMjAwOS0wOS0wMyAxOTowODo1MyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogd2hpdGVzcGFjZSBmaXhlcworCisyMDA5LTA5LTAzIDE3OjMzOjI4ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBBdm9pZCB1bm5lY2Vzc2FyeSBwcm9jZXNzaW5nIHVudGlsIHdlIGhhdmUgYSBmdWxsIHBpY3R1cmUuCisJICBUaGlzIGlzIGZvciBub24tcGFja2V0aXplZCBtb2RlLCB3aGVuIHdlIGtub3cgdGhlIHVwc3RyZWFtIHNpemUgaW4gYnl0ZXMuCisKKzIwMDktMDktMDMgMTQ6NDA6MjAgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogZnVsbHkgdXNlIHRhZ3NldHRlciB0byBtYW5hZ2UgdGhlIHRhZ3MuIEZpeGVzICM1NjMyMjEKKwkgIFRoZXJlIGlzIG5vIG5lZWQgdG8gbWFuYWdlIGEgc2VwYXJhdGUgdGFnbGlzdC4KKworMjAwOS0wOS0wMyAxNDoxMzo0MyArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkgIHNwZWV4ZW5jOiBzbWFsbCB0YWdsaXN0IGhhbmRsaW5nIGNsZWFudXAKKwkgIERvbid0IGV2ZW50dWFseSBsZWFrIHRoZSBsaXN0IGFuZCBpbnN0ZWFkIGFzc2VydCAobGlrZSBpbiBvdGhlciBlbGVtZW50cykuCisKKzIwMDktMDktMDIgMjM6MTI6NDEgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBhbHNvIGd1YXJkIHJlc2V0aW5nIHN1YnNjcmliZSBjYWxsYmFjayB3aXRoIGlmZGVmcworCSAgSXQgaXMgY29uZGl0aW9uYWx5IHNldCwgc28gZG8gdGhlIHNhbWUgd2hlbiB1bnNldHRpbmcuCisKKzIwMDktMDktMDEgMTU6MDY6NDYgKzAyMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBtYW5hZ2VyOiBGaXhlZCBhIGNvcHkgJiBwYXN0ZSBlcnJvcgorCisyMDA5LTA5LTAxIDEzOjIxOjIzICswMjAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwbWFuYWdlcjogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUgcHJpdgorCSAgVGhlIHZhcmlhYmxlIHByaXYgd2FzIGluaXRpYWxpemVkIGluIGEgbG90IG9mIGZ1bmN0aW9ucyBidXQgdGhlbiBuZXZlcgorCSAgdXNlZCBmb3IgYW55dGhpbmcuCisKKzIwMDktMDktMDEgMTM6MDM6NTcgKzAyMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBtYW5hZ2VyOiBBIGxpdHRsZSBjbGVhbiB1cAorCSAgTWFrZSB0aGUgY29kZSBmbG93IG9mIGdzdF9ydHBfc2Vzc2lvbl9zZW5kX3J0Y3AoKSBhbmQKKwkgIGdzdF9ydHBfc2Vzc2lvbl9zeW5jX3J0Y3AoKSBpZGVudGljYWwuCisKKzIwMDktMDktMDEgMTI6NDc6NTEgKzAyMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBtYW5hZ2VyOiBNYWtlIHN1cmUgdGhhdCB1c2VkIGNhcHMgYXJlIG5vdCBmcmVlZCBhbHJlYWR5ICh0YWtlIDIpCisJICBUaGlzIHJlaW50cm9kdWNlcyB0aGUgZml4IGZvciBidWcgIzU5MzM5MS4gSXQgYWxzbyBhcHBsaWVzIGl0IGluCisJICBnc3RfcnRwX3Nlc3Npb25fc3luY19ydGNwKCkgd2hpY2ggaGFzIHZlcnkgc2ltaWxhciBjb2RlIHRvCisJICBnc3RfcnRwX3Nlc3Npb25fc2VuZF9ydGNwKCkuCisKKzIwMDktMDktMDEgMTI6NDE6MzYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaDoKKwkgIGppdHRlcmJ1ZmZlcjogbWFrZSBzdXJlIHRpbWUgZG9lcyBub3QgZ28gYmFja3dhcmRzCisJICBXaGVuIHdlIGNvbnN0cnVjdCBhIHRpbWVzdGFtcCB0aGF0IHdvdWxkIHJlc3VsdCBpbiBhIHRpbWVzdGFtcCB0aGF0IGlzIGVhcmxpZXIKKwkgIHRoYW4gd2hlbiB0aGUgcGFja2V0IHdhcyByZWNlaXZlZCwgcmVzZXQgdGhlIHNrZXcgY2FsY3VsYXRpb24gYXMgdGhpcyBpcworCSAgcHJvYmFibHkgYSBzaWduIHRoYXQgdGhlIHNlbmRlciByZXN0YXJ0ZWQgb3IgcGF1c2VkLgorCSAgRml4ZXMgIzU5MzM1NAorCisyMDA5LTA5LTAxIDExOjMyOjQxICswMjAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwbWFuYWdlcjogU2V0IGNhcHMgaW4gZ3N0X3J0cF9zZXNzaW9uX3NlbmRfcnRjcCgpIGNvcnJlY3RseSBhZ2FpbgorCSAgVGhlIHRlc3QgZm9yIHdoZW4gdG8gc2V0IGFuIFJUQ1AgY2FwcyBvbiB0aGUgb3V0cHV0IHBhZCBpbgorCSAgZ3N0X3J0cF9zZXNzaW9uX3NlbmRfcnRjcCgpIGFjY2lkZW50YWxseSBnb3QgaW52ZXJ0ZWQgaW4gdGhlIGxhc3QgY29tbWl0LgorCisyMDA5LTA5LTAxIDEwOjI2OjQ2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWRkIHN1cHBvcnQgZm9yIFFDRUxQIGF1ZGlvCisJICBGaXhlcyBidWcgIzU5Mzc1Ny4KKworMjAwOS0wOC0zMSAxODoxMDoxMSArMDIwMCAgUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2pAYXhpcy5jb20+CisKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmV2LmM6CisJKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmM6CisJKiBnc3QvZWZmZWN0di9nc3R2ZXJ0aWdvLmM6CisJICBlZmZlY3R2OiBGaXggY29tcGlsYXRpb24gd2l0aCBnY2MgMworCSAgUmVjZW50IGNoYW5nZXMgaW4gZ3N0LXBsdWdpbnMtZ29vZC9nc3QvZWZmZWN0diBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIGNvbXBpbGVkCisJICB3aXRoIGdjYyAzLiBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZSBuZXcgY29kZSB1c2VzIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMKKwkgIHdpdGhpbiBhIG1hY3JvIGNhbGwgd2hpY2ggZG9lcyBub3Qgd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIGdjYy4KKwkgIEZpeGVzIGJ1ZyAjNTkzNjg4LgorCisyMDA5LTA4LTMxIDE2OjIwOjU5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBkb2NzOiBzbWFsbCBjbGVhbi11cHMgaW4gLXNlY3Rpb25zLnR4dAorCSAgUmVtb3ZlIGR1cGxpY2F0ZSBlbnRyeSBmb3Igd2FycHR2OyB0aGVyZSBpcyBubyB0YWdsaWJtdXggZWxlbWVudC4KKworMjAwOS0wOC0yNyAxNTo0Njo1MiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJICBydHBtcDRnZGVwYXk6IGNvbnNpZGVyIChvcHRpb25hbCkgYXV4aWxpYXJ5IGRhdGEgd2hlbiBwYXJzaW5nCisKKzIwMDktMDgtMjcgMTU6NDY6MTUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuaDoKKwkgIHJ0cG1wNGdkZXBheTogaGFuZGxlIGJyb2tlbiBBVS1JbmRleCBpbiBub24taW50ZXJsZWF2ZWQgc3RyZWFtcworCSAgSW4gY2FzZSBvZiBub24taW50ZXJsZWF2ZWQgKD0gc2VxdWVudGlhbGx5IHBheWxvYWRlZCkgc3RyZWFtcywKKwkgIHRoZSBBVS1JbmRleCBzZXJ2ZXMgbGl0dGxlIHB1cnBvc2UgKHRoYXQgaXMgbm90IGFscmVhZHkgY292ZXJlZCBieQorCSAgUlRQIGZpZWxkcykuICAoQnJva2VuKSBQYXlsb2FkZXJzIG1pZ2h0IGNvbnNpZGVyIHRoaXMgZmllbGQgdGhlbgorCSAgdG8gYmUgZGlzcmVnYXJkZWQgYW5kIGhhdmUgbm9uIHNwZWMgY29tcGxpYW50IHZhbHVlcywgZS5nLiBlYWNoCisJICBSVFAgcGFja2V0IGhhdmluZyBBVS1JbmRleCAyIChyYXRoZXIgdGhhbiAwKS4gIEFzIHN1Y2gsIGVuc3VyZS9mb3JjZQorCSAgc2ltcGxlIHNlcXVlbnRpYWwgc2VuZGluZyBvZiBub24taW50ZXJsZWF2ZWQgc3RyZWFtcy4KKworMjAwOS0wOC0xOCAxNzoxNzoyOCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFsc28gZXh0cmFjdCBmdHlwIGluZm8gaW4gcHVzaCBtb2RlCisKKzIwMDktMDgtMTMgMTY6MTE6NTkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJICBxdGRlbXV4OiBjb25zaWRlciAzZ3BwIHN0eWxlIHRhZyBwYXJzaW5nIGluIHNvbWUgbW9yZSBjYXNlcworCSAgM0dQUCBzcGVjcyBkZWZpbmUgYSBudW1iZXIgb2YgdGFncyBhbG9uZyB3aXRoIHByZWNpc2UgbGF5b3V0LiBXaGlsZSB0aGVzZQorCSAgYXJlIG5vcm1hbGx5IGV4cGVjdGVkIHRvIGJlIGZvdW5kIGluIGEgY29udGFpbmVyIHdob3NlIG1ham9yIGJyYW5kIGlzIGEKKwkgIDNHUFAgYnJhbmQsIHRoaXMgbWF5IGFsc28gaGFwcGVuIHdoZW4gYSAzR1BQIGJyYW5kIGlzIG9ubHkgbWVudGlvbmVkIGFzIGEKKwkgIGNvbXBhdGlibGUgYnJhbmQuICBBcHBseSBzb21lIGNoZWNrcywgaGV1cmlzdGljIGFuZCBmYWxsYmFja3MgdG8gZXh0cmFjdAorCSAgc3VjaCB0YWdzIGFzIHdlbGwuCisKKzIwMDktMDgtMTEgMTM6NTY6NDMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiByZWZsb3cgZXhpdCwgYW5kIGZpeCBzb21lIGxlYWtzCisKKzIwMDktMDgtMTEgMTM6NTQ6NTYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBwdXNoIG1vZGU7IGFkZCBwYWQgaWYgbmVlZGVkIHNvIGRvd25zdHJlYW0gZ2V0cyBFT1MKKworMjAwOS0wOC0xMCAxNjoxOTowMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICB3YXZwYXJzZTogcHVzaCBtb2RlOyBmaXgvaW1wcm92ZSBjaHVuayBoYW5kbGluZworCSAgSGFuZGxlIGxhcmdlLCBpbnZhbGlkIG9yIG90aGVyd2lzZSB1bnVzdWFsIGNodW5rIHNpemVzLgorCSAgVmVyaWZ5IHNvbWUgY2h1bmsgc2l6ZXMgdG8gYmUgYXQgbGVhc3QgdGhlIHNpemUgdGhleSBhcmUKKwkgIGV4cGVjdGVkIHRvIGJlIGFuZCByb3VuZCB1cCBzb21lIHNpemVzIHRvIGV2ZW4gbnVtYmVyIGZvcgorCSAgZS5nLiBvZmZzZXQgYWRtaW5pc3RyYXRpb24sIHdoaWNoIG11c3QgYWxzbyBiZSBwcm9wZXJseQorCSAgdHJhY2tlZCBpbiBwdXNoIG1vZGUuCisKKzIwMDktMDgtMDggMjE6NTQ6MDAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogcHVzaCBtb2RlOyBjYXRlciBmb3IgdW51c3VhbCBjaHVuayBzaXplcworCisyMDA5LTA4LTMxIDE2OjM0OjE0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiB1c2UgcHJvcGVyIGxvY2tpbmcgZm9yIHBhZHMgYW5kIGNhcHMKKwkgIFVzZSB0aGUgc2VzaW9uIGxvY2sgYW5kIHNob3Rkb3duIHZhcmlhYmxlIHRvIHByb3RlY3QgYW5kIHJlZiB0aGUgcGFkcyB3ZSBhcmUKKwkgIGdvaW5nIHRvIHB1c2ggb24uCisJICBmaXhlcyAjNTYxODI1CisKKzIwMDktMDgtMzEgMTY6MzM6MjYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiB3aGl0ZXNwYWNlIGZpeGVzCisKKzIwMDktMDgtMzEgMTM6Mzg6MDggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBjbGVhbiB1cCBhZGFwdGVyIHByb3Blcmx5CisJICBSZWZsb3cgY29kZSBzbyB3ZSBkb24ndCB0cnkgdG8gY2xlYXIgb3IgcmUtdXNlIGFuIGFscmVhZHktZnJlZWQgYWRhcHRlci4KKworMjAwOS0wOC0zMSAxMzowNzo1MyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgZmxhY3RhZywgd2F2cGFyc2U6IEdzdEFkYXB0ZXIgaXMgbm90IGEgR3N0T2JqZWN0CisKKzIwMDktMDgtMzEgMTI6Mjg6NTIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkgIGRvY3M6IHVwZGF0ZSBwbHVnaW4gZG9jcyB0byBnaXQgdmVyc2lvbgorCisyMDA5LTA4LTMxIDExOjMyOjM5ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBGaXggdGVzdHMgd2FybmluZyBmcm9tIHNldHRpbmcgYSBOVUxMIGluZGV4CisJICBTZXR0aW5nIGEgbnVsbCBpbmRleCBpbiB0aGUgdGVzdHMgd2FzIGNhdXNpbmcgd2FybmluZ3MgYnkgdW5yZWZmaW5nCisJICBOVUxMIHBvaW50ZXJzLiBUaGlzIGlzIGEgYnVnIGV4cG9zZWQgYnkgYSByZWNlbnQgY2hhbmdlIGluIGNvcmUsIGl0CisJICBzZWVtcy4KKworMjAwOS0wOC0zMSAxMzowMjoxNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGFkZCBzbG9wZSBlc3RpbWF0aW9uIGNvZGUgYW5kIGRlYnVnCisJICBBZGQgc29tZSBjb2RlIHRvIG1lYXN1cmUgdGhlIHNlbmRlciBzcGVlZCB2cyB0aGUgcmVjZWl2ZXIgc3BlZWQuIFRoaXMgY2FuIGJlCisJICB1c2VkIHRvIGRldGVjdCBidXJzdHMuCisKKzIwMDktMDgtMzEgMTI6NTc6MzIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiByZXNldCBza2V3IHdoZW4gdGltZXN0YW1wcyBjaGFuZ2UKKwkgIFJlZmFjdG9yIHRoZSBqaXR0ZXJidWZmZXIgcmVzeW5jIGNvZGUuCisJICBSZXNldCB0aGUgc2tldyBjb3JyZWN0aW9uIHdoZW4gd2UgZGV0ZWN0IGEgYmlnIHRpbWVzdGFtcCBkaXNjb250LgorCSAgU2VlICM1OTMzNTQKKworMjAwOS0wOC0zMSAxMjo0NzoxNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IG1ha2Ugc3VyZSB0aW1lIG5ldmVyIGdvZXMgaW52YWxpZAorCSAgU2luY2UgdGhlIHNrZXcgY2FuIGJlIG5lZ2F0aXZlLCB3ZSBtaWdodCBlbmQgdXAgd2l0aCBpbnZhbGlkIHRpbWVzdGFtcHMuIENoZWNrCisJICBmb3IgbmVnYXRpdmUgcmVzdWx0cyBhbmQgY2xhbXAgdG8gMC4KKwkgIFNlZSAjNTkzMzU0CisKKzIwMDktMDgtMzEgMTI6MTY6MDEgKzAyMDAgIEphcmtrbyBQYWx2aWFpbmVuIDxqYXJra28ucGFsdmlhaW5lbiBhdCBzZXNjYS5jb20+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSAgdWRwc2luazogQWRkIHR0bCBtdWx0aWNhc3QgcHJvcGVydHkKKwkgIEFkZCBhIG5ldyB0dGwtbWMgcHJvcGVydHkgdG8gY29udHJvbCB0aGUgVFRMIG9uIG11bHRpY2FzdCBhZGRyZXNzZXMuCisJICBGaXhlcyAjNTg4MjQ1CisKKzIwMDktMDgtMzEgMTI6MTM6MDcgKzAyMDAgIEphcmtrbyBQYWx2aWFpbmVuIDxqYXJra28ucGFsdmlhaW5lbiBhdCBzZXNjYS5jb20+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmM6CisJKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmg6CisJICB1ZHA6IHNwbGl0IG91dCBUVEwgYW5kIGxvb3Agb3B0aW9ucworCSAgU3BsaXQgc2V0dGluZyB0aGUgVFRMIGFuZCBsb29wIHBhcmFtZXRlcnMgaW4gMiBtZXRob2RzIGFzIHRoZXkgYXJlIG5vdCByZWxhdGVkLgorCSAgRml4IHNldHRpbmcgdGhlIFRUTCBjb3JyZWN0bHkgZm9yIG11bHRpY2FzdCBzdHJlYW1zLgorCSAgU2VlICM1ODgyNDUKKworMjAwOS0wOC0yNyAxMjozNjozNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkgIHJ0cDogd2hpdGVzcGFjZSBmaXhlcworCisyMDA5LTA4LTE0IDEzOjQ1OjIyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgdmlkZW9ib3g6IENvcnJlY3RseSBhZGQgdG8gdGhlIGRvY3MKKworMjAwOS0wOC0xNCAxMzo0MDoyMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94Lmg6CisJICB2aWRlb2JveDogU3BsaXQgZGVjbGFyYXRpb25zIGludG8gYSBoZWFkZXIgZmlsZSBhbmQgYWRkIGF1dG9jcm9wIHN0dWZmIHRvIHRoZSBkb2NzCisKKzIwMDktMDgtMTQgMTM6MjY6MzYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBSZWNvbmZpZ3VyZSBiYXNldHJhbnNmb3JtIGlmIHNvbWV0aGluZyBjaGFuZ2VzIGFnYWluCisJICBGb3IgdGhpcyBpbnZlbnQgYSBuZXcgbG9jayBhbmQgZG9uJ3QgYWJ1c2UgdGhlIGJhc2V0cmFuc2Zvcm0gbG9jaywKKwkgIG90aGVyd2lzZSB3ZSdsbCBlbmQgdXAgaW4gZGVhZGxvY2tzLgorCisyMDA5LTA4LTE0IDEzOjE1OjU3ICswMjAwICBTdGVwaGVuIEp1bmdlbHMgPHN0ZXBoZW5AanVuZ2Vscy5uZXQ+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IEFkZCBzdXBwb3J0IGZvciBhdXRvY3JvcHBpbmcgYWNjb3JkaW5nIHRvIHRoZSBjYXBzCisJICBGaXhlcyBidWcgIzU4MjIzOC4KKworMjAwOS0wOC0zMCAyMTo1Nzo1NyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IE1ha2Ugc3VyZSB0aGF0IHVzZWQgY2FwcyBhcmUgbm90IGZyZWVkIGFscmVhZHkKKwkgIEZpeGVzIGJ1ZyAjNTkzMzkxLgorCisyMDA5LTA4LTI2IDE3OjAyOjQ1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmM6CisJICBydHA6IFVzZSBuZXcgZ3N0X2l0ZXJhdG9yX25ld19zaW5nbGUoKSBmb3IgdGhlIGludGVybmFsIGxpbmtlZCBwYWRzIGl0ZXJhdGlvbgorCisyMDA5LTA4LTE5IDE2OjU3OjA1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogVXNlIGl0ZXJhdGUgaW50ZXJuYWwgbGlua3MgaW5zdGVhZCBvZiBkZXByZWNhdGVkIGdldCBpbnRlcm5hbCBsaW5rcworCisyMDA5LTA4LTE5IDE2OjQ4OjI1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IFVzZSBpdGVyYXRlIGludGVybmFsIGxpbmtzIGluc3RlYWQgb2YgZGVwcmVjYXRlZCBnZXQgaW50ZXJuYWwgbGlua3MKKworMjAwOS0wOC0xOSAxNjozNzoxMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgcnRwc3NyY2RlbXV4OiBVc2UgaXRlcmF0ZSBpbnRlcm5hbCBsaW5rcyBpbnN0ZWFkIG9mIGRlcHJlY2F0ZWQgZ2V0IGludGVybmFsIGxpbmtzCisKKzIwMDktMDgtMzAgMjM6Mjc6MDkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBVcGRhdGUgY29tbW9uCisKKzIwMDktMDgtMzAgMjM6MjY6NDggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBCYWNrIHRvIGhhY2tpbmcgLT4gMC4xMC4xNi4xCisKKz09PSByZWxlYXNlIDAuMTAuMTYgPT09CisKKzIwMDktMDgtMjkgMTI6MDU6NDAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2FtbWEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBSZWxlYXNlIDAuMTAuMTYKKworMjAwOS0wOC0yNiAwMDo1ODo0NSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIDAuMTAuMTUuNSBwcmUtcmVsZWFzZQorCisyMDA5LTA4LTI1IDE2OjUzOjI5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGRvbid0IHVzZSByZWxhdGl2ZSBzZWVrcworCSAgRG9uJ3QgdXNlIHJlbGF0aXZlIHNlZWtzLCBpdCdzIHRvbyBoYXJkIHRvIHRyYWNrIHdoZXJlIHdlIGFyZSBhZnRlciBhIGZsdXNoCisJICBldGMuCisJICBmaXhlcyAjNTkzMDE1CisKKzIwMDktMDgtMjQgMTc6NTA6MjkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBwby9MSU5HVUFTOgorCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIDAuMTAuMTUuNCBwcmUtcmVsZWFzZQorCisyMDA5LTA4LTI0IDE2OjIyOjQ3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBkb24ndCBkaXNjYXJkIHRoZSByZXN1bHQgb2YgX3NldF9jYXBzKCkKKwkgIFVzZSB0aGUgcmVzdWx0IG9mIGdzdF9wYWRfc2V0X2NhcHMoKSBpbnN0ZWFkIG9mIGFzc3VtaW5nIHN1Y2Nlc3MuCisJICBTZWUgIzU5MDY3OAorCisyMDA5LTA4LTIxIDExOjQ0OjQzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2ZvdXJjYy5oOgorCSAgcXRkZW11eDogYWRkIHN1cHBvcnQgZm9yIGFnc20KKwkgIEZpeGVzICM1OTI1MzAKKworMjAwOS0wOC0xOCAxNzoxNjoxMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBxdCBzdHlsZSBzdHJpbmcgdGFnIGV4dHJhY3Rpb24KKwkgIFFUIHN0eWxlIHRhZ3MgYXJlIHRlc3RlZCBvbiBzdGFydGluZyB3aXRoIChDKSBzeW1ib2wgdXNpbmcgPj4sCisJICBhbmQgKHVuc2lnbmVkKSBpbnQgKG1heSkgaGF2ZSBkaWZmZXJlbnQgPj4gYmVoYXZpb3VyLgorCSAgRml4ZXMgIzU5MjIzMi4KKworMjAwOS0wOC0xNyAxNTo0ODoyMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL3Ntb2tlY29kZWMuYzoKKwkgIHNtb2tlZW5jOiBkb24ndCBjcmFzaCB3aGVuIGNvbXBpbGVkIGFnYWluc3QgbGlianBlZzcKKwkgIFNldCBwYXJhbWV0ZXJzIHNvIHRoYXQgd2UgZG9uJ3QgY3Jhc2ggd2l0aCBsaWJqcGVnNy4gQmFzZWQgb24KKwkgIFN0ZWZhbiBLb3N0J3MgZml4IGZvciBqcGVnZW5jLiBGaXhlcyAjNTkxOTUxLgorCisyMDA5LTA4LTE0IDIwOjE4OjA0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICAwLjEwLjE1LjMgcHJlLXJlbGVhc2UKKworMjAwOS0wOC0xNCAxMzo0NTowOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbi5jOgorCSAgY2hlY2tzOiBhZGQgdGVzdCBmb3IgbGVhayB0byBydHBiaW4gdW5pdCB0ZXN0CisJICBTZWUgIzU5MTQ3Ni4KKworMjAwOS0wOC0xMSAxNDo0NzoxMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogRml4IHJlZmVyZW5jZSBsZWFrCisJICBGaXhlcyAjNTkxNDc2LgorCisyMDA5LTA4LTE0IDEzOjM0OjUzICswMTAwICBaYWhlZXIgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzoKKwkgIGR2ZGVjOiBzZXQgYm90dG9tIGZpZWxkIGZpcnN0IG9uIFBBTCBpbnRlcmxhY2VkIGNvbnRlbnQsIG5vdCB0b3AgZmllbGQgZmlyc3QKKwkgIERWIGludGVybGFjZWQgY29udGVudCBpcyBhbHdheXMgYm90dG9tIGZpZWxkIGZpcnN0LiBGaXhlcyAjNTkxNzEyLgorCisyMDA5LTA4LTE0IDEyOjQ0OjA2ICswMTAwICBIYW5zIGRlIEdvZWRlIDxqd3JkZWdvZWRlQGZlZG9yYXByb2plY3Qub3JnPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBmaXggJ2hhbmcnIHdpdGggc29tZSBjYW1lcmFzIGNhdXNlZCBieSBiYWQgdGltZXN0YW1waW5nIGlmIG5vIGZyYW1lcmF0ZSBpcyBhdmFpbGFibGUKKwkgIEZvciBjYW1lcmFzL2RyaXZlcnMgdGhhdCBkb24ndCBzdXBwb3J0IGUuZy4gVklESU9DX0dfUEFSTSB3ZSdkIGVuZCB1cCB3aXRob3V0CisJICBhIGZyYW1lcmF0ZSBhbmQgd291bGQgdHJ5IHRvIGRpdmlkZSBieSAwLCBjYXVzaW5nIHJ1bi10aW1lIHdhcm5pbmdzIGFuZCBhbGwKKwkgIGZyYW1lcyB0byBiZSB0aW1lc3RhbXBlZCB3aXRoIDAsIHdoaWNoIG1ha2VzIHNpbmtzIHRoYXQgc3luYyBhZ2FpbnN0IHRoZSBjbG9jaworCSAgZHJvcCB0aGVtLCBjYXVzaW5nICdoYW5ncycgKG9ic2VydmVkIHdpdGggdGhlIHB3YyBkcml2ZXIgYW5kIGEgTG9naXRlY2ggUXVpY2tDYW0KKwkgIFBybyA0MDAwKS4gU28gaWYgd2UgZG8gbm90IGtub3cgdGhlIGZyYW1lcmF0ZSwgc2ltcGx5IGRvbid0IGFkanVzdCB0aGUKKwkgIHRpbWVzdGFtcHMuIEZpeGVzICM1OTE0NTEuCisKKzIwMDktMDgtMTQgMTA6MTE6MjUgKzAyMDAgIEZpbGlwcG8gQXJnaW9sYXMgPGZpbGlwcG8uYXJnaW9sYXNAZ21haWwuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBjbGVhciBmb3JtYXQgbGlzdCBpbiBSRUFEWS0+TlVMTAorCSAgQ2xlYXIgZm9ybWF0IGxpc3QgYW5kIHByb2JlZCBjYXBzIHdoZW4gZ29pbmcgdG8gTlVMTCBzbyBpZiBhIG5ldyBkZXZpY2UKKwkgIGlzIHNldCB3ZSdsbCBwcm9iZSB0aGUgZm9ybWF0cyBhZ2FpbiBpbnN0ZWFkIG9mIHVzaW5nIHByZXZpb3VzbHkKKwkgIGRldGVjdGVkIG9uZXMuIEZpeGVzIGJ1ZyAjNTkxNzQ3LgorCisyMDA5LTA4LTExIDE2OjQyOjUxIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIGR0bWZzcmM6IEVtcHR5IGV2ZW50IHF1ZXVlIG9uIGZpbmFsaXplCisKKzIwMDktMDgtMTEgMTY6Mzk6NDIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgZHRtZjogVXNlIEdTbGljZSBmb3IgaW50ZXJuYWwgZXZlbnQgc3RydWN0dXJlcworCisyMDA5LTA4LTExIDE2OjIzOjIwIC0wNDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgcnRwZHRtZnNyYzogQ2xlYW51cCBldmVudHMgb24gZmluYWxpemUKKwkgIFByb2JsZW0gZm91bmQgYnkgTGF1cmVudCBHbGF5YWwKKwkgIEZpeGVzIGJ1ZyAjNTkxNDQwCisKKzIwMDktMDgtMTEgMTY6MjM6MjAgLTA0MDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBydHBkdG1mc3JjOiBDbGVhbnVwIGV2ZW50cyBvbiBmaW5hbGl6ZQorCSAgUHJvYmxlbSBmb3VuZCBieSBMYXVyZW50IEdsYXlhbAorCSAgRml4ZXMgYnVnICM1OTE0NDAKKworMjAwOS0wOC0xMSAxNzozMDo0MSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHBvL0xJTkdVQVM6CisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIDAuMTAuMTUuMiBwcmUtcmVsZWFzZQorCisyMDA5LTA4LTExIDE1OjI1OjM5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogTUFJTlRBSU5FUlM6CisJICBBZGQgbXlzZWxmIHRvIE1BSU5UQUlORVJTIGZpbGUgYW5kIHVwZGF0ZSBXaW0ncyBlLW1haWwuCisKKzIwMDktMDgtMTEgMDM6MDg6MDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkgIHY0bDI6IGZpeCBtYWtlIGRpc3RjaGVjayBieSBkaXN0aW5nIHNvbWUgbW9yZSBoZWFkZXJzCisKKzIwMDktMDgtMTEgMDI6NDI6MTYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFsczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkgIGRvY3M6IHVwZGF0ZQorCisyMDA5LTA4LTExIDAyOjMxOjQ0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy8uZ2l0aWdub3JlOgorCSAgTW92ZSBydHBtYW5hZ2VyIGZyb20gLWJhZCB0byAtZ29vZC4KKwkgIEhvb2sgdXAgYnVpbGQgaW5mcmFzdHJ1Y3R1cmUgKGF1dG90b29scywgZG9jcywgdW5pdCB0ZXN0KS4KKworMjAwOS0wOC0wNiAxOToyNjoyMSArMDIwMCAgcmljIDxjc3huanUgYXQgc29nb3UuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cHNvdXJjZTogYXZvaWQgYnVmZmVyIGxlYWsgb24gYmFkIHNlcW51bQorCSAgRml4ZXMgIzU5MDc5NworCisyMDA5LTA3LTI4IDE4OjE4OjIwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cHNvdXJjZTogYWxsb3cgZm9yIE5VTEwgY2FwcyBvbiBidWZmZXJzCisJICBBZGQgdGhlIE5VTEwgY2FwcyBjaGVjayB3aGVyZSBpdCBtYXR0ZXJzIGFuZCBhbHNvIGNvdmVyIGFub3RoZXIgY2FzZSBvZgorCSAgcG90ZW50aWFsIE5VTEwgY2Fwcy4KKwkgIEZpeGVzICM1OTAwMzAKKworMjAwOS0wNy0yOCAxMTo1OTo1NiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cHNvdXJjZTogSW5jb21pbmcgYnVmZmVycyBkbyBub3QgYWx3YXlzIGhhdmUgY2FwcworCisyMDA5LTA3LTI3IDE1OjQ2OjIzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBhdm9pZCBkb2luZyBsaXAtc3luYyBpbiBCWUUKKwkgIFdoZW4gd2UgZ2V0IGEgQllFIHBhY2tldCwgZG9uJ3QgZG8gbGlwLXN5bmMgd2l0aCB0aGUgU1IgaW5zaWRlIGJlY2F1c2Ugc29tZQorCSAgc2VuZGVycyBoYXZlIHRyb3VibGUgY29uc3RydWN0aW5nIHZhbGlkIFNSIHBhY2tldHMgYWZ0ZXIgQllFLgorCisyMDA5LTA3LTI3IDEzOjE3OjIwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBiaW46IGRvbid0IGRvIGxpcC1zeW5jIGFmdGVyIGEgQllFCisJICBBZnRlciBhIEJZRSBwYWNrZXQgZnJvbSBhIHNvdXJjZSwgc3RvcCBmb3J3YXJkaW5nIHRoZSBTUiBwYWNrZXRzIGZvciBsaXAtc3luYworCSAgdG8gcnRwYmluLiBTb21lIHNlbmRlcnMgZG9uJ3QgdXBkYXRlIHRoZWlyIFNSIHBhY2tldHMgY29ycmVjdGx5IGFmdGVyIHNlbmRpbmcgYQorCSAgQllFIGFuZCB0aGVuIHdlIGJyZWFrIGxpcC1zeW5jLiBXZSBwcmVmZXIgdG8gbGV0IHRoZSBqaXR0ZXJidWZmZXJzIGRyYWluIHdpdGgKKwkgIHRoZSBjdXJyZW50IGxpcC1zeW5jIGluc3RlYWQuCisKKzIwMDktMDctMjcgMTI6NDM6MDIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cGJpbjogb25seSByZWNvbnNpZGVyIG9uY2UgZm9yIEJZRQorCSAgV2hlbiBpdGVyYXRpbmcgdGhlIHNvdXJjZXMgb2YgYSBCWUUgcGFja2V0LCBkb24ndCBzaWduYWwgYSByZWNvbnNpZGVyYXRpb24gZm9yCisJICBlYWNoIG9mIHRoZW0gYnV0IHNpZ25hbCBhZnRlciB3ZSBoYW5kbGVkIGFsbCBzb3VyY2VzLgorCisyMDA5LTA3LTIxIDE1OjMzOjQxIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IEZyZWUgY29uZmxpY3RpbmcgYWRkcmVzc2VzIG9uIGZpbmFsaXplCisKKzIwMDktMDctMDEgMTI6NTU6MDMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwYmluOiB1c2UgbmV3IG1ldGhvZCBmb3IgbmV0YWRkcmVzcyB0byBzdHJpbmcKKworMjAwOS0wNi0yOSAxODo0ODozMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW4uYzoKKwkgIHJ0cGJpbjogZG8gYmV0dGVyIGNsZWFudXAgb2YgdGhlIHNyYyBnaG9zdHBhZHMKKwkgIENvbm5lY3QgdG8gdGhlIHBhZC1yZW1vdmVkIHNpZ25hbCBvZiB0aGUgcHRkZW11eCBlbGVtZW50cyBzbyB0aGF0IHdlIHJlbW92ZSB0aGUKKwkgIGdob3N0cGFkcyBmb3IgdGhlbS4gRml4ZXMgY2xlYW51cCB3aGVuIGdvaW5nIHRvIE5VTEwgYXMgd2VsbCBhcyB3aGVuIHJlbGVhc2luZworCSAgdGhlIHNpbmtwYWRzLgorCSAgRml4ZXMgIzU2MTc1MgorCisyMDA5LTA1LTI4IDE5OjA4OjQwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBhZGQgYSBjb21tZW50CisKKzIwMDktMDYtMjkgMTY6Mzc6NTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBiaW46IGFkZCBTREVTIHByb3BlcnR5CisJICBSZW1vdmUgYWxsIGluZGl2aWR1YWwgU0RFUyBwcm9wZXJ0aWVzIGFuZCB1c2Ugb25lIHNkZXMgcHJvcGVydHkgdGhhdCB0YWtlcyBhCisJICBHc3RTdHJ1Y3R1cmUgaW5zdGVhZC4gVGhpcyB3aWxsIGFsbG93IHVzIHRvIGFkZCBtb3JlIGN1c3RvbSBzdHVmZiB0byB0aGUgU0RFUworCSAgbWVzc2FnZXMgbGF0ZXIuCisKKzIwMDktMDYtMjkgMTY6MjE6MDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBydHBiaW46IGFkZCBTREVTIHByb3BlcnR5IHRoYXQgdGFrZXMgR3N0U3RydWN0dXJlCisJICBSZW1vdmUgYWxsIGluZGl2aWR1YWwgU0RFUyBwcm9wZXJ0aWVzIGFuZCB1c2Ugb25lIHNkZXMgcHJvcGVydHkgdGhhdCB0YWtlcyBhCisJICBHc3RTdHJ1Y3R1cmUgaW5zdGVhZC4gVGhpcyB3aWxsIGFsbG93IHVzIHRvIGFkZCBtb3JlIGN1c3RvbSBzdHVmZiB0byB0aGUgU0RFUworCSAgbWVzc2FnZXMgbGF0ZXIuCisKKzIwMDktMDYtMDIgMTc6NDY6MDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwY2xpZW50LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBjbGllbnQuaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG1hbmFnZXIuYzoKKwkgIHJ0cGJpbjogcmVtb3ZlZCBvbGQgZ3N0cnRwY2xpZW50CisKKzIwMDktMDYtMTkgMTk6MDk6MTkgKzAyMDAgIEJyYW5rbyBTdWJhc2ljIDxicmFua28uc3ViYXNpYyBhdCBheGlzLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbl9idWZmZXJfbGlzdC5jOgorCSAgcnRwYmluOiBhZGQgc3VwcG9ydCBmb3IgYnVmZmVyLWxpc3QKKwkgIEFkZCBzdXBwb3J0IGZvciBzZW5kaW5nIGJ1ZmZlci1saXN0cy4KKwkgIEFkZCB1bml0IHRlc3QgZm9yIHRlc3RpbmcgdGhhdCB0aGUgYnVmZmVyLWxpc3QgcGFzc2VkIHRocm91Z2ggcnRwYmluLgorCSAgZml4ZXMgIzU4NTgzOQorCisyMDA5LTA2LTE5IDE2OjIxOjI4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBNYWtlIGJ1aWxkIHdpdGhvdXQgd2FybmluZ3Mgd2l0aCBkZWJ1Z2dpbmcgZGlzYWJsZWQKKworMjAwOS0wNS0yOCAxNzozNzo0NCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogVHJhbnNmb3JtIHRoZSByaWdodCBzZXNzaW9uIHNkZXMgbWVzc2FnZQorCSAgRml4ZXMgIzU4NDE2NQorCisyMDA5LTA1LTI4IDE3OjMzOjEwIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgQWRkIHNzcmMgdG8gYXBwbGljYXRpb24veC1ydHAtc291cmNlLXNkZXMgc3RydWN0dXJlCisKKzIwMDktMDUtMjcgMTE6MDM6MTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291Y2U6IHRoZSBuZXR3b3JrIGFkZHJlc3MgaXMgaW4gbmV0d29yayBvcmRlcgorCSAgQnJpbmcgdGhlIG5ldHdvcmsgYWRkcmVzcyBpbiBuZXRvd2tyIGJ5dGUgb3JkZXIgdG8gdGhlIGhvc3Qgb3JkZXIuCisKKzIwMDktMDUtMjYgMTU6NDA6NTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291cmNlOiBieXRlc3dhcCB0aGUgcG9ydCBmcm9tIEdzdE5ldEFkZHJlc3MKKwkgIFNpbmNlIHRoZSBwb3J0IGluIEdzdE5ldEFkZHJlc3MgaXMgaW4gbmV0d29yayBvcmRlciB3ZSBtaWdodCBuZWVkIHRvIGJ5dGVzd2FwIGl0CisJICBiZWZvcmUgYWRkaW5nIGl0IHRvIHRoZSBzb3VyY2Ugc3RhdGlzdGljcy4KKworMjAwOS0wNS0yNSAxMzo0NjoyOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IHJlbW92ZSBwdGRlbXV4IGdob3N0cGFkcworCisyMDA5LTA1LTI1IDEzOjMzOjIwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW4uYzoKKwkgIHRlc3RzOiBhZGQgcmVjZWl2ZSBydHBiaW4gdW5pdCB0ZXN0CisKKzIwMDktMDUtMjIgMTY6NDE6MTkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBhZGQgdG8gbmV3IHNpZ25hbCB0byByZW1vdmUgU1NSQyBwYWRzCisKKzIwMDktMDUtMjIgMTY6MzU6MjAgKzAyMDAgIEFsaSBTYWJpbCA8YWxpLnNhYmlsIGF0IGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLW1hcnNoYWwubGlzdDoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4Lmg6CisJICBzc3JjZGVtdXg6IGVtaXQgc2lnbmFsIHdoZW4gcGFkcyBhcmUgcmVtb3ZlZAorCSAgQWRkIGFjdGlvbiBzaWduYWwgdG8gY2xlYXIgYW4gU1NSQyBpbiB0aGUgc3NyYyBkZW11eGVyLgorCSAgQWRkIHNpZ25hbCB0byBub3RpZnkgb2YgcmVtb3ZlZCBzc3JjLgorCSAgU2VlICM1NTQ4MzkKKworMjAwOS0wNS0yMiAxNTo0NToxOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IHVzZSBvdXIgZ2hvc3RwYWRzIGluc3RlYWQgb2YgaXRzIHRhcmdldAorCSAgU2luY2Ugd2Uga2VlcCBhIHJlZmVyZW5jZSB0byBvdXIgZ2hvc3RwYWRzLCB3ZSBjYW4gdXNlIHRoZW0gdG8gdHJhY2sgc2Vzc2lvbnMuCisJICBUaGlzIGF2b2lkIHVzIGhhdmluZyB0byBtZXNzIHdpdGggdGhlIHRhcmdldCBvZiB0aGUgZ2hvc3RwYWQuCisKKzIwMDktMDUtMjIgMTU6Mzc6MjkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbi5jOgorCSAgdGVzdHM6IG1vcmUgcnRwYmluIGNoZWNrcworCisyMDA5LTA1LTIyIDE1OjM2OjE3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogZG9uJ3Qgd2FybiB3aGVuIGdldHRpbmcgcmVxdWVzdCBwYWRzIHR3aWNlCisJICBBbGxvdyBnZXR0aW5nIHRoZSByZXF1ZXN0IHBhZHMgbXVsdGlwbGUgdGltZXMsIGp1c3QgcmV0dXJuIHRoZSBwcmV2aW91c2x5CisJICBjcmVhdGVkIHBhZHMuCisKKzIwMDktMDUtMjIgMTM6NDc6MzAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291cmNlOiBhZGQgUlRQIGFuZCBSVENQIHNvdXJjZSBhZGRyZXNzCisJICBBZGQgdGhlIFJUUCBhbmQgUlRDUCBzZW5kZXIgYWRkcmVzc2VzIGluIHRoZSBzdGF0cyBzdHJ1Y3R1cmUuCisKKzIwMDktMDUtMjIgMTM6NDU6MTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IHJldXNlIHNvdXJjZSBjb2RlIGZvciBTREVTCisJICBSZXVzZSB0aGUgUlRQU291cmNlIG9iamVjdCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIGNvZGUuCisKKzIwMDktMDUtMjIgMTM6NDQ6MTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbi5jOgorCSAgdGVzdHM6IGFkZCBtb3JlIHJ0cGJpbiB0ZXN0cworCisyMDA5LTA1LTIyIDEyOjIzOjI3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW4uYzoKKwkgIHRlc3RzOiBhZGQgcnRwYmluIHVuaXQgdGVzdAorCSAgQWRkIHRoZSBiZWdpbm5pbmdzIG9mIGFuIHJ0cGJpbiB1bml0IHRlc3QKKwkgIEFkZCBzb21lIG1vcmUgc3R1ZmYgdG8gLmdpdGlnbm9yZQorCisyMDA5LTA1LTIyIDEyOjIwOjEzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogc2V0IHRhcmdldCBzdGF0ZSBvbiBuZXcgZWxlbWVudHMKKwkgIFNldCB0aGUgc3RhdGUgb24gbmV3bHkgYWRkZWQgZWxlbWVudHMgdG8gdGhlIHN0YXRlIG9mIHRoZSBwYXJlbnQuCisJICBBZGQgc29tZSBkZWJ1ZyBpbmZvIGFuZCBkbyBzb21lIGNsZWFudXBzCisKKzIwMDktMDUtMjIgMTE6NTk6MTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiB1bnJlZiByZXF1ZXN0cyBwYWRzIGFmdGVyIHJlbGVhc2luZworCisyMDA5LTA1LTIyIDAxOjQzOjUwICswMjAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBJbXBsZW1lbnQgcmVsZWFzaW5nIHRoZSBzdHJlYW1zCisJICBTZWUgIzU2MTc1MgorCisyMDA5LTA1LTIyIDAxOjE2OjExICswMjAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBLZWVwIGpiIHNpZ25hbHMgaGFuZGxlcgorCSAgS2VlcCB0aGUgc2lnbmFsIGhhbmRsZXJzIHNvIHRoZXkgY2FuIGJlIGRpc2Nvbm5lY3RlZCBhdCByZWxlYXNlIHRpbWUKKwkgIFNlZSAjNTYxNzUyCisKKzIwMDktMDUtMjIgMDE6MTI6NTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiB1c2UgdGhlIHJpZ2h0IGxvY2sgZm9yIHRoZSBzZXNzaW9ucworCSAgVXNlIHRoZSByaWdodCBsb2NrIHdoZW4gaXRlcmF0aW5nIHRoZSBzZXNzaW9ucy4KKworMjAwOS0wNS0yMiAwMTowMzo1NSArMDIwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogRnJlZSBzZXNzaW9uIGlmIHJlcXVlc3QgcGFkcyBhcmUgcmVsZWFzZWQKKwkgIEZyZWUgdGhlIHNlc3Npb24gd2hlbiBhbGwgdGhlIHJlcXVlc3QgcGFkcyBhcmUgcmVsZWFzZWQuCisJICBEb24ndCBtZXNzIHdpdGggdGhlIHNlc3Npb24gbGlzdCBpbiBmcmVlX3Nlc3Npb24gYXMgaXQgaXMgY2FsbGVkIGZyb20gYSBmb3JlYWNoCisJICBvbiB0aGF0IGxpc3QuCisJICBTZXQgdGhlIHN0YXRlIG9mIHRoZSB1cHN0cmVhbSBlbGVtZW50IHRvIE5VTEwgZmlyc3QuCisJICBTZWUgIzU2MTc1MgorCisyMDA5LTA1LTIyIDAwOjUxOjUzICswMjAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBJbXBsZW1lbnQgcmVsYXNpbmcgb2YgdGhlIHJ0cCByZWN2IHBhZAorCisyMDA5LTA1LTIyIDAwOjQ0OjUxICswMjAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBJbXBsZW1lbnQgcmVsZWFzaW5nIG9mIHJ0cCBzZW5kIHBhZHMKKworMjAwOS0wNS0yMiAwMDozNDozNiArMDIwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogSW1wbGVtZW50IHJlbGVhc2Ugb2YgdGhlIHJlY3YgcnRjcCBwYWQKKwkgIFNlZSAjNTYxNzUyCisKKzIwMDktMDUtMjIgMDA6MTY6MTkgKzAyMDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IEltcGxlbWVudCByZWxlYXNpbmcgb2YgcnRjcCBzcmMgcGFkCisJICBTZWUgIzU2MTc1MgorCisyMDA5LTA1LTA1IDE2OjQ4OjM3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHJ0cHNzcmNkZW11eDogZHJvcCB1bmV4cGVjdGVkIFJUQ1AgcGFja2V0cworCSAgV2UgdXN1YWxseSBvbmx5IGdldCBTUiBwYWNrZXRzIGluIG91ciBjaGFpbiBmdW5jdGlvbiBidXQgaWYgYW4gaW52YWxpZCBwYWNrZXQKKwkgIGNvbnRhaW5zIHRoZSBTUiBwYWNrZXQgYWZ0ZXIgdGhlIFJSIHBhY2tldCwgd2UgbXVzdCBub3QgZmFpbCBidXQgc2ltcGx5IGlnbm9yZQorCSAgdGhlIG1hbGZvcm1lZCBwYWNrZXQuCisJICBGaXhlcyAjNTgxMzc1CisKKzIwMDktMDQtMjcgMTE6MDk6MDggKzAyMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cHNvdWNlOiBtYWtlIFdBUk5JTkcgaW50byBMT0cKKwkgIFNpbmNlIG5laXRoZXIgcnRwbWFuYWdlciBub3IgYW55IG9mIHRoZSBwYXlsb2FkZXJzIHByb3Blcmx5IGltcGxlbWVudAorCSAgcGFkIGFsbG9jYXRpb24sIHRoZXJlIGlzIG5vIHdheSBmb3IgdGhlIHJ0cG1hbmFnZXIgdG8gaW5mb3JtIGRvd25zdHJlYW0gZWxlbWVudHMKKwkgIG9mIHRoZSBuZXcgU1NSQyBpZiB0aGVyZSBpcyBhbiBTU1JDIGNvbGxpc2lvbi4gU28gdGhlIHdhcm5pbmcgaXMgZW1pdHRlZCBhbGwgdGhlCisJICB0aW1lIGFuZCBpdCBpcyBjb25mdXNpbmcuCisJICBGaXhlcyAjNTgwMTQ0CisKKzIwMDktMDQtMjcgMTE6MDY6MDEgKzAyMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBub3RpZnkgd2hlbiBTU1JDIGNoYW5nZXMKKwkgIEVtaXQgYSBnX29iamVjdF9ub3RpZnkgd2hlbiB0aGUgU1NSYyBjaGFuZ2VzIGJlY2F1c2Ugb2YgYSBjb2xsaXNpb24uCisJICBGaXhlcyAjNTgwMTQ0CisKKzIwMDktMDQtMTcgMTY6MTY6MjkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGpvaW4gdGhlIFJUQ1AgdGhyZWFkCisJICBBdm9pZCBhIGNhc2Ugd2hlcmUgYSBqb2luYWJsZSB0aHJlYWQgd291bGQgYmUgbGVmdCB1bmpvaW5lZCwgd2hpY2ggbGVha2VkIHRoZQorCSAgdGhyZWFkIHN0cnVjdHVyZS4KKwkgIEZpeGVzICM1NzczMTguCisKKzIwMDktMDQtMTUgMTg6MTQ6NDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBwcmV2ZW50IG92ZXJmbG93IGluIEVPUyBlc3RpbWF0aW9uCisJICBVc2UgYSBndWludDY0IGluc3RlYWQgb2YgYSBndWludCB0byBob2xkIGEgNjRiaXQgdmFsdWUgdG8gcHJldmVudCBjb21wbGV0ZWx5CisJICBib2d1ZXMgRU9TIGVzdGltYXRpb24gdmFsdWVzIGR1ZSB0byBvdmVyZmxvd3MuCisKKzIwMDktMDQtMTUgMTc6NDQ6MTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICBydHBiaW46IHdlIHNob3VsZCBub3QgcHJvdmlkZSBhIGNsb2NrCisJICBUaGVyZSBpcyBubyBuZWVkIHRvIHByb3ZpZGUgYSBjbG9jay4KKworMjAwOS0wNC0xNSAxNzoyODo1NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IG1vcmUgZXN0aW1hdGVkIEVPUyBmaXhlcworCSAgRG8gbW9yZSBhY2N1cmF0ZSBFT1MgZXN0aW1hdGUgYW5kIGd1YXJkIGFnYWluc3QgYmFja3dhcmQgdGltZXN0YW1wcy4KKworMjAwOS0wNC0xNSAxNzoyNTowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHJlbGVhc2UgbG9jayBiZWZvcmUgcHVzaGluZyBFT1MKKwkgIE1ha2Ugc3VyZSB3ZSByZWxlYXNlIHRoZSBqaXR0ZXJidWZmZXIgbG9jayBiZWZvcmUgd2Ugc3RhcnQgcHVzaGluZyBvdXQgZGF0YQorCSAgYmVjYXVzZSBlbHNlIHdlIG1pZ2h0IGRlYWRsb2NrLgorCisyMDA5LTAzLTI3IDE3OjQ0OjU3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuaDoKKwkgIHJ0cGJpbjogYWRkIG9uX25wdF9zdG9wIHNpZ25hbAorCSAgQWRkIHRoZSBvbl9ucHRfc3RvcCBzaWduYWwgdG8gcnRwYmluIGFuZCBydHBqaXR0ZXJidWZmZXIgdG8gbm90aWZ5IHRoZQorCSAgYXBwbGljYXRpb24gdGhhdCB0aGUgTlBUIHN0b3AgcG9zaXRpb24gaGFzIGJlZW4gcmVhY2hlZC4KKworMjAwOS0wMy0xMyAxNTo1OTozNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwYmluOiBkb24ndCByZXR1cm4gRkFMU0Ugb24gc2VlayBldmVudHMKKwkgIFNpbGVudGx5IGlnbm9yZSB0aGUgc2VlayBldmVudCBpbnN0ZWFkIG9mIHJldHVybmluZyBGQUxTRS4KKworMjAwOS0wMi0yNiAxMzoxMDoyOSArMDEwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBnc3RydHBiaW46IERvbid0IGZvcndhcmQgcmV2YyBldmVudHMgdG8gc2VuZGVyCisJICBEb24ndCBzZW5kIGV2ZW50cyBmcm9tIHRoZSByZWNlaXZlciB0byB0aGUgc2VuZGVyIHNpZGUuCisJICBGaXhlcyAjNTcyOTAwLgorCisyMDA5LTAyLTI1IDExOjQ1OjA1ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgZG9jczogdmFyaW91cyBkb2MgZml4ZXMKKwkgIE5vIHNob3J0LWRlc2MgYXMgd2UgaGF2ZSB0aGVtIGluIHRoZSBlbGVtZW50IGRldGFpbHMuCisJICBBbHNvIGtlZXAgdGhpbmdzIChNYWtlZmlsZS5hbSBhbmQgc2VjdGlvbnMudHh0KSBzb3J0ZWQuCisJICBSZXdvcmQgYW1iaWdvdXMgcmV0dXJucy4gTm8gdGV4dCBhZnRlciBzaW5jZSBwbGVhc2UuCisKKzIwMDktMDEtMjMgMTI6MTM6MDAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmM6CisJICBTZW5kIEJZRSBwYWNrZXRzIGltbWVkaWF0bHkgZm9yIHNtYWxsIHNlc3Npb25zCisJICBXaGVuIHRoZSBudW1iZXIgb2YgcGFydGljaXBhbnRzIGlzIGxlc3MgdGhhbiA1MCwgdGhlIFJGQyBhbGxvd3MgZm9yIHNlbmRpbmcgdGhlCisJICBCWUUgcGFja2V0IGltbWVkaWF0bHkgaW5zdGVhZCBvZiB1c2luZyB0aGUgcmVndWxhciBCWUUgdGltZW91dC4KKwkgIEZpeGVzICM1Njc4MjguCisKKzIwMDktMDEtMjIgMTM6MzM6MTQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgVW5sb2NrIHRoZSBqaXR0ZXJidWZmZXIgYmVmb3JlIHB1c2hpbmcgb3V0IHRoZSBwYWNrZXQtbG9zdCBldmVudHMuIE1vdmUgc29tZSBjb2RlIGJlZm9yZSB3ZSBkbyB0aGUgdW5sb2NrIHRvIG1ha2UgdGhlIGppdHRlcmJ1ZmZlciBzdGF0ZSBjb25zaXN0ZW50IHdoaWxlIHdlIGFyZSB1bmxvY2tlZC4KKworMjAwOS0wMS0wMiAxNzo0MDowNiArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvOiBXaGVuIGFuIFNTUkMgaXMgZm91bmQgb24gdGhlIGNhcHMgb2YgdGhlIHNlbmRlciBSVFAsIHVzZSB0aGlzIGFzIHRoZSBpbnRlcm5hbCBTU1JDLiBGaXhlcyAjNTY1OTEwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyIGF0IHRlc3RlciBkb3QgY2E+CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIChnc3RfcnRwX3Nlc3Npb25fc2V0Y2Fwc19zZW5kX3J0cCksIChjcmVhdGVfc2VuZF9ydHBfc2luayk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHJ0cF9zZXNzaW9uX3NldF9pbnRlcm5hbF9zc3JjKToKKwkgIFdoZW4gYW4gU1NSQyBpcyBmb3VuZCBvbiB0aGUgY2FwcyBvZiB0aGUgc2VuZGVyIFJUUCwgdXNlIHRoaXMgYXMgdGhlCisJICBpbnRlcm5hbCBTU1JDLiBGaXhlcyAjNTY1OTEwLgorCisyMDA5LTAxLTAyIDE2OjUwOjUzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci86IFJlbmFtZSBhIG1ldGhvZCB0byBiZXR0ZXIgcmVmbGVjdCB3aGF0IGl0IHJlYWxseSBkb2VzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIChnc3RfcnRwX3Nlc3Npb25fZXZlbnRfc2VuZF9ydHBfc2luayksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2dldGNhcHNfc2VuZF9ydHApOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChjaGVja19jb2xsaXNpb24pLAorCSAgKHJ0cF9zZXNzaW9uX3NjaGVkdWxlX2J5ZV9sb2NrZWQpLCAocnRwX3Nlc3Npb25fc2NoZWR1bGVfYnllKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgUmVuYW1lIGEgbWV0aG9kIHRvIGJldHRlciByZWZsZWN0IHdoYXQgaXQgcmVhbGx5IGRvZXMuCisKKzIwMDgtMTItMjkgMTU6NDk6MzcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogVXNlIG1ldGhvZCB0byBnZXQgdGhlIGludGVybmFsIFNTUkMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgKGdzdF9ydHBfc2Vzc2lvbl9nZXRjYXBzX3NlbmRfcnRwKToKKwkgIFVzZSBtZXRob2QgdG8gZ2V0IHRoZSBpbnRlcm5hbCBTU1JDLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChydHBfc2Vzc2lvbl9jbGFzc19pbml0KSwKKwkgIChydHBfc2Vzc2lvbl9zZXRfcHJvcGVydHkpLCAocnRwX3Nlc3Npb25fZ2V0X3Byb3BlcnR5KToKKwkgIEFkZCBwcm9wZXJ0eSB0byBjb25naXVyZSB0aGUgaW50ZXJuYWwgU1NSQyBvZiB0aGUgc2Vzc2lvbi4KKwkgIEZpeGVzICM1NjU5MTAuCisKKzIwMDgtMTItMjkgMTU6MjE6NTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogT25seSBjaGFuZ2UgdGhlIFNTUkMgb2YgdGhlIHNlc3Npb24gYW5kIHJlc2V0IHRoZSBpbnRlcm5hbCBzb3VyY2Ugd2hlbiB0aGUgU1NSQyBhY3R1YWxseS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHJ0cF9zZXNzaW9uX3NldF9pbnRlcm5hbF9zc3JjKToKKwkgIE9ubHkgY2hhbmdlIHRoZSBTU1JDIG9mIHRoZSBzZXNzaW9uIGFuZCByZXNldCB0aGUgaW50ZXJuYWwgc291cmNlIHdoZW4KKwkgIHRoZSBTU1JDIGFjdHVhbGx5IGNoYW5nZWQuIFNlZSAjNTY1OTEwLgorCisyMDA4LTEyLTI5IDE0OjIxOjQ3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuKjogV2hlbiBubyBwYXlsb2FkIHdhcyBzcGVjaWZpZWQgb24gdGhlIGNhcHMgYnV0IHRoZXJlIHdhcyBhIGNsb2NrLXJhdGUsIGFzc3VtZSB0aGUgY2xvY2stcmEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzogKHJ0cF9zb3VyY2VfaW5pdCksCisJICAocnRwX3NvdXJjZV91cGRhdGVfY2FwcyksIChnZXRfY2xvY2tfcmF0ZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oOgorCSAgV2hlbiBubyBwYXlsb2FkIHdhcyBzcGVjaWZpZWQgb24gdGhlIGNhcHMgYnV0IHRoZXJlIHdhcyBhIGNsb2NrLXJhdGUsCisJICBhc3N1bWUgdGhlIGNsb2NrLXJhdGUgY29ycmVzcG9uZHMgdG8gdGhlIGZpcnN0IHBheWxvYWQgdHlwZSBmb3VuZCBpbiB0aGUKKwkgIFJUUCBwYWNrZXRzLiBGaXhlcyAjNTY1NTA5LgorCisyMDA4LTEyLTIzIDExOjM5OjU5ICswMDAwICBBcm5vdXQgVmFuZGVjYXBwZWxsZSA8YXJub3V0QG1pbmQuYmU+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci4qOiBLZWVwIHRyYWNrIG9mIHRoZSBsYXN0IG91dGdvaW5nIHRpbWVzdGFtcCBhbmQgb2YgdGhlIGxhc3Qgc2VuZGVyLXNpZGUgdGltZS4gIFRpbWVzdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQXJub3V0IFZhbmRlY2FwcGVsbGUgPGFybm91dCBhdCBtaW5kIGRvdCBiZT4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IChydHBfaml0dGVyX2J1ZmZlcl9yZXNldF9za2V3KSwKKwkgIChjYWxjdWxhdGVfc2tldyk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgS2VlcCB0cmFjayBvZiB0aGUgbGFzdCBvdXRnb2luZyB0aW1lc3RhbXAgYW5kIG9mIHRoZSBsYXN0IHNlbmRlci1zaWRlCisJICB0aW1lLiAgVGltZXN0YW1wcyBjYW4gb25seSBnbyBmb3J3YXJkIGlmIHRoZXkgZG8gYXQgdGhlIHNlbmRlcgorCSAgc2lkZSwgY2FuIG9ubHkgZ28gYmFjayBpZiB0aGV5IGRvIGF0IHRoZSBzZW5kZXIgc2lkZSwgYW5kIHJlbWFpbiB0aGUKKwkgIHNhbWUgaWYgdGhleSByZW1haW4gdGhlIHNhbWUgYXQgdGhlIHNlbmRlciBzaWRlLiBGaXhlcyAjNTY1MzE5LgorCisyMDA4LTExLTI2IDEyOjQwOjE4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IE1ha2Ugb2J0YWluX3NvdXJjZSByZXR1cm4gYW4gYWRpdGlvbmFsIHJlZiBzbyB0aGF0IHdlIGRvbid0IGxvc2Ugb3VyIHJlZiB0byBpdCB3aGVuIGEgc2UuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChvYnRhaW5fc291cmNlKSwKKwkgIChydHBfc2Vzc2lvbl9jcmVhdGVfc291cmNlKSwgKHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnRwKSwKKwkgIChydHBfc2Vzc2lvbl9wcm9jZXNzX3NyKSwgKHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnIpLAorCSAgKHJ0cF9zZXNzaW9uX3Byb2Nlc3Nfc2RlcyksIChydHBfc2Vzc2lvbl9wcm9jZXNzX2J5ZSk6CisJICBNYWtlIG9idGFpbl9zb3VyY2UgcmV0dXJuIGFuIGFkaXRpb25hbCByZWYgc28gdGhhdCB3ZSBkb24ndCBsb3NlIG91ciByZWYKKwkgIHRvIGl0IHdoZW4gYSBzZXNzaW9uIGNsZWFudXAgb2NjdXJzIHdoZW4gd2UgYXJlIGVtaXRpbmcgYSBzaWduYWwuCisJICBFbWl0IHRoZSBvbl9uZXdfc3NyYyBzaWduYWwgZm9yIHRoZSBDU1JDLCBub3QgdGhlIFNTUkMuCisJICBGaXhlcyAjNTYyMzE5LgorCisyMDA4LTExLTI2IDEyOjAyOjIxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogUmVzZXQgdGhlIHN5bmMgcGFyYW1ldGVycyB3aGVuIGNsZWFyaW5nIHRoZSBwYXlsb2FkIHR5cGUgbWFwIHRvby4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGdzdF9ydHBfYmluX3Jlc2V0X3N5bmMpLAorCSAgKGdzdF9ydHBfYmluX2NsZWFyX3B0X21hcCk6CisJICBSZXNldCB0aGUgc3luYyBwYXJhbWV0ZXJzIHdoZW4gY2xlYXJpbmcgdGhlIHBheWxvYWQgdHlwZSBtYXAgdG9vLgorCSAgRml4ZXMgIzU2MjMxMi4KKworMjAwOC0xMS0yNiAxMTo0NDozNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLio6IFJlbW92ZSBhIGxvdCBvZiBwZXIgc3RyZWFtIHN0YXRlIHRoYXQgaXMgbm90IG5lZWRlZCBhbmQgcGFzcyBuZXcgaW5mbyBpbiB0aGUgbWV0aG9kIGNhbGwuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChnZXRfY2xpZW50KSwKKwkgIChnc3RfcnRwX2Jpbl9yZXNldF9zeW5jKSwgKGdzdF9ydHBfYmluX2Fzc29jaWF0ZSksCisJICAoZ3N0X3J0cF9iaW5faGFuZGxlX3N5bmMpLCAoY3JlYXRlX3N0cmVhbSksCisJICAoZ3N0X3J0cF9iaW5fY2xhc3NfaW5pdCksIChuZXdfc3NyY19wYWRfZm91bmQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgIFJlbW92ZSBhIGxvdCBvZiBwZXIgc3RyZWFtIHN0YXRlIHRoYXQgaXMgbm90IG5lZWRlZCBhbmQgcGFzcyBuZXcgaW5mbyBpbgorCSAgdGhlIG1ldGhvZCBjYWxsLgorCSAgQWRkIHNpZ25hbCB0byByZXNldCBzeW5jIHBhcmFtZXRlcnMuCisJICBBdm9pZCBwYXJzaW5nIHRoZSBjYXBzIHRvIGdldCBhIGNsb2NrX2Jhc2UsIHdlIGdldCB0aGlzIGZyb20gdGhlIHN5bmMKKwkgIHNpZ25hbCBub3cuCisKKzIwMDgtMTEtMjUgMTU6MTI6MDYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogRml4IGV2ZW50IGxlYWsuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgKGdzdF9ydHBfc2Vzc2lvbl9ldmVudF9zZW5kX3J0Y3Bfc3JjKToKKwkgIEZpeCBldmVudCBsZWFrLgorCisyMDA4LTExLTIyIDE1OjMxOjM2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IEFkZCBwcm9wZXJ0eSB0byBjb25maWd1cmUgdGhlIFJUQ1AgTVRVLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHJ0cF9zZXNzaW9uX2NsYXNzX2luaXQpLAorCSAgKHJ0cF9zZXNzaW9uX2luaXQpLCAocnRwX3Nlc3Npb25fc2V0X3Byb3BlcnR5KSwKKwkgIChydHBfc2Vzc2lvbl9nZXRfcHJvcGVydHkpOgorCSAgQWRkIHByb3BlcnR5IHRvIGNvbmZpZ3VyZSB0aGUgUlRDUCBNVFUuCisKKzIwMDgtMTEtMjIgMTU6MjQ6NDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogQWRkIEdfUEFSQU1fU1RBVElDX1NUUklOR1MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAocnRwX3Nlc3Npb25fY2xhc3NfaW5pdCksCisJICAoY29weV9zb3VyY2UpLCAocnRwX3Nlc3Npb25fY3JlYXRlX3NvdXJjZXMpLAorCSAgKHJ0cF9zZXNzaW9uX2dldF9wcm9wZXJ0eSk6CisJICBBZGQgR19QQVJBTV9TVEFUSUNfU1RSSU5HUy4KKwkgIEFkZCBwcm9wZXJ0eSB0byByZXR1cm4gYSBHVmFsdWVBcnJheSBvZiBhbGwga25vd24gUlRQU291cmNlcyBpbiB0aGUKKwkgIHNlc3Npb24uCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiAocnRwX3NvdXJjZV9jbGFzc19pbml0KSwKKwkgIChydHBfc291cmNlX2NyZWF0ZV9zZGVzKSwgKHJ0cF9zb3VyY2Vfc2V0X3Byb3BlcnR5KSwKKwkgIChydHBfc291cmNlX2dldF9wcm9wZXJ0eSk6CisJICBSZW1vdmUgcHJvcGVydGllcyB0byBzZXQgdGhlIHZhcmlvdXMgU0RFUyBpdGVtcywgYW4gYXBwbGljYXRpb24gaXMgbmV2ZXIKKwkgIHN1cHBvc2VkIHRvIGNoYW5nZSB0aGUgUlRQU291cmNlIGRhdGEuCisJICBDaGFuZ2UgdGhlIFNERVMgZ2V0dGVyIHByb3BlcnRpZXMgdG8gb25lIFNERVMgcHJvcGVydHkgdGhhdCByZXR1cm5zIGFsbAorCSAgU0RFUyBpdGVtcyBpbiBhIEdzdFN0cnVjdHVyZS4KKworMjAwOC0xMS0yMiAxMzoxNzoyNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IEFsc28gdW5yZWYgdGhlIHRhcmdldCBwYWQgZm9yIHVua25vd24gcGFkcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGdzdF9ydHBfYmluX3JlbGVhc2VfcGFkKToKKwkgIEFsc28gdW5yZWYgdGhlIHRhcmdldCBwYWQgZm9yIHVua25vd24gcGFkcy4KKworMjAwOC0xMS0yMSAxNjoxNzoyMiArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IFJlbGVhc2UgdGhlIHJpZ2h0IHBhZHMgb24gcnRwYmluLiBGaXhlcyAjNTYxNzUyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyIGF0IHRlc3RlciBkb3QgY2E+CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoZ3N0X3J0cF9iaW5fcmVsZWFzZV9wYWQpOgorCSAgUmVsZWFzZSB0aGUgcmlnaHQgcGFkcyBvbiBydHBiaW4uIEZpeGVzICM1NjE3NTIuCisKKzIwMDgtMTEtMjAgMTg6NDE6MzQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogUGFzcyB0aGUgcnVubmluZyB0aW1lIHRvIHRoZSBzZXNzaW9uIHdoZW4gcHJvY2Vzc2luZyBSVFAgcGFja2V0cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnZXRfY3VycmVudF90aW1lcyksCisJICAocnRjcF90aHJlYWQpLCAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3JlY3ZfcnRwKToKKwkgIFBhc3MgdGhlIHJ1bm5pbmcgdGltZSB0byB0aGUgc2Vzc2lvbiB3aGVuIHByb2Nlc3NpbmcgUlRQIHBhY2tldHMuCisJICBJbXByb3ZlIHRoZSB0aW1lIGZ1bmN0aW9uIHRvIHByb3ZpZGUgbW9yZSBpbmZvLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChydHBfc2Vzc2lvbl9jbGFzc19pbml0KSwKKwkgIChydHBfc2Vzc2lvbl9pbml0KSwgKHVwZGF0ZV9hcnJpdmFsX3N0YXRzKSwKKwkgIChydHBfc2Vzc2lvbl9wcm9jZXNzX3J0cCksIChydHBfc2Vzc2lvbl9wcm9jZXNzX3NkZXMpLAorCSAgKHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnRjcCksIChzZXNzaW9uX3N0YXJ0X3J0Y3ApLAorCSAgKHJ0cF9zZXNzaW9uX29uX3RpbWVvdXQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBNYXJrIHRoZSBpbnRlcm5hbCBzb3VyY2Ugd2l0aCBhIGZsYWcuCisJICBVc2UgcnVubmluZ190aW1lIGluc3RlYWQgb2YgdGhlIG1vcmUgdXNlbGVzcyB0aW1lc3RhbXAuCisJICBWYWxpZGF0ZSBhIHNvdXJjZSB3aGVuIGEgdmFsaWQgU0RFUyBoYXMgYmVlbiByZWNlaXZlZC4KKwkgIFBhc3MgdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUgd2hlbiBwcm9jZXNzaW5nIFNSIHBhY2tldHMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiAocnRwX3NvdXJjZV9jbGFzc19pbml0KSwKKwkgIChydHBfc291cmNlX2luaXQpLCAocnRwX3NvdXJjZV9jcmVhdGVfc3RhdHMpLAorCSAgKHJ0cF9zb3VyY2VfZ2V0X3Byb3BlcnR5KSwgKHJ0cF9zb3VyY2Vfc2VuZF9ydHApLAorCSAgKHJ0cF9zb3VyY2VfcHJvY2Vzc19yYiksIChydHBfc291cmNlX2dldF9uZXdfcmIpLAorCSAgKHJ0cF9zb3VyY2VfZ2V0X2xhc3RfcmIpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIEFkZCBwcm9wZXJ0eSB0byBnZXQgc291cmNlIHN0YXRzLgorCSAgTWFyayBwYXJhbXMgYXMgU1RBVElDX1NUUklOR1MuCisJICBDYWxjdWxhdGUgdGhlIGJpdHJhdGUgYXQgdGhlIHNlbmRlciBTU1JDLgorCSAgQXZvaWQgbmVnYXRpdmUgdmFsdWVzIGluIHRoZSByb3VuZCB0cmlwIHRpbWUgY2FsY3VsYXRpb25zLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgVXBkYXRlIHNvbWUgZG9jcyBhbmQgY2hhbmdlIHNvbWUgdmFyaWFibGUgbmFtZSB0byBtb3JlIGNsb3NlbHkgcmVmbGVjdAorCSAgd2hhdCBpdCBjb250YWlucy4KKworMjAwOC0xMS0yMCAwODoxOToxNSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogSW5pdGlhbGl6ZSByZXR1cm4gdmFsdWUgdG8gZml4IGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgdW5pbml0aWFsaXplZCB2YXJpYWJsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW5fcnRjcCk6CisJICBJbml0aWFsaXplIHJldHVybiB2YWx1ZSB0byBmaXggY29tcGlsZXIgd2FybmluZyBhYm91dCB1bmluaXRpYWxpemVkCisJICB2YXJpYWJsZS4KKworMjAwOC0xMS0xOSAxNjo0ODozOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6IE1hcmsgc2lnbmFsIGFyZyBhcyBzdGF0aWMgc2NvcGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NsYXNzX2luaXQpOgorCSAgTWFyayBzaWduYWwgYXJnIGFzIHN0YXRpYyBzY29wZS4KKworMjAwOC0xMS0xOSAwOTowNjoyOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IFJlbW92ZSBpbnRlcm5hbCBzeW5jIHBhZCwgdXNlIHNpZ25hbHMgaW5zdGVhZCB0byBnZXQgbGlwLXN5bmMgbm90aWZpY2F0aW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGdzdF9ydHBfYmluX2Fzc29jaWF0ZSksCisJICAoZ3N0X3J0cF9iaW5faGFuZGxlX3N5bmMpLCAoY3JlYXRlX3N0cmVhbSksIChmcmVlX3N0cmVhbSksCisJICAobmV3X3NzcmNfcGFkX2ZvdW5kKToKKwkgIFJlbW92ZSBpbnRlcm5hbCBzeW5jIHBhZCwgdXNlIHNpZ25hbHMgaW5zdGVhZCB0byBnZXQgbGlwLXN5bmMKKwkgIG5vdGlmaWNhdGlvbnMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfaW50ZXJuYWxfbGlua3MpLCAoY3JlYXRlX3J0Y3Bfc2luayksCisJICAocmVtb3ZlX3J0Y3Bfc2luayksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfcmVxdWVzdF9uZXdfcGFkKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfcmVsZWFzZV9wYWQpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zaW5rX3J0Y3BfZXZlbnQpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbl9ydGNwKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJICBNYWtlIGl0IHBvc3NpYmxlIHRvIHNlbmQgU1IgcGFja2V0cyB0byB0aGUgaml0dGVyYnVmZmVyLgorCSAgQ2hlY2sgaWYgdGhlIFNSIHRpbWVzdGFtcHMgYXJlIHZhbGlkIGJ5IGNvbXBhcmluZyB0aGVtIHRvIHRoZSBSVFAKKwkgIHRpbWVzdGFtcHMuCisJICBTaWduYWwgdGhlIFNSIHBhY2tldCBhbmQgdGhlIHRpbWluZyBpbmZvcm1hdGlvbiB0byBsaXN0ZW5lcnMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOiAoY3JlYXRlX2RlbXV4X3BhZF9mb3Jfc3NyYyksCisJICAoZ3N0X3J0cF9zc3JjX2RlbXV4X3J0Y3BfY2hhaW4pLCAoZ3N0X3J0cF9zc3JjX2RlbXV4X3NyY19xdWVyeSk6CisJICBSZW1vdmUgc29tZSB1bnVzZWQgY29kZS4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IChydHBfaml0dGVyX2J1ZmZlcl9yZXNldF9za2V3KSwKKwkgIChjYWxjdWxhdGVfc2tldyksIChydHBfaml0dGVyX2J1ZmZlcl9nZXRfc3luYyk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgS2VlcCB0cmFjayBvZiB0aGUgbGFzdCBzZWVuIFJUUCB0aW1lc3RhbXAgc28gdGhhdCB3ZSBjYW4gZmlsdGVyIG91dAorCSAgaW52YWxpZCBTUiBwYWNrZXRzLgorCisyMDA4LTExLTE3IDE5OjQ3OjMyICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiBGaXggR1NUX0RFQlVHIGNhbGwgdG8gb25seSBoYXZlIGFzIG1hbnkgYXJndW1lbnRzIGFzIHJlcXVpcmVkIGJ5IHRoZSBmb3JtYXQgc3RyaW5nLiBGaXhlcy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiAoZ2V0X2Nsb2NrX3JhdGUpOgorCSAgRml4IEdTVF9ERUJVRyBjYWxsIHRvIG9ubHkgaGF2ZSBhcyBtYW55IGFyZ3VtZW50cyBhcyByZXF1aXJlZAorCSAgYnkgdGhlIGZvcm1hdCBzdHJpbmcuIEZpeGVzIGEgY29tcGlsZXIgd2FybmluZy4KKworMjAwOC0xMS0xNyAxNToxNzo1MiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IERvIG5vdCB0cnkgdG8ga2VlcCB0cmFjayBvZiB0aGUgY2xvY2stcmF0ZSBvdXJzZWx2ZXMgYnV0IHNpbXBseSBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIGppLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChnc3RfcnRwX2Jpbl9hc3NvY2lhdGUpLAorCSAgKGdzdF9ydHBfYmluX3N5bmNfY2hhaW4pLCAoY3JlYXRlX3N0cmVhbSksIChuZXdfc3NyY19wYWRfZm91bmQpOgorCSAgRG8gbm90IHRyeSB0byBrZWVwIHRyYWNrIG9mIHRoZSBjbG9jay1yYXRlIG91cnNlbHZlcyBidXQgc2ltcGx5IGdldCB0aGUKKwkgIHZhbHVlIGZyb20gdGhlIGppdHRlcmJ1ZmZlci4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X2ppdHRlcl9idWZmZXJfc2lua19wYXJzZV9jYXBzKSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbiksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2dldF9zeW5jKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJICBBZGQgc29tZSBkZWJ1ZyBpbmZvLgorCSAgUGFzcyB0aGUgY2xvY2stcmF0ZSB0byB0aGUgaml0dGVyYnVmZmVyLgorCSAgQWxzbyBwYXNzIHRoZSBjbG9jay1yYXRlIGFsb25nIHdpdGggdGhlIHJ0cCB0aW1lc3RhbXAgd2hlbiBnZXR0aW5nIHRoZQorCSAgc3luYyBwYXJhbWV0ZXJzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6IChnc3RfcnRwX3B0X2RlbXV4X2NoYWluKToKKwkgIEZpeCBzb21lIGRlYnVnLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzogKHJ0cF9qaXR0ZXJfYnVmZmVyX3Jlc2V0X3NrZXcpLAorCSAgKGNhbGN1bGF0ZV9za2V3KSwgKHJ0cF9qaXR0ZXJfYnVmZmVyX2dldF9zeW5jKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBLZWVwIHRyYWNrIG9mIGNsb2NrLXJhdGUgY2hhbmdlcyBhbmQgcmV0dXJuIHRoZSBjbG9jay1yYXRlIHRvZ2V0aGVyIHdpdGgKKwkgIHRoZSBydHAgdGltZXN0YW1wcyB1c2VkIGZvciBzeW5jLgorCSAgRG9uJ3QgdHJ5IHRvIGNvbnN0cnVjdCB0aW1lc3RhbXBzIHdoZW4gd2UgaGF2ZSBubyBiYXNlX3RpbWUuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiAoZ2V0X2Nsb2NrX3JhdGUpOgorCSAgUmVxdWVzdCBhIG5ldyBjbG9jay1yYXRlIHdoZW4gdGhlIHBheWxvYWQgdHlwZSBjaGFuZ2VzLgorCSAgUmVzZXQgdGhlIGppdHRlciBjYWxjdWxhdGlvbiB3aGVuIHRoZSBjbG9jay1yYXRlIGNoYW5nZXMuCisKKzIwMDgtMTEtMTMgMTU6NDg6NTQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyLzogU21hbGwgY2xlYW51cHMgYW5kIHNvbWUgbW9yZSBkZWJ1ZyBpbmZvLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9qaXR0ZXJfYnVmZmVyX3NpbmtfcGFyc2VfY2FwcyksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoX3N0b3ApLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYWluKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IChydHBfaml0dGVyX2J1ZmZlcl9yZXNldF9za2V3KSwKKwkgIChjYWxjdWxhdGVfc2tldyk6CisJICBTbWFsbCBjbGVhbnVwcyBhbmQgc29tZSBtb3JlIGRlYnVnIGluZm8uCisKKzIwMDgtMTEtMTAgMTU6MjY6NDAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOiBBbHNvIGNvbmZpZ3VyZSB0aGUgbmV4dCBleHBlY3RlZCBvdXRwdXQgc2VxbnVtIHdoZW4gd2UgZ2V0IGEgc2VxbnVtLWJhc2Ugb24gdGhlIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9qaXR0ZXJfYnVmZmVyX3NpbmtfcGFyc2VfY2FwcyksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pOgorCSAgQWxzbyBjb25maWd1cmUgdGhlIG5leHQgZXhwZWN0ZWQgb3V0cHV0IHNlcW51bSB3aGVuIHdlIGdldCBhIHNlcW51bS1iYXNlCisJICBvbiB0aGUgY2Fwcy4KKworMjAwOC0xMS0wNCAxMjo0MjozMCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBEb24ndCBpbnN0YWxsIHN0YXRpYyBsaWJzIGZvciBwbHVnaW5zLiBGaXhlcyAjNTUwODUxIGZvciAtYmFkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9hbHNhc3BkaWYvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hbXJ3Yi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2FwZXhzaW5rL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXJ0cy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2FydHNkL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXVkaW9maWxlL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXVkaW9yZXNhbXBsZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2J6Mi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2NkYXVkaW8vTWFrZWZpbGUuYW06CisJICAqIGV4dC9jZWx0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvZGMxMzk0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvZGlyYWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kaXJlY3RmYi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2RpdngvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kdHMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9mYWFjL01ha2VmaWxlLmFtOgorCSAgKiBleHQvZmFhZC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2dzbS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2hlcm1lcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2l2b3JiaXMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9qYWNrL01ha2VmaWxlLmFtOgorCSAgKiBleHQvanAyay9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xhZHNwYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xjcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xpYmZhbWUvTWFrZWZpbGUuYW06CisJICAqIGV4dC9saWJtbXMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9tZXRhZGF0YS9NYWtlZmlsZS5hbToKKwkgICogZXh0L21wZWcyZW5jL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXBsZXgvTWFrZWZpbGUuYW06CisJICAqIGV4dC9tdXNlcGFjay9NYWtlZmlsZS5hbToKKwkgICogZXh0L211c2ljYnJhaW56L01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXl0aHR2L01ha2VmaWxlLmFtOgorCSAgKiBleHQvbmFzL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbmVvbi9NYWtlZmlsZS5hbToKKwkgICogZXh0L29mYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3BvbHlwL01ha2VmaWxlLmFtOgorCSAgKiBleHQvcmVzaW5kdmQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zZGwvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zaG91dC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NuYXBzaG90L01ha2VmaWxlLmFtOgorCSAgKiBleHQvc25kZmlsZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NvdW5kdG91Y2gvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zcGMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zd2ZkZWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC90YXJraW4vTWFrZWZpbGUuYW06CisJICAqIGV4dC90aGVvcmEvTWFrZWZpbGUuYW06CisJICAqIGV4dC90aW1pZGl0eS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3R3b2xhbWUvTWFrZWZpbGUuYW06CisJICAqIGV4dC94MjY0L01ha2VmaWxlLmFtOgorCSAgKiBleHQveGluZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3h2aWQvTWFrZWZpbGUuYW06CisJICAqIGdzdC1saWJzL2dzdC9hcHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC1saWJzL2dzdC9kc2hvdy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2FpZmZwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2FwcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvYnVmZmVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYmF5ZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9jZHhhcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9jaGFydC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2NvbG9yc3BhY2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kY2NwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWludGVybGFjZTIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kdmRzcHUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9mZXN0aXZhbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ZpbHRlci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ZsYWNwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2dhbWVzL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvaDI2NHBhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbGlicmZiL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbWl4bWF0cml4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbW9kcGx1Zy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21wZWcxc3lzL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZzR2aWRlb3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ2RlbXV4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ3RzbXV4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ3ZpZGVvcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tdmUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9uc2YvTWFrZWZpbGUuYW06CisJICAqIGdzdC9udXZkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L292ZXJsYXkvTWFrZWZpbGUuYW06CisJICAqIGdzdC9wYXNzdGhyb3VnaC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3BjYXBwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3BsYXlvbmRlbWFuZC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3Jhd3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcmVhbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0anBlZy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zY2FsZXRlbXBvL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc2RwL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc2VsZWN0b3IvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zbW9vdGgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zbW9vdGh3YXZlL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3BlZWQvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zcGVleHJlc2FtcGxlL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3RlcmVvL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3ViZW5jL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdHRhL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmJpZGVjL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9kcm9wL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9zaWduYWwvTWFrZWZpbGUuYW06CisJICAqIGdzdC92aXJ0dWFsZHViL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvdm1uYy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3k0bS9NYWtlZmlsZS5hbToKKwkgICogc3lzL2FjbWVuYy9NYWtlZmlsZS5hbToKKwkgICogc3lzL2Nkcm9tL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHNob3dkZWN3cmFwcGVyL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHNob3dzcmN3cmFwcGVyL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHZiL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHhyMy9NYWtlZmlsZS5hbToKKwkgICogc3lzL2ZiZGV2L01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3NzNC9NYWtlZmlsZS5hbToKKwkgICogc3lzL3FjYW0vTWFrZWZpbGUuYW06CisJICAqIHN5cy9xdHdyYXBwZXIvTWFrZWZpbGUuYW06CisJICAqIHN5cy92Y2QvTWFrZWZpbGUuYW06CisJICAqIHN5cy93aW5pbmV0L01ha2VmaWxlLmFtOgorCSAgKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBEb24ndCBpbnN0YWxsIHN0YXRpYyBsaWJzIGZvciBwbHVnaW5zLiBGaXhlcyAjNTUwODUxIGZvciAtYmFkLgorCisyMDA4LTEwLTE2IDEzOjA1OjM3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogRml4IHByb2JsZW0gd2l0aCB1c2luZyB0aGUgb3V0cHV0IHNlcW51bSBjb3VudGVyIHRvIGNoZWNrIGZvciBpbnB1dCBzZXFudW0gZGlzY28uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3Rfaml0dGVyX2J1ZmZlcl9zaW5rX3BhcnNlX2NhcHMpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9mbHVzaF9zdGFydCksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoX3N0b3ApLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYWluKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfbG9vcCk6CisJICBGaXggcHJvYmxlbSB3aXRoIHVzaW5nIHRoZSBvdXRwdXQgc2VxbnVtIGNvdW50ZXIgdG8gY2hlY2sgZm9yIGlucHV0CisJICBzZXFudW0gZGlzY29udGludWl0aWVzLgorCSAgSW1wcm92ZSBnYXAgZGV0ZWN0aW9uIGFuZCByZWNvdmVyeSwgcmVzZXQgYW5kIGZsdXNoIHRoZSBqaXR0ZXJidWZmZXIgb24KKwkgIHNlcW51bSByZXN0YXJ0LiBGaXhlcyAjNTU2NTIwLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzogKHJ0cF9qaXR0ZXJfYnVmZmVyX2luc2VydCk6CisJICBGaXggd3JvbmcgR19MSUtFTFkuCisKKzIwMDgtMTAtMTYgMDk6NTE6MjggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogSW5zdGFsbCBldmVudCBoYW5kbGVyIG9uIHRoZSBydGNwX3NyYyBwYWQsIG1ha2UgTEFURU5DWSBldmVudCByZXR1cm4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRjcF9zcmMpLCAoY3JlYXRlX3NlbmRfcnRjcF9zcmMpOgorCSAgSW5zdGFsbCBldmVudCBoYW5kbGVyIG9uIHRoZSBydGNwX3NyYyBwYWQsIG1ha2UgTEFURU5DWSBldmVudCByZXR1cm4KKwkgIFRSVUUuCisKKzIwMDgtMTAtMDcgMTg6NTQ6NDEgKzAwMDAgIEjDpXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi1tYXJzaGFsLmxpc3Q6IEFkZCBtYXJzaGFsbGVyIGZvciBuZXcgYWN0aW9uIHNpZ25hbC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEjDpXZhcmQgR3JhZmYgPGhhdmFyZCBkb3QgZ3JhZmYgYXQgdGFuZGJlcmcgZG90IGNvbT4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLW1hcnNoYWwubGlzdDoKKwkgIEFkZCBtYXJzaGFsbGVyIGZvciBuZXcgYWN0aW9uIHNpZ25hbC4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChnc3RfcnRwX2Jpbl9nZXRfaW50ZXJuYWxfc2Vzc2lvbiksCisJICAoZ3N0X3J0cF9iaW5fY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgQWRkIGFjdGlvbiBzaWduYWwgdG8gcmV0cmlldmUgdGhlIGludGVybmFsIFJUUFNlc3Npb24gb2JqZWN0LgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2dldF9wcm9wZXJ0eSksIChnc3RfcnRwX3Nlc3Npb25fcmVsZWFzZV9wYWQpOgorCSAgQWRkIHByb3BlcnR5IHRvIGFjY2VzcyB0aGUgaW50ZXJuYWwgUlRQU2Vzc2lvbiBvYmplY3QuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHJ0cF9zZXNzaW9uX2NsYXNzX2luaXQpLAorCSAgKGNoZWNrX2NvbGxpc2lvbik6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIEFkZCBhY3Rpb24gc2lnbmFsIHRvIHJldHJpZXZlIGFuIFJUUFNvdXJjZSBvYmplY3QgYnkgU1NSQy4KKwkgIFNlZSAjNTU1Mzk2LgorCisyMDA4LTEwLTA3IDExOjMzOjEwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogUmVsZWFzZSBwYWRzIG9mIHRoZSBzZXNzaW9uIG1hbmFnZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChmaW5kX3Nlc3Npb25fYnlfcGFkKSwKKwkgIChmcmVlX3Nlc3Npb24pLCAoZ3N0X3J0cF9iaW5fZGlzcG9zZSksIChyZW1vdmVfcmVjdl9ydHApLAorCSAgKHJlbW92ZV9yZWN2X3J0Y3ApLCAocmVtb3ZlX3NlbmRfcnRwKSwgKHJlbW92ZV9ydGNwKSwKKwkgIChnc3RfcnRwX2Jpbl9yZWxlYXNlX3BhZCk6CisJICBSZWxlYXNlIHBhZHMgb2YgdGhlIHNlc3Npb24gbWFuYWdlci4KKwkgIFN0YXJ0IGltcGxlbWVudGluZyByZWxlYXNpbmcgcGFkcyBvZiBnc3RydHBiaW4uCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogKHJlbW92ZV9yZWN2X3J0cF9zaW5rKSwKKwkgIChyZW1vdmVfcmVjdl9ydGNwX3NpbmspLCAocmVtb3ZlX3NlbmRfcnRwX3NpbmspLAorCSAgKHJlbW92ZV9zZW5kX3J0Y3Bfc3JjKSwgKGdzdF9ydHBfc2Vzc2lvbl9yZWxlYXNlX3BhZCk6CisJICBJbXBsZW1lbnQgcmVsZWFzaW5nIHBhZHMgaW4gZ3N0cnRwc2Vzc2lvbi4KKworMjAwOC0xMC0wNyAxMDowMjoyMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6IE9ubHkgdXBkYXRlIHRoZSBzZXFudW0tYmFzZSB3aGVuIGl0IHdhcyBub3QgYWxyZWFkeSBjb25maWd1cmVkIGZvciB0aGUgc3RyZWFtcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3Rfaml0dGVyX2J1ZmZlcl9zaW5rX3BhcnNlX2NhcHMpOgorCSAgT25seSB1cGRhdGUgdGhlIHNlcW51bS1iYXNlIHdoZW4gaXQgd2FzIG5vdCBhbHJlYWR5IGNvbmZpZ3VyZWQgZm9yIHRoZQorCSAgc3RyZWFtcy4KKworMjAwOC0wOS0zMCAxNTowODo1MiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiBSZWYgdGhlIHJ0cHNvdXJjZSBvYmplY3QgYmVmb3JlIHdlIHJlbGVhc2UgdGhlIHNlc3Npb24gbG9jayB3aGVuIHdlIGVtaXQgdGhlIHNpZ25hbHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAob25fbmV3X3NzcmMpLCAob25fc3NyY19jb2xsaXNpb24pLAorCSAgKG9uX3NzcmNfdmFsaWRhdGVkKSwgKG9uX3NzcmNfYWN0aXZlKSwgKG9uX3NzcmNfc2RlcyksCisJICAob25fYnllX3NzcmMpLCAob25fYnllX3RpbWVvdXQpLCAob25fdGltZW91dCksIChvbl9zZW5kZXJfdGltZW91dCk6CisJICBSZWYgdGhlIHJ0cHNvdXJjZSBvYmplY3QgYmVmb3JlIHdlIHJlbGVhc2UgdGhlIHNlc3Npb24gbG9jayB3aGVuIHdlIGVtaXQKKwkgIHRoZSBzaWduYWxzLgorCisyMDA4LTA5LTIzIDE4OjEzOjMxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci86IEZpeCBzb21lIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IChydHBfaml0dGVyX2J1ZmZlcl9pbnNlcnQpLAorCSAgKHJ0cF9qaXR0ZXJfYnVmZmVyX2dldF9zeW5jKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAob25fc2VuZGVyX3RpbWVvdXQpLAorCSAgKHNlc3Npb25fY2xlYW51cCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgRml4IHNvbWUgZG9jcy4KKworMjAwOC0wOS0xNyAxMzo1OToyMSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIEZpeCBjb21waWxlciB3YXJuaW5ncyBvbiBPUy9YCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOiAoamFja19wcm9jZXNzX2NiKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IChjYWxjdWxhdGVfc2tldyk6CisJICBGaXggY29tcGlsZXIgd2FybmluZ3Mgb24gT1MvWAorCisyMDA4LTA5LTEzIDAxOjM3OjUwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogRG8gbm90IHRyeSB0byBhZGp1c3QgdGhlIG9mZnNldCBvZiBzdHJlYW1zIGZvciB3aGljaCB3ZSBoYXZlIG5vdCB5ZXQgc2VlbiBhbiBTUiBwYWNrZXQuIEEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGNyZWF0ZV9zZXNzaW9uKSwKKwkgIChnc3RfcnRwX2Jpbl9hc3NvY2lhdGUpLCAoZ3N0X3J0cF9iaW5fc3luY19jaGFpbik6CisJICBEbyBub3QgdHJ5IHRvIGFkanVzdCB0aGUgb2Zmc2V0IG9mIHN0cmVhbXMgZm9yIHdoaWNoIHdlIGhhdmUgbm90IHlldAorCSAgc2VlbiBhbiBTUiBwYWNrZXQuIEF2b2lkcyBsYXJnZSB0cy1vZmZzZXRzIGluIHNvbWUgY2FzZXMuCisKKzIwMDgtMDktMDUgMTM6NTI6MzQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi4qOiBBZGQgc2lnbmFsIHRvIG5vdGlmeSBsaXN0ZW5lcnMgd2hlbiBhIHNlbmRlciBiZWNvbWVzIGEgcmVjZWl2ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChvbl9zZW5kZXJfdGltZW91dCksCisJICAoY3JlYXRlX3Nlc3Npb24pLCAoZ3N0X3J0cF9iaW5fYXNzb2NpYXRlKSwKKwkgIChnc3RfcnRwX2Jpbl9zeW5jX2NoYWluKSwgKGdzdF9ydHBfYmluX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfYmluX3JlcXVlc3RfbmV3X3BhZCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgQWRkIHNpZ25hbCB0byBub3RpZnkgbGlzdGVuZXJzIHdoZW4gYSBzZW5kZXIgYmVjb21lcyBhIHJlY2VpdmVyLgorCSAgVHdlYWsgbGlwLXN5bmMgY29kZSwgZG9uJ3Qgc3RvcmUgb3VyIG93biBjb3B5IG9mIHRoZSB0cy1vZmZzZXQgb2YgdGhlCisJICBqaXR0ZXJidWZmZXIsIGRvbid0IGFkanVzdCBzeW5jIGlmIHRoZSBjaGFuZ2UgaXMgbGVzcyB0aGFuIDRtc2VjLgorCSAgR2V0IHRoZSBSVFAgdGltZXN0YW1wIDwtPiBHU3RyZWFtZXIgdGltZXN0YW1wIHJlbGF0aW9uIGRpcmVjdGx5IGZyb20KKwkgIHRoZSBqaXR0ZXJidWZmZXIgaW5zdGVhZCBvZiBvdXIgaW5hY2N1cmF0ZSB2ZXJzaW9uIGZyb20gdGhlIHNvdXJjZS4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYWluKSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3N5bmMpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuaDoKKwkgIEFkZCBHX0xJS0VMWSBtYWNyb3MsIHVzZSBnbG9iYWwgZGVmaW5lcyBmb3IgbWF4IHBhY2tldCByZW9yZGVyIGFuZAorCSAgZHJvcG91dHMuCisJICBSZXNldCB0aGUgaml0dGVyYnVmZmVyIGNsb2NrIHNrZXcgZGV0ZWN0aW9uIHdoZW4gcGFja2V0cyBzZXFudW1zIGFyZQorCSAgY2hhbmdlZCB1bmV4cGVjdGVkbHkuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogKG9uX3NlbmRlcl90aW1lb3V0KSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fY2xhc3NfaW5pdCksIChnc3RfcnRwX3Nlc3Npb25faW5pdCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uaDoKKwkgIEFkZCBzZW5kZXIgdGltZW91dCBzaWduYWwuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOiAocnRwX2ppdHRlcl9idWZmZXJfcmVzZXRfc2tldyksCisJICAoY2FsY3VsYXRlX3NrZXcpLCAocnRwX2ppdHRlcl9idWZmZXJfaW5zZXJ0KSwKKwkgIChydHBfaml0dGVyX2J1ZmZlcl9nZXRfc3luYyk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgQWRkIHNvbWUgR19MSUtFTFkgbWFjcm9zLgorCSAgS2VlcCB0cmFjayBvZiB0aGUgZXh0ZW5kZWQgUlRQIHRpbWVzdGFtcCBzbyB0aGF0IHdlIGNhbiByZXBvcnQgdGhlIFJUUAorCSAgdGltZXN0YW1wIDwtPiBHU3RyZWFtZXIgdGltZXN0YW1wIHJlbGF0aW9uIGZvciBsaXAtc3luYy4KKwkgIFJlbW92ZSBzZXJ2ZXIgdGltZXN0YW1wIGdhcCBkZXRlY3Rpb24gY29kZSwgdGhlIHNlcnZlciBjYW4gc29tZXRpbWVzCisJICBtYWtlIGEgaHVnZSBnYXAgaW4gdGltZXN0YW1wcyAodGFsayBzcHVydHMsLi4uKSBzZWUgIzU0OTc3NC4KKwkgIERldGVjdCB0aW1ldGFtcCB3ZWlyZG5lc3MgaW5zdGVhZCBieSBvYnNlcnZpbmcgdGhlIHNlbmRlci9yZWNlaXZlcgorCSAgdGltZXN0YW1wIHJlbGF0aW9uIGFuZCByZXN5bmMgaWYgaXQgY2hhbmdlcyBtb3JlIHRoYW4gMSBzZWNvbmQuCisJICBBZGQgbWV0aG9kIHRvIHJlcG9ydCBhYm91dCB0aGUgY3VycmVudCBydHAgPC0+IGdzdCB0aW1lc3RhbXAgcmVsYXRpb24KKwkgIHdoaWNoIGlzIG5lZWRlZCBmb3IgbGlwLXN5bmMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHJ0cF9zZXNzaW9uX2NsYXNzX2luaXQpLAorCSAgKG9uX3NlbmRlcl90aW1lb3V0KSwgKGNoZWNrX2NvbGxpc2lvbiksIChydHBfc2Vzc2lvbl9wcm9jZXNzX3NyKSwKKwkgIChzZXNzaW9uX2NsZWFudXApOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBBZGQgc2VuZGVyIHRpbWVvdXQgc2lnbmFsLgorCSAgUmVtb3ZlIGluYWNjdXJhdGUgcnRwIDwtPiBnc3QgdGltZXN0YW1wIHJlbGF0aW9uIGNvZGUsIHRoZQorCSAgaml0dGVyYnVmZmVyIGNhbiBub3cgZG8gYW4gYWNjdXJhdGUgcmVwb3J0aW5nIGFib3V0IHRoaXMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiAocnRwX3NvdXJjZV9pbml0KSwKKwkgIChydHBfc291cmNlX3VwZGF0ZV9jYXBzKSwgKGNhbGN1bGF0ZV9qaXR0ZXIpLAorCSAgKHJ0cF9zb3VyY2VfcHJvY2Vzc19ydHApOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIFJlbW92ZSBpbmFjY3VyYXRlIHJ0cCA8LT4gZ3N0IHRpbWVzdGFtcCByZWxhdGlvbiBjb2RlLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgRGVmaW5lIGdsb2JhbCBtYXgtcmVvcmRlciBhbmQgbWF4LWRyb3BvdXQgY29uc3RhbnRzIGZvciB1c2UgaW4gdmFyaW91cworCSAgc3Vic3lzdGVtcy4KKworMjAwOC0wOC0yOCAxNToyMTo0NSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiBTZW5kIEVPUyB3aGVuIHRoZSBzZXNzaW9uIG9iamVjdCBpbnN0cnVjdHMgdXMgdG8uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoZ3N0X3J0cF9zZXNzaW9uX3NlbmRfcnRjcCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRwX3NpbmspOgorCSAgU2VuZCBFT1Mgd2hlbiB0aGUgc2Vzc2lvbiBvYmplY3QgaW5zdHJ1Y3RzIHVzIHRvLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChydHBfc2Vzc2lvbl9vbl90aW1lb3V0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgTWFrZSBpdCBwb3NzaWJsZSBmb3IgdGhlIHNlc3Npb24gbWFuYWdlciB0byBpbnN0cnVjdCB1cyB0byBzZW5kIEVPUy4gV2UKKwkgIGN1cnJlbnRseSB3aWxsIEVPUyB3aGVuIHRoZSBzZXNzaW9uIGlzIGEgc2VuZGVyIGFuZCB3aGVuIHRoZSBzZW5kZXIgcGFydAorCSAgZ29lcyBFT1MuIFRoaXMgaXMgbm90IGVudGlyZWx5IGNvcnJlY3QgYmVoYXZpb3VyIGJlY2F1c2UgdGhlIHNlc3Npb24KKwkgIGNvdWxkIHN0aWxsIHBhcnRpY2lwYXRlIGFzIGEgcmVjZWl2ZXIuCisJICBGaXhlcyAjNTQ5NDA5LgorCisyMDA4LTA4LTEzIDE0OjMxOjAyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogUmVzZXQgcnRwIHRpbWVzdGFtcCBpbnRlcnBvbGxhdGlvbiB3aGVuIHdlIGRldGVjdCBhIGdhcCB3aGVuIHRoZSBjbG9ja19iYXNlIGNoYW5nZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChnc3RfcnRwX2Jpbl9hc3NvY2lhdGUpLAorCSAgKGdzdF9ydHBfYmluX3N5bmNfY2hhaW4pLCAobmV3X3NzcmNfcGFkX2ZvdW5kKToKKwkgIFJlc2V0IHJ0cCB0aW1lc3RhbXAgaW50ZXJwb2xsYXRpb24gd2hlbiB3ZSBkZXRlY3QgYSBnYXAgd2hlbiB0aGUKKwkgIGNsb2NrX2Jhc2UgY2hhbmdlZC4KKwkgIERvbid0IHRyeSB0byBhZGp1c3QgdGhlIHRzLW9mZnNldCB3aGVuIGl0J3MgdG9vIGJpZyAoPiAzc2Vjb25kcykKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoZ3N0X3J0cF9zZXNzaW9uX3NldF9zc3JjKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5oOgorCSAgQWRkIG1ldGhvZCB0byBzZXQgc2Vzc2lvbiBTU1JDLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChjaGVja19jb2xsaXNpb24pLAorCSAgKHJ0cF9zZXNzaW9uX3NldF9pbnRlcm5hbF9zc3JjKSwgKHJ0cF9zZXNzaW9uX2dldF9pbnRlcm5hbF9zc3JjKSwKKwkgIChydHBfc2Vzc2lvbl9vbl90aW1lb3V0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgQWRkZWQgZGVidWdnaW5nIGZvciB0aGUgY29sbGlzaW9uIGNoZWNrcy4KKwkgIEFkZCBtZXRob2QgdG8gY2hhbmdlIHRoZSBpbnRlcm5hbCBTU1JDIG9mIHRoZSBzZXNzaW9uLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzogKHJ0cF9zb3VyY2VfcHJvY2Vzc19ydHApOgorCSAgUmVzZXQgdGhlIGNsb2NrIGJhc2Ugd2hlbiB3ZSBkZXRlY3QgbGFyZ2UganVtcHMgaW4gdGhlIHNlcW51bXMuCisKKzIwMDgtMDgtMTEgMDc6MjA6MTUgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IFByaW50IHRoZSBwYWQtbmFtZSBpbiBkZWJ1ZyBsb2cuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBQcmludCB0aGUgcGFkLW5hbWUgaW4gZGVidWcgbG9nLgorCSAgKiBzeXMvZHNob3dzcmN3cmFwcGVyL2dzdGRzaG93YXVkaW9zcmMuYzoKKwkgICogc3lzL2RzaG93c3Jjd3JhcHBlci9nc3Rkc2hvd3ZpZGVvc3JjLmM6CisJICBVc2UgIi0iIGluc3RlYWQgb2YgIl8iIGluIHByb3BlcnR5IG5hbWVzLiBDYW4gd2UgY2FsbCB0aGVtIGp1c3QKKwkgICJkZXZpY2UiIGxpa2UgZXZlcnl3aGVyZSBlbHNlPworCisyMDA4LTA4LTA1IDA5OjQyOjUzICswMDAwICBPbGl2aWVyIENyZXRlIDx0ZXN0ZXJAdGVzdGVyLmNhPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogTWFrZSB0aGUgYnVmZmVyIG1ldGFkYXRhIHdyaXRhYmxlIGJlZm9yZSBpbnNlcnRpbmcgaXQgaW4gdGhlIGppdHRlcmJ1ZmZlciBiZWNhdXMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IE9saXZpZXIgQ3JldGUgPHRlc3RlciBhdCB0ZXN0ZXIgZG90IGNhPgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3ApOgorCSAgTWFrZSB0aGUgYnVmZmVyIG1ldGFkYXRhIHdyaXRhYmxlIGJlZm9yZSBpbnNlcnRpbmcgaXQgaW4gdGhlCisJICBqaXR0ZXJidWZmZXIgYmVjYXVzZSB0aGUgaml0dGVyYnVmZmVyIHdpbGwgbW9kaWZ5IHRoZSB0aW1lc3RhbXBzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIFVwZGF0ZSBtZXRob2QgY29tbWVudCBhYm91dCByZXF1aXJpbmcgd3JpdGFibGUgbWV0YWRhdGEgb24gYnVmZmVycy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAocnRwX3Nlc3Npb25fcHJvY2Vzc19zciksCisJICAocnRwX3Nlc3Npb25fcHJvY2Vzc19ydGNwKToKKwkgIE1ha2UgdGhlIFJUQ1AgYnVmZmVyIG1ldGFkYXRhIHdyaXRhYmxlIGJlY2F1c2Ugd2Ugd2FudCB0byBtb2RpZnkgdGhlCisJICBtZXRhZGF0YS4KKwkgIEZpeGVzICM1NDYzMTIuCisKKzIwMDgtMDgtMDUgMDk6MDA6NTAgKzAwMDAgIEjDpXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOiBGaXggZGVidWcgYnkgbG9nZ2luZyB0aGUgcmlnaHQgc2VxbnVtLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSMOldmFyZCBHcmFmZiA8aGF2YXJkIGRvdCBncmFmZiBhdCB0YW5kYmVyZyBkb3QgY29tPgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pOgorCSAgRml4IGRlYnVnIGJ5IGxvZ2dpbmcgdGhlIHJpZ2h0IHNlcW51bS4KKworMjAwOC0wOC0wNSAwODo1ODoyNyArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IFJlbGVhc2UgbG9jayBiZWZvcmUgZW1pdHRpbmcgdGhlIHJlcXVlc3QtcHQtbWFwIHNpZ25hbC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9saXZpZXIgQ3JldGUgPHRlc3RlciBhdCB0ZXN0ZXIgZG90IGNhPgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGdldF9wdF9tYXApOgorCSAgUmVsZWFzZSBsb2NrIGJlZm9yZSBlbWl0dGluZyB0aGUgcmVxdWVzdC1wdC1tYXAgc2lnbmFsLgorCSAgRml4ZXMgIzU0MzQ4MC4KKworMjAwOC0wNy0wMyAxNDo0NDo1MSArMDAwMCAgUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2pAYXhpcy5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyLzogQ29ycmVjdGVkIGEgdHlwbyAoaW50ZXJwb2xsYXRlIC0+IGludGVycG9sYXRlKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBDaGFuZ2VMb2c6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOiAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3ApOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzogKHJ0cF9zb3VyY2VfZ2V0X25ld19zcik6CisJICBDb3JyZWN0ZWQgYSB0eXBvIChpbnRlcnBvbGxhdGUgLT4gaW50ZXJwb2xhdGUpLgorCisyMDA4LTA3LTAzIDE0OjMxOjEwICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvOiBDaGFuZ2VkIHNvbWUgR1NUX0RFQlVHKCkgdG8gR1NUX0xPRygpIHRvIHJlZHVjZSB0aGUgc3BhbSB3aGVuIGEgcGlwZWxpbmUgaXMgcnVubmluZyBub3JtYWxseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fcHJvY2Vzc19ydHApLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9zZW5kX3J0cCksIChnc3RfcnRwX3Nlc3Npb25fc2VuZF9ydGNwKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fc3luY19ydGNwKSwgKGdzdF9ydHBfc2Vzc2lvbl9jaGFpbl9yZWN2X3J0cCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3JlY3ZfcnRjcCksIChnc3RfcnRwX3Nlc3Npb25fY2hhaW5fc2VuZF9ydHApOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChzb3VyY2VfcHVzaF9ydHApLAorCSAgKHJ0cF9zZXNzaW9uX3NlbmRfcnRwKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IChwdXNoX3BhY2tldCksIChjYWxjdWxhdGVfaml0dGVyKSwKKwkgIChydHBfc291cmNlX3Byb2Nlc3NfcnRwKSwgKHJ0cF9zb3VyY2Vfc2VuZF9ydHApOgorCSAgQ2hhbmdlZCBzb21lIEdTVF9ERUJVRygpIHRvIEdTVF9MT0coKSB0byByZWR1Y2UgdGhlIHNwYW0gd2hlbiBhCisJICBwaXBlbGluZSBpcyBydW5uaW5nIG5vcm1hbGx5LgorCisyMDA4LTA3LTAzIDEzOjQ3OjE5ICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvOiBEbyBub3QgbWl4IHRoZSB1c2Ugb2YgZ19nZXRfY3VycmVudF90aW1lKCkgd2l0aCBnc3RfY2xvY2tfZ2V0X3RpbWUoKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25faW5pdCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2ZpbmFsaXplKSwgKHJ0Y3BfdGhyZWFkKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fY2hhaW5fcmVjdl9ydHApLCAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3JlY3ZfcnRjcCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRwX3NpbmspLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9jaGFpbl9zZW5kX3J0cCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKGNoZWNrX2NvbGxpc2lvbiksCisJICAodXBkYXRlX2Fycml2YWxfc3RhdHMpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19ydHApLAorCSAgKHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnRjcCksIChydHBfc2Vzc2lvbl9zZW5kX3J0cCksCisJICAocnRwX3Nlc3Npb25fc2VuZF9ieWVfbG9ja2VkKSwgKHJ0cF9zZXNzaW9uX3NlbmRfYnllKSwKKwkgIChydHBfc2Vzc2lvbl9uZXh0X3RpbWVvdXQpLCAoc2Vzc2lvbl9yZXBvcnRfYmxvY2tzKSwgKHNlc3Npb25fY2xlYW51cCksCisJICAoaXNfcnRjcF90aW1lKSwgKHJ0cF9zZXNzaW9uX29uX3RpbWVvdXQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBEbyBub3QgbWl4IHRoZSB1c2Ugb2YgZ19nZXRfY3VycmVudF90aW1lKCkgd2l0aCBnc3RfY2xvY2tfZ2V0X3RpbWUoKS4KKworMjAwOC0wNi0xNiAwNzozMDozNCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBGaW5hbCByb3VuZCBvZiBkb2MgdXBkYXRlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgICogZ3N0L3NwZWVkL2dzdHNwZWVkLmM6CisJICAqIGdzdC9zcGVleHJlc2FtcGxlL2dzdHNwZWV4cmVzYW1wbGUuYzoKKwkgICogZ3N0L3ZpZGVvc2lnbmFsL2dzdHZpZGVvYW5hbHlzZS5jOgorCSAgKiBnc3QvdmlkZW9zaWduYWwvZ3N0dmlkZW9kZXRlY3QuYzoKKwkgICogZ3N0L3ZpZGVvc2lnbmFsL2dzdHZpZGVvbWFyay5jOgorCSAgKiBzeXMvZHZiL2dzdGR2YnNyYy5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6CisJICAqIHN5cy9vc3M0L29zczQtc2luay5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOgorCSAgKiBzeXMvd2luaW5ldC9nc3R3aW5pbmV0c3JjLmM6CisJICBGaW5hbCByb3VuZCBvZiBkb2MgdXBkYXRlcy4KKworMjAwOC0wNi0xNiAwNzowMzo1OCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvOiBNb3JlIGRvYyB1cGRhdGVzLiBNb3JlIHhyZWZzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwY2xpZW50LmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICAqIGdzdC9zZHAvZ3N0c2RwZGVtdXguYzoKKwkgIE1vcmUgZG9jIHVwZGF0ZXMuIE1vcmUgeHJlZnMuCisKKzIwMDgtMDYtMTIgMTQ6NDk6MTggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgRG8gbm90IHVzZSBzaG9ydF9kZXNjcmlwdGlvbiBpbiBzZWN0aW9uIGRvY3MgZm9yIGVsZW1lbnRzLiBXZSBleHRyYWN0IHRoZW0gZnJvbSBlbGVtZW50IGRldGFpbHMgYW5kIHRoZXJlIHdpbGwgYmUgd2FyLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2RjMTM5NC9nc3RkYzEzOTQuYzoKKwkgICogZXh0L2l2b3JiaXMvdm9yYmlzZGVjLmM6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkgICogZXh0L21ldGFkYXRhL2dzdG1ldGFkYXRhZGVtdXguYzoKKwkgICogZXh0L215dGh0di9nc3RteXRodHZzcmMuYzoKKwkgICogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzoKKwkgICogZ3N0LWxpYnMvZ3N0L2FwcC9nc3RhcHBzaW5rLmM6CisJICAqIGdzdC9iYXllci9nc3RiYXllcjJyZ2IuYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICAqIGdzdC9yYXdwYXJzZS9nc3RhdWRpb3BhcnNlLmM6CisJICAqIGdzdC9yYXdwYXJzZS9nc3R2aWRlb3BhcnNlLmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBjbGllbnQuYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgICogZ3N0L3NlbGVjdG9yL2dzdGlucHV0c2VsZWN0b3IuYzoKKwkgICogZ3N0L3NlbGVjdG9yL2dzdG91dHB1dHNlbGVjdG9yLmM6CisJICAqIGdzdC92aWRlb3NpZ25hbC9nc3R2aWRlb2FuYWx5c2UuYzoKKwkgICogZ3N0L3ZpZGVvc2lnbmFsL2dzdHZpZGVvZGV0ZWN0LmM6CisJICAqIGdzdC92aWRlb3NpZ25hbC9nc3R2aWRlb21hcmsuYzoKKwkgICogc3lzL29zczQvb3NzNC1taXhlci5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LXNpbmsuYzoKKwkgICogc3lzL29zczQvb3NzNC1zb3VyY2UuYzoKKwkgIERvIG5vdCB1c2Ugc2hvcnRfZGVzY3JpcHRpb24gaW4gc2VjdGlvbiBkb2NzIGZvciBlbGVtZW50cy4gV2UgZXh0cmFjdAorCSAgdGhlbSBmcm9tIGVsZW1lbnQgZGV0YWlscyBhbmQgdGhlcmUgd2lsbCBiZSB3YXJuaW5ncyBpZiB0aGV5IGRpZmZlci4KKwkgIEFsc28gZml4aW5nIHVwIHRoZSBDaGFuZ2VMb2cgb3JkZXIuCisKKzIwMDgtMDYtMDYgMTM6MDE6MDUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiBGaXggZGVhZGxvY2sgd2hlbiBzaHV0dGluZyBkb3duLCB1c2UgYSBuZXcgbG9jayBpbnN0ZWFkIHRvIHByb3Blcmx5IHNodXRkb3duLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoZ3N0X3J0cF9iaW5faW5pdCksCisJICAoZ3N0X3J0cF9iaW5fZmluYWxpemUpLCAoZ3N0X3J0cF9iaW5fY2hhbmdlX3N0YXRlKToKKwkgIEZpeCBkZWFkbG9jayB3aGVuIHNodXR0aW5nIGRvd24sIHVzZSBhIG5ldyBsb2NrIGluc3RlYWQgdG8gcHJvcGVybHkKKwkgIHNodXRkb3duLgorCisyMDA4LTA1LTI3IDE2OjQ4OjEwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogQnJlYWsgb3V0IG9mIGNhbGxiYWNrcyB3aGVuIHdlIGFyZSBzaHV0dGluZyBkb3duLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgKGdzdF9ydHBfYmluX3Byb3BhZ2F0ZV9wcm9wZXJ0eV90b19qaXR0ZXJidWZmZXIpLAorCSAgKGdzdF9ydHBfYmluX2NoYW5nZV9zdGF0ZSksIChuZXdfcGF5bG9hZF9mb3VuZCksCisJICAobmV3X3NzcmNfcGFkX2ZvdW5kKToKKwkgIEJyZWFrIG91dCBvZiBjYWxsYmFja3Mgd2hlbiB3ZSBhcmUgc2h1dHRpbmcgZG93bi4KKwkgIE1ha2Ugc3VyZSBubyBzdGF0ZSBjaGFuZ2VzIGNhbiBoYXBwZW4gd2hlbiB3ZSByZWNvbmZpZ3VyZS4KKworMjAwOC0wNS0yNiAxMDowOToyOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6IFdoZW4gY2hlY2tpbmcgdGhlIHNlcW51bSwgcmVzZXQgdGhlIGppdHRlcmJ1ZmZlciBpZiB0aGUgZ2FwIGlzIHRvbyBiaWcsIHdlIG5lZWQgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYWluKSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKToKKwkgIFdoZW4gY2hlY2tpbmcgdGhlIHNlcW51bSwgcmVzZXQgdGhlIGppdHRlcmJ1ZmZlciBpZiB0aGUgZ2FwIGlzIHRvbyBiaWcsCisJICB3ZSBuZWVkIHRvIGRvIHRoaXMgc28gdGhhdCB3ZSBjYW4gYmV0dGVyIGhhbmRsZSBhIHJlc3RhcnRlZCBzb3VyY2UuCisJICBGaXggc29tZSBjb21tZW50cy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IChjYWxjdWxhdGVfc2tldyksCisJICAocnRwX2ppdHRlcl9idWZmZXJfaW5zZXJ0KToKKwkgIFR3ZWFrIHRoZSBza2V3IHJlc3luYyBkaWZmLgorCSAgVXNlIG91ciB3b3JraW5nIHNlcW51bSBjb21wYXJlIGZ1bmN0aW9uIGluIC1iYXNlLgorCSAgUmV3b3JrIHRoZSBqaXR0ZXJidWZmZXIgaW5zZXJ0IGNvZGUgdG8gbWFrZSBpdCBjbGVhcmVyIGFuZCBtb3JlCisJICBwZXJmb3JtYW50IGJ5IG9ubHkgcmV0cmlldmluZyB0aGUgc2VxbnVtIG9mIHRoZSBpbnB1dCBidWZmZXIgb25jZSBhbmQgYnkKKwkgIGFkZGluZyBzb21lIEdfTElLRUxZIGNvbXBpbGVyIGhpbnRzLgorCSAgSW1wcm92ZSBkZWJ1Z2dpbmcgZm9yIGR1cGxpY2F0ZSBwYWNrZXRzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzogKHJ0cF9zb3VyY2VfcHJvY2Vzc19ydHApOgorCSAgRml4IGEgY29tbWVudCwgd2UgZG9uJ3QgZG8gc2tldyBjb3JyZWN0aW9uIGhlcmUuLgorCisyMDA4LTA1LTI2IDEwOjAwOjI0ICswMDAwICBIw6V2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAdGFuZGJlcmcuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogUHJvcGFnYXRlIHRoZSBkby1sb3N0IGFuZCBsYXRlbmN5IHByb3BlcnRpZXMgdG8gdGhlIGppdHRlcmJ1ZmZlcnMgd2hlbiB0aGV5IGFyZSBjaGFuZ2VkIG8uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEjDpXZhcmQgR3JhZmYgPGhhdmFyZCBkb3QgZ3JhZmYgYXQgdGFuZGJlcmcgZG90IGNvbT4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICAoZ3N0X3J0cF9iaW5fcHJvcGFnYXRlX3Byb3BlcnR5X3RvX2ppdHRlcmJ1ZmZlciksCisJICAoZ3N0X3J0cF9iaW5fc2V0X3Byb3BlcnR5KToKKwkgIFByb3BhZ2F0ZSB0aGUgZG8tbG9zdCBhbmQgbGF0ZW5jeSBwcm9wZXJ0aWVzIHRvIHRoZSBqaXR0ZXJidWZmZXJzIHdoZW4KKwkgIHRoZXkgYXJlIGNoYW5nZWQgb24gcnRwYmluLgorCisyMDA4LTA1LTI2IDA5OjU3OjQwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBEb24ndCB1c2UgX2dzdF9wYWQoKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleGFtcGxlcy9zd2l0Y2gvc3dpdGNoZXIuYzogKHN3aXRjaF90aW1lcik6CisJICAqIGdzdC9yZXBsYXlnYWluL2dzdHJndm9sdW1lLmM6IChnc3Rfcmdfdm9sdW1lX2luaXQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBjbGllbnQuYzogKGNyZWF0ZV9zdHJlYW0pOgorCSAgKiBnc3Qvc2RwL2dzdHNkcGRlbXV4LmM6IChnc3Rfc2RwX2RlbXV4X3N0cmVhbV9jb25maWd1cmVfdWRwKSwKKwkgIChnc3Rfc2RwX2RlbXV4X3N0cmVhbV9jb25maWd1cmVfdWRwX3NpbmspOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGVhdmUuYzogKEdTVF9TVEFSVF9URVNUKSwKKwkgIChwYWRfYWRkZWRfc2V0dXBfZGF0YV9jaGVja19mbG9hdDMyXzhjaF9jYik6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzogKHNlbmRfZW9zX2V2ZW50KSwKKwkgIChzZW5kX3RhZ19ldmVudCk6CisJICBEb24ndCB1c2UgX2dzdF9wYWQoKS4KKworMjAwOC0wNS0xNiAxOTo1NjozMCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGRvY3MvTWFrZWZpbGUuYW06IERvbid0IGF0dGVtcHQgdG8gYnVpbGQgcGx1Z2luIGRvY3Mgd2hlbiB0aGV5J3JlIGRpc2FibGVkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvTWFrZWZpbGUuYW06CisJICBEb24ndCBhdHRlbXB0IHRvIGJ1aWxkIHBsdWdpbiBkb2NzIHdoZW4gdGhleSdyZSBkaXNhYmxlZC4KKwkgICogZ3N0L2JheWVyL01ha2VmaWxlLmFtOgorCSAgQWRkIGxpYmdzdHZpZGVvIHRvIHRoZSBsaW5rLgorCSAgKiBnc3QvcnRwbWFuYWdlci9NYWtlZmlsZS5hbToKKwkgIEZpeCBsaW5rIG9yZGVyLCBhbmQgbW92ZSBMSUJTIHRoaW5ncyB0byBfTElCUworCisyMDA4LTA1LTE0IDIxOjAyOjE5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogU2ltcGx5IGRyb3AgYmFkIFJUUCBwYWNrZXRzIHdpdGggYSB3YXJuaW5nIGluc3RlYWQgb2YganVzdCBwb3N0aW5nIGFuIGVycm9yIGFuZCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pOgorCSAgU2ltcGx5IGRyb3AgYmFkIFJUUCBwYWNrZXRzIHdpdGggYSB3YXJuaW5nIGluc3RlYWQgb2YganVzdCBwb3N0aW5nIGFuCisJICBlcnJvciBhbmQgc3RvcHBpbmcuIFRoaXMgaXMgYSBwZXJmZWN0bHkgcmVjb3ZlcmFibGUgZXZlbnQgYW5kIHdlIGRvbid0CisJICBmb3JjZSBwZW9wbGUgdG8gdXNlIGFuIHJ0cGJpbiB0byBmaWx0ZXIgb3V0IGJhZCBwYWNrZXRzIGZpcnN0LgorCisyMDA4LTA1LTEzIDA5OjA2OjUxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogQWN0dWFsbHkgYWRkIHRoZSBkby1sb3N0IHByb3BlcnR5IHRvIHRoZSBvYmplY3QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChnc3RfcnRwX2Jpbl9jbGFzc19pbml0KToKKwkgIEFjdHVhbGx5IGFkZCB0aGUgZG8tbG9zdCBwcm9wZXJ0eSB0byB0aGUgb2JqZWN0LgorCisyMDA4LTA1LTEyIDE4OjQzOjQxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogQXZvaWQgd2FpdGluZyBmb3IgYSBuZWdhdGl2ZSAoaHVnZSkgZHVyYXRpb24gd2hlbiB0aGUgbGFzdCBwYWNrZXQgaGFzIGEgbG93ZXIgdGkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfbG9vcCk6CisJICBBdm9pZCB3YWl0aW5nIGZvciBhIG5lZ2F0aXZlIChodWdlKSBkdXJhdGlvbiB3aGVuIHRoZSBsYXN0IHBhY2tldCBoYXMgYQorCSAgbG93ZXIgdGltZXN0YW1wIHRoYW4gdGhlIGN1cnJlbnQgcGFja2V0LgorCisyMDA4LTA1LTEyIDE0OjI4OjA5ICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiBNYWtlIHN1cmUgdG8gdW5yZWYgdGhlIHJ0cHNlc3Npb24gcmV0dXJuZWQgYnkgZ3N0X3BhZF9nZXRfcGFyZW50KCkgdG8gcHJldmVudCBhIG1lbW9yLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoZ3N0X3J0cF9zZXNzaW9uX3F1ZXJ5X3NlbmRfcnRjcF9zcmMpOgorCSAgTWFrZSBzdXJlIHRvIHVucmVmIHRoZSBydHBzZXNzaW9uIHJldHVybmVkIGJ5IGdzdF9wYWRfZ2V0X3BhcmVudCgpIHRvCisJICBwcmV2ZW50IGEgbWVtb3J5IGxlYWsuCisKKzIwMDgtMDUtMTIgMTQ6MTI6MDggKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogSW5pdGlhbGlzZSB3aXRoIEdTVF9DTE9DS19USU1FX05PTkUgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfbG9vcCk6CisJICBJbml0aWFsaXNlIHdpdGggR1NUX0NMT0NLX1RJTUVfTk9ORSB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nLgorCisyMDA4LTA1LTA5IDA3OjQxOjU4ICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IE1ha2Ugc3VyZSB0byB1bnJlZiB0aGUgY2FwcyB1c2VkIGJ5IFJUUFNvdXJjZSB0byBwcmV2ZW50IGEgbWVtb3J5IGxlYWsuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IChydHBfc291cmNlX2ZpbmFsaXplKToKKwkgIE1ha2Ugc3VyZSB0byB1bnJlZiB0aGUgY2FwcyB1c2VkIGJ5IFJUUFNvdXJjZSB0byBwcmV2ZW50IGEgbWVtb3J5IGxlYWsuCisKKzIwMDgtMDUtMDggMDk6NDM6MzMgKzAwMDAgIE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogVW5sb2NrIHRoZSBzZXNzaW9uIGxvY2sgd2hlbiBjYWxsaW5nIG9uZSBvZiBvdXIgY2FsbGJhY2tzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyIGF0IHRlc3RlciBkb3QgY2E+CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHNvdXJjZV9jbG9ja19yYXRlKSwKKwkgIChydHBfc2Vzc2lvbl9wcm9jZXNzX2J5ZSksIChydHBfc2Vzc2lvbl9zZW5kX2J5ZV9sb2NrZWQpOgorCSAgVW5sb2NrIHRoZSBzZXNzaW9uIGxvY2sgd2hlbiBjYWxsaW5nIG9uZSBvZiBvdXIgY2FsbGJhY2tzLgorCSAgRml4ZXMgIzUzMjAxMS4KKworMjAwOC0wNS0wOCAwNjoyMzozOSArMDAwMCAgU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IFNlbmQgUlRQIEJZRSBjb21tYW5kIG9uIEVPUy4gRml4ZXMgYnVnICM1MzE5NTUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTam9lcmQgU2ltb25zIDxzam9lcmQgYXQgbHVvbiBkb3QgbmV0PgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRwX3NpbmspOgorCSAgU2VuZCBSVFAgQllFIGNvbW1hbmQgb24gRU9TLiBGaXhlcyBidWcgIzUzMTk1NS4KKworMjAwOC0wNC0yNSAxMTozMjowOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLio6IEV4cG9zZSBuZXcgaml0dGVyYnVmZmVyIHByb3BlcnR5IGluIHJ0cGJpbiB0b28uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChjcmVhdGVfc3RyZWFtKSwgKGdzdF9ydHBfYmluX2luaXQpLAorCSAgKGdzdF9ydHBfYmluX3NldF9wcm9wZXJ0eSksIChnc3RfcnRwX2Jpbl9nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgIEV4cG9zZSBuZXcgaml0dGVyYnVmZmVyIHByb3BlcnR5IGluIHJ0cGJpbiB0b28uCisKKzIwMDgtMDQtMjUgMTE6MjI6MTMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOiBEaXNhYmxlIHNlbmRpbmcgb3V0IHJ0cCBwYWNrZXQgbG9zdCBldmVudHMgYnkgZGVmYXVsdCBhbmQgbWFrZSBhIHByb3BlcnR5IHRvIGVuYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jbGFzc19pbml0KSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9pbml0KSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfbG9vcCksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3Byb3BlcnR5KToKKwkgIERpc2FibGUgc2VuZGluZyBvdXQgcnRwIHBhY2tldCBsb3N0IGV2ZW50cyBieSBkZWZhdWx0IGFuZCBtYWtlIGEKKwkgIHByb3BlcnR5IHRvIGVuYWJlIGl0LiBXZSB3aWxsIGxpa2VseSBlbmFibGUgaXQgYnkgZGVmYXVsdCB3aGVuIHRoZSBiYXNlCisJICBkZXBheWxvYWRlcnMgaGF2ZSBhIGRlZmF1bHQgaGFuZGxlciBmb3IgdGhlbSBzbyB0aGF0IHdlIGRvbid0IHNlbmQgdGhlc2UKKwkgIGV2ZW50cyBhbGwgdGhyb3VnaCB0aGUgcGlwZWxpbmUgZm9yIG5vdy4KKworMjAwOC0wNC0yNSAwOTozNTo0MyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6IFJlbW92ZSBwcml2YXRlIHZlcnNpb24gb2YgYSBmdW5jdGlvbiB0aGF0IGlzIGluIC1iYXNlIG5vdy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfaW5pdCksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZmx1c2hfc3RvcCksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NyY19ldmVudCksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKToKKwkgIFJlbW92ZSBwcml2YXRlIHZlcnNpb24gb2YgYSBmdW5jdGlvbiB0aGF0IGlzIGluIC1iYXNlIG5vdy4KKwkgIEFkZCBzcmMgZXZlbnQgaGFuZGxlci4KKwkgIFJld29yayB0aGUgaml0dGVyYnVmZmVyIHB1c2hpbmcgbG9vcCBzbyB0aGF0IGl0IGNhbiBxdWlja2x5IHJlYWN0IHRvCisJICBsb3N0IHBhY2tldHMgYW5kIGluc3RydWN0IHRoZSBkZXBheWxvYWRlciBvZiB0aGVtLiBUaGlzIGNhbiB0aGVuIGJlIHVzZWQKKwkgIHRvIGltcGxlbWVudCBlcnJvciBjb25jZWFsbWVudCBkYXRhLgorCisyMDA4LTA0LTI1IDA4OjIxOjA2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IFNldCB1cCBzb21lIGludGVybmFsIGxpbmtzIGZ1bmN0aW9ucyBmb3IgdGhlIFJUQ1AgYW5kIHN5bmMgcGFkcyBiZWNhdXNlIHRoZSBkZWZhdWx0cyAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICAoZ3N0X3J0cF9zZXNzaW9uX3F1ZXJ5X3NlbmRfcnRjcF9zcmMpLCAoY3JlYXRlX3JlY3ZfcnRjcF9zaW5rKSwKKwkgIChjcmVhdGVfc2VuZF9ydGNwX3NyYyk6CisJICBTZXQgdXAgc29tZSBpbnRlcm5hbCBsaW5rcyBmdW5jdGlvbnMgZm9yIHRoZSBSVENQIGFuZCBzeW5jIHBhZHMgYmVjYXVzZQorCSAgdGhlIGRlZmF1bHRzIGFyZSByZWFsbHkgbm90IGNvcnJlY3QuCisJICBJbXBsZW1lbnQgYSBxdWVyeSBoYW5kbGVyIGZvciB0aGUgUlRDUCBzcmMgcGFkLCBtb3N0bHkgdG8gY29ycmVjdGx5CisJICByZXBvcnQgYWJvdXQgdGhlIGxhdGVuY3kuCisKKzIwMDgtMDQtMjUgMDg6MTU6NTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyLzogQWxzbyBrZWVwIHRyYWNrIG9mIHRoZSBmaXJzdCBidWZmZXIgdGltZXN0YW1wIHRvZ2V0aGVyIHdpdGggdGhlIGZpcnN0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChnc3RfcnRwX2Jpbl9hc3NvY2lhdGUpLAorCSAgKGdzdF9ydHBfYmluX3N5bmNfY2hhaW4pOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6ICh1cGRhdGVfYXJyaXZhbF9zdGF0cyksCisJICAocnRwX3Nlc3Npb25fcHJvY2Vzc19zciksIChydHBfc2Vzc2lvbl9vbl90aW1lb3V0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IChydHBfc291cmNlX2luaXQpLAorCSAgKGNhbGN1bGF0ZV9qaXR0ZXIpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaDoKKwkgIEFsc28ga2VlcCB0cmFjayBvZiB0aGUgZmlyc3QgYnVmZmVyIHRpbWVzdGFtcCB0b2dldGhlciB3aXRoIHRoZSBmaXJzdAorCSAgUlRQIHRpbWVzdGFtcCBhcyB0aGV5IGJvdGggYXJlIG5lZWRlZCB0byBjb25zdHJ1Y3QgdGhlIHRpbWluZyBvZgorCSAgb3V0Z29pbmcgcGFja2V0cyBpbiB0aGUgaml0dGVyYnVmZmVyIGFuZCBhcmUgdGhlcmVmb3JlIGFsc28gbmVlZGVkIHRvCisJICBtYW5hZ2UgbGlwLXN5bmMuIFRoaXMgZml4ZXMgbGlwLXN5bmMgaWYgdGhlIGZpcnN0IFJUUCBwYWNrZXRzIGFycml2ZQorCSAgd2l0aCBhIHdpbGRseSBkaWZmZXJlbnQgZ2FwLgorCisyMDA4LTA0LTIxIDA4OjI2OjM3ICswMDAwICBPbGl2aWVyIENyZXRlIDx0ZXN0ZXJAdGVzdGVyLmNhPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogUmVmIGNhcHMgd2hlbiBpbnNlcnRpbmcgaW50byB0aGUgY2FjaGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBPbGl2aWVyIENyZXRlIDx0ZXN0ZXIgYXQgdGVzdGVyIGRvdCBjYT4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChjcmVhdGVfc2Vzc2lvbiksIChnZXRfcHRfbWFwKSwKKwkgIChuZXdfc3NyY19wYWRfZm91bmQpOgorCSAgUmVmIGNhcHMgd2hlbiBpbnNlcnRpbmcgaW50byB0aGUgY2FjaGUuCisJICBEb24ndCBsZWFrIHBhZHMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9nZXRfY2xvY2tfcmF0ZSksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3F1ZXJ5KToKKwkgIEF2b2lkIGEgY2FwcyBsZWFrLgorCSAgRG9uJ3QgbGVhayByZWZjb3VudCBpbiBxdWVyeS4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOiAoZ3N0X3J0cF9wdF9kZW11eF9nZXRfY2FwcyksCisJICAoZ3N0X3J0cF9wdF9kZW11eF9jaGFpbik6CisJICBBdm9pZCBjYXBzIGxlYWtzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChzb3VyY2VfZ2V0X3NkZXNfc3RydWN0dXJlKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25faW5pdCksIChyZXR1cm5fdHJ1ZSksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NsZWFyX3B0X21hcCksIChnc3RfcnRwX3Nlc3Npb25fY2FjaGVfY2FwcyksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2Nsb2NrX3JhdGUpOgorCSAgUmVmIGNhcHMgd2hlbiBpbnNlcnRpbmcgaW50byB0aGUgY2FjaGUuCisJICBGaXggc29tZSBtb3JlIGNhcHMgbGVha3MuIEZpeGVzICM1MjgyNDUuCisKKzIwMDgtMDQtMTcgMDc6MzE6NDQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyLzogVW5zZXQgR1ZhbHVlcyBhZnRlciBnX3NpZ25hbF9lbWl0diBzbyB0aGF0IHdlIGF2b2lkIGEgcmVmY291bnQgbGVhay4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGdldF9wdF9tYXApLCAoZnJlZV9jbGllbnQpLAorCSAgKGdzdF9ydHBfYmluX2Fzc29jaWF0ZSksIChnc3RfcnRwX2Jpbl9nZXRfZnJlZV9wYWRfbmFtZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9nZXRfY2xvY2tfcmF0ZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzogKGdzdF9ydHBfcHRfZGVtdXhfZ2V0X2NhcHMpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fY2xvY2tfcmF0ZSk6CisJICBVbnNldCBHVmFsdWVzIGFmdGVyIGdfc2lnbmFsX2VtaXR2IHNvIHRoYXQgd2UgYXZvaWQgYSByZWZjb3VudCBsZWFrLgorCSAgRG9uJ3QgbGVhayBhIHBhZG5hbWUuCisJICBEb24ndCBsZWFrIGNsaWVudCBzdHJlYW1zIGxpc3QuCisJICBMb2NrIHJ0cGJpbiB3aGVuIGFzc29jaWF0aW5nIHN0cmVhbXMuIEZpeGVzICM1MjgyNDUuCisKKzIwMDgtMDQtMDkgMjI6Mjc6NTAgKzAwMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci86IEF2b2lkIGxlYWtpbmcgcGFkcyBpbiB0aGUgUlRQIG1hbmFnZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChmcmVlX3Nlc3Npb24pOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fZmluYWxpemUpOgorCSAgQXZvaWQgbGVha2luZyBwYWRzIGluIHRoZSBSVFAgbWFuYWdlci4KKworMjAwOC0wMy0xMSAxMjo0MDo1OCArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi4qOiBJbXBsZW1lbnQgY29sbGlzaW9uIGFuZCBsb29wIGRldGVjdGlvbiBpbiBydHBtYW5hZ2VyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyIGF0IHRlc3RlciBkb3QgY2E+CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKGZpbmRfYWRkX2NvbmZsaWN0aW5nX2FkZHJlc3NlcyksCisJICAoY2hlY2tfY29sbGlzaW9uKSwgKG9idGFpbl9zb3VyY2UpLCAocnRwX3Nlc3Npb25fY3JlYXRlX25ld19zc3JjKSwKKwkgIChydHBfc2Vzc2lvbl9jcmVhdGVfc291cmNlKSwgKHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnRwKSwKKwkgIChydHBfc2Vzc2lvbl9wcm9jZXNzX3NyKSwgKHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnIpLAorCSAgKHJ0cF9zZXNzaW9uX3Byb2Nlc3Nfc2RlcyksIChydHBfc2Vzc2lvbl9wcm9jZXNzX2J5ZSksCisJICAocnRwX3Nlc3Npb25fc2VuZF9ieWVfbG9ja2VkKSwgKHJ0cF9zZXNzaW9uX3NlbmRfYnllKSwKKwkgIChydHBfc2Vzc2lvbl9vbl90aW1lb3V0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgSW1wbGVtZW50IGNvbGxpc2lvbiBhbmQgbG9vcCBkZXRlY3Rpb24gaW4gcnRwbWFuYWdlci4KKwkgIEZpeGVzICM1MjA2MjYuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiAocnRwX3NvdXJjZV9yZXNldCksCisJICAocnRwX3NvdXJjZV9pbml0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBBZGQgbWV0aG9kIHRvIHJlc2V0IHN0YXRzLgorCisyMDA4LTAzLTExIDExOjM2OjAzICswMDAwICBPbGUgQW5kcsOpIFZhZGxhIFJhdm7DpXMgPG9sZS5hbmRyZS5yYXZuYXNAdGFuZGJlcmcuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IEF2b2lkIGEgZGVhZGxvY2sgd2hlbiBqb2luaW5nIHRoZSBSVENQIHRocmVhZCBpbiBQQVVTRUQgYmVjYXVzZSBpdCBtaWdodCBiZSBibG9ja2VkIGQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IE9sZSBBbmRyw6kgVmFkbGEgUmF2bsOlcyAgPG9sZS5hbmRyZS5yYXZuYXNAdGFuZGJlcmcuY29tPgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25faW5pdCksCisJICAocnRjcF90aHJlYWQpLCAoc3RhcnRfcnRjcF90aHJlYWQpLCAoc3RvcF9ydGNwX3RocmVhZCksCisJICAoam9pbl9ydGNwX3RocmVhZCksIChnc3RfcnRwX3Nlc3Npb25fY2hhbmdlX3N0YXRlKToKKwkgIEF2b2lkIGEgZGVhZGxvY2sgd2hlbiBqb2luaW5nIHRoZSBSVENQIHRocmVhZCBpbiBQQVVTRUQgYmVjYXVzZSBpdCBtaWdodAorCSAgYmUgYmxvY2tlZCBkb3duc3RyZWFtLiBBbHNvIGF2b2lkIHNwYXduaW5nIG11bHRpcGxlIHJ0Y3AgdGhyZWFkcy4KKwkgIEZpeGVzICM1MjA4OTQuCisKKzIwMDgtMDMtMTEgMTA6NDM6MzIgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSAgZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IERvbid0IHRyeSB0byByZXNldCB0aGUgY2xvY2sgc2tldyB3aGVuIHdlIGhhdmUgbm8gdGltZXN0YW1wcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IChjYWxjdWxhdGVfc2tldyk6CisJICBEb24ndCB0cnkgdG8gcmVzZXQgdGhlIGNsb2NrIHNrZXcgd2hlbiB3ZSBoYXZlIG5vIHRpbWVzdGFtcHMuCisJICBGaXhlcyAjNTE5MDA1LgorCisyMDA4LTAyLTIwIDA5OjMzOjI1ICswMDAwICBPbGl2aWVyIENyZXRlIDx0ZXN0ZXJAdGVzdGVyLmNhPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogRml4IHNtYWxsIG1lbW9yeSBsZWFrLCBsZWFraW5nIGNhcHMuIEZpeGVzICNidWcgNTE3NTcxLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyIGF0IHRlc3RlciBkb3QgY2E+CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAobmV3X3NzcmNfcGFkX2ZvdW5kKToKKwkgIEZpeCBzbWFsbCBtZW1vcnkgbGVhaywgbGVha2luZyBjYXBzLiBGaXhlcyAjYnVnIDUxNzU3MS4KKworMjAwOC0wMi0xNCAxNjoyNTo1MSArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IElnbm9yZSBzdHJlYW1zIHRoYXQgZGlkIG5vdCByZWNlaXZlIGFuIFNSIHBhY2tldCB3aGVuIGRvaW5nIHN5bmNocm9uaXNhdGlvbi4gRml4ZXMgIzUxNjE2MC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoZ3N0X3J0cF9iaW5fYXNzb2NpYXRlKToKKwkgIElnbm9yZSBzdHJlYW1zIHRoYXQgZGlkIG5vdCByZWNlaXZlIGFuIFNSIHBhY2tldCB3aGVuIGRvaW5nCisJICBzeW5jaHJvbmlzYXRpb24uIEZpeGVzICM1MTYxNjAuCisKKzIwMDgtMDEtMjkgMTg6NTc6MjcgKzAwMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOiBUcnkgdG8gZ2V0IHRoZSBuZXcgY2xvY2stcmF0ZSBmcm9tIHRoZSBidWZmZXIgY2FwcyB3aGVuIHdlIHJlY2VpdmUgYSBuZXcgcGF5bG9hZC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVGhpanMgVmVybWVpciAgPHRoaWpzdmVybWVpciBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pOgorCSAgVHJ5IHRvIGdldCB0aGUgbmV3IGNsb2NrLXJhdGUgZnJvbSB0aGUgYnVmZmVyIGNhcHMgd2hlbiB3ZSByZWNlaXZlIGEgbmV3CisJICBwYXlsb2FkIHR5cGUgaW5zdGVhZCBvZiBhbHdheXMgZmlyaW5nIHRoZSBzaWduYWwuIEZpeGVzICM1MTI3NzQuCisKKzIwMDgtMDEtMjUgMTY6NTg6MDAgKzAwMDAgIE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiBBbHNvIGhhbmRsZSBsaXAtc3luYyB3aGVuIHRoZSBjbG9jay1yYXRlIGlzIG5vdCBwcm92aWRlZCB3aXRoIGNhcHMgYnV0IHdpdGggYSBzaWduYWwuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBPbGl2aWVyIENyZXRlIDx0ZXN0ZXJAdGVzdGVyLmNhPgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGdzdF9ydHBfYmluX2Fzc29jaWF0ZSksCisJICAoY3JlYXRlX3N0cmVhbSksIChwYXlsb2FkX3R5cGVfY2hhbmdlKSwgKG5ld19zc3JjX3BhZF9mb3VuZCk6CisJICBBbHNvIGhhbmRsZSBsaXAtc3luYyB3aGVuIHRoZSBjbG9jay1yYXRlIGlzIG5vdCBwcm92aWRlZCB3aXRoIGNhcHMgYnV0CisJICB3aXRoIGEgc2lnbmFsLgorCisyMDA4LTAxLTI1IDE2OjAwOjUyICswMDAwICBPbGl2aWVyIENyZXRlIDx0ZXN0ZXJAdGVzdGVyLmNhPgorCisJICBnc3QvcnRwbWFuYWdlci86IFJlbW92ZSB0aGUgZml4ZWQgY2xvY2stcmF0ZSBmcm9tIHRoZSBqaXR0ZXJidWZmZXIgYW5kIGV4dGVuZCBpdCBzbyB0aGF0IGEgY2xvY2stcmF0ZSBjYW4gYmUgcHJvdmlkZWQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9qaXR0ZXJfYnVmZmVyX3NpbmtfcGFyc2VfY2FwcyksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzogKGNhbGN1bGF0ZV9za2V3KSwKKwkgIChydHBfaml0dGVyX2J1ZmZlcl9pbnNlcnQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaDoKKwkgIFJlbW92ZSB0aGUgZml4ZWQgY2xvY2stcmF0ZSBmcm9tIHRoZSBqaXR0ZXJidWZmZXIgYW5kIGV4dGVuZCBpdCBzbyB0aGF0CisJICBhIGNsb2NrLXJhdGUgY2FuIGJlIHByb3ZpZGVkIHdpdGggZWFjaCBidWZmZXIgaW5zdGVhZC4gRml4ZXMgIzUxMTY4Ni4KKworMjAwOC0wMS0yNSAxNTo0OTo1NSArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6IFJlbW92ZSBvbGQgdW51c2VkIHZhcmlhYmxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2luaXQpLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYWluKSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKToKKwkgIFJlbW92ZSBvbGQgdW51c2VkIHZhcmlhYmxlLgorCSAgVHJhY2sgcHQgb24gaW5wdXQgYnVmZmVycyBhbmQgZ2V0IHRoZSBjbG9jay1yYXRlIHdoZW4gaXQgY2hhbmdlcy4KKwkgIElnbm9yZSBwYWNrZXRzIHdpdGggdW5rbm93biBjbG9jay1yYXRlLiBTZWUgIzUxMTY4Ni4KKworMjAwOC0wMS0yNSAwMTo0NDoyNyArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IEZpeCB1bnJlZiBvZiBidWZmZXIgdXNpbmcgdGhlIHdyb25nIGZ1bmN0aW9uLiAgRml4ZXMgIzUxMTkyMAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IEZpeCB1bnJlZiBvZiBidWZmZXIgdXNpbmcgdGhlCisJICB3cm9uZyBmdW5jdGlvbi4gIEZpeGVzICM1MTE5MjAKKworMjAwOC0wMS0xMSAxNzowMjozMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiBJZiB3ZSBmaW5kIHRoZSBjYXBzIGluIHRoZSBjYWNoZSwgdXNlIGl0IHRvIHBhcnNlIHRoZSBjbG9jay1yYXRlIGluc3RlYWQgb2YgcmV0dXJuaW5nLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoZ3N0X3J0cF9zZXNzaW9uX2Nsb2NrX3JhdGUpOgorCSAgSWYgd2UgZmluZCB0aGUgY2FwcyBpbiB0aGUgY2FjaGUsIHVzZSBpdCB0byBwYXJzZSB0aGUgY2xvY2stcmF0ZSBpbnN0ZWFkCisJICBvZiByZXR1cm5pbmcgYW4gZXJyb3IuIEZpeGVzIGEgVE9ETyBhcyBmb3VuZCBieSBZb3VuZXNzIEFsYW91aS4KKworMjAwOC0wMS0xMSAxNjo0NTo1NyArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L3J0cG1hbmFnZXIvOiBNYWtlIGl0IHBvc3NpYmxlIHRvIHVzZSBkaWZmZXJlbnQgdXNlcl9kYXRhIGZvciBlYWNoIG9mIHRoZSBjYWxsYmFja3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBZb3VuZXNzIEFsYW91aSA8eW91bmVzcyBkb3QgYWxhb3VpIGF0IGNvbGxhYm9yYSBkb3QgY28gZG90IHVrPgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fY2xvY2tfcmF0ZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHJ0cF9zZXNzaW9uX3NldF9jYWxsYmFja3MpLAorCSAgKHJ0cF9zZXNzaW9uX3NldF9wcm9jZXNzX3J0cF9jYWxsYmFjayksCisJICAocnRwX3Nlc3Npb25fc2V0X3NlbmRfcnRwX2NhbGxiYWNrKSwKKwkgIChydHBfc2Vzc2lvbl9zZXRfc2VuZF9ydGNwX2NhbGxiYWNrKSwKKwkgIChydHBfc2Vzc2lvbl9zZXRfc3luY19ydGNwX2NhbGxiYWNrKSwKKwkgIChydHBfc2Vzc2lvbl9zZXRfY2xvY2tfcmF0ZV9jYWxsYmFjayksCisJICAocnRwX3Nlc3Npb25fc2V0X3JlY29uc2lkZXJfY2FsbGJhY2spLCAoc291cmNlX3B1c2hfcnRwKSwKKwkgIChzb3VyY2VfY2xvY2tfcmF0ZSksIChydHBfc2Vzc2lvbl9wcm9jZXNzX2J5ZSksCisJICAocnRwX3Nlc3Npb25fcHJvY2Vzc19ydGNwKSwgKHJ0cF9zZXNzaW9uX3NlbmRfYnllKSwKKwkgIChydHBfc2Vzc2lvbl9vbl90aW1lb3V0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgTWFrZSBpdCBwb3NzaWJsZSB0byB1c2UgZGlmZmVyZW50IHVzZXJfZGF0YSBmb3IgZWFjaCBvZiB0aGUgY2FsbGJhY2tzLgorCSAgRml4ZXMgIzUwODU4Ny4KKworMjAwOC0wMS0xMCAyMDo1NzoxNyArMDAwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IEZpeCBkb2N1bWVudGF0aW9uIGZvciBsYXRlc3QgcGF0Y2gKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIEZpeCBkb2N1bWVudGF0aW9uIGZvciBsYXRlc3QgcGF0Y2gKKworMjAwOC0wMS0xMCAxNDozNDozMCArMDAwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IEFsbG93IHJlcXVlc3RfbmV3X3BhZCB3aXRoIG5hbWUgTlVMTCAoYnVnICM1MDg1MTUpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBBbGxvdyByZXF1ZXN0X25ld19wYWQgd2l0aCBuYW1lIE5VTEwgKGJ1ZyAjNTA4NTE1KQorCisyMDA4LTAxLTA5IDE0OjM5OjQ0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IERvbid0IHNldCBmaXhlZCBjYXBzLCB3ZSBjYW4gYmFzaWNhbGx5IGRvIGV2ZXJ5dGhpbmcgdGhlIHVwc3RlYW0gcGVlciBwYWQgY2FuIHJlbmVnb3QuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChjcmVhdGVfc2VuZF9ydHBfc2luayk6CisJICBEb24ndCBzZXQgZml4ZWQgY2Fwcywgd2UgY2FuIGJhc2ljYWxseSBkbyBldmVyeXRoaW5nIHRoZSB1cHN0ZWFtIHBlZXIKKwkgIHBhZCBjYW4gcmVuZWdvdGlhdGUgdG8uIEZpeGVzICM1MDc5NDAuCisKKzIwMDgtMDEtMDQgMTg6NDc6NTcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOiBEb24ndCB1bnJlZiB0aGUgcG9wcGVkIGJ1ZmZlciB3aGVuIHdlIGRvbid0IGhhdmUgb3duZXJzaGlwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKToKKwkgIERvbid0IHVucmVmIHRoZSBwb3BwZWQgYnVmZmVyIHdoZW4gd2UgZG9uJ3QgaGF2ZSBvd25lcnNoaXAuCisJICBGaXhlcyAjNTA3MDIwLgorCisyMDA3LTEyLTMxIDEzOjEyOjA2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzogRG9uJ3QgY2xlYW4gdXAgcGFkcyB3aGVuIGdvaW5nIHRvIFBBVVNFRC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIChnc3RfcnRwX3NzcmNfZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgIERvbid0IGNsZWFuIHVwIHBhZHMgd2hlbiBnb2luZyB0byBQQVVTRUQuCisKKzIwMDctMTItMTIgMTY6NTk6MDMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyLzogQ2xlYW4gdXAgdGhlIGR5bmFtaWMgcGFkcyB3aGVuIGdvaW5nIHRvIFJFQURZLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzogKGdzdF9ydHBfcHRfZGVtdXhfZmluYWxpemUpLAorCSAgKGdzdF9ydHBfcHRfZGVtdXhfc2V0dXApLCAoZ3N0X3J0cF9wdF9kZW11eF9yZWxlYXNlKSwKKwkgIChnc3RfcnRwX3B0X2RlbXV4X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOiAoZ3N0X3J0cF9zc3JjX2RlbXV4X3Jlc2V0KSwKKwkgIChnc3RfcnRwX3NzcmNfZGVtdXhfZGlzcG9zZSksIChnc3RfcnRwX3NzcmNfZGVtdXhfc3JjX3F1ZXJ5KSwKKwkgIChnc3RfcnRwX3NzcmNfZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgIENsZWFuIHVwIHRoZSBkeW5hbWljIHBhZHMgd2hlbiBnb2luZyB0byBSRUFEWS4KKworMjAwNy0xMi0xMiAxMjoxMTo1MyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvOiBGaXggc29tZSBsZWFrcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGdzdF9ydHBfYmluX2ZpbmFsaXplKSwKKwkgIChnc3RfcnRwX2Jpbl9zZXRfc2Rlc19zdHJpbmcpLCAoZ3N0X3J0cF9iaW5fZ2V0X3NkZXNfc3RyaW5nKSwKKwkgIChnc3RfcnRwX2Jpbl9oYW5kbGVfbWVzc2FnZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHJ0cF9zZXNzaW9uX2ZpbmFsaXplKSwKKwkgIChydHBfc2Vzc2lvbl9zZW5kX2J5ZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiAocnRwX3NvdXJjZV9maW5hbGl6ZSk6CisJICBGaXggc29tZSBsZWFrcy4KKworMjAwNy0xMi0xMCAxODozNjowNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvOiBQb3N0IGEgbWVzc2FnZSB3aGVuIHRoZSBTREVTIGluZm9yIGNoYW5nZXMgZm9yIGEgc291cmNlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoZ3N0X3J0cF9iaW5fY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9iaW5faGFuZGxlX21lc3NhZ2UpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChzb3VyY2VfZ2V0X3NkZXNfc3RydWN0dXJlKSwKKwkgIChvbl9zc3JjX3NkZXMpOgorCSAgUG9zdCBhIG1lc3NhZ2Ugd2hlbiB0aGUgU0RFUyBpbmZvciBjaGFuZ2VzIGZvciBhIHNvdXJjZS4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIFVwZGF0ZSBzb21lIGNvbW1lbnRzLgorCisyMDA3LTEyLTEwIDE1OjM0OjE5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci86IEFkZCBzaWduYWwgdG8gbm90aWZ5IG9mIGFuIFNERVMgY2hhbmdlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAob25fc3NyY19zZGVzKSwgKGNyZWF0ZV9zZXNzaW9uKSwKKwkgIChnc3RfcnRwX2Jpbl9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGNsaWVudC5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBjbGllbnQuaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG1hbmFnZXIuYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4Lmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogKG9uX3NzcmNfc2RlcyksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9zZXNzaW9uX2luaXQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChydHBfc2Vzc2lvbl9jbGFzc19pbml0KSwKKwkgIChvbl9zc3JjX3NkZXMpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19zZGVzKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmg6CisJICBBZGQgc2lnbmFsIHRvIG5vdGlmeSBvZiBhbiBTREVTIGNoYW5nZS4KKwkgIEZpeCBvYmplY3QgdHlwZSBpbiB0aGUgc2lnbmFsIGNhbGxiYWNrcy4KKworMjAwNy0xMi0xMCAxNDowMzozMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLio6IEV4cG9zZSBTREVTIGl0ZW1zIGFzIHByb3BlcnRpZXMgYW5kIGNvbmZpZ3VyZSB0aGUgc2Vzc2lvbiBtYW5hZ2VycyB3aXRoIHRoZW0uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChjcmVhdGVfc2Vzc2lvbiksCisJICAoZ3N0X3J0cF9iaW5fY2xhc3NfaW5pdCksIChnc3RfcnRwX2Jpbl9pbml0KSwgKHNkZXNfdHlwZV90b19uYW1lKSwKKwkgIChnc3RfcnRwX2Jpbl9zZXRfc2Rlc19zdHJpbmcpLCAoZ3N0X3J0cF9iaW5fZ2V0X3NkZXNfc3RyaW5nKSwKKwkgIChnc3RfcnRwX2Jpbl9zZXRfcHJvcGVydHkpLCAoZ3N0X3J0cF9iaW5fZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICBFeHBvc2UgU0RFUyBpdGVtcyBhcyBwcm9wZXJ0aWVzIGFuZCBjb25maWd1cmUgdGhlIHNlc3Npb24gbWFuYWdlcnMgd2l0aAorCSAgdGhlbS4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IChydHBfc291cmNlX2NsYXNzX2luaXQpLAorCSAgKHJ0cF9zb3VyY2Vfc2V0X3Byb3BlcnR5KToKKwkgIEZpeCBTU1JDIHByb3BlcnR5LgorCisyMDA3LTEyLTEwIDExOjA4OjExICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci86IFVwZGF0ZSBjb21tZW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoY3JlYXRlX3Nlc3Npb24pOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIFVwZGF0ZSBjb21tZW50LgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX3NldF9wcm9wZXJ0eSksIChnc3RfcnRwX3Nlc3Npb25fZ2V0X3Byb3BlcnR5KToKKwkgIERlZmluZSBzb21lIEdPYmplY3QgcHJvcGVydGllcyB0byBzZXQgU0RFUyBhbmQgb3RoZXIgY29uZmlndXJhdGlvbi4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAocnRwX3Nlc3Npb25fY2xhc3NfaW5pdCksCisJICAocnRwX3Nlc3Npb25faW5pdCksIChydHBfc2Vzc2lvbl9maW5hbGl6ZSksCisJICAocnRwX3Nlc3Npb25fc2V0X3Byb3BlcnR5KSwgKHJ0cF9zZXNzaW9uX2dldF9wcm9wZXJ0eSksCisJICAob25fc3NyY19zZGVzKSwgKHJ0cF9zZXNzaW9uX3NldF9iYW5kd2lkdGgpLAorCSAgKHJ0cF9zZXNzaW9uX2dldF9iYW5kd2lkdGgpLCAocnRwX3Nlc3Npb25fc2V0X3J0Y3BfZnJhY3Rpb24pLAorCSAgKHJ0cF9zZXNzaW9uX2dldF9ydGNwX2ZyYWN0aW9uKSwgKHJ0cF9zZXNzaW9uX3NldF9zZGVzX3N0cmluZyksCisJICAocnRwX3Nlc3Npb25fZ2V0X3NkZXNfc3RyaW5nKSwgKG9idGFpbl9zb3VyY2UpLAorCSAgKHJ0cF9zZXNzaW9uX2dldF9pbnRlcm5hbF9zb3VyY2UpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19zZGVzKSwKKwkgIChydHBfc2Vzc2lvbl9zZW5kX3J0cCksIChydHBfc2Vzc2lvbl9uZXh0X3RpbWVvdXQpLCAoc2Vzc2lvbl9zZGVzKSwKKwkgIChpc19ydGNwX3RpbWUpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBBZGQgc2lnbmFsIHdoZW4gbmV3IFNERVMgaW5mb3IgaGFzIGJlZW4gZm91bmQgZm9yIGEgc291cmNlLgorCSAgQ3JlYXRlIHByb3BlcnRpZXMgZm9yIFNERVMgYW5kIG90aGVyIGluZm8uCisJICBTaW1wbGlmeSB0aGUgU0RFUyBBUEkuCisJICBBZGQgbWV0aG9kIGZvciBnZXR0aW5nIHRoZSBpbnRlcm5hbCBzb3VyY2Ugb2JqZWN0IG9mIHRoZSBzZXNzaW9uLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzogKHJ0cF9zb3VyY2VfY2xhc3NfaW5pdCksCisJICAocnRwX3NvdXJjZV9maW5hbGl6ZSksIChydHBfc291cmNlX3NldF9wcm9wZXJ0eSksCisJICAocnRwX3NvdXJjZV9nZXRfcHJvcGVydHkpLCAocnRwX3NvdXJjZV9zZXRfY2FsbGJhY2tzKSwKKwkgIChydHBfc291cmNlX2dldF9zc3JjKSwgKHJ0cF9zb3VyY2Vfc2V0X2FzX2NzcmMpLAorCSAgKHJ0cF9zb3VyY2VfaXNfYXNfY3NyYyksIChydHBfc291cmNlX2lzX2FjdGl2ZSksCisJICAocnRwX3NvdXJjZV9pc192YWxpZGF0ZWQpLCAocnRwX3NvdXJjZV9pc19zZW5kZXIpLAorCSAgKHJ0cF9zb3VyY2VfcmVjZWl2ZWRfYnllKSwgKHJ0cF9zb3VyY2VfZ2V0X2J5ZV9yZWFzb24pLAorCSAgKHJ0cF9zb3VyY2Vfc2V0X3NkZXMpLCAocnRwX3NvdXJjZV9zZXRfc2Rlc19zdHJpbmcpLAorCSAgKHJ0cF9zb3VyY2VfZ2V0X3NkZXMpLCAocnRwX3NvdXJjZV9nZXRfc2Rlc19zdHJpbmcpLAorCSAgKHJ0cF9zb3VyY2VfZ2V0X25ld19zciksIChydHBfc291cmNlX2dldF9uZXdfcmIpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIEFkZCBHT2JqZWN0IHByb3BlcnRpZXMgZm9yIHZhcmlvdXMgdGhpbmdzLgorCSAgRG9uJ3QgbGVhayB0aGUgYnllIHJlYXNvbi4KKworMjAwNy0xMS0yMiAwOTowODoyNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6IGppdHRlcmJ1ZmZlciBjYW4gYnVmZmVyIGFuIHVubGltaXRlZCBhbW91bnQgb2YgdGltZSBhbmQgdGh1cyBoYXMgbm8gbWF4X2xhdGVuY3kgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3F1ZXJ5KToKKwkgIGppdHRlcmJ1ZmZlciBjYW4gYnVmZmVyIGFuIHVubGltaXRlZCBhbW91bnQgb2YgdGltZSBhbmQgdGh1cyBoYXMgbm8KKwkgIG1heF9sYXRlbmN5IHJlcXVpcmVtZW50cy4KKworMjAwNy0xMS0wMiAyMTo0NTozOCArMDAwMCAgT2xlIEFuZHLDqSBWYWRsYSBSYXZuw6VzIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiBGaXggYmFkIGZ1bmN0aW9uIHNpZ25hdHVyZXMgKCM0OTI3OTgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xlIEFuZHLDqSBWYWRsYSBSYXZuw6VzICA8b2xlLmFuZHJlLnJhdm5hc0B0YW5kYmVyZy5jb20+CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIEZpeCBiYWQgZnVuY3Rpb24gc2lnbmF0dXJlcyAoIzQ5Mjc5OCkuCisKKzIwMDctMTAtMDkgMTA6MDE6MzkgKzAwMDAgIExhdXJlbnQgR2xheWFsIDxzcGdsZWdsZUB5YWhvby5mcj4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IEZpeCBtZW1sZWFrLiBGaXhlcyAjNDg0OTkwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTGF1cmVudCBHbGF5YWwgPHNwZ2xlZ2xlIGF0IHlhaG9vIGRvdCBmcj4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChjcmVhdGVfc3RyZWFtKSwKKwkgIChnc3RfcnRwX2Jpbl9jbGFzc19pbml0KToKKwkgIEZpeCBtZW1sZWFrLiBGaXhlcyAjNDg0OTkwLgorCisyMDA3LTEwLTA4IDE3OjQ2OjQ1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0LzogRml4IGNvbXBpbGVyIHdhcm5pbmdzIHNob3duIGJ5IEZvcnRlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9saWJyZmIvcmZiYnVmZmVyLmM6IChyZmJfYnVmZmVyX25ld19hbmRfYWxsb2MpOgorCSAgKiBnc3QvbGlicmZiL3JmYmJ1ZmZlci5oOgorCSAgKiBnc3QvbGlicmZiL3JmYmRlY29kZXIuYzogKHJmYl9zb2NrZXRfZ2V0X2J1ZmZlcik6CisJICAqIGdzdC9tcGVndmlkZW9wYXJzZS9tcGVndmlkZW9wYXJzZS5jOiAoZ3N0X21wZWd2aWRlb3BhcnNlX2NoYWluKToKKwkgICogZ3N0L25zZi9uZXM2NTAyLmM6IChuZXM2NTAyX2V4ZWN1dGUpOgorCSAgKiBnc3QvcmVhbC9nc3RyZWFsYXVkaW9kZWMuYzogKGdzdF9yZWFsX2F1ZGlvX2RlY19zZXRjYXBzKToKKwkgICogZ3N0L3JlYWwvZ3N0cmVhbHZpZGVvZGVjLmM6IChvcGVuX2xpYnJhcnkpOgorCSAgKiBnc3QvcmVhbC9nc3RyZWFsdmlkZW9kZWMuaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoY3JlYXRlX3JlY3ZfcnRwX3NpbmspLAorCSAgKGNyZWF0ZV9yZWN2X3J0Y3Bfc2luayksIChjcmVhdGVfc2VuZF9ydHBfc2luayk6CisJICBGaXggY29tcGlsZXIgd2FybmluZ3Mgc2hvd24gYnkgRm9ydGUuCisKKzIwMDctMTAtMDggMTA6Mzk6MzUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiBGaXggY2FwcyByZWZjb3VudGluZyBmb3IgcGF5bG9hZCBtYXBzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoZ2V0X3B0X21hcCksCisJICAoZ3N0X3J0cF9iaW5fY2xlYXJfcHRfbWFwKSwgKGdzdF9ydHBfYmluX2NsYXNzX2luaXQpOgorCSAgRml4IGNhcHMgcmVmY291bnRpbmcgZm9yIHBheWxvYWQgbWFwcy4KKwkgIFdoZW4gY2xlYXJpbmcgcGF5bG9hZCBtYXBzLCBhbHNvIGNsZWFyIHNlc3Npb25zIGFuZCBzdHJlYW1zIHBheWxvYWQKKwkgIG1hcHMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzogKGdzdF9ydHBfcHRfZGVtdXhfZ2V0X2NhcHMpLAorCSAgKGdzdF9ydHBfcHRfZGVtdXhfY2xlYXJfcHRfbWFwKSwgKGdzdF9ydHBfcHRfZGVtdXhfY2hhaW4pLAorCSAgKGZpbmRfcGFkX2Zvcl9wdCk6CisJICBJbXBsZW1lbnQgY2xlYXJpbmcgdGhlIHBheWxvYWQgbWFwLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRwX3NpbmspOgorCSAgRm9yd2FyZCBmbHVzaCBldmVudHMgaW5zdGVhZCBvZiBsZWFraW5nIHRoZW0uCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgKGdzdF9ydHBfc3NyY19kZW11eF9ydGNwX3NpbmtfZXZlbnQpOgorCSAgQ29ycmVjdGx5IHJlZmNvdW50IGV2ZW50cyBiZWZvcmUgcHVzaGluZyB0aGVtLgorCisyMDA3LTEwLTA1IDE3OjI2OjE0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IFdoZW4gcmVjb25zaWRlcmluZyBSVENQIHRpbWVvdXRzLCBzZXQgdGhlIG5leHQgdGltZW91dCBhZ2FpbnN0IHRoZSBsYXN0IHJlcG9ydCB0aW1lIGluc3QuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChydHBfc2Vzc2lvbl9uZXh0X3RpbWVvdXQpLAorCSAgV2hlbiByZWNvbnNpZGVyaW5nIFJUQ1AgdGltZW91dHMsIHNldCB0aGUgbmV4dCB0aW1lb3V0IGFnYWluc3QgdGhlIGxhc3QKKwkgIHJlcG9ydCB0aW1lIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgY2xvY2sgdGltZSBzbyB0aGF0IHdlIGRvbid0IGVuZCB1cAorCSAgcmVjb25zaWRlcmluZyBmb3JldmVyLgorCisyMDA3LTEwLTA1IDEyOjA3OjM3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogT25seSBwZWVrIGF0IHRoZSB0YWlsIGVsZW1lbnQgaW5zdGVhZCBvZiBwb3BwaW5nIGl0IG9mZiwgd2hpY2ggYWxsb3dzIHVzIHRvIGdyZWEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3ApOgorCSAgT25seSBwZWVrIGF0IHRoZSB0YWlsIGVsZW1lbnQgaW5zdGVhZCBvZiBwb3BwaW5nIGl0IG9mZiwgd2hpY2ggYWxsb3dzCisJICB1cyB0byBncmVhdGx5IHNpbXBsaWZ5IHRoaW5ncyB3aGVuIHRoZSB0YWlsIGVsZW1lbnQgY2hhbmdlcy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgKGdzdF9ydHBfc2Vzc2lvbl9ldmVudF9yZWN2X3J0cF9zaW5rKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICAoZ3N0X3J0cF9zc3JjX2RlbXV4X3NpbmtfZXZlbnQpOgorCSAgRm9yd2FyZCBGTFVTSCBldmVudHMgaW5zdGVhZCBvZiBsZWFraW5nIHRoZW0uCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOiAocnRwX2ppdHRlcl9idWZmZXJfcmVzZXRfc2tldyksCisJICAoY2FsY3VsYXRlX3NrZXcpLCAocnRwX2ppdHRlcl9idWZmZXJfaW5zZXJ0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBSZW1vdmUgdGhlIHRhaWwtY2hhbmdlZCBjYWxsYmFjayBpbiBmYXZvdXIgb2YgYSBzaW1wbGUgYm9vbGVhbiB3aGVuIHdlCisJICBpbnNlcnQgYSBidWZmZXIgaW4gdGhlIHF1ZXVlLgorCSAgQWRkIG1ldGhvZCB0byBwZWVrIHRoZSB0YWlsIG9mIHRoZSBidWZmZXIuCisKKzIwMDctMTAtMDIgMTA6Mjc6NDUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOiBSZW1vdmUgc29tZSBvbGQgdW51c2VkIHZhcmlhYmxlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZmx1c2hfc3RhcnQpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9mbHVzaF9zdG9wKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhbmdlX3N0YXRlKSwgKGFwcGx5X29mZnNldCksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3ApOgorCSAgUmVtb3ZlIHNvbWUgb2xkIHVudXNlZCB2YXJpYWJsZXMuCisJICBEb24ndCBhZGQgdGhlIGxhdGVuY3kgdG8gdGhlIHNrZXcgY29ycmVjdGVkIHRpbWVzdGFtcCwgbGF0ZW5jeSBpcyBvbmx5CisJICB1c2VkIHRvIHN5bmMgYWdhaW5zdCB0aGUgY2xvY2suCisJICBJbXByb3ZlIGRlYnVnZ2luZy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IChydHBfaml0dGVyX2J1ZmZlcl9pbml0KSwKKwkgIChydHBfaml0dGVyX2J1ZmZlcl9yZXNldF9za2V3KSwgKGNhbGN1bGF0ZV9za2V3KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBIYW5kbGUgY2FzZSB3aGVyZSBzZXJ2ZXIgdGltZXN0YW1wIGdvZXMgYmFja3dhcmRzIG9yIHdpbGRseSBqdW1wcyBieQorCSAgdGVtcG9yYXJpbHkgcGF1c2luZyB0aGUgc2tldyBjb3JyZWN0aW9uLgorCSAgSW1wcm92ZSBkZWJ1Z2dpbmcuCisKKzIwMDctMDktMjggMTQ6NTE6NTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiBGaXggY3Jhc2hlciBpbiBkaXNwb3NlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoZnJlZV9jbGllbnQpOgorCSAgRml4IGNyYXNoZXIgaW4gZGlzcG9zZS4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IChjYWxjdWxhdGVfc2tldyk6CisJICBIYW5kbGUgY2FzZXMgd2hlcmUgaW5wdXQgYnVmZmVycyBoYXZlIG5vIHRpbWVzdGFtcHMgc28gdGhhdCBubyBjbG9jaworCSAgc2tldyBjYW4gYmUgY2FsY3VsYXRlZCwgaW4gdGhpcyBjYXNlIGludGVycG9sbGF0ZSB0aW1lc3RhbXBzIGJhc2VkIG9uCisJICBydHAgdGltZXN0YW1wIGFuZCBhc3N1bWUgYSAwIGNsb2NrIHNrZXcuCisKKzIwMDctMDktMjggMTE6MTc6MzUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOiBSZW1vdmUgaml0dGVyIGNvcnJlY3Rpb24gY29kZSwgaXQncyBub3cgaW4gdGhlIGxvd2VyIGxldmVsIG9iamVjdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogKGFwcGx5X2xhdGVuY3kpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9xdWVyeSk6CisJICBSZW1vdmUgaml0dGVyIGNvcnJlY3Rpb24gY29kZSwgaXQncyBub3cgaW4gdGhlIGxvd2VyIGxldmVsIG9iamVjdC4KKwkgIFVzZSBuZXcgLWNvcmUgbWV0aG9kIGZvciBkb2luZyBhIHBlZXIgcXVlcnkuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOiAocnRwX2ppdHRlcl9idWZmZXJfaW5pdCksCisJICAoY2FsY3VsYXRlX3NrZXcpLCAocnRwX2ppdHRlcl9idWZmZXJfaW5zZXJ0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBNb3ZlIGppdHRlciBjb3JyZWN0aW9uIHRvIHRoZSBsb3dsZXZlbCBqaXR0ZXJidWZmZXIuCisJICBJbmNyZWFzZSB0aGUgbWF4IHdpbmRvdyBzaXplLgorCSAgV2hlbiBmaWxsaW5nIHRoZSB3aW5kb3csIGFscmVhZHkgc3RhcnQgZXN0aW1hdGluZyB0aGUgc2tldyB1c2luZyBhCisJICBwYXJhYm9saWMgd2VpZ2h0aW5nIGZhY3RvciBzbyB0aGF0IHdlIGhhdmUgYSBtdWNoIGJldHRlciBzdGFydHVwCisJICBiZWhhdmlvdXIgdGhhdCBnZXRzIG1vcmUgYWNjdXJhdGUgd2l0aCB0aGUgbW9yZSBzYW1wbGVzIHdlIGhhdmUuCisJICBJbmNyZWFzZSB0aGUgZGVmYXVsdCB3ZWlnaHRpbmcgZmFjdG9yIGZvciB0aGUgc3RlYWR5IHN0YXRlIHRvIGdldAorCSAgc21vb3RoZXIgdGltZXN0YW1wcy4KKworMjAwNy0wOS0yNiAyMDowODoyOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IEZpeCBjbGVhbnVwIGNyYXNoZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChnc3RfcnRwX2Jpbl9kaXNwb3NlKSwKKwkgIChnc3RfcnRwX2Jpbl9maW5hbGl6ZSk6CisJICBGaXggY2xlYW51cCBjcmFzaGVyLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzogKHJ0cF9qaXR0ZXJfYnVmZmVyX2luaXQpLAorCSAgKGNhbGN1bGF0ZV9za2V3KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBEeW5hbWljYWxseSBhZGp1c3QgdGhlIHNrZXcgY2FsY3VsYXRpb24gd2luZG93IHNvIHRoYXQgd2UgY2FsY3VsYXRlIGl0CisJICBvdmVyIGEgcGVyaW9kIG9mIGFyb3VuZCAyIHNlY29uZHMuCisKKzIwMDctMDktMjAgMTQ6MzQ6NTcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyLzogQWRkIG5vdGlmaWNhdGlvbiBvZiBhY3RpdmUgU1NSQ3MgdG8gdmFyaW91cyBSVFAgZWxlbWVudHMuIEZpeGVzICM0Nzg1NjYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChvbl9zc3JjX2FjdGl2ZSksIChjcmVhdGVfc2Vzc2lvbiksCisJICAoZ3N0X3J0cF9iaW5fY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChvbl9zc3JjX2FjdGl2ZSksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9zZXNzaW9uX2luaXQpLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9ldmVudF9zZW5kX3J0cF9zaW5rKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChydHBfc2Vzc2lvbl9jbGFzc19pbml0KSwKKwkgIChvbl9zc3JjX2FjdGl2ZSksIChydHBfc2Vzc2lvbl9wcm9jZXNzX3JiKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgQWRkIG5vdGlmaWNhdGlvbiBvZiBhY3RpdmUgU1NSQ3MgdG8gdmFyaW91cyBSVFAgZWxlbWVudHMuIEZpeGVzICM0Nzg1NjYuCisKKzIwMDctMDktMTcgMDI6MDE6NDEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiBMaW5rIHRvIHRoZSByaWdodCBwYWRzIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggb25lIHdhcyBjcmVhdGVkIGZpcnN0IGluIHRoZSBzc3JjIGRlbXV4ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChuZXdfc3NyY19wYWRfZm91bmQpOgorCSAgTGluayB0byB0aGUgcmlnaHQgcGFkcyByZWdhcmRsZXNzIG9mIHdoaWNoIG9uZSB3YXMgY3JlYXRlZCBmaXJzdCBpbiB0aGUKKwkgIHNzcmMgZGVtdXhlci4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYWluKSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoZ3N0X3J0cF9zZXNzaW9uX3Byb2Nlc3NfcnRwKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fY2hhaW5fcmVjdl9ydHApLCAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3NlbmRfcnRwKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IChjYWxjdWxhdGVfaml0dGVyKToKKwkgIEltcHJvdmUgZGVidWdnaW5nLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzogKGNyZWF0ZV9kZW11eF9wYWRfZm9yX3NzcmMpLAorCSAgKGdzdF9ydHBfc3NyY19kZW11eF9pbml0KSwgKGdzdF9ydHBfc3NyY19kZW11eF9maW5hbGl6ZSksCisJICAoZ3N0X3J0cF9zc3JjX2RlbXV4X3NpbmtfZXZlbnQpLAorCSAgKGdzdF9ydHBfc3NyY19kZW11eF9ydGNwX3NpbmtfZXZlbnQpLCAoZ3N0X3J0cF9zc3JjX2RlbXV4X2NoYWluKSwKKwkgIChnc3RfcnRwX3NzcmNfZGVtdXhfcnRjcF9jaGFpbiksCisJICAoZ3N0X3J0cF9zc3JjX2RlbXV4X2ludGVybmFsX2xpbmtzKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4Lmg6CisJICBGaXggcmFjZSBpbiBjcmVhdGluZyB0aGUgUlRQIGFuZCBSVENQIHBhZHMgd2hlbiBhIG5ldyBTU1JDIGlzIGRldGVjdGVkLgorCisyMDA3LTA5LTE2IDE5OjQwOjMxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogVXNlIGxvY2sgdG8gcHJvdGVjdCB2YXJpYWJsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGdzdF9ydHBfYmluX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9iaW5fZ2V0X3Byb3BlcnR5KToKKwkgIFVzZSBsb2NrIHRvIHByb3RlY3QgdmFyaWFibGUuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jbGFzc19pbml0KSwKKwkgIChnc3Rfaml0dGVyX2J1ZmZlcl9zaW5rX3BhcnNlX2NhcHMpLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYWluKSwKKwkgIChjb252ZXJ0X3J0cHRpbWVfdG9fZ3N0dGltZSksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfbG9vcCk6CisJICBSZWNvbnN0cnVjdCBHU1QgdGltZXN0YW1wIGZyb20gUlRQIHRpbWVzdGFtcHMgYmFzZWQgb24gbWVhc3VyZWQgY2xvY2sKKwkgIHNrZXcgYW5kIHN5bmMgb2Zmc2V0LgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzogKHJ0cF9qaXR0ZXJfYnVmZmVyX2luaXQpLAorCSAgKHJ0cF9qaXR0ZXJfYnVmZmVyX3NldF90YWlsX2NoYW5nZWQpLAorCSAgKHJ0cF9qaXR0ZXJfYnVmZmVyX3NldF9jbG9ja19yYXRlKSwKKwkgIChydHBfaml0dGVyX2J1ZmZlcl9nZXRfY2xvY2tfcmF0ZSksIChjYWxjdWxhdGVfc2tldyksCisJICAocnRwX2ppdHRlcl9idWZmZXJfaW5zZXJ0KSwgKHJ0cF9qaXR0ZXJfYnVmZmVyX3BlZWspOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaDoKKwkgIE1lYXN1cmUgY2xvY2sgc2tldy4KKwkgIEFkZCBjYWxsYmFjayB0byBiZSBub3RmaWVkIHdoZW4gYSBuZXcgcGFja2V0IHdhcyBpbnNlcnRlZCBhdCB0aGUgdGFpbC4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IChydHBfc291cmNlX2luaXQpLAorCSAgKGNhbGN1bGF0ZV9qaXR0ZXIpLCAocnRwX3NvdXJjZV9zZW5kX3J0cCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oOgorCSAgUmVtb3ZlIGNsb2NrIHNrZXcgZGV0ZWN0aW9uLCBpdCdzIG1vdmUgdG8gdGhlIGppdHRlcmJ1ZmZlciBub3cuCisKKzIwMDctMDktMTUgMTg6NDg6MDMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiBBbHNvIHNldCBOVFAgYmFzZSB0aW1lIG9uIG5ldyBzZXNzaW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGNyZWF0ZV9zZXNzaW9uKToKKwkgIEFsc28gc2V0IE5UUCBiYXNlIHRpbWUgb24gbmV3IHNlc3Npb25zLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfbG9vcCksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfcXVlcnkpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9nZXRfcHJvcGVydHkpOgorCSAgVXNlIHRoZSByaWdodCBsb2NrIHRvIHByb3RlY3Qgb3VyIHZhcmlhYmxlcy4KKwkgIEZpeCBzb21lIGNvbW1lbnQuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIChnc3RfcnRwX3Nlc3Npb25fZ2V0Y2Fwc19zZW5kX3J0cCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3NlbmRfcnRwKSwgKGNyZWF0ZV9zZW5kX3J0cF9zaW5rKToKKwkgIEltcGxlbWVudCBnZXRjYXBzIG9uIHRoZSBzZW5kZXIgc2lua3BhZCBzbyB0aGF0IHBheWxvYWRlcnMgY2FuIG5lZ290aWF0ZQorCSAgdGhlIHJpZ2h0IFNTUkMuCisKKzIwMDctMDktMTIgMjE6MjM6NDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyLzogVmFyaW91cyBsZWFrIGZpeGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoY3JlYXRlX3Nlc3Npb24pLCAoZnJlZV9zZXNzaW9uKSwKKwkgIChnZXRfY2xpZW50KSwgKGZyZWVfY2xpZW50KSwgKGdzdF9ydHBfYmluX2Fzc29jaWF0ZSksCisJICAoZnJlZV9zdHJlYW0pLCAoZ3N0X3J0cF9iaW5fY2xhc3NfaW5pdCksIChnc3RfcnRwX2Jpbl9kaXNwb3NlKSwKKwkgIChnc3RfcnRwX2Jpbl9maW5hbGl6ZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZmluYWxpemUpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6IChnc3RfcnRwX3B0X2RlbXV4X3JlbGVhc2UpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fZmluYWxpemUpLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9zZXRfcHJvcGVydHkpLCAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3JlY3ZfcnRwKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fY2hhaW5fc2VuZF9ydHApOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIChnc3RfcnRwX3NzcmNfZGVtdXhfY2xhc3NfaW5pdCksIChnc3RfcnRwX3NzcmNfZGVtdXhfZGlzcG9zZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHJ0cF9zZXNzaW9uX2ZpbmFsaXplKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgVmFyaW91cyBsZWFrIGZpeGVzLgorCisyMDA3LTA5LTEyIDE4OjA0OjMyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogQ2FsY3VsYXRlIGFuZCBjb25maWd1cmUgdGhlIE5UUCBiYXNlIHRpbWUgc28gdGhhdCB3ZSBjYW4gZ2VuZXJhdGUgYmV0dGVyCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChjYWxjX250cF9uc19iYXNlKSwKKwkgIChnc3RfcnRwX2Jpbl9jaGFuZ2Vfc3RhdGUpLCAobmV3X3BheWxvYWRfZm91bmQpLCAoY3JlYXRlX3NlbmRfcnRwKToKKwkgIENhbGN1bGF0ZSBhbmQgY29uZmlndXJlIHRoZSBOVFAgYmFzZSB0aW1lIHNvIHRoYXQgd2UgY2FuIGdlbmVyYXRlIGJldHRlcgorCSAgTlRQIHRpbWVzIGluIFNSIHBhY2tldHMuCisJICBTZXQgY2FwcyBvbiBuZXcgZ2hvc3RwYWQuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKToKKwkgIENsZWFuIGRlYnVnIHN0YXRlbWVudC4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoZ3N0X3J0cF9zZXNzaW9uX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9pbml0KSwgKGdzdF9ydHBfc2Vzc2lvbl9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9nZXRfcHJvcGVydHkpLCAoZ2V0X2N1cnJlbnRfbnRwX25zX3RpbWUpLAorCSAgKHJ0Y3BfdGhyZWFkKSwgKGdzdF9ydHBfc2Vzc2lvbl9ldmVudF9yZWN2X3J0cF9zaW5rKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25faW50ZXJuYWxfbGlua3MpLCAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3JlY3ZfcnRwKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fZXZlbnRfc2VuZF9ydHBfc2luayksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3NlbmRfcnRwKSwgKGNyZWF0ZV9yZWN2X3J0cF9zaW5rKSwKKwkgIChjcmVhdGVfc2VuZF9ydHBfc2luayk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uaDoKKwkgIEFkZCBudHAtbnMtYmFzZSBwcm9wZXJ0eSB0byBjb252ZXJ0IHJ1bm5pbmdfdGltZSB0byBOVFAgdGltZS4KKwkgIEhhbmRsZSBORVdTRUdNRU5UIGV2ZW50cyBvbiBzZW5kIGFuZCByZWN2IFJUUCBwYWRzIHNvIHRoYXQgd2UgY2FuCisJICBjYWxjdWxhdGUgdGhlIHJ1bm5pbmcgdGltZSBhbmQgdGh1cyBOVFAgdGltZSBvZiB0aGUgcGFja2V0cy4KKwkgIFNpbXBsaWZ5IGdldHRpbmcgdGhlIGN1cnJlbnQgTlRQIHRpbWUgdXNpbmcgdGhlIHBpcGVsaW5lIGNsb2NrLgorCSAgSW1wbGVtZW50IGludGVybmFsIGxpbmtzIGZ1bmN0aW9ucy4KKwkgIFVzZSB0aGUgYnVmZmVyIHRpbWVzdGFtcCB0byBjYWxjdWxhdGUgdGhlIE5UUCB0aW1lIGluc3RlYWQgb2YgdGhlIGNsb2NrLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzogKGNyZWF0ZV9kZW11eF9wYWRfZm9yX3NzcmMpLAorCSAgKGdzdF9ydHBfc3NyY19kZW11eF9pbml0KSwgKGdzdF9ydHBfc3NyY19kZW11eF9zaW5rX2V2ZW50KSwKKwkgIChnc3RfcnRwX3NzcmNfZGVtdXhfY2hhaW4pLCAoZ3N0X3J0cF9zc3JjX2RlbXV4X3J0Y3BfY2hhaW4pLAorCSAgKGdzdF9ydHBfc3NyY19kZW11eF9pbnRlcm5hbF9saW5rcyksCisJICAoZ3N0X3J0cF9zc3JjX2RlbXV4X3NyY19xdWVyeSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5oOgorCSAgSW1wbGVtZW50IGludGVybmFsIGxpbmtzIGZ1bmN0aW9uLgorCSAgQ2FsY3VsYXRlIHRoZSBkaWZmIGJldHdlZW4gZGlmZmVyZW50IHN0cmVhbXMsIHRoaXMgbWlnaHQgYmUgdXNlZCBsYXRlcgorCSAgdG8gZ2V0IHRoZSBpbnRlciBzdHJlYW0gbGF0ZW5jeS4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAocnRwX3Nlc3Npb25fc2VuZF9ydHApOgorCSAgU2ltcGxlIGNsZWFudXAuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiAocnRwX3NvdXJjZV9pbml0KSwKKwkgIChjYWxjdWxhdGVfaml0dGVyKSwgKHJ0cF9zb3VyY2Vfc2VuZF9ydHApLCAocnRwX3NvdXJjZV9nZXRfbmV3X3NyKToKKwkgIE1ha2UgdGhlIGNsb2NrIHNrZXcgd2luZG93IGEgbGl0dGxlIGJpZ2dlci4KKwkgIEFwcGx5IHRoZSBjbG9jayBza2V3IHRvIGFsbCBidWZmZXJzLCBub3QganVzdCBvbmUgd2l0aCBhIG5ldyB0aW1lc3RhbXAuCisJICBDYWxjdWxhdGUgYW5kIGRlYnVnIHNlbmRlciBjbG9jayBkcmlmdC4KKwkgIFVzZSBleHRlbmRlZCBsYXN0IHRpbWVzdGFtcCB0byBpbnRlcnBvbGxhdGUgZm9yIFNSIHJlcG9ydHMuCisKKzIwMDctMDktMDQgMTU6MjM6MzQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogTWFrZSBjb21waWxlciBoYXBweTogZml4IGNvbXBpbGF0aW9uIHdpdGggLVdhbGwgLVdlcnJvciAoIzQ3MzU2MikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgTWFrZSBjb21waWxlciBoYXBweTogZml4IGNvbXBpbGF0aW9uIHdpdGggLVdhbGwgLVdlcnJvcgorCSAgKCM0NzM1NjIpLgorCisyMDA3LTA5LTAzIDIxOjE5OjM0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci86IFVwZGF0ZWQgZXhhbXBsZSBwaXBlbGluZXMgaW4gZG9jcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4tbWFyc2hhbC5saXN0OgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGdzdF9ydHBfYmluX2dldF9jbGllbnQpLAorCSAgKGdzdF9ydHBfYmluX2Fzc29jaWF0ZSksIChnc3RfcnRwX2Jpbl9zeW5jX2NoYWluKSwgKGNyZWF0ZV9zdHJlYW0pLAorCSAgKGdzdF9ydHBfYmluX2luaXQpLCAoY2Fwc19jaGFuZ2VkKSwgKG5ld19zc3JjX3BhZF9mb3VuZCksCisJICAoY3JlYXRlX3JlY3ZfcnRwKSwgKGNyZWF0ZV9yZWN2X3J0Y3ApLCAoY3JlYXRlX3NlbmRfcnRwKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICBVcGRhdGVkIGV4YW1wbGUgcGlwZWxpbmVzIGluIGRvY3MuCisJICBIYW5kbGUgc3luY19ydGNwIGJ1ZmZlcnMgZnJvbSB0aGUgU1NSQyBkZW11eGVyIHRvIHBlcmZvcm0gbGlwLXN5bmMuCisJICBTZXQgdGhlIGRlZmF1bHQgbGF0ZW5jeSBjb3JyZWN0bHkuCisJICBBZGQgc29tZSBtb3JlIHBvaW50cyB3aGVyZSB3ZSBjYW4gZ2V0IGNhcHMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jbGFzc19pbml0KSwKKwkgIChnc3Rfaml0dGVyX2J1ZmZlcl9zaW5rX3BhcnNlX2NhcHMpLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3ApLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9xdWVyeSksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2dldF9wcm9wZXJ0eSk6CisJICBBZGQgdHMtb2Zmc2V0IHByb3BlcnR5IHRvIGNvbnRyb2wgdGltZXN0YW1waW5nLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2luaXQpLCAoZ3N0X3J0cF9zZXNzaW9uX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2dldF9wcm9wZXJ0eSksIChnZXRfY3VycmVudF9udHBfbnNfdGltZSksCisJICAocnRjcF90aHJlYWQpLCAoc3RvcF9ydGNwX3RocmVhZCksIChnc3RfcnRwX3Nlc3Npb25fY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fc2VuZF9ydGNwKSwgKGdzdF9ydHBfc2Vzc2lvbl9zeW5jX3J0Y3ApLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9jYWNoZV9jYXBzKSwgKGdzdF9ydHBfc2Vzc2lvbl9jbG9ja19yYXRlKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fc2lua19zZXRjYXBzKSwgKGdzdF9ydHBfc2Vzc2lvbl9jaGFpbl9yZWN2X3J0cCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRwX3NpbmspLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9jaGFpbl9zZW5kX3J0cCksIChjcmVhdGVfcmVjdl9ydHBfc2luayksCisJICAoY3JlYXRlX3JlY3ZfcnRjcF9zaW5rKSwgKGNyZWF0ZV9zZW5kX3J0cF9zaW5rKSwKKwkgIChjcmVhdGVfc2VuZF9ydGNwX3NyYyk6CisJICBWYXJpb3VzIGNsZWFudXBzLgorCSAgRmVlZCBydHBzZXNzaW9uIG1hbmFnZXIgd2l0aCBOVFAgdGltZSBiYXNlZCBvbiBwaXBlbGluZSBjbG9jayB3aGVuCisJICBoYW5kbGluZyBSVFAgcGFja2V0cyBhbmQgUlRDUCB0aW1lb3V0cy4KKwkgIFBlcmZvcm0gYWxsIFJUQ1Agd2l0aCB0aGUgc3lzdGVtIGNsb2NrLgorCSAgU2V0IGNhcHMgb24gUlRDUCBvdXRnb2luZyBidWZmZXJzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzogKGZpbmRfZGVtdXhfcGFkX2Zvcl9zc3JjKSwKKwkgIChjcmVhdGVfZGVtdXhfcGFkX2Zvcl9zc3JjKSwgKGdzdF9ydHBfc3NyY19kZW11eF9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfc3NyY19kZW11eF9pbml0KSwgKGdzdF9ydHBfc3NyY19kZW11eF9zaW5rX2V2ZW50KSwKKwkgIChnc3RfcnRwX3NzcmNfZGVtdXhfcnRjcF9zaW5rX2V2ZW50KSwgKGdzdF9ydHBfc3NyY19kZW11eF9jaGFpbiksCisJICAoZ3N0X3J0cF9zc3JjX2RlbXV4X3J0Y3BfY2hhaW4pOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguaDoKKwkgIEFsc28gZGVtdXggUlRDUCBtZXNzYWdlcy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAocnRwX3Nlc3Npb25fc2V0X2NhbGxiYWNrcyksCisJICAodXBkYXRlX2Fycml2YWxfc3RhdHMpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19ydHApLAorCSAgKHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcmIpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19zciksCisJICAocnRwX3Nlc3Npb25fcHJvY2Vzc19yciksIChydHBfc2Vzc2lvbl9wcm9jZXNzX3J0Y3ApLAorCSAgKHJ0cF9zZXNzaW9uX3NlbmRfcnRwKSwgKHJ0cF9zZXNzaW9uX3NlbmRfYnllKSwKKwkgIChzZXNzaW9uX3N0YXJ0X3J0Y3ApLCAoc2Vzc2lvbl9yZXBvcnRfYmxvY2tzKSwgKHNlc3Npb25fY2xlYW51cCksCisJICAocnRwX3Nlc3Npb25fb25fdGltZW91dCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIFJlbW92ZSB0aGUgZ2V0X3RpbWUgY2FsbGJhY2ssIHRoZSBHU3RyZWFtZXIgcGFydCB3aWxsIGZlZWQgdXMgd2l0aAorCSAgZW5vdWdoIHRpbWluZyBpbmZvcm1hdGlvbi4KKwkgIFNwbGl0IHN5bmMgdGltaW5nIGFuZCBSVENQIHRpbWluZyBpbmZvcm1hdGlvbi4KKwkgIEZhY3RvciBvdXQgY29tbW9uIFJCIGhhbmRsaW5nIGZvciBTUiBhbmQgUlIuCisJICBTZW5kIG91dCBTUiBSVENQIHBhY2tldHMgZm9yIGxpcC1zeW5jLgorCSAgTW92ZSBTUiBhbmQgUlIgcGFja2V0IGluZm8gZ2VuZXJhdGlvbiB0byB0aGUgc291cmNlLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzogKHJ0cF9zb3VyY2VfaW5pdCksCisJICAocnRwX3NvdXJjZV91cGRhdGVfY2FwcyksIChnZXRfY2xvY2tfcmF0ZSksIChjYWxjdWxhdGVfaml0dGVyKSwKKwkgIChydHBfc291cmNlX3Byb2Nlc3NfcnRwKSwgKHJ0cF9zb3VyY2Vfc2VuZF9ydHApLAorCSAgKHJ0cF9zb3VyY2VfcHJvY2Vzc19zciksIChydHBfc291cmNlX3Byb2Nlc3NfcmIpLAorCSAgKHJ0cF9zb3VyY2VfZ2V0X25ld19zciksIChydHBfc291cmNlX2dldF9uZXdfcmIpLAorCSAgKHJ0cF9zb3VyY2VfZ2V0X2xhc3Rfc3IpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaDoKKwkgIFVzZSBjYXBzIG9uIGluY29tbWluZyBidWZmZXJzIHRvIGdldCB0aW1pbmcgaW5mb3JtYXRpb24gd2hlbiB0aGV5IGFyZQorCSAgdGhlcmUuCisJICBDYWxjdWxhdGUgY2xvY2sgc2NldyBvZiB0aGUgcmVjZWl2ZXIgY29tcGFyZWQgdG8gdGhlIHNlbmRlciBhbmQgYWRqdXN0CisJICB0aGUgcnRwIHRpbWVzdGFtcHMuCisJICBDYWxjdWxhdGUgdGhlIHJvdW5kIHRyaXAgaW4gc291cmNlcy4KKwkgIERvIFNSIGFuZCBSUiBjYWxjdWxhdGlvbnMgaW4gdGhlIHNvdXJjZS4KKworMjAwNy0wOC0zMSAxNToyNjoxNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6IFVzZSBleHRlbmRlZCB0aW1lc3RhbXAgdG8gcmVsZWFzZSBidWZmZXJzIGZyb20gdGhlIGppdHRlcmJ1ZmZlciBzbyB0aGF0IHdlIGNhbiBoLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoX3N0b3ApLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3ApOgorCSAgVXNlIGV4dGVuZGVkIHRpbWVzdGFtcCB0byByZWxlYXNlIGJ1ZmZlcnMgZnJvbSB0aGUgaml0dGVyYnVmZmVyIHNvIHRoYXQKKwkgIHdlIGNhbiBoYW5kbGUgdGhlIHJ0cCB3cmFwYXJvdW5kIGNvcnJlY3RseS4KKworMjAwNy0wOC0yOSAxNjo1NjoyNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6IEltcHJvdmUgQ29tbWVudHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3ApOgorCSAgSW1wcm92ZSBDb21tZW50cy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoc3RvcF9ydGNwX3RocmVhZCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NoYW5nZV9zdGF0ZSksIChnc3RfcnRwX3Nlc3Npb25fcGFyc2VfY2FwcyksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2Nsb2NrX3JhdGUpLCAoZ3N0X3J0cF9zZXNzaW9uX3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRwX3NpbmspLCAoY3JlYXRlX3JlY3ZfcnRwX3NpbmspLAorCSAgKGNyZWF0ZV9zZW5kX3J0cF9zaW5rKToKKwkgIEFsc28gcGFyc2UgdGhlIHNpbmsgY2FwcyBmb3IgY2xvY2stcmF0ZSBpbnN0ZWFkIG9mIG9ubHkgcmVseWluZyBvbiB0aGUKKwkgIHJlc3VsdCBvZiB0aGUgc2lnbmFsLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzogKHJ0cF9zb3VyY2Vfc2VuZF9ydHApOgorCSAgTWFrZSBzdXJlIHdlIGZldGNoIHRoZSBjbG9jayByYXRlIGZvciBwYXlsb2FkcyB3ZSBhcmUgc2VuZGluZyBvdXQgc28KKwkgIHRoYXQgd2UgY2FuIHVzZSBpdCBmb3IgU1IgcmVwb3J0cy4KKworMjAwNy0wOC0yOSAwMToyMjo0MyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi4qOiBEaXN0cmlidXRlIHN5bmNocm9uaXNhdGlvbiBwYXJhbWV0ZXJzIHRvIHRoZSBzZXNzaW9uIG1hbmFnZXIgc28gdGhhdCBpdCBjYW4gZ2VuZXJhdGUgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoc3RvcF9ydGNwX3RocmVhZCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRwX3NpbmspOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmg6CisJICBEaXN0cmlidXRlIHN5bmNocm9uaXNhdGlvbiBwYXJhbWV0ZXJzIHRvIHRoZSBzZXNzaW9uIG1hbmFnZXIgc28gdGhhdCBpdAorCSAgY2FuIGdlbmVyYXRlIGNvcnJlY3QgU1IgcGFja2V0cyBmb3IgbGlwLXN5bmMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHJ0cF9zZXNzaW9uX3NldF9iYXNlX3RpbWUpLAorCSAgKHJ0cF9zZXNzaW9uX3NldF90aW1lc3RhbXBfc3luYyksIChzZXNzaW9uX3N0YXJ0X3J0Y3ApOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBBZGQgbWV0aG9kcyBmb3Igc2V0dGluZyBzeW5jIHBhcmFtZXRlcnMuCisJICBTZXQgY29ycmVjdCBSVFAgdGltZSBpbiBTUiBwYWNrZXRzIHVzaW5nIHRoZSBzeW5jIHBhcmFtcy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IChydHBfc291cmNlX3NlbmRfcnRwKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBSZWNvcmQgbGFzdCBSVFAgPC0+IEdTVCB0aW1lc3RhbXAgc28gdGhhdCB3ZSBjYW4gdXNlIHRoZW0gdG8gY29udmVydCBOVFAKKwkgIHRvIFJUUCB0aW1lc3RhbXBzIGluIFNSIHBhY2tldHMuCisKKzIwMDctMDgtMjggMjA6MzA6MTYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiBBZGQgc29tZSBtb3JlIGFkdmFuY2VkIGV4YW1wbGUgcGlwZWxpbmVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoZ3N0X3J0cF9iaW5fY2xlYXJfcHRfbWFwKToKKwkgIEFkZCBzb21lIG1vcmUgYWR2YW5jZWQgZXhhbXBsZSBwaXBlbGluZXMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogKHJ0Y3BfdGhyZWFkKSwKKwkgIChzdG9wX3J0Y3BfdGhyZWFkKSwgKGdzdF9ydHBfc2Vzc2lvbl9zZW5kX3J0Y3ApOgorCSAgQWRkIHNvbWUgZGVidWcgYW5kIEZJWE1FLgorCSAgUmVsZWFzZSBMT0NLIHdoZW4gcGVyZm9ybWluZyBzZXNzaW9uIGNsZWFudXAuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHNlc3Npb25fcmVwb3J0X2Jsb2Nrcyk6CisJICBBZGQgc29tZSBkZWJ1Zy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IChjYWxjdWxhdGVfaml0dGVyKSwKKwkgIChydHBfc291cmNlX3NlbmRfcnRwKToKKwkgIE1ha2Ugc3VyZSB3ZSBhbHdheXMgc2VuZCBSVFAgcGFja2V0cyB3aXRoIHRoZSBzZXNzaW9uIFNTUkMuCisKKzIwMDctMDgtMjcgMjE6MTc6MjEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOiBXaGVuIHN5bmNocm9uaXppbmcgYnVmZmVycywgdGFrZSBwZWVyIGxhdGVuY3kgaW50byBhY2NvdW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3ApLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9xdWVyeSk6CisJICBXaGVuIHN5bmNocm9uaXppbmcgYnVmZmVycywgdGFrZSBwZWVyIGxhdGVuY3kgaW50byBhY2NvdW50LgorCSAgRG9uJ3QgdHJ5IHRvIGFkZCBvdXIgbGF0ZW5jeSB0byBpbnZhbGlkIHBlZXIgbWF4IGxhdGVuY3kgdmFsdWVzLgorCisyMDA3LTA4LTIzIDIxOjM5OjU4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBSZW5hbWUgYWxsIEdzdFJUUEZvbyBzdHJ1Y3RzIHRvIEdzdFJ0cEZvbyBzbyB0aGF0IEdTVF9CT0lMRVJQTEFURSByZWdpc3RlcnMgYSBHVHlwZSB0aGF0J3MgZGlmZmVyZW50IHRoYW4gdGhlIEdzdFJUUEYuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLnNpZ25hbHM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwY2xpZW50LmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGNsaWVudC5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5oOgorCSAgUmVuYW1lIGFsbCBHc3RSVFBGb28gc3RydWN0cyB0byBHc3RSdHBGb28gc28gdGhhdCBHU1RfQk9JTEVSUExBVEUKKwkgIHJlZ2lzdGVycyBhIEdUeXBlIHRoYXQncyBkaWZmZXJlbnQgdGhhbiB0aGUgR3N0UlRQRm9vIHR5cGVzIHRoYXQKKwkgIGZhcnNpZ2h0IHJlZ2lzdGVycyAobHVja2lseSBHVHlwZSBuYW1lcyBhcmUgY2FzZSBzZW5zaXRpdmUpLiBTaG91bGQKKwkgIGZpbmFsbHkgZml4ICM0MzA2NjQuCisKKzIwMDctMDgtMjEgMTc6MTg6MjkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOiBXaGVuIGRyb3Atb24tbGF0ZW5jeSBpcyBzZXQgYnV0IHdlIGhhdmUgbm8gbGF0ZW5jeSBjb25maWd1cmVkLCBqdXN0IHB1c2ggdGhlIGJ1Zi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbiksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NldF9wcm9wZXJ0eSk6CisJICBXaGVuIGRyb3Atb24tbGF0ZW5jeSBpcyBzZXQgYnV0IHdlIGhhdmUgbm8gbGF0ZW5jeSBjb25maWd1cmVkLCBqdXN0IHB1c2gKKwkgIHRoZSBidWZmZXIgYXMgZmFzdCBhcyBwb3NzaWJsZS4KKwkgIEZpeCB0eXBvIGluIGNvbW1lbnQuCisKKzIwMDctMDgtMjEgMTY6MDQ6NDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci4qOiBGaXggdW5kZWZpbmVkIG92ZXJmbG93IHByb25lIHRzX2RpZmYgaGFuZGxpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICAocnRwX2ppdHRlcl9idWZmZXJfZ2V0X3RzX2RpZmYpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaDoKKwkgIEZpeCB1bmRlZmluZWQgb3ZlcmZsb3cgcHJvbmUgdHNfZGlmZiBoYW5kbGluZy4KKworMjAwNy0wOC0xNiAxMTo0MDoxNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6IEZpeCBFT1MgaGFuZGxpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpbmtfZXZlbnQpLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYWluKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfbG9vcCk6CisJICBGaXggRU9TIGhhbmRsaW5nLgorCSAgQ29udmVydCBzb21lIERFQlVHIGludG8gV0FSTklOR3MuCisJICBQYXVzZSB0YXNrIHdoZW4gZmx1c2hpbmcuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogKGdzdF9ydHBfc2Vzc2lvbl9jbGFzc19pbml0KSwKKwkgIChydGNwX3RocmVhZCksIChnc3RfcnRwX3Nlc3Npb25fZXZlbnRfcmVjdl9ydGNwX3NpbmspOgorCSAgVXNlIHN5c3RlbSBjbG9jayBmb3IgUlRDUCBzZXNzaW9uIG1hbmFnZW1lbnQgdGltZW91dHMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKG9uX25ld19zc3JjKSwgKG9uX3NzcmNfY29sbGlzaW9uKSwKKwkgIChvbl9zc3JjX3ZhbGlkYXRlZCksIChvbl9ieWVfc3NyYyksIChvbl9ieWVfdGltZW91dCksIChvbl90aW1lb3V0KToKKwkgIFJlbGVhc2UgdGhlIHNlc3Npb24gbG9jayB3aGVuIGVtaXRpbmcgc2lnbmFscy4KKworMjAwNy0wOC0xMyAwNjoxNjo0MCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzogSW5jbHVkZSBzdGRsaWIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBJbmNsdWRlIHN0ZGxpYi4KKworMjAwNy0wOC0xMCAxNzoxNjo1MyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvOiBSZW1vdmUgY29tcGxpY2F0ZWQgYXN5bmMgcXVldWUgYW5kIHJlcGxhY2Ugd2l0aCBtb3JlIHNpbXBsZSBqaXR0ZXJidWZmZXIgY29kZSB3aGlsZSBhbHNvIGZpeGluZyBzb21lLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHBtYW5hZ2VyL2FzeW5jX2ppdHRlcl9xdWV1ZS5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9hc3luY19qaXR0ZXJfcXVldWUuaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IChydHBfaml0dGVyX2J1ZmZlcl9jbGFzc19pbml0KSwKKwkgIChydHBfaml0dGVyX2J1ZmZlcl9pbml0KSwgKHJ0cF9qaXR0ZXJfYnVmZmVyX2ZpbmFsaXplKSwKKwkgIChydHBfaml0dGVyX2J1ZmZlcl9uZXcpLCAoY29tcGFyZV9zZXFudW0pLAorCSAgKHJ0cF9qaXR0ZXJfYnVmZmVyX2luc2VydCksIChydHBfaml0dGVyX2J1ZmZlcl9wb3ApLAorCSAgKHJ0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoKSwgKHJ0cF9qaXR0ZXJfYnVmZmVyX251bV9wYWNrZXRzKSwKKwkgIChydHBfaml0dGVyX2J1ZmZlcl9nZXRfdHNfZGlmZik6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgUmVtb3ZlIGNvbXBsaWNhdGVkIGFzeW5jIHF1ZXVlIGFuZCByZXBsYWNlIHdpdGggbW9yZSBzaW1wbGUgaml0dGVyYnVmZmVyCisJICBjb2RlIHdoaWxlIGFsc28gZml4aW5nIHNvbWUgYnVncy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLW1hcnNoYWwubGlzdDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChvbl9uZXdfc3NyYyksIChvbl9zc3JjX2NvbGxpc2lvbiksCisJICAob25fc3NyY192YWxpZGF0ZWQpLCAob25fYnllX3NzcmMpLCAob25fYnllX3RpbWVvdXQpLCAob25fdGltZW91dCksCisJICAoY3JlYXRlX3Nlc3Npb24pLCAoZ3N0X3J0cF9iaW5fY2xhc3NfaW5pdCksIChjcmVhdGVfcmVjdl9ydHApLAorCSAgKGNyZWF0ZV9zZW5kX3J0cCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfaW5pdCksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZGlzcG9zZSksCisJICAoZ3N0X2ppdHRlcl9idWZmZXJfc2lua19wYXJzZV9jYXBzKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZmx1c2hfc3RhcnQpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9mbHVzaF9zdG9wKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2lua19ldmVudCksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChvbl9uZXdfc3NyYyksCisJICAob25fc3NyY19jb2xsaXNpb24pLCAob25fc3NyY192YWxpZGF0ZWQpLCAob25fYnllX3NzcmMpLAorCSAgKG9uX2J5ZV90aW1lb3V0KSwgKG9uX3RpbWVvdXQpLCAoZ3N0X3J0cF9zZXNzaW9uX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9pbml0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChvbl9ieWVfc3NyYyksIChzZXNzaW9uX2NsZWFudXApOgorCSAgVXNlIG5ldyBqaXR0ZXJidWZmZXIgY29kZS4KKwkgIEV4cG9zZSBzb21lIG5ldyBzaWduYWxzIGluIHByZXBhcmF0aW9uIGZvciBoYW5kbGluZyBFT1MuCisKKzIwMDctMDctMTggMDc6MzU6MzIgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgQWRkIHN0ZGxpYiBpbmNsdWRlIChmcmVlLCBhdG9pLCBleGl0KS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleGFtcGxlcy9hcHAvYXBwc3JjX2V4LmM6CisJICAqIGV4YW1wbGVzL3N3aXRjaC9zd2l0Y2hlci5jOgorCSAgKiBleHQvbmVvbi9nc3RuZW9uaHR0cHNyYy5jOgorCSAgKiBleHQvdGltaWRpdHkvZ3N0d2lsZG1pZGkuYzoKKwkgICogZXh0L3gyNjQvZ3N0eDI2NGVuYy5jOgorCSAgKiBnc3QvbXZlL212ZWF1ZGlvZW5jLmM6IChtdmVfY29tcHJlc3NfYXVkaW8pOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBjbGllbnQuYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAqIGdzdC9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOgorCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1vc3NzcmMuYzoKKwkgICogc3lzL2R2Yi9nc3RkdmJzcmMuYzoKKwkgIEFkZCBzdGRsaWIgaW5jbHVkZSAoZnJlZSwgYXRvaSwgZXhpdCkuCisKKzIwMDctMDYtMjIgMjA6MjM6MTggKzAwMDAgIEplbnMgR3JhbnNldWVyIDxqZW5zZ3JAZ214Lm5ldD4KKworCSAgZ3N0LzogQnVpbGQgZml4ZXMgZm9yIGdjYy0yLjl4IChubyBtaWQtYmxvY2sgdmFyaWFibGUgZGVjbGFyYXRpb25zIGV0Yy4pLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSmVucyBHcmFuc2V1ZXIgIDxqZW5zZ3IgYXQgZ214IG5ldD4KKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmM6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmM6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVybmJhbmRzLmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2FzeW5jX2ppdHRlcl9xdWV1ZS5jOgorCSAgKGFzeW5jX2ppdHRlcl9xdWV1ZV9wdXNoX3NvcnRlZCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbik6CisJICAqIGdzdC9zd2l0Y2gvZ3N0c3dpdGNoLmM6IChnc3Rfc3dpdGNoX2NoYWluKToKKwkgIEJ1aWxkIGZpeGVzIGZvciBnY2MtMi45eCAobm8gbWlkLWJsb2NrIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBldGMuKS4KKwkgIEZpeGVzICM0NTAxODUuCisKKzIwMDctMDUtMjggMTY6Mzc6NDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIFJlbmFtZSBlbGVtZW50cyB0byBhdm9pZCBjb25mbGljdCB3aXRoIGZhcnNpZ2h0IGVsZW1lbnRzIHdpdGggdGhlIHNhbWUgbmFtZS4gRml4ZXMgIzQzMDY2NC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGNyZWF0ZV9zZXNzaW9uKSwgKGNyZWF0ZV9zdHJlYW0pLAorCSAgKGdzdF9ydHBfYmluX2NsYXNzX2luaXQpLCAoY3JlYXRlX3JlY3ZfcnRwKSwgKGNyZWF0ZV9yZWN2X3J0Y3ApLAorCSAgKGNyZWF0ZV9zZW5kX3J0cCksIChjcmVhdGVfcnRjcCksIChnc3RfcnRwX2Jpbl9yZXF1ZXN0X25ld19wYWQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBjbGllbnQuYzogKGNyZWF0ZV9zdHJlYW0pLAorCSAgKGdzdF9ydHBfY2xpZW50X3JlcXVlc3RfbmV3X3BhZCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jbGVhcl9wdF9tYXApLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3ApOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtYW5hZ2VyLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoZ3N0X3J0cF9zZXNzaW9uX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9yZXF1ZXN0X25ld19wYWQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIFJlbmFtZSBlbGVtZW50cyB0byBhdm9pZCBjb25mbGljdCB3aXRoIGZhcnNpZ2h0IGVsZW1lbnRzIHdpdGggdGhlIHNhbWUKKwkgIG5hbWUuIEZpeGVzICM0MzA2NjQuCisKKzIwMDctMDUtMjMgMTM6MDg6NTIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIERvY3VtZW50IHN0dWZmLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChnc3RfcnRwX2Jpbl9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGNsaWVudC5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NsZWFyX3B0X21hcCksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfbG9vcCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6IChnc3RfcnRwX3B0X2RlbXV4X2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfcHRfZGVtdXhfY2xlYXJfcHRfbWFwKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fY2xhc3NfaW5pdCksCisJICAocnRjcF90aHJlYWQpLCAoZ3N0X3J0cF9zZXNzaW9uX2NsZWFyX3B0X21hcCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICAoZ3N0X3J0cF9zc3JjX2RlbXV4X2NsYXNzX2luaXQpOgorCSAgRG9jdW1lbnQgc3R1ZmYuCisJICBBZGQgY2xlYXItcHQtbWFwIGFjdGlvbiBzaWduYWwgd2hlcmUgbmVlZGVkLgorCisyMDA3LTA1LTE1IDEzOjI5OjUzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6IFdlIGFsd2F5cyB1c2UgZml4ZWQgY2Fwcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6IChnc3RfcnRwX3B0X2RlbXV4X2NoYWluKToKKwkgIFdlIGFsd2F5cyB1c2UgZml4ZWQgY2Fwcy4KKworMjAwNy0wNS0xNSAwMzo0NTo0NSArMDAwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiBnX2hhc2hfdGFibGVfcmVtb3ZlX2FsbCgpIG9ubHkgZXhpc3RzIGluIDIuMTIuICBXb3JrIGFyb3VuZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIGdfaGFzaF90YWJsZV9yZW1vdmVfYWxsKCkgb25seSBleGlzdHMgaW4gMi4xMi4gIFdvcmsgYXJvdW5kLgorCisyMDA3LTA1LTE0IDE1OjI4OjM2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9hc3luY19qaXR0ZXJfcXVldWUuYzogRml4IGxlYWsgd2hlbiBmbHVzaGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9hc3luY19qaXR0ZXJfcXVldWUuYzoKKwkgIChhc3luY19qaXR0ZXJfcXVldWVfc2V0X2ZsdXNoaW5nX3VubG9ja2VkKToKKwkgIEZpeCBsZWFrIHdoZW4gZmx1c2hpbmcuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoZ3N0X3J0cF9iaW5fY2xlYXJfcHRfbWFwKSwKKwkgIChnc3RfcnRwX2Jpbl9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICBBZGQgY2xlYXItcHQtbWFwIHNpZ25hbC4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoX3N0b3ApLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zaW5rX2V2ZW50KSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKToKKwkgIEluaXQgY2xvY2stcmF0ZSB0byAtMSB0byBtYXJrIHVua25vdyBjbG9jayByYXRlLgorCSAgRml4IGZsdXNoaW5nLgorCisyMDA3LTA1LTEwIDE0OjAyOjA3ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYyAoZ3N0X3F0ZGVtdXhfbW92ZV9zdHJlYW0sIGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfaGVhZGVyLCBnc3RfcXRkZW11eF9hY3RpdmF0ZV9zZWdtZW50LCBnc3RfcXRkZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYyAoZ3N0X3F0ZGVtdXhfbW92ZV9zdHJlYW0sCisJICBnc3RfcXRkZW11eF9sb29wX3N0YXRlX2hlYWRlciwgZ3N0X3F0ZGVtdXhfYWN0aXZhdGVfc2VnbWVudCwKKwkgIGdzdF9xdGRlbXV4X3ByZXBhcmVfY3VycmVudF9zYW1wbGUsIGdzdF9xdGRlbXV4X2NvbWJpbmVfZmxvd3MsCisJICBnc3RfcXRkZW11eF9sb29wX3N0YXRlX21vdmllLCBnc3RfcXRkZW11eF9sb29wLAorCSAgcXRkZW11eF9wYXJzZV9zZWdtZW50cywgcXRkZW11eF9wYXJzZV90cmFrKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jIChydHBfc2Vzc2lvbl9nZXRfYmFuZHdpZHRoLAorCSAgcnRwX3Nlc3Npb25fZ2V0X3J0Y3BfYmFuZHdpZHRoLCBydHBfc2Vzc2lvbl9nZXRfY25hbWUsCisJICBydHBfc2Vzc2lvbl9nZXRfbmFtZSwgcnRwX3Nlc3Npb25fZ2V0X2VtYWlsLCBydHBfc2Vzc2lvbl9nZXRfcGhvbmUsCisJICBydHBfc2Vzc2lvbl9nZXRfbG9jYXRpb24sIHJ0cF9zZXNzaW9uX2dldF90b29sLAorCSAgcnRwX3Nlc3Npb25fcHJvY2Vzc19ieWUsIHNlc3Npb25fcmVwb3J0X2Jsb2Nrcyk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jIChydHBfc291cmNlX3Byb2Nlc3NfcnRwLAorCSAgcnRwX3NvdXJjZV9zZW5kX3J0cCwgcnRwX3NvdXJjZV9wcm9jZXNzX3NyLCBydHBfc291cmNlX3Byb2Nlc3NfcmIpOgorCSAgTW9yZSBmb3JtYXQgYXJnIGZpeGluZyAoc3BvdHRlZCBieSBBbGkgU2FiaWwgPGFsaS5zYWJpbEBnbWFpbC5jb20+KS4KKwkgICogZ3N0L3N3aXRjaC9NYWtlZmlsZS5hbToKKwkgIEFkZCByZXF1aXJlIGxpYnJhcmllcyhzcG90dGVkIGJ5IEFsaSBTYWJpbCA8YWxpLnNhYmlsQGdtYWlsLmNvbT4pLgorCisyMDA3LTA1LTEwIDEyOjM4OjQ5ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2FzeW5jX2ppdHRlcl9xdWV1ZS5jOgorCSAgZ3N0L3J0cG1hbmFnZXIvYXN5bmNfaml0dGVyX3F1ZXVlLmMgKHRhaWxfYnVmZmVyX2R1cmF0aW9uLCBhc3luY19qaXR0ZXJfcXVldWVfcmVmLCBhc3luY19qaXR0ZXJfcXVldWVfcmVmX3VubG9ja2VkLCBhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvYXN5bmNfaml0dGVyX3F1ZXVlLmMgKHRhaWxfYnVmZmVyX2R1cmF0aW9uLAorCSAgYXN5bmNfaml0dGVyX3F1ZXVlX3JlZiwgYXN5bmNfaml0dGVyX3F1ZXVlX3JlZl91bmxvY2tlZCwKKwkgIGFzeW5jX2ppdHRlcl9xdWV1ZV9zZXRfbG93X3RocmVzaG9sZCwKKwkgIGFzeW5jX2ppdHRlcl9xdWV1ZV9sZW5ndGhfdHNfdW5pdHNfdW5sb2NrZWQsCisJICBhc3luY19qaXR0ZXJfcXVldWVfdW5yZWZfYW5kX3VubG9jaywgYXN5bmNfaml0dGVyX3F1ZXVlX3VucmVmLAorCSAgYXN5bmNfaml0dGVyX3F1ZXVlX2xvY2ssIGFzeW5jX2ppdHRlcl9xdWV1ZV9wdXNoLAorCSAgYXN5bmNfaml0dGVyX3F1ZXVlX3B1c2hfdW5sb2NrZWQsIGFzeW5jX2ppdHRlcl9xdWV1ZV9wdXNoX3NvcnRlZCwKKwkgIGFzeW5jX2ppdHRlcl9xdWV1ZV9wb3BfaW50ZXJuX3VubG9ja2VkLCBhc3luY19qaXR0ZXJfcXVldWVfcG9wLAorCSAgYXN5bmNfaml0dGVyX3F1ZXVlX3BvcF91bmxvY2tlZCwgYXN5bmNfaml0dGVyX3F1ZXVlX2xlbmd0aF91bmxvY2tlZCwKKwkgIGFzeW5jX2ppdHRlcl9xdWV1ZV9zZXRfZmx1c2hpbmdfdW5sb2NrZWQsCisJICBhc3luY19qaXR0ZXJfcXVldWVfdW5zZXRfZmx1c2hpbmdfdW5sb2NrZWQpOgorCSAgRm9ybWF0IGFyZyBmaXggKHNwb3R0ZWQgYnkgQWxpIFNhYmlsIDxhbGkuc2FiaWxAZ21haWwuY29tPikKKworMjAwNy0wNS0wOSAxMToyNDoyMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6IFBhc3MgcXVlcmllcyB1cHN0cmVhbS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfcXVlcnkpOgorCSAgUGFzcyBxdWVyaWVzIHVwc3RyZWFtLgorCisyMDA3LTA1LTA0IDEyOjMyOjI3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogQWRkIHNvbWUgZGVidWcgaW5mby4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfcXVlcnkpOgorCSAgQWRkIHNvbWUgZGVidWcgaW5mby4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAocnRwX3Nlc3Npb25faW5pdCksCisJICAocnRwX3Nlc3Npb25fc2VuZF9ydHApOgorCSAgU3RvcmUgcmVhbCB1c2VyIG5hbWUgaW4gdGhlIHNlc3Npb24uCisKKzIwMDctMDQtMzAgMTM6NDE6MzAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2FzeW5jX2ppdHRlcl9xdWV1ZS5jOiBGaXggdGhlIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciB1bmRlcnJ1bnMgYW5kIGRvZXMgbm90IGJsb2NrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2FzeW5jX2ppdHRlcl9xdWV1ZS5jOiAoc2lnbmFsX3dhaXRpbmdfdGhyZWFkcyksCisJICAoYXN5bmNfaml0dGVyX3F1ZXVlX3BvcF9pbnRlcm5fdW5sb2NrZWQpOgorCSAgRml4IHRoZSBjYXNlIHdoZXJlIHRoZSBidWZmZXIgdW5kZXJydW5zIGFuZCBkb2VzIG5vdCBibG9jay4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChnc3RfcnRwX2Jpbl9iYXNlX2luaXQpLAorCSAgKGNyZWF0ZV9yZWN2X3J0Y3ApLCAoY3JlYXRlX3NlbmRfcnRwKSwgKGNyZWF0ZV9ydGNwKSwKKwkgIChnc3RfcnRwX2Jpbl9yZXF1ZXN0X25ld19wYWQpOgorCSAgUmVuYW1lIFJUQ1Agc2VuZCBwYWQsIGxpa2UgaW4gdGhlIHNlc3Npb24gbWFuYWdlci4KKwkgIEFsbG93IGdldHRpbmcgYW4gUlRDUCBwYWQgZm9yIHJlY2VpdmluZyBldmVuIGlmIHdlIGRvbid0IHJlY2VpdmUgUlRQLgorCSAgZml4IGhhbmRsaW5nIG9mIHNlbmRfcnRwX3NyYyBwYWQuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzogKGdzdF9ydHBfcHRfZGVtdXhfY2hhaW4pOgorCSAgV2hlbiBubyBwdCBtYXAgY291bGQgYmUgZm91bmQsIGZhbGwgYmFjayB0byB0aGUgc2lua3BhZCBjYXBzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fcHJvY2Vzc19ydHApLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9zZW5kX3J0cCksIChjcmVhdGVfcmVjdl9ydHBfc2luayksCisJICAoY3JlYXRlX3JlY3ZfcnRjcF9zaW5rKSwgKGNyZWF0ZV9zZW5kX3J0cF9zaW5rKSwKKwkgIChjcmVhdGVfc2VuZF9ydGNwX3NyYyk6CisJICBGaXggcGFkIG5hbWVzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChzb3VyY2VfcHVzaF9ydHApLAorCSAgKHJ0cF9zZXNzaW9uX2NyZWF0ZV9zb3VyY2UpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19zciksCisJICAocnRwX3Nlc3Npb25fc2VuZF9ydHApLCAoc2Vzc2lvbl9zdGFydF9ydGNwKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgVW5sb2NrIHNlc3Npb24gd2hlbiBwZXJmb3JtaW5nIGEgY2FsbGJhY2suCisJICBBZGQgY2FsbGJhY2tzIGZvciB0aGUgaW50ZXJuYWwgc2Vzc2lvbiBvYmplY3QuCisJICBGaXggc2VuZGluZyBvZiBSVFAgcGFja2V0cy4KKwkgIGZpcnN0IGF0dGVtcHQgYXQgYWRkaW5nIE5UUCB0aW1lcyBpbiB0aGUgU1IgcGFja2V0cy4KKwkgIFNtYWxsIGRlYnVnIGFuZCBkb2MgaW1wcm92ZW1lbnRzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzogKHJ0cF9zb3VyY2Vfc2VuZF9ydHApOgorCSAgVXBkYXRlIHN0YXRzIGZvciBTUiByZXBvcnRzLgorCisyMDA3LTA0LTI5IDE0OjQ2OjI3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IFJlbW92ZSBkZWJ1Zy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fc2VuZF9ydGNwKToKKwkgIFJlbW92ZSBkZWJ1Zy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAocnRwX3Nlc3Npb25fcHJvY2Vzc19zciksCisJICAocnRwX3Nlc3Npb25fcHJvY2Vzc19zZGVzKSwgKGNhbGN1bGF0ZV9ydGNwX2ludGVydmFsKSwKKwkgIChydHBfc2Vzc2lvbl9uZXh0X3RpbWVvdXQpLCAoc2Vzc2lvbl9yZXBvcnRfYmxvY2tzKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuYzogKHJ0cF9zdGF0c19jYWxjdWxhdGVfcnRjcF9pbnRlcnZhbCk6CisJICBJbXByb3ZlIGRlYnVnZ2luZworCSAgRml4IGludGVydmFsIGZvciBCWUUvUlRDUCBwYWNrZXRzLgorCisyMDA3LTA0LTI3IDE1OjA5OjEyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IE1vdmUgcmVjb25zaWRlcmF0aW9uIGNvZGUgdG8gdGhlIHJ0cHNlc3Npb24gb2JqZWN0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogKHJ0Y3BfdGhyZWFkKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fc2VuZF9ydGNwKSwgKGdzdF9ydHBfc2Vzc2lvbl9yZWNvbnNpZGVyKToKKwkgIE1vdmUgcmVjb25zaWRlcmF0aW9uIGNvZGUgdG8gdGhlIHJ0cHNlc3Npb24gb2JqZWN0LgorCSAgU2ltcGxpZnkgdGltb3V0IGhhbmRsaW5nIGFuZCBhZGQgcmVjb25zaWRlcmF0aW9uLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChydHBfc2Vzc2lvbl9jbGFzc19pbml0KSwKKwkgIChydHBfc2Vzc2lvbl9pbml0KSwgKHJ0cF9zZXNzaW9uX2ZpbmFsaXplKSwgKG9uX2J5ZV9zc3JjKSwKKwkgIChvbl9ieWVfdGltZW91dCksIChvbl90aW1lb3V0KSwgKHJ0cF9zZXNzaW9uX3NldF9jYWxsYmFja3MpLAorCSAgKG9idGFpbl9zb3VyY2UpLCAocnRwX3Nlc3Npb25fY3JlYXRlX3NvdXJjZSksCisJICAodXBkYXRlX2Fycml2YWxfc3RhdHMpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19ydHApLAorCSAgKHJ0cF9zZXNzaW9uX3Byb2Nlc3Nfc3IpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19yciksCisJICAocnRwX3Nlc3Npb25fcHJvY2Vzc19ieWUpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19ydGNwKSwKKwkgIChjYWxjdWxhdGVfcnRjcF9pbnRlcnZhbCksIChydHBfc2Vzc2lvbl9zZW5kX2J5ZSksCisJICAocnRwX3Nlc3Npb25fbmV4dF90aW1lb3V0KSwgKHNlc3Npb25fc3RhcnRfcnRjcCksCisJICAoc2Vzc2lvbl9yZXBvcnRfYmxvY2tzKSwgKHNlc3Npb25fY2xlYW51cCksIChzZXNzaW9uX3NkZXMpLAorCSAgKHNlc3Npb25fYnllKSwgKGlzX3J0Y3BfdGltZSksIChydHBfc2Vzc2lvbl9vbl90aW1lb3V0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgSGFuZGxlIHRpbWVvdXQgb2YgaW5hY3RpdmUgc291cmNlcyBhbmQgc2VuZGVycy4KKwkgIEltcGxlbWVudCBCWUUgc2NoZWR1bGluZy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IChjYWxjdWxhdGVfaml0dGVyKSwKKwkgIChydHBfc291cmNlX3Byb2Nlc3Nfc3IpLCAocnRwX3NvdXJjZV9nZXRfbGFzdF9zciksCisJICAocnRwX3NvdXJjZV9nZXRfbGFzdF9yYik6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oOgorCSAgQWRkIG1lbWJlcnMgdG8gY2hlY2sgZm9yIHRpbWVvdXRzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOiAocnRwX3N0YXRzX2luaXRfZGVmYXVsdHMpLAorCSAgKHJ0cF9zdGF0c19jYWxjdWxhdGVfcnRjcF9pbnRlcnZhbCksIChydHBfc3RhdHNfYWRkX3J0Y3Bfaml0dGVyKSwKKwkgIChydHBfc3RhdHNfY2FsY3VsYXRlX2J5ZV9pbnRlcnZhbCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmg6CisJICBVc2UgUkZDIGFsZ29yaXRobSBmb3IgY2FsY3VsYXRpbmcgdGhlIHJlcG9ydGluZyBpbnRlcnZhbC4KKworMjAwNy0wNC0yNSAxNjozODowMyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiBJbXBsZW1lbnQgZm9yd2FyZCBhbmQgcmV2ZXJzZSByZWNvbnNpZGVyYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAocnRjcF90aHJlYWQpOgorCSAgSW1wbGVtZW50IGZvcndhcmQgYW5kIHJldmVyc2UgcmVjb25zaWRlcmF0aW9uLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChydHBfc2Vzc2lvbl9nZXRfbnVtX3NvdXJjZXMpLAorCSAgKHJ0cF9zZXNzaW9uX2dldF9udW1fYWN0aXZlX3NvdXJjZXMpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19zciksCisJICAoc2Vzc2lvbl9yZXBvcnRfYmxvY2tzKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgU21hbGwgY2xlYW51cHMuCisKKzIwMDctMDQtMjUgMTU6NDg6NDYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi4qOiBNYWtlIGRlZmF1bHQgaml0dGVyYnVmZmVyIGxhdGVuY3kgY29uZmlndXJhYmxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZXZpZXdlZCBieTogPGRlbGV0ZSBpZiBub3QgdXNpbmcgYSBidWRkeT4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChjcmVhdGVfc3RyZWFtKSwKKwkgIChnc3RfcnRwX2Jpbl9jbGFzc19pbml0KSwgKGdzdF9ydHBfYmluX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9iaW5fZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICBNYWtlIGRlZmF1bHQgaml0dGVyYnVmZmVyIGxhdGVuY3kgY29uZmlndXJhYmxlLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2xhc3NfaW5pdCksCisJICAoZ3N0X2ppdHRlcl9idWZmZXJfc2lua19wYXJzZV9jYXBzKSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3Byb3BlcnR5KToKKwkgIERlYnVnaW5nIGNsZWFudXBzLgorCisyMDA3LTA0LTI1IDEzOjE5OjM2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogUmVwb3J0IE5PX1BSRVJPTEwgd2hlbiBnb2luZyB0byBQQVVTRUQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYW5nZV9zdGF0ZSk6CisJICBSZXBvcnQgTk9fUFJFUk9MTCB3aGVuIGdvaW5nIHRvIFBBVVNFRC4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAocnRjcF90aHJlYWQpOgorCSAgRG9uJ3Qgc2VuZCBSVENQIHJpZ2h0IGJlZm9yZSB3ZSBhcmUgc2h1dHRpbmcgZG93bi4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAocnRwX3Nlc3Npb25fcHJvY2Vzc19ydHApLAorCSAgKHJ0cF9zZXNzaW9uX3Byb2Nlc3Nfc3IpLCAoc2Vzc2lvbl9yZXBvcnRfYmxvY2tzKSwKKwkgIChydHBfc2Vzc2lvbl9wZXJmb3JtX3JlcG9ydGluZyk6CisJICBJbXByb3ZlIHJlcG9ydCBibG9ja3MuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiAoY2FsY3VsYXRlX2ppdHRlciksIChpbml0X3NlcSksCisJICAocnRwX3NvdXJjZV9wcm9jZXNzX3J0cCksIChydHBfc291cmNlX3Byb2Nlc3Nfc3IpLAorCSAgKHJ0cF9zb3VyY2VfcHJvY2Vzc19yYiksIChydHBfc291cmNlX2dldF9sYXN0X3NyKSwKKwkgIChydHBfc291cmNlX2dldF9sYXN0X3JiKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmg6CisJICBDbGVhbnVwcywgYWRkIG1ldGhvZHMgdG8gYWNjZXNzIHN0YXRzLgorCisyMDA3LTA0LTI1IDA4OjMwOjQ4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogZml4IGZvciBwYWQgbmFtZSBjaGFuZ2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGNyZWF0ZV9ydGNwKToKKwkgIGZpeCBmb3IgcGFkIG5hbWUgY2hhbmdlCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogKHJ0Y3BfdGhyZWFkKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fc2VuZF9ydGNwKSwgKGdzdF9ydHBfc2Vzc2lvbl9jbG9ja19yYXRlKToKKwkgIEZpeCBmb3IgcmVuYW1lZCBtZXRob2RzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChydHBfc2Vzc2lvbl9pbml0KSwKKwkgIChydHBfc2Vzc2lvbl9maW5hbGl6ZSksIChydHBfc2Vzc2lvbl9zZXRfY25hbWUpLAorCSAgKHJ0cF9zZXNzaW9uX2dldF9jbmFtZSksIChydHBfc2Vzc2lvbl9zZXRfbmFtZSksCisJICAocnRwX3Nlc3Npb25fZ2V0X25hbWUpLCAocnRwX3Nlc3Npb25fc2V0X2VtYWlsKSwKKwkgIChydHBfc2Vzc2lvbl9nZXRfZW1haWwpLCAocnRwX3Nlc3Npb25fc2V0X3Bob25lKSwKKwkgIChydHBfc2Vzc2lvbl9nZXRfcGhvbmUpLCAocnRwX3Nlc3Npb25fc2V0X2xvY2F0aW9uKSwKKwkgIChydHBfc2Vzc2lvbl9nZXRfbG9jYXRpb24pLCAocnRwX3Nlc3Npb25fc2V0X3Rvb2wpLAorCSAgKHJ0cF9zZXNzaW9uX2dldF90b29sKSwgKHJ0cF9zZXNzaW9uX3NldF9ub3RlKSwKKwkgIChydHBfc2Vzc2lvbl9nZXRfbm90ZSksIChzb3VyY2VfcHVzaF9ydHApLCAob2J0YWluX3NvdXJjZSksCisJICAocnRwX3Nlc3Npb25fYWRkX3NvdXJjZSksIChydHBfc2Vzc2lvbl9nZXRfc291cmNlX2J5X3NzcmMpLAorCSAgKHJ0cF9zZXNzaW9uX2NyZWF0ZV9zb3VyY2UpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19ydHApLAorCSAgKHJ0cF9zZXNzaW9uX3Byb2Nlc3Nfc3IpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19zZGVzKSwKKwkgIChydHBfc2Vzc2lvbl9wcm9jZXNzX3J0Y3ApLCAocnRwX3Nlc3Npb25fc2VuZF9ydHApLAorCSAgKHJ0cF9zZXNzaW9uX2dldF9yZXBvcnRpbmdfaW50ZXJ2YWwpLCAoc2Vzc2lvbl9yZXBvcnRfYmxvY2tzKSwKKwkgIChzZXNzaW9uX3NkZXMpLCAocnRwX3Nlc3Npb25fcGVyZm9ybV9yZXBvcnRpbmcpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBQcmVwYXJlIGZvciBpbXBsZW1lbnRpbmcgU1NSQyBzYW1wbGluZy4KKwkgIENyZWF0ZSBTU1JDIGZvciB0aGUgc2Vzc2lvbi4KKwkgIEFkZCBtZXRob2RzIHRvIHNldCB0aGUgU0RFUyBlbnRyaWVzLgorCSAgZml4IGFjY291bnRpbmcgb2Ygc2VuZGVycy9yZWNlaXZlcnMuCisJICBJbXBsZW1lbnQgU1IvUlIvU0RFUyBSVENQIHJlcG9ydGluZy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IChydHBfc291cmNlX2luaXQpLCAoaW5pdF9zZXEpLAorCSAgKHJ0cF9zb3VyY2VfcHJvY2Vzc19ydHApLCAocnRwX3NvdXJjZV9wcm9jZXNzX3NyKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBJbXBsZW1lbnQgZXh0ZW5kZWQgc2VxdWVuY2UgbnVtYmVyLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOiAocnRwX3N0YXRzX2NhbGN1bGF0ZV9ydGNwX2ludGVydmFsKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaDoKKwkgIFJlbmFtZSBzb21lIGZpZWxkcy4KKworMjAwNy0wNC0yMSAxOToyMTo0OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiBEb24ndCB1c2UgR0xpYi0yLjEwIEFQSSwgd2Ugb25seSByZXF1aXJlIEdMaWIgMi44IGF0IHRoZSBtb21lbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAocnRwX3Nlc3Npb25fZmluYWxpemUpOgorCSAgRG9uJ3QgdXNlIEdMaWItMi4xMCBBUEksIHdlIG9ubHkgcmVxdWlyZSBHTGliIDIuOCBhdCB0aGUgbW9tZW50LgorCisyMDA3LTA0LTE4IDE4OjU4OjUzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBjb25maWd1cmUuYWM6IERpc2FibGUgcnRwbWFuYWdlciBmb3Igbm93IGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBDVlMgLWJhc2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgRGlzYWJsZSBydHBtYW5hZ2VyIGZvciBub3cgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIENWUyAtYmFzZS4KKwkgICogZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW06CisJICBBZGRlZCBuZXcgZmlsZXMgZm9yIHNlc3Npb24gbWFuYWdlci4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoY3JlYXRlX3Nlc3Npb24pLCAoZ2V0X3B0X21hcCksCisJICAoY3JlYXRlX3N0cmVhbSksIChwdF9tYXBfcmVxdWVzdGVkKSwgKG5ld19zc3JjX3BhZF9mb3VuZCk6CisJICBTb21lIGNsZWFudXBzLgorCSAgdGhlIHNlc3Npb24gbWFuYWdlciBjYW4gbm93IGFsc28gcmVxdWVzdCBhIHB0LW1hcC4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoZ3N0X3J0cF9zZXNzaW9uX2Jhc2VfaW5pdCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9zZXNzaW9uX2luaXQpLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9maW5hbGl6ZSksIChydGNwX3RocmVhZCksIChzdGFydF9ydGNwX3RocmVhZCksCisJICAoc3RvcF9ydGNwX3RocmVhZCksIChnc3RfcnRwX3Nlc3Npb25fY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fcHJvY2Vzc19ydHApLCAoZ3N0X3J0cF9zZXNzaW9uX3NlbmRfcnRwKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fc2VuZF9ydGNwKSwgKGdzdF9ydHBfc2Vzc2lvbl9jbG9ja19yYXRlKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fZ2V0X3RpbWUpLCAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3JlY3ZfcnRwX3NpbmspLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9jaGFpbl9yZWN2X3J0cCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3JlY3ZfcnRjcF9zaW5rKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fY2hhaW5fcmVjdl9ydGNwKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fZXZlbnRfc2VuZF9ydHBfc2luayksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3NlbmRfcnRwKSwgKGNyZWF0ZV9zZW5kX3J0Y3Bfc3JjKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fcmVxdWVzdF9uZXdfcGFkKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5oOgorCSAgV2UgY2FuIGFzayBmb3IgcHQtbWFwIG5vdyB0b28gd2hlbiB0aGUgc2Vzc2lvbiBtYW5hZ2VyIG5lZWRzIGl0LgorCSAgSG9vayB1cCB0byB0aGUgbmV3IHNlc3Npb24gbWFuYWdlciwgaW1wbGVtZW50IHRoZSBuZWVkZWQgY2FsbGJhY2tzIGZvcgorCSAgcHVzaGluZyBkYXRhLCBnZXR0aW5nIGNsb2NrIHRpbWUgYW5kIHJlcXVlc3RpbmcgY2xvY2stcmF0ZXMuCisJICBSZW5hbWUgcnRjcF9zcmMgdG8gc2VuZF9ydGNwX3NyYyB0byBtYWtlIGl0IGNsZWFyIHRoYXQgdGhpcyBSVENQIGlzIHRvCisJICBiZSBzZW5kIHRvIGNsaWVudHMuCisJICBBZGQgY29kZSB0byBzdGFydCBhbmQgc3RvcCB0aGUgdGhyZWFkIHRoYXQgd2lsbCBzY2hlZHVsZSBSVENQIHRocm91Z2gKKwkgIHRoZSBzZXNzaW9uIG1hbmFnZXIuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHJ0cF9zZXNzaW9uX2NsYXNzX2luaXQpLAorCSAgKHJ0cF9zZXNzaW9uX2luaXQpLCAocnRwX3Nlc3Npb25fZmluYWxpemUpLAorCSAgKHJ0cF9zZXNzaW9uX3NldF9wcm9wZXJ0eSksIChydHBfc2Vzc2lvbl9nZXRfcHJvcGVydHkpLAorCSAgKG9uX25ld19zc3JjKSwgKG9uX3NzcmNfY29sbGlzaW9uKSwgKG9uX3NzcmNfdmFsaWRhdGVkKSwKKwkgIChvbl9ieWVfc3NyYyksIChydHBfc2Vzc2lvbl9uZXcpLCAocnRwX3Nlc3Npb25fc2V0X2NhbGxiYWNrcyksCisJICAocnRwX3Nlc3Npb25fc2V0X2JhbmR3aWR0aCksIChydHBfc2Vzc2lvbl9nZXRfYmFuZHdpZHRoKSwKKwkgIChydHBfc2Vzc2lvbl9zZXRfcnRjcF9iYW5kd2lkdGgpLCAocnRwX3Nlc3Npb25fZ2V0X3J0Y3BfYmFuZHdpZHRoKSwKKwkgIChzb3VyY2VfcHVzaF9ydHApLCAoc291cmNlX2Nsb2NrX3JhdGUpLCAoY2hlY2tfY29sbGlzaW9uKSwKKwkgIChvYnRhaW5fc291cmNlKSwgKHJ0cF9zZXNzaW9uX2FkZF9zb3VyY2UpLAorCSAgKHJ0cF9zZXNzaW9uX2dldF9udW1fc291cmNlcyksCisJICAocnRwX3Nlc3Npb25fZ2V0X251bV9hY3RpdmVfc291cmNlcyksCisJICAocnRwX3Nlc3Npb25fZ2V0X3NvdXJjZV9ieV9zc3JjKSwKKwkgIChydHBfc2Vzc2lvbl9nZXRfc291cmNlX2J5X2NuYW1lKSwgKHJ0cF9zZXNzaW9uX2NyZWF0ZV9zb3VyY2UpLAorCSAgKHVwZGF0ZV9hcnJpdmFsX3N0YXRzKSwgKHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnRwKSwKKwkgIChydHBfc2Vzc2lvbl9wcm9jZXNzX3NyKSwgKHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnIpLAorCSAgKHJ0cF9zZXNzaW9uX3Byb2Nlc3Nfc2RlcyksIChydHBfc2Vzc2lvbl9wcm9jZXNzX2J5ZSksCisJICAocnRwX3Nlc3Npb25fcHJvY2Vzc19hcHApLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19ydGNwKSwKKwkgIChydHBfc2Vzc2lvbl9zZW5kX3J0cCksIChydHBfc2Vzc2lvbl9nZXRfcnRjcF9pbnRlcnZhbCksCisJICAocnRwX3Nlc3Npb25fcHJvZHVjZV9ydGNwKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgVGhlIGFkdmFuY2VkIGJlZ2lubmluZ3Mgb2YgdGhlIG1haW4gc2Vzc2lvbiBtYW5hZ2VyIHRoYXQgaGFuZGxlcyB0aGUKKwkgIHBhcnRpY2lwYW50IGRhdGFiYXNlIG9mIFJUUFNvdXJjZXMsIFNTUkMgcHJvYmF0aW9uLCBTU1JDIGNvbGxpc2lvbnMsCisJICBwYXJzZSBSVENQIHRvIHVwZGF0ZSBzb3VyY2Ugc3RhdHMuIGV0Yy4uCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiAocnRwX3NvdXJjZV9jbGFzc19pbml0KSwKKwkgIChydHBfc291cmNlX2luaXQpLCAocnRwX3NvdXJjZV9maW5hbGl6ZSksIChydHBfc291cmNlX25ldyksCisJICAocnRwX3NvdXJjZV9zZXRfY2FsbGJhY2tzKSwgKHJ0cF9zb3VyY2Vfc2V0X2FzX2NzcmMpLAorCSAgKHJ0cF9zb3VyY2Vfc2V0X3J0cF9mcm9tKSwgKHJ0cF9zb3VyY2Vfc2V0X3J0Y3BfZnJvbSksCisJICAocHVzaF9wYWNrZXQpLCAoZ2V0X2Nsb2NrX3JhdGUpLCAoY2FsY3VsYXRlX2ppdHRlciksCisJICAocnRwX3NvdXJjZV9wcm9jZXNzX3J0cCksIChydHBfc291cmNlX3Byb2Nlc3NfYnllKSwKKwkgIChydHBfc291cmNlX3NlbmRfcnRwKSwgKHJ0cF9zb3VyY2VfcHJvY2Vzc19zciksCisJICAocnRwX3NvdXJjZV9wcm9jZXNzX3JiKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBPYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgYW4gU1NSQyBhbmQgaXRzIHN0YXRlIGluIHRoZSBkYXRhYmFzZS4KKwkgIENhbGN1bGF0ZXMgdGhlIGppdHRlciBhbmQgdHJhbnNpdCB0aW1lcyBvZiBkYXRhIHBhY2tldHMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmM6IChydHBfc3RhdHNfaW5pdF9kZWZhdWx0cyksCisJICAocnRwX3N0YXRzX2NhbGN1bGF0ZV9ydGNwX2ludGVydmFsKSwgKHJ0cF9zdGF0c19hZGRfcnRjcF9qaXR0ZXIpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgVmFyaW91cyBzdGF0cyByZWdhcmRpbmcgdGhlIHNlc3Npb24gYW5kIHNvdXJjZXMuCisJICBVc2VkIHRvIGNhbGN1bGF0ZSB0aGUgUlRDUCBpbnRlcnZhbC4KKworMjAwNy0wNC0xMyAwOToyMDo1NSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvOiBQcm90ZWN0IGxpc3RzIGFuZCBzdHJ1Y3R1cmVzIHdpdGggbG9ja3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChjcmVhdGVfc2Vzc2lvbiksIChnZXRfcHRfbWFwKSwKKwkgIChnc3RfcnRwX2Jpbl9pbml0KSwgKGdzdF9ydHBfYmluX2ZpbmFsaXplKSwgKG5ld19zc3JjX3BhZF9mb3VuZCksCisJICAoY3JlYXRlX3JlY3ZfcnRwKSwgKGdzdF9ydHBfYmluX3JlcXVlc3RfbmV3X3BhZCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBjbGllbnQuYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoZ3N0X3J0cF9zZXNzaW9uX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9pbml0KSwgKGdzdF9ydHBfc2Vzc2lvbl9maW5hbGl6ZSksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3JlY3ZfcnRwX3NpbmspLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9ldmVudF9yZWN2X3J0Y3Bfc2luayksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3JlY3ZfcnRjcCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX3JlcXVlc3RfbmV3X3BhZCk6CisJICBQcm90ZWN0IGxpc3RzIGFuZCBzdHJ1Y3R1cmVzIHdpdGggbG9ja3MuCisJICBSZXR1cm4gRkxPV19PSyBmcm9tIFJUQ1AgbWVzc2FnZXMgZm9yIG5vdy4KKworMjAwNy0wNC0xMiAwODoxODozMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IEVtaXQgcHQgbWFwIHJlcXVlc3RzIGFuZCBjYWNoZSByZXN1bHRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoY3JlYXRlX3Nlc3Npb24pLCAoZ2V0X3B0X21hcCksCisJICAoY3JlYXRlX3N0cmVhbSksIChnc3RfcnRwX2Jpbl9jbGFzc19pbml0KSwgKHB0X21hcF9yZXF1ZXN0ZWQpOgorCSAgRW1pdCBwdCBtYXAgcmVxdWVzdHMgYW5kIGNhY2hlIHJlc3VsdHMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jbGFzc19pbml0KSwKKwkgIChnc3Rfaml0dGVyX2J1ZmZlcl9zaW5rX3BhcnNlX2NhcHMpLAorCSAgKGdzdF9qaXR0ZXJfYnVmZmVyX3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2dldF9jbG9ja19yYXRlKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3ApOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOiAoZ3N0X3J0cF9wdF9kZW11eF9jaGFpbik6CisJICBFbWl0IHJlcXVlc3QtcHQtbWFwIHNpZ25hbHMuCisKKzIwMDctMDQtMTEgMTM6NDk6NTQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi1tYXJzaGFsLmxpc3Q6IFNvbWUgbW9yZSBjdXN0b20gbWFyc2hhbGxlcnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLW1hcnNoYWwubGlzdDoKKwkgIFNvbWUgbW9yZSBjdXN0b20gbWFyc2hhbGxlcnMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoY3JlYXRlX3Nlc3Npb24pLCAoZ2V0X3B0X21hcCksCisJICAoY2xvY2tfcmF0ZV9yZXF1ZXN0KSwgKGNyZWF0ZV9zdHJlYW0pLCAoZ3N0X3J0cF9iaW5fY2xhc3NfaW5pdCksCisJICAocHRfbWFwX3JlcXVlc3RlZCksIChuZXdfc3NyY19wYWRfZm91bmQpLCAoY3JlYXRlX3JlY3ZfcnRwKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICBQcmVwYXJlIGZvciBjYWNoaW5nIHB0IG1hcHMuCisJICBDb25uZWN0IHRvIHNpZ25hbHMgdG8gY29sbGVjdCBwdCBtYXBzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2xhc3NfaW5pdCksCisJICAoZ3N0X2ppdHRlcl9idWZmZXJfc2lua19zZXRjYXBzKSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJICBBZGQgcmVxdWVzdF9jbG9ja19yYXRlIHNpZ25hbC4KKwkgIFVzZSBzY2FsZSBpbnN0ZWF0IG9mIHNjYWxlX2ludCBiZWNhdXNlIHRoZSBsYXRlciBkb2VzIG5vdCBkZWFsIHdpdGgKKwkgIG5lZ2F0aXZlIG51bWJlcnMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzogKGdzdF9ydHBfcHRfZGVtdXhfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9wdF9kZW11eF9jaGFpbik6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguaDoKKwkgIEltcGxlbWVudCByZXF1ZXN0LXB0LW1hcCBzaWduYWwuCisKKzIwMDctMDQtMTAgMDk6MTQ6MDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyLzogQWRkZWQgY3VzdG9tIG1hcnNoYWxsZXJzIGZvciBzaWduYWxzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyLy5jdnNpZ25vcmU6CisJICAqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4tbWFyc2hhbC5saXN0OgorCSAgQWRkZWQgY3VzdG9tIG1hcnNoYWxsZXJzIGZvciBzaWduYWxzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGdzdF9ydHBfYmluX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgIFByZXBhcmUgZm9yIGVtaXRpbmcgcHQgbWFwIHNpZ25hbHMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzogKGdzdF9ydHBfcHRfZGVtdXhfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgKGdzdF9ydHBfc3NyY19kZW11eF9jbGFzc19pbml0KToKKwkgIEZpeCBzaWduYWxzLgorCisyMDA3LTA0LTA2IDEyOjI4OjI5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uKjogUHJvdmlkZSBhIGNsb2NrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoZ3N0X3J0cF9iaW5fY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9iaW5faW5pdCksIChnc3RfcnRwX2Jpbl9wcm92aWRlX2Nsb2NrKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICBQcm92aWRlIGEgY2xvY2suCisKKzIwMDctMDQtMDYgMTI6MDc6MzAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiBGaXggcGFkIHRlbXBsYXRlIG5hbWUgcGFyc2luZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGNyZWF0ZV9ydGNwKToKKwkgIEZpeCBwYWQgdGVtcGxhdGUgbmFtZSBwYXJzaW5nLgorCisyMDA3LTA0LTA1IDE2OjEwOjI0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogQWRkIHNvbWUgZGVidWcgYW5kIGNvbW1lbnRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9qaXR0ZXJfYnVmZmVyX3Npbmtfc2V0Y2FwcyksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKToKKwkgIEFkZCBzb21lIGRlYnVnIGFuZCBjb21tZW50cy4KKwkgIEZpeCBkb3VibGUgdW5yZWYoKSBpbiBlcnJvciBjYXNlcy4KKworMjAwNy0wNC0wNSAxMzo1NDoyMyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLio6IEFkZCBkZWJ1Z2dpbmcgY2F0ZWdvcnkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChmaW5kX3Nlc3Npb25fYnlfaWQpLAorCSAgKGNyZWF0ZV9zZXNzaW9uKSwgKGZpbmRfc3RyZWFtX2J5X3NzcmMpLCAoY3JlYXRlX3N0cmVhbSksCisJICAoZ3N0X3J0cF9iaW5fY2xhc3NfaW5pdCksIChuZXdfcGF5bG9hZF9mb3VuZCksCisJICAobmV3X3NzcmNfcGFkX2ZvdW5kKSwgKGNyZWF0ZV9yZWN2X3J0cCksIChjcmVhdGVfcmVjdl9ydGNwKSwKKwkgIChjcmVhdGVfc2VuZF9ydHApLCAoY3JlYXRlX3J0Y3ApOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgIEFkZCBkZWJ1Z2dpbmcgY2F0ZWdvcnkuCisJICBBZGRlZCBSVFBTdHJlYW0gdG8gbWFuYWdlIHN0cmVhbSBwZXIgU1NSQywgZWFjaCB3aXRoIGl0cyBvd24KKwkgIGppdHRlcmJ1ZmZlciBhbmQgcHRkZW11eC4KKwkgIEFkZGVkIFNTUkNEZW11eC4KKwkgIENvbm5lY3QgdG8gdmFyaW91cyBTU1JDIGFuZCBQVCBzaWduYWxzIGFuZCBjcmVhdGUgZ2hvc3RwYWRzLCBsaW5rIHN0dWZmLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtYW5hZ2VyLmM6IChwbHVnaW5faW5pdCk6CisJICBBZGRlZCBydHBiaW4gdG8gZWxlbWVudHMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzogKGdzdF9ydHBfcHRfZGVtdXhfY2hhaW4pOgorCSAgRml4IGNhcHMgYW5kIGZvcndhcmQgR3N0Rmxvd1JldHVybgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3JlY3ZfcnRwX3NpbmspLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9jaGFpbl9yZWN2X3J0cCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3JlY3ZfcnRjcF9zaW5rKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fY2hhaW5fcmVjdl9ydGNwKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fZXZlbnRfc2VuZF9ydHBfc2luayksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3NlbmRfcnRwKSwgKGNyZWF0ZV9yZWN2X3J0cF9zaW5rKSwKKwkgIChjcmVhdGVfcmVjdl9ydGNwX3NpbmspLCAoY3JlYXRlX3NlbmRfcnRwX3NpbmspLCAoY3JlYXRlX3J0Y3Bfc3JjKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fcmVxdWVzdF9uZXdfcGFkKToKKwkgIEFkZCBkZWJ1ZyBjYXRlZ29yeS4KKwkgIEFkZCBldmVudCBoYW5kbGluZworCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzogKGZpbmRfcnRwX3BhZF9mb3Jfc3NyYyksCisJICAoY3JlYXRlX3J0cF9wYWRfZm9yX3NzcmMpLCAoZ3N0X3J0cF9zc3JjX2RlbXV4X2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfc3NyY19kZW11eF9pbml0KSwgKGdzdF9ydHBfc3NyY19kZW11eF9jaGFpbiksCisJICAoZ3N0X3J0cF9zc3JjX2RlbXV4X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5oOgorCSAgQWRkIGRlYnVnIGNhdGVnb3J5LgorCSAgQWRkIG5ldy1wdC1wYWQgc2lnbmFsLgorCisyMDA3LTA0LTA0IDEwOjIzOjE1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci86IEFkZGVkIHNpbXBsZSBTU1JDIGRlbXV4ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG1hbmFnZXIuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6IChmaW5kX3BhZF9mb3Jfc3NyYyksCisJICAoY3JlYXRlX3BhZF9mb3Jfc3NyYyksIChnc3RfcnRwX3NzcmNfZGVtdXhfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX3NzcmNfZGVtdXhfY2xhc3NfaW5pdCksIChnc3RfcnRwX3NzcmNfZGVtdXhfaW5pdCksCisJICAoZ3N0X3J0cF9zc3JjX2RlbXV4X2ZpbmFsaXplKSwgKGdzdF9ydHBfc3NyY19kZW11eF9zaW5rX2V2ZW50KSwKKwkgIChnc3RfcnRwX3NzcmNfZGVtdXhfY2hhaW4pLCAoZ3N0X3J0cF9zc3JjX2RlbXV4X3NyY19ldmVudCksCisJICAoZ3N0X3J0cF9zc3JjX2RlbXV4X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5oOgorCSAgQWRkZWQgc2ltcGxlIFNTUkMgZGVtdXhlci4KKworMjAwNy0wNC0wMyAxMTozNTozOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvOiBTb21lIG1vcmUgZ2hvc3RwYWQgbWFnaWMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChmaW5kX3Nlc3Npb25fYnlfaWQpLAorCSAgKGNyZWF0ZV9zZXNzaW9uKSwgKGdzdF9ydHBfYmluX2Jhc2VfaW5pdCksIChjcmVhdGVfcmVjdl9ydHApLAorCSAgKGNyZWF0ZV9yZWN2X3J0Y3ApLCAoY3JlYXRlX3NlbmRfcnRwKSwgKGNyZWF0ZV9ydGNwKSwKKwkgIChnc3RfcnRwX2Jpbl9yZXF1ZXN0X25ld19wYWQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwY2xpZW50LmM6CisJICBTb21lIG1vcmUgZ2hvc3RwYWQgbWFnaWMuCisKKzIwMDctMDQtMDMgMDk6NTE6MTMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOiBBZGQgLmggZmlsZSBzbyBpdCBjYW4gYmUgZGlzdGVkIHByb3Blcmx5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSAgQWRkIC5oIGZpbGUgc28gaXQgY2FuIGJlIGRpc3RlZCBwcm9wZXJseS4KKworMjAwNy0wNC0wMyAwOToxMzoxNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgQWRkIFJUUCBzZXNzaW9uIG1hbmFnZW1lbnQgZWxlbWVudHMuIFN0aWxsIGluIHByb2dyZXNzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHBtYW5hZ2VyL2FzeW5jX2ppdHRlcl9xdWV1ZS5jOiAoYXN5bmNfaml0dGVyX3F1ZXVlX25ldyksCisJICAoc2lnbmFsX3dhaXRpbmdfdGhyZWFkcyksIChhc3luY19qaXR0ZXJfcXVldWVfcmVmKSwKKwkgIChhc3luY19qaXR0ZXJfcXVldWVfcmVmX3VubG9ja2VkKSwKKwkgIChhc3luY19qaXR0ZXJfcXVldWVfc2V0X2xvd190aHJlc2hvbGQpLAorCSAgKGFzeW5jX2ppdHRlcl9xdWV1ZV9zZXRfaGlnaF90aHJlc2hvbGQpLAorCSAgKGFzeW5jX2ppdHRlcl9xdWV1ZV9zZXRfbWF4X3F1ZXVlX2xlbmd0aCksCisJICAoYXN5bmNfaml0dGVyX3F1ZXVlX2dldF9nX3F1ZXVlKSwgKGNhbGN1bGF0ZV90c19kaWZmKSwKKwkgIChhc3luY19qaXR0ZXJfcXVldWVfbGVuZ3RoX3RzX3VuaXRzX3VubG9ja2VkKSwKKwkgIChhc3luY19qaXR0ZXJfcXVldWVfdW5yZWZfYW5kX3VubG9jayksIChhc3luY19qaXR0ZXJfcXVldWVfdW5yZWYpLAorCSAgKGFzeW5jX2ppdHRlcl9xdWV1ZV9sb2NrKSwgKGFzeW5jX2ppdHRlcl9xdWV1ZV91bmxvY2spLAorCSAgKGFzeW5jX2ppdHRlcl9xdWV1ZV9wdXNoKSwgKGFzeW5jX2ppdHRlcl9xdWV1ZV9wdXNoX3VubG9ja2VkKSwKKwkgIChhc3luY19qaXR0ZXJfcXVldWVfcHVzaF9zb3J0ZWQpLAorCSAgKGFzeW5jX2ppdHRlcl9xdWV1ZV9wdXNoX3NvcnRlZF91bmxvY2tlZCksCisJICAoYXN5bmNfaml0dGVyX3F1ZXVlX2luc2VydF9hZnRlcl91bmxvY2tlZCksCisJICAoYXN5bmNfaml0dGVyX3F1ZXVlX3BvcF9pbnRlcm5fdW5sb2NrZWQpLCAoYXN5bmNfaml0dGVyX3F1ZXVlX3BvcCksCisJICAoYXN5bmNfaml0dGVyX3F1ZXVlX3BvcF91bmxvY2tlZCksIChhc3luY19qaXR0ZXJfcXVldWVfbGVuZ3RoKSwKKwkgIChhc3luY19qaXR0ZXJfcXVldWVfbGVuZ3RoX3VubG9ja2VkKSwKKwkgIChhc3luY19qaXR0ZXJfcXVldWVfc2V0X2ZsdXNoaW5nX3VubG9ja2VkKSwKKwkgIChhc3luY19qaXR0ZXJfcXVldWVfdW5zZXRfZmx1c2hpbmdfdW5sb2NrZWQpLAorCSAgKGFzeW5jX2ppdHRlcl9xdWV1ZV9zZXRfYmxvY2tpbmdfdW5sb2NrZWQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9hc3luY19qaXR0ZXJfcXVldWUuaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChnc3RfcnRwX2Jpbl9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfYmluX2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9iaW5faW5pdCksCisJICAoZ3N0X3J0cF9iaW5fZmluYWxpemUpLCAoZ3N0X3J0cF9iaW5fc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX2Jpbl9nZXRfcHJvcGVydHkpLCAoZ3N0X3J0cF9iaW5fY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcnRwX2Jpbl9yZXF1ZXN0X25ld19wYWQpLCAoZ3N0X3J0cF9iaW5fcmVsZWFzZV9wYWQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwY2xpZW50LmM6IChuZXdfcGFkKSwgKGNyZWF0ZV9zdHJlYW0pLAorCSAgKGZyZWVfc3RyZWFtKSwgKGZpbmRfc3RyZWFtX2J5X3NzcmMpLCAoZ3N0X3J0cF9jbGllbnRfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX2NsaWVudF9jbGFzc19pbml0KSwgKGdzdF9ydHBfY2xpZW50X2luaXQpLAorCSAgKGdzdF9ydHBfY2xpZW50X2ZpbmFsaXplKSwgKGdzdF9ydHBfY2xpZW50X3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9jbGllbnRfZ2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBfY2xpZW50X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3J0cF9jbGllbnRfcmVxdWVzdF9uZXdfcGFkKSwgKGdzdF9ydHBfY2xpZW50X3JlbGVhc2VfcGFkKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwY2xpZW50Lmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jbGFzc19pbml0KSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9pbml0KSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZGlzcG9zZSksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0Y2FwcyksCisJICAoZ3N0X2ppdHRlcl9idWZmZXJfc2lua19zZXRjYXBzKSwgKGZyZWVfZnVuYyksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoX3N0YXJ0KSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZmx1c2hfc3RvcCksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NyY19hY3RpdmF0ZV9wdXNoKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhbmdlX3N0YXRlKSwgKHByaXZfY29tcGFyZV9ydHBfc2VxX2x0KSwKKwkgIChjb21wYXJlX3J0cF9idWZmZXJzX3NlcV9udW0pLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpbmtfZXZlbnQpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbiksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfbG9vcCksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3F1ZXJ5KSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG1hbmFnZXIuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOiAoZ3N0X3J0cF9wdF9kZW11eF9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfcHRfZGVtdXhfY2xhc3NfaW5pdCksIChnc3RfcnRwX3B0X2RlbXV4X2luaXQpLAorCSAgKGdzdF9ydHBfcHRfZGVtdXhfZmluYWxpemUpLCAoZ3N0X3J0cF9wdF9kZW11eF9jaGFpbiksCisJICAoZ3N0X3J0cF9wdF9kZW11eF9nZXRjYXBzKSwgKGZpbmRfcGFkX2Zvcl9wdCksCisJICAoZ3N0X3J0cF9wdF9kZW11eF9zZXR1cCksIChnc3RfcnRwX3B0X2RlbXV4X3JlbGVhc2UpLAorCSAgKGdzdF9ydHBfcHRfZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fY2xhc3NfaW5pdCksIChnc3RfcnRwX3Nlc3Npb25faW5pdCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2ZpbmFsaXplKSwgKGdzdF9ydHBfc2Vzc2lvbl9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9nZXRfcHJvcGVydHkpLCAoZ3N0X3J0cF9zZXNzaW9uX2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3JlY3ZfcnRwKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fY2hhaW5fcmVjdl9ydGNwKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fY2hhaW5fc2VuZF9ydHApLCAoY3JlYXRlX3JlY3ZfcnRwX3NpbmspLAorCSAgKGNyZWF0ZV9yZWN2X3J0Y3Bfc2luayksIChjcmVhdGVfc2VuZF9ydHBfc2luayksIChjcmVhdGVfcnRjcF9zcmMpLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9yZXF1ZXN0X25ld19wYWQpLCAoZ3N0X3J0cF9zZXNzaW9uX3JlbGVhc2VfcGFkKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5oOgorCSAgQWRkIFJUUCBzZXNzaW9uIG1hbmFnZW1lbnQgZWxlbWVudHMuIFN0aWxsIGluIHByb2dyZXNzLgorCisyMDA5LTA4LTEwIDEzOjMwOjIzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHB1c2ggbW9kZTsgY2F0ZXIgZm9yIGNodW5rIHBhZGRpbmcKKworMjAwOS0wOC0wNCAxOTo0NTo0MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBvbmx5IHVzZSBzdHJlYW0ncyBwYWQgYWZ0ZXIgaGF2aW5nIGNoZWNrZWQgaXQgZXhpc3RzCisKKzIwMDktMDgtMDQgMTM6Mzg6MDkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogc3ByaW5rbGUgc29tZSBtb3JlIEdTVF9ERUJVR19GVU5DUFRSCisKKzIwMDktMDgtMDQgMTM6MzY6MzYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogcG9zdCBlcnJvciBtZXNzYWdlIGlmIG5vIHBhZHMgdG8gcHVzaCBFT1MgZXZlbnQgb24KKworMjAwOS0wOC0wNCAxMTozOTo1OSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggdHlwbyBpbiB3YXJuaW5nIG1lc3NhZ2UKKworMjAwOS0wOC0wNCAxMTozOTozOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggc29tZSBidWZmZXIgcmVmIGhhbmRsaW5nCisKKzIwMDktMDgtMDQgMTE6Mzc6MTYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogZG8gbm90IGV4Y2VlZCBtYXhpbXVtIG51bWJlciBvZiBzdXBwb3J0ZWQgc3RyZWFtcworCisyMDA5LTA4LTA0IDExOjM1OjE4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHByZXZlbnQgZG91YmxlIHVucmVmOyBnc3RfYXZpX2RlbXV4X3BhcnNlX2F2aWggYWxyZWFkeSB1bnJlZnMKKworMjAwOS0wOC0wNCAxMTozMjoyNyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiB2ZXJpZnkgc2l6ZSBvZiBJTkZPIExJU1QgdG8gc2F0aXNmeSBzdWJzZXF1ZW50IGV4cGVjdGF0aW9ucworCisyMDA5LTA3LTI5IDE1OjI1OjM4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGNoZWNrIHZpZGVvIHN0cmVhbSBmcmFtZXJhdGUgYWdhaW5zdCBhdmkgaGVhZGVyIGZyYW1lIGR1cmF0aW9uCisJICBUaGUgZm9ybWVyIG1pZ2h0IGJlIGJvZ3VzIGluIHNpbGx5IGNhc2VzLCBhbmQgdGhlIGxhdHRlciBzZWVtcyB0bworCSAgY2FycnkgbW9yZSB3ZWlnaHQuCisKKzIwMDktMDgtMDQgMTI6MTY6MTMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogc3RyZWFtbGluZSBzdHJlYW0gZHVyYXRpb24gY2FsY3VsYXRpb24KKworMjAwOS0wNy0wMyAxNDowNDoxMyArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJICBkdjEzOTRzcmM6IEZpeCBlbGVtZW50IGZvciBsaXZlIHVzYWdlLi4uIHdoaWNoIGhhcyBiZWVuIGJyb2tlbiBmb3IgMiB5ZWFycyA6KAorCSAgVGhpcyBpcyBhIGxpdmUgc291cmNlLCB0aGVyZWZvcmU6CisJICAqIFVzZSBHU1RfRk9STUFUX1RJTUUgYXMgdGhlIGRlZmF1bHQgZm9ybWF0CisJICAqIHNldF90aW1lc3RhbXAgdG8gVHJ1ZQorCSAgKiBwcm9wZXJseSBpbXBsZW1lbnQgcXVlcnkgbGF0ZW5jeS4KKwkgIFRoaXMgYWxsb3dzIGV4cGVjdGVkIGxpdmUgdXNhZ2UgbGlrZSA6IHBsYXliaW4yIHVyaT1kdjovLworCisyMDA5LTA4LTA5IDA5OjQzOjQxICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkgIHJhdzEzOTQ6IFJlbW92ZSB1bm5lZWRlZCB2YXJpYWJsZQorCisyMDA5LTA4LTA5IDA5OjQzOjI5ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thOiByZW1vdmUgZGVhZCBhc3NpZ25tZW50cworCisyMDA5LTA4LTA5IDA5OjQzOjAwICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkgIHJ0cDogUmVtb3ZlIGRlYWQgYXNzaWdubWVudHMgYW5kIHJlc3VsdGluZyB1bm5lZWRlZCB2YXJpYWJsZXMuCisKKzIwMDktMDgtMTAgMDk6NTM6MjggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvd2F2cGFjay9NYWtlZmlsZS5hbToKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuaDoKKwkqIGV4dC93YXZwYWNrL21kNS5jOgorCSogZXh0L3dhdnBhY2svbWQ1Lmg6CisJICB3YXZwYWNrOiBVc2UgR0xpYiBHQ2hlY2tzdW0gaW5zdGVhZCBvZiBvdXIgb3duIE1ENSBpbXBsZW1lbnRhdGlvbgorCSAgVGhpcyByZXF1aXJlcyBHTGliIDIuMTYgYnV0IHRoYXQgdmVyc2lvbiBpcyBhbHJlYWR5IHJlcXVpcmVkIGJ5IGNvcmUgYW55d2F5LgorCisyMDA5LTA4LTA4IDAwOjQ3OjQ4IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5icj4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJICBtYXRyb3NrYTogQWRkcyBzdXBwb3J0IHRvIG11eGluZy9kZW11eGluZyBXTUEKKwkgIEFkZHMgc3VwcG9ydCBmb3IgbXV4aW5nIHdtYSBhdWRpbyBmYW1pbHkgYW5kIGZpeGVzCisJICBkZW11eGluZyBvZiB3bWEgZmFtaWx5IGluIG1hdHJvc2thZGVtdXguIG1hdHJvc2thZGVtdXgKKwkgIHdhcyBicm9rZW4gYmVjYXVzZSBpdCBtaXNzZWQgY29kZWNfZGF0YS4KKworMjAwOS0wOC0wNiAyMDoxNToxNyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnI+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBhZGRzIHN1cHBvcnQgZm9yIHdtdiBmYW1pbHkKKwkgIEFkZHMgc3VwcG9ydCB0byBXTVYxLCBXTVYyLCBXTVYzIGFuZCBvdGhlciBmYW1pbHkgZm9ybWF0cyB0aGF0CisJICBhcmUgc2lnbmFsZWQgYnkgdGhlICdmb3JtYXQnIGZpZWxkIGluIHRoZSBjYXBzIChpLmUuIFdWQzEpLgorCSAgUGFydGlhbGx5IGZpeGVzICM1NzYzNzgKKworMjAwOS0wOC0wOSAxNDoxOTo0MiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJzcmM6IGlmIG1heCA9PSBtaW4gd2lkdGgvaGVpZ2h0IHB1dCBhbiBpbnQgaW4gdGhlIHByb2JlZCBjYXBzLCBub3QgYW4gaW50IHJhbmdlCisJICBGaXhlcyAjNTYwMDMzLgorCisyMDA5LTA4LTA5IDEzOjU4OjA3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJICBvc3hhdWRpb3NyYzogaWYgbWF4X2NoYW5uZWxzID09IG1pbl9jaGFubmVscywgdXNlIGFuIGludCBpbnN0ZWFkIG9mIGFuIGludCByYW5nZSBpbiB0aGUgY2FwcworCisyMDA5LTA4LTA5IDEyOjUyOjE3ICswMjAwICBMb25lU3RhciA8bG9uZUBhdXZ0ZWNoLmNvbT4KKworCSogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6CisJICBpZDNkZW11eDogVHJ5IEdTVF8qX1RBR19FTkNPRElORyBhbmQgbG9jYWxlIGVuY29kaW5nIGlmIHRhZ3MgYXJlIG5vdCBVVEY4CisJICBGaXhlcyBidWcgIzQ5OTI0Mi4KKworMjAwOS0wOC0wOSAwMToyOTo1MCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogYnVtcCBjb3JlL2Jhc2UgcmVxdWlyZW1lbnRzIHRvIGxhdGVzdCByZWxlYXNlCisJICBUbyBhdm9pZCBjb25mdXNpb24uCisKKzIwMDktMDgtMDkgMDE6Mjc6MDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9mbHZtdXguYzoKKwkgIGNoZWNrOiBmaXggZmx2bXV4IHVuaXQgdGVzdCBvbiBiaWcgZW5kaWFuIG1hY2hpbmVzCisJICBmbHZtdXggb25seSBhY2NlcHRzIHJhdyBhdWRpbyBpbiBsaXR0bGUgZW5kaWFuLCBidXQgYXVkaW90ZXN0c3JjCisJICBwcm9kdWNlcyBhdWRpbyBpbiB0aGUgbmF0aXZlIGVuZGlhbm5lc3MsIHdoaWNoIG1ha2VzIGxpbmtpbmcKKwkgIGJldHdlZW4gYXVkaW90ZXN0c3JjIGFuZCBmbHZtdXggZmFpbCBvbiBiaWcgZW5kaWFuIG1hY2hpbmVzLiBBZGQKKwkgIGFuIGF1ZGlvY29udmVydCBlbGVtZW50IGluIGJldHdlZW4gdGhlIHR3byB0byBmaXggdGhpcy4KKworMjAwOS0wMi0xNSAxODo0OTo0NCArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDxvZ2cuay5vZ2cua0Bnb29nbGVtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYTogYWRkIGthdGUgc3VidGl0bGUgc3VwcG9ydCB0byBtYXRyb3NrYSBtdXhlciBhbmQgZGVtdXhlcgorCSAgU2VlICM1MjU3NDMuCisKKzIwMDktMDgtMDcgMTY6NTE6NDUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaWQzZGVtdXgvaWQzdjIuMy4wLmh0bWw6CisJICBpZDNkZW11eDogYWRkIElEMyB2Mi4zIHNwZWMgYXMgd2VsbAorCisyMDA5LTA4LTA3IDE2OjQyOjM5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6CisJICBpZDNkZW11eDogc2l6ZXMgaW4gSUQzIHYyLjMgYXJlIHVubGlrZWx5IHRvIGJlIHN5bmMtc2FmZSBpbnRlZ2VycworCSAgSW4gSUQzIHYyLjMgY29tcHJlc3NlZCBmcmFtZXMgd2lsbCBoYXZlIGEgNC1ieXRlIGRhdGEgbGVuZ3RoIGluZGljYXRvcgorCSAgYWZ0ZXIgdGhlIGZyYW1lIGhlYWRlciB0byBpbmRpY2F0ZSB0aGUgc2l6ZSBvZiB0aGUgZGVjb21wcmVzc2VkIGRhdGEuCisJICBUaGlzIGludGVnZXIgaXMgdW5saWtlbHkgdG8gYmUgYSBzeW5jLXNhZmUgaW50ZWdlciBmb3IgdjIuMyB0YWdzLAorCSAgb25seSBpbiB2Mi40IGl0J3Mgc3luYy1zYWZlLgorCisyMDA5LTA4LTA3IDE2OjM2OjU1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzoKKwkgIGlkM2RlbXV4OiBmaXggdHlwbyBpbiBkZWJ1ZyBtZXNzYWdlCisKKzIwMDktMDgtMDcgMTY6MDI6MjMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaWQzZGVtdXgvaWQzdGFncy5jOgorCSogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuaDoKKwkqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzZGVtdXguYzoKKwkqIHRlc3RzL2ZpbGVzL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZmlsZXMvaWQzLTU4ODE0OC11bnN5bmNlZC12MjQudGFnOgorCSAgaWQzZGVtdXg6IGZpeCBwYXJzaW5nIG9mIHVuc3luYydlZCBJRDMgdjIuNCB0YWdzIGFuZCBmcmFtZXMKKwkgIFJldmVyc2luZyB0aGUgdW5zeW5jaHJvbmlzYXRpb24gc2VlbXMgdG8gd29yayBzbGlnaHRseSBkaWZmZXJlbnRseQorCSAgZm9yIElEMyB2Mi4zIHRhZ3MgYW5kIHYyLjQgdGFnczogdjIuMyB0YWdzIGRvbid0IGhhdmUgc3luY3NhZmUgZnJhbWUKKwkgIHNpemVzIGluIHRoZSBmcmFtZSBoZWFkZXIsIHNvIHRoZSB1bnN5bmNocm9uaXNhdGlvbiBpcyBhcHBsaWVkIHRvCisJICB0aGUgd2hvbGUgZnJhbWUgZGF0YSBpbmNsdWRpbmcgYWxsIHRoZSBmcmFtZSBoZWFkZXJzLiB2Mi40IGZyYW1lcworCSAgaGF2ZSBzeW5jLXNhZmUgc2l6ZXMsIGhvd2V2ZXIsIHNvIHRoZSB1bnN5bmNocm9uaXNhdGlvbiBvbmx5IG5lZWRzCisJICB0byBiZSBhcHBsaWVkIHRvIHRoZSBhY3R1YWwgZnJhbWUgZGF0YSwgYW5kIGl0IHNlZW1zIHRoYXQncyB3aGF0J3MKKwkgIGJlaW5nIGRvbmUgYXMgd2VsbC4gU28gd2UgbmVlZCB0byB1bmRvIHRoZSB1bnN5bmNocm9uaXNhdGlvbiBvbiBhCisJICBwZXItZnJhbWUgYmFzaXMgZm9yIHYyLjQgdGFncyBmb3IgdGhpbmdzIHRvIHdvcmsgcHJvcGVybHkuCisJICBGaXhlcyBleHRyYWN0aW9uIG9mIGNvdmVyYXJ0L2ltYWdlcyBmcm9tIEFQSUMgZnJhbWVzIGluIElEMyB2Mi40CisJICB0YWdzICgjNTg4MTQ4KS4KKwkgIEFkZCB1bml0IHRlc3QgZm9yIHRoaXMgYXMgd2VsbC4KKworMjAwOS0wOC0wNiAyMToyNDoxNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogVXNlIFNPVVBfTUVUSE9EX0dFVCBpbnN0ZWFkIG9mICJHRVQiIHN0cmluZworCSAgRml4ZXMgYnVnICM1OTA5NzAuCisKKzIwMDktMDgtMDYgMTM6MDA6NTkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2VzcmM6IHNldCB0aGUgZGVmYXVsdCBzbGF2ZSBtZXRob2QgdG8gc2tldworCSAgU2V0IHRoZSBkZWZhdWx0IHNsYXZlIG1ldGhvZCB0byB0aGUgbXVjaCBiZXR0ZXIgc2tldyBhbGdvcml0aG0uIFRoaXMgaXMgdGhlCisJICBkZWZhdWx0IGluIHRoZSBuZXcgYmFzZSBjbGFzcyBidXQgd2Ugb3ZlcnJpZGUgdGhpcyBoZXJlIGFzIHdlbGwgZm9yIHRoZQorCSAgdXBjb21taW5nIHJlbGVhc2UuCisKKzIwMDktMDgtMDYgMTA6MjA6MzQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBmaXggY29tcGlsYXRpb24gd2l0aCAtLWRpc2FibGUtZ3N0LWRlYnVnCisKKzIwMDktMDgtMDMgMTg6NTk6MzIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJICBydHBoMjY0cGF5OiB1c2UgYXJyYXkgaW5zdGVhZCBvZiBxdWV1ZQorCisyMDA5LTA4LTAzIDE4OjU1OjE5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuaDoKKwkgIHJ0cGgyNjRwYXk6IHB1c2ggTkFMcyBvbmx5IGFmdGVyIFNQUy9QUFMKKwkgIHBhcnNlIGNvbXBsZXRlIChieXRlc3RyZWFtKSBidWZmZXIgZm9yIFNQUy9QUFMgYmVmb3JlIHB1c2hpbmcgTkFMcy4KKwkgIEZpeGVzICM1NjQ1MDEuCisKKzIwMDktMDgtMDQgMTQ6NDQ6MzYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmg6CisJICB2NGwyOiBEaXJlY3RseSB1c2UgR1NUX1BUUl9GT1JNQVQgZm9yIHByaW50aW5nIGNhcHMgd2l0aCB0aGUgTE9HX0NBUFMgbWFjcm8KKworMjAwOS0wOC0wNCAxMToxNzoxNyArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSAgcnRwcWRtMmRlcGF5OiBGaXggZGVidWcgc3RhdGVtZW50LgorCisyMDA5LTA4LTA0IDA5OjMyOjA3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuaDoKKwkgIHY0bDI6IFJlbW92ZSBzb21lIE9NQVAgc3BlY2lmaWMgaGFja3MKKwkgIFRoZXkgcmVxdWlyZSBzcGVjaWFsIGJ1aWxkIGZsYWdzIGFuZCBhcmUgbm90IHVzZWZ1bCBpbiBnZW5lcmFsLgorCisyMDA5LTA4LTA0IDA5OjIyOjI5ICswMjAwICBSb2IgQ2xhcmsgPHJvYkB0aS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDJzaW5rOiBjaGFuZ2Ugd2hlcmUgYnVmZmVycyBnZXQgZGVxdWV1ZWQKKwkgIEl0IHNlZW1zIHRvIGNhdXNlIHN0cmFuZ2Ugb2NjYXNpb25hbCBoaWdoIGxhdGVuY2llcyAoYWxtb3N0IDIwMG1zKSB3aGVuIGRlcXVldWluZyBidWZmZXJzIGZyb20gX2J1ZmZlcl9hbGxvYygpLiAgSXQgaXMgc2ltcGxlciBhbmQgc2VlbXMgdG8gd29yayBtdWNoIGJldHRlciB0byBkcWJ1ZiBmcm9tIHRoZSBzYW1lIHRocmVhZCB0aGF0IGlzIHF1ZXVpbmcgdGhlIG5leHQgYnVmZmVyLgorCisyMDA5LTA4LTA0IDA5OjE0OjIwICswMjAwICBSb2IgQ2xhcmsgPHJvYkB0aS5jb20+CisKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSogc3lzL3Y0bDIvZ3N0djRsMi5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuaDoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuaDoKKwkgIHY0bDI6IEFkZCB2NGwyc2luayBlbGVtZW50CisJICBUaGlzIGFsc28gZG9lcyB0aGUgZm9sbG93aW5nIGNoYW5nZXM6CisJICAoMSkgcHVsbCB0aGUgYnVmZmVycG9vbCBjb2RlIG91dCBpbnRvIGdzdHY0bDJidWZmZXJwb29sLmMsIGFuZCBtYWtlIGEKKwkgIGJpdCBtb3JlIGdlbmVyaWMgc28gaXQgY2FuIGJlIHVzZWQgYm90aCBmb3IgdjRsMnNyYyBhbmQgdjRsMnNpbmsKKwkgICgyKSBtb3ZlIHNvbWUgb2YgdGhlIGRldmljZSBwcm9iaW5nL2NvbmZpZ3VyYXRpb24vY2FwcyBzdHVmZiBpbnRvCisJICBnc3R2NGwyb2JqZWN0LmMgc28gaXQgZG9lcyBub3QgaGF2ZSB0byBiZSBkdXBsaWNhdGVkIGJldHdlZW4KKwkgIHY0bDJzcmMgYW5kIHY0bDJzaW5rCisJICBGaXhlcyBidWcgIzU5MDI4MC4KKworMjAwOS0wOC0wNCAwNzowNzo0NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgZmx2bXV4OiBFbmFibGUgdW5pdCB0ZXN0IG5vdyB0aGF0IGl0IHBhc3NlcworCisyMDA5LTA4LTAzIDIxOjIxOjM5ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSAgcnRwcWRtMmRlcGF5LHJ0cHN2M3ZkZXBheTogQWRkIGRlYnVnZ2luZyBjYXRlZ29yeS4KKworMjAwOS0wOC0wMyAyMToyMjo0OCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5oOgorCSAgcnRwcWRtMmRlcGF5OiBIYW5kbGUgZ2FwcyBpbiBpbmNvbWluZyBwYWNrZXRzLgorCSAgV2hlbmV2ZXIgd2Ugc2VlIGEgZ2FwLCB3ZSBmbHVzaCB0aGUgdGVtcG9yYXJ5IHBhY2tldHMgKGJ1dCBub3QgdGhlIGFkYXB0ZXIpLiBJZiB3ZQorCSAgaGFkIHNvbWUgZGF0YSB0ZW1wb3JhcmlseSBzdG9yZWQgaXQgd2lsbCBiZSBvdXRwdXR0ZWQgKHRoZSBzb3VuZCB3aWxsIHNvdW5kIGEgYml0CisJICBnYXJibGVkLi4uIGJ1dCB0aGF0J3MgaG93IGl0IHNvdW5kcyBvbiBNYWNPU1ggOikKKworMjAwOS0wOC0wMyAxOTowMTowNyArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSAgcnRwcWRtZGVwYXk6IEZpeCBDUkMgY2FsY3VsYXRpb24gYW5kIHJlbW92ZSBjb21tZW50ZWQgY29kZS4KKworMjAwOS0wOC0wMiAxMzo0MjoxMiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFkbWRlcGF5Lmg6CisJICBydHA6IE5ldyBRRE0yIHJ0cCBkZXBheWxvYWRlci4KKwkgIFJldmVyc2UtZW5naW5lZXJlZCBieSBjb21wYXJpbmc6CisJICAqIEEgcnRwIGhpbnRlZCBmaWxlIHByb3ZpZGVkIGJ5IERhcndpblN0cmVhbWluZ1NlcnZlcgorCSAgKiBUaGUgb3V0cHV0IHByb2N1ZWQgYnkgRFNTIGZvciB0aGF0IHNhbWUgZmlsZQorCSAgQWxzbyB1c2VkIHZhcmlvdXMgc3RyZWFtaW5nIHNvdXJjZXMgYXZhaWxhYmxlIG9uIHRoZSBpbnRlcm5ldCB0byBmaW5lLXR1bmUKKwkgIHRoZSBjb2RlLgorCSAgVGhlIGhlYWRlci9jb2RlY19kYXRhIGV4dHJhY3Rpb24gbWV0aG9kcyBhcmUgZnJvbSBGRk1wZWcgKExHUEwpLgorCisyMDA5LTA4LTAzIDIxOjI0OjQ0ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSAgcnRwc3YzdmRlcGF5OiBQcm9wZXJseSBmaWxsIGNvZGVjX2RhdGEgYW5kIGNsZWFudXAgY29kZSBhIGJpdGUgbW9yZS4KKworMjAwOS0wOC0wMyAxOTowMjoxNyArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5Lmg6CisJICBydHBzdjN2ZGVwYXk6IE9ubHkgb3V0cHV0IGJ1ZmZlcnMgb25jZSB3ZSdyZSBjb25maWd1cmVkLgorCisyMDA5LTA4LTAzIDE5OjAyOjAwICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSAgcnRwc3YzdmRlcGF5OiBBZGQgbW9yZSBlbmNvZGluZy1uYW1lIHZhcmlhbnRzCisKKzIwMDktMDgtMDMgMjA6MDg6MzMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9mbHZtdXguYzoKKwkgIGZsdm11eDogRml4IHVuaXQgdGVzdCB0byBjb3JyZWN0bHkgaGFuZGxlIHJlcXVlc3QgcGFkcworCSAgUmVxdWVzdCBwYWRzIGFyZSByZW1vdmVkIGJ5IHRoZSBlbGVtZW50IGluc3RhbmNlIGluIFBBVVNFRC0+UkVBRFkKKwkgIHNvIHdlIG5lZWQgdG8gcmUtcmVxdWVzdCBwYWRzIGZvciBldmVyeSBydW4gYW5kIGxpbmsgdGhlbSBhZ2Fpbi4KKwkgIExhc3QgZml4IGZvciBidWcgIzU5MDQ0Ny4KKworMjAwOS0wOC0wMyAyMDowODowMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IEZpeCB3cml0aW5nIG9mIHRoZSBpbmRleCBmb3IgPCAxMjggYnVmZmVycworCSAgUGFydGlhbGx5IGZpeGVzIGJ1ZyAjNTkwNDQ3LgorCisyMDA5LTA4LTAzIDIwOjA3OjAwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogRml4IHJlc2V0dGluZyBvZiB0aGUgZWxlbWVudAorCSAgUmVzZXQgdGhlIGhhdmVfdmlkZW8vaGF2ZV9hdWRpbyBmbGFncyBhbmQgbWFrZSBzdXJlIHRvCisJICBwcm9wZXJseSByZWxlYXNlIHRoZSByZXF1ZXN0IHBhZHMuCisJICBQYXJ0aWFsbHkgZml4ZXMgYnVnICM1OTA0NDcuCisKKzIwMDktMDgtMDMgMTg6MTM6NDYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGRvbid0IGFkZCBub24tdXRmOCBjaGFycyB0byBzdHJ1Y3R1cmVzCisKKzIwMDktMDgtMDMgMTg6MDI6MzEgKzAyMDAgIEx1YyBEZXNjaGVuYXV4IDxsdWMuZGVzY2hlbmF1eCBhdCBmcmVlc3VyZi5jaD4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5Lmg6CisJICBqcGVnZGVwYXk6IHVzZSBhdHRyaWJ1dGVzIGZvciBleHRyYSBwcm9wZXJ0aWVzCisJICBVc2Ugc29tZSBvZiB0aGUgU0RQIGF0dHJpYnV0ZXMgd2hlbiB0aGV5IGFyZSBwcmVzZW50IHRvIHNwZWNpZnkgdGhlIG91dHB1dAorCSAgZGltZW5zaW9uIGFuZCBmcmFtZXJhdGUuIFRoaXMgYWxsb3dzIHVzIHRvIHJlY2VpdmUganBlZyBmcmFtZXMgbGFyZ2VyIHRoYW4KKwkgIDIwNDAgd2lkdGgvaGVpZ2h0LgorCSAgRml4ZXMgIzU2NDQzNworCisyMDA5LTA4LTAzIDE4OjAxOjI3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL1JFQURNRToKKwkgIFJUUCBkb2NzOiB1cGRhdGUgd2l0aCBhdHRyaWJ1dGVzIGluIGNhcHMKKworMjAwOS0wOC0wMyAxNzoyMTo0NCArMDIwMCAgTHVjIERlc2NoZW5hdXggPGx1Yy5kZXNjaGVuYXV4IGF0IGZyZWVzdXJmLmNoPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBwdXQgYWxsIFNEUCBhdHRyaWJ1dGVzIG9uIGNhcHMKKwkgIFB1dCB0aGUgU0RQIGF0dHJpYnV0ZXMgb24gdGhlIGNhcHMgdG9vIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCBieQorCSAgZGVwYXlsb2FkZXJzLgorCSAgU2VlICM1NjQ0MzcKKworMjAwOS0wOC0wMyAxMzozMjoxMiArMDIwMCAgSm9uYXRoYW4gVGVsbGllciA8am9uYXRoYW4udGVsbGllciBhdCBnbWFpbC5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2VzcmM6IGluaXRpYWxpemUgdGhlIHByb2JlIHdpdGggdGhlIHNlcnZlcgorCSAgV2hlbiBjcmVhdGluZyBhIG5ldyBwcm9iZSwgcGFzcyB0aGUgc2VydmVyIGluc3RlYWQgb2YgdGhlIGRldmljZSBzdHJpbmcuCisJICBmaXhlcyAjNTkwNDAxCisKKzIwMDktMDgtMDIgMTE6NDQ6MDMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgbXVsdGl1ZHBzaW5rOiBkb24ndCBkbyB0aGluZ3Mgd2l0aCBzaWRlLWVmZmVjdHMgaW5zaWRlIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKCkKKwkgIFNvbWVvbmUgbWlnaHQgY29tcGlsZSB0aGlzIGNvZGUgd2l0aCAtREdfRElTQUJMRV9BU1NFUlQgc29tZSBkYXkuCisKKzIwMDktMDgtMDEgMjE6Mzk6MzAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGRvbid0IGRvIGxvZ2ljIHdpdGhpbiBnX2Fzc2VydCgpIHN0YXRlbWVudHMKKwkgIE90aGVyd2lzZSB0aGF0IGNvZGUgd2lsbCBqdXN0IGJlIGV4cGFuZGVkIHRvIG5vdGhpbmcgd2hlbiBjb21waWxlZAorCSAgLURHX0RJU0FCTEVfQVNTRVJUIChQUzogd2h5IGlzIG1haW5sb29wX3N0YXJ0KCkgY2FsbGVkIGluIHRoZSBpbml0CisJICBmdW5jdGlvbiBhbmQgbm90IHdoZW4gY2hhbmdpbmcgc3RhdGUgdG8gUkVBRFk/KQorCisyMDA5LTA4LTAxIDE3OjA3OjQyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogc2VuZCBuZXdzZWdtZW50IGV2ZW50IHdoZW4gb3BlcmF0aW5nIHB1c2gtYmFzZWQgYW5kIHVuZnJhbWVkCisJICBGb3Igc29tZSByZWFzb24gZmxhYyBkb2Vzbid0IGNhbGwgb3VyIG1ldGFkYXRhIGNhbGxiYWNrIHdoZW4gd2Ugb3BlcmF0ZQorCSAgaW4gcHVzaCBtb2RlIHdpdGggdW5mcmFtZWQgaW5wdXQsIGJ1dCB0aGF0J3Mgd2hlcmUgd2Ugc2V0IHVwIHRoZQorCSAgbmV3c2VnbWVudCBldmVudCAoc2luY2UgdGhhdCdzIHdoZXJlIHdlJ2QgZ2V0IHRoZSBkdXJhdGlvbiBmcm9tIHRoZQorCSAgc3RyZWFtIGluZm8gaGVhZGVyKSwgc28gd2UgZGlkbid0IHNlbmQgYSBuZXdzZWdtZW50IGV2ZW50IGF0IGFsbCBpbiB0aGlzCisJICBjYXNlLiBIYWNrIGFyb3VuZCB0aGlzIGJ5IHN0b3JpbmcgYSBnZW5lcmljIG5ld3NlZ21lbnQgZXZlbnQgZm9yIG5vdworCSAgd2hpY2ggd2lsbCBiZSB1c2VkIGlmIHdlIGRvbid0IHJlcGxhY2UgaXQgd2l0aCBhIGJldHRlciBvbmUgdGhhdAorCSAgaW5jbHVkZXMgdGhlIGR1cmF0aW9uLgorCisyMDA5LTA4LTAxIDE2OjQ4OjM2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogc21hbGwgY2xlYW51cHMKKwkgIFJlbW92ZSBzb21lIGNhbGxiYWNrIGluZGlyZWN0aW9ucyB3aGljaCBhcmUgbm8gbG9uZ2VyIG5lZWRlZCBiZWNhdXNlCisJICB0aGVyZSdzIG9ubHkgb25lIGRlY29kZXIgb2JqZWN0IHR5cGUgbm93LiBBbHNvIHJlbW92ZSB1bnVzZWQgdmFyaWFibGUuCisKKzIwMDktMDgtMDEgMTU6MjI6NDkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBmbGFjZGVjOiB1c2UgZ3N0X2FkYXB0ZXJfY29weSgpIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGJ1ZmZlciBtZXJnZXMKKwkgIGdzdF9hZGFwdGVyX3BlZWsoKSB3aWxsIG1lcmdlIGJ1ZmZlcnMgYXMgbmVlZGVkLCB3aGljaCB3ZSBjYW4gYXZvaWQKKwkgIGhlcmUgc2luY2Ugd2UncmUgZG9pbmcgYSBtZW1jcHkgYW55d2F5IGFuZCB0aGVuIGZsdXNoIHRoZSBjb3BpZWQKKwkgIGRhdGEgZnJvbSB0aGUgYWRhcHRlciByaWdodCBhd2F5LgorCisyMDA5LTA4LTAxIDAwOjAwOjQxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogcmVwYWlyIHNvbWUgYnJva2VuIGluZGVudGluZworCisyMDA5LTA4LTAxIDEyOjE5OjQxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZmx2bXV4LmM6CisJICBjaGVja3M6IGFkZCBiYXNpYyB1bml0IHRlc3QgZm9yIGZsdm11eCwgYnV0IGRpc2FibGUgaXQgZm9yIG5vdworCSAgQmFzaWMgdW5pdCB0ZXN0IGZvciBmbHZtdXguIEZhaWxzIG1pc2VyYWJseSwgaGVuY2UgZGlzYWJsZWQgZm9yIG5vdy4KKworMjAwOS0wNy0zMSAyMzoyODoxMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsdmRlbXV4LmM6CisJKiB0ZXN0cy9maWxlcy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2ZpbGVzL3BjbTE2c2luZS5mbHY6CisJICBjaGVjazogYWRkIGJhc2ljIHVuaXQgdGVzdCBmb3IgZmx2ZGVtdXgKKwkgIEluIHBhcnRpY3VsYXIsIHRlc3QgcmUtdXNlIG9mIGZsdmRlbXV4IGluIGJvdGggcHVsbCBhbmQgcHVzaCBtb2RlCisJICAoc2VlICM1ODMwMzApLgorCisyMDA5LTA3LTMxIDIwOjI1OjE3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogZml4IGludmFsaWQgd3JpdGUgY2F1c2VkIGJ5IHVzaW5nIHNpemVvZigic3RyaW5nIikgYXMgbGVuZ3RoCisJICBzaXplb2YoImZvbyIpIGluY2x1ZGVzIHRoZSBzdHJpbmcncyBOVUwtdGVybWluYXRvciBpbiB0aGUgc2l6ZSByZXR1cm5lZCwKKwkgIGJ1dCB3ZSdyZSB3cml0aW5nIHN0cmluZ3MgaGVyZSB3aXRoIGFuIGV4cGxpY2l0IHNpemUgYXQgdGhlIGJlZ2lubmluZworCSAgYW5kIG5vIE5VTC10ZXJtaW5hdG9yLiBJbiBtb3N0IGNhc2VzIHVzaW5nIHNpemVvZigiZm9vIikgYXMgbGVuZ3RoIGluCisJICBtZW1jcHkgaXMgbm90IGhhcm1mdWwsIGJ1dCBpdCBpcyB3aGVyZSB0aGUgc3RyaW5nIGdvZXMgcmlnaHQgYXQgdGhlCisJICBlbmQgb2Ygb3VyIGJ1ZmZlciB0byB3cml0ZSwgc2luY2Ugd2UgZG9uJ3QgYWxsb2NhdGUgc3BhY2UgZm9yIHRoYXQKKwkgIE5VTCB0ZXJtaW5hdG9yLgorCisyMDA5LTA3LTI3IDE4OjQ0OjQ1ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cDogVXNlICJHRVQiIGluc3RlYWQgb2YgU09VUF9NRVRIT0RfR0VULiBGaXhlcyBidWlsZCB3aXRoIGxpYnNvdXAtMi43LioKKwkgIFRoaXMgaXMgZHVlIHRvIGEgcXVhbGl0eSBBUEkgY2hhbmdlIGluIGxpYnNvdXAgMi43LiBTT1VQX01FVEhPRF8qIGFyZSBub3cKKwkgIGludGVnZXJzIGFuZCBub3Qgc3RyaW5ncy4uLiB0aGV5IGNvdWxkIGhhdmUgY2hhbmdlZCB0aGUgbmFtZXMuCisKKzIwMDktMDctMzAgMTc6NTc6NTMgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAganBlZzogdXNlIGxvbmdlciBtYWNybyBuYW1lcyB0byBub3QgY2xhc2ggd2l0aCBzb21lIHN0dXBpZCB3aW5kb3dzIGRlZmluZXMKKwkgIGxpYmpwZWcgaGVhZGVycyBwdWxsIHNvbWUgd2luZG93cyBzeXN0ZW0gaW5sY3VkZXMgKG9uIHdpbmRvd3MpIHRoYXQgY29udGFpbiBhCisJICBkZWZpbmUgZm9yIERFRkFVTFRfUVVBTElUWS4KKworMjAwOS0wNy0yOSAxNDozMTo0OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBGaXggbGFzdCBjb21taXQgYW5kIGltcHJvdmUgcmVhZGFiaWxpdHkKKworMjAwOS0wNy0yNCAxOTowNDozMSArMDQwMCAg0KDRg9GB0LvQsNC9INCY0LbQsdGD0LvQsNGC0L7QsiA8bHJuMTk4NkBnbWFpbC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIEZpeGVkIHRoZSBmaXggZm9yIFRJTUUtPkRFRkFVTFQgY29udmVyc2lvbi4KKwkgIEZpeGVzIGJ1ZyAjNTc4MDUyIGFnYWluLgorCisyMDA5LTA3LTI5IDEzOjM4OjAzICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSAgcnRwc3YzZGVwYXk6IEZpeCB3aWR0aC9oZWlnaHQgY2FsY3VsYXRpb24sIGJyaW5nIHVwIHRvIG1hcmdpbmFsIHJhbmsuCisJICBCYXNlZCBvbiBkb2N1bWVudGF0aW9uIGZvdW5kIG9uIGh0dHA6Ly93aWtpLm11bHRpbWVkaWEuY3gvCisKKzIwMDktMDctMjkgMTI6MTM6MjAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2U6IGNvbmRpdGlvbmFsbHkgY29tcGlsZSBuZXdlciBzdHVmZgorCSAgY29uZmlndXJlZF9zaW5rL3NvdXJjZV91c2VjIGluIHRoZSB0aW1pbmdfaW5mbyBpcyBvbmx5IHNpbmNlIDAuOS4xMSBzbworCSAgY29uZGl0aW9uYWxseSBjb21waWxlIHRoaXMgaW5mb3JtYXRpb24uCisJICBmaXhlcyAjNTkwMDM4CisKKzIwMDktMDctMjggMTg6Mjk6MDcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmg6CisJICBwdWxzZXNyYzogY2xlYW51cHMKKwkgIEtlZXAgdHJhY2sgb2YgdGhlIHBhdXNlZCBzdGF0ZSBvZiB0aGUgc291cmNlIGFuZCBsZWF2ZSB0aGUgcmVhZCBmdW5jdGlvbiB3aGVuCisJICBwYXVzZWQuCisJICBkb24ndCB3YWl0IGZvciBhIGxhdGVuY3kgdXBkYXRlIHdoZW4gdGhlIGRlbGF5IGlzIG5vdCB5ZXQga25vd24gYnV0IHNpbXBseQorCSAgcmV0dXJuIDAgaW5zdGVhZCBvZiBibG9ja2luZy4KKwkgIEtlZXAgdHJhY2sgb2YgdGhlIGNvcmtlZCBzdGF0ZSBvZiB0aGUgc3RyZWFtLgorCSAgRml4IHRoZSBzdGF0ZSBjaGFuZ2VzLgorCisyMDA5LTA3LTI4IDE2OjExOjE4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBzZXQgbWF4bGVuZ3RoIGFsd2F5cyB0byAtMQorCisyMDA5LTA3LTI4IDE1OjUzOjU3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5oOgorCSAgcHVsc2VzcmM7IGNsZWFudXBzLCByZXBvcnQgcmVhbCBsYXRlbmN5CisJICBBZGQgc29tZSBtb3JlIGRlYnVnIGluZm8KKwkgIEF2b2lkIHNvbWUgdHlwZSBjYXN0cworCSAgUmVwb3J0IHRoZSByZWFsIGxhdGVuY3kgdG8gdGhlIGFwcGxpY2F0aW9uLgorCisyMDA5LTA3LTI4IDE2OjExOjM2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogd2hlbiBzY2FubmluZyBmb3IgMHhmZiBtYXJrZXIgZW5kcywgZW5zdXJlIGRlc2lyZWQgcmVzdWx0CisJICBPdGhlcndpc2UsIGFueSBub24gMHhmZiBieXRlIGF0IGVuZCBvZiBkYXRhIHdvdWxkIGJlIG1pc3Rha2VuIGZvcgorCSAgYSB0YWcgYnl0ZSwgYW5kIGluIGNhc2Ugb2YgYSBmcmFtZV9sZW4gMCB0YWcgc3Vic2VxdWVudGx5IGxlYWQgdG8gYW4KKwkgIGluZmluaXRlIGxvb3AuCisKKzIwMDktMDctMjggMDA6MzA6NDMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBhZGRzIHN1cHBvcnQgdG8gd21hCisKKzIwMDktMDctMjggMDA6MDc6MTUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBhZGRzIHN1cHBvcnQgdG8gd212CisKKzIwMDktMDctMjcgMjE6MzQ6MjIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBEb3duZ3JhZGUgd2FybmluZyBtZXNzYWdlIHRvIGRlYnVnCisKKzIwMDktMDctMjcgMTE6NTE6MzkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogYXZvaWQgdXNpbmcgaXZhbGlkIHN0cmVhbSBpbmRleGVzCisJICB3aGVuIHdlIGdldCBhbiBpbnZhbGlkIHN0cmVhbSBpbmRleCBmcm9tIHB1bHNlIGJlY2F1c2Ugd2Ugd2VyZSBqdXN0IHN0YXJ0aW5nLAorCSAgYXZvaWQgdXNpbmcgaXQgZm9yIGdldHRpbmcgYW5kIHNldHRpbmcgdGhlIHZvbHVtZS4KKwkgIEZpeGVzICM1ODkzNjUKKworMjAwOS0wNy0yNCAxOTozODowNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmlwcGxlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzdHJlYWsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkgIGVmZmVjdHY6IERvbid0IGFsbG93IGNhcHMgY2hhbmdlcyBmb3Igc29tZSBlZmZlY3R2IGZpbHRlcnMKKwkgIFRoZXNlIGZpbHRlcnMgdXNlIGluZm9ybWF0aW9uIGZyb20gcHJldmlvdXMgZnJhbWVzIHRvCisJICBnZW5lcmF0ZSB0aGUgY3VycmVudCBmcmFtZSBhbmQgYSBjYXBzIGNoYW5nZSB3aWxsIG1ha2UKKwkgIHRoZSBlZmZlY3Qgc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIGFnYWluLgorCisyMDA5LTA3LTI0IDE5OjM3OjA5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5oOgorCSAgd2FycHR2OiBNYWtlIHRoZSBzaW5lIHRhYmxlIGdsb2JhbCBpbnN0ZWFkIG9mIGhhdmluZyBpdCBpbiBldmVyeSBpbnN0YW5jZQorCisyMDA5LTA3LTI0IDEwOjQ3OjQ0ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWc6IG1ha2UgZW5jb2RlciB3b3JrIHdpdGggbGlianBlZyB2NworCSAgV2UgaGF2ZSB0byBzcGVjaWZ5IGRvX2ZhbmN5X2Rvd25zYW1wbGluZyA9IEZBTFNFIGluIHRoZSBlbmNvZGVyIHdpdGggZGlkIG5vdCBleGlzdCBiZWZvcmUuCisKKzIwMDktMDctMjQgMDA6NDI6MzMgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGZlZGFhZWUgdG8gOTRmOTVlMworCisyMDA5LTA3LTIzIDEyOjA2OjI3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogSW1wbGVtZW50IFNFRUtJTkcgcXVlcnkKKwkgIEZpeGVzIGJ1ZyAjNTg5NDIzLgorCisyMDA5LTA3LTIyIDExOjE2OjA2ICswMTAwICBDb2xpbiBHdXRocmllIDxjZ3V0aHJpZUBtYW5kcml2YS5vcmc+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogRml4IGEgY291cGxlIGVycm9yIG1lc3NhZ2VzIHRoYXQgbWVudGlvbmVkIGluY29ycmVjdCBmdW5jdGlvbiBuYW1lcy4KKwkgIEZpeGVzICM1ODk0NTkuCisKKzIwMDktMDctMjMgMTE6NTA6MTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6CisJICBmbHZkZW11eDogSW1wbGVtZW50IFNFRUtJTkcgcXVlcnkKKwkgIEFsc28gYWRkIHNvbWUgbW9yZSBxdWVyeSB0eXBlcyB0byB0aGUgYW5zd2VyIG9mIHRoZSBxdWVyeSB0eXBlIGZ1bmN0aW9uLgorCSAgRml4ZXMgYnVnICM1ODk0MjQuCisKKzIwMDktMDctMjEgMTk6NDY6NTUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmg6CisJICBmbGFjZGVjOiBmaXggaW50ZXJtaXR0ZW50IEZMQUNfX1NUUkVBTV9ERUNPREVSX0FCT1JURUQgZXJyb3JzIHdoZW4gc2Vla2luZworCSAgV2hlbiBzZWVraW5nIGluIGEgbG9jYWwgZmxhYyBmaWxlIChpZS4gb3BlcmF0aW5nIHB1bGwtYmFzZWQpLCB0aGUgZGVjb2RlcgorCSAgd291bGQgb2Z0ZW4ganVzdCBlcnJvciBvdXQgYWZ0ZXIgdGhlIGxvb3AgZnVuY3Rpb24gc2VlcyBhIERFQ09ERVJfQUJPUlRFRAorCSAgc3RhdHVzLiBUaGlzLCBob3dldmVyLCBpcyB0aGUgcmVhZCBjYWxsYmFjaydzIHdheSBvZiB0ZWxsaW5nIG91ciBsb29wCisJICBmdW5jdGlvbiB0aGF0IHB1bGxfcmFuZ2UgZmFpbGVkIGFuZCBzdHJlYW1pbmcgc2hvdWxkIHN0b3AsIGluIHRoaXMgY2FzZQorCSAgYmVjYXVzZSBvZiB0aGUgZmx1c2gtc3RhcnQgZXZlbnQgdGhhdCB0aGUgc2VlayBoYW5kbGVyIHB1c2hlZCB1cHN0cmVhbQorCSAgZnJvbSB0aGUgc2Vla2luZyB0aHJlYWQuIEhhbmRsZSB0aGlzIHNsaWdodGx5IGJldHRlciBieSBzdG9yaW5nIHRoZSBsYXN0CisJICBmbG93IHJldHVybiBmcm9tIHB1bGxfcmFuZ2UsIHNvIHRoZSBsb29wIGZ1bmN0aW9uIGNhbiBldmFsdWF0ZSBpdCBwcm9wZXJseQorCSAgd2hlbiBpdCBlbmNvdW50ZXJzIGEgREVDT0RFUl9BQk9SVEVEIGFuZCB0YWtlIHRoZSByaWdodCBhY3Rpb24uCisJICBGaXhlcyAjNTc4NjEyLgorCisyMDA5LTA3LTIxIDEwOjA3OjAwICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkgIGludGVybGVhdmU6IGZpeCBpbmRlbnRpbmcgYW5kIHVwZ3JhZGUgdHdvIGRlYnVncyB0byB3YXJuaW5ncy4KKwkgIEZpeCBuZXdsaW5lcyBpbiB2YXJpYWJsZSBkZWNscy4gQ2hhbmdlIHR3byBkZWJ1Z3MgdG8gYmVjb21lIHdhcm5pbmdzIGFzIHRoZXkKKwkgIGluZGljYXRlIHRoYXQgdGhpbmdzIHdpbGwgbm90IHdvcmsuCisKKzIwMDktMDctMjEgMTA6MDQ6MzYgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2pwZWcvZ3N0anBlZy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5oOgorCSAganBlZzogY29kZSBjbGVhbnVwcyBmb3IgZW5jb2RlcgorCSAgUmVtb3ZlIHNvbWUgZGlzYWJsZWQgY29kZSBpbiBlbmNvZGVyLiBUcnkgI2lmIDAnZWQgY29kZSBhbmQgYWRkIGNvbW1lbnRzIGFib3V0CisJICB3aHkgaXQgaXMgZGlzYWJsZWQuIE1vdmUgaWRjdC1tZXRob2QgZW51bSB0byBqcGVnLmMgYW5kIHVzZSBpbiBib3RoIGVuY29kZXIgYW5kCisJICBkZWNvZGVyLiBBZGQgaWRjdC1tZXRob2QgcHJvcGVydHkgdG8gZW5jb2Rlci4KKworMjAwOS0wNy0yMSAwNzo1MDo0NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogQW5zd2VyIFNFRUtJTkcgcXVlcmllcyBpbiB0aGUgb3JpZ2luYWwgZm9ybWF0CisKKzIwMDktMDctMjEgMDE6MTI6NDQgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSAgdWRwdXRpbHM6IGluaXRpYWxpemUgc3RydWN0IGNvbnRlbnQgd2l0aCAwLgorCSAgRml4ZXMgc29tZSByYW5kb20gY3Jhc2hlcy4KKworMjAwOS0wNy0yMCAxOTowOToxOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBzZXQgc29tZSB2YWx1ZXMgdG8gdGhlaXIgZGVmYXVsdHMKKwkgIFNldCB0aGUgbWlucmVxIGFuZCBtYXhsZW5ndGggYnVmZmVyIGF0dHJpYnV0ZXMgdG8gLTEgdG8gbGV0IHB1bGVzZWF1ZGlvIHNlbGVjdCBhCisJICBzZW5zaWJsZSB2YWx1ZS4KKworMjAwOS0wNy0yMCAxOTowNDowOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBkb24ndCB3YWl0IGZvciBwb3N0ZWQgbWVzc2FnZQorCSAgV2UgY2FuJ3Qgd2FpdCBmb3IgdGhlIEVOVEVSL0xFQVZFIG1lc3NhZ2VzIHRvIGJlIGJlIHBvc3RlZCBiZWNhdXNlIHRoZSBiYXNlCisJICBjbGFzcyBzb21ldGltZXMgY2FsbHMgdGhlIHN0YXJ0IG1ldGhvZCB3aXRoIHRoZSBvYmplY3QgbG9jaywgd2hpY2ggd291bGQgYmxvY2sKKwkgIHRoZSBtZXNzYWdlIHBvc3RpbmcuCisJICBJbnN0ZWFkLCBqdXN0IGFzc3VtZSB0aGF0IHRoZSBtZXNzYWdlIHdpbGwgYmUgcG9zdGVkIHNvb24gYW5kIGNvbnRpbnVlLiBXZSdsbAorCSAgaGF2ZSB0byBmaXggdGhpcyBpbiB0aGUgYmFzZSBjbGFzcy4KKworMjAwOS0wNy0yMCAxODoxMTozMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiB1c2UgcmVsYXRpdmUgc2Vla3MKKwkgIFVzZSByZWxhdGl2ZSBzZWVrcyBiZWNhdXNlIEkgd2FzIHRvbGQgdGhhdCBhYnNvbHV0ZSBzZWVrcyBkb24ndCB3b3JrLgorCisyMDA5LTA3LTIwIDE2OjUyOjE5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBJbXBsZW1lbnQgU0VFS0lORyBxdWVyeQorCisyMDA5LTA3LTIwIDA4OjA3OjEzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmM6CisJICBjYWlyb3JlbmRlcjogQWRkIHN1cHBvcnQgZm9yIEFSR0IvQkdSQSBpbnB1dAorCSAgTm90ZSB0aGF0IHZpZGVvdGVzdHNyYyBvdXRwdXRzIDEwMCUgdHJhbnNwYXJlbnQgdmlkZW8KKwkgIHdoaWNoIHdpbGwgcmVzdWx0IGluIHdoaXRlIG91dHB1dCBmcm9tIGNhaXJvcmVuZGVyLgorCisyMDA5LTA3LTE3IDEzOjIyOjU3ICswMTAwICBFbGFpbmUgWGlvbmcgPEVsYWluZS5YaW9uZ0BTdW4uQ09NPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICB2NGwyOiBGaXggdjRsMnNyYyBvbiBPcGVuU29sYXJpcworCSAgVGhlIHY0bDIgZHJpdmVyIGZvciBVU0Igd2ViY2FtcyBvbiBPcGVuU29sYXJpcyBkb2VzIG5vdCBzdXBwb3J0IHNlbGVjdCgpCisJICBjYWxscy4gRGV0ZWN0IHdoZW4gc2VsZWN0KCkgZmFpbHMsIGFuZCBza2lwIHBvbGxpbmcgdGhlIGRldmljZSBhZnRlcndhcmQsCisJICB3aGljaCByZXN0b3JlcyB0aGUgcHJlIDAuMTAuMTQgYmVoYXZpb3VyIG9uIE9wZW5Tb2xhcmlzLgorCSAgU2lnbmVkLW9mZi1ieTogSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisyMDA5LTA3LTE3IDExOjIyOjA2ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9leGFtcGxlcy92NGwyLy5naXRpZ25vcmU6CisJICBnaXRpZ25vcmU6IElnbm9yZSBzb21lIG5ldyBiaW5hcmllcworCisyMDA5LTA3LTE3IDEzOjQ5OjIxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGV4dC9jYWlyby9nc3RjYWlyb3JlbmRlci5jOgorCSAgY2Fpcm9yZW5kZXI6IEFkZCB0byB0aGUgZG9jdW1lbnRhdGlvbgorCisyMDA5LTA3LTE3IDEzOjQyOjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmM6CisJICBjYWlyb3JlbmRlcjogUmV0dXJuIG5vdC1uZWdvdGlhdGVkIGlmIHdlIGhhdmUgbm8gY2FwcworCisyMDA5LTA3LTE3IDEzOjQxOjE5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmM6CisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm9yZW5kZXIuaDoKKwkgIGNhaXJvcmVuZGVyOiBGaXggY2FwcyBhbmQgY29sb3JzcGFjZSBoYW5kbGluZworCisyMDA5LTA3LTE3IDEzOjMwOjAyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmM6CisJICBjYWlyb3JlbmRlcjogVXNlIGNvcnJlY3QgbWltZXR5cGVzIGZvciBQREYgYW5kIFNWRworCisyMDA5LTA3LTE3IDEzOjI0OjI4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmM6CisJICBjYWlyb3JlbmRlcjogUmVtb3ZlIHB1bGwgbW9kZSwgaXQgb25seSBhZGRzIGNvbXBsZXhpdHkgYnV0IG5vdCBhZHZhbnRhZ2VzCisKKzIwMDktMDctMTYgMjE6NTU6MzEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm9yZW5kZXIuYzoKKwkgIGNhaXJvcmVuZGVyOiBGaXggY2FwcyBuZWdvdGlhdGlvbiBhbmQgY2Fpcm8gc3VyZmFjZSBjcmVhdGlvbgorCisyMDA5LTA3LTE2IDIxOjQyOjIxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmM6CisJICBjYWlyb3JlbmRlcjogQ29ycmVjdGx5IHNldCBzcmNjYXBzCisKKzIwMDktMDctMTYgMjE6MzE6NDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm9yZW5kZXIuYzoKKwkqIGV4dC9jYWlyby9nc3RjYWlyb3JlbmRlci5oOgorCSAgY2Fpcm9yZW5kZXI6IE1vdmUgaW5zdGFuY2UvY2xhc3Mgc3RydWN0IGRlZmluaXRpb25zIHRvIHRoZSBoZWFkZXIKKworMjAwOS0wNy0xNiAyMTozMDowMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9jYWlyby9nc3RjYWlyb3JlbmRlci5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmg6CisJICBjYWlyb3JlbmRlcjogQWRkIEx1dHonIGNvcHlyaWdodCB0byB0aGUgZmlsZSBoZWFkZXIKKworMjAwOS0wNy0xNiAyMToyNzo0NSArMDIwMCAgTHV0eiBNdWVsbGVyIDxsdXR6QHRvcGZyb3NlLmRlPgorCisJKiBleHQvY2Fpcm8vTWFrZWZpbGUuYW06CisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm8uYzoKKwkqIGV4dC9jYWlyby9nc3RjYWlyb3JlbmRlci5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmg6CisJICBjYWlybzogQWRkIGNhaXJvLWJhc2VkIFBERi9QUy9TVkcgZW5jb2RlciBlbGVtZW50CisJICBGaXhlcyBidWcgIzMzMTQyMC4KKworMjAwOS0wNy0xNiAyMDo0NDo0MCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuaDoKKwkgIGZsYWNlbmM6IE9wdGlvbmFsbHkgd3JpdGUgYSBQQURESU5HIGJsb2NrCisJICBUaGUgc2l6ZSBvZiB0aGUgUEFERElORyBibG9jayBpcyBzcGVjaWZpZWQgYnkgYSBuZXcKKwkgICJwYWRkaW5nIiBwcm9wZXJ0eS4KKwkgIEZpeGVzIGJ1ZyAjNTg4NDgzLgorCisyMDA5LTA3LTE2IDE5OjM1OjQ0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBPbmx5IGFzc3VtZSBzZWVrYWJpbGl0eSBpZiB0aGUgc2VydmVyIHByb3ZpZGVzIENvbnRlbnQtTGVuZ3RoCisJICBQcmV2aW91c2x5IHNlZWthYmlsaXR5IHdheSBhbHdheXMgYXNzdW1lZCB1bnRpbCB0aGUgZmlyc3Qgc2VlayBhY3R1YWxseQorCSAgZmFpbGVkLiBOb3cgd2UgYXNzdW1lIHRoYXQgYWxsIHNlcnZlcnMgYXJlIG5vdCBzZWVrYWJsZSB1bmxlc3MgdGhleSBwcm92aWRlCisJICBhIENvbnRlbnQtTGVuZ3RoIGhlYWRlci4gSWYgYSBzZWVrIGZhaWxzIGFmdGVyIHRoYXQgd2UgY29udGludWUgdG8KKwkgIGFzc3VtZSBubyBzZWVrYWJpbGl0eS4gRml4ZXMgYnVnICM1ODU1NzYuCisKKzIwMDktMDctMTYgMTU6MTQ6NDMgKzAyMDAgIEFybm91dCBWYW5kZWNhcHBlbGxlIDxhcm5vdXRAbWluZC5iZT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBkb24ndCB0cnkgdG8gYXV0aGVudGljYXRlIGlmIG5vIHVzZXJuYW1lL3Bhc3N3b3JkIGlzIHNldC4KKworMjAwOS0wNy0xNiAxNzoxMDoyMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkgIGVmZmVjdHY6IENoYWluIHVwIGZpbmFsaXplIHRvIHRoZSBwYXJlbnQgY2xhc3MgaW4gd2FycHR2CisJICBGaXhlcyBhIG1lbW9yeSBsZWFrLgorCisyMDA5LTA3LTE2IDEyOjU1OjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvZWZmZWN0di5jOgorCSAgZWZmZWN0djogQWRkIHVuaXQgdGVzdCBmb3IgYWxsIGVmZmVjdHYgZWxlbWVudHMKKworMjAwOS0wNy0xNiAxMjoxNzozMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJICBlZmZlY3R2OiBBZGQgbmV3IGVmZmVjdHYgZWxlbWVudHMgdG8gdGhlIGRvY3MKKworMjAwOS0wNy0xNSAxNDozNzoxOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L01ha2VmaWxlLmFtOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZWZmZWN0di5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmlwcGxlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RyaXBwbGUuaDoKKwkgIGVmZmVjdHY6IEFkZCByaXBwbGV0diBlbGVtZW50CisJICBUaGlzIHByb2R1Y2VzIGEgd2F0ZXIgcmlwcGxlIGVmZmVjdCBvbiB0aGUgdmlkZW8gaW5wdXQsCisJICBiYXNlZCBvbiBtb3Rpb24gb3IgYSByYWluIGRyb3AgYWxnb3JpdGhtLgorCSAgS2luZGx5IHJlbGljZW5zZWQgdG8gTEdQTDIrIGJ5IEtlbnRhcm8gRnVrdWNoaSA8ZnVrdWNoaUBtZWdhdWkubmV0Pi4KKwkgIEZpeGVzIGJ1ZyAjNTg4Njk1LgorCisyMDA5LTA3LTEyIDE1OjQyOjM1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvTWFrZWZpbGUuYW06CisJKiBnc3QvZWZmZWN0di9nc3RlZmZlY3R2LmM6CisJKiBnc3QvZWZmZWN0di9nc3RzdHJlYWsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHN0cmVhay5oOgorCSAgZWZmZWN0djogQWRkIHN0cmVha3R2IGVmZmVjdCBmaWx0ZXIgZWxlbWVudAorCSAgVGhpcyBjb21iaW5lcyB0aGUgU3RyZWFrVFYgYW5kIEJhbHRhblRWIGZpbHRlcnMgZnJvbSB0aGUKKwkgIGVmZmVjdHYgcHJvamVjdC4KKwkgIEtpbmRseSByZWxpY2Vuc2VkIHRvIExHUEwyKyBieSBLZW50YXJvIEZ1a3VjaGkgPGZ1a3VjaGlAbWVnYXVpLm5ldD4uCisJICBGaXhlcyBidWcgIzU4ODM2OC4KKworMjAwOS0wNy0xMiAxMjozMToxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJldi5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5jOgorCSAgZWZmZWN0djogRml4IHByb2Nlc3Npbmcgb24gYmlnIGVuZGlhbiBhcmNoaXRlY3R1cmVzCisKKzIwMDktMDctMTIgMTE6NTI6MDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9NYWtlZmlsZS5hbToKKwkqIGdzdC9lZmZlY3R2L2dzdGVmZmVjdHYuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuaDoKKwkgIGVmZmVjdHY6IEFkZCByYWRpb2FjdHYgZWZmZWN0IGZpbHRlcgorCSAgVGhpcyBmaWx0ZXIgYWRkcyBhIHJhZGlhdGlvbi1saWtlIG1vdGlvbiBibHVyIGVmZmVjdAorCSAgdG8gdGhlIHZpZGVvIHN0cmVhbS4KKwkgIEtpbmRseSByZWxpY2Vuc2VkIHRvIExHUEwyKyBieSBLZW50YXJvIEZ1a3VjaGkgPGZ1a3VjaGlAbWVnYXVpLm5ldD4uCisJICBGaXhlcyBidWcgIzU4ODM1OS4KKworMjAwOS0wNy0xMiAxMToyNjo1NyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdG9wLmM6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5oOgorCSAgZWZmZWN0djogTWFrZSB0aGUgb3B0diB0aHJlc2hvbGQgcHJvcGVydHkgYW4gdWludAorCisyMDA5LTA3LTEyIDEwOjM5OjAyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvTWFrZWZpbGUuYW06CisJKiBnc3QvZWZmZWN0di9nc3RlZmZlY3R2LmM6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0b3AuaDoKKwkgIGVmZmVjdDogQWRkIG9wdHYgZWZmZWN0IGZpbHRlciBmcm9tIHRoZSBlZmZlY3R2IHByb2plY3QKKwkgIFRoaXMgZmlsdGVyIGJpbmFyaXplcyBpbnB1dCBmcmFtZXMgYW5kIGNvbWJpbmVzIHRoZW0gd2l0aCB2YXJpb3VzCisJICBvcHRpY2FsIHBhdHRlcm4uCisJICBLaW5kbHkgcmVsaWNlbnNlZCB0byBMR1BMMisgYnkgS2VudGFybyBGdWt1Y2hpIDxmdWt1Y2hpQG1lZ2F1aS5uZXQ+LgorCSAgRml4ZXMgYnVnICM1ODgzNDkuCisKKzIwMDktMDctMDMgMDU6MTE6MjYgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBFbWl0IHN0cmVhbS1zdGF0dXMgbGVhdmUgbWVzc2FnZQorCSAgRml4ZXMgIzU4NzY5NQorCisyMDA5LTA3LTAzIDA1OjA2OjQ1IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkgIHB1bHNlc2luazogRW1pdCBzdHJlYW0tc3RhdHVzIGVudGVyIG1lc3NhZ2UKKwkgIEVtaXQgc3RyZWFtLXN0YXR1cyBtZXNzYWdlcyBmb3IgdGhlIHB1bHNlIHRocmVhZC4KKwkgIERvbid0IHVzZSBvdXIgb3duIEdDb25kIGZvciBzaWduYWxpbmcgYnV0IHNpbXBseSB1c2UgdGhlIHB1bHNlIG1haW5sb29wCisJICBtZWNoYW5pc21zIGZvciBzeW5jaHJvbmlzYXRpb24uCisJICBTZWUgIzU4NzY5NQorCisyMDA5LTA3LTE0IDE4OjE1OjU5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGRlYnVnIHRoZSBsYXRlbmN5IHVwZGF0ZSB2YWx1ZXMKKworMjAwOS0wNy0xNCAxNjoxMjo1NSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSAgcHVsc2VzaW5rOiBhZGQgMjRiaXQgc2FtcGxlIGZvcm1hdHMKKwkgIEFkZCBjaGVjayBmb3IgcHVsc2VhdWRpbyAwLjkuMTUgYW5kIGVuYWJsZSAyNGJpdHMgc2FtcGxlcyBpbiB0aGF0IGNhc2UuCisKKzIwMDktMDctMTMgMTI6MjM6MzcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDU4NDViNjMgdG8gZmVkYWFlZQorCisyMDA5LTA3LTEzIDE3OjUzOjI1ICswMjAwICBNYXJjIExlZW1hbiA8bWFyYy5sZWVtYW4gYXQgZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5jOgorCSAgbXB2cGF5OiBSZXdvcmsgdGhlIHRpbWVzdGFtcGluZworCSAgUmV3b3JrIHRoZSB0aW1lc3RhbXBpbmcgaW4gdGhlIG1wdiBwYXlsb2FkZXIgc28gdGhhdCB0aGUgdGltZXN0YW1wcyBhcmUgbW9yZQorCSAgYWNjdXJhdGUuCisJICBGaXhlcyAjNTg3NjgwCisKKzIwMDktMDctMDMgMDg6NDc6MTIgKzAyMDAgIEZpbGlwcG8gQXJnaW9sYXMgPGZpbGlwcG8uYXJnaW9sYXNAZ21haWwuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB0ZXN0cy9leGFtcGxlcy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9leGFtcGxlcy92NGwyL3Byb2JlLmM6CisJICB2NGwyc3JjOiBhZGQgYSBzaW1wbGUgdGVzdCBjYXNlIGZvciBkZXZpY2UgcHJvYmluZworCisyMDA5LTA3LTAzIDA4OjM4OjQzICswMjAwICBGaWxpcHBvIEFyZ2lvbGFzIDxmaWxpcHBvLmFyZ2lvbGFzQGdtYWlsLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogc3lzL3Y0bDIvTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyc3JjOiBvcHRpb25hbCBzdXBwb3J0IGZvciBkZXZpY2UgcHJvYmluZyB3aXRoIGd1ZGV2CisJICBFbnVtZXJhdGUgdjRsMiBkZXZpY2VzIHVzaW5nIGd1ZGV2IGlmIGF2YWlsYWJsZS4KKwkgIEZpeGVzIGJ1ZyAjNTgzNjQwLgorCisyMDA5LTA3LTEwIDE5OjU0OjI1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogUmFuZG9tIGNsZWFudXAKKworMjAwOS0wNy0xMCAxOTo1NDoxMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIHZpZGVvbWl4ZXI6IFNlbmQgcXVlcmllcyB0byB0aGUgbWFzdGVyIHBhZCBieSBkZWZhdWx0IGluc3RlYWQgb2YgYWxsIHBhZHMKKworMjAwOS0wNy0xMCAxOTozNDo0MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfcmdiLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBBZGQgUkdCLCBCR1IsIHhSR0IsIFJHQngsIHhCR1IsIEJHUnggc3VwcG9ydAorCisyMDA5LTA3LTEwIDE3OjQzOjA3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogQ2xlYW4gdXAgZGVidWdnaW5nIGEgYml0CisKKzIwMDktMDctMTAgMTc6MjU6NDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBSZW1vdmUgc29tZSByZWR1bmRhbnQgY2hlY2tzIGFuZCBlcnJvciBvdXQgaW1tZWRpYXRlbHkgaWYgbm90IG5lZ290aWF0ZWQKKwkgIEFsc28gc3RvcCBsZWFraW5nIHRoZSBvdXRwdXQgYnVmZmVyIGluIHNvbWUgZXJyb3IgY2FzZXMuCisKKzIwMDktMDctMTAgMTc6MjM6MDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9heXV2LmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9iZ3JhLmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9pNDIwLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmg6CisJICB2aWRlb21peGVyOiBSZW1vdmUgdGhlIGNhbGN1bGF0ZV9mcmFtZV9zaXplKCkgZnVuY3Rpb24gYW5kIHVzZSBsaWJnc3R2aWRlbyBpbnN0ZWFkCisKKzIwMDktMDYtMzAgMTU6MTM6NDQgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIHZpZGVvbWl4ZXI6IFJlbW92ZSB1bnVzZWQgbGluay91bmxpbmsgcGFkIG1ldGhvZHMKKworMjAwOS0wNi0zMCAxMjo0MzowNCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfaTQyMC5jOgorCSAgdmlkZW9taXhlcjogSTQyMCBtb2RlOiBBZGQgZmFzdCBwYXRoIGZvciAwLjAgYW5kIDEuMCBhbHBoYQorCSAgSWYgdGhlIHNvdXJjZSBhbHBoYSBpcyAwLjAsIHdlIHRha2Ugbm90aGluZy4KKwkgIElmIHRoZSBzb3VyY2UgYWxwaGEgaXMgMS4wLCB3ZSBvdmVyd3JpdGUgZXZlcnl0aGluZy4KKworMjAwOS0wNi0zMCAxMjo0MDowMiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfaTQyMC5jOgorCSAgdmlkZW9taXhlcjogSTQyMCBibGVuZGluZyA6IEZpeCBtYWluIGFsZ29yaXRobS4KKwkgIFdoZW4gYmxlbmRpbmcgYSBzb3VyY2UgbGF5ZXIgd2l0aCBhbiBhbHBoYSBvZiAnYScgb24gdG9wIG9mIGFub3RoZXIKKwkgIGRlc3RpbmF0aW9uIGxheWVyIHdlIHRha2UgdGhlIHN1bSBvZjoKKwkgICogJ2EnIHBlcmNlbnQgb2YgdGhlIHNvdXJjZSBsYXllcgorCSAgKiAoMTAwIC0gJ2EnKSBwZXJjZW50IG9mIHRoZSBkZXN0aW5hdGlvbiBsYXllciAodGhlIHJlbWFpbmRlcikKKworMjAwOS0wNi0zMCAxMjozOToxOSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfaTQyMC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5oOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcnBhZC5oOgorCSAgdmlkZW9taXhlcjogTWFrZSBkZWJ1Z2dpbmcgY2F0ZWdvcnkgZ2xvYmFsIHRvIGFsbCB0aGUgY29kZS4KKworMjAwOS0wNi0yOSAxOToyMzo0MSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogaW1wcm92ZSByZWFkYWJpbGl0eSBvZiBkZWJ1Z2dpbmcgc3RhdGVtZW50cy4KKworMjAwOS0wNy0wOCAxMzozODo1MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGRvIG5vdCBsZWFrIHRpbWVvdXQgbWVzc2FnZQorCisyMDA5LTA3LTA5IDA3OjE0OjIzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpOiBEb24ndCBmb3J3YXJkIE5FV1NFR01FTlQgZXZlbnRzIGZyb20gdXBzdHJlYW0KKwkgIE5ldyBvbmVzIGFyZSBnZW5lcmF0ZWQgbGF0ZXIgYW5kIHNpbXBseSBmb3J3YXJkaW5nIHRoZW0gY2FuCisJICByZXN1bHQgaW4gTkVXU0VHTUVOVCBldmVudHMgb2YgZGlmZmVyZW50IGZvcm1hdCBnb2luZyBkb3duc3RyZWFtLgorCSAgRml4ZXMgYnVnICM1ODc5ODMuCisKKzIwMDktMDctMDggMTg6MTk6NDUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9heXV2LmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9pNDIwLmM6CisJICB2aWRlb21peGVyOiBNYWtlIGNoZWNrZXIgcGF0dGVybiBsb29rdXAgdGFibGUgY29uc3RhbnQKKworMjAwOS0wNy0wOCAxODoxNzo0OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfYmdyYS5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogQWRkIHN1cHBvcnQgZm9yIEFSR0IKKwkgIEFuZCBjbGVhbiB1cCB0aGUgY2FwcyBwYXJzaW5nLgorCisyMDA5LTA3LTA4IDE1OjE3OjQxICswMjAwICBCZW5qYW1pbiBHYWlnbmFyZCA8YmVuamFtaW5AZ2FpZ25hcmQubmV0PgorCisJKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmM6CisJICB1ZHA6IEluaXRpYWxpemUgcG9pbnRlciB0byBOVUxMCisJICBPdGhlcndpc2Ugd2UncmUgY2FsbGluZyBmcmVlKCkgd2l0aCBzb21lIHJhbmRvbQorCSAgbWVtb3J5IGFkZHJlc3MgaW4gZXJyb3IgY2FzZXMuCisJICBGaXhlcyBidWcgIzU4Nzk4Mi4KKworMjAwOS0wNy0wNyAxNjozNToyNCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHNwcmlua2xlIHNvbWUgbW9yZSBjb25zdAorCisyMDA5LTA3LTA3IDE1OjU3OjU1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcGVyZm9ybSBzb21lIG1vcmUgKGNhcmVmdWwpIGRhdGEgYnVmZmVyaW5nCisJICBPbmNlIGJ1ZmZlcmluZyBoYXMgc3RhcnRlZCAod2l0aCBhbiBtZGF0IGF0b20pLCBjb250aW51ZSBidWZmZXJpbmcKKwkgIHVudGlsIG1vb3YgYXRvbSBpcyByZWFjaGVkLCB3aGljaCBoYW5kbGVzIGNhc2VzIHdpdGggbXVsdGlwbGUKKwkgIG1kYXQgYXRvbXMuICBBbHNvIGtlZXAgYWRhcHRlci9vZmZzZXQgYmV0dGVyIGluIHN5bmMgd2l0aCB1cHN0cmVhbQorCSAgYW5kIGZpeCBzb21lIGRlYnVnIHN0YXRlbWVudHMuICBGaXhlcyAjNTg3NDI2LgorCisyMDA5LTA3LTA2IDEwOjQwOjMxICswMjAwICBQaGlsaXAgSuRnZW5zdGVkdCA8cGhpbGlwakBvcGVyYS5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBSZXBsYWNlIGRlcHJlY2F0ZWQgR1NUX0RJU0FCTEVfREVCVUcgd2l0aCBjb3JyZWN0IG1hY3JvLiBGaXhlcyAjNTg3ODI2CisKKzIwMDktMDctMDEgMTM6MDc6NDggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBlcnJvciBvdXQgaW5zdGVhZCBvZiBkaXZpZGluZyBieSAwCisJICBFcnJvciBvdXQgaWYgdGltZXNjYWxlIGlzIDAuCisKKzIwMDktMDctMDEgMDk6MzI6NDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBSZXZlcnQgInF0ZGVtdXg6IE1ha2Ugc3VyZSB3ZSBkb24ndCBibGFja2xpc3Qgc3RyZWFtcyBieSB3cm9uZ2x5IGNvbXBhcmluZyB0aGVpciIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgNTUwM2E1OWE1Nzc5YjY3NDUxZDhhMjcxMDAwMTgxNzkwZWU3NmJjNy4KKwkgIFJldmVydGluZyB0aGlzIHNpbmNlIGl0IGNhdXNlcyByZWdyZXNzaW9ucyB3aXRoIGEgbG90IG9mIHNhbXBsZSBmaWxlcworCSAgSSBoYXZlLCBhbGwgb2Ygd2hpY2ggd29ya2VkIGZpbmUgd2l0aCB0aGUgbGFzdCAtZ29vZCByZWxlYXNlICgjNTg2ODkxKS4KKworMjAwOS0wNi0zMCAxNTo1NDo0NyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGNvbW1lbnQgb3V0IHVudXNlZCBzdHJ1Y3R1cmUKKworMjAwOS0wNi0zMCAxMzoxMjowOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IG1vcmUgc2l6ZSBjaGVja3MsIGFuZCB1c2UgZ190cnlfbmV3MCgpIGluc3RlYWQgb2YgZ19uZXcwKCkKKwkgIFdoZW5ldmVyIHdlIGFsbG9jIHNvbWV0aGluZyBiYXNlZCBvbiBhIHVzZXItc3VwcGxpZWQgc2l6ZSwgd2Ugc2hvdWxkCisJICByZWFsbHkgdXNlIGdfdHJ5X25ldygpLCBvdGhlcndpc2Ugd2UgY2FuIGVhc2lseSBiZSBtYWRlIHRvIGFib3J0IGJ5CisJICBwYXNzaW5nIGEgcmlkaWN1bG91c2x5IGxhcmdlIG51bWJlciB0byB1cyBmb3IgYWxsb2NpbmcuIEZpeGVzCisJICBwcm9ibGVtcyB3aXRoIHNvbWUgZnV6emVkIGZpbGVzLgorCisyMDA5LTA2LTI5IDE4OjU4OjMzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZ3VhcmQgYWdhaW5zdCBib2d1cyBhdG9tIHNpemVzIGFuZCBzaG9ydCByZWFkcworCSAgQ2hlY2sgdGhlIHBvc3NpYmx5IDY0LWJpdCBhdG9tIHNpemUgbW9yZSBjYXJlZnVsbHkgYmVmb3JlIGNhc3RpbmcgaXQKKwkgIHRvIGFuIGludCBhbmQgcGFzc2luZyBpdCB0byBnc3RfcGFkX3B1bGxfcmFuZ2UoKSwgb3RoZXJ3aXNlIHdlIG1pZ2h0CisJICBlbmQgdXAgcHVsbGluZyAwIGJ5dGVzLCBnZXR0aW5nIGFuIGVtcHR5IGJ1ZmZlciBhcyByZXF1ZXN0ZWQgYW5kCisJICBkZXJlZmVyZW5jaW5nIG5vdCBhdmFpbGFibGUgZGF0YSB3aGlsc3QgdGhpbmtpbmcgd2UgYWN0dWFsbHkgYXNrZWQKKwkgIGZvciBhbmQgZ290IDB4MTAwMDAwMDAwMDAwMCBieXRlcy4gU2ltaWxhciBmaXggZm9yIHB1c2ggbW9kZSBvcGVyYXRpb24KKwkgIHdoZXJlIG5lZWRlZGJ5dGVzIGVuZHMgdXAgYmVpbmcgMCBieXRlcywgd2hpY2ggbWFrZXMgdXMgYXNzZXJ0LiBGaXhlcworCSAgY3Jhc2ggd2l0aCBicm9rZW4gb3IgZnV6emVkIGZpbGUgKE5CICMxMjIzNzgpLgorCisyMDA5LTA2LTI5IDE2OjUyOjQxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogdXNlIDB4IHByZWZpeCB3aGVuIGxvZ2dpbmcgbnVtYmVycyBpbiBoZXgKKworMjAwOS0wNy0wMSAwODo0MDo0MCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogRG9uJ3Qgc2VuZCBlbXB0eSBzdHJpbmcgdGFncworCisyMDA5LTA2LTMwIDIxOjM1OjM3ICswNDAwICBMUk4gPGxybjE5ODYgYXQgZ21haWwuY29tPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgRG9uJ3QgdXNlIHNlbmRtc2coKS1kZXBlbmRlbnQgY29kZSBvbiBXaW5kb3dzCisJICBGaXhlcyAjNTg1ODQyCisKKzIwMDktMDYtMzAgMTU6NTk6MjAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9sYXcvYWxhdy5jOgorCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LmM6CisJICBsYXc6IGZpeCBjYXBzIGFuZCBuZWdvdGlhdGlvbgorCSAgRml4IHRoZSBjYXBzIHRvIGluY2x1ZGUgdGhlIGRlcHRoIChpbnN0ZWFkIG9mIHdpZHRoIHR3aWNlKSBpbiB0aGUgY2FwcyBvZgorCSAgYXVkaW8veC1yYXctaW50LgorCSAgRml4IG5lZ290aWF0aW9uIHRvIG5vdCBvbmx5IGNvcHkgdGhlIHJhdGUvY2hhbm5lbHMgb2YgdGhlIGZpcnN0IHN0cnVjdHVyZS4KKworMjAwOS0wNi0zMCAxNDo0ODowOSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGluY2x1ZGUgIjEuMD0xMDAlIiBpbiB2b2x1bWUgYW5kIGNoYW5nZSB1cHBlciBsaW1pdAorCSAgVXBwZXIgdm9sdW1lIGxpbW1pdCB3YXMgMTAwMC4gVGhhdCBhcHBlYXIgdW5uZWNlYXNyaWx5IGhpZ2guIEl0IHdvdWxkIGFsc28gY2F1c2UKKwkgIHNldmVyIGRpc3RvcnRpb24gaWYgYWNjaWRlbnRpYWx5IHVzZWQuIE5vdyBpdHMgMTAgKH4gKzE1ZGIpIHdoaWNoIGlzIGFsc28gaW4KKwkgIHN5bmMgd2l0aCB2b2x1bWUgYW5kIHBsYXliaW4yLgorCisyMDA5LTA2LTI5IDE1OjM5OjQzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlOiBzb21lIG1vcmUgdHJpdmlhbCBjbGVhbnVwcworCisyMDA5LTA2LTI5IDE1OjM4OjQ5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VtaXhlci5jOgorCSAgcHVsc2U6IHRyaXZpYWwgY2xlYW51cHMKKworMjAwOS0wNi0yOSAxNToyMDozMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBjbGVhciByaW5nYnVmZmVyIHdoZW4gYXNrZWQgdG8KKwkgIFNpbmNlIHdlIG1hcCB0aGUgcmluZ2J1ZmZlciB0byB0aGUgcHVsc2VhdWRpbyBpbnRlcm5hbCByaW5nYnVmZmVyLCBmbHVzaCB0aGUKKwkgIHB1bHNlYXVkaW8gYnVmZmVyIHdoZW4gd2UgYXJlIGFza2VkIHRvIGNsZWFyIHRoZSByaW5nYnVmZmVyLgorCSAgVGhpcyBhdm9pZHMgc29tZSBsZWZ0b3ZlciBhdWRpbyBhZnRlciBhIHNlZWsuCisKKzIwMDktMDYtMjYgMTU6MDA6MTQgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogYXV0b2dlbi5zaDoKKwkgIGF1dG9nZW4uc2g6IEFjdHVhbGx5IGRvIHRoZSAnZWNobyAtbicgLT4gcHJpbnRmIGNoYW5nZS4KKworMjAwOS0wNi0yNiAxNDo0MDoxNCArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBhdXRvZ2VuLnNoOgorCSAgYXV0b2dlbi5zaDogVXNlIHByaW50ZiBpbnN0ZWFkIG9mICdlY2hvIC1uJy4gQ2hlY2sgZm9yIGF1dG9tYWtlLTEuMVswMV0KKwkgIENoZWNrIGZvciBtb3JlIGF1dG9tYWtlIGNvbW1hbmQgdmFyaWFudHMuIFVzZSBwcmludGYgaW5zdGVhZCBvZiAnZWNobyAtbicKKwkgIGZvciBwb3J0YWJpbGl0eQorCisyMDA5LTA2LTI2IDEzOjQyOjA5ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBmODEwMDMwIHRvIDU4NDViNjMKKworMjAwOS0wNi0yNiAxMzoxOTowNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGRvbid0IHByb2Nlc3MgdHJhY2tfbnVtL3RyYWNrX2NvdW50IHRhZ3Mgd2l0aCBhIDAgdmFsdWUKKwkgIE51bWJlci9jb3VudCB2YWx1ZXMgb2YgMCBtZWFuIHRoZXkncmUgbm90IHNldC4gRG9uJ3QgcHV0IHRob3NlIGluIHRoZQorCSAgdGFnbGlzdC4KKworMjAwOS0wNi0yNSAxODo1MToxMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy93YXZlZm9ybS9nc3R3YXZlZm9ybXNpbmsuYzoKKwkgIHdhdmVmb3Jtc2luazogdXNlICdndWludDgnIGluc3RlYWQgb2YgJ2J5dGUnIHRvIGZpeCBjb21waWxhdGlvbiB3aXRoIE1TVkM4CisJICBXZSBuZWVkIGEgY2FzdCBoZXJlIGZvciBwb2ludGVyIGFyaXRobWV0aWMgdG8gd29yayBjb3JyZWN0bHksIGJ1dCBzb21lCisJICBNU1ZDIHZlcnNpb25zIGRvbid0IHNlZW0gdG8gbGlrZSAnYnl0ZScsIHNvIHVzZSBndWludDggaGVyZS4gSG9wZWZ1bGx5CisJICBmaXhlcyAjNTg1MzYxLgorCisyMDA5LTA2LTI1IDE5OjM5OjM3ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDJzcmM6IHNldCBzdHJ1Y3RzIHRvIHplcm8gYmVmb3JlIHVzaW5nIHRoZW0gaW4gaW9jdGxzCisJICBUaGlzIGZpeGVzIHZhbGdyaW5kIHdhcm5pbmdzLgorCisyMDA5LTA2LTI1IDEzOjIzOjQwICswMjAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IE1ha2Ugc3VyZSB3ZSBkb24ndCBibGFja2xpc3Qgc3RyZWFtcyBieSB3cm9uZ2x5IGNvbXBhcmluZyB0aGVpciBkdXJhdGlvbiB3aXRoIGVudGlyZSBjbGlwIGR1cmF0aW9uLgorCisyMDA5LTA2LTI1IDEzOjE4OjE0ICswMjAwICBLcnp5c3p0b2YgQsWCYXN6a293c2tpIDxrYiBhdCBzeXNtaWtyby5jb20ucGw+CisKKwkqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOgorCSAgcnRwZGVjOiBmaXggc29tZSBidWZmZXIgbGVha3MKKworMjAwOS0wNi0yNSAwODoxMTowOSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOgorCSAgZmx2cGFyc2U6IEFkZCBtaXNzaW5nIGJyZWFrIGluIHN3aXRjaC9jYXNlLgorCisyMDA5LTA2LTI1IDA4OjEwOjM4ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSwgaGludCBicmFuY2ggbGlrZWxpbmVzcywgYWRkIGNvbW1lbnRzLgorCisyMDA5LTA2LTI1IDA4OjA5OjU3ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUKKworMjAwOS0wNi0yNSAwNzo0MTowNyArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogUmVtb3ZlIGRlYWQgYXNzaWdubWVudHMgYW5kIHVudXNlZCB2YXJpYWJsZXMuCisJICBBbHNvIGFkZCBicmFuY2ggbGlrZWxpbmVzcyBtYWNyb3MuCisKKzIwMDktMDYtMjUgMDc6NDA6MjYgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy4gRml4ZXMgYnVpbGQgb24gbWFjb3N4CisKKzIwMDktMDYtMjQgMTc6NDM6MjUgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBmcmVlIG1lbW9yeSBpbiBmaW5hbGl6ZQorCSAgZmluYWxpemUgaXMgY2FsbGVkIG9ubHkgb25jZS4gbm8gbmVlZCB0byBjbGVhciBwb2ludGVycyB0aGVyZS4gZGlzcG9zZSBpcyBmb3IKKwkgIHVucmVmZmluZy4KKworMjAwOS0wNi0yNCAxNToxNDoxNCArMDEwMCAgSmFuIFNjaG1pZHQgPGphbi5zY2htaWR0QHN1bi5jb20+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA2YWIxMWQxIHRvIGY4MTAwMzAKKworMjAwOS0wNi0wOCAxNDo0Njo0OCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBzaG9ydC1jaXJjdWl0IGdzdF9hdmlfZGVtdXhfc3JjX2NvbnZlcnQoKSB3aGVuIHBhcnNpbmcgdGhlIGluZGV4CisJICBEb24ndCBjYWxsIGdzdF9hdmlfZGVtdXhfc3JjX2NvbnZlcnQoKSBmb3IgZWFjaCBzaW5nbGUgaW5kZXggZW50cnkuIE5vdAorCSAgb25seSBkbyB3ZSBhbHJlYWR5IGhhdmUgdGhlIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBjb250ZXh0LCB3ZSBhbHNvIGtub3cKKwkgIHRoZSBmb3JtYXRzIHdlIHdhbnQgdG8gY29udmVydCBmcm9tIGFuZCB0byBhbHJlYWR5LCBzbyB3ZSBtYXkganVzdCBhcworCSAgd2VsbCB1c2Ugb3B0aW1pc2VkIGNvbnZlcnNpb24gcm91dGluZXMgdGhhdCBieXBhc3Mgc29tZSBvZiB0aGUgY2hlY2tzCisJICBhbmQgbG9va3VwcyBtYWRlIGluIGdzdF9hdmlfZGVtdXhfc3JjX2NvbnZlcnQoKS4KKworMjAwOS0wNi0xNyAxNjozOTozNiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQW5vdGhlciByb3VuZCBvZiBHXypMSUtFTFkgbWljcm8tb3B0aW1pc2F0aW9ucy4KKworMjAwOS0wNi0xNyAxNjoyMDoyNSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogVGFrZSBsYXN0IHNhbXBsZSBkdXJhdGlvbiBmb3IgZHVtbXkgc2VnbWVudCBjYWxjdWxhdGlvbi4KKwkgIFRoaXMgZml4ZXMgdGhlIGNhc2VzIHdoZXJlIGZpbGVzIHdpdGhvdXQgRURMIHdvdWxkbid0IG91dHB1dCB0aGVpcgorCSAgbGFzdCBidWZmZXIuCisKKzIwMDktMDYtMjQgMTI6MzY6MzEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBTcHJpbmtsZSBicmFuY2ggbGlrZWxpbmVzcyBtYWNyb3Mgb3ZlciB0aGUgY29kZS4KKworMjAwOS0wNi0yMyAxNjo1NDozMiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJICByYXcxMzk0OiBzcHJpbmtsZSBicmFuY2ggbGlrZWxpbmVzcyBtYWNyb3MgYWNjcm9zcyB0aGUgY29kZS4KKworMjAwOS0wNi0xNCAxMDozNjoxNyArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWRkIEdTVF9NRU1EVU1QIHN0YXRlbWVudHMgZm9yIHVua25vd24gYXRvbXMuCisJICBUaGlzIGlzIHRvIGhlbHAgZGV2ZWxvcGVycyB0cmFjayBkb3duIGFuZCBpbXBsZW1lbnQgdW5oYW5kbGVkIGF0b21zIGZhc3Rlci4KKworMjAwOS0wNi0yMyAxNzo1MTozMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IFJlbW92ZSB0aGUgaW50ZXJsYWNlZCBmaWVsZCBmcm9tIHRoZSBvdXRwdXQgY2FwcyBpZiBkZWludGVybGFjaW5nIGlzIGVuYWJsZWQKKworMjAwOS0wNi0yMyAxNzo0ODo0NyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5jOgorCSAgZGVpbnRlcmxhY2U6IENvcHkgdGhlIGNvcnJlY3QgbGluZSBmcm9tIGNvcnJlY3QgcGxhY2UgaW4gdGhlIGhpc3RvcnkKKworMjAwOS0wNi0yMyAxNjozNTozNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogdXNlIHNhbWUgcHJvdG9jb2xzIGFmdGVyIHJlZGlyZWN0CisJICBBZnRlciBhIHJlZGlyZWN0IHdlIHdhbnQgdG8gdXNlIHRoZSBzYW1lIHByb3RvY29scyB0aGF0IHdlIHdlcmUgdXNpbmcgZm9yIHRoZQorCSAgY3VycmVudCB1cmwuCisKKzIwMDktMDYtMjMgMTU6MzU6MzcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBkb24ndCBsZWFrIGNvdmVyIGFydAorCisyMDA5LTA2LTIzIDE0OjEwOjEwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSAgdWRwOiBmaXggY29tcGlsZXIgd2FybmluZyBhYm91dCBFQUlfQUREUkZBTUlMWSBnZXR0aW5nIHJlZGVmaW5lZCBpbiBzb21lIGNhc2VzCisJICBJbmNsdWRlIHRoZSBoZWFkZXIgZnJvbSB3aGVyZSB3ZSBpbmNsdWRlIGFsbCB0aGUgc3lzdGVtIGhlYWRlcnMgd2l0aCB0aGUKKwkgIHNvY2tldCBzdHVmZiBiZWZvcmUgd2UgdHJ5IHRvIGRlZmluZSBFQUlfQUREUkZBTUlMWSBvdXJzZWx2ZXMsIG90aGVyd2lzZQorCSAgd2UgZGVmaW5lIGl0IG91cnNlbHZlcyBhbmQgdGhlbiBnZXQgYSBjb21waWxlciB3YXJuaW5nIGlmIGEgc3lzdGVtIGhlYWRlcgorCSAgZGVmaW5lcyBpdCBhcyB3ZWxsIHdpdGhvdXQgZ3VhcmRpbmcgYWdhaW5zdCBpdCBiZWluZyBkZWZpbmVkIGFscmVhZHkuCisKKzIwMDktMDYtMjMgMTQ6Mzk6NTYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIG1hdHJvc2thOiBhbmQgdGhlIG5ldyBoZWFkZXJzIHRvbworCisyMDA5LTA2LTIzIDE0OjMyOjQzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2tlOiBmaXggY29tcGlsZXIgZXJyb3IKKwkgIGNoYW5nZSBncG9pbnRlciB0byBndWludDggKiBmb3IgY29kZWNfc3RhdGUgYW5kIGNvZGVjX3ByaXYgYXMgc29tZQorCSAgZnVuY3Rpb25zIG9wZXJhdGUgb24gdGhvc2UgdHlwZXMgYW5kIGl0IGF2b2lkcyBicmVha2luZyBzdHJpY3QtYWxpYXNpbmcKKwkgIHJ1bGVzLgorCisyMDA5LTA2LTIzIDEyOjQyOjMzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGF2b2lkIGxlYWtpbmcgYnVmZmVycworCSAgRG9uJ3QgbGVhayBidWZmZXJzIHdoZW4gcmVzeW5jaW5nIHRvIGEga2V5ZnJhbWUuCisJICBBdm9pZCBsZWFraW5nIGJ1ZmZlcnMgd2hlbiBleGl0aW5nIHRoZSBsb29wIG9uIGVycm9yIGNvbmRpdGlvbnMuCisJICBBZGQgc29tZSBtb3JlIGRlYnVnIGluZm8uCisJICBGaXhlcyAjNTg1OTExCisKKzIwMDktMDYtMjIgMTU6NTY6NTggKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogb3Blbi9jbG9zZSB0aGUgZGV2aWNlIGluIFJFQURZCisJICBUaGlzIGFsbG93cyB0byBxdWVyeSB0aGUgZGV2aWNlIGluIFJFQURZLiBCZWZvcmUgb25lIG5lZWQgdG8gc3dpdGNoIGl0IHRvIFBBVVNFRAorCSAgYW5kIHRoYXQgYWxzbyBzdGFydHMgc3RyZWFtaW5nLgorCisyMDA5LTA2LTIwIDE1OjQxOjQ0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6CisJICBxdGRlbXV4OiB1c2UgR1NUX01FTURVTVAKKworMjAwOS0wNi0xOSAwMDoxNjo0MSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hcGV0YWcvTWFrZWZpbGUuYW06CisJKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6CisJICBhcGVkZW11eDogYWRkIGNvbnRhaW5lci1mb3JtYXQgdGFnCisJICBVc2UgcGJ1dGlscyBoZXJlIGJlY2F1c2UgdGhlIHN0cmluZyBpcyB0cmFuc2xhdGVkLgorCisyMDA5LTA2LTE5IDAwOjE1OjUxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lkM2RlbXV4L01ha2VmaWxlLmFtOgorCSogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6CisJICBpZDNkZW11eDogYWRkIGNvbnRhaW5lci1mb3JtYXQgdGFnCisJICBVc2luZyBwYnV0aWxzIGhlcmUgYmVjYXVzZSB0aGUgc3RyaW5nIGlzIHRyYW5zbGF0ZWQuCisKKzIwMDktMDYtMTggMjM6NTE6NTIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSAgZHZkZW11eDogcG9zdCBjb250YWluZXItZm9ybWF0IHRhZworCSAgQWxzbyBtZXJnZSB0aGUgdHdvIGFsbW9zdCBpZGVudGljYWwgX2FkZF8qX3BhZCgpIGZ1bmN0aW9ucyBpbnRvIG9uZS4KKworMjAwOS0wNi0xOCAyMzo0Mzo0OSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJICBkdmRlbXV4OiBkb24ndCBzY3JldyB1cCBmaXJzdCBhdWRpbyBidWZmZXIKKwkgIFF1ZXJ5IHRoZSBhdWRpbyBmb3JtYXQsIGVzcC4gZHZkZW11eC0+bnVtX2NoYW5uZWxzLCBiZWZvcmUgd2UgdXNlIHRoYXQKKwkgIHZhcmlhYmxlIHRvIGFsbG9jYXRlIHRoZSBpbml0aWFsIGJ1ZmZlci4gVGhhdCB3YXkgd2UgZG9uJ3QgYWNjaWRlbnRhbGx5CisJICBwdXNoIGEgemVyby1zaXplZCBidWZmZXIgYXMgZmlyc3QgYXVkaW8gYnVmZmVyLgorCisyMDA5LTA2LTE4IDIzOjM4OjMwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSAgbXVsdGlwYXJ0ZGVtdXg6IHBvc3QgY29udGFpbmVyLWZvcm1hdCB0YWcKKworMjAwOS0wNi0xOCAyMzozNzoxMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2EtZGVtdXg6IHBvc3QgY29udGFpbmVyLWZvcm1hdCB0YWdzCisKKzIwMDktMDYtMTggMjM6MzY6MjggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogcG9zdCBjb250YWluZXItZm9ybWF0IHRhZworCisyMDA5LTA2LTE4IDIzOjM1OjI5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcG9zdCBjb250YWluZXItZm9ybWF0IHRhZ3MKKworMjAwOS0wNi0yMSAxNzoxMzo0MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jOgorCSAgYXVkaW9hbXBsaWZ5OiBGaXggaW50ZWdlciBvdmVyZmxvd3Mgb24gMzIgYml0IGFyY2hpdGVjdHVyZXMKKworMjAwOS0wNi0yMSAwOTo1MDo1NCArMDIwMCAgS2lwcCBDYW5ub24gPGtjYW5ub25AbGlnby5jYWx0ZWNoLmVkdT4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5LmM6CisJICBhdWRpb2FtcGxpZnk6IERvbid0IGRlY2xhcmUgYSBsb29wIGluZGV4IHN0YXRpYworCSAgVGhlIHByZXZpb3VzIHBhdGNoIHRvIGFkZCBzdXBwb3J0IGZvciBhZGRpdGlvbmFsIHNhbXBsZSBmb3JtYXRzIHBvc3NpYmx5CisJICBpbnRyb2R1Y2VkIGEgcmVlbnRyYW5jeSBidWc6ICBhIHZhcmlhYmxlIHVzZWQgZm9yIGEgbG9vcCBpbmRleCB3YXMgZGVjbGFyZWQKKwkgIHN0YXRpYy4gIFRoaXMgcGF0Y2ggZml4ZXMgdGhhdCwgYW5kIGFsc28gYWRkcyBhICIvKiAqSU5ERU5ULU9OKiAqLyIgYW5ub3RhdGlvbgorCSAgZm9sbG93aW5nIHRoZSBtYWNybyBibG9jay4gIChJIGRvbid0IGtub3cgd2hhdCB0aGUgYW5ub3RhdGlvbiBpcyBmb3IsIGJ1dCB0aGUKKwkgIGFkZGVyLCB3aGVyZSBJIGNvcGllZCB0aGlzIGZyb20sIGhhcyBpdCkuCisKKzIwMDktMDYtMTkgMjI6Mzc6MjcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzoKKwkgIGF1ZGlvYW1wbGlmeTogRml4IG9mZi1ieS1vbmUgaW4gd3JhcC1wb3NpdGl2ZSBtb2RlCisKKzIwMDktMDYtMTkgMjI6MjA6NDUgKzAyMDAgIEtpcHAgQ2Fubm9uIDxrY2Fubm9uQGxpZ28uY2FsdGVjaC5lZHU+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5Lmg6CisJICBhdWRpb2FtcGxpZnk6IEFkZCBub2NsaXAgbWV0aG9kIGFuZCBzdXBwb3J0IGZvciBtb3JlIGZvcm1hdHMKKwkgIEZpeGVzIGJ1ZyAjNTg1ODI4IGFuZCAjNTg1ODMxLgorCisyMDA5LTA2LTE5IDIxOjQ2OjQxICswMjAwICBLb29wIE1hc3QgPGt3bUBmcmVlYnNkLm9yZz4KKworCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5oOgorCSAgdWRwOiBGaXggYnVpbGQgb24gRnJlZUJTRAorCSAgRml4ZXMgYnVnICM1ODYzOTcuCisKKzIwMDktMDYtMTkgMTg6MTI6MjcgKzAyMDAgIE9nbnlhbiBUb25jaGV2IDxvZ255YW4udG9uY2hldiBhdCBheGlzLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHRlc3RzOiBhZGQgdW5pdCB0ZXN0cyBmb3IgYnVmZmVyLWxpc3QgcGF5bG9hZGVycworCSAgU2VlICM1ODU1NTkKKworMjAwOS0wNi0xOSAxODowMDozNSArMDIwMCAgT2dueWFuIFRvbmNoZXYgPG9nbnlhbi50b25jaGV2IGF0IGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5oOgorCSAgcnRwbXA0dnBheTogYWRkIHN1cHBvcnQgZm9yIGJ1ZmZlci1saXN0CisJICBTZWUgIzU4NTU1OQorCisyMDA5LTA2LTE5IDE3OjU3OjEyICswMjAwICBPZ255YW4gVG9uY2hldiA8b2dueWFuLnRvbmNoZXYgYXQgYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5Lmg6CisJICBydHBqcGVncGF5OiBhZGQgc3VwcG9ydCBmb3IgYnVmZmVyLWxpc3RzCisJICBTZWUgIzU4NTU1OQorCisyMDA5LTA2LTE5IDE3OjUzOjMyICswMjAwICBPZ255YW4gVG9uY2hldiA8b2dueWFuLnRvbmNoZXYgYXQgYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJICBydHBoMjY0cGF5OiBhZGQgc3VwcG9ydCBmb3IgYnVmZmVyLWxpc3RzCisJICBTZWUgIzU4NTU1OQorCisyMDA5LTA2LTE4IDExOjU0OjIyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmM6CisJICB1ZHB1dGlsczogZG9uJ3QgZnJlZSBpbnZhbGlkIG1lbW9yeQorCSAgQXMgc3BvdHRlZCBieSBiZW5qaUcgaW4gSVJDLgorCSAgZG9uJ3QgZnJlZSBpbnZhbGlkIG1lbW9yeSB3aGVuIGdldGFkZHJpbmZvIGZhaWxlZC4KKworMjAwOS0wNi0xNyAxNzo0ODozMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2Vpbms6IGRvbid0IGxlYWsgZGV2aWNlX2Rlc2NyaXB0aW9uCisJICBkb24ndCBsZWFrIHRoZSBkZXZpY2VfZGVzY3JpcHRpb24uCisJICBzb21lIGNsZWFudXBzLgorCisyMDA5LTA2LTE5IDE0OjQ0OjQwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiB1cGRhdGUgLnBvIGZpbGVzIGZvciBzdW5hdWRpb21peGVyIHN0cmluZyBjaGFuZ2VzCisKKzIwMDktMDYtMTggMTY6NTg6MjYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogc3RyZWFtaW5nOyBhZGp1c3Qgc2l6ZXMgdG8gY2F0ZXIgZm9yIHBhZGRpbmcgaW4gY2h1bmtzCisKKzIwMDktMDYtMTcgMTE6NTQ6NTMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogc3RyZWFtaW5nIG1vZGU7IGhhbmRsZSBkYXRhIGNodW5rcyBncm91cGVkIGluIHJlYyBsaXN0cy4KKwkgIEZpeGVzICM1Njc5ODMuCisKKzIwMDktMDYtMTAgMTI6MzY6NTAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBtYXAgc29tZSB0YWdzIHRvIENPTVBPU0VSIHJhdGhlciB0aGFuIEFSVElTVAorCisyMDA5LTA2LTEwIDEyOjM0OjQzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IHNvbWUgM0dQIHRhZyBleHRyYWN0aW9uIChrZXl3b3JkcywgZ2VucmUsIGxvY2F0aW9uKQorCisyMDA5LTA2LTA5IDE1OjM2OjUwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkgIHF0ZGVtdXg6IGV4dHJhY3QgcGl4ZWwtYXNwZWN0LXJhdGlvIGluZm9ybWF0aW9uCisKKzIwMDktMDYtMTcgMDc6MTQ6MDkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IEZpeCBsZWFraW5nIG9mIHRoZSBNYXRyb3NrYSBUSVRMRSBlbGVtZW50CisKKzIwMDktMDYtMTYgMjA6Mzg6NDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmg6CisJKiBnc3QvZWZmZWN0di9nc3RyZXYuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJldi5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5oOgorCSAgZWZmZWN0djogQWRkIGJhc2ljIGRvY3VtZW50YXRpb24gZm9yIHRoZSBlZmZlY3R2IGVsZW1lbnRzCisKKzIwMDktMDYtMTYgMjA6MTY6MTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZWZmZWN0di5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYzoKKwkgIGVmZmVjdHY6IERlZmluZSB0aGUgZmFzdCBQUk5HIGZ1bmN0aW9uIGF0IGEgY2VudHJhbCBwbGFjZQorCisyMDA5LTA2LTE2IDIwOjEzOjM1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvTWFrZWZpbGUuYW06CisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuaDoKKwkqIGdzdC9lZmZlY3R2L2dzdGRpY2UuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGRpY2UuaDoKKwkqIGdzdC9lZmZlY3R2L2dzdGVkZ2UuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGVkZ2UuaDoKKwkqIGdzdC9lZmZlY3R2L2dzdGVmZmVjdHYuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGVmZmVjdHYuaDoKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmV2LmM6CisJKiBnc3QvZWZmZWN0di9nc3RyZXYuaDoKKwkqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuaDoKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uaDoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuaDoKKwkgIGVmZmVjdHY6IE1vdmUgdHlwZSBkZWZpbml0aW9ucyBpbnRvIHNlcGFyYXRlIGhlYWRlcnMKKwkgIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgZG9jcyBsYXRlci4KKworMjAwOS0wNi0xNiAxOTo0MTowMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmV2LmM6CisJKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmM6CisJKiBnc3QvZWZmZWN0di9nc3R2ZXJ0aWdvLmM6CisJKiBnc3QvZWZmZWN0di9nc3R3YXJwLmM6CisJICBlZmZlY3R2OiBSZW1vdmUgZ2V0X3VuaXRfc2l6ZSBpbXBsZW1lbnRhdGlvbnMKKwkgIFRoZSBkZWZhdWx0IG9uIGZyb20gR3N0VmlkZW9GaWx0ZXIgaGFuZGxlcyB0aGlzIGFscmVhZHkuCisKKzIwMDktMDYtMTYgMTQ6NTQ6MzQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IGJ1bXAgY29yZS9iYXNlIHJlcXVpcmVtZW50cyB0byBnaXQKKwkgIE5lZWQgZ2l0IGNvcmUgZm9yIGJhc2VzaW5rIGJ1ZmZlcmxpc3QgYWRkaXRpb25zOyAtYmFzZSByZXF1aXJlbWVudAorCSAgYnVtcGVkIGdyYXR1aXRvdXNseS4KKworMjAwOS0wNi0xNiAxNToyNTo1NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdWRwc2luay5jOgorCSAgdGVzdHM6IGFkZCBzb21lIGRlYnVnLCBzZW5kIG5ld3NlZ21lbnQKKworMjAwOS0wNi0xNiAxNTowNjo1MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogYWRkIGRlYnVnIGxpbmUgZm9yIHRoZSBzb2NrZXQKKworMjAwOS0wNi0xNiAxNTowNjoyNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL2ZsYWNkZWMuYzoKKwkgIHRlc3RzOiB0dXJuIGdfcHJpbnQgaW50byBkZWJ1ZworCisyMDA5LTA2LTE2IDE1OjA0OjE1ICswMjAwICBPZ255YW4gVG9uY2hldiA8b2dueWFuQGF4aXMuY29tPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy91ZHBzaW5rLmM6CisJICBtdWx0aXVkcHNpbms6IGFkZCBzdXBwb3J0IGZvciBidWZmZXIgbGlzdHMKKwkgIEFkZCBzdXBwb3J0IGZvciBCdWZmZXJMaXN0IGFuZCBhZGQgYSB1bml0IHRlc3QuCisJICBGaXhlcyAjNTg1ODQyCisKKzIwMDktMDYtMTYgMDA6MDI6NDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IHJlc2V0IHNlc3Npb24gc3RhdGUgd2hlbiBzdG9wcGluZworCSAgSW5jcmVhc2VzIHRoZSBjaGFuY2VzIHRoYXQgdGhlIGVsZW1lbnQgaXMgYWN0dWFsbHkgcmV1c2FibGUuCisKKzIwMDktMDYtMTUgMjM6NDk6NDggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IGxvZyByZXNwb25zZSBhbmQgcmVxdWVzdCBoZWFkZXJzIGFuZCBmaXggc29tZSBicm9rZW4gaW5kZW50aW5nCisKKzIwMDktMDYtMTUgMjI6NDA6MzUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJICBtcDRnZGVwYXk6IGd1ZXNzIGNvbnN0YW50RHVyYXRpb24gYmV0dGVyCisJICBEbyBhIGJldHRlciBqb2IgYXQgZ3Vlc3NpbmcgdGhlIGNvbnN0YW50RHVyYXRpb24gcGFyYW1ldGVyIHdoZW4gaXQgaXMgbm90CisJICBwcmVzZW50IGluIHRoZSBjYXBzLgorCSAgRml4ZXMgIzU4NTIwNQorCisyMDA5LTA2LTE1IDIxOjA5OjQ3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSAgd2FycHR2OiBDbGVhbiB1cCB3YXJwdHYgZWxlbWVudCBhbmQgZml4IHNvbWUgbWlub3IgYnVncyBhbmQgbGVha3MKKworMjAwOS0wNi0xNSAyMDo1MzoyMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkgIHZlcnRpZ290djogQ2xlYW4gdXAgdmVydGlnb3R2IGVsZW1lbnQgYW5kIGZpeCBzb21lIG1pbm9yIGJ1Z3MgYW5kIGxlYWtzCisKKzIwMDktMDYtMTUgMjA6Mzg6MDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJICBkaWNldHY6IFVzZSBndWludDggaW5zdGVhZCBvZiBjaGFyICh3aGljaCBjYW4gYmUgc2lnbmVkIG9yIHVuc2lnbmVkKQorCisyMDA5LTA2LTE1IDIwOjM2OjM5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5jOgorCSAgc2hhZ2FkZWxpY3R2OiBVc2UgZ3VpbnQ4L2dpbnQ4IGluc3RlYWQgb2YgY2hhciAod2hpY2ggY2FuIGJlIHNpZ25lZCBvciB1bnNpZ25lZCkKKworMjAwOS0wNi0xNSAyMDozMTozMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYzoKKwkgIHNoYWdhZGVsaWN0djogQ2xlYW4gdXAgZWxlbWVudCBhbmQgZnJlZSBhbGwgbWVtb3J5IGluIGZpbmFsaXplCisKKzIwMDktMDYtMTUgMjA6MjE6NTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RyZXYuYzoKKwkgIHJldnR2OiBDbGVhbiB1cCByZXZ0diBlbGVtZW50CisKKzIwMDktMDYtMTUgMjA6MDc6NDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5jOgorCSAgcXVhcmt0djogU2ltcGxpZnkgc29tZSBjb2RlCisKKzIwMDktMDYtMTUgMjA6MDc6MTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5jOgorCSAgcXVhcmt0djogVXNlIHRoZSBpbnB1dCBkYXRhIGlmIGEgTlVMTCBidWZmZXIgaXMgY2hvc2VuIGluc3RlYWQgb2YgdGhlIHZhbHVlIDAKKworMjAwOS0wNi0xNSAyMDowMDo0MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJICBxdWFya3R2OiBGaXggc2V0dGluZyB0aGUgcGxhbmVzIHByb3BlcnR5IG9mIHF1YXJrdHYKKwkgIFNldHRpbmcgaXQgdG8gYSB2YWx1ZTwxNiB3b3VsZCBjYXVzZSBjcmFzaGVzIGJlZm9yZSBiZWNhdXNlCisJICBjdXJyZW50X3BsYW5lIHdhcyBzZXQgdG8gdGhlIG9sZCBudW1iZXIgb2YgcGxhbmVzLTEuIEFsc28KKwkgIGZpeCBjYWxjdWxhdGlvbnMgZm9yIG5vbi0yXm4gcGxhbmVzIHZhbHVlcy4KKworMjAwOS0wNi0xNSAxNzo1MDo0MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJICBxdWFya3R2OiBDbGVhbiB1cCB0aGUgcXVhcmt0diBlbGVtZW50CisKKzIwMDktMDYtMTUgMTc6Mzk6MjAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RlZmZlY3R2LmM6CisJICBlZmZlY3R2OiBNYWtlIGVsZW1lbnRzIGxpc3QgY29uc3RhbnQKKworMjAwOS0wNi0xNSAxNzozNzo1MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdGVkZ2UuYzoKKwkgIGVkZ2V0djogQ2xlYW4gdXAgZWRnZXR2IGVsZW1lbnQgYW5kIGZpeCBtZW1vcnkgbGVhaworCisyMDA5LTA2LTE1IDE3OjIxOjU4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jOgorCSAgZGljZXR2OiBDbGVhbiB1cCBkaWNldHYgZWxlbWVudCBhbmQgZml4IHNvbWUgc21hbGxlciBpc3N1ZXMKKwkgIFRoaXMgZml4ZXMgYSBtZW1vcnkgbGVhayAodGhlIGRpY2UgbWFwKSBhbmQgYSBjcmFzaCB3aGVuCisJICBzZXR0aW5nIHRoZSBzcXVhcmUtYml0cyBwcm9wZXJ0eSBiZWZvcmUgY2FwcyBhcmUgc2V0LgorCisyMDA5LTA2LTE1IDE3OjIwOjIxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvTWFrZWZpbGUuYW06CisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSAgYWdpbmd0djogQWN0dWFsbHkgdXNlIEdzdENvbnRyb2xsZXIgZm9yIHN5bmNpbmcgdGhlIHByb3BlcnRpZXMgdG8gdGltZXN0YW1wcworCisyMDA5LTA2LTE1IDE3OjAzOjM4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuYzoKKwkgIGFnaW5ndHY6IEV4cG9ydCBzb21lIG1vcmUgYWdpbmd0diBwcm9wZXJ0aWVzIHZpYSBHT2JqZWN0IHByb3BlcnRpZXMKKworMjAwOS0wNi0xNSAxNTowNjo1NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJICBhZ2luZ3R2OiBHZW5lcmFsIGNsZWFudXAgYW5kIHVwZGF0aW5nIG9mIGNvcHlyaWdodAorCSAgQWxzbyBtYWtlIHRoZSBzY3JhdGNoLWxpbmVzIHByb3BlcnR5IGV4cG9ydGVkIHZpYSBhIEdPYmplY3QKKwkgIHByb3BlcnR5IGFuZCBpbml0aWFsaXplL3Jlc2V0IHRoZSBpbnRlcm5hbCBzdGF0ZSBjb3JyZWN0bHkuCisKKzIwMDktMDYtMTUgMTU6MDU6NTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSAgYWdpbmd0djogU3RvcmUgYW5kIHVwZGF0ZSBzdGF0ZSBpbnNpZGUgdGhlIGluc3RhbmNlIHN0cnVjdAorCSAgVGhpcyBtYWtlcyB0aGUgY29sb3JhZ2luZyBlZmZlY3QgYW5kIHBpdHMgZWZmZWN0IHZpc2libGUuCisKKzIwMDktMDYtMTUgMTU6NTE6MzIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IHJlZiBjdXN0b20gcmluZyBidWZmZXIgY2xhc3MgYW5kIHR5cGUgaW4gY2xhc3NfaW5pdAorCSAgSGFjayBhcm91bmQgdGhyZWFkLXNhZmV0eSBpc3N1ZXMgaW4gR09iamVjdCBhbmQgb3VyIHJhY3kgX2dldF90eXBlKCkKKwkgIGZ1bmN0aW9ucyAod2UgY291bGQgZWFzaWx5IGZpeCB0aGUgX2dldF90eXBlKCkgZnVuY3Rpb25zLCBidXQgd2Ugc3RpbGwKKwkgIG5lZWQgdG8gaGFjayBhcm91bmQgdGhlIEdPYmplY3QgY2xhc3MgcmFjZXMgdW50aWwgd2UgcmVxdWlyZSBhIG5ld2VyCisJICBHTGliIHZlcnNpb24sIEkgdGhpbmspLgorCisyMDA5LTA2LTE0IDE5OjE5OjE5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2R2L2RlbW8tcGxheS5jOgorCSogdGVzdHMvb2xkL2V4YW1wbGVzL01ha2VmaWxlLmFtOgorCSogdGVzdHMvb2xkL2V4YW1wbGVzL2xldmVsL01ha2VmaWxlLmFtOgorCSogdGVzdHMvb2xkL2V4YW1wbGVzL2xldmVsL1JFQURNRToKKwkqIHRlc3RzL29sZC9leGFtcGxlcy9sZXZlbC9kZW1vLmM6CisJKiB0ZXN0cy9vbGQvZXhhbXBsZXMvbGV2ZWwvcGxvdC5jOgorCSogdGVzdHMvb2xkL2V4YW1wbGVzL3N3aXRjaC8uZ2l0aWdub3JlOgorCSogdGVzdHMvb2xkL2V4YW1wbGVzL3N3aXRjaC9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL29sZC9leGFtcGxlcy9zd2l0Y2gvc3dpdGNoZXIuYzoKKwkgIFJlbW92ZSBhIGZldyBvbGQgZXhhbXBsZSBhcHBzIGZyb20gdGhlIDAuOCBkYXlzCisJICBTb21lIGhhdmUgYmVlbiByZXBsYWNlZCBieSBuZXdlciBvbmVzLCBvdGhlcnMgYXJlIGRlbW9pbmcgZWxlbWVudHMgdGhhdAorCSAgZG9uJ3QgZXhpc3QgYW55IGxvbmdlciAobm90IGluIC1nb29kIGFueXdheSksIGFuZCBvdGhlcnMgaGF2ZSBub3QgYmVlbgorCSAgdG91Y2hlZCBpbiBtYW55IHllYXJzIGFuZCBpdCBzZWVtIHBvaW50bGVzcyB0byBrZWVwIHRoZW0gYXJvdW5kLgorCSAgUmVtb3ZpbmcgdGhlc2UgZmlsZXMgbWFrZXMgc3VyZSB3ZSBkb24ndCBoYXZlIGFueSBjb2RlIGluIG91ciByZXBvc2l0b3J5CisJICB0aGF0IHVzZXMgR3RrKyBzeW1ib2xzIHdoaWNoIGFyZSB0byBiZSByZW1vdmVkIGZvciBHTk9NRTMsIGFuZCBhcyBzdWNoCisJICB3aWxsIG1ha2Ugc29tZSBzY3JpcHQgdGhhdCBncmVwcyBmb3IgdGhpcyBraW5kIG9mIHN0dWZmIGdpdmUgdXMgYSBjbGVhbgorCSAgYmlsbCBvZiBjb2RlIGhlYWx0aC4gRml4ZXMgIzU4NTc1Ny4KKworMjAwOS0wNi0xMyAyMTowMjo0NSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkqIGNvbW1vbjoKKwkqIGdzdC9ydHAvZ3N0cnRwc2lyZW5wYXkuYzoKKwkgIHJ0cHNpcmVucGF5OiBSZW1vdmUgZGVwcmVjYXRlZCBzeW1ib2wKKwkgIFBhdGNoIGJ5OiBMdWlzIE1lbmluYQorCisyMDA5LTA2LTEzIDEwOjQzOjU1ICswMjAwICBNYXJ2aW4gU2NobWlkdCA8bWFydmluX3NjaG1pZHRAZ214Lm5ldD4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICB0ZXN0czogRG9uJ3QgcnVuIHRoZSBmbGFjZGVjIHRlc3QgaWYgdGhlIHBsdWdpbiBpc24ndCBidWlsdC4gRml4ZXMgIzU4NTYzMAorCisyMDA5LTA2LTEyIDE2OjA2OjI4ICswMjAwICBQYXRyaWNrIFJhZGl6aSA8cGF0cmljay5yYWRpemkgYXQgYXhpcy5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IEFkZCBSVFAgYmxvY2tzaXplIGZ1bmN0aW9uYWxpdHkKKwkgIEFkZCBwcm9wZXJ0eSB0byBtYWtlIHRoZSBjbGllbnQgc3VnZ2VzdCBhIGJsb2Nrc2l6ZSB0byB0aGUgc2VydmVyLgorCSAgRml4ZXMgIzU4NTU0OQorCisyMDA5LTA2LTExIDIyOjMwOjA2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL1JFQURNRToKKwkgIHJ0cDogdXBkYXRlIFJFQURNRSwgZml4IHNvbWUgdHlwb3MsIG1lbnRpb24gZ3N0cnRwYmluCisKKzIwMDktMDYtMTEgMTk6MTA6NTMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogaGFuZGxlIGJvcmRlciBjYXNlcyBpbiByZXNhbXBsZXIKKworMjAwOS0wNi0xMSAxMzozMjoyMiArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBjb21tb246CisJKiBkb2NzL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy91cGxvYWQubWFrOgorCSAgZG9jczogQnVtcCBjb21tb24uIFVzZSB1cGxvYWQtZG9jLm1hayBpbnN0ZWFkIG9mIHVwbG9hZC5tYWsKKwkgIFJlbW92ZSB0aGUgbG9jYWwgY29weSBvZiB1cGxvYWQubWFrIGluIGZhdm91ciBvZiB1c2luZyB0aGUgc2hhcmVkCisJICB1cGxvYWQtZG9jLm1ha2UgaW4gY29tbW9uLworCisyMDA5LTA2LTExIDExOjM5OjI1ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9nb29tL2dvb21fY29uZmlnX3BhcmFtLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICBkb2NzOiBRdWlldGVuIGEgY291cGxlIG1vcmUgZG9jcyB3YXJuaW5ncworCisyMDA5LTA2LTExIDExOjI3OjI2ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9sem8uYzoKKwkgIGRvY3M6IFJlbW92ZSBndGstZG9jIGNvbW1lbnQgbWFya2VyCisJICBUaGVzZSBjb21tZW50IGJsb2NrcyBhcmVuJ3QgZ3RrLWRvYyBjb21tZW50cyBhbmQgY2F1c2UgYW5ub3lpbmcgbm9pc2UgaW4KKwkgIHRoZSBkb2NzIGJ1aWxkLgorCisyMDA5LTA2LTExIDEwOjA1OjMyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuaDoKKwkgIGRlaW50ZXJsYWNlOiBJbXBsZW1lbnQgdXBzdHJlYW0gbmVnb3RhdGlvbgorCisyMDA5LTA2LTEwIDIxOjQ3OjQwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogSW1wcm92ZSBkZWJ1Z2dpbmcgYW5kIGNsZWFuIHVwIHNvbWUgY29kZQorCisyMDA5LTA2LTEwIDE0OjU1OjE4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogQ2xpcCBidWZmZXJzIHRvIHRoZSBjdXJyZW50IHNlZ21lbnQgaWYgcG9zc2libGUKKworMjAwOS0wNi0xMCAxNDo0NTowNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmg6CisJICBkZWludGVybGFjZTogQ2xlYW4gdXAgaW5jbHVkZXMgYW5kIGNsZWFuIHVwIG9yZGVyIG9mIGluc3RhbmNlIHN0cnVjdCBmaWVsZHMKKworMjAwOS0wNi0xMCAxNjowOTo1NiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaDoKKwkgIHJ0cGgyNjNwYXk6IERlZmF1bHQgdG8gZG9pbmcgQSwgQiBhbmQgQyBtb2Rlcywgbm90IG9ubHkgQQorCisyMDA5LTA2LTEwIDA5OjU2OjExICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogRml4IFFvUyBjYWxjdWxhdGlvbnMKKwkgIFRoZSBkaWZmIGlzIGEgc2lnbmVkIGludGVnZXIsIG5vdCBhbiB1bnNpZ25lZCBvbmUgb2YgY291cnNlLgorCSAgSW4gbW9kZXMgb3RoZXIgdGhhbiBHU1RfREVJTlRFUkxBQ0VfQUxMIGV2ZXJ5IGZyYW1lIGhhcyB0d2ljZSB0aGUKKwkgIGR1cmF0aW9uIG9mIHRoZSBmaWVsZCBkdXJhdGlvbi4KKworMjAwOS0wNi0wOSAxNDoxMzozMSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmM6CisJICBydHBzaXJlbnBheTogUHV0IHRoZSBiaXRyYXRlIGluIHRoZSBSVFAgY2FwcworCSAgVGhlIE1TIGNvZGUgc2VlbXMgdG8gcmVxdWlyZSB0aGUgYml0cmF0ZSB0byBpbnRlcm9wZXJhdGUgYW5kCisJICBkcmFmdC1pZXRmLWF2dC1ydHAtZzcyMjEtMDAgYWxzbyBoYXMgaXQuCisKKzIwMDktMDYtMDkgMTk6NTU6MzYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5oOgorCSAgZGVpbnRlcmxhY2U6IEltcGxlbWVudCBiYXNpYyBRb1MKKwkgIFRoaXMgY2hhbmdlIGlzIGJhc2VkIG9uIFRpbSdzIFFvUyBpbXBsZW1lbnRhdGlvbgorCSAgZm9yIGpwZWdkZWMuCisKKzIwMDktMDYtMDkgMTk6Mjk6NTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBEaXJlY3RseSBwcm94eSBldmVudHMvcXVlcmllcyB0byB0aGUgcGVlciBwYWRzCisJICBUaGlzIHJlbW92ZXMgc29tZSBvdmVyaGVhZCBpbnRyb2R1Y2VkIGJ5IHRoZSBkZWZhdWx0IGhhbmRsZXJzCisJICB0aGF0IG5lZWQgdG8gaXRlcmF0ZSBvdmVyIHRoZSBvdGhlciBwYWRzLgorCisyMDA5LTA2LTA5IDEwOjM4OjUyICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogZGVidWdfbWVtZHVtcCgpIHVua25vd24gdGFncy4gUmVmYWN0b3IganVuayBwYXJzaW5nIGNvZGUuCisJICBUaGlzIG1ha2VzIGxpZmUgc2xpZ2h0bHkgZWFzaWVyIHdoZW4gZGVidWdnaW5nIGF2aSBmaWxlcy4KKworMjAwOS0wNi0wOCAwODoyMTo0MyArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgIHJ0cDogRG9uJ3QgZm9yZ2V0IHRvIGRpc3QgdGhlIGhlYWRlcnMgZm9yIHRoZSBDRUxUIChkZSlwYXlsb2FkZXJzLgorCisyMDA5LTA2LTA3IDIwOjU0OjA2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBSZXZlcnQgIlJldmVydCAicXRkZW11eDogZmlsbCB0aW1lc3RhbXAgdGFibGUgY29tcGxldGVseSIiCisJICBUaGlzIHJldmVydHMgY29tbWl0IDlmMDIyYzhhODUwM2MyY2UwZmE2MTdmZGI1MGU0MTcwNmRkNDEyZjUuCisJICBTb3JyeSwgSSB3YXMgdGhpbmtpbmcgYWJvdXQgdGhlIHdyb25nIG1vZHVsZS4KKworMjAwOS0wNi0wNyAyMDo0OTo1MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgUmV2ZXJ0ICJxdGRlbXV4OiBmaWxsIHRpbWVzdGFtcCB0YWJsZSBjb21wbGV0ZWx5IgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCA3OTBiMDUwZmM1MzAyY2FlODljZGRjZDIzYjI1ODA5Mzk2N2QwNWE5LgorCSAgSSBmb3Jnb3Qgd2Ugd2VyZSBmcm96ZW4uCisKKzIwMDktMDYtMDcgMjA6NDY6NDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpbGwgdGltZXN0YW1wIHRhYmxlIGNvbXBsZXRlbHkKKwkgIFdoZW4gdGhlcmUgYXJlIGxlc3MgdGltZXN0YW1wcyB0aGF0IHRoZXJlIGFyZSBzYW1wbGVzLCBmaWxsIHVwIHRoZSBzYW1wbGUgdGFibGUKKwkgIHdpdGggdGhlIGxhc3Qga25vdyB0aW1lc3RhbXAuIFRoaXMgc2l0dWF0aW9uIGNhbiBoYXBwZW4gd2hlbiB0aGUgbGFzdCBzYW1wbGUKKwkgIGRvZXMgbm90IGRlY29kZSBhbmQgZG9lc24ndCBuZWVkIGEgdGltZXN0YW1wLiBXZSBob3dldmVyIGNhbGN1bGF0ZSB0aGUgdG90YWwKKwkgIHRyYWNrIGxlbmd0aCB1c2luZyB0aGUgbGFzdCBzYW1wbGUgdGltZXN0YW1wIHNvIHdlIG5lZWQgdG8gaGF2ZSBzb21ldGhpbmcKKwkgIHNlbnNpYmxlIGluIHRoZXJlLgorCSAgRml4ZXMgIzU4NTA1NgorCisyMDA5LTA2LTA3IDEzOjM3OjA0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBoYW5kbGUgTElTVCBJTkZPIG9mIDAgc2l6ZQorCSAgSGFuZGxlIExJU1QgSU5GTyBjaHVua3Mgb2YgMCBzaXplIGluc3RlYWQgb2YgY2F1c2luZyBlcnJvcnMuCisJICBGaXhlcyAjNTg0OTgxCisKKzIwMDktMDYtMDcgMTM6MjQ6NDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgUmV2ZXJ0ICJ3YXZwYXJzZTogUmVtb3ZlIGRlYWQgYXNzaWdubWVudHMsIG1vdmUgdmFyaWFibGUgdG8gd2hlcmUgaXQncyBuZWVkZWQuIgorCSAgUmV2ZXJ0cyBjb21taXQgNDQyNTZhNzhmOGRkNzlhOTFmM2JiMmFiN2MzYWE2MjNjMDk3YmI4YSBhbmQgdXNlIHRoZSByZXN1bHQgaW4KKwkgIGVycm9yIHJlcG9ydGluZyBzbyB0aGF0IHdlIGNhbiBzZWUgd2hhdCdzIGdvaW5nIG9uLgorCisyMDA5LTA2LTA1IDE4OjU1OjAyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5oOgorCSAgY2VsdGRlcGF5OiBhZGQgQ0VMVCBkZXBheWxvYWRlcgorCisyMDA5LTA2LTA1IDE1OjMwOjUxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0cGF5Lmg6CisJICBydHBjZWx0cGF5OiBhZGQgQ0VMVCBSVFAgcGF5bG9hZGVyCisKKzIwMDktMDYtMDUgMTY6NTQ6NDggKzAxMDAgIEphbiBTY2htaWR0IDxqYW4uc2NobWlkdEBzdW4uY29tPgorCisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuYzoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyb3B0aW9ucy5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJ0cmFjay5jOgorCSAgc3VuYXVkaW86IEZpeCBzd2l0Y2ggc2V0dGluZyBvbiBzb21lIGRldmljZXMuIEFkZCBkZWJ1Zy4gRml4IGEgRklYTUUuCisJICBGaXggdGhlIHNldHRpbmcgb2YgdG9nZ2xlIHN3aXRjaGVzIG9uIHNvbWUgYnJva2VuIGF1ZGlvIGRyaXZlcnMgd2hpY2gKKwkgIHJlcG9ydCB0aGF0IG5vIGF1ZGlvIHBvcnRzIGFyZSBzZXR0YWJsZSBieSBpZ25vcmluZyB0aGUgbW9kX3BvcnQgZmllbGQKKwkgIHRoZXJlLgorCSAgQWRkIHNvbWUgZGVidWcgc3RhdGVtZW50cy4KKwkgIEZpeCBhIEZJWE1FIG5vdyB0aGF0IEdvb2QgcmVsaWVzIG9uIGEgbmV3IGVub3VnaCBnc3QtcGx1Z2lucy1iYXNlLgorCisyMDA5LTA2LTA0IDEyOjI3OjE5ICswMTAwICBKYW4gU2NobWlkdCA8amFuLnNjaG1pZHRAc3VuLmNvbT4KKworCSogc3lzL3N1bmF1ZGlvL01ha2VmaWxlLmFtOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuaDoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyb3B0aW9ucy5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJvcHRpb25zLmg6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcnRyYWNrLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcnRyYWNrLmg6CisJICBzdW5hdWRpbzogU3VwcG9ydCBuZXcgZmxhZ3MgZm9yIG9wdGlvbnMgYW5kIGFjdGlvbnMKKwkgIFVzZSBuZXcgYXVkaW8gbWl4ZXIgZmxhZ3MgYWRkZWQgaW4gQmFzZSAwLjEwLjIzIHRvIGV4cG9zZSBmbGFncyBhbmQgb3B0aW9ucworCSAgb24gdGhlIFN1bkF1ZGlvIGRldmljZXMuCisJICBGaXhlczogIzU4MzU5MworCSAgUGF0Y2ggQnk6IEJyaWFuIENhbWVyb24gPGJyaWFuLmNhbWVyb25Ac3VuLmNvbT4KKwkgIFBhdGNoIEJ5OiBHYXJyZXR0IEQnQW1vcmUgPGdhcnJldHQuZGFtb3JlQHN1bi5jb20+CisKKzIwMDktMDUtMTUgMTE6NTA6MzggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5oOgorCSAgZGVpbnRlcmxhY2U6IEZpcnN0IHRyeSB0byBoYW5kbGUgRFZEIHN0aWxsIGZyYW1lcyBjb3JyZWN0bHkKKwkgIFRoaXMgaGVscHMgYSBiaXQgd2l0aCBidWcgIzU4Mjc0MCBidXQgc3RpbGwgZG9lc24ndCBtYWtlIGl0IHdvcmsuCisKKzIwMDktMDYtMDQgMTc6Mzc6MDMgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBvbmx5IG5vdGlmeSBpZiBhbGwgY2hlY2tzIHBhc3NlZAorCSAgUmVwbGFjZSBnb3RvIGRvbmU6IHdpdGggcmV0dXJuLCBhcyB0aG9zZSBhcmUgY2hlY2tzIHdoZW4gd2UgZG9uJ3Qgd2FudCB0byBmbGFnIGEKKwkgIHBlbmRpbmcgbm90aWZ5LgorCisyMDA5LTA2LTA0IDE1OjE5OjA1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBzZXQgdGhlIHJpZ2h0IHN0YXRlIG9uIHJ0cGJpbgorCSAgV2UgbmVlZCB0byBzZXQgdGhlIHN0YXRlIG9mIGdzdHJ0cGJpbiB0byB0aGUgc2FtZSBzdGF0ZSBhcyBvdXIgc291cmNlIGVsZW1lbnRzLgorCSAgVGhpcyBmaXhlcyBmYWxsYmFjayB0byBUQ1AgYWdhaW4uCisKKzIwMDktMDYtMDMgMTg6MjM6NTMgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBjaGVjayBwb2ludGVyIGJlZm9yZSBhY2Nlc3NpbmcKKwkgIE1vdmUgZXhpc3RpbmcgY2hlY2sgYSBmZXcgbGluZXMgdXAsIHNvIHRoYXQgd2UgY2hlY2sgYmVmb3JlIGFjY2Vzc2luZyBmaWVsZHMuCisKKzIwMDktMDYtMDMgMTg6MjE6MTIgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiByZW5hbWUgZ3N0X3B1bHNlX3NpbmtfZ2V0X3RpbWUgdG8gZ3N0X3B1bHNlc2lua19nZXRfdGltZQorCSAgUmVuYW1lIGludGVybmFsIG1ldGhvZCBmb3IgY29uc2lzdGVuY3kuCisKKzIwMDktMDYtMDMgMTg6MTk6MjIgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiB1c2UgdmFsdWVzIGZyb20gcGFfc3RyZWFtX2dldF9idWZmZXJfYXR0cigpCisJICBXZSB3ZXJlIHB1dHRpbmcgdGhlIHJlcXVlc3RlZCB2YWx1ZXMgYmFjayBpbnRvIHJpbmdidWZmZXIgc3BlYywgaW5zdGVhZCBvZgorCSAgdXNpbmcgdGhlIHF1ZXJpZWQgdmFsdWVzLgorCisyMDA5LTA2LTAyIDE5OjMyOjIxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkgIHZyYXdwYXk6IHRyaW0gb3V0cHV0IGJ1ZmZlcnMKKwkgIFJlbW92ZSB0aGUgbGVmdG92ZXIgdW51c2VkIGJ5dGVzIGluIHRoZSBvdXRwdXQgYnVmZmVyLgorCSAgRml4ZXMgIzU4NDYxMworCisyMDA5LTA2LTAyIDE5OjMwOjMwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSAgdnJhd2RlcGF5OiBmaXggcGFyc2luZyBvZiBzYW1wbGluZyBmaWVsZAorCSAgY29tbWl0IGExMmQ5YTgwZjIyNWJlOTdiMzY3NGIxYTA1MDZhYzY2NTQ0ZGJmNDkgYnJva2UgdGhlIHBhcnNpbmcgb2YgdGhlCisJICBzYW1wbGluZy4KKworMjAwOS0wNS0yNyAxNzowNjozNCArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgcG5nZGVjOiBBdm9pZCBwb3NzaWJsZSBvdmVyZmxvdyBpbiBjYWxjdWxhdGlvbnMKKwkgIEEgbWFsZm9ybWVkIChvciBzaW1wbHkgaHVnZSkgUE5HIGZpbGUgY2FuIGxlYWQgdG8gaW50ZWdlciBvdmVyZmxvdyBpbgorCSAgY2FsY3VsYXRpbmcgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIsIGxlYWRpbmcgdG8gY3Jhc2hlcyBvciBidWZmZXIKKwkgIG92ZXJmbG93cyBsYXRlci4gRml4ZXMgU0EzNTIwNSBzZWN1cml0eSBhZHZpc29yeS4KKworMjAwOS0wNi0wMiAwMDo0ODowMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IHNvbWUgbW9yZSBsb2dnaW5nIC0gZHVtcCBoZWFkZXIgcGFja2V0cworCSAgQWxzbywgdGhlIGZpbmFsIGZpeGluZyB1cCBvZiB0aGUgaGVhZGVycyBpcyBleHBlY3RlZCBhbmQgbm90IHNvbWV0aGluZworCSAgd2Ugc2hvdWxkIHdhcm4gYWJvdXQuCisKKzIwMDktMDYtMDIgMDA6Mzc6MTUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBuZXZlciBldmVyIHBhc3MgdmFsdWVzID4zNmJpdHMgdG8gX3NldF90b3RhbF9zYW1wbGVzX2VzdGltYXRlKCkKKwkgIExldCdzIGJlIHBhcmFub2lkIGFuZCBtYWtlIHN1cmUgd2UgbmV2ZXIgcGFzcyBhIG51bWJlciB0aGF0IHRha2VzIHVwCisJICBtb3JlIHRoYW4gMzYgYml0cyB0byBfc2V0X3RvdGFsX3NhbXBsZXNfZXN0aW1hdGUoKSwgc2luY2UgbGliRkxBQworCSAgZXhwZWN0cyBhbGwgdGhlIG90aGVyIGJpdHMgdG8gYmUgemVybywgYW5kIGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlCisJICBuZWlnaGJvdXJpbmcgZmllbGRzIGluIHRoZSBnbG9iYWwgc3RyZWFtIGluZm8gaGVhZGVyIG1heSBnZXQgbWVzc2VkCisJICB1cCBpbmFkdmVydGVudGx5LCBzbyB0aGF0IGZsYWMgLWQgcmVmdXNlcyB0byBkZWNvZGUgdGhlIHN0cmVhbS4KKwkgIFNlZSAjNTg0NDU1LgorCisyMDA5LTA2LTAxIDIyOjMzOjAyICswMjAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXMgKGF0KSBhcGVzdGFhcnQgKGRvdCkgb3JnPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBBZGRyZXNzIGJhZCBGTEFDIHNhbXBsZSBsZW5ndGggZW5jb2Rpbmcgb2YgIzU4NDQ0NTUKKwkgIENvbW1pdCBkZjcwN2M2NjY0MzNhNzhkMzg3OGFmNmYwNTU2OThkNTc1NjIyNmM0CisJICBpbnRyb2R1Y2VkIGFuIG9idmlvdXMgYnVnIGluIHRoZSBzYW1wbGUgbGVuZ3RoIGNhbGN1bGF0aW9uLAorCSAgdXNpbmcgdGhlIHdyb25nIG1hY3JvIGZvciBjb252ZXJzaW9uLgorCisyMDA5LTA2LTAxIDExOjU4OjIxIC0wNzAwICBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uQHN1bi5jb20+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbW14Lmg6CisJICBkZWludGVybGFjZTogRml4IHNwdXJpb3VzIGNvbG9ucyBpbiBhc20gY29kZQorCSAgRml4ZXMgIzU4NDE3NC4KKwkgIFNpZ25lZC1vZmYtYnk6IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisyMDA5LTA2LTAxIDAwOjQwOjU1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHNraXAgSlVOSyBjaHVua3MgaW4gZGF0YSBzZWN0aW9uIGluIHN0cmVhbWluZyBtb2RlCisJICBTa2lwIEpVTksgdGFncyBpbiBzdHJlYW1pbmcgbW9kZSBhcyB3ZWxsIGluc3RlYWQgb2YgRU9TaW5nCisJICBwcmVtYXR1cmVseS4gRml4ZXMgIzU2NDEwMC4KKworMjAwOS0wNS0yOCAxNDowMToxNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2JncmEuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2k0MjAuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIHZpZGVvbWl4ZXI6IERvbid0IHVzZSAvLyBjb21tZW50cworCisyMDA5LTA1LTI4IDEzOjU2OjE1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfYmdyYS5jOgorCSAgdmlkZW9taXhlcjogRml4IGJhY2tncm91bmQgYmxpdHRpbmcgd2hlbiBhIGNvbG9yIG1vZGUgaXMgc2VsZWN0ZWQgd2l0aCBCR1JBCisKKzIwMDktMDUtMjggMTM6NTQ6MTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9heXV2LmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9iZ3JhLmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9pNDIwLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmg6CisJICB2aWRlb21peGVyOiBTb21lIGNsZWFudXAgYW5kIGZpeCB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGZyYW1lIHNpemUgaW4gYnl0ZXMKKworMjAwOS0wNS0yOCAxMzozNTo1MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2k0MjAuYzoKKwkgIHZpZGVvbWl4ZXI6IEZpeCBJNDIwIGJsZW5kaW5nIHRvIGFjdHVhbGx5IGRvIHNvbWV0aGluZworCSAgRm9yIHRoaXMgd2UgYSkgaW1wbGVtZW50IHRoZSBjaGVja2VycyBmaWxsaW5nIGFuZCBiKQorCSAgYWN0dWFsbHkgYmxlbmQgdGhlIHNyYy9kZXN0IGJ5IHVzaW5nIHRoZSBzcmMgYWxwaGEgdmFsdWUKKwkgIGZyb20gdGhlIHBhZC4KKworMjAwOS0wNS0yOCAxMzoxNDoxMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2JncmEuYzoKKwkgIHZpZGVvbWl4ZXI6IEZpeCBBUkdCIGJsZW5kaW5nIHRvIGFjdHVhbGx5IHdvcmsKKworMjAwOS0wNS0yOCAxMzowNDo1MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfYmdyYS5jOgorCSAgdmlkZW9taXhlcjogQmxlbmQgQkdSQSBvdXJzZWx2ZXMgaW5zdGVhZCBvZiB1c2luZyBDYWlybworCisyMDA5LTA1LTI4IDEyOjU1OjE2ICswMjAwICBBbGV4IFVnYXJ0ZSA8YWxleHVnYXJ0ZUBnbWFpbC5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfYXl1di5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfYmdyYS5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfaTQyMC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5oOgorCSAgdmlkZW9taXhlcjogQWRkIHN1cHBvcnQgZm9yIGJsZW5kaW5nIEJHUkEgYW5kIEFZVVYKKwkgIEZpeGVzIGJ1ZyAjNTc3MDE3LgorCisyMDA5LTA1LTI4IDEyOjM5OjQ2ICswMjAwICBHaGlzbGFpbiAnQXVzJyBMYWNyb2l4IDxhdXNAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIGVxdWFsaXplcjogVXNlIGZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMgaW50ZXJuYWxseSBmb3IgdGhlIGludDE2IG1vZGUKKwkgIEJ5IHVzaW5nIGludDMyIGFyaXRobWV0aWMgd2Ugd2lsbCBpbnRyb2R1Y2UgZGlzdG9ydGlvbnMgYXMgdGhlCisJICBJSVIgZmlsdGVyIGlzIHZlcnkgc2Vuc2l0aXZlIHRvIHJvdW5kaW5nIGVycm9ycy4gRml4ZXMgYnVnICM1ODAyMTQuCisKKzIwMDktMDUtMjggMTA6NTU6MTYgKzAxMDAgIENocmlzdGlhbiBTY2hhbGxlciA8Y2hyaXN0aWFuLnNjaGFsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgVXBkYXRlIHNwZWMgZmlsZSB3aXRoIGxhdGVzdCBwbHVnaW5zCisKKzIwMDktMDUtMjYgMTc6MTk6MDggKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDg4OGUwYTIgdG8gYzU3MjcyMQorCisyMDA5LTA1LTI2IDE2OjIwOjM1ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkgIHY0bDI6IGNsZWFudXAgYW5kIGNvbW1lbnRpbmcKKwkgIFJlbW92ZSBuZXdsaW5lcyBpbnNlcnRlZCBieSBnc3QtaW5kZW50IG9uY2UuIFJlbW92ZSB1bnVzZWQgdmFyIGZyb20gaW5zdGFuY2UKKwkgIHN0cnVjdC4gQWRkIGNvbW1lbnRzLiBBZGQgYW5vdGhlciAjZGVmaW5lIGZvciBkZWZhdWx0IHByb3BlcnR5IHZhbHVlLgorCisyMDA5LTA1LTA2IDEyOjQzOjM1ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgbWFrZWZpbGU6IGlkZWEgYWJvdXQgbWFrZWluZyBtb3JlIHNvdXJjZXMvc2lua3MgdGVzdGFibGUgYWdhaW4KKworMjAwOS0wNS0yNSAxNjozMzozNSArMDIwMCAgSm9obiBLZWVwaW5nIDxqb2huLmtlZXBpbmcgYXQgbGluZW9uZS5uZXQ+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJICBwbmdkZWM6IG1hdGNoIGdfbWFsbG9jKCkgd2l0aCBnX2ZyZWUoKQorCSAgTWF0Y2hpbmcgZ19tYWxsb2MoKSB3aXRoIGEgZ19mcmVlKCkgaXMgaW1wb3J0YW50IHdoZW4gYSBjdXN0b20gYWxsb2NhdG9yIGlzCisJICBpbnN0YWxsZWQuCisJICBGaXhlcyAjNTgzODAzCisKKzIwMDktMDUtMTIgMTg6Mzk6MjggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5Lmg6CisJICBydHBtcDR2cGF5OiBkb24ndCBsb29rIGZvciBoZWFkZXJzIGluIHNvbWUgY2FzZXMKKwkgIEluIHNvbWUgc3RyZWFtcyAoc3RhcnRpbmcgd2l0aCAwMDAwMDEwMCkgZG9uJ3QgbG9vayBmb3IgdGhlIGhlYWRlcnMgYnV0IHB1c2gKKwkgIGRhdGEgYXMgaXQgaXMuCisJICBGaXhlcyAjNTgyMTUzCisKKzIwMDktMDUtMTMgMTE6NTA6MjIgKzAyMDAgIFBhdHJpY2sgUmFkaXppIDxwYXRyaWNrLnJhZGl6aSBhdCBheGlzLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IG1lbW9yeSBsZWFrIG9mIG1lc3NhZ2VzCisJICBGcmVlIG1lc3NhZ2VzIGNvcnJlY3RseS4KKwkgIEZpeGVzICM1NzczMTgKKworMjAwOS0wNS0yNCAxOTozMjoxNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogbWFrZSBmYWtlc3JjIHNpbGVudAorCSAgTWFrZSB0aGUgZmFrZXNyYyB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIGR1bW15IHBhY2tldHMgc2lsZW50LgorCisyMDA5LTA1LTI0IDE2OjMzOjQyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBkb24ndCBzZW5kIHRlYXJkb3duIGJlZm9yZSBzZXR1cAorCSAgRG9uJ3Qgc2VuZCBhIFRFQVJET1dOIHJlcXVlc3Qgd2hlbiB3ZSBkaWQgbm90IG1hbmFnZSB0byBzdWNjZXNzZnVsbHkgc2V0dXAgYQorCSAgc3RyZWFtLgorCisyMDA5LTA1LTE0IDE0OjQ2OjE0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIG1hdHJvc2thZGVtdXg6IFBvcHVsYXRlIGEgR3N0SW5kZXggdGhhdCBpcyBzZXQgb24gbWF0cm9za2FkZW11eAorCisyMDA5LTA1LTE0IDEwOjM1OjIyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogR2V0IHRoZSBtYXggZHVyYXRpb24gZnJvbSB1cHN0cmVhbSBpZiB0aGVyZSdzIG5vIGR1cmF0aW9uIHRhZworCisyMDA5LTA1LTE0IDEwOjI5OjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4Lmg6CisJICBmbHZtdXg6IFdyaXRlIGFuIGluZGV4IHRhYmxlIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUKKworMjAwOS0wNS0yMiAwMToxMjozNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGF1dG9nZW4uc2g6CisJKiBjb25maWd1cmUuYWM6CisJICBhdXRvdG9vbHM6IG1vdmUgdGhlIC1Xbm8tcG9ydGFiaWxpdHkgZnJvbSBhdXRvZ2VuLnNoIHRvIGNvbmZpZ3VyZS5hYworCSAgSWYgd2UncmUgbHVja3kgaXQnbGwgZ2V0IHVzZWQgb24gYXV0b21hdGljIHJlYnVpbGRzIGFzIHdlbGwgdGhhdCB3YXkuCisKKzIwMDktMDUtMjIgMDE6MTA6MTIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJKiBjb25maWd1cmUuYWM6CisJKiBtNC9nc3QtZmlvbnJlYWQubTQ6CisJICBtNDogZml4ICdzdXNwaWNpb3VzIGNhY2hlIGlkJyB3YXJuaW5ncworCSAgYW5kIHVwZGF0ZSBjb21tb24gdG8gcHVsbCBpbiBhIHNpbWlsYXIgZml4LiBBbHNvIGNoZWNrIGluIGNvbmZpZ3VyZQorCSAgd2hldGhlciB0aGUgY29tcGlsZXIgc3VwcG9ydHMgZG8gd2hpbGUgbWFjcm9zIChHTGliIHdhbnRzIHRoaXMKKwkgIGRlZmluZWQgYW5kIGl0IGlzIG5lZWRlZCB0byBhdm9pZCB3YXJuaW5ncyB3aXRoIHNvbWUgYysrIGNvbXBpbGVycworCSAgYXBwYXJlbnRseSkuCisKKzIwMDktMDUtMjIgMDE6Mzk6MzMgKzAzMDAgIFplZXNoYW4gQWxpIChLaGF0dGFrKSA8emVlc2hhbmFrQGdub21lLm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgc291cGh0dHBzcmM6IEJ1bXAtdXAgbGlic291cC0yLjI0IGRlcCB0byA+PSAyLjI2CisJICBUaGUgaGVscGVyIGZ1bmN0aW9uIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2dldF9jb250ZW50X3R5cGUgdGhhdCB3ZSBub3cgdXNlCisJICB3YXMgYWRkZWQgaW4gMi4yNi4KKworMjAwOS0wNS0yMCAxNzo1Nzo1OSArMDMwMCAgWmVlc2hhbiBBbGkgKEtoYXR0YWspIDx6ZWVzaGFuYWtAZ25vbWUub3JnPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IFNldCBjYXBzIGZvciBhdWRpby9MMTYgY29udGVudC10eXBlCisJICBXaGVuICJDb250ZW50LVR5cGUiIGhlYWRlciBpcyAiYXVkaW8vTDE2Iiwgd2UgbmVlZCB0byBzZXQgdGhlIGNhcHMgb24gdGhlCisJICBvdXRnb2luZyBidWZmZXJzIHNvIHRoYXQgZG93bnN0cmVhbSBlbGVtZW50cyBjYW4gaGF2ZSBtZWFucyB0byBkZXRlY3QgdGhlCisJICBzdHJlYW0gdHlwZSBhbmQgaGFuZGxlIGl0IGFwcHJvcHJpYXRlbHkuIFRlc3RlZCB3aXRoIEhUVFAgc3RyZWFtIHByb3ZpZGVkCisJICBieSBwdWxzZS1hdWRpbydzIGh0dHAgbW9kdWxlIChnaXQgbWFzdGVyKS4KKworMjAwOS0wNS0yMCAxNTowNjoyNSArMDMwMCAgWmVlc2hhbiBBbGkgKEtoYXR0YWspIDx6ZWVzaGFuYWtAZ25vbWUub3JnPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuaDoKKwkgIHNvdXBodHRwc3JjOiBSZW5hbWUgaWN5X2NhcHMgdG8gc3JjX2NhcHMKKworMjAwOS0wNS0yMSAyMzozOToxMyArMDIwMCAgUGhpbGlwcGUgTm9ybWFuZCA8cGhpbGlwcGUgYXQgZmx1ZW5kby5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGJ1bXAgbWF4IHNpemUgdG8gNjU1MzV4NjU1MzUKKwkgIFJlbW92ZSBhcnRpZmljaWFsIGpwZWcgaW1hZ2UgbGltaXRzLgorCSAgRml4ZXMgIzU4MzA0OC4KKworMjAwOS0wNS0yMSAyMTozNjowMiArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICB3aW4zMjogVXBkYXRlIHRoZSB3aW4zMiBjb25maWcuaAorCisyMDA5LTA1LTE5IDE1OjEyOjA5ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgbWF0cm9za2FkZW11eDogUmVjb2duaXNlIFBHUyBzdWJwaWN0dXJlIHN0cmVhbXMgLSB0aGUgYmx1cmF5IGZvcm1hdC4KKwkgIFJlY29nbmlzZSBhbmQgYXBwbHkgYXBwcm9wcmlhdGUgY2FwcyB0byBQR1MgKFByZXNlbnRhdGlvbiBHcmFwaGljIFN0cmVhbSkKKwkgIHN1YnBpY3R1cmUgc3RyZWFtcy4KKworMjAwOS0wNS0xNSAxMDo0MjoxOSArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IENvbnZlcnQgYW4gZXJyb25lb3VzIGFzc2VydGlvbgorCSAgT2NjYXNpb25hbGx5LCB3ZSBnZXQgYSBjaGFuZ2UgY2FsbGJhY2sgZm9yIGFuIG9sZCBzdHJlYW0sIHRyaWdnZXJpbmcKKwkgIHRoZSBhc3NlcnRpb24gdW5uZWNlc3NhcmlseS4gSnVzdCBpZ25vcmUgc3VjaCBjYWxsYmFja3MuCisKKzIwMDktMDUtMjAgMTY6MTQ6NDAgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2U6IFByaW50IGEgd2FybmluZyBvbiB1bmRlci9vdmVyZmxvd3MKKworMjAwOS0wNS0yMCAxODo0NTo0NSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkgIHF0ZGVtdXg6IHBhcnNlIGluMjQgYm94ZXMgdG8gZ2V0IGVuZGlhbm5lc3MKKwkgIGluMjQgc2FtcGxlcyBhcmUgbm9ybWFsbHkgYmlnLWVuZGlhbiBidXQgYW4gZW5kYSBib3ggY2FuIGNoYW5nZSB0aGlzIHRvCisJICBsaXR0bGUtZW5kaWFuLiBSZWN1cnNlIGludG8gdGhlIGluMjQgYm94IGFuZCBmaW5kIHRoZSBlbmRhIGJveCBzbyB0aGF0IHdlIGdldAorCSAgdGhlIGVuZGlhbm5lc3MgcmlnaHQuCisJICBGaXhlcyAjNTgyNTE1CisKKzIwMDktMDUtMjAgMTQ6MTQ6MzEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkgIG11bHRpcGFydGRlbXV4OiBhZGQgcHJvcGVyIHBhZHRlbXBsYXRlCisKKzIwMDktMDUtMjAgMTQ6MDI6NDMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkgIG11bHRpcGFydGRlbXV4OiBhZGQgbW9yZSBtaW1lIHR5cGVzCisJICBBZGQgbWltZS10eXBlIGZvciBQYW5hc29uaWMgZzcyNiBhbmQgYWRkIG1vcmUgcmVxdWlyZWQgY2FwcyBwcm9wZXJ0aWVzIGZvciBvdGhlcgorCSAgRzcyNiBtaW1lLXR5cGVzLgorCSAgTWFrZSBtaW1lLXR5cGVzIGNhc2UgaW5zZW5zaXRpdmUuCisJICBTZWUgIzU4MjE2OQorCisyMDA5LTA1LTIwIDEzOjQ3OjUyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4Lmg6CisJICBtdWx0aXBhcnRkZW11eDogYWRkIGZsb3cgYWdncmVnYXRpb24KKworMjAwOS0wNS0yMCAxMzoyOTowMiArMDIwMCAgQXJub3V0IFZhbmRlY2FwcGVsbGUgPGFybm91dEBtaW5kLmJlPgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJICBtdWx0aXBhcnRkZW11eDogYWxsb3cgY29udGVudCB0byBiZSBlbXB0eS4KKwkgIGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIGRvZXNuJ3QgYWxsb3cgYnVmZmVyIHRvIGJlIGVtcHR5LgorCSAgU2ltcGx5IHNraXAgYW55IHBhcnQgd2hlcmUgdGhlIGNvbnRlbnQgaXMgZW1wdHkuICBEb24ndAorCSAgY3JlYXRlIGEgcGFkIGZvciBpdCBlaXRoZXIuCisJICBTZWUgIzU4MjE2OQorCisyMDA5LTA1LTE4IDIyOjE5OjM5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGNoYW5uZWxzLmg6CisJICBydHA6IGZpeCBjaGFubmVsIHBvc2l0aW9ucyBmb3IgbW9ubworCisyMDA5LTA1LTIxIDIxOjAyOjExICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEJhY2sgdG8gaGFja2luZyAtPiAwLjEwLjE1LjEKKworPT09IHJlbGVhc2UgMC4xMC4xNSA9PT0KKworMjAwOS0wNS0yMCAyMjozNDoxOCArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTAuMTUKKworMjAwOS0wNS0yMCAyMjowMzoyMSArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDA5LTA1LTE2IDAyOjU5OjE0ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIENoYW5nZUxvZzoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjE0LjMgcHJlLXJlbGVhc2UKKworMjAwOS0wNS0xNiAwMjozNzowNiArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvZmxhY2RlYy5jOgorCSAgY2hlY2s6IERvbid0IGNoYW5nZSBkaXJlY3RvcnkgaW4gdGhlIHRlc3QKKwkgIENoYW5naW5nIGRpcmVjdG9yeSBpbnZhbGlkYXRlcyB0aGUgcGF0aHMgdGhlIHJlZ2lzdHJ5IGhhcyBwaWNrZWQKKwkgIHVwIGZvciBvdXIgcGx1Z2lucywgYmVjYXVzZSB0aGUgdGVzdCBlbnZpcm9ubWVudCBzcGVjaWZpZXMgcmVsYXRpdmUKKwkgIHBhdGhzLiBGaXhpbmcgdGhhdCBpcyBhIHNlcGFyYXRlIHByb2JsZW0sIGluIHRoZSBtZWFudGltZSwgYnVpbGQgYQorCSAgcGF0aCB0byB0aGUgdGVzdCBmaWxlcyBpbnN0ZWFkIG9mIGNoYW5naW5nIGRpcmVjdG9yeS4gRml4ZXMgdGhlCisJICBkaXN0Y2hlY2suCisKKzIwMDktMDUtMTYgMDE6NTM6NDYgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogd2luMzIvTUFOSUZFU1Q6CisJICB3aW4zMjogUmVtb3ZlIGRpcmVjdGRyYXcgcHJvamVjdCBmaWxlcyBmcm9tIHRoZSB3aW4zMiBtYW5pZmVzdAorCisyMDA5LTA1LTE2IDAxOjIxOjM0ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzoKKwkgIGNoZWNrOiBSZW1vdmUgYXNzZXJ0aW9uIHRoYXQgYnJlYWtzIGNoZWNrIGFnYWluIGdpdCBtYXN0ZXIKKwkgIFJlbW92ZSB0aGUgYXNzZXJ0aW9uIHRoYXQgdGhlIHNlbmRlciBvZiB0aGUgdGFncyBtZXNzYWdlIGlzIHRoZQorCSAgZWxlbWVudCB1bnRpbCB3ZSBkZWNpZGUgd2hldGhlciB0aGF0J3MgZ29pbmcgdG8gYmUgdHJ1ZSBvciBub3QuCisKKzIwMDktMDUtMTYgMDE6MTE6MzMgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kaXJlY3RkcmF3LnhtbDoKKwkqIHN5cy9NYWtlZmlsZS5hbToKKwkqIHN5cy9kaXJlY3RkcmF3L01ha2VmaWxlLmFtOgorCSogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3BsdWdpbi5jOgorCSogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmg6CisJKiB3aW4zMi92czYvbGliZ3N0ZGlyZWN0ZHJhdy5kc3A6CisJKiB3aW4zMi92czcvbGliZ3N0ZGlyZWN0ZHJhdy52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0ZGlyZWN0ZHJhdy52Y3Byb2o6CisJICBNb3ZlZCAnZGlyZWN0ZHJhdycgZnJvbSAtZ29vZCB0byAtYmFkCisKKzIwMDktMDUtMTYgMDA6MTg6MzQgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzLy5naXRpZ25vcmU6CisJICBpZ25vcmVzOiBJZ25vcmUgdGhlIGZsYWNkZWMgY2hlY2sgYmluYXJ5CisKKzIwMDktMDUtMTYgMDA6MTc6NTcgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJICBkb2NzOiBVcGRhdGUgaW5zcGVjdGlvbiBkZXRhaWxzIGZvciB0aGUgYXZpIHBsdWdpbgorCisyMDA5LTA1LTE2IDAwOjAwOjA3ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3k0bWVuYy5jOgorCSAgTW92ZWQgJ3k0bWVuYycgZnJvbSAtYmFkIHRvIC1nb29kCisKKzIwMDktMDUtMTMgMTc6NTU6NDYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJICBbTU9WRUQgRlJPTSBCQURdIHk0bWVuYzogY2hhbmdlIG15IGVtYWlsCisJICBjaGFuZ2UgbXkgZW1haWwgdG8gc29tZXRoaW5nIG1vcmUgY3VycmVudAorCSAgU2VlICM1ODA3ODMKKworMjAwOS0wNS0xMyAxNzo1NDo0NyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRF0geTRtZW5jOiBkb24ndCBzdHJpcCB0aW1lc3RhbXBzCisJICBGaXhlcyAjNTgyNDgzCisKKzIwMDgtMTEtMDQgMTI6NDI6MzAgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgW01PVkVEIEZST00gQkFEXSBEb24ndCBpbnN0YWxsIHN0YXRpYyBsaWJzIGZvciBwbHVnaW5zLiBGaXhlcyAjNTUwODUxIGZvciAtYmFkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9hbHNhc3BkaWYvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hbXJ3Yi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2FwZXhzaW5rL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXJ0cy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2FydHNkL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXVkaW9maWxlL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXVkaW9yZXNhbXBsZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2J6Mi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2NkYXVkaW8vTWFrZWZpbGUuYW06CisJICAqIGV4dC9jZWx0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvZGMxMzk0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvZGlyYWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kaXJlY3RmYi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2RpdngvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kdHMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9mYWFjL01ha2VmaWxlLmFtOgorCSAgKiBleHQvZmFhZC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2dzbS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2hlcm1lcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2l2b3JiaXMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9qYWNrL01ha2VmaWxlLmFtOgorCSAgKiBleHQvanAyay9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xhZHNwYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xjcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xpYmZhbWUvTWFrZWZpbGUuYW06CisJICAqIGV4dC9saWJtbXMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9tZXRhZGF0YS9NYWtlZmlsZS5hbToKKwkgICogZXh0L21wZWcyZW5jL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXBsZXgvTWFrZWZpbGUuYW06CisJICAqIGV4dC9tdXNlcGFjay9NYWtlZmlsZS5hbToKKwkgICogZXh0L211c2ljYnJhaW56L01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXl0aHR2L01ha2VmaWxlLmFtOgorCSAgKiBleHQvbmFzL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbmVvbi9NYWtlZmlsZS5hbToKKwkgICogZXh0L29mYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3BvbHlwL01ha2VmaWxlLmFtOgorCSAgKiBleHQvcmVzaW5kdmQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zZGwvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zaG91dC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NuYXBzaG90L01ha2VmaWxlLmFtOgorCSAgKiBleHQvc25kZmlsZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NvdW5kdG91Y2gvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zcGMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zd2ZkZWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC90YXJraW4vTWFrZWZpbGUuYW06CisJICAqIGV4dC90aGVvcmEvTWFrZWZpbGUuYW06CisJICAqIGV4dC90aW1pZGl0eS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3R3b2xhbWUvTWFrZWZpbGUuYW06CisJICAqIGV4dC94MjY0L01ha2VmaWxlLmFtOgorCSAgKiBleHQveGluZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3h2aWQvTWFrZWZpbGUuYW06CisJICAqIGdzdC1saWJzL2dzdC9hcHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC1saWJzL2dzdC9kc2hvdy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2FpZmZwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2FwcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvYnVmZmVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYmF5ZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9jZHhhcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9jaGFydC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2NvbG9yc3BhY2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kY2NwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWludGVybGFjZTIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kdmRzcHUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9mZXN0aXZhbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ZpbHRlci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ZsYWNwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2dhbWVzL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvaDI2NHBhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbGlicmZiL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbWl4bWF0cml4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbW9kcGx1Zy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21wZWcxc3lzL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZzR2aWRlb3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ2RlbXV4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ3RzbXV4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ3ZpZGVvcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tdmUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9uc2YvTWFrZWZpbGUuYW06CisJICAqIGdzdC9udXZkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L292ZXJsYXkvTWFrZWZpbGUuYW06CisJICAqIGdzdC9wYXNzdGhyb3VnaC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3BjYXBwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3BsYXlvbmRlbWFuZC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3Jhd3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcmVhbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0anBlZy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zY2FsZXRlbXBvL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc2RwL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc2VsZWN0b3IvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zbW9vdGgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zbW9vdGh3YXZlL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3BlZWQvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zcGVleHJlc2FtcGxlL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3RlcmVvL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3ViZW5jL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdHRhL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmJpZGVjL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9kcm9wL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9zaWduYWwvTWFrZWZpbGUuYW06CisJICAqIGdzdC92aXJ0dWFsZHViL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvdm1uYy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3k0bS9NYWtlZmlsZS5hbToKKwkgICogc3lzL2FjbWVuYy9NYWtlZmlsZS5hbToKKwkgICogc3lzL2Nkcm9tL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHNob3dkZWN3cmFwcGVyL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHNob3dzcmN3cmFwcGVyL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHZiL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHhyMy9NYWtlZmlsZS5hbToKKwkgICogc3lzL2ZiZGV2L01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3NzNC9NYWtlZmlsZS5hbToKKwkgICogc3lzL3FjYW0vTWFrZWZpbGUuYW06CisJICAqIHN5cy9xdHdyYXBwZXIvTWFrZWZpbGUuYW06CisJICAqIHN5cy92Y2QvTWFrZWZpbGUuYW06CisJICAqIHN5cy93aW5pbmV0L01ha2VmaWxlLmFtOgorCSAgKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBEb24ndCBpbnN0YWxsIHN0YXRpYyBsaWJzIGZvciBwbHVnaW5zLiBGaXhlcyAjNTUwODUxIGZvciAtYmFkLgorCisyMDA4LTA2LTI2IDE1OjUyOjQwICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgW01PVkVEIEZST00gQkFEXSBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgWVVWNE1QRUcyIGVuY29kZXIgZWxlbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJICBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgWVVWNE1QRUcyIGVuY29kZXIgZWxlbWVudC4KKworMjAwNy0wNC0yNCAxNTo0OToxOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgW01PVkVEIEZST00gQkFEXSBQbHVnIHNvbWUgbGVha3M7IHRyeSB0byBtYWtlIGJ1aWxkIGJvdCBoYXBweSBhZ2Fpbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOiAoZ3N0X3k0bV9lbmNvZGVfaW5pdCksCisJICAoZ3N0X3k0bV9lbmNvZGVfc2V0Y2Fwcyk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3k0bWVuYy5jOiAoR1NUX1NUQVJUX1RFU1QpOgorCSAgUGx1ZyBzb21lIGxlYWtzOyB0cnkgdG8gbWFrZSBidWlsZCBib3QgaGFwcHkgYWdhaW4uCisKKzIwMDYtMTEtMTMgMTg6NTU6NTcgKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hbmF1d0Bza3luZXQuYmU+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gY29uZmlndXJlLmFjOiBFbmFibGUgY2RhdWRpbyBhbmQgeTRtLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3IGF0IHNreW5ldCBiZT4KKwkgICogY29uZmlndXJlLmFjOgorCSAgRW5hYmxlIGNkYXVkaW8gYW5kIHk0bS4KKwkgICogZ3N0L3k0bS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzogKGdzdF95NG1fZW5jb2RlX2Jhc2VfaW5pdCksCisJICAoZ3N0X3k0bV9lbmNvZGVfY2xhc3NfaW5pdCksIChnc3RfeTRtX2VuY29kZV9pbml0KSwKKwkgIChnc3RfeTRtX2VuY29kZV9yZXNldCksIChnc3RfeTRtX2VuY29kZV9zZXRjYXBzKSwKKwkgIChnc3RfeTRtX2VuY29kZV9nZXRfc3RyZWFtX2hlYWRlciksCisJICAoZ3N0X3k0bV9lbmNvZGVfZ2V0X2ZyYW1lX2hlYWRlciksIChnc3RfeTRtX2VuY29kZV9jaGFpbiksCisJICAoZ3N0X3k0bV9lbmNvZGVfc2V0X3Byb3BlcnR5KSwgKGdzdF95NG1fZW5jb2RlX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3k0bV9lbmNvZGVfY2hhbmdlX3N0YXRlKSwgKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuaDoKKwkgIFBvcnQgb2YgeTRtZW5jb2RlIHRvIDAuMTAuCisKKzIwMDYtMDQtMjUgMjE6NTY6MzggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgW01PVkVEIEZST00gQkFEXSBEZWZpbmUgR3N0RWxlbWVudERldGFpbHMgYXMgY29uc3QgYW5kIGFsc28gc3RhdGljICh3aGVuIGRlZmluZWQgYXMgZ2xvYmFsKQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9hbXJ3Yi9nc3RhbXJ3YmRlYy5jOgorCSAgKiBleHQvYW1yd2IvZ3N0YW1yd2JlbmMuYzoKKwkgICogZXh0L2FtcndiL2dzdGFtcndicGFyc2UuYzoKKwkgICogZXh0L2FydHMvZ3N0X2FydHMuYzoKKwkgICogZXh0L2FydHNkL2dzdGFydHNkc2luay5jOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmcGFyc2UuYzoKKwkgICogZXh0L2F1ZGlvZmlsZS9nc3RhZnNpbmsuYzoKKwkgICogZXh0L2F1ZGlvZmlsZS9nc3RhZnNyYy5jOgorCSAgKiBleHQvYXVkaW9yZXNhbXBsZS9nc3RhdWRpb3Jlc2FtcGxlLmM6CisJICAqIGV4dC9iejIvZ3N0YnoyZGVjLmM6CisJICAqIGV4dC9iejIvZ3N0YnoyZW5jLmM6CisJICAqIGV4dC9jZGF1ZGlvL2dzdGNkYXVkaW8uYzoKKwkgICogZXh0L2RpcmVjdGZiL2RmYnZpZGVvc2luay5jOgorCSAgKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmM6CisJICAqIGV4dC9kaXZ4L2dzdGRpdnhlbmMuYzoKKwkgICogZXh0L2R0cy9nc3RkdHNkZWMuYzogKGdzdF9kdHNkZWNfYmFzZV9pbml0KToKKwkgICogZXh0L2ZhYWMvZ3N0ZmFhYy5jOiAoZ3N0X2ZhYWNfYmFzZV9pbml0KToKKwkgICogZXh0L2ZhYWQvZ3N0ZmFhZC5jOgorCSAgKiBleHQvZ3NtL2dzdGdzbWRlYy5jOgorCSAgKiBleHQvZ3NtL2dzdGdzbWVuYy5jOgorCSAgKiBleHQvaGVybWVzL2dzdGhlcm1lc2NvbG9yc3BhY2UuYzoKKwkgICogZXh0L2l2b3JiaXMvdm9yYmlzZmlsZS5jOgorCSAgKiBleHQvbGNzL2dzdGNvbG9yc3BhY2UuYzoKKwkgICogZXh0L2xpYmZhbWUvZ3N0bGliZmFtZS5jOgorCSAgKiBleHQvbGlibW1zL2dzdG1tcy5jOiAoZ3N0X21tc19iYXNlX2luaXQpOgorCSAgKiBleHQvbXVzZXBhY2svZ3N0bXVzZXBhY2tkZWMuYzogKGdzdF9tdXNlcGFja2RlY19iYXNlX2luaXQpOgorCSAgKiBleHQvbXVzaWNicmFpbnovZ3N0dHJtLmM6IChnc3RfbXVzaWNicmFpbnpfYmFzZV9pbml0KToKKwkgICogZXh0L25hcy9uYXNzaW5rLmM6IChnc3RfbmFzc2lua19iYXNlX2luaXQpOgorCSAgKiBleHQvbmVvbi9nc3RuZW9uaHR0cHNyYy5jOgorCSAgKiBleHQvc2RsL3NkbGF1ZGlvc2luay5jOgorCSAgKiBleHQvc2RsL3NkbHZpZGVvc2luay5jOgorCSAgKiBleHQvc2hvdXQvZ3N0c2hvdXQuYzoKKwkgICogZXh0L3NuYXBzaG90L2dzdHNuYXBzaG90LmM6CisJICAqIGV4dC9zbmRmaWxlL2dzdHNmLmM6CisJICAqIGV4dC9zd2ZkZWMvZ3N0c3dmZGVjLmM6CisJICAqIGV4dC90YXJraW4vZ3N0dGFya2luZGVjLmM6CisJICAqIGV4dC90YXJraW4vZ3N0dGFya2luZW5jLmM6CisJICAqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogKGdzdF93YXZwYWNrX2RlY19iYXNlX2luaXQpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogKGdzdF93YXZwYWNrX3BhcnNlX2Jhc2VfaW5pdCk6CisJICAqIGV4dC94dmlkL2dzdHh2aWRkZWMuYzoKKwkgICogZXh0L3h2aWQvZ3N0eHZpZGVuYy5jOgorCSAgKiBnc3QvY2R4YXBhcnNlL2dzdGNkeGFwYXJzZS5jOiAoZ3N0X2NkeGFfcGFyc2VfYmFzZV9pbml0KToKKwkgICogZ3N0L2NkeGFwYXJzZS9nc3RjZHhhc3RyaXAuYzogKGdzdF9jZHhhc3RyaXBfYmFzZV9pbml0KToKKwkgICogZ3N0L2NoYXJ0L2dzdGNoYXJ0LmM6CisJICAqIGdzdC9jb2xvcnNwYWNlL2dzdGNvbG9yc3BhY2UuYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6IChnc3RfaWlyX2VxdWFsaXplcl9iYXNlX2luaXQpOgorCSAgKiBnc3QvZmVzdGl2YWwvZ3N0ZmVzdGl2YWwuYzoKKwkgICogZ3N0L2ZpbHRlci9nc3RicHdzaW5jLmM6CisJICAqIGdzdC9maWx0ZXIvZ3N0aWlyLmM6CisJICAqIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy5jOgorCSAgKiBnc3QvZnJlZXplL2dzdGZyZWV6ZS5jOgorCSAgKiBnc3QvZ2FtZXMvZ3N0cHV6emxlLmM6IChnc3RfcHV6emxlX2Jhc2VfaW5pdCk6CisJICAqIGdzdC9saWJyZmIvZ3N0cmZic3JjLmM6CisJICAqIGdzdC9taXhtYXRyaXgvbWl4bWF0cml4LmM6CisJICAqIGdzdC9tcGVnMXN5cy9nc3RtcGVnMXN5c3RlbWVuY29kZS5jOgorCSAgKiBnc3QvbXBlZzF2aWRlb3BhcnNlL2dzdG1wMXZpZGVvcGFyc2UuYzoKKwkgICogZ3N0L21wZWcyc3ViL2dzdG1wZWcyc3VidC5jOgorCSAgKiBnc3QvbXBlZ2F1ZGlvcGFyc2UvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgICogZ3N0L211bHRpZmlsZXNpbmsvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgKiBnc3Qvb3ZlcmxheS9nc3RvdmVybGF5LmM6CisJICAqIGdzdC9wYXNzdGhyb3VnaC9nc3RwYXNzdGhyb3VnaC5jOgorCSAgKiBnc3QvcGxheW9uZGVtYW5kL2dzdHBsYXlvbmRlbWFuZC5jOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICAqIGdzdC9ydGpwZWcvZ3N0cnRqcGVnZGVjLmM6CisJICAqIGdzdC9ydGpwZWcvZ3N0cnRqcGVnZW5jLmM6CisJICAqIGdzdC9zbW9vdGgvZ3N0c21vb3RoLmM6CisJICAqIGdzdC9zbW9vdGh3YXZlL2dzdHNtb290aHdhdmUuYzoKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICAqIGdzdC9zcGVlZC9nc3RzcGVlZC5jOgorCSAgKiBnc3Qvc3RlcmVvL2dzdHN0ZXJlby5jOgorCSAgKiBnc3Qvc3dpdGNoL2dzdHN3aXRjaC5jOgorCSAgKiBnc3QvdHRhL2dzdHR0YWRlYy5jOiAoZ3N0X3R0YV9kZWNfYmFzZV9pbml0KToKKwkgICogZ3N0L3R0YS9nc3R0dGFwYXJzZS5jOiAoZ3N0X3R0YV9wYXJzZV9iYXNlX2luaXQpOgorCSAgKiBnc3QvdmJpZGVjL2dzdHZiaWRlYy5jOgorCSAgKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSAgKiBnc3QvdmlkZW9kcm9wL2dzdHZpZGVvZHJvcC5jOgorCSAgKiBnc3QvdmlydHVhbGR1Yi9nc3R4c2hhcnBlbi5jOgorCSAgKiBnc3QveGluZ2hlYWRlci9nc3R4aW5nbXV4LmM6IChnc3RfeGluZ19tdXhfYmFzZV9pbml0KToKKwkgICogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgICogc3lzL2Nkcm9tL2dzdGNkcGxheWVyLmM6CisJICAqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6CisJICAqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgICogc3lzL2dsc2luay9nbGltYWdlc2luay5jOgorCSAgKiBzeXMvcWNhbS9nc3RxY2Ftc3JjLmM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgICogc3lzL3ZjZC92Y2RzcmMuYzogKGdzdF92Y2RzcmNfYmFzZV9pbml0KToKKwkgICogc3lzL3hpbWFnZXNyYy94aW1hZ2VzcmMuYzoKKwkgIERlZmluZSBHc3RFbGVtZW50RGV0YWlscyBhcyBjb25zdCBhbmQgYWxzbyBzdGF0aWMgKHdoZW4gZGVmaW5lZCBhcworCSAgZ2xvYmFsKQorCisyMDA2LTA0LTA4IDIxOjQ4OjAxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gRml4ICMzMzczNjUgKGdfdHlwZV9jbGFzc19yZWYgPC0+IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYW1yd2IvZ3N0YW1yd2JkZWMuYzogKGdzdF9hbXJ3YmRlY19jbGFzc19pbml0KToKKwkgICogZXh0L2FtcndiL2dzdGFtcndiZW5jLmM6IChnc3RfYW1yd2JlbmNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9hbXJ3Yi9nc3RhbXJ3YnBhcnNlLmM6IChnc3RfYW1yd2JwYXJzZV9jbGFzc19pbml0KToKKwkgICogZXh0L2FydHMvZ3N0X2FydHMuYzogKGdzdF9hcnRzX2NsYXNzX2luaXQpOgorCSAgKiBleHQvYXJ0c2QvZ3N0YXJ0c2RzaW5rLmM6IChnc3RfYXJ0c2RzaW5rX2NsYXNzX2luaXQpOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmc2luay5jOiAoZ3N0X2Fmc2lua19jbGFzc19pbml0KToKKwkgICogZXh0L2F1ZGlvZmlsZS9nc3RhZnNyYy5jOiAoZ3N0X2Fmc3JjX2NsYXNzX2luaXQpOgorCSAgKiBleHQvYXVkaW9yZXNhbXBsZS9nc3RhdWRpb3Jlc2FtcGxlLmM6CisJICAqIGV4dC9jZGF1ZGlvL2dzdGNkYXVkaW8uYzogKGdzdF9jZGF1ZGlvX2NsYXNzX2luaXQpOgorCSAgKiBleHQvZGlyZWN0ZmIvZGZidmlkZW9zaW5rLmM6IChnc3RfZGZidmlkZW9zaW5rX2NsYXNzX2luaXQpOgorCSAgKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmM6IChnc3RfZGl2eGRlY19jbGFzc19pbml0KToKKwkgICogZXh0L2hlcm1lcy9nc3RoZXJtZXNjb2xvcnNwYWNlLmM6CisJICAoZ3N0X2hlcm1lc19jb2xvcnNwYWNlX2NsYXNzX2luaXQpOgorCSAgKiBleHQvaXZvcmJpcy92b3JiaXNmaWxlLmM6IChnc3RfaXZvcmJpc2ZpbGVfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9qYWNrL2dzdGphY2suYzogKGdzdF9qYWNrX2NsYXNzX2luaXQpOgorCSAgKiBleHQvamFjay9nc3RqYWNrYmluLmM6IChnc3RfamFja19iaW5fY2xhc3NfaW5pdCk6CisJICAqIGV4dC9sY3MvZ3N0Y29sb3JzcGFjZS5jOiAoZ3N0X2NvbG9yc3BhY2VfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9saWJmYW1lL2dzdGxpYmZhbWUuYzogKGdzdF9mYW1lZW5jX2NsYXNzX2luaXQpOgorCSAgKiBleHQvbXVzaWNicmFpbnovZ3N0dHJtLmM6IChnc3RfbXVzaWNicmFpbnpfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9uYXMvbmFzc2luay5jOiAoZ3N0X25hc3NpbmtfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9zaG91dC9nc3RzaG91dC5jOiAoZ3N0X2ljZWNhc3RzZW5kX2NsYXNzX2luaXQpOgorCSAgKiBleHQvc25hcHNob3QvZ3N0c25hcHNob3QuYzogKGdzdF9zbmFwc2hvdF9jbGFzc19pbml0KToKKwkgICogZXh0L3NuZGZpbGUvZ3N0c2YuYzogKGdzdF9zZl9jbGFzc19pbml0KToKKwkgICogZXh0L3N3ZmRlYy9nc3Rzd2ZkZWMuYzogKGdzdF9zd2ZkZWNidWZmZXJfY2xhc3NfaW5pdCksCisJICAoZ3N0X3N3ZmRlY19jbGFzc19pbml0KToKKwkgICogZXh0L3Rhcmtpbi9nc3R0YXJraW5kZWMuYzogKGdzdF90YXJraW5kZWNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC90YXJraW4vZ3N0dGFya2luZW5jLmM6IChnc3RfdGFya2luZW5jX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvY2R4YXBhcnNlL2dzdGNkeGFzdHJpcC5jOiAoZ3N0X2NkeGFzdHJpcF9jbGFzc19pbml0KToKKwkgICogZ3N0L2NoYXJ0L2dzdGNoYXJ0LmM6IChnc3RfY2hhcnRfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9jb2xvcnNwYWNlL2dzdGNvbG9yc3BhY2UuYzogKGdzdF9jb2xvcnNwYWNlX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzogKGdzdF9kZWludGVybGFjZV9jbGFzc19pbml0KToKKwkgICogZ3N0L2Zlc3RpdmFsL2dzdGZlc3RpdmFsLmM6IChnc3RfZmVzdGl2YWxfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5jOiAoZ3N0X2Jwd3NpbmNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9maWx0ZXIvZ3N0aWlyLmM6IChnc3RfaWlyX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKGdzdF9scHdzaW5jX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvbGlicmZiL2dzdHJmYnNyYy5jOiAoZ3N0X3JmYnNyY19jbGFzc19pbml0KToKKwkgICogZ3N0L21peG1hdHJpeC9taXhtYXRyaXguYzogKGdzdF9taXhtYXRyaXhfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9tcGVnMXN5cy9nc3RtcGVnMXN5c3RlbWVuY29kZS5jOgorCSAgKGdzdF9zeXN0ZW1fZW5jb2RlX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvbXBlZzF2aWRlb3BhcnNlL2dzdG1wMXZpZGVvcGFyc2UuYzoKKwkgIChnc3RfbXAxdmlkZW9wYXJzZV9jbGFzc19pbml0KToKKwkgICogZ3N0L21wZWcyc3ViL2dzdG1wZWcyc3VidC5jOiAoZ3N0X21wZWcyc3VidF9jbGFzc19pbml0KToKKwkgICogZ3N0L21wZWdhdWRpb3BhcnNlL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJICAoZ3N0X21wM3BhcnNlX2NsYXNzX2luaXQpOgorCSAgKiBnc3Qvb3ZlcmxheS9nc3RvdmVybGF5LmM6IChnc3Rfb3ZlcmxheV9jbGFzc19pbml0KToKKwkgICogZ3N0L3Bhc3N0aHJvdWdoL2dzdHBhc3N0aHJvdWdoLmM6IChwYXNzdGhyb3VnaF9jbGFzc19pbml0KToKKwkgICogZ3N0L3BsYXlvbmRlbWFuZC9nc3RwbGF5b25kZW1hbmQuYzogKHBsYXlfb25fZGVtYW5kX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRqcGVnL2dzdHJ0anBlZ2RlYy5jOiAoZ3N0X3J0anBlZ2RlY19jbGFzc19pbml0KToKKwkgICogZ3N0L3J0anBlZy9nc3RydGpwZWdlbmMuYzogKGdzdF9ydGpwZWdlbmNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9zbW9vdGgvZ3N0c21vb3RoLmM6IChnc3Rfc21vb3RoX2NsYXNzX2luaXQpOgorCSAgKiBnc3Qvc21vb3Rod2F2ZS9nc3RzbW9vdGh3YXZlLmM6IChnc3Rfc21vb3Rod2F2ZV9jbGFzc19pbml0KToKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IChnc3Rfc3BlY3RydW1fY2xhc3NfaW5pdCk6CisJICAqIGdzdC9zdGVyZW8vZ3N0c3RlcmVvLmM6IChnc3Rfc3RlcmVvX2NsYXNzX2luaXQpOgorCSAgKiBnc3Qvc3dpdGNoL2dzdHN3aXRjaC5jOiAoZ3N0X3N3aXRjaF9jbGFzc19pbml0KToKKwkgICogZ3N0L3R0YS9nc3R0dGFkZWMuYzogKGdzdF90dGFfZGVjX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvdHRhL2dzdHR0YXBhcnNlLmM6IChnc3RfdHRhX3BhcnNlX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvdmJpZGVjL2dzdHZiaWRlYy5jOiAoZ3N0X3ZiaWRlY19jbGFzc19pbml0KToKKwkgICogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzogKGdzdF92aWRlb19jcm9wX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvdmlydHVhbGR1Yi9nc3R4c2hhcnBlbi5jOiAoZ3N0X3hzaGFycGVuX2NsYXNzX2luaXQpOgorCSAgKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOiAoZ3N0X3k0bWVuY29kZV9jbGFzc19pbml0KToKKwkgICogc3lzL2Nkcm9tL2dzdGNkcGxheWVyLmM6IChjZHBsYXllcl9jbGFzc19pbml0KToKKwkgICogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgKGdzdF9kaXJlY3Rzb3VuZHNpbmtfY2xhc3NfaW5pdCk6CisJICAqIHN5cy9keHIzL2R4cjNhdWRpb3NpbmsuYzogKGR4cjNhdWRpb3NpbmtfY2xhc3NfaW5pdCk6CisJICAqIHN5cy9keHIzL2R4cjNzcHVzaW5rLmM6IChkeHIzc3B1c2lua19jbGFzc19pbml0KToKKwkgICogc3lzL2R4cjMvZHhyM3ZpZGVvc2luay5jOiAoZHhyM3ZpZGVvc2lua19jbGFzc19pbml0KToKKwkgICogc3lzL3FjYW0vZ3N0cWNhbXNyYy5jOiAoZ3N0X3FjYW1zcmNfY2xhc3NfaW5pdCk6CisJICAqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuYzoKKwkgIChnc3RfdjRsMl9jb2xvcl9iYWxhbmNlX2NoYW5uZWxfY2xhc3NfaW5pdCk6CisJICAqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOiAoZ3N0X3Y0bDJfdHVuZXJfY2hhbm5lbF9jbGFzc19pbml0KSwKKwkgIChnc3RfdjRsMl90dW5lcl9ub3JtX2NsYXNzX2luaXQpOgorCSAgKiBzeXMveGltYWdlc3JjL3hpbWFnZXNyYy5jOiAoZ3N0X3hpbWFnZXNyY19jbGFzc19pbml0KToKKwkgIEZpeCAjMzM3MzY1IChnX3R5cGVfY2xhc3NfcmVmIDwtPiBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQpCisKKzIwMDYtMDQtMDggMTk6MDQ6MDEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgW01PVkVEIEZST00gQkFEXSBnc3QvOiBGaXggbW9yZSBicm9rZW4gR09iamVjdCBtYWNyb3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvY29sb3JzcGFjZS9nc3Rjb2xvcnNwYWNlLmg6CisJICAqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5oOgorCSAgKiBnc3QvcGFzc3Rocm91Z2gvZ3N0cGFzc3Rocm91Z2guaDoKKwkgICogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuaDoKKwkgIEZpeCBtb3JlIGJyb2tlbiBHT2JqZWN0IG1hY3JvcworCisyMDA2LTA0LTA2IDExOjM1OjI2ICswMDAwICBqQGJvb3RsYWIub3JnIDxqQGJvb3RsYWIub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQURdIFVuaWZ5IHRoZSBsb25nIGRlc2NyaXB0aW9ucyBpbiB0aGUgcGx1Z2luIGRldGFpbHMgKCMzMzcyNjMpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogal4gIDxqIGF0IGJvb3RsYWIgZG90IG9yZz4KKwkgICogZXh0L2FtcndiL2dzdGFtcndiZGVjLmM6CisJICAqIGV4dC9hbXJ3Yi9nc3RhbXJ3YmVuYy5jOgorCSAgKiBleHQvYW1yd2IvZ3N0YW1yd2JwYXJzZS5jOgorCSAgKiBleHQvYXJ0cy9nc3RfYXJ0cy5jOgorCSAgKiBleHQvYXJ0c2QvZ3N0YXJ0c2RzaW5rLmM6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZwYXJzZS5jOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmc2luay5jOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmc3JjLmM6CisJICAqIGV4dC9jZGF1ZGlvL2dzdGNkYXVkaW8uYzoKKwkgICogZXh0L2RpcmVjdGZiL2RmYnZpZGVvc2luay5jOgorCSAgKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmM6CisJICAqIGV4dC9kaXZ4L2dzdGRpdnhlbmMuYzoKKwkgICogZXh0L2R0cy9nc3RkdHNkZWMuYzogKGdzdF9kdHNkZWNfYmFzZV9pbml0KToKKwkgICogZXh0L2ZhYWMvZ3N0ZmFhYy5jOiAoZ3N0X2ZhYWNfYmFzZV9pbml0KToKKwkgICogZXh0L2ZhYWQvZ3N0ZmFhZC5jOgorCSAgKiBleHQvZ3NtL2dzdGdzbWRlYy5jOgorCSAgKiBleHQvZ3NtL2dzdGdzbWVuYy5jOgorCSAgKiBleHQvaGVybWVzL2dzdGhlcm1lc2NvbG9yc3BhY2UuYzoKKwkgICogZXh0L2l2b3JiaXMvdm9yYmlzZmlsZS5jOgorCSAgKiBleHQvbGNzL2dzdGNvbG9yc3BhY2UuYzoKKwkgICogZXh0L2xpYmZhbWUvZ3N0bGliZmFtZS5jOgorCSAgKiBleHQvbGlibW1zL2dzdG1tcy5jOiAoZ3N0X21tc19iYXNlX2luaXQpOgorCSAgKiBleHQvbXVzaWNicmFpbnovZ3N0dHJtLmM6IChnc3RfbXVzaWNicmFpbnpfYmFzZV9pbml0KToKKwkgICogZXh0L25hcy9uYXNzaW5rLmM6IChnc3RfbmFzc2lua19iYXNlX2luaXQpOgorCSAgKiBleHQvbmVvbi9nc3RuZW9uaHR0cHNyYy5jOgorCSAgKiBleHQvcG9seXAvcG9seXBzaW5rLmM6IChnc3RfcG9seXBzaW5rX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9zZGwvc2RsYXVkaW9zaW5rLmM6CisJICAqIGV4dC9zZGwvc2RsdmlkZW9zaW5rLmM6CisJICAqIGV4dC9zaG91dC9nc3RzaG91dC5jOgorCSAgKiBleHQvc25hcHNob3QvZ3N0c25hcHNob3QuYzoKKwkgICogZXh0L3NuZGZpbGUvZ3N0c2YuYzoKKwkgICogZXh0L3Rhcmtpbi9nc3R0YXJraW5kZWMuYzoKKwkgICogZXh0L3Rhcmtpbi9nc3R0YXJraW5lbmMuYzoKKwkgICogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX2Jhc2VfaW5pdCk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiAoZ3N0X3dhdnBhY2tfcGFyc2VfYmFzZV9pbml0KToKKwkgICogZXh0L3h2aWQvZ3N0eHZpZGRlYy5jOgorCSAgKiBleHQveHZpZC9nc3R4dmlkZW5jLmM6CisJICAqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXBhcnNlLmM6IChnc3RfY2R4YV9wYXJzZV9iYXNlX2luaXQpOgorCSAgKiBnc3QvY2R4YXBhcnNlL2dzdGNkeGFzdHJpcC5jOiAoZ3N0X2NkeGFzdHJpcF9iYXNlX2luaXQpOgorCSAgKiBnc3QvY2hhcnQvZ3N0Y2hhcnQuYzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzogKGdzdF9paXJfZXF1YWxpemVyX2Jhc2VfaW5pdCk6CisJICAqIGdzdC9mZXN0aXZhbC9nc3RmZXN0aXZhbC5jOgorCSAgKiBnc3QvZmlsdGVyL2dzdGlpci5jOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzoKKwkgICogZ3N0L2ZyZWV6ZS9nc3RmcmVlemUuYzoKKwkgICogZ3N0L2dhbWVzL2dzdHB1enpsZS5jOiAoZ3N0X3B1enpsZV9iYXNlX2luaXQpOgorCSAgKiBnc3QvbWl4bWF0cml4L21peG1hdHJpeC5jOgorCSAgKiBnc3QvbXBlZzFzeXMvZ3N0bXBlZzFzeXN0ZW1lbmNvZGUuYzoKKwkgICogZ3N0L21wZWcxdmlkZW9wYXJzZS9nc3RtcDF2aWRlb3BhcnNlLmM6CisJICAqIGdzdC9tcGVnMnN1Yi9nc3RtcGVnMnN1YnQuYzoKKwkgICogZ3N0L21wZWdhdWRpb3BhcnNlL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJICAqIGdzdC9tdWx0aWZpbGVzaW5rL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgICogZ3N0L292ZXJsYXkvZ3N0b3ZlcmxheS5jOgorCSAgKiBnc3QvcGFzc3Rocm91Z2gvZ3N0cGFzc3Rocm91Z2guYzoKKwkgICogZ3N0L3BsYXlvbmRlbWFuZC9nc3RwbGF5b25kZW1hbmQuYzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgKiBnc3QvcnRqcGVnL2dzdHJ0anBlZ2RlYy5jOgorCSAgKiBnc3QvcnRqcGVnL2dzdHJ0anBlZ2VuYy5jOgorCSAgKiBnc3Qvc21vb3RoL2dzdHNtb290aC5jOgorCSAgKiBnc3QvdHRhL2dzdHR0YWRlYy5jOiAoZ3N0X3R0YV9kZWNfYmFzZV9pbml0KToKKwkgICogZ3N0L3R0YS9nc3R0dGFwYXJzZS5jOiAoZ3N0X3R0YV9wYXJzZV9iYXNlX2luaXQpOgorCSAgKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSAgKiBnc3QvdmlkZW9kcm9wL2dzdHZpZGVvZHJvcC5jOgorCSAgKiBnc3QvdmlydHVhbGR1Yi9nc3R4c2hhcnBlbi5jOgorCSAgKiBnc3QveGluZ2hlYWRlci9nc3R4aW5nbXV4LmM6IChnc3RfeGluZ19tdXhfYmFzZV9pbml0KToKKwkgICogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIFVuaWZ5IHRoZSBsb25nIGRlc2NyaXB0aW9ucyBpbiB0aGUgcGx1Z2luIGRldGFpbHMgKCMzMzcyNjMpLgorCisyMDA2LTA0LTAxIDEwOjA5OjExICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gcmV3b3JrIGJ1aWxkOyBhZGQgdHJhbnNsYXRpb25zIGZvciB2NGwyCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJld29yayBidWlsZDsgYWRkIHRyYW5zbGF0aW9ucyBmb3IgdjRsMgorCisyMDA1LTA5LTA1IDE3OjIwOjI5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gRml4IHVwIGFsbCB0aGUgc3RhdGUgY2hhbmdlIGZ1bmN0aW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRml4IHVwIGFsbCB0aGUgc3RhdGUgY2hhbmdlIGZ1bmN0aW9ucy4KKworMjAwNS0wNy0wNSAxMDo1MTo0OSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBbTU9WRUQgRlJPTSBCQURdIFdheSwgd2F5LCB3YXkgdG9vIG1hbnkgZmlsZXM6IFJlbW92ZSBjcmFjayBjb21tZW50IGZyb20gdGhlIDIwMDAgZXJhLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTA3LTA1ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBXYXksIHdheSwgd2F5IHRvbyBtYW55IGZpbGVzOgorCSAgUmVtb3ZlIGNyYWNrIGNvbW1lbnQgZnJvbSB0aGUgMjAwMCBlcmEuCisKKzIwMDUtMDEtMTQgMTg6MzY6NDIgKzAwMDAgIFN0w6lwaGFuZSBMb2V1aWxsZXQgPGdzdHJlYW1lckBsZXJvdXRpZXIubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQURdIEknbSBhIGJhZCBib3kuIHVzaW5nIC8xMDAxLiB0byBmb3JjZSBDIHRvIGRvIGZsb2F0IGRpdmlzaW9uIGFuZCBub3QgaW50ZWdlciBkaXZpc2lvbiAoYXMgaXQgZGlkIGluIG15IGxhc3QgY29tbWl0KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSAgKiBnc3Qvc3VicGFyc2UvZ3N0c3VicGFyc2UuYzogKHBhcnNlX21kdmRzdWIpOgorCSAgKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOiAoZ3N0X3k0bWVuY29kZV9zaW5rY29ubmVjdCk6CisJICBJJ20gYSBiYWQgYm95LiB1c2luZyAvMTAwMS4gdG8gZm9yY2UgQyB0byBkbyBmbG9hdCBkaXZpc2lvbgorCSAgYW5kIG5vdCBpbnRlZ2VyIGRpdmlzaW9uIChhcyBpdCBkaWQgaW4gbXkgbGFzdCBjb21taXQpCisJICBUaGFua3MgdG8gRGF2aWQgSS4gTGVobiBmb3IgcG9pbnRpbmcgdGhpcyBtaXN0YWtlLgorCisyMDA1LTAxLTE0IDEyOjI3OjIyICswMDAwICBTdMOpcGhhbmUgTG9ldWlsbGV0IDxnc3RyZWFtZXJAbGVyb3V0aWVyLm5ldD4KKworCSAgW01PVkVEIEZST00gQkFEXSByZXBsYWNlIGZyYW1lcmF0ZSBhcHJveGltYXRpb25zIGJ5IHRoZWlyIHJlYWwgdmFsdWUgKDI0MDAwLzEwMDEsIDMwMDAwLzEwMDEsIDYwMDAwLzEwMDEpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVjLmM6CisJICAqIGV4dC9saWJmYW1lL2dzdGxpYmZhbWUuYzoKKwkgICogZ3N0L3N1YnBhcnNlL2dzdHN1YnBhcnNlLmM6IChwYXJzZV9tZHZkc3ViKToKKwkgICogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzogKGdzdF95NG1lbmNvZGVfc2lua2Nvbm5lY3QpOgorCSAgcmVwbGFjZSBmcmFtZXJhdGUgYXByb3hpbWF0aW9ucyBieSB0aGVpciByZWFsIHZhbHVlCisJICAoMjQwMDAvMTAwMSwgMzAwMDAvMTAwMSwgNjAwMDAvMTAwMSkKKwkgIEZpbmlzaCBmaXhpbmcgYnVnICMxNjQwNDkKKworMjAwNC0wNy0yNyAyMTo0MTozMCArMDAwMCAgU3RldmUgTGhvbW1lIDxzdGV2ZS5saG9tbWVAZnJlZS5mcj4KKworCSogZ3N0L3k0bS95NG1lbmMudmNwcm9qOgorCSAgW01PVkVEIEZST00gQkFEXSBtb3JlIHdvcmtpbmcgcGx1Z2lucworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBtb3JlIHdvcmtpbmcgcGx1Z2lucworCisyMDA0LTA3LTI3IDA5OjU3OjMzICswMDAwICBTdGV2ZSBMaG9tbWUgPHN0ZXZlLmxob21tZUBmcmVlLmZyPgorCisJKiBnc3QveTRtL3k0bWVuYy52Y3Byb2o6CisJICBbTU9WRUQgRlJPTSBCQURdIHJlbmFtZSBHU3RyZWFtZXItMC44LmxpYiB0byBsaWJnc3RyZWFtZXIubGliCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbmFtZSBHU3RyZWFtZXItMC44LmxpYiB0byBsaWJnc3RyZWFtZXIubGliCisKKzIwMDQtMDctMjcgMDk6NDg6NTEgKzAwMDAgIFN0ZXZlIExob21tZSA8c3RldmUubGhvbW1lQGZyZWUuZnI+CisKKwkqIGdzdC95NG0veTRtZW5jLnZjcHJvajoKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gYXZvaWQgcHJvYmxlbXMgd2l0aCBtYXRoLmgsIGZpeCByZWxlYXNlIGRlcGVuZGFuY3kKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYXZvaWQgcHJvYmxlbXMgd2l0aCBtYXRoLmgsIGZpeCByZWxlYXNlIGRlcGVuZGFuY3kKKworMjAwNC0wNy0yNiAxMzoyMDoxMSArMDAwMCAgU3RldmUgTGhvbW1lIDxzdGV2ZS5saG9tbWVAZnJlZS5mcj4KKworCSogZ3N0L3k0bS95NG1lbmMudmNwcm9qOgorCSAgW01PVkVEIEZST00gQkFEXSBtb3JlIHBsdWdpbnMgc3VwcG9ydGVkIHVuZGVyIHdpbmRvd3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgbW9yZSBwbHVnaW5zIHN1cHBvcnRlZCB1bmRlciB3aW5kb3dzCisKKzIwMDQtMDQtMDEgMTE6NDg6MjcgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgW01PVkVEIEZST00gQkFEXSBhNTJkZWM6ICAgVXNlIGEgZGVidWcgY2F0ZWdvcnksIE91dHB1dCB0aW1lc3RhbXBzIGNvcnJlY3RseQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhNTJkZWM6ICAgVXNlIGEgZGVidWcgY2F0ZWdvcnksIE91dHB1dCB0aW1lc3RhbXBzIGNvcnJlY3RseQorCSAgRW1pdCB0YWcgaW5mbywgSGFuZGxlIGV2ZW50cywgdGVsbCBsaWJhNTJkZWMgYWJvdXQgY3B1CisJICBjYXBhYmlsaXRpZXMgc28gaXQgY2FuIHVzZSBNTVggZXRjLgorCSAgZHZkZWM6ICAgIEZpeCBhIGNyYXNoZXIgYWNjZXNzaW5nIGludmFsaWQgbWVtb3J5CisJICBkdmRuYXZzcmM6U29tZSBzdXBwb3J0IGZvciBieXRlLWZvcm1hdCBzZWVraW5nLgorCSAgU21hbGwgZml4ZXMgZm9yIHN0aWxsIGZyYW1lcyBhbmQgbWVudSBidXR0b24gb3ZlcmxheXMKKwkgIG1wZWcyZGVjOiBVc2UgYSBkZWJ1ZyBjYXRlZ29yeS4gQWRqdXN0IHRoZSByZXBvcnQgbGV2ZWwgb2Ygc2V2ZXJhbCBpdGVtcyB0bworCSAgTE9HLiBDYWxsIG1wZWcyX2N1c3RvbV9mYnVmIHRvIG1hcmsgb3VyIGJ1ZmZlcnMgYXMgJ2N1c3RvbSBidWZmZXJzJworCSAgc28gaXQgZG9lc24ndCBsb3NlIHRoZSBHc3RCdWZmZXIgcG9pbnRlcgorCSAgbmF2c2VlazogIEFkZCB0aGUgbmF2c2VlayBkZWJ1ZyBlbGVtZW50IGZvciBzZWVraW5nIGJhY2sgYW5kIGZvcnRoIGluIGEKKwkgIHZpZGVvIHN0cmVhbSB1c2luZyBhcnJvdyBrZXlzLgorCSAgbXBlZzJzdWJ0OlByZXR0eSBtdWNoIGEgY29tcGxldGUgcmV3cml0ZS4gTm93IGEgbG9vcGJhc2VkIGVsZW1lbnQuIE1heSBzdGlsbAorCSAgcmVxdWlyZSB3b3JrIHRvIHByb3Blcmx5IHN5bmNocm9uaXNlIHN1YnRpdGxlIGJ1ZmZlcnMuCisJICBtcGVnZGVtdXg6CisJICBkdmRkZW11eDogRG9uJ3QgYXR0ZW1wdCB0byBjcmVhdGUgc3ViYnVmZmVycyBvZiBzaXplIDAKKwkgIFJlZHVjZSBhIGNvdXBsZSBvZiBlcnJvciBvdXRwdXRzIHRvIHdhcm5pbmdzLgorCSAgeTRtZW5jb2RlOk91dHB1dCB0aGUgeTRtIGZyYW1lIGhlYWRlciBjb3JyZWN0bHkKKworMjAwNC0wMy0xNSAxOTozMjoyNyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJICBbTU9WRUQgRlJPTSBCQURdIGRvbid0IG1peCB0YWJzIGFuZCBzcGFjZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZG9uJ3QgbWl4IHRhYnMgYW5kIHNwYWNlcworCisyMDA0LTAzLTE1IDE2OjMyOjU0ICswMDAwICBKb2hhbiBEYWhsaW4gPGpvaGFuQGdub21lLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEXSAqLmg6IFJldmVydCBpbmRlbnRpbmcKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiAqLmg6IFJldmVydCBpbmRlbnRpbmcKKworMjAwNC0wMy0xNCAyMjozNDozMyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5oOgorCSAgW01PVkVEIEZST00gQkFEXSBnc3QtaW5kZW50CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGdzdC1pbmRlbnQKKworMjAwNC0wMS0xMiAwMjowMTo1MiArMDAwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUBnbm9tZS5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gZ3N0LWxpYnMvZ3N0L3ZpZGVvL3ZpZGVvLmg6IEZpeCBjYXBzIHRlbXBsYXRlIG5hbWVzIHRvIGJlIHVuZGVyc3RhbmRhYmxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA0LTAxLTEyICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisJICAqIGdzdC1saWJzL2dzdC92aWRlby92aWRlby5oOgorCSAgRml4IGNhcHMgdGVtcGxhdGUgbmFtZXMgdG8gYmUgdW5kZXJzdGFuZGFibGUuCisJICBQcmVmaXggZXZlcnl0aGluZyB3aXRoIEdTVF9WSURFTy4KKwkgICogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSAgKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmM6CisJICAqIGV4dC9kaXZ4L2dzdGRpdnhlbmMuYzoKKwkgICogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJICAqIGV4dC9oZXJtZXMvZ3N0Y29sb3JzcGFjZS5jOiAoZ3N0X2NvbG9yc3BhY2VfYmFzZV9pbml0KToKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAocmF3X2NhcHNfZmFjdG9yeSk6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzogKHJhd19jYXBzX2ZhY3RvcnkpOgorCSAgKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5jOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiAocmF3X2NhcHNfZmFjdG9yeSk6CisJICAqIGV4dC9zbmFwc2hvdC9nc3RzbmFwc2hvdC5jOgorCSAgKiBleHQvc3dmZGVjL2dzdHN3ZmRlYy5jOgorCSAgKiBleHQveHZpZC9nc3R4dmlkZGVjLmM6CisJICAqIGV4dC94dmlkL2dzdHh2aWRlbmMuYzoKKwkgICogZ3N0L2NoYXJ0L2dzdGNoYXJ0LmM6CisJICAqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgKiBnc3QvZWZmZWN0di9nc3RlZmZlY3R2LmM6CisJICAqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6IChnc3RfZmx4ZGVjX2xvb3ApOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJICAqIGdzdC9tZWRpYW4vZ3N0bWVkaWFuLmM6CisJICAqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6IChnc3RfbW9ub3Njb3BlX2luaXQpLAorCSAgKGdzdF9tb25vc2NvcGVfc3JjY29ubmVjdCksIChnc3RfbW9ub3Njb3BlX2NoYWluKToKKwkgICogZ3N0L292ZXJsYXkvZ3N0b3ZlcmxheS5jOgorCSAgKiBnc3Qvc21vb3RoL2dzdHNtb290aC5jOgorCSAgKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzoKKwkgICogZ3N0L3N5bmFlc3RoZXNpYS9nc3RzeW5hZXN0aGVzaWEuYzoKKwkgICogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzoKKwkgICogZ3N0L3ZpZGVvZHJvcC9nc3R2aWRlb2Ryb3AuYzoKKwkgICogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgICogc3lzL3FjYW0vZ3N0cWNhbXNyYy5jOgorCSAgKiBzeXMvdjRsL2dzdHY0bHNyYy5jOiAoZ3N0X3Y0bHNyY19wYWxldHRlX3RvX2NhcHMpOgorCSAgTWFrZSB0aGVtIHdvcmsgd2l0aCBuZXcgdmlkZW8uaCBmaWxlLgorCSAgKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2NoYWluKSwKKwkgIChnc3RfeGltYWdlc2lua19idWZmZXJfZnJlZSksIChnc3RfeGltYWdlc2lua19idWZmZXJfYWxsb2MpOgorCSAgKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2NoYWluKSwKKwkgIChnc3RfeHZpbWFnZXNpbmtfYnVmZmVyX2ZyZWUpLCAoZ3N0X3h2aW1hZ2VzaW5rX2J1ZmZlcl9hbGxvYyk6CisJICBNYWtlIGl0IHdvcmsgd2l0aCBuZXcgYnVmZmVyIGFsbG9jYXRpb24gc3lzdGVtLgorCisyMDAzLTEyLTIyIDAxOjQ3OjA5ICswMDAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gTWVyZ2UgQ0FQUyBicmFuY2gKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgTWVyZ2UgQ0FQUyBicmFuY2gKKworMjAwMy0xMi0wNCAxMDozNzozOCArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgW01PVkVEIEZST00gQkFEXSByZW1vdmUgY29weXJpZ2h0IGZpZWxkIGZyb20gcGx1Z2lucworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZW1vdmUgY29weXJpZ2h0IGZpZWxkIGZyb20gcGx1Z2lucworCisyMDAzLTExLTE2IDIyOjAyOjIzICswMDAwICBMZWlmIEpvaG5zb24gPGxlaWZAYW1iaWVudC4yeS5uZXQ+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJICBbTU9WRUQgRlJPTSBCQURdICsgY2hlY2tpbmcgaW4gcGx1Z2luIGNhdGVnb3J5IGNoYW5nZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKyBjaGVja2luZyBpbiBwbHVnaW4gY2F0ZWdvcnkgY2hhbmdlcworCisyMDAzLTExLTA3IDEyOjQ3OjAyICswMDAwICBSb25hbGQgUy4gQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmg6CisJICBbTU9WRUQgRlJPTSBCQURdIFJlbW92ZSBhbGwgY29uZmlnLmggaW5jbHVkZXMgZnJvbSBoZWFkZXIgZmlsZXMsIGFkZCBpdCB0byBlYWNoIHNvdXJjZSBmaWxlIGFuZCByZW1vdmUgZHVwbGljYXRlIGNvbmZpZy5oIGluY2x1ZGVzIGZyby4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBSZW1vdmUgYWxsIGNvbmZpZy5oIGluY2x1ZGVzIGZyb20gaGVhZGVyIGZpbGVzLCBhZGQgaXQgdG8gZWFjaCBzb3VyY2UgZmlsZSBhbmQgcmVtb3ZlIGR1cGxpY2F0ZSBjb25maWcuaCBpbmNsdWRlcyBmcm9tIHNldmVyYWwgc291cmNlIGZpbGVzCisKKzIwMDMtMTEtMDIgMTk6MTc6MjcgKzAwMDAgIEJlbmphbWluIE90dGUgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgW01PVkVEIEZST00gQkFEXSBmaXggdG8gbmV3IHBsdWdpbiBzeXN0ZW0KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZml4IHRvIG5ldyBwbHVnaW4gc3lzdGVtCisKKzIwMDMtMTAtMDggMTY6MDg6MTkgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gL0dzdEJ1ZmZlci9Hc3REYXRhLyBpbiB0aGUgQVBJIHdoZXJlIHlvdSBjYW4gcGFzcyBldmVudHMuIEZpeCB0aGUgcGx1Z2lucyB0byBkZWFsIHdpdGggdGhhdC4gRml4ZXMgIzExMzQ4OC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgL0dzdEJ1ZmZlci9Hc3REYXRhLyBpbiB0aGUgQVBJIHdoZXJlIHlvdSBjYW4gcGFzcyBldmVudHMuIEZpeCB0aGUgcGx1Z2lucyB0byBkZWFsIHdpdGggdGhhdC4gRml4ZXMgIzExMzQ4OC4KKworMjAwMy0wOC0xMCAwMDowMTo1OCArMDAwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC95NG0vTWFrZWZpbGUuYW06CisJICBbTU9WRUQgRlJPTSBCQURdIFJlbW92ZSByZWR1bmRhbnQgcGx1Z2luZGlyIGRlZmluaXRpb24KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUmVtb3ZlIHJlZHVuZGFudCBwbHVnaW5kaXIgZGVmaW5pdGlvbgorCisyMDAzLTA3LTA2IDIwOjQ5OjUyICswMDAwICBSb25hbGQgUy4gQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5oOgorCSAgW01PVkVEIEZST00gQkFEXSBOZXcgbWltZXR5cGVzIGdvbmUgaW50byBlZmZlY3QgdG9kYXkgLSB0aGlzIGNvbW1pdCBjaGFuZ2VzIGFsbCBvbGQgbWltZXR5cGVzIG92ZXIgdG8gdGhlIG5ldyBtaW1ldHlwZXMgc3BlYyBhcyBkZXNjcmkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgTmV3IG1pbWV0eXBlcyBnb25lIGludG8gZWZmZWN0IHRvZGF5IC0gdGhpcyBjb21taXQgY2hhbmdlcyBhbGwgb2xkIG1pbWV0eXBlcyBvdmVyIHRvIHRoZSBuZXcgbWltZXR5cGVzIHNwZWMgYXMgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBjb21taXQncyBkb2N1bWVudC4gTm90ZTogc29tZSBwbHVnaW5zIHdpbGwgYnJlYWssIHNvbWUgcGlwZWxpbmVzIHdpbGwgYnJlYWssIGV4cGVjdCBIRUFEIHRvIGJlIGJyb2tlbiBvciBhdCBsZWFzdCBub3QgMTAwJSB3b3JraW5nIGZvciBhIGZldyBkYXlzLCBidXQgZG9uJ3QgZm9yZ2V0IHRvIHJlcG9ydCBidWdzCisKKzIwMDMtMDYtMjkgMTk6NDY6MTMgKzAwMDAgIEJlbmphbWluIE90dGUgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgW01PVkVEIEZST00gQkFEXSBjb21wYXRpYmlsaXR5IGZpeCBmb3IgbmV3IEdTVF9ERUJVRyBzdHVmZi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgY29tcGF0aWJpbGl0eSBmaXggZm9yIG5ldyBHU1RfREVCVUcgc3R1ZmYuCisJICBJbmNsdWRlcyBmaXhlcyBmb3IgbWlzc2luZyBpbmNsdWRlcyBmb3IgY29uZmlnLmggYW5kIHVuaXN0ZC5oCisJICBJIG9ubHkgZW5zdXJlZCBmb3IgcGx1Z2lucyBJIGNhbiBidWlsZCB0aGF0IHRoZXkgd29yaywgc28gaWYgc29tZSBvZiB0aGVtIGFyZSBzdGlsbCBicm9rZW4sIHlvdSBnb3R0YSBmaXggdGhlbSB5b3Vyc2VsdmVzIHVuZm9ydHVuYXRlbHkuCisKKzIwMDMtMDEtMTAgMTM6Mzg6MzIgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgW01PVkVEIEZST00gQkFEXSBQYWRDb25uZWN0IC0+IFBhZExpbmsKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGFkQ29ubmVjdCAtPiBQYWRMaW5rCisKKzIwMDMtMDEtMTAgMTA6MjI6MjUgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgW01PVkVEIEZST00gQkFEXSBhbm90aGVyIGJhdGNoIG9mIGNvbm5lY3QtPmxpbmsgZml4ZXMgcGxlYXNlIGxldCBtZSBrbm93IGFib3V0IGlzc3VlcyBhbmQgcGxlYXNlIHJlZnJhaW4gb2YgbWFraW5nIHRoZW0geW91cnNlbGYsIHNvIHQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYW5vdGhlciBiYXRjaCBvZiBjb25uZWN0LT5saW5rIGZpeGVzCisJICBwbGVhc2UgbGV0IG1lIGtub3cgYWJvdXQgaXNzdWVzCisJICBhbmQgcGxlYXNlIHJlZnJhaW4gb2YgbWFraW5nIHRoZW0geW91cnNlbGYsIHNvIHRoYXQgSSBkb24ndCBzcGVuZCBkb3VibGUKKwkgIHRoZSB0aW1lIHJlc29sdmluZyBjb25mbGljdHMKKworMjAwMi0xMi0wOCAxNDo1MDoxMCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC95NG0vTWFrZWZpbGUuYW06CisJICBbTU9WRUQgRlJPTSBCQURdIHBhcmFsbGVsIGluc3RhbGwgZml4ZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcGFyYWxsZWwgaW5zdGFsbCBmaXhlcworCisyMDAyLTA5LTE4IDE5OjAyOjUyICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJICBbTU9WRUQgRlJPTSBCQURdIHBsdWdpbnMgcGFydCBvZiBsaWNlbnNlIGZpZWxkIHBhdGNoCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHBsdWdpbnMgcGFydCBvZiBsaWNlbnNlIGZpZWxkIHBhdGNoCisKKzIwMDItMDYtMTcgMTA6Mjk6MzAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3QveTRtL01ha2VmaWxlLmFtOgorCSAgW01PVkVEIEZST00gQkFEXSBjb3NtZXRpYyBjaGFuZ2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgY29zbWV0aWMgY2hhbmdlCisKKzIwMDItMDUtMDMgMDk6NTk6MTAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgW01PVkVEIEZST00gQkFEXSB2YXJpb3VzIG5hbWUgZml4ZXMgYW5kIHN1bmRyeQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICB2YXJpb3VzIG5hbWUgZml4ZXMgYW5kIHN1bmRyeQorCisyMDAyLTA0LTIwIDIxOjQyOjUxICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJICBbTU9WRUQgRlJPTSBCQURdIGEgaGFjayB0byB3b3JrIGFyb3VuZCBpbnRsdG9vbCdzIGJyb2tlbm5lc3MgYSBjdXJyZW50IGNoZWNrIGZvciBtcGVnMmRlYyBkZXRhaWxzLT5rbGFzcyByZW9yZ2FuaXphdGlvbnMgYW4gZWxlbWVudCBici4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGEgaGFjayB0byB3b3JrIGFyb3VuZCBpbnRsdG9vbCdzIGJyb2tlbm5lc3MKKwkgICogYSBjdXJyZW50IGNoZWNrIGZvciBtcGVnMmRlYworCSAgKiBkZXRhaWxzLT5rbGFzcyByZW9yZ2FuaXphdGlvbnMKKwkgICogYW4gZWxlbWVudCBicm93c2VyIHRoYXQgdXNlcyBkZXRhaWxzLT5rbGFzcworCSAgKiBzZXBhcmF0ZWQgY2R4YSBwYXJzZSBvdXQgZnJvbSB0aGUgYXZpIGRpcmVjdG9yeQorCisyMDAyLTA0LTExIDIwOjQyOjI2ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJICBbTU9WRUQgRlJPTSBCQURdIEdzdFBhZFRlbXBsYXRlIDwtPiBnc3RfcGFkX3RlbXBsYXRlIDwtPiBHU1RfUEFEX1RFTVBMQVRFIHNhbWUgd2l0aCAqZmFjdG9yeSBhbmQgdHlwZWZpbmQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEdzdFBhZFRlbXBsYXRlIDwtPiBnc3RfcGFkX3RlbXBsYXRlIDwtPiBHU1RfUEFEX1RFTVBMQVRFCisJICBzYW1lIHdpdGggKmZhY3RvcnkgYW5kIHR5cGVmaW5kLgorCSAgYWxzbywgc29tZSAtV2Vycm9yIGZpeGVzLgorCisyMDAyLTAzLTMwIDE3OjA2OjI2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgW01PVkVEIEZST00gQkFEXSBDaGFuZ2VkIHRvIHRoZSBuZXcgcHJvcHMgQVBJCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIENoYW5nZWQgdG8gdGhlIG5ldyBwcm9wcyBBUEkKKwkgIE90aGVyIHNtYWxsIHR1ZmYuCisKKzIwMDItMDMtMjAgMjE6NDU6MDQgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmg6CisJICBbTU9WRUQgRlJPTSBCQURdIHMvR25vbWUtU3RyZWFtZXIvR1N0cmVhbWVyLworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBzL0dub21lLVN0cmVhbWVyL0dTdHJlYW1lci8KKworMjAwMi0wMy0xOSAwNDoxMDowNiArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBnc3QveTRtL01ha2VmaWxlLmFtOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmg6CisJICBbTU9WRUQgRlJPTSBCQURdIHJlbW92YWwgb2YgLy8tc3R5bGUgY29tbWVudHMgZG9uJ3QgbGluayBwbHVnaW5zIHRvIGNvcmUgbGlicyAtLSB0aGUgdmVyc2lvbmluZyBpcyBkb25lIGludGVybmFsbHkgdG8gdGhlIHBsdWdpbnMgd2l0aC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHJlbW92YWwgb2YgLy8tc3R5bGUgY29tbWVudHMKKwkgICogZG9uJ3QgbGluayBwbHVnaW5zIHRvIGNvcmUgbGlicyAtLSB0aGUgdmVyc2lvbmluZyBpcyBkb25lIGludGVybmFsbHkgdG8gdGhlIHBsdWdpbnMgd2l0aCB0aGUgcGx1Z2luX2luZm8gc3RydWN0LAorCSAgYW5kIHN5bWJvbCByZXNvbHV0aW9uIGlzIGxhenksIHNvIHdlIGNhbiBhbHdheXMga25vdyBpZiBhIHBsdWdpbiBjYW4gYmUgbG9hZGVkIGJ5IHRoZSBwbHVnaW5faW5mbyBkYXRhLiBpbiB0aGVvcnkuCisKKzIwMDItMDMtMTkgMDE6Mzk6NDMgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogZ3N0L3k0bS9NYWtlZmlsZS5hbToKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gcy9AR1NUX1BMVUdJTl9MREZMQUdTQC8kKEdTVF9QTFVHSU5fTERGTEFHUykvIEAtc3Vic3RpdHVlZCB2YXJpYWJsZXMgdmFyaWFibGVzIGFyZSBkZWZpbmVkIGFzIG1ha2UgdmFyaWFibGVzIGF1dG9tYWdpLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHMvQEdTVF9QTFVHSU5fTERGTEFHU0AvJChHU1RfUExVR0lOX0xERkxBR1MpLworCSAgQC1zdWJzdGl0dWVkIHZhcmlhYmxlcyB2YXJpYWJsZXMgYXJlIGRlZmluZWQgYXMgbWFrZSB2YXJpYWJsZXMgYXV0b21hZ2ljYWxseSwKKwkgIGFuZCB0aGlzIGdpdmVzIHRoZSB1c2VyIHRoZSBmcmVlZG9tIHRvIHNheSBtYWtlIEdTVF9QTFVHSU5fTERGTEFHUz0tbXlmbGFnCisKKzIwMDItMDEtMTggMTE6Mzc6MTkgKzAwMDAgIFdyb2JlbGwgPHdyb2JlbGxAaXRlLnBsPgorCisJKiBnc3QveTRtL01ha2VmaWxlLmFtOgorCSAgW01PVkVEIEZST00gQkFEXSAtIHBsdWdpbnMgYXJlIGJ1aWx0IHdpdGhvdXQgdmVyc2lvbmluZyBpbmZvCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIC0gcGx1Z2lucyBhcmUgYnVpbHQgd2l0aG91dCB2ZXJzaW9uaW5nIGluZm8KKworMjAwMi0wMS0xMyAyMjoyNzoyNSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gQnJpbmcgdGhlIHBsdWdpbnMgaW4gc3luYyB3aXRoIHRoZSBuZXcgY29yZSBjYXBzbmVnbyBzeXN0ZW0uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEJyaW5nIHRoZSBwbHVnaW5zIGluIHN5bmMgd2l0aCB0aGUgbmV3IGNvcmUgY2Fwc25lZ28gc3lzdGVtLgorCSAgQWRkZWQgc29tZSBmZWF0dXJlcywgZW5oYW5jZW1lbnRzLi4uCisKKzIwMDItMDEtMTIgMDM6MzQ6MjcgKzAwMDAgIERhdmlkIEkuIExlaG4gPGRsZWhuQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L3k0bS9NYWtlZmlsZS5hbToKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gcy9maWx0ZXIvcGx1Z2luLyBsaW5rIHBsdWdpbnMgdG8gR1NUX0xJQlMgcmVhcnJhbmdlIHJ1bGVzIHRvIGEgY29tbW9uIGZvcm1hdAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHMvZmlsdGVyL3BsdWdpbi8KKwkgICogbGluayBwbHVnaW5zIHRvIEdTVF9MSUJTCisJICAqIHJlYXJyYW5nZSBydWxlcyB0byBhIGNvbW1vbiBmb3JtYXQKKworMjAwMS0xMi0yMyAyMDoyMToyMCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC95NG0vTWFrZWZpbGUuYW06CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgW01PVkVEIEZST00gQkFEXSBtb3JlIGZpeGVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIG1vcmUgZml4ZXMKKworMjAwMS0xMi0yMyAxMzoxNzozNiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC95NG0vTWFrZWZpbGUuYW06CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gQkJCIGFza2VkIG1lIHRvIHJlbmFtZSBsYXYgdG8geTRtIGNhbiBzb21lb25lIHdobyBrbm93cyB0aGUgcGx1Z2luIGRvIHRoaXMgaW4gdGhlIHNvdXJjZSBhcyB3ZWxsID8KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQkJCIGFza2VkIG1lIHRvIHJlbmFtZSBsYXYgdG8geTRtCisJICBjYW4gc29tZW9uZSB3aG8ga25vd3MgdGhlIHBsdWdpbiBkbyB0aGlzIGluIHRoZSBzb3VyY2UgYXMgd2VsbCA/CisKKzIwMDktMDUtMTUgMTg6MTc6MzUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBwby9NYWtldmFyczoKKwkgIHBvOiBhZGQgTWFrZXZhcnMgbWFnaWMgc28gd2UgZG9uJ3QgZ2V0IGxpbmUgbnVtYmVycyBpbiAqLnBvIGZpbGVzCisJICBUaGlzIGF2b2lkcyB0aGUgbnVtYmVyIG9uZSByZWFzb24gZm9yIGxvY2FsIG1vZGlmaWNhdGlvbnMgaW4gKi5wbworCSAgZmlsZXMgYW5kIGFuZCBtYWtlcyB0aGluZ3MgbGVzcyBhbm5veWluZyB3aGVuIHdvcmtpbmcgd2l0aCBnaXQgKG9yCisJICBhbnkgb3RoZXIgVkNTIGZvciB0aGF0IG1hdHRlcikuCisKKzIwMDktMDUtMTUgMTc6MTE6MjcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM2RlbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL2ZsYWNkZWMuYzoKKwkqIHRlc3RzL2ZpbGVzL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZmlsZXMvYXVkaW90ZXN0c3JjLmZsYWM6CisJKiB0ZXN0cy9maWxlcy90ZXN0LWNlcnQucGVtOgorCSogdGVzdHMvZmlsZXMvdGVzdC1rZXkucGVtOgorCSAgY2hlY2tzOiBtb3ZlIGZpbGVzIHJlcXVpcmVkIGJ5IHVuaXQgdGVzdHMgaW50byB0ZXN0cy9maWxlcyBhbmQgbWFrZSBzdXJlIHRoZXkncmUgZGlzdGVkCisJICBNb3ZlIHVuaXQgdGVzdCBkYXRhIGludG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBpdCBiZWxvbmdzIGFuZCBtYWtlIGluIHBhcnRpY3VsYXIKKwkgIHRoZSBmbGFjZGVjIHVuaXQgdGVzdCBjZCBpbnRvIHRoZSBkaXJlY3Rvcnkgd2l0aCB0aGUgdGVzdCBmaWxlcyBpbnN0ZWFkIG9mIG1ha2luZworCSAgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaW4gdGhhdCB1bml0IHRlc3QuIEFzIGEgc2lkZSBlZmZlY3QKKwkgIG9mIG1vdm5nIHRob3NlIGZpbGVzLCB0aGVyZSdzIG9ubHkgb25lIEVYVFJBX0RJU1QgaW4gdGVzdHMvY2hlY2svTWFrZWZpbGUuYW0gbm93LAorCSAgd2hpY2ggaXMgbGlrZWx5IHRvIHdvcmsgYmV0dGVyIHRoYW4gaGF2aW5nIHR3by4gSG9wZWZ1bGx5IGZpeGVzICM1ODI3NTMuCisKKzIwMDktMDUtMTQgMjE6NDM6MTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBJZiB0aGUgdXBzdHJlYW0gbWF4IGxhdGVuY3kgaXMgdW5ib3VuZCByZXR1cm4gdW5ib3VuZCBtYXggbGF0ZW5jeQorCSAgRml4ZXMgYnVnICM1ODI2NjEuCisKKzIwMDktMDUtMTUgMDg6NDQ6MzkgKzAyMDAgIEphbWVzIEFuZHJld2FydGhhIDx0cnM4MEB1Y2MuZ3UudXdhLmVkdS5hdT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyY3RybC5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJ0cmFjay5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc3JjLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICBGaXggY29tcGlsZXIgd2FybmluZ3MKKwkgIEZpeGVzIGJ1ZyAjNTgyNzE1LgorCisyMDA5LTA1LTEzIDIyOjQ2OjQ0ICswMjAwICBKb3NlcCBUb3JyYSA8bjc3MGdhbGF4eUBnbWFpbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIFJlY292ZXJlZCBkZWJ1Z3V0aWxzIGxpbmUgYWNjaWRlbnRhbGx5IHJlbW92ZWQgaW4gZGVpbnRlcmxhY2UyIG1vdmUuCisKKzIwMDktMDUtMTMgMTA6NDY6NDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZ3N0L2RlaW50ZXJsYWNlL01ha2VmaWxlLmFtOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuaDoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5LmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWguYXNtOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHloLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWhtYWNyb3MuaDoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2xpbmVhcmJsZW5kLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL21teC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9wbHVnaW5zLmg6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3NjYWxlcmJvYi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9zc2UuaDoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3AwQS5pbmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcEJvdHRvbS5pbmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcEVkZ2VBLmluYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wRWRnZUE4LmluYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wT2RkQS5pbmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEEyLmluYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wT2RkQTYuaW5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBSC5pbmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEFIMi5pbmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFRvcC5pbmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFZBLmluYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wVkFILmluYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TdHJhbmdlQm9iLmluYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9Ub21zTW9Db21wQWxsLmluYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9Ub21zTW9Db21wQWxsMi5pbmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvV2llcmRCb2IuaW5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL3RvbXNtb2NvbXBtYWNyb3MuaDoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdmZpci5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZWJmZi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZXRmZi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS94ODYtNjRfbWFjcm9zLmluYzoKKwkgIE1vdmVkICdkZWludGVybGFjZTInIGZyb20gLWJhZCB0byAtZ29vZAorCSAgQW5kIHJlbmFtZSBpdCB0byBkZWludGVybGFjZS4KKworMjAwOS0wNS0wOCAxNTozOToyNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5oOgorCSAgW01PVkVEIEZST00gQkFEIDU2LzU2XSBkZWludGVybGFjZTI6IEFkZCBhIGRpc2FibGVkIG1vZGUgZm9yIHBhc3N0aHJvdWdoIG9wZXJhdGlvbgorCSAgQWxzbyBhbGxvdyB0byBjaGFuZ2UgdGhlIG1vZGUgaW4gUEFVU0VEIGFuZCBQTEFZSU5HIGJ5IHVwZGF0aW5nCisJICB0aGUgY2FwcyBpZiBuZWNlc3NhcnkuCisKKzIwMDktMDQtMjIgMTk6NDM6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA1NS81Nl0gZGVpbnRlcmxhY2UyOiBBZGQgZG9jdW1lbnRhdGlvbiBhbmQgaW50ZWdyYXRlIGludG8gdGhlIGJ1aWxkIHN5c3RlbQorCisyMDA5LTA0LTE5IDE3OjE4OjM1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA1NC81Nl0gZGVpbnRlcmxhY2UyOiBNYWtlIGl0IHBvc3NpYmxlIHRvIHNlbGVjdCBpbnRlcmxhY2luZyBhdXRvZGV0ZWN0aW9uIG9yIHRvIGVuZm9yZSBkZWludGVybGFjaW5nCisJICBGb3IgdGhpcyBhZGQgYSAibW9kZSIgcHJvcGVydHkgdGhhdCBkZWZhdWx0cyB0byAiaW50ZXJsYWNlZCIgZm9yIG5vdyBhcworCSAgbW9zdCBkZWNvZGVycy9kZW11eGVycyBkb24ndCBwcm9wZXJseSBzZXQgdGhlICJpbnRlcmxhY2VkIiBmaWVsZCBvbiB0aGUKKwkgIGNhcHMgeWV0LgorCSAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gImF1dG8iIHRoZSBlbGVtZW50IHdpbGwgd29yayBpbiBwYXNzdGhyb3VnaAorCSAgbW9kZSB1bmxlc3MgdGhlIGNhcHMgY29udGFpbiB0aGUgImludGVybGFjZWQiIGZpZWxkLgorCisyMDA5LTA0LTE3IDE1OjM5OjU5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA1My81Nl0gZGVpbnRlcmxhY2UyOiBVc2UgR1NUXyhERUJVR3xXQVJOSU5HfEVSUk9SKV9PQkpFQ1QgaW5zdGVhZCBvZiB0aGUgbm9uLU9CSkVDVCBvbmVzCisKKzIwMDktMDQtMTcgMTU6Mzk6MzYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOgorCSAgW01PVkVEIEZST00gQkFEIDUyLzU2XSBkZWludGVybGFjZTI6IFJlc2V0IGhpc3RvcnkgaWYgRElTQ09OVCBpcyBzZXQgb24gdGhlIGluY29taW5nIGJ1ZmZlcgorCisyMDA5LTA0LTE3IDE1OjM5OjEwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA1MS81Nl0gZGVpbnRlcmxhY2UyOiBGaXggdGltZXN0YW1wcyBmb3IgYnVmZmVycyB3aXRoIFJGRiBmbGFnIHNldAorCisyMDA5LTA0LTE2IDE3OjQxOjM3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkqIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmg6CisJKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHkuYzoKKwkqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeWguYzoKKwkqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3NjYWxlcmJvYi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9Ub21zTW9Db21wQWxsLmluYzoKKwkqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3dlYXZlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS93ZWF2ZWJmZi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvd2VhdmV0ZmYuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA1MC81Nl0gZGVpbnRlcmxhY2UyOiBSZW5hbWUgbGluZV9sZW5ndGggdG8gcm93X3N0cmlkZSBhbmQgcmVtb3ZlIG91dHB1dF9zdHJpZGUKKworMjAwOS0wNC0xNiAxNTo1MjozOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgNDkvNTZdIGRlaW50ZXJsYWNlMjogSW1wbGVtZW50IHN1cHBvcnQgZm9yIFJGRiBhbmQgT05FRklFTEQgYnVmZmVyIGZsYWdzCisKKzIwMDktMDQtMTUgMTU6NDY6NDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuaDoKKwkqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9Ub21zTW9Db21wQWxsLmluYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA0OC81Nl0gZGVpbnRlcmxhY2UyOiBNb3ZlIG91dHB1dCBidWZmZXIgZnJvbSB0aGUgaW5zdGFuY2Ugc3RydWN0IHRvIGEgZnVuY3Rpb24gcGFyYW1ldGVyCisKKzIwMDktMDQtMTUgMTU6MzM6MTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA0Ny81Nl0gZGVpbnRlcmxhY2UyOiBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBhdXRvbWF0aWMgZGV0ZWN0aW9uIG9mIHRoZSBmaWVsZCBvcmRlcgorCisyMDA5LTA0LTE1IDE0OjQ3OjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA0Ni81Nl0gZGVpbnRlcmxhY2UyOiBBZGQgc3VwcG9ydCBmb3IgWVZZVSBjb2xvcnNwYWNlCisJICBUaGlzIGlzIHRoZSBzYW1lIGFzIFlVWTIgd2l0aCBqdXN0IENyIGFuZCBDYiBzd2FwcGVkLiBBcworCSAgd2UgZG9uJ3QgbWFrZSBhIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVtIHdoZW4gZGVpbnRlcmxhY2luZworCSAgdGhpcyB3b3Jrcy4KKworMjAwOC0xMS0wNiAxNDowNTo1NSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgW01PVkVEIEZST00gQkFEIDQ1LzU2XSBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOiBCcmluZyBwcm9wZXJ0aWVzIGludG8gdGhpcyBjZW50dXJ5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmM6CisJICAoZ3N0X2RlaW50ZXJsYWNlMl9jbGFzc19pbml0KSwgKGdzdF9kZWludGVybGFjZTJfaW5pdCksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9zZXRfcHJvcGVydHkpLCAoZ3N0X2RlaW50ZXJsYWNlMl9nZXRfcHJvcGVydHkpOgorCSAgQnJpbmcgcHJvcGVydGllcyBpbnRvIHRoaXMgY2VudHVyeS4KKworMjAwOC0xMS0wNCAxMjo0MjozMCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgNDQvNTZdIERvbid0IGluc3RhbGwgc3RhdGljIGxpYnMgZm9yIHBsdWdpbnMuIEZpeGVzICM1NTA4NTEgZm9yIC1iYWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2Fsc2FzcGRpZi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2FtcndiL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXBleHNpbmsvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hcnRzL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXJ0c2QvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hdWRpb2ZpbGUvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hdWRpb3Jlc2FtcGxlL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYnoyL01ha2VmaWxlLmFtOgorCSAgKiBleHQvY2RhdWRpby9NYWtlZmlsZS5hbToKKwkgICogZXh0L2NlbHQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kYzEzOTQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kaXJhYy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2RpcmVjdGZiL01ha2VmaWxlLmFtOgorCSAgKiBleHQvZGl2eC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2R0cy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2ZhYWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9mYWFkL01ha2VmaWxlLmFtOgorCSAgKiBleHQvZ3NtL01ha2VmaWxlLmFtOgorCSAgKiBleHQvaGVybWVzL01ha2VmaWxlLmFtOgorCSAgKiBleHQvaXZvcmJpcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2phY2svTWFrZWZpbGUuYW06CisJICAqIGV4dC9qcDJrL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbGFkc3BhL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbGNzL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbGliZmFtZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xpYm1tcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L21ldGFkYXRhL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXBlZzJlbmMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9tcGxleC9NYWtlZmlsZS5hbToKKwkgICogZXh0L211c2VwYWNrL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXVzaWNicmFpbnovTWFrZWZpbGUuYW06CisJICAqIGV4dC9teXRodHYvTWFrZWZpbGUuYW06CisJICAqIGV4dC9uYXMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9uZW9uL01ha2VmaWxlLmFtOgorCSAgKiBleHQvb2ZhL01ha2VmaWxlLmFtOgorCSAgKiBleHQvcG9seXAvTWFrZWZpbGUuYW06CisJICAqIGV4dC9yZXNpbmR2ZC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NkbC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3Nob3V0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvc25hcHNob3QvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zbmRmaWxlL01ha2VmaWxlLmFtOgorCSAgKiBleHQvc291bmR0b3VjaC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NwYy9NYWtlZmlsZS5hbToKKwkgICogZXh0L3N3ZmRlYy9NYWtlZmlsZS5hbToKKwkgICogZXh0L3Rhcmtpbi9NYWtlZmlsZS5hbToKKwkgICogZXh0L3RoZW9yYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3RpbWlkaXR5L01ha2VmaWxlLmFtOgorCSAgKiBleHQvdHdvbGFtZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3gyNjQvTWFrZWZpbGUuYW06CisJICAqIGV4dC94aW5lL01ha2VmaWxlLmFtOgorCSAgKiBleHQveHZpZC9NYWtlZmlsZS5hbToKKwkgICogZ3N0LWxpYnMvZ3N0L2FwcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0LWxpYnMvZ3N0L2RzaG93L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYWlmZnBhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXBwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXVkaW9idWZmZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9iYXllci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2NkeGFwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2NoYXJ0L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvY29sb3JzcGFjZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RjY3AvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWludGVybGFjZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2R2ZHNwdS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2Zlc3RpdmFsL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZmlsdGVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZmxhY3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZmx2L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZ2FtZXMvTWFrZWZpbGUuYW06CisJICAqIGdzdC9oMjY0cGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9saWJyZmIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9taXhtYXRyaXgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tb2RwbHVnL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZzFzeXMvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tcGVnNHZpZGVvcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tcGVnZGVtdXgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tcGVndHNtdXgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tcGVndmlkZW9wYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L212ZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L25zZi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L251dmRlbXV4L01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvb3ZlcmxheS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3Bhc3N0aHJvdWdoL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcGNhcHBhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcGxheW9uZGVtYW5kL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcmF3cGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9yZWFsL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRqcGVnL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwbWFuYWdlci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NjYWxldGVtcG8vTWFrZWZpbGUuYW06CisJICAqIGdzdC9zZHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zZWxlY3Rvci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3Ntb290aC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3Ntb290aHdhdmUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zcGVlZC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NwZWV4cmVzYW1wbGUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zdGVyZW8vTWFrZWZpbGUuYW06CisJICAqIGdzdC9zdWJlbmMvTWFrZWZpbGUuYW06CisJICAqIGdzdC90dGEvTWFrZWZpbGUuYW06CisJICAqIGdzdC92YmlkZWMvTWFrZWZpbGUuYW06CisJICAqIGdzdC92aWRlb2Ryb3AvTWFrZWZpbGUuYW06CisJICAqIGdzdC92aWRlb3NpZ25hbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3ZpcnR1YWxkdWIvTWFrZWZpbGUuYW06CisJICAqIGdzdC92bW5jL01ha2VmaWxlLmFtOgorCSAgKiBnc3QveTRtL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvYWNtZW5jL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvY2Ryb20vTWFrZWZpbGUuYW06CisJICAqIHN5cy9kc2hvd2RlY3dyYXBwZXIvTWFrZWZpbGUuYW06CisJICAqIHN5cy9kc2hvd3NyY3dyYXBwZXIvTWFrZWZpbGUuYW06CisJICAqIHN5cy9kdmIvTWFrZWZpbGUuYW06CisJICAqIHN5cy9keHIzL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZmJkZXYvTWFrZWZpbGUuYW06CisJICAqIHN5cy9vc3M0L01ha2VmaWxlLmFtOgorCSAgKiBzeXMvcWNhbS9NYWtlZmlsZS5hbToKKwkgICogc3lzL3F0d3JhcHBlci9NYWtlZmlsZS5hbToKKwkgICogc3lzL3ZjZC9NYWtlZmlsZS5hbToKKwkgICogc3lzL3dpbmluZXQvTWFrZWZpbGUuYW06CisJICAqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIERvbid0IGluc3RhbGwgc3RhdGljIGxpYnMgZm9yIHBsdWdpbnMuIEZpeGVzICM1NTA4NTEgZm9yIC1iYWQuCisKKzIwMDgtMTAtMDkgMTk6Mzg6NTIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDQzLzU2XSBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wLmM6IEZpeCB1bnVzZWQgdmFyaWFibGUgY29tcGlsZXIgd2FybmluZyB3aGVuIG5vdCBidWlsZGluZworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3RvbXNtb2NvbXBfY2xhc3NfaW5pdCk6CisJICBGaXggdW51c2VkIHZhcmlhYmxlIGNvbXBpbGVyIHdhcm5pbmcgd2hlbiBub3QgYnVpbGRpbmcKKwkgIFg4NiBhc3NlbWJseS4KKworMjAwOC0wOC0yOCAxNzoxNjo1MSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCA0Mi81Nl0gZ3N0L2RjY3AvOiBGaXggY29tcGlsYXRpb24gb24gU29sYXJpcyBieSBpbmNsdWRpbmcgZmlsaW8uaCBhcyBuZWVkZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RjY3AvZ3N0ZGNjcC5jOgorCSAgKiBnc3QvZGNjcC9nc3RkY2NwY2xpZW50c3JjLmM6CisJICBGaXggY29tcGlsYXRpb24gb24gU29sYXJpcyBieSBpbmNsdWRpbmcgZmlsaW8uaCBhcyBuZWVkZWQuCisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvVG9tc01vQ29tcEFsbC5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvVG9tc01vQ29tcEFsbDIuaW5jOgorCSAgRml4IGNvbXBpbGF0aW9uIHdpdGggRm9ydGUgLSBhcHBhcmVudGx5IGl0IGhhdGVzIGNvbmNhdGVuYXRpbmcgYQorCSAgbWFjcm8gYXJndW1lbnQgdGhhdCBzdGFydHMgd2l0aCBhbiB1bmRlcnNjb3JlPz8KKworMjAwOC0wOC0yNiAxMjozMzoxNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgNDEvNTZdIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvOiBVbnJvbGwgdGhlIGxvb3AgdG8gaGFuZGxlIHR3byBieXRlcyBhdCBvbmNlLiBUaGlzIHNob3VsZCBnaXZlIGEgc21hbGwgc3BlZWR1cCBhbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcEJvdHRvbS5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFRvcC5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU3RyYW5nZUJvYi5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvV2llcmRCb2IuaW5jOgorCSAgVW5yb2xsIHRoZSBsb29wIHRvIGhhbmRsZSB0d28gYnl0ZXMgYXQgb25jZS4gVGhpcyBzaG91bGQgZ2l2ZQorCSAgYSBzbWFsbCBzcGVlZHVwIGFuZCBtYWtlcyBpdCBwb3NzaWJsZSB0byBoYW5kbGUgY2hyb21hIGFuZCBsdW1hCisJICBkaWZmZXJlbnQgd2hpY2ggaXMgbmVlZGVkIGxhdGVyLgorCisyMDA4LTA4LTI1IDE0OjM3OjQ1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCA0MC81Nl0gZ3N0L2RlaW50ZXJsYWNlMi86IEZpcnN0IHBhcnQgb2YgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgdGhlIHRvbXNtb2NvbXAgZGVpbnRlcmxhY2luZyBhbGdvcml0aG0uIFRoaXMgb25seSBzdXBwb3J0cyBzLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5oOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wLmM6CisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF90b21zbW9jb21wX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BCb3R0b20uaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BUb3AuaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1N0cmFuZ2VCb2IuaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwuaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwyLmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9XaWVyZEJvYi5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvdG9tc21vY29tcG1hY3Jvcy5oOgorCSAgRmlyc3QgcGFydCBvZiB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdG9tc21vY29tcCBkZWludGVybGFjaW5nCisJICBhbGdvcml0aG0uIFRoaXMgb25seSBzdXBwb3J0cyBzZWFyY2gtZWZmb3J0PTAgY3VycmVudGx5LCBpcyBwYWluZnVsbHkKKwkgIHNsb3cgYW5kIG5lZWRzIHNvbWUgY2xlYW51cCBsYXRlciB3aGVuIGFsbCBzZWFyY2gtZWZmb3J0IHNldHRpbmdzCisJICBhcmUgaW1wbGVtZW50ZWQgaW4gQy4KKworMjAwOC0wOC0wMiAxODo0ODoxNyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMzkvNTZdIGdzdC9kZWludGVybGFjZTIvOiBVc2Ugb2lsX21lbWNweSgpIGluc3RlYWQgb2YgbWVtY3B5KCkgYXMgaXQncyBmYXN0ZXIgZm9yIHRoZSBzaXplcyB0aGF0IGFyZSB1c3VhbGx5IHVzZWQgaGVyZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOgorCSAgKGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2ludGVycG9sYXRlX3NjYW5saW5lKSwKKwkgIChnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9jb3B5X3NjYW5saW5lKSwKKwkgIChnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZSk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeS5jOiAoZGVpbnRlcmxhY2VfZnJhbWVfZGlfZ3JlZWR5KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aC5jOgorCSAgKGRlaW50ZXJsYWNlX2ZyYW1lX2RpX2dyZWVkeWgpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9zY2FsZXJib2IuYzoKKwkgIChkZWludGVybGFjZV9zY2FubGluZV9zY2FsZXJfYm9iKToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC5jOiAoRmllbGRjb3B5KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvd2VhdmUuYzogKGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlKSwKKwkgIChjb3B5X3NjYW5saW5lKToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvd2VhdmViZmYuYzogKGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlKSwKKwkgIChjb3B5X3NjYW5saW5lKToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvd2VhdmV0ZmYuYzogKGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlKSwKKwkgIChjb3B5X3NjYW5saW5lKToKKwkgIFVzZSBvaWxfbWVtY3B5KCkgaW5zdGVhZCBvZiBtZW1jcHkoKSBhcyBpdCdzIGZhc3RlciBmb3IgdGhlIHNpemVzIHRoYXQKKwkgIGFyZSB1c3VhbGx5IHVzZWQgaGVyZS4KKworMjAwOC0wOC0wMiAxODozNjoxMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMzgvNTZdIGdzdC9kZWludGVybGFjZTIvOiBBZGQgdGhlIHJlbWFpbmluZyB0dnRpbWUgZGVpbnRlcmxhY2luZyBtZXRob2RzIGFuZCBmaXggdGhlIGRlaW50ZXJsYWNlX2ZyYW1lKCkgaW1wbGVtZW50YXRpb24gb2YgRy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmM6CisJICAoZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWUpLAorCSAgKGdzdF9kZWludGVybGFjZTJfbWV0aG9kc19nZXRfdHlwZSksIChnc3RfZGVpbnRlcmxhY2UyX3NldF9tZXRob2QpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5oOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9saW5lYXIuYzoKKwkgIChkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYyksIChkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfbW14KSwKKwkgIChkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfbW14ZXh0KSwKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9jbGFzc19pbml0KSwKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9pbml0KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvbGluZWFyYmxlbmQuYzoKKwkgIChkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmRfYyksCisJICAoZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kMl9jKSwKKwkgIChkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmRfbW14KSwKKwkgIChkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX21teCksCisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9saW5lYXJfYmxlbmRfY2xhc3NfaW5pdCksCisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9saW5lYXJfYmxlbmRfaW5pdCk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3BsdWdpbnMuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvc2NhbGVyYm9iLmM6CisJICAoZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYiksCisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9zY2FsZXJfYm9iX2NsYXNzX2luaXQpLAorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2Rfc2NhbGVyX2JvYl9pbml0KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvd2VhdmUuYzogKGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlKSwKKwkgIChjb3B5X3NjYW5saW5lKSwgKGdzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfY2xhc3NfaW5pdCksCisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF93ZWF2ZV9pbml0KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvd2VhdmViZmYuYzogKGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlKSwKKwkgIChjb3B5X3NjYW5saW5lKSwgKGdzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfYmZmX2NsYXNzX2luaXQpLAorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfYmZmX2luaXQpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS93ZWF2ZXRmZi5jOiAoZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmUpLAorCSAgKGNvcHlfc2NhbmxpbmUpLCAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF93ZWF2ZV90ZmZfY2xhc3NfaW5pdCksCisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF93ZWF2ZV90ZmZfaW5pdCk6CisJICBBZGQgdGhlIHJlbWFpbmluZyB0dnRpbWUgZGVpbnRlcmxhY2luZyBtZXRob2RzIGFuZCBmaXggdGhlCisJICBkZWludGVybGFjZV9mcmFtZSgpIGltcGxlbWVudGF0aW9uIG9mIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kLgorCisyMDA4LTA4LTAyIDE4OjMwOjU2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAzNy81Nl0gZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdmZpci5jOiBJbXBsZW1lbnQgdGhlIFZGSVIgZGVpbnRlcmxhY2luZyBtZXRob2QgYXMgc2ltcGxlIG1ldGhvZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS92ZmlyLmM6IChkZWludGVybGFjZV9saW5lX2MpLAorCSAgKGRlaW50ZXJsYWNlX2xpbmVfbW14KSwgKGdzdF9kZWludGVybGFjZV9tZXRob2RfdmZpcl9jbGFzc19pbml0KToKKwkgIEltcGxlbWVudCB0aGUgVkZJUiBkZWludGVybGFjaW5nIG1ldGhvZCBhcyBzaW1wbGUgbWV0aG9kLgorCisyMDA4LTA4LTAyIDE4OjE4OjU0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAzNi81Nl0gZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuKjogQWRkIGEgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2Qgc3ViY2xhc3Mgb2YgR3N0RGVpbnRlcmxhY2VNZXRob2QgdGhhdCBjYW4gYmUgdXNlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9pbnRlcnBvbGF0ZV9zY2FubGluZSksCisJICAoZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfY29weV9zY2FubGluZSksCisJICAoZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWUpLAorCSAgKGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2NsYXNzX2luaXQpLAorCSAgKGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2luaXQpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5oOgorCSAgQWRkIGEgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2Qgc3ViY2xhc3Mgb2YgR3N0RGVpbnRlcmxhY2VNZXRob2QgdGhhdAorCSAgY2FuIGJlIHVzZWQgYnkgc2ltcGxlIGRlaW50ZXJsYWNpbmcgbWV0aG9kcy4gVGhleSBvbmx5IGhhdmUgdG8gcHJvdmlkZQorCSAgYSBmdW5jdGlvbiBmb3IgaW50ZXJwb2xhdGluZyBhIHNjYW5saW5lIG9yIGNvcHlpbmcgYSBzY2FubGluZS4KKworMjAwOC0wOC0wMiAxODoxNTo0OSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMzUvNTZdIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmM6IFJlc3BlY3QgdGhlIGxhdGVuY3kgb2YgdGhlIGRlaW50ZXJsYWNpbmcgYWxnb3JpdGhtIGZvciB0aGUgdGltZXN0YW1wcyBvZiBldmVyeSBidS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmM6IChnc3RfZGVpbnRlcmxhY2UyX2NoYWluKToKKwkgIFJlc3BlY3QgdGhlIGxhdGVuY3kgb2YgdGhlIGRlaW50ZXJsYWNpbmcgYWxnb3JpdGhtIGZvciB0aGUgdGltZXN0YW1wcworCSAgb2YgZXZlcnkgYnVmZmVyLgorCisyMDA4LTA4LTAyIDE4OjEzOjIwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAzNC81Nl0gZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvOiBBZGQgdGhlIE1NWCByZWdpc3RlcnMgdG8gdGhlIGNsb2JiZXJlZCByZWdpc3RlcnMgb25seSBpZiBfX01NWF9fIGlzIGRlZmluZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aC5hc206CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcEJvdHRvbS5pbmM6CisJICBBZGQgdGhlIE1NWCByZWdpc3RlcnMgdG8gdGhlIGNsb2JiZXJlZCByZWdpc3RlcnMgb25seSBpZiBfX01NWF9fIGlzCisJICBkZWZpbmVkLgorCisyMDA4LTA4LTAyIDE4OjA5OjU2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAzMy81Nl0gZ3N0L2RlaW50ZXJsYWNlMi86IEVuYWJsZSB0b21zbW9jb21wIGFnYWluIGFzIHRoZSBDIHBvcnQgd2lsbCBiZSByZWFkeSBmb3IgdGhlIG5leHQgcmVsZWFzZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOgorCSAgKGdzdF9kZWludGVybGFjZTJfbWV0aG9kc19nZXRfdHlwZSksIChnc3RfZGVpbnRlcmxhY2UyX3NldF9tZXRob2QpLAorCSAgKGdzdF9kZWludGVybGFjZTJfY2xhc3NfaW5pdCk6CisJICBFbmFibGUgdG9tc21vY29tcCBhZ2FpbiBhcyB0aGUgQyBwb3J0IHdpbGwgYmUgcmVhZHkgZm9yIHRoZSBuZXh0CisJICByZWxlYXNlLgorCisyMDA4LTA4LTAyIDE4OjAyOjQ0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAzMi81Nl0gZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzogRG9uJ3QgdXNlIHByb3h5X2dldGNhcHMoKSBidXQgaW1wbGVtZW50IG91ciBvd24gZ2V0Y2FwcygpIGZ1bmN0aW9uIHRoYXQgZG91Ymxlcy9oLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzogKGdzdF9kZWludGVybGFjZTJfaW5pdCksCisJICAoZ3N0X2dyZWF0ZXN0X2NvbW1vbl9kaXZpc29yKSwgKGdzdF9mcmFjdGlvbl9kb3VibGUpLAorCSAgKGdzdF9kZWludGVybGFjZTJfZ2V0Y2FwcyksIChnc3RfZGVpbnRlcmxhY2UyX3NldGNhcHMpOgorCSAgRG9uJ3QgdXNlIHByb3h5X2dldGNhcHMoKSBidXQgaW1wbGVtZW50IG91ciBvd24gZ2V0Y2FwcygpIGZ1bmN0aW9uCisJICB0aGF0IGRvdWJsZXMvaGFsZnMgdGhlIGZyYW1lcmF0ZSBpZiBhbGwgZmllbGRzIHNob3VsZCBiZSBzZW50IG91dC4KKworMjAwOC0wNy0xOCAwODozNDowNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMzEvNTZdIERpc2FibGUgdGhlIHRvbXNtb2NvbXAgYWxnb3JpdGhtIGZvciB0aGlzIHJlbGVhc2UgYXMgaXQncyBidWdneSBhbmQgaGFzIG5vIEMgaW1wbGVtZW50YXRpb24geWV0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2UyX21ldGhvZHNfZ2V0X3R5cGUpLCAoZ3N0X2RlaW50ZXJsYWNlMl9zZXRfbWV0aG9kKSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX2NsYXNzX2luaXQpLCAoZ3N0X2RlaW50ZXJsYWNlMl9pbml0KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5LmM6CisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfbF9jbGFzc19pbml0KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aC5jOgorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2hfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3ZmaXIuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3ZmaXJfY2xhc3NfaW5pdCk6CisJICBEaXNhYmxlIHRoZSB0b21zbW9jb21wIGFsZ29yaXRobSBmb3IgdGhpcyByZWxlYXNlIGFzIGl0J3MgYnVnZ3kKKwkgIGFuZCBoYXMgbm8gQyBpbXBsZW1lbnRhdGlvbiB5ZXQuCisJICBCdWlsZCB0aGUgZGVpbnRlcmxhY2UyIHBsdWdpbiBvbiBhbGwgYXJjaGl0ZWN0dXJlcyBidXQgc3RpbGwgbWFyayBpdAorCSAgYXMgZXhwZXJpbWVudGFsLgorCSAgQnVpbGQgdGhlIHg4NiBpbmxpbmUgYXNzZW1ibHkgb25seSBpZiBHQ0MgaW5saW5lIGFzc2VtYmx5IGlzIHN1cHBvcnRlZAorCSAgYW5kIG9ubHkgb24geDg2IG9yIGFtZDY0LiBGaXhlcyBidWcgIzU0MzI4Ni4KKworMjAwOC0wNy0xNCAxNDoxMzo1NCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgW01PVkVEIEZST00gQkFEIDMwLzU2XSBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS86IEZpeCBidWlsZCBvbiB4ODZfNjQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHkuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dyZWVkeV9sX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHloLmM6CisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfaF9jbGFzc19pbml0KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdmZpci5jOgorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfdmZpcl9jbGFzc19pbml0KToKKwkgIEZpeCBidWlsZCBvbiB4ODZfNjQKKworMjAwOC0wNy0xMyAxMDo1Njo0NSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMjkvNTZdIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeWguYXNtOiBBbHdheXMgdXNlIHRoZSBDIGltcGxlbWVudGF0aW9uIGlmIHdpZHRoIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIFRoZSBhc3NlbWJseSBvcC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeWguYXNtOgorCSAgQWx3YXlzIHVzZSB0aGUgQyBpbXBsZW1lbnRhdGlvbiBpZiB3aWR0aCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiBUaGUKKwkgIGFzc2VtYmx5IG9wdGltaXplZCB2ZXJzaW9uIG9ubHkgaGFuZGxlIHRoaXMgYW5kIGNhbGxpbmcgdGhlIEMKKwkgIGltcGxlbWVudGF0aW9uIGZvciB0aGUgcmVtYWluaW5nIHBhcnQgZG9lc24ndCB3b3JrIGJlY2F1c2UgaXQgbmVlZHMKKwkgIHByZXZpb3VzIGNhbGN1bGF0aW9ucy4KKworMjAwOC0wNy0xMyAxMDo1MjowMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMjgvNTZdIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lLzogU29tZSBjbGVhbnVwLCB1c2UgM0ROT1cgaW5zdGVhZCBvZiBURE5PVyBpbiBtYWNyb3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aC5hc206CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeWguYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aG1hY3Jvcy5oOgorCSAgU29tZSBjbGVhbnVwLCB1c2UgM0ROT1cgaW5zdGVhZCBvZiBURE5PVyBpbiBtYWNyb3MuCisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3RvbXNtb2NvbXBfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvVG9tc01vQ29tcEFsbC5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvdG9tc21vY29tcG1hY3Jvcy5oOgorCSAgVGhlIFNTRSBtZXRob2QgaW4gZmFjdCBvbmx5IG5lZWRzIE1NWEVYVCwgZGVjbGFyZSBpdCBhcyBzdWNoLgorCisyMDA4LTA3LTA4IDEzOjMxOjM3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAyNy81Nl0gRG9uJ3QgdXNlIGRlY2xhcmF0aW9ucyBhZnRlciBzdGF0ZW1lbnRzIGluIHRoZSByZW1haW5pbmcgY29kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc3BjL2dzdHNwYy5jOiAoc3BjX3NldHVwKToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wVG9wLmluYzoKKwkgIERvbid0IHVzZSBkZWNsYXJhdGlvbnMgYWZ0ZXIgc3RhdGVtZW50cyBpbiB0aGUgcmVtYWluaW5nIGNvZGUuCisKKzIwMDgtMDctMDYgMjA6NDM6NTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDI2LzU2XSBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwyLmluYzogTWFyayBpbnRlcm5hbCBwcm9jZXNzaW5nIGZ1bmN0aW9ucyBhcyBzdGF0aWMgaW5saW5lIGZvciBxdWl0ZSAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwyLmluYzoKKwkgIE1hcmsgaW50ZXJuYWwgcHJvY2Vzc2luZyBmdW5jdGlvbnMgYXMgc3RhdGljIGlubGluZSBmb3IgcXVpdGUgc29tZQorCSAgc3BlZWR1cCBhcyB0aGV5J3JlIHVzZWQgb25seSBvbmNlIGFuZCBuZWVkIHRvIGdldCBtYW55IGxvY2FsIHZhcmlhYmxlcworCSAgcGFzc2VkIGFzIHBhcmFtZXRlci4KKworMjAwOC0wNy0wNSAxOToyMDozMCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMjUvNTZdIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLio6IENhbGwgdGhlIGN1cnJlbnQgaW5zdGFuY2UgInNlbGYiIGluc3RlYWQgb2YgIm9iamVjdCIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lKSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3NldF9tZXRob2QpLCAoZ3N0X2RlaW50ZXJsYWNlMl9pbml0KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3Jlc2V0X2hpc3RvcnkpLCAoZ3N0X2RlaW50ZXJsYWNlMl9yZXNldCksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9zZXRfcHJvcGVydHkpLCAoZ3N0X2RlaW50ZXJsYWNlMl9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9kZWludGVybGFjZTJfcG9wX2hpc3RvcnkpLCAoZ3N0X2RlaW50ZXJsYWNlMl9oZWFkX2hpc3RvcnkpLAorCSAgKGdzdF9kZWludGVybGFjZTJfcHVzaF9oaXN0b3J5KSwgKGdzdF9kZWludGVybGFjZTJfY2hhaW4pLAorCSAgKGdzdF9kZWludGVybGFjZTJfc2V0Y2FwcyksIChnc3RfZGVpbnRlcmxhY2UyX3NpbmtfZXZlbnQpLAorCSAgKGdzdF9kZWludGVybGFjZTJfY2hhbmdlX3N0YXRlKSwgKGdzdF9kZWludGVybGFjZTJfc3JjX2V2ZW50KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3NyY19xdWVyeSk6CisJICAqIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmg6CisJICBDYWxsIHRoZSBjdXJyZW50IGluc3RhbmNlICJzZWxmIiBpbnN0ZWFkIG9mICJvYmplY3QiLgorCisyMDA4LTA3LTA1IDE5OjExOjU2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAyNC81Nl0gZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuKjogSW5jbHVkZSBsYXRlbmN5IG9mIHRoZSBtZXRob2QgaW4gdGhlIHJldHVybmVkIGxhdGVuY3kuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dldF9sYXRlbmN5KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3NldF9tZXRob2QpLCAoZ3N0X2RlaW50ZXJsYWNlMl9jbGFzc19pbml0KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3B1c2hfaGlzdG9yeSksIChnc3RfZGVpbnRlcmxhY2UyX2NoYWluKSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3NldGNhcHMpLCAoZ3N0X2RlaW50ZXJsYWNlMl9zcmNfcXVlcnkpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5oOgorCSAgSW5jbHVkZSBsYXRlbmN5IG9mIHRoZSBtZXRob2QgaW4gdGhlIHJldHVybmVkIGxhdGVuY3kuCisJICBGaXggb3V0cHV0dGluZyBvZiBhbGwgZmllbGRzLCBpLmUuIGRvdWJsaW5nIG9mIHRoZSBmcmFtZXJhdGUuCisKKzIwMDgtMDctMDUgMTY6NDc6MzIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDIzLzU2XSBnc3QvZGVpbnRlcmxhY2UyLzogVXNlIGEgR3N0T2JqZWN0IHN1YnR5cGUgZm9yIHRoZSBkZWludGVybGFjaW5nIG1ldGhvZHMgYW5kIGV4cG9ydCB0aGUgZGlmZmVyZW50IHNldHRpbmdzIGZvciBlYWNoIGQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOgorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfY2xhc3NfaW5pdCksIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2luaXQpLAorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWUpLAorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfZ2V0X2ZpZWxkc19yZXF1aXJlZCksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9tZXRob2RzX2dldF90eXBlKSwgKF9kb19pbml0KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3NldF9tZXRob2QpLCAoZ3N0X2RlaW50ZXJsYWNlMl9jbGFzc19pbml0KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX2NoaWxkX3Byb3h5X2dldF9jaGlsZF9ieV9pbmRleCksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9jaGlsZF9wcm94eV9nZXRfY2hpbGRyZW5fY291bnQpLAorCSAgKGdzdF9kZWludGVybGFjZTJfY2hpbGRfcHJveHlfaW50ZXJmYWNlX2luaXQpLAorCSAgKGdzdF9kZWludGVybGFjZTJfaW5pdCksIChnc3RfZGVpbnRlcmxhY2UyX2ZpbmFsaXplKSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX2NoYWluKSwgKGdzdF9kZWludGVybGFjZTJfc3JjX3F1ZXJ5KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5LmM6CisJICAoZGVpbnRlcmxhY2VfZ3JlZWR5X3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgIChkZWludGVybGFjZV9ncmVlZHlfcGFja2VkNDIyX3NjYW5saW5lX21teCksCisJICAoZGVpbnRlcmxhY2VfZ3JlZWR5X3BhY2tlZDQyMl9zY2FubGluZV9tbXhleHQpLAorCSAgKGRlaW50ZXJsYWNlX2ZyYW1lX2RpX2dyZWVkeSksCisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfbF9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2xfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dyZWVkeV9sX2NsYXNzX2luaXQpLAorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2xfaW5pdCk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeWguYXNtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHloLmM6IChncmVlZHlEU2NhbGVyX0MpLAorCSAgKGRlaW50ZXJsYWNlX2ZyYW1lX2RpX2dyZWVkeWgpLAorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2hfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dyZWVkeV9oX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfaF9jbGFzc19pbml0KSwKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dyZWVkeV9oX2luaXQpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHloLmg6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3BsdWdpbnMuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC5jOgorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfdG9tc21vY29tcF9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfdG9tc21vY29tcF9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfdG9tc21vY29tcF9jbGFzc19pbml0KSwKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3RvbXNtb2NvbXBfaW5pdCk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9Ub21zTW9Db21wQWxsLmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdmZpci5jOiAoZGVpbnRlcmxhY2VfZnJhbWVfdmZpciksCisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF92ZmlyX2NsYXNzX2luaXQpLAorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfdmZpcl9pbml0KToKKwkgIFVzZSBhIEdzdE9iamVjdCBzdWJ0eXBlIGZvciB0aGUgZGVpbnRlcmxhY2luZyBtZXRob2RzIGFuZCBleHBvcnQKKwkgIHRoZSBkaWZmZXJlbnQgc2V0dGluZ3MgZm9yIGVhY2ggZGVpbnRlcmxhY2luZyBtZXRob2QgdmlhIEdPYmplY3QKKwkgIHByb3BlcnRpZXMuCisJICBJbXBsZW1lbnQgR3N0Q2hpbGRQcm94eSBpbnRlcmZhY2UgdG8gYWxsb3cgYWNjZXNzIHRvIHRoZSB1c2VkCisJICBkZWludGVybGFjaW5nIG1ldGhvZCBhbmQgdG8gYWxsb3cgYWRqdXN0aW5nIHRoZSBkaWZmZXJlbnQgc2V0dGluZ3MuCisJICBNb3ZlIGdsb2JhbCB2YXJpYWJsZXMgb2YgdGhlIHRvbXNtb2NvbXAgZGVpbnRlcmxhY2luZyBtZXRob2QgaW50bworCSAgZnVuY3Rpb24gbG9jYWwgdmFyaWFibGVzIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gdXNlIHRoaXMgZGVpbnRlcmxhY2luZworCSAgbWV0aG9kIGZyb20gZGlmZmVyZW50IGluc3RhbmNlcy4KKworMjAwOC0wNy0wNSAxMjoyMjozNyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMjIvNTZdIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeWguYXNtOiBTdXBwb3J0IHdpZHRocyB0aGF0IGFyZSBub3QgYSBtdWx0aXBseSBvZiA0IHdoZW4gdXNpbmcgdGhlIGFzc2VtYmx5IG9wdGltaXplZCBnci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeWguYXNtOgorCSAgU3VwcG9ydCB3aWR0aHMgdGhhdCBhcmUgbm90IGEgbXVsdGlwbHkgb2YgNCB3aGVuIHVzaW5nIHRoZSBhc3NlbWJseQorCSAgb3B0aW1pemVkIGdyZWVkeWggaW1wbGVtZW50YXRpb25zLgorCisyMDA4LTA3LTA0IDE4OjU0OjE1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAyMS81Nl0gZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aC5jOiBPbmx5IGJ1aWxkIHRoZSBhc3NlbWJseSBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb25zIG9uIHg4Ni4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHloLmM6CisJICAoZGVpbnRlcmxhY2VfZnJhbWVfZGlfZ3JlZWR5aCk6CisJICBPbmx5IGJ1aWxkIHRoZSBhc3NlbWJseSBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb25zIG9uIHg4Ni4KKworMjAwOC0wNi0zMCAwNzo1MTowNyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMjAvNTZdIGdzdC9kZWludGVybGFjZTIvOiBSZW1vdmUgdXNlbGVzcyBmaWxlIGFuZCBtYXJrIGV2ZXJ5dGhpbmcgcG9zc2libGUgYXMgc3RhdGljLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAuYzogKHRvbXNtb2NvbXBfaW5pdCksCisJICAodG9tc21vY29tcF9maWx0ZXJfbW14KSwgKHRvbXNtb2NvbXBfZmlsdGVyXzNkbm93KSwKKwkgICh0b21zbW9jb21wX2ZpbHRlcl9zc2UpLCAoZGVpbnRlcmxhY2VfZnJhbWVfZGlfdG9tc21vY29tcCk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAuaDoKKwkgIFJlbW92ZSB1c2VsZXNzIGZpbGUgYW5kIG1hcmsgZXZlcnl0aGluZyBwb3NzaWJsZSBhcyBzdGF0aWMuCisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeS5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHloLmM6CisJICBVc2UgIl9zdGRpbnQuaCIgaW5zdGVhZCBvZiA8c3RkaW50Lmg+LgorCisyMDA4LTA2LTI5IDEwOjU2OjQ3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxOS81Nl0gZ3N0L2RlaW50ZXJsYWNlMi86IEdldCByaWQgb2Ygc3BlZWR5LltjaF0gYXMgd2UgZG9uJ3QgdXNlIG1vc3Qgb2YgaXQncyBjb2RlIGFueXdheSBhbmQgaXQgZG9lc24ndCBzZWVtIHRvIGJlIHJlbGljZW5zLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzogKGdzdF9kZWludGVybGFjZTJfaW5pdCk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeS5jOiAoZGVpbnRlcmxhY2VfZnJhbWVfZGlfZ3JlZWR5KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aC5jOgorCSAgKGRlaW50ZXJsYWNlX2ZyYW1lX2RpX2dyZWVkeWgpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9zcGVlZHRvb2xzLmg6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3NwZWVkeS5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9zcGVlZHkuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC5jOiAoRmllbGRjb3B5KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9Ub21zTW9Db21wQWxsLmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdmZpci5jOiAoZGVpbnRlcmxhY2VfZnJhbWVfdmZpcik6CisJICBHZXQgcmlkIG9mIHNwZWVkeS5bY2hdIGFzIHdlIGRvbid0IHVzZSBtb3N0IG9mIGl0J3MgY29kZSBhbnl3YXkKKwkgIGFuZCBpdCBkb2Vzbid0IHNlZW0gdG8gYmUgcmVsaWNlbnNlZCB0byBMR1BMLiBVc2UgbWVtY3B5KCkgaW5zdGVhZAorCSAgb2YgdGhlIHNwZWVkeSBtZW1jcHkgZXZlcnl3aGVyZSBpbnN0ZWFkLgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5oOgorCSAgUmVtb3ZlIG1hbnkgdW51c2VkIGRlY2xhcmF0aW9ucy4KKworMjAwOC0wNi0yOCAxODoxMzowOCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMTgvNTZdIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmM6IERpdmlkZSBsYXRlbmN5IGJlIDIgdG8gY29udmVydCBmcm9tIGZpZWxkcyB0byBmcmFtZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzogKGdzdF9kZWludGVybGFjZTJfc3JjX3F1ZXJ5KToKKwkgIERpdmlkZSBsYXRlbmN5IGJlIDIgdG8gY29udmVydCBmcm9tIGZpZWxkcyB0byBmcmFtZXMuCisKKzIwMDgtMDYtMjggMTg6MTA6NTIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDE3LzU2XSBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHkuYzogRG9uJ3QgdXNlIHNjYW5saW5lcyBmdW5jdGlvbiBmcm9tIGdzdGRlaW50ZXJsYWNlMiBhcyBpdCdzIG5vdCBhcHByb3BpYXRlIGZvciB0aGlzIG0uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHkuYzoKKwkgIChkZWludGVybGFjZV9ncmVlZHlfcGFja2VkNDIyX3NjYW5saW5lX2MpLAorCSAgKGRlaW50ZXJsYWNlX2dyZWVkeV9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14KSwKKwkgIChkZWludGVybGFjZV9ncmVlZHlfcGFja2VkNDIyX3NjYW5saW5lX21teGV4dCksCisJICAoZGVpbnRlcmxhY2VfZnJhbWVfZGlfZ3JlZWR5KToKKwkgIERvbid0IHVzZSBzY2FubGluZXMgZnVuY3Rpb24gZnJvbSBnc3RkZWludGVybGFjZTIgYXMgaXQncworCSAgbm90IGFwcHJvcGlhdGUgZm9yIHRoaXMgbWV0aG9kLiBJbnN0ZWFkIGltcGxlbWVudCBkZWludGVybGFjZV9mcmFtZQorCSAgZnVuY3Rpb24gYnkgdGFraW5nIHRoZSBvbmUgZnJvbSBncmVlZHloLgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHloLmM6IChncmVlZHlEU2NhbGVyX0MpOgorCSAgU21hbGwgZml4IGZvciB0aGUgQyBpbXBsZW1lbnRhdGlvbi4KKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdmZpci5jOiAoZGVpbnRlcmxhY2VfZnJhbWVfdmZpcik6CisJICBEb24ndCB1c2UgdGhlIHNjYW5saW5lcyBmdW5jdGlvbiBmcm9tIGdzdGRlaW50ZXJsYWNlMiBhcyBpdCdzIG9ubHkKKwkgIHVzZWQgZm9yIHRoaXMgbWV0aG9kIGFuZCB3aWxsIGJlIHJlbW92ZWQuIEluc3RlYWQgaW1wbGVtZW50CisJICBkZWludGVybGFjZV9mcmFtZSBmdW5jdGlvbiBhbmQgbWFrZSBpdCBhIGJpdCBtb3JlIGVmZmljaWVudC4KKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2UyX2NsYXNzX2luaXQpLCAoZ3N0X2RlaW50ZXJsYWNlMl9zZXRfbWV0aG9kKSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3B1c2hfaGlzdG9yeSksIChnc3RfZGVpbnRlcmxhY2UyX2NoYWluKSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3NldGNhcHMpLCAoZ3N0X2RlaW50ZXJsYWNlMl9zaW5rX2V2ZW50KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX2NoYW5nZV9zdGF0ZSksIChnc3RfZGVpbnRlcmxhY2UyX3NyY19ldmVudCksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9zcmNfcXVlcnkpOgorCSAgRml4IGNvZGluZyBzdHlsZSBhbmQgcmVtb3ZlIHNjYW5saW5lcyBmdW5jdGlvbiBhcyBpdCdzIHVudXNlZCBub3cuCisKKzIwMDgtMDYtMjggMTc6MjU6NTYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDE2LzU2XSBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS86IEFkZCBhIEMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBncmVlZHloIGRlaW50ZXJsYWNpbmcgbWV0aG9kLCBjbGVhbiB1cCB0aGUgY29kZSBhIGJpdCBhbmQgbWEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHloLmFzbToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aC5jOiAoZ3JlZWR5RFNjYWxlcl9DKSwKKwkgIChkZWludGVybGFjZV9mcmFtZV9kaV9ncmVlZHloKSwgKGRzY2FsZXJfZ3JlZWR5aF9nZXRfbWV0aG9kKToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aG1hY3Jvcy5oOgorCSAgQWRkIGEgQyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGdyZWVkeWggZGVpbnRlcmxhY2luZyBtZXRob2QsIGNsZWFuCisJICB1cCB0aGUgY29kZSBhIGJpdCBhbmQgbWFyayB0aGUgU1NFIHZlcnNpb24gYXMgTU1YRVhUIGFzIGl0IGRvZXNuJ3QKKwkgIHJlcXVpcmUgYW55IFNTRSBpbnN0cnVjdGlvbnMuCisKKzIwMDgtMDYtMjcgMTM6MjI6MzQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDE1LzU2XSBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOiBJZiB3ZSdyZSBvdXRwdXR0aW5nIGFsbCBmaWVsZHMgdGhlIGZyYW1lcmF0ZSBoYXMgdG8gYmUgZG91YmxlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOgorCSAgKGdzdF9kZWludGVybGFjZTJfc2V0X3Byb3BlcnR5KSwgKGdzdF9kZWludGVybGFjZTJfY2hhaW4pLAorCSAgKGdzdF9kZWludGVybGFjZTJfc2V0Y2Fwcyk6CisJICBJZiB3ZSdyZSBvdXRwdXR0aW5nIGFsbCBmaWVsZHMgdGhlIGZyYW1lcmF0ZSBoYXMgdG8gYmUgZG91YmxlZC4KKwkgIFNldCBkdXJhdGlvbiBvbiB0aGUgb3V0Z29pbmcgYnVmZmVycy4KKworMjAwOC0wNi0yNSAxNjowNTowOCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgW01PVkVEIEZST00gQkFEIDE0LzU2XSBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL3RvbXNtb2NvbXBtYWNyb3MuaDogUmVtb3ZlIHVubmVlZGVkIG1hY3JvcyB0aGF0IGJyZWFrIGJ1aWxkIG9uIG1hY29zeC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL3RvbXNtb2NvbXBtYWNyb3MuaDoKKwkgIFJlbW92ZSB1bm5lZWRlZCBtYWNyb3MgdGhhdCBicmVhayBidWlsZCBvbiBtYWNvc3guCisKKzIwMDgtMDYtMjQgMTI6MDg6NDcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDEzLzU2XSBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHkuYzogT3B0aW1pemUgTU1YL01NWEVYVCBpbXBsZW1lbnRhdGlvbnMgYSBiaXQgYnkgcmVxdWlyaW5nIHR3byBsZXNzIG1lbW9yeSBhY2Nlc3NlcyBhbmQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHkuYzoKKwkgIChkZWludGVybGFjZV9ncmVlZHlfcGFja2VkNDIyX3NjYW5saW5lX21teCksCisJICAoZGVpbnRlcmxhY2VfZ3JlZWR5X3BhY2tlZDQyMl9zY2FubGluZV9tbXhleHQpOgorCSAgT3B0aW1pemUgTU1YL01NWEVYVCBpbXBsZW1lbnRhdGlvbnMgYSBiaXQgYnkgcmVxdWlyaW5nIHR3byBsZXNzCisJICBtZW1vcnkgYWNjZXNzZXMgYW5kIGZpeCB0aGUgd29ya2Fyb3VuZCBmb3IgdGhlIG1pc3NpbmcgcmlnaHQgc2hpZnQKKwkgIG9uIGJ5dGVzIHRvIHVuc2V0IHRoZSBoaWdoZXN0IGJpdCBvZiBldmVyeSBieXRlLgorCisyMDA4LTA2LTI0IDEwOjE1OjQxICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMi81Nl0gZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5LmM6IFJlbW92ZSBzZmVuY2UgaW5zdHJ1Y3Rpb24gYXMgaXQncyBub3QgbmVlZGVkIGFuZCBhY3R1YWxseSBpcyBhbiBTU0UgaW5zdHJ1Y3Rpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5LmM6CisJICAoZGVpbnRlcmxhY2VfZ3JlZWR5X3BhY2tlZDQyMl9zY2FubGluZV9tbXhleHQpOgorCSAgUmVtb3ZlIHNmZW5jZSBpbnN0cnVjdGlvbiBhcyBpdCdzIG5vdCBuZWVkZWQgYW5kIGFjdHVhbGx5IGlzIGFuIFNTRQorCSAgaW5zdHJ1Y3Rpb24uCisKKzIwMDgtMDYtMjQgMTA6MTI6MDggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDExLzU2XSBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHkuYzogQWRkIHBsYWluIE1NWCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGdyZWVkeWwgbWV0aG9kLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeS5jOgorCSAgKGRlaW50ZXJsYWNlX2dyZWVkeV9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14KSwKKwkgIChkZWludGVybGFjZV9ncmVlZHlfcGFja2VkNDIyX3NjYW5saW5lKToKKwkgIEFkZCBwbGFpbiBNTVggaW1wbGVtZW50YXRpb24gZm9yIHRoZSBncmVlZHlsIG1ldGhvZC4KKworMjAwOC0wNi0yNCAwOTo0MDowMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMTAvNTZdIGdzdC9kZWludGVybGFjZTIvTWFrZWZpbGUuYW06IE1vdmUgdGhlIGFzc2VtYmx5IGluY2x1ZGVzIHRvIG5vaW5zdF9IRUFERVJTIHdoZXJlIHRoZXkgYmVsb25nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvTWFrZWZpbGUuYW06CisJICBNb3ZlIHRoZSBhc3NlbWJseSBpbmNsdWRlcyB0byBub2luc3RfSEVBREVSUyB3aGVyZSB0aGV5IGJlbG9uZy4KKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdmZpci5jOiAoZGVpbnRlcmxhY2VfbGluZV9jKSwKKwkgIChkZWludGVybGFjZV9saW5lX21teCk6CisJICBGaXggQyBhbmQgTU1YIGltcGxlbWVudGF0aW9ucyBhIGJpdCBtb3JlLgorCisyMDA4LTA2LTI0IDA5OjEwOjQ2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwOS81Nl0gZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5LmM6IEZpeCB0aGUgQyBpbXBsZW1lbnRhdGlvbiB0byBwcm9kdWNlIGNvcnJlY3QgcmVzdWx0cyBhbmQgb3B0aW1pemUgdGhlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5LmM6CisJICAoZGVpbnRlcmxhY2VfZ3JlZWR5X3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgIChkZWludGVybGFjZV9ncmVlZHlfcGFja2VkNDIyX3NjYW5saW5lX21teGV4dCksCisJICAoZGVpbnRlcmxhY2VfZ3JlZWR5X3BhY2tlZDQyMl9zY2FubGluZSk6CisJICBGaXggdGhlIEMgaW1wbGVtZW50YXRpb24gdG8gcHJvZHVjZSBjb3JyZWN0IHJlc3VsdHMgYW5kIG9wdGltaXplIHRoZQorCSAgTU1YRVhUIGltcGxlbWVudGF0aW9uLgorCSAgSGFuZGxlIG9kZCB3aWR0aHMgYW5kIGRvbid0IHJlYWQgb3ZlciBhcnJheSBib3VuZGFyaWVzIGluIHRoZSBNTVhFWFQKKwkgIGltcGxlbWVudGF0aW9uLgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS92ZmlyLmM6IChkZWludGVybGFjZV9saW5lX2MpLAorCSAgKGRlaW50ZXJsYWNlX2xpbmVfbW14KSwgKGRlaW50ZXJsYWNlX3NjYW5saW5lX3ZmaXIpOgorCSAgRml4IGEgc21hbGwgcm91bmRpbmcgYnVnIGluIHRoZSBNTVggaW1wbGVtZW50YXRpb24sIHRoZSBNTVgKKwkgIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgYWN0dWFsbHkgbmVlZCBNTVhFWFQgaW5zdHJ1Y3Rpb25zIHNvIGRvbid0IG1hcmsKKwkgIGl0IGFzIHN1Y2guCisJICBIYW5kbGUgb2RkIHdpZHRocyBpbiBib3RoIGltcGxlbWVudGF0aW9ucy4KKworMjAwOC0wNi0yMSAwOTowNTowMCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMDgvNTZdIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeS5jOiBJbXBsZW1lbnQgYSBDIHZlcnNpb24gb2YgdGhlIGdyZWVkeSBsb3cgbW90aW9uIGFsZ29yaXRobSBhbmQgbWFyayB0aGUgYXNzZW1ibHkgb3B0aS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeS5jOgorCSAgKGRlaW50ZXJsYWNlX2dyZWVkeV9wYWNrZWQ0MjJfc2NhbmxpbmVfc3NlKSwKKwkgIChkZWludGVybGFjZV9ncmVlZHlfcGFja2VkNDIyX3NjYW5saW5lX2MpLAorCSAgKGRlaW50ZXJsYWNlX2dyZWVkeV9wYWNrZWQ0MjJfc2NhbmxpbmUpOgorCSAgSW1wbGVtZW50IGEgQyB2ZXJzaW9uIG9mIHRoZSBncmVlZHkgbG93IG1vdGlvbiBhbGdvcml0aG0gYW5kIG1hcmsgdGhlCisJICBhc3NlbWJseSBvcHRpbWl6ZWQgdmVyc2lvbiBhcyBTU0UgYXMgaXQgdXNlcyBTU0UgaW5zdHJ1Y3Rpb25zCisJICBhZGRpdGlvbmFsIHRvIE1NWCBpbnN0cnVjdGlvbnMuCisKKzIwMDgtMDYtMjAgMTQ6NDg6NDAgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDA3LzU2XSBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS92ZmlyLmM6IE1ha2UgaXQgcG9zc2libGUgdG8gdXNlIHRoZSB2ZmlyIG1ldGhvZCBvbiBYODYgQ1BVcyB3aXRob3V0IE1NWEVYVCB0b28gYnV0IHVzZSB0aGUgTU0uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS92ZmlyLmM6IChkZWludGVybGFjZV9saW5lX21teGV4dCksCisJICAoZGVpbnRlcmxhY2VfbGluZV9jKSwgKGRlaW50ZXJsYWNlX3NjYW5saW5lX3ZmaXIpOgorCSAgTWFrZSBpdCBwb3NzaWJsZSB0byB1c2UgdGhlIHZmaXIgbWV0aG9kIG9uIFg4NiBDUFVzIHdpdGhvdXQgTU1YRVhUIHRvbworCSAgYnV0IHVzZSB0aGUgTU1YRVhUIG9wdGltaXplZCBjb2RlIHdoZW5ldmVyIHBvc3NpYmxlLgorCisyMDA4LTA2LTIwIDE0OjM1OjI1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNi81Nl0gZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuKjogUmVzZXQgZWxlbWVudCBzdGF0ZSBvbiBQQVVTRUQtPlJFQURZIHByb3Blcmx5LCBkb24ndCBsZWFrIGFueSBidWZmZXJzIHdoZW4gZmluYWxpLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2UyX2NsYXNzX2luaXQpLCAoZ3N0X2RlaW50ZXJsYWNlMl9pbml0KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3Jlc2V0X2hpc3RvcnkpLCAoZ3N0X2RlaW50ZXJsYWNlMl9yZXNldCksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9maW5hbGl6ZSksIChnc3RfZGVpbnRlcmxhY2UyX2NoYWluKSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3NpbmtfZXZlbnQpLCAoZ3N0X2RlaW50ZXJsYWNlMl9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9kZWludGVybGFjZTJfc3JjX3F1ZXJ5KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuaDoKKwkgIFJlc2V0IGVsZW1lbnQgc3RhdGUgb24gUEFVU0VELT5SRUFEWSBwcm9wZXJseSwgZG9uJ3QgbGVhayBhbnkgYnVmZmVycworCSAgd2hlbiBmaW5hbGl6aW5nLCBhbGxvY2F0ZSBidWZmZXJzIHdpdGggZ3N0X3BhZF9hbGxvY19idWZmZXIoKSBhbmQKKwkgIHByb3Blcmx5IHJldHVybiBmbG93IHJldHVybnMgZnJvbSBnc3RfcGFkX3B1c2goKSBpbnN0ZWFkIG9mIGlnbm9yaW5nIHRoZW0uCisKKzIwMDgtMDYtMjAgMTM6NDU6MDggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDA1LzU2XSBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL3RvbXNtb2NvbXBtYWNyb3MuaDogQWRkIG1pc3NpbmcgaGVhZGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvdG9tc21vY29tcG1hY3Jvcy5oOgorCSAgQWRkIG1pc3NpbmcgaGVhZGVyLgorCisyMDA4LTA2LTIwIDEzOjI0OjI5ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNC81Nl0gRml4IGNvbXBpbGF0aW9uIG9uIGdlbmVyaWMgeDg2L2FtZDY0IGFuZCBpbmNsdWRlIGRlaW50ZXJsYWNlMiBpbiB0aGUgYnVpbGQgc3lzdGVtLiBCZWNhdXNlIG9mIHNldmVyYWwgYnVncyBpdCdzIHN0aWxsLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHloLmFzbToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wQm90dG9tLmluYzoKKwkgIEZpeCBjb21waWxhdGlvbiBvbiBnZW5lcmljIHg4Ni9hbWQ2NCBhbmQgaW5jbHVkZSBkZWludGVybGFjZTIgaW4gdGhlCisJICBidWlsZCBzeXN0ZW0uIEJlY2F1c2Ugb2Ygc2V2ZXJhbCBidWdzIGl0J3Mgc3RpbGwgZW5hYmxlZCBvbmx5CisJICBieSAtLWVuYWJsZS1leHBlcmltZW50YWwuCisKKzIwMDgtMDYtMTggMDY6MzE6MTMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgW01PVkVEIEZST00gQkFEIDAzLzU2XSBGaXggZ3RrLWRvYyB3YXJuaW5ncy4gQWxzbyBkb24ndCBtaXN1c2UgYXBpLWRvYyBjb21tZW50cyBmb3Igbm9ybWFsIGNvbW1lbnRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGV4YW1wbGVzL2FwcC9hcHBzcmMtcmEuYzoKKwkgICogZXhhbXBsZXMvYXBwL2FwcHNyYy1zZWVrYWJsZS5jOgorCSAgKiBleGFtcGxlcy9hcHAvYXBwc3JjLXN0cmVhbS5jOgorCSAgKiBleGFtcGxlcy9hcHAvYXBwc3JjLXN0cmVhbTIuYzoKKwkgICogZXh0L2RpcmVjdGZiL2RmYnZpZGVvc2luay5oOgorCSAgKiBleHQvbWV0YWRhdGEvZ3N0YmFzZW1ldGFkYXRhLmM6CisJICAqIGV4dC9tZXRhZGF0YS9nc3RiYXNlbWV0YWRhdGEuaDoKKwkgICogZXh0L21ldGFkYXRhL21ldGFkYXRhLmM6CisJICAqIGV4dC9tZXRhZGF0YS9tZXRhZGF0YWV4aWYuYzoKKwkgICogZXh0L3RoZW9yYS90aGVvcmFkZWMuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvc3BlZWR5LmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3NwZWVkeS5oOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS92ZmlyLmM6CisJICBGaXggZ3RrLWRvYyB3YXJuaW5ncy4gQWxzbyBkb24ndCBtaXN1c2UgYXBpLWRvYyBjb21tZW50cyBmb3Igbm9ybWFsCisJICBjb21tZW50cy4KKworMjAwOC0wNi0xMSAxMToxMjo0OSArMDAwMCAgTWFydGluIEVpa2VybWFubiA8bWVpa2VyQHVwYi5kZT4KKworCSAgW01PVkVEIEZST00gQkFEIDAyLzU2XSBnc3QvZGVpbnRlcmxhY2UyLzogQWRkIGEgZGVpbnRlcmxhY2VyIHBsdWdpbiBiYXNlZCBvbiB0aGUgdHZ0aW1lL0RTY2FsZXIgZGVpbnRlcmxhY2VyLCB3aGljaCB3YXMgcmVsaWNlbnNlZCB0byBMR1BMIGYuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gYSBwYXRjaCBieTogTWFydGluIEVpa2VybWFubiA8bWVpa2VyIGF0IHVwYiBkb3QgZGU+CisJICAqIGdzdC9kZWludGVybGFjZTIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmM6CisJICAoZ3N0X2RlaW50ZXJsYWNlMl9tZXRob2RfZ2V0X3R5cGUpLAorCSAgKGdzdF9kZWludGVybGFjZTJfZmllbGRzX2dldF90eXBlKSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX2ZpZWxkX2xheW91dF9nZXRfdHlwZSksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9iYXNlX2luaXQpLCAoZ3N0X2RlaW50ZXJsYWNlMl9jbGFzc19pbml0KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX2luaXQpLCAoZ3N0X2RlaW50ZXJsYWNlMl9zZXRfbWV0aG9kKSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3NldF9wcm9wZXJ0eSksIChnc3RfZGVpbnRlcmxhY2UyX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9maW5hbGl6ZSksIChnc3RfZGVpbnRlcmxhY2UyX3BvcF9oaXN0b3J5KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX2hlYWRfaGlzdG9yeSksIChnc3RfZGVpbnRlcmxhY2UyX3B1c2hfaGlzdG9yeSksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9kZWludGVybGFjZV9zY2FubGluZXMpLCAoZ3N0X2RlaW50ZXJsYWNlMl9jaGFpbiksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9zZXRjYXBzKSwgKGdzdF9kZWludGVybGFjZTJfc2lua19ldmVudCksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X2RlaW50ZXJsYWNlMl9zcmNfZXZlbnQpLAorCSAgKGdzdF9kZWludGVybGFjZTJfc3JjX3F1ZXJ5KSwgKGdzdF9kZWludGVybGFjZTJfc3JjX3F1ZXJ5X3R5cGVzKSwKKwkgIChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmg6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeS5jOiAoY29weV9zY2FubGluZSksCisJICAoZGVpbnRlcmxhY2VfZ3JlZWR5X3BhY2tlZDQyMl9zY2FubGluZV9tbXhleHQpLAorCSAgKGRzY2FsZXJfZ3JlZWR5bF9nZXRfbWV0aG9kKToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aC5hc206CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeWguYzoKKwkgIChkZWludGVybGFjZV9mcmFtZV9kaV9ncmVlZHloKSwgKGRzY2FsZXJfZ3JlZWR5aF9nZXRfbWV0aG9kKSwKKwkgIChncmVlZHloX2luaXQpLCAoZ3JlZWR5aF9maWx0ZXJfbW14KSwgKGdyZWVkeWhfZmlsdGVyXzNkbm93KSwKKwkgIChncmVlZHloX2ZpbHRlcl9zc2UpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHloLmg6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeWhtYWNyb3MuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvbW14Lmg6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3BsdWdpbnMuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvc3BlZWR0b29scy5oOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9zcGVlZHkuYzogKG11bHRpcGx5X2FscGhhKSwgKGNsaXAyNTUpLAorCSAgKGNvbWJfZmFjdG9yX3BhY2tlZDQyMl9zY2FubGluZV9tbXgpLAorCSAgKGRpZmZfZmFjdG9yX3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgIChkaWZmX2ZhY3Rvcl9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14KSwKKwkgIChkaWZmX3BhY2tlZDQyMl9ibG9jazh4OF9tbXgpLCAoZGlmZl9wYWNrZWQ0MjJfYmxvY2s4eDhfYyksCisJICAocGFja2VkNDQ0X3RvX3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgIChwYWNrZWQ0MjJfdG9fcGFja2VkNDQ0X3NjYW5saW5lX2MpLAorCSAgKHBhY2tlZDQyMl90b19wYWNrZWQ0NDRfcmVjNjAxX3NjYW5saW5lX2MpLAorCSAgKHZmaWx0ZXJfY2hyb21hXzEyMV9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14KSwKKwkgICh2ZmlsdGVyX2Nocm9tYV8xMjFfcGFja2VkNDIyX3NjYW5saW5lX2MpLAorCSAgKHZmaWx0ZXJfY2hyb21hXzMzMl9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14KSwKKwkgICh2ZmlsdGVyX2Nocm9tYV8zMzJfcGFja2VkNDIyX3NjYW5saW5lX2MpLAorCSAgKGtpbGxfY2hyb21hX3BhY2tlZDQyMl9pbnBsYWNlX3NjYW5saW5lX21teCksCisJICAoa2lsbF9jaHJvbWFfcGFja2VkNDIyX2lucGxhY2Vfc2NhbmxpbmVfYyksCisJICAoaW52ZXJ0X2NvbG91cl9wYWNrZWQ0MjJfaW5wbGFjZV9zY2FubGluZV9tbXgpLAorCSAgKGludmVydF9jb2xvdXJfcGFja2VkNDIyX2lucGxhY2Vfc2NhbmxpbmVfYyksCisJICAobWlycm9yX3BhY2tlZDQyMl9pbnBsYWNlX3NjYW5saW5lX2MpLAorCSAgKGludGVycG9sYXRlX3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgIChjb252ZXJ0X3V5dnlfdG9feXV5dl9zY2FubGluZV9tbXgpLAorCSAgKGNvbnZlcnRfdXl2eV90b195dXl2X3NjYW5saW5lX2MpLAorCSAgKGludGVycG9sYXRlX3BhY2tlZDQyMl9zY2FubGluZV9tbXgpLAorCSAgKGludGVycG9sYXRlX3BhY2tlZDQyMl9zY2FubGluZV9tbXhleHQpLAorCSAgKGJsaXRfY29sb3VyX3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgIChibGl0X2NvbG91cl9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14KSwKKwkgIChibGl0X2NvbG91cl9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14ZXh0KSwKKwkgIChibGl0X2NvbG91cl9wYWNrZWQ0NDQ0X3NjYW5saW5lX2MpLAorCSAgKGJsaXRfY29sb3VyX3BhY2tlZDQ0NDRfc2NhbmxpbmVfbW14KSwKKwkgIChibGl0X2NvbG91cl9wYWNrZWQ0NDQ0X3NjYW5saW5lX21teGV4dCksIChzbWFsbF9tZW1jcHkpLAorCSAgKHNwZWVkeV9tZW1jcHlfYyksIChzcGVlZHlfbWVtY3B5X21teCksIChzcGVlZHlfbWVtY3B5X21teGV4dCksCisJICAoYmxpdF9wYWNrZWQ0MjJfc2NhbmxpbmVfYyksIChibGl0X3BhY2tlZDQyMl9zY2FubGluZV9tbXgpLAorCSAgKGJsaXRfcGFja2VkNDIyX3NjYW5saW5lX21teGV4dCksCisJICAoY29tcG9zaXRlX2NvbG91cjQ0NDRfYWxwaGFfdG9fcGFja2VkNDIyX3NjYW5saW5lX2MpLAorCSAgKGNvbXBvc2l0ZV9jb2xvdXI0NDQ0X2FscGhhX3RvX3BhY2tlZDQyMl9zY2FubGluZV9tbXhleHQpLAorCSAgKGNvbXBvc2l0ZV9wYWNrZWQ0NDQ0X2FscGhhX3RvX3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgIChjb21wb3NpdGVfcGFja2VkNDQ0NF9hbHBoYV90b19wYWNrZWQ0MjJfc2NhbmxpbmVfbW14ZXh0KSwKKwkgIChjb21wb3NpdGVfcGFja2VkNDQ0NF90b19wYWNrZWQ0MjJfc2NhbmxpbmVfYyksCisJICAoY29tcG9zaXRlX3BhY2tlZDQ0NDRfdG9fcGFja2VkNDIyX3NjYW5saW5lX21teGV4dCksCisJICAoY29tcG9zaXRlX2FscGhhbWFza190b19wYWNrZWQ0NDQ0X3NjYW5saW5lX2MpLAorCSAgKGNvbXBvc2l0ZV9hbHBoYW1hc2tfdG9fcGFja2VkNDQ0NF9zY2FubGluZV9tbXhleHQpLAorCSAgKGNvbXBvc2l0ZV9hbHBoYW1hc2tfYWxwaGFfdG9fcGFja2VkNDQ0NF9zY2FubGluZV9jKSwKKwkgIChwcmVtdWx0aXBseV9wYWNrZWQ0NDQ0X3NjYW5saW5lX2MpLAorCSAgKHByZW11bHRpcGx5X3BhY2tlZDQ0NDRfc2NhbmxpbmVfbW14ZXh0KSwKKwkgIChibGVuZF9wYWNrZWQ0MjJfc2NhbmxpbmVfYyksIChibGVuZF9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14ZXh0KSwKKwkgIChxdWFydGVyX2JsaXRfdmVydGljYWxfcGFja2VkNDIyX3NjYW5saW5lX21teGV4dCksCisJICAocXVhcnRlcl9ibGl0X3ZlcnRpY2FsX3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgIChzdWJwaXhfYmxpdF92ZXJ0aWNhbF9wYWNrZWQ0MjJfc2NhbmxpbmVfYyksCisJICAoYThfc3VicGl4X2JsaXRfc2NhbmxpbmVfYyksIChteXJvdW5kKSwgKGluaXRfUkdCX3RvX1lDYkNyX3RhYmxlcyksCisJICAoaW5pdF9ZQ2JDcl90b19SR0JfdGFibGVzKSwgKHJnYjI0X3RvX3BhY2tlZDQ0NF9yZWM2MDFfc2NhbmxpbmVfYyksCisJICAocmdiYTMyX3RvX3BhY2tlZDQ0NDRfcmVjNjAxX3NjYW5saW5lX2MpLAorCSAgKHBhY2tlZDQ0NF90b19yZ2IyNF9yZWM2MDFfc2NhbmxpbmVfYyksCisJICAocGFja2VkNDQ0X3RvX25vbnByZW11bHRpcGxpZWRfcGFja2VkNDQ0NF9zY2FubGluZV9jKSwKKwkgIChhc3BlY3RfYWRqdXN0X3BhY2tlZDQ0NDRfc2NhbmxpbmVfYyksIChzZXR1cF9zcGVlZHlfY2FsbHMpLAorCSAgKHNwZWVkeV9nZXRfYWNjZWwpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9zcGVlZHkuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvc3NlLmg6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAuYzogKEZpZWxkY29weSksCisJICAoZGVpbnRlcmxhY2VfZnJhbWVfZGlfdG9tc21vY29tcCksIChkc2NhbGVyX3RvbXNtb2NvbXBfZ2V0X21ldGhvZCksCisJICAodG9tc21vY29tcF9pbml0KSwgKHRvbXNtb2NvbXBfZmlsdGVyX21teCksCisJICAodG9tc21vY29tcF9maWx0ZXJfM2Rub3cpLCAodG9tc21vY29tcF9maWx0ZXJfc3NlKToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC5oOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3AwQS5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcEJvdHRvbS5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcEVkZ2VBLmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wRWRnZUE4LmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wT2RkQS5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEEyLmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wT2RkQTYuaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBSC5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEFIMi5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFRvcC5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFZBLmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wVkFILmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9TdHJhbmdlQm9iLmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9Ub21zTW9Db21wQWxsLmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9Ub21zTW9Db21wQWxsMi5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvV2llcmRCb2IuaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS92ZmlyLmM6IChkZWludGVybGFjZV9saW5lKSwKKwkgIChkZWludGVybGFjZV9zY2FubGluZV92ZmlyKSwgKGNvcHlfc2NhbmxpbmUpLAorCSAgKGRzY2FsZXJfdmZpcl9nZXRfbWV0aG9kKToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUveDg2LTY0X21hY3Jvcy5pbmM6CisJICBBZGQgYSBkZWludGVybGFjZXIgcGx1Z2luIGJhc2VkIG9uIHRoZSB0dnRpbWUvRFNjYWxlciBkZWludGVybGFjZXIsCisJICB3aGljaCB3YXMgcmVsaWNlbnNlZCB0byBMR1BMIGZvciBHU3RyZWFtZXIgYW5kIGluIHRoZW9yeSBwcm92aWRlcworCSAgYmV0dGVyIGFuZCBmYXN0ZXIgcmVzdWx0cyB0aGFuIHRoZSBzaW1wbGUgZGVpbnRlcmxhY2UgZWxlbWVudC4KKwkgIEZpeGVzIGJ1ZyAjMTYzNTc4LgorCSAgUG9ydGVkIHRvIEdTdHJlYW1lciAwLjEwIGJ1dCBzdGlsbCBub3QgZW5hYmxlZCBvciBpbmNsdWRlZCBpbiB0aGUKKwkgIGJ1aWxkIHN5c3RlbSBieSBkZWZhdWx0IGJlY2F1c2Ugb2YgYmFkIGFydGVmYWN0cyBjYXVzZWQgYnkgYSBidWcKKwkgIHNvbWV3aGVyZSBhbmQgYXMgaXQgY2FuIGJlIG9ubHkgYnVpbGQgb24geDg2L2FtZDY0IEFUTSBhbmQgcmVxdWlyZXMKKwkgIHNwZWNpYWwgQ0ZMQUdTLiBXaWxsIGJlIGZpeGVkIHNvb24uCisKKzIwMDgtMDYtMTEgMTE6MTI6MTQgKzAwMDAgIE1hcnRpbiBFaWtlcm1hbm4gPG1laWtlckB1cGIuZGU+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMS81Nl0gZ3N0L2RlaW50ZXJsYWNlMi86IEFkZCBhIGRlaW50ZXJsYWNlciBwbHVnaW4gYmFzZWQgb24gdGhlIHR2dGltZS9EU2NhbGVyIGRlaW50ZXJsYWNlciwgd2hpY2ggd2FzIHJlbGljZW5zZWQgdG8gTEdQTCBmLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEJhc2VkIG9uIGEgcGF0Y2ggYnk6IE1hcnRpbiBFaWtlcm1hbm4gPG1laWtlciBhdCB1cGIgZG90IGRlPgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOgorCSAgKGdzdF9kZWludGVybGFjZTJfbWV0aG9kX2dldF90eXBlKSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX2ZpZWxkc19nZXRfdHlwZSksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9maWVsZF9sYXlvdXRfZ2V0X3R5cGUpLAorCSAgKGdzdF9kZWludGVybGFjZTJfYmFzZV9pbml0KSwgKGdzdF9kZWludGVybGFjZTJfY2xhc3NfaW5pdCksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9pbml0KSwgKGdzdF9kZWludGVybGFjZTJfc2V0X21ldGhvZCksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9zZXRfcHJvcGVydHkpLCAoZ3N0X2RlaW50ZXJsYWNlMl9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9kZWludGVybGFjZTJfZmluYWxpemUpLCAoZ3N0X2RlaW50ZXJsYWNlMl9wb3BfaGlzdG9yeSksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9oZWFkX2hpc3RvcnkpLCAoZ3N0X2RlaW50ZXJsYWNlMl9wdXNoX2hpc3RvcnkpLAorCSAgKGdzdF9kZWludGVybGFjZTJfZGVpbnRlcmxhY2Vfc2NhbmxpbmVzKSwgKGdzdF9kZWludGVybGFjZTJfY2hhaW4pLAorCSAgKGdzdF9kZWludGVybGFjZTJfc2V0Y2FwcyksIChnc3RfZGVpbnRlcmxhY2UyX3NpbmtfZXZlbnQpLAorCSAgKGdzdF9kZWludGVybGFjZTJfY2hhbmdlX3N0YXRlKSwgKGdzdF9kZWludGVybGFjZTJfc3JjX2V2ZW50KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3NyY19xdWVyeSksIChnc3RfZGVpbnRlcmxhY2UyX3NyY19xdWVyeV90eXBlcyksCisJICAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5oOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHkuYzogKGNvcHlfc2NhbmxpbmUpLAorCSAgKGRlaW50ZXJsYWNlX2dyZWVkeV9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14ZXh0KSwKKwkgIChkc2NhbGVyX2dyZWVkeWxfZ2V0X21ldGhvZCk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeWguYXNtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHloLmM6CisJICAoZGVpbnRlcmxhY2VfZnJhbWVfZGlfZ3JlZWR5aCksIChkc2NhbGVyX2dyZWVkeWhfZ2V0X21ldGhvZCksCisJICAoZ3JlZWR5aF9pbml0KSwgKGdyZWVkeWhfZmlsdGVyX21teCksIChncmVlZHloX2ZpbHRlcl8zZG5vdyksCisJICAoZ3JlZWR5aF9maWx0ZXJfc3NlKToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aC5oOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHlobWFjcm9zLmg6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL21teC5oOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9wbHVnaW5zLmg6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3NwZWVkdG9vbHMuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvc3BlZWR5LmM6IChtdWx0aXBseV9hbHBoYSksIChjbGlwMjU1KSwKKwkgIChjb21iX2ZhY3Rvcl9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14KSwKKwkgIChkaWZmX2ZhY3Rvcl9wYWNrZWQ0MjJfc2NhbmxpbmVfYyksCisJICAoZGlmZl9mYWN0b3JfcGFja2VkNDIyX3NjYW5saW5lX21teCksCisJICAoZGlmZl9wYWNrZWQ0MjJfYmxvY2s4eDhfbW14KSwgKGRpZmZfcGFja2VkNDIyX2Jsb2NrOHg4X2MpLAorCSAgKHBhY2tlZDQ0NF90b19wYWNrZWQ0MjJfc2NhbmxpbmVfYyksCisJICAocGFja2VkNDIyX3RvX3BhY2tlZDQ0NF9zY2FubGluZV9jKSwKKwkgIChwYWNrZWQ0MjJfdG9fcGFja2VkNDQ0X3JlYzYwMV9zY2FubGluZV9jKSwKKwkgICh2ZmlsdGVyX2Nocm9tYV8xMjFfcGFja2VkNDIyX3NjYW5saW5lX21teCksCisJICAodmZpbHRlcl9jaHJvbWFfMTIxX3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgICh2ZmlsdGVyX2Nocm9tYV8zMzJfcGFja2VkNDIyX3NjYW5saW5lX21teCksCisJICAodmZpbHRlcl9jaHJvbWFfMzMyX3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgIChraWxsX2Nocm9tYV9wYWNrZWQ0MjJfaW5wbGFjZV9zY2FubGluZV9tbXgpLAorCSAgKGtpbGxfY2hyb21hX3BhY2tlZDQyMl9pbnBsYWNlX3NjYW5saW5lX2MpLAorCSAgKGludmVydF9jb2xvdXJfcGFja2VkNDIyX2lucGxhY2Vfc2NhbmxpbmVfbW14KSwKKwkgIChpbnZlcnRfY29sb3VyX3BhY2tlZDQyMl9pbnBsYWNlX3NjYW5saW5lX2MpLAorCSAgKG1pcnJvcl9wYWNrZWQ0MjJfaW5wbGFjZV9zY2FubGluZV9jKSwKKwkgIChpbnRlcnBvbGF0ZV9wYWNrZWQ0MjJfc2NhbmxpbmVfYyksCisJICAoY29udmVydF91eXZ5X3RvX3l1eXZfc2NhbmxpbmVfbW14KSwKKwkgIChjb252ZXJ0X3V5dnlfdG9feXV5dl9zY2FubGluZV9jKSwKKwkgIChpbnRlcnBvbGF0ZV9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14KSwKKwkgIChpbnRlcnBvbGF0ZV9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14ZXh0KSwKKwkgIChibGl0X2NvbG91cl9wYWNrZWQ0MjJfc2NhbmxpbmVfYyksCisJICAoYmxpdF9jb2xvdXJfcGFja2VkNDIyX3NjYW5saW5lX21teCksCisJICAoYmxpdF9jb2xvdXJfcGFja2VkNDIyX3NjYW5saW5lX21teGV4dCksCisJICAoYmxpdF9jb2xvdXJfcGFja2VkNDQ0NF9zY2FubGluZV9jKSwKKwkgIChibGl0X2NvbG91cl9wYWNrZWQ0NDQ0X3NjYW5saW5lX21teCksCisJICAoYmxpdF9jb2xvdXJfcGFja2VkNDQ0NF9zY2FubGluZV9tbXhleHQpLCAoc21hbGxfbWVtY3B5KSwKKwkgIChzcGVlZHlfbWVtY3B5X2MpLCAoc3BlZWR5X21lbWNweV9tbXgpLCAoc3BlZWR5X21lbWNweV9tbXhleHQpLAorCSAgKGJsaXRfcGFja2VkNDIyX3NjYW5saW5lX2MpLCAoYmxpdF9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14KSwKKwkgIChibGl0X3BhY2tlZDQyMl9zY2FubGluZV9tbXhleHQpLAorCSAgKGNvbXBvc2l0ZV9jb2xvdXI0NDQ0X2FscGhhX3RvX3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgIChjb21wb3NpdGVfY29sb3VyNDQ0NF9hbHBoYV90b19wYWNrZWQ0MjJfc2NhbmxpbmVfbW14ZXh0KSwKKwkgIChjb21wb3NpdGVfcGFja2VkNDQ0NF9hbHBoYV90b19wYWNrZWQ0MjJfc2NhbmxpbmVfYyksCisJICAoY29tcG9zaXRlX3BhY2tlZDQ0NDRfYWxwaGFfdG9fcGFja2VkNDIyX3NjYW5saW5lX21teGV4dCksCisJICAoY29tcG9zaXRlX3BhY2tlZDQ0NDRfdG9fcGFja2VkNDIyX3NjYW5saW5lX2MpLAorCSAgKGNvbXBvc2l0ZV9wYWNrZWQ0NDQ0X3RvX3BhY2tlZDQyMl9zY2FubGluZV9tbXhleHQpLAorCSAgKGNvbXBvc2l0ZV9hbHBoYW1hc2tfdG9fcGFja2VkNDQ0NF9zY2FubGluZV9jKSwKKwkgIChjb21wb3NpdGVfYWxwaGFtYXNrX3RvX3BhY2tlZDQ0NDRfc2NhbmxpbmVfbW14ZXh0KSwKKwkgIChjb21wb3NpdGVfYWxwaGFtYXNrX2FscGhhX3RvX3BhY2tlZDQ0NDRfc2NhbmxpbmVfYyksCisJICAocHJlbXVsdGlwbHlfcGFja2VkNDQ0NF9zY2FubGluZV9jKSwKKwkgIChwcmVtdWx0aXBseV9wYWNrZWQ0NDQ0X3NjYW5saW5lX21teGV4dCksCisJICAoYmxlbmRfcGFja2VkNDIyX3NjYW5saW5lX2MpLCAoYmxlbmRfcGFja2VkNDIyX3NjYW5saW5lX21teGV4dCksCisJICAocXVhcnRlcl9ibGl0X3ZlcnRpY2FsX3BhY2tlZDQyMl9zY2FubGluZV9tbXhleHQpLAorCSAgKHF1YXJ0ZXJfYmxpdF92ZXJ0aWNhbF9wYWNrZWQ0MjJfc2NhbmxpbmVfYyksCisJICAoc3VicGl4X2JsaXRfdmVydGljYWxfcGFja2VkNDIyX3NjYW5saW5lX2MpLAorCSAgKGE4X3N1YnBpeF9ibGl0X3NjYW5saW5lX2MpLCAobXlyb3VuZCksIChpbml0X1JHQl90b19ZQ2JDcl90YWJsZXMpLAorCSAgKGluaXRfWUNiQ3JfdG9fUkdCX3RhYmxlcyksIChyZ2IyNF90b19wYWNrZWQ0NDRfcmVjNjAxX3NjYW5saW5lX2MpLAorCSAgKHJnYmEzMl90b19wYWNrZWQ0NDQ0X3JlYzYwMV9zY2FubGluZV9jKSwKKwkgIChwYWNrZWQ0NDRfdG9fcmdiMjRfcmVjNjAxX3NjYW5saW5lX2MpLAorCSAgKHBhY2tlZDQ0NF90b19ub25wcmVtdWx0aXBsaWVkX3BhY2tlZDQ0NDRfc2NhbmxpbmVfYyksCisJICAoYXNwZWN0X2FkanVzdF9wYWNrZWQ0NDQ0X3NjYW5saW5lX2MpLCAoc2V0dXBfc3BlZWR5X2NhbGxzKSwKKwkgIChzcGVlZHlfZ2V0X2FjY2VsKToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvc3BlZWR5Lmg6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3NzZS5oOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wLmM6IChGaWVsZGNvcHkpLAorCSAgKGRlaW50ZXJsYWNlX2ZyYW1lX2RpX3RvbXNtb2NvbXApLCAoZHNjYWxlcl90b21zbW9jb21wX2dldF9tZXRob2QpLAorCSAgKHRvbXNtb2NvbXBfaW5pdCksICh0b21zbW9jb21wX2ZpbHRlcl9tbXgpLAorCSAgKHRvbXNtb2NvbXBfZmlsdGVyXzNkbm93KSwgKHRvbXNtb2NvbXBfZmlsdGVyX3NzZSk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wMEEuaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BCb3R0b20uaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BFZGdlQS5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcEVkZ2VBOC5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEEuaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBMi5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEE2LmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wT2RkQUguaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBSDIuaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BUb3AuaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BWQS5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFZBSC5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU3RyYW5nZUJvYi5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvVG9tc01vQ29tcEFsbC5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvVG9tc01vQ29tcEFsbDIuaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1dpZXJkQm9iLmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdmZpci5jOiAoZGVpbnRlcmxhY2VfbGluZSksCisJICAoZGVpbnRlcmxhY2Vfc2NhbmxpbmVfdmZpciksIChjb3B5X3NjYW5saW5lKSwKKwkgIChkc2NhbGVyX3ZmaXJfZ2V0X21ldGhvZCk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3g4Ni02NF9tYWNyb3MuaW5jOgorCSAgQWRkIGEgZGVpbnRlcmxhY2VyIHBsdWdpbiBiYXNlZCBvbiB0aGUgdHZ0aW1lL0RTY2FsZXIgZGVpbnRlcmxhY2VyLAorCSAgd2hpY2ggd2FzIHJlbGljZW5zZWQgdG8gTEdQTCBmb3IgR1N0cmVhbWVyIGFuZCBpbiB0aGVvcnkgcHJvdmlkZXMKKwkgIGJldHRlciBhbmQgZmFzdGVyIHJlc3VsdHMgdGhhbiB0aGUgc2ltcGxlIGRlaW50ZXJsYWNlIGVsZW1lbnQuCisJICBGaXhlcyBidWcgIzE2MzU3OC4KKwkgIFBvcnRlZCB0byBHU3RyZWFtZXIgMC4xMCBidXQgc3RpbGwgbm90IGVuYWJsZWQgb3IgaW5jbHVkZWQgaW4gdGhlCisJICBidWlsZCBzeXN0ZW0gYnkgZGVmYXVsdCBiZWNhdXNlIG9mIGJhZCBhcnRlZmFjdHMgY2F1c2VkIGJ5IGEgYnVnCisJICBzb21ld2hlcmUgYW5kIGFzIGl0IGNhbiBiZSBvbmx5IGJ1aWxkIG9uIHg4Ni9hbWQ2NCBBVE0gYW5kIHJlcXVpcmVzCisJICBzcGVjaWFsIENGTEFHUy4gV2lsbCBiZSBmaXhlZCBzb29uLgorCisyMDA5LTA1LTEzIDEwOjMwOjM1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgZmx2OiBBY3R1YWxseSBhZGQgdGhlIGZsdiBwbHVnaW4gdG8gY29uZmlndXJlLmFjCisKKzIwMDktMDUtMTMgMDk6MjQ6MjYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvZmxhY2RlYy5jOgorCSAgY2hlY2tzOiBmaXggZmxhY2RlYyB1bml0IHRlc3RzIG9uIGJpZy1lbmRpYW4gbWFjaGluZXMgYW5kIHVuZGVyIHZhbGdyaW5kCisJICBGbGFjZGVjIG91dHB1dHMgMTYtYml0IHNhbXBsZXMsIHNvIGxldCdzIGNoZWNrIGlmIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QKKwkgIHNhbXBsZSBpcyB3aGF0IHdlIGV4cGVjdCByYXRoZXIgdGhhbiBqdXN0IHRoZSBmaXJzdCBieXRlLCB3aGljaCBtYXkgYmUKKwkgIGRpZmZlcmVudCBmcm9tIHdoYXQgd2UgZXhwZWN0IGRlcGVuZGluZyBvbiB0aGUgaG9zdCdzIGVuZGlhbm5lc3MuIEZpeGVzCisJICB0aGUgZmxhY2RlYyB1bml0IHRlc3RzIG9uIFBQQy4gQWxzbyBmaXggYSBidW5jaCBvZiBsZWFrcyBpbiB0aGUgdW5pdAorCSAgdGVzdHMgdG8gbWFrZSB2YWxncmluZCBoYXBweS4gRml4ZXMgIzU4MjQyMC4KKworMjAwOS0wNS0xMyAwOToxODowNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGZsYWNkZWM6IGZpeCBidWZmZXIgbGVhaworCSAgZ3N0X2J1ZmZlcl9yZXBsYWNlKCkgd2lsbCB0YWtlIGl0cyBvd24gcmVmLCBzbyB3ZSBzdGlsbCBoYXZlCisJICB0byB1bnJlZiB0aGUgYnVmZmVyIGlmIHdlIGRvbid0IG5lZWQgaXQgYW55IGxvbmdlci4KKworMjAwOS0wNS0xMiAyMToyMDowNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBGaXggcG9pbnRlciBhcml0aG1ldGljCisJICBUaGlzIGZpeGVzIGEgc2Vla2luZyByZWdyZXNzaW9uLCBidWcgIzEzNDUyMi4KKworMjAwOS0wNS0xMiAyMTozNjozMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSAgTW92ZWQgJ2ZsdicgZnJvbSAtYmFkIHRvIC1nb29kCisKKzIwMDktMDUtMDcgMTc6NTM6NDIgKzAxMDAgIENocmlzdGlhbiBTY2hhbGxlciA8Y2hyaXN0aWFuLnNjaGFsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgW01PVkVEIEZST00gQkFEIDU3LzU3XSBBZGQgcmFua3MgdG8gdmFyaW91cyBtdXhlcnMgYW5kIGVuY29kZXJzIGluIC1iYWQKKworMjAwOS0wNC0yOSAxODo1MjoyMCArMDEwMCAgVHJpc3RhbiBNYXR0aGV3cyA8bGUuYnVzaW5lc3NtYW5AZ21haWwuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgW01PVkVEIEZST00gQkFEIDU2LzU3XSBmbHZtdXg6IGluaXQgdmFyaWFibGUgdG8gTlVMTCB0byBmaXggY29tcGlsZXIgd2FybmluZworCSAgRml4ZXMgIzU4MDc4Ni4KKworMjAwOS0wNC0yOSAxMzo1NjowNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgNTUvNTddIGZsdjogU2V0L3JlcXVpcmUgdGhlIGZyYW1lZC9wYXJzZWQgZmllbGRzIG9mIHRoZSBhdWRpby9tcGVnIGNhcHMgdG8gVFJVRQorCisyMDA5LTA0LTI5IDEzOjE2OjI1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA1NC81N10gZmx2OiBBbHdheXMgd3JpdGUgYXQgbGVhc3QgdGhlIG1pbmltYWwgdGFncyBhbmQgd3JpdGUgdGhlIFBBUiBhcyB0YWdzCisKKzIwMDktMDQtMjkgMTM6MDM6NDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA1My81N10gZmx2OiBBZGQgc3VwcG9ydCBmb3IgbXV4aW5nIHNvbWUgdGFncworCisyMDA5LTA0LTI5IDEzOjAzOjI3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOgorCSAgW01PVkVEIEZST00gQkFEIDUyLzU3XSBmbHY6IEFkZCBzdXBwb3J0IGZvciB0aXRsZSB0YWcKKworMjAwOS0wNC0yOSAwOTo0MDo0MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA1MS81N10gZmx2OiBGaXggcGFyc2luZyBvZiB0YWdzIGFuZCBhZGQgbmV3IG1hcHBpbmdzCisJICBXZSBzaG91bGRuJ3QgcmVnaXN0ZXIgYSBuZXcgR3N0VGFnIGZvciBldmVyeSB1bmtub3duIHRhZworCSAgd2UgZmluZCBhcyB0aGlzIG1pZ2h0IGxlYWQgdG8gY29uZmxpY3RzIGFuZCBhbHNvIHRob3NlCisJICB0YWdzIGFyZSBlc3NlbnRpYWxseSB1bmtub3duLgorCSAgQWRkIG1hcHBpbmdzIGZvciBzb21lIGtub3duIHRhZ3MgYW5kIGFsc28gY29udmVydCBzdHJpbmcKKwkgIGRhdGVzIHRvIEdEYXRlLCBhcyBmb3VuZCBpbiBtYW55IEZMViBmaWxlcy4KKworMjAwOS0wNC0yMiAxOTo1MjowNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5oOgorCSAgW01PVkVEIEZST00gQkFEIDUwLzU3XSBmbHY6IEFkZCBkb2N1bWVudGF0aW9uIHRvIGZsdm11eCBhbmQgZmx2ZGVtdXgKKwkgIFBhcnRpYWxseSBmaXhlcyBidWcgIzU3MzczNy4KKworMjAwOS0wMS0yMiAxMzozOTozNCArMDEwMCAgSmFuIFVyYmFuc2tpIDxqLnVyYmFuc2tpQHN0dWRlbnRzLm1pbXV3LmVkdS5wbD4KKworCSogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOgorCSAgW01PVkVEIEZST00gQkFEIDQ5LzU3XSBBZGQgc3VwcG9ydCBmb3IgRUNNQSBhcnJheXMgaW4gc2NyaXB0IHRhZ3MuIEZpeGVzIGJ1ZyAjNTY3OTY1LgorCSAgQWRkIHN1cHBvcnQgZm9yIEVDTUEgYXJyYXlzIGluIHNjcmlwdCB0YWdzLiBUaGlzIGZpeGVzCisJICBzZWVraW5nIG9uIHNvbWUgZmlsZXMgdGhhdCBoYXZlIHRoZSBzZWVrIHRhYmxlIHN0b3JlZAorCSAgaW5zaWRlIGFuIEVDTUEgYXJyYXkgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIGFycmF5LgorCisyMDA4LTEyLTAzIDExOjQzOjAwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCA0OC81N10gZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiBDaGVjayBpZiBzdHJpbmdzIGFyZSB2YWxpZCBVVEY4IGJlZm9yZSB1c2luZyB0aGVtLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogKEZMVl9HRVRfU1RSSU5HKToKKwkgIENoZWNrIGlmIHN0cmluZ3MgYXJlIHZhbGlkIFVURjggYmVmb3JlIHVzaW5nIHRoZW0uCisKKzIwMDgtMTEtMjQgMTE6MTc6MTkgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgNDcvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogRml4IG5vbiBrZXkgdW5pdCBzZWVraW5nIGJ5IGFsd2F5cyBnb2luZyB0byB0aGUgcHJldmlvdXMga2V5ZnJhbWUuIE1hcmsgdGhlIGRpc2NvbnQgZmxhZyB3aGVuIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA4LTExLTI0ICBKdWxpZW4gTW91dHRlICA8anVsaWVuQGZsdWVuZG8uY29tPgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X2ZpbmRfb2Zmc2V0KSwKKwkgIChnc3RfZmx2X2RlbXV4X2hhbmRsZV9zZWVrX3B1c2gpLAorCSAgKGdzdF9mbHZfZGVtdXhfaGFuZGxlX3NlZWtfcHVsbCk6CisJICBGaXggbm9uIGtleSB1bml0IHNlZWtpbmcgYnkgYWx3YXlzIGdvaW5nIHRvIHRoZSBwcmV2aW91cworCSAga2V5ZnJhbWUuIE1hcmsKKwkgIHRoZSBkaXNjb250IGZsYWcgd2hlbiB3ZSd2ZSBtb3ZlZCBpbiB0aGUgZmlsZS4KKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoZ3N0X2Zsdl9wYXJzZV9hdWRpb19uZWdvdGlhdGUpOiBNUDMKKwkgIHN0cmVhbXMKKwkgIGFyZSBwYXJzZWQgYWxyZWFkeSwgbWFrZXMgYXV0b3BsdWdnZWQgcGlwZWxpbmVzIHNob3J0ZXIuCisKKzIwMDgtMTEtMDQgMTI6NDI6MzAgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgW01PVkVEIEZST00gQkFEIDQ2LzU3XSBEb24ndCBpbnN0YWxsIHN0YXRpYyBsaWJzIGZvciBwbHVnaW5zLiBGaXhlcyAjNTUwODUxIGZvciAtYmFkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9hbHNhc3BkaWYvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hbXJ3Yi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2FwZXhzaW5rL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXJ0cy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2FydHNkL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXVkaW9maWxlL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXVkaW9yZXNhbXBsZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2J6Mi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2NkYXVkaW8vTWFrZWZpbGUuYW06CisJICAqIGV4dC9jZWx0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvZGMxMzk0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvZGlyYWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kaXJlY3RmYi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2RpdngvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kdHMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9mYWFjL01ha2VmaWxlLmFtOgorCSAgKiBleHQvZmFhZC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2dzbS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2hlcm1lcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2l2b3JiaXMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9qYWNrL01ha2VmaWxlLmFtOgorCSAgKiBleHQvanAyay9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xhZHNwYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xjcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xpYmZhbWUvTWFrZWZpbGUuYW06CisJICAqIGV4dC9saWJtbXMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9tZXRhZGF0YS9NYWtlZmlsZS5hbToKKwkgICogZXh0L21wZWcyZW5jL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXBsZXgvTWFrZWZpbGUuYW06CisJICAqIGV4dC9tdXNlcGFjay9NYWtlZmlsZS5hbToKKwkgICogZXh0L211c2ljYnJhaW56L01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXl0aHR2L01ha2VmaWxlLmFtOgorCSAgKiBleHQvbmFzL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbmVvbi9NYWtlZmlsZS5hbToKKwkgICogZXh0L29mYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3BvbHlwL01ha2VmaWxlLmFtOgorCSAgKiBleHQvcmVzaW5kdmQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zZGwvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zaG91dC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NuYXBzaG90L01ha2VmaWxlLmFtOgorCSAgKiBleHQvc25kZmlsZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NvdW5kdG91Y2gvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zcGMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zd2ZkZWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC90YXJraW4vTWFrZWZpbGUuYW06CisJICAqIGV4dC90aGVvcmEvTWFrZWZpbGUuYW06CisJICAqIGV4dC90aW1pZGl0eS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3R3b2xhbWUvTWFrZWZpbGUuYW06CisJICAqIGV4dC94MjY0L01ha2VmaWxlLmFtOgorCSAgKiBleHQveGluZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3h2aWQvTWFrZWZpbGUuYW06CisJICAqIGdzdC1saWJzL2dzdC9hcHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC1saWJzL2dzdC9kc2hvdy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2FpZmZwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2FwcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvYnVmZmVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYmF5ZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9jZHhhcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9jaGFydC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2NvbG9yc3BhY2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kY2NwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWludGVybGFjZTIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kdmRzcHUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9mZXN0aXZhbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ZpbHRlci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ZsYWNwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2dhbWVzL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvaDI2NHBhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbGlicmZiL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbWl4bWF0cml4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbW9kcGx1Zy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21wZWcxc3lzL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZzR2aWRlb3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ2RlbXV4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ3RzbXV4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ3ZpZGVvcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tdmUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9uc2YvTWFrZWZpbGUuYW06CisJICAqIGdzdC9udXZkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L292ZXJsYXkvTWFrZWZpbGUuYW06CisJICAqIGdzdC9wYXNzdGhyb3VnaC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3BjYXBwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3BsYXlvbmRlbWFuZC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3Jhd3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcmVhbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0anBlZy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zY2FsZXRlbXBvL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc2RwL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc2VsZWN0b3IvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zbW9vdGgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zbW9vdGh3YXZlL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3BlZWQvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zcGVleHJlc2FtcGxlL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3RlcmVvL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3ViZW5jL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdHRhL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmJpZGVjL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9kcm9wL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9zaWduYWwvTWFrZWZpbGUuYW06CisJICAqIGdzdC92aXJ0dWFsZHViL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvdm1uYy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3k0bS9NYWtlZmlsZS5hbToKKwkgICogc3lzL2FjbWVuYy9NYWtlZmlsZS5hbToKKwkgICogc3lzL2Nkcm9tL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHNob3dkZWN3cmFwcGVyL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHNob3dzcmN3cmFwcGVyL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHZiL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHhyMy9NYWtlZmlsZS5hbToKKwkgICogc3lzL2ZiZGV2L01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3NzNC9NYWtlZmlsZS5hbToKKwkgICogc3lzL3FjYW0vTWFrZWZpbGUuYW06CisJICAqIHN5cy9xdHdyYXBwZXIvTWFrZWZpbGUuYW06CisJICAqIHN5cy92Y2QvTWFrZWZpbGUuYW06CisJICAqIHN5cy93aW5pbmV0L01ha2VmaWxlLmFtOgorCSAgKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBEb24ndCBpbnN0YWxsIHN0YXRpYyBsaWJzIGZvciBwbHVnaW5zLiBGaXhlcyAjNTUwODUxIGZvciAtYmFkLgorCisyMDA4LTEwLTI4IDE4OjQ0OjQ0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCA0NS81N10gZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiBJbXBsZW1lbnQgcG9zaXRpb24gcXVlcnkgaW4gdGltZSBmb3JtYXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiAoZ3N0X2Zsdl9kZW11eF9xdWVyeSk6CisJICBJbXBsZW1lbnQgcG9zaXRpb24gcXVlcnkgaW4gdGltZSBmb3JtYXQuCisKKzIwMDgtMTAtMjggMTg6NDE6MTkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDQ0LzU3XSBnc3QvZmx2LzogUHV0IHRoZSBHc3RTZWdtZW50IGRpcmVjdGx5IGludG8gdGhlIGluc3RhbmNlIHN0cnVjdCBpbnN0ZWFkIG9mIGFsbG9jYXRpbmcgYW5kIGZyZWUnaW5nIGl0IGFnYWluLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogKGdzdF9mbHZfZGVtdXhfY2xlYW51cCksCisJICAoZ3N0X2Zsdl9kZW11eF9sb29wKSwgKGdzdF9mbHZfZGVtdXhfaGFuZGxlX3NlZWtfcHVzaCksCisJICAoZ3N0X2Zsdl9kZW11eF9oYW5kbGVfc2Vla19wdWxsKSwgKGdzdF9mbHZfZGVtdXhfc2lua19ldmVudCksCisJICAoZ3N0X2Zsdl9kZW11eF9kaXNwb3NlKSwgKGdzdF9mbHZfZGVtdXhfaW5pdCk6CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoZ3N0X2Zsdl9wYXJzZV90YWdfYXVkaW8pLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX3ZpZGVvKSwgKGdzdF9mbHZfcGFyc2VfdGFnX3RpbWVzdGFtcCk6CisJICBQdXQgdGhlIEdzdFNlZ21lbnQgZGlyZWN0bHkgaW50byB0aGUgaW5zdGFuY2Ugc3RydWN0IGluc3RlYWQgb2YKKwkgIGFsbG9jYXRpbmcgYW5kIGZyZWUnaW5nIGl0IGFnYWluLgorCSAgUHVzaCB0YWdzIGFscmVhZHkgaWYgb25seSBvbmUgcGFkIHdhcyBhZGRlZCwgbm8gbmVlZCB0byB3YWl0IGZvcgorCSAgdGhlIHNlY29uZCBvbmUuCisJICBXaGVuIGdlbmVyYXRpbmcgb3VyIGluZGV4IHNldCBoYXNfdmlkZW8gYW5kIGhhc19hdWRpbyBpZiB3ZSBmaW5kCisJICB2aWRlbyBvciBhdWRpbyBpbiBjYXNlIHRoZSBGTFYgaGVhZGVyIGhhcyBpbmNvcnJlY3QgZGF0YS4KKworMjAwOC0xMC0yNyAwOTo0NTowNCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgNDMvNTddIGdzdC9mbHYvOiBEb24ndCBtZW1jcHkoKSBhbGwgZGF0YSB3ZSB3YW50IHRvIHB1c2ggZG93bnN0cmVhbSwgaW5zdGVhZCBqdXN0IGNyZWF0ZSBzdWJidWZmZXJzIGFuZCBwdXNoIHRoZW0gZG93bnN0cmVhbS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X2NoYWluKSwKKwkgIChnc3RfZmx2X2RlbXV4X3B1bGxfdGFnKSwgKGdzdF9mbHZfZGVtdXhfcHVsbF9oZWFkZXIpLAorCSAgKGdzdF9mbHZfZGVtdXhfY3JlYXRlX2luZGV4KToKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoZ3N0X2Zsdl9wYXJzZV90YWdfc2NyaXB0KSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ19hdWRpbyksIChnc3RfZmx2X3BhcnNlX3RhZ192aWRlbyksCisJICAoZ3N0X2Zsdl9wYXJzZV90YWdfdGltZXN0YW1wKSwgKGdzdF9mbHZfcGFyc2VfdGFnX3R5cGUpLAorCSAgKGdzdF9mbHZfcGFyc2VfaGVhZGVyKToKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5oOgorCSAgRG9uJ3QgbWVtY3B5KCkgYWxsIGRhdGEgd2Ugd2FudCB0byBwdXNoIGRvd25zdHJlYW0sIGluc3RlYWQganVzdAorCSAgY3JlYXRlIHN1YmJ1ZmZlcnMgYW5kIHB1c2ggdGhlbSBkb3duc3RyZWFtLgorCSAgRml4IHNvbWUgbWlub3IgbWVtb3J5IGxlYWtzLgorCisyMDA4LTEwLTI3IDA5OjQxOjE4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCA0Mi81N10gZ3N0L2Zsdi9NYWtlZmlsZS5hbTogRml4IChub24tY3JpdGljYWwpIHN5bnRheCBlcnJvciBhbmQgYWRkIGFsbCByZXF1aXJlZCBDRkxBR1MgYW5kIExJQlMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkgIEZpeCAobm9uLWNyaXRpY2FsKSBzeW50YXggZXJyb3IgYW5kIGFkZCBhbGwgcmVxdWlyZWQgQ0ZMQUdTIGFuZCBMSUJTLgorCSAgKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6IChGTFZfR0VUX1NUUklORyksCisJICAoZ3N0X2Zsdl9wYXJzZV9tZXRhZGF0YV9pdGVtKSwgKGdzdF9mbHZfcGFyc2VfdGFnX3NjcmlwdCksCisJICAoZ3N0X2Zsdl9wYXJzZV90YWdfYXVkaW8pLCAoZ3N0X2Zsdl9wYXJzZV90YWdfdmlkZW8pLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX3RpbWVzdGFtcCksIChnc3RfZmx2X3BhcnNlX3RhZ190eXBlKToKKwkgIFJld3JpdGUgdGhlIHNjcmlwdCB0YWcgcGFyc2luZyB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgdHJ5IHRvIHJlYWQKKwkgIG1vcmUgZGF0YSB0aGFuIHdlIGhhdmUuIEFsc28gdXNlIEdTVF9SRUFEX1VJTlQyNF9CRSBkaXJlY3RseSBhbmQKKwkgIGZpeCBzb21lIG1pbm9yIG1lbW9yeSBsZWFrcy4KKwkgIFRoaXMgc2hvdWxkIG1ha2UgYWxsIGNyYXNoZXMgb24gZnV6emVkIEZMViBmaWxlcyBkaXNhcHBlYXIuCisKKzIwMDgtMTAtMjcgMDk6Mzc6MjEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDQxLzU3XSBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6IFByb3Blcmx5IGNoZWNrIGV2ZXJ5d2hlcmUgdGhhdCB3ZSBoYXZlIGVub3VnaCBkYXRhIHRvIHBhcnNlIGFuZCBkb24ndCByZWFkIG91dHNpZGUgdGhlIGFsbG9jYXQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6IChGTFZfR0VUX1NUUklORyksCisJICAoZ3N0X2Zsdl9wYXJzZV90YWdfYXVkaW8pLCAoZ3N0X2Zsdl9wYXJzZV90YWdfdmlkZW8pLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX3R5cGUpLCAoZ3N0X2Zsdl9wYXJzZV9oZWFkZXIpOgorCSAgUHJvcGVybHkgY2hlY2sgZXZlcnl3aGVyZSB0aGF0IHdlIGhhdmUgZW5vdWdoIGRhdGEgdG8gcGFyc2UgYW5kCisJICBkb24ndCByZWFkIG91dHNpZGUgdGhlIGFsbG9jYXRlZCBtZW1vcnkgcmVnaW9uLgorCisyMDA4LTEwLTI3IDA5OjM1OjM0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCA0MC81N10gZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiBJZiB0aGUgY2FwcyBjaGFuZ2UgZHVyaW5nIHBsYXliYWNrIGFuZCBuZWdvdGlhdGlvbiBmYWlscyBlcnJvciBvdXQgaW5zdGVhZCBvZiB0cnlpbmcgdG8gY29udGludWUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoZ3N0X2Zsdl9wYXJzZV90YWdfYXVkaW8pLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX3ZpZGVvKToKKwkgIElmIHRoZSBjYXBzIGNoYW5nZSBkdXJpbmcgcGxheWJhY2sgYW5kIG5lZ290aWF0aW9uIGZhaWxzIGVycm9yIG91dAorCSAgaW5zdGVhZCBvZiB0cnlpbmcgdG8gY29udGludWUuCisKKzIwMDgtMTAtMjcgMDk6MzM6NDAgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDM5LzU3XSBnc3QvZmx2LzogQWRkIHN1cHBvcnQgZm9yIFNwZWV4IGF1ZGlvIGFuZCBhbGxvdyBidWZmZXJzIHdpdGhvdXQgdmFsaWQgdGltZXN0YW1wIGluIHRoZSBtdXhlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdm11eC5jOiAoZ3N0X2Zsdl9tdXhfYXVkaW9fcGFkX3NldGNhcHMpLAorCSAgKGdzdF9mbHZfbXV4X3JlcXVlc3RfbmV3X3BhZCksIChnc3RfZmx2X211eF93cml0ZV9idWZmZXIpLAorCSAgKGdzdF9mbHZfbXV4X2NvbGxlY3RlZCk6CisJICAqIGdzdC9mbHYvZ3N0Zmx2bXV4Lmg6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogKGdzdF9mbHZfcGFyc2VfYXVkaW9fbmVnb3RpYXRlKToKKwkgIEFkZCBzdXBwb3J0IGZvciBTcGVleCBhdWRpbyBhbmQgYWxsb3cgYnVmZmVycyB3aXRob3V0IHZhbGlkCisJICB0aW1lc3RhbXAgaW4gdGhlIG11eGVyLgorCisyMDA4LTEwLTI3IDA5OjMyOjAzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAzOC81N10gZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiBEb24ndCBwb3N0IGFuIGVycm9yIG1lc3NhZ2Ugb24gdGhlIGJ1cyBpZiBzZW5kaW5nIEVPUyBkb3duc3RyZWFtIGRpZG4ndCB3b3JrLiBGaXhlcyBidWcgIzU1MDQ1NC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X2xvb3ApLAorCSAgKGdzdF9mbHZfZGVtdXhfZmluZF9vZmZzZXQpLCAoZ3N0X2Zsdl9kZW11eF9oYW5kbGVfc2Vla19wdXNoKSwKKwkgIChnc3RfZmx2X2RlbXV4X2hhbmRsZV9zZWVrX3B1bGwpOgorCSAgRG9uJ3QgcG9zdCBhbiBlcnJvciBtZXNzYWdlIG9uIHRoZSBidXMgaWYgc2VuZGluZyBFT1MgZG93bnN0cmVhbQorCSAgZGlkbid0IHdvcmsuIEZpeGVzIGJ1ZyAjNTUwNDU0LgorCSAgRml4IHNlZWsgZXZlbnQgaGFuZGxpbmcgdG8gbG9vayBhdCB0aGUgZmxhZ3Mgb2YgdGhlIHNlZWsgZXZlbnQKKwkgIGluc3RlYWQgb2YgYXNzdW1pbmcgc29tZSByYW5kb20gZmxhZ3MsIGRvbid0IHNlbmQgc2VnbWVudC1zdGFydAorCSAgbWVzc2FnZXMgd2hlbiBvcGVyYXRpbmcgaW4gcHVzaCBtb2RlIGFuZCBwdXNoIHNlZWsgZXZlbnRzIHVwc3RyZWFtCisJICBpZiB3ZSBjb3VsZG4ndCBoYW5kbGUgdGhlbS4KKworMjAwOC0xMC0yNyAwOToyNzoxOCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMzcvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogRXJyb3Igb3V0IGVhcmx5IGlmIHB1bGxpbmcgYSB0YWcgZmFpbGVkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogKGdzdF9mbHZfZGVtdXhfcHVsbF90YWcpOgorCSAgRXJyb3Igb3V0IGVhcmx5IGlmIHB1bGxpbmcgYSB0YWcgZmFpbGVkLgorCisyMDA4LTEwLTI3IDA5OjI1OjExICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAzNi81N10gZ3N0L2Zsdi86IEluIHB1bGwgbW9kZSB3ZSBjcmVhdGUgb3VyIG93biBpbmRleCBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZSBhbmQgZG9uJ3QgdXNlIHRoZSBpbmRleCBwcm92aWRlZCBieSBzb21lIGZpLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiAoZ3N0X2Zsdl9kZW11eF9jcmVhdGVfaW5kZXgpLAorCSAgKGdzdF9mbHZfZGVtdXhfbG9vcCk6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogKGdzdF9mbHZfcGFyc2VfdGFnX3NjcmlwdCksCisJICAoZ3N0X2Zsdl9wYXJzZV90YWdfYXVkaW8pLCAoZ3N0X2Zsdl9wYXJzZV90YWdfdmlkZW8pLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX3RpbWVzdGFtcCk6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuaDoKKwkgIEluIHB1bGwgbW9kZSB3ZSBjcmVhdGUgb3VyIG93biBpbmRleCBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZQorCSAgYW5kIGRvbid0IHVzZSB0aGUgaW5kZXggcHJvdmlkZWQgYnkgc29tZSBmaWxlcyAod2hpY2ggYXJlIG1vcmUgdGhhbgorCSAgb2Z0ZW4gaW5jb3JyZWN0IGFuZCBjYXVzZSBmYWlsZWQgc2Vla3MpLgorCSAgRm9yIHB1c2ggbW9kZSB3ZSBzdGlsbCB1c2UgdGhlIGluZGV4IHByb3ZpZGVkIGJ5IHRoZSBmaWxlIGFuZCBleHRlbmQgaXQKKwkgIHdoaWxlIGRvaW5nIHRoZSBwbGF5YmFjay4KKworMjAwOC0xMC0yNyAwOToyMDowMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMzUvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogSW5zdGVhZCBvZiB1c2luZyBnc3RfcGFkX2V2ZW50X2RlZmF1bHQoKSB1c2UgYSBzbWFsbCBnc3RfcGFkX3B1c2hfZXZlbnQoKSB3cmFwcGVyIHRoYXQgb25seSBkby4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogKGdzdF9mbHZfZGVtdXhfcHVzaF9zcmNfZXZlbnQpLAorCSAgKGdzdF9mbHZfZGVtdXhfbG9vcCksIChnc3RfZmx2X2RlbXV4X2hhbmRsZV9zZWVrX3B1bGwpLAorCSAgKGdzdF9mbHZfZGVtdXhfc2lua19ldmVudCk6CisJICBJbnN0ZWFkIG9mIHVzaW5nIGdzdF9wYWRfZXZlbnRfZGVmYXVsdCgpIHVzZSBhIHNtYWxsCisJICBnc3RfcGFkX3B1c2hfZXZlbnQoKSB3cmFwcGVyIHRoYXQgb25seSBkb2VzIHdoYXQgd2Ugd2FudCBhbmQgaXMgbXVjaAorCSAgbW9yZSBzaW1wbGUuCisKKzIwMDgtMTAtMjcgMDk6MTQ6NDUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDM0LzU3XSBnc3QvZmx2L2dzdGZsdmRlbXV4Lio6IElmIG91ciBpbmRleCB3YXMgY3JlYXRlZCBieSB0aGUgZWxlbWVudCBhbmQgbm90IHByb3ZpZGVkIGZyb20gdGhlIG91dHNpZGUgd2Ugc2hvdWxkIGRlc3Ryb3kgaXQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X2Zsdl9kZW11eF9zZXRfaW5kZXgpLCAoZ3N0X2Zsdl9kZW11eF9pbml0KToKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5oOgorCSAgSWYgb3VyIGluZGV4IHdhcyBjcmVhdGVkIGJ5IHRoZSBlbGVtZW50IGFuZCBub3QgcHJvdmlkZWQgZnJvbSB0aGUKKwkgIG91dHNpZGUgd2Ugc2hvdWxkIGRlc3Ryb3kgaXQgd2hlbiBzdGFydGluZyBhIG5ldyBzdHJlYW0gdG8gZ2V0CisJICBhbGwgb2xkIGVudHJpZXMgcmVtb3ZlZC4KKworMjAwOC0xMC0yNyAwOToxMjozMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMzMvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogSW1wcm92ZSBkZWJ1Z2dpbmcgYSBiaXQgd2hlbiBwdWxsaW5nIGEgYnVmZmVyIGZyb20gdXBzdHJlYW0gZmFpbHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiAoZ3N0X2Zsdl9kZW11eF9wdWxsX3JhbmdlKToKKwkgIEltcHJvdmUgZGVidWdnaW5nIGEgYml0IHdoZW4gcHVsbGluZyBhIGJ1ZmZlciBmcm9tIHVwc3RyZWFtIGZhaWxzLgorCisyMDA4LTEwLTI3IDA5OjEwOjU0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAzMi81N10gZ3N0L2Zsdi86IENsb3NlIHRoZSBjdXJyZW50bHkgcGxheWluZyBzZWdtZW50IGZyb20gdGhlIHN0cmVhbWluZyB0aHJlYWQgaW5zdGVhZCBvZiB0aGUgdGhyZWFkIHdoZXJlIHRoZSBzZWVrIGV2ZW50IGlzLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiAoZ3N0X2Zsdl9kZW11eF9jbGVhbnVwKSwKKwkgIChnc3RfZmx2X2RlbXV4X2hhbmRsZV9zZWVrX3B1bGwpLCAoZ3N0X2Zsdl9kZW11eF9kaXNwb3NlKToKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5oOgorCSAgKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6IChnc3RfZmx2X3BhcnNlX3RhZ19hdWRpbyksCisJICAoZ3N0X2Zsdl9wYXJzZV90YWdfdmlkZW8pOgorCSAgQ2xvc2UgdGhlIGN1cnJlbnRseSBwbGF5aW5nIHNlZ21lbnQgZnJvbSB0aGUgc3RyZWFtaW5nIHRocmVhZAorCSAgaW5zdGVhZCBvZiB0aGUgdGhyZWFkIHdoZXJlIHRoZSBzZWVrIGV2ZW50IGlzIGhhbmRsZWQuCisKKzIwMDgtMTAtMTYgMTU6MjE6MTUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDMxLzU3XSBnc3QvZmx2L2dzdGZsdm11eC5jOiBEb24ndCBzZXQgdmlkZW9fY29kZWMgdG8gdGhlIHZhbHVlIHRoYXQgYWN0dWFsbHkgc2hvdWxkIGdvIGludG8gYXVkaW8gY29kZWMsIG90aGVyd2lzZSB3ZSBjcmVhdGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdm11eC5jOiAoZ3N0X2Zsdl9tdXhfYXVkaW9fcGFkX3NldGNhcHMpLAorCSAgKGdzdF9mbHZfbXV4X3dyaXRlX2J1ZmZlcik6CisJICBEb24ndCBzZXQgdmlkZW9fY29kZWMgdG8gdGhlIHZhbHVlIHRoYXQgYWN0dWFsbHkgc2hvdWxkIGdvCisJICBpbnRvIGF1ZGlvIGNvZGVjLCBvdGhlcndpc2Ugd2UgY3JlYXRlIGludmFsaWQgZmlsZXMuCisJICBGaXhlcyBidWcgIzU1NjU2NC4KKworMjAwOC0xMC0xMiAxNzowODoxMCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMzAvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogRml4IHJlZ3Jlc3Npb24gb2YgaGFuZGxpbmcgZmxvdyByZXR1cm5zIGluIHB1bGwgbW9kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X3B1bGxfdGFnKSwKKwkgIChnc3RfZmx2X2RlbXV4X3B1bGxfaGVhZGVyKToKKwkgIEZpeCByZWdyZXNzaW9uIG9mIGhhbmRsaW5nIGZsb3cgcmV0dXJucyBpbiBwdWxsIG1vZGUuCisJICBGaXhlcyBidWcgIzU1NjAwMy4KKworMjAwOC0xMC0xMCAxNjozMzozNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMjkvNTddIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogVXNlIGdzdF9wYWRfYWxsb2NfYnVmZmVyX2FuZF9zZXRfY2FwcygpIHRvIG1ha2Ugc3VyZSB3ZSBnZXQgYSBidWZmZXIgd2l0aCBjYXBzIHRoYXQgd2UgY2FuIHdvci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogKGdzdF9mbHZfcGFyc2VfdGFnX2F1ZGlvKSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ192aWRlbyk6CisJICBVc2UgZ3N0X3BhZF9hbGxvY19idWZmZXJfYW5kX3NldF9jYXBzKCkgdG8gbWFrZSBzdXJlIHdlIGdldAorCSAgYSBidWZmZXIgd2l0aCBjYXBzIHRoYXQgd2UgY2FuIHdvcmsgd2l0aCAoaS5lLiB0aGUgcGFkJ3MgY2FwcykuCisJICBBZGQgbm9uLWtleWZyYW1lIHZpZGVvIGZyYW1lcyB0byB0aGUgaW5kZXggdG9vIGJ1dCB3aXRob3V0IHRoZQorCSAga2V5ZnJhbWUgZmxhZy4KKwkgIEFkZCBhdWRpbyBmcmFtZXMgdG8gdGhlIGluZGV4IG9ubHkgaWYgd2UgaGF2ZSBubyB2aWRlbyBzdHJlYW0uCisKKzIwMDgtMTAtMTAgMTY6MTU6MDkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDI4LzU3XSBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6IENyZWF0ZSBwYWRzIGZyb20gdGhlIHBhZCB0ZW1wbGF0ZXMsIHVzZSBmaXhlZCBjYXBzIG9uIHRoZW0gYW5kIG9ubHkgYWN0aXZhdGUgdGhlbSBhZnRlciB0aGUgY2EuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6IChnc3RfZmx2X3BhcnNlX3RhZ19hdWRpbyksCisJICAoZ3N0X2Zsdl9wYXJzZV90YWdfdmlkZW8pOgorCSAgQ3JlYXRlIHBhZHMgZnJvbSB0aGUgcGFkIHRlbXBsYXRlcywgdXNlIGZpeGVkIGNhcHMgb24gdGhlbQorCSAgYW5kIG9ubHkgYWN0aXZhdGUgdGhlbSBhZnRlciB0aGUgY2FwcyBhcmUgc2V0LgorCisyMDA4LTEwLTA5IDE2OjIwOjI2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAyNy81N10gZ3N0L2Zsdi86IEdldCBhbiBhcHByb3hpbWF0ZSBkdXJhdGlvbiBvZiB0aGUgZmlsZSBieSBsb29raW5nIGF0IHRoZSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgdGFnIGluIHB1bGwgbW9kZS4gSWYgd2UgZ2V0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiAoZ3N0X2Zsdl9kZW11eF9sb29wKToKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoZ3N0X2Zsdl9wYXJzZV90YWdfdGltZXN0YW1wKToKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5oOgorCSAgR2V0IGFuIGFwcHJveGltYXRlIGR1cmF0aW9uIG9mIHRoZSBmaWxlIGJ5IGxvb2tpbmcgYXQgdGhlIHRpbWVzdGFtcAorCSAgb2YgdGhlIGxhc3QgdGFnIGluIHB1bGwgbW9kZS4gSWYgd2UgZ2V0IChtYXliZSBiZXR0ZXIpIGR1cmF0aW9uIGZyb20KKwkgIG1ldGFkYXRhIGxhdGVyIHdlJ2xsIHVzZSB0aGF0IGluc3RlYWQuCisKKzIwMDgtMTAtMDkgMTU6NDM6MDIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDI2LzU3XSBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IFJlZmFjdG9yIF9wdWxsX3JhbmdlKCkgbG9naWMgd2l0aCBjaGVja3MgaW50byBhIHNlcGVyYXRlIGZ1bmN0aW9uIHRvIG1ha2UgdGhpbmdzIGEgYml0IG1vcmUgcmUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X3B1bGxfcmFuZ2UpLAorCSAgKGdzdF9mbHZfZGVtdXhfcHVsbF90YWcpLCAoZ3N0X2Zsdl9kZW11eF9wdWxsX2hlYWRlcik6CisJICBSZWZhY3RvciBfcHVsbF9yYW5nZSgpIGxvZ2ljIHdpdGggY2hlY2tzIGludG8gYSBzZXBlcmF0ZSBmdW5jdGlvbgorCSAgdG8gbWFrZSB0aGluZ3MgYSBiaXQgbW9yZSByZWFkYWJsZS4KKworMjAwOC0xMC0wOSAxNToyNjo1NiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMjUvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogVXNlIGdzdF9lbGVtZW50X2NsYXNzX3NldF9kZXRhaWxzX3NpbXBsZSgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogKGdzdF9mbHZfZGVtdXhfY2hhaW4pLAorCSAgKGdzdF9mbHZfZGVtdXhfYmFzZV9pbml0KToKKwkgIFVzZSBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUoKS4KKwkgIElmIHdlIGdldCBHU1RfRkxPV19OT1RfTElOS0VEIGluIHRoZSBwYXJzZSBsb29wIGJ1dCBhdCBsZWFzdAorCSAgb25lIG9mIHRoZSBwYWRzIGlzIGxpbmtlZCBjb250aW51ZSB0aGUgbG9vcC4KKworMjAwOC0xMC0wOSAxMDowMDo1MSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMjQvNTddIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogQ29ycmVjdCBjYXBzIGZvciB2aWRlbyBjb2RlYyBpZCA1OiBJdCdzIE9uMiBWUDYgd2l0aCBhbHBoYSBjaGFubmVsIHdoaWNoIG5lZWRzIGEgZGlmZmVyZW50IGRlYy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogKGdzdF9mbHZfcGFyc2VfYXVkaW9fbmVnb3RpYXRlKSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ19hdWRpbyksIChnc3RfZmx2X3BhcnNlX3ZpZGVvX25lZ290aWF0ZSk6CisJICBDb3JyZWN0IGNhcHMgZm9yIHZpZGVvIGNvZGVjIGlkIDU6IEl0J3MgT24yIFZQNiB3aXRoIGFscGhhIGNoYW5uZWwKKwkgIHdoaWNoIG5lZWRzIGEgZGlmZmVyZW50IGRlY29kZXIgYW5kIGhhcyBkaWZmZXJlbnQgY2Fwcy4KKwkgIEFkZCBzdXBwb3J0IGZvciBhdWRpbyBjb2RlYyBpZCAxNCwgd2hpY2ggaXMgTVAzIHdpdGggOGtIeiBzYW1wbGluZworCSAgcmF0ZS4KKwkgIEZpeCBlbmRpYW5uZXNzIGFuZCBzaWduZWRuZXNzIGZvciByYXcgYXVkaW8gY29kZWMgaWRzLgorCSAgQWRkIHN1cHBvcnQgZm9yIGFsYXcgYW5kIG11bGF3IGF1ZGlvLgorCisyMDA4LTEwLTA5IDA5OjQ4OjQ2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAyMy81N10gZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiBHbyBvdXQgb2YgdGhlIHBhcnNlIGxvb3AgYXMgc29vbiBhcyB3ZSBnZXQgYW4gZXJyb3IgaW5zdGVhZCBvZiBwYXJzaW5nIHVudGlsIHRoZSBHc3RBZGFwdGVyIGlzLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiAoZ3N0X2Zsdl9kZW11eF9jaGFpbik6CisJICBHbyBvdXQgb2YgdGhlIHBhcnNlIGxvb3AgYXMgc29vbiBhcyB3ZSBnZXQgYW4gZXJyb3IgaW5zdGVhZAorCSAgb2YgcGFyc2luZyB1bnRpbCB0aGUgR3N0QWRhcHRlciBpcyBlbXB0eS4KKwkgIEFkZCBzb21lIGV4cGxhbmF0aW9ucyBhYm91dCB0aGUgaGVhZGVyIGFuZCB0YWcgc2l6ZS4KKwkgIERvbid0IHByaW50IHN5bmNocm9uaXppbmcgbWVzc2FnZSBpZiBldmVyeXRoaW5nIGlzIGZpbmUuCisKKzIwMDgtMTAtMDkgMDk6MjY6NTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDIyLzU3XSBnc3QvZmx2LzogQWRkIGZpcnN0IHZlcnNpb24gb2YgYSBGTFYgbXV4ZXIuIFRoZSBvbmx5IG1pc3NpbmcgZmVhdHVyZSBpcyB3cml0aW5nIG9mIHN0cmVhbSBtZXRhZGF0YS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6IChnc3RfZmx2X211eF9iYXNlX2luaXQpLAorCSAgKGdzdF9mbHZfbXV4X2NsYXNzX2luaXQpLCAoZ3N0X2Zsdl9tdXhfaW5pdCksCisJICAoZ3N0X2Zsdl9tdXhfZmluYWxpemUpLCAoZ3N0X2Zsdl9tdXhfcmVzZXQpLAorCSAgKGdzdF9mbHZfbXV4X2hhbmRsZV9zcmNfZXZlbnQpLCAoZ3N0X2Zsdl9tdXhfaGFuZGxlX3NpbmtfZXZlbnQpLAorCSAgKGdzdF9mbHZfbXV4X3ZpZGVvX3BhZF9zZXRjYXBzKSwgKGdzdF9mbHZfbXV4X2F1ZGlvX3BhZF9zZXRjYXBzKSwKKwkgIChnc3RfZmx2X211eF9yZXF1ZXN0X25ld19wYWQpLCAoZ3N0X2Zsdl9tdXhfcmVsZWFzZV9wYWQpLAorCSAgKGdzdF9mbHZfbXV4X3dyaXRlX2hlYWRlciksIChnc3RfZmx2X211eF93cml0ZV9idWZmZXIpLAorCSAgKGdzdF9mbHZfbXV4X2NvbGxlY3RlZCksIChnc3RfZmx2X211eF9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvZmx2L2dzdGZsdm11eC5oOgorCSAgQWRkIGZpcnN0IHZlcnNpb24gb2YgYSBGTFYgbXV4ZXIuIFRoZSBvbmx5IG1pc3NpbmcgZmVhdHVyZSBpcyB3cml0aW5nCisJICBvZiBzdHJlYW0gbWV0YWRhdGEuCisKKzIwMDgtMDYtMTMgMjI6NDY6NDMgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgMjEvNTddIGdzdC9mbHYvOiBJbnRyb2R1Y2UgZGVtdXhpbmcgc3VwcG9ydCBmb3IgQUFDIGFuZAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA4LTA2LTE0ICBKdWxpZW4gTW91dHRlICA8anVsaWVuQGZsdWVuZG8uY29tPgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X2NsZWFudXApLAorCSAgKGdzdF9mbHZfZGVtdXhfZGlzcG9zZSk6CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoZ3N0X2Zsdl9wYXJzZV9hdWRpb19uZWdvdGlhdGUpLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX2F1ZGlvKSwgKGdzdF9mbHZfcGFyc2VfdmlkZW9fbmVnb3RpYXRlKSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ192aWRlbyk6IEludHJvZHVjZSBkZW11eGluZyBzdXBwb3J0IGZvciBBQUMKKwkgIGFuZAorCSAgSC4yNjQvQVZDIGluc2lkZSBGTFYuCisJICAqIHN5cy9kc2hvd2RlY3dyYXBwZXIvZ3N0ZHNob3dhdWRpb2RlYy5jOgorCSAgKGdzdF9kc2hvd2F1ZGlvZGVjX2luaXQpLAorCSAgKGdzdF9kc2hvd2F1ZGlvZGVjX2NoYWluKSwgKGdzdF9kc2hvd2F1ZGlvZGVjX3B1c2hfYnVmZmVyKSwKKwkgIChnc3RfZHNob3dhdWRpb2RlY19zaW5rX2V2ZW50KSwgKGdzdF9kc2hvd2F1ZGlvZGVjX3NldHVwX2dyYXBoKToKKwkgICogc3lzL2RzaG93ZGVjd3JhcHBlci9nc3Rkc2hvd2F1ZGlvZGVjLmg6CisJICAqIHN5cy9kc2hvd2RlY3dyYXBwZXIvZ3N0ZHNob3d2aWRlb2RlYy5jOgorCSAgKGdzdF9kc2hvd3ZpZGVvZGVjX2luaXQpLAorCSAgKGdzdF9kc2hvd3ZpZGVvZGVjX3NpbmtfZXZlbnQpLCAoZ3N0X2RzaG93dmlkZW9kZWNfY2hhaW4pLAorCSAgKGdzdF9kc2hvd3ZpZGVvZGVjX3B1c2hfYnVmZmVyKSwKKwkgIChnc3RfZHNob3d2aWRlb2RlY19zcmNfZ2V0Y2Fwcyk6CisJICAqIHN5cy9kc2hvd2RlY3dyYXBwZXIvZ3N0ZHNob3d2aWRlb2RlYy5oOiBMb3Qgb2YgcmFuZG9tIGZpeGVzCisJICB0byBpbXByb3ZlIHN0YWJpbGl0eSAocmVmIGNvdW50aW5nLCBzYWZldHkgY2hlY2tzLi4uKQorCisyMDA4LTA0LTI1IDA4OjA3OjM2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMjAvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogRm9yd2FyZCB1bmtub3duIHF1ZXJpZXMgdXBzdHJlYW0gaW5zdGVhZCBvZiByZXR1cm5pbmcgRkFMU0Ugb24gdGhlbS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X3F1ZXJ5KToKKwkgIEZvcndhcmQgdW5rbm93biBxdWVyaWVzIHVwc3RyZWFtIGluc3RlYWQgb2YgcmV0dXJuaW5nIEZBTFNFIG9uIHRoZW0uCisKKzIwMDgtMDQtMTEgMjM6MTk6MjEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxOS81N10gZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiBIYW5kbGUgTlVMTCByZXR1cm5zIGZyb20gRkxWX0dFVF9TVFJJTkcoKSBtb3JlIGdyYWNlZnVsbHkuIEZpeGVzIGNyYXNoIGNhdXNlZCBieSBhIHN0cmxlbiBvbiBhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoZ3N0X2Zsdl9wYXJzZV9tZXRhZGF0YV9pdGVtKSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ19zY3JpcHQpOgorCSAgSGFuZGxlIE5VTEwgcmV0dXJucyBmcm9tIEZMVl9HRVRfU1RSSU5HKCkgbW9yZSBncmFjZWZ1bGx5LiBGaXhlcworCSAgY3Jhc2ggY2F1c2VkIGJ5IGEgc3RybGVuIG9uIGEgTlVMTCBzdHJpbmcgKCM1Mjc2MjIpLgorCisyMDA3LTEyLTExIDExOjU0OjQzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgMTgvNTddIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogRG9uJ3Qgc3RyZHVwIChhbmQgdGh1cyBsZWFrKSBjb2RlYyBuYW1lIHN0cmluZ3Mgd2hlbiBwYXNzaW5nIHRoZW0gdG8gZ3N0X3RhZ19saXN0X2FkZCgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogKGdzdF9mbHZfcGFyc2VfdGFnX2F1ZGlvKSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ192aWRlbyk6CisJICBEb24ndCBzdHJkdXAgKGFuZCB0aHVzIGxlYWspIGNvZGVjIG5hbWUgc3RyaW5ncyB3aGVuIHBhc3NpbmcKKwkgIHRoZW0gdG8gZ3N0X3RhZ19saXN0X2FkZCgpLgorCisyMDA3LTEyLTA5IDE5OjM3OjUzICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMTcvNTddIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogRml4IGxpc3Qgb2Ygc3VwcG9ydGVkIGFuZCBrbm93biBjb2RlY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoZ3N0X2Zsdl9wYXJzZV90YWdfYXVkaW8pLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX3ZpZGVvKToKKwkgIEZpeCBsaXN0IG9mIHN1cHBvcnRlZCBhbmQga25vd24gY29kZWNzLgorCSAgRW1pdCB0YWcgd2l0aCB0aGUgY29kZWMgbmFtZSBzbyBpdCBnZXRzIHByb3Blcmx5IHJlcG9ydGVkIGluIHRvdGVtIGFuZAorCSAgb3RoZXIgYXBwbGljYXRpb25zLgorCisyMDA3LTExLTI1IDEwOjQ1OjA5ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMTYvNTddIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogT3V0cHV0IHNlZ21lbnQgd2l0aCBwcm9wZXIgJ3N0b3AnIHZhbHVlLCBtYWtlcyBmbHZkZW11eCAxMDAlIGNvbXBhdGlibGUgd2l0aCBnbm9ubGluLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogKGdzdF9mbHZfcGFyc2VfdGFnX2F1ZGlvKSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ192aWRlbyk6CisJICBPdXRwdXQgc2VnbWVudCB3aXRoIHByb3BlciAnc3RvcCcgdmFsdWUsIG1ha2VzIGZsdmRlbXV4IDEwMCUgY29tcGF0aWJsZQorCSAgd2l0aCBnbm9ubGluLgorCisyMDA3LTExLTEyIDE5OjIyOjI0ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMTUvNTddIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogQWRkIG1hcHBpbmcgZm9yIE5lbGx5bW9zZXIgQVNBTyBhdWRpbyBjb2RlYy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6CisJICBBZGQgbWFwcGluZyBmb3IgTmVsbHltb3NlciBBU0FPIGF1ZGlvIGNvZGVjLgorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX2F1ZGlvKSwgKGdzdF9mbHZfcGFyc2VfdGFnX3ZpZGVvKTogTWFrZSBzdXJlIHdlCisJICBhY3R1YWxseSBoYXZlIGRhdGEgdG8gcmVhZCBhdCB0aGUgZW5kIG9mIHRoZSB0YWcuIFRoaXMgYXZvaWRzIHRyeWluZworCSAgdG8gYWxsb2NhdGUgbmVnYXRpdmUgYnVmZmVycy4KKworMjAwNy0xMC0yMiAxNTo0NTo0OSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxNC81N10gZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiBEb24ndCBlbWl0IG5vLW1vcmUtcGFkcyBmb3Igc2luZ2xlIHBhZCBzY2VuYXJpb3MgYXMgdGhlIGhlYWRlciBpcyBkZWZpbml0ZWx5IG5vdCByZWxpYWJsZS4gV2UgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDctMTAtMjIgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoZ3N0X2Zsdl9wYXJzZV90YWdfYXVkaW8pLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX3ZpZGVvKSwgKGdzdF9mbHZfcGFyc2VfdGFnX3R5cGUpOiBEb24ndAorCSAgZW1pdCBuby1tb3JlLXBhZHMgZm9yIHNpbmdsZSBwYWQgc2NlbmFyaW9zIGFzIHRoZSBoZWFkZXIKKwkgIGlzIGRlZmluaXRlbHkgbm90IHJlbGlhYmxlLiBXZSBlbWl0IHRoZW0gZm9yIDIgcGFkcyBzY2VuYXJpb3MKKwkgIHRob3VnaCB0byBzcGVlZCB1cCBtZWRpYSBkaXNjb3ZlcnkuCisKKzIwMDctMDktMjcgMTA6MDY6MjMgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgMTMvNTddIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogSSBnb3QgaXQgd3JvbmcgYWdhaW4sIGF1ZGlvIHJhdGUgd2FzIG5vdCBkZXRlY3RlZCBjb3JyZWN0bHkgaW4gYWxsIGNhc2VzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA3LTA5LTI3ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogKGdzdF9mbHZfcGFyc2VfdGFnX2F1ZGlvKSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ192aWRlbyk6IEkgZ290IGl0IHdyb25nIGFnYWluLCBhdWRpbyByYXRlCisJICB3YXMgbm90IGRldGVjdGVkIGNvcnJlY3RseSBpbiBhbGwgY2FzZXMuCisKKzIwMDctMDktMjYgMTY6MzA6NTAgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgMTIvNTddIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogY29kZWNfZGF0YSBpcyBuZWVkZWQgZm9yIGV2ZXJ5IHRhZyBub3QganVzdCB0aGUgZmlyc3Qgb25lLiAoRml4IGEgc3R1cGlkIGJ1ZyBpIGludHJvZHVjZWQgd2l0aC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA3LTA5LTI2ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogKGdzdF9mbHZfcGFyc2VfdGFnX2F1ZGlvKSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ192aWRlbyk6IGNvZGVjX2RhdGEgaXMgbmVlZGVkIGZvciBldmVyeSB0YWcKKwkgIG5vdCBqdXN0IHRoZSBmaXJzdCBvbmUuIChGaXggYSBzdHVwaWQgYnVnIGkgaW50cm9kdWNlZCB3aXRob3V0CisJICB0ZXN0aW5nKQorCisyMDA3LTA5LTI2IDExOjE3OjA4ICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgW01PVkVEIEZST00gQkFEIDExLzU3XSBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6IEZpeCBiaXQgbWFza3Mgb3BlcmF0aW9ucyB0byBiZSBzdXJlIHdlIGRldGVjdCB0aGUgY29kZWNfdGFncyBhbmQgc2FtcGxlIHJhdGVzIGNvcnJlY3RseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNy0wOS0yNiAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6IChnc3RfZmx2X3BhcnNlX3RhZ19hdWRpbyksCisJICAoZ3N0X2Zsdl9wYXJzZV90YWdfdmlkZW8pOiBGaXggYml0IG1hc2tzIG9wZXJhdGlvbnMgdG8gYmUKKwkgIHN1cmUgd2UgZGV0ZWN0IHRoZSBjb2RlY190YWdzIGFuZCBzYW1wbGUgcmF0ZXMgY29ycmVjdGx5LgorCSAgRml4IHJhdyBhdWRpbyBjYXBzIGdlbmVyYXRpb24uCisKKzIwMDctMDktMTIgMDg6Mzg6MjIgKzAwMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMTAvNTddIGdzdC86IFByaW50ZiBmb3JtYXQgZml4ZXMgKCM0NzYxMjgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUGV0ZXIgS2plbGxlcnN0ZWR0ICA8cGtqIGF0IGF4aXMgY29tPgorCSAgKiBnc3QtbGlicy9nc3QvYXBwL2dzdGFwcHNpbmsuYzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6CisJICAqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOgorCSAgKiBnc3Qvc3dpdGNoL2dzdHN3aXRjaC5jOgorCSAgUHJpbnRmIGZvcm1hdCBmaXhlcyAoIzQ3NjEyOCkuCisKKzIwMDctMDgtMjcgMTQ6NTY6MDUgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgMDkvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogTWFrZSBzdXJlIHdlIGluaXRpYWxpemUgdGhlIHNlZWsgcmVzdWx0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA3LTA4LTI3ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogKGdzdF9mbHZfZGVtdXhfaGFuZGxlX3NlZWtfcHVsbCk6CisJICBNYWtlIHN1cmUgd2UgaW5pdGlhbGl6ZSB0aGUgc2VlayByZXN1bHQuCisKKzIwMDctMDgtMjQgMTc6MDM6MTUgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgMDgvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogUmVtb3ZlIHNvbWUgdXNlbGVzcyBpZmRlZi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNy0wOC0yNCAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X2ZsdXNoKSwKKwkgIChnc3RfZmx2X2RlbXV4X2NoYWluKSwgKGdzdF9mbHZfZGVtdXhfcHVsbF90YWcpLAorCSAgKGdzdF9mbHZfZGVtdXhfZmluZF9vZmZzZXQpLCAoZ3N0X2Zsdl9kZW11eF9oYW5kbGVfc2Vla19wdXNoKSwKKwkgIChnc3RfZmx2X2RlbXV4X2hhbmRsZV9zZWVrX3B1bGwpLCAoZ3N0X2Zsdl9kZW11eF9zaW5rX2V2ZW50KSwKKwkgIChnc3RfZmx2X2RlbXV4X3NyY19ldmVudCk6IFJlbW92ZSBzb21lIHVzZWxlc3MgaWZkZWYuCisKKzIwMDctMDgtMjQgMTU6MzE6MjYgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgMDcvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogSW1wbGVtZW50IHNlZWtpbmcgaW4gcHVzaCBtb2RlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA3LTA4LTI0ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogKGdzdF9mbHZfZGVtdXhfZmx1c2gpLAorCSAgKGdzdF9mbHZfZGVtdXhfY2xlYW51cCksIChnc3RfZmx2X2RlbXV4X2NoYWluKSwKKwkgIChnc3RfZmx2X2RlbXV4X3B1bGxfdGFnKSwgKGdzdF9mbHZfZGVtdXhfZmluZF9vZmZzZXQpLAorCSAgKGdzdF9mbHZfZGVtdXhfaGFuZGxlX3NlZWtfcHVzaCksCisJICAoZ3N0X2Zsdl9kZW11eF9oYW5kbGVfc2Vla19wdWxsKSwKKwkgIChnc3RfZmx2X2RlbXV4X3NpbmtfZXZlbnQpLCAoZ3N0X2Zsdl9kZW11eF9zcmNfZXZlbnQpOiBJbXBsZW1lbnQKKwkgIHNlZWtpbmcgaW4gcHVzaCBtb2RlLgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4Lmg6CisKKzIwMDctMDgtMjIgMTQ6NTA6NTEgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgMDYvNTddIGdzdC9mbHYvOiBIYW5kbGUgcGl4ZWwgYXNwZWN0IHJhdGlvIHRocm91Z2ggbWV0YWRhdGEgdGFncyBsaWtlIEFTRiBkb2VzLiBGbHVlbmRvIG11eGVyIHN1cHBvcnRzIHRoaXMgYW5kCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDctMDgtMjIgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiAoZ3N0X2Zsdl9kZW11eF9jbGVhbnVwKSwKKwkgIChnc3RfZmx2X2RlbXV4X3B1bGxfdGFnKToKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5oOgorCSAgKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6IChnc3RfZmx2X3BhcnNlX21ldGFkYXRhX2l0ZW0pLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX3NjcmlwdCksIChnc3RfZmx2X3BhcnNlX3RhZ19hdWRpbyksCisJICAoZ3N0X2Zsdl9wYXJzZV90YWdfdmlkZW8pOiBIYW5kbGUgcGl4ZWwgYXNwZWN0IHJhdGlvIHRocm91Z2gKKwkgIG1ldGFkYXRhIHRhZ3MgbGlrZSBBU0YgZG9lcy4gRmx1ZW5kbyBtdXhlciBzdXBwb3J0cyB0aGlzIGFuZAorCSAgRmxhc2ggcGxheWVycyBjYW4gc3VwcG9ydCBpdCBhcyB3ZWxsIHRoaXMgd2F5LgorCisyMDA3LTA4LTIyIDE0OjAzOjQyICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgW01PVkVEIEZST00gQkFEIDA1LzU3XSBnc3QvZmx2LzogTWFrZSBzdXJlIHdlIGRvbid0IHRyeSBmaWxsaW5nIHVwIHRoZSBpbmRleCBpZiBubyB0aW1lcyBvYmplY3Qgd2FzIHBhcnNlZC4gRml4IHRoZSB3YXkgd2UgZGVjaWRlIHRvIHB1c2ggdGEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNy0wOC0yMiAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X3B1bGxfdGFnKToKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoZ3N0X2Zsdl9wYXJzZV9tZXRhZGF0YV9pdGVtKSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ19zY3JpcHQpLCAoZ3N0X2Zsdl9wYXJzZV90YWdfYXVkaW8pLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX3ZpZGVvKTogTWFrZSBzdXJlIHdlIGRvbid0IHRyeSBmaWxsaW5nIHVwIHRoZQorCSAgaW5kZXggaWYgbm8gdGltZXMgb2JqZWN0IHdhcyBwYXJzZWQuIEZpeCB0aGUgd2F5IHdlIGRlY2lkZSB0bworCSAgcHVzaAorCSAgdGFncyBhbmQgZW1pdCBuby1tb3JlLXBhZHMuIEZpeCBzb21lIHByaW50ZiB0eXBpbmcgaW4gZGVidWdnaW5nLgorCisyMDA3LTA4LTE0IDE0OjU2OjIwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMDQvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogRml4IGxvY2tpbmcgYW5kIHJlZmNvdW50aW5nIG9uIHRoZSBpbmRleC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X3NldF9pbmRleCksCisJICAoZ3N0X2Zsdl9kZW11eF9nZXRfaW5kZXgpOgorCSAgRml4IGxvY2tpbmcgYW5kIHJlZmNvdW50aW5nIG9uIHRoZSBpbmRleC4KKworMjAwNy0wOC0xNCAxNDoyMjowOSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMy81N10gZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiBGaXJzdCBtZXRob2QgZm9yIHNlZWtpbmcgaW4gcHVsbCBtb2RlIHVzaW5nIHRoZSBpbmRleCBidWlsdCBzdGVwIGJ5IHN0ZXAgb3IgY29taW5nIGZyb20gbWV0YWRhdGEuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDctMDgtMTQgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiAoZ3N0X2Zsdl9kZW11eF9jbGVhbnVwKSwKKwkgIChnc3RfZmx2X2RlbXV4X2FkYXB0ZXJfZmx1c2gpLCAoZ3N0X2Zsdl9kZW11eF9jaGFpbiksCisJICAoZ3N0X2Zsdl9kZW11eF9wdWxsX3RhZyksIChnc3RfZmx2X2RlbXV4X2RvX3NlZWspLAorCSAgKGdzdF9mbHZfZGVtdXhfaGFuZGxlX3NlZWspLCAoZ3N0X2Zsdl9kZW11eF9zaW5rX2V2ZW50KSwKKwkgIChnc3RfZmx2X2RlbXV4X3NyY19ldmVudCksIChnc3RfZmx2X2RlbXV4X3F1ZXJ5KSwKKwkgIChnc3RfZmx2X2RlbXV4X2NoYW5nZV9zdGF0ZSksIChnc3RfZmx2X2RlbXV4X3NldF9pbmRleCksCisJICAoZ3N0X2Zsdl9kZW11eF9nZXRfaW5kZXgpLCAoZ3N0X2Zsdl9kZW11eF9kaXNwb3NlKSwKKwkgIChnc3RfZmx2X2RlbXV4X2NsYXNzX2luaXQpOiBGaXJzdCBtZXRob2QgZm9yIHNlZWtpbmcgaW4gcHVsbAorCSAgbW9kZSB1c2luZyB0aGUgaW5kZXggYnVpbHQgc3RlcCBieSBzdGVwIG9yIGNvbWluZyBmcm9tIG1ldGFkYXRhLgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4Lmg6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogKEZMVl9HRVRfU1RSSU5HKSwKKwkgIChnc3RfZmx2X3BhcnNlX21ldGFkYXRhX2l0ZW0pLCAoZ3N0X2Zsdl9wYXJzZV90YWdfc2NyaXB0KSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ19hdWRpbyksIChnc3RfZmx2X3BhcnNlX3RhZ192aWRlbyk6IFBhcnNlCisJICBtb3JlIG1ldGFkYXRhIHR5cGVzIGFuZCBrZXlmcmFtZXMgaW5kZXguCisKKzIwMDctMDctMjUgMTM6Mjk6MDQgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgMDIvNTddIGdzdC9mbHYvOiBIYW5kbGUgbm90IGxpbmtlZCBwYWRzLCB0cnkgdG8gbWFrZSBpdCByZXVzYWJsZSwgbW9yZSBzYWZldHkgY2hlY2tzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA3LTA3LTI1ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAoZ3N0X2Zsdl9kZW11eF9jaGFpbiksIChnc3RfZmx2X2RlbXV4X3B1bGxfdGFnKSwKKwkgIChnc3RfZmx2X2RlbXV4X2NoYW5nZV9zdGF0ZSksIChnc3RfZmx2X2RlbXV4X2Rpc3Bvc2UpLAorCSAgKGdzdF9mbHZfZGVtdXhfaW5pdCk6CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoRkxWX0dFVF9TVFJJTkcpLAorCSAgKGdzdF9mbHZfcGFyc2VfbWV0YWRhdGFfaXRlbSksIChnc3RfZmx2X3BhcnNlX3RhZ19zY3JpcHQpLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX2F1ZGlvKSwgKGdzdF9mbHZfcGFyc2VfdGFnX3ZpZGVvKSwKKwkgIChnc3RfZmx2X3BhcnNlX2hlYWRlcik6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuaDogSGFuZGxlIG5vdCBsaW5rZWQgcGFkcywgdHJ5IHRvIG1ha2UgaXQKKwkgIHJldXNhYmxlLCBtb3JlIHNhZmV0eSBjaGVja3MuCisKKzIwMDctMDctMTkgMTU6MDU6MzAgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgMDEvNTddIEFkZHMgYSBmaXJzdCBkcmFmdCBvZiBhbiBGTFYgZGVtdXhlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNy0wNy0xOSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9mbHYvTWFrZWZpbGUuYW06CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogKGdzdF9mbHZfZGVtdXhfZmx1c2gpLAorCSAgKGdzdF9mbHZfZGVtdXhfY2xlYW51cCksIChnc3RfZmx2X2RlbXV4X2NoYWluKSwKKwkgIChnc3RfZmx2X2RlbXV4X3B1bGxfdGFnKSwgKGdzdF9mbHZfZGVtdXhfcHVsbF9oZWFkZXIpLAorCSAgKGdzdF9mbHZfZGVtdXhfc2Vla190b19wcmV2X2tleWZyYW1lKSwgKGdzdF9mbHZfZGVtdXhfbG9vcCksCisJICAoZ3N0X2Zsdl9kZW11eF9zaW5rX2FjdGl2YXRlKSwKKwkgIChnc3RfZmx2X2RlbXV4X3NpbmtfYWN0aXZhdGVfcHVzaCksCisJICAoZ3N0X2Zsdl9kZW11eF9zaW5rX2FjdGl2YXRlX3B1bGwpLCAoZ3N0X2Zsdl9kZW11eF9zaW5rX2V2ZW50KSwKKwkgIChnc3RfZmx2X2RlbXV4X2NoYW5nZV9zdGF0ZSksIChnc3RfZmx2X2RlbXV4X2Rpc3Bvc2UpLAorCSAgKGdzdF9mbHZfZGVtdXhfYmFzZV9pbml0KSwgKGdzdF9mbHZfZGVtdXhfY2xhc3NfaW5pdCksCisJICAoZ3N0X2Zsdl9kZW11eF9pbml0KSwgKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5oOgorCSAgKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6IChGTFZfR0VUX0JFVUkyNCksIChGTFZfR0VUX1NUUklORyksCisJICAoZ3N0X2Zsdl9kZW11eF9xdWVyeV90eXBlcyksIChnc3RfZmx2X2RlbXV4X3F1ZXJ5KSwKKwkgIChnc3RfZmx2X3BhcnNlX21ldGFkYXRhX2l0ZW0pLCAoZ3N0X2Zsdl9wYXJzZV90YWdfc2NyaXB0KSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ19hdWRpbyksIChnc3RfZmx2X3BhcnNlX3RhZ192aWRlbyksCisJICAoZ3N0X2Zsdl9wYXJzZV90YWdfdHlwZSksIChnc3RfZmx2X3BhcnNlX2hlYWRlcik6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuaDogQWRkcyBhIGZpcnN0IGRyYWZ0IG9mIGFuIEZMViBkZW11eGVyLgorCSAgSXQgZG9lcyBub3QgZG8gc2Vla2luZyB5ZXQsIGl0IHN1cHBvcnRzIHB1bGwgYW5kIHB1c2ggbW9kZSBzbworCSAgWUVTCisJICB5b3UgY2FuIHVzZSBpdCB0byBwbGF5IHlvdXR1YmUgdmlkZW9zIGRpcmVjdGx5IGZyb20gYW4gSFRUUCB1cmkuCisJICBOb3Qgc28gbXVjaCB0ZXN0aW5nIGRvbmUgeWV0IGJ1dCBpdCBwYXJzZXMgbWV0YWRhdGEsIHJlcGx5IHRvCisJICBkdXJhdGlvbiBxdWVyaWVzLCBldGMuLi4KKworMjAwOS0wNS0xMiAxMzowMDo0NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICBydHA6IExpbmsgdG8gLWxtCisJICBGaXhlcyBidWcgIzU4MjI4MS4KKworMjAwOS0wNS0xMiAxMToxNjo0OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzoKKwkgIHJnYW5hbHlzaXM6IFJlbW92ZSBpbnZhbGlkIHVuaXQgdGVzdAorCSAgVGhlIHRlc3QgY3JlYXRlcyBidWZmZXJzIHdpdGggbm9uLXNpbGVuY2UsIHNldHMgdGhlIEdBUAorCSAgZmxhZyBvbiBpdCBhbmQgZXhwZWN0cyByZ2FuYWx5c2lzIHRvIGlnbm9yZSB0aGUgY29udGVudCBhbmQgYXNzdW1lIHNpbGVuY2UuCisJICBUaGF0J3Mgbm90IHRoZSB3YXkgaG93IEdBUCBidWZmZXJzIHNob3VsZCBiZSB1c2VkLCBpZiB0aGUgR0FQIGZsYWcgaXMgc2V0CisJICBlbGVtZW50cyAqY2FuKiBhc3N1bWUgdGhhdCB0aGV5IG9ubHkgY29udGFpbiBzaWxlbmNlIGJ1dCB0aGV5J3JlIG5vdCAqcmVxdWlyZWQqCisJICB0byBhc3N1bWUgdGhhdC4gVGhlIEdBUCBmbGFnIG11c3Qgb25seSBiZSBzZXQgb24gc2lsZW5jZSBidWZmZXJzLgorCSAgRml4ZXMgYnVnICM1ODIyNTIuCisKKzIwMDktMDUtMTIgMDA6NDg6NDkgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogQ2hhbmdlTG9nOgorCSogY29uZmlndXJlLmFjOgorCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIDAuMTAuMTQuMiBwcmUtcmVsZWFzZQorCisyMDA5LTA1LTExIDIzOjEzOjIwICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIHRlc3RzL2ZpbGVzL01ha2VmaWxlLmFtOgorCSAgY2hlY2tzOiBkaXN0IGlkMy01Nzc0NjgtdW5zeW5jZWQtdGFnLnRhZyB0ZXN0IGZpbGUKKworMjAwOS0wNS0xMSAyMTowMjoyNyArMDIwMCAgVHJpc3RhbiBNYXR0aGV3cyA8bGUuYnVzaW5lc3NtYW4gYXQgZ21haWwuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogaW5pdGlhbGl6ZSB2YXJpYWJsZSB0byAwCisJICBGaXhlcyAjNTgyMjE4LgorCisyMDA5LTA1LTExIDE4OjIxOjEzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBPbmx5IHNlYXJjaCBmb3IgdGhlIGluZGV4IGVudHJ5IG9uY2UKKworMjAwOS0wNS0xMSAxODoxODozNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogVXNlIHRoZSBmaXJzdCBpbmRleCBlbnRyeSBpZiBpdCdzIGFmdGVyIHRoZSBzZWVrIHBvc2l0aW9uCisKKzIwMDktMDUtMTEgMTg6MTU6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogVXNlIHRoZSBmaXJzdCBlbnRyeSBmb3IgYSBnaXZlbiBzdHJlYW0gaWYgdGhlIGZpcnN0IGVudHJ5IGlzIGFmdGVyIHRoZSBzZWVrIHBvc2l0aW9uCisKKzIwMDktMDUtMTEgMTY6NTA6NDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogVXNlIGJpbmFyeSBzZWFyY2ggZm9yIGZpbmRpbmcgdGhlIHJlcXVlc3RlZCBpbmRleCBlbnRyeSB3aGVuIHNlZWtpbmcKKworMjAwOS0wNS0xMSAxNTozNjo0NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgbWF0cm9za2FkZW11eDogSW1wcm92ZS9vcHRpbWl6ZSBzZWVraW5nCisJICBGaXJzdCBvZiBhbGwgYSBrZXlmcmFtZSBzZWVrIHNob3VsZCBiZSBkb25lIHRvIHRoZQorCSAga2V5ZnJhbWUgcmlnaHQgYmVmb3JlIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gYW5kIG5vdAorCSAgdG8gdGhlIGtleWZyYW1lIHRoYXQgaXMgbmVhcmVzdCB0byB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uLgorCSAgVXNlIHBlciB0cmFjayBpbmRleCBhcnJheXMgYW5kIHVzZSBvdXIgbmV3IGJpbmFyeSBzZWFyY2ggZnVuY3Rpb24KKwkgIGZyb20gY29yZSB0byBzcGVlZCB1cCB0aGUgc2VhcmNoLgorCisyMDA5LTA1LTExIDE1OjM2OjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgUmVxdWlyZSByZWxlYXNlZCB2ZXJzaW9ucyBvZiBjb3JlL2Jhc2UKKworMjAwOS0wNS0xMSAxMDoxNTowMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgZ2RrcGl4YnVmOiBVc2UgdGhlIGxpYnMgYW5kIGNmbGFncyBvZiBnZGsgcGl4YnVmIGluc3RlYWQgb2YgZ3RrCisJICBUaGlzIGZpeGVzIHRoZSBidWlsZCBpZiBnZGstcGl4YnVmIGlzIGZvdW5kIGJ1dCBndGsgaXNuJ3QKKworMjAwOS0wNS0xMSAwOTo1ODo0OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEFsd2F5cyBkZWZpbmUgdGhlIGNvbmRpdGlvbmFsIEhBVkVfR1RLIHRvIGZpeCBjb25maWd1cmUgaW4gc29tZSBjYXNlcworCisyMDA5LTA1LTEwIDExOjE3OjIzICswMjAwICBNYXJjLUFuZHJlIEx1cmVhdSA8bWFyY2FuZHJlLmx1cmVhdUBnbWFpbC5jb20+CisKKwkqIGF1dG9nZW4uc2g6CisJICBSdW4gbGlidG9vbGl6ZSBiZWZvcmUgYWNsb2NhbAorCSAgVGhpcyB1bmJyZWFrcyB0aGUgYnVpbGQgaW4gc29tZSBjYXNlcy4gRml4ZXMgYnVnICM1ODIwMjEKKworMjAwOS0wNS0wOSAxMDo1MDo0NSAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2E6IGZpeCBwcmludGYgZm9ybWF0IHRvIGFncmVlIHdpdGggYXJndW1lbnQKKworMjAwOS0wNS0wOCAxOTo0MjoxMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5jOgorCSAgcmF3MTM5NDogaW5jbHVkZSBzdGRsaWIuaCBmb3Igc3RydG9sKCkKKwkgIEZpeGVzIGNvbXBpbGVyIHdhcm5pbmcgd2hlbiBjb21waWxpbmcgd2l0aCB4bWwgc3R1ZmYgaW4gY29yZSBkaXNhYmxlZC4KKworMjAwOS0wNS0wOCAxNjo0MDo1NyArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogQWN0dWFsbHkgb3V0cHV0IHRoZSBwZW5kaW5nIGJ1ZmZlci4uIGFuZCBub3QgYSBibGFuayBvbmUuCisJICBJdCB3YXMgcHJldmlvdXNseSBzZW5kaW5nIHRoZSBib2d1cyBidWZmZXIgd2hpY2ggd2FzIHJldHVybmVkIGZyb20KKwkgIHRoZSBidWZmZXJhbGxvYyAocmVxdWlyZWQgZm9yIHJldmVyc2UgbmVnb3RpYXRpb24gYXBwYXJlbnRseSkgaW5zdGVhZAorCSAgb2YgdGhlIHBlbmRpbmcgYnVmZmVyLgorCisyMDA5LTA1LTA4IDEyOjAwOjU3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBBbGxvdyBub24tc3RyaW5nIGZpZWxkcyBpbiB0aGUgZXh0cmEtaGVhZGVycyBwcm9wZXJ0eQorCisyMDA5LTA1LTA4IDExOjM1OjAyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuaDoKKwkgIHJ0ajJrZGVwYXk6IGFkZCBiYXNpYyBKUEVHIDIwMDAgZGVwYXlsb2FkZXIKKworMjAwOS0wNS0wOCAxMTozMTowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkgIHJ0cGoya3BheTogc2V0IG1hcmtlciBiaXQgY29ycmVjdGx5CisKKzIwMDktMDUtMDggMTE6Mjk6MDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuaDoKKwkgIHNvdXBodHRwc3JjOiBBZGQgc3VwcG9ydCBmb3IgZXh0cmEtaGVhZGVycyBhcHBlbmRlZCB0byB0aGUgSFRUUCByZXF1ZXN0CisJICBUaGlzIGFsbG93cyB0byBzZXQgdGhlIFJlZmVyZXIgaGVhZGVyIGFtb25nIG90aGVyIHRoaW5ncyBieQorCSAgYWRkaW5nIGEgImV4dHJhLWhlYWRlcnMiIHByb3BlcnR5IHRoYXQgdGFrZXMgYSBHc3RTdHJ1Y3R1cmUKKwkgIHdpdGggZmllbGQ9c3RyaW5nIHBhaXJzLgorCSAgRml4ZXMgYnVnICM1ODE4MDYuCisKKzIwMDktMDUtMDggMTA6Mzg6NDIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5Lmg6CisJICBydHBqMmtwYXk6IGFkZCBhIHNpbXBsZSBKUEVHIDIwMDAgcGF5bG9hZGVyCisKKzIwMDktMDUtMDggMTA6MzE6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAgcnRwanBlZ3BheTogd2Ugb25seSBuZWVkIHRvIHN3YXAgYml0cyBvbiBMRQorCisyMDA5LTA1LTA3IDE4OjEwOjA4ICswMTAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPGNocmlzdGlhbi5zY2hhbGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWcuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBBZGQgUkFOS1MgZm9yIHZhcmlvdXMgZW5jb2RlcnMgYW5kIG11eGVycworCisyMDA5LTA1LTA3IDE3OjA5OjQ0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGFkZCBzb21lIGRlYnVnZ2luZworCisyMDA5LTA1LTA3IDE1OjU4OjQzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IHBhcnNlIHhpcGggaGVhZGVycyBsZW5ndGggY29ycmVjdGx5CisJICBTZWUgIzU4MDk4MAorCisyMDA5LTA1LTA3IDE2OjI1OjQxICswMjAwICBHYWJyaWVsIEJvdXZpZ25lIDxib3V2aWduZUBtcDMtdGVjaC5vcmc+CisKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJnYW5hbHlzaXMuYzoKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJnYW5hbHlzaXMuaDoKKwkqIGdzdC9yZXBsYXlnYWluL3JnYW5hbHlzaXMuYzoKKwkqIGdzdC9yZXBsYXlnYWluL3JnYW5hbHlzaXMuaDoKKwkgIHJnYW5hbHlzaXM6IEFkZCBhYmlsaXR5IHRvIHBvc3QgbGV2ZWwgbWVzc2FnZXMKKwkgIEZpeGVzIGJ1ZyAjNTgxNTY4LgorCisyMDA5LTA1LTA2IDIzOjU2OjQ0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkgIHJ0cGpwZWdwYXk6IHJlZnVzZSBzb21lIHVuc3VwcG9ydGVkIGpwZWcgZm9ybWF0cworCisyMDA5LTA1LTA2IDE4OjA2OjQ5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgcnRwdGhlb3JhcGF5OiBmaXggZGVzY3JpcHRpb24KKworMjAwOS0wNS0wNiAxNjowOToxMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBydHBqcGVncGF5OiByZXdyaXRlIHF1YW50IHRhYmxlIGhhbmRsaW5nCisJICBSZXdyaXRlIHRoZSBxdWFudCB0YWJsZSBwYXJzaW5nIHRvIGFsc28gaGFuZGxlIG11bHRpcGxlIHRhYmxlcyBpbiBvbmUgSlBFRyBIRFEKKwkgIHNlZ21lbnQuCisJICBIYW5kbGUgbW9yZSBqcGVnIHR5cGVzIGJ5IGtlZXBpbmcgdHJhY2sgb2YgdGhlIHRhYmxlcyB1c2VkIHBlciBjb21wb25lbnQgYW5kCisJICBwdXR0aW5nIHRoZSB1c2VkIG9uZXMgaW4gdGhlIHF1YW50IGhlYWRlcnMuCisKKzIwMDktMDQtMTggMTc6MjM6NTEgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzdjJtdXguYzoKKwkgIGlkM3YybXV4OiBNYWtlIHRoZSB0ZXN0IGZhaWx1cmUgc2xpZ2h0bHkgbW9yZSBpbmZvcm1hdGl2ZQorCisyMDA5LTA0LTIwIDE4OjMzOjA5ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGZsYWM6IE1ha2UgYnVmZmVycyBjcmVhdGVkIGR1cmluZyBzZWVrIGFjdCBsaWtlIG5vcm1hbCBidWZmZXJzLgorCSAgU3RvcmUgdGhlIG9mZnNldCBhbmQgY2FwcyB3aGVuIGFsbG9jYXRpbmcgYSBidWZmZXIgZHVyaW5nIHNlZWtpbmcsIGFuZCB0aGVuCisJICBhbGxvY2F0ZSBhIG5ldyBidWZmZXIgd2l0aCBidWZmZXJfYWxsb2MgYmVmb3JlIHdlIHB1c2ggaXQgb3V0LiBUaGlzIGVuc3VyZXMKKwkgIHRoYXQgaW4gYWxsIHJlc3BlY3RzIHRoZSBmaXJzdCBidWZmZXIgZGVjb2RlZCBkdXJpbmcgc2Vla2luZyBiZWhhdmVzIGxpa2UKKwkgIGFsbCBvdGhlciBidWZmZXJzLCBpbmNsdWRpbmcgYWxsb3dpbmcgZG93bnN0cmVhbSByZS1uZWdvdGlhdGlvbi4KKworMjAwOS0wNC0xOCAxODowMDo1NCArMDIwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGZsYWNkZWM6IGRvbid0IHVzZSBwYWRfYWxsb2Mgd2hlbiBkZWNvZGluZyB3aGlsZSBzZWVraW5nLiBGaXhlcyAjNTc5NDIyCisKKzIwMDktMDUtMDYgMTM6MjI6NTEgKzAyMDAgIEFybm91dCBWYW5kZWNhcHBlbGxlIDxhcm5vdXRAbWluZC5iZT4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogcmVmYWN0b3JlZCBnc3RfanBlZ19kZWNfcGFyc2VfaW1hZ2VfZGF0YQorCSAgRml4ZXMgIzU3OTgwOAorCisyMDA5LTA1LTA2IDEzOjExOjUzICswMjAwICBBcm5vdXQgVmFuZGVjYXBwZWxsZSA8YXJub3V0QG1pbmQuYmU+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IHN1cHBvcnQgYWRkaXRpb25hbCAweGZmIGJlZm9yZSBlbmQgbWFya2VyLgorCSAgSlBFRyBtYXJrZXJzIG1heSBiZSBwcmVjZWRlZCBieSBhZGRpdGlvbmFsIDB4ZmYuICBqcGVnZGVjIHNob3VsZAorCSAgc2tpcCBvdmVyIHRoZXNlLCBldmVuIGJlZm9yZSB0aGUgZW5kIG1hcmtlci4KKwkgIFNlZSAjNTc5ODA4CisKKzIwMDktMDUtMDYgMTI6NTQ6MjIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAgcnRwanBlZ3BheTogaGFuZGxlIGlucHV0IHdpdGggMSBxdWFudCB0YWJsZQorCSAgQWxzbyBoYW5kbGUgaW5wdXQgd2l0aCBqdXN0IG9uZSBxdWFudCB0YWJsZSwgc2ltcGx5IGR1cGxpY2F0ZSB0aGUgcXVhbnQgdGFibGUuCisJICBIYW5kbGUgaW52YWxpZCBTT0YgY29ycmVjdGx5IGFuZCBzb21lIHNtYWxsIGNsZWFudXBzLgorCSAgRml4ZXMgIzU3ODI1NworCisyMDA5LTA0LTI5IDE1OjU4OjEwICswMzAwICBNYXJjbyBCYWxsZXNpbyA8bWFyY28uYmFsbGVzaW9Abm9raWEuY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggYnl0ZSBvcmRlciBzd2FwcGluZyBpbiAzR1BQIGNsYXNzaWZpY2F0aW9uIGVudGl0eSB0YWcKKwkgIEZpeGVzICM1ODA3NDYuCisKKzIwMDktMDUtMDUgMTc6MDc6MTMgKzAyMDAgIEFybm91dCBWYW5kZWNhcHBlbGxlIDxhcm5vdXRAbWluZC5iZT4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSAgbXVsdGlwYXJ0ZGVtdXg6IGF2b2lkIHJlYWRpbmcgZnJvbSBpbmF2bGlkIG1lbW9yeQorCSAgUmVhZCB0aGUgdGltZXN0YW1wIG9mIHRoZSBpbmNvbW1pbmcgYnVmZmVyIGJlZm9yZSB3ZSBwdXNoIGl0IGluIHRoZSBhZGFwdGVyIGFuZAorCSAgZmx1c2ggaXQgb3V0IGFnYWluIGFzIHRoZSBidWZmZXIgbWlnaHQgYmUgdW5yZWZmZWQgdGhlbiBhbmQgd2UgcmVhZCBmcm9tIGludmFsaWQKKwkgIG1lbW9yeS4KKwkgIEZpeGVzICM1ODE0NDQuCisKKzIwMDktMDUtMDUgMTc6MDM6MjkgKzAyMDAgIEFybm91dCBWYW5kZWNhcHBlbGxlIDxhcm5vdXRAbWluZC5iZT4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSAgbXVsdGlwYXJ0ZGVtdXg6IGRvbid0IGxlYWsgZHluYW1pYyBwYWRzCisJICBGcmVlIHRoZSBkeW5hbWljIHBhZHMgZGF0YSBpbiBmaW5hbGl6ZS4KKwkgIEZpeGVzICM1ODE0MzIKKworMjAwOS0wNS0wNSAxNjozMjoxNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuaDoKKwkgIHJ0cGpwZWdwYXk6IGNvcnJlY3RseSBzZXQgdGhlIHR5cGUgaGVhZGVyCisJICBEb24ndCByZXF1aXJlIHdpZHRoL2hlaWdodCBvbiB0aGUgY2Fwcy4gVXNlIHRoZSBTT0YgaGVhZGVyIHRvIGZpbmQgd2lkdGgvaGVpZ2h0CisJICBhbmQgZmFsbCBiYWNrIHRvIHRoZSBjYXBzIGlmIHRoZXJlIGlzIG5vIFNPRi4gQWxzbyB1c2UgdGhlIFNPRiBpbmZvIHRvIGZpbmQgdGhlCisJICBzdWJzYW1wbGluZyBhbmQgcXVhbnRpemF0aW9uIHRhYmxlcyB1c2VkLiBUaGlzIGFsbG93cyB1cyB0byBzZXQgdGhlIHJpZ2h0IHR5cGUKKwkgIHZhbHVlIGluIHRoZSBKUEVHIHJ0cCBoZWFkZXIuCisJICBEZXByZWNhdGUgdGhlIHF1YWxpdHkgcHJvcGVydHksIGl0J3MgdW51c2VkIG5vdyBhbmQgaXQgd2FzIHVzZWQgd3JvbmdseSBiZWZvcmUuCisJICBBbHdheXMgc2VuZCBmdWxsIHF1YW50IHRhYmxlcyBmb3Igbm93IHVudGlsIHdlIGhhdmUgc29tZSBjb2RlIHRvIGRldGVjdCBkZWZhdWx0CisJICBvbmVzLgorCSAgRml4ZXMgIzU4MDg4MAorCisyMDA5LTA1LTA1IDE2OjI4OjQ0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuaDoKKwkgIHJ0cGpwZWdkZXBheTogdXNlIHdpZHRoL2hlaWdodCBmcm9tIHBheWxvYWQKKwkgIFVzZSB0aGUgd2lkdGggYW5kIHRoZSBoZWlnaHQgZnJvbSB0aGUgcGF5bG9hZCBoZWFkZXJzIGFuZCBzZXQgdGhlbSBvbiB0aGUKKwkgIG91dHB1dCBjYXBzIGZvciBhZGRlZCBhd2Vzb21lbmVzcy4KKwkgIEZpeCBxdWFudCBwYXJzaW5nLCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSB0eXBlIGluIHRoZSBsb3dlciA2IGJpdHMuCisJICBBZGQgZmlyc3QgYml0cyBvZiBjYWNoaW5nIHF1YW50aXphdGlvbiB0YWJsZXMuCisKKzIwMDktMDUtMDUgMTY6MjQ6MTYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWdlbmM6IHNldCBjb2xvcnNwYWNlIGJlZm9yZSBfc2V0X2RlZmF1bHRzKCkKKwkgIFRoZSBsaWJqcGVnIGFwaSBzYXlzIHRoYXQgd2UgbmVlZCB0byBzZXQgdGhlIGNvbG9yc3BhY2UgYmVmb3JlIHdlIGNhbGwKKwkgIF9zZXRfZGVmYXVsdHMoKS4gSW5kZWVkLCBpZiB3ZSBkb24ndCBkbyB0aGF0IHdlIGVuZCB1cCB3aXRoIHNvbWUgdmVyeSBmcmVha3kKKwkgIG5vbi1zdGFuZGFyZCBxdWFudCB0YWJsZSBhbmQgaHVmZm1hbiB0YWJsZSBpbmRleGVzLgorCisyMDA5LTA1LTA1IDEzOjE5OjE5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvTWFrZWZpbGUuYW06CisJICB0ZXN0czogZG9uJ3QgYnVpbGQgZXhhbXBsZXMgaWYgLS1kaXNhYmxlLWV4YW1wbGVzIHdhcyBwYXNzZWQgdG8gY29uZmlndXJlCisKKzIwMDktMDUtMDUgMTI6MzM6NTcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IGNsZWFuIHVwIG1lc3MgYXJvdW5kIGd0aysgY2hlY2tpbmcKKwkgIEFuZCBkb24ndCBjaGVjayBmb3IgZ3RrKyB3aGVuIGl0J3Mgbm90IG5lZWRlZCAoaWUuIGlmIGV4YW1wbGVzIGFyZSBkaXNhYmxlZCkKKworMjAwOS0wNS0wNSAxMjoyNzoyMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9nZGtfcGl4YnVmL01ha2VmaWxlLmFtOgorCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuaDoKKwkgIGNvbmZpZ3VyZTogbWFrZSBnZGstcGl4YnVmIHBsdWdpbiBkZXBlbmQgb25seSBvbiBnZGstcGl4YnVmLCBub3QgZ3RrKworCisyMDA5LTA1LTA0IDE4OjU1OjEyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBGaXggZmluZF9zdHJlYW1fYnlfKiBmdW5jdGlvbnMKKwkgIEZpeCB2YXJpb3VzIHZlcnNpb24gb2YgZmluZF9zdHJlYW1fYnlfKiBieSBub3QgdHJ5aW5nIHRvIGNvbnZlcnQgYW4gaW50IHRvIGEKKwkgIHBvaW50ZXIgYW5kIHZpY2UgdmVyc2EsIGZvciBwb3J0YWJpbGl0eSByZWFzb25zLgorCSAgRml4ZXMgIzU4MTMzMworCisyMDA5LTA1LTA0IDE4OjMyOjA1ICswMjAwICBDaHJpcyBXaW50ZXIgPGVsd2ludHJvIGF0IGdtYWlsLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IGR1bW15IG5hdCBwYWNrZXQgbG9naWMKKwkgIEZpeCBhIHR5cG8gaW4gdGhlIGR1bW15IE5BVCBwYWNrZXQgc2VuZGluZyBjb2RlLgorCSAgRml4ZXMgIzU4MTMyOQorCisyMDA5LTA0LTMwIDEwOjI0OjI3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYXZvaWQgZXJyb3JzIGFmdGVyIHNlcnZlciBlb2YKKwkgIFNlcnZlciBlb2YgKGUuZy4gY29ubmVjdGlvbiBjbG9zZWQpIGlzIGFubm91bmNlZCBhcyBjb25uZWN0aW9uIGNsb3NlZCwKKwkgIHNvIGJldHRlciByZWNvcmQgc3RhdGUgYW5kIGFjdCBhY2NvcmRpbmdseSB0byBwcmV2ZW50IChyZWFkL3dyaXRlKQorCSAgZXJyb3JzIGR1cmluZyBzdWJzZXF1ZW50IHRlYXJkb3duL2NsZWFudXAgc2VxdWVuY2VzLiAgI0ZpeGVzIDU4MDg1MS4oYykuCisKKzIwMDktMDQtMzAgMTA6MTk6MjcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBhbHNvIHNldCBiYXNlX3RpbWUgb24gc3JjIGFmdGVyIGZsdXNoCisJICB0aW1lc3RhbXBzIGZvbGxvd2luZyBmbHVzaC9zZWVrIHNob3VsZCBiZSBjb25zaXN0ZW50IGJldHdlZW4KKwkgIFVEUCBhbmQgVENQIGludGVybGVhdmVkIGNhc2UuICBGaXhlcyAjNTgwODUxLihiKS4KKworMjAwOS0wNC0zMCAxMDoxNzoyMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHNhbml0eSBjaGVja3Mgb24gcmFuZ2UgaW5mbworCSAgQSBtYXggcmFuZ2UgdGhhdCBvdmVyZmxvd3Mgc2hvdWxkIG5vdCBiZSB0cnVzdGVkLAorCSAgbm9yIHNob3VsZCBhIG1heCByYW5nZSB0aGF0IGVxdWFscyB0aGUgbWluIHJhbmdlLgorCSAgRml4ZXMgIzU4MDg1MS4oYSkuCisKKzIwMDktMDUtMDQgMTY6MTY6NTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IHVzZSBTS0lQIGZsYWcgdG8gdXNlIFNDQUxFIGhlYWRlcnMKKwkgIFdlIGNhbiB1c2UgdGhlIFNLSVAgc2VlayBmbGFnIHRvIGluc3RydWN0IHRoZSBzZXJ2ZXIgdG8gc2VuZCBkYXRhIGZhc3RlciB0aGVuCisJICBub3JtYWwgYnV0IHdpdGggdGhlIHNhbWUgYmFuZHdpZHRoLgorCSAgRml4ZXMgIzUzNzYwOQorCisyMDA5LTA1LTA0IDE0OjE5OjIyICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJICBzcGVleGRlYzogbWFrZSBzcGVleF9kZWNfY29udmVydCB3b3JrIHdpdGggc2FtZS1mb3JtYXQgdmFsdWVzIHdoZW4gbm8gZGF0YSBoYXMgYmVlbiBkZWNvZGVkLgorCisyMDA5LTA1LTA0IDEyOjQzOjQyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhYzogSW1wbGVtZW50IHByZXNldCBpbnRlcmZhY2UKKworMjAwOS0wNS0wNCAxMjo0MTo1NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgc3BlZXg6IEltcGxlbWVudCBwcmVzZXQgaW50ZXJmYWNlCisKKzIwMDktMDUtMDQgMTI6NDA6MTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6CisJICB3YXZwYWNrOiBJbXBsZW1lbnQgcHJlc2V0IGludGVyZmFjZQorCisyMDA5LTA1LTA0IDEyOjM1OjE5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiB1c2UgYmluYXJ5IHNlYXJjaCBmb3IgaW5kZXgKKwkgIFVzZSB0aGUgbmV3IGJpbmFyeSBzZWFyY2ggbWV0aG9kIGZvciBmaW5kaW5nIHRoZSByaWdodCBpbmRleCBlbnRyeSBmYXN0ZXIuCisKKzIwMDktMDUtMDQgMTE6MjY6NTYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IGRyYXcgdGhlIGNvbXBsZXRlIFUgYW5kIFYgcGxhbmVzCisJICBSb3VuZCB1cCB0aGUgc2NhbGVkIFUgYW5kIFYgd2lkdGggYW5kIGhlaWdodCBzbyB0aGF0IHdlIGFsd2F5cyBkcmF3IHRoZSBjb3JyZWN0CisJICBhbW91bnQgb2YgcGl4ZWxzIHRvIGZpbGwgdGhlIGNvbXBsZXRlIGltYWdlLgorCSAgRml4ZXMgIzU2OTYxMQorCisyMDA5LTA1LTAxIDE5OjM1OjExICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgc29tZSBtb3JlIG1pY3JvIG9wdGltaXNhdGlvbnMKKworMjAwOS0wNC0zMCAxODo0MTo0NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X3R5cGVzLmM6CisJICBxdGRlbXV4OiBtaWNybyBvcHRpbWl6ZSBxdGRlbXV4IGEgbGl0dGxlCisJICBTcHJpbmtsZSBzb21lIEdfTElLRUxZIGFyb3VuZC4KKwkgIEF2b2lkIHRyYXZlcnNpbmcgYW5kIGR1bXBpbmcgdGhlIHRyZWUgd2hlbiBkZWJ1Z2dpbmcgaXMgbm90IGFjdGl2YXRlZC4KKworMjAwOS0wNC0zMCAxNDoyMjoyNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkgIHF0ZGVtdXg6IGFkZCBzdXBwb3J0IGZvciBzdWJ0aXRsZSBwaWN0dXJlcworCSAgQWRkIHN1cHBvcnQgZm9yIHN1YnRpdGxlIHBpY3R1cmVzLgorCSAgRml4ZXMgIzU2ODI3OC4KKworMjAwOS0wNC0zMCAxMDozMjozOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBtYWtlIHN1cmUgd2UgYWx3YXlzIHNpZ25hbCB3YWl0ZXJzCisJICBBbHdheXMgc2lnbmFsIHRoZSB3YWl0ZXJzIGluIHRoZSBhc3luYyBjYWxsYmFja3MuIEVzcGVjaWFsbHkgZm9yIHRoZSB2b2x1bWUKKwkgIGNhbGxiYWNrcyBzaW5jZSB0aGlzIG1pZ2h0IGNhdXNlIGRlYWRsb2Nrcy4KKworMjAwOS0wNC0yOSAxODowOTowNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcmVsZWFzZSBzdGF0ZSBsb2NrIGJlZm9yZSBzdG9wcGluZyB0YXNrCisJICBXZSBuZWVkIHRvIHJlbGVhc2UgdGhlIHN0YXRlIGxvY2sgYmVmb3JlIHRyeWluZyB0byB3YWl0IGZvciB0aGUgdGFzayB0byBlbmQKKwkgIGJlY2F1c2UgdGhlIHRhc2sgbWlnaHQgYWxzbyB0YWtlIHRoZSBsb2NrLgorCSAgRml4ZXMgIzU3NzY3MQorCisyMDA5LTA0LTI5IDEyOjE5OjI3ICswMjAwICBIYW5zIGRlIEdvZWRlIDxqd3JkZWdvZWRlIGF0IGZlZG9yYXByb2plY3Qub3JnPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBoYW5kbGUgYWMtMyBhdWRpbworCSAgZml4IGRlbXV4aW5nIG9mIG00diBzdHJlYW1zIHdpdGggYWMtMyBhdWRpbworCSAgRml4ZXMgIzU4MDU1NAorCisyMDA5LTA0LTI5IDExOjEyOjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogVXNlIHRoZSB0YWcgbWVyZ2UgbW9kZSB0aGF0IHdhcyBzZXQgb24gdGhlIGludGVyZmFjZSBmb3IgbWVyZ2luZyB0YWcgZXZlbnRzCisKKzIwMDktMDQtMjUgMDk6NDM6MzggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IGZpeCBnZXRhZGRyaW5mbyBlcnJvciByZXBvcnRpbmcKKwkgIGdldGFkZHJpbmZvIGVycm9ycyBzaG91bGQgYmUgcmVwb3J0ZWQgd2l0aCBnYWlfc3RyZXJyb3IgaW5zdGVhZCBvZiBlcnJubyBhcworCSAgc3BvdHRlZCBieSBNaWtlUy4KKworMjAwOS0wNC0yNyAxMDowODozOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJICBnNzI2cGF5OiBmaXggY29tcGlsYXRpb24KKworMjAwOS0wNC0yNyAxMDowMjowNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZwYXkuaDoKKwkgIGc3MjZwYXk6IGFkZCBSRkMgY29tcGxpYW50IHBhY2tldGl6aW5nCisJICBTaHVmZmxlIHRoZSBpbnB1dCBiaXRzIGFjY29yZGluZyB0byBSRkMgMzU1MSBmb3IgRzcyNiBwYXlsb2Fkcy4KKwkgIEFkZCBvcHRpb24gdG8gZm9yY2UgdGhlIHByZXZpb3VzIGJlaGF2aW91ci4KKwkgIEZpeGVzICM1NjcxNDAKKworMjAwOS0wNC0yNyAwOTo1OTo1NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYzoKKwkgIGc3MjZkZXBheTogYWRkIGRlYnVnIGNhdGVnb3J5CisJICBBZGQgYSBkZWJ1Z2dpbmcgY2F0ZWdvcnksIGFkZCBzb21lIGNvbW1lbnRzIGFuZCByZW1vdmUgX3BlZWtfcGFyZW50KCkuCisKKzIwMDktMDQtMjYgMTU6NTk6NTAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBpZDN2Mm11eDogd2UgbmVlZCB0YWdsaWIgMS41IGZvciBJRDN2Mjo6UmVsYXRpdmVWb2x1bWVGcmFtZTo6c2V0SWRlbnRpZmljYXRpb24KKwkgIEJ1bXAgdGFnbGliIHJlcXVpcmVtZW50LgorCisyMDA5LTA0LTI0IDAyOjExOjI4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzZGVtdXguYzoKKwkqIHRlc3RzL2ZpbGVzL2lkMy01Nzc0NjgtdW5zeW5jZWQtdGFnLnRhZzoKKwkgIGlkM2RlbXV4OiBhZGQgdW5pdCB0ZXN0IGZpbGUgZm9yIHVuc3luY2VkIGlkMyB0YWdzCisKKzIwMDktMDQtMjQgMDE6NTE6MzUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaWQzZGVtdXgvaWQzdGFncy5jOgorCSAgaWQzZGVtdXg6IHBhcnNlIHVuc3luY2hyb25pc2VkIHRhZ3MgcHJvcGVybHkKKwkgIFdlIGRpZG4ndCBoYW5kbGUgdW5zeW5jaHJvbml6YXRpb24gYXQgYWxsIHVwIHRvIG5vdywgd2hpY2ggbWlnaHQgaGF2ZQorCSAgY2F1c2VkIGZyYW1lcyB0byBub3QgYmUgZXh0cmFjdGVkIC0gZXNwLiBmcmFtZXMgYWZ0ZXIgYW4gQVBJQyBwaWN0dXJlCisJICBmcmFtZS4gRml4ZXMgIzU3NzQ2OC4KKworMjAwOS0wNC0yNCAwMTowMTo1MyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pZDNkZW11eC9pZDN0YWdzLmM6CisJICBpZDNkZW11eDogcGFzcyB0aGUgcmlnaHQgc2l6ZSB2YWx1ZSBmb3Igc2l6ZSBvZiBhbGwgZnJhbWVzIHRvIHRoZSBwYXJzZXIKKwkgIEZyYW1lIGRhdGEgc2l6ZSBpcyB0YWcgc2l6ZSBhZGp1c3RlZCBmb3Igc2l6ZSBvZiB0aGUgdGFnIGhlYWRlciBhbmQKKwkgIGZvb3Rlciwgbm90IHRhZyBzaXplIGluY2x1ZGluZyBoZWFkZXIgYW5kIGZvb3Rlci4KKworMjAwOS0wNC0yMiAxNToyNDo1NSArMDIwMCAgUGF0cmljayBSYWRpemkgPHBhdHJpY2sucmFkaXppIGF0IGF4aXMuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaXggc29tZSBtb3JlIHBhZCBsZWFrcworCSAgRml4IHNvbWUgcGFkIGxlYWtzLgorCSAgU2VlICM1NzczMTguCisKKzIwMDktMDQtMjEgMjI6MTI6NDUgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGIzOTQxZWEgdG8gNmFiMTFkMQorCisyMDA5LTA0LTIxIDE0OjAyOjAxIC0wNzAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogb3ZlcnJpZGUgY2FwcyBiYXNlZCBvbiBkYXRhIGZyb20gRVNEUyBhdG9tcyBpbiBtcGVnNC4KKwkgIElmIHRoZSBjb2RlYyBpcyBhY3R1YWxseSBzb21ldGhpbmcgZWxzZSAoZS5nLiBtanBlZykgY2hhbmdlIHRoZSBjYXBzIHRvCisJICBtYXRjaCB3aGVuIHBhcnNpbmcgdGhlIEVTRFMgYXRvbS4KKwkgIEFsc28sIGZvciBBQUMsIG92ZXJyaWRlIHJhdGUgYW5kIGNoYW5uZWxzIHdpdGggY29ycmVjdCB2YWx1ZXMgcmVhZCBmcm9tCisJICBFU0RTLCBzaW5jZSB0aGUgcmF0ZS9jaGFubmVscyB2YWx1ZXMgZWxzZXdoZXJlIGFyZSBvZnRlbiB3cm9uZy4KKworMjAwOS0wNC0yMCAxOTozMjowMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGZpeCB3YXJuaW5nIGZvciBzdGlsbCBpbWFnZXMgYnkgbm90IHRyeWluZyB0byBkaXZpZGUgYnkgMAorCSAgRG9uJ3QgcGFzcyBhIDAgZGl2aXNvciB0byBnc3RfdXRpbF91aW50NjRfc2NhbGUoKSwgb3IgaXQgd2lsbCBjb21wbGFpbgorCSAgaW4gdGhlIHNpbmdsZSBpbWFnZSBjYXNlIHdoZXJlIGZwcz0wLzEgKGFyZSB3ZSBzdXBwb3NlZCB0byBkaWZmZXJlbnRpYXRlCisJICBiZXR3ZWVuIG5vIGZwcz1zdGlsbCBpbWFnZSBhbmQgZnBzPTAvMT12YXJpYWJsZSByYXRlIGhlcmUgYnR3PykKKworMjAwOS0wNC0yMCAxNzoyNTozNCArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmM6CisJICB1ZHA6IEZpeCBhIHNpbXBsZSB0eXBvIGluIHRoZSBwcmV2aW91cyBjb21taXQKKwkgIFVzZSAjaWZkZWYgaW5zdGVhZCBvZiAjaWYsIHRvIGZpeCB0aGUgYnVpbGQKKworMjAwOS0wNC0yMCAxNTo0ODoyMSArMDIwMCAgQW5keSBXaW5nbyA8d2luZ29Ad2luZ29tYWMuYmNuLm9ibG9uZy5uZXQ+CisKKwkgIGZpeCBmb3JtYXQgc3RyaW5nIGluIHBuZ2RlYworCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiBGaXggc2l6ZV90IHZzIHVuc2lnbmVkIGludCBmb3JtYXQgaW4gZXJyb3IgbWVzc2FnZS4KKworMjAwOS0wNC0yMCAxNTo0NjowMyArMDIwMCAgQW5keSBXaW5nbyA8d2luZ29Ad2luZ29tYWMuYmNuLm9ibG9uZy5uZXQ+CisKKwkgIG9ubHkgdXNlIHN0cnVjdCBpcF9tcmVxbiBpZiBpdCBpcyBkZXRlY3RlZAorCSAgKiBjb25maWd1cmUuYWM6IE1ha2UgYW4gZXhwbGljaXQgY2hlY2sgZm9yIHN0cnVjdCBpcF9tcmVxbi4KKwkgICogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOiBVc2UgSEFWRV9JUF9NUkVRTiBpbnN0ZWFkIG9mIHRoZSBhZC1ob2MgY2hlY2tzLgorCisyMDA5LTA0LTIwIDEzOjQ1OjMyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgRml4IHB1c2ggbW9kZSBidWZmZXJpbmcgc2FuaXR5IGNoZWNrIHRvIGFjdHVhbGx5IGZpdCB0aGUgZGVzY3JpcHRpb24uCisKKzIwMDktMDQtMTggMTk6MTE6MDYgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSAgcnRwaDI2M3BheTogQW5kIGxldCdzIG5vdCBmb3JnZXQgdG8gcmVtb3ZlIHRoZSB1bnVzZWQgdmFyaWFibGUuCisKKzIwMDktMDQtMTggMTg6NTA6MzIgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSAgcnRwaDI2M3BheTogUmVtb3ZlIGRlYWQgYXNzaWdubWVudHMsIHRoZSB2YXJpYWJsZXMgYXJlIG5ldmVyIHJlYWQgYWZ0ZXIuCisKKzIwMDktMDQtMTggMTg6NDk6NDkgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSAgcnRwbXA0dnBheTogUmVtb3ZlIGRlYWQgYXNzaWdubWVudC4gVGhlIHZhbHVlIGlzIG5ldmVyIHJlYWQgYWZ0ZXIuCisKKzIwMDktMDQtMTggMTg6NDg6NTUgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IFJlbW92ZSBkZWFkIGFzc2lnbm1lbnQuCisJICB0IGlzIGJlaW5nIG92ZXJ3cml0dGVuIGFmdGVyLCBiZWZvcmUgaXQncyB1c2VkLgorCisyMDA5LTA0LTE4IDE4OjQ4OjA2ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJICBydHBhbXJkZXBheTogUmVtb3ZlIHVubmVlZGVkIHZhcmlhYmxlLCB0aGUgdmFsdWUgaXMgb25seSByZWFkIG9uY2UuCisKKzIwMDktMDQtMTggMTg6NDc6MDUgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJICBydHBhbXJwYXk6IFJlbW92ZSB1bm5lZWRlZCB2YXJpYWJsZSwgdGhlIHZhbHVlIGlzIG9ubHkgcmVhZCBvbmNlLgorCisyMDA5LTA0LTE4IDE4OjQ2OjEyICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvZ29vbS9maWx0ZXJzLmM6CisJICBnb29tL2ZpbHRlcnM6IFJlbW92ZSBkZWFkIGFzc2lnbm1lbnQuIFZhbHVlIG92ZXJ3cml0dGVuIGp1c3QgYWZ0ZXIuCisKKzIwMDktMDQtMTggMTg6NDU6MzIgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJICBydHB2b3JiaXNwYXk6IFJlbW92ZSBkZWFkIGFzc2lnbm1lbnQuIFZhbHVlIG5ldmVyIHJlYWQgYWZ0ZXIuCisKKzIwMDktMDQtMTggMTg6NDU6MDcgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJICBydHB0aGVvcmFwYXk6IFJlbW92ZSBkZWFkIGFzc2lnbm1lbnQuIFZhbHVlIG5ldmVyIHJlYWQgYWZ0ZXIuCisKKzIwMDktMDQtMTggMTg6NDM6MzEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkgIHJ0cHRoZW9yYWRlcGF5OiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLCBpdCdzIG5ldmVyIGJlaW5nIHJlYWQuCisKKzIwMDktMDQtMTggMTg6NDI6NDUgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IFJlbW92ZSBkZWFkIGFzc2lnbm1lbnQuICdyZXMnIGlzbid0IHJlYWQgYWZ0ZXIuCisKKzIwMDktMDQtMTggMTg6NDE6NTggKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUuICdyZXMnIGlzIG5ldmVyIHJlYWQuCisKKzIwMDktMDQtMTggMTg6NDA6NDggKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IFJlbW92ZSBkZWFkIHZhcmlhYmxlLiAnc3RyZWFtJyBpcyBuZXZlciByZWFkIGFmdGVyLgorCisyMDA5LTA0LTE4IDE4OjM5OjQ4ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVib3g6IFJlbW92ZSBkZWFkIGFzc2lnbm1lbnRzLgorCSAgVGhlc2UgdmFyaWFibGVzIGFyZSBuZXZlciByZWFkIGFmdGVyIHRoaXMgcG9pbnQuCisKKzIwMDktMDQtMTggMTg6Mzg6MjkgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9nb29tL2NvbnZvbHZlX2Z4LmM6CisJICBnb29tOiBmZiBhbmQgaWZmIGFyZSBvbmx5IHVzZWQgaW4gYSAnI2lmZGVmIERSQVdfTU9USUYnIGJsb2NrLgorCisyMDA5LTA0LTE4IDE4OjM0OjExICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBSZW1vdmUgZGVhZCBhc3NpZ25tZW50LgorCSAgcmVzIGlzbid0IHJlYWQgYWZ0ZXIgdGhpcy4KKworMjAwOS0wNC0xOCAxODozMjowMyArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogUmVtb3ZlIGRlYWQgYXNzaWdubWVudHMsIG1vdmUgdmFyaWFibGUgdG8gd2hlcmUgaXQncyBuZWVkZWQuCisJICBUaGUgaGVhZGVyX3JlYWRfZXJyb3IgbGFiZWwgd2lsbCByZXR1cm4gR1NUX0ZMT1dfRVJST1IKKworMjAwOS0wNC0xOCAxODoyMToyMiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkgIHJ0cHZyYXdkZXBheTogUmVtb3ZlIGRlYWQgYXNzaWdubWVudC4KKwkgIFRoZSB2YWx1ZSBvZiAnc3RyJyB3aWxsIG5ldmVyIGJlIHVzZWQgaW4gdGhlc2UgY2FzZXMuCisKKzIwMDktMDQtMTggMTg6MTk6MTIgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogUmVtb3ZlIHVzZWxlc3MgdmFyaWFibGUuCisJICBpcmV0IHdhcyBuZXZlciByZWFkIG91dHNpZGUgb2YgdGhhdCBsb29wLCBhbmQgaXMgYWx3YXlzIGJlaW5nIGV4aXRlZCBpZgorCSAgaXJldCB3YXMgIT0gR1NUX0ZMT1dfT0sgYW55d2F5LgorCisyMDA5LTA0LTE4IDE4OjE3OjM1ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogTW92ZSAncmVzJyB0byB3aGVyZSBpdCdzIGFjdHVhbGx5IGJlaW5nIHVzZWQuCisJICByZXMgd2FzIG5ldmVyIHVzZWQgb3V0c2lkZSBvZiB0aGF0IGJsb2NrIGV4Y2VwdCBmb3IgYSBkZWFkIGFzc2lnbm1lbnQuCisKKzIwMDktMDQtMTggMTg6MTY6MzMgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmJhbmQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmxpbWl0LmM6CisJICBhdWRpb2Z4OiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLgorCSAgcnogaXMgbmV2ZXIgdXNlZCBpbiB0aGVzZSBtZXRob2RzLgorCisyMDA5LTA0LTE4IDE4OjE1OjM5ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4cmluZ2J1ZmZlci5jOgorCSAgb3N4cmluZ2J1ZmZlcjogUnVuIGdzdC1pbmRlbnQuCisKKzIwMDktMDQtMTggMTg6MTQ6NDkgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICB4aW1hZ2U6IFJlbW92ZSBkZWFkIGFzc2lnbm1lbnRzLgorCSAgVGhvc2UgdmFyaWFibGVzIGFyZSBub3QgcmVhZCBhZnRlciB0aGF0IHBvaW50LgorCisyMDA5LTA0LTE4IDE4OjExOjAwICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5jOgorCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkqIGV4dC9yYXcxMzk0L2dzdGhkdjEzOTRzcmMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSogZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkqIGdzdC9xdGRlbXV4L2dzdHJ0cHhxdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSogZ3N0L3J0c3AvZ3N0cnRwZGVjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5jOgorCSogZ3N0L3NtcHRlL3BhaW50LmM6CisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIFJlbW92ZSB0cml2aWFsIHVudXNlZCB2YXJpYWJsZXMgZGV0ZWN0ZWQgYnkgQ0xhbmcgc3RhdGljIGFuYWx5emVyLgorCisyMDA5LTA0LTE4IDE3OjUyOjAwICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBleHQvZ2NvbmYvZ3N0c3dpdGNoc2luay5jOgorCSogZ3N0L3F0ZGVtdXgvZ3N0cnRweHF0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSAgUmVtb3ZlIGJsYW5rIHtzZXR8Z2V0fV9wcm9wZXJ0eS9jaGFuZ2Vfc3RhdGUvZmluYWxpemUgbWV0aG9kcy4KKworMjAwOS0wNC0xOCAxNzo0Mjo1NSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5LmM6CisJKiBleHQvZXNkL2VzZHNpbmsuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6CisJKiBnc3QvZGVidWd1dGlscy9lZmVuY2UuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdG5hdmlnYXRpb250ZXN0LmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RyZXYuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNpbmsuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkgIFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIGluIF9jbGFzc19pbml0CisJICBEZXRlY3RlZCBieSBMTFZNJ3MgQ0xhbmcgc3RhdGljIGFuYWx5emVyCisKKzIwMDktMDQtMTggMTM6NTQ6MDggKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkgIGNoZWNrOiBDaGVjayB3aGV0aGVyIHRocmVhZHMgYXJlIGFscmVhZHkgaW5pdGlhbGlzZWQgYmVmb3JlIGdfdGhyZWFkX2luaXQoKQorCisyMDA5LTA0LTE4IDE0OjMyOjQwICswMjAwICBKb3NlcCBUb3JyYSA8bjc3MGdhbGF4eUBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IG1hcmsgZGlzY29udCBvbiB0aGUgc3RyZWFtcyBhcyB3YXMgc2FpZCB0aGUgZGVidWcgbGluZQorCSAgQWZ0ZXIgYSBzZWVrIG1hcmsgYWxsIHN0cmVhbXMgd2l0aCBkaXNjb250IGFzIGl0IHdhcyBzYWlkIGluIHRoZSBkZWJ1ZyBsaW5lLgorCSAgRml4ZXMgdGhhdCBidWZmZXJzIGFmdGVyIGEgc2VlayBhcmUgZ2VuZXJhdGVkIHdpdGhvdXQgYSB2YWxpZCB0aW1lc3RhbXAuCisKKzIwMDktMDQtMTggMDg6NDU6MTggKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogbWFwIEdTVF9SVFNQX0VFT0YgdG8gRU9TIG9uIHNlcnZlciByZXF1ZXN0cworCSAgUGVybWl0IHByb3Blcmx5IGhhbmRsZSB0aGUgRU9TIGNvbmRpdGlvbiB3aGVuIHNlcnZlciByZXBvcnQgaXQgaW4gYSByZXF1ZXN0LgorCisyMDA5LTA0LTE4IDA4OjM5OjU3ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJICBydHB0aGVvcmFkZXBheTogRml4IGJ1aWxkIG9uIG1hY29zeC4KKwkgIFVzZSBHX0dTSVpFX0ZPUk1BVCBpbnN0ZWFkIG9mIHUuCisKKzIwMDktMDQtMTYgMjI6NTA6NTkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogZml4IHNhbXBsZSBvZmZzZXQgY2FsY3VsYXRpb24gYWdhaW4KKworMjAwOS0wNC0xNSAxOTozMjoxOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyY3RybC5jOgorCSAgc3VuYXVkaW86IGZpeCBicm9rZW4gaW5kZW50YXRpb24gb2YgdmFyaWFibGUgZGVjbGFyYXRpb25zCisKKzIwMDktMDQtMTUgMTk6Mjg6NTMgKzAxMDAgIEphbWVzIEFuZHJld2FydGhhIDx0cnM4MEB1Y2MuZ3UudXdhLmVkdS5hdT4KKworCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmM6CisJICBzdW5hdWRpbzogcmVtb3ZlIHNvbWUgdW51c2VkIHZhcmlhYmxlcyBhbmQgZ290byBsYWJlbHMKKwkgIEZpeGVzICM1NzkwNzAuCisKKzIwMDktMDQtMTUgMTk6MjQ6NDkgKzAyMDAgIEphbWVzIEFuZHJld2FydGhhIDx0cnM4MCBhdCB1Y2MuZ3UudXdhLmVkdS5hdT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaDoKKwkgIHJ0cGgyNjNwYXk6IGZpeCBjb21waWxhdGlvbiBvbiBiaWctZW5kaWFuCisJICBTb21lIHNlbWljb2xvbnMgd2VyZSBtaXNzaW5nIGZyb20gdGhlIGJpZy1lbmRpYW4gc3RydWN0cyBpbiBnc3RydHBoMjYzcGF5LmguCisJICBBIEdTVF9ERUJVRyBjYWxsIHdhcyBtaXNzaW5nIGEgZm9ybWF0IHNwZWNpZmllci4KKwkgIEZpeGVzICM1NzkwNjkKKworMjAwOS0wNC0xNSAyMDoxMDowNCArMDMwMCAgTWFyY28gQmFsbGVzaW8gPG1hcmNvLmJhbGxlc2lvQG5va2lhLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfdHlwZXMuYzoKKwkqIGdzdC9xdGRlbXV4L3F1aWNrdGltZS5jOgorCSAgcXRkZW11eDogaW1wbGVtZW50IDNHUFAgKFRTIDI2LjI0NCBWOC4wLjApIEFzc2V0IG1ldGFkYXRhIGhhbmRsaW5nLCBGaXhlcyAjMTMyMTkzCisJICBJbXBsZW1lbnRzIDNncHAgaXNvIG1ldGFkYXRhIHRhZ3Mgd2hpY2ggYXJlIGRpZmZlcmVudCBmcm9tIG1vdiB1ZHRhIGF0b21zLgorCisyMDA5LTA0LTE1IDE1OjUxOjI0ICswMjAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSogZ3N0L2RlYnVndXRpbHMvZWZlbmNlLmg6CisJICBkZWJ1Z3V0aWxzOiBVc2UgR19CRUdJTl9ERUNMUy9HX0VORF9ERUNMUy4KKwkgIFVzZSBHX0JFR0lOX0RFQ0xTL0dfRU5EX0RFQ0xTIHRvIGF2b2lkIGdzdC1pbmRlbnQgbWVzc2luZyB1cCB0aGUKKwkgIGluZGVudGF0aW9uIGR1ZSB0byBleHRlcm4gIkMiIHsgfS4KKworMjAwOS0wNC0xNSAxNjowMzoyNyArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVidWd1dGlscy9NYWtlZmlsZS5hbToKKwkqIGdzdC9kZWJ1Z3V0aWxzL2JyZWFrbXlkYXRhLmM6CisJKiBnc3QvZGVidWd1dGlscy9kZWJ1Zy52Y3Byb2o6CisJKiBnc3QvZGVidWd1dGlscy9lZmVuY2UuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2VmZW5jZS5oOgorCSogZ3N0L2RlYnVndXRpbHMvZWZlbmNlLnZjcHJvajoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdGRlYnVnLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZpZ2F0aW9udGVzdC5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2aWdhdGlvbnRlc3QuaDoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdG5hdnNlZWsuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdG5hdnNlZWsuaDoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHB1c2hmaWxlc3JjLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RwdXNoZmlsZXNyYy5oOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0dGFnaW5qZWN0LmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuaDoKKwkqIGdzdC9kZWJ1Z3V0aWxzL25hdmlnYXRpb250ZXN0LnZjcHJvajoKKwkqIGdzdC9kZWJ1Z3V0aWxzL25lZ290aWF0aW9uLmM6CisJKiBnc3QvZGVidWd1dGlscy9wcm9ncmVzc3JlcG9ydC5jOgorCSogZ3N0L2RlYnVndXRpbHMvcHJvZ3Jlc3NyZXBvcnQuaDoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Rlc3RwbHVnaW4uYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Rlc3RzLmM6CisJKiBnc3QvZGVidWd1dGlscy90ZXN0cy5oOgorCSAgZGVidWc6IHJlbmFtZSBkZWJ1ZyB0byBkZWJ1Z3V0aWxzIHRvIGF2b2lkIGNsYXNoIHdpdGggLS1kaXNhYmxlLWRlYnVnLiBGaXhlcyAjNTYyMTY4CisKKzIwMDktMDQtMTUgMTU6NDM6MDQgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2RlYnVnL2VmZW5jZS5jOgorCSogZ3N0L2RlYnVnL2VmZW5jZS5oOgorCSogZ3N0L2RlYnVnL2dzdG5hdmlnYXRpb250ZXN0Lmg6CisJKiBnc3QvZGVidWcvZ3N0bmF2c2Vlay5oOgorCSogZ3N0L2RlYnVnL2dzdHB1c2hmaWxlc3JjLmg6CisJKiBnc3QvZGVidWcvZ3N0dGFnaW5qZWN0Lmg6CisJKiBnc3QvZGVidWcvcHJvZ3Jlc3NyZXBvcnQuaDoKKwkqIGdzdC9kZWJ1Zy90ZXN0cy5oOgorCSAgZGVidWc6IGluZGVudCBiZWZvcmUgcmVuYW1pbmcKKworMjAwOS0wNC0xNSAxNDowNzo1NyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYzoKKwkgIGc3MjZkZXBheTogYWRkIHByb3BlcnR5IGZvciBhYWwyIGZvcmNlCisKKzIwMDktMDQtMTUgMTM6NTY6MTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5oOgorCSAgZzcyNmRlcGF5OiBpbXBsZW1lbnQgUkZDMzU1MSBwYWNraW5nCisJICBXZSBpbXBsZW1lbnRlZCB0aGUgQUFMMiBwYWNraW5nLCBhZGQgdGhlIGVuY29kaW5nLW5hbWUgZm9yIHRob3NlIHRvIHRoZSBjYXBzIGFuZAorCSAgYSBwcm9wZXJ0eSB0byBmb3JjZSBBQUwyIGRlY29kaW5nIChhbHdheXMgVFJVRSBmb3Igbm93KS4KKwkgIEltcGxlbWVudCBSRkMzNTUxIHVucGFja2luZyBmb3IgcmVndWxhciBHNzI2LgorCSAgU2VlICM1NjcxNDAuCisKKzIwMDktMDQtMTUgMDA6MjI6NDMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5oOgorCSAgcnRwaDI2M3BheTogZml4IGJ1aWxkCisKKzIwMDktMDQtMTQgMTg6NTI6NDggKzAyMDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aSBhdCBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSAgaDI2M3BheTogdmFyaW91cyBmaXhlcworCSAgUmUtZW5hYmxlIG1vZGUgQSBzdXBwb3J0IGFuZCBhIHByb3BlcnR5IHRvIGNvbnRyb2wgaXQuCisJICBGaXggbWVtb3J5IGxlYWsgb2YgR3N0UnRwSDI2M1BheUJvdW5kcnkgb2JqZWN0cy4KKwkgIEZpeCBtYXJrZXIuCisJICBGaXhlcyAjNTA5MzExCisKKzIwMDktMDQtMTQgMTg6NDQ6NTEgKzAyMDAgIEphbmluIEtvbGVuYyA8amFuaW4ua29sZW5jIGF0IG1hcmFuZC5zaT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaDoKKwkgIGgyNjNwYXk6IEZpeCB0aGUgcGF5bG9hZGVyCisJICBGaXggdGhlIEgyNjMgcGF5bG9hZGVyIHRvIGJlIG1vcmUgUkZDIDIxOTAgY29tcGxpYW50LgorCSAgU2VlICM1MDkzMTEKKworMjAwOS0wNC0xNCAxNzoyNzowNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGRvbid0IHB1c2ggRU9TIGluIHN0cmVhbWluZyBtb2RlCisJICBJbiBzdHJlYW1pbmcgbW9kZSwgYXZpZGVtdXggaXMgbm90IHN1cHBvc2VkIHRvIHNlbmQgYW4gRU9TIGV2ZW50IGRvd25zdHJlYW0gYnV0CisJICBpdCBpcyBzdXBwb3NlZCB0byByZXR1cm4gVU5FWFBFQ1RFRCBmcm9tIHRoZSBjaGFpbiBmdW5jdGlvbiBpbnN0ZWFkIHNvIHRoYXQKKwkgIHVwc3RyZWFtIGNhbiBkbyB0aGUgcmlnaHQgRU9TIGhhbmRsaW5nLgorCisyMDA5LTA0LTEzIDE0OjAzOjAzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBtdXhpbmcvZGVtdXhpbmcgU3BlZXggYXVkaW8KKwkgIE5vdGU6IFRoaXMgaXMgbm90IGluIHRoZSBNYXRyb3NrYSBzcGVjIHlldAorCSAgRml4ZXMgYnVnICM1NzgzMTAuCisKKzIwMDktMDQtMTAgMjE6MzE6MDYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogaGFuZGxlIE5VTEwgdGltaW5nIGluZm8KKwkgIERvbid0IGNyYXNoIHdoZW4gdGhlIHRpbWluZyBpbmZvIGlzIG5vdCB5ZXQgYXZhaWxhYmxlLgorCisyMDA5LTA0LTEwIDIxOjQyOjEzICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkgIHB1bHNlOiBtYWtlIGl0IHdvcmsgb24gMC45LjEyCisJICBGaXJzdCB3ZSBpZ25vcmUgcmVxdWVzdCB0byBmaWxsIHRoZSByaW5nYnVmZmVyIHdoaWNoIGFyZSBsZXNzIHRoZW4gYSBzZWdtZW50LgorCSAgVGhlIHNtYWxsIHJlcXVlc3Qgd2hlcmUgY2F1c2luZyBzdHV0dGVyLgorCSAgVGhlbiB3ZSBkaXNhYmxlIGZsdXNoaW5nIHRoZSBzdHJlYW0gd2hlbiBydW5uaW5nIGFnYWluc3QgcGEgMC45LjEyIGFzIHRoaXMKKwkgIHRyaWdnZXJzIGFuIGFzc2VydGlvbmcgaW4gdGhlIHNvdW5kIHNlcnZlciBhbmQgdGVybWluYXRlcyBpdC4gSXQgZG9lcyBub3QgaGFwcGVuCisJICB3aXRoIDAuOS4xMCBhbmQgMC45LjE0LgorCisyMDA5LTA0LTEwIDE0OjE4OjQ4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGhhbmRsZSBzZXJ2ZXIgZGlzY29ubmVjdCBpbiBnZXRfdGltZQorCSAgV2hlbiB0aGUgc2VydmVyIGlzIGRpc2Nvbm5lY3RlZCBvciB3aGVuIHdlIGFyZSBzaHV0IGRvd24sIG1ha2Ugb3VyIGNsb2NrIHJldHVybgorCSAgYW4gaW52YWxpZCB0aW1lIGluc3RlYWQgb2YgZXJyb3Jpbmcgb3V0LgorCisyMDA5LTA0LTEwIDEyOjAxOjI3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGJwcyBpcyBzaWduZWQgaW50IHRvIGF2b2lkIG92ZXJmbG93CisJICBLZWVwIGJwcyBhcyBnaW50IGluc3RlYWQgb2YgZ3VpbnQgYmVjYXVzZSB3ZSB3aWxsIGJlIGRvaW5nIHNpZ25lZCBtYXRoIHdpdGggaXQKKwkgIGxhdGVyIG9uIGFuZCB3ZSBkb24ndCB3YW50IHdlaXJkIHJlc3VsdHMuCisKKzIwMDktMDQtMTAgMDA6MjY6NDQgKzAyMDAgIExSTiA8bHJuMTk4NiBhdCBnbWFpbC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBhZGQgY29udmVydCBxdWVyeSwgZml4IGR1cmF0aW9uIHF1ZXJ5CisJICBGaXggdGhlIGR1cmF0aW9uIHF1ZXJ5IHNvIHRoYXQgaXQgYWxzbyB3b3JrcyB3aXRoIGZvcm1hdHMgb3RoZXIgdGhhbgorCSAgVElNRSwgc3VjaCBhcyBERUZBVUxUIHRvIGdldCB0aGUgbnVtYmVyIG9mIGZyYW1lcy4KKwkgIEFkZCBhIGNvbnZlcnQgZnVuY3Rpb24uCisJICBGaXhlcyAjNTc4MDUyLgorCisyMDA5LTA0LTA5IDIzOjQzOjU4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGNoZWNrIGZvciBhIHN0cmVhbQorCSAgRG9uJ3QgdHJ5IHRvIGNoYW5nZSB0aGUgc3RyZWFtIHZvbHVtZSAoYW5kIG90aGVyIHRoaW5ncykgd2hlbiB3ZSBkb24ndCBoYXZlIGEKKwkgIHN0cmVhbSB5ZXQuIEp1c3Qgc3RvcmUgdGhlIHZhbHVlcyBmb3IgbGF0ZXIuCisKKzIwMDktMDQtMDkgMTg6MDc6MzggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogZml4IGNvbXBpbGF0aW9uIGZvciBuZXdlciBwdWxzZWF1ZGlvCisKKzIwMDktMDQtMDkgMTc6MTg6NTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogdW5jb3JrIGZpeGVzIGFuZCB1c2UgcHJlYnVmID0gMAorCSAgV2UgY2FuIHVzZSBwcmVidWYgPSAwIHRvIGluc3RydWN0IHB1bHNlIHRvIG5vdCBwYXVzZSB0aGUgc3RyZWFtIG9uIHVuZGVyZmxvd3MuCisJICBUaGlzIHdheSB3ZSBjYW4gcmVtb3ZlIHRoZSB1bmRlcmZsb3cgY2FsbGJhY2suIFdlIGhvd2V2ZXIgaGF2ZSB0byBtYW51YWxseQorCSAgdW5jb3JrIHRoZSBzdHJlYW0gbm93IHdoZW4gd2UgaGF2ZSBubyBhdmFpbGFibGUgc3BhY2UgaW4gdGhlIGJ1ZmZlciBvciB3aGVuIHdlCisJICBhcmUgd3JpdGluZyB0b28gZmFyIGF3YXkgZnJvbSB0aGUgY3VycmVudCByZWFkX2luZGV4LgorCisyMDA5LTA0LTA5IDE0OjM4OjE3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGhhbmRsZSB3cml0ZSBlcnJvcnMKKworMjAwOS0wNC0wOSAxNDoxNjozNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiB3cml0ZSBzaWxlbmNlIG9uIHVuZGVyZmxvdworCSAgU3RhcnQgZmlsbGluZyB1cCB0aGUgYnVmZmVyIHdpdGggZW1wdHkgc2FtcGxlcyB3aGVuIGFuIHVuZGVyZmxvdyBoYXBwZW5zLiBXZQorCSAgbmVlZCB0byBkbyB0aGlzIHRvIGtlZXAgcHVsc2VhdWRpbyByZXBvcnRpbmcgdGhlIHJpZ2h0IHRpbWUgZm9yIHVzLgorCisyMDA5LTA0LTA5IDEzOjE0OjE0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGhhbmRsZSBwdWxsLWJhc2VkIHNjaGVkdWxpbmcKKwkgIFVzZSB0aGUgZGVmYXVsdCBiYXNlc2luayBtZXRob2RzIGZvciBpbXBsZW1lbnRpbmcgcHVsbCBiYXNlZCBzY2hlZHVsaW5nLCBpdAorCSAgd29ya3MgZmluZSBmb3IgdXMuCisKKzIwMDktMDQtMDkgMTI6MTM6NDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogYWRkIGJlZ2lubmluZ3Mgb2YgcHVsbC1iYXNlZCBzY2hlZHVsaW5nCisKKzIwMDktMDQtMDggMTg6MTc6MTAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazoga2VlcCB0cmFjayBvZiBjbG9jayByZXNldAorCSAgd2hlbiB3ZSBzd2l0Y2ggc3RyZWFtcywgdGhlIGNsb2NrIHdpbGwgcmVzZXQgdG8gMC4gTWFrZSBzdXJlIHRoYXQgdGhlIHByb3ZpZGVkCisJICBjbG9jayBkb2Vzbid0IGdldCBzdHVjayB3aGVuIHRoaXMgaGFwcGVucyBieSBrZWVwaW5nIGFuIGluaXRpYWwgb2Zmc2V0LiBXZSBhbHNvCisJICBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHN1YnRyYWN0IHRoaXMgb2Zmc2V0IGluIHNhbXBsZXMgd2hlbiB3cml0aW5nIHRvIHRoZQorCSAgcmluZ2J1ZmZlci4KKworMjAwOS0wNC0wOCAxMzo1Mjo0MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSAgcHVsc2VzaW5rOiByZXdyaXRlIHB1bHNlc2luaworCSAgRGVyaXZlIGZyb20gQmFzZUF1ZGlvU2luayBhbmQgaW1wbGVtZW50IG91ciBjdXN0b20gcmluZ2J1ZmZlciB0aGF0IG1hcHMgdG8gdGhlCisJICBpbnRlcm5hbCBwdWxzZWF1ZGlvIHJpbmdidWZmZXIuCisKKzIwMDktMDQtMDggMTM6NTI6MDAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkgIHB1bHNlOiByZW1vdmUgc29tZSBzdHJheSBkZWJ1ZyBsaW5lcworCisyMDA5LTA0LTA5IDExOjMwOjU5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAganBlZ2RlYzogdXNlIHNsaWdodGx5IG1vcmUgYWRhcHRpdmUgZm9ybXVsYSBmb3IgUW9TCisJICBTaG91bGQgd29yayBhdCBsZWFzdCBhIHRhZCBiZXR0ZXIgaWYgdGhlIGRlY29kZXIgY2FuJ3Qga2VlcCB1cCwgYW5kCisJICBzaG91bGQgYWxzbyBzcHJlYWQgZHJvcHBlZCBmcmFtZXMgYSBiaXQgbW9yZSBldmVubHkgb3ZlciB0aW1lLgorCisyMDA5LTA0LTA3IDIyOjM1OjMxICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IGRvbid0IGxlYWsgcGFkLXRlbXBsYXRlCisJICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlKCkgZG9lcyBub3QgdGFrZSBvd25lcnNoaXAuCisKKzIwMDktMDQtMDQgMjE6MTg6NTUgKzAzMDAgIEZlbGlwZSBDb250cmVyYXMgPGZlbGlwZS5jb250cmVyYXNAZ21haWwuY29tPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZDBlYTg5ZSB0byBiMzk0MWVhCisKKzIwMDktMDQtMDEgMDE6MTU6MzEgKzAyMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuaDoKKwkgIGFkZCBwZW5kaW5nX3NhbXBsZXMgc28gdGhhdCB3ZSBvbmx5IHVwZGF0ZSBzZWdtZW50J3MgbGFzdCBzdG9wIGFmdGVyIHJlYWxseSBzZW5kaW5nIHRoZSBzYW1wbGVzCisKKzIwMDktMDMtMTUgMjE6MzE6NDkgKzAxMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy9mbGFjZGVjLmM6CisJICBhZGQgZGVidWcgYW5kIGFuIGFzc2VydAorCisyMDA5LTAzLTE1IDIxOjMwOjMyICswMTAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXMgKGF0KSBhcGVzdGFhcnQgKGRvdCkgb3JnPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBhZGQgZGVidWdnaW5nCisKKzIwMDktMDMtMDMgMTA6MTQ6MDIgKzAxMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svYXVkaW90ZXN0c3JjLmZsYWM6CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvZmxhY2RlYy5jOgorCSAgYWRkIGEgdGVzdCB0byBjaGVjayB0aGF0IHdlIGdldCBhbGwgZGVjb2RlZCBieXRlcyBmcm9tIGEgMTAtYnVmZmVyIGF1ZGlvdGVzdHNyYyBmbGFjLCBpbiB0aGUgY2FzZSBvZjogIC0gYSBmdWxsIGRlY29kZSAgLSBhIGRlY29kZSBvZiBhIHNlZWsgZm9yIHRoZSBmdWxsIGZpbGUgIC0gYSBkZWNvZGUgb2YgYSBzZWVrIGZvciBhIHNtYWxsIHBhcnQsIHNtYWxsZXIgdGhhbiB0aGUgZmlyc3QgYnVmZmVyCisJICBUaGUgdGVzdCBmYWlscyBiZWNhdXNlIGZsYWNkZWMgZHJvcHMgdGhlIGZpcnN0IG91dGdvaW5nIGJ1ZmZlciBvbiBhIHNlZWsKKworMjAwOS0wMy0wMyAxMDowNjo1MiArMDEwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIChhdCkgYXBlc3RhYXJ0IChkb3QpIG9yZz4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgY2xpcHBpbmcgc2hvdWxkIGFsc28gd29yayBpZiBpdCdzIGRvbmUgb24gdGhlIGZpcnN0IGJ1ZmZlciBzdGFydGluZyBhdCAwCisKKzIwMDktMDQtMDQgMTQ6NTQ6MDEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBmOGIzZDkxIHRvIGQwZWE4OWUKKworMjAwOS0wNC0wMyAwOTo1NzoxNSArMDEwMCAgWmFoZWVyIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvTEVHQUw6CisJICBGaXggZ3JhbW1hci4KKworMjAwOS0wNC0wMiAyMjo0MTowMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYWxsb3cgaHR0cDovLyBvbiB0aGUgcHJveHkgc2V0dGluZworCSAgQWxsb3cgYW5kIGlnbm9yZSBodHRwOi8vIGF0IHRoZSBzdGFydCBvZiB0aGUgcHJveHkgc2V0dGluZywgbGlrZQorCSAgc291cGh0dHBzcmMuCisJICBGaXhlcyAjNTczMTczCisKKzIwMDktMDQtMDIgMjE6MDg6NDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGRvbid0IGxlYWsgdGhlIHVkcHNyYyBwYWQKKwkgIEZpeCBtZW1vcnkgbGVhayBpbiBydHNwc3JjIGJlY2F1c2Ugd2UgZGlkbid0IHVucmVmIHRoZSB1ZHBzcmMgcGFkLgorCSAgU2VlICM1NzczMTgKKworMjAwOS0wNC0wMSAxNzozMToxOCAtMDcwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHNvbmdiaXJkbmVzdC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJICBydHB0aGVvcmFwYXk6IGZpeCBsZW5ndGggZW5jb2RpbmcgaW4gcGFja2VkIGhlYWRlcnMuCisJICBBcyBmb3Igdm9yYmlzIHBheWxvYWRlcjsgdGhpcyBieSBpbnNwZWN0aW9uIGhhZCB0aGUgc2FtZSBidWcuCisKKzIwMDktMDQtMDEgMTc6MjM6MzMgLTA3MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEBzb25nYmlyZG5lc3QuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSAgcnRwdm9yYmlzcGF5OiBpbiBwYWNrZWQgaGVhZGVycywgcHJvcGVybHkgZmxhZyBtdWx0aWJ5dGUgbGVuZ3Rocy4KKwkgIEluIHRoZSBzZXF1ZW5jZSBvZiBoZWFkZXIgbGVuZ3RocywgZm9yIGhlYWRlcnMgPjEyNyBieXRlcywgd2UgdXNlCisJICBtdWx0aXBsZSBieXRlcyB0byBlbmNvZGUgdGhlIGxlbmd0aC4gQnl0ZXMgb3RoZXIgdGhhbiB0aGUgbGFzdCBtdXN0IGhhdmUKKwkgIHRoZSB0b3AgKGZsYWcpIGJpdCBzZXQuCisKKzIwMDktMDQtMDIgMDA6MjA6MDIgKzAxMDAgIEpvbmF0aGFuIE1hdHRoZXcgPGpvbmF0aGFuQGQxNG4ub3JnPgorCisJKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzdjJtdXguYzoKKwkgIGlkM3YybXV4OiB3cml0ZSBSVkEyIGZyYW1lcyBjb250YWluaW5nIHBlYWsvZ2FpbiB2b2x1bWUgZGF0YQorCisyMDA5LTA0LTAyIDAwOjA1OjE0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAganBlZ2RlYzogZGVtb3RlIHNvbWUgbG9nIG1lc3NhZ2UgZnJvbSBERUJVRyB0byBMT0cKKwkgIEFuZCBsb2cgZGVjb2RlciBvYmplY3QuCisKKzIwMDktMDQtMDEgMjE6MTU6MDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmg6CisJICBqcGVnZGVjOiBpbXBsZW1lbnQgYmFzaWMgUW9TCisJICBEb24ndCBkZWNvZGUgZnJhbWVzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIHRvbyBsYXRlIGFueXdheS4KKworMjAwOS0wNC0wMSAxMjoyNjoxMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGRvbid0IGVtaXQgdWdseSB3YXJuaW5ncyB3aXRoIG9sZGVyIHJ0cGppdHRlcmJ1ZmZlciB2ZXJzaW9ucworCSAgVGhlIG9uLW5wdC1zdG9wIHNpZ25hbHMgd2FzIGFkZGVkIG9ubHkgcmVjZW50bHkgdG8gcnRwaml0dGVyYnVmZmVyIGluCisJICAtYmFkLCBzbyBjaGVjayBpZiB0aGUgc2lnbmFsIGV4aXN0cyBiZWZvcmUgZ19zaWduYWxfY29ubmVjdCgpaW5nIHRvCisJICBpdCwgdG8gYXZvaWQgd2FybmluZ3MuCisKKzIwMDktMDMtMzEgMTk6MDg6MzcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IGFkZCBwcm94eSBzdXBwb3J0CisKKzIwMDktMDMtMzEgMTc6MTY6MDQgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2E6IGRvbid0IGxlYWsgc2VyaWFsaXplZCB2YWx1ZXMgd2hlbiB3cml0aW5nIHRhZ3MKKworMjAwOS0wMy0zMSAxNzowNjo1MCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thOiBkb24ndCBhbHRlciBwYXNzZWQgZGF0YSBhbmQgZXNwZWNpYWx5IGRvbid0IGxlYWsuCisJICBJZiB3ZSBuZWVkIGRpZmZlcmVudCBzaXplLCBNYWtlIGEgY29weSwgd29yayB3aXRoIHRoYXQgYW5kIGZyZWUgaXQuCisKKzIwMDktMDMtMzEgMTY6NDI6MTUgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2dvb20vcGx1Z2luX2luZm8uYzoKKwkgIGdvb206IHRoZSBzdHJ1Y3R1cmUgaXMgbm90IGZ1bGx5IGluaXRpYWxpemVkLCBidXQgdGhlIGNvcGllZC4KKwkgIFNldCB0byBmdWxseSB0byAwIHRvIGF2b2lkIGNyZWVwIG9mIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLgorCisyMDA5LTAzLTMxIDE2OjI1OjU4ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thOiBpbml0IGVuZGlhbmVzcyBhcyBzdWNoIGFuZCBzaWduZWRuZXNzIGFzIGJvb2xlYW4uCisKKzIwMDktMDMtMzEgMTY6MjI6NDIgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZG9uJ3QgdXNlIGluaW5pdGlhbGl6ZWQgdmFyIGluIGRlYnVnIGxvZyBzdGF0ZW1lbnQKKwkgIEFsc28gbWFrZSB0aGUgbG9nIHN0YXRlbWVudCB1c2VmdWwgYnkgcHJpbnRpbmcgdGhlIGh1bWFuIHJlYWRhYmxlIGZvcm1hdCBuYW1lLgorCisyMDA5LTAzLTMxIDEyOjAxOjIxICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGRvbid0IGxlYWsgYXRvbSBkYXRhIGluIGNhc2Ugb2YgYSB3cm9uZyBmb3VyY2MKKworMjAwOS0wMy0zMSAxMTo1NzozNiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thOiBkb24ndCBsZWFrIHJlYWQgZGF0YSBpbiBkZW11eGVyCisKKzIwMDktMDMtMzEgMTE6NTA6NDEgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwOiBkb24ndCB1c2UgcHJvdG9jb2wgaW4gZGVidWcgbWVzc2FnZSBhZnRlciBmcmVlaW5nCisKKzIwMDktMDMtMzAgMTQ6MTA6MTUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSAgcnRwbXA0YWRlcGF5OiBvdXRwdXQgc2hvdWxkIGJlIGZyYW1lZCBhbHJlYWR5CisKKzIwMDktMDMtMjcgMjE6MTc6MDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuaDoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuaDoKKwkgIGZsYWM6IHJlcXVpcmUgYSAnbmV3ZXInIGZsYWMgYW5kIHJlbW92ZSBzdXBwb3J0IGZvciB0aGUgbGVnYWN5IGZsYWMgQVBJCisKKzIwMDktMDMtMjcgMTc6NDg6MTMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGxpbmsgdG8gdGhlIG9uX25wdF9zdG9wIHNpZ25hbCB0byBFT1MKKwkgIENvbm5lY3QgdG8gdGhlIG9uX25wdF9zdG9wIHNpZ25hbCBvZiB0aGUgc2Vzc2lvbiBtYW5hZ2VyIHRvIHNjaGVkdWxlIHRoZSBFT1MKKwkgIGFjdGlvbnMuCisKKzIwMDktMDMtMjYgMTQ6Mzk6MDYgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBzb21lIHN0cmVhbSBzeW5jaHJvbml6YXRpb24gdG8gYWlkIHNlZWtpbmcgaW4gdW5iYWxhbmNlZCBjbGlwcworCSAgU29tZSBjbGlwcyAodHJhaWxlcnMpIG1heSBoYXZlIChsZW5ndGgtd2lzZSkgdW5iYWxhbmNlZCBzdHJlYW1zLAorCSAgd2hpY2ggc3RhbGxzIHRoZSBwaXBlbGluZSBpZiBzZWVraW5nIGludG8gdGhhdCByZWdpb24uCisJICBBZGRpdGlvbmFsIHN0cmVhbSBzeW5jaHJvbml6YXRpb24gY2FuIGhhbmRsZSB0aGlzLCBhcyB3ZWxsIGFzCisJICBzcGFyc2UgKHN1YnRpdGxlKSBzdHJlYW1zIChhdCBzb21lIGxhdGVyIHRpbWUgPykKKworMjAwOS0wMy0yNiAxMDozMToxOCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFkZGl0aW9uYWwgc2FmZXR5IGFuZCBzYW5pdHkgY2hlY2tzIChwdXNoIGJhc2VkIG1vZGUpCisKKzIwMDktMDMtMjYgMTA6MTg6MzEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIHZpZGVvbWl4ZXI6IHNvbWUgbW9yZSBpbmRlbnQgZml4ZXMKKworMjAwOS0wMy0yNCAxNjowMDo1OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogZml4IGdzdC1pbmRlbnQgc2NyZXd1cAorCisyMDA5LTAzLTI1IDE3OjU0OjM1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcC5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogcG8vUE9URklMRVMuaW46CisJICBydHNwc3JjOiBiZXR0ZXIgZXJyb3IgbWVzc2FnZSB3aGVuIHRoZSBSVFNQIGV4dGVuc2lvbiBmb3IgUmVhbCBzdHJlYW1zIGlzIG1pc3NpbmcKKwkgIFRyeSB0byBwb3N0IGEgZGVjZW50IGVycm9yIG1lc3NhZ2Ugd2hlbiBpdCBsb29rcyBsaWtlIHdlJ3JlIGZhaWxpbmcKKwkgIGJlY2F1c2UgdGhlIFJlYWwgUlRTUCBleHRlbnNpb24gcGx1Z2luIGlzIG1pc3NpbmcuIEFsc28gYWRkIGkxOG4KKwkgIGJpdHMgZm9yIHJ0c3BzcmMgc28gb3VyIGVycm9yIG1lc3NhZ2VzIGdldCB0cmFuc2xhdGVkLgorCisyMDA5LTAzLTI1IDE1OjQyOjE1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmkuYzoKKwkqIGdzdC9xdGRlbXV4L3F1aWNrdGltZS5jOgorCSAgaTE4bjogbWFrZSBzdXJlIGdldHRleHQgZ2l2ZXMgdXMgVVRGLTggYXQgYWxsIHRpbWVzCisKKzIwMDktMDMtMjUgMDE6Mjg6MzggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJICBydHBtcDRhcGF5LHJ0cG1wNGRlcGF5OiBmaXggYnVmZmVyIGxlYWtzIGluIEFBQyBwYXlsb2FkZXIgYW5kIGRlcGF5bG9hZGVyCisKKzIwMDktMDMtMjUgMDE6MjI6MTcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFwYXkuYzoKKwkgIHJ0cG1wNGFwYXk6IHdhcm4gaWYgaW5wdXQgaXMgdW5mcmFtZWQKKworMjAwOS0wMy0yMiAyMToyMDo1NyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkgIGpwZWdkZWM6IHB1dCBHc3RTZWdtZW50IGluc2lkZSB0aGUgZWxlbWVudCBzdHJ1Y3QgaW5zdGVhZCBvZiBhbGxvY2F0aW5nIGl0IHNlcGFyYXRlbHkKKworMjAwOS0wMy0yNSAxMDowODo0MSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICB2NGwyc3JjOiBtb3ZlIGR1cGxpY2F0ZWQgdGltZXN0YW1waW5nIGFuZCBidWZmZXIgbWV0YWRhdGEgY29kZSB0byBfY3JlYXRlKCkKKwkgIFRoaXMgd2lsbCBpbmNsdWRlIHRoZSBsYXRlbmN5IGNoYW5nZXMgYWxzbyBpbiB0aGUgbW1hcCBjYXNlLgorCisyMDA5LTAzLTI1IDEwOjA2OjQ4ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDJzcmM6IHJlbW92ZSB3aW4zMiBpZmRlZnMgaW50cm9kdWNlZCBieSBjb21taXQgY2ZmM2Y0Njc2MGVhYzc0YzliYmQ3YTM2YWNhNDRmZWRmMzI3NDI0YgorCSAgVjRsMnNyYyBpcyB1bmRlciBzeXMgYW5kIGRvZXMgbm90IGV4aXN0cy9ydW4gdW5kZXIgd2luZG93cyBhbnl3YXkuCisKKzIwMDktMDMtMjQgMTU6NDQ6NDIgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBoYW5kbGUgRkxVU0hfU1RPUCBldmVudAorCSAgQ2xlYW4gdXAgc29tZSBzdGF0ZSAobW9zdCBub3RhYmx5IHBhZCBmbG93IHJldHVybnMpIHRvIHJlc3VtZQorCSAgcHJvcGVyIHN0cmVhbWluZyBmb2xsb3dpbmcgZmx1c2hpbmcgc2Vlay4KKworMjAwOS0wMy0yNCAxMjo0MjoxMyArMDEwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZGVjaW5hQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGRvbid0IHBvc3QgYW4gZXJyb3IgaWYgRU9TIGNhbid0IGJlIHB1c2hlZCBkb3duc3RyZWFtLgorCSAgVGhpcyBhbGlnbnMgYXZpZGVtdXggd2l0aCBvdGhlciBkZW11eGVycyBhbmQgZml4ZXMgYSBidWcgdXNpbmcgYXZpZGVtdXgKKwkgIHdpdGggYSByZWNlbnQgZ25vbmxpbi4KKworMjAwOS0wMy0yMyAxMToyMjowOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBjbGVhbiB1cCB0aGUgc3RhdGUgY2hhbmdlIGZ1bmN0aW9uCisJICBNYWtlIHRoZSBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24gYSBiaXQgbW9yZSByZWFkYWJsZSBhbmQgb25seSBwYXVzZSBhZnRlciB0aGUKKwkgIHBhcmVudCBoYWQgYSBjaGFuZ2UgdG8gcGF1c2UgZmlyc3QuCisKKzIwMDktMDMtMDkgMjM6NDM6NTUgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2R0bWYvTWFrZWZpbGUuYW06CisJICBNYWtlZmlsZS5hbTogbm8gc3RhdGljIGxpYnMgZm9yIHBsdWdpbnMKKworMjAwOS0wMy0yMCAxNzoyMjozMiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHN1cHBvcnQgc2Vla2luZyBpbiBwdXNoIGJhc2VkIG1vZGUKKworMjAwOS0wMy0yMCAxNzoxMTozOSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFsaWduIHB1c2ggYmFzZWQgYmVoYXZpb3VyIG1vcmUgd2l0aCBwdWxsIGJhc2VkCisJICBDYXRlciBmb3IgREVMVEFfVU5JVCBmbGFnIG9uIGJ1ZmZlcnMsIGtlZXAgdHJhY2sgb2YgY3VycmVudAorCSAgcG9zaXRpb24sIHJlbW92ZSBhbmQgd2FybiBhYm91dCBlZGl0IGxpc3RzIGlmIGFueSAoYXMgdGhvc2UKKwkgIGFzIGFyZSBkZSBmYWN0byBkaXNjYXJkZWQgYW55d2F5KSwgYWRkIHNvbWUgZGVidWcgc3RhdGVtZW50cworCSAgYW5kIGluZGVudCBmaXhlcy4KKworMjAwOS0wMy0yMCAxNzowMzowMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBtZW0gbGVha3MgYW5kIHByZXZlbnQgZXhjZXNzaXZlIGJ1ZmZlcmluZyBpbiBwdXNoIGJhc2VkIG1vZGUKKworMjAwOS0wMy0yMCAxMzoyNzo1OSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJICBwdWxzZXNpbms6IFRyYWNrIHRoZSBjb3JrZWQvdW5jb3JrZWQgc3RhdGUgb3Vyc2VsdmVzCisJICBVc2UgYW4gaW5zdGFuY2UgdmFyaWFibGUgdG8gdHJhY2sgd2hldGhlciB0aGUgc3RyZWFtIGlzIGNvcmtlZCBvciBub3QsCisJICBpbnN0ZWFkIG9mIHVzaW5nIFBBIEFQSSB0aGF0IHdhcyBvbmx5IGludHJvZHVjZWQgaW4gMC45LjExCisKKzIwMDktMDMtMTkgMTg6Mzk6MDQgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2U6IE1ha2Ugc3VyZSB0aGUgc3RyZWFtIGlzIHVuY29ya2VkIGluIHRoZSB3cml0ZSBmdW5jdGlvbgorCSAgSWYgdGhlIGNhcHMgY2hhbmdlcywgdGhlIHNpbmsgaXMgcmVzZXQgd2l0aG91dCB0cmFuc2l0aW9uaW5nIHRocm91Z2gKKwkgIGEgUEFVU0VELT5QTEFZSU5HIHN0YXRlIGNoYW5nZSwgcmVzdWx0aW5nIGluIGEgY29ya2VkIHN0cmVhbS4gVGhpcyBhdm9pZHMKKwkgIHRoZSBwcm9ibGVtIGJ5IGNoZWNraW5nIHRoYXQgdGhlIHN0cmVhbSBpcyB1bmNvcmtlZCB3aGVuIHdyaXRpbmcgc2FtcGxlcworCSAgdG8gaXQuCisKKzIwMDktMDMtMjAgMDE6MDI6MjYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkgIHNwZWV4ZW5jOiBmaXggZGlyZWN0aW9uIG9mIGxhdGVuY3kgcXVlcnkgYW5kIG90aGVyIHVwc3RyZWFtIHF1ZXJpZXMKKwkgIERvbid0IHNlbmQgcXVlcmllcyBiYWNrIHRvIHRoZSBlbGVtZW50IHRoZXkganVzdCBjYW1lIGZyb20gYnkgc2VuZGluZworCSAgdGhlbSB0byB0aGUgcGVlciBvZiB0aGUgd3JvbmcgcGFkLgorCisyMDA5LTAzLTE5IDExOjEwOjQwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogLmdpdGlnbm9yZToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJICAuZ2l0aWdub3JlOiBpZ25vcmUgbW9yZQorCisyMDA5LTAzLTE4IDE2OjU1OjI3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzoKKwkgIHJ0cG1wNGFkZXBheTogZG9uJ3QgYXBwZW5kIGFuIGV4dHJhIDAgYnl0ZSB0byB0aGUgY29kZWMgZGF0YQorCSAgVGhlIGF1ZGlvTXV4VmVyc2lvbiBzdHJ1Y3R1cmUgaXMgcGFja2VkIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUgY29kZWMKKwkgIGRhdGEgZG9lcyBub3Qgc3RhcnQgYnl0ZS1hbGlnbmVkLCB3aGljaCBtZWFucyB0aGVyZSdzIGFuIGV4dHJhIGJpdCBvZgorCSAgcGFkZGluZyBhdCB0aGUgZW5kLiBXZSBkb24ndCB3YW50IHRoYXQgYml0IGluIHRoZSBjb2RlYyBkYXRhLCBzaW5jZQorCSAgc29tZSBkZWNvZGVycyBzZWVtIGdldCBjb25mdXNlZCB3aGVuIHRoZXkncmUgZmVkIHdpdGggYW4gZXh0cmEgY29kZWMKKwkgIGRhdGEgYnl0ZSAoYWxzbyBpdCdzIGp1c3Qgbm90IHJpZ2h0IG9mIGNvdXJzZSkuCisKKzIwMDktMDMtMTkgMTM6MjU6NTcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICBydHBoMjY0ZGVwYXk6IGZpeCBiYXNlNjQgZGVjb2RpbmcKKwkgIFdlIGNhbid0IHBhc3MgLTEgdG8gX2RlY29kZV9zdGVwLCB0aGF0IGZ1bmN0aW9ucyByZXR1cm5zIDAgcmlnaHQgYXdheSBpbnN0ZWFkIG9mCisJICBkZWNvZGluZyB1cCB0byB0aGUgc3RyaW5nIGVuZC4KKworMjAwOS0wMy0xOSAxMzoyNDowMiArMDEwMCAgRGF2aWQgQWRhbSA8emFuY2hleSBhdCB1Y2MuZ3UudXdhLmVkdS5hdT4KKworCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSAgdWRwOiBGaXggYnVpbGQgaWYgb24gU29sYXJpcworCSAgVGhpcyBwYXRjaCBjaGVja3MgZm9yIFNvbGFyaXMgYW5kIHVzZXMgaXBfbXJlcSBpbnN0ZWFkIG9mIGlwX21yZXFuIGlmIG9uIHRoaXMKKwkgIHBsYXRmb3JtLgorCSAgRml4ZXMgIzU3NTkzNy4KKworMjAwOS0wMy0xOCAxNDo1MDoxNyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSAgcnRwOiBVc2UgR0xpYiBmdW5jdGlvbnMgZm9yIGVuY29kaW5nL2RlY29kaW5nIGJhc2U2NAorCisyMDA5LTAzLTE2IDE5OjE3OjI0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBhZGQgc29tZSBkZWJ1ZyBmb3IgdGhlIHRpbWVzdGFtcHMKKwkgIFdoZW4gdGltZXN0YW1waW5nIGluIFRDUCBtb2RlLCBsb2cgdGhlIGZpcnN0IHRpbWVzdGFtcCB3ZSBwdXQgb24gdGhlIGJ1ZmZlcnMuCisKKzIwMDktMDMtMTUgMjM6MjY6NTYgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSAgdjRsMnNyYzogbG9nIGRldGFpbHMgaWYgd2UgaGF2ZSB0aGVtLCBuZWVkZWQgZm9yICM1NzUzOTEKKworMjAwOS0wMy0xMyAxODozMjo0NyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogY29udmVydCBfIGluIHByb3BlcnRpZXMgdG8gLQorCSAgLS0KKworMjAwOS0wMy0xMyAxODoyODo1OSArMDEwMCAgRWRnYXIgRS4gSWdsZXNpYXMgPGVkZ2FyLmlnbGVzaWFzQGdtYWlsLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuaDoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCSAgdWRwc3JjOiBBZGQgbmV0d29yayBpbnRlcmZhY2Ugc2VsZWN0aW9uCisJICBBZGQgbmV0d29yayBpbnRlcmZhY2Ugc2VsZWN0aW9uIHdoZW4gam9pbmluZyBtdWx0aWNhc3QgZ3JvdXBzLgorCSAgVXNlZnVsIHdoZW4gdXNpbmcgdGhlIHVkcHNyYyBvbiBtdWx0aWhvbWVkIGhvc3RzLgorCSAgRml4ZXMgIzU3NTIzNC4KKwkgIEFQSTogR3N0VURQU3JjOjptdWx0aWNhc3QtaWZhY2UKKworMjAwOS0wMy0xMyAxNTo0Mzo1MiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyc3JjOiBQcmVwZW5kIHRvIGxpc3RzIGFuZCByZXZlcnNlIHRoZW0gYXQgdGhlIGVuZC4KKwkgIEdyYXR1aXRvdXMgbWljcm8tb3B0aW1pc2F0aW9uIC0gcHJlcGVuZCB0byBsaXN0cyBhbmQgcmV2ZXJzZSB0aGVtLCByYXRoZXIKKwkgIHRoYW4gYXBwZW5kaW5nIHRvIHRoZW0gZWFjaCB0aW1lLgorCisyMDA5LTAzLTEzIDE1OjQwOjUwICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogV2FpdCB1bnRpbCB0aGVyZSBpcyBlbm91Z2ggcm9vbSB0byB3cml0ZSBhbiBlbnRpcmUgc2VnbWVudAorCSAgV2hlbiB0cnlpbmcgdG8gd3JpdGUgb3V0IGEgc2VnbWVudCwgd2FpdCB1bnRpbCB0aGVyZSBpcyBlbm91Z2ggZnJlZSBzcGFjZQorCSAgZm9yIHRoZSBlbnRpcmUgc2VnbWVudC4gVGhpcyBoZWxwcyB0byByZWR1Y2UgcmlwcGxlIGluIHRoZSBjbG9jayByZXBvcnRpbmcsCisJICB3aGVyZSB0aGUgYXBwIG1pZ2h0IHF1ZXJ5IHRoZSBwbGF5YmFjayBwb3NpdGlvbiB3aGlsZSBvbmx5IGhhbGYgYSBzZWdtZW50CisJICBoYXMgYmVlbiB3cml0dGVuIChhbmQgaXMgdGhlcmVmb3JlIHJlcG9ydGVkIGJ5IF9kZWxheSgpLCBldmVuIHRob3VnaAorCSAgdGhlIHJpbmcgYnVmZmVyIGhhcyBub3QgeWV0IGJlZW4gYWR2YW5jZWQpCisKKzIwMDktMDMtMTIgMjA6Mzg6NDIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGRvbid0IHNlbmQgUEFVU0Ugd2hlbiBub3QgY29ubmVjdGVkCisJICBkb24ndCBzZW5kIGEgUEFVU0UgcmVxdWVzdCB3aGVuIHdlIGFyZSBubyBsb25nZXIgY29ubmVjdGVkLgorCisyMDA5LTAzLTEyIDE2OjEwOjI1ICswMTAwICBMYXN6bG8gUGFuZHkgPGxhc3psb2syQGdtYWlsLmNvbT4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgRG9uJ3QgY2FsbCBGTEFDX18gbWV0aG9kcyBiZWZvcmUgaXQncyBpbml0aWFsaXplZC4gRml4ZXMgIzUxNjAzMQorCSAgSW4gdGhlIGV2ZW50IGhhbmRsZXIsIGdzdF9mbGFjX2RlY19zaW5rX2V2ZW50KCksIHR3byBmdW5jdGlvbnMgYXJlIGNhbGxlZCBvbgorCSAgdGhlIEZMQUMgc3RyZWFtIHdpdGhvdXQgY2hlY2tpbmcgaWYgaXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQ6CisJICBGTEFDX19zdHJlYW1fZGVjb2Rlcl9mbHVzaCgpCisJICBGTEFDX19zdHJlYW1fZGVjb2Rlcl9wcm9jZXNzX3VudGlsX2VuZF9vZl9zdHJlYW0oKQorCSAgQm90aCB0aGVzZSBGTEFDX18qKCkgZnVuY3Rpb25zIG1vZGlmeSB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIEZMQUMgc3RyZWFtLgorCSAgTGF0ZXIsIHdoZW4gdGhlIGJ1ZmZlcnMgc3RhcnQgZmxvd2luZywgZ3N0X2ZsYWNfZGVjX2NoYWluKCkgdHJpZXMgdG8gaW5pdGlhbGl6ZQorCSAgdGhlIHN0cmVhbS4gdGhlIEZMQUNfX3N0cmVhbV9kZWNvZGVyX2luaXRfc3RyZWFtKCkgY2FsbCB3aWxsIGZhaWwgYmVjYXVzZSB0aGUKKwkgIHByZXZpb3VzIGNhbGxzIHRvIEZMQUNfXyooKSBjaGFuZ2VkIHRoZSBzdHJlYW0gc3RhdGUgc28gaXQgaXMgbm8gbG9uZ2VyIGluIHRoZQorCSAgaW5pdGlhbGl6ZWQgc3RhdGUuCisKKzIwMDktMDMtMTEgMTc6NTk6MDAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGZpeCB0aW1lb3V0IGNoZWNrCisJICAtLS0KKworMjAwOS0wMy0xMSAxMjo0ODowMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHdpbjMyL01BTklGRVNUOgorCSAgd2luMzI6IHVwZGF0ZSBNQU5JRkVTVCwgZml4aW5nICdtYWtlIGRpc3QnCisJICBjb25maWcuaC5pbiBubyBsb25nZXIgZXhpc3RzLgorCisyMDA5LTAzLTEwIDIxOjE0OjQzICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tdWx0aXBhcnQvTWFrZWZpbGUuYW06CisJICBtYWtlZmlsZTogZml4IHR5cG8gaW4gbm8tc3RhdGljIHBsdWdpbnMgcnVsZQorCisyMDA5LTAzLTEwIDExOjAxOjE2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgcG5nZGVjOiB2YXJpb3VzIGNsZWFudXBzLgorCSAgTWFrZSBzb21lIGNvZGUgbW9yZSByZWFkYWJsZS4KKwkgIEZpeCBhIGxlYWsgd2hlbiBwdWxsIHJhbmdlIHJldHVybnMgYSBzaG90IGJ1ZmZlci4KKwkgIFB1c2ggRU9TIGFmdGVyIHBvc3RpbmcgdGhlIGVycm9yLgorCisyMDA5LTAzLTEwIDEwOjE2OjI3ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJICBnc3RydHB2b3JiaXNkZXBheTogRml4IGJ1aWxkIG9uIG1hY29zeAorCisyMDA5LTAzLTAxIDE3OjM3OjU2ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiAuZ2l0aWdub3JlOgorCSAgLmdpdGlnbm9yZTogSWdub3JlIG00IGRpcmVjdG9yeQorCisyMDA5LTAzLTA5IDIzOjEyOjMzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA3MDMyMTYzIHRvIGY4YjNkOTEKKworMjAwOS0wMy0wOSAxODowNzoyMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOgorCSAgdm9yYmlzZGVwYXk6IGZpeCBzb21lIGxlYWtzCisJICBBbmQgbGVhayB0aGUgY29kZWJvb2tzLgorCSAgVXNlIGdsaWIgYmFzZTY0IGRlY29kZXJzLgorCSAgVXNlIHN1YmJ1ZmZlcnMgdG8gYXZvaWQgYSBtZW1jcHkgb2YgdGhlIGhlYWRlcnMuCisKKzIwMDktMDMtMDkgMTc6MTQ6MTIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuaDoKKwkgIGZsYWNkZWM6IGRvbid0IGxvc2UgdGhlIGZpcnN0IGJ1ZmZlciBhZnRlciBhIHNlZWsKKwkgIFRoZSBmbGFjZGVjIEFQSSBjYWxscyB0aGUgd3JpdGUgY2FsbGJhY2sgd2hlbiBwZXJmb3JtaW5nIGEgc2Vlay4gV2UgY2Fubm90IHlldAorCSAgcHVzaCBvdXQgYSBidWZmZXIgYXQgdGhhdCB0aW1lIHNvIHdlIG11c3Qga2VlcCBpdCBhbmQgcHVzaCBpdCBvdXQgbGF0ZXIuCisJICBGbHVzaCBvdXQgdGhlIHVwc3RyZWFtIHBhcnQgb2YgdGhlIHBpcGVsaW5lIHdoZW4gZG9pbmcgYSBzZWVrLgorCSAgRml4ZXMgIzU3NDI3NS4KKworMjAwOS0wMy0wOSAxNToyMDowNSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogc2FuaXRpemUgdGFnIG5hbWVzCisJICBTYW5pdGl6ZSB0aGUgdGFnIG5hbWVzIGJlZm9yZSB0dXJuaW5nIHRoZW0gaW50byBhIHN0cnVjdHVyZSBuYW1lLiBXZSBjYW4gb25seQorCSAgYWRkIGFscGhhbnVtZXJpYyB2YWx1ZXMgYXMgdGhlIHN0cnVjdHVyZSBuYW1lLgorCisyMDA5LTAzLTA4IDEyOjA0OjIyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGZmYTczOGQgdG8gNzAzMjE2MworCisyMDA5LTAzLTA4IDExOjE5OjU2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDNmMTNlNGUgdG8gZmZhNzM4ZAorCisyMDA5LTAzLTA3IDExOjQ1OjM1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDNjNzQ1NmIgdG8gM2YxM2U0ZQorCisyMDA5LTAzLTA3IDEwOjQ1OjQwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDU3YzgzZjIgdG8gM2M3NDU2YgorCisyMDA5LTAzLTA2IDIxOjU2OjI2ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDJzcmM6IGZpeCBwYWRzLCBzbyB0aGF0IHRoZXkgYXJlIHN1YnNldCBvZiB0ZW1wbGF0ZSBjYXBzCisJICBEbyBub3QgYWRkIHc9MCB8IGg9MC4gV2hlbiB3ZSBjYW4ndCBnZXQgYSBmcmFtZXJhdGUgYWRkIGZyYWN0aW9uIHJhbmdlLgorCisyMDA5LTAzLTA1IDE0OjA4OjE0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBmaXggcmFuZ2UgcGFyc2luZworCSAgRml4IHBhcnNpbmcgb2YgdGhlIHJhbmdlIGhlYWRlcnMuCisKKzIwMDktMDItMTAgMTc6MjA6NTcgKzAwMDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVuZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc2lyZW5kZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbnBheS5oOgorCSAgTW92ZSBzaXJlbiBydHAgcGF5L2RlcGF5IGZyb20gZ3N0LXBsdWdpbnMtZmFyc2lnaHQKKworMjAwOS0wMy0wNCAxNjoyNTozNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IG1lbW9yeSBsZWFrIGluIGNsb3NlCisJICBDbG9zZSB0aGUgY29ubmVjdGlvbiBldmVuIHdoZW4gd2UgZmFpbCB0byBzZW5kIHRoZSB0ZWFyZG93biBtZXNzYWdlLgorCSAgVXNlIHRoZSBjb25uZWN0aW9uIHVybCAod2hpY2ggaXMgYSBjb3B5IG9mIHRoZSBzcmMgdXJsKS4KKworMjAwOS0wMy0wNCAxNjoxNTowNSArMDEwMCAgUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2pAYXhpcy5jb20+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgY2hlY2s6IGdzdC1wbHVnaW5zLWdvb2Quc3VwcCBuZWVkcyB0byBiZSBkaXN0cmlidXRlZC4KKworMjAwOS0wMy0wNCAxMjoyOTo1MCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IGRvLXJ0Y3AgcHJvcGVydHkgZGVzY3JpcHRpb24KKwkgIC0tLQorCisyMDA5LTAzLTAzIDEyOjIwOjI3ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuaDoKKwkgIHNvdXBodHRwc3JjOiBFeHBvc2UgdGhlIFNvdXBTZXNzaW9uICd0aW1lb3V0JyBwcm9wZXJ0eS4KKworMjAwOS0wMy0wMiAxNTowNzoyNCArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogLmdpdGlnbm9yZToKKwkgIC5naXRpZ25vcmU6IElnbm9yZSB0aGUgbTQvIGRpcmVjdG9yeQorCisyMDA5LTAzLTAyIDE3OjE4OjU1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkgIHJ0cG1wNHZwYXk6IEFkZCBzdXBwb3J0IGZvciBtb3JlIGZvcm1hdHMKKwkgIEhhY2sgYXJvdW5kIHNob3J0IGhlYWRlciBtcGVnNCB2aWRlbyBmaWxlcyBhbmQgcHV0IHRoZSBzaG9ydCBoZWFkZXIgYXMgdGhlCisJICBjb25maWcgc3RyaW5nLgorCSAgRml4ZXMgIzU3MjU1MS4KKworMjAwOS0wMy0wMiAxNjowODoyMyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYWRkIHN1cHBvcnQgZm9yIGh0dHAgdHVubmVsaW5nCisJICBBZGQgc3VwcG9ydCBmb3IgaHR0cCB0dW5uZWxpbmcgYW5kIGEgbmV3IHJ0c3BoOi8vIHVyaSBmb3IgaXQuCisJICBTZWUgIzU3MzE3My4KKworMjAwOS0wMy0wMiAwOTo0MzozMCArMDEwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIChhdCkgYXBlc3RhYXJ0IChkb3QpIG9yZz4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIG9mIHNzaDovL3Rob21hc3ZzQGdpdC5mcmVlZGVza3RvcC5vcmcvZ2l0L2dzdHJlYW1lci9nc3QtcGx1Z2lucy1nb29kCisKKzIwMDktMDMtMDIgMDg6NDE6MTUgKzAxMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIEFkZC9jbGFyaWZ5L2ZpeCBzb21lIGxvZ2dpbmcuCisKKzIwMDktMDMtMDEgMTI6NDc6MzcgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQGh1dGNoLTIubG9jYWw+CisKKwkqIHN5cy9vc3h2aWRlby9NYWtlZmlsZS5hbToKKwkgIFJlbW92ZSBoYXJkY29kZWQgZGVmaW5pdGlvbiBvZiBPQkpDCisKKzIwMDktMDMtMDEgMTk6NTU6MjYgKzAxMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZC5zaW1vbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICBXYWl0IGZvciBhIGZyYW1lIHRvIGJlY29tZSBhdmFpbGFibGUgYmVmb3JlIGNhcHR1cmluZyBpdAorCSAgVXNlIEdzdFBvbGwgdG8gd2FpdCBmb3IgdGhlIGZkIG9mIHRoZSB2aWRlbyBkZXZpY2UgdG8gYmVjb21lIHJlYWRhYmxlIGJlZm9yZQorCSAgdHJ5aW5nIHRvIGNhcHR1cmUgYSBmcmFtZS4gVGhpcyBzcGVlZHMgdXAgc3RvcHBpbmcgdjRsMnNyYyBhIGxvdCBhcyBpdCBubworCSAgbG9uZ2VyIGhhcyB0byB3YWl0IGZvciB0aGUgbmV4dCBmcmFtZSwgZXNwZWNpYWxseSB3aGVuIGNhcHR1cmluZyB3aXRoIGxvdworCSAgZnJhbWVyYXRlcyBvciB3aGVuIHRoZSB2aWRlbyBkZXZpY2UganVzdCBuZXZlciBnZW5lcmF0ZXMgYSBmcmFtZSAod2hpY2ggc2VlbXMgYQorCSAgY29tbW9uIGlzc3VlIGZvciB1dmN2aWRlbyBkZXZpY2VzKQorCSAgRml4ZXMgYnVnICM1NjM1NzQuCisKKzIwMDktMDItMTQgMTc6NTY6MDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOgorCSAgYWxhd2RlYywgbXVsYXdkZWM6IGRlbW90ZSBzb21lIGRlYnVnIG1lc3NhZ2VzIGZyb20gRVJST1IgdG8gV0FSTklORyBvciBERUJVRworCSAgTm9uLW9rIGZsb3cgcmV0dXJucyBtYXkgaGFwcGVuIGZvciBhIHZhcmlldHkgb2YgcGVyZmVjdGx5IGxlZ2l0aW1hdGUgYW5kIGV4cGVjdGVkIHJlYXNvbnMKKwkgICh0ZW1wb3JhcmlseSBub3QgbGlua2VkLCBzZWVraW5nLCBwaXBlbGluZSBzaHV0ZG93biksIHNvIHdlIHJlYWxseSBzaG91bGRuJ3Qgc3BldyBFUlJPUgorCSAgZGVidWcgbWVzc2FnZXMgdG8gc3RkZXJyIGluIHRob3NlIGNhc2VzLiBGaXhlcyAjNTcwNzgxLiAoU2VlbXMgbGlrZSBzb21lb25lIGFscmVhZHkgdG9vaworCSAgY2FyZSBvZiBzb21lIG9mIHRoZXNlLikKKworMjAwOS0wMi0yOCAxNToyNjowMCArMDIwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYzoKKwkgIHJndm9sdW1lOiBJbXByb3ZlIGxvZyBtZXNzYWdlIGZvciBwZWFrIHZhbHVlcyA+MS4wIGJ5IGNsYW1waW5nIGV4cGxpY2l0bHkuCisKKzIwMDktMDItMjcgMjM6MjU6MzIgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzoKKwkgIEZpeCB0aGUgZmllbGQgZG9taW5hbmNlCisJICBQQUwgaXMgVEZGLCBOVFNDIGlzIEJGRi4gIFNvbWUgZGF5IEkgd2lsbCBsZWFybiB0byBrZWVwIHRoaXMKKwkgIHN0cmFpZ2h0LgorCisyMDA5LTAyLTI3IDIwOjQwOjMxICswMTAwICBMUk4gPGxybjE5ODZAZ21haWwuY29tPgorCisJKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jOgorCSAgZGlyZWN0ZHJhd3Npbms6IEZpeCB0eXBlIG1pc21hdGNoZXMKKwkgIEZpeGVzIGJ1ZyAjNTczMzQzLgorCisyMDA5LTAyLTI3IDIwOjI4OjI3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIG9mIHNzaDovL2dpdC5mcmVlZGVza3RvcC5vcmcvZ2l0L2dzdHJlYW1lci9nc3QtcGx1Z2lucy1nb29kCisKKzIwMDktMDItMjcgMjA6MjQ6NTMgKzAxMDAgIExSTiA8bHJuMTk4NkBnbWFpbC5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuYzoKKwkgIHVkcDogRG9uJ3Qgc2V0IGVycm5vIHRvIEVBRk5PU1VQUE9SVCB1bmNvbmRpdGlvbmFsbHkKKwkgIEZpeGVzIGJ1ZyAjNTczMzQyLgorCisyMDA5LTAyLTI3IDExOjE3OjUwIC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYzoKKwkgIHJndm9sdW1lOiBpZ25vcmUgb3V0LW9mLXJhbmdlIHBlYWsgdmFsdWVzCisJICBJZiB0aGUgcGVhayB2YWx1ZSBpcyA+IDEgKGFuZCB0aHVzIG5vbnNlbnNpY2FsKSBpZ25vcmUgaXQuIFByZXZlbnRzCisJICByZ3ZvbHVtZSByZWR1Y2luZyB2b2x1bWUgdG8gZWZmZWN0aXZlbHkgc2lsZW50IG9uIGZpbGVzIHdpdGggYm9ndXMgcGVhaworCSAgdmFsdWVzLgorCisyMDA5LTAyLTI3IDEzOjI5OjQxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogRml4IFNFRUsgZXZlbnQgaGFuZGxpbmcgaW4gcHVzaCBtb2RlLCBhbmQgU0VFS0FCTFkgcXVlcnkgaGFuZGxpbmcKKwkgIFN0YW5kYXJkIHB1bGwgbW9kZSBsb29wIGJhc2VkIFNFRUsgaGFuZGxpbmcgZmFpbHMgaW4gcHVzaCBtb2RlLAorCSAgc28gY29udmVydCB0aGUgU0VFSyBldmVudCBhcHByb3ByaWF0ZWx5IGFuZCBkaXNwYXRjaCB0byB1cHN0cmVhbS4KKwkgIEFsc28gY2F0ZXIgZm9yIE5FV1NFR01FTlQgZXZlbnQgaGFuZGxpbmcsIGFuZCBwcm9wZXJseSBpbmZvcm0KKwkgIGRvd25zdHJlYW0gYW5kIGFwcGxpY2F0aW9uIG9mIFNFRUtBQkxFIGNhcGFiaWxpdGllcywgZGVwZW5kaW5nCisJICBvbiBzY2hlZHVsaW5nIG1vZGUgYW5kIHVwc3RyZWFtLgorCisyMDA5LTAyLTI3IDExOjA0OjA4ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IFJlbW92ZSBnc3RfdXRpbF9kdW1wX21lbSgpIGNhbGxzLgorCisyMDA5LTAyLTI2IDE5OjA3OjM1ICswMTAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggU0VFSyBldmVudCBoYW5kbGluZyBpbiBwdXNoIG1vZGUKKwkgIFdoZW4gaW4gcHVzaCBtb2RlIHdlIHNob3VsZCBub3QgdHJ5IHRvIGhhbmRsZSB0aGUgU0VFSyBldmVudCBhcyB0aGVyZSdzCisJICBubyBjb2RlIHRvIGhhbmRsZSBpdCBwcm9wZXJseS4gUHJvcGFnYXRlIHVwc3RyZWFtLgorCisyMDA5LTAyLTI2IDE5OjA1OjA2ICswMTAwICBQYXRyaWNrIFJhZGl6aSA8cGF0cmljayBkb3QgcmFkaXppIGF0IGF4aXMgZG90IGNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogYWRkIHRoZSAuaCBmaWxlIGNoYW5nZSB0b28KKwkgIEFkZCB0aGUgLmggZmlsZSBjaGFuZ2UgZm9yIHRoZSBuZXcgcHJvcGVydHkuCisKKzIwMDktMDItMjYgMTk6MDM6NTIgKzAxMDAgIFBhdHJpY2sgUmFkaXppIDxwYXRyaWNrIGRvdCByYWRpemkgYXQgYXhpcyBkb3QgY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBhZGQgcHJvcGVydHkgdG8gZGlzYWJsZSBSVENQCisJICBTb21lIG9sZCBzZXJ2ZXJzIGRvbid0IGxpa2UgdXMgZG9pbmcgUlRDUCBhbmQgdGh1cyB3ZSBuZWVkIGEgcHJvcGVydHkgdG8gZGlzYWJsZQorCSAgaXQuIFNlZSAjNTczMTczLgorCisyMDA5LTAyLTI2IDEzOjE5OjMxICswMTAwICBKYW4gU21vdXQgPGphbiBkb3Qgc21vdXQgYXQgZ21haWwgZG90IGNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSAgdWRwOiBmaXggZ3N0X3VkcF9zZXRfbG9vcF90dGwoKSBhZ2FpbgorCSAgRml4IHRoZSBnc3RfdWRwX3NldF9sb29wX3R0bCgpIGZ1bmN0aW9uIHRoYXQgd2FzIGNvbW1lbnRlZCBvdXQgaW4gYQorCSAgcHJldmlvdXMgY29tbWl0LiBTZWUgIzU3MzExNS4KKworMjAwOS0wMi0yNiAxMzowNjoxNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkgIHJ0cHZyYXdkZXBheTogZmFpbCBvbiBpbnRlcmxhY2VkIHZpZGVvCisJICBGYWlsIG9uIGludGVybGFjZWQgdmlkZW8gdW50aWwgd2Ugc3VwcG9ydCBpdC4KKworMjAwOS0wMi0yNiAxMzowMDo1OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJICBydHB2cmF3cGF5OiBmYWlsIG9uIGludGVybGFjZWQgdmlkZW8KKwkgIERldGVjdCBhbmQgZmFpbCB3aGVuIHRyeWluZyB0byBwYXlsb2FkIGludGVybGFjZWQgdmlkZW8uCisKKzIwMDktMDItMjUgMjA6NDc6MTUgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBNYWtlZmlsZS5hbToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaC5pbjoKKwkgIENoYW5nZSBob3cgd2luMzIvY29tbW9uL2NvbmZpZy5oIGlzIHVwZGF0ZWQKKwkgIEdlbmVyYXRlIHdpbjMyL2NvbW1vbi9jb25maWcuaC1uZXcgZGlyZWN0bHkgZnJvbSBjb25maWcuaC5pbiwKKwkgIHVzaW5nIHNoZWxsIHZhcmlhYmxlcyBpbiBjb25maWd1cmUgYW5kIHNvbWUgaGFyZC1jb2RlZCBpbmZvcm1hdGlvbi4KKwkgIENoYW5nZSB0b3AtbGV2ZWwgbWFrZWZpbGUgc28gdGhhdCAnbWFrZSB3aW4zMi11cGRhdGUnIGNvcGllcyB0aGUKKwkgIGdlbmVyYXRlZCBmaWxlIHRvIHdpbjMyL2NvbW1vbi9jb25maWcuaCwgd2hpY2ggd2Uga2VlcCBpbiBzb3VyY2UKKwkgIGNvbnRyb2wuICBJdCdzIGtlcHQgaW4gc291cmNlIGNvbnRyb2wgc28gdGhhdCB0aGUgZ2l0IHRyZWUgaXMKKwkgIGJ1aWxkYWJsZSBmcm9tIFZTLgorCSAgVGhpcyBjaGFuZ2UgaXMgc2ltaWxhciB0byB0aGUgb25lIHJlY2VudGx5IGFwcGxpZWQgdG8gR1N0cmVhbWVyCisJICBhbmQgZ3N0LXBsdWdpbnMtZ29vZC4gIFRoZSBwcmV2aW91cyBjb25maWcuaCBmaWxlIGluIC1nb29kIHdhcyBpbgorCSAgcHJldHR5IGJhZCBzaGFwZSwgc28gdW5saWtlIGNvcmUgYW5kIGJhc2UsIEkgZGlkbid0IGF0dGVtcHQgdG8KKwkgIGxlYXZlIGl0IHN0cmljdGx5IHRoZSBzYW1lLCBidXQgZml4ZWQgaXQgYXMgbmVjZXNzYXJ5LiAgTmVlZHMKKwkgIHRlc3RpbmcgSSBjYW5ub3QgZG8gbXlzZWxmLgorCisyMDA5LTAyLTI1IDE5OjU4OjI5IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBleHQvZHYvZ3N0ZHZkZWMuaDoKKwkgIGR2ZGVjOiBBZGQgaW50ZXJsYWNpbmcgaW5mbyB0byBjYXBzIGFuZCBidWZmZXJzCisKKzIwMDktMDItMjUgMTQ6NTc6MzMgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogY29tbW9uOgorCSogY29uZmlndXJlLmFjOgorCSAgYnVpbGQ6IFVwZGF0ZSBzaGF2ZSBpbml0IHN0YXRlbWVudCBmb3IgY2hhbmdlcyBpbiBjb21tb24uIEJ1bXAgY29tbW9uLgorCisyMDA5LTAyLTI1IDE0OjAxOjI2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBmaXggY29tcGlsYXRpb24KKwkgIEZpeCBjb21waWxhdGlvbiBvbiBzeXN0ZW1zIE1TR19FUlJRVUVVRSBhbmQgSVBfUkVDVkVSUi4KKworMjAwOS0wMi0xOSAyMDoxNDoxMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWdlbmM6IGVycm9yIG91dCBpbnN0ZWFkIG9mIGNyYXNoaW5nIGlmIG5vIGNhcHMgaGF2ZSBiZWVuIHNldAorCSAgRG9uJ3QgY3Jhc2ggaWYgd2UgcmVjZWl2ZSBhIGJ1ZmZlciB3aXRob3V0IGNhcHMuIEZpeGVzICM1NzI0MTMuCisKKzIwMDktMDItMjUgMTE6MzU6MzEgKzAxMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBNYWtlIHN1cmUgdGhlIHNvY2thZGRyIGxlbmd0aCB1c2VkIGZvciByZWN2ZnJvbSgpIGlzIGJpZyBlbm91Z2guCisJICBQcmV2aW91c2x5IHRoZSBzb2NrYWRkciBsZW5ndGggdXNlZCBmb3IgcmVjdmZyb20oKSB3YXMgY2FsY3VsYXRlZCBhcworCSAgc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHIpLiBIb3dldmVyLCB0aGlzIGlzIHRvbyBsaXR0bGUgdG8gaG9sZCBhbiBJUHY2CisJICBhZGRyZXNzLCBzbyB0aGUgZnVsbCBzaXplIG9mIHRoZSBnc3Rfc29ja2FkZHIgdW5pb24gc2hvdWxkIGJlIHVzZWQKKwkgIGluc3RlYWQuCisKKzIwMDktMDItMjUgMTE6MzI6MjggKzAxMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBVbmlmeSB0aGUgdXNlIG9mIHVuaW9uIGdzdF9zb2NrYWRkci4KKworMjAwOS0wMi0yNSAxMTozMjowNyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gOWNmOGM5YiB0byBhNmNlNWM2CisKKzIwMDktMDItMjUgMTI6MDU6MjIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBhdm9pZCBjcmFzaGluZyBvbiBzdWJ0aXRsZXMKKwkgIEF2b2lkIGEgY3Jhc2ggaW4gYXZpIHdpdGggc3VidGl0bGVzIGJ5IG9ubHkgZGVyZWZlcmVuY2luZyB0aGUgdmlkZW8gZGVzY3JpcHRpb24KKwkgIHdoZW4gd2UgYWN0dWFsbHkgYXJlIGRlYWxpbmcgd2l0aCB2aWRlbyBpbiB0aGUgX2ludmVydCBmdW5jdGlvbi4KKworMjAwOS0wMi0yNSAxMTo0NTowNSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmg6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIGRvY3M6IHZhcmlvdXMgZG9jIGZpeGVzCisJICBObyBzaG9ydC1kZXNjIGFzIHdlIGhhdmUgdGhlbSBpbiB0aGUgZWxlbWVudCBkZXRhaWxzLgorCSAgQWxzbyBrZWVwIHRoaW5ncyAoTWFrZWZpbGUuYW0gYW5kIHNlY3Rpb25zLnR4dCkgc29ydGVkLgorCSAgUmV3b3JkIGFtYmlnb3VzIHJldHVybnMuIE5vIHRleHQgYWZ0ZXIgc2luY2UgcGxlYXNlLgorCisyMDA5LTAyLTI0IDE3OjU4OjMyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHA6IEZpeCBzdHJpY3QtYWxpYXNpbmcgd2FybmluZ3MgZnJvbSBnY2MgNC40LjAKKwkgIEZpeCBzdHJpY3QgYWxpYXNpbmcgd2FybmluZ3MgYnkgZGVmaW5pbmcgYSB1bmlvbiBvbiB0aGUgZGlmZmVyZW50CisJICBzb2NrYWRkciBzdHJ1Y3RzIHRoYXQgd2UgbmVlZC4KKworMjAwOS0wMi0yNCAxNzozNTo0NiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwOiBGaXggY29tcGlsZXIgd2FybmluZyBpbiBoMjY0IHBheWxvYWRlcgorCSAgRml4IGFuIHVuZGVmaW5lZCBiZWhhdmlvdXIgd2FybmluZyBmcm9tIGdjYyA0LjQuMAorCSAgUGF0Y2ggQnk6IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCSAgRml4ZXM6ICM1NzA5OTUKKwkgIFNpZ25lZC1PZmYtQnk6IEphbiBTY2htaWR0IDxqYW4uc2NobWlkdEBzdW4uY29tPgorCisyMDA5LTAyLTIyIDE3OjIzOjA5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgIFVzZSBzaGF2ZSBmb3IgdGhlIGJ1aWxkIG91dHB1dAorCisyMDA5LTAyLTI0IDE0OjU1OjI4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2djb25mL01ha2VmaWxlLmFtOgorCSogZXh0L2djb25mL2dzdGdjb25mLmM6CisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmYuaDoKKwkqIGV4dC9nY29uZi9nc3RnY29uZmVsZW1lbnRzLmg6CisJICBnY29uZjogUmVuYW1lIGdjb25mLltjaF0gdG8gZ3N0Z2NvbmYuW2NoXSB0byBwcmV2ZW50IG5hbWUgY29uZmxpY3RzCisKKzIwMDktMDItMjQgMTQ6NDE6MjYgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZm91cmNjLmg6CisJICBxdGRlbXV4OiBBbHNvIHVzZSAiKGMpaW5mIiB0byBmaWxsIHRoZSBjb21tZW50IHRhZworCisyMDA5LTAxLTI2IDExOjA2OjEzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcGVyZm9ybSBVRFAgU0VUVVAgYWNjb3JkaW5nIHRvIE1TIFJUU1Agc3BlYworCSAgTVMgUlRTUCBzcGVjIHN0YXRlcyB0aGF0IHRoZSBVRFAgcG9ydCBwYWlyIHVzZWQgaW4gc3Vic2VxdWVudCBTRVRVUAorCSAgcmVxdWVzdHMgZm9yIHZhcmlvdXMgc3RyZWFtcyBtdXN0IGJlIGlkZW50aWNhbCAoc2luY2UgdGhlcmUgd2lsbCBhY3R1YWxseQorCSAgYmUgb25seSAxIHN0cmVhbSBvZiBtdXhlZCBhc2YgcGFja2V0cykuICBGb2xsb3dpbmcgdHJhZGl0aW9uYWwgc3BlY3MgYW5kCisJICB1c2luZyBkaWZmZXJlbnQgcG9ydCBwYWlycyBpbiB0aGUgU0VUVVBzIGZvciBzZXBhcmF0ZSBzdHJlYW1zIHdpbGwgcmVzdWx0CisJICBpbiBhbGwgYnV0IHRoZSBmaXJzdCBvbmUgZmFpbGluZyBhbmQgb25seSBvbmUgc3RyZWFtIGJlaW5nIHN0cmVhbWVkLgorCSAgU28sIGluIGFwcHJvcHJpYXRlIGNpcmN1bXN0YW5jZXMsIHJldHJ5IFVEUCBTRVRVUCB1c2luZyBwcmV2aW91c2x5IHVzZWQKKwkgIHBvcnQgcGFpci4gIEZpeGVzICM1NTI2NTAuCisKKzIwMDktMDItMjMgMjA6NDk6MzcgKzAxMDAgIEF1cmVsaWVuIEdyaW1hdWQgPGdzdGVsenogYXQgeWFob28gZG90IGZyPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgUmVhZCBJQ01QIGVycm9yIG1lc3NhZ2VzIGluc3RlYWQgb2YgbG9vcGluZworCSAgV2hlbiB3ZSBhcmUgZGVhbGluZyB3aXRoIGNvbm5lY3RlZCBzb2NrZXRzIHNoYXJlZCBiZXR3ZWVuIGEgdWRwc3JjIGFuZCBhIHVkcHNpbmsKKwkgIHdlIG1pZ2h0IHJlY2VpdmUgSUNNUCBjb25uZWN0aW9uIHJlZnVzZWQgZXJyb3IgbWVzc2FnZXMgaW4gdWRwc3JjIHRoYXQgd2lsbAorCSAgY2F1c2UgaXQgdG8gZ28gaW50byBhIGJ1cnN0eSBsb29wIGJlY2F1c2UgdGhlIHBvbGwgcmV0dXJucyByaWdodCBhd2F5IHdpdGhvdXQgYQorCSAgbWVzc2FnZSB0byByZWFkLgorCSAgSW5zdGVhZCBvZiBsb29waW5nLCByZWFkIHRoZSBlcnJvciBtZXNzYWdlIGZyb20gdGhlIGVycm9yIHF1ZXVlIGluIHVkcHNyYy4KKwkgIEZpeGVzICM1Njc4NTcuCisKKzIwMDktMDItMjMgMTk6NTM6NTggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIENvbmRpdGlvbmFsbHkgY29tcGlsZSBjb2RlIGZvciBZVllVCisJICBPbmx5IGNvbXBpbGUgdGhlIGNvZGUgZm9yIHRoZSBZVllVIGZvcm1hdCB3aGVuIHRoZSBmb3JtYXQgaXMgYWN0dWFsbHkgZGVmaW5lZC4KKwkgIFNwb3R0ZWQgYnkgdG1hdHRoIG9uIElSQy4KKworMjAwOS0wMi0xNyAxMTowMTo0NyAtMDgwMCAgTGV2ZW50ZSBGYXJrYXMgPGxmYXJrYXNAbGZhcmthcy5vcmc+CisKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDJzcmM6IE1ha2Ugc29ydF9ieV9mcmFtZV9zaXplIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQKKwkgIHNvcnRfYnlfZnJhbWVfc2l6ZSBpcyBkZWNsYXJlZCBzdGF0aWMgYW5kIG9ubHkgdXNlZCBpbnNpZGUKKwkgIGFuIGlmZGVmLCBzbyB1c2UgdGhlIHNhbWUgaWZkZWYgdG8gZGVmaW5lIHRoZSBmdW5jdGlvbi4gIEZpeGVzICM1NzIxODUKKwkgIFNpZ25lZC1vZmYtYnk6IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisyMDA5LTAyLTIzIDE3OjA1OjQzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBBZGQgWVZZVSBmb3JtYXQgdG8gY2FwcworCSAgQWRkIFlWWVUgZm9ybWF0IHRvIHRoZSBjYXBzLiBXZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIGhhbmRsZSB0aGVzZSBjYXBzIHlldCwKKwkgIHRob3VnaC4KKworMjAwOS0wMi0yMyAxNTo0ODo0MSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5oOgorCSAgU29tZSBjbGVhbnVwcworCSAgUmVtb3ZlIHNvbWUgdW51c2VkIHZhcmlhYmxlcy4KKwkgIEF2b2lkIGEgdXNlbGVzcyBfcmVzeW5jIGNhbGwuCisJICBDb3JyZWN0bHkgdXNlIGEgZ2Jvb2xlYW4uCisKKzIwMDktMDItMjMgMTU6NDM6NTEgKzAxMDAgIFdhaS1NaW5nIEhvIDx3YWltaW5nIGF0IGFpbHVyb3BvZGEgZG90IG5ldD4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBBbHdheXMgYWRkIFBQUyB0byB0aGUgc3Byb3AtcGFyYW1ldGVycy1zZXQKKwkgIFJld29yayB0aGUgcGFyc2luZyBjb2RlIHRoYXQgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzIGRyb3BwZWQgdGhlIFBQUyBmcm9tCisJICB0aGUgc3Byb3AtcGFyYW1ldGVycy1zZXQuCisJICBGaXhlcyAjNTcyODU0LgorCisyMDA5LTAyLTIzIDEyOjE0OjIzICswMTAwICBBcm5vdXQgVmFuZGVjYXBwZWxsZSA8YXJub3V0IGF0IG1pbmQgZG90IGJlPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBEb24ndCBkbyBjcmF6eSB0aGluZ3Mgd2l0aCAwLzEgZnJhbWVyYXRlcworCSAgV2UgdXNlIDAvMSBmcmFtZXJhdGVzIHRvIG1hcmsgdmFyaWFibGUgZnJhbWVyYXRlcyBhbmQgbWF0cm9za2FtdXggc2hvdWxkIG5vdCB0cnkKKwkgIHRvIGNhbGN1bGF0ZSBhIGZyYW1lIGR1cmF0aW9uIGZvciBpdC4KKwkgIEZpeGVzICM1NzEyOTQuCisKKzIwMDktMDItMjMgMTE6NDU6NTAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIFJlcXVpcmUgbmV3ZXIgZ3N0LXAtYiBmb3IgdGhlIFJUU1AgZXh0ZW5zaW9ucy4KKwkgIC0tCisKKzIwMDktMDItMjMgMTE6NDI6NTMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIENhbGwgbmV3IHJlY2VpdmVfcmVxdWVzdCBtZXRob2QKKwkgIENhbGwgdGhlIHJlY2VpdmVfcmVxdWVzdCBleHRlbnNpb24gbWV0aG9kcyBzbyB0aGF0IGV4dGVuc2lvbnMgY2FuIGhhbmRsZSB0aGUKKwkgIHNlcnZlciByZXF1ZXN0IGlmIHRoZXkgd2FudC4KKworMjAwOS0wMi0yMyAxMToxMzozMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcGV4dC5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcGV4dC5oOgorCSAgQWRkIG1ldGhvZCBmb3IgaGFkbGluZyBzZXJ2ZXIgcmVxdWVzdHMKKwkgIEFkZCBtZXRob2QgdG8gaGFuZGxlIHNlcnZlciByZXF1ZXN0cyBvbiB0aGUgbGlzdCBvZiBSVFNQIGV4dGVuc2lvbnMuCisKKzIwMDktMDItMTMgMTQ6Mzk6MjkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6CisJICBEb24ndCB1c2UgR1NUX0VSUk9SIGZvciBub24tZXJyb3IgY2FzZXMuCisJICBUdXJuIGEgR1NUX0VSUk9SIGxpbmUgaW50byBhIEdTVF9ERUJVRyBsaW5lIHNvIHRoYXQgd2UgZG9uJ3Qgc3BhbSB0aGUgbG9nIHdpdGgKKwkgIGVycm9ycy4gRml4ZXMgIzU3MDc4MS4KKworMjAwOS0wMi0yMiAxOTozMDozMiArMDEwMCAgU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PgorCisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NpbmsuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc2luay5oOgorCSogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zcmMuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc3JjLmg6CisJICBnY29uZnZpZGVvKHNyY3xzaW5rKTogRGlzY29ubmVjdCBHQ29uZiBub3RpZmljYXRpb25zCisJICBGaXhlcyBidWcgIzU3MTMyMS4KKworMjAwOS0wMi0yMiAxOToyNTozOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogVW5yZWYgdGhlIGJ1ZmZlciBhbmQgbm90IHRoZSBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgYnVmZmVyCisKKzIwMDktMDItMjIgMTg6NDc6MzUgKzAxMDAgIE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6CisJICBhbGF3L211bGF3OiBJbXBsZW1lbnQgX2dldGNhcHMgZnVuY3Rpb24gZm9yIGFsYXcvbXVsYXcgZGVjb2RlcnMKKwkgIEZpeGVzIGJ1ZyAjNTcyMzU4LgorCisyMDA5LTAyLTIyIDE4OjQ2OjAzICswMTAwICBPbGl2aWVyIENyZXRlIDx0ZXN0ZXJAdGVzdGVyLmNhPgorCisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOgorCSAgYWxhdy9tdWxhdzogRG9uJ3QgcmVxdWlyZSBib3RoLCByYXRlIGFuZCBjaGFubmVsLCB0byBiZSBzZXQgaW4gX2dldGNhcHMKKwkgIEZpeGVzIGJ1ZyAjNTcyMzU4LgorCisyMDA5LTAyLTIyIDE4OjMyOjAyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IEZpeCBhbGlnbm1lbnQgaXNzdWVzIGJ5IHVzaW5nIEdTVF9SRUFEXyoKKwkgIFJlYWRpbmcgaW50ZWdlcnMgZnJvbSByYW5kb20gbWVtb3J5IGFkZHJlc3NlcyB3aWxsIHJlc3VsdAorCSAgaW4gU0lHQlVTIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcyBpZiB0aGUgbWVtb3J5IGFkZHJlc3MKKwkgIGlzIG5vdCBjb3JyZWN0bHkgYWxpZ25lZC4gVGhpcyBjYW4gaGFwcGVuIGF0IHR3bworCSAgcGxhY2VzIGluIGF2aWRlbXV4IHNvIHdlIHNob3VsZCB1c2UgR1NUX1JFQURfVUlOVDMyX0xFCisJICBhbmQgZnJpZW5kcyBoZXJlLiBGaXhlcyBidWcgIzU3MjI1Ni4KKworMjAwOS0wMi0yMiAxODowODo1OSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOgorCSAgcHVsc2VtaXhlcjogRG9uJ3QgdXNlIGdfYXRvbWljX2ludF8oZ2V0fHNldCkgZm9yIGFjY2Vzc2luZyB0aGUgbWl4ZXIgdHJhY2sgZmxhZ3MKKwkgIGdfYXRvbWljX2ludF8oZ2V0fHNldCkgb25seSB3b3JrIG9uIGludHMgYW5kIHRoZSBmbGFncyBhcmUKKwkgIGFuIGVudW0gKHdoaWNoIG9uIG1vc3QgYXJjaGl0ZWN0dXJlcyBpcyBzdG9yZWQgYXMgYW4gaW50KS4KKwkgIEFsc28gdGhlIHdheSB0aGUgZmxhZ3Mgd2VyZSBhY2Nlc3NlZCBhdG9taWNhbGx5IHdvdWxkIHN0aWxsCisJICBsZWF2ZSBhIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uIGFuZCB3ZSBkb24ndCBkbyBpdCBpbiBhbnkKKwkgIG90aGVyIG1peGVyIHRyYWNrIGltcGxlbWVudGF0aW9uLCBsZXQgYWxvbmUgYXQgYW55IG90aGVyCisJICBwbGFjZSB3aGVyZSBhbiBpbnRlZ2VyIGNvdWxkIGJlIGNoYW5nZWQgZnJvbSBkaWZmZXJlbnQKKwkgIHRocmVhZHMuIFJlbW92aW5nIHRoZSBnX2F0b21pY19pbnRfKGdldHxzZXQpIHdpbGwgb25seQorCSAgaW50cm9kdWNlIGEgbmV3IHJhY2UgY29uZGl0aW9uIG9uIGFyY2hpdGVjdHVyZXMgd2hlcmUKKwkgIGludGVnZXJzIGNvdWxkIGJlIGhhbGYtd3JpdHRlbiB3aGlsZSByZWFkaW5nIHRoZW0KKwkgIHdoaWNoIHNob3VsZG4ndCBiZSB0aGUgY2FzZSBmb3IgYW55IG1vZGVybiBhcmNoaXRlY3R1cmUKKwkgIGFuZCBpZiB3ZSByZWFsbHkgY2FyZSBhYm91dCB0aGlzIHdlIG5lZWQgdG8gdXNlCisJICBnX2F0b21pY19pbnRfKGdldHxzZXQpIGF0IG1hbnkgb3RoZXIgcGxhY2VzIHRvby4KKwkgIEFwYXJ0IGZyb20gdGhhdCBnX2F0b21pY19pbnRfKHNldHxnZXQpIHdpbGwgcmVzdWx0IGluCisJICBhbGlhc2luZyB3YXJuaW5ncyBpZiB0aGVpciBhcmd1bWVudCBpcyBleHBsaWNpdGVseQorCSAgY2FzdGVkIHRvIGFuIGludCAqLiBGaXhlcyBidWcgIzU3MTE1My4KKworMjAwOS0wMi0yMiAxNTo1MjowNiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNWQ3YzljYyB0byA5Y2Y4YzliCisKKzIwMDktMDItMjIgMTI6NDE6NTMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJICBoZHYxMzk0c3JjOiBEb24ndCB1c2Ugdm9pZCAqIHBvaW50ZXIgYXJpdGhtZXRpYworCisyMDA5LTAyLTIxIDExOjEzOjQzIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDgwYzYyN2QgdG8gNWQ3YzljYworCisyMDA5LTAyLTIxIDE4OjQyOjQ2ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQgLT4gMC4xMC4xNC4xCisKKzIwMDktMDItMjAgMTg6MTY6MDIgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBEb2N1bWVudCBydHBkdG1mZGVwYXkgYSBiaXQKKworMjAwOS0wMi0yMCAxNzo0MTozNyAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mLmM6CisJICBNb3ZlZCBkdG1mIGVsZW1lbnRzIGZyb20gZ3N0LXBsdWdpbnMtZmFyc2lnaHQgdG8gLWJhZAorCisyMDA5LTAyLTIwIDE3OjQwOjU3IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuaDoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5oOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5oOgorCSAgRml4IHVwIGRvY3VtZW50YXRpb24gYmxvYnMgU0dNTAorCisyMDA5LTAyLTIwIDE3OjM3OjQzIC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWYuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuaDoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZjb21tb24uaDoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5Lmg6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmg6CisJICBSZS1pbmRlbnQgdG8gR3N0IHN0eWxlCisKKzIwMDktMDItMTggMTM6MzA6NDQgLTA1MDAgIExhdXJlbnQgR2xheWFsIDxzcGdsZWdsZUB5YWhvby5mcj4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIE1pc3NpbmcgZm9ybWF0IGRpcmVjdGl2ZQorCisyMDA4LTEyLTA0IDIxOjIxOjQ0IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5Lmg6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gQWxsb3cgc2V0dGluZyBhIG1heGltdW0gZHVyYXRpb24gdG8gYSBSVFAgRFRNRiBldmVudAorCisyMDA4LTEyLTA0IDIxOjExOjE3IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIEltcHJvdmUgdGhlIG1pbmltdW0gcXVhbnRhIHRvIG1ha2UgaXQgaW1wb3NzaWJsZSBmb3IgdGhlIGR1cmF0aW9uIHRvIGZhbGwgZG93biB0byAwCisKKzIwMDgtMTItMDEgMTg6MzE6NDggLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuaDoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBBbGxvdyBzZXR0aW5nIGEgbWluaW11bSBzaXplIG9mIGEgc291bmQgcXVhbnRhIGluIHRoZSBkdG1mIGRlcGF5bG9hZGVyCisKKzIwMDgtMTItMTEgMTc6NTQ6MTggLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvLmdpdC1kYXJjcy1kaXI6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gUmVtb3ZlIC5naXQtZGFyY3MtZGlyIGZpbGVzCisKKzIwMDgtMTItMDEgMTc6Mzc6MTAgLTA1MDAgIEjDpXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIERvIHdpZXJkIGNhc3Rpbmcgb2YgdGhlIHZvbHVtZSB0byBtYWtlIE1TVkMgaGFwcHkKKworMjAwOC0xMC0xNSAxNjoyMTo1MCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gQ2xhcmlmeSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgImV2ZW50LXR5cGUiIGZpZWxkIHdoZW4gc3BlY2lmeWluZyBkdG1mIGV2ZW50cworCisyMDA4LTA3LTIyIDIxOjM5OjM4ICswMDAwICBPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIFJlbW92ZSBnX2RlYnVncworCSAgMjAwODA3MjIyMTM5MzgtM2UyZGMtNDRhODJkMDE3ZmU2NmYzMTEyMzAxYzQxMGFhMGI1NDNkZTYxNTZhZC5negorCisyMDA4LTA2LTEzIDIzOjU3OjIzICswMDAwICBPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIFRha2UgcmF0ZSBmcm9tIHRoZSBwZWVycyBjYXBzIGlmIHBvc3NpYmxlCisJICAyMDA4MDYxMzIzNTcyMy0zZTJkYy0xNTY5MGVlNDI3MDhjNTM5ZTFiZTEyZTIwZTA3NmE1NjEzZmFlYTk2Lmd6CisKKzIwMDgtMDYtMTMgMjM6NDE6NDQgKzAwMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmg6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gUHV0IHRoZSBzYW1wbGUgcmF0ZSBpbiBkdG1mc3JjIGludG8gYSB2YXJpYWJsZQorCSAgMjAwODA2MTMyMzQxNDQtM2UyZGMtZTYwMDcwOTQzYmVjODI5YjcwM2I4ODIxYzdhYTQzNTFhMDJkZWViZS5negorCisyMDA4LTA2LTEzIDIzOjMwOjA2ICswMDAwICBPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIFRha2UgdGhlIGNsb2NrLXJhdGUgZnJvbSB0aGUgY2FwcyBpbiBydHBkdG1mc3JjCisJICAyMDA4MDYxMzIzMzAwNi0zZTJkYy1hN2Q0ZTkxODY0M2Y0ZjhjMWJiMmNjMjY3ODU1OGM2NTQwMjU5MjBlLmd6CisKKzIwMDgtMDQtMjggMjI6MjI6MzcgKzAwMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9NYWtlZmlsZS5hbToKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBMaW5rIG1vZHVsZXMgd2l0aCBsaWJtIHdoZXJlIHJlcXVpcmVkCisJICAyMDA4MDQyODIyMjIzNy0zZTJkYy1iMWU5MTIwYzFlOWNhMWE1MTBiZmQ3YzI3ZTJkNDVmMGQ0YTEyNTA0Lmd6CisKKzIwMDgtMDQtMTIgMjM6NDQ6MTggKzAwMDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIEZpeCBieXRlIG9yZGVyaW5nIGlzc3VlcyB3aXRoIGR0bWZzcmMgYW5kIHJ0cGR0bWZkZXBheS4uIHVzZSBvZiBHX1NUUklOR0lGWSB0byBhdm9pZCBlcnJvciBvbiBNU1ZDCisJICAyMDA4MDQxMjIzNDQxOC00ZjBmNi00ODI4ZDE2MTNkZmNkNTY0YWZkMjM2ZGZjOGZiNTdhMjk5MDkyZjgzLmd6CisKKzIwMDgtMDMtMjAgMTk6MTQ6MzggKzAwMDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5Lmg6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gRml4IGNvcHlyaWdodHMgYWdhaW4sIHBlciBzbWN2J3MgYWR2aWNlLi4KKwkgIDIwMDgwMzIwMTkxNDM4LTRmMGY2LTY3MWM5ZGI1ZDk5NmE0NjAxZGYwMTdjZWFiNGFmNmQxNjQ2OWM5NjYuZ3oKKworMjAwOC0wMy0xOSAyMToxNzozMSArMDAwMCAgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBNYWtlIGl0IGNsZWFyIHRoYXQgZHRtZnNyYyBhbHNvIHRha2VzIG5hbWVkIGV2ZW50cyBhcyBpbnB1dAorCSAgMjAwODAzMTkyMTE3MzEtM2UyZGMtMjZjNzI5ZjZkYzhkYjI3ZTcxY2Y2YjIyNjQ2YTgxNTMwZGJmODYyZi5negorCisyMDA4LTAzLTIwIDE4OjQ4OjQxICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBkZWJ1ZyBtZXNzYWdlIG1hZGUgaW50byBlcnJvcnMgYmVjYXVzZSB0aGF0J3Mgd2hhdCB0aGV5IGFyZS4uLgorCSAgMjAwODAzMjAxODQ4NDEtNGYwZjYtOGEyZDI4MzI5N2IwMjcxM2RhZGUwYWU0YWNhYTVmNmUwZjY3ZWFjZS5negorCisyMDA4LTAzLTIwIDE4OjM5OjM3ICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBDbGVhbiB1bnVzZWQgc3R1ZmYuLi4KKwkgIDIwMDgwMzIwMTgzOTM3LTRmMGY2LWJjYjg0MWNkYzA3ZjllOTY3NzUxMmY0YjUwYjRiNjU5YTU4YzY3ODMuZ3oKKworMjAwOC0wMy0yMCAxODozOToxMiArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuaDoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBGaXggY29weXJpZ2h0cworCSAgMjAwODAzMjAxODM5MTItNGYwZjYtNjg5MzY1ZDVhNDA2NjMyZTNkMDg4ZmFjNzRlNGZiNmY4YTRlYjBlYS5negorCisyMDA4LTAzLTIwIDAxOjEzOjAxICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9NYWtlZmlsZS5hbToKKwkqIGdzdC9kdG1mL2dzdGR0bWYuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuaDoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBBZGRpbmcgc3VwcG9ydCBmb3IgcnRwZHRtZmRlcGF5CisJICAyMDA4MDMyMDAxMTMwMS00ZjBmNi1kMzZhNWQyNGJlMjAzMzZlMzZjNDc5NmQ3NTQ3NmM5YjVlZTFhN2UxLmd6CisKKzIwMDgtMDMtMTkgMTk6MzI6NTEgKzAwMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gZW5jb2RpbmcgbmFtZSBoYXMgdG8gYmUgdXBwZXItY2FzZQorCSAgMjAwODAzMTkxOTMyNTEtM2UyZGMtMTU4MWIzM2JlOWI0ODZlMzVlYzQ5NDgwMDk2NzdjY2Q1ZmZkYzA5OC5negorCisyMDA4LTAzLTIwIDAwOjUxOjQ3ICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mY29tbW9uLmg6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5oOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIEFkZGluZyBuZWNlc3NhcnkgZmlsZXMgZm9yIHJ0cGR0bWZkZXBheQorCSAgMjAwODAzMjAwMDUxNDctNGYwZjYtNTUwZmUyMmY3MDE1MmYzYWFiM2RjZDdhNmIwMmNiZjgxZTg5MjMyZC5negorCisyMDA4LTAzLTIwIDAwOjUwOjQxICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gRml4IHR5cG9zCisJICAyMDA4MDMyMDAwNTA0MS00ZjBmNi05ZDIyZmE1ZDE1NWUzNWI2MDVlYTg1YjFmZDllNzE5N2E4ODJhMWYwLmd6CisKKzIwMDgtMDItMTYgMTM6NDE6NDAgKzAwMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIGR0bWZzcmM6IENvcnJlY3RseSBzZXQgdGhlIGVuZGlhbmVzcyBpbiB0aGUgY2FwcyB0byB0aGUgbWFjaGluZXMgZW5kaWFuZXNzCisJICAyMDA4MDIxNjEzNDE0MC05M2I5YS00MGEzYTlkN2FjMTY3OWM1ZTBkZmQyNGE2YjkxZTRhYmE2Y2M2NDk2Lmd6CisKKzIwMDctMDktMTcgMTc6NTI6MzMgKzAwMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gU2VhcmNoJlJlcGxhY2Ugb29wcworCSAgMjAwNzA5MTcxNzUyMzMtM2UyZGMtNTdmNTc5YzRiODkwOTkzZjQ5ZmE4ZTllNjQ3MGEzZWI3OWQyYjkyMi5negorCisyMDA3LTA5LTE3IDE3OjUxOjMzICswMDAwICBPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIGV2ZW50cyBkb250IHlldCBiZWxvbmcgaW4gdGhlIGNhcHMKKwkgIDIwMDcwOTE3MTc1MTMzLTNlMmRjLWZkMWQ4M2I3ODI2Yjg5ODExMGZjNTcxYWU3YzM0NDBmMTg4NzQzNGQuZ3oKKworMjAwNy0wOS0xNyAxNjowODoyMCArMDAwMCAgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBBZGQgcGF0Y2ggdG8gbWFrZSBpdCB3b3JrIHdpdGggbWFlbW8gZHNwIHNvdXJjZXMgdGhhdCBwYXlsb2FkIGluY29ycmVjdGx5CisJICAyMDA3MDkxNzE2MDgyMC0zZTJkYy0wNmIxYjFkMWIwOTE4YjMwZGFiZWE1YTA3MTRjYjczMmIzYjhkOGRkLmd6CisKKzIwMDctMDktMTcgMDQ6MjY6NDkgKzAwMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gT29wcywgc2V0IHRvIG5vIHByZXJvbGwgd2hlbiBwbGF5aW5nLT5wYXVzZWQgdG9vCisJICAyMDA3MDkxNzA0MjY0OS0zZTJkYy05NGFkYjZhYTA2MTdlODE1YTZlMjMzMjMyZGFiYjRiYmM0OGRjODJjLmd6CisKKzIwMDctMDktMTcgMDA6MzY6NTQgKzAwMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmg6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gQ29tcGxldGUgcG9ydCB0byBiYXNlc3JjCisJICAyMDA3MDkxNzAwMzY1NC0zZTJkYy1kYjBmODRkYWJkOWRkMWFjOTI5YTA0NjE4NjViOGFhYThlZjkxYTc3Lmd6CisKKzIwMDctMDktMTcgMDA6MjQ6MTIgKzAwMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmg6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gQWRkIGNhcHMgbmVnb3RpYXRpb24gZnVuY3Rpb24KKwkgIDIwMDcwOTE3MDAyNDEyLTNlMmRjLWNhMjY2ODE2ZTk2Mjk3NDZlOTA4M2M1YmI4YjdmNzNiOTRhOWIyYjAuZ3oKKworMjAwNy0wOS0xNyAwMDoxNjo1OSArMDAwMCAgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBQcm9wZXJseSBmcmVlIG5vbi1zdGFydCBldmVudHMKKwkgIDIwMDcwOTE3MDAxNjU5LTNlMmRjLWE1NzE3NzdlM2VjZmI5MDk4OWY4NzQxMmY1NTRhYTEwYTMxY2MyY2EuZ3oKKworMjAwNy0wOS0xNyAwMDoxNTo1MiArMDAwMCAgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBNYWtlIGludGVydmFsIGFuZCBwYWNrZXRfcmVkdW5kYW5jeSBpbnRvIHVpbnQKKwkgIDIwMDcwOTE3MDAxNTUyLTNlMmRjLTYwMDMyZTU0N2IzNjY5Yjg3MzE3Yzk4MWQ5ODVjMTU2YWFiOTFiNDAuZ3oKKworMjAwNy0wOS0xNiAxOTo0NDowOCArMDAwMCAgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuaDoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBNYWtlIHRoZSBydHAgZHRtZiBzcmMgdXNlIGJhc2VzcmMKKwkgIDIwMDcwOTE2MTk0NDA4LTNlMmRjLTczNDAwMDEzMGRjZTI0MzRhMDE0YWNmODQzZDY0MWZmMGU2MGFhNWEuZ3oKKworMjAwNy0wOS0xNiAxOTo0MTowMSArMDAwMCAgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBNYWtlIGR0bWYgc3JjIGNvZGUgbmljZXIKKwkgIDIwMDcwOTE2MTk0MTAxLTNlMmRjLWE4YmU4YzUwOWM2NTQwMGQxZDM5NjJkYTAyZTY3ZDE1ZDIwNTQzMTYuZ3oKKworMjAwNy0wOS0xNCAwNDoyMDo0MiArMDAwMCAgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuaDoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBJbXBsZW1lbnQgc3RvcHBpbmcgaW4gYSBuaWNlIHRocmVhZCBzYWZlIHdheQorCSAgMjAwNzA5MTQwNDIwNDItM2UyZGMtMWZlMjU3ZmY0YjcyYWNhNGIwZWI1ZjI4NWExNDY1MGI4ZGYyNjhjMy5negorCisyMDA3LTA5LTE0IDA0OjE4OjM0ICswMDAwICBPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIFJlbW92ZSBnZXRfdGltZXMgKFdpbSBzYXlzIGl0cyBvbmx5IGdvb2QgZm9yIHJlYWxseSBmYWtlIHNvdXJjZXMpCisJICAyMDA3MDkxNDA0MTgzNC0zZTJkYy1mZmY0ZDVkYTJhMTQ1ZjE5ZTdiNjEwYTEwMjdkMmM0ZDRiYzVlYWUwLmd6CisKKzIwMDctMDktMTMgMjE6MjE6NDUgKzAwMDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSB1c2luZyB0aGUgdW5sb2NrIG1ldGhvZCBvZiBiYXNlc3JjCisJICAyMDA3MDkxMzIxMjE0NS00ZjBmNi0wZTQzOGE2ODFiZjE2NTFjMGNjMGQ4ZmEzMjY5YWVkM2YxNjY4YjZiLmd6CisKKzIwMDctMDktMTMgMjE6MTI6MjYgKzAwMDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBtb3JlIGRlYnVnCisJICAyMDA3MDkxMzIxMTIyNi00ZjBmNi1iYzMyYjU4MjhmYzhlMDMyM2M4YTZlZWU3NzlhMzgxNDVhYWNkNTkzLmd6CisKKzIwMDctMDktMTMgMjA6NDY6MTQgKzAwMDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBhZGRlZCBkZWJ1Z3MKKwkgIDIwMDcwOTEzMjA0NjE0LTRmMGY2LTY4YzJhNjlhZTdhMWVmY2E2ZTEzYzExNmRiYWQ3ZjliNjg2ZjAyNDIuZ3oKKworMjAwNy0wOS0xMyAxOToyMDo1MyArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIE1ha2Ugc3VyZSB0byB1bmxvY2sgdGhlIHRocmVhZCB3aGVuIGdvaW5nIHRvIHJlYWR5IGFuZCB0byBmbHVzaCB0aGUgcXVldWUgd2hlbiBtb3ZpbmcgdG8gcGF1c2VkIG9yIHBsYXlpbmcKKwkgIDIwMDcwOTEzMTkyMDUzLTRmMGY2LTc2YzM5MjUzODBkMWEzMDk4ODI4NjE3MDUzNWE2NWRlYTY0YTU1ODMuZ3oKKworMjAwNy0wOS0xMyAxNzo1NToyMCArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5oOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIENoYW5nZWQgZHRtZnNyYyBpbnRvIGEgc3ViY2xhc3Mgb2YgR3N0QmFzZVNyYworCSAgMjAwNzA5MTMxNzU1MjAtNGYwZjYtMTZjYTRiZjkzNjkwMDcyZjNlODM2ZDFjOGE1YjUyY2Y3YTQyMTkxNi5negorCisyMDA3LTA5LTA0IDIyOjU3OjUzICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmg6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmg6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gQWRkIGFub3RoZXIgZml4IGZvciBhIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uCisJICAyMDA3MDkwNDIyNTc1My00ZjBmNi01YmE4YzQyNjBjMDAyYmIyN2ViOThlOWZhYmEzYzE1Nzk5MzU3YjU3Lmd6CisKKzIwMDctMDktMDQgMjE6NTI6MjQgKzAwMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gQWRkIGNvbW1lbnQgdG8gZXhwbGFpbiBwdXNoIGJhY2sKKwkgIDIwMDcwOTA0MjE1MjI0LTNlMmRjLWQ5MmFjMWY0MDNkY2Y1NzE1NDZhN2M1M2YxODgwOWY4NDBlZWE1MWQuZ3oKKworMjAwNy0wOS0wNCAyMDo1NTowOSArMDAwMCAgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBQcm9wZXJseSBkbyB0aGUgbG9ja2luZyB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMgd2l0aCBjbG9jayB1bnNjaGVkdWxpbmcKKwkgIDIwMDcwOTA0MjA1NTA5LTNlMmRjLWRhMTk5MDBiNTFhZjZhZWRiNjU0N2Y0ZjM5MmJlZjRkMTA2MWRlYzIuZ3oKKworMjAwNy0wOS0wMSAwMDowMzoyNCArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIG91cHMsIEkgZGlkIGl0IGFnYWluLi4uCisJICAyMDA3MDkwMTAwMDMyNC00ZjBmNi0zZDhiNDY2OTFlZTUyMDUzN2IwNmM1MTFhNWU3MzJmNWI4MTJiODQ0Lmd6CisKKzIwMDctMDgtMzEgMjM6NTQ6MjggKzAwMDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBvdXBzLCBzb3JyeS4uIERUTUYsIG5vdCBSVFBfRFRNRiBmb3IgdGhpcyBmaWxlLi4uCisJICAyMDA3MDgzMTIzNTQyOC00ZjBmNi0wMGI2MDZiZmI0ODkyZTRmMjE3YzQ0MGI2MTFjYzc5NGFiMGRlNTVhLmd6CisKKzIwMDctMDgtMzEgMjM6NDQ6MTMgKzAwMDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuaDoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuaDoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBGaXhlcyB0aGUgZGVhZGxvY2sgd2hlbiBwYXVzaW5nIHRoZSBkdG1mc3JjIGFuZCBydHBkdG1mc3JjLiBIYWQgdG8gcHVzaCBzb21ldGhpbmcgb24gdGhlIGFzeW5jIHF1ZXVlIHRvIHJlbGVhc2UgdGhlIGJsb2NraW5nIGFzeW5jX3F1ZXVlX3BvcCgpLiBUaGFua3MgdG8gT2xpdmllciBmb3IgdGhlIHNvbHV0aW9uLgorCSAgMjAwNzA4MzEyMzQ0MTMtNGYwZjYtNzkzY2YzNWZjNDM2MzZlNzI3NTI1OGNjNzA2M2ZjMDY4ZjVlZmEwYS5negorCisyMDA3LTA4LTI4IDIyOjE1OjM0ICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmg6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmg6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gQ2xvY2tJRCB3aGVuIHdhaXRpbmcgZm9yIGJ1ZmZlciBpcyBub3cgdW5zY2hlZHVsZWQgd2hlbiBzdG9wcGluZyB0aGUgdGFzay4gVmFyaW91cyBmaXhlcyB0byBhdm9pZCBidWdzICh0aGFua3MgdG8gLVdhbGwgLVdlcnJvcikuIEZpeGVzIHRvIGFsbG93IHRoZSBtZXJnZSBvZiB0aGUgYnJhbmNoLgorCSAgMjAwNzA4MjgyMjE1MzQtNGYwZjYtYjBkNmE0ZmU0OGM0ZTJhMTZiOWZmNjljYjMxMDA4N2M5NzBjZTQ4ZS5negorCisyMDA3LTA4LTI4IDE3OjE1OjQ2ICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gQ2xlYW5lZCB1cCB0aGUgY29kZSBhIGJpdCwgbm8gdXNlIG9mIEdTVF8qIGFuZCByZXR1cm4gdmFsdWUgdmVyaWZpY2F0aW9uIGZyb20gZ3N0XyoKKwkgIDIwMDcwODI4MTcxNTQ2LTRmMGY2LWJkZWI0YjFiN2Y5OWY5NDY0YWFiZTVjNDNiZDRhNGQyMDI1MjYyYjYuZ3oKKworMjAwNy0wOC0yNyAxOTo1NjoxMCArMDAwMCAgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBGaXggb3Zlcmx5IGxvbmcgbGluZXMgYW5kIHRhYnMKKwkgIDIwMDcwODI3MTk1NjEwLTNlMmRjLTM5NmEzZmEwMWUxNmYxODRlNDEwOWM3MWZlMmRlYjZlNTE2YmRmMGQuZ3oKKworMjAwNy0wOC0yNyAxOToyNjoxOCArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5oOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIHVudGFiYmlmaWVkIGR0bWZzcmMKKwkgIDIwMDcwODI3MTkyNjE4LTRmMGY2LTc3ZDY4MDcwNDY0ZjFiNWY5YTQ2Y2I2ZWVjMmQ5MjIzNDAxNDNjMDQuZ3oKKworMjAwNy0wOC0yNyAxNzoyNDoyNCArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIEZpeCBSVFAgdGltZXN0YW1wcyBieSBzZW5kaW5nIGEgbmV3X3NlZ21lbnQgZXZlbnQgdG8gdGhlIHBheWxvYWRlcgorCSAgMjAwNzA4MjcxNzI0MjQtNGYwZjYtZDIwOTA3ZTNkNDM2ZDUwYmZlNzRlYjRmYzNkMmQ2ZDdiNmI2ZGJjNS5negorCisyMDA3LTA4LTI3IDE3OjIzOjM5ICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gQmV0dGVyIGhhbmRsaW5nIG9mIHBhY2tldHMsIHdlIHNlbmQgdGhlIHNhbWUgZHVyYXRpb24gZm9yIGFsbCBwYWNrZXRzIHRvIGF2b2lkIGh1Z2UgcGFja2V0cyB3aGVuIG1pbiBkdXJhdGlvbiBkZWZpbmVzIGFyZSBtb2RpZmllZC4KKwkgIDIwMDcwODI3MTcyMzM5LTRmMGY2LWNjOTMzMDQ0MzdlYTM3NmZmZjY0NThjNzRjNDZjMTlmNjkyMGQzMjkuZ3oKKworMjAwNy0wOC0yNyAxNzoyMzoyMiArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIENoYW5naW5nIG1pbmltdW0gdmFsdWVzIHRvIHdvcmsgYmV0dGVyIG9uIHNvbWUgZ2F0ZXdheXMKKwkgIDIwMDcwODI3MTcyMzIyLTRmMGY2LTViZjJiZmZhNTlhODI0NDUzOGRjZWQ3OTVmYTdkNzY0OTQ1MmNhOTEuZ3oKKworMjAwNy0wOC0yMiAyMDoxNjo1MyArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIFRoZSBEVE1GIHRvbmUgZ2VuZXJhdG9yIG5vdyByZXNwZWN0cyB0aGUgdm9sdW1lIGFyZ3VtZW50IHBhc3NlZCBpbiB0aGUgZXZlbnQKKwkgIDIwMDcwODIyMjAxNjUzLTRmMGY2LThiN2ZmODc0MDA2ZTExZjVhNzRkMGZkOTFlNWE5YTQzY2QwODJhZGEuZ3oKKworMjAwNy0wOC0yMiAxODowMTozMyArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5oOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIGRvbid0IGtub3cgd2h5IEkgZGlkIHRoYXQuLi4KKwkgIDIwMDcwODIyMTgwMTMzLTRmMGY2LTZhNzM4MmY2YzdkMzYzMGY5MWRhMzg0ZTE5MDQ3NjNjN2VhNmZhMWEuZ3oKKworMjAwNy0wOC0yMiAxNzo1NTozMyArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5oOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIFBvcnRlZCB0aGUgZXZlbnQgcXVldWUgd29yayBmcm9tIGR0bWZzcmMgdG8gcnRwZHRtZnNyYworCSAgQWRkZWQgYSBxdWV1ZSBiYXNlZCBzeXN0ZW0gZm9yIHRoZSBydHBkdG1mc3JjLiBOb3cgaXQgd2FpdHMgZm9yIHN0YXJ0L3N0b3AgbWVzc2FnZXMgb24gdGhlIHF1ZXVlLCBhbmQgbWFrZXMgc3VyZSB0aGF0IHRoZSBtaW5pbXVtIGR1dHkgY3ljbGUgKDEyMG1zKSBpcyByZXNwZWN0ZWQgYmV0d2VlbiBlYWNoCisJICB0b25lLCBpbmNsdWRpbmcgaW50ZXItZGlnaXQgc2lsZW5jZS4KKwkgIDIwMDcwODIyMTc1NTMzLTRmMGY2LWYyNzQxNGM0MDZmMWY3YjAwYzlhOTA4NGE5ODhjZjNhNzkzMGZlNWMuZ3oKKworMjAwNy0wOC0yMiAxNzo1NDo0NCArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIG91Y2gsIHByaW50aW5nIHdpdGggYXJndW1lbnRzIGJ1dCB3aXRob3V0ICVzLi4gdGhhdCBtYWRlIGl0IHNlZ2ZhdWx0IGEgZmV3IHRpbWVzLi4uCisJICAyMDA3MDgyMjE3NTQ0NC00ZjBmNi00NDVlYTZjZTdhOTY2OGQwNGNmOTk5YWY3NzJhNTA0ZWM3NGZiNjdhLmd6CisKKzIwMDctMDgtMjIgMTc6NTE6MjYgKzAwMDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuaDoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBNb3ZlZCB0aGUgdGltZXN0YW1wIGZyb20gdGhlIGV2ZW50IHRvIGR0bWZzcmMgc3RydWN0dXJlIHNpbmNlIHdlIGhhdmUgb25seSBvbmUgZXZlbnQgYXQgYSB0aW1lLCBzbyBsZXQncyBrZWVwIGl0IHN0b3JlZCBpbiB0aGUgZHRtZnNyYyBzdHJ1Y3QKKwkgIDIwMDcwODIyMTc1MTI2LTRmMGY2LTUzYmNkYTJiZDhhZThjNTZkMjllNjJlNjlhYzE5YTMwZTA4YWQzNTAuZ3oKKworMjAwNy0wOC0yMCAyMDozODoyNiArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5oOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIEFkZGVkIGEgcXVldWUgYmFzZWQgc3lzdGVtIGZvciB0aGUgZHRtZnNyYy4gTm93IGl0IHdhaXRzIGZvciBzdGFydC9zdG9wIG1lc3NhZ2VzIG9uIHRoZSBxdWV1ZSwgYW5kIG1ha2VzIHN1cmUgdGhhdCB0aGUgbWluaW11bSBkdXR5IGN5Y2xlICgxMjBtcykgaXMgcmVzcGVjdGVkIGJldHdlZW4gZWFjaCB0b25lLCBpbmNsdWRpbmcgaW50ZXItZGlnaXQgc2lsZW5jZS4KKwkgIDIwMDcwODIwMjAzODI2LTRmMGY2LTc1MGEyMmI2MTJhNWU0OTVlNzY3NjY2OTM0NDY1YzM0ZmUzMjA3NGIuZ3oKKworMjAwNy0wOC0yMCAxODo0ODo1MiArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvTWFrZWZpbGUuYW06CisJKiBnc3QvZHRtZi9nc3RkdG1mLmM6CisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmg6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmg6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gQWRkZWQgZHRtZnNyYywgYSBEVE1GIFRvbmUgR2VuZXJhdG9yLCBhbmQgbWFkZSBpdCBwYXJ0IG9mIHRoZSAnZHRtZicgcGx1Z2luLgorCSAgMjAwNzA4MjAxODQ4NTItNGYwZjYtYTBkODVlNjc3MDgyOTBhZWJhZmE4OWFiNzlkM2NlZGQ1ODE1YjYyMC5negorCisyMDA3LTA4LTIwIDE4OjQ4OjAwICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi8uZ2l0LWRhcmNzLWRpcjoKKwkqIGdzdC9kdG1mL01ha2VmaWxlLmFtOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5oOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIE1vdmVkIHJ0cGR0bWYgdG8gZHRtZiBkaXJlY3RvcnkKKwkgIDIwMDcwODIwMTg0ODAwLTRmMGY2LWZhMzNlYTk3NDUxMDE2MWRlOGM5OTUxYzM5MDg3YWYzNjEzYjY1YTQuZ3oKKworMjAwOS0wMi0yMSAxMjo0NzowMCArMDEwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIChhdCkgYXBlc3RhYXJ0IChkb3QpIG9yZz4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgcmVzcGVjdCBERUZBVUxUIHNlZ21lbnQgYnkgY2xpcHBpbmcgdGhlIGxhc3QgYnVmZmVyIHRvIGJlIHNlbnQKKworPT09IHJlbGVhc2UgMC4xMC4xNCA9PT0KKworMjAwOS0wMi0xOSAyMDowOTowNyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAwLjEwLjE0CisKKzIwMDktMDItMTkgMjA6MDc6NDEgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAwOS0wMi0xOSAxMzoxNjozOSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NyYy5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc3JjLmM6CisJICBVcGRhdGUgU2luY2U6IHRhZ3MgaW4gYXV0b2RldGVjdCBzcmNzIGFuZCBhdWRpb2VjaG8KKworMjAwOS0wMi0xOSAxMToxMjo1OCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBDaGFuZ2VMb2c6CisJICBVcGRhdGUgQ2hhbmdlTG9nIGZvciAwLjEwLjEzLjMKKworMjAwOS0wMi0xOSAxMTowOTowMyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjEzLjMgcHJlLXJlbGVhc2UKKworMjAwOS0wMi0xMCAxMToyNTo0OSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOgorCSAgcHVsc2VtaXhlcjogRml4IGNvbXBpbGVyIHdhcm5pbmdzLgorCSAgQ2FzdCAoZW51bSAqKSB0byAoaW50ICopLCBub3QgbmVjZXNzYXJpbHkgdGVjaG5pY2FsbHkgcmlnaHQsCisJICBidXQgcGx1Z3MgIzU3MTE1My4KKworMjAwOS0wMi0xMyAxODowMzoxNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkgIHB1bHNlc2luazogSXNzdWUgcHJvcGVydHkgY2hhbmdlIG5vdGlmaWNhdGlvbiBpbiBzdHJlYW1pbmcgdGhyZWFkLCByYXRoZXIgdGhhbiBQQSB0aHJlYWQuCisJICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKCkgKGEuby4pIGFuZCBieSBleHRlbnNpb24gZ2V0X3Byb3BlcnR5IHNob3VsZAorCSAgbm90IGJlIGRvbmUgZnJvbSBhIFBBIHRocmVhZCwgYnV0IHRoZSBsYXR0ZXIgbWF5IG9jY3VyIGFzIGEgcmVzdWx0IG9mIGEKKwkgIHByb3BlcnR5IGNoYW5nZSBub3RpZmljYXRpb24uICBGaXhlcyAjNTcxMjA0ICh0aG91Z2ggY3VycmVudCBzaXR1YXRpb24KKwkgIG5vdCBpZGVhbCwgZS5nLiBwb3N0IG1lc3NhZ2UgcmF0aGVyIHRoYW4gc2lnbmFsKS4KKworMjAwOS0wMi0xMCAxMToyNzo1MSArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkgIGFzcGVjdHJhdGlvY3JvcDogRG9uJ3QgZm9yZ2V0IHRvIGNhbGwgcGFyZW50IGZpbmFsaXplIGltcGxlbWVudGF0aW9uLgorCSAgVGhpcyBmaXhlcyBhIG1lbW9yeSBsZWFrIChsZWFraW5nIHRoZSBjb250YWluZWQgZWxlbWVudHMgb2YgdGhlIGJpbikuCisKKzIwMDktMDItMTAgMDg6NDM6NTkgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogRml4IGJ1aWxkLiBGaXhlcyAjNTcxMDM4CisKKzIwMDktMDItMDkgMTI6MTg6MzYgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGNvbW1vbjoKKwkgIEJ1bXAgcmV2aXNpb24gdG8gdXNlIGZvciBjb21tb24gc3VibW9kdWxlLgorCisyMDA5LTAyLTA3IDE2OjAwOjQ5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIENoYW5nZUxvZzoKKwkgIENoYW5nZUxvZzogVXBkYXRlIENoYW5nZUxvZyBmb3IgMC4xMC4xMy4yCisKKzIwMDktMDItMDcgMTU6NTg6NTUgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zIGZvciAwLjEwLjEzLjIKKworMjAwOS0wMi0wNyAxNTo0NjowNyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTAuMTMuMgorCisyMDA5LTAyLTA3IDE1OjQwOjUzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIHBvL0xJTkdVQVM6CisJKiBwby9tdC5wbzoKKwkgIHBvOiBBZGQgTWFsdGVzZSB0cmFuc2xhdGlvbgorCisyMDA5LTAyLTA2IDE2OjE2OjA1IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2R1bXAuaDoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZm91cmNjLmg6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X3R5cGVzLmM6CisJICBxdGRlbXV4OiBBZGQgaGFuZGxpbmcgZm9yIHN0cHMgYXRvbXMKKwkgIHN0cHMgYXRvbXMgY29udGFpbiAicGFydGlhbCBzeW5jIiBpbmZvcm1hdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCBpdCdzCisJICBhIHN5bmMgcG9pbnQgd2hlcmUgcHRzICE9IGR0cy4gIFRoaXMgaXMgbmVlZGVkIHRvIHByb3Blcmx5IGhhbmRsZQorCSAgTVBFRzIsIEguMjY0LCBEaXJhYywgZXRjLiwgaW4gcXVpY2t0aW1lLgorCisyMDA5LTAyLTA1IDE1OjUxOjQyIC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogaWYgd2UgYWJvcnRlZCByZWFkaW5nLCBkb24ndCBkbyBpbnRvIGFuIGluZmluaXRlIGxvb3AuCisJICBJZiBvdXIgcmVhZCBjYWxsYmFjayByYW4gb3V0IG9mIGRhdGEsIHNvIGhhZCB0byBhYm9ydCByZWFkaW5nLCB3ZSByZXR1cm4KKwkgIEdTVF9GTE9XX0VSUk9SIGluc3RlYWQgb2YgZ29pbmcgaW50byBhbiBpbmZpbml0ZSBsb29wLgorCisyMDA5LTAyLTA1IDEwOjE5OjM3IC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiByZW1vdmUgbm9uLWVtYmVkZGVkIG1vZGUgYW5kIGZpeCBtZW1vcnkgbWFuYWdlbWVudC4KKwkgIFJlbW92ZSBub24tZW1iZWRkZWQgbW9kZS4gRW1iZWQgbW9kZSBiZWNvbWVzIGRlZmF1bHQgYW5kIG9ubHkgbW9kZS4KKwkgIGVtYmVkIHByb3BlcnR5IGlzIHJldGFpbmVkIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eS4KKwkgIEFkZGVkIGF1dG9yZWxlYXNlIHBvb2xzIGFyb3VuZCBhbGwgb2JqYyBmdW5jdGlvbnMgdGhhdCBtaWdodCBiZSBjYWxsZWQKKwkgIGZyb20gYSBub24tbWFpbiB0aHJlYWQuCisKKzIwMDktMDItMDUgMjA6MDI6MDEgKzAxMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGRlYnVnIG9uIHRoZSBvYmplY3QKKworMjAwOS0wMi0wNCAxNjo0MDoxMyAtMDgwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHNvbmdiaXJkbmVzdC5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hyaW5nYnVmZmVyLmM6CisJICBvc3hhdWRpbyBmaXhlczogbXVsdGljaGFubmVsIGFuZCBjaGFuZ2luZyBjYXBzLgorCSAgRW5zdXJlIHdlIGNyZWF0ZSB0aGUgcmluZ2J1ZmZlciBzZWdtZW50IHNpemUgYXMgYSBtdWx0aXBsZSBvZiB0aGUKKwkgIGJ5dGVzIHBlciBzYW1wbGUgKGZpeGVzIDYtY2hhbm5lbCBvdXRwdXQpLgorCSAgUmVzZXQgdGhlIHNlZ29mZnNldCB3aGVuIGFjcXVpcmluZyB0aGUgcmluZ2J1ZmZlciwgc28gd2UgZG9uJ3QgcmV0YWluCisJICBhIGJvZ3VzIG9mZnNldCB3aGVuIGNhcHMgY2hhbmdlLgorCisyMDA5LTAyLTA0IDExOjM4OjMwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBLZWVwIHRyYWNrIG9mIGNvbm5lY3RlZCBzdGF0ZQorCSAgS2VlcCB0cmFjayBvZiB0aGUgc3RhdGUgb2YgdGhlIGNvbm5lY3Rpb24gYW5kIGRvbid0IHRyeSB0byBzZW5kIFRFQVJET1dOIHdoZW4KKwkgIHRoZSBzZXJ2ZXIgaGFzIGNsb3NlZCB0aGUgY29ubmVjdGlvbi4KKworMjAwOS0wMi0wNCAwOToyMDoyOCArMDEwMCAgUm9iaW4gU3RvY2tlciA8cm9iaW5Abmlib3Iub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIFJlYWQgTWF0cm9za2EgVGl0bGUgZWxlbWVudCBmb3IgdGhlIFRJVExFIHRhZworCSAgTm90IGFsbCBNYXRyb3NrYSBmaWxlcyBoYXZlIGEgVGFncyBlbGVtZW50IHdoaWNoIGNvbnRhaW5zCisJICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGl0bGUgYW1vbmcgb3RoZXIgdGhpbmdzLiBNb3N0IHZpZGVvCisJICBNYXRyb3NrYSBmaWxlcyBvbmx5IGNvbnRhaW4gdGhlIFRpdGxlIGVsZW1lbnQgc28gd2UKKwkgIHNob3VsZCBwYXJzZSB0aGlzIHRvby4gRml4ZXMgYnVnICM1NzA0MzUuCisKKzIwMDktMDItMDMgMjI6MzQ6MzggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmUuYWM6IGJ1bXAgY29yZS9iYXNlIHJlcXVpcmVtZW50cyB0byByZWxlYXNlZCB2ZXJzaW9ucworCisyMDA5LTAyLTAzIDE3OjEwOjMwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9lY2hvLmM6CisJICBGaXggYXVkaW9lY2hvIHVuaXQgdGVzdCBvbiAzMiBiaXQgc3lzdGVtcworCSAgQ2FzdCB0aGUgbmV3IHZhbHVlIGZvciB0aGUgImRlbGF5IiBwcm9wZXJ0eSB0byBHc3RDbG9ja1RpbWUuCisJICBJbnRlZ2VycyB3aXRob3V0IHR5cGUgYXJlIHBhc3NlZCB0byB2YXJhcmcgZnVuY3Rpb25zIHdpdGgKKwkgIGFuIGludGVnZXIgdHlwZSB0aGF0IGNhbiBob2xkIGEgcG9pbnRlci4KKworMjAwOS0wMi0wMyAxNDowOToyNiArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSAgZXF1YWxpemVyOiBEb24ndCByZXNldCBmcmVxdWVuY3kgYmFuZHMgZnJvbSB1c2VyIHNldHRpbmdzLiBGaXhlcyAjNTcwMzQzLgorCSAgTW92ZSByZWFsbG9jYXRpbmcgdGhlIGhpc3RvcnkgYnVmZmVyIG91dCBvZiBfY29tcHV0ZV9mcmVxdWVuY2llcygpIGFuZCBjYWxsIHRoZQorCSAgcmlnaHQgZnVuY3Rpb24gYXMgbmVlZGVkLiBBZGQgc29tZSBsb2dnaW5nIGFuZCB0d2VhayB0aGUgZm9ybWF0dGluZyBvZiBleGlzdGluZworCSAgbG9nZ2luZy4gU2ltcGxpZnkgc2V0dGluZyBuZWVkX25ld19jb2VmZmljaWVudHMgd2hlbiBjaGFuZ2luZyBwcm9wZXJ0aWVzLgorCisyMDA5LTAyLTAzIDExOjUyOjE1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9lY2hvLmM6CisJICBVc2UgZ3VpbnQ2NCBpbnN0ZWFkIG9mIGd1aW50IGZvciBzdG9yaW5nIGd1aW50NjQKKworMjAwOS0wMi0wMiAxODozNzozNSArMDEwMCAgSm9uYXRoYW4gTWF0dGhldyA8bm90dmVyeXNtYXJ0QGdtYWlsLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIFVzZSBjb3JyZWN0IGZsYWcgZm9yIHRoZSBHTk9NRSBwcm94eSBjb25maWd1cmF0aW9uCisJICBGaXhlcyBidWcgIzU1MjE0MC4KKworMjAwOS0wMi0wMiAxMzowODoxNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvaWNsZXMvdjRsMnNyYy10ZXN0LmM6CisJICBGaXggY29tcGlsZXIgd2FybmluZ3MKKwkgIGZpeCBjb21waWxlciB3YXJuaW5ncyBkdWUgdG8gdW51c2VkIHJldHVybiB2YWx1ZXMgb2Ygc2NhbmYuCisKKzIwMDktMDEtMzEgMTE6MDg6MzAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9pY2xlcy92NGwyc3JjLXRlc3QuYzoKKwkgIEZpeCBmb3JtYXQgc3RyaW5nIGNvbXBpbGVyIHdhcm5pbmcKKworMjAwOS0wMS0zMCAyMjoyNDoxNCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgIEFkZCByZWxlYXNlaW5mbyB3aXRoIG9ubGluZSB1cmwuCisKKzIwMDktMDEtMzAgMTg6MDQ6MTEgKzAwMDAgIEphbiBTY2htaWR0IDxqYW4uc2NobWlkdEBzdW4uY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2ljbGVzL01ha2VmaWxlLmFtOgorCSAgRml4IHVwIHNvbWUgY29tcGlsZSBmbGFncworCisyMDA5LTAxLTMwIDE3OjM1OjQ5ICswMDAwICBKYW4gU2NobWlkdCA8amFuLnNjaG1pZHRAc3VuLmNvbT4KKworCSogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzoKKwkgIERvbid0IHVzZSBHbGliIDIuMTYgZnVuY3Rpb24gZ19zdHJjbXAwLgorCisyMDA5LTAxLTMwIDE3OjM0OjQ1ICswMDAwICBKYW4gU2NobWlkdCA8amFuLnNjaG1pZHRAc3VuLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgRG9uJ3QgZG8gdm9pZCBwb2ludGVyIGFyaXRobWV0aWMKKworMjAwOS0wMS0zMCAxNzoyNjoxOSArMDAwMCAgSmFuIFNjaG1pZHQgPGphbi5zY2htaWR0QHN1bi5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgRml4IEZvcnRlIGNvbXBpbGVyIHdhcm5pbmdzLgorCSAgRG9uJ3QgZG8gdm9pZCBwb2ludGVyIGFyaXRobWV0aWMuIERvbid0IGhhdmUgYW4gdW5yZWFjaGFibGUgc3RhdGVtZW50LgorCisyMDA5LTAxLTMwIDE3OjI5OjQ1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEJ1bXAgY29tbW9uCisKKzIwMDktMDEtMjYgMTA6MzM6NTUgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIFJlbW92ZSB1c2VsZXNzIHByb2Nlc3NpbmcgZm9yIG5vbi1yYXcgZm9ybWF0cworCisyMDA5LTAxLTMwIDE1OjM0OjMxICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2ZvdXJjYy5oOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF90eXBlcy5jOgorCSAgQWRkIHN1cHBvcnQgZm9yIHRoZSAnUmVxdWlyZW1lbnQnIGFuZCAnRW5jb2RlcicgdGFncworCisyMDA5LTAxLTMwIDE1OjMzOjE5ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBNb2RpZnkgcHJpdmF0ZS10YWcgbmFtZSBmb3JtYXR0ZXIgc28gdGhhdCBpdCBkb2Vzbid0IGdvIG1hZCBhdCBmb3VyY2Mgc3RhcnRpbmcgd2l0aCAnKGMpJy4KKworMjAwOS0wMS0zMCAxNDo0MDo1MSArMDEwMCAgQnJpamVzaCBTaW5naCA8YnJpamVzaC5rc2luZ2hAZ21haWwuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuYzoKKwkgIEZpeCBjb21wYXJpc29uIG9mIHRoZSB0dW5lciBub3JtcworCSAgVGhlIFY0TDIgdHVuZXIgbm9ybXMgdGhhdCBhIGRldmljZSBzdXBwb3J0cyBjb3VsZAorCSAgYmUgYSBzdWJzZXQgb2Ygc29tZSBub3JtIChlLmcuIE5UU0MgaW5zdGVhZCBvZiBOVFNDX00pLgorCSAgVGhlIGNvbXBhcmlzb24gc2hvdWxkIGJlIGRvbmUgYnkgJiBpbnN0ZWFkIG9mID09LgorCSAgU2VlIGh0dHA6Ly93d3cubGludXh0di5vcmcvZG93bmxvYWRzL3ZpZGVvNGxpbnV4L0FQSS9WNEwyX0FQSS9zcGVjLXNpbmdsZS92NGwyLmh0bWwjU1RBTkRBUkQKKwkgIEZpeGVzIGJ1ZyAjNTY5ODIwLgorCisyMDA5LTAxLTMwIDA4OjUzOjA2ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBhdXRvZ2VuLnNoOgorCSogY29tbW9uOgorCSAgVXNlIGEgc3ltYm9saWMgbGluayBmb3IgdGhlIHByZS1jb21taXQgY2xpZW50LXNpZGUgaG9vaworCisyMDA5LTAxLTI5IDE0OjA4OjU2ICswMTAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJKiBnc3QvdmlkZW9jcm9wL2dzdGFzcGVjdHJhdGlvY3JvcC5jOgorCSAgT25seSB1bnJlZiB0aGUgcGVlciB3aGVuIHRoZXJlIGlzIG9uZS4KKworMjAwOS0wMS0yOSAxMTowNzo1OSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5jOgorCSAgUmVtb3ZlIHZlcnNpb24gbnVtYmVycyBmcm9tIGEgZmV3IGdzdC1sYXVuY2ggZXhhbXBsZXMuCisJICBUaGUgbWFqb3JpdHkgb2YgdGhlIGV4YW1wbGVzIGRvZSBub3QgdXNlIC0wLjEwIGFuZCB0aGlzIHdpbGwgYWxzbyBoZWxwIHVzIHRvIG1haW50YWluIHRoZSBkb2NzLgorCisyMDA5LTAxLTI5IDEwOjEwOjA4ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6CisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJKiBzeXMvb3NzL2dzdG9zc21peGVyZWxlbWVudC5jOgorCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6CisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy93YXZlZm9ybS9nc3R3YXZlZm9ybXNpbmsuYzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICBVcGRhdGUgYW5kIGFkZCBkb2N1bWVudGF0aW9uIGZvciBwbGF0Zm9ybSBzcGVjaWZpYyBwbHVnaW5zIChzeXMpLgorCSAgTGluayB0byBwcm9wZXJ0aWVzLiBDb3JyZWN0IHRpdGxlcyBmb3IgZXhhbXBsZXMuIEZpeCBleGFtcGxlcy4KKworMjAwOS0wMS0yOSAwOTo0NToyNSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSAgQWRkICcgdG8gZnJhbWVyYXRlIGFyZ3VtZW50IGFuZCByZW1vdmUgdGhlIHdvcmQgJ3NpbXBsZScgYXMgYWxsIG91ciBwaXBlbGluZXMgYXJlIGFwcGFyZW50bHkgc2ltcGxlLgorCisyMDA5LTAxLTI5IDA5OjQyOjU2ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIEFkZCBleGFtcGxlcyBmb3IgdGhlIGpwZWcgZWxlbWVudHMuCisKKzIwMDktMDEtMjggMjE6NDA6MTEgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgRml4IGNvbXBpbGUgZXJyb3IgaW4gdGhlIGxhc3QgY29tbWl0CisKKzIwMDktMDEtMjggMjA6MzQ6NDAgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L3B1bHNlL3B1bHNlcHJvYmUuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXByb2JlLmg6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5oOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5oOgorCSAgUmV3cml0ZSB0aGUgcHVsc2UgcGx1Z2luLCBjb25kaXRpb25hbGx5IGVuYWJsaW5nIG5ldyBiZWhhdmlvdXIgd2l0aCBuZXdlciBwdWxzZWF1ZGlvLgorCSAgRml4ZXM6ICM1Njc3OTQKKwkgICogSG9vayBwdWxzZXNpbmsncyB2b2x1bWUgcHJvcGVydHkgdXAgd2l0aCB0aGUgc3RyZWFtIHZvbHVtZSAtLSBub3QgdGhlCisJICBzaW5rIHZvbHVtZSBpbiBQQS4KKwkgICogUmVhZCB0aGUgZGV2aWNlIGRlc2NyaXB0aW9uIGRpcmVjdGx5IGZyb20gdGhlIHNpbmsgaW5zdGVhZCBvZiBnb2luZworCSAgdmlhIHRoZSBtaXhlci4KKwkgICogUHJvcGVybHkgaW1wbGVtZW50IF9yZXNldCgpIG1ldGhvZHMgZm9yIGJvdGggc2luayBhbmQgc291cmNlIHRvIGF2b2lkCisJICBkZWFkbG9ja3Mgd2hlbiBzaHV0dGluZyBkb3duIGEgcGlwZWxpbmUuCisJICAqIFJlcGxhY2UgYWxsIHNpbXBsZSBwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0KCkgYnkgcHJvcGVyIGxvb3BzIHRvCisJICBndWFyYW50ZWUgdGhhdCB3ZSB3YWl0IGZvciB0aGUgcmlnaHQgZXZlbnQgaW4gY2FzZSBtdWx0aXBsZSBldmVudHMgYXJlCisJICBmaXJlZC4gIFdoaWxlIHRoaXMgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSBpbiBtYW55IGNhc2VzIGl0CisJICBjZXJ0YWlubHkgaXMgbW9yZSBjb3JyZWN0IGFuZCBtYWtlcyBtZSBzbGVlcCBiZXR0ZXIgYXQgbmlnaHQuCisJICAqIFJlcGxhY2UgQ0hFQ0tfREVBRF9HT1RPIG1hY3JvcyB3aXRoIHByb3BlciBmdW5jdGlvbnMKKwkgICogRXh0ZW5kIHRoZSBudW1iZXIgb2Ygc3VwcG9ydGVkIGNoYW5uZWxzIHRvIDMyIHNpbmNlIHRoYXQgaXMgdGhlIGFjdHVhbAorCSAgbGltaXQgaW4gUEEuCisJICAqIEdldCByaWQgb2YgX2Rpc3Bvc2UoKSBtZXRob2RzIHNpbmNlIHdlIGRvbid0IG5lZWQgdGhlbS4KKwkgICogSW5jcmVhc2UgdGhlIHZvbHVtZSBwcm9wZXJ0eSB1cHBlciBsaW1pdCBvZiB0aGUgc2luayB0byAxMDAwLgorCSAgKiBSZXNldCBmdW5jdGlvbiBwb2ludGVycyBhZnRlciB3ZSBkaXNjb25uZWN0IGEgc3RyZWFtL2NvbnRleHQuIEJldHRlcgorCSAgZml4IGZvciBidWcgNTU2OTg2LgorCSAgKiBSZXNldCB0aGUgc3RhdGUgb2YgdGhlIGVsZW1lbnQgcHJvcGVybHkgaWYgb3Blbi9wcmVwYXJlIGZhaWxzCisJICAqIENvcmsgdGhlIFBBIHN0cmVhbSB3aGVuIHRoZSBwaXBlbGluZSBpcyBwYXVzZWQuIFRoaXMgYWxsb3dzIHRoZSBQQQorCSAgKiBkYWVtb24gdG8KKwkgIGNsb3NlIGF1ZGlvIGRldmljZSBvbiBwYXVzZSBhbmQgdGh1cyBzYXZlIGEgYml0IG9mIHBvd2VyLgorCSAgKiBTZXQgUEEgc3RyZWFtIHByb3BlcnRpZXMgYmFzZWQgb24gR1NUIHRhZ3Mgc3VjaCBhcyBHU1RfVEFHX1RJVExFLAorCSAgR1NUX1RBR19BUlRJU1QsIGFuZCBzbyBvbi4KKwkgIFNpZ25lZC1vZmYtYnk6IExlbm5hcnQgUG9ldHRlcmluZyA8bGVubmFydEBwb2V0dGVyaW5nLm5ldD4KKworMjAwOS0wMS0yOCAxNzo0NjowNiArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOgorCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJKiBleHQvY2Fpcm8vZ3N0dGltZW92ZXJsYXkuYzoKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9lc2QvZXNkbW9uLmM6CisJKiBleHQvZXNkL2VzZHNpbmsuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOgorCSogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc2luay5jOgorCSogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zcmMuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZnNpbmsuYzoKKwkqIGV4dC9oYWwvZ3N0aGFsYXVkaW9zaW5rLmM6CisJKiBleHQvaGFsL2dzdGhhbGF1ZGlvc3JjLmM6CisJKiBleHQvaGFsL2hhbC5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZXh0L2pwZWcvZ3N0c21va2VkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmM6CisJKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5jOgorCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuaDoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOgorCSogZXh0L3B1bHNlL3B1bHNlbWl4ZXIuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkqIGV4dC90YWdsaWIvZ3N0YXBldjJtdXguY2M6CisJKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgVXBkYXRlIGFuZCBhZGQgZG9jdW1lbnRhdGlvbiBmb3IgcGx1Z2lucyB3aXRoIGRlcHMgKGV4dCkuCisJICBMaW5rIHRvIHByb3BlcnRpZXMuIENvcnJlY3QgdGl0bGVzIGZvciBleGFtcGxlcy4gRG9jdW1lbnQgYSBmZXcgdHJpdmlhbCBjYXNlcy4gS2VlcCBsaXN0cyBpbiBzZWN0aW9uIGZpbGUgYW5kIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbSBhbHBoYWJldGljYWxseSBvcmRlcmVkLiBGaXggd2FybmluZ3MgdGhhdCBndGstZG9jIHBvaW50cyBvdXQuCisKKzIwMDktMDEtMjggMTU6NTc6MjAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5oOgorCSAgTGltaXQgdGhlIGRlbGF5IGJ5IGEgbmV3IG1heC1kZWxheSBwcm9wZXJ0eQorCSAgSW50cm9kdWNlIGEgbmV3IG1heC1kZWxheSBwcm9wZXJ0eSB0aGF0IGNhbiBvbmx5CisJICBiZSBzZXQgYmVmb3JlIGdvaW5nIHRvIFBMQVlJTkcgb3IgUEFVU0VELiBUaGlzCisJICBpcyB1c2VkIHRvIGxpbWl0IHRoZSBtYXhpbXVtIGRlbGF5IGFuZCBpcyBzZXQKKwkgIHRvIHRoZSBjdXJyZW50IGRlbGF5IGJ5IGRlZmF1bHQuCisJICBVc2luZyB0aGlzIHdpbGwgbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBlbm91Z2ggZGF0YQorCSAgaW4gb3VyIGludGVybmFsIHJpbmdidWZmZXIgZm9yIHRoZSBlY2hvLiBXaXRoIGR5bmFtaWMKKwkgIHJlYWxsb2NhdGlvbiBvZiB0aGUgcmluZ2J1ZmZlciBhcyB1c2VkIGJlZm9yZSBzaWxlbmNlCisJICBjb3VsZCd2ZSBiZWVuIHVzZWQgYXMgdGhlIGVjaG8gZGlyZWN0bHkgYWZ0ZXIgc2V0dGluZworCSAgYSBuZXcgZGVsYXkuCisKKzIwMDktMDEtMjggMTE6NTg6NDIgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJldmVydCBwcmV2aW91cyBib2d1cyBjb21taXQKKworMjAwOS0wMS0yOCAxMjoyOTo0MiArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSogZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6CisJKiBnc3QvZGVidWcvZ3N0cHVzaGZpbGVzcmMuYzoKKwkqIGdzdC9kZWJ1Zy9nc3R0YWdpbmplY3QuYzoKKwkqIGdzdC9kZWJ1Zy9wcm9ncmVzc3JlcG9ydC5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXJuYmFuZHMuYzoKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmM6CisJKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzoKKwkqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOgorCSogZ3N0L2xhdy9hbGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlYWxwaGEuYzoKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFVwZGF0ZSBhbmQgYWRkIGRvY3VtZW50YXRpb24gZm9yIHBsdWdpbnMgd2l0aCBubyBkZXBzIChnc3QpLgorCSAgTGluayB0byBwcm9wZXJ0aWVzLiBDb3JyZWN0IHRpdGxlcyBmb3IgZXhhbXBsZXMuIERvY3VtZW50IGEgZmV3IHRyaXZpYWwgY2FzZXMuIEtlZXAgbGlzdHMgaW4gc2VjdGlvbiBmaWxlIGFuZCBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW0gYWxwaGFiZXRpY2FsbHkgb3JkZXJlZC4KKworMjAwOS0wMS0yNyAyMzowOTowNSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1vc3NzcmMuYzoKKwkgIEZpeCBleGFtcGxlIGFwcHMgYnkgZHJhd2luZyBpbiB0aGUgbWFpbi1sb29wLgorCisyMDA5LTAxLTI3IDIwOjMzOjAyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICB0ZXN0czogZml4IGJ1aWxkIG9mIGFzcGVjdHJhdGlvIGNyb3AgdW5pdCB0ZXN0IGluIHVuaW5zdGFsbGVkIGVudmlyb25tZW50LgorCisyMDA5LTAxLTI3IDIwOjMwOjAyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogLmdpdGlnbm9yZToKKwkgIE1ha2UgZ2l0IGlnbm9yZSBiYWNrdXAgZmlsZXMKKworMjAwOS0wMS0yNiAxNjoxNDo0NyArMDEwMCAgUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2pAYXhpcy5jb20+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkgIFBsdWcgYSBtZW1vcnkgbGVhayBpbiBhIGRlYnVnIG1lc3NhZ2UuCisKKzIwMDktMDEtMjIgMTU6NTk6NDAgKzAxMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmM6CisJICBDb3JyZWN0IHJldHVybiB2YWx1ZSBmcm9tIGdzdF91ZHBfZ2V0X2FkZHIoKSB3aGVuIG5vIGtub3duIGZhbWlseSBpcyBmb3VuZC4KKworMjAwOS0wMS0yNiAwOTo1MTozNiArMDEwMCAgSm9uYXRoYW4gTWF0dGhldyA8am9uYXRoYW5AZDE0bi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBVc2UgbGlic291cC1nbm9tZSBmb3IgcHJveHkgY29uZmlndXJhdGlvbiBpZiBhdmFpbGFibGUKKwkgIElmIGxpYnNvdXAtZ25vbWUgaXMgZm91bmQgdXNlIHRoaXMgYXMgaXQgd2lsbCBnaXZlIHVzCisJICB0aGUgR05PTUUgcHJveHkgY29uZmlndXJhdGlvbi4gT3RoZXJ3aXNlIHVzZSBub3JtYWwKKwkgIGxpYnNvdXAuCisJICBUaGUgR05PTUUgcHJveHkgY29uZmlndXJhdGlvbiB3aWxsIG9ubHkgYmUgdXNlZCBpZgorCSAgdGhlIHByb3h5IHByb3BlcnRpZXMgYXJlIG5vdCBzZXQgb24gc291cGh0dHBzcmMKKwkgIGFuZCBpZiB0aGUgaHR0cF9wcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QKKwkgIHNldC4KKwkgIEZpeGVzIGJ1ZyAjNTUyMTQwLgorCisyMDA5LTAxLTI1IDE5OjI2OjQ2IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgQWRkIGEgZmV3IG1vcmUgdmlkZW8gZm91cmNjJ3MKKworMjAwOS0wMS0yNCAxNDo0ODowMCArMDEwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXNwZWN0cmF0aW9jcm9wLmM6CisJICBBZGQgdW5pdCB0ZXN0IGZvciBhc3BlY3RyYXRpb2Nyb3AgRml4ZXMgYnVnICM1Mjc5NTEKKwkgIEFkZCB1bml0IHRlc3QgZm9yIGFzcGVjdHJhdGlvY3JvcCBhbmQgcmVmYWN0b3IgdGhpcyBlbGVtZW50LiBBZGRlZAorCSAgZmluYWxpemUgZnVuY3Rpb24gdG8gY2xlYW51cCBsZWFraW5nIG11dGV4LgorCisyMDA5LTAxLTI1IDE0OjM0OjA5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJICBJZ25vcmUgY2hlY2sgYmluYXJpZXMKKworMjAwOS0wMS0yNCAxODoyODowNiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5jOgorCSAgU2F2ZSBzb21lIGFsbG9jYXRpb25zIGlmIHRoZSBlY2hvIGRlbGF5IGlzIGluY3JlYXNlZCBvZnRlbgorCSAgU2F2ZSBzb21lIGFsbG9jYXRpb25zIGlmIHRoZSBlY2hvIGRlbGF5IGlzIGluY3JlYXNlZCBvZnRlbgorCSAgZHVyaW5nIHBsYXliYWNrIGJ5IGFsd2F5cyBhbGxvY2F0aW5nIGVub3VnaCBtZW1vcnkgdG8gaG9sZAorCSAgZGF0YSB1cCB0byB0aGUgbmV4dCBjb21wbGV0ZSBzZWNvbmQsIGkuZS4gaW4gdGhlIHdvcnN0IGNhc2UKKwkgIGFsbG9jYXRlIG1lbW9yeSBmb3Igb25lIGFkZGl0aW9uYWwgc2Vjb25kLgorCisyMDA5LTAxLTI0IDE0OjI1OjA4ICswMTAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkgIFVwZGF0ZSBwbHVnaW4gdmVyc2lvbiBpbiBkb2N1bWVudGF0aW9uCisKKzIwMDktMDEtMjMgMjE6NDc6NDAgKzAxMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJICBGaXggbGluayBpbiBkb2N1bWVudGF0aW9uIG9mIHZpZGVvY3JvcCBlbGVtZW50CisKKzIwMDktMDEtMjMgMjE6NDY6MTMgKzAxMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkgIEFkZCBkb2N1bWVudGF0aW9uIGZvciBhc3BlY3RyYXRpb2Nyb3AKKworMjAwOS0wMS0yNCAxMzoyMTozOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFVwZGF0ZSB3aW4zMi9jb21tb24vY29uZmlnLmggZm9yIHRoZSBuZXcgZGV2ZWxvcG1lbnQgY3ljbGUKKworMjAwOS0wMS0yNCAxMTo1Mzo0MCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5jOgorCSAgQWRkIG5vdGUgdGhhdCBhdWRpb2VjaG8ncyByZXZlcmIgc291bmRzIG1ldGFsbGljCisJICBBZGQgYSBub3RlIHRvIHRoZSBkb2NzIHRoYXQgYXVkaW9lY2hvJ3MgcmV2ZXJiIHdpbGwKKwkgIHNvdW5kIG1ldGFsbGljLiBUaGlzIGhhcHBlbnMgYmVjYXVzZSBmb3IgYSByZWFsCisJICByZXZlcmIgZmlsdGVyIGFkZGl0aW9uYWwgZmlsdGVyaW5nIGlzIG5lY2Vzc2FyeS4KKwkgIEFsc28gbm90ZSB3aGljaCB2YWx1ZXMgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBkZWxheQorCSAgcHJvcGVydHkgdG8gZ2V0IGFuIGVjaG8gZWZmZWN0LgorCisyMDA5LTAxLTIzIDIzOjM4OjEwICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIC5naXRpZ25vcmU6CisJKiBkb2NzL3BsdWdpbnMvLmdpdGlnbm9yZToKKwkqIHBvLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9leGFtcGxlcy9hdWRpb2Z4Ly5naXRpZ25vcmU6CisJICBNb3JlIGVudHJpZXMgZm9yIHRoZSBnaXRpZ25vcmVzCisKKzIwMDktMDEtMjMgMjA6MzY6MjcgKzAxMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOgorCSAgc2tpcCB2aWRlby94LXJhdy1ncmF5IGluIHZpZGVvY3JvcCB1bml0IHRlc3QKKwkgIEEgcmVjZW50IGNvbW1pdCBhZGRlZCB2aWRlby94LXJhdy1ncmF5IHN1cHBvcnQgdG8gdmlkZW9jcm9wLiBIb3dldmVyCisJICB0aGlzIGxldHMgdGhlIHZpZGVvY3JvcCB1bml0IHRlc3QgZmFpbC4gQmVjYXVzZSB2aWRlb3Rlc3RzcmMgY2FuJ3QKKwkgIGdlbmVyYXRlIHRoaXMgZm9ybWF0LgorCisyMDA5LTAxLTIzIDE1OjM5OjQ2ICswMTAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJKiBnc3QvdmlkZW9jcm9wL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmg6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSAgQWRkIGFzcGVjdHJhdGlvY3JvcCBlbGVtZW50LiBGaXhlcyBidWcgIzUyNzk1MQorCSAgQWRkIG5ldyBhc3BlY3RyYXRpb2Nyb3AgZWxlbWVudCB0aGF0IGNyb3BzIHRoZSB2aWRlbworCSAgdG8gYSBzcGVjaWZpZWQgYXNwZWN0IHJhdGlvIHVzaW5nIHZpZGVvY3JvcC4KKworMjAwOS0wMS0yMyAxMDo0OToyOCArMDEwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzoKKwkgIEZpeCBuYXZpZ2F0aW9uIGV2ZW50IGZvcndhcmRpbmcgd2hpbGUgY3JvcHBpbmcuIEZpeGVzIGJ1ZyAjNTY3OTkyLgorCSAgRml4IHRoZSBuYXZpZ2F0aW9uIGV2ZW50IGZvcndhcmRpbmcgd2hpbGUgY3JvcHBpbmcgYnkgYWRqdXN0aW5nCisJICB0aGUgbW91c2UgcG9zaXRpb24gYnkgdGhlIGFtb3VudCBvZiBjcm9wcGVkIHBpeGVscy4KKworMjAwOS0wMS0yMyAxMDowNDozOSArMDEwMCAgQnJpYW4gQ2FtZXJvbiA8YnJpYW4uY2FtZXJvbkBzdW4uY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBGaXggbGlua2luZyBvbiBTb2xhcmlzLiBGaXhlcyBidWcgIzU2ODgwOS4KKwkgIENoZWNrIGZvciB0aGUgc29ja2V0IGxpYnJhcnkgd2hpY2ggaXMgbmVlZGVkCisJICBmb3Igc29ja2V0KCkgb24gU29sYXJpcy4KKworMjAwOS0wMS0yMiAyMjo0MTo0MyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJICBCdW1wIHZlcnNpb24gbnVtYmVyIGFnYWluIC0+IDAuMTAuMTMuMQorCisyMDA5LTAxLTIyIDIyOjQxOjAxICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkgIEFkZCByZWxlYXNlcyAwLjEwLjEyIGFuZCAwLjEwLjEzIHRvIHRoZSBkb2FwIGZpbGUKKworMjAwOS0wMS0yMiAxODowODo1MCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBVcGRhdGUgY29tbW9uIHNuYXBzaG90LgorCisyMDA5LTAxLTIyIDE0OjI1OjA3ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIEJhY2sgdG8gZGV2ZWwgLT4gMC4xMC4xMi4xCisKKzIwMDktMDEtMjIgMDE6Mjk6NDAgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSAgUmVsZWFzZSAwLjEwLjEyCisKKzIwMDktMDEtMjEgMTc6MjI6MzkgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBGaXggZm9yIHNlY3VyaXR5IGFkdmlzb3J5IFRLQURWMjAwOS0weHgKKwkgIEZpeCBwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93cyB3aGlsZSByZWFkaW5nIHF1aWNrdGltZSBoZWFkZXJzLgorCSAgU2VjdXJpdHkgaXNzdWUgbm90aWNlZCBieSBUb2JpYXMgS2xlaW4uCisKKzIwMDktMDEtMjEgMTI6NTY6NTUgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgRml4IHR5cG8gYW5kIHNtYWxsIGZsYXcgaW4gZmxhYyBkZWNvZGVyCisKKzIwMDktMDEtMjIgMTM6NDk6MzUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogY29tbW9uOgorCSAgRml4IHByZS1jb21taXQgaG9vaworCisyMDA5LTAxLTIyIDEwOjQwOjM0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meC5jOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2VjaG8uYzoKKwkgIFJlbmFtZSBhdWRpb3JldmVyYiB0byBhdWRpb2VjaG8uIEZpeGVzIGJ1ZyAjNTY4Mzk1LgorCSAgVGhlIGVsZW1lbnQgY2FuIGFkZCBhbiBlY2hvIGFuZCBhIHNpbXBsZSByZXZlcmIgZWZmZWN0IHRvCisJICBhbiBhdWRpbyBzdHJlYW0gYnV0IGZvciBhIHJlYWwgcmV2ZXJiIGZpbHRlciBpdCB3b3VsZCBuZWVkCisJICBzb21lIGFkZGl0aW9uYWwgZmlsdGVyaW5nIHRvIHByZXZlbnQgYSBtZXRhbGxpYy1zb3VuZGluZworCSAgcmVzdWx0LgorCisyMDA5LTAxLTIyIDEyOjIxOjI5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBGcmVlIGxlZnRvdmVyIHVkcCBwb3J0cyAoaWYgYW55KSB3aGVuIGEgc2V0dXAgcmVxdWVzdCBmYWlscy4KKworMjAwOS0wMS0yMiAwNjowNToyNiArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogYXV0b2dlbi5zaDoKKwkqIGNvbW1vbjoKKwkgIEluc3RhbGwgYW5kIHVzZSBwcmUtY29tbWl0IGluZGVudGF0aW9uIGhvb2sgZnJvbSBjb21tb24KKworMjAwOS0wMS0yMSAxMzoyNTowNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgV2hpdGVzcGFjZSBmaXhlcyBhbmQgc29tZSBpbXByb3ZlZCBkZWJ1ZyBsaW5lcy4KKworMjAwOS0wMS0yMSAwNDozMTo1OCArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogYXV0b2dlbi5zaDoKKwkgIGF1dG9nZW4uc2ggOiBVc2UgZ2l0IHN1Ym1vZHVsZQorCisyMDA5LTAxLTIwIDE1OjMzOjA1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IEZpeCBlcnJvciBjb2RlICh0aGUgbWVzc2FnZSBzdHJpbmcgYWxzbyBuZWVkcyBsb3ZlLCBidXQgbm90IHRvZGF5KS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19nZXRfcmVhZCk6CisJICBGaXggZXJyb3IgY29kZSAodGhlIG1lc3NhZ2Ugc3RyaW5nIGFsc28gbmVlZHMgbG92ZSwgYnV0IG5vdCB0b2RheSkuCisKKzIwMDktMDEtMTkgMTE6NDQ6MzYgKzAwMDAgIEx1b3RhbyBGdSA8bC5mdUBwZW5ndXRyb25peC5kZT4KKworCSAgZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzogQWRkIDhiaXQgZ3JheXNjYWxlIHN1cHBvcnQgdG8gdmlkZW9jcm9wIHBsdWdpbi4gRml4ZXMgIzU2Nzk1Mi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEx1b3RhbyBGdSA8bCBkb3QgZnUgYXQgcGVuZ3V0cm9uaXggZG90IGRlPgorCSAgKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSAgKGdzdF92aWRlb19jcm9wX2dldF9pbWFnZV9kZXRhaWxzX2Zyb21fY2Fwcyk6CisJICBBZGQgOGJpdCBncmF5c2NhbGUgc3VwcG9ydCB0byB2aWRlb2Nyb3AgcGx1Z2luLiBGaXhlcyAjNTY3OTUyLgorCisyMDA5LTAxLTE5IDExOjIyOjA2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9hdWRpb2Z4L2F1ZGlvcmV2ZXJiLmM6IFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgaW5zdGFuY2UgaW5pdCBmdW5jdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3JldmVyYi5jOiAoZ3N0X2F1ZGlvX3JldmVyYl9pbml0KToKKwkgIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgaW5zdGFuY2UgaW5pdCBmdW5jdGlvbi4KKworMjAwOS0wMS0xOSAxMToxOTowOCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBBZGQgYW4gZWNoby9yZXZlcmIgZmlsdGVyIHRvIHRoZSBhdWRpb2Z4IHBsdWdpbiwgd2l0aCBjb25maWd1cmFibGUgZWNobyBkZWxheSwgaW50ZW5zaXR5IGFuZCBmZWVkYmFjay4gRml4ZXMgYnVnICM1NjcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSAgKiBnc3QvYXVkaW9meC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9meC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3JldmVyYi5jOiAoZ3N0X2F1ZGlvX3JldmVyYl9iYXNlX2luaXQpLAorCSAgKGdzdF9hdWRpb19yZXZlcmJfY2xhc3NfaW5pdCksIChnc3RfYXVkaW9fcmV2ZXJiX2luaXQpLAorCSAgKGdzdF9hdWRpb19yZXZlcmJfZmluYWxpemUpLCAoZ3N0X2F1ZGlvX3JldmVyYl9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdWRpb19yZXZlcmJfZ2V0X3Byb3BlcnR5KSwgKGdzdF9hdWRpb19yZXZlcmJfc2V0dXApLAorCSAgKGdzdF9hdWRpb19yZXZlcmJfc3RvcCksIChnc3RfYXVkaW9fcmV2ZXJiX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvcmV2ZXJiLmg6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3JldmVyYi5jOiAoc2V0dXBfcmV2ZXJiKSwKKwkgIChjbGVhbnVwX3JldmVyYiksIChHU1RfU1RBUlRfVEVTVCksIChhdWRpb3JldmVyYl9zdWl0ZSk6CisJICBBZGQgYW4gZWNoby9yZXZlcmIgZmlsdGVyIHRvIHRoZSBhdWRpb2Z4IHBsdWdpbiwgd2l0aCBjb25maWd1cmFibGUKKwkgIGVjaG8gZGVsYXksIGludGVuc2l0eSBhbmQgZmVlZGJhY2suIEZpeGVzIGJ1ZyAjNTY3ODc0LgorCisyMDA5LTAxLTE5IDEwOjEzOjUzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS4qOiBJbXBsZW1lbnQgYSBzaW1wbGUgY29tcGVuc2F0aW9uIGFsZ29yaXRobSBmb3Igcm91bmRpbmcgZXJyb3JzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX3Jlc2V0X3N0YXRlKSwKKwkgIChnc3Rfc3BlY3RydW1fdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJICBJbXBsZW1lbnQgYSBzaW1wbGUgY29tcGVuc2F0aW9uIGFsZ29yaXRobSBmb3Igcm91bmRpbmcgZXJyb3JzLgorCSAgVGhpcyBtYWtlcyBzdXJlIHRoYXQgYSBzcGVjdHJ1bSBtZXNzYWdlIGlzIHBvc3RlZCBvbiB0aGUgYnVzCisJICBldmVyeSBpbnRlcnZhbCBuYW5vc2Vjb25kcy4gRml4ZXMgYnVnICM1Njc5NTUuCisKKzIwMDktMDEtMTUgMjE6MTY6NDUgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgc3lzL29zeGF1ZGlvL01ha2VmaWxlLmFtOiBMaW5rIGFnYWluc3QgQ29yZVNlcnZpY2VzIChuZWVkZWQgZm9yIG9zeCAxMC40KSBhbmQgZml4IHVwIHRoZSBsaW5rZXIgZmxhZ3MuIEZpeGVzICM1Njc4NTMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL29zeGF1ZGlvL01ha2VmaWxlLmFtOgorCSAgTGluayBhZ2FpbnN0IENvcmVTZXJ2aWNlcyAobmVlZGVkIGZvciBvc3ggMTAuNCkgYW5kIGZpeCB1cCB0aGUgbGlua2VyCisJICBmbGFncy4gRml4ZXMgIzU2Nzg1My4KKworMjAwOS0wMS0xNSAxNDo1MzoxOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBDYXRjaCBpbnZhbGlkIGFuZCBjb21tb25seSB3cm9uZyBwbGF5YmFjayByYXRlcyBpbiB0aGUgZWxzdCBhdG9tcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlX3NlZ21lbnRzKToKKwkgIENhdGNoIGludmFsaWQgYW5kIGNvbW1vbmx5IHdyb25nIHBsYXliYWNrIHJhdGVzIGluIHRoZSBlbHN0IGF0b21zLgorCSAgRml4ZXMgIzU2NzgwMC4KKworMjAwOS0wMS0xNSAxMTo0MDoyMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogRG9uJ3QgY2FsbCBnc3RfZmZ0X2YzMl9mcmVlKCkgd2l0aCBOVUxMIHRvIHByZXZlbnQgYSBjcmFzaC4gRml4ZXMgYnVnICM1Njc2NDIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IChnc3Rfc3BlY3RydW1fcmVzZXRfc3RhdGUpOgorCSAgRG9uJ3QgY2FsbCBnc3RfZmZ0X2YzMl9mcmVlKCkgd2l0aCBOVUxMIHRvIHByZXZlbnQgYQorCSAgY3Jhc2guIEZpeGVzIGJ1ZyAjNTY3NjQyLgorCisyMDA5LTAxLTE0IDE1OjQ0OjE4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS4qOiBVc2UgY29ycmVjdCB0eXBlcyBmb3IgZnJhbWUvZmZ0IGNvdW50ZXJzIGFuZCBzb21lIG1pbm9yIGNsZWFudXAuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IChnc3Rfc3BlY3RydW1fdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJICBVc2UgY29ycmVjdCB0eXBlcyBmb3IgZnJhbWUvZmZ0IGNvdW50ZXJzIGFuZCBzb21lIG1pbm9yCisJICBjbGVhbnVwLgorCisyMDA5LTAxLTE0IDE1OjM3OjA3ICswMDAwICBMZW5uYXJ0IFBvZXR0ZXJpbmcgPGxlbm5hcnRAcG9ldHRlcmluZy5uZXQ+CisKKwkgIGV4dC9wdWxzZS9wdWxzZXByb2JlLmM6IEZpeCByZWZjb3VudCBsb29wLCByZXN1bHRpbmcgaW4gYSB0aHJlYWQgbGVhay4gRml4ZXMgYnVnICM1Njc3NDYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBMZW5uYXJ0IFBvZXR0ZXJpbmcgPGxlbm5hcnQgYXQgcG9ldHRlcmluZyBkb3QgbmV0PgorCSAgKiBleHQvcHVsc2UvcHVsc2Vwcm9iZS5jOiAoZ3N0X3B1bHNlcHJvYmVfbmV3KSwKKwkgIChnc3RfcHVsc2Vwcm9iZV9mcmVlKToKKwkgIEZpeCByZWZjb3VudCBsb29wLCByZXN1bHRpbmcgaW4gYSB0aHJlYWQgbGVhay4gRml4ZXMgYnVnICM1Njc3NDYuCisKKzIwMDktMDEtMTQgMTA6NDY6NTQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L3NwZWN0cnVtLzogUG9zdCBhIHNwZWN0cnVtIG1lc3NhZ2Ugb24gdGhlIGJ1cyBmb3IgZXZlcnkgaW50ZXJ2YWwsIGV2ZW4gaWYgdGhlIGludGVydmFsIGlzIHNtYWxsIHRoYW4gdGhlIGxlbmd0aCBvLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3NwZWN0cnVtL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3BlY3RydW0vUkVBRE1FOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogKGdzdF9zcGVjdHJ1bV9iYXNlX2luaXQpLAorCSAgKGdzdF9zcGVjdHJ1bV9jbGFzc19pbml0KSwgKGdzdF9zcGVjdHJ1bV9pbml0KSwKKwkgIChnc3Rfc3BlY3RydW1fcmVzZXRfc3RhdGUpLCAoZ3N0X3NwZWN0cnVtX2ZpbmFsaXplKSwKKwkgIChnc3Rfc3BlY3RydW1fc2V0X3Byb3BlcnR5KSwgKGdzdF9zcGVjdHJ1bV9zdGFydCksCisJICAoZ3N0X3NwZWN0cnVtX3N0b3ApLCAoZ3N0X3NwZWN0cnVtX3NldHVwKSwKKwkgIChnc3Rfc3BlY3RydW1fdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJICBQb3N0IGEgc3BlY3RydW0gbWVzc2FnZSBvbiB0aGUgYnVzIGZvciBldmVyeSBpbnRlcnZhbCwgZXZlbgorCSAgaWYgdGhlIGludGVydmFsIGlzIHNtYWxsIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgRkZULgorCSAgRml4ZXMgYnVnICM1Njc2NDIuCisJICBNYWpvciBjbGVhbnVwIG9mIHRoZSBzcGVjdHJ1bSBlbGVtZW50LgorCisyMDA5LTAxLTEzIDE5OjIzOjU3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIEFkZCBhdWRpb2lpcmZpbHRlciBhbmQgYXVkaW9maXJmaWx0ZXIgZWxlbWVudHMgd2hpY2ggYWxsb3cgZ2VuZXJpYyBJSVIvRklSIGZpbHRlcnMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgcHJvdmlkaW5nIHRoZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmM6IChnc3RfYXVkaW9fZmlyX2ZpbHRlcl9iYXNlX2luaXQpLAorCSAgKGdzdF9hdWRpb19maXJfZmlsdGVyX2NsYXNzX2luaXQpLAorCSAgKGdzdF9hdWRpb19maXJfZmlsdGVyX3VwZGF0ZV9rZXJuZWwpLCAoZ3N0X2F1ZGlvX2Zpcl9maWx0ZXJfaW5pdCksCisJICAoZ3N0X2F1ZGlvX2Zpcl9maWx0ZXJfc2V0dXApLCAoZ3N0X2F1ZGlvX2Zpcl9maWx0ZXJfZmluYWxpemUpLAorCSAgKGdzdF9hdWRpb19maXJfZmlsdGVyX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2F1ZGlvX2Zpcl9maWx0ZXJfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9maXJmaWx0ZXIuaDoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9meC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5jOiAoZ3N0X2F1ZGlvX2lpcl9maWx0ZXJfYmFzZV9pbml0KSwKKwkgIChnc3RfYXVkaW9faWlyX2ZpbHRlcl9jbGFzc19pbml0KSwKKwkgIChnc3RfYXVkaW9faWlyX2ZpbHRlcl91cGRhdGVfY29lZmZpY2llbnRzKSwKKwkgIChnc3RfYXVkaW9faWlyX2ZpbHRlcl9pbml0KSwgKGdzdF9hdWRpb19paXJfZmlsdGVyX3NldHVwKSwKKwkgIChnc3RfYXVkaW9faWlyX2ZpbHRlcl9maW5hbGl6ZSksCisJICAoZ3N0X2F1ZGlvX2lpcl9maWx0ZXJfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfYXVkaW9faWlyX2ZpbHRlcl9nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5oOgorCSAgQWRkIGF1ZGlvaWlyZmlsdGVyIGFuZCBhdWRpb2ZpcmZpbHRlciBlbGVtZW50cyB3aGljaCBhbGxvdworCSAgZ2VuZXJpYyBJSVIvRklSIGZpbHRlcnMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgcHJvdmlkaW5nIHRoZQorCSAgZmlsdGVyIGNvZWZmaWNpZW50cy4gRml4ZXMgYnVnICM1Njc1NzcuCisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnNpZ25hbHM6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkgIEFkZCBkb2N1bWVudGF0aW9uIGZvciB0aGUgYXVkaW9paXJmaWx0ZXIgYW5kIGF1ZGlvZmlyZmlsdGVyCisJICBlbGVtZW50cy4KKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZmlyZmlsdGVyLmM6IChvbl9tZXNzYWdlKSwKKwkgIChvbl9yYXRlX2NoYW5nZWQpLCAob25faGFuZG9mZiksIChHU1RfU1RBUlRfVEVTVCksCisJICAoYXVkaW9maXJmaWx0ZXJfc3VpdGUpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2lpcmZpbHRlci5jOiAob25fbWVzc2FnZSksCisJICAob25fcmF0ZV9jaGFuZ2VkKSwgKG9uX2hhbmRvZmYpLCAoR1NUX1NUQVJUX1RFU1QpLAorCSAgKGF1ZGlvaWlyZmlsdGVyX3N1aXRlKToKKwkgICogdGVzdHMvZXhhbXBsZXMvTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2V4YW1wbGVzL2F1ZGlvZngvTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2V4YW1wbGVzL2F1ZGlvZngvZmlyZmlsdGVyLWV4YW1wbGUuYzogKG9uX21lc3NhZ2UpLAorCSAgKG9uX3JhdGVfY2hhbmdlZCksIChtYWluKToKKwkgICogdGVzdHMvZXhhbXBsZXMvYXVkaW9meC9paXJmaWx0ZXItZXhhbXBsZS5jOiAob25fbWVzc2FnZSksCisJICAob25fcmF0ZV9jaGFuZ2VkKSwgKG1haW4pOgorCSAgQWRkIHVuaXQgdGVzdHMgYW5kIGV4YW1wbGUgYXBwbGljYXRpb25zIGZvciB0aGUgdHdvIGZpbHRlcgorCSAgZWxlbWVudHMuCisKKzIwMDktMDEtMTMgMTk6MDk6MTkgKzAwMDAgIFRoaWFnbyBTb3VzYSBTYW50b3MgPHRoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEZpeCBmb3JtYXQgc3RyaW5nIGZvciBndWludDY0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVGhpYWdvIFNvdXNhIFNhbnRvcyA8dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnI+CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIEZpeCBmb3JtYXQgc3RyaW5nIGZvciBndWludDY0LgorCisyMDA5LTAxLTEzIDE5OjA0OjA5ICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIHN5cy9vc3hhdWRpby9NYWtlZmlsZS5hbTogb3N4YXVkaW8gcGx1Z2luIG5vdyByZXF1aXJlcyBBdWRpb1VuaXQgZnJhbWV3b3JrLCBzbyBsaW5rIGFnYWluc3QgdGhhdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3N4YXVkaW8vTWFrZWZpbGUuYW06CisJICBvc3hhdWRpbyBwbHVnaW4gbm93IHJlcXVpcmVzIEF1ZGlvVW5pdCBmcmFtZXdvcmssIHNvIGxpbmsgYWdhaW5zdCB0aGF0LgorCSAgQ2xlYW4gdXAgdGFicyB2IHNwYWNlcyB3aGlsZSBJJ20gdGhlcmUuCisKKzIwMDktMDEtMTMgMTc6NDk6MDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLmM6IEFkZCBzb21lIGV4YW1wbGUgY29kZSBmb3IgcHJpbnRpbmcgdGhlIFJUUCBtYW5hZ2VyIHN0YXRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLmM6IChwcmludF9zb3VyY2Vfc3RhdHMpLAorCSAgKHByaW50X3N0YXRzKSwgKG1haW4pOgorCSAgQWRkIHNvbWUgZXhhbXBsZSBjb2RlIGZvciBwcmludGluZyB0aGUgUlRQIG1hbmFnZXIgc3RhdHMuCisKKzIwMDktMDEtMTMgMDg6MjQ6MjUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2F1ZGlvZngvOiBVc2UgYSBjdXN0b20gbXV0ZXggZm9yIHByb3RlY3RpbmcgdGhlIGluc3RhbmNlIGZpZWxkcyBpbnN0ZWFkIG9mIHRoZSBHc3RPYmplY3QgbG9jay4gVXNpbmcgdGhlIGxhdHRlciBjLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jOiAoZ3N0X2F1ZGlvX2NoZWJfYmFuZF9jbGFzc19pbml0KSwKKwkgIChnc3RfYXVkaW9fY2hlYl9iYW5kX2luaXQpLCAoZ3N0X2F1ZGlvX2NoZWJfYmFuZF9maW5hbGl6ZSksCisJICAoZ3N0X2F1ZGlvX2NoZWJfYmFuZF9zZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmg6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmxpbWl0LmM6IChnc3RfYXVkaW9fY2hlYl9saW1pdF9jbGFzc19pbml0KSwKKwkgIChnc3RfYXVkaW9fY2hlYl9saW1pdF9pbml0KSwgKGdzdF9hdWRpb19jaGViX2xpbWl0X2ZpbmFsaXplKSwKKwkgIChnc3RfYXVkaW9fY2hlYl9saW1pdF9zZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5oOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jYmFuZC5jOiAoZ3N0X2F1ZGlvX3dzaW5jYmFuZF9jbGFzc19pbml0KSwKKwkgIChnc3RfYXVkaW9fd3NpbmNiYW5kX2luaXQpLCAoZ3N0X2F1ZGlvX3dzaW5jYmFuZF9maW5hbGl6ZSksCisJICAoZ3N0X2F1ZGlvX3dzaW5jYmFuZF9zZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jYmFuZC5oOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYzogKGdzdF9hdWRpb193c2luY2xpbWl0X2NsYXNzX2luaXQpLAorCSAgKGdzdF9hdWRpb193c2luY2xpbWl0X2luaXQpLCAoZ3N0X2F1ZGlvX3dzaW5jbGltaXRfZmluYWxpemUpLAorCSAgKGdzdF9hdWRpb193c2luY2xpbWl0X3NldF9wcm9wZXJ0eSk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5oOgorCSAgVXNlIGEgY3VzdG9tIG11dGV4IGZvciBwcm90ZWN0aW5nIHRoZSBpbnN0YW5jZSBmaWVsZHMgaW5zdGVhZCBvZgorCSAgdGhlIEdzdE9iamVjdCBsb2NrLiBVc2luZyB0aGUgbGF0dGVyIGNhbiBsZWFkIHRvIGRlYWRsb2NrcywgZXNwZWNpYWxseQorCSAgd2l0aCB0aGUgRklSIGZpbHRlcnMgd2hlbiB1cGRhdGluZyB0aGUgbGF0ZW5jeS4KKworMjAwOS0wMS0xMSAxOTowMzozOCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvYXVkaW9meC86IEltcGxlbWVudCBhIGJhc2UgY2xhc3MgZm9yIGdlbmVyaWMgYXVkaW8gRklSIGZpbHRlcnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJICAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9kaXNwb3NlKSwKKwkgIChnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX2Jhc2VfaW5pdCksCisJICAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9jbGFzc19pbml0KSwKKwkgIChnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX2luaXQpLAorCSAgKGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfcHVzaF9yZXNpZHVlKSwKKwkgIChnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3NldHVwKSwKKwkgIChnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3RyYW5zZm9ybSksCisJICAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9zdGFydCksCisJICAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9zdG9wKSwKKwkgIChnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3F1ZXJ5KSwKKwkgIChnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3F1ZXJ5X3R5cGUpLAorCSAgKGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfZXZlbnQpLAorCSAgKGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc2V0X2tlcm5lbCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmg6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlaWlyZmlsdGVyLmM6CisJICBJbXBsZW1lbnQgYSBiYXNlIGNsYXNzIGZvciBnZW5lcmljIGF1ZGlvIEZJUiBmaWx0ZXJzLgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jYmFuZC5jOgorCSAgKGdzdF9nc3RfYXVkaW9fd3NpbmNiYW5kX21vZGVfZ2V0X3R5cGUpLAorCSAgKGdzdF9nc3RfYXVkaW9fd3NpbmNiYW5kX3dpbmRvd19nZXRfdHlwZSksCisJICAoZ3N0X2F1ZGlvX3dzaW5jYmFuZF9iYXNlX2luaXQpLCAoZ3N0X2F1ZGlvX3dzaW5jYmFuZF9jbGFzc19pbml0KSwKKwkgIChnc3RfYXVkaW9fd3NpbmNiYW5kX2luaXQpLCAoZ3N0X2F1ZGlvX3dzaW5jYmFuZF9idWlsZF9rZXJuZWwpLAorCSAgKGdzdF9hdWRpb193c2luY2JhbmRfc2V0dXApLCAoZ3N0X2F1ZGlvX3dzaW5jYmFuZF9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdWRpb193c2luY2JhbmRfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuaDoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2xpbWl0LmM6CisJICAoZ3N0X2F1ZGlvX3dzaW5jbGltaXRfbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X2F1ZGlvX3dzaW5jbGltaXRfd2luZG93X2dldF90eXBlKSwKKwkgIChnc3RfYXVkaW9fd3NpbmNsaW1pdF9iYXNlX2luaXQpLAorCSAgKGdzdF9hdWRpb193c2luY2xpbWl0X2NsYXNzX2luaXQpLCAoZ3N0X2F1ZGlvX3dzaW5jbGltaXRfaW5pdCksCisJICAoZ3N0X2F1ZGlvX3dzaW5jbGltaXRfYnVpbGRfa2VybmVsKSwgKGdzdF9hdWRpb193c2luY2xpbWl0X3NldHVwKSwKKwkgIChnc3RfYXVkaW9fd3NpbmNsaW1pdF9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdWRpb193c2luY2xpbWl0X2dldF9wcm9wZXJ0eSk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5oOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jYmFuZC5jOiAoR1NUX1NUQVJUX1RFU1QpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jbGltaXQuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIFVzZSB0aGlzIG5ldyBiYXNlIGNsYXNzIGZvciBhdWRpb3dzaW5jYmFuZCBhbmQgYXVkaW93c2luY2xpbWl0LgorCSAgQWxzbyBjbGVhbnVwIGJvdGggZWxlbWVudHMuCisKKzIwMDktMDEtMDggMTg6MTc6MTMgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBJbiBwdXNoIG1vZGUsIGVycm9yIG91dCBpZiB3ZSBnZXQgRU9TIGJlZm9yZSB3ZSd2ZSBjcmVhdGVkIGFueSBzcmNwYWRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIEluIHB1c2ggbW9kZSwgZXJyb3Igb3V0IGlmIHdlIGdldCBFT1MgYmVmb3JlIHdlJ3ZlIGNyZWF0ZWQgYW55IHNyY3BhZHMuCisJICBIYW5kbGUgKGluIHB1bGwgbW9kZSkgc29tZSBmaWxlcyB0aGF0IGhhdmUgYSB0cnVuY2F0ZWQgbW9vdiBhdG9tIHdoZXJlCisJICB0aGUgZmluYWwgc3ViLWF0b20gaXMgYSAnZnJlZScgYXRvbSBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoYXQgYXJlIG5vdAorCSAgcHJlc2VudCBpbiB0aGUgZmlsZS4KKworMjAwOS0wMS0wOCAxNTo1Njo0NiArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIGdzdC9tYXRyb3NrYS86IFNvbWUgY2xlYW51cHMsIHJlZmFjdG9yaW5nIGFuZCBtaW5vciBlbmhhbmNlbWVudHMgaW4gY2FwcyBoYW5kbGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF92aWRlb19jYXBzKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF92aWRlb19wYWRfc2V0Y2Fwcyk6CisJICBTb21lIGNsZWFudXBzLCByZWZhY3RvcmluZyBhbmQgbWlub3IgZW5oYW5jZW1lbnRzIGluIGNhcHMgaGFuZGxpbmcuCisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfY2xhc3NfaW5pdCksCisJICAoZ3N0X21hdHJvc2thX211eF9pbml0KSwgKGdzdF9tYXRyb3NrYV9wYWRfcmVzZXQpLAorCSAgKGdzdF9tYXRyb3NrYV9wYWRfZnJlZSksIChnc3RfbWF0cm9za2FfbXV4X3Jlc2V0KSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3ZpZGVvX3BhZF9zZXRjYXBzKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3JlcXVlc3RfbmV3X3BhZCk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6ICh0ZWFyZG93bl9zcmNfcGFkKToKKwkgIE9ubHkgcmVtb3ZlLCByZWxlYXNlIG9yIHJlc2V0IHdoYXQgaXMgYXBwcm9wcmlhdGUgdXBvbiBzdGF0ZSBjaGFuZ2UuCisKKzIwMDktMDEtMDcgMjA6Mzg6NTAgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBleHQvcHVsc2UvcHVsc2VzaW5rLio6IFVzZSBhIG11dGV4IHRvIHByb3RlY3QgdGhlIGN1cnJlbnQgc3RyZWFtIHBvaW50ZXIsIGFuZCBpZ25vcmUgY2FsbGJhY2tzIGZvciBzdHJlYW0gb2JqZWN0cyB0aGEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkgIFVzZSBhIG11dGV4IHRvIHByb3RlY3QgdGhlIGN1cnJlbnQgc3RyZWFtIHBvaW50ZXIsIGFuZCBpZ25vcmUKKwkgIGNhbGxiYWNrcyBmb3Igc3RyZWFtIG9iamVjdHMgdGhhdCBoYXZlIGJlZW4gZGVzdHJveWVkIGFscmVhZHkuCisJICBGaXhlcyBwcm9ibGVtcyB3aXRoIHVucHJlcGFyZS9wcmVwYXJlIGN5Y2xlcyBjYXVzZWQgYnkgdGhlIGlucHV0CisJICBjYXBzIGNoYW5naW5nLCB3aXRob3V0IHJlaW50cm9kdWNpbmcgYnVnICM1NTY5ODYuCisKKzIwMDktMDEtMDcgMTY6MDk6NDcgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IFJlbW92ZSAoKSBmcm9tIHRyYW5zbGF0ZWFibGUgc3RyaW5nLCBzbyB0aGF0IGl0IG1ha2VzIG1vcmUgc2Vuc2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgUmVtb3ZlICgpIGZyb20gdHJhbnNsYXRlYWJsZSBzdHJpbmcsIHNvIHRoYXQgaXQgbWFrZXMgbW9yZSBzZW5zZS4KKworMjAwOS0wMS0wNyAwOTo0MzoxMyArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IE1pbm9yIGZpeC9jbGVhbnVwIGluIGhlYWRlciBmaWVsZCBjYWxjdWxhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aV9tdXhfYXVkc2lua19zZXRfY2Fwcyk6CisJICBNaW5vciBmaXgvY2xlYW51cCBpbiBoZWFkZXIgZmllbGQgY2FsY3VsYXRpb24uCisKKzIwMDktMDEtMDYgMTc6NDg6MTAgKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lio6IFJlbW92ZSBpbnRlcm5hbCB0YWdsaXN0IGFuZCBmdWxseSB1c2UgdGFnc2V0dGVyIGludGVyZmFjZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChnc3RfbWF0cm9za2FfbXV4X3Jlc2V0KSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X2hhbmRsZV9zaW5rX2V2ZW50KSwgKGdzdF9tYXRyb3NrYV9tdXhfZmluaXNoKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgUmVtb3ZlIGludGVybmFsIHRhZ2xpc3QgYW5kIGZ1bGx5IHVzZSB0YWdzZXR0ZXIgaW50ZXJmYWNlLgorCisyMDA5LTAxLTA2IDE0OjUwOjI5ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L2F2aS9nc3RhdmltdXguKjogRW5zdXJlIGhlYWRlciBzaXplIGludmFyaWFuY2UgZHVyaW5nIHN1YnNlcXVlbnQgcmV3cml0ZSBieSB1c2luZyB0YWdzIHNuYXBzaG90LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpX211eF9yZXNldCksCisJICAoZ3N0X2F2aV9tdXhfcmlmZl9nZXRfYXZpX2hlYWRlcik6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4Lmg6CisJICBFbnN1cmUgaGVhZGVyIHNpemUgaW52YXJpYW5jZSBkdXJpbmcgc3Vic2VxdWVudCByZXdyaXRlIGJ5IHVzaW5nCisJICB0YWdzIHNuYXBzaG90LgorCisyMDA5LTAxLTA1IDE3OjMxOjEzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzogRG9uJ3Qgd2FpdCBmb3IgdGhlIHB1bHNlIG1haW5sb29wIHdoZW4gZGVzdHJveWluZyB0aGUgc3RyZWFtLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzogKGdzdF9wdWxzZXNpbmtfZGVzdHJveV9zdHJlYW0pOgorCSAgRG9uJ3Qgd2FpdCBmb3IgdGhlIHB1bHNlIG1haW5sb29wIHdoZW4gZGVzdHJveWluZyB0aGUgc3RyZWFtLgorCSAgRml4ZXMgYSBkZWFkbG9jayB3aGVuIHRoZSBwdWxzZWRhZW1vbiBnb2VzIGF3YXkgd2hpbGUgcHVsc2VzaW5rCisJICBpcyBQTEFZSU5HLiBGaXhlcyBidWcgIzU1Njk4Ni4KKworMjAwOS0wMS0wNSAxMjozMDo0MCArMDAwMCAgU2FzY2hhIEhhdWVyIDxzLmhhdWVyQHBlbmd1dHJvbml4LmRlPgorCisJICBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IEFkZCBzdXBwb3J0IGZvciBncmF5c2NhbGUgdjRsMiBkZXZpY2VzLiBGaXhlcyBidWcgIzU2NjYxNi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFNhc2NoYSBIYXVlciA8cyBkb3QgaGF1ZXIgYXQgcGVuZ3V0cm9uaXggZG90IGRlPgorCSAgTHVvdGFvIEZ1IDxsIGRvdCBmdSBhdCBwZW5ndXRyb25peCBkb3QgZGU+CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogKGdzdF92NGwyc3JjX3Y0bDJmb3VyY2NfdG9fc3RydWN0dXJlKSwKKwkgIChnc3RfdjRsMl9nZXRfY2Fwc19pbmZvKToKKwkgIEFkZCBzdXBwb3J0IGZvciBncmF5c2NhbGUgdjRsMiBkZXZpY2VzLiBGaXhlcyBidWcgIzU2NjYxNi4KKworMjAwOS0wMS0wNSAxMTo0MjowOSArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIGdzdC9xdGRlbXV4LzogU3RyZWFtbGluZSB0YWcgaGFuZGxpbmcgYW5kIHBhc3MgdW5wYXJzZWQgdGFncyBhcyBiaW5hcnkgYmxvYiBpbiBwcml2YXRlIHRhZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3RhZ19hZGRfc3RyKSwKKwkgIChxdGRlbXV4X3RhZ19hZGRfdG1wbyksIChxdGRlbXV4X3RhZ19hZGRfY292ciksCisJICAocXRkZW11eF90YWdfYWRkX2RhdGUpLCAocXRkZW11eF90YWdfYWRkX2ducmUpLAorCSAgKHF0ZGVtdXhfdGFnX2FkZF9ibG9iKSwgKHF0ZGVtdXhfcGFyc2VfdWR0YSk6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguaDoKKwkgICogZ3N0L3F0ZGVtdXgvcXVpY2t0aW1lLmM6IChwbHVnaW5faW5pdCk6CisJICBTdHJlYW1saW5lIHRhZyBoYW5kbGluZyBhbmQgcGFzcyB1bnBhcnNlZCB0YWdzIGFzIGJpbmFyeSBibG9iCisJICBpbiBwcml2YXRlIHRhZy4KKworMjAwOS0wMS0wNSAxMDoxMzoyOSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvYXVkaW9meC86IEltcGxlbWVudCBhIGJhc2UgY2xhc3MgZm9yIElJUiBmaWx0ZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdWRpb2Z4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWlpcmZpbHRlci5jOgorCSAgKGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfYmFzZV9pbml0KSwKKwkgIChnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2Rpc3Bvc2UpLAorCSAgKGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfY2xhc3NfaW5pdCksCisJICAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9pbml0KSwKKwkgIChnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2NhbGN1bGF0ZV9nYWluKSwKKwkgIChnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX3NldF9jb2VmZmljaWVudHMpLAorCSAgKGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfc2V0dXApLCAocHJvY2VzcyksCisJICAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl90cmFuc2Zvcm1faXApLAorCSAgKGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfc3RvcCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlaWlyZmlsdGVyLmg6CisJICBJbXBsZW1lbnQgYSBiYXNlIGNsYXNzIGZvciBJSVIgZmlsdGVycy4KKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jOiAoZ3N0X2F1ZGlvX2NoZWJfYmFuZF9iYXNlX2luaXQpLAorCSAgKGdzdF9hdWRpb19jaGViX2JhbmRfY2xhc3NfaW5pdCksIChnc3RfYXVkaW9fY2hlYl9iYW5kX2luaXQpLAorCSAgKGdlbmVyYXRlX2NvZWZmaWNpZW50cyksIChnc3RfYXVkaW9fY2hlYl9iYW5kX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2F1ZGlvX2NoZWJfYmFuZF9zZXR1cCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmJhbmQuaDoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYzogKGdzdF9hdWRpb19jaGViX2xpbWl0X2Jhc2VfaW5pdCksCisJICAoZ3N0X2F1ZGlvX2NoZWJfbGltaXRfY2xhc3NfaW5pdCksIChnc3RfYXVkaW9fY2hlYl9saW1pdF9pbml0KSwKKwkgIChnZW5lcmF0ZV9jb2VmZmljaWVudHMpLCAoZ3N0X2F1ZGlvX2NoZWJfbGltaXRfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfYXVkaW9fY2hlYl9saW1pdF9zZXR1cCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmxpbWl0Lmg6CisJICBVc2UgdGhlIElJUiBmaWx0ZXIgYmFzZSBjbGFzcyBmb3IgdGhlIGNoZWJ5c2hldiBmaWx0ZXJzLgorCisyMDA5LTAxLTAyIDIwOjM5OjM0ICswMDAwICBKdXN0aW4gS2FybmVnYXMgPGp1c3RpbkBhZmZpbml4LmNvbT4KKworCSAgc3lzL29zeGF1ZGlvLzogUmV3cml0ZSBvc3hhdWRpbyB0byB3b3JrIG1vcmUgZmxleGlibHkgYW5kIG1vcmUgcmVsaWFibHksIHVzaW5nIGEgZGlmZmVyZW50IGFic3RyYWN0aW9uIGxheWVyIG9mIGNvcmVhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBKdXN0aW4gS2FybmVnYXMgPGp1c3RpbkBhZmZpbml4LmNvbT4gYW5kCisJICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvLmM6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2VsZW1lbnQuYzoKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvZWxlbWVudC5oOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuaDoKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5oOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4cmluZ2J1ZmZlci5jOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4cmluZ2J1ZmZlci5oOgorCSAgUmV3cml0ZSBvc3hhdWRpbyB0byB3b3JrIG1vcmUgZmxleGlibHkgYW5kIG1vcmUgcmVsaWFibHksIHVzaW5nIGEKKwkgIGRpZmZlcmVudCBhYnN0cmFjdGlvbiBsYXllciBvZiBjb3JlYXVkaW8gdGhhdCBpcyB0aGUgcmVjb21tZW5kZWQgd2F5IG9mCisJICBkb2luZyBsb3ctbGV2ZWwgYXVkaW8gSS9PIG9uIE9TWC4KKwkgIEZpeGVzIGJ5ZyAjNTY0OTQ4LgorCisyMDA5LTAxLTAyIDE2OjMxOjEzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWRlY29kZWJpbi1IMjYzcC1BTVIuc2g6IEFkZCBleGFtcGxlIFJUUCB0cmFuc2NvZGluZyBwaXBlbGluZSBmcm9tIGFueSBmaWxlIGRlY29kZWRhYmxlIHdpdGguLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWRlY29kZWJpbi1IMjYzcC1BTVIuc2g6CisJICBBZGQgZXhhbXBsZSBSVFAgdHJhbnNjb2RpbmcgcGlwZWxpbmUgZnJvbSBhbnkgZmlsZSBkZWNvZGVkYWJsZSB3aXRoCisJICB1cmlkZWNvZGViaW4uCisKKzIwMDktMDEtMDIgMTU6MjA6NDggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHRlc3RzL2V4YW1wbGVzL3J0cC86IEFkZCB0d28gQyBleGFtcGxlcyBvZiB1c2luZyBnc3RydHBiaW4gYXMgYSBzZW5kZXIgYW5kIGEgcmVjZWl2ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvZXhhbXBsZXMvcnRwLy5jdnNpZ25vcmU6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLmM6IChwYWRfYWRkZWRfY2IpLCAobWFpbik6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLmM6IChtYWluKToKKwkgIEFkZCB0d28gQyBleGFtcGxlcyBvZiB1c2luZyBnc3RydHBiaW4gYXMgYSBzZW5kZXIgYW5kIGEgcmVjZWl2ZXIuCisKKzIwMDgtMTItMzEgMTE6MjA6NTUgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBDaGFuZ2VMb2c6IFJlbW92ZSBjb25mbGljdCBtYXJrZXIgZnJvbSBDaGFuZ2VMb2cKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBDaGFuZ2VMb2c6CisJICBSZW1vdmUgY29uZmxpY3QgbWFya2VyIGZyb20gQ2hhbmdlTG9nCisKKzIwMDgtMTItMjggMDk6NTA6MzEgKzAwMDAgIGpeIDxqQG9pbDIxLm9yZz4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGQgY29kZWMgbWFwcGluZyBmb3IgeHZpZCwgZm1wNCBhbmQgYWMzIHRyYWNrcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IGpeIDxqIGF0IG9pbDIxLm9yZz4KKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF92aWRlb19jYXBzKSwKKwkgIChxdGRlbXV4X2F1ZGlvX2NhcHMpOgorCSAgQWRkIGNvZGVjIG1hcHBpbmcgZm9yIHh2aWQsIGZtcDQgYW5kIGFjMyB0cmFja3MuCisJICBGaXhlcyAjNTY1ODUwCisKKzIwMDgtMTItMjMgMTI6MTA6NDEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9qcGVnL2dzdHNtb2tlZW5jLio6IEltcGxlbWVudCBnZXRjYXBzIGZ1bmN0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmM6IChnc3Rfc21va2VlbmNfaW5pdCksCisJICAoZ3N0X3Ntb2tlZW5jX2dldGNhcHMpLCAoZ3N0X3Ntb2tlZW5jX3NldGNhcHMpLAorCSAgKGdzdF9zbW9rZWVuY19jaGFpbiksIChnc3Rfc21va2VlbmNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2pwZWcvZ3N0c21va2VlbmMuaDoKKwkgIEltcGxlbWVudCBnZXRjYXBzIGZ1bmN0aW9uLgorCSAgU2V0IGNhcHMgb24gdGhlIHBhZCBhbmQgb24gYWxsIG91dGdvaW5nIGJ1ZmZlcnMuCisJICBGaXhlcyAjNTY1NDQxLgorCisyMDA4LTEyLTE5IDA5OjM2OjQ1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOiBBbmQgcmVtb3ZlIHRlbXBvcmFyeSBjb21tZW50IHBvaW50aW5nIHRvIHRoZSBidWcgdGlja2V0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOgorCSAgQW5kIHJlbW92ZSB0ZW1wb3JhcnkgY29tbWVudCBwb2ludGluZyB0byB0aGUgYnVnIHRpY2tldC4KKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIE1vdmUgcmVvY2N1cmluZyBsb2dnaW5nIHRvIExPRyBhbmQgbG9nIGluc3RhbmNlIHRvby4KKworMjAwOC0xMi0xNyAxNzoyODozOSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBleHQvcHVsc2UvcHVsc2VtaXhlcmN0cmwuYzogRG9uJ3QgbGVhayB0aGUgcGFfb3BlcmF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOgorCSAgRG9uJ3QgbGVhayB0aGUgcGFfb3BlcmF0aW9uLgorCisyMDA4LTEyLTE2IDE2OjE5OjI2ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogUmVxdWlyZSBjb3JlIGN2cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBSZXF1aXJlIGNvcmUgY3ZzLgorCisyMDA4LTEyLTE2IDE2OjA3OjQ4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IFJlbmFtZSBhcGkgZnJvbSBfZmx1c2ggdG8gX3Jlc2V0X3RhZ3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIFJlbmFtZSBhcGkgZnJvbSBfZmx1c2ggdG8gX3Jlc2V0X3RhZ3MuCisKKzIwMDgtMTItMTYgMTQ6MjI6NTEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmltdXguYzogVXNlIG5ldyB0YWdzZXR0ZXIgYXBpIHRvIGZsdXNoIHRhZ3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIFVzZSBuZXcgdGFnc2V0dGVyIGFwaSB0byBmbHVzaCB0YWdzLgorCisyMDA4LTEyLTE2IDEzOjE0OjM5ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOiBJbmNyZWFzZSB0aW1lb3V0IHRvIDMgbWludXRlcyB0byBwcmV2ZW50IHRpbWVvdXRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOiAoZGVpbnRlcmxlYXZlX3N1aXRlKToKKwkgIEluY3JlYXNlIHRpbWVvdXQgdG8gMyBtaW51dGVzIHRvIHByZXZlbnQgdGltZW91dHMuCisKKzIwMDgtMTItMTYgMTI6NTI6MjQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvaW50ZXJsZWF2ZS5jOiBJbmNyZWFzZSB0aW1lb3V0IHRvIDMgbWludXRlcyB0byBwcmV2ZW50IHRpbWVvdXRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ludGVybGVhdmUuYzogKGludGVybGVhdmVfc3VpdGUpOgorCSAgSW5jcmVhc2UgdGltZW91dCB0byAzIG1pbnV0ZXMgdG8gcHJldmVudCB0aW1lb3V0cy4KKworMjAwOC0xMi0xNiAxMTo1NzowMSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aW11eC4qOiBUb3RhbGx5IHJlbW92ZSB0aGUgaW50ZXJuYWwgdGFnbGlzdHMgYW5kIGZ1bGx5IHVzZSB0YWdzZXR0ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguaDoKKwkgIFRvdGFsbHkgcmVtb3ZlIHRoZSBpbnRlcm5hbCB0YWdsaXN0cyBhbmQgZnVsbHkgdXNlIHRhZ3NldHRlci4KKworMjAwOC0xMi0xNSAxNTo1OTo1MyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aW11eC5jOiBJbnN0ZWFkIG9mIGZpbHRlcmluZyB3cm9uZ2x5IGp1c3QgdXNlIHRoZSBtZXJnZW1vZGUuIEFwcGxpY2F0aW9ucyBpcyB1c2UgS0VFUF9BTEwgaWYgdGhleSB3YW50IHQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgSW5zdGVhZCBvZiBmaWx0ZXJpbmcgd3JvbmdseSBqdXN0IHVzZSB0aGUgbWVyZ2Vtb2RlLiBBcHBsaWNhdGlvbnMgaXMKKwkgIHVzZSBLRUVQX0FMTCBpZiB0aGV5IHdhbnQgdG8gc3VwcmVzcyB0YWctZXZlbnRzLiBGaXhlcyAjNTYzMjIxIGZvcgorCSAgYXZpIGZvciByZWFsIChJIGhvcGUpLiBFdmVyeW9uZSBjaGltZSBpbiwgYmVmb3JlIEkgZml4IHRoZSBvdGhlcnMuCisKKzIwMDgtMTItMTUgMTI6NDU6MzUgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZXh0L3B1bHNlL3B1bHNlbWl4ZXJjdHJsLmM6IEFkZCBub3RlIGFib3V0IG1lbWxlYWsuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3B1bHNlL3B1bHNlbWl4ZXJjdHJsLmM6CisJICBBZGQgbm90ZSBhYm91dCBtZW1sZWFrLgorCisyMDA4LTEyLTEzIDE2OjIzOjA5ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBtNC9NYWtlZmlsZS5hbTogQSBjb3VwbGUgbW9yZSAubTQgdGhhdCBhcmVuJ3Qgc2hpcHBlZCBhbnltb3JlIHdpdGggZ2V0dGV4dCAwLjE3LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIG00L01ha2VmaWxlLmFtOgorCSAgQSBjb3VwbGUgbW9yZSAubTQgdGhhdCBhcmVuJ3Qgc2hpcHBlZCBhbnltb3JlIHdpdGggZ2V0dGV4dCAwLjE3LgorCisyMDA4LTEyLTEzIDE1OjM0OjAxICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBTd2l0Y2ggdG8gdXNpbmcgR3N0U3RhdGljUGFkVGVtcGxhdGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfZGVjX2Jhc2VfaW5pdCksCisJICAoZ3N0X2ZsYWNfZGVjX2luaXQpOgorCSAgKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6IChnc3RfYWxhd19kZWNfYmFzZV9pbml0KSwKKwkgIChnc3RfYWxhd19kZWNfaW5pdCk6CisJICAqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzogKGdzdF9hbGF3X2VuY19iYXNlX2luaXQpLAorCSAgKGdzdF9hbGF3X2VuY19pbml0KToKKwkgICogZ3N0L2xhdy9hbGF3LmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6IChnc3RfbXVsYXdkZWNfYmFzZV9pbml0KSwKKwkgIChnc3RfbXVsYXdkZWNfaW5pdCk6CisJICAqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6IChnc3RfbXVsYXdlbmNfYmFzZV9pbml0KSwKKwkgIChnc3RfbXVsYXdlbmNfaW5pdCk6CisJICAqIGdzdC9sYXcvbXVsYXcuYzogKHBsdWdpbl9pbml0KToKKwkgIFN3aXRjaCB0byB1c2luZyBHc3RTdGF0aWNQYWRUZW1wbGF0ZS4KKwkgICogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOiAoZ3N0X3VkcF9nZXRfYWRkcik6CisJICBEb24ndCBmb3JnZXQgdG8gZnJlZSB0aGUgYWRkcmluZm8gc3RydWN0dXJlLgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9yZXNldCksCisJICAoZ3N0X3dhdnBhcnNlX3NpbmtfYWN0aXZhdGUpOgorCSAgRG9uJ3QgZm9yZ2V0IHRvIHVucmVmIHRoZSBHc3RBZGFwdGVyLgorCisyMDA4LTEyLTEzIDEyOjU4OjI0ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBtNC9NYWtlZmlsZS5hbTogaW50dHlwZXMubTQgaGFzbid0IGJlZW4gYXZhaWxhYmxlIHNpbmNlIGdldHRleHQtMC4xNSwgYW5kIHNpbmNlIHdlIG5vdyByZXF1aXJlIGdldHRleHQgPj0gMC4xNyAuLi4gd2UuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBtNC9NYWtlZmlsZS5hbToKKwkgIGludHR5cGVzLm00IGhhc24ndCBiZWVuIGF2YWlsYWJsZSBzaW5jZSBnZXR0ZXh0LTAuMTUsIGFuZCBzaW5jZSB3ZSBub3cKKwkgIHJlcXVpcmUgZ2V0dGV4dCA+PSAwLjE3IC4uLiB3ZSBjYW4gcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3Qgb2YgZmlsZXMgdG8KKwkgIGRpc3QuCisKKzIwMDgtMTItMTAgMTU6MDM6MjMgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgc21hbGxlciBzcGVjIGZpbGUgdXBkYXRlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBzbWFsbGVyIHNwZWMgZmlsZSB1cGRhdGVzCisKKzIwMDgtMTItMDkgMTc6NTU6MjIgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBNb3JlIGxvZ2dpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgTW9yZSBsb2dnaW5nLgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgSGFuZGxlIG1vcmUgbWV0YWRhdGEgZmllbGRzLiBCZXR0ZXIgZXN0aW1hdGUgb2YgbWV0YWRhdGEgc2l6ZS4gRG9uJ3QKKwkgIG1lcmdlIHJlY2VpdmVkIHRhZ3MsIGlmIGFwcGxpY2F0aW9uIGhhcyBzcGVjaWZpZWQgdGFncyB1c2luZworCSAgR1NUX1RBR19NRVJHRV9SRVBMQUNFX0FMTC4gRml4ZXMgIzU2MzIyMSBmb3IgYXZpLgorCisyMDA4LTEyLTA5IDE0OjMwOjAzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOiBBbHNvIGlnbm9yZSBwdWxzZW1peGVyIGZvciB0aGUgc3RhdGVzIHVuaXQgdGVzdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIEFsc28gaWdub3JlIHB1bHNlbWl4ZXIgZm9yIHRoZSBzdGF0ZXMgdW5pdCB0ZXN0LgorCisyMDA4LTEyLTA5IDE0OjE5OjE2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOiBBZGQgYW4gRU9JIG1hcmtlciBhdCB0aGUgZW5kIG9mIHRoZSBqcGVnIGZyYW1lIHdoZW4gaXQncyBtaXNzaW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6IChnc3RfcnRwX2pwZWdfZGVwYXlfcHJvY2Vzcyk6CisJICBBZGQgYW4gRU9JIG1hcmtlciBhdCB0aGUgZW5kIG9mIHRoZSBqcGVnIGZyYW1lIHdoZW4gaXQncyBtaXNzaW5nLgorCSAgRml4ZXMgIzU2MzA1Ni4KKworMjAwOC0xMi0wOSAxMDo0NzoxNCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2Nyb3AuYzogVXBkYXRlIHRoZSB1bml0IHRlc3QgZm9yIHRoZSBuZXcgY29sb3IgdmFsdWVzIGZvciBCVC42MDEgcmVkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOiAoY2hlY2tfMXgxX2J1ZmZlcik6CisJICBVcGRhdGUgdGhlIHVuaXQgdGVzdCBmb3IgdGhlIG5ldyBjb2xvciB2YWx1ZXMgZm9yIEJULjYwMSByZWQuCisJICBGaXhlcyBidWcgIzU2MzUxMC4KKworMjAwOC0xMi0wOSAxMDoyODoxMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2R2L2dzdGR2ZGVtdXguYzogUmVzdG9yZSBwcmV2aW91cyBiZWhhdmlvdXIgb2Ygbm90IHBhc3NpbmcgUW9TIGFuZCBuYXZpZ2F0aW9uIGV2ZW50cyB1cHN0cmVhbSwgd2hpY2ggcHJlc3VtYWJseSB3Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2hhbmRsZV9zcmNfZXZlbnQpOgorCSAgUmVzdG9yZSBwcmV2aW91cyBiZWhhdmlvdXIgb2Ygbm90IHBhc3NpbmcgUW9TIGFuZCBuYXZpZ2F0aW9uCisJICBldmVudHMgdXBzdHJlYW0sIHdoaWNoIHByZXN1bWFibHkgd2Fzbid0IG1lYW50IHRvIGJlIGNoYW5nZWQuCisKKzIwMDgtMTItMDkgMDk6Mzk6NTMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L2R2L2dzdGR2ZGVtdXguYzogQWRkIHNyY3BhZHMgb25seSB3aGVuIG5lZWRlZCBhbmQgcmVtb3ZlIHRoZW0gYWdhaW4gd2hlbiBnb2luZyBiYWNrIHRvIFJFQURZLiBUaGlzIHByZXZlbnRzIHN0YWxsLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2FkZF92aWRlb19wYWQpLAorCSAgKGdzdF9kdmRlbXV4X2FkZF9hdWRpb19wYWQpLCAoZ3N0X2R2ZGVtdXhfcmVtb3ZlX3BhZHMpLAorCSAgKGdzdF9kdmRlbXV4X2RlbXV4X2F1ZGlvKSwgKGdzdF9kdmRlbXV4X2RlbXV4X3ZpZGVvKSwKKwkgIChnc3RfZHZkZW11eF9jaGFpbiksIChnc3RfZHZkZW11eF9sb29wKSwKKwkgIChnc3RfZHZkZW11eF9jaGFuZ2Vfc3RhdGUpOgorCSAgQWRkIHNyY3BhZHMgb25seSB3aGVuIG5lZWRlZCBhbmQgcmVtb3ZlIHRoZW0gYWdhaW4gd2hlbiBnb2luZworCSAgYmFjayB0byBSRUFEWS4gVGhpcyBwcmV2ZW50cyBzdGFsbGVkIHBpcGVsaW5lcyBpZiB0aGVyZSdzIG5vCisJICBhdWRpbyBpbnNpZGUgdGhlIERWIHN0cmVhbSwgd2hpY2ggaGFwcGVucyBmb3IgbWFueSBNWEYgZmlsZXMuCisKKzIwMDgtMTItMDkgMDk6MDk6MjUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzogVGhlIHBvcnRzIGluIGxpYnNvdXAgYXJlIHVuc2lnbmVkIGludGVnZXJzIGFuZCBub3Qgc2lnbmVkIGludGVnZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6IChHU1RfU1RBUlRfVEVTVCksCisJICAocnVuX3NlcnZlcik6CisJICBUaGUgcG9ydHMgaW4gbGlic291cCBhcmUgdW5zaWduZWQgaW50ZWdlcnMgYW5kIG5vdCBzaWduZWQKKwkgIGludGVnZXJzLgorCisyMDA4LTEyLTA4IDE4OjMxOjAwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC9kdi9nc3RkdmRlbXV4LmM6IEZvcndhcmQgYWxsIGV2ZW50cyB1cHN0cmVhbSB1bmxlc3MgaXQncyBzb21ldGhpbmcgd2UgcmVhbGx5IGRvbid0IGhhbmRsZS4gVGhpcyBmaXhlcyBsYXRlbmN5IGNvbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9kdi9nc3RkdmRlbXV4LmM6IChnc3RfZHZkZW11eF9oYW5kbGVfc3JjX2V2ZW50KToKKwkgIEZvcndhcmQgYWxsIGV2ZW50cyB1cHN0cmVhbSB1bmxlc3MgaXQncyBzb21ldGhpbmcgd2UgcmVhbGx5CisJICBkb24ndCBoYW5kbGUuIFRoaXMgZml4ZXMgbGF0ZW5jeSBjb25maWd1cmF0aW9uIG9mIHBpcGVsaW5lcy4KKworMjAwOC0xMi0wOCAxODoyNDoyMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvZHYvOiBSZWFsbHkgY2FsbCBkdl9pbml0KCkgZXhhY3RseSBvbmUgdGltZSwgbm90IG9uZSB0aW1lIGZvciB0aGUgZGVtdXhlciBhbmQgb25lIHRpbWUgZm9yIHRoZSBkZWNvZGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9kdi9nc3Rkdi5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19jbGFzc19pbml0KToKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2NsYXNzX2luaXQpOgorCSAgUmVhbGx5IGNhbGwgZHZfaW5pdCgpIGV4YWN0bHkgb25lIHRpbWUsIG5vdCBvbmUgdGltZSBmb3IKKwkgIHRoZSBkZW11eGVyIGFuZCBvbmUgdGltZSBmb3IgdGhlIGRlY29kZXIuCisKKzIwMDgtMTItMDggMTI6Mzc6NDUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5jOiBDb3B5IGluY29tbWluZyB0aW1lc3RhbXAgdG8gb3V0Z29pbmcgcGFja2V0cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGFwYXkuYzogKGdzdF9ydHBfbXA0YV9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICBDb3B5IGluY29tbWluZyB0aW1lc3RhbXAgdG8gb3V0Z29pbmcgcGFja2V0cy4KKworMjAwOC0xMi0wOCAxMjozNjoyMSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6IERvbid0IHRyeSB0byBwdXNoIHBhY2tldHMgYmVmb3JlIHdlIGNvdWxkIGZpbmQgYSB2YWxpZCBjb25maWcgc3RhcnRjb2RlLiBGaXhlcyAjNTYzNTA5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOiAoZ3N0X3J0cF9tcDR2X3BheV9mbHVzaCksCisJICAoZ3N0X3J0cF9tcDR2X3BheV9ldmVudCk6CisJICBEb24ndCB0cnkgdG8gcHVzaCBwYWNrZXRzIGJlZm9yZSB3ZSBjb3VsZCBmaW5kIGEgdmFsaWQgY29uZmlnCisJICBzdGFydGNvZGUuIEZpeGVzICM1NjM1MDkuCisKKzIwMDgtMTItMDcgMTk6MjI6NDggKzAwMDAgIEJyaWFuIENhbWVyb24gPGJyaWFuLmNhbWVyb25Ac3VuLmNvbT4KKworCSAgc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6IFNldCB0aGUgbWl4ZXIgZmQgYmVmb3JlIGNhbGxpbmcgaW9jdGwoKSBvbiBpdC4gRml4ZXMgYnVnICM1NjM0MTQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uIGF0IHN1biBkb3QgY29tPgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuYzoKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl9jdHJsX29wZW4pOgorCSAgU2V0IHRoZSBtaXhlciBmZCBiZWZvcmUgY2FsbGluZyBpb2N0bCgpIG9uIGl0LiBGaXhlcyBidWcgIzU2MzQxNC4KKworMjAwOC0xMi0wNyAxOTowMTozNSArMDAwMCAgQWxleGFuZHJlIFJvc3RvdnRzZXYgPHRldHJvbWlub0BnbWFpbC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogTWFrZSB1c2FnZSBvZiBsaWJ2NGwgb3B0aW9uYWwgYnkgYSBjb25maWd1cmUgcGFyYW1ldGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQWxleGFuZHJlIFJvc3RvdnRzZXYgPHRldHJvbWlubyBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBjb25maWd1cmUuYWM6CisJICBNYWtlIHVzYWdlIG9mIGxpYnY0bCBvcHRpb25hbCBieSBhIGNvbmZpZ3VyZSBwYXJhbWV0ZXIuCisJICBGaXhlcyBidWcgIzU2MzUwNC4KKworMjAwOC0xMi0wNSAwOToyNDoxOCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgbWF0cm9za2FtdXggYW5kIG1hdHJvc2thZGVtdXggYW5kIHVwZGF0ZSB0aGUgaW5zcGVjdGlvbiB4bWwgZmlsZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkgIEFkZCBkb2N1bWVudGF0aW9uIGZvciBtYXRyb3NrYW11eCBhbmQgbWF0cm9za2FkZW11eCBhbmQKKwkgIHVwZGF0ZSB0aGUgaW5zcGVjdGlvbiB4bWwgZmlsZXMuCisKKzIwMDgtMTItMDQgMjA6MTA6NTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgY29uZmlndXJlLmFjOiBBcHBhcmVudGx5IEFDX0NPTkZJR19NQUNST19ESVIgYnJlYWtzIHdoZW4gdXNpbmcgbW9yZSB0aGFuIG9uZSBtYWNybyBkaXJlY3RvcnksIHJldmVydGluZyBsYXN0IGNoYW5nZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBBcHBhcmVudGx5IEFDX0NPTkZJR19NQUNST19ESVIgYnJlYWtzIHdoZW4gdXNpbmcgbW9yZQorCSAgdGhhbiBvbmUgbWFjcm8gZGlyZWN0b3J5LCByZXZlcnRpbmcgbGFzdCBjaGFuZ2UuCisKKzIwMDgtMTItMDQgMTk6NDc6MjEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgY29uZmlndXJlLmFjOiBTZXQgQUNfQ09ORklHX01BQ1JPX0RJUiB0byBjb21tb24vbTQgdG8gcG9pbnQgYXV0b2NvbmYgdG8gb3VyIE00IG1hY3Jvcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBTZXQgQUNfQ09ORklHX01BQ1JPX0RJUiB0byBjb21tb24vbTQgdG8gcG9pbnQgYXV0b2NvbmYgdG8KKwkgIG91ciBNNCBtYWNyb3MuCisKKzIwMDgtMTEtMzAgMTY6MjQ6NDUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogUHJvdmlkZSB0aGUgcGFyYW1ldGVycyB0aGF0IGFyZSByZXF1aXJlZCBmb3IgdGhlIGZvcm1hdCBzdHJpbmcgdG8gZml4IGEgY29tcGlsZXIgd2FybmluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19yZW5kZXIpOgorCSAgUHJvdmlkZSB0aGUgcGFyYW1ldGVycyB0aGF0IGFyZSByZXF1aXJlZCBmb3IgdGhlIGZvcm1hdCBzdHJpbmcKKwkgIHRvIGZpeCBhIGNvbXBpbGVyIHdhcm5pbmcuCisKKzIwMDgtMTEtMjkgMjA6MDU6NDEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6IEZpeCBjbGFzc2lmaWNhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuYzoKKwkgIEZpeCBjbGFzc2lmaWNhdGlvbi4KKworMjAwOC0xMS0yOSAxMzozMTo1NSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBSZXF1aXJlIGdldHRleHQgMC4xNyBiZWNhdXNlIG9sZGVyIHZlcnNpb25zIGRvbid0IG1peCB3aXRoIGxpYnRvb2wgMi4yLiBBdCBidWlsZCB0aW1lIGFuIG9sZGVyIGdldHRleHQgdmVyc2lvbiB3aWxsIHMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEN5Z3dpbiBQb3J0cyBtYWludGFpbmVyCisJICA8eXNlbGtvd2l0eiBhdCB1c2VycyBkb3Qgc291cmNlZm9yZ2UgZG90IG5ldD4KKwkgICogYXV0b2dlbi5zaDoKKwkgICogY29uZmlndXJlLmFjOgorCSAgUmVxdWlyZSBnZXR0ZXh0IDAuMTcgYmVjYXVzZSBvbGRlciB2ZXJzaW9ucyBkb24ndCBtaXggd2l0aCBsaWJ0b29sCisJICAyLjIuIEF0IGJ1aWxkIHRpbWUgYW4gb2xkZXIgZ2V0dGV4dCB2ZXJzaW9uIHdpbGwgc3RpbGwgd29yay4KKwkgIEZpeGVzIGJ1ZyAjNTU2MDkxLgorCisyMDA4LTExLTI4IDE1OjEwOjUwICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogTWFrZSBnc3RfbXVsdGl1ZHBzaW5rX3JlbmRlcigpIGlnbm9yZSBlcnJvcnMgZnJvbSBzZW5kdG8oKSBpbnN0ZWFkIG9mIGJyZWFraW5nIHN0cmVhbWluZy4gLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBQZXRlciBLamVsbGVyc3RlZHQgPHBraiBhdCBheGlzIGNvbT4KKwkgICogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogKGdzdF9tdWx0aXVkcHNpbmtfcmVuZGVyKToKKwkgIE1ha2UgZ3N0X211bHRpdWRwc2lua19yZW5kZXIoKSBpZ25vcmUgZXJyb3JzIGZyb20gc2VuZHRvKCkgaW5zdGVhZCBvZgorCSAgYnJlYWtpbmcgc3RyZWFtaW5nLiBFbWl0IGEgd2FybmluZyBpbnN0ZWFkLiBGaXhlcyAjNTYyNTcyLgorCisyMDA4LTExLTI3IDE2OjQzOjI0ICswMDAwICBSb24gTWNPdWF0IDxybWNvdWF0QHNtYXJ0dC5jb20+CisKKwkgIEFkZCBzdXBwb3J0IGZvciBiYXNpYyBhbmQgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIGluIHNvdXBodHRwc3JjLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUm9uIE1jT3VhdCA8cm1jb3VhdCBhdCBzbWFydHQgZG90IGNvbT4KKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKGdzdF9zb3VwX2h0dHBfc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX2luaXQpLCAoZ3N0X3NvdXBfaHR0cF9zcmNfZGlzcG9zZSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9zb3VwX2h0dHBfc3JjX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfYXV0aGVudGljYXRlX2NiKSwgKGdzdF9zb3VwX2h0dHBfc3JjX3N0YXJ0KToKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuaDoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzogKGJhc2ljX2F1dGhfY2IpLAorCSAgKGRpZ2VzdF9hdXRoX2NiKSwgKHJ1bl90ZXN0KSwgKEdTVF9TVEFSVF9URVNUKSwKKwkgIChzb3VwaHR0cHNyY19zdWl0ZSksIChydW5fc2VydmVyKToKKwkgIEFkZCBzdXBwb3J0IGZvciBiYXNpYyBhbmQgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIGluIHNvdXBodHRwc3JjLgorCSAgRml4ZXMgYnVnICM1NjE3NzUuCisKKzIwMDgtMTEtMjcgMTI6MTM6MzkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L3dhdmVuYy86IEFkZCBzdXBwb3J0IGZvciBhLWxhdyBhbmQgbXUtbGF3IGVuY29kZWQgd2F2IGZpbGVzLiBGaXhlcyBidWcgIzU2MjQzNC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFBlcGlqbiBWYW4gRWVja2hvdWR0CisJICA8cGVwaWpuIGRvdCB2YW5lZWNraG91ZHQgYXQgbHVjaWFkIGRvdCBjb20+CisJICAqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChnc3Rfd2F2ZW5jX2NyZWF0ZV9oZWFkZXJfYnVmKSwKKwkgIChnc3Rfd2F2ZW5jX3Npbmtfc2V0Y2FwcyksIChnc3Rfd2F2ZW5jX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmg6CisJICAqIGdzdC93YXZlbmMvcmlmZi5oOgorCSAgQWRkIHN1cHBvcnQgZm9yIGEtbGF3IGFuZCBtdS1sYXcgZW5jb2RlZCB3YXYgZmlsZXMuIEZpeGVzIGJ1ZyAjNTYyNDM0LgorCisyMDA4LTExLTI3IDExOjIyOjU2ICswMDAwICDsnbTrrLjtmJUgPGl3aW5nc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogUHJldmVudCBmdXJ0aGVyIHJlYWQvd3JpdGUgYWN0aW9ucyB0YWtlbiB0byB0aGUgY29ubmVjdC1mYWlsZWQgc29ja2V0IGJ5IGVycm9yaW5nIG91dCBxdWlja2x5Li4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTog7J2066y47ZiVIDxpd2luZ3MgYXQgZ21haWwgZG90IGNvbT4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfbG9vcF91ZHApOgorCSAgUHJldmVudCBmdXJ0aGVyIHJlYWQvd3JpdGUgYWN0aW9ucyB0YWtlbiB0byB0aGUgY29ubmVjdC1mYWlsZWQgc29ja2V0IGJ5CisJICBlcnJvcmluZyBvdXQgcXVpY2tseS4gU2VlICM1NjIyNTguCisKKzIwMDgtMTEtMjYgMjE6MTk6NDcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdGVzdHMvZXhhbXBsZXMvbGV2ZWwvbGV2ZWwtZXhhbXBsZS5jOiBTZXQgZmFrZXNpbmsgdG8gc3luYy4gT3RoZXJ3aXNlIHBlb3BsZSBtaWdodCBxdWVzdGlvbiB0aGUgbWVzc2FnZSBpbnRlcnZhbC4gTmV2Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvZXhhbXBsZXMvbGV2ZWwvbGV2ZWwtZXhhbXBsZS5jOgorCSAgU2V0IGZha2VzaW5rIHRvIHN5bmMuIE90aGVyd2lzZSBwZW9wbGUgbWlnaHQgcXVlc3Rpb24gdGhlIG1lc3NhZ2UKKwkgIGludGVydmFsLiBOZXZlcnRoZWxlc3MgdGhlIHRpbWVzdGFtcCBpbiB0aGUgbWVzc2FnZSBpcyB3aGF0IG1hdHRlcnMuCisKKzIwMDgtMTEtMjUgMTg6MTM6MjUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHRlc3RzL2ljbGVzLy5jdnNpZ25vcmU6IGN2c2lnbm9yZSBuZXdseSBnZW5lcmF0ZWQgZmlsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9pY2xlcy8uY3ZzaWdub3JlOgorCSAgY3ZzaWdub3JlIG5ld2x5IGdlbmVyYXRlZCBmaWxlLgorCisyMDA4LTExLTI1IDE4OjAzOjAyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogRml4IHRoZSBkZXNjcmlwdGlvbnMgYW5kIGZpeCBzb21lIGVtYWlsIGFkZHJlc3Nlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jOgorCSAgKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5LmM6IChnc3RfcnRwX0wxNl9kZXBheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNnBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNnBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmM6IChnc3RfcnRwX2FjM19kZXBheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOiAoZ3N0X3J0cF9kdl9kZXBheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6IChnc3RfcnRwX2dzbV9wYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6IChnc3RfcnRwX2gyNjNfZGVwYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6IChnc3RfcnRwX2gyNjNwX2RlcGF5X3NldGNhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmM6IChnc3RfcnRwX21wMXNfZGVwYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6IChnc3RfcnRwX21wMnRfZGVwYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydHBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzogKGdzdF9ydHBfbXA0YV9kZXBheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOiAoZ3N0X3J0cF9tcDRnX2RlcGF5X3NldGNhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRncGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6IChnc3RfcnRwX21wNHZfZGVwYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOiAoZ3N0X3J0cF9tcDR2X3BheV9ldmVudCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wdmRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6IChnc3RfcnRwX3BjbWFfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbXVkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOiAoZ3N0X3J0cF92b3JiaXNfcGF5X2ZpbmlzaF9oZWFkZXJzKToKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzogKGdzdF9ydHBfdnJhd19kZXBheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJICBGaXggdGhlIGRlc2NyaXB0aW9ucyBhbmQgZml4IHNvbWUgZW1haWwgYWRkcmVzc2VzLgorCisyMDA4LTExLTI1IDE3OjQ3OjI0ICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGQgTVBHMSBhbmQgTVBHMiBmb3VyY2MgdG8gc3VwcG9ydGVkIHF0ZGVtdXggdmlkZW8gY29kZWNzIGFzIEkgZm91bmQgc29tZSB2aWRlbyBjbGlwcyB1c2luZyB0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDgtMTEtMjUgIEp1bGllbiBNb3V0dGUgIDxqdWxpZW5AZmx1ZW5kby5jb20+CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6IEFkZCBNUEcxIGFuZCBNUEcyCisJICBmb3VyY2MKKwkgIHRvIHN1cHBvcnRlZCBxdGRlbXV4IHZpZGVvIGNvZGVjcyBhcyBJIGZvdW5kIHNvbWUgdmlkZW8gY2xpcHMKKwkgIHVzaW5nCisJICB0aG9zZS4KKworMjAwOC0xMS0yNSAxNjoyNjoxNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2F1dG9kZXRlY3QvOiBQb3N0IGFuIGVycm9yIHdoZW4gd2UgY2FuJ3Qgc2V0IHRoZSBpbnRlcm5hbCBnaG9zdHBhZCB0YXJnZXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOiAoZ3N0X2F1dG9fYXVkaW9fc2lua19kZXRlY3QpOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuYzogKGdzdF9hdXRvX2F1ZGlvX3NyY19kZXRlY3QpOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6IChnc3RfYXV0b192aWRlb19zaW5rX3Jlc2V0KSwKKwkgIChnc3RfYXV0b192aWRlb19zaW5rX2RldGVjdCk6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5jOiAoZ3N0X2F1dG9fdmlkZW9fc3JjX2RldGVjdCk6CisJICBQb3N0IGFuIGVycm9yIHdoZW4gd2UgY2FuJ3Qgc2V0IHRoZSBpbnRlcm5hbCBnaG9zdHBhZCB0YXJnZXQuCisKKzIwMDgtMTEtMjUgMTY6MDY6MjIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLio6IEZpeCByZW5lZ290aWF0aW9uIHdoZW4gY2hhbmdpbmcgcHJvcGVydGllcyB1c2luZyB0aGUgbmV3IGJhc2V0cmFuc2Zvcm0gZmVhdHVyZXMuIEZpeGVzIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6IChnc3RfdmlkZW9fY3JvcF9pbml0KSwKKwkgIChnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm0pLCAoZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX2NhcHMpLAorCSAgKGdzdF92aWRlb19jcm9wX3NldF9jYXBzKSwgKGdzdF92aWRlb19jcm9wX3NldF9wcm9wZXJ0eSk6CisJICAqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmg6CisJICBGaXggcmVuZWdvdGlhdGlvbiB3aGVuIGNoYW5naW5nIHByb3BlcnRpZXMgdXNpbmcgdGhlIG5ldyBiYXNldHJhbnNmb3JtCisJICBmZWF0dXJlcy4gRml4ZXMgIzU2MTUwMi4KKwkgICogdGVzdHMvaWNsZXMvTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcDItdGVzdC5jOiAobWFrZV9waXBlbGluZSksIChtYWluKToKKwkgIEFkZCBjcmF6eSBpbnRlcmFjdGl2ZSB0ZXN0IHVuaXQgZm9yIGR5bmFtaWNhbGx5IGNoYW5naW5nIHByb3BlcnRpZXMuCisKKzIwMDgtMTEtMjQgMTI6MjA6MjkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogQWRkIHNvbWUgbW9yZSBkZWJ1Z2dpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAobmV3X3Nlc3Npb25fcGFkKSwKKwkgIChnc3RfcnRzcHNyY19wYXJzZV9yYW5nZSk6CisJICBBZGQgc29tZSBtb3JlIGRlYnVnZ2luZy4KKwkgIFVzZSB0aGUgcmVhbmdlcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIgdW5jb25kaXRpb25hbGx5LgorCSAgRml4ZXMgIzU2MTYyNS4KKworMjAwOC0xMS0yMyAxNTowODo0NSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBleHQvcHVsc2UvcHVsc2VzaW5rLmM6IENoYW5nZSAjaWYgMCB0byBzb21ldGhpbmcgbW9yZSBleHByZXNpdmUgYW5kIGFkZCBwb2ludGVyIHRvIHJlbGF0ZWQgYnVnIHRpY2tldC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBDaGFuZ2UgI2lmIDAgdG8gc29tZXRoaW5nIG1vcmUgZXhwcmVzaXZlIGFuZCBhZGQgcG9pbnRlciB0byByZWxhdGVkCisJICBidWcgdGlja2V0LgorCisyMDA4LTExLTIzIDExOjE3OjAxICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkgIENoYW5nZUxvZyBzdXJnZXJ5CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIENoYW5nZUxvZyBzdXJnZXJ5CisKKzIwMDgtMTEtMjMgMTE6MTQ6NDIgKzAwMDAgIFRhbCBTaGFsaWYgPHRzaGFsaWZAbmFyZ2lsYS5vcmc+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogVXNlIEdfe0JJRyxMSVRUTEV9X0VORElBTiBpbnN0ZWFkIG9mIHRoZSBub24tR0xpYiB2YXJpYW50cyBhcyB0aGUgbGF0dGVyIGRvbid0IGV4aXN0IG9uIHNvbWUgcy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVGFsIFNoYWxpZiA8dHNoYWxpZiBhdCBuYXJnaWxhIGRvdCBvcmc+CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfYXVkaW9fY2Fwcyk6CisJICBVc2UgR197QklHLExJVFRMRX1fRU5ESUFOIGluc3RlYWQgb2YgdGhlIG5vbi1HTGliIHZhcmlhbnRzIGFzCisJICB0aGUgbGF0dGVyIGRvbid0IGV4aXN0IG9uIHNvbWUgc3lzdGVtcyAobWluZ3cpLiBGaXhlcyBidWcgIzU2MTk5Mi4KKworMjAwOC0xMS0yMSAxMzo0MzoyOSArMDAwMCAgWmVlc2hhbiBBbGkgPHplZXNoYW5ha0Bnbm9tZS5vcmc+CisKKwkgIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IEFkZCB0cmFuc2Zlck1vZGUuZG5sYS5vcmcgaGVhZGVyIHRvIEhUVFAgcmVxdWVzdHMgYXMgdGhpcyBpcyByZXF1aXJlZCBieSB0aGUgRExOQSBzcGVjcyBhbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogWmVlc2hhbiBBbGkgPHplZXNoYW5hayBhdCBnbm9tZSBkb3Qgb3JnPgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOiAoZ3N0X3NvdXBfaHR0cF9zcmNfYnVpbGRfbWVzc2FnZSk6CisJICBBZGQgdHJhbnNmZXJNb2RlLmRubGEub3JnIGhlYWRlciB0byBIVFRQIHJlcXVlc3RzIGFzIHRoaXMgaXMKKwkgIHJlcXVpcmVkIGJ5IHRoZSBETE5BIHNwZWNzIGFuZCBkb2Vzbid0IGh1cnQgaW4gb3RoZXIgc2l0dWF0aW9ucy4KKwkgIEZpeGVzIGJ1ZyAjNTYxODAyLgorCisyMDA4LTExLTIwIDIzOjU5OjA3ICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuKjogSGFuZGxlIHZpZGVvIHdpbmRvdyByZXNpemluZyBtb3JlIGNvcnJlY3RseSwgYXZvaWRpbmcgY3Jhc2hlcyB3aGVuIGVtYmVkZGluZyB0aGUgd2luZG93IC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgSGFuZGxlIHZpZGVvIHdpbmRvdyByZXNpemluZyBtb3JlIGNvcnJlY3RseSwgYXZvaWRpbmcgY3Jhc2hlcyB3aGVuCisJICBlbWJlZGRpbmcgdGhlIHdpbmRvdyBhbmQgcmVzaXppbmcgaXQuCisKKzIwMDgtMTEtMjAgMjI6NTY6NTggKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZ3N0L3VkcC86IEZpeCBtdWx0aXVkcHNpbmsgb24gT1NYIGJ5IHBhc3NpbmcgdGhlIHNwZWNpZmljIGxlbmd0aCBvZiB0aGUgc29ja2V0LCByZWZhY3RvciB0aGF0IGludG8gYSBmdW5jdGlvbiBzaGFyZWQgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgICogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSAgKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmg6CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICBGaXggbXVsdGl1ZHBzaW5rIG9uIE9TWCBieSBwYXNzaW5nIHRoZSBzcGVjaWZpYyBsZW5ndGggb2YgdGhlIHNvY2tldCwKKwkgIHJlZmFjdG9yIHRoYXQgaW50byBhIGZ1bmN0aW9uIHNoYXJlZCB3aXRoIHRoZSBzYW1lIHRoaW5nIGluIHVkcHNyYy4KKworMjAwOC0xMS0yMCAyMDowNzoyNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IEZpeCB0aGUgc2NhbGluZyBjb2RlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAodWludDY0X2NlaWxpbmdfc2NhbGVfaW50KSwKKwkgICh1aW50NjRfY2VpbGluZ19zY2FsZSksIChnc3Rfd2F2cGFyc2VfY2FsY3VsYXRlX2R1cmF0aW9uKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMpOgorCSAgRml4IHRoZSBzY2FsaW5nIGNvZGUuCisJICBGaXggcGFyc2luZyBvZiB0aGUgSU5GTyBjaHVua3MsIHdlIHdlcmUgcmVhZGluZyB0aGUgd3JvbmcgbnVtYmVyIG9mCisJICBieXRlcy4gIEZpeGVzICM1NjE1ODAuCisKKzIwMDgtMTEtMjAgMTQ6MzA6NDAgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IEZpeCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2Ugb2YgYW4gdW5zZXQgY29kZWNfaWQgaW4gdGhlIHJlY2VudGx5IGFkZGVkIERpcmFjIHBhdGhzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgRml4IE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSBvZiBhbiB1bnNldCBjb2RlY19pZCBpbiB0aGUgcmVjZW50bHkKKwkgIGFkZGVkIERpcmFjIHBhdGhzCisKKzIwMDgtMTEtMjAgMTM6NTg6NDMgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogSnVzdCBrZWVwIGRpc2FibGluZyBlbGVtZW50cyB0aGF0IGhhbmcgdGhlIHN0YXRlcyB0ZXN0IHVudGlsIGl0IHdvcmtzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgSnVzdCBrZWVwIGRpc2FibGluZyBlbGVtZW50cyB0aGF0IGhhbmcgdGhlIHN0YXRlcyB0ZXN0IHVudGlsIGl0CisJICB3b3Jrcy4KKworMjAwOC0xMS0yMCAxMzo0Njo0NyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6IERvbid0IGZsdXNoIGRvd25zdHJlYW0gYWZ0ZXIgZXZlcnkgYnVmZmVyIC0gdGhhdCdzIG5vdCB3aGF0IHRoaXMgbGlicG5nIGNhbGxiYWNrIGlzIGZvciBhdCBhbGwhCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkgIERvbid0IGZsdXNoIGRvd25zdHJlYW0gYWZ0ZXIgZXZlcnkgYnVmZmVyIC0gdGhhdCdzIG5vdCB3aGF0CisJICB0aGlzIGxpYnBuZyBjYWxsYmFjayBpcyBmb3IgYXQgYWxsIQorCisyMDA4LTExLTE3IDE0OjA0OjIwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IFR1cm5zIG91dCB3ZSBkb24ndCBhbHdheXMgZ2V0IHRoZSBmcmFtZSBzaXplcyBpbiBhIHByZWRlZmluZWQgb3JkZXIgZnJvbSBsb3dlc3QgdG8gaGlnaGVzdCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICAoZ3N0X3Y0bDJzcmNfcHJvYmVfY2Fwc19mb3JfZm9ybWF0X2FuZF9zaXplKSwgKHNvcnRfYnlfZnJhbWVfc2l6ZSksCisJICAoZ3N0X3Y0bDJzcmNfcHJvYmVfY2Fwc19mb3JfZm9ybWF0KToKKwkgIFR1cm5zIG91dCB3ZSBkb24ndCBhbHdheXMgZ2V0IHRoZSBmcmFtZSBzaXplcyBpbiBhIHByZWRlZmluZWQKKwkgIG9yZGVyIGZyb20gbG93ZXN0IHRvIGhpZ2hlc3QgcmVzb2x1dGlvbiwgc28gbGV0J3MganVzdCBzb3J0IHRoZQorCSAgbGlzdCBieSBmcmFtZSBzaXplIG9uY2Ugd2UndmUgcXVlcmllZCB0aGUgcG9zc2libGUgcmVzb2x1dGlvbnMKKwkgIHJhdGhlciB0aGFuIGFzc3VtZSBhbnkgcGFydGljdWxhciBvcmRlci4gRml4ZXMgcHJvYmVkIGNhcHMgZm9yCisJICB0aGUgY2FtZXJhIGluIG15IEhQMjEzMyBtaW5pIG5vdGVib29rIGFuZCBtYWtlcyB2NGwyc3JjIGRlZmF1bHQKKwkgIHRvIGEgZGVjZW50IHNpemUuCisKKzIwMDgtMTEtMTYgMTQ6NDE6MzIgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9tYXRyb3NrYS86IE1ha2UgbWt2ZGVtdXggYXdhcmUgb2YgRS1BQzMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfYXVkaW9fY2Fwcyk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIE1ha2UgbWt2ZGVtdXggYXdhcmUgb2YgRS1BQzMuCisKKzIwMDgtMTEtMTQgMTg6NDE6MjkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvOiBBZGQgYSBqcGVnIGRlcGF5bG9hZGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHAvZ3N0cnRwLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6IChnc3RfcnRwX2pwZWdfZGVwYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX2pwZWdfZGVwYXlfY2xhc3NfaW5pdCksIChnc3RfcnRwX2pwZWdfZGVwYXlfaW5pdCksCisJICAoZ3N0X3J0cF9qcGVnX2RlcGF5X2ZpbmFsaXplKSwgKE1ha2VUYWJsZXMpLCAoTWFrZVF1YW50SGVhZGVyKSwKKwkgIChNYWtlSHVmZm1hbkhlYWRlciksIChNYWtlRFJJSGVhZGVyKSwgKE1ha2VIZWFkZXJzKSwKKwkgIChnc3RfcnRwX2pwZWdfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX2pwZWdfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF9qcGVnX2RlcGF5X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3J0cF9qcGVnX2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuaDoKKwkgIEFkZCBhIGpwZWcgZGVwYXlsb2FkZXIuCisJICAqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAgU2V0IHRoZSBkZWZhdWx0IHByb3BlcnRpZXMgb24gdGhlIHBheWxvYWRlciB0byBiZXR0ZXIgZGVmYXVsdHMuCisKKzIwMDgtMTEtMTQgMTU6NDI6MzIgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgc3lzL3Y0bDIvZ3N0djRsMi5jOiBHaXZlIGl0IGEgcHJpbWFyeSByYW5rIGZvciBhdXRvdmlkZW9zcmMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMi5jOgorCSAgR2l2ZSBpdCBhIHByaW1hcnkgcmFuayBmb3IgYXV0b3ZpZGVvc3JjLgorCisyMDA4LTExLTE0IDExOjQxOjU1ICswMDAwICBCam9ybiBPc3RieSA8Ympvcm5vc0BheGlzLmNvbT4KKworCSAgZ3N0L3J0cC86IEFkZCBKUEVHIHBheWxvYWRlci4gRml4ZXMgIzU2MDc1Ni4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEJqb3JuIE9zdGJ5IDxiam9ybm9zIGF0IGF4aXMgZG90IGNvbT4KKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6IChnc3RfcnRwX2pwZWdfcGF5X2Jhc2VfaW5pdCksCisJICAoZ3N0X3J0cF9qcGVnX3BheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfanBlZ19wYXlfaW5pdCksCisJICAoZ3N0X3J0cF9qcGVnX3BheV9zZXRjYXBzKSwgKGdzdF9ydHBfanBlZ19wYXlfaGVhZGVyX3NpemUpLAorCSAgKGdzdF9ydHBfanBlZ19wYXlfcmVhZF9xdWFudF90YWJsZSksCisJICAoZ3N0X3J0cF9qcGVnX3BheV9zY2FuX21hcmtlciksIChnc3RfcnRwX2pwZWdfcGF5X2hhbmRsZV9idWZmZXIpLAorCSAgKGdzdF9ydHBfanBlZ19wYXlfc2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBfanBlZ19wYXlfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX2pwZWdfcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBqcGVncGF5Lmg6CisJICBBZGQgSlBFRyBwYXlsb2FkZXIuIEZpeGVzICM1NjA3NTYuCisKKzIwMDgtMTEtMTMgMTc6NDU6NTkgKzAwMDAgIEZhYnJpY2lvIEdvZG95IDxza2FybGxvdEBnbWFpbC5jb20+CisKKwkgIHN5cy86IEZpeCBzb21lIHNwZWxsaW5nIG1pc3Rha2VzLiBGaXhlcyAjNTU2ODAyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogRmFicmljaW8gR29kb3kgPHNrYXJsbG90IGF0IGdtYWlsIGRvdCBjb20+CisJICAqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiAoZ3N0X29zc19zaW5rX29wZW4pOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NyYy5jOiAoZ3N0X29zc19zcmNfb3Blbik6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogKGdzdF92NGwyc3JjX2dldF9tbWFwKToKKwkgICogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOiAoZ3N0X3Y0bDJfZmlsbF9saXN0cyk6CisJICBGaXggc29tZSBzcGVsbGluZyBtaXN0YWtlcy4gRml4ZXMgIzU1NjgwMi4KKworMjAwOC0xMS0xMyAxNjoyNDo1OSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvZXF1YWxpemVyLzogQWRkIHByZXNldHMgZm9yIGVxdWFsaXplci4gRml4ZXMgIzUyMjE4My4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL0dzdElpckVxdWFsaXplcjEwQmFuZHMucHJzOgorCSAgKiBnc3QvZXF1YWxpemVyL0dzdElpckVxdWFsaXplcjNCYW5kcy5wcnM6CisJICAqIGdzdC9lcXVhbGl6ZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5jOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5jOgorCSAgQWRkIHByZXNldHMgZm9yIGVxdWFsaXplci4gRml4ZXMgIzUyMjE4My4KKworMjAwOC0xMS0xMyAxNjoxNzozOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvOiBSZW1vdmUgZ29vZ2xlIGV4dGVuc2lvbiBhZ2FpbiwgaXQncyBub3QgbmVlZGVkIGFueW1vcmUgYmVjYXVzZSB3ZSBuZXZlciBzZW5kIG11bHRpcGxlIHRyYW5zcG9ydHMgYW55bW9yZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwZ29vZ2xlLmM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3Bnb29nbGUuaDoKKwkgIFJlbW92ZSBnb29nbGUgZXh0ZW5zaW9uIGFnYWluLCBpdCdzIG5vdCBuZWVkZWQgYW55bW9yZSBiZWNhdXNlIHdlIG5ldmVyCisJICBzZW5kIG11bHRpcGxlIHRyYW5zcG9ydHMgYW55bW9yZS4KKworMjAwOC0xMS0xMyAxNjoxMToxNiArMDAwMCAgRXJpYyBaaGFuZyA8Y2hhby56aGFuZ0BhY2Nlc3MtY29tcGFueS5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuKjogQWRkIHByb3BlcnR5IHRvIGNvbmZpZ3VyZSBOQVQgdHJhdmVyc2FsIG1ldGhvZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IEVyaWMgWmhhbmcgPGNoYW8uemhhbmcgYXQgYWNjZXNzLWNvbXBhbnkgZG90IGNvbT4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BfbmF0X21ldGhvZF9nZXRfdHlwZSksCisJICAoZ3N0X3J0c3BzcmNfY2xhc3NfaW5pdCksIChnc3RfcnRzcHNyY19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHNwc3JjX2dldF9wcm9wZXJ0eSksIChnc3RfcnRzcHNyY19jcmVhdGVfc3RyZWFtKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fZnJlZSksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV91ZHBfc2lua3MpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KSwKKwkgIChnc3RfcnRzcHNyY19zZW5kX2R1bW15X3BhY2tldHMpLAorCSAgKGdzdF9ydHNwc3JjX2NyZWF0ZV90cmFuc3BvcnRzX3N0cmluZyksCisJICAoZ3N0X3J0c3BzcmNfaGFuZGxlX21lc3NhZ2UpLCAoZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgQWRkIHByb3BlcnR5IHRvIGNvbmZpZ3VyZSBOQVQgdHJhdmVyc2FsIG1ldGhvZC4KKwkgIElnbm9yZSBFT1MgZnJvbSB0aGUgaW50ZXJuYWwgc2lua3MuCisJICBJbXBsZW1lbnQgc2VuZGluZyBkdW1teSBwYWNrZXRzIGFzIGEgKHNpbXBsZSkgbWV0aG9kIHRvIG9wZW4gdXAKKwkgIHNvbWUgZmlyZXdhbGxzLgorCSAgU2VuZCBQTEFZIHJlcXVlc3QgdG8gdGhlIHNlcnZlciBhZnRlciB3ZSBzdGFydGVkIHRoZSB1ZHAgc291cmNlcy4KKwkgIEZpeGVzICM1NTk1NDUuCisKKzIwMDgtMTEtMTMgMTQ6MDQ6NDAgKzAwMDAgIFlvdGFtIDxzaC55b3RhbUBnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOiBGbHVzaCB0aGUgcmVtYWluaW5nIGZyYW1lcyBvbiBFT1MuIEZpeGVzICM1NjA2NDEuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBZb3RhbSA8c2ggZG90IHlvdGFtIGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOiAoZ3N0X3J0cF9tcDR2X3BheV9ldmVudCk6CisJICBGbHVzaCB0aGUgcmVtYWluaW5nIGZyYW1lcyBvbiBFT1MuIEZpeGVzICM1NjA2NDEuCisKKzIwMDgtMTEtMTIgMTY6Mzc6MDYgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzogRml4IGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgcHJpbnRmIGZvcm1hdHRpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6IChnc3RfcnRwX2c3MjlfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgRml4IGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgcHJpbnRmIGZvcm1hdHRpbmcuCisKKzIwMDgtMTEtMTIgMTE6NTU6MTQgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC4qOiBRdWV1ZSB1cCBuZXcgc2VnbWVudCBldmVudHMgaW5zdGVhZCBvZiBzZW5kaW5nIHRoZW0gZnJvbSB0aGUgc2Vla2luZyB0aHJlYWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oIChzdHJ1Y3QgX0dzdFFURGVtdXgpOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmMgKGdzdF9xdGRlbXV4X2RvX3NlZWspOiBRdWV1ZSB1cCBuZXcKKwkgIHNlZ21lbnQgZXZlbnRzIGluc3RlYWQgb2Ygc2VuZGluZyB0aGVtIGZyb20gdGhlIHNlZWtpbmcgdGhyZWFkLgorCSAgRml4ZXMgIzU1OTI4OC4KKwkgIChnc3RfcXRkZW11eF9wdXNoX3BlbmRpbmdfbmV3c2VnbWVudCk6IE5ldyBoZWxwZXIsIHNlbmRzIG91dAorCSAgcXVldWVkIG5ld3NlZ21lbnQgZXZlbnRzLgorCSAgKGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfbW92aWUpOiBWb2lsw6AsIGNhbGwgaXQgaGVyZS4gT25seSBuZWVkIHRvCisJICBjYWxsIGl0IGhlcmUsIGFzIHdlIG9ubHkgc2VlayB3aGVuIGxvb3BpbmcsIGFuZCBvbmx5IHB1c2ggaW4gdGhlCisJICBtb3ZpZSBzdGF0ZS4KKworMjAwOC0xMS0xMSAxOTo1MjowNSArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIGdzdC9xdGRlbXV4LzogQWRkIGNvdmVyIGFuZCBhbHRlcm5hdGl2ZSBjb3B5cmlnaHQgdGFnLCBhbmQgZW5oYW5jZSBzb21lIGV4aXN0aW5nIG9uZXMgYnkgbWFya2luZyB0aGVtIGFzIGNvbnRhaW5lciBhdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfdGFnX2FkZF90bXBvKSwKKwkgIChxdGRlbXV4X3RhZ19hZGRfY292ciksIChxdGRlbXV4X3BhcnNlX3VkdGEpOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4X2ZvdXJjYy5oOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4X3R5cGVzLmM6CisJICBBZGQgY292ZXIgYW5kIGFsdGVybmF0aXZlIGNvcHlyaWdodCB0YWcsIGFuZCBlbmhhbmNlIHNvbWUgZXhpc3RpbmcKKwkgIG9uZXMgYnkgbWFya2luZyB0aGVtIGFzIGNvbnRhaW5lciBhdG9tcy4KKworMjAwOC0xMS0xMSAxNzozMzowMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6IERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldGNhcHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6IChnc3RfcnRwX2c3MjlfcGF5X3NldF9jYXBzKToKKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldGNhcHMuCisKKzIwMDgtMTEtMTEgMTc6Mjk6MDMgKzAwMDAgIE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkgIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS4qOiBSZXBsYWNlIEc3MjkgcGF5bG9hZGVyIHdpdGggYW4gaW1wcm92ZWQgdmVyc2lvbi4gRml4ZXMgIzUzMjQwOS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9saXZpZXIgQ3JldGUgPHRlc3RlciBhdCB0ZXN0ZXIgZG90IGNhPgorCSAgKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzogKGdzdF9ydHBfZzcyOV9wYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX2c3MjlfcGF5X2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9nNzI5X3BheV9pbml0KSwKKwkgIChnc3RfcnRwX2c3MjlfcGF5X3NldF9jYXBzKSwgKGdzdF9ydHBfZzcyOV9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICAqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5oOgorCSAgUmVwbGFjZSBHNzI5IHBheWxvYWRlciB3aXRoIGFuIGltcHJvdmVkIHZlcnNpb24uIEZpeGVzICM1MzI0MDkuCisKKzIwMDgtMTEtMTEgMTY6MDA6NDggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogT25seSBzZW5kIG9uZSB0cmFuc3BvcnQgYXQgYSB0aW1lIGZvciBpbXByb3ZlZCBjb21wYXRpYmlsaXR5IHdpdGggc29tZSBicm9rZW4gc2VydmVycy4gU2VlICM1My4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2NyZWF0ZV90cmFuc3BvcnRzX3N0cmluZyksCisJICAoZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlKToKKwkgIE9ubHkgc2VuZCBvbmUgdHJhbnNwb3J0IGF0IGEgdGltZSBmb3IgaW1wcm92ZWQgY29tcGF0aWJpbGl0eSB3aXRoIHNvbWUKKwkgIGJyb2tlbiBzZXJ2ZXJzLiBTZWUgIzUzNzgzMi4KKworMjAwOC0xMS0xMSAxNToxNjozMSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBPbmx5IHBhdXNlL3BsYXkgaW4gdGhlIHNlZWsgaGFuZGxlciB3aGVuIHRoZSBzb3VyY2Ugd2FzIHBsYXlpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfZG9fc2VlayksCisJICAoZ3N0X3J0c3BzcmNfcGVyZm9ybV9zZWVrKToKKwkgIE9ubHkgcGF1c2UvcGxheSBpbiB0aGUgc2VlayBoYW5kbGVyIHdoZW4gdGhlIHNvdXJjZSB3YXMgcGxheWluZy4KKwkgIEZpeGVzICM1MjkzNzkuCisKKzIwMDgtMTEtMTEgMTI6MTg6MjMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBGaXggbXV4aW5nIG9mIERpcmFjIHN0cmVhbXMgaWYgdGhlIGlucHV0IGFscmVhZHkgaGFzIHRoZSBmb3JtYXQgd2UgbmVlZCwgaS5lLiBpcyB0aGUgb3V0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9tdXhfaGFuZGxlX2RpcmFjX3BhY2tldCk6CisJICBGaXggbXV4aW5nIG9mIERpcmFjIHN0cmVhbXMgaWYgdGhlIGlucHV0IGFscmVhZHkgaGFzIHRoZSBmb3JtYXQKKwkgIHdlIG5lZWQsIGkuZS4gaXMgdGhlIG91dHB1dCBvZiBtYXRyb3NrYWRlbXV4LgorCisyMDA4LTExLTExIDEwOjA2OjAxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IERvbid0IHNlZ2ZhdWx0IG9uIHN0cmluZyB0eXBlZCB0YWdzIGJlaW5nIE5VTEwuIEZpeGVzICM1NjAxNTUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIERvbid0IHNlZ2ZhdWx0IG9uIHN0cmluZyB0eXBlZCB0YWdzIGJlaW5nIE5VTEwuIEZpeGVzICM1NjAxNTUuCisKKzIwMDgtMTEtMTAgMTY6NDQ6NDUgKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IEZpeCBtYXBwaW5nIEFBQyBwcm9maWxlIHRvIE1hdHJvc2thIGNvZGVjIGlkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGFhY19jb2RlY19kYXRhX3RvX2NvZGVjX2lkKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X2F1ZGlvX3BhZF9zZXRjYXBzKToKKwkgIEZpeCBtYXBwaW5nIEFBQyBwcm9maWxlIHRvIE1hdHJvc2thIGNvZGVjIGlkLgorCisyMDA4LTExLTEwIDE2OjM2OjA5ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBSZWZhY3RvciBzb21lIHJhdyBhdWRpbyBjYXBzIGJ1aWxkaW5nLCBhbmQgaGFuZGxlID4xNi1iaXQgY2FzZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKSwKKwkgIChxdGRlbXV4X3ZpZGVvX2NhcHMpLCAocXRkZW11eF9hdWRpb19jYXBzKToKKwkgIFJlZmFjdG9yIHNvbWUgcmF3IGF1ZGlvIGNhcHMgYnVpbGRpbmcsIGFuZCBoYW5kbGUgPjE2LWJpdCBjYXNlcy4KKwkgIEZpeC9yZXBsYWNlIGJ1aWxkaW5nIGNhcHMgZnJvbSBhIHN0cmluZyBkZXNjcmlwdGlvbi4KKworMjAwOC0xMS0xMCAxMzo1OToyNyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGdzdC86IE1ha2UgYXV0aG9yIG5hbWUgY29uc2lzdGVudCB3aXRoIG90aGVycy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jYmFuZC5jOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYzoKKwkgICogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzoKKwkgIE1ha2UgYXV0aG9yIG5hbWUgY29uc2lzdGVudCB3aXRoIG90aGVycy4KKworMjAwOC0xMS0xMCAxMjoxMzoyMSArMDAwMCAgRXJpYyBaaGFuZyA8Y2hhby56aGFuZ0BhY2Nlc3MtY29tcGFueS5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogUGF1c2UgdGhlIFJUU1Agc3RyZWFtIGJlZm9yZSBkb2luZyBhIG5ldyBwbGF5IHJlcXVlc3QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5OiBFcmljIFpoYW5nIDxjaGFvLnpoYW5nIGF0IGFjY2Vzcy1jb21wYW55IGRvdCBjb20+CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX3BlcmZvcm1fc2VlayksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV91ZHBfc2luayk6CisJICBQYXVzZSB0aGUgUlRTUCBzdHJlYW0gYmVmb3JlIGRvaW5nIGEgbmV3IHBsYXkgcmVxdWVzdC4KKwkgIE1ha2Ugc3VyZSB0aGF0IGFkZGluZyB0aGUgdWRwc2lua3MgZG9lcyBub3QgY2F1c2UgdGhlIHJ0c3BzcmMgdG8gYmVjb21lCisJICBhIHNpbmsuIEZpeGVzICM1NTk1NDcuCisKKzIwMDgtMTEtMDUgMTQ6NDI6MzUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thLzogSW1wbGVtZW50IERpcmFjIG11eGluZyBpbnRvIE1hdHJvc2thIGNvbWZvcm1pbmcgdG8gdGhlIHNwZWMsIGkuZS4gcHV0IGFsbCBEaXJhYyBwYWNrYWdlcyB1cCB0byBhIHBpY3R1Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChnc3RfbWF0cm9za2FfcGFkX2ZyZWUpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfaGFuZGxlX2RpcmFjX3BhY2tldCksCisJICAoZ3N0X21hdHJvc2thX211eF93cml0ZV9kYXRhKToKKwkgIEltcGxlbWVudCBEaXJhYyBtdXhpbmcgaW50byBNYXRyb3NrYSBjb21mb3JtaW5nIHRvIHRoZSBzcGVjLCBpLmUuCisJICBwdXQgYWxsIERpcmFjIHBhY2thZ2VzIHVwIHRvIGEgcGljdHVyZSBpbnRvIGEgTWF0cm9za2EgYmxvY2suCisJICBUT0RPOiBJbXBsZW1lbnQgd3JpdGluZyBvZiB0aGUgUmVmZXJlbmNlQmxvY2sgTWF0cm9za2EgZWxlbWVudHMsCisJICBjdXJyZW50bHkgdGhlIERpcmFjIG11eGluZyBpcyBvbmx5IDEwMCUgY29ycmVjdCBpZiBNYXRyb3NrYSB2ZXJzaW9uIDIKKwkgIGlzIHNlbGVjdGVkIGZvciBtdXhpbmcuCisKKzIwMDgtMTEtMDQgMTI6MzI6NDggKzAwMDAgIEJhc3RpZW4gTm9jZXJhIDxoYWRlc3NAaGFkZXNzLm5ldD4KKworCSAgT3B0aW9uYWxseSB1c2UgbGlidjRsIHRvIGFjY2VzcyB2NGwyIGRldmljZXMuIEZpeGVzIGJ1ZyAjNTQ1MDMzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQmFzdGllbiBOb2NlcmEgPGhhZGVzcyBhdCBoYWRlc3MgZG90IG5ldD4sCisJICBIYW5zIGRlIEdvZWRlIDxqd3JkZWdvZWRlIGF0IGZlZG9yYXByb2plY3QgZG90IG9yZz4KKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfZ2V0X3JlYWQpOgorCSAgKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6IChnc3RfdjRsMl9nZXRfY2FwYWJpbGl0aWVzKSwKKwkgIChnc3RfdjRsMl9maWxsX2xpc3RzKSwgKGdzdF92NGwyX29wZW4pLCAoZ3N0X3Y0bDJfY2xvc2UpLAorCSAgKGdzdF92NGwyX2dldF9ub3JtKSwgKGdzdF92NGwyX3NldF9ub3JtKSwgKGdzdF92NGwyX2dldF9mcmVxdWVuY3kpLAorCSAgKGdzdF92NGwyX3NldF9mcmVxdWVuY3kpLCAoZ3N0X3Y0bDJfc2lnbmFsX3N0cmVuZ3RoKSwKKwkgIChnc3RfdjRsMl9nZXRfYXR0cmlidXRlKSwgKGdzdF92NGwyX3NldF9hdHRyaWJ1dGUpLAorCSAgKGdzdF92NGwyX2dldF9pbnB1dCksIChnc3RfdjRsMl9zZXRfaW5wdXQpOgorCSAgKiBzeXMvdjRsMi92NGwyX2NhbGxzLmg6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyX2J1ZmZlcl9maW5hbGl6ZSksCisJICAoZ3N0X3Y0bDJfYnVmZmVyX25ldyksIChnc3RfdjRsMl9idWZmZXJfcG9vbF9maW5hbGl6ZSksCisJICAoZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfbmV3KSwgKGdzdF92NGwyX2J1ZmZlcl9wb29sX2FjdGl2YXRlKSwKKwkgIChnc3RfdjRsMnNyY19maWxsX2Zvcm1hdF9saXN0KSwKKwkgIChnc3RfdjRsMnNyY19wcm9iZV9jYXBzX2Zvcl9mb3JtYXRfYW5kX3NpemUpLAorCSAgKGdzdF92NGwyc3JjX3Byb2JlX2NhcHNfZm9yX2Zvcm1hdCksIChnc3RfdjRsMnNyY19ncmFiX2ZyYW1lKSwKKwkgIChnc3RfdjRsMnNyY19zZXRfY2FwdHVyZSksIChnc3RfdjRsMnNyY19jYXB0dXJlX2luaXQpLAorCSAgKGdzdF92NGwyc3JjX2NhcHR1cmVfc3RhcnQpLCAoZ3N0X3Y0bDJzcmNfY2FwdHVyZV9zdG9wKSwKKwkgIChnc3RfdjRsMnNyY19nZXRfbmVhcmVzdF9zaXplKToKKwkgIE9wdGlvbmFsbHkgdXNlIGxpYnY0bCB0byBhY2Nlc3MgdjRsMiBkZXZpY2VzLiBGaXhlcyBidWcgIzU0NTAzMy4KKworMjAwOC0xMS0wNCAxMjoyODozNCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBEb24ndCBpbnN0YWxsIHN0YXRpYyBsaWJzIGZvciBwbHVnaW5zLiBGaXhlcyAjNTUwODUxIGZvciAtZ29vZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYWFsaWIvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hbm5vZGV4L01ha2VmaWxlLmFtOgorCSAgKiBleHQvY2Fpcm8vTWFrZWZpbGUuYW06CisJICAqIGV4dC9kdi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2VzZC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2ZsYWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9nY29uZi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2dka19waXhidWYvTWFrZWZpbGUuYW06CisJICAqIGV4dC9oYWwvTWFrZWZpbGUuYW06CisJICAqIGV4dC9qcGVnL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbGFkc3BhL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbGliY2FjYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xpYm1uZy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xpYnBuZy9NYWtlZmlsZS5hbToKKwkgICogZXh0L21pa21vZC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3B1bHNlL01ha2VmaWxlLmFtOgorCSAgKiBleHQvcmF3MTM5NC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3Nob3V0Mi9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NvdXAvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zcGVleC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3RhZ2xpYi9NYWtlZmlsZS5hbToKKwkgICogZXh0L3dhdnBhY2svTWFrZWZpbGUuYW06CisJICAqIGdzdC9hbHBoYS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2FwZXRhZy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdXBhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXV0b2RldGVjdC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F2aS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2N1dHRlci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RlYnVnL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZWZmZWN0di9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2VxdWFsaXplci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ZseC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2dvb20vTWFrZWZpbGUuYW06CisJICAqIGdzdC9nb29tMmsxL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvaWN5ZGVtdXgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9pZDNkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ludGVybGVhdmUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9sYXcvTWFrZWZpbGUuYW06CisJICAqIGdzdC9sZXZlbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbWVkaWFuL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbW9ub3Njb3BlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXVsdGlmaWxlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXVsdGlwYXJ0L01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvb2xkY29yZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3F0ZGVtdXgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9yZXBsYXlnYWluL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRzcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NtcHRlL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3BlY3RydW0vTWFrZWZpbGUuYW06CisJICAqIGdzdC91ZHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC92aWRlb2JveC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3ZpZGVvY3JvcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9taXhlci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3dhdmVuYy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3dhdnBhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9NYWtlZmlsZS5hbToKKwkgICogc3lzL2RpcmVjdHNvdW5kL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3NzL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3N4YXVkaW8vTWFrZWZpbGUuYW06CisJICAqIHN5cy9vc3h2aWRlby9NYWtlZmlsZS5hbToKKwkgICogc3lzL3N1bmF1ZGlvL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkgICogc3lzL3dhdmVmb3JtL01ha2VmaWxlLmFtOgorCSAgKiBzeXMveGltYWdlL01ha2VmaWxlLmFtOgorCSAgRG9uJ3QgaW5zdGFsbCBzdGF0aWMgbGlicyBmb3IgcGx1Z2lucy4gRml4ZXMgIzU1MDg1MSBmb3IgLWdvb2QuCisKKzIwMDgtMTAtMzEgMTg6MTc6NTAgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L2ZsYWMvTWFrZWZpbGUuYW06IEluY2x1ZGUgJChGTEFDX0NGTEFHUykgaW4gQ0ZMQUdTIHRvIG1ha2Ugc3VyZSB0byBmaW5kIHRoZSBGTEFDIGhlYWRlcnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvTWFrZWZpbGUuYW06CisJICBJbmNsdWRlICQoRkxBQ19DRkxBR1MpIGluIENGTEFHUyB0byBtYWtlIHN1cmUgdG8gZmluZCB0aGUgRkxBQyBoZWFkZXJzLgorCSAgVGhpcyBmaXhlcyBjb21waWxhdGlvbiBpZiBGTEFDIGlzIGluc3RhbGxlZCBpbiBhbiB1bmNvbW1vbiBsb2NhdGlvbgorCSAgdGhhdCBpcyBub3QgYWxyZWFkeSBoYW5kbGVkIGJ5IG90aGVyIENGTEFHUy4gRml4ZXMgYnVnICM1NTg3MTEuCisKKzIwMDgtMTAtMzEgMTA6MDg6NTAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogR3VhcmQgbW9yZSB1bmNvbW1vbiBmb3JtYXRzIHdpdGggaWZkZWZzIHNvIHRoYXQgd2UgY2FuIGNvbXBpbGUgb24gb2xkZXIgdmVyc2lvbnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfZm9ybWF0X2dldF9yYW5rKToKKwkgIEd1YXJkIG1vcmUgdW5jb21tb24gZm9ybWF0cyB3aXRoIGlmZGVmcyBzbyB0aGF0IHdlIGNhbiBjb21waWxlIG9uIG9sZGVyCisJICB2ZXJzaW9ucy4KKworMjAwOC0xMC0zMSAxMDowMDoxOCArMDAwMCAgTmljayBIYWRkYWQgPG5pY2tAaGFkZGFkcy5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogSW52ZXJ0IG90aGVyIHVuY29tcHJlc3NlZCBSR0IgZm9ybWF0cy4gRml4ZXMgIzU1ODU1NC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE5pY2sgSGFkZGFkIDxuaWNrIGF0IGhhZGRhZHMgZG90IG5ldD4KKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9pc191bmNvbXByZXNzZWQpLAorCSAgKGdzdF9hdmlfZGVtdXhfaW52ZXJ0KSwgKGdzdF9hdmlfZGVtdXhfcHJvY2Vzc19uZXh0X2VudHJ5KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9kYXRhKToKKwkgIEludmVydCBvdGhlciB1bmNvbXByZXNzZWQgUkdCIGZvcm1hdHMuIEZpeGVzICM1NTg1NTQuCisKKzIwMDgtMTAtMzAgMTU6MDg6NDkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L3dhdmVuYy9nc3R3YXZlbmMuKjogQWRkIHN1cHBvcnQgZm9yIGZsb2F0L2RvdWJsZSBhcyBpbnB1dCBhbmQgcmVtb3ZlIHRoZSAobm93YWRheXMpIHVzZWxlc3MgcGFyc2luZyBvZiB0aGUgZGVwdGggLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzogKGdzdF93YXZlbmNfY3JlYXRlX2hlYWRlcl9idWYpLAorCSAgKGdzdF93YXZlbmNfc2lua19zZXRjYXBzKSwgKGdzdF93YXZlbmNfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuaDoKKwkgIEFkZCBzdXBwb3J0IGZvciBmbG9hdC9kb3VibGUgYXMgaW5wdXQgYW5kIHJlbW92ZSB0aGUgKG5vd2FkYXlzKQorCSAgdXNlbGVzcyBwYXJzaW5nIG9mIHRoZSBkZXB0aCBhcyB3ZSByZXF1aXJlIHdpZHRoPT1kZXB0aC4KKworMjAwOC0xMC0zMCAxMDozMTozNSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IE5hcnJvdyBkb3duIHRoZSBjYXBzIG9mIHRoZSBtcGVnIGF1ZGlvIHBheS9kZXBheWxvYWRlcnMgdG8gb25seSBhY2NlcHQgbXBlZyB2ZXJzaW9uIDEuIEZpeGVzICM1NTg0MjcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOiAoZ3N0X3J0cF9tcGFfZGVwYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJICBOYXJyb3cgZG93biB0aGUgY2FwcyBvZiB0aGUgbXBlZyBhdWRpbyBwYXkvZGVwYXlsb2FkZXJzIHRvIG9ubHkgYWNjZXB0CisJICBtcGVnIHZlcnNpb24gMS4gRml4ZXMgIzU1ODQyNy4KKworMjAwOC0xMC0yOSAxODoyODoyNSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzogT25seSBwdXQgYW4gaW50ZWdyYWwgYW1vdW50IG9mIHNhbXBsZXMgaW4gdGhlIFJUUCBwYWNrZXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzogKGdzdF9ydHBfTDE2X3BheV9mbHVzaCksCisJICAoZ3N0X3J0cF9MMTZfcGF5X2dldGNhcHMpOgorCSAgT25seSBwdXQgYW4gaW50ZWdyYWwgYW1vdW50IG9mIHNhbXBsZXMgaW4gdGhlIFJUUCBwYWNrZXQuCisJICBGaXhlcyAjNTU2NjQxLgorCisyMDA4LTEwLTI4IDE3OjQyOjAyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGNoYW5uZWxzLio6IEFkZCBtZXRob2QgdG8gZ2V0IHBvc3NpYmxlIGNoYW5uZWwgcG9zaXRpb25zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwY2hhbm5lbHMuYzogKGdzdF9ydHBfY2hhbm5lbHNfZ2V0X2J5X2luZGV4KToKKwkgICogZ3N0L3J0cC9nc3RydHBjaGFubmVscy5oOgorCSAgQWRkIG1ldGhvZCB0byBnZXQgcG9zc2libGUgY2hhbm5lbCBwb3NpdGlvbnMuCisKKzIwMDgtMTAtMjggMTc6Mzk6NDggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvTWFrZWZpbGUuYW06IEFsc28gY29tbWl0IHVwZGF0ZWQgbWFrZWZpbGUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgQWxzbyBjb21taXQgdXBkYXRlZCBtYWtlZmlsZQorCisyMDA4LTEwLTI4IDE0OjU2OjA4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IERvbid0IGFsbG93IHdpZHRoPTMyLGRlcHRoPTI0IGFzIGlucHV0LiBXQVYgcmVxdWlyZXMgdGhhdCB0aGUgd2lkdGggaXMgdGhlIG5leHQgaW50ZWdlciBtdWx0aS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChnc3Rfd2F2ZW5jX2NoYWluKToKKwkgIERvbid0IGFsbG93IHdpZHRoPTMyLGRlcHRoPTI0IGFzIGlucHV0LiBXQVYgcmVxdWlyZXMgdGhhdCB0aGUgd2lkdGgKKwkgIGlzIHRoZSBuZXh0IGludGVnZXIgbXVsdGlwbHkgb2YgOCBmcm9tIHRoZSBkZXB0aC4KKworMjAwOC0xMC0yOCAxMDowMTo0OSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IEFkZCBtYXBwaW5ncyBmb3IgbXVsdGljaGFubmVsIHN1cHBvcnQuIERvZXMgbm90IGNvbXBsZXRlbHkganVzdCB3b3JrIGJlY2F1c2UgdGhlIGdldGNhcHMgZnVuY3Rpb24gZG9lcyBub3QgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOiAoZ3N0X3J0cF9MMTZfZGVwYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6IChnc3RfcnRwX0wxNl9wYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9MMTZfcGF5X2dldGNhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGNoYW5uZWxzLmM6IChjaGVja19jaGFubmVscyksCisJICAoZ3N0X3J0cF9jaGFubmVsc19nZXRfYnlfcG9zKSwgKGdzdF9ydHBfY2hhbm5lbHNfZ2V0X2J5X29yZGVyKSwKKwkgIChnc3RfcnRwX2NoYW5uZWxzX2NyZWF0ZV9kZWZhdWx0KToKKwkgICogZ3N0L3J0cC9nc3RydHBjaGFubmVscy5oOgorCSAgQWRkIG1hcHBpbmdzIGZvciBtdWx0aWNoYW5uZWwgc3VwcG9ydC4gRG9lcyBub3QgY29tcGxldGVseSBqdXN0IHdvcmsKKwkgIGJlY2F1c2UgdGhlIGdldGNhcHMgZnVuY3Rpb24gZG9lcyBub3QgeWV0IHJldHVybiB0aGUgYWxsb3dlZCBjaGFubmVsCisJICBtYXBwaW5ncy4gU2VlICM1NTY2NDEuCisKKzIwMDgtMTAtMjggMDY6NTA6NTcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2dvb20vOiBBZGQgbGljZW5zZSBoZWFkZXJzIGluIGFsbCBzb3VyY2UgZmlsZXMuIFJlbW92ZSBmaWx0ZXIuYyBmcm9tCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vTWFrZWZpbGUuYW06CisJICAqIGdzdC9nb29tL1JFQURNRToKKwkgICogZ3N0L2dvb20vY29uZmlnX3BhcmFtLmM6CisJICAqIGdzdC9nb29tL2NvbnZvbHZlX2Z4LmM6CisJICAqIGdzdC9nb29tL2RyYXdtZXRob2RzLmM6CisJICAqIGdzdC9nb29tL2RyYXdtZXRob2RzLmg6CisJICAqIGdzdC9nb29tL2ZpbHRlcnMuYzoKKwkgICogZ3N0L2dvb20vZmlsdGVyc19tbXguczoKKwkgICogZ3N0L2dvb20vZmx5aW5nX3N0YXJzX2Z4LmM6CisJICAqIGdzdC9nb29tL2dvb20uaDoKKwkgICogZ3N0L2dvb20vZ29vbV9jb25maWcuaDoKKwkgICogZ3N0L2dvb20vZ29vbV9jb25maWdfcGFyYW0uaDoKKwkgICogZ3N0L2dvb20vZ29vbV9jb3JlLmM6CisJICAqIGdzdC9nb29tL2dvb21fZmlsdGVycy5oOgorCSAgKiBnc3QvZ29vbS9nb29tX2Z4Lmg6CisJICAqIGdzdC9nb29tL2dvb21fZ3JhcGhpYy5oOgorCSAgKiBnc3QvZ29vbS9nb29tX3BsdWdpbl9pbmZvLmg6CisJICAqIGdzdC9nb29tL2dvb21fdG9vbHMuYzoKKwkgICogZ3N0L2dvb20vZ29vbV90b29scy5oOgorCSAgKiBnc3QvZ29vbS9nb29tX3R5cGVkZWZzLmg6CisJICAqIGdzdC9nb29tL2dvb21fdmlzdWFsX2Z4Lmg6CisJICAqIGdzdC9nb29tL2dyYXBoaWMuYzoKKwkgICogZ3N0L2dvb20vaWZzLmM6CisJICAqIGdzdC9nb29tL2lmcy5oOgorCSAgKiBnc3QvZ29vbS9saW5lcy5jOgorCSAgKiBnc3QvZ29vbS9saW5lcy5oOgorCSAgKiBnc3QvZ29vbS9tYXRodG9vbHMuYzoKKwkgICogZ3N0L2dvb20vbWF0aHRvb2xzLmg6CisJICAqIGdzdC9nb29tL21teC5jOgorCSAgKiBnc3QvZ29vbS9tb3RpZl9nb29tMS5oOgorCSAgKiBnc3QvZ29vbS9tb3RpZl9nb29tMi5oOgorCSAgKiBnc3QvZ29vbS9wbHVnaW5faW5mby5jOgorCSAgKiBnc3QvZ29vbS9wcGNfZHJhd2luZ3MuaDoKKwkgICogZ3N0L2dvb20vcHBjX3pvb21fdWx0aW1hdGUuaDoKKwkgICogZ3N0L2dvb20vc291bmRfdGVzdGVyLmM6CisJICAqIGdzdC9nb29tL3NvdW5kX3Rlc3Rlci5oOgorCSAgKiBnc3QvZ29vbS9zdXJmM2QuYzoKKwkgICogZ3N0L2dvb20vc3VyZjNkLmg6CisJICAqIGdzdC9nb29tL3RlbnRhY2xlM2QuYzoKKwkgICogZ3N0L2dvb20vdGVudGFjbGUzZC5oOgorCSAgKiBnc3QvZ29vbS92M2QuYzoKKwkgICogZ3N0L2dvb20vdjNkLmg6CisJICAqIGdzdC9nb29tL3htbXguYzoKKwkgIEFkZCBsaWNlbnNlIGhlYWRlcnMgaW4gYWxsIHNvdXJjZSBmaWxlcy4gUmVtb3ZlIGZpbHRlci5jIGZyb20KKwkgIEVYVFJBX0RJU1QsIGFzIGl0cyBpbiBTT1VSQ0VTIGFscmVhZHkuIE1lbnRpb24gdGhlIGZpbGVzIGluIHRoZSBSRURNRQorCSAgd2hpY2ggYXJlIG5vdCB1c2VkIHJpZ2h0IG5vdy4gRml4ZXMgIzU1NzcwOS4KKworMjAwOC0xMC0yNyAxMToyODozMCArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzogSW1wbGVtZW50IGdldGNhcHMgaW4gcnRwTDE2cGF5LiBGaXhlcyAjNTU2NDg0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyIGF0IHRlc3RlciBkb3QgY2E+CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6IChnc3RfcnRwX0wxNl9wYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9MMTZfcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9MMTZfcGF5X2dldGNhcHMpOgorCSAgSW1wbGVtZW50IGdldGNhcHMgaW4gcnRwTDE2cGF5LiBGaXhlcyAjNTU2NDg0LgorCisyMDA4LTEwLTI3IDExOjAzOjUzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5LmM6IENoZWNrIGlmIGNsb2NrLXJhdGUgYW5kIGNoYW5uZWxzIGFyZSB2YWxpZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5LmM6IChnc3RfcnRwX0wxNl9kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX0wxNl9kZXBheV9wcm9jZXNzKToKKwkgIENoZWNrIGlmIGNsb2NrLXJhdGUgYW5kIGNoYW5uZWxzIGFyZSB2YWxpZC4KKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldGNhcHMuCisJICBObyBuZWVkIHRvIHZhbGlkYXRlIHRoZSBidWZmZXIsIHRoZSBiYXNlIGNsYXNzIGRvZXMgdGhhdCBmb3IgdXMuCisJICBVc2UgdGhlIG1hcmtlciBiaXQgdG8gc2V0IHRoZSBESVNDT05UIGZsYWcgb24gb3V0Z29pbmcgYnVmZmVycy4KKwkgICogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzogKGdzdF9ydHBfTDE2X3BheV9zZXRjYXBzKToKKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldF9vdXRjYXBzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmM6IChnc3RfcnRwX2FjM19kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX2FjM19kZXBheV9wcm9jZXNzKToKKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldF9jYXBzLgorCSAgTm8gbmVlZCB0byB2YWxpZGF0ZSB0aGUgYnVmZmVyLCB0aGUgYmFzZSBjbGFzcyBkb2VzIHRoYXQgZm9yIHVzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6IChnc3RfcnRwX2Ftcl9kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX2Ftcl9kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5oOgorCSAgRG9uJ3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2Ygc2V0Y2Fwcy4KKwkgIE5vIG5lZWQgdG8gdmFsaWRhdGUgdGhlIGJ1ZmZlciwgdGhlIGJhc2UgY2xhc3MgZG9lcyB0aGF0IGZvciB1cy4KKwkgIE5vIG5lZWQgdG8gc2V0IG91dHB1dCBjYXBzIG9uIHRoZSBidWZmZXJzLCB0aGUgYmFzZSBjbGFzcyBkb2VzIHRoYXQgZm9yCisJICB1cy4KKwkgIFRoZSBzdWJjbGFzcyB3aWxsIG1ha2Ugc3VyZSB3ZSBhcmUgbmVnb3RpYXRlZC4KKwkgICogZ3N0L3J0cC9nc3RydHBkdmRlcGF5LmM6IChnc3RfcnRwX2R2X2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfZHZfZGVwYXlfcHJvY2VzcyksIChnc3RfcnRwX2R2X2RlcGF5X3Jlc2V0KToKKwkgICogZ3N0L3J0cC9nc3RydHBkdmRlcGF5Lmg6CisJICBDbGVhbiB1cCBjYXBzIG5lZ290aWF0aW9uLgorCSAgVGhlIHN1YmNsYXNzIHdpbGwgbWFrZSBzdXJlIHdlIGFyZSBuZWdvdGlhdGVkLgorCSAgKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOiAoZ3N0X3J0cF9nNzI2X2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfZzcyNl9kZXBheV9wcm9jZXNzKToKKwkgIENsZWFuIHVwIGNhcHMgbmVnb3RpYXRpb24uCisJICBVc2UgdGhlIG1hcmtlciBiaXQgdG8gc2V0IHRoZSBESVNDT05UIGZsYWcgb24gb3V0Z29pbmcgYnVmZmVycy4KKwkgICogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuYzogKGdzdF9ydHBfZzcyOV9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX2c3MjlfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX2c3MjlfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5Lmg6CisJICBUaGUgc3ViY2xhc3Mgd2lsbCBtYWtlIHN1cmUgd2UgYXJlIG5lZ290aWF0ZWQuCisJICBVc2UgdGhlIG1hcmtlciBiaXQgdG8gc2V0IHRoZSBESVNDT05UIGZsYWcgb24gb3V0Z29pbmcgYnVmZmVycy4KKwkgICogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOiAoZ3N0X3J0cF9nc21fZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9nc21fZGVwYXlfcHJvY2Vzcyk6CisJICBDbGVhbiB1cCBjYXBzIG5lZ290aWF0aW9uLgorCSAgVXNlIHRoZSBtYXJrZXIgYml0IHRvIHNldCB0aGUgRElTQ09OVCBmbGFnIG9uIG91dGdvaW5nIGJ1ZmZlcnMuCisJICAqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6IChnc3RfcnRwX2dzbV9wYXlfc2V0Y2Fwcyk6CisJICBDbGVhbiB1cCBjYXBzIG5lZ290aWF0aW9uLgorCSAgRG9uJ3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2Ygc2V0X291dGNhcHMuCisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6IChnc3RfcnRwX2gyNjNfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9oMjYzX2RlcGF5X3Byb2Nlc3MpOgorCSAgQ2xlYW4gdXAgY2FwcyBuZWdvdGlhdGlvbi4KKwkgIE5vIG5lZWQgdG8gdmFsaWRhdGUgdGhlIGJ1ZmZlciwgdGhlIGJhc2UgY2xhc3MgZG9lcyB0aGF0IGZvciB1cy4KKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6IChnc3RfcnRwX2gyNjNfcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfaDI2M19wYXlfZmx1c2gpLCAoZ3N0X3J0cF9oMjYzX3BheV9oYW5kbGVfYnVmZmVyKToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGF5Lmg6CisJICBEb24ndCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBzZXRfb3V0Y2Fwcy4KKwkgIERvIHNvbWUgbW9yZSB0aW1lc3RhbXBzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzogKGdzdF9ydHBfaDI2M3BfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9oMjYzcF9kZXBheV9wcm9jZXNzKToKKwkgIENsZWFuIHVwIGNhcHMgbmVnb3RpYXRpb24uCisJICBEb24ndCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBzZXRjYXBzLgorCSAgTm8gbmVlZCB0byB2YWxpZGF0ZSB0aGUgYnVmZmVyLCB0aGUgYmFzZSBjbGFzcyBkb2VzIHRoYXQgZm9yIHVzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6IChnc3RfcnRwX2gyNjNwX3BheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX2gyNjNwX3BheV9zZXRjYXBzKSwgKGdzdF9ydHBfaDI2M3BfcGF5X2ZsdXNoKSwKKwkgIChnc3RfcnRwX2gyNjNwX3BheV9oYW5kbGVfYnVmZmVyKToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5oOgorCSAgRG9uJ3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2Ygc2V0X291dGNhcHMuCisJICBEbyBzb21lIG1vcmUgdGltZXN0YW1wcy4KKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzogKGdzdF9ydHBfaDI2NF9kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX2gyNjRfZGVwYXlfcHJvY2Vzcyk6CisJICBDbGVhbiB1cCBjYXBzIG5lZ290aWF0aW9uLgorCSAgRG9uJ3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2Ygc2V0Y2Fwcy4KKwkgIEZpeCBwb3NzaWJsZSBjYXBzIGxlYWsuCisJICBObyBuZWVkIHRvIHZhbGlkYXRlIHRoZSBidWZmZXIsIHRoZSBiYXNlIGNsYXNzIGRvZXMgdGhhdCBmb3IgdXMuCisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOiAoZ3N0X3J0cF9oMjY0X3BheV9zZXRjYXBzKToKKwkgIEFkZCBzb21lIG1vcmUgZGVidWcgaW5mby4KKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzogKGdzdF9ydHBfaWxiY19kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX2lsYmNfZGVwYXlfcHJvY2Vzcyk6CisJICBDbGVhbiB1cCBjYXBzIG5lZ290aWF0aW9uLgorCSAgVXNlIHRoZSBtYXJrZXIgYml0IHRvIHNldCB0aGUgRElTQ09OVCBmbGFnIG9uIG91dGdvaW5nIGJ1ZmZlcnMuCisJICAqIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5jOiAoZ3N0X3J0cGlsYmNwYXlfc2lua19zZXRjYXBzKToKKwkgIENsZWFuIHVwIGNhcHMgbmVnb3RpYXRpb24uCisJICAqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmM6IChnc3RfcnRwX21wMXNfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9tcDFzX2RlcGF5X3Byb2Nlc3MpOgorCSAgQ2xlYW4gdXAgY2FwcyBuZWdvdGlhdGlvbi4KKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldGNhcHMuCisJICBObyBuZWVkIHRvIHZhbGlkYXRlIHRoZSBidWZmZXIsIHRoZSBiYXNlIGNsYXNzIGRvZXMgdGhhdCBmb3IgdXMuCisJICBObyBuZWVkIHRvIHNldCBjYXBzIG9uIGJ1ZmZlcnMsIHN1YmNsYXNzIGRvZXMgdGhhdCBmb3IgdXMuCisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6IChnc3RfcnRwX21wMnRfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9tcDJ0X2RlcGF5X3Byb2Nlc3MpOgorCSAgQ2xlYW4gdXAgY2FwcyBuZWdvdGlhdGlvbi4KKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldGNhcHMuCisJICBObyBuZWVkIHRvIHZhbGlkYXRlIHRoZSBidWZmZXIsIHRoZSBiYXNlIGNsYXNzIGRvZXMgdGhhdCBmb3IgdXMuCisJICBObyBuZWVkIHRvIHNldCBjYXBzIG9uIGJ1ZmZlcnMsIHN1YmNsYXNzIGRvZXMgdGhhdCBmb3IgdXMuCisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6IChnc3RfcnRwX21wNGFfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9tcDRhX2RlcGF5X3Byb2Nlc3MpOgorCSAgQ2xlYW4gdXAgY2FwcyBuZWdvdGlhdGlvbi4KKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldGNhcHMuCisJICBObyBuZWVkIHRvIHZhbGlkYXRlIHRoZSBidWZmZXIsIHRoZSBiYXNlIGNsYXNzIGRvZXMgdGhhdCBmb3IgdXMuCisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5jOiAoZ3N0X3J0cF9tcDRhX3BheV9uZXdfY2FwcyksCisJICAoZ3N0X3J0cF9tcDRhX3BheV9zZXRjYXBzKToKKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldF9vdXRjYXBzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOiAoZ3N0X3J0cF9tcDRnX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfbXA0Z19kZXBheV9wcm9jZXNzKToKKwkgIENsZWFuIHVwIGNhcHMgbmVnb3RpYXRpb24uCisJICBEb24ndCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBzZXRjYXBzLgorCSAgTm8gbmVlZCB0byB2YWxpZGF0ZSB0aGUgYnVmZmVyLCB0aGUgYmFzZSBjbGFzcyBkb2VzIHRoYXQgZm9yIHVzLgorCSAgTm8gbmVlZCB0byBzZXQgY2FwcyBvbiBidWZmZXJzLCBzdWJjbGFzcyBkb2VzIHRoYXQgZm9yIHVzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzogKGdzdF9ydHBfbXA0Z19wYXlfZmluYWxpemUpLAorCSAgKGdzdF9ydHBfbXA0Z19wYXlfbmV3X2NhcHMpLCAoZ3N0X3J0cF9tcDRnX3BheV9zZXRjYXBzKToKKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldF9vdXRjYXBzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOiAoZ3N0X3J0cF9tcDR2X2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfbXA0dl9kZXBheV9wcm9jZXNzKToKKwkgIENsZWFuIHVwIGNhcHMgbmVnb3RpYXRpb24uCisJICBEb24ndCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBzZXRjYXBzLgorCSAgTm8gbmVlZCB0byB2YWxpZGF0ZSB0aGUgYnVmZmVyLCB0aGUgYmFzZSBjbGFzcyBkb2VzIHRoYXQgZm9yIHVzLgorCSAgTm8gbmVlZCB0byBzZXQgY2FwcyBvbiBidWZmZXJzLCBzdWJjbGFzcyBkb2VzIHRoYXQgZm9yIHVzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzogKGdzdF9ydHBfbXA0dl9wYXlfbmV3X2NhcHMpLAorCSAgKGdzdF9ydHBfbXA0dl9wYXlfc2V0Y2Fwcyk6CisJICBEb24ndCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBzZXRfb3V0Y2Fwcy4KKwkgICogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOiAoZ3N0X3J0cF9tcGFfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9tcGFfZGVwYXlfcHJvY2Vzcyk6CisJICBDbGVhbiB1cCBjYXBzIG5lZ290aWF0aW9uLgorCSAgRG9uJ3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2Ygc2V0Y2Fwcy4KKwkgIE5vIG5lZWQgdG8gdmFsaWRhdGUgdGhlIGJ1ZmZlciwgdGhlIGJhc2UgY2xhc3MgZG9lcyB0aGF0IGZvciB1cy4KKwkgIFVzZSB0aGUgbWFya2VyIGJpdCB0byBzZXQgdGhlIERJU0NPTlQgZmxhZyBvbiBvdXRnb2luZyBidWZmZXJzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOiAoZ3N0X3J0cF9tcGFfcGF5X3NldGNhcHMpOgorCSAgRG9uJ3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2Ygc2V0X291dGNhcHMuCisJICAqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzogKGdzdF9ydHBfbXB2X2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfbXB2X2RlcGF5X3Byb2Nlc3MpOgorCSAgQ2xlYW4gdXAgY2FwcyBuZWdvdGlhdGlvbi4KKwkgIEFjdHVhbGx5IHNldCBvdXRwdXQgY2Fwcy4KKwkgIE5vIG5lZWQgdG8gdmFsaWRhdGUgdGhlIGJ1ZmZlciwgdGhlIGJhc2UgY2xhc3MgZG9lcyB0aGF0IGZvciB1cy4KKwkgICogZ3N0L3J0cC9nc3RydHBtcHZwYXkuYzogKGdzdF9ydHBfbXB2X3BheV9zZXRjYXBzKToKKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldF9vdXRjYXBzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5jOiAoZ3N0X3J0cF9wY21hX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfcGNtYV9kZXBheV9wcm9jZXNzKToKKwkgIENsZWFuIHVwIGNhcHMgbmVnb3RpYXRpb24uCisJICBTZXQgb3V0cHV0IGJ1ZmZlciBkdXJhdGlvbiBiZWNhdXNlIHdlIGNhbi4KKwkgIFVzZSB0aGUgbWFya2VyIGJpdCB0byBzZXQgdGhlIERJU0NPTlQgZmxhZyBvbiBvdXRnb2luZyBidWZmZXJzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYzogKGdzdF9ydHBfcGNtYV9wYXlfc2V0Y2Fwcyk6CisJICBEb24ndCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBzZXRfb3V0Y2Fwcy4KKwkgICogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzogKGdzdF9ydHBfcGNtdV9kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX3BjbXVfZGVwYXlfcHJvY2Vzcyk6CisJICBDbGVhbiB1cCBjYXBzIG5lZ290aWF0aW9uLgorCSAgVXNlIHRoZSBtYXJrZXIgYml0IHRvIHNldCB0aGUgRElTQ09OVCBmbGFnIG9uIG91dGdvaW5nIGJ1ZmZlcnMuCisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOiAoZ3N0X3J0cF9wY211X3BheV9zZXRjYXBzKToKKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldF9vdXRjYXBzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzogKGdzdF9ydHBfc3BlZXhfZGVwYXlfaW5pdCksCisJICAoZ3N0X3J0cF9zcGVleF9kZXBheV9zZXRjYXBzKSwgKGdzdF9ydHBfc3BlZXhfZGVwYXlfcHJvY2Vzcyk6CisJICBDbGVhbiB1cCBjYXBzIG5lZ290aWF0aW9uLgorCSAgU2V0IG91dHB1dCBjYXBzIG9uIHRoZSBwYWQgYW5kIGhlYWRlciBidWZmZXJzLgorCSAgU2V0IGR1cmF0aW9uIG9uIG91dHB1dCBidWZmZXJzIGJlY2F1c2Ugd2UgY2FuLgorCSAgKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmM6IChnc3RfcnRwX3NwZWV4X3BheV9wYXJzZV9pZGVudCk6CisJICBEb24ndCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBzZXRfb3V0Y2Fwcy4KKwkgICogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzogKGdzdF9ydHBfc3Yzdl9kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX3N2M3ZfZGVwYXlfcHJvY2Vzcyk6CisJICBDbGVhbiB1cCBjYXBzIG5lZ290aWF0aW9uLgorCSAgTm8gbmVlZCB0byB2YWxpZGF0ZSB0aGUgYnVmZmVyLCB0aGUgYmFzZSBjbGFzcyBkb2VzIHRoYXQgZm9yIHVzLgorCSAgTm8gbmVlZCB0byBzZXQgY2FwcyBvdXQgb3V0cHV0IGJ1ZmZlcnMsIHN1YmNsYXNzIGRvZXMgdGhhdC4KKwkgICogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOiAoZ3N0X3J0cF90aGVvcmFfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF90aGVvcmFfZGVwYXlfcHJvY2Vzcyk6CisJICBEb24ndCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBzZXRjYXBzLgorCSAgTm8gbmVlZCB0byB2YWxpZGF0ZSB0aGUgYnVmZmVyLCB0aGUgYmFzZSBjbGFzcyBkb2VzIHRoYXQgZm9yIHVzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOiAoZ3N0X3J0cF90aGVvcmFfcGF5X2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfdGhlb3JhX3BheV9mbHVzaF9wYWNrZXQpLCAoZW5jb2RlX2Jhc2U2NCksCisJICAoZ3N0X3J0cF90aGVvcmFfcGF5X2ZpbmlzaF9oZWFkZXJzKSwgKGdzdF9ydHBfdGhlb3JhX3BheV9wYXJzZV9pZCksCisJICAoZ3N0X3J0cF90aGVvcmFfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgRG9uJ3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2Ygc2V0X291dGNhcHMuCisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzogKGdzdF9ydHBfdm9yYmlzX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfdm9yYmlzX2RlcGF5X3Byb2Nlc3MpOgorCSAgRG9uJ3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2Ygc2V0Y2Fwcy4KKwkgIE5vIG5lZWQgdG8gdmFsaWRhdGUgdGhlIGJ1ZmZlciwgdGhlIGJhc2UgY2xhc3MgZG9lcyB0aGF0IGZvciB1cy4KKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzogKGdzdF9ydHBfdm9yYmlzX3BheV9maW5pc2hfaGVhZGVycyk6CisJICBEb24ndCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBzZXRfb3V0Y2Fwcy4KKwkgICogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzogKGdzdF9ydHBfdnJhd19kZXBheV9zZXRjYXBzKToKKwkgIENsZWFuIHVwIGNhcHMgbmVnb3RpYXRpb24sIGRvbid0IGlnbm9yZSBzZXRjYXBzIHJldHVybi4KKwkgICogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6IChnc3RfcnRwX3ZyYXdfcGF5X3NldGNhcHMpOgorCSAgRG9uJ3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2Ygc2V0X291dGNhcHMuCisKKzIwMDgtMTAtMjcgMTA6MzU6MDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiBGb3J3YXJkIHVua25vd24gZXZlbnRzIHVwc3RyZWFtLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc3JjX2V2ZW50KToKKwkgIEZvcndhcmQgdW5rbm93biBldmVudHMgdXBzdHJlYW0uCisKKzIwMDgtMTAtMjcgMTA6MzM6MjAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ljeWRlbXV4LmM6IEFkZCBzb21lIHJlZmNvdW50IGNoZWNrCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvaWN5ZGVtdXguYzogKGljeWRlbXV4X2ZvdW5kX3BhZCk6CisJICBBZGQgc29tZSByZWZjb3VudCBjaGVjaworCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOiAocnRwX3BpcGVsaW5lX3J1bik6CisJICBEb24ndCBpZ25vcmUgdGhlIHJlc3VsdCBvZiB3cml0ZSgpLCBmaXhlcyBhICBjb21waWxlciB3YXJuaW5nIGZvciBtZS4KKwkgICogdGVzdHMvaWNsZXMvdmlkZW9ib3gtdGVzdC5jOiAobWFpbik6CisJICBNYWtlIHRoZSBvdXRwdXQgYSBsaXR0bGUgbW9yZSBwcmV0dHkuCisKKzIwMDgtMTAtMjcgMDk6MjY6MTkgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZXh0L2VzZC9lc2Rtb24uYzogQWRkIGRvYyBibG9iLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkbW9uLmM6CisJICBBZGQgZG9jIGJsb2IuCisKKzIwMDgtMTAtMjcgMDk6MjE6NDQgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogQWRkIHRoZSBkb2NzIG9mIHRoZSBuZXcgZWxlbWVudHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSAgQWRkIHRoZSBkb2NzIG9mIHRoZSBuZXcgZWxlbWVudHMuCisKKzIwMDgtMTAtMjcgMDk6MDQ6MzcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2F1dG9kZXRlY3QvOiBGaXggIlNpbmNlIiB0YWdzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NyYy5jOgorCSAgKGdzdF9hdXRvX2F1ZGlvX3NyY19jbGFzc19pbml0KToKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc3JjLmM6CisJICAoZ3N0X2F1dG9fdmlkZW9fc3JjX2NsYXNzX2luaXQpOgorCSAgRml4ICJTaW5jZSIgdGFncyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworMjAwOC0xMC0yNyAwOTowMDoyOSArMDAwMCAgU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PgorCisJICBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOiBBZGQgc3VwcG9ydCBmb3Igc291cGh0dHBzcmMgdG8gYWN0IGFzIGEgbGl2ZSBzb3VyY2UuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gZ2V0IHRpbWVzdGEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFNqb2VyZCBTaW1vbnMgPHNqb2VyZCBhdCBsdW9uIGRvdCBuZXQ+CisJICAqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IChnc3Rfc291cF9odHRwX3NyY19jbGFzc19pbml0KSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19zZXRfcHJvcGVydHkpLCAoZ3N0X3NvdXBfaHR0cF9zcmNfZ2V0X3Byb3BlcnR5KToKKwkgIEFkZCBzdXBwb3J0IGZvciBzb3VwaHR0cHNyYyB0byBhY3QgYXMgYSBsaXZlIHNvdXJjZS4gVGhpcyBtYWtlcyBpdAorCSAgcG9zc2libGUgdG8gZ2V0IHRpbWVzdGFtcGVkIGJ1ZmZlcnMgaW4gY29tYmluYXRpb24gd2l0aCB0aGUKKwkgICJkby10aW1lc3RhbXAiIHByb3BlcnR5LiBGaXhlcyBidWcgIzU1NjAxOS4KKworMjAwOC0xMC0yNyAwODo1NDozMCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXV0b2RldGVjdC86IEltcGxlbWVudCBzcmMgcGx1Z2lucy4gTGl0dGxlIGNvZGUvc3RyaW5nIGNsZWFudXAgaW4gdGhlIHNpbmtzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdXRvZGV0ZWN0L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NyYy5jOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuaDoKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2RldGVjdC5jOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5jOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuaDoKKwkgIEltcGxlbWVudCBzcmMgcGx1Z2lucy4gTGl0dGxlIGNvZGUvc3RyaW5nIGNsZWFudXAgaW4gdGhlIHNpbmtzLgorCSAgRml4ZXMgIzUyMzgxMy4KKworMjAwOC0xMC0yNyAwODo0NToxMSArMDAwMCAgUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2pAYXhpcy5jb20+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogRml4IGEgbWVtb3J5IGxlYWsgd2hlbiBwYWRzIGFyZSByZXF1ZXN0ZWQgYnV0IHRoZSBwaXBlbGluZSBuZXZlciBnb2VzIGludG8gUExBWUlORy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqIGF0IGF4aXMgY29tPgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChnc3RfbWF0cm9za2FfbXV4X3Jlc2V0KSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3JlcXVlc3RfbmV3X3BhZCksIChnc3RfbWF0cm9za2FfbXV4X3JlbGVhc2VfcGFkKToKKwkgIEZpeCBhIG1lbW9yeSBsZWFrIHdoZW4gcGFkcyBhcmUgcmVxdWVzdGVkIGJ1dCB0aGUgcGlwZWxpbmUgbmV2ZXIKKwkgIGdvZXMgaW50byBQTEFZSU5HLgorCSAgQ29ycmVjdGx5IHJlbW92ZSByZXF1ZXN0IHBhZHMsIG5vIG1hdHRlciBpZiB0aGV5IGhhdmUgY29sbGVjdGVkCisJICBkYXRhIG9yIG5vdC4KKwkgIEZpeGVzIGJ1ZyAjNTU3NzEwLgorCisyMDA4LTEwLTI3IDA4OjQwOjAyICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuaDogRGVmaW5lIHRoZSBjb3JyZWN0IFdJTlZFUiBzbyBnZXRhZGRpbmZvKCkgY2FuIGJlIHVzZWQgd2hlbiB1c2luZyBtaW5ndzMyLiBGaXhlcyBidWcgIzU1NzI5NC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IDxscm4xOTg2IGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuaDoKKwkgIERlZmluZSB0aGUgY29ycmVjdCBXSU5WRVIgc28gZ2V0YWRkaW5mbygpIGNhbiBiZSB1c2VkIHdoZW4gdXNpbmcKKwkgIG1pbmd3MzIuIEZpeGVzIGJ1ZyAjNTU3Mjk0LgorCisyMDA4LTEwLTI3IDA4OjM2OjQzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC91ZHAvOiBGaXggImFyZ3VtZW50IHR5cGUgbWlzbWF0Y2giIGNvbXBpbGVyIHdhcm5pbmdzIG9uIFdpbmRvd3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiA8bHJuMTk4NiBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzogKGdzdF9keW51ZHBzaW5rX3JlbmRlcik6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChnc3RfbXVsdGl1ZHBzaW5rX3JlbmRlcik6CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2NyZWF0ZSk6CisJICBGaXggImFyZ3VtZW50IHR5cGUgbWlzbWF0Y2giIGNvbXBpbGVyIHdhcm5pbmdzIG9uIFdpbmRvd3MuCisJICBGaXhlcyBidWcgIzU1NzI5My4KKworMjAwOC0xMC0yNyAwODozMDo1MSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOiBEb24ndCBjYWxjdWxhdGUgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgZm9yIGV2ZXJ5IHNpbmdsZSBidWZmZXIgYnV0IG9ubHkgd2hlbiBpdCdzIG4uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOiAodXBkYXRlX2NvZWZmaWNpZW50cyk6CisJICBEb24ndCBjYWxjdWxhdGUgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgZm9yIGV2ZXJ5IHNpbmdsZSBidWZmZXIKKwkgIGJ1dCBvbmx5IHdoZW4gaXQncyBuZWVkZWQuIEZpeGVzIGJ1ZyAjNTU3MjYwLgorCisyMDA4LTEwLTI2IDIwOjA1OjQzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBCYWNrIHRvIGRldmVsb3BtZW50IC0+IDAuMTAuMTEuMQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQgLT4gMC4xMC4xMS4xCisKKzIwMDgtMTAtMjYgMjA6MDQ6MjEgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QtcGx1Z2lucy1nb29kLmRvYXA6IEZpeCB2ZXJzaW9uIG51bWJlciBvZiAwLjEwLjExIHJlbGVhc2UgaW4gZG9hcCBmaWxlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSAgRml4IHZlcnNpb24gbnVtYmVyIG9mIDAuMTAuMTEgcmVsZWFzZSBpbiBkb2FwIGZpbGUKKworPT09IHJlbGVhc2UgMC4xMC4xMSA9PT0KKworMjAwOC0xMC0yNCAyMjo0MToxOCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTAuMTEKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUmVsZWFzZSAwLjEwLjExCisKKzIwMDgtMTAtMjQgMjI6MjA6NDcgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDA4LTEwLTI0IDE2OjMwOjUzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBDb21taXQgMC4xMC4xMC40IHByZS1yZWxlYXNlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgQ29tbWl0IDAuMTAuMTAuNCBwcmUtcmVsZWFzZQorCisyMDA4LTEwLTIxIDEyOjQyOjQ1ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L2F2aS9nc3RhdmltdXguYzogRml4IFZQUlAgY2h1bmsgc2V0dXAgaW4gYXZpbXV4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBGaXggVlBSUCBjaHVuayBzZXR1cCBpbiBhdmltdXguCisJICBGaXhlczogIzU1NjAxMAorCSAgUGF0Y2ggQnk6IE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisyMDA4LTEwLTIxIDEyOjM4OjM1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogc3VwcG9ydCBkeW5hbWljYWxseSBjaGFuZ2luZyBwcm9wZXJ0aWVzIGluIHZpZGVvYm94CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICBzdXBwb3J0IGR5bmFtaWNhbGx5IGNoYW5naW5nIHByb3BlcnRpZXMgaW4gdmlkZW9ib3gKKwkgIEZpeGVkOiAjNTU3MDg1CisJICBQYXRjaCBCeTogV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworMjAwOC0xMC0xNiAxNzoxMDo0MiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogMC4xMC4xMC4zIHByZS1yZWxlYXNlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgMC4xMC4xMC4zIHByZS1yZWxlYXNlCisKKzIwMDgtMTAtMTYgMTU6MzA6MjIgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogRG9uJ3QgcnVuIHRoZSBzdGF0ZXMgdGVzdCBvbiBwdWxzZXNyYyBhbmQgcHVsc2VzaW5rCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBEb24ndCBydW4gdGhlIHN0YXRlcyB0ZXN0IG9uIHB1bHNlc3JjIGFuZCBwdWxzZXNpbmsKKworMjAwOC0xMC0xNiAxMTo1Mjo0NCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogQ29tbWl0IDAuMTAuMTAuMiBwcmUtcmVsZWFzZSBidW1wIHRoYXQgYWN0dWFsbHkgd2VudCBvdXQgb24gMjAwOC0xMC0xMQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIENvbW1pdCAwLjEwLjEwLjIgcHJlLXJlbGVhc2UgYnVtcCB0aGF0IGFjdHVhbGx5IHdlbnQKKwkgIG91dCBvbiAyMDA4LTEwLTExCisKKzIwMDgtMTAtMTUgMTU6NDI6MjkgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogU2tpcCBlbnRyaWVzIGZvciBzdHJlYW1zIHRoYXQgZG9uJ3QgaGF2ZSBhIG91dHB1dCBwYWQgeWV0LCB0aGVyZWJ5IGF2b2lkaW5nIGNhbGxpbmcgcGFkIGZ1bmN0aS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfc3RyZWFtX3NjYW4pOgorCSAgU2tpcCBlbnRyaWVzIGZvciBzdHJlYW1zIHRoYXQgZG9uJ3QgaGF2ZSBhIG91dHB1dCBwYWQgeWV0LCB0aGVyZWJ5CisJICBhdm9pZGluZyBjYWxsaW5nIHBhZCBmdW5jdGlvbnMgd2l0aCBhIE5VTEwgcGFkLgorCSAgRml4ZXMgIzU1NjQyNAorCisyMDA4LTEwLTE1IDA5OjM5OjI3ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFJlbW92ZSBwcmV2aW91cyB3cm9uZyBjb21taXQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFJlbW92ZSBwcmV2aW91cyB3cm9uZyBjb21taXQKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvaWN5ZGVtdXguYzogKGljeWRlbXV4X2ZvdW5kX3BhZCk6CisJICBSZW1vdmUgcHJvYmxlbWF0aWMgYW5kIHVzZWxlc3MgcmVmY291bnQgY2hlY2suCisJICBGaXhlcyAjNTU2MzgxCisKKzIwMDgtMTAtMTUgMDk6Mjc6MjcgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogUmVtb3ZlIHByb2JsZW1hdGljIGFuZCB1c2VsZXNzIHJlZmNvdW50IGNoZWNrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2Vfbm9kZSk6CisJICBSZW1vdmUgcHJvYmxlbWF0aWMgYW5kIHVzZWxlc3MgcmVmY291bnQgY2hlY2suCisJICBGaXhlcyAjNTU2MzgxCisKKzIwMDgtMTAtMTAgMTI6Mjg6MzQgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBleHQvZmxhYy86IENhc3Qgc29tZSBzaXplX3QgYXJndW1lbnRzIHRvIGd1aW50IHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzIG9uIDY0LWJpdCBzeXN0ZW1zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYyAoZ3N0X2ZsYWNfZGVjX3JlYWRfc3RyZWFtKToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jIChnc3RfZmxhY19lbmNfd3JpdGVfY2FsbGJhY2spOgorCSAgQ2FzdCBzb21lIHNpemVfdCBhcmd1bWVudHMgdG8gZ3VpbnQgdG8gYXZvaWQgY29tcGlsZXIKKwkgIHdhcm5pbmdzIG9uIDY0LWJpdCBzeXN0ZW1zLgorCisyMDA4LTEwLTA5IDE0OjI3OjEyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IFJldHVybiBUUlVFIGluc3RlYWQgb2YgRkFMU0UgZnJvbSB0aGUgZXZlbnQgaGFuZGxlciB3aGVuIHdlIHN3YWxsb3dlZCB0aGUgZXZlbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfaGFuZGxlX3NyY19ldmVudCk6CisJICBSZXR1cm4gVFJVRSBpbnN0ZWFkIG9mIEZBTFNFIGZyb20gdGhlIGV2ZW50IGhhbmRsZXIgd2hlbiB3ZSBzd2FsbG93ZWQgdGhlCisJICBldmVudC4KKworMjAwOC0xMC0wOCAxNTo1OTo1NiArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICByZW1vdmUgb2xkIENESU8gcGx1Z2luIG5vdyBpbiB1Z2x5CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbW92ZSBvbGQgQ0RJTyBwbHVnaW4gbm93IGluIHVnbHkKKworMjAwOC0xMC0wOCAxNDo0NzoxNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBSZXNldCBoZWFkZXIgc3RhdGUuIEZpeGVzICM1NTUzMjEuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9yZXNldCksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdWJpbmRleCksIChnc3RfYXZpX2RlbXV4X3BhcnNlX2luZGV4KToKKwkgIFJlc2V0IGhlYWRlciBzdGF0ZS4gRml4ZXMgIzU1NTMyMS4KKworMjAwOC0xMC0wOCAxMzozMTo0NCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC4qOiBGb3IgdGltZXN0YW1waW5nIGF1ZGlvIHBhY2tldHMgd2UgbmVlZCB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgYW1vdW50IG9mIGJsb2NrcyBpbiBvbmUgZW50cnkgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdWJpbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0pLCAoZ3N0X2F2aV9kZW11eF9wYXJzZV9pbmRleCk6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIEZvciB0aW1lc3RhbXBpbmcgYXVkaW8gcGFja2V0cyB3ZSBuZWVkIHRvIHRha2UgaW50byBhY2NvdW50IHRoZQorCSAgYW1vdW50IG9mIGJsb2NrcyBpbiBvbmUgZW50cnkgdXNpbmcgdGhlIGJsb2NrYWxpZ24uIEZpeGVzIHNvbWUgc3luYworCSAgaXNzdWVzIHdpdGggemVyby1wYWRkZWQgYXVkaW8gYmxvY2tzIGluIHRoZSBiZWdpbm5pbmcgb2YgYXZpIGZpbGVzLgorCisyMDA4LTEwLTA4IDEwOjQyOjI2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOiBJbXBsZW1lbnQgREVGQVVMVCBhbmQgQlVGRkVSIHBvc2l0aW9uIHF1ZXJpZXMuIFNlZSAjNTU1MjYwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6IChnc3RfbXVsdGlfZmlsZV9zcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X211bHRpX2ZpbGVfc3JjX3F1ZXJ5KToKKwkgIEltcGxlbWVudCBERUZBVUxUIGFuZCBCVUZGRVIgcG9zaXRpb24gcXVlcmllcy4gU2VlICM1NTUyNjAuCisKKzIwMDgtMTAtMDggMDk6Mjk6MDAgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6IEZpeCBidWlsZCBmb3Igc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgWERhbWFnZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiAoZ3N0X3hpbWFnZV9zcmNfc3RvcCk6CisJICBGaXggYnVpbGQgZm9yIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIFhEYW1hZ2UuCisKKzIwMDgtMTAtMDcgMDk6NTg6MTMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHRlc3RzL2V4YW1wbGVzL3J0cC86IEFkZCBzb21lIG1vcmUgSDI2M3Agc2VydmVyIGFuZCBjbGllbnQgZXhhbXBsZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC5zZHA6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3Auc2g6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItVlRTLUgyNjNwLnNoOgorCSAgQWRkIHNvbWUgbW9yZSBIMjYzcCBzZXJ2ZXIgYW5kIGNsaWVudCBleGFtcGxlcy4KKworMjAwOC0xMC0wMyAxNzowMzowNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBEZXBlbmQgb24gcmVsZWFzZWQgdmVyc2lvbnMgb2YgY29yZSBhbmQgYmFzZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6OgorCSAgRGVwZW5kIG9uIHJlbGVhc2VkIHZlcnNpb25zIG9mIGNvcmUgYW5kIGJhc2UuCisKKzIwMDgtMTAtMDMgMTY6MTM6MzIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9wdWxzZS86IFJldHVybiAtMSBpbnN0ZWFkIG9mIDAgaW4gZXJyb3IgY2FzZXMuIEZpeGVzICM1NTQ3NzEuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3B1bHNlL3B1bHNlc2luay5jOiAoZ3N0X3B1bHNlc2lua193cml0ZSk6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOiAoZ3N0X3B1bHNlc3JjX3JlYWQpOgorCSAgUmV0dXJuIC0xIGluc3RlYWQgb2YgMCBpbiBlcnJvciBjYXNlcy4gRml4ZXMgIzU1NDc3MS4KKworMjAwOC0xMC0wMyAxNTo1NDowNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzogU3RvcCBsZWFraW5nIHRoZSBjdXJzb3IgaW1hZ2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzogKGdzdF94aW1hZ2Vfc3JjX3N0YXJ0KSwKKwkgIChnc3RfeGltYWdlX3NyY19zdG9wKSwgKGdzdF94aW1hZ2Vfc3JjX3hpbWFnZV9nZXQpOgorCSAgU3RvcCBsZWFraW5nIHRoZSBjdXJzb3IgaW1hZ2UuCisJICBVbnJlZiB0aGUgbGFzdF94aW1hZ2UgYW5kIHRoZSBjYWNoZWQgY3Vyc29yIGltYWdlIG9uIHNodXRkb3duLgorCSAgRml4ZXMgIzU1MTU3MC4KKworMjAwOC0xMC0wMyAxMTozMjo0NyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOiBHZXR0aW5nIHRoZSBDbGFzcyBmcm9tIGFuIGluc3RhbmNlIGlzIG5vdCBqdXN0IGEgbWF0dGVyIG9mIGNhc3RpbmcgaXQgdG8gdGhlIGNsYXNzIHN0cnVjdCBiLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSAgR2V0dGluZyB0aGUgQ2xhc3MgZnJvbSBhbiBpbnN0YW5jZSBpcyBub3QganVzdCBhIG1hdHRlciBvZiBjYXN0aW5nIGl0IHRvCisJICB0aGUgY2xhc3Mgc3RydWN0IGJ1dCBpdCBpbnZvbHZlcyBjYWxsaW5nIEdfT0JKRUNUX0dFVF9DTEFTUyBvbiB0aGUKKwkgIGluc3RhbmNlLiBGaXhlcyAjNTQ5Nzg0LgorCisyMDA4LTEwLTAxIDIxOjIyOjI2ICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIGNvbmZpZ3VyZS5hYzogRml4IGxpYnMgZm9yIGxpbmtpbmcgZGlyZWN0c291bmQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgRml4IGxpYnMgZm9yIGxpbmtpbmcgZGlyZWN0c291bmQuCisJICAqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIEZpeCBidWZmZXIgc2l6aW5nIHRvIHByZXZlbnQgcmFjaW5nIHRoZSByaW5nYnVmZmVyIGF0IHN0YXJ0dXAuCisJICBBZGQgdm9sdW1lIHByb3BlcnR5LgorCisyMDA4LTA5LTI3IDAwOjQzOjA3ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZXh0L3B1bHNlL3B1bHNlc2luay5jOiBGaXggcHJvYmxlbXMgd2l0aCBwdWxzZXNpbmsgcmFuZG9tbHkgZXJyb3Jpbmcgd2l0aCBjb2RlICdPSycgYWZ0ZXIgYSBmb3JtYXQgY2hhbmdlIG9uIHRoZSBzdHJlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgRml4IHByb2JsZW1zIHdpdGggcHVsc2VzaW5rIHJhbmRvbWx5IGVycm9yaW5nIHdpdGggY29kZSAnT0snIGFmdGVyIGEKKwkgIGZvcm1hdCBjaGFuZ2Ugb24gdGhlIHN0cmVhbSBieSB3YWl0aW5nIHdoZW4gZGlzY29ubmVjdGluZyB0aGUgc3RyZWFtLgorCisyMDA4LTA5LTI2IDE0OjQ0OjQ5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6IE1hcmsgRElTQ09OVCBvbiBvdXRwdXQgYnVmZmVycyB3aGVuIHRoZSBtYXJrZXIgYml0IHNpZ25hbHMgYSBuZXcgdGFsayBzcHVydC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6IChnc3RfcnRwX2Ftcl9kZXBheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX2Ftcl9kZXBheV9wcm9jZXNzKToKKwkgIE1hcmsgRElTQ09OVCBvbiBvdXRwdXQgYnVmZmVycyB3aGVuIHRoZSBtYXJrZXIgYml0IHNpZ25hbHMgYSBuZXcgdGFsaworCSAgc3B1cnQuCisJICAqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6IChnc3RfcnRwX2Ftcl9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICBTZXQgdGhlIG1hcmtlciBiaXQgZm9yIGJ1ZmZlcnMgd2l0aCBhIERJU0NPTlQgZmxhZyB0byBzaWduYWwgYSB0YWxrCisJICBzcHVydC4KKworMjAwOC0wOS0yNiAxMzo1NTo0OCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IEFkZGVkIE1QNEEtTEFUTSBwYXlsb2FkZXIgdG8gbWF0Y2ggdGhlIGRlcGF5bG9hZGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHAvZ3N0cnRwLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5jOiAoZ3N0X3J0cF9tcDRhX3BheV9nZXRfdHlwZSksCisJICAoZ3N0X3J0cF9tcDRhX3BheV9iYXNlX2luaXQpLCAoZ3N0X3J0cF9tcDRhX3BheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX21wNGFfcGF5X2luaXQpLCAoZ3N0X3J0cF9tcDRhX3BheV9maW5hbGl6ZSksCisJICAoZ3N0X3J0cF9tcDRhX3BheV9wYXJzZV9hdWRpb19jb25maWcpLCAoZ3N0X3J0cF9tcDRhX3BheV9uZXdfY2FwcyksCisJICAoZ3N0X3J0cF9tcDRhX3BheV9zZXRjYXBzKSwgKGdzdF9ydHBfbXA0YV9wYXlfaGFuZGxlX2J1ZmZlciksCisJICAoZ3N0X3J0cF9tcDRhX3BheV9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3J0cF9tcDRhX3BheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5oOgorCSAgQWRkZWQgTVA0QS1MQVRNIHBheWxvYWRlciB0byBtYXRjaCB0aGUgZGVwYXlsb2FkZXIuCisKKzIwMDgtMDktMjUgMTU6MTE6MTYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogSGFuZGxlIHNlZ21lbnRzIGEgbGl0dGxlIGJldHRlci4gRml4ZXMgIzUzNzM2MS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IChnc3RfdmlkZW9taXhlcl9maWxsX3F1ZXVlcyksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfc2lua19ldmVudCk6CisJICBIYW5kbGUgc2VnbWVudHMgYSBsaXR0bGUgYmV0dGVyLiBGaXhlcyAjNTM3MzYxLgorCisyMDA4LTA5LTI1IDEyOjA3OjQ2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IERvbid0IGFzc3VtZSB0aGUgc2VydmVyIHN1cHBvcnRzIFBBVVNFIGJ5IGRlZmF1bHQuIEZpeGVzICM1NTEwNDguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfcGFyc2VfbWV0aG9kcyk6CisJICBEb24ndCBhc3N1bWUgdGhlIHNlcnZlciBzdXBwb3J0cyBQQVVTRSBieSBkZWZhdWx0LiBGaXhlcyAjNTUxMDQ4LgorCisyMDA4LTA5LTI1IDExOjMwOjM1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdHVkcHNyYy5jOiBTd2l0Y2ggb24gdGhlIHNvY2tldCBmYW1pbHkgdG8gZ2V0IHRoZSBhZGRybGVuIHNpemUgcmlnaHQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3VkcHNyY19zZXRfdXJpKSwgKGdzdF91ZHBzcmNfc3RhcnQpOgorCSAgU3dpdGNoIG9uIHRoZSBzb2NrZXQgZmFtaWx5IHRvIGdldCB0aGUgYWRkcmxlbiBzaXplIHJpZ2h0LgorCisyMDA4LTA5LTI1IDEwOjM0OjM5ICswMDAwICBEYW5pZWwgRnJhbmtlIDxkZkBkZnJhbmtlLnVzPgorCisJICBnc3QvdWRwL2dzdHVkcHNyYy5jOiBPUyBYJ3MgYmluZCgpIGltcGxlbWVudGF0aW9uIGlzIHBpY2t5IGFib3V0IGl0cyBhZGRybGVuIHBhcmFtZXRlciBhbmQgZmFpbHMgd2l0aCBFSU5WQUwgaWYgaXQgaXMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IERhbmllbCBGcmFua2UgPGRmIGF0IGRmcmFua2UgZG90IHVzPgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19jcmVhdGUpLCAoZ3N0X3VkcHNyY19zdGFydCk6CisJICBPUyBYJ3MgYmluZCgpIGltcGxlbWVudGF0aW9uIGlzIHBpY2t5IGFib3V0IGl0cyBhZGRybGVuIHBhcmFtZXRlciBhbmQKKwkgIGZhaWxzIHdpdGggRUlOVkFMIGlmIGl0IGlzIGxhcmdlciB0aGFuIGV4cGVjdGVkIGZvciB0aGUgc29ja2V0J3MgYWRkcmVzcworCSAgZmFtaWx5LiBTZXQgdGhlIGxlbmd0aCB0byB0aGUgZXhwZWN0ZWQgbGVuZ3RoIGluc3RlYWQuIEZpeGVzICM1NTMxOTEuCisKKzIwMDgtMDktMjMgMTg6MDg6NTYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGNhbm5vdCBkbyBkZXNyaWJlIG9yIHdoZW4gdGhlIGRlc2NyaWJlIHJlc3VsdCBkb2VzIG5vdCBjb250YWluIGEgdmFsaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX29wZW4pOgorCSAgSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGNhbm5vdCBkbyBkZXNyaWJlIG9yIHdoZW4gdGhlIGRlc2NyaWJlIHJlc3VsdAorCSAgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIFNEUCBtZXNzYWdlLgorCisyMDA4LTA5LTIzIDE3OjMxOjIyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiBGaXggc2V0dGluZyB0aGUgcW9zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChnc3RfbXVsdGl1ZHBzaW5rX3NldF9wcm9wZXJ0eSk6CisJICBGaXggc2V0dGluZyB0aGUgcW9zLgorCisyMDA4LTA5LTE3IDE0OjUwOjQyICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFNvbWUgJ2Jyb2tlbicgZmlsZXMgb3V0IHRoZXJlIGhhdmUgYXRvbSBsZW5ndGhzIG9mIHplcm8uLi4gd2hpY2ggYmFzaWNhbGx5IHJlc3VsdHMgaW4gcXRkZW11eCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX3N0YXRlX2hlYWRlciksCisJICAoZ3N0X3F0ZGVtdXhfY2hhaW4pOgorCSAgU29tZSAnYnJva2VuJyBmaWxlcyBvdXQgdGhlcmUgaGF2ZSBhdG9tIGxlbmd0aHMgb2YgemVyby4uLgorCSAgd2hpY2ggYmFzaWNhbGx5IHJlc3VsdHMgaW4gcXRkZW11eCBjb25zdW1pbmcgdGhhdCBhdG9tIGFnYWluIGFuZCBhZ2FpbgorCSAgdW50aWwgdGhlICplbmQgb2YgbmlnaHQqICEKKwkgIERldGVjdCB0aGF0IGFuZCBlbWl0cyBhbiBhZGVxdWF0ZSBlbGVtZW50IGVycm9yIG1lc3NhZ2UuCisKKzIwMDgtMDktMTcgMTM6NDk6MDQgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvOiBGaXggYnVpbGQgZmxhZ3Mgb3JkZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ludGVybGVhdmUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tYXRyb3NrYS9NYWtlZmlsZS5hbToKKwkgIEZpeCBidWlsZCBmbGFncyBvcmRlci4KKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9hbXBsaWZ5LmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZHluYW1pYy5jOiAoR1NUX1NUQVJUX1RFU1QpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2ludmVydC5jOiAoR1NUX1NUQVJUX1RFU1QpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3Bhbm9yYW1hLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICBGb3JtYXQgZml4ZXMuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jOgorCSAgUHVsbCBpbiB1bmlzdGQuaAorCisyMDA4LTA5LTE1IDIxOjEwOjIzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS4qOiBIYW5kbGUgaW50ZXJsZWF2ZWQgc3RyZWFtcyBieSByZW9yZGVyaW5nIEFVIGluIGEgcXVldWUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzogKGdzdF9ydHBfbXA0Z19kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX21wNGdfZGVwYXlfZmluYWxpemUpLCAoZ3N0X3J0cF9tcDRnX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfbXA0Z19kZXBheV9jbGVhcl9xdWV1ZSksIChnc3RfcnRwX21wNGdfZGVwYXlfZmx1c2hfcXVldWUpLAorCSAgKGdzdF9ydHBfbXA0Z19kZXBheV9xdWV1ZSksIChnc3RfcnRwX21wNGdfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF9tcDRnX2RlcGF5X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5Lmg6CisJICBIYW5kbGUgaW50ZXJsZWF2ZWQgc3RyZWFtcyBieSByZW9yZGVyaW5nIEFVIGluIGEgcXVldWUuCisKKzIwMDgtMDktMTUgMTY6MDQ6MjYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6IENoYW5nZSBzb21lIG9mIHRoZSByYW5nZXMgaW4gdGhlIGNhcHMsIG1vc3RseSBmb3IgdGhlIGFtb3VudCBvZiBiaXRzIHdlIGNhbiB1c2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzogKGdzdF9ic19wYXJzZV9pbml0KSwKKwkgIChnc3RfYnNfcGFyc2VfcmVhZCksIChnc3RfcnRwX21wNGdfZGVwYXlfcHJvY2Vzcyk6CisJICBDaGFuZ2Ugc29tZSBvZiB0aGUgcmFuZ2VzIGluIHRoZSBjYXBzLCBtb3N0bHkgZm9yIHRoZSBhbW91bnQgb2YgYml0cyB3ZQorCSAgY2FuIHVzZS4KKwkgIEFkZGVkIGEgbGl0dGxlIGJpdHN0cmVhbSBwYXJzZSBhbmQgdXNlIGl0IHRvIHBhcnNlIHRoZSBBVSBoZWFkZXIgZmllbGRzLgorCSAgQ2hlY2sgZm9yIG1hbGZvcm1lZCBhbmQgd3JvbmdseSBzaXplZCBwYWNrZXRzIGJldHRlci4KKwkgIEltcGxlbWVudCBtb3JlIGhlYWRlciBmaWVsZCBwYXJzaW5nLgorCSAgSGFuZGxlIHRoZSBzaXplIG9mIGZyYWdtZW50ZWQgcGFja2V0cyBjb3JyZWN0bHkuCisKKzIwMDgtMDktMTQgMTE6MzI6MTUgKzAwMDAgIEpvbmF0aGFuIE1hdHRoZXcgPG5vdHZlcnlzbWFydEBnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQWRkIG1hcHBpbmcgZm9yICd0aWZmJyA9PiBpbWFnZS90aWZmCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBKb25hdGhhbiBNYXR0aGV3IDxub3R2ZXJ5c21hcnRAZ21haWwuY29tPgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3ZpZGVvX2NhcHMpOgorCSAgQWRkIG1hcHBpbmcgZm9yICd0aWZmJyA9PiBpbWFnZS90aWZmCisJICBGaXhlcyAjNTUyMjEzCisKKzIwMDgtMDktMTEgMTE6MjY6MDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9yYXcxMzk0LzogUHJldGVuZCB0byBjYXJlIGFib3V0IHRoZSByZXN1bHQgb2Ygd3JpdGUoKSB3aGljaCB3b3JrcyBhcm91bmQgY29tcGlsZXIgd2FybmluZ3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IChTRU5EX0NPTU1BTkQpOgorCSAgKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6IChTRU5EX0NPTU1BTkQpOgorCSAgUHJldGVuZCB0byBjYXJlIGFib3V0IHRoZSByZXN1bHQgb2Ygd3JpdGUoKSB3aGljaCB3b3JrcyBhcm91bmQKKwkgIGNvbXBpbGVyIHdhcm5pbmdzLgorCisyMDA4LTA5LTA0IDA5OjI1OjU5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IE1ha2Ugc3VyZSB0aGUgZGVzaXJlZCBkZWZhdWx0IHZhbHVlcyBhcmUgYWN0dWFsbHkgc2V0LCBub3Qgb25seSByZWdpc3RlcmVkIGFzIGRlZmF1bHRzIChhY3R1YWwuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IChnc3RfZmxhY19lbmNfY2xhc3NfaW5pdCk6CisJICBNYWtlIHN1cmUgdGhlIGRlc2lyZWQgZGVmYXVsdCB2YWx1ZXMgYXJlIGFjdHVhbGx5IHNldCwgbm90IG9ubHkKKwkgIHJlZ2lzdGVyZWQgYXMgZGVmYXVsdHMgKGFjdHVhbCBwcm9ibGVtIGlzIHRoYXQgdGhlIHN0ZXJlby1zcGVjaWZpYworCSAgdmFsdWVzIGFyZSBvbmx5IHVwZGF0ZWQgaWYgY2hhbm5lbHM9PTIsIHdoaWNoIGlzIG5vdCB0aGUgY2FzZSB5ZXQKKwkgIHdoZW4gdGhlIG9iamVjdCBpcyBjcmVhdGVkLCBzbyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZQorCSAgbWlkLXNpZGUtc3RlcmVvIGFuZCBsb29zZS1taWQtc2lkZS1zdGVyZW8gc2V0dGluZ3MgYXJlIG5ldmVyCisJICBzZXQgaW4gX3VwZGF0ZV9xdWFsaXR5KCkpLiBNYWtlcyBmbGFjZW5jIGNyZWF0ZSBzbWFsbGVyIGZpbGVzIGJ5CisJICBkZWZhdWx0IChmb3Igc3RlcmVvIGlucHV0KSwgYW5kIGZpeGVzICM1NTA3OTEuCisKKzIwMDgtMDktMDMgMTI6Mzk6MzUgKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJICBnc3QvcXRkZW11eC86IEFkZCBzdXBwb3J0IGZvciB2aWRlby9tajIgbWltZS10eXBlIGFuZCBpdHMgYWRkaXRpb25hbCBhdG9tcy9ib3hlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfaGVhZGVyKSwgKHF0ZGVtdXhfcGFyc2Vfbm9kZSksCisJICAocXRkZW11eF9wYXJzZV90cmFrKSwgKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguaDoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eF90eXBlcy5jOgorCSAgQWRkIHN1cHBvcnQgZm9yIHZpZGVvL21qMiBtaW1lLXR5cGUgYW5kIGl0cyBhZGRpdGlvbmFsIGF0b21zL2JveGVzLgorCSAgRml4ZXMgIzU1MDY0Ni4KKworMjAwOC0wOS0wMyAxMToxMDoyNSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvZGVidWcvZ3N0dGFnaW5qZWN0LmM6IEFkZCB3YXJuaW5nIHdoZW4gdGFncyBwYXJhbWV0ZXIgaXMgdW5wYXJzYWJsZSBhbmQgZ2l2ZSBleGFtcGxlIGZvciBxdW90aW5nIGluIHRoZSBkb2NzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWJ1Zy9nc3R0YWdpbmplY3QuYzoKKwkgIEFkZCB3YXJuaW5nIHdoZW4gdGFncyBwYXJhbWV0ZXIgaXMgdW5wYXJzYWJsZSBhbmQgZ2l2ZSBleGFtcGxlIGZvcgorCSAgcXVvdGluZyBpbiB0aGUgZG9jcy4KKworMjAwOC0wOS0wMiAxNToyNzo0OSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGQgbWFwcGluZyBmb3IgSU1BIExva2kgU0RMIE1KUEVHIEFEUENNIGNvZGVjLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfYXVkaW9fY2Fwcyk6CisJICBBZGQgbWFwcGluZyBmb3IgSU1BIExva2kgU0RMIE1KUEVHIEFEUENNIGNvZGVjLgorCSAgQWRkIHNvbWUgYWx0ZXJuYXRpdmUgYnl0ZXN3YXBwZWQgbWFwcGluZ3MgdGhhdCBzZWVtIHRvIHBvcCB1cCBzb21ldGltZXMuCisJICBGaXhlcyAjNTUwMjg4LgorCisyMDA4LTA5LTAyIDA5OjQwOjM4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBwby86IEFkZCAnY2EnIHRvIExJTkdVQVM7IGFkZCBzb21lIG1vcmUgZmlsZXMgd2l0aCB0cmFuc2xhdGlvbnMgYW5kIHNvbWUgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGlnbm9yZWQgYnkgdHJhbnNsYXRpb24uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBwby9MSU5HVUFTOgorCSAgKiBwby9QT1RGSUxFUy5pbjoKKwkgICogcG8vUE9URklMRVMuc2tpcDoKKwkgIEFkZCAnY2EnIHRvIExJTkdVQVM7IGFkZCBzb21lIG1vcmUgZmlsZXMgd2l0aCB0cmFuc2xhdGlvbnMgYW5kIHNvbWUKKwkgIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBpZ25vcmVkIGJ5IHRyYW5zbGF0aW9uIHRvb2xzLgorCisyMDA4LTA5LTAyIDA4OjUxOjA0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC9zcGVleC86IFVzZSBpbnRlZ2VyIGVuY29kaW5nIGFuZCBkZWNvZGluZyBmdW5jdGlvbnMgaW5zdGVhZCBvZiBjb252ZXJ0aW5nIHRoZSBpbnRlZ2VyIGlucHV0IHRvIGZsb2F0IGluIHRoZSBlbGVtZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiAoc3BlZXhfZGVjX2NoYWluX3BhcnNlX2RhdGEpOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuaDoKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6IChnc3Rfc3BlZXhfZW5jX2VuY29kZSk6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5oOgorCSAgVXNlIGludGVnZXIgZW5jb2RpbmcgYW5kIGRlY29kaW5nIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIGNvbnZlcnRpbmcKKwkgIHRoZSBpbnRlZ2VyIGlucHV0IHRvIGZsb2F0IGluIHRoZSBlbGVtZW50LiBUaGUgbGlic3BlZXggaW50ZWdlcgorCSAgZnVuY3Rpb25zIGFyZSBkb2luZyB0aGlzIGZvciB1cyBhbHJlYWR5IG9yLCBpZiBsaWJzcGVleCB3YXMgY29tcGlsZWQKKwkgIGluIGludGVnZXIgbW9kZSwgdGhleSdyZSBkb2luZyBldmVyeXRoaW5nIHVzaW5nIGludGVnZXIgYXJpdGhtZXRpY3MuCisJICBBbHNvIHNhdmVzIHNvbWUgY29weWluZyBhcm91bmQuCisKKzIwMDgtMDktMDEgMTM6Mjk6MjkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogRml4IC0tZGlzYWJsZS1leHRlcm5hbAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEZpeCAtLWRpc2FibGUtZXh0ZXJuYWwKKworMjAwOC0wOC0zMSAxNzowOToxOCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLio6IEhhbmRsZSBub24temVybyBzdGFydCB0aW1lc3RhbXBzIGFuZCBzdHJlYW0gZGlzY29udGludWl0aWVzIGNvcnJlY3RseS4gVGhpcyBvbmx5IGhhcyBhbiAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfcmVzZXQpLAorCSAgKGdzdF93YXZwYWNrX2VuY19wdXNoX2Jsb2NrKSwgKGdzdF93YXZwYWNrX2VuY19jaGFpbik6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuaDoKKwkgIEhhbmRsZSBub24temVybyBzdGFydCB0aW1lc3RhbXBzIGFuZCBzdHJlYW0gZGlzY29udGludWl0aWVzCisJICBjb3JyZWN0bHkuIFRoaXMgb25seSBoYXMgYW4gZWZmZWN0IGlmIHdlJ3JlIG11eGluZyBpbnRvCisJICBhIGNvbnRhaW5lciBmb3JtYXQgYXMgdGhlIHJhdyBXYXZQYWNrIHN0cmVhbSBtdXN0IGNvbnRhaW4KKwkgIGNvbnRpbm91cyBzYW1wbGUgbnVtYmVycy4KKworMjAwOC0wOC0zMSAxNTowMjowOSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogQ29ycmVjdCB0aGUgdGltZXN0YW1wIGFuZCBncmFudWxlcG9zIGNhbGN1bGF0aW9uIGJ5IG9uZSBTcGVleCBmcmFtZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleF9lbmNfZW5jb2RlKToKKwkgIENvcnJlY3QgdGhlIHRpbWVzdGFtcCBhbmQgZ3JhbnVsZXBvcyBjYWxjdWxhdGlvbiBieSBvbmUgU3BlZXgKKwkgIGZyYW1lLgorCisyMDA4LTA4LTMxIDE0OjM5OjU3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiBDb3JyZWN0bHkgdGFrZSB0aGUgZ3JhbnVsZXBvcyBmcm9tIHVwc3RyZWFtIGlmIHBvc3NpYmxlIGFuZCBjb3JyZWN0bHkgaGFuZGxlIHRoZSBncmFudWxlcG9zIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiAoc3BlZXhfZGVjX2NoYWluX3BhcnNlX2RhdGEpOgorCSAgQ29ycmVjdGx5IHRha2UgdGhlIGdyYW51bGVwb3MgZnJvbSB1cHN0cmVhbSBpZiBwb3NzaWJsZSBhbmQKKwkgIGNvcnJlY3RseSBoYW5kbGUgdGhlIGdyYW51bGVwb3MgaW4gdmFyaW91cyBjYWxjdWxhdGlvbnM6IHRoZQorCSAgZ3JhbnVsZXBvcyBpcyB0aGUgc2FtcGxlIG51bWJlciBvZiB0aGUgX2xhc3RfIHNhbXBsZSBpbiBhIGZyYW1lLCBub3QKKwkgIHRoZSBmaXJzdC4KKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6IChnc3Rfc3BlZXhfZW5jX3NpbmtldmVudCksCisJICAoZ3N0X3NwZWV4X2VuY19lbmNvZGUpLCAoZ3N0X3NwZWV4X2VuY19jaGFpbiksCisJICAoZ3N0X3NwZWV4X2VuY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuaDoKKwkgIEhhbmRsZSBub24temVybyBzdGFydCB0aW1lc3RhbXBzIGluIHRoZSBlbmNvZGVyIGFuZCBkZXRlY3QvaGFuZGxlCisJICBzdHJlYW0gZGlzY29udGludWl0aWVzLiBGaXhlcyBidWcgIzU0NzA3NS4KKworMjAwOC0wOC0zMSAwODozMjo0NSArMDAwMCAgQ3JhaWcgS2VvZ2ggPGNza2VvZ2hAYWRhbS5jb20uYXU+CisKKwkgIGV4dC9hbm5vZGV4L2dzdGNtbWxwYXJzZXIuYzogRml4IGNvbXBpbGVyIHdhcm5pbmdzIGNhdXNlZCBieSBwYXNzaW5nIGEgc3RyaW5nIGFzIGZvcm1hdCBzdHJpbmcgaW5zdGVhZCBvZiAiJXMiIGFuZCB0aC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQ3JhaWcgS2VvZ2ggPGNza2VvZ2ggYXQgYWRhbSBkb3QgY29tIGRvdCBhdT4KKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbHBhcnNlci5jOiAoZ3N0X2NtbWxfcGFyc2VyX3BhcnNlX2NodW5rKToKKwkgIEZpeCBjb21waWxlciB3YXJuaW5ncyBjYXVzZWQgYnkgcGFzc2luZyBhIHN0cmluZyBhcyBmb3JtYXQgc3RyaW5nCisJICBpbnN0ZWFkIG9mICIlcyIgYW5kIHRoZW4gdGhlIHN0cmluZy4gVGhpcyBpcyBvbmx5IGV4cG9zZWQgYnkgLVdmb3JtYXQ9MgorCSAgYXMgdXNlZCBieSBkZWZhdWx0IG9uIFVidW50dS4gRml4ZXMgYnVnICM1NTAwMTUuCisKKzIwMDgtMDgtMzAgMTQ6MTU6MDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIE1ha2Ugc3R1ZmYgY29tcGlsZSB3aXRoIEdTVF9ESVNBQkxFX0dTVF9ERUJVRy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6IChnc3RfaGR2MTM5NHNyY19jcmVhdGUpOgorCSAgKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzogKGdzdF9hbHBoYV9nZXRfdW5pdF9zaXplKToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYzogKGdlbmVyYXRlX2NvZWZmaWNpZW50cyk6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfc3JjX2NvbnZlcnQpOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChnc3RfZWJtbF9yZWFkX2VsZW1lbnRfaWQpLAorCSAgKGdzdF9lYm1sX3JlYWRfZWxlbWVudF9sZW5ndGgpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfY2hlY2tfc3VidGl0bGVfYnVmZmVyKToKKwkgIE1ha2Ugc3R1ZmYgY29tcGlsZSB3aXRoIEdTVF9ESVNBQkxFX0dTVF9ERUJVRy4KKworMjAwOC0wOC0yOSAwMDoyODo1NSArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBnc3QvbGF3LzogUmVmIGNhcHMgYmVmb3JlIHBhc3NpbmcgdG8gZ3N0X3BhZF90ZW1wbGF0ZV9uZXcoKSwgc2luY2UgdGhhdCB0YWtlcyBvd25lcnNoaXAuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xhdy9hbGF3LmM6CisJICAqIGdzdC9sYXcvbXVsYXcuYzoKKwkgIFJlZiBjYXBzIGJlZm9yZSBwYXNzaW5nIHRvIGdzdF9wYWRfdGVtcGxhdGVfbmV3KCksIHNpbmNlIHRoYXQgdGFrZXMKKwkgIG93bmVyc2hpcC4KKworMjAwOC0wOC0yOCAxMDowOToxNiArMDAwMCAgTWVyc2FkIEplbGFjaWMgPG1lcnNhZEBheGlzLmNvbT4KKworCSAgZ3N0L211bHRpcGFydC86IENvbnZlcnQgYXVkaW8veC1hZHBjbSB0byBhbmQgZnJvbSB0aGUgYXVkaW8vRzcyNi1YIGluIHRoZSBtdXhlciBhbmQgZGVtdXhlci4gRml4ZXMgIzU0OTU1MS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE1lcnNhZCBKZWxhY2ljIDxtZXJzYWQgYXQgYXhpcyBkb3QgY29tPgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IChnc3RfbXVsdGlwYXJ0X211eF9nZXRfbWltZSk6CisJICBDb252ZXJ0IGF1ZGlvL3gtYWRwY20gdG8gYW5kIGZyb20gdGhlIGF1ZGlvL0c3MjYtWCBpbiB0aGUgbXV4ZXIgYW5kCisJICBkZW11eGVyLiBGaXhlcyAjNTQ5NTUxLgorCisyMDA4LTA4LTI3IDE2OjEyOjM5ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBzeXMvb3N4YXVkaW8vOiBGaXggdGhlIGJ1aWxkIG9uIG1hY29zeC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJICAoZ3N0X29zeF9hdWRpb19zaW5rX3NlbGVjdF9kZXZpY2UpOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkgIChnc3Rfb3N4X2F1ZGlvX3NyY19jcmVhdGVfcmluZ2J1ZmZlciksCisJICAoZ3N0X29zeF9hdWRpb19zcmNfc2VsZWN0X2RldmljZSk6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hyaW5nYnVmZmVyLmM6IChnc3Rfb3N4X3JpbmdfYnVmZmVyX2FjcXVpcmUpOgorCSAgRml4IHRoZSBidWlsZCBvbiBtYWNvc3guCisKKzIwMDgtMDgtMjcgMTU6NDI6MTEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOiBTbWFsbCBkb2NzIGZpeDogaW4gdGhlIGV4YW1wbGUgcGlwZWxpbmUsIHdlIG5lZWQgdG8gcGFzcyBpcmFkaW8tbW9kZT10cnVlIHRvIHRoZSBzb3VyY2UsIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSAgU21hbGwgZG9jcyBmaXg6IGluIHRoZSBleGFtcGxlIHBpcGVsaW5lLCB3ZSBuZWVkIHRvIHBhc3MKKwkgIGlyYWRpby1tb2RlPXRydWUgdG8gdGhlIHNvdXJjZSwgc28gdGhlIHNlcnZlciBhY3R1YWxseSBzZW5kcworCSAgYW4gSUNZIHN0cmVhbS4KKworMjAwOC0wOC0yNyAwMDowODoyMCArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW8uYzogT29wcy4gUmV2ZXJ0IG1vcmUgY29tcGxldGVseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW8uYzoKKwkgIE9vcHMuIFJldmVydCBtb3JlIGNvbXBsZXRlbHkuCisKKzIwMDgtMDgtMjYgMjM6NTc6MDUgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvLmM6IFJldmVydCBhY2NpZGVudGFsIGVsZW1lbnQgcmVuYW1lIGZyb20gdGVzdGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW8uYzoKKwkgIFJldmVydCBhY2NpZGVudGFsIGVsZW1lbnQgcmVuYW1lIGZyb20gdGVzdGluZy4KKworMjAwOC0wOC0yNiAyMzo1Mzo0MCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDogUHVsbCBpbiAwLjEwLjEwIGRvYXAgZW50cnkgZnJvbSByZWxlYXNlIGJyYW5jaAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkgIFB1bGwgaW4gMC4xMC4xMCBkb2FwIGVudHJ5IGZyb20gcmVsZWFzZSBicmFuY2gKKworMjAwOC0wOC0yNiAyMzowNTo1NyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogVXBkYXRlIHZlcnNpb24gbnVtYmVyIHRvIHJlZmxlY3QgMC4xMC4xMCByZWxlYXNlIGZyb20gYnJhbmNoLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIFVwZGF0ZSB2ZXJzaW9uIG51bWJlciB0byByZWZsZWN0IDAuMTAuMTAgcmVsZWFzZSBmcm9tCisJICBicmFuY2guCisKKzIwMDgtMDgtMjYgMjE6MTM6MDggKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgc3lzL29zeGF1ZGlvLzogUmV3cml0ZSBjYXBzIHNldHRpbmcgYW5kIHJpbmcgYnVmZmVyIGluaXRpYWxpc2F0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3hhdWRpby9NYWtlZmlsZS5hbToKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvLmM6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5oOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmg6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hyaW5nYnVmZmVyLmM6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hyaW5nYnVmZmVyLmg6CisJICBSZXdyaXRlIGNhcHMgc2V0dGluZyBhbmQgcmluZyBidWZmZXIgaW5pdGlhbGlzYXRpb24uCisJICBQcmV2aW91c2x5IHdlIG5ldmVyIHRvbGQgQ29yZUF1ZGlvIHdoYXQgZm9ybWF0IHdlIHdlcmUgZ29pbmcgdG8gc2VuZCBpdCwKKwkgIHNvIGl0IG9ubHkgd29ya2VkIGR1ZSB0byBsdWNrLCBhbmQgbm90IGF0IGFsbCBvbiBzb21lIGhhcmR3YXJlLgorCSAgTm93IHdlIGV4cGxpY2l0bHkgYWR2ZXJ0aXNlIHdoYXQgZm9ybWF0cyB0aGUgaGFyZHdhcmUgc3VwcG9ydHMsIGFuZCB0aGVuCisJICBjb25maWd1cmUgdGhlIHNlbGVjdGVkIG9uZSBjb3JyZWN0bHkuCisKKzIwMDgtMDgtMjYgMTI6Mjc6MTEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgc3lzL3Y0bDIvOiBGaXggbWVtb3J5IGxlYWtzLiBTbWFsbCBjb2RlIGNsZWFudXBzIDogTm8gbmVlZCBmb3IgZW1wdHkgX2luaXQoKS4gTm8gbmVlZCB0byBtZW1zZXQgaW5zdGFuY2Ugc3RydWN0dXJlcy4gLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkgICogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICBGaXggbWVtb3J5IGxlYWtzLiBTbWFsbCBjb2RlIGNsZWFudXBzIDogTm8gbmVlZCBmb3IgZW1wdHkgX2luaXQoKS4gTm8KKwkgIG5lZWQgdG8gbWVtc2V0IGluc3RhbmNlIHN0cnVjdHVyZXMuIFNvbWUgbW9yZSBGSVhNRSdzLgorCisyMDA4LTA4LTI2IDA4OjExOjI2ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHRlc3RzL2ljbGVzLy5jdnNpZ25vcmU6IElnbm9yZSBtb3JlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2ljbGVzLy5jdnNpZ25vcmU6CisJICBJZ25vcmUgbW9yZS4KKworMjAwOC0wOC0yNiAwODowMDo1NyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvOiBJZ25vcmUgZmlsZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vLmN2c2lnbm9yZToKKwkgICogZ3N0L2dvb20yazEvLmN2c2lnbm9yZToKKwkgIElnbm9yZSBmaWxlcy4KKworMjAwOC0wOC0yNiAwNzo1MTo0MiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzogRml4IGNvbXBpbGVyIHdhcm5pbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJICBGaXggY29tcGlsZXIgd2FybmluZy4KKworMjAwOC0wOC0yNiAwNTo0MjoxNSArMDAwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkgIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOiBGaXggb2J2aW91cyBtZW1sZWFrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOiBGaXggb2J2aW91cyBtZW1sZWFrLgorCisyMDA4LTA4LTI1IDE0OjE1OjQzICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvbWF0cm9za2EvOiBBZGQgUmVhbFtBdWRpb3xWaWRlb10gc3VwcG9ydCB0byBNYXRyb3NrYSBjb250YWluZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X3NlbmRfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF92aWRlb19jYXBzKSwgKGdzdF9tYXRyb3NrYV9kZW11eF9hdWRpb19jYXBzKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9tdXhfdmlkZW9fcGFkX3NldGNhcHMpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfYXVkaW9fcGFkX3NldGNhcHMpLCAoZ3N0X21hdHJvc2thX211eF9maW5pc2gpOgorCSAgQWRkIFJlYWxbQXVkaW98VmlkZW9dIHN1cHBvcnQgdG8gTWF0cm9za2EgY29udGFpbmVycy4KKwkgIEl0IHdvcmtzIGZpbmUgZm9yOgorCSAgKiBkZWNvZGluZyByZWFsIGF1ZGlvL3ZpZGVvIHN0cmVhbXMgY29udGFpbmVkIGluIG1rdgorCSAgKiAndHJhbnNtdXhpbmcnIHJlYWwgKC5ybSkgZmlsZXMgaW50byAubWt2IGZpbGVzCisJICBJdCB3aWxsIG5vdCB3b3JrIHRob3VnaCBmb3IgZW5jb2RpbmcgcmVhbFthdWRpby92aWRlb10gc3RyZWFtcyB0aGF0CisJICBkb24ndCBjb250YWluIHRoZSAnbWRwcl9kYXRhJyBleHRyYSBkYXRhIG9uIHRoZSBjYXBzLgorCSAgVGhlIHJlYXNvbiB3aHkgdGhpcyB3aWxsIG5vdCB3b3JrIGlzIGJlY2F1c2UgSSBuZXZlciBpbnRlbmRlZCB0bworCSAgZHVwbGljYXRlIHZpcnR1YWxseSBhbGwgdGhlICdtZHByJyBibG9jayBjcmVhdGlvbiBpbnRvIG1rdm11eC4KKwkgIEZpeGVzICM1MzYwNjcKKworMjAwOC0wOC0yNSAwOTo0ODowNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2xhdy86IFRoZSBlbmNvZGVyIGNhbid0IHJlYWxseSByZW5lZ290aWF0ZSBhdCB0aGUgdGltZSB0aGV5IHBlcmZvcm0gYSBwYWQtYWxsb2Mgc28gbWFrZSB0aGUgc3JjcGFkcyB1c2UgZml4ZWQgY2Fwcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6IChnc3RfYWxhd19lbmNfaW5pdCksIChnc3RfYWxhd19lbmNfY2hhaW4pOgorCSAgKiBnc3QvbGF3L211bGF3LWNvbnZlcnNpb24uYzoKKwkgICogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzogKGdzdF9tdWxhd2VuY19pbml0KSwKKwkgIChnc3RfbXVsYXdlbmNfY2hhaW4pOgorCSAgVGhlIGVuY29kZXIgY2FuJ3QgcmVhbGx5IHJlbmVnb3RpYXRlIGF0IHRoZSB0aW1lIHRoZXkgcGVyZm9ybSBhCisJICBwYWQtYWxsb2Mgc28gbWFrZSB0aGUgc3JjcGFkcyB1c2UgZml4ZWQgY2Fwcy4KKwkgIENoZWNrIHRoZSBidWZmZXIgc2l6ZSBhZnRlciBhIHBhZC1hbGxvYyBiZWNhdXNlIHRoZSByZXR1cm5lZCBzaXplIG1pZ2h0CisJICBub3QgYmUgcmlnaHQgd2hlbiB0aGUgZG93bnN0cmVhbSBlbGVtZW50IGRvZXMgbm90IGtub3cgdGhlIHNpemUgb2YgdGhlCisJICBuZXcgYnVmZmVyIChjYXBzZmlsdGVyKS4gRml4ZXMgIzU0OTA3My4KKworMjAwOC0wOC0yMyAxNTo0Mzo0OSArMDAwMCAgRmlsaXBwbyBBcmdpb2xhcyA8ZmlsaXBwby5hcmdpb2xhc0BnbWFpbC5jb20+CisKKwkgIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOiB2NGwyc3JjIGRvZXNuJ3QgaGF2ZSBhIHByb3BlcnR5IG5hbWVkICJub3JtIiBzbyBkb24ndCB0cnkgdG8gbm90aWZ5IGFib3V0IGNoYW5nZXMgdG8gdGhhdCBwci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogRmlsaXBwbyBBcmdpb2xhcyA8ZmlsaXBwbyBkb3QgYXJnaW9sYXMgYXQgZ21haWwgZG90IGNvbT4KKwkgICogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmM6IChnc3RfdjRsMl90dW5lcl9zZXRfbm9ybV9hbmRfbm90aWZ5KToKKwkgIHY0bDJzcmMgZG9lc24ndCBoYXZlIGEgcHJvcGVydHkgbmFtZWQgIm5vcm0iIHNvIGRvbid0IHRyeSB0byBub3RpZnkKKwkgIGFib3V0IGNoYW5nZXMgdG8gdGhhdCBwcm9wZXJ0eS4gVGhlICJub3JtIiBwcm9wZXJ0eSBhbmQgcmVsYXRlZAorCSAgY29kZSBhcmUgY29tbWVudGVkIG91dCBjdXJyZW50bHkuIEZpeGVzIGJ1ZyAjNTQ5MDkwLgorCisyMDA4LTA4LTIzIDE1OjMzOjQ5ICswMDAwICBNaWtlIFJ1cHJlY2h0IDxjbWFpa3VAZ21haWwuY29tPgorCisJICBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6IFJlcHJvYmUgZGV2aWNlcyBhZ2FpbiBpbnN0ZWFkIG9mIHRha2luZyBhIGNhY2hlZCBsaXN0IGFzIG5ldyBkZXZpY2VzIGNvdWxkJ3ZlIGJlZW4gcGx1Z2dlZCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE1pa2UgUnVwcmVjaHQgPGNtYWlrdSBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6IChnc3RfdjRsMl9jbGFzc19wcm9iZV9kZXZpY2VzKToKKwkgIFJlcHJvYmUgZGV2aWNlcyBhZ2FpbiBpbnN0ZWFkIG9mIHRha2luZyBhIGNhY2hlZCBsaXN0IGFzIG5ldworCSAgZGV2aWNlcyBjb3VsZCd2ZSBiZWVuIHBsdWdnZWQgaW4uIEZpeGVzIGJ1ZyAjNTQ5MDYyLgorCisyMDA4LTA4LTIyIDE2OjA0OjAyICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9hdXRvZGV0ZWN0L01ha2VmaWxlLmFtOiBEb24ndCBsaW5rIHRoZSBhdXRvZGV0ZWN0IHBsdWdpbiB3aXRoIEdDb25mIGFzIGl0IGRvZXNuJ3QgdXNlIEdDb25mLiBGaXhlcyBidWcgIzU0NTQ2My4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXV0b2RldGVjdC9NYWtlZmlsZS5hbToKKwkgIERvbid0IGxpbmsgdGhlIGF1dG9kZXRlY3QgcGx1Z2luIHdpdGggR0NvbmYgYXMgaXQgZG9lc24ndAorCSAgdXNlIEdDb25mLiBGaXhlcyBidWcgIzU0NTQ2My4KKworMjAwOC0wOC0yMiAxMjoyNDoyMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IENoYW5nZSBzb21lIEdTVF9FTEVNRU5UX0VSUk9ScyB0byBHU1RfRVJST1JfT0JKRUNUIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gaWdub3JlIGVycm9ycyBhbmQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChnc3RfZWJtbF9yZWFkX2VsZW1lbnRfaWQpLAorCSAgKGdzdF9lYm1sX3JlYWRfZWxlbWVudF9sZW5ndGgpLCAoZ3N0X2VibWxfcmVhZF91aW50KSwKKwkgIChnc3RfZWJtbF9yZWFkX3NpbnQpLCAoZ3N0X2VibWxfcmVhZF9mbG9hdCksCisJICAoZ3N0X2VibWxfcmVhZF9oZWFkZXIpOgorCSAgQ2hhbmdlIHNvbWUgR1NUX0VMRU1FTlRfRVJST1JzIHRvIEdTVF9FUlJPUl9PQkpFQ1QgdG8gbWFrZSBpdAorCSAgcG9zc2libGUgdG8gaWdub3JlIGVycm9ycyBhbmQgbm90IHBvc3QgYW55IEVSUk9SIG1lc3NhZ2VzIG9uCisJICB0aGUgYnVzLgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfY29udGVudHMpOgorCSAgSWdub3JlIGFueSBlcnJvcnMgYW5kIG5vdCBqdXN0IEVPUyB3aGVuIHBhcnNpbmcgdGhlIGNvbnRlbnRzIG9mCisJICBhIFNlZWtIZWFkLiBFcnJvcnMgaGVyZSBhcmUgdXN1YWxseSBjYXVzZWQgYnkgdHJ1bmNhdGVkIGZpbGVzCisJICBhbmQgcGxheWJhY2sgb2YgdGhlIGZpbGUgd29ya3MgZmluZS4gRml4ZXMgcGxheWJhY2sgb2YgdGhlCisJICBhdWRpb19vbmx5X2NoYXB0ZXJfc2Vla2Jyb2tlbi5ta2EgZmlsZSBmcm9tIHRoZSBNUGxheWVyIHNhbXBsZXMKKwkgIGFyY2hpdmUuCisKKzIwMDgtMDgtMjIgMTE6Mjk6MjYgKzAwMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkgIGdzdC9tdWx0aXBhcnQvOiBDb25mb3JtIHRvIFJGQzIwNDYuIGF1ZGlvL2Jhc2ljIGlzIG11bGF3IDgwMDBIeiBtb25vLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzoKKwkgIENvbmZvcm0gdG8gUkZDMjA0Ni4gYXVkaW8vYmFzaWMgaXMgbXVsYXcgODAwMEh6IG1vbm8uCisKKzIwMDgtMDgtMjEgMjE6NTY6MTkgKzAwMDAgIE9sZSBBbmRyw6kgVmFkbGEgUmF2bsOlcyA8b2xlLmFuZHJlLnJhdm5hc0B0YW5kYmVyZy5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6CisJICBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jIChnc3RfZGlyZWN0ZHJhd19zaW5rX2J1ZmZlcl9hbGxvYywgZ3N0X2RpcmVjdGRyYXdfc2lua19idWZmZXJwb29sX2NsZWFyKToKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jIChnc3RfZGlyZWN0ZHJhd19zaW5rX2J1ZmZlcl9hbGxvYywKKwkgIGdzdF9kaXJlY3RkcmF3X3NpbmtfYnVmZmVycG9vbF9jbGVhcik6CisJICBGaXggdHdvIG1vcmUgYnVmZmVyIHJlZiBsZWFrcy4KKworMjAwOC0wOC0yMSAxNToyODowOSArMDAwMCAgT2xlIEFuZHLDqSBWYWRsYSBSYXZuw6VzIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KKworCSAgc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzogRml4IGJ1ZmZlciByZWYgbGVhay4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9sZSBBbmRyw6kgVmFkbGEgUmF2bsOlcyAgPG9sZS5hbmRyZS5yYXZuYXMgYXQgdGFuZGJlcmcgY29tPgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jOgorCSAgKGdzdF9kaXJlY3RkcmF3X3Npbmtfc2hvd19mcmFtZSk6CisJICBGaXggYnVmZmVyIHJlZiBsZWFrLgorCisyMDA4LTA4LTIxIDEzOjI3OjEyICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IFJldmVydCB0aGUgbGFzdCBjb21taXQuIHdhdmVuYyBzdGlsbCBzdXBwb3J0cyB3aWR0aCE9ZGVwdGggZm9yIDMyIGJpdCB3aWR0aC4gVGhhbmtzIFRpbS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiAoZ3N0X3dhdmVuY19jaGFpbik6CisJICBSZXZlcnQgdGhlIGxhc3QgY29tbWl0LiB3YXZlbmMgc3RpbGwgc3VwcG9ydHMgd2lkdGghPWRlcHRoIGZvciAzMiBiaXQKKwkgIHdpZHRoLiBUaGFua3MgVGltLgorCisyMDA4LTA4LTIxIDEzOjIyOjA2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiBJZiB0aGUgZHVyYXRpb24gb2YgYSBibG9jayBpcyB1bmtub3duIG9ubHkgdXNlIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSBmaXJzdCBsYWNlIGFuZCB1cy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrKToKKwkgIElmIHRoZSBkdXJhdGlvbiBvZiBhIGJsb2NrIGlzIHVua25vd24gb25seSB1c2UgdGhlIHRpbWVzdGFtcCBmb3IgdGhlCisJICBmaXJzdCBsYWNlIGFuZCB1c2UgR1NUX0NMT0NLX1RJTUVfTk9ORSBhcyBkdXJhdGlvbiBmb3IgdGhlIGZvbGxvd2luZworCSAgbGFjZXMuIE90aGVyd2lzZSBldmVyeSBsYWNlIGhhcyB0aGUgc2FtZSB0aW1lc3RhbXAgd2hpY2ggbGVhZHMgdG8KKwkgIHZhcmlvdXMgcHJvYmxlbXMuIFJlYWxseSBmaXhlcyBidWcgIzU0ODgzMS4KKworMjAwOC0wOC0yMSAxMjo1NjowMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiBJZiB3ZSdyZSBub3QgYWxsb3dpbmcgd2lkdGghPWRlcHRoIGluIHdhdmVuYyB3ZSBzaG91bGQgYWxzbyBkaXNhYmxlIHRoZSBjb2RlIHRoYXQgd2FzIGFkZGVkIHQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiAoZ3N0X3dhdmVuY19jaGFpbik6CisJICBJZiB3ZSdyZSBub3QgYWxsb3dpbmcgd2lkdGghPWRlcHRoIGluIHdhdmVuYyB3ZSBzaG91bGQgYWxzbyBkaXNhYmxlCisJICB0aGUgY29kZSB0aGF0IHdhcyBhZGRlZCB0byBzdXBwb3J0IHdpZHRoIT1kZXB0aC4KKworMjAwOC0wOC0yMSAxMjo1Mjo0NyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogRG9uJ3QgY2FsY3VsYXRlIHRoZSBkZWZhdWx0IGR1cmF0aW9uIG9mIGEgZnJhbWUgZnJvbSB0aGUgYXVkaW8gc2FtcGxpbmcgcmF0ZS4gVGhpcyBvbmwuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfc3RyZWFtKToKKwkgIERvbid0IGNhbGN1bGF0ZSB0aGUgZGVmYXVsdCBkdXJhdGlvbiBvZiBhIGZyYW1lIGZyb20gdGhlIGF1ZGlvIHNhbXBsaW5nCisJICByYXRlLiBUaGlzIG9ubHkgd29ya3MgZm9yIHJhdyBhdWRpbyBpZiBldmVyeSBmcmFtZSBjb250YWlucyBhIHNpbmdsZQorCSAgc2FtcGxlIGFuZCByZXN1bHRzIGluIGJyb2tlbiBidWZmZXIgZHVyYXRpb25zIGZvciBvdGhlciBmb3JtYXRzCisJICBpZiBubyBzcGVjaWZpZWQgZGVmYXVsdCBkdXJhdGlvbiBpcyBnaXZlbiBvciB0aGUgYmxvY2tzIGhhdmUgbm8KKwkgIGR1cmF0aW9uLiBGaXhlcyBidWcgIzU0ODgzMS4KKworMjAwOC0wOC0yMSAxMjozNDozMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogQWxsb3cgemVybyBzaXplZCBibG9ja3MgaW5zdGVhZCBvZiByZXR1cm5pbmcgR1NUX0ZMT1dfT0suIFN1Y2ggYmxvY2tzIGFyZSB1c2VkIGZvciB0ZXguLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayk6CisJICBBbGxvdyB6ZXJvIHNpemVkIGJsb2NrcyBpbnN0ZWFkIG9mIHJldHVybmluZyBHU1RfRkxPV19PSy4gU3VjaCBibG9ja3MKKwkgIGFyZSB1c2VkIGZvciB0ZXh0L3BsYWluIHN1YnRpdGxlcyBhcyBhIGdhcC1maWxsZXIgaW4gc29tZSBmaWxlcy4KKworMjAwOC0wOC0yMSAxMjoxMjowMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiBBZGQgUzkxMCBhbmQgUFdDIGZvcm1hdHMgd2l0aCBhIGxvdyBwcmlvcml0eS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY192NGwyZm91cmNjX3RvX3N0cnVjdHVyZSksCisJICAoZ3N0X3Y0bDJfZ2V0X2NhcHNfaW5mbyk6CisJICBBZGQgUzkxMCBhbmQgUFdDIGZvcm1hdHMgd2l0aCBhIGxvdyBwcmlvcml0eS4KKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfZm9ybWF0X2dldF9yYW5rKSwKKwkgIChnc3RfdjRsMnNyY19wcm9iZV9jYXBzX2Zvcl9mb3JtYXQpOgorCSAgQWRkIG1vcmUgZGVidWdnaW5nLgorCisyMDA4LTA4LTIwIDIxOjU0OjM1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IEZpeCBjb21waWxhdGlvbiBhZ2FpbnN0IG9sZGVyIGxpYmZsYWMgdmVyc2lvbnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgRml4IGNvbXBpbGF0aW9uIGFnYWluc3Qgb2xkZXIgbGliZmxhYyB2ZXJzaW9ucy4KKworMjAwOC0wOC0yMCAxNzo0Njo0OCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvcHVsc2UvOiBVc2UgR1NUX0JPSUxFUlBMQVRFIGV2ZXJ5d2hlcmUgYW5kIGZpeCBjb2Rpbmcgc3R5bGUgYXQgc29tZSBwbGFjZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3B1bHNlL3B1bHNlbWl4ZXIuYzogKGdzdF9wdWxzZW1peGVyX2NsYXNzX2luaXQpLAorCSAgKGdzdF9wdWxzZW1peGVyX3NldF9wcm9wZXJ0eSksIChnc3RfcHVsc2VtaXhlcl9nZXRfcHJvcGVydHkpOgorCSAgKiBleHQvcHVsc2UvcHVsc2VtaXhlcmN0cmwuYzogKGdzdF9wdWxzZW1peGVyX2N0cmxfc3Vic2NyaWJlX2NiKSwKKwkgIChnc3RfcHVsc2VtaXhlcl9jdHJsX29wZW4pLCAoZ3N0X3B1bHNlbWl4ZXJfY3RybF90aW1lb3V0X2V2ZW50KSwKKwkgIChnc3RfcHVsc2VtaXhlcl9jdHJsX3NldF92b2x1bWUpOgorCSAgKiBleHQvcHVsc2UvcHVsc2VtaXhlcnRyYWNrLmM6IChnc3RfcHVsc2VtaXhlcl90cmFja19uZXcpOgorCSAgKiBleHQvcHVsc2UvcHVsc2Vwcm9iZS5jOiAoZ3N0X3B1bHNlcHJvYmVfb3Blbik6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzogKGdzdF9wdWxzZXNpbmtfY2xhc3NfaW5pdCksCisJICAoZ3N0X3B1bHNlc2lua19pbml0KSwgKGdzdF9wdWxzZXNpbmtfb3BlbiksCisJICAoZ3N0X3B1bHNlc2lua19wcmVwYXJlKSwgKGdzdF9wdWxzZXNpbmtfd3JpdGUpLAorCSAgKGdzdF9wdWxzZXNpbmtfZGVsYXkpLCAoZ3N0X3B1bHNlc2lua19yZXNldCk6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOiAoZ3N0X3B1bHNlc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9wdWxzZXNyY19pbml0KToKKwkgIFVzZSBHU1RfQk9JTEVSUExBVEUgZXZlcnl3aGVyZSBhbmQgZml4IGNvZGluZyBzdHlsZSBhdCBzb21lIHBsYWNlcy4KKwkgIEZpeCBhIGxvY2tpbmcgaXNzdWUgaW4gcHVsc2VzaW5rJ3MgcHJlcGFyZSBmdW5jdGlvbi4KKwkgICogZXh0L3B1bHNlL3B1bHNldXRpbC5jOiAoZ3N0X3B1bHNlX2NoYW5uZWxfbWFwX3RvX2dzdCk6CisJICBDaGVjayBpZiB0aGUgY3JlYXRlZCBjaGFubmVsIGxheW91dCBpcyB2YWxpZCBmb3IgR1N0cmVhbWVyLgorCisyMDA4LTA4LTIwIDE3OjQyOjIxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwZ29vZ2xlLmM6IFRoaW5ncyB0aGF0IGNhbiBoYXBwZW4gd2hlbiB5b3VyIGJyYWluIGlzIGluIGdvb2dsZSBtb2RlIHRyeWluZyB0byBkZWFsIHdpdGggdGhlaXIgZ29vZ2xlIHIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwZ29vZ2xlLmM6CisJICBUaGluZ3MgdGhhdCBjYW4gaGFwcGVuIHdoZW4geW91ciBicmFpbiBpcyBpbiBnb29nbGUgbW9kZSB0cnlpbmcgdG8KKwkgIGRlYWwgd2l0aCB0aGVpciBnb29nbGUgcnRzcCBzZXJ2ZXIgZXh0ZW5zaW9ucyBhbmQgdHJ5aW5nIHRvIHR5cGUgeW91cgorCSAgZ29vZ2xlIG1haWwgYWNjb3VudC4KKworMjAwOC0wOC0yMCAxNzozMDoxOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvOiBBZGQgZ29vZ2xlIFJUU1AgZXh0ZW5zaW9uLCBpdCBjYW4gb25seSBoYW5kbGUgdWRwIGFuZCByZXNwb25kcyB3aXRoIHVuc3VwcG9ydGVkIGlmIHdlIGRvIGFueXRoaW5nIGVsc2UuIEZpLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHNwL2dzdHJ0c3AuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcGdvb2dsZS5jOiAoZ3N0X3J0c3BfZ29vZ2xlX2JlZm9yZV9zZW5kKSwKKwkgIChnc3RfcnRzcF9nb29nbGVfYWZ0ZXJfc2VuZCksIChnc3RfcnRzcF9nb29nbGVfZ2V0X3RyYW5zcG9ydHMpLAorCSAgKF9kb19pbml0KSwgKGdzdF9ydHNwX2dvb2dsZV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHNwX2dvb2dsZV9jbGFzc19pbml0KSwgKGdzdF9ydHNwX2dvb2dsZV9pbml0KSwKKwkgIChnc3RfcnRzcF9nb29nbGVfZmluYWxpemUpLCAoZ3N0X3J0c3BfZ29vZ2xlX2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3J0c3BfZ29vZ2xlX2V4dGVuc2lvbl9pbml0KToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcGdvb2dsZS5oOgorCSAgQWRkIGdvb2dsZSBSVFNQIGV4dGVuc2lvbiwgaXQgY2FuIG9ubHkgaGFuZGxlIHVkcCBhbmQgcmVzcG9uZHMgd2l0aAorCSAgdW5zdXBwb3J0ZWQgaWYgd2UgZG8gYW55dGhpbmcgZWxzZS4gRml4ZXMgIzU0NjQ2NS4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfY29ubmVjdGlvbl9zZW5kKSwKKwkgIChnc3RfcnRzcHNyY19jb25uZWN0aW9uX3JlY2VpdmUpLCAoZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCksCisJICAoZ3N0X3J0c3BzcmNfY3JlYXRlX3RyYW5zcG9ydHNfc3RyaW5nKSwKKwkgIChnc3RfcnRzcHNyY19zZXR1cF9zdHJlYW1zKSwgKGdzdF9ydHNwc3JjX29wZW4pLAorCSAgKGdzdF9ydHNwc3JjX2Nsb3NlKSwgKGdzdF9ydHNwc3JjX3BhdXNlKToKKwkgIE1ha2UgdHJhbnNwb3J0IHNldHVwIGNvZGUgYSBiaXQgYmV0dGVyIHVzaW5nIEdTdHJpbmcuCisJICBBZGQgc29tZSBtb3JlIGRlYnVnLgorCSAgQ2hlY2sgZm9yIGNsb3NlZCBjb25uZWN0aW9ucyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgb24gdGhlbS4KKworMjAwOC0wOC0yMCAxNzoxNzo1NSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvcHVsc2UvOiBJZiBkb3duc3RyZWFtIHByb3ZpZGVzIG5vIGNoYW5uZWwgbGF5b3V0IGFuZCA+MiBjaGFubmVscyBzaG91bGQgYmUgdXNlZCB1c2UgdGhlIGRlZmF1bHQgbGF5b3V0IHRoYXQgcHVsc2UuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvcHVsc2UvcHVsc2VzcmMuYzogKGdzdF9wdWxzZXNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfcHVsc2VzcmNfY3JlYXRlX3N0cmVhbSksIChnc3RfcHVsc2VzcmNfbmVnb3RpYXRlKSwKKwkgIChnc3RfcHVsc2VzcmNfcHJlcGFyZSk6CisJICAqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzogKGdzdF9wdWxzZV9nc3RfdG9fY2hhbm5lbF9tYXApLAorCSAgKGdzdF9wdWxzZV9jaGFubmVsX21hcF90b19nc3QpOgorCSAgKiBleHQvcHVsc2UvcHVsc2V1dGlsLmg6CisJICBJZiBkb3duc3RyZWFtIHByb3ZpZGVzIG5vIGNoYW5uZWwgbGF5b3V0IGFuZCA+MiBjaGFubmVscyBzaG91bGQgYmUKKwkgIHVzZWQgdXNlIHRoZSBkZWZhdWx0IGxheW91dCB0aGF0IHB1bHNlYXVkaW8gY2hvb3NlcyBhbmQgYWxzbworCSAgYWRkIHRoaXMgbGF5b3V0IHRvIHRoZSBjYXBzLiBGaXhlcyBidWcgIzU0NzI1OC4KKworMjAwOC0wOC0yMCAxMTo1MTozOCArMDAwMCAgUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2pAYXhpcy5jb20+CisKKwkgIGdzdC91ZHAvOiBBdm9pZCBsZWFraW5nIGludGVybmFsbHkgYWxsb2NhdGVkIGZpbGUgZGVzY3JpcHRvcnMgd2hlbiBzZXR0aW5nIGN1c3RvbSBmaWxlIGRlc2NyaXB0b3JzLiBGaXhlcyAjNTQzMTAxLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2ogYXQgYXhpcyBjb20+CisJICAqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOiAoZ3N0X2R5bnVkcHNpbmtfaW5pdCksCisJICAoZ3N0X2R5bnVkcHNpbmtfZmluYWxpemUpLCAoZ3N0X2R5bnVkcHNpbmtfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfZHludWRwc2lua19pbml0X3NlbmQpLCAoZ3N0X2R5bnVkcHNpbmtfY2xvc2UpOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19pbml0KSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX2ZpbmFsaXplKSwgKGdzdF9tdWx0aXVkcHNpbmtfc2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfZmluYWxpemUpLAorCSAgKGdzdF91ZHBzcmNfc2V0X3Byb3BlcnR5KToKKwkgIEF2b2lkIGxlYWtpbmcgaW50ZXJuYWxseSBhbGxvY2F0ZWQgZmlsZSBkZXNjcmlwdG9ycyB3aGVuIHNldHRpbmcKKwkgIGN1c3RvbSBmaWxlIGRlc2NyaXB0b3JzLiBGaXhlcyAjNTQzMTAxLgorCisyMDA4LTA4LTIwIDExOjQ4OjQ2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IERvbid0IHRyeSB0byBjb25maWd1cmUgUlRDUCBiYWNrIHRvIHRoZSBzZXJ2ZXIgd2hlbiB0aGUgc2VydmVyIGRpZCBub3QgZ2l2ZSB1cyBhIHZhbGlkIHBvcnQgbnUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3VkcF9zaW5rKToKKwkgIERvbid0IHRyeSB0byBjb25maWd1cmUgUlRDUCBiYWNrIHRvIHRoZSBzZXJ2ZXIgd2hlbiB0aGUgc2VydmVyIGRpZCBub3QKKwkgIGdpdmUgdXMgYSB2YWxpZCBwb3J0IG51bWJlci4KKworMjAwOC0wOC0yMCAxMDo1OTo1MiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IFVzZSBuZXcgYmFzZXRyYW5zZm9ybSBtZXRob2QgdG8gcmVuZWdvdGlhdGUuIEZpeGVzICM1NDQ5NTYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X3NldF9wcm9wZXJ0eSk6CisJICBVc2UgbmV3IGJhc2V0cmFuc2Zvcm0gbWV0aG9kIHRvIHJlbmVnb3RpYXRlLiBGaXhlcyAjNTQ0OTU2LgorCSAgKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvaWNsZXMvdmlkZW9ib3gtdGVzdC5jOiAobWFrZV9waXBlbGluZSksIChtYWluKToKKwkgIEFkZCB2aWRlb2JveCByZW5lZ290aWF0aW9uIGV4YW1wbGUuCisKKzIwMDgtMDgtMTkgMjE6MDM6MjIgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiBSZW1vdmUgZGVwdGggcmFuZ2VzIGFuZCByZXBsYWNlIHdpdGggc2FuZSB2YWx1ZXMuICBGaXhlcyAjNTQ4NTMwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IFJlbW92ZSBkZXB0aCByYW5nZXMgYW5kIHJlcGxhY2UKKwkgIHdpdGggc2FuZSB2YWx1ZXMuICBGaXhlcyAjNTQ4NTMwLgorCisyMDA4LTA4LTE4IDE1OjA1OjMyICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC9wdWxzZS86IFRoZSBieXRlc19wZXJfc2FtcGxlIGFuZCBzaWxlbmNlX3NhbXBsZSBmaWVsZHMgb2YgdGhlIEdzdFJpbmdCdWZmZXJTcGVjIGFyZSBhbHJlYWR5IGZpbGxlZCB3aXRoIHRoZSBjb3JyZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzogKGdzdF9wdWxzZXNpbmtfcHJlcGFyZSk6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOiAoZ3N0X3B1bHNlc3JjX3ByZXBhcmUpOgorCSAgVGhlIGJ5dGVzX3Blcl9zYW1wbGUgYW5kIHNpbGVuY2Vfc2FtcGxlIGZpZWxkcyBvZiB0aGUgR3N0UmluZ0J1ZmZlclNwZWMKKwkgIGFyZSBhbHJlYWR5IGZpbGxlZCB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlcyBieQorCSAgZ3N0X3JpbmdfYnVmZmVyX3BhcnNlX2NhcHMoKSBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gc2V0IHRoZW0gYWdhaW4KKwkgIHdpdGggd3JvbmcgdmFsdWVzLgorCisyMDA4LTA4LTE2IDE0OjU0OjU2ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IFNvbWUgQVZJIDIuMCAoT0RNTCkgZmlsZXMgZG9uJ3QgcmVzcGVjdCB0aGUgJ3NwZWNpZmljYXRpb25zJyBjb21wbGV0ZWx5IGFuZCBpbnN0ZWFkIG9mIHVzaW5nIHQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3JlYWRfc3ViaW5kZXhlc19wdWxsKSwKKwkgIChnc3RfYXZpX2RlbXV4X3JlYWRfc3ViaW5kZXhlc19wdXNoKToKKwkgIFNvbWUgQVZJIDIuMCAoT0RNTCkgZmlsZXMgZG9uJ3QgcmVzcGVjdCB0aGUgJ3NwZWNpZmljYXRpb25zJyBjb21wbGV0ZWx5CisJICBhbmQgaW5zdGVhZCBvZiB1c2luZyB0aGUgJ2l4IyMnIG5vbWVuY2xhdHVyZSwgdXNlICcjI2l4Jy4KKwkgIFRoZXkncmUgc3RpbGwgdmFsaWQgdGhvdWdoLCB0aGlzIGZpeGVzIHRoZSBkdXJhdGlvbiBhbmQgaW5kZXhlcyBmb3IKKwkgIHZpcnR1YWxseSBhbGwgdGhlIE9ETUwgZmlsZXMgSSBoYXZlLgorCisyMDA4LTA4LTE1IDE3OjI2OjE4ICswMDAwICBPbGl2aWVyIENyZXRlIDx0ZXN0ZXJAdGVzdGVyLmNhPgorCisJICBnc3QvcnRwLzogVXBkYXRlIHRoZSB2b3JiaXMgUlRQIHBheS9kZXBheSB0byBSRkMgNTIxNS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9saXZpZXIgQ3JldGUgPHRlc3RlciBhdCB0ZXN0ZXIgZG90IGNhPgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6IChnc3RfcnRwX3ZvcmJpc19kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX3ZvcmJpc19kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzogKGdzdF9ydHBfdm9yYmlzX3BheV9maW5pc2hfaGVhZGVycyk6CisJICBVcGRhdGUgdGhlIHZvcmJpcyBSVFAgcGF5L2RlcGF5IHRvIFJGQyA1MjE1LgorCSAgRml4ZXMgIzU0Nzg0Mi4KKworMjAwOC0wOC0xNCAyMjowNzowMiArMDAwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQWRkICdoZHY2JyBhcyBhIEhEViBmb3JtYXQgZm9yIDEwODBpLzYwIHdpdGggMzoyIHB1bGxkb3duLCBpLmUuLCAyNHAuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGQgJ2hkdjYnIGFzIGEgSERWIGZvcm1hdCBmb3IgMTA4MGkvNjAKKwkgIHdpdGggMzoyIHB1bGxkb3duLCBpLmUuLCAyNHAuCisKKzIwMDgtMDgtMTQgMTI6NDc6MDkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6IEZpeCBjb21waWxhdGlvbiBzb21lIG1vcmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIEZpeCBjb21waWxhdGlvbiBzb21lIG1vcmUuCisKKzIwMDgtMDgtMTQgMTE6NDQ6NTkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogUmVxdWlyZSAtYmFzZSBDVlMgZm9yIHdhdnBhcnNlIGFjaWQgY2h1bmsgcGFyc2luZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6OgorCSAgUmVxdWlyZSAtYmFzZSBDVlMgZm9yIHdhdnBhcnNlIGFjaWQgY2h1bmsgcGFyc2luZy4KKworMjAwOC0wOC0xMyAxMzo1NzowMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvcHVsc2UvcHVsc2VzaW5rLio6IEFkZCAiZGV2aWNlLW5hbWUiIHByb3BlcnR5IHRvIHB1bHNlc2luayB0b28gYW5kIGN1cnJlbnRseSBjb21tZW50ZWQgb3V0IGFuZCBub3Qgd29ya2luZyBzdXBwb3IuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6IChnc3RfcHVsc2VzaW5rX2NsYXNzX2luaXQpLAorCSAgKGdzdF9wdWxzZXNpbmtfaW5pdCksIChnc3RfcHVsc2VzaW5rX2ZpbmFsaXplKSwKKwkgIChnc3RfcHVsc2VzaW5rX3NldF92b2x1bWUpLCAoZ3N0X3B1bHNlc2lua19nZXRfdm9sdW1lKSwKKwkgIChnc3RfcHVsc2VzaW5rX3NldF9wcm9wZXJ0eSksIChnc3RfcHVsc2VzaW5rX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3B1bHNlc2lua19wcmVwYXJlKSwgKGdzdF9wdWxzZXNpbmtfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSAgQWRkICJkZXZpY2UtbmFtZSIgcHJvcGVydHkgdG8gcHVsc2VzaW5rIHRvbyBhbmQgY3VycmVudGx5IGNvbW1lbnRlZAorCSAgb3V0IGFuZCBub3Qgd29ya2luZyBzdXBwb3J0IGZvciBhICJ2b2x1bWUiIHByb3BlcnR5LgorCisyMDA4LTA4LTEzIDEzOjE3OjE1ICswMDAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJICBjb25maWd1cmUuYWM6IFJlbW92ZSBtb3JlIGNkaW8gc3R1ZmYgKG1vdmVkIHRvIHVnbHkpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgUmVtb3ZlIG1vcmUgY2RpbyBzdHVmZiAobW92ZWQgdG8gdWdseSkKKworMjAwOC0wOC0xMyAxMjozNzoyNiArMDAwMCAgTGFzemxvIFBhbmR5IDxsYXN6bG9rMkBnbWFpbC5jb20+CisKKwkgIGV4dC9wdWxzZS9wdWxzZXNyYy5jOiBBZGQgImRldmljZS1uYW1lIiBwcm9wZXJ0eSwgd2hpY2ggcHJvdmlkZXMgYSBodW1hbiByZWFkYWJsZSBzdHJpbmcgZm9yIHRoZSBhdWRpbyBkZXZpY2UsIHRvIG1hay4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTGFzemxvIFBhbmR5IDxsYXN6bG9rMiBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBleHQvcHVsc2UvcHVsc2VzcmMuYzogKGdzdF9wdWxzZXNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfcHVsc2VzcmNfZ2V0X3Byb3BlcnR5KToKKwkgIEFkZCAiZGV2aWNlLW5hbWUiIHByb3BlcnR5LCB3aGljaCBwcm92aWRlcyBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZworCSAgZm9yIHRoZSBhdWRpbyBkZXZpY2UsIHRvIG1ha2UgaXQgbW9yZSBjb25zaXN0ZW4gd2l0aCBvdGhlciBhdWRpbworCSAgc291cmNlcy4gRml4ZXMgYnVnICM1NDc1MTkuCisKKzIwMDgtMDgtMTMgMTI6MzQ6MTMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3B1bHNlLzogSW1wcm92ZSBkZWJ1Z2dpbmcgYSBiaXQgYnkgaW5jbHVkaW5nIHRoZSBwYXJlbnQgb2JqZWN0IGluIHB1bHNlbWl4ZXJjdHJsIGFuZCBwdWxzZXByb2JlIG9iamVjdHMgYW5kIHVzaW5nLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3B1bHNlL3B1bHNlbWl4ZXIuYzogKGdzdF9wdWxzZW1peGVyX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOiAoZ3N0X3B1bHNlbWl4ZXJfY3RybF9zdWJzY3JpYmVfY2IpLAorCSAgKGdzdF9wdWxzZW1peGVyX2N0cmxfb3BlbiksIChnc3RfcHVsc2VtaXhlcl9jdHJsX25ldyksCisJICAoZ3N0X3B1bHNlbWl4ZXJfY3RybF9mcmVlKSwgKGdzdF9wdWxzZW1peGVyX2N0cmxfdGltZW91dF9ldmVudCk6CisJICAqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5oOgorCSAgKiBleHQvcHVsc2UvcHVsc2Vwcm9iZS5jOiAoZ3N0X3B1bHNlcHJvYmVfb3BlbiksCisJICAoZ3N0X3B1bHNlcHJvYmVfZW51bWVyYXRlKSwgKGdzdF9wdWxzZXByb2JlX25ldyksCisJICAoZ3N0X3B1bHNlcHJvYmVfZnJlZSksIChnc3RfcHVsc2Vwcm9iZV9uZWVkc19wcm9iZSksCisJICAoZ3N0X3B1bHNlcHJvYmVfcHJvYmVfcHJvcGVydHkpLCAoZ3N0X3B1bHNlcHJvYmVfZ2V0X3ZhbHVlcyk6CisJICAqIGV4dC9wdWxzZS9wdWxzZXByb2JlLmg6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzogKGdzdF9wdWxzZXNpbmtfaW5pdCk6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOiAoZ3N0X3B1bHNlc3JjX2luaXQpLCAoZ3N0X3B1bHNlc3JjX2RlbGF5KSwKKwkgIChnc3RfcHVsc2VzcmNfY2hhbmdlX3N0YXRlKToKKwkgIEltcHJvdmUgZGVidWdnaW5nIGEgYml0IGJ5IGluY2x1ZGluZyB0aGUgcGFyZW50IG9iamVjdCBpbiBwdWxzZW1peGVyY3RybAorCSAgYW5kIHB1bHNlcHJvYmUgb2JqZWN0cyBhbmQgdXNpbmcgR1NUX1dBUk5JTkdfT0JKRUNUIGluc3RlYWQgb2YKKwkgIEdTVF9XQVJOSU5HLgorCSAgVXNlIHRoZSBwYXJlbnQgR09iamVjdCBzdWJjbGFzcyBpbnN0ZWFkIG9mIGEgcmFuZG9tIHN0cnVjdCBhcyBHT2JqZWN0CisJICBwYXJhbWV0ZXIgZm9yIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRC4gVGhpcyBmaXhlcyBhIGNyYXNoCisJICB3aGVuIHByb2JpbmcgZm9yIGFub3RoZXIgcHJvcGVydHkgdGhhbiAiZGV2aWNlIi4KKworMjAwOC0wOC0xMyAxMjoyMToyMiArMDAwMCAgTGFzemxvIFBhbmR5IDxsYXN6bG9rMkBnbWFpbC5jb20+CisKKwkgIGV4dC9wdWxzZS9wdWxzZW1peGVyLmM6IEZpeCBwcm9wZXJ0eSBwcm9iaW5nIGFmdGVyIHRoZSBkZXZpY2UgcHJvcGVydHkgaXMgc2V0IGJ5IGNhbGxpbmcgc2V0X3NlcnZlciB3aGVuIHRoZSBzZXJ2ZXIgcC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTGFzemxvIFBhbmR5IDxsYXN6bG9rMiBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBleHQvcHVsc2UvcHVsc2VtaXhlci5jOiAoZ3N0X3B1bHNlbWl4ZXJfc2V0X3Byb3BlcnR5KToKKwkgIEZpeCBwcm9wZXJ0eSBwcm9iaW5nIGFmdGVyIHRoZSBkZXZpY2UgcHJvcGVydHkgaXMgc2V0IGJ5IGNhbGxpbmcKKwkgIHNldF9zZXJ2ZXIgd2hlbiB0aGUgc2VydmVyIHByb3BlcnR5IGNoYW5nZXMuIEZpeGVzIGJ1ZyAjNTQ3NTE4LgorCisyMDA4LTA4LTEzIDEyOjExOjM0ICswMDAwICBMYXN6bG8gUGFuZHkgPGxhc3psb2syQGdtYWlsLmNvbT4KKworCSAgZXh0L3B1bHNlL3B1bHNlbWl4ZXIuYzogRml4IHByb3BlcnR5IHByb2JpbmcgYWZ0ZXIgdGhlIGRldmljZSBwcm9wZXJ0eSBpcyBzZXQgYnkgY2FsbGluZyBzZXRfc2VydmVyIHdoZW4gdGhlIHNlcnZlciBwLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBMYXN6bG8gUGFuZHkgPGxhc3psb2syIGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGV4dC9wdWxzZS9wdWxzZW1peGVyLmM6IChnc3RfcHVsc2VtaXhlcl9zZXRfcHJvcGVydHkpOgorCSAgRml4IHByb3BlcnR5IHByb2JpbmcgYWZ0ZXIgdGhlIGRldmljZSBwcm9wZXJ0eSBpcyBzZXQgYnkgY2FsbGluZworCSAgc2V0X3NlcnZlciB3aGVuIHRoZSBzZXJ2ZXIgcHJvcGVydHkgY2hhbmdlcy4gRml4ZXMgYnVnICM1NDc1MTguCisKKzIwMDgtMDgtMTMgMTI6MDE6MDEgKzAwMDAgIExhc3psbyBQYW5keSA8bGFzemxvazJAZ21haWwuY29tPgorCisJICBleHQvcHVsc2UvOiBJbXBsZW1lbnQgR3N0UHJvcGVydHlQcm9iZSBpbnRlcmZhY2Ugb24gcHVsc2VzaW5rIGZvciBkZXRlY3Rpbmcgc2luayBkZXZpY2VzIGFuZCBvbiBwdWxzZXNyYyBmb3IgZGV0ZWN0aW4uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IExhc3psbyBQYW5keSA8bGFzemxvazIgYXQgZ21haWwgZG90IGNvbT4KKwkgICogZXh0L3B1bHNlL3B1bHNlc2luay5jOiAoZ3N0X3B1bHNlc2lua19pbnRlcmZhY2Vfc3VwcG9ydGVkKSwKKwkgIChnc3RfcHVsc2VzaW5rX2ltcGxlbWVudHNfaW50ZXJmYWNlX2luaXQpLAorCSAgKGdzdF9wdWxzZXNpbmtfaW5pdF9pbnRlcmZhY2VzKSwgKGdzdF9wdWxzZXNpbmtfaW5pdCksCisJICAoZ3N0X3B1bHNlc2lua19maW5hbGl6ZSksIChnc3RfcHVsc2VzaW5rX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3B1bHNlc2lua19nZXRfdHlwZSk6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkgICogZXh0L3B1bHNlL3B1bHNlc3JjLmM6IChnc3RfcHVsc2VzcmNfaW50ZXJmYWNlX3N1cHBvcnRlZCksCisJICAoZ3N0X3B1bHNlc3JjX2luaXRfaW50ZXJmYWNlcyksIChnc3RfcHVsc2VzcmNfaW5pdCksCisJICAoZ3N0X3B1bHNlc3JjX2ZpbmFsaXplKSwgKGdzdF9wdWxzZXNyY19zZXRfcHJvcGVydHkpOgorCSAgKiBleHQvcHVsc2UvcHVsc2VzcmMuaDoKKwkgIEltcGxlbWVudCBHc3RQcm9wZXJ0eVByb2JlIGludGVyZmFjZSBvbiBwdWxzZXNpbmsgZm9yIGRldGVjdGluZworCSAgc2luayBkZXZpY2VzIGFuZCBvbiBwdWxzZXNyYyBmb3IgZGV0ZWN0aW5nIHNvdXJjZSBkZXZpY2VzLgorCSAgRml4ZXMgYnVncyAjNTQ3MjI3IGFuZCAjNTQ3MjE3LgorCisyMDA4LTA4LTEzIDA5OjE3OjIwICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiBEb24ndCB0ZXJtaW5hdGUgb24gZmFicyhpbik+MS4wLiBJbml0IGRvdWJsZXMgYXMgZG91Ymxlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgIERvbid0IHRlcm1pbmF0ZSBvbiBmYWJzKGluKT4xLjAuIEluaXQgZG91YmxlcyBhcyBkb3VibGVzLgorCisyMDA4LTA4LTEzIDA4OjMzOjU3ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IFByb3Blcmx5IHNldCB0aGUgbWF4aW11bSBsYXRlbmN5IHZhbHVlLCBpbiB0aGUgc2FtZSB3YXkgaXQgaXMgZG9uZSBpbiB2NGxzcmMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfcXVlcnkpOgorCSAgUHJvcGVybHkgc2V0IHRoZSBtYXhpbXVtIGxhdGVuY3kgdmFsdWUsIGluIHRoZSBzYW1lIHdheSBpdCBpcyBkb25lIGluCisJICB2NGxzcmMuCisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIFNpbXBsaWZ5IGZyYWN0aW9uIGVxdWFsaXR5IGNoZWNrLCBubyBuZWVkIHRvIHVzZSBHVmFsdWVzIGZvciB0aGlzLgorCisyMDA4LTA4LTEyIDEyOjA0OjI0ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IEFkZCB3YXJuaW5nIG1lc3NhZ2VzIHN0YXRpbmcgZXhhY3RseSB3aHkgdGhlIGxhdGVuY3kgcXVlcnkgZmFpbGVkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogKGdzdF92NGwyc3JjX3F1ZXJ5KToKKwkgIEFkZCB3YXJuaW5nIG1lc3NhZ2VzIHN0YXRpbmcgZXhhY3RseSB3aHkgdGhlIGxhdGVuY3kgcXVlcnkgZmFpbGVkLgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IChnc3RfdjRsMnNyY19zZXRfY2FwdHVyZSk6CisJICBJbiBzb21lIGNhc2VzLCB0aGUgbmVnb3RpYXRlZCBmcmFtZXJhdGUgbWlnaHQgYmUgdGhlIGRlZmF1bHQgb25lIHdoaWNoCisJICBpcyBhbHJlYWR5IHNldCBpbnRlcm5hbGx5LiBCdXQgd2Ugc3RpbGwgbmVlZCB0byBtYXJrIGl0IGRvd24gaW4gZnBzX24KKwkgIGFuZCBmcHNfZCBzbyB0aGF0IHRoZSBsYXRlbmN5IHF1ZXJ5IGNhbiBoYXBwZW4gcHJvcGVybHkuCisKKzIwMDgtMDgtMTIgMTE6Mjg6NDcgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDogV2hvb3BzLCBmb3Jnb3Qgb25lIGRvYyBmaWxlIGZvciBwZW9wbGUgd2hvIGNhbid0L2Rvbid0IGJ1aWxkIHRoZSByYXcxMzk0IHBsdWdpbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJICBXaG9vcHMsIGZvcmdvdCBvbmUgZG9jIGZpbGUgZm9yIHBlb3BsZSB3aG8gY2FuJ3QvZG9uJ3QgYnVpbGQgdGhlCisJICByYXcxMzk0IHBsdWdpbi4KKworMjAwOC0wOC0xMiAwOToyMjoyOSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIFB1bGwgY2hhbmdlcyBmcm9tIDAuMTAuOS4yIHByZS1yZWxlYXNlIGJyYW5jaCBtb3ZpbmcgdGhlIGxpYmNkaW8KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNkaW8ueG1sOgorCSAgKiBleHQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9jZGlvL01ha2VmaWxlLmFtOgorCSAgKiBleHQvY2Rpby9nc3RjZGlvLmM6CisJICAqIGV4dC9jZGlvL2dzdGNkaW8uaDoKKwkgICogZXh0L2NkaW8vZ3N0Y2Rpb2NkZGFzcmMuYzoKKwkgICogZXh0L2NkaW8vZ3N0Y2Rpb2NkZGFzcmMuaDoKKwkgIFB1bGwgY2hhbmdlcyBmcm9tIDAuMTAuOS4yIHByZS1yZWxlYXNlIGJyYW5jaCBtb3ZpbmcgdGhlIGxpYmNkaW8KKwkgIENEREEgc291cmNlIHRvIC11Z2x5LgorCSAgKiBwby9MSU5HVUFTOgorCSAgKiBwby9QT1RGSUxFUy5pbjoKKwkgICogcG8vaWQucG86CisJICBQdWxsIGluIG5ldyB0cmFuc2xhdGlvbiBmcm9tIDAuMTAuOS4yIHJlbGVhc2UgYnJhbmNoLgorCisyMDA4LTA4LTExIDE1OjA1OjEzICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBkb2NzL3BsdWdpbnMvOiBJbnRlZ3JhdGUgZG9jdW1lbnRhdGlvbiBmb3IgbmV3IGhkdjEzOTRzcmMgZWxlbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSAgSW50ZWdyYXRlIGRvY3VtZW50YXRpb24gZm9yIG5ldyBoZHYxMzk0c3JjIGVsZW1lbnQuCisKKzIwMDgtMDgtMTEgMTQ6MzY6MTMgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGV4dC9yYXcxMzk0LzogbXBlZzItdHMgKEhEVikgdmFyaWFudCBvZiBmaXJld2lyZSBjYXB0dXJlIGVsZW1lbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3JhdzEzOTQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9yYXcxMzk0L2dzdDEzOTQuYzogKHBsdWdpbl9pbml0KToKKwkgICogZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5jOiAoX2RvX2luaXQpLAorCSAgKGdzdF9oZHYxMzk0c3JjX2Jhc2VfaW5pdCksIChnc3RfaGR2MTM5NHNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfaGR2MTM5NHNyY19pbml0KSwgKGdzdF9oZHYxMzk0c3JjX2Rpc3Bvc2UpLAorCSAgKGdzdF9oZHYxMzk0c3JjX3NldF9wcm9wZXJ0eSksIChnc3RfaGR2MTM5NHNyY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9oZHYxMzk0c3JjX2Zyb21fcmF3MTM5NGhhbmRsZSksCisJICAoZ3N0X2hkdjEzOTRzcmNfaWVjNjE4ODNfcmVjZWl2ZSksIChnc3RfaGR2MTM5NHNyY19idXNfcmVzZXQpLAorCSAgKGdzdF9oZHYxMzk0c3JjX2NyZWF0ZSksIChnc3RfaGR2MTM5NHNyY19kaXNjb3Zlcl9hdmNfbm9kZSksCisJICAoZ3N0X2hkdjEzOTRzcmNfc3RhcnQpLCAoZ3N0X2hkdjEzOTRzcmNfc3RvcCksCisJICAoZ3N0X2hkdjEzOTRzcmNfdW5sb2NrKSwgKGdzdF9oZHYxMzk0c3JjX3VwZGF0ZV9kZXZpY2VfbmFtZSksCisJICAoZ3N0X2hkdjEzOTRzcmNfdXJpX2dldF90eXBlKSwgKGdzdF9oZHYxMzk0c3JjX3VyaV9nZXRfcHJvdG9jb2xzKSwKKwkgIChnc3RfaGR2MTM5NHNyY191cmlfZ2V0X3VyaSksIChnc3RfaGR2MTM5NHNyY191cmlfc2V0X3VyaSksCisJICAoZ3N0X2hkdjEzOTRzcmNfdXJpX2hhbmRsZXJfaW5pdCk6CisJICAqIGV4dC9yYXcxMzk0L2dzdGhkdjEzOTRzcmMuaDoKKwkgIG1wZWcyLXRzIChIRFYpIHZhcmlhbnQgb2YgZmlyZXdpcmUgY2FwdHVyZSBlbGVtZW50LgorCSAgRml4ZXMgIzM1MDgzMAorCisyMDA4LTA4LTExIDEwOjUzOjA2ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogRml4IGNvbXBpbGF0aW9uIChhbHNvIGtub3duIGFzIHRoZSBjbGFzc2ljICdmaXggY29kZSB0aGF0IHNvbWVvbmUgY29tbWl0dGVkIHdpdGhvdXQgY29tcGlsaW5nIGkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogKGdzdF9sZXZlbF9tZXNzYWdlX25ldyk6CisJICBGaXggY29tcGlsYXRpb24gKGFsc28ga25vd24gYXMgdGhlIGNsYXNzaWMgJ2ZpeCBjb2RlIHRoYXQgc29tZW9uZQorCSAgY29tbWl0dGVkIHdpdGhvdXQgY29tcGlsaW5nIGl0IGZpcnN0JykuCisKKzIwMDgtMDgtMTAgMTk6NDA6MjcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzogQWRkIGEgdGVzdCBmb3IgbGV2ZWwgaW4gc3RlcmVvIG1vZGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzoKKwkgIEFkZCBhIHRlc3QgZm9yIGxldmVsIGluIHN0ZXJlbyBtb2RlLgorCisyMDA4LTA4LTEwIDE5OjM1OjA1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtLzogRGVtbyBob3cgdG8gZHJhdyBhbmFseXplciByZXN1bHRzIHN5bmNlZCB0byB0aGUgY2xvY2suCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1hdWRpb3Rlc3QuYzoKKwkgICogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1vc3NzcmMuYzoKKwkgIERlbW8gaG93IHRvIGRyYXcgYW5hbHl6ZXIgcmVzdWx0cyBzeW5jZWQgdG8gdGhlIGNsb2NrLgorCisyMDA4LTA4LTEwIDE1OjUyOjQyICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiBMaXR0bGUgcmVuYW1pbmcgKGwgLT4gbGV2ZWwpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgTGl0dGxlIHJlbmFtaW5nIChsIC0+IGxldmVsKS4KKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5oOgorCSAgQWxzbyBzZW5kIGZ1bGwgdGltZXN0YW1wL2R1cmF0aW9uIGRldGFpbHMgaGVyZS4KKworMjAwOC0wOC0xMCAxMTozMjowMyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvbGV2ZWwvZ3N0bGV2ZWwuKjogU2VuZCBzYW1lIHRpbWVzdGFtcC9kdXJhdGlvbiBkZXRhaWxzIGFzIHZpZGVvYW5hbHlzaXMuIFRoaXMgZ2l2ZXMgYXBwbGljYXRpb25zIGJldHRlciBjaGFuY2UgdG8uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmg6CisJICBTZW5kIHNhbWUgdGltZXN0YW1wL2R1cmF0aW9uIGRldGFpbHMgYXMgdmlkZW9hbmFseXNpcy4gVGhpcyBnaXZlcworCSAgYXBwbGljYXRpb25zIGJldHRlciBjaGFuY2UgdG8gc3luYyBhbmFseXNpcyByZXN1bHRzIHdpdGggcGxheWJhY2suCisKKzIwMDgtMDgtMDkgMTQ6MDI6MjcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBXZSBuZWVkIHRvIGRyb3Agb25lIGFkZGl0aW9uYWwgYnVmZmVyIGZvciBGTEFDIGFzIHRoZSBmTGFDIG1hcmtlciBhbmQgU1RSRUFNSU5GTyBibG9jayBhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9tdXhfaGFuZGxlX3NpbmtfZXZlbnQpLAorCSAgKGZsYWNfc3RyZWFtaGVhZGVyX3RvX2NvZGVjZGF0YSk6CisJICBXZSBuZWVkIHRvIGRyb3Agb25lIGFkZGl0aW9uYWwgYnVmZmVyIGZvciBGTEFDIGFzIHRoZSBmTGFDCisJICBtYXJrZXIgYW5kIFNUUkVBTUlORk8gYmxvY2sgYXJlIG1lcmdlZCBpbnRvIG9uZSBidWZmZXIgaW4gdGhlIGNhcHMuCisJICBBbHNvIGRvbid0IHByZXRlbmQgdG8gc3VwcG9ydCBORVdTRUdNRU5UIGV2ZW50cywgb3RoZXJ3aXNlIHdlCisJICB3aWxsIG1vc3QgcHJvYmFibHkgd3JpdGUgc29tZSBpbnZhbGlkIGRhdGEuCisKKzIwMDgtMDgtMDkgMTM6NDg6MjIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBBZGQgc3VwcG9ydCBmb3IgbXV4aW5nIEZMQUMgaW50byBNYXRyb3NrYSBjb250YWluZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGZsYWNfc3RyZWFtaGVhZGVyX3RvX2NvZGVjZGF0YSksCisJICAoZ3N0X21hdHJvc2thX211eF9hdWRpb19wYWRfc2V0Y2Fwcyk6CisJICBBZGQgc3VwcG9ydCBmb3IgbXV4aW5nIEZMQUMgaW50byBNYXRyb3NrYSBjb250YWluZXJzLgorCSAgRml4ZXMgYnVnICMzMTE1ODYuCisKKzIwMDgtMDgtMDkgMDg6NTg6MjYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOiBBY3R1YWxseSBwcm92aWRlIHRoZSB2YXJpYWJsZXMgcmVxdWlyZWQgZm9yIHRoZSBmb3JtYXQgc3RyaW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzogKGdzdF9mbGFjX2VuY19jaGVja19kaXNjb250KToKKwkgIEFjdHVhbGx5IHByb3ZpZGUgdGhlIHZhcmlhYmxlcyByZXF1aXJlZCBmb3IgdGhlIGZvcm1hdCBzdHJpbmcuCisKKzIwMDgtMDgtMDggMTY6MjA6MjYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lio6IENsb3NlIHRoZSBjdXJyZW50IHNlZ21lbnQgaWYgd2UncmUgZG9pbmcgYSBub24tZmx1c2hpbmcgc2VlayBhbmQgc2VuZCB0aGUgY2xvc2Utc2VnbWVuLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfcmVzZXQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9lbGVtZW50X3NlbmRfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc2Vla19ldmVudCksIChnc3RfbWF0cm9za2FfZGVtdXhfbG9vcCk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgQ2xvc2UgdGhlIGN1cnJlbnQgc2VnbWVudCBpZiB3ZSdyZSBkb2luZyBhIG5vbi1mbHVzaGluZyBzZWVrIGFuZCBzZW5kCisJICB0aGUgY2xvc2Utc2VnbWVudCBhbmQgdGhlIG5ldyBzZWdtZW50IG9mIHRoZSBzZWVrIGZyb20gdGhlIHN0cmVhbWluZworCSAgdGhyZWFkLgorCisyMDA4LTA4LTA4IDE1OjIwOjI0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC9mbGFjL2dzdGZsYWNlbmMuKjogSGFuZGxlIG5vbi16ZXJvIHN0YXJ0IHRpbWVzdGFtcHMgY29ycmVjdGx5LCBtYXJrIGhlYWRlciBwYWNrZXRzIGFzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOiAoZ3N0X2ZsYWNfZW5jX3dyaXRlX2NhbGxiYWNrKSwKKwkgIChnc3RfZmxhY19lbmNfY2hlY2tfZGlzY29udCksIChnc3RfZmxhY19lbmNfY2hhaW4pLAorCSAgKGdzdF9mbGFjX2VuY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmg6CisJICBIYW5kbGUgbm9uLXplcm8gc3RhcnQgdGltZXN0YW1wcyBjb3JyZWN0bHksIG1hcmsgaGVhZGVyIHBhY2tldHMgYXMKKwkgIElOX0NBUFMgYW5kIHByaW50IGEgd2FybmluZyBhbmQgc3VnZ2VzdCB1c2luZyBhdWRpb3JhdGUgaWYgc3RyZWFtCisJICBkaXNjb250aW51aXRpZXMgYXJlIGRldGVjdGVkLiBXaGVuIEZMQUMgc3VwcG9ydHMgZmx1c2hpbmcgdGhlIGVuY29kZXIKKwkgIHNvbWVob3cgdGhpcyBzaG91bGQgYmUgZG9uZSBmb3IgZGlzY29udGludWl0aWVzIGluc3RlYWQuCisJICBSZW1vdmUgc29tZSB1bnVzZWQgdmFyaWFibGVzIGZyb20gdGhlIGluc3RhbmNlIHN0cnVjdC4KKworMjAwOC0wOC0wNyAxNzoxNDozOSArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBhZGQgcHVsc2VhdWRpbyB0byBwbHVnaW5zIGxpc3QgaW4gc3BlYyBmaWxlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCBwdWxzZWF1ZGlvIHRvIHBsdWdpbnMgbGlzdCBpbiBzcGVjIGZpbGUKKworMjAwOC0wOC0wNyAxNjoxMzo0MSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IElmIHNlZWtpbmcgZmFpbGVkIHJldHVybiB0aGUgYXBwcm9waWF0ZSByZXR1cm4gdmFsdWUgdG8gRkxBQy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IChnc3RfZmxhY19lbmNfc2Vla19jYWxsYmFjayk6CisJICBJZiBzZWVraW5nIGZhaWxlZCByZXR1cm4gdGhlIGFwcHJvcGlhdGUgcmV0dXJuIHZhbHVlIHRvIEZMQUMuCisJICBPdGhlcndpc2UgaXQgdGhpbmtzIHNlZWtpbmcgd2FzIHN1Y2Nlc3NmdWxsIGFuZCB0cmllcyB0byByZXdyaXRlCisJICBwYXJ0cyBvZiB0aGUgaGVhZGVycyB3aGljaCB0aGVuIGdldCBhcHBlbmRlZCB0byB0aGUgb3V0cHV0LgorCisyMDA4LTA4LTA3IDE2OjExOjAwICswMDAwICBGcmVkZXJpYyBDcm96YXQgPGZjcm96YXRAbWFuZHJpdmEub3JnPgorCisJICBNYWtlIHN1cmUgZ2V0dGV4dCByZXR1cm5zIHRyYW5zbGF0aW9ucyBpbiBVVEYtOCBlbmNvZGluZyByYXRoZXIgdGhhbiBpbiB0aGUgY3VycmVudCBsb2NhbGUgZW5jb2RpbmcgKCM1NDY4MjIpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogRnJlZGVyaWMgQ3JvemF0IDxmY3JvemF0QG1hbmRyaXZhLm9yZz4KKwkgICogZXh0L2VzZC9nc3Rlc2QuYzogKHBsdWdpbl9pbml0KToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhYy5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrLmM6IChwbHVnaW5faW5pdCk6CisJICAqIHN5cy9vc3MvZ3N0b3NzYXVkaW8uYzogKHBsdWdpbl9pbml0KToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMi5jOiAocGx1Z2luX2luaXQpOgorCSAgTWFrZSBzdXJlIGdldHRleHQgcmV0dXJucyB0cmFuc2xhdGlvbnMgaW4gVVRGLTggZW5jb2RpbmcgcmF0aGVyCisJICB0aGFuIGluIHRoZSBjdXJyZW50IGxvY2FsZSBlbmNvZGluZyAoIzU0NjgyMikuCisKKzIwMDgtMDgtMDcgMTQ6NDA6MTMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiBBZGQgRklYTUUgZm9yIDAuMTEgdG8gc2ltcGx5IG91dHB1dCBldmVyeXRoaW5nIHdpdGggd2lkdGg9MzIgYXMgZ2l2ZW4gYnkgRkxBQyBhbmQgbGV0IGF1ZGlvY29uLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgQWRkIEZJWE1FIGZvciAwLjExIHRvIHNpbXBseSBvdXRwdXQgZXZlcnl0aGluZyB3aXRoIHdpZHRoPTMyIGFzIGdpdmVuCisJICBieSBGTEFDIGFuZCBsZXQgYXVkaW9jb252ZXJ0IGhhbmRsZSB0aGUgY29udmVyc2lvbnMgaW5zdGVhZCBvZiBkb2luZworCSAgdGhlbSBpbiBmbGFjZGVjLgorCisyMDA4LTA4LTA3IDEwOjIyOjMyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiBXaGVuIG91dHB1dHRpbmcgYSBwYWQgdGVtcGxhdGUgcmFuZ2UgZm9yIHRoZSBzaXplLCBpbmNsdWRlIGEgZnJhbWVyYXRlIHJhbmdlIHRvbywgdG8gYXZvaWQgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfcHJvYmVfY2Fwc19mb3JfZm9ybWF0KToKKwkgIFdoZW4gb3V0cHV0dGluZyBhIHBhZCB0ZW1wbGF0ZSByYW5nZSBmb3IgdGhlIHNpemUsIGluY2x1ZGUgYSBmcmFtZXJhdGUKKwkgIHJhbmdlIHRvbywgdG8gYXZvaWQgJ25vdCBhIHJlYWwgc3Vic2V0IG9mIHRlbXBsYXRlIGNhcHMnIGVycm9ycy4KKworMjAwOC0wOC0wNiAxNTozNDo1NSArMDAwMCAgSm9uYXRoYW4gTWF0dGhldyA8bm90dmVyeXNtYXJ0QGdtYWlsLmNvbT4KKworCSAgZXh0L2ZsYWMvOiBQb3J0IGZsYWN0YWcgdG8gMC4xMCwgYWRkIGRvY3VtZW50YXRpb24gZm9yIGl0IGFuZCBjbGVhbiBpdCB1cCBhIGJpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gYSBwYXRjaCBieTogSm9uYXRoYW4gTWF0dGhldyA8bm90dmVyeXNtYXJ0IGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGV4dC9mbGFjL01ha2VmaWxlLmFtOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzogKGdzdF9mbGFjX3RhZ19zZXR1cF9pbnRlcmZhY2VzKSwKKwkgIChnc3RfZmxhY190YWdfYmFzZV9pbml0KSwgKGdzdF9mbGFjX3RhZ19jbGFzc19pbml0KSwKKwkgIChnc3RfZmxhY190YWdfZGlzcG9zZSksIChnc3RfZmxhY190YWdfaW5pdCksCisJICAoZ3N0X2ZsYWNfdGFnX3Npbmtfc2V0Y2FwcyksIChnc3RfZmxhY190YWdfY2hhaW4pLAorCSAgKGdzdF9mbGFjX3RhZ19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjdGFnLmg6CisJICBQb3J0IGZsYWN0YWcgdG8gMC4xMCwgYWRkIGRvY3VtZW50YXRpb24gZm9yIGl0IGFuZCBjbGVhbiBpdCB1cCBhIGJpdC4KKwkgIEZpeGVzIGJ1ZyAjNDEzODQxLgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjX2RlY19iYXNlX2luaXQpOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmg6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzogKGdzdF9mbGFjX2VuY19iYXNlX2luaXQpOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmg6CisJICBBZGQgZmxhY3RhZyBhbmQgZmxhY2VuYyB0byB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgbWFyaworCSAgdGhlIHByaXZhdGUgcGFydHMgb2YgdGhlIGZsYWNkZWMgaW5zdGFuY2Ugc3RydWN0dXJlIGFzIHByaXZhdGUuCisJICBBbHNvIHVzZSBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUoKSBpbiBmbGFjZGVjIGFuZAorCSAgZmxhY2VuYy4KKworMjAwOC0wOC0wNiAxMzoxMjowNyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFVzZSBhdWRpby94LXFkbSBmb3IgY2Fwcy4gQ29sbGVjdCBzb21lIGluZm8gLSBtcGxheWVyIGhhcyBhIGRlY29kZXIgZm9yIGl0IGJ1dCBmZm1wZWcgZG9lcyBub3QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgVXNlIGF1ZGlvL3gtcWRtIGZvciBjYXBzLiBDb2xsZWN0IHNvbWUgaW5mbyAtIG1wbGF5ZXIgaGFzIGEgZGVjb2RlcgorCSAgZm9yIGl0IGJ1dCBmZm1wZWcgZG9lcyBub3QuCisKKzIwMDgtMDgtMDUgMTU6MDU6NDQgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IEhhbmRsZSB0aGUgbGlzdCBjaHVuayBhbmQgdXNlIGdzdF9yaWZmX3BhcnNlX2luZm8oKSB0byBwYXJzZSB0aGUgaW5mbyBzdWItY2h1bmsuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBIYW5kbGUgdGhlIGxpc3QgY2h1bmsgYW5kIHVzZSBnc3RfcmlmZl9wYXJzZV9pbmZvKCkgdG8gcGFyc2UgdGhlIGluZm8KKwkgIHN1Yi1jaHVuay4KKworMjAwOC0wOC0wNSAxNDoyMjoxMiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogSGFuZGxlIHRoZSBhY2lkIGNodW5rIGFuZCBzZW5kIHRlbXBvIGFzIHBhcnQgb2YgdGFncy4gT3RoZXIgZmllbGRzIGFyZSBpbnRlcmVzdGluZyB0b28sIGIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIEhhbmRsZSB0aGUgYWNpZCBjaHVuayBhbmQgc2VuZCB0ZW1wbyBhcyBwYXJ0IG9mIHRhZ3MuIE90aGVyIGZpZWxkcyBhcmUKKwkgIGludGVyZXN0aW5nIHRvbywgYnV0IG5lZWQgbW9yZSB0YWctZGVmaW5pdGlvbnMuIEZpeGVzICM1NDU0MzMuCisKKzIwMDgtMDgtMDUgMTQ6MTY6MzIgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IFJlZmFjdG9yIHdhdnBhcnNlLiBDYWxsIF9yZXNldCgpIGZyb20gZGlzcG9zZSgpIGFuZCBtb3ZlIG9sZCBjb2RlIGZyb20gZGlzcG9zZSBpbnRvIHJlc2V0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBSZWZhY3RvciB3YXZwYXJzZS4gQ2FsbCBfcmVzZXQoKSBmcm9tIGRpc3Bvc2UoKSBhbmQgbW92ZSBvbGQgY29kZSBmcm9tCisJICBkaXNwb3NlIGludG8gcmVzZXQuIFRoaXMgd2F5IHdlIGRvbid0IGxlYWsgdGFnbGlzdHMgd2hlbiB3ZSBhYm9ydAorCSAgcGFyc2luZy4gRml4IHNvbWUgY29tbWVudHMuIE1vdmUgY29kZSBmb3Igc2tpcHBpbmcgYSBjaHVuayBpbnRvIGV4dHJhCisJICBmdW5jdGlvbi4gUmVwbGFjZSBjaHVuayBzaXplcyB3aXRoIGEgY29uc3QgdG8gZWFzZSByZWFkYWJpbGl0eS4KKworMjAwOC0wOC0wNSAxMzo1Nzo1NyArMDAwMCAgQXVyZWxpZW4gR3JpbWF1ZCA8Z3N0ZWx6ekB5YWhvby5mcj4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBJbXByb3ZlIHVkcCBwb3J0IHNldHVwLiBGaXhlcyAjNTQ1NzEwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQXVyZWxpZW4gR3JpbWF1ZCA8Z3N0ZWx6eiBhdCB5YWhvbyBkb3QgZnI+CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2FsbG9jX3VkcF9wb3J0cyk6CisJICBJbXByb3ZlIHVkcCBwb3J0IHNldHVwLiBGaXhlcyAjNTQ1NzEwLgorCisyMDA4LTA4LTA1IDEzOjU0OjE4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogQWRkIE1QMVMgZGVwYXlsb2FkZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzogKGdzdF9ydHBfbXAxc19kZXBheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfbXAxc19kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfbXAxc19kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX21wMXNfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX21wMXNfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF9tcDFzX2RlcGF5X3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9tcDFzX2RlcGF5X2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9tcDFzX2RlcGF5X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3J0cF9tcDFzX2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuaDoKKwkgIEFkZCBNUDFTIGRlcGF5bG9hZGVyLgorCSAgKiBnc3QvcnRzcC9VUkxTOgorCSAgU29tZSBtb3JlIHNhbXBsZSBydHNwIHN0cmVhbXMuCisKKzIwMDgtMDgtMDUgMDg6NDM6NDUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL1VSTFM6IEFkZCBhbm90aGVyIFVSTC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9VUkxTOgorCSAgQWRkIGFub3RoZXIgVVJMLgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDN2Mm11eC5jOiAodGVzdF90YWdsaWJfaWQzbXV4X3dpdGhfdGFncyk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnbGltaXRlci5jOiAoR1NUX1NUQVJUX1RFU1QpOgorCSAgQWRkIHNvbWUgbW9yZSBkZWJ1ZyBpbmZvLgorCisyMDA4LTA4LTA0IDA5OjE2OjQwICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L2F2aS9nc3RhdmltdXguYzogUHJvdmlkZSBjYlNpemUgZmllbGQgZm9yIGF1ZGlvIGV4dHJhX2RhdGEgc2l6ZSwgYW5kIHRha2UgY2FyZSB0byBwYWQgZXh0cmFfZGF0YS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aV9tdXhfcmlmZl9nZXRfYXZpX2hlYWRlcik6CisJICBQcm92aWRlIGNiU2l6ZSBmaWVsZCBmb3IgYXVkaW8gZXh0cmFfZGF0YSBzaXplLCBhbmQgdGFrZSBjYXJlIHRvCisJICBwYWQgZXh0cmFfZGF0YS4KKworMjAwOC0wOC0wNCAwNzoyMzowNyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFJldHVybiB0aGUgcmVzdWx0IG9mIGdzdF9wYWRfe3N0YXJ0LHN0b3B9X3Rhc2sgaW5zdGVhZCBvZiBoYXJkLWNvZGVkCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgUmV0dXJuIHRoZSByZXN1bHQgb2YgZ3N0X3BhZF97c3RhcnQsc3RvcH1fdGFzayBpbnN0ZWFkIG9mIGhhcmQtY29kZWQKKwkgIFRSVUUuCisKKzIwMDgtMDgtMDQgMDc6MTc6MzggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvOiBBZGQga2V5d29yZCB0YWcgc3VwcG9ydC4gRml4ZXMgIzUyMDY5NCBmb3IgcXRkZW11eC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZm91cmNjLmg6CisJICBBZGQga2V5d29yZCB0YWcgc3VwcG9ydC4gRml4ZXMgIzUyMDY5NCBmb3IgcXRkZW11eC4KKworMjAwOC0wOC0wNCAwNzowNTozMyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEFkZCBzdXBwb3J0IGZvciB0bXBvIHRhZyAoQlBNKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBBZGQgc3VwcG9ydCBmb3IgdG1wbyB0YWcgKEJQTSkuCisKKzIwMDgtMDgtMDMgMTI6MjM6NDkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOiBTZXQgYW4gZXN0aW1hdGUgZm9yIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2FtcGxlcyB0aGF0IHdpbGwgYmUgZW5jb2RlZCBpZiBwb3NzaWJsZSB0byBoZWxwIGRlY29kLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOiAoZ3N0X2ZsYWNfZW5jX3F1ZXJ5X3BlZXJfdG90YWxfc2FtcGxlcyksCisJICAoZ3N0X2ZsYWNfZW5jX3Npbmtfc2V0Y2FwcyksIChnc3RfZmxhY19lbmNfd3JpdGVfY2FsbGJhY2spOgorCSAgU2V0IGFuIGVzdGltYXRlIGZvciB0aGUgdG90YWwgbnVtYmVyIG9mIHNhbXBsZXMgdGhhdCB3aWxsIGJlIGVuY29kZWQKKwkgIGlmIHBvc3NpYmxlIHRvIGhlbHAgZGVjb2RlcnMgaWYgdGhlIHN0cmVhbWluZm8gY2FuJ3QgYmUgcmV3cml0dGVuCisJICBsYXRlciAobGlrZSB3aGVuIG11eGluZyBpbnRvIE9nZyBjb250YWluZXJzKS4KKwkgIEFkZCBhIHdhcm5pbmcgaWYgd2UgZ2V0IGhlYWRlciBwYWNrZXRzIGFmdGVyIGRhdGEgcGFja2V0cyBhcyB0aG9zZQorCSAgd2lsbCBnZXQgbG9zdCB3aGVuIG11eGluZyBpbnRvIE9nZywgaS5lLiByZXdyaXRpbmcgdGhlIGhlYWRlcnMgZG9lc24ndAorCSAgd29yay4KKworMjAwOC0wOC0wMyAxMTozODoyMiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IFN1cHBvcnQgZGVjb2Rpbmcgb2YgYWxsIGRlcHRocyBiZXR3ZWVuIDQgYW5kIDMyIGJpdHMgYW5kIHJlYWQgdGhlIGRlcHRoIGZyb20gdGhlIHN0cmVhbWluZm8gaGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19kZWNfbWV0YWRhdGFfY2FsbGJhY2spLAorCSAgKGdzdF9mbGFjX2RlY193cml0ZSk6CisJICBTdXBwb3J0IGRlY29kaW5nIG9mIGFsbCBkZXB0aHMgYmV0d2VlbiA0IGFuZCAzMiBiaXRzIGFuZCByZWFkIHRoZQorCSAgZGVwdGggZnJvbSB0aGUgc3RyZWFtaW5mbyBoZWFkZXIgaWYgbmVlZGVkLiBBbHNvIHN1cHBvcnQgYWxsIHNhbXBsaW5nCisJICByYXRlcyBiZXR3ZWVuIDEgYW5kIDY1NTM1MCBIei4KKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgKGdzdF9mbGFjX2VuY19jYXBzX2FwcGVuZF9zdHJ1Y3R1cmVfd2l0aF93aWR0aHMpLAorCSAgKGdzdF9mbGFjX2VuY19zaW5rX2dldGNhcHMpLCAoZ3N0X2ZsYWNfZW5jX3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X2ZsYWNfZW5jX2NoYWluKToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5oOgorCSAgU3VwcG9ydCBlbmNvZGluZyBpbiBhbGwgYml0IGRlcHRocyBzdXBwb3J0ZWQgYnkgdGhlIHN0cmVhbWFibGUKKwkgIHN1YmZvcm1hdCAoaS5lLiA4LCAxMiwgMTYsIDIwIGFuZCAyNCBiaXRzKSBhbmQgYWxsIHNhbXBsaW5nIHJhdGVzCisJICBiZXR3ZWVuIDEgSHogYW5kIDY1NTM1MCBIei4KKworMjAwOC0wOC0wMyAwOToyMzoxNCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IFN1cHBvcnQgZW5jb2Rpbmcgb2YgdXAgdG8gOCBjaGFubmVscy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IChnc3RfZmxhY19lbmNfaW5pdCksCisJICAoZ3N0X2ZsYWNfZW5jX3NpbmtfZ2V0Y2Fwcyk6CisJICBTdXBwb3J0IGVuY29kaW5nIG9mIHVwIHRvIDggY2hhbm5lbHMuCisKKzIwMDgtMDgtMDIgMjE6Mzk6MDEgKzAwMDAgIFdvdXRlciBDbG9ldGVucyA8d291dGVyQG1pbmQuYmU+CisKKwkgIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLio6IEZpeCBzZWVraW5nIHJhY2UgY29uZGl0aW9uIGluICM1NDAzMDAKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgRml4IHNlZWtpbmcgcmFjZSBjb25kaXRpb24gaW4gIzU0MDMwMAorCSAgUGF0Y2ggQnk6IFdvdXRlciBDbG9ldGVucyAgPHdvdXRlciBhdCBtaW5kIGJlPgorCisyMDA4LTA4LTAyIDE4OjM1OjIxICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiBXaGVuIHJlY2VpdmluZyBhIFNFRUsgZXZlbnQgb24gYSBzcGVjaWZpYyBwYWQgZmlyc3Qgc2VhcmNoIGZvciBhIHNlZWsgdGFibGUgZW50cnkgZm9yIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thZGVtdXhfZG9faW5kZXhfc2VlayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2VsZW1lbnRfc2VuZF9ldmVudCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX2V2ZW50KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NyY19ldmVudCk6CisJICBXaGVuIHJlY2VpdmluZyBhIFNFRUsgZXZlbnQgb24gYSBzcGVjaWZpYyBwYWQgZmlyc3Qgc2VhcmNoIGZvciBhIHNlZWsKKwkgIHRhYmxlIGVudHJ5IGZvciB0aGUgc3RyZWFtIG9mIHRoZSBwYWQgYW5kIHRoZW4gZmFsbCBiYWNrIHRvIGFuIGVudHJ5CisJICBmb3IgYSBkaWZmZXJlbnQgc3RyZWFtLgorCisyMDA4LTA4LTAyIDE4OjIwOjQ0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIEJ1aWxkIGRlcGVuZCBvbiBjb3JlIENWUyBmb3IgdGhlIGF0dGFjaG1lbnQgdGFnLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5jOiAoZ3N0X21hdHJvc2thX3JlZ2lzdGVyX3RhZ3MpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICBCdWlsZCBkZXBlbmQgb24gY29yZSBDVlMgZm9yIHRoZSBhdHRhY2htZW50IHRhZy4KKworMjAwOC0wOC0wMiAxODoxODowNSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBEZWNvZGUgdGhlIGNvZGVjIHByaXZhdGUgZGF0YSBhbmQgZm9sbG93aW5nIENvbnRlbnRFbmNvZGluZyBpZiBuZWNlc3NhcnkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvbWF0cm9za2EvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tYXRyb3NrYS9sem8uYzogKGdldF9ieXRlKSwgKGdldF9sZW4pLCAoY29weSksCisJICAoY29weV9iYWNrcHRyKSwgKGx6bzF4X2RlY29kZSksIChtYWluKToKKwkgICogZ3N0L21hdHJvc2thL2x6by5oOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcmVhZF90cmFja19lbmNvZGluZyksCisJICAoZ3N0X21hdHJvc2thX2RlY29tcHJlc3NfZGF0YSksIChnc3RfbWF0cm9za2FfZGVjb2RlX2RhdGEpLAorCSAgKGdzdF9tYXRyb3NrYV9kZWNvZGVfYnVmZmVyKSwKKwkgIChnc3RfbWF0cm9za2FfZGVjb2RlX2NvbnRlbnRfZW5jb2RpbmdzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcmVhZF90cmFja19lbmNvZGluZ3MpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfc3RyZWFtKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIERlY29kZSB0aGUgY29kZWMgcHJpdmF0ZSBkYXRhIGFuZCBmb2xsb3dpbmcgQ29udGVudEVuY29kaW5nIGlmCisJICBuZWNlc3NhcnkuCisJICBTdXBwb3J0IGJ6aXAyLCBsem8gYW5kIGhlYWRlciBzdHJpcHBlZCBjb21wcmVzc2lvbi4gRm9yIGx6byB1c2UgdGhlCisJICBmZm1wZWcgbHpvIGltcGxlbWVudGF0aW9uIGFzIGxpYmx6byBpcyBHUEwgbGljZW5zZWQuCisJICBGaXggemxpYiBkZWNvbXByZXNzaW9uLgorCisyMDA4LTA4LTAyIDE4OjExOjMyICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogRml4IG11eGluZyBvZiBNUDMvTVAyIHdpdGggZGlmZmVyZW50IE1QRUcgdmVyc2lvbnMgYnkgY2FsY3VsYXRpbmcgdGhlIGR1cmF0aW9uIG9mIGEgZnJhbS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIChnc3RfbWF0cm9za2FfbXV4X2F1ZGlvX3BhZF9zZXRjYXBzKToKKwkgIEZpeCBtdXhpbmcgb2YgTVAzL01QMiB3aXRoIGRpZmZlcmVudCBNUEVHIHZlcnNpb25zIGJ5IGNhbGN1bGF0aW5nIHRoZQorCSAgZHVyYXRpb24gb2YgYSBmcmFtZSB3aXRoIHRoZSBuZXcgbXBlZ2F1ZGlvdmVyc2lvbiBjYXBzIGZpZWxkLgorCisyMDA4LTA4LTAyIDE4OjA2OjIwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC4qOiBBbGxvdyBhbiBpbmZpbml0ZSBudW1iZXIgb2Ygc3RyZWFtIGluc2lkZSBNYXRyb3NrYSBjb250YWluZXJzIGFuZCB1c2UgYSBHUHRyQXJyYXkgZm9yIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X2ZpbmFsaXplKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfY2xhc3NfaW5pdCksIChnc3RfbWF0cm9za2FfZGVtdXhfaW5pdCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2NvbWJpbmVfZmxvd3MpLCAoZ3N0X21hdHJvc2thX2RlbXV4X3Jlc2V0KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3RyZWFtX2Zyb21fbnVtKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfdHJhY2tudW1iZXJfdW5pcXVlKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSksIChnc3RfbWF0cm9za2FfZGVtdXhfc2VuZF9ldmVudCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX2V2ZW50KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3luY19zdHJlYW1zKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2xvb3ApOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkgIEFsbG93IGFuIGluZmluaXRlIG51bWJlciBvZiBzdHJlYW0gaW5zaWRlIE1hdHJvc2thIGNvbnRhaW5lcnMgYW5kIHVzZQorCSAgYSBHUHRyQXJyYXkgZm9yIHN0b3JpbmcgdGhlbSBpbnN0ZWFkIG9mIGFsbG93aW5nICJvbmx5IiAxMjcgc3RyZWFtcy4KKworMjAwOC0wOC0wMiAxODowMTozNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvOiBGaXggaW5kZW50aW9uIGV2ZXJ5d2hlcmUuIEEgYnJva2VuIGluZGVudCB2ZXJzaW9uIGhhcyBhZGRlZCBuZXdsaW5lcyBhZnRlciBldmVyeSBzaW5nbGUgZGVjbGFyYXRpb24gc28uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChnc3RfZWJtbF9yZWFkX2NsYXNzX2luaXQpLAorCSAgKGdzdF9lYm1sX3JlYWRfY2hhbmdlX3N0YXRlKSwgKGdzdF9lYm1sX3JlYWRfZWxlbWVudF9sZXZlbF91cCksCisJICAoZ3N0X2VibWxfcmVhZF9wZWVrX2J5dGVzKSwgKGdzdF9lYm1sX3JlYWRfZWxlbWVudF9pZCksCisJICAoZ3N0X2VibWxfcmVhZF9lbGVtZW50X2xlbmd0aCksIChnc3RfZWJtbF9wZWVrX2lkKSwKKwkgIChnc3RfZWJtbF9yZWFkX2dldF9sZW5ndGgpLCAoZ3N0X2VibWxfcmVhZF9za2lwKSwKKwkgIChnc3RfZWJtbF9yZWFkX2J1ZmZlciksIChnc3RfZWJtbF9yZWFkX2J5dGVzKSwKKwkgIChnc3RfZWJtbF9yZWFkX3VpbnQpLCAoZ3N0X2VibWxfcmVhZF9zaW50KSwgKF9leHQyZGJsKSwKKwkgIChnc3RfZWJtbF9yZWFkX2Zsb2F0KSwgKGdzdF9lYm1sX3JlYWRfYXNjaWkpLCAoZ3N0X2VibWxfcmVhZF9kYXRlKSwKKwkgIChnc3RfZWJtbF9yZWFkX21hc3RlciksIChnc3RfZWJtbF9yZWFkX2JpbmFyeSksCisJICAoZ3N0X2VibWxfcmVhZF9oZWFkZXIpOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOiAoZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9pZCksCisJICAoZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9zaXplKSwgKGdzdF9lYm1sX3dyaXRlX3VpbnQpLAorCSAgKGdzdF9lYm1sX3dyaXRlX3NpbnQpLCAoZ3N0X2VibWxfd3JpdGVfYXNjaWkpLAorCSAgKGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCksIChnc3RfZWJtbF93cml0ZV9tYXN0ZXJfZmluaXNoKSwKKwkgIChnc3RfZWJtbF9yZXBsYWNlX3VpbnQpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9yZXNldCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3JlYWRfdHJhY2tfZW5jb2RpbmcpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9yZWFkX3RyYWNrX2VuY29kaW5ncyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2FkZF9zdHJlYW0pLCAoZ3N0X21hdHJvc2thZGVtdXhfZG9faW5kZXhfc2VlayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3NlbmRfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9lbGVtZW50X3NlbmRfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc2Vla19ldmVudCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9pbml0X3N0cmVhbSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX3RyYWNrcyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2luZGV4X2N1ZXRyYWNrKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfaW5kZXhfcG9pbnRlbnRyeSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2luZGV4KSwgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmZvKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfbWV0YWRhdGFfaWRfc2ltcGxlX3RhZyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX21ldGFkYXRhX2lkX3RhZyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX21ldGFkYXRhKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYXR0YWNoZWRfZmlsZSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2F0dGFjaG1lbnRzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfY2hhcHRlcnMpLCAoZ3N0X21hdHJvc2thX2VibWxudW1fdWludCksCisJICAoZ3N0X21hdHJvc2thX2VibWxudW1fc2ludCksIChnc3RfbWF0cm9za2FfZGVtdXhfcHVzaF9oZHJfYnVmKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcHVzaF9mbGFjX2NvZGVjX3ByaXZfZGF0YSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3B1c2hfeGlwaF9jb2RlY19wcml2X2RhdGEpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wdXNoX2R2ZF9jbHV0X2NoYW5nZV9ldmVudCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2FkZF9tcGVnX3NlcV9oZWFkZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfd3Zwa19oZWFkZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9jaGVja19zdWJ0aXRsZV9idWZmZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZWNvZGVfYnVmZmVyKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NsdXN0ZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9jb250ZW50c19zZWVrZW50cnkpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9jb250ZW50cyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2xvb3Bfc3RyZWFtX3BhcnNlX2lkKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfbG9vcF9zdHJlYW0pLCAoZ3N0X21hdHJvc2thX2RlbXV4X2xvb3ApLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF92aWRlb19jYXBzKSwgKGdzdF9tYXRyb3NrYV9kZW11eF9hdWRpb19jYXBzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3VidGl0bGVfY2FwcyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuYzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9jbGFzc19pbml0KSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3Jlc2V0KSwgKGdzdF9tYXRyb3NrYV9tdXhfaGFuZGxlX3NpbmtfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfdmlkZW9fcGFkX3NldGNhcHMpLAorCSAgKHhpcGgzX3N0cmVhbWhlYWRlcl90b19jb2RlY2RhdGEpLAorCSAgKHZvcmJpc19zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhKSwKKwkgICh0aGVvcmFfc3RyZWFtaGVhZGVyX3RvX2NvZGVjZGF0YSksCisJICAoZ3N0X21hdHJvc2thX211eF9hdWRpb19wYWRfc2V0Y2FwcyksCisJICAoZ3N0X21hdHJvc2thX211eF9yZXF1ZXN0X25ld19wYWQpLCAoZ3N0X21hdHJvc2thX211eF9yZWxlYXNlX3BhZCksCisJICAoZ3N0X21hdHJvc2thX211eF90cmFja19oZWFkZXIpLCAoZ3N0X21hdHJvc2thX211eF9zdGFydCksCisJICAoZ3N0X21hdHJvc2thX211eF93cml0ZV9zaW1wbGVfdGFnKSwgKGdzdF9tYXRyb3NrYV9tdXhfZmluaXNoKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X2Jlc3RfcGFkKSwgKGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfZGF0YSksCisJICAoZ3N0X21hdHJvc2thX211eF9jb2xsZWN0ZWQpLCAoZ3N0X21hdHJvc2thX211eF9jaGFuZ2Vfc3RhdGUpOgorCSAgRml4IGluZGVudGlvbiBldmVyeXdoZXJlLiBBIGJyb2tlbiBpbmRlbnQgdmVyc2lvbiBoYXMgYWRkZWQgbmV3bGluZXMKKwkgIGFmdGVyIGV2ZXJ5IHNpbmdsZSBkZWNsYXJhdGlvbiBzb21lIHRpbWUgYWdvLgorCisyMDA4LTA4LTAyIDE3OjU5OjA1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiBJZiBubyBUcmFja3MgYXJlIGZvdW5kIGVycm9yIG91dCBpbnN0ZWFkIG9mIHRyeWluZyBpdCBhZ2FpbiB1bnRpbCB0aGUgZW5kIG9mIHRpbWUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2xvb3Bfc3RyZWFtX3BhcnNlX2lkKToKKwkgIElmIG5vIFRyYWNrcyBhcmUgZm91bmQgZXJyb3Igb3V0IGluc3RlYWQgb2YgdHJ5aW5nIGl0IGFnYWluIHVudGlsIHRoZQorCSAgZW5kIG9mIHRpbWUuCisKKzIwMDgtMDgtMDIgMTc6NTc6MzEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IEZpeCBkZW11eGluZyBvZiByYXcgaW50ZWdlciBhdWRpby4gVGhlIHNhbXBsZXMgYXJlIHVuc2lnbmVkIG9ubHkgZm9yIDggYml0IGFuZCBzaWduZWQgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfYXVkaW9fY2Fwcyk6CisJICBGaXggZGVtdXhpbmcgb2YgcmF3IGludGVnZXIgYXVkaW8uIFRoZSBzYW1wbGVzIGFyZSB1bnNpZ25lZCBvbmx5IGZvciA4CisJICBiaXQgYW5kIHNpZ25lZCBvdGhlcndpc2UsIG5vdCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KKworMjAwOC0wOC0wMiAxNzo1NDowNCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IEFkZCBtb3JlIHJhdyBZVVYgZm9ybWF0cyB0byB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgZm9ybWF0cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBBZGQgbW9yZSByYXcgWVVWIGZvcm1hdHMgdG8gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGZvcm1hdHMuCisKKzIwMDgtMDgtMDIgMTc6NTI6MTYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBBZGQgc3VwcG9ydCBmb3IgbXV4aW5nIHJhdyBmbG9hdCBhdWRpbyBub3cgdGhhdCB0aGUgc3BlYyBkZWZpbmVzIHRoZSBlbmRpYW5uZXNzIGFuZCBhZGQgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9tdXhfYXVkaW9fcGFkX3NldGNhcHMpOgorCSAgQWRkIHN1cHBvcnQgZm9yIG11eGluZyByYXcgZmxvYXQgYXVkaW8gbm93IHRoYXQgdGhlIHNwZWMgZGVmaW5lcyB0aGUKKwkgIGVuZGlhbm5lc3MgYW5kIGFkZCBzdXBwb3J0IGZvciBtdXhpbmcgcmF3IGludGVnZXIgYXVkaW8gd2l0aCAyNCBhbmQKKwkgIDMyIGJpdHMuCisJICBBbGxvdyBtdXhpbmcgb2YgbW9yZSB0aGFuIDggYXVkaW8gY2hhbm5lbHMuCisKKzIwMDgtMDgtMDIgMTc6NDc6MzIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBBZGQgbG9ja2luZyB0byB0aGUgZ2xvYmFsIGFycmF5IG9mIHVzZWQgdHJhY2sgVUlEcyB0byBwcmV2ZW50IHJhbmRvbSBjcmFzaGVzIGlmIG1vcmUgdGhhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9jcmVhdGVfdWlkKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3Jlc2V0KSwgKGdzdF9tYXRyb3NrYV9tdXhfc3RhcnQpOgorCSAgQWRkIGxvY2tpbmcgdG8gdGhlIGdsb2JhbCBhcnJheSBvZiB1c2VkIHRyYWNrIFVJRHMgdG8gcHJldmVudCByYW5kb20KKwkgIGNyYXNoZXMgaWYgbW9yZSB0aGFuIGEgc2luZ2xlIG1hdHJvc211eCBpbnN0YW5jZSBpcyB1c2VkLgorCSAgVXNlIDY0IGJpdCB2YWx1ZXMgZm9yIHRoZSB0cmFjayBVSURzLgorCSAgVXNlIHRoZSBnbG9iYWwgR1JhbmRvbSBvZiBHTGliIGluc3RlYWQgb2YgY3JlYXRpbmcgb3VyIG93biBvbmUKKwkgIGZvciB0aGUgZmV3IHJhbmRvbSBudW1iZXJzIHdlIG5lZWQgZXZlcnkgc2luZ2xlIHRpbWUuCisKKzIwMDgtMDgtMDIgMTc6MTg6NDcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiBBbHdheXMgcG9zdCB0aGUgYXVkaW8tY29kZWMgdGFnLCBub3Qgb25seSBpZiBvdGhlciB0YWdzIGFyZSBwcmVzZW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjX2RlY19zZXR1cF9zZWVrYWJsZV9kZWNvZGVyKSwKKwkgIChnc3RfZmxhY19kZWNfc2V0dXBfc3RyZWFtX2RlY29kZXIpLAorCSAgKGdzdF9mbGFjX2RlY191cGRhdGVfbWV0YWRhdGEpOgorCSAgQWx3YXlzIHBvc3QgdGhlIGF1ZGlvLWNvZGVjIHRhZywgbm90IG9ubHkgaWYgb3RoZXIgdGFncyBhcmUgcHJlc2VudC4KKworMjAwOC0wOC0wMSAyMzoyNjo1MCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogQmFjayB0byBkZXZlbG9wbWVudCAtPiAwLjEwLjkuMQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQgLT4gMC4xMC45LjEKKworMjAwOC0wOC0wMSAxNTo1ODo0NyArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBhZGQgbWlzc2luZyBnc3RyZWFtZXIgcGx1Z2lucyB0byBzcGVjIGZpbGUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkIG1pc3NpbmcgZ3N0cmVhbWVyIHBsdWdpbnMgdG8gc3BlYyBmaWxlCisKKz09PSByZWxlYXNlIDAuMTAuOSA9PT0KKworMjAwOC0wNy0zMSAyMjoxMDoxNyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Rpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTAuOQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBSZWxlYXNlIDAuMTAuOQorCisyMDA4LTA3LTMxIDIxOjUwOjQ0ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDA4LTA3LTMxIDIxOjI2OjQ4ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogRG9uJ3QgdGhyb3cgYW4gZXJyb3Igd2hlbiBzb3VwIGNvbXBsZXRlcyBhIG1zZyB3aXRoIHN0YXR1cyAnY2FuY2VsbGVkJywgYXMgdGhhdCBpbmRpY2F0ZXMgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIERvbid0IHRocm93IGFuIGVycm9yIHdoZW4gc291cCBjb21wbGV0ZXMgYSBtc2cgd2l0aCBzdGF0dXMKKwkgICdjYW5jZWxsZWQnLCBhcyB0aGF0IGluZGljYXRlcyB3ZSBjYW5jZWxsZWQgYSByZXF1ZXN0IHdoaWxlCisJICBzaHV0dGluZyBkb3duIG9yIHNlZWtpbmcsIGFuZCBpdCdzIG5vdCBhbiBlcnJvci4KKwkgIEZpeGVzOiAjNTQwMzAwIGFnYWluLgorCisyMDA4LTA3LTI4IDIwOjE3OjQ2ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgY29uZmlndXJlLmFjOiAwLjEwLjguNCBwcmUtcmVsZWFzZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIDAuMTAuOC40IHByZS1yZWxlYXNlCisKKzIwMDgtMDctMjUgMTQ6NTA6MDMgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRml4IHNlZ21lbnQtc3RvcCByZWdyZXNzaW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2FjdGl2YXRlX3NlZ21lbnQpOgorCSAgRml4IHNlZ21lbnQtc3RvcCByZWdyZXNzaW9uLgorCSAgQWRkIGRvY3VtZW50YXRpb24gcmVnYXJkaW5nIHNlZ21lbnRzIGluIHF1aWNrdGltZSBmaWxlcyBieSBXaW0gVGF5bWFucy4KKwkgIEZpeGVzICM1NDQ1MDkKKworMjAwOC0wNy0yNCAyMzo1NTo1OCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogMC4xMC44LjMgcHJlLXJlbGVhc2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAwLjEwLjguMyBwcmUtcmVsZWFzZQorCSAgKiBwby9MSU5HVUFTOgorCSAgKiBwby9wdF9CUi5wbzoKKwkgIEFkZCBwdF9CUiB0cmFuc2xhdGlvbgorCisyMDA4LTA3LTIzIDIyOjAxOjIwICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIGdzdC9nb29tLzogRml4IGJ1aWxkIHdpdGggTVNWQzogaW5jbHVkZSBnbGliLmggdG8gZGVmaW5lIGlubGluZSBhcHByb3ByaWF0ZWx5LCB1c2UgaGVhZGVyIGd1YXJkcyB3aGVyZSBuZWVkZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vY29udm9sdmVfZnguYzoKKwkgICogZ3N0L2dvb20vZmlsdGVycy5jOgorCSAgKiBnc3QvZ29vbS9nb29tX2NvbmZpZy5oOgorCSAgKiBnc3QvZ29vbS9nb29tX2NvcmUuYzoKKwkgICogZ3N0L2dvb20vZ29vbV90b29scy5oOgorCSAgRml4IGJ1aWxkIHdpdGggTVNWQzogaW5jbHVkZSBnbGliLmggdG8gZGVmaW5lIGlubGluZSBhcHByb3ByaWF0ZWx5LAorCSAgdXNlIGhlYWRlciBndWFyZHMgd2hlcmUgbmVlZGVkLgorCSAgKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmM6CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICBGaXggYnVpbGQgd2l0aCBNU1ZDOiB1c2UgV1NBKiBjb25zdGFudHMvZnVuY3Rpb25zIHdoZXJlIGFwcHJvcHJpYXRlLCB1c2UKKwkgIGdfc25wcmludGYgcmF0aGVyIHRoYW4gc25wcmludGYuCisJICBGaXhlcyAjNTQ0NDMzLgorCisyMDA4LTA3LTIyIDA2OjMyOjAzICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9kZWJ1Zy9nc3R0YWdpbmplY3QuKjogU2VudCB0YWdzIGluIF90cmFuc2Zvcm1faXAoKSBpbnN0ZWFkIG9mIF9zdGFydCgpLiBGaXhlcyAjNTQzNDA0IHBhcnRpYWxseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVidWcvZ3N0dGFnaW5qZWN0LmM6CisJICAqIGdzdC9kZWJ1Zy9nc3R0YWdpbmplY3QuaDoKKwkgIFNlbnQgdGFncyBpbiBfdHJhbnNmb3JtX2lwKCkgaW5zdGVhZCBvZiBfc3RhcnQoKS4gRml4ZXMgIzU0MzQwNAorCSAgcGFydGlhbGx5LgorCisyMDA4LTA3LTE5IDE0OjEyOjM5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgY29uZmlndXJlLmFjOiAwLjEwLjguMiBwcmUtcmVsZWFzZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIDAuMTAuOC4yIHByZS1yZWxlYXNlCisKKzIwMDgtMDctMTkgMTM6NTA6NTMgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBleHQvTWFrZWZpbGUuYW06IEZpbmlzaCBob29raW5nIHVwIHB1bHNlYXVkaW8gcGx1Z2luIHRvIHRoZSBidWlsZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvTWFrZWZpbGUuYW06CisJICBGaW5pc2ggaG9va2luZyB1cCBwdWxzZWF1ZGlvIHBsdWdpbiB0byB0aGUgYnVpbGQuCisJICAqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOgorCSAgRml4IGNvbXBpbGF0aW9uIGVycm9yLgorCisyMDA4LTA3LTE5IDEzOjIzOjI5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgcG8vOiBBZGQgbmV3IGxpdGh1bmlhbiB0cmFuc2xhdGlvbiwgYW5kIGFkZCBmcmVuY2ggdG8gdGhlIExJTkdVQVMgZmlsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBwby9MSU5HVUFTOgorCSAgKiBwby9sdC5wbzoKKwkgIEFkZCBuZXcgbGl0aHVuaWFuIHRyYW5zbGF0aW9uLCBhbmQgYWRkIGZyZW5jaCB0byB0aGUgTElOR1VBUworCSAgZmlsZS4KKworMjAwOC0wNy0xOSAxMzowODo0MiArMDAwMCAgV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogRml4IFNvdXAgSFRUUCBzb3VyY2Ugc2Vla2luZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgRml4IFNvdXAgSFRUUCBzb3VyY2Ugc2Vla2luZy4KKwkgIFBhdGNoIEJ5OiBXb3V0ZXIgQ2xvZXRlbnMgIDx3b3V0ZXIgYXQgbWluZCBiZT4KKwkgIEZpeGVzOiAjNTQwMzAwCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5jdnNpZ25vcmU6CisJICBJZ25vcmUgbmV3IGNoZWNrIHByb2dyYW1zLgorCisyMDA4LTA3LTE5IDAxOjAxOjEzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgTW92ZSByZXBsYXlnYWluIGFuZCBpbnRlcmxlYXZlIHBsdWdpbnMgZnJvbSAtYmFkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBNb3ZlIHJlcGxheWdhaW4gYW5kIGludGVybGVhdmUgcGx1Z2lucyBmcm9tIC1iYWQuCisJICBGaXhlczogIzU0MzQwNgorCSAgRml4ZXM6ICM1MzYyMjgKKworMjAwOC0wNy0xOCAyMDowMzowNyArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogUmV2ZXJ0IElTTyBiYXNlIG1lZGlhIHNwZWMgYmFzZWQgcGl4ZWwtYXNwZWN0LXJhdGlvIGNhbGN1bGF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pLAorCSAgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBSZXZlcnQgSVNPIGJhc2UgbWVkaWEgc3BlYyBiYXNlZCBwaXhlbC1hc3BlY3QtcmF0aW8gY2FsY3VsYXRpb24uCisJICBGaXhlcyAjNTQzMzAwLgorCisyMDA4LTA3LTE3IDE2OjQyOjUzICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06IEZpeCBtaW5vciBidWlsZCBpc3N1ZXMgb24gbWFjb3N4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIEZpeCBtaW5vciBidWlsZCBpc3N1ZXMgb24gbWFjb3N4LgorCSAgRml4ZXMgIzU0MzA1NAorCisyMDA4LTA3LTE3IDE0OjQwOjUxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBPbmx5IHVzZSAtV25vLWF0dHJpYnV0ZXMgKHdoaWNoIGlzIHRoZXJlIHRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIHRoZSB0YWdsaWIgMS41IGhlYWRlcnMpIGlmIHRoZSBjKysgY29tcGlsZXIgYWN0dWFsbHkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6OgorCSAgKiBleHQvdGFnbGliL01ha2VmaWxlLmFtOjoKKwkgIE9ubHkgdXNlIC1Xbm8tYXR0cmlidXRlcyAod2hpY2ggaXMgdGhlcmUgdG8gd29yayBhcm91bmQgYQorCSAgYnVnIGluIHRoZSB0YWdsaWIgMS41IGhlYWRlcnMpIGlmIHRoZSBjKysgY29tcGlsZXIgYWN0dWFsbHkKKwkgIHN1cHBvcnRzIGl0ICgjNTQzMjU1KS4KKworMjAwOC0wNy0xNyAxMzo1NDozOCArMDAwMCAgQmVub2l0IEZvdWV0IDxiZW5vaXQuZm91ZXRAcHVycGxlbGFicy5jb20+CisKKwkgIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogQXZvaWQgY29tcGlsZXIgd2FybmluZyBieSBpbml0aWFsaXNpbmcgdmFyaWFibGUgdG8gTlVMTCAoIzU0MzI1OSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBCZW5vaXQgRm91ZXQgPGJlbm9pdC5mb3VldCBwdXJwbGVsYWJzIGNvbT4KKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfbmVnb3RpYXRlKToKKwkgIEF2b2lkIGNvbXBpbGVyIHdhcm5pbmcgYnkgaW5pdGlhbGlzaW5nIHZhcmlhYmxlIHRvIE5VTEwgKCM1NDMyNTkpLgorCisyMDA4LTA3LTE0IDE3OjE3OjQ3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9kZWJ1Zy9nc3R0YWdpbmplY3QuYzogRG9uJ3QgcGFzcyBOVUxMIHRhZ2xpc3RzIHRvIGdzdF90YWdfbGlzdF9pc19lbXB0eSgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWJ1Zy9nc3R0YWdpbmplY3QuYzogKGdzdF90YWdfaW5qZWN0X3N0YXJ0KToKKwkgIERvbid0IHBhc3MgTlVMTCB0YWdsaXN0cyB0byBnc3RfdGFnX2xpc3RfaXNfZW1wdHkoKS4KKworMjAwOC0wNy0xNCAxNzoxNTo0MiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy86IERvbid0IHVzZSBkZWNsYXJhdGlvbnMgYWZ0ZXIgc3RhdGVtZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZGVjLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6IChydHBfcGlwZWxpbmVfY3JlYXRlKSwKKwkgIChydHBfcGlwZWxpbmVfcnVuKToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzogKHNvdXBodHRwc3JjX3N1aXRlKToKKwkgIERvbid0IHVzZSBkZWNsYXJhdGlvbnMgYWZ0ZXIgc3RhdGVtZW50cy4KKworMjAwOC0wNy0xNCAxNjoyODoyNSArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogQWxpZ24gZG9jdW1lbnRhdGlvbiB3aXRoIHJlYWxpdHkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAgQWxpZ24gZG9jdW1lbnRhdGlvbiB3aXRoIHJlYWxpdHkuCisKKzIwMDgtMDctMTQgMTM6MTE6MTQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOiBFQUlfQUREUkZBTUlMWSB3YXMgb2Jzb2xldGVkIGluIEJTRCBhdCBzb21lIHBvaW50LiBEZWZpbmUgaXQgdG8gdGhlIG9sZCB2YWx1ZSAoMSkgaWYgaXQncyBuLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSAgRUFJX0FERFJGQU1JTFkgd2FzIG9ic29sZXRlZCBpbiBCU0QgYXQgc29tZSBwb2ludC4gRGVmaW5lIGl0IHRvIHRoZQorCSAgb2xkIHZhbHVlICgxKSBpZiBpdCdzIG5vdCBkZWZpbmVkIHdoaWNoIHNob3VsZCBub3QgY2F1c2UgYW55IHByb2JsZW1zCisJICBhcyB3ZSdyZSB1c2luZyBpdCBpbnRlcm5hbCBvbmx5IGFueXdheS4KKworMjAwOC0wNy0xNCAxMzowMjo0OCArMDAwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm9Abm52YS5vcmc+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogRml4IGJ1aWxkIG9mIGF2aWRlbXV4IG9uIGJpZyBlbmRpYW4gYXJjaGl0ZWN0dXJlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvIGF0IG5udmEgZG90IG9yZz4KKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9yaWZmX3BhcnNlX3ZwcnApOgorCSAgRml4IGJ1aWxkIG9mIGF2aWRlbXV4IG9uIGJpZyBlbmRpYW4gYXJjaGl0ZWN0dXJlcy4KKworMjAwOC0wNy0xMCAyMDo0Nzo1NiArMDAwMCAgVGhpYWdvIFNvdXNhIFNhbnRvcyA8dGhpYWdvc3NAbGNjLnVmY2cuZWR1LmJyPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IENvcnJlY3RseSBkaXN0aW5ndWlzaCA4Yml0IHZzIDE2Yml0IHJhdyBhdWRpby4gIEZpeGVzICM1NDI0MTAuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBUaGlhZ28gU291c2EgU2FudG9zIDx0aGlhZ29zcyBhdCBsY2MgZG90IHVmY2cgZG90IGVkdSBkb3QgYnI+CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfYXVkaW9fY2Fwcyk6CisJICBDb3JyZWN0bHkgZGlzdGluZ3Vpc2ggOGJpdCB2cyAxNmJpdCByYXcgYXVkaW8uICBGaXhlcyAjNTQyNDEwLgorCisyMDA4LTA3LTA4IDIxOjA1OjE4ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBTZXQgcGl4ZWwtYXNwZWN0LXJhdGlvIGluIGNhcHMgdXNpbmcgZGlzcGxheSB3aWR0aCBhbmQgaGVpZ2h0IHByb3ZpZGVkIGluIHRyYWNrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pLAorCSAgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBTZXQgcGl4ZWwtYXNwZWN0LXJhdGlvIGluIGNhcHMgdXNpbmcgZGlzcGxheSB3aWR0aCBhbmQgaGVpZ2h0CisJICBwcm92aWRlZCBpbiB0cmFjay4KKworMjAwOC0wNy0wOCAxMzo1OTo1MSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBjb25maWd1cmUuYWM6IERvbid0IGluY2x1ZGUgRVJST1JfQ0ZMQUdTIGluIEdTVF9DWFhGTEFHUyBhcyBpdCBtaWdodCBpbmNsdWRlIGZsYWdzIHRoYXQgYXJlIGludmFsaWQgZm9yIEMrKy4gRml4ZXMgYnUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBEb24ndCBpbmNsdWRlIEVSUk9SX0NGTEFHUyBpbiBHU1RfQ1hYRkxBR1MgYXMgaXQgbWlnaHQgaW5jbHVkZQorCSAgZmxhZ3MgdGhhdCBhcmUgaW52YWxpZCBmb3IgQysrLiBGaXhlcyBidWcgIzUxNjUwOS4KKworMjAwOC0wNy0wOCAxMjo1MTozNCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBEb24ndCB1c2UgZGVjbGFyYXRpb25zIGFmdGVyIHN0YXRlbWVudHMgYW5kIHZhcmlhYmxlIGxlbmd0aCBhcnJheXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IChnc3RfZHYxMzk0c3JjX3VyaV9zZXRfdXJpKToKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6IChnc3Rfc3BlZXhfZW5jX3NpbmtfZ2V0Y2Fwcyk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogKGdzdF93YXZwYWNrX2VuY19zZXRfd3BfY29uZmlnKToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfZml4YXRlKToKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfcHJvYmVfY2Fwc19mb3JfZm9ybWF0KToKKwkgICogdGVzdHMvZXhhbXBsZXMvZXF1YWxpemVyL2RlbW8uYzogKG1lc3NhZ2VfaGFuZGxlcik6CisJICAqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tYXVkaW90ZXN0LmM6IChtZXNzYWdlX2hhbmRsZXIpOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9kZW1vLW9zc3NyYy5jOiAobWVzc2FnZV9oYW5kbGVyKToKKwkgIERvbid0IHVzZSBkZWNsYXJhdGlvbnMgYWZ0ZXIgc3RhdGVtZW50cyBhbmQgdmFyaWFibGUgbGVuZ3RoIGFycmF5cy4KKworMjAwOC0wNy0wNyAyMToyODo1OCArMDAwMCAgRGFuaWVsIERyYWtlIDxkc2RAZ2VudG9vLm9yZz4KKworCSAgc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiBUcnkgcHJvZ3Jlc3NpdmUgdmlkZW8gaWYgaW50ZXJsYWNlZCBmYWlscy4gRml4ZXMgYnVnICM1NDE5NTYgYW5kIHRoZSB1c2FnZSBvZiB2NGwyc3JjIG9uIE9MUEMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBEYW5pZWwgRHJha2UgPGRzZCBhdCBnZW50b28gZG90IG9yZz4KKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfc2V0X2NhcHR1cmUpLAorCSAgKGdzdF92NGwyc3JjX2dldF9uZWFyZXN0X3NpemUpOgorCSAgVHJ5IHByb2dyZXNzaXZlIHZpZGVvIGlmIGludGVybGFjZWQgZmFpbHMuIEZpeGVzIGJ1ZyAjNTQxOTU2CisJICBhbmQgdGhlIHVzYWdlIG9mIHY0bDJzcmMgb24gT0xQQy4KKworMjAwOC0wNy0wNyAxNTozNDoxMiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuKjogUmV2ZXJ0IGxhc3QgY2hhbmdlOiBPbmx5IHRoZSBqaXR0ZXJidWZmZXIgaXMgYWJsZSB0byBjb252ZXJ0IFJUUCB0bworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOiAoZ3N0X3J0cF9zcGVleF9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX3NwZWV4X2RlcGF5X3Byb2Nlc3MpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuaDoKKwkgIFJldmVydCBsYXN0IGNoYW5nZTogT25seSB0aGUgaml0dGVyYnVmZmVyIGlzIGFibGUgdG8gY29udmVydCBSVFAgdG8KKwkgIEdzdHJlYW1lciB0aW1lc3RhbXBzIGFuZCBub3JtYWwgKGRlKXBheWxvYWRlcnMgc2hvdWxkIHNpbXBseSBjb3B5IGl0LgorCSAgUmVvcGVucyBidWcgIzU0MTc4Ny4KKworMjAwOC0wNy0wNyAxMDozMDo1MSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOiBJbmNsdWRlIHN0ZGxpYi5oIGZvciBhdG9pKCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkgIEluY2x1ZGUgc3RkbGliLmggZm9yIGF0b2koKS4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgVXNlIGZsb2F0aW5nIHBvaW50IG1hdGggZm9yIGxhdGVuY2llcyA8IDAgc2VjIGluIGxvZyBvdXRwdXQuCisKKzIwMDgtMDctMDcgMTA6MTY6MDcgKzAwMDAgIFRvbWFzeiBHcm9iZWxueSA8dG9tYXN6QGdyb2JlbG55Lm9zd2llY2VuaWEubmV0PgorCisJICBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuKjogVGFrZSB0aW1lc3RhbXAgZnJvbSB0aGUgUlRQIHBhY2tldCBhcyBhIGZpcnN0IHN0ZXAgdG8gZml4IHByb2JsZW1zIHdpdGggdHJhbnNtaXNzaW9uIG92ZXIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFRvbWFzeiBHcm9iZWxueSA8dG9tYXN6IGF0IGdyb2JlbG55IGRvdCBvc3dpZWNlbmlhIGRvdCBuZXQ+CisJICAqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOiAoZ3N0X3J0cF9zcGVleF9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX3NwZWV4X2RlcGF5X3Byb2Nlc3MpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuaDoKKwkgIFRha2UgdGltZXN0YW1wIGZyb20gdGhlIFJUUCBwYWNrZXQgYXMgYSBmaXJzdCBzdGVwIHRvIGZpeCBwcm9ibGVtcworCSAgd2l0aCB0cmFuc21pc3Npb24gb3ZlciBSVFAgd2hlbiB0aGUgbmV0d29yayBpcyBub3QgcmVsaWFibGUuCisJICBGaXhlcyBidWcgIzU0MTc4Ny4KKworMjAwOC0wNy0wNSAxOTowMToyOCArMDAwMCAgVGVybyBTYWFybmkgPHRlcm8uc2Fhcm5pQGdtYWlsLmNvbT4KKworCSAgZ3N0L3VkcC9nc3R1ZHBzcmMuYzogRml4IHBhcnNpbmcgb2YgdWRwOi8vIFVSSXMgY29udGFpbmluZyBJUHY2IGFkZHJlc3Nlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFRlcm8gU2Fhcm5pIDx0ZXJvIGRvdCBzYWFybmkgYXQgZ21haWwgZG90IGNvbT4KKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfc2V0X3VyaSk6CisJICBGaXggcGFyc2luZyBvZiB1ZHA6Ly8gVVJJcyBjb250YWluaW5nIElQdjYgYWRkcmVzc2VzLgorCSAgRml4ZXMgYnVnICM1NDE2NTAuCisKKzIwMDgtMDctMDQgMjA6NDM6MDcgKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJICBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogRG8gbm90IGxlYWsgaW5jb21pbmcgYnVmZmVycy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKGdzdF9nZGtfcGl4YnVmX2NoYWluKToKKwkgIERvIG5vdCBsZWFrIGluY29taW5nIGJ1ZmZlcnMuCisKKzIwMDgtMDctMDMgMTk6Mjc6NTMgKzAwMDAgIERhbWllbiBMZXNwaWF1IDxkYW1pZW4ubGVzcGlhdUBnbWFpbC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogRml4IGJ1aWxkIG9mIHRoZSBSVFAgcGx1Z2luIHdpdGggbWluZ3czMiBieSBsaW5raW5nIHRvIHdzMl8zMiBmb3IgaHRvbnMoKSBhbmQgaHRvbmwoKS4gRml4ZXMgYnVnICM1NDE0MTIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBEYW1pZW4gTGVzcGlhdSA8ZGFtaWVuIGRvdCBsZXNwaWF1IGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEZpeCBidWlsZCBvZiB0aGUgUlRQIHBsdWdpbiB3aXRoIG1pbmd3MzIgYnkgbGlua2luZyB0byB3czJfMzIKKwkgIGZvciBodG9ucygpIGFuZCBodG9ubCgpLiBGaXhlcyBidWcgIzU0MTQxMi4KKworMjAwOC0wNy0wMiAwOTo1MToxNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogSGFuZGxlIHBvc2l0aW9uIGFuZCBkdXJhdGlvbiBxdWVyeSBpbiBERUZBVUxUIGZvcm1hdCBpZiB0aGUgcGFkJ3MgdHJhY2sgaGFzIGEgZGVmYXVsdCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9jbGFzc19pbml0KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSksIChnc3RfbWF0cm9za2FfZGVtdXhfcXVlcnkpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9lbGVtZW50X3F1ZXJ5KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX2V2ZW50KToKKwkgIEhhbmRsZSBwb3NpdGlvbiBhbmQgZHVyYXRpb24gcXVlcnkgaW4gREVGQVVMVCBmb3JtYXQgaWYgdGhlCisJICBwYWQncyB0cmFjayBoYXMgYSBkZWZhdWx0IGZyYW1lIGR1cmF0aW9uIHNldC4KKwkgIEZpeCBzZWVraW5nIG5vdyB0aGF0IHRoZSBzZWdtZW50J3MgZHVyYXRpb24gZG9lc24ndCBjb250YWluIHRoZQorCSAgKHBvc3NpYmx5IHdyb25nIG9yIGluYWNjdXJhdGUpIGR1cmF0aW9uIG9mIHRoZSBNYXRyb3NrYSBmaWxlLgorCisyMDA4LTA3LTAyIDA5OjA0OjUwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogVXNlIE5BTiBjb25zdGFudCBpbnN0ZWFkIG9mIDAuMC8wLjAgaWYgcG9zc2libGUuIE5BTiBpcyBkZWZpbmVkIGluIG1hdGguaCBleGNlcHQgb24gTVNWQyB3aC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogKF9leHQyZGJsKToKKwkgIFVzZSBOQU4gY29uc3RhbnQgaW5zdGVhZCBvZiAwLjAvMC4wIGlmIHBvc3NpYmxlLiBOQU4gaXMgZGVmaW5lZAorCSAgaW4gbWF0aC5oIGV4Y2VwdCBvbiBNU1ZDIHdoZXJlIGl0IGlzIGRlZmluZWQgaW4geG1hdGguaC4KKwkgIEZpeGVzIGNvbXBpbGF0aW9uIHdpdGggTVNWQy4KKworMjAwOC0wNy0wMiAwODo1NzowNCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguKjogRG9uJ3Qgc2V0IHRoZSBzZWdtZW50IGR1cmF0aW9uIHRvIHRoZSBkdXJhdGlvbiBmcm9tIHRoZSBNYXRyb3NrYSBoZWFkZXIgYXMgdGhpcyB2YWx1ZSAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9yZXNldCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmZvKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfbG9vcF9zdHJlYW1fcGFyc2VfaWQpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkgIERvbid0IHNldCB0aGUgc2VnbWVudCBkdXJhdGlvbiB0byB0aGUgZHVyYXRpb24gZnJvbSB0aGUgTWF0cm9za2EKKwkgIGhlYWRlciBhcyB0aGlzIHZhbHVlIGNvdWxkIGJlIHdyb25nIGFuZCBpcyBqdXN0IGluZm9ybWF0aW9uYWwuCisKKzIwMDgtMDctMDIgMDg6NDc6MDAgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IElmIG5vIFRyYWNrcyBlbGVtZW50IGlzIGZvdW5kIHVudGlsIHRoZSBmaXJzdCBDbHVzdGVyIGlzIGZvdW5kIHNlYXJjaCBpdCBhbmQgZXJyb3Igb3V0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2xvb3Bfc3RyZWFtX3BhcnNlX2lkKToKKwkgIElmIG5vIFRyYWNrcyBlbGVtZW50IGlzIGZvdW5kIHVudGlsIHRoZSBmaXJzdCBDbHVzdGVyIGlzIGZvdW5kCisJICBzZWFyY2ggaXQgYW5kIGVycm9yIG91dCBpZiBub25lIGlzIGZvdW5kIGluIHRoZSBjb21wbGV0ZSBmaWxlLgorCisyMDA4LTA3LTAyIDA4OjE0OjM1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiBSZXN5bmMgbm9uLXN1YnRpdGxlIHRyYWNrcyB0b28gaWYgYSB0b28gbGFyZ2UgZ2FwIGNvbXBhcmVkIHRvIG90aGVyIHRyYWNrcyBpcyBkZXRlY3RlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9zeW5jX3N0cmVhbXMpOgorCSAgUmVzeW5jIG5vbi1zdWJ0aXRsZSB0cmFja3MgdG9vIGlmIGEgdG9vIGxhcmdlIGdhcCBjb21wYXJlZCB0byBvdGhlcgorCSAgdHJhY2tzIGlzIGRldGVjdGVkLgorCisyMDA4LTA3LTAxIDEzOjI4OjAyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogQWRkIHJhdyB2aWRlbyBwYXkgYW5kIGRlcGF5bG9hZGVycywgc2VlIFJGQzQxNzUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzogKGdzdF9ydHBfdnJhd19kZXBheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfdnJhd19kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfdnJhd19kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX3ZyYXdfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX3ZyYXdfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF92cmF3X2RlcGF5X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3J0cF92cmF3X2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6IChnc3RfcnRwX3ZyYXdfcGF5X2dldF90eXBlKSwKKwkgIChnc3RfcnRwX3ZyYXdfcGF5X2Jhc2VfaW5pdCksIChnc3RfcnRwX3ZyYXdfcGF5X2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfdnJhd19wYXlfaW5pdCksIChnc3RfcnRwX3ZyYXdfcGF5X2ZpbmFsaXplKSwKKwkgIChnc3RfcnRwX3ZyYXdfcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF92cmF3X3BheV9oYW5kbGVfYnVmZmVyKSwKKwkgIChnc3RfcnRwX3ZyYXdfcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHB2cmF3cGF5Lmg6CisJICBBZGQgcmF3IHZpZGVvIHBheSBhbmQgZGVwYXlsb2FkZXJzLCBzZWUgUkZDNDE3NS4KKworMjAwOC0wNi0zMCAyMjo1MzozOSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IERvbid0IHJldHVybiBHU1RfRkxPV19FUlJPUiB3aGVuIGJ1ZmZlcl9hbGxvYyBmYWlscyAtIHJldHVybiB3aGF0ZXZlciBpdCByZXR1cm5lZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgRG9uJ3QgcmV0dXJuIEdTVF9GTE9XX0VSUk9SIHdoZW4gYnVmZmVyX2FsbG9jIGZhaWxzIC0gcmV0dXJuCisJICB3aGF0ZXZlciBpdCByZXR1cm5lZC4KKworMjAwOC0wNi0yOSAxOTo1Mjo1MSArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIGdzdC9hdmkvYXZpLWlkcy5oOiBBZGQgdnBycCBjaHVuayByZWxhdGVkIHN0cnVjdHVyZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9hdmktaWRzLmg6CisJICBBZGQgdnBycCBjaHVuayByZWxhdGVkIHN0cnVjdHVyZXMuCisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcmlmZl9wYXJzZV92cHJwKSwKKwkgIChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSk6CisJICBQYXJzZSBvcHRpb25hbCB2cHJwIGNodW5rIGFuZCBhZGQgY2FsY3VsYXRlZCBwaXhlbC1hc3BlY3QtcmF0aW8KKwkgIHRvIGNhcHMuICBGaXhlcyAjNTM5NDgyLgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5oOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aV9tdXhfcGFkX3Jlc2V0KSwKKwkgIChnc3RfYXZpX211eF92aWRzaW5rX3NldF9jYXBzKSwgKGdzdF9hdmlfbXV4X3JpZmZfZ2V0X2F2aV9oZWFkZXIpOgorCSAgQWRkIGEgdnBycCBjaHVuayBpZiBub24tdHJpdmFsIHBpeGVsLWFzcGVjdC1yYXRpbyBwcm92aWRlZCBpbiBjYXBzLgorCisyMDA4LTA2LTI4IDE5OjMxOjQ2ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpbXV4LmM6IEFkanVzdCBhdmltdXggdW5pdCB0ZXN0IGFjY29yZGluZyB0byBpbmNyZWFzZWQgc3RyZWFtaGVhZGVyIHNpemUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpbXV4LmM6IChjaGVja19hdmltdXhfcGFkKToKKwkgIEFkanVzdCBhdmltdXggdW5pdCB0ZXN0IGFjY29yZGluZyB0byBpbmNyZWFzZWQgc3RyZWFtaGVhZGVyIHNpemUuCisKKzIwMDgtMDYtMjcgMTg6MTE6MDEgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEFkZCBEaXJhYyBzdHJlYW0gdHlwZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQWRkIERpcmFjIHN0cmVhbSB0eXBlCisKKzIwMDgtMDYtMjcgMTU6MjU6MDAgKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJICBnc3QvYXZpL2dzdGF2aW11eC4qOiBBZGQgOCBieXRlcyB0byBjdXJyZW50IHN0cmVhbWhlYWRlciB0byBtYWtlIGZvciBhIGNvbXBsZXRlIG9uZSBhbmQgdG8gbWFrZSBtb3JlIHBsYXllcnMgaGFwcHkuICAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aV9tdXhfcmlmZl9nZXRfYXZpX2hlYWRlcik6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4Lmg6CisJICBBZGQgOCBieXRlcyB0byBjdXJyZW50IHN0cmVhbWhlYWRlciB0byBtYWtlIGZvciBhIGNvbXBsZXRlIG9uZQorCSAgYW5kIHRvIG1ha2UgbW9yZSBwbGF5ZXJzIGhhcHB5LiAgRml4ZXMgIzUxOTQ2MC4KKworMjAwOC0wNi0yNiAxNjozNjo0NyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgc3lzL3Y0bDIvdjRsMl9jYWxscy5jOiBEb24ndCBpbmNsdWRlIHVudXNlZCBnc3R2NGwyeG92ZXJsYXkuaC4gRml4ZXMgYnVpbGQgaW4gY2FzZSB3aGVyZSBYMTEgaGVhZGVycyBhcmUgbm90IGluc3RhbGxlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6OgorCSAgRG9uJ3QgaW5jbHVkZSB1bnVzZWQgZ3N0djRsMnhvdmVybGF5LmguIEZpeGVzIGJ1aWxkCisJICBpbiBjYXNlIHdoZXJlIFgxMSBoZWFkZXJzIGFyZSBub3QgaW5zdGFsbGVkLgorCisyMDA4LTA2LTI2IDEwOjA3OjQ2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvZHYvZ3N0ZHYuYzogRml4IGNvbXBpbGF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9kdi9nc3Rkdi5jOiAocGx1Z2luX2luaXQpOgorCSAgRml4IGNvbXBpbGF0aW9uLgorCisyMDA4LTA2LTI2IDA5OjM3OjIzICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBleHQvZHYvZ3N0ZHYuYzogTWFya2luZyByYW5rIG9mIGR2ZGVjIGFzIEdTVF9SQU5LX01BUkdJTkFMIHNpbmNlIGl0J3MgdGhlIHNsb3dlc3QKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHYvZ3N0ZHYuYzogKHBsdWdpbl9pbml0KToKKwkgIE1hcmtpbmcgcmFuayBvZiBkdmRlYyBhcyBHU1RfUkFOS19NQVJHSU5BTCBzaW5jZSBpdCdzIHRoZSBzbG93ZXN0CisJICBEViBkZWNvZGVyIGF2YWlsYWJsZS4KKwkgIEZpeGVzICM1MzIzOTMKKworMjAwOC0wNi0yNSAwODoxMjoxOCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvdWRwL2dzdHVkcHNyYy5jOiBDYWxsIGdldHNvY2tuYW1lKCkgYWZ0ZXIgdGhlIGNhbGwgdG8gYmluZCgpIHRvIGdldCB1cGRhdGVkIHZhbHVlcyBmb3IgdGhlIHBvcnQsIGV0Yy4gVGhpcyBmaXhlcyAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19zdGFydCk6CisJICBDYWxsIGdldHNvY2tuYW1lKCkgYWZ0ZXIgdGhlIGNhbGwgdG8gYmluZCgpIHRvIGdldCB1cGRhdGVkIHZhbHVlcworCSAgZm9yIHRoZSBwb3J0LCBldGMuIFRoaXMgZml4ZXMgdGhlIHVzYWdlIG9mIHVkcHNyYyBvbiBhbm9ueW1vdXMKKwkgIGJpbmRpbmcgYW5kIGl0J3MgdXNhZ2UgYnkgcnRzcHNyYy4gRml4ZXMgYnVncyAjNTM5MzcyLCAjNTM5NTQ4LgorCSAgVGhhbmtzIHRvIEF1cmVsaWVuIEdyaW1hdWQgZm9yIHBvaW50aW5nIG91dCB0aGUgb2J2aW91cyBmaXguCisKKzIwMDgtMDYtMjUgMDc6NTc6MjYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgdGVzdHMvY2hlY2svcGlwZWxpbmVzL3dhdnBhY2suYzogUmVtb3ZlIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIGlkZW50aXR5IHRoYXQgaXMgZml4ZWQgaW4gMC4xMC4yMC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvd2F2cGFjay5jOiAoYnVzX2hhbmRsZXIpOgorCSAgUmVtb3ZlIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIGlkZW50aXR5IHRoYXQgaXMgZml4ZWQgaW4gMC4xMC4yMC4KKworMjAwOC0wNi0yNSAwNjozNjo1OCArMDAwMCAgSmFzb24gRG9uZW5mZWxkIDxCdWdaaWxsYUB6eDJjNC5jb20+CisKKwkgIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IEZpeCBIVFRQIGF1dGggc3VwcG9ydCB3aXRoIHVzZXIvcGFzc3dvcmQgcGFzc2VkIHZpYSB0aGUgVVJJLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSmFzb24gRG9uZW5mZWxkIDxCdWdaaWxsYSBhdCB6eDJjNCBkb3QgY29tPgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOiAoZ3N0X3NvdXBfaHR0cF9zcmNfZ290X2hlYWRlcnNfY2IpOgorCSAgRml4IEhUVFAgYXV0aCBzdXBwb3J0IHdpdGggdXNlci9wYXNzd29yZCBwYXNzZWQgdmlhIHRoZSBVUkkuCisJICBGaXhlcyBidWcgIzU0MDA2Ny4KKworMjAwOC0wNi0yNCAxNTo0MjozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBEZXBlbmQgb24gcmVsZWFzZWQgdmVyc2lvbnMgb2YgY29yZSBhbmQgLWJhc2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgRGVwZW5kIG9uIHJlbGVhc2VkIHZlcnNpb25zIG9mIGNvcmUgYW5kIC1iYXNlLgorCisyMDA4LTA2LTIzIDE2OjEzOjQwICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IEZpeCBidWdneSBmb3JtYXQgc3RyaW5ncyBpbiBtYWNyb3MuIChtYWtlcyBpdCBidWlsZCBvbiBPUyBYIGFnYWluLi4uKQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA4LTA2LTIzICBKdWxpZW4gTW91dHRlICA8anVsaWVuQGZsdWVuZG8uY29tPgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcmVhZF90cmFja19lbmNvZGluZyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2Jsb2NrZ3JvdXBfb3Jfc2ltcGxlYmxvY2spOiBGaXggYnVnZ3kKKwkgIGZvcm1hdCBzdHJpbmdzIGluIG1hY3Jvcy4gKG1ha2VzIGl0IGJ1aWxkIG9uIE9TIFggYWdhaW4uLi4pCisKKzIwMDgtMDYtMjAgMTY6MjQ6MTEgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBnc3QvOiBBZGRlZCBkZWJ1Zy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgQWRkZWQgZGVidWcuCisKKzIwMDgtMDYtMjAgMTU6MjE6NTkgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogY29tbW9uOgorCSogY29uZmlndXJlLmFjOgorCSAgc3dpdGNoIHY0bDJzcmMgZnJvbSBleHBlcmltZW50YWwgdG8gbm9ybWFsIGJ1aWxkLiBGaXhlcyAjNTM2ODMxCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHN3aXRjaCB2NGwyc3JjIGZyb20gZXhwZXJpbWVudGFsIHRvIG5vcm1hbCBidWlsZC4gRml4ZXMgIzUzNjgzMQorCisyMDA4LTA2LTE5IDExOjI0OjU0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGc3MjZwYXkuYzogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBzbyB0aGF0IHdlIGNhbiBjb21waWxlIGFnYWluLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOiAoZ3N0X3J0cF9nNzI2X3BheV9zZXRjYXBzKToKKwkgIFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgc28gdGhhdCB3ZSBjYW4gY29tcGlsZSBhZ2Fpbi4KKworMjAwOC0wNi0xOSAxMTowNjoyOSArMDAwMCAgUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2pAYXhpcy5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOiBObyBuZWVkIHRvIGNoZWNrIGZvciBhdWRpby9HNzIzIGFuZCBhdWRpby8zMktBRFBDTSBoZXJlIGFzIHRoZXkgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6IChnc3RfcnRwX2c3MjZfcGF5X3NldGNhcHMpOgorCSAgTm8gbmVlZCB0byBjaGVjayBmb3IgYXVkaW8vRzcyMyBhbmQgYXVkaW8vMzJLQURQQ00gaGVyZSBhcyB0aGV5IGFyZQorCSAgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KKworMjAwOC0wNi0xOSAxMDo1ODo1NyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogVXNlIEdfR0lOVDY0X0NPTlNUQU5ULCB0aGlzIGZpeGVzIHRoZSBkdXJhdGlvbiBxdWVyeSBvbiBmaWxlcyB3aXRob3V0IGtub3duIGxlbmd0aC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogKGdzdF93YXZwYWNrX3BhcnNlX3Jlc2V0KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9zcmNfcXVlcnkpLCAoZ3N0X3dhdnBhY2tfcGFyc2VfY3JlYXRlX3NyY19wYWQpOgorCSAgVXNlIEdfR0lOVDY0X0NPTlNUQU5ULCB0aGlzIGZpeGVzIHRoZSBkdXJhdGlvbiBxdWVyeSBvbiBmaWxlcyB3aXRob3V0CisJICBrbm93biBsZW5ndGguCisKKzIwMDgtMDYtMTkgMTA6NDg6NTcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thLzogRml4IGRlbXV4aW5nIG9mIFdhdlBhY2sgZmlsZXMuIE11eGluZyBpcyBzdGlsbCBicm9rZW4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2FkZF93dnBrX2hlYWRlciksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2F1ZGlvX2NhcHMpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICBGaXggZGVtdXhpbmcgb2YgV2F2UGFjayBmaWxlcy4gTXV4aW5nIGlzIHN0aWxsIGJyb2tlbi4KKworMjAwOC0wNi0xOSAwOToxMjo1NSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvOiBBZGQgYSAidmZ1bmMiIHRvIHRoZSB0cmFjayBjb250ZXh0IGZvciBwb3N0cHJvY2Vzc2luZyBmcmFtZXMgYW5kIGNvbnZlcnQgdGhlIHdhdnBhY2sgYW5kIHN1YnRpdGxlIHBvc3QuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV90cmFja19mcmVlKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfYWRkX21wZWdfc2VxX2hlYWRlciksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2FkZF93dnBrX2hlYWRlciksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2NoZWNrX3N1YnRpdGxlX2J1ZmZlciksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2Jsb2NrZ3JvdXBfb3Jfc2ltcGxlYmxvY2spLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF92aWRlb19jYXBzKSwgKGdzdF9tYXRyb3NrYV9kZW11eF9hdWRpb19jYXBzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3VidGl0bGVfY2Fwcyk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIEFkZCBhICJ2ZnVuYyIgdG8gdGhlIHRyYWNrIGNvbnRleHQgZm9yIHBvc3Rwcm9jZXNzaW5nIGZyYW1lcyBhbmQKKwkgIGNvbnZlcnQgdGhlIHdhdnBhY2sgYW5kIHN1YnRpdGxlIHBvc3Rwcm9jZXNzaW5nIHRvIHRoaXMgdmZ1bmMuCisJICBDb3B5IGJ1ZmZlciBmbGFncyBpbiB0aG9zZSBmdW5jdGlvbnMgdG8gdGhlIG5ldyBidWZmZXJzIHRvby4KKwkgIFBhcnNlIENvZGVjU3RhdGUgZWxlbWVudHMgb2YgQmxvY2tzLgorCSAgQWRkIGEgcG9zdHByb2Nlc3NpbmcgZnVuY3Rpb24gZm9yIE1QRUcgdmlkZW8gdGhhdCBhZGRzIHRoZSBzZXF1ZW5jZQorCSAgaGVhZGVyIGZyb20gdGhlIGNvZGVjIHByaXZhdGUgZGF0YSBvciBjb2RlYyBzdGF0ZSB0byB0aGUgZnJhbWVzIGlmCisJICBpdCdzIG5vdCBhbHJlYWR5IHRoZXJlLgorCisyMDA4LTA2LTE5IDA4OjIyOjE2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiBJZiBhIGdhcCBvZiBtb3JlIHRoYW4gMS8yIHNlY29uZCBpcyBmb3VuZCBpbiBvbmUgc3RyZWFtIHNlbmQgYQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrKToKKwkgIElmIGEgZ2FwIG9mIG1vcmUgdGhhbiAxLzIgc2Vjb25kIGlzIGZvdW5kIGluIG9uZSBzdHJlYW0gc2VuZCBhCisJICBORVdTRUdNRU5UIGV2ZW50IHRvIG5vdCBzdGFsbCB0aGUgcGlwZWxpbmUgaWYgdGhlIGdhcCBpcyB0b28gbGFyZ2UuCisJICBUaGlzIGFsc28gZml4ZXMgTWF0cm9za2EgZmlsZXMgd2hlcmUgdGhlIGZpcnN0IGJ1ZmZlciBkb2Vzbid0IHN0YXJ0CisJICBhdCB0aW1lc3RhbXAgMC4gRml4ZXMgYnVnICM0MjkzMjIuCisJICBUaGUgZHVyYXRpb24gb2YgYSBibG9jayBpcyB0aGUgZGVmYXVsdCBkdXJhdGlvbiBtdWx0aXBsaWVkIHdpdGggdGhlCisJICBudW1iZXIgb2YgbGFjZXMuIEV2ZXJ5IGxhY2UgaXMgb25lIGZyYW1lIGFuZCB0aGUgZGVmYXVsdCBkdXJhdGlvbgorCSAgaXMgdGhlIGR1cmF0aW9uIG9mIG9uZSBmcmFtZS4gVGhpcyBmaXhlcyBwbGF5YmFjayBvZiBmaWxlcyB0aGF0IHVzZQorCSAgbGFjaW5nIGZvciBzb21lIHRyYWNrcy4KKworMjAwOC0wNi0xOCAyMDowOToyOCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogVXBkYXRlIEZJWE1FL1RPRE9zIGFuZCBvbmx5IGlnbm9yZSBFT1MgYXQgdGhlIGNlbnRyYWwsIGltcG9ydGFudCBwbGFjZSBpbnN0ZWFkIG9mIHNldmUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfY29udGVudHNfc2Vla2VudHJ5KToKKwkgIFVwZGF0ZSBGSVhNRS9UT0RPcyBhbmQgb25seSBpZ25vcmUgRU9TIGF0IHRoZSBjZW50cmFsLCBpbXBvcnRhbnQgcGxhY2UKKwkgIGluc3RlYWQgb2Ygc2V2ZXJhbCBwbGFjZXMuCisKKzIwMDgtMDYtMTggMTY6NTU6MDUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOiBGaXggY2FwcywgU2VlICM1Mzg4OTEuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJICBGaXggY2FwcywgU2VlICM1Mzg4OTEuCisKKzIwMDgtMDYtMTggMTA6Mjg6MjAgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IEltcHJvdmUgZGVidWcgb3V0cHV0IGV2ZXJ5d2hlcmUgYW5kIGZpeCB0aGUgRU9TIGxvZ2ljLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X3Jlc2V0KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3RyZWFtX2Zyb21fbnVtKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfZW5jb2RpbmdfY21wKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfZW5jb2Rpbmdfb3JkZXJfdW5pcXVlKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcmVhZF90cmFja19lbmNvZGluZyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3JlYWRfdHJhY2tfZW5jb2RpbmdzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfdHJhY2tudW1iZXJfdW5pcXVlKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSksIChnc3RfbWF0cm9za2FfZGVtdXhfaW5pdF9zdHJlYW0pLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV90cmFja3MpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmRleF9jdWV0cmFjayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2luZGV4X3BvaW50ZW50cnkpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmRleCksIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfaW5mbyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX21ldGFkYXRhX2lkX3NpbXBsZV90YWcpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9tZXRhZGF0YV9pZF90YWcpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9tZXRhZGF0YSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2F0dGFjaGVkX2ZpbGUpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9hdHRhY2htZW50cyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NoYXB0ZXJzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3luY19zdHJlYW1zKSwgKGdzdF9tYXRyb3NrYV9kZWNvZGVfYnVmZmVyKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NsdXN0ZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9jb250ZW50c19zZWVrZW50cnkpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9jb250ZW50cyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2xvb3Bfc3RyZWFtX3BhcnNlX2lkKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfbG9vcCk6CisJICBJbXByb3ZlIGRlYnVnIG91dHB1dCBldmVyeXdoZXJlIGFuZCBmaXggdGhlIEVPUyBsb2dpYy4KKwkgIENoZWNrIHRoZSB2YWx1ZXMgb2YgdGhlIENvbnRlbnRFbmNvZGluZyBlbGVtZW50cyBtb3JlIHN0cmljdGx5IGFuZAorCSAgZG9uJ3QgdXNlIHRyYWNrcyBmb3Igd2hpY2ggaXQncyBpbnZhbGlkLgorCSAgQ2hlY2sgdGhhdCB0aGUgdHJhY2sgbnVtYmVyIGlzIHVuaXF1ZSBmb3IgdGhpcyBzdHJlYW0uCisJICBDaGVjayB0aGF0IHNlZWsgcG9zaXRpb25zIGFyZSBiZWxvdyBHX01BWElOVDY0IGFzIG91ciBzZWVrcyBhcmUKKwkgIGludDY0LWJhc2VkIGFuZCBvdmVyZmxvd3Mgd2lsbCBmYWlsIGJhZGx5LgorCSAgQWZ0ZXIgc2Vla3MgYWxzbyBkb24ndCBwdXNoIFNpbXBsZUJsb2NrcyB1bnRpbCB0aGUgZmlyc3Qgb25lCisJICBjb250YWluaW5nIGEga2V5ZnJhbWUgaXMgZm91bmQuIEJlZm9yZSB0aGlzIHdhcyBkb25lIG9ubHkgZm9yIG5vcm1hbAorCSAgQmxvY2tzLgorCSAgVXBkYXRlIHNvbWUgRklYTUUvVE9ET3MuCisJICAqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogKGdzdF9lYm1sX3JlYWRfcGVla19ieXRlcyksCisJICAoZ3N0X2VibWxfcmVhZF91dGY4KSwgKGdzdF9lYm1sX3JlYWRfaGVhZGVyKToKKwkgIEltcHJvdmUgZGVidWcgb3V0cHV0LgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJICAoZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfdmlkZW9fY29udGV4dCk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9tdXhfdmlkZW9fcGFkX3NldGNhcHMpOgorCSAgUmVtb3ZlIGV5ZSBtb2RlIGFuZCBkb24ndCBwYXJzZSBpdCBhbnltb3JlLiBXZSBjYW4ndCB1c2UgdGhhdAorCSAgaW5mb3JtYXRpb24gaW4gR1N0cmVhbWVyIHlldCBzbyBpdCdzIHVzZWxlc3MuCisKKzIwMDgtMDYtMTggMTA6MTI6NTcgKzAwMDAgIG1lcnNhZCA8bWVyc2FkQGF4aXMuY29tPgorCisJICBnc3QvcnRwLzogQWRkZWQgRzcyNiBwYXkvZGVwYXlsb2FkZXJzLiBGaXhlcyAjNTM4ODkxLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogbWVyc2FkIDxtZXJzYWQgYXQgYXhpcyBkb3QgY29tPgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwL2dzdHJ0cC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOiAoZ3N0X3J0cF9nNzI2X2RlcGF5X2Jhc2VfaW5pdCksCisJICAoZ3N0X3J0cF9nNzI2X2RlcGF5X2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9nNzI2X2RlcGF5X2luaXQpLAorCSAgKGdzdF9ydHBfZzcyNl9kZXBheV9zZXRjYXBzKSwgKGdzdF9ydHBfZzcyNl9kZXBheV9wcm9jZXNzKSwKKwkgIChnc3RfcnRwX2c3MjZfZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGc3MjZwYXkuYzogKGdzdF9ydHBfZzcyNl9wYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX2c3MjZfcGF5X2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9nNzI2X3BheV9pbml0KSwKKwkgIChnc3RfcnRwX2c3MjZfcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9nNzI2X3BheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5oOgorCSAgQWRkZWQgRzcyNiBwYXkvZGVwYXlsb2FkZXJzLiBGaXhlcyAjNTM4ODkxLgorCisyMDA4LTA2LTE3IDEwOjE0OjQ3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9VUkxTOiBTb21lIG1vcmUgdXJscy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9VUkxTOgorCSAgU29tZSBtb3JlIHVybHMuCisJICAqIGdzdC9zbXB0ZS9iYXJib3h3aXBlcy5jOgorCSAgQWRkIGEgY29tbWVudAorCSAgKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXY0bDItSDI2NC1hbHNhc3JjLVBDTUEuc2g6CisJICBGaXggdHlwbywgYWRkIGF1ZGlvcmVzYW1wbGUgdG8gdGhlIHBpcGVsaW5lLgorCisyMDA4LTA2LTE3IDEwOjA1OjU1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvbGlibW5nLzogU29tZXdoYXQgcG9ydCBtbmdlbmMgYW5kIG1uZ2RlYyB0byAwLjEwLiBEb2VzIG5vdCB3b3JrIHlldCBhbmQgaGFzIG1hbnkgYml0cyBpZmRlZmZlZCBvdXQgc3RpbGwuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2xpYm1uZy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xpYm1uZy9nc3RtbmcuYzogKHBsdWdpbl9pbml0KToKKwkgICogZXh0L2xpYm1uZy9nc3RtbmdkZWMuYzogKGdzdF9tbmdfZGVjX2Jhc2VfaW5pdCksCisJICAoZ3N0X21uZ19kZWNfY2xhc3NfaW5pdCksIChnc3RfbW5nX2RlY19zaW5rX3NldGNhcHMpLAorCSAgKGdzdF9tbmdfZGVjX2luaXQpLCAoZ3N0X21uZ19kZWNfc3JjX2dldGNhcHMpLCAoZ3N0X21uZ19kZWNfbG9vcCksCisJICAoZ3N0X21uZ19kZWNfZ2V0X3Byb3BlcnR5KSwgKGdzdF9tbmdfZGVjX3NldF9wcm9wZXJ0eSksCisJICAobW5nZGVjX2Vycm9yKSwgKG1uZ2RlY19vcGVuc3RyZWFtKSwgKG1uZ2RlY19jbG9zZXN0cmVhbSksCisJICAoZ3N0X21uZ19kZWNfc2lua19ldmVudCksIChtbmdkZWNfcmVhZGRhdGEpLCAobW5nZGVjX3NldHRpbWVyKSwKKwkgIChtbmdkZWNfcHJvY2Vzc2hlYWRlciksIChtbmdkZWNfZ2V0Y2FudmFzbGluZSksIChtbmdkZWNfcmVmcmVzaCksCisJICAoZ3N0X21uZ19kZWNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2xpYm1uZy9nc3RtbmdkZWMuaDoKKwkgICogZXh0L2xpYm1uZy9nc3RtbmdlbmMuYzogKGdzdF9tbmdfZW5jX2Jhc2VfaW5pdCksCisJICAoZ3N0X21uZ19lbmNfY2xhc3NfaW5pdCksIChnc3RfbW5nX2VuY19zaW5rX3NldGNhcHMpLAorCSAgKGdzdF9tbmdfZW5jX2luaXQpLCAoZ3N0X21uZ19lbmNfY2hhaW4pLAorCSAgKGdzdF9tbmdfZW5jX2dldF9wcm9wZXJ0eSksIChnc3RfbW5nX2VuY19zZXRfcHJvcGVydHkpOgorCSAgKiBleHQvbGlibW5nL2dzdG1uZ2VuYy5oOgorCSAgU29tZXdoYXQgcG9ydCBtbmdlbmMgYW5kIG1uZ2RlYyB0byAwLjEwLiBEb2VzIG5vdCB3b3JrIHlldCBhbmQgaGFzIG1hbnkKKwkgIGJpdHMgaWZkZWZmZWQgb3V0IHN0aWxsLgorCisyMDA4LTA2LTE2IDExOjM0OjU0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiBXaGVuIGNvbXBhcmluZyBpbmRleCBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIHRpbWUgY29tcGFyZSB0aGVpciBibG9jayBudW1iZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfaW5kZXhfY29tcGFyZSk6CisJICBXaGVuIGNvbXBhcmluZyBpbmRleCBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIHRpbWUgY29tcGFyZSB0aGVpcgorCSAgYmxvY2sgbnVtYmVyLgorCisyMDA4LTA2LTE2IDExOjMxOjA2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9hdHRhY2hlZF9maWxlKQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9hdHRhY2hlZF9maWxlKQorCSAgSW5pdCB2YXJpYWJsZSB0byBOVUxMIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcuCisKKzIwMDgtMDYtMTYgMTA6NTk6MzkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thLzogUGFyc2UgQXR0YWNobWVudHMgYW5kIHBvc3QgdGhlbSBhcyBHU1RfVEFHX0lNQUdFIGlmIHdlIGRldGVjdCBpdCBhcyBpbWFnZSBhbmQgb3RoZXJ3aXNlIGFzIEdTVF9UQUdfQVRULi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9yZXNldCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2F0dGFjaGVkX2ZpbGUpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9hdHRhY2htZW50cyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NvbnRlbnRzX3NlZWtlbnRyeSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2xvb3Bfc3RyZWFtX3BhcnNlX2lkKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuYzogKGdzdF9tYXRyb3NrYV9yZWdpc3Rlcl90YWdzKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EuYzogKHBsdWdpbl9pbml0KToKKwkgIFBhcnNlIEF0dGFjaG1lbnRzIGFuZCBwb3N0IHRoZW0gYXMgR1NUX1RBR19JTUFHRSBpZiB3ZSBkZXRlY3QKKwkgIGl0IGFzIGltYWdlIGFuZCBvdGhlcndpc2UgYXMgR1NUX1RBR19BVFRBQ0hNRU5ULiBJbmNsdWRlIGZpbGVuYW1lCisJICBhbmQgZGVzY3JpcHRpb24gb2YgdGhlIGF0dGFjaG1lbnRzIGluIHRoZSBjYXBzLiBGaXhlcyBidWcgIzUzNzYyMi4KKworMjAwOC0wNi0xNiAxMDowOTowMyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6IEFkZCBtb2RlIHByb3BlcnR5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiAoZ3N0X3NwZWV4X2VuY19tb2RlX2dldF90eXBlKSwKKwkgIChnc3Rfc3BlZXhfZW5jX2NsYXNzX2luaXQpLCAoZ3N0X3NwZWV4X2VuY19zaW5rX2dldGNhcHMpLAorCSAgKGdzdF9zcGVleF9lbmNfZ2V0X2xhdGVuY3kpLCAoZ3N0X3NwZWV4X2VuY19nZXRfcXVlcnlfdHlwZXMpLAorCSAgKGdzdF9zcGVleF9lbmNfc3JjX3F1ZXJ5KSwgKGdzdF9zcGVleF9lbmNfaW5pdCksCisJICAoZ3N0X3NwZWV4X2VuY19zZXR1cCksIChnc3Rfc3BlZXhfZW5jX3B1c2hfYnVmZmVyKSwKKwkgIChnc3Rfc3BlZXhfZW5jX2NoYWluKSwgKGdzdF9zcGVleF9lbmNfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfc3BlZXhfZW5jX3NldF9wcm9wZXJ0eSk6CisJICBBZGQgbW9kZSBwcm9wZXJ0eS4KKwkgIFNvbWUgY2xlYW51cHMsIGFkZCBtb3JlIGRlYnVnIGluZm8uCisJICBBZGQgbGF0ZW5jeSBxdWVyeS4KKworMjAwOC0wNi0xNiAwOTo1NDoyNyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IFJldHVybiBHU1RfRkxPV19VTkVYUEVDVEVEIGluc3RlYWQgb2YgR1NUX0ZMT1dfRVJST1Igb24gc2hvcnQgcmVhZHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOiAoZ3N0X2VibWxfcmVhZF9wZWVrX2J5dGVzKToKKwkgIFJldHVybiBHU1RfRkxPV19VTkVYUEVDVEVEIGluc3RlYWQgb2YgR1NUX0ZMT1dfRVJST1Igb24gc2hvcnQgcmVhZHMuCisJICBJZiB3ZSBnZXQgbGVzcyBieXRlcyB0aGFuIHJlcXVlc3RlZCB3ZSBjYW4ndCBkbyBhbnl0aGluZyBleGNlcHQgZG9pbmcKKwkgIG91ciBFT1MgbG9naWMuCisKKzIwMDgtMDYtMTUgMTk6MDk6NTQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thLzogVXNlIGEgR0FycmF5IGZvciBzdG9yaW5nIHRoZSBDdWUgKGkuZS4gc2VlaykgaW5mb3JtYXRpb24sIHN0b3JlIHRoZSBDdWVUcmFja1Bvc2l0aW9ucyBmb3IgZXZlcnkgdHJhY2ssLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfcmVzZXQpLAorCSAgKGdzdF9tYXRyb3NrYWRlbXV4X2RvX2luZGV4X3NlZWspLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmRleF9jdWV0cmFjayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2luZGV4X3BvaW50ZW50cnkpLAorCSAgKGdzdF9tYXRyb3NrYV9pbmRleF9jb21wYXJlKSwgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmRleCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX21ldGFkYXRhKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIFVzZSBhIEdBcnJheSBmb3Igc3RvcmluZyB0aGUgQ3VlIChpLmUuIHNlZWspIGluZm9ybWF0aW9uLCBzdG9yZQorCSAgdGhlIEN1ZVRyYWNrUG9zaXRpb25zIGZvciBldmVyeSB0cmFjaywgc3RvcmUgdGhlIGJsb2NrIG51bWJlcgorCSAgYW5kIG9wdGltaXplIHNlYXJjaGluZyBpbiB0aGUgYXJyYXkgYnkgc29ydGluZyBpdCBhZnRlciB0aGUgbGFzdAorCSAgZWxlbWVudCB3YXMgYWRkZWQuCisJICBGaXggYSBzbWFsbCBtZW1vcnkgbGVhayB3aGVuIHRyeWluZyB0byBwYXJzZSBhIHRhZ3MgZWxlbWVudCB0aGF0IHdhcworCSAgYWxyZWFkeSBwYXJzZWQuCisKKzIwMDgtMDYtMTUgMTU6Mjk6MjkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC4qOiBEb24ndCB3cml0ZSBhbm90aGVyIFNlZWtIZWFkIHdoaWNoIGluZGV4ZXMgYWxsIENsdXN0ZXJzIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUuIFRoaXMgaXNuLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9yZXNldCksCisJICAoZ3N0X21hdHJvc2thX211eF9zdGFydCksIChnc3RfbWF0cm9za2FfbXV4X2ZpbmlzaCksCisJICAoZ3N0X21hdHJvc2thX211eF93cml0ZV9kYXRhKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgRG9uJ3Qgd3JpdGUgYW5vdGhlciBTZWVrSGVhZCB3aGljaCBpbmRleGVzIGFsbCBDbHVzdGVycyB0byB0aGUgZW5kIG9mCisJICB0aGUgZmlsZS4gVGhpcyBpc24ndCB1c2VmdWwgZm9yIGFueXRoaW5nIGFuZCBqdXN0IGluY3JlYXNlcyBmaWxlc2l6ZS4KKworMjAwOC0wNi0xNSAxNTowMTozMCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IFByZXZlbnQgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3Mgd2hlbiByZWFkaW5nIGZsb2F0cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChfZXh0MmRibCksIChnc3RfZWJtbF9yZWFkX2Zsb2F0KToKKwkgIFByZXZlbnQgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3Mgd2hlbiByZWFkaW5nIGZsb2F0cy4KKworMjAwOC0wNi0xNSAxNDowODo0MSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvOiBNYWtlIHN1cmUgdGhhdCBldmVyeSBUYWdzIGVsZW1lbnQgaXMgb25seSBwYXJzZWQgb25jZSBhbmQgaXQncyBjb250YWluaW5nIHRhZ3MgYXJlIG9ubHkgcG9zdGVkIG9uY2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmg6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X3Jlc2V0KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfbWV0YWRhdGEpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkgIE1ha2Ugc3VyZSB0aGF0IGV2ZXJ5IFRhZ3MgZWxlbWVudCBpcyBvbmx5IHBhcnNlZCBvbmNlIGFuZCBpdCdzCisJICBjb250YWluaW5nIHRhZ3MgYXJlIG9ubHkgcG9zdGVkIG9uY2UuCisKKzIwMDgtMDYtMTUgMDk6NDM6MjUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thLzogSGFuZGxlIEVCTUwgZWxlbWVudHMgbGlrZSBWb2lkIG9yIENSQzMyIGluIHRoZSBFYm1sUmVhZCBiYXNlIGNsYXNzIGFscmVhZHkuIFRoZXkncmUgbm90IHVzZWZ1bCBpbiB0aGUgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOiAoZ3N0X2VibWxfcGVla19pZCksCisJICAoZ3N0X2VibWxfcmVhZF9oZWFkZXIpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfc3RyZWFtKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfdHJhY2tzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfaW5kZXhfY3VldHJhY2spLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmRleF9wb2ludGVudHJ5KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfaW5kZXgpLCAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2luZm8pLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9tZXRhZGF0YV9pZF9zaW1wbGVfdGFnKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfbWV0YWRhdGFfaWRfdGFnKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfbWV0YWRhdGEpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9hdHRhY2htZW50cyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NoYXB0ZXJzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NsdXN0ZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9jb250ZW50c19zZWVrZW50cnkpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9jb250ZW50cyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2xvb3Bfc3RyZWFtX3BhcnNlX2lkKToKKwkgIEhhbmRsZSBFQk1MIGVsZW1lbnRzIGxpa2UgVm9pZCBvciBDUkMzMiBpbiB0aGUgRWJtbFJlYWQgYmFzZSBjbGFzcworCSAgYWxyZWFkeS4gVGhleSdyZSBub3QgdXNlZnVsIGluIHRoZSBtYXRyb3NrYSBwYXJzZXIgYW5kIG9ubHkgY2F1c2UKKwkgIGFkZGl0aW9uYWwgY29kZS4KKworMjAwOC0wNi0xNCAxNTo1MToyNSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvOiBSZXZlcnNlIHRoZSBsZXZlbCBsaXN0IGFzIHdlIHVzdWFsbHkgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgZmlyc3QgZWxlbWVudCBvciB3YW50IHRvIGFkZCBhIG5ldyBmaXIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChnc3RfZWJtbF9sZXZlbF9mcmVlKSwKKwkgIChnc3RfZWJtbF9maW5hbGl6ZSksIChnc3RfZWJtbF9yZWFkX2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X2VibWxfcmVhZF9lbGVtZW50X2xldmVsX3VwKSwgKGdzdF9lYm1sX3JlYWRfbWFzdGVyKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NvbnRlbnRzX3NlZWtlbnRyeSk6CisJICBSZXZlcnNlIHRoZSBsZXZlbCBsaXN0IGFzIHdlIHVzdWFsbHkgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUKKwkgIGZpcnN0IGVsZW1lbnQgb3Igd2FudCB0byBhZGQgYSBuZXcgZmlyc3QgZWxlbWVudC4gSGF2aW5nIHRoZQorCSAgZmlyc3QgZWxlbWVudCBzdG9yZWQgYXQgdGhlIGVuZCBhbmQgY2FsbGluZyBnX2xpc3RfbGFzdCgpIGFuZAorCSAgZ19saXN0X2FwcGVuZCgpIGlzIG1vcmUgZXhwZW5zaXZlLgorCSAgQWxzbyB1c2UgR1NsaWNlIGZvciBhbGxvY2F0aW5nIHRoZSBHc3RFYm1sTGV2ZWwgc3RydWN0cy4KKworMjAwOC0wNi0xMyAyMToxMzo0NiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2RlYnVnL2dzdHRhZ2luamVjdC5jOiBEb24ndCB1bnJlZiBOVUxMIHRhZ2xpc3QgaW4gZmluYWxpemUuIERvbid0IHVzZSBjKysgc3R5bGUgY29tbWVudHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlYnVnL2dzdHRhZ2luamVjdC5jOiAoZ3N0X3RhZ19pbmplY3RfZmluYWxpemUpLAorCSAgKGdzdF90YWdfaW5qZWN0X2NsYXNzX2luaXQpLCAoZ3N0X3RhZ19pbmplY3RfaW5pdCk6CisJICBEb24ndCB1bnJlZiBOVUxMIHRhZ2xpc3QgaW4gZmluYWxpemUuIERvbid0IHVzZSBjKysgc3R5bGUKKwkgIGNvbW1lbnRzLgorCisyMDA4LTA2LTEzIDE5OjE0OjQxICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS86IFVzZSBnc3RfdmFsdWVfc2VyaWFsaXplKCkgYW5kIGdzdF92YWx1ZV9kZXNlcmlhbGl6ZSgpIGZvciB0cmFuc2Zvcm1pbmcgdGFncyBmcm9tIHNvbWUgR1R5cGUgdG8gYSBzdHJpbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9tZXRhZGF0YV9pZF9zaW1wbGVfdGFnKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF93cml0ZV9zaW1wbGVfdGFnKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3dyaXRlX2RhdGEpOgorCSAgVXNlIGdzdF92YWx1ZV9zZXJpYWxpemUoKSBhbmQgZ3N0X3ZhbHVlX2Rlc2VyaWFsaXplKCkgZm9yIHRyYW5zZm9ybWluZworCSAgdGFncyBmcm9tIHNvbWUgR1R5cGUgdG8gYSBzdHJpbmcgYW5kIHRoZSBvdGhlciB3YXkgYXJvdW5kLiBUaGUgZGVmYXVsdAorCSAgdHJhbnNmb3JtYXRpb25zIGluIEdMaWIgZG9uJ3QgaW5jbHVkZSB0cmFuc2Zvcm1hdGlvbnMgZnJvbSBzdHJpbmcgdG8KKwkgIG51bWJlciB0eXBlcy4KKworMjAwOC0wNi0xMyAxOTowNzowMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguKjogT25seSBwYXJzZSBUcmFja3MsIFNlZWtIZWFkIGFuZCBTZWdtZW50SW5mbyBlbGVtZW50cyBvbmNlIGJ1dCBhbGxvdworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X3Jlc2V0KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfdHJhY2tzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfaW5kZXgpLCAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2luZm8pLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9hdHRhY2htZW50cyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NoYXB0ZXJzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfY29udGVudHNfc2Vla2VudHJ5KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfbG9vcF9zdHJlYW1fcGFyc2VfaWQpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkgIE9ubHkgcGFyc2UgVHJhY2tzLCBTZWVrSGVhZCBhbmQgU2VnbWVudEluZm8gZWxlbWVudHMgb25jZSBidXQgYWxsb3cKKwkgIFRhZ3MgbXVsdGlwbGUgdGltZXMuIFRoZSBmaXJzdCBvbmVzIGNhbiBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgYnV0IG11c3QKKwkgIGNvbnRhaW4gdGhlIHNhbWUgY29udGVudCBhcyB0aGUgZmlyc3QgZm9yIGJhY2t1cCBwdXJwb3NlcyBzbyB3ZSBpZ25vcmUKKwkgIGFsbCBidXQgdGhlIGZpcnN0IG9uZS4gVGFncyBjYW4gYXBwZWFyIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50CisJICBjb250ZW50LgorCSAgSnVtcCB0byBhbGwgZWxlbWVudHMgZXhjZXB0IENsdXN0ZXJzIHRoYXQgYXJlIGF2YWlsYWJsZSBmcm9tIGEKKwkgIFNlZWtIZWFkIHRvIG1ha2UgaXQgbW9yZSBsaWtlbHkgdG8gaGF2ZSBhbGwgcmVxdWlyZWQgaW5mb3JtYXRpb25zCisJICBiZWZvcmUgZ2V0dGluZyB0byB0aGUgZmlyc3QgQ2x1c3RlcnMuCisJICBBZGQgZHVtbXkgZnVuY3Rpb25zIGZvciBwYXJzaW5nIEF0dGFjaG1lbnRzIGFuZCBDaGFwdGVycy4KKworMjAwOC0wNi0xMyAxNDozMzo1MiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvcmVwbGF5Z2Fpbi86IE1vcmUgZG9jIHVwZGF0ZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3JlcGxheWdhaW4vZ3N0cmdhbmFseXNpcy5jOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYzoKKwkgICogZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYzoKKwkgIE1vcmUgZG9jIHVwZGF0ZXMuCisKKzIwMDgtMDYtMTMgMTE6NTk6MjMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW15dGh0di54bWwKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5zaWduYWxzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxzYXNwZGlmLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFtcndiLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1iYXllci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1iejIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2RhdWRpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jZHhhcGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRzZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2Yi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdmRzcHUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmFhYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mYWFkLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZiZGV2c2luay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mZXN0aXZhbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1maWx0ZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2ZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZnJlZXplLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzbS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RpbnRlcmxhY2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oMjY0cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxhZHNwYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tZXRhZGF0YS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tbXMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9kcGx1Zy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tcGVnMmVuYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tcGVnNHZpZGVvcGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXBlZ3RzcGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXBlZ3ZpZGVvcGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVzZXBhY2sueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVzaWNicmFpbnoueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXZlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW15dGh0di54bWwKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hcy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uZW9uLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5zZmRlYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1udXZkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbAorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmF3cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVhbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJmYnNyYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zZGwueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2RwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNlbGVjdG9yLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNuZGZpbGUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291bmR0b3VjaC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGNkZWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZWQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXhyZXNhbXBsZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zdGVyZW8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3ViZW5jLnhtbAorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGltaWRpdHkueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdHRhLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZjZHNyYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb3NpZ25hbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12bW5jLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdpbGRtaWRpLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXgyNjQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teHZpZC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSAgKiBleHQvYW1yd2IvZ3N0YW1yd2JkZWMuYzoKKwkgICogZXh0L2FtcndiL2dzdGFtcndiZW5jLmM6CisJICAqIGV4dC9hbXJ3Yi9nc3RhbXJ3YnBhcnNlLmM6CisJICAqIGV4dC9kYzEzOTQvZ3N0ZGMxMzk0LmM6CisJICAqIGV4dC9kaXJlY3RmYi9kZmJ2aWRlb3NpbmsuYzoKKwkgICogZXh0L2l2b3JiaXMvdm9yYmlzZGVjLmM6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkgICogZXh0L21wZWcyZW5jL2dzdG1wZWcyZW5jLmNjOgorCSAgKiBleHQvbXBsZXgvZ3N0bXBsZXguY2M6CisJICAqIGV4dC9tdXNpY2JyYWluei9nc3R0cm0uYzoKKwkgICogZXh0L215dGh0di9nc3RteXRodHZzcmMuYzoKKwkgICogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzoKKwkgICogZXh0L3RpbWlkaXR5L2dzdHRpbWlkaXR5LmM6CisJICAqIGV4dC90aW1pZGl0eS9nc3R3aWxkbWlkaS5jOgorCSAgKiBnc3QtbGlicy9nc3QvYXBwL2dzdGFwcHNpbmsuYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICAqIGdzdC9kdmRzcHUvZ3N0ZHZkc3B1LmM6CisJICAqIGdzdC9mZXN0aXZhbC9nc3RmZXN0aXZhbC5jOgorCSAgKiBnc3QvZnJlZXplL2dzdGZyZWV6ZS5jOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkgICogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSAgKiBnc3QvbW9kcGx1Zy9nc3Rtb2RwbHVnLmNjOgorCSAgKiBnc3QvbnV2ZGVtdXgvZ3N0bnV2ZGVtdXguYzoKKwkgIEFkZCBtaXNzaW5nIGVsZW1lbnRzIHRvIGRvY3MuIEZpeCBkb2MtbWFya3VwOiB1c2UgY29udmluaWVuY2Ugc3ludGF4CisJICBmb3IgZXhhbXBsZXMgKHByb2R1Y2VzIHZhbGlkIGRvY2Jvb2spLCBhZGQgc2V2ZXJhbCByZWZzZWMyIHdoZW4gd2UKKwkgIGhhdmUgc2V2ZXJhbCB0aXRsZXMuIEZpeCBzb21lIHR5cGVzLgorCisyMDA4LTA2LTEzIDExOjU0OjA1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdHVkcHNyYy4qOiBBZGQgcHJvcGVydHkgdG8gY29udHJvbCBhdXRvbWF0aWMgam9pbi9sZWF2ZSBvZiBtdWx0aWNhc3QgZ3JvdXBzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3VkcHNyY19pbml0KSwKKwkgIChnc3RfdWRwc3JjX2NyZWF0ZSksIChnc3RfdWRwc3JjX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3VkcHNyY19nZXRfcHJvcGVydHkpLCAoZ3N0X3VkcHNyY19zdGFydCksIChnc3RfdWRwc3JjX3N0b3ApOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCSAgQWRkIHByb3BlcnR5IHRvIGNvbnRyb2wgYXV0b21hdGljIGpvaW4vbGVhdmUgb2YgbXVsdGljYXN0IGdyb3Vwcy4KKwkgIEFkZCBHX0xJS0VMWS4KKwkgIFJlbW92ZSBzZXR0aW5nIGNhcHMgb24gYnVmZmVycyBleHBsaWNpdGx5LCBiYXNlc3JjIGRvZXMgdGhhdCBmb3IgdXMgbm93LgorCSAgSW1wcm92ZSBkZWJ1ZyBpbmZvLgorCSAgQ29udmVydCBzb21lIG5vbi1mYXRhbCBlcnJvciBpbnRvIHdhcm5pbmdzLgorCSAgVXNlIGdfbnRvaHMgZm9yIGJldHRlciBwb3J0YWJpbGl0eS4KKwkgIExlYXZlIG11bHRpY2FzdCBncm91cHMgd2hlbiBzdG9wcGluZy4KKwkgIFdoZW4gdXNpbmcgZXh0ZXJuYWwgc29ja2V0cywgdXNlIGdldHNvY2tuYW1lKCkgb24gdGhlbSB0byBmaWxsIHVwIHRoZQorCSAgYWRkciBzdHJ1Y3R1cmUgYmVmb3JlIGNhbGxpbmcgbWV0aG9kcyB0aGF0IHVzZSB0aGUgc3RydWN0dXJlLgorCSAgU2hvdWxkIGFsbCBmaXggIzUzNjkwMy4KKwkgIEFQSTogR3N0VURQU3JjOjphdXRvLW11bHRpY2FzdCBwcm9wZXJ0eQorCisyMDA4LTA2LTEzIDExOjQ3OjI4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmM6IFVzZSBnX250b2hsIGZvciBiZXR0ZXIgcG9ydGFiaWxpdHkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOiAoZ3N0X3VkcF9pc19tdWx0aWNhc3QpOgorCSAgVXNlIGdfbnRvaGwgZm9yIGJldHRlciBwb3J0YWJpbGl0eS4KKworMjAwOC0wNi0xMyAxMTo0NTo1NCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogRml4IGEgdHlwbyBhbmQgZG8gc29tZSBzbWFsbCBjbGVhbnVwcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19pbml0X3NlbmQpLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfcmVtb3ZlKToKKwkgIEZpeCBhIHR5cG8gYW5kIGRvIHNvbWUgc21hbGwgY2xlYW51cHMuCisKKzIwMDgtMDYtMTMgMDk6Mzk6NDEgKzAwMDAgIE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkgIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzogTWFrZSB0aGUgZGVsaXZlcnktbWV0aG9kIG1hbmRhdG9yeSBvbiB0aGUgY2FwcyBhbmQgb25seSBhY2NlcHQgaW5saW5lIGZvciBub3cuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBPbGl2aWVyIENyZXRlIDx0ZXN0ZXIgYXQgdGVzdGVyIGRvdCBjYT4KKwkgICogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOiAoZ3N0X3J0cF90aGVvcmFfZGVwYXlfc2V0Y2Fwcyk6CisJICBNYWtlIHRoZSBkZWxpdmVyeS1tZXRob2QgbWFuZGF0b3J5IG9uIHRoZSBjYXBzIGFuZCBvbmx5IGFjY2VwdCBpbmxpbmUKKwkgIGZvciBub3cuCisJICBSZXZlcnNlIHN0cmNtcCBjaGVja3MgZm9yIGRlbGl2ZXJ5LW1ldGhvZC4KKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOiAoZ3N0X3J0cF92b3JiaXNfZGVwYXlfc2V0Y2Fwcyk6CisJICBNYWtlIGRlbGl2ZXJ5IG1ldGhvZCBvcHRpb25hbCB3aGVuIHBhcnNpbmcgY2FwcyBhbmQgbm90ZSB0aGlzIGluIHRoZQorCSAgY2Fwcy4KKwkgIFJldmVyc2Ugc3RyY21wIGNoZWNrcyBmb3IgZGVsaXZlcnktbWV0aG9kLgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSAgVXBkYXRlIGEgY29tbWVudCB0byBub3RlIHRoYXQgdGhlIGRlbGl2ZXJ5LW1ldGhvZCBpcyBvcHRpb25hbCwKKwkgIEZpeGVzICM1Mzc2NzUuCisKKzIwMDgtMDYtMTIgMTc6MzA6MDYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogU2V0IHVkcHNyYyBmb3IgcmVjZWl2aW5nIGRhdGEgZnJvbSBtdWx0aWNhc3QgZ3JvdXBzIHRvIFBBVVNFRCBpbnN0ZWFkIG9mIGxlYXZpbmcgdGhlbSBpbiBSRUFEWS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfbWNhc3QpOgorCSAgU2V0IHVkcHNyYyBmb3IgcmVjZWl2aW5nIGRhdGEgZnJvbSBtdWx0aWNhc3QgZ3JvdXBzIHRvIFBBVVNFRCBpbnN0ZWFkIG9mCisJICBsZWF2aW5nIHRoZW0gaW4gUkVBRFkuIEZpeGVzICM1Mzc4MzIuCisKKzIwMDgtMDYtMTIgMTI6MTQ6MzggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmltdXguYzogU2ltcGxpZnkgY29kZS4gZ3N0X3RhZ19saXN0X21lcmdlKCkgZG9lcyB0aGUgTlVMTCBjaGVja3MuIEFkZCBhIEZJWE1FIGZvciBhIHJhbmRvbSBjb25zdGFudCBpbiB0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIFNpbXBsaWZ5IGNvZGUuIGdzdF90YWdfbGlzdF9tZXJnZSgpIGRvZXMgdGhlIE5VTEwgY2hlY2tzLiBBZGQgYSBGSVhNRQorCSAgZm9yIGEgcmFuZG9tIGNvbnN0YW50IGluIHRhZ211eGluZyBjb2RlLgorCisyMDA4LTA2LTExIDE0OjI4OjQ0ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9kZWJ1Zy9nc3R0YWdpbmplY3QuKjogTm93IGFjdHVhbGx5IGFkZGluZyB0aGUgbmV3IGVsZW1lbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlYnVnL2dzdHRhZ2luamVjdC5jOgorCSAgKiBnc3QvZGVidWcvZ3N0dGFnaW5qZWN0Lmg6CisJICBOb3cgYWN0dWFsbHkgYWRkaW5nIHRoZSBuZXcgZWxlbWVudC4KKworMjAwOC0wNi0xMSAxNDoxMToxNiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBSZW1vdmUgZHVtbXkgcGx1Z2luX2luaXQuIFJlbW92ZSBzb21lIHVuZGVmaW5lZCBlbnRyaWVzIGZyb20gZG9jLSBzZWN0aW9uIGZpbGUuIEFkZCB0YWdpbmplY3QgZWxlbWVudCBhbmQgcmVidWlsZCBkb2MuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jZGlvLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb25vc2NvcGUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSAgKiBnc3QvZGVidWcvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWJ1Zy9icmVha215ZGF0YS5jOgorCSAgKiBnc3QvZGVidWcvZWZlbmNlLmM6CisJICAqIGdzdC9kZWJ1Zy9nc3RkZWJ1Zy5jOgorCSAgKiBnc3QvZGVidWcvZ3N0bmF2c2Vlay5jOgorCSAgKiBnc3QvZGVidWcvZ3N0cHVzaGZpbGVzcmMuYzoKKwkgICogZ3N0L2RlYnVnL2dzdHB1c2hmaWxlc3JjLmg6CisJICAqIGdzdC9kZWJ1Zy9uZWdvdGlhdGlvbi5jOgorCSAgKiBnc3QvZGVidWcvcHJvZ3Jlc3NyZXBvcnQuYzoKKwkgICogZ3N0L2RlYnVnL3Byb2dyZXNzcmVwb3J0Lmg6CisJICAqIGdzdC9kZWJ1Zy9ybmRidWZmZXJzaXplLmM6CisJICAqIGdzdC9kZWJ1Zy90ZXN0cGx1Z2luLmM6CisJICBSZW1vdmUgZHVtbXkgcGx1Z2luX2luaXQuIFJlbW92ZSBzb21lIHVuZGVmaW5lZCBlbnRyaWVzIGZyb20gZG9jLQorCSAgc2VjdGlvbiBmaWxlLiBBZGQgdGFnaW5qZWN0IGVsZW1lbnQgYW5kIHJlYnVpbGQgZG9jcyBmb3IgaXQuCisKKzIwMDgtMDYtMTEgMTE6Mjc6NDYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBVcGRhdGUgdGhlIGNvdW50ZXIgZm9yIHRoZSBudW1iZXIgb2Ygc3RyZWFtcyB3aGVuIHBhZHMgYXJlIGFkZGVkIG9yIHJlbW92ZWQuIFRoaXMgd2lsbCBtLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9yZXF1ZXN0X25ld19wYWQpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfcmVsZWFzZV9wYWQpLCAoZ3N0X21hdHJvc2thX211eF93cml0ZV9kYXRhKToKKwkgIFVwZGF0ZSB0aGUgY291bnRlciBmb3IgdGhlIG51bWJlciBvZiBzdHJlYW1zIHdoZW4gcGFkcyBhcmUgYWRkZWQgb3IKKwkgIHJlbW92ZWQuIFRoaXMgd2lsbCBtYWtlIHN1cmUgdGhhdCBhIHNlZWsgdGFibGUgaXMgZ2VuZXJhdGVkIGZvcgorCSAgZmlsZXMgd2l0aCBqdXN0IG9uZSBhdWRpbyBzdHJlYW0uCisKKzIwMDgtMDYtMTEgMTE6MTg6MjMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thLzogQWRkIHNvbWUgbW9yZSB0YWdzLCBpbXByb3ZlIGRlYnVnZ2luZyBhIGJpdCBhbmQgbWFrZSBzdXJlIHRoYXQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfbWV0YWRhdGFfaWRfc2ltcGxlX3RhZyk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF93cml0ZV9zaW1wbGVfdGFnKToKKwkgIEFkZCBzb21lIG1vcmUgdGFncywgaW1wcm92ZSBkZWJ1Z2dpbmcgYSBiaXQgYW5kIG1ha2Ugc3VyZSB0aGF0CisJICBHVmFsdWUgdHJhbnNmb3JtYXRpb24gaGFzIHN1Y2NlZWRlZCBiZWZvcmUgdXNpbmcgdGhlIHJlc3VsdAorCSAgYXMgYSB0YWcuCisKKzIwMDgtMDYtMTEgMDg6NTY6MTYgKzAwMDAgIE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkgIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6IFRoZSBUaGVvcmEgUlRQIHBheWxvYWRlciBvbmx5IHN1cHBvcnRzIHRoZSAiaW5saW5lIiBkZWxpZXZlcnkgbWV0aG9kIHNvIGxldCdzIGRlY2xhcmUgdGhpcy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyIGF0IHRlc3RlciBkb3QgY2E+CisJICAqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJICBUaGUgVGhlb3JhIFJUUCBwYXlsb2FkZXIgb25seSBzdXBwb3J0cyB0aGUgImlubGluZSIgZGVsaWV2ZXJ5IG1ldGhvZAorCSAgc28gbGV0J3MgZGVjbGFyZSB0aGlzIG9uIHRoZSBjYXBzIG9mIHRoZSBzdGF0aWMgcGFkIHRlbXBsYXRlLgorCSAgRml4ZXMgYnVnICM1Mzc2NzUuCisKKzIwMDgtMDYtMTAgMTc6MjA6NDUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogUmVtb3ZlIGJvZ3VzIGNoZWNrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogKGdzdF92aWRlb21peGVyX2ZpbGxfcXVldWVzKSwKKwkgIChnc3RfdmlkZW9taXhlcl9ibGVuZF9idWZmZXJzKSwgKGdzdF92aWRlb21peGVyX3VwZGF0ZV9xdWV1ZXMpOgorCSAgUmVtb3ZlIGJvZ3VzIGNoZWNrLgorCisyMDA4LTA2LTEwIDE2OjI1OjI0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IFVzZSBzdHJlYW1fdGltZSB0byBzeW5jaHJvbml6ZSB0aGUgb2JqZWN0IHByb3BlcnRpZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiAoZ3N0X3ZpZGVvbWl4ZXJfZmlsbF9xdWV1ZXMpLAorCSAgKGdzdF92aWRlb21peGVyX2JsZW5kX2J1ZmZlcnMpOgorCSAgVXNlIHN0cmVhbV90aW1lIHRvIHN5bmNocm9uaXplIHRoZSBvYmplY3QgcHJvcGVydGllcy4KKwkgIFVzZSBydW5uaW5nX3RpbWUgb2YgdGhlIG1hc3RlciBwYWQgdG8gdGltZXN0YW1wIG91dGdvaW5nIGJ1ZmZlcnMuCisJICBGaXggdGhlIGluaXRpYWwgc2VnbWVudCBldmVudCB0byBleHRlbmQgYW4gdW5rbm93biBhbW91bnQgb2YgdGltZS4KKwkgIEZpeGVzICM1MzczNjEuCisKKzIwMDgtMDYtMTAgMTE6MDU6MzAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogVHJ5IHRvIGlnbm9yZSB1bnBhcnNhYmxlL3Vua25vd24gc3RyZWFtcyBhbmQgZ2l2ZSBhIHdhcm5pbmcgaW5zdGVhZCBvZiBlcnJvcmluZyBvdXQuIEZpeGVzICM1My4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKSwKKwkgIChnc3RfYXZpX2RlbXV4X3BhcnNlX2luZGV4KSwgKGdzdF9hdmlfZGVtdXhfbWFzc2FnZV9pbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9jYWxjdWxhdGVfZHVyYXRpb25zX2Zyb21faW5kZXgpLAorCSAgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlcl9wdXNoKSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXJfcHVsbCk6CisJICBUcnkgdG8gaWdub3JlIHVucGFyc2FibGUvdW5rbm93biBzdHJlYW1zIGFuZCBnaXZlIGEgd2FybmluZyBpbnN0ZWFkIG9mCisJICBlcnJvcmluZyBvdXQuIEZpeGVzICM1MzczNzcuCisKKzIwMDgtMDYtMTAgMTA6NDQ6NTMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzogVXNlIEdET1VCTEVfVE9fQkUoKSBpbnN0ZWFkIG9mIChwcm9iYWJseSBzbG93ZXIpIGN1c3RvbSBjb2RlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6IChnc3RfZWJtbF93cml0ZV9mbG9hdCk6CisJICBVc2UgR0RPVUJMRV9UT19CRSgpIGluc3RlYWQgb2YgKHByb2JhYmx5IHNsb3dlcikgY3VzdG9tIGNvZGUuCisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X2Jhc2VfaW5pdCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2NsYXNzX2luaXQpLCAoZ3N0X21hdHJvc2thX2RlbXV4X2luaXQpLAorCSAgKGdzdF9tYXRyb3NrYV90cmFja19mcmVlKSwgKGdzdF9tYXRyb3NrYV9kZW11eF9lbmNvZGluZ19jbXApLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9yZWFkX3RyYWNrX2VuY29kaW5ncyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2FkZF9zdHJlYW0pLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfaW5pdF9zdHJlYW0pLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmRleF9jdWV0cmFjayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2luZGV4X3BvaW50ZW50cnkpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmZvKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfbWV0YWRhdGFfaWRfc2ltcGxlX3RhZyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX21ldGFkYXRhKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3d2cGtfaGVhZGVyKSwgKGdzdF9tYXRyb3NrYV9kZWNvZGVfYnVmZmVyKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NsdXN0ZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9jb250ZW50c19zZWVrZW50cnkpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9sb29wX3N0cmVhbV9wYXJzZV9pZCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2xvb3ApLCAoZ3N0X21hdHJvc2thX2RlbXV4X3ZpZGVvX2NhcHMpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9hdWRpb19jYXBzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3VidGl0bGVfY2Fwcyk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJICAoZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfc3VidGl0bGVfY29udGV4dCk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9iYXNlX2luaXQpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfY2xhc3NfaW5pdCksIChnc3RfbWF0cm9za2FfbXV4X2luaXQpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfY3JlYXRlX3VpZCksIChnc3RfbWF0cm9za2FfbXV4X3Jlc2V0KSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3ZpZGVvX3BhZF9zZXRjYXBzKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X2F1ZGlvX3BhZF9zZXRjYXBzKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3N1YnRpdGxlX3BhZF9zZXRjYXBzKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3JlcXVlc3RfbmV3X3BhZCksCisJICAoZ3N0X21hdHJvc2thX211eF90cmFja19oZWFkZXIpLCAoZ3N0X21hdHJvc2thX211eF9zdGFydCksCisJICAoZ3N0X21hdHJvc2thX211eF93cml0ZV9zaW1wbGVfdGFnKSwgKGdzdF9tYXRyb3NrYV9tdXhfZmluaXNoKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3dyaXRlX2RhdGEpLCAoZ3N0X21hdHJvc2thX211eF9jb2xsZWN0ZWQpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfc2V0X3Byb3BlcnR5KToKKwkgIEFkZCBtYW55IEZJWE1Fcy9UT0RPcyBhbGwgb3ZlciB0aGUgbWF0cm9za2EgbXV4ZXIgYW5kIGRlbXV4ZXIKKwkgIGVsZW1lbnRzLCBkbyBzb21lIGNoZWNrcyBmb3IgdmFsaWQgdmFsdWVzIGluIHRoZSBkZW11eGVyLCBoYW5kbGUKKwkgIHRyYWNrdGltZWNvZGVzY2FsZSBpbiB0aGUgZGVtdXhlciwgc2V0IGNvcnJlY3QgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbAorCSAgc2V0dGluZ3MgaW4gdGhlIGRlbXV4ZXIsIHJldmlldyBhbmQgYWRkIGFsbCBtaXNzaW5nIG1hdHJvc2thCisJICBJRHMgYW5kIHNvbWUgbW9yZSByYXcgWVVWIGZvcm1hdHMsIGFuZCBzb21lIHRyaXZpYWwgY2xlYW51cC4KKworMjAwOC0wNi0xMCAwODo1OToxNyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvcHVsc2UvOiBTb21lIHNtYWxsZXIgY2xlYW51cC4gVXNlIEdfUEFSQU1fU1RBVElDX1NUUklOR1MsIGdzdF9lbGVtZW50X2NsYXNzX3NldF9kZXRhaWxzX3NpbXBsZSgpIGFuZCBmaXggY29kaW5nIHMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvcHVsc2UvcHVsc2VtaXhlci5jOiAoZ3N0X3B1bHNlbWl4ZXJfYmFzZV9pbml0KSwKKwkgIChnc3RfcHVsc2VtaXhlcl9jbGFzc19pbml0KToKKwkgICogZXh0L3B1bHNlL3B1bHNlc2luay5jOiAoZ3N0X3B1bHNlc2lua19iYXNlX2luaXQpLAorCSAgKGdzdF9wdWxzZXNpbmtfY2xhc3NfaW5pdCksIChnc3RfcHVsc2VzaW5rX3ByZXBhcmUpOgorCSAgKiBleHQvcHVsc2UvcHVsc2VzcmMuYzogKGdzdF9wdWxzZXNyY19pbnRlcmZhY2Vfc3VwcG9ydGVkKSwKKwkgIChnc3RfcHVsc2VzcmNfYmFzZV9pbml0KSwgKGdzdF9wdWxzZXNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfcHVsc2VzcmNfcHJlcGFyZSk6CisJICBTb21lIHNtYWxsZXIgY2xlYW51cC4gVXNlIEdfUEFSQU1fU1RBVElDX1NUUklOR1MsCisJICBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUoKSBhbmQgZml4IGNvZGluZyBzdHlsZSBhIGJpdAorCSAgbW9yZS4KKworMjAwOC0wNi0xMCAwODoyMjoxNyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBBZGQgZG9jdW1lbnRhdGlvbiB0byB0aGUgcHVsc2VhdWRpbyBwbHVnaW4gYW5kIHJ1biBtYWtlIHVwZGF0ZSBpbiBkb2NzL3BsdWdpbnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Rpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2FtbWEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSAgKiBleHQvcHVsc2UvcGx1Z2luLmM6CisJICAqIGV4dC9wdWxzZS9wdWxzZW1peGVyLmM6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgICogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBBZGQgZG9jdW1lbnRhdGlvbiB0byB0aGUgcHVsc2VhdWRpbyBwbHVnaW4gYW5kIHJ1biBtYWtlIHVwZGF0ZQorCSAgaW4gZG9jcy9wbHVnaW5zLgorCisyMDA4LTA2LTEwIDA2OjUyOjQ0ICswMDAwICBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uQHN1bi5jb20+CisKKwkgIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyY3RybC5jOiBJbXByb3ZlbWVudHMgZm9yIHRoZSBTdW5BdWRpbyBtaXhlciBieSBoYW5kbGluZyBtdXRlIGFzIG5vIGdhaW4gZm9yIHRyYWNrcyB0aGF0IC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQnJpYW4gQ2FtZXJvbiA8YnJpYW4uY2FtZXJvbiBhdCBzdW4gZG90IGNvbT4KKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6CisJICAoZ3N0X3N1bmF1ZGlvbWl4ZXJfY3RybF9nZXRfdm9sdW1lKSwKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl9jdHJsX3NldF92b2x1bWUpOgorCSAgSW1wcm92ZW1lbnRzIGZvciB0aGUgU3VuQXVkaW8gbWl4ZXIgYnkgaGFuZGxpbmcgbXV0ZSBhcyBubyBnYWluCisJICBmb3IgdHJhY2tzIHRoYXQgaGF2ZSBhIGdhaW4gcHJvcGVydHkgYnV0IG5vIG11dGUgcHJvcGVydHkuCisJICBGaXhlcyBidWcgIzUzNjA2Ny4KKworMjAwOC0wNi0xMCAwNjo0NTozMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBBZGQgcHVsc2VhdWRpbyBHU3RyZWFtZXIgZWxlbWVudCBmcm9tIGdzdC1wdWxzZS4gRGV2ZWxvcG1lbnQgd2lsbCBjb250aW51ZSBoZXJlIGluc3RlYWQgb2YgcHVsc2VhdWRpbyBTVk4uIEZpeGVzIGJ1ZyAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGV4dC9wdWxzZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3B1bHNlL3BsdWdpbi5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBleHQvcHVsc2UvcHVsc2VtaXhlci5jOiAoZ3N0X3B1bHNlbWl4ZXJfaW50ZXJmYWNlX3N1cHBvcnRlZCksCisJICAoZ3N0X3B1bHNlbWl4ZXJfaW1wbGVtZW50c19pbnRlcmZhY2VfaW5pdCksCisJICAoZ3N0X3B1bHNlbWl4ZXJfaW5pdF9pbnRlcmZhY2VzKSwgKGdzdF9wdWxzZW1peGVyX2Jhc2VfaW5pdCksCisJICAoZ3N0X3B1bHNlbWl4ZXJfY2xhc3NfaW5pdCksIChnc3RfcHVsc2VtaXhlcl9pbml0KSwKKwkgIChnc3RfcHVsc2VtaXhlcl9maW5hbGl6ZSksIChnc3RfcHVsc2VtaXhlcl9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9wdWxzZW1peGVyX2dldF9wcm9wZXJ0eSksIChnc3RfcHVsc2VtaXhlcl9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvcHVsc2UvcHVsc2VtaXhlci5oOgorCSAgKiBleHQvcHVsc2UvcHVsc2VtaXhlcmN0cmwuYzoKKwkgIChnc3RfcHVsc2VtaXhlcl9jdHJsX2NvbnRleHRfc3RhdGVfY2IpLAorCSAgKGdzdF9wdWxzZW1peGVyX2N0cmxfc2lua19pbmZvX2NiKSwKKwkgIChnc3RfcHVsc2VtaXhlcl9jdHJsX3NvdXJjZV9pbmZvX2NiKSwKKwkgIChnc3RfcHVsc2VtaXhlcl9jdHJsX3N1YnNjcmliZV9jYiksCisJICAoZ3N0X3B1bHNlbWl4ZXJfY3RybF9zdWNjZXNzX2NiKSwgKGdzdF9wdWxzZW1peGVyX2N0cmxfb3BlbiksCisJICAoZ3N0X3B1bHNlbWl4ZXJfY3RybF9jbG9zZSksIChnc3RfcHVsc2VtaXhlcl9jdHJsX25ldyksCisJICAoZ3N0X3B1bHNlbWl4ZXJfY3RybF9mcmVlKSwgKGdzdF9wdWxzZW1peGVyX2N0cmxfbGlzdF90cmFja3MpLAorCSAgKGdzdF9wdWxzZW1peGVyX2N0cmxfdGltZW91dF9ldmVudCksIChyZXN0YXJ0X3RpbWVfZXZlbnQpLAorCSAgKGdzdF9wdWxzZW1peGVyX2N0cmxfc2V0X3ZvbHVtZSksIChnc3RfcHVsc2VtaXhlcl9jdHJsX2dldF92b2x1bWUpLAorCSAgKGdzdF9wdWxzZW1peGVyX2N0cmxfc2V0X3JlY29yZCksIChnc3RfcHVsc2VtaXhlcl9jdHJsX3NldF9tdXRlKToKKwkgICogZXh0L3B1bHNlL3B1bHNlbWl4ZXJjdHJsLmg6CisJICAqIGV4dC9wdWxzZS9wdWxzZW1peGVydHJhY2suYzogKGdzdF9wdWxzZW1peGVyX3RyYWNrX2NsYXNzX2luaXQpLAorCSAgKGdzdF9wdWxzZW1peGVyX3RyYWNrX2luaXQpLCAoZ3N0X3B1bHNlbWl4ZXJfdHJhY2tfbmV3KToKKwkgICogZXh0L3B1bHNlL3B1bHNlbWl4ZXJ0cmFjay5oOgorCSAgKiBleHQvcHVsc2UvcHVsc2Vwcm9iZS5jOiAoZ3N0X3B1bHNlcHJvYmVfY29udGV4dF9zdGF0ZV9jYiksCisJICAoZ3N0X3B1bHNlcHJvYmVfc2lua19pbmZvX2NiKSwgKGdzdF9wdWxzZXByb2JlX3NvdXJjZV9pbmZvX2NiKSwKKwkgIChnc3RfcHVsc2Vwcm9iZV9pbnZhbGlkYXRlKSwgKGdzdF9wdWxzZXByb2JlX29wZW4pLAorCSAgKGdzdF9wdWxzZXByb2JlX2VudW1lcmF0ZSksIChnc3RfcHVsc2Vwcm9iZV9jbG9zZSksCisJICAoZ3N0X3B1bHNlcHJvYmVfbmV3KSwgKGdzdF9wdWxzZXByb2JlX2ZyZWUpLAorCSAgKGdzdF9wdWxzZXByb2JlX2dldF9wcm9wZXJ0aWVzKSwgKGdzdF9wdWxzZXByb2JlX25lZWRzX3Byb2JlKSwKKwkgIChnc3RfcHVsc2Vwcm9iZV9wcm9iZV9wcm9wZXJ0eSksIChnc3RfcHVsc2Vwcm9iZV9nZXRfdmFsdWVzKSwKKwkgIChnc3RfcHVsc2Vwcm9iZV9zZXRfc2VydmVyKToKKwkgICogZXh0L3B1bHNlL3B1bHNlcHJvYmUuaDoKKwkgICogZXh0L3B1bHNlL3B1bHNlc2luay5jOiAoZ3N0X3B1bHNlc2lua19iYXNlX2luaXQpLAorCSAgKGdzdF9wdWxzZXNpbmtfY2xhc3NfaW5pdCksIChnc3RfcHVsc2VzaW5rX2luaXQpLAorCSAgKGdzdF9wdWxzZXNpbmtfZGVzdHJveV9zdHJlYW0pLCAoZ3N0X3B1bHNlc2lua19kZXN0cm95X2NvbnRleHQpLAorCSAgKGdzdF9wdWxzZXNpbmtfZmluYWxpemUpLCAoZ3N0X3B1bHNlc2lua19kaXNwb3NlKSwKKwkgIChnc3RfcHVsc2VzaW5rX3NldF9wcm9wZXJ0eSksIChnc3RfcHVsc2VzaW5rX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3B1bHNlc2lua19jb250ZXh0X3N0YXRlX2NiKSwgKGdzdF9wdWxzZXNpbmtfc3RyZWFtX3N0YXRlX2NiKSwKKwkgIChnc3RfcHVsc2VzaW5rX3N0cmVhbV9yZXF1ZXN0X2NiKSwKKwkgIChnc3RfcHVsc2VzaW5rX3N0cmVhbV9sYXRlbmN5X3VwZGF0ZV9jYiksIChnc3RfcHVsc2VzaW5rX29wZW4pLAorCSAgKGdzdF9wdWxzZXNpbmtfY2xvc2UpLCAoZ3N0X3B1bHNlc2lua19wcmVwYXJlKSwKKwkgIChnc3RfcHVsc2VzaW5rX3VucHJlcGFyZSksIChnc3RfcHVsc2VzaW5rX3dyaXRlKSwKKwkgIChnc3RfcHVsc2VzaW5rX2RlbGF5KSwgKGdzdF9wdWxzZXNpbmtfc3VjY2Vzc19jYiksCisJICAoZ3N0X3B1bHNlc2lua19yZXNldCksIChnc3RfcHVsc2VzaW5rX2NoYW5nZV90aXRsZSksCisJICAoZ3N0X3B1bHNlc2lua19ldmVudCksIChnc3RfcHVsc2VzaW5rX2dldF90eXBlKToKKwkgICogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSAgKiBleHQvcHVsc2UvcHVsc2VzcmMuYzogKGdzdF9wdWxzZXNyY19pbnRlcmZhY2Vfc3VwcG9ydGVkKSwKKwkgIChnc3RfcHVsc2VzcmNfaW1wbGVtZW50c19pbnRlcmZhY2VfaW5pdCksCisJICAoZ3N0X3B1bHNlc3JjX2luaXRfaW50ZXJmYWNlcyksIChnc3RfcHVsc2VzcmNfYmFzZV9pbml0KSwKKwkgIChnc3RfcHVsc2VzcmNfY2xhc3NfaW5pdCksIChnc3RfcHVsc2VzcmNfaW5pdCksCisJICAoZ3N0X3B1bHNlc3JjX2Rlc3Ryb3lfc3RyZWFtKSwgKGdzdF9wdWxzZXNyY19kZXN0cm95X2NvbnRleHQpLAorCSAgKGdzdF9wdWxzZXNyY19maW5hbGl6ZSksIChnc3RfcHVsc2VzcmNfZGlzcG9zZSksCisJICAoZ3N0X3B1bHNlc3JjX3NldF9wcm9wZXJ0eSksIChnc3RfcHVsc2VzcmNfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcHVsc2VzcmNfY29udGV4dF9zdGF0ZV9jYiksIChnc3RfcHVsc2VzcmNfc3RyZWFtX3N0YXRlX2NiKSwKKwkgIChnc3RfcHVsc2VzcmNfc3RyZWFtX3JlcXVlc3RfY2IpLCAoZ3N0X3B1bHNlc3JjX29wZW4pLAorCSAgKGdzdF9wdWxzZXNyY19jbG9zZSksIChnc3RfcHVsc2VzcmNfcHJlcGFyZSksCisJICAoZ3N0X3B1bHNlc3JjX3VucHJlcGFyZSksIChnc3RfcHVsc2VzcmNfcmVhZCksCisJICAoZ3N0X3B1bHNlc3JjX2RlbGF5KSwgKGdzdF9wdWxzZXNyY19jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9wdWxzZXNyY19nZXRfdHlwZSk6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNyYy5oOgorCSAgKiBleHQvcHVsc2UvcHVsc2V1dGlsLmM6IChnc3RfcHVsc2VfZmlsbF9zYW1wbGVfc3BlYyksCisJICAoZ3N0X3B1bHNlX2NsaWVudF9uYW1lKSwgKGdzdF9wdWxzZV9nc3RfdG9fY2hhbm5lbF9tYXApOgorCSAgKiBleHQvcHVsc2UvcHVsc2V1dGlsLmg6CisJICBBZGQgcHVsc2VhdWRpbyBHU3RyZWFtZXIgZWxlbWVudCBmcm9tIGdzdC1wdWxzZS4gRGV2ZWxvcG1lbnQgd2lsbAorCSAgY29udGludWUgaGVyZSBpbnN0ZWFkIG9mIHB1bHNlYXVkaW8gU1ZOLiBGaXhlcyBidWcgIzQwMDY3OS4KKwkgIE9ubHkgY2hhbmdlcyBvdmVyIGdzdC1wdWxzZSBTVk4gYXJlIGFkZGVkIGNvcHlyaWdodCB0byB0aGUgdG9wIG9mCisJICBmaWxlcyBhbmQgY29kaW5nIHN0eWxlIGNoYW5nZXMuCisKKzIwMDgtMDYtMDkgMjA6MDI6MDUgKzAwMDAgIEJlbmphbWluIEthbXBtYW5uIDxiZW5qYW1pbkBmbHVlbmRvLmNvbT4KKworCSAgZXh0L2NkaW8vOiBBbHNvIGV4dHJhY3QgYWxidW0gdGl0bGUgYW5kIGFsYnVtIGdlbnJlIGZyb20gQ0QtVEVYVCBpZiBhdmFpbGFibGUgKCM1MzcwMjEpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQmVuamFtaW4gS2FtcG1hbm4gIDxiZW5qYW1pbiBhdCBmbHVlbmRvIGRvdCBjb20+CisJICAqIGV4dC9jZGlvL2dzdGNkaW8uYzogKGdzdF9jZGlvX2dldF9jZHRleHQpLAorCSAgKGdzdF9jZGlvX2FkZF9jZHRleHRfYWxidW1fdGFncyk6CisJICAqIGV4dC9jZGlvL2dzdGNkaW8uaDoKKwkgICogZXh0L2NkaW8vZ3N0Y2Rpb2NkZGFzcmMuYzogKGdzdF9jZGlvX2NkZGFfc3JjX29wZW4pOgorCSAgQWxzbyBleHRyYWN0IGFsYnVtIHRpdGxlIGFuZCBhbGJ1bSBnZW5yZSBmcm9tIENELVRFWFQgaWYKKwkgIGF2YWlsYWJsZSAoIzUzNzAyMSkuCisKKzIwMDgtMDYtMDkgMDg6NTI6MDQgKzAwMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSAgc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiBJbXByb3ZlIG5lZ290aWF0aW9uIGEgYml0IG1vcmUgYnkgcGlja2luZyB0aGUgc21hbGxlc3QgcG9zc2libGUgcmVzb2x1dGlvbiB0aGF0IGlzIGxhcmdlciB0aGFuLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTam9lcmQgU2ltb25zIDxzam9lcmQgYXQgbHVvbiBkb3QgbmV0PgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19uZWdvdGlhdGUpOgorCSAgSW1wcm92ZSBuZWdvdGlhdGlvbiBhIGJpdCBtb3JlIGJ5IHBpY2tpbmcgdGhlIHNtYWxsZXN0IHBvc3NpYmxlCisJICByZXNvbHV0aW9uIHRoYXQgaXMgbGFyZ2VyIHRoYW4gdGhlIHJlc29sdXRpb24gc3BlY2lmaWVkIGluIHRoZQorCSAgZmlyc3QgY2FwcyBlbnRyeSBvZiB0aGUgcGVlciBjYXBzLiBGaXhlcyBidWcgIzUzNjk5NC4KKworMjAwOC0wNi0wOSAwODo0Mjo0OSArMDAwMCAgQmFzdGllbiBOb2NlcmEgPGhhZGVzc0BoYWRlc3MubmV0PgorCisJICBzeXMvdjRsMi86IEZpeCBjb21waWxhdGlvbiB3aXRoIG5ld2VyIEdJVCBrZXJuZWxzIHRoYXQgZGVwcmVjYXRlZAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQmFzdGllbiBOb2NlcmEgPGhhZGVzcyBhdCBoYWRlc3MgZG90IG5ldD4KKwkgICogc3lzL3Y0bDIvZ3N0djRsMnZpZG9yaWVudC5jOgorCSAgKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6IChnc3RfdjRsMl9maWxsX2xpc3RzKToKKwkgIEZpeCBjb21waWxhdGlvbiB3aXRoIG5ld2VyIEdJVCBrZXJuZWxzIHRoYXQgZGVwcmVjYXRlZAorCSAgVjRMMl9DSURfSENFTlRFUiBhbmQgVjRMMl9DSURfVkNFTlRFUi4gRml4ZXMgYnVnICM1MzYzMTcuCisKKzIwMDgtMDYtMDcgMTg6NDg6NTQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIFJlcXVpcmUgbGliY2RpbyA+PSAwLjc2LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZXh0L2NkaW8vZ3N0Y2Rpby5jOgorCSAgKiBleHQvY2Rpby9nc3RjZGlvLmg6CisJICAqIGV4dC9jZGlvL2dzdGNkaW9jZGRhc3JjLmM6IChnc3RfY2Rpb19jZGRhX3NyY19vcGVuKToKKwkgIFJlcXVpcmUgbGliY2RpbyA+PSAwLjc2LgorCisyMDA4LTA2LTA1IDExOjA3OjE3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9pbnRlcmxlYXZlLzogUHJvcGVybHkgaW1wbGVtZW50IGR1cmF0aW9uIGFuZCBwb3NpdGlvbiBxdWVyaWVzIGluIGJ5dGVzIGZvcm1hdC4gV2UgaGF2ZSB0byB0YWtlIHRoZSB1cHN0cmVhbSByZXBseS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOiAoZ3N0X2RlaW50ZXJsZWF2ZV9hZGRfbmV3X3BhZHMpLAorCSAgKGdzdF9kZWludGVybGVhdmVfc3JjX3F1ZXJ5KToKKwkgICogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOiAoZ3N0X2ludGVybGVhdmVfc3JjX3F1ZXJ5X2R1cmF0aW9uKSwKKwkgIChnc3RfaW50ZXJsZWF2ZV9zcmNfcXVlcnkpOgorCSAgUHJvcGVybHkgaW1wbGVtZW50IGR1cmF0aW9uIGFuZCBwb3NpdGlvbiBxdWVyaWVzIGluIGJ5dGVzIGZvcm1hdC4gV2UKKwkgIGhhdmUgdG8gdGFrZSB0aGUgdXBzdHJlYW0gcmVwbHkgYW5kIGRpdmlkZS9tdWx0aXBseSBpdCBieSB0aGUgbnVtYmVyCisJICBvZiBjaGFubmVscyB0byBnZXQgdGhlIGNvcnJlY3QgcmVzdWx0LgorCisyMDA4LTA2LTA1IDA5OjQ1OjAwICswMDAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IENhdGNoIFVORVhQRUNURUQgd2hlbiBkb3duc3RyZWFtIGhhcyByZWFjaGVkIGVuZCBvZiBzZWdtZW50IGluIHJldmVyc2UgbW9kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBDYXRjaCBVTkVYUEVDVEVEIHdoZW4gZG93bnN0cmVhbSBoYXMgcmVhY2hlZCBlbmQgb2YKKwkgIHNlZ21lbnQgaW4gcmV2ZXJzZSBtb2RlLgorCisyMDA4LTA2LTA0IDE4OjA4OjM1ICswMDAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IEZpeCB0eXBvIGluIGNvbW1lbnQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBGaXggdHlwbyBpbiBjb21tZW50CisKKzIwMDgtMDYtMDQgMTg6MDM6MjQgKzAwMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogQmVjYXVzZSB3ZSBkb24ndCBrbm93IHRoZSBmcmFtZSBvcmRlciB3ZSBuZWVkIHRvIHB1c2ggdGlsbCB0aGUgbmV4dCBrZXlmcmFtZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIEJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgZnJhbWUgb3JkZXIgd2UgbmVlZCB0byBwdXNoIHRpbGwKKwkgIHRoZSBuZXh0IGtleWZyYW1lCisKKzIwMDgtMDYtMDQgMTc6Mzk6MzEgKzAwMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSAgc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiBQcm92aWRlIGEgY3VzdG9tIG5lZ290aWF0aW9uIGZ1bmN0aW9uIHRvIG1ha2Ugc3VyZSB0byBwaWNrIHRoZSBoaWdoZXN0IHBvc3NpYmxlIGZyYW1lcmF0ZSBhbmQgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTam9lcmQgU2ltb25zIDxzam9lcmQgYXQgbHVvbiBkb3QgbmV0PgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfdjRsMnNyY19maXhhdGUpLCAoZ3N0X3Y0bDJzcmNfbmVnb3RpYXRlKToKKwkgIFByb3ZpZGUgYSBjdXN0b20gbmVnb3RpYXRpb24gZnVuY3Rpb24gdG8gbWFrZSBzdXJlIHRvIHBpY2sgdGhlIGhpZ2hlc3QKKwkgIHBvc3NpYmxlIGZyYW1lcmF0ZSBhbmQgcmVzb2x1dGlvbi4gRml4ZXMgYnVnICM1MzY2NDYuCisKKzIwMDgtMDYtMDQgMTY6NDk6MjYgKzAwMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogU2V0IEVPUyB3aGVuIGdvaW5nIG91dCBvZiB0aGUgc2VnbWVudCBpbiByZXZlcnNlIHBsYXliYWNrCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgU2V0IEVPUyB3aGVuIGdvaW5nIG91dCBvZiB0aGUgc2VnbWVudCBpbiByZXZlcnNlIHBsYXliYWNrCisKKzIwMDgtMDYtMDQgMTU6MTk6NDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC90YWdsaWIvTWFrZWZpbGUuYW06IEFkZCAtV25vLWF0dHJpYnV0ZXMgdG8gQ1hYRkxBR1MgdG8gc3VwcHJlc3Mgd2FybmluZyBjYXVzZWQgYnkgdGFnbGliIGhlYWRlcnMgKHdpdGggZ2NjIDQuMy4xKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvdGFnbGliL01ha2VmaWxlLmFtOjoKKwkgIEFkZCAtV25vLWF0dHJpYnV0ZXMgdG8gQ1hYRkxBR1MgdG8gc3VwcHJlc3Mgd2FybmluZyBjYXVzZWQgYnkKKwkgIHRhZ2xpYiBoZWFkZXJzICh3aXRoIGdjYyA0LjMuMSkuCisKKzIwMDgtMDYtMDQgMTE6NTk6MTggKzAwMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IFVzZSB0aGUgbmV3IGdzdF9ydHNwX2Nvbm5lY3Rpb25fZ2V0X2lwKCkgdG8gYWNjZXNzIHRoZSBJUCBhZGRyZXNzIG9mIGEgR3N0UlRTUENvbm5lY3Rpb24gc2luY2UuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3VkcF9zaW5rKToKKwkgIFVzZSB0aGUgbmV3IGdzdF9ydHNwX2Nvbm5lY3Rpb25fZ2V0X2lwKCkgdG8gYWNjZXNzIHRoZSBJUCBhZGRyZXNzCisJICBvZiBhIEdzdFJUU1BDb25uZWN0aW9uIHNpbmNlIGl0IGlzIGEgcHJpdmF0ZSBtZW1iZXIuCisKKzIwMDgtMDYtMDQgMTA6NDI6NDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIFVzZSBuZXcgdXRpbGl0eSBmdW5jdGlvbnMgaW4gbGliZ3N0dGFnIHRvIHByb2Nlc3MgY292ZXJhcnQgKCM1MTIzMzMpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjX2V4dHJhY3RfcGljdHVyZV9idWZmZXIpOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKHBhcnNlX3BpY3R1cmVfZnJhbWUpOgorCSAgVXNlIG5ldyB1dGlsaXR5IGZ1bmN0aW9ucyBpbiBsaWJnc3R0YWcgdG8gcHJvY2VzcyBjb3ZlcmFydCAoIzUxMjMzMykuCisKKzIwMDgtMDYtMDQgMDg6NTQ6MDkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiBXZSBhY3R1YWxseSBzdXBwb3J0IGxlZnQvc2lkZSwgcmlnaHQvc2lkZSBhbmQgbWlkL3NpZGUgZmlsZXMuIFRoZSBjb252ZXJzaW9uIHRvIG5vcm1hbCwgaW50ZXJsLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfZGVjX3dyaXRlKToKKwkgIFdlIGFjdHVhbGx5IHN1cHBvcnQgbGVmdC9zaWRlLCByaWdodC9zaWRlIGFuZCBtaWQvc2lkZSBmaWxlcy4gVGhlCisJICBjb252ZXJzaW9uIHRvIG5vcm1hbCwgaW50ZXJsZWF2ZWQgc3RlcmVvIGlzIGRvbmUgYnkgbGliZmxhYy4KKworMjAwOC0wNi0wNCAwNzozNjowNyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOiBVbnJlZiB0aGUgd3JpdGUgY2FjaGUgaW4gZmluYWxpemUgaWYgaXQgd2FzIHNldCBhbmQgYWRkIGFkZCAiRklYTUUiIHRvIGEgY29tbWVudCB0aGF0IG5lZWQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOiAoZ3N0X2VibWxfd3JpdGVfZmluYWxpemUpLAorCSAgKGdzdF9lYm1sX3dyaXRlX3NldF9jYWNoZSk6CisJICBVbnJlZiB0aGUgd3JpdGUgY2FjaGUgaW4gZmluYWxpemUgaWYgaXQgd2FzIHNldCBhbmQgYWRkIGFkZCAiRklYTUUiCisJICB0byBhIGNvbW1lbnQgdGhhdCBuZWVkcyBpdC4KKworMjAwOC0wNi0wNCAwNjo0ODo0NiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLio6IFVzZSBhbiBhbHdheXMgaW5jcmVhc2luZyBpbnRlZ2VyIGZvciB0aGUgbnVtYmVyIGluIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgc2luayBwYWRzIHQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6IChnc3RfaW50ZXJsZWF2ZV9wYWRfZ2V0X3R5cGUpLAorCSAgKGdzdF9pbnRlcmxlYXZlX3BhZF9nZXRfcHJvcGVydHkpLCAoZ3N0X2ludGVybGVhdmVfcGFkX2NsYXNzX2luaXQpLAorCSAgKGdzdF9pbnRlcmxlYXZlX3JlcXVlc3RfbmV3X3BhZCksIChnc3RfaW50ZXJsZWF2ZV9yZWxlYXNlX3BhZCk6CisJICAqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuaDoKKwkgIFVzZSBhbiBhbHdheXMgaW5jcmVhc2luZyBpbnRlZ2VyIGZvciB0aGUgbnVtYmVyIGluIHRoZSBuYW1lIG9mIHRoZQorCSAgcmVxdWVzdGVkIHNpbmsgcGFkcyB0byBndWFyYW50dWVlIGEgdW5pcXVlIG5hbWUuIEFkZCBhICJjaGFubmVsIgorCSAgcHJvcGVydHkgdG8gR3N0SW50ZXJsZWF2ZVBhZCB0byBtYWtlIGl0IHBvc3NpYmxlIGZvciBhcHBsaWNhdGlvbnMKKwkgIHRvIHJldHJpZXZlIHRoZSBjaGFubmVsIG51bWJlciBpbiB0aGUgb3V0cHV0IGZvciBldmVyeSBwYWQuCisJICBVc2UgZ190eXBlX3JlZ2lzdGVyX3N0YXRpY19zaW1wbGUoKSBpbnN0ZWFkIG9mCisJICBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljKCkgdG8gc2F2ZSBzb21lIHJlbG9jYXRpb25zLgorCisyMDA4LTA2LTAzIDE0OjM1OjU5ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzogU3RvcCBHc3RDb2xsZWN0UGFkcyBiZWZvcmUgY2FsbGluZyB0aGUgcGFyZW50J3Mgc3RhdGUgY2hhbmdlIGZ1bmN0aW9uIHdoZW4gZ29pbmcgZnJvbSBQQS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzogKGdzdF9pbnRlcmxlYXZlX3BhZF9nZXRfdHlwZSksCisJICAoZ3N0X2ludGVybGVhdmVfY2hhbmdlX3N0YXRlKToKKwkgIFN0b3AgR3N0Q29sbGVjdFBhZHMgYmVmb3JlIGNhbGxpbmcgdGhlIHBhcmVudCdzIHN0YXRlIGNoYW5nZSBmdW5jdGlvbgorCSAgd2hlbiBnb2luZyBmcm9tIFBBVVNFRCB0byBSRUFEWSBhcyB3ZSBvdGhlcndpc2UgZGVhZGxvY2suCisJICBGaXhlcyBidWcgIzUzNjI1OC4KKworMjAwOC0wNi0wMyAwOTowMzoxOSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6IFVzZSBuZXcgZ3N0X2F1ZGlvX2NoZWNrX2NoYW5uZWxfcG9zaXRpb25zKCkgZnVuY3Rpb24gYW5kIHJlZ2lzdGVyIHRoZSBHc3RJbnRlcmxlYXZlUGFkIHQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJICAoZ3N0X2ludGVybGVhdmVfY2hlY2tfY2hhbm5lbF9wb3NpdGlvbnMpLAorCSAgKGdzdF9pbnRlcmxlYXZlX3NldF9jaGFubmVsX3Bvc2l0aW9ucyksCisJICAoZ3N0X2ludGVybGVhdmVfY2xhc3NfaW5pdCk6CisJICBVc2UgbmV3IGdzdF9hdWRpb19jaGVja19jaGFubmVsX3Bvc2l0aW9ucygpIGZ1bmN0aW9uIGFuZCByZWdpc3RlcgorCSAgdGhlIEdzdEludGVybGVhdmVQYWQgdHlwZSBmcm9tIGEgdGhyZWFkc2FmZSBjb250ZXh0LgorCisyMDA4LTA2LTAyIDE2OjEwOjAwICswMDAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4Lio6IEltcGxlbWVudCByZXZlcnNlIHBsYXliYWNrLiBGaXhlcyAjNTM1MzAwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyIGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaW5kZXhfbmV4dCksCisJICAoZ3N0X2F2aV9kZW11eF9pbmRleF9wcmV2KSwgKGdzdF9hdmlfZGVtdXhfaW5kZXhfZW50cnlfZm9yX3RpbWUpLAorCSAgKGdzdF9hdmlfZGVtdXhfZG9fc2VlayksIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zZWVrKSwKKwkgIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSk6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIEltcGxlbWVudCByZXZlcnNlIHBsYXliYWNrLiBGaXhlcyAjNTM1MzAwLgorCSAgU21hbGwgY2xlYW51cHMuCisKKzIwMDgtMDYtMDIgMTI6NDI6MTQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS4qOiBBbGxvdyBzZXR0aW5nIGNoYW5uZWwgcG9zaXRpb25zIHZpYSBhIHByb3BlcnR5IGFuZCBhbGxvdyB1c2luZyB0aGUgY2hhbm5lbCBwb3NpdGlvbnMgb24gLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOiAoZ3N0X2ludGVybGVhdmVfcGFkX2dldF90eXBlKSwKKwkgIChnc3RfaW50ZXJsZWF2ZV9maW5hbGl6ZSksIChnc3RfYXVkaW9fY2hlY2tfY2hhbm5lbF9wb3NpdGlvbnMpLAorCSAgKGdzdF9pbnRlcmxlYXZlX3NldF9jaGFubmVsX3Bvc2l0aW9ucyksCisJICAoZ3N0X2ludGVybGVhdmVfY2xhc3NfaW5pdCksIChnc3RfaW50ZXJsZWF2ZV9pbml0KSwKKwkgIChnc3RfaW50ZXJsZWF2ZV9zZXRfcHJvcGVydHkpLCAoZ3N0X2ludGVybGVhdmVfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfaW50ZXJsZWF2ZV9yZXF1ZXN0X25ld19wYWQpLCAoZ3N0X2ludGVybGVhdmVfcmVsZWFzZV9wYWQpLAorCSAgKGdzdF9pbnRlcmxlYXZlX3Npbmtfc2V0Y2FwcyksIChnc3RfaW50ZXJsZWF2ZV9zcmNfcXVlcnlfZHVyYXRpb24pLAorCSAgKGdzdF9pbnRlcmxlYXZlX3NyY19xdWVyeV9sYXRlbmN5KSwgKGdzdF9pbnRlcmxlYXZlX2NvbGxlY3RlZCk6CisJICAqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuaDoKKwkgIEFsbG93IHNldHRpbmcgY2hhbm5lbCBwb3NpdGlvbnMgdmlhIGEgcHJvcGVydHkgYW5kIGFsbG93IHVzaW5nIHRoZQorCSAgY2hhbm5lbCBwb3NpdGlvbnMgb24gdGhlIGlucHV0IGFzIHRoZSBjaGFubmVsIHBvc2l0aW9ucyBvZiB0aGUgb3V0cHV0LgorCSAgRml4IHNvbWUgYnJva2VuIGxvZ2ljIGFuZCBtZW1vcnkgbGVha3MuCisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbnRlcmxlYXZlLmM6IChzcmNfaGFuZG9mZl9mbG9hdDMyKSwKKwkgIChzaW5rX2hhbmRvZmZfZmxvYXQzMiksIChHU1RfU1RBUlRfVEVTVCksIChpbnRlcmxlYXZlX3N1aXRlKToKKwkgIEFkZCB1bml0IHRlc3RzIGZvciBjaGVja2luZyBjb3JyZWN0IGhhbmRsaW5nIG9mIGNoYW5uZWwgcG9zaXRpb25zLgorCisyMDA4LTA2LTAyIDEyOjIyOjU2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogV2hlbiB1c2luZyBnc3RfZWxlbWVudF9pdGVyYXRlX3BhZHMoKSBvbmUgaGFzIHRvIHVucmVmIGV2ZXJ5IHBhZCBhZnRlciB1c2FnZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IChnc3RfdmlkZW9taXhlcl9xdWVyeV9kdXJhdGlvbiksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfcXVlcnlfbGF0ZW5jeSk6CisJICBXaGVuIHVzaW5nIGdzdF9lbGVtZW50X2l0ZXJhdGVfcGFkcygpIG9uZSBoYXMgdG8gdW5yZWYgZXZlcnkgcGFkCisJICBhZnRlciB1c2FnZS4KKworMjAwOC0wNS0zMSAxNjo1MzoyMyArMDAwMCAgQmFzdGllbiBOb2NlcmEgPGhhZGVzc0BoYWRlc3MubmV0PgorCisJICBnc3QvcXRkZW11eC86IEltcHJvdmUgbWV0YS1kYXRhIGhhbmRsaW5nLCBhZGQgJ2NvbW1lbnQnLCAnZGVzY3JpcHRpb24nIGFuZCAnY29weXJpZ2h0JyB0YWcgaGFuZGxpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBCYXN0aWVuIE5vY2VyYSA8aGFkZXNzIGF0IGhhZGVzcyBkb3QgbmV0PgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3RhZ19hZGRfc3RyKSwKKwkgIChxdGRlbXV4X3BhcnNlX3VkdGEpOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4X2ZvdXJjYy5oOgorCSAgSW1wcm92ZSBtZXRhLWRhdGEgaGFuZGxpbmcsIGFkZCAnY29tbWVudCcsICdkZXNjcmlwdGlvbicgYW5kCisJICAnY29weXJpZ2h0JyB0YWcgaGFuZGxpbmcuCisJICBGaXhlcyAjNTM1OTM1CisKKzIwMDgtMDUtMzEgMTU6MzA6NDEgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IE1ha2Ugc3VyZSB3ZSB3ZSBkb24ndCBjbGlwIHRoZSBzZWdtZW50J3Mgc3RvcCB1c2luZyB0aGUgbWFpbiBzZWdtZW50IGR1cmF0aW9uIGFzIHRoYXQgY291bGQgY3IuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwOC0wNS0zMSAgSnVsaWVuIE1vdXR0ZSAgPGp1bGllbkBmbHVlbmRvLmNvbT4KKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfZmluZF9rZXlmcmFtZSksCisJICAoZ3N0X3F0ZGVtdXhfZmluZF9zZWdtZW50KSwgKGdzdF9xdGRlbXV4X3BlcmZvcm1fc2VlayksCisJICAoZ3N0X3F0ZGVtdXhfc2Vla190b19wcmV2aW91c19rZXlmcmFtZSksCisJICAoZ3N0X3F0ZGVtdXhfYWN0aXZhdGVfc2VnbWVudCksIChnc3RfcXRkZW11eF9sb29wKTogTWFrZSBzdXJlIHdlCisJICB3ZSBkb24ndCBjbGlwIHRoZSBzZWdtZW50J3Mgc3RvcCB1c2luZyB0aGUgbWFpbiBzZWdtZW50IGR1cmF0aW9uCisJICBhcworCSAgdGhhdCBjb3VsZCBjcm9wIHF1aXRlIHNvbWUgdmlkZW8gZnJhbWVzLiBNYWtlIHJldmVyc2UgcGxheWJhY2sKKwkgIHN1cHBvcnQKKwkgIG1vcmUgcm9idXN0IGFuZCBzdXBwb3J0IGVkaXQgbGlzdHMuIFN1cHBvcnQgc2Vla2luZyB0byB0aGUgbGFzdAorCSAgZnJhbWUsCisJICBhbmQgZml4IHJldmVyc2UgbG9vcGluZyBwbGF5YmFjay4gQWRkIHNvbWUgZGVidWdnaW5nLgorCSAgKiB3aW4zMi9jb21tb24vY29uZmlnLmg6IFVwZGF0ZWQuCisKKzIwMDgtMDUtMzEgMDg6Mzc6MDAgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzogRG9uJ3QgY2xpcCBmbG9hdC9kb3VibGUgc2FtcGxlcywgY29ycmVjdGx5IHVuc2V0IHBhc3N0aHJvdWdoIG1vZGUgYW5kIHVzZSBiZXR0ZXIgcm91Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIChnc3RfaWlyX2VxdWFsaXplcl90cmFuc2Zvcm1faXApOgorCSAgRG9uJ3QgY2xpcCBmbG9hdC9kb3VibGUgc2FtcGxlcywgY29ycmVjdGx5IHVuc2V0IHBhc3N0aHJvdWdoIG1vZGUKKwkgIGFuZCB1c2UgYmV0dGVyIHJvdW5kaW5nIGZvciBpbnRlZ2VyIHNhbXBsZXMuCisKKzIwMDgtMDUtMzAgMTE6MDM6NTcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuKjogVXBkYXRlIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIG9ubHkgd2hlbiBuZWVkZWQgaW4gdGhlIHRyYW5zZm9ybV9pcCBmdW5jdGlvbiBhbmQgY29yLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9iYW5kX3NldF9wcm9wZXJ0eSksIChnc3RfaWlyX2VxdWFsaXplcl9pbml0KSwKKwkgIChzZXR1cF9maWx0ZXIpLCAoc2V0X3Bhc3N0aHJvdWdoKSwgKHVwZGF0ZV9jb2VmZmljaWVudHMpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX2NvbXB1dGVfZnJlcXVlbmNpZXMpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmg6CisJICBVcGRhdGUgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgb25seSB3aGVuIG5lZWRlZCBpbiB0aGUgdHJhbnNmb3JtX2lwCisJICBmdW5jdGlvbiBhbmQgY29ycmVjdGx5IHNldCB0aGUgZWxlbWVudCBpbnRvIHBhc3N0aHJvdWdoIG1vZGUgaWYgdGhlCisJICBnYWluIG9mIGFsbCBiYW5kcyBpcyAwLgorCisyMDA4LTA1LTI5IDExOjMwOjE2ICswMDAwICBTZWJhc3RpYW4gS2VsbGVyIDxzZWJhc3RpYW4ta2VsbGVyQGdteC5kZT4KKworCSAgZ3N0L2FscGhhL2dzdGFscGhhLmM6IFRyeSB0byBza2lwIHBpeGVscyBvciBhcmVhcyB0aGF0IGFyZSB0b28gZGFyayBvciB0b28gYnJpZ2h0IGZvciB1cyB0byBkbyBtZWFuaW5nZnVsbCBjb2xvciBkZXRlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5OiBTZWJhc3RpYW4gS2VsbGVyIDxzZWJhc3RpYW4ta2VsbGVyIGF0IGdteCBkb3QgZGU+CisJICAqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOiAoZ3N0X2FscGhhX2NsYXNzX2luaXQpLCAoZ3N0X2FscGhhX2luaXQpLAorCSAgKGdzdF9hbHBoYV9zZXRfcHJvcGVydHkpLCAoZ3N0X2FscGhhX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X2FscGhhX2Nocm9tYV9rZXlfYXl1diksIChnc3RfYWxwaGFfY2hyb21ha2V5X3Jvd19pNDIwKToKKwkgIFRyeSB0byBza2lwIHBpeGVscyBvciBhcmVhcyB0aGF0IGFyZSB0b28gZGFyayBvciB0b28gYnJpZ2h0IGZvciB1cyB0byBkbworCSAgbWVhbmluZ2Z1bGwgY29sb3IgZGV0ZWN0aW9uLgorCSAgQWRkZWQgcHJvcGVydGllcyB0byBjb250cm9sIHRoZSBzZW5zaXRpdml0eSB0byBsaWdodCBhbmQgZGFya25lc3MuCisJICBBZGRlZCBzb21lIHNtYWxsIGNsZWFudXBzLiBGaXhlcyAjNTEyMzQ1LgorCisyMDA4LTA1LTI4IDIwOjAxOjMyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgSWdub3JlIHNvbWUgbW9yZSBnZW5lcmF0ZWQgdGhpbmdzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zLy5jdnNpZ25vcmU6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5jdnNpZ25vcmU6CisJICBJZ25vcmUgc29tZSBtb3JlIGdlbmVyYXRlZCB0aGluZ3MKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBJZ25vcmUgT1NTIGVsZW1lbnRzIGluIHRoZSBzdGF0ZSBjaGFuZ2VzIHRlc3QgdG9vLgorCisyMDA4LTA1LTI4IDE2OjIyOjM2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBkb2NzL3BsdWdpbnMvOiBBZGQgU01QVEUgZWZmZWN0IGVsZW1lbnRzIHRvIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBBZGQgU01QVEUgZWZmZWN0IGVsZW1lbnRzIHRvIGRvY3MuCisKKzIwMDgtMDUtMjggMTQ6MzE6MDUgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgRG9jdW1lbnQgd2hhdHMgZmlyc3Qgc2hvd24gb24gdGhlIGZkbyBwbHVnaW4gZG9jcyBwYWdlIDopCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOgorCSAgRG9jdW1lbnQgd2hhdHMgZmlyc3Qgc2hvd24gb24gdGhlIGZkbyBwbHVnaW4gZG9jcyBwYWdlIDopCisKKzIwMDgtMDUtMjggMTQ6MDc6MjEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgUmVuYW1lIGF1ZGlvdm9pY2UgdG8gYXVkaW9rYXJhb2tlIGFuZCBhZGQgaXQgdG8gdGhlIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkgICogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZnguYzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9rYXJhb2tlLmM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5oOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3ZvaWNlLmM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvdm9pY2UuaDoKKwkgIFJlbmFtZSBhdWRpb3ZvaWNlIHRvIGF1ZGlva2FyYW9rZSBhbmQgYWRkIGl0IHRvIHRoZSBkb2NzLgorCisyMDA4LTA1LTI4IDEzOjI4OjIwICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIERvY3VtZW50IGFhc2luayBhbmQgY2FjYXNpbmsuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogUkVRVUlSRU1FTlRTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jZGlvLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb25vc2NvcGUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSAgKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6CisJICAqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmM6CisJICBEb2N1bWVudCBhYXNpbmsgYW5kIGNhY2FzaW5rLgorCisyMDA4LTA1LTI4IDA4OjM2OjQ0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuKjogZHVyYXRpb24gYW5kIGxhdGVuY3kgcXVlcmllcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IChnc3RfdmlkZW9taXhlcl9yZXNldCksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfaW5pdCksIChnc3RfdmlkZW9taXhlcl9xdWVyeV9kdXJhdGlvbiksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfcXVlcnlfbGF0ZW5jeSksIChnc3RfdmlkZW9taXhlcl9xdWVyeSksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfYmxlbmRfYnVmZmVycyk6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuaDoKKwkgIEltcGxlbWVudCBwb3NpdGlvbiAoaW4gdGltZSksIGR1cmF0aW9uIGFuZCBsYXRlbmN5IHF1ZXJpZXMuCisKKzIwMDgtMDUtMjggMDg6MTQ6MTYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOiBJbXBsZW1lbnQgbGF0ZW5jeSBxdWVyeS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6IChnc3RfaW50ZXJsZWF2ZV9zcmNfcXVlcnlfZHVyYXRpb24pLAorCSAgKGdzdF9pbnRlcmxlYXZlX3NyY19xdWVyeV9sYXRlbmN5KSwgKGdzdF9pbnRlcmxlYXZlX3NyY19xdWVyeSk6CisJICBJbXBsZW1lbnQgbGF0ZW5jeSBxdWVyeS4KKworMjAwOC0wNS0yNyAxNzo1NTozMCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci4qOiBJbXBsZW1lbnQgcHJvcGVyIHNlZWsvbmV3c2VnbWVudCBoYW5kbGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IChnc3RfdmlkZW9taXhlcl9yZXNldCksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfaW5pdCksIChnc3RfdmlkZW9taXhlcl9yZXF1ZXN0X25ld19wYWQpLAorCSAgKGdzdF92aWRlb21peGVyX2ZpbGxfcXVldWVzKSwgKGZvcndhcmRfZXZlbnRfZnVuYyksCisJICAoZm9yd2FyZF9ldmVudCksIChnc3RfdmlkZW9taXhlcl9zcmNfZXZlbnQpLAorCSAgKGdzdF92aWRlb21peGVyX3NpbmtfZXZlbnQpOgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmg6CisJICBJbXBsZW1lbnQgcHJvcGVyIHNlZWsvbmV3c2VnbWVudCBoYW5kbGluZy4KKwkgIEJhc2VkIG9uIGFkZGVyJ3MgaW1wbGVtZW50YXRpb24uCisJICBGaXhlcyAjNTM1MTIxCisKKzIwMDgtMDUtMjYgMTY6MjU6MTUgKzAwMDAgIGpeIDxqQG9pbDIxLm9yZz4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGQgY2FwcyBmb3IgRFZDUFJPNTAgYW5kIERWQ1BSTyBIRCBQQUwvTlRTQy4gU2VlICM1MjY0ODEuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBqXiA8aiBhdCBvaWwyMSBkb3Qgb3JnPgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3ZpZGVvX2NhcHMpOgorCSAgQWRkIGNhcHMgZm9yIERWQ1BSTzUwIGFuZCBEVkNQUk8gSEQgUEFML05UU0MuIFNlZSAjNTI2NDgxLgorCisyMDA4LTA1LTI2IDE1OjUxOjQxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvYXVkaW9meC86IEFkZCBzaW1wbGUgdm9pY2UgcmVtb3ZhbCBlbGVtZW50LiBZYXkga2FyYW9rZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9meC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3ZvaWNlLmM6IChnc3RfYXVkaW9fdm9pY2VfYmFzZV9pbml0KSwKKwkgIChnc3RfYXVkaW9fdm9pY2VfY2xhc3NfaW5pdCksIChnc3RfYXVkaW9fdm9pY2VfaW5pdCksCisJICAodXBkYXRlX2ZpbHRlciksIChnc3RfYXVkaW9fdm9pY2Vfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfYXVkaW9fdm9pY2VfZ2V0X3Byb3BlcnR5KSwgKGdzdF9hdWRpb192b2ljZV9zZXR1cCksCisJICAoZ3N0X2F1ZGlvX3ZvaWNlX3RyYW5zZm9ybV9pbnQpLCAoZ3N0X2F1ZGlvX3ZvaWNlX3RyYW5zZm9ybV9mbG9hdCksCisJICAoZ3N0X2F1ZGlvX3ZvaWNlX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvdm9pY2UuaDoKKwkgIEFkZCBzaW1wbGUgdm9pY2UgcmVtb3ZhbCBlbGVtZW50LiBZYXkga2FyYW9rZS4KKworMjAwOC0wNS0yNiAxNTozOToyNiArMDAwMCAgV2lsbGlhbSBNLiBCcmFjayA8d2JyYWNrQG1tbS5jb20uaGs+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogRml4IHBvdGVudGlhbCBjYXBzIGxlYWsuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBXaWxsaWFtIE0uIEJyYWNrIDx3YnJhY2sgYXQgbW1tIGRvdCBjb20gZG90IGhrPgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IChnc3RfdjRsMnNyY19wcm9iZV9jYXBzX2Zvcl9mb3JtYXQpOgorCSAgRml4IHBvdGVudGlhbCBjYXBzIGxlYWsuCisJICBJZiB3ZSBjYW4ndCBnZXQgdGhlIGZyYW1lcmF0ZSB3aXRoIGFuIGlvY3RsLCB0cnkgdG8gZ2V0IGl0IHdpdGggdGhlCisJICBjdXJyZW50IG5vcm0uIEZpeGVzICM1MjAwOTIuCisKKzIwMDgtMDUtMjYgMTU6MTQ6NTUgKzAwMDAgIFdpbGxpYW0gTS4gQnJhY2sgPHdicmFja0BtbW0uY29tLmhrPgorCisJICBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IElmIHdlIGZhaWwgdG8gZ2V0IHRoZSBmcmFtZSBpbnRlcnZhbHMsIHNpbXBseSBkb24ndCB0b3VjaCB0aGUgZnJhbWVyYXRlcyBvbiB0aGUgdGVtcGxhdGUgY2EuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFdpbGxpYW0gTS4gQnJhY2sgPHdicmFjayBhdCBtbW0gZG90IGNvbSBkb3QgaGs+CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIChnc3RfdjRsMnNyY19wcm9iZV9jYXBzX2Zvcl9mb3JtYXRfYW5kX3NpemUpOgorCSAgSWYgd2UgZmFpbCB0byBnZXQgdGhlIGZyYW1lIGludGVydmFscywgc2ltcGx5IGRvbid0IHRvdWNoIHRoZSBmcmFtZXJhdGVzCisJICBvbiB0aGUgdGVtcGxhdGUgY2FwcyBpbnN0ZWFkIG9mIGRpc2NhcmRpbmcgdGhlIGZvcm1hdC4gU2VlICM1MjAwOTIuCisKKzIwMDgtMDUtMjYgMTQ6NTI6NTEgKzAwMDAgIFdpbGxpYW0gTS4gQnJhY2sgPHdicmFja0BtbW0uY29tLmhrPgorCisJICBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IEFkZCBOVjEyLCBOVjIxIGFuZCBiYXllciBzdXBwb3J0LiBTZWUgIzUyMDA5Mi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFdpbGxpYW0gTS4gQnJhY2sgPHdicmFjayBhdCBtbW0gZG90IGNvbSBkb3QgaGs+CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogKGdzdF92NGwyc3JjX3Y0bDJmb3VyY2NfdG9fc3RydWN0dXJlKSwKKwkgIChnc3RfdjRsMl9nZXRfY2Fwc19pbmZvKToKKwkgIEFkZCBOVjEyLCBOVjIxIGFuZCBiYXllciBzdXBwb3J0LiBTZWUgIzUyMDA5Mi4KKworMjAwOC0wNS0yNiAxMzo1MTozOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBVbmJyZWFrIHNlZ21lbnQgYWN0aXZhdGlvbiBhZ2Fpbi4gRml4ZXMgIzUzMTY3Mi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9maW5kX3NlZ21lbnQpLAorCSAgKGdzdF9xdGRlbXV4X2FjdGl2YXRlX3NlZ21lbnQpOgorCSAgVW5icmVhayBzZWdtZW50IGFjdGl2YXRpb24gYWdhaW4uIEZpeGVzICM1MzE2NzIuCisKKzIwMDgtMDUtMjYgMTA6Mjg6NDcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6IEFkZCBhbm90aGVyIGV4YW1wbGUgbGF1bmNoIGxpbmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJICBBZGQgYW5vdGhlciBleGFtcGxlIGxhdW5jaCBsaW5lLgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6IChpbnRlcmxlYXZlXzI0KSwKKwkgIChnc3RfaW50ZXJsZWF2ZV9maW5hbGl6ZSksIChnc3RfaW50ZXJsZWF2ZV9iYXNlX2luaXQpLAorCSAgKGdzdF9pbnRlcmxlYXZlX2NsYXNzX2luaXQpLCAoZ3N0X2ludGVybGVhdmVfaW5pdCksCisJICAoZ3N0X2ludGVybGVhdmVfcmVxdWVzdF9uZXdfcGFkKSwgKGdzdF9pbnRlcmxlYXZlX3JlbGVhc2VfcGFkKSwKKwkgIChnc3RfaW50ZXJsZWF2ZV9jaGFuZ2Vfc3RhdGUpLCAoX19yZW1vdmVfY2hhbm5lbHMpLAorCSAgKF9fc2V0X2NoYW5uZWxzKSwgKGdzdF9pbnRlcmxlYXZlX3NpbmtfZ2V0Y2FwcyksCisJICAoZ3N0X2ludGVybGVhdmVfc2V0X3Byb2Nlc3NfZnVuY3Rpb24pLAorCSAgKGdzdF9pbnRlcmxlYXZlX3Npbmtfc2V0Y2FwcyksIChnc3RfaW50ZXJsZWF2ZV9zaW5rX2V2ZW50KSwKKwkgIChnc3RfaW50ZXJsZWF2ZV9zcmNfcXVlcnlfZHVyYXRpb24pLCAoZ3N0X2ludGVybGVhdmVfc3JjX3F1ZXJ5KSwKKwkgIChmb3J3YXJkX2V2ZW50X2Z1bmMpLCAoZm9yd2FyZF9ldmVudCksIChnc3RfaW50ZXJsZWF2ZV9zcmNfZXZlbnQpLAorCSAgKGdzdF9pbnRlcmxlYXZlX2NvbGxlY3RlZCk6CisJICAqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuaDoKKwkgIE1ham9yIHJld3JpdGUgb2YgaW50ZXJsZWF2ZSB1c2luZyBHc3RDb2xsZWN0cGFkcy4gVGhpcyBuZXcgdmVyc2lvbgorCSAgYWxzbyBzdXBwb3J0cyBhbG1vc3QgYWxsIHJhdyBhdWRpbyBmb3JtYXRzIGFuZCBoYXMgYmV0dGVyIGNhcHMKKwkgIG5lZ290aWF0aW9uLiBGaXhlcyBidWcgIzUwNjU5NC4KKwkgIEFsc28gdXBkYXRlIGRvY3MgYW5kIGFkZCBzb21lIG1vcmUgZXhhbXBsZXMuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ludGVybGVhdmUuYzogKGludGVybGVhdmVfY2hhaW5fZnVuYyksCisJICAoR1NUX1NUQVJUX1RFU1QpLCAoc3JjX2hhbmRvZmZfZmxvYXQzMiksIChzaW5rX2hhbmRvZmZfZmxvYXQzMiksCisJICAoaW50ZXJsZWF2ZV9zdWl0ZSk6CisJICBBZGQgc29tZSBtb3JlIGV4dGVuc2l2ZSB1bml0IHRlc3RzIGZvciBpbnRlcmxlYXZlLgorCisyMDA4LTA1LTI2IDA5OjU3OjQwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBEb24ndCB1c2UgX2dzdF9wYWQoKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleGFtcGxlcy9zd2l0Y2gvc3dpdGNoZXIuYzogKHN3aXRjaF90aW1lcik6CisJICAqIGdzdC9yZXBsYXlnYWluL2dzdHJndm9sdW1lLmM6IChnc3Rfcmdfdm9sdW1lX2luaXQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBjbGllbnQuYzogKGNyZWF0ZV9zdHJlYW0pOgorCSAgKiBnc3Qvc2RwL2dzdHNkcGRlbXV4LmM6IChnc3Rfc2RwX2RlbXV4X3N0cmVhbV9jb25maWd1cmVfdWRwKSwKKwkgIChnc3Rfc2RwX2RlbXV4X3N0cmVhbV9jb25maWd1cmVfdWRwX3NpbmspOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGVhdmUuYzogKEdTVF9TVEFSVF9URVNUKSwKKwkgIChwYWRfYWRkZWRfc2V0dXBfZGF0YV9jaGVja19mbG9hdDMyXzhjaF9jYik6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzogKHNlbmRfZW9zX2V2ZW50KSwKKwkgIChzZW5kX3RhZ19ldmVudCk6CisJICBEb24ndCB1c2UgX2dzdF9wYWQoKS4KKworMjAwOC0wNS0yNSAxNjowOTozOSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvZmxhYy86IFNldCB0aGUgY2hhbm5lbCBsYXlvdXQgd2hlbiBkZWNvZGluZyBGTEFDIGZpbGVzIHdpdGggbW9yZSB0aGFuIDIgY2hhbm5lbHMgYXMgZGVmaW5lZCBieSB0aGUgRkxBQyBzcGVjLiBGaXguLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfZGVjX3dyaXRlKToKKwkgIFNldCB0aGUgY2hhbm5lbCBsYXlvdXQgd2hlbiBkZWNvZGluZyBGTEFDIGZpbGVzIHdpdGggbW9yZSB0aGFuIDIKKwkgIGNoYW5uZWxzIGFzIGRlZmluZWQgYnkgdGhlIEZMQUMgc3BlYy4gRml4ZXMgYnVnICM1MzQ1NzAuCisJICBBbHNvIGRvbid0IHRyeSB0byBkZWNvZGUgbGVmdC9zaWRlLCByaWdodC9zaWRlIGFuZCBtaWQvc2lkZSBmaWxlcworCSAgYXMgd2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIGF0IGFsbC4KKworMjAwOC0wNS0yNCAxMjo1NTozOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBXZSBuZWVkIC1iYXNlIENWUyAocnRzcCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgV2UgbmVlZCAtYmFzZSBDVlMgKHJ0c3ApLgorCisyMDA4LTA1LTIyIDE5OjQ3OjUzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGRvY3MvcGx1Z2lucy86IEFkZCBpbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZSB0byB0aGUgZG9jcyBhbmQgd2hpbGUgYXQgdGhhdCBydW4gbWFrZSB1cGRhdGUgaW4gZG9jcy9wbHVnaW5zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLnNpZ25hbHM6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHNhc3BkaWYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW1yd2IueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWJheWVyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWJ6Mi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jZGF1ZGlvLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNkeGFwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZmJ2aWRlb3NpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRzZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2Yi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdmRzcHUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmFhYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mYWFkLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZiZGV2c2luay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mZXN0aXZhbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1maWx0ZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2ZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZnJlZXplLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzbS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWgyNjRwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGFkc3BhLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1ldGFkYXRhLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1tcy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb2RwbHVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1wZWcyZW5jLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1wZWc0dmlkZW9wYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tcGVndHNwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tcGVndmlkZW9wYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdXNlcGFjay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdXNpY2JyYWluei54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdmUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmFzLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5lb24ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbnNmZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW51dmRlbXV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJhd3BhcnNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlYWwueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZmJzcmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2RsLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNkcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zZWxlY3Rvci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbmRmaWxlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdW5kdG91Y2gueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BjZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWVkLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4cmVzYW1wbGUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3RlcmVvLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXR0YS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12Y2RzcmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9zaWduYWwueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdm1uYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13aWxkbWlkaS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14MjY0LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXh2aWQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkgIEFkZCBpbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZSB0byB0aGUgZG9jcyBhbmQgd2hpbGUgYXQgdGhhdAorCSAgcnVuIG1ha2UgdXBkYXRlIGluIGRvY3MvcGx1Z2lucy4KKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJICBBZGQgYSBwYXJhcHJhcGggYWJvdXQgdXNpbmcgYSBxdWV1ZSBhbmQgYXVkaW9jb252ZXJ0IGFmdGVyIHRoZSBzb3VyY2UKKwkgIHBhZHMgdG8gdGhlIGRvY3MuCisKKzIwMDgtMDUtMjIgMTg6NTU6MDkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLio6IERvbid0IHNldCBhIGdldGNhcHMoKSBmdW5jdGlvbiBvbiB0aGUgc3JjIHBhZHMgYXMgaXQncyBub3QgcmVxdWlyZWQgYW5kIHRoZSBkZWZhdWx0IGdlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6IChnc3RfZGVpbnRlcmxlYXZlX2Jhc2VfaW5pdCksCisJICAoZ3N0X2RlaW50ZXJsZWF2ZV9jbGFzc19pbml0KSwgKGdzdF9kZWludGVybGVhdmVfaW5pdCksCisJICAoZ3N0X2RlaW50ZXJsZWF2ZV9hZGRfbmV3X3BhZHMpLCAoZ3N0X2RlaW50ZXJsZWF2ZV9zaW5rX2dldGNhcHMpOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuaDoKKwkgIERvbid0IHNldCBhIGdldGNhcHMoKSBmdW5jdGlvbiBvbiB0aGUgc3JjIHBhZHMgYXMgaXQncyBub3QgcmVxdWlyZWQKKwkgIGFuZCB0aGUgZGVmYXVsdCBnZXRjYXBzKCkgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29ycmVjdCByZXN1bHRzIGZvcgorCSAgb3VyIHNyYyBwYWRzLgorCSAgQ29tcGxldGUgZG9jdW1lbnRhdGlvbiBhbmQgYWRkIG15c2VsZiB0byB0aGUgYXV0aG9ycyBvZiB0aGUgZWxlbWVudC4KKworMjAwOC0wNS0yMiAxNDo0OTowOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3VkcC9NYWtlZmlsZS5hbTogQWRkIC1EX0dOVV9TT1VSQ0UgdG8gQ0ZMQUdTIHNvIHdlIGdldCB0aGluZ3MgbGlrZSBFQUlfQUREUkZBTUlMWSB3aGVuIGluY2x1ZGluZyBuZXRkYi5oIHdoZW4gYnVpLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9NYWtlZmlsZS5hbToKKwkgIEFkZCAtRF9HTlVfU09VUkNFIHRvIENGTEFHUyBzbyB3ZSBnZXQgdGhpbmdzIGxpa2UgRUFJX0FERFJGQU1JTFkKKwkgIHdoZW4gaW5jbHVkaW5nIG5ldGRiLmggd2hlbiBidWlsZGluZyBhZ2FpbnN0IGdsaWJjID49IDIuOC4KKworMjAwOC0wNS0yMiAxMToxOTowMyArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6IEZpeCBkZWJ1ZyBzdGF0ZW1lbnQgYXJndW1lbnRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA4LTA1LTIyICBKdWxpZW4gTW91dHRlICA8anVsaWVuQGZsdWVuZG8uY29tPgorCSAgKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5jOiAoZ3N0X3NtcHRlX2FscGhhX3NldGNhcHMpOiBGaXgKKwkgIGRlYnVnIHN0YXRlbWVudCBhcmd1bWVudHMuCisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChnc3RfbXVsdGl1ZHBzaW5rX3NldHVwX3Fvc19kc2NwKToKKwkgICogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOiAoZ3N0X3VkcF9qb2luX2dyb3VwKSwKKwkgIChnc3RfdWRwX2xlYXZlX2dyb3VwKTogRml4IElQIGFuZCBJUFY2IG9wdGlvbnMgdG8gbWFrZSBpdCB3b3JrCisJICBvbiBtb3JlIHBsYXRmb3Jtcy4KKworMjAwOC0wNS0yMSAxNzo1MTowOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvOiBEb24ndCB1c2UgZ3N0X2VsZW1lbnRfZ2V0X3BhZCgpLCBpdCdzIGEgYmFkLCBiYWQgbWV0aG9kLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOiAoc2V0dXBfc3JjX3BhZCksCisJICAodGVhcmRvd25fc3JjX3BhZCk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ljeWRlbXV4LmM6IChpY3lkZW11eF9mb3VuZF9wYWQpLAorCSAgKEdTVF9TVEFSVF9URVNUKToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvbWF0cm9za2FtdXguYzogKHNldHVwX3NyY19wYWQpLAorCSAgKHRlYXJkb3duX3NyY19wYWQpLCAoc2V0dXBfc2lua19wYWQpLCAodGVhcmRvd25fc2lua19wYWQpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2Nyb3AuYzogKHZpZGVvX2Nyb3BfZ2V0X3Rlc3RfY2FwcyksCisJICAoR1NUX1NUQVJUX1RFU1QpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrcGFyc2UuYzogKHdhdnBhY2twYXJzZV9mb3VuZF9wYWQpLAorCSAgKHNldHVwX3dhdnBhY2twYXJzZSksIChjbGVhbnVwX3dhdnBhY2twYXJzZSk6CisJICBEb24ndCB1c2UgZ3N0X2VsZW1lbnRfZ2V0X3BhZCgpLCBpdCdzIGEgYmFkLCBiYWQgbWV0aG9kLgorCisyMDA4LTA1LTIxIDE3OjM5OjM4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBEb24ndCB1c2UgZ3N0X2VsZW1lbnRfZ2V0X3BhZCgpLCBpdCdzIGEgYmFkIG1ldGhvZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NyYy5jOiAoZ3N0X2djb25mX2F1ZGlvX3NyY19yZXNldCksCisJICAoZG9fdG9nZ2xlX2VsZW1lbnQpOgorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NpbmsuYzogKGdzdF9nY29uZl92aWRlb19zaW5rX3Jlc2V0KSwKKwkgIChkb190b2dnbGVfZWxlbWVudCk6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc3JjLmM6IChnc3RfZ2NvbmZfdmlkZW9fc3JjX3Jlc2V0KSwKKwkgIChkb190b2dnbGVfZWxlbWVudCk6CisJICAqIGV4dC9nY29uZi9nc3Rzd2l0Y2hzaW5rLmM6IChnc3Rfc3dpdGNoX2NvbW1pdF9uZXdfa2lkKToKKwkgICogZXh0L2hhbC9nc3RoYWxhdWRpb3NpbmsuYzogKGdzdF9oYWxfYXVkaW9fc2lua19yZXNldCksCisJICAoZG9fdG9nZ2xlX2VsZW1lbnQpOgorCSAgKiBleHQvaGFsL2dzdGhhbGF1ZGlvc3JjLmM6IChnc3RfaGFsX2F1ZGlvX3NyY19yZXNldCksCisJICAoZG9fdG9nZ2xlX2VsZW1lbnQpOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6IChnc3RfYXV0b19hdWRpb19zaW5rX3Jlc2V0KSwKKwkgIChnc3RfYXV0b19hdWRpb19zaW5rX2RldGVjdCk6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzogKGdzdF9hdXRvX3ZpZGVvX3NpbmtfcmVzZXQpLAorCSAgKGdzdF9hdXRvX3ZpZGVvX3NpbmtfZGV0ZWN0KToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfaW5pdCksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2ZyZWUpLCAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV91ZHApLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdWRwX3NpbmspLCAoZ3N0X3J0c3BzcmNfc2tpcF9sd3MpLAorCSAgKGdzdF9ydHNwc3JjX3Vuc2tpcF9sd3MpLCAoZ3N0X3J0c3BzcmNfc2tpcF9jb21tYXMpLAorCSAgKGdzdF9ydHNwc3JjX3NraXBfaXRlbSksIChnc3RfcnRzcF9kZWNvZGVfcXVvdGVkX3N0cmluZyksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfZGlnZXN0X2NoYWxsZW5nZSksIChnc3RfcnRzcHNyY19wYXJzZV9hdXRoX2hkcik6CisJICAqIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6ICh0ZXN0X3dpdGhfY2FwcyksCisJICAodmlkZW9fY3JvcF9nZXRfdGVzdF9jYXBzKToKKwkgIERvbid0IHVzZSBnc3RfZWxlbWVudF9nZXRfcGFkKCksIGl0J3MgYSBiYWQgbWV0aG9kLgorCisyMDA4LTA1LTIxIDE3OjM1OjUwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwLzogSm9pbmluZyBhIG11bHRpY2FzdCBncm91cCBhbmQgc2V0dGluZyB0aGUgbG9vcC90dGwgcHJvcGVydGllcyBhcmUgdG90YWxseSB1bnJlbGF0ZWQgdGFza3MgYXJlIG11c3QgYmUgc2VwYXIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19pbml0X3NlbmQpLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfYWRkX2ludGVybmFsKToKKwkgICogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOiAoZ3N0X3VkcF9zZXRfbG9vcF90dGwpLAorCSAgKGdzdF91ZHBfam9pbl9ncm91cCk6CisJICAqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuaDoKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfc3RhcnQpOgorCSAgSm9pbmluZyBhIG11bHRpY2FzdCBncm91cCBhbmQgc2V0dGluZyB0aGUgbG9vcC90dGwgcHJvcGVydGllcyBhcmUKKwkgIHRvdGFsbHkgdW5yZWxhdGVkIHRhc2tzIGFyZSBtdXN0IGJlIHNlcGFyYXRlZC4KKworMjAwOC0wNS0yMSAxNDowOTo0MSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aW11eC5jOiBBbHNvIHN1cHBvcnQgYWxhdy9tdWxhdy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgQWxzbyBzdXBwb3J0IGFsYXcvbXVsYXcuCisKKzIwMDgtMDUtMjEgMTM6NDc6NDMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLio6IEFkZCBhIGZpeG1lIGZvciB0aGUgYXV0by1tdWx0aWNhc3QgcHJvcGVydHkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogKGdzdF9tdWx0aXVkcHNpbmtfY2xhc3NfaW5pdCksCisJICAoZ3N0X211bHRpdWRwc2lua19zZXR1cF9xb3NfZHNjcCksIChnc3RfbXVsdGl1ZHBzaW5rX2FkZF9pbnRlcm5hbCk6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJICBBZGQgYSBmaXhtZSBmb3IgdGhlIGF1dG8tbXVsdGljYXN0IHByb3BlcnR5LgorCSAgRml4IHNvbWUgY29uZnVzaW5nIGRlYnVnIG1lc3NhZ2VzLgorCSAgRGlzYWJsZSBzZXR0aW5nIGEgcW9zIHZhbHVlIGJ5IGRlZmF1bHQuCisKKzIwMDgtMDUtMjEgMTE6Mzg6MTcgKzAwMDAgIEd1c3RhZiBSw6RudGlsw6QgPGcucmFudGlsYUBnbWFpbC5jb20+CisKKwkgIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IElnbm9yZSBFUEVSTSBlcnJvcnMgZnJvbSBzZW5kdG8uIEZpeGVzICM1MzM2MTkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBHdXN0YWYgUsOkbnRpbMOkIDxnIGRvdCByYW50aWxhIGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChnc3RfbXVsdGl1ZHBzaW5rX3JlbmRlcik6CisJICBJZ25vcmUgRVBFUk0gZXJyb3JzIGZyb20gc2VuZHRvLiBGaXhlcyAjNTMzNjE5LgorCisyMDA4LTA1LTIxIDEwOjUxOjUyICswMDAwICBIZW5yaWsgRXJpa3Nzb24gPGhlbnJpa2VuQGF4aXMuY29tPgorCisJICBnc3QvdWRwL2dzdG11bHRpdWRwc2luay4qOiBBZGQgcW9zLWRzY3AgcHJvcGVydHkgdG8gbWFuYWdlIHRoZSBRdWFsaXR5IG9mIHNlcnZpY2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBIZW5yaWsgRXJpa3Nzb24gPGhlbnJpa2VuIGF0IGF4aXMgZG90IGNvbT4KKwkgICogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogKGdzdF9tdWx0aXVkcHNpbmtfY2xhc3NfaW5pdCksCisJICAoZ3N0X211bHRpdWRwc2lua19pbml0KSwgKGdzdF9tdWx0aXVkcHNpbmtfc2V0dXBfcW9zX2RzY3ApLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX2luaXRfc2VuZCksIChnc3RfbXVsdGl1ZHBzaW5rX2FkZF9pbnRlcm5hbCk6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJICBBZGQgcW9zLWRzY3AgcHJvcGVydHkgdG8gbWFuYWdlIHRoZSBRdWFsaXR5IG9mIHNlcnZpY2UuCisKKzIwMDgtMDUtMjEgMTA6MDk6MjMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzogSW1wcm92ZSBkZWJ1Z2dpbmcgb2YgdGhlIGlkZW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzogKGdzdF9ydHBfdGhlb3JhX2RlcGF5X3Byb2Nlc3MpOgorCSAgSW1wcm92ZSBkZWJ1Z2dpbmcgb2YgdGhlIGlkZW50LgorCisyMDA4LTA1LTIxIDA5OjU2OjAyICswMDAwICBCcnVubyBTYW50b3MgPGJydW5vZkB1YS5wdD4KKworCSAgZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy4qOiBQcm92aWRlIGEgYnVuY2ggb2YgaGVscGVyIG1ldGhvZHMgdG8gZGVhbCB3aXRoIElQdjQgYW5kIElQdjYgdHJhbnNwYXJlbnRseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEJydW5vIFNhbnRvcyA8YnJ1bm9mIGF0IHVhIGRvdCBwdD4KKwkgICogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOiAoZ3N0X3VkcF9nZXRfYWRkciksCisJICAoZ3N0X3VkcF9qb2luX2dyb3VwKSwgKGdzdF91ZHBfbGVhdmVfZ3JvdXApLAorCSAgKGdzdF91ZHBfaXNfbXVsdGljYXN0KToKKwkgICogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5oOgorCSAgUHJvdmlkZSBhIGJ1bmNoIG9mIGhlbHBlciBtZXRob2RzIHRvIGRlYWwgd2l0aCBJUHY0IGFuZCBJUHY2CisJICB0cmFuc3BhcmVudGx5LgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19jbGFzc19pbml0KSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX2luaXQpLCAoZ3N0X211bHRpdWRwc2lua19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3Byb3BlcnR5KSwgKGpvaW5fbXVsdGljYXN0KSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX2luaXRfc2VuZCksIChnc3RfbXVsdGl1ZHBzaW5rX2FkZF9pbnRlcm5hbCksCisJICAoZ3N0X211bHRpdWRwc2lua19yZW1vdmUpOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSAgQWRkIG11bHRpY2FzdCBUVEwgYW5kIGxvb3BiYWNrIHByb3BlcnRpZXMuCisJICBVc2UgdGhlIGhlbHBlciBtZXRob2RzIHRvIGltcGxlbWVudCBpcDQgYW5kIGlwNi4KKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfY3JlYXRlKSwgKGdzdF91ZHBzcmNfc3RhcnQpOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCSAgVXNlIHRoZSBoZWxwZXIgbWV0aG9kcyB0byBpbXBsZW1lbnQgaXA0IGFuZCBpcDYuCisJICBGaXhlcyAjNTE1OTYyLgorCisyMDA4LTA1LTIxIDA5OjM4OjQ4ICswMDAwICBQYXRyaWNrIFJhZGl6aSA8cGF0cmljay5yYWRpemlAYXhpcy5jb20+CisKKwkgIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguKjogRG9uJ3QgYmxpbmRseSBjb3B5IHRoZSBtaW1lLXR5cGUgYXMgdGhlIGNhcHMgbmFtZSBiZWNhdXNlIHRoZXkgbm90IGFsd2F5cyBtYXAgZGlyZWN0bC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUGF0cmljayBSYWRpemkgPHBhdHJpY2sgZG90IHJhZGl6aSBhdCBheGlzIGRvdCBjb20+CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzogKGdzdF9tdWx0aXBhcnRfZGVtdXhfY2xhc3NfaW5pdCksCisJICAoZ3N0X211bHRpcGFydF9kZW11eF9nZXRfZ3N0bmFtZSksCisJICAoZ3N0X211bHRpcGFydF9maW5kX3BhZF9ieV9taW1lKSwgKGdzdF9tdWx0aXBhcnRfZGVtdXhfY2hhaW4pOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4Lmg6CisJICBEb24ndCBibGluZGx5IGNvcHkgdGhlIG1pbWUtdHlwZSBhcyB0aGUgY2FwcyBuYW1lIGJlY2F1c2UgdGhleSBub3QKKwkgIGFsd2F5cyBtYXAgZGlyZWN0bHkuIEluc3RlYWQgdXNlIGEgaGFzaHRhYmxlIHdpdGggY29tbW9uIG1hcHBpbmdzLgorCSAgRml4ZXMgIzUzMzI4Ny4KKworMjAwOC0wNS0yMCAxNzoyNzozNSArMDAwMCAgTWljaGFlbCBNZWVrcyA8bW1lZWtzQHhpbWlhbi5vcmc+CisKKwkgIGV4dC9lc2QvZXNkc2luay5jOiBXaGVuIHdlIHBvc3QgYW4gZXJyb3IsIHdlIG11c3QgcmV0dXJuIC0xIHRvIGxldCB0aGUgcGFyZW50IGtub3cgdGhhdCB3ZSBjYW5ub3Qgd3JpdGUgdGhlIHNlZ21lbnQgZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfd3JpdGUpOgorCSAgV2hlbiB3ZSBwb3N0IGFuIGVycm9yLCB3ZSBtdXN0IHJldHVybiAtMSB0byBsZXQgdGhlIHBhcmVudCBrbm93IHRoYXQgd2UKKwkgIGNhbm5vdCB3cml0ZSB0aGUgc2VnbWVudCBlbHNlIGl0IHdpbGwgbG9vcCBhbmQgY29udGludWUgdG8gY2FsbCB1cyBhZ2FpbgorCSAgZm9yZXZlci4gUGF0Y2ggYnkgTWljaGFlbCBNZWVrcy4KKworMjAwOC0wNS0yMCAxNDoyNDoyMSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IEFkZCBtaXNzaW5nIGluY3VkZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgQWRkIG1pc3NpbmcgaW5jdWRlcy4KKworMjAwOC0wNS0yMCAxMzo1Nzo0NCArMDAwMCAgUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2pAYXhpcy5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS4qOiBDb3JyZWN0IGEgdHlwbyAoc2lubGUgLT4gc2luZ2xlKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzogKGdzdF9oMjY0X3NjYW5fbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X3J0cF9oMjY0X3BheV9oYW5kbGVfYnVmZmVyKToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJICBDb3JyZWN0IGEgdHlwbyAoc2lubGUgLT4gc2luZ2xlKS4KKworMjAwOC0wNS0yMCAxMTozMzowNSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuKjogQWRkIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBvdXRwdXR0aW5nIHF1aWNrdGltZS1saWtlIEFWQyBvdXRwdXQgaW4gYWRkaXRpb24gdG8gdGhlIGV4aXN0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzogKGdzdF9ydHBfaDI2NF9kZXBheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX2gyNjRfZGVwYXlfaW5pdCksIChnc3RfcnRwX2gyNjRfZGVwYXlfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX2gyNjRfZGVwYXlfZ2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBfaDI2NF9kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX2gyNjRfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5Lmg6CisJICBBZGQgZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIG91dHB1dHRpbmcgcXVpY2t0aW1lLWxpa2UgQVZDIG91dHB1dCBpbgorCSAgYWRkaXRpb24gdG8gdGhlIGV4aXN0aW5nIGJ5dGVzdHJlYW0gb3V0cHV0LgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzogKGdzdF9oMjY0X3NjYW5fbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X3J0cF9oMjY0X3BheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfaDI2NF9wYXlfaW5pdCksCisJICAoZ3N0X3J0cF9oMjY0X3BheV9zZXRjYXBzKSwgKGdzdF9ydHBfaDI2NF9wYXlfcGF5bG9hZF9uYWwpLAorCSAgKGdzdF9ydHBfaDI2NF9wYXlfaGFuZGxlX2J1ZmZlciksIChnc3RfcnRwX2gyNjRfcGF5X3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9oMjY0X3BheV9nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuaDoKKwkgIE1ha2UgdGhlIHBhcnNpbmcgbW9kZSBjb25maWd1cmFibGUsIGZvciBzb21lIGlucHV0cyB3ZSBkb24ndCBuZWVkIHRvCisJICBzY2FuIGV2ZXJ5IGJ5dGUgZm9yIHN0YXJ0IGNvZGVzLgorCSAgT25seSBzZXQgdGhlIG1hcmtlciBiaXQgb24gQUNDRVNTIHVuaXRzLgorCisyMDA4LTA1LTIwIDEwOjQ3OjEwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6IFVzZSBhIGJpZ2dlciB0eXBlIGluIGludGVnZXIgbW9kZSBmb3IgdGhlIGludGVybWVkaWF0ZSByZXN1bHRzIHRvIHByZXZlbnQgb3ZlcmZsb3dzLi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJICBVc2UgYSBiaWdnZXIgdHlwZSBpbiBpbnRlZ2VyIG1vZGUgZm9yIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyB0bworCSAgcHJldmVudCBvdmVyZmxvd3MuIFRoaXMgZml4ZXMgdGhlIGNyaXBwbGVkIHNvdW5kIHdoZW4gdXNpbmcgdGhlCisJICBlcXVhbGl6ZXIgaW4gaW50ZWdlciBtb2RlLiBGaXhlcyBidWcgIzUxMDg2NS4KKworMjAwOC0wNS0yMCAxMDo0MjozMyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuKjogSW5zdGVhZCBvZiBhIHJhbmRvbSBudW1iZXIgZm9yIHRoZSByZXF1ZXN0IHBhZCBpZCdzLCB1c2UgYSBjb3VudGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5oOgorCSAgSW5zdGVhZCBvZiBhIHJhbmRvbSBudW1iZXIgZm9yIHRoZSByZXF1ZXN0IHBhZCBpZCdzLAorCSAgdXNlIGEgY291bnRlci4KKwkgIFJlZ2lzdGVyIHRoZSB2aWRlb21peGVycGFkIGNsYXNzIGZyb20gdGhlIGVsZW1lbnQncyBjbGFzc19pbml0CisJICB3aGVyZSBpdCdzIHNhZmVyLCBhbmQgYWxsb3dzIHRoZSBkb2NzIGdlbmVyYXRvciB0byBzY2FuIGl0LgorCisyMDA4LTA1LTIwIDA5OjI5OjI4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3Qvc21wdGUvOiBBZGQgbmV3IHBsdWdpbiB0aGF0IGFkZHMgdGhlIFNNUFRFIHRyYW5zaXRpb24gaW4gdGhlIGFscGhhIGNoYW5uZWwgb2YKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc21wdGUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOiAoZ3N0X3NtcHRlX3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3NtcHRlL2dzdHNtcHRlLmg6CisJICAqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJICAoZ3N0X3NtcHRlX2FscGhhX3RyYW5zaXRpb25fdHlwZV9nZXRfdHlwZSksCisJICAoZ3N0X3NtcHRlX2FscGhhX2dldF90eXBlKSwgKGdzdF9zbXB0ZV9hbHBoYV9iYXNlX2luaXQpLAorCSAgKGdzdF9zbXB0ZV9hbHBoYV9jbGFzc19pbml0KSwgKGdzdF9zbXB0ZV9hbHBoYV91cGRhdGVfbWFzayksCisJICAoZ3N0X3NtcHRlX2FscGhhX3NldGNhcHMpLCAoZ3N0X3NtcHRlX2FscGhhX2dldF91bml0X3NpemUpLAorCSAgKGdzdF9zbXB0ZV9hbHBoYV9pbml0KSwgKGdzdF9zbXB0ZV9hbHBoYV9maW5hbGl6ZSksCisJICAoZ3N0X3NtcHRlX2FscGhhX2RvX2F5dXYpLCAoZ3N0X3NtcHRlX2FscGhhX2RvX2k0MjApLAorCSAgKGdzdF9zbXB0ZV9hbHBoYV90cmFuc2Zvcm0pLCAoZ3N0X3NtcHRlX2FscGhhX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3NtcHRlX2FscGhhX2dldF9wcm9wZXJ0eSksIChnc3Rfc21wdGVfYWxwaGFfcGx1Z2luX2luaXQpOgorCSAgKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5oOgorCSAgKiBnc3Qvc21wdGUvcGx1Z2luLmM6IChwbHVnaW5faW5pdCk6CisJICBBZGQgbmV3IHBsdWdpbiB0aGF0IGFkZHMgdGhlIFNNUFRFIHRyYW5zaXRpb24gaW4gdGhlIGFscGhhIGNoYW5uZWwgb2YKKwkgIEk0MjAgYW5kIEFZVVYgZnJhbWVzIHNvIHRoYXQgdGhleSBjYW4gYmUgYmxlbmRlZCB3aXRoIHZpZGVvbWl4ZXIgbGF0ZXIKKwkgIG9uLiBVc2VzIGFsbCBuaWNldGllcyBzdWNoIGFzIHVzaW5nIGJhc2UgdHJhbnNmb3JtIGZvciBlZmZpY2llbnQgYWxsb2MKKwkgIGFuZCBuZWdvdGlhdGlvbi4gSXQgY3VycmVudGx5IHJlcXVpcmVzIEdzdENvbnRyb2xsZXIgdG8gY29udHJvbCB0aGUKKwkgIHBvc2l0aW9uIGluIHRoZSB0cmFuc2l0aW9uIGVmZmVjdC4KKworMjAwOC0wNS0xOSAyMTowNTowMyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBUcnkgdXNpbmcgdGhheXRhbnMgbmV3IG1lY2hhbmlzbSB0byBnZXQgZXh0cmEgY2xhc3NlcyBpbnRvIHBsdWdpbiBkb2NzLiBBcGFyZW50bHkgd29ya3MgZm9yIHRoZSBFcS4gRm9yIFZpZGVvTWl4ZXIgdGguLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy50eXBlczoKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgVHJ5IHVzaW5nIHRoYXl0YW5zIG5ldyBtZWNoYW5pc20gdG8gZ2V0IGV4dHJhIGNsYXNzZXMgaW50byBwbHVnaW4KKwkgIGRvY3MuIEFwYXJlbnRseSB3b3JrcyBmb3IgdGhlIEVxLiBGb3IgVmlkZW9NaXhlciB0aGUgR09iamVjdCBzdHVmZiBpcworCSAgbWlzc2luZyBzdGlsbC4KKworMjAwOC0wNS0xOSAxMjozMjowNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGVhdmUuYzogU2V0IGtlZXAtcG9zaXRpb25zIHByb3BlcnR5IHRvIFRSVUUgZm9yIHRoZSA4IGNoYW5uZWwgdGVzdCB0byBlbnN1cmUgdGhhdCB0aGUgb3IuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGVhdmUuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIFNldCBrZWVwLXBvc2l0aW9ucyBwcm9wZXJ0eSB0byBUUlVFIGZvciB0aGUgOCBjaGFubmVsIHRlc3QgdG8gZW5zdXJlCisJICB0aGF0IHRoZSBvcmlnaW5hbCBjaGFubmVsIHBvc2l0aW9uIGlzIHNldCBvbiB0aGUgb3V0cHV0LgorCisyMDA4LTA1LTE5IDA3OjQ2OjA1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS4qOiBBZGQgYSBwcm9wZXJ0eSB0byBzZWxlY3Qgd2hldGhlciBjaGFubmVsIHBvc2l0aW9ucyBzaG91bGQgYmUga2VwdCBvbiB0aGUgbW9ubyBvdXRwdXQgYi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOiAoZ3N0X2RlaW50ZXJsZWF2ZV9jbGFzc19pbml0KSwKKwkgIChnc3RfZGVpbnRlcmxlYXZlX2luaXQpLCAoZ3N0X2RlaW50ZXJsZWF2ZV9hZGRfbmV3X3BhZHMpLAorCSAgKGdzdF9kZWludGVybGVhdmVfc2V0X3BhZHNfY2FwcyksIChnc3RfZGVpbnRlcmxlYXZlX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2RlaW50ZXJsZWF2ZV9nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuaDoKKwkgIEFkZCBhIHByb3BlcnR5IHRvIHNlbGVjdCB3aGV0aGVyIGNoYW5uZWwgcG9zaXRpb25zIHNob3VsZCBiZSBrZXB0IG9uCisJICB0aGUgbW9ubyBvdXRwdXQgYnVmZmVycyBvciBzaG91bGQgYmUgZHJvcHBlZC4KKworMjAwOC0wNS0xOCAxOToyNzo1OSArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IFNldCBwcm9wZXIgcmF0ZSBpbiBhdmkgc3RyZWFtIGhlYWRlciBmb3IgUENNIGF1ZGlvLCBhbmQgYWxzbyBkbyBzb21lIG1vcmUgc2FuaXR5IGNoZWNrcyBvbiBjYXBzIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpX211eF9hdWRzaW5rX3NldF9jYXBzKToKKwkgIFNldCBwcm9wZXIgcmF0ZSBpbiBhdmkgc3RyZWFtIGhlYWRlciBmb3IgUENNIGF1ZGlvLCBhbmQgYWxzbyBkbyBzb21lCisJICBtb3JlIHNhbml0eSBjaGVja3Mgb24gY2FwcyBpbiB0aGlzIGNhc2UuICBGaXhlcyAjNTExNDg5LgorCisyMDA4LTA1LTE3IDE5OjM5OjUzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS4qOiBRdWV1ZSBldmVudHMgdW50aWwgc3JjIHBhZHMgd2VyZSBhZGRlZCBhbmQgdGhleSBjYW4gYmUgc2VudC4gT3RoZXJ3aXNlIGRvd25zdHJlYW0gd2lsbC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOiAoZ3N0X2RlaW50ZXJsZWF2ZV9maW5hbGl6ZSksCisJICAoZ3N0X2RlaW50ZXJsZWF2ZV9pbml0KSwgKGdzdF9kZWludGVybGVhdmVfc2lua19ldmVudCksCisJICAoZ3N0X2RlaW50ZXJsZWF2ZV9wcm9jZXNzKSwgKGdzdF9kZWludGVybGVhdmVfc2lua19hY3RpdmF0ZV9wdXNoKToKKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmg6CisJICBRdWV1ZSBldmVudHMgdW50aWwgc3JjIHBhZHMgd2VyZSBhZGRlZCBhbmQgdGhleSBjYW4gYmUgc2VudC4gT3RoZXJ3aXNlCisJICBkb3duc3RyZWFtIHdpbGwgbmV2ZXIgZ2V0IHRoZSBmaXJzdCBuZXdzZWdtZW50IGV2ZW50LgorCisyMDA4LTA1LTE3IDE0OjA1OjAzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOiBBbHdheXMgc2V0IHRoZSBjaGFubmVsIHBvc2l0aW9ucyB3aGVuIGdzdF9hdWRpb19nZXRfY2hhbm5lbF9wb3NpdGlvbnMoKSByZXR1cm5zIHNvbWV0aC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOiAoZ3N0X2RlaW50ZXJsZWF2ZV9zaW5rX3NldGNhcHMpLAorCSAgKGdzdF9kZWludGVybGVhdmVfZ2V0Y2Fwcyk6CisJICBBbHdheXMgc2V0IHRoZSBjaGFubmVsIHBvc2l0aW9ucyB3aGVuIGdzdF9hdWRpb19nZXRfY2hhbm5lbF9wb3NpdGlvbnMoKQorCSAgcmV0dXJucyBzb21ldGhpbmcsIGV2ZW4gaWYgdGhleSdyZSBub3Qgc2V0IGluIHRoZSBjYXBzLiBUaGlzIG1ha2VzCisJICBzdXJlIHRoYXQgdGhlIG91dHB1dCBjaGFubmVscyBjYW4gYmUgaW50ZXJsZWF2ZWQgYWdhaW4gY29ycmVjdGx5CisJICBpbiB0aGUgbW9uby9zdGVyZW8gY2FzZXMgdG9vLgorCSAgRG9uJ3QgYXNrIGZvciB0aGUgcGVlcmNhcHMgb2YgdGhlIGN1cnJlbnQgcGFkIGluIGdldGNhcHMoKSBhcyB0aGlzCisJICBtaWdodCBjYWxsIGdldGNhcHMoKSBhZ2FpbiBhbmQgZGVhZGxvY2suCisKKzIwMDgtMDUtMTcgMTA6Mzg6MTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiBEb24ndCBpbmNsdWRlIHRoZSBnc3R2NGwyeG92ZXJsYXkuaCBoZWFkZXIgYXMgdGhlIFhPdmVybGF5IHN1cHBvcnQgaXNuJ3QgaW1wbGVtZW50ZWQgYXQgYWxsIHllLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgRG9uJ3QgaW5jbHVkZSB0aGUgZ3N0djRsMnhvdmVybGF5LmggaGVhZGVyIGFzIHRoZSBYT3ZlcmxheSBzdXBwb3J0CisJICBpc24ndCBpbXBsZW1lbnRlZCBhdCBhbGwgeWV0IGFuZCB0aGlzIHJlcXVpcmVzIFggaGVhZGVycyB0byBiZQorCSAgaW5zdGFsbGVkLiBGaXhlcyBidWcgIzUzMzI2NC4KKworMjAwOC0wNS0xNiAyMTo1NjoyNCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvaW50ZXJsZWF2ZS86IEFkZCBzdXBwb3J0IGZvciBhbGwgcmF3IGF1ZGlvIGZvcm1hdHMgYW5kIHByb3ZpZGUgYmV0dGVyIG5lZ290aWF0aW9uIGlmIHRoZSBjYXBzIGFyZSBjaGFuZ2luZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6IChkZWludGVybGVhdmVfMjQpLAorCSAgKGdzdF9kZWludGVybGVhdmVfZmluYWxpemUpLCAoZ3N0X2RlaW50ZXJsZWF2ZV9iYXNlX2luaXQpLAorCSAgKGdzdF9kZWludGVybGVhdmVfY2xhc3NfaW5pdCksIChnc3RfZGVpbnRlcmxlYXZlX2luaXQpLAorCSAgKGdzdF9kZWludGVybGVhdmVfYWRkX25ld19wYWRzKSwgKGdzdF9kZWludGVybGVhdmVfc2V0X3BhZHNfY2FwcyksCisJICAoZ3N0X2RlaW50ZXJsZWF2ZV9zZXRfcHJvY2Vzc19mdW5jdGlvbiksCisJICAoZ3N0X2RlaW50ZXJsZWF2ZV9zaW5rX3NldGNhcHMpLCAoX19yZW1vdmVfY2hhbm5lbHMpLAorCSAgKF9fc2V0X2NoYW5uZWxzKSwgKGdzdF9kZWludGVybGVhdmVfZ2V0Y2FwcyksCisJICAoZ3N0X2RlaW50ZXJsZWF2ZV9wcm9jZXNzKSwgKGdzdF9kZWludGVybGVhdmVfY2hhaW4pLAorCSAgKGdzdF9kZWludGVybGVhdmVfc2lua19hY3RpdmF0ZV9wdXNoKToKKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmg6CisJICBBZGQgc3VwcG9ydCBmb3IgYWxsIHJhdyBhdWRpbyBmb3JtYXRzIGFuZCBwcm92aWRlIGJldHRlciBuZWdvdGlhdGlvbgorCSAgaWYgdGhlIGNhcHMgYXJlIGNoYW5naW5nLgorCSAgRG9uJ3QgYWxsb3cgY2hhbmdlcyBvZiB0aGUgY2hhbm5lbCBwb3NpdGlvbnMgYW5kIHNldCB0aGUgcG9zaXRpb24gb2YKKwkgIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgb24gdGhlIHNyYyBwYWQgY2Fwcy4KKwkgIEdlbmVyYWwgY2xlYW51cCBhbmQgc21hbGxlciBidWdmaXhlcy4KKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvZGVpbnRlcmxlYXZlLmM6IChmbG9hdF9idWZmZXJfY2hlY2tfcHJvYmUpOgorCSAgQ2hlY2sgdGhlIGNoYW5uZWwgcG9zaXRpb25zIG9uIHRoZSBvdXRwdXQgYnVmZmVyIGNhcHMuCisKKzIwMDgtMDUtMTYgMTc6NTA6MjAgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBGaXggc29tZSBjb21waWxlciB3YXJuaW5ncy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrc3RyZWFtcmVhZGVyLmM6CisJICAqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tYXVkaW90ZXN0LmM6CisJICAqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tb3Nzc3JjLmM6CisJICBGaXggc29tZSBjb21waWxlciB3YXJuaW5ncy4KKworMjAwOC0wNS0xNCAxODoyODo0NiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzogU21hbGwgY29tbWVudCBhZGRlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOiAoZ3N0X3J0cF9oMjY0X2RlcGF5X3Byb2Nlc3MpOgorCSAgU21hbGwgY29tbWVudCBhZGRlZC4KKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6IChnc3RfcnRwX2gyNjRfcGF5X2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfaDI2NF9wYXlfZGVjb2RlX25hbCksIChnc3RfcnRwX2gyNjRfcGF5X3BhcnNlX3Nwc19wcHMpLAorCSAgKGdzdF9ydHBfaDI2NF9wYXlfcGF5bG9hZF9uYWwpLCAoZ3N0X3J0cF9oMjY0X3BheV9oYW5kbGVfYnVmZmVyKToKKwkgIERlYnVnIHN0cmluZyBjbGVhbnVwcyAocmVtb3ZlIHRyYWlsaW5nIFxuKQorCSAgUmVmYWN0b3IgYW5kIGNsZWFuIHVwIHRoZSBwYXlsb2FkZXIgYSBiaXQgYW5kIG1ha2Ugc3VyZSB0aGF0IHdlIG9ubHkKKwkgIHB1dCBvbmUgTkFMIHVuaXQgaW4gYW4gUlRQIHBhY2tldCBldmVuIGlmIHRoZSBpbnB1dCBidWZmZXIgY29udGFpbnMKKwkgIG11bHRpcGxlIE5BTCB1bml0cy4KKwkgIEFkZCBzdXBvcnQgZm9yIEFWQyBmb3JtYXQgaW5wdXQuCisKKzIwMDgtMDUtMTQgMTc6NTg6NTAgKzAwMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuKjogTWFrZSBpdCBwb3NzaWJsZSB0byBzcGVjaWZ5IHByb2ZpbGUtbGV2ZWwtaWQgYW5kIHNwcm9wLXBhcmFtZXRlci1zZXRzIHVzaW5nIHByb3BlcnRpZXMgaW4gY2EuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzogKGdzdF9ydHBfaDI2NF9wYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9oMjY0X3BheV9maW5hbGl6ZSksIChnc3RfcnRwX2gyNjRfcGF5X2hhbmRsZV9idWZmZXIpLAorCSAgKGdzdF9ydHBfaDI2NF9wYXlfc2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBfaDI2NF9wYXlfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJICBNYWtlIGl0IHBvc3NpYmxlIHRvIHNwZWNpZnkgcHJvZmlsZS1sZXZlbC1pZCBhbmQgc3Byb3AtcGFyYW1ldGVyLXNldHMKKwkgIHVzaW5nIHByb3BlcnRpZXMgaW4gY2FzZSB0aGV5IGFyZSBub3QgYXZhaWxhYmxlIGluLXN0cmVhbS4KKworMjAwOC0wNS0xNCAxNDoxOTo0NyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06IEFkZCBkZWludGVybGVhdmUgdW5pdCB0ZXN0IHRvIFZBTEdSSU5EX1RPX0ZJWCwgc2luY2UgaXQgY2F1c2VzIHdlaXJkIGludmFsaWQgZnJlZSBlcnJvcnMgaW4gLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBBZGQgZGVpbnRlcmxlYXZlIHVuaXQgdGVzdCB0byBWQUxHUklORF9UT19GSVgsIHNpbmNlIGl0IGNhdXNlcworCSAgd2VpcmQgaW52YWxpZCBmcmVlIGVycm9ycyBpbiB2YWxncmluZC9saWJjIGFmdGVyIF9leGl0IGZvciBzb21lCisJICByZWFzb24uCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOiAocGFkc19jcmVhdGVkKSwKKwkgIChzZXRfY2hhbm5lbF9wb3NpdGlvbnMpLCAoc3JjX2hhbmRvZmZfZmxvYXQzMl84Y2gpLAorCSAgKGZsb2F0X2J1ZmZlcl9jaGVja19wcm9iZSksCisJICAocGFkX2FkZGVkX3NldHVwX2RhdGFfY2hlY2tfZmxvYXQzMl84Y2hfY2IpLAorCSAgKG1ha2VfZmFrZV9zcmNfOGNoYW5zX2Zsb2F0MzIpLCAoR1NUX1NUQVJUX1RFU1QpLAorCSAgKGRlaW50ZXJsZWF2ZV9zdWl0ZSk6CisJICBBZGQgc29tZSBtb3JlIGRlaW50ZXJsZWF2ZSB1bml0IHRlc3QgYml0cyBJIGhhZCBsb2NhbGx5LgorCisyMDA4LTA1LTE0IDEyOjUyOjE1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGRvY3MvcGx1Z2lucy86IFJlbW92ZSBsYWRzcGEgZnJvIHBsdWdpbi1kb2NzLCBpdHMgaW4gZ3N0LXBsdWdpbnMtYmFkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sYWRzcGEueG1sOgorCSAgUmVtb3ZlIGxhZHNwYSBmcm8gcGx1Z2luLWRvY3MsIGl0cyBpbiBnc3QtcGx1Z2lucy1iYWQuCisKKzIwMDgtMDUtMTQgMDc6MzI6NDQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ludGVybGVhdmUvOiBTcGxpdCBkZWZpbml0aW9ucyBpbnRvIHNlcGFyYXRlIGhlYWRlciBmaWxlcyBmb3IgYmV0dGVyIGRvY3VtZW50YXRpb24gZ2VuZXJhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmg6CisJICAqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuaDoKKwkgICogZ3N0L2ludGVybGVhdmUvcGx1Z2luLmg6CisJICBTcGxpdCBkZWZpbml0aW9ucyBpbnRvIHNlcGFyYXRlIGhlYWRlciBmaWxlcyBmb3IgYmV0dGVyIGRvY3VtZW50YXRpb24KKwkgIGdlbmVyYXRpb24uCisJICAqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOiAoZ3N0X2RlaW50ZXJsZWF2ZV9iYXNlX2luaXQpLAorCSAgKGdzdF9kZWludGVybGVhdmVfY2xhc3NfaW5pdCksIChnc3RfZGVpbnRlcmxlYXZlX3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X2RlaW50ZXJsZWF2ZV9wcm9jZXNzKToKKwkgIERvbid0IHVzZSBhbGxvY2EsIGFsbG93IGNhcHMgY2hhbmdlcyBhcyBsb25nIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKwkgIGRvZXMgbm90IGNoYW5nZSwgZG9uJ3QgdXNlIGdfd2FybmluZywgcmV0dXJuIE5PVF9ORUdPVElBVEVEIGFzIGVhcmx5CisJICBhcyBwb3NzaWJsZSBhbmQgc29tZSBvdGhlciBjbGVhbnVwLgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6IChnc3RfaW50ZXJsZWF2ZV9iYXNlX2luaXQpLAorCSAgKGdzdF9pbnRlcmxlYXZlX2NsYXNzX2luaXQpOgorCSAgRG8gc29tZSByYW5kb20gY2xlYW51cC4KKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOiAoR1NUX1NUQVJUX1RFU1QpLAorCSAgKGRlaW50ZXJsZWF2ZV9jaGFpbl9mdW5jKSwgKGRlaW50ZXJsZWF2ZV9wYWRfYWRkZWQpLAorCSAgKGRlaW50ZXJsZWF2ZV9zdWl0ZSk6CisJICBBZGQgdW5pdCB0ZXN0cyBmb3IgdGhlIGRlaW50ZXJsZWF2ZSBlbGVtZW50LgorCisyMDA4LTA1LTEzIDIwOjI1OjIwICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L2F2aS9nc3RhdmltdXguYzogU2VuZCBhbiBpbml0aWFsIEJZVEUgc2VnbWVudCB0byBpbmZvcm0gZG93bnN0cmVhbSBvZiBsYXRlciBzZWVraW5nLCBhbmQgdG8gZm9yZWdvIHN5bmMgYXR0ZW1wdHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzogKGdzdF9hdmlfbXV4X3N0YXJ0X2ZpbGUpOgorCSAgU2VuZCBhbiBpbml0aWFsIEJZVEUgc2VnbWVudCB0byBpbmZvcm0gZG93bnN0cmVhbSBvZiBsYXRlciBzZWVraW5nLAorCSAgYW5kIHRvIGZvcmVnbyBzeW5jIGF0dGVtcHRzLgorCisyMDA4LTA1LTEzIDA4OjU5OjQxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jOiBGaXggd3JvbmcgY2FwcyBzdHJpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuYzogKGdzdF9ydHBfZzcyOV9kZXBheV9zZXRjYXBzKToKKwkgIEZpeCB3cm9uZyBjYXBzIHN0cmluZy4KKworMjAwOC0wNS0xMyAwODozNTo1NSArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cC86IEFkZGVkIEc3MjkgcGF5IGFuZCBkZXBheWxvYWRlcnMuIEZpeGVzICM1MzI0MDkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5OiBPbGl2aWVyIENyZXRlIDx0ZXN0ZXIgYXQgdGVzdGVyIGRvdCBjYT4KKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuYzogKGdzdF9ydHBfZzcyOV9kZXBheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfZzcyOV9kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfZzcyOV9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX2c3MjlfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX2c3MjlfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF9nNzI5X2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6IChnc3RfcnRwZzcyOXBheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBnNzI5cGF5X2NsYXNzX2luaXQpLCAoZ3N0X3J0cGc3MjlwYXlfaW5pdCksCisJICAoZ3N0X3J0cGc3MjlwYXlfc2V0Y2FwcyksIChnc3RfcnRwX2c3MjlfcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI5cGF5Lmg6CisJICBBZGRlZCBHNzI5IHBheSBhbmQgZGVwYXlsb2FkZXJzLiBGaXhlcyAjNTMyNDA5LgorCisyMDA4LTA1LTEzIDA4OjIxOjI2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzogRml4IHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgZHVyYXRpb24gb2YgdGhlIGNvbmNlYWxtZW50IHBhY2tldHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IChzcGVleF9kZWNfc2lua19ldmVudCk6CisJICBGaXggdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29uY2VhbG1lbnQgcGFja2V0cy4KKworMjAwOC0wNS0xMiAxODoyNzoyNCArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cC86IEFkZCBEViBwYXkgYW5kIGRlcGF5bG9hZGVycy4gRml4ZXMgIzUzMjQyMy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IE9saXZpZXIgQ3JldGUgPHRlc3RlciBhdCB0ZXN0ZXIgZG90IGNhPgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwL2dzdHJ0cC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGR2ZGVwYXkuYzogKGdzdF9ydHBfZHZfZGVwYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX2R2X2RlcGF5X2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9kdl9kZXBheV9pbml0KSwKKwkgIChwYXJzZV9lbmNvZGUpLCAoZ3N0X3J0cF9kdl9kZXBheV9zZXRjYXBzKSwKKwkgIChjYWxjdWxhdGVfZGlmYmxvY2tfbG9jYXRpb24pLCAoZ3N0X3J0cF9kdl9kZXBheV9wcm9jZXNzKSwKKwkgIChnc3RfcnRwX2R2X2RlcGF5X3Jlc2V0KSwgKGdzdF9ydHBfZHZfZGVwYXlfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcnRwX2R2X2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBkdmRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwZHZwYXkuYzogKGdzdF9kdl9wYXlfbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X3J0cF9kdl9wYXlfYmFzZV9pbml0KSwgKGdzdF9ydHBfZHZfcGF5X2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfZHZfcGF5X2luaXQpLCAoZ3N0X2R2X3BheV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9kdl9wYXlfZ2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBfZHZfcGF5X3NldGNhcHMpLAorCSAgKGdzdF9kdl9wYXlfbmVnb3RpYXRlKSwgKGluY2x1ZGVfZGlmKSwKKwkgIChnc3RfcnRwX2R2X3BheV9oYW5kbGVfYnVmZmVyKSwgKGdzdF9ydHBfZHZfcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBkdnBheS5oOgorCSAgQWRkIERWIHBheSBhbmQgZGVwYXlsb2FkZXJzLiBGaXhlcyAjNTMyNDIzLgorCisyMDA4LTA1LTEyIDE2OjM1OjM5ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IENvbnZlcnQgc3VidGl0bGUgcGFsZXR0ZSBpbmZvIGluIFZvYlN1YiBwcml2YXRlIGRhdGEgZnJvbSBWb2JTdWIncyAoYnVnZ3kpIFJHQiB0byBZVVYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3B1c2hfZHZkX2NsdXRfY2hhbmdlX2V2ZW50KToKKwkgIENvbnZlcnQgc3VidGl0bGUgcGFsZXR0ZSBpbmZvIGluIFZvYlN1YiBwcml2YXRlIGRhdGEgZnJvbSBWb2JTdWIncworCSAgKGJ1Z2d5KSBSR0IgdG8gWVVWLgorCisyMDA4LTA1LTEyIDE1OjI2OjAxICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L2F2aS9nc3RhdmltdXguYzogRG8gbm90IGxlYXZlIGZvdXJjYyBzdHJlYW0gaGVhZGVyIGZpZWxkIGVtcHR5IHVwb24gcmVzZXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzogKGdzdF9hdmlfbXV4X3BhZF9yZXNldCk6CisJICBEbyBub3QgbGVhdmUgZm91cmNjIHN0cmVhbSBoZWFkZXIgZmllbGQgZW1wdHkgdXBvbiByZXNldC4KKwkgIEZpeGVzICM1MTkzMDEuCisKKzIwMDgtMDUtMTEgMTQ6NDM6MjYgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBBZGQgZ29vbTJrMSBpbnRvIHRoZSBkb2NzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJICAqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkgICogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSAgQWRkIGdvb20yazEgaW50byB0aGUgZG9jcy4KKworMjAwOC0wNS0wOCAxNjo1ODowMiArMDAwMCAgV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBTdXBwb3J0IERpZ2VzdCBhdXRoZW50aWNhdGlvbi4gRml4ZXMgIzUzMjA2NS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IFdvdXRlciBDbG9ldGVucyAgPHdvdXRlciBhdCBtaW5kIGJlPgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19pbml0KSwKKwkgIChnc3RfcnRzcHNyY19za2lwX2x3cyksIChnc3RfcnRzcHNyY191bnNraXBfbHdzKSwKKwkgIChnc3RfcnRzcHNyY19za2lwX2NvbW1hcyksIChnc3RfcnRzcHNyY19za2lwX2l0ZW0pLAorCSAgKGdzdF9ydHNwX2RlY29kZV9xdW90ZWRfc3RyaW5nKSwKKwkgIChnc3RfcnRzcHNyY19wYXJzZV9kaWdlc3RfY2hhbGxlbmdlKSwgKGdzdF9ydHNwc3JjX3BhcnNlX2F1dGhfaGRyKSwKKwkgIChnc3RfcnRzcHNyY19zZXR1cF9hdXRoKToKKwkgIFN1cHBvcnQgRGlnZXN0IGF1dGhlbnRpY2F0aW9uLiBGaXhlcyAjNTMyMDY1LgorCisyMDA4LTA1LTA4IDEwOjIwOjUyICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiBBbHNvIHN1cHBvcnQgMzJiaXQgKGUuZy4gd2hlIGhhdmluZyBpdCBhZnRlciAnbWFkJykuIEFkZCBtb3JlIG5vdGVzIGFib3V0IHdoYXRzIG5lZWRlZCBmb3IgbGliby4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgQWxzbyBzdXBwb3J0IDMyYml0IChlLmcuIHdoZSBoYXZpbmcgaXQgYWZ0ZXIgJ21hZCcpLiBBZGQgbW9yZSBub3RlcworCSAgYWJvdXQgd2hhdHMgbmVlZGVkIGZvciBsaWJvaWwgYWNjZWxlcmF0aW9uLiBTaW1wbGlmeSBkb2NzIGEgYml0LgorCisyMDA4LTA1LTA4IDA4OjE1OjM0ICswMDAwICBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogVXBkYXRlIHRoZSB0cmFjayBkdXJhdGlvbiBpZiB0aGUgb2xkIG9uZSB3YXMgaW52YWxpZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFNqb2VyZCBTaW1vbnMgPHNqb2VyZCBhdCBsdW9uIGRvdCBuZXQ+CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfY29sbGVjdGVkKToKKwkgIFVwZGF0ZSB0aGUgdHJhY2sgZHVyYXRpb24gaWYgdGhlIG9sZCBvbmUgd2FzIGludmFsaWQuCisJICBGaXhlcyBidWcgIzUzMjExNy4KKworMjAwOC0wNS0wNyAxNjozNjowNCArMDAwMCAgT2xlIEFuZHLDqSBWYWRsYSBSYXZuw6VzIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmMgKGdzdF9ydHBfaDI2NF9wYXlfcGFyc2Vfc3BzX3Bwcyk6IFVzZSBHU1RfU1RSX05VTEwgd2hlbiB0cnlpbmcgdG8gcHJpbnQgc3BzIGFuZCBwcHMgc3RyaW5ncyB0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmMgKGdzdF9ydHBfaDI2NF9wYXlfcGFyc2Vfc3BzX3Bwcyk6CisJICBVc2UgR1NUX1NUUl9OVUxMIHdoZW4gdHJ5aW5nIHRvIHByaW50IHNwcyBhbmQgcHBzIHN0cmluZ3MgdGhhdCBjb3VsZAorCSAgYmUgTlVMTCwgYXMgdGhpcyBtaWdodCBjcmFzaCBvbiBzb21lIHBsYXRmb3Jtcy4KKworMjAwOC0wNS0wNyAxNTozMzo1MiArMDAwMCAgSGFha29uIFNwb3JzaGVpbSA8aGFha29uLnNwb3JzaGVpbUB0YW5kYmVyZy5jb20+CisKKwkgIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmMgKGdzdF9kaXJlY3RkcmF3X3Npbmtfc2V0dXBfZGRyYXcpOiBEbyBJRGlyZWN0RHJhd0NsaXBwZXJfU2V0SFduZCgpIGlmIHRoZSB3aW5kb3cgSS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBwYXRjaCBieTogSGFha29uIFNwb3JzaGVpbSA8aGFha29uLnNwb3JzaGVpbSBhdCB0YW5kYmVyZyBjb20+CisJICAqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmMgKGdzdF9kaXJlY3RkcmF3X3Npbmtfc2V0dXBfZGRyYXcpOgorCSAgRG8gSURpcmVjdERyYXdDbGlwcGVyX1NldEhXbmQoKSBpZiB0aGUgd2luZG93IElEIGhhcyBhbHJlYWR5IGJlZW4KKwkgIHNldCBhZnRlciBjcmVhdGluZyB0aGUgY2xpcHBlci4KKworMjAwOC0wNS0wNyAxNToyODowNiArMDAwMCAgSGFha29uIFNwb3JzaGVpbSA8aGFha29uLnNwb3JzaGVpbUB0YW5kYmVyZy5jb20+CisKKwkgIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmMgKGdzdF9kaXJlY3RkcmF3X3Npbmtfc2hvd19mcmFtZSk6IEFkZGVkIGNoZWNraW5nIG9mIHN1cmZhY2UgbG9zdCBjYXNlIGFmdGVyIGFuIHVucy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBwYXRjaCBieTogSGFha29uIFNwb3JzaGVpbSA8aGFha29uLnNwb3JzaGVpbSBhdCB0YW5kYmVyZyBjb20+CisJICAqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmMgKGdzdF9kaXJlY3RkcmF3X3Npbmtfc2hvd19mcmFtZSk6CisJICBBZGRlZCBjaGVja2luZyBvZiBzdXJmYWNlIGxvc3QgY2FzZSBhZnRlciBhbiB1bnN1Y2Nlc3NmdWwKKwkgIElEaXJlY3REcmF3U3VyZmFjZTdfTG9jaygpIGNhbGwuCisJICBJZiBzdXJmYWNlIGlzIGxvc3QsIHJldHVybiBHU1RfRkxPV19PSy4KKworMjAwOC0wNS0wNyAxNToxOTo0NyArMDAwMCAgSGFha29uIFNwb3JzaGVpbSA8aGFha29uLnNwb3JzaGVpbUB0YW5kYmVyZy5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6CisJICBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jIChnc3RfZGlyZWN0ZHJhd19zaW5rX3Nob3dfZnJhbWUsCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHBhdGNoIGJ5OiBIYWFrb24gU3BvcnNoZWltIDxoYWFrb24uc3BvcnNoZWltIGF0IHRhbmRiZXJnIGNvbT4KKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYyAoZ3N0X2RpcmVjdGRyYXdfc2lua19zaG93X2ZyYW1lLAorCSAgV25kUHJvYywgZ3N0X2RpcmVjdGRyYXdfc2lua193aW5kb3dfdGhyZWFkKToKKwkgIEltcHJvdmVkIFdpbmRvd3MgbWVzc2FnZSBsb29wIGFuZCBmaXhlZCB3aW5kb3cgZGVzdHJ1Y3Rpb24gaXNzdWUuCisJICBXaGVuIHRoZSB3aW5kb3cgd2hpY2ggRGlyZWN0RHJhdyBpcyByZW5kZXJpbmcgdG8gaXMgZGVzdHJveWVkLCB0aGUKKwkgIHJlbmRlci9zaG93X2ZyYW1lIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIEdTVF9GTE9XX0VSUk9SLgorCSAgUGFydGlhbGx5IGZpeGVzICM1MjA4ODUuCisKKzIwMDgtMDUtMDcgMTU6MDk6MTAgKzAwMDAgIEhhYWtvbiBTcG9yc2hlaW0gPGhhYWtvbi5zcG9yc2hlaW1AdGFuZGJlcmcuY29tPgorCisJICBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jIChnc3RfZGlyZWN0ZHJhd19zaW5rX3NldF9jYXBzKTogRml4ZWQgbWlkIHN0cmVhbSByZXNvbHV0aW9uIGNoYW5nZSBidWcsIHRoZSBvZmZzY3IuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcGF0Y2ggYnk6IEhhYWtvbiBTcG9yc2hlaW0gPGhhYWtvbi5zcG9yc2hlaW0gYXQgdGFuZGJlcmcgY29tPgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jIChnc3RfZGlyZWN0ZHJhd19zaW5rX3NldF9jYXBzKToKKwkgIEZpeGVkIG1pZCBzdHJlYW0gcmVzb2x1dGlvbiBjaGFuZ2UgYnVnLCB0aGUgb2Zmc2NyZWVuIHN1cmZhY2UgaXMgbm93CisJICByZWxlYXNlZCB3aGVuIHNldF9jYXBzIGlzIGNhbGxlZC4KKwkgIFBhcnRpYWxseSBmaXhlcyAjNTIwODg1LgorCisyMDA4LTA1LTA3IDE0OjU2OjIyICswMDAwICBPbGUgQW5kcsOpIFZhZGxhIFJhdm7DpXMgPG9sZS5hbmRyZS5yYXZuYXNAdGFuZGJlcmcuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jOgorCSAgc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmMKKwkgIChnc3RfZGlyZWN0ZHJhd19zaW5rX2J1ZmZlcl9hbGxvYyk6CisJICBNYWtlIGl0IHNvIHRoYXQgZ3N0X2RpcmVjdGRyYXdfc2lua19idWZmZXJfYWxsb2MgdXNlcyB0aGUgcmlnaHQKKwkgIHdpZHRoL2hlaWdodC4KKwkgIEVzcGVjaWFsbHkgd2hlbiBsb29raW5nIHRocm91Z2ggdGhlIHBvb2wgb2YgYnVmZmVycywgbWFrZSBzdXJlIHRoYXQKKwkgIHRoZSB3aWR0aC9oZWlnaHQgb2YgY2FwcyBpcyB1c2VkIGluc3RlYWQgb2YgdGhlIGFscmVhZHkgbmVnb3RpYXRlZAorCSAgZGltZW5zaW9ucy4KKwkgIEZvciBleGFtcGxlIGlmIGEgYnVmZmVyIHdpdGggZGlmZmVyZW50IGNhcHMgaXMgcmVxdWVzdGVkLCBpLmUuCisJICBoaWdoZXIgcmVzb2x1dGlvbiwgdGhlIGNhbGxlciB3b3VsZCBnZXQgYSBidWZmZXIgd2l0aCB0aGUgb2xkCisJICBkaW1lbnNpb25zIGFuZCB0aHVzIGNvcnJ1cHQgdGhlIGhlYXAuCisKKzIwMDgtMDUtMDcgMTQ6NDM6MzkgKzAwMDAgIE9sZSBBbmRyw6kgVmFkbGEgUmF2bsOlcyA8b2xlLmFuZHJlLnJhdm5hc0B0YW5kYmVyZy5jb20+CisKKwkqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6CisJICBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYworCSAgKGdzdF9kaXJlY3RkcmF3X3NpbmtfYnVmZmVyX2FsbG9jKToKKwkgIENsZWFyIHRoZSBmbGFncyBvbiByZWN5Y2xlZCBidWZmZXJzIGZyb20gYnVmZmVyX2FsbG9jLgorCSAgUGFydGlhbGx5IGZpeGVzICM1MjA4ODUuCisJICBUaGUgcmlnaHQgZml4IHRoaXMgdGltZS4KKworMjAwOC0wNS0wNyAxNDozOTo0NSArMDAwMCAgT2xlIEFuZHLDqSBWYWRsYSBSYXZuw6VzIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KKworCSogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkgIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jCisJICAoZ3N0X2RpcmVjdGRyYXdfc2lua19idWZmZXJfYWxsb2MpOgorCSAgUmV2ZXJ0aW5nIHByZXZpb3VzIGNvbW1pdCwgaXQgaGFkIGl0IGFsbCBtaXhlZCB1cCwgd2FzIGZvciBhIGRpZmZlcmVudAorCSAgcGF0Y2ggKG1ham9yIGF1dG9tYXRpb24gc2NyZXctdXApLiBTb3JyeSEKKworMjAwOC0wNS0wNyAxMzo0ODoyOCArMDAwMCAgT2xlIEFuZHLDqSBWYWRsYSBSYXZuw6VzIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkgIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jCisJICAoZ3N0X2RpcmVjdGRyYXdfc2lua19idWZmZXJfYWxsb2MpOgorCSAgQ2xlYXIgdGhlIGZsYWdzIG9uIHJlY3ljbGVkIGJ1ZmZlcnMgZnJvbSBidWZmZXJfYWxsb2MuCisJICBQYXJ0aWFsbHkgZml4ZXMgIzUyMDg4NS4KKworMjAwOC0wNS0wNyAxMToyMjo1MSArMDAwMCAgT2xlIEFuZHLDqSBWYWRsYSBSYXZuw6VzIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6IEFkZGVkIG1pc3Npbmcgc3RkbGliLmggaW5jbHVkZSBmb3Igc3RydG9sKCksIGFuZCBtYWRlIGluY2x1ZGUgb3JkZXJpbmcgYW5kIHN0eWxlIGNvbnNpc3RlbnQgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJICBBZGRlZCBtaXNzaW5nIHN0ZGxpYi5oIGluY2x1ZGUgZm9yIHN0cnRvbCgpLCBhbmQgbWFkZSBpbmNsdWRlIG9yZGVyaW5nIGFuZAorCSAgc3R5bGUgY29uc2lzdGVudCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGRlcGF5bG9hZGVyLgorCisyMDA4LTA1LTA3IDA5OjUyOjM0ICswMDAwICBPbGUgQW5kcsOpIFZhZGxhIFJhdm7DpXMgPG9sZS5hbmRyZS5yYXZuYXNAdGFuZGJlcmcuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYzogQWRkZWQgbWlzc2luZyBzdGRsaWIuaCBpbmNsdWRlIGZvciBzdHJ0b2woKSwgYW5kIG1hZGUgaW5jbHVkZSBvcmRlcmluZyBhbmQgc3R5bGUgY29uc2lzdGVudCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYzoKKwkgIEFkZGVkIG1pc3Npbmcgc3RkbGliLmggaW5jbHVkZSBmb3Igc3RydG9sKCksIGFuZCBtYWRlIGluY2x1ZGUgb3JkZXJpbmcgYW5kCisJICBzdHlsZSBjb25zaXN0ZW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZGVwYXlsb2FkZXIuCisKKzIwMDgtMDUtMDcgMDg6MDM6NTEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogRXJyb3Igb3V0IGlmIHdlIGRvbid0IGhhdmUgdGhlIHJlcXVpcmVkIGNvcmUvYmFzZSB2ZXJzaW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBFcnJvciBvdXQgaWYgd2UgZG9uJ3QgaGF2ZSB0aGUgcmVxdWlyZWQgY29yZS9iYXNlIHZlcnNpb25zLgorCisyMDA4LTA1LTA2IDA5OjMzOjQ2ICswMDAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJICBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cubTogRml4IGNvbXBpbGVyIHdhcm5pbmdzIG9uIFBQQzY0LiBGaXhlcyBidWcgIzQ5OTMxOC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpciBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cubToKKwkgIEZpeCBjb21waWxlciB3YXJuaW5ncyBvbiBQUEM2NC4gRml4ZXMgYnVnICM0OTkzMTguCisKKzIwMDgtMDUtMDUgMTE6MTk6MTMgKzAwMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBEb24ndCBsZWFrIGZpbGUgZGVzY3JpcHRvcnMgb24gZXJyb3IuIEZpeGVzICM1MzE1MzIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTam9lcmQgU2ltb25zIDxzam9lcmQgYXQgbHVvbiBkb3QgbmV0PgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19pbml0KSwgKGdzdF9ydHNwc3JjX29wZW4pOgorCSAgRG9uJ3QgbGVhayBmaWxlIGRlc2NyaXB0b3JzIG9uIGVycm9yLiBGaXhlcyAjNTMxNTMyLgorCisyMDA4LTA1LTAzIDA5OjE4OjIyICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC9nY29uZi86IFdoZW4gd2UgY2FuJ3QgY3JlYXRlIGEgZmFrZXNpbmsvZmFrZXNyYyBjb21wbGFpbiBpbnN0ZWFkIG9mIHVucmVmZmluZworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc3JjLmM6IChnc3RfZ2NvbmZfYXVkaW9fc3JjX3Jlc2V0KSwKKwkgIChnc3RfZ2NvbmZfYXVkaW9fc3JjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc2luay5jOiAoZ3N0X2djb25mX3ZpZGVvX3NpbmtfcmVzZXQpLAorCSAgKGdzdF9nY29uZl92aWRlb19zaW5rX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc3JjLmM6IChnc3RfZ2NvbmZfdmlkZW9fc3JjX3Jlc2V0KSwKKwkgIChnc3RfZ2NvbmZfdmlkZW9fc3JjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9nY29uZi9nc3Rzd2l0Y2hzaW5rLmM6IChnc3Rfc3dpdGNoX3NpbmtfcmVzZXQpLAorCSAgKGdzdF9zd2l0Y2hfY29tbWl0X25ld19raWQpLCAoZ3N0X3N3aXRjaF9zaW5rX2NoYW5nZV9zdGF0ZSk6CisJICBXaGVuIHdlIGNhbid0IGNyZWF0ZSBhIGZha2VzaW5rL2Zha2VzcmMgY29tcGxhaW4gaW5zdGVhZCBvZiB1bnJlZmZpbmcKKwkgIE5VTEwgcG9pbnRlcnMgYW5kIGNyYXNoaW5nIGxhdGVyLiBTZWUgYnVnICM1MzA1MzUuCisKKzIwMDgtMDUtMDIgMTI6NDQ6MTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOiBBZGQgc29tZSBtb3JlIGRlYnVnIGluZm8gYW5kIGd1YXJkIGFnYWluc3Qgc21hbGwgcGF5bG9hZHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6IChnc3RfcnRwX2gyNjNwX2RlcGF5X3Byb2Nlc3MpOgorCSAgQWRkIHNvbWUgbW9yZSBkZWJ1ZyBpbmZvIGFuZCBndWFyZCBhZ2FpbnN0IHNtYWxsIHBheWxvYWRzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbXVkZXBheS5jOiAoZ3N0X3J0cF9wY211X2RlcGF5X3Byb2Nlc3MpOgorCSAgU2V0IGR1cmF0aW9uIG9uIG91dGdvaW5nIGJ1ZmZlcnMgYmVjYXVzZSB3ZSBjYW4uCisKKzIwMDgtMDUtMDIgMTI6Mzk6MDMgKzAwMDAgIE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkgIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiBBZGQgbmVnb3RpYXRpb24gZm9yIHRoZSBzcGVleCBjaGFubmVscyBhbmQgcmF0ZS4gRml4ZXMgIzQ2NTE0Ni4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9saXZpZXIgQ3JldGUgPHRlc3RlciBhdCB0ZXN0ZXIgZG90IGNhPgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleF9lbmNfc2lua19nZXRjYXBzKSwKKwkgIChnc3Rfc3BlZXhfZW5jX2luaXQpLCAoZ3N0X3NwZWV4X2VuY19jaGFpbik6CisJICBBZGQgbmVnb3RpYXRpb24gZm9yIHRoZSBzcGVleCBjaGFubmVscyBhbmQgcmF0ZS4gRml4ZXMgIzQ2NTE0Ni4KKworMjAwOC0wNS0wMiAxMjozNDoyMiArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOiBBZGQgbmVnb3RpYXRpb24gZm9yIHRoZSBzcGVlYyBjaGFubmVscyBhbmQgcmF0ZS4gU2VlICM0NjUxNDYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBPbGl2aWVyIENyZXRlIDx0ZXN0ZXIgYXQgdGVzdGVyIGRvdCBjYT4KKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOiAoZ3N0X3J0cF9zcGVleF9wYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9zcGVleF9wYXlfZ2V0Y2Fwcyk6CisJICBBZGQgbmVnb3RpYXRpb24gZm9yIHRoZSBzcGVlYyBjaGFubmVscyBhbmQgcmF0ZS4gU2VlICM0NjUxNDYuCisKKzIwMDgtMDUtMDIgMTI6MjQ6NTUgKzAwMDAgIE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkgIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5jOiBBZGQgbmVnb3RpYXRpb24gZm9yIHRoZSBJTEJDIG1vZGUuIFNlZSAjNDY1MTQ2LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyIGF0IHRlc3RlciBkb3QgY2E+CisJICAqIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5jOiAoZ3N0X3J0cGlsYmNwYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cGlsYmNwYXlfc2lua19zZXRjYXBzKSwgKGdzdF9ydHBpbGJjcGF5X3NpbmtfZ2V0Y2Fwcyk6CisJICBBZGQgbmVnb3RpYXRpb24gZm9yIHRoZSBJTEJDIG1vZGUuIFNlZSAjNDY1MTQ2LgorCisyMDA4LTA1LTAyIDExOjMyOjMxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IEluY2x1ZGUgc3RkbGliIHRvIGZpeCB0aGUgYnVpbGQuIFVzZSBnX2ZyZWUgaW5zdGVhZCBvZiBmcmVlLCBsaWJzb3VwIHVzZXMgZ2xpYi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgSW5jbHVkZSBzdGRsaWIgdG8gZml4IHRoZSBidWlsZC4gVXNlIGdfZnJlZSBpbnN0ZWFkIG9mIGZyZWUsIGxpYnNvdXAKKwkgIHVzZXMgZ2xpYi4KKworMjAwOC0wNS0wMiAwOTowOTo1OCArMDAwMCAgal4gPGpAYm9vdGxhYi5vcmc+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQWRkIG1vcmUgbXBlZzIgdmFyaWFudHMuIEZpeGVzICM1MzA4ODYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBqXiA8akBib290bGFiLm9yZz4KKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF92aWRlb19jYXBzKToKKwkgIEFkZCBtb3JlIG1wZWcyIHZhcmlhbnRzLiBGaXhlcyAjNTMwODg2LgorCisyMDA4LTA1LTAxIDEwOjUyOjExICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJICBnc3QvdWRwL2dzdHVkcHNyYy5jOiBEb24ndCBlcnJvciBvdXQgaWYgd2UgZ2V0IGFuIElDTVAgZGVzdGluYXRpb24tdW5yZWFjaGFibGUgbWVzc2FnZSB3aGVuIHRyeWluZyB0byByZWFkIHBhY2tldHMgb24uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aSBhdCBjb2xsYWJvcmEgY28gdWs+CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2NyZWF0ZSk6CisJICBEb24ndCBlcnJvciBvdXQgaWYgd2UgZ2V0IGFuIElDTVAgZGVzdGluYXRpb24tdW5yZWFjaGFibGUKKwkgIG1lc3NhZ2Ugd2hlbiB0cnlpbmcgdG8gcmVhZCBwYWNrZXRzIG9uIHdpbjMyICgjNTI5NDU0KS4KKworMjAwOC0wNC0zMCAxMjoxODo0MSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgVXNlIG5ldyBlcnJvciBjb2RlIGZvciBlbmNyeXB0ZWQgc3RyZWFtcyAod2hpY2ggcmVxdWlyZXMgY29yZSBDVlMpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIFVzZSBuZXcgZXJyb3IgY29kZSBmb3IgZW5jcnlwdGVkIHN0cmVhbXMgKHdoaWNoIHJlcXVpcmVzIGNvcmUgQ1ZTKS4KKworMjAwOC0wNC0zMCAxMjoxMDowMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBGaXggc3dhcHBlZCBwYWQgdGVtcGxhdGUgbmFtZXMsIHNwb3R0ZWQgYnkgVGhpYWdvIFNvdXNhIFNhbnRvcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF92aWRlb3NyY190ZW1wbGF0ZSksCisJICAoZ3N0X3F0ZGVtdXhfYXVkaW9zcmNfdGVtcGxhdGUpOgorCSAgRml4IHN3YXBwZWQgcGFkIHRlbXBsYXRlIG5hbWVzLCBzcG90dGVkIGJ5IFRoaWFnbyBTb3VzYSBTYW50b3MuCisKKzIwMDgtMDQtMzAgMDk6NDg6MTEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiBQcm9kdWNlIGNvbmNlYWxtZW50IGRhdGEgd2hlbiB0aW1lIHByb2dyZXNzZXMgaW4gYSBzZWdtZW50IHVwZGF0ZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzogKHNwZWV4X2RlY19zaW5rX2V2ZW50KSwKKwkgIChzcGVleF9kZWNfY2hhaW5fcGFyc2VfZGF0YSk6CisJICBQcm9kdWNlIGNvbmNlYWxtZW50IGRhdGEgd2hlbiB0aW1lIHByb2dyZXNzZXMgaW4gYSBzZWdtZW50IHVwZGF0ZS4KKworMjAwOC0wNC0yOSAxNDoxMTo0NSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IFRyeSB0byBwcmVzZXJ2ZSBpbnB1dCB0aW1lc3RhbXBzIHdoZW4gd2UgY2FuLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiAoc3BlZXhfZGVjX2NoYWluX3BhcnNlX2RhdGEpLAorCSAgKHNwZWV4X2RlY19jaGFpbik6CisJICBUcnkgdG8gcHJlc2VydmUgaW5wdXQgdGltZXN0YW1wcyB3aGVuIHdlIGNhbi4KKwkgIERvIGJlZ2lubmluZ3Mgb2YgZXJyb3IgY29uY2VhbG1lbnQuCisKKzIwMDgtMDQtMjggMjI6Mzg6MTEgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZ3N0L2RlYnVnL2dzdG5hdmlnYXRpb250ZXN0LmM6IE1TVkMgZG9lc24ndCBwcm92aWRlIHJpbnQoKSwgZGVmaW5lIGFuIGFkZXF1YXRlIHJlcGxhY2VtZW50IGxvY2FsbHkgYXMgZWxzZXdoZXJlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWJ1Zy9nc3RuYXZpZ2F0aW9udGVzdC5jOgorCSAgTVNWQyBkb2Vzbid0IHByb3ZpZGUgcmludCgpLCBkZWZpbmUgYW4gYWRlcXVhdGUgcmVwbGFjZW1lbnQgbG9jYWxseSBhcworCSAgZWxzZXdoZXJlLgorCisyMDA4LTA0LTI4IDExOjE2OjMyICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZ3N0L2RlYnVnL3JuZGJ1ZmZlcnNpemUuYzogRml4IHByaW50ZiBmb3JtYXQgdG8gcGFjaWZ5IE1hYyBPU1gncyBnY2MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDgtMDQtMjggIEp1bGllbiBNb3V0dGUgIDxqdWxpZW5AZmx1ZW5kby5jb20+CisJICAqIGdzdC9kZWJ1Zy9ybmRidWZmZXJzaXplLmM6IChnc3Rfcm5kX2J1ZmZlcl9zaXplX2xvb3ApOiBGaXggcHJpbnRmCisJICBmb3JtYXQgdG8gcGFjaWZ5IE1hYyBPU1gncyBnY2MuCisKKzIwMDgtMDQtMjUgMTk6MzQ6MzEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9kZWJ1Zy9ybmRidWZmZXJzaXplLmM6IEJyaW5nIHJuZGJ1ZmZlcnNpemUgZWxlbWVudCBpbnRvIGEgc3RhdGUgdGhhdCBkb2Vzbid0IHJlcXVpcmUgdXMgdG8gbW92ZSBpdCB0byAtYmFkIGltbWVkaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWJ1Zy9ybmRidWZmZXJzaXplLmM6IChERUZBVUxUX1NFRUQpLCAoREVGQVVMVF9NSU4pLAorCSAgKERFRkFVTFRfTUFYKSwgKHNyY190ZW1wbGF0ZSksIChzaW5rX3RlbXBsYXRlKSwKKwkgIChnc3Rfcm5kX2J1ZmZlcl9zaXplX2Jhc2VfaW5pdCksIChnc3Rfcm5kX2J1ZmZlcl9zaXplX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ybmRfYnVmZmVyX3NpemVfaW5pdCksIChnc3Rfcm5kX2J1ZmZlcl9zaXplX2FjdGl2YXRlKSwKKwkgIChnc3Rfcm5kX2J1ZmZlcl9zaXplX2xvb3ApLCAoZ3N0X3JuZF9idWZmZXJfc2l6ZV9wbHVnaW5faW5pdCk6CisJICBCcmluZyBybmRidWZmZXJzaXplIGVsZW1lbnQgaW50byBhIHN0YXRlIHRoYXQgZG9lc24ndCByZXF1aXJlIHVzCisJICB0byBtb3ZlIGl0IHRvIC1iYWQgaW1tZWRpYXRlbHkuIEZvciBvbmUsIGZpeCB1cCBkZWZhdWx0IG1pbi9tYXgKKwkgIHZhbHVlcyBzbyB0aGF0IHRoZSBlbGVtZW50IGFjdHVhbGwgd29ya3MgdXNpbmcgdGhlIGRlZmF1bHQgdmFsdWVzLgorCSAgQWxzbywgZG9uJ3QgaWdub3JlIGZsb3cgcmV0dXJuIHZhbHVlcyBhbmQgZG8gc29tZSBraW5kIG9mIG1pbmltYWwKKwkgIGVvcyBsb2dpYy4gQWxsb3cgbWluPW1heCB0byBwdWxsIGZpeGVkLXNpemVkIGJ1ZmZlcnMuIEJ1bmNoIG9mCisJICBvdGhlciBncmF0dWl0aW91cyBjbGVhbi11cHMuCisKKzIwMDgtMDQtMjUgMTk6MjQ6MDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGRvY3MvcGx1Z2lucy86IEFkZCBkb2NzIGZvciBnZGtwaXhidWZzaW5rOyB1cGRhdGUgZG9jcyB0byBDVlMgdmVyc2lvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNkaW8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb25vc2NvcGUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSAgQWRkIGRvY3MgZm9yIGdka3BpeGJ1ZnNpbms7IHVwZGF0ZSBkb2NzIHRvIENWUyB2ZXJzaW9uLgorCisyMDA4LTA0LTI1IDE4OjQ1OjMzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXY0bDItSDI2NC1hbHNhc3JjLVBDTUEuc2g6IFJlbW92ZSB0ZXN0IHN5bmMtb2Zmc2V0IGJ5IGRlZmF1bHQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci12NGwyLUgyNjQtYWxzYXNyYy1QQ01BLnNoOgorCSAgUmVtb3ZlIHRlc3Qgc3luYy1vZmZzZXQgYnkgZGVmYXVsdC4KKworMjAwOC0wNC0yNSAxMzozMTo0OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0LzogVXNlIEdMaWIgdmVyc2lvbnMgb2YgaHRvbmwsIGh0b25zLCBudG9obCBhbmQgbnRvaHMgaW4gb3JkZXIgdG8gYXZvaWQgcHJvYmxlbXMgb24gd2luMzIgKCM1Mjk3MDcpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0YXN0ZXJpc2toMjYzLmM6IChnc3RfYXN0ZXJpc2toMjYzX2NoYWluKToKKwkgICogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogKGdzdF9tdWx0aXVkcHNpbmtfYWRkX2ludGVybmFsKToKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfc3RhcnQpOgorCSAgVXNlIEdMaWIgdmVyc2lvbnMgb2YgaHRvbmwsIGh0b25zLCBudG9obCBhbmQgbnRvaHMgaW4gb3JkZXIKKwkgIHRvIGF2b2lkIHByb2JsZW1zIG9uIHdpbjMyICgjNTI5NzA3KS4KKworMjAwOC0wNC0yNSAxMjo1Mjo0NCArMDAwMCAgSmVzw7pzIENvcnJpdXMgPGplc3VzQHNvZnRjYXRhbGEub3JnPgorCisJICBnc3QvZ29vbS86IEZpeCBidWlsZCB3aXRoIG1pbmd3MzI6IHVzZSByYW5kKCkgaW5zdGVhZCBvZiByYW5kb20oKSBhbmQgcmVwbGFjZSBiemVybygpIHdpdGggbWVtc2V0KCkuIEZpeGVzICM1Mjk2OTIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBKZXPDunMgQ29ycml1cyA8amVzdXMgYXQgc29mdGNhdGFsYSBvcmc+CisJICAqIGdzdC9nb29tL2ZpbHRlcnMuYzogKHpvb21WZWN0b3IpOgorCSAgKiBnc3QvZ29vbS9nb29tX2NvcmUuYzogKGluaXRfYnVmZmVycyk6CisJICBGaXggYnVpbGQgd2l0aCBtaW5ndzMyOiB1c2UgcmFuZCgpIGluc3RlYWQgb2YgcmFuZG9tKCkgYW5kCisJICByZXBsYWNlIGJ6ZXJvKCkgd2l0aCBtZW1zZXQoKS4gRml4ZXMgIzUyOTY5Mi4KKworMjAwOC0wNC0yNSAwNzo1NjoxMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBGaXggdHlwbyBpbiBjb21tZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2NvbWJpbmVfZmxvd3MpOgorCSAgRml4IHR5cG8gaW4gY29tbWVudHMuCisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3AtUENNQS5zZHA6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3AtUENNQS5zaDoKKwkgICogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LVBDTUEuc2RwOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjQtUENNQS5zaDoKKwkgICogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LnNkcDoKKwkgICogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LnNoOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEuc2RwOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEuc2g6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLnNoOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXY0bDItSDI2M3AtYWxzYXNyYy1BTVIuc2g6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItdjRsMi1IMjY0LWFsc2FzcmMtUENNQS5zaDoKKwkgIEFkZCBzb21lIG1vcmUgZG9jcyBhbmQgZml4IGV4YW1wbGVzLgorCisyMDA4LTA0LTI0IDIyOjA0OjU3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jOiBJbmNsdWRlIHN0ZGxpYi5oIGFuZCB1bmlzdGQuaCBmb3IgbWtkdGVtcC4gU29tZSBwbGF0Zm9ybXMgaGF2ZSBpdCBkZWNsYXJlZCBpbiB0aGUgZi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jOgorCSAgSW5jbHVkZSBzdGRsaWIuaCBhbmQgdW5pc3RkLmggZm9yIG1rZHRlbXAuIFNvbWUgcGxhdGZvcm1zIGhhdmUgaXQKKwkgIGRlY2xhcmVkIGluIHRoZSBmb3JtZXIsIHNvbWUgaGF2ZSBpdCBkZWNsYXJlZCBpbiB0aGUgbGF0dGVyLgorCisyMDA4LTA0LTI0IDIyOjAxOjUyICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFN0b3AgdXNpbmcgZGVwcmVjYXRlZCBHTGliIGZ1bmN0aW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzogKGdzdF90ZXh0X292ZXJsYXlfc2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2RlYnVnL3Rlc3RzLmM6IChtZDVfZ2V0X3ZhbHVlKToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6IChnc3RfcnRwX2gyNjNwX2RlcGF5X3NldGNhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYzogKGdzdF9ydHBpbGJjcGF5X3NldGNhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6IChnc3RfcnRwX3RoZW9yYV9kZXBheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOiAoZ3N0X3J0cF92b3JiaXNfZGVwYXlfc2V0Y2Fwcyk6CisJICBTdG9wIHVzaW5nIGRlcHJlY2F0ZWQgR0xpYiBmdW5jdGlvbnMuCisKKzIwMDgtMDQtMjQgMjE6MTc6NDIgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBjb25maWd1cmUuYWM6IEJhY2sgdG8gZGV2ZWxvcG1lbnQgLT4gMC4xMC44LjEKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBCYWNrIHRvIGRldmVsb3BtZW50IC0+IDAuMTAuOC4xCisJICA9PT0gcmVsZWFzZSAwLjEwLjggPT09CisKKz09PSByZWxlYXNlIDAuMTAuOCA9PT0KKworMjAwOC0wNC0yMyAyMzo0MDo0OCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSAgUmVsZWFzZSAwLjEwLjggYSBsaXR0bGUgaGFyZGVyIChlZGl0ZWQgdGhlIHJlbGVhc2Ugbm90ZXMpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJlbGVhc2UgMC4xMC44IGEgbGl0dGxlIGhhcmRlciAoZWRpdGVkIHRoZSByZWxlYXNlIG5vdGVzKQorCisyMDA4LTA0LTIzIDIzOjI2OjI0ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2FtbWEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogcG8vTElOR1VBUzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMC4xMC44CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJlbGVhc2UgMC4xMC44CisKKzIwMDgtMDQtMjMgMjM6MTg6NDQgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBjb21tb246CisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAwOC0wNC0yMiAwMDoyOTowMCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogMC4xMC43LjQgcHJlLXJlbGVhc2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAwLjEwLjcuNCBwcmUtcmVsZWFzZQorCisyMDA4LTA0LTIyIDAwOjE4OjUyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2dvb20vOiBGcmVlIGEgYnVuY2ggb2Ygc3R1ZmYsIGFuZCBpbml0aWFsaXNlIHRoaW5ncyB0byBmaXggbGVha3MgYW5kIHZhbGdyaW5kIHdhcm5pbmdzIGluIHRoZSB0ZXN0c3VpdGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vY29uZmlnX3BhcmFtLmM6IChnb29tX3BsdWdpbl9wYXJhbWV0ZXJzX2ZyZWUpOgorCSAgKiBnc3QvZ29vbS9jb252b2x2ZV9meC5jOiAoY29udm9sdmVfaW5pdCksIChjb252b2x2ZV9mcmVlKToKKwkgICogZ3N0L2dvb20vZmlsdGVycy5jOiAoem9vbUZpbHRlclZpc3VhbEZYV3JhcHBlcl9mcmVlKToKKwkgICogZ3N0L2dvb20vZmx5aW5nX3N0YXJzX2Z4LmM6IChmc19mcmVlKToKKwkgICogZ3N0L2dvb20vZ29vbV9jb25maWdfcGFyYW0uaDoKKwkgICogZ3N0L2dvb20vZ29vbV9jb3JlLmM6IChnb29tX2luaXQpLCAoZ29vbV9jbG9zZSk6CisJICAqIGdzdC9nb29tL2dvb21fcGx1Z2luX2luZm8uaDoKKwkgICogZ3N0L2dvb20vZ3N0Z29vbS5jOiAoZ3N0X2dvb21fZmluYWxpemUpOgorCSAgKiBnc3QvZ29vbS9saW5lcy5jOiAoZ29vbV9saW5lc19mcmVlKToKKwkgICogZ3N0L2dvb20vcGx1Z2luX2luZm8uYzogKHBsdWdpbl9pbmZvX2luaXQpLCAocGx1Z2luX2luZm9fZnJlZSk6CisJICAqIGdzdC9nb29tL3N1cmYzZC5jOiAoZ3JpZDNkX2ZyZWUpOgorCSAgKiBnc3QvZ29vbS9zdXJmM2QuaDoKKwkgICogZ3N0L2dvb20vdGVudGFjbGUzZC5jOiAodGVudGFjbGVfZnJlZSk6CisJICBGcmVlIGEgYnVuY2ggb2Ygc3R1ZmYsIGFuZCBpbml0aWFsaXNlIHRoaW5ncyB0byBmaXggbGVha3MKKwkgIGFuZCB2YWxncmluZCB3YXJuaW5ncyBpbiB0aGUgdGVzdHN1aXRlLgorCSAgRml4ZXM6ICM1MjkyNjgKKworMjAwOC0wNC0yMSAyMTo1NDoxMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmM6IERvbid0IGxlYWsgYSB0YWcgbGlzdC4gRml4ZXMgYnVnICM1MjkyODUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jOiAoR1NUX1NUQVJUX1RFU1QpOgorCSAgRG9uJ3QgbGVhayBhIHRhZyBsaXN0LiBGaXhlcyBidWcgIzUyOTI4NS4KKworMjAwOC0wNC0yMSAwODoyMToxNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBSZWYgY2FwcyBhcyB0aGUgcmV0dXJuIHZhbHVlIGZvciB0aGUgcmVxdWVzdF9wdF9tYXAgc2lnbmFsLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2luaXQpLCAocmVxdWVzdF9wdF9tYXApLAorCSAgKGdzdF9ydHNwc3JjX2NvbmZpZ3VyZV9jYXBzKToKKwkgIFJlZiBjYXBzIGFzIHRoZSByZXR1cm4gdmFsdWUgZm9yIHRoZSByZXF1ZXN0X3B0X21hcCBzaWduYWwuCisJICBSZW1vdmUgc29tZSBjYXBzIHdlaXJkbmVzcyB3aGVuIGNvbmZpZ3VyaW5nIGEgc3RyZWFtLiBTZWUgIzUyODI0NS4KKworMjAwOC0wNC0xOCAxODo0Nzo0MyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgdGVzdHMvaWNsZXMvZ2RrcGl4YnVmc2luay10ZXN0LmM6IEFkZCBjYXN0IHRvIHBsYWNhdGUgZ2NjIDQuMS4yLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2ljbGVzL2dka3BpeGJ1ZnNpbmstdGVzdC5jOgorCSAgQWRkIGNhc3QgdG8gcGxhY2F0ZSBnY2MgNC4xLjIuCisKKzIwMDgtMDQtMTcgMjM6MDA6MjkgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBjb25maWd1cmUuYWM6IDAuMTAuNy4zIHByZS1yZWxlYXNlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgMC4xMC43LjMgcHJlLXJlbGVhc2UKKworMjAwOC0wNC0xNyAyMjozMjoxNiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOiBEaXNhYmxlIHNvbWUgbW9yZSBlbGVtZW50cyBpbiB0aGUgc3RhdGUgdGVzdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIERpc2FibGUgc29tZSBtb3JlIGVsZW1lbnRzIGluIHRoZSBzdGF0ZSB0ZXN0LgorCSAgQWRkIGEgZGVmaW5lIHNvIHRoZSBzb3VwIHRlc3QgY2FuIGZpbmQgdGhlIHRlc3QgZmlsZXMKKwkgIGl0IG5lZWRzIGF0IHJ1bnRpbWUuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6IChydW5fc2VydmVyKToKKwkgIEFkZCBhIGRlZmluZSBzbyB0aGUgc291cCB0ZXN0IGNhbiBmaW5kIHRoZSB0ZXN0IGZpbGVzCisJICBpdCBuZWVkcyBhdCBydW50aW1lLgorCisyMDA4LTA0LTE3IDE4OjA4OjUzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2dvb20vY29udm9sdmVfZnguYzogRG9uJ3QgZXZlciBkcmF3IHRoZSBHT09NIGxvZ28uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vY29udm9sdmVfZnguYzogKGNvbnZvbHZlX2FwcGx5KToKKwkgIERvbid0IGV2ZXIgZHJhdyB0aGUgR09PTSBsb2dvLgorCSAgRml4ZXM6ICM1Mjg2MTUKKworMjAwOC0wNC0xNyAxMDoyNDozMiArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZXh0LzogZ3N0X2F0b21pY19pbnRfc2V0ID09PiBnX2F0b21pY19pbnRfc2V0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2NkaW8vZ3N0Y2Rpb2NkZGFzcmMuYzoKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkgIGdzdF9hdG9taWNfaW50X3NldCA9PT4gZ19hdG9taWNfaW50X3NldAorCisyMDA4LTA0LTE2IDEwOjMxOjE3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBTdHJpcCBvdXQgdGhlIGNvbmZpZy9zY3JpcHQgcGFyc2luZyBzdHVmZiwgd2UgZG9uJ3QgbmVlZCBpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9nb29tL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZ29vbS9jb252b2x2ZV9meC5jOgorCSAgKiBnc3QvZ29vbS9kZWZhdWx0X3NjcmlwdHMuaDoKKwkgICogZ3N0L2dvb20vZ29vbS5oOgorCSAgKiBnc3QvZ29vbS9nb29tX2NvcmUuYzogKGNob29zZV9hX2dvb21fbGluZSk6CisJICAqIGdzdC9nb29tL2dvb21fcGx1Z2luX2luZm8uaDoKKwkgICogZ3N0L2dvb20vZ29vbXNsLmM6CisJICAqIGdzdC9nb29tL2dvb21zbC5oOgorCSAgKiBnc3QvZ29vbS9nb29tc2xfaGFzaC5jOgorCSAgKiBnc3QvZ29vbS9nb29tc2xfaGFzaC5oOgorCSAgKiBnc3QvZ29vbS9nb29tc2xfaGVhcC5jOgorCSAgKiBnc3QvZ29vbS9nb29tc2xfaGVhcC5oOgorCSAgKiBnc3QvZ29vbS9nb29tc2xfcHJpdmF0ZS5oOgorCSAgKiBnc3QvZ29vbS9wbHVnaW5faW5mby5jOgorCSAgU3RyaXAgb3V0IHRoZSBjb25maWcvc2NyaXB0IHBhcnNpbmcgc3R1ZmYsIHdlIGRvbid0IG5lZWQgaXQuCisJICBGaXhlcyAjNTI3OTk5LgorCisyMDA4LTA0LTE1IDE2OjU4OjM2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvZ29vbS9wbHVnaW5faW5mby5jOiBEaXNhYmxlIGFsdGl2ZWMgb3B0aW1pc2F0aW9ucyBmb3IgMzItYml0IFBQQyBhcyB3ZWxsIHRvIG1ha2UgdGhpbmdzIGJ1aWxkIHByb3Blcmx5IG9uIGFsbCBQUEMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbS9wbHVnaW5faW5mby5jOiAoc2V0T3B0aW1pemVkTWV0aG9kcyk6CisJICBEaXNhYmxlIGFsdGl2ZWMgb3B0aW1pc2F0aW9ucyBmb3IgMzItYml0IFBQQyBhcyB3ZWxsIHRvIG1ha2UKKwkgIHRoaW5ncyBidWlsZCBwcm9wZXJseSBvbiBhbGwgUFBDIHN5c3RlbXMuIEZpeGVzICM1MjgxNDMKKworMjAwOC0wNC0xNCAyMDowMTo0NCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOiBVcGRhdGUgZm9yIHNvdXBodHRwc3JjIHBsdWdpbiB3aGljaCBoYXMgbW92ZWQgdG8gLWdvb2QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgVXBkYXRlIGZvciBzb3VwaHR0cHNyYyBwbHVnaW4gd2hpY2ggaGFzIG1vdmVkIHRvIC1nb29kLgorCisyMDA4LTA0LTE0IDEzOjM4OjMyICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogRml4IG9wZW4tZW5kZWQgc2Vla3MgaW4gbWF0cm9za2FkZW11eAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc2Vla19ldmVudCk6CisJICBGaXggb3Blbi1lbmRlZCBzZWVrcyBpbiBtYXRyb3NrYWRlbXV4CisJICBQYXRjaCBieTogTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3IHNreW5ldCBiZT4KKwkgIEZpeGVzOiAjNTI2NTU3CisKKzIwMDgtMDQtMTMgMjM6MTM6MzIgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogQWRkIHNvdXAgdGVzdCBjZXJ0aWZpY2F0ZXMgdG8gdGhlIGRpc3QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBBZGQgc291cCB0ZXN0IGNlcnRpZmljYXRlcyB0byB0aGUgZGlzdC4KKworMjAwOC0wNC0xMyAxNzo0Mzo1MiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGV4dC9NYWtlZmlsZS5hbTogUmVtb3ZlIExBRFNQQSByZWZlcmVuY2UgSSBtaXNzZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L01ha2VmaWxlLmFtOgorCSAgUmVtb3ZlIExBRFNQQSByZWZlcmVuY2UgSSBtaXNzZWQuCisKKzIwMDgtMDQtMTMgMTM6MDY6MzkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogR2l2ZSBzb3VwaHR0cHNyYyBHU1RfUkFOS19QUklNQVJZIHRvIG1ha2UgaXQgdGhlIGRlZmF1bHQgSFRUUCBzb3VyY2Ugb3ZlciBnbm9tZS12ZnMgYW5kIGV2Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKHBsdWdpbl9pbml0KToKKwkgIEdpdmUgc291cGh0dHBzcmMgR1NUX1JBTktfUFJJTUFSWSB0byBtYWtlIGl0IHRoZSBkZWZhdWx0IEhUVFAgc291cmNlCisJICBvdmVyIGdub21lLXZmcyBhbmQgZXZlcnl0aGluZyBlbHNlLiBGaXhlcyBidWcgIzUyNzg0OC4KKworMjAwOC0wNC0xMiAyMzo0NzoyMyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIFJlbW92ZSBMQURTUEEgcGx1Z2luLiBGaXhlczogIzUxNTk3OAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZXh0L01ha2VmaWxlLmFtOgorCSAgUmVtb3ZlIExBRFNQQSBwbHVnaW4uIEZpeGVzOiAjNTE1OTc4CisKKzIwMDgtMDQtMTIgMjM6MzA6NTQgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBNb3ZlIHNvdXAgcGx1Z2luIGZyb20gLWJhZCAoRml4ZXM6ICM1MjMxMjQpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJICAqIGV4dC9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBNb3ZlIHNvdXAgcGx1Z2luIGZyb20gLWJhZCAoRml4ZXM6ICM1MjMxMjQpCisKKzIwMDgtMDQtMTEgMTE6MDg6MzUgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJICBGaXggdGhlIENoYW5nZWxvZyAtIGFjdHVhbGx5IHNwZWV4IDw9IDEuMS4xMiBhcmUgdnVsbmVyYWJsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRml4IHRoZSBDaGFuZ2Vsb2cgLSBhY3R1YWxseSBzcGVleCA8PSAxLjEuMTIgYXJlIHZ1bG5lcmFibGUuCisKKzIwMDgtMDQtMTEgMTA6MzI6MjAgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzogRml4IGJvdW5kcyBjaGVja2luZyBvZiBtb2RlIGluIFNwZWV4IGhlYWRlciwgd2hpY2ggbWF5IHByb2R1Y2UgbmVnYXRpdmUgbnVtYmVycyBpbiBzcGVleCA8IDEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzogKHNwZWV4X2RlY19jaGFpbl9wYXJzZV9oZWFkZXIpOgorCSAgRml4IGJvdW5kcyBjaGVja2luZyBvZiBtb2RlIGluIFNwZWV4IGhlYWRlciwgd2hpY2ggbWF5CisJICBwcm9kdWNlIG5lZ2F0aXZlIG51bWJlcnMgaW4gc3BlZXggPCAxLjEuMTIKKworMjAwOC0wNC0xMCAwNzoxMTo1MSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOiBJbmNyZWFzZSB0aGUgdGltZW91dCBmb3IgdGhlIGludGVybmV0IHRlc3RzIHRvIDI1MCBzZWNvbmRzIGFuZCBjaGVjayBmb3IgTlVMTCBjYXAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOiAoZ290X2J1ZmZlciksCisJICAoc291cGh0dHBzcmNfc3VpdGUpOgorCSAgSW5jcmVhc2UgdGhlIHRpbWVvdXQgZm9yIHRoZSBpbnRlcm5ldCB0ZXN0cyB0byAyNTAgc2Vjb25kcworCSAgYW5kIGNoZWNrIGZvciBOVUxMIGNhcHMgaW5zdGVhZCBvZiBqdXN0IGNyYXNoaW5nLgorCSAgVGhlIHJlYWwgZml4IHdvdWxkIGJlIHRvIGltcGxlbWVudCBhbiBzaG91dGNhc3Qgc2VydmVyIGZvciB0aGUgdW5pdCB0ZXN0CisJICBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gYSB3b3JraW5nIGludGVybmV0IGNvbm5lY3Rpb24uCisJICBGaXhlcyBidWcgIzUyMTc0OS4KKworMjAwOC0wNC0wOSAxNjoxMTo0MCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2dvb20vOiBSZW1vdmUgYSBidW5jaCBvZiBmb250L3RleHQgcmVsYXRlZCBjb2RlIHRoYXQgd2UgZG9uJ3QgbmVlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2dvb20vZ2ZvbnRsaWIuYzoKKwkgICogZ3N0L2dvb20vZ2ZvbnRsaWIuaDoKKwkgICogZ3N0L2dvb20vZ2ZvbnRybGUuYzoKKwkgICogZ3N0L2dvb20vZ2ZvbnRybGUuaDoKKwkgICogZ3N0L2dvb20vZ29vbS5oOgorCSAgKiBnc3QvZ29vbS9nb29tX2NvcmUuYzogKGdvb21fdXBkYXRlKToKKwkgICogZ3N0L2dvb20vZ29vbV9wbHVnaW5faW5mby5oOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnc3RfZ29vbV9jaGFpbik6CisJICAqIGdzdC9nb29tL3BsdWdpbl9pbmZvLmM6CisJICBSZW1vdmUgYSBidW5jaCBvZiBmb250L3RleHQgcmVsYXRlZCBjb2RlIHRoYXQgd2UgZG9uJ3QgbmVlZC4KKworMjAwOC0wNC0wOSAxNDowMjozNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2dvb20vOiBDaGFuZ2UgbGljZW5zZSBvZiB0aGVzZSBmaWxlcyB0byBMR1BMLCBhcyBwZXJtaXR0ZWQgYnkgdGhlIGF1dGhvciwgR3VpbGxhdW1lIEJvcmlvcy4gU2VlICM1MTUwNzMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vcHBjX2RyYXdpbmdzLnM6CisJICAqIGdzdC9nb29tL3BwY196b29tX3VsdGltYXRlLnM6CisJICBDaGFuZ2UgbGljZW5zZSBvZiB0aGVzZSBmaWxlcyB0byBMR1BMLCBhcyBwZXJtaXR0ZWQgYnkgdGhlCisJICBhdXRob3IsIEd1aWxsYXVtZSBCb3Jpb3MuIFNlZSAjNTE1MDczLgorCisyMDA4LTA0LTA5IDEzOjMxOjIyICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9nb29tLzogQXMgaGludGVkIGluIEJ1ZyAjNTE4MjEzLCByZXZlcnQgb25lIGNoYW5nZSBhbmQgZml4IHdhcm5pbmdzIHByb3Blcmx5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9nb29tL2NvbnZvbHZlX2Z4LmM6CisJICAqIGdzdC9nb29tL21vdGlmX2dvb20xLmg6CisJICAqIGdzdC9nb29tL21vdGlmX2dvb20yLmg6CisJICBBcyBoaW50ZWQgaW4gQnVnICM1MTgyMTMsIHJldmVydCBvbmUgY2hhbmdlIGFuZCBmaXggd2FybmluZ3MgcHJvcGVybHkuCisJICBUaGlzIGZpeGVzIGJvdGggIzUxODIxMyBhbmQgIzUyMDA3MyBmb3IgbWUuCisKKzIwMDgtMDQtMDkgMTI6MDI6NTUgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvbWF0cm9za2EvOiBGaXggdGhlIEZvcnRlIGJ1aWxkIGJ5IG1ha2luZyBmdW5jdGlvbiBkZWNsYXJhdGlvbiBzaWduYXR1cmVzIG1hdGNoIHRoZSBpbXBsZW1lbnRhdGlvbnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOiAoZ3N0X2VibWxfcmVhZF9zZWVrKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX2V2ZW50KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfY29udGVudHNfc2Vla2VudHJ5KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfbG9vcCk6CisJICBGaXggdGhlIEZvcnRlIGJ1aWxkIGJ5IG1ha2luZyBmdW5jdGlvbiBkZWNsYXJhdGlvbiBzaWduYXR1cmVzCisJICBtYXRjaCB0aGUgaW1wbGVtZW50YXRpb25zLgorCisyMDA4LTA0LTA4IDE5OjQ5OjM0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvb3NzLzogTW9yZSBsb2dnaW5nIHdoZW4gcHJvYmluZyAoc2VlICM1MTg0NzQpLCBzb21lIGNvbW1lbnRzIGluIF9yZXNldCgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3MvZ3N0b3NzaGVscGVyLmM6IChnc3Rfb3NzX2hlbHBlcl9yYXRlX2NoZWNrX3JhdGUpOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3Nfc2lua19yZXNldCk6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc3JjLmM6IChnc3Rfb3NzX3NyY19yZXNldCk6CisJICBNb3JlIGxvZ2dpbmcgd2hlbiBwcm9iaW5nIChzZWUgIzUxODQ3NCksIHNvbWUgY29tbWVudHMgaW4gX3Jlc2V0KCkuCisKKzIwMDgtMDQtMDcgMTc6MTg6NDggKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzogRml4IGJ1aWxkIGJlY2F1c2Ugb2YgYSBiYWQgYXJndW1lbnQgbnVtYmVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA4LTA0LTA3ICBKdWxpZW4gTW91dHRlICA8anVsaWVuQGZsdWVuZG8uY29tPgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzogKGdzdF9ydHBfaDI2NF9wYXlfc2V0Y2Fwcyk6IEZpeCBidWlsZAorCSAgYmVjYXVzZSBvZiBhIGJhZCBhcmd1bWVudCBudW1iZXIuCisKKzIwMDgtMDQtMDYgMTg6Mjg6MDkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHRlc3RzL2ljbGVzLzogSW50ZXJhY3RpdmUgdGVzdCBhcHAgZm9yIGdka3BpeGJ1ZnNpbmsuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvaWNsZXMvLmN2c2lnbm9yZToKKwkgICogdGVzdHMvaWNsZXMvTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2ljbGVzL2dka3BpeGJ1ZnNpbmstdGVzdC5jOgorCSAgSW50ZXJhY3RpdmUgdGVzdCBhcHAgZm9yIGdka3BpeGJ1ZnNpbmsuCisKKzIwMDgtMDQtMDYgMDk6MDE6NDIgKzAwMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogT25seSBpZ25vcmUgYWN0dWFsIHJlZGlyZWN0cyBub3QgYWxsIHJlc3BvbnNlcyB3aGVuIGluIHN0YXRlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTam9lcmQgU2ltb25zIDxzam9lcmQgYXQgbHVvbiBkb3QgbmV0PgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOiAoZ3N0X3NvdXBfaHR0cF9zcmNfcmVzcG9uc2VfY2IpOgorCSAgT25seSBpZ25vcmUgYWN0dWFsIHJlZGlyZWN0cyBub3QgYWxsIHJlc3BvbnNlcyB3aGVuIGluIHN0YXRlCisJICBHU1RfU09VUF9IVFRQX1NSQ19TRVNTSU9OX0lPX1NUQVRVU19SVU5OSU5HLiBGaXhlcyBidWcgIzUyNjMzNy4KKworMjAwOC0wNC0wNiAwODo1Nzo1OSArMDAwMCAgRGFtaWVuIExlc3BpYXUgPGRhbWllbi5sZXNwaWF1QGdtYWlsLmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBBY3R1YWxseSBidWlsZCBkbGxzIHdoZW4gY3Jvc3MtY29tcGlsaW5nIHdpdGggbWluZ3czMi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IERhbWllbiBMZXNwaWF1IDxkYW1pZW4gZG90IGxlc3BpYXUgYXQgZ21haWwgZG90IGNvbT4KKwkgICogY29uZmlndXJlLmFjOgorCSAgQWN0dWFsbHkgYnVpbGQgZGxscyB3aGVuIGNyb3NzLWNvbXBpbGluZyB3aXRoIG1pbmd3MzIuCisJICBGaXhlcyBidWcgIzUyNjI0Ny4KKworMjAwOC0wNC0wNSAxMjowMDo0NiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2hhbC9oYWwuYzogRG9uJ3QgbXVuZ2UgZGV2aWNlIHN0cmluZyB0byAnZGVmYXVsdDp4JyBmb3IgY2FwdHVyZSBkZXZpY2VzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9oYWwvaGFsLmM6IChnc3RfaGFsX2dldF9hbHNhX2VsZW1lbnQpOgorCSAgRG9uJ3QgbXVuZ2UgZGV2aWNlIHN0cmluZyB0byAnZGVmYXVsdDp4JyBmb3IgY2FwdHVyZSBkZXZpY2VzLgorCSAgRml4ZXMgIzUyNTgzMy4KKworMjAwOC0wNC0wNCAxOTowMDoxOSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogQWx3YXlzIHVzZSBHU2xpY2UgYXMgd2UgYWN0dWFsbHkgZGVwZW5kIG9uIEdMaWIgMi4xMiBhbHJlYWR5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2luZGV4X2VudHJ5X2ZyZWUpOgorCSAgQWx3YXlzIHVzZSBHU2xpY2UgYXMgd2UgYWN0dWFsbHkgZGVwZW5kIG9uIEdMaWIgMi4xMiBhbHJlYWR5LgorCisyMDA4LTA0LTA0IDExOjI2OjQwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IFJlcXVpcmUgY29yZS9iYXNlIDAuMTAuMTggZm9yIEFSR0IgY2FwcyBwYXJzaW5nIGZpeGVzIGluIGxpYmdzdHZpZGVvLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIFJlcXVpcmUgY29yZS9iYXNlIDAuMTAuMTggZm9yIEFSR0IgY2FwcyBwYXJzaW5nIGZpeGVzIGluIGxpYmdzdHZpZGVvLgorCSAgQWxzbyBidW1wIHRoZSBHTGliIHJlcXVpcmVtZW50IHRvIHRoZSBjdXJyZW50IGRlLWZhY3RvIHJlcXVpcmVtZW50CisJICAoaWUuIDIuMTIpLgorCisyMDA4LTA0LTA0IDEwOjMyOjIxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuKjogUGFyc2UgY29kZWNfZGF0YSBmb3IgZnV0dXJlIEFWQyBjb21wYXRpYmlsaXR5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOiAoZW5jb2RlX2Jhc2U2NCksCisJICAoZ3N0X3J0cF9oMjY0X3BheV9zZXRjYXBzKSwgKGdzdF9ydHBfaDI2NF9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5oOgorCSAgUGFyc2UgY29kZWNfZGF0YSBmb3IgZnV0dXJlIEFWQyBjb21wYXRpYmlsaXR5LgorCSAgRmFpbCB3aGVuIHdlIGVuY291bnRlciBBVkMgZGF0YSBmb3Igbm93LgorCisyMDA4LTA0LTA0IDA5OjUwOjEwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogUmVuYW1lIHByb3BlcnR5IGVudW1zIGFuZCBkZWZhdWx0IGRlZmluZXMgZm9yIHRoZSBwcm9wZXJ0aWVzIHRvIG1hdGNoIHRoZSBwcm9wZXJ0eSBuYW1lcyAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogKGdzdF9zcGVjdHJ1bV9jbGFzc19pbml0KSwKKwkgIChnc3Rfc3BlY3RydW1faW5pdCksIChnc3Rfc3BlY3RydW1fc2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfc3BlY3RydW1fZ2V0X3Byb3BlcnR5KSwgKGdzdF9zcGVjdHJ1bV9tZXNzYWdlX25ldyk6CisJICBSZW5hbWUgcHJvcGVydHkgZW51bXMgYW5kIGRlZmF1bHQgZGVmaW5lcyBmb3IgdGhlIHByb3BlcnRpZXMgdG8gbWF0Y2gKKwkgIHRoZSBwcm9wZXJ0eSBuYW1lcyBhbmQgcmVwaHJhc2UgcHJvcGVydHkgZGVzY3JpcHRpb25zIHRvIG1ha2UgdGhlbSBhCisJICBiaXQgY2xlYXJlciAoaG9wZWZ1bGx5KS4gU2VlICM1MTgxODguCisKKzIwMDgtMDQtMDMgMjI6NTk6NDQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHRlc3RzL2NoZWNrLzogQWRkIHVuaXQgdGVzdCBmb3IgZ2RrcGl4YnVmc2luayBlbGVtZW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9nZGtwaXhidWZzaW5rLmM6CisJICBBZGQgdW5pdCB0ZXN0IGZvciBnZGtwaXhidWZzaW5rIGVsZW1lbnQuCisKKzIwMDgtMDQtMDMgMjI6NTA6NDggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9nZGtfcGl4YnVmLzogQWRkIGdka3BpeGJ1ZnNpbmsgZWxlbWVudCBmb3IgZWFzeSBzbmFwc2hvdHRpbmcgKCM1MjU5NDYpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nZGtfcGl4YnVmL01ha2VmaWxlLmFtOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKHBsdWdpbl9pbml0KToKKwkgICogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5jOgorCSAgKGdzdF9nZGtfcGl4YnVmX3NpbmtfYmFzZV9pbml0KSwKKwkgIChnc3RfZ2RrX3BpeGJ1Zl9zaW5rX2NsYXNzX2luaXQpLCAoZ3N0X2dka19waXhidWZfc2lua19pbml0KSwKKwkgIChnc3RfZ2RrX3BpeGJ1Zl9zaW5rX3N0YXJ0KSwgKGdzdF9nZGtfcGl4YnVmX3Npbmtfc3RvcCksCisJICAoZ3N0X2dka19waXhidWZfc2lua19zZXRfY2FwcyksCisJICAoZ3N0X2dka19waXhidWZfc2lua19waXhidWZfZGVzdHJveV9ub3RpZnkpLAorCSAgKGdzdF9nZGtfcGl4YnVmX3NpbmtfZ2V0X3BpeGJ1Zl9mcm9tX2J1ZmZlciksCisJICAoZ3N0X2dka19waXhidWZfc2lua19oYW5kbGVfYnVmZmVyKSwgKGdzdF9nZGtfcGl4YnVmX3NpbmtfcHJlcm9sbCksCisJICAoZ3N0X2dka19waXhidWZfc2lua19yZW5kZXIpLCAoZ3N0X2dka19waXhidWZfc2lua19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9nZGtfcGl4YnVmX3NpbmtfZ2V0X3Byb3BlcnR5KToKKwkgICogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5oOgorCSAgQWRkIGdka3BpeGJ1ZnNpbmsgZWxlbWVudCBmb3IgZWFzeSBzbmFwc2hvdHRpbmcgKCM1MjU5NDYpLgorCisyMDA4LTA0LTAzIDIwOjI1OjM0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZwYWNrLmM6IEJ1bXAgdGltZW91dCBmcm9tIDMgdG8gNjAgc2Vjb25kcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvd2F2cGFjay5jOiAod2F2cGFja19zdWl0ZSk6CisJICBCdW1wIHRpbWVvdXQgZnJvbSAzIHRvIDYwIHNlY29uZHMuCisKKzIwMDgtMDQtMDMgMjA6MjE6MTUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgdGVzdHMvY2hlY2svcGlwZWxpbmVzLy5jdmlnbm9yZTogUmVtb3ZlIHVzZWxlc3MgZmlsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvLmN2aWdub3JlOgorCSAgUmVtb3ZlIHVzZWxlc3MgZmlsZS4KKwkgICogdGVzdHMvY2hlY2svcGlwZWxpbmVzLy5jdnNpZ25vcmU6CisJICBBZGQgbmV3IHRlc3QgdG8gLmN2c2lnbm9yZS4KKworMjAwOC0wNC0wMyAyMDowNTozMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICB0ZXN0cy9jaGVjay86IEFkZCB1bml0IHRlc3QgdGhhdCBlbmNvZGVzIGFuZCBkZWNvZGVzIHNvbWUgZGF0YSwgY2hlY2tzIHRoYXQgaXQgaXMgc3RpbGwgdGhlIHNhbWUgYW5kIHRoYXQgYWxsIHRpbWVzdGEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3dhdnBhY2suYzogKGJ1c19oYW5kbGVyKSwKKwkgIChpZGVudGl0eV9oYW5kb2ZmKSwgKGZha2VzaW5rX2hhbmRvZmYpLCAoR1NUX1NUQVJUX1RFU1QpLAorCSAgKHdhdnBhY2tfc3VpdGUpLCAobWFpbik6CisJICBBZGQgdW5pdCB0ZXN0IHRoYXQgZW5jb2RlcyBhbmQgZGVjb2RlcyBzb21lIGRhdGEsIGNoZWNrcyB0aGF0IGl0CisJICBpcyBzdGlsbCB0aGUgc2FtZSBhbmQgdGhhdCBhbGwgdGltZXN0YW1wcy9vZmZzZXRzIGFyZSBwZXJmZWN0LgorCisyMDA4LTA0LTAzIDE4OjI4OjI4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC93YXZwYWNrLzogVXNlIEdTbGljZSBmb3IgYWxsb2NhdGluZyBpbmRleCBlbnRyaWVzIGFuZCB1c2UgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X2RldGFpbHNfc2ltcGxlKCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX2Jhc2VfaW5pdCk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogKGdzdF93YXZwYWNrX2VuY19iYXNlX2luaXQpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9pbmRleF9lbnRyeV9uZXcpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2luZGV4X2VudHJ5X2ZyZWUpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2Jhc2VfaW5pdCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfaW5kZXhfYXBwZW5kX2VudHJ5KSwgKGdzdF93YXZwYWNrX3BhcnNlX3Jlc2V0KToKKwkgIFVzZSBHU2xpY2UgZm9yIGFsbG9jYXRpbmcgaW5kZXggZW50cmllcyBhbmQgdXNlCisJICBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUoKS4KKworMjAwOC0wNC0wMiAyMjozNzoyOSArMDAwMCAgQnJpYW4gQ2FtZXJvbiA8YnJpYW4uY2FtZXJvbkBzdW4uY29tPgorCisJICBzeXMvc3VuYXVkaW8vOiBGaXggdXAgY29weXJpZ2h0cyAoIzUyNTg2MCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uIGF0IHN1biBkb3QgY29tPgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW8uYzoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXIuYzoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXIuaDoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyY3RybC5oOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcnRyYWNrLmM6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVydHJhY2suaDoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmg6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5jOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuaDoKKwkgIEZpeCB1cCBjb3B5cmlnaHRzICgjNTI1ODYwKS4KKworMjAwOC0wNC0wMiAxNjoxMDozMyArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBhZGQgbmV3IGdvb20gcGx1Z2luIHRvIHNwZWMgZmlsZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgbmV3IGdvb20gcGx1Z2luIHRvIHNwZWMgZmlsZQorCisyMDA4LTA0LTAyIDE1OjQyOjI3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvZ29vbS9nb29tc2wuYzogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGZyZWFkKCkgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vZ29vbXNsLmM6IChnc2xfcmVhZF9maWxlKToKKwkgIENoZWNrIHJldHVybiB2YWx1ZSBvZiBmcmVhZCgpIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgorCisyMDA4LTA0LTAxIDExOjAwOjQzICswMDAwICBtZXJzYWQgPG1lcnNhZEBheGlzLmNvbT4KKworCSAgZ3N0L2xhdy86IE1ha2UgbmVnb3RpYXRpb24gYSBiaXQgbW9kZXJuLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBCYXNlZCBvbiBwYXRjaCBieTogbWVyc2FkIDxtZXJzYWQgYXQgYXhpcyBkb3QgY29tPgorCSAgKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6IChnc3RfYWxhd19kZWNfc2lua19zZXRjYXBzKSwKKwkgIChnc3RfYWxhd19kZWNfY2hhaW4pLCAoZ3N0X2FsYXdfZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9sYXcvYWxhdy1kZWNvZGUuaDoKKwkgICogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOiAoZ3N0X2FsYXdfZW5jX2NoYWluKToKKwkgICogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzogKG11bGF3ZGVjX3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X211bGF3ZGVjX2NoYWluKSwgKGdzdF9tdWxhd2RlY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvbGF3L211bGF3LWRlY29kZS5oOgorCSAgKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOiAoZ3N0X211bGF3ZW5jX2NoYWluKToKKwkgIE1ha2UgbmVnb3RpYXRpb24gYSBiaXQgbW9kZXJuLgorCSAgVXNlIHBhZF9hbGxvYy4gRml4ZXMgIzUyNTM1OS4KKworMjAwOC0wMy0zMSAyMjowNjoxNCArMDAwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkgIGdzdC9nb29tL3htbXguYzogRml4IGNvbnN0cmFpbnRzIG9uIGFzbSBjb2RlIHNvIHRoYXQgaXQgY29tcGlsZXMgY29uc2lzdGVudGx5LiAgRml4ZXMgIzUyMjI3OC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbS94bW14LmM6IEZpeCBjb25zdHJhaW50cyBvbiBhc20gY29kZSBzbyB0aGF0IGl0CisJICBjb21waWxlcyBjb25zaXN0ZW50bHkuICBGaXhlcyAjNTIyMjc4LgorCisyMDA4LTAzLTI3IDA5OjM2OjU4ICswMDAwICBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uQHN1bi5jb20+CisKKwkgIHN5cy9zdW5hdWRpby86IEZpeCB1cCB0aGUgbWl4ZXIgdHJhY2tzIHRvIHVzZSBhIHZvbHVtZSByYW5nZSBvZiAwLTI1NSwgd2hpY2ggaXMgd2hhdCB0aGUgc3VuIGF1ZGlvIEFQSSB1c2VzLiBUaGlzIHNpbS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQnJpYW4gQ2FtZXJvbiA8YnJpYW4uY2FtZXJvbiBhdCBzdW4gZG90IGNvbT4KKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6CisJICAoZ3N0X3N1bmF1ZGlvbWl4ZXJfY3RybF9nZXRfdm9sdW1lKSwKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl9jdHJsX3NldF92b2x1bWUpOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcnRyYWNrLmM6IChnc3Rfc3VuYXVkaW9taXhlcl90cmFja19uZXcpOgorCSAgRml4IHVwIHRoZSBtaXhlciB0cmFja3MgdG8gdXNlIGEgdm9sdW1lIHJhbmdlIG9mIDAtMjU1LCB3aGljaCBpcyB3aGF0CisJICB0aGUgc3VuIGF1ZGlvIEFQSSB1c2VzLiBUaGlzIHNpbXBsaWZpZXMgdGhlIGNvZGUgYW5kIGF2b2lkcyByb3VuZGluZworCSAgZXJyb3JzLiBGaXhlcyAjNTI0NTkzLgorCisyMDA4LTAzLTI2IDE1OjEwOjA4ICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIENoYW5nZUxvZzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIEFkZCBkZXZpY2UtZmQgcHJvcGVydHkgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBhcHBzIHRvIGNhbGwgaW9jdGwncy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQWRkIGRldmljZS1mZCBwcm9wZXJ0eSB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIGFwcHMgdG8gY2FsbCBpb2N0bCdzLgorCisyMDA4LTAzLTI1IDE2OjQ0OjIwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFVuYnJlYWsgc3RyZWFtaW5nIG1vZGUgYWdhaW4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAobmV4dF9lbnRyeV9zaXplKToKKwkgIFVuYnJlYWsgc3RyZWFtaW5nIG1vZGUgYWdhaW4uCisKKzIwMDgtMDMtMjUgMTI6Mzk6MjIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogUmVtb3ZlIHN1cGVyZmx1b3VzIERFQlVHIG1hY3JvLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX3NldF9jYXB0dXJlKToKKwkgIFJlbW92ZSBzdXBlcmZsdW91cyBERUJVRyBtYWNyby4KKworMjAwOC0wMy0yNSAxMjozMzowOSArMDAwMCAgV2lsbGlhbSBNLiBCcmFjayA8d2JyYWNrQG1tbS5jb20uaGs+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogQ2hlY2sgd2hldGhlciB0aGUgZGV2aWNlIHN1cHBvcnRzIHNldHRpbmcgdGhlIGZyYW1lcmF0ZSBiZWZvcmUgdHJ5aW5nIHRvIHNldCBpdCBhbmQgdGhlbiBwby4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBCYXNlZCBvbiBwYXRjaCBieTogV2lsbGlhbSBNLiBCcmFjayA8d2JyYWNrIGF0IG1tbSBjb20gaGs+CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGZyYWN0aW9uc19hcmVfZXF1YWwpLAorCSAgKGdzdF92NGwyc3JjX3NldF9jYXB0dXJlKToKKwkgIENoZWNrIHdoZXRoZXIgdGhlIGRldmljZSBzdXBwb3J0cyBzZXR0aW5nIHRoZSBmcmFtZXJhdGUgYmVmb3JlCisJICB0cnlpbmcgdG8gc2V0IGl0IGFuZCB0aGVuIHBvc3RpbmcgYSB3YXJuaW5nIG9yIGVycm9yIGlmIGl0IGRvZXNuJ3QKKwkgIHdvcmsgKCM1MTY2NDksICM1MjAwOTIpLiBBbHNvIGNvbXBhcmUgZnJhY3Rpb25zIG1vcmUgY29ycmVjdGx5LgorCisyMDA4LTAzLTI0IDEyOjMyOjU5ICswMDAwICBSZW5lIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisKKwkgIE1ha2UgcmdhbmFseXNpcyBhbmQgcmdsaW1pdGVyIGVsZW1lbnRzIEdBUC1mbGFnIGF3YXJlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9yZXBsYXlnYWluL2dzdHJnYW5hbHlzaXMuYyAoZ3N0X3JnX2FuYWx5c2lzX2luaXQpLAorCSAgKGdzdF9yZ19hbmFseXNpc190cmFuc2Zvcm1faXApOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYyAoZ3N0X3JnX2xpbWl0ZXJfaW5pdCksCisJICAoZ3N0X3JnX2xpbWl0ZXJfdHJhbnNmb3JtX2lwKToKKwkgIE1ha2UgcmdhbmFseXNpcyBhbmQgcmdsaW1pdGVyIGVsZW1lbnRzIEdBUC1mbGFnIGF3YXJlLgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmM6ICh0ZXN0X2dhcF9idWZmZXJzKSwKKwkgIChyZ2FuYWx5c2lzX3N1aXRlKToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdsaW1pdGVyLmMgKHRlc3RfZ2FwKSwgKHJnbGltaXRlcl9zdWl0ZSk6CisJICBBZGQgdGVzdHMgdG8gdmVyaWZ5IGdhcC1hd2FyZW5lc3MuCisKKzIwMDgtMDMtMjMgMTM6MzE6MTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9nb29tL01ha2VmaWxlLmFtOiBSZW1vdmUgcHBjIGFzc2VtYmxlciBvcHRpbWlzYXRpb25zIGZyb20gdGhlIGJ1aWxkIHVudGlsIHRoZXkgYWN0dWFsbHkgYnVpbGQgKHRoZXkgYWxzbyBzZWVtIHRvIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9nb29tL01ha2VmaWxlLmFtOgorCSAgUmVtb3ZlIHBwYyBhc3NlbWJsZXIgb3B0aW1pc2F0aW9ucyBmcm9tIHRoZSBidWlsZCB1bnRpbCB0aGV5CisJICBhY3R1YWxseSBidWlsZCAodGhleSBhbHNvIHNlZW0gdG8gaGF2ZSBHUEwgaGVhZGVycykuCisKKzIwMDgtMDMtMjMgMTI6NDg6NDQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIG00L01ha2VmaWxlLmFtOiBCZXR0ZXIgbm90IGRpc3QgZmlsZXMgdGhhdCBkb24ndCBleGlzdCBhbnkgbG9uZ2VyIChscmludCptNCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogbTQvTWFrZWZpbGUuYW06CisJICBCZXR0ZXIgbm90IGRpc3QgZmlsZXMgdGhhdCBkb24ndCBleGlzdCBhbnkgbG9uZ2VyIChscmludCptNCkuCisKKzIwMDgtMDMtMjIgMTk6MjY6MDQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogRG9uJ3QgYXV0b3BsdWcgc291cGh0dHBzcmMgZm9yIGRhdi9kYXZzLiBUaGlzIGlzIGJldHRlciBoYW5kbGVkIGJ5CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKGdzdF9zb3VwX2h0dHBfc3JjX2dvdF9oZWFkZXJzX2NiKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19jaHVua19hbGxvY2F0b3IpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX2dvdF9jaHVua19jYiksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfdXJpX2dldF9wcm90b2NvbHMpOgorCSAgRG9uJ3QgYXV0b3BsdWcgc291cGh0dHBzcmMgZm9yIGRhdi9kYXZzLiBUaGlzIGlzIGJldHRlciBoYW5kbGVkIGJ5CisJICBHSU8gYW5kIEdub21lVkZTIGFzIHRoZXkgcHJvdmlkZSBhdXRoZW50aWNhdGlvbi4KKwkgIERvbid0IGxlYWsgdGhlIGljeSBjYXBzIGlmIHdlIGFscmVhZHkgc2V0IHRoZW0gYW5kIGdldCBhIG5ldworCSAgaWN5LW1ldGFpbnQgaGVhZGVyLgorCSAgVHJ5IGhhcmRlciB0byBzZXQgdGhlIGljeSBjYXBzIG9uIHRoZSBvdXRwdXQgYnVmZmVyIHRvIGhhdmUgY29ycmVjdAorCSAgY2FwcyBmb3IgdGhlIGZpcnN0IGJ1ZmZlciBhbHJlYWR5LgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOiAoZ290X2J1ZmZlciksCisJICAoR1NUX1NUQVJUX1RFU1QpOgorCSAgQ2hlY2sgdGhhdCB3ZSBnZXQgYSBidWZmZXIgd2l0aCBhcHBsaWNhdGlvbi94LWljeSBjYXBzIGlmIGlyYWRpby1tb2RlCisJICBpcyBlbmFibGVkIGFuZCB3ZSBoYXZlIGFuIGljZWNhc3QgVVJMLgorCisyMDA4LTAzLTIyIDE4OjE4OjQ2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IEFjdHVhbGx5IHNldCB0aGUgaWN5IGNhcHMgb24gb3VyIHNyYyBwYWQgaWYgd2UgaGF2ZSBpY2VjYXN0IGRhdGEuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKGdzdF9zb3VwX2h0dHBfc3JjX2NodW5rX2FsbG9jYXRvcik6CisJICBBY3R1YWxseSBzZXQgdGhlIGljeSBjYXBzIG9uIG91ciBzcmMgcGFkIGlmIHdlIGhhdmUgaWNlY2FzdCBkYXRhLgorCSAgRml4ZXMgYnVnICM1MjM4NTQuCisKKzIwMDgtMDMtMjEgMTM6MzY6MjcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgUmVtb3ZlIGxyaW50L2xyaW50ZiBjaGVja3MuIFdlIGRvbid0IHVzZSBpdCBhbnl3aGVyZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIG00L2xyaW50Lm00OgorCSAgKiBtNC9scmludGYubTQ6CisJICBSZW1vdmUgbHJpbnQvbHJpbnRmIGNoZWNrcy4gV2UgZG9uJ3QgdXNlIGl0IGFueXdoZXJlLgorCisyMDA4LTAzLTE5IDE5OjU2OjU5ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9mcmVlemUvOiBBZGQgZXhhbXBsZSB0byBzb3VyY2UgY29kZSBkb2N1bWVudGF0aW9uIGJsb2IgYW5kIHJlbW92ZSB0aGUgMyBsaW5lCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ZyZWV6ZS9GQVE6CisJICAqIGdzdC9mcmVlemUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9mcmVlemUvZ3N0ZnJlZXplLmM6CisJICBBZGQgZXhhbXBsZSB0byBzb3VyY2UgY29kZSBkb2N1bWVudGF0aW9uIGJsb2IgYW5kIHJlbW92ZSB0aGUgMyBsaW5lCisJICBGQVEuCisJICAqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkgIEFkZCBhIHNvdXJjZSBjb2RlIGRvY3VtZW50YXRpb24gYmxvYi4KKworMjAwOC0wMy0xOCAxNTowMzowNiArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm0gKGdzdF9vc3hfdmlkZW9fc2lua19vc3h3aW5kb3dfZGVzdHJveSkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwOC0wMy0xOCAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tCisJICAoZ3N0X29zeF92aWRlb19zaW5rX29zeHdpbmRvd19kZXN0cm95KQorCSAgKGdzdF9vc3hfdmlkZW9fc2lua19vc3h3aW5kb3dfbmV3KTogQWN0dWFsbHkgc2V0IGEgbG9jayBvbiB0aGUKKwkgIHRhc2ssIHdob29wZGVlLgorCSAgKGNvY29hX2V2ZW50X2xvb3ApOiBQYWNpZnkgdGhlIHRheW1hbnMgYnkgdXBwaW5nIHRoZSB1c2xlZXBhZ2UgdG8KKwkgIDIgbXMuCisKKzIwMDgtMDMtMTggMTE6NTA6MDggKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSAgc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tIChnc3Rfb3N4X3ZpZGVvX3Npbmtfb3N4d2luZG93X2Rlc3Ryb3kpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDgtMDMtMTggIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubSAoZ3N0X29zeF92aWRlb19zaW5rX29zeHdpbmRvd19kZXN0cm95KQorCSAgKGdzdF9vc3hfdmlkZW9fc2lua19vc3h3aW5kb3dfbmV3LCBjb2NvYV9ldmVudF9sb29wKToKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oIChzdHJ1Y3QgX0dzdE9TWFZpZGVvU2luayk6IElmIHdlCisJICBuZWVkIHRvIHJ1biBhbiBldmVudCBsb29wLCBkbyBzbyBpbiBhIHRhc2sgaW5zdGVhZCBvZiBhc3N1bWluZworCSAgdGhhdCB0aGVyZSB3aWxsIGJlIGEgR01haW5Mb29wLiBGaXhlcyAjNTIzMTM0LgorCisyMDA4LTAzLTE3IDE5OjUwOjU4ICswMDAwICBXaWxsaWFtIE0uIEJyYWNrIDx3YnJhY2tAbW1tLmNvbS5oaz4KKworCSAgc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiBNYWtlIHN1cmUgdGhlIHByb2JlZCBmcmFtZSBzaXplcyBhcmUgcmV2ZXJzZWQgaW4gdGhlIHJlc3VsdGluZyBjYXBzIGFsc28gd2hlbiB1c2luZyBWNEwyX0ZSLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBXaWxsaWFtIE0uIEJyYWNrIDx3YnJhY2sgYXQgbW1tIGNvbSBoaz4KKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSAgKGdzdF92NGwyc3JjX3Byb2JlX2NhcHNfZm9yX2Zvcm1hdF9hbmRfc2l6ZSksCisJICAoZ3N0X3Y0bDJzcmNfcHJvYmVfY2Fwc19mb3JfZm9ybWF0KToKKwkgIE1ha2Ugc3VyZSB0aGUgcHJvYmVkIGZyYW1lIHNpemVzIGFyZSByZXZlcnNlZCBpbiB0aGUgcmVzdWx0aW5nCisJICBjYXBzIGFsc28gd2hlbiB1c2luZyBWNEwyX0ZSTVNJWkVfU1RFUFdJU0UgKHNvIHRoZXkgZW5kIHVwCisJICBoaWdoZXN0IHJlc29sdXRpb24gZmlyc3QpOyBhbHNvIHJlbW92ZSB1bnVzZWQgdmFyaWFibGUuCisJICAoUGFydGx5IGZpeGVzICM1MjAwOTIpCisKKzIwMDgtMDMtMTcgMTU6NTY6MDEgKzAwMDAgIE9sZSBBbmRyw6kgVmFkbGEgUmF2bsOlcyA8b2xlLmFuZHJlLnJhdm5hc0B0YW5kYmVyZy5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogQ2FsbCBXU0FTdGFydHVwKCkgYW5kIFdTQUNsZWFudXAgYmVmb3JlIHVzaW5nIHRoZSBXaW5zb2NrIEFQSS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9sZSBBbmRyw6kgVmFkbGEgUmF2bsOlcyAgPG9sZS5hbmRyZS5yYXZuYXNAdGFuZGJlcmcuY29tPgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19pbml0KSwKKwkgIChnc3RfcnRzcHNyY19maW5hbGl6ZSk6CisJICBDYWxsIFdTQVN0YXJ0dXAoKSBhbmQgV1NBQ2xlYW51cCBiZWZvcmUgdXNpbmcgdGhlIFdpbnNvY2sgQVBJLgorCSAgU2VlICM1MjA4MDguCisKKzIwMDgtMDMtMTYgMTU6MDE6MDcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBFcm0sIHRoZSBidWZmZXItc2l6ZSBpcyBqdXN0IGd1aW50LCBubyBuZWVkIGZvciB0aGUgc3BlY2lhbCBmb3JtYXQgc3BlY2lmaWVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIEVybSwgdGhlIGJ1ZmZlci1zaXplIGlzIGp1c3QgZ3VpbnQsIG5vIG5lZWQgZm9yIHRoZSBzcGVjaWFsIGZvcm1hdAorCSAgc3BlY2lmaWVyLgorCisyMDA4LTAzLTE2IDE0OjM0OjQ1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvZ29vbS86IFNtYWxsIGZpeGVzIHRvIGJ1aWxkIG1vcmUgb24gUFBDOiBpZmRlZiBvdXQgY29kZSB0aGF0IHVzZXMgdW5rbm93biBkZWZpbmU7IGFkZCBuZXdsaW5lIGF0IGVuZCBvZiBoZWFkZXIgZmkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbS9wbHVnaW5faW5mby5jOgorCSAgKiBnc3QvZ29vbS9wcGNfem9vbV91bHRpbWF0ZS5oOgorCSAgU21hbGwgZml4ZXMgdG8gYnVpbGQgbW9yZSBvbiBQUEM6IGlmZGVmIG91dCBjb2RlIHRoYXQgdXNlcyB1bmtub3duCisJICBkZWZpbmU7IGFkZCBuZXdsaW5lIGF0IGVuZCBvZiBoZWFkZXIgZmlsZSB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nLgorCSAgQXNzZW1ibGVyIGNvZGUgc3RpbGwgZG9lc24ndCBidWlsZCB0aG91Z2guCisKKzIwMDgtMDMtMTYgMTQ6MDQ6MTYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBGaXggdXAgbXkgbGFzdCBjb21taXQuIFVzZSBHX0dVSU5UMzJfRk9STUFUIGZvciB0aGUgZ3VpbnQzMiBkZWJ1ZyBsb2cuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgRml4IHVwIG15IGxhc3QgY29tbWl0LiBVc2UgR19HVUlOVDMyX0ZPUk1BVCBmb3IgdGhlIGd1aW50MzIgZGVidWcgbG9nLgorCSAgQWxzbyBkb3duZ3JhZGUgYSBHU1RfV0FSTklORyB0byBHU1RfREVCVUcgYW5kIGFkZCBhIGNvbW1lbnQuCisKKzIwMDgtMDMtMTUgMjI6MTA6MzggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBDaHVua3NpemUgaXMgdWludDMyLiBGaXggZm9ybWF0IHNwZWNpZmllci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBDaHVua3NpemUgaXMgdWludDMyLiBGaXggZm9ybWF0IHNwZWNpZmllci4KKworMjAwOC0wMy0xNCAxNTo1MzowMSArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBnc3QvcnRzcC9DT1BZSU5HLk1JVDoKKwkgIGZpeCBsaWNlbnNlIGZpbGUsIHJlbW92ZSBleHRyYSBsaW5lIGNvcGllZCBvdmVyIGJ5IG1pc3Rha2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZml4IGxpY2Vuc2UgZmlsZSwgcmVtb3ZlIGV4dHJhIGxpbmUgY29waWVkIG92ZXIgYnkgbWlzdGFrZQorCisyMDA4LTAzLTEzIDE0OjMwOjQ1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9hdWRpb2Z4L2F1ZGlvZnguYzogVXNlIEdTVF9MSUNFTlNFLCBHU1RfUEFDS0FHRV9OQU1FIGFuZCBHU1RfUEFDS0FHRV9PUklHSU4gaW5zdGVhZCBvZiBoYXJkY29kaW5nIHZhbHVlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2Z4LmM6CisJICBVc2UgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUgYW5kIEdTVF9QQUNLQUdFX09SSUdJTiBpbnN0ZWFkCisJICBvZiBoYXJkY29kaW5nIHZhbHVlcy4KKworMjAwOC0wMy0xMyAwOTo0NTowOSArMDAwMCAgV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuKjogVHJ5IHRvIHJlc3VtZSBvbiBzZXJ2ZXIgZGlzY29ubmVjdC4gRml4ZXMgYnVnICM1MjIxMzQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBXb3V0ZXIgQ2xvZXRlbnMgPHdvdXRlciBhdCBtaW5kIGRvdCBiZT4KKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKGdzdF9zb3VwX2h0dHBfc3JjX2luaXQpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX2ZpbmlzaGVkX2NiKSwgKGdzdF9zb3VwX2h0dHBfc3JjX3Jlc3BvbnNlX2NiKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19idWlsZF9tZXNzYWdlKSwgKGdzdF9zb3VwX2h0dHBfc3JjX2NyZWF0ZSk6CisJICAqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmg6CisJICBUcnkgdG8gcmVzdW1lIG9uIHNlcnZlciBkaXNjb25uZWN0LiBGaXhlcyBidWcgIzUyMjEzNC4KKworMjAwOC0wMy0xMSAyMzoxMjowNCArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3QHNreW5ldC5iZT4KKworCSAgc3lzL29zcy9nc3Rvc3NzcmMuKjogQ2FjaGUgcHJvYmVkIGNhcHMsIHNvIF9nZXRfY2FwcygpIGR1cmluZyByZWNvcmRpbmcgZG9lc24ndCBjYXVzZSBpb2N0bCBjYWxscyB3aGljaCBtYXkgZGlzcnVwdCB0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXcgc2t5bmV0IGJlPgorCSAgKiBzeXMvb3NzL2dzdG9zc3NyYy5jOiAoZ3N0X29zc19zcmNfaW5pdCksIChnc3Rfb3NzX3NyY19nZXRjYXBzKSwKKwkgIChnc3Rfb3NzX3NyY19jbG9zZSk6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc3JjLmg6CisJICBDYWNoZSBwcm9iZWQgY2Fwcywgc28gX2dldF9jYXBzKCkgZHVyaW5nIHJlY29yZGluZyBkb2Vzbid0IGNhdXNlCisJICBpb2N0bCBjYWxscyB3aGljaCBtYXkgZGlzcnVwdCB0aGUgcmVjb3JkaW5nIChmaXhlcyAjNTIxODc1KS4KKworMjAwOC0wMy0xMSAxNjoyMzowNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBNYWtlIHN1cmUgd2UgYWx3YXlzIHNlbmQgYSBESVNDT05UIGFmdGVyIGEgc2VlayBieSBzZXR0aW5nIHRoZSBzYW1wbGUgaW5kZXggdG8gYW4gdW5kZWZpbmVkIHZhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfcGVyZm9ybV9zZWVrKSwKKwkgIChnc3RfcXRkZW11eF9hY3RpdmF0ZV9zZWdtZW50KSwKKwkgIChnc3RfcXRkZW11eF9wcmVwYXJlX2N1cnJlbnRfc2FtcGxlKSwKKwkgIChnc3RfcXRkZW11eF9sb29wX3N0YXRlX21vdmllKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBNYWtlIHN1cmUgd2UgYWx3YXlzIHNlbmQgYSBESVNDT05UIGFmdGVyIGEgc2VlayBieSBzZXR0aW5nIHRoZSBzYW1wbGUKKwkgIGluZGV4IHRvIGFuIHVuZGVmaW5lZCB2YWx1ZSBhZnRlciBhIHNlZWsuCisKKzIwMDgtMDMtMTEgMTU6MTg6NDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuaDogRml4IHVwIElTX0ZPTyBtYWNyb3MsIHdoaWNoIG1ha2VzIGd0ay1kb2MgbXVjaCBoYXBwaWVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuaDogKEdTVF9JU19BVklfU1VCVElUTEUpLAorCSAgKEdTVF9JU19BVklfU1VCVElUTEVfQ0xBU1MpOgorCSAgRml4IHVwIElTX0ZPTyBtYWNyb3MsIHdoaWNoIG1ha2VzIGd0ay1kb2MgbXVjaCBoYXBwaWVyLgorCisyMDA4LTAzLTA4IDE5OjI5OjIwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbTogTW92ZSB0aGUgLWxnc3Rmb28gd2hlcmUgaXQgYmVsb25ncy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgIE1vdmUgdGhlIC1sZ3N0Zm9vIHdoZXJlIGl0IGJlbG9uZ3MuCisKKzIwMDgtMDMtMDggMTk6MTQ6MjIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIENoYW5nZUxvZzoKKwkgIENoYW5nZUxvZyBzdXJnZXJ5CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIENoYW5nZUxvZyBzdXJnZXJ5CisKKzIwMDgtMDMtMDggMDQ6NDA6MzIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL2VibWwtaWRzLmg6IEFkZCBJRCBmb3IgRUJNTCBDUkMzMiBlbGVtZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1pZHMuaDoKKwkgIEFkZCBJRCBmb3IgRUJNTCBDUkMzMiBlbGVtZW50cy4KKwkgICogZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChnc3RfZWJtbF9maW5hbGl6ZSksCisJICAoZ3N0X2VibWxfcmVhZF9jbGFzc19pbml0KSwgKGdzdF9lYm1sX3JlYWRfcGVla19ieXRlcyksCisJICAoZ3N0X2VibWxfcmVhZF9nZXRfbGVuZ3RoKSwgKF9leHQyZGJsKSwgKGdzdF9lYm1sX3JlYWRfZmxvYXQpLAorCSAgKGdzdF9lYm1sX3JlYWRfaGVhZGVyKToKKwkgIFN1cHBvcnQgcmVhZGluZyA4MGJpdCBmbG9hdHMsIGFkZCBmaW5hbGl6ZSBtZXRob2QgdG8gY2xlYW4gdXAKKwkgIGluIGFueSBjYXNlLCBzdXBwb3J0IHJlYWRpbmcgbGVuZ3RoL2lkIGVsZW1lbnRzIHdpdGggYW55IGxlbmd0aAorCSAgYXMgbG9uZyBhcyBpdCdzIHNtYWxsZXIgdGhhbiBvdXIgc3VwcG9ydGVkIG1heGltdW0sIGRvbid0IGxlYWsKKwkgIGJ1ZmZlcnMgaWYgcmVhZGluZyBhcyBtdWNoIGRhdGEgYXMgd2Ugd2FudGVkIGZhaWxlZCBhbmQgc29tZQorCSAgc21hbGxlciBjbGVhbnVwLgorCisyMDA4LTAzLTA4IDA0OjIxOjM0ICswMDAwICBPbGl2aWVyIENyZXRlIDx0ZXN0ZXJAdGVzdGVyLmNhPgorCisJICBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzogQ2hlY2sgdGhhdCBhIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggYmVmb3JlIHJlYWRpbmcgZnJvbSBpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9saXZpZXIgQ3JldGUgPHRlc3RlciBhdCB0ZXN0ZXIgZG90IGNhPgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzogKGdzdF9ydHBfaDI2M3BfZGVwYXlfcHJvY2Vzcyk6CisJICBDaGVjayB0aGF0IGEgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCBiZWZvcmUgcmVhZGluZyBmcm9tIGl0LgorCSAgRml4ZXMgYnVnICM1MjExMDIuCisKKzIwMDgtMDMtMDcgMTU6NTQ6MDkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IEZpeCBjb21waWxhdGlvbiBhZnRlciByZW1vdmluZyB0aGUgR3N0UG9sbE1vZGUgZnJvbSB0aGUgY29uc3RydWN0b3IuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfc3RhcnQpOgorCSAgRml4IGNvbXBpbGF0aW9uIGFmdGVyIHJlbW92aW5nIHRoZSBHc3RQb2xsTW9kZSBmcm9tIHRoZQorCSAgY29uc3RydWN0b3IuCisKKzIwMDgtMDMtMDcgMTM6MDg6NDIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgQ2hlY2sgZm9yIHNpbmgoKSwgY29zaCgpIGFuZCBhc2luaCgpIGFuZCBkZWZpbmUgb3VyIG93biBpbXBsZW1lbnRhdGlvbnMgaWYgdGhleSdyZSBub3QgYXZhaWxhYmxlLiBGaXhlcyBidWcgIzUyMDg4MC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9hdWRpb2Z4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmxpbWl0LmM6CisJICAqIGdzdC9hdWRpb2Z4L21hdGhfY29tcGF0Lmg6CisJICBDaGVjayBmb3Igc2luaCgpLCBjb3NoKCkgYW5kIGFzaW5oKCkgYW5kIGRlZmluZSBvdXIgb3duCisJICBpbXBsZW1lbnRhdGlvbnMgaWYgdGhleSdyZSBub3QgYXZhaWxhYmxlLiBGaXhlcyBidWcgIzUyMDg4MC4KKworMjAwOC0wMy0wNyAxMjo0MDoxOCArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6IFVucmVmIHRoZSBidWZmZXJzIG9ubHkgb25jZSB3aGVuIGhhbmRsaW5nIG5vdC1uZWdvdGlhdGVkIGVycm9ycy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9saXZpZXIgQ3JldGUgPHRlc3RlciBhdCB0ZXN0ZXIgZG90IGNhPgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleF9lbmNfY2hhaW4pOgorCSAgVW5yZWYgdGhlIGJ1ZmZlcnMgb25seSBvbmNlIHdoZW4gaGFuZGxpbmcgbm90LW5lZ290aWF0ZWQgZXJyb3JzLgorCSAgRml4ZXMgYnVnICM1MjA3NjQuCisKKzIwMDgtMDMtMDcgMTA6MDE6NDAgKzAwMDAgIE9sZSBBbmRyw6kgVmFkbGEgUmF2bsOlcyA8b2xlLmFuZHJlLnJhdm5hc0B0YW5kYmVyZy5jb20+CisKKwkgIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IFByb3Blcmx5IGJhbGFuY2UgV1NBX0NsZWFudXAgd2l0aCBXU0FfU3RhcnR1cC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9sZSBBbmRyw6kgVmFkbGEgUmF2bsOlcyAgPG9sZS5hbmRyZS5yYXZuYXNAdGFuZGJlcmcuY29tPgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19maW5hbGl6ZSksIChnc3RfdWRwc3JjX3N0YXJ0KSwKKwkgIChnc3RfdWRwc3JjX3N0b3ApOgorCSAgUHJvcGVybHkgYmFsYW5jZSBXU0FfQ2xlYW51cCB3aXRoIFdTQV9TdGFydHVwLgorCSAgQWxzbyBtYWtlIHRoZSBwb2xsIGNvbnRyb2xsYWJsZSBvbiB3aW5kb3dzLiBGaXhlcyAjNTIwODg4LgorCisyMDA4LTAzLTA2IDE5OjQ3OjQ4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvbWF0cm9za2EvOiBIYW5kbGUgcmV0dXJuIHZhbHVlcyBmcm9tIHB1bGxfcmFuZ2UgaW4gYSBtb3JlIGdyYW51bGFyIHdheSB0byBwcm9wZXJseSBzaHV0IGRvd24gb24gc2Vla3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOiAoZ3N0X2VibWxfcmVhZF9wZWVrX2J5dGVzKSwKKwkgIChnc3RfZWJtbF9yZWFkX3B1bGxfYnl0ZXMpLCAoZ3N0X2VibWxfcmVhZF9lbGVtZW50X2lkKSwKKwkgIChnc3RfZWJtbF9yZWFkX2VsZW1lbnRfbGVuZ3RoKSwgKGdzdF9lYm1sX3BlZWtfaWQpLAorCSAgKGdzdF9lYm1sX3JlYWRfc2tpcCksIChnc3RfZWJtbF9yZWFkX2J1ZmZlciksCisJICAoZ3N0X2VibWxfcmVhZF9ieXRlcyksIChnc3RfZWJtbF9yZWFkX3VpbnQpLCAoZ3N0X2VibWxfcmVhZF9zaW50KSwKKwkgIChnc3RfZWJtbF9yZWFkX2Zsb2F0KSwgKGdzdF9lYm1sX3JlYWRfYXNjaWkpLCAoZ3N0X2VibWxfcmVhZF91dGY4KSwKKwkgIChnc3RfZWJtbF9yZWFkX2RhdGUpLCAoZ3N0X2VibWxfcmVhZF9tYXN0ZXIpLAorCSAgKGdzdF9lYm1sX3JlYWRfYmluYXJ5KSwgKGdzdF9lYm1sX3JlYWRfaGVhZGVyKToKKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5oOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfY29tYmluZV9mbG93cyksIChnc3RfbWF0cm9za2FfZGVtdXhfcmVzZXQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9yZWFkX3RyYWNrX2VuY29kaW5ncyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2FkZF9zdHJlYW0pLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NlZWtfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9pbml0X3N0cmVhbSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX3RyYWNrcyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2luZGV4X2N1ZXRyYWNrKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfaW5kZXhfcG9pbnRlbnRyeSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2luZGV4KSwgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmZvKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfbWV0YWRhdGFfaWRfc2ltcGxlX3RhZyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX21ldGFkYXRhX2lkX3RhZyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX21ldGFkYXRhKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3luY19zdHJlYW1zKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcHVzaF9oZHJfYnVmKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcHVzaF9mbGFjX2NvZGVjX3ByaXZfZGF0YSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3B1c2hfeGlwaF9jb2RlY19wcml2X2RhdGEpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfd3Zwa19oZWFkZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9jaGVja19zdWJ0aXRsZV9idWZmZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfY2x1c3RlciksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NvbnRlbnRzX3NlZWtlbnRyeSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NvbnRlbnRzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfbG9vcF9zdHJlYW1fcGFyc2VfaWQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9sb29wX3N0cmVhbSksIChnc3RfbWF0cm9za2FfZGVtdXhfbG9vcCk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICBIYW5kbGUgcmV0dXJuIHZhbHVlcyBmcm9tIHB1bGxfcmFuZ2UgaW4gYSBtb3JlIGdyYW51bGFyIHdheSB0byBwcm9wZXJseQorCSAgc2h1dCBkb3duIG9uIHNlZWtzLgorCSAgQ29tYmluZSByZXR1cm4gdmFsdWVzIGZyb20gcHVzaC4KKwkgIEltcGxlbWVudCBwcm9wZXIgZXJyb3IgaGFuZGxpbmcuCisJICBQcmVwYXJlIGZvciBoYW5kbGluZyBzZWVraW5nIGNvcnJlY3RseS4KKworMjAwOC0wMy0wMyAyMjowMTo1NiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogVXNlIEdJTlQ2NCBmb3JtYXR0aW5nIGNvbnN0YW50cyBmcm9tIEdMSUIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOgorCSAgVXNlIEdJTlQ2NCBmb3JtYXR0aW5nIGNvbnN0YW50cyBmcm9tIEdMSUIuCisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgQWRkIHNvbWUgZ3VhcmRzIHRvIGF2b2lkIGEgcG9zc2libGUgZGl2aXNpb24gYnkgMCBhbmQgY3Jhc2hpbmcKKwkgIHdpdGggTlVMTCBldmVudHMgb24gc29tZSBzeXN0ZW1zLgorCSAgVXNlIGdzdF9nZG91YmxlX3RvX2d1aW50NjQgc29tZXdoZXJlIGluc3RlYWQgb2YgYW4gaW1wbGljaXQKKwkgIGNvbnZlcnNpb24uCisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIENoZWNrIGZvciBpbnZhbGlkIHRpbWVzdGFtcHMgaW4gYSBidW5jaCBvZiBwbGFjZXMgdG8gYXZvaWQKKwkgIHdyaXRpbmcgYm9ndXMgZHVyYXRpb25zIGludG8gdGhlIG91dHB1dCBmaWxlLgorCSAgRml4IHNvbWUgZG91YmxlPC0+Z2ludDY0IGNvbnZlcnNpb25zIHRoYXQgd2VyZW4ndCB1c2luZworCSAgZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZQorCisyMDA4LTAzLTAzIDEzOjAzOjQzICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBNb3ZlIHRoZSBjaGVja3MgZm9yIGJpc29uLCBmbGV4IGFuZCBhcyB0byB0aGUgcHJvZ3JhbSBzZWN0aW9uIGFuZCB0aGUgY2hlY2sgZm9yIGdjYyBpbmxpbmUgYXNtIHRvIHRoZSBjLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgTW92ZSB0aGUgY2hlY2tzIGZvciBiaXNvbiwgZmxleCBhbmQgYXMgdG8gdGhlIHByb2dyYW0gc2VjdGlvbiBhbmQgdGhlCisJICBjaGVjayBmb3IgZ2NjIGlubGluZSBhc20gdG8gdGhlIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcyBzZWN0aW9uLgorCisyMDA4LTAzLTAzIDEyOjEwOjU1ICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBVc2UgQUdfR1NUX0NIRUNLX1BMVUdJTiBhbmQgQUdfR1NUX0RJU0FCTEVfUExVR0lOIHRvIHNpbXBsaWZ5IHdoaWNoIHBsdWctaW5zIGFyZSBpbmNsdWRlZC9leGNsdWRlZC4gKCM0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgVXNlIEFHX0dTVF9DSEVDS19QTFVHSU4gYW5kIEFHX0dTVF9ESVNBQkxFX1BMVUdJTiB0byBzaW1wbGlmeSB3aGljaAorCSAgcGx1Zy1pbnMgYXJlIGluY2x1ZGVkL2V4Y2x1ZGVkLiAoIzQ5ODIyMikKKworMjAwOC0wMi0yOSAxMjozNToyNCArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IERvbid0IGNhbGwgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcygpIHVubGVzcyB3ZSBoYXZlIGEgdmFsaWQgdGltZXN0YW1wLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogKGdzdF92aWRlb21peGVyX2JsZW5kX2J1ZmZlcnMpOgorCSAgRG9uJ3QgY2FsbCBnc3Rfb2JqZWN0X3N5bmNfdmFsdWVzKCkgdW5sZXNzIHdlIGhhdmUgYSB2YWxpZCB0aW1lc3RhbXAuCisKKzIwMDgtMDItMjkgMDY6MTg6NTUgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBnc3QvbWF0cm9za2EvOiBGaXggRGlyYWMgbWFwcGluZy4gIEkgaGFkIHByZXZpb3VzbHkgYWRkZWQgYSBWZlctdHlwZSBtYXBwaW5nLCBidXQgaXQgbG9va3MgbGlrZSBEaXJhYyB3aWxsIGdldCBhIG5hdGkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBGaXggRGlyYWMgbWFwcGluZy4gIEkgaGFkIHByZXZpb3VzbHkgYWRkZWQgYSBWZlctdHlwZQorCSAgbWFwcGluZywgYnV0IGl0IGxvb2tzIGxpa2UgRGlyYWMgd2lsbCBnZXQgYSBuYXRpdmUgTWF0cm9za2EKKwkgIG1hcHBpbmcsIGFuZCB0aGlzIGlzIHRoZSBtb3N0IGxpa2VseSBtZXRob2QuCisKKzIwMDgtMDItMjggMjM6NTY6MzAgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBnc3QvYXZpL2dzdGF2aW11eC5jOiBBZGQgRGlyYWMgZW5jb2RpbmcKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiBBZGQgRGlyYWMgZW5jb2RpbmcKKworMjAwOC0wMi0yOCAxMTo1MToyNCArMDAwMCAgUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2pAYXhpcy5jb20+CisKKwkgIGdzdC91ZHAvZ3N0dWRwc3JjLio6IFBvcnQgdG8gR3N0UG9sbC4gU2VlICM1MDU0MTcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBQZXRlciBLamVsbGVyc3RlZHQgPHBraiBhdCBheGlzIGNvbT4KKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfaW5pdCksIChnc3RfdWRwc3JjX2NyZWF0ZSksCisJICAoZ3N0X3VkcHNyY19nZXRfcHJvcGVydHkpLCAoZ3N0X3VkcHNyY19zdGFydCksIChnc3RfdWRwc3JjX3VubG9jayksCisJICAoZ3N0X3VkcHNyY191bmxvY2tfc3RvcCksIChnc3RfdWRwc3JjX3N0b3ApOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCSAgUG9ydCB0byBHc3RQb2xsLiBTZWUgIzUwNTQxNy4KKworMjAwOC0wMi0yOCAwODozNzo0NCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbGF3L211bGF3LWRlY29kZS5jOiBSZXR1cm4gR1NUX0ZMT1dfTk9UX05FR09USUFURUQgd2hlbiB0aGUgY2FwcyBhcmUgbm90IHNldCB5ZXQgb24gdGhlIHNyY3BhZC4gV2UgbmVlZCByYXRlIGFuZCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOiAoZ3N0X211bGF3ZGVjX2NoYWluKToKKwkgIFJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRCB3aGVuIHRoZSBjYXBzIGFyZSBub3Qgc2V0CisJICB5ZXQgb24gdGhlIHNyY3BhZC4gV2UgbmVlZCByYXRlIGFuZCBjaGFubmVscyBiZWZvcmUgd2UKKwkgIGNhbiBkbyBhbnkgcHJvY2Vzc2luZy4gRml4ZXMgYnVnICM1MTkwODguCisKKzIwMDgtMDItMjYgMTA6MDk6MzggKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBjb25maWd1cmUuYWM6IERldGVjdCBhbmQgaW5kaWNhdGUgaWYgR0NDIGlubGluZSBhc3NlbWJseSBzeW50YXggaXMgYXZhaWxhYmxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIERldGVjdCBhbmQgaW5kaWNhdGUgaWYgR0NDIGlubGluZSBhc3NlbWJseSBzeW50YXggaXMKKwkgIGF2YWlsYWJsZS4KKwkgICogZ3N0L2dvb20vTWFrZWZpbGUuYW06CisJICAqIGdzdC9nb29tL2NvbnZvbHZlX2Z4LmM6CisJICAqIGdzdC9nb29tL2ZseWluZ19zdGFyc19meC5jOgorCSAgKiBnc3QvZ29vbS9nb29tX2NvbmZpZy5oOgorCSAgKiBnc3QvZ29vbS9nb29tX2NvcmUuYzoKKwkgICogZ3N0L2dvb20vZ29vbXNsLmM6CisJICAqIGdzdC9nb29tL2lmcy5jOgorCSAgKiBnc3QvZ29vbS9tbXguYzoKKwkgICogZ3N0L2dvb20vcGx1Z2luX2luZm8uYzoKKwkgICogZ3N0L2dvb20veG1teC5jOgorCSAgRml4IHZhcmlvdXMgR0NDLWlzbXMsIGFuZCBvbmx5IGJ1aWxkIHRoZSBpbmxpbmUgYXNzZW1ibHkKKwkgIHdpdGggY29tcGlsZXJzIHRoYXQgc3VwcG9ydCBHQ0MgaW5saW5lIGFzc2VtYmx5LgorCSAgRml4IGEgY291cGxlIG9mIG90aGVyIHdhcm5pbmdzIHNob3duIHdpdGggRm9ydGUuCisKKzIwMDgtMDItMjYgMDU6MzY6MTcgKzAwMDAgIFdvdXRlciBDbG9ldGVucyA8d291dGVyQG1pbmQuYmU+CisKKwkgIEFkZCBzdXBwb3J0IGZvciBzcGVjaWZ5aW5nIGEgbGlzdCBvZiBjb29raWVzIHRvIGJlIHBhc3NlZCBpbiB0aGUgSFRUUCByZXF1ZXN0LiBGaXhlcyBidWcgIzUxODcyMi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFdvdXRlciBDbG9ldGVucyA8d291dGVyIGF0IG1pbmQgZG90IGJlPgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOiAoZ3N0X3NvdXBfaHR0cF9zcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfaW5pdCksIChnc3Rfc291cF9odHRwX3NyY19kaXNwb3NlKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19zZXRfcHJvcGVydHkpLCAoZ3N0X3NvdXBfaHR0cF9zcmNfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19jcmVhdGUpOgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOiAocnVuX3Rlc3QpLCAoR1NUX1NUQVJUX1RFU1QpLAorCSAgKHNvdXBodHRwc3JjX3N1aXRlKToKKwkgIEFkZCBzdXBwb3J0IGZvciBzcGVjaWZ5aW5nIGEgbGlzdCBvZiBjb29raWVzIHRvIGJlIHBhc3NlZCBpbgorCSAgdGhlIEhUVFAgcmVxdWVzdC4gRml4ZXMgYnVnICM1MTg3MjIuCisKKzIwMDgtMDItMjUgMTI6MDM6NDYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2dvb20veG1teC5jOiBVc2UgJ2VtbXMnIGluc3RlYWQgb2YgJ2ZlbW1zJyB0byBub3QgY3Jhc2ggb24gY3B1cyB0aGF0IGRvIG5vdCBpbXBsZW1lbnQgdGhpcyAzZG5vdyBzcGVjaWZpYyBpbnN0cnVjLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20veG1teC5jOgorCSAgVXNlICdlbW1zJyBpbnN0ZWFkIG9mICdmZW1tcycgdG8gbm90IGNyYXNoIG9uIGNwdXMgdGhhdCBkbyBub3QKKwkgIGltcGxlbWVudCB0aGlzIDNkbm93IHNwZWNpZmljIGluc3RydWN0aW9uLgorCisyMDA4LTAyLTI1IDEwOjMyOjM1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9nb29tL3BsdWdpbl9pbmZvLmM6IFVzZSBleHRlbmRlZCBNTVggZm9yIGRyYXdfbGluZSgpIHRvbyBpZiBhdmFpbGFibGUsIG5vdCBvbmx5IG5vcm1hbCBNTVguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vcGx1Z2luX2luZm8uYzogKHNldE9wdGltaXplZE1ldGhvZHMpOgorCSAgVXNlIGV4dGVuZGVkIE1NWCBmb3IgZHJhd19saW5lKCkgdG9vIGlmIGF2YWlsYWJsZSwgbm90IG9ubHkKKwkgIG5vcm1hbCBNTVguCisKKzIwMDgtMDItMjUgMDY6NTA6MzEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L2pwZWcvZ3N0anBlZy5jOiBSZW1vdmUgKGNvbW1lbnRlZCBvdXQpIHNtb2tlIHR5cGVmaW5kZXIuIFRoaXMgaXMgaW4gYmFzZSBub3cuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2pwZWcvZ3N0anBlZy5jOiAocGx1Z2luX2luaXQpOgorCSAgUmVtb3ZlIChjb21tZW50ZWQgb3V0KSBzbW9rZSB0eXBlZmluZGVyLiBUaGlzIGlzIGluIGJhc2Ugbm93LgorCisyMDA4LTAyLTIzIDE1OjAyOjE1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2dvb20yazEvOiBSZW5hbWUgdGhlIGluc3RhbGxlZCBsaWJyYXJ5LCBhbmQgZG9uJ3QgcmVnaXN0ZXIgdGhlIHNhbWUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbTJrMS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSAgUmVuYW1lIHRoZSBpbnN0YWxsZWQgbGlicmFyeSwgYW5kIGRvbid0IHJlZ2lzdGVyIHRoZSBzYW1lCisJICBHVHlwZSBuYW1lIGFzIHRoZSBuZXcgZ29vbS4KKworMjAwOC0wMi0yMyAxMjoyMzozOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgQ2hlY2sgZm9yIGFuZCBkZWZpbmUgRVJST1JfQ1hYRkxBR1MgYW5kIHVzZSB0aGVtIHdoZW4gYnVpbGRpbmcKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGV4dC90YWdsaWIvTWFrZWZpbGUuYW06CisJICBDaGVjayBmb3IgYW5kIGRlZmluZSBFUlJPUl9DWFhGTEFHUyBhbmQgdXNlIHRoZW0gd2hlbiBidWlsZGluZworCSAgQysrIGNvZGUgKCM1MTY1MDkpLgorCisyMDA4LTAyLTIzIDEyOjEwOjE2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvZ29vbS86IENhbGwgb2lsX2luaXQoKSwgb3RoZXJ3aXNlIG9pbF9nZXRfY3B1X2ZsYWdzKCkgd29uJ3QgcmV0dXJuIGFueXRoaW5nIHVzZWZ1bC4gRXhwb3J0IGdvb20gZGVidWcgY2F0ZWdvcnkgc28uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnb29tX2RlYnVnKSwgKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L2dvb20vcGx1Z2luX2luZm8uYzogKGdvb21fZGVidWcpLCAoR1NUX0NBVF9ERUZBVUxUKSwKKwkgIChzZXRPcHRpbWl6ZWRNZXRob2RzKToKKwkgIENhbGwgb2lsX2luaXQoKSwgb3RoZXJ3aXNlIG9pbF9nZXRfY3B1X2ZsYWdzKCkgd29uJ3QgcmV0dXJuCisJICBhbnl0aGluZyB1c2VmdWwuIEV4cG9ydCBnb29tIGRlYnVnIGNhdGVnb3J5IHNvIHdlIGNhbiBnZXQKKwkgIHJpZCBvZiB0aGUgVkVSQk9TRSBkZWZpbmUgYW5kIHRoZSBwcmludGZzLgorCisyMDA4LTAyLTIzIDExOjUzOjI3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvZ29vbS86IENvbXBpbGUgZml4ZXMgZm9yIHg4Ni02NC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbS9nb29tc2xfaGVhcC5jOiAoYWxpZ25faXQpOgorCSAgKiBnc3QvZ29vbS9wbHVnaW5faW5mby5jOiAoc2V0T3B0aW1pemVkTWV0aG9kcyk6CisJICBDb21waWxlIGZpeGVzIGZvciB4ODYtNjQuCisKKzIwMDgtMDItMjMgMDM6MTA6NTUgKzAwMDAgIEJhc3RpZW4gTm9jZXJhIDxoYWRlc3NAaGFkZXNzLm5ldD4KKworCSAgZ3N0L2dvb20vTWFrZWZpbGUuYW06IERvbid0IGNvbXBpbGUgbGV4IG9yIHlhY2Mgb3V0cHV0cyB3aXRoIHdhcm5pbmdzLCBidXQgYWRkIG90aGVyIENGTEFHUworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9nb29tL01ha2VmaWxlLmFtOiBEb24ndCBjb21waWxlIGxleCBvciB5YWNjIG91dHB1dHMKKwkgIHdpdGggd2FybmluZ3MsIGJ1dCBhZGQgb3RoZXIgQ0ZMQUdTCisJICAqIGdzdC9nb29tL2dvb21zbC5jIChnc2xfaW5zdHJfc2V0X25hbWVzcGFjZSksCisJICAoZ3NsX2luc3RyX2FkZF9wYXJhbSksIChpZmxvd19leGVjdXRlKSwgKGdzbF9lbnRlcm5hbWVzcGFjZSksCisJICAoY2FsY3VsYXRlX2xhYmVscyksIChnc2xfcmVhZF9maWxlKToKKwkgICogZ3N0L2dvb20vZ29vbXNsX2xleC5sOgorCSAgKiBnc3QvZ29vbS9nb29tc2xfeWFjYy55OgorCSAgKiBnc3QvZ29vbS9wbHVnaW5faW5mby5jOiBSZW1vdmUgYSBmZXcgbGl2ZSBwcmludGYsIGFuZAorCSAgZnByaW50ZiwgcmVwbGFjZSBleGl0KCkgY2FsbHMgd2l0aCBnX2Fzc2VydF9ub3RfcmVhY2hlZCgpCisJICBpZiBpdCBub3Qgb3B0aW1hbCBmb3IgYSBsaWJyYXJ5CisKKzIwMDgtMDItMjMgMDI6Mzg6MDMgKzAwMDAgIEJhc3RpZW4gTm9jZXJhIDxoYWRlc3NAaGFkZXNzLm5ldD4KKworCSAgZ3N0L2dvb20vTWFrZWZpbGUuYW06IFJlbW92ZSB0aGUgd2FybmluZ3MgYmVpbmcgZGlzYWJsZWQsIGZpeCBsaW5rYWdlIG9uIHg4Niwgc3BvdHRlZCBieSBTZWJhc3RpYW4gRHLDtmdlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vTWFrZWZpbGUuYW06IFJlbW92ZSB0aGUgd2FybmluZ3MgYmVpbmcgZGlzYWJsZWQsCisJICBmaXggbGlua2FnZSBvbiB4ODYsIHNwb3R0ZWQgYnkgU2ViYXN0aWFuIERyw7ZnZQorCSAgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKwkgICogZ3N0L2dvb20vY29udm9sdmVfZnguYyAoY29udm9sdmVfaW5pdCksCisJICAoY3JlYXRlX291dHB1dF93aXRoX2JyaWdodG5lc3MpLCAoY29udm9sdmVfYXBwbHkpOgorCSAgKiBnc3QvZ29vbS9maWx0ZXJzLmMgKHpvb21GaWx0ZXJWaXN1YWxGWFdyYXBwZXJfY3JlYXRlKToKKwkgICogZ3N0L2dvb20vZ29vbXNsLmM6CisJICAqIGdzdC9nb29tL2lmcy5jIChpZnNfdXBkYXRlKSwgKGlmc192aXN1YWxmeF9jcmVhdGUpOgorCSAgKiBnc3QvZ29vbS9wbHVnaW5faW5mby5jOgorCSAgKiBnc3QvZ29vbS90ZW50YWNsZTNkLmMgKHRlbnRhY2xlX2Z4X2NyZWF0ZSk6CisJICBGaXggd2FybmluZ3MsIGFuZCBkaXNhYmxlIHRoZSBtb3RpZnMgaW4gdGhlIGNvbnZvbHZlX2Z4CisJICBwbHVnaW4gKHRoZXkgd2VyZSBjYXVzaW5nIHdhcm5pbmdzLCBhbmQgdGhleSB3ZXJlIGp1c3QKKwkgICJHb29tIiBpbiBmdW5ueSBsZXR0ZXJyaW5nKQorCisyMDA4LTAyLTIzIDAxOjUxOjM3ICswMDAwICBCYXN0aWVuIE5vY2VyYSA8aGFkZXNzQGhhZGVzcy5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogQWRkIGNoZWNrcyBmb3IgRmxleC9ZYWNjL0Jpc29uIGFuZCBvdGhlciBmdXJyeSBhbmltYWxzLCBmb3IgdGhlIG5ldyBnb29tIDJrNCBiYXNlZCBwbHVnaW4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwOC0wMi0yMyAgQmFzdGllbiBOb2NlcmEgIDxoYWRlc3NAaGFkZXNzLm5ldD4KKwkgICogY29uZmlndXJlLmFjOiBBZGQgY2hlY2tzIGZvciBGbGV4L1lhY2MvQmlzb24gYW5kIG90aGVyCisJICBmdXJyeSBhbmltYWxzLCBmb3IgdGhlIG5ldyBnb29tIDJrNCBiYXNlZCBwbHVnaW4KKwkgICogZ3N0L2dvb20vKjogVXBkYXRlIHRvIHVzZSBnb29tIDJrNCwgdXNlcyBsaWJvaWwgdG8gZGV0ZWN0CisJICBDUFUgb3B0aW1pc2F0aW9ucyAobm90IHdvcmtpbmcgeWV0KSwgbW92ZSB0aGUgb2xkIHBsdWdpbiB0by4uLgorCSAgKiBnc3QvZ29vbTJrMS8qOiAuLi4gaGVyZSwgaW4gY2FzZSBzb21lYm9keSBpcyBzaWNrIGVub3VnaAorCSAgRml4ZXMgIzUxNTA3MworCisyMDA4LTAyLTIyIDA5OjU2OjAzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IFBvc3QgdGhlIHNlcnZlciByZXNwb25zZSBjb2RlIGluIGFuIGVycm9yIG1lc3NhZ2UgaW5zdGVhZCBvZiBhIGdlbmVyaWMgJ2Vycm9yJyBtZXNzYWdlLiBGaXhlcyAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zZXR1cF9zdHJlYW1zKToKKwkgIFBvc3QgdGhlIHNlcnZlciByZXNwb25zZSBjb2RlIGluIGFuIGVycm9yIG1lc3NhZ2UgaW5zdGVhZCBvZiBhIGdlbmVyaWMKKwkgICdlcnJvcicgbWVzc2FnZS4gRml4ZXMgIzUxNzIzNy4KKworMjAwOC0wMi0yMiAwNzoyMDowMyArMDAwMCAgV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKworCSAgSW1wbGVtZW50IHplcm8tY29weSBhbmQgbWFrZSB0aGUgYnVmZmVyIHNpemUgY29uZmlndXJhYmxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogV291dGVyIENsb2V0ZW5zIDx3b3V0ZXIgYXQgbWluZCBkb3QgYmU+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKGdzdF9zb3VwX2h0dHBfc3JjX2NhbmNlbF9tZXNzYWdlKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19maW5pc2hlZF9jYiksIChnc3Rfc291cF9odHRwX3NyY19jaHVua19mcmVlKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19jaHVua19hbGxvY2F0b3IpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX2dvdF9jaHVua19jYiksIChnc3Rfc291cF9odHRwX3NyY19jcmVhdGUpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX3N0YXJ0KSwgKGdzdF9zb3VwX2h0dHBfc3JjX3NldF9wcm94eSk6CisJICAqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmg6CisJICBJbXBsZW1lbnQgemVyby1jb3B5IGFuZCBtYWtlIHRoZSBidWZmZXIgc2l6ZSBjb25maWd1cmFibGUuCisJICBQcmVmaXggcHJveHkgVVJJcyB3aXRoICJodHRwOi8vIiBpZiB0aGV5IGRvbid0IHN0YXJ0IHdpdGggaXQKKwkgIGFscmVhZHkgYW5kIGNhdGNoIGVycm9ycyBlYXJsaWVyLCBmaXhlcyBoYW5naW5nIGluIHNvbWUgc2l0dWF0aW9ucy4KKwkgIEZpeGVzIGJ1ZyAjNTE0OTQ4LgorCisyMDA4LTAyLTIyIDA2OjIyOjM5ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOiBJZ25vcmUgZ2NvbmZhdWRpb3NyYyBmb3IgdGhlIHN0YXRlcyB1bml0IHRlc3QgdG9vLiBJdCB3aWxsIGZhbGxiYWNrIHRvIGFsc2FzcmMgaWYgdGhlIGdjb25mIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgSWdub3JlIGdjb25mYXVkaW9zcmMgZm9yIHRoZSBzdGF0ZXMgdW5pdCB0ZXN0IHRvby4gSXQgd2lsbCBmYWxsYmFjaworCSAgdG8gYWxzYXNyYyBpZiB0aGUgZ2NvbmYgc2V0dGluZ3MgY2FuJ3QgYmUgcmVhZCBhbmQgbm90IGV2ZXJ5Ym9keSBoYXMKKwkgIGFsc2EuCisKKzIwMDgtMDItMjIgMDY6MDY6MDYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLio6IEFsd2F5cyByZXBvcnQgdGhlIGR1cmF0aW9uIGlmIHdlIGtub3cgaXQgaW4gcHVzaCBtb2RlIGFuZCBkb24ndCByZXR1cm4gMCBqdXN0IHRvIG1ha2UgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IChnc3Rfd2F2cGFja19wYXJzZV9zcmNfcXVlcnkpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2NyZWF0ZV9zcmNfcGFkKToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmg6CisJICBBbHdheXMgcmVwb3J0IHRoZSBkdXJhdGlvbiBpZiB3ZSBrbm93IGl0IGluIHB1c2ggbW9kZSBhbmQgZG9uJ3QKKwkgIHJldHVybiAwIGp1c3QgdG8gbWFrZSB0b3RlbSBiZWxpZXZlIHdlIGNhbid0IHNlZWsgaW4gcHVzaCBtb2RlLgorCSAgTmV3ZXIgdG90ZW0gdmVyc2lvbiB1c2UgdGhlIFNFRUtJTkcgcXVlcnkgd2hpY2ggcHJvcGVybHkgcmVwb3J0cworCSAgaWYgd2UgY2FuIHNlZWsgb3Igbm90LgorCisyMDA4LTAyLTIyIDA1OjM5OjAxICswMDAwICBKZW5zIEdyYW5zZXVlciA8amVuc2dyQGdteC5uZXQ+CisKKwkgIHRlc3RzL2V4YW1wbGVzL2VxdWFsaXplci9kZW1vLmM6IEM4OSBmaXgsIG1vdmluZyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYmxvY2suIEZpeGVzIGJ1ZyAjNTE3OTMzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSmVucyBHcmFuc2V1ZXIgPGplbnNnciBhdCBnbXggZG90IG5ldD4KKwkgICogdGVzdHMvZXhhbXBsZXMvZXF1YWxpemVyL2RlbW8uYzogKG1haW4pOgorCSAgQzg5IGZpeCwgbW92aW5nIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyB0byB0aGUgYmVnaW5uaW5nIG9mCisJICB0aGUgYmxvY2suIEZpeGVzIGJ1ZyAjNTE3OTMzLgorCisyMDA4LTAyLTIxIDIzOjQ3OjM3ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBCYWNrIHRvIGRldmVsb3BtZW50Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudC4uLgorCis9PT0gcmVsZWFzZSAwLjEwLjcgPT09CisKKzIwMDgtMDItMjEgMDA6MDk6MDcgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogcG8vTElOR1VBUzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMC4xMC43IC0gUmVkIERvb3IgQmxhY2sKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUmVsZWFzZSAwLjEwLjcgLSBSZWQgRG9vciBCbGFjaworCisyMDA4LTAyLTIwIDIyOjUxOjA4ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDA4LTAyLTE5IDEwOjQ3OjIwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9hbHBoYS9NYWtlZmlsZS5hbTogTGluayBhbHBoYSBwbHVnaW4gd2l0aCBsaWJnc3RiYXNlLiBGaXhlcyBidWcgIzUxNzM4Ni4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYWxwaGEvTWFrZWZpbGUuYW06CisJICBMaW5rIGFscGhhIHBsdWdpbiB3aXRoIGxpYmdzdGJhc2UuIEZpeGVzIGJ1ZyAjNTE3Mzg2LgorCisyMDA4LTAyLTE4IDExOjEzOjM1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IEluaXQgdmFsdWVzIHRvIC0xIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgMCB2YWx1ZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19jcmVhdGVfc3RyZWFtKToKKwkgIEluaXQgdmFsdWVzIHRvIC0xIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgMCB2YWx1ZS4KKwkgIEZpeGVzICM1MTY1MjQuCisKKzIwMDgtMDItMTQgMTQ6NTA6MzAgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vc3BlY3RydW0tZXhhbXBsZS5jOiBBZGQgbWlzc2luZyBpbmNsdWRlIHRvIGZpeCBjb21waWxhdGlvbiB3aGVuIGxpYnhtbCB1c2FnZSBpcyBkaXNhYmxlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9zcGVjdHJ1bS1leGFtcGxlLmM6CisJICBBZGQgbWlzc2luZyBpbmNsdWRlIHRvIGZpeCBjb21waWxhdGlvbiB3aGVuIGxpYnhtbCB1c2FnZSBpcyBkaXNhYmxlZC4KKwkgIEZpeGVzOiAjNTE2MzcxCisKKzIwMDgtMDItMTIgMjM6Mzg6MTkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIGZpeGVzOiAjNTE0ODg5CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHBhdGNoIGJ5OiAgV2ltIFRheW1hbnMgIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisJICBmaXhlczogIzUxNDg4OQorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSAgRml4IHZhcmlvdXMgbGVha3Mgc2hvd24gdXAgaW4gdmFsZ3JpbmQKKwkgIC0gZnJlZSBzcHJvcHMgYW5kIGJ1ZmZlciBpbiBlcnJvciBjYXNlcyBpbiBIMjY0IHBheWxvYWRlcgorCSAgLSBmaXggbGVhayBpbiBtcDRnIGRlcGF5bG9hZGVyIHdoZW4gY29uc3RydWN0aW9uIHRoZSBjYXBzCisJICAtIGRvbid0IGxlYWsgY29uZmlnIHN0cmluZyBpbiB0aGUgbXA0ZyBwYXlsb2FkZXIKKwkgIC0gZG9uJ3QgbGVhayBidWZmZXJzIGFuZCBoZWFkZXJzIGluIHRoZW9yYSBhbmQgdm9yYmlzIHBheWxvYWRlcnMKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIEZpeCB0aGUgUlRQIGRhdGEgdGVzdAorCSAgLSBBY3R1YWxseSBzZW5kIHZhbGlkIGFtciBkYXRhIHRvIHRoZSBwYXlsb2FkZXIgaW5zdGVhZCBvZiAyMAorCSAgemVyby1ieXRlcworCSAgLSBUaGUgbXA0ZyBwYXlsb2FkZXIgZXhwZWN0cyBjb2RlY19kYXRhIG9uIHRoZSBjYXBzCisKKzIwMDgtMDItMTIgMjE6MzY6NDAgKzAwMDAgIFPDqWJhc3RpZW4gTW91dHRlIDxzZWJhc3RpZW5AbW91dHRlLm5ldD4KKworCSAgd2luMzIvTUFOSUZFU1Q6IEFkZCBsaWJnc3RwbmcuZHNwIHRvIE1BTklGRVNULgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHdpbjMyL01BTklGRVNUOgorCSAgQWRkIGxpYmdzdHBuZy5kc3AgdG8gTUFOSUZFU1QuCisJICAqIHdpbjMyL3ZzNi9saWJnc3RhdWRpb2Z4LmRzcDoKKwkgIEFkZCBuZXcgc291cmNlIGZpbGVzIHRvIFZTIHByb2plY3QgZmlsZS4KKworMjAwOC0wMi0xMiAxMzozNDo1MiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6IEluaXRpYWxpc2UgdmFyaWFibGVzIHdoZW4gb3BlbmluZyB0aGUgWCBkaXNwbGF5IHJhdGhlciB0aGFuIGluIF9zdGFydCgpLCBhcyB0aGUgZGlzcGxheSBjYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICBJbml0aWFsaXNlIHZhcmlhYmxlcyB3aGVuIG9wZW5pbmcgdGhlIFggZGlzcGxheSByYXRoZXIKKwkgIHRoYW4gaW4gX3N0YXJ0KCksIGFzIHRoZSBkaXNwbGF5IGNhbiBiZSBvcGVuZWQgYmVmb3JlIHRoYXQuCisJICBGaXhlczogIzUxNTk4NQorCisyMDA4LTAyLTEyIDEyOjIyOjQ4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6IFByb3Blcmx5IGNoYWluIHVwIGZpbmFsaXplIGZ1bmN0aW9ucy4gRml4ZXMgYnVnICM1MTU5ODAuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkgIChnc3RfZGRyYXdzdXJmYWNlX2NsYXNzX2luaXQpLCAoZ3N0X2RkcmF3c3VyZmFjZV9maW5hbGl6ZSksCisJICAoZ3N0X2RpcmVjdGRyYXdfc2lua19maW5hbGl6ZSk6CisJICBQcm9wZXJseSBjaGFpbiB1cCBmaW5hbGl6ZSBmdW5jdGlvbnMuIEZpeGVzIGJ1ZyAjNTE1OTgwLgorCisyMDA4LTAyLTEyIDExOjM4OjU0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogQ2hhaW4gdXAgdGhlIGZpbmFsaXplIGZ1bmN0aW9ucy4gRml4ZXMgYnVnICM1MTU5ODQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJfYnVmZmVyX2ZpbmFsaXplKSwKKwkgIChnc3RfdjRsMl9idWZmZXJfY2xhc3NfaW5pdCksIChnc3RfdjRsMl9idWZmZXJfcG9vbF9maW5hbGl6ZSksCisJICAoZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfY2xhc3NfaW5pdCk6CisJICBDaGFpbiB1cCB0aGUgZmluYWxpemUgZnVuY3Rpb25zLiBGaXhlcyBidWcgIzUxNTk4NC4KKworMjAwOC0wMi0xMiAxMToxNDozNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzogQ2hhaW4gdXAgaW4gdGhlIGZpbmFsaXplIGZ1bmN0aW9uIGZvciBvdXIgY3VzdG9tIGJ1ZmZlciBzdWItY2xhc3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmM6CisJICBDaGFpbiB1cCBpbiB0aGUgZmluYWxpemUgZnVuY3Rpb24gZm9yIG91ciBjdXN0b20KKwkgIGJ1ZmZlciBzdWItY2xhc3MuCisJICBQYXRjaCBieTogU2ViYXN0aWFuIERyw7ZnZSAgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKwkgIEZpeGVzOiAjNTE1NzA2CisKKzIwMDgtMDItMTIgMTE6MTI6NDMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2RlYnVnL2VmZW5jZS5jOiBQcm9wZXJseSBjaGFpbiB1cCBmaW5hbGl6ZSBtZXRob2QuIEZpeGVzIGJ1ZyAjNTE1OTc5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWJ1Zy9lZmVuY2UuYzogKGdzdF9mZW5jZWRfYnVmZmVyX2ZpbmFsaXplKSwKKwkgIChnc3RfZmVuY2VkX2J1ZmZlcl9jbGFzc19pbml0KToKKwkgIFByb3Blcmx5IGNoYWluIHVwIGZpbmFsaXplIG1ldGhvZC4gRml4ZXMgYnVnICM1MTU5NzkuCisKKzIwMDgtMDItMTIgMTE6MDk6MDggKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiBGcmVlIGFsbG9jYXRlZCBEYW1hZ2UgbWVtb3J5IGJlZm9yZSBjbG9zaW5nIG91ciBjb25uZWN0aW9uIHRvIHRoZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICBGcmVlIGFsbG9jYXRlZCBEYW1hZ2UgbWVtb3J5IGJlZm9yZSBjbG9zaW5nIG91ciBjb25uZWN0aW9uIHRvIHRoZQorCSAgWCBzZXJ2ZXIuIEZpeGVzOiAjNTE1NzA2CisKKzIwMDgtMDItMTIgMDU6MjE6NDYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzogSW5jbHVkZSBnbGliL2dwcmludGYuaCBmb3IgZ192YXNwcmludGYoKS4gRml4ZXMgYnVnICM1MTU1NjQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkgIEluY2x1ZGUgZ2xpYi9ncHJpbnRmLmggZm9yIGdfdmFzcHJpbnRmKCkuIEZpeGVzIGJ1ZyAjNTE1NTY0LgorCisyMDA4LTAyLTEyIDA1OjE0OjE2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIEFkZCBhIGZldyBsaWJqcGVnIHN1cHByZXNzaW9ucyBhbmQgaW5pdGlhbGl6ZSBhIHZhcmlhYmxlIHRvIG1ha2Ugc21va2VlbmMgdmFsZ3JpbmQgY2xlYW4uIEZpeGVzIGJ1ZyAjNTE1NzAxLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmM6IChnc3Rfc21va2VlbmNfY2hhaW4pOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZ3N0LXBsdWdpbnMtZ29vZC5zdXBwOgorCSAgQWRkIGEgZmV3IGxpYmpwZWcgc3VwcHJlc3Npb25zIGFuZCBpbml0aWFsaXplIGEgdmFyaWFibGUgdG8KKwkgIG1ha2Ugc21va2VlbmMgdmFsZ3JpbmQgY2xlYW4uIEZpeGVzIGJ1ZyAjNTE1NzAxLgorCisyMDA4LTAyLTExIDIxOjI0OjMwICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBSZXZlcnQgcGF0Y2ggd2hpY2ggc2VuZHMgdGltZXN0YW1wcyBvbmx5IG9uIGtleWZyYW1lcywgYXMgaXQgYnJlYWtzIHBsYXliYWNrIHdpdGggY3VycmVudCBnc3QtLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgUmV2ZXJ0IHBhdGNoIHdoaWNoIHNlbmRzIHRpbWVzdGFtcHMgb25seSBvbiBrZXlmcmFtZXMsIGFzIGl0CisJICBicmVha3MgcGxheWJhY2sgd2l0aCBjdXJyZW50IGdzdC1mZm1wZWcuCisJICBGaXhlczogIzUxNTU2MgorCisyMDA4LTAyLTExIDE0OjAxOjUyICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIENsb3NlIHNvbWUgbWVtb3J5IGxlYWtzIHNwb3R0ZWQgYnkgdGhlIHVuaXQgdGVzdC4gRml4ZXMgYnVnICM1MTU2OTcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzogKGdzdF9tdWx0aV9maWxlX3NyY19jcmVhdGUpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWx0aWZpbGUuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIENsb3NlIHNvbWUgbWVtb3J5IGxlYWtzIHNwb3R0ZWQgYnkgdGhlIHVuaXQgdGVzdC4gRml4ZXMgYnVnICM1MTU2OTcuCisKKzIwMDgtMDItMTEgMTM6NDg6MDMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L2djb25mL2djb25mLmM6IFVzZSBhbmQgdW5zZXQgdGhlIEdFcnJvciB3aGVuIHBpcGVsaW5lIGNyZWF0aW9uIGZhaWxzIGluc3RlYWQgb2Ygc2ltcGx5IGxlYWtpbmcgaXQuIEZpeGVzIGJ1ZyAjNTE1Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2djb25mL2djb25mLmM6IChnc3RfZ2NvbmZfcmVuZGVyX2Jpbl93aXRoX2RlZmF1bHQpOgorCSAgVXNlIGFuZCB1bnNldCB0aGUgR0Vycm9yIHdoZW4gcGlwZWxpbmUgY3JlYXRpb24gZmFpbHMgaW5zdGVhZCBvZgorCSAgc2ltcGx5IGxlYWtpbmcgaXQuIEZpeGVzIGJ1ZyAjNTE1NzA0LgorCisyMDA4LTAyLTEwIDEwOjQ2OjEzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9hdWRpb2Z4LzogRml4IGxvbmcgZGVzY3JpcHRpb24gb2YgYXVkaW9meCBlbGVtZW50cy4gRml4ZXMgYnVnICM1MTU0NTcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5LmM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmJhbmQuYzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0LmM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2xpbWl0LmM6CisJICBGaXggbG9uZyBkZXNjcmlwdGlvbiBvZiBhdWRpb2Z4IGVsZW1lbnRzLiBGaXhlcyBidWcgIzUxNTQ1Ny4KKworMjAwOC0wMi0wOSAwMTo0NTozMiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIEFkZCBhIHNpbXBsZSBleGFtcGxlIGFwcGxpY2F0aW9uIGZvciB0aGUgc3BlY3RydW0gZWxlbWVudCwgaW5jbHVkZSBpdCBpbiB0aGUgZG9jcywgYW5kIGZpeCBzb21lIGRvY3VtZW50YXRpb24gYW1iaWd1aS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICAqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtLy5jdnNpZ25vcmU6CisJICAqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9zcGVjdHJ1bS1leGFtcGxlLmM6CisJICBBZGQgYSBzaW1wbGUgZXhhbXBsZSBhcHBsaWNhdGlvbiBmb3IgdGhlIHNwZWN0cnVtIGVsZW1lbnQsIGluY2x1ZGUgaXQKKwkgIGluIHRoZSBkb2NzLCBhbmQgZml4IHNvbWUgZG9jdW1lbnRhdGlvbiBhbWJpZ3VpdGllcy4KKwkgIEZpeGVzOiAjMzQ4MDg1CisKKzIwMDgtMDItMDkgMDA6MTU6MjUgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvOiBGaXggaW5jbHVkZXMgb3JkZXIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3BlY3RydW0vTWFrZWZpbGUuYW06CisJICBGaXggaW5jbHVkZXMgb3JkZXIKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBFeGNsdWRlIHY0bDJzcmMgZnJvbSB0aGUgc3RhdGVzIHRlc3QgLSBpdCB0YWtlcyB0b28gbG9uZyB0byBzdGFydC4KKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvc3BlY3RydW0uYzoKKwkgIE1ha2UgdGhlIHRlc3QgcnVuIHByb3Blcmx5IHdpdGggQ0tfRk9SSz1ubworCisyMDA4LTAyLTA4IDE1OjMyOjM2ICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIGFkZCAzIG5ldyBwbHVnaW5zIHRvIHNwZWMgZmlsZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgMyBuZXcgcGx1Z2lucyB0byBzcGVjIGZpbGUKKworMjAwOC0wMi0wOCAxNToyNzo1MSArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBnc3QvYXVkaW9meC9NYWtlZmlsZS5hbToKKwkgIGFkZCBtaXNzaW5nIGhlYWRlciBmaWxlcyBmb3IgZGlzdGluZworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgbWlzc2luZyBoZWFkZXIgZmlsZXMgZm9yIGRpc3RpbmcKKworMjAwOC0wMi0wOCAxNToyMDozMSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiBGbGFnIGtleWZyYW1lIGFuZCBkZWx0YSB1bml0cyBjb3JyZWN0bHkgd2hlbiBkZWFsaWduIHdpdGggYQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA4LTAyLTA4ICBKdWxpZW4gTW91dHRlICA8anVsaWVuQGZsdWVuZG8uY29tPgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayk6IEZsYWcKKwkgIGtleWZyYW1lIGFuZCBkZWx0YSB1bml0cyBjb3JyZWN0bHkgd2hlbiBkZWFsaWduIHdpdGggYQorCSAgQmxvY2tHcm91cC4KKwkgIEZpeGVzOiAjNTE0Mzk3CisKKzIwMDgtMDItMDggMTA6MTk6MzMgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOiBTcGVsbCB0aGUgbmV3IHRlc3RzIGNvcnJlY3RseSBpbiAuY3ZzaWdub3JlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgIFNwZWxsIHRoZSBuZXcgdGVzdHMgY29ycmVjdGx5IGluIC5jdnNpZ25vcmUKKworMjAwOC0wMi0wOCAxMDowOTozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzogTmVlZCB0byB1c2UgZ3NpemUgaGVyZSBmb3IgdGhlIHNpemUsIGZpeGVzIGNvbXBpbGVyIHdhcm5pbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzogKGdzdF9tdWx0aV9maWxlX3NyY19jcmVhdGUpOgorCSAgTmVlZCB0byB1c2UgZ3NpemUgaGVyZSBmb3IgdGhlIHNpemUsIGZpeGVzIGNvbXBpbGVyIHdhcm5pbmcuCisJICAqIHRlc3RzL2V4YW1wbGVzL2VxdWFsaXplci8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtLy5jdnNpZ25vcmU6CisJICAqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL01ha2VmaWxlLmFtOgorCSAgQWRkIG1pc3NpbmcgZmlsZXMgdG8gZml4IHRoZSBidWlsZC4KKworMjAwOC0wMi0wOCAwNDoyNTozMiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIE1vdmUgbXVsdGlmaWxlIHBsdWdpbiBmcm9tIC1iYWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOgorCSAgTW92ZSBtdWx0aWZpbGUgcGx1Z2luIGZyb20gLWJhZC4KKwkgIEZpeGVzOiAjNDkwMjgzCisKKzIwMDgtMDItMDggMDM6NDQ6MTIgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBnc3QvbXVsdGlmaWxlLzogVXNlIGdfZmlsZV9bc2ddZXRfY29udGVudHMoKSBpbnN0ZWFkIG9mIHVzaW5nIHN0ZGlvIGZ1bmN0aW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgICogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkgIFVzZSBnX2ZpbGVfW3NnXWV0X2NvbnRlbnRzKCkgaW5zdGVhZCBvZiB1c2luZyBzdGRpbyBmdW5jdGlvbnMuCisJICBTaG91bGQgYmUgbGVzcyBlcnJvciBwcm9uZS4KKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsdGlmaWxlLmM6CisJICBDcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHVzaW5nIHN0YW5kYXJkIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mCisJICBjcmVhdGluZyBhIGRpcmVjdG9yeSBpbiB0aGUgY3VycmVudCBkaXIuCisKKzIwMDgtMDItMDggMDM6Mjg6NTcgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBNb3ZlIHNwZWN0cnVtIHBsdWdpbiBmcm9tIC1iYWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkgICogZ3N0L3NwZWN0cnVtL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgICogdGVzdHMvZXhhbXBsZXMvTWFrZWZpbGUuYW06CisJICBNb3ZlIHNwZWN0cnVtIHBsdWdpbiBmcm9tIC1iYWQuCisJICBNb3ZlIGV4YW1wbGVzIGludG8gdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0uCisKKzIwMDgtMDItMDggMDI6NTY6MTIgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJICBNZW50aW9uIGJ1ZyA0MTU2MjcgZml4ZWQgd2l0aCBwcmV2aW91cyBjb21taXQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgTWVudGlvbiBidWcgNDE1NjI3IGZpeGVkIHdpdGggcHJldmlvdXMgY29tbWl0CisKKzIwMDgtMDItMDggMDI6NDk6MjAgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBNb3ZlIHRoZSBlcXVhbGl6ZXIgcGx1Z2luIGFjcm9zcyBmcm9tIC1iYWQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSAgKiBnc3QvZXF1YWxpemVyL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvZXhhbXBsZXMvTWFrZWZpbGUuYW06CisJICBNb3ZlIHRoZSBlcXVhbGl6ZXIgcGx1Z2luIGFjcm9zcyBmcm9tIC1iYWQKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgIEFkZCBlcXVhbGl6ZXIsIGF1ZGlvc2luY3diYW5kIGFuZCBhdWRpb3NpbmN3bGltaXQKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvZXF1YWxpemVyLmM6CisJICBGaXggY29tcGlsZXIgd2FybmluZ3MKKworMjAwOC0wMi0wOCAwMjo0ODo1NCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy4qOiBSZW1vdmUgZXF1YWxpemVyIHBsdWdpbiBkb2NzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSAgUmVtb3ZlIGVxdWFsaXplciBwbHVnaW4gZG9jcworCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIEFkZCBHU1RfT1BUSU9OX0NGTEFHUywgdG8gZ2V0IC1XZXJyb3IgLVdhbGwgaW50byB0aGUgdGVzdHMgYXMgZm9yCisJICBvdGhlciBtb2R1bGVzLgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWx0aWZpbGUuYzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2xpbWl0ZXIuYzoKKwkgIEZpeCBjb21waWxlciB3YXJuaW5ncyBmcm9tIC1XYWxsIC1XZXJyb3IKKworMjAwOC0wMi0wOCAwMTowNzowMiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogT25seSBidWlsZCB3aXRoIERJU0FCTEVfREVQUkVDQVRFRCBkdXJpbmcgdGhlIENWUyBjeWNsZS4gUHJlLXJlbGVhc2VzIGFyZSB0cmVhdGVkIGxpa2UgcmVsZWFzZXMgYW5kIGJ1aS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIE9ubHkgYnVpbGQgd2l0aCBESVNBQkxFX0RFUFJFQ0FURUQgZHVyaW5nIHRoZSBDVlMgY3ljbGUuIFByZS1yZWxlYXNlcworCSAgYXJlIHRyZWF0ZWQgbGlrZSByZWxlYXNlcyBhbmQgYnVpbGQgd2l0aG91dCBpdC4KKworMjAwOC0wMi0wNyAyMTo1Nzo1NCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIE1vdmUgdGhlIGxwd3NpbmMgYW5kIGJwd3NpbmMgZWxlbWVudHMgZnJvbSBnc3QtcGx1Z2lucy1iYWQgaW50byB0aGUgYXVkaW9meCBwbHVnaW4sIGFuZCByZW5hbWUgdG8gYXVkaW93c2luY2xpbWl0IGFuZC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkgICogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZnguYzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuaDoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2xpbWl0LmM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5oOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW93c2luY2JhbmQuYzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW93c2luY2xpbWl0LmM6CisJICBNb3ZlIHRoZSBscHdzaW5jIGFuZCBicHdzaW5jIGVsZW1lbnRzIGZyb20gZ3N0LXBsdWdpbnMtYmFkIGludG8KKwkgIHRoZSBhdWRpb2Z4IHBsdWdpbiwgYW5kIHJlbmFtZSB0byBhdWRpb3dzaW5jbGltaXQgYW5kIGF1ZGlvd3NpbmNiYW5kCisJICByZXNwZWN0aXZlbHkuCisJICBGaXhlczogIzQ2NzY2NgorCisyMDA4LTAyLTA3IDIxOjE3OjM2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBSZXR1cm4gR1NUX0ZMT1dfTk9UX05FR09USUFURUQgaWYgd2UgZ2V0IGEgYnVmZmVyIHdpdGhvdXQgY2FwcywgYW5kIGFkZCBhIHNvbWV3aGF0IHVzZWZ1bCBkZWJ1ZyBtZXNzYWdlLiBQbHVzIHRlc3QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6IChnc3RfaWN5ZGVtdXhfY2hhaW4pOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pY3lkZW11eC5jOgorCSAgUmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEIGlmIHdlIGdldCBhIGJ1ZmZlciB3aXRob3V0CisJICBjYXBzLCBhbmQgYWRkIGEgc29tZXdoYXQgdXNlZnVsIGRlYnVnIG1lc3NhZ2UuIFBsdXMgdGVzdC4KKworMjAwOC0wMi0wNyAxOToxMzo1NiArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IEluY2x1ZGUgdW5pc3RkLmggb25seSBpZiBIQVZFX1VOSVNURF9IIGlzIGRlZmluZWQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBJbmNsdWRlIHVuaXN0ZC5oIG9ubHkgaWYgSEFWRV9VTklTVERfSCBpcyBkZWZpbmVkCisJICAqIHdpbjMyL2NvbW1vbi9jb25maWcuaC5pbjoKKwkgICogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgRGVmaW5lIHNvY2tsZW5fdCBhcyBpdCBzZWVtcyBpdCdzIG5vdCBkZWZpbmVkIGluIGRlZmF1bHQKKwkgIFZpc3VhbCBTdHVkaW8gaGVhZGVycy4KKwkgICogd2luMzIvdnM2L2xpYmdzdGFscGhhLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdGFwZXRhZy5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RhdmkuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0cnRwLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHJ0c3AuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0dmlkZW9taXhlci5kc3A6CisJICBVcGRhdGUgcHJvamVjdCBmaWxlIGRlcGVuZGVuY2llcyBhbmQgYWRkIG5ldyBzb3VyY2UgZmlsZXMKKworMjAwOC0wMi0wNyAxNjozODo1NSArMDAwMCAgQmphcm5lIFJvc2VuZ3JlbiA8Ymphcm5lQGF4aXMuY29tPgorCisJICBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOiBEb24ndCBsZWFrIGJ1ZmZlcnMgd2hlbiB3ZSBkb24ndCBwdXNoIHRoZW0gZG93bnN0cmVhbS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEJqYXJuZSBSb3NlbmdyZW4gPGJqYXJuZSBhdCBheGlzIGRvdCBjb20+CisJICAqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6IChnc3RfZWJtbF93cml0ZV9lbGVtZW50X3B1c2gpOgorCSAgRG9uJ3QgbGVhayBidWZmZXJzIHdoZW4gd2UgZG9uJ3QgcHVzaCB0aGVtIGRvd25zdHJlYW0uCisJICBGaXhlcyBidWcgIzUxNDk2NS4KKworMjAwOC0wMi0wNyAxMzo0ODoyMCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzogQWRkIGEgZml4bWUgY29tbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIEFkZCBhIGZpeG1lIGNvbW1lbnQuCisJICAqIGdzdC9zZWxlY3Rvci9nc3RvdXRwdXRzZWxlY3Rvci5jOgorCSAgRml4IHNhbWUgbGVhayBhcyBpbiBpbnB1dC1zZWxlY3Rvci4KKwkgICogdGVzdHMvaWNsZXMvb3V0cHV0LXNlbGVjdG9yLXRlc3QuYzoKKwkgIEltcHJvdmUgdGhlIHRlc3QuCisKKzIwMDgtMDItMDcgMTM6NDE6MTEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IEltcHJvdmUgdGhlIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBJbXByb3ZlIHRoZSBkb2NzLgorCisyMDA4LTAyLTA3IDEwOjE3OjE0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IEJ1bXAgcmVxdWlyZW1lbnRzIHRvIChnb29kKSByZWxlYXNlZCB2ZXJzaW9ucyB0byBhdm9pZCBjb25mdXNpb24gYW5kIG1ha2UgaW1wbGljaXQgY29yZSByZXF1aXJlbWVudCBleHAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBCdW1wIHJlcXVpcmVtZW50cyB0byAoZ29vZCkgcmVsZWFzZWQgdmVyc2lvbnMgdG8gYXZvaWQKKwkgIGNvbmZ1c2lvbiBhbmQgbWFrZSBpbXBsaWNpdCBjb3JlIHJlcXVpcmVtZW50IGV4cGxpY2l0LgorCisyMDA4LTAyLTA3IDEwOjA0OjAxICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy5jOiBGaXggdHlwbyBpbiB0aGUgbG9uZyBkZXNjcmlwdGlvbiBvZiB0aGUgZWxlbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzoKKwkgIEZpeCB0eXBvIGluIHRoZSBsb25nIGRlc2NyaXB0aW9uIG9mIHRoZSBlbGVtZW50LgorCisyMDA4LTAyLTA2IDIzOjQ0OjQzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgUmVuYW1lIGF1ZGlvY2hlYnlzaGV2ZnJlcWJhbmQgLT4gYXVkaW9jaGViYmFuZCBhbmQgYXVkaW9jaGVieXNoZXZmcmVxbGltaXQgLT4gYXVkaW9jaGVibGltaXQgYW5kIGRvIHRoZSByZXF1aXNpdGUgQ1ZTLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSAgKiBnc3QvYXVkaW9meC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmg6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmxpbWl0LmM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmxpbWl0Lmg6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYnlzaGV2ZnJlcWJhbmQuYzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9jaGVieXNoZXZmcmVxYmFuZC5oOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJ5c2hldmZyZXFsaW1pdC5jOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJ5c2hldmZyZXFsaW1pdC5oOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2Z4LmM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2NoZWJiYW5kLmM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYmxpbWl0LmM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYnlzaGV2ZnJlcWJhbmQuYzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9jaGVieXNoZXZmcmVxbGltaXQuYzoKKwkgIFJlbmFtZSBhdWRpb2NoZWJ5c2hldmZyZXFiYW5kIC0+IGF1ZGlvY2hlYmJhbmQgYW5kCisJICBhdWRpb2NoZWJ5c2hldmZyZXFsaW1pdCAtPiBhdWRpb2NoZWJsaW1pdCBhbmQgZG8gdGhlIHJlcXVpc2l0ZSBDVlMKKwkgIHN1cmdlcnkuCisJICBDbG9zZXM6ICM0OTE4MTEKKworMjAwOC0wMi0wNiAxMTowNzo0NyArMDAwMCAgV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogRml4IG1lbW9yeSBsZWFrIGFuZCBpbXByb3ZlIGRlYnVnZ2luZyBhIGJpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFdvdXRlciBDbG9ldGVucyA8d291dGVyIGF0IG1pbmQgZG90IGJlPgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOiAoZ3N0X3NvdXBfaHR0cF9zcmNfZ290X2NodW5rX2NiKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19jcmVhdGUpOgorCSAgRml4IG1lbW9yeSBsZWFrIGFuZCBpbXByb3ZlIGRlYnVnZ2luZyBhIGJpdC4KKworMjAwOC0wMi0wNSAxNzo1OToyNCArMDAwMCAgb3JqYW4gPG9yamFuZkBheGlzLmNvbT4KKworCSAgZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogRml4IGNhcHMgbWVtb3J5IGxlYWsuIEZpeGVzICM1MTQ1NzMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBvcmphbiA8b3JqYW5mIGF0IGF4aXMgZG90IGNvbT4KKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogKGdzdF9tdWx0aXBhcnRfbXV4X2NvbGxlY3RlZCk6CisJICBGaXggY2FwcyBtZW1vcnkgbGVhay4gRml4ZXMgIzUxNDU3My4KKworMjAwOC0wMi0wNCAxMjowNzoxNCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBJZiB0aGVyZSdzIG5vIGVudHJpZXMgaW4gdGhlIHN1YmluZGV4LCBkb24ndCB0cnkgdG8gZG8gYW55dGhpbmcgc3R1cGlkLCBqdXN0IHJldHVybi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3BhcnNlX3N1YmluZGV4KToKKwkgIElmIHRoZXJlJ3Mgbm8gZW50cmllcyBpbiB0aGUgc3ViaW5kZXgsIGRvbid0IHRyeSB0byBkbyBhbnl0aGluZyBzdHVwaWQsCisJICBqdXN0IHJldHVybi4KKworMjAwOC0wMi0wMiAxOTo0Nzo1MCArMDAwMCAgSm9obiBNaWxsaWtpbiA8am1pbGxpa2luQGdtYWlsLmNvbT4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiBGaXggZXh0cmFjdGlvbiBvZiBwaWN0dXJlIGJsb2NrcyB3aXRoIG5ld2VyIGxpYmZsYWMgdmVyc2lvbnMgYWdhaW46CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBKb2huIE1pbGxpa2luIDxqbWlsbGlraW4gYXQgZ21haWwgZG90IGNvbT4KKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfZGVjX3NjYW5fZm9yX2xhc3RfYmxvY2spLAorCSAgKGdzdF9mbGFjX2V4dHJhY3RfcGljdHVyZV9idWZmZXIpLCAoZ3N0X2ZsYWNfZGVjX21ldGFkYXRhX2NhbGxiYWNrKToKKwkgIEZpeCBleHRyYWN0aW9uIG9mIHBpY3R1cmUgYmxvY2tzIHdpdGggbmV3ZXIgbGliZmxhYyB2ZXJzaW9ucyBhZ2FpbjoKKwkgIEZMQUNfX01FVEFEQVRBX1RZUEVfUElDVFVSRSBpcyBhbiBlbnVtLCBub3QgYSBkZWZpbmUgKCM1MTM2MjgpLgorCisyMDA4LTAyLTAyIDE4OjA2OjE5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogQWRkIHJ0cC1wYXlsb2FkaW5nIHRlc3QgdG8gVkFMR1JJTkRfVE9fRklYLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgQWRkIHJ0cC1wYXlsb2FkaW5nIHRlc3QgdG8gVkFMR1JJTkRfVE9fRklYLgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSAgQWRkIHNlbWljb2xvbnMgYWZ0ZXIgR1NUX1RFU1RfRU5EIHNvIGdzdC1pbmRlbnQgZ2V0cyB0aGUKKwkgIGZvcm1hdHRpbmcgcmlnaHQ7IG1ha2UgdGVzdCBsZXNzIHZlcmJvc2UgaW4gZ2VuZXJhbCwgYnV0CisJICBtb3JlIHZlcmJvc2UgaW4gdGhlIGVycm9yIGNhc2UgKHdoaWNoIHNob3VsZCBwcm9iYWJseQorCSAgbWFrZSB0aGUgdGVzdCBmYWlsIGFueXdheSkuCisKKzIwMDgtMDItMDEgMTg6Mjk6MjEgKzAwMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkgIEFkZCBkb2N1bWVudGF0aW9uIGZvciBhdmlzdWJ0aXRsZSBhbmQgY2hhbmdlIGNsYXNzIHRvCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkgIEFkZCBkb2N1bWVudGF0aW9uIGZvciBhdmlzdWJ0aXRsZSBhbmQgY2hhbmdlIGNsYXNzIHRvCisJICBDb2RlYy9QYXJzZXIvU3VidGl0bGUKKworMjAwOC0wMS0zMSAxNjoxMjoyOCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzogVHJlYXQgRU5PVFRZIChkcml2ZXIgZG9lcyBub3QgaW1wbGVtZW50IGlvY3RsKSB0aGUgc2FtZSBhcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzogKGdzdF92NGwyX2ZpbGxfbGlzdHMpOgorCSAgVHJlYXQgRU5PVFRZIChkcml2ZXIgZG9lcyBub3QgaW1wbGVtZW50IGlvY3RsKSB0aGUgc2FtZSBhcworCSAgRUlOVkFMIHNpbmNlIGl0IGltcGxpZXMgdGhlcmUgYXJlIG5vIGF2YWlsYWJsZSBzdGFuZGFyZHMuCisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX3Byb2JlX2NhcHNfZm9yX2Zvcm1hdCksCisJICAoZ3N0X3Y0bDJzcmNfZ2V0X25lYXJlc3Rfc2l6ZSk6CisJICBSZXBsYWNlIGdzdF92NGwyc3JjX2dldF9zaXplX2xpbWl0cyB3aXRoIDIgY2FsbHMgdG8gbmV3IGZ1bmN0aW9uCisJICBnc3RfdjRsMnNyY19nZXRfbmVhcmVzdF9zaXplLCBhbmQgZ2V0IGl0IHRvIHVzZSBWSURJT0NfU19GTVQgdG8KKwkgIHByb2JlIGlmIHRoZSBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBWSURJT0NfVFJZX0ZNVCBmb3Igd2hhdGV2ZXIKKwkgIHJlYXNvbiwgYW5kIGlmIHdlIGFyZW4ndCB5ZXQgYWN0aXZlbHkgY2FwdHVyaW5nLgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmg6CisJICBSZW1vdmUgcmVwbGFjZWQgZnVuY3Rpb24gZGVjbGFyYXRpb24uCisKKzIwMDgtMDEtMzEgMTY6MDM6NDggKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBjb25maWd1cmUuYWM6IEJ1bXAgcGx1Z2lucy1iYXNlIHJlcXVpcmVtZW50IHRvIDAuMTAuMTYgZm9yIHRoZSBnc3RfdmlkZW9fZm9ybWF0XyoKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBCdW1wIHBsdWdpbnMtYmFzZSByZXF1aXJlbWVudCB0byAwLjEwLjE2IGZvciB0aGUgZ3N0X3ZpZGVvX2Zvcm1hdF8qCisJICBBUEkuCisKKzIwMDgtMDEtMzEgMDk6NTA6MzEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogQWRkIGNoYW5nZXMgdG8gZ3N0c291cGh0dHBzcmMuYyB0aGF0IHdlcmUgbWlzc2luZyBmcm9tIGxhc3QgY29tbWl0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IChfZG9faW5pdCksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfYmFzZV9pbml0KSwgKGdzdF9zb3VwX2h0dHBfc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX2luaXQpLCAoZ3N0X3NvdXBfaHR0cF9zcmNfZGlzcG9zZSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9zb3VwX2h0dHBfc3JjX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfdW5pY29kaWZ5KSwgKGdzdF9zb3VwX2h0dHBfc3JjX2NhbmNlbF9tZXNzYWdlKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19xdWV1ZV9tZXNzYWdlKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19hZGRfcmFuZ2VfaGVhZGVyKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19zZXNzaW9uX3VucGF1c2VfbWVzc2FnZSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfc2Vzc2lvbl9wYXVzZV9tZXNzYWdlKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19zZXNzaW9uX2Nsb3NlKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19nb3RfaGVhZGVyc19jYiksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfZ290X2JvZHlfY2IpLCAoZ3N0X3NvdXBfaHR0cF9zcmNfZmluaXNoZWRfY2IpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX2dvdF9jaHVua19jYiksIChnc3Rfc291cF9odHRwX3NyY19yZXNwb25zZV9jYiksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfcGFyc2Vfc3RhdHVzKSwgKGdzdF9zb3VwX2h0dHBfc3JjX2NyZWF0ZSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfc3RhcnQpLCAoZ3N0X3NvdXBfaHR0cF9zcmNfc3RvcCksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfdW5sb2NrKSwgKGdzdF9zb3VwX2h0dHBfc3JjX3VubG9ja19zdG9wKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19nZXRfc2l6ZSksIChnc3Rfc291cF9odHRwX3NyY19pc19zZWVrYWJsZSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfZG9fc2VlayksIChnc3Rfc291cF9odHRwX3NyY19zZXRfbG9jYXRpb24pLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX3NldF9wcm94eSksIChnc3Rfc291cF9odHRwX3NyY191cmlfZ2V0X3R5cGUpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX3VyaV9nZXRfcHJvdG9jb2xzKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY191cmlfZ2V0X3VyaSksIChnc3Rfc291cF9odHRwX3NyY191cmlfc2V0X3VyaSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfdXJpX2hhbmRsZXJfaW5pdCksIChwbHVnaW5faW5pdCk6CisJICBBZGQgY2hhbmdlcyB0byBnc3Rzb3VwaHR0cHNyYy5jIHRoYXQgd2VyZSBtaXNzaW5nIGZyb20gbGFzdCBjb21taXQuCisKKzIwMDgtMDEtMzEgMDg6NTc6MTYgKzAwMDAgIFdvdXRlciBDbG9ldGVucyA8d291dGVyQG1pbmQuYmU+CisKKwkgIE1ha2UgY29kaW5nIHN0eWxlIG1vcmUgY29uc2lzdGVudCwgaW5jbHVkaW5nIGNsYXNzIHJlbmFtaW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogV291dGVyIENsb2V0ZW5zIDx3b3V0ZXIgYXQgbWluZCBkb3QgYmU+CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX2Jhc2VfaW5pdCksIChnc3Rfc291cF9odHRwX3NyY19jbGFzc19pbml0KSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19pbml0KSwgKGdzdF9zb3VwX2h0dHBfc3JjX2Rpc3Bvc2UpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX3NldF9wcm9wZXJ0eSksIChnc3Rfc291cF9odHRwX3NyY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX3VuaWNvZGlmeSksIChnc3Rfc291cF9odHRwX3NyY19jYW5jZWxfbWVzc2FnZSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfcXVldWVfbWVzc2FnZSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfYWRkX3JhbmdlX2hlYWRlciksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfc2Vzc2lvbl91bnBhdXNlX21lc3NhZ2UpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX3Nlc3Npb25fcGF1c2VfbWVzc2FnZSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfc2Vzc2lvbl9jbG9zZSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfZ290X2hlYWRlcnNfY2IpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX2dvdF9ib2R5X2NiKSwgKGdzdF9zb3VwX2h0dHBfc3JjX2ZpbmlzaGVkX2NiKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19nb3RfY2h1bmtfY2IpLCAoZ3N0X3NvdXBfaHR0cF9zcmNfcmVzcG9uc2VfY2IpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX3BhcnNlX3N0YXR1cyksIChnc3Rfc291cF9odHRwX3NyY19jcmVhdGUpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX3N0YXJ0KSwgKGdzdF9zb3VwX2h0dHBfc3JjX3N0b3ApLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX3VubG9jayksIChnc3Rfc291cF9odHRwX3NyY191bmxvY2tfc3RvcCksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfZ2V0X3NpemUpLCAoZ3N0X3NvdXBfaHR0cF9zcmNfaXNfc2Vla2FibGUpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX2RvX3NlZWspLCAoZ3N0X3NvdXBfaHR0cF9zcmNfc2V0X2xvY2F0aW9uKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19zZXRfcHJveHkpLCAoZ3N0X3NvdXBfaHR0cF9zcmNfdXJpX2dldF90eXBlKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY191cmlfZ2V0X3Byb3RvY29scyksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfdXJpX2dldF91cmkpLCAoZ3N0X3NvdXBfaHR0cF9zcmNfdXJpX3NldF91cmkpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX3VyaV9oYW5kbGVyX2luaXQpLCAocGx1Z2luX2luaXQpOgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgTWFrZSBjb2Rpbmcgc3R5bGUgbW9yZSBjb25zaXN0ZW50LCBpbmNsdWRpbmcgY2xhc3MgcmVuYW1pbmcuCisKKzIwMDgtMDEtMzEgMDA6MDM6MjYgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBjb25maWd1cmUuYWM6IEZpeCB0eXBvLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEZpeCB0eXBvLgorCisyMDA4LTAxLTMxIDAwOjAwOjIzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2FscGhhLzogUmUtd3JpdGUgdGhlICdhbHBoYScgcGx1Z2luIHRvIGJlIEJhc2VUcmFuc2Zvcm0gYmFzZWQsIHNpbXBsaWZ5aW5nIHNvbWUgc3R1ZmYsIGFuZCBtYWtpbmcgYnVmZmVyLWFsbG9jIGFuLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FscGhhL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkgIFJlLXdyaXRlIHRoZSAnYWxwaGEnIHBsdWdpbiB0byBiZSBCYXNlVHJhbnNmb3JtIGJhc2VkLCBzaW1wbGlmeWluZworCSAgc29tZSBzdHVmZiwgYW5kIG1ha2luZyBidWZmZXItYWxsb2MgYW5kIHJlc2l6aW5nIHdvcmsgYXV0b21hdGljYWxseS4KKwkgIE5vIGxvbmdlciBjcmFzaGVzIG9uIG9kZCBmcmFtZSB3aWR0aHMgYW5kIGhlaWdodHMsIGFsdGhvdWdoIHRoZXJlCisJICBzZWVtcyB0byBiZSBhIGRpc2FncmVlbWVudCB3aXRoIGZmbXBlZ2NvbG9yc3BhY2UgYWJvdXQgd2hhdCBzaXplCisJICBhbiBBWVVWIGZyYW1lIHdpdGggb2RkIGhlaWdodCBzaG91bGQgYmUuCisKKzIwMDgtMDEtMzAgMTU6NDA6MzYgKzAwMDAgIFdvdXRlciBDbG9ldGVucyA8d291dGVyQG1pbmQuYmU+CisKKwkgIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IFVwZGF0ZSBkb2N1bWVudGF0aW9uIGEgYml0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogV291dGVyIENsb2V0ZW5zIDx3b3V0ZXIgYXQgbWluZCBkb3QgYmU+CisJICAqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBVcGRhdGUgZG9jdW1lbnRhdGlvbiBhIGJpdC4KKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsc2FzcGRpZi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdmIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmlsdGVyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdsaW1hZ2VzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1wZWd2aWRlb3BhcnNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yYXdwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNkbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VuZHRvdWNoLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BjZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWVkLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4cmVzYW1wbGUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3dpdGNoLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJICBSZWdlbmVyYXRlIGV2ZXJ5dGhpbmcgZm9yIHRoZSBkb2N1bWVudGF0aW9uIGNoYW5nZXMgd2UgaGFkLgorCisyMDA4LTAxLTMwIDEzOjI5OjE1ICswMDAwICBXb3V0ZXIgQ2xvZXRlbnMgPHdvdXRlckBtaW5kLmJlPgorCisJICBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOiBMZXQgdGhlIHByb3h5IHByb3BlcnR5IGRlZmF1bHQgdG8gdGhlIGNvbnRlbnQgb2YgdGhlICRodHRwX3Byb3h5IGVudmlyb25tZW50IHZhcmlhYmxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogV291dGVyIENsb2V0ZW5zIDx3b3V0ZXIgYXQgbWluZCBkb3QgYmU+CisJICAqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IChnc3Rfc291cGh0dHBfc3JjX2luaXQpOgorCSAgTGV0IHRoZSBwcm94eSBwcm9wZXJ0eSBkZWZhdWx0IHRvIHRoZSBjb250ZW50IG9mIHRoZSAkaHR0cF9wcm94eQorCSAgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKKzIwMDgtMDEtMzAgMTM6MDg6NDUgKzAwMDAgIFdvdXRlciBDbG9ldGVucyA8d291dGVyQG1pbmQuYmU+CisKKwkgIHRlc3RzL2NoZWNrLzogQWRkIG1pc3NpbmcgZmlsZXMgZm9yIHRoZSB1bml0IHRlc3QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBXb3V0ZXIgQ2xvZXRlbnMgPHdvdXRlciBhdCBtaW5kIGRvdCBiZT4KKwkgICogdGVzdHMvY2hlY2svdGVzdC1jZXJ0LnBlbToKKwkgICogdGVzdHMvY2hlY2svdGVzdC1rZXkucGVtOgorCSAgQWRkIG1pc3NpbmcgZmlsZXMgZm9yIHRoZSB1bml0IHRlc3QuCisKKzIwMDgtMDEtMzAgMTM6MDY6MDEgKzAwMDAgIFdvdXRlciBDbG9ldGVucyA8d291dGVyQG1pbmQuYmU+CisKKwkgIGRvY3MvcGx1Z2lucy86IEFkZCBzb3VwaHR0cHNyYyB0byB0aGUgZG9jcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFdvdXRlciBDbG9ldGVucyA8d291dGVyIGF0IG1pbmQgZG90IGJlPgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBBZGQgc291cGh0dHBzcmMgdG8gdGhlIGRvY3MuCisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKGdzdF9zb3VwaHR0cF9zcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3NvdXBodHRwX3NyY19pbml0KSwgKGdzdF9zb3VwaHR0cF9zcmNfZGlzcG9zZSksCisJICAoZ3N0X3NvdXBodHRwX3NyY19zZXRfcHJvcGVydHkpLCAoZ3N0X3NvdXBodHRwX3NyY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9zb3VwaHR0cF9zcmNfY2FuY2VsX21lc3NhZ2UpLAorCSAgKGdzdF9zb3VwaHR0cF9zcmNfcXVldWVfbWVzc2FnZSksCisJICAoZ3N0X3NvdXBodHRwX3NyY19hZGRfcmFuZ2VfaGVhZGVyKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX3Nlc3Npb25fdW5wYXVzZV9tZXNzYWdlKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX3Nlc3Npb25fcGF1c2VfbWVzc2FnZSksCisJICAoZ3N0X3NvdXBodHRwX3NyY19zZXNzaW9uX2Nsb3NlKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX2dvdF9oZWFkZXJzX2NiKSwgKGdzdF9zb3VwaHR0cF9zcmNfZ290X2JvZHlfY2IpLAorCSAgKGdzdF9zb3VwaHR0cF9zcmNfZmluaXNoZWRfY2IpLCAoZ3N0X3NvdXBodHRwX3NyY19nb3RfY2h1bmtfY2IpLAorCSAgKGdzdF9zb3VwaHR0cF9zcmNfcmVzcG9uc2VfY2IpLCAoZ3N0X3NvdXBodHRwX3NyY19wYXJzZV9zdGF0dXMpLAorCSAgKGdzdF9zb3VwaHR0cF9zcmNfY3JlYXRlKSwgKGdzdF9zb3VwaHR0cF9zcmNfc3RhcnQpLAorCSAgKGdzdF9zb3VwaHR0cF9zcmNfc3RvcCksIChnc3Rfc291cGh0dHBfc3JjX3VubG9jayksCisJICAoZ3N0X3NvdXBodHRwX3NyY191bmxvY2tfc3RvcCksIChnc3Rfc291cGh0dHBfc3JjX2dldF9zaXplKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX2lzX3NlZWthYmxlKSwgKGdzdF9zb3VwaHR0cF9zcmNfZG9fc2VlayksCisJICAoZ3N0X3NvdXBodHRwX3NyY19zZXRfbG9jYXRpb24pLCAoZ3N0X3NvdXBodHRwX3NyY19zZXRfcHJveHkpLAorCSAgKHBsdWdpbl9pbml0KToKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuaDoKKwkgIEFkZCBzdXBwb3J0IGZvciBsaWJzb3VwMi40IGFuZCByZXF1aXJlIGl0LiBBbHNvIGltcGxlbWVudCByZWRpcmVjdGlvbgorCSAgYW5kIG1hbnVhbCBwcm94eSBzcGVjaWZpY2F0aW9uLiBGaXhlcyBidWcgIzUxMDcwOC4KKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5jdnNpZ25vcmU6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6CisJICBBZGQgdW5pdCB0ZXN0IGZvciBzb3VwaHR0cHNyYy4KKworMjAwOC0wMS0yOSAxODo0MzozMiArMDAwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm9Abm52YS5vcmc+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZW5jLio6IFByZWFsbG9jYXRlIHRoZSBvdXRwdXQgYnVmZmVyIHNvIHRoYXQgZ19tZW1kdXAoKSBhbmQgZ3N0X2J1ZmZlcl9tZXJnZSgpIGFyZW4ndCBuZWVkZWQgYW55bW9yZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8gYXQgbm52YSBkb3Qgb3JnPgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiAodXNlcl93cml0ZV9kYXRhKSwgKGdzdF9wbmdlbmNfY2hhaW4pOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5oOgorCSAgUHJlYWxsb2NhdGUgdGhlIG91dHB1dCBidWZmZXIgc28gdGhhdCBnX21lbWR1cCgpIGFuZAorCSAgZ3N0X2J1ZmZlcl9tZXJnZSgpIGFyZW4ndCBuZWVkZWQgYW55bW9yZS4gVGhpcyBncmVhdGx5IGltcHJvdmVzCisJICBwZXJmb3JtYW5jZXMgYW5kIGZpeGVzICM1MTI1NDQuCisKKzIwMDgtMDEtMjkgMTg6MjQ6MjggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogR1N0cmVhbWVyIHRpbWVzdGFtcHMgYXJlIFBUUyB2YWx1ZXMgd2hpbGUgQVZJIG9ubHkga25vd3MgYWJvdXQgRFRTIHRpbWVzdGFtcHMuIE1ha2Ugc3VyZSB3ZSBvbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcHJvY2Vzc19uZXh0X2VudHJ5KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9kYXRhKToKKwkgIEdTdHJlYW1lciB0aW1lc3RhbXBzIGFyZSBQVFMgdmFsdWVzIHdoaWxlIEFWSSBvbmx5IGtub3dzIGFib3V0IERUUworCSAgdGltZXN0YW1wcy4gTWFrZSBzdXJlIHdlIG9ubHkgY29weSB0aGUgRFRTIGFzIHRoZSBidWZmZXIgdGltZXN0YW1wIHdoZW4KKwkgIHdlIGFyZSBkZWFsaW5nIHdpdGggYSBrZXkgZnJhbWUuCisKKzIwMDgtMDEtMjkgMTU6NDU6NDggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdGVzdHMvY2hlY2svOiBBZGQgYWRkIHRlc3RzdWl0ZSBmb3IgdGhlIHJ0cC1wYXlsb2FkZXIgdGhhdCB0cmllcyBzaW11bGF0aW5nIGRhdGFmbG93LiBOZWVkcyBtb3JlIHRlc3QgZGF0YS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIEFkZCBhZGQgdGVzdHN1aXRlIGZvciB0aGUgcnRwLXBheWxvYWRlciB0aGF0IHRyaWVzIHNpbXVsYXRpbmcKKwkgIGRhdGFmbG93LiBOZWVkcyBtb3JlIHRlc3QgZGF0YS4KKworMjAwOC0wMS0yOSAxNToyNzowMiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9hbHBoYWNvbG9yLmM6IFJlbW92ZSB0d28gdW51c2VkIHZhcmlhYmxlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hbHBoYWNvbG9yLmM6CisJICBSZW1vdmUgdHdvIHVudXNlZCB2YXJpYWJsZXMuCisKKzIwMDgtMDEtMjggMTI6MTc6MDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogVXNlIGdfYXNjaWlfc3RydG9sbCgpIGluc3RlYWQgb2YgYXRvbGwsIHdoaWNoIGlzIG9ubHkgYXZhaWxhYmxlIGluIEM5OS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19wYXJzZV9ydHBpbmZvKToKKwkgIFVzZSBnX2FzY2lpX3N0cnRvbGwoKSBpbnN0ZWFkIG9mIGF0b2xsLCB3aGljaCBpcyBvbmx5CisJICBhdmFpbGFibGUgaW4gQzk5LgorCisyMDA4LTAxLTI2IDE2OjE5OjI2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9maWx0ZXIvOiBEb24ndCBpbXBsZW1lbnQgZ2V0X3VuaXRfc2l6ZSgpIG91cnNlbHZlcywgdGhlIEdzdEF1ZGlvRmlsdGVyIGJhc2UgY2xhc3MgYWxyZWFkeSBkb2VzIHRoaXMgZm9yIHVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5jOiAoZ3N0X2Jwd3NpbmNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy5jOiAoZ3N0X2xwd3NpbmNfY2xhc3NfaW5pdCk6CisJICBEb24ndCBpbXBsZW1lbnQgZ2V0X3VuaXRfc2l6ZSgpIG91cnNlbHZlcywgdGhlIEdzdEF1ZGlvRmlsdGVyIGJhc2UKKwkgIGNsYXNzIGFscmVhZHkgZG9lcyB0aGlzIGZvciB1cy4KKworMjAwOC0wMS0yNSAxMDo1MzoxNyArMDAwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IEFkZCBNUEVHMiB2aWRlbyBwYXlsb2FkZXIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5oOgorCSAgQWRkIE1QRUcyIHZpZGVvIHBheWxvYWRlcgorCisyMDA4LTAxLTIzIDE3OjA1OjMyICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiBVc2UgI2luY2x1ZGUgPG1hdGguaD4gaW5zdGVhZCBvZiAjaW5jbHVkZSAibWF0aC5oIi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIFVzZSAjaW5jbHVkZSA8bWF0aC5oPiBpbnN0ZWFkIG9mICNpbmNsdWRlICJtYXRoLmgiLgorCisyMDA4LTAxLTIxIDE5OjQxOjQ1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06IEZpeCB1cCBzb21lIENGTEFHUyBzZXRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgRml4IHVwIHNvbWUgQ0ZMQUdTIHNldHMuCisJICBEb24ndCBpbmNsdWRlIGdjb25mdmlkZW9zcmMgaW4gdGhlIHN0YXRlcyB0ZXN0LgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdXRvZGV0ZWN0LmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICBBZGQgc29tZSBlcnJvciBzdHJpbmdzIHRvIGZhaWxfdW5sZXNzIGFyZ3VtZW50cyB0byBmaXggc29tZSB3ZWlyZAorCSAgY29tcGlsZXIgZXJyb3JzIG9uIFNvbGFyaXMuCisKKzIwMDgtMDEtMjEgMTk6MzU6NTggKzAwMDAgIEJyaWFuIENhbWVyb24gPGJyaWFuLmNhbWVyb25Ac3VuLmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBEZXRlY3QgdmlkZW80bGludXggaGVhZGVycyBvbiBTb2xhcmlzIHRvby4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBEZXRlY3QgdmlkZW80bGludXggaGVhZGVycyBvbiBTb2xhcmlzIHRvby4KKwkgICogc3lzL3Y0bDIvZ3N0djRsMmNvbG9yYmFsYW5jZS5oOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICAqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJfYnVmZmVyX2ZpbmFsaXplKSwKKwkgIChnc3RfdjRsMl9idWZmZXJfbmV3KToKKwkgIE1ha2UgdjRsMiBidWlsZCBvbiBTb2xhcmlzLgorCSAgUGF0Y2ggYnk6IEJyaWFuIENhbWVyb24gIDxicmlhbi5jYW1lcm9uIGF0IHN1biBkb3QgY29tPgorCSAgRml4ZXM6ICM1MTA1MDUKKworMjAwOC0wMS0yMSAxMTo0NjoxOSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDogVXBkYXRlIGxpc3QgZnJvbSAoc3RpbGwgbG9jYWwpIHNjYW5uaW5nIHNjcmlwdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgIFVwZGF0ZSBsaXN0IGZyb20gKHN0aWxsIGxvY2FsKSBzY2FubmluZyBzY3JpcHQuCisKKzIwMDgtMDEtMjEgMDk6NTc6MDcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogQWRkIHN5bWJvbHMgZnJvbSAtdW51c2VkLnR4dCB0byB0aGUgcmlnaHQgcGxhY2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgQWRkIHN5bWJvbHMgZnJvbSAtdW51c2VkLnR4dCB0byB0aGUgcmlnaHQgcGxhY2UuCisJICAqIGdzdC9kdmRzcHUvZ3N0ZHZkc3B1LmM6CisJICAqIGdzdC9kdmRzcHUvZ3N0ZHZkc3B1Lmg6CisJICBDb2hlcmVudCBuYW1lc3BhY2UgdXNhZ2UuCisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgRml4IGJyb2tlbiBYTUwgZnJhZ21lbnQgaW4gZG9jIHNuaXBwZXQgZXZlbiBtb3JlLgorCisyMDA4LTAxLTIxIDA3OjU0OjAyICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbTogVXBkYXRlIGluY2x1ZGUgbGlzdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICBVcGRhdGUgaW5jbHVkZSBsaXN0LgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgVXBkYXRlIHhtbCBpbmNsdWRlcy4KKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsc2FzcGRpZi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbXJ3Yi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1iYXllci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1iejIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2R4YXBhcnNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0c2RlYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdmJzcmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHZkc3B1LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mYWFjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZhYWQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmJkZXZzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZlc3RpdmFsLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZpbHRlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHZkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mcmVlemUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3NtLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdGludGVybGFjZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWgyNjRwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxhZHNwYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tZXRhZGF0YS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb2RwbHVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1wZWc0dmlkZW9wYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tcGVndHNwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tcGVndmlkZW9wYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdXNpY2JyYWluei54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdmUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbnNmZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW51dmRlbXV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF0ZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlYWwueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zZGwueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2RwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWVkLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4cmVzYW1wbGUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3RlcmVvLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXN3aXRjaC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10aW1pZGl0eS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10dGEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvcGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9zaWduYWwueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdm1uYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13aWxkbWlkaS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14MjY0LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbmdoZWFkZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teHZpZC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSAgUmVnZW5lcmF0ZSBmaWxlcy4KKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBGaXggYnJva2VuIFhNTCBmcmFnbWVudCBpbiBkb2Mgc25pcHBldC4KKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgIEFkZCB0ZXN0IGJpbmFyeSB0byBpZ25vcmVzLgorCisyMDA4LTAxLTIwIDA1OjA3OjUyICswMDAwICBXb3V0ZXIgQ2xvZXRlbnMgPHdvdXRlckBtaW5kLmJlPgorCisJICBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOiBSZXBvcnQgdGhlIHNpemUgb2YgdGhlIHN0cmVhbSBhcyB0aGUgdG90YWwgc2l6ZSBpbnN0ZWFkIG9mIHRoZSByZW1haW5pbmcgQ29udGVudC1MZW5ndGgsIHcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFdvdXRlciBDbG9ldGVucyA8d291dGVyIGF0IG1pbmQgZG90IGJlPgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOiAoc291cF9nb3RfaGVhZGVycyk6CisJICBSZXBvcnQgdGhlIHNpemUgb2YgdGhlIHN0cmVhbSBhcyB0aGUgdG90YWwgc2l6ZSBpbnN0ZWFkIG9mCisJICB0aGUgcmVtYWluaW5nIENvbnRlbnQtTGVuZ3RoLCB3aGljaCBpcyB3cm9uZyBhZnRlciBhIHNlZWsuCisKKzIwMDgtMDEtMTkgMTQ6NTk6MDggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSAgQWRkIGJ1ZyBudW1iZXIgdG8gdGhlIGxhdGVzdCBlbnRyeQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBBZGQgYnVnIG51bWJlciB0byB0aGUgbGF0ZXN0IGVudHJ5CisKKzIwMDgtMDEtMTkgMTQ6NTM6NTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IFNldCB2YXJpYWJsZSB0byBOVUxMIGFmdGVyIGZyZWVpbmcgaXQgdG8gcHJldmVudCBkb3VibGUgZnJlZXMgb3IgbWFrZSBmYWlsdXJlcyBieSBhbm90aGVyLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEJhc2VkIG9uIGEgcGF0Y2ggYnk6CisJICBWaWN0b3IgU1RJTk5FUiA8dmljdG9yIGRvdCBzdGlubmVyIGF0IGhheXBvY2FsYyBkb3QgY29tPgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyk6CisJICBTZXQgdmFyaWFibGUgdG8gTlVMTCBhZnRlciBmcmVlaW5nIGl0IHRvIHByZXZlbnQgZG91YmxlIGZyZWVzCisJICBvciBtYWtlIGZhaWx1cmVzIGJ5IGFub3RoZXIgdXNlIG9mIGl0IGFmdGVyd2FyZHMgbW9yZSBvYnZpb3VzCisJICBhbmQgZml4IHVzZSBvZiBpdCBhZnRlciB0aGUgZnJlZWluZy4KKworMjAwOC0wMS0xOSAxNDozNDo1MCArMDAwMCAgV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogQ29ycmVjdGx5IHNldCBkdXJhdGlvbiBvbiB0aGUgR3N0QmFzZVNyYyBzZWdtZW50IHdoZW4gd2Uga25vdyBpdCB0byBmaXggZmFpbGluZyB0aGUgZHVyYXRpLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBXb3V0ZXIgQ2xvZXRlbnMgPHdvdXRlciBhdCBtaW5kIGRvdCBiZT4KKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKHNvdXBfZ290X2hlYWRlcnMpOgorCSAgQ29ycmVjdGx5IHNldCBkdXJhdGlvbiBvbiB0aGUgR3N0QmFzZVNyYyBzZWdtZW50IHdoZW4gd2Uga25vdyBpdAorCSAgdG8gZml4IGZhaWxpbmcgdGhlIGR1cmF0aW9uIHF1ZXJ5LgorCisyMDA4LTAxLTE4IDEzOjQwOjM4ICswMDAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiB1c2UgR1NUX1dBUk5JTkcgZm9yIGxvZ2dpbmcKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgdXNlIEdTVF9XQVJOSU5HIGZvciBsb2dnaW5nCisKKzIwMDgtMDEtMTggMTA6MDU6NTMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzogRml4IG1lbW9yeSBsZWFrIHNwb3R0ZWQgYnkgdGhlIHVuaXQgdGVzdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOiAoZ3N0X211bHRpX2ZpbGVfc3JjX2NyZWF0ZSk6CisJICBGaXggbWVtb3J5IGxlYWsgc3BvdHRlZCBieSB0aGUgdW5pdCB0ZXN0LgorCisyMDA4LTAxLTE4IDEwOjA0OjI1ICswMDAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiBEb24ndCB0cnkgdG8gbGVhdmUgYSBtdWx0aWNhc3QgZ3JvdXAgd2l0aCBhbiBpbnZhbGlkIHNvY2tldAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICBEb24ndCB0cnkgdG8gbGVhdmUgYSBtdWx0aWNhc3QgZ3JvdXAgd2l0aCBhbiBpbnZhbGlkIHNvY2tldAorCisyMDA4LTAxLTE4IDA4OjQ5OjU5ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHRlc3RzL2NoZWNrLzogQWRkIHNvbWUgbWluaW1hbCB0ZXN0cyBmb3IgdGhlIGVxdWFsaXplciBwbHVnaW4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5jdnNpZ25vcmU6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2VxdWFsaXplci5jOiAoc2V0dXBfZXF1YWxpemVyKSwKKwkgIChjbGVhbnVwX2VxdWFsaXplciksIChHU1RfU1RBUlRfVEVTVCksIChlcXVhbGl6ZXJfc3VpdGUpLCAobWFpbik6CisJICBBZGQgc29tZSBtaW5pbWFsIHRlc3RzIGZvciB0aGUgZXF1YWxpemVyIHBsdWdpbi4KKworMjAwOC0wMS0xOCAwNzowMzoyMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOiBVbnBhcmVudCBhbGwgYmFuZHMgZnJvbSB0aGUgZXF1YWxpemVyIHdoZW4gZmluYWxpemluZyB0byBzdG9wIGxlYWtpbmcJdGhlbS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOiAoZ3N0X2lpcl9lcXVhbGl6ZXJfZmluYWxpemUpOgorCSAgVW5wYXJlbnQgYWxsIGJhbmRzIGZyb20gdGhlIGVxdWFsaXplciB3aGVuIGZpbmFsaXppbmcgdG8gc3RvcAorCSAgbGVha2luZwl0aGVtLgorCisyMDA4LTAxLTE4IDA1OjMyOjI2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IEFkZCBzdXBwb3J0IGZvciBXZWJEQVYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKGdzdF9zb3VwaHR0cF9zcmNfdXJpX2dldF9wcm90b2NvbHMpOgorCSAgQWRkIHN1cHBvcnQgZm9yIFdlYkRBVi4KKworMjAwOC0wMS0xOCAwNToyNDozOSArMDAwMCAgV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuKjogQWRkIHN1cHBvcnQgZm9yIHNlZWtpbmcgdG8gc291cGh0dHBzcmMuIEZpeGVzIGJ1ZyAjNTAyMzM1LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogV291dGVyIENsb2V0ZW5zIDx3b3V0ZXIgYXQgbWluZCBkb3QgYmU+CisJICAqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IChnc3Rfc291cGh0dHBfc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zb3VwaHR0cF9zcmNfaW5pdCksIChnc3Rfc291cGh0dHBfc3JjX2NyZWF0ZSksCisJICAoZ3N0X3NvdXBodHRwX3NyY19pc19zZWVrYWJsZSksIChnc3Rfc291cGh0dHBfc3JjX2RvX3NlZWspLAorCSAgKHNvdXBfYWRkX3JhbmdlX2hlYWRlciksIChzb3VwX2dvdF9oZWFkZXJzKSwgKHNvdXBfZ290X2NodW5rKToKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuaDoKKwkgIEFkZCBzdXBwb3J0IGZvciBzZWVraW5nIHRvIHNvdXBodHRwc3JjLiBGaXhlcyBidWcgIzUwMjMzNS4KKworMjAwOC0wMS0xNyAyMToyMzozMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiB3aGVyZSB0aGUgcGljdHVyZSBtZXRhZGF0YSBkZWZpbmVzIGFuZCBzdHJ1Y3RzIGRvbid0IGV4aXN0IHlldC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBGaXggY29tcGlsYXRpb24gYWdhaW5zdCBmbGFjIDEuMS4yIChhcyBvbiBkZWJpYW4gc3RhYmxlKSwgd2hlcmUKKwkgIHRoZSBwaWN0dXJlIG1ldGFkYXRhIGRlZmluZXMgYW5kIHN0cnVjdHMgZG9uJ3QgZXhpc3QgeWV0LgorCSAgRml4ZXMgIzUwOTMwMS4KKworMjAwOC0wMS0xNyAxMToxMzoxNiArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuKjogQWRkIHByb3BlcnR5IHRvIGF1dG9tYXRpY2FsbHkgam9pbiBhIG11bHRpY2FzdCBncm91cCBvciBub3QuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHNoYXJpLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBPbGl2aWVyIENyZXRlIDx0ZXN0ZXIgYXQgdGVzdGVyIGRvdCBjYT4KKwkgICogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogKGdzdF9tdWx0aXVkcHNpbmtfY2xhc3NfaW5pdCksCisJICAoZ3N0X211bHRpdWRwc2lua19pbml0KSwgKGdzdF9tdWx0aXVkcHNpbmtfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX2dldF9wcm9wZXJ0eSksIChnc3RfbXVsdGl1ZHBzaW5rX2luaXRfc2VuZCksCisJICAoZ3N0X211bHRpdWRwc2lua19hZGRfaW50ZXJuYWwpLCAoZ3N0X211bHRpdWRwc2lua19yZW1vdmUpOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSAgQWRkIHByb3BlcnR5IHRvIGF1dG9tYXRpY2FsbHkgam9pbiBhIG11bHRpY2FzdCBncm91cCBvciBub3QuIFRoaXMgY2FuIGJlCisJICB1c2VmdWwgd2hlbiBzaGFyaW5nIGEgc29ja2V0IGJldHdlZW4gbXVsdGlwbGUgZWxlbWVudHMuCisJICBGaXhlcyAjNTA5NTMxLgorCisyMDA4LTAxLTE2IDIxOjUzOjQxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOiBBZGQgY29udHJvbGxlciBmbGFncy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdmlkZW9taXhlci9NYWtlZmlsZS5hbToKKwkgIEFkZCBjb250cm9sbGVyIGZsYWdzLgorCisyMDA4LTAxLTE2IDIwOjE3OjA4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogQWxzbyBjb21taXQgdGhlIG1pc3NpbmcgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcygpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIEFsc28gY29tbWl0IHRoZSBtaXNzaW5nIGdzdF9vYmplY3Rfc3luY192YWx1ZXMoKS4KKworMjAwOC0wMS0xNiAwODoxMTo0NiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06IFJlbW92ZSBkdXBsaWNhdGUgZW50cnkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgUmVtb3ZlIGR1cGxpY2F0ZSBlbnRyeS4KKworMjAwOC0wMS0xNSAxNjo1MjoxMCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBkb2NzL3BsdWdpbnMvOiBBZGQgMyBtb3JlIHBsdWdpbnMgdG8gZG9jcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSAgQWRkIDMgbW9yZSBwbHVnaW5zIHRvIGRvY3MuCisKKzIwMDgtMDEtMTUgMTY6MDQ6NDQgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgUmV2ZXJ0IHByZXZpb3VzIGNoYW5nZSBjYXVzZWQgYnkgYSBmaWxlIHRoYXQgZ290IHN0dWNrIG9uIGFuIG9sZCByZXZpc2lvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSAgUmV2ZXJ0IHByZXZpb3VzIGNoYW5nZSBjYXVzZWQgYnkgYSBmaWxlIHRoYXQgZ290IHN0dWNrIG9uIGFuIG9sZAorCSAgcmV2aXNpb24uCisKKzIwMDgtMDEtMTUgMTU6NDA6NTggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgUmUtYWRkIG11bHRpcGFydGRlbXV4IHRvIHRoZSBkb2NzLiBMYXN0IHJvdW5kIG9mIHNlY3Rpb24gY2xlYW51cC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZ3N0L211bHRpcGFydC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4Lmg6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4Lmg6CisJICBSZS1hZGQgbXVsdGlwYXJ0ZGVtdXggdG8gdGhlIGRvY3MuIExhc3Qgcm91bmQgb2Ygc2VjdGlvbiBjbGVhbnVwLgorCisyMDA4LTAxLTE1IDE1OjIyOjQxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIE1hbmFnZWQgdG8gcmVzb2x2ZSBtb3N0IHVudXNlZCBkZWNsYXJhdGlvbnMuIEZpbGVkIGEgYnVnIGZvciBvbmUgbGVmdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmg6CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkgIE1hbmFnZWQgdG8gcmVzb2x2ZSBtb3N0IHVudXNlZCBkZWNsYXJhdGlvbnMuIEZpbGVkIGEgYnVnIGZvciBvbmUgbGVmdC4KKworMjAwOC0wMS0xNSAwODowMzo0OSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDogQ2xlYW51cCBzZWN0aW9uIGZpbGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBDbGVhbnVwIHNlY3Rpb24gZmlsZS4KKworMjAwOC0wMS0xNSAwNzo0Mjo1MSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBkb2NzL3BsdWdpbnMvOiBVcGRhdGUgcGx1Z2luIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFsczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Rpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxhZHNwYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJICBVcGRhdGUgcGx1Z2luIGRvY3MuCisJICAqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuaDoKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcnBhZC5oOgorCSAgU3BsaXQgb3V0IGhlYWRlciB0byBmaXggd2FybmluZ3MgZnJvbSB0aGUgZG9jLWJ1aWxkLgorCisyMDA4LTAxLTE0IDEyOjM1OjIzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBBcyBmb3VuZCBieTogVG9tbWkgTXnDtmjDpG5lbiA8ZXh0LXRvbW1pLm15b2hhbmVuIG5va2lhIGNvbT4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQXMgZm91bmQgYnk6IFRvbW1pIE15w7Zow6RuZW4gPGV4dC10b21taS5teW9oYW5lbiBub2tpYSBjb20+CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX3BhcnNlX3J0cGluZm8pOgorCSAgVXNlIGF0b2xsIHRvIHBhcnNlIHRoZSBydHB0aW1lIHdpdGggZW5vdWdoIHByZWNpc2lvbi4gRml4ZXMgIzUwOTMyOS4KKworMjAwOC0wMS0xNCAxMjoxMTo0MyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0LzogSW5pdGlhbGlzZSB2YXJpYWJsZXMgdG8gd29yayBhcm91bmQgKGZhbHNlKSAnZm9vIG1pZ2h0IGJlIHVzZWQgdW5pbml0aWFsaXplZCBpbiB0aGlzIGZ1bmN0aW9uJyB3YXJuaW5ncyBieSBnY2MtLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlzdWJ0aXRsZS5jOiAoZ3N0X2F2aV9zdWJ0aXRsZV9leHRyYWN0X2ZpbGUpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zZW5kKToKKwkgIEluaXRpYWxpc2UgdmFyaWFibGVzIHRvIHdvcmsgYXJvdW5kIChmYWxzZSkgJ2ZvbyBtaWdodCBiZSB1c2VkCisJICB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24nIHdhcm5pbmdzIGJ5IGdjYy0zLjMuMyAoIzUwOTI5OCkuCisKKzIwMDgtMDEtMTIgMDI6MzI6MzUgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBJZ25vcmUgbW9yZSBmaWxlcyBmb3IgdGhlIGJ1aWxkYm90LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvLmN2c2lnbm9yZToKKwkgIElnbm9yZSBtb3JlIGZpbGVzIGZvciB0aGUgYnVpbGRib3QuCisKKzIwMDgtMDEtMTEgMjE6MDg6NTkgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBHZW5lcmF0ZSB0aGUgaW1hZ2UtdHlwZSB2YWx1ZXMgY29ycmVjdGx5LiBMZWF2ZSB0aGVtIG91dCBvZiB0aGUgY2FwcyB3aGVuIG91dHB1dHRpbmcgYSAicHJldmlldyBpbWFnZSIgdGFnLCBzaW5jZSBpdCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19leHRyYWN0X3BpY3R1cmVfYnVmZmVyKToKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IChwYXJzZV9waWN0dXJlX2ZyYW1lKToKKwkgIEdlbmVyYXRlIHRoZSBpbWFnZS10eXBlIHZhbHVlcyBjb3JyZWN0bHkuIExlYXZlIHRoZW0gb3V0IG9mIHRoZSBjYXBzCisJICB3aGVuIG91dHB1dHRpbmcgYSAicHJldmlldyBpbWFnZSIgdGFnLCBzaW5jZSBpdCBvbmx5IG1ha2VzIHNlbnNlCisJICB0byBoYXZlIG9uZSBvZiB0aG9zZSAtIHRoZSB0eXBlIGlzIGlycmVsZXZhbnQuCisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyY3RybC5jOgorCSAgKGdzdF9zdW5hdWRpb21peGVyX2N0cmxfb3Blbik6CisJICBJZiB3ZSBjYW4sIG1hcmsgdGhlIG1peGVyIG11bHRpcGxlIG9wZW4gd2hlbiB3ZSB1c2UgaXQsIGluIGNhc2UKKwkgIChmb3Igc29tZSByZWFzb24pIHRoZSBwcm9jZXNzIHdhbnRzIHRvIG9wZW4gaXQgYWdhaW4gZWxzZXdoZXJlLgorCisyMDA4LTAxLTExIDE5OjE2OjUzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy86IEl0J3MgImVuZGlhbm5lc3MiLCBub3QgImVuZGlhbmVzcyIuIEZpeGVzIHVuaXQgdGVzdHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jOiAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfbW9ubyksCisJICAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfc3RlcmVvKSwgKHRlc3RfYnVmZmVyX2NvbnN0X2ludDE2X21vbm8pLAorCSAgKHRlc3RfYnVmZmVyX2NvbnN0X2ludDE2X3N0ZXJlbyksICh0ZXN0X2J1ZmZlcl9zcXVhcmVfZmxvYXRfbW9ubyksCisJICAodGVzdF9idWZmZXJfc3F1YXJlX2Zsb2F0X3N0ZXJlbyksICh0ZXN0X2J1ZmZlcl9zcXVhcmVfaW50MTZfbW9ubyksCisJICAodGVzdF9idWZmZXJfc3F1YXJlX2ludDE2X3N0ZXJlbyk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnbGltaXRlci5jOiAoY3JlYXRlX3Rlc3RfYnVmZmVyKToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvcmd2b2x1bWUuYzogKHRlc3RfYnVmZmVyX25ldyk6CisJICBJdCdzICJlbmRpYW5uZXNzIiwgbm90ICJlbmRpYW5lc3MiLiBGaXhlcyB1bml0IHRlc3RzLgorCisyMDA4LTAxLTExIDE4OjU2OjA2ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvLmN2aWdub3JlOgorCSAgaWdub3JlIHNvbWUgbW9yZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBpZ25vcmUgc29tZSBtb3JlCisKKzIwMDgtMDEtMTEgMTg6NTQ6MzEgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJICBpZ25vcmUgc29tZSBtb3JlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGlnbm9yZSBzb21lIG1vcmUKKworMjAwOC0wMS0xMSAxNzoyMTozMCArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cC86IEZpeCB0aGUgY2xvY2sgcmF0ZSB0byA5MDAwMCBhcyByZXF1aXJlZCBieSB0aGUgUkZDLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyIGF0IHRlc3RlciBkb3QgY2E+CisJICAqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzogKGdzdF9ydHBfdGhlb3JhX2RlcGF5X3NldGNhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgRml4IHRoZSBjbG9jayByYXRlIHRvIDkwMDAwIGFzIHJlcXVpcmVkIGJ5IHRoZSBSRkMuCisJICBGaXhlcyAjNTA4NjQ0LgorCisyMDA4LTAxLTExIDE3OjEyOjM3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9pY3lkZW11eC5jOiBEb24ndCB1c2UgZGVwcmVjYXRlZCBHU1RfUExVR0lOX0RFRklORV9TVEFUSUMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvaWN5ZGVtdXguYzogKEdTVF9TVEFSVF9URVNUKSwgKGljeWRlbXV4X3N1aXRlKToKKwkgIERvbid0IHVzZSBkZXByZWNhdGVkIEdTVF9QTFVHSU5fREVGSU5FX1NUQVRJQy4KKworMjAwOC0wMS0xMCAxMjoyNTo0NCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBhdXRvZ2VuLnNoOiBBZGQgLVduby1wb3J0YWJpbGl0eSB0byB0aGUgYXV0b21ha2UgcGFyYW1ldGVycyB0byBzdG9wIHdhcm5pbmdzIGFib3V0IEdOVSBtYWtlIGV4dGVuc2lvbnMgYmVpbmcgdXNlZC4gV2UuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBhdXRvZ2VuLnNoOgorCSAgQWRkIC1Xbm8tcG9ydGFiaWxpdHkgdG8gdGhlIGF1dG9tYWtlIHBhcmFtZXRlcnMgdG8gc3RvcCB3YXJuaW5ncworCSAgYWJvdXQgR05VIG1ha2UgZXh0ZW5zaW9ucyBiZWluZyB1c2VkLiBXZSByZXF1aXJlIEdOVSBtYWtlIGluIGFsbW9zdAorCSAgZXZlcnkgTWFrZWZpbGUgYW55d2F5LgorCSAgKiBjb25maWd1cmUuYWM6CisJICBVc2UgQU1fUFJPR19DQ19DX08gYXMgYSBjb21waWxlciB0aGF0IGFjY2VwdHMgYm90aCAtYyBhbmQgLW8KKwkgIGF0IHRoZSBzYW1lIHRpbWUgaXMgcmVxdWlyZWQgZm9yIHBlciB0YXJnZXQgZmxhZ3MuCisKKzIwMDgtMDEtMDkgMTU6Mjg6MjkgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogRml4IGVycm9yIGZyb20gbXkgbGFzdCBjb21taXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiAoZ3N0X3ZpZGVvbWl4ZXJfaW5pdCk6CisJICBGaXggZXJyb3IgZnJvbSBteSBsYXN0IGNvbW1pdC4KKworMjAwOC0wMS0wOSAxNToyMDoxOSArMDAwMCAgVG9tbWkgTXnDtmjDpG5lbiA8ZXh0LXRvbW1pLm15b2hhbmVuQG5va2lhLmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IE1ha2Ugc3VyZSB0aGUgSVNPIDYzOS1YIGxhbmd1YWdlIGNvZGUgaW4gSUQzdjIgQ09NTSBmcmFtZXMgc28gd2UgZG9uJ3QgZW5kIHVwIHdpdGggbm9uLVVULi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5OiBUb21taSBNecO2aMOkbmVuIDxleHQtdG9tbWkubXlvaGFuZW4gbm9raWEgY29tPgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKHBhcnNlX2NvbW1lbnRfZnJhbWUpOgorCSAgTWFrZSBzdXJlIHRoZSBJU08gNjM5LVggbGFuZ3VhZ2UgY29kZSBpbiBJRDN2MiBDT01NIGZyYW1lcworCSAgaXMgYWN0dWFsbHkgdmFsaWQgVVRGLTggKG9yIHJhdGhlcjogQVNDSUkpLCBzbyB3ZSBkb24ndCBlbmQKKwkgIHVwIHdpdGggbm9uLVVURjggc3RyaW5ncyBpbiB0YWdzIGlmIHRoZXJlJ3MgZ2FyYmFnZSBpbiB0aGUKKwkgIGxhbmd1YWdlIGZpZWxkLiBBbHNvIG1ha2Ugc3VyZSB0aGUgbGFuZ3VhZ2UgY29kZSBpcyBhbHdheXMKKwkgIGxvd2VyIGNhc2UuIEZpeGVzOiAjNTA4MjkxLgorCisyMDA4LTAxLTA5IDEzOjU1OjI4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIENoYW5nZUxvZzogRml4IENoYW5nZUxvZyB0eXBvLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIENoYW5nZUxvZzoKKwkgIEZpeCBDaGFuZ2VMb2cgdHlwby4KKworMjAwOC0wMS0wOSAxMzo1MDowOSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBNYWtlZmlsZS5hbTogSW5jbHVkZSBsY292Lm1hayB0byBhbGxvdyBidWlsZ2luZyBjb3ZlcmFnZSByZXBvcnRzLiBHdWFyZCBjaGVjay10b3J0dXJlIHRhcmdldCBsaWtlIGluIHRoZSBvdGhlciBwYWNrYWdlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBNYWtlZmlsZS5hbToKKwkgIEluY2x1ZGUgbGNvdi5tYWsgdG8gYWxsb3cgYnVpbGdpbmcgY292ZXJhZ2UgcmVwb3J0cy4gR3VhcmQKKwkgIGNoZWNrLXRvcnR1cmUgdGFyZ2V0IGxpa2UgaW4gdGhlIG90aGVyIHBhY2thZ2VzLgorCisyMDA4LTAxLTA5IDEyOjMzOjU4ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IEltcGxlbWVudCBHc3RDaGlsZFByb3h5IGludGVyZmFjZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmV2aWV3ZWQgYnk6IEVkd2FyZCBIZXJ2ZXkgIDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgKGdzdF92aWRlb21peGVyX3NldF9tYXN0ZXJfZ2VvbWV0cnkpLCAoX2RvX2luaXQpLAorCSAgKGdzdF92aWRlb21peGVyX2NoaWxkX3Byb3h5X2dldF9jaGlsZF9ieV9pbmRleCksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfY2hpbGRfcHJveHlfZ2V0X2NoaWxkcmVuX2NvdW50KSwKKwkgIChnc3RfdmlkZW9taXhlcl9jaGlsZF9wcm94eV9pbml0KSwgKGdzdF92aWRlb21peGVyX3Jlc2V0KSwKKwkgIChnc3RfdmlkZW9taXhlcl9pbml0KSwgKGdzdF92aWRlb21peGVyX3JlcXVlc3RfbmV3X3BhZCksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfcmVsZWFzZV9wYWQpLCAoZ3N0X3ZpZGVvbWl4ZXJfZmlsbF9xdWV1ZXMpOgorCSAgSW1wbGVtZW50IEdzdENoaWxkUHJveHkgaW50ZXJmYWNlLgorCSAgU2VuZCBuZXdzZWdtZW50IGF0IHRoZSByaWdodCBtb21lbnQKKwkgIEZpeGVzICM0ODg4NzkKKworMjAwOC0wMS0wOSAxMjowMToxNCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2FscGhhLzogTWFrZSB0aGUgdmFyaW91cyBwcm9wZXJ0aWVzIG9mICdhbHBoYScgY29udHJvbGxhYmxlLiBUaGlzIGFsbG93cyBkb2luZyBuaWNldGllcyBsaWtlIGZhZGUtaW4vZmFkZS1vdXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FscGhhL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzogKGdzdF9hbHBoYV9jbGFzc19pbml0KSwgKGdzdF9hbHBoYV9pbml0KSwKKwkgIChnc3RfYWxwaGFfc2lua19ldmVudCksIChnc3RfYWxwaGFfY2hhaW4pLAorCSAgKGdzdF9hbHBoYV9jaGFuZ2Vfc3RhdGUpLCAocGx1Z2luX2luaXQpOgorCSAgTWFrZSB0aGUgdmFyaW91cyBwcm9wZXJ0aWVzIG9mICdhbHBoYScgY29udHJvbGxhYmxlLiBUaGlzIGFsbG93cyBkb2luZworCSAgbmljZXRpZXMgbGlrZSBmYWRlLWluL2ZhZGUtb3V0LgorCisyMDA4LTAxLTA5IDExOjExOjAxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9ydHAvOiBSZW1vdmUgY29weS9wYXN0ZSB1bnVzZWQgY29kZSAocHJvcGVydHkgc2V0dGVycyBhbmQgZ2V0dGVyKSBmb3VuZCBieSB0aGUgY292ZXJhZ2Ugc3VpdGUgKHlheSwgc2F2ZXMgfjIwayBvbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0YXN0ZXJpc2toMjYzLmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJICBSZW1vdmUgY29weS9wYXN0ZSB1bnVzZWQgY29kZSAocHJvcGVydHkgc2V0dGVycyBhbmQgZ2V0dGVyKSBmb3VuZCBieQorCSAgdGhlIGNvdmVyYWdlIHN1aXRlICh5YXksIHNhdmVzIH4yMGsgb24gZGlzaykuCisKKzIwMDgtMDEtMDggMjA6MDM6MzAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogQWxzbyBmaXggdXAgcGFkIHRlbXBsYXRlcyB0byBpbmRpY2F0ZSB0aGF0IGltYWdlL2pwZWcgZG9lc24ndCBhYnNvbHV0ZWx5IHJlcXVpcmUgdGhlIGZyYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKENPTU1PTl9WSURFT19DQVBTX05PX0ZSQU1FUkFURSksCisJICAodmlkZW9zaW5rX3RlbXBsKToKKwkgIEFsc28gZml4IHVwIHBhZCB0ZW1wbGF0ZXMgdG8gaW5kaWNhdGUgdGhhdCBpbWFnZS9qcGVnIGRvZXNuJ3QKKwkgIGFic29sdXRlbHkgcmVxdWlyZSB0aGUgZnJhbWVyYXRlIHByb3BlcnR5IHRvIGJlIHNldCAoIzUwNDA4MSkuCisKKzIwMDgtMDEtMDggMTk6NTc6MjMgKzAwMDAgIFdvdXRlciBDbG9ldGVucyA8d291dGVyQG1pbmQuYmU+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguKjogS2VlcCB0cmFjayBvZiBmaXJzdCBhbmQgbGFzdCB0aW1lc3RhbXBzIGZvciBlYWNoIGluY29taW5nIHN0cmVhbSwgc28gd2UgY2FuIGNhbGN1bGF0ZSB0aC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBCYXNlZCBvbiBwYXRjaCBieTogV291dGVyIENsb2V0ZW5zICA8d291dGVyIGF0IG1pbmQgYmU+CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfdmlkZW9fcGFkX3NldGNhcHMpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfcmVxdWVzdF9uZXdfcGFkKSwgKGdzdF9tYXRyb3NrYV9tdXhfcmVsZWFzZV9wYWQpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfZmluaXNoKSwgKGdzdF9tYXRyb3NrYV9tdXhfY29sbGVjdGVkKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgS2VlcCB0cmFjayBvZiBmaXJzdCBhbmQgbGFzdCB0aW1lc3RhbXBzIGZvciBlYWNoIGluY29taW5nIHN0cmVhbSwKKwkgIHNvIHdlIGNhbiBjYWxjdWxhdGUgdGhlIHRvdGFsIGR1cmF0aW9uIGZvciBsaXZlIHNvdXJjZXMgYW5kIG90aGVyCisJICBpbnB1dCB3aGVyZSB3ZSBjYW4ndCBxdWVyeSB0aGUgZHVyYXRpb24gZnJvbSB0aGUgc3RhcnQgb3Igd2hlcmUKKwkgIHRoZXJlJ3Mgbm8gY29uc3RhbnQgZnJhbWVyYXRlIGZyb20gd2hpY2ggd2UgY2FuIGRlZHVjZSB0aGUKKwkgIGR1cmF0aW9uOyBhbHNvIHVzZSBjYWxjdWxhdGVkL29ic2VydmVkIGR1cmF0aW9uIGlmIGl0IGlzIGJpZ2dlcgorCSAgdGhhbiB0aGUgcHJldmlvdXNseSBxdWVyaWVkIGR1cmF0aW9uLiBGdXJ0aGVybW9yZSwgdXNlCisJICBnc3RfcGFkX3F1ZXJ5X3BlZXJfZHVyYXRpb24oKSBhbmQgdGFrZSBpbnRvIGFjY291bnQgdGhhdCBpdCBtYXkKKwkgIHJldHVybiBUUlVFIGJ1dCBzdGlsbCBhIGR1cmF0aW9uIG9mIENMT0NLX1RJTUVfTk9ORSwgd2hpY2ggZWFzaWx5CisJICBzY3Jld3MgdXAgY29tcGFyaXNvbnMgd2hlbiB1c2luZyB1bnNpZ25lZCBpbnRlZ2Vycy4gRml4ZXMgIzUwNDA4MS4KKworMjAwOC0wMS0wOCAxNDo1ODoxOCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBNYWtlIGVsZW1lbnRzIEdTVF9CVUZGRVJfRkxBR19HQVAgYXdhcmUgYW5kIGNhbGwgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9nYXBfYXdhcmUgZm9yIHRoaXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzoKKwkgIChnc3RfYXVkaW9fYW1wbGlmeV9jbGlwcGluZ19tZXRob2RfZ2V0X3R5cGUpLAorCSAgKGdzdF9hdWRpb19hbXBsaWZ5X2luaXQpLCAoZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6IChnc3RfYXVkaW9fZHluYW1pY19pbml0KSwKKwkgIChnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1faXApOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2ludmVydC5jOiAoZ3N0X2F1ZGlvX2ludmVydF9pbml0KSwKKwkgIChnc3RfYXVkaW9faW52ZXJ0X3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzogKGdzdF9hdWRpb19wYW5vcmFtYV9pbml0KSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtKToKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6IChnc3RfbGV2ZWxfaW5pdCk6CisJICBNYWtlIGVsZW1lbnRzIEdTVF9CVUZGRVJfRkxBR19HQVAgYXdhcmUgYW5kIGNhbGwKKwkgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfZ2FwX2F3YXJlIGZvciB0aGlzLgorCSAgQnVtcCBjb3JlIHJlcXVpcmVtZW50IHRvIENWUy4KKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9jaGVieXNoZXZmcmVxYmFuZC5jOgorCSAgKGdzdF9hdWRpb19jaGVieXNoZXZfZnJlcV9iYW5kX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYnlzaGV2ZnJlcWxpbWl0LmM6CisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2xpbWl0X3RyYW5zZm9ybV9pcCk6CisJICBBbHNvIHN5bmMgR09iamVjdCBwcm9wZXJ0aWVzIHRvIHRoZSBjb250cm9sbGVyIGlmIG9wZXJhdGluZworCSAgaW4gcGFzc3Rocm91Z2ggbW9kZS4KKworMjAwOC0wMS0wNyAxNjo0MTowMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzogRkFMU0UgaXMgbm90IGEgZ3BvaW50ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkgIChnc3RfZGlyZWN0ZHJhd19zaW5rX3dpbmRvd190aHJlYWQpOgorCSAgRkFMU0UgaXMgbm90IGEgZ3BvaW50ZXIuCisKKzIwMDgtMDEtMDUgMjE6MjA6MDggKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jOiBNYWtlIHN1cmUgd2UgY3JlYXRlIG91ciBpbnRlcm5hbCB3aW5kb3cgb25seSB3aGVuIHdlIG5lZWQgaXQuIFRoYXQgd2lsbCBnaXZlIGEgY2guLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwOC0wMS0wNSAgSnVsaWVuIE1vdXR0ZSAgPGp1bGllbkBmbHVlbmRvLmNvbT4KKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkgIChnc3RfZGlyZWN0ZHJhd19zaW5rX3NldF93aW5kb3dfaWQpLAorCSAgKGdzdF9kaXJlY3RkcmF3X3Npbmtfc2V0X2NhcHMpLAorCSAgKGdzdF9kaXJlY3RkcmF3X3NpbmtfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfZGlyZWN0ZHJhd19zaW5rX2J1ZmZlcl9hbGxvYyksCisJICAoZ3N0X2RpcmVjdGRyYXdfc2lua19kcmF3X2JvcmRlcnMpLAorCSAgKGdzdF9kaXJlY3RkcmF3X3Npbmtfc2hvd19mcmFtZSksCisJICAoZ3N0X2RpcmVjdGRyYXdfc2lua19zZXR1cF9kZHJhdyksCisJICAoZ3N0X2RpcmVjdGRyYXdfc2lua193aW5kb3dfdGhyZWFkKSwKKwkgIChnc3RfZGlyZWN0ZHJhd19zaW5rX2dldF9kZHJhd2NhcHMpLAorCSAgKGdzdF9kaXJlY3RkcmF3X3Npbmtfc3VyZmFjZV9jcmVhdGUpOiBNYWtlIHN1cmUgd2UgY3JlYXRlIG91cgorCSAgaW50ZXJuYWwgd2luZG93IG9ubHkgd2hlbiB3ZSBuZWVkIGl0LiBUaGF0IHdpbGwgZ2l2ZSBhIGNoYW5jZSB0bworCSAgdGhlIGFwcGxpY2F0aW9uIHRvIGdldCB0aGUgcHJlcGFyZS14d2luZG93LWlkIGJ1cyBtZXNzYWdlLiBEcmF3CisJICBibGFjayBib3JkZXJzIHdoZW4ga2VlcGluZyBhc3BlY3QgcmF0aW8uIEhhbmRsZSB0aGUgY2FzZSB3aGVyZQorCSAgb3VyCisJICByZW5kZXJpbmcgd2luZG93IGRpc2FwcGVhcnMgKGNsb3NlZCBvciBlcnJvcnMpIGxpa2Ugb3RoZXIgc2lua3MKKwkgIGRvLiBWYXJpb3VzIDgwIGNvbHVtbnMgZml4ZXMsIGltcHJvdmUgc3RhdGUgY2hhbmdlIG9yZGVyLiBUaGF0CisJICBlbGVtZW50IGNvdWxkIG5lZWQgc29tZSBtb3JlIGxvdmUuCisKKzIwMDgtMDEtMDQgMTg6MzA6MjEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3RhZ2xpYi86IFJlbW92ZSB1c2VsZXNzIHR5cGVkZWZzIHdpdGhvdXQgbmV3IHR5cGUgbmFtZS4gRml4ZXMgYSB3YXJuaW5nIHdpdGggZ2NjIDQuMy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvdGFnbGliL2dzdGFwZXYybXV4Lmg6CisJICAqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguaDoKKwkgIFJlbW92ZSB1c2VsZXNzIHR5cGVkZWZzIHdpdGhvdXQgbmV3IHR5cGUgbmFtZS4gRml4ZXMgYSB3YXJuaW5nIHdpdGgKKwkgIGdjYyA0LjMuCisKKzIwMDgtMDEtMDMgMTI6MjY6MDMgKzAwMDAgIEpvaG4gTWlsbGlraW4gPGptaWxsaWtpbkBnbWFpbC5jb20+CisKKwkgIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogRW1pdCBtZXRhZGF0YSBtZXNzYWdlcyB3aGVuIGEgUElDVFVSRSBibG9jayBpcyBlbmNvdW50ZXJlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEpvaG4gTWlsbGlraW4gPGptaWxsaWtpbiBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19kZWNfc2V0dXBfc2Vla2FibGVfZGVjb2RlciksCisJICAoZ3N0X2ZsYWNfZGVjX3NldHVwX3N0cmVhbV9kZWNvZGVyKSwKKwkgIChnc3RfZmxhY19ub3JtYWxpemVfcGljdHVyZV9taW1lX3R5cGUpLAorCSAgKGdzdF9mbGFjX2V4dHJhY3RfcGljdHVyZV9idWZmZXIpLAorCSAgKGdzdF9mbGFjX2RlY19tZXRhZGF0YV9jYWxsYmFjayk6CisJICBFbWl0IG1ldGFkYXRhIG1lc3NhZ2VzIHdoZW4gYSBQSUNUVVJFIGJsb2NrIGlzIGVuY291bnRlcmVkLgorCSAgRml4ZXMgIzUwNjcxNS4KKworMjAwOC0wMS0wMiAxMzo1NDoxMCArMDAwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmkuYzogaW5jcmVhc2UgcmFuayBiZWNhdXNlIG5vIGtub3duIGlzc3VlcyBhbnltb3JlIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpLmM6CisJICBpbmNyZWFzZSByYW5rIGJlY2F1c2Ugbm8ga25vd24gaXNzdWVzIGFueW1vcmUgLi4uCisJICAqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkgIHNlbmQgc3VidGl0bGUgbmFtZSB0byB0aGUgc3JjcGFkCisKKzIwMDctMTItMzEgMTM6Mjc6MzIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuKjogSW1wbGVtZW50IHJlZGlyZWN0IGZvciB0aGUgREVTQ1JJQkUgcmVwbHkuIEZpeGVzICM1MDYwMjUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc2VuZCksIChnc3RfcnRzcHNyY19vcGVuKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgSW1wbGVtZW50IHJlZGlyZWN0IGZvciB0aGUgREVTQ1JJQkUgcmVwbHkuIEZpeGVzICM1MDYwMjUuCisKKzIwMDctMTItMjkgMTY6NDg6MzMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiBGaXggJ3h5eiBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkJyBjb21waWxlciB3YXJuaW5ncyBjYXVzZWQgYnkgYnJva2VuIGdfYXNzZXJ0X25vdF9yZWFjaGVkKCkgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfZGVjX3dyaXRlKToKKwkgIEZpeCAneHl6IG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQnIGNvbXBpbGVyIHdhcm5pbmdzIGNhdXNlZAorCSAgYnkgYnJva2VuIGdfYXNzZXJ0X25vdF9yZWFjaGVkKCkgbWFjcm8gaW4gR0xpYi0yLjE1LnggYW5kIGRvbid0CisJICBhYm9ydCgpIGluIGFueSBjYXNlIGJ1dCBwcm9wZXJseSByZXBvcnQgdGhlIGVycm9yLgorCisyMDA3LTEyLTI4IDExOjQ0OjI4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvc291cC86IFVzZSBnc3RfdGFnX2ZyZWVmb3JtX3N0cmluZ190b191dGY4KCkgYW5kIHBvc3QgcmFkaW8gc3RhdGlvbiBpbmZvIGFzIHRhZ3Mgb24gdGhlIGJ1cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc291cC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKGdzdF9zb3VwaHR0cF9zcmNfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX3VuaWNvZGlmeSksIChzb3VwX2dvdF9oZWFkZXJzKToKKwkgIFVzZSBnc3RfdGFnX2ZyZWVmb3JtX3N0cmluZ190b191dGY4KCkgYW5kIHBvc3QgcmFkaW8gc3RhdGlvbgorCSAgaW5mbyBhcyB0YWdzIG9uIHRoZSBidXMuCisKKzIwMDctMTItMjYgMTY6MDM6NTcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIEZpeCAneHl6IG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQnIGNvbXBpbGVyIHdhcm5pbmdzIGNhdXNlZCBieSBicm9rZW4gZ19hc3NlcnRfbm90X3JlYWNoZWQoKSBtYWNybyBpbiBHTGliLTIuMTUueCAoaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfbG9vcCk6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2NoYWluKToKKwkgICogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzogKGNvbXBvc2l0ZV9waXhlbCk6CisJICBGaXggJ3h5eiBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkJyBjb21waWxlciB3YXJuaW5ncyBjYXVzZWQKKwkgIGJ5IGJyb2tlbiBnX2Fzc2VydF9ub3RfcmVhY2hlZCgpIG1hY3JvIGluIEdMaWItMi4xNS54IChpdCdzCisJICBub3QgcmVhbGx5IG5pY2UgdG8gYWJvcnQgaW4gYW55IGNhc2UpLiBGaXhlcyAjNTA1NzQ1LgorCisyMDA3LTEyLTIwIDE3OjA3OjIyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvOiBJZ25vcmUgbW9yZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyLy5jdnNpZ25vcmU6CisJICAqIGdzdC9zd2l0Y2gvLmN2c2lnbm9yZToKKwkgIElnbm9yZSBtb3JlLgorCisyMDA3LTEyLTE4IDIzOjE3OjE0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdmlzdWJ0aXRsZS5jOiBTbWFsbCB1bml0IHRlc3QgZml4IChoYXMgbm8gcHJhY3RpY2FsIGltcGFjdCBhdCB0aGUgbW9tZW50LCBzaW5jZSB3ZSdyZSBvbmx5IGZlZWQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdmlzdWJ0aXRsZS5jOiAoY2hlY2tfY29ycmVjdF9idWZmZXIpOgorCSAgU21hbGwgdW5pdCB0ZXN0IGZpeCAoaGFzIG5vIHByYWN0aWNhbCBpbXBhY3QgYXQgdGhlIG1vbWVudCwKKwkgIHNpbmNlIHdlJ3JlIG9ubHkgZmVlZGluZyB1dGY4IGFuZCBoZW5jZSBqdXN0IGNyZWF0ZSBhIHN1Yi0KKwkgIGJ1ZmZlciBmb3IgdGhlIG91dHB1dCkuCisKKzIwMDctMTItMTggMjE6MTM6MDUgKzAwMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkgIEFkZCBzZWVraW5nIHN1cHBvcnQgZm9yIGF2aSBzdWJ0aXRsZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpc3VidGl0bGUuYzoKKwkgIEFkZCBzZWVraW5nIHN1cHBvcnQgZm9yIGF2aSBzdWJ0aXRsZQorCisyMDA3LTEyLTE4IDE3OjQwOjM0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLio6IFJlbW92ZSBzb21lIHVudXNlZCB2YXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjX2RlY19yZXNldF9kZWNvZGVycyksCisJICAoZ3N0X2ZsYWNfZGVjX3VwZGF0ZV9tZXRhZGF0YSksIChnc3RfZmxhY19kZWNfbWV0YWRhdGFfY2FsbGJhY2spLAorCSAgKGdzdF9mbGFjX2RlY193cml0ZSk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuaDoKKwkgIFJlbW92ZSBzb21lIHVudXNlZCB2YXJzLgorCSAgRG8gbW9yZSBjbGVhbnVwIG9mIGxlZnRvdmVyIGV2ZW50cyBhbmQgdGFncy4KKwkgIE91dHB1dCB0YWdzIGFmdGVyIHRoZSBzZWdtZW50IGV2ZW50LiBGaXhlcyAjNTA0MDE4LgorCisyMDA3LTEyLTE4IDE0OjMxOjM2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmM6IERldGVjdCBvdGhlciBVVEYgYnl0ZSBvcmRlciBtYXJrZXJzIGFuZCBjb252ZXJ0IHRvIFVURi04IGFzIGFwcHJvcHJpYXRlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzogKElTX0JPTV9VVEY4KSwgKElTX0JPTV9VVEYxNl9CRSksCisJICAoSVNfQk9NX1VURjE2X0xFKSwgKElTX0JPTV9VVEYzMl9CRSksIChJU19CT01fVVRGMzJfTEUpLAorCSAgKGdzdF9hdmlfc3VidGl0bGVfZXh0cmFjdF9maWxlKSwgKGdzdF9hdmlfc3VidGl0bGVfcGFyc2VfZ2FiMl9jaHVuayk6CisJICBEZXRlY3Qgb3RoZXIgVVRGIGJ5dGUgb3JkZXIgbWFya2VycyBhbmQgY29udmVydCB0byBVVEYtOCBhcworCSAgYXBwcm9wcmlhdGUuCisKKzIwMDctMTItMTggMTM6MzA6MTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuKjogUmVmYWN0b3IgYSBiaXQ7IGZpeCBuYW1lIGV4dHJhY3Rpb247IGRvbid0IGFzc3VtZSBhbGwgdGhlIGRhdGEgaW4gdGhlIGNodW5rIGlzIGFjdHVhbGx5IHN1Yi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzogKHNyY190ZW1wbGF0ZSksCisJICAoZ3N0X2F2aV9zdWJ0aXRsZV9leHRyYWN0X3V0ZjhfZmlsZSksCisJICAoZ3N0X2F2aV9zdWJ0aXRsZV9wYXJzZV9nYWIyX2NodW5rKSwgKGdzdF9hdmlfc3VidGl0bGVfY2hhaW4pLAorCSAgKGdzdF9hdmlfc3VidGl0bGVfYmFzZV9pbml0KSwgKGdzdF9hdmlfc3VidGl0bGVfY2xhc3NfaW5pdCksCisJICAoZ3N0X2F2aV9zdWJ0aXRsZV9pbml0KSwgKGdzdF9hdmlfc3VidGl0bGVfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L2F2aS9nc3RhdmlzdWJ0aXRsZS5oOgorCSAgUmVmYWN0b3IgYSBiaXQ7IGZpeCBuYW1lIGV4dHJhY3Rpb247IGRvbid0IGFzc3VtZSBhbGwgdGhlIGRhdGEKKwkgIGluIHRoZSBjaHVuayBpcyBhY3R1YWxseSBzdWJ0aXRsZSBkYXRhLCB0aGVyZSBtYXkgYmUgcGFkZGluZyBhdAorCSAgdGhlIGVuZDsgZml4IEdTVF9FTEVNRU5UX0VSUk9SIHVzYWdlOyBzdG9yZSBleHRyYWN0ZWQgc3VidGl0bGUKKwkgIGZpbGUgc28gaXQncyB0aGVyZSB0byBzZW5kIGFnYWluIGFmdGVyIGEgc2VlayAoZm9yIGZ1dHVyZSB1c2UpLgorCisyMDA3LTEyLTE4IDA5OjEzOjEyICswMDAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJICBBZGQgYXZpIHN1YnRpdGxlIGVsZW1lbnQgZm9yIGJ1ZyAjNDQyMDM0LiBOZWVkIHNlZWtpbmcgc3VwcG9ydCBhbmQgbW9yZSBzdXBwb3J0IGZvciBjaGFyYWN0ZXIgY29udmVyc2lvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXZpL2dzdGF2aS5jOgorCSAgKiBnc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmM6CisJICAqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuaDoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aXN1YnRpdGxlLmM6CisJICAqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIEFkZCBhdmkgc3VidGl0bGUgZWxlbWVudCBmb3IgYnVnICM0NDIwMzQuIE5lZWQgc2Vla2luZyBzdXBwb3J0CisJICBhbmQgbW9yZSBzdXBwb3J0IGZvciBjaGFyYWN0ZXIgY29udmVyc2lvbi4KKworMjAwNy0xMi0xOCAwOTowNzoxNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgTWFrZWZpbGUuYW06IEluY2x1ZGUgY29tbW9uL3dpbjMyLm1hayBmb3IgQ1JMRiBjaGVjayBvZiB3aW4zMiBwcm9qZWN0IGZpbGVzIChzZWUgIzM5MzYyNikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogTWFrZWZpbGUuYW06CisJICBJbmNsdWRlIGNvbW1vbi93aW4zMi5tYWsgZm9yIENSTEYgY2hlY2sgb2Ygd2luMzIgcHJvamVjdAorCSAgZmlsZXMgKHNlZSAjMzkzNjI2KS4KKwkgICogd2luMzIvdnM2L2xpYmdzdHBuZy5kc3A6CisJICBGaXggbGluZSBlbmRpbmdzIGFuZCBkbyBjdnMgYWRtaW4gLWtiLgorCisyMDA3LTEyLTE3IDIxOjEyOjI4ICswMDAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSAgZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuKjogV2hlbiBzdWJzZXF1ZW50IGZpbGVzIGFyZSByZWFkLCBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LCBzZW5kIGFuIEVPUyBpbnN0ZWFkIG9mIGNhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkgICogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuaDoKKwkgIFdoZW4gc3Vic2VxdWVudCBmaWxlcyBhcmUgcmVhZCwgaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCwgc2VuZAorCSAgYW4gRU9TIGluc3RlYWQgb2YgY2F1c2luZyBhbiBlcnJvci4KKworMjAwNy0xMi0xNiAyMzo0Mzo0NiArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiBBY3R1YWxseSBkcm9wIHRoZSBidWZmZXJzIHdoaWNoIGFyZSBvdXRzaWRlIHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCBzZWdtZW50IGluc3RlYWQgb2YganVzdCBlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2pwZWdfZGVjX2NoYWluKToKKwkgIEFjdHVhbGx5IGRyb3AgdGhlIGJ1ZmZlcnMgd2hpY2ggYXJlIG91dHNpZGUgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkCisJICBzZWdtZW50IGluc3RlYWQgb2YganVzdCBlbWl0dGluZyBhIFdBUk5JTkcuCisKKzIwMDctMTItMTQgMTg6NDk6MzQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9mbGFjL2dzdGZsYWNkZWMuKjogU2VuZCBzZWdtZW50cyBmcm9tIHRoZSBzdHJlYW1pbmcgdGhyZWFkLiBGaXhlcyAjNTAyMTg3LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjX2RlY19tZXRhZGF0YV9jYWxsYmFjayksCisJICAoZ3N0X2ZsYWNfZGVjX3dyaXRlKToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oOgorCSAgU2VuZCBzZWdtZW50cyBmcm9tIHRoZSBzdHJlYW1pbmcgdGhyZWFkLiBGaXhlcyAjNTAyMTg3LgorCSAgRml4IHNlZ21lbnQgc2Vla2luZyBhbmQgYSBidW5jaCBvZiBvdGhlciBzZWVraW5nIGNhc2VzLgorCisyMDA3LTEyLTE0IDEwOjE3OjEwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogUGFyc2UgV09BRiBmcmFtZXMgYW5kIHB1dCB0aGUgcmVzdWx0IGludG8gR1NUX1RBR19DT05UQUNULCB3aGljaCBpcyB3aGVyZSBpdCB3b3VsZCBlbmQgdXAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKHBhcnNlX3VybF9saW5rX2ZyYW1lKToKKwkgIFBhcnNlIFdPQUYgZnJhbWVzIGFuZCBwdXQgdGhlIHJlc3VsdCBpbnRvIEdTVF9UQUdfQ09OVEFDVCwKKwkgIHdoaWNoIGlzIHdoZXJlIGl0IHdvdWxkIGVuZCB1cCBpZiB0aGUgc2FtZSBpbmZvcm1hdGlvbiB3YXMKKwkgIHB1dCBpbiBhIHZvcmJpcyBjb21tZW50IChkb24ndCB0aGluayBpdCdzIHdvcnRoIGFkZGluZyBhCisJICBuZXcgVVJJIHRhZyBmb3IgdGhpcykuIEZpeGVzICM0ODgxMTIuCisKKzIwMDctMTItMTEgMjI6Mjk6MTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogV2UgbmVlZCBjb3JlL2Jhc2UgMC4xMC4xNSBvciBsYXRlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBXZSBuZWVkIGNvcmUvYmFzZSAwLjEwLjE1IG9yIGxhdGVyLgorCisyMDA3LTEyLTExIDE2OjQ3OjEyICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorCisJICBnc3QvYXZpL2dzdGF2aW11eC5jOiBGaXggcmVncmVzc2lvbiBpbiBzdHJlYW0gbnVtYmVyaW5nLiBGaXhlcyAjNTAyNjU1LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3IHNreW5ldCBiZT4KKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzogKGdzdF9hdmlfbXV4X3N0YXJ0X2ZpbGUpOgorCSAgRml4IHJlZ3Jlc3Npb24gaW4gc3RyZWFtIG51bWJlcmluZy4gRml4ZXMgIzUwMjY1NS4KKworMjAwNy0xMi0xMSAxNjozOTozOSArMDAwMCAgV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuKjogRG8gbm90IHRyeSB0byB1bnBhdXNlIEkvTyBpbiB0aGUgInF1ZXVlZCIgc3RhdGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBXb3V0ZXIgQ2xvZXRlbnMgPHdvdXRlciBhdCBtaW5kIGRvdCBiZT4KKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKF9kb19pbml0KSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3NvdXBodHRwX3NyY19pbml0KSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX2Rpc3Bvc2UpLCAoZ3N0X3NvdXBodHRwX3NyY19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9zb3VwaHR0cF9zcmNfZ2V0X3Byb3BlcnR5KSwgKHVuaWNvZGlmeSksCisJICAoZ3N0X3NvdXBodHRwX3NyY191bmljb2RpZnkpLCAoZ3N0X3NvdXBodHRwX3NyY19jcmVhdGUpLAorCSAgKGdzdF9zb3VwaHR0cF9zcmNfc3RhcnQpLCAoZ3N0X3NvdXBodHRwX3NyY19zdG9wKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX3VubG9jayksIChnc3Rfc291cGh0dHBfc3JjX3VubG9ja19zdG9wKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX2dldF9zaXplKSwgKGdzdF9zb3VwaHR0cF9zcmNfaXNfc2Vla2FibGUpLAorCSAgKHNvdXBfZ290X2hlYWRlcnMpLCAoc291cF9nb3RfYm9keSksIChzb3VwX2ZpbmlzaGVkKSwKKwkgIChzb3VwX2dvdF9jaHVuayksIChzb3VwX3Jlc3BvbnNlKSwgKHNvdXBfcGFyc2Vfc3RhdHVzKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX3VyaV9nZXRfdHlwZSksCisJICAoZ3N0X3NvdXBodHRwX3NyY191cmlfZ2V0X3Byb3RvY29scyksCisJICAoZ3N0X3NvdXBodHRwX3NyY191cmlfZ2V0X3VyaSksIChnc3Rfc291cGh0dHBfc3JjX3VyaV9zZXRfdXJpKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX3VyaV9oYW5kbGVyX2luaXQpOgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgRG8gbm90IHRyeSB0byB1bnBhdXNlIEkvTyBpbiB0aGUgInF1ZXVlZCIgc3RhdGUuCisJICBSZW9yZ2FuaXNlIGEgYnVuY2ggb2YgdGhpbmdzIGFuZCBjbGVhbnVwcy4KKwkgIFVzZXMgR19HVUlOVDY0X0ZPUk1BVCBpbnN0ZWFkIG9mIGhhcmQtY29kaW5nICVsbHUuCisJICBTZWUgIzUwMjMzNS4KKworMjAwNy0xMi0xMSAxNjozMTo0OSArMDAwMCAgV2FpLU1pbmcgSG8gPHdlYnJlZ2JveEB5YWhvby5jby51az4KKworCSAgZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lio6IFVzZSBoaWdoZXIgcGVyZm9ybWFuY2Ugc3RhcnQtY29kZSBzZWFyY2hpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBXYWktTWluZyBIbyA8d2VicmVnYm94IGF0IHlhaG9vIGRvdCBjbyBkb3QgdWs+CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOiAoZ3N0X3J0cF9oMjY0X3BheV9pbml0KSwKKwkgIChnc3RfcnRwX2gyNjRfcGF5X2ZpbmFsaXplKSwgKGdzdF9ydHBfaDI2NF9wYXlfc2V0Y2FwcyksCisJICAobmV4dF9zdGFydF9jb2RlKSwgKGlzX25hbF9lcXVhbCksIChnc3RfcnRwX2gyNjRfcGF5X2RlY29kZV9uYWwpLAorCSAgKGVuY29kZV9iYXNlNjQpLCAoZ3N0X3J0cF9oMjY0X3BheV9wYXJzZV9zcHNfcHBzKSwKKwkgIChnc3RfcnRwX2gyNjRfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuaDoKKwkgIFVzZSBoaWdoZXIgcGVyZm9ybWFuY2Ugc3RhcnQtY29kZSBzZWFyY2hpbmcuCisJICBQYXJzZSBOQUxzIGFuZCBzdG9yZSBTUFMsIFBQUyBhbmQgcHJvZmlsZSBpbiB0aGUgY2FwcyBzbyB0aGF0IHRoZXkgY2FuCisJICBiZSB1c2VkIGluIHRoZSBTRFAuIEZpeGVzICM1MDI4MTQuCisKKzIwMDctMTItMTEgMTE6NTA6NTQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHN5cy92NGwyLzogSW5pdCBzb21lIHN0cnVjdHMgdG8gemVybyBiZWZvcmUgd2UgcGFzcyB0aGVtIHRvIGlvY3RsLCB3aGljaCBhdm9pZHMgdmFsZ3JpbmQgd2FybmluZ3MuICBBbHNvIGZpeCBhIHNtYWxsIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzogKGdzdF92NGwyX2ZpbGxfbGlzdHMpOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IChnc3RfdjRsMnNyY19maWxsX2Zvcm1hdF9saXN0KToKKwkgIEluaXQgc29tZSBzdHJ1Y3RzIHRvIHplcm8gYmVmb3JlIHdlIHBhc3MgdGhlbSB0byBpb2N0bCwgd2hpY2gKKwkgIGF2b2lkcyB2YWxncmluZCB3YXJuaW5ncy4gIEFsc28gZml4IGEgc21hbGwgbWVtb3J5IGxlYWsuCisKKzIwMDctMTItMTEgMTE6MDU6NTcgKzAwMDAgIFdvdXRlciBDbG9ldGVucyA8d291dGVyQG1pbmQuYmU+CisKKwkgIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzogQ29weSB0aW1lc3RhbXAgZnJvbSBpbnB1dCB0byBvdXRwdXQuIE5vdCB2ZXJ5IHBlcmZlY3QgeWV0IGJ1dCBiZXR0ZXIgdGhhbiBub3RoaW5nLiBGaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogV291dGVyIENsb2V0ZW5zIDx3b3V0ZXIgYXQgbWluZCBkb3QgYmU+CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzogKGdzdF9tdWx0aXBhcnRfZGVtdXhfY2hhaW4pOgorCSAgQ29weSB0aW1lc3RhbXAgZnJvbSBpbnB1dCB0byBvdXRwdXQuIE5vdCB2ZXJ5IHBlcmZlY3QgeWV0IGJ1dCBiZXR0ZXIKKwkgIHRoYW4gbm90aGluZy4gRml4ZXMgIzUwMzAyMy4KKworMjAwNy0xMi0wOSAxNjo0OTowOSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IEFsc28gcHJpbnQgYSB1c2VmdWwgZXJyb3IgbWVzc2FnZSB3aXRoIHRoZSBvbGQgV2F2cGFjayBBUEkgaWYgcG9zc2libGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX2NoYWluKToKKwkgIEFsc28gcHJpbnQgYSB1c2VmdWwgZXJyb3IgbWVzc2FnZSB3aXRoIHRoZSBvbGQgV2F2cGFjayBBUEkKKwkgIGlmIHBvc3NpYmxlLgorCisyMDA3LTEyLTA5IDE2OjM0OjA4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IE1vcmUgYnVpbGQgZml4ZXMgZm9yIG9sZCBsaWJ3YXZwYWNrIHZlcnNpb25zOiBpbmNsdWRlIGNvbmZpZy5oIHNvIHRoYXQgV0FWUEFDS19PTERfQVBJIGkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6CisJICBNb3JlIGJ1aWxkIGZpeGVzIGZvciBvbGQgbGlid2F2cGFjayB2ZXJzaW9uczogaW5jbHVkZSBjb25maWcuaCBzbworCSAgdGhhdCBXQVZQQUNLX09MRF9BUEkgaXMgYWN0dWFsbHkgZGVmaW5lZCBhcyBkZXRlY3RlZDsgb25seSB1c2UKKwkgIFdhdnBhY2tHZXRFcnJvck1lc3NhZ2UgaWYgaXQgaXMgYXZhaWxhYmxlLiBUaGlzIGZpeGVzIHRoZSBidWlsZAorCSAgb24gZGViaWFuIHN0YWJsZSBmb3IgbWUuCisKKzIwMDctMTItMDkgMTY6MjE6MDIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svOiBXb3JrYXJvdW5kIHRoZSBub24tZXhpc3RhbmNlIG9mIFdhdnBhY2tHZXRDaGFubmVsTWFzayBpbiBXYXZwYWNrIHZlcnNpb25zIGJlbG93IDQuNDAuMC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfY2hhaW4pOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9jcmVhdGVfc3JjX3BhZCk6CisJICBXb3JrYXJvdW5kIHRoZSBub24tZXhpc3RhbmNlIG9mIFdhdnBhY2tHZXRDaGFubmVsTWFzayBpbiBXYXZwYWNrCisJICB2ZXJzaW9ucyBiZWxvdyA0LjQwLjAuCisKKzIwMDctMTItMDkgMDU6MTM6NTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgY29uZmlndXJlLmFjOiBBbmQgbm93IGRvIGl0IHJpZ2h0IGZvciByZWFsLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgQW5kIG5vdyBkbyBpdCByaWdodCBmb3IgcmVhbC4uLgorCisyMDA3LTEyLTA5IDA1OjA5OjU3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGNvbmZpZ3VyZS5hYzogQ29ycmVjdGx5IHJlc2V0ICRMSUJTIHRvIG5vdCBjb250YWluIC1sbS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBDb3JyZWN0bHkgcmVzZXQgJExJQlMgdG8gbm90IGNvbnRhaW4gLWxtLgorCisyMDA3LTEyLTA5IDA1OjAyOjE3ICswMDAwICBLd2FuZyBZdWwgU2VvIDxrd2FuZ3l1bC5zZW9AZ21haWwuY29tPgorCisJICBGaXggY29tcGlsYXRpb24gd2l0aCBNU1ZDIGJ5IHVzaW5nIGdzdF91dGlsX2d1aW50NjRfdG9fZ2RvdWJsZSgpIGFuZCBjaGVja2luZyBmb3IgcmludCgpIGFuZCBpbXBsZW1lbnRpbmcgaXQgb3Vyc2VsZiAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gYSBwYXRjaCBieTogS3dhbmcgWXVsIFNlbyA8a3dhbmd5dWwgZG90IHNlbyBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGV4dC9jYWlyby9nc3R0aW1lb3ZlcmxheS5jOgorCSAgKGdzdF9jYWlyb190aW1lX292ZXJsYXlfcHJpbnRfc21wdGVfdGltZSk6CisJICBGaXggY29tcGlsYXRpb24gd2l0aCBNU1ZDIGJ5IHVzaW5nIGdzdF91dGlsX2d1aW50NjRfdG9fZ2RvdWJsZSgpCisJICBhbmQgY2hlY2tpbmcgZm9yIHJpbnQoKSBhbmQgaW1wbGVtZW50aW5nIGl0IG91cnNlbGYgaWYgaXQgZG9lc24ndAorCSAgZXhpc3QuCisKKzIwMDctMTItMDkgMDQ6Mjk6MDggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgY29uZmlndXJlLmFjOiBEb24ndCBkZWZpbmUgR1NUX0RJU0FCTEVfREVQUkVDQVRFRCBmb3IgcmVsZWFzZXMuIEZpeGVzICM0OTgxODEuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgRG9uJ3QgZGVmaW5lIEdTVF9ESVNBQkxFX0RFUFJFQ0FURUQgZm9yIHJlbGVhc2VzLiBGaXhlcyAjNDk4MTgxLgorCisyMDA3LTEyLTA4IDE2OjQ3OjMzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgc3lzL29zcy9nc3Rvc3NoZWxwZXIuYzogVmVyaWZ5IHRoYXQgdGhlIGZvcm1hdCByZXR1cm5lZCBhZnRlciB0aGUgaW9jdGwgaXMgdGhlIG9uZSB3ZSByZXF1ZXN0ZWQuIEl0IGlzIHZhbGlkIGZvciB0aGUgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL29zcy9nc3Rvc3NoZWxwZXIuYzoKKwkgIFZlcmlmeSB0aGF0IHRoZSBmb3JtYXQgcmV0dXJuZWQgYWZ0ZXIgdGhlIGlvY3RsIGlzIHRoZSBvbmUKKwkgIHdlIHJlcXVlc3RlZC4gSXQgaXMgdmFsaWQgZm9yIHRoZSBpb2N0bCB0byBzdWNjZWVkIHdoaWxlCisJICBzdWJzdGl0dXRpbmcgYW4gYWx0ZXJuYXRlICdzdXBwb3J0ZWQnIHNhbXBsZSBmb3JtYXQuCisKKzIwMDctMTItMDcgMjA6MDc6NDkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHN5cy9vc3MvOiBQb3N0IGRlY2VudCAoYW5kIHRyYW5zbGF0ZWQpIGVycm9yIG1lc3NhZ2Ugd2hlbiB3ZSBjYW4ndCBvcGVuIHRoZSBhdWRpbyBkZXZpY2UgZm9yIHNvbWUgcmVhc29uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3MvZ3N0b3NzYXVkaW8uYzogKHBsdWdpbl9pbml0KToKKwkgICogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IChnc3Rfb3NzX3Npbmtfb3Blbik6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc3JjLmM6IChnc3Rfb3NzX3NyY19vcGVuKToKKwkgIFBvc3QgZGVjZW50IChhbmQgdHJhbnNsYXRlZCkgZXJyb3IgbWVzc2FnZSB3aGVuIHdlIGNhbid0CisJICBvcGVuIHRoZSBhdWRpbyBkZXZpY2UgZm9yIHNvbWUgcmVhc29uLgorCisyMDA3LTEyLTA3IDE5OjI5OjM5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgc3lzL29zcy86IEFsbG93IHRoZSBBVURJT0RFViBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byByZWRpcmVjdCB1cyB0byBhIGRpZmZlcmVudCBkZWZhdWx0IE9TUyBkZXZpY2UsIGxpa2Ugc3VuYXVkaW9zaW5rLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL29zcy9nc3Rvc3NzaW5rLmM6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc3JjLmM6CisJICBBbGxvdyB0aGUgQVVESU9ERVYgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcmVkaXJlY3QgdXMKKwkgIHRvIGEgZGlmZmVyZW50IGRlZmF1bHQgT1NTIGRldmljZSwgbGlrZSBzdW5hdWRpb3NpbmsgZG9lcworCSAgb24gU29sYXJpcyAobWFrZXMgYXVkaW8gcGxheSBhdXRvbWF0aWNhbGx5IG9uIFN1blJheXMpLgorCisyMDA3LTEyLTA2IDEyOjQ1OjUwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6IEZpeCBjb21waWxhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSAgKGdzdF9paXJfZXF1YWxpemVyX3RyYW5zZm9ybV9pcCk6CisJICBGaXggY29tcGlsYXRpb24uCisKKzIwMDctMTItMDYgMTI6NDI6MTEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzogRG9uJ3QgcHJvY2VzcyBidWZmZXJzIGluIHBhc3N0aHJvdWdoIG1vZGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIChnc3RfaWlyX2VxdWFsaXplcl90cmFuc2Zvcm1faXApOgorCSAgRG9uJ3QgcHJvY2VzcyBidWZmZXJzIGluIHBhc3N0aHJvdWdoIG1vZGUuCisKKzIwMDctMTItMDYgMTI6Mzc6NDMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ZpbHRlci86IFRoZSB0cmFuc2Zvcm0oKSBtZXRob2RzIGFyZSBub3QgY2FsbGVkIGluIHBhc3N0aHJvdWdoIG1vZGUgc28gdGhlcmUncyBubyBuZWVkIGZvciBjaGVja2luZyBpZiB0aGUgZWxlbWVuLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ZpbHRlci9nc3RicHdzaW5jLmM6IChicHdzaW5jX3RyYW5zZm9ybSk6CisJICAqIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy5jOiAobHB3c2luY190cmFuc2Zvcm0pOgorCSAgVGhlIHRyYW5zZm9ybSgpIG1ldGhvZHMgYXJlIG5vdCBjYWxsZWQgaW4gcGFzc3Rocm91Z2ggbW9kZSBzbworCSAgdGhlcmUncyBubyBuZWVkIGZvciBjaGVja2luZyBpZiB0aGUgZWxlbWVudCBpcyBpbiBwYXNzdGhyb3VnaCBtb2RlLgorCisyMDA3LTEyLTA2IDEyOjI5OjI2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9maWx0ZXIvOiBTeW5jIHRoZSBHT2JqZWN0IHByb3BlcnRpZXMgd2l0aCB0aGUgY29udHJvbGxlciBldmVuIGluIHBhc3N0aHJvdWdoIG1vZGUgdG8gZ2V0IGNvbnNpc3RlbnQgcHJvcGVydHkgdmFsdWVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5jOiAoYnB3c2luY190cmFuc2Zvcm0pOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKGxwd3NpbmNfdHJhbnNmb3JtKToKKwkgIFN5bmMgdGhlIEdPYmplY3QgcHJvcGVydGllcyB3aXRoIHRoZSBjb250cm9sbGVyIGV2ZW4gaW4gcGFzc3Rocm91Z2gKKwkgIG1vZGUgdG8gZ2V0IGNvbnNpc3RlbnQgcHJvcGVydHkgdmFsdWVzLgorCisyMDA3LTEyLTA2IDEyOjExOjI5ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9hdWRpb2Z4LzogVGhlIHRyYW5zZm9ybV9pcCgpIG1ldGhvZHMgc2hvdWxkIGRvIG5vdGhpbmcgaWYgaW4gcGFzc3Rocm91Z2ggbW9kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzogKGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYnlzaGV2ZnJlcWJhbmQuYzoKKwkgIChnc3RfYXVkaW9fY2hlYnlzaGV2X2ZyZXFfYmFuZF90cmFuc2Zvcm1faXApOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJ5c2hldmZyZXFsaW1pdC5jOgorCSAgKGdzdF9hdWRpb19jaGVieXNoZXZfZnJlcV9saW1pdF90cmFuc2Zvcm1faXApOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2R5bmFtaWMuYzogKGdzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0LmM6IChnc3RfYXVkaW9faW52ZXJ0X3RyYW5zZm9ybV9pcCk6CisJICBUaGUgdHJhbnNmb3JtX2lwKCkgbWV0aG9kcyBzaG91bGQgZG8gbm90aGluZyBpZiBpbiBwYXNzdGhyb3VnaCBtb2RlLgorCSAgSXQgbWlnaHQgZ2V0IG5vbi13cml0YWJsZSBidWZmZXJzIGluIHRoYXQgY2FzZSBidXQgdGhlIGJ1ZmZlciBtaWdodAorCSAgYXMgd2VsbCBiZSB3cml0YWJsZS4KKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOiAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybSk6CisJICBUaGUgdHJhbnNmb3JtKCkgbWV0aG9kcyB3b24ndCBiZSBjYWxsZWQgaW4gcGFzc3Rocm91Z2ggbW9kZSBhbmQKKwkgIG90aGVyd2lzZSB0aGUgYnVmZmVyIGlzIGFsd2F5cyB3cml0YWJsZSBzbyBkb24ndCBjaGVjayBoZXJlLgorCisyMDA3LTEyLTA2IDExOjQ2OjIyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogRml4IHNlZWtpbmcgaW4gLndhdiBmaWxlcyBhZ2FpbiAoIzUwMTc3NSkuICBTb21lIHBlb3BsZSBzZWVtIHRvIHRoaW5rIHRoZXkgZG9uJ3QgbmVlZCB0byAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9zcmNwYWRfZXZlbnQpOgorCSAgRml4IHNlZWtpbmcgaW4gLndhdiBmaWxlcyBhZ2FpbiAoIzUwMTc3NSkuICBTb21lIHBlb3BsZSBzZWVtIHRvIHRoaW5rCisJICB0aGV5IGRvbid0IG5lZWQgdG8gdGVzdCB0aGVpciBjaGFuZ2VzIHdoZW4gdGhleSdyZSBqdXN0ICdyZWZsb3dpbmcnCisJICBzb21lIGNvZGUuCisKKzIwMDctMTItMDUgMTY6MDQ6NDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuKjogRml4IGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jOgorCSAgKGdzdF9hdXRvX3ZpZGVvX3NpbmtfY2xhc3NfaW5pdCksIChnc3RfYXV0b192aWRlb19zaW5rX2Rpc3Bvc2UpLAorCSAgKGdzdF9hdXRvX3ZpZGVvX3NpbmtfaW5pdCksCisJICAoZ3N0X2F1dG9fdmlkZW9fc2lua19jcmVhdGVfZWxlbWVudF93aXRoX3ByZXR0eV9uYW1lKSwKKwkgIChnc3RfYXV0b192aWRlb19zaW5rX2ZpbmRfYmVzdCksCisJICAoZ3N0X2F1dG9fdmlkZW9fc2lua19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdXRvX3ZpZGVvX3NpbmtfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5oOgorCSAgRml4IGRvY3MuCisJICBVc2Ugc2FtZSBlcnJvciByZXBvcnRpbmcgY29kZSBhcyBhdXRvYXVkaW9zaW5rLgorCSAgQWRkIHByb3BlcnR5IHRvIGZpbHRlciBzaW5rcyBiYXNlZCBvbiBjYXBzLiBPbmx5IHNlbGVjdCByYXcgdmlkZW8gc2lua3MKKwkgIGJ5IGRlZmF1bHQgZm9yIGJhY2t3YXJkcyBjb21wYXQuCisJICBBUEk6IEdzdEF1dG9WaWRlb1Npbms6OmZpbHRlci1jYXBzCisKKzIwMDctMTItMDUgMTY6MDI6MTUgKzAwMDAgIFRvbW1pIE15w7Zow6RuZW4gPGV4dC10b21taS5teW9oYW5lbkBub2tpYS5jb20+CisKKwkgIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuKjogQWRkIHByb3BlcnR5IHRvIGZpbHRlciBzaW5rcyBiYXNlZCBvbiBjYXBzLiBPbmx5IHNlbGVjdCByYXcgYXVkaW8gc2lua3MgYnkgZGVmYXVsdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVG9tbWkgTXnDtmjDpG5lbiAgPGV4dC10b21taSBkb3QgbXlvaGFuZW4gYXQgbm9raWEgZG90IGNvbT4KKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSAgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfY2xhc3NfaW5pdCksIChnc3RfYXV0b19hdWRpb19zaW5rX2Rpc3Bvc2UpLAorCSAgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfaW5pdCksIChnc3RfYXV0b19hdWRpb19zaW5rX2ZpbmRfYmVzdCksCisJICAoZ3N0X2F1dG9fYXVkaW9fc2lua19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5oOgorCSAgQWRkIHByb3BlcnR5IHRvIGZpbHRlciBzaW5rcyBiYXNlZCBvbiBjYXBzLiBPbmx5IHNlbGVjdCByYXcgYXVkaW8gc2lua3MKKwkgIGJ5IGRlZmF1bHQgZm9yIGJhY2t3YXJkcyBjb21wYXQuICBGaXhlcyAjNDE3NDIwLgorCSAgQVBJOiBHc3RBdXRvQXVkaW9TaW5rOjpmaWx0ZXItY2FwcworCisyMDA3LTExLTI5IDExOjQwOjE1ICswMDAwICBBcmVrIEtvcmJpayA8YXJrYWRpbmlAZ21haWwuY29tPgorCisJICBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogSW5pdGlhbGlzZSBsaWJvaWwgaW4gcGx1Z2luX2luaXQoKQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQXJlayBLb3JiaWsgPGFya2FkaW5pQGdtYWlsLmNvbT4KKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChwbHVnaW5faW5pdCk6CisJICBJbml0aWFsaXNlIGxpYm9pbCBpbiBwbHVnaW5faW5pdCgpCisKKzIwMDctMTEtMjkgMTA6NDk6MTggKzAwMDAgIFdvdXRlciBDbG9ldGVucyA8d291dGVyQG1pbmQuYmU+CisKKwkgIGNvbmZpZ3VyZS5hYzogQnVtcCBsaWJzb3VwIHJlcXVpcmVtZW50IGFzIGxpYnNvdXAgZG9lcyBub3Qgc3VwcG9ydCBhc3luYyBjbGllbnQgb3BlcmF0aW9uIHByaW9yIHRvIHZlcnNpb24gMi4yLjEwNCBhbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogV291dGVyIENsb2V0ZW5zIDx3b3V0ZXIgYXQgbWluZCBkb3QgYmU+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEJ1bXAgbGlic291cCByZXF1aXJlbWVudCBhcyBsaWJzb3VwIGRvZXMgbm90IHN1cHBvcnQgYXN5bmMgY2xpZW50CisJICBvcGVyYXRpb24gcHJpb3IgdG8gdmVyc2lvbiAyLjIuMTA0IGFuZCBpdCBoYXMgc29tZSBsZWFrcy4KKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKGdzdF9zb3VwaHR0cF9zcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3NvdXBodHRwX3NyY19pbml0KSwgKGdzdF9zb3VwaHR0cF9zcmNfZGlzcG9zZSksCisJICAoZ3N0X3NvdXBodHRwX3NyY19zZXRfcHJvcGVydHkpLCAoZ3N0X3NvdXBodHRwX3NyY19jcmVhdGUpLAorCSAgKGdzdF9zb3VwaHR0cF9zcmNfc3RhcnQpLCAoZ3N0X3NvdXBodHRwX3NyY19zdG9wKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX3VubG9jayksIChnc3Rfc291cGh0dHBfc3JjX3VubG9ja19zdG9wKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX2dldF9zaXplKSwgKHNvdXBfZ290X2hlYWRlcnMpLCAoc291cF9nb3RfYm9keSksCisJICAoc291cF9maW5pc2hlZCksIChzb3VwX2dvdF9jaHVuayksIChzb3VwX3Jlc3BvbnNlKSwKKwkgIChzb3VwX3Nlc3Npb25fY2xvc2UpOgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgSW1wbGVtZW50IHVubG9jaygpLgorCSAgUGlja3MgdXAgdGhlIHNpemUgZnJvbSB0aGUgQ29udGVudC1MZW5ndGggaGVhZGVyIGFuZCBlbWl0IGEgZHVyYXRpb24KKwkgIG1lc3NhZ2UuCisJICBEb24ndCBsZWFrIHRoZSBHTWFpbkNvbnRleHQgb2JqZWN0LgorCSAgRml4ZXMgIzUwMDA5OS4KKworMjAwNy0xMS0yOSAxMDozNDoxOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogUG9zdCBlcnJvciBiZWZvcmUgc2VuZGluZyBFT1MuIEZpeGVzICM0OTkxNzguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogKGdzdF9wbmdkZWNfdGFzayk6CisJICBQb3N0IGVycm9yIGJlZm9yZSBzZW5kaW5nIEVPUy4gRml4ZXMgIzQ5OTE3OC4KKworMjAwNy0xMS0yOCAyMTo1NDo1MCArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICB3aW4zMi92czYvOiBBZGQgYSBwcm9qZWN0IGZpbGUgZm9yIGxpYmdzdHBuZworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHdpbjMyL3ZzNi9nc3RfcGx1Z2luc19nb29kLmRzdzoKKwkgICogd2luMzIvdnM2L2xpYmdzdHBuZy5kc3A6CisJICBBZGQgYSBwcm9qZWN0IGZpbGUgZm9yIGxpYmdzdHBuZworCisyMDA3LTExLTI4IDE3OjQ4OjQ1ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5jOiBDb2RlIGJlYXV0aWZpY2F0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6IChnc3RfcnRwX2gyNjNfZGVwYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9oMjYzX2RlcGF5X3Byb2Nlc3MpOgorCSAgQ29kZSBiZWF1dGlmaWNhdGlvbi4KKwkgIEFkZGVkIGRlYnVnIHN0YXRlbWVudHMuCisJICBEb24ndCBiaXQtc2hpZnQgZXZlcnl0aGluZywganVzdCBkbyBvcGVyYXRpb25zIG9uIGxhc3QvZmlyc3QgYnl0ZQorCSAgaW5zdGVhZC4KKworMjAwNy0xMS0yNyAxMToxMTowOCArMDAwMCAgSmF5YXJhbWEgUy4gU2FudGFuYSA8c3VuZGFyc2FudGFuYUBnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6IEZpeCB3cm9uZyBjb21wYXJpc29uIGluIG92ZXJydW4gY2hlY2suIEZpeGVzICM0OTkyMzkgc29tZSBtb3JlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSmF5YXJhbWEgUy4gU2FudGFuYSA8c3VuZGFyc2FudGFuYSBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOiAoZ3N0X3J0cF9tcDRhX2RlcGF5X3Byb2Nlc3MpOgorCSAgRml4IHdyb25nIGNvbXBhcmlzb24gaW4gb3ZlcnJ1biBjaGVjay4gRml4ZXMgIzQ5OTIzOSBzb21lIG1vcmUuCisKKzIwMDctMTEtMjcgMDA6MDE6NDEgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5Lio6IEZpeCBoMjYzIGRlcGF5bG9hZGVyIHNvIHRoYXQgQU5ZIGgyNjMgZGVjb2RlciBjYW4gaGFuZGxlIHRoZSBvdXRnb2luZyBzdHJlYW0uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzogKGdzdF9ydHBfaDI2M19kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX2gyNjNfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5Lmg6CisJICBGaXggaDI2MyBkZXBheWxvYWRlciBzbyB0aGF0IEFOWSBoMjYzIGRlY29kZXIgY2FuIGhhbmRsZSB0aGUgb3V0Z29pbmcKKwkgIHN0cmVhbS4KKworMjAwNy0xMS0yNiAxOToxNzoxMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuKjogRml4IGRlcGF5bG9hZGluZyB3aGVuIG11bHRpcGxlIGZyYW1lcyBhcmUgaW5zaWRlIG9uZSBSVFAgcGFja2V0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBCYXNlZCBvbiBQYXRoIGJ5OiBKYXlhcmFtYSBTLiBTYW50YW5hIDxzdW5kYXJzYW50YW5hIGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6IChnc3RfcnRwX21wNGFfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9tcDRhX2RlcGF5X3Byb2Nlc3MpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5oOgorCSAgRml4IGRlcGF5bG9hZGluZyB3aGVuIG11bHRpcGxlIGZyYW1lcyBhcmUgaW5zaWRlIG9uZSBSVFAgcGFja2V0LgorCSAgRml4ZXMgIzQ5OTIzOS4KKworMjAwNy0xMS0yNiAxMjoyNjoyMCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogQWRkIEdBUC1mbGFnIHN1cHBvcnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJICBBZGQgR0FQLWZsYWcgc3VwcG9ydC4KKworMjAwNy0xMS0yNiAxMjowMToxMSArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzogUmVhZCB0aGUgSSBmbGFnIGZvciBNb2RlIEEgaDI2MyBydHAgc3RyZWFtIGFuZCBzZXQgdGhlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzogKGdzdF9ydHBfaDI2M19kZXBheV9wcm9jZXNzKToKKwkgIFJlYWQgdGhlIEkgZmxhZyBmb3IgTW9kZSBBIGgyNjMgcnRwIHN0cmVhbSBhbmQgc2V0IHRoZQorCSAgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQgYWNjb3JkaW5nbHkuCisJICBGaXhlcyAjNDk5MzgzCisKKzIwMDctMTEtMjYgMTA6MDg6MjAgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IFVzZSBkaXNwb3NlIGFuZCBmaW5hbGl6ZS4gRGlzcG9zZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgVXNlIGRpc3Bvc2UgYW5kIGZpbmFsaXplLiBEaXNwb3NlIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCisKKzIwMDctMTEtMjYgMTA6MDQ6NDkgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2xldmVsL2dzdGxldmVsLmM6IFJlbW92ZSBzb21lIGRlYWQgY29kZSBhbmQgZG8gY2xlYW51cHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJICBSZW1vdmUgc29tZSBkZWFkIGNvZGUgYW5kIGRvIGNsZWFudXBzLgorCisyMDA3LTExLTI2IDA5OjEzOjQ4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy9zaW1wbGUtbGF1bmNoLWxpbmVzLmM6IEltcHJvdmUgdGhlIHRlc3RzIGJ5IGFsbG93aW5nIHRvIHNldCBhIHRhcmdldCBzdGF0ZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvc2ltcGxlLWxhdW5jaC1saW5lcy5jOgorCSAgSW1wcm92ZSB0aGUgdGVzdHMgYnkgYWxsb3dpbmcgdG8gc2V0IGEgdGFyZ2V0IHN0YXRlLgorCisyMDA3LTExLTI2IDA5OjA0OjE3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tlbmMuYzogRG9uJ3QgY2hlY2sgdGhlIGNhcHMgb2YgdGhlIG91dHB1dCBidWZmZXIgaWYgdGhleSdyZSBlcXVhbCBzb21lIG90aGVyIGNhcHMuIFRoZSBjYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tlbmMuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIERvbid0IGNoZWNrIHRoZSBjYXBzIG9mIHRoZSBvdXRwdXQgYnVmZmVyIGlmIHRoZXkncmUgZXF1YWwgc29tZQorCSAgb3RoZXIgY2Fwcy4gVGhlIGNhcHMgY2FuIGNoYW5nZSBpbiBhIGJhY2t3YXJkIGNvbXBhdGlibGUgd2F5CisJICBhbmQgZGlkIGF0IHRoaXMgcG9pbnQuCisKKzIwMDctMTEtMjQgMTQ6NTU6MDQgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEltcGxlbWVudCByZXZlcnNlIHBsYXliYWNrIHN1cHBvcnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDctMTEtMjQgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfZmluZF9zZWdtZW50KSwKKwkgIChnc3RfcXRkZW11eF9tb3ZlX3N0cmVhbSksIChnc3RfcXRkZW11eF9kb19zZWVrKSwKKwkgIChnc3RfcXRkZW11eF9zZWVrX3RvX3ByZXZpb3VzX2tleWZyYW1lKSwKKwkgIChnc3RfcXRkZW11eF9hY3RpdmF0ZV9zZWdtZW50KSwgKGdzdF9xdGRlbXV4X2FkdmFuY2Vfc2FtcGxlKSwKKwkgIChnc3RfcXRkZW11eF9sb29wX3N0YXRlX21vdmllKSwgKGdzdF9xdGRlbXV4X2xvb3ApOiBJbXBsZW1lbnQKKwkgIHJldmVyc2UgcGxheWJhY2sgc3VwcG9ydC4KKworMjAwNy0xMS0yMSAwOTo1Njo1NCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZmlsdGVyLzogUG9zdCBhIEdTVF9NRVNTQUdFX0xBVEVOQ1kgaWYgdGhlIGxhdGVuY3kgY2hhbmdlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYzogKGJwd3NpbmNfc2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6IChscHdzaW5jX3NldF9wcm9wZXJ0eSk6CisJICBQb3N0IGEgR1NUX01FU1NBR0VfTEFURU5DWSBpZiB0aGUgbGF0ZW5jeSBjaGFuZ2VzLgorCisyMDA3LTExLTIxIDA4OjIxOjEwICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9lcXVhbGl6ZXIvOiBSZW1vdmUgcHJlc2V0IGlmYWNlIGFnYWluLiBXZSdsbCByZS1hZGQgdGhpcyBhZnRlciBpdHMgYmVlbiByZWxlYXNlZCBpbiAtZ29vZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjEwYmFuZHMuYzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIzYmFuZHMuYzoKKwkgIFJlbW92ZSBwcmVzZXQgaWZhY2UgYWdhaW4uIFdlJ2xsIHJlLWFkZCB0aGlzIGFmdGVyIGl0cyBiZWVuIHJlbGVhc2VkCisJICBpbiAtZ29vZC4KKworMjAwNy0xMS0yMCAxMzoxNDo0MCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrY29tbW9uLmM6IEFsc28gc2V0IHRoZSBjaGFubmVsIGxheW91dCBvbiB0aGUgV2F2cGFjayBjYXBzIGlmIHdlJ3JlIGhhdmluZyBhIG1vbm8gbGF5b3V0LiBPZiBjb3UuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrY29tbW9uLmM6IChnc3Rfd2F2cGFja19zZXRfY2hhbm5lbF9sYXlvdXQpOgorCSAgQWxzbyBzZXQgdGhlIGNoYW5uZWwgbGF5b3V0IG9uIHRoZSBXYXZwYWNrIGNhcHMgaWYgd2UncmUgaGF2aW5nCisJICBhIG1vbm8gbGF5b3V0LiBPZiBjb3Vyc2Ugb25seSBkbyBpdCBmb3IgImF1ZGlvL3gtd2F2cGFjayIuCisKKzIwMDctMTEtMjAgMTM6MDg6NDUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svOiBBZGQgc3VwcG9ydCBmb3IgZW5jb2RpbmcsIHBhcnNpbmcgYW5kIGRlY29kaW5nIG11bHRpY2hhbm5lbCBmaWxlcyB3aXRoIHVwIHRvIDggY2hhbm5lbHMuIFRoaXMgYWxzbyBpbXByLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5jOgorCSAgKGdzdF93YXZwYWNrX2dldF9kZWZhdWx0X2NoYW5uZWxfbWFzayksCisJICAoZ3N0X3dhdnBhY2tfc2V0X2NoYW5uZWxfbGF5b3V0KSwKKwkgIChnc3Rfd2F2cGFja19nZXRfZGVmYXVsdF9jaGFubmVsX3Bvc2l0aW9ucyksCisJICAoZ3N0X3dhdnBhY2tfZ2V0X2NoYW5uZWxfbWFza19mcm9tX3Bvc2l0aW9ucyksCisJICAoZ3N0X3dhdnBhY2tfc2V0X2NoYW5uZWxfbWFwcGluZyk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tjb21tb24uaDoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX3Jlc2V0KSwKKwkgIChnc3Rfd2F2cGFja19kZWNfc2lua19zZXRfY2FwcyksIChnc3Rfd2F2cGFja19kZWNfY2hhaW4pOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmg6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogKGdzdF93YXZwYWNrX2VuY19yZXNldCksCisJICAoZ3N0X3dhdnBhY2tfZW5jX2luaXQpLCAoZ3N0X3dhdnBhY2tfZW5jX3Npbmtfc2V0X2NhcHMpLAorCSAgKGdzdF93YXZwYWNrX2VuY19zZXRfd3BfY29uZmlnKSwgKGdzdF93YXZwYWNrX2VuY19wdXNoX2Jsb2NrKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfZml4X2NoYW5uZWxfb3JkZXIpLCAoZ3N0X3dhdnBhY2tfZW5jX2NoYWluKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfcmV3cml0ZV9maXJzdF9ibG9jayksCisJICAoZ3N0X3dhdnBhY2tfZW5jX3NpbmtfZXZlbnQpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmg6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2luZGV4X2FwcGVuZF9lbnRyeSksIChnc3Rfd2F2cGFja19wYXJzZV9yZXNldCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2Vfc2Nhbl90b19maW5kX3NhbXBsZSksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2Vfc2lua19ldmVudCksIChnc3Rfd2F2cGFja19wYXJzZV9jcmVhdGVfc3JjX3BhZCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfcHVzaF9idWZmZXIpLCAoZ3N0X3dhdnBhY2tfcGFyc2VfbG9vcCk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5oOgorCSAgQWRkIHN1cHBvcnQgZm9yIGVuY29kaW5nLCBwYXJzaW5nIGFuZCBkZWNvZGluZyBtdWx0aWNoYW5uZWwKKwkgIGZpbGVzIHdpdGggdXAgdG8gOCBjaGFubmVscy4gVGhpcyBhbHNvIGltcHJvdmVzIHRoZSByb2J1c3RuZXNzCisJICBvZiBwYXJzaW5nIHF1aXRlIGEgYml0LgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrc3RyZWFtcmVhZGVyLmM6CisJICAoZ3N0X3dhdnBhY2tfc3RyZWFtX3JlYWRlcl9yZWFkX2J5dGVzKSwKKwkgIChnc3Rfd2F2cGFja19zdHJlYW1fcmVhZGVyX2dldF9wb3MpLAorCSAgKGdzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfc2V0X3Bvc19hYnMpLAorCSAgKGdzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfc2V0X3Bvc19yZWwpLAorCSAgKGdzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfcHVzaF9iYWNrX2J5dGUpLAorCSAgKGdzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfZ2V0X2xlbmd0aCksCisJICAoZ3N0X3dhdnBhY2tfc3RyZWFtX3JlYWRlcl9jYW5fc2VlayksCisJICAoZ3N0X3dhdnBhY2tfc3RyZWFtX3JlYWRlcl93cml0ZV9ieXRlcyk6CisJICBJbXByb3ZlIGRlYnVnZ2luZy4KKworMjAwNy0xMS0yMCAxMjoyMDozOCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBleHQvbGlicG5nL2dzdHBuZ2RlYy4qOiBEb24ndCByZWxlYXNlIHRoZSBwbmctbWVtb3J5IGZyb20gd2l0aGluIHRoZSBjYWxsYmFjay4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5oOgorCSAgRG9uJ3QgcmVsZWFzZSB0aGUgcG5nLW1lbW9yeSBmcm9tIHdpdGhpbiB0aGUgY2FsbGJhY2suCisKKzIwMDctMTEtMjAgMTI6MTE6MTMgKzAwMDAgIFJlbsOpIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6IERvbid0IGxlYWsgYnVmZmVyIGRhdGEgbWVtb3J5LiBGaXhlcyAjNDk4Mzk1LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUmVuw6kgU3RhZGxlciA8bWFpbCBhdCByZW5lc3RhZGxlciBkb3QgZGU+CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJICBEb24ndCBsZWFrIGJ1ZmZlciBkYXRhIG1lbW9yeS4gRml4ZXMgIzQ5ODM5NS4KKworMjAwNy0xMS0yMCAxMTo0NjoyOCArMDAwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSAgdGVzdHMvY2hlY2svcGlwZWxpbmVzL3NpbXBsZS1sYXVuY2gtbGluZXMuYzogVGVzdHMgZm9yICM0OTgzOTUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBSZW7DqSBTdGFkbGVyIDxtYWlsIGF0IHJlbmVzdGFkbGVyIGRvdCBkZT4KKwkgICogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3NpbXBsZS1sYXVuY2gtbGluZXMuYzoKKwkgIFRlc3RzIGZvciAjNDk4Mzk1LgorCisyMDA3LTExLTIwIDExOjQxOjEzICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgRml4IGJ1aWxkIG9uIE1hYyBPUyBYIDEwLjUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNy0xMS0yMCAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBleHQvdGFnbGliL2dzdHRhZ2xpYm11eC5jOiAoZ3N0X3RhZ19saWJfbXV4X3JlbmRlcl90YWcpLAorCSAgKGdzdF90YWdfbGliX211eF9hZGp1c3RfZXZlbnRfb2Zmc2V0cyk6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2VfdGhlb3JhX2V4dGVuc2lvbik6CisJICAqIHN5cy9vc3hhdWRpby9NYWtlZmlsZS5hbToKKwkgICogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lmg6CisJICAqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5tOiBGaXggYnVpbGQgb24gTWFjIE9TIFggMTAuNQorCisyMDA3LTExLTE5IDIwOjMwOjE5ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9lcXVhbGl6ZXIvOiBBY3RpdmF0ZSBwcmVzZXQgaWZhY2UgYW5kIHVwbG9hZCB0d28gcHJlc2V0cyBoZXJlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5jOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5jOgorCSAgQWN0aXZhdGUgcHJlc2V0IGlmYWNlIGFuZCB1cGxvYWQgdHdvIHByZXNldHMgaGVyZS4KKworMjAwNy0xMS0xNiAwNTo1Mjo1NSArMDAwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkgIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOiBDaGFuZ2Ugc3RyY2FzZWNtcCgpIHRvIGdfc3RyY2FzZWNtcCgpLiAgRml4ZXMgIzQ5NzI5Mi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzoKKwkgIENoYW5nZSBzdHJjYXNlY21wKCkgdG8gZ19zdHJjYXNlY21wKCkuICBGaXhlcyAjNDk3MjkyLgorCisyMDA3LTExLTE1IDE4OjE5OjE5ICswMDAwICBKb3JkaSBKYWVuIFBhbGxhcmVzIDxqb3JkaWpwQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBtcDJ0cGF5Lio6IEZpbGwgdGhlIE1UVSB3aXRoIGFzIG1hbnkgcGFja2V0cyBhcyBwb3NzaWJsZS4gRml4ZXMgIzQ5MTMyMy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEpvcmRpIEphZW4gUGFsbGFyZXMgPGpvcmRpanAgYXQgZ21haWwgZG90IGNvbT4KKwkgICogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5LmM6IChnc3RfcnRwX21wMnRfcGF5X2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfbXAydF9wYXlfaW5pdCksIChnc3RfcnRwX21wMnRfcGF5X2ZpbmFsaXplKSwKKwkgIChnc3RfcnRwX21wMnRfcGF5X2ZsdXNoKSwgKGdzdF9ydHBfbXAydF9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydHBheS5oOgorCSAgRmlsbCB0aGUgTVRVIHdpdGggYXMgbWFueSBwYWNrZXRzIGFzIHBvc3NpYmxlLiBGaXhlcyAjNDkxMzIzLgorCisyMDA3LTExLTE1IDE3OjQ3OjQzICswMDAwICBUb21taSBNecO2aMOkbmVuIDxleHQtdG9tbWkubXlvaGFuZW5Abm9raWEuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IEZpeCBzb21lIG1vcmUgbGVha3MuIEZpeGVzICM0OTcwMDcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBUb21taSBNecO2aMOkbmVuICA8ZXh0LXRvbW1pIGRvdCBteW9oYW5lbiBhdCBub2tpYSBkb3QgY29tPgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zZXR1cF9zdHJlYW1zKToKKwkgIEZpeCBzb21lIG1vcmUgbGVha3MuIEZpeGVzICM0OTcwMDcuCisKKzIwMDctMTEtMTUgMTc6MzU6MTggKzAwMDAgIFRvbW1pIE15w7Zow6RuZW4gPGV4dC10b21taS5teW9oYW5lbkBub2tpYS5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogRml4IDMgcGFkIGxlYWtzLiBGaXhlcyAjNDk2OTgzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVG9tbWkgTXnDtmjDpG5lbiAgPGV4dC10b21taSBkb3QgbXlvaGFuZW4gYXQgbm9raWEgZG90IGNvbT4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc3RyZWFtX2ZyZWUpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdGNwKToKKwkgIEZpeCAzIHBhZCBsZWFrcy4gRml4ZXMgIzQ5Njk4My4KKworMjAwNy0xMS0xNSAxNzoyNjoyNSArMDAwMCAgV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKworCSAgQWRkZWQgSFRUUCBzb3VyY2UgYmFzZWQgb24gbGlic291cC4gRml4ZXMgIzQ5NzAyMC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFdvdXRlciBDbG9ldGVucyA8d291dGVyIGF0IG1pbmQgZG90IGJlPgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGV4dC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NvdXAvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IChfZG9faW5pdCksCisJICAoZ3N0X3NvdXBodHRwX3NyY19iYXNlX2luaXQpLCAoZ3N0X3NvdXBodHRwX3NyY19jbGFzc19pbml0KSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX2luaXQpLCAoZ3N0X3NvdXBodHRwX3NyY19kaXNwb3NlKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX3NldF9wcm9wZXJ0eSksIChnc3Rfc291cGh0dHBfc3JjX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3NvdXBodHRwX3NyY19jcmVhdGUpLCAoZ3N0X3NvdXBodHRwX3NyY19zdGFydCksCisJICAoZ3N0X3NvdXBodHRwX3NyY19zdG9wKSwgKGdzdF9zb3VwaHR0cF9zcmNfdW5sb2NrKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX3NldF9sb2NhdGlvbiksIChzb3VwX2dvdF9jaHVuayksIChzb3VwX3Jlc3BvbnNlKSwKKwkgIChzb3VwX3Nlc3Npb25fY2xvc2UpLCAocGx1Z2luX2luaXQpOgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgQWRkZWQgSFRUUCBzb3VyY2UgYmFzZWQgb24gbGlic291cC4gRml4ZXMgIzQ5NzAyMC4KKworMjAwNy0xMS0xNSAxNzowMTozMiArMDAwMCAgVG9tbWkgTXnDtmjDpG5lbiA8ZXh0LXRvbW1pLm15b2hhbmVuQG5va2lhLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzogRml4IHNtYWxsIGxlYWsuIEZpeGVzICM0OTcwMTcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBUb21taSBNecO2aMOkbmVuICA8ZXh0LXRvbW1pIGRvdCBteW9oYW5lbiBhdCBub2tpYSBkb3QgY29tPgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOiAoZ3N0X3J0cF9oMjY0X2RlcGF5X3NldGNhcHMpOgorCSAgRml4IHNtYWxsIGxlYWsuIEZpeGVzICM0OTcwMTcuCisKKzIwMDctMTEtMTUgMTY6MzE6MzIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4LzogQWRkIHN1cHBwb3J0IGZvciB0aGVvcmEgaW4gcXVpY2t0aW1lIGFjY29yZGluZyB0byBYaXBoUVQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcXRkZW11eF9wcmVwYXJlX2N1cnJlbnRfc2FtcGxlKSwKKwkgIChnc3RfcXRkZW11eF9sb29wX3N0YXRlX21vdmllKSwgKHF0ZGVtdXhfcGFyc2VfdGhlb3JhX2V4dGVuc2lvbiksCisJICAocXRkZW11eF9wYXJzZV9ub2RlKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayksIChxdGRlbXV4X3ZpZGVvX2NhcHMpOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4X2ZvdXJjYy5oOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4X3R5cGVzLmM6CisJICBBZGQgc3VwcHBvcnQgZm9yIHRoZW9yYSBpbiBxdWlja3RpbWUgYWNjb3JkaW5nIHRvIFhpcGhRVC4KKworMjAwNy0xMS0xNSAxMjoyMjoxMCArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBDaGFuZ2VMb2c6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmg6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICBBbHdheXMgY29weSBidWZmZXJzIGJ5IGRlZmF1bHQgKGhhbmRsZSBzYWZlciB3aXRoIGJ1Z2dlZCBkcml2ZXJzKSBhbmQgYWRkZWQgYSBwcm9wZXJ0eSB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHVzZSBtbWEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQWx3YXlzIGNvcHkgYnVmZmVycyBieSBkZWZhdWx0IChoYW5kbGUgc2FmZXIgd2l0aCBidWdnZWQgZHJpdmVycykgYW5kIGFkZGVkIGEgcHJvcGVydHkgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byB1c2UgbW1hcCBlZmZlY3RpdmVseSAobm8gY29weSBpZiBwb3NzaWJsZSkgd2hlbiBhcHBsaWNhdGlvbiB3YW50cyB0by4gRml4ZXM6ICM0ODA1NTcuCisKKzIwMDctMTEtMTQgMjE6Mzk6NDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9pZDNkZW11eC86IFdlIGRvbid0IHdhbnQgdGhlIHNhbWUgc3RyaW5nIG11bHRpcGxlIHRpbWVzIGluIGEgdGFnIGxpc3QgZm9yIHRoZSBzYW1lIHRhZyBldmVyLCBmb3IgYW55IHRhZywgbm90IGp1cy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9pZDN0YWdzLmM6CisJICAqIGdzdC9pZDNkZW11eC9pZDN0YWdzLmg6CisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiAoaWQzdjJfdGFnX3RvX3RhZ2xpc3QpOgorCSAgV2UgZG9uJ3Qgd2FudCB0aGUgc2FtZSBzdHJpbmcgbXVsdGlwbGUgdGltZXMgaW4gYSB0YWcgbGlzdCBmb3IgdGhlCisJICBzYW1lIHRhZyBldmVyLCBmb3IgYW55IHRhZywgbm90IGp1c3QgZm9yIEdTVF9UQUdfR0VOUkUsIHNvIG1ha2Ugc3VyZQorCSAgdGhpcyBkb2Vzbid0IGhhcHBlbiBhbmQgcmVtb3ZlIHNwZWNpYWwtY2FzZSBjb2RlIGZvciBHU1RfVEFHX0dFTlJFLgorCisyMDA3LTExLTE0IDIxOjA0OjEyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOiBXcml0ZSBHU1RfVEFHX01VU0lDQlJBSU5aX0RJU0NJRCBhbmQgR1NUX1RBR19DRERBX0NEREJfRElTQ0lEIGludG8gSUQzdjIgVFhYWCBmcmFtZXMgKGZpeGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOiAoYWRkX211c2ljYnJhaW56X3RhZyksIChhZGRfZnVuY3MpOgorCSAgV3JpdGUgR1NUX1RBR19NVVNJQ0JSQUlOWl9ESVNDSUQgYW5kIEdTVF9UQUdfQ0REQV9DRERCX0RJU0NJRAorCSAgaW50byBJRDN2MiBUWFhYIGZyYW1lcyAoZml4ZXMgIzM0Nzg0OCkuCisKKzIwMDctMTEtMTQgMjA6MzQ6MjQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogRG9uJ3QgbGVhayBzZHAgbWVzc2FnZSBjb250ZW50cyAoZml4ZXMgIzQ5Njc3MykuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfb3Blbik6CisJICBEb24ndCBsZWFrIHNkcCBtZXNzYWdlIGNvbnRlbnRzIChmaXhlcyAjNDk2NzczKS4KKwkgICogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6IChnc3RfdWRwc2lua19maW5hbGl6ZSk6CisJICBEb24ndCBsZWFrIFVSSSBzdHJpbmcuCisKKzIwMDctMTEtMTQgMTk6MTA6MzcgKzAwMDAgIEp1bGllbiBQdXlkdCA8anVsaWVuLnB1eWR0QGxhcG9zdGUubmV0PgorCisJICBleHQvcmF3MTM5NC86IEltcGxlbWVudCBHc3RQcm9wZXJ0eVByb2JlIGludGVyZmFjZSBhbmQgYWRkICJkZXZpY2UtbmFtZSIgcHJvcGVydHksIHNvIGFwcGxpY2F0aW9ucyBjYW4gdXNlIHRoaXMgdG8gcHIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEp1bGllbiBQdXlkdCA8anVsaWVuIGRvdCBwdXlkdCBhdCBsYXBvc3RlIG5ldD4KKwkgICogZXh0L3JhdzEzOTQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9yYXcxMzk0L2dzdDEzOTRwcm9iZS5jOiAoZ3N0XzEzOTRfZ2V0X2d1aWRfYXJyYXkpLAorCSAgKGdzdF8xMzk0X3Byb3BlcnR5X3Byb2JlX2dldF9wcm9wZXJ0aWVzKSwKKwkgIChnc3RfMTM5NF9wcm9wZXJ0eV9wcm9iZV9wcm9iZV9wcm9wZXJ0eSksCisJICAoZ3N0XzEzOTRfcHJvcGVydHlfcHJvYmVfbmVlZHNfcHJvYmUpLAorCSAgKGdzdF8xMzk0X3Byb3BlcnR5X3Byb2JlX2dldF92YWx1ZXMpLAorCSAgKGdzdF8xMzk0X3Byb3BlcnR5X3Byb2JlX2ludGVyZmFjZV9pbml0KSwKKwkgIChnc3RfMTM5NF90eXBlX2FkZF9wcm9wZXJ0eV9wcm9iZV9pbnRlcmZhY2UpOgorCSAgKiBleHQvcmF3MTM5NC9nc3QxMzk0cHJvYmUuaDogKEdTVF8xMzk0X1BST0JFX0gpOgorCSAgKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzogKF9kb19pbml0KSwgKGdzdF9kdjEzOTRzcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X2R2MTM5NHNyY19pbml0KSwgKGdzdF9kdjEzOTRzcmNfZGlzcG9zZSksCisJICAoZ3N0X2R2MTM5NHNyY19zZXRfcHJvcGVydHkpLCAoZ3N0X2R2MTM5NHNyY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9kdjEzOTRzcmNfZGlzY292ZXJfYXZjX25vZGUpLCAoZ3N0X2R2MTM5NHNyY19xdWVyeSksCisJICAoZ3N0X2R2MTM5NHNyY191cGRhdGVfZGV2aWNlX25hbWUpOgorCSAgKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuaDoKKwkgIEltcGxlbWVudCBHc3RQcm9wZXJ0eVByb2JlIGludGVyZmFjZSBhbmQgYWRkICJkZXZpY2UtbmFtZSIgcHJvcGVydHksCisJICBzbyBhcHBsaWNhdGlvbnMgY2FuIHVzZSB0aGlzIHRvIHByb2JlIGZvciBhdmFpbGFibGUgZGV2aWNlcyBpbiB0aGUKKwkgIHNhbWUgd2F5IHRoZXkgY2FuIGFscmVhZHkgd2l0aCB2NGxzcmMgYW5kIHY0bDJzcmMgKGhvd2V2ZXIgaG9ycmlibGUKKwkgIHRoaXMgcHJvcGVydHkgcHJvYmUgaW50ZXJmYWNlIG1heSBiZSkuIEZpeGVzICMzNTg4NDEuCisKKzIwMDctMTEtMTQgMTc6MDM6MTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvc3BlY3RydW0uYzogRml4IHNwZWN0cnVtIHVuaXQgdGVzdCBmb3IgdGhlIGxhdGVzdCBzcGVjdHJ1bSBjaGFuZ2VzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwZWN0cnVtLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICBGaXggc3BlY3RydW0gdW5pdCB0ZXN0IGZvciB0aGUgbGF0ZXN0IHNwZWN0cnVtIGNoYW5nZXMuCisKKzIwMDctMTEtMTQgMTU6Mjk6MDUgKzAwMDAgIFRvbW1pIE15w7Zow6RuZW4gPGV4dC10b21taS5teW9oYW5lbkBub2tpYS5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogRG9uJ3QgbGVhayBldmVudCwgZG9uJ3QgbGVhayByYW5nZSAoZml4ZXMgIzQ5Njc1MikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBUb21taSBNecO2aMOkbmVuICA8ZXh0LXRvbW1pIGRvdCBteW9oYW5lbiBhdCBub2tpYSBkb3QgY29tPgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19oYW5kbGVfc3JjX2V2ZW50KSwKKwkgIChnc3RfcnRzcHNyY19wYXJzZV9yYW5nZSk6CisJICBEb24ndCBsZWFrIGV2ZW50LCBkb24ndCBsZWFrIHJhbmdlIChmaXhlcyAjNDk2NzUyKS4KKworMjAwNy0xMS0xNCAxMDoyMjo0MSArMDAwMCAgQXJlayBLb3JiaWsgPGFya2FkaW5pQGdtYWlsLmNvbT4KKworCSAgZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzogRGV0ZWN0IFJHQkEvQkdSQSBjb3JyZWN0bHkgb24gbGl0dGxlIGVuZGlhbiBzeXN0ZW1zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQXJlayBLb3JiaWsgPGFya2FkaW5pQGdtYWlsLmNvbT4KKwkgICogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzogKGdzdF9hbHBoYV9jb2xvcl9zZXRfY2Fwcyk6CisJICBEZXRlY3QgUkdCQS9CR1JBIGNvcnJlY3RseSBvbiBsaXR0bGUgZW5kaWFuIHN5c3RlbXMuCisKKzIwMDctMTEtMTMgMTc6MTk6MTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogYnV0IHRoZSBjb3JyZXNwb25kaW5nIGlvY3RsKCkgY2FsbCBmYWlscyBldmVuIHRob3VnaCB0aGUgZHJpdmVyIGNsYWltcyB0byBzdXBwb3J0IHRoaXMgZm9ybS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX3Byb2JlX2NhcHNfZm9yX2Zvcm1hdCk6CisJICBJZiBWSURJT0NfRU5VTV9GUkFNRVNJWkVTIGlzIGRlZmluZWQgKD0gcmVjZW50IGtlcm5lbCksIGJ1dCB0aGUKKwkgIGNvcnJlc3BvbmRpbmcgaW9jdGwoKSBjYWxsIGZhaWxzIGV2ZW4gdGhvdWdoIHRoZSBkcml2ZXIgY2xhaW1zIHRvCisJICBzdXBwb3J0IHRoaXMgZm9ybWF0LCBqdXN0IGZhbGwgYmFjayB0byB0aGUgcHJlLTIuNi4xOSBrZXJuZWwKKwkgIHJvdXRpbmUgdGhhdCBjcmVhdGVzIGNhcHMgd2l0aCBzdWl0YWJsZSBoZWlnaHQgYW5kIHdpZHRoIHJhbmdlcworCSAgKHNlZSAjNDQ4Mjc4KS4KKworMjAwNy0xMS0xMyAxNzowMTowNyArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3QHNreW5ldC5iZT4KKworCSAgZ3N0L21hdHJvc2thLzogRXh0cmFjdCBwYWxldHRlIGRhdGEgZm9yIGR2ZCBzdWJwaWN0dXJlIHN0cmVhbXMgYW5kIHNlbmQgaXQgZG93bnN0cmVhbSBhcyBjdXN0b20gZ3N0cmVhbWVyIGR2ZCBldmVudCAoLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXcgc2t5bmV0IGJlPgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcHVzaF9kdmRfY2x1dF9jaGFuZ2VfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3VidGl0bGVfY2Fwcyk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIEV4dHJhY3QgcGFsZXR0ZSBkYXRhIGZvciBkdmQgc3VicGljdHVyZSBzdHJlYW1zIGFuZCBzZW5kIGl0CisJICBkb3duc3RyZWFtIGFzIGN1c3RvbSBnc3RyZWFtZXIgZHZkIGV2ZW50IChmaXhlcyAjNDUzNDE3KS4KKworMjAwNy0xMS0xMyAxNDo1MTozMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6IEltcGxlbWVudCBtaW5pbWFsIHBhcnNpbmcgb2YgdGhlIHBhc3NlZCBwYW5nbyBmb250IGRlc2NyaXB0aW9uIHN0cmluZywgc28gcGFzc2luZyBhIGZvbnQgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6IChnc3RfdGV4dF9vdmVybGF5X2ZvbnRfaW5pdCk6CisJICBJbXBsZW1lbnQgbWluaW1hbCBwYXJzaW5nIG9mIHRoZSBwYXNzZWQgcGFuZ28gZm9udCBkZXNjcmlwdGlvbgorCSAgc3RyaW5nLCBzbyBwYXNzaW5nIGEgZm9udCBzaXplIHdvcmtzIHRoZSBzYW1lIGFzIHdpdGggdGhlCisJICBwYW5nbyB0ZXh0b3ZlcmxheSBwbHVnaW47IGZpeGVzICM0NTUwODYuCisJICAoTWF5YmUgd2UgY291bGQganVzdCB1c2UgcGFuZ29jYWlybyBoZXJlIGF0IHNvbWUgcG9pbnQpLgorCisyMDA3LTExLTEzIDA2OjU1OjI4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC86IFJldHVybiB0aGUgcmVzdWx0IGluIF9hY3RpdmF0ZV9wdWxsKCkuIERvbid0IHJlZiBlbGVtZW50IHRoZXJlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBSZXR1cm4gdGhlIHJlc3VsdCBpbiBfYWN0aXZhdGVfcHVsbCgpLiBEb24ndCByZWYgZWxlbWVudCB0aGVyZS4KKworMjAwNy0xMS0xMyAwNjoyMzo1MSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogUmVmIHRoZSBlbGVtZW50IHdoZW4gd2Ugc2hvdWxkLCBidXQgbm90IHdoZW4gd2UgaXRzIG5vdCBuZWVkZWQuIFJlZmxvdyB0aGUgZXZlbnRfaGFuZGxpbmcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksCisJICAoZ3N0X3dhdnBhcnNlX3BhZF9jb252ZXJ0KSwgKGdzdF93YXZwYXJzZV9wYWRfcXVlcnkpLAorCSAgKGdzdF93YXZwYXJzZV9zcmNwYWRfZXZlbnQpOgorCSAgUmVmIHRoZSBlbGVtZW50IHdoZW4gd2Ugc2hvdWxkLCBidXQgbm90IHdoZW4gd2UgaXRzIG5vdCBuZWVkZWQuIFJlZmxvdworCSAgdGhlIGV2ZW50X2hhbmRsaW5nIHRvIG5vdCBsZWFrIHRoZSBldmVudC4KKworMjAwNy0xMS0xMiAyMTowNzozMSArMDAwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSAgZ3N0L3JlcGxheWdhaW4vcmdhbmFseXNpcy5jOiBBdm9pZCBzbG93ZG93biBmcm9tIGRlbm9ybWFscyB3aGVuIHByb2Nlc3NpbmcgbmVhci1zaWxlbmNlIGlucHV0IGRhdGEuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBSZW7DqSBTdGFkbGVyIDxtYWlsIGF0IHJlbmVzdGFkbGVyIGRvdCBkZT4KKwkgICogZ3N0L3JlcGxheWdhaW4vcmdhbmFseXNpcy5jOiAoeXVsZV9maWx0ZXIpOgorCSAgQXZvaWQgc2xvd2Rvd24gZnJvbSBkZW5vcm1hbHMgd2hlbiBwcm9jZXNzaW5nIG5lYXItc2lsZW5jZSBpbnB1dCBkYXRhLgorCSAgU3BvdHRlZCBieSBHYWJyaWVsIEJvdXZpZ25lLiBGaXhlcyAjNDk0NDk5LgorCisyMDA3LTExLTEyIDE3OjU5OjQwICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFByb3Blcmx5IGZyZWUgUVREZW11eFNhbXBsZXMgYXJyYXkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfY2hhbmdlX3N0YXRlKSwKKwkgIChxdGRlbXV4X3BhcnNlX3NhbXBsZXMpOgorCSAgUHJvcGVybHkgZnJlZSBRVERlbXV4U2FtcGxlcyBhcnJheS4KKwkgIFByb3RlY3QgdGFibGUgd3JpdGUgd2l0aCBhIHNlbnNpYmxlIGNoZWNrLCBzb21lIGZpbGVzIGFwcGFyZW50bHkgRE8gY29udGFpbgorCSAgc3R0cyB2YWx1ZXMgc3RhcnRpbmcgd2l0aCAwIDooCisKKzIwMDctMTEtMTIgMTc6MjE6NTkgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0LzogRHJvcCBFT1MgaW4gX2hhbmRsZV9zcmNfZXZlbnQoKS4gRml4IHRoZSByZWZjb3VudCBpbiBxdGRlbXV4IHRoYXQgcHJldmlvdXMgY29tbWl0IG1lc3NlZCB1cC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIERyb3AgRU9TIGluIF9oYW5kbGVfc3JjX2V2ZW50KCkuIEZpeCB0aGUgcmVmY291bnQgaW4gcXRkZW11eCB0aGF0CisJICBwcmV2aW91cyBjb21taXQgbWVzc2VkIHVwLgorCisyMDA3LTExLTEyIDE3OjA2OjMyICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC86IFN5bmMgX2hhbmRsZV9zcmNfZXZlbnQoKSB3aXRoIG9nZ2RlbXV4LiBJbiBhdmlkZW11eCBhbHNvIHJlZiB0aGUgZWxlbWVudCB3aGVuIHdlIHNob3VsZCwgYnV0IG5vdCB3aGVuIHdlIGl0cyBuby4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgU3luYyBfaGFuZGxlX3NyY19ldmVudCgpIHdpdGggb2dnZGVtdXguIEluIGF2aWRlbXV4IGFsc28gcmVmIHRoZQorCSAgZWxlbWVudCB3aGVuIHdlIHNob3VsZCwgYnV0IG5vdCB3aGVuIHdlIGl0cyBub3QgbmVlZGVkLgorCisyMDA3LTExLTExIDIxOjEyOjEwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC86IENoYW5nZSB0aGUgbWVhbmluZyBvZiB0aGUgbWFnbml0dWRlIHZhbHVlcyBnaXZlbiBpbiB0aGUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2RlbW8uYzogKGRyYXdfc3BlY3RydW0pOgorCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1hdWRpb3Rlc3QuYzogKGRyYXdfc3BlY3RydW0pOgorCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1vc3NzcmMuYzogKGRyYXdfc3BlY3RydW0pOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogKGdzdF9zcGVjdHJ1bV9jbGFzc19pbml0KToKKwkgIENoYW5nZSB0aGUgbWVhbmluZyBvZiB0aGUgbWFnbml0dWRlIHZhbHVlcyBnaXZlbiBpbiB0aGUKKwkgIEdzdE1lc3NhZ2VzIGJ5IHNwZWN0cnVtIHRvIGRlY2liZWwgaW5zdGVhZCBvZgorCSAgZGVjaWJlbCt0aHJlc2hvbGQuCisKKzIwMDctMTEtMTEgMTM6NTU6MjcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2VxdWFsaXplci86IEFuZCBjb250aW51ZSB0byB1cGRhdGUgZG9jcy4gQWxzbyBpbmNsdWRlIHNvbWUgc2FtcGxlIGNvZGUgZm9yIHRoZSBuLWJhbmQgZXF1YWxpemVyIGluIHRoZSBkb2NzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5jOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5jOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5jOgorCSAgQW5kIGNvbnRpbnVlIHRvIHVwZGF0ZSBkb2NzLiBBbHNvIGluY2x1ZGUgc29tZSBzYW1wbGUgY29kZQorCSAgZm9yIHRoZSBuLWJhbmQgZXF1YWxpemVyIGluIHRoZSBkb2NzLgorCisyMDA3LTExLTExIDEyOjU0OjMxICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9lcXVhbGl6ZXIvOiBVcGRhdGUgZG9jcyBhbmQgcHJvcGVydHkgcmFuZ2VzIHRvIHRoZSByZWFsIHZhbHVlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjEwYmFuZHMuYzoKKwkgIChnc3RfaWlyX2VxdWFsaXplcl8xMGJhbmRzX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5jOgorCSAgKGdzdF9paXJfZXF1YWxpemVyXzNiYW5kc19jbGFzc19pbml0KToKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXJuYmFuZHMuYzoKKwkgIFVwZGF0ZSBkb2NzIGFuZCBwcm9wZXJ0eSByYW5nZXMgdG8gdGhlIHJlYWwgdmFsdWVzLgorCisyMDA3LTExLTA5IDE3OjI3OjAwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiBOb3cgZG8gdGhlIHNjYWxpbmcgcmlnaHQgZm9yIHJlYWwuIEFsc28gaW5pdGlhbGl6ZSBhIHByZXZpb3VzbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgIE5vdyBkbyB0aGUgc2NhbGluZyByaWdodCBmb3IgcmVhbC4gQWxzbyBpbml0aWFsaXplIGEgcHJldmlvdXNseQorCSAgdW5pbml0aWFsaXplZCB2YXJpYWJsZS4KKworMjAwNy0xMS0wOCAxNTo1Njo0NiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvZXF1YWxpemVyL2RlbW8uYzogTWFrZSBkZWZhdWx0IHZvbHVtZSBhIGJpdCBsZXNzLiBJbXByb3ZlIGxheW91dCBieSBnaXZpbmcgbW9yZSBzcGFjZSB0byB0aGUgc2xpZGVyIHdpdGggYmlnLW51bWIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2RlbW8uYzoKKwkgIE1ha2UgZGVmYXVsdCB2b2x1bWUgYSBiaXQgbGVzcy4gSW1wcm92ZSBsYXlvdXQgYnkgZ2l2aW5nIG1vcmUgc3BhY2UgdG8KKwkgIHRoZSBzbGlkZXIgd2l0aCBiaWctbnVtYmVycyBhbmQgZW5hYmxlIGZpbGwuCisKKzIwMDctMTEtMDggMTU6MDA6NDAgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IFJldHVybiBGQUxTRSBpZiB3ZSBjYW4ndCBoYW5kbGUgYSBxdWVyeSBpbnN0ZWFkIG9mIGNoYW5naW5nIHRoZSBmb3JtYXQuIElnbm9yZSBmYWN0IHdoZW4gLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBSZXR1cm4gRkFMU0UgaWYgd2UgY2FuJ3QgaGFuZGxlIGEgcXVlcnkgaW5zdGVhZCBvZiBjaGFuZ2luZyB0aGUKKwkgIGZvcm1hdC4gSWdub3JlIGZhY3Qgd2hlbiBkZWFsaW5nIHdpdGggbXBlZyBhdWRpby4KKworMjAwNy0xMS0wNiAxMjoyMzozNSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3Qvc3BlY3RydW0vZGVtby1hdWRpb3Rlc3QuYzogVXNlIGF1dG9hdWRpb3NpbmsgaW5zdGVhZCBvZiBhbHNhc2luayBhbmQgdXNlIGEgc2luZSB3YXZlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOiAobWFpbik6CisJICBVc2UgYXV0b2F1ZGlvc2luayBpbnN0ZWFkIG9mIGFsc2FzaW5rIGFuZCB1c2UgYSBzaW5lIHdhdmUuCisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgRml4IHRoZSBtYWduaXR1ZGUgY2FsY3VsYXRpb24uCisKKzIwMDctMTEtMDMgMTk6NTA6MTEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2VxdWFsaXplci86IEFsbG93IHNldHRpbmcgMCBhcyBiYW5kd2lkdGggYW5kIGhhbmRsZSB0aGlzIGNvcnJlY3RseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2RlbW8uYzogKG1haW4pOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSAgKGdzdF9paXJfZXF1YWxpemVyX2JhbmRfY2xhc3NfaW5pdCksIChzZXR1cF9maWx0ZXIpOgorCSAgQWxsb3cgc2V0dGluZyAwIGFzIGJhbmR3aWR0aCBhbmQgaGFuZGxlIHRoaXMgY29ycmVjdGx5LgorCSAgQWxzbyBoYW5kbGUgYSBiYW5kd2lkdGggb2YgcmF0ZS8yIHByb3Blcmx5LgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5jOgorCSAgKGdzdF9paXJfZXF1YWxpemVyX25iYW5kc19jbGFzc19pbml0KToKKwkgIE1ha2UgaXQgcG9zc2libGUgdG8gZ2VuZXJhdGUgYSBOLWJhbmQgZXF1YWxpemVyIHdpdGggMSBiYW5kcy4gVGhlCisJICBwcmV2aW91cyBsaW1pdCBvZiAyIHdhcyBjYXVzZWQgYnkgYSBub3dhZGF5cyByZXBsYWNlZCBjYWxjdWxhdGlvbgorCSAgZG9pbmcgYSBkaXZpc2lvbiBieSB6ZXJvIGlmIG51bWJlciBvZiBiYW5kcyB3YXMgMS4KKworMjAwNy0xMS0wMiAyMToxNjowOSArMDAwMCAgT2xlIEFuZHLDqSBWYWRsYSBSYXZuw6VzIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KKworCSAgRml4IGluY2x1ZGVzIGZvciBNU1ZDIGFuZCBHTGliLTIuMTQuMCAoIzQ5MjM4OCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBPbGUgQW5kcsOpIFZhZGxhIFJhdm7DpXMgIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkgICogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmg6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJICAqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNpbmsuaDoKKwkgIEZpeCBpbmNsdWRlcyBmb3IgTVNWQyBhbmQgR0xpYi0yLjE0LjAgKCM0OTIzODgpLgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19zdGFydCk6CisJICBObyBtb3JlIHBpcGUgZGVmaW5lIHNpbmNlIEdMaWItMi4xNC4wLCBuZWVkIHRvIHVzZSBfcGlwZSgpIGRpcmVjdGx5LgorCisyMDA3LTExLTAyIDE3OjIzOjQzICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvbGF3L211bGF3LWRlY29kZS4qOiBDYWxjdWxhdGUgb3V0Z29pbmcgYnVmZmVyIGR1cmF0aW9uIGlmIGluY29taW5nIGJ1ZmZlciBkaWRuJ3QgaGF2ZSBhIHZhbGlkIGR1cmF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6IChtdWxhd2RlY19zaW5rX3NldGNhcHMpLAorCSAgKGdzdF9tdWxhd2RlY19jaGFpbik6CisJICAqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmg6CisJICBDYWxjdWxhdGUgb3V0Z29pbmcgYnVmZmVyIGR1cmF0aW9uIGlmIGluY29taW5nIGJ1ZmZlciBkaWRuJ3QgaGF2ZSBhCisJICB2YWxpZCBkdXJhdGlvbi4KKworMjAwNy0xMC0zMCAyMTozNzo0OSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZXF1YWxpemVyLzogQWRkIHNtYWxsIGRlbW8gYXBwbGljYXRpb24gYmFzZWQgb24gdGhlIHNwZWN0cnVtIGRlbW8gYXBwbGljYXRpb25zIHRoYXQgZ2V0cyB3aGl0ZSBub2lzZSBhcyBpbnB1dCwgcHUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZXF1YWxpemVyL2RlbW8uYzogKG9uX3dpbmRvd19kZXN0cm95KSwgKG9uX2NvbmZpZ3VyZV9ldmVudCksCisJICAob25fZ2Fpbl9jaGFuZ2VkKSwgKG9uX2JhbmR3aWR0aF9jaGFuZ2VkKSwgKG9uX2ZyZXFfY2hhbmdlZCksCisJICAoZHJhd19zcGVjdHJ1bSksIChtZXNzYWdlX2hhbmRsZXIpLCAobWFpbik6CisJICBBZGQgc21hbGwgZGVtbyBhcHBsaWNhdGlvbiBiYXNlZCBvbiB0aGUgc3BlY3RydW0gZGVtbyBhcHBsaWNhdGlvbnMKKwkgIHRoYXQgZ2V0cyB3aGl0ZSBub2lzZSBhcyBpbnB1dCwgcHVzaGVzIGl0IHRocm91Z2ggYW4gZXF1YWxpemVyIGFuZAorCSAgcGFpbnRzIHRoZSBzcGVjdHJ1bS4gRm9yIGV2ZXJ5IGVxdWFsaXplciBiYW5kIGl0J3MgcG9zc2libGUgdG8gc2V0CisJICBnYWluLCBiYW5kd2lkdGggYW5kIGZyZXF1ZW5jeS4KKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzogKHNldHVwX2ZpbHRlcik6CisJICBBZGQgc29tZSBndWFyZGluZyBhZ2FpbnN0IHRvbyBsYXJnZSBvciB0b28gc21hbGwgZnJlcXVlbmNpZXMgYW5kCisJICBiYW5kd2lkdGhzLiBBbHNvIGltcHJvdmUgZGVidWdnaW5nIGEgYml0LgorCisyMDA3LTEwLTMwIDIxOjE4OjQ1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6IFJlcGxhY2UgZmlsdGVycyB3aXRoIGEgYml0IGJldHRlciBmaWx0ZXJzIGZvciB3aGljaCB3ZSBjYW4gYWN0dWFsbHkgZmluZCBkb2N1bWVudGF0aS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX2JhbmRfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9iYW5kX2NsYXNzX2luaXQpLCAoYXJnX3RvX3NjYWxlKSwKKwkgIChzZXR1cF9maWx0ZXIpLCAoZ3N0X2lpcl9lcXVhbGl6ZXJfY29tcHV0ZV9mcmVxdWVuY2llcyk6CisJICBSZXBsYWNlIGZpbHRlcnMgd2l0aCBhIGJpdCBiZXR0ZXIgZmlsdGVycyBmb3Igd2hpY2ggd2UgY2FuIGFjdHVhbGx5CisJICBmaW5kIGRvY3VtZW50YXRpb24sIHdoaWNoIGRvbid0IGNoYW5nZSBhbnl0aGluZyBvbiB6ZXJvIGdhaW4sIGV0Yy4KKwkgIE1ha2UgdGhlIGZyZXF1ZW5jeSBwcm9wZXJ0eSBvZiB0aGUgYmFuZHMgd3JpdGFibGUsIHJlbmFtZSB0aGUKKwkgIGJhbmQtd2lkdGggcHJvcGVydHkgdG8gYmFuZHdpZHRoIGFuZCBjaGFuZ2UgdGhlCW1lYW5pbmcgdG8gdGhlCisJICBmcmVxdWVuY3kgZGlmZmVyZW5jZSBiZXR3ZWVuIGJhbmRlZGdlcywgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHRoZQorCSAgZ2FpbiBwcm9wZXJ0eSB0byBkQiBpbnN0ZWFkIG9mIGEgd2VpcmQgc2NhbGUgYmV0d2VlbiAtMQlhbmQgMSB0aGF0CisJICBoYXMgbm8gcmVhbCBtZWFuaW5nLgorCisyMDA3LTEwLTMwIDEyOjI5OjQ2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFNtYXJ0ZXIgY29tYmluZV9mbG93IGNvZGUgdGhhdCBhbHNvIGRlYWxzIHdpdGggZG93bnN0cmVhbSBlbGVtZW50cyByZXR1cm5pbmcgVU5FWFBFQ1RFRCB3aGVuIHQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9hY3RpdmF0ZV9zZWdtZW50KSwKKwkgIChnc3RfcXRkZW11eF9jb21iaW5lX2Zsb3dzKSwgKGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfbW92aWUpOgorCSAgU21hcnRlciBjb21iaW5lX2Zsb3cgY29kZSB0aGF0IGFsc28gZGVhbHMgd2l0aCBkb3duc3RyZWFtIGVsZW1lbnRzCisJICByZXR1cm5pbmcgVU5FWFBFQ1RFRCB3aGVuIHRoZXkgcmVjZWl2ZSBkYXRhIG91dCBvZiB0aGUgc2VnbWVudAorCSAgYm91bmRhcmllcy4gRml4ZXMgIzQ5MTMwNS4KKworMjAwNy0xMC0yNyAxNjowNDo0OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOiBMZXQncyBub3QgY2FsbCBldmVyeSByZXF1ZXN0IHBhZCB3ZSBjcmVhdGUgInNpbmslZCIsIHRoYXQnbGwgY3JlYXRlIHByb2JsZW1zIGlmIHRoZXJlJ3MgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOiAoZ3N0X2ludGVybGVhdmVfcmVxdWVzdF9uZXdfcGFkKToKKwkgIExldCdzIG5vdCBjYWxsIGV2ZXJ5IHJlcXVlc3QgcGFkIHdlIGNyZWF0ZSAic2luayVkIiwgdGhhdCdsbAorCSAgY3JlYXRlIHByb2JsZW1zIGlmIHRoZXJlJ3MgdG8gYmUgbW9yZSB0aGFuIG9uZSBwYWQuIEZpeGVzICM0OTA2ODIuCisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbnRlcmxlYXZlLmM6CisJICBBZGQgdW5pdCB0ZXN0IGZvciB0aGUgYWJvdmUuCisKKzIwMDctMTAtMjYgMTU6MDM6MDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogRml4ICd1bnVzZWQgdmFyaWFibGUnIGNvbXBpbGVyIHdhcm5pbmcgd2hlbiBjb21waWxpbmcgYWdhaW5zdCBvbGRlciBrZXJuZWwgaGVhZGVycy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICBGaXggJ3VudXNlZCB2YXJpYWJsZScgY29tcGlsZXIgd2FybmluZyB3aGVuIGNvbXBpbGluZyBhZ2FpbnN0CisJICBvbGRlciBrZXJuZWwgaGVhZGVycy4KKworMjAwNy0xMC0yNiAxMjoxMDo0MyArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICB1cGRhdGUgc3BlYyBmaWxlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHVwZGF0ZSBzcGVjIGZpbGUKKworMjAwNy0xMC0yNSAyMzo0Mjo1MiArMDAwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkgIEltcHJvdmUgZG9jdW1lbnRhdGlvbiwgd3JpdGUgc29tZSB0ZXN0cyBmb3IgbXVsdGlmaWxlc3JjL3NpbmsgZm9yIHVwY29taW5nIC0+Z29vZCByZXZpZXcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L211bHRpZmlsZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICAqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWx0aWZpbGUuYzoKKwkgIEltcHJvdmUgZG9jdW1lbnRhdGlvbiwgd3JpdGUgc29tZSB0ZXN0cyBmb3IgbXVsdGlmaWxlc3JjL3NpbmsKKwkgIGZvciB1cGNvbWluZyAtPmdvb2QgcmV2aWV3LgorCisyMDA3LTEwLTI1IDE1OjAwOjE1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjIChhZGRfZnVuY3MpOiBNYXAgbmV3IFNPUlROQU1FIHRhZ3MgdG8gSUQzdjIgVFNPUCwgVFNPQSBhbmQgVFNPVCBmcmFtZXMgKCM0MTQ1MzkpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2MgKGFkZF9mdW5jcyk6CisJICBNYXAgbmV3IFNPUlROQU1FIHRhZ3MgdG8gSUQzdjIgVFNPUCwgVFNPQSBhbmQgVFNPVCBmcmFtZXMgKCM0MTQ1MzkpLgorCisyMDA3LTEwLTI0IDA3OjAxOjQ3ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy9zaW1wbGUtbGF1bmNoLWxpbmVzLmM6IEltcHJvdmUgdGhlIHRlc3RzIGEgbGl0dGxlIG1vcmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3NpbXBsZS1sYXVuY2gtbGluZXMuYzoKKwkgIEltcHJvdmUgdGhlIHRlc3RzIGEgbGl0dGxlIG1vcmUuCisKKzIwMDctMTAtMjMgMDg6Mzg6NTAgKzAwMDAgIFl1biBaaGVuZyBIdSA8eXVuemhlbmcuaHVAZ21haWwuY29tPgorCisJICBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzogVXNlIGRlZmF1bHQgaW5wdXQgZGV2aWNlIGluc3RlYWQgb2YgZGVmYXVsdCBvdXRwdXQgZGV2aWNlIGFuZCBvbmx5IG1lbWNweSBhY3R1YWwgYXZhaWwuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcGF0Y2ggYnk6IFl1biBaaGVuZyBIdQorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkgIFVzZSBkZWZhdWx0IGlucHV0IGRldmljZSBpbnN0ZWFkIG9mIGRlZmF1bHQgb3V0cHV0IGRldmljZSBhbmQKKwkgIG9ubHkgbWVtY3B5IGFjdHVhbCBhdmFpbGFibGUgYnl0ZXMuCisKKzIwMDctMTAtMjIgMTk6MTQ6MDggKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSAgc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiBGaXhlcyAidjRsMnNyYyAhIHF1ZXVlICEgeHZpbWFnZXNpbmsiLiBUaGUgcXVldWUgYXNrIGZvciBidWZmZXIgdG9vIGVhcmx5LiBJdCBpcyB0ZW1wb3JhcnkgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfZ3JhYl9mcmFtZSk6CisJICBGaXhlcyAidjRsMnNyYyAhIHF1ZXVlICEgeHZpbWFnZXNpbmsiLiBUaGUgcXVldWUgYXNrIGZvciBidWZmZXIgdG9vCisJICBlYXJseS4gSXQgaXMgdGVtcG9yYXJ5IHVudGlsIHdlIGZpbmQgc29tZXRoaW5nIGJldHRlci4KKworMjAwNy0xMC0yMiAxNjo0NDo0OCArMDAwMCAgVG9tbWkgTXnDtmjDpG5lbiA8ZXh0LXRvbW1pLm15b2hhbmVuQG5va2lhLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBGaXggcmFjZSB3aGVuIHBhdXNpbmcgYSBSVFNQIHN0cmVhbSBpbiBpbnRlcmxlYXZlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFRvbW1pIE15w7Zow6RuZW4gIDxleHQtdG9tbWkgZG90IG15b2hhbmVuIGF0IG5va2lhIGRvdCBjb20+CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2xvb3BfaW50ZXJsZWF2ZWQpOgorCSAgRml4IHJhY2Ugd2hlbiBwYXVzaW5nIGEgUlRTUCBzdHJlYW0gaW4gaW50ZXJsZWF2ZWQuCisJICBGaXhlcyAjNDc1Nzg0LgorCisyMDA3LTEwLTIyIDA5OjUzOjE2ICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6IFVzZSBjb3JyZWN0IHVucmVmIGZ1bmN0aW9uIGZvciBidWZmZXJzLiAjNDg4ODQ0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2ogYXQgYXhpcyBjb20+CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOiAoZ3N0X3J0cF9tcDR2X3BheV9maW5hbGl6ZSk6CisJICBVc2UgY29ycmVjdCB1bnJlZiBmdW5jdGlvbiBmb3IgYnVmZmVycy4gIzQ4ODg0NC4KKworMjAwNy0xMC0xOSAxOTozMzoxNiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBBZGQgc29tZSBkZWJ1ZyBhbmQgc3luYyB0ZXN0cyB3aXRoIHRoZSBmaXguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpbXV4LmM6CisJICBBZGQgc29tZSBkZWJ1ZyBhbmQgc3luYyB0ZXN0cyB3aXRoIHRoZSBmaXguCisKKzIwMDctMTAtMTggMTc6MDQ6MTQgKzAwMDAgIExhdXJlbnQgR2xheWFsIDxzcGdsZWdsZUB5YWhvby5mcj4KKworCSAgZ3N0L3VkcC9nc3R1ZHBzcmMuYzogV2hlbiB0aGUgc29ja2V0IGlzIHVzZWQgYnkgdGhlIGFwcCBmb3Igb3RoZXIgcHVycG9zZXMsIGRvbid0IGdlbmVyYXRlIGFuIGVycm9yIGlmIHRoZXJlIGlzIGFjdGl2Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5OiBMYXVyZW50IEdsYXlhbCAgPHNwZ2xlZ2xlIHlhaG9vIGZyPgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19jcmVhdGUpOgorCSAgV2hlbiB0aGUgc29ja2V0IGlzIHVzZWQgYnkgdGhlIGFwcCBmb3Igb3RoZXIgcHVycG9zZXMsIGRvbid0IGdlbmVyYXRlIGFuCisJICBlcnJvciBpZiB0aGVyZSBpcyBhY3RpdmF0eSBvbiB0aGUgc29ja2V0IHRoYXQgaXMgbm90IGRhdGEgcmVsYXRlZC4KKwkgIEZpeGVzICM0ODc0ODguCisKKzIwMDctMTAtMTggMTQ6NTU6MzggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogQWRkIHNvbWUgbW9yZSBkZWJ1ZyBpbmZvLiBHZW5lcmF0ZSBhbiBlcnJvciB3aGVuIHdlIHJ1biBvdXQgb2YgYnVmZmVycyBmb3Igc29tZSByZWFzb24uIFNlZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyX2J1ZmZlcl9maW5hbGl6ZSksCisJICAoZ3N0X3Y0bDJzcmNfZ3JhYl9mcmFtZSk6CisJICBBZGQgc29tZSBtb3JlIGRlYnVnIGluZm8uIEdlbmVyYXRlIGFuIGVycm9yIHdoZW4gd2UgcnVuIG91dCBvZiBidWZmZXJzCisJICBmb3Igc29tZSByZWFzb24uIFNlZSAjNDgwNTU3LgorCisyMDA3LTEwLTE4IDA4OjI3OjU2ICswMDAwICBBbmRlcnMgU2thcmdyZW4gPGFuZGVycy5za2FyZ3JlbkBheGlzLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6IFNldCBtYXJrZXIgYml0IGNvcnJlY3RseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEFuZGVycyBTa2FyZ3JlbiA8YW5kZXJzIGRvdCBza2FyZ3JlbiBhdCBheGlzIGRvdCBjb20+CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOiAoZ3N0X3J0cF9oMjY0X3BheV9oYW5kbGVfYnVmZmVyKToKKwkgIFNldCBtYXJrZXIgYml0IGNvcnJlY3RseS4KKworMjAwNy0xMC0xOCAwNjoyMDoyMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOiBBZGQgYSBtaXNzaW5nIGJyZWFrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9zZXRfcHJvcGVydHkpOgorCSAgQWRkIGEgbWlzc2luZyBicmVhay4KKworMjAwNy0xMC0xOCAwNjoxNDo0MiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci4qOiBNb3ZlIGJhbmR3aWR0aCBwcm9wZXJ0eSB0byB0aGUgc2VwYXJhdGUgYmFuZHMgYW5kIGFkZCBmbG9hdDY0IHN1cHBvcnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9iYW5kX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX2JhbmRfY2xhc3NfaW5pdCksIChnc3RfaWlyX2VxdWFsaXplcl9iYW5kX2luaXQpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX2JhbmRfZ2V0X3R5cGUpLCAoZ3N0X2lpcl9lcXVhbGl6ZXJfY2xhc3NfaW5pdCksCisJICAoc2V0dXBfZmlsdGVyKSwgKGdzdF9paXJfZXF1YWxpemVyX3NldHVwKToKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuaDoKKwkgIE1vdmUgYmFuZHdpZHRoIHByb3BlcnR5IHRvIHRoZSBzZXBhcmF0ZSBiYW5kcyBhbmQgYWRkIGZsb2F0NjQgc3VwcG9ydC4KKworMjAwNy0xMC0xNyAxNTowODowMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBVc2UgYWxsb3dlZCBuYW1lIGZvciB0aGUgR3N0U3RydWN0dXJlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX29wZW4pOgorCSAgVXNlIGFsbG93ZWQgbmFtZSBmb3IgdGhlIEdzdFN0cnVjdHVyZS4KKworMjAwNy0xMC0xNyAxMTo0NzoyMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgVXNlIG5ldyBnc3RfYnVzX3BvcF9maWx0ZXJlZCgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nY29uZi9nc3Rzd2l0Y2hzaW5rLmM6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkgIFVzZSBuZXcgZ3N0X2J1c19wb3BfZmlsdGVyZWQoKS4KKworMjAwNy0xMC0xMyAxMjowMzo0NCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgc3lzL3Y0bDIvOiBXaGVuIHByb2JpbmcgdGhlIGZvcm1hdHMgYW5kIHNpemVzIGEgY2FtZXJhIHN1cHBvcnRzLCBtYWtlIHN1cmUgdGhlIGJlc3Qgb25lcyAoaGlnaGVzdCByZXNvbHV0aW9uLCBwcmVmZXJlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICBXaGVuIHByb2JpbmcgdGhlIGZvcm1hdHMgYW5kIHNpemVzIGEgY2FtZXJhIHN1cHBvcnRzLCBtYWtlCisJICBzdXJlIHRoZSBiZXN0IG9uZXMgKGhpZ2hlc3QgcmVzb2x1dGlvbiwgcHJlZmVyZWQgZm9ybWF0KQorCSAgZW5kIHVwIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb2JlZCBjYXBzIGFuZCB0aGUgbGVzcworCSAgZGVzaXJhYmxlIG9uZXMgYXQgdGhlIGVuZC4gIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgdGhlCisJICBvcmRlciB3aXRoaW4gdGhlIGNhcHMgbWF0dGVycyBmb3IgdGhpbmdzIGxpa2UgZml4YXRpb24gYW5kCisJICBuZWdvdGlhdGlvbiwgaWUuIHdoYXQgZm9ybWF0IGlzIGNob3NlbiBpbiB0aGUgZW5kLgorCSAgV2l0aCByZWNlbnQga2VybmVscywgdGhlIGN1cnJlbnQgcHJvYmluZyBjb2RlIHdpbGwgZW5kIHVwCisJICBxdWVyeWluZyB0aGUgc3VwcG9ydGVkIHNpemVzIGZyb20gbG93ZXN0IHJlc29sdXRpb24gdG8KKwkgIGhpZ2hlc3QgcmVzb2x1dGlvbiwgYWRkaW5nIHRoZW0gdG8gdGhlIHByb2JlZCBjYXBzIGluIHRoYXQKKwkgIG9yZGVyLCByZXN1bHRpbmcgdG8gdjRsMnNyYyBmaXhhdGluZyB0byB0aGUgbG93ZXN0IHBvc3NpYmxlCisJICByZXNvbHV0aW9uIGlmIGRvd25zdHJlYW0gZG9lcyBub3QgZXhwcmVzcyBhIHNpemUgcHJlZmVyZW5jZS4KKwkgIEFsc28gbWFrZSB1cCBhIHNvbWV3aGF0IHJhbmRvbSByYW5raW5nIG9mIHByZWZlcmVkIG91dHB1dAorCSAgZm9ybWF0cyBmb3IgdGhlIHNhbWUgcmVhc29uLiBGaXhlcyAjNDg1ODI4LgorCisyMDA3LTEwLTExIDE3OjU1OjI5ICswMDAwICBKYXNvbiBLaXZsaWdobiA8amtpdmxpZ2huQGdtYWlsLmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IEV4dHJhY3QgbGljZW5zZS9jb3B5cmlnaHQgVVJJcyBmcm9tIElEM3YyIFdDT1AgZnJhbWVzIChGaXhlcyAjNDQ3MDAwKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IEphc29uIEtpdmxpZ2huICA8amtpdmxpZ2huIGdtYWlsIGNvbT4KKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6CisJICBFeHRyYWN0IGxpY2Vuc2UvY29weXJpZ2h0IFVSSXMgZnJvbSBJRDN2MiBXQ09QIGZyYW1lcworCSAgKEZpeGVzICM0NDcwMDApLgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDNkZW11eC5jOgorCSAgKiB0ZXN0cy9maWxlcy9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvZmlsZXMvaWQzLTQ0NzAwMC13Y29wLnRhZzoKKwkgIEFkZCBzaW1wbGUgdW5pdCB0ZXN0LgorCisyMDA3LTEwLTExIDE2OjQxOjQ0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOiBBZGQgc3VwcG9ydCBmb3IgbGljZW5zZS9jb3B5cmlnaHQgVVJJIHRhZ3MgKElEM3YyIFdDT1AgZnJhbWUpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJICBBZGQgc3VwcG9ydCBmb3IgbGljZW5zZS9jb3B5cmlnaHQgVVJJIHRhZ3MgKElEM3YyIFdDT1AgZnJhbWUpLgorCSAgUHJlcmVxdWlzaXRlIGZvciAjNDQ3MDAwLgorCisyMDA3LTEwLTA4IDE3OjQ0OjQyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBGaXggY29tcGlsZXIgd2FybmluZyBieSB1c2luZyBHU1RfQ0xPQ0tfVElNRV9OT05FIHRvIGluaXRpYWxpc2UgYSBHc3RDbG9ja1RpbWUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfZmx1c2gpOgorCSAgRml4IGNvbXBpbGVyIHdhcm5pbmcgYnkgdXNpbmcgR1NUX0NMT0NLX1RJTUVfTk9ORSB0byBpbml0aWFsaXNlCisJICBhIEdzdENsb2NrVGltZS4KKworMjAwNy0xMC0wOCAxMTo1ODo1MSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBNb3JlIHNlZWtpbmcgZml4ZXMsIG1vc3RseSBwYXNzaW5nIGFyb3VuZCB0aGUgbmV3IHBsYXliYWNrIHNlZ21lbnQgaW4gb3JkZXIgdG8gY29uZmlndXJlIGl0IHByLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfZmx1c2gpLAorCSAgKGdzdF9ydHNwc3JjX2RvX3NlZWspLCAoZ3N0X3J0c3BzcmNfcGVyZm9ybV9zZWVrKSwKKwkgIChnc3RfcnRzcHNyY19jb25maWd1cmVfY2FwcyksIChnc3RfcnRzcHNyY19sb29wX3VkcCksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfcmFuZ2UpLCAoZ3N0X3J0c3BzcmNfb3BlbiksIChnc3RfcnRzcHNyY19wbGF5KSwKKwkgIChnc3RfcnRzcHNyY19jaGFuZ2Vfc3RhdGUpOgorCSAgTW9yZSBzZWVraW5nIGZpeGVzLCBtb3N0bHkgcGFzc2luZyBhcm91bmQgdGhlIG5ldyBwbGF5YmFjayBzZWdtZW50IGluCisJICBvcmRlciB0byBjb25maWd1cmUgaXQgcHJvcGVybHkuCisJICBBbHNvIHJlc2V0IGJhc2VfdGltZSBvZiB1ZHAgc291cmNlcyB3aGVuIHNldHRpbmcgdGhlbSBiYWNrIHRvIFBMQVlJTkcgYXMKKwkgIGEgdGVtcG9yYXJ5IGhhY2sgdW50aWwgY29yZSBzdXBwb3J0cyBzZWVrIGluIGxpdmUgc291cmNlcyBwcm9wZXJseS4KKworMjAwNy0xMC0wOCAxMDozNDowMyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzogRml4IGNhcHMgYXMgdG8gbm90IGNvbmZ1c2UgYXV0b3BsdWdnZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJICBGaXggY2FwcyBhcyB0byBub3QgY29uZnVzZSBhdXRvcGx1Z2dlcnMuCisKKzIwMDctMTAtMDYgMTY6MTM6MTQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9pZDNkZW11eC86IFBvcnQgSUQzIHRhZyBkZW11eGVyIG92ZXIgdG8gdGhlIG5ldyBHc3RUYWdEZW11eCBpbiAtYmFzZSAobm93IHdvdWxkIGJlIGEgZ29vZCB0aW1lIHRvIHRlc3QgcmUtaW1wb3J0aS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguaDoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuaDoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6CisJICBQb3J0IElEMyB0YWcgZGVtdXhlciBvdmVyIHRvIHRoZSBuZXcgR3N0VGFnRGVtdXggaW4gLWJhc2UKKwkgIChub3cgd291bGQgYmUgYSBnb29kIHRpbWUgdG8gdGVzdCByZS1pbXBvcnRpbmcgeW91ciBtdXNpYworCSAgY29sbGVjdGlvbikuCisKKzIwMDctMTAtMDYgMTU6MTM6MDkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9hcGV0YWcvOiBQb3J0IEFQRSB0YWcgZGVtdXhlciBvdmVyIHRvIHRoZSBuZXcgR3N0VGFnRGVtdXggaW4gLWJhc2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FwZXRhZy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOgorCSAgKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4Lmg6CisJICAqIGdzdC9hcGV0YWcvZ3N0dGFnZGVtdXguYzoKKwkgICogZ3N0L2FwZXRhZy9nc3R0YWdkZW11eC5oOgorCSAgUG9ydCBBUEUgdGFnIGRlbXV4ZXIgb3ZlciB0byB0aGUgbmV3IEdzdFRhZ0RlbXV4IGluIC1iYXNlLgorCisyMDA3LTEwLTA1IDEzOjE4OjE5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IEltcHJvdmUgZmx1c2hpbmcgYmVoYXZpb3VyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2ZsdXNoKSwKKwkgIChnc3RfcnRzcHNyY19wZXJmb3JtX3NlZWspLCAoZ3N0X3J0c3BzcmNfaGFuZGxlX3NyY19ldmVudCksCisJICAoZ3N0X3J0c3BzcmNfaGFuZGxlX2ludGVybmFsX3NyY19xdWVyeSksCisJICAoZ3N0X3J0c3BzcmNfaGFuZGxlX3NyY19xdWVyeSksIChuZXdfc2Vzc2lvbl9wYWQpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdGNwKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksCisJICAoZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCk6CisJICBJbXByb3ZlIGZsdXNoaW5nIGJlaGF2aW91ci4KKwkgIFNldCBzdGF0ZSBvZiB0aGUgdWRwIHNvdXJjZXMgdG8gUEFVU0UvUExBWUlORyBjb3JyZWN0bHkuCisJICBIYW5kbGUgZXZlbnRzIGFuZCBxdWVyaWVzIGZvciBVRFAgYW5kIFRDUCB0cmFuc3BvcnQgbm93LgorCisyMDA3LTEwLTA0IDA3OjI5OjQ4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9ydHAvOiBBZGQgbG9nIGNhdGVnb3J5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkgIEFkZCBsb2cgY2F0ZWdvcnkuCisKKzIwMDctMTAtMDQgMDc6MjQ6MDIgKzAwMDAgIFRpbW8gSG90dGkgPFRpbW8uSG90dGlAc3lzb3BlbmRpZ2lhLmNvbT4KKworCSAgdGVzdHMvY2hlY2svOiBBZGQgdW5pdCB0ZXN0cyBmb3IgcGF5bG9hZGVycy9kZXBheWxvYWRlcnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBUaW1vIEhvdHRpIDxUaW1vLkhvdHRpQHN5c29wZW5kaWdpYS5jb20+CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvc2ltcGxlLWxhdW5jaC1saW5lcy5jOgorCSAgQWRkIHVuaXQgdGVzdHMgZm9yIHBheWxvYWRlcnMvZGVwYXlsb2FkZXJzLgorCisyMDA3LTEwLTAyIDEwOjQ5OjAzICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpbXV4Lio6IEFsc28gc2F2ZSBjb2RlYyBkYXRhIGZvciBhdWRpbyBzdHJlYW1zLiBGaXhlcyAjNDgyNDk1LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4Lmg6CisJICBBbHNvIHNhdmUgY29kZWMgZGF0YSBmb3IgYXVkaW8gc3RyZWFtcy4gRml4ZXMgIzQ4MjQ5NS4KKworMjAwNy0xMC0wMiAxMDoyMzowNCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aW11eC5jOiBGaXggIkluZGV4IGVudHJ5IGhhcyBpbnZhbGlkIHN0cmVhbSBuciAxIi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgRml4ICJJbmRleCBlbnRyeSBoYXMgaW52YWxpZCBzdHJlYW0gbnIgMSIuCisJICBBZGQgc3VwcG9ydCBmb3IgbXV4aW5nIGFhYyAtIHdvcmsgaW4gcHJvZ3Jlc3MgKHNlZSAjNDgyNDk1KS4KKworMjAwNy0xMC0wMSAxNjozNDo1NiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy4qOiBQYXJzZSBiYW5kd2lkdGggbW9kaWZpZXJzLCB0aGV5IGFyZSBub3QgeWV0IGNvbmZpZ3VyZWQgaW4gdGhlIHNlc3Npb24gbWFuYWdlciBiZWNhdXNlIHdlIGRvbid0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfZ2V0X2JhbmR3aWR0aCksCisJICAoZ3N0X3J0c3BzcmNfY29sbGVjdF9iYW5kd2lkdGgpLCAoZ3N0X3J0c3BzcmNfY3JlYXRlX3N0cmVhbSksCisJICAoZ3N0X3J0c3BzcmNfbWVkaWFfdG9fY2FwcyksIChnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgUGFyc2UgYmFuZHdpZHRoIG1vZGlmaWVycywgdGhleSBhcmUgbm90IHlldCBjb25maWd1cmVkIGluIHRoZSBzZXNzaW9uCisJICBtYW5hZ2VyIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhbiBBUEkgZm9yIHRoYXQgeWV0LgorCisyMDA3LTEwLTAxIDEzOjU3OjI4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IFVzZSBzaGlueSBuZXcgZnVuY3Rpb24gaW4gLWJhc2UgdG8gZ2V0IHRoZSBkZWZhdWx0IGNsb2NrLXJhdGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfcGFyc2VfcnRwbWFwKSwKKwkgIChnc3RfcnRzcHNyY19tZWRpYV90b19jYXBzKSwgKGdzdF9ydHNwc3JjX2xvb3BfaW50ZXJsZWF2ZWQpOgorCSAgVXNlIHNoaW55IG5ldyBmdW5jdGlvbiBpbiAtYmFzZSB0byBnZXQgdGhlIGRlZmF1bHQgY2xvY2stcmF0ZS4KKwkgIFVwZGF0ZSBzb21lIGRvY3MuCisKKzIwMDctMDktMjkgMTI6NTA6MzYgKzAwMDAgIFPDqWJhc3RpZW4gTW91dHRlIDxzZWJhc3RpZW5AbW91dHRlLm5ldD4KKworCSAgd2luMzIvTUFOSUZFU1Q6IEFkZCBmaWxlcyB0byB3aW4zMiBtYW5pZmVzdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB3aW4zMi9NQU5JRkVTVDoKKwkgIEFkZCBmaWxlcyB0byB3aW4zMiBtYW5pZmVzdC4KKwkgICogd2luMzIvdnM2L2xpYmdzdGF1ZGlvZnguZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0cXRkZW11eC5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RydHAuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0cnRzcC5kc3A6CisJICBVcGRhdGUgcHJvamVjdCBmaWxlcy4KKworMjAwNy0wOS0yOCAxNDo1NjoxOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy4qOiBJbiBUQ1AgbW9kZSwgb25seSB0aW1lc3RhbXAgdGhlIGZpcnN0IGJ1ZmZlci4gVENQIGlzIG5vdCByZWFsIHRpbWUgYW5kIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfbG9vcF9pbnRlcmxlYXZlZCksCisJICAoZ3N0X3J0c3BzcmNfcGxheSk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIEluIFRDUCBtb2RlLCBvbmx5IHRpbWVzdGFtcCB0aGUgZmlyc3QgYnVmZmVyLiBUQ1AgaXMgbm90IHJlYWwgdGltZSBhbmQKKwkgIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gdHJ5IHRvIHNrZXcgY29tcGVuc2F0ZSwgYWxzbyBzb21lIHNlcnZlcnMgc2VuZAorCSAgdGhlIGZpcnN0IGJhdGNoIG9mIGRhdGEgaW4gYSBidXJzdC4KKworMjAwNy0wOS0yNyAxNTowMDozMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IEZpeCBzZXR0aW5nIHRoZSBkaXNjb250IGZsYWcgb24gdGhlIGZpcnN0IGJ1ZmZlciBwdXNoZWQgZG93bnN0cmVhbSBmb3IgZm9ybWF0cyB3aXRoIHByLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBGaXggc2V0dGluZyB0aGUgZGlzY29udCBmbGFnIG9uIHRoZSBmaXJzdCBidWZmZXIKKwkgIHB1c2hlZCBkb3duc3RyZWFtIGZvciBmb3JtYXRzIHdpdGggcHJpdmF0ZSBjb2RlYworCSAgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIGRlc2VyaWFsaXNlZCBpbnRvIGJ1ZmZlcnMKKwkgIChzdWNoIGFzIHZvcmJpcyBhbmQgRkxBQyB3aGVuIGluIGEgbWF0cm9za2EgY29udGFpbmVyKS4KKworMjAwNy0wOS0yNyAxMToxMDoxMiArMDAwMCAgQW50b2luZSBUcmVtYmxheSA8aGV4YTAwQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBtcDR2cGF5Lio6IEZyZWUgdGhlIGNvbmZpZyBzdHJpbmcuIEZpeGVzICM0ODA3MDcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBBbnRvaW5lIFRyZW1ibGF5IDxoZXhhMDAgYXQgZ21haWwgZG90IGNvbT4KKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6IChnc3RfcnRwX21wNHZfcGF5X2luaXQpLAorCSAgKGdzdF9ydHBfbXA0dl9wYXlfZmluYWxpemUpLCAoZ3N0X3J0cF9tcDR2X3BheV9mbHVzaCksCisJICAoZ3N0X3J0cF9tcDR2X3BheV9oYW5kbGVfYnVmZmVyKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2cGF5Lmg6CisJICBGcmVlIHRoZSBjb25maWcgc3RyaW5nLiBGaXhlcyAjNDgwNzA3LgorCSAgQ2xlYW4gdXAgdGhlIHRpbWVzdGFtcCBjb2RlIGEgbGl0dGxlLgorCisyMDA3LTA5LTI2IDIwOjEyOjUyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLio6IFNldCB0aW1lc3RhbXBzIG9uIFJUUCBidWZmZXJzIGluIGludGVybGVhdmVkIG1vZGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfY3JlYXRlX3N0cmVhbSksCisJICAoZ3N0X3J0c3BzcmNfaGFuZGxlX3NyY19xdWVyeSksIChnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkKSwKKwkgIChnc3RfcnRzcHNyY19sb29wX3VkcCksIChnc3RfcnRzcHNyY19jbG9zZSk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIFNldCB0aW1lc3RhbXBzIG9uIFJUUCBidWZmZXJzIGluIGludGVybGVhdmVkIG1vZGUuCisJICBNYXJrIGZpcnN0IGJ1ZmZlcnMgd2l0aCBhIERJU0NPTlQuCisJICBSZW1vdmUgZmx1c2ggaGFjayBub3cgdGhhdCBzeW5jIGZvciBsaXZlIHNvdXJjZXMgaGFzIGJlZW4gZmlndXJlZCBvdXQuCisKKzIwMDctMDktMjYgMTQ6Mjg6MjAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IFVwZGF0ZSBkb2N1bWVudGF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2NyZWF0ZSk6CisJICBVcGRhdGUgZG9jdW1lbnRhdGlvbi4KKworMjAwNy0wOS0yNiAxNDoyNjozOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvZ3N0cnRweHF0ZGVwYXkuKjogRmFpbCBpZiB3ZSBkb24ndCBrbm93IHRoZSBxdWlja3RpbWUgZm9ybWF0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L2dzdHJ0cHhxdGRlcGF5LmM6IChnc3RfcnRwX3hxdF9kZXBheV9wcm9jZXNzKSwKKwkgIChnc3RfcnRwX3hxdF9kZXBheV9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvcXRkZW11eC9nc3RydHB4cXRkZXBheS5oOgorCSAgRmFpbCBpZiB3ZSBkb24ndCBrbm93IHRoZSBxdWlja3RpbWUgZm9ybWF0LgorCisyMDA3LTA5LTI2IDEzOjE5OjE3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZW5jLio6IFNhdmUgdGhlIGZsb3cgcmV0dXJuIGZyb20gdGhlIGxhc3QgZ3N0X3BhZF9wdXNoKCkgYW5kIG1ha2Ugc3VyZSB3ZSBwYXNzIHRoZSByaWdodCBmbG93IHJldHVybiAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNlbmMuaDoKKwkgIFNhdmUgdGhlIGZsb3cgcmV0dXJuIGZyb20gdGhlIGxhc3QgZ3N0X3BhZF9wdXNoKCkgYW5kCisJICBtYWtlIHN1cmUgd2UgcGFzcyB0aGUgcmlnaHQgZmxvdyByZXR1cm4gdmFsdWUgdXBzdHJlYW0KKwkgIGluIHRoZSBjYXNlIG9mIGZhaWx1cmU7IG1pbm9yIGNsZWFuLXVwcy4KKworMjAwNy0wOS0yNSAxOTowOTozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgQWRkIHN1cHBvcnQgZm9yIHRoZSBuZXcgR1NUX1RBR19DT01QT1NFUiAoIzQ1OTgwOSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3RhZ2xpYi9nc3RhcGV2Mm11eC5jYzoKKwkgICogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzoKKwkgICogZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOgorCSAgQWRkIHN1cHBvcnQgZm9yIHRoZSBuZXcgR1NUX1RBR19DT01QT1NFUiAoIzQ1OTgwOSkuCisKKzIwMDctMDktMjUgMTc6MTg6MzQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9sYXcvOiBDb21wdWxzaXZlIGNsZWFuLXVwczogdXNlIGJvaWxlcnBsYXRlIG1hY3JvcywgYWRkIGRlYnVnIGNhdGVnb3JpZXMsIGZpeCB1cCB0aGluZ3MgdG8gY29uZm9ybSB0byBzeW1ib2wgbm9tZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkgICogZ3N0L2xhdy9hbGF3LWRlY29kZS5oOgorCSAgKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6CisJICAqIGdzdC9sYXcvYWxhdy1lbmNvZGUuaDoKKwkgICogZ3N0L2xhdy9hbGF3LmM6CisJICAqIGdzdC9sYXcvbXVsYXctY29udmVyc2lvbi5oOgorCSAgQ29tcHVsc2l2ZSBjbGVhbi11cHM6IHVzZSBib2lsZXJwbGF0ZSBtYWNyb3MsIGFkZCBkZWJ1ZworCSAgY2F0ZWdvcmllcywgZml4IHVwIHRoaW5ncyB0byBjb25mb3JtIHRvIHN5bWJvbCBub21lbmtsYXR1cmEsCisJICBldGMuCisKKzIwMDctMDktMjUgMTY6MDU6MjkgKzAwMDAgIExhdXJlbnQgR2xheWFsIDxzcGdsZWdsZUB5YWhvby5mcj4KKworCSAgZ3N0L2xhdy86IFVzZSBzdGF0aWMgdGFibGVzIGZvciBBLUxhdyBkZWNvZGluZyBhbmQgZW5jb2Rpbmc7IHRoaXMgbWFrZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IExhdXJlbnQgR2xheWFsICA8c3BnbGVnbGUgeWFob28gZnI+CisJICAqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkgICogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOgorCSAgVXNlIHN0YXRpYyB0YWJsZXMgZm9yIEEtTGF3IGRlY29kaW5nIGFuZCBlbmNvZGluZzsgdGhpcyBtYWtlcworCSAgQS1MYXcgZGVjb2RpbmcgYW5kIGVuY29kaW5nIGxlc3MgQ1BVLWludGVuc2l2ZSwgYnV0IGluY3JlYXNlcworCSAgdGhlIGJpbmFyeSBzaXplIGEgYml0LiBMZWF2aW5nIG9sZCBjb2RlIGFyb3VuZCBmb3Igbm93LAorCSAgc2VsZWN0YWJsZSBieSBhIGRlZmluZSBpbiB0aGUgY29kZS4gRml4ZXMgIzQzNTQzNS4KKworMjAwNy0wOS0yNSAwODo1MTozNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBjb25maWd1cmUuYWM6IFVzZSBBR19HU1RfQVJHX1dJVEhfUExVR0lOUywgQUdfR1NUX0FSR19FTkFCTEVfRVhURVJOQUwgYW5kCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgVXNlIEFHX0dTVF9BUkdfV0lUSF9QTFVHSU5TLCBBR19HU1RfQVJHX0VOQUJMRV9FWFRFUk5BTCBhbmQKKwkgIEFHX0dTVF9BUkdfRU5BQkxFX0VYUEVSSU1FTlRBTCBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIHRob3NlIG1hY3JvcworCSAgaW4gY29uZmlndXJlLmFjLgorCisyMDA3LTA5LTI1IDA1OjAzOjU4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQWRkIGZvdXJjY3MgZm9yIE1QRUcyIEhEViBzdHJlYW1zLiBGaXhlcyAjNDc5OTYwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogPGogYXQgYm9vdGxhYiBkb3Qgb3JnPgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3ZpZGVvX2NhcHMpOgorCSAgQWRkIGZvdXJjY3MgZm9yIE1QRUcyIEhEViBzdHJlYW1zLiBGaXhlcyAjNDc5OTYwLgorCisyMDA3LTA5LTI0IDEwOjUzOjM2ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIE1hc3NpdmUgbGVhayBmaXhpbmcsIHBsdXMgY29kZSBjbGVhbnVwcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYXVkaW9yZXNhbXBsZS9nc3RhdWRpb3Jlc2FtcGxlLmM6CisJICAqIGV4dC94MjY0L2dzdHgyNjRlbmMuYzoKKwkgICogZ3N0L2R2ZHNwdS9nc3RkdmRzcHUuYzoKKwkgICogZ3N0L2R2ZHNwdS9nc3RkdmRzcHUuaDoKKwkgICogZ3N0L2Zlc3RpdmFsL2dzdGZlc3RpdmFsLmM6CisJICAqIGdzdC9oMjY0cGFyc2UvZ3N0aDI2NHBhcnNlLmM6CisJICAqIGdzdC9tcGVndHNwYXJzZS9tcGVndHNwYWNrZXRpemVyLmM6CisJICAqIGdzdC9tcGVndHNwYXJzZS9tcGVndHNwYXJzZS5jOgorCSAgKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgICogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkgICogZ3N0L251dmRlbXV4L2dzdG51dmRlbXV4LmM6CisJICAqIHN5cy9kc2hvd3NyY3dyYXBwZXIvZ3N0ZHNob3dhdWRpb3NyYy5jOgorCSAgKiBzeXMvZHNob3dzcmN3cmFwcGVyL2dzdGRzaG93dmlkZW9zcmMuYzoKKwkgICogc3lzL3ZjZC92Y2RzcmMuYzoKKwkgIE1hc3NpdmUgbGVhayBmaXhpbmcsIHBsdXMgY29kZSBjbGVhbnVwcy4KKworMjAwNy0wOS0yMyAxODo1NzoxNCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBzeXMvb3NzL2dzdG9zc2hlbHBlci5jOiBVc2UgR1NUX1dBUk5JTkcgaW5zdGVhZCBvZiBhIGdfY3JpdGljYWwuIFRoaXMgc2l0dWF0aW9uIGlzIG5vdCBjYXVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3MvZ3N0b3NzaGVscGVyLmM6CisJICBVc2UgR1NUX1dBUk5JTkcgaW5zdGVhZCBvZiBhIGdfY3JpdGljYWwuIFRoaXMgc2l0dWF0aW9uIGlzIG5vdCBjYXVzZWQKKwkgIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKworMjAwNy0wOS0yMiAxODoxNToxMiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIHBvLzogVXBkYXRlZCB0cmFuc2xhdGlvbnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogcG8vTElOR1VBUzoKKwkgICogcG8vbmwucG86CisJICBVcGRhdGVkIHRyYW5zbGF0aW9ucy4KKworMjAwNy0wOS0yMiAxODoxMzo1OCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIHBvL2V1LnBvOiBBZGRlZCBCYXNxdWUgdHJhbnNsYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHRyYW5zbGF0ZWQgYnk6IE1pa2VsIE9sYXNhZ2FzdGkgPGhleV9uZWtlbkBtdW5kdXJhdC5uZXQ+CisJICAqIHBvL2V1LnBvOgorCSAgQWRkZWQgQmFzcXVlIHRyYW5zbGF0aW9uLgorCisyMDA3LTA5LTIyIDE4OjEzOjEwICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgcG8vOiBBZGRlZCBDaGluZXNlICh0cmFkaXRpb25hbCBhbmQgSG9uZyBLb25nKSB0cmFuc2xhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdHJhbnNsYXRlZCBieTogQWJlbCBDaGV1bmcgPGFiZWxjaGV1bmdAZ21haWwuY29tPgorCSAgKiBwby96aF9ISy5wbzoKKwkgICogcG8vemhfVFcucG86CisJICBBZGRlZCBDaGluZXNlICh0cmFkaXRpb25hbCBhbmQgSG9uZyBLb25nKSB0cmFuc2xhdGlvbi4KKworMjAwNy0wOS0yMiAxODoxMDo0MiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIHBvL3BsLnBvOiBBZGRlZCBQb2xpc2ggdHJhbnNsYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHRyYW5zbGF0ZWQgYnk6IEpha3ViIEJvZ3VzeiA8cWJvb3NoQHBsZC1saW51eC5vcmc+CisJICAqIHBvL3BsLnBvOgorCSAgQWRkZWQgUG9saXNoIHRyYW5zbGF0aW9uLgorCisyMDA3LTA5LTIyIDE4OjA5OjU5ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgcG8vZmkucG86IEFkZGVkIEZpbm5pc2ggdHJhbnNsYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHRyYW5zbGF0ZWQgYnk6IElsa2thIFR1b2hlbGEgPGhpbGVAaWtpLmZpPgorCSAgKiBwby9maS5wbzoKKwkgIEFkZGVkIEZpbm5pc2ggdHJhbnNsYXRpb24uCisKKzIwMDctMDktMjIgMTg6MDk6MDkgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBwby9lcy5wbzogQWRkZWQgU3BhbmlzaCB0cmFuc2xhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdHJhbnNsYXRlZCBieTogSm9yZ2UgR29uesOhbGV6IEdvbnrDoWxleiA8YWxvcmllbEBnbWFpbC5jb20+CisJICAqIHBvL2VzLnBvOgorCSAgQWRkZWQgU3BhbmlzaCB0cmFuc2xhdGlvbi4KKworMjAwNy0wOS0yMiAxODowODoxMyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIHBvL2RhLnBvOiBBZGRlZCBEYW5pc2ggdHJhbnNsYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHRyYW5zbGF0ZWQgYnk6IE1vZ2VucyBKYWVnZXIgPG1vZ2Vuc0BqYWVnZXIudGY+CisJICAqIHBvL2RhLnBvOgorCSAgQWRkZWQgRGFuaXNoIHRyYW5zbGF0aW9uLgorCisyMDA3LTA5LTIyIDE4OjA2OjU1ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgcG8vemhfQ04ucG86IEFkZGVkIENoaW5lc2UgKHNpbXBsaWZpZWQpIHRyYW5zbGF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICB0cmFuc2xhdGVkIGJ5OiBGdW5kYSBXYW5nIDxmdW5kYXdhbmdAbGludXgubmV0LmNuPgorCSAgKiBwby96aF9DTi5wbzoKKwkgIEFkZGVkIENoaW5lc2UgKHNpbXBsaWZpZWQpIHRyYW5zbGF0aW9uLgorCisyMDA3LTA5LTIyIDE4OjA1OjM3ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgcG8vYmcucG86IEFkZGVkIEJ1bGdhcmlhbiB0cmFuc2xhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdHJhbnNsYXRlZCBieTogQWxleGFuZGVyIFNob3BvdiA8YXNoQGNvbnRhY3QuYmc+CisJICAqIHBvL2JnLnBvOgorCSAgQWRkZWQgQnVsZ2FyaWFuIHRyYW5zbGF0aW9uLgorCisyMDA3LTA5LTIyIDA4OjEyOjU3ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogY29tbW9uOgorCSogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmg6CisJICBmaXggaGVhZGVyIGFuZCBjb21tZW50cworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBmaXggaGVhZGVyIGFuZCBjb21tZW50cworCisyMDA3LTA5LTIxIDExOjM0OjM0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6IFNldCBvdXRnb2luZyBwYWNrZXQgZHVyYXRpb24gYmVjYXVzZSB3ZSBjYW4uIEZpeGVzICM0NzgyNDQgc29tZSBtb3JlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzogKGdzdF9ydHBfYW1yX2RlcGF5X3Byb2Nlc3MpOgorCSAgU2V0IG91dGdvaW5nIHBhY2tldCBkdXJhdGlvbiBiZWNhdXNlIHdlIGNhbi4gRml4ZXMgIzQ3ODI0NCBzb21lIG1vcmUuCisKKzIwMDctMDktMjAgMTM6MzU6MzQgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6IEFkZCBpbmZvIGFib3V0IHN0YXRpYyBsZWFrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOgorCSAgQWRkIGluZm8gYWJvdXQgc3RhdGljIGxlYWsuCisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9nZW5lcmljL3N0YXRlcy5jOgorCSAgSW1wcm92ZWQgc3RhdGUgY2hhbmdlIHVuaXQgdGVzdC4KKworMjAwNy0wOS0xOSAxODoxOTo0OSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBJZ25vcmUgcmVnaXN0cmllcyBpbiBhbnkgZm9ybWF0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9jaGVjay8uY3ZzaWdub3JlOgorCSAgSWdub3JlIHJlZ2lzdHJpZXMgaW4gYW55IGZvcm1hdC4KKworMjAwNy0wOS0xOSAxNjoyNDowOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzogUmVtb3ZlZCBzb21lIHVudXNlZCBjb2RlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6IChnc3RfcnRwX0wxNl9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICBSZW1vdmVkIHNvbWUgdW51c2VkIGNvZGUuCisJICAqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6IChnc3RfcnRwX2Ftcl9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICAqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6IChnc3RfcnRwX2dzbV9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydHBheS5jOiAoZ3N0X3J0cF9tcDJ0X3BheV9oYW5kbGVfYnVmZmVyKToKKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOiAoZ3N0X3J0cF9zcGVleF9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICAqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6IChnc3RfcnRwX3RoZW9yYV9wYXlfaW5pdF9wYWNrZXQpLAorCSAgKGdzdF9ydHBfdGhlb3JhX3BheV9mbHVzaF9wYWNrZXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOiAoZ3N0X3J0cF92b3JiaXNfcGF5X2ZsdXNoX3BhY2tldCk6CisJICBUcnkgdG8gcHJlc2VydmUgdGhlIGluY29tbWluZyBidWZmZXIgZHVyYXRpb24gb24gdGhlIG91dGdvaW5nCisJICBwYWNrZXRzLiBGaXhlcyAjNDc4MjQ0LgorCisyMDA3LTA5LTE5IDEwOjIyOjQwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvdGFnbGliLzogV29yayBhcm91bmQgY29tcGlsZXIgd2FybmluZ3Mgd2l0aCBnKystNC4yIHdoZW4gYXNzaWduaW5nIGEgc3RyaW5nIGNvbnN0YW50IHRvIGEgZ2NoYXIgKiAocGFydGlhbGx5IGZpeGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvdGFnbGliL2dzdGFwZXYybXV4LmNjOgorCSAgKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSAgV29yayBhcm91bmQgY29tcGlsZXIgd2FybmluZ3Mgd2l0aCBnKystNC4yIHdoZW4gYXNzaWduaW5nIGEKKwkgIHN0cmluZyBjb25zdGFudCB0byBhIGdjaGFyICogKHBhcnRpYWxseSBmaXhlcyAjNDc4MDkyKS4KKworMjAwNy0wOS0xOCAxNjo0NDo0NiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBXZSByZXF1aXJlIGNvcmUgQ1ZTIG5vdyBmb3IgZ3N0X2Jhc2Vfc3JjX3NldF9kb190aW1lc3RhbXAoKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBXZSByZXF1aXJlIGNvcmUgQ1ZTIG5vdyBmb3IgZ3N0X2Jhc2Vfc3JjX3NldF9kb190aW1lc3RhbXAoKS4KKworMjAwNy0wOS0xOCAxMzo1NTowNiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3Qvc3BlY3RydW0vOiBIYW5kbGluZyB3aW5kb3cgcmVzaXplLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOgorCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1vc3NzcmMuYzoKKwkgIEhhbmRsaW5nIHdpbmRvdyByZXNpemUuCisKKzIwMDctMDktMTggMTE6NDU6MDYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgQ2hhbmdlTG9nOiBBZGQgbWlzc2luZyBuZXdsaW5lLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIENoYW5nZUxvZzoKKwkgIEFkZCBtaXNzaW5nIG5ld2xpbmUuCisJICAqIGdzdC9saWJyZmIvcmZiZGVjb2Rlci5jOgorCSAgRml4IHRoZSBidWlsZCAobWlzc2luZyBzdGRsaWIuaCkuCisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uaDoKKwkgIFVzZSBiYXNldHJhbnNmb3JtIHNlZ21lbnQgc28gdGhhdCBpdCBpcyBjb3JyZWN0bHkgbWFuYWdlZCBvbiBmbHVzaGVzCisJICBhbmQgc3RhcnQvc3RvcC4gUmVwb3J0IG1lc3NhZ2UgdGltZXN0YW1wIGFzIHN0cmVhbSB0aW1lLCB3aGljaCBpcyB3aGF0CisJICBhbiBhcHBsaWNhdGlvbiBjYW4gdW5kZXJzdGFuZC4gKFllcyB0aGVzZSBhcmUgYWRhcHRlZCBmcm9tIHdpbSByZWNlbnQKKwkgIGxldmVsIGVsZW1lbnQgY2hhbmdlcykKKworMjAwNy0wOS0xNyAxNzozNToxMyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC86IEZpeCBjb21waWxlciB3YXJuaW5ncyBzaG93biB3aXRoIEZvcnRlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5jOiAoZ3N0X2F1ZGlvX2R5bmFtaWNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2NyZWF0ZV9zdHJlYW0pLAorCSAgKG5ld19zZXNzaW9uX3BhZCksIChyZXF1ZXN0X3B0X21hcCksIChnc3RfcnRzcHNyY19kb19zdHJlYW1fZW9zKSwKKwkgIChnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkKSwgKGdzdF9ydHNwc3JjX3BhcnNlX3J0cGluZm8pLAorCSAgKGdzdF9ydHNwc3JjX2hhbmRsZV9tZXNzYWdlKToKKwkgIEZpeCBjb21waWxlciB3YXJuaW5ncyBzaG93biB3aXRoIEZvcnRlLgorCisyMDA3LTA5LTE3IDAyOjA1OjE0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IEdpdmUgbWVhbmluZ2Z1bGwgZXJyb3Igd2hlbiBhbGwgc3RyZWFtcyBmYWlsZWQgdG8gY29uZmlndXJlIGZvciBzb21lIHJlYXNvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zZXR1cF9zdHJlYW1zKSwKKwkgIChnc3RfcnRzcHNyY19kdXBfcHJpbnRmKToKKwkgIEdpdmUgbWVhbmluZ2Z1bGwgZXJyb3Igd2hlbiBhbGwgc3RyZWFtcyBmYWlsZWQgdG8gY29uZmlndXJlIGZvciBzb21lCisJICByZWFzb24uCisKKzIwMDctMDktMTYgMTk6MTM6NTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvUkVBRE1FOiBVcGRhdGUgUkVBRE1FIHdpdGggdGhlIGRlc2lnbiBmb3Igc3luY2hyb25pc2F0aW9uIHJ1bGVzIG9mIFJUUCBvbiBzZW5kZXIgYW5kIHJlY2VpdmVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvUkVBRE1FOgorCSAgVXBkYXRlIFJFQURNRSB3aXRoIHRoZSBkZXNpZ24gZm9yIHN5bmNocm9uaXNhdGlvbiBydWxlcyBvZiBSVFAgb24KKwkgIHNlbmRlciBhbmQgcmVjZWl2ZXIuCisKKzIwMDctMDktMTQgMDk6NDA6NDkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IERvbid0IHB1c2ggRU9TIGZyb20gdGhlIGNoYWluIGZ1bmN0aW9uLCB0aGUgZWxlbWVudCBkcml2aW5nIHRoZSBwaXBlbGluZSBpcyByZXNwb25zaWJsZSBmLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfbG9vcCksCisJICAoZ3N0X3dhdnBhcnNlX2NoYWluKToKKwkgIERvbid0IHB1c2ggRU9TIGZyb20gdGhlIGNoYWluIGZ1bmN0aW9uLCB0aGUgZWxlbWVudAorCSAgZHJpdmluZyB0aGUgcGlwZWxpbmUgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMuIFRoZSBidWcKKwkgIHRoaXMgd2FzIG1lYW50IHRvIGZpeCBzZWVtcyB0byBiZSBxdWV1ZSBub3QgZm9yd2FyZGluZworCSAgRU9TIGluIGFsbCBjYXNlcyAoc2VlICM0NzY1MTQpLgorCisyMDA3LTA5LTEzIDE3OjMxOjE2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvbGV2ZWwvZ3N0bGV2ZWwuKjogVXNlIGJhc2V0cmFuc2Zvcm0gc2VnbWVudCBzbyB0aGF0IGl0IGlzIGNvcnJlY3RseSBtYW5hZ2VkIG9uIGZsdXNoZXMgYW5kIHN0YXJ0L3N0b3AuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6IChnc3RfbGV2ZWxfY2xhc3NfaW5pdCksIChnc3RfbGV2ZWxfc3RhcnQpLAorCSAgKGdzdF9sZXZlbF90cmFuc2Zvcm1faXApOgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuaDoKKwkgIFVzZSBiYXNldHJhbnNmb3JtIHNlZ21lbnQgc28gdGhhdCBpdCBpcyBjb3JyZWN0bHkgbWFuYWdlZCBvbiBmbHVzaGVzIGFuZAorCSAgc3RhcnQvc3RvcC4KKwkgIFJlcG9ydCBtZXNzYWdlIHRpbWVzdGFtcCBhcyBzdHJlYW0gdGltZSwgd2hpY2ggaXMgd2hhdCBhbiBhcHBsaWNhdGlvbgorCSAgY2FuIHVuZGVyc3RhbmQuCisKKzIwMDctMDktMTMgMTU6MDQ6MTUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgVXBkYXRlIG15IG1haWwgYWRkcmVzcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvdGFnbGliL2dzdGFwZXYybXV4LmNjOgorCSAgKiBleHQvdGFnbGliL2dzdGFwZXYybXV4Lmg6CisJICAqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4LmM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FwZXYybXV4LmM6CisJICBVcGRhdGUgbXkgbWFpbCBhZGRyZXNzLgorCisyMDA3LTA5LTEzIDEyOjM3OjU2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBBZGQgRU9TIGxvZ2ljIGZvciB0aGUgcHVzaC1iYXNlZCBtb2RlIHRvby4gRml4ZXMgIzQ3NjUxNC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9wZXJmb3JtX2VvcyksCisJICAoZ3N0X3dhdnBhcnNlX2xvb3ApLCAoZ3N0X3dhdnBhcnNlX2NoYWluKToKKwkgIEFkZCBFT1MgbG9naWMgZm9yIHRoZSBwdXNoLWJhc2VkIG1vZGUgdG9vLiBGaXhlcyAjNDc2NTE0LgorCisyMDA3LTA5LTEyIDIyOjAxOjU5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvbGF3LzogRml4IGxhdyBlbmNvZGVyIHRpbWVzdGFtcHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOiAoZ3N0X2FsYXdlbmNfaW5pdCksIChnc3RfYWxhd2VuY19jaGFpbik6CisJICAqIGdzdC9sYXcvYWxhdy1lbmNvZGUuaDoKKwkgICogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzogKGdzdF9tdWxhd2VuY19pbml0KSwKKwkgIChnc3RfbXVsYXdlbmNfY2hhaW4pOgorCSAgKiBnc3QvbGF3L211bGF3LWVuY29kZS5oOgorCSAgRml4IGxhdyBlbmNvZGVyIHRpbWVzdGFtcHMuCisKKzIwMDctMDktMTIgMDk6MTM6MzkgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZXh0L2djb25mL2dzdGdjb25mYXVkaW9zaW5rLmM6IEZpeCB3YXJuaW5nIHdoZW4gYnVpbGRpbmcgd2l0aG91dCBkZWJ1Zy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NpbmsuYzoKKwkgIEZpeCB3YXJuaW5nIHdoZW4gYnVpbGRpbmcgd2l0aG91dCBkZWJ1Zy4KKwkgICogc3lzL29zcy9nc3Rvc3NtaXhlcnRyYWNrLmM6CisJICBVc2UgY29uc3QgbGlrZSBpbiBhbHNhbWl4ZXJ0cmFjay5jIChmaXhlcyB3YXJuaW5ncykuCisKKzIwMDctMDktMTIgMDg6Mzg6MjEgKzAwMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJICBnc3QvOiBQcmludGYgZm9ybWF0IGZpeGVzICgjNDc2MTI4KS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFBldGVyIEtqZWxsZXJzdGVkdCAgPHBraiBhdCBheGlzIGNvbT4KKwkgICogZ3N0LWxpYnMvZ3N0L2FwcC9nc3RhcHBzaW5rLmM6CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkgICogZ3N0L3N3aXRjaC9nc3Rzd2l0Y2guYzoKKwkgIFByaW50ZiBmb3JtYXQgZml4ZXMgKCM0NzYxMjgpLgorCisyMDA3LTA5LTExIDE1OjM3OjU1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IEZpeCBmcmFtZXJhdGUgZGV0ZWN0aW9uIGNvZGUgc29tZSBtb3JlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIChnc3RfdjRsMnNyY19wcm9iZV9jYXBzX2Zvcl9mb3JtYXRfYW5kX3NpemUpOgorCSAgRml4IGZyYW1lcmF0ZSBkZXRlY3Rpb24gY29kZSBzb21lIG1vcmUuCisJICBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgYSB3ZWlyZCBzdGVwIGluIHRoZSBzdGVwd2lzZSBmcmFtZXJhdGVzLgorCSAgRG9uJ3Qgb3ZlcndyaXRlIHRoZSBtaW4gaW50ZXJ2YWwgd2l0aCB0aGUgZnJhbWVyYXRlLCB1c2UgYSB0ZW1wIHZhcmlhYmxlCisJICBpbnN0ZWFkLgorCSAgVXNlIG1heCBpbiB0aGUgQ29udGludW91cyBmcmFtZXJhdGUgaW50ZXJ2YWxzIGluc3RlYWQgb2Ygc3RlcCwgd2hpY2ggaXMKKwkgIDEgYWNjb3JkaW5nIHRvIHRoZSBkb2NzLiBGaXhlcyAjNDc1NDI0LgorCisyMDA3LTA5LTEwIDE5OjUzOjI4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdHVkcHNyYy5jOiBNYWtlIHVkcHNyYyB0aW1lc3RhbXAgb3V0Z29pbmcgYnVmZmVycyBiYXNlZCBvbiB3aGVuIHRoZXkgd2VyZSByZWNlaXZlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19pbml0KSwgKGdzdF91ZHBzcmNfY3JlYXRlKToKKwkgIE1ha2UgdWRwc3JjIHRpbWVzdGFtcCBvdXRnb2luZyBidWZmZXJzIGJhc2VkIG9uIHdoZW4gdGhleSB3ZXJlIHJlY2VpdmVkLgorCSAgQWxzbyBtYWtlIGl0IG91dHB1dCBhIHNlZ21lbnQgaW4gdGltZS4KKworMjAwNy0wOS0xMCAwNjo0OTozMiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IFBsdWcgYSBsaXR0bGUgbGVhay4gTGl0dGxlIGNvZGUgY2xlYW51cHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgUGx1ZyBhIGxpdHRsZSBsZWFrLiBMaXR0bGUgY29kZSBjbGVhbnVwcy4KKworMjAwNy0wOS0wOSAxODowODozNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBVc2UgQUNfVFJZX0NPTVBJTEUgaW5zdGVhZCBvZiBBQ19UUllfUlVOIHRvIGNoZWNrIGZvciBvbGQgZmxhYyB2ZXJzaW9ucywgJ3MgZ29vZCBmb3IgY3Jvc3MtY29tcGlsYXRpb24gLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgVXNlIEFDX1RSWV9DT01QSUxFIGluc3RlYWQgb2YgQUNfVFJZX1JVTiB0byBjaGVjayBmb3Igb2xkCisJICBmbGFjIHZlcnNpb25zLCAncyBnb29kIGZvciBjcm9zcy1jb21waWxhdGlvbiBrYXJtYS4KKworMjAwNy0wOS0wNyAxODowNDo0MSArMDAwMCAgSGFha29uIFNwb3JzaGVpbSA8aGFha29uLnNwb3JzaGVpbUB0YW5kYmVyZy5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOiBGaXggdXAgaGVhZGVyIHN0cnVjdHVyZSBzbyB0aGF0IGNvbXBpbGVycyBkb24ndCBhZGQgcGFkZGluZyBiZXR3ZWVuIHRoZSBzdHJ1Y3R1cmUgZmllbGRzLCBzaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSGFha29uIFNwb3JzaGVpbSAgPGhhYWtvbi5zcG9yc2hlaW0gYXQgdGFuZGJlcmcgY29tPgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgIEZpeCB1cCBoZWFkZXIgc3RydWN0dXJlIHNvIHRoYXQgY29tcGlsZXJzIGRvbid0IGFkZCBwYWRkaW5nCisJICBiZXR3ZWVuIHRoZSBzdHJ1Y3R1cmUgZmllbGRzLCBzaW5jZSB0aGF0IHdvdWxkIGxlYWQgdG8gdXMKKwkgIHNlbmRpbmcgUlRQIHBhY2tldHMgd2l0aCBicm9rZW4gaGVhZGVycyAoYXMgaXMgY3VycmVudGx5IHRoZQorCSAgY2FzZSB3aGVuIGNvbXBpbGluZyB3aXRoIE1TVkMpLiBBbHNvIHNlZSBzaW1pbGFyIGZpeGVzIGluCisJICBsaWJnc3RydHAgaW4gZ3N0LXBsdWdpbnMtYmFzZS4gKCM0NzQ2MTY7ICM0NzExOTQpCisKKzIwMDctMDktMDcgMTY6MDQ6MTQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogRG9uJ3Qgb3ZlcndyaXRlIG91ciBHVmFsdWUgd2l0aCAwIGJ1dCBpbnN0ZWFkIHVzZSB0aGUgcHJldmlvdXNseSBjb21wdXRlZCB2YWx1ZS4gRml4ZXMgIzQ3MS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIChnc3RfdjRsMnNyY19wcm9iZV9jYXBzX2Zvcl9mb3JtYXRfYW5kX3NpemUpOgorCSAgRG9uJ3Qgb3ZlcndyaXRlIG91ciBHVmFsdWUgd2l0aCAwIGJ1dCBpbnN0ZWFkIHVzZSB0aGUgcHJldmlvdXNseQorCSAgY29tcHV0ZWQgdmFsdWUuIEZpeGVzICM0NzE4MjMgc29tZSBtb3JlLgorCisyMDA3LTA5LTA3IDE1OjU0OjM4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiBVc2UgdGhlIGNvcnJlY3QgcGFyYW1ldGVyIG9yZGVyIGZvciB0aGUgbWVtc2V0IGNhbGxzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX3N0YXJ0KSwKKwkgIChnc3Rfc3BlY3RydW1fdHJhbnNmb3JtX2lwKToKKwkgIFVzZSB0aGUgY29ycmVjdCBwYXJhbWV0ZXIgb3JkZXIgZm9yIHRoZSBtZW1zZXQgY2FsbHMuCisJICBUaGFua3MgdG8gQ2hyaXN0aWFuIFNjaGFsbGVyIGZvciBub3RpY2luZy4KKworMjAwNy0wOS0wNiAxMjowMDozNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6IE5vIHRhYnMgaW4gdGhpcyBmaWxlIHBsZWFzZSwgb3IgZ3RrLWRvYyB3aWxsIGVuZCB1cCBkb2N1bWVudGluZyByYXRoLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICBObyB0YWJzIGluIHRoaXMgZmlsZSBwbGVhc2UsIG9yIGd0ay1kb2Mgd2lsbCBlbmQgdXAgZG9jdW1lbnRpbmcKKwkgIHJhdGhlciBhYnN1cmQgY2xhc3MgaGllcmFyY2hpZXMuCisKKzIwMDctMDktMDYgMTA6NDg6NTYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9nY29uZi9nc3Rzd2l0Y2hzaW5rLmM6IElmIHRoZSBuZXcga2lkIGVsZW1lbnQgZmFpbHMgdG8gY2hhbmdlIHN0YXRlIGZvciBzb21lIHJlYXNvbiBmb3J3YXJkIHRoZSBlcnJvciBtZXNzYWdlIGl0IC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nY29uZi9nc3Rzd2l0Y2hzaW5rLmM6CisJICBJZiB0aGUgbmV3IGtpZCBlbGVtZW50IGZhaWxzIHRvIGNoYW5nZSBzdGF0ZSBmb3Igc29tZSByZWFzb24KKwkgIChlLmcuIGVzZHNpbmsgbm90IGJlaW5nIGFibGUgdG8gY29ubmVjdCB0byB0aGUgc291bmQgc2VydmVyKSwKKwkgIGZvcndhcmQgdGhlIGVycm9yIG1lc3NhZ2UgaXQgcG9zdGVkIG9uIHRoZSBidXMgaW5zdGVhZCBvZiBqdXN0CisJICBwb3N0aW5nIGEgZ2VuZXJpYyAnSW50ZXJuYWwgc3RhdGUgY2hhbmdlIGVycm9yOiBwbGVhc2UgZmlsZSBhCisJICBidWcnIGVycm9yIG1lc3NhZ2UuIEZpeGVzICM0NzEzNjQuCisKKzIwMDctMDktMDYgMDc6MjE6MjIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgUG9ydCBHc3RTcGVjdHJ1bSB0byBHc3RBdWRpb0ZpbHRlciBhbmQgbGliZ3N0ZmZ0LCBhZGQgc3VwcG9ydCBmb3IgaW50MzIsIGZsb2F0IGFuZCBkb3VibGUsIHVzZSBmbG9hdHMgZm9yIHRoZSBtZXNzYWdlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3Qvc3BlY3RydW0vTWFrZWZpbGUuYW06CisJICAqIGdzdC9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOiAoZHJhd19zcGVjdHJ1bSksCisJICAobWVzc2FnZV9oYW5kbGVyKSwgKG1haW4pOgorCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1vc3NzcmMuYzogKGRyYXdfc3BlY3RydW0pLCAobWVzc2FnZV9oYW5kbGVyKToKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IChnc3Rfc3BlY3RydW1fYmFzZV9pbml0KSwKKwkgIChnc3Rfc3BlY3RydW1fY2xhc3NfaW5pdCksIChnc3Rfc3BlY3RydW1faW5pdCksCisJICAoZ3N0X3NwZWN0cnVtX2Rpc3Bvc2UpLCAoZ3N0X3NwZWN0cnVtX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3NwZWN0cnVtX2dldF9wcm9wZXJ0eSksIChnc3Rfc3BlY3RydW1fc3RhcnQpLAorCSAgKGdzdF9zcGVjdHJ1bV9zZXR1cCksIChnc3Rfc3BlY3RydW1fbWVzc2FnZV9uZXcpLAorCSAgKGdzdF9zcGVjdHJ1bV90cmFuc2Zvcm1faXApOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uaDoKKwkgIFBvcnQgR3N0U3BlY3RydW0gdG8gR3N0QXVkaW9GaWx0ZXIgYW5kIGxpYmdzdGZmdCwgYWRkIHN1cHBvcnQKKwkgIGZvciBpbnQzMiwgZmxvYXQgYW5kIGRvdWJsZSwgdXNlIGZsb2F0cyBmb3IgdGhlIG1lc3NhZ2UgY29udGVudHMsCisJICBhdmVyYWdlIGFsbCBGRlRzIGRvbmUgaW4gb25lIGludGVydmFsIGZvciBiZXR0ZXIgcmVzdWx0cywgdXNlCisJICBhIGJldHRlciB3aW5kb3dpbmcgZnVuY3Rpb24sIGFsbG93IHBvc3RpbmcgdGhlIHBoYXNlIGluIHRoZSBtZXNzYWdlCisJICBhbmQgYWN0dWFsbHkgZG8gYW4gRkZUIHdpdGggdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgYmFuZHMgaW5zdGVhZAorCSAgb2YgaW50ZXJwb2xhdGluZy4KKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvc3BlY3RydW0uYzogKEdTVF9TVEFSVF9URVNUKSwKKwkgIChzcGVjdHJ1bV9zdWl0ZSk6CisJICBJbXByb3ZlIHRoZSB1bml0cyB0ZXN0cyBieSBjaGVja2luZyBmb3IgYSAxMTAyNUh6IHNpbmUgd2F2ZQorCSAgYW5kIGFkZCB1bml0IHRlc3RzIGZvciBhbGwgNCBzdXBwb3J0ZWQgc2FtcGxlIHR5cGVzLgorCisyMDA3LTA5LTA1IDE2OjIzOjIxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvcXRkZW11eC86IERvbid0IGFzc3VtZSB0YWdzIGFyZSBlbmNvZGVkIGFzIFVURi04ICgjNDczNjcwKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgRG9uJ3QgYXNzdW1lIHRhZ3MgYXJlIGVuY29kZWQgYXMgVVRGLTggKCM0NzM2NzApLgorCisyMDA3LTA5LTA1IDE0OjQzOjE2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvdjRsMi86IEltcGxlbWVudCBMQVRFTkNZIHF1ZXJpZXMgaW4gdGhlIGNydWRlc3Qgd2F5IHBvc3NpYmxlIHNvIEkgZG9uJ3QgaGF2ZSB0byB1c2Ugc3luYz1mYWxzZSBhbnkgbG9uZ2VyIHdoZW4gdGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSAgSW1wbGVtZW50IExBVEVOQ1kgcXVlcmllcyBpbiB0aGUgY3J1ZGVzdCB3YXkgcG9zc2libGUgc28gSSBkb24ndAorCSAgaGF2ZSB0byB1c2Ugc3luYz1mYWxzZSBhbnkgbG9uZ2VyIHdoZW4gdGVzdGluZyB3aXRoIHZpZGVvc2lua3MuCisKKzIwMDctMDktMDUgMDk6MjU6MjMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogRml4IGJ1aWxkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEZpeCBidWlsZC4KKworMjAwNy0wOS0wNSAwMDoxMjo0NiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiBBZGQgc29tZSBtb3JlIGRlYnVnZ2luZyBpbiB0aGUgZnJhbWVyYXRlIGZ1bmN0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIChnc3RfdjRsMnNyY19wcm9iZV9jYXBzX2Zvcl9mb3JtYXRfYW5kX3NpemUpOgorCSAgQWRkIHNvbWUgbW9yZSBkZWJ1Z2dpbmcgaW4gdGhlIGZyYW1lcmF0ZSBmdW5jdGlvbi4KKwkgIEl0ZXJhdGUgc3RlcHdpc2UgZnJhbWVyYXRlIHVwIHRvIGFuZCBfaW5jbHVkaW5nXyB0aGUgbWF4IGFuZCBpZiBub3RoaW5nCisJICB3YXMgYWRkZWQgdG8gdGhlIGxpc3QsIGFkZCBhIGR1bW15IDAvMSB0byAxMDAvMSBmcmFtZXJhdGUgc28gdGhhdCB3ZQorCSAgZG9uJ3QgZW5kIHVwIHdpdGggYW4gZW1wdHkgbGlzdC4KKworMjAwNy0wOS0wNCAyMjo0MjoyMSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogQWRkIHByb3BlcnR5IGRvIGNvbmZpZ3VyZSBkZXN0aW5hdGlvbiBhZGRyZXNzL3BvcnQgcGFpcnMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19jbGFzc19pbml0KSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX3NldF9jbGllbnRzX3N0cmluZyksCisJICAoZ3N0X211bHRpdWRwc2lua19nZXRfY2xpZW50c19zdHJpbmcpLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX2luaXRfc2VuZCksIChnc3RfbXVsdGl1ZHBzaW5rX2FkZF9pbnRlcm5hbCksCisJICAoZ3N0X211bHRpdWRwc2lua19hZGQpLCAoZ3N0X211bHRpdWRwc2lua19jbGVhcl9pbnRlcm5hbCksCisJICAoZ3N0X211bHRpdWRwc2lua19jbGVhcik6CisJICBBZGQgcHJvcGVydHkgZG8gY29uZmlndXJlIGRlc3RpbmF0aW9uIGFkZHJlc3MvcG9ydCBwYWlycworCSAgQVBJOkdzdE11bHRpVURQU2luazo6Y2xpZW50cworCisyMDA3LTA5LTA0IDE4OjMwOjIyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICB0ZXN0cy9leGFtcGxlcy86IEFkZGVkIHNvbWUgUlRQIGV4YW1wbGUgc2NyaXB0cyBmb3Igc2VuZGluZyBhbmQgcmVjZWl2aW5nIFJUUCBzdHJlYW1zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2V4YW1wbGVzL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9ydHAvTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3AtQU1SLnNoOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLVBDTUEuc2RwOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLVBDTUEuc2g6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2NC1QQ01BLnNkcDoKKwkgICogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LVBDTUEuc2g6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtUENNQS5zaDoKKwkgICogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1WVFMtSDI2M3AtQVRTLVBDTUEuc2g6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLnNoOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXY0bDItSDI2M3AtYWxzYXNyYy1BTVIuc2g6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItdjRsMi1IMjY0LWFsc2FzcmMtUENNQS5zaDoKKwkgIEFkZGVkIHNvbWUgUlRQIGV4YW1wbGUgc2NyaXB0cyBmb3Igc2VuZGluZyBhbmQgcmVjZWl2aW5nIFJUUCBzdHJlYW1zLgorCisyMDA3LTA5LTA0IDE2OjQwOjA1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IFJlc3RydWN0dXJlIHRoZSBzZXRjYXBzIGZ1bmN0aW9uIHNvIHRoYXQgd2UgY2FuIGFsc28gY29tcHV0ZSB0aGUgZXhwZWN0ZWQgR1N0cmVhbWVyIG91dHB1dCBzaXouLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMl9nZXRfY2Fwc19pbmZvKSwKKwkgIChnc3RfdjRsMnNyY19zZXRfY2FwcyksIChnc3RfdjRsMnNyY19nZXRfbW1hcCk6CisJICBSZXN0cnVjdHVyZSB0aGUgc2V0Y2FwcyBmdW5jdGlvbiBzbyB0aGF0IHdlIGNhbiBhbHNvIGNvbXB1dGUgdGhlCisJICBleHBlY3RlZCBHU3RyZWFtZXIgb3V0cHV0IHNpemUgb2YgdGhlIHZpZGVvIGZyYW1lcy4KKwkgIFNldCBmcmFtZV9ieXRlX3NpemUgY29ycmVjdGx5IHNvIHRoYXQgcmVhZC1iYXNlZCBkZXZpY2VzIGhhdmUgYSBjaGFuY2UKKwkgIG9mIHdvcmtpbmcgY29ycmVjdGx5LgorCSAgV2hlbiBncmFiYmluZyBhIGZyYW1lLCBkaXNjYXJkIGZyYW1lcyB0aGF0IGFyZSBub3Qgb2YgdGhlIGV4cGVjdGVkIHNpemUuCisJICBTb21lIGNhbWVyYXMgZG9uJ3Qgb3V0cHV0IHRoZSByaWdodCBmcmFtZXNpemUgZm9yIHRoZSBmaXJzdCBidWZmZXIuCisJICBUcnkgb25seSBhIGNvdXBsZSBvZiB0aW1lcyB0byBnZXQgYSB2YWxpZCBmcmFtZSwgZWxzZSBlcnJvciBvdXQuCisJICAqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzogKGdzdF92NGwyX2dldF9jYXBhYmlsaXRpZXMpLAorCSAgKGdzdF92NGwyX2ZpbGxfbGlzdHMpLCAoZ3N0X3Y0bDJfZ2V0X2lucHV0KToKKwkgIEFkZCBzb21lIG1vcmUgZGVidWcgaW5mbyB3aGVuIHNjYW5uaW5nIHRoZSBkZXZpY2UuCisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyX2J1ZmZlcl9uZXcpLAorCSAgKGdzdF92NGwyX2J1ZmZlcl9wb29sX25ldyksIChnc3RfdjRsMl9idWZmZXJfcG9vbF9hY3RpdmF0ZSksCisJICAoZ3N0X3Y0bDJzcmNfZmlsbF9mb3JtYXRfbGlzdCksIChnc3RfdjRsMnNyY19ncmFiX2ZyYW1lKSwKKwkgIChnc3RfdjRsMnNyY19zZXRfY2FwdHVyZSksIChnc3RfdjRsMnNyY19jYXB0dXJlX2luaXQpOgorCSAgQWRkIHNvbWUgbW9yZSBkZWJ1ZyBpbmZvIHdoZW4gZGVxdWVpbmcgYSBmcmFtZS4KKworMjAwNy0wOS0wNCAxNDozNzoyMiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogTW9yZSBjb2RlIGNsZWFudXBzLiBBZGQgc29tZSBtb3JlIGNvbW1lbnQgYW5kIGltcHJvdmUgZGVidWdzIGxvZ3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBNb3JlIGNvZGUgY2xlYW51cHMuIEFkZCBzb21lIG1vcmUgY29tbWVudCBhbmQgaW1wcm92ZSBkZWJ1Z3MgbG9ncy4KKworMjAwNy0wOS0wNCAwNzo1ODozNiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuKjogSW1wbGVtZW50IHNlZWstcXVlcnkuIFJlZmFjdG9yIGR1cmF0aW9uIGNhbGN1bGF0aW9ucy4gQXBwcm9wcmlhdGUgdXNlIG9mIHVpbnQ2NF9zY2FsZV9pbnQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICBJbXBsZW1lbnQgc2Vlay1xdWVyeS4gUmVmYWN0b3IgZHVyYXRpb24gY2FsY3VsYXRpb25zLiBBcHByb3ByaWF0ZSB1c2UKKwkgIG9mIHVpbnQ2NF9zY2FsZV9pbnQgYW5kIHVpbnQ2NF9zY2FsZS4gTW92ZSByZXBlYWRlZGx5IGNhbGN1bGF0ZWQgc3R1ZmYKKwkgIG91dCBvZiBsb29wcy4KKworMjAwNy0wOS0wMyAwNzo0NDozNCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IEltcGxlbWVudCBzZWVrLXF1ZXJ5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIEltcGxlbWVudCBzZWVrLXF1ZXJ5LgorCisyMDA3LTA4LTI5IDIxOjQzOjA4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IFVzZSBuZXcgYmFzZXNpbmsgYXN5bmMgcHJvcGVydHkgdG8gbWFrZSBzcGFyc2UgUlRDUCBwYWNrZXQgbm90IHdhaXQgZm9yIHByZXJvbGwuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV91ZHBfc2luayksCisJICAoZ3N0X3J0c3BzcmNfZHVwX3ByaW50Zik6CisJICBVc2UgbmV3IGJhc2VzaW5rIGFzeW5jIHByb3BlcnR5IHRvIG1ha2Ugc3BhcnNlIFJUQ1AgcGFja2V0IG5vdCB3YWl0IGZvcgorCSAgcHJlcm9sbC4KKworMjAwNy0wOC0yNyAxNDo0NDoxOSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC9hdWRpb2Z4L01ha2VmaWxlLmFtOiBEaXN0IHRoZSByaWdodCBmaWxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdWRpb2Z4L01ha2VmaWxlLmFtOgorCSAgRGlzdCB0aGUgcmlnaHQgZmlsZS4KKworMjAwNy0wOC0yMyAxNjoyNzozNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBNYWtlIHN1cmUgd2UgZ2VuZXJhdGUgYW5kIHBhcnNlIGZsb2F0aW5nIHBvaW50IHZhbHVlcyBpbiB0aGUgUE9TSVggbG9jYWxlIGluc3RlYWQgb2YgdGhlIGN1cnJlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfZHVwX3ByaW50ZiksCisJICAoZ3N0X3J0c3BzcmNfZ2V0X2Zsb2F0KSwgKGdzdF9ydHNwc3JjX3BsYXkpOgorCSAgTWFrZSBzdXJlIHdlIGdlbmVyYXRlIGFuZCBwYXJzZSBmbG9hdGluZyBwb2ludCB2YWx1ZXMgaW4gdGhlIFBPU0lYCisJICBsb2NhbGUgaW5zdGVhZCBvZiB0aGUgY3VycmVudCBsb2NhbGUuCisKKzIwMDctMDgtMjIgMTU6MDE6MjkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuKjogRml4IG1ldGhvZCBkZXRlY3Rpb24gYWdhaW4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfZG9fc2VlayksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfbWV0aG9kcyksIChnc3RfcnRzcHNyY19vcGVuKSwKKwkgIChnc3RfcnRzcHNyY19wbGF5KToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgRml4IG1ldGhvZCBkZXRlY3Rpb24gYWdhaW4uCisJICBLZWVwIHRyYWNrIG9mIHdoZW4gd2UgbXVzdCBzZW5kIGEgUmFuZ2UgaGVhZGVyLgorCSAgVXNlIHNlZ21lbnQgdmFsdWVzIGZvciBSYW5nZSwgU3BlZWQgYW5kIFNjYWxlIGhlYWRlcnMuCisJICBQYXJzZSBTcGVlZCBhbmQgU2NhbGUgaGVhZGVycyB0byB1cGRhdGUgdGhlIHNlZ21lbnQgdmFsdWVzLgorCisyMDA3LTA4LTIyIDA4OjIyOjUwICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorCisJICBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IEhhbmRsZSBvcHRpb25hbCB2NGwyIGlvY3RscyBncmFjZWZ1bGx5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBwYXRjaCBieTogTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3QHNreW5ldC5iZT4KKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSAgSGFuZGxlIG9wdGlvbmFsIHY0bDIgaW9jdGxzIGdyYWNlZnVsbHkuCisKKzIwMDctMDgtMjAgMTY6NTI6MDMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvOiBBZGRlZCBhbiBIMjYzIGRlcGF5bG9hZGVyLiBGaXhlcyAjMzY5MzkyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHAvZ3N0cnRwLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6IChnc3RfcnRwX2gyNjNfZGVwYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX2gyNjNfZGVwYXlfY2xhc3NfaW5pdCksIChnc3RfcnRwX2gyNjNfZGVwYXlfaW5pdCksCisJICAoZ3N0X3J0cF9oMjYzX2RlcGF5X2ZpbmFsaXplKSwgKGdzdF9ydHBfaDI2M19kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX2gyNjNfZGVwYXlfcHJvY2VzcyksIChnc3RfcnRwX2gyNjNfZGVwYXlfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX2gyNjNfZGVwYXlfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX2gyNjNfZGVwYXlfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcnRwX2gyNjNfZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5oOgorCSAgQWRkZWQgYW4gSDI2MyBkZXBheWxvYWRlci4gRml4ZXMgIzM2OTM5Mi4KKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6IChnc3RfcnRwX2gyNjNwX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfaDI2M3BfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzogKGdzdF9mcmFnbWVudGF0aW9uX21vZGVfZ2V0X3R5cGUpLAorCSAgKGdzdF9ydHBfaDI2M3BfcGF5X2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9oMjYzcF9wYXlfZmx1c2gpOgorCSAgTWFrZSB0aGUgSDI2MysgcGF5L2RlcGF5bG9hZGVyIHN1cHBvcnQgSDI2My0xOTk4IGFuZCBIMjYzLTIwMDAKKwkgIHBheWxvYWRzLgorCSAgQWxzbyBhbG93IHBsYWluIEgyNjMgb24gdGhlIGgyNjNwIHBheWxvYWRlcnMuIEZpeGVzICM0NjUwNDAuCisKKzIwMDctMDgtMTkgMTk6MTY6MzMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ZpbHRlci86IEFkZCBzbWFsbCBjb21wYXJpc2lvbiB3aXRoIHRoZSBjaGVieXNoZXYgZmlsdGVycyBpbiB0aGUgZG9jcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYzoKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6CisJICBBZGQgc21hbGwgY29tcGFyaXNpb24gd2l0aCB0aGUgY2hlYnlzaGV2IGZpbHRlcnMgaW4gdGhlIGRvY3MuCisKKzIwMDctMDgtMTkgMTk6MTE6MDQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2F1ZGlvZngvOiBBZGQgc21hbGwgY29tcGFyaXNpb24gd2l0aCB0aGUgd2luZG93ZWQgc2luYyBmaWx0ZXJzIGluIHRoZSBkb2NzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYnlzaGV2ZnJlcWJhbmQuYzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9jaGVieXNoZXZmcmVxbGltaXQuYzoKKwkgIEFkZCBzbWFsbCBjb21wYXJpc2lvbiB3aXRoIHRoZSB3aW5kb3dlZCBzaW5jIGZpbHRlcnMgaW4gdGhlIGRvY3MuCisKKzIwMDctMDgtMTkgMTk6MDE6NDUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvOiBBbHNvIHRlc3QgZXZlcnl0aGluZyBpbiAzMiBiaXQgZmxvYXQgbW9kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9icHdzaW5jLmM6IChHU1RfU1RBUlRfVEVTVCksCisJICAoYnB3c2luY19zdWl0ZSk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xwd3NpbmMuYzogKEdTVF9TVEFSVF9URVNUKSwKKwkgIChscHdzaW5jX3N1aXRlKToKKwkgIEFsc28gdGVzdCBldmVyeXRoaW5nIGluIDMyIGJpdCBmbG9hdCBtb2RlLgorCisyMDA3LTA4LTE5IDE4OjQ3OjE5ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHRlc3RzL2NoZWNrL2VsZW1lbnRzLzogQWxzbyB0ZXN0IDMyIGJpdCBmbG9hdCBtb2RlIGFuZCB0aGUgdHlwZSAyIHZhcmlhbnRzIG9mIHRoZSBmaWx0ZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYnlzaGV2ZnJlcWJhbmQuYzogKEdTVF9TVEFSVF9URVNUKSwKKwkgIChhdWRpb2NoZWJ5c2hldmZyZXFiYW5kX3N1aXRlKToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9jaGVieXNoZXZmcmVxbGltaXQuYzogKEdTVF9TVEFSVF9URVNUKSwKKwkgIChhdWRpb2NoZWJ5c2hldmZyZXFsaW1pdF9zdWl0ZSk6CisJICBBbHNvIHRlc3QgMzIgYml0IGZsb2F0IG1vZGUgYW5kIHRoZSB0eXBlIDIgdmFyaWFudHMgb2YgdGhlIGZpbHRlcnMuCisKKzIwMDctMDgtMTggMTk6NDQ6NTUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogUmVmYWN0b3IgdGhlIHVkcCBhbmQgaW50ZXJsZWF2ZWQgbG9vcCBmdW5jdGlvbiBhIGJpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkKSwKKwkgIChnc3RfcnRzcHNyY19sb29wX3VkcCksIChnc3RfcnRzcHNyY19sb29wX3NlbmRfY21kKSwKKwkgIChnc3RfcnRzcHNyY19sb29wKToKKwkgIFJlZmFjdG9yIHRoZSB1ZHAgYW5kIGludGVybGVhdmVkIGxvb3AgZnVuY3Rpb24gYSBiaXQuCisKKzIwMDctMDgtMTcgMTc6MDg6MTEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuKjogUHJvdGVjdCBjb25uZWN0aW9uIGFjdGl2aXR5IHdpdGggYSBuZXcgbG9jaywgYXZvaWRzIGRlYWRsb2NrcyB3aGVuIGdvaW5nIHRvIFBBVVNFRC4gRml4ZXMgIzQ1NS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2luaXQpLAorCSAgKGdzdF9ydHNwc3JjX2ZpbmFsaXplKSwgKGdzdF9ydHNwc3JjX2Nvbm5lY3Rpb25fc2VuZCksCisJICAoZ3N0X3J0c3BzcmNfY29ubmVjdGlvbl9yZWNlaXZlKSwgKGdzdF9ydHNwc3JjX3NpbmtfY2hhaW4pLAorCSAgKGdzdF9ydHNwc3JjX2hhbmRsZV9yZXF1ZXN0KSwgKGdzdF9ydHNwc3JjX3NlbmRfa2VlcF9hbGl2ZSksCisJICAoZ3N0X3J0c3BzcmNfbG9vcF9pbnRlcmxlYXZlZCksIChnc3RfcnRzcHNyY19sb29wX3VkcCksCisJICAoZ3N0X3J0c3BzcmNfdHJ5X3NlbmQpLCAoZ3N0X3J0c3BzcmNfcGF1c2UpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBQcm90ZWN0IGNvbm5lY3Rpb24gYWN0aXZpdHkgd2l0aCBhIG5ldyBsb2NrLCBhdm9pZHMgZGVhZGxvY2tzIHdoZW4gZ29pbmcKKwkgIHRvIFBBVVNFRC4gRml4ZXMgIzQ1NTgwOC4KKworMjAwNy0wOC0xNyAxNTozMDozOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2RlYnVnL3JuZGJ1ZmZlcnNpemUuYzogRml4IGRlYnVnIHN0YXRlbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVidWcvcm5kYnVmZmVyc2l6ZS5jOiAoZ3N0X3JuZF9idWZmZXJfc2l6ZV9sb29wKToKKwkgIEZpeCBkZWJ1ZyBzdGF0ZW1lbnQuCisKKzIwMDctMDgtMTcgMTU6Mjg6NDAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogRml4IHN0cmF5ICV1IGluIGRlYnVnIGxpbmUgYXMgc3BvdHRlZCBieSBTYXVyIG9uIElSQy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19kb19zdHJlYW1fZW9zKToKKwkgIEZpeCBzdHJheSAldSBpbiBkZWJ1ZyBsaW5lIGFzIHNwb3R0ZWQgYnkgU2F1ciBvbiBJUkMuCisKKzIwMDctMDgtMTcgMTU6MDU6MTcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgVXNlIGdlbmVyYXRvciBtYWNyb3MgZm9yIHRoZSBwcm9jZXNzIGZ1bmN0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCBzYW1wbGUgdHlwZXMsIGFkZCBsb3dlciB1cHBlciBib3VuZGFyaWVzIGZvciB0aGUgR09iLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ZpbHRlci9nc3RicHdzaW5jLmM6IChnc3RfYnB3c2luY19jbGFzc19pbml0KSwKKwkgIChicHdzaW5jX3NldF9wcm9wZXJ0eSksIChicHdzaW5jX2dldF9wcm9wZXJ0eSk6CisJICAqIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5oOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKGdzdF9scHdzaW5jX2NsYXNzX2luaXQpLAorCSAgKGdzdF9scHdzaW5jX2luaXQpLCAobHB3c2luY19idWlsZF9rZXJuZWwpLCAobHB3c2luY19zZXRfcHJvcGVydHkpLAorCSAgKGxwd3NpbmNfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmg6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xwd3NpbmMuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIFVzZSBnZW5lcmF0b3IgbWFjcm9zIGZvciB0aGUgcHJvY2VzcyBmdW5jdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQKKwkgIHNhbXBsZSB0eXBlcywgYWRkIGxvd2VyIHVwcGVyIGJvdW5kYXJpZXMgZm9yIHRoZSBHT2JqZWN0IHByb3BlcnRpZXMKKwkgIHNvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIFVJcyBjYW4gdXNlIHNsaWRlcnMgYW5kIGNoYW5nZSBmcmVxdWVuY3kKKwkgIHByb3BlcnRpZXMgdG8gZmxvYXRzIHRvIHNhdmUgYSBiaXQgb2YgbWVtb3J5LCBldmVuIGludHMgd291bGQgaW4KKwkgIHRoZW9yeSBiZSBlbm91Z2guIEFsc28gcmVuYW1lIGZyZXF1ZW5jeSB0byBjdXRvZmYgZm9yIGNvbnNpc3RlbmN5CisJICByZWFzb25zLgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLnNpZ25hbHM6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkgIFJlZ2VuZXJhdGVkIGZvciB0aGUgYWJvdmUgY2hhbmdlcy4KKworMjAwNy0wOC0xNyAxNDo0MzozMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvYXVkaW9meC86IFVzZSBnZW5lcmF0b3IgbWFjcm9zIGZvciB0aGUgcHJvY2VzcyBmdW5jdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQgc2FtcGxlIHR5cGVzLCBhZGQgbG93ZXIgdXBwZXIgYm91bmRhcmkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJ5c2hldmZyZXFiYW5kLmM6CisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2JhbmRfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYnlzaGV2ZnJlcWxpbWl0LmM6CisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2xpbWl0X2NsYXNzX2luaXQpOgorCSAgVXNlIGdlbmVyYXRvciBtYWNyb3MgZm9yIHRoZSBwcm9jZXNzIGZ1bmN0aW9ucyBmb3IgdGhlIGRpZmZlcmVudAorCSAgc2FtcGxlIHR5cGVzLCBhZGQgbG93ZXIgdXBwZXIgYm91bmRhcmllcyBmb3IgdGhlIEdPYmplY3QgcHJvcGVydGllcworCSAgc28gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgVUlzIGNhbiB1c2Ugc2xpZGVycyBhbmQgYWRkIGEgbm90ZSBhYm91dAorCSAgdGhlIG51bWJlciBvZiBwb2xlcyBhcyBhIHRvbyBoaWdoIG51bWJlciBvZiBwb2xlcyBjb21iaW5lZCB3aXRoCisJICB2ZXJ5IGxvdyBvciB2ZXJ5IGhpZ2ggZnJlcXVlbmNpZXMgd2lsbCBwcm9kdWNlIG9ubHkgbm9pc2UuCisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgIFJlZ2VuZXJhdGVkIGZvciB0aGUgcHJvcGVydHkgY2hhbmdlcy4KKworMjAwNy0wOC0xNyAxNDoxNToxOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy4qOiBJbXByb3ZlIHRpbWVvdXQgaGFuZGxpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRzcHNyY19mbHVzaCksIChnc3RfcnRzcHNyY19zaW5rX2NoYWluKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3VkcF9zaW5rKSwKKwkgIChnc3RfcnRzcHNyY19zZW5kX2tlZXBfYWxpdmUpLCAoZ3N0X3J0c3BzcmNfbG9vcF9pbnRlcmxlYXZlZCksCisJICAoZ3N0X3J0c3BzcmNfbG9vcF91ZHApLCAoZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCksCisJICAoZ3N0X3J0c3BzcmNfdHJ5X3NlbmQpLCAoZ3N0X3J0c3BzcmNfc2VuZCksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfbWV0aG9kcyksIChnc3RfcnRzcHNyY19wYXJzZV9yYW5nZSksCisJICAoZ3N0X3J0c3BzcmNfb3BlbiksIChnc3RfcnRzcHNyY19jbG9zZSksIChnc3RfcnRzcHNyY19wYXVzZSksCisJICAoZ3N0X3J0c3BzcmNfaGFuZGxlX21lc3NhZ2UpLCAoZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgSW1wcm92ZSB0aW1lb3V0IGhhbmRsaW5nLgorCSAgVXNlIHRoZSBzYW1lIHNvY2tldCBmb3Igc2VuZGluZyBhbmQgcmVjZWl2aW5nIFJUQ1AgcGFja2V0cyBzbyB0aGF0IHNvbWUKKwkgIHNlcnZlcnMgY2FuIHRyYWNrIGNsaWVudHMgYmV0dGVyLgorCSAgSW1wcm92ZSBjb25uZWN0aW9uIGNsb3NlZCBoYW5kbGluZy4gVHJ5IHRvIHJlY29ubmVjdC4KKwkgIERvbid0IG92ZXJ3cml0ZSBvdXIgY29udGVudCBiYXNlIHdpdGggTlVMTC4KKwkgIEltcHJvdmUgZGVidWdnaW5nLgorCSAgSW1wcm92ZSByYW5nZSBwYXJzaW5nIGFuZCBoYW5kbGluZy4KKwkgIFJlbW92ZSBmbHVzaGluZyBoYWNrIG5vdyB0aGF0IGNvcmUgZG9lcyB0aGUgcmlnaHQgdGhpbmcuCisKKzIwMDctMDgtMTcgMTM6NTk6MTUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLio6IEFkZCBzdXBwb3J0IGZvciBnZXR0aW5nIGFuZCBzZXR0aW5nIHRoZSBzb2NrZXQgdG8gdXNlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChnc3RfbXVsdGl1ZHBzaW5rX2NsYXNzX2luaXQpLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfaW5pdCksIChnc3RfbXVsdGl1ZHBzaW5rX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X211bHRpdWRwc2lua19nZXRfcHJvcGVydHkpLCAoZ3N0X211bHRpdWRwc2lua19pbml0X3NlbmQpLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfY2xvc2UpLCAoZ3N0X211bHRpdWRwc2lua19hZGQpOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSAgQWRkIHN1cHBvcnQgZm9yIGdldHRpbmcgYW5kIHNldHRpbmcgdGhlIHNvY2tldCB0byB1c2UuCisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3VkcHNyY19pbml0KSwKKwkgIChnc3RfdWRwc3JjX2NyZWF0ZSksIChnc3RfdWRwc3JjX2dldF9wcm9wZXJ0eSk6CisJICBBZGQgc3VwcG9ydCBmb3IgZ2V0dGluZyB0aGUgY3VycmVudGx5IHVzZWQgc29ja2V0LgorCisyMDA3LTA4LTE2IDE5OjIyOjQ4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy4qOiBJbXBsZW1lbnQgbGF0ZW5jeSBxdWVyeSBhbmQgb25seSBmb3J3YXJkIHRob3NlIHNhbXBsZXMgZG93bnN0cmVhbSB0aGF0IGFjdHVhbGx5IGNvbnRhaW4gdGhlIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5jOiAoZ3N0X2Jwd3NpbmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X2Jwd3NpbmNfaW5pdCksIChwcm9jZXNzXzMyKSwgKHByb2Nlc3NfNjQpLAorCSAgKGJwd3NpbmNfYnVpbGRfa2VybmVsKSwgKGJwd3NpbmNfcHVzaF9yZXNpZHVlKSwKKwkgIChicHdzaW5jX3RyYW5zZm9ybSksIChicHdzaW5jX3N0YXJ0KSwgKGJwd3NpbmNfcXVlcnkpLAorCSAgKGJwd3NpbmNfcXVlcnlfdHlwZSksIChicHdzaW5jX2V2ZW50KSwgKGJwd3NpbmNfc2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2ZpbHRlci9nc3RicHdzaW5jLmg6CisJICBJbXBsZW1lbnQgbGF0ZW5jeSBxdWVyeSBhbmQgb25seSBmb3J3YXJkIHRob3NlIHNhbXBsZXMgZG93bnN0cmVhbQorCSAgdGhhdCBhY3R1YWxseSBjb250YWluIHRoZSBkYXRhIHdlIHdhbnQsIGkuZS4gZHJvcCBrZXJuZWxfbGVuZ3RoLzIKKwkgIGluIHRoZSBiZWdpbm5pbmcgYW5kIGFwcGVuZCBrZXJuZWxfbGVuZ3RoLzIgKGNyZWF0ZWQgYnkgY29udm9sdmluZworCSAgdGhlIGZpbHRlciBrZXJuZWwgd2l0aCB6ZXJvZXMpIHRvIHRoZSBlbmQuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2Jwd3NpbmMuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIEFkanVzdCB0aGUgdW5pdCB0ZXN0IGZvciB0aGlzIHNsaWdodGx5IGNoYW5nZWQgYmVoYXZpb3VyLgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKGxwd3NpbmNfYnVpbGRfa2VybmVsKToKKwkgIFJlc2V0IHJlc2lkdWUgbGVuZ3RoIG9ubHkgd2hlbiBhY3R1YWxseSBjcmVhdGluZyBhIHJlc2lkdWUuCisKKzIwMDctMDgtMTYgMTc6MDI6MDcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2F1ZGlvZngvOiBBZGQgQ2hlYnlzaGV2IGxvd3Bhc3MvaGlnaHBhc3MgYW5kIGJhbmRwYXNzL2JhbmRyZWplY3QgZWxlbWVudHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJldmlld2VkIGJ5OiBTdGVmYW4gS29zdCAgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCSAgKiBnc3QvYXVkaW9meC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9jaGVieXNoZXZmcmVxYmFuZC5jOgorCSAgKGdzdF9hdWRpb19jaGVieXNoZXZfZnJlcV9iYW5kX21vZGVfZ2V0X3R5cGUpLAorCSAgKGdzdF9hdWRpb19jaGVieXNoZXZfZnJlcV9iYW5kX2Jhc2VfaW5pdCksCisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2JhbmRfZGlzcG9zZSksCisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2JhbmRfY2xhc3NfaW5pdCksCisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2JhbmRfaW5pdCksCisJICAoZ2VuZXJhdGVfYmlxdWFkX2NvZWZmaWNpZW50cyksIChjYWxjdWxhdGVfZ2FpbiksCisJICAoZ2VuZXJhdGVfY29lZmZpY2llbnRzKSwKKwkgIChnc3RfYXVkaW9fY2hlYnlzaGV2X2ZyZXFfYmFuZF9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdWRpb19jaGVieXNoZXZfZnJlcV9iYW5kX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2JhbmRfc2V0dXApLCAocHJvY2VzcyksIChwcm9jZXNzXzY0KSwKKwkgIChwcm9jZXNzXzMyKSwgKGdzdF9hdWRpb19jaGVieXNoZXZfZnJlcV9iYW5kX3RyYW5zZm9ybV9pcCksCisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2JhbmRfc3RhcnQpOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJ5c2hldmZyZXFiYW5kLmg6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYnlzaGV2ZnJlcWxpbWl0LmM6CisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2xpbWl0X21vZGVfZ2V0X3R5cGUpLAorCSAgKGdzdF9hdWRpb19jaGVieXNoZXZfZnJlcV9saW1pdF9iYXNlX2luaXQpLAorCSAgKGdzdF9hdWRpb19jaGVieXNoZXZfZnJlcV9saW1pdF9kaXNwb3NlKSwKKwkgIChnc3RfYXVkaW9fY2hlYnlzaGV2X2ZyZXFfbGltaXRfY2xhc3NfaW5pdCksCisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2xpbWl0X2luaXQpLAorCSAgKGdlbmVyYXRlX2JpcXVhZF9jb2VmZmljaWVudHMpLCAoY2FsY3VsYXRlX2dhaW4pLAorCSAgKGdlbmVyYXRlX2NvZWZmaWNpZW50cyksCisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2xpbWl0X3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2xpbWl0X2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2xpbWl0X3NldHVwKSwgKHByb2Nlc3MpLCAocHJvY2Vzc182NCksCisJICAocHJvY2Vzc18zMiksIChnc3RfYXVkaW9fY2hlYnlzaGV2X2ZyZXFfbGltaXRfdHJhbnNmb3JtX2lwKSwKKwkgIChnc3RfYXVkaW9fY2hlYnlzaGV2X2ZyZXFfbGltaXRfc3RhcnQpOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJ5c2hldmZyZXFsaW1pdC5oOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2Z4LmM6IChwbHVnaW5faW5pdCk6CisJICBBZGQgQ2hlYnlzaGV2IGxvd3Bhc3MvaGlnaHBhc3MgYW5kIGJhbmRwYXNzL2JhbmRyZWplY3QgZWxlbWVudHMuCisJICBGaXhlcyAjNDY0ODAwLgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9jaGVieXNoZXZmcmVxYmFuZC5jOgorCSAgKHNldHVwX2F1ZGlvY2hlYnlzaGV2ZnJlcWJhbmQpLCAoY2xlYW51cF9hdWRpb2NoZWJ5c2hldmZyZXFiYW5kKSwKKwkgIChHU1RfU1RBUlRfVEVTVCksIChhdWRpb2NoZWJ5c2hldmZyZXFiYW5kX3N1aXRlKSwgKG1haW4pOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2NoZWJ5c2hldmZyZXFsaW1pdC5jOgorCSAgKHNldHVwX2F1ZGlvY2hlYnlzaGV2ZnJlcWxpbWl0KSwgKGNsZWFudXBfYXVkaW9jaGVieXNoZXZmcmVxbGltaXQpLAorCSAgKEdTVF9TVEFSVF9URVNUKSwgKGF1ZGlvY2hlYnlzaGV2ZnJlcWxpbWl0X3N1aXRlKSwgKG1haW4pOgorCSAgQWRkIHVuaXQgdGVzdHMgZm9yIHRoZSBjaGVieXNoZXYgZmlsdGVycy4KKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSAgQW5kIGFkZCBkb2NzIGZvciB0aGUgY2hlYnlzaGV2IGZpbHRlcnMuIFdoaWxlIGRvaW5nCisJICB0aGF0IGFsc28gcnVuIG1ha2UgdXBkYXRlIGluIGRvY3MvcGx1Z2lucy4KKworMjAwNy0wOC0xNiAxMjoxNTowNiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBNYWtlIHJvIG1lbW9yeSB0byBzaGFyZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1sdGFnLmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJICBNYWtlIHJvIG1lbW9yeSB0byBzaGFyZS4KKworMjAwNy0wOC0xNiAxMTo0OTowMSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3VkcC9nc3R1ZHBzcmMuYzogSW1wcm92ZSBVRFAgcGVyZm9ybWFuY2UgYnkgYXZvaWRpbmcgYSBzZWxlY3QoKSB3aGVuIHdlIGhhdmUgZGF0YSBhdmFpbGFibGUgaW1tZWRpYXRseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19jcmVhdGUpOgorCSAgSW1wcm92ZSBVRFAgcGVyZm9ybWFuY2UgYnkgYXZvaWRpbmcgYSBzZWxlY3QoKSB3aGVuIHdlIGhhdmUgZGF0YQorCSAgYXZhaWxhYmxlIGltbWVkaWF0bHkuCisKKzIwMDctMDgtMTYgMTE6NDc6MTkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0cGRlYy4qOiBBZGQgKGR1bW15KSBTU1JDIG1hbmFnZW1lbnQgc2lnbmFscy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuYzogKGdzdF9ydHBfZGVjX21hcnNoYWxfVk9JRF9fVUlOVF9VSU5UKSwKKwkgIChnc3RfcnRwX2RlY19jbGFzc19pbml0KToKKwkgICogZ3N0L3J0c3AvZ3N0cnRwZGVjLmg6CisJICBBZGQgKGR1bW15KSBTU1JDIG1hbmFnZW1lbnQgc2lnbmFscy4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0c3BzcmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9ydHNwc3JjX2dldF9wcm9wZXJ0eSksCisJICAoZmluZF9zdHJlYW0pLCAoZ3N0X3J0c3BzcmNfY3JlYXRlX3N0cmVhbSksIChuZXdfc2Vzc2lvbl9wYWQpLAorCSAgKHJlcXVlc3RfcHRfbWFwKSwgKGdzdF9ydHNwc3JjX2RvX3N0cmVhbV9lb3MpLCAob25fYnllX3NzcmMpLAorCSAgKG9uX3RpbWVvdXQpLCAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV9tYW5hZ2VyKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fcHVzaF9ldmVudCksIChnc3RfcnRzcHNyY19wdXNoX2V2ZW50KSwKKwkgIChnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkKSwgKGdzdF9ydHNwc3JjX3BhcnNlX3J0cGluZm8pLAorCSAgKGdzdF9ydHNwc3JjX2hhbmRsZV9tZXNzYWdlKSwgKGdzdF9ydHNwc3JjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIEFkZCBjb25uZWN0aW9uLXNwZWVkIHByb3BlcnR5LgorCSAgQWRkIGZpbmRfc3RyZWFtIGhlbHBlciBmdW5jdGlvbnMuCisJICBIYW5kbGUgc3RyZWFtIEVPUyBiYXNlZCBvbiBCWUUgbWVzc2FnZXMgb3IgU1NSQyB0aW1lb3V0LgorCSAgUmV0dXJucyBTVUNDRVNTIGZyb20gdGhlIHN0YXRlIGNoYW5nZSBmdW5jdGlvbiBhcyB3ZSBoaWRlIG91ciBhc3luYworCSAgZWxlbWVudHMgZnJvbSB0aGUgcGFyZW50LgorCisyMDA3LTA4LTE2IDA5OjQ4OjI3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy4qOiBJbXBsZW1lbnQgbGF0ZW5jeSBxdWVyeSBhbmQgb25seSBmb3J3YXJkIHRob3NlIHNhbXBsZXMgZG93bnN0cmVhbSB0aGF0IGFjdHVhbGx5IGNvbnRhaW4gdGhlIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy5jOiAoZ3N0X2xwd3NpbmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X2xwd3NpbmNfaW5pdCksIChwcm9jZXNzXzMyKSwgKHByb2Nlc3NfNjQpLAorCSAgKGxwd3NpbmNfYnVpbGRfa2VybmVsKSwgKGxwd3NpbmNfcHVzaF9yZXNpZHVlKSwKKwkgIChscHdzaW5jX3RyYW5zZm9ybSksIChscHdzaW5jX3N0YXJ0KSwgKGxwd3NpbmNfcXVlcnkpLAorCSAgKGxwd3NpbmNfcXVlcnlfdHlwZSksIChscHdzaW5jX2V2ZW50KSwgKGxwd3NpbmNfc2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmg6CisJICBJbXBsZW1lbnQgbGF0ZW5jeSBxdWVyeSBhbmQgb25seSBmb3J3YXJkIHRob3NlIHNhbXBsZXMgZG93bnN0cmVhbQorCSAgdGhhdCBhY3R1YWxseSBjb250YWluIHRoZSBkYXRhIHdlIHdhbnQsIGkuZS4gZHJvcCBrZXJuZWxfbGVuZ3RoLzIKKwkgIGluIHRoZSBiZWdpbm5pbmcgYW5kIGFwcGVuZCBrZXJuZWxfbGVuZ3RoLzIgKGNyZWF0ZWQgYnkgY29udm9sdmluZworCSAgdGhlIGZpbHRlciBrZXJuZWwgd2l0aCB6ZXJvZXMpIHRvIHRoZSBlbmQuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xwd3NpbmMuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIEFkanVzdCB0aGUgdW5pdCB0ZXN0IGZvciB0aGlzIHNsaWdodGx5IGNoYW5nZWQgYmVoYXZpb3VyLgorCisyMDA3LTA4LTE2IDA3OjQwOjQ4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9kZWJ1Zy9ybmRidWZmZXJzaXplLmM6IEZpeCBkYSBsZWFrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWJ1Zy9ybmRidWZmZXJzaXplLmM6CisJICBGaXggZGEgbGVhay4KKworMjAwNy0wOC0xNCAxMzo1MDo0MyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvZGVidWcvOiBBZGQgbmV3IHRlc3QgZWxlbWVudCBhbmQgY2xlYW4tdXAgdGhlIG90aGVycyBhIGxpdHRsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVidWcvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWJ1Zy9icmVha215ZGF0YS5jOgorCSAgKiBnc3QvZGVidWcvZ3N0ZGVidWcuYzoKKwkgICogZ3N0L2RlYnVnL25lZ290aWF0aW9uLmM6CisJICAqIGdzdC9kZWJ1Zy9wcm9ncmVzc3JlcG9ydC5jOgorCSAgKiBnc3QvZGVidWcvcm5kYnVmZmVyc2l6ZS5jOgorCSAgKiBnc3QvZGVidWcvdGVzdHBsdWdpbi5jOgorCSAgQWRkIG5ldyB0ZXN0IGVsZW1lbnQgYW5kIGNsZWFuLXVwIHRoZSBvdGhlcnMgYSBsaXR0bGUuCisKKzIwMDctMDgtMTMgMTM6NTA6MzkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgQWRkIGRvY3MgZm9yIGxwd3NpbmMgYW5kIGJwd3NpbmMgYW5kIGludGVncmF0ZSB0aGVtIGludG8gdGhlIGJ1aWxkIHN5c3RlbS4gV2hpbGUgZG9pbmcgdGhhdCBhbHNvIHVwZGF0ZSBhbGwgb3RoZXIgZG9jLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLnNpZ25hbHM6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1iejIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2R4YXBhcnNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0c2RlYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mYWFjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZhYWQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmlsdGVyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZyZWV6ZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc20ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oMjY0cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9kcGx1Zy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tcGVnMmVuYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdXNlcGFjay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdXNpY2JyYWluei54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uc2ZkZWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VuZHRvdWNoLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwY2RlYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVlZC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10dGEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9zaWduYWwueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGluZ2hlYWRlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14dmlkLnhtbDoKKwkgICogZ3N0L2ZpbHRlci9nc3RicHdzaW5jLmM6CisJICAqIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5oOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzoKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmg6CisJICBBZGQgZG9jcyBmb3IgbHB3c2luYyBhbmQgYnB3c2luYyBhbmQgaW50ZWdyYXRlIHRoZW0KKwkgIGludG8gdGhlIGJ1aWxkIHN5c3RlbS4gV2hpbGUgZG9pbmcgdGhhdCBhbHNvIHVwZGF0ZQorCSAgYWxsIG90aGVyIGRvY3MgdmlhIG1ha2UgdXBkYXRlIGluIGRvY3MvcGx1Z2lucy4KKworMjAwNy0wOC0xMiAyMDo1NTowMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9icHdzaW5jLmM6IE1ha2Ugb25lIHRlc3QgY29uc3RyYWludCBhIGJpdCBzdHJpY3Rlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9icHdzaW5jLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICBNYWtlIG9uZSB0ZXN0IGNvbnN0cmFpbnQgYSBiaXQgc3RyaWN0ZXIuCisKKzIwMDctMDgtMTIgMjA6NTM6MTEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgdGVzdHMvY2hlY2svOiBBZGQgdW5pdCB0ZXN0cyBmb3IgYnB3c2luYywgdGVzdGluZyBmdW5kYW1lbnRhbCBmdW5jdGlvbmFsaXR5IGFnYWluLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9icHdzaW5jLmM6IChzZXR1cF9icHdzaW5jKSwKKwkgIChjbGVhbnVwX2Jwd3NpbmMpLCAoR1NUX1NUQVJUX1RFU1QpLCAoYnB3c2luY19zdWl0ZSksIChtYWluKToKKwkgIEFkZCB1bml0IHRlc3RzIGZvciBicHdzaW5jLCB0ZXN0aW5nIGZ1bmRhbWVudGFsIGZ1bmN0aW9uYWxpdHkgYWdhaW4uCisKKzIwMDctMDgtMTIgMjA6MTk6MzcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgdGVzdHMvY2hlY2svOiBBZGQgdW5pdCB0ZXN0cyBmb3IgbHB3c2luYywgdGVzdGluZyBmdW5kYW1lbnRhbCBmdW5jdGlvbmFsaXR5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9scHdzaW5jLmM6IChzZXR1cF9scHdzaW5jKSwKKwkgIChjbGVhbnVwX2xwd3NpbmMpLCAoR1NUX1NUQVJUX1RFU1QpLCAobHB3c2luY19zdWl0ZSksIChtYWluKToKKwkgIEFkZCB1bml0IHRlc3RzIGZvciBscHdzaW5jLCB0ZXN0aW5nIGZ1bmRhbWVudGFsIGZ1bmN0aW9uYWxpdHkuCisKKzIwMDctMDgtMTIgMTU6NDE6NTcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ZpbHRlci86IEltcHJvdmUgZGVidWdnaW5nIGEgYml0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5jOiAoYnB3c2luY19idWlsZF9rZXJuZWwpOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKGxwd3NpbmNfYnVpbGRfa2VybmVsKToKKwkgIEltcHJvdmUgZGVidWdnaW5nIGEgYml0LgorCisyMDA3LTA4LTEyIDE0OjM1OjQxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEZpeCBwYXJzaW5nIG9mIG1wNGEgdmVyc2lvbiAwIGF0b21zLiBGaXhlcyAjNDY1Nzc0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2Vfbm9kZSk6CisJICBGaXggcGFyc2luZyBvZiBtcDRhIHZlcnNpb24gMCBhdG9tcy4gRml4ZXMgIzQ2NTc3NC4KKworMjAwNy0wOC0xMiAxMjo0NjoyMCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZmlsdGVyLzogUmVzZXQgdGhlIHJlc2lkdWUgaW4gQmFzZVRyYW5zZm9ybTo6c3RhcnQgdG8gZ2V0IGEgY2xlYW4gcmVzaWR1ZSBvbiBzdHJlYW0gY2hhbmdlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYzogKGdzdF9icHdzaW5jX2NsYXNzX2luaXQpLAorCSAgKGJwd3NpbmNfc3RhcnQpOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKGdzdF9scHdzaW5jX2NsYXNzX2luaXQpLAorCSAgKGxwd3NpbmNfc3RhcnQpOgorCSAgUmVzZXQgdGhlIHJlc2lkdWUgaW4gQmFzZVRyYW5zZm9ybTo6c3RhcnQgdG8gZ2V0IGEgY2xlYW4gcmVzaWR1ZQorCSAgb24gc3RyZWFtIGNoYW5nZXMuCisKKzIwMDctMDgtMTEgMTU6NTg6MzAgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ZpbHRlci86IEZpeCBwcm9jZXNzaW5nIHdpdGggYnVmZmVyIHNpemVzIHRoYXQgYXJlIGxhcmdlciB0aGFuIHRoZSBmaWx0ZXIga2VybmVsIHNpemUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ZpbHRlci9nc3RicHdzaW5jLmM6IChwcm9jZXNzXzMyKSwgKHByb2Nlc3NfNjQpOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKHByb2Nlc3NfMzIpLCAocHJvY2Vzc182NCk6CisJICBGaXggcHJvY2Vzc2luZyB3aXRoIGJ1ZmZlciBzaXplcyB0aGF0IGFyZSBsYXJnZXIgdGhhbiB0aGUgZmlsdGVyCisJICBrZXJuZWwgc2l6ZS4KKworMjAwNy0wOC0xMCAxNzowODowMSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jOiBJbmNsdWRlIHN0ZGxpYi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jOgorCSAgSW5jbHVkZSBzdGRsaWIuCisKKzIwMDctMDgtMTAgMTY6MTA6NDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzogU2V0IHRoZSBtcGVndmVyc2lvbiBpbiB0aGUgY2FwcyBzbyB0aGF0IGF1dG9wbHVnZ2luZyBkb2VzIG5vdCBnZXQgY29uZnVzZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jOgorCSAgU2V0IHRoZSBtcGVndmVyc2lvbiBpbiB0aGUgY2FwcyBzbyB0aGF0IGF1dG9wbHVnZ2luZyBkb2VzIG5vdCBnZXQKKwkgIGNvbmZ1c2VkLgorCisyMDA3LTA4LTEwIDA1OjUxOjQwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5jOiBGaXggYSBzZWdmYXVsdCB3aXRoIG1vcmUgdGhhbiBvbmUgY2hhbm5lbCBhbmQgZG9uJ3QgcmVidWlsZCB0aGUga2VybmVsICYgcmVzaWR1ZSB3aXRoIGV2ZXJ5IC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5jOiAoYnB3c2luY19idWlsZF9rZXJuZWwpOgorCSAgRml4IGEgc2VnZmF1bHQgd2l0aCBtb3JlIHRoYW4gb25lIGNoYW5uZWwgYW5kIGRvbid0IHJlYnVpbGQKKwkgIHRoZSBrZXJuZWwgJiByZXNpZHVlIHdpdGggZXZlcnkgYnVmZmVyLgorCisyMDA3LTA4LTEwIDA1OjM1OjI1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy4qOiBBZGQgc3VwcG9ydCBmb3IgYSBiYW5kcmVqZWN0IG1vZGUgYW5kIGFsbG93IHNwZWNpZnlpbmcgdGhlIHdpbmRvdyBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSB1c2VkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5jOiAoZ3N0X2Jwd3NpbmNfbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X2Jwd3NpbmNfd2luZG93X2dldF90eXBlKSwgKGdzdF9icHdzaW5jX2NsYXNzX2luaXQpLAorCSAgKGdzdF9icHdzaW5jX2luaXQpLCAoYnB3c2luY19idWlsZF9rZXJuZWwpLCAoYnB3c2luY19zZXRfcHJvcGVydHkpLAorCSAgKGJwd3NpbmNfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2ZpbHRlci9nc3RicHdzaW5jLmg6CisJICBBZGQgc3VwcG9ydCBmb3IgYSBiYW5kcmVqZWN0IG1vZGUgYW5kIGFsbG93IHNwZWNpZnlpbmcgdGhlIHdpbmRvdworCSAgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgdXNlZC4KKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6CisJICBBbmQgYW5vdGhlciBzbWFsbCBmb3JtYXR0aW5nIGZpeC4KKworMjAwNy0wOC0xMCAwNToyMDowNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuKjogQXBwbHkgdGhlIHNhbWUgY2hhbmdlcyB0byB0aGUgYmFuZHBhc3MgZmlsdGVyOgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5jOiAoZ3N0X2Jwd3NpbmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X2Jwd3NpbmNfaW5pdCksIChwcm9jZXNzXzMyKSwgKHByb2Nlc3NfNjQpLAorCSAgKGJwd3NpbmNfYnVpbGRfa2VybmVsKSwgKGJwd3NpbmNfc2V0dXApLCAoYnB3c2luY19nZXRfdW5pdF9zaXplKSwKKwkgIChicHdzaW5jX3RyYW5zZm9ybSksIChicHdzaW5jX3NldF9wcm9wZXJ0eSksCisJICAoYnB3c2luY19nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuaDoKKwkgIEFwcGx5IHRoZSBzYW1lIGNoYW5nZXMgdG8gdGhlIGJhbmRwYXNzIGZpbHRlcjoKKwkgIC0gU3VwcG9ydCBkb3VibGUgaW5wdXQKKwkgIC0gRml4IHByb2Nlc3NpbmcgZm9yIGlucHV0IHdpdGggPjEgY2hhbm5lbHMKKwkgIC0gU3BlY2lmeSBmcmVxdWVuY3kgaW4gSHoKKwkgIC0gU3BlY2lmeSBhY3R1YWwgZmlsdGVyIGtlcm5lbCBsZW5ndGgKKwkgIC0gVXNlIHRyYW5zZm9ybSBpbnN0ZWFkIG9mIHRyYW5zZm9ybV9pcCBhcyB3ZSdyZSB3b3JraW5nCisJICBvdXQgb2YgcGxhY2UgYW55d2F5CisJICAtIEZhY3RvciBvdXQgZmlsdGVyIGtlcm5lbCBnZW5lcmF0aW9uIGFuZCB1cGRhdGUgdGhlIGZpbHRlcgorCSAga2VybmVsIHdoZW4gdGhlIHByb3BlcnRpZXMgYXJlIHNldAorCSAgRml4IGJhbmRwYXNzIGZpbHRlciBrZXJuZWwgZ2VuZXJhdGlvbiB0byBhY3R1YWxseSBnZW5lcmF0ZQorCSAgYSBiYW5kcGFzcyBmaWx0ZXIgYnkgY3JlYXRpbmcgYSBoaWdocGFzcyBpbnN0ZWFkIG9mIGEgc2Vjb25kCisJICBsb3dwYXNzLgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKGdzdF9scHdzaW5jX2NsYXNzX2luaXQpOgorCSAgU21hbGwgZm9ybWF0dGluZyBmaXguCisKKzIwMDctMDgtMTAgMDQ6NDQ6NDMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ZpbHRlci9nc3RscHdzaW5jLio6IFNwZWNpZnkgdGhlIGFjdHVhbCBmaWx0ZXIgbGVuZ3RoIGluc3RlYWQgb2YgYSB3ZWlyZCAyTisxLiBTZXR0aW5nIHRoZSBwcm9wZXJ0eSB3aWxsIHJvdW5kIHRvLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6IChnc3RfbHB3c2luY19jbGFzc19pbml0KSwKKwkgIChnc3RfbHB3c2luY19pbml0KSwgKHByb2Nlc3NfMzIpLCAocHJvY2Vzc182NCksCisJICAobHB3c2luY19idWlsZF9rZXJuZWwpLCAobHB3c2luY19zZXRfcHJvcGVydHkpLAorCSAgKGxwd3NpbmNfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmg6CisJICBTcGVjaWZ5IHRoZSBhY3R1YWwgZmlsdGVyIGxlbmd0aCBpbnN0ZWFkIG9mIGEgd2VpcmQKKwkgIDJOKzEuIFNldHRpbmcgdGhlIHByb3BlcnR5IHdpbGwgcm91bmQgdG8gdGhlIG5leHQgb2RkIG51bWJlci4KKwkgIEFsc28gcmVtb3ZlIG5vdyBvYnNvbGV0ZSBGSVhNRXMuCisKKzIwMDctMDgtMTAgMDQ6MzI6NDcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ZpbHRlci9nc3RscHdzaW5jLio6IEFsbG93IGNob29zaW5nIGJldHdlZW4gaGFtbWluZyBhbmQgYmxhY2ttYW4gd2luZG93LiBUaGUgYmxhY2ttYW4gd2luZG93IHByb3ZpZGVzIGEgYmV0dGVyIHN0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6IChnc3RfbHB3c2luY193aW5kb3dfZ2V0X3R5cGUpLAorCSAgKGdzdF9scHdzaW5jX2NsYXNzX2luaXQpLCAoZ3N0X2xwd3NpbmNfaW5pdCksCisJICAobHB3c2luY19idWlsZF9rZXJuZWwpLCAobHB3c2luY19zZXRfcHJvcGVydHkpLAorCSAgKGxwd3NpbmNfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmg6CisJICBBbGxvdyBjaG9vc2luZyBiZXR3ZWVuIGhhbW1pbmcgYW5kIGJsYWNrbWFuIHdpbmRvdy4gVGhlIGJsYWNrbWFuCisJICB3aW5kb3cgcHJvdmlkZXMgYSBiZXR0ZXIgc3RvcGJhbmQgYXR0ZW51YXRpb24gYnV0IGEgYml0IHNsb3dlcgorCSAgcm9sbG9mZi4KKworMjAwNy0wOC0xMCAwNDoyMTozOSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuKjogQWRkIGEgaGlnaHBhc3MgbW9kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKGdzdF9scHdzaW5jX21vZGVfZ2V0X3R5cGUpLAorCSAgKGdzdF9scHdzaW5jX2NsYXNzX2luaXQpLCAocHJvY2Vzc18zMiksIChwcm9jZXNzXzY0KSwKKwkgIChscHdzaW5jX2J1aWxkX2tlcm5lbCksIChscHdzaW5jX3NldF9wcm9wZXJ0eSksCisJICAobHB3c2luY19nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuaDoKKwkgIEFkZCBhIGhpZ2hwYXNzIG1vZGUuCisKKzIwMDctMDgtMTAgMDQ6MDY6NTMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6IEZpeCBwcm9jZXNzaW5nIGlmIHRoZSBpbnB1dCBoYXMgbW9yZSB0aGFuIG9uZSBjaGFubmVsLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy5jOiAocHJvY2Vzc18zMiksIChwcm9jZXNzXzY0KSwKKwkgIChscHdzaW5jX2J1aWxkX2tlcm5lbCk6CisJICBGaXggcHJvY2Vzc2luZyBpZiB0aGUgaW5wdXQgaGFzIG1vcmUgdGhhbiBvbmUgY2hhbm5lbC4KKworMjAwNy0wOC0wOSAxOToyMzozMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYzogInRoaXMiIGlzIGEgQysrIGtleXdvcmQsIHVzZSAic2VsZiIgaW5zdGVhZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYzogKGdzdF9icHdzaW5jX2Rpc3Bvc2UpLAorCSAgKGdzdF9icHdzaW5jX2luaXQpLCAoYnB3c2luY19zZXR1cCksIChicHdzaW5jX3RyYW5zZm9ybV9pcCksCisJICAoYnB3c2luY19zZXRfcHJvcGVydHkpLCAoYnB3c2luY19nZXRfcHJvcGVydHkpOgorCSAgInRoaXMiIGlzIGEgQysrIGtleXdvcmQsIHVzZSAic2VsZiIgaW5zdGVhZC4KKwkgIEFkZCBUT0RPcyBhbmQgRklYTUVzIGFuZCByZW1vdmUgdHdvIHdyb25nIEZJWE1Fcy4KKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6CisJICBBZGQgRklYTUVzIGFuZCBhIG5ldyBUT0RPLgorCisyMDA3LTA4LTA5IDE4OjA4OjA1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy4qOiBBZGQgZG91YmxlIHN1cHBvcnQsIHJlcGxhY2UgInRoaXMiIHdpdGggInNlbGYiIGFzIHRoZSBmb3JtZXIgaXMgYSBDKysga2V5d29yZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKGdzdF9scHdzaW5jX2Rpc3Bvc2UpLAorCSAgKGdzdF9scHdzaW5jX2NsYXNzX2luaXQpLCAoZ3N0X2xwd3NpbmNfaW5pdCksIChwcm9jZXNzXzMyKSwKKwkgIChwcm9jZXNzXzY0KSwgKGxwd3NpbmNfYnVpbGRfa2VybmVsKSwgKGxwd3NpbmNfc2V0dXApLAorCSAgKGxwd3NpbmNfZ2V0X3VuaXRfc2l6ZSksIChscHdzaW5jX3RyYW5zZm9ybSksCisJICAobHB3c2luY19zZXRfcHJvcGVydHkpLCAobHB3c2luY19nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuaDoKKwkgIEFkZCBkb3VibGUgc3VwcG9ydCwgcmVwbGFjZSAidGhpcyIgd2l0aCAic2VsZiIgYXMgdGhlIGZvcm1lcgorCSAgaXMgYSBDKysga2V5d29yZC4KKwkgIEltcGxlbWVudCB0aGUgZnJlcXVlbmN5IHByb3BlcnR5IGluIEh6IGluc3RlYWQgb2YgZnJhY3Rpb24KKwkgIG9mIHNhbXBsaW5nIGZyZXF1ZW5jeS4KKwkgIFJlbW92ZSBzb21lIHVuZWNlc3NhcnkgRklYTUVzIGFuZCBhZGQgc29tZSBUT0RPcywgYWRkIHNvbWUKKwkgIHJlcXVpcmVkIGxvY2tpbmcgYW5kIHJlZmFjdG9yIHRoZSBrZXJuZWwgZ2VuZXJhdGlvbiBpbnRvIGEKKwkgIHNlcGFyYXRlIGZ1bmN0aW9uIHRoYXQgaXMgYWxzbyBjYWxsZWQgd2hlbiB0aGUgcHJvcGVydGllcworCSAgY2hhbmdlIG5vdy4KKwkgIEFuZCB1c2UgQmFzZVRyYW5zZm9ybTo6dHJhbnNmb3JtIGluc3RlYWQgb2YgdHJhbnNmb3JtX2lwCisJICBhcyB0aGUgY29udm9sdXRpb24gaXMgZG9uZSBvdXQgb2YgcGxhY2UgYW55d2F5LiBTaG91bGQKKwkgIGJlIGRvbmUgaW4gcGxhY2UgbGF0ZXIuCisKKzIwMDctMDgtMDkgMTA6NTQ6MDUgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBwby86IFVwZGF0ZWQgdHJhbnNsYXRpb25zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHBvL2h1LnBvOgorCSAgKiBwby91ay5wbzoKKwkgICogcG8vdmkucG86CisJICBVcGRhdGVkIHRyYW5zbGF0aW9ucy4KKworMjAwNy0wOC0wOCAyMDo0NzozMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZmlsdGVyLzogVXNlIEdzdEF1ZGlvRmlsdGVyIGFzIGJhc2UgY2xhc3MgYW5kIGRvbid0IGxlYWsgdGhlIG1lbW9yeSBvZiB0aGUgZmlsdGVyIGtlcm5lbCBhbmQgcmVzaWR1ZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmlsdGVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYzogKGdzdF9icHdzaW5jX2Rpc3Bvc2UpLAorCSAgKGdzdF9icHdzaW5jX2Jhc2VfaW5pdCksIChnc3RfYnB3c2luY19jbGFzc19pbml0KSwKKwkgIChnc3RfYnB3c2luY19pbml0KSwgKGJwd3NpbmNfc2V0dXApOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuaDoKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6IChnc3RfbHB3c2luY19kaXNwb3NlKSwKKwkgIChnc3RfbHB3c2luY19iYXNlX2luaXQpLCAoZ3N0X2xwd3NpbmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X2xwd3NpbmNfaW5pdCksIChscHdzaW5jX3NldHVwKToKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmg6CisJICBVc2UgR3N0QXVkaW9GaWx0ZXIgYXMgYmFzZSBjbGFzcyBhbmQgZG9uJ3QgbGVhayB0aGUgbWVtb3J5CisJICBvZiB0aGUgZmlsdGVyIGtlcm5lbCBhbmQgcmVzaWR1ZS4KKworMjAwNy0wOC0wOCAxNzo0NzowNSArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogUmVuZGVyIHJpZ2h0IGJvcmRlciBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogKGdzdF92aWRlb19ib3hfYXl1dl9pNDIwKToKKwkgIFJlbmRlciByaWdodCBib3JkZXIgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uCisKKzIwMDctMDgtMDggMTA6NTQ6NTAgKzAwMDAgIE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkgIGdzdC9ydHAvOiBNYWtlIG1vZGUgcHJvcGVydHkgYSBzdHJpbmcuIEZpeGVzICM0NjQ0NzUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBPbGl2aWVyIENyZXRlIDx0ZXN0ZXIgYXQgdGVzdGVyIGRvdCBjYT4KKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzogKGdzdF9ydHBfaWxiY19kZXBheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6IChnc3RfcnRwaWxiY3BheV9zZXRjYXBzKToKKwkgIE1ha2UgbW9kZSBwcm9wZXJ0eSBhIHN0cmluZy4gRml4ZXMgIzQ2NDQ3NS4KKworMjAwNy0wOC0wNSAxNDo1ODoyMCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IFdpZGVuIGNhcHMgdG8gbWF0Y2ggZGVjb2RlciBhIGJpdCBhbmQgYWRkIG1vcmUgRklYTUVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIFdpZGVuIGNhcHMgdG8gbWF0Y2ggZGVjb2RlciBhIGJpdCBhbmQgYWRkIG1vcmUgRklYTUVzLgorCisyMDA3LTA4LTA1IDE0OjUzOjM2ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorCisJICBnc3QvYXZpL2dzdGF2aW11eC5jOiBGaXggT0RNTCBpbmRleCB0YWcgbnVtYmVyaW5nLiBGaXhlcyAjNDYzNjI0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBwYXRjaCBieTogTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3QHNreW5ldC5iZT4KKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIEZpeCBPRE1MIGluZGV4IHRhZyBudW1iZXJpbmcuIEZpeGVzICM0NjM2MjQuCisKKzIwMDctMDgtMDMgMTY6MDg6NTYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogRml4IGRlZmF1bHQgY2xvY2stcmF0ZSBmb3IgcmVhbG1lZGlhLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdldF9kZWZhdWx0X3JhdGVfZm9yX3B0KSwKKwkgIChnc3RfcnRzcHNyY19wYXJzZV9ydHBtYXApLCAoZ3N0X3J0c3BzcmNfbWVkaWFfdG9fY2FwcyksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV90Y3ApLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdWRwX3NpbmspOgorCSAgRml4IGRlZmF1bHQgY2xvY2stcmF0ZSBmb3IgcmVhbG1lZGlhLgorCSAgRml4IHBhcnNpbmcgb2YgdHJhbnNwb3J0LgorCSAgRG9uJ3QgdHJ5IHRvIGxpbmsgTlVMTCBwYWRzLgorCisyMDA3LTA3LTMwIDE3OjE3OjA0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBwby9QT1RGSUxFUy5za2lwOiBBZGQgUE9URklMRVMuc2tpcCB3aXRoIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHRoYXQgYXJlbid0IGRpc3RlZCBhdCB0aGUgbW9tZW50IGJ1dCBjb250YWluIHRyYW5zbGF0YWIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBwby9QT1RGSUxFUy5za2lwOgorCSAgQWRkIFBPVEZJTEVTLnNraXAgd2l0aCBsaXN0IG9mIHNvdXJjZSBmaWxlcyB0aGF0IGFyZW4ndCBkaXN0ZWQgYXQgdGhlCisJICBtb21lbnQgYnV0IGNvbnRhaW4gdHJhbnNsYXRhYmxlIHN0cmluZ3MuIFNob3VsZCBob3BlZnVsbHkgcGFjaWZ5CisJICBicm9rZW4gdG9vbHMgYW5kIG1ha2UgaXQgY2xlYXJlciB0aGF0IHRoZXNlIGZpbGVzIGFyZSBsZWZ0IG91dAorCSAgaW50ZW50aW9uYWxseSAoIzQ2MTYwMCkuCisKKzIwMDctMDctMzAgMTI6NDE6NTggKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogSWYgdGhlIGJ1ZmZlciB3YXMgZW50aXJlbHkgY2xpcHBlZCAuLi4gZG9uJ3QgdHJ5IHNlbmRpbmcgaXQgOikKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX3N0YXRlX21vdmllKToKKwkgIElmIHRoZSBidWZmZXIgd2FzIGVudGlyZWx5IGNsaXBwZWQgLi4uIGRvbid0IHRyeSBzZW5kaW5nIGl0IDopCisKKzIwMDctMDctMjcgMTY6NTY6NDUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogSWYgd2UgZG9uJ3QgaGF2IGEgc2Vzc2lvbiBtYW5hZ2VyLCBzZXQgdGhlIGNhcHMgb24gb3V0Z29pbmcgYnVmZmVycyBvdXJzZWx2ZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfYWN0aXZhdGVfc3RyZWFtcyksCisJICAoZ3N0X3J0c3BzcmNfbG9vcF9pbnRlcmxlYXZlZCksIChnc3RfcnRzcHNyY19wYXJzZV9tZXRob2RzKSwKKwkgIChnc3RfcnRzcHNyY19jcmVhdGVfdHJhbnNwb3J0c19zdHJpbmcpLAorCSAgKGdzdF9ydHNwc3JjX3ByZXBhcmVfdHJhbnNwb3J0cyk6CisJICBJZiB3ZSBkb24ndCBoYXYgYSBzZXNzaW9uIG1hbmFnZXIsIHNldCB0aGUgY2FwcyBvbiBvdXRnb2luZyBidWZmZXJzCisJICBvdXJzZWx2ZXMuCisJICBGb3JjZSBQQVVTRS9QTEFZIG1ldGhvZHMgZm9yIG5vdyB1bnRpbCB0aGUgZXh0ZW5zaW9ucyBjYW4gb3ZlcndyaXRlLgorCSAgQXBwZW5kIGZpbmFsIGJpdCBvZiB0aGUgdHJhbnNwb3J0IHN0cmluZyBldmVuIHdoZW4gaXQgZG9lcyBub3QgY29udGFpbiBhCisJICBwbGFjZWhvbGRlci4KKworMjAwNy0wNy0yNyAxMToyMToyMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvOiBDbGVhbiB1cCB0aGUgaW50ZXJmYWNlIGxpc3QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcGV4dC5jOiAoZ3N0X3J0c3BfZXh0X2xpc3RfZnJlZSksCisJICAoZ3N0X3J0c3BfZXh0X2xpc3RfY29ubmVjdCk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BleHQuaDoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfaW5pdCksCisJICAoZ3N0X3J0c3BzcmNfZmluYWxpemUpLCAoZ3N0X3J0c3BzcmNfc2VuZF9jYik6CisJICBDbGVhbiB1cCB0aGUgaW50ZXJmYWNlIGxpc3QuCisJICBBbGxvdyBjb25uZWN0aW5nIHRvIGludGVyZmFjZSBzaWduYWxzIGZvciB0aGUgZXh0ZW5zaW9ucy4KKwkgIFJlbW92ZSBvbGQgZXh0ZW5zaW9uIGNvZGUuCisJICBGcmVlIGxpc3Qgb24gY2xlYW51cC4KKwkgIEFsbG93IGV4dGVuc2lvbnMgdG8gc2VuZCBhZGRpdGlvbmFsIFJUU1AgbWVzc2FnZXMuCisKKzIwMDctMDctMjcgMTA6Mzg6MzQgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBleHQvZ2NvbmYvZ2NvbmYuYzogSGFuZGxlIGEgTlVMTCBnY29uZiBrZXkgZ3JhY2VmdWxseSBieSByZW5kZXJpbmcgdGhlIGRlZmF1bHQgZWxlbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZ2NvbmYvZ2NvbmYuYzogKGdzdF9nY29uZl9yZW5kZXJfYmluX3dpdGhfZGVmYXVsdCk6CisJICBIYW5kbGUgYSBOVUxMIGdjb25mIGtleSBncmFjZWZ1bGx5IGJ5IHJlbmRlcmluZyB0aGUgZGVmYXVsdCBlbGVtZW50LgorCisyMDA3LTA3LTI3IDEwOjExOjE4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwZXh0Lmg6IEZpeCBpbmNsdWRlIHBhdGggZm9yIGV4dGVuc2lvbiBpbnRlcmZhY2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcGV4dC5oOgorCSAgRml4IGluY2x1ZGUgcGF0aCBmb3IgZXh0ZW5zaW9uIGludGVyZmFjZS4KKworMjAwNy0wNy0yNiAxOTo0NTozMCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuaDogQWxzbyByZW1vdmUgYSBub3cgdW5lY2Vzc2FyeSB2YXJpYWJsZSBoZXJlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5oOgorCSAgQWxzbyByZW1vdmUgYSBub3cgdW5lY2Vzc2FyeSB2YXJpYWJsZSBoZXJlLgorCisyMDA3LTA3LTI2IDE5OjQxOjA3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9hdWRpb2Z4LzogRG9uJ3Qgc2F2ZSBmb3JtYXQgaW5mb3JtYXRpb24gb3Vyc2VsdmVzLCB0aGlzIGlzIGFscmVhZHkgc2F2ZWQgaW4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzogKGdzdF9hdWRpb19hbXBsaWZ5X2luaXQpLAorCSAgKGdzdF9hdWRpb19hbXBsaWZ5X3NldHVwKSwgKGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5jOgorCSAgKGdzdF9hdWRpb19keW5hbWljX3NldF9wcm9jZXNzX2Z1bmN0aW9uKSwgKGdzdF9hdWRpb19keW5hbWljX2luaXQpLAorCSAgKGdzdF9hdWRpb19keW5hbWljX3NldHVwKSwgKGdzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5oOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2ludmVydC5jOiAoZ3N0X2F1ZGlvX2ludmVydF9pbml0KSwKKwkgIChnc3RfYXVkaW9faW52ZXJ0X3NldHVwKSwgKGdzdF9hdWRpb19pbnZlcnRfdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuaDoKKwkgIERvbid0IHNhdmUgZm9ybWF0IGluZm9ybWF0aW9uIG91cnNlbHZlcywgdGhpcyBpcyBhbHJlYWR5IHNhdmVkIGluCisJICBHc3RBdWRpb0ZpbHRlci4KKworMjAwNy0wNy0yNiAxNTo0ODo0NyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvOiBVc2UgcmFuayB0byBmaWx0ZXIgb3V0IGV4dGVuc2lvbnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcGV4dC5jOiAoZ3N0X3J0c3BfZXh0X2xpc3RfZmlsdGVyKSwKKwkgIChnc3RfcnRzcF9leHRfbGlzdF9zdHJlYW1fc2VsZWN0KToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcGV4dC5oOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zZXR1cF9zdHJlYW1zKToKKwkgIFVzZSByYW5rIHRvIGZpbHRlciBvdXQgZXh0ZW5zaW9ucy4KKwkgIEFkZCB1cmwgdG8gc3RyZWFtX3NlbGVjdCBpbnRlcmZhY2UgY2FsbC4KKworMjAwNy0wNy0yNSAxODo1MDowOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvOiBVc2Ugc2hpbnkgbmV3IFJUU1AgYW5kIFNEUCBsaWJyYXJ5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRzcC9iYXNlNjQuYzoKKwkgICogZ3N0L3J0c3AvYmFzZTY0Lmg6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BleHQuYzogKGdzdF9ydHNwX2V4dF9saXN0X2ZpbHRlciksCisJICAoZ3N0X3J0c3BfZXh0X2xpc3RfaW5pdCksIChnc3RfcnRzcF9leHRfbGlzdF9nZXQpLAorCSAgKGdzdF9ydHNwX2V4dF9saXN0X2RldGVjdF9zZXJ2ZXIpLCAoZ3N0X3J0c3BfZXh0X2xpc3RfYmVmb3JlX3NlbmQpLAorCSAgKGdzdF9ydHNwX2V4dF9saXN0X2FmdGVyX3NlbmQpLCAoZ3N0X3J0c3BfZXh0X2xpc3RfcGFyc2Vfc2RwKSwKKwkgIChnc3RfcnRzcF9leHRfbGlzdF9zZXR1cF9tZWRpYSksCisJICAoZ3N0X3J0c3BfZXh0X2xpc3RfY29uZmlndXJlX3N0cmVhbSksCisJICAoZ3N0X3J0c3BfZXh0X2xpc3RfZ2V0X3RyYW5zcG9ydHMpLAorCSAgKGdzdF9ydHNwX2V4dF9saXN0X3N0cmVhbV9zZWxlY3QpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwZXh0Lmg6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwX2xvd2VyX3RyYW5zX2dldF90eXBlKSwKKwkgIChnc3RfcnRzcHNyY19jbGFzc19pbml0KSwgKGdzdF9ydHNwc3JjX2luaXQpLAorCSAgKGdzdF9ydHNwc3JjX2ZpbmFsaXplKSwgKGdzdF9ydHNwc3JjX2NyZWF0ZV9zdHJlYW0pLAorCSAgKGdzdF9ydHNwc3JjX3BhcnNlX3J0cG1hcCksIChnc3RfcnRzcHNyY19tZWRpYV90b19jYXBzKSwKKwkgIChnc3RfcnRzcHNyY19mbHVzaCksIChnc3RfcnRzcHNyY19kb19zZWVrKSwKKwkgIChnc3RfcnRzcHNyY19zaW5rX2NoYWluKSwgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfbWFuYWdlciksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV90Y3ApLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfbWNhc3QpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdWRwKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3VkcF9zaW5rKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksCisJICAoZ3N0X3J0c3BzcmNfaGFuZGxlX3JlcXVlc3QpLCAoZ3N0X3J0c3BzcmNfc2VuZF9rZWVwX2FsaXZlKSwKKwkgIChnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkKSwgKGdzdF9ydHNwc3JjX2xvb3BfdWRwKSwKKwkgIChnc3RfcnRzcHNyY19sb29wX3NlbmRfY21kKSwgKGdzdF9ydHNwX2F1dGhfbWV0aG9kX3RvX3N0cmluZyksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfYXV0aF9oZHIpLCAoZ3N0X3J0c3BzcmNfc2V0dXBfYXV0aCksCisJICAoZ3N0X3J0c3BzcmNfdHJ5X3NlbmQpLCAoZ3N0X3J0c3BzcmNfc2VuZCksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfbWV0aG9kcyksCisJICAoZ3N0X3J0c3BzcmNfY3JlYXRlX3RyYW5zcG9ydHNfc3RyaW5nKSwKKwkgIChnc3RfcnRzcHNyY19wcmVwYXJlX3RyYW5zcG9ydHMpLCAoZ3N0X3J0c3BzcmNfc2V0dXBfc3RyZWFtcyksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfcmFuZ2UpLCAoZ3N0X3J0c3BzcmNfb3BlbiksIChnc3RfcnRzcHNyY19jbG9zZSksCisJICAoZ3N0X3J0c3BzcmNfcGxheSksIChnc3RfcnRzcHNyY19wYXVzZSksCisJICAoZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlKSwgKGdzdF9ydHNwc3JjX3VyaV9zZXRfdXJpKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgKiBnc3QvcnRzcC9ydHNwLmg6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmg6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmM6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmg6CisJICAqIGdzdC9ydHNwL3J0c3BleHQuaDoKKwkgICogZ3N0L3J0c3AvcnRzcGV4dHdtcy5jOgorCSAgKiBnc3QvcnRzcC9ydHNwZXh0d21zLmg6CisJICAqIGdzdC9ydHNwL3J0c3BtZXNzYWdlLmM6CisJICAqIGdzdC9ydHNwL3J0c3BtZXNzYWdlLmg6CisJICAqIGdzdC9ydHNwL3J0c3ByYW5nZS5jOgorCSAgKiBnc3QvcnRzcC9ydHNwcmFuZ2UuaDoKKwkgICogZ3N0L3J0c3AvcnRzcHRyYW5zcG9ydC5jOgorCSAgKiBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0Lmg6CisJICAqIGdzdC9ydHNwL3J0c3B1cmwuYzoKKwkgICogZ3N0L3J0c3AvcnRzcHVybC5oOgorCSAgKiBnc3QvcnRzcC9zZHAuaDoKKwkgICogZ3N0L3J0c3Avc2RwbWVzc2FnZS5jOgorCSAgKiBnc3QvcnRzcC9zZHBtZXNzYWdlLmg6CisJICAqIGdzdC9ydHNwL3Rlc3QuYzoKKwkgIFVzZSBzaGlueSBuZXcgUlRTUCBhbmQgU0RQIGxpYnJhcnkuCisJICBJbXBsZW1lbnQgUlRTUCBleHRlbnNpb25zIHVzaW5nIHRoZSBuZXcgaW50ZXJmYWNlLgorCSAgUmVtb3ZlIGEgbG90IG9mIG9sZCBjb2RlLgorCisyMDA3LTA3LTI0IDE0OjMxOjU2ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEFkZCBjb2RlYyBtYXBwaW5nIGZvciAnMnZ1eScgKFJhdyBZVVYgcHJvZHVjZWQgYnkgRkNQKSBhbmQgJ2RpdngnLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6CisJICBBZGQgY29kZWMgbWFwcGluZyBmb3IgJzJ2dXknIChSYXcgWVVWIHByb2R1Y2VkIGJ5IEZDUCkgYW5kICdkaXZ4Jy4KKworMjAwNy0wNy0yNCAwNTowNzo1OSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IERvbid0IHVucmVmIHRoZSBvdXRnb2luZyBidWZmZXIgdHdpY2Ugd2hlbiBkcm9wcGluZyBpdCBiZWNhdXNlIGl0J3Mgb3V0c2lkZSBvZiB0aGUgc2VnbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfY2hhaW4pOgorCSAgRG9uJ3QgdW5yZWYgdGhlIG91dGdvaW5nIGJ1ZmZlciB0d2ljZSB3aGVuIGRyb3BwaW5nIGl0IGJlY2F1c2UgaXQncworCSAgb3V0c2lkZSBvZiB0aGUgc2VnbWVudC4KKworMjAwNy0wNy0yNCAwNDo1NzoyMCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBVc2UgdGhlIG5ldyBidWZmZXIgY2xpcHBpbmcgZnVuY3Rpb24gZnJvbSBnc3RhdWRpbyBoZXJlIGFuZCByZXF1aXJlIGdzdC1wbHVnaW5zLWJhc2UgQ1ZTLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX3Jlc2V0KSwKKwkgIChnc3Rfd2F2cGFja19kZWNfY2hhaW4pLCAoZ3N0X3dhdnBhY2tfZGVjX3NpbmtfZXZlbnQpOgorCSAgVXNlIHRoZSBuZXcgYnVmZmVyIGNsaXBwaW5nIGZ1bmN0aW9uIGZyb20gZ3N0YXVkaW8gaGVyZSBhbmQKKwkgIHJlcXVpcmUgZ3N0LXBsdWdpbnMtYmFzZSBDVlMuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tkZWMuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIEZvciBmcmFtZWQgV2F2cGFjayBidWZmZXJzIHdlIHJlcXVpcmUgYSB2YWxpZCB0aW1lc3RhbXAuCisKKzIwMDctMDctMjMgMTg6MDM6NTQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQ2xpcCByYXcgYXVkaW8gYW5kIHZpZGVvIHdoZW4gd2UgY2FuLCBrZWVwIHRyYWNrIG9mIGN1cnJlbnQgb3V0cHV0IHNlZ21lbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfYWN0aXZhdGVfc2VnbWVudCksCisJICAoZ3N0X3F0ZGVtdXhfY2xpcF9idWZmZXIpLCAoZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9tb3ZpZSksCisJICAocXRkZW11eF9wYXJzZV90cmFrKSwgKHF0ZGVtdXhfdmlkZW9fY2FwcyksIChxdGRlbXV4X2F1ZGlvX2NhcHMpOgorCSAgQ2xpcCByYXcgYXVkaW8gYW5kIHZpZGVvIHdoZW4gd2UgY2FuLCBrZWVwIHRyYWNrIG9mIGN1cnJlbnQgb3V0cHV0CisJICBzZWdtZW50LgorCSAgRG9uJ3QgbGVhayBidWZmZXJzIGFuZCBldmVudHMgd2hlbiB0aGVyZSBpcyBubyBvdXRwdXQgcGFkLgorCSAgSW1wcm92ZSBkZWJ1Z2dpbmcgaGVyZSBhbmQgdGhlcmUuCisKKzIwMDctMDctMjMgMDk6MDI6MDcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBTeW5jIGxpYm9pbCBjaGVjayB3aXRoIHBsdWdpbnMtYmFzZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBTeW5jIGxpYm9pbCBjaGVjayB3aXRoIHBsdWdpbnMtYmFzZS4KKworMjAwNy0wNy0yMCAxMTozNzozNyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvZXF1YWxpemVyLzogQmV0dGVyIGFsZ29yaXRoIGZvciB0aGUgY2VudGVyIGZyZXF1ZW5jaWVzLiBTdWJ0cmFjdCBiYW5kIGZpbHRlcnMgZnJvbSBpbnB1dCBmb3IgbmVnYXRpdmUgZ2FpbnMuIFJld28uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSAgKGdzdF9paXJfZXF1YWxpemVyX2JhbmRfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9jaGlsZF9wcm94eV9nZXRfY2hpbGRfYnlfaW5kZXgpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX2NoaWxkX3Byb3h5X2dldF9jaGlsZHJlbl9jb3VudCksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfY2hpbGRfcHJveHlfaW50ZXJmYWNlX2luaXQpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX2NsYXNzX2luaXQpLCAoYXJnX3RvX3NjYWxlKSwgKHNldHVwX2ZpbHRlciksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfY29tcHV0ZV9mcmVxdWVuY2llcyk6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5jOgorCSAgKGdzdF9paXJfZXF1YWxpemVyXzEwYmFuZHNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmM6CisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfM2JhbmRzX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5jOgorCSAgQmV0dGVyIGFsZ29yaXRoIGZvciB0aGUgY2VudGVyIGZyZXF1ZW5jaWVzLiBTdWJ0cmFjdCBiYW5kIGZpbHRlcnMgZnJvbQorCSAgaW5wdXQgZm9yIG5lZ2F0aXZlIGdhaW5zLiBSZXdvcmsgdGhlIGdhaW4gbWFwcGluZy4KKworMjAwNy0wNy0yMCAwNzo0MTo1OCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBleHQvYW5ub2RleC9NYWtlZmlsZS5hbTogRml4IENGTEFHUy9MSUJTLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9hbm5vZGV4L01ha2VmaWxlLmFtOgorCSAgRml4IENGTEFHUy9MSUJTLgorCSAgKiBleHQvY2Rpby9nc3RjZGlvY2RkYXNyYy5jOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiAoZ3N0X3BuZ2RlY190YXNrKToKKwkgIEluY2x1ZGUgc3RkbGliCisJICAqIGV4dC9jYWlyby9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9sZXZlbC9NYWtlZmlsZS5hbToKKwkgIFVzZSAkKExJQk0pIGluc3RlYWQgb2YgLWxtCisKKzIwMDctMDctMTggMTE6NTU6MTMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiBBZGQgYW5vdGhlciBleGFtcGxlIHBpcGVsaW5lLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIEFkZCBhbm90aGVyIGV4YW1wbGUgcGlwZWxpbmUuCisKKzIwMDctMDctMTggMTE6NDI6MzMgKzAwMDAgIEFsZXhhbmRlciBFaWNobmVyIDxhbGV4ZWljaGlAeWFob28uZGU+CisKKwkgIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogVXNlIGRlZmluZSBoZXJlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQWxleGFuZGVyIEVpY2huZXIgPGFsZXhlaWNoaUB5YWhvby5kZT4KKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfaW5pdCk6CisJICBVc2UgZGVmaW5lIGhlcmUuCisJICAqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOgorCSAgKGdzdF92NGwyX3R1bmVyX3NldF9mcmVxdWVuY3lfYW5kX25vdGlmeSk6CisJICBEb24ndCB0b3VjaCB0aGUgcHJvcGVydHkgLSBpdHMgc3RpbGwgZGlzYWJsZWQuCisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX3Byb2JlX2NhcHNfZm9yX2Zvcm1hdCksCisJICAoZ3N0X3Y0bDJzcmNfZ3JhYl9mcmFtZSksIChnc3RfdjRsMnNyY19nZXRfc2l6ZV9saW1pdHMpOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmg6CisJICBJbXByb3ZlIGZhbGxiYWNrIGZvcm1hdCBuZWdvdGlvbmF0aW9uLiBGaXhlcyAjNDUxMzg4CisKKzIwMDctMDctMTggMTA6MzM6MzkgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6IEZpeCB0aGUgdGVzdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2Nyb3AuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIEZpeCB0aGUgdGVzdC4KKworMjAwNy0wNy0xOCAwOToyMToyMyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBNb3JlIGRvY3MuIE1vcmUgbG9ncyBpbiBwbmdkZWMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogKGdzdF9wbmdkZWNfdGFzayksCisJICAoZ3N0X3BuZ2RlY19zaW5rX3NldGNhcHMpOgorCSAgTW9yZSBkb2NzLiBNb3JlIGxvZ3MgaW4gcG5nZGVjLgorCisyMDA3LTA3LTE4IDA3OjUxOjExICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6IEFkZCBleGFtcGxlIHRvIHRoZSBkb2NzLiBGaXggYnVmZmVyLW9mZnNldC1lbmQgYW5kIGFkZCBzb21lIGRlYnVnLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6IChnc3RfbXVsdGlfZmlsZV9zcmNfY3JlYXRlKToKKwkgIEFkZCBleGFtcGxlIHRvIHRoZSBkb2NzLiBGaXggYnVmZmVyLW9mZnNldC1lbmQgYW5kIGFkZCBzb21lIGRlYnVnLgorCisyMDA3LTA3LTE4IDA3OjM1OjMyICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIEFkZCBzdGRsaWIgaW5jbHVkZSAoZnJlZSwgYXRvaSwgZXhpdCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXhhbXBsZXMvYXBwL2FwcHNyY19leC5jOgorCSAgKiBleGFtcGxlcy9zd2l0Y2gvc3dpdGNoZXIuYzoKKwkgICogZXh0L25lb24vZ3N0bmVvbmh0dHBzcmMuYzoKKwkgICogZXh0L3RpbWlkaXR5L2dzdHdpbGRtaWRpLmM6CisJICAqIGV4dC94MjY0L2dzdHgyNjRlbmMuYzoKKwkgICogZ3N0L212ZS9tdmVhdWRpb2VuYy5jOiAobXZlX2NvbXByZXNzX2F1ZGlvKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwY2xpZW50LmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1hdWRpb3Rlc3QuYzoKKwkgICogZ3N0L3NwZWN0cnVtL2RlbW8tb3Nzc3JjLmM6CisJICAqIHN5cy9kdmIvZ3N0ZHZic3JjLmM6CisJICBBZGQgc3RkbGliIGluY2x1ZGUgKGZyZWUsIGF0b2ksIGV4aXQpLgorCisyMDA3LTA3LTE3IDExOjM1OjI5ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogSW5pdGlhbGl6ZSBudW1fYnVmZmVycyB3aXRoIG1pbmltdW0gdmFsdWUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfaW5pdCk6CisJICBJbml0aWFsaXplIG51bV9idWZmZXJzIHdpdGggbWluaW11bSB2YWx1ZS4KKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfZmlsbF9mb3JtYXRfbGlzdCksCisJICAoZ3N0X3Y0bDJzcmNfcHJvYmVfY2Fwc19mb3JfZm9ybWF0KSwgKGdzdF92NGwyc3JjX2dyYWJfZnJhbWUpOgorCSAgSGFuZGxlIGZyYW1lLXNpemUgcXVlcnkgZmFpbHVyZSBncmFjZWZ1bGx5LgorCisyMDA3LTA3LTE2IDEyOjExOjM2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEZpeCBwYXJzaW5nIG9mIGVzZHMgYXRvbXMgaW5zaWRlIG1wNGEgYXRvbXMgc28gdGhhdCB3ZSBjYW4gc2V0IGNvcnJlY3QgY29kZWNfaW5mbyBmb3IgQUFDIGF1ZGkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlX25vZGUpOgorCSAgRml4IHBhcnNpbmcgb2YgZXNkcyBhdG9tcyBpbnNpZGUgbXA0YSBhdG9tcyBzbyB0aGF0IHdlIGNhbiBzZXQgY29ycmVjdAorCSAgY29kZWNfaW5mbyBmb3IgQUFDIGF1ZGlvLiBGaXhlcyAjNDU3MDk3IGFsb25nIHdpdGggYSB3aG9sZSBvdGhlciBidW5jaAorCSAgb2YgcXQvYWFjIGZpbGVzLgorCisyMDA3LTA3LTE2IDA5OjE2OjAzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogRml4IGJ1ZmZlciBjbGlwcGluZyB0byBjb3JyZWN0bHkgY2xpcCB0byB0aGUgc2VnbWVudCBzdG9wLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkgIChnc3Rfd2F2cGFja19kZWNfY2xpcF9vdXRnb2luZ19idWZmZXIpOgorCSAgRml4IGJ1ZmZlciBjbGlwcGluZyB0byBjb3JyZWN0bHkgY2xpcCB0byB0aGUgc2VnbWVudCBzdG9wLgorCisyMDA3LTA3LTEzIDE2OjMxOjI3ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgUmVtb3ZlIGJvZ3VzIGNoZWNrIGZvciBsaWJjaGVjaywgc2luY2Ugd2UgY2hlY2sgZm9yIGdzdHJlYW1lci1jaGVjayBhbmQgaXQgcHVsbHMgaW4gdGhlIHJlcXVpcmVkIGluZm8gZnJvbSB0aGVyZSwgYW5kLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiB0ZXN0cy9NYWtlZmlsZS5hbToKKwkgIFJlbW92ZSBib2d1cyBjaGVjayBmb3IgbGliY2hlY2ssIHNpbmNlIHdlIGNoZWNrIGZvcgorCSAgZ3N0cmVhbWVyLWNoZWNrIGFuZCBpdCBwdWxscyBpbiB0aGUgcmVxdWlyZWQgaW5mbyBmcm9tIHRoZXJlLAorCSAgYW5kIHdlIHdlcmVuJ3QgYWN0dWFsbHkgX3VzaW5nXyB0aGUgaW5mb3JtYXRpb24gZm9yIGxpYmNoZWNrCisJICBvdXJzZWx2ZXMgYW55d2F5LgorCisyMDA3LTA3LTEyIDExOjIxOjAxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogVXNlIHBrZy1jb25maWcgdG8gbG9jYXRlIGNoZWNrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIFVzZSBwa2ctY29uZmlnIHRvIGxvY2F0ZSBjaGVjay4KKworMjAwNy0wNy0xMSAyMzo0MzoyNSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0LzogRml4IGJ1aWxkIGFnYWluc3QgY29yZSBDVlMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6IChnc3RfZGVpbnRlcmxlYXZlX3Byb2Nlc3MpOgorCSAgKiBnc3Qvdm1uYy92bW5jZGVjLmM6ICh2bW5jX21ha2VfYnVmZmVyKToKKwkgIEZpeCBidWlsZCBhZ2FpbnN0IGNvcmUgQ1ZTLgorCisyMDA3LTA3LTExIDIyOjMxOjA2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBGaXggYnVpbGQgYWdhaW5zdCBjb3JlIENWUy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGltZW92ZXJsYXkuYzogKGdzdF9jYWlyb190aW1lX292ZXJsYXlfdHJhbnNmb3JtKToKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOiAoZ3N0X2pwZWdlbmNfY2hhaW4pOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiAoZ3N0X3BuZ2VuY19jaGFpbik6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogKGdzdF93YXZwYWNrX2RlY19jaGFpbik6CisJICAqIGdzdC9kZWJ1Zy9nc3RuYXZpZ2F0aW9udGVzdC5jOiAoZ3N0X25hdmlnYXRpb250ZXN0X3RyYW5zZm9ybSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6IChnc3RfYWdpbmd0dl90cmFuc2Zvcm0pOgorCSAgKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6IChnc3RfZGljZXR2X3RyYW5zZm9ybSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdGVkZ2UuYzogKGdzdF9lZGdldHZfdHJhbnNmb3JtKToKKwkgICogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzogKGdzdF9xdWFya3R2X3RyYW5zZm9ybSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdHJldi5jOiAoZ3N0X3JldnR2X3RyYW5zZm9ybSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYzogKGdzdF9zaGFnYWRlbGljdHZfdHJhbnNmb3JtKToKKwkgICogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5jOiAoZ3N0X3ZlcnRpZ290dl90cmFuc2Zvcm0pOgorCSAgKiBnc3QvZWZmZWN0di9nc3R3YXJwLmM6IChnc3Rfd2FycHR2X3RyYW5zZm9ybSk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfd3Zwa19oZWFkZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9jaGVja19zdWJ0aXRsZV9idWZmZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZWNvZGVfYnVmZmVyKToKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOiAoZ3N0X3ZpZGVvX2ZsaXBfdHJhbnNmb3JtKToKKwkgIEZpeCBidWlsZCBhZ2FpbnN0IGNvcmUgQ1ZTLgorCisyMDA3LTA3LTEwIDEwOjE2OjM4ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzogRG9uJ3QgcmV0dXJuIEdTVF9GTE9XX0VSUk9SIHdoZW4gcHVzaGluZyBhbiBldmVudCByZXR1cm5zIEZBTFNFLiBXZSBkb24ndCBoYXZlIGVub3VnaCBncmEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzogKGdzdF9pZDNkZW11eF9jaGFpbik6CisJICBEb24ndCByZXR1cm4gR1NUX0ZMT1dfRVJST1Igd2hlbiBwdXNoaW5nIGFuIGV2ZW50IHJldHVybnMgRkFMU0UuIFdlCisJICBkb24ndCBoYXZlIGVub3VnaCBncmFudWxhcml0eSB0byBjb252ZXJ0IHRoYXQgYm9vbGVhbiBpbnRvIGEKKwkgIEdzdEZsb3dSZXR1cm4uCisKKzIwMDctMDctMDYgMTU6MDA6NDcgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZ3N0L2xhdy86IEZpeCBjYXBzbmVnbyBib2dvc2l0eSBpbiAqbGF3IGRlY29kZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzogKGFsYXdkZWNfc2lua19zZXRjYXBzKSwKKwkgIChnc3RfYWxhd2RlY19jbGFzc19pbml0KSwgKGdzdF9hbGF3ZGVjX2luaXQpLCAoZ3N0X2FsYXdkZWNfY2hhaW4pLAorCSAgKGdzdF9hbGF3ZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9sYXcvYWxhdy1kZWNvZGUuaDoKKwkgICogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzogKG11bGF3ZGVjX3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X211bGF3ZGVjX2NsYXNzX2luaXQpLCAoZ3N0X211bGF3ZGVjX2luaXQpLAorCSAgKGdzdF9tdWxhd2RlY19jaGFpbiksIChnc3RfbXVsYXdkZWNfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuaDoKKwkgIEZpeCBjYXBzbmVnbyBib2dvc2l0eSBpbiAqbGF3IGRlY29kZXJzLgorCisyMDA3LTA3LTA2IDE0OjM1OjU5ICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIGV4dC9qcGVnL2dzdHNtb2tlZW5jLio6IFJlbW92ZSBzdHVwaWRpdHkgaW4gZ2V0L3NldCBjYXBzIGZ1bmN0aW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvanBlZy9nc3RzbW9rZWVuYy5jOiAoZ3N0X3Ntb2tlZW5jX2luaXQpLAorCSAgKGdzdF9zbW9rZWVuY19zZXRjYXBzKSwgKGdzdF9zbW9rZWVuY19jaGFpbiksCisJICAoZ3N0X3Ntb2tlZW5jX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmg6CisJICBSZW1vdmUgc3R1cGlkaXR5IGluIGdldC9zZXQgY2FwcyBmdW5jdGlvbnMuCisJICBGaXggc29tZSByZWZjb3VudGluZyBwcm9ibGVtcy4KKworMjAwNy0wNy0wNiAxMTo0Mjo1MyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IFJlbW92ZSBlbmRpYW5uZXNzLWZsaXBwaW5nIGhhY2sgdGhhdCBzZWVtcyB0byBoYXZlIGJlZW4gcmVxdWlyZWQgb25seSBiZWNhdXNlIG9mIGEgYnVnIGluIGZmbS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IChnc3RfcG5nZGVjX2NhcHNfY3JlYXRlX2FuZF9zZXQpOgorCSAgUmVtb3ZlIGVuZGlhbm5lc3MtZmxpcHBpbmcgaGFjayB0aGF0IHNlZW1zIHRvIGhhdmUgYmVlbiByZXF1aXJlZAorCSAgb25seSBiZWNhdXNlIG9mIGEgYnVnIGluIGZmbXBlZ2NvbG9yc3BhY2UuCisJICBQYXJ0aWFsbHkgRml4ZXM6ICM0NTE5MDgKKworMjAwNy0wNy0wNSAwODo0NDoxMSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06IFNpbXBsaWZ5IC0tZXh0cmEtZGlyIGFzIGd0a2RvYyBzY2FucyByZWN1cnNpdmVseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICBTaW1wbGlmeSAtLWV4dHJhLWRpciBhcyBndGtkb2Mgc2NhbnMgcmVjdXJzaXZlbHkuCisKKzIwMDctMDctMDMgMDk6NTk6NDYgKzAwMDAgIFRvbW1pIE15w7Zow6RuZW4gPGV4dC10b21taS5teW9oYW5lbkBub2tpYS5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5jOiBTZXQgdGhlIGVuY29kaW5nLW5hbWUgaW4gdGhlIHJ0cCBjYXBzIHRvIGFsbCB1cHBlcmNhc2UsIGFzIHJlcXVpcmVkIGJ5IHRoZSBjYXBzIHNwZWMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBUb21taSBNecO2aMOkbmVuICA8ZXh0LXRvbW1pIGRvdCBteW9oYW5lbiBhdCBub2tpYSBkb3QgY29tPgorCSAgKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYzogKGdzdF9ydHBpbGJjcGF5X3NldGNhcHMpOgorCSAgU2V0IHRoZSBlbmNvZGluZy1uYW1lIGluIHRoZSBydHAgY2FwcyB0byBhbGwgdXBwZXJjYXNlLCBhcyByZXF1aXJlZCBieQorCSAgdGhlIGNhcHMgc3BlYy4KKwkgIFNvbWUgc21hbGwgY2xlYW51cHMgaW4gdGhlIGVycm9yIHBhdGhzLiBGaXhlcyAjNDUzMDM3LgorCisyMDA3LTA3LTAzIDA4OjAxOjE4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9tdWx0aWZpbGUvOiBBZGQgLmggZmlsZXMgdG8gYmUgYWJsZSB0byBhZGQgaXQgdG8gdGhlIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L211bHRpZmlsZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGUuYzoKKwkgICogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICAqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oOgorCSAgKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOgorCSAgKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5oOgorCSAgQWRkIC5oIGZpbGVzIHRvIGJlIGFibGUgdG8gYWRkIGl0IHRvIHRoZSBkb2NzLgorCisyMDA3LTA3LTAzIDA3OjE2OjI2ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9yZXBsYXlnYWluL2dzdHJndm9sdW1lLmg6IEZpeCBHT2JqZWN0IG1hY3Jvcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ3ZvbHVtZS5oOgorCSAgRml4IEdPYmplY3QgbWFjcm9zLgorCisyMDA3LTA2LTI4IDE5OjAwOjQzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS4qOiBVc2UgYSBHU0xpc3QgZm9yIHRoZSBHQXJyYXkgdGhhdCBpcyB1c2VkIGxpa2UgYSBsaXN0IGFueXdheS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9pbmRleF9nZXRfbGFzdF9lbnRyeSksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfaW5kZXhfZ2V0X2VudHJ5X2Zyb21fc2FtcGxlKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9pbmRleF9hcHBlbmRfZW50cnkpLCAoZ3N0X3dhdnBhY2tfcGFyc2VfcmVzZXQpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX3NjYW5fdG9fZmluZF9zYW1wbGUpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuaDoKKwkgIFVzZSBhIEdTTGlzdCBmb3IgdGhlIEdBcnJheSB0aGF0IGlzIHVzZWQgbGlrZSBhIGxpc3QgYW55d2F5LgorCisyMDA3LTA2LTI4IDEzOjI1OjA1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogQWRkIHN0YXRlIGNoYW5nZSBmdW5jdGlvbiB3aGVyZSB3ZSBzZXQgMC8xIGFzIGRlZmF1bHQgZnJhbWVyYXRlIGluIGNhc2Ugb3VyIHNldGNhcHMgZnUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKGdzdF9nZGtfcGl4YnVmX3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X2dka19waXhidWZfY2xhc3NfaW5pdCksIChnc3RfZ2RrX3BpeGJ1Zl9mbHVzaCksCisJICAoZ3N0X2dka19waXhidWZfc2lua19ldmVudCksIChnc3RfZ2RrX3BpeGJ1Zl9jaGFuZ2Vfc3RhdGUpOgorCSAgQWRkIHN0YXRlIGNoYW5nZSBmdW5jdGlvbiB3aGVyZSB3ZSBzZXQgMC8xIGFzIGRlZmF1bHQgZnJhbWVyYXRlIGluCisJICBjYXNlIG91ciBzZXRjYXBzIGZ1bmN0aW9uIGlzbid0IGNhbGxlZCwgbGlrZSBpdCBtaWdodCBub3QgaW4gYQorCSAgZmlsZXNyYyAhIGdka3BpeGJ1ZmRlYyBzY2VuYXJpby4gRml4ZXMgYXNzZXJ0aW9uIHRyaWdnZXJlZCBieQorCSAgZ2RrcGl4YnVmZGVjIHRyeWluZyB0byBjcmVhdGUgY2FwcyB3aXRoIGEgMC8wIGZyYW1lcmF0ZS4KKwkgIEFsc28gcG9zdCBhbiBlcnJvciBtZXNzYWdlIG9uIHRoZSBidXMgaWYgZ3N0X3BhZF9wdXNoKCkgZmFpbHMgd2hlbgorCSAgY2FsbGVkIGZyb20gb3VyIHNpbmsgZXZlbnQgaGFuZGxlciAoKzEgZm9yIGZsb3cgcmV0dXJucyBmb3IgZXZlbnQKKwkgIGZ1bmN0aW9ucyBpbiAwLjExKSBpbnN0ZWFkIG9mIGZhaWxpbmcgc2lsZW50bHkuCisKKzIwMDctMDYtMjcgMTE6MzY6MjQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogQ2FzdCBzdGFjayBhcmdzIHRvIHRoZSBwcm9wZXIgdHlwZXMuIEZpeGVzICM0NTEyNDkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfY29uZmlndXJlX2NhcHMpOgorCSAgQ2FzdCBzdGFjayBhcmdzIHRvIHRoZSBwcm9wZXIgdHlwZXMuIEZpeGVzICM0NTEyNDkuCisKKzIwMDctMDYtMjcgMTE6MDQ6NDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuKjogRm9yIGNvbnRhaW5lciBmb3JtYXRzIHdlIG9ubHkgbmVlZCB0byBhY3RpdmF0ZSBvbmUgb2YgdGhlIHN0cmVhbXMgc28gdGhhdCB3ZSBjb3JyZWN0bHkgc2lnbmFsIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2NyZWF0ZV9zdHJlYW0pLAorCSAgKG5ld19zZXNzaW9uX3BhZCksIChnc3RfcnRzcHNyY19zZXR1cF9zdHJlYW1zKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgRm9yIGNvbnRhaW5lciBmb3JtYXRzIHdlIG9ubHkgbmVlZCB0byBhY3RpdmF0ZSBvbmUgb2YgdGhlIHN0cmVhbXMgc28KKwkgIHRoYXQgd2UgY29ycmVjdGx5IHNpZ25hbCBuby1tb3JlLXBhZHMuIEZpeGVzICM0NTEwMTUuCisKKzIwMDctMDYtMjUgMTI6NDY6MDggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogVXBkYXRlIGRvY3Mgd2l0aCBjYXBzIGluZm8uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Rpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGFkc3BhLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkgIFVwZGF0ZSBkb2NzIHdpdGggY2FwcyBpbmZvLgorCisyMDA3LTA2LTI1IDEyOjEzOjA5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBwby9QT1RGSUxFUy5pbjogQWRkIG1vcmUgZmlsZXMgd2l0aCB0cmFuc2xhdGFibGUgc3RyaW5ncyAoIzQ1MDg3OCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogcG8vUE9URklMRVMuaW46CisJICBBZGQgbW9yZSBmaWxlcyB3aXRoIHRyYW5zbGF0YWJsZSBzdHJpbmdzICgjNDUwODc4KS4KKworMjAwNy0wNi0yMiAyMDoyMzoxOCArMDAwMCAgSmVucyBHcmFuc2V1ZXIgPGplbnNnckBnbXgubmV0PgorCisJICBnc3QvOiBCdWlsZCBmaXhlcyBmb3IgZ2NjLTIuOXggKG5vIG1pZC1ibG9jayB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgZXRjLikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBKZW5zIEdyYW5zZXVlciAgPGplbnNnciBhdCBnbXggbmV0PgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjEwYmFuZHMuYzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIzYmFuZHMuYzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXJuYmFuZHMuYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvYXN5bmNfaml0dGVyX3F1ZXVlLmM6CisJICAoYXN5bmNfaml0dGVyX3F1ZXVlX3B1c2hfc29ydGVkKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYWluKToKKwkgICogZ3N0L3N3aXRjaC9nc3Rzd2l0Y2guYzogKGdzdF9zd2l0Y2hfY2hhaW4pOgorCSAgQnVpbGQgZml4ZXMgZm9yIGdjYy0yLjl4IChubyBtaWQtYmxvY2sgdmFyaWFibGUgZGVjbGFyYXRpb25zIGV0Yy4pLgorCSAgRml4ZXMgIzQ1MDE4NS4KKworMjAwNy0wNi0yMiAxNDoyNjozNiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIE1BSU5UQUlORVJTOiBVcGRhdGluZyBhbGwgdGhlIG1haW50YWluZXJzIGZpbGVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogTUFJTlRBSU5FUlM6CisJICBVcGRhdGluZyBhbGwgdGhlIG1haW50YWluZXJzIGZpbGVzCisKKzIwMDctMDYtMjIgMTA6MTI6MTUgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIEZpeCBtZW1vcnkgbGVha3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOiAoZ3N0X2ZsYWNfdGFnX2luaXQpOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzogKGRlaW50ZXJsZWF2ZV9pbml0KSwKKwkgIChkZWludGVybGVhdmVfc2lua19saW5rKToKKwkgICogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOiAoaW50ZXJsZWF2ZV9pbml0KToKKwkgICogZ3N0L21lZGlhbi9nc3RtZWRpYW4uYzogKGdzdF9tZWRpYW5faW5pdCk6CisJICAqIGdzdC9vbGRjb3JlL2dzdG11bHRpZmlsZXNyYy5jOiAoZ3N0X211bHRpZmlsZXNyY19pbml0KToKKwkgIEZpeCBtZW1vcnkgbGVha3MuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM2RlbXV4LmM6IChwYWRfYWRkZWRfY2IpOgorCSAgUmVtb3ZlIHVudXNlZCB2YXJpYWJsZS4KKworMjAwNy0wNi0yMSAxMDo0ODoxMCArMDAwMCAgRGFtaWVuIENhcmJlcnkgPGRhbWllbi5jYXJiZXJ5QHN1bi5jb20+CisKKwkgIGV4dC9nY29uZi9nY29uZi5oOiBNYWtlIHRoZSBwcm90b3R5cGUgb2YgZ3N0X2djb25mX2dldF9rZXlfZm9yX3NpbmtfcHJvZmlsZSBtYXRjaCB0aGUgaW1wbGVtZW50YXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2djb25mL2djb25mLmg6CisJICBNYWtlIHRoZSBwcm90b3R5cGUgb2YgZ3N0X2djb25mX2dldF9rZXlfZm9yX3NpbmtfcHJvZmlsZQorCSAgbWF0Y2ggdGhlIGltcGxlbWVudGF0aW9uLgorCSAgUGF0Y2ggYnk6IERhbWllbiBDYXJiZXJ5IDxkYW1pZW4gZG90IGNhcmJlcnkgYXQgc3VuIGRvdCBjb20+CisJICBGaXhlczogIzQ0OTc0NworCisyMDA3LTA2LTIwIDEyOjU2OjEyICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzogRml4IGRlc2NyaXB0aW9uIC0gcnRwZGVwYXkgaXMgbm90IGEgcGF5bG9hZGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzoKKwkgIEZpeCBkZXNjcmlwdGlvbiAtIHJ0cGRlcGF5IGlzIG5vdCBhIHBheWxvYWRlci4KKworMjAwNy0wNi0yMCAxMDoxNTowMCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOiBEb2N1bWVudCBwYXJhbWV0ZXIgbWFwcGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSAgRG9jdW1lbnQgcGFyYW1ldGVyIG1hcHBpbmcuCisKKzIwMDctMDYtMjAgMDg6NTY6MTcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IEZpeCBsZWFraW5nIGJ1ZmZlcnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IChnc3Rfc3BlY3RydW1fZXZlbnQpLAorCSAgKGdzdF9zcGVjdHJ1bV90cmFuc2Zvcm1faXApOgorCSAgRml4IGxlYWtpbmcgYnVmZmVycy4KKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwZWN0cnVtLmM6IChzZXR1cF9zcGVjdHJ1bSksCisJICAoY2xlYW51cF9zcGVjdHJ1bSksIChHU1RfU1RBUlRfVEVTVCksIChzcGVjdHJ1bV9zdWl0ZSksIChtYWluKToKKwkgIEFkZCBzaW1wbGUgdGVzdCBmb3Igc3BlY3RydW0gZWxlbWVudC4KKworMjAwNy0wNi0yMCAwODoyNjoyMSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvcXRkZW11eC86IEFkZCBNSlBHIHRvIHRoZSB2YXJpYW50cyBvZiBtb3Rpb24ganBlZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlX3NhbXBsZXMpLAorCSAgKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZm91cmNjLmg6CisJICBBZGQgTUpQRyB0byB0aGUgdmFyaWFudHMgb2YgbW90aW9uIGpwZWcuCisKKzIwMDctMDYtMTkgMTY6NDA6NDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHRlc3RzL2NoZWNrLzogQWRkIEdTVF9PUFRJT05fQ0ZMQUdTIHRvIENGTEFHUyB3aGVuIGJ1aWxkaW5nIHVuaXQgdGVzdHMsIHNvIHRoZSBlcnJvciBmbGFncyBhcmUgaW5jbHVkZWQgYW5kIGl0IGVycm9ycy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3Bhbm9yYW1hLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOiAoR1NUX1NUQVJUX1RFU1QpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2ZpbHRlci5jOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZGVjLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2twYXJzZS5jOiAoR1NUX1NUQVJUX1RFU1QpOgorCSAgQWRkIEdTVF9PUFRJT05fQ0ZMQUdTIHRvIENGTEFHUyB3aGVuIGJ1aWxkaW5nIHVuaXQgdGVzdHMsIHNvIHRoZQorCSAgZXJyb3IgZmxhZ3MgYXJlIGluY2x1ZGVkIGFuZCBpdCBlcnJvcnMgb3V0IG9uIGNvbXBpbGVyIHdhcm5pbmdzCisJICBmb3IgQ1ZTIGJ1aWxkczsgcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMgaW4gdmFyaW91cyB1bml0IHRlc3RzLgorCisyMDA3LTA2LTE5IDE0OjQ4OjAzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOiBVc2UgdGhyZWFkc2FmZSBpbmV0X250b3AgdG8gY29udmVydCBhbiBpcCBudW1iZXIgdG8gYSBzdHJpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKHJ0c3BfY29ubmVjdGlvbl9jb25uZWN0KSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fY2xvc2UpLCAocnRzcF9jb25uZWN0aW9uX2ZyZWUpOgorCSAgVXNlIHRocmVhZHNhZmUgaW5ldF9udG9wIHRvIGNvbnZlcnQgYW4gaXAgbnVtYmVyIHRvIGEgc3RyaW5nLgorCSAgRml4ZXMgIzQ0Nzk2MS4KKwkgIERvbid0IGxlYWsgZmQgKGFuZCBpcCkgd2hlbiBmcmVlaW5nIGEgY29ubmVjdGlvbiB3aXRob3V0IGZpcnN0IGNsb3NpbmcKKwkgIGl0LgorCisyMDA3LTA2LTE5IDE0OjExOjQ5ICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC9xdGRlbXV4L0xFR0FMOgorCSAgYWRkICdMRUdBTCcgZmlsZSBkZXNjcmliaW5nIHdoeSB0aGlzIGlzIGluIC1nb29kIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgaXQgbWlnaHQgbmVlZCB0byBtb3ZlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgJ0xFR0FMJyBmaWxlIGRlc2NyaWJpbmcgd2h5IHRoaXMgaXMgaW4gLWdvb2QgYW5kIHVuZGVyIHdoYXQKKwkgIGNpcmN1bXN0YW5jZXMgaXQgbWlnaHQgbmVlZCB0byBtb3ZlLgorCisyMDA3LTA2LTE5IDEwOjQxOjQ5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBCYWNrIHRvIENWUworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEJhY2sgdG8gQ1ZTCisJICAqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkgIEFkZCAwLjEwLjYgdG8gdGhlIGRvYXAgZmlsZS4KKworPT09IHJlbGVhc2UgMC4xMC42ID09PQorCisyMDA3LTA2LTE5IDEwOjI0OjU1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Rpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JhbGFuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMC4xMC42CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJlbGVhc2UgMC4xMC42CisKKzIwMDctMDYtMTggMTc6NTM6MjAgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vY3MucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAwNy0wNi0xNyAxMjozNTowMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogUmV2ZXJ0IHByZXZpb3VzIGNvbW1pdCBhZ2Fpbiwgc2luY2Ugd2UgYXJlIGZyb3plbiAoc29ycnkpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fY29ubmVjdCksCisJICAocnRzcF9jb25uZWN0aW9uX2ZyZWUpOgorCSAgUmV2ZXJ0IHByZXZpb3VzIGNvbW1pdCBhZ2Fpbiwgc2luY2Ugd2UgYXJlIGZyb3plbiAoc29ycnkpLgorCisyMDA3LTA2LTE3IDEyOjI0OjU4ICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogaW5ldF9udG9hKCkgdXNlcyBhIHN0YXRpYyBidWZmZXIgaW50ZXJuYWxseSwgc28gd2UgbmVlZCB0byBjb3B5IHRoZSByZXR1cm5lZCBzdHJpbmcgaWYgd2UgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBQZXRlciBLamVsbGVyc3RlZHQgPHBraiBhdCBheGlzIGNvbT4KKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKHJ0c3BfY29ubmVjdGlvbl9jb25uZWN0KSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fZnJlZSk6CisJICBpbmV0X250b2EoKSB1c2VzIGEgc3RhdGljIGJ1ZmZlciBpbnRlcm5hbGx5LCBzbyB3ZSBuZWVkIHRvIGNvcHkgdGhlCisJICByZXR1cm5lZCBzdHJpbmcgaWYgd2Ugd2FudCB0byBzdG9yZSBpdCBmb3IgbGF0ZXIgKCM0NDc5NjEpLgorCisyMDA3LTA2LTE1IDA5OjEzOjU1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgd2luMzIvdnM2LzogTWFyayAqLmRzcCAmICouZHN3IGFzIGJpbmFyeSBmaWxlcyBhbmQgY29udmVydCB0byBET1MgbGluZSBlbmRpbmdzLCBhcyB0aGV5IGRvbid0IGxvYWQgaW50byBWUzYgY29ycmVjdGx5Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogd2luMzIvdnM2L2F1dG9nZW4uZHNwOgorCSAgKiB3aW4zMi92czYvZ3N0X3BsdWdpbnNfZ29vZC5kc3c6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RhbGF3LmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdGFscGhhLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdGFscGhhY29sb3IuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0YXBldGFnLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdGF1ZGlvZnguZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0YXVwYXJzZS5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RhdXRvZGV0ZWN0LmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdGF2aS5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RjdXR0ZXIuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0ZGlyZWN0ZHJhdy5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RkaXJlY3Rzb3VuZC5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RlZmZlY3R2LmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdGZseC5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3Rnb29tLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdGljeWRlbXV4LmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdGlkM2RlbXV4LmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdGludGVybGVhdmUuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0anBlZy5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RsZXZlbC5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RtYXRyb3NrYS5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RtZWRpYW4uZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0bW9ub3Njb3BlLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdG11bGF3LmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdG11bHRpcGFydC5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RxdGRlbXV4LmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHJ0cC5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RydHNwLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHNtcHRlLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHNwZWV4LmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHVkcC5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3R2aWRlb2JhbGFuY2UuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0dmlkZW9ib3guZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0dmlkZW9jcm9wLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHZpZGVvZmxpcC5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3R2aWRlb21peGVyLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHdhdmVmb3JtLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHdhdmVuYy5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3R3YXZwYXJzZS5kc3A6CisJICBNYXJrICouZHNwICYgKi5kc3cgYXMgYmluYXJ5IGZpbGVzIGFuZCBjb252ZXJ0IHRvIERPUyBsaW5lCisJICBlbmRpbmdzLCBhcyB0aGV5IGRvbid0IGxvYWQgaW50byBWUzYgY29ycmVjdGx5IG90aGVyd2lzZS4KKworMjAwNy0wNi0xNSAwODozMjo1MiArMDAwMCAgVmluY2VudCBUb3JyaSA8dnRvcnJpQHVuaXYtZXZyeS5mcj4KKworCSAgZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogRml4IHRoZSBNaW5nVyBidWlsZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOiAocnRzcF9jb25uZWN0aW9uX2NyZWF0ZSksCisJICAocnRzcF9jb25uZWN0aW9uX2Nvbm5lY3QpOgorCSAgRml4IHRoZSBNaW5nVyBidWlsZC4KKwkgIFBhdGNoIEJ5OiBWaW5jZW50IFRvcnJpIDx2dG9ycmkgYXQgdW5pdi1ldnJ5IGRvdCBmcj4KKwkgIEZpeGVzOiAjNDQ2OTgxCisKKzIwMDctMDYtMTQgMTQ6MDM6NDEgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICB0ZXN0cy86IEh1c2ggdGhlIGJ1aWxkYm90cyB1cAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5jdnNpZ25vcmU6CisJICAqIHRlc3RzL2ljbGVzLy5jdnNpZ25vcmU6CisJICBIdXNoIHRoZSBidWlsZGJvdHMgdXAKKworMjAwNy0wNi0xNCAxMjoxNDoyNCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIE1ha2Ugc3VyZSB0byBkaXN0IGV2ZXJ5dGhpbmcgbmVlZGVkIGZvciB3aW4zMiBidWlsZHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBzeXMvTWFrZWZpbGUuYW06CisJICAqIHN5cy9kaXJlY3RkcmF3L01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZGlyZWN0c291bmQvTWFrZWZpbGUuYW06CisJICAqIHN5cy93YXZlZm9ybS9NYWtlZmlsZS5hbToKKwkgIE1ha2Ugc3VyZSB0byBkaXN0IGV2ZXJ5dGhpbmcgbmVlZGVkIGZvciB3aW4zMiBidWlsZHMuCisKKzIwMDctMDYtMTQgMTA6MjM6MjAgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRm9yIEFNUi1OQiBzdHJlYW1zLCBleHBvcnQgdGhlIEFNUlNwZWNpZmljQm94IGFzIGNvZGVjX2RhdGEgb24gdGhlIGNhcHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIEZvciBBTVItTkIgc3RyZWFtcywgZXhwb3J0IHRoZSBBTVJTcGVjaWZpY0JveCBhcyBjb2RlY19kYXRhIG9uIHRoZQorCSAgY2Fwcy4KKwkgIEZpeGVzICM0NDc0NTgKKworMjAwNy0wNi0xMyAxNzoxMToyNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzogTWFrZSBzdXJlIHdlIGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgZm9yIHRoZSBjb2RlY19kYXRhLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6IChnc3RfcnRwX2gyNjRfZGVwYXlfc2V0Y2Fwcyk6CisJICBNYWtlIHN1cmUgd2UgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIGNvZGVjX2RhdGEuCisJICBGaXhlcyAjNDQ3MjEwLgorCisyMDA3LTA2LTEyIDIxOjA1OjIyICswMDAwICBTw6liYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisKKwkgIHdpbjMyL01BTklGRVNUOiBBZGQgdmlkZW9jcm9wIHByb2plY3QgZmlsZSB0byB0aGUgd2luMzIgbWFuaWZlc3QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogd2luMzIvTUFOSUZFU1Q6CisJICBBZGQgdmlkZW9jcm9wIHByb2plY3QgZmlsZSB0byB0aGUgd2luMzIgbWFuaWZlc3QuCisJICAqIHdpbjMyL3ZzNi9nc3RfcGx1Z2luc19nb29kLmRzdzoKKwkgIEFkZCBxdGRlbXV4LHZpZGVvY3JvcCBhbmQgd2F2ZWZvcm0gcHJvamVjdHMgdG8gdGhlIHdvcmtzcGFjZS4KKwkgICogd2luMzIvdnM2L2xpYmdzdHF0ZGVtdXguZHNwOgorCSAgQWRkIHpsaWIgdG8gdGhlIGxpbmsgbGlzdCBvZiBxdGRlbXV4LgorCSAgKiB3aW4zMi92czYvbGliZ3N0dmlkZW9jcm9wLmRzcDoKKwkgIEFkZCBhIHByb2plY3QgZmlsZSBmb3IgdmlkZW9jcm9wLgorCisyMDA3LTA2LTEyIDIwOjIyOjI2ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgcG8vUE9URklMRVMuaW46IEFkZCBxdGRlbXV4IGZvciB0cmFuc2xhdGlvbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHBvL1BPVEZJTEVTLmluOgorCSAgQWRkIHF0ZGVtdXggZm9yIHRyYW5zbGF0aW9uCisKKzIwMDctMDYtMTIgMjA6MTU6MjkgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBNb3ZlIHZpZGVvY3JvcCBhbmQgb3N4dmlkZW8gZnJvbSAtYmFkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSAgKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICAqIHN5cy9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2ljbGVzL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9pY2xlcy92aWRlb2Nyb3AtdGVzdC5jOgorCSAgTW92ZSB2aWRlb2Nyb3AgYW5kIG9zeHZpZGVvIGZyb20gLWJhZC4KKworMjAwNy0wNi0xMiAxOTozNTowOCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIE1vdmUgcXRkZW11eCBmcm9tIC1iYWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXRkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSAgKiB3aW4zMi9NQU5JRkVTVDoKKwkgIE1vdmUgcXRkZW11eCBmcm9tIC1iYWQuCisJICAqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIFVwZGF0ZSBzcGVjIGZpbGUgdG8gcmVmbGVjdCBtb3Zpbmcgb2YgcXRkZW11eCBhbmQgd2F2cGFjaworCisyMDA3LTA2LTEyIDE5OjAxOjQxICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogd2luMzIvTUFOSUZFU1Q6CisJICBGaXggdHlwbyBpbiB0aGUgY2hhbmdlbG9nIGFuZCBjb21taXQgdGhlIG1hbmlmZXN0IHRvbworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGaXggdHlwbyBpbiB0aGUgY2hhbmdlbG9nIGFuZCBjb21taXQgdGhlIG1hbmlmZXN0IHRvbworCisyMDA3LTA2LTEyIDE4OjUyOjMzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgd2luMzIvTUFOSUZFU1QKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB3aW4zMi9NQU5JRkVTVAorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRpcmVjdGRyYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGlyZWN0c291bmQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZWZvcm0ueG1sOgorCSAgTW92ZSB0aGUgd2F2ZWZvcm0gcGx1Z2luIGZyb20gLWJhZCB0b28uIFVwZGF0ZSB0aGUgaW5zcGVjdCB4bWwKKwkgIGZpbGVzIHRvIG1lbnRpb24gUGx1Z2lucyBHb29kIGluc3RlYWQgb2YgUGx1Z2lucyBCYWQuCisKKzIwMDctMDYtMTIgMTM6MzM6NTYgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSAgUmV0dXJuIGEgY29weSBvZiB0aGUgcG9vbCBidWZmZXIgaWYgYWxsIG1tYXAgYnVmZmVycyBoYXZlIGJlZW4gZGVxdWV1ZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIChnc3RfdjRsMnNyY19ncmFiX2ZyYW1lKTogUmV0dXJuIGEgY29weSBvZiB0aGUgcG9vbCBidWZmZXIgaWYgYWxsCisJICBtbWFwIGJ1ZmZlcnMgaGF2ZSBiZWVuIGRlcXVldWVkLgorCisyMDA3LTA2LTEyIDExOjIzOjAxICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYyAoZ3N0X3Y0bDJfYnVmZmVyX2ZpbmFsaXplKSAoZ3N0X3Y0bDJfYnVmZmVyX2NsYXNzX2luaXQsIGdzdF92NGwyX2J1ZmZlcl9nZXRfdHlwZSkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNy0wNi0xMiAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jIChnc3RfdjRsMl9idWZmZXJfZmluYWxpemUpCisJICAoZ3N0X3Y0bDJfYnVmZmVyX2NsYXNzX2luaXQsIGdzdF92NGwyX2J1ZmZlcl9nZXRfdHlwZSkKKwkgIChnc3RfdjRsMl9idWZmZXJfbmV3KTogQmVoYXZlIG1vcmUgbGlrZSB4aW1hZ2VzaW5rJ3MgYnVmZmVycywgd2l0aAorCSAgZmluYWxpemF0aW9uIGFuZCByZXN1c2NpdGF0aW9uLiBObyBsb25nZXIgcHVibGljLgorCSAgKGdzdF92NGwyX2J1ZmZlcl9wb29sX2ZpbmFsaXplLCBnc3RfdjRsMl9idWZmZXJfcG9vbF9pbml0KQorCSAgKGdzdF92NGwyX2J1ZmZlcl9wb29sX2NsYXNzX2luaXQsIGdzdF92NGwyX2J1ZmZlcl9wb29sX2dldF90eXBlKQorCSAgKGdzdF92NGwyX2J1ZmZlcl9wb29sX25ldywgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfYWN0aXZhdGUpCisJICAoZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfZGVzdHJveSk6IE1ha2UgdGhlIHBvb2wgZm9sbG93IGNvbW1vbgorCSAgbWluaW9iamVjdCBzZW1hbnRpY3MsIGFuZCBiZSB0aHJlYWRzYWZlLgorCSAgKGdzdF92NGwyc3JjX3F1ZXVlX2ZyYW1lKTogUmVtb3ZlIHRoaXMgZnVuY3Rpb24sIGFzIHdlIGp1c3QgY2FsbAorCSAgdGhlIGlvY3RscyBkaXJlY3RseSBpbiB0aGUgdHdvIHBsYWNlcyB3aGVyZSB3ZSBxdWV1ZSBidWZmZXJzLgorCSAgKGdzdF92NGwyc3JjX2dyYWJfZnJhbWUpOiBSZXR1cm4gYSBmbG93cmV0dXJuIGFuZCBmaWxsIHRoZSBidWZmZXIKKwkgIGRpcmVjdGx5LgorCSAgKGdzdF92NGwyc3JjX2NhcHR1cmVfaW5pdCk6IFVzZSB0aGUgbmV3IGJ1ZmZlcl9wb29sX25ldyBmdW5jdGlvbgorCSAgdG8gYWxsb2NhdGUgdGhlIHBvb2wsIHdoaWNoIGFsc28gcHJlYWxsb2NhdGVzIHRoZSBHc3RCdWZmZXJzLgorCSAgKGdzdF92NGwyc3JjX2NhcHR1cmVfc3RhcnQpOiBDYWxsIGJ1ZmZlcl9wb29sX2FjdGl2YXRlIGluc3RlYWQgb2YKKwkgIHF1ZXVlaW5nIHRoZSBmcmFtZXMgZGlyZWN0bHkuCisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuaCAoc3RydWN0IF9Hc3RWNGwyQnVmZmVyUG9vbCk6IE1ha2UgdGhpcyBhCisJICByZWFsIE1pbmlPYmplY3QgaW5zdGVhZCBvZiByb2xsaW5nIG91ciBvd24gcmVmY291bnRpbmcgYW5kCisJICBmaW5hbGl6aW5nLiBHaXZlIGl0IGEgbG9jay4KKwkgIChzdHJ1Y3QgX0dzdFY0bDJCdWZmZXIpOiBSZW1vdmUgb25lIGludGVybWVkaWFyeSBvYmplY3QsIGhhdmluZworCSAgdGhlIGJ1ZmZlcnMgaG9sZCB0aGUgc3RydWN0IHY0bDJfYnVmZmVyIGRpcmVjdGx5LgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmMgKGdzdF92NGwyc3JjX3NldF9jYXBzKTogUGFzcyB0aGUgY2FwcyB0bworCSAgY2FwdHVyZV9pbml0IHNvIHRoYXQgaXQgY2FuIHNldCB0aGVtIG9uIHRoZSBidWZmZXJzIHRoYXQgaXQgd2lsbAorCSAgY3JlYXRlLgorCSAgKGdzdF92NGwyc3JjX2dldF9yZWFkKTogRm9yIGJldHRlciBvciBmb3Igd29yc2UsIGluY2x1ZGUgdGhlCisJICB0aW1lc3RhbXBpbmcgYW5kIG9mZnNldHRpbmcgY29kZSBoZXJlOyByZWFsbHkgd2Ugc2hvdWxkIGJlIHVzaW5nCisJICBidWZmZXJhbGxvYyB0aG91Z2guCisJICAoZ3N0X3Y0bDJzcmNfZ2V0X21tYXApOiBKdXN0IG1ha2UgZ3JhYl9mcmFtZSByZXR1cm4gb25lIG9mIG91cgorCSAgcHJlYWxsb2NhdGVkLCBtbWFwJ2QgYnVmZmVycy4KKworMjAwNy0wNi0xMSAxMTo0MTo1NiArMDAwMCAgZGFuaWVsIGZpc2NoZXIgPGRhbkBmM2MuY29tPgorCisJICBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiBBY3R1YWxseSB1c2UgdGhlIGRpc3BsYXlfbmFtZSBwcm9wZXJ0eSBzbyB0aGF0IHdlIGNhbiBkdW1wIGFueSBhdmFpbGFibGUgWCBkaXNwbGF5LiBGaXhlcyAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IGRhbmllbCBmaXNjaGVyIDxkYW4gYXQgZjNjIGRvdCBjb20+CisJICAqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6IChnc3RfeGltYWdlX3NyY19zdGFydCksCisJICAoZ3N0X3hpbWFnZV9zcmNfZ2V0X2NhcHMpOgorCSAgQWN0dWFsbHkgdXNlIHRoZSBkaXNwbGF5X25hbWUgcHJvcGVydHkgc28gdGhhdCB3ZSBjYW4gZHVtcCBhbnkKKwkgIGF2YWlsYWJsZSBYIGRpc3BsYXkuIEZpeGVzICM0NDU5MDUuCisKKzIwMDctMDYtMTEgMTA6MjE6MTMgKzAwMDAgIFRvbW1pIE15w7Zow6RuZW4gPGV4dC10b21taS5teW9oYW5lbkBub2tpYS5jb20+CisKKwkgIGdzdC9ydHAvOiBBZGQgbWlzc2luZyByYXRlIGZpZWxkcyB0byBjYXBzLiBGaXhlcyAjNDQxMTE4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVG9tbWkgTXnDtmjDpG5lbiAgPGV4dC10b21taSBkb3QgbXlvaGFuZW4gYXQgbm9raWEgZG90IGNvbT4KKwkgICogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzogKGdzdF9ydHBfcGNtYV9kZXBheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzogKGdzdF9ydHBfcGNtdV9kZXBheV9zZXRjYXBzKToKKwkgIEFkZCBtaXNzaW5nIHJhdGUgZmllbGRzIHRvIGNhcHMuIEZpeGVzICM0NDExMTguCisKKzIwMDctMDYtMTAgMjE6MTQ6MTEgKzAwMDAgIFPDqWJhc3RpZW4gTW91dHRlIDxzZWJhc3RpZW5AbW91dHRlLm5ldD4KKworCSAgd2luMzIvOiBBZGQgRGlyZWN0U291bmQgYW5kIERpcmVjdERyYXcgc2lua3MgcHJvamVjdCBmaWxlcyB0byB3b3Jrc3BhY2UgYW5kIHNvbHV0aW9uIGZpbGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHdpbjMyL3ZzNi9nc3RfcGx1Z2luc19nb29kLmRzdzoKKwkgICogd2luMzIvdnM4L2dzdC1wbHVnaW5zLWdvb2Quc2xuOgorCSAgQWRkIERpcmVjdFNvdW5kIGFuZCBEaXJlY3REcmF3IHNpbmtzIHByb2plY3QgZmlsZXMgdG8KKwkgIHdvcmtzcGFjZSBhbmQgc29sdXRpb24gZmlsZXMuCisKKzIwMDctMDYtMTAgMTA6NTM6MjYgKzAwMDAgIEpvc2ggQ29hbHNvbiA8eGZsYWNAeWFob28uY29tPgorCisJICBBZGQgc3VwcG9ydCBmb3IgZmxhYyA+PSAxLjEuMyB3aGljaCBjaGFuZ2VkIHRoZSBBUEkuIEZpeGVzIGJ1ZyAjMzg1ODg3LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSm9zaCBDb2Fsc29uIDx4ZmxhYyBhdCB5YWhvbyBkb3QgY29tPiwKKwkgIHVwZGF0ZWQgYnkgQWxleGlzIEJhbGxpZXIgPGFiYWxsaWVyIGF0IGdlbnRvbyBkb3Qgb3JnPjoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19kZWNfcmVzZXRfZGVjb2RlcnMpLAorCSAgKGdzdF9mbGFjX2RlY19zZXR1cF9zZWVrYWJsZV9kZWNvZGVyKSwKKwkgIChnc3RfZmxhY19kZWNfc2V0dXBfc3RyZWFtX2RlY29kZXIpLCAoZ3N0X2ZsYWNfZGVjX3NlZWspLAorCSAgKGdzdF9mbGFjX2RlY190ZWxsKSwgKGdzdF9mbGFjX2RlY19sZW5ndGgpLCAoZ3N0X2ZsYWNfZGVjX2VvZiksCisJICAoZ3N0X2ZsYWNfZGVjX3JlYWRfc2Vla2FibGUpLCAoZ3N0X2ZsYWNfZGVjX3JlYWRfc3RyZWFtKToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IChnc3RfZmxhY19lbmNfaW5pdCksCisJICAoZ3N0X2ZsYWNfZW5jX2ZpbmFsaXplKSwgKGdzdF9mbGFjX2VuY19zZXRfbWV0YWRhdGEpLAorCSAgKGdzdF9mbGFjX2VuY19zaW5rX3NldGNhcHMpLCAoZ3N0X2ZsYWNfZW5jX3VwZGF0ZV9xdWFsaXR5KSwKKwkgIChnc3RfZmxhY19lbmNfc2Vla19jYWxsYmFjayksIChnc3RfZmxhY19lbmNfd3JpdGVfY2FsbGJhY2spLAorCSAgKGdzdF9mbGFjX2VuY190ZWxsX2NhbGxiYWNrKSwgKGdzdF9mbGFjX2VuY19zaW5rX2V2ZW50KSwKKwkgIChnc3RfZmxhY19lbmNfY2hhaW4pLCAoZ3N0X2ZsYWNfZW5jX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2ZsYWNfZW5jX2dldF9wcm9wZXJ0eSksIChnc3RfZmxhY19lbmNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5oOgorCSAgQWRkIHN1cHBvcnQgZm9yIGZsYWMgPj0gMS4xLjMgd2hpY2ggY2hhbmdlZCB0aGUgQVBJLiBGaXhlcyBidWcgIzM4NTg4Ny4KKworMjAwNy0wNi0wOSAxNTo0MTo1MiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IFJlbW92ZSB3b3JrYXJvdW5kIGZvciBidWcgIzQyMTU0My4gVGhpcyBpcyBmaXhlZCBpbiBjb3JlIDAuMTAuMTMgYW5kIG5vdCBuZWNlc3NhcnkgYW55bW8uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfc2lua19zZXRfY2Fwcyk6CisJICBSZW1vdmUgd29ya2Fyb3VuZCBmb3IgYnVnICM0MjE1NDMuIFRoaXMgaXMgZml4ZWQgaW4gY29yZSAwLjEwLjEzIGFuZAorCSAgbm90IG5lY2Vzc2FyeSBhbnltb3JlIGFzIHdlIG5lZWQgYXQgbGVhc3QgdGhhdCBjb3JlIHZlcnNpb24uCisKKzIwMDctMDYtMDkgMTU6MzM6MzIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svOiBJbXByb3ZlIGRpc2NvbnQgaGFuZGxpbmcgYnkgY2hlY2tpbmcgaWYgdGhlIG5leHQgV2F2cGFjayBibG9jayBoYXMgdGhlIGV4cGVjdGVkLCBmb2xsb3dpbmcgYmxvY2sgaW5kZXguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX3Jlc2V0KSwKKwkgIChnc3Rfd2F2cGFja19kZWNfY2hhaW4pOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmg6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiAoZ3N0X3dhdnBhY2tfcGFyc2VfcmVzZXQpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX3B1c2hfYnVmZmVyKToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmg6CisJICBJbXByb3ZlIGRpc2NvbnQgaGFuZGxpbmcgYnkgY2hlY2tpbmcgaWYgdGhlIG5leHQgV2F2cGFjayBibG9jayBoYXMKKwkgIHRoZSBleHBlY3RlZCwgZm9sbG93aW5nIGJsb2NrIGluZGV4LgorCisyMDA3LTA2LTA4IDIwOjIzOjA3ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkgIG1vYXAgaWdub3JlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIG1vYXAgaWdub3JlCisKKzIwMDctMDYtMDggMjA6MjA6NTYgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYyAoZ3N0X3J0cF9tcDR2cGF5X2RldGFpbHMpOiBGaXggZWxlbWVudCBkZXNjcmlwdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYyAoZ3N0X3J0cF9tcDR2cGF5X2RldGFpbHMpOgorCSAgRml4IGVsZW1lbnQgZGVzY3JpcHRpb24uCisKKzIwMDctMDYtMDggMjA6MTk6NTUgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBtb3ZlIHdhdnBhY2sgcGx1Z2luLiAgU2VlICMzNTI2MDUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5zaWduYWxzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxhZHNwYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJICAqIGV4dC9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBtb3ZlIHdhdnBhY2sgcGx1Z2luLiAgU2VlICMzNTI2MDUuCisKKzIwMDctMDYtMDggMTk6NDU6NDMgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICB0aGUgYWxwaGFiZXQgdHJpcHBpbmcgdXAgcGVvcGxlIHNpbmNlIDEwOTI5QkMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdGhlIGFscGhhYmV0CisJICB0cmlwcGluZyB1cCBwZW9wbGUgc2luY2UgMTA5MjlCQworCisyMDA3LTA2LTA4IDE3OjM3OjAyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgQWRkIERpcmVjdERyYXcgJiBEaXJlY3RTb3VuZCBwbHVnaW5zIHRvIHRoZSBidWlsZCBhbmQgZG9jcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIHN5cy9NYWtlZmlsZS5hbToKKwkgICogd2luMzIvTUFOSUZFU1Q6CisJICBBZGQgRGlyZWN0RHJhdyAmIERpcmVjdFNvdW5kIHBsdWdpbnMgdG8gdGhlIGJ1aWxkIGFuZCBkb2NzLgorCisyMDA3LTA2LTA4IDE2OjMxOjE1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgUmVuYW1lIHRoZSBrZWVwLWFzcGVjdC1yYXRpbyBwcm9wZXJ0eSB0byBmb3JjZS1hc3BlY3QtcmF0aW8gdG8gbWFrZSBpdCBjb25zaXN0ZW50IHdpdGggeHZpbWFnZXNpbmsgYW5kIHhpbWFnZXNpbmsuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLmFyZ3M6CisJICAqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6CisJICAoZ3N0X2RpcmVjdGRyYXdfc2lua19jbGFzc19pbml0KToKKwkgIFJlbmFtZSB0aGUga2VlcC1hc3BlY3QtcmF0aW8gcHJvcGVydHkgdG8gZm9yY2UtYXNwZWN0LXJhdGlvIHRvIG1ha2UKKwkgIGl0IGNvbnNpc3RlbnQgd2l0aCB4dmltYWdlc2luayBhbmQgeGltYWdlc2luay4KKworMjAwNy0wNi0wOCAxMDo0MzoyNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0LzogV2hlbiBvcGVyYXRpbmcgaW4gcHVsbCBtb2RlLCBlcnJvciBvdXQgY29ycmVjdCBvbiBub3QtbGlua2VkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9kdi9nc3RkdmRlbXV4LmM6IChnc3RfZHZkZW11eF9sb29wKToKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogKHVzZXJfcmVhZF9kYXRhKSwgKGdzdF9wbmdkZWNfdGFzayk6CisJICBXaGVuIG9wZXJhdGluZyBpbiBwdWxsIG1vZGUsIGVycm9yIG91dCBjb3JyZWN0IG9uIG5vdC1saW5rZWQuCisKKzIwMDctMDYtMDggMDg6MTI6NDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6IERlZmF1bHQgdG8geHZpbWFnZXNpbmsgaW5zdGVhZCBvZiBhdXRvdmlkZW9zaW5rIHdoaWxlIGF1dG92aWRlb3NpbmsvZ2hvc3RwYWRzL3doYXRldmVyIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6IChtYWluKToKKwkgIERlZmF1bHQgdG8geHZpbWFnZXNpbmsgaW5zdGVhZCBvZiBhdXRvdmlkZW9zaW5rIHdoaWxlCisJICBhdXRvdmlkZW9zaW5rL2dob3N0cGFkcy93aGF0ZXZlciBkb24ndCBoYW5kbGUgdGhlIHdheSB3ZSB1c2UgaXQgaW4KKwkgIHRoZSB3YXkgd2UgZXhwZWN0IGl0IHRvLgorCisyMDA3LTA2LTA2IDEwOjE5OjE3ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYyAoZ3N0X3Y0bDJzcmNfcHJvYmVfY2Fwc19mb3JfZm9ybWF0KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA3LTA2LTA2ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmMgKGdzdF92NGwyc3JjX3Byb2JlX2NhcHNfZm9yX2Zvcm1hdCkKKwkgIChnc3RfdjRsMnNyY19wcm9iZV9jYXBzX2Zvcl9mb3JtYXRfYW5kX3NpemUpOiBPbmx5IHByb2JlIGZvcgorCSAgZm9ybWF0IGFuZCBzaXplIGlmIHRoZSBpb2N0bHMgYXJlIGRlZmluZWQ7IHNob3VsZCBmaXggY29tcGlsYXRpb24KKwkgIG9uIExpbnV4IDwgMi4xNi4xOS4KKworMjAwNy0wNi0wNiAwODo1MzoxMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IFByaW50ZiBmaXhlcyBpbiBkZWJ1ZyBzdGF0ZW1lbnRzOyB1c2UgTE9HIGxldmVsIGZvciBkZWJ1ZyBzdGF0ZW1lbnRzIHRoYXQgYXJlIHByaW50ZWQgZm9yLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X2F5dXZfaTQyMCk6CisJICBQcmludGYgZml4ZXMgaW4gZGVidWcgc3RhdGVtZW50czsgdXNlIExPRyBsZXZlbCBmb3IgZGVidWcgc3RhdGVtZW50cworCSAgdGhhdCBhcmUgcHJpbnRlZCBmb3IgZWFjaCBhbmQgZXZlcnkgZnJhbWU7IGNvbnZlcnQgYysrIGNvbW1lbnRzIHRvCisJICBDLXN0eWxlIGNvbW1lbnRzOyBub3QgbXVjaCBwb2ludCB1c2luZyBnX3RyeV9tYWxsb2MoKSBpZiB3ZSB0aGVuIG5vdAorCSAgZXZlbiBjaGVjayB0aGUgcmV0dXJuIHZhbHVlLgorCisyMDA3LTA2LTA1IDE2OjMyOjE5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IEJ1bXAgcmVxdWlyZW1lbnRzIHRvIHJlbGVhc2VkIHZlcnNpb25zIChjb3JlIGFuZCBiYXNlIDAuMTAuMTMpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEJ1bXAgcmVxdWlyZW1lbnRzIHRvIHJlbGVhc2VkIHZlcnNpb25zIChjb3JlIGFuZCBiYXNlIDAuMTAuMTMpLgorCSAgKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzogKGdzdF9pY3lkZW11eF91bmljb2RpZnkpOgorCSAgVXNlIGdzdF90YWdfdXRmOF9mcm9tX2ZyZWVmb3JtX3N0cmluZygpIGZyb20gbGliZ3N0dGFnIGluc3RlYWQgb2YKKwkgIG93biBpbXBsZW1lbnRhdGlvbi4KKworMjAwNy0wNi0wNSAxNDoxNzoyNSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBzeXMvdjRsMi9nc3R2NGwyc3JjLmMgKGdzdF92NGwyc3JjX3N0YXJ0LCBnc3RfdjRsMnNyY19zdG9wKTogQWRkIHNvbWUgdXNlbGVzcyBjb21tZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNy0wNi0wNSAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jIChnc3RfdjRsMnNyY19zdGFydCwgZ3N0X3Y0bDJzcmNfc3RvcCk6IEFkZAorCSAgc29tZSB1c2VsZXNzIGNvbW1lbnRzLgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmMgKGdzdF92NGwyc3JjX2NhcHR1cmVfaW5pdCk6IERvbid0IHF1ZXVlCisJICBmcmFtZXMgYmVmb3JlIGNhbGxpbmcgU1RSRUFNT04sIHRoYXQgbWlnaHQgbGVhdmUgdGhlbSBpbiBhIHN0YXRlCisJICB3aGVyZSB0aGV5IGNhbid0IGJlIGRlcXVldWVkIGlmIHdlIGdvIGJhY2sgdG8gTlVMTCB3aXRob3V0IGNhbGxpbmcKKwkgIFNUUkVBTU9OLCBhY2NvcmRpbmcgdG8gdGhlIGRvY3MuCisJICAoZ3N0X3Y0bDJzcmNfY2FwdHVyZV9zdGFydCk6IEVucXVldWUgYnVmZmVycyBoZXJlIGluc3RlYWQsIHJpZ2h0CisJICBiZWZvcmUgd2UgY2FsbCBTVFJFQU1PTi4KKwkgIChnc3RfdjRsMnNyY19jYXB0dXJlX2RlaW5pdCk6IFJlbW92ZSBjcmFjayB0byB3b3JrIGFyb3VuZCBkZXF1ZXVlCisJICBmYWlsdXJlcy4gKEZvciBtZSB0aGlzIGNvZGUgaHVuZy4pIFRoZSBwb29sIHJlZmNvdW50aW5nIGlzIHN0aWxsCisJICBjcmFjazsgYWRkZWQgYSBub3RlIHRvIHRoYXQgZWZmZWN0LgorCisyMDA3LTA2LTA1IDA5OjExOjQxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOiBBZGQgc3VwcG9ydCBmb3IgbWFwcGluZyBnc3Qgc3RydWN0dXJlIG5hbWVzIHRvIHRoZSBNSU1FIHR5cGUgZXF1aXZhbGVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOiAoZ3N0X211bHRpcGFydF9tdXhfY2xhc3NfaW5pdCksCisJICAoZ3N0X211bHRpcGFydF9tdXhfZ2V0X21pbWUpLCAoZ3N0X211bHRpcGFydF9tdXhfY29sbGVjdGVkKToKKwkgIEFkZCBzdXBwb3J0IGZvciBtYXBwaW5nIGdzdCBzdHJ1Y3R1cmUgbmFtZXMgdG8gdGhlIE1JTUUgdHlwZSBlcXVpdmFsZW50LgorCSAgSW1wbGVtZW50ZWQgZm9yIGF1ZGlvL3gtbXVsYXctPmF1ZGlvL2Jhc2ljLiBGaXhlcyAjNDQyODc0LgorCisyMDA3LTA2LTAzIDExOjIxOjQ0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLio6IFByb3Blcmx5IHdyaXRlIHdhdiBmaWxlcyB3aXRoIHdpZHRoIT1kZXB0aCBieSBoYXZpbmcgdGhlIGRlcHRoIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZXMgc2V0IGFuZC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChnc3Rfd2F2ZW5jX2NyZWF0ZV9oZWFkZXJfYnVmKSwKKwkgIChnc3Rfd2F2ZW5jX3Npbmtfc2V0Y2FwcyksIChnc3Rfd2F2ZW5jX2Zvcm1hdF9zYW1wbGVzKSwKKwkgIChnc3Rfd2F2ZW5jX2NoYWluKSwgKGdzdF93YXZlbmNfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuaDoKKwkgIFByb3Blcmx5IHdyaXRlIHdhdiBmaWxlcyB3aXRoIHdpZHRoIT1kZXB0aCBieSBoYXZpbmcgdGhlIGRlcHRoIG1vc3QKKwkgIHNpZ25pZmljYW50IGJ5dGVzIHNldCBhbmQgYWxsIG90aGVycyB6ZXJvLiBGaXhlcyAjNDQyNTM1LgorCisyMDA3LTA2LTAxIDEzOjUyOjE3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOiBBZGQgaW5jbHVkZSB0byBtYWtlIGJ1aWxkYm90IGhhcHB5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6CisJICBBZGQgaW5jbHVkZSB0byBtYWtlIGJ1aWxkYm90IGhhcHB5LgorCisyMDA3LTA2LTAxIDEzOjA3OjExICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3J0c3AvOiBJbXByb3ZlcyB2ZXJzaW9uIGNoZWNraW5nLCBhbGxvd2luZyBhbiBSVFNQIHNlcnZlciB0byByZXBseSB3aXRoICI1MDUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFBldGVyIEtqZWxsZXJzdGVkdCAgPHBraiBhdCBheGlzIGNvbT4KKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKHJ0c3BfY29ubmVjdGlvbl9jcmVhdGUpLAorCSAgKHJ0c3BfY29ubmVjdGlvbl9jb25uZWN0KSwgKGFkZF9kYXRlX2hlYWRlciksCisJICAocnRzcF9jb25uZWN0aW9uX3NlbmQpLCAocGFyc2VfcmVzcG9uc2Vfc3RhdHVzKSwKKwkgIChwYXJzZV9yZXF1ZXN0X2xpbmUpLCAocGFyc2VfbGluZSksIChydHNwX2Nvbm5lY3Rpb25fcmVjZWl2ZSk6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmM6IChydHNwX3ZlcnNpb25fYXNfdGV4dCk6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmg6CisJICAqIGdzdC9ydHNwL3J0c3BtZXNzYWdlLmM6IChrZXlfdmFsdWVfZm9yZWFjaCksCisJICAocnRzcF9tZXNzYWdlX2luaXRfcmVxdWVzdCksIChydHNwX21lc3NhZ2VfaW5pdF9yZXNwb25zZSksCisJICAocnRzcF9tZXNzYWdlX3JlbW92ZV9oZWFkZXIpLCAocnRzcF9tZXNzYWdlX2FwcGVuZF9oZWFkZXJzKSwKKwkgIChydHNwX21lc3NhZ2VfZHVtcCk6CisJICAqIGdzdC9ydHNwL3J0c3BtZXNzYWdlLmg6CisJICBJbXByb3ZlcyB2ZXJzaW9uIGNoZWNraW5nLCBhbGxvd2luZyBhbiBSVFNQIHNlcnZlciB0byByZXBseSB3aXRoICI1MDUKKwkgIFJUU1AgVmVyc2lvbiBub3Qgc3VwcG9ydGVkLgorCSAgQWRkcyBhIERhdGUgaGVhZGVyIHRvIGFsbCBtZXNzYWdlcy4KKwkgIFJlcGxpZXMgd2l0aCBSVFNQX0VQQVJTRSByYXRoZXIgdGhhbiBSVFNQX0VJTlZBTElEIGluIGNhc2VzIHdoZXJlIHdlCisJICB3YW50IHRvIGJlIGFibGUgdG8gc2VuZCBhIHJlc3BvbnNlIGV2ZW4gaWYgc29tZXRoaW5nIGluIHRoZSByZXF1ZXN0IHdhcworCSAgaW52YWxpZC4gRUlOVkFMIGlzIG9ubHkgdXNlZCB3aGVuIHBhc3Npbmcgd3JvbmcgYXJndW1lbnRzIHRvIGZ1bmN0aW9ucy4KKwkgIERvIG5vdCBoYW5kbGUgYW4gaW52YWxpZCBtZXRob2QgaW4gcGFyc2VfcmVxdWVzdF9saW5lKCkuIERlZmVyIHRoaXMgdG8KKwkgIHRoZSBjYWxsZXIgc28gaXQgY2FuIHJlc3BvbmQgd2l0aCAiNDA1IE1ldGhvZCBOb3QgQWxsb3dlZCIuCisJICBJbXByb3ZlcyBwYXJzaW5nIG9mIHRoZSB0aW1lb3V0IHBhcmFtZXRlciB0byB0aGUgU2Vzc2lvbiBoZWFkZXIsCisJICBhbGxvd2luZyB3aGl0ZXNwYWNlIGFmdGVyIHRoZSBzZW1pY29sb24uCisJICBBdm9pZHMgYSBjb21waWxlciB3YXJuaW5nIGR1ZSB0byB2YXJpYWJsZXMgc2hhZG93aW5nIGEgZnVuY3Rpb24gYXJndW1lbnQuCisKKzIwMDctMDYtMDEgMTE6MTY6MTcgKzAwMDAgIERhbmllbCBDaGFybGVzIDxkY2hhcmxlc0B0aS5jb20+CisKKwkgIGdzdC9ydHAvOiBBZGQgc3VwcG9ydCBmb3IgQU1SLVdCLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBCYXNlZCBvbiBQYXRjaCBieTogRGFuaWVsIENoYXJsZXMgPGRjaGFybGVzIGF0IHRpIGRvdCBjb20+CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzogKGdzdF9ydHBfYW1yX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfYW1yX2RlcGF5X3Byb2Nlc3MpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6IChnc3RfcnRwX2Ftcl9wYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX2Ftcl9wYXlfY2xhc3NfaW5pdCksIChnc3RfcnRwX2Ftcl9wYXlfaW5pdCksCisJICAoZ3N0X3J0cF9hbXJfcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9hbXJfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5oOgorCSAgQWRkIHN1cHBvcnQgZm9yIEFNUi1XQi4KKwkgIFNtYWxsIGNsZWFudXBzIHN1Y2ggYXMgdXNpbmcgQk9JTEVSUExBVEUuCisKKzIwMDctMDUtMzEgMTU6NTc6MDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL3J0c3BleHR3bXMuYzogRml4IGNvbXBpbGUgd2FybmluZyB3aGVuIGRlYnVnIGlzIGRpc2FibGVkIGFzIHNwb3R0ZWQgYnUgU2F1ciBvbiBJUkMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvcnRzcGV4dHdtcy5jOiAocnRzcF9leHRfd21zX2NvbmZpZ3VyZV9zdHJlYW0pOgorCSAgRml4IGNvbXBpbGUgd2FybmluZyB3aGVuIGRlYnVnIGlzIGRpc2FibGVkIGFzIHNwb3R0ZWQgYnUgU2F1ciBvbiBJUkMuCisKKzIwMDctMDUtMzAgMTQ6NTc6NDQgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSAgc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC4qOiBSZXZlcnQgc29tZSB1bmludGVuZGVkIGNoYW5nZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDctMDUtMzAgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisJICAqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jIChnc3RfdjRsMl9vYmplY3RfbmV3KTogUmV2ZXJ0IHNvbWUKKwkgIHVuaW50ZW5kZWQgY2hhbmdlcy4KKworMjAwNy0wNS0zMCAxNDo0MDo1MyArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLio6IFN0b3JlIHRoZSBmb3JtYXQgbGlzdCBpbiB0aGUgb3JkZXIgdGhhdCB0aGUgZHJpdmVyIGdpdmVzIGl0IHRvIHVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA3LTA1LTMwICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmg6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYyAoZ3N0X3Y0bDJzcmNfZmlsbF9mb3JtYXRfbGlzdCk6IFN0b3JlCisJICB0aGUgZm9ybWF0IGxpc3QgaW4gdGhlIG9yZGVyIHRoYXQgdGhlIGRyaXZlciBnaXZlcyBpdCB0byB1cy4KKwkgIChnc3RfdjRsMnNyY19wcm9iZV9jYXBzX2Zvcl9mb3JtYXRfYW5kX3NpemUpCisJICAoZ3N0X3Y0bDJzcmNfcHJvYmVfY2Fwc19mb3JfZm9ybWF0KTogTmV3IGZ1bmN0aW9ucywgZmlsbCBHc3RDYXBzCisJICBiYXNlZCBvbiB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBkZXZpY2UuCisJICAoZ3N0X3Y0bDJzcmNfZ3JhYl9mcmFtZSk6IFVwZGF0ZSBmb3Igb2JqZWN0IHZhcmlhYmxlIHJlbmFtaW5nLgorCSAgKGdzdF92NGwyc3JjX3NldF9jYXB0dXJlKTogVXBkYXRlIHRvIGJlIHN0cmljdCBpbiBpdHMgcGFyYW1ldGVycywKKwkgIGFzIGluIHRoZSBzZXRfY2FwcyBiZWxvdy4KKwkgIChnc3RfdjRsMnNyY19jYXB0dXJlX2luaXQpOiBVcGRhdGUgZm9yIG9iamVjdCB2YXJpYWJsZSByZW5hbWluZywKKwkgIGFuZCByZWZsb3cuCisJICAoZ3N0X3Y0bDJzcmNfY2FwdHVyZV9zdGFydCwgZ3N0X3Y0bDJzcmNfY2FwdHVyZV9zdG9wKQorCSAgKGdzdF92NGwyc3JjX2NhcHR1cmVfZGVpbml0KTogVXBkYXRlIGZvciBvYmplY3QgdmFyaWFibGUgcmVuYW1pbmcuCisJICAoZ3N0X3Y0bDJzcmNfdXBkYXRlX2ZwcywgZ3N0X3Y0bDJzcmNfc2V0X2ZwcykKKwkgIChnc3RfdjRsMnNyY19nZXRfZnBzKTogUmVtb3ZlOyB0aGVzZSBmdW5jdGlvbnMgZG9uJ3QgaGF2ZSBtdWNoCisJICBtZWFuaW5nIG91dHNpZGUgb2YgYW4gYXRvbWljIHNldF9jYXBzIG1ldGhvZC4KKwkgIChnc3RfdjRsMnNyY19idWZmZXJfbmV3KTogRG9uJ3Qgc2V0IGJ1ZmZlciBkdXJhdGlvbiwgaXQgaXMgbm90CisJICBrbm93bi4KKwkgICogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmMgKGdzdF92NGwyX3R1bmVyX3NldF9jaGFubmVsKTogUmVtb3ZlCisJICBjYWxsIHRvIHVwZGF0ZV9mcHM7IG5vdCBzdXJlIGFib3V0IHRoaXMgY2hhbmdlLgorCSAgKGdzdF92NGwyX3R1bmVyX3NldF9ub3JtKTogV29yayBhcm91bmQgdGhlIGZhY3QgdGhhdCBmb3IgdGhlCisJICBtb21lbnQgd2UgZG9uJ3QgaGF2ZSBhbiB1cGRhdGVfZnBzX2Z1bmMuCisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuaCAoc3RydWN0IF9Hc3RWNGwyU3JjKTogRG9uJ3QgcHV0IHY0bDIKKwkgIHN0cnVjdHVyZXMgaW4gdGhlIG9iamVjdCwganVzdCBzdG9yZSB3aGF0IHdlIG5lZWQuIERvIHN0b3JlIHRoZQorCSAgcHJvYmVkIGNhcHMgb2YgdGhlIGRldmljZS4gRG9uJ3Qgc3RvcmUgdGhlIGN1cnJlbnQgZnJhbWUgcmF0ZS4KKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jIChnc3RfdjRsMnNyY19pbml0KTogUmVtb3ZlIHRoZQorCSAgdXBkYXRlX2Zwc19mdW5jdGlvbiwgZm9yIG5vdy4gVXBkYXRlIGZvciBuZXcgb2JqZWN0IHZhcmlhYmxlCisJICBuYW1pbmcuCisJICAoZ3N0X3Y0bDJzcmNfc2V0X3Byb3BlcnR5LCBnc3RfdjRsMnNyY19nZXRfcHJvcGVydHkpOiBVcGRhdGUgZm9yCisJICBuZXcgb2JqZWN0IHZhcmlhYmxlIG5hbWluZy4KKwkgIChnc3RfdjRsMnNyY192NGwyZm91cmNjX3RvX3N0cnVjdHVyZSk6IFJlbmFtZSBmcm9tIC4uLl90b19jYXBzLgorCSAgKGdzdF92NGwyX3N0cnVjdHVyZV90b192NGwyZm91cmNjKTogUmVuYW1lIGZyb20gLi4uY2Fwc190b18uLi4uCisJICAoZ3N0X3Y0bDJzcmNfZ2V0X2NhcHMpOiBSZXdvcmsgdG8gcHJvYmUgdGhlIGRldmljZSBmb3Igc3VwcG9ydGVkCisJICBmcmFtZSBzaXplcyBhbmQgZnJhbWUgcmF0ZXMuCisJICAoZ3N0X3Y0bDJzcmNfc2V0X2NhcHMpOiBSZXdvcmsgdG8gYmUgc3RyaWN0IGluIHRoZSBnaXZlbgorCSAgcGFyYW1ldGVyczogaWYgc29tZW9uZSBhc2tzIHVzIHRvIGhhdmUgYSBjZXJ0YWluIHNpemUgYW5kIHJhdGUsCisJICB0aGF0IGlzIHdoYXQgd2UgY29uZmlndXJlLgorCSAgKGdzdF92NGwyc3JjX2dldF9yZWFkKTogVXBkYXRlIGZvciBvYmplY3QgdmFyaWFibGUgbmFtaW5nLiBEb24ndAorCSAgbGVhayBidWZmZXJzIG9uIHNob3J0IHJlYWRzLgorCSAgKGdzdF92NGwyc3JjX2dldF9tbWFwKTogVXBkYXRlIGZvciBvYmplY3QgdmFyaWFibGUgbmFtaW5nLCBhbmQgYWRkCisJICBjb21tZW50cy4KKwkgIChnc3RfdjRsMnNyY19jcmVhdGUpOiBVcGRhdGUgZm9yIG9iamVjdCB2YXJpYWJsZSBuYW1pbmcuCisKKzIwMDctMDUtMzAgMTQ6Mzg6NTkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguKjogUGFyc2Ugc3VidGl0bGUgdGV4dCBzdHJlYW1zIGluc3RlYWQgb2YgZXJyb3Jpbmcgb3V0ICgjNDQyMDM0KS4gU3RpbGwgbmVlZHMgYSBwYXJzZXIgZm9yIHRoZSBzdS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfYmFzZV9pbml0KSwKKwkgIChnc3RfYXZpX2RlbXV4X3Jlc2V0KSwgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgUGFyc2Ugc3VidGl0bGUgdGV4dCBzdHJlYW1zIGluc3RlYWQgb2YgZXJyb3Jpbmcgb3V0ICgjNDQyMDM0KS4gU3RpbGwKKwkgIG5lZWRzIGEgcGFyc2VyIGZvciB0aGUgc3VidGl0bGVzIHRvIGFjdHVhbGx5IHNob3cgdXAuCisKKzIwMDctMDUtMzAgMTI6NDY6MzIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogTWFrZSBfcHVzaF9ldmVudCgpIHJldHVybiBUUlVFIGlmIHRoZSBldmVudCBjb3VsZCBiZSBwdXNoZWQgb24gYXQgbGVhc3Qgb25lIHBhZCBhbmQgbm90IG9ubHkgaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcHVzaF9ldmVudCksCisJICAoZ3N0X2F2aV9kZW11eF9sb29wKToKKwkgIE1ha2UgX3B1c2hfZXZlbnQoKSByZXR1cm4gVFJVRSBpZiB0aGUgZXZlbnQgY291bGQgYmUgcHVzaGVkIG9uIGF0CisJICBsZWFzdCBvbmUgcGFkIGFuZCBub3Qgb25seSBpZiBpdCBjb3VsZCBiZSBwdXNoZWQgb24gYWxsIHBhZHMsCisJICBvdGhlcndpc2Ugd2UnbGwgZW5kIHVwIHBvc3RpbmcgYW4gZXJyb3IgbWVzc2FnZSBvbiBFT1MgaWYgb25lIG9yCisJICBtb3JlIHNvdXJjZSBwYWRzIGFyZSBub3QgY29ubmVjdGVkLgorCisyMDA3LTA1LTI4IDE2OjM5OjA5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0LmM6IFVzZSByZW5hbWVkIFJUUCBiaW4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvcnRzcHRyYW5zcG9ydC5jOgorCSAgVXNlIHJlbmFtZWQgUlRQIGJpbi4KKworMjAwNy0wNS0yOCAxNTowMTozMyArMDAwMCAgRGVqYW4gU2FrZWzFoWFrIDxzYWtkZWFuQGdtYWlsLmNvbT4KKworCSAgZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IEFkZCBBWVVWLT5BWVVWIGFuZCBBWVVWLT5JNDIwIGZvcm1hdHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5OiBEZWphbiBTYWtlbMWhYWsgPHNha2RlYW4gYXQgZ21haWwgZG90IGNvbT4KKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X2NsYXNzX2luaXQpLAorCSAgKGdzdF92aWRlb19ib3hfc2V0X3Byb3BlcnR5KSwgKGdzdF92aWRlb19ib3hfdHJhbnNmb3JtX2NhcHMpLAorCSAgKHZpZGVvX2JveF9yZWNhbGNfdHJhbnNmb3JtKSwgKGdzdF92aWRlb19ib3hfc2V0X2NhcHMpLAorCSAgKGdzdF92aWRlb19ib3hfZ2V0X3VuaXRfc2l6ZSksIChnc3RfdmlkZW9fYm94X2FwcGx5X2FscGhhKSwKKwkgIChnc3RfdmlkZW9fYm94X2F5dXZfYXl1diksIChnc3RfdmlkZW9fYm94X2NsZWFyKSwgKFVWZmxvb3IpLAorCSAgKFVWY2VpbCksIChnc3RfdmlkZW9fYm94X2F5dXZfaTQyMCksIChnc3RfdmlkZW9fYm94X2k0MjBfYXl1diksCisJICAoZ3N0X3ZpZGVvX2JveF9pNDIwX2k0MjApLCAoZ3N0X3ZpZGVvX2JveF90cmFuc2Zvcm0pLAorCSAgKHBsdWdpbl9pbml0KToKKwkgIEFkZCBBWVVWLT5BWVVWIGFuZCBBWVVWLT5JNDIwIGZvcm1hdHMuCisJICBGaXggbmVnb3RpYXRpb24gYW5kIEk0MjAtPkFZVVYgY29udmVyc2lvbi4KKwkgIEZpeGVzICM0MjkzMjkuCisKKzIwMDctMDUtMjYgMTU6MjU6MTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiBVc2UgZGlmZmVyZW50IHZhcmlhYmxlcyBmb3IgbmVzdGVkIGZvciBsb29wcyBzbyB0aGF0IHRoZSBvdXRlciBsb29wIGZ1bmN0aW9ucyBwcm9wZXJseSBhbmQgcy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiAoc3BlZXhfZGVjX2NoYWluX3BhcnNlX2RhdGEpOgorCSAgVXNlIGRpZmZlcmVudCB2YXJpYWJsZXMgZm9yIG5lc3RlZCBmb3IgbG9vcHMgc28gdGhhdCB0aGUgb3V0ZXIgbG9vcAorCSAgZnVuY3Rpb25zIHByb3Blcmx5IGFuZCBzcGVleCBmaWxlcyB3aXRoIG11bHRpcGxlIGZyYW1lcyBwZXIgYnVmZmVyIHdvcmsKKwkgIHByb3Blcmx5LgorCSAgRml4ZXMgIzQ0MTQwOC4KKworMjAwNy0wNS0yNSAyMDo1MTozNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IERvbid0IGxlYWsgbmV3c2VnbWVudCBldmVudHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfaWQzZGVtdXhfc2lua19ldmVudCk6CisJICBEb24ndCBsZWFrIG5ld3NlZ21lbnQgZXZlbnRzLgorCisyMDA3LTA1LTI1IDIwOjMzOjEwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvTWFrZWZpbGUuYW06IEFkZCAnLWxtJyB0byBMSUJTIGZvciBjZWlsKCksIGRvbid0IGFzc3VtZSBvbmUgb2Ygb3VyIGRlcGVuZGVuY2llcyBkcmFncyBpdCBpbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvTWFrZWZpbGUuYW06CisJICBBZGQgJy1sbScgdG8gTElCUyBmb3IgY2VpbCgpLCBkb24ndCBhc3N1bWUgb25lIG9mIG91ciBkZXBlbmRlbmNpZXMKKwkgIGRyYWdzIGl0IGluLgorCisyMDA3LTA1LTI1IDE2OjAyOjUxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZW5jLio6IENvbGxlY3QgaGVhZGVycywgYWRkICJzdHJlYW1oZWFkZXIiIGZpZWxkIHRvIG91dHB1dCBjYXBzIGFuZCBzZXQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IChnc3RfZmxhY19lbmNfaW5pdCksCisJICAobm90Z3N0X3ZhbHVlX2FycmF5X2FwcGVuZF9idWZmZXIpLAorCSAgKGdzdF9mbGFjX2VuY19wcm9jZXNzX3N0cmVhbV9oZWFkZXJzKSwKKwkgIChnc3RfZmxhY19lbmNfd3JpdGVfY2FsbGJhY2spLCAoZ3N0X2ZsYWNfZW5jX2NoYWluKSwKKwkgIChnc3RfZmxhY19lbmNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5oOgorCSAgQ29sbGVjdCBoZWFkZXJzLCBhZGQgInN0cmVhbWhlYWRlciIgZmllbGQgdG8gb3V0cHV0IGNhcHMgYW5kIHNldAorCSAgQlVGRkVSX0lOX0NBUFMgZmxhZyBvbiBwdXNoZWQgaGVhZGVyIGJ1ZmZlcnMuIFRoYXQgd2F5IG9nZ211eAorCSAgcHJvZHVjZXMgb3V0cHV0IGFjY29yZGluZyB0byB0aGUgb2ZmaWNpYWwgRkxBQy10by1PZ2cgbWFwcGluZworCSAgaW5zdGVhZCBvZiBjb21wbGV0ZWx5IGJyb2tlbiBmaWxlcy4gRml4ZXMgIzQyNjA0NC4KKworMjAwNy0wNS0yNSAxMDo0NDoxMiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC86IEhhbmRsZSBhbmQgYWRqdXN0IG5ldy1zZWdtZW50IGV2ZW50cyBzbyB0aGF0IGRvd25zdHJlYW0gcmVhbGx5IHNlZXMgYSBzdHJlYW0gd2l0aCB0aGUgdGFnIHBpZWNlcyBzdHJpcHBlZCBvZmYgdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAoZ3N0X2lkM2RlbXV4X3Jlc2V0KSwKKwkgIChnc3RfaWQzZGVtdXhfc2VuZF9uZXdfc2VnbWVudCksIChnc3RfaWQzZGVtdXhfY2hhaW4pLAorCSAgKGdzdF9pZDNkZW11eF9zaW5rX2V2ZW50KToKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4Lmg6CisJICAqIGdzdC9hcGV0YWcvZ3N0dGFnZGVtdXguYzogKGdzdF90YWdfZGVtdXhfcmVzZXQpLAorCSAgKGdzdF90YWdfZGVtdXhfY2hhaW4pLCAoZ3N0X3RhZ19kZW11eF9zaW5rX2V2ZW50KSwKKwkgIChnc3RfdGFnX2RlbXV4X3NlbmRfbmV3X3NlZ21lbnQpOgorCSAgSGFuZGxlIGFuZCBhZGp1c3QgbmV3LXNlZ21lbnQgZXZlbnRzIHNvIHRoYXQgZG93bnN0cmVhbSByZWFsbHkKKwkgIHNlZXMgYSBzdHJlYW0gd2l0aCB0aGUgdGFnIHBpZWNlcyBzdHJpcHBlZCBvZmYgdGhlIGZyb250IGFuZCBiYWNrLgorCSAgRml4ZXMgc3RyYW5nZW5lc3MgaW4gc2Vla2luZyB3aGVuIG1wMyBkZWNvZGVycyB1c2UgdGhlIG5ldy1zZWdtZW50CisJICBieXRlIHBvc2l0aW9uIHRvIGVzdGltYXRlIHRoZWlyIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gdGltZXN0YW1wCisJICBhbmQgdGhlbiB0aGUgYXJyaXZpbmcgYnVmZmVycyBkb24ndCBtYXRjaCB1cC4KKworMjAwNy0wNS0yNSAxMDoyMzo0OSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzogRG9uJ3QgdW5uZWNlc3NhcmlseSBwZXJmb3JtIGEgUkVBRFktPk5VTEwtPlJFQURZIHRyYW5zaXRpb24gb24gdGhlIGRldGVjdGVkIGF1ZGlvIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzogKGdzdF9hdXRvX2F1ZGlvX3NpbmtfZGV0ZWN0KToKKwkgIERvbid0IHVubmVjZXNzYXJpbHkgcGVyZm9ybSBhIFJFQURZLT5OVUxMLT5SRUFEWSB0cmFuc2l0aW9uIG9uIHRoZQorCSAgZGV0ZWN0ZWQgYXVkaW8gc2luayB3aGVuIHN0YXJ0aW5nIHVwLiBGaXhlczogIzQ0MDEyNworCisyMDA3LTA1LTI0IDE3OjAwOjIxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IERvbid0IGNyYXNoIGluIGNoYWluIGZ1bmN0aW9uIGlmIHNldGNhcHMgaGFzbid0IGJlZW4gY2FsbGVkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzogKGdzdF9mbGFjX2VuY19zaW5rX3NldGNhcHMpLAorCSAgKGdzdF9mbGFjX2VuY19jaGFpbik6CisJICBEb24ndCBjcmFzaCBpbiBjaGFpbiBmdW5jdGlvbiBpZiBzZXRjYXBzIGhhc24ndCBiZWVuIGNhbGxlZC4KKworMjAwNy0wNS0yNCAwODozNToyMyArMDAwMCAgVmluY2VudCBUb3JyaSA8dnRvcnJpQHVuaXYtZXZyeS5mcj4KKworCSAgc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuKjogRml4IG1vcmUgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aCBNaW5nVyAoIzQzOTkxNCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBWaW5jZW50IFRvcnJpICA8dnRvcnJpIGF0IHVuaXYtZXZyeSBmcj4KKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkgIChnc3RfZGlyZWN0ZHJhd19zaW5rX2J1ZmZlcl9hbGxvYyksCisJICAoZ3N0X2RpcmVjdGRyYXdfc2lua19zaG93X2ZyYW1lKSwKKwkgIChnc3RfZGlyZWN0ZHJhd19zaW5rX2NoZWNrX3ByaW1hcnlfc3VyZmFjZSksCisJICAoZ3N0X2RpcmVjdGRyYXdfc2lua19jaGVja19vZmZzY3JlZW5fc3VyZmFjZSksCisJICAoRW51bU1vZGVzQ2FsbGJhY2syKSwgKGdzdF9kaXJlY3RkcmF3X3NpbmtfZ2V0X2RkcmF3Y2FwcyksCisJICAoZ3N0X2RpcmVjdGRyYXdfc2lua19zdXJmYWNlX2NyZWF0ZSk6CisJICAqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmg6CisJICBGaXggbW9yZSB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyB3aXRoIE1pbmdXICgjNDM5OTE0KS4KKworMjAwNy0wNS0yNCAwODoxNDowMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBJbml0IHZhbHVlIHRvIGF2b2lkIGluZmludGUgbG9vcHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfcGFyc2VfbWV0aG9kcyk6CisJICBJbml0IHZhbHVlIHRvIGF2b2lkIGluZmludGUgbG9vcHMuCisKKzIwMDctMDUtMjQgMDg6MTA6NDIgKzAwMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJICBnc3QvcnRzcC86IEZpeCBmb3IgbmV3IEFQSS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFBldGVyIEtqZWxsZXJzdGVkdCAgPHBraiBhdCBheGlzIGNvbT4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc2V0dXBfYXV0aCksCisJICAoZ3N0X3J0c3BzcmNfdHJ5X3NlbmQpLCAoZ3N0X3J0c3BzcmNfcGFyc2VfbWV0aG9kcyksCisJICAoZ3N0X3J0c3BzcmNfc2V0dXBfc3RyZWFtcyksIChnc3RfcnRzcHNyY19vcGVuKSwKKwkgIChnc3RfcnRzcHNyY19wbGF5KToKKwkgIChydHNwX2Nvbm5lY3Rpb25fc2VuZCksIChydHNwX2Nvbm5lY3Rpb25fcmVjZWl2ZSk6CisJICAqIGdzdC9ydHNwL3J0c3BleHR3bXMuYzogKHJ0c3BfZXh0X3dtc19hZnRlcl9zZW5kKToKKwkgIEZpeCBmb3IgbmV3IEFQSS4KKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKGFkZF9hdXRoX2hlYWRlciksCisJICBPbmx5IGFkZCBhdXRob3Jpc2F0aW9uIGFuZCBzZXNzaW9uIGhlYWRlcnMgd2hlbiBzZW5kaW5nIG1lc3NhZ2VzLgorCSAgKiBnc3QvcnRzcC9ydHNwbWVzc2FnZS5jOiAoa2V5X3ZhbHVlX2ZvcmVhY2gpLCAocnRzcF9tZXNzYWdlX2luaXQpLAorCSAgKHJ0c3BfbWVzc2FnZV9pbml0X3JlcXVlc3QpLCAocnRzcF9tZXNzYWdlX2luaXRfcmVzcG9uc2UpLAorCSAgKHJ0c3BfbWVzc2FnZV91bnNldCksIChydHNwX21lc3NhZ2VfYWRkX2hlYWRlciksCisJICAocnRzcF9tZXNzYWdlX3JlbW92ZV9oZWFkZXIpLCAocnRzcF9tZXNzYWdlX2dldF9oZWFkZXIpLAorCSAgKHJ0c3BfbWVzc2FnZV9hcHBlbmRfaGVhZGVycyksIChkdW1wX2tleV92YWx1ZSksCisJICAocnRzcF9tZXNzYWdlX2R1bXApOgorCSAgKiBnc3QvcnRzcC9ydHNwbWVzc2FnZS5oOgorCSAgQWRkIHN1cHBvcnQgZm9yIG11bHRpcGxlIGhlYWRlcnMgb2YgdGhlIHNhbWUgdHlwZSBieSBzdG9yaW5nIHRoZSBwYXJzZWQKKwkgIGhlYWRlcnMgaW4gYSBHQXJyYXkgaW5zdGFlZCBvZiBhIGhhc2h0YWJsZS4KKworMjAwNy0wNS0yMyAyMjo0NDoxMiArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuYXJnczogUmVtb3ZlIGRpcmVjdHNvdW5kc2luayBwcm9wZXJ0eSBkb2MgYXMgdGhpcyBzaW5rIHVzZSB0aGUgbWl4ZXIgaW50ZXJmYWNlIG5vdy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuYXJnczoKKwkgIFJlbW92ZSBkaXJlY3Rzb3VuZHNpbmsgcHJvcGVydHkgZG9jIGFzIHRoaXMgc2luayB1c2UgdGhlIG1peGVyCisJICBpbnRlcmZhY2Ugbm93LgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgIEFkZCBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IFdpbmRvd3Mgc2lua3MuCisJICAqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgICogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5oOgorCSAgUmVtb3ZlIGRpcmVjdHNvdW5kc2luayBwcm9wZXJ0eSAgYW5kIGltcGxlbWVudCB0aGUgbWl4ZXIgaW50ZXJmYWNlLgorCSAgKiB3aW4zMi92czYvZ3N0X3BsdWdpbnNfYmFkLmRzdzoKKwkgICogd2luMzIvdnM2L2xpYmdzdGRpcmVjdHNvdW5kLmRzcDoKKwkgIFVwZGF0ZSBwcm9qZWN0IGZpbGVzLgorCSAgKiBnc3QtbGlicy9nc3QvZHNob3cvZ3N0ZHNob3cuY3BwOgorCSAgKiBnc3QtbGlicy9nc3QvZHNob3cvZ3N0ZHNob3cuaDoKKwkgICogZ3N0LWxpYnMvZ3N0L2RzaG93L2dzdGRzaG93ZmFrZXNpbmsuY3BwOgorCSAgKiBnc3QtbGlicy9nc3QvZHNob3cvZ3N0ZHNob3dmYWtlc2luay5oOgorCSAgKiBnc3QtbGlicy9nc3QvZHNob3cvZ3N0ZHNob3dmYWtlc3JjLmNwcDoKKwkgICogZ3N0LWxpYnMvZ3N0L2RzaG93L2dzdGRzaG93ZmFrZXNyYy5oOgorCSAgKiBnc3QtbGlicy9nc3QvZHNob3cvZ3N0ZHNob3dpbnRlcmZhY2UuY3BwOgorCSAgKiBnc3QtbGlicy9nc3QvZHNob3cvZ3N0ZHNob3dpbnRlcmZhY2UuaDoKKwkgICogd2luMzIvY29tbW9uL2xpYmdzdGRzaG93LmRlZjoKKwkgICogd2luMzIvdnM2L2xpYmdzdGRzaG93LmRzcDoKKwkgIEFkZCBhIG5ldyBnc3QgbGlicmFyeSB3aGljaCBhbGxvdyB0byBjcmVhdGUgaW50ZXJuYWwgRGlyZWN0IFNob3cKKwkgIGdyYXBoIChwaXBlbGluZXMpIHRvIHdyYXAgV2luZG93cyBzb3VyY2VzLCBkZWNvZGVycyBvciBlbmNvZGVycy4KKwkgIEl0IGluY2x1ZGVzIGEgRGlyZWN0U2hvdyBmYWtlIHNvdXJjZSBhbmQgc2luayBhbmQgdXRpbGl0eSBmdW5jdGlvbnMuCisJICAqIHN5cy9kc2hvd3NyY3dyYXBwZXIvZ3N0ZHNob3dhdWRpb3NyYy5jOgorCSAgKiBzeXMvZHNob3dzcmN3cmFwcGVyL2dzdGRzaG93YXVkaW9zcmMuaDoKKwkgICogc3lzL2RzaG93c3Jjd3JhcHBlci9nc3Rkc2hvd3NyY3dyYXBwZXIuYzoKKwkgICogc3lzL2RzaG93c3Jjd3JhcHBlci9nc3Rkc2hvd3NyY3dyYXBwZXIuaDoKKwkgICogc3lzL2RzaG93c3Jjd3JhcHBlci9nc3Rkc2hvd3ZpZGVvc3JjLmM6CisJICAqIHN5cy9kc2hvd3NyY3dyYXBwZXIvZ3N0ZHNob3d2aWRlb3NyYy5oOgorCSAgKiB3aW4zMi92czYvbGliZHNob3dzcmN3cmFwcGVyLmRzcDoKKwkgIEFkZCBhIG5ldyBwbHVnaW4gdG8gd3JhcCBEaXJlY3RTaG93IHNvdXJjZXMgb24gV2luZG93cy4KKwkgIEl0IGdldHMgZGF0YSBmcm9tIGFueSB3ZWJjYW0sIGR2IGNhbSwgbWljcm8uIFdlIGNvdWxkIGFkZAorCSAgdHYgdHVubmVyIGNhcmQgbGF0ZXIuCisKKzIwMDctMDUtMjIgMTE6MTQ6MTMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBEZXBlbmQgb24gZ3N0cmVhbWVyLTAuMTAuMTIuMS4gZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYyAoQVJHX0JBTkRfV0lEVEgsIF9kb19pbml0LCBBUkdfR0FJTiwgX0dzLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgRGVwZW5kIG9uIGdzdHJlYW1lci0wLjEwLjEyLjEuCisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmMgKEFSR19CQU5EX1dJRFRILCBfZG9faW5pdCwgQVJHX0dBSU4sCisJICBfR3N0SWlyRXF1YWxpemVyQmFuZCwgb2JqZWN0LCBfR3N0SWlyRXF1YWxpemVyQmFuZENsYXNzLAorCSAgcGFyZW50X2NsYXNzLCBnc3RfaWlyX2VxdWFsaXplcl9iYW5kX3NldF9wcm9wZXJ0eSwKKwkgIGdzdF9paXJfZXF1YWxpemVyX2JhbmRfY2xhc3NfaW5pdCwgZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9nZXRfdHlwZSwKKwkgIGdzdF9paXJfZXF1YWxpemVyX2NoaWxkX3Byb3h5X2dldF9jaGlsZF9ieV9pbmRleCwKKwkgIGdzdF9paXJfZXF1YWxpemVyX2NoaWxkX3Byb3h5X2dldF9jaGlsZHJlbl9jb3VudCwKKwkgIGdzdF9paXJfZXF1YWxpemVyX2NoaWxkX3Byb3h5X2ludGVyZmFjZV9pbml0LCBzZXR1cF9maWx0ZXIsCisJICBnc3RfaWlyX2VxdWFsaXplcl9jb21wdXRlX2ZyZXF1ZW5jaWVzLAorCSAgZ3N0X2lpcl9lcXVhbGl6ZXJfc2V0X3Byb3BlcnR5LCBnc3RfaWlyX2VxdWFsaXplcl9nZXRfcHJvcGVydHksCisJICBwbHVnaW5faW5pdCk6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmggKGF1ZGlvZmlsdGVyKToKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXJuYmFuZHMuYyAoQVJHX05VTV9CQU5EUywKKwkgIGdzdF9paXJfZXF1YWxpemVyX25iYW5kc19iYXNlX2luaXQsIGdzdF9paXJfZXF1YWxpemVyX25iYW5kc19pbml0LAorCSAgZ3N0X2lpcl9lcXVhbGl6ZXJfbmJhbmRzX3NldF9wcm9wZXJ0eSk6CisJICBVc2UgbmV3IGxvY2tpbmcgbWFjcm9zLgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYyAoYnB3c2luY19zZXRfY2Fwcyk6CisJICBBZGQgZml4bWUuCisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jIChTUEVDVFJVTV9XSU5ET1dfQkFTRSwKKwkgIFNQRUNUUlVNX1dJTkRPV19MRU4sIGdzdF9zcGVjdHJ1bV9pbml0LCBnc3Rfc3BlY3RydW1fc2V0X3Byb3BlcnR5LAorCSAgZ3N0X3NwZWN0cnVtX2V2ZW50LCBnc3Rfc3BlY3RydW1fdHJhbnNmb3JtX2lwKToKKwkgIFVzZSBuZXcgbG9ja2luZyBtYWNyb3MuIFR1cm4gdHdvIGZpeGVkIHZhbHVlcyBpbnRvICNkZWZpbmVzLgorCisyMDA3LTA1LTIyIDExOjAzOjMwICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06IEFsc28gbG9vayBmb3IgLm0gKG9iamVjdGl2ZWMpIGZpbGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgIEFsc28gbG9vayBmb3IgLm0gKG9iamVjdGl2ZWMpIGZpbGVzLgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuYXJnczoKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgQWRkIGRvY3VtZW50YXRpb24gZm9yIGVsZW1lbnQgYW5kIHByb3BlcnRpZXMuCisKKzIwMDctMDUtMjEgMTQ6MDE6MTYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgQ2hhbmdlTG9nOiBDaGFuZ2VMb2cgc3VyZ2VyeS4gZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYyAoQVJHX0JBTkRfV0lEVEgsIF9kb19pbml0LCBBUkdfR0FJTiwgX0dzdElpckVxdWFsaXplckJhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogQ2hhbmdlTG9nOgorCSAgQ2hhbmdlTG9nIHN1cmdlcnkuCisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmMgKEFSR19CQU5EX1dJRFRILCBfZG9faW5pdCwgQVJHX0dBSU4sCisJICBfR3N0SWlyRXF1YWxpemVyQmFuZCwgb2JqZWN0LCBfR3N0SWlyRXF1YWxpemVyQmFuZENsYXNzLAorCSAgcGFyZW50X2NsYXNzLCBnc3RfaWlyX2VxdWFsaXplcl9iYW5kX3NldF9wcm9wZXJ0eSwKKwkgIGdzdF9paXJfZXF1YWxpemVyX2JhbmRfY2xhc3NfaW5pdCwgZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9nZXRfdHlwZSwKKwkgIGdzdF9paXJfZXF1YWxpemVyX2NoaWxkX3Byb3h5X2dldF9jaGlsZF9ieV9pbmRleCwKKwkgIGdzdF9paXJfZXF1YWxpemVyX2NoaWxkX3Byb3h5X2dldF9jaGlsZHJlbl9jb3VudCwKKwkgIGdzdF9paXJfZXF1YWxpemVyX2NoaWxkX3Byb3h5X2ludGVyZmFjZV9pbml0LCBzZXR1cF9maWx0ZXIsCisJICBnc3RfaWlyX2VxdWFsaXplcl9jb21wdXRlX2ZyZXF1ZW5jaWVzLCBwbHVnaW5faW5pdCk6CisJICAqIHRlc3RzL2ljbGVzL2VxdWFsaXplci10ZXN0LmM6CisJICBBZGQgZml4bWUgYW5kIGNvbW1lbnQgZm9yIGV4YW1wbGUuCisKKzIwMDctMDUtMjEgMTI6NDM6MzcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYyAoZ3N0X3NwZWN0cnVtX3NldF9wcm9wZXJ0eSwgZ3N0X3NwZWN0cnVtX2V2ZW50LCBnc3Rfc3BlY3RydW1fdHJhbnNmb3JtX2lwKToKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYyAoZ3N0X3NwZWN0cnVtX3NldF9wcm9wZXJ0eSwKKwkgIGdzdF9zcGVjdHJ1bV9ldmVudCwgZ3N0X3NwZWN0cnVtX3RyYW5zZm9ybV9pcCk6CisJICBVc2UgbG9jayB0byBwcm90ZWN0IGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisKKzIwMDctMDUtMjEgMTE6Mzc6MTYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOiBTcGVjaWZ5IGFuZCB1c2UgcHJvcGVydGllcyBhcyB1bnNpZ25lZCBpbnQgdGhhdCBhcmUgYW4gdW5zaWduZWQgaW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogKGdzdF93YXZwYWNrX2VuY19jbGFzc19pbml0KSwKKwkgIChnc3Rfd2F2cGFja19lbmNfc2V0X3Byb3BlcnR5KSwgKGdzdF93YXZwYWNrX2VuY19nZXRfcHJvcGVydHkpOgorCSAgU3BlY2lmeSBhbmQgdXNlIHByb3BlcnRpZXMgYXMgdW5zaWduZWQgaW50IHRoYXQgYXJlIGFuIHVuc2lnbmVkIGludC4KKworMjAwNy0wNS0yMSAxMToxNzoyMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLio6IEZpeHVwIGRvY3MsIG1ha2UgdGhlIGJpdHJhdGUgcHJvcGVydHkgYW4gaW50IGFzIGl0IHNob3VsZCBiZSBhbmQgYWxsb3cgdG8gc2V0IHRoZSBkaWZmZXIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3dhdnBhY2tfZW5jX2luaXQpLCAoZ3N0X3dhdnBhY2tfZW5jX3NldF93cF9jb25maWcpLAorCSAgKGdzdF93YXZwYWNrX2VuY19zZXRfcHJvcGVydHkpLCAoZ3N0X3dhdnBhY2tfZW5jX2dldF9wcm9wZXJ0eSk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuaDoKKwkgIEZpeHVwIGRvY3MsIG1ha2UgdGhlIGJpdHJhdGUgcHJvcGVydHkgYW4gaW50IGFzIGl0IHNob3VsZCBiZSBhbmQKKwkgIGFsbG93IHRvIHNldCB0aGUgZGlmZmVyZW50IGV4dHJhIHByb2Nlc3NpbmcgbW9kZXMgaW5zdGVhZCBvZiBvbmx5CisJICBhbGxvd2luZyBub25lIGFuZCB0aGUgZGVmYXVsdCBvbmUuCisKKzIwMDctMDUtMjEgMTA6MDc6MDUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IFNpbmNlIHdlIGRlcGVuZCBvbiAwLjEwLjEzIC1jb3JlLCBvdmVycmlkZSB0aGUgdW5sb2NrX3N0b3Agdm1ldGhvZCBmb3Igc2FmZXIgc2h1dGRvd24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3VkcHNyY19jcmVhdGUpLCAoZ3N0X3VkcHNyY191bmxvY2spLCAoZ3N0X3VkcHNyY191bmxvY2tfc3RvcCk6CisJICBTaW5jZSB3ZSBkZXBlbmQgb24gMC4xMC4xMyAtY29yZSwgb3ZlcnJpZGUgdGhlIHVubG9ja19zdG9wIHZtZXRob2QgZm9yCisJICBzYWZlciBzaHV0ZG93bi4KKworMjAwNy0wNS0yMSAxMDowMzo0MiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRwZGVjLio6IEFkZGVkIHNpZ25hbCBmb3IgYmFja3dhcmRzIGNvbXBhdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuYzogKGdzdF9ydHBfZGVjX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuaDoKKwkgIEFkZGVkIHNpZ25hbCBmb3IgYmFja3dhcmRzIGNvbXBhdC4KKworMjAwNy0wNS0yMSAwOTozMjoyNiArMDAwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSAgVXNlIGF1ZGlvY29udmVydCBmb3IgY29udmVydGluZyBmcm9tIG5vbi1uYXRpdmUgZW5kaWFubmVzcyBmbG9hdHMgaW4gYXVwYXJzZSBpbnN0ZWFkIG9mIGRvaW5nIGl0IG91cnNlbGYuIEZpeGVzICM0MjQ1MjcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBSZW7DqSBTdGFkbGVyIDxtYWlsIGF0IHJlbmVzdGFkbGVyIGRvdCBkZT4KKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6IChnc3RfYXVfcGFyc2VfcmVzZXQpLAorCSAgKGdzdF9hdV9wYXJzZV9wYXJzZV9oZWFkZXIpLCAoZ3N0X2F1X3BhcnNlX2NoYWluKToKKwkgICogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5oOgorCSAgVXNlIGF1ZGlvY29udmVydCBmb3IgY29udmVydGluZyBmcm9tIG5vbi1uYXRpdmUgZW5kaWFubmVzcyBmbG9hdHMKKwkgIGluIGF1cGFyc2UgaW5zdGVhZCBvZiBkb2luZyBpdCBvdXJzZWxmLiBGaXhlcyAjNDI0NTI3LgorCSAgVGhpcyBuZWVkcyB0aGUgYXVkaW9jb252ZXJ0IGZyb20gcGx1Z2lucy1iYXNlIENWUy4KKworMjAwNy0wNS0yMSAwOToyOTozMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOiBGaXggZW51bSByZWdpc3RyYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOiAoZ3N0X2ZyYWdtZW50YXRpb25fbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X3J0cF9oMjYzcF9wYXlfZmx1c2gpOgorCSAgRml4IGVudW0gcmVnaXN0cmF0aW9uLgorCisyMDA3LTA1LTIxIDA4OjU3OjE4ICswMDAwICBBbnRvaW5lIFRyZW1ibGF5IDxoZXhhMDBAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5Lio6IEFkZCBuZXcgZnJhZ21lbnRhdGlvbiBtb2RlIGJhc2Ugb24gR09CIGhlYWRlcnMuIEZpeGVzICM0Mzg5NDAuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBBbnRvaW5lIFRyZW1ibGF5IDxoZXhhMDAgYXQgZ21haWwgZG90IGNvbT4KKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOiAoZ3N0X2ZyYWdtZW50YXRpb25fbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X3J0cF9oMjYzcF9wYXlfY2xhc3NfaW5pdCksIChnc3RfcnRwX2gyNjNwX3BheV9pbml0KSwKKwkgIChnc3RfcnRwX2gyNjNwX3BheV9zZXRfcHJvcGVydHkpLCAoZ3N0X3J0cF9oMjYzcF9wYXlfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX2gyNjNwX3BheV9mbHVzaCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuaDoKKwkgIEFkZCBuZXcgZnJhZ21lbnRhdGlvbiBtb2RlIGJhc2Ugb24gR09CIGhlYWRlcnMuIEZpeGVzICM0Mzg5NDAuCisKKzIwMDctMDUtMjAgMjE6MzE6NTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOiBBZGQgbWlzc2luZyBhdWRpb2NvbnZlcnRzIGluIHRoZSBleGFtcGxlIHBpcGVsaW5lcyBvZiB3YXZwYWNrZW5jLiBBcyB0aGUgd2F2cGFjayBzdHVmZiBuLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOgorCSAgQWRkIG1pc3NpbmcgYXVkaW9jb252ZXJ0cyBpbiB0aGUgZXhhbXBsZSBwaXBlbGluZXMgb2Ygd2F2cGFja2VuYy4gQXMKKwkgIHRoZSB3YXZwYWNrIHN0dWZmIG5vdyBuZWVkcyBpbnB1dCB3aXRoIDMyIGJpdCB3aWR0aCAoYW5kIHJhbmRvbSBkZXB0aCkKKwkgIHRoaXMgaXMgbmVlZGVkIG5vdy4gVGhlIGV4YW1wbGUgcGlwZWxpbmVzIGZvciB0aGUgcGFyc2VyIGFuZCBkZWNvZGVyCisJICBhcmUgc3RpbGwgZmluZS4KKworMjAwNy0wNS0yMCAxNDo1OTo0NiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzogQnVuY2ggb2Ygc21hbGwgZml4ZXM6IHJlbW92ZSBzdGF0aWMgZnVuY3Rpb24gdGhhdCBkb2Vzbid0IGV4aXN0OyBkZWNsYXJlIGFub3RoZXIgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzogKGdzdF9kZHJhd3N1cmZhY2VfZmluYWxpemUpLAorCSAgKGdzdF9kaXJlY3RkcmF3X3NpbmtfYnVmZmVyX2FsbG9jKSwKKwkgIChnc3RfZGlyZWN0ZHJhd19zaW5rX2dldF9kZHJhd2NhcHMpLAorCSAgKGdzdF9kaXJlY3RkcmF3X3Npbmtfc3VyZmFjZV9jcmVhdGUpOgorCSAgQnVuY2ggb2Ygc21hbGwgZml4ZXM6IHJlbW92ZSBzdGF0aWMgZnVuY3Rpb24gdGhhdCBkb2Vzbid0IGV4aXN0OworCSAgZGVjbGFyZSBhbm90aGVyIG9uZSB0aGF0IGRvZXM7IHByaW50ZiBmb3JtYXQgZml4OyB1c2UgcmlnaHQgbWFjcm8KKwkgIHdoZW4gc3BlY2lmeWluZyBkZWJ1ZyBjYXRlZ29yeTsgcmVtb3ZlIGEgYnVuY2ggb2YgdW51c2VkIHZhcmlhYmxlczsKKwkgICNpZiAwIG91dCBhbiB1bnVzZWQgY2h1bmsgb2YgY29kZSAocGFydGlhbGx5IGZpeGVzICM0Mzk5MTQpLgorCisyMDA3LTA1LTIwIDE0OjE0OjQ5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvOiBQcmludGYgZm9ybWF0IGZpeGVzICgjNDM5OTEwLCAjNDM5OTExKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9wcmVwYXJlX2N1cnJlbnRfc2FtcGxlKToKKwkgICogZ3N0L3N3aXRjaC9nc3Rzd2l0Y2guYzogKGdzdF9zd2l0Y2hfY2hhaW4pOgorCSAgUHJpbnRmIGZvcm1hdCBmaXhlcyAoIzQzOTkxMCwgIzQzOTkxMSkuCisKKzIwMDctMDUtMjAgMTQ6MDU6NDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogUHJpbnRmIGZvcm1hdCBmaXguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfbG9vcF91ZHApOgorCSAgUHJpbnRmIGZvcm1hdCBmaXguCisKKzIwMDctMDUtMTkgMTA6MDE6NDUgKzAwMDAgIFJlbsOpIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisKKwkgIEFkZCByZXBsYXlnYWluIHBsYXliYWNrIGVsZW1lbnRzICgjNDEyNzEwKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFJlbsOpIFN0YWRsZXIgPG1haWwgYXQgcmVuZXN0YWRsZXIgZGU+CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3JlcGxheWdhaW4vZ3N0cmdhbmFseXNpcy5jOiAoZ3N0X3JnX2FuYWx5c2lzX2NsYXNzX2luaXQpLAorCSAgKGdzdF9yZ19hbmFseXNpc19zdGFydCksIChnc3RfcmdfYW5hbHlzaXNfc2V0X2NhcHMpLAorCSAgKGdzdF9yZ19hbmFseXNpc190cmFuc2Zvcm1faXApLCAoZ3N0X3JnX2FuYWx5c2lzX2V2ZW50KSwKKwkgIChnc3RfcmdfYW5hbHlzaXNfc3RvcCksIChnc3RfcmdfYW5hbHlzaXNfaGFuZGxlX3RhZ3MpLAorCSAgKGdzdF9yZ19hbmFseXNpc19oYW5kbGVfZW9zKSwgKGdzdF9yZ19hbmFseXNpc190cmFja19yZXN1bHQpLAorCSAgKGdzdF9yZ19hbmFseXNpc19hbGJ1bV9yZXN1bHQpOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmg6CisJICAqIGdzdC9yZXBsYXlnYWluL2dzdHJnbGltaXRlci5jOiAoZ3N0X3JnX2xpbWl0ZXJfYmFzZV9pbml0KSwKKwkgIChnc3RfcmdfbGltaXRlcl9jbGFzc19pbml0KSwgKGdzdF9yZ19saW1pdGVyX2luaXQpLAorCSAgKGdzdF9yZ19saW1pdGVyX3NldF9wcm9wZXJ0eSksIChnc3RfcmdfbGltaXRlcl9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9yZ19saW1pdGVyX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9yZXBsYXlnYWluL2dzdHJnbGltaXRlci5oOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ3ZvbHVtZS5jOiAoZ3N0X3JnX3ZvbHVtZV9iYXNlX2luaXQpLAorCSAgKGdzdF9yZ192b2x1bWVfY2xhc3NfaW5pdCksIChnc3Rfcmdfdm9sdW1lX2luaXQpLAorCSAgKGdzdF9yZ192b2x1bWVfc2V0X3Byb3BlcnR5KSwgKGdzdF9yZ192b2x1bWVfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfcmdfdm9sdW1lX2Rpc3Bvc2UpLCAoZ3N0X3JnX3ZvbHVtZV9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9yZ192b2x1bWVfc2lua19ldmVudCksIChnc3Rfcmdfdm9sdW1lX3RhZ19ldmVudCksCisJICAoZ3N0X3JnX3ZvbHVtZV9yZXNldCksIChnc3Rfcmdfdm9sdW1lX3VwZGF0ZV9nYWluKSwKKwkgIChnc3Rfcmdfdm9sdW1lX2RldGVybWluZV9nYWluKToKKwkgICogZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuaDoKKwkgICogZ3N0L3JlcGxheWdhaW4vcmVwbGF5Z2Fpbi5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9yZXBsYXlnYWluLmg6CisJICAqIGdzdC9yZXBsYXlnYWluL3JnYW5hbHlzaXMuaDoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5jdnNpZ25vcmU6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzogKHNlbmRfZW9zX2V2ZW50KSwKKwkgIChHU1RfU1RBUlRfVEVTVCk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnbGltaXRlci5jOiAoc2V0dXBfcmdsaW1pdGVyKSwKKwkgIChjbGVhbnVwX3JnbGltaXRlciksIChzZXRfcGxheWluZ19zdGF0ZSksIChjcmVhdGVfdGVzdF9idWZmZXIpLAorCSAgKHZlcmlmeV90ZXN0X2J1ZmZlciksIChHU1RfU1RBUlRfVEVTVCksIChyZ2xpbWl0ZXJfc3VpdGUpLCAobWFpbik6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3Jndm9sdW1lLmM6IChldmVudF9mdW5jKSwgKHNldHVwX3Jndm9sdW1lKSwKKwkgIChjbGVhbnVwX3Jndm9sdW1lKSwgKHNldF9wbGF5aW5nX3N0YXRlKSwgKHNldF9udWxsX3N0YXRlKSwKKwkgIChzZW5kX2Vvc19ldmVudCksIChzZW5kX3RhZ19ldmVudCksICh0ZXN0X2J1ZmZlcl9uZXcpLAorCSAgKGZhaWxfdW5sZXNzX3RhcmdldF9nYWluKSwgKGZhaWxfdW5sZXNzX3Jlc3VsdF9nYWluKSwKKwkgIChmYWlsX3VubGVzc19nYWluKSwgKEdTVF9TVEFSVF9URVNUKSwgKHJndm9sdW1lX3N1aXRlKSwgKG1haW4pOgorCSAgQWRkIHJlcGxheWdhaW4gcGxheWJhY2sgZWxlbWVudHMgKCM0MTI3MTApLgorCisyMDA3LTA1LTE4IDEzOjI3OjM5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IERvbid0IGNyYXNoIHdoZW4gYW4gdW5zdXBwb3J0ZWQgdHJhbnNwb3J0IGVycm9yIHdhcyByZXR1cm5lZCBieSB0aGUgc2VydmVyLCBqdXN0IHRyeSB0byBjb25maWcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zZXR1cF9zdHJlYW1zKToKKwkgIERvbid0IGNyYXNoIHdoZW4gYW4gdW5zdXBwb3J0ZWQgdHJhbnNwb3J0IGVycm9yIHdhcyByZXR1cm5lZCBieSB0aGUKKwkgIHNlcnZlciwganVzdCB0cnkgdG8gY29uZmlndXJlIHRoZSBuZXh0IHN0cmVhbS4gRml4ZXMgIzQzOTI1NS4KKworMjAwNy0wNS0xOCAxMTozOToxMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy4qOiBBZGQgVENQIHRpbWVvdXQgcHJvcGVydHkgYW5kIHVzZSBpdCBmb3IgYWxsIFRDUCBjb25uZWN0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHNwc3JjX3NldF9wcm9wZXJ0eSksIChnc3RfcnRzcHNyY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdWRwKSwgKGdzdF9ydHNwc3JjX2xvb3BfaW50ZXJsZWF2ZWQpLAorCSAgKGdzdF9ydHNwc3JjX2xvb3BfdWRwKSwgKGdzdF9ydHNwc3JjX3RyeV9zZW5kKSwgKGdzdF9ydHNwc3JjX3NlbmQpLAorCSAgKGdzdF9ydHNwc3JjX3NldHVwX3N0cmVhbXMpLCAoZ3N0X3J0c3BzcmNfb3Blbik6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIEFkZCBUQ1AgdGltZW91dCBwcm9wZXJ0eSBhbmQgdXNlIGl0IGZvciBhbGwgVENQIGNvbm5lY3Rpb24uCisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fY29ubmVjdCksCisJICAocnRzcF9jb25uZWN0aW9uX3dyaXRlKSwgKHJ0c3BfY29ubmVjdGlvbl9uZXh0X3RpbWVvdXQpLAorCSAgKHJ0c3BfY29ubmVjdGlvbl9yZXNldF90aW1lb3V0KToKKwkgIE1ha2UgY29ubmVjdCBhbmQgd3JpdGVzIGNhbmNlbGFibGUgYW5kIG1ha2UgdGhlbSB1c2UgdGhlIHRpbWVvdXQuCisKKzIwMDctMDUtMTggMTA6MzY6MTIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogUmVmYWN0b3IgdGltZW91dCBoYW5kbGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zZW5kX2tlZXBfYWxpdmUpLAorCSAgKGdzdF9ydHNwc3JjX2xvb3BfaW50ZXJsZWF2ZWQpLCAoZ3N0X3J0c3BzcmNfbG9vcF91ZHApLAorCSAgKGdzdF9ydHNwc3JjX3RyeV9zZW5kKSwgKGdzdF9ydHNwc3JjX3NlbmQpLAorCSAgKGdzdF9ydHNwc3JjX3NldHVwX3N0cmVhbXMpOgorCSAgUmVmYWN0b3IgdGltZW91dCBoYW5kbGluZy4KKwkgIEFsc28gc2VuZCBrZWVwLWFsaXZlIHdoZW4gZGVhbGluZyB3aXRoIFRDUCB0cmFuc3BvcnQuCisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fY3JlYXRlKSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fZnJlZSksIChydHNwX2Nvbm5lY3Rpb25fbmV4dF90aW1lb3V0KSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fcmVzZXRfdGltZW91dCk6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmg6CisJICBVc2UgYSB0aW1lciB0byBoYW5kbGUgdGhlIHNlc3Npb24gdGltZW91dHMsIGFkZCBzb21lIG1ldGhvZHMgdG8gZGVhbAorCSAgd2l0aCB0aW1lb3V0cy4KKworMjAwNy0wNS0xNyAxNDo1NjozOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBJZ25vcmUgc3RyZWFtcyB0aGF0IGZhaWwgdGhlIHNldHVwIGNvbW1hbmQsIHdlIHdpbGwgcmV0cnkgd2l0aCBhIGRpZmZlcmVudCB0cmFuc3BvcnQgbGF0ZXIgb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc2VuZCksCisJICAoZ3N0X3J0c3BzcmNfc2V0dXBfc3RyZWFtcyk6CisJICBJZ25vcmUgc3RyZWFtcyB0aGF0IGZhaWwgdGhlIHNldHVwIGNvbW1hbmQsIHdlIHdpbGwgcmV0cnkgd2l0aCBhCisJICBkaWZmZXJlbnQgdHJhbnNwb3J0IGxhdGVyIG9uLgorCSAgKiBnc3QvcnRzcC9ydHNwZXh0d21zLmM6IChydHNwX2V4dF93bXNfcGFyc2Vfc2RwKSwKKwkgIChydHNwX2V4dF93bXNfY29uZmlndXJlX3N0cmVhbSk6CisJICBGaXggZW5jb2RpbmcgbmFtZSBjYXNlLgorCisyMDA3LTA1LTE3IDEwOjU5OjAwICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLio6IFJlbW92ZSB0aGUgZXZlbnQtbG9vcC1pbi1zZXBhcmF0ZS10aHJlYWQgbW9kaWZpY2F0aW9ucywgYmVjYXVzZSBNYWNPU1ggaXMgJCNAKColJCMgISBGb3IuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIFJlbW92ZSB0aGUgZXZlbnQtbG9vcC1pbi1zZXBhcmF0ZS10aHJlYWQgbW9kaWZpY2F0aW9ucywgYmVjYXVzZSBNYWNPU1gKKwkgIGlzICQjQCgqJSQjICEgRm9yIHRob3NlIHdvbmRlcmluZywgdGhlIGV2ZW50IGhhbmRsaW5nIG5lZWRzIHRvIGJlIGRvbmUKKwkgIGluIHRoZSBtYWluIHRocmVhZCBhZnRlciBhbGwuLgorCisyMDA3LTA1LTE3IDA5OjQxOjQ4ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLio6IEZpeCBhIHN0dXBpZCAjaWYgdnMgI2lmZGVmIGJ1Zy4gU2hvdWxkIHVzZSB0aGUgcHJvcGVyIGNvbG9yc3BhY2Ugbm93LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgRml4IGEgc3R1cGlkICNpZiB2cyAjaWZkZWYgYnVnLiBTaG91bGQgdXNlIHRoZSBwcm9wZXIgY29sb3JzcGFjZSBub3cuCisJICBVc2UgYSBzZXBhcmF0ZSB0aHJlYWQvdGFzayBmb3IgdGhlIGNvY29hIGV2ZW50X2xvb3AsIGVsc2UgaXQgd291bGRuJ3QKKwkgIHN0b3AuCisKKzIwMDctMDUtMTYgMTY6NTA6MjMgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IEZpeCBidWlsZCBvbiBtYWNvc3guCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogKHVzZXJfZW5kcm93X2NhbGxiYWNrKSwgKHVzZXJfcmVhZF9kYXRhKToKKwkgIEZpeCBidWlsZCBvbiBtYWNvc3guCisKKzIwMDctMDUtMTYgMTY6MzA6MDMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IFJlcGxhY2UgZGlyZWN0IGNvbXBhcmlzb24gb2YgYSBzdHJpbmcgd2l0aCB0aGUgc3RyaW5nIGxpdGVyYWwgIiIgd2l0aCBhIGNvbXBhcmlzb24gb2YgdGhlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IChnc3RfZHYxMzk0c3JjX3VyaV9zZXRfdXJpKToKKwkgIFJlcGxhY2UgZGlyZWN0IGNvbXBhcmlzb24gb2YgYSBzdHJpbmcgd2l0aCB0aGUgc3RyaW5nIGxpdGVyYWwgIiIgd2l0aAorCSAgYSBjb21wYXJpc29uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgd2l0aCAnXDAnLiBGaXhlcyAjNDM4OTI2LgorCisyMDA3LTA1LTE1IDE3OjIyOjU4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBBZGQgRElSRUNURFJBV19DRkxBR1MgYW5kIERJUkVDVFNPVU5EX0NGTEFHUyB0byBNYWtlZmlsZS5hbTsgc2F2ZSBhbmQgcmVzdG9yZSB0aGUgdmFyaW91cyBmbGFncyBpbiB0aGUgZGlyZWN0ZHJhdy9kaXIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIHN5cy9kaXJlY3RkcmF3L01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZGlyZWN0c291bmQvTWFrZWZpbGUuYW06CisJICBBZGQgRElSRUNURFJBV19DRkxBR1MgYW5kIERJUkVDVFNPVU5EX0NGTEFHUyB0byBNYWtlZmlsZS5hbTsgc2F2ZQorCSAgYW5kIHJlc3RvcmUgdGhlIHZhcmlvdXMgZmxhZ3MgaW4gdGhlIGRpcmVjdGRyYXcvZGlyZWN0c291bmQKKwkgIGRldGVjdGlvbiBzZWN0aW9uLiBBcHBhcmVudGx5IGltcHJvdmVzIGNyb3NzLWNvbXBpbGluZyBmb3Igd2luMzIKKwkgIHdpdGggbWluZ3czMiB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMgKCM0Mzc1MzkpLgorCisyMDA3LTA1LTE1IDExOjE4OjMzICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9kZWJ1Zy9icmVha215ZGF0YS5jIChnc3RfYnJlYWtfbXlfZGF0YV9pbml0KTogT25lIG1vcmUgdHJ5LiBUaGlzIHNob3VsZCBiZSB0aGUgcHJvcGVyIGZpeCBub3cuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlYnVnL2JyZWFrbXlkYXRhLmMgKGdzdF9icmVha19teV9kYXRhX2luaXQpOgorCSAgT25lIG1vcmUgdHJ5LiBUaGlzIHNob3VsZCBiZSB0aGUgcHJvcGVyIGZpeCBub3cuCisKKzIwMDctMDUtMTUgMDY6NDE6NTggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2RlYnVnL2JyZWFrbXlkYXRhLmM6IE9vb3BzLCBubyAvLyBjb21tZW50cyBwbGVhc2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlYnVnL2JyZWFrbXlkYXRhLmM6CisJICBPb29wcywgbm8gLy8gY29tbWVudHMgcGxlYXNlLgorCisyMDA3LTA1LTE1IDA2OjM0OjQ4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9kZWJ1Zy9icmVha215ZGF0YS5jOiBGaXggZ3N0X2J1ZmZlcl9pc193cml0YWJsZSgpIGFzc2VydGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVidWcvYnJlYWtteWRhdGEuYzogKGdzdF9icmVha19teV9kYXRhX2NsYXNzX2luaXQpLAorCSAgKGdzdF9icmVha19teV9kYXRhX2luaXQpOgorCSAgRml4IGdzdF9idWZmZXJfaXNfd3JpdGFibGUoKSBhc3NlcnRpb24uCisKKzIwMDctMDUtMTUgMDI6NTY6MjMgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IEFkZCBzdXBwb3J0IGZvciBCYXllciBpbWFnZXMgYXMgdmlkZW8veC1yYXctYmF5ZXIuICBGaXhlcyAjMzE0MTYwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogQWRkIHN1cHBvcnQgZm9yIEJheWVyIGltYWdlcyBhcworCSAgdmlkZW8veC1yYXctYmF5ZXIuICBGaXhlcyAjMzE0MTYwLgorCisyMDA3LTA1LTE0IDE3OjEwOjEyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogVXBkYXRlIHRoZW9yYSBwYXkvZGVwYXlsb2FkZXIgaW4gYSBzaW1pbGFyIHRvIHZvcmJpcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6IChkZWNvZGVfYmFzZTY0KSwKKwkgIChnc3RfcnRwX3RoZW9yYV9kZXBheV9wYXJzZV9jb25maWd1cmF0aW9uKToKKwkgICogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzogKGVuY29kZV9iYXNlNjQpLAorCSAgKGdzdF9ydHBfdGhlb3JhX3BheV9maW5pc2hfaGVhZGVycyksCisJICAoZ3N0X3J0cF90aGVvcmFfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgVXBkYXRlIHRoZW9yYSBwYXkvZGVwYXlsb2FkZXIgaW4gYSBzaW1pbGFyIHRvIHZvcmJpcy4KKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOgorCSAgKGdzdF9ydHBfdm9yYmlzX2RlcGF5X3BhcnNlX2NvbmZpZ3VyYXRpb24pOgorCSAgVXBkYXRlIGRvY3MuCisKKzIwMDctMDUtMTQgMTY6MTk6NTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogV2hlbiB3ZSB0cnkgdG8gZXhlY3V0ZSBhIG1ldGhvZCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlciwgZG9uJ3QgZXJyb3Igb3V0IGJ1dCByZW1vdi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX3NlbmQpOgorCSAgV2hlbiB3ZSB0cnkgdG8gZXhlY3V0ZSBhIG1ldGhvZCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlciwKKwkgIGRvbid0IGVycm9yIG91dCBidXQgcmVtb3ZlIHRoZSBtZXRob2QgZnJvbSB0aGUgYWNjZXB0ZWQgbWV0aG9kcyBzbyB0aGF0CisJICB3ZSBuZXZlciB0cnkgdG8gcGVyZm9ybSB0aGlzIG1ldGhvZCBhZ2Fpbi4KKworMjAwNy0wNS0xNCAxNDo0NzoyNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOiBSZW1vdmUgYW5ub3lpbmcgX2R1bXBfbWVtLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzogKGdzdF9ydHBfdm9yYmlzX2RlcGF5X3Byb2Nlc3MpOgorCSAgUmVtb3ZlIGFubm95aW5nIF9kdW1wX21lbS4KKworMjAwNy0wNS0xNCAxMToxMTo0MiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBQYXJzZSByYW5nZSBjb3JyZWN0bHkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfcGFyc2VfcmFuZ2UpOgorCSAgUGFyc2UgcmFuZ2UgY29ycmVjdGx5LgorCSAgKiBnc3QvcnRzcC9ydHNwdXJsLmM6IChydHNwX3VybF9nZXRfcmVxdWVzdF91cmkpOgorCSAgVGhlIGJhc2V1cmwgbm93IGFsd2F5cyBoYXMgYSAnLycgYXQgdGhlIHN0YXJ0LgorCisyMDA3LTA1LTE0IDA5OjAxOjA1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IEZhY3RvciBvdXQgY2FwcyBjb25maWd1cmF0aW9uIGFuZCBjb25maWd1cmUgbW9yZSBzdHVmZiBzdWNoIGFzIHRoZSB0aW1lIHJhbmdlcyBhbmQgc3BlZWQvc2NhbGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19jb25maWd1cmVfY2FwcyksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfcmFuZ2UpLCAoZ3N0X3J0c3BzcmNfb3BlbiksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfcnRwaW5mbyksIChnc3RfcnRzcHNyY19wbGF5KToKKwkgIEZhY3RvciBvdXQgY2FwcyBjb25maWd1cmF0aW9uIGFuZCBjb25maWd1cmUgbW9yZSBzdHVmZiBzdWNoIGFzIHRoZSB0aW1lCisJICByYW5nZXMgYW5kIHNwZWVkL3NjYWxlIHZhbHVlcy4KKwkgICogZ3N0L3J0c3AvcnRzcHRyYW5zcG9ydC5jOgorCSAgQWRkIENvcHlyaWdodCBhZnRlciBub24tdHJpdmFsIGZpeGVzLgorCisyMDA3LTA1LTEzIDE5OjU3OjQ1ICswMDAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSAgZ3N0L3JlcGxheWdhaW4vcmdhbmFseXNpcy5jOiBGaXggd3JvbmcgaWZkZWYgZm9yIHZpc3VhbCBDKysuICBGaXhlczogIzQzNzQwMy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9yZ2FuYWx5c2lzLmM6CisJICBGaXggd3JvbmcgaWZkZWYgZm9yIHZpc3VhbCBDKysuICBGaXhlczogIzQzNzQwMy4KKwkgIEJ5IEFsaSBTYWJpbCA8YWxpLnNhYmlsQGdtYWlsLmNvbT4uCisKKzIwMDctMDUtMTMgMTU6NDc6MTMgKzAwMDAgIFPDqWJhc3RpZW4gTW91dHRlIDxzZWJhc3RpZW5AbW91dHRlLm5ldD4KKworCSAgZ3N0L2xldmVsL2dzdGxldmVsLmM6IFVzZSBndWludDggKiBpbnN0ZWFkIG9mIGdwb2ludGVyIHRoZW4gdnM2IGNhbiBidWlsZCBpbl9kYXRhICs9IChmaWx0ZXItPndpZHRoIC8gOCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6IChnc3RfbGV2ZWxfdHJhbnNmb3JtX2lwKToKKwkgIFVzZSBndWludDggKiBpbnN0ZWFkIG9mIGdwb2ludGVyIHRoZW4gdnM2IGNhbiBidWlsZAorCSAgaW5fZGF0YSArPSAoZmlsdGVyLT53aWR0aCAvIDgpLgorCisyMDA3LTA1LTEyIDE2OjM3OjUwICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3J0c3AvOiBNYWtlIGNoYW5uZWwgZ3VpbnQ4IHdoZXJlIHBvc3NpYmxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUGV0ZXIgS2plbGxlcnN0ZWR0ICA8cGtqIGF0IGF4aXMgY29tPgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fcmVjZWl2ZSk6CisJICAqIGdzdC9ydHNwL3J0c3BtZXNzYWdlLmM6IChydHNwX21lc3NhZ2VfaW5pdF9kYXRhKSwKKwkgIChydHNwX21lc3NhZ2VfZ2V0X2hlYWRlcik6CisJICAqIGdzdC9ydHNwL3J0c3BtZXNzYWdlLmg6CisJICBNYWtlIGNoYW5uZWwgZ3VpbnQ4IHdoZXJlIHBvc3NpYmxlLgorCSAgTWFrZSBydHNwX21lc3NhZ2VfaW5pdF9kYXRhKCkgdGFrZSB0aGUgY2hhbm5lbCBhcyBhIGd1aW50OC4KKwkgICogZ3N0L3J0c3AvcnRzcGRlZnMuYzoKKwkgIEZpeGVkIGEgdHlwbzogVGltb3V0IC0+IFRpbWVvdXQKKwkgICogZ3N0L3J0c3AvcnRzcGRlZnMuaDoKKwkgIE1ha2UgUlRTUF9DSEVDSygpIGJlaGF2ZSBhcyBhIHN0YXRlbWVudC4KKwkgICogZ3N0L3J0c3Avc2RwbWVzc2FnZS5jOgorCSAgQXZvaWQgYSBjb21waWxlciB3YXJuaW5nIGluIElOSVRfQVJSQVkoKS4KKwkgIEZpeGVzICM0Mzc2OTIuCisKKzIwMDctMDUtMTIgMTY6Mjc6NTEgKzAwMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJICBnc3QvcnRzcC9ydHNwdXJsLio6IEFkZCBzdXBwb3J0IGZvciBxdWVyeSBwYXJhbWV0ZXJzIHRvIFJUU1AgVVJMcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFBldGVyIEtqZWxsZXJzdGVkdCAgPHBraiBhdCBheGlzIGNvbT4KKwkgICogZ3N0L3J0c3AvcnRzcHVybC5jOiAocnRzcF91cmxfcGFyc2UpLCAocnRzcF91cmxfZnJlZSksCisJICAocnRzcF91cmxfZ2V0X3JlcXVlc3RfdXJpKToKKwkgICogZ3N0L3J0c3AvcnRzcHVybC5oOgorCSAgQWRkIHN1cHBvcnQgZm9yIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gUlRTUCBVUkxzLgorCisyMDA3LTA1LTEyIDE2OjI2OjA2ICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3J0c3AvcnRzcHRyYW5zcG9ydC4qOiBBZGQgdmFsaWRhdGlvbiB0byBydHNwX3RyYW5zcG9ydF9wYXJzZSgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUGV0ZXIgS2plbGxlcnN0ZWR0ICA8cGtqIGF0IGF4aXMgY29tPgorCSAgKiBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0LmM6IChydHNwX3RyYW5zcG9ydF9pbml0KSwgKHBhcnNlX21vZGUpLAorCSAgKHBhcnNlX3JhbmdlKSwgKHJhbmdlX2FzX3RleHQpLCAocnRzcF90cmFuc3BvcnRfbW9kZV9hc190ZXh0KSwKKwkgIChydHNwX3RyYW5zcG9ydF9wcm9maWxlX2FzX3RleHQpLCAocnRzcF90cmFuc3BvcnRfbHRyYW5zX2FzX3RleHQpLAorCSAgKHJ0c3BfdHJhbnNwb3J0X3BhcnNlKSwgKHJ0c3BfdHJhbnNwb3J0X2FzX3RleHQpOgorCSAgKiBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0Lmg6CisJICBBZGQgdmFsaWRhdGlvbiB0byBydHNwX3RyYW5zcG9ydF9wYXJzZSgpLgorCSAgQWRkIHJ0c3BfdHJhbnNwb3J0X2FzX3RleHQoKSB0byBnZW5lcmF0ZSBhbiBSVFNQIGhlYWRlciBmcm9tIGFuCisJICBSVFNQVHJhbnNwb3J0LgorCSAgQ2hhbmdlIHNzcmMgdG8gZ3VpbnQgKHdhcyBhIHN0cmluZykgc2luY2UgdGhhdCBpcyB3aGF0IGl0IGlzLCBldmVuCisJICB0aG91Z2ggaXQgaXMgc2VudCBhcyBhIGhleCBzdHJpbmcuCisJICBDb3JyZWN0bHkgaWRlbnRpZnkgUExBWXxSRUNPUkQgbW9kZSBwYXJhbWV0ZXJzICh0aGUgc3ludGF4IGluIHRoZSBSRkMgaXMKKwkgIGluY29ycmVjdCwgd2hpY2ggY2FuIGJlIHNlZW4gd2hlbiBsb29raW5nIGF0IHRoZSBleGFtcGxlcyBpbiB0aGUgUkZDKS4KKwkgIEZpeGVzICM0Mzc2NzAuCisKKzIwMDctMDUtMTEgMTY6MTE6MDQgKzAwMDAgIEVyaWMgQW5ob2x0IDxhbmhvbHRAZnJlZWJzZC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jIChnc3RfeGltYWdlX3NyY19vcGVuX2Rpc3BsYXksIGdzdF94aW1hZ2Vfc3JjX3hpbWFnZV9nZXQpOgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogRXJpYyBBbmhvbHQKKwkgICogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYyAoZ3N0X3hpbWFnZV9zcmNfb3Blbl9kaXNwbGF5LAorCSAgZ3N0X3hpbWFnZV9zcmNfeGltYWdlX2dldCk6CisJICBVc2UgdW5pb24gb2YgYWxsIGRhbWFnZSBiZXR3ZWVuIGZyYW1lcyB0byBtYWtlIGl0IGZhc3Rlci4KKwkgIEZpeGVzIGJ1ZyAjMzQyNDYzLgorCSAgQWxzbyBmaXggY3Jhc2hlciB3aGVuIGN1cnNvciBpcyBhdCBib3R0b20gcmlnaHQgb2Ygd2luZG93LgorCisyMDA3LTA1LTExIDE2OjAxOjQ1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogU2tpcCBMSVNUIGNodW5rcyBiZWZvcmUgdGhlIGZtdCBjaHVuayAoZml4ZXMgIzQzNzQ5OSkuIEFsc28gZml4IHN0cmVhbWluZyBtb2RlIHJlZ3Jlc3Npb24uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyk6CisJICBTa2lwIExJU1QgY2h1bmtzIGJlZm9yZSB0aGUgZm10IGNodW5rIChmaXhlcyAjNDM3NDk5KS4gQWxzbyBmaXgKKwkgIHN0cmVhbWluZyBtb2RlIHJlZ3Jlc3Npb24gZm9yIGZpbGUgZnJvbSAjMzQzODM3IHdpdGggJ2JleHQnIGNodW5rCisJICBiZWZvcmUgdGhlICdmbXQnIGNodW5rLgorCisyMDA3LTA1LTExIDE1OjA5OjM5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC86IFByZWxpbWluYXJ5IHNlZWsgc3VwcG9ydC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19mbHVzaCksCisJICAoZ3N0X3J0c3BzcmNfZG9fc2VlayksIChnc3RfcnRzcHNyY19wZXJmb3JtX3NlZWspLAorCSAgKGdzdF9ydHNwc3JjX2hhbmRsZV9zcmNfZXZlbnQpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfbWFuYWdlciksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV90Y3ApLCAoZ3N0X3J0c3BzcmNfbG9vcF9pbnRlcmxlYXZlZCksCisJICAoZ3N0X3J0c3BzcmNfc2VuZF9rZWVwX2FsaXZlKSwgKGdzdF9ydHNwc3JjX29wZW4pLAorCSAgKGdzdF9ydHNwc3JjX3BhcnNlX3J0cGluZm8pLCAoZ3N0X3J0c3BzcmNfcGxheSk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgICogZ3N0L3J0c3AvcnRzcGRlZnMuaDoKKwkgIFByZWxpbWluYXJ5IHNlZWsgc3VwcG9ydC4KKwkgIEFjdGl2YXRlIGludGVybmFsIHBhZHMgc28gdGhhdCB3ZSBjYW4gcmVjZWl2ZSBldmVudHMgb24gdGhlbS4KKwkgIERvbid0IHRyeSB0byBwYXJzZSBhIHJhbmdlIHN0cmluZyB3aGVuIGl0J3MgTlVMTC4KKworMjAwNy0wNS0xMSAxNTowNDozOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9SRUFETUU6IFVwZGF0ZSBSRUFETUUgd2l0aCBuZXcgUlRQIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgdXNlZCBmb3Igc3luY2hyb25pc2F0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvUkVBRE1FOgorCSAgVXBkYXRlIFJFQURNRSB3aXRoIG5ldyBSVFAgdmFyaWFibGVzIHRoYXQgd2lsbCBiZSB1c2VkIGZvcgorCSAgc3luY2hyb25pc2F0aW9uLgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6IChkZWNvZGVfYmFzZTY0KSwKKwkgIChnc3RfcnRwX3ZvcmJpc19kZXBheV9wYXJzZV9jb25maWd1cmF0aW9uKSwKKwkgIChnc3RfcnRwX3ZvcmJpc19kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzogKGVuY29kZV9iYXNlNjQpLAorCSAgKGdzdF9ydHBfdm9yYmlzX3BheV9maW5pc2hfaGVhZGVycyksCisJICAoZ3N0X3J0cF92b3JiaXNfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgVXBkYXRlIHZvcmJpcyBwYXkgYW5kIGRlcGF5bG9hZGVyIHRvIGRyYWZ0LTA0LgorCisyMDA3LTA1LTExIDExOjI0OjEzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0LmM6IFVEUCBNQ0FTVCBpcyBhY3R1YWxseSB0aGUgZGVmYXVsdCBmb3IgUlRQL0FWUC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0LmM6CisJICBVRFAgTUNBU1QgaXMgYWN0dWFsbHkgdGhlIGRlZmF1bHQgZm9yIFJUUC9BVlAuCisKKzIwMDctMDUtMTEgMTA6MzE6MjcgKzAwMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkgIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmMgKGdzdF94aW1hZ2Vfc3JjX3N0YXJ0LCBnc3RfeGltYWdlX3NyY194aW1hZ2VfZ2V0KToKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jIChnc3RfeGltYWdlX3NyY19zdGFydCwKKwkgIGdzdF94aW1hZ2Vfc3JjX3hpbWFnZV9nZXQpOgorCSAgKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5oIChsYXN0X3hpbWFnZSk6CisJICBXaGVuIHVzaW5nIERhbWFnZSBhY3R1YWxseSBrZWVwIHRoZSBsYXN0IGZyYW1lLCBhbmQgbm90IGFzc3VtZQorCSAgdGhhdCB0aGUgYnVmZmVyIHdlIGdldCBhbHJlYWR5IGhhcyB0aGUgbGFzdCBmcmFtZSBvbiBpdC4KKwkgIENvcHkgdGhlIGN1cnNvciBvdmVyIGlmIHdlIHNwZWNpZnkgYSBub24temVybyBzdGFydCB4IGFuZAorCSAgc3RhcnQgeS4KKworMjAwNy0wNS0xMSAwOToxMjo1NSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvcnRzcHRyYW5zcG9ydC5jOiBNYWtlIFVEUCB0aGUgZGVmYXVsdCB0cmFuc3BvcnQgd2hlbiBub3Qgc3BlY2lmaWVkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL3J0c3B0cmFuc3BvcnQuYzoKKwkgIE1ha2UgVURQIHRoZSBkZWZhdWx0IHRyYW5zcG9ydCB3aGVuIG5vdCBzcGVjaWZpZWQuCisKKzIwMDctMDUtMTAgMTQ6MDI6MDcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jIChnc3RfcXRkZW11eF9tb3ZlX3N0cmVhbSwgZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9oZWFkZXIsIGdzdF9xdGRlbXV4X2FjdGl2YXRlX3NlZ21lbnQsIGdzdF9xdGRlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jIChnc3RfcXRkZW11eF9tb3ZlX3N0cmVhbSwKKwkgIGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfaGVhZGVyLCBnc3RfcXRkZW11eF9hY3RpdmF0ZV9zZWdtZW50LAorCSAgZ3N0X3F0ZGVtdXhfcHJlcGFyZV9jdXJyZW50X3NhbXBsZSwgZ3N0X3F0ZGVtdXhfY29tYmluZV9mbG93cywKKwkgIGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfbW92aWUsIGdzdF9xdGRlbXV4X2xvb3AsCisJICBxdGRlbXV4X3BhcnNlX3NlZ21lbnRzLCBxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmMgKHJ0cF9zZXNzaW9uX2dldF9iYW5kd2lkdGgsCisJICBydHBfc2Vzc2lvbl9nZXRfcnRjcF9iYW5kd2lkdGgsIHJ0cF9zZXNzaW9uX2dldF9jbmFtZSwKKwkgIHJ0cF9zZXNzaW9uX2dldF9uYW1lLCBydHBfc2Vzc2lvbl9nZXRfZW1haWwsIHJ0cF9zZXNzaW9uX2dldF9waG9uZSwKKwkgIHJ0cF9zZXNzaW9uX2dldF9sb2NhdGlvbiwgcnRwX3Nlc3Npb25fZ2V0X3Rvb2wsCisJICBydHBfc2Vzc2lvbl9wcm9jZXNzX2J5ZSwgc2Vzc2lvbl9yZXBvcnRfYmxvY2tzKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmMgKHJ0cF9zb3VyY2VfcHJvY2Vzc19ydHAsCisJICBydHBfc291cmNlX3NlbmRfcnRwLCBydHBfc291cmNlX3Byb2Nlc3Nfc3IsIHJ0cF9zb3VyY2VfcHJvY2Vzc19yYik6CisJICBNb3JlIGZvcm1hdCBhcmcgZml4aW5nIChzcG90dGVkIGJ5IEFsaSBTYWJpbCA8YWxpLnNhYmlsQGdtYWlsLmNvbT4pLgorCSAgKiBnc3Qvc3dpdGNoL01ha2VmaWxlLmFtOgorCSAgQWRkIHJlcXVpcmUgbGlicmFyaWVzKHNwb3R0ZWQgYnkgQWxpIFNhYmlsIDxhbGkuc2FiaWxAZ21haWwuY29tPikuCisKKzIwMDctMDUtMTAgMDE6MjE6MTkgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogUmV2ZXJ0IGxhc3QgY2hhbmdlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgUmV2ZXJ0IGxhc3QgY2hhbmdlLgorCisyMDA3LTA1LTA5IDIxOjMwOjUzICswMDAwICBTw6liYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiBVc2UgZ3VpbnQ4ICogaW5zdGVhZCBvZiBncG9pbnRlciB0aGVuIHZzNiBrbm93IHRoZSBzaXplIG9mIGRhdGEgcG9pbnRlZCB3aGVuIG1vdmluZyB0aGUgcG9pbnRlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogKGdzdF9sZXZlbF9jYWxjdWxhdGVfIyNUWVBFKSwKKwkgIChnc3RfbGV2ZWxfdHJhbnNmb3JtX2lwKToKKwkgIFVzZSBndWludDggKiBpbnN0ZWFkIG9mIGdwb2ludGVyIHRoZW4gdnM2IGtub3cgdGhlIHNpemUgb2YgZGF0YQorCSAgcG9pbnRlZCB3aGVuIG1vdmluZyB0aGUgcG9pbnRlci4KKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6IChnc3RfcnRwX2gyNjRfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgTW92ZSBpbnN0cnVjdGlvbnMgYWZ0ZXIgdmFyaWFibGVzIGRlY2xhcmF0aW9uLgorCSAgKiB3aW4zMi92czYvYXV0b2dlbi5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RydHAuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0cnRzcC5kc3A6CisJICBVcGRhdGUgdnM2IHByb2plY3QgZmlsZXMuCisKKzIwMDctMDUtMDkgMTE6MjM6MzkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwLzogQWRkIGNvZGUgdG8gcGFyc2UgdGltZSByYW5nZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2hhbmRsZV9zcmNfcXVlcnkpLAorCSAgKGdzdF9ydHNwc3JjX3NlbmRfa2VlcF9hbGl2ZSksIChnc3RfcnRzcHNyY19vcGVuKToKKwkgICogZ3N0L3J0c3AvcnRzcHJhbmdlLmM6IChwYXJzZV9ucHRfdGltZSksIChwYXJzZV9ucHRfcmFuZ2UpLAorCSAgKHBhcnNlX2Nsb2NrX3JhbmdlKSwgKHBhcnNlX3NtcHRlX3JhbmdlKSwgKHJ0c3BfcmFuZ2VfcGFyc2UpLAorCSAgKHJ0c3BfcmFuZ2VfZnJlZSk6CisJICAqIGdzdC9ydHNwL3J0c3ByYW5nZS5oOgorCSAgQWRkIGNvZGUgdG8gcGFyc2UgdGltZSByYW5nZXMuCisJICBSZXBvcnQgRFVSQVRJT04gb24gdGhlIHN0cmVhbSB3aGVuIHBvc3NpYmxlLgorCisyMDA3LTA1LTA4IDE1OjQ5OjAxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IEZpeCBzdHJpZGVzIGNhbGN1bGF0aW9uIGZvciBBWVVWIChpdCdzIGp1c3Qgd2lkdGgqNCkgKCM0MzY5MTApLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogKGdzdF92aWRlb21peGVyX2JsZW5kX2F5dXZfYXl1diksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfZmlsbF9jaGVja2VyKSwgKGdzdF92aWRlb21peGVyX2ZpbGxfY29sb3IpLAorCSAgKGdzdF92aWRlb21peGVyX2NvbGxlY3RlZCk6CisJICBGaXggc3RyaWRlcyBjYWxjdWxhdGlvbiBmb3IgQVlVViAoaXQncyBqdXN0IHdpZHRoKjQpICgjNDM2OTEwKS4KKworMjAwNy0wNS0wNiAyMTozMjo0MCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvYXVkaW9meC86IFN5bmMgdGhlIEdPYmplY3QgcHJvcGVydGllcyBiZWZvcmUgZWFjaCBwcm9jZXNzaW5nIHN0ZXAgdG8gcHJvcGVybHkgd29yayB3aXRoIHRoZSBjb250cm9sbGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jOiAoZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6IChnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1faXApOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2ludmVydC5jOiAoZ3N0X2F1ZGlvX2ludmVydF90cmFuc2Zvcm1faXApOgorCSAgU3luYyB0aGUgR09iamVjdCBwcm9wZXJ0aWVzIGJlZm9yZSBlYWNoIHByb2Nlc3Npbmcgc3RlcCB0byBwcm9wZXJseQorCSAgd29yayB3aXRoIHRoZSBjb250cm9sbGVyLgorCisyMDA3LTA1LTA0IDE1OjE3OjE0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IExldCBtb3JlIGVycm9yIHN0YXRlIHRyaWNrbGUgZG93biBzbyB0aGF0IHdlIGNhbiBjYXRjaCBtb3JlIGVycm9yIGNhc2VzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX3NlbmRfa2VlcF9hbGl2ZSksCisJICAoZ3N0X3J0c3BzcmNfbG9vcF91ZHApLCAoZ3N0X3J0c3BzcmNfdHJ5X3NlbmQpLCAoZ3N0X3J0c3BzcmNfc2VuZCksCisJICAoZ3N0X3J0c3BzcmNfc2V0dXBfc3RyZWFtcyksIChnc3RfcnRzcHNyY19vcGVuKSwKKwkgIChnc3RfcnRzcHNyY19jbG9zZSksIChnc3RfcnRzcHNyY19wbGF5KSwgKGdzdF9ydHNwc3JjX3BhdXNlKSwKKwkgIChnc3RfcnRzcHNyY19jaGFuZ2Vfc3RhdGUpOgorCSAgTGV0IG1vcmUgZXJyb3Igc3RhdGUgdHJpY2tsZSBkb3duIHNvIHRoYXQgd2UgY2FuIGNhdGNoIG1vcmUgZXJyb3IKKwkgIGNhc2VzLgorCSAgSGFuZGxlIGtlZXAtYWxpdmUgYSBsaXR0bGUgc21hcnRlciBieSBzZWxlY3RpbmcgYSBtZXRob2QgdGhlIHNlcnZlcgorCSAgYWN0dWFsbHkgc3VwcG9ydHMuCisJICBGaXggYSByYWNlIGluIFVEUCBzdHJlYW1pbmcgc2h1dGRvd24uCisKKzIwMDctMDUtMDQgMTM6MDQ6MzEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogSWdub3JlIGVycm9ycyB3aGVuIHRyeWluZyB0byB1c2UgdGhlIGtlZXAtYWxpdmUgbWVzc2FnZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc2VuZF9rZWVwX2FsaXZlKToKKwkgIElnbm9yZSBlcnJvcnMgd2hlbiB0cnlpbmcgdG8gdXNlIHRoZSBrZWVwLWFsaXZlIG1lc3NhZ2VzLgorCisyMDA3LTA1LTA0IDEyOjMxOjMyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IFNlbmQgUlRDUCBtZXNzYWdlcyBiYWNrIHRvIHRoZSBzZXJ2ZXIgb3ZlciB0aGUgVENQIGNvbm5lY3Rpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfaGFuZGxlX3NyY19ldmVudCksCisJICAoZ3N0X3J0c3BzcmNfaGFuZGxlX3NyY19xdWVyeSksIChnc3RfcnRzcHNyY19zaW5rX2NoYWluKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX21hbmFnZXIpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9mcmVlX3VkcCksIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RjcCksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV9tY2FzdCksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV91ZHApLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdWRwX3NpbmspLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KToKKwkgIFNlbmQgUlRDUCBtZXNzYWdlcyBiYWNrIHRvIHRoZSBzZXJ2ZXIgb3ZlciB0aGUgVENQIGNvbm5lY3Rpb24uCisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fd3JpdGUpLAorCSAgKHJ0c3BfY29ubmVjdGlvbl9zZW5kKSwgKHJ0c3BfY29ubmVjdGlvbl9yZWFkKSwgKHJlYWRfYm9keSksCisJICAocnRzcF9jb25uZWN0aW9uX3JlY2VpdmUpOgorCSAgKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5oOgorCSAgRmFjdG9yIG91dCBhbmQgZXhwb3NlIGxvd2xldmVsIF93cml0ZSBhbmQgX3JlYWQgbWV0aG9kcy4KKwkgIEltcGxlbWVudCBzZW5kaW5nIGRhdGEgbWVzc2FnZXMgdG8gdGhlIHNlcnZlci4KKworMjAwNy0wNS0wMyAxNTo1NTowNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogRml4IHRpbWVzdGFtcHMgb24gb3V0Z29pbmcgYnVmZmVycy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOiAoZ3N0X211bHRpcGFydF9tdXhfcXVldWVfcGFkcyksCisJICAoZ3N0X211bHRpcGFydF9tdXhfY29sbGVjdGVkKToKKwkgIEZpeCB0aW1lc3RhbXBzIG9uIG91dGdvaW5nIGJ1ZmZlcnMuCisKKzIwMDctMDUtMDMgMTQ6Mzk6MDkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IEVtaXQgTkVXU0VHTUVOVCBldmVudHMgYmVmb3JlIHB1c2hpbmcgdGhlIGZpcnN0IGJ1ZmZlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSAgKGdzdF9tdWx0aXBhcnRfbXV4X3JlcXVlc3RfbmV3X3BhZCksIChnc3RfbXVsdGlwYXJ0X211eF9jb2xsZWN0ZWQpLAorCSAgKGdzdF9tdWx0aXBhcnRfbXV4X2NoYW5nZV9zdGF0ZSk6CisJICBFbWl0IE5FV1NFR01FTlQgZXZlbnRzIGJlZm9yZSBwdXNoaW5nIHRoZSBmaXJzdCBidWZmZXIuCisKKzIwMDctMDUtMDMgMTM6NDg6NTQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogUmVmYWN0b3IgdHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24gY29kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19maW5hbGl6ZSksCisJICAoZ3N0X3J0c3BzcmNfYWxsb2NfdWRwX3BvcnRzKSwgKGdzdF9ydHNwc3JjX2hhbmRsZV9zcmNfZXZlbnQpLAorCSAgKGdzdF9ydHNwc3JjX2hhbmRsZV9zcmNfcXVlcnkpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfbWFuYWdlciksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2ZyZWVfdWRwKSwgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdGNwKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX21jYXN0KSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3VkcCksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV91ZHBfc2luayksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV90cmFuc3BvcnQpLCAoZ3N0X3J0c3BzcmNfcHVzaF9ldmVudCksCisJICAoZ3N0X3J0c3BzcmNfbG9vcF91ZHApLCAoZ3N0X3J0c3BzcmNfb3BlbiksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfcnRwaW5mbyksIChnc3RfcnRzcHNyY19wbGF5KSwKKwkgIChnc3RfcnRzcHNyY19wYXVzZSk6CisJICBSZWZhY3RvciB0cmFuc3BvcnQgY29uZmlndXJhdGlvbiBjb2RlLgorCSAgQ3JlYXRlIGludGVybmFsIHBhZHMgZm9yIFRDUCB0cmFuc3BvcnQgc28gdGhhdCB3ZSBjYW4gaW1wbGVtZW50IGV2ZW50cworCSAgYW5kIHF1ZXJpZXMuCisJICBIYW5kbGUgZXZlbnRzIGFuZCBxdWVyaWVzLgorCSAgUGFyc2UgcmFuZ2UgZnJvbSB0aGUgU0RQLgorCSAgRml4IHJhY2UgaW4gcGF1c2UgaGFuZGxlciB3aGVyZSB0aGUgY29ubmVjdGlvbiBjb3VsZCBzdGlsbCBiZSBmbHVzaGluZy4KKworMjAwNy0wNS0wMiAxOTozMjo1OCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy4qOiBGaXggcmFjZSB3aGVuIG11bHRpcGxlIHVkcCBzb3VyY2VzIHBvc3QgdGltZW91dHMsIGp1c3QgYWN0IG9uIHRoZSBmaXJzdCByZWNlaXZlZCB0aW1lb3V0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2luaXQpLAorCSAgKGdzdF9ydHNwc3JjX2ZpbmFsaXplKSwgKG5ld19zZXNzaW9uX3BhZCksIChyZXF1ZXN0X3B0X21hcCksCisJICAoZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCksIChnc3RfcnRzcHNyY190cnlfc2VuZCksCisJICAoZ3N0X3J0c3BzcmNfc2VuZCksIChnc3RfcnRzcHNyY19hc3luY19vcGVuKSwgKGdzdF9ydHNwc3JjX2Nsb3NlKSwKKwkgIChnc3RfcnRzcHNyY19wbGF5KSwgKGdzdF9ydHNwc3JjX2hhbmRsZV9tZXNzYWdlKSwKKwkgIChnc3RfcnRzcHNyY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBGaXggcmFjZSB3aGVuIG11bHRpcGxlIHVkcCBzb3VyY2VzIHBvc3QgdGltZW91dHMsIGp1c3QgYWN0IG9uIHRoZSBmaXJzdAorCSAgcmVjZWl2ZWQgdGltZW91dC4KKwkgIFByb3RlY3Qgc3RyZWFtIGxpc3Qgd2l0aCBhIHJlY3Vyc2l2ZSBsb2NrIHRvIGZpeCBzb21lIHJhY2VzLgorCSAgRmx1c2ggY29ubmVjdGlvbiB3aGVuIHdlIG5lZWQgdG8gZG8gYSByZWNvbm5lY3Qgb3Igc3RvcC4KKwkgIE1ha2Ugc3RhdGUgbG9jayByZWN1cnNpdmUuCisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fY29ubmVjdCksCisJICAocnRzcF9jb25uZWN0aW9uX2Nsb3NlKToKKwkgIFNvbWUgc21hbGwgY2xlYW51cHMuCisKKzIwMDctMDUtMDIgMTg6MzE6MTYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFjay5jOiBDYWxsIGJpbmR0ZXh0ZG9tYWluKCkgdG8gZ2V0IGxvY2FsaXplZCBzdHJpbmdzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2suYzogKHBsdWdpbl9pbml0KToKKwkgIENhbGwgYmluZHRleHRkb21haW4oKSB0byBnZXQgbG9jYWxpemVkIHN0cmluZ3MuCisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogKGdzdF93YXZwYWNrX2RlY19jaGFpbik6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiAoZ3N0X3dhdnBhY2tfcGFyc2VfcmVzZXQpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2hhbmRsZV9zZWVrX2V2ZW50KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9wdXNoX2J1ZmZlciksIChnc3Rfd2F2cGFja19wYXJzZV9jaGFpbik6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5oOgorCSAgSGFuZGxlIERJU0NPTlQgYnVmZmVycyBieSBjb3JyZWN0bHkgc2V0dGluZyB0aGUgRElTQ09OVCBmbGFnCisJICBvbiBvdXRnb2luZyBidWZmZXJzIHdoZW4gbmVjZXNzYXJ5LgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogKGdzdF93YXZwYWNrX3BhcnNlX2hhbmRsZV9zZWVrX2V2ZW50KQorCSAgU2VuZCBuZXdzZWdtZW50IGZyb20gdGhlIHN0cmVhbWluZyB0aHJlYWQuCisKKzIwMDctMDUtMDIgMTg6MjU6MDkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBPbmx5IHNldCBESVNDT05UIHdoZW4gdGhlcmUgYWN0dWFsbHkgaXMgYSBkaXNjb250IG9yIHdoZW4gd2UganVzdCBzdGFydGVkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2VlayksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKSwgKGdzdF93YXZwYXJzZV9zdHJlYW1fZGF0YSk6CisJICBPbmx5IHNldCBESVNDT05UIHdoZW4gdGhlcmUgYWN0dWFsbHkgaXMgYSBkaXNjb250IG9yIHdoZW4gd2UganVzdAorCSAgc3RhcnRlZC4KKworMjAwNy0wNS0wMiAxODowMTo1MiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvZmxhYy9nc3RmbGFjLmM6IENhbGwgYmluZHRleHRkb21haW4oKSB0byBnZXQgbG9jYWxpemVkIHN0cmluZ3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhYy5jOiAocGx1Z2luX2luaXQpOgorCSAgQ2FsbCBiaW5kdGV4dGRvbWFpbigpIHRvIGdldCBsb2NhbGl6ZWQgc3RyaW5ncy4KKworMjAwNy0wNS0wMiAxNzoxOTozNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLio6IEJlIGEgYml0IG1vcmUgY2xldmVyIHdoZW4gZGVhbGluZyB3aXRoIFZCUiBmaWxlcyB3aXRoIEZBQ1QgdGFncywgd2UgZG9uJ3Qgd2FudCB0byB0aW1lc3RhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcGVyZm9ybV9zZWVrKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMpLCAoZ3N0X3dhdnBhcnNlX2FkZF9zcmNfcGFkKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuaDoKKwkgIEJlIGEgYml0IG1vcmUgY2xldmVyIHdoZW4gZGVhbGluZyB3aXRoIFZCUiBmaWxlcyB3aXRoIEZBQ1QgdGFncywgd2UKKwkgIGRvbid0IHdhbnQgdG8gdGltZXN0YW1wIGJ1ZmZlcnMgaW4gdGhhdCBjYXNlIGJ1dCB0aGUgZXN0aW1hdGVkIEJQUyBjYW4KKwkgIGJlIHVzZWQgZm9yIHNlZWtpbmcuCisJICBPbmx5IHNlbmQgY2xvc2Ugc2VnbWVudCBpbiB0aGUgc3RyZWFtaW5nIHRocmVhZC4KKworMjAwNy0wNS0wMiAxNzowODowOSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IENvcnJlY3RseSBwb3N0IGFuIGVycm9yIG9uIHRoZSBidXMgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcgaW4gdGhlIGxvb3AgZnVuY3Rpb24uIFRoaXMgZml4ZXMgYSAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19kZWNfbG9vcCk6CisJICBDb3JyZWN0bHkgcG9zdCBhbiBlcnJvciBvbiB0aGUgYnVzIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nIGluIHRoZSBsb29wCisJICBmdW5jdGlvbi4gVGhpcyBmaXhlcyBhIGZldyBjYXNlcyB3aGVyZSB0aGUgdGFzayB3YXMgcGF1c2VkIGFuZCBub3RoaW5nCisJICBoYXBwZW5lZCBhbnltb3JlLgorCisyMDA3LTA1LTAyIDE2OjU4OjA2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiBSZW1vdmUgb2xkIHdvcmthcm91bmQgdGhhdCB3YXMgbmVlZGVkIHdoZW4gc2Vla2luZyBhZnRlciB0aGUgbGFzdCBzYW1wbGUuIFdpdGggdGhlIGZpeC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2hhbmRsZV9zZWVrX2V2ZW50KToKKwkgIFJlbW92ZSBvbGQgd29ya2Fyb3VuZCB0aGF0IHdhcyBuZWVkZWQgd2hlbiBzZWVraW5nIGFmdGVyIHRoZSBsYXN0CisJICBzYW1wbGUuIFdpdGggdGhlIGZpeGVkIGVycm9yIGhhbmRsaW5nIHRoaXMgd29ya3Mgbm93IGFzIGV4cGVjdGVkCisJICB3aXRob3V0IHB1c2hpbmcgdGhlIGxhc3Qgc2FtcGxlIGFsdGhvdWdoIGl0IHdhc24ndCByZXF1ZXN0ZWQuCisKKzIwMDctMDUtMDIgMTY6NDU6NDMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IEhhbmRsZSBzZWdtZW50IHNlZWtzIGluIHRoZSBzZWVrIGV2ZW50IGhhbmRsZXIsIGNvcnJlY3RseSB3b3JrIHdpdGggc3RvcCBwb3NpdGlvbiA9PSAtLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6CisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfaGFuZGxlX3NlZWtfZXZlbnQpOgorCSAgSGFuZGxlIHNlZ21lbnQgc2Vla3MgaW4gdGhlIHNlZWsgZXZlbnQgaGFuZGxlciwgY29ycmVjdGx5IHdvcmsgd2l0aAorCSAgc3RvcCBwb3NpdGlvbiA9PSAtMSBhbmQgaW5zdGVhZCBvZiBzdG9wcGluZyB0aGUgdGFzayBvbiBzZWVrIGp1c3QKKwkgIHBhdXNlIGl0LgorCisyMDA3LTA1LTAyIDE2OjE5OjU4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiBBZGQgaGFuZGxpbmcgZm9yIHNlZ21lbnQgc2Vla3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IChnc3Rfd2F2cGFja19wYXJzZV9sb29wKToKKwkgIEFkZCBoYW5kbGluZyBmb3Igc2VnbWVudCBzZWVrcy4KKworMjAwNy0wNS0wMiAxNToxMzowNCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogQ29ycmVjdGx5IGhhbmRsZSBlcnJvcnMsIGVzcGVjaWFsbHkgaW4gdGhlIGxvb3AgZnVuY3Rpb24uIEJlZm9yZSBpdCB3YXMgZWFzeSB0byBnZXQgdGguLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogKGdzdF93YXZwYWNrX3BhcnNlX3B1bGxfYnVmZmVyKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9jcmVhdGVfc3JjX3BhZCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfcmVzeW5jX2xvb3ApLCAoZ3N0X3dhdnBhY2tfcGFyc2VfbG9vcCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfY2hhaW4pOgorCSAgQ29ycmVjdGx5IGhhbmRsZSBlcnJvcnMsIGVzcGVjaWFsbHkgaW4gdGhlIGxvb3AgZnVuY3Rpb24uIEJlZm9yZSBpdAorCSAgd2FzIGVhc3kgdG8gZ2V0IHRoZSB0YXNrIHBhdXNlZCBidXQgbm8gZXJyb3IgYmVpbmcgcG9zdGVkIG9uIHRoZSBidXMuCisKKzIwMDctMDUtMDIgMTQ6Mjc6MjggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL3Rlc3QuYzogRml4IGNvbXBpbGF0aW9uIG9mIGRlcHJlY2F0ZWQgdGVzdCBqdXN0IGJlY2F1c2UgSSdtIHRvbyBsYXp5IHRvIGRlbGV0ZSBpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC90ZXN0LmM6IChtYWluKToKKwkgIEZpeCBjb21waWxhdGlvbiBvZiBkZXByZWNhdGVkIHRlc3QganVzdCBiZWNhdXNlIEknbSB0b28gbGF6eSB0byBkZWxldGUKKwkgIGl0LgorCisyMDA3LTA1LTAyIDEzOjMyOjU3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLio6IEZpeCBzZW5kaW5nIFJUQ1AgdG8gdGhlIHJpZ2h0IHBsYWNlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2luaXQpLAorCSAgKGdzdF9ydHNwc3JjX2ZpbmFsaXplKSwgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KSwKKwkgIChnc3RfcnRzcHNyY19oYW5kbGVfcmVxdWVzdCksIChnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkKSwKKwkgIChnc3RfcnRzcHNyY19zZW5kX2tlZXBfYWxpdmUpLCAoZ3N0X3J0c3BzcmNfbG9vcF91ZHApLAorCSAgKGdzdF9ydHNwc3JjX2xvb3Bfc2VuZF9jbWQpLCAoZ3N0X3J0c3BzcmNfdHJ5X3NlbmQpLAorCSAgKGdzdF9ydHNwc3JjX29wZW4pLCAoZ3N0X3J0c3BzcmNfaGFuZGxlX21lc3NhZ2UpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBGaXggc2VuZGluZyBSVENQIHRvIHRoZSByaWdodCBwbGFjZS4KKwkgIEZpeCBidWcgaW4gcmVmZmluZyB0aGUgd3JvbmcgVURQIGVsZW1lbnQuCisJICBVc2UgbmV3IHBhZCBuYW1lcyBmb3IgdGhlIHNlc3Npb24gbWFuYWdlci4KKwkgIEltcGxlbWVudCBoYW5kbGluZyBzZXJ2ZXIgcmVxdWVzdHMgaW4gaW50ZXJsZWF2ZWQgYW5kIFVEUCBtb2Rlcy4KKwkgIEhhbmRsZSBzZXNzaW9uIGtlZXAtYWxpdmUgaW4gVURQIG1vZGVzLgorCSAgUmVtb3ZlIEdDb25kIGZvciBoYW5kbGluZyBVRFAgdGltZW91dHMuCisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fY29ubmVjdCksCisJICAocnRzcF9jb25uZWN0aW9uX3NlbmQpLCAocnRzcF9jb25uZWN0aW9uX3JlYWQpLCAocmVhZF9ib2R5KSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fcmVjZWl2ZSksIChydHNwX2Nvbm5lY3Rpb25fY2xvc2UpOgorCSAgKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5oOgorCSAgU3RvcmUgY29ubmVjdGlvbiBJUCBhZGRyZXNzIGZvciBsYXRlci4KKwkgIEFkZCB0aW1lb3V0IGFyZ3MgdG8gYWxsIG9wZXJhdGlvbnMgdGhhdCBtaWdodCBibG9jayBmb3JldmVyLgorCSAgUGFyc2Ugc2Vzc2lvbiB0aW1lb3V0LgorCSAgT25seSBjbG9zZSBzb2NrZXRzIHdoZW4gbm90IGFscmVhZHkgY2xvc2VkLgorCSAgKiBnc3QvcnRzcC9ydHNwZGVmcy5jOgorCSAgKiBnc3QvcnRzcC9ydHNwZGVmcy5oOgorCSAgQWRkIHRpbWVvdXQgcmV0dXJuIHZhbHVlIGFuZCBlcnJvciBzdHJpbmcuCisJICAqIGdzdC9ydHNwL3J0c3BtZXNzYWdlLmM6IChydHNwX21lc3NhZ2VfaW5pdF9yZXNwb25zZSk6CisJICBBZGQgc21hbGwgY29tbWVudC4KKworMjAwNy0wNS0wMSAxNjoxMzo1OCArMDAwMCAgU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PgorCisJICBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuKjogSGFuZGxlIE5FV1NFR01FTlQgYW5kIEZMVVNIIGV2ZW50cy4gRml4ZXMgIzQzNDgyNC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFNqb2VyZCBTaW1vbnMgPHNqb2VyZCBhdCBsdW9uIGRvdCBuZXQ+CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOiAoZ3N0X3J0cF9tcDR2X3BheV9pbml0KSwKKwkgIChnc3RfcnRwX21wNHZfcGF5X2VtcHR5KSwgKGdzdF9ydHBfbXA0dl9wYXlfZXZlbnQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuaDoKKwkgIEhhbmRsZSBORVdTRUdNRU5UIGFuZCBGTFVTSCBldmVudHMuIEZpeGVzICM0MzQ4MjQuCisKKzIwMDctMDQtMzAgMTE6MTU6NTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOiBSZW1vdmUgdjRsMnNyYyBmcm9tIGRvY3MsIHNpbmNlIGl0IGJyZWFrcyB0aGUgZG9jcyBidWlsZCwgYW5kIHRoZSBwbC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgUmVtb3ZlIHY0bDJzcmMgZnJvbSBkb2NzLCBzaW5jZSBpdCBicmVha3MgdGhlIGRvY3MgYnVpbGQsIGFuZCB0aGUKKwkgIHBsdWdpbiBpcyBvbmx5IGJ1aWx0IGlmIC0tZW5hYmxlLWV4cGVyaW1lbnRhbCBpcyB1c2VkIGFueXdheS4KKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgU3BhY2VzID0+IHRhYi4KKworMjAwNy0wNC0yOSAxNDo0MzozNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogQWRkIGNvZGUgdG8gZHJvcCBtZW1iZXJzaGlwIG9mIGEgbXVsdGljYXN0IGdyb3VwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChsZWF2ZV9tdWx0aWNhc3QpLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfYWRkKSwgKGdzdF9tdWx0aXVkcHNpbmtfcmVtb3ZlKToKKwkgIEFkZCBjb2RlIHRvIGRyb3AgbWVtYmVyc2hpcCBvZiBhIG11bHRpY2FzdCBncm91cC4KKwkgICogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6IChnc3RfdWRwc2lua191cGRhdGVfdXJpKSwKKwkgIChnc3RfdWRwc2lua19zZXRfdXJpKToKKwkgIEltcGxlbWVudCBVUkkgaGFuZGxlci4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV90cmFuc3BvcnQpLAorCSAgKGdzdF9ydHNwc3JjX3BhcnNlX3J0cGluZm8pOgorCSAgVXNlIFVSSSBoYW5kbGVyIHRvIG1ha2UgdWRwc2luayBpbnN0YWNlLgorCSAgSW1wcm92ZSBjb2RlIHRvIGNvbmZpZ3VyZSBwb3J0IGFuZCBkZXN0aW5hdGlvbi4KKworMjAwNy0wNC0yOSAxMzo1NjoxOCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICA4MCBjaGFyIHBvbGljZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICA4MCBjaGFyIHBvbGljZQorCisyMDA3LTA0LTI5IDEzOjUzOjE2ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgYXV0b2dlbi5zaDogUmVxdWlyZSBhdXRvbWFrZSAxLjcKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBhdXRvZ2VuLnNoOgorCSAgUmVxdWlyZSBhdXRvbWFrZSAxLjcKKwkgICogZXh0L2Fsc2FzcGRpZi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2RpdngvTWFrZWZpbGUuYW06CisJICAqIGV4dC9pdm9yYmlzL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXVzaWNicmFpbnovTWFrZWZpbGUuYW06CisJICAqIGV4dC9uZW9uL01ha2VmaWxlLmFtOgorCSAgKiBleHQvc2RsL01ha2VmaWxlLmFtOgorCSAgKiBleHQvc3dmZGVjL01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGhlb3JhL01ha2VmaWxlLmFtOgorCSAgKiBleHQvd2F2cGFjay9NYWtlZmlsZS5hbToKKwkgICogZXh0L3h2aWQvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tb2RwbHVnL01ha2VmaWxlLmFtOgorCSAgRml4IHVwIE1ha2VmaWxlLmFtIGFjY29yZGluZ2x5LgorCisyMDA3LTA0LTI5IDEzOjQ5OjAyICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvOiBBZGQgamFjayBhbmQgdXBkYXRlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHNhc3BkaWYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYnoyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNkeGFwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZmJ2aWRlb3NpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmFhYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mYWFkLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZpbHRlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mcmVlemUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2xpbWFnZXNpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3NtLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWgyNjRwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1tcy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb2RwbHVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11c2VwYWNrLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11c2ljYnJhaW56LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5lb24ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbnNmZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2RsLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdW5kdG91Y2gueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZWQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdHRhLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbmdoZWFkZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teHZpZC54bWw6CisJICBBZGQgamFjayBhbmQgdXBkYXRlLgorCisyMDA3LTA0LTI5IDEyOjE5OjIxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiBGaXggbXVsdGljYXN0IGRldGVjdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19hZGQpOgorCSAgRml4IG11bHRpY2FzdCBkZXRlY3Rpb24uCisJICBEb24ndCB0cnkgdG8gam9pbiBhIG11bHRpY2FzdCBncm91cCBpZiB0aGUgYWRkcmVzcyBpcyBub3QgbXVsdGljYXN0LgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY191cGRhdGVfdXJpKToKKwkgIFNtYWxsIGRlYnVnIGltcHJvdmVtZW50LgorCisyMDA3LTA0LTI3IDE2OjQ0OjE3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IElnbm9yZSBBU1lOQyBzdGF0ZSBtZXNzYWdlcyBmcm9tIHRoZSB1ZHBzaW5rLCBpdCdzIGlycmVsZXZhbnQgZm9yIHRoZSBwYXJlbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV90cmFuc3BvcnQpLAorCSAgKGdzdF9ydHNwc3JjX3BhcnNlX3J0cGluZm8pLCAoZ3N0X3J0c3BzcmNfcGxheSksCisJICAoZ3N0X3J0c3BzcmNfaGFuZGxlX21lc3NhZ2UpOgorCSAgSWdub3JlIEFTWU5DIHN0YXRlIG1lc3NhZ2VzIGZyb20gdGhlIHVkcHNpbmssIGl0J3MgaXJyZWxldmFudCBmb3IgdGhlCisJICBwYXJlbnQuCisKKzIwMDctMDQtMjcgMTU6MzA6MzkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5Lmg6IEZpeCBtb2RlIHByb3BlcnR5IHdoZW4gc3BlY2lmaWVkIGFzIGFuIGFyZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5oOgorCSAgRml4IG1vZGUgcHJvcGVydHkgd2hlbiBzcGVjaWZpZWQgYXMgYW4gYXJnLgorCisyMDA3LTA0LTI2IDE1OjA4OjIwICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBkb2NzL3BsdWdpbnMvOiBBZGQgZG9jdW1lbnRhdGlvbiBmb3Igb3N4YXVkaW8gcGx1Z2luLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3hhdWRpby54bWw6CisJICBBZGQgZG9jdW1lbnRhdGlvbiBmb3Igb3N4YXVkaW8gcGx1Z2luLgorCisyMDA3LTA0LTI2IDE0OjMxOjMyICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBkb2NzL3BsdWdpbnMvOiBBZGQgZG9jdW1lbnRhdGlvbiBmb3Igb3N4dmlkZW8KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3N4dmlkZW8ueG1sOgorCSAgQWRkIGRvY3VtZW50YXRpb24gZm9yIG9zeHZpZGVvCisKKzIwMDctMDQtMjYgMTA6MDg6MjcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuKjogUHJvdGVjdCBzdGF0ZSBjaGFuZ2VzIHdpdGggYSBsb2NrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2luaXQpLAorCSAgKGdzdF9ydHNwc3JjX2ZpbmFsaXplKSwgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KSwKKwkgIChnc3RfcnRzcHNyY19vcGVuKSwgKGdzdF9ydHNwc3JjX2Nsb3NlKSwKKwkgIChnc3RfcnRzcHNyY19wYXJzZV9ydHBpbmZvKSwgKGdzdF9ydHNwc3JjX3BsYXkpLAorCSAgKGdzdF9ydHNwc3JjX3BhdXNlKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgUHJvdGVjdCBzdGF0ZSBjaGFuZ2VzIHdpdGggYSBsb2NrLgorCSAgKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOiAocnRzcF9jb25uZWN0aW9uX2NyZWF0ZSksCisJICAocGFyc2VfbGluZSk6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmg6CisJICBSZW1vdmUgc29tZSB1bnVzZWQgc3R1ZmYuCisKKzIwMDctMDQtMjYgMDg6NDg6MzAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGVyZSBhcmUgZXhhY3RseSAwIGJ5dGVzIHRvIHJlYWQgYW5kIHRoZSBpb2N0bCBkaWQgbm90IHJlcG9ydCBhbiBlcnJvci4gRi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2NyZWF0ZSk6CisJICBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgYXJlIGV4YWN0bHkgMCBieXRlcyB0byByZWFkIGFuZCB0aGUgaW9jdGwKKwkgIGRpZCBub3QgcmVwb3J0IGFuIGVycm9yLiBGaXhlcyAjNDMzNTMwLgorCisyMDA3LTA0LTI2IDA4OjM5OjQ5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuKjogQXBwbHkgRElTQ09OVCB0byBidWZmZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2VlayksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKSwgKGdzdF93YXZwYXJzZV9zdHJlYW1fZGF0YSk6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5oOgorCSAgQXBwbHkgRElTQ09OVCB0byBidWZmZXJzLgorCSAgT25seSBhcHBseSB0aW1lc3RhbXAgdG8gdGhlIGZpcnN0IHNhbXBsZSBhZnRlciBhIERJU0NPTlQsIHRvbyBtYW55IFZCUgorCSAgZmlsZXMgY2F1c2UgcmFuZG9tIGppdHRlciBpbiB0aGUgdGltZXN0YW1wcy4gRml4ZXMgIzQzMzExOS4KKworMjAwNy0wNC0yNSAxNTo1NTozMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRwZGVjLio6IEFkZCBkdW1teSBsYXRlbmN5IHByb3BlcnR5IHRvIGJlIGJhY2t3YXJkcyBjb21wYXQgd2l0aCBydHBiaW4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRwZGVjLmM6IChnc3RfcnRwX2RlY19jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX2RlY19pbml0KSwgKGdzdF9ydHBfZGVjX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9kZWNfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L3J0c3AvZ3N0cnRwZGVjLmg6CisJICBBZGQgZHVtbXkgbGF0ZW5jeSBwcm9wZXJ0eSB0byBiZSBiYWNrd2FyZHMgY29tcGF0IHdpdGggcnRwYmluLgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfcnRzcHNyY19zZXRfcHJvcGVydHkpLCAoZ3N0X3J0c3BzcmNfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfcnRwaW5mbyk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIEFkZCBsYXRlbmN5IHByb3BlcnR5IGFuZCBjb25maWd1cmUgaW4gdGhlIHNlc3Npb24gbWFuYWdlci4KKwkgIERvbid0IHNldCBpbnZhbGlkIGNsb2NrLWJhc2UgYW5kIHNlcW51bS1iYXNlIG9uIGNhcHMsIHNvbWUgc2VydmVycworCSAgc29tZXRpbWVzIGRvbid0IHNlbmQgdGhlbS4KKworMjAwNy0wNC0yNSAxNTozMTo1MyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzogRG91YmxlLWNoZWNrIHRoYXQgUkdCIGlucHV0IGNhcHMgYXJlIHJlYWxseSBSR0JBIGNhcHMgKGFwcGFyZW50bHkgdGhlIGNvcmUgZG9lc24ndCBhbHdheXMgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzogKGdzdF9hbHBoYV9jb2xvcl9iYXNlX2luaXQpLAorCSAgKGdzdF9hbHBoYV9jb2xvcl90cmFuc2Zvcm1fY2FwcyksIChnc3RfYWxwaGFfY29sb3Jfc2V0X2NhcHMpOgorCSAgRG91YmxlLWNoZWNrIHRoYXQgUkdCIGlucHV0IGNhcHMgYXJlIHJlYWxseSBSR0JBIGNhcHMgKGFwcGFyZW50bHkKKwkgIHRoZSBjb3JlIGRvZXNuJ3QgYWx3YXlzIGNhdGNoIGl0IGlmIHRob3NlIGNhcHMgYXJlbid0IGEgc3Vic2V0IG9mCisJICBvdXIgdGVtcGxhdGUgY2FwcywgYWxzbyBzZWUgIzQyMTU0MykuIEZpeGVzICM0MjkzMTkgaW4gYSB3YXkuCisJICBBbHNvLCBkb24ndCBsZWFrIHRoZSBwYWQgdGVtcGxhdGUgaW4gdGhlIHRyYW5zZm9ybV9jYXBzIGZ1bmN0aW9uLgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYWxwaGFjb2xvci5jOiAoc2V0dXBfYWxwaGFjb2xvciksCisJICAoY2xlYW51cF9hbHBoYWNvbG9yKSwgKGNyZWF0ZV9jYXBzX3JnYjI0KSwgKGNyZWF0ZV9jYXBzX3JnYmEzMiksCisJICAoY3JlYXRlX2J1ZmZlcl9yZ2IyNF8zeDQpLCAoY3JlYXRlX2J1ZmZlcl9yZ2JhMzJfM3g0KSwKKwkgIChHU1RfU1RBUlRfVEVTVCksIChhbHBoYWNvbG9yX3N1aXRlKToKKwkgIEFkZCBzb21lIGJhc2ljIHVuaXQgdGVzdHMgZm9yIGFscGhhY29sb3IuCisKKzIwMDctMDQtMjUgMTU6MDg6MjIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IElmIHdlIGdldCBhIGZhdGFsIGZsb3cgcmV0dXJuIGluIHRoZSBsb29wIGZ1bmN0aW9uLCBmaXJzdCBwb3N0IHRoZSBlcnJvciBtZXNzYWdlIGFuZCBvbmx5IHRoZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IChnc3RfcG5nZGVjX3Rhc2spOgorCSAgSWYgd2UgZ2V0IGEgZmF0YWwgZmxvdyByZXR1cm4gaW4gdGhlIGxvb3AgZnVuY3Rpb24sIGZpcnN0IHBvc3QgdGhlCisJICBlcnJvciBtZXNzYWdlIGFuZCBvbmx5IHRoZW4gc2VuZCB0aGUgRU9TIGV2ZW50IGRvd25zdHJlYW0sIG90aGVyd2lzZQorCSAgYXBwbGljYXRpb25zIG1pZ2h0IGdldCBhbiBlb3MgbWVzc2FnZSBiZWZvcmUgdGhlIGVycm9yIG1lc3NhZ2UgYW5kCisJICB0aGluayBldmVyeXRoaW5nIHdhcyBvayAocmVsYXRlZCB0byAjNDI5MzE5KS4KKworMjAwNy0wNC0yNSAxMDowNzoxMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogUmVhZCB0aGUgY2hhbm5lbCBieXRlIGFzIGFuIHVuc2lnbmVkIGJ5dGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKHJ0c3BfY29ubmVjdGlvbl9yZWNlaXZlKToKKwkgIFJlYWQgdGhlIGNoYW5uZWwgYnl0ZSBhcyBhbiB1bnNpZ25lZCBieXRlLgorCisyMDA3LTA0LTI1IDA5OjQ3OjQ4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogTWFrZSBzdXJlIHdlIGNvbmZpZ3VyZSB0aGUgY2xvY2tfcmF0ZSBpbiB0aGUgYmFzZWNsYXNzIGluIHRoZSBzZXRjYXBzIGZ1bmN0aW9uLiBGaXhlcyAjNDMxMjgyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzogKGdzdF9ydHBfTDE2X2RlcGF5X3NldF9wcm9wZXJ0eSk6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzogKGdzdF9ydHBfYW1yX2RlcGF5X2luaXQpLAorCSAgKGdzdF9ydHBfYW1yX2RlcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9hbXJfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuYzogKGdzdF9ydHBfZ3NtX2RlcGF5X2luaXQpLAorCSAgKGdzdF9ydHBfZ3NtX2RlcGF5X3NldGNhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzogKGdzdF9ydHBfaDI2M3BfZGVwYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6IChnc3RfcnRwX2gyNjRfZGVwYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6IChnc3RfcnRwX2lsYmNfZGVwYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9pbGJjX2RlcGF5X2luaXQpLCAoZ3N0X3J0cF9pbGJjX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfaWxiY19kZXBheV9wcm9jZXNzKSwgKGdzdF9pbGJjX2RlcGF5X3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2lsYmNfZGVwYXlfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuYzogKGdzdF9ydHBfbXAydF9kZXBheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzogKGdzdF9ydHBfcGNtYV9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX3BjbWFfZGVwYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmM6IChnc3RfcnRwX3BjbXVfZGVwYXlfaW5pdCksCisJICAoZ3N0X3J0cF9wY211X2RlcGF5X3NldGNhcHMpOgorCSAgTWFrZSBzdXJlIHdlIGNvbmZpZ3VyZSB0aGUgY2xvY2tfcmF0ZSBpbiB0aGUgYmFzZWNsYXNzIGluIHRoZSBzZXRjYXBzCisJICBmdW5jdGlvbi4gRml4ZXMgIzQzMTI4Mi4KKworMjAwNy0wNC0yNSAwODozNjo0NiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy4qOiBQYXJzZSBzZXJ2ZXIgYWRkcmVzcyBmcm9tIFNEUC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19maW5hbGl6ZSksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2ZyZWUpLCAocmVxdWVzdF9wdF9tYXApLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KSwgKGdzdF9ydHNwc3JjX29wZW4pOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBQYXJzZSBzZXJ2ZXIgYWRkcmVzcyBmcm9tIFNEUC4KKwkgIEhvb2sgdXAgYSB1ZHBzaW5rIHRvIHNlbmQgUlRDUCBiYWNrIHRvIHRoZSBzZXJ2ZXIuCisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0Lmg6CisJICBBZGQgc29tZSBkb2NzLgorCisyMDA3LTA0LTI1IDA2OjUyOjA5ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBNYWtlIGhlYWRlciBmaWVsZCBjaGVjayBjb25kaXRpb25hbC4gRml4ZXMgIzQzMzEzNQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKToKKwkgIE1ha2UgaGVhZGVyIGZpZWxkIGNoZWNrIGNvbmRpdGlvbmFsLiBGaXhlcyAjNDMzMTM1CisKKzIwMDctMDQtMjQgMDk6MTI6NDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIEFkZCBtaW5pbWFsIGRvY3MgYmx1cmIgdG8gYWxwaGFjb2xvcjsgc3BsaXQgb3V0IGhlYWRlcnMgaW50byBzZXBhcmF0ZSBoZWFkZXIgZmlsZSBmb3IgZ3RrLWRvYy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSAgKiBnc3QvYWxwaGEvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJICAqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmg6CisJICBBZGQgbWluaW1hbCBkb2NzIGJsdXJiIHRvIGFscGhhY29sb3I7IHNwbGl0IG91dCBoZWFkZXJzIGludG8KKwkgIHNlcGFyYXRlIGhlYWRlciBmaWxlIGZvciBndGstZG9jLgorCisyMDA3LTA0LTIwIDE3OjI1OjUwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvZGVidWcvcHJvZ3Jlc3NyZXBvcnQuYzogRG9uJ3QgdHJ5IHRvIHBvc3QgTlVMTCBtZXNzYWdlIChpbiBjYXNlIHdlIGNhbid0IHF1ZXJ5IHVwc3RyZWFtIHBvc2l0aW9uIG9yIGR1cmF0aW9uKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVidWcvcHJvZ3Jlc3NyZXBvcnQuYzogKGdzdF9wcm9ncmVzc19yZXBvcnRfcmVwb3J0KToKKwkgIERvbid0IHRyeSB0byBwb3N0IE5VTEwgbWVzc2FnZSAoaW4gY2FzZSB3ZSBjYW4ndCBxdWVyeSB1cHN0cmVhbQorCSAgcG9zaXRpb24gb3IgZHVyYXRpb24pLgorCisyMDA3LTA0LTE4IDEyOjM2OjM3ICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLio6IEZpeCBzb21lIG9mIHRoZSBtb3N0IG9idmlvdXMgYnVncyBpbiBjdXR0ZXIuIE5vdyBkb2Vzbid0IGxlYWsgZXZlcnl0aGluZyBpZiBpbnB1dCBpcyBzaWxlbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzogKGdzdF9jdXR0ZXJfaW5pdCksIChnc3RfY3V0dGVyX2NoYWluKSwKKwkgIChnc3RfY3V0dGVyX2dldF9jYXBzKToKKwkgICogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuaDoKKwkgIEZpeCBzb21lIG9mIHRoZSBtb3N0IG9idmlvdXMgYnVncyBpbiBjdXR0ZXIuIE5vdyBkb2Vzbid0IGxlYWsKKwkgIGV2ZXJ5dGhpbmcgaWYgaW5wdXQgaXMgc2lsZW50LgorCisyMDA3LTA0LTE4IDA5OjQ4OjI1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLio6IGV2ZXJ5dGhpbmcgZWxzZSByZXN1bHRzIGluIGEgaW52YWxpZCBibG9jayBhbGlnbiBhbmQgaW52YWxpZCBmaWxlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiAoZ3N0X3dhdmVuY19jcmVhdGVfaGVhZGVyX2J1ZiksCisJICAoZ3N0X3dhdmVuY19zaW5rX3NldGNhcHMpLCAoZ3N0X3dhdmVuY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5oOgorCSAgV2F2IGFwcGFyZW50bHkgb25seSBzdXBwb3J0cyB3aWR0aD09R1NUX1JPVU5EX1VQKGRlcHRoKSwgZXZlcnl0aGluZworCSAgZWxzZSByZXN1bHRzIGluIGEgaW52YWxpZCBibG9jayBhbGlnbiBhbmQgaW52YWxpZCBmaWxlcy4KKworMjAwNy0wNC0xNyAxNjozOTowMiArMDAwMCAgU25haWsgPHNuYWlrMzJAZ21haWwuY29tPgorCisJICBnc3Qvc21wdGUvYmFyYm94d2lwZXMuYzogQWRkIG1pc3NpbmcgYnJlYWsgc3RhdGVtZW50IGZvciBCT1hfSE9SSVpPTlRBTCBjYXNlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU25haWsgPHNuYWlrMzIgZ21haWwgY29tPgorCSAgKiBnc3Qvc21wdGUvYmFyYm94d2lwZXMuYzogKGdzdF93aXBlX2JveGVzX2RyYXcpOgorCSAgQWRkIG1pc3NpbmcgYnJlYWsgc3RhdGVtZW50IGZvciBCT1hfSE9SSVpPTlRBTCBjYXNlLgorCisyMDA3LTA0LTE3IDEwOjE0OjQzICswMDAwICBWaW5jZW50IFRvcnJpIDx2dG9ycmlAdW5pdi1ldnJ5LmZyPgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogVXNlIGNvcnJlY3QgZm9ybWF0IHN0cmluZ3MgZm9yIGludGVnZXIgdHlwZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBWaW5jZW50IFRvcnJpIDx2dG9ycmkgYXQgdW5pdi1ldnJ5IGRvdCBmcj4KKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMpOgorCSAgVXNlIGNvcnJlY3QgZm9ybWF0IHN0cmluZ3MgZm9yIGludGVnZXIgdHlwZXMuCisKKzIwMDctMDQtMTcgMDI6NTE6MDIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IFVzZSBnc3RfcmlmZl9jcmVhdGVfYXVkaW9fdGVtcGxhdGVfY2FwcyAoKSBpbnN0ZWFkIG9mIHRoZSBsb2NhbCBjYXBzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2Jhc2VfaW5pdCksCisJICAoZ3N0X3dhdnBhcnNlX2NyZWF0ZV9zb3VyY2VwYWQpOgorCSAgVXNlIGdzdF9yaWZmX2NyZWF0ZV9hdWRpb190ZW1wbGF0ZV9jYXBzICgpIGluc3RlYWQgb2YgdGhlIGxvY2FsIGNhcHMuCisJICBUaGlzIG1ha2VzIHVwZGF0ZXMgb2YgdGhlIGxvY2FsIGNhcHMgdW5lY2Vzc2FyeSB3aGVuZXZlciBsaWJnc3RyaWZmCisJICBnZXRzIHN1cHBvcnQgZm9yIG5ldyBmb3JtYXRzLgorCisyMDA3LTA0LTE2IDIxOjI5OjQwICswMDAwICBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uQHN1bi5jb20+CisKKwkgIHN5cy9zdW5hdWRpby86IEZpeCBhbmQvb3IgdXBkYXRlIGNvcHlyaWdodCBhdHRyaWJ1dGlvbnMgKCM0MzAyMjgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQnJpYW4gQ2FtZXJvbiAgPGJyaWFuLmNhbWVyb24gYXQgc3VuIGRvdCBjb20+CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpby5jOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlci5jOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlci5oOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuYzoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmg6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVydHJhY2suaDoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmg6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5jOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuaDoKKwkgIEZpeCBhbmQvb3IgdXBkYXRlIGNvcHlyaWdodCBhdHRyaWJ1dGlvbnMgKCM0MzAyMjgpLgorCisyMDA3LTA0LTE0IDE3OjE4OjE0ICswMDAwICBTw6liYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0LzogQWRkIHhtbCBkb2MgZmlsZXMgZm9yIFdpbmRvd3Mgc2lua3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGlyZWN0ZHJhdy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kaXJlY3Rzb3VuZC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlZm9ybS54bWw6CisJICBBZGQgeG1sIGRvYyBmaWxlcyBmb3IgV2luZG93cyBzaW5rcworCSAgKiB3aW4zMi92czYvbGliZ3N0cXRkZW11eC5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RtcGVndmlkZW9wYXJzZS5kc3A6CisJICAqIHdpbjMyL3ZzNi9nc3RfcGx1Z2luc19iYWQuZHN3OgorCSAgVXBkYXRlIHByb2plY3RzIGZpbGVzLgorCisyMDA3LTA0LTEzIDA5OjMyOjIxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDogRml4IGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBGaXggZG9jcy4KKwkgICogZ3N0L3J0c3AvVVJMUzoKKwkgIEFkZCBzb21lIG1vcmUgZXhhbXBsZSB1cmxzLgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuYzogKGdzdF9ydHBfZGVjX21hcnNoYWxfQk9YRURfX1VJTlRfVUlOVCksCisJICAoZ3N0X3J0cF9kZWNfY2hhaW5fcnRwKToKKwkgIEJldHRlciBkZWJ1Z2dpbmcuCisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKHJlcXVlc3RfcHRfbWFwKSwKKwkgIChnc3RfcnRzcHNyY19hY3RpdmF0ZV9zdHJlYW1zKSwgKGdzdF9ydHNwc3JjX2xvb3BfaW50ZXJsZWF2ZWQpLAorCSAgKGdzdF9ydHNwc3JjX3BhcnNlX3J0cGluZm8pOgorCSAgUmVtb3ZlIHVudXNlZCBjb2RlLgorCisyMDA3LTA0LTEzIDA4OjE5OjM1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBSZWxheCB0aGUgYXVkaW8vbXBlZyBjYXBzIGFnYWluIGFuZCBhZGQgRklYTUU6IGNvbW1lbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6ICh1aW50NjRfY2VpbGluZ19zY2FsZV9pbnQpLAorCSAgKGdzdF93YXZwYXJzZV9wZXJmb3JtX3NlZWspLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpOgorCSAgUmVsYXggdGhlIGF1ZGlvL21wZWcgY2FwcyBhZ2FpbiBhbmQgYWRkIEZJWE1FOiBjb21tZW50LgorCisyMDA3LTA0LTEzIDA2OjIwOjI4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS4qOiBNb3JlIHNhbml0eSBjaGVjayBmb3IgdGhlIGhlYWRlciBmaWVsZHMuIEZpeCB0eXBlIGZvciAncmF0ZScgaGVhZGVyIGZpZWxkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAodWludDY0X2NlaWxpbmdfc2NhbGVfaW50KSwKKwkgIChnc3Rfd2F2cGFyc2VfcGVyZm9ybV9zZWVrKSwgKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhKToKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICBNb3JlIHNhbml0eSBjaGVjayBmb3IgdGhlIGhlYWRlciBmaWVsZHMuIEZpeCB0eXBlIGZvciAncmF0ZScgaGVhZGVyCisJICBmaWVsZC4KKworMjAwNy0wNC0xMiAxNjowNjozMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6IElmIHRoZSBtZXRhZGF0YSBzdHJpbmdzIHdlIGdldCBpbiB0aGUgc3RyZWFtIGFyZSBub3QgVVRGLTgsIHRyeSB0byBpbnRlcnByZXQgdGhlbSBhY2NvcmRpLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6IChub3Rnc3RfdGFnX2ZyZWVmb3JtX3N0cmluZ190b191dGY4KSwKKwkgIChnc3RfaWN5ZGVtdXhfdW5pY29kaWZ5KToKKwkgIElmIHRoZSBtZXRhZGF0YSBzdHJpbmdzIHdlIGdldCBpbiB0aGUgc3RyZWFtIGFyZSBub3QgVVRGLTgsIHRyeSB0bworCSAgaW50ZXJwcmV0IHRoZW0gYWNjb3JkaW5nIHRvIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmdzIHNwZWNpZmllZCBpbiB0aGUKKwkgIEdTVF9JQ1lfVEFHX0VOQ09ESU5HIGFuZCBHU1RfVEFHX0VOQ09ESU5HIGVudmlyb25tZW50IHZhcmlhYmxlcywgYW5kCisJICBvbmx5IGZhbGwgYmFjayB0byBsb2NhbGUvSVNPLTg4NTktMSBpZiB0aG9zZSBhcmVuJ3Qgc2V0IG9yIGRvbid0CisJICB3b3JrLiBTaG91bGQgZml4ICM0Mjg5MDEuCisKKzIwMDctMDQtMTIgMTQ6MjA6NTYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6IFVzZSB0aGUgcHJvcGVyIHN5bmMgd29yZCBmb3IgU1BTIGFuZCBQUFMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIFVzZSB0aGUgcHJvcGVyIHN5bmMgd29yZCBmb3IgU1BTIGFuZCBQUFMuCisKKzIwMDctMDQtMTIgMTE6NDE6MTEgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBnc3QvcnRwL01ha2VmaWxlLmFtOiBnc3QvcnRwL2ZudjFoYXNoLmMgKE1BU0tfMjQsIEZOVjFfSEFTSF8zMl9JTklULCBGTlYxX0hBU0hfMzJfUFJJTUUsIGZudjFfaGFzaF8zMl9uZXcsIGZudjFfaGFzaF8uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwL2ZudjFoYXNoLmMgKE1BU0tfMjQsIEZOVjFfSEFTSF8zMl9JTklULCBGTlYxX0hBU0hfMzJfUFJJTUUsCisJICBmbnYxX2hhc2hfMzJfbmV3LCBmbnYxX2hhc2hfMzJfdXBkYXRlLCBmbnYxX2hhc2hfMzJfdG9fMjQpOgorCSAgKiBnc3QvcnRwL2ZudjFoYXNoLmggKF9fR1NUX0ZOVjFfSEFTSF9IX18pOgorCSAgQWRkIGEgc2ltcGxlIGhhc2hpbmcgaW1wbGVtZW50YXRpb24gdGhhdCB3ZSBjYW4gdXNlIHRvIGdlbmVyYXRlCisJICBhIDI0LWJpdCBpZGVudCB2YWx1ZSBiYXNlZCBvbiB0aGUgY29kZWJvb2tzIGZvciB2b3JiaXMgYW5kIHRoZW9yYS4KKwkgICogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYyAoZ3N0X3J0cF90aGVvcmFfcGF5X2ZpbmlzaF9oZWFkZXJzLAorCSAgZ3N0X3J0cF90aGVvcmFfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmMKKwkgIChnc3RfcnRwX3ZvcmJpc19kZXBheV9wYXJzZV9jb25maWd1cmF0aW9uLAorCSAgZ3N0X3J0cF92b3JiaXNfZGVwYXlfc3dpdGNoX2NvZGVib29rLCBnc3RfcnRwX3ZvcmJpc19kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYyAoZ3N0X3J0cF92b3JiaXNfcGF5X3Jlc2V0X3BhY2tldCwKKwkgIGdzdF9ydHBfdm9yYmlzX3BheV9pbml0X3BhY2tldCwgZ3N0X3J0cF92b3JiaXNfcGF5X2ZsdXNoX3BhY2tldCwKKwkgIGdzdF9ydHBfdm9yYmlzX3BheV9maW5pc2hfaGVhZGVycywgZ3N0X3J0cF92b3JiaXNfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgVXNlIHRoZSBoYXNoaW5nIGZ1bmN0aW9uLCBlbnN1cmluZyB0aGF0IHRoZSBzYW1lIGNvZGVib29rcyByZXN1bHQKKwkgIGluIHRoZSBzYW1lIGlkZW50IGFuZCB0aHVzIHRoZSBzYW1lIFNEUCBkZXNjcmlwdGlvbi4KKwkgIFZhcmlvdXMgbG9nIGZpeGVzL2NoYW5nZXMuCisKKzIwMDctMDQtMTIgMTE6Mzc6NTAgKzAwMDAgIGplcnJ5IHRhbiA8amVycnkudGFuQHN1bi5jb20+CisKKwkgIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5jOiBpdCBpcyB0aGUgYXBwbGljYXRpb24ncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgaXQgb3BlbiB0aGUgZGV2aWNlIG9uY2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBqZXJyeSB0YW4gPGplcnJ5IGRvdCB0YW4gYXQgc3VuIGRvdCBjb20+CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5jOiAoZ3N0X3N1bmF1ZGlvc3JjX29wZW4pOgorCSAgcmVtb3ZlIHRoZSBjYWxsIG9mICBpb2N0bCAoZmQsIEFVRElPX01JWEVSX01VTFRJUExFX09QRU4pLCBpdCBpcyB0aGUKKwkgIGFwcGxpY2F0aW9uJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIGl0IG9wZW4gdGhlIGRldmljZSBvbmNlLgorCSAgUmVtb3ZlIGEgY2FyZWxlc3MgZXJyb3IgaWYgQVVESU9ERVYgaXMgc2V0LiBGaXhlcyAjMzkyNjIwLgorCisyMDA3LTA0LTEyIDEwOjUyOjAyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IE1ha2UgdGltZXNjYWxlIDMyIGJpdHMgYWdhaW4gc28gd2UgZG9uJ3Qgc2NyZXcgdXAgdGhlIHB0c19vZmZzZXQgY2FsY3VsYXRpb25zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIE1ha2UgdGltZXNjYWxlIDMyIGJpdHMgYWdhaW4gc28gd2UgZG9uJ3Qgc2NyZXcgdXAgdGhlIHB0c19vZmZzZXQKKwkgIGNhbGN1bGF0aW9ucy4KKworMjAwNy0wNC0xMiAwODoyMToyOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRwZGVjLio6IE1ha2UgYmFja3dhcmQgY29tcGF0IHdpdGggcnRwYmluIGJ5IGFkZGluZyB0aGUgcmVxdWVzdC1wdC1tYXAgc2lnbmFscy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuYzogKGdzdF9ydHBfZGVjX21hcnNoYWxfQk9YRURfX1VJTlRfVUlOVCksCisJICAoZ3N0X3J0cF9kZWNfY2xhc3NfaW5pdCksIChnc3RfcnRwX2RlY19jaGFpbl9ydHApOgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuaDoKKwkgIE1ha2UgYmFja3dhcmQgY29tcGF0IHdpdGggcnRwYmluIGJ5IGFkZGluZyB0aGUgcmVxdWVzdC1wdC1tYXAgc2lnbmFscy4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfY3JlYXRlX3N0cmVhbSksCisJICAobmV3X3Nlc3Npb25fcGFkKSwgKHJlcXVlc3RfcHRfbWFwKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV9jYXBzKSwKKwkgIChnc3RfcnRzcHNyY19hY3RpdmF0ZV9zdHJlYW1zKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgSW1wbGVtZW50IHJlcXVlc3QtcHQtbWFwIHNpZ25hbHMgaW5zdGVhZCBvZiBzZXR0aW5nIGNhcHMgb24gdGhlIGJ1ZmZlcnMKKwkgIGZvciB0aGUgc2Vzc2lvbiBtYW5hZ2VyLgorCisyMDA3LTA0LTExIDEwOjI1OjI1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdHVkcC5jOiBSZWdpc3RlciBHc3ROZXRCdWZmZXIgaW4gcGx1Z2luX2luaXQgc28gdGhhdCB0aGUgdHlwZSBjYW4gYmUgdXNlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMgd2l0aG91dCByYWNlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdHVkcC5jOiAocGx1Z2luX2luaXQpOgorCSAgUmVnaXN0ZXIgR3N0TmV0QnVmZmVyIGluIHBsdWdpbl9pbml0IHNvIHRoYXQgdGhlIHR5cGUgY2FuIGJlIHVzZWQgZnJvbQorCSAgbXVsdGlwbGUgdGhyZWFkcyB3aXRob3V0IHJhY2VzLgorCisyMDA3LTA0LTExIDEwOjE5OjA2ICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIHVwZGF0ZSB0byBzcGVjIGZpbGUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdXBkYXRlIHRvIHNwZWMgZmlsZQorCisyMDA3LTA0LTExIDA5OjUzOjM4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC86IEhhbmRsZSB2ZXJzaW9uIDEgbWRoZCBhdG9tcyB0byBnZXQgZXh0ZW5kZWQgcHJlY2lzaW9uIGR1cmF0aW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9nZXRfZHVyYXRpb24pLAorCSAgKHF0ZGVtdXhfcGFyc2Vfc2FtcGxlcyksIChxdGRlbXV4X3BhcnNlX3NlZ21lbnRzKSwKKwkgIChxdGRlbXV4X3BhcnNlX3RyYWspLCAocXRkZW11eF9wYXJzZV90cmVlKToKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6IChxdGRlbXV4X2R1bXBfbWRoZCk6CisJICBIYW5kbGUgdmVyc2lvbiAxIG1kaGQgYXRvbXMgdG8gZ2V0IGV4dGVuZGVkIHByZWNpc2lvbiBkdXJhdGlvbnMuCisJICBGaXhlcyAjNDI2OTcyLgorCisyMDA3LTA0LTEwIDE3OjA2OjA1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6IEZpeCBkZXBheWxvYWRlciBjbG9ja19yYXRlIGFuZCBzb21lIGNsZWFudXBzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzogKGdzdF9ydHBfYW1yX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfYW1yX2RlcGF5X3Byb2Nlc3MpOgorCSAgRml4IGRlcGF5bG9hZGVyIGNsb2NrX3JhdGUgYW5kIHNvbWUgY2xlYW51cHMuCisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6IChnc3RfcnRwX2gyNjRfZGVwYXlfZmluYWxpemUpLAorCSAgKGdzdF9ydHBfaDI2NF9kZXBheV9zZXRjYXBzKSwgKGdzdF9ydHBfaDI2NF9kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuaDoKKwkgIERvbid0IHB1c2ggY29kZWNfZGF0YSBpbiB0aGUgYWRhcHRlciBiZWNhdXNlIGl0IG1pZ2h0IGdldCBmbHVzaGVkIHdoZW4KKwkgIHdlIGdldCBhIGRpc2NvbnQuCisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6IChnc3RfcnRwX21wNGdfZGVwYXlfcHJvY2Vzcyk6CisJICBIYW5kbGUgbXVsdGlwbGUgQVUgcGVyIHBhY2tldC4KKwkgICogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzogKGdzdF9ydHBfc3Yzdl9kZXBheV9wcm9jZXNzKSwKKwkgIChnc3RfcnRwX3N2M3ZfZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgRGlzYWJsZSByYW5rLCB0aGlzIG9uZSBkb2VzIG5vdCB3b3JrLgorCSAgUmVtb3ZlIHRpbWVzdGFtcGluZywgYmFzZSBjbGFzcyBkb2VzIHRoYXQuCisKKzIwMDctMDQtMTAgMTI6MDE6MzMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiBsaW1pdCBjYXBzIHRvIHRoZSBmb3JtYXRzIHdlIGFubm91bmNlIGluIHRoZSB0ZW1wbGF0ZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzogKGdzdF9hdV9wYXJzZV9wYXJzZV9oZWFkZXIpOgorCSAgbGltaXQgY2FwcyB0byB0aGUgZm9ybWF0cyB3ZSBhbm5vdW5jZSBpbiB0aGUgdGVtcGxhdGUKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6ICh1aW50NjRfY2VpbGluZ19zY2FsZV9pbnQpLAorCSAgKGdzdF93YXZwYXJzZV9wZXJmb3JtX3NlZWspLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKSwKKwkgIChnc3Rfd2F2cGFyc2VfYWRkX3NyY19wYWQpLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhKToKKwkgIGZpeCBzb21lIGNyYXNoZXJzL2Fzc2VydHMgd2hlbiBkZWFsaW5nIHdpdGggYnJva2VuIGZpbGVzCisKKzIwMDctMDQtMTAgMTA6MDE6MTQgKzAwMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJICBnc3QvOiBGaXggc29tZSBjb21waWxlciB3YXJuaW5ncy4gRml4ZXMgIzQyODE4Mi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFBldGVyIEtqZWxsZXJzdGVkdCAgPHBraiBhdCBheGlzIGNvbT4KKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9tYXNzYWdlX2luZGV4KToKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOiAoZ3N0X3J0cF9tcDRnX2RlcGF5X3Byb2Nlc3MpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzogKGdzdF9ydHBfc3BlZXhfZGVwYXlfZ2V0X21vZGUpLAorCSAgKGdzdF9ydHBfc3BlZXhfZGVwYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX21lZGlhX3RvX2NhcHMpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KSwgKGdzdF9ydHNwc3JjX2xvb3BfdWRwKToKKwkgICogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogKGdzdF9tdWx0aXVkcHNpbmtfaW5pdF9zZW5kKToKKwkgIEZpeCBzb21lIGNvbXBpbGVyIHdhcm5pbmdzLiBGaXhlcyAjNDI4MTgyLgorCisyMDA3LTA0LTA2IDEyOjU0OjE2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC86IE1vcnBoIFJUUERlYyBpbnRvIHNvbWV0aGluZyBjb21wYXRpYmxlIHdpdGggUlRQQmluIGFzIGEgZmFsbGJhY2suCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOiAoZmluZF9zZXNzaW9uX2J5X2lkKSwgKGNyZWF0ZV9zZXNzaW9uKSwKKwkgIChmcmVlX3Nlc3Npb24pLCAoZ3N0X3J0cF9kZWNfYmFzZV9pbml0KSwgKGdzdF9ydHBfZGVjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfZGVjX2luaXQpLCAoZ3N0X3J0cF9kZWNfZmluYWxpemUpLAorCSAgKGdzdF9ydHBfZGVjX3F1ZXJ5X3NyYyksIChnc3RfcnRwX2RlY19jaGFpbl9ydHApLAorCSAgKGdzdF9ydHBfZGVjX2NoYWluX3J0Y3ApLCAoZ3N0X3J0cF9kZWNfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX2RlY19nZXRfcHJvcGVydHkpLCAoZ3N0X3J0cF9kZWNfcHJvdmlkZV9jbG9jayksCisJICAoZ3N0X3J0cF9kZWNfY2hhbmdlX3N0YXRlKSwgKGNyZWF0ZV9yZWN2X3J0cCksIChjcmVhdGVfcmVjdl9ydGNwKSwKKwkgIChjcmVhdGVfcnRjcCksIChnc3RfcnRwX2RlY19yZXF1ZXN0X25ld19wYWQpLAorCSAgKGdzdF9ydHBfZGVjX3JlbGVhc2VfcGFkKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRwZGVjLmg6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3AuYzogKHBsdWdpbl9pbml0KToKKwkgIE1vcnBoIFJUUERlYyBpbnRvIHNvbWV0aGluZyBjb21wYXRpYmxlIHdpdGggUlRQQmluIGFzIGEgZmFsbGJhY2suCisJICBWYXJpb3VzIG90aGVyIHN0eWxlIGZpeGVzLgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChmaW5kX3N0cmVhbV9ieV9pZCksCisJICAoZmluZF9zdHJlYW1fYnlfdWRwc3JjKSwgKGdzdF9ydHNwc3JjX3N0cmVhbV9mcmVlKSwKKwkgIChnc3RfcnRzcHNyY19jbGVhbnVwKSwgKGdzdF9ydHNwc3JjX21lZGlhX3RvX2NhcHMpLAorCSAgKG5ld19zZXNzaW9uX3BhZCksIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksCisJICAoZ3N0X3J0c3BzcmNfYWN0aXZhdGVfc3RyZWFtcyksIChnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkKSwKKwkgIChnc3RfcnRzcHNyY19sb29wX3VkcCksIChnc3RfcnRzcHNyY19zZXR1cF9hdXRoKSwKKwkgIChnc3RfcnRzcHNyY19oYW5kbGVfbWVzc2FnZSksIChnc3RfcnRzcHNyY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBJbXBsZW1lbnQgUlRQQmluIHNlc3Npb24gbWFuYWdlciBoYW5kbGluZy4KKwkgIERvbid0IHRyeSB0byBhZGQgZW1wdHkgcHJvcGVydGllcyB0byBjYXBzLgorCSAgSW1wbGVtZW50IGZhbGxiYWNrIHNlc3Npb24gbWFuYWdlciwgaGFuZGxpbmcuCisJICBEb24ndCBjb21iaW5lIGVycm9ycyBmcm9tIFJUQ1Agc3RyZWFtcywganVzdCBpZ25vcmUgdGhlbS4KKwkgICogZ3N0L3J0c3AvcnRzcHRyYW5zcG9ydC5jOiAocnRzcF90cmFuc3BvcnRfZ2V0X21hbmFnZXIpOgorCSAgKiBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0Lmg6CisJICBJbXBsZW1lbnQgZmFsbGJhY2sgc2Vzc2lvbiBtYW5hZ2VyLgorCSAgTWFrZSBSVFBCaW4gdGhlIGRlZmF1bHQgb25lIHdoZW4gYXZhaWxhYmxlLgorCisyMDA3LTA0LTA1IDE1OjA1OjI0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9nc3RydHB4cXRkZXBheS4qOiBUcnkgdG8gcmVjb3ZlciBmcm9tIHBhY2tldCBsb3NzIGEgbGl0dGxlIGJldHRlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9nc3RydHB4cXRkZXBheS5jOiAoZ3N0X3J0cF94cXRfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF94cXRfZGVwYXlfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3F0ZGVtdXgvZ3N0cnRweHF0ZGVwYXkuaDoKKwkgIFRyeSB0byByZWNvdmVyIGZyb20gcGFja2V0IGxvc3MgYSBsaXR0bGUgYmV0dGVyLgorCisyMDA3LTA0LTA1IDEzOjU2OjQ0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOiBUaGlzIGVsZW1lbnQgaXMgcmVhZHkgdG8gYmUgYXV0b3BsdWdnZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzogKGdzdF9ydHBfbXA0YV9kZXBheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX21wNGFfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX21wNGFfZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgVGhpcyBlbGVtZW50IGlzIHJlYWR5IHRvIGJlIGF1dG9wbHVnZ2VkLgorCisyMDA3LTA0LTA1IDExOjI2OjI1ICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBEb24ndCBsZWF2ZSB0aGUgb2Zmc2V0cyBkZWZpbmVkIGJ5IHVwc3RyZWFtIGVsZW1lbnQgb24gdGhlIGNvbXByZXNzZWQgZGF0YSBidWZmZXIgd2UgYXJlIHB1c2hpLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDctMDQtMDUgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpOgorCSAgRG9uJ3QgbGVhdmUgdGhlIG9mZnNldHMgZGVmaW5lZCBieSB1cHN0cmVhbSBlbGVtZW50IG9uIHRoZQorCSAgY29tcHJlc3NlZCBkYXRhIGJ1ZmZlciB3ZSBhcmUgcHVzaGluZyBkb3duc3RyZWFtLiBNYWtlIHRoZW0KKwkgIEdTVF9CVUZGRVJfT0ZGU0VUX05PTkUuCisKKzIwMDctMDQtMDQgMTI6Mzk6NDEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS86IERvbid0IGFib3J0IG9uIG91dC1vZi1tZW1vcnkuIFVzZSBzdHJlYW0tbnIgYXMgdW5zaWduZWQgaW50ZWdlciBvbmx5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvUkVBRE1FOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpLAorCSAgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKSwgKGdzdF9hdmlfZGVtdXhfcGFyc2VfaW5kZXgpLAorCSAgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luZGV4KSwgKGdzdF9hdmlfZGVtdXhfc3luYyksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fc2NhbiksIChnc3RfYXZpX2RlbXV4X21hc3NhZ2VfaW5kZXgpLAorCSAgKGdzdF9hdmlfZGVtdXhfY2FsY3VsYXRlX2R1cmF0aW9uc19mcm9tX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXJfcHVzaCksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyX3B1bGwpLCAoZ3N0X2F2aV9kZW11eF9jb21iaW5lX2Zsb3dzKSwKKwkgIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9kYXRhKToKKwkgIERvbid0IGFib3J0IG9uIG91dC1vZi1tZW1vcnkuIFVzZSBzdHJlYW0tbnIgYXMgdW5zaWduZWQgaW50ZWdlciBvbmx5LgorCisyMDA3LTA0LTAzIDA5OjU1OjQ1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3Qvc21wdGUvYmFyYm94d2lwZXMuYzoKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc21wdGUvYmFyYm94d2lwZXMuYzoKKwkgIEZpeCBlcnJvciBhcyBzcG90dGVkIGJ5IFNuYWlrIDxzbmFpazMyIGF0IGdtYWlsIGRvdCBjb20+CisKKzIwMDctMDMtMzAgMTc6MTk6MzQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IFN1cHBvcnQgYXVkaW8veC1yYXctZmxvYXQgaW4gd2F2IGZpbGVzLiBUaGlzIG9ubHkgd29ya3Mgd2l0aCBwbHVnaW5zLWJhc2UgQ1ZTLCB1c2luZyBhbiBvLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBTdXBwb3J0IGF1ZGlvL3gtcmF3LWZsb2F0IGluIHdhdiBmaWxlcy4gVGhpcyBvbmx5IHdvcmtzIHdpdGgKKwkgIHBsdWdpbnMtYmFzZSBDVlMsIHVzaW5nIGFuIG9sZGVyIHZlcnNpb24gZG9lc24ndCBoYXZlIGFueQorCSAgZGlzYWR2YW50YWdlcyB0aG91Z2guCisKKzIwMDctMDMtMzAgMTU6NTk6MjcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgUmV2ZXJ0IGxhc3QgY2hhbmdlIGFzIHdlIGRvbid0IHdhbnQgcGx1Z2lucy1nb29kIHRvIGRlcGVuZCBvbiBwbHVnaW5zLWJhc2UgQ1ZTIG5vdy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzogKGdzdF9hdV9wYXJzZV9yZXNldCksCisJICAoZ3N0X2F1X3BhcnNlX3BhcnNlX2hlYWRlciksIChnc3RfYXVfcGFyc2VfY2hhaW4pOgorCSAgKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmg6CisJICBSZXZlcnQgbGFzdCBjaGFuZ2UgYXMgd2UgZG9uJ3Qgd2FudCBwbHVnaW5zLWdvb2QgdG8gZGVwZW5kIG9uCisJICBwbHVnaW5zLWJhc2UgQ1ZTIG5vdy4KKworMjAwNy0wMy0zMCAwNDo1MDoxMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay86IERvbid0IHBsYXkgYXVkaW9jb252ZXJ0LiBBcyB3YXZwYWNrIHdhbnRzL291dHB1dHMgYWxsIHNhbXBsZXMgd2l0aCB3aWR0aD09MzIgYW5kIGRlcHRoPVsxLDMyXSBhY2NlcHQgdGguLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfcmVzZXQpLAorCSAgKGdzdF93YXZwYWNrX2RlY19pbml0KSwgKGdzdF93YXZwYWNrX2RlY19zaW5rX3NldF9jYXBzKSwKKwkgIChnc3Rfd2F2cGFja19kZWNfY2xpcF9vdXRnb2luZ19idWZmZXIpLAorCSAgKGdzdF93YXZwYWNrX2RlY19wb3N0X3RhZ3MpLCAoZ3N0X3dhdnBhY2tfZGVjX2NoYWluKToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5oOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfcmVzZXQpLAorCSAgKGdzdF93YXZwYWNrX2VuY19zaW5rX3NldF9jYXBzKSwgKGdzdF93YXZwYWNrX2VuY19zZXRfd3BfY29uZmlnKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfY2hhaW4pOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmg6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgRG9uJ3QgcGxheSBhdWRpb2NvbnZlcnQuIEFzIHdhdnBhY2sgd2FudHMvb3V0cHV0cyBhbGwgc2FtcGxlcyB3aXRoCisJICB3aWR0aD09MzIgYW5kIGRlcHRoPVsxLDMyXSBhY2NlcHQgdGhpcyBhbmQgbGV0IGF1ZGlvY29udmVydCBjb252ZXJ0CisJICB0byBhY2NlcHRlZCBmb3JtYXRzIGluc3RlYWQgb2YgZG9pbmcgaXQgaW4gdGhlIGVsZW1lbnQgZm9yIG4qOCBkZXB0aHMuCisJICBUaGlzIGFsc28gYWRkcyBzdXBwb3J0IGZvciBub24tbio4IGRlcHRocyBhbmQgcHJldmVudHMgc29tZSB1c2VsZXNzCisJICBtZW1vcnkgYWxsb2NhdGlvbnMuIEZpeGVzICM0MjE1OTgKKwkgIEFsc28gYWRkIGEgd29ya2Fyb3VuZCBmb3IgYnVnICM0MjE1NDIgaW4gd2F2cGFja2VuYyBmb3Igbm93Li4uCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tkZWMuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFja2VuYy5jOiAoR1NUX1NUQVJUX1RFU1QpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrcGFyc2UuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIENvbnNpZGVyIHRoZSBjaGFuZ2UgYWJvdmUgaW4gdGhlIHVuaXQgdGVzdHMgYW5kIHRlc3QgaWYgdGhlIGNvcnJlY3QKKwkgIGNhcHMgYXJlIGFjY2VwdGVkIGFuZCBzZXQuIEFsc28gY2hlY2sgZm9yIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCBpbgorCSAgdGhlIHdhdnBhY2twYXJzZSB1bml0IHRlc3QuCisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogKGdzdF93YXZwYWNrX2RlY19pbml0KSwKKwkgIChnc3Rfd2F2cGFja19kZWNfc2lua19zZXRfY2Fwcyk6CisJICBTZXQgY2FwcyBvbiB0aGUgc3JjIHBhZCBhcyBzb29uIGFzIHBvc3NpYmxlLgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmg6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tjb21tb24uaDoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5oOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuaDoKKwkgIEZpeCBpbmRlbnRpb24uIGdzdC1pbmRlbnQgaXMgbm93IGNhbGxlZCBieSBjaWNsLgorCisyMDA3LTAzLTI5IDE4OjUxOjMzICswMDAwICBSZW7DqSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorCisJICBjb25maWd1cmUuYWM6IFJlcXVpcmUgZ3N0LXBsdWdpbnMtYmFzZSBDVlMgZm9yIGF1ZGlvY29udmVydCB3aXRoIG5vbi1uYXRpdmUgZmxvYXQgc3VwcG9ydCBhbmQgd2lkdGgvZGVwdGggZml4IGluIGxpYmcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBSZXF1aXJlIGdzdC1wbHVnaW5zLWJhc2UgQ1ZTIGZvciBhdWRpb2NvbnZlcnQgd2l0aCBub24tbmF0aXZlCisJICBmbG9hdCBzdXBwb3J0IGFuZCB3aWR0aC9kZXB0aCBmaXggaW4gbGliZ3N0cmlmZi4KKwkgIFBhdGNoIGJ5OiBSZW7DqSBTdGFkbGVyIDxtYWlsIGF0IHJlbmVzdGFkbGVyIGRvdCBkZT4KKwkgICogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiAoZ3N0X2F1X3BhcnNlX3Jlc2V0KSwKKwkgIChnc3RfYXVfcGFyc2VfcGFyc2VfaGVhZGVyKSwgKGdzdF9hdV9wYXJzZV9jaGFpbik6CisJICAqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuaDoKKwkgIERvbid0IHN3YXAgdGhlIGZsb2F0cyBvdXJzZWxmIGlmIHRoZXkncmUgbm90IGluIG5hdGl2ZSBlbmRpYW5uZXNzLgorCSAgSW5zdGVhZCBsZXQgYXVkaW9jb252ZXJ0IGhhbmRsZSB0aGlzLiBGaXhlcyAjMzM5ODM4LgorCisyMDA3LTAzLTI5IDE0OjQwOjM1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogRmx1c2ggYWRhcHRlciBvbiBkaXNjb250cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzogKGdzdF9ydHBfaDI2M3BfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF9oMjYzcF9kZXBheV9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzogKGdzdF9ydHBfaDI2NF9kZXBheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX2gyNjRfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX2gyNjRfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF9oMjY0X2RlcGF5X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6IChnc3RfcnRwX21wNGFfZGVwYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9tcDRhX2RlcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9tcDRhX2RlcGF5X3Byb2Nlc3MpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOiAoZ3N0X3J0cF9tcDRnX2RlcGF5X3Byb2Nlc3MpOgorCSAgRmx1c2ggYWRhcHRlciBvbiBkaXNjb250cy4KKworMjAwNy0wMy0yOSAxNDowMzoyMSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IFVzZSBtb3JlIGVmZmljaWVudCBhZGFwdGVyIGFuZCBydHBidWZmZXIgbWV0aG9kcyB3aGVuIHBvc3NpYmxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzogKGdzdF9ydHBfTDE2X2RlcGF5X3Byb2Nlc3MpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6IChnc3RfcnRwX2dzbV9kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzogKGdzdF9ydHBfaWxiY19kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuYzogKGdzdF9ydHBfbXAydF9kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzogKGdzdF9ydHBfbXA0Z19kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6IChnc3RfcnRwX21wNGdfcGF5X2ZsdXNoKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYzogKGdzdF9ydHBfbXA0dl9kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX21wNHZfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOiAoZ3N0X3J0cF9tcDR2X3BheV9mbHVzaCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzogKGdzdF9ydHBfbXBhX2RlcGF5X3Byb2Nlc3MpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOiAoZ3N0X3J0cF9tcGFfcGF5X2ZsdXNoKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jOiAoZ3N0X3J0cF9tcHZfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6IChnc3RfcnRwX3BjbWFfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmM6IChnc3RfcnRwX3BjbXVfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5LmM6IChnc3RfcnRwX3N2M3ZfZGVwYXlfcHJvY2Vzcyk6CisJICBVc2UgbW9yZSBlZmZpY2llbnQgYWRhcHRlciBhbmQgcnRwYnVmZmVyIG1ldGhvZHMgd2hlbiBwb3NzaWJsZS4KKworMjAwNy0wMy0yOSAxMjoxNDoyMiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiBDb3JyZWN0bHkgaGFuZGxlIHdpZHRoIT1kZXB0aCBpbnB1dC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiAoZ3N0X3dhdmVuY19jcmVhdGVfaGVhZGVyX2J1ZiksCisJICAoZ3N0X3dhdmVuY19zaW5rX3NldGNhcHMpOgorCSAgQ29ycmVjdGx5IGhhbmRsZSB3aWR0aCE9ZGVwdGggaW5wdXQuCisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgQWxyZWFkeSBleHBvcnQgaW4gdGhlIGNhcHMgdGhhdCB3aWR0aD09OCB1c2VzIHVuc2lnbmVkIHNhbXBsZXMgYW5kCisJICBldmVyeXRoaW5nIGVsc2UgdXNlcyBzaWduZWQgc2FtcGxlcy4KKworMjAwNy0wMy0yOSAwOTo1OToyMyArMDAwMCAgTGF1cmVudCBHbGF5YWwgPHNwZ2xlZ2xlQHlhaG9vLmZyPgorCisJICBnc3QvdWRwLzogUmV3b3JrIHRoZSBzb2NrZXQgYWxsb2NhdGlvbiBhIGJpdCBiYXNlZCBvbiB0aGUgc29ja2ZkIGFyZ3VtZW50IHNvIHRoYXQgaXQgYmVjb21lcyB1c2FibGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBMYXVyZW50IEdsYXlhbCA8c3BnbGVnbGUgYXQgeWFob28gZG90IGZyPgorCSAgKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzogKGdzdF9keW51ZHBzaW5rX2NsYXNzX2luaXQpLAorCSAgKGdzdF9keW51ZHBzaW5rX2luaXQpLCAoZ3N0X2R5bnVkcHNpbmtfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfZHludWRwc2lua19nZXRfcHJvcGVydHkpLCAoZ3N0X2R5bnVkcHNpbmtfaW5pdF9zZW5kKSwKKwkgIChnc3RfZHludWRwc2lua19jbG9zZSk6CisJICAqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5oOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19jbGFzc19pbml0KSwgKGdzdF91ZHBzcmNfaW5pdCksCisJICAoZ3N0X3VkcHNyY19jcmVhdGUpLCAoZ3N0X3VkcHNyY19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF91ZHBzcmNfZ2V0X3Byb3BlcnR5KSwgKGdzdF91ZHBzcmNfc3RhcnQpLCAoZ3N0X3VkcHNyY19zdG9wKToKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwkgIFJld29yayB0aGUgc29ja2V0IGFsbG9jYXRpb24gYSBiaXQgYmFzZWQgb24gdGhlIHNvY2tmZCBhcmd1bWVudCBzbyB0aGF0CisJICBpdCBiZWNvbWVzIHVzYWJsZS4KKwkgIEFkZCBhIGNsb3NlZmQgcHJvcGVydHkgdG8gaW5zdHJ1Y3QgdGhlIHVkcCBlbGVtZW50cyB0byBjbG9zZSB0aGUgY3VzdG9tCisJICBmaWxlIGRlc2NyaXB0b3JzIHdoZW4gZ29pbmcgdG8gUkVBRFkuIEZpeGVzICM0MjMzMDQuCisJICBBUEk6R3N0VURQU3JjOjpjbG9zZWZkIHByb3BlcnR5CisJICBBUEk6R3N0RHluVURQU2luazo6Y2xvc2VmZCBwcm9wZXJ0eQorCisyMDA3LTAzLTI5IDA4OjA4OjQ5ICswMDAwICBMYXVyZW50IEdsYXlhbCA8c3BnbGVnbGVAeWFob28uZnI+CisKKwkgIGdzdC9ydHAvOiBBZGRlZCBIMjY0IHBheWxvYWRlci4gRml4ZXMgIzQyMzc4Mi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IExhdXJlbnQgR2xheWFsIDxzcGdsZWdsZSBhdCB5YWhvbyBkb3QgZnI+CisJICAqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHAvZ3N0cnRwLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOiAoZ3N0X3J0cF9oMjY0X3BheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfaDI2NF9wYXlfY2xhc3NfaW5pdCksIChnc3RfcnRwX2gyNjRfcGF5X2luaXQpLAorCSAgKGdzdF9ydHBfaDI2NF9wYXlfZmluYWxpemUpLCAoZ3N0X3J0cF9oMjY0X3BheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX2gyNjRfcGF5X2hhbmRsZV9idWZmZXIpLCAoZ3N0X3J0cF9oMjY0X3BheV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfaDI2NF9wYXlfZ2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBfaDI2NF9wYXlfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcnRwX2gyNjRfcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJICBBZGRlZCBIMjY0IHBheWxvYWRlci4gRml4ZXMgIzQyMzc4Mi4KKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzogKGdzdF9ydHBfaDI2NF9kZXBheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX2gyNjRfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX2gyNjRfZGVwYXlfcHJvY2Vzcyk6CisJICBTbWFsbCBmaXhlcy4KKworMjAwNy0wMy0yOCAyMjoyNzozNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogQWN0dWFsbHkgc3VwcG9ydCBkZXB0aHMgZnJvbSAxIHRvIDMyLCBub3Qgb25seSA4IHRvIDMyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgQWN0dWFsbHkgc3VwcG9ydCBkZXB0aHMgZnJvbSAxIHRvIDMyLCBub3Qgb25seSA4IHRvIDMyLgorCisyMDA3LTAzLTI4IDIyOjIzOjQzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBBZGQgc3VwcG9ydCBmb3Igd2F2IGZpbGVzIGNvbnRhaW5pbmcgYXVkaW8veC1yYXctaW50IHdpdGggcmFuZG9tIGRlcHRocyBiZXR3ZWVuIDEgYW5kIDMyIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgQWRkIHN1cHBvcnQgZm9yIHdhdiBmaWxlcyBjb250YWluaW5nIGF1ZGlvL3gtcmF3LWludCB3aXRoIHJhbmRvbQorCSAgZGVwdGhzIGJldHdlZW4gMSBhbmQgMzIgYml0cy4KKworMjAwNy0wMy0yOCAxODo0MDoxMiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJICBnc3QvcnRwLzogQWRkZWQgTVA0QS1MQVRNIGRlcGF5bG9hZGVyLiBGaXhlcyAjNDE3NzkyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBCYXNlZCBvbiBwYXRjaCBieTogU3RlZmFuIEtvc3QgIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzogKGdzdF9ydHBfbXA0YV9kZXBheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfbXA0YV9kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfbXA0YV9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX21wNGFfZGVwYXlfZmluYWxpemUpLCAoZ3N0X3J0cF9tcDRhX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfbXA0YV9kZXBheV9wcm9jZXNzKSwgKGdzdF9ydHBfbXA0YV9kZXBheV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfbXA0YV9kZXBheV9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfbXA0YV9kZXBheV9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9ydHBfbXA0YV9kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5Lmg6CisJICBBZGRlZCBNUDRBLUxBVE0gZGVwYXlsb2FkZXIuIEZpeGVzICM0MTc3OTIuCisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6IChnc3RfcnRwX21wNHZfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9tcDR2X2RlcGF5X3Byb2Nlc3MpOgorCSAgRml4dXAgZGVwYXlsb2FkZXIsIHNldHRpbmcgY29kZWNfZGF0YSwgdXNpbmcgbW9yZSBlZmZpY2llbnQgYWRhcHRvciBhbmQKKwkgIHJ0cGJ1ZmZlciBoYW5kbGluZy4KKwkgICogZ3N0L3J0c3AvVVJMUzoKKwkgIEFkZCB1cmwgdG8gdGVzdCBhYm92ZS4KKworMjAwNy0wMy0yOCAxNToxNzoyNyArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvOiBQcm9jZXNzICdjdHRzJyBhdG9tcywgd2hpY2ggYXJlIHByZXNlbnQgaW4gQVZDIElTTyBmaWxlcyAoLm1vdiBmaWxlcyB3aXRoIGgyNjQgdmlkZW8pLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X3ByZXBhcmVfY3VycmVudF9zYW1wbGUpLAorCSAgKGdzdF9xdGRlbXV4X2NoYWluKSwgKHF0ZGVtdXhfcGFyc2Vfc2FtcGxlcyk6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZHVtcC5jOiAocXRkZW11eF9kdW1wX2N0dHMpOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4X2R1bXAuaDoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eF90eXBlcy5jOgorCSAgUHJvY2VzcyAnY3R0cycgYXRvbXMsIHdoaWNoIGFyZSBwcmVzZW50IGluIEFWQyBJU08gZmlsZXMgKC5tb3YgZmlsZXMKKwkgIHdpdGggaDI2NCB2aWRlbykuCisJICBVc2UgdGhlIG9mZnNldCBwcmVzZW50IGluICdjdHRzJyB0byBjYWxjdWxhdGUgdGhlIFBUUyBmb3IgZWFjaCBwYWNrZXQKKwkgIGFuZCBzZXQgdGhlIFBUUyBvbiBvdXRnb2luZyBidWZmZXJzLgorCSAgRml4ZXMgIzQyMzI4MworCisyMDA3LTAzLTI1IDE1OjM0OjQyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLio6IEhhbmRsZSBkZWZhdWx0IGNsb2NrLXJhdGVzIGZvciBzdGF0aWMgcGF5bG9hZCB0eXBlcywgcmVhcnJhbmdlIHN0dWZmIHNvIHRoYXQgdGhlIHJ0cG1hcCBmaWVsZCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChmaW5kX3N0cmVhbV9ieV9zZXR1cCksCisJICAoZ3N0X3J0c3BzcmNfY3JlYXRlX3N0cmVhbSksIChnc3RfcnRzcHNyY19zdHJlYW1fZnJlZSksCisJICAoZ2V0X2RlZmF1bHRfcmF0ZV9mb3JfcHQpLCAoZ3N0X3J0c3BzcmNfcGFyc2VfcnRwbWFwKSwKKwkgIChnc3RfcnRzcHNyY19tZWRpYV90b19jYXBzKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV9jYXBzKSwKKwkgIChnc3RfcnRzcHNyY19hY3RpdmF0ZV9zdHJlYW1zKSwgKGdzdF9ydHNwc3JjX3BhcnNlX3J0cGluZm8pOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBIYW5kbGUgZGVmYXVsdCBjbG9jay1yYXRlcyBmb3Igc3RhdGljIHBheWxvYWQgdHlwZXMsIHJlYXJyYW5nZSBzdHVmZiBzbworCSAgdGhhdCB0aGUgcnRwbWFwIGZpZWxkIGluIHRoZSBzZHAgY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy4KKwkgIFBhcnNlIFJUUC1JbmZvIGZpZWxkIHRvIGdldCB0aGUgc2VxbnVtIGFuZCB0aW1lYmFzZSBmaWVsZHMgdGhhdCBzaG91bGQKKwkgIGdvIGluIHRoZSBjYXBzLgorCSAgRGVsYXkgY29uZmlndXJpbmcgY2FwcyBhZnRlciB3ZSBnb3QgdGhlIFJUUC1JbmZvIGZyb20gdGhlIFBMQVkgcmVwbHkgZnJvbQorCSAgdGhlIHNlcnZlci4KKworMjAwNy0wMy0yNCAxOTo0Njo1OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6IFJlbW92ZSAnY2hhbm5lbC1wb3NpdGlvbnMnIGZpZWxkIHdoZW4gbXVuZ2luZyBpbnB1dCBjYXBzIGludG8gMS1jaGFubmVsIG91dHB1dCBjYXBzIChJLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6IChnc3RfZGVpbnRlcmxlYXZlX3Npbmtfc2V0Y2Fwcyk6CisJICBSZW1vdmUgJ2NoYW5uZWwtcG9zaXRpb25zJyBmaWVsZCB3aGVuIG11bmdpbmcgaW5wdXQgY2FwcyBpbnRvCisJICAxLWNoYW5uZWwgb3V0cHV0IGNhcHMgKEkgZ3Vlc3MgdGVjaG5pY2FsbHkgd2Ugc2hvdWxkIHNldCB0aGUKKwkgIHBvc2l0aW9uIGZvciBlYWNoIGNoYW5uZWwgb24gdGhlIG91dHB1dCBjYXBzIGlmIGl0J3Mgbm9uLU5PTkUsCisJICBidXQgSSdsbCBzYXZlIHRoYXQgYXMgYSB0YXNrIGZvciBhbm90aGVyIGRheSkuCisKKzIwMDctMDMtMjIgMjI6MTQ6MjkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOiBEb24ndCBsZWFrIGlucHV0IGJ1ZmZlciBpbiBjaGFpbiBmdW5jdGlvbjsgbWFpbnRhaW4gb3VyIG93biBsaXN0IG9mIHNvdXJjZSBwYWRzIC0gdGhlci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOiAoZ3N0X2RlaW50ZXJsZWF2ZV9hZGRfbmV3X3BhZHMpLAorCSAgKGdzdF9kZWludGVybGVhdmVfcmVtb3ZlX3BhZHMpLCAoZ3N0X2RlaW50ZXJsZWF2ZV9wcm9jZXNzKSwKKwkgIChnc3RfZGVpbnRlcmxlYXZlX2NoYWluKToKKwkgIERvbid0IGxlYWsgaW5wdXQgYnVmZmVyIGluIGNoYWluIGZ1bmN0aW9uOyBtYWludGFpbiBvdXIgb3duIGxpc3Qgb2YKKwkgIHNvdXJjZSBwYWRzIC0gdGhlcmUgYXJlIG5vIGd1YXJhbnRlZXMgYWJvdXQgdGhlIG9yZGVyIG9mIHRoZSBsaXN0CisJICBpbiB0aGUgR3N0RWxlbWVudCBzdHJ1Y3QsIGFuZCB3ZSB3YW50IGEgdmVyeSBzcGVjaWZpYyBvcmRlcjsgbGFzdGx5LAorCSAgc29tZSBtb3JlIGRlYnVnZ2luZy4KKworMjAwNy0wMy0yMiAxNjoyNTo1NiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogUmV2ZXJ0IGxhc3QgY29tbWl0LCBwcmV2ZW50aW5nIGluZmluaXRlIHBsdWdnaW5nIGxvb3BzIHdpdGggcmFua3MgaXMgbm8gY2xlYW4gc29sdXRpb24uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogKGdzdF93YXZwYWNrX3BhcnNlX3BsdWdpbl9pbml0KToKKwkgIFJldmVydCBsYXN0IGNvbW1pdCwgcHJldmVudGluZyBpbmZpbml0ZSBwbHVnZ2luZyBsb29wcyB3aXRoIHJhbmtzCisJICBpcyBubyBjbGVhbiBzb2x1dGlvbiBhbmQgaW4gZ2VuZXJhbCB0aGVyZSdzIG5vIHJlYXNvbiB3aHkgb25lIHdhbnRzCisJICB0byBwYXJzZSBmcmFtZWQgd2F2cGFjayBkYXRhIGFnYWluLgorCisyMDA3LTAzLTIyIDE1OjUyOjUxICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogU2VuZCB0aGUgbmV3IHNlZ21lbnQgZXZlbnQgaW4gdGltZSBmb3JtYXQgaW5zdGVhZCBvZiBieXRlcy4gVGhpcyBhbGxvd3MgIndhdnBhY2tlbmMgISB3YS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogKGdzdF93YXZwYWNrX2VuY19wdXNoX2Jsb2NrKToKKwkgIFNlbmQgdGhlIG5ldyBzZWdtZW50IGV2ZW50IGluIHRpbWUgZm9ybWF0IGluc3RlYWQgb2YgYnl0ZXMuIFRoaXMKKwkgIGFsbG93cyAid2F2cGFja2VuYyAhIHdhdnBhY2tkZWMgISBzb21lYXVkaW9zaW5rIiBwaXBlbGluZXMuCisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiAoZ3N0X3dhdnBhY2tfcGFyc2VfcGx1Z2luX2luaXQpOgorCSAgQWNjZXB0IGZyYW1lZCBhbmQgbm9uLWZyYW1lZCBpbnB1dCwgd2F2cGFja3BhcnNlIGRvZXNuJ3QgY2FyZS4gVG8KKwkgIHByZXZlbnQgIndhdnBhY2twYXJzZSAhIHdhdnBhY2twYXJzZSAhIC4uLiIgcGlwZWxpbmVzIGxvd2VyIHRoZQorCSAgcmFuayBvZiB3YXZwYWNrcGFyc2UgYnkgb25lLiBUaGlzIGFsbG93cyAid2F2cGFja2VuYyAhIHdhdnBhY2twYXJzZSAhCisJICAuLi4iIHBpcGVsaW5lcy4KKworMjAwNy0wMy0yMiAxMTowODowMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IFJldmVydCB0byB1c2UgZ3N0X3BhZF9hbGxvY19idWZmZXIoKSBoZXJlLiBXZSBjYW4gYW5kIHNob3VsZCB1c2UgaXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX2NoYWluKToKKwkgIFJldmVydCB0byB1c2UgZ3N0X3BhZF9hbGxvY19idWZmZXIoKSBoZXJlLiBXZSBjYW4gYW5kIHNob3VsZCB1c2UgaXQuCisJICBUaGFua3MgdG8gSmFuIGFuZCBNaWtlIGZvciBub3RpY2luZyBteSBtaXN0YWtlLgorCisyMDA3LTAzLTIyIDA5OjQ0OjE3ICswMDAwICBDaHJpc3RvcGhlIERlaGFpcyA8Y2hyaXN0b3BoZS5kZWhhaXNAZ21haWwuY29tPgorCisJICBleHQvZ2NvbmYvZ2NvbmYuYzogQWNjZXB0IGNvbXBsZXggcGlwZWxpbmUgZGVzY3JpcHRpb25zIGFzIGFuIGF1ZGlvIHByb2ZpbGUgaW5zdGVhZCBvZiBqdXN0IGEgc2luZ2xlIGVsZW1lbnQuIEZpeGVzICMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IENocmlzdG9waGUgRGVoYWlzIDxjaHJpc3RvcGhlIGRvdCBkZWhhaXMgYXQgZ21haWwgZG90IGNvbT4KKwkgICogZXh0L2djb25mL2djb25mLmM6IChnc3RfZ2NvbmZfcmVuZGVyX2Jpbl93aXRoX2RlZmF1bHQpOgorCSAgQWNjZXB0IGNvbXBsZXggcGlwZWxpbmUgZGVzY3JpcHRpb25zIGFzIGFuIGF1ZGlvIHByb2ZpbGUgaW5zdGVhZCBvZiBqdXN0CisJICBhIHNpbmdsZSBlbGVtZW50LiBGaXhlcyAjNDIwNjU4LgorCisyMDA3LTAzLTIyIDAwOjE3OjQxICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuKjogUHV0IHRoZSB3cml0ZSBoZWxwZXJzIGludG8gdGhlIEdzdFdhdnBhY2tFbmMgc3RydWN0IGRpcmVjdGx5IGFuZCBub3QgYXMgYSBwb2ludGVyIHRvIHNhdi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogKGdzdF93YXZwYWNrX2VuY19jbGFzc19pbml0KSwKKwkgIChnc3Rfd2F2cGFja19lbmNfaW5pdCksIChnc3Rfd2F2cGFja19lbmNfY2hhaW4pLAorCSAgKGdzdF93YXZwYWNrX2VuY19yZXdyaXRlX2ZpcnN0X2Jsb2NrKToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5oOgorCSAgUHV0IHRoZSB3cml0ZSBoZWxwZXJzIGludG8gdGhlIEdzdFdhdnBhY2tFbmMgc3RydWN0IGRpcmVjdGx5IGFuZCBub3QKKwkgIGFzIGEgcG9pbnRlciB0byBzYXZlIHR3byBzbWFsbCwgYnV0IHVzZWxlc3MgbWFsbG9jcy4gVGhpcyBhbHNvIG1ha2VzCisJICBpdCBwb3NzaWJsZSB0byBkcm9wIHRoZSBmaW5hbGl6ZSBtZXRob2QuCisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiAoZ3N0X3dhdnBhY2tfcGFyc2VfcHVzaF9idWZmZXIpOgorCSAgRm9yIGNvbnNpc3RlbmN5IHJlYXNvbnMgYWxzbyBzZXQgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIG9uIHRoZSBvdXRnb2luZworCSAgYnVmZmVycyB0aGUgc2FtZSB3YXkgd2F2cGFja2VuYyBkb2VzIGl0LgorCisyMDA3LTAzLTIxIDIzOjUwOjA5ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogRG9uJ3QgdXNlIGdzdF9wYWRfYWxsb2NfYnVmZmVyKCkgYXMgd2UgbWlnaHQgY2xpcCB0aGUgYnVmZmVyIGxhdGVyIGFuZAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogKGdzdF93YXZwYWNrX2RlY19jaGFpbik6CisJICBEb24ndCB1c2UgZ3N0X3BhZF9hbGxvY19idWZmZXIoKSBhcyB3ZSBtaWdodCBjbGlwIHRoZSBidWZmZXIgbGF0ZXIgYW5kCisJICBCYXNlVHJhbnNmb3JtLWJhc2VkIGVsZW1lbnRzIHdpbGwgbGlrZWx5IGJyZWFrIGJlY2F1c2Ugb2Ygd3JvbmcKKwkgIHVuaXQtc2l6ZS4gQWxzbyBwbHVnIGEgcG9zc2libGUgbWVtbGVhayB0aGF0IGhhcHBlbnMgd2hlbiBkZWNvZGluZworCSAgZmFpbHMgZm9yIHNvbWUgcmVhc29uLgorCisyMDA3LTAzLTIxIDExOjQ5OjMyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvYXBldGFnL2dzdHRhZ2RlbXV4LmM6IFJlbmFtZSByZWdpc3RlcmVkIHR5cGUgaW4gcHJlcGFyYXRpb24gb2YgR3N0VGFnRGVtdXggbW92aW5nIHRvCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FwZXRhZy9nc3R0YWdkZW11eC5jOiAoZ3N0X3RhZ19kZW11eF9nZXRfdHlwZSk6CisJICBSZW5hbWUgcmVnaXN0ZXJlZCB0eXBlIGluIHByZXBhcmF0aW9uIG9mIEdzdFRhZ0RlbXV4IG1vdmluZyB0bworCSAgLWJhc2UgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLgorCisyMDA3LTAzLTE5IDEwOjI5OjE5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogU3RyZWFtaW5nIG1vZGUgZml4ZXM6IGRvbid0IHVucmVmIGJ1ZmZlciB3ZSBkb24ndCBvd24gYW55IGxvbmdlcjsgcmVtb3ZlIGJvZ3VzIGFkYXB0ZXIgZmwuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyk6CisJICBTdHJlYW1pbmcgbW9kZSBmaXhlczogZG9uJ3QgdW5yZWYgYnVmZmVyIHdlIGRvbid0IG93biBhbnkgbG9uZ2VyOworCSAgcmVtb3ZlIGJvZ3VzIGFkYXB0ZXIgZmx1c2guIEZpeGVzICM0MTkzMzguCisKKzIwMDctMDMtMTggMDQ6MjE6MjggKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBSRVFVSVJFTUVOVFM6IENoYW5nZSB0aGUgZm9ybWF0IHRvIGtleS92YWx1ZSwgYWRkIGEgYnVuY2ggb2YgaW5mb3JtYXRpb24sIHJlbW92ZSBhIGJ1bmNoIG9mIHJlcXVpcmVtZW50cyB0aGF0IGFyZSBmb3IuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBSRVFVSVJFTUVOVFM6IENoYW5nZSB0aGUgZm9ybWF0IHRvIGtleS92YWx1ZSwgYWRkIGEgYnVuY2ggb2YKKwkgIGluZm9ybWF0aW9uLCByZW1vdmUgYSBidW5jaCBvZiByZXF1aXJlbWVudHMgdGhhdCBhcmUgZm9yCisJICBvdGhlciBHU3RyZWFtZXIgcGFja2FnZXMuCisKKzIwMDctMDMtMTggMDI6MDA6NTQgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBSRVFVSVJFTUVOVFM6IEZpeCBhIGZldyB0aGluZ3MuICBUaGlzIGZpbGUgcmVhbGx5IG5lZWRzIGEgZ29vZCBvbmNlLW92ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogUkVRVUlSRU1FTlRTOiBGaXggYSBmZXcgdGhpbmdzLiAgVGhpcyBmaWxlIHJlYWxseSBuZWVkcyBhCisJICBnb29kIG9uY2Utb3Zlci4KKworMjAwNy0wMy0xNiAxODozODoxOCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOiBGaXggcHJldmlvdXMgY29tbWl0LCB3ZSB3YW50IHRvIHBhc3MgdGhlIE5TVmlldyBpbiB0aGUgbWVzc2FnZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBGaXggcHJldmlvdXMgY29tbWl0LCB3ZSB3YW50IHRvIHBhc3MgdGhlIE5TVmlldyBpbiB0aGUgbWVzc2FnZS4KKworMjAwNy0wMy0xNiAxNjoyNzoyMCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOiBFbWl0ICdoYXZlLW5zLXZpZXcnIG1lc3NhZ2Ugd2hlbiB3b3JraW5nIGluIGVtYmVkZGVkIG1vZGUuIFRoZSBtZXNzYWdlIHdpbGwgY29udGFpbiBhIHBvLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgRW1pdCAnaGF2ZS1ucy12aWV3JyBtZXNzYWdlIHdoZW4gd29ya2luZyBpbiBlbWJlZGRlZCBtb2RlLiBUaGUgbWVzc2FnZQorCSAgd2lsbCBjb250YWluIGEgcG9pbnRlciB0byB0aGUgbmV3bHkgY3JlYXRlZCBOU1ZpZXcuCisKKzIwMDctMDMtMTYgMDk6NTc6NDAgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmM6IEEgMTAgYmFuZCBFUSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gMSBiYW5kcyBhbmQgbm90IHRvIDMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmM6CisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfMTBiYW5kc19pbml0KToKKwkgIEEgMTAgYmFuZCBFUSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gMSBiYW5kcyBhbmQgbm90IHRvIDMuCisKKzIwMDctMDMtMTUgMTI6MDU6MDEgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIHN5cy9NYWtlZmlsZS5hbTogRG9uJ3QgZm9yZ2V0IHRvIGRpc3RyaWJ1dGUgdGhlIHN5cy9vc3hhdWRpby8gZGlyZWN0b3J5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9NYWtlZmlsZS5hbToKKwkgIERvbid0IGZvcmdldCB0byBkaXN0cmlidXRlIHRoZSBzeXMvb3N4YXVkaW8vIGRpcmVjdG9yeS4KKworMjAwNy0wMy0xNSAxMTozOTo1MyArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgQWN0aXZhdGUgb3N4YXVkaW8gaW4gZ3N0LXBsdWdpbnMtZ29vZCB3aXRoIHByb3BlciBidWlsZCBzZXR1cC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIHN5cy9NYWtlZmlsZS5hbToKKwkgICogc3lzL29zeGF1ZGlvL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW8uYzoKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSAgKGdzdF9vc3hfYXVkaW9fc2lua19vc3hlbGVtZW50X2RvX2luaXQpLCAoZ3N0X29zeF9hdWRpb19zaW5rX2luaXQpLAorCSAgKGdzdF9vc3hfYXVkaW9fc2lua19nZXRjYXBzKSwKKwkgIChnc3Rfb3N4X2F1ZGlvX3NpbmtfY3JlYXRlX3JpbmdidWZmZXIpLCAocGx1Z2luX2luaXQpOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkgIChnc3Rfb3N4X2F1ZGlvX3NyY19vc3hlbGVtZW50X2RvX2luaXQpLCAoZ3N0X29zeF9hdWRpb19zcmNfaW5pdCksCisJICAoZ3N0X29zeF9hdWRpb19zcmNfY3JlYXRlX3JpbmdidWZmZXIpOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4cmluZ2J1ZmZlci5jOiAoZ3N0X29zeF9yaW5nX2J1ZmZlcl9nZXRfdHlwZSksCisJICAoZ3N0X29zeF9yaW5nX2J1ZmZlcl9jbGFzc19pbml0KSwgKGdzdF9vc3hfcmluZ19idWZmZXJfaW5pdCksCisJICAoZ3N0X29zeF9yaW5nX2J1ZmZlcl9hY3F1aXJlKSwgKGdzdF9vc3hfcmluZ19idWZmZXJfc3RhcnQpLAorCSAgKGdzdF9vc3hfcmluZ19idWZmZXJfcGF1c2UpLCAoZ3N0X29zeF9yaW5nX2J1ZmZlcl9zdG9wKToKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeHJpbmdidWZmZXIuaDoKKwkgIEFjdGl2YXRlIG9zeGF1ZGlvIGluIGdzdC1wbHVnaW5zLWdvb2Qgd2l0aCBwcm9wZXIgYnVpbGQgc2V0dXAuCisJICBBZGQgaW5saW5lZCBkb2N1bWVudGF0aW9uLgorCSAgRml4IGRlYnVnIHN0YXRlbWVudHMKKwkgIEZpeCByaW5nYnVmZmVyIHdoZW4gcGF1c2luZy4KKwkgIEZpeGVzICMzMjM0NzEKKworMjAwNy0wMy0xNCAyMjoyMToyNiArMDAwMCAgUGhpbGlwcGUgS2FsYWYgPHBoaWxpcHBlLmthbGFmQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L3J0cC86IFBvcnRlZCBtdWxhdyBhbmQgYWxhdyBwYXlsb2FkZXJzIHRvIHVzZSBuZXcgYmFzZSBjbGFzcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBwY211cGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5oOgorCSAgUG9ydGVkIG11bGF3IGFuZCBhbGF3IHBheWxvYWRlcnMgdG8gdXNlIG5ldyBiYXNlIGNsYXNzCisKKzIwMDctMDMtMTQgMTY6MzA6MTkgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIHN5cy9vc3h2aWRlby86IEZpeCBsZWFrcyB3aGVuIHJ1bm5pbmcgYSBOU0FwcC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cuaDoKKwkgICogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgRml4IGxlYWtzIHdoZW4gcnVubmluZyBhIE5TQXBwLgorCSAgQWNjZXB0IGFueSBraW5kIG9mIHJlc29sdXRpb25zLgorCSAgV29ya3MgaW4gZnVsbHNjcmVlbi4gQ2FuIG1heGltaXplLgorCSAgT25seSB0aGluZyBsZWZ0IGJlZm9yZSBiZWluZyBhYmxlIHRvIG1vdmUgdGhpcyB0byAtZ29vZCBpcyBkb2N1bWVudGF0aW9uCisJICBhbmQgZW1iZWRkZWQgd2luZG93IHN1cHBvcnQuCisKKzIwMDctMDMtMTQgMTU6MjU6MTAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBwby86IFVwZGF0ZSB0cmFuc2xhdGlvbnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogcG8vYWYucG86CisJICAqIHBvL2F6LnBvOgorCSAgKiBwby9jcy5wbzoKKwkgICogcG8vZW5fR0IucG86CisJICAqIHBvL2l0LnBvOgorCSAgKiBwby9ubC5wbzoKKwkgICogcG8vb3IucG86CisJICAqIHBvL3NxLnBvOgorCSAgKiBwby9zci5wbzoKKwkgICogcG8vc3YucG86CisJICAqIHBvL3VrLnBvOgorCSAgKiBwby92aS5wbzoKKwkgIFVwZGF0ZSB0cmFuc2xhdGlvbnMuCisKKzIwMDctMDMtMTQgMTQ6NDk6NDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogRml4IHN0cmluZyByZXBsYWNlIGVycm9yIChBR19BR19HU1RfKiA9PiBBR19HU1RfKikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgRml4IHN0cmluZyByZXBsYWNlIGVycm9yIChBR19BR19HU1RfKiA9PiBBR19HU1RfKikuCisKKzIwMDctMDMtMTQgMTQ6NDg6MDggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2VxdWFsaXplci86IEFkZCAzIGFuZCAxMCBiYW5kIHZlcnNpb24gYW5kIGFkZCBtaXNzaW5nIGdzdF9vYmplY3Rfc3luY192YWx1ZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2VxdWFsaXplci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzogKF9kb19pbml0KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9iYW5kX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9jbGFzc19pbml0KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9iYW5kX2dldF90eXBlKSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9jaGlsZF9wcm94eV9nZXRfY2hpbGRfYnlfaW5kZXgpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX2NoaWxkX3Byb3h5X2dldF9jaGlsZHJlbl9jb3VudCksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfY2hpbGRfcHJveHlfaW50ZXJmYWNlX2luaXQpLCAoc2V0dXBfZmlsdGVyKSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9jb21wdXRlX2ZyZXF1ZW5jaWVzKSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl90cmFuc2Zvcm1faXApLCAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjEwYmFuZHMuYzoKKwkgIChnc3RfaWlyX2VxdWFsaXplcl8xMGJhbmRzX2Jhc2VfaW5pdCksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfMTBiYW5kc19jbGFzc19pbml0KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl8xMGJhbmRzX2luaXQpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyXzEwYmFuZHNfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl8xMGJhbmRzX2dldF9wcm9wZXJ0eSk6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5oOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5jOgorCSAgKGdzdF9paXJfZXF1YWxpemVyXzNiYW5kc19iYXNlX2luaXQpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyXzNiYW5kc19jbGFzc19pbml0KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl8zYmFuZHNfaW5pdCksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfM2JhbmRzX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfM2JhbmRzX2dldF9wcm9wZXJ0eSk6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmg6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVybmJhbmRzLmM6CisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfbmJhbmRzX2Jhc2VfaW5pdCksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfbmJhbmRzX2luaXQpOgorCSAgQWRkIDMgYW5kIDEwIGJhbmQgdmVyc2lvbiBhbmQgYWRkIG1pc3NpbmcgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcy4KKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IChnc3Rfc3BlY3RydW1fZXZlbnQpLAorCSAgKGdzdF9zcGVjdHJ1bV90cmFuc2Zvcm1faXApOgorCSAgQWRkIHNvbWUgY29tbWVudHMgYWJvdXQgZmxvYXQgc3VwcG9ydC4KKworMjAwNy0wMy0xMiAxNzo1Njo1NCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2FwZXRhZy9nc3R0YWdkZW11eC5jOiBGaXggaGFuZGxpbmcgb2YgLTEgdmFsdWVzIGZvciBzdGFydCBhbmQgc3RvcCB2YWx1ZXMgd2hlbiBzZWVraW5nLCBhbmQgU0VFS19DVVIrU0VFS19FTkQgaGVyLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FwZXRhZy9nc3R0YWdkZW11eC5jOiAoZ3N0X3RhZ19kZW11eF9zcmNwYWRfZXZlbnQpOgorCSAgRml4IGhhbmRsaW5nIG9mIC0xIHZhbHVlcyBmb3Igc3RhcnQgYW5kIHN0b3AgdmFsdWVzIHdoZW4gc2Vla2luZywKKwkgIGFuZCBTRUVLX0NVUitTRUVLX0VORCBoZXJlIGFzIHdlbGwuCisKKzIwMDctMDMtMTIgMTc6MjQ6MjMgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzogRml4IGhhbmRsaW5nIG9mIC0xIHZhbHVlcyBmb3Igc3RhcnQgYW5kIHN0b3AgdmFsdWVzIHdoZW4gc2Vla2luZywgYW5kIFNFRUtfQ1VSK1NFRUtfRU5ELgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAoZ3N0X2lkM2RlbXV4X3NyY3BhZF9ldmVudCk6CisJICBGaXggaGFuZGxpbmcgb2YgLTEgdmFsdWVzIGZvciBzdGFydCBhbmQgc3RvcCB2YWx1ZXMgd2hlbiBzZWVraW5nLAorCSAgYW5kIFNFRUtfQ1VSK1NFRUtfRU5ELgorCisyMDA3LTAzLTEyIDE1OjQ5OjAyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSAgSSdtIHRvbyBsYXp5IHRvIGNvbW1lbnQgdGhpcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBBZGQgUGF0Y2ggYnk6IGxpbmUgZm9yIHdpbSwgc2luY2UgaGUncyBhd2F5CisKKzIwMDctMDMtMTIgMTM6Mjg6MjkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiBGaXggcGFyc2luZyBvZiBJRDMgdjIuMi4wIFBJQyBmcmFtZXMuIE9ubHkgaW4gdmVyc2lvbiA+PSAyLjMuMCBpcyB0aGUgaW1hZ2UgZm9ybWF0IGEgdmFyaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiAocGFyc2VfcGljdHVyZV9mcmFtZSk6CisJICBGaXggcGFyc2luZyBvZiBJRDMgdjIuMi4wIFBJQyBmcmFtZXMuIE9ubHkgaW4gdmVyc2lvbiA+PSAyLjMuMCBpcworCSAgdGhlIGltYWdlIGZvcm1hdCBhIHZhcmlhYmxlLWxlbmd0aCBOVUwtdGVybWluYXRlZCBzdHJpbmc7IGluCisJICB2ZXJzaW9ucyBiZWZvcmUgdGhhdCB0aGUgaW1hZ2UgZm9ybWF0IGlzIGEgZml4ZWQtbGVuZ3RoIHN0cmluZyBvZgorCSAgMyBjaGFyYWN0ZXJzIChzZWUgIzM0ODY0NCBmb3IgYSBzYW1wbGUgdGFnKS4KKwkgIEFsc28gbWFrZSBzdXBwbGllZCBtaW1lIHR5cGUgbG93ZXItY2FzZSBhbmQgZml4IHVwICdqcGcnIHRvICdqcGVnJy4KKworMjAwNy0wMy0xMSAyMjoyMzowNCArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay4qOiBIYW5kbGUgZGlzcGxheSBtb2RlIGNoYW5nZXMgZHVyaW5nIHBsYXliYWNrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6CisJICAqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmg6CisJICBIYW5kbGUgZGlzcGxheSBtb2RlIGNoYW5nZXMgZHVyaW5nIHBsYXliYWNrLgorCisyMDA3LTAzLTEwIDE2OjA3OjMxICswMDAwICBTw6liYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisKKwkgIHdpbjMyL01BTklGRVNUOiBBZGQgbmV3IHByb2plY3QgZmlsZXMgdG8gTUFOSUZFU1QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogd2luMzIvTUFOSUZFU1Q6CisJICBBZGQgbmV3IHByb2plY3QgZmlsZXMgdG8gTUFOSUZFU1QuCisJICAqIHdpbjMyL3ZzNi9saWJnc3RhdWRpb2Z4LmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHJ0cC5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RydHNwLmRzcDoKKwkgIFVwZGF0ZSBwcm9qZWN0IGZpbGVzLgorCisyMDA3LTAzLTEwIDEyOjMwOjQ4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBQcmludGYgZm9ybWF0IGZpeGVzOyBhbHNvIGFkZCBzb21lIG1pc3NpbmcgcXVvdGVzIGluIHRyYW5zbGF0ZWQgc3RyaW5ncy4gRml4ZXMgIzQxNjcyOCBhbmQgIzQxNjcyNy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3BhcnNlX3N1YmluZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3BhcnNlX2luZGV4KToKKwkgICogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOiAoZ3N0X3Y0bDJfZmlsbF9saXN0cyk6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX2dyYWJfZnJhbWUpOgorCSAgUHJpbnRmIGZvcm1hdCBmaXhlczsgYWxzbyBhZGQgc29tZSBtaXNzaW5nIHF1b3RlcyBpbiB0cmFuc2xhdGVkCisJICBzdHJpbmdzLiBGaXhlcyAjNDE2NzI4IGFuZCAjNDE2NzI3LgorCisyMDA3LTAzLTA5IDIwOjEyOjA4ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOiBUaW0gYW5kIEkgY2FuJ3QgdGhpbmsgb2YgYW55IHJlYXNvbiB0aGUgY2hpbGQgYXVkaW8gc2luayBuZWVkcyB0byBiZSBzZXQgYmFjayB0byBOLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOiAoZ3N0X2F1dG9fYXVkaW9fc2lua19maW5kX2Jlc3QpOgorCSAgVGltIGFuZCBJIGNhbid0IHRoaW5rIG9mIGFueSByZWFzb24gdGhlIGNoaWxkIGF1ZGlvIHNpbmsgbmVlZHMgdG8KKwkgIGJlIHNldCBiYWNrIHRvIE5VTEwgYWZ0ZXIgc3VjY2Vzc2Z1bGx5IGRldGVybWluaW5nIHRoYXQgaXQgY2FuCisJICByZWFjaCBSRUFEWSAtIGl0IGdldHMgaW1tZWRpYXRlbHkgc2V0IGJhY2sgdG8gUkVBRFkgYnkgdGhlIGNhbGxlcgorCSAgYW55d2F5LCBjYXVzaW5nIGFuIHVubmVjZXNzYXJ5IGNsb3NlL29wZW4gb2YgYW55IGF1ZGlvIGRldmljZXMKKwkgIGludm9sdmVkLgorCisyMDA3LTAzLTA5IDE5OjUxOjI3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBwby86IEFkZCBqYS5wbyBmaWxlIGZyb20gIzM3NzMwNi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBwby9MSU5HVUFTOgorCSAgKiBwby9qYS5wbzoKKwkgIEFkZCBqYS5wbyBmaWxlIGZyb20gIzM3NzMwNi4KKworMjAwNy0wMy0wOSAxOTo0NDozMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgc3lzL3N1bmF1ZGlvLzogQWN0dWFsbHkgdHJhbnNsYXRlIHN1bmF1ZGlvIG1peGVyIHRyYWNrIGxhYmVscyBpbnN0ZWFkIG9mIGp1c3QgbWFya2luZyB0aGUgc3RyaW5ncyBhcyB0cmFuc2xhdGFibGUgKCMzLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvLmM6IChwbHVnaW5faW5pdCk6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVydHJhY2suYzoKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl90cmFja19uZXcpOgorCSAgQWN0dWFsbHkgdHJhbnNsYXRlIHN1bmF1ZGlvIG1peGVyIHRyYWNrIGxhYmVscyBpbnN0ZWFkIG9mIGp1c3QKKwkgIG1hcmtpbmcgdGhlIHN0cmluZ3MgYXMgdHJhbnNsYXRhYmxlICgjMzc3MzA2KTsgY2xlYW4gdXAgd2VpcmQKKwkgIGxhYmVsIHN0cmluZyBtYXBwaW5nIGNvZGUgdGhhdCBzZXJ2ZXMgbm8gYXBwYXJlbnQgcHVycG9zZS4gQWxzbworCSAgc2V0IHRoZSAndW50cmFuc2xhdGVkLWxhYmVsJyBwcm9wZXJ0eSB3aGVuIGNyZWF0aW5nIG1peGVyIHRyYWNrcworCSAgaWYgdGhlIEdzdE1peGVyVHJhY2sgYmFzZSBjbGFzcyBzdXBwb3J0cyB0aGlzLgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvc3VuYXVkaW8uYzogKEdTVF9TVEFSVF9URVNUKSwKKwkgIChzdW5hdWRpb19zdWl0ZSk6CisJICBWZXJ5IG1pbmltYWxpc3RpYyB1bml0IHRlc3QgZm9yIHN1bmF1ZGlvbWl4ZXIgZWxlbWVudCAoY29tcGlsZXMsIGJ1dCBub3QKKwkgIGFjdHVhbGx5IHRlc3RlZCBvbiBhIHN5c3RlbSB3aGVyZSBzdW5hdWRpb21peGVyIGlzIGF2YWlsYWJsZSkuCisKKzIwMDctMDMtMDkgMTg6NDk6MzcgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogUmUtZW5hYmxlIHRoZSBzdGF0ZXMgdGVzdCBhbmQgc2VlIGlmIGl0IHdvcmtzIG9uIHRoZSBidWlsZGJvdHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBSZS1lbmFibGUgdGhlIHN0YXRlcyB0ZXN0IGFuZCBzZWUgaWYgaXQgd29ya3Mgb24gdGhlIGJ1aWxkYm90cy4KKworMjAwNy0wMy0wOSAxNzozMjozMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKworCSAgZXh0L2R2L2dzdGR2ZGVjLio6IEluZmVyIHBpeGVsLWFzcGVjdC1yYXRpbyBmcm9tIHRoZSB2aWRlbyBmcmFtZSBmb3JtYXQgaWYgaXQgaXNuJ3QgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lciwgYXMgaGFwLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVjLmM6IChnc3RfZHZkZWNfaW5pdCksIChnc3RfZHZkZWNfc2lua19zZXRjYXBzKSwKKwkgIChnc3RfZHZkZWNfc3JjX25lZ290aWF0ZSksIChnc3RfZHZkZWNfY2hhaW4pLAorCSAgKGdzdF9kdmRlY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvZHYvZ3N0ZHZkZWMuaDoKKwkgIEluZmVyIHBpeGVsLWFzcGVjdC1yYXRpbyBmcm9tIHRoZSB2aWRlbyBmcmFtZSBmb3JtYXQgaWYgaXQgaXNuJ3QKKwkgIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIsIGFzIGhhcHBlbnMgd2hlbiBwbGF5aW5nIERWIGZyb20gQVZJCisJICBvciBRdWlja3RpbWUgY29udGFpbmVycy4KKwkgIFBhdGNoIGJ5OiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorCSAgRml4ZXMgIzM4MDk0NAorCisyMDA3LTAzLTA5IDE3OjA1OjE3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IFdoZW4gYWN0aXZhdGVkLCByZW1vdmUgdGhlIHVkcHNyYyB0aW1lb3V0LCB3ZSBoYXZlIGRhdGFmbG93IGFuZCB0aW1lb3V0cyB3aWxsIGxhdGVyIGJlIGhhbmRsZWQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19hY3RpdmF0ZV9zdHJlYW1zKToKKwkgIFdoZW4gYWN0aXZhdGVkLCByZW1vdmUgdGhlIHVkcHNyYyB0aW1lb3V0LCB3ZSBoYXZlIGRhdGFmbG93IGFuZCB0aW1lb3V0cworCSAgd2lsbCBsYXRlciBiZSBoYW5kbGVkIGJ5IHRoZSBqaXR0ZXJidWZmZXIuCisKKzIwMDctMDMtMDkgMTY6NTM6MzkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6IEFkZCB3cml0ZSBzdXBwb3J0IGZvciBHU1RfVEFHX01VU0lDQlJBSU5aX1NPUlROQU1FIChUU09QKSB0YWcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzoKKwkgIEFkZCB3cml0ZSBzdXBwb3J0IGZvciBHU1RfVEFHX01VU0lDQlJBSU5aX1NPUlROQU1FIChUU09QKSB0YWcuCisJICBGaXhlcyAjNDE0NDk2LgorCisyMDA3LTAzLTA5IDE1OjA0OjQ1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IEZpeCBzdHJlYW0gcG9zaXRpb24gcmVwb3J0aW5nIGFmdGVyIGEgc2Vlay4gRml4ZXMgIzQxNjQ0NS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksCisJICAoZ3N0X2F2aV9kZW11eF9wdXNoX2V2ZW50KSwgKGdzdF9hdmlfZGVtdXhfZG9fc2VlayksCisJICAoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSksCisJICAoZ3N0X2F2aV9kZW11eF9jaGFpbik6CisJICBGaXggc3RyZWFtIHBvc2l0aW9uIHJlcG9ydGluZyBhZnRlciBhIHNlZWsuIEZpeGVzICM0MTY0NDUuCisKKzIwMDctMDMtMDkgMDg6NTg6MjYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2VxdWFsaXplci86IFJlZmFjdG9yIHBsdWdpbiBpbnRvIGEgYmFzZSBjbGFzcyBhbmQgYSBmaXJzdCBzdWJjbGFzcyAobmJhbmQgZXEpLiBUaGUgbmJhbmQgZXEgdXNlcyBHc3RDaGlsZFByb3h5IGFuLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2VxdWFsaXplci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzogKF9kb19pbml0KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9iYW5kX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX2JhbmRfY2xhc3NfaW5pdCksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9nZXRfdHlwZSksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfY2hpbGRfcHJveHlfZ2V0X2NoaWxkX2J5X2luZGV4KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9jaGlsZF9wcm94eV9nZXRfY2hpbGRyZW5fY291bnQpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX2NoaWxkX3Byb3h5X2ludGVyZmFjZV9pbml0KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9iYXNlX2luaXQpLCAoZ3N0X2lpcl9lcXVhbGl6ZXJfY2xhc3NfaW5pdCksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfZmluYWxpemUpLCAoc2V0dXBfZmlsdGVyKSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9jb21wdXRlX2ZyZXF1ZW5jaWVzKSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9zZXRfcHJvcGVydHkpLCAoZ3N0X2lpcl9lcXVhbGl6ZXJfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9zZXR1cCksIChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmg6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVybmJhbmRzLmM6CisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfbmJhbmRzX2Jhc2VfaW5pdCksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfbmJhbmRzX2NsYXNzX2luaXQpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX25iYW5kc19pbml0KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9uYmFuZHNfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9uYmFuZHNfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXJuYmFuZHMuaDoKKwkgIFJlZmFjdG9yIHBsdWdpbiBpbnRvIGEgYmFzZSBjbGFzcyBhbmQgYSBmaXJzdCBzdWJjbGFzcyAobmJhbmQgZXEpLiBUaGUKKwkgIG5iYW5kIGVxIHVzZXMgR3N0Q2hpbGRQcm94eSBhbmQgaXMgY29udHJvbGFibGUuIE1vcmUgc3ViY2xhc3NlcyB3aWxsCisJICBmb2xsb3cuCisKKzIwMDctMDMtMDggMTY6MDE6NDIgKzAwMDAgIFJlbsOpIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogTWFrZSBhdmlkZW11eCBhY2NlcHQgb3B0aW9uYWwgaGVhZGVyIGNodW5rcyBpbiBhbnkgb3JkZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBSZW7DqSBTdGFkbGVyIDxtYWlsIGF0IHJlbmVzdGFkbGVyIGRvdCBkZT4KKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0pLAorCSAgKGdzdF9hdmlfZGVtdXhfcHVzaF9ldmVudCksIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSksIChnc3RfYXZpX2RlbXV4X2NoYWluKToKKwkgIE1ha2UgYXZpZGVtdXggYWNjZXB0IG9wdGlvbmFsIGhlYWRlciBjaHVua3MgaW4gYW55IG9yZGVyLgorCSAgRml4ZXMgIzQxNTQ0Ni4KKworMjAwNy0wMy0wOCAxMjoyMzo1NyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOiBEaXNhYmxlIHRoZSBzdGF0ZXMgY2hlY2sgdW50aWwgdGhlIHJlbWFpbmluZyBWYWxncmluZCBlcnJvcnMgYXJlIGZpeGVkIG9yIHN1cHByZXNzZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBEaXNhYmxlIHRoZSBzdGF0ZXMgY2hlY2sgdW50aWwgdGhlIHJlbWFpbmluZyBWYWxncmluZCBlcnJvcnMKKwkgIGFyZSBmaXhlZCBvciBzdXBwcmVzc2VkLgorCisyMDA3LTAzLTA4IDEwOjI0OjQzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5jdnNpZ25vcmU6IEFkZCBhdWRpb2R5bmFtaWMgY2hlY2sgdG8gLmN2c2lnbm9yZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5jdnNpZ25vcmU6CisJICBBZGQgYXVkaW9keW5hbWljIGNoZWNrIHRvIC5jdnNpZ25vcmUKKworMjAwNy0wMy0wOCAxMDowMjoxMiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvYXVkaW9meC86IEFkZCBuZXcgYXVkaW9keW5hbWljIGVsZW1lbnQgd2hpY2ggY2FuIGFjdCBhcyBhIGNvbXByZXNzb3Igb3IgZXhwYW5kZXIuIFN1cHBvcnRlZCBhcmUgaGFyZC1rbmVlIGFuZCBzb2YuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmV2aWV3ZWQgYnk6IFN0ZWZhbiBLb3N0ICA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisJICAqIGdzdC9hdWRpb2Z4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2R5bmFtaWMuYzoKKwkgIChnc3RfYXVkaW9fZHluYW1pY19jaGFyYWN0ZXJpc3RpY3NfZ2V0X3R5cGUpLAorCSAgKGdzdF9hdWRpb19keW5hbWljX21vZGVfZ2V0X3R5cGUpLAorCSAgKGdzdF9hdWRpb19keW5hbWljX3NldF9wcm9jZXNzX2Z1bmN0aW9uKSwKKwkgIChnc3RfYXVkaW9fZHluYW1pY19iYXNlX2luaXQpLCAoZ3N0X2F1ZGlvX2R5bmFtaWNfY2xhc3NfaW5pdCksCisJICAoZ3N0X2F1ZGlvX2R5bmFtaWNfaW5pdCksIChnc3RfYXVkaW9fZHluYW1pY19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdWRpb19keW5hbWljX2dldF9wcm9wZXJ0eSksIChnc3RfYXVkaW9fZHluYW1pY19zZXR1cCksCisJICAoZ3N0X2F1ZGlvX2R5bmFtaWNfdHJhbnNmb3JtX2hhcmRfa25lZV9jb21wcmVzc29yX2ludCksCisJICAoZ3N0X2F1ZGlvX2R5bmFtaWNfdHJhbnNmb3JtX2hhcmRfa25lZV9jb21wcmVzc29yX2Zsb2F0KSwKKwkgIChnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2NvbXByZXNzb3JfaW50KSwKKwkgIChnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2NvbXByZXNzb3JfZmxvYXQpLAorCSAgKGdzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9oYXJkX2tuZWVfZXhwYW5kZXJfaW50KSwKKwkgIChnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1faGFyZF9rbmVlX2V4cGFuZGVyX2Zsb2F0KSwKKwkgIChnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2V4cGFuZGVyX2ludCksCisJICAoZ3N0X2F1ZGlvX2R5bmFtaWNfdHJhbnNmb3JtX3NvZnRfa25lZV9leHBhbmRlcl9mbG9hdCksCisJICAoZ3N0X2F1ZGlvX2R5bmFtaWNfdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmg6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZnguYzogKHBsdWdpbl9pbml0KToKKwkgIEFkZCBuZXcgYXVkaW9keW5hbWljIGVsZW1lbnQgd2hpY2ggY2FuIGFjdCBhcyBhIGNvbXByZXNzb3Igb3IKKwkgIGV4cGFuZGVyLiBTdXBwb3J0ZWQgYXJlIGhhcmQta25lZSBhbmQgc29mdC1rbmVlIG9wZXJhdGlvbiBtb2RlcyB3aXRoCisJICB1c2VyLXNwZWNpZmllZCByYXRpbyBhbmQgdGhyZXNob2xkLgorCSAgQXR0YWNrIGFuZCByZWxlYXNlIHBhcmFtZXRlcnMgYXJlIG5vdCB5ZXQgaW1wbGVtZW50ZWQgYnV0IHdpbGwgZm9sbG93LgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJICBJbnRlZ3JhdGUgYXVkaW9keW5hbWljIGludG8gdGhlIGRvY3MuCisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2R5bmFtaWMuYzogKHNldHVwX2R5bmFtaWMpLAorCSAgKGNsZWFudXBfZHluYW1pYyksIChHU1RfU1RBUlRfVEVTVCksIChkeW5hbWljX3N1aXRlKSwgKG1haW4pOgorCSAgQWRkIHVuaXQgdGVzdCBmb3IgYXVkaW9keW5hbWljLgorCisyMDA3LTAzLTA3IDE5OjQ4OjAzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IEZyZWUgaGFuZGxlcyB0aGF0IHdlIGFsbG9jYXRlZCB3aGVuIGV4aXRpbmcgdmlhIHRoZSBlcnJvciBwYXRocy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzogKGdzdF9kdjEzOTRzcmNfc3RhcnQpOgorCSAgRnJlZSBoYW5kbGVzIHRoYXQgd2UgYWxsb2NhdGVkIHdoZW4gZXhpdGluZyB2aWEgdGhlIGVycm9yIHBhdGhzLgorCisyMDA3LTAzLTA3IDEyOjA3OjA3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC93YXZwYWNrLzogVXNlIGEgZ2VuZXJhbCB3YXZwYWNrIGRlYnVnIGNhdGVnb3J5IGZvciBjb21tb24gY29kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tjb21tb24uYzoKKwkgIFVzZSBhIGdlbmVyYWwgd2F2cGFjayBkZWJ1ZyBjYXRlZ29yeSBmb3IgY29tbW9uIGNvZGUuCisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tzdHJlYW1yZWFkZXIuYzoKKwkgIChnc3Rfd2F2cGFja19zdHJlYW1fcmVhZGVyX3NldF9wb3NfYWJzKSwKKwkgIChnc3Rfd2F2cGFja19zdHJlYW1fcmVhZGVyX3NldF9wb3NfcmVsKSwKKwkgIChnc3Rfd2F2cGFja19zdHJlYW1fcmVhZGVyX3dyaXRlX2J5dGVzKToKKwkgIFVzZSB0aGUgZ2VuZXJhbCB3YXZwYWNrIGRlYnVnIGNhdGVnb3J5IGhlcmUgdG9vIGFuZCBhZGQgZGVidWcKKwkgIG91dHB1dCB0byB0aGUgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYXQgYWxsIGJ5CisJICB0aGUgd2F2cGFjayBsaWJyYXJ5LgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfcGx1Z2luX2luaXQpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfcGx1Z2luX2luaXQpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogKGdzdF93YXZwYWNrX3BhcnNlX3BsdWdpbl9pbml0KToKKwkgIENoYW5nZSBkZWJ1Z2dpbmcgY2F0ZWdvcnkgbmFtZXMgdG8gY29uZm9ybSB0byB0aGUgY29udmVudGlvbnMuCisKKzIwMDctMDMtMDcgMTE6Mzc6MjMgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguKjogU2hhcmUgcXRkZW11eCBkZWJ1ZyBjYXRlZ29yeSBhY3Jvc3MgYWxsIGZpbGVzLCBvdGhlcndpc2UgYWxsIGRlYnVnZ2luZyBpbiBmaWxlcyBvdGhlciB0aGFuIHF0ZC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSAgU2hhcmUgcXRkZW11eCBkZWJ1ZyBjYXRlZ29yeSBhY3Jvc3MgYWxsIGZpbGVzLCBvdGhlcndpc2UgYWxsIGRlYnVnZ2luZworCSAgaW4gZmlsZXMgb3RoZXIgdGhhbiBxdGRlbXV4LmMgd291bGQgZW5kIHVwIGluIHRoZSBkZWZhdWx0IGNhdGVnb3J5LgorCisyMDA3LTAzLTA3IDExOjI0OjA1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9sZXZlbC9nc3RsZXZlbC4qOiBSZXNvbHZlIG1lc3NhZ2UgdGltZXN0YW1wcyBhZ2FpbnN0IHRoZSBwbGF5YmFjayBzZWdtZW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiAoZ3N0X2xldmVsX2NsYXNzX2luaXQpLAorCSAgKGdzdF9sZXZlbF9zZXRfY2FwcyksIChnc3RfbGV2ZWxfc3RhcnQpLCAoZ3N0X2xldmVsX2V2ZW50KSwKKwkgIChnc3RfbGV2ZWxfdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmg6CisJICBSZXNvbHZlIG1lc3NhZ2UgdGltZXN0YW1wcyBhZ2FpbnN0IHRoZSBwbGF5YmFjayBzZWdtZW50LgorCisyMDA3LTAzLTA3IDExOjIzOjIwICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS4qOiBPbmUgRklYTUUgbGVzcywgYnkgcmVzb2x2aW5nIG1lc3NhZ2UgdGltZXN0YW1wcyBhZ2FpbnN0IHRoZSBwbGF5YmFjayBzZWdtZW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX3N0YXJ0KSwKKwkgIChnc3Rfc3BlY3RydW1fZXZlbnQpLCAoZ3N0X3NwZWN0cnVtX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5oOgorCSAgT25lIEZJWE1FIGxlc3MsIGJ5IHJlc29sdmluZyBtZXNzYWdlIHRpbWVzdGFtcHMgYWdhaW5zdCB0aGUgcGxheWJhY2sKKwkgIHNlZ21lbnQuCisKKzIwMDctMDMtMDYgMjM6MjE6NDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIENoYW5nZUxvZzoKKwkgIEZpeCBDaGFuZ2VMb2cgbWVzc2FnZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGaXggQ2hhbmdlTG9nIG1lc3NhZ2UKKworMjAwNy0wMy0wNiAyMzoxOTozMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IERvbid0IGxlYWsgY2FwczogbWFrZSBnc3RfaWQzZGVtdXhfYWRkX3NyY3BhZCgpIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgY2FwcyBwYXNzZWQgdG8gLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfaWQzZGVtdXhfYWRkX3NyY3BhZCksCisJICAoZ3N0X2lkM2RlbXV4X3NpbmtfYWN0aXZhdGUpOgorCSAgRG9uJ3QgbGVhayBjYXBzOiBtYWtlIGdzdF9pZDNkZW11eF9hZGRfc3JjcGFkKCkgbm90IHRha2Ugb3duZXJzaGlwIG9mIHRoZQorCSAgY2FwcyBwYXNzZWQgdG8gaXQgKHByZXZpb3VzbGx5IG9uZSBjb2RlIHBhdGggYXNzdW1lcyBpdCB0YWtlcyBvd25lcnNoaXAKKwkgIHdoaWxlIGFub3RoZXIgb25lIGFzc3VtZXMgaXQgZG9lc24ndCkuCisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogdGVzdHMvZmlsZXMvTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2ZpbGVzL2lkMy00MDczNDktMS50YWc6CisJICAqIHRlc3RzL2ZpbGVzL2lkMy00MDczNDktMi50YWc6CisJICBBZGQgZGlyZWN0b3J5IHdoZXJlIGRhdGEgZm9yIHVuaXQgdGVzdHMgY2FuIGJlIHN0b3JlZC4KKwkgICogdGVzdHMvTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDNkZW11eC5jOiAocGFkX2FkZGVkX2NiKSwgKGVycm9yX2NiKSwKKwkgIChyZWFkX3RhZ3NfZnJvbV9maWxlKSwgKHJ1bl9jaGVja19mb3JfZmlsZSksCisJICAoY2hlY2tfZGF0ZV8xOTc3XzA2XzIzKSwgKEdTVF9TVEFSVF9URVNUKSwgKGlkM2RlbXV4X3N1aXRlKToKKwkgIEFkZCB1bml0IHRlc3QgZm9yIGlkM2RlbXV4LCBhbmQgaW4gcGFydGljdWxhciBmb3IgYnVnICM0MDczNDkuIE9ubHkKKwkgIHRlc3RpbmcgcHVsbC1tb2RlIGZvciBub3c7IHB1c2ggbW9kZSBkb2Vzbid0IHdvcmsgeWV0IGJlY2F1c2UgdGhlIHRlc3QKKwkgIGZpbGVzIGFyZSBzbWFsbGVyIHRoYW4gSUQzX1RZUEVfRklORF9NSU5fU0laRS4KKworMjAwNy0wMy0wNiAyMjoxNDo1OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06IEFkZCBtaXNzaW5nIGJhY2tzbGFzaCBhdCBlbmQgb2YgbGluZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIEFkZCBtaXNzaW5nIGJhY2tzbGFzaCBhdCBlbmQgb2YgbGluZS4KKworMjAwNy0wMy0wNiAxODozNjowOSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIGNvbW1vbjoKKwkgIFRyaWdnZXIgcmVidWlsZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgVHJpZ2dlciByZWJ1aWxkLgorCisyMDA3LTAzLTA2IDE4OjE2OjQ5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvaWQzZGVtdXgvOiBEbyBub3QgY29udmVydCBvYnNvbGV0ZSBUREEvVERBVCBmcmFtZXMgdG8gVERSQyBmcmFtZXMsIG90aGVyd2lzZSB0aGUgZm91ci1kaWdpdCBudW1iZXIgd2lsbCBiZSBpbnRlcnAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdGFncy5jOiAoaWQzZGVtdXhfaWQzdjJfZnJhbWVzX3RvX3RhZ19saXN0KToKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuaDoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IChpZDNkZW11eF9pZDN2Ml9wYXJzZV9mcmFtZSksCisJICAocGFyc2Vfb2Jzb2xldGVfdGRhdF9mcmFtZSk6CisJICBEbyBub3QgY29udmVydCBvYnNvbGV0ZSBUREEvVERBVCBmcmFtZXMgdG8gVERSQyBmcmFtZXMsIG90aGVyd2lzZQorCSAgdGhlIGZvdXItZGlnaXQgbnVtYmVyIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYSB5ZWFyLCB3aGVyZWFzIGl0IGlzCisJICBtb250aCBhbmQgZGF5IGluIERETU0gZm9ybWF0LiBJbnN0ZWFkLCBwYXJzZSBUREFUIGZyYW1lcyBhbmQgZml4IHVwCisJICB0aGUgZGF0ZSBpbiB0aGUgR1NUX1RBR19EQVRFIHRhZyBsYXRlciBpZiB3ZSBhbHNvIGV4dHJhY3RlZCBhIHllYXIuCisJICBGaXhlcyAjNDA3MzQ5LgorCisyMDA3LTAzLTA2IDE0OjUzOjA0ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZXh0L2djb25mL2dzdHN3aXRjaHNpbmsuYzogRml4IHVwIHRoZSBkaXNwb3NlIGxvZ2ljIHNvIGl0IGRvZXNuJ3QgbGVhaywgYW5kIGZpeCBzZXR0aW5nIG9mIHRoZSBjaGlsZCBzdGF0ZSBzbyB0aGF0IHdlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2djb25mL2dzdHN3aXRjaHNpbmsuYzogKGdzdF9zd2l0Y2hfc2lua19kaXNwb3NlKSwKKwkgIChnc3Rfc3dpdGNoX2NvbW1pdF9uZXdfa2lkKToKKwkgIEZpeCB1cCB0aGUgZGlzcG9zZSBsb2dpYyBzbyBpdCBkb2Vzbid0IGxlYWssIGFuZCBmaXggc2V0dGluZyBvZgorCSAgdGhlIGNoaWxkIHN0YXRlIHNvIHRoYXQgd2UgZG9uJ3Qgc2V0IGEgY2hpbGQgdG8gb3VyIGN1cnJlbnQgc3RhdGUKKwkgIGp1c3QgYXMgd2UgYXJlIGNoYW5naW5nIGl0IHRvIHNvbWV0aGluZyBlbHNlLgorCisyMDA3LTAzLTA2IDEzOjU3OjU1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogRml4IGFuZCBjbGVhbnVwIGRlZmF1bHQgcHJvcGVydHkgdmFsdWVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zcGVjdHJ1bV9pbml0KSwgKGdzdF9zcGVjdHJ1bV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9zcGVjdHJ1bV90cmFuc2Zvcm1faXApOgorCSAgRml4IGFuZCBjbGVhbnVwIGRlZmF1bHQgcHJvcGVydHkgdmFsdWVzLgorCSAgQWRkIEZJWE1FcyBmb3Igc3R1ZmYgdGhhdCBsb29rcyByYXRoZXIgd3JvbmcuCisKKzIwMDctMDMtMDYgMTM6MjE6MjMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9nb29tL2dzdGdvb20uKjogRG9jdW1lbnQsIGZpeCBhbmQgaW1wcm92ZSBnb29tIGFkYXB0ZXIgYmVoYXZpb3VyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9nb29tL2dzdGdvb20uYzogKGdzdF9nb29tX3NyY19zZXRjYXBzKSwgKGdldF9idWZmZXIpLAorCSAgKGdzdF9nb29tX2NoYWluKToKKwkgICogZ3N0L2dvb20vZ3N0Z29vbS5oOgorCSAgRG9jdW1lbnQsIGZpeCBhbmQgaW1wcm92ZSBnb29tIGFkYXB0ZXIgYmVoYXZpb3VyLgorCSAgRml4ZXMgIzQwNzAwNi4KKworMjAwNy0wMy0wNSAxODo0MzoyOSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGV4dC9lc2QvZXNkc2luay5jOiBVbnJlZiBzdGF0aWMgcGFkIHRlbXBsYXRlIGFmdGVyIHVzaW5nIGl0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfb3Blbik6CisJICBVbnJlZiBzdGF0aWMgcGFkIHRlbXBsYXRlIGFmdGVyIHVzaW5nIGl0LgorCisyMDA3LTAzLTA1IDE3OjE3OjA0ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZXh0L2djb25mL2dzdHN3aXRjaHNpbmsuYzogRml4IHVwIHRoZSByZWZlcmVuY2UgY291bnRpbmcgb2YgdGhlIGNoaWxkIGVsZW1lbnRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nY29uZi9nc3Rzd2l0Y2hzaW5rLmM6IChnc3Rfc3dpdGNoX3NpbmtfZGlzcG9zZSksCisJICAoZ3N0X3N3aXRjaF9jb21taXRfbmV3X2tpZCk6CisJICBGaXggdXAgdGhlIHJlZmVyZW5jZSBjb3VudGluZyBvZiB0aGUgY2hpbGQgZWxlbWVudHMuCisKKzIwMDctMDMtMDUgMTc6MDg6MzIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvOiBGaXggZW5jb2RpbmctbmFtZSBjYXNlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOiAoZ3N0X3J0cF9tcDRnX3BheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzogKGdzdF9ydHBfdGhlb3JhX3BheV9maW5pc2hfaGVhZGVycyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6IChnc3RfcnRwX3ZvcmJpc19wYXlfZmluaXNoX2hlYWRlcnMpOgorCSAgRml4IGVuY29kaW5nLW5hbWUgY2FzZS4KKworMjAwNy0wMy0wNSAxNjozOToyOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IEZpeCBzcGVleCAoZGUpcGF5bG9hZGVyLiBGaXhlcyAjMzU4MDQwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOiAoZ3N0X3J0cF9zcGVleF9kZXBheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX3NwZWV4X2RlcGF5X2dldF9tb2RlKSwgKGdzdF9ydHBfc3BlZXhfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9zcGVleF9kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOiAoZ3N0X3J0cF9zcGVleF9wYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX3NwZWV4X3BheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfc3BlZXhfcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfc3BlZXhfcGF5X3BhcnNlX2lkZW50KSwgKGdzdF9ydHBfc3BlZXhfcGF5X2hhbmRsZV9idWZmZXIpLAorCSAgKGdzdF9ydHBfc3BlZXhfcGF5X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuaDoKKwkgIEZpeCBzcGVleCAoZGUpcGF5bG9hZGVyLiBGaXhlcyAjMzU4MDQwLgorCisyMDA3LTAzLTA1IDE1OjQyOjU4ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZXh0L2djb25mL2dzdHN3aXRjaHNpbmsuYzogSW5zdGFsbCBmYWtlc2luayBpbiBOVUxMIGJ5IGZpeGluZyBzb21lIGJyb2tlbiBsb2dpYy4gVGhpcyBvYnZpYXRlcyB0aGUgbmVlZCB0byBtYW51YWxseSBzLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2djb25mL2dzdHN3aXRjaHNpbmsuYzogKGdzdF9zd2l0Y2hfc2lua19yZXNldCksCisJICAoZ3N0X3N3aXRjaF9jb21taXRfbmV3X2tpZCksIChnc3Rfc3dpdGNoX3Npbmtfc2V0X2NoaWxkKToKKwkgIEluc3RhbGwgZmFrZXNpbmsgaW4gTlVMTCBieSBmaXhpbmcgc29tZSBicm9rZW4gbG9naWMuIFRoaXMgb2J2aWF0ZXMKKwkgIHRoZSBuZWVkIHRvIG1hbnVhbGx5IHNldCBfSVNfU0lOSy4KKwkgIEFkZCBzb21lIGNvbW1lbnRzIGFuZCByZW1vdmUgYSBsaXR0bGUgY3J1ZnQgd2hpbGUgSSdtIGF0IGl0LgorCisyMDA3LTAzLTA1IDE0OjQ2OjQzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvZ2NvbmYvZ3N0c3dpdGNoc2luay5jOiBNYXJrIHVzIGFzIGEgc2luayB3aGVuIHdlIGhhdmUgbm8gZmFrZXNpbmsgaW4gTlVMTC4gRml4ZXMgIzQxNDg4Ny4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZ2NvbmYvZ3N0c3dpdGNoc2luay5jOiAoZ3N0X3N3aXRjaF9zaW5rX3Jlc2V0KToKKwkgIE1hcmsgdXMgYXMgYSBzaW5rIHdoZW4gd2UgaGF2ZSBubyBmYWtlc2luayBpbiBOVUxMLiBGaXhlcyAjNDE0ODg3LgorCisyMDA3LTAzLTA1IDA4OjMwOjUyICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9zcGVjdHJ1bS86IFJlbW92ZSB0d28gb2Jzb2xldGUgYW5kIGNvbmZ1c2luZyBjb21tZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1hdWRpb3Rlc3QuYzogKG1lc3NhZ2VfaGFuZGxlcik6CisJICAqIGdzdC9zcGVjdHJ1bS9kZW1vLW9zc3NyYy5jOiAobWVzc2FnZV9oYW5kbGVyKToKKwkgIFJlbW92ZSB0d28gb2Jzb2xldGUgYW5kIGNvbmZ1c2luZyBjb21tZW50cy4KKworMjAwNy0wMy0wNCAxODo1MjoxMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgcG8vUE9URklMRVMuaW46IFVwZGF0ZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBwby9QT1RGSUxFUy5pbjoKKwkgIFVwZGF0ZS4KKworMjAwNy0wMy0wNCAxNzozMzozNCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOiBHYWghIEFsc28gZGlzYWJsZSBnY29uZnZpZGVvc2luayBmcm9tIHRoZSB0ZXN0cywgb3RoZXJ3aXNlIGl0IHdpbGwgaW5zdGFudGlhdGUgYXV0b3ZpZGVvc2luay4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgR2FoISBBbHNvIGRpc2FibGUgZ2NvbmZ2aWRlb3NpbmsgZnJvbSB0aGUgdGVzdHMsIG90aGVyd2lzZQorCSAgaXQgd2lsbCBpbnN0YW50aWF0ZSBhdXRvdmlkZW9zaW5rLCBhbmQgZGZidmlkZW9zaW5rIGFuZAorCSAgbGVhayBvbiB0aGUgYnVpbGRib3RzLgorCisyMDA3LTAzLTA0IDE3OjEzOjE5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZXh0L2NkaW8vZ3N0Y2Rpb2NkZGFzcmMuYzogTWFrZSBzdXJlIHdlIGFsd2F5cyBkZXN0cm95IG91ciBsaWJjZGlvIGhhbmRsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvY2Rpby9nc3RjZGlvY2RkYXNyYy5jOiAoZ3N0X2NkaW9fY2RkYV9zcmNfb3BlbiksCisJICAoZ3N0X2NkaW9fY2RkYV9zcmNfZmluYWxpemUpOgorCSAgTWFrZSBzdXJlIHdlIGFsd2F5cyBkZXN0cm95IG91ciBsaWJjZGlvIGhhbmRsZS4KKworMjAwNy0wMy0wNCAxNzowNTo1OCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOiBEaXNhYmxlIGF1dG92aWRlb3Npbmsgc28gdGhlIGJ1aWxkYm90cyBkb24ndCBiYXJmIG92ZXIgbWVtb3J5IGxlYWtlZCBpbiB0aGUgZGlyZWN0ZmIgc2luay4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIERpc2FibGUgYXV0b3ZpZGVvc2luayBzbyB0aGUgYnVpbGRib3RzIGRvbid0IGJhcmYgb3ZlciBtZW1vcnkKKwkgIGxlYWtlZCBpbiB0aGUgZGlyZWN0ZmIgc2luay4KKworMjAwNy0wMy0wNCAxNToyODozMCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6IENoYWluIHVwIGluIGRpc3Bvc2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiAoZ3N0X3hpbWFnZV9zcmNfZGlzcG9zZSk6CisJICBDaGFpbiB1cCBpbiBkaXNwb3NlCisKKzIwMDctMDMtMDQgMTU6MDc6MTUgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6IFVzZSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSBpbnN0ZWFkIG9mIHN0YXRpY19wYWRfdGVtcGxhdGVfZ2V0K3BhZF9uZXcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOiAoZ3N0X211bHRpcGFydF9kZW11eF9pbml0KSwKKwkgIChnc3RfbXVsdGlwYXJ0X2ZpbmRfcGFkX2J5X21pbWUpOgorCSAgVXNlIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlIGluc3RlYWQgb2YKKwkgIHN0YXRpY19wYWRfdGVtcGxhdGVfZ2V0K3BhZF9uZXcuCisKKzIwMDctMDMtMDQgMTQ6NTY6NTMgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiBDYXRjaCB0aGUgY2FzZSB3aGVyZSBubyBjbG9jayBoYXMgYmVlbiBzZXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzogKGdzdF94aW1hZ2Vfc3JjX2NyZWF0ZSk6CisJICBDYXRjaCB0aGUgY2FzZSB3aGVyZSBubyBjbG9jayBoYXMgYmVlbiBzZXQuCisKKzIwMDctMDMtMDQgMTM6NTI6MDMgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBGaXggYSBidW5jaCBvZiBsZWFrcyBzaG93biBieSB0aGUgbmV3bHktYWRkZWQgc3RhdGVzIHRlc3QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOiAoZ3N0X2ZsYWNfZW5jX2ZpbmFsaXplKToKKwkgICogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zaW5rLmM6IChnc3RfZ2NvbmZfYXVkaW9fc2lua19jbGFzc19pbml0KSwKKwkgIChnc3RfZ2NvbmZfYXVkaW9fc2lua19kaXNwb3NlKSwgKGdzdF9nY29uZl9hdWRpb19zaW5rX2ZpbmFsaXplKToKKwkgICogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuYzogKGdzdF9nY29uZl9hdWRpb19zcmNfYmFzZV9pbml0KSwKKwkgIChnc3RfZ2NvbmZfYXVkaW9fc3JjX2NsYXNzX2luaXQpLCAoZ3N0X2djb25mX2F1ZGlvX3NyY19kaXNwb3NlKSwKKwkgIChnc3RfZ2NvbmZfYXVkaW9fc3JjX2ZpbmFsaXplKSwgKGRvX3RvZ2dsZV9lbGVtZW50KToKKwkgICogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zaW5rLmM6IChnc3RfZ2NvbmZfdmlkZW9fc2lua19iYXNlX2luaXQpLAorCSAgKGdzdF9nY29uZl92aWRlb19zaW5rX2NsYXNzX2luaXQpLCAoZ3N0X2djb25mX3ZpZGVvX3NpbmtfZmluYWxpemUpLAorCSAgKGRvX3RvZ2dsZV9lbGVtZW50KToKKwkgICogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zcmMuYzogKGdzdF9nY29uZl92aWRlb19zcmNfYmFzZV9pbml0KSwKKwkgIChnc3RfZ2NvbmZfdmlkZW9fc3JjX2NsYXNzX2luaXQpLCAoZ3N0X2djb25mX3ZpZGVvX3NyY19kaXNwb3NlKSwKKwkgIChnc3RfZ2NvbmZfdmlkZW9fc3JjX2ZpbmFsaXplKSwgKGRvX3RvZ2dsZV9lbGVtZW50KToKKwkgICogZXh0L2djb25mL2dzdHN3aXRjaHNpbmsuYzogKGdzdF9zd2l0Y2hfc2lua19jbGFzc19pbml0KSwKKwkgIChnc3Rfc3dpdGNoX3NpbmtfcmVzZXQpLCAoZ3N0X3N3aXRjaF9zaW5rX3NldF9jaGlsZCk6CisJICAqIGV4dC9oYWwvZ3N0aGFsYXVkaW9zaW5rLmM6IChnc3RfaGFsX2F1ZGlvX3NpbmtfYmFzZV9pbml0KToKKwkgICogZXh0L2hhbC9nc3RoYWxhdWRpb3NyYy5jOiAoZ3N0X2hhbF9hdWRpb19zcmNfYmFzZV9pbml0KToKKwkgICogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzogKGdzdF9zaG91dDJzZW5kX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zaG91dDJzZW5kX2luaXQpLCAoZ3N0X3Nob3V0MnNlbmRfZmluYWxpemUpOgorCSAgKiBnc3QvZGVidWcvdGVzdHBsdWdpbi5jOiAoZ3N0X3Rlc3RfY2xhc3NfaW5pdCksCisJICAoZ3N0X3Rlc3RfZmluYWxpemUpOgorCSAgKiBnc3QvZmx4L2dzdGZseGRlYy5jOiAoZ3N0X2ZseGRlY19jbGFzc19pbml0KSwKKwkgIChnc3RfZmx4ZGVjX2Rpc3Bvc2UpOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOiAoZ3N0X211bHRpcGFydF9tdXhfZmluYWxpemUpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzogKGdzdF9ydHBfbXA0Z19wYXlfZmluYWxpemUpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19pbml0KSwKKwkgIChnc3RfcnRzcHNyY19maW5hbGl6ZSk6CisJICAqIGdzdC9ydHNwL3J0c3BleHR3bXMuYzogKHJ0c3BfZXh0X3dtc19mcmVlX2NvbnRleHQpOgorCSAgKiBnc3QvcnRzcC9ydHNwZXh0d21zLmg6CisJICAqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOiAoZ3N0X3NtcHRlX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zbXB0ZV9maW5hbGl6ZSk6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChnc3RfbXVsdGl1ZHBzaW5rX2ZpbmFsaXplKToKKwkgICogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6IChnc3RfdWRwc2lua19jbGFzc19pbml0KSwKKwkgIChnc3RfdWRwc2lua19maW5hbGl6ZSk6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2Rpc3Bvc2UpLAorCSAgKGdzdF93YXZwYXJzZV9zaW5rX2FjdGl2YXRlKToKKwkgICogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IChnc3Rfb3NzX3NpbmtfZmluYWxpc2UpOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NyYy5jOiAoZ3N0X29zc19zcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X29zc19zcmNfZmluYWxpemUpOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6IChnc3RfdjRsMl9vYmplY3RfZGVzdHJveSk6CisJICAqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3Y0bDJzcmNfZmluYWxpemUpOgorCSAgKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiAoZ3N0X3hpbWFnZV9zcmNfeGltYWdlX2dldCk6CisJICBGaXggYSBidW5jaCBvZiBsZWFrcyBzaG93biBieSB0aGUgbmV3bHktYWRkZWQgc3RhdGVzIHRlc3QuCisKKzIwMDctMDMtMDQgMTM6NDE6MDAgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBleHQvZHYvZ3N0ZHZkZWMuYzogVXNlIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlIGluc3RlYWQgb2Ygc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXQrcGFkX25ldy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19pbml0KToKKwkgIFVzZSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSBpbnN0ZWFkIG9mCisJICBzdGF0aWNfcGFkX3RlbXBsYXRlX2dldCtwYWRfbmV3LgorCisyMDA3LTAzLTAzIDEzOjA2OjIxICswMDAwICBMb8OvYyBNaW5pZXIgPGxvb2wrZ25vbWVAdmlhLmVjcC5mcj4KKworCSAgRG9uJ3QgbWl4IHRhYnMgYW5kIHNwYWNlcyAoIzQxNDE2OCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBMb8OvYyBNaW5pZXIgPGxvb2wrZ25vbWUgYXQgdmlhIGVjcCBmcj4KKwkgICogZXh0L2xpYmNhY2EvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWJ1Zy9NYWtlZmlsZS5hbToKKwkgIERvbid0IG1peCB0YWJzIGFuZCBzcGFjZXMgKCM0MTQxNjgpLgorCisyMDA3LTAzLTAyIDIxOjM1OjExICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHRlc3RzL2NoZWNrL2dlbmVyaWMvLmN2c2lnbm9yZTogSWdub3JlIGZpbGVzIHRvIHBsZWFzZSBidWlsZGJvdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9nZW5lcmljLy5jdnNpZ25vcmU6CisJICBJZ25vcmUgZmlsZXMgdG8gcGxlYXNlIGJ1aWxkYm90LgorCisyMDA3LTAzLTAyIDIxOjAxOjE5ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBVbmJyZWFrIG15IHByZXZpb3VzIGNvbW1pdCAoc3dhcHBlZCBub21pbmF0b3IgJiBkZW5vbWluYXRvcikuIFRpbSwgdGhhbmtzIGZvciBzcG90dGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhKToKKwkgIFVuYnJlYWsgbXkgcHJldmlvdXMgY29tbWl0IChzd2FwcGVkIG5vbWluYXRvciAmIGRlbm9taW5hdG9yKS4gVGltLAorCSAgdGhhbmtzIGZvciBzcG90dGluZy4KKworMjAwNy0wMy0wMiAxNjowODoxNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L2NkaW8vZ3N0Y2Rpb2NkZGFzcmMuYzogU21hbGwgY29kZSBjbGVhbnVwcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvY2Rpby9nc3RjZGlvY2RkYXNyYy5jOiAoZ3N0X2NkaW9fY2RkYV9zcmNfcHJvYmVfZGV2aWNlcyksCisJICAoZ3N0X2NkaW9fY2RkYV9zcmNfcmVhZF9zZWN0b3IpLCAoZ3N0X2NkaW9fY2RkYV9zcmNfb3BlbiksCisJICAoZ3N0X2NkaW9fY2RkYV9zcmNfZmluYWxpemUpOgorCSAgU21hbGwgY29kZSBjbGVhbnVwcy4KKwkgIERvbid0IHVzZSBwYWRfYWxsb2MgYXMgdGhlIGJhc2UgY2xhc3MgY2Fubm90IGRlYWwgd2l0aCB0aGUgZXJyb3IgY29kZXMuCisKKzIwMDctMDMtMDIgMTM6NDA6MDYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IEZpeCBkb2MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3VkcHNyY19jcmVhdGUpOgorCSAgRml4IGRvYy4KKworMjAwNy0wMy0wMiAxMzoyOToyNSArMDAwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IEhhbmRsZSByb3VuZGluZyBiZXR0ZXIgdG8gbm90IGRyb3AgbGFzdCBzYW1wbGUgZnJhbWUuIEZpeGVzICMzNTY2OTIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFJlbsOpIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAodWludDY0X2NlaWxpbmdfc2NhbGVfaW50KSwKKwkgIChnc3Rfd2F2cGFyc2VfcGVyZm9ybV9zZWVrKSwgKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhKToKKwkgIEhhbmRsZSByb3VuZGluZyBiZXR0ZXIgdG8gbm90IGRyb3AgbGFzdCBzYW1wbGUgZnJhbWUuIEZpeGVzICMzNTY2OTIKKworMjAwNy0wMy0wMiAxMzoxOTo1NyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOiBEaXNhYmxlIGNhY2FzaW5rIGZyb20gdGhlIHN0YXRlcyBjaGVjayB0b28gLSBpdCBhbHNvIGNhbGxzIGV4aXQoMSkgb24gdXMgd2hlbiBpdCBjYW4ndCBmaW5kIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgRGlzYWJsZSBjYWNhc2luayBmcm9tIHRoZSBzdGF0ZXMgY2hlY2sgdG9vIC0gaXQgYWxzbyBjYWxscyBleGl0KDEpCisJICBvbiB1cyB3aGVuIGl0IGNhbid0IGZpbmQgYSB0ZXJtaW5hbCB0byB0YWxrIHRvLgorCisyMDA3LTAzLTAyIDEyOjU2OjEzICswMDAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdHVkcHNyYy4qOiBBZGQgc3VwcG9ydCB0byBzdHJpcCBwcm9wcmlldGFyeSBoZWFkZXJzLiBGaXhlcyAjMzUwMjk2LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyIGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3VkcHNyY19pbml0KSwKKwkgIChnc3RfdWRwc3JjX2NyZWF0ZSksIChnc3RfdWRwc3JjX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3VkcHNyY19nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCSAgQWRkIHN1cHBvcnQgdG8gc3RyaXAgcHJvcHJpZXRhcnkgaGVhZGVycy4gRml4ZXMgIzM1MDI5Ni4KKworMjAwNy0wMy0wMiAxMjo1Mjo1NiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuYzogRml4IGNvbXBpbGF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6IChnc3RfcnRwX21wMnRfZGVwYXlfcHJvY2Vzcyk6CisJICBGaXggY29tcGlsYXRpb24uCisKKzIwMDctMDMtMDIgMTI6MTY6MTYgKzAwMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5Lio6IEFkZCBzdXBwb3J0IHRvIHN0cmlwIG9mZiBwcm9wcmlldGFyeSBoZWFkZXJzLiBGaXhlcyAjMzUwMjc4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyIGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6IChnc3RfcnRwX21wMnRfZGVwYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9tcDJ0X2RlcGF5X2luaXQpLCAoZ3N0X3J0cF9tcDJ0X2RlcGF5X3Byb2Nlc3MpLAorCSAgKGdzdF9ydHBfbXAydF9kZXBheV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfbXAydF9kZXBheV9nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5oOgorCSAgQWRkIHN1cHBvcnQgdG8gc3RyaXAgb2ZmIHByb3ByaWV0YXJ5IGhlYWRlcnMuIEZpeGVzICMzNTAyNzguCisKKzIwMDctMDMtMDIgMTE6MjI6MzUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9oYWwvaGFsLmM6IEZpeCBjb21waWxhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvaGFsL2hhbC5jOgorCSAgRml4IGNvbXBpbGF0aW9uLgorCisyMDA3LTAzLTAyIDEwOjU0OjQ5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuKjogUmVtb3ZlIGRldmljZS1uYW1lIGZyb20gR3N0U3VuQXVkaW9TcmMuIEZpeGVzICM0MTI1OTcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc3JjLmM6IChnc3Rfc3VuYXVkaW9zcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3N1bmF1ZGlvc3JjX2luaXQpLCAoZ3N0X3N1bmF1ZGlvc3JjX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3N1bmF1ZGlvc3JjX29wZW4pOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuaDoKKwkgIFJlbW92ZSBkZXZpY2UtbmFtZSBmcm9tIEdzdFN1bkF1ZGlvU3JjLiBGaXhlcyAjNDEyNTk3LgorCisyMDA3LTAzLTAxIDIxOjUwOjM2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC9oYWwvOiBIYXZpbmcgTlVMTCBhcyBVREkgcHJldmlvdXNseSBzZWxlY3RlZCB0aGUgZGVmYXVsdCBzaW5rL3NyYy4gQ2hhbmdlIHRoaXMgYmFjayBidXQgbWVudGlvbiBpdCBpbiB0aGUgZGVidWcgby4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9oYWwvZ3N0aGFsYXVkaW9zaW5rLmM6IChkb190b2dnbGVfZWxlbWVudCk6CisJICAqIGV4dC9oYWwvZ3N0aGFsYXVkaW9zcmMuYzogKGRvX3RvZ2dsZV9lbGVtZW50KToKKwkgIEhhdmluZyBOVUxMIGFzIFVESSBwcmV2aW91c2x5IHNlbGVjdGVkIHRoZSBkZWZhdWx0IHNpbmsvc3JjLiBDaGFuZ2UKKwkgIHRoaXMgYmFjayBidXQgbWVudGlvbiBpdCBpbiB0aGUgZGVidWcgb3V0cHV0LgorCSAgKiBleHQvaGFsL2hhbC5jOiAoZ3N0X2hhbF9nZXRfYWxzYV9lbGVtZW50KSwKKwkgIChnc3RfaGFsX2dldF9vc3NfZWxlbWVudCksIChnc3RfaGFsX2dldF9zdHJpbmcpLAorCSAgKGdzdF9oYWxfcmVuZGVyX2Jpbl9mcm9tX3VkaSksIChnc3RfaGFsX2dldF9hdWRpb19zaW5rKSwKKwkgIChnc3RfaGFsX2dldF9hdWRpb19zcmMpOgorCSAgKiBleHQvaGFsL2hhbC5oOgorCSAgUmVmYWN0b3IgYSBiaXQsIGNoZWNrIGFsbCBlcnJvciBjb25kaXRpb25zLCBncmVhdGx5IGltcHJvdmUgZGVidWdnaW5nCisJICBhbmQgZml4IHNvbWUgcG9zc2libGUgbWVtb3J5IGxlYWtzLiBBbHNvIGltcGxlbWVudCBPU1Mgc3VwcG9ydAorCSAgYW5kIGFsbG93IHNwZWNpZnlpbmcgYW4gVURJIHRoYXQgcG9pbnRzIHRvIGEgcmVhbCBkZXZpY2UuIEZvciB0aGlzIHRoZQorCSAgY2hpbGQgZGV2aWNlIHdoaWNoIHN1cHBvcnRzIEFMU0EgKHByZWZlcnJlZCkgb3IgT1NTIGlzIHVzZWQuCisJICBBcyBhIHNpZGUgZWZmZWN0IHRoaXMgbWFrZXMgaXQgaW1wb3NzaWJsZSBub3cgdG8gZ2V0IGEgYWxzYXNpbmsgaW4KKwkgIGhhbGF1ZGlvc3JjIGFuZCBhIGFsc2FzcmMgaW4gaGFsYXVkaW9zaW5rLgorCisyMDA3LTAzLTAxIDE4OjQ3OjI4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IEVycm9ycyBmcm9tIHRoZSB1ZHAgc291cmNlcyBhcmUgbm90IGZhdGFsIHVubGVzcyBhbGwgb2YgdGhlbSBhcmUgaW4gZXJyb3IuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZmluZF9zdHJlYW1fYnlfY2hhbm5lbCksCisJICAoZmluZF9zdHJlYW1fYnlfdWRwc3JjKSwgKGdzdF9ydHNwc3JjX2hhbmRsZV9tZXNzYWdlKToKKwkgIEVycm9ycyBmcm9tIHRoZSB1ZHAgc291cmNlcyBhcmUgbm90IGZhdGFsIHVubGVzcyBhbGwgb2YgdGhlbSBhcmUgaW4KKwkgIGVycm9yLgorCisyMDA3LTAzLTAxIDE4OjE0OjQyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06IERpc2FibGUgYWFzaW5rIGluIHRoZSBzdGF0ZXMgdGVzdC4gSSBzdXNwZWN0IHRoaXMgaXMgdGhlIGVsZW1lbnQgdGhhdCBpcyBjYWxsaW5nIGV4aXQoMSkgd2hlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBEaXNhYmxlIGFhc2luayBpbiB0aGUgc3RhdGVzIHRlc3QuIEkgc3VzcGVjdCB0aGlzIGlzIHRoZSBlbGVtZW50IHRoYXQKKwkgIGlzIGNhbGxpbmcgZXhpdCgxKSB3aGVuIGl0IGNhbid0IHByb2NlZWQuCisKKzIwMDctMDMtMDEgMTc6MjY6MzAgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogRHJhdyBwbHVnaW5zIGluIGZyb20gdGhlIGJ1aWxkIHRyZWUgc3lzLyBkaXIsIHJhdGhlciB0aGFuIHBpY2tpbmcgdXAgdGhlIGFscmVhZHkgaW5zdGFsbGVkIHYuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIERyYXcgcGx1Z2lucyBpbiBmcm9tIHRoZSBidWlsZCB0cmVlIHN5cy8gZGlyLCByYXRoZXIgdGhhbiBwaWNraW5nCisJICB1cCB0aGUgYWxyZWFkeSBpbnN0YWxsZWQgdmVyc2lvbnMuCisKKzIwMDctMDMtMDEgMTA6NDQ6MzYgKzAwMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkgIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6IEVycm9yIG91dCBjb3JyZWN0bHkgd2hlbiBnZXR0aW5nIHhjb250ZXh0IGZhaWxzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA3LTAzLTAxICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisJICAqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6IChnc3RfeGltYWdlX3NyY19vcGVuX2Rpc3BsYXkpOgorCSAgRXJyb3Igb3V0IGNvcnJlY3RseSB3aGVuIGdldHRpbmcgeGNvbnRleHQgZmFpbHMuCisKKzIwMDctMDMtMDEgMDk6Mjk6MzQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOiBNYWtlIHN0YXRlIGNoYW5nZSB0byBQQVVTRUQgTk9fUFJFUk9MTCBiZWNhdXNlIHRoYXQncyB3aGF0IGl0IHdpbGwgYmUgaW4gdGhlIGZ1dHVyZSBhbmQgcnRzcHNyYy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOiAoZ3N0X3J0cGRlY19jaGFuZ2Vfc3RhdGUpOgorCSAgTWFrZSBzdGF0ZSBjaGFuZ2UgdG8gUEFVU0VEIE5PX1BSRVJPTEwgYmVjYXVzZSB0aGF0J3Mgd2hhdCBpdCB3aWxsIGJlIGluCisJICB0aGUgZnV0dXJlIGFuZCBydHNwc3JjIHJlbGllcyBvbiBpdC4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV90cmFuc3BvcnQpLAorCSAgKGdzdF9ydHNwc3JjX2NoYW5nZV9zdGF0ZSk6CisJICBEb24ndCBlcnJvciBvdXQgd2hlbiB3ZSBkb24ndCBnZXQgYW4gZXJyb3IgZnJvbSB0aGUgc3RhdGUgY2hhbmdlCisJICBmdW5jdGlvbi4KKworMjAwNy0wMy0wMSAwMTo0ODo1OSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvaGFsLzogQ2hlY2sgaWYgdGhlIGRldmljZSBVREkgaXMgc2V0IGJlZm9yZSB0cnlpbmcgdG8gcXVlcnkgSEFMIGFib3V0IGl0IGFuZCBnaXZlIGEgdXNlZnVsIGVycm9yIG1lc3NhZ2UgaWYgaXQgd2EuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvaGFsL2dzdGhhbGF1ZGlvc2luay5jOiAoZG9fdG9nZ2xlX2VsZW1lbnQpOgorCSAgKiBleHQvaGFsL2dzdGhhbGF1ZGlvc3JjLmM6IChkb190b2dnbGVfZWxlbWVudCk6CisJICBDaGVjayBpZiB0aGUgZGV2aWNlIFVESSBpcyBzZXQgYmVmb3JlIHRyeWluZyB0byBxdWVyeSBIQUwKKwkgIGFib3V0IGl0IGFuZCBnaXZlIGEgdXNlZnVsIGVycm9yIG1lc3NhZ2UgaWYgaXQgd2Fzbid0IHNldC4KKwkgICogZXh0L2hhbC9oYWwuYzogKGdzdF9oYWxfZ2V0X3N0cmluZyk6CisJICBEb24ndCBxdWVyeSBIQUwgZm9yIE5VTEwgVURJcy4gUGFzc2luZyBOVUxMIGFzIFVESSB0byBIQUwKKwkgIGdpdmVzIGFuIGFzc2VydGlvbiBmYWlsdXJlIGluIEQtQnVzIHdoZW4gcnVubmluZyB3aXRoCisJICBEQlVTX0ZBVEFMX1dBUk5JTkdTPTEuCisKKzIwMDctMDItMjggMTk6Mjk6NDIgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICB1cGRhdGUgY29uZmlnIHRvIHRydW5rCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHVwZGF0ZSBjb25maWcgdG8gdHJ1bmsKKworMjAwNy0wMi0yOCAxOToyOToyNSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGNvbmZpZ3VyZS5hYzogQ29udmVydCB0byBuZXcgQUdfR1NUIHN0eWxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIENvbnZlcnQgdG8gbmV3IEFHX0dTVCBzdHlsZS4KKworMjAwNy0wMi0yOCAxMjo1OTo0MyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIHRlc3RzL2NoZWNrLzogYWRkIHRlc3QgZm9yIHN0YXRlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9nZW5lcmljL3N0YXRlcy5jOiAoR1NUX1NUQVJUX1RFU1QpLCAoc3RhdGVzX3N1aXRlKToKKwkgIGFkZCB0ZXN0IGZvciBzdGF0ZXMKKworMjAwNy0wMi0yOCAxMDo1ODoxMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZTogQWRkIG5ldyB2aWRlb2ZpbHRlciBjaGVjayB0byAuY3ZzaWdub3JlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5jdnNpZ25vcmU6CisJICBBZGQgbmV3IHZpZGVvZmlsdGVyIGNoZWNrIHRvIC5jdnNpZ25vcmUuCisKKzIwMDctMDItMjggMTA6NTQ6NTUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogRml4IGNvbWJpbmVkIGZsb3cgcmV0dXJuLiBGaXhlcyAjNDEyNjA4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfY29tYmluZV9mbG93cyksCisJICAoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSksCisJICAoZ3N0X2F2aV9kZW11eF9sb29wKSwgKGdzdF9hdmlfZGVtdXhfY2hhaW4pOgorCSAgRml4IGNvbWJpbmVkIGZsb3cgcmV0dXJuLiBGaXhlcyAjNDEyNjA4LgorCisyMDA3LTAyLTI4IDEwOjQxOjE0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06IERpc3QgaGVhZGVyLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJICBEaXN0IGhlYWRlci4uCisKKzIwMDctMDItMjggMTA6Mjk6MDggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5oOiBBZGQgaGVhZGVyIHRvby4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuaDoKKwkgIEFkZCBoZWFkZXIgdG9vLgorCisyMDA3LTAyLTI4IDEwOjE3OjE1ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorCisJICBnc3QvdmlkZW9maWx0ZXIvOiBQb3J0IGdhbW1hIGZpbHRlciB0byAwLjEwLiBGaXhlcyAjNDEyNzA0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3IGF0IHNreW5ldCBiZT4KKwkgICogZ3N0L3ZpZGVvZmlsdGVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzogKGdzdF9nYW1tYV9iYXNlX2luaXQpLAorCSAgKGdzdF9nYW1tYV9jbGFzc19pbml0KSwgKGdzdF9nYW1tYV9pbml0KSwgKGdzdF9nYW1tYV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9nYW1tYV9nZXRfcHJvcGVydHkpLCAoZ3N0X2dhbW1hX2NhbGN1bGF0ZV90YWJsZXMpLAorCSAgKG9pbF90YWJsZWxvb2t1cF91OCksIChnc3RfZ2FtbWFfc2V0X2NhcHMpLAorCSAgKGdzdF9nYW1tYV9wbGFuYXI0MTFfaXApLCAoZ3N0X2dhbW1hX3RyYW5zZm9ybV9pcCksIChwbHVnaW5faW5pdCk6CisJICBQb3J0IGdhbW1hIGZpbHRlciB0byAwLjEwLiBGaXhlcyAjNDEyNzA0LgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9maWx0ZXIuYzogKHNldHVwX2ZpbHRlciksCisJICAoY2xlYW51cF9maWx0ZXIpLCAoY2hlY2tfZmlsdGVyKSwgKEdTVF9TVEFSVF9URVNUKSwKKwkgICh2aWRlb2JhbGFuY2Vfc3VpdGUpLCAodmlkZW9mbGlwX3N1aXRlKSwgKGdhbW1hX3N1aXRlKSwgKG1haW4pOgorCSAgQWRkIHVuaXQgdGVzdHMgZm9yIHZpZGVvZmlsdGVycy4KKworMjAwNy0wMi0yOCAxMDowNjoyNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvVVJMUzogQWRkIGFub3RoZXIgaW50ZXJlc3RpbmcgdGVzdCB1cmwuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvVVJMUzoKKwkgIEFkZCBhbm90aGVyIGludGVyZXN0aW5nIHRlc3QgdXJsLgorCSAgKiBnc3QvcnRzcC9ydHNwbWVzc2FnZS5jOiAocnRzcF9tZXNzYWdlX2dldF9oZWFkZXIpOgorCSAgRG9uJ3QgYWxsb3cgZ2V0dGluZyBoZWFkZXIgZmllbGRzIGZyb20gZGF0YSBwYWNrZXRzLgorCisyMDA3LTAyLTI3IDIzOjQzOjA4ICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIGV4dC9zaG91dDIvZ3N0c2hvdXQyLio6IEFkZCBhIHByb3BlcnR5IGZvciB1c2VybmFtZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOiAoZ3N0X3Nob3V0MnNlbmRfY2xhc3NfaW5pdCksCisJICAoZ3N0X3Nob3V0MnNlbmRfaW5pdCksIChnc3Rfc2hvdXQyc2VuZF9zdGFydCksCisJICAoZ3N0X3Nob3V0MnNlbmRfc2V0X3Byb3BlcnR5KSwgKGdzdF9zaG91dDJzZW5kX2dldF9wcm9wZXJ0eSk6CisJICAqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmg6CisJICBBZGQgYSBwcm9wZXJ0eSBmb3IgdXNlcm5hbWUuCisKKzIwMDctMDItMjcgMTI6MDI6MDMgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3BsdWdpbi5jOgorCSogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmg6CisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRwbHVnaW4uYzoKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuaDoKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5oOgorCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICB1cGRhdGUgY29weXJpZ2h0IHN0YXRlbWVudHMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdXBkYXRlIGNvcHlyaWdodCBzdGF0ZW1lbnRzCisKKzIwMDctMDItMjcgMTE6NTk6MjEgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9lbGVtZW50LmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9lbGVtZW50Lmg6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmg6CisJICB1cGRhdGUgY29weXJpZ2h0IHN0YXRlbWVudAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICB1cGRhdGUgY29weXJpZ2h0IHN0YXRlbWVudAorCisyMDA3LTAyLTI3IDExOjMwOjE5ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBzeXMvb3N4dmlkZW8vOiBEaXNhYmxlIHRoZSBjb2NvYSBldmVudCBsb29wIHNpbmNlIGl0J3MgYSBodWdlIG1lbW9yeSBsZWFrLiBTaG91bGQgb25seSBtYXR0ZXIgaWYgdGhlIHNpbmsgaXNuJ3QgdXNlZCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cuaDoKKwkgICogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgRGlzYWJsZSB0aGUgY29jb2EgZXZlbnQgbG9vcCBzaW5jZSBpdCdzIGEgaHVnZSBtZW1vcnkgbGVhay4gU2hvdWxkIG9ubHkKKwkgIG1hdHRlciBpZiB0aGUgc2luayBpc24ndCB1c2VkIHdpdGhpbiBhbiBOU0FwcCAod2hpY2ggaGFzIGFscmVhZHkgZ290CisJICBhIGNvY2EgZXZlbnQgbG9vcCkuCisJICBSZW1vdmUgYWxsIHVudXNlZCBjb2RlLgorCisyMDA3LTAyLTI2IDEyOjA3OjE0ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L3J0c3AvTWFrZWZpbGUuYW06IEZpeCBtYWtlIGNoZWNrIHRvby4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9NYWtlZmlsZS5hbToKKwkgIEZpeCBtYWtlIGNoZWNrIHRvby4KKworMjAwNy0wMi0yNiAxMDowMDoyOCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC9ydHNwL2Jhc2U2NC4qOiBDb21taXQgbWlzc2luZyBmaWxlcyBmb3IgYmFzZTY0IGVuY29kaW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2Jhc2U2NC5jOiAodXRpbF9iYXNlNjRfZW5jb2RlKToKKwkgICogZ3N0L3J0c3AvYmFzZTY0Lmg6CisJICBDb21taXQgbWlzc2luZyBmaWxlcyBmb3IgYmFzZTY0IGVuY29kaW5nLgorCisyMDA3LTAyLTI0IDIyOjU3OjQ5ICswMDAwICBMb8OvYyBNaW5pZXIgPGxvb2wrZ25vbWVAdmlhLmVjcC5mcj4KKworCSAgRml4IGJ1aWxkIHdpdGggTERGTEFHUz0nLVdsLC16LGRlZnMnICgjNDEwOTk3KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTG/Dr2MgTWluaWVyIDxsb29sK2dub21lIGF0IHZpYSBlY3AgZnI+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZXh0L2Fubm9kZXgvTWFrZWZpbGUuYW06CisJICAqIGV4dC9qcGVnL01ha2VmaWxlLmFtOgorCSAgKiBleHQvc3BlZXgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hbHBoYS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2N1dHRlci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RlYnVnL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZWZmZWN0di9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2dvb20vTWFrZWZpbGUuYW06CisJICAqIGdzdC9sZXZlbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NtcHRlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJICBGaXggYnVpbGQgd2l0aCBMREZMQUdTPSctV2wsLXosZGVmcycgKCM0MTA5OTcpCisKKzIwMDctMDItMjQgMjI6NTI6NDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIEZpeCBidWlsZCB3aXRoIExERkxBR1M9Jy1XbCwteixkZWZzJy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGV4dC9nc20vTWFrZWZpbGUuYW06CisJICAqIGV4dC9sYWRzcGEvTWFrZWZpbGUuYW06CisJICAqIGV4dC93YXZwYWNrL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZXF1YWxpemVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZmlsdGVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXZlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbnNmL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NwZWVkL01ha2VmaWxlLmFtOgorCSAgRml4IGJ1aWxkIHdpdGggTERGTEFHUz0nLVdsLC16LGRlZnMnLgorCisyMDA3LTAyLTIzIDE5OjEyOjUyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L3J0c3AvOiBnX2Jhc2U2NF9lbmNvZGUgaXMgYSBHTGliIDIuMTIgZnVuY3Rpb24uIFVzZSBhbiBlcXVpdmFsZW50IHRha2VuIGZyb20gaWNlY2FzdCB0byByZXBsYWNlIGl0LiBSZWxpY2Vuc2VkIGZyLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChhcHBlbmRfYXV0aF9oZWFkZXIpLAorCSAgKHJ0c3BfY29ubmVjdGlvbl9zZW5kKSwgKHJ0c3BfY29ubmVjdGlvbl9zZXRfYXV0aCk6CisJICBnX2Jhc2U2NF9lbmNvZGUgaXMgYSBHTGliIDIuMTIgZnVuY3Rpb24uIFVzZSBhbiBlcXVpdmFsZW50IHRha2VuCisJICBmcm9tIGljZWNhc3QgdG8gcmVwbGFjZSBpdC4gUmVsaWNlbnNlZCBmcm9tIEdQTCBjb3VydGVzeSBvZiBNaWtlCisJICBTbWl0aC4KKworMjAwNy0wMi0yMyAxODoxMjoyNyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC9ydHNwLzogSW1wbGVtZW50IHNpbXBsZSBCYXNpYyBBdXRoZW50aWNhdGlvbiBzdXBwb3J0IHNvIHRoYXQgdXJscyBsaWtlIHJ0c3A6Ly91c2VyOnBhc3NAaG9zdG5hbWUvcnRzcHN0cmVhbSB3b3JrIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2ZpbmFsaXplKSwKKwkgIChnc3RfcnRzcHNyY19jcmVhdGVfc3RyZWFtKSwgKHJ0c3BfYXV0aF9tZXRob2RfdG9fc3RyaW5nKSwKKwkgIChnc3RfcnRzcHNyY19wYXJzZV9hdXRoX2hkciksIChnc3RfcnRzcHNyY19zZXR1cF9hdXRoKSwKKwkgIChnc3RfcnRzcHNyY19zZW5kKSwgKGdzdF9ydHNwc3JjX3RyeV9zZW5kKSwgKGdzdF9ydHNwc3JjX29wZW4pLAorCSAgKGdzdF9ydHNwc3JjX2Nsb3NlKSwgKGdzdF9ydHNwc3JjX3BsYXkpLCAoZ3N0X3J0c3BzcmNfcGF1c2UpLAorCSAgKGdzdF9ydHNwc3JjX3VyaV9zZXRfdXJpKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOiAocnRzcF9jb25uZWN0aW9uX2NyZWF0ZSksCisJICAoYXBwZW5kX2F1dGhfaGVhZGVyKSwgKHJ0c3BfY29ubmVjdGlvbl9zZW5kKSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fZnJlZSksIChydHNwX2Nvbm5lY3Rpb25fc2V0X2F1dGgpOgorCSAgKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5oOgorCSAgKiBnc3QvcnRzcC9ydHNwZGVmcy5oOgorCSAgKiBnc3QvcnRzcC9ydHNwdXJsLmM6IChydHNwX3VybF9nZXRfcmVxdWVzdF91cmkpOgorCSAgKiBnc3QvcnRzcC9ydHNwdXJsLmg6CisJICBJbXBsZW1lbnQgc2ltcGxlIEJhc2ljIEF1dGhlbnRpY2F0aW9uIHN1cHBvcnQgc28gdGhhdCB1cmxzIGxpa2UKKwkgIHJ0c3A6Ly91c2VyOnBhc3NAaG9zdG5hbWUvcnRzcHN0cmVhbSB3b3JrIG9uIGhvc3RzIHRoYXQgcmVxdWlyZQorCSAgYXV0aGVudGljYXRpb24uCisKKzIwMDctMDItMjIgMTc6NTM6MjYgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogQ2hhbmdlTG9nOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICBGaXggc2VnZmF1bHQgd2hlbiBvcHBlbmluZyBhIHJhZGlvIGRldmljZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRml4IHNlZ2ZhdWx0IHdoZW4gb3BwZW5pbmcgYSByYWRpbyBkZXZpY2UuCisKKzIwMDctMDItMjIgMTQ6MzU6MjggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgRml4IGxldmVsIGZvciBtdWx0aS1jaGFubmVsIGNhc2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6IChnc3RfbGV2ZWxfc2V0X2NhcHMpLAorCSAgKGdzdF9sZXZlbF90cmFuc2Zvcm1faXApOgorCSAgKiBzeXMvdjRsMi9SRUFETUU6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICBGaXggbGV2ZWwgZm9yIG11bHRpLWNoYW5uZWwgY2FzZS4KKworMjAwNy0wMi0yMSAxMDoxODoxMiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvbGV2ZWwvZ3N0bGV2ZWwuKjogVXNlIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIHByb2Nlc3MgZnVuY3Rpb24gYW5kIGFkZCBwcm9jZXNzIGZ1bmN0aW9ucyBmb3IgZmxvYXQgYXVkaW8uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6IChnc3RfbGV2ZWxfaW5pdCksIChnc3RfbGV2ZWxfc2V0X2NhcHMpLAorCSAgKGdzdF9sZXZlbF90cmFuc2Zvcm1faXApOgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuaDoKKwkgIFVzZSBmdW5jdGlvbiBwb2ludGVyIGZvciBwcm9jZXNzIGZ1bmN0aW9uIGFuZCBhZGQgcHJvY2VzcyBmdW5jdGlvbnMKKwkgIGZvciBmbG9hdCBhdWRpby4KKworMjAwNy0wMi0yMCAyMTozNDowMCArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLio6IFJlbW92ZSBpbmNsdWRlIG9mIHVudXNlZCBoZWFkZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgICogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5oOgorCSAgUmVtb3ZlIGluY2x1ZGUgb2YgdW51c2VkIGhlYWRlcnMuCisJICAqIHN5cy93YXZlZm9ybS9nc3R3YXZlZm9ybXBsdWdpbi5jOgorCSAgKiBzeXMvd2F2ZWZvcm0vZ3N0d2F2ZWZvcm1zaW5rLmM6CisJICAqIHN5cy93YXZlZm9ybS9nc3R3YXZlZm9ybXNpbmsuaDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHdhdmVmb3JtLmRzcDoKKwkgIEFkZCBhIG5ldyB3YXZlZm9ybSBwbHVnaW4gd2hpY2ggaW5jbHVkZXMgYW4gYXVkaW8gc2luaworCSAgZWxlbWVudCB1c2luZyB0aGUgV2F2ZUZvcm0gd2luMzIgQVBJLgorCSAgKiB3aW4zMi9NQU5JRkVTVDoKKwkgIEFkZCB0aGUgbmV3IHByb2plY3QgZmlsZSBmb3JtIHdhdmVmb3JtIHBsdWdpbi4KKworMjAwNy0wMi0xOSAxMjoyMjo0MyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IFJlYWRkIEdTVF9FTEVNRU5UX0VSUk9SIGlmIHdlIGNhbid0IHJlZW5xdWUgYnVmZmVycyBhZnRlciBFSU8sIGZpeGVzICM0MDczNjkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IChnc3RfdjRsMnNyY19maWxsX2Zvcm1hdF9saXN0KSwKKwkgIChnc3RfdjRsMnNyY19ncmFiX2ZyYW1lKSwgKGdzdF92NGwyc3JjX3NldF9jYXB0dXJlKSwKKwkgIChnc3RfdjRsMnNyY19jYXB0dXJlX2luaXQpOgorCSAgUmVhZGQgR1NUX0VMRU1FTlRfRVJST1IgaWYgd2UgY2FuJ3QgcmVlbnF1ZSBidWZmZXJzIGFmdGVyIEVJTywKKwkgIGZpeGVzICM0MDczNjkKKworMjAwNy0wMi0xOCAxODowMDo1MSArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICBzeXMvZGlyZWN0ZHJhdy86IFByZXBhcmUgdGhlIHBsdWdpbiB0byBtb3ZlIHRvIGdvb2Q6CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3BsdWdpbi5jOgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jOgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5oOgorCSAgUHJlcGFyZSB0aGUgcGx1Z2luIHRvIG1vdmUgdG8gZ29vZDoKKwkgIFJlbW92ZSB1bnVzZWQvdW50ZXN0ZWQgY29kZSAocmVuZGVyaW5nIHRvIGFuIGV4dGVybiBzdXJmYWNlLAorCSAgeXV2IGZvcm1hdCByZW5kZXJpbmcpLlVzZSBHU1RfKERFQlVHLyopX09CSkVDVCBtYWNyb3MKKwkgIFJlbmFtZSBhbGwgZnVuY3Rpb25zIGZyb20gZ3N0X2RpcmVjdGRyYXdzaW5rIHRvIGdzdF9kaXJlY3RkcmF3X3NpbmsuCisJICBBZGQgZ3RrIGRvYyBzZWN0aW9uCisJICBGaXggYSBidWcgaW4gZ3N0X2RpcmVjdGRyYXdfc2lua19zaG93X2ZyYW1lLCBtZW1jcHkgbGluZSBieSBsaW5lCisJICByZXNwZWN0aW5nIGRlc3RpbmF0aW9uIHN1cmZhY2Ugc3RyaWRlLgorCSAgKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRwbHVnaW4uYzoKKwkgICogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmg6CisJICBQcmVwYXJlIHRoZSBwbHVnaW4gdG8gbW92ZSB0byBnb29kOgorCSAgUmVuYW1lIGFsbCBmdW5jdGlvbnMgZnJvbSBnc3RfZGlyZWN0c291bmRzaW5rIHRvIGdzdF9kaXJlY3Rzb3VuZF9zaW5rLgorCSAgQWRkIGd0ayBkb2Mgc2VjdGlvbgorCSAgKiB3aW4zMi9jb21tb24vY29uZmlnLmguaW46CisJICAqIHdpbjMyL01BTklGRVNUOgorCSAgQWRkIGNvbmZpZy5oLmluCisKKzIwMDctMDItMTggMTM6MjQ6MjYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvOiBBZGRlZCBzaW1wbGUgbXBlZyB0cmFuc3BvcnQgc3RyZWFtIHBheWxvYWRlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwL2dzdHJ0cC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzogKGdzdF9ydHBfbXAydF9wYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX21wMnRfcGF5X2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9tcDJ0X3BheV9pbml0KSwKKwkgIChnc3RfcnRwX21wMnRfcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9tcDJ0X3BheV9oYW5kbGVfYnVmZmVyKSwKKwkgIChnc3RfcnRwX21wMnRfcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5Lmg6CisJICBBZGRlZCBzaW1wbGUgbXBlZyB0cmFuc3BvcnQgc3RyZWFtIHBheWxvYWRlci4KKworMjAwNy0wMi0xNiAxMjozMjowMSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvVVJMUzogQWRkIGV4YW1wbGUgSDI2NCBydHNwIHVybC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9VUkxTOgorCSAgQWRkIGV4YW1wbGUgSDI2NCBydHNwIHVybC4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfbWVkaWFfdG9fY2FwcyksCisJICAoZ3N0X3J0c3BzcmNfaGFuZGxlX21lc3NhZ2UpLCAoZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlKToKKwkgIERvbid0IGNvbnZlcnQgdmFsdWVzIHRvIGxvd2VyY2FzZSBvciB3ZSBtaWdodCBtZXNzIHVwIGJhc2U2NCBlbmNvZGVkCisJICBwcm9wZXJ0aWVzLgorCisyMDA3LTAyLTE2IDEyOjMwOjIyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL1JFQURNRTogRml4IGNhc2Ugb2Ygc3RyaW5nIHBhcmFtcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL1JFQURNRToKKwkgIEZpeCBjYXNlIG9mIHN0cmluZyBwYXJhbXMuCisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6IChnc3RfcnRwX2gyNjRfZGVwYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9oMjY0X2RlcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9oMjY0X2RlcGF5X3Byb2Nlc3MpOgorCSAgRml4IGRlcGF5bG9hZGVyLCBzdXBwb3J0IG1vcmUgcGFja2V0IHR5cGVzLgorCSAgQWRkIHN5bmMgY29kZXMgdG8gbWFrZSBzdXJlIHRoZSBwYWNrZXRpemVyIGNhbiBkbyBpdHMgam9iLgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jOiAoZ3N0X3J0cF9tcHZfZGVwYXlfcHJvY2Vzcyk6CisJICBGaXggY2FwcyBjYXNlIGFnYWluLgorCisyMDA3LTAyLTE1IDEyOjI2OjI4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOiBTZXQgcmlnaHQgY2FwcyBvbiBvdXRwdXQgYnVmZmVycy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOiAoZ3N0X3J0cF9oMjY0X2RlcGF5X3Byb2Nlc3MpOgorCSAgU2V0IHJpZ2h0IGNhcHMgb24gb3V0cHV0IGJ1ZmZlcnMuCisKKzIwMDctMDItMTQgMTc6MDQ6NDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL3NkcG1lc3NhZ2UuYzogQ2xlYXIgc3RhY2sgYWxsb2NhdGVkIFNEUE1lZGlhIHN0cnVjdCBiZWZvcmUgY2FsbGluZyBfaW5pdCgpIG9uIGl0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL3NkcG1lc3NhZ2UuYzogKHNkcF9wYXJzZV9saW5lKToKKwkgIEFzIHNwb3R0ZWQgYnk6IFBldGVyIEtqZWxsZXJzdGVkdCAgPHBraiBhdCBheGlzIGNvbT46CisJICBDbGVhciBzdGFjayBhbGxvY2F0ZWQgU0RQTWVkaWEgc3RydWN0IGJlZm9yZSBjYWxsaW5nIF9pbml0KCkgb24gaXQuCisJICBDbGFyaWZ5IHRoaXMgaW4gdGhlIGRvY3MgYXMgd2VsbC4KKworMjAwNy0wMi0xNCAxNzowMToyNSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOiBEb24ndCByZXNldCB0aGUgcHJvZmlsZSB3aGVuIGdvaW5nIHN3aXRjaGluZyBzdGF0ZXMsIGFzIGl0IG1ha2VzIHRoZSBlbGVtZW50IG5vbi1yZXVzYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOiAoZ3N0X2djb25mX2F1ZGlvX3NpbmtfcmVzZXQpLAorCSAgKGRvX2NoYW5nZV9jaGlsZCk6CisJICBEb24ndCByZXNldCB0aGUgcHJvZmlsZSB3aGVuIGdvaW5nIHN3aXRjaGluZyBzdGF0ZXMsIGFzIGl0IG1ha2VzCisJICB0aGUgZWxlbWVudCBub24tcmV1c2FibGUuCisKKzIwMDctMDItMTQgMTU6MjQ6NTAgKzAwMDAgIGpwLmxpdSA8anBfbGl1QGFzdHJvY29tLmNuPgorCisJICBnc3QvcnRzcC9zZHBtZXNzYWdlLio6IEZpeCBtZW1vcnkgbWFuYWdlbWVudCBvZiBTRFAgbWVzc2FnZXMuIEZpeGVzICM0MDc3OTMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3Avc2RwbWVzc2FnZS5jOiAoc2RwX29yaWdpbl9pbml0KSwgKHNkcF9jb25uZWN0aW9uX2luaXQpLAorCSAgKHNkcF9iYW5kd2lkdGhfaW5pdCksIChzZHBfdGltZV9pbml0KSwgKHNkcF96b25lX2luaXQpLAorCSAgKHNkcF9rZXlfaW5pdCksIChzZHBfYXR0cmlidXRlX2luaXQpLCAoc2RwX21lc3NhZ2VfaW5pdCksCisJICAoc2RwX21lc3NhZ2VfdW5pbml0KSwgKHNkcF9tZXNzYWdlX2ZyZWUpLCAoc2RwX21lZGlhX2luaXQpLAorCSAgKHNkcF9tZWRpYV91bmluaXQpLCAoc2RwX21lZGlhX2ZyZWUpLCAoc2RwX21lc3NhZ2VfYWRkX21lZGlhKSwKKwkgIChzZHBfcGFyc2VfbGluZSk6CisJICAqIGdzdC9ydHNwL3NkcG1lc3NhZ2UuaDoKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5OiBqcC5saXUgPGpwX2xpdSBhdCBhc3Ryb2NvbSBkb3QgY24+CisJICBGaXggbWVtb3J5IG1hbmFnZW1lbnQgb2YgU0RQIG1lc3NhZ2VzLiBGaXhlcyAjNDA3NzkzLgorCisyMDA3LTAyLTE0IDEyOjA3OjAxICswMDAwICB6aGFuZ2ZlaSBnYW8gPGdhb3poYW5nZmVpQHlhaG9vLmNvbS5jbj4KKworCSAgZ3N0L2F2aS9nc3RhdmltdXguYzogQWxsb3cgbXV4aW5nIHZpZGVvL3gtaDI2NCAod2FzIGFscmVhZHkgaW4gdGhlIGNhcHMpLiBGaXhlcyAjNDA3NzgwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogemhhbmdmZWkgZ2FvIDxnYW96aGFuZ2ZlaUB5YWhvby5jb20uY24+CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpX211eF92aWRzaW5rX3NldF9jYXBzKToKKwkgIEFsbG93IG11eGluZyB2aWRlby94LWgyNjQgKHdhcyBhbHJlYWR5IGluIHRoZSBjYXBzKS4gRml4ZXMgIzQwNzc4MC4KKworMjAwNy0wMi0xNCAxMDowOToxMiArMDAwMCAganAubGl1IDxqcF9saXVAYXN0cm9jb20uY24+CisKKwkgIGdzdC9ydHNwL3J0c3B1cmwuYzogRml4IHBhcnNpbmcgb2YgcGFzc3dvcmQgZmllbGQgaW4gdXJsLiBGaXhlcyAjNDA3Nzk3LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieToganAubGl1IDxqcF9saXUgYXQgYXN0cm9jb20gZG90IGNuPgorCSAgKiBnc3QvcnRzcC9ydHNwdXJsLmM6IChydHNwX3VybF9wYXJzZSk6CisJICBGaXggcGFyc2luZyBvZiBwYXNzd29yZCBmaWVsZCBpbiB1cmwuIEZpeGVzICM0MDc3OTcuCisKKzIwMDctMDItMTQgMDk6NTU6NDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS4qOiBVcGRhdGUgZG9jcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9jbGFzc19pbml0KSwKKwkgIChnc3Rfd2F2cGFyc2VfcmVzZXQpLCAoZ3N0X3dhdnBhcnNlX2luaXQpLAorCSAgKGdzdF93YXZwYXJzZV9kZXN0cm95X3NvdXJjZXBhZCksIChnc3Rfd2F2cGFyc2VfZm10KSwKKwkgIChnc3Rfd2F2cGFyc2VfcGFyc2VfZmlsZV9oZWFkZXIpLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9pbml0KSwKKwkgIChnc3Rfd2F2cGFyc2VfcGVyZm9ybV9zZWVrKSwgKGdzdF93YXZwYXJzZV9wZWVrX2NodW5rX2luZm8pLAorCSAgKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksIChnc3Rfd2F2cGFyc2VfcGFyc2Vfc3RyZWFtX2luaXQpLAorCSAgKGdzdF93YXZwYXJzZV9hZGRfc3JjX3BhZCksIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpLAorCSAgKGdzdF93YXZwYXJzZV9sb29wKSwgKGdzdF93YXZwYXJzZV9jaGFpbiksCisJICAoZ3N0X3dhdnBhcnNlX3BhZF9jb252ZXJ0KSwgKGdzdF93YXZwYXJzZV9wYWRfcXVlcnkpLAorCSAgKGdzdF93YXZwYXJzZV9zcmNwYWRfZXZlbnQpLCAoZ3N0X3dhdnBhcnNlX2NoYW5nZV9zdGF0ZSksCisJICAocGx1Z2luX2luaXQpOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuaDoKKwkgIFVwZGF0ZSBkb2NzLgorCSAgVXNlIGJvaWxlcnBsYXRlLgorCSAgVmFyaW91cyBjb2RlIGNsZWFudXBzLgorCSAgV2hlbiB0aGUgYml0cmF0ZSBpcyBub3Qga25vd24gKGJwcyA9PSAwIG9yIGNvbXByZXNzZWQgZm9ybWF0cykgbGV0CisJICBkb3duc3RyZWFtIGVsZW1lbnQgZ3Vlc3RpbWF0ZSB0aGUgZHVyYXRpb24gYW5kIHBvc2l0aW9uIGFuZCBkb24ndAorCSAgZ2VuZXJhdGUgdGltZXN0YW1wcyBvciBkdXJhdGlvbnMuIEZpeGVzICM0MDUyMTMuCisJICBGaXggRU9TIGFuZCBFUlJPUiBjb25kaXRpb25zIGluIGNoYWluIG1vZGUsIHdlIGp1c3QgbmVlZCB0byBmb3J3YXJkIHRoZQorCSAgZXJyb3IgZmxvd3JldHVybiB1cHN0cmVhbS4KKworMjAwNy0wMi0xMyAxNjowMToyOSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIFJlLWZhY3RvciB0aGUgZ2NvbmZhdWRpb3NpbmsgaW50byBhICJHc3RTd2l0Y2hTaW5rIiBiYXNlIGNsYXNzIGFuZCBhIGNoaWxkIHRoYXQgaW1wbGVtZW50cyB0aGUgR0NvbmYga2V5IG1vbml0b3JpbmcuIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nY29uZi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2djb25mL2djb25mLmM6IChnc3RfZ2NvbmZfZ2V0X3N0cmluZyksCisJICAoZ3N0X2djb25mX2dldF9rZXlfZm9yX3NpbmtfcHJvZmlsZSksIChnc3RfZ2NvbmZfc2V0X3N0cmluZyksCisJICAoZ3N0X2djb25mX3JlbmRlcl9iaW5fd2l0aF9kZWZhdWx0KToKKwkgICogZXh0L2djb25mL2djb25mLmg6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOiAoZ3N0X2djb25mX2F1ZGlvX3NpbmtfYmFzZV9pbml0KSwKKwkgIChnc3RfZ2NvbmZfYXVkaW9fc2lua19yZXNldCksIChnc3RfZ2NvbmZfYXVkaW9fc2lua19pbml0KSwKKwkgIChnc3RfZ2NvbmZfYXVkaW9fc2lua19kaXNwb3NlKSwgKGRvX2NoYW5nZV9jaGlsZCksCisJICAoZ3N0X2djb25mX3N3aXRjaF9wcm9maWxlKSwgKGdzdF9nY29uZl9hdWRpb19zaW5rX3NldF9wcm9wZXJ0eSksCisJICAoY2JfY2hhbmdlX2NoaWxkKSwgKGdzdF9nY29uZl9hdWRpb19zaW5rX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5oOgorCSAgKiBleHQvZ2NvbmYvZ3N0c3dpdGNoc2luay5jOiAoZ3N0X3N3aXRjaF9zaW5rX2Jhc2VfaW5pdCksCisJICAoZ3N0X3N3aXRjaF9zaW5rX2NsYXNzX2luaXQpLCAoZ3N0X3N3aXRjaF9zaW5rX3Jlc2V0KSwKKwkgIChnc3Rfc3dpdGNoX3NpbmtfaW5pdCksIChnc3Rfc3dpdGNoX3NpbmtfZGlzcG9zZSksCisJICAoZ3N0X3N3aXRjaF9jb21taXRfbmV3X2tpZCksIChnc3Rfc3dpdGNoX3Npbmtfc2V0X2NoaWxkKSwKKwkgIChnc3Rfc3dpdGNoX3Npbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF9zd2l0Y2hfc2lua19oYW5kbGVfZXZlbnQpLAorCSAgKGdzdF9zd2l0Y2hfc2lua19nZXRfcHJvcGVydHkpLCAoZ3N0X3N3aXRjaF9zaW5rX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9nY29uZi9nc3Rzd2l0Y2hzaW5rLmg6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkgIChnc3RfYXV0b19hdWRpb19zaW5rX2NsYXNzX2luaXQpLCAoZ3N0X2F1dG9fYXVkaW9fc2lua19kaXNwb3NlKSwKKwkgIChnc3RfYXV0b19hdWRpb19zaW5rX2NsZWFyX2tpZCksIChnc3RfYXV0b19hdWRpb19zaW5rX3Jlc2V0KSwKKwkgIChnc3RfYXV0b19hdWRpb19zaW5rX2RldGVjdCk6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkgIChnc3RfYXV0b192aWRlb19zaW5rX2NsYXNzX2luaXQpLCAoZ3N0X2F1dG9fdmlkZW9fc2lua19kaXNwb3NlKSwKKwkgIChnc3RfYXV0b192aWRlb19zaW5rX2NsZWFyX2tpZCksIChnc3RfYXV0b192aWRlb19zaW5rX3Jlc2V0KSwKKwkgIChnc3RfYXV0b192aWRlb19zaW5rX2RldGVjdCk6CisJICBSZS1mYWN0b3IgdGhlIGdjb25mYXVkaW9zaW5rIGludG8gYSAiR3N0U3dpdGNoU2luayIgYmFzZSBjbGFzcworCSAgYW5kIGEgY2hpbGQgdGhhdCBpbXBsZW1lbnRzIHRoZSBHQ29uZiBrZXkgbW9uaXRvcmluZy4gVGhlIGVuZCBnb2FsIG9mCisJICB0aGlzIGlzIGFuIGF1ZGlvIHNpbmsgdGhhdCBjYW4gYmUgY2hhbmdlZCBvbiB0aGUgZmx5LCBidXQgYXQgdGhlCisJICBtb21lbnQgaXQgc3RpbGwgb25seSBjaGFuZ2VzIG9uIHRoZSBuZXh0IFJFQURZIHRyYW5zaXRpb24uCisKKzIwMDctMDItMTMgMTE6NTc6MTggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBQdXQgZGVidWcgc3R1ZmYgaW50byAjaWZuZGVmIEdTVF9ESVNBQkxFX0RFQlVHICNlbmRpZgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9pbmRleCksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9zeW5jKSwgKGdzdF9hdmlfZGVtdXhfbWFzc2FnZV9pbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9jYWxjdWxhdGVfZHVyYXRpb25zX2Zyb21faW5kZXgpLAorCSAgKGdzdF9hdmlfZGVtdXhfcHVzaF9ldmVudCksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXJfcHVsbCksCisJICAoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSksCisJICAoZ3N0X2F2aV9kZW11eF9sb29wKToKKwkgIFB1dCBkZWJ1ZyBzdHVmZiBpbnRvICNpZm5kZWYgR1NUX0RJU0FCTEVfREVCVUcgI2VuZGlmCisKKzIwMDctMDItMTMgMDk6NDY6MjYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgQWRkIGNyb3NzcmVmZXJlbmNlcyB0byBnbGliL2dvYmplY3QvZ3N0cmVhbSBkb2NzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgQWRkIGNyb3NzcmVmZXJlbmNlcyB0byBnbGliL2dvYmplY3QvZ3N0cmVhbSBkb2NzLgorCisyMDA3LTAyLTEyIDIzOjM1OjE2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbW9ub3Njb3BlLzogRml4IGNvcHknbidwYXN0ZS1vIGluIGRvY3MgY2h1bmsuIEFsc28gYWRkIHNvbWUgbWlzc2luZyBDRkxBR1MgKGJ1dCBubyBMSUJTLCBzaW5jZSB3ZSBvbmx5IHVzZSBkZWZpbmUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbW9ub3Njb3BlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSAgRml4IGNvcHknbidwYXN0ZS1vIGluIGRvY3MgY2h1bmsuIEFsc28gYWRkIHNvbWUgbWlzc2luZyBDRkxBR1MKKwkgIChidXQgbm8gTElCUywgc2luY2Ugd2Ugb25seSB1c2UgZGVmaW5lcyBmcm9tIHRoZSBoZWFkZXJzKS4KKworMjAwNy0wMi0xMiAyMzoyNzozMSArMDAwMCAgSm9uYXRoYW4gTWF0dGhldyA8am9uYXRoYW5Aa2FvbGluLndoOS5uZXQ+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBGaXggbWFzc2l2ZSBtZW1vcnkgbGVhayB3aGVuIG9wZXJhdGluZyBpbiBzdHJlYW1pbmcgbW9kZSBkdWUgdG8KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IEpvbmF0aGFuIE1hdHRoZXcgIDxqb25hdGhhbiBhdCBrYW9saW4gd2g5IG5ldD4KKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcGFyc2Vfc3RyZWFtX2luaXQpLAorCSAgKGdzdF93YXZwYXJzZV9zdHJlYW1fZGF0YSk6CisJICBGaXggbWFzc2l2ZSBtZW1vcnkgbGVhayB3aGVuIG9wZXJhdGluZyBpbiBzdHJlYW1pbmcgbW9kZSBkdWUgdG8KKwkgIEdTVF9CVUZGRVJfTUFMTE9DREFUQSgpIG5vdCBiZWluZyBzZXQgb24gbmV3bHktY3JlYXRlZCBidWZmZXJzLgorCSAgRml4ZXMgIzQwNzA1Ny4KKworMjAwNy0wMi0xMiAxNToyOTo0NCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4Lio6IFNhdmUgc29tZSBtZW1vcnkgKDglKSBieSByZXBhY2tpbmcgdGhlIGluZGV4IGVudHJ5IHN0cnVjdHVyZSAobW9yZSB0byBjb21lKS4gQWRkIG1vcmUgRklYTUVzIHQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2NsYXNzX2luaXQpLAorCSAgKGdzdF9hdmlfZGVtdXhfcmVzZXQpLCAoZ3N0X2F2aV9kZW11eF9pbmRleF9lbnRyeV9mb3JfdGltZSksCisJICAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3VwZXJpbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdWJpbmRleCksIChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9pbmRleCksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9zeW5jKSwgKGdzdF9hdmlfZGVtdXhfbmV4dF9kYXRhX2J1ZmZlciksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fc2NhbiksIChnc3RfYXZpX2RlbXV4X21hc3NhZ2VfaW5kZXgpLAorCSAgKGdzdF9hdmlfZGVtdXhfY2FsY3VsYXRlX2R1cmF0aW9uc19mcm9tX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3B1c2hfZXZlbnQpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyX3B1bGwpLAorCSAgKGdzdF9hdmlfZGVtdXhfZG9fc2VlayksIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSksIChnc3RfYXZpX2RlbXV4X2xvb3ApOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBTYXZlIHNvbWUgbWVtb3J5ICg4JSkgYnkgcmVwYWNraW5nIHRoZSBpbmRleCBlbnRyeSBzdHJ1Y3R1cmUgKG1vcmUgdG8KKwkgIGNvbWUpLiBBZGQgbW9yZSBGSVhNRXMgdG8gcXVlc3Rpb25hYmxlIHBhcnRzLgorCisyMDA3LTAyLTEyIDEyOjU3OjIyICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHN5cy92NGwyLzogTW9yZSBGSVhNRSBjb21tZW50cyBhbmQgbWVzc2FnaW5nIGNoYW5nZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfdjRsMmZvdXJjY190b19jYXBzKSwKKwkgIChnc3RfdjRsMnNyY19nZXRfY2Fwcyk6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX2ZpbGxfZm9ybWF0X2xpc3QpLAorCSAgKGdzdF92NGwyc3JjX2dyYWJfZnJhbWUpLCAoZ3N0X3Y0bDJzcmNfc2V0X2NhcHR1cmUpLAorCSAgKGdzdF92NGwyc3JjX2NhcHR1cmVfaW5pdCk6CisJICBNb3JlIEZJWE1FIGNvbW1lbnRzIGFuZCBtZXNzYWdpbmcgY2hhbmdlcy4KKworMjAwNy0wMi0xMiAxMjo0MzowMCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvZ29vbS9nc3Rnb29tLio6IEltcHJvdmVkIGRvY3MgYW5kIHVzZSBHU1RfREVCVUdfRlVOQ1BUUi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnc3RfZ29vbV9jbGFzc19pbml0KSwgKGdzdF9nb29tX2luaXQpLAorCSAgKGdzdF9nb29tX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9nb29tL2dzdGdvb20uaDoKKwkgIEltcHJvdmVkIGRvY3MgYW5kIHVzZSBHU1RfREVCVUdfRlVOQ1BUUi4KKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6IChnc3RfbGV2ZWxfY2xhc3NfaW5pdCk6CisJICBVc2UgR1NUX0RFQlVHX0ZVTkNQVFIuCisJICAqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6IChnc3RfbW9ub3Njb3BlX2luaXQpLAorCSAgKGdzdF9tb25vc2NvcGVfY2hhaW4pLCAoZ3N0X21vbm9zY29wZV9jaGFuZ2Vfc3RhdGUpOgorCSAgSW1wcm92ZWQgZG9jcyBzb3VyY2UgY2xlYW51cHMuCisKKzIwMDctMDItMTIgMTA6Mjk6NTcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9kZWJ1Zy86IEFkZCBjb2RlIGZvciBhIHB1c2hmaWxlc3JjIGVsZW1lbnQgdGhhdCBpbXBsZW1lbnRzIGEgcHVzaGZpbGU6Ly8gVVJJIGhhbmRsZXIsIHRvIG1ha2UgZGVidWdnaW5nIHB1c2gtbW9kZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWJ1Zy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RlYnVnL2dzdGRlYnVnLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9kZWJ1Zy9nc3RwdXNoZmlsZXNyYy5jOgorCSAgKiBnc3QvZGVidWcvZ3N0cHVzaGZpbGVzcmMuaDoKKwkgIEFkZCBjb2RlIGZvciBhIHB1c2hmaWxlc3JjIGVsZW1lbnQgdGhhdCBpbXBsZW1lbnRzIGEgcHVzaGZpbGU6Ly8gVVJJCisJICBoYW5kbGVyLCB0byBtYWtlIGRlYnVnZ2luZyBwdXNoLW1vZGUgb3BlcmF0aW9uIG9mIGRlbXV4ZXIvZGVjb2RlcnMKKwkgIHRoYXQgc3VwcG9ydCBib3RoIGVhc2llciBpbiBjb25uZWN0aW9uIHdpdGggc2Vlay9wbGF5YmluL2V0Yy4KKwkgIFRoZSBlbGVtZW50IGlzbid0IHJlZ2lzdGVyZWQgYXQgdGhlIG1vbWVudC4KKworMjAwNy0wMi0xMSAxNToyNjo0OSArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICBNYWtlZmlsZS5hbTogQWRkIHdpbjMyIE1BTklGRVNUCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogTWFrZWZpbGUuYW06CisJICBBZGQgd2luMzIgTUFOSUZFU1QKKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuaDoKKwkgIENsZWFyIHVudXNlZCBjb2RlIGFuZCBhZGQgY29tbWVudHMuCisJICBSZW1vdmUgeXV2IGZyb20gdGVtcGxhdGUgY2FwcywgaXQgb25seSBzdXBwb3J0cyBSR0IKKwkgIGFjdHVhbGx5LgorCSAgSW1wbGVtZW50IFhPdmVybGF5IGludGVyZmFjZSBhbmQgcmVtb3ZlIHdpbmRvdyBhbmQgZnVsbHNjcmVlbgorCSAgcHJvcGVydGllcy4KKwkgIEFkZCBkZWJ1ZyBsb2dzLgorCSAgVGVzdCBmb3IgYmxpdCBjYXBhYmlsaXRpZXMgdG8gcmV0dXJuIG9ubHkgdGhlIGN1cnJlbnQgY29sb3JzcGFjZSBpZgorCSAgdGhlIGhhcmR3YXJlIGNhbid0IGJsaXQgZm9yIG9uZSBjb2xvcnNwYWNlIHRvIGFub3RoZXIuCisJICAqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIEFkZCBzb21lIGRlYnVncy4KKwkgICogd2luMzIvTUFOSUZFU1Q6CisJICBBZGQgVlM3IHByb2plY3QgZmlsZXMgYW5kIHNvbHV0aW9uLgorCSAgKiB3aW4zMi92czYvZ3N0X3BsdWdpbnNfYmFkLmRzdzoKKwkgICogd2luMzIvdnM2L2xpYmdzdGRpcmVjdGRyYXcuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0ZGlyZWN0c291bmQuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0cXRkZW11eC5kc3A6CisJICBVcGRhdGUgcHJvamVjdCBmaWxlcy4KKworMjAwNy0wMi0xMSAxMjo1Nzo0NyArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aW11eC5jOiBDb21tZW50IGEgI2lmIDAgaW4gY2FwcyB0ZW1wbGF0ZSBkZWZpbml0aW9uIGFzIFZTNiBzZWVtcyB0byBkbyBub3Qgc3VwcG9ydCBpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgQ29tbWVudCBhICNpZiAwIGluIGNhcHMgdGVtcGxhdGUgZGVmaW5pdGlvbiBhcyBWUzYgc2VlbXMgdG8KKwkgIGRvIG5vdCBzdXBwb3J0IGl0LgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6KGdzdF9ydHNwc3JjX2xvb3BfdWRwKToKKwkgIFVzZSBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIGZvciBjb252ZXJzaW9uLgorCSAgKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOihydHNwX2Nvbm5lY3Rpb25fc2VuZCk6CisJICBNb3ZlIHZhcmlhYmxlcyBkZWNsYXJhdGlvbiBiZWZvcmUgdGhlIGZpcnN0IGluc3RydWN0aW9uLgorCSAgKiBnc3QvcnRzcC9ydHNwZGVmcy5jOihydHNwX3N0cnJlc3VsdCk6CisJICBEb24ndCB1c2UgaHN0cmVycm9yIGZvciBlcnJvciBsb2cgb24gR19PU19XSU4zMiBidWlsZCBhcyBpdCdzIG5vdCBzdXBwb3J0ZWQuCisJICBBbmQgZG9uJ3QgaW5jbHVkZSBuZXRkYi5oIGZvciBHX09TX1dJTjMyCisJICAqIGdzdC9ydHNwL3NkcG1lc3NhZ2UuYzooc2RwX3BhcnNlX2xpbmUpOgorCSAgVGhpcyBpbml0aWFsaXphdGlvbiBTRFBNZWRpYSBubWVkaWEgPSB7Lm1lZGlhID0gTlVMTCB9OyBpcyBub3Qgc3VwcG9ydGVkCisJICBieSBWUzYgdGhlbiB1c2UgYW4gb3RoZXIgd2F5IHRvIGluaXRpYWxpemUgU0RQTWVkaWEgc3RydWN0dXJlLgorCSAgKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuaDoKKwkgICogZ3N0L3VkcC9nc3RkeW51ZHBuZXR1dGlscy5oOgorCSAgRG8gbm90IGluY2x1ZGUgPHN5cy90aW1lLmg+IGZvciBHX09TX1dJTjMyCisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICBEZWZpbmUgc29ja2xlbl90IGFzIGludCBmb3IgR19PU19XSU4zMgorCSAgKiB3aW4vY29tbW9uL2NvbmZpZy5oLmluOgorCSAgVW5kZWYgSEFWRV9ORVRJTkVUX0lOX0gKKwkgICogd2luMzIvdnM2L2dzdF9wbHVnaW5zX2dvb2QuZHN3OgorCSAgKiB3aW4zMi92czYvbGliZ3N0cnRwLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHJ0c3AuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0YXV0b2dlbi5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RhdWRpb2Z4LmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHVkcC5kc3A6CisJICBBZGQgYW5kIHVwZGF0ZSBwcm9qZWN0IGZpbGVzLgorCSAgKiB3aW4zMi9jb21tb24vZ3N0dWRwLWVudW10eXBlcy5jOgorCSAgKiB3aW4zMi9jb21tb24vZ3N0dWRwLWVudW10eXBlcy5oOgorCSAgQWRkIGEgY29weSBvZiB1ZHAgZW51bXR5cGVzIHRvIHdpbjMyL2NvbW1vbiBhcyBpbiBjb3JlCisJICBhbmQgYmFzZS4KKworMjAwNy0wMi0xMSAxMDo1MzoyMSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBjb25maWd1cmUuYWM6IEFjdGl2YXRlIG1vbm9zY29wZSB3aGVuIGJ1aWxkaW5nIHdpdGggLS1lbmFibGUtZXhwZXJpbWVudGFsLiBGaXgKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBBY3RpdmF0ZSBtb25vc2NvcGUgd2hlbiBidWlsZGluZyB3aXRoIC0tZW5hYmxlLWV4cGVyaW1lbnRhbC4gRml4CisJICAtLWVuYWJsZS1leHRlcm5hbCBjb25maWd1cmUgc3dpdGNoIGRlc2NyaXB0aW9uLgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlci5jOiAoZ3N0X3N1bmF1ZGlvbWl4ZXJfYmFzZV9pbml0KToKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc3JjLmM6IChnc3Rfc3VuYXVkaW9zcmNfZGlzcG9zZSk6CisJICBIZWxwIGdzdC1pbmRlbnQuCisKKzIwMDctMDItMDkgMDk6MjQ6NTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IEV4cGxpY2l0bHkgY2FzdCByZXN1bHQgb2YgcG9pbnRlciBhcml0aG1ldGljIHRvIGludGVnZXIgaW4gb3JkZXIgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3Mgb24gcy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpX211eF9yaWZmX2dldF9hdmlfaGVhZGVyKToKKwkgIEV4cGxpY2l0bHkgY2FzdCByZXN1bHQgb2YgcG9pbnRlciBhcml0aG1ldGljIHRvIGludGVnZXIgaW4gb3JkZXIgdG8KKwkgIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzIG9uIHNvbWUgNjQtYml0IHN5c3RlbXMuIFNob3VsZCBmaXggIzQwNjAxOC4KKworMjAwNy0wMi0wOCAxMTowOToxNSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2RlYnVnL3Byb2dyZXNzcmVwb3J0LmM6IFNvbWUgbW9yZSBkb2NzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWJ1Zy9wcm9ncmVzc3JlcG9ydC5jOgorCSAgU29tZSBtb3JlIGRvY3MuCisKKzIwMDctMDItMDcgMjE6MDk6NDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOiBVcGRhdGUgZm9yIG5ldyBlbGVtZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkgIFVwZGF0ZSBmb3IgbmV3IGVsZW1lbnRzLgorCSAgKiBnc3QvZGVidWcvcHJvZ3Jlc3NyZXBvcnQuaDoKKwkgIENvbW1pdCBuZXdseS1jcmVhdGVkIGhlYWRlciBmaWxlIGFzIHdlbGwuCisKKzIwMDctMDItMDcgMjA6Mzk6MTYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIE1ha2UgcHJvZ3Jlc3NyZXBvcnQgZWxlbWVudCBwb3N0IG1lc3NhZ2VzIHdpdGggdGhlIGN1cnJlbnQgcHJvZ3Jlc3Mgb24gdGhlIGJ1cy4gQWxzbyBhZGQgc29tZSBiYXNpYyBkb2NzIGZvciBpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGdzdC9kZWJ1Zy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RlYnVnL3Byb2dyZXNzcmVwb3J0LmM6IChnc3RfcHJvZ3Jlc3NfcmVwb3J0X3Bvc3RfcHJvZ3Jlc3MpLAorCSAgKGdzdF9wcm9ncmVzc19yZXBvcnRfZG9fcXVlcnkpLCAoZ3N0X3Byb2dyZXNzX3JlcG9ydF9yZXBvcnQpOgorCSAgTWFrZSBwcm9ncmVzc3JlcG9ydCBlbGVtZW50IHBvc3QgbWVzc2FnZXMgd2l0aCB0aGUgY3VycmVudCBwcm9ncmVzcworCSAgb24gdGhlIGJ1cy4gQWxzbyBhZGQgc29tZSBiYXNpYyBkb2NzIGZvciBpdC4KKworMjAwNy0wMi0wNyAxMzowODozNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2hhbC9oYWwuKjogU29tZSBzbWFsbCBjbGVhbnVwczsgZGVhbCB3aXRoIGVycm9ycyB3aGVuIHBhcnNpbmcgdGhlIEhBTCBBTFNBIGNhcGFiaWxpdGllcyBhIGJpdCBiZXR0ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2hhbC9oYWwuYzogKGdzdF9oYWxfZ2V0X3N0cmluZyk6CisJICAqIGV4dC9oYWwvaGFsLmg6CisJICBTb21lIHNtYWxsIGNsZWFudXBzOyBkZWFsIHdpdGggZXJyb3JzIHdoZW4gcGFyc2luZyB0aGUgSEFMIEFMU0EKKwkgIGNhcGFiaWxpdGllcyBhIGJpdCBiZXR0ZXIuCisKKzIwMDctMDItMDYgMTY6Mjk6MzAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOiBMZXQncyB0cnkgdGhpcyBhZ2FpbiBhbmQgdXNlIHRoZSByaWdodCBjYXN0IHRoaXMgdGltZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzogKGdzdF9zbXB0ZV90cmFuc2l0aW9uX3R5cGVfZ2V0X3R5cGUpOgorCSAgTGV0J3MgdHJ5IHRoaXMgYWdhaW4gYW5kIHVzZSB0aGUgcmlnaHQgY2FzdCB0aGlzIHRpbWUuCisKKzIwMDctMDItMDYgMTY6MjQ6NTcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOiBBZGQgY2FzdCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncyB3aXRoIG9sZGVyIEdMaWIgdmVyc2lvbnMgd2hlcmUgdGhlIG5pY2svbmFtZSBtZW1iZXJzIGluIEdFbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOiAoZ3N0X3NtcHRlX3RyYW5zaXRpb25fdHlwZV9nZXRfdHlwZSk6CisJICBBZGQgY2FzdCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncyB3aXRoIG9sZGVyIEdMaWIgdmVyc2lvbnMKKwkgIHdoZXJlIHRoZSBuaWNrL25hbWUgbWVtYmVycyBpbiBHRW51bVZhbHVlIGFyZSBub3QgZGVjbGFyZWQgYXMKKwkgIGNvbnN0YW50IHN0cmluZ3MuCisKKzIwMDctMDItMDYgMTU6NTY6MTQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9nY29uZi86IEluIGdjb25mYXVkaW9zaW5rLCBnZXQgdGhlIHJpZ2h0IGtleSBhcyB0aGUgb2xkIGtleSBpbiBkb190b2dnbGUgKGllLiBvbmUgZGVwZW5kZW50IG9uIHRoZSBwcm9maWxlIHNlbGVjdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nY29uZi9nY29uZi5jOiAoZ3N0X2djb25mX2dldF9rZXlfZm9yX3NpbmtfcHJvZmlsZSksCisJICAoZ3N0X2djb25mX3JlbmRlcl9iaW5fZnJvbV9rZXkpLAorCSAgKGdzdF9nY29uZl9nZXRfZGVmYXVsdF9hdWRpb19zaW5rKToKKwkgICogZXh0L2djb25mL2djb25mLmg6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOiAoZ2V0X2djb25mX2tleV9mb3JfcHJvZmlsZSksCisJICAoZG9fdG9nZ2xlX2VsZW1lbnQpLCAoZ3N0X2djb25mX2F1ZGlvX3Npbmtfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfZ2NvbmZfYXVkaW9fc2lua19nZXRfcHJvcGVydHkpOgorCSAgSW4gZ2NvbmZhdWRpb3NpbmssIGdldCB0aGUgcmlnaHQga2V5IGFzIHRoZSBvbGQga2V5IGluIGRvX3RvZ2dsZQorCSAgKGllLiBvbmUgZGVwZW5kZW50IG9uIHRoZSBwcm9maWxlIHNlbGVjdGVkKS4gTG9nIHNvbWUgbW9yZSBzdHVmZiBzbworCSAgd2UgY2FuIHNlZSB3aGF0J3MgYWN0dWFsbHkgZ29pbmcgb24uCisKKzIwMDctMDItMDYgMTE6MTY6NDkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2F1ZGlvZngvOiBTb21lIHNtYWxsIGNsZWFudXBzIGFuZCBwb3J0IGJvdGggZWxlbWVudHMgdG8gdGhlIG5ldyBHc3RBdWRpb0ZpbHRlciBiYXNlIGNsYXNzIHRvIHNhdmUgYSBmZXcgbGluZXMgb2YgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5LmM6IChnc3RfYXVkaW9fYW1wbGlmeV9iYXNlX2luaXQpLAorCSAgKGdzdF9hdWRpb19hbXBsaWZ5X2NsYXNzX2luaXQpLCAoZ3N0X2F1ZGlvX2FtcGxpZnlfaW5pdCksCisJICAoZ3N0X2F1ZGlvX2FtcGxpZnlfc2V0X3Byb2Nlc3NfZnVuY3Rpb24pLAorCSAgKGdzdF9hdWRpb19hbXBsaWZ5X3NldHVwKToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5Lmg6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0LmM6IChnc3RfYXVkaW9faW52ZXJ0X2Jhc2VfaW5pdCksCisJICAoZ3N0X2F1ZGlvX2ludmVydF9jbGFzc19pbml0KSwgKGdzdF9hdWRpb19pbnZlcnRfc2V0dXApOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2ludmVydC5oOgorCSAgU29tZSBzbWFsbCBjbGVhbnVwcyBhbmQgcG9ydCBib3RoIGVsZW1lbnRzIHRvIHRoZSBuZXcgR3N0QXVkaW9GaWx0ZXIKKwkgIGJhc2UgY2xhc3MgdG8gc2F2ZSBhIGZldyBsaW5lcyBvZiBjb21tb24gY29kZS4KKwkgICogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJICBMaW5rIGFnYWluc3QgbGliZ3N0YXVkaW8gZm9yIHRoZSBhYm92ZSBjaGFuZ2VzCisKKzIwMDctMDItMDMgMjM6MzU6MjYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIEZpeCB1cCB0byB1c2UgdGhlIG5ld2x5IHBvcnRlZCAoYWN0dWFsbHkgd29ya2luZykgR3N0QXVkaW9GaWx0ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvZXF1YWxpemVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOiAoZ3N0X2lpcl9lcXVhbGl6ZXJfYmFzZV9pbml0KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9jbGFzc19pbml0KSwgKGdzdF9paXJfZXF1YWxpemVyX2luaXQpLAorCSAgKHNldHVwX2ZpbHRlciksIChnc3RfaWlyX2VxdWFsaXplcl9jb21wdXRlX2ZyZXF1ZW5jaWVzKSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9zZXRfcHJvcGVydHkpLCAoZ3N0X2lpcl9lcXVhbGl6ZXJfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl90cmFuc2Zvcm1faXApLCAoZ3N0X2lpcl9lcXVhbGl6ZXJfc2V0dXApLAorCSAgKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuaDoKKwkgIEZpeCB1cCB0byB1c2UgdGhlIG5ld2x5IHBvcnRlZCAoYWN0dWFsbHkgd29ya2luZykgR3N0QXVkaW9GaWx0ZXIuCisJICBCdW1wIGNvcmUvYmFzZSByZXF1aXJlbWVudHMgdG8gQ1ZTIGZvciB0aGlzLgorCSAgKiB0ZXN0cy9pY2xlcy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvaWNsZXMvZXF1YWxpemVyLXRlc3QuYzogKGNoZWNrX2J1cyksCisJICAoZXF1YWxpemVyX3NldF9iYW5kX3ZhbHVlKSwgKGVxdWFsaXplcl9zZXRfYWxsX2JhbmRfdmFsdWVzKSwKKwkgIChlcXVhbGl6ZXJfc2V0X2JhbmRfdmFsdWVfYW5kX3dhaXQpLAorCSAgKGVxdWFsaXplcl9zZXRfYWxsX2JhbmRfdmFsdWVzX2FuZF93YWl0KSwgKGRvX3NsaWRlcl9maWRkbGluZyksCisJICAobWFpbik6CisJICBBZGQgYnJhaW4tZGVhZCBpbnRlcmFjdGl2ZSB0ZXN0IGZvciBlcXVhbGl6ZXIuCisKKzIwMDctMDItMDIgMTg6MzY6MjggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6IFJlbmFtZSAidmFsdWVzIiBwcm9wZXJ0eSB0byAiYmFuZC12YWx1ZXMiIGFuZCBjaGFuZ2UgdHlwZSBpbnRvIGEKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOiAoZ3N0X2lpcl9lcXVhbGl6ZXJfY2xhc3NfaW5pdCksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfc2V0X3Byb3BlcnR5KSwgKGdzdF9paXJfZXF1YWxpemVyX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfZmlsdGVyX2lucGxhY2UpOgorCSAgUmVuYW1lICJ2YWx1ZXMiIHByb3BlcnR5IHRvICJiYW5kLXZhbHVlcyIgYW5kIGNoYW5nZSB0eXBlIGludG8gYQorCSAgR1ZhbHVlQXJyYXksIHNvIGl0J3MgbW9yZSBlYXNpbHkgYmluZGFibGUgYW5kIHRoZSByYW5nZSBvZiB0aGUKKwkgIHZhbHVlcyBwYXNzZWQgaW4gaXMgZGVmaW5lZCBhbmQgY2hlY2tlZCBldGMuOyBhbHNvIGRvIHNvbWUKKwkgIGxvY2tpbmcuCisKKzIwMDctMDItMDIgMTc6Mzk6MjEgKzAwMDAgIEphbWVzIERvYyBMaXZpbmdzdG9uIDxkb2NsaXZpbmdzdG9uQGdtYWlsLmNvbT4KKworCSAgUG9ydCBlcXVhbGl6ZXIgcGx1Z2luIHRvIDAuMTAgKCM0MDM1NzIpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSmFtZXMgIkRvYyIgTGl2aW5nc3RvbiAgPGRvY2xpdmluZ3N0b24gYXQgZ21haWwgY29tPgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9lcXVhbGl6ZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6IChnc3RfaWlyX2VxdWFsaXplcl9nZXRfdHlwZSksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfYmFzZV9pbml0KSwgKGdzdF9paXJfZXF1YWxpemVyX2NsYXNzX2luaXQpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX2NvbXB1dGVfZnJlcXVlbmNpZXMpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfZmlsdGVyX2lucGxhY2UpLCAoZ3N0X2lpcl9lcXVhbGl6ZXJfc2V0dXApLAorCSAgKHBsdWdpbl9pbml0KToKKwkgIFBvcnQgZXF1YWxpemVyIHBsdWdpbiB0byAwLjEwICgjNDAzNTcyKS4KKworMjAwNy0wMS0zMSAwODozMjo1OSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogRml4IGEgb2ZmIGJ5IG9uZSB0aGF0IGxlYWRzIHRvIHRoZSBkdXJhdGlvbiByZXBvcnRlZCBhcyBvbmUgc2FtcGxlIGxlc3MgdGhhbiBpdCBpcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiAoZ3N0X3dhdnBhY2tfcGFyc2Vfc3JjX3F1ZXJ5KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9oYW5kbGVfc2Vla19ldmVudCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfY3JlYXRlX3NyY19wYWQpOgorCSAgRml4IGEgb2ZmIGJ5IG9uZSB0aGF0IGxlYWRzIHRvIHRoZSBkdXJhdGlvbiByZXBvcnRlZCBhcyBvbmUKKwkgIHNhbXBsZSBsZXNzIHRoYW4gaXQgaXMKKworMjAwNy0wMS0zMCAxNzoxOTozMyArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBDaGVjayBmb3IgYW4gT2JqZWN0aXZlIEMgY29tcGlsZXIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBDaGVjayBmb3IgYW4gT2JqZWN0aXZlIEMgY29tcGlsZXIKKwkgICogc3lzL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3N4dmlkZW8vTWFrZWZpbGUuYW06CisJICAqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5oOgorCSAgKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cubToKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSAgKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBQb3J0IG9mIG9zeHZpZGVvIHBsdWdpbiB0byAwLjEwLiBEbyBOT1QgY29uc2lkZXIgMTAwJSBzdGFibGUgIQorCSAgRml4ZXMgIzQwMjQ3MAorCisyMDA3LTAxLTI5IDEwOjU5OjQ4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOiBTb21lIG1vcmUgaWdub3Jlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOgorCSAgU29tZSBtb3JlIGlnbm9yZXMuCisKKzIwMDctMDEtMjggMTg6Mjg6MzMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6IEZpeCBjcm9wcGluZyBmb3IgcGFja2VkIDQ6MjoyIGZvcm1hdHMgWVVZVi9ZVVkyIGFuZCBVWVZZLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJICAoZ3N0X3ZpZGVvX2Nyb3BfZ2V0X2ltYWdlX2RldGFpbHNfZnJvbV9jYXBzKSwKKwkgIChnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fcGFja2VkX2NvbXBsZXgpOgorCSAgRml4IGNyb3BwaW5nIGZvciBwYWNrZWQgNDoyOjIgZm9ybWF0cyBZVVlWL1lVWTIgYW5kIFVZVlkuCisJICAqIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6IChjaGVja19idXNfZm9yX2Vycm9ycyksCisJICAodGVzdF93aXRoX2NhcHMpLCAobWFpbik6CisJICBCbG9jayBzdHJlYW1pbmcgdGhyZWFkIGJlZm9yZSBjaGFuZ2luZyBmaWx0ZXIgY2FwcyB3aGlsZSB0aGUKKwkgIHBpcGVsaW5lIGlzIHJ1bm5pbmcgc28gdGhhdCB3ZSBkb24ndCBnZXQgcmFuZG9tIG5vdC1uZWdvdGlhdGVkCisJICBlcnJvcnMganVzdCBiZWNhdXNlIEdTdHJlYW1lciBjYW4ndCBoYW5kbGUgdGhhdCB5ZXQuCisKKzIwMDctMDEtMjcgMTY6MDg6MTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6IENhdGNoIGVycm9ycyB3aGlsZSB0aGUgdGVzdCBpcyBydW5uaW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6ICh0ZXN0X3dpdGhfY2Fwcyk6CisJICBDYXRjaCBlcnJvcnMgd2hpbGUgdGhlIHRlc3QgaXMgcnVubmluZy4KKworMjAwNy0wMS0yNiAxMjoyMTo0MSArMDAwMCAgY2hhcmxlcyA8Y2hhcmxlc2czQGdtYWlsLmNvbT4KKworCSAgZXh0L3Nob3V0Mi9nc3RzaG91dDIuKjogUHJvcGVybHkgaGFuZGxlIHRhZ3MgaW4gc2hvdXQyc2VuZC4gRml4ZXMgIzM5OTgyNS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IGNoYXJsZXMgPGNoYXJsZXNnMyBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOiAoZ3N0X3Nob3V0MnNlbmRfaW5pdCksCisJICAoc2V0X3Nob3V0X21ldGFkYXRhKSwgKGdzdF9zaG91dDJzZW5kX2V2ZW50KToKKwkgICogZXh0L3Nob3V0Mi9nc3RzaG91dDIuaDoKKwkgIFByb3Blcmx5IGhhbmRsZSB0YWdzIGluIHNob3V0MnNlbmQuIEZpeGVzICMzOTk4MjUuCisKKzIwMDctMDEtMjUgMjM6Mjc6NTkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IEZpeCB0aGUgU0VFS0lORyBxdWVyeS4gV2UgY2FuIHNlZWsgaWYgd2UgYXJlIGluIHB1bGwgbW9kZSwgbm90IHRoZSBvdGhlciB3YXkgYXJvdW5kLiBBLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IChnc3Rfd2F2cGFja19wYXJzZV9zcmNfcXVlcnkpOgorCSAgRml4IHRoZSBTRUVLSU5HIHF1ZXJ5LiBXZSBjYW4gc2VlayBpZiB3ZSBhcmUgaW4gcHVsbCBtb2RlLCBub3QgdGhlCisJICBvdGhlciB3YXkgYXJvdW5kLiBBbHNvIHNldCB0aGUgY29ycmVjdCBmb3JtYXQgaW4gdGhlIHNlZWtpbmcgcXVlcnkgYW5kCisJICBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGhlYWRlcnMgYXJlIG5vdCByZWFkIHlldCBhbmQgd2UgY2FuJ3Qgc2F5CisJICBhbnl0aGluZyBhYm91dCBvdXIgc2Vla2luZyBjYXBhYmlsaXRpZXMuCisKKzIwMDctMDEtMjUgMjE6NTU6NDkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svOiBGaXggc3BlbGxpbmcgaW4gMiBwbGFjZXM6IEl0J3MgY2FsbGVkIFdhdnBhY2ssIG5vdCBXYXZlUGFjay4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfYmFzZV9pbml0KToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IChnc3Rfd2F2cGFja19wYXJzZV9iYXNlX2luaXQpOgorCSAgRml4IHNwZWxsaW5nIGluIDIgcGxhY2VzOiBJdCdzIGNhbGxlZCBXYXZwYWNrLCBub3QgV2F2ZVBhY2suCisKKzIwMDctMDEtMjUgMTQ6NDA6MTUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogQ29udmVydCBTRFAgZmllbGRzIHRvIHVwcGVyL2xvd2VyY2FzZSBmb2xsb3dpbmcgdGhlIHJ1bGVzIGluIHRoZSBTRFAgdG8gY2FwcyBkb2N1bWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19tZWRpYV90b19jYXBzKSwKKwkgIChnc3RfcnRzcHNyY19hY3RpdmF0ZV9zdHJlYW1zKToKKwkgIENvbnZlcnQgU0RQIGZpZWxkcyB0byB1cHBlci9sb3dlcmNhc2UgZm9sbG93aW5nIHRoZSBydWxlcyBpbiB0aGUgU0RQIHRvCisJICBjYXBzIGRvY3VtZW50LgorCisyMDA3LTAxLTI1IDE0OjIyOjUzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogRml4IGNhc2Ugb2YgZW5jb2RpbmctbmFtZSBhbmQga2V5L3ZhbHVlIHBhaXJzIHRvIG1hdGNoIHRoZSBkb2N1bWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL1JFQURNRToKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkgIEZpeCBjYXNlIG9mIGVuY29kaW5nLW5hbWUgYW5kIGtleS92YWx1ZSBwYWlycyB0byBtYXRjaCB0aGUgZG9jdW1lbnQuCisJICBUaGlzIGlzIHRvIG1ha2UgaW50ZXJvcGVyYXRpb24gd2l0aCBTRFAgY2FzZS1pbnNlbnNpdGl2ZSBhcyByZXF1aXJlZCBieQorCSAgdGhlIHJlbGV2YW50IFJGQ3MuCisKKzIwMDctMDEtMjUgMTI6MDU6MTEgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC86IFVzZSBwcm9wZXIgcHJpbnQgc3RhdGVtZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIChnc3RfbXVsdGlfZmlsZV9zaW5rX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOiAoZ3N0X211bHRpX2ZpbGVfc3JjX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvbXZlL2dzdG12ZWRlbXV4LmM6IChnc3RfbXZlX3ZpZGVvX2NyZWF0ZV9idWZmZXIpLAorCSAgKGdzdF9tdmVfdmlkZW9fcGFsZXR0ZSksIChnc3RfbXZlX3ZpZGVvX2NvZGVfbWFwKSwKKwkgIChnc3RfbXZlX2F1ZGlvX2luaXQpLCAoZ3N0X212ZV9hdWRpb19kYXRhKSwgKGdzdF9tdmVfdGltZXJfY3JlYXRlKSwKKwkgIChnc3RfbXZlX2RlbXV4X2NoYWluKToKKwkgICogZ3N0L212ZS9nc3RtdmVtdXguYzogKGdzdF9tdmVfbXV4X3B1c2hfY2h1bmspOgorCSAgKiBnc3QvbXZlL212ZWF1ZGlvZW5jLmM6IChtdmVfY29tcHJlc3NfYXVkaW8pOgorCSAgKiBnc3QvbXZlL212ZXZpZGVvZGVjMTYuYzogKGlwdmlkZW9fY29weV9ibG9jayk6CisJICAqIGdzdC9tdmUvbXZldmlkZW9kZWM4LmM6IChpcHZpZGVvX2NvcHlfYmxvY2spOgorCSAgKiBnc3QvbXZlL212ZXZpZGVvZW5jMTYuYzogKG12ZV9lbmNvZGVfZnJhbWUxNik6CisJICAqIGdzdC9tdmUvbXZldmlkZW9lbmM4LmM6IChtdmVfZW5jb2RlX2ZyYW1lOCk6CisJICBVc2UgcHJvcGVyIHByaW50IHN0YXRlbWVudHMuCisJICBGaXhlcyBidWlsZCBvbiBtYWMgb3MgeC4KKwkgIDx3aW5nbz4gb28gbG9vayBhdCBtZSBteSBuYW1lIGlzIGVkd2FyZCBpJ20gaGFja2luZyBvbiBtYWNvcyB3b29vCisKKzIwMDctMDEtMjUgMTE6MDI6MDEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogQnVtcCByZXF1aXJlZCAtY29yZS8tYmFzZSB0byBDVlMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBCdW1wIHJlcXVpcmVkIC1jb3JlLy1iYXNlIHRvIENWUworCisyMDA3LTAxLTI1IDEwOjU0OjE5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cEwxNnBheS4qOiBGaWxsIHVwIHRvIE1UVSB1c2luZyBhZGFwdGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6IChnc3RfcnRwX0wxNl9wYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9MMTZfcGF5X2ZsdXNoKSwgKGdzdF9ydHBfTDE2X3BheV9oYW5kbGVfYnVmZmVyKToKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZwYXkuaDoKKwkgIEZpbGwgdXAgdG8gTVRVIHVzaW5nIGFkYXB0ZXIuCisJICBUaW1lc3RhbXAgcnRwIHBhY2tldHMuCisKKzIwMDctMDEtMjUgMTA6MzY6MzUgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIFVzZSBHX0dTSVpFX0ZPUk1BVCBpbiBwcmludCBzdGF0ZW1lbnRzIGZvciBwb3J0YWJpbGl0eS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOiAoZ3N0X211bHRpcGFydF9tdXhfY29sbGVjdGVkKToKKwkgICogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmM6ICh4aW1hZ2V1dGlsX2NoZWNrX3hzaG1fY2FsbHMpOgorCSAgVXNlIEdfR1NJWkVfRk9STUFUIGluIHByaW50IHN0YXRlbWVudHMgZm9yIHBvcnRhYmlsaXR5LgorCSAgRml4ZXMgYnVpbGQgb24gbWFjb3N4LgorCisyMDA3LTAxLTI0IDE4OjIwOjE0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogUG9ydCBhbmQgZW5hYmxlIHJhdyBhdWRpbyBwYXlsb2FkZXIvZGVwYXlsb2FkZXIuIE5lZWRzIGEgYml0IG1vcmUgd29yayBvbiB0aGUgcGF5bG9hZGVyIHNpZGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOiAoZ3N0X3J0cF9MMTZfZGVwYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX0wxNl9kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfTDE2X2RlcGF5X2luaXQpLAorCSAgKGdzdF9ydHBfTDE2X2RlcGF5X3BhcnNlX2ludCksIChnc3RfcnRwX0wxNl9kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX0wxNl9kZXBheV9wcm9jZXNzKSwgKGdzdF9ydHBfTDE2X2RlcGF5X3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9MMTZfZGVwYXlfZ2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBfTDE2X2RlcGF5X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3J0cF9MMTZfZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6IChnc3RfcnRwX0wxNl9wYXlfZ2V0X3R5cGUpLAorCSAgKGdzdF9ydHBfTDE2X3BheV9iYXNlX2luaXQpLCAoZ3N0X3J0cF9MMTZfcGF5X2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfTDE2X3BheV9pbml0KSwgKGdzdF9ydHBfTDE2X3BheV9maW5hbGl6ZSksCisJICAoZ3N0X3J0cF9MMTZfcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9MMTZfcGF5X2hhbmRsZV9idWZmZXIpLAorCSAgKGdzdF9ydHBfTDE2X3BheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5Lmg6CisJICBQb3J0IGFuZCBlbmFibGUgcmF3IGF1ZGlvIHBheWxvYWRlci9kZXBheWxvYWRlci4gTmVlZHMgYSBiaXQgbW9yZSB3b3JrCisJICBvbiB0aGUgcGF5bG9hZGVyIHNpZGUuCisKKzIwMDctMDEtMjQgMTY6MjU6NTUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuKjogT25seSB1bmJsb2NrIHRoZSB1ZHAgcGFkcyB3aGVuIHdlIGxpbmtlZCBhbmQgYWN0aXZhdGVkIHRoZW0gYWxsLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKHBhZF9ibG9ja2VkKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksCisJICAoZ3N0X3J0c3BzcmNfYWN0aXZhdGVfc3RyZWFtcyksIChnc3RfcnRzcHNyY19sb29wX3VkcCk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIE9ubHkgdW5ibG9jayB0aGUgdWRwIHBhZHMgd2hlbiB3ZSBsaW5rZWQgYW5kIGFjdGl2YXRlZCB0aGVtIGFsbC4KKwkgIEZpeGVzICMzOTU2ODguCisKKzIwMDctMDEtMjQgMTU6MTg6MzQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvOiBBZGRlZCBzaW1wbGUgQUMzIGRlcGF5bG9hZGVyIChSRkMgNDE4NCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5jOiAoZ3N0X3J0cF9hYzNfZGVwYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX2FjM19kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfYWMzX2RlcGF5X2luaXQpLAorCSAgKGdzdF9ydHBfYWMzX2RlcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9hYzNfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF9hYzNfZGVwYXlfc2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBfYWMzX2RlcGF5X2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9hYzNfZGVwYXlfY2hhbmdlX3N0YXRlKSwgKGdzdF9ydHBfYWMzX2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5oOgorCSAgQWRkZWQgc2ltcGxlIEFDMyBkZXBheWxvYWRlciAoUkZDIDQxODQpLgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOiAoZ3N0X3J0cF9tcDJ0X2RlcGF5X3NldGNhcHMpOgorCSAgRml4IGEgbGVhay4KKworMjAwNy0wMS0yNCAxMjo0MTowMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvYXVkaW9meC86IEFkZCBuZXcgZWxlbWVudCAiYXVkaW9hbXBsaWZ5Ii4gVGhpcyBhbGxvd3Mgc2NhbGluZyBvZiByYXcgYXVkaW8gc2FtcGxlcywgc2ltaWxhciB0byB0aGUgInZvbHVtZSIgZWxlbWUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmV2aWV3ZWQgYnk6IFN0ZWZhbiBLb3N0ICA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisJICAqIGdzdC9hdWRpb2Z4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzoKKwkgIChnc3RfYXVkaW9fYW1wbGlmeV9jbGlwcGluZ19tZXRob2RfZ2V0X3R5cGUpLAorCSAgKGdzdF9hdWRpb19hbXBsaWZ5X2Jhc2VfaW5pdCksIChnc3RfYXVkaW9fYW1wbGlmeV9jbGFzc19pbml0KSwKKwkgIChnc3RfYXVkaW9fYW1wbGlmeV9pbml0KSwgKGdzdF9hdWRpb19hbXBsaWZ5X3NldF9wcm9jZXNzX2Z1bmN0aW9uKSwKKwkgIChnc3RfYXVkaW9fYW1wbGlmeV9zZXRfcHJvcGVydHkpLCAoZ3N0X2F1ZGlvX2FtcGxpZnlfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfYXVkaW9fYW1wbGlmeV9zZXRfY2FwcyksCisJICAoZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2ludF9jbGlwKSwKKwkgIChnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1faW50X3dyYXBfbmVnYXRpdmUpLAorCSAgKGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9pbnRfd3JhcF9wb3NpdGl2ZSksCisJICAoZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2Zsb2F0X2NsaXApLAorCSAgKGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9mbG9hdF93cmFwX25lZ2F0aXZlKSwKKwkgIChnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fZmxvYXRfd3JhcF9wb3NpdGl2ZSksCisJICAoZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5Lmg6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZnguYzogKHBsdWdpbl9pbml0KToKKwkgIEFkZCBuZXcgZWxlbWVudCAiYXVkaW9hbXBsaWZ5Ii4gVGhpcyBhbGxvd3Mgc2NhbGluZyBvZiByYXcgYXVkaW8KKwkgIHNhbXBsZXMsIHNpbWlsYXIgdG8gdGhlICJ2b2x1bWUiIGVsZW1lbnQsIGJ1dCBwcm92aWRlcyBkaWZmZXJlbnQgbW9kZXMKKwkgIGZvciBjbGlwcGluZyBhbmQgYWxsb3dzIHVubGltaXRlZCBhbXBsaWZpY2F0aW9uLiBJdCdzIG1haW5seSB0YXJnZXRlZAorCSAgZm9yIGNyZWF0aXZlIHNvdW5kIGRlc2lnbiBhbmQgbm90IGFzIGEgcmVwbGFjZW1lbnQgb2YgdGhlICJ2b2x1bWUiCisJICBlbGVtZW50LiBGaXhlcyAjMzk3MTYyCisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkgIEFkZCBkb2NzIGZvciBhdWRpb2FtcGxpZnkgYW5kIGludGVncmF0ZSB0aGVtIGludG8gdGhlIGJ1aWxkIHN5c3RlbQorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9hbXBsaWZ5LmM6IChzZXR1cF9hbXBsaWZ5KSwKKwkgIChjbGVhbnVwX2FtcGxpZnkpLCAoR1NUX1NUQVJUX1RFU1QpLCAoYW1wbGlmeV9zdWl0ZSksIChtYWluKToKKwkgIEFkZCBmYWlybHkgZXh0ZW5zaXZlIHVuaXQgdGVzdCBzdWl0ZSBmb3IgYXVkaW9hbXBsaWZ5CisKKzIwMDctMDEtMjQgMTI6MjY6NDEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogVW5ibG9jayBwYWRzIGFmdGVyIGFkZGluZyB0aGUgcGFkcyB0byB0aGUgZWxlbWVudCBzbyB0aGF0IGF1dG9wbHVnZ2VycyBnZXQgYSBjaGFuZ2UgdG8gbGluayBzby4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKHBhZF91bmJsb2NrZWQpLCAocGFkX2Jsb2NrZWQpOgorCSAgVW5ibG9jayBwYWRzIGFmdGVyIGFkZGluZyB0aGUgcGFkcyB0byB0aGUgZWxlbWVudCBzbyB0aGF0IGF1dG9wbHVnZ2VycworCSAgZ2V0IGEgY2hhbmdlIHRvIGxpbmsgc29tZXRoaW5nLiBQb3NzaWJseSBmaXhlcyAjMzk1Njg4LgorCisyMDA3LTAxLTI0IDEyOjIyOjUxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogRml4IGNhcHMgd2l0aCBwYXlsb2FkIG51bWJlcnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOiAoZ3N0X3J0cF9tcDR2X2RlcGF5X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOiAoZ3N0X3J0cF9tcGFfZGVwYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9tcGFfZGVwYXlfaW5pdCksIChnc3RfcnRwX21wYV9kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX21wYV9kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jOiAoZ3N0X3J0cF9tcHZfZGVwYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9tcHZfZGVwYXlfaW5pdCksIChnc3RfcnRwX21wdl9kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJICBGaXggY2FwcyB3aXRoIHBheWxvYWQgbnVtYmVycy4KKwkgIEFkZCBzb21lIGZpeGVkIHBheWxvYWQgbnVtYmVycyB0byBjYXBzIHdoZW4gcG9zc2libGUuCisKKzIwMDctMDEtMjQgMTE6Mjk6MDAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L2dzdHJ0cHhxdGRlcGF5LmM6IEZpeCBjYXBzIG9uIHRoZSBkZXBheWxvYWRlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9nc3RydHB4cXRkZXBheS5jOgorCSAgRml4IGNhcHMgb24gdGhlIGRlcGF5bG9hZGVyLgorCisyMDA3LTAxLTIzIDE4OjE2OjA5ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9hdWRpb2Z4LzogQWRkIG5ldyBhdWRpb2Z4IGVsZW1lbnQgImF1ZGlvaW52ZXJ0Ii4gVGhpcyBlbGVtZW50IHN3YXBzIHRoZSB1cHBlciBhbmQgbG93ZXIgaGFsZiBvZiBzYW1wbGVzIGFuZCBjYW4gYi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZXZpZXdlZCBieTogU3RlZmFuIEtvc3QgIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKwkgICogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZnguYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuYzogKGdzdF9hdWRpb19pbnZlcnRfYmFzZV9pbml0KSwKKwkgIChnc3RfYXVkaW9faW52ZXJ0X2NsYXNzX2luaXQpLCAoZ3N0X2F1ZGlvX2ludmVydF9pbml0KSwKKwkgIChnc3RfYXVkaW9faW52ZXJ0X3NldF9wcm9wZXJ0eSksIChnc3RfYXVkaW9faW52ZXJ0X2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X2F1ZGlvX2ludmVydF9zZXRfY2FwcyksIChnc3RfYXVkaW9faW52ZXJ0X3RyYW5zZm9ybV9pbnQpLAorCSAgKGdzdF9hdWRpb19pbnZlcnRfdHJhbnNmb3JtX2Zsb2F0KSwKKwkgIChnc3RfYXVkaW9faW52ZXJ0X3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0Lmg6CisJICBBZGQgbmV3IGF1ZGlvZnggZWxlbWVudCAiYXVkaW9pbnZlcnQiLiBUaGlzIGVsZW1lbnQgc3dhcHMgdGhlIHVwcGVyCisJICBhbmQgbG93ZXIgaGFsZiBvZiBzYW1wbGVzIGFuZCBjYW4gYmUgdXNlZCBmb3IgZXhhbXBsZSBmb3IgYQorCSAgd2lkZS1zdGVyZW8gZWZmZWN0LiBGaXhlcyAjMzk2MDU3CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkgIEFkZCBkb2NzIGZvciB0aGUgYXVkaW9pbnZlcnQgZWxlbWVudCBhbmQgYWRkIHRoZW0gdG8gdGhlIGJ1aWxkIHN5c3RlbS4KKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvaW52ZXJ0LmM6IChzZXR1cF9pbnZlcnQpLAorCSAgKGNsZWFudXBfaW52ZXJ0KSwgKEdTVF9TVEFSVF9URVNUKSwgKGludmVydF9zdWl0ZSksIChtYWluKToKKwkgIEFkZCB1bml0IHRlc3Qgc3VpdGUgZm9yIHRoZSBhdWRpb2ludmVydCBlbGVtZW50LgorCisyMDA3LTAxLTIzIDE3OjM2OjMyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOiBQYXJzZSBjb25maWcgcGFyYW1zIGFzIHN0cmluZyBhbmQgaW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6IChnc3RfcnRwX21wNGdfZGVwYXlfcGFyc2VfaW50KSwKKwkgIChnc3RfcnRwX21wNGdfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX21wNGdfZGVwYXlfcHJvY2Vzcyk6CisJICBQYXJzZSBjb25maWcgcGFyYW1zIGFzIHN0cmluZyBhbmQgaW50LgorCSAgUGFyc2UgYW5kIHVzZSBBVSBoZWFkZXIgbGVuZ3RoCisKKzIwMDctMDEtMjMgMTc6Mjc6MzkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9zbXB0ZS86IGNvbnN0aWZ5IHNvbWUgc3RhdGljIHN0cnVjdHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3NtcHRlL2JhcmJveHdpcGVzLmM6IChnc3Rfd2lwZV9ib3hlc19kcmF3KSwKKwkgIChnc3Rfd2lwZV90cmlhbmdsZXNfY2xvY2tfZHJhdyksIChnc3Rfd2lwZV90cmlhbmdsZXNfZHJhdyk6CisJICAqIGdzdC9zbXB0ZS9nc3RtYXNrLmM6IChfZ3N0X21hc2tfcmVnaXN0ZXIpOgorCSAgKiBnc3Qvc21wdGUvZ3N0bWFzay5oOgorCSAgKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzogKGdzdF9zbXB0ZV91cGRhdGVfbWFzayk6CisJICAqIGdzdC9zbXB0ZS9wYWludC5jOiAoZ3N0X3NtcHRlX3BhaW50X2hib3gpLCAoZHJhd19icmVzZW5oYW1fbGluZSksCisJICAoZ3N0X3NtcHRlX3BhaW50X3RyaWFuZ2xlX2Nsb2NrKToKKwkgIGNvbnN0aWZ5IHNvbWUgc3RhdGljIHN0cnVjdHMuCisJICBEb24ndCB1cGRhdGUgdGhlIG1hc2sgaWYgbm90aGluZyBjaGFuZ2VkIHRvIHRoZSBwYXJhbXMuCisJICBNYWtlIHN1cmUgd2UgbmV2ZXIgZHJhdyBvdXRzaWRlIG9mIHRoZSBwaWN0dXJlLiBGaXhlcyAjMzk4MzI1LgorCisyMDA3LTAxLTIyIDEzOjA2OjQzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IEVycm9yIG91dCBwcm9wZXJseSB3aGVuIHB1bGxfcmFuZ2UgZmFpbHMgd2hpbGUgd2UncmUgcmVhZGluZyB0aGUgaGVhZGVycywgaW5zdGVhZCBvZiBqdXN0IHBhdXMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXJfcHVsbCk6CisJICBFcnJvciBvdXQgcHJvcGVybHkgd2hlbiBwdWxsX3JhbmdlIGZhaWxzIHdoaWxlIHdlJ3JlIHJlYWRpbmcgdGhlCisJICBoZWFkZXJzLCBpbnN0ZWFkIG9mIGp1c3QgcGF1c2luZyB0aGUgdGFzayBzaWxlbnRseS4gRml4ZXMgIzM5OTMzOC4KKworMjAwNy0wMS0xOSAxMzowNjowNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3NtcHRlL2dzdHNtcHRlLmM6IFNvbWUgbW9yZSBzYW5pdHkgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgaW5wdXQgZm9ybWF0cyBtYXRjaCBhbmQgdGhlIGlucHV0IHBhZHMgYXJlIGFjdHVhbGx5IG5lLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6IChnc3Rfc21wdGVfY29sbGVjdGVkKToKKwkgIFNvbWUgbW9yZSBzYW5pdHkgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgaW5wdXQgZm9ybWF0cyBtYXRjaCBhbmQgdGhlCisJICBpbnB1dCBwYWRzIGFyZSBhY3R1YWxseSBuZWdvdGlhdGVkLCBpbiBjYXNlIHNvbWVvbmUgdHJpZXMgdG8gZmVlZAorCSAgYnVmZmVycyBmcm9tIGZha2VzcmMgb3IgZmlsZXNyYy4gRml4ZXMgIzM5ODI5OS4KKwkgIEFsc28gY29uc3QtaWZ5IGFuIGFycmF5LCBqdXN0IGJlY2F1c2Ugd2UgY2FuLgorCisyMDA3LTAxLTE5IDEwOjM1OjEzICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3Qvc21wdGUvZ3N0c21wdGUuYzogSWdub3JlIHByZXZpb3VzIGNvbW1pdCwgdGhhdCB3YXMgb25seSB2YWxpZCBmb3Igd2lkdGhzIGFuZCBoZWlnaHRzIHRoYXQgYXJlIG11bHRpcGxlcyBvZiA0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOiAoZmlsbF9pNDIwKSwgKGdzdF9zbXB0ZV9jb2xsZWN0ZWQpOgorCSAgSWdub3JlIHByZXZpb3VzIGNvbW1pdCwgdGhhdCB3YXMgb25seSB2YWxpZCBmb3Igd2lkdGhzIGFuZCBoZWlnaHRzCisJICB0aGF0IGFyZSBtdWx0aXBsZXMgb2YgNC4KKwkgIENvcHkgb3ZlciBzaXplL3N0cmlkZSBtYWNyb3MgZnJvbSBqcGVnZGVjLiBUaGlzIGFsbG93cyB0aGUgZWxlbWVudAorCSAgdG8gd29yayB3aXRoIGFueSB3aWR0aCxoZWlnaHQuLi4KKwkgIC4uLiBidXQgcHV0cyBpbiBldmlkZW5jZSB0aGF0IHRoZSBhY3R1YWwgdHJhbnNmb3JtYXRpb25zIG9ubHkgd29yaworCSAgd2l0aCB3aWR0aC9oZWlnaHQgdGhhdCBhcmUgbXVsdGlwbGVzIG9mIDQuCisKKzIwMDctMDEtMTkgMDk6NDg6NDcgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOiBBbGxvY2F0ZSBidWZmZXJzIG9mIHRoZSByaWdodCBzaXplLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOiAoZ3N0X3NtcHRlX2NvbGxlY3RlZCk6CisJICBBbGxvY2F0ZSBidWZmZXJzIG9mIHRoZSByaWdodCBzaXplLgorCSAgVGhlIHByb3BlciBzaXplIG9mIGEgSTQyMCBidWZmZXIgaW4gYnl0ZXMgaXM6CisJICB3aWR0aCAqIGhlaWdodCAqIDMKKwkgIC0tLS0tLS0tLS0tLS0tLS0tLQorCSAgMgorCisyMDA3LTAxLTE4IDE4OjM3OjM5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3Qvc21wdGUvZ3N0c21wdGUuYzogUHJveHkgZ2V0Y2FwcyBvbiBzaW5rIHBhZHMgdG9vLCBzbyB0aGF0IHdlIGVpdGhlciBlbmQgdXAgd2l0aCB0aGUgc2FtZSBkaW1lbnNpb25zIG9uIGFsbCBwYWRzIG8uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzogKGdzdF9zbXB0ZV9pbml0KToKKwkgIFByb3h5IGdldGNhcHMgb24gc2luayBwYWRzIHRvbywgc28gdGhhdCB3ZSBlaXRoZXIgZW5kIHVwIHdpdGggdGhlCisJICBzYW1lIGRpbWVuc2lvbnMgb24gYWxsIHBhZHMgb3IgZXJyb3Igb3V0IGlmIHRoYXQncyBub3QgcG9zc2libGUKKwkgIChzZWVtcyB0byB3b3JrIGV2ZW4hKS4gRml4ZXMgIzM5ODA4NiwgSSB0aGluay4KKworMjAwNy0wMS0xOCAxMToyOToxNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogUmVtb3ZlIGxhZHNwYSBmcm9tIGRvY3M7IGFkZCBoaWVyYXJjaHkgaW5mbyBmb3IgR3N0QXVkaW9QYW5vcmFtYTsgZml4IGludGVnZXIgcHJvcGVydGllcyB3aXRoIC0xIGFzIG1pLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICBSZW1vdmUgbGFkc3BhIGZyb20gZG9jczsgYWRkIGhpZXJhcmNoeSBpbmZvIGZvciBHc3RBdWRpb1Bhbm9yYW1hOworCSAgZml4IGludGVnZXIgcHJvcGVydGllcyB3aXRoIC0xIGFzIG1pbmltdW0gdmFsdWUuCisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNkaW8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkgIFVwZGF0ZSB0byBDVlMuCisKKzIwMDctMDEtMTggMTE6MjM6MzYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOiBGaXggZG9jIHNlY3Rpb24gbmFtZSAoRml4ZXMgIzM5Nzk0NikKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hLmM6CisJICBGaXggZG9jIHNlY3Rpb24gbmFtZSAoRml4ZXMgIzM5Nzk0NikKKworMjAwNy0wMS0xOCAxMDozMzo1MCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogQ2hhbmdlTG9nOgorCSAgUmVtb3ZlIGJvZ3VzIENoYW5nZUxvZyBlbnRyeQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBSZW1vdmUgYm9ndXMgQ2hhbmdlTG9nIGVudHJ5CisKKzIwMDctMDEtMTcgMTQ6MzA6NTAgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgc3lzL3Y0bDIvOiBGaXggRUlPIGhhbmRpbmcgd2hlbiBjYXB0dXJpbmcuIEFkZCBuZXcgcHJvcGVydHkgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gZW5xdWUgKGFuZCByZW1vdmUgdGhlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgKGdzdF92NGwyX29iamVjdF9pbnN0YWxsX3Byb3BlcnRpZXNfaGVscGVyKSwKKwkgIChnc3RfdjRsMl9vYmplY3Rfc2V0X3Byb3BlcnR5X2hlbHBlciksCisJICAoZ3N0X3Y0bDJfb2JqZWN0X2dldF9wcm9wZXJ0eV9oZWxwZXIpLCAoZ3N0X3Y0bDJfc2V0X2RlZmF1bHRzKToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfdjRsMnNyY19pbml0KSwgKGdzdF92NGwyc3JjX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3Y0bDJzcmNfZ2V0X3Byb3BlcnR5KSwgKGdzdF92NGwyc3JjX3NldF9jYXBzKToKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfZmlsbF9mb3JtYXRfbGlzdCksCisJICAoZ3N0X3Y0bDJzcmNfZ3JhYl9mcmFtZSksIChnc3RfdjRsMnNyY19zZXRfY2FwdHVyZSksCisJICAoZ3N0X3Y0bDJzcmNfY2FwdHVyZV9pbml0KSwgKGdzdF92NGwyc3JjX2NhcHR1cmVfc3RhcnQpLAorCSAgKGdzdF92NGwyc3JjX2NhcHR1cmVfZGVpbml0KToKKwkgIEZpeCBFSU8gaGFuZGluZyB3aGVuIGNhcHR1cmluZy4gQWRkIG5ldyBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YKKwkgIGJ1ZmZlcnMgdG8gZW5xdWUgKGFuZCByZW1vdmUgdGhlIGJvcmtlZCBudW0tYnVmZmVycyB1c2FnZSkuCisKKzIwMDctMDEtMTYgMDg6Mjk6MTEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOiBVc2UgYSBmdW5jdGlvbiBhcnJheSBmb3IgcHJvY2VzcyBtZXRob2RzLCBhZGQgbW9yZSBkb2NzIGFuZCBkZWZpbmUgdGhlIHN0YXJ0aW5kZXggb2YgZW51bXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tbyBjaXJjdWxhci1jaGFvcyBvcmc+CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzogKGdzdF9hdWRpb19wYW5vcmFtYV9jbGFzc19pbml0KSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfc2V0X3Byb2Nlc3NfZnVuY3Rpb24pOgorCSAgVXNlIGEgZnVuY3Rpb24gYXJyYXkgZm9yIHByb2Nlc3MgbWV0aG9kcywgYWRkIG1vcmUgZG9jcyBhbmQgZGVmaW5lIHRoZQorCSAgc3RhcnRpbmRleCBvZiBlbnVtcy4KKworMjAwNy0wMS0xNCAxNzo1NTozMyArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3QHNreW5ldC5iZT4KKworCSAgQWRkIHN1cHBvcnQgZm9yIG1vcmUgdGhhbiBvbmUgYXVkaW8gc3RyZWFtOyB3cml0ZSBiZXR0ZXIgQVZJWCBoZWFkZXI7IHJlZmFjdG9yIGNvZGUgYSBiaXQ7IGRvbid0IGFubm91bmNlIHZvcmJpcyBjYXBzLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXcgYXQgc2t5bmV0IGJlPgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aV9tdXhfZmluYWxpemUpLAorCSAgKGdzdF9hdmlfbXV4X3BhZF9yZXNldCksIChnc3RfYXZpX211eF9yZXNldCksIChnc3RfYXZpX211eF9pbml0KSwKKwkgIChnc3RfYXZpX211eF92aWRzaW5rX3NldF9jYXBzKSwgKGdzdF9hdmlfbXV4X2F1ZHNpbmtfc2V0X2NhcHMpLAorCSAgKGdzdF9hdmlfbXV4X3JlcXVlc3RfbmV3X3BhZCksIChnc3RfYXZpX211eF9yZWxlYXNlX3BhZCksCisJICAoZ3N0X2F2aV9tdXhfcmlmZl9nZXRfYXZpX2hlYWRlciksCisJICAoZ3N0X2F2aV9tdXhfcmlmZl9nZXRfYXZpeF9oZWFkZXIpLCAoZ3N0X2F2aV9tdXhfcmlmZl9nZXRfaGVhZGVyKSwKKwkgIChnc3RfYXZpX211eF93cml0ZV9hdml4X2luZGV4KSwgKGdzdF9hdmlfbXV4X2FkZF9pbmRleCksCisJICAoZ3N0X2F2aV9tdXhfYmlnZmlsZSksIChnc3RfYXZpX211eF9zdGFydF9maWxlKSwKKwkgIChnc3RfYXZpX211eF9zdG9wX2ZpbGUpLCAoZ3N0X2F2aV9tdXhfaGFuZGxlX2V2ZW50KSwKKwkgIChnc3RfYXZpX211eF9kb19idWZmZXIpLCAoZ3N0X2F2aV9tdXhfZG9fb25lX2J1ZmZlciksCisJICAoZ3N0X2F2aV9tdXhfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguaDoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpbXV4LmM6ICh0ZWFyZG93bl9zcmNfcGFkKToKKwkgIEFkZCBzdXBwb3J0IGZvciBtb3JlIHRoYW4gb25lIGF1ZGlvIHN0cmVhbTsgd3JpdGUgYmV0dGVyIEFWSVgKKwkgIGhlYWRlcjsgcmVmYWN0b3IgY29kZSBhIGJpdDsgZG9uJ3QgYW5ub3VuY2Ugdm9yYmlzIGNhcHMgb24gb3VyIGF1ZGlvCisJICBzaW5rIHBhZHMgc2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBpdCBhbnl3YXkuIENsb3NlcyAjMzc5Mjk4LgorCisyMDA3LTAxLTEzIDE5OjEyOjMyICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jIChnc3RfZGVpbnRlcmxlYXZlX2FkZF9uZXdfcGFkcyk6IFVzZSBmaXhlZCBjYXBzIG9uIHNyYyBwYWRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA3LTAxLTEzICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYyAoZ3N0X2RlaW50ZXJsZWF2ZV9hZGRfbmV3X3BhZHMpOgorCSAgVXNlIGZpeGVkIGNhcHMgb24gc3JjIHBhZHMuCisJICAoZ3N0X2RlaW50ZXJsZWF2ZV9yZW1vdmVfcGFkcyk6IFJlbW92ZSBzcmMgcGFkcywgbm90IHNpbmsgcGFkcy4gSQorCSAgc2VlbSB0byBoYXZlIHJldmVyc2UgbWlkYXMgZGlzZWFzZSEKKwkgIChnc3RfZGVpbnRlcmxlYXZlX3Byb2Nlc3MpOiBQcm94eSB0aW1lc3RhbXBzLCBvZmZzZXRzLCBkdXJhdGlvbnMsCisJICBhbmQgc2V0IGNhcHMgb24gb3V0Z29pbmcgYnVmZmVycy4gRml4ZXMgIzM5NTU5NywgSSB0aGluay4KKworMjAwNy0wMS0xMyAxODowMTo0MSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmMgKGdzdF9pbnRlcmxlYXZlX2luaXQpOiBJbml0IHRoZSBhY3RpdmF0aW9uIG1vZGUgcHJvcGVybHkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDctMDEtMTMgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisJICAqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYyAoZ3N0X2ludGVybGVhdmVfaW5pdCk6IEluaXQgdGhlCisJICBhY3RpdmF0aW9uIG1vZGUgcHJvcGVybHkuCisJICAoZ3N0X2ludGVybGVhdmVfc3JjX3NldGNhcHMsIGdzdF9pbnRlcmxlYXZlX3NyY19nZXRjYXBzKQorCSAgKGdzdF9pbnRlcmxlYXZlX2luaXQpOiBTZXQgYSBzZXRjYXBzIGFuZCBnZXRjYXBzIGZ1bmN0aW9uIG9uIHRoZQorCSAgc3JjIHBhZCwgc28gdGhhdCB3ZSBjYW4gaW1wbGVtZW50IHB1bGwtbW9kZSBuZWdvdGlhdGlvbi4KKwkgIChnc3RfaW50ZXJsZWF2ZV9zaW5rX3NldGNhcHMpOiBSZW5hbWVkIGZyb20KKwkgIGdzdF9pbnRlcmxlYXZlX3NldGNhcHMsIGFzIGl0IG9ubHkgZG9lcyB0aGUgc2luayBsb2dpYyBub3cuCisJICBJbXBsZW1lbnQgYm90aCBmb3IgcHVsbC1tb2RlIGFuZCBwdXNoLW1vZGUuCisJICAoZ3N0X2ludGVybGVhdmVfcHJvY2Vzcyk6IFNldCBjYXBzIG9uIG91ciBvdXRnb2luZyBidWZmZXIuCisJICAoZ3N0X2ludGVybGVhdmVfc3JjX2FjdGl2YXRlX3B1bGwpOiBGaXggc29tZSBtb3JlIGJvZ3VzIGNhc3RzLgorCSAgV2hhdCBpcyB1cCB3aXRoIHRoaXMuCisKKzIwMDctMDEtMTMgMTU6NTI6MTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS4qOiBBZGQgJ21ldGhvZCcgcHJvcGVydHkgYW5kIHByb3ZpZGUgYSBzaW1wbGUgKG5vbi1wc3ljaG9hY3VzdGljKSBwcm9jZXNzaW5nIG1ldGhvZCAoIzM5NDg1OSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tbyBjaXJjdWxhci1jaGFvcyBvcmc+CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfbWV0aG9kX2dldF90eXBlKSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfY2xhc3NfaW5pdCksIChnc3RfYXVkaW9fcGFub3JhbWFfaW5pdCksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3NldF9wcm9jZXNzX2Z1bmN0aW9uKSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfZ2V0X3Byb3BlcnR5KSwgKGdzdF9hdWRpb19wYW5vcmFtYV9zZXRfY2FwcyksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybV9tMnNfaW50X3NpbXBsZSksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybV9zMnNfaW50X3NpbXBsZSksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybV9tMnNfZmxvYXRfc2ltcGxlKSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtX3Myc19mbG9hdF9zaW1wbGUpOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hLmg6CisJICBBZGQgJ21ldGhvZCcgcHJvcGVydHkgYW5kIHByb3ZpZGUgYSBzaW1wbGUgKG5vbi1wc3ljaG9hY3VzdGljKQorCSAgcHJvY2Vzc2luZyBtZXRob2QgKCMzOTQ4NTkpLgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3Bhbm9yYW1hLmM6IChHU1RfU1RBUlRfVEVTVCksCisJICAocGFub3JhbWFfc3VpdGUpOgorCSAgVGVzdHMgZm9yIG5ldyBtZXRob2QuCisKKzIwMDctMDEtMTIgMTg6Mjg6MTMgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgY29tbWVudCBvdXQgTEFEU1BBIHBsdWdpbiBmb3Igbm93CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGNvbW1lbnQgb3V0IExBRFNQQSBwbHVnaW4gZm9yIG5vdworCisyMDA3LTAxLTEyIDE3OjE2OjUxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC86IEFkZCBYLVFUIGRlcGF5bG9hZGVyIHRoYXQgd2lsbCBldmVudHVhbGx5IHNoYXJlIGNvZGUgd2l0aCB0aGUgZGVtdXhlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3F0ZGVtdXgvZ3N0cnRweHF0ZGVwYXkuYzogKGdzdF9ydHBfeHF0X2RlcGF5X2Jhc2VfaW5pdCksCisJICAoZ3N0X3J0cF94cXRfZGVwYXlfY2xhc3NfaW5pdCksIChnc3RfcnRwX3hxdF9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX3hxdF9kZXBheV9maW5hbGl6ZSksIChnc3RfcnRwX3F1aWNrdGltZV9wYXJzZV9zZCksCisJICAoZ3N0X3J0cF94cXRfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX3hxdF9kZXBheV9wcm9jZXNzKSwKKwkgIChnc3RfcnRwX3hxdF9kZXBheV9zZXRfcHJvcGVydHkpLCAoZ3N0X3J0cF94cXRfZGVwYXlfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX3hxdF9kZXBheV9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3J0cF94cXRfZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcXRkZW11eC9nc3RydHB4cXRkZXBheS5oOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9iYXNlX2luaXQpLAorCSAgKGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfaGVhZGVyKSwgKGdzdF9xdGRlbXV4X2xvb3ApLAorCSAgKHF0ZGVtdXhfcGFyc2VfbW9vdiksIChxdGRlbXV4X3BhcnNlX2NvbnRhaW5lciksCisJICAocXRkZW11eF9wYXJzZV9ub2RlKSwgKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pLAorCSAgKHF0ZGVtdXhfcGFyc2VfdHJhayksIChxdGRlbXV4X2F1ZGlvX2NhcHMpOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJICAqIGdzdC9xdGRlbXV4L3F1aWNrdGltZS5jOiAocGx1Z2luX2luaXQpOgorCSAgQWRkIFgtUVQgZGVwYXlsb2FkZXIgdGhhdCB3aWxsIGV2ZW50dWFsbHkgc2hhcmUgY29kZSB3aXRoIHRoZSBkZW11eGVyLgorCSAgTWFrZSBuZXcgcGx1Z2luIGVudHJ5IHBvaW50IHdpdGggcXVpY2t0aW1lIHJlbGVhdGVkIHN0dWZmLgorCisyMDA3LTAxLTEyIDEyOjEwOjE5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvcXRkZW11eC9NYWtlZmlsZS5hbTogRGlzdCBhbGwgbmV3IGZpbGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L01ha2VmaWxlLmFtOgorCSAgRGlzdCBhbGwgbmV3IGZpbGVzLgorCisyMDA3LTAxLTEyIDEwOjI3OjI1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBkb2NzL3BsdWdpbnMvOiBBY3RpdmF0ZSBkb2NzIGZvciBqYWNrLCBzZGwgYW5kIHF0ZGVtdXguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuc2lnbmFsczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF0ZGVtdXgueG1sOgorCSAgQWN0aXZhdGUgZG9jcyBmb3IgamFjaywgc2RsIGFuZCBxdGRlbXV4LgorCisyMDA3LTAxLTEyIDEwOjIyOjE2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC86IENsZWFudXAgYW5kIHJlZmFjdG9yIHRvIG1ha2UgdGhlIGNvZGUgbW9yZSByZWFkYWJsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZXh0cmFjdF9pbml0aWFsX2xlbmd0aF9hbmRfZm91cmNjKSwKKwkgIChnc3RfcXRkZW11eF9sb29wX3N0YXRlX2hlYWRlciksIChnc3RfcXRkZW11eF9jb21iaW5lX2Zsb3dzKSwKKwkgIChnc3RfcXRkZW11eF9sb29wX3N0YXRlX21vdmllKSwgKGdzdF9xdGRlbXV4X2xvb3ApLAorCSAgKGdzdF9xdGRlbXV4X2NoYWluKSwgKHF0ZGVtdXhfc2lua19hY3RpdmF0ZV9wdWxsKSwKKwkgIChxdGRlbXV4X2luZmxhdGUpLCAocXRkZW11eF9wYXJzZV9tb292KSwgKHF0ZGVtdXhfcGFyc2VfY29udGFpbmVyKSwKKwkgIChxdGRlbXV4X3BhcnNlX25vZGUpLCAocXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlKSwKKwkgIChxdGRlbXV4X3RyZWVfZ2V0X3NpYmxpbmdfYnlfdHlwZSksIChnc3RfcXRkZW11eF9hZGRfc3RyZWFtKSwKKwkgIChxdGRlbXV4X3BhcnNlX3NhbXBsZXMpLCAocXRkZW11eF9wYXJzZV9zZWdtZW50cyksCisJICAocXRkZW11eF9wYXJzZV90cmFrKSwgKHF0ZGVtdXhfdGFnX2FkZF9zdHIpLCAocXRkZW11eF90YWdfYWRkX251bSksCisJICAocXRkZW11eF90YWdfYWRkX2RhdGUpLCAocXRkZW11eF90YWdfYWRkX2ducmUpLAorCSAgKHF0ZGVtdXhfcGFyc2VfdWR0YSksIChxdGRlbXV4X3JlZGlyZWN0c19zb3J0X2Z1bmMpLAorCSAgKHF0ZGVtdXhfcHJvY2Vzc19yZWRpcmVjdHMpLCAocXRkZW11eF9wYXJzZV9yZWRpcmVjdHMpLAorCSAgKHF0ZGVtdXhfcGFyc2VfdHJlZSksIChnc3RfcXRkZW11eF9oYW5kbGVfZXNkcyksCisJICAocXRkZW11eF92aWRlb19jYXBzKSwgKHF0ZGVtdXhfYXVkaW9fY2Fwcyk6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguaDoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6IChxdGRlbXV4X2R1bXBfbXZoZCksCisJICAocXRkZW11eF9kdW1wX3RraGQpLCAocXRkZW11eF9kdW1wX2Vsc3QpLCAocXRkZW11eF9kdW1wX21kaGQpLAorCSAgKHF0ZGVtdXhfZHVtcF9oZGxyKSwgKHF0ZGVtdXhfZHVtcF92bWhkKSwgKHF0ZGVtdXhfZHVtcF9kcmVmKSwKKwkgIChxdGRlbXV4X2R1bXBfc3RzZCksIChxdGRlbXV4X2R1bXBfc3R0cyksIChxdGRlbXV4X2R1bXBfc3RzcyksCisJICAocXRkZW11eF9kdW1wX3N0c2MpLCAocXRkZW11eF9kdW1wX3N0c3opLCAocXRkZW11eF9kdW1wX3N0Y28pLAorCSAgKHF0ZGVtdXhfZHVtcF9jbzY0KSwgKHF0ZGVtdXhfZHVtcF9kY29tKSwgKHF0ZGVtdXhfZHVtcF9jbXZkKSwKKwkgIChxdGRlbXV4X2R1bXBfdW5rbm93biksIChxdGRlbXV4X25vZGVfZHVtcF9mb3JlYWNoKSwKKwkgIChxdGRlbXV4X25vZGVfZHVtcCk6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZHVtcC5oOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4X2ZvdXJjYy5oOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4X3R5cGVzLmM6IChxdGRlbXV4X3R5cGVfZ2V0KToKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eF90eXBlcy5oOgorCSAgKiBnc3QvcXRkZW11eC9xdHBhbGV0dGUuaDoKKwkgIENsZWFudXAgYW5kIHJlZmFjdG9yIHRvIG1ha2UgdGhlIGNvZGUgbW9yZSByZWFkYWJsZS4KKwkgIE1vdmUgZGVidWdnaW5nL3RhYmxlcyBpbnRvIHNlcGFyYXRlIGZpbGVzLgorCSAgQWRkIDIvNC8xNiBjb2xvciBwYWxsZXRlZSBzdXBwb3J0LgorCSAgRml4IHJhdyAxNSBiaXQgUkdCIGhhbmRsaW5nLgorCSAgVXNlIG1vcmUgRk9VUkNDIGNvbnN0YW50cy4KKwkgIEFkZCBzb21lIGRvY3MuCisKKzIwMDctMDEtMTEgMTk6NTE6MDQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOiBNaW5vciBjbGVhbi11cDogdXNlIGVudW0gdmFsdWVzIGluc3RlYWQgb2YgaGFyZGNvZGVkIGNvbnN0YW50cyAoIzM5NTUzNikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlICA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X3dhdnBhY2tfZW5jX2NvcnJlY3Rpb25fbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X3dhdnBhY2tfZW5jX2pvaW50X3N0ZXJlb19tb2RlX2dldF90eXBlKToKKwkgIE1pbm9yIGNsZWFuLXVwOiB1c2UgZW51bSB2YWx1ZXMgaW5zdGVhZCBvZiBoYXJkY29kZWQgY29uc3RhbnRzICgjMzk1NTM2KS4KKworMjAwNy0wMS0xMSAxNjo1OTo0MCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0LzogU2V0IGNvcnJlY3QgY2FwcyBvbiBvdXRnb2luZyBwdWxsZWQgYnVmZmVycywgb3IgdGhpbmdzIGJsb3cgdXAgYWZ0ZXIgcmVjZW50IGNvcmUgY2hhbmdlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXBldGFnL2dzdHRhZ2RlbXV4LmM6IChnc3RfdGFnX2RlbXV4X3JlYWRfcmFuZ2UpOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzogKGdzdF9pZDNkZW11eF9yZWFkX3JhbmdlKToKKwkgIFNldCBjb3JyZWN0IGNhcHMgb24gb3V0Z29pbmcgcHVsbGVkIGJ1ZmZlcnMsIG9yIHRoaW5ncyBibG93IHVwCisJICBhZnRlciByZWNlbnQgY29yZSBjaGFuZ2VzLgorCisyMDA3LTAxLTExIDExOjA1OjA0ICswMDAwICBKb25hcyBIb2xtYmVyZyA8am9uYXMuaG9sbWJlcmdAYXhpcy5jb20+CisKKwkgIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IFJldHVybiBGTE9XIGVycm9ycyBBU0FQLiBGaXhlcyAjMzk0OTc3LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBCYXNlZCBvbiBwYXRjaCBieTogSm9uYXMgSG9sbWJlcmcgPGpvbmFzIGRvdCBob2xtYmVyZyBhdCBheGlzIGRvdCBjb20+CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IChnc3RfbXVsdGlwYXJ0X211eF9pbml0KSwKKwkgIChnc3RfbXVsdGlwYXJ0X211eF9yZXF1ZXN0X25ld19wYWQpLAorCSAgKGdzdF9tdWx0aXBhcnRfbXV4X3F1ZXVlX3BhZHMpLCAoZ3N0X211bHRpcGFydF9tdXhfY29sbGVjdGVkKSwKKwkgIChnc3RfbXVsdGlwYXJ0X211eF9jaGFuZ2Vfc3RhdGUpOgorCSAgUmV0dXJuIEZMT1cgZXJyb3JzIEFTQVAuIEZpeGVzICMzOTQ5NzcuCisJICBNaXNjIGNsZWFudXBzLgorCisyMDA3LTAxLTExIDA5OjMwOjU5ICswMDAwICBMdXR6IE11ZWxsZXIgPGx1dHpAdG9wZnJvc2UuZGU+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogQ2hlY2sgZm9yIHN0cmVhbSBwYWQgYmVmb3JlIGFjdGl2YXRpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBMdXR6IE11ZWxsZXIgPGx1dHogYXQgdG9wZnJvc2UgZG90IGRlPgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19hY3RpdmF0ZV9zdHJlYW1zKToKKwkgIENoZWNrIGZvciBzdHJlYW0gcGFkIGJlZm9yZSBhY3RpdmF0aW5nLgorCisyMDA3LTAxLTEwIDE1OjE5OjQ4ICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3J0c3AvOiBBbGxvdyB1cmwgdG8gYmUgTlVMTCB0byBiZSBhYmxlIHRvIHVzZSBpdCBmb3Igc2VydmVyIGNvbm5lY3Rpb25zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUGV0ZXIgS2plbGxlcnN0ZWR0ICA8cGtqIGF0IGF4aXMgY29tPgorCSAgKiBnc3QvcnRzcC9DT1BZSU5HLk1JVDoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfY3JlYXRlX3N0cmVhbSksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2ZyZWUpLCAoZ3N0X3J0c3BzcmNfY2xlYW51cCksCisJICAoZ3N0X3J0c3BzcmNfYWxsb2NfdWRwX3BvcnRzKSwgKHBhZF91bmJsb2NrZWQpLCAocGFkX2Jsb2NrZWQpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KSwKKwkgIChnc3RfcnRzcHNyY19hY3RpdmF0ZV9zdHJlYW1zKSwgKGdzdF9ydHNwc3JjX2xvb3BfaW50ZXJsZWF2ZWQpLAorCSAgKGdzdF9ydHNwc3JjX2xvb3BfdWRwKSwgKGdzdF9ydHNwc3JjX3NlbmQpLAorCSAgKGdzdF9ydHNwc3JjX3BhcnNlX21ldGhvZHMpLAorCSAgKGdzdF9ydHNwc3JjX2NyZWF0ZV90cmFuc3BvcnRzX3N0cmluZyksCisJICAoZ3N0X3J0c3BzcmNfcHJlcGFyZV90cmFuc3BvcnRzKSwgKGdzdF9ydHNwc3JjX3NldHVwX3N0cmVhbXMpLAorCSAgKGdzdF9ydHNwc3JjX29wZW4pLCAoZ3N0X3J0c3BzcmNfY2xvc2UpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fY3JlYXRlKSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fY29ubmVjdCksIChydHNwX2Nvbm5lY3Rpb25fc2VuZCksIChyZWFkX2xpbmUpLAorCSAgKHBhcnNlX3JlcXVlc3RfbGluZSksIChwYXJzZV9saW5lKSwgKHJ0c3BfY29ubmVjdGlvbl9yZWFkKSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fY2xvc2UpOgorCSAgKiBnc3QvcnRzcC9ydHNwZGVmcy5jOiAocnRzcF9pbml0X3N0YXR1cyksIChydHNwX3N0cnJlc3VsdCksCisJICAocnRzcF9tZXRob2RfYXNfdGV4dCksIChydHNwX2hlYWRlcl9hc190ZXh0KSwKKwkgIChydHNwX3N0YXR1c19hc190ZXh0KSwgKHJ0c3BfZmluZF9oZWFkZXJfZmllbGQpLAorCSAgKHJ0c3BfZmluZF9tZXRob2QpOgorCSAgKiBnc3QvcnRzcC9ydHNwZGVmcy5oOgorCSAgKiBnc3QvcnRzcC9ydHNwZXh0d21zLmM6IChydHNwX2V4dF93bXNfYWZ0ZXJfc2VuZCksCisJICAocnRzcF9leHRfd21zX2NvbmZpZ3VyZV9zdHJlYW0pOgorCSAgKiBnc3QvcnRzcC9ydHNwbWVzc2FnZS5jOiAocnRzcF9tZXNzYWdlX25ldyksIChydHNwX21lc3NhZ2VfaW5pdCksCisJICAocnRzcF9tZXNzYWdlX25ld19yZXF1ZXN0KSwgKHJ0c3BfbWVzc2FnZV9pbml0X3JlcXVlc3QpLAorCSAgKHJ0c3BfbWVzc2FnZV9uZXdfcmVzcG9uc2UpLCAocnRzcF9tZXNzYWdlX2luaXRfcmVzcG9uc2UpLAorCSAgKHJ0c3BfbWVzc2FnZV9pbml0X2RhdGEpLCAocnRzcF9tZXNzYWdlX3Vuc2V0KSwKKwkgIChydHNwX21lc3NhZ2VfZnJlZSksIChydHNwX21lc3NhZ2VfYWRkX2hlYWRlciksCisJICAocnRzcF9tZXNzYWdlX2dldF9oZWFkZXIpLCAocnRzcF9tZXNzYWdlX3NldF9ib2R5KSwKKwkgIChydHNwX21lc3NhZ2VfZ2V0X2JvZHkpLCAoZHVtcF9tZW0pLCAocnRzcF9tZXNzYWdlX2R1bXApOgorCSAgKiBnc3QvcnRzcC9ydHNwbWVzc2FnZS5oOgorCSAgKiBnc3QvcnRzcC9zZHBtZXNzYWdlLmM6IChzZHBfbWVzc2FnZV9nZXRfYXR0cmlidXRlX3ZhbF9uKSwKKwkgIChzZHBfbWVkaWFfZ2V0X2F0dHJpYnV0ZV92YWxfbiksIChyZWFkX3N0cmluZyksIChyZWFkX3N0cmluZ19kZWwpLAorCSAgKHNkcF9wYXJzZV9saW5lKSwgKHNkcF9tZXNzYWdlX3BhcnNlX2J1ZmZlciksIChwcmludF9tZWRpYSksCisJICAoc2RwX21lc3NhZ2VfZHVtcCk6CisJICBBbGxvdyB1cmwgdG8gYmUgTlVMTCB0byBiZSBhYmxlIHRvIHVzZSBpdCBmb3Igc2VydmVyIGNvbm5lY3Rpb25zLgorCSAgQ2FuIG5vdyBzZW5kIHJlc3BvbnNlcyBhcyB3ZWxsIGFzIHJlcXVlc3RzLgorCSAgTm8gbG9uZ2VyIGhhbmdzIGluIGFuIGVuZGxlc3MgbG9vcCBpZiBFT0YgaXMgcmVjZWl2ZWQuCisJICBDYW4gbm93IGNvbnZlcnQgYSBzdGF0dXMgY29kZSB0byBhIHRleHQgc3RyaW5nLgorCSAgUmV0dXJuIFJUU1BfSERSX0lOVkFMSUQgZm9yIHVua25vd24gaGVhZGVycy4KKwkgIFJldHVybiBSVFNQX0lOVkFMSUQgZm9yIHVua25vd24gbWV0aG9kcy4KKwkgIENvcHkgQ1NlcSBhbmQgU2Vzc2lvbiBoZWFkZXJzIGZyb20gdGhlIHJlcXVlc3QuCisJICBPbmx5IGZyZWUgbWVtb3J5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnRseSBzZXQgbWVzc2FnZSB0eXBlLgorCSAgQWRkZWQgY29uc3QgdG8gZnVuY3Rpb24gYXJndW1lbnRzIGFzIGFwcHJvcHJpYXRlLgorCSAgQXZvaWQgYSBjb21waWxlciB3YXJuaW5nIHdoZW4gaW5pdGlhbGl6aW5nIG5tZWRpYS4KKwkgIFVzZSBndWludCByYXRoZXIgdGhhbiBnaW50IHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgorCSAgRml4IGNyYXNoZXIgaW4gd21zIGV4dGVuc2lvbi4KKwkgIEZhY3RvciBvdXQgc3RyZWFtIHNldHVwIGZyb20gb3Blbl9jb25uZWN0aW9uLgorCSAgRGVsYXkgYWN0aXZhdGlvbiBvZiBzdHJlYW1zIHdoZW4gYWN0dWFsIGRhdGEgaXMgcmVjZWl2ZWQgZnJvbSB0aGUKKwkgIHNlcnZlciwgdGhpcyBwcmVwYXJlcyB1cyB0byBkbyBwcm9wZXIgcHJvdG9jb2wgc3dpdGNoaW5nLgorCSAgQWRkZWQgbmV3IGxpY2Vuc2UuCisJICBGaXhlcyAjMzgwODk1LgorCisyMDA3LTAxLTEwIDA5OjQ3OjQzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFNvbWUgc21hbGwgZG9jcyBmaXhlcyAoIzM5NDg1MSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tbyB1YnVudHUgY29tPgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkgIFNvbWUgc21hbGwgZG9jcyBmaXhlcyAoIzM5NDg1MSkuCisKKzIwMDctMDEtMDkgMTI6MjU6MjYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogRml4IGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgRml4IGRvY3MuCisKKzIwMDctMDEtMDkgMTI6MjM6NDggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvOiBBZGRlZCBSRkMgMjI1MCBNUEVHIFZpZGVvIERlcGF5bG9hZGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHAvZ3N0cnRwLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzogKGdzdF9ydHBfbXB2X2RlcGF5X2Jhc2VfaW5pdCksCisJICAoZ3N0X3J0cF9tcHZfZGVwYXlfY2xhc3NfaW5pdCksIChnc3RfcnRwX21wdl9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX21wdl9kZXBheV9zZXRjYXBzKSwgKGdzdF9ydHBfbXB2X2RlcGF5X3Byb2Nlc3MpLAorCSAgKGdzdF9ydHBfbXB2X2RlcGF5X3NldF9wcm9wZXJ0eSksIChnc3RfcnRwX21wdl9kZXBheV9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfbXB2X2RlcGF5X2NoYW5nZV9zdGF0ZSksIChnc3RfcnRwX21wdl9kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuaDoKKwkgIEFkZGVkIFJGQyAyMjUwIE1QRUcgVmlkZW8gRGVwYXlsb2FkZXIuCisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6IChnc3RfcnRwX2gyNjNwX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfaDI2M3BfZGVwYXlfcHJvY2Vzcyk6CisJICBGaXggSGVhZGVyIGZpbGUuIFNtYWxsIGNsZWFudXBzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOiAoZ3N0X3J0cF9tcDRnX2RlcGF5X2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfbXA0Z19kZXBheV9pbml0KSwgKGdzdF9ydHBfbXA0Z19kZXBheV9maW5hbGl6ZSksCisJICAoZ3N0X3J0cF9tcDRnX2RlcGF5X3Byb2Nlc3MpLCAoZ3N0X3J0cF9tcDRnX2RlcGF5X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6IChnc3RfcnRwX21wNHZfZGVwYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9tcDR2X2RlcGF5X2luaXQpLCAoZ3N0X3J0cF9tcDR2X2RlcGF5X2ZpbmFsaXplKSwKKwkgIChnc3RfcnRwX21wNHZfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX21wNHZfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF9tcDR2X2RlcGF5X2NoYW5nZV9zdGF0ZSk6CisJICBSZW1vdmUgdXN1c2VkIGNvZGUuIFJlbW92ZSBBZGFwdGVyIGZyb20gc3RhdGUgQ2hhbmdlLiBBZGRlZCBkZWJ1Zy4KKwkgICogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOiAoZ3N0X3J0cF9tcGFfZGVwYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX21wYV9kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfbXBhX2RlcGF5X2luaXQpLAorCSAgKGdzdF9ydHBfbXBhX2RlcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9tcGFfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuaDoKKwkgIFN1YmNsYXNzIGJhc2UgZGVwYXlsb2FkZXIuCisJICBBZGRlZCBkZWJ1Zy4KKwkgIFN1cHBvcnQgc3RhdGljIHBheWxvYWQgdHlwZSBhc3NpZ25tZW50IGFzIHdlbGwuCisJICAqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJICBGaXggY2Fwcy4KKworMjAwNy0wMS0wOCAxMjo0NToxMCArMDAwMCAgVmluY2VudCBUb3JyaSA8dnRvcnJpQHVuaXYtZXZyeS5mcj4KKworCSAgZXh0L2pwZWcvOiBUaGVzZSBsaWJqcGVnIGNhbGxiYWNrcyBzaG91bGQgcmV0dXJuIGEgJ2Jvb2xlYW4nICh1bnNpZ25lZCBjaGFyIGFwcGFyZW50bHkpIGFuZCBub3QgYSAnZ2Jvb2xlYW4nICh3aGljaCBtLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBWaW5jZW50IFRvcnJpICA8dnRvcnJpIGF0IHVuaXYtZXZyeSBmcj4KKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJICAqIGV4dC9qcGVnL3Ntb2tlY29kZWMuYzoKKwkgIFRoZXNlIGxpYmpwZWcgY2FsbGJhY2tzIHNob3VsZCByZXR1cm4gYSAnYm9vbGVhbicgKHVuc2lnbmVkIGNoYXIKKwkgIGFwcGFyZW50bHkpIGFuZCBub3QgYSAnZ2Jvb2xlYW4nICh3aGljaCBtYXBzIHRvIGdpbnQpLiBGaXhlcworCSAgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aCBNaW5nVyAoIzM5MzQyNykuCisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fcmVhZCk6CisJICBVc2UgaW9jdGxzb2NrZXQgb24gd2luMzIuCisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2NyZWF0ZSk6CisJICBTb21lIHByaW50ZiBmb3JtYXQgZml4ZXMgZm9yIHdpbjMyLgorCisyMDA3LTAxLTA3IDIyOjAzOjU0ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIE5ldyBlbGVtZW50cyBpbnRlcmxlYXZlIGFuZCBkZWludGVybGVhdmUsIGltcGxlbWVudCBjaGFubmVsIGludGVybGVhdmluZyBhbmQgZGVpbnRlcmxlYXZpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDctMDEtMDcgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L2ludGVybGVhdmUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9pbnRlcmxlYXZlL3BsdWdpbi5oOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9wbHVnaW4uYzoKKwkgICogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzogTmV3IGVsZW1lbnRzIGludGVybGVhdmUgYW5kCisJICBkZWludGVybGVhdmUsIGltcGxlbWVudCBjaGFubmVsIGludGVybGVhdmluZyBhbmQgZGVpbnRlcmxlYXZpbmcuCisJICBUaGUgaW50ZXJsZWF2ZXIgY2FuIG9wZXJhdGUgaW4gcHVsbCBvciBwdXNoIG1vZGUgYnV0IHRoZQorCSAgZGVpbnRlcmxlYXZlciBpcyBtb3JlIGxpa2UgYSBkZW11eGVyIGFuZCBjYW4gb25seSBvcGVyYXRlIGluIHB1c2gKKwkgIG1vZGUuCisKKzIwMDctMDEtMDcgMTA6NDQ6MTIgKzAwMDAgIFPDqWJhc3RpZW4gTW91dHRlIDxzZWJhc3RpZW5AbW91dHRlLm5ldD4KKworCSAgZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzogVXNlIGdzdF9ndWludDY0X3RvX2dkb3VibGUgZm9yIGNvbnZlcnNpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzogKGdzdF9jdXR0ZXJfY2hhaW4pOgorCSAgVXNlIGdzdF9ndWludDY0X3RvX2dkb3VibGUgZm9yIGNvbnZlcnNpb24uCisJICAqIHdpbjMyL3ZzNi9saWJnc3RtYXRyb3NrYS5kc3A6CisJICBBZGQgemxpYiB0byB0aGUgbGluay4KKwkgICogd2luMzIvdnM2L2xpYmdzdHZpZGVvYm94LmRzcDoKKwkgIFVwZGF0ZSBsaWJvaWwgbGlicmFyeSBuYW1lIChwcm9qZWN0IGlzIGxpbmtlZCB0byBsaWJvaWwtMC4zLTAubGliIG5vdykuCisKKzIwMDctMDEtMDUgMTg6MzI6MDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIENoZWNrIGZvciB6bGliIGFuZCBpZiBhdmFpbGFibGUgcGFzcyBpdCBleHBsaWNpdGx5IHRvIHRoZSBsaW5rZXIgd2hlbiBsaW5raW5nIHF0ZGVtdXguIElmIG5vdCBhdmFpbGFibGUgKG9yIC0tZGlzYWJsZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L3F0ZGVtdXgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2VfbW9vdik6CisJICBDaGVjayBmb3IgemxpYiBhbmQgaWYgYXZhaWxhYmxlIHBhc3MgaXQgZXhwbGljaXRseSB0byB0aGUgbGlua2VyCisJICB3aGVuIGxpbmtpbmcgcXRkZW11eC4gSWYgbm90IGF2YWlsYWJsZSAob3IgLS1kaXNhYmxlLWV4dGVybmFsIGhhcworCSAgYmVlbiBzcGVjaWZpZWQhKSwgZGlzYWJsZSB0aGUgYml0cyBpbiBxdGRlbXV4IHRoYXQgdXNlIGl0LiBGaXhlcworCSAgYnVpbGQgb24gTWluZ1cgKCMzOTI4NTYpLgorCisyMDA3LTAxLTA1IDE3OjIzOjA0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvTWFrZWZpbGUuYW06IElmIHpsaWIgaXMgYXZhaWxhYmxlIGFuZCB1c2VkLCB3ZSBtdXN0IGxpbmsgaXQgZXhwbGljaXRseSBmb3IgdGhpbmdzIHRvIHdvcmsgb24gTWluZ1cgKGZpeGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvTWFrZWZpbGUuYW06CisJICBJZiB6bGliIGlzIGF2YWlsYWJsZSBhbmQgdXNlZCwgd2UgbXVzdCBsaW5rIGl0IGV4cGxpY2l0bHkgZm9yCisJICB0aGluZ3MgdG8gd29yayBvbiBNaW5nVyAoZml4ZXMgIzM5Mjg1NSkuCisKKzIwMDctMDEtMDUgMTY6MDc6MTIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6IENhbGwgZ190aHJlYWRfaW5pdCgpIHJpZ2h0IGF0IHRoZSBiZWdpbm5pbmcuIFJlbW92ZSBzdXBlcmZsdW91cyBnc3RfaW5pdCgpIC0gd2UndmUgYWxyZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6IChtYWluKToKKwkgIENhbGwgZ190aHJlYWRfaW5pdCgpIHJpZ2h0IGF0IHRoZSBiZWdpbm5pbmcuIFJlbW92ZSBzdXBlcmZsdW91cworCSAgZ3N0X2luaXQoKSAtIHdlJ3ZlIGFscmVhZHkgYmVlbiBpbml0ZWQgdmlhIHRoZSBHT3B0aW9uIHN0dWZmLgorCisyMDA3LTAxLTA0IDExOjAyOjI5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZXNkL2VzZHNpbmsuYzogRG9uJ3QgcmV0dXJuIGJvZ3VzIHZhbHVlcyB3aGVuIGVzZF9nZXRfZGVsYXkoKSBmYWlscyBmb3Igc29tZSByZWFzb24gKCMzOTIxODkpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfZGVsYXkpOgorCSAgRG9uJ3QgcmV0dXJuIGJvZ3VzIHZhbHVlcyB3aGVuIGVzZF9nZXRfZGVsYXkoKSBmYWlscyBmb3Igc29tZQorCSAgcmVhc29uICgjMzkyMTg5KS4KKworMjAwNy0wMS0wNCAwOTo0NDo1NyArMDAwMCAgVmluY2VudCBUb3JyaSA8dnRvcnJpQHVuaXYtZXZyeS5mcj4KKworCSAgQWRkIGRpcmVjdHNvdW5kc2luayB0byBidWlsZCBhbmQgZGlzdCBpdCwgc28gaXQgZ2V0cyBidWlsdCB3aGVuIGNvbXBpbGluZyB3aXRoIE1pbmdXIG9uIHdpbjMyIGFuZCB0aGUgcmVxdWlyZWQgaGVhZGVyLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBWaW5jZW50IFRvcnJpICA8dnRvcnJpIGF0IHVuaXYtZXZyeSBmcj4KKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBzeXMvTWFrZWZpbGUuYW06CisJICAqIHN5cy9kaXJlY3Rzb3VuZC9NYWtlZmlsZS5hbToKKwkgICogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgKGdzdF9kaXJlY3Rzb3VuZHNpbmtfcmVzZXQpOgorCSAgQWRkIGRpcmVjdHNvdW5kc2luayB0byBidWlsZCBhbmQgZGlzdCBpdCwgc28gaXQgZ2V0cyBidWlsdCB3aGVuCisJICBjb21waWxpbmcgd2l0aCBNaW5nVyBvbiB3aW4zMiBhbmQgdGhlIHJlcXVpcmVkIGhlYWRlcnMgYW5kIGxpYnJhcmllcworCSAgYXJlIGF2YWlsYWJsZSAoZml4ZXM6ICMzOTI2MzgpLiBBbHNvIHNpbXBsaWZ5IERpcmVjdERyYXcgY2hlY2sgYSBiaXQuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5jdnNpZ25vcmU6CisJICBGaXggQ1ZTIGlnbm9yZSBmb3IgbmVvbmh0dHBzcmMgdGVzdCBiaW5hcnkuCisKKzIwMDctMDEtMDMgMTk6NTQ6MzMgKzAwMDAgIFZpbmNlbnQgVG9ycmkgPHZ0b3JyaUB1bml2LWV2cnkuZnI+CisKKwkgIEFkZCBkaXJlY3RkcmF3c2luayB0byBidWlsZCBhbmQgZGlzdCBpdCwgc28gaXQgZ2V0cyBidWlsdCB3aGVuIGNvbXBpbGluZyB3aXRoIE1pbmdXIG9uIHdpbjMyIGFuZCB0aGUgcmVxdWlyZWQgaGVhZGVycy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVmluY2VudCBUb3JyaSAgPHZ0b3JyaSBhdCB1bml2LWV2cnkgZnI+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogc3lzL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9NYWtlZmlsZS5hbToKKwkgIEFkZCBkaXJlY3RkcmF3c2luayB0byBidWlsZCBhbmQgZGlzdCBpdCwgc28gaXQgZ2V0cyBidWlsdCB3aGVuCisJICBjb21waWxpbmcgd2l0aCBNaW5nVyBvbiB3aW4zMiBhbmQgdGhlIHJlcXVpcmVkIGhlYWRlcnMgYW5kIGxpYnJhcmllcworCSAgYXJlIGF2YWlsYWJsZSAoZml4ZXM6ICMzOTIzMTMpLgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jOgorCSAgKGdzdF9kaXJlY3RkcmF3c2lua19jZW50ZXJfcmVjdCksIChnc3RfZGlyZWN0ZHJhd3Npbmtfc2hvd19mcmFtZSksCisJICAoZ3N0X2RpcmVjdGRyYXdzaW5rX3NldHVwX2RkcmF3KSwKKwkgIChnc3RfZGlyZWN0ZHJhd3Npbmtfc3VyZmFjZV9jcmVhdGUpOgorCSAgQ29tbWVudCBvdXQgc29tZSB1bnVzZWQgdGhpbmdzIGFuZCBmaXggc29tZSBwcmludGYgZm9ybWF0IGlzc3VlcyBpbgorCSAgb3JkZXIgdG8gYXZvaWQgd2FybmluZ3Mgd2hlbiBidWlsZGxpbmcgd2l0aCBNaW5nVyAoIzM5MjMxMykuCisKKzIwMDctMDEtMDMgMTY6NDE6MTAgKzAwMDAgIEplbnMgR3JhbnNldWVyIDxqZW5zZ3JAZ214Lm5ldD4KKworCSAgRml4IGJ1aWxkIHdpdGggZ2NjLTIueCAoZGVjbGFyZSB2YXJpYWJsZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGJsb2NrIGV0Yy4pLiBGaXhlcyAjMzkxOTcxLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSmVucyBHcmFuc2V1ZXIgIDxqZW5zZ3IgYXQgZ214IG5ldD4KKwkgICogZXh0L3h2aWQvZ3N0eHZpZGVuYy5jOiAoZ3N0X3h2aWRlbmNfZW5jb2RlKSwKKwkgIChnc3RfeHZpZGVuY19nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYzogKGJwd3NpbmNfdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L2ZpbHRlci9nc3RmaWx0ZXIuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L2ZpbHRlci9nc3RpaXIuYzogKGlpcl90cmFuc2Zvcm1faXApOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKGxwd3NpbmNfdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L21vZHBsdWcvZ3N0bW9kcGx1Zy5jYzoKKwkgICogZ3N0L251dmRlbXV4L2dzdG51dmRlbXV4LmM6IChnc3RfbnV2X2RlbXV4X2hlYWRlcl9sb2FkKSwKKwkgIChnc3RfbnV2X2RlbXV4X3N0cmVhbV9leHRlbmRfaGVhZGVyKToKKwkgIEZpeCBidWlsZCB3aXRoIGdjYy0yLnggKGRlY2xhcmUgdmFyaWFibGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYQorCSAgYmxvY2sgZXRjLikuIEZpeGVzICMzOTE5NzEuCisKKzIwMDYtMTItMzAgMTI6NDQ6MDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOiBXaGVuIHdlIGNhbid0IGNyZWF0ZSBhbiBlbGVtZW50IG5lZWRlZCBmb3IgdGhlIHRlc3QsIHByaW50IGEgbWVzc2FnZSBkZXRhaWxpbmcgd2hpYy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOiAoR1NUX1NUQVJUX1RFU1QpLAorCSAgKHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nX2luaXRfY29udGV4dCk6CisJICBXaGVuIHdlIGNhbid0IGNyZWF0ZSBhbiBlbGVtZW50IG5lZWRlZCBmb3IgdGhlIHRlc3QsIHByaW50IGEgbWVzc2FnZQorCSAgZGV0YWlsaW5nIHdoaWNoIGVsZW1lbnQgaXQgYWN0dWFsbHkgaXMgdGhhdCdzIG1pc3NpbmcgKCMzOTA2NzMpLgorCisyMDA2LTEyLTI0IDExOjM2OjMxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiBGaXggcHJlc3VtYWJseSBjb3B5J24ncGFzdG8gZm9yIDE2YnBwIGRlcHRoLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6IChjb21wb3NpdGVfcGl4ZWwpOgorCSAgRml4IHByZXN1bWFibHkgY29weSduJ3Bhc3RvIGZvciAxNmJwcCBkZXB0aC4KKworMjAwNi0xMi0yNCAxMToyNDo1OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBUaGUgInNpZ25lZCIgZmllbGQgaW4gYXVkaW8gY2FwcyBpcyBvZiBib29sZWFuIHR5cGUsIHRyeWluZyB0byB1c2UgZ3N0X3N0cnVjdHVyZV9nZXRfaW50Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9tdXhfYXVkaW9fcGFkX3NldGNhcHMpOgorCSAgVGhlICJzaWduZWQiIGZpZWxkIGluIGF1ZGlvIGNhcHMgaXMgb2YgYm9vbGVhbiB0eXBlLCB0cnlpbmcgdG8gdXNlCisJICBnc3Rfc3RydWN0dXJlX2dldF9pbnQoKSB0byBleHRyYWN0IGl0IHdpbGwgZmFpbC4gRml4aW5nIHRoaXMgbWFrZXMKKwkgIG1hdHJvc2thbXV4IGFjY2VwdCByYXcgYXVkaW8gaW5wdXQgKCMzODcxMjEpICh1c2UgYXQgeW91ciBvd24gcmlzaworCSAgdGhvdWdoLCBkdWUgdG8gdGhlIG1hdHJvc2thIHNwZWMgYmVpbmcgbm90IGVudGlyZWx5IHVzZWZ1bCBpbiB0aGlzCisJICByZXNwZWN0KS4KKwkgIEFsc28gZml4IHVwIHJhdyBhdWRpbyBzdHJ1Y3R1cmVzIGluIHRlbXBsYXRlIGNhcHMgc28gdGhhdCB0aGV5CisJICByZXByZXNlbnQgd2hhdCBvdXIgc2V0Y2FwcyBmdW5jdGlvbiB3aWxsIGFjdHVhbGx5IGFjY2VwdCwgc28gdGhhdAorCSAgY29udmVydGVycyBrbm93IHdoYXQgdG8gY29udmVydCB0by4KKwkgIEZpbmFsbHksIGRvbid0IGZhaWwgaWYgdGhlcmUgaXNuJ3QgYW4gImVuZGlhbm5lc3MiIGZpZWxkIGluIDgtYml0CisJICBQQ00gY2Fwcy4KKworMjAwNi0xMi0yMiAxMDoxNToyNCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy86IHJlYXBwbHkgY29uc2lzdGVudCBwYWQgKGRlKWFjdGl2YXRpb24KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tcGVnMmVuYy5jOiAoc2V0dXBfbXBlZzJlbmMpLAorCSAgKGNsZWFudXBfbXBlZzJlbmMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmM6IChjbGVhbnVwX3JnYW5hbHlzaXMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZGVjLmM6IChzZXR1cF93YXZwYWNrZGVjKSwKKwkgIChjbGVhbnVwX3dhdnBhY2tkZWMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZW5jLmM6IChzZXR1cF93YXZwYWNrZW5jKSwKKwkgIChjbGVhbnVwX3dhdnBhY2tlbmMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy95NG1lbmMuYzogKHNldHVwX3k0bWVuYyksIChjbGVhbnVwX3k0bWVuYyk6CisJICByZWFwcGx5IGNvbnNpc3RlbnQgcGFkIChkZSlhY3RpdmF0aW9uCisKKzIwMDYtMTItMjIgMTA6MTU6MjMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvOiByZWFwcGx5IGNvbnNpc3RlbnQgcGFkIChkZSlhY3RpdmF0aW9uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9wYW5vcmFtYS5jOiAoY2xlYW51cF9wYW5vcmFtYSk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOiAoc2V0dXBfYXZpbXV4KSwgKGNsZWFudXBfYXZpbXV4KToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvY21tbGRlYy5jOiAoc2V0dXBfY21tbGRlYyksCisJICAodGVhcmRvd25fY21tbGRlYyk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxlbmMuYzogKHNldHVwX2NtbWxlbmMpLAorCSAgKHRlYXJkb3duX2NtbWxlbmMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOiAoc2V0dXBfbGV2ZWwpLCAoY2xlYW51cF9sZXZlbCk6CisJICByZWFwcGx5IGNvbnNpc3RlbnQgcGFkIChkZSlhY3RpdmF0aW9uCisKKzIwMDYtMTItMjEgMTc6MDM6MzkgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBjb25maWd1cmUuYWM6IEJhY2sgdG8gQ1ZTCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBDVlMKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSAgQWRkIDAuMTAuNSBkb2FwIGVudHJ5CisKKz09PSByZWxlYXNlIDAuMTAuNCA9PT0KKworMjAwNi0xMi0yMSAxNTo0NTowMiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogcmVsZWFzaW5nIDAuMTAuNCwgIkJsYWNrIEJ1Z3MiCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgID09PSByZWxlYXNlIDAuMTAuNCA9PT0KKwkgIDIwMDYtMTItMjEgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCSAgKiBjb25maWd1cmUuYWM6CisJICByZWxlYXNpbmcgMC4xMC40LCAiQmxhY2sgQnVncyIKKworPT09IHJlbGVhc2UgMC4xMC41ID09PQorCisyMDA2LTEyLTIxIDE1OjQwOjU1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgY29uZmlndXJlLmFjOiByZWxlYXNpbmcgMC4xMC41LCAiVGhlIFBhdGggb2YgVGhvcm5zIgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICA9PT0gcmVsZWFzZSAwLjEwLjUgPT09CisJICAyMDA2LTEyLTIxICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKwkgICogY29uZmlndXJlLmFjOgorCSAgcmVsZWFzaW5nIDAuMTAuNSwgIlRoZSBQYXRoIG9mIFRob3JucyIKKworMjAwNi0xMi0yMSAxNDowMzo0MiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9tcGVnMmVuYy5jOiAoc2V0dXBfbXBlZzJlbmMpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvbXBlZzJlbmMuYzogKHNldHVwX21wZWcyZW5jKQorCSAgKGNsZWFudXBfbXBlZzJlbmMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmM6IChjbGVhbnVwX3JnYW5hbHlzaXMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZGVjLmM6IChzZXR1cF93YXZwYWNrZGVjKSwKKwkgIChjbGVhbnVwX3dhdnBhY2tkZWMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZW5jLmM6IChzZXR1cF93YXZwYWNrZW5jKSwKKwkgIChjbGVhbnVwX3dhdnBhY2tlbmMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy95NG1lbmMuYzogKHNldHVwX3k0bWVuYyksIChjbGVhbnVwX3k0bWVuYyk6CisJICByZXZlcnQgbXkgZnJlZXplIGJyZWFrYWdlCisKKzIwMDYtMTItMjEgMTI6NDg6MzIgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvOiByZXZlcnQgbXkgZnJlZXplIGJyZWFrYWdlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9wYW5vcmFtYS5jOiAoY2xlYW51cF9wYW5vcmFtYSk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOiAoc2V0dXBfYXZpbXV4KSwgKGNsZWFudXBfYXZpbXV4KToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvY21tbGRlYy5jOiAoc2V0dXBfY21tbGRlYyksCisJICAodGVhcmRvd25fY21tbGRlYyk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxlbmMuYzogKHNldHVwX2NtbWxlbmMpLAorCSAgKHRlYXJkb3duX2NtbWxlbmMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOiAoc2V0dXBfbGV2ZWwpLCAoY2xlYW51cF9sZXZlbCk6CisJICByZXZlcnQgbXkgZnJlZXplIGJyZWFrYWdlCisKKzIwMDYtMTItMjEgMDg6MjA6MTAgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvOiBjb25zaXN0ZW50IHBhZCAoZGUpYWN0aXZhdGlvbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21wZWcyZW5jLmM6IChzZXR1cF9tcGVnMmVuYyksCisJICAoY2xlYW51cF9tcGVnMmVuYyk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzogKGNsZWFudXBfcmdhbmFseXNpcyk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tkZWMuYzogKHNldHVwX3dhdnBhY2tkZWMpLAorCSAgKGNsZWFudXBfd2F2cGFja2RlYyk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tlbmMuYzogKHNldHVwX3dhdnBhY2tlbmMpLAorCSAgKGNsZWFudXBfd2F2cGFja2VuYyk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3k0bWVuYy5jOiAoc2V0dXBfeTRtZW5jKSwgKGNsZWFudXBfeTRtZW5jKToKKwkgIGNvbnNpc3RlbnQgcGFkIChkZSlhY3RpdmF0aW9uCisKKzIwMDYtMTItMjEgMDg6MTU6MjMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvOiBjb25zaXN0ZW50IHBhZCAoZGUpYWN0aXZhdGlvbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvcGFub3JhbWEuYzogKGNsZWFudXBfcGFub3JhbWEpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdmltdXguYzogKHNldHVwX2F2aW11eCksIChjbGVhbnVwX2F2aW11eCk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxkZWMuYzogKHNldHVwX2NtbWxkZWMpLAorCSAgKHRlYXJkb3duX2NtbWxkZWMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZW5jLmM6IChzZXR1cF9jbW1sZW5jKSwKKwkgICh0ZWFyZG93bl9jbW1sZW5jKToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzogKHNldHVwX2xldmVsKSwgKGNsZWFudXBfbGV2ZWwpOgorCSAgY29uc2lzdGVudCBwYWQgKGRlKWFjdGl2YXRpb24KKworMjAwNi0xMi0xOCAxNzoxMTo0OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBEb24ndCBwb3N0IEJVRkZFUklORyBtZXNzYWdlcyBpbiBzdHJlYW1pbmcgbW9kZSBpZiB0aGUgc3RyZWFtIGhlYWRlcnMgYXJlIGJlaGluZCB0aGUgbW92aWUgZGF0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfcG9zdF9wcm9ncmVzcyksCisJICAoZ3N0X3F0ZGVtdXhfY2hhaW4pOgorCSAgRG9uJ3QgcG9zdCBCVUZGRVJJTkcgbWVzc2FnZXMgaW4gc3RyZWFtaW5nIG1vZGUgaWYgdGhlIHN0cmVhbQorCSAgaGVhZGVycyBhcmUgYmVoaW5kIHRoZSBtb3ZpZSBkYXRhOyBpbnN0ZWFkLCBwb3N0ICJwcm9ncmVzcyIgZWxlbWVudAorCSAgbWVzc2FnZXMgYXMgYSB0ZW1wb3Jhcnkgc29sdXRpb24uIEFwcHMgbWlnaHQgZ2V0IGNvbmZ1c2VkIGFuZCBkbworCSAgc2lsbHkgdGhpbmdzIHRvIHRoZSBwaXBlbGluZSBzdGF0ZSBpZiB0aGV5IHNlZSBidWZmZXJpbmcgbWVzc2FnZXMKKwkgIGZyb20gZGlmZmVyZW50IHNvdXJjZXMgYW5kIGRvbid0IHJlYWxpemUgdGhleSBjb21lIGZyb20gZGlmZmVyZW50CisJICBzb3VyY2VzICgjMzg3MTYwKS4KKworMjAwNi0xMi0xOCAxNjo0NjoxNyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIERpc2FibGUgTEFEUFNBLCBhcyBpdCBoYXMgbW92ZWQgdG8gdGhlIC1iYWQgbW9kdWxlIGZvciB0aGUgZHVyYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBleHQvTWFrZWZpbGUuYW06CisJICBEaXNhYmxlIExBRFBTQSwgYXMgaXQgaGFzIG1vdmVkIHRvIHRoZSAtYmFkIG1vZHVsZSBmb3IgdGhlIGR1cmF0aW9uLgorCisyMDA2LTEyLTE4IDE1OjUxOjU0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5jOiBSZXNldCBmbG93X3N0YXRlIGJhY2sgdG8gX09LIGFmdGVyIGEgZmx1c2ggc3RvcCBzbyB0aGF0IHdlIGV4aXQgb3VyIGVycm9yIHN0YXRlIGFmdGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5jOiAoZ3N0X3NpZ25hbF9wcm9jZXNzb3Jfc2V0Y2FwcyksCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfZXZlbnQpOgorCSAgUmVzZXQgZmxvd19zdGF0ZSBiYWNrIHRvIF9PSyBhZnRlciBhIGZsdXNoIHN0b3Agc28gdGhhdCB3ZSBleGl0IG91cgorCSAgZXJyb3Igc3RhdGUgYWZ0ZXIgdGhlIGZsdXNoLiBGaXhlcyAjMzc0MjEzCisKKzIwMDYtMTItMTggMTU6NDk6MDggKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBDaGFuZ2VMb2cgc3VyZ2VyeSBvbiBvbmUgb2YgU3RlZmFuJ3MgY29tbWl0cyBmcm9tIEF1Z3VzdDoKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQ2hhbmdlTG9nIHN1cmdlcnkgb24gb25lIG9mIFN0ZWZhbidzIGNvbW1pdHMgZnJvbSBBdWd1c3Q6CisJICAqIGV4dC9NYWtlZmlsZS5hbToKKwkgIFF1aWV0bHkgKGFjY2lkZW50YWxseSkgZW5hYmxlIExBRFNQQSBmb3IgYnVpbGRpbmcgYnkgZGVmYXVsdCwKKwkgIGRlc3BpdGUgdGhlIGZhY3QgdGhhdCBpdCBkb2Vzbid0IG1lZXQgdGhlIHBsdWdpbiBjaGVja2xpc3QuCisJICAtLSBBZGRlZCBieSBKYW4gU2NobWlkdCAxOCBEZWMgMjAwNgorCisyMDA2LTEyLTE4IDEzOjQwOjM0ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBEb24ndCBvdXRwdXQgZ193YXJuaW5nIGZvciBhbiB1bnN1cHBvcnRlZCBmb3JtYXQsIGp1c3Qgc2VuZCBhCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfY2hhaW4pLAorCSAgKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pOgorCSAgRG9uJ3Qgb3V0cHV0IGdfd2FybmluZyBmb3IgYW4gdW5zdXBwb3J0ZWQgZm9ybWF0LCBqdXN0IHNlbmQgYQorCSAgR1NUX0VMRU1FTlRfV0FSTklORyBhbmQgZG9uJ3QgYWRkIHRoZSBwYWQuCisJICBGaXggdGhlIGNhc2Ugd2hlcmUgaXQgZG9lc24ndCBjaGVjayBmb3IgYSBOVUxMIHBhZCBpbiBzdHJlYW1pbmcgbW9kZS4KKwkgIEZpeGVzICMzODcxMzcKKworMjAwNi0xMi0xOCAxMjoyNzozMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBGaXggY3Jhc2ggZGVyZWZlcmVuY2luZyBOVUxMIHBvaW50ZXIgaWYgdGhlcmUncyBubyBzdGNvIGF0b20uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIEZpeCBjcmFzaCBkZXJlZmVyZW5jaW5nIE5VTEwgcG9pbnRlciBpZiB0aGVyZSdzIG5vIHN0Y28gYXRvbS4KKwkgIEZpeGVzICMzODcxMjIuCisKKzIwMDYtMTItMTggMTA6MDI6NTYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQHVidW50dS5jb20+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuaDogVXNlIGxvY2FsIGNvcHkgb2YgbWQ1LmgsIGFzIGl0IGRpc2FwcGVhcmVkIGluIHJlY2VudCB3YXZwYWNrIGluc3RhbGxzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuaDoKKwkgIFVzZSBsb2NhbCBjb3B5IG9mIG1kNS5oLCBhcyBpdCBkaXNhcHBlYXJlZCBpbiByZWNlbnQgd2F2cGFjaworCSAgaW5zdGFsbHMuCisJICBQYXRjaCBieTogU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW8gYXQgdWJ1bnR1IGRvdCBjb20+CisJICBGaXhlczogIzM4NzA3NgorCisyMDA2LTEyLTE3IDE5OjQyOjA1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDA2LTEyLTE3IDA2OjExOjM5ICswMDAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSAgc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay4qOiBEZWNlbnQgZWZmb3J0IGF0IHBvcnRpbmcgdG8gMC4xMC4gIE5lZWRzIGNsZWFudXAgb24gT1MvWC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIERlY2VudCBlZmZvcnQgYXQgcG9ydGluZyB0byAwLjEwLiAgTmVlZHMgY2xlYW51cCBvbiBPUy9YLgorCisyMDA2LTEyLTE3IDA1OjA3OjA3ICswMDAwICBWaWpheSBTYW50aGFuYW0gPHZpamF5QHNhbnRoYW5hbS5nbWFpbC5jb20+CisKKwkgIHN5cy9vc3h2aWRlby86IFByZWxpbWluYXJ5IHBhdGNoIGZvciBwb3J0aW5nIG9zeHZpZGVvc2luaworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVmlqYXkgU2FudGhhbmFtIDx2aWpheSBzYW50aGFuYW0gZ21haWwgY29tPgorCSAgKiBzeXMvb3N4dmlkZW8vTWFrZWZpbGUuYW06CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgUHJlbGltaW5hcnkgcGF0Y2ggZm9yIHBvcnRpbmcgb3N4dmlkZW9zaW5rCisKKzIwMDYtMTItMTYgMTY6MjE6MjYgKzAwMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSAgZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiBJbnRyb2R1Y2Ugc29tZSBsb2NraW5nIGFyb3VuZCB0aGUgdmlkZW9taXhlciBzdGF0ZSBzbyB0aGF0IGl0IGRvZXMgbm90IGNyYXNoIHdoZW4gYWRkaW5nLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTam9lcmQgU2ltb25zIDxzam9lcmQgYXQgbHVvbiBkb3QgbmV0PgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IChnc3RfdmlkZW9taXhlcl9wYWRfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfdmlkZW9taXhlcl9zZXRfbWFzdGVyX2dlb21ldHJ5KSwKKwkgIChnc3RfdmlkZW9taXhlcl9wYWRfc2lua19zZXRjYXBzKSwgKGdzdF92aWRlb21peGVyX2NvbGxlY3RfZnJlZSksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfcmVzZXQpLCAoZ3N0X3ZpZGVvbWl4ZXJfaW5pdCksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfZmluYWxpemUpLCAoZ3N0X3ZpZGVvbWl4ZXJfcmVxdWVzdF9uZXdfcGFkKSwKKwkgIChnc3RfdmlkZW9taXhlcl9yZWxlYXNlX3BhZCksIChnc3RfdmlkZW9taXhlcl9jb2xsZWN0ZWQpLAorCSAgKGdzdF92aWRlb21peGVyX2NoYW5nZV9zdGF0ZSk6CisJICBJbnRyb2R1Y2Ugc29tZSBsb2NraW5nIGFyb3VuZCB0aGUgdmlkZW9taXhlciBzdGF0ZSBzbyB0aGF0IGl0IGRvZXMgbm90CisJICBjcmFzaCB3aGVuIGFkZGluZy9yZW1vdmluZyBwYWRzLiBGaXhlcyAjMzgzMDQzLgorCisyMDA2LTEyLTE2IDE1OjI1OjIzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFdlIGRvbid0IHN1cHBvcnQgc2Vla2luZyBpbiBzdHJlYW1pbmcgbW9kZSwgc28gZG9uJ3QgZXZlbiB0cnkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfZ2V0X3NyY19xdWVyeV90eXBlcyksCisJICAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksIChnc3RfcXRkZW11eF9oYW5kbGVfc3JjX2V2ZW50KToKKwkgIFdlIGRvbid0IHN1cHBvcnQgc2Vla2luZyBpbiBzdHJlYW1pbmcgbW9kZSwgc28gZG9uJ3QgZXZlbiB0cnkuCisJICBJbXBsZW1lbnQgc2Vla2luZyBxdWVyeSBzbyBhcHBzIGNhbiBxdWVyeSBzZWVrYWJpbGl0eSBwcm9wZXJseQorCSAgKHNlZSAjMzY1NDE0KS4gRml4IGR1cmF0aW9uIHF1ZXJ5LgorCisyMDA2LTEyLTE2IDExOjQyOjU2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IE1ha2Ugc3VyZSBsaWJjYWNhIGNhbiBhY3R1YWxseSBiZSB1c2VkIGluc3RlYWQgb2YganVzdCBjaGVja2luZyBmb3IgL3Vzci9iaW4vY2FjYS1jb25maWcsIHNvIHdlIGRvbid0IHcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBNYWtlIHN1cmUgbGliY2FjYSBjYW4gYWN0dWFsbHkgYmUgdXNlZCBpbnN0ZWFkIG9mIGp1c3QgY2hlY2tpbmcgZm9yCisJICAvdXNyL2Jpbi9jYWNhLWNvbmZpZywgc28gd2UgZG9uJ3Qgd3JvbmdseSB0cnkgdG8gYnVpbGQgY2FjYXNpbmsgd2hlbgorCSAgY3Jvc3MtY29tcGlsaW5nIChmaXhlcyAjMzg0NTg3KS4KKworMjAwNi0xMi0xNSAxMDo1NDoyOCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGFkZGluZyBkb2FwIGZpbGUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBNYWtlZmlsZS5hbToKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSAgKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBhZGRpbmcgZG9hcCBmaWxlCisKKzIwMDYtMTItMTQgMTY6MjA6MTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogbGliZmxhYy0xLjEuMyBjaGFuZ2VkIEFQSSBhZ2FpbiwgYnV0IHdlIGNhbid0IGJ1aWxkIGFnYWluc3QgaXQgeWV0LCBzbyBtYWtlIHN1cmUgb3VyIGNoZWNrIGRvZXNuJ3QgdXNlIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIGxpYmZsYWMtMS4xLjMgY2hhbmdlZCBBUEkgYWdhaW4sIGJ1dCB3ZSBjYW4ndCBidWlsZCBhZ2FpbnN0IGl0IHlldCwKKwkgIHNvIG1ha2Ugc3VyZSBvdXIgY2hlY2sgZG9lc24ndCB1c2UgbGliZmxhYy0xLjEuMyBhbmQgYWRkIGEgY29tbWVudAorCSAgdG8gdGhpcyBlZmZlY3QuCisKKzIwMDYtMTItMTQgMTQ6MjU6MTcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6IEFkZCBzb21lIE5VTEwgcG9pbnRlciBjaGVja3MgKHBvc3NpYmx5IHJlbGF0ZWQgdG8gIzM4NTYyMykuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzogKGdzdF9xdWFya3R2X3RyYW5zZm9ybSksCisJICAoZ3N0X3F1YXJrdHZfcGxhbmV0YWJsZV9jbGVhcik6CisJICBBZGQgc29tZSBOVUxMIHBvaW50ZXIgY2hlY2tzIChwb3NzaWJseSByZWxhdGVkIHRvICMzODU2MjMpLgorCisyMDA2LTEyLTEzIDE3OjEyOjIyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEFkZCBBTVItV0IgdG8gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGZvcm1hdHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfZ2V0X2R1cmF0aW9uKSwKKwkgIChnc3RfcXRkZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwgKHF0ZGVtdXhfcGFyc2VfdHJhayksCisJICAocXRkZW11eF9hdWRpb19jYXBzKToKKwkgIEFkZCBBTVItV0IgdG8gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGZvcm1hdHMuCisKKzIwMDYtMTItMTIgMTg6NDU6NTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC86IEluIHN0cmVhbWluZyBtb2RlLCBpZiB0aGUgZmlyc3QgYnVmZmVyIHdlIGdldCBkb2Vzbid0IGhhdmUgYW4gb2Zmc2V0LCBmaXggaXQgdXAgdG8gYmUgMCwgb3RoZXJ3aXNlIHRyaW1taW5nIHdvbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hcGV0YWcvZ3N0dGFnZGVtdXguYzogKGdzdF90YWdfZGVtdXhfY2hhaW5fcGFyc2VfdGFnKSwKKwkgIChnc3RfdGFnX2RlbXV4X2NoYWluKToKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfaWQzZGVtdXhfY2hhaW4pOgorCSAgSW4gc3RyZWFtaW5nIG1vZGUsIGlmIHRoZSBmaXJzdCBidWZmZXIgd2UgZ2V0IGRvZXNuJ3QgaGF2ZSBhbgorCSAgb2Zmc2V0LCBmaXggaXQgdXAgdG8gYmUgMCwgb3RoZXJ3aXNlIHRyaW1taW5nIHdvbid0IHdvcmsgbGF0ZXIgb24KKwkgIGFuZCB3ZSdsbCBiZSB0eXBlZmluZGluZyBhcHBsaWNhdGlvbi94LWlkMywgd2hpY2ggbWF5IHJlc3VsdCBpbgorCSAgZGVjb2RlYmluIHBsdWdnaW5nIGFuIGVuZGxlc3MgbnVtYmVyIG9mIGlkM2RlbXV4IGVsZW1lbnRzIGFzIGEKKwkgIGNvbnNlcXVlbmNlLiBGaXhlcyAjMzg1MDMxLgorCisyMDA2LTEyLTExIDIxOjIxOjE2ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOiBJZ25vcmUgdGhlIGJ1ZmZlcl90aW1lIHRoZSBzb3VuZCBkZXZpY2UgcmVwb3J0cy4gVHVybnMgb3V0IGl0IGlzIHNvbWV0aW1lcyBjb21wbGV0ZWx5Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOiAoZ3N0X3N1bmF1ZGlvc2lua19wcmVwYXJlKToKKwkgIElnbm9yZSB0aGUgYnVmZmVyX3RpbWUgdGhlIHNvdW5kIGRldmljZSByZXBvcnRzLiBUdXJucyBvdXQgaXQgaXMKKwkgIHNvbWV0aW1lcyBjb21wbGV0ZWx5IGJvZ3VzIGFuZCB3ZSdyZSBiZXR0ZXIgb2ZmIHdpdGhvdXQgaXQuCisKKzIwMDYtMTItMTEgMTc6MzM6MjYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRml4IG5vbi13b3JraW5nIHJlZGlyZWN0cyBmcm9tIGluZXRmaWxtLmNvbSAoaGFuZGxlICdhbGlzJyByZWZlcmVuY2UgZGF0YSB0eXBlIGFzIHdlbGwpLiBGaXhlcy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2VfdHJlZSk6CisJICBGaXggbm9uLXdvcmtpbmcgcmVkaXJlY3RzIGZyb20gaW5ldGZpbG0uY29tIChoYW5kbGUgJ2FsaXMnIHJlZmVyZW5jZQorCSAgZGF0YSB0eXBlIGFzIHdlbGwpLiBGaXhlcyAjMzc4NjEzLgorCisyMDA2LTEyLTExIDEzOjU5OjMzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvOiBUcnkgaGFyZGVyIHRvIGV4dHJhY3QgdGhlIGZyYW1lcmF0ZSBmb3IgdmlkZW8gdHJhY2tzIGNvcnJlY3RseSBhbmQgc2F2ZSBpdCBkaXJlY3RseSBpbnN0ZWFkIG9mIGNvbnZlcnQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfc3RyZWFtKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfdmlkZW9fY2Fwcyk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuYzoKKwkgIChnc3RfbWF0cm9za2FfdHJhY2tfaW5pdF92aWRlb19jb250ZXh0KToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgVHJ5IGhhcmRlciB0byBleHRyYWN0IHRoZSBmcmFtZXJhdGUgZm9yIHZpZGVvIHRyYWNrcyBjb3JyZWN0bHkgYW5kCisJICBzYXZlIGl0IGRpcmVjdGx5IGluc3RlYWQgb2YgY29udmVydGluZyBpdCBiYWNrIGFuZCBmb3J0aCBhIGZldworCSAgdGltZXMuIE1vc3RseSBtYWtlcyBhIGRpZmZlcmVuY2UgZm9yIHZlcnkgc21hbGwgZnJhbWVyYXRlcyAoPDEpLgorCSAgRml4ZXMgIzM4MDE5OS4KKworMjAwNi0xMi0xMSAxMTo0MToxOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuKjogUmVtb3ZlIGdjb25mIG5vdGlmeSBob29rIHdoZW4gdGhlIGdjb25mYXVkaW9zcmMgZWxlbWVudCBpcyBkZXN0cm95ZWQsIG90aGVyd2lzZSB0aGUgY2FsLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuYzogKGdzdF9nY29uZl9hdWRpb19zcmNfaW5pdCksCisJICAoZ3N0X2djb25mX2F1ZGlvX3NyY19kaXNwb3NlKSwgKGRvX3RvZ2dsZV9lbGVtZW50KToKKwkgICogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuaDoKKwkgIFJlbW92ZSBnY29uZiBub3RpZnkgaG9vayB3aGVuIHRoZSBnY29uZmF1ZGlvc3JjIGVsZW1lbnQgaXMKKwkgIGRlc3Ryb3llZCwgb3RoZXJ3aXNlIHRoZSBjYWxsYmFjayBtYXkgYmUgY2FsbGVkIG9uIGFuCisJICBhbHJlYWR5LWRlc3Ryb3llZCBpbnN0YW5jZSBhbmQgYmFkIHRoaW5ncyBoYXBwZW4uIFNob3VsZCBmaXgKKwkgICMzNzgxODQuCisJICBBbHNvIGlnbm9yZSBnY29uZiBrZXkgY2hhbmdlcyB3aGVuIHRoZSBzb3VyY2UgaXMgYWxyZWFkeSBydW5uaW5nLgorCisyMDA2LTEyLTA5IDE5OjI3OjI4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxtYWlsQHNsb21vc25haWwuZGU+CisKKwkgIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYzogV2UgbmVlZCB0byBiZSBhYmxlIHRvIHJlYWQgYW5kIHBhcnNlIGFueSBwb3NzaWJsZSBmbG9hdGluZyBwb2ludCBzdHJpbmcgZm9ybWF0ICgiMSwyMzQiIG9yIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU2ViYXN0aWFuIERyw7ZnZSAgPG1haWwgYXQgc2xvbW9zbmFpbCBkZT4KKwkgICogZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOiAoYXBlX2RlbXV4X3BhcnNlX3RhZ3MpOgorCSAgV2UgbmVlZCB0byBiZSBhYmxlIHRvIHJlYWQgYW5kIHBhcnNlIGFueSBwb3NzaWJsZSBmbG9hdGluZyBwb2ludCBzdHJpbmcKKwkgIGZvcm1hdCAoIjEsMjM0IiBvciAiMS4yMzQiKSBpcnJlc3BlY3RpdmUgb2YgdGhlIGN1cnJlbnQgbG9jYWxlLiBnX3N0cm9kKCkKKwkgIHdpbGwgcGFyc2UgdGhlIGZvcm1lciBvbmx5IGluIGNlcnRhaW4gbG9jYWxlcyB0aG91Z2gsIHNvIHdlIHJlYWxseSBuZWVkCisJICB0byBjYW5vbmljYWxpc2UgdGhlIHNlcGFyYXRvciB0byAnLicgYW5kIHRoZW4gdXNlIGdfYXNjaWlfc3RydG9kKCkgdG8KKwkgIG1ha2Ugc3VyZSB3ZSBjYW4gcGFyc2UgZWl0aGVyIHZlcnNpb24gYXQgYWxsIHRpbWVzLgorCSAgRml4ZXMgIzM4Mjk4MiBmb3IgcmVhbC4KKworMjAwNi0xMi0wOSAxNjoxNzozMyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHN5cy9zdW5hdWRpby86IFVzZSB0aGUgc3VuYXVkaW8gZGVidWcgY2F0ZWdvcnkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5jOgorCSAgVXNlIHRoZSBzdW5hdWRpbyBkZWJ1ZyBjYXRlZ29yeS4KKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOiAoZ3N0X3N1bmF1ZGlvc2lua19maW5hbGl6ZSksCisJICAoZ3N0X3N1bmF1ZGlvc2lua19jbGFzc19pbml0KSwgKGdzdF9zdW5hdWRpb3NpbmtfaW5pdCksCisJICAoZ3N0X3N1bmF1ZGlvc2lua19zZXRfcHJvcGVydHkpLCAoZ3N0X3N1bmF1ZGlvc2lua19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9zdW5hdWRpb3Npbmtfb3BlbiksIChnc3Rfc3VuYXVkaW9zaW5rX2Nsb3NlKSwKKwkgIChnc3Rfc3VuYXVkaW9zaW5rX3ByZXBhcmUpLCAoZ3N0X3N1bmF1ZGlvX3NpbmtfZG9fZGVsYXkpLAorCSAgKGdzdF9zdW5hdWRpb3Npbmtfd3JpdGUpLCAoZ3N0X3N1bmF1ZGlvc2lua19kZWxheSksCisJICAoZ3N0X3N1bmF1ZGlvc2lua19yZXNldCk6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NpbmsuaDoKKwkgIFVzZXMgdGhlIHN1bmF1ZGlvIGRlYnVnIGNhdGVnb3J5IGZvciBhbGwgZGVidWcgb3V0cHV0CisJICBJbXBsZW1lbnRzIHRoZSBfZGVsYXkoKSBjYWxsYmFjayB0byBzeW5jaHJvbmlzZSB2aWRlbyBwbGF5YmFjayBiZXR0ZXIKKwkgIENoYW5nZSB0aGUgc2VndG90YWwgYW5kIHNlZ3NpemUgdmFsdWVzIGJhY2sgdG8gdGhlIHBhcmVudCBjbGFzcworCSAgZGVmYXVsdHMgKHRha2VuIGZyb20gYnVmZmVyX3RpbWUgYW5kIGxhdGVuY3lfdGltZXMgb2YgMjAwbXMgYW5kIDEwbXMKKwkgIHJlc3BlY3RpdmVseSkKKwkgIE1lYXN1cmUgdGhlIHNhbXBsZXMgd3JpdHRlbiB0byB0aGUgZGV2aWNlIHZzLiBwbGF5ZWQuCisJICBLZWVwIHRyYWNrIG9mIHNlZ21lbnRzIGluIHRoZSBkZXZpY2UgYnkgd3JpdGluZyBlbXB0eSBlb2YgZnJhbWVzLCBhbmQKKwkgIHNsZWVwIHVzaW5nIGEgR0NvbmQgd2hlbiB3ZSBnZXQgdG9vIGZhciBhaGVhZCBhbmQgcmlzayBvdmVycnVubmluZyB0aGUKKwkgIHNpbmsncyByaW5nYnVmZmVyLgorCSAgRml4ZXM6ICMzNjA2NzMKKworMjAwNi0xMi0wOCAyMToxMjo0NyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkgIENvcnJlY3QgdGhlIGF0dHJpYnV0aW9uIG9mIHRoZSBwcmV2aW91cyBjb21taXQuIFRoZSBwYXRjaCBpbiBxdWVzdGlvbiB3YXMgd3JpdHRlbiBieSBCcmlhbiBDYW1lcm9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBDb3JyZWN0IHRoZSBhdHRyaWJ1dGlvbiBvZiB0aGUgcHJldmlvdXMgY29tbWl0LiBUaGUgcGF0Y2ggaW4KKwkgIHF1ZXN0aW9uIHdhcyB3cml0dGVuIGJ5IEJyaWFuIENhbWVyb24uCisKKzIwMDYtMTItMDggMTc6MDY6NDMgKzAwMDAgIFJlbsOpIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRml4IGNhcHMgZm9yIDI0IGJpdCByYXcgUENNIGF1ZGlvICgyKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFJlbsOpIFN0YWRsZXIgIDxtYWlsIGF0IHJlbmVzdGFkbGVyIGRlPgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9nZXRfZHVyYXRpb24pLAorCSAgKGdzdF9xdGRlbXV4X2hhbmRsZV9zcmNfcXVlcnkpLCAocXRkZW11eF9wYXJzZV90cmFrKSwKKwkgIChxdGRlbXV4X2F1ZGlvX2NhcHMpOgorCSAgRml4IGNhcHMgZm9yIDI0IGJpdCByYXcgUENNIGF1ZGlvICgyKS4KKwkgIEZpeGVzICMzODM0NzEuCisKKzIwMDYtMTItMDggMTY6Mzg6MTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPG1haWxAc2xvbW9zbmFpbC5kZT4KKworCSAgZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS4qOiBGaXggYXVkaW9wYW5vcmFtZSB3aXRoIGZsb2F0IHNhbXBsZXMuIEZpeGVzICMzODM3MjYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlICA8bWFpbCBhdCBzbG9tb3NuYWlsIGRlID4KKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOiAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX2luaXQpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV9zZXRfY2FwcyksIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtKToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5oOgorCSAgRml4IGF1ZGlvcGFub3JhbWUgd2l0aCBmbG9hdCBzYW1wbGVzLiBGaXhlcyAjMzgzNzI2LgorCisyMDA2LTEyLTA4IDE1OjEyOjAxICswMDAwICBQYWRyYWlnIE8nQnJpYWluIDxwYWRyYWlnLm9icmlhaW5Ac3VuLmNvbT4KKworCSAgc3lzL3N1bmF1ZGlvLzogSW1wbGVtZW50IHJlc2V0IGZ1bmN0aW9ucyB0byB1bmJsb2NrIHRoZSBzcmMvc2luayBtb3JlIHF1aWNrbHkgb24gc3RhdGUgY2hhbmdlIHJlcXVlc3RzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NpbmsuYzogKGdzdF9zdW5hdWRpb3NpbmtfcmVzZXQpOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuYzogKGdzdF9zdW5hdWRpb3NyY19vcGVuKSwKKwkgIChnc3Rfc3VuYXVkaW9zcmNfcmVzZXQpOgorCSAgSW1wbGVtZW50IHJlc2V0IGZ1bmN0aW9ucyB0byB1bmJsb2NrIHRoZSBzcmMvc2luayBtb3JlIHF1aWNrbHkgb24KKwkgIHN0YXRlIGNoYW5nZSByZXF1ZXN0cy4KKwkgIFBhdGNoIGJ5OiBQYWRyYWlnIE8nQnJpYWluIDxwYWRyYWlnIGRvdCBvYnJpYWluIGF0IHN1biBkb3QgY29tPgorCisyMDA2LTEyLTA4IDE0OjQyOjQyICswMDAwICBKZXJyeSBUYW4gPGplcnJ5LnRhbkBzdW4uY29tPgorCisJICBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlci5jOiBDb25zdHJ1Y3QgdGhlIGNvcnJlY3QgbWl4ZXIgZGV2aWNlIG5hbWUgd2hlbiB0aGUgQVVESU9ERVYgZW52IHZhciBpcyBzZXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXIuYzoKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl9jaGFuZ2Vfc3RhdGUpOgorCSAgQ29uc3RydWN0IHRoZSBjb3JyZWN0IG1peGVyIGRldmljZSBuYW1lIHdoZW4gdGhlIEFVRElPREVWIGVudiB2YXIKKwkgIGlzIHNldC4KKwkgIFBhdGNoIGJ5OiBKZXJyeSBUYW4gPGplcnJ5LnRhbiBhdCBzdW4gZG90IGNvbT4KKwkgIEZpeGVzOiAjMzgzNTk2CisKKzIwMDYtMTItMDggMTQ6MzI6NTEgKzAwMDAgIEplcnJ5IFRhbiA8amVycnkudGFuQHN1bi5jb20+CisKKwkgIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5jOiBBcHBseSBwYXRjaCB0byBvcGVuIHRoZSBtaXhlciBjb250cm9sIGFuZCBzZXQgdGhlIE1VTFRJUExFX09QRU4gaW9jdGwuIE9uIHNvbGFyaXMsIHRoZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5jOiAoZ3N0X3N1bmF1ZGlvc3JjX29wZW4pOgorCSAgQXBwbHkgcGF0Y2ggdG8gb3BlbiB0aGUgbWl4ZXIgY29udHJvbCBhbmQgc2V0IHRoZSBNVUxUSVBMRV9PUEVOCisJICBpb2N0bC4gT24gc29sYXJpcywgdGhlIG1peGVyIGRldmljZSBkb2Vzbid0IG5lZWQgb3BlbmluZyBub24tYmxvY2tpbmcKKwkgIC0gaXQgY2FuIGJlIG9wZW5lZCBieSBtdWx0aXBsZSBwcm9jZXNzZXMgYnkgZGVmYXVsdCwgYnV0IG5lZWRzIHRoZSBpb2N0bCAJZm9yIG11bHRpcGxlIG9wZW5zIHdpdGhpbiAxIHByb2Nlc3MuCisJICBQYXRjaCBieTogSmVycnkgVGFuIDxqZXJyeS50YW4gYXQgc3VuIGRvdCBjb20+CisJICBGaXhlczogIzM0OTAxNQorCisyMDA2LTEyLTA3IDE3OjMwOjAzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3Qvc21wdGUvOiBQb3J0IHRvIDAuMTAgc29tZSBtb3JlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zbXB0ZS9nc3RtYXNrLmg6CisJICAqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOiAoZ3N0X3NtcHRlX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zbXB0ZV9zZXRjYXBzKSwgKGdzdF9zbXB0ZV9pbml0KSwgKGdzdF9zbXB0ZV9yZXNldCksCisJICAoZ3N0X3NtcHRlX2NvbGxlY3RlZCksIChnc3Rfc21wdGVfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfc21wdGVfZ2V0X3Byb3BlcnR5KSwgKGdzdF9zbXB0ZV9jaGFuZ2Vfc3RhdGUpLCAocGx1Z2luX2luaXQpOgorCSAgKiBnc3Qvc21wdGUvZ3N0c21wdGUuaDoKKwkgIFBvcnQgdG8gMC4xMCBzb21lIG1vcmUuCisJICBBZGRlZCBkdXJhdGlvbiBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbi4KKwkgIE1ha2UgZnJhbWVyYXRlIGEgZnJhY3Rpb24uCisJICBEZXByZWNhdGUgZnBzIHByb3BlcnR5LCB3ZSBvbmx5IHVzZSBuZWdvdGlhdGVkIGZwcy4KKwkgIEFkZGVkIGRvY3MuCisJICBGaXggY29sbGVjdHBhZCB1c2FnZS4KKwkgIFJlc2V0IHN0YXRlIGluIFJFQURZLgorCSAgU2VuZCBORVdTRUdNRU5UIGV2ZW50LgorCSAgRml4IHJhY3kgdXBkYXRlcyBvZiBvYmplY3QgcHJvcGVydGllcy4KKwkgIEFkZGVkIGRlYnVnIGNhdGVnb3J5LgorCSAgRml4ZXMgIzM4MzMyMy4KKworMjAwNi0xMi0wNyAxMTozNTo0MSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBIYW5kbGUgbW9yZSBIMjYzIHZhcmlhbnRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2dldF9kdXJhdGlvbiksCisJICAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksIChxdGRlbXV4X3BhcnNlX3RyYWspLAorCSAgKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6CisJICBIYW5kbGUgbW9yZSBIMjYzIHZhcmlhbnRzLgorCisyMDA2LTEyLTA2IDE1OjA2OjA0ICswMDAwICBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogRG9uJ3QgcmVzZXQgeHBvcyBhbmQgeXBvcyBpbiB0aGUgc2V0Y2FwcyBmdW5jdGlvbiBiZWNhdXNlIGNhdXNlcyB1bmV4cGVjdGVkIGJlaGF2aW91ci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFNqb2VyZCBTaW1vbnMgPHNqb2VyZCBhdCBsdW9uIGRvdCBuZXQ+CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIChnc3RfdmlkZW9taXhlcl9zZXRfbWFzdGVyX2dlb21ldHJ5KSwKKwkgIChnc3RfdmlkZW9taXhlcl9wYWRfc2lua19zZXRjYXBzKSwgKGdzdF92aWRlb21peGVyX2NvbGxlY3RfZnJlZSk6CisJICBEb24ndCByZXNldCB4cG9zIGFuZCB5cG9zIGluIHRoZSBzZXRjYXBzIGZ1bmN0aW9uIGJlY2F1c2UgY2F1c2VzCisJICB1bmV4cGVjdGVkIGJlaGF2aW91ci4KKwkgIEZpeGVzICMzODIxNzkuCisKKzIwMDYtMTItMDYgMTQ6NDU6MzAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IEtlZXAgdHJhY2sgb2YgdGhlIGJ1ZmZlciB0aW1lc3RhbXAgaW4gdGhlIGNvbGxlY3RkYXRhIG1lbWJlciBpbnN0ZWFkIG9mIG1vZGlmeWluZyB0aGUgYi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IChnc3RfbXVsdGlwYXJ0X211eF9jb21wYXJlX3BhZHMpLAorCSAgKGdzdF9tdWx0aXBhcnRfbXV4X3F1ZXVlX3BhZHMpLCAoZ3N0X211bHRpcGFydF9tdXhfY29sbGVjdGVkKToKKwkgIEtlZXAgdHJhY2sgb2YgdGhlIGJ1ZmZlciB0aW1lc3RhbXAgaW4gdGhlIGNvbGxlY3RkYXRhIG1lbWJlciBpbnN0ZWFkCisJICBvZiBtb2RpZnlpbmcgdGhlIGJ1ZmZlciB3aXRob3V0IG1ha2luZyB0aGUgbWV0YWRhdGEgd3JpdGFibGUgZmlyc3QuCisJICBGaXhlcyAjMzgyMjc3LgorCisyMDA2LTEyLTA2IDE0OjMzOjU0ICswMDAwICBSb2IgVGF5bG9yIDxyb2J0YXlsb3JAZmxvb3BpbHkub3JnPgorCisJICBnc3QvdWRwL2dzdHVkcHNyYy5jOiBJZiB1c2luZyBtdWx0aWNhc3QgaW4gdWRwc3JjLCBiaW5kIHRvIHRoZSBtdWx0aWNhc3QgYWRkcmVzcyByYXRoZXIgdGhhbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUm9iIFRheWxvciA8cm9idGF5bG9yIGF0IGZsb29waWx5IGRvdCBvcmc+CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX3N0YXJ0KToKKwkgIElmIHVzaW5nIG11bHRpY2FzdCBpbiB1ZHBzcmMsIGJpbmQgdG8gdGhlIG11bHRpY2FzdCBhZGRyZXNzIHJhdGhlciB0aGFuCisJICBJTl9BRERSX0FOWS4KKwkgIFRoaXMgYWxsb3dzIHRoZSBzaW11bHRhbm91cyB1c2Ugb2YgbXVsdGlwbGUgdWRwc3JjcyBsaXN0ZW5pbmcgb24KKwkgIGRpZmZlcmVudCBtdWx0aWNhdCBhZGRyZXNzZXMuIFdpdGhvdXQgdGhpcyBhbGwgdWRwc3JjcyB3aWxsIHJlY2VpdmUgYWxsCisJICBwYWNrZXRzIGZyb20gYWxsIHN1YnNjcmliZWQgbXVsdGljYXN0IGFkZHJlc3Nlcy4KKwkgIEZpeGVzICMzODMwMDEuCisKKzIwMDYtMTItMDYgMTM6MzU6NTIgKzAwMDAgIEpvbmF0aGFuIE1hdHRoZXcgPGpvbmF0aGFuQDBrYW9saW4ud2g5Lm5ldD4KKworCSAgZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzogRG9uJ3QgYXR0ZW1wdCB0byB3cml0ZSBhIE5VTEwgZnJhbWUgaW50byB0aGUgSUQzIHRhZyBzZXQgd2hlbiB0aGUgY3JlYXRlRnJhbWUgbWV0aG9kIHJldHVyLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzoKKwkgIERvbid0IGF0dGVtcHQgdG8gd3JpdGUgYSBOVUxMIGZyYW1lIGludG8gdGhlIElEMyB0YWcgc2V0IHdoZW4gdGhlCisJICBjcmVhdGVGcmFtZSBtZXRob2QgcmV0dXJuZWQgTlVMTC4KKwkgIEZpeGVzOiAjMzgxODU3CisJICBQYXRjaCBieTogSm9uYXRoYW4gTWF0dGhldyA8am9uYXRoYW4gYXQgMGthb2xpbiB3aDkgbmV0ID4KKworMjAwNi0xMi0wNiAxMzoxNjo1OSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8bWFpbEBzbG9tb3NuYWlsLmRlPgorCisJICBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6IFVzZSBnX3N0cnRvZCgpIGluc3RlYWQgb2Ygc3NjYW5mIHRvIHBhcnNlIGRvdWJsZXMsIHNvIHRoYXQgaXQgd2lsbCB0cnkgcGFyc2luZyBpbiB0aGUgQyBsb2MuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6IChhcGVfZGVtdXhfcGFyc2VfdGFncyk6CisJICBVc2UgZ19zdHJ0b2QoKSBpbnN0ZWFkIG9mIHNzY2FuZiB0byBwYXJzZSBkb3VibGVzLCBzbyB0aGF0IGl0IHdpbGwKKwkgIHRyeSBwYXJzaW5nIGluIHRoZSBDIGxvY2FsZSBpZiB0aGUgY3VycmVudCBsb2NhbGUgZmFpbHMuCisJICBGaXhlczogIzM4Mjk4MgorCSAgUGF0Y2ggYnk6IFNlYmFzdGlhbiBEcsO2Z2UgIDxtYWlsIGF0IHNsb21vc25haWwgZGUgPgorCisyMDA2LTEyLTAxIDEwOjMxOjQ2ICswMDAwICBTZXJnZXkgU2NvYmljaCA8c2VyZ2V5LnNjb2JpY2hAZ21haWwuY29tPgorCisJICB3aW4zMi9NQU5JRkVTVDogRml4IGNvbXBpbGF0aW9uIG9uIHdpbjMyIHVuZGVyIFZTOAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHdpbjMyL01BTklGRVNUOgorCSAgRml4IGNvbXBpbGF0aW9uIG9uIHdpbjMyIHVuZGVyIFZTOAorCSAgUGF0Y2ggYnk6IFNlcmdleSBTY29iaWNoIDxzZXJnZXkgZG90IHNjb2JpY2ggYXQgZ21haWwgZG90IGNvbT4KKwkgIFBhcnRpYWxseSBmaXhlcyAjMzgxMTc1CisKKzIwMDYtMTEtMzAgMTY6NDg6NTEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmltdXguYzogYWNjZXB0IGFsbCBtcGVndmVyc2lvbnMsZml4ZXMgIzM4MDgyNSBzcG90dGVkIGJ5OiBKZXJvbWUgQWxldAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhY2NlcHQgYWxsIG1wZWd2ZXJzaW9ucyxmaXhlcyAjMzgwODI1CisJICBzcG90dGVkIGJ5OiBKZXJvbWUgQWxldAorCisyMDA2LTExLTMwIDE2OjQ2OjEzICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogY2xlYW51cCB0aGUgZXJyb3IgbWVzc2FnZSBhIGJpdCBtb3JlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfZmlsbF9mb3JtYXRfbGlzdCksCisJICAoZ3N0X3Y0bDJzcmNfcXVldWVfZnJhbWUpLCAoZ3N0X3Y0bDJzcmNfZ3JhYl9mcmFtZSksCisJICAoZ3N0X3Y0bDJzcmNfZ2V0X2NhcHR1cmUpLCAoZ3N0X3Y0bDJzcmNfc2V0X2NhcHR1cmUpLAorCSAgKGdzdF92NGwyc3JjX2NhcHR1cmVfaW5pdCksIChnc3RfdjRsMnNyY19idWZmZXJfZmluYWxpemUpOgorCSAgY2xlYW51cCB0aGUgZXJyb3IgbWVzc2FnZSBhIGJpdCBtb3JlCisKKzIwMDYtMTEtMzAgMTU6MDg6MDggKzAwMDAgIFJlbsOpIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisKKwkgIGdzdC9yZXBsYXlnYWluL2dzdHJnYW5hbHlzaXMuYzogQ2FsbCB0aGUgYmFzZSBjbGFzcyBoYW5kbGVyLiAgRml4ZXMgIzM4MDYxMC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFJlbsOpIFN0YWRsZXIgIDxtYWlsIGF0IHJlbmVzdGFkbGVyIGRlPgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6IChnc3RfcmdfYW5hbHlzaXNfZXZlbnQpOgorCSAgQ2FsbCB0aGUgYmFzZSBjbGFzcyBoYW5kbGVyLiAgRml4ZXMgIzM4MDYxMC4KKworMjAwNi0xMS0yOCAxMjozMDoxMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzogRml4IHdpZHRoIGFuZCBoZWlnaHQgcHJvcGVydGllcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5jOiAoZ3N0X2NhY2FzaW5rX2NsYXNzX2luaXQpOgorCSAgRml4IHdpZHRoIGFuZCBoZWlnaHQgcHJvcGVydGllcy4KKwkgICogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuaDoKKwkgIEZpeCBjb21waWxhdGlvbiBvbiBuZXdlciBsaWJjYWNhIHRoYXQgcmVxdWlyZSB1cyB0byBpbmNsdWRlIGEgbmV3CisJICBoZWFkZXIuIEZpeGVzICMzNzk5MTguCisKKzIwMDYtMTEtMjggMTE6NTI6MjcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwLzogQWRkIG1ldGhvZCBzbyB0aGF0IGV4dGVuc2lvbnMgY2FuIGNob29zZSB0byBkaXNhYmxlIHRoZSBzZXR1cCBvZiBhIHN0cmVhbS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19vcGVuKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgKiBnc3QvcnRzcC9ydHNwZXh0Lmg6CisJICAqIGdzdC9ydHNwL3J0c3BleHR3bXMuYzogKHJ0c3BfZXh0X3dtc19jb25maWd1cmVfc3RyZWFtKSwKKwkgIChydHNwX2V4dF93bXNfZ2V0X2NvbnRleHQpOgorCSAgQWRkIG1ldGhvZCBzbyB0aGF0IGV4dGVuc2lvbnMgY2FuIGNob29zZSB0byBkaXNhYmxlIHRoZSBzZXR1cCBvZgorCSAgYSBzdHJlYW0uCisJICBNYWtlIHRoZSBXTVMgZXh0ZW5zaW9uIHNraXAgc2V0dXAgb2YgeC13bXMtcnR4IHN0cmVhbXMuIEZpeGVzICMzNzc3OTIuCisKKzIwMDYtMTEtMjcgMTc6MTY6MjYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogUmVtb3ZlIHNvbWUgYXNzZXJ0cyBhbmQgcmVwbGFjZSB0aGVtIHdpdGggYSBwcm9wZXIgZXJyb3IgbWVzc2FnZS4gRml4ZXMgIzM3OTI2MS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9nZXRfZHVyYXRpb24pLAorCSAgKGdzdF9xdGRlbXV4X2hhbmRsZV9zcmNfcXVlcnkpLCAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIFJlbW92ZSBzb21lIGFzc2VydHMgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIGEgcHJvcGVyIGVycm9yCisJICBtZXNzYWdlLiBGaXhlcyAjMzc5MjYxLgorCisyMDA2LTExLTI3IDE2OjMwOjQ5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJICBtZW50aW9uIGJ1ZyBmaXgKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgbWVudGlvbiBidWcgZml4CisKKzIwMDYtMTEtMjcgMTY6Mjk6MDcgKzAwMDAgIEpvbmFzIEhvbG1iZXJnIDxqb25hcy5ob2xtYmVyZ0BheGlzLmNvbT4KKworCSAgZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogUHVzaCBoZWFkZXIgaW4gYSBzZXBhcmF0ZSBidWZmZXIgaW5zdGVhZCBvZiBtZW1jcHk6aW5nIGFsbCBkYXRhCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBKb25hcyBIb2xtYmVyZyA8am9uYXMgZG90IGhvbG1iZXJnIGF0IGF4aXMgZG90IGNvbT4KKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogKGdzdF9tdWx0aXBhcnRfbXV4X2NvbGxlY3RlZCk6CisJICBQdXNoIGhlYWRlciBpbiBhIHNlcGFyYXRlIGJ1ZmZlciBpbnN0ZWFkIG9mIG1lbWNweTppbmcgYWxsIGRhdGEKKwkgIENoYW5nZSBMRiA9PiBDUkxGIGluIGhlYWRlcnMKKwkgIE1vdmUgdHJhaWxpbmcgTEYgdG8gaGVhZGVyCisKKzIwMDYtMTEtMjcgMTY6MjY6NTAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzogU21hbGwgYnVmZmVyIG92ZXJmbG93IGZpeCBhbmQgaW1wcm92ZSBkZWJ1Z2dpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOiAoZ3N0X3J0cF9tcGFfZGVwYXlfY2hhaW4pOgorCSAgU21hbGwgYnVmZmVyIG92ZXJmbG93IGZpeCBhbmQgaW1wcm92ZSBkZWJ1Z2dpbmcuCisKKzIwMDYtMTEtMjQgMDg6NTg6NTMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZXh0L2VzZC86IHJlbW92ZSBvYnNvbGV0ZSBfZmFjdG9yeV9pbml0IHByb3RvcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkbW9uLmg6CisJICAqIGV4dC9lc2QvZXNkc2luay5oOgorCSAgcmVtb3ZlIG9ic29sZXRlIF9mYWN0b3J5X2luaXQgcHJvdG9zCisKKzIwMDYtMTEtMjQgMDc6NDY6NTQgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiByZW1vdmUgZGVhZCBjb2RlLCB0d2VhayBkZWJ1Z3Mgc3RhdGVtZW50cywgYWRkIGNvbW1lbnRzLCB1c2UgX3VpbnQ2NF9zY2FsZSBpbnN0ZWFkIF91aW50NjRfc2NhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9pbmRleF9lbnRyeV9mb3JfdGltZSksCisJICAoZ3N0X2F2aV9kZW11eF9zcmNfY29udmVydCksIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpLAorCSAgKGdzdF9hdmlfZGVtdXhfcGVla19jaHVuayksIChnc3RfYXZpX2RlbXV4X3BhcnNlX3N1YmluZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3JlYWRfc3ViaW5kZXhlc19wdXNoKSwKKwkgIChnc3RfYXZpX2RlbXV4X3JlYWRfc3ViaW5kZXhlc19wdWxsKSwgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKSwKKwkgIChnc3RfYXZpX2RlbXV4X3BhcnNlX2luZGV4KSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N5bmMpLCAoZ3N0X2F2aV9kZW11eF9uZXh0X2RhdGFfYnVmZmVyKSwKKwkgIChnc3RfYXZpX2RlbXV4X21hc3NhZ2VfaW5kZXgpLAorCSAgKGdzdF9hdmlfZGVtdXhfY2FsY3VsYXRlX2R1cmF0aW9uc19mcm9tX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXJfcHVsbCksIChnc3RfYXZpX2RlbXV4X2RvX3NlZWspLAorCSAgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspLCAoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpLAorCSAgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2RhdGEpLCAoZ3N0X2F2aV9kZW11eF9sb29wKToKKwkgIHJlbW92ZSBkZWFkIGNvZGUsIHR3ZWFrIGRlYnVncyBzdGF0ZW1lbnRzLCBhZGQgY29tbWVudHMsIHVzZQorCSAgX3VpbnQ2NF9zY2FsZSBpbnN0ZWFkIF91aW50NjRfc2NhbGVfaW50IHdoZW4gdXNpbmcgZ3VpbnQ2NCB2YWx1ZXMsCisJICBzbWFsbCBvcHRpbWl6YXRpb25zLCByZWZsb3cgc29tZSBlcnJvciBoYW5kbGluZworCisyMDA2LTExLTIyIDE3OjM5OjEzICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBwby8uY3ZzaWdub3JlOiBXZSBuZXZlciBwdXQgLnBvdCBmaWxlcyBpbiBjdnMuIExldCdzIGlnbm9yZSB0aGVtIGFsbC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBwby8uY3ZzaWdub3JlOgorCSAgV2UgbmV2ZXIgcHV0IC5wb3QgZmlsZXMgaW4gY3ZzLiBMZXQncyBpZ25vcmUgdGhlbSBhbGwuCisKKzIwMDYtMTEtMjEgMTI6NTc6NTAgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgZW5hbGJlIExBRFNQQSBwbHVnaW4gaW4gc3BlYyBmaWxlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGVuYWxiZSBMQURTUEEgcGx1Z2luIGluIHNwZWMgZmlsZQorCisyMDA2LTExLTE5IDE4OjQ2OjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBwby9QT1RGSUxFUy5pbjogLi4uIGJ1dCBiZXR0ZXIgZXhjbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBkaXN0ZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogcG8vUE9URklMRVMuaW46CisJICAuLi4gYnV0IGJldHRlciBleGNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IGRpc3RlZC4KKworMjAwNi0xMS0xOSAxNjozMjo0OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgcG8vUE9URklMRVMuaW46IEFkZCB2NGwyIHNvdXJjZSBmaWxlcyB0byBsaXN0IG9mIGZpbGVzIHdpdGggdHJhbnNsYXRpb25zLCBzbyB0aGUgc3RyaW5ncyBhcmUgYWN0dWFsbHkgZXh0cmFjdGVkIChob3dlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogcG8vUE9URklMRVMuaW46CisJICBBZGQgdjRsMiBzb3VyY2UgZmlsZXMgdG8gbGlzdCBvZiBmaWxlcyB3aXRoIHRyYW5zbGF0aW9ucywgc28gdGhlCisJICBzdHJpbmdzIGFyZSBhY3R1YWxseSBleHRyYWN0ZWQgKGhvd2V2ZXIgYmFkIHRoZXkgc3RpbGwgbWF5IGJlKS4KKworMjAwNi0xMS0xOSAxNjozMDoxOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IE1pbm9yIGNsZWFuLXVwczogY29uc3QtaWZ5IHN0YXRpYyBhcnJheSwgcmVtb3ZlIHRyYWlsaW5nIGNvbW1hIGZyb20gdXNlIEdTVF9ERUJVR19GVU5DUFRSLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOiAoZ3N0X3ZpZGVvX2JveF9jbGFzc19pbml0KToKKwkgIE1pbm9yIGNsZWFuLXVwczogY29uc3QtaWZ5IHN0YXRpYyBhcnJheSwgcmVtb3ZlIHRyYWlsaW5nIGNvbW1hIGZyb20KKwkgIGxhc3QgZW51bSAoZ2NjLTIuOXggdHJpcHMgb3ZlciB0aGF0KSwgdXNlIEdTVF9ERUJVR19GVU5DUFRSLgorCisyMDA2LTExLTE5IDEzOjQxOjUzICswMDAwICBSZW7DqSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorCisJICBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogTWFrZSBzdXJlIHRoYXQgZ19mcmVlIGFsd2F5cyBnZXRzIGNhbGxlZCBvbiB0aGUgc2FtZSBwb2ludGVyIHRoYXQgd2FzIHJldHVybmVkIGJ5IGdfbWFsbG8uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKGlkM2RlbXV4X2lkM3YyX3BhcnNlX2ZyYW1lKToKKwkgIE1ha2Ugc3VyZSB0aGF0IGdfZnJlZSBhbHdheXMgZ2V0cyBjYWxsZWQgb24gdGhlIHNhbWUgcG9pbnRlciB0aGF0IHdhcworCSAgcmV0dXJuZWQgYnkgZ19tYWxsb2MuICBGaXhlcyAjMzc2NTk0LgorCSAgRG8gbm90IGxlYWsgbWVtb3J5IGlmIGRlY29tcHJlc3NlZCBzaXplIGlzIHdyb25nLgorCSAgUmVtb3ZlIHVubmVlZGVkIGNoZWNrIG9mIHJldHVybiB2YWx1ZSBvZiBnX21hbGxvYy4KKwkgIFBhdGNoIGJ5OiBSZW7DqSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorCisyMDA2LTExLTE4IDE4OjE0OjM0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IEFkZCBtaXNzaW5nIGN1cmx5IGJyYWNrZXRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX2NhcHR1cmVfZGVpbml0KToKKwkgIEFkZCBtaXNzaW5nIGN1cmx5IGJyYWNrZXRzLgorCisyMDA2LTExLTE3IDE0OjU0OjAxICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIENoYW5nZUxvZzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIEZpeCBjYXB0dXJlX2RlaW5pdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRml4IGNhcHR1cmVfZGVpbml0LgorCisyMDA2LTExLTE2IDE1OjM2OjQ4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IFVzZSBHU1RfREVCVUdfRlVOQ1BUUjsgYWN0aXZhdGUgcmVxdWVzdCBwYWQgYmVmb3JlIHJldHVybmluZyBpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChnc3RfbWF0cm9za2FfbXV4X2NsYXNzX2luaXQpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfcmVxdWVzdF9uZXdfcGFkKToKKwkgIFVzZSBHU1RfREVCVUdfRlVOQ1BUUjsgYWN0aXZhdGUgcmVxdWVzdCBwYWQgYmVmb3JlIHJldHVybmluZyBpdC4KKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvbWF0cm9za2FtdXguYzogKHNldHVwX3NyY19wYWQpLAorCSAgKHNldHVwX3NpbmtfcGFkKSwgKEdTVF9TVEFSVF9URVNUKToKKwkgIEFjdGl2YXRlIHBhZHMgYmVmb3JlIHVzaW5nIHRoZW0uCisKKzIwMDYtMTEtMTYgMTU6MDQ6NTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogSW5pdGlhbGlzZSB2YXJpYWJsZSB0byBnZXQgcmlkIG9mIGJvZ3VzIGNvbXBpbGVyIHdhcm5pbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fc2Nhbik6CisJICBJbml0aWFsaXNlIHZhcmlhYmxlIHRvIGdldCByaWQgb2YgYm9ndXMgY29tcGlsZXIgd2FybmluZy4KKworMjAwNi0xMS0xNiAwNzoyNjoxNyArMDAwMCAgVmlsbGUgU3lyamFsYSA8dmlsbGUuc3lyamFsYUBtb3ZpYWwuZmk+CisKKwkgIGdzdC9ydHAvOiBTcGVjaWZ5IEguMjYzIHZhcmlhbnQgYW5kIHZlcnNpb24gaW4gdGhlIGNhcHMgKGZpeGVzICMzNjE2MzcpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBWaWxsZSBTeXJqYWxhIDx2aWxsZS5zeXJqYWxhQG1vdmlhbC5maT4KKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJICBTcGVjaWZ5IEguMjYzIHZhcmlhbnQgYW5kIHZlcnNpb24gaW4gdGhlIGNhcHMgKGZpeGVzICMzNjE2MzcpCisKKzIwMDYtMTEtMTUgMTc6NDQ6MDEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IERvbid0IHNldCBhIGRhdGEgcG9pbnRlciB0byBOVUxMIGFuZCBhIHNpemUgPiAwIHdoZW4gd2UgZGVhbCB3aXRoIGVtcHR5IHBhY2tldHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKHJlYWRfYm9keSk6CisJICBEb24ndCBzZXQgYSBkYXRhIHBvaW50ZXIgdG8gTlVMTCBhbmQgYSBzaXplID4gMCB3aGVuIHdlIGRlYWwKKwkgIHdpdGggZW1wdHkgcGFja2V0cy4KKwkgICogZ3N0L3J0c3AvcnRzcG1lc3NhZ2UuYzogKHJ0c3BfbWVzc2FnZV9uZXdfcmVzcG9uc2UpLAorCSAgKHJ0c3BfbWVzc2FnZV9pbml0X3Jlc3BvbnNlKSwgKHJ0c3BfbWVzc2FnZV9pbml0X2RhdGEpLAorCSAgKHJ0c3BfbWVzc2FnZV91bnNldCksIChydHNwX21lc3NhZ2VfZnJlZSksCisJICAocnRzcF9tZXNzYWdlX3Rha2VfYm9keSk6CisJICBDaGVjayB0aGF0IHdlIGNhbid0IGNyZWF0ZSBpbnZhbGlkIGVtcHR5IHBhY2tldHMuCisKKzIwMDYtMTEtMTUgMTI6MzU6NDYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svOiBTb21lIHNtYWxsIGNsZWFuLXVwczogdXNlIGVudW1zIGluc3RlYWQgb2YgaGFyZC1jb2RlZCBudW1iZXJzLCBjb25zdC1pZnkgZWxlbWVudCBkZXRhaWxzLCByZS1mYWN0b3Igc29tLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlICA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfcmVzZXQpLAorCSAgKGdzdF93YXZwYWNrX2RlY19pbml0KSwgKGdzdF93YXZwYWNrX2RlY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfYmFzZV9pbml0KSwKKwkgIChnc3Rfd2F2cGFja19lbmNfY2xhc3NfaW5pdCksIChnc3Rfd2F2cGFja19lbmNfcmVzZXQpLAorCSAgKGdzdF93YXZwYWNrX2VuY19pbml0KSwgKGdzdF93YXZwYWNrX2VuY19zZXRfd3BfY29uZmlnKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6CisJICBTb21lIHNtYWxsIGNsZWFuLXVwczogdXNlIGVudW1zIGluc3RlYWQgb2YgaGFyZC1jb2RlZCBudW1iZXJzLAorCSAgY29uc3QtaWZ5IGVsZW1lbnQgZGV0YWlscywgcmUtZmFjdG9yIHNvbWUgY29kZSBpbnRvIF9yZXNldCgpCisJICBmdW5jdGlvbnMgKCMzNTI2MDUpLgorCisyMDA2LTExLTE1IDEyOjA4OjIwICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lio6IEFkZCBiYXNpYyB0YWcgd3JpdGluZyBzdXBwb3J0OyBpbXBsZW1lbnQgcmVsZWFzaW5nIHBhZHMgKCMzNzQ2NTgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTWFyayBOYXV3ZWxhZXJ0cyAgPG1hbmF1dyBhdCBza3luZXQgYmU+CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfYWRkX2ludGVyZmFjZXMpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfY2xhc3NfaW5pdCksIChnc3RfbWF0cm9za2FfcGFkX2ZyZWUpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfcmVzZXQpLCAoZ3N0X21hdHJvc2thX211eF9oYW5kbGVfc2lua19ldmVudCksCisJICAoZ3N0X21hdHJvc2thX211eF9yZXF1ZXN0X25ld19wYWQpLCAoZ3N0X21hdHJvc2thX211eF9yZWxlYXNlX3BhZCksCisJICAoZ3N0X21hdHJvc2thX211eF90cmFja19oZWFkZXIpLCAoZ3N0X21hdHJvc2thX211eF9zdGFydCksCisJICAoZ3N0X21hdHJvc2thX211eF93cml0ZV9zaW1wbGVfdGFnKSwgKGdzdF9tYXRyb3NrYV9tdXhfZmluaXNoKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgQWRkIGJhc2ljIHRhZyB3cml0aW5nIHN1cHBvcnQ7IGltcGxlbWVudCByZWxlYXNpbmcgcGFkcyAoIzM3NDY1OCkuCisKKzIwMDYtMTEtMTUgMTE6MTk6MTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiBIYW5kbGUgb3BhcXVlL3Vuc3BlY2lmaWVkIEFfQUFDIGF1ZGlvIGNvZGVjIElEIChmaXhlcyAjMzc0NzM3KS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfc3RyZWFtKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfYXVkaW9fY2Fwcyk6CisJICBIYW5kbGUgb3BhcXVlL3Vuc3BlY2lmaWVkIEFfQUFDIGF1ZGlvIGNvZGVjIElEIChmaXhlcyAjMzc0NzM3KS4KKworMjAwNi0xMS0xNSAwMDoxMjoxOSArMDAwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogQWRkIERpcmFjIGZvdXJjYy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IEFkZCBEaXJhYyBmb3VyY2MuCisKKzIwMDYtMTEtMTQgMjA6MDc6MjIgKzAwMDAgIFNlcmdleSBTY29iaWNoIDxzZXJnZXkuc2NvYmljaEBnbWFpbC5jb20+CisKKwkgIHdpbjMyL3ZzOC86IE1ha2UgZW5kLW9mLWxpbmUgcmV0dXJucyB1bml4eSwgc28gdGhhdCB3aGVuIHRoZSBmaWxlcyBhcmUgY2hlY2tlZCBvdXQgb24gd2luMzIgdGhlIGxpbmUgcmV0dXJucyB3aWxsIGJlIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU2VyZ2V5IFNjb2JpY2ggIDxzZXJnZXkuc2NvYmljaCBhdCBnbWFpbCBjb20+CisJICAqIHdpbjMyL3ZzOC9nc3QtcGx1Z2lucy1nb29kLnNsbjoKKwkgICogd2luMzIvdnM4L2xpYmdzdDEzOTQudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0YWFzaW5rLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGFsYXcudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0YWxwaGEudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0YWxwaGFjb2xvci52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3Rhbm5vZGV4LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGFwZXRhZy52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RhdWRpb2Z4LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGF1cGFyc2UudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0YXV0b2RldGVjdC52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RhdmkudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0Y2FjYXNpbmsudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0Y2Rpby52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RjdXR0ZXIudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0ZHYudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0ZWZmZWN0di52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RmbGFjLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGZseGRlYy52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3Rnb29tLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGljeWRlbXV4LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGlkM2RlbXV4LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGpwZWcudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0bGFkc3BhLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGxldmVsLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdG1hdHJvc2thLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdG1pa21vZC52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RtbmcudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0bW9ub3Njb3BlLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdG11bGF3LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdG11bHRpcGFydC52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RwbmcudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0cnRwLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHJ0c3AudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0c2hvdXQyLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHNtcHRlLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHNwZWV4LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHRhZ2xpYi52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3R1ZHAudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0dmlkZW9iYWxhbmNlLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHZpZGVvYm94LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHZpZGVvZmxpcC52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3R2aWRlb21peGVyLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHdhdmVuYy52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3R3YXZwYXJzZS52Y3Byb2o6CisJICBNYWtlIGVuZC1vZi1saW5lIHJldHVybnMgdW5peHksIHNvIHRoYXQgd2hlbiB0aGUgZmlsZXMgYXJlIGNoZWNrZWQKKwkgIG91dCBvbiB3aW4zMiB0aGUgbGluZSByZXR1cm5zIHdpbGwgYmUgMGQgMGEgYW5kIG5vdCAwZCAwZCAwYS4KKwkgIEhvcGVmdWxseSBmaXhlcyAjMzY2NDkyLgorCisyMDA2LTExLTE0IDE1OjU1OjMyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IERpc2FibGUgaW5pdF9mcmFtZXMgZGVsYXkgdGltZXN0YW1wIGFkanVzdG1lbnQsIGl0IGRvZXMgbm90IHNlZW0gdG8gYmUgbmVlZGVkIGF0IGFsbC4gRml4ZXMgIzMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X21hc3NhZ2VfaW5kZXgpOgorCSAgRGlzYWJsZSBpbml0X2ZyYW1lcyBkZWxheSB0aW1lc3RhbXAgYWRqdXN0bWVudCwgaXQgZG9lcyBub3QKKwkgIHNlZW0gdG8gYmUgbmVlZGVkIGF0IGFsbC4gRml4ZXMgIzM2OTYyMS4KKworMjAwNi0xMS0xNCAxMTo0Mzo0MCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBEb24ndCBwYXJzZSBleHRyYSBzYW1wbGUgcGFyYW1zIGZvciByYXcgcGNtLiBGaXhlcyAjMzc0OTE0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2dldF9kdXJhdGlvbiksCisJICAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksIChxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgRG9uJ3QgcGFyc2UgZXh0cmEgc2FtcGxlIHBhcmFtcyBmb3IgcmF3IHBjbS4gRml4ZXMgIzM3NDkxNC4KKworMjAwNi0xMS0xMyAxODozMToxOCArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3QHNreW5ldC5iZT4KKworCSAgZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiBGaXggbWVtbGVhayBieSB1bnJlZidpbmcgY29sbGVjdHBhZHMgaW5zdGFuY2UgKHdoZW4gZmluYWxpemluZykKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE1hcmsgTmF1d2VsYWVydHMgIDxtYW5hdXcgYXQgc2t5bmV0IGJlPgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICAoZ3N0X3ZpZGVvbWl4ZXJfc2V0X21hc3Rlcl9nZW9tZXRyeSksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfcGFkX3Npbmtfc2V0Y2FwcyksIChnc3RfdmlkZW9taXhlcl9jbGFzc19pbml0KSwKKwkgIChnc3RfdmlkZW9taXhlcl9jb2xsZWN0X2ZyZWUpLCAoZ3N0X3ZpZGVvbWl4ZXJfcmVzZXQpLAorCSAgKGdzdF92aWRlb21peGVyX2luaXQpLCAoZ3N0X3ZpZGVvbWl4ZXJfZmluYWxpemUpLAorCSAgKGdzdF92aWRlb21peGVyX3JlcXVlc3RfbmV3X3BhZCksIChnc3RfdmlkZW9taXhlcl9yZWxlYXNlX3BhZCksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfY29sbGVjdGVkKSwgKGdzdF92aWRlb21peGVyX2NoYW5nZV9zdGF0ZSk6CisJICBGaXggbWVtbGVhayBieSB1bnJlZidpbmcgY29sbGVjdHBhZHMgaW5zdGFuY2UgKHdoZW4gZmluYWxpemluZykKKwkgIEltcGxlbWVudCByZWxlYXNpbmcgYSByZXF1ZXN0IHBhZC4gRml4ZXMgIzM3NDQ3OS4KKworMjAwNi0xMS0xMCAyMDowODo0MiArMDAwMCAgU2VyZ2V5IFNjb2JpY2ggPHNlcmdleS5zY29iaWNoQGdtYWlsLmNvbT4KKworCSAgd2luMzIvdnM4LzogQWRkIFZTOCBwcm9qZWN0IGZpbGVzIChub3RlIHRoYXQgbWFueSBvZiB0aGUgcGx1Z2lucyBpbiBleHQgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQpLiBGaXhlcyAjMzY2NDkyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU2VyZ2V5IFNjb2JpY2ggIDxzZXJnZXkuc2NvYmljaCBhdCBnbWFpbCBjb20+CisJICAqIHdpbjMyL3ZzOC9nc3QtcGx1Z2lucy1nb29kLnNsbjoKKwkgICogd2luMzIvdnM4L2xpYmdzdDEzOTQudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0YWFzaW5rLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGFsYXcudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0YWxwaGEudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0YWxwaGFjb2xvci52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3Rhbm5vZGV4LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGFwZXRhZy52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RhdWRpb2Z4LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGF1cGFyc2UudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0YXV0b2RldGVjdC52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RhdmkudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0Y2FjYXNpbmsudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0Y2Rpby52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RjdXR0ZXIudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0ZHYudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0ZWZmZWN0di52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RmbGFjLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGZseGRlYy52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3Rnb29tLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGljeWRlbXV4LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGlkM2RlbXV4LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGpwZWcudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0bGFkc3BhLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGxldmVsLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdG1hdHJvc2thLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdG1pa21vZC52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RtbmcudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0bW9ub3Njb3BlLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdG11bGF3LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdG11bHRpcGFydC52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RwbmcudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0cnRwLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHJ0c3AudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0c2hvdXQyLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHNtcHRlLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHNwZWV4LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHRhZ2xpYi52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3R1ZHAudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0dmlkZW9iYWxhbmNlLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHZpZGVvYm94LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHZpZGVvZmxpcC52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3R2aWRlb21peGVyLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHdhdmVuYy52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3R3YXZwYXJzZS52Y3Byb2o6CisJICBBZGQgVlM4IHByb2plY3QgZmlsZXMgKG5vdGUgdGhhdCBtYW55IG9mIHRoZSBwbHVnaW5zIGluIGV4dCBhcmUKKwkgIGRpc2FibGVkIGJ5IGRlZmF1bHQpLiBGaXhlcyAjMzY2NDkyLgorCisyMDA2LTExLTEwIDE5OjE4OjMzICswMDAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSAgZ3N0L211bHRpZmlsZS9NYWtlZmlsZS5hbTogTGV0J3Mgbm90IGRlcGVuZCBvbiBhIGZpbGUgdGhhdCBkb2Vzbid0IGV4aXN0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tdWx0aWZpbGUvTWFrZWZpbGUuYW06CisJICBMZXQncyBub3QgZGVwZW5kIG9uIGEgZmlsZSB0aGF0IGRvZXNuJ3QgZXhpc3QuCisKKzIwMDYtMTEtMTAgMTg6NTE6MTAgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBSZXZpdmUgbXVsdGlmaWxlW3NyY3xzaW5rXS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9tdWx0aWZpbGUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlLmM6CisJICAqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOgorCSAgKiBnc3QvbXVsdGlmaWxlL211bHRpZmlsZS52cHJvajoKKwkgIFJldml2ZSBtdWx0aWZpbGVbc3JjfHNpbmtdLgorCisyMDA2LTExLTEwIDA4OjA5OjA1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogd2UgZG8gbm90IHRyYW5zbGF0ZSBkZWJ1ZyBtZXNzYWdlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX2dyYWJfZnJhbWUpOgorCSAgd2UgZG8gbm90IHRyYW5zbGF0ZSBkZWJ1ZyBtZXNzYWdlcworCisyMDA2LTExLTA4IDEyOjA0OjAzICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6IGZpeCBjYXRlZ29yaXNhdGlvbiwgbWFrZSBzaG9ydCBkZXNjIG1vcmUgZXhwbGljaXQsIHJlbW92ZSB1bnVzZWQgY29kZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6IChnc3RfZmx4ZGVjX2NsYXNzX2luaXQpOgorCSAgZml4IGNhdGVnb3Jpc2F0aW9uLCBtYWtlIHNob3J0IGRlc2MgbW9yZSBleHBsaWNpdCwgcmVtb3ZlIHVudXNlZCBjb2RlCisJICBGaXhlcyAjMzcyMDIxCisKKzIwMDYtMTEtMDggMDE6MzA6MzkgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSAgZ3N0L3J0cC86IEZpeCBlbGVtZW50IGRlc2NyaXB0aW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbXVkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzoKKwkgIEZpeCBlbGVtZW50IGRlc2NyaXB0aW9ucy4KKworMjAwNi0xMS0wOCAwMToyOTo1MSArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJICBnc3QvcnRwLzogRml4IGRlc2NyaXB0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzogKGdzdF9ydHBfdm9yYmlzX3BheV9oYW5kbGVfYnVmZmVyKToKKwkgIEZpeCBkZXNjcmlwdGlvbi4KKwkgIFNtYWxsIGNsZWFudXAgaW4gdGhlIHBheWxvYWRlci4KKworMjAwNi0xMS0wOCAwMToyODowMCArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJICBnc3QvcnRwLzogQWRkIHRoZW9yYSBwYXkvZGVwYXlsb2FkZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHAvZ3N0cnRwLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzogKGdzdF9ydHBfdGhlb3JhX2RlcGF5X2Jhc2VfaW5pdCksCisJICAoZ3N0X3J0cF90aGVvcmFfZGVwYXlfY2xhc3NfaW5pdCksIChnc3RfcnRwX3RoZW9yYV9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX3RoZW9yYV9kZXBheV9maW5hbGl6ZSksCisJICAoZ3N0X3J0cF90aGVvcmFfZGVwYXlfcGFyc2VfY29uZmlndXJhdGlvbiksCisJICAoZ3N0X3J0cF90aGVvcmFfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF90aGVvcmFfZGVwYXlfc3dpdGNoX2NvZGVib29rKSwKKwkgIChnc3RfcnRwX3RoZW9yYV9kZXBheV9wcm9jZXNzKSwKKwkgIChnc3RfcnRwX3RoZW9yYV9kZXBheV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfdGhlb3JhX2RlcGF5X2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF90aGVvcmFfZGVwYXlfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcnRwX3RoZW9yYV9kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzogKGdzdF9ydHBfdGhlb3JhX3BheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfdGhlb3JhX3BheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfdGhlb3JhX3BheV9pbml0KSwKKwkgIChnc3RfcnRwX3RoZW9yYV9wYXlfc2V0Y2FwcyksIChnc3RfcnRwX3RoZW9yYV9wYXlfcmVzZXRfcGFja2V0KSwKKwkgIChnc3RfcnRwX3RoZW9yYV9wYXlfaW5pdF9wYWNrZXQpLAorCSAgKGdzdF9ydHBfdGhlb3JhX3BheV9mbHVzaF9wYWNrZXQpLAorCSAgKGdzdF9ydHBfdGhlb3JhX3BheV9maW5pc2hfaGVhZGVycyksIChnc3RfcnRwX3RoZW9yYV9wYXlfcGFyc2VfaWQpLAorCSAgKGdzdF9ydHBfdGhlb3JhX3BheV9oYW5kbGVfYnVmZmVyKSwKKwkgIChnc3RfcnRwX3RoZW9yYV9wYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5oOgorCSAgQWRkIHRoZW9yYSBwYXkvZGVwYXlsb2FkZXJzLgorCisyMDA2LTExLTA3IDAxOjQzOjA2ICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkgIGdzdC9ydHAvTWFrZWZpbGUuYW06IFdlIGRlcGVuZCBvbiBnc3R0YWcgdG8gZ2VuZXJhdGUgdGhlIHZvcmJpcyBjb21tZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgV2UgZGVwZW5kIG9uIGdzdHRhZyB0byBnZW5lcmF0ZSB0aGUgdm9yYmlzIGNvbW1lbnRzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJICAoZ3N0X3J0cF92b3JiaXNfZGVwYXlfcGFyc2VfY29uZmlndXJhdGlvbiksCisJICAoZ3N0X3J0cF92b3JiaXNfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF92b3JiaXNfZGVwYXlfc3dpdGNoX2NvZGVib29rKSwKKwkgIChnc3RfcnRwX3ZvcmJpc19kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5oOgorCSAgUGFyc2UgY29uZmlndXJhdGlvbiBzdHJpbmcgaW4gdGhlIGRlcGF5bG9hZGVyLgorCSAgSW1wbGVtZW50IHNlbGVjdGluZyBhbmQgc3dpdGNoaW5nIHRvIGEgbmV3IGNvZGVib29rLgorCSAgUmVjZWl2aW5nIHZvcmJpcyBvdmVyIFJUUCBub3cgd29ya3MuCisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6IChnc3RfcnRwX3ZvcmJpc19wYXlfcmVzZXRfcGFja2V0KSwKKwkgIChnc3RfcnRwX3ZvcmJpc19wYXlfaW5pdF9wYWNrZXQpLAorCSAgKGdzdF9ydHBfdm9yYmlzX3BheV9maW5pc2hfaGVhZGVycyksCisJICAoZ3N0X3J0cF92b3JiaXNfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5oOgorCSAgU2V0IHRpbWVzdGFtcHMgb24gb3V0Z29pbmcgYnVmZmVycyBhbmQgUlRQIHBhY2tldHMuCisJICBGaXggY29uZmlndXJhdGlvbiBzdHJpbmcsIHByZXBlbmQgbnVtYmVyIG9mIFBhY2tldCBoZWFkZXJzLgorCSAgRml4IGVuY29kaW5nIG9mIGlkZW50IHN0cmluZy4KKwkgIEFkZCBkZWxpdmVyeS1tZXRob2QgdG8gY2Fwcy4KKwkgIFN0cmVhbWluZyB2b3JiaXMgb3ZlciBSVFAgbm93IHdvcmtzLgorCisyMDA2LTExLTA2IDIwOjUyOjEwICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkgIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5Lio6IEdlbmVyYXRlIGEgdmFsaWQgY29uZmlndXJhdGlvbiBzdHJpbmcgaW4gdGhlIGNhcHMgYmFzZWQgb24gdGhlIHZvcmJpcyBoZWFkZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6IChnc3RfcnRwX3ZvcmJpc19wYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF92b3JiaXNfcGF5X2ZpbmlzaF9oZWFkZXJzKSwgKGdzdF9ydHBfdm9yYmlzX3BheV9wYXJzZV9pZCksCisJICAoZ3N0X3J0cF92b3JiaXNfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5oOgorCSAgR2VuZXJhdGUgYSB2YWxpZCBjb25maWd1cmF0aW9uIHN0cmluZyBpbiB0aGUgY2FwcyBiYXNlZCBvbiB0aGUKKwkgIHZvcmJpcyBoZWFkZXJzLgorCisyMDA2LTExLTAyIDIwOjEzOjI2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIEZpeCBlbnVtIG5pY2tzOyBvbmx5IGVtaXQgbm8tbW9yZS1wYWRzIG9uY2U7IGFkZCBzdXBwb3J0IGZvciB2ZXJ5IGZhc3QgZW5jb2RpbmcgbW9kZSBpbiB1cGNvbWluZyA0LjQwLjAgcmVsZWFzZSAoIzM2OS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW8gYXQgY2lyY3VsYXItY2hhb3Mub3JnPgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogKGdzdF93YXZwYWNrX2VuY19tb2RlX2dldF90eXBlKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfY29ycmVjdGlvbl9tb2RlX2dldF90eXBlKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfam9pbnRfc3RlcmVvX21vZGVfZ2V0X3R5cGUpLAorCSAgKGdzdF93YXZwYWNrX2VuY19pbml0KSwgKGdzdF93YXZwYWNrX2VuY19zZXRfd3BfY29uZmlnKToKKwkgIEZpeCBlbnVtIG5pY2tzOyBvbmx5IGVtaXQgbm8tbW9yZS1wYWRzIG9uY2U7IGFkZCBzdXBwb3J0IGZvciB2ZXJ5CisJICBmYXN0IGVuY29kaW5nIG1vZGUgaW4gdXBjb21pbmcgNC40MC4wIHJlbGVhc2UgKCMzNjk1MzkpLgorCisyMDA2LTExLTAyIDE0OjQzOjExICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvY2Rpby86IE1vdmUgQ0QtVEVYVCB1dGlsaXR5IGZ1bmN0aW9uIGludG8gY29tbW9uIGZpbGUgc28gaXQgY2FuIGFsc28gYmUgdXNlZCBieSBhIGZ1dHVyZSBjZGlvcGFyYW5vaWFzcmMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2NkaW8vZ3N0Y2Rpby5jOiAoZ3N0X2NkaW9fZ2V0X2NkdGV4dCk6CisJICAqIGV4dC9jZGlvL2dzdGNkaW8uaDoKKwkgICogZXh0L2NkaW8vZ3N0Y2Rpb2NkZGFzcmMuYzogKGdzdF9jZGlvX2NkZGFfc3JjX29wZW4pOgorCSAgTW92ZSBDRC1URVhUIHV0aWxpdHkgZnVuY3Rpb24gaW50byBjb21tb24gZmlsZSBzbyBpdCBjYW4gYWxzbyBiZQorCSAgdXNlZCBieSBhIGZ1dHVyZSBjZGlvcGFyYW5vaWFzcmMuCisKKzIwMDYtMTEtMDEgMTk6NDg6MjYgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogQ2hhbmdlTG9nOgorCSogc3lzL3Y0bDIvTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICBJbXByb3ZlZCBjb21tZW50cyBpbiBFTEVNRU5UX0VSUk9SL1dBUk5JTkcgYW5kIGFkZGVkICIjaWYgMCIgdG8geG92ZXJsYXkgY29kZSB0aGF0IGlzIHN0aWxsIG5vdCBpbXBsZW1lbnRlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgSW1wcm92ZWQgY29tbWVudHMgaW4gRUxFTUVOVF9FUlJPUi9XQVJOSU5HIGFuZCBhZGRlZCAiI2lmIDAiIHRvIHhvdmVybGF5IGNvZGUgdGhhdCBpcyBzdGlsbCBub3QgaW1wbGVtZW50ZWQuCisKKzIwMDYtMTEtMDEgMTM6NTk6NDkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiBXZSByZXF1aXJlIGEgLWJhc2UgbW9yZSByZWNlbnQgdGhhbiAwLjEwLjksIHNvIGl0J3Mgc2FmZSB0byB1c2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKHBhcnNlX3BpY3R1cmVfZnJhbWUpOgorCSAgV2UgcmVxdWlyZSBhIC1iYXNlIG1vcmUgcmVjZW50IHRoYW4gMC4xMC45LCBzbyBpdCdzIHNhZmUgdG8gdXNlCisJICBHU1RfVFlQRV9UQUdfSU1BR0VfVFlQRSB1bmNvbmRpdGlvbmFsbHkgbm93LgorCSAgKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19zaW5rX2V2ZW50KToKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2pwZWdfZGVjX3NpbmtfZXZlbnQpOgorCSAgVXNlIF9uZXdzZWdtZW50X2Z1bGwoKSBub3cgdGhhdCB3ZSBkZXBlbmQgb24gYSByZWNlbnQgZW5vdWdoIGNvcmUuCisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgUmVtb3ZlIGNydWZ0IHRoYXQgd2UgZG9uJ3QgbmVlZCBhbnkgbG9uZ2VyIG5vdyB0aGF0IHdlIGRlcGVuZCBvbgorCSAgYSByZWNlbnQgZW5vdWdoIC1iYXNlLgorCisyMDA2LTExLTAxIDEwOjE5OjE4ICswMDAwICBTZXJnZXkgU2NvYmljaCA8c2VyZ2V5LnNjb2JpY2hAZ21haWwuY29tPgorCisJICBzeXMvOiBXYWl0IHVudGlsIHRoZSB3aW5kb3cgaXMgY3JlYXRlZCBiZWZvcmUgdXNpbmcgaXQ7IGd1YXJkIHVuaXN0ZC5oIGluY2x1ZGVzIHdpdGggSEFWRV9VTklTVERfSC4gKCMzNjY1MjMpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZXJnZXkgU2NvYmljaCAgPHNlcmdleSBkb3Qgc2NvYmljaCBhdCBnbWFpbCBjb20+CisJICAqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6CisJICAoZ3N0X2RpcmVjdGRyYXdzaW5rX3dpbmRvd190aHJlYWQpLAorCSAgKGdzdF9kaXJlY3RkcmF3c2lua19jcmVhdGVfZGVmYXVsdF93aW5kb3cpOgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5oOgorCSAgKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBXYWl0IHVudGlsIHRoZSB3aW5kb3cgaXMgY3JlYXRlZCBiZWZvcmUgdXNpbmcgaXQ7IGd1YXJkIHVuaXN0ZC5oCisJICBpbmNsdWRlcyB3aXRoIEhBVkVfVU5JU1REX0guICgjMzY2NTIzKQorCSAgKiB3aW4zMi92czgvbGliZ3N0ZGlyZWN0ZHJhdy52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RkaXJlY3Rzb3VuZC52Y3Byb2o6CisJICBVcGRhdGUgcHJvamVjdCBmaWxlcy4KKworMjAwNi0xMC0zMSAxMDo1MjozMSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IEZpeCBhbmQgYWN0aXZhdGUgSUxCQyBwYXkgYW5kIGRlcGF5bG9hZGVycy4gRml4ZXMgIzM2ODE2Mi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwL2dzdHJ0cC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYzogKGdzdF9ydHBpbGJjcGF5X2luaXQpLAorCSAgKGdzdF9ydHBpbGJjcGF5X3NldGNhcHMpOgorCSAgRml4IGFuZCBhY3RpdmF0ZSBJTEJDIHBheSBhbmQgZGVwYXlsb2FkZXJzLiBGaXhlcyAjMzY4MTYyLgorCisyMDA2LTEwLTMxIDEwOjMxOjE4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEhhbmRsZSB1bmJvdW5kZWQgbGVuZ3RoIHN0cmVhbXMgYSBiaXQgYmV0dGVyLiBGaXhlcyAjMzY3Njk2LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2dldF9kdXJhdGlvbiksCisJICAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksIChxdGRlbXV4X3BhcnNlX3RyZWUpLAorCSAgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBIYW5kbGUgdW5ib3VuZGVkIGxlbmd0aCBzdHJlYW1zIGEgYml0IGJldHRlci4gRml4ZXMgIzM2NzY5Ni4KKworMjAwNi0xMC0zMSAwOTo0NDozOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IFNvbWUgc21hbGwgY2xlYW51cHMsIHVzZSBfc2NhbGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IChzcGVleF9kZWNfY29udmVydCksCisJICAoc3BlZXhfZGVjX3NpbmtfZXZlbnQpLCAoc3BlZXhfZGVjX2NoYWluX3BhcnNlX2hlYWRlcik6CisJICBTb21lIHNtYWxsIGNsZWFudXBzLCB1c2UgX3NjYWxlLgorCisyMDA2LTEwLTMxIDA5OjI5OjM2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IFVzZSBoaWdoZXIgcHJlY2lzaW9uIHNjYWxlIGZ1bmN0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSk6CisJICBVc2UgaGlnaGVyIHByZWNpc2lvbiBzY2FsZSBmdW5jdGlvbi4KKworMjAwNi0xMC0zMCAxNjoxODoxOCArMDAwMCAgTWljaGFsIEJlbmVzIDxtaWNoYWwuYmVuZXNAaXRvbmlzLnR2PgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogRml4IHNldmVyYWwgaXNzdWVzIHdpdGggZW5jb2RlZC9jb21wcmVzc2VkL2VuY3J5cHRlZC9zaWduZWQgdHJhY2tzOyBhbHNvLCByZW1vdmUgc3VwZXIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE1pY2hhbCBCZW5lcyAgPG1pY2hhbCBkb3QgYmVuZXMgYXQgaXRvbmlzIHR2PgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9lbmNvZGluZ19jbXApLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9yZWFkX3RyYWNrX2VuY29kaW5ncyksCisJICAoZ3N0X21hdHJvc2thX2RlY29kZV9idWZmZXIpOgorCSAgRml4IHNldmVyYWwgaXNzdWVzIHdpdGggZW5jb2RlZC9jb21wcmVzc2VkL2VuY3J5cHRlZC9zaWduZWQgdHJhY2tzOworCSAgYWxzbywgcmVtb3ZlIHN1cGVyZmx1b3VzIG5ld2xpbmUgY2hhcmFjdGVycyBmcm9tIHNvbWUgZGVidWcKKwkgIHN0YXRlbWVudHMuICgjMzY2MTU1KQorCisyMDA2LTEwLTMwIDA5OjI0OjUzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvanBlZy86IFZhcmlvdXMgY2xlYW51cHMsIGNhcHNuZWdvIGFuZCBsZWFrIGZpeGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzogKGdzdF9qcGVnZW5jX2dldGNhcHMpOgorCSAgKiBleHQvanBlZy9nc3RzbW9rZWRlYy5jOiAoZ3N0X3Ntb2tlZGVjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zbW9rZWRlY19pbml0KSwgKGdzdF9zbW9rZWRlY19maW5hbGl6ZSksIChnc3Rfc21va2VkZWNfY2hhaW4pLAorCSAgKGdzdF9zbW9rZWRlY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvanBlZy9nc3RzbW9rZWVuYy5jOiAoZ3N0X3Ntb2tlZW5jX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zbW9rZWVuY19pbml0KSwgKGdzdF9zbW9rZWVuY19maW5hbGl6ZSksCisJICAoZ3N0X3Ntb2tlZW5jX2dldGNhcHMpLCAoZ3N0X3Ntb2tlZW5jX3NldGNhcHMpLAorCSAgKGdzdF9zbW9rZWVuY19yZXN5bmMpLCAoZ3N0X3Ntb2tlZW5jX2NoYWluKSwKKwkgIChnc3Rfc21va2VlbmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9zbW9rZWVuY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9zbW9rZWVuY19jaGFuZ2Vfc3RhdGUpOgorCSAgVmFyaW91cyBjbGVhbnVwcywgY2Fwc25lZ28gYW5kIGxlYWsgZml4ZXMuCisKKzIwMDYtMTAtMzAgMDg6MTc6MDggKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hbmF1d0Bza3luZXQuYmU+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogRml4IHZpZGVvbWl4ZXIgc28gdGhhdCBpdCBjYW4gaGFuZGxlIGFueSBjb21iaW5hdGlvbiBvZiBmcmFtZXJhdGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTWFyayBOYXV3ZWxhZXJ0cyAgPG1hbmF1dyBhdCBza3luZXQgYmU+CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogKGdzdF92aWRlb21peGVyX3VwZGF0ZV9xdWV1ZXMpOgorCSAgRml4IHZpZGVvbWl4ZXIgc28gdGhhdCBpdCBjYW4gaGFuZGxlIGFueSBjb21iaW5hdGlvbiBvZiBmcmFtZXJhdGVzLgorCSAgRml4ZXMgIzM2NzIyMS4KKworMjAwNi0xMC0yOCAxNjozNzoyMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBGaXggcG9zaXRpb24gcXVlcnkgZm9yIGF1ZGlvLiBhbHNvIGZpeGVzIHRpbWVzdGFtcHMgaW4gc3RyZWFtaW5nIG1vZGUgYW5kIGJ1ZyAjMzY0OTU4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9maWxlX2hlYWRlciksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5pdF9wdXNoKSwgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXJfcHVzaCksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9kYXRhKSwKKwkgIChnc3RfYXZpX2RlbXV4X2NoYWluKToKKwkgIEZpeCBwb3NpdGlvbiBxdWVyeSBmb3IgYXVkaW8uIGFsc28gZml4ZXMgdGltZXN0YW1wcyBpbiBzdHJlYW1pbmcKKwkgIG1vZGUgYW5kIGJ1ZyAjMzY0OTU4LgorCSAgU21hbGwgY2xlYW51cHMuCisKKzIwMDYtMTAtMjcgMTc6MTA6NDIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZW5jLio6IEZpeCBzdHJpZGVzLiBGaXhlcyAjMzY0ODU2LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6IChnc3RfcG5nZW5jX3NldGNhcHMpLCAoZ3N0X3BuZ2VuY19jaGFpbik6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmg6CisJICBGaXggc3RyaWRlcy4gRml4ZXMgIzM2NDg1Ni4KKwkgIENsZWFudXAgY2Fwc25lZ28uCisJICBTZXQgY2FwcyBvbiBvdXRnb2luZyBidWZmZXJzLgorCisyMDA2LTEwLTE4IDE3OjA2OjIxICswMDAwICBWaWxsZSBTeXJqYWxhIDx2aWxsZS5zeXJqYWxhQG1vdmlhbC5maT4KKworCSAgZ3N0L3J0cC86IEFkZCBzdGF0aWMgcGF5bG9hZCBudW1iZXJzIGluIGFkZGl0aW9uIHRvIHRoZSBkeW5hbWljIG9uZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBWaWxsZSBTeXJqYWxhIDx2aWxsZSBkb3Qgc3lyamFsYSBhdCBtb3ZpYWwgZG90IGZpPgorCSAgKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBwY21hcGF5LmM6IChnc3RfcnRwX3BjbWFfcGF5X2ZsdXNoKSwKKwkgIChnc3RfcnRwX3BjbWFfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYzogKGdzdF9ydHBfcGNtdV9wYXlfZmx1c2gpOgorCSAgQWRkIHN0YXRpYyBwYXlsb2FkIG51bWJlcnMgaW4gYWRkaXRpb24gdG8gdGhlIGR5bmFtaWMgb25lcy4KKwkgIEZpeGVzICMzNjE2MzkuCisKKzIwMDYtMTAtMTggMTY6MTg6NTUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwLzogUmV1c2UgYWxyZWFkeSBleGlzdGluZyBlbnVtIGZvciBsb3dlciB0cmFuc3BvcnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BfbG93ZXJfdHJhbnNfZ2V0X3R5cGUpLAorCSAgKGdzdF9ydHNwc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3J0c3BzcmNfbG9vcF9pbnRlcmxlYXZlZCksCisJICAoZ3N0X3J0c3BzcmNfbG9vcF91ZHApLCAoZ3N0X3J0c3BzcmNfb3BlbiksCisJICAoZ3N0X3J0c3BzcmNfdXJpX2dldF9wcm90b2NvbHMpLCAoZ3N0X3J0c3BzcmNfdXJpX3NldF91cmkpOgorCSAgKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOiAocnRzcF9jb25uZWN0aW9uX2NyZWF0ZSk6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmg6CisJICAqIGdzdC9ydHNwL3J0c3B1cmwuYzogKHJ0c3BfdXJsX3BhcnNlKToKKwkgICogZ3N0L3J0c3AvcnRzcHVybC5oOgorCSAgUmV1c2UgYWxyZWFkeSBleGlzdGluZyBlbnVtIGZvciBsb3dlciB0cmFuc3BvcnQuCisJICBBZGQgcnRzcHQgYW5kIHJ0c3B1IHByb3RvY29scy4KKwkgIFNlbmQgcmVkaXJlY3QgdG8gcnRzcHQgd2hlbiB1ZHAgdGltZXMgb3V0LgorCisyMDA2LTEwLTE4IDE0OjAwOjQ0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogRml4IHNlZWtpbmcgc29tZSBtb3JlLCBtb3N0bHkgZm9yIHNwZWVkIGNoYW5nZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcGVyZm9ybV9zZWVrKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpOgorCSAgRml4IHNlZWtpbmcgc29tZSBtb3JlLCBtb3N0bHkgZm9yIHNwZWVkIGNoYW5nZXMuCisKKzIwMDYtMTAtMTggMTE6Mjg6MDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIENoYW5nZUxvZzoKKwkgIENoYW5nZUxvZyBzdXJnZXJ5OiBmaXggRnJlZHJpaydzIGUtbWFpbCBhZGRyZXNzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIENoYW5nZUxvZyBzdXJnZXJ5OiBmaXggRnJlZHJpaydzIGUtbWFpbCBhZGRyZXNzCisKKzIwMDYtMTAtMTggMTE6MDQ6MDkgKzAwMDAgIEZyZWRyaWsgUGVyc3NvbiA8ZnJlcGVAYnJvYWRiYW5kLm5ldD4KKworCSAgc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLio6IEZpeCBfc2V0X2NoYW5uZWwoKTogcmVtb3ZlIHVzZWxlc3MgZ19vYmplY3Rfbm90aWZ5KCkgZm9yICJjaGFubmVsIiBwcm9wZXJ0eSB0aGF0IGRvZXNuJ3QgZXhpLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBGcmVkcmlrIFBlcnNzb24gIDxmcmVwZSBhdCBicm9hZGJhbmQgbmV0PgorCSAgKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuYzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmg6CisJICBGaXggX3NldF9jaGFubmVsKCk6IHJlbW92ZSB1c2VsZXNzIGdfb2JqZWN0X25vdGlmeSgpIGZvciAiY2hhbm5lbCIKKwkgIHByb3BlcnR5IHRoYXQgZG9lc24ndCBleGlzdCBhbnkgbG9uZ2VyIGFuZCB0aGVyZWZvcmUgbm93IGFsc28KKwkgIHVzZWxlc3MgcmVkaXJlY3QgKCMzMzg4MTgpLgorCisyMDA2LTEwLTE3IDE1OjE2OjQ3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBBY3RpdmF0ZSBwYWRzIGJlZm9yZSBhZGRpbmcgdGhlbSB0byBydW5uaW5nIGVsZW1lbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOiAoZ3N0X3dhdnBhY2tfZW5jX3NldF93cF9jb25maWcpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9jcmVhdGVfc3JjX3BhZCk6CisJICAqIGdzdC9udXZkZW11eC9nc3RudXZkZW11eC5jOiAoZ3N0X251dl9kZW11eF9jcmVhdGVfcGFkcyk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2twYXJzZS5jOiAod2F2cGFja3BhcnNlX2ZvdW5kX3BhZCk6CisJICBBY3RpdmF0ZSBwYWRzIGJlZm9yZSBhZGRpbmcgdGhlbSB0byBydW5uaW5nIGVsZW1lbnQuCisKKzIwMDYtMTAtMTcgMTQ6NTc6MTcgKzAwMDAgIEpvc2VwIFRvcnJhIFZhbGxlcyA8am9zZXBAZmx1ZW5kby5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogTWFrZSBjb21waWxlIHdpdGggRm9ydGUgY29tcGlsZXIsIG1vc3RseSBkb24ndCBkbyBwb2ludGVyIGFyaXRobWV0aWMgd2l0aCB2b2lkIHBvaW50ZXJzICgjMzYyNi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSm9zZXAgVG9ycmEgVmFsbGVzICA8am9zZXAgYXQgZmx1ZW5kbyBjb20+CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2hhbmRsZV9zaW5rX2V2ZW50KSwKKwkgIChuZXh0X2VudHJ5X3NpemUpLCAocXRkZW11eF9pbmZsYXRlKSwgKHF0ZGVtdXhfcGFyc2VfbW9vdiksCisJICAocXRkZW11eF9wYXJzZV90cmVlKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayksIChxdGRlbXV4X3RhZ19hZGRfc3RyKSwKKwkgIChxdGRlbXV4X3RhZ19hZGRfbnVtKSwgKHF0ZGVtdXhfdGFnX2FkZF9kYXRlKSwKKwkgIChxdGRlbXV4X3RhZ19hZGRfZ25yZSk6CisJICBNYWtlIGNvbXBpbGUgd2l0aCBGb3J0ZSBjb21waWxlciwgbW9zdGx5IGRvbid0IGRvIHBvaW50ZXIgYXJpdGhtZXRpYworCSAgd2l0aCB2b2lkIHBvaW50ZXJzICgjMzYyNjI2KS4KKworMjAwNi0xMC0xNyAxNDozNzo0OSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgc3lzL29zcy9nc3Rvc3NzaW5rLmM6IFNvbWUgZHJpdmVycyBkbyBub3Qgc3VwcG9ydCB1bnNldHRpbmcgdGhlIG5vbi1ibG9ja2luZyBmbGFnIG9uY2UgdGhlIGRldmljZSBpcyBvcGVuZWQuIEluIHRob3NlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IChnc3Rfb3NzX3NpbmtfcHJlcGFyZSk6CisJICBTb21lIGRyaXZlcnMgZG8gbm90IHN1cHBvcnQgdW5zZXR0aW5nIHRoZSBub24tYmxvY2tpbmcgZmxhZyBvbmNlIHRoZQorCSAgZGV2aWNlIGlzIG9wZW5lZC4gSW4gdGhvc2UgY2FzZXMsIGNsb3NlL29wZW4gdGhlIGRldmljZSBpbgorCSAgbm9uLWJsb2NraW5nIG1vZGUuIEZpeGVzICMzNjI2NzMuCisKKzIwMDYtMTAtMTcgMTM6NDQ6MTQgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgc3lzL3Y0bDIvOiBkZWFyIHN0ZWZhbiwgZnJhbWVzcGVyc2Vjb25kIGlzIG5vdCBmcmFtZXBlcmlvZCwgcmV2ZXJ0aW5nIGJ1dCBhZGRpbmcgY29tbWVudAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzogKGdzdF92NGwyX2ZpbGxfbGlzdHMpOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IChnc3RfdjRsMnNyY19zZXRfZnBzKSwKKwkgIChnc3RfdjRsMnNyY19nZXRfZnBzKToKKwkgIGRlYXIgc3RlZmFuLCBmcmFtZXNwZXJzZWNvbmQgaXMgbm90IGZyYW1lcGVyaW9kLCByZXZlcnRpbmcgYnV0IGFkZGluZworCSAgY29tbWVudAorCisyMDA2LTEwLTE3IDExOjI4OjUwICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHN5cy92NGwyLzogTnVtZXJhdG9yIGlzIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3IgaXMgZGVub21pbmF0b3IuIFNheSB0aGF0IGFsb3VkIDUgdGltZXMgYW5kIHJldHJ5IGFmdGVyIG5leHQgYmVlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6IChnc3RfdjRsMl9maWxsX2xpc3RzKToKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfc2V0X2ZwcyksCisJICAoZ3N0X3Y0bDJzcmNfZ2V0X2Zwcyk6CisJICBOdW1lcmF0b3IgaXMgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciBpcyBkZW5vbWluYXRvci4gU2F5IHRoYXQgYWxvdWQKKwkgIDUgdGltZXMgYW5kIHJldHJ5IGFmdGVyIG5leHQgYmVlci4KKworMjAwNi0xMC0xNyAxMDo1OTo1NSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC4qOiBBdm9pZCB2b2lkIHBvaW50ZXIgdXNhZ2UsIGJldHRlciB1c2UgZ3VpbnQ4ICogaW5zdGVhZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlX21vb3YpLCAocXRkZW11eF9wYXJzZSksCisJICAocXRkZW11eF9ub2RlX2R1bXBfZm9yZWFjaCksIChxdGRlbXV4X2R1bXBfbXZoZCksCisJICAocXRkZW11eF9kdW1wX3RraGQpLCAocXRkZW11eF9kdW1wX2Vsc3QpLCAocXRkZW11eF9kdW1wX21kaGQpLAorCSAgKHF0ZGVtdXhfZHVtcF9oZGxyKSwgKHF0ZGVtdXhfZHVtcF92bWhkKSwgKHF0ZGVtdXhfZHVtcF9kcmVmKSwKKwkgIChxdGRlbXV4X2R1bXBfc3RzZCksIChxdGRlbXV4X2R1bXBfc3R0cyksIChxdGRlbXV4X2R1bXBfc3RzcyksCisJICAocXRkZW11eF9kdW1wX3N0c2MpLCAocXRkZW11eF9kdW1wX3N0c3opLCAocXRkZW11eF9kdW1wX3N0Y28pLAorCSAgKHF0ZGVtdXhfZHVtcF9jbzY0KSwgKHF0ZGVtdXhfZHVtcF9kY29tKSwgKHF0ZGVtdXhfZHVtcF9jbXZkKSwKKwkgIChxdGRlbXV4X2R1bXBfdW5rbm93biksIChxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUpLAorCSAgKHF0ZGVtdXhfdHJlZV9nZXRfc2libGluZ19ieV90eXBlKToKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSAgQXZvaWQgdm9pZCBwb2ludGVyIHVzYWdlLCBiZXR0ZXIgdXNlIGd1aW50OCAqIGluc3RlYWQuCisKKzIwMDYtMTAtMTYgMTg6MjI6NDcgKzAwMDAgIEpvc2VwIFRvcnJhIFZhbGxlcyA8am9zZXBAZmx1ZW5kby5jb20+CisKKwkgIEZpeCBhIGJ1bmNoIG9mIHByb2JsZW1zIGRpc2NvdmVyZWQgYnkgdGhlIEZvcnRlIGNvbXBpbGVyLCBtb3N0bHkgdHlwZSBtaXh1cHMgYW5kIHBvaW50ZXIgYXJpdGhtZXRpY3Mgd2l0aCB2b2lkIHBvaW50ZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSm9zZXAgVG9ycmEgVmFsbGVzICA8am9zZXAgYXQgZmx1ZW5kbyBjb20+CisJICAqIGV4dC9jYWlyby9nc3R0aW1lb3ZlcmxheS5jOiAoZ3N0X2NhaXJvX3RpbWVfb3ZlcmxheV90cmFuc2Zvcm0pOgorCSAgKiBleHQvZXNkL2VzZHNpbmsuYzogKGdzdF9lc2RzaW5rX3dyaXRlKToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfZGVjX2xlbmd0aCksCisJICAoZ3N0X2ZsYWNfZGVjX3JlYWRfc2Vla2FibGUpLCAoZ3N0X2ZsYWNfZGVjX2NoYWluKSwKKwkgIChnc3RfZmxhY19kZWNfc2VuZF9uZXdzZWdtZW50KToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOiAoZ3N0X2ZsYWNfZW5jX3NlZWtfY2FsbGJhY2spLAorCSAgKGdzdF9mbGFjX2VuY190ZWxsX2NhbGxiYWNrKToKKwkgICogZXh0L2pwZWcvc21va2Vjb2RlYy5jOiAoZmluZF9iZXN0X3NpemUpLCAoc21va2Vjb2RlY19lbmNvZGUpLAorCSAgKHNtb2tlY29kZWNfcGFyc2VfaGVhZGVyKSwgKHNtb2tlY29kZWNfZGVjb2RlKToKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzogKGdzdF9hdmlfbXV4X3dyaXRlX2F2aXhfaW5kZXgpOgorCSAgKiBnc3QvZGVidWcvZWZlbmNlLmM6IChnc3RfZmVuY2VkX2J1ZmZlcl9hbGxvYyk6CisJICAqIGdzdC9nb29tL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJICAqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOiAoZ3N0X2ljeWRlbXV4X3R5cGVmaW5kX29yX2ZvcndhcmQpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fcmVhZCk6CisJICAqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcnRyYWNrLmg6CisJICBGaXggYSBidW5jaCBvZiBwcm9ibGVtcyBkaXNjb3ZlcmVkIGJ5IHRoZSBGb3J0ZSBjb21waWxlciwgbW9zdGx5IHR5cGUKKwkgIG1peHVwcyBhbmQgcG9pbnRlciBhcml0aG1ldGljcyB3aXRoIHZvaWQgcG9pbnRlcnMuIEZpeGVzICMzNjI2MDMuCisKKzIwMDYtMTAtMTIgMTk6MDI6NTEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9zcGVleC86IE1pc2NlbGxhbmVvdXMgY2xlYW4tdXBzLCBhbW9uZyBvdGhlciB0aGluZ3M6IHNwZWV4ZW5jID0+IGVuYyB0byBlbmhhbmNlIGNvZGUgcmVhZGFiaWxpdHk7IGNoYW5nZSBzcGVleGVuYy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleF9lbmNfZ2V0X2Zvcm1hdHMpLAorCSAgKGdzdF9zcGVleF9lbmNfc2V0dXBfaW50ZXJmYWNlcyksIChnc3Rfc3BlZXhfZW5jX2Jhc2VfaW5pdCksCisJICAoZ3N0X3NwZWV4X2VuY19jbGFzc19pbml0KSwgKGdzdF9zcGVleF9lbmNfZmluYWxpemUpLAorCSAgKGdzdF9zcGVleF9lbmNfc2lua19zZXRjYXBzKSwgKGdzdF9zcGVleF9lbmNfY29udmVydF9zcmMpLAorCSAgKGdzdF9zcGVleF9lbmNfY29udmVydF9zaW5rKSwgKGdzdF9zcGVleF9lbmNfZ2V0X3F1ZXJ5X3R5cGVzKSwKKwkgIChnc3Rfc3BlZXhfZW5jX3NyY19xdWVyeSksIChnc3Rfc3BlZXhfZW5jX3NpbmtfcXVlcnkpLAorCSAgKGdzdF9zcGVleF9lbmNfaW5pdCksIChnc3Rfc3BlZXhfZW5jX2NyZWF0ZV9tZXRhZGF0YV9idWZmZXIpLAorCSAgKGdzdF9zcGVleF9lbmNfc2V0X2xhc3RfbXNnKSwgKGdzdF9zcGVleF9lbmNfc2V0dXApLAorCSAgKGdzdF9zcGVleF9lbmNfYnVmZmVyX2Zyb21fZGF0YSksIChnc3Rfc3BlZXhfZW5jX3B1c2hfYnVmZmVyKSwKKwkgIChnc3Rfc3BlZXhfZW5jX3NldF9oZWFkZXJfb25fY2FwcyksIChnc3Rfc3BlZXhfZW5jX3NpbmtldmVudCksCisJICAoZ3N0X3NwZWV4X2VuY19jaGFpbiksIChnc3Rfc3BlZXhfZW5jX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3NwZWV4X2VuY19zZXRfcHJvcGVydHkpLCAoZ3N0X3NwZWV4X2VuY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuaDoKKwkgIE1pc2NlbGxhbmVvdXMgY2xlYW4tdXBzLCBhbW9uZyBvdGhlciB0aGluZ3M6IHNwZWV4ZW5jID0+IGVuYyB0bworCSAgZW5oYW5jZSBjb2RlIHJlYWRhYmlsaXR5OyBjaGFuZ2Ugc3BlZXhlbmMgPT4gc3BlZXhfZW5jOyBpbiBjaGFpbgorCSAgZnVuY3Rpb24gdW5yZWYgaW5wdXQgYnVmZmVyIGluIGNhc2Ugb2YgZXJyb3I7IHRha2UgcmVmZXJlbmNlIGluCisJICBldmVudCBmdW5jdGlvbjsgdXNlIGJvaWxlcnBsYXRlIG1hY3JvOyB1c2UgZ3N0X3BhZF9xdWVyeV9wZWVyXyoKKwkgIGNvbnZlbmllbmNlIGZ1bmN0aW9ucy4KKworMjAwNi0xMC0xMiAxODozNToxMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6IEZpeCBzb21lIG1lbSBsZWFrcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleGVuY19maW5hbGl6ZSksCisJICAoZ3N0X3NwZWV4ZW5jX3NldF9sYXN0X21zZyksIChnc3Rfc3BlZXhlbmNfc2V0dXApLAorCSAgKGdzdF9zcGVleGVuY19zZXRfaGVhZGVyX29uX2NhcHMpOgorCSAgRml4IHNvbWUgbWVtIGxlYWtzLgorCisyMDA2LTEwLTExIDE2OjIxOjUzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9VUkxTOiBBZGRlZCBzb21lIG90aGVyIFVSTC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9VUkxTOgorCSAgQWRkZWQgc29tZSBvdGhlciBVUkwuCisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2xvb3BfdWRwKSwKKwkgIChnc3RfcnRzcHNyY19oYW5kbGVfcmVxdWVzdCksIChnc3RfcnRzcHNyY19zZW5kKSwKKwkgIChnc3RfcnRzcHNyY19vcGVuKSwgKGdzdF9ydHNwc3JjX3BsYXkpLAorCSAgKGdzdF9ydHNwc3JjX2hhbmRsZV9tZXNzYWdlKSwgKGdzdF9ydHNwc3JjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIFdvcmsgb24gZmFsbGJhY2sgdG8gVENQIGNvbm5lY3Rpb24gd2hlbiB0aGUgVURQIHNvY2tldCB0aW1lcyBvdXQuCisJICBIYW5kbGVyIHNlcnZlciByZXF1ZXN0cywganVzdCByZXBseSB3aXRoIE9LIGZvciBub3cuCisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmM6IChydHNwX3N0cnJlc3VsdCk6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmg6CisJICBBZGRlZCBzb21lIG1vcmUgUmVhbCBleHRlbnNpb24gaGVhZGVycy4KKwkgICogZ3N0L3J0c3AvcnRzcHVybC5jOiAocnRzcF91cmxfcGFyc2UpOgorCSAgRml4IHBhcnNpbmcgb2YgdXJscyB3aXRoIGEgJzonIHRoYXQgaXMgbm90IHBhcnQgb2YgdGhlIGhvc3RuYW1lOnBvcnQKKwkgIHBhcnQgb2YgdGhlIHVybC4KKworMjAwNi0xMC0xMSAxMzo0OToyNiArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGQgc29tZSBmb3VyY2MgZm9yIERWIGZvcm1hdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3ZpZGVvX2NhcHMpOgorCSAgQWRkIHNvbWUgZm91cmNjIGZvciBEViBmb3JtYXQuCisKKzIwMDYtMTAtMTEgMTM6MjQ6NDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC86IEFjdGl2YXRlIHBhZCBiZWZvcmUgYWRkaW5nIGl0IHRvIHRoZSBhbHJlYWR5LXJ1bm5pbmcgZWxlbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXBldGFnL2dzdHRhZ2RlbXV4LmM6IChnc3RfdGFnX2RlbXV4X2FkZF9zcmNwYWQpOgorCSAgKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzogKGdzdF9pY3lkZW11eF9hZGRfc3JjcGFkKToKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfaWQzZGVtdXhfYWRkX3NyY3BhZCk6CisJICBBY3RpdmF0ZSBwYWQgYmVmb3JlIGFkZGluZyBpdCB0byB0aGUgYWxyZWFkeS1ydW5uaW5nIGVsZW1lbnQuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ljeWRlbXV4LmM6IChpY3lkZW11eF9mb3VuZF9wYWQpOgorCSAgQWN0aXZhdGUgbmV3bHktY3JlYXRlZCBwYWQgdG9vLgorCisyMDA2LTEwLTExIDA4OjM0OjE0ICswMDAwICBTZWJhc3RpZW4gQ290ZSA8c2ViYXM2NDJAeWFob28uY2E+CisKKwkgIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IEZpeCBzb21lIGxlYWtzIGluIGNhcHMgYW5kIHVyaXMuIEZpeGVzICMzNjEyNTIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpZW4gQ290ZSA8c2ViYXM2NDIgYXQgeWFob28gZG90IGNhPgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfdWRwc3JjX2ZpbmFsaXplKSwgKGdzdF91ZHBzcmNfY3JlYXRlKSwgKGdzdF91ZHBzcmNfc2V0X3VyaSksCisJICAoZ3N0X3VkcHNyY19zdGFydCk6CisJICBGaXggc29tZSBsZWFrcyBpbiBjYXBzIGFuZCB1cmlzLiBGaXhlcyAjMzYxMjUyLgorCisyMDA2LTEwLTEwIDE4OjU0OjA1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFByaW50ZiBmb3JtYXQgZml4ZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZXh0cmFjdF9pbml0aWFsX2xlbmd0aF9hbmRfZm91cmNjKSwKKwkgIChnc3RfcXRkZW11eF9sb29wX3N0YXRlX2hlYWRlcik6CisJICBQcmludGYgZm9ybWF0IGZpeGVzLgorCSAgKiBzeXMvZHZiL2dzdGR2YnNyYy5jOgorCSAgVXNlICJfc3RkaW50LmgiLgorCisyMDA2LTEwLTEwIDA5OjU3OjE5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFJlb3JnYW5pc2Ugc29tZSBzdHVmZi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9pbml0KSwKKwkgIChnc3RfcXRkZW11eF9wdXNoX2V2ZW50KSwgKGdzdF9xdGRlbXV4X2RvX3NlZWspLAorCSAgKGdzdF9xdGRlbXV4X2NoYW5nZV9zdGF0ZSksIChleHRyYWN0X2luaXRpYWxfbGVuZ3RoX2FuZF9mb3VyY2MpLAorCSAgKGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfaGVhZGVyKSwgKGdzdF9xdGRlbXV4X2FjdGl2YXRlX3NlZ21lbnQpLAorCSAgKGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfbW92aWUpLCAoZ3N0X3F0ZGVtdXhfbG9vcCksCisJICAoZ3N0X3F0ZGVtdXhfcG9zdF9idWZmZXJpbmcpLCAoZ3N0X3F0ZGVtdXhfY2hhaW4pLAorCSAgKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pLCAocXRkZW11eF9wcm9jZXNzX3JlZGlyZWN0cyksCisJICAocXRkZW11eF9wYXJzZV90cmVlKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBSZW9yZ2FuaXNlIHNvbWUgc3R1ZmYuCisJICBQYXJzZSBSVFNQIHJlZGlyZWN0aW9uIFVSTFMuCisKKzIwMDYtMTAtMTAgMDg6Mjk6MDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC93YXZwYXJzZS9NYWtlZmlsZS5hbTogRml4IGNvcHknbidwYXN0ZS1vIChzcG90dGVkIGJ5IE1hcmsgTmF1d2VsYWVydHMsICMzNDE0ODkpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9NYWtlZmlsZS5hbToKKwkgIEZpeCBjb3B5J24ncGFzdGUtbyAoc3BvdHRlZCBieSBNYXJrIE5hdXdlbGFlcnRzLCAjMzQxNDg5KS4KKworMjAwNi0xMC0wOSAwNzowMToxOSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHN5cy92NGwyL2dzdHY0bDJ4b3ZlcmxheS4qOiBGaXggYnVpbGQgYXMgcGVyIHRoZSBwYXRjaCBpbiAjMzM4ODE4IGNvbW1lbnQgMzYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnhvdmVybGF5LmM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJ4b3ZlcmxheS5oOgorCSAgRml4IGJ1aWxkIGFzIHBlciB0aGUgcGF0Y2ggaW4gIzMzODgxOCBjb21tZW50IDM2LgorCisyMDA2LTEwLTA4IDIwOjA1OjEzICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJICBpbnNwZWN0IHVwZGF0ZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgaW5zcGVjdCB1cGRhdGVzCisKKzIwMDYtMTAtMDcgMjE6MTU6NDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogQWN0aXZhdGUgcGFkcyBiZWZvcmUgYWRkaW5nIHRoZW0gdG8gdGhlIHNvdXJjZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCk6CisJICBBY3RpdmF0ZSBwYWRzIGJlZm9yZSBhZGRpbmcgdGhlbSB0byB0aGUgc291cmNlLgorCisyMDA2LTEwLTA3IDExOjM3OjU5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBkb2NzL3BsdWdpbnMvOiBBZGQvdXBkYXRlIGRvY3Mgc3R1ZmYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0c2RlYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tbXMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXBlZzJlbmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmVvbi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdW5kdG91Y2gueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BjZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXN3ZmRlYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJICBBZGQvdXBkYXRlIGRvY3Mgc3R1ZmYuCisKKzIwMDYtMTAtMDYgMTc6MDA6MTQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIEFjdGl2YXRlIHBhZHMgYmVmb3JlIGFkZGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5jOiAoZ3N0X2R2ZGVtdXhfYWRkX3BhZHMpLCAoZ3N0X2R2ZGVtdXhfY2hhaW4pOgorCSAgKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6IChnc3RfYXVfcGFyc2VfYWRkX3NyY3BhZCk6CisJICBBY3RpdmF0ZSBwYWRzIGJlZm9yZSBhZGRpbmcuCisKKzIwMDYtMTAtMDYgMTY6MDM6MjMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzogQWN0aXZhdGUgcGFkcyBiZWZvcmUgYWRkaW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzogKGdzdF9tdWx0aXBhcnRfZGVtdXhfaW5pdCksCisJICAoZ3N0X211bHRpcGFydF9maW5kX3BhZF9ieV9taW1lKToKKwkgIEFjdGl2YXRlIHBhZHMgYmVmb3JlIGFkZGluZy4KKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYzogKGdzdF9ydHBfbXA0dl9kZXBheV9jbGFzc19pbml0KToKKwkgIEJPSUxFUlBMQVRFIHNldHMgcGFyZW50X2NsYXNzIGZvciB1cy4KKworMjAwNi0xMC0wNiAxNTo1NjowMSArMDAwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSAgQWRkIFJlcGxheUdhaW4gYW5hbHlzaXMgZWxlbWVudCAoIzM1NzA2OSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBSZW7DqSBTdGFkbGVyICA8bWFpbCBhdCByZW5lc3RhZGxlciBkZT4KKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGdzdC9yZXBsYXlnYWluL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6IChnc3RfcmdfYW5hbHlzaXNfYmFzZV9pbml0KSwKKwkgIChnc3RfcmdfYW5hbHlzaXNfY2xhc3NfaW5pdCksIChnc3RfcmdfYW5hbHlzaXNfaW5pdCksCisJICAoZ3N0X3JnX2FuYWx5c2lzX3NldF9wcm9wZXJ0eSksIChnc3RfcmdfYW5hbHlzaXNfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcmdfYW5hbHlzaXNfc3RhcnQpLCAoZ3N0X3JnX2FuYWx5c2lzX3NldF9jYXBzKSwKKwkgIChnc3RfcmdfYW5hbHlzaXNfdHJhbnNmb3JtX2lwKSwgKGdzdF9yZ19hbmFseXNpc19ldmVudCksCisJICAoZ3N0X3JnX2FuYWx5c2lzX3N0b3ApLCAoZ3N0X3JnX2FuYWx5c2lzX2hhbmRsZV90YWdzKSwKKwkgIChnc3RfcmdfYW5hbHlzaXNfaGFuZGxlX2VvcyksIChnc3RfcmdfYW5hbHlzaXNfdHJhY2tfcmVzdWx0KSwKKwkgIChnc3RfcmdfYW5hbHlzaXNfYWxidW1fcmVzdWx0KSwgKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3JlcGxheWdhaW4vZ3N0cmdhbmFseXNpcy5oOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9yZ2FuYWx5c2lzLmM6ICh5dWxlX2ZpbHRlciksIChidXR0ZXJfZmlsdGVyKSwKKwkgIChhcHBseV9maWx0ZXJzKSwgKHJlc2V0X2ZpbHRlcnMpLCAoYWNjdW11bGF0b3JfYWRkKSwKKwkgIChhY2N1bXVsYXRvcl9jbGVhciksIChhY2N1bXVsYXRvcl9yZXN1bHQpLCAocmdfYW5hbHlzaXNfbmV3KSwKKwkgIChyZ19hbmFseXNpc19zZXRfc2FtcGxlX3JhdGUpLCAocmdfYW5hbHlzaXNfZGVzdHJveSksCisJICAocmdfYW5hbHlzaXNfYW5hbHl6ZV9tb25vX2Zsb2F0KSwKKwkgIChyZ19hbmFseXNpc19hbmFseXplX3N0ZXJlb19mbG9hdCksCisJICAocmdfYW5hbHlzaXNfYW5hbHl6ZV9tb25vX2ludDE2KSwKKwkgIChyZ19hbmFseXNpc19hbmFseXplX3N0ZXJlb19pbnQxNiksIChyZ19hbmFseXNpc19hbmFseXplKSwKKwkgIChyZ19hbmFseXNpc190cmFja19yZXN1bHQpLCAocmdfYW5hbHlzaXNfYWxidW1fcmVzdWx0KSwKKwkgIChyZ19hbmFseXNpc19yZXNldF9hbGJ1bSksIChyZ19hbmFseXNpc19yZXNldCk6CisJICAqIGdzdC9yZXBsYXlnYWluL3JnYW5hbHlzaXMuaDoKKwkgIEFkZCBSZXBsYXlHYWluIGFuYWx5c2lzIGVsZW1lbnQgKCMzNTcwNjkpLgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jOiAoZ2V0X2V4cGVjdGVkX2dhaW4pLAorCSAgKHNldHVwX3JnYW5hbHlzaXMpLCAoY2xlYW51cF9yZ2FuYWx5c2lzKSwgKHNldF9wbGF5aW5nX3N0YXRlKSwKKwkgIChzZW5kX2Vvc19ldmVudCksIChzZW5kX3RhZ19ldmVudCksIChwb2xsX2VvcyksIChwb2xsX3RhZ3MpLAorCSAgKGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4pLCAoZmFpbF91bmxlc3NfdHJhY2tfcGVhayksCisJICAoZmFpbF91bmxlc3NfYWxidW1fZ2FpbiksIChmYWlsX3VubGVzc19hbGJ1bV9wZWFrKSwKKwkgIChmYWlsX2lmX3RyYWNrX3RhZ3MpLCAoZmFpbF9pZl9hbGJ1bV90YWdzKSwKKwkgIChmYWlsX3VubGVzc19udW1fdHJhY2tzKSwgKHRlc3RfYnVmZmVyX2NvbnN0X2Zsb2F0X21vbm8pLAorCSAgKHRlc3RfYnVmZmVyX2NvbnN0X2Zsb2F0X3N0ZXJlbyksICh0ZXN0X2J1ZmZlcl9jb25zdF9pbnQxNl9tb25vKSwKKwkgICh0ZXN0X2J1ZmZlcl9jb25zdF9pbnQxNl9zdGVyZW8pLCAodGVzdF9idWZmZXJfc3F1YXJlX2Zsb2F0X21vbm8pLAorCSAgKHRlc3RfYnVmZmVyX3NxdWFyZV9mbG9hdF9zdGVyZW8pLCAodGVzdF9idWZmZXJfc3F1YXJlX2ludDE2X21vbm8pLAorCSAgKHRlc3RfYnVmZmVyX3NxdWFyZV9pbnQxNl9zdGVyZW8pLCAocHVzaF9idWZmZXIpLCAoR1NUX1NUQVJUX1RFU1QpLAorCSAgKHJnYW5hbHlzaXNfc3VpdGUpLCAobWFpbik6CisJICBVbml0IHRlc3RzIGZvciB0aGUgbmV3IHJlcGxheWdhaW4gZWxlbWVudC4KKworMjAwNi0xMC0wNiAxNTo0OTozOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L2ZhYWQvZ3N0ZmFhZC5jOiBTb21lIGNsZWFudXBzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mYWFkL2dzdGZhYWQuYzogKGdzdF9mYWFkX3NldGNhcHMpLCAoZ3N0X2ZhYWRfY2hhaW4pLAorCSAgKGdzdF9mYWFkX2Nsb3NlX2RlY29kZXIpOgorCSAgU29tZSBjbGVhbnVwcy4KKwkgIEFkZGVkIHNvbWUgbW9yZSBkZWJ1Z2dpbmcuCisJICBEb24ndCBldmVyIGlnbm9yZSB1bmxpbmtlZCwgd2UncmUgbm90IGEgZGVtdXhlci4KKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfYWRkX3N0cmVhbSk6CisJICBBY3RpdmF0ZSBwYWQgYmVmb3JlIGFkZGluZyBpdCB0byB0aGUgZWxlbWVudC4KKworMjAwNi0xMC0wNiAxMjo1NTo1MyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy4qOiBSZXdvcmsgaG93IHRoZSB0cmFuc3BvcnQgc3RyaW5nIGlzIGNvbnN0cnVjdGVkLCB0cnkgdG8gc2hhcmUgY2hhbm5lbHMgYW5kIHVkcCBwb3J0cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcF9wcm90b19nZXRfdHlwZSksCisJICAoZ3N0X3J0c3BzcmNfY2xhc3NfaW5pdCksIChnc3RfcnRzcHNyY19pbml0KSwKKwkgIChnc3RfcnRzcHNyY19jcmVhdGVfc3RyZWFtKSwgKGdzdF9ydHNwc3JjX21lZGlhX3RvX2NhcHMpLAorCSAgKGdzdF9ydHNwc3JjX2FsbG9jX3VkcF9wb3J0cyksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV90cmFuc3BvcnQpLCAoZmluZF9zdHJlYW1fYnlfY2hhbm5lbCksCisJICAoZ3N0X3J0c3BzcmNfcHVzaF9ldmVudCksIChnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkKSwKKwkgIChnc3RfcnRzcHNyY19jcmVhdGVfdHJhbnNwb3J0c19zdHJpbmcpLAorCSAgKGdzdF9ydHNwc3JjX2NvbmZpZ3VyZV90cmFuc3BvcnRzKSwgKGdzdF9ydHNwc3JjX29wZW4pLAorCSAgKGdzdF9ydHNwc3JjX2hhbmRsZV9tZXNzYWdlKSwgKGdzdF9ydHNwc3JjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIFJld29yayBob3cgdGhlIHRyYW5zcG9ydCBzdHJpbmcgaXMgY29uc3RydWN0ZWQsIHRyeSB0byBzaGFyZSBjaGFubmVscworCSAgYW5kIHVkcCBwb3J0cy4KKwkgIE1ha2UgbW9zdCBvZiB0aGUgc3R1ZmYgbGVzcyBkZXBlbmRhbnQgb24gUlRQIGFzIHdlIGFyZSBhbHNvIGdvaW5nIHRvIHVzZQorCSAgaXQgZm9yIFJEVC4KKwkgIEFkZCBzdXBwb3J0IGZvciB0cmFuc3BvcnQgc3BlY2lmaWMgc2Vzc2lvbiBtYW5hZ2Vycy4KKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKHJ0c3BfY29ubmVjdGlvbl9mbHVzaCk6CisJICBJbXBsZW1lbnQgX2ZsdXNoKCkuCisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmM6IChydHNwX3N0cnJlc3VsdCk6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmg6CisJICBBZGQgZ2VuZXJpYyBlcnJvciByZXR1cm4gY29kZS4KKwkgICogZ3N0L3J0c3AvcnRzcGV4dC5oOgorCSAgQWRkIHN1cHBvcnQgZm9yIHBsdWdnYWJsZSB0cmFucG9ydCBzdHJpbmdzLgorCSAgKiBnc3QvcnRzcC9ydHNwZXh0d21zLmM6IChydHNwX2V4dF93bXNfYmVmb3JlX3NlbmQpLAorCSAgKHJ0c3BfZXh0X3dtc19hZnRlcl9zZW5kKSwgKHJ0c3BfZXh0X3dtc19wYXJzZV9zZHApLAorCSAgKHJ0c3BfZXh0X3dtc19nZXRfY29udGV4dCk6CisJICBEZXRlY3QgV01TZXJ2ZXIgYW5kIGFjdGl2YXRlIHRoZSBleHRlbnNpb24uCisJICAqIGdzdC9ydHNwL3J0c3B0cmFuc3BvcnQuYzogKHJ0c3BfdHJhbnNwb3J0X2dldF9taW1lKSwKKwkgIChydHNwX3RyYW5zcG9ydF9nZXRfbWFuYWdlciksIChydHNwX3RyYW5zcG9ydF9wYXJzZSk6CisJICAqIGdzdC9ydHNwL3J0c3B0cmFuc3BvcnQuaDoKKwkgIEFkZGVkIG1ldGhvZHMgdG8gZ2V0IG1pbWUvbWFuYWdlciBmb3IgY2VydGFpbiB0cmFuc3BvcnRzLgorCisyMDA2LTEwLTA2IDExOjMxOjExICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogRml4IG1lbSBsZWFrLCBhdm9pZCB1bm5lY2Vzc2FyeSBtZW1jcHkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IChnc3Rfc3BlY3RydW1fdHJhbnNmb3JtX2lwKToKKwkgIEZpeCBtZW0gbGVhaywgYXZvaWQgdW5uZWNlc3NhcnkgbWVtY3B5LgorCisyMDA2LTEwLTA2IDAyOjI5OjM1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiBSZW1vdmVkIGNydWZ0IGNvZGUgdGhhdCB3YXMganVzdCBjb21tZW50ZWQgb3V0LiBSZW1vdmVkIHNvbWUgb2Jzb2xldGUgZGVidWcgbG9ncyBzdGF0ZW1lbnRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX2luaXQpLAorCSAgKGdzdF9zcGVjdHJ1bV90cmFuc2Zvcm1faXApOgorCSAgUmVtb3ZlZCBjcnVmdCBjb2RlIHRoYXQgd2FzIGp1c3QgY29tbWVudGVkIG91dC4gUmVtb3ZlZCBzb21lIG9ic29sZXRlCisJICBkZWJ1ZyBsb2dzIHN0YXRlbWVudHMuCisKKzIwMDYtMTAtMDUgMTg6MTQ6NDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIEFub3RoZXIgYmF0Y2ggb2YgcHJpbnRmIGZvcm1hdCBmaXhlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHRzL2dzdGR0c2RlYy5jOiAoZ3N0X2R0c2RlY19jaGFpbik6CisJICAqIGV4dC9tdXNpY2JyYWluei9nc3R0cm0uYzogKGdzdF90cm1fc2V0Y2Fwcyk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogKGdzdF93YXZwYWNrX2VuY19zaW5rX3NldF9jYXBzKToKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfY2hhaW4pLCAocXRkZW11eF9wYXJzZSksCisJICAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IChnc3Rfc3BlY3RydW1fdHJhbnNmb3JtX2lwKToKKwkgIEFub3RoZXIgYmF0Y2ggb2YgcHJpbnRmIGZvcm1hdCBmaXhlcy4KKworMjAwNi0xMC0wNSAxNjozNzozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgUHJpbnRmIGZvcm1hdCBmaXhlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGltZW92ZXJsYXkuYzoKKwkgIChnc3RfY2Fpcm9fdGltZV9vdmVybGF5X3VwZGF0ZV9mb250X2hlaWdodCk6CisJICAqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmM6IChnc3RfcGl4YnVmc2NhbGVfdHJhbnNmb3JtX2NhcHMpOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6IChnc3RfanBlZ19kZWNfcGFyc2VfaW1hZ2VfZGF0YSk6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzogKGdzdF9qcGVnZW5jX2NoYWluKToKKwkgICogZXh0L2pwZWcvZ3N0c21va2VkZWMuYzogKGdzdF9zbW9rZWRlY19jaGFpbik6CisJICAqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmM6IChnc3Rfc21va2VlbmNfY2hhaW4pOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiAodXNlcl9lbmRyb3dfY2FsbGJhY2spOgorCSAgKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6IChnc3RfYXVfcGFyc2VfcGFyc2VfaGVhZGVyKToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdXBlcmluZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3BhcnNlX3N1YmluZGV4KSwgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9kYXRhKToKKwkgICogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzogKGdzdF9jdXR0ZXJfY2hhaW4pOgorCSAgKiBnc3QvZGVidWcvZWZlbmNlLmM6IChnc3RfZWZlbmNlX2J1ZmZlcl9hbGxvYyksCisJICAoZ3N0X2ZlbmNlZF9idWZmZXJfY29weSk6CisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiAoaWQzZGVtdXhfaWQzdjJfcGFyc2VfZnJhbWUpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfc3RyZWFtKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9zdGFydCk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX3NlbmQpLAorCSAgKGdzdF9ydHNwc3JjX2hhbmRsZV9tZXNzYWdlKToKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMpOgorCSAgKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzogKHhpbWFnZXV0aWxfeGNvbnRleHRfZ2V0KToKKwkgIFByaW50ZiBmb3JtYXQgZml4ZXMuCisKKzIwMDYtMTAtMDQgMjI6Mzc6MDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLio6IEhhbmRsZSBwYWNrZWQgWVVWIGZvcm1hdHMgKFVZVlksIFlVWTIsIFlVWVYpIHNlcGFyYXRlbHk7IGFsc28sIGZpeCBwYXNzdGhyb3VnaCBtb2RlOyBsYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6IChnc3RfdmlkZW9fY3JvcF9jbGFzc19pbml0KSwKKwkgIChnc3RfdmlkZW9fY3JvcF9pbml0KSwKKwkgIChnc3RfdmlkZW9fY3JvcF9nZXRfaW1hZ2VfZGV0YWlsc19mcm9tX2NhcHMpLAorCSAgKGdzdF92aWRlb19jcm9wX3RyYW5zZm9ybV9wYWNrZWRfY29tcGxleCksCisJICAoZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX3BhY2tlZF9zaW1wbGUpLAorCSAgKGdzdF92aWRlb19jcm9wX3RyYW5zZm9ybSksIChnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fY2FwcyksCisJICAoZ3N0X3ZpZGVvX2Nyb3Bfc2V0X2NhcHMpLAorCSAgKGdzdF92aWRlb2Nyb3BfY2xlYXJfbmVnb3RpYXRlZF9jYXBzX2xvY2tlZCksCisJICAoZ3N0X3ZpZGVvX2Nyb3Bfc2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuaDoKKwkgIEhhbmRsZSBwYWNrZWQgWVVWIGZvcm1hdHMgKFVZVlksIFlVWTIsIFlVWVYpIHNlcGFyYXRlbHk7IGFsc28sIGZpeAorCSAgcGFzc3Rocm91Z2ggbW9kZTsgbGFzdGx5LCBjbGVhciBuZWdvdGlhdGVkIGJhc2V0cmFuc2Zvcm0gY2FwcyB3aGVuCisJICB0aGUgY3JvcHBpbmcgY2hhbmdlcyBpbiBvcmRlciB0byBmb3JjZSByZW5lZ290aWF0aW9uLgorCisyMDA2LTEwLTA0IDIwOjA1OjA3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICB0ZXN0cy9pY2xlcy86IFZpc3VhbCB0ZXN0IGZvciB2aWRlb2Nyb3AsIHNob3dzIHRoYXQgcGFja2VkIHl1diBkb2Vzbid0IHdvcmsgcmlnaHQgeWV0LiAtLXdpdGgtZmZtcGVnY29sb3JzcGFjZSBvcHRpb24uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9pY2xlcy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvaWNsZXMvdmlkZW9jcm9wLXRlc3QuYzogKHF1aXRfbWFpbmxvb3ApLCAodGlja19jYiksCisJICAodGVzdF93aXRoX2NhcHMpLCAodmlkZW9fY3JvcF9nZXRfdGVzdF9jYXBzKSwgKG1haW4pOgorCSAgVmlzdWFsIHRlc3QgZm9yIHZpZGVvY3JvcCwgc2hvd3MgdGhhdCBwYWNrZWQgeXV2IGRvZXNuJ3Qgd29yayByaWdodAorCSAgeWV0LiAtLXdpdGgtZmZtcGVnY29sb3JzcGFjZSBvcHRpb24gZG9lc24ndCB3b3JrIHlldCBmb3IgdW5rbm93bgorCSAgcmVhc29ucyAoYW5vdGhlciBiYXNldHJhbnNmb3JtIGlzc3VlPykKKworMjAwNi0xMC0wNCAxNzo1MzoxMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvTWFrZWZpbGUuYW06IERpc3QgbmV3IC5oIGZpbGUgdG9vLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL01ha2VmaWxlLmFtOgorCSAgRGlzdCBuZXcgLmggZmlsZSB0b28uCisKKzIwMDYtMTAtMDQgMTc6MjQ6NDAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwLzogRmFjdG9yIG91dCBleHRlbnNpb24gaW4gc2VwYXJhdGUgbW9kdWxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuYzogKGdzdF9ydHBkZWNfZ2V0Y2FwcyksCisJICAoZ3N0X3J0cGRlY19jaGFpbl9ydHApLCAoZ3N0X3J0cGRlY19jaGFpbl9ydGNwKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfaW5pdCksCisJICAoZ3N0X3J0c3BzcmNfZmluYWxpemUpLCAoZ3N0X3J0c3BzcmNfY3JlYXRlX3N0cmVhbSksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfcnRwbWFwKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksIChnc3RfcnRzcHNyY19zZW5kKSwKKwkgIChnc3RfcnRzcHNyY19wYXJzZV9tZXRob2RzKSwgKGdzdF9ydHNwc3JjX29wZW4pLAorCSAgKGdzdF9ydHNwc3JjX3BsYXkpLCAoZ3N0X3J0c3BzcmNfaGFuZGxlX21lc3NhZ2UpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmM6IChydHNwX3N0cnJlc3VsdCk6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmg6CisJICAqIGdzdC9ydHNwL3J0c3BleHQuaDoKKwkgICogZ3N0L3J0c3AvcnRzcGV4dHdtcy5jOiAocnRzcF9leHRfd21zX3BhcnNlX3NkcCksCisJICAocnRzcF9leHRfd21zX2dldF9jb250ZXh0KToKKwkgICogZ3N0L3J0c3AvcnRzcGV4dHdtcy5oOgorCSAgKiBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0LmM6IChydHNwX3RyYW5zcG9ydF9pbml0KSwgKHBhcnNlX21vZGUpLAorCSAgKHJ0c3BfdHJhbnNwb3J0X3BhcnNlKToKKwkgICogZ3N0L3J0c3AvcnRzcHRyYW5zcG9ydC5oOgorCSAgRmFjdG9yIG91dCBleHRlbnNpb24gaW4gc2VwYXJhdGUgbW9kdWxlLgorCSAgRml4IGdldGNhcHMgdG8gZmlsdGVyIGFnYWluc3QgdGhlIHBhZHRlbXBsYXRlLgorCSAgVXNlIENvbnRlbnQtQmFzZSBpZiB0aGUgc2VydmVyIGdpdmVzIG9uZS4KKwkgIFJld29yayB0aGUgdHJhbnNwb3J0IHBhcnNpbmcgYSBiaXQgZm9yIGZ1dHVyZSBleHRlbnNpb25zLgorCSAgQWRkZWQgc29tZSBSZWFsIEhlYWRlciBmaWVsZCBkZWZpbml0aW9ucy4KKworMjAwNi0xMC0wNCAxMDoyOToxMSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGRvY3MvcGx1Z2lucy86IGFkZGVkIHY0bDIgc3R1YnMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgIGFkZGVkIHY0bDIgc3R1YnMKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgYWRkIHY0bDIKKworMjAwNi0xMC0wNCAxMDoyNDo0OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOiBFeHRyYWN0IGRpc2MvYWxidW0vbWVkaXVtIG51bWJlciBhbmQgY291bnQgYW5kIHRyeSBoYXJkZXIgdG8gZXh0cmFjdCB0cmFjayBudW1iZXIvY291bnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOiAoYXBlX2RlbXV4X3BhcnNlX3RhZ3MpOgorCSAgRXh0cmFjdCBkaXNjL2FsYnVtL21lZGl1bSBudW1iZXIgYW5kIGNvdW50IGFuZCB0cnkgaGFyZGVyCisJICB0byBleHRyYWN0IHRyYWNrIG51bWJlci9jb3VudC4KKworMjAwNi0xMC0wMyAxODozNjoyOSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIHRlc3RzL2ljbGVzLy5naXRpZ25vcmU6CisJICBtb2FwIGlnbm9yZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBtb2FwIGlnbm9yZQorCisyMDA2LTEwLTAzIDE4OjM1OjM0ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogdGVzdHMvaWNsZXMvTWFrZWZpbGUuYW06CisJICBhZGQgaWNsZSBmb3IgdjRsMgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgaWNsZSBmb3IgdjRsMgorCisyMDA2LTEwLTAzIDE4OjE1OjU4ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgYWRkIGJ1aWxkIHN0dWZmIGZvciB2NGwyLCBuZWVkcyAtLWVuYWJsZS1leHBlcmltZW50YWwgdW50aWwgdGhlIGxhc3QgYml0cyBhcmUgcmVzb2x2ZWQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIHN5cy9NYWtlZmlsZS5hbToKKwkgIGFkZCBidWlsZCBzdHVmZiBmb3IgdjRsMiwgbmVlZHMgLS1lbmFibGUtZXhwZXJpbWVudGFsIHVudGlsCisJICB0aGUgbGFzdCBiaXRzIGFyZSByZXNvbHZlZAorCisyMDA2LTEwLTAzIDEzOjQ3OjEwICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgY29tbWVudCBvdXQgdGhlIG5vdGlmaWVzIGZvciByZW1vdmVkIHByb3BlcnRpZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgY29tbWVudCBvdXQgdGhlIG5vdGlmaWVzIGZvciByZW1vdmVkIHByb3BlcnRpZXMKKworMjAwNi0xMC0wMyAxMzozMDo0OCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzogY29tbWVudCBvdXQgdGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgYWxyZWFkeSBwYXJ0IG9mIHRoZSB0dW5lciBpbnRlcmZhY2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgKGdzdF92NGwyX29iamVjdF9pbnN0YWxsX3Byb3BlcnRpZXNfaGVscGVyKToKKwkgIGNvbW1lbnQgb3V0IHRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIGFscmVhZHkgcGFydCBvZiB0aGUgdHVuZXIKKwkgIGludGVyZmFjZS4KKworMjAwNi0xMC0wMyAxMzoxODo1OSArMDAwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSAgc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiBJbXByb3ZlIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMTAtMDMgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgSW1wcm92ZSBkb2NzLgorCisyMDA2LTEwLTAyIDE2OjE0OjA2ICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIHN0b3AgcmVtb3ZpbmcgZ2RrcGl4YnVmIHBsdWdpbiBmcm9tIHBhY2thZ2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgc3RvcCByZW1vdmluZyBnZGtwaXhidWYgcGx1Z2luIGZyb20gcGFja2FnZQorCisyMDA2LTA5LTI5IDE1OjM5OjQxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogRGlzYWJsZSBhdXRvZGV0ZWN0IHRlc3QgdGVtcG9yYXJpbHksIHNvIHRoYXQgdGhlIGJ1aWxkIGJvdHMgdXBkYXRlIC1iYWQgYW5kIHRoZSByYW5rcyBvZiB1bnIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIERpc2FibGUgYXV0b2RldGVjdCB0ZXN0IHRlbXBvcmFyaWx5LCBzbyB0aGF0IHRoZSBidWlsZCBib3RzCisJICB1cGRhdGUgLWJhZCBhbmQgdGhlIHJhbmtzIG9mIHVucmVsaWFibGUgdmlkZW8gc2lua3MgaW4gdGhlcmUuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1dG9kZXRlY3QuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIFNraXAgdGVzdCBpZiBubyB1c2FibGUgdmlkZW9zaW5rIGlzIGZvdW5kLgorCisyMDA2LTA5LTI5IDE1OjM3OjI5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9VUkxTOiBBZGQgc29tZSBtb3JlIFVSTHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvVVJMUzoKKwkgIEFkZCBzb21lIG1vcmUgVVJMcy4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0c3BzcmNfaW5pdCksIChnc3RfcnRzcHNyY19maW5hbGl6ZSksCisJICAoZ3N0X3J0c3BzcmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9ydHNwc3JjX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX3NldHVwX3J0cCksIChnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkKSwKKwkgIChnc3RfcnRzcHNyY19sb29wX3VkcCksIChnc3RfcnRzcHNyY19sb29wX3NlbmRfY21kKSwKKwkgIChnc3RfcnRzcHNyY19sb29wKSwgKGdzdF9ydHNwc3JjX3NlbmQpLAorCSAgKGdzdF9ydHNwc3JjX3BhcnNlX21ldGhvZHMpLCAoZ3N0X3J0c3BzcmNfb3BlbiksCisJICAoZ3N0X3J0c3BzcmNfY2xvc2UpLCAoZ3N0X3J0c3BzcmNfcGxheSksIChnc3RfcnRzcHNyY19wYXVzZSksCisJICAoZ3N0X3J0c3BzcmNfaGFuZGxlX21lc3NhZ2UpLCAoZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgQWRkIHRpbWVvdXQgcHJvcGVydHkgdG8gY29udHJvbCBVRFAgdGltZW91dHMuCisJICBGaXggZXJyb3IgbWVzc2FnZXMuCisJICBBbHNvIHN0YXJ0IGEgbG9vcCBmdW5jdGlvbiB3aGVuIG9wZXJhdGluZyBpbiBVRFAgbW9kZSBzbyB0aGF0IHdlIGNhbgorCSAgZG8gc29tZSBtb3JlIHN0dWZmIGFzeW5jLgorCSAgSGFuZGxlIGVsZW1lbnQgbWVzc2FnZXMgZnJvbSB1ZHBzcmMgdG8gZGV0ZWN0IHRpbWVvdXRzLiBJZiBhIHRpbWVvdXQKKwkgIGhhcHBlbnMgd2UgY3VycmVudGx5IGdlbmVyYXRlIGFuIGVycm9yLgorCSAgQVBJOiBydHNwc3JjOjp0aW1lb3V0IHByb3BlcnR5LgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfdWRwc3JjX2NyZWF0ZSk6CisJICBSZWFsbHkgaW1wbGVtZW50IHRoZSB0aW1lb3V0IGluIG1pY3Jvc2Vjb25kcyBhbmQgbm90IG1pbGxpc2Vjb25kcy4KKworMjAwNi0wOS0yOSAxMTowOTo0MCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3VkcC9nc3R1ZHBzcmMuKjogQWRkZWQgcHJvcGVydHkgdG8gcG9zdCBhIG1lc3NhZ2Ugb24gdGltZW91dC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19jbGFzc19pbml0KSwgKGdzdF91ZHBzcmNfaW5pdCksCisJICAoZ3N0X3VkcHNyY19jcmVhdGUpLCAoZ3N0X3VkcHNyY19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF91ZHBzcmNfZ2V0X3Byb3BlcnR5KSwgKGdzdF91ZHBzcmNfdW5sb2NrKSwgKGdzdF91ZHBzcmNfc3RvcCk6CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmg6CisJICBBZGRlZCBwcm9wZXJ0eSB0byBwb3N0IGEgbWVzc2FnZSBvbiB0aW1lb3V0LgorCSAgVXBkYXRlZCBkb2NzLgorCSAgV2hlbiByZXN0YXJ0aW5nIHRoZSBzZWxlY3QsIGluaXRpYWxpemUgdGhlIGZkc2V0cyBhZ2Fpbi4KKwkgIEluaXQgY29udHJvbCBzb2NrZXRzIHNvIHdlIGRvbid0IGFjY2lkZW50YWxseSBjbG9zZSBhIHJhbmRvbSBzb2NrZXQuCisJICBBUEk6IEdzdFVEUFNyYzo6dGltZW91dCBwcm9wZXJ0eQorCisyMDA2LTA5LTI5IDA4OjE1OjA1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IEZpeCBmbGFnIHJlZ2lzdHJhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcF9wcm90b19nZXRfdHlwZSk6CisJICBGaXggZmxhZyByZWdpc3RyYXRpb24uCisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fcmVhZCk6CisJICBSZWFkaW5nIDAgYWxzbyBtZWFucyAnbm8gbW9yZSBjb21tYW5kcycKKworMjAwNi0wOS0yOSAwODowOToyNCArMDAwMCAgQW50b2luZSBUcmVtYmxheSA8aGV4YTAwQGdtYWlsLmNvbT4KKworCSAgZ3N0L3VkcC9nc3R1ZHBzcmMuYzogRml4IHBvc3NpYmxlIGluZmluaXRlIGxvb3Agd2hlbiBzaHV0dGluZyBkb3duLCBhIHJlYWQgY2FuIGFsc28gcmV0dXJuIDAgdG8gaW5kaWNhdGUgbm8gbW9yZSBtZXNzLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBBbnRvaW5lIFRyZW1ibGF5IDxoZXhhMDAgYXQgZ21haWwgZG90IGNvbT4KKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfY3JlYXRlKToKKwkgIEZpeCBwb3NzaWJsZSBpbmZpbml0ZSBsb29wIHdoZW4gc2h1dHRpbmcgZG93biwgYSByZWFkIGNhbiBhbHNvIHJldHVybgorCSAgMCB0byBpbmRpY2F0ZSBubyBtb3JlIG1lc3NhZ2VzIGFyZSBhdmFpbGFibGUuIEZpeGVzICMzNTgxNTYuCisKKzIwMDYtMDktMjggMTc6MDg6NDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHN5cy92NGwyLzogRnJhbWVyYXRlIGNhbiBiZSAwLzEgdG9vLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogKGdzdF92NGwyc3JjX2dldF9hbGxfY2FwcyksCisJICAoZ3N0X3Y0bDJzcmNfZ2V0X2NhcHMpOgorCSAgKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6IChnc3RfdjRsMl9maWxsX2xpc3RzKToKKwkgIEZyYW1lcmF0ZSBjYW4gYmUgMC8xIHRvby4KKwkgIEluaXQgZnJhbWVyYXRlIHRvIDAvMSBiZWZvcmUgcXVlcnlpbmcgaXQgc28gdGhhdCB3ZSBjYW4gZGV0ZWN0CisJICBkZXZpY2VzIHRoYXQgZG9uJ3Qga25vdyBhYm91dCBhIGZyYW1lcmF0ZS4KKwkgIEFkZCBzb21lIG1vcmUgZGVidWdnaW5nIGluZm8uCisKKzIwMDYtMDktMjggMTQ6MzE6NDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQWRkIHN1cHBvcnQgZm9yICd5djEyJyBmb3VyY2MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF92aWRlb19jYXBzKToKKwkgIEFkZCBzdXBwb3J0IGZvciAneXYxMicgZm91cmNjLgorCisyMDA2LTA5LTI3IDE3OjQ3OjU3ICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkqIHRlc3RzL2ljbGVzL3Y0bDJzcmMtdGVzdC5jOgorCSAgUmVtb3ZlZCBzZXQtdW5kZWYtZnBzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBSZW1vdmVkIHNldC11bmRlZi1mcHMuCisKKzIwMDYtMDktMjcgMTc6MDQ6MjIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHN5cy92NGwyLzogUmVuYW1lZCBzb21lIHByb3BlcnRpZXMgdG8gbWF0Y2ggdGhlIHR1bmVyIGludGVyZmFjZSBuYW1pbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgKGdzdF92NGwyX29iamVjdF9pbnN0YWxsX3Byb3BlcnRpZXNfaGVscGVyKSwgKGdzdF92NGwyX29iamVjdF9uZXcpLAorCSAgKGdzdF92NGwyX29iamVjdF9zZXRfcHJvcGVydHlfaGVscGVyKSwKKwkgIChnc3RfdjRsMl9vYmplY3RfZ2V0X3Byb3BlcnR5X2hlbHBlciksIChnc3RfdjRsMl9zZXRfZGVmYXVsdHMpOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogKGdzdF92NGwyc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF92NGwyc3JjX2NyZWF0ZSk6CisJICAqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOiAoZ3N0X3Y0bDJfdHVuZXJfY29udGFpbnNfY2hhbm5lbCksCisJICAoZ3N0X3Y0bDJfdHVuZXJfbGlzdF9jaGFubmVscyksCisJICAoZ3N0X3Y0bDJfdHVuZXJfc2V0X2NoYW5uZWxfYW5kX25vdGlmeSksCisJICAoZ3N0X3Y0bDJfdHVuZXJfZ2V0X2NoYW5uZWwpLCAoZ3N0X3Y0bDJfdHVuZXJfY29udGFpbnNfbm9ybSksCisJICAoZ3N0X3Y0bDJfdHVuZXJfbGlzdF9ub3JtcyksIChnc3RfdjRsMl90dW5lcl9zZXRfbm9ybV9hbmRfbm90aWZ5KSwKKwkgIChnc3RfdjRsMl90dW5lcl9nZXRfbm9ybSk6CisJICAqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzogKGdzdF92NGwyX2dldF9jYXBhYmlsaXRpZXMpLAorCSAgKGdzdF92NGwyX2ZpbGxfbGlzdHMpLCAoZ3N0X3Y0bDJfZW1wdHlfbGlzdHMpOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IChnc3RfdjRsMnNyY19nZXRfZnBzKToKKwkgIFJlbmFtZWQgc29tZSBwcm9wZXJ0aWVzIHRvIG1hdGNoIHRoZSB0dW5lciBpbnRlcmZhY2UgbmFtaW5nLgorCisyMDA2LTA5LTI3IDE2OjE0OjE4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBTbWFsbCBjbGVhbnVwcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6IChnc3RfdjRsMl9vYmplY3Rfc2V0X3Byb3BlcnR5X2hlbHBlciksCisJICAoZ3N0X3Y0bDJfc2V0X2RlZmF1bHRzKToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfZ2V0X3JlYWQpLAorCSAgKGdzdF92NGwyc3JjX2NyZWF0ZSk6CisJICAqIHN5cy92NGwyL2dzdHY0bDJ4b3ZlcmxheS5jOiAoZ3N0X3Y0bDJfeG92ZXJsYXlfb3Blbik6CisJICAqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzogKGdzdF92NGwyX2dldF9jYXBhYmlsaXRpZXMpLAorCSAgKGdzdF92NGwyX2ZpbGxfbGlzdHMpLCAoZ3N0X3Y0bDJfb3BlbiksIChnc3RfdjRsMl9zZXRfbm9ybSksCisJICAoZ3N0X3Y0bDJfZ2V0X2ZyZXF1ZW5jeSksIChnc3RfdjRsMl9zZXRfZnJlcXVlbmN5KSwKKwkgIChnc3RfdjRsMl9zaWduYWxfc3RyZW5ndGgpLCAoZ3N0X3Y0bDJfZ2V0X2F0dHJpYnV0ZSksCisJICAoZ3N0X3Y0bDJfc2V0X2F0dHJpYnV0ZSksIChnc3RfdjRsMl9nZXRfaW5wdXQpLAorCSAgKGdzdF92NGwyX3NldF9pbnB1dCk6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX2ZpbGxfZm9ybWF0X2xpc3QpLAorCSAgKGdzdF92NGwyc3JjX2dyYWJfZnJhbWUpLCAoZ3N0X3Y0bDJzcmNfZ2V0X2NhcHR1cmUpLAorCSAgKGdzdF92NGwyc3JjX3NldF9jYXB0dXJlKSwgKGdzdF92NGwyc3JjX2NhcHR1cmVfaW5pdCksCisJICAoZ3N0X3Y0bDJzcmNfY2FwdHVyZV9zdGFydCksIChnc3RfdjRsMnNyY19jYXB0dXJlX3N0b3ApLAorCSAgKGdzdF92NGwyc3JjX2J1ZmZlcl9uZXcpOgorCSAgKiB0ZXN0cy9pY2xlcy92NGwyc3JjLXRlc3QuYzogKG15X2J1c19jYWxsYmFjayksIChtYWluKToKKwkgIFNtYWxsIGNsZWFudXBzLgorCSAgRml4IGVycm9yIG1lc3NhZ2VzLgorCSAgVXNlIGxvY2tzIHdoZW4gZ2V0dGluZyB0aW1lc3RhbXBzLgorCSAgRml4IGxlYWtzIGluIHRlc3QuCisJICBBZGQgbGljZW5zaW5nIGhlYWRlciB0byB0ZXN0cy4KKworMjAwNi0wOS0yNyAxNToxNDowNyArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuYzoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHRlc3RzL2ljbGVzL3Y0bDJzcmMtdGVzdC5jOgorCSAgU29tZSBjbGVhbnVwcyBhbmQgY29tbWVudHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFNvbWUgY2xlYW51cHMgYW5kIGNvbW1lbnRzLgorCisyMDA2LTA5LTI3IDEzOjQxOjM1ICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIGFkZCBhdWRpb2Z4IHBsdWdpbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgYXVkaW9meCBwbHVnaW4KKworMjAwNi0wOS0yNiAxNDoxNzo1NCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZG9jcy9wbHVnaW5zLzogQWRkIHY0bDIgcGx1Z2luIHRvIHRoZSBkb2NzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgIEFkZCB2NGwyIHBsdWdpbiB0byB0aGUgZG9jcy4KKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfZ2V0X3JlYWQpLAorCSAgKGdzdF92NGwyc3JjX2dldF9tbWFwKSwgKGdzdF92NGwyc3JjX2NyZWF0ZSk6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnZpZG9yaWVudC5jOgorCSAgRml4IGRvY3MuCisJICBSZW1vdmUgc29tZSBtb3JlIGV4dGVybnMuCisKKzIwMDYtMDktMjYgMTM6MTg6MDYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHN5cy92NGwyL01ha2VmaWxlLmFtOiBGaXggbWFrZWZpbGUsIGxpc3QgbGlicyBpbiBzdGFjayBvcmRlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkgIEZpeCBtYWtlZmlsZSwgbGlzdCBsaWJzIGluIHN0YWNrIG9yZGVyLgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuaDoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOiAoZ3N0X3Y0bDJfZGV2aWNlX2dldF90eXBlKSwKKwkgIChnc3RfdjRsMl9vYmplY3RfaW5zdGFsbF9wcm9wZXJ0aWVzX2hlbHBlcik6CisJICAqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfZ2V0X3JlYWQpLAorCSAgKGdzdF92NGwyc3JjX2dldF9tbWFwKSwgKGdzdF92NGwyc3JjX2NyZWF0ZSk6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmg6CisJICAqIHN5cy92NGwyL2dzdHY0bDJ2aWRvcmllbnQuaDoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnhvdmVybGF5Lmg6CisJICAqIHN5cy92NGwyL3Y0bDJfY2FsbHMuaDoKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5oOgorCSAgRml4IGNvZGluZyBzdHlsZToKKwkgIC0gUmVtb3ZlIGV4dGVybiBmcm9tIGZ1bmN0aW9ucy4KKwkgIC0gRml4IGhlYWRlciBpbmRlbnRhdGlvbi4KKwkgIEZpeCBGbGFncywgYWRkIGRlZmF1bHRzIGZvciBwcm9wZXJ0aWVzLgorCSAgUmVtb3ZlIHVudXNlZCBlbnVtcy4KKwkgIEZpeCBUT09fTEFaWSBpbiBlcnJvciBtZXNzYWdlcy4KKworMjAwNi0wOS0yNiAxMTowNjoxNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgc3lzL3Y0bDIvOiBGaXggcGFzcyBhdCBjb2RlIGNsZWFudXBzLCBtb3ZlIGVycm9ycyBjYXNlcyBvdXQgb2YgdGhlIG5vcm1hbCBmbG93IGZvciBhZGRpdGlvbmFsIGNvZGUgY2xhcml0eS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6IChnc3RfdjRsMl9jbGFzc19wcm9iZV9kZXZpY2VzKSwKKwkgIChnc3RfdjRsMl9wcm9iZV9uZWVkc19wcm9iZSksCisJICAoZ3N0X3Y0bDJfb2JqZWN0X2luc3RhbGxfcHJvcGVydGllc19oZWxwZXIpLCAoZ3N0X3Y0bDJfb2JqZWN0X25ldyksCisJICAoZ3N0X3Y0bDJfb2JqZWN0X2Rlc3Ryb3kpLCAoZ3N0X3Y0bDJfb2JqZWN0X3NldF9wcm9wZXJ0eV9oZWxwZXIpLAorCSAgKGdzdF92NGwyX29iamVjdF9nZXRfcHJvcGVydHlfaGVscGVyKSwgKGdzdF92NGwyX3NldF9kZWZhdWx0cyksCisJICAoZ3N0X3Y0bDJfb2JqZWN0X3N0YXJ0KSwgKGdzdF92NGwyX29iamVjdF9zdG9wKToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfdjRsMnNyY19pbml0KSwgKGdzdF92NGwyc3JjX2Rpc3Bvc2UpLAorCSAgKGdzdF92NGwyc3JjX3NldF9wcm9wZXJ0eSksIChnc3RfdjRsMnNyY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF92NGwyc3JjX2ZpeGF0ZSksIChnc3RfdjRsMnNyY19nZXRfY2FwcyksCisJICAoZ3N0X3Y0bDJzcmNfc2V0X2NhcHMpLCAoZ3N0X3Y0bDJzcmNfZ2V0X3JlYWQpLAorCSAgKGdzdF92NGwyc3JjX2dldF9tbWFwKSwgKGdzdF92NGwyc3JjX2NyZWF0ZSk6CisJICAqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzogKGdzdF92NGwyX2dldF9jYXBhYmlsaXRpZXMpLAorCSAgKGdzdF92NGwyX29wZW4pLCAoZ3N0X3Y0bDJfY2xvc2UpLCAoZ3N0X3Y0bDJfZ2V0X25vcm0pLAorCSAgKGdzdF92NGwyX3NldF9ub3JtKSwgKGdzdF92NGwyX2dldF9mcmVxdWVuY3kpLAorCSAgKGdzdF92NGwyX3NldF9mcmVxdWVuY3kpLCAoZ3N0X3Y0bDJfc2lnbmFsX3N0cmVuZ3RoKSwKKwkgIChnc3RfdjRsMl9nZXRfYXR0cmlidXRlKSwgKGdzdF92NGwyX3NldF9hdHRyaWJ1dGUpLAorCSAgKGdzdF92NGwyX2dldF9pbnB1dCksIChnc3RfdjRsMl9zZXRfaW5wdXQpOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IChnc3RfdjRsMnNyY19maWxsX2Zvcm1hdF9saXN0KSwKKwkgIChnc3RfdjRsMnNyY19xdWV1ZV9mcmFtZSksIChnc3RfdjRsMnNyY19ncmFiX2ZyYW1lKSwKKwkgIChnc3RfdjRsMnNyY19nZXRfY2FwdHVyZSksIChnc3RfdjRsMnNyY19zZXRfY2FwdHVyZSksCisJICAoZ3N0X3Y0bDJzcmNfY2FwdHVyZV9pbml0KSwgKGdzdF92NGwyc3JjX2NhcHR1cmVfc3RhcnQpLAorCSAgKGdzdF92NGwyc3JjX2NhcHR1cmVfc3RvcCksIChnc3RfdjRsMnNyY19jYXB0dXJlX2RlaW5pdCksCisJICAoZ3N0X3Y0bDJzcmNfZ2V0X3NpemVfbGltaXRzKSwgKGdzdF92NGwyc3JjX3NldF9mcHMpLAorCSAgKGdzdF92NGwyc3JjX2dldF9mcHMpLCAoZ3N0X3Y0bDJzcmNfYnVmZmVyX2ZpbmFsaXplKSwKKwkgIChnc3RfdjRsMnNyY19idWZmZXJfbmV3KToKKwkgIEZpeCBwYXNzIGF0IGNvZGUgY2xlYW51cHMsIG1vdmUgZXJyb3JzIGNhc2VzIG91dCBvZiB0aGUgbm9ybWFsCisJICBmbG93IGZvciBhZGRpdGlvbmFsIGNvZGUgY2xhcml0eS4KKworMjAwNi0wOS0yNSAxMzo1NTo0NCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2F1dG9kZXRlY3QvOiBTbWFsbCBjbGVhbnVwcy4gZG9uJ3QgdHJ5IHRvIHNldCAic3luYyIgcHJvcGVydHkgd2hlbiBpdCBpcyBub3QgYXZhaWxhYmxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkgIChnc3RfYXV0b19hdWRpb19zaW5rX2Jhc2VfaW5pdCksIChnc3RfYXV0b19hdWRpb19zaW5rX2NsYXNzX2luaXQpLAorCSAgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfZmluZF9iZXN0KToKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jOiAoZ3N0X2F1dG9fdmlkZW9fc2lua19kZXRlY3QpOgorCSAgU21hbGwgY2xlYW51cHMuCisJICBkb24ndCB0cnkgdG8gc2V0ICJzeW5jIiBwcm9wZXJ0eSB3aGVuIGl0IGlzIG5vdCBhdmFpbGFibGUuCisKKzIwMDYtMDktMjUgMTE6NDc6NDIgKzAwMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJICBnc3QvOiBJbmNsdWRlIHN0ZGxpYi5oIGluIHNvbWUgbW9yZSBwbGFjZXMsIG1ha2VzIHRoaW5ncyBjb21waWxlIHdpdGggdUNsaWJjIGFuZCAtV2Vycm9yICgjMzU3NTkyKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFBldGVyIEtqZWxsZXJzdGVkdCAgPHBraiBhdCBheGlzIGNvbT4KKwkgICogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICBJbmNsdWRlIHN0ZGxpYi5oIGluIHNvbWUgbW9yZSBwbGFjZXMsIG1ha2VzIHRoaW5ncyBjb21waWxlCisJICB3aXRoIHVDbGliYyBhbmQgLVdlcnJvciAoIzM1NzU5MikuCisKKzIwMDYtMDktMjUgMDk6MTU6MTAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogb3VyIGNvZGUgc2hvdWxkIGhhbmRsZSB0aGF0IGZpbmUuIFNvbWUgb2YgdGhlIGJ1dHRvbnMgb24gdGhlIGFwcGxlIHRyYWlsZXIgc2l0ZSBhcmUgYXBwYXJlbnRseS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIFNldCBtaW5pbXVtIGhlaWdodCB0byA4IChmcm9tIDE2KSwgb3VyIGNvZGUgc2hvdWxkIGhhbmRsZQorCSAgdGhhdCBmaW5lLiBTb21lIG9mIHRoZSBidXR0b25zIG9uIHRoZSBhcHBsZSB0cmFpbGVyIHNpdGUKKwkgIGFyZSBhcHBhcmVudGx5IG9ubHkgMTUgcGl4ZWxzIGhpZ2ggKHNlZSAjMzU3NDcwKS4KKworMjAwNi0wOS0yMyAxNTozMTo1NiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvOiBJbXByb3ZlIGVycm9yIHJlcG9ydGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19sb29wKSwgKGdzdF9ydHNwc3JjX3NlbmQpLAorCSAgKGdzdF9ydHNwc3JjX29wZW4pOgorCSAgKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOiAocnRzcF9jb25uZWN0aW9uX2NyZWF0ZSksCisJICAocnRzcF9jb25uZWN0aW9uX2Nvbm5lY3QpLCAocnRzcF9jb25uZWN0aW9uX3JlYWQpLCAocmVhZF9ib2R5KSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fcmVjZWl2ZSk6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmM6IChydHNwX3N0cnJlc3VsdCk6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmg6CisJICBJbXByb3ZlIGVycm9yIHJlcG9ydGluZy4KKworMjAwNi0wOS0yMyAxNTozMDo0MCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IEZpeCBrbGFzcyB0eXBvcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jOiAoZ3N0X2FzdGVyaXNraDI2M19wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzogKGdzdF9ydHBfTDE2ZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6IChnc3RfcnRwX2Ftcl9kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOiAoZ3N0X3J0cF9nc21fZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzogKGdzdF9ydHBfaDI2M3BfZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOiAoZ3N0X3J0cF9oMjY0X2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzogKGdzdF9ydHBfaWxiY19kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6IChnc3RfcnRwX21wMnRfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9tcDJ0X2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzogKGdzdF9ydHBfbXA0Z19kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6IChnc3RfcnRwX21wNHZfZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6IChnc3RfcnRwX21wYV9kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6IChnc3RfcnRwX3BjbWFfZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbXVkZXBheS5jOiAoZ3N0X3J0cF9wY211X2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmM6IChnc3RfcnRwX3NwZWV4X2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzogKGdzdF9ydHBfc3Yzdl9kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzogKGdzdF9ydHBfdm9yYmlzX2RlcGF5X3BsdWdpbl9pbml0KToKKwkgIEZpeCBrbGFzcyB0eXBvcy4KKwkgIE1hcmsgUkFOS19NQVJHSU5BTCwgZGVjb2RlYmluIGNhbiBoYW5kbGUgdGhlIGRlcGF5bG9hZGVycyBmaW5lLgorCisyMDA2LTA5LTIyIDE3OjUzOjQ4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IE5lZWQgIC1iYXNlIENWUyBmb3IgZ3N0X2Jhc2VfcnRwX2RlcGF5bG9hZF9wdXNoX3RzKCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgTmVlZCAgLWJhc2UgQ1ZTIGZvciBnc3RfYmFzZV9ydHBfZGVwYXlsb2FkX3B1c2hfdHMoKS4KKworMjAwNi0wOS0yMiAxNzoyMjozNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBEb24ndCBjaGVjayBmb3IgYSB0YWcgdGhhdCBpcyBuZXZlciB0aGVyZSBhbmQgY2hlY2sgaWYgd2UgcmVhZCB0aGUgY29ycmVjdCB0YWcuIEZpeGVzIHNlZWtpbmcgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5kZXgpOgorCSAgRG9uJ3QgY2hlY2sgZm9yIGEgdGFnIHRoYXQgaXMgbmV2ZXIgdGhlcmUgYW5kIGNoZWNrIGlmIHdlIHJlYWQgdGhlCisJICBjb3JyZWN0IHRhZy4gRml4ZXMgc2Vla2luZyBhZ2Fpbi4KKwkgIFdlIG11c3QgcG9zdCBhbiBlcnJvciB3aGVuIGFsbCBwYWRzIGFyZSB1bmxpbmtlZC4KKworMjAwNi0wOS0yMiAxNToxNToxMyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IE1vcmUgZml4YWdlLCBzZXQgZW5kb2Rlci1wYXJhbXMgY29ycmVjdGx5IGluIHRoZSBwYXlsb2FkZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOiAoZ3N0X3J0cF92b3JiaXNfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6IChnc3RfcnRwX3ZvcmJpc19wYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF92b3JiaXNfcGF5X3Jlc2V0X3BhY2tldCksCisJICAoZ3N0X3J0cF92b3JiaXNfcGF5X2luaXRfcGFja2V0KSwKKwkgIChnc3RfcnRwX3ZvcmJpc19wYXlfZmx1c2hfcGFja2V0KSwgKGdzdF9ydHBfdm9yYmlzX3BheV9wYXJzZV9pZCksCisJICAoZ3N0X3J0cF92b3JiaXNfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgTW9yZSBmaXhhZ2UsIHNldCBlbmRvZGVyLXBhcmFtcyBjb3JyZWN0bHkgaW4gdGhlIHBheWxvYWRlci4KKworMjAwNi0wOS0yMiAxMjoxMjoxMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F1dG9kZXRlY3QvOiBNYWtlIHN0YXRpYyBwYWQgdGVtcGxhdGVzIHN0YXRpYyB0byBhcHBlYXNlIHZhbGdyaW5kJ3MgbGVhayBkZXRlY3Rvci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJICAoZ3N0X2F1dG9fYXVkaW9fc2lua19iYXNlX2luaXQpOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJICAoZ3N0X2F1dG9fdmlkZW9fc2lua19iYXNlX2luaXQpOgorCSAgTWFrZSBzdGF0aWMgcGFkIHRlbXBsYXRlcyBzdGF0aWMgdG8gYXBwZWFzZSB2YWxncmluZCdzIGxlYWsKKwkgIGRldGVjdG9yLgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXV0b2RldGVjdC5jOiAoR1NUX1NUQVJUX1RFU1QpLAorCSAgKGF1dG9kZXRlY3Rfc3VpdGUpOgorCSAgQWRkIHNpbXBsZSB0ZXN0IGZvciB0aGUgZ2hvc3RwYWQgbG9ja3VwIG9uIHNodXRkb3duIGZpeGVkIGluIGNvcmUKKwkgIENWUyAoYXVkaW8gYml0IGRpc2FibGVkIGJlY2F1c2UgaXQgd291bGQgbmVlZCBkb3plbnMgb2YgYWxzYQorCSAgc3VwcHJlc3Npb25zIGFuZCBJJ20gdG9vIGxhenkgdG8gYWRkIHRob3NlIG5vdykuCisKKzIwMDYtMDktMjIgMTI6MDg6MTQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvOiBTbWFsbCBjbGVhbnVwcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5LmM6IChnc3RfcnRwX0wxNmRlcGF5X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6IChnc3RfcnRwX21wNGdfZGVwYXlfY2xhc3NfaW5pdCk6CisJICBTbWFsbCBjbGVhbnVwcy4KKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOiAoZ3N0X3J0cF92b3JiaXNfZGVwYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX3ZvcmJpc19kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfdm9yYmlzX2RlcGF5X2luaXQpLAorCSAgKGdzdF9ydHBfdm9yYmlzX2RlcGF5X2ZpbmFsaXplKSwgKGdzdF9ydHBfdm9yYmlzX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfdm9yYmlzX2RlcGF5X3Byb2Nlc3MpLAorCSAgKGdzdF9ydHBfdm9yYmlzX2RlcGF5X3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF92b3JiaXNfZGVwYXlfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX3ZvcmJpc19kZXBheV9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9ydHBfdm9yYmlzX2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOiAoZ3N0X3J0cF92b3JiaXNfcGF5X2Jhc2VfaW5pdCksCisJICAoZ3N0X3J0cF92b3JiaXNfcGF5X2NsYXNzX2luaXQpLCAoZ3N0X3J0cF92b3JiaXNfcGF5X2luaXQpLAorCSAgKGdzdF9ydHBfdm9yYmlzX3BheV9zZXRjYXBzKSwgKGdzdF9ydHBfdm9yYmlzX3BheV9pbml0X3BhY2tldCksCisJICAoZ3N0X3J0cF92b3JiaXNfcGF5X2ZsdXNoX3BhY2tldCksCisJICAoZ3N0X3J0cF92b3JiaXNfcGF5X2FwcGVuZF9idWZmZXIpLAorCSAgKGdzdF9ydHBfdm9yYmlzX3BheV9oYW5kbGVfYnVmZmVyKSwKKwkgIChnc3RfcnRwX3ZvcmJpc19wYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5oOgorCSAgQWRkIGV4cGVyaW1lbnRhbCB2b3JiaXMgcGF5IGFuZCBkZXBheWxvYWRlcnMuCisKKzIwMDYtMDktMjEgMTM6MzM6MTYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOiBGaXggcHJvZmlsZS1sZXZlbC1pZCBwYXJzaW5nIGFuZCBzZXR1cC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzogKGdzdF9ydHBfbXA0Z19wYXlfcGFyc2VfYXVkaW9fY29uZmlnKToKKwkgIEZpeCBwcm9maWxlLWxldmVsLWlkIHBhcnNpbmcgYW5kIHNldHVwLgorCisyMDA2LTA5LTIxIDA5OjUwOjQxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwLzogVXBkYXRlIFJFQURNRSwgc2ltcGxlIGNsZWFudXAuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9SRUFETUU6CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX3NldF9wcm9wZXJ0eSk6CisJICBVcGRhdGUgUkVBRE1FLCBzaW1wbGUgY2xlYW51cC4KKworMjAwNi0wOS0yMSAwOTozNToxMyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9SRUFETUU6IFVwZGF0ZSBSRUFETUUgd2l0aCBzb21lIGV4YW1wbGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvUkVBRE1FOgorCSAgVXBkYXRlIFJFQURNRSB3aXRoIHNvbWUgZXhhbXBsZXMuCisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOiAoZ3N0X3J0cF9tcDRnX3BheV9pbml0KSwKKwkgIChnc3RfcnRwX21wNGdfcGF5X2ZpbmFsaXplKSwgKGdzdF9ydHBfbXA0Z19wYXlfcGFyc2VfYXVkaW9fY29uZmlnKSwKKwkgIChnc3RfcnRwX21wNGdfcGF5X3BhcnNlX3ZpZGVvX2NvbmZpZyksIChnc3RfcnRwX21wNGdfcGF5X25ld19jYXBzKSwKKwkgIChnc3RfcnRwX21wNGdfcGF5X3NldGNhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuaDoKKwkgIE1ha2Ugb3B0aW9uYWwgUlRQIHBhcmFtZXRlcnMgb2YgdHlwZSBTVFJJTkcsIGFzIHJlcXVpcmVkIGJ5IHRoZQorCSAgYXBwbGljYXRpb24veC1ydHAgY2FwcyBzcGVjaWZpY2F0aW9uLgorCisyMDA2LTA5LTIwIDE5OjM3OjQ1ICswMDAwICBQaGlsaXBwZSBLYWxhZiA8cGhpbGlwcGUua2FsYWZAY29sbGFib3JhLmNvLnVrPgorCisJICBnc3QvcnRwLzogQ29ycmVjdGx5IGNhbGN1bGF0ZSBzaXplIG9mIGVhY2ggSDI2MysgUlRQIGJ1ZmZlciB0YWtpbmcgaW50byBhY2NvdW50IE1UVSBhbmQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSAgQ29ycmVjdGx5IGNhbGN1bGF0ZSBzaXplIG9mIGVhY2ggSDI2MysgUlRQIGJ1ZmZlciB0YWtpbmcgaW50byBhY2NvdW50IE1UVSBhbmQKKwkgIFJUUCBoZWFkZXIuCisKKzIwMDYtMDktMjAgMTY6NDE6NDggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvTWFrZWZpbGUuYW06IEFuZCBtYWtlZmlsZSB0b28uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgIEFuZCBtYWtlZmlsZSB0b28uCisKKzIwMDYtMDktMjAgMTY6MDk6MDMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvOiBBZGRlZCBwcmVsaW1pbmFyeSBBU0YgZGVwYXlsb2FkZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBhc2ZkZXBheS5jOiAoZ3N0X3J0cF9hc2ZfZGVwYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX2FzZl9kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfYXNmX2RlcGF5X2luaXQpLAorCSAgKGRlY29kZV9iYXNlNjQpLCAoZ3N0X3J0cF9hc2ZfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9hc2ZfZGVwYXlfcHJvY2VzcyksIChnc3RfcnRwX2FzZl9kZXBheV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfYXNmX2RlcGF5X2dldF9wcm9wZXJ0eSksIChnc3RfcnRwX2FzZl9kZXBheV9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9ydHBfYXNmX2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBhc2ZkZXBheS5oOgorCSAgQWRkZWQgcHJlbGltaW5hcnkgQVNGIGRlcGF5bG9hZGVyLgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOiAoZGVjb2RlX2Jhc2U2NCk6CisJICBGaXggYmFzZTY0IGRlY29kaW5nLgorCisyMDA2LTA5LTIwIDE2OjA2OjI3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9VUkxTOiBBZGRlZCBzb21lIHRlc3QgVVJMUy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9VUkxTOgorCSAgQWRkZWQgc29tZSB0ZXN0IFVSTFMuCisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2NyZWF0ZV9zdHJlYW0pLAorCSAgKGdzdF9ydHNwc3JjX2xvb3ApLCAoZ3N0X3J0c3BzcmNfb3Blbik6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIFdoZW4gY3JlYXRpbmcgc3RyZWFtcywgZ2l2ZSBhY2Nlc3MgdG8gdGhlIGNvbXBsZXRlIFNEUC4KKwkgIEZpeCBzb21lIGxlYWtzLgorCSAgQ29sbGVjdCBhbmQgbWVyZ2UgZ2xvYmFsIHN0cmVhbSBwcm9wZXJ0aWVzIGluIHN0cmVhbSBjYXBzLgorCSAgUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgV01TZXJ2ZXIuCisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fY3JlYXRlKSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fY29ubmVjdCksIChydHNwX2Nvbm5lY3Rpb25fcmVhZCksIChyZWFkX2JvZHkpLAorCSAgKHJ0c3BfY29ubmVjdGlvbl9yZWNlaXZlKToKKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uaDoKKwkgIE1ha2UgY29ubmVjdGlvbiBpbnRlcnJ1cHRhYmxlLgorCSAgUmVmYWN0b3IgdG8gbWFrZSBpdCByZWNvbm5lY3RhYmxlLgorCSAgRG9uJ3QgZmFpbCBvbiBzaG9ydCByZWFkcyB3aGVuIHJlYWRpbmcgZGF0YSBwYWNrZXRzLgorCSAgKiBnc3QvcnRzcC9ydHNwdXJsLmM6IChydHNwX3VybF9wYXJzZSksIChydHNwX3VybF9zZXRfcG9ydCksCisJICAocnRzcF91cmxfZ2V0X3BvcnQpOgorCSAgKiBnc3QvcnRzcC9ydHNwdXJsLmg6CisJICBBZGQgbWV0aG9kcyBmb3IgZ2V0dGluZy9zZXR0aW5nIHRoZSBwb3J0LgorCSAgKiBnc3QvcnRzcC9zZHBtZXNzYWdlLmM6IChzZHBfbWVzc2FnZV9nZXRfYXR0cmlidXRlX3ZhbF9uKSwKKwkgIChzZHBfbWVzc2FnZV9nZXRfYXR0cmlidXRlX3ZhbCksIChzZHBfbWVkaWFfZ2V0X2F0dHJpYnV0ZSksCisJICAoc2RwX21lZGlhX2dldF9hdHRyaWJ1dGVfdmFsX24pLCAoc2RwX21lZGlhX2dldF9hdHRyaWJ1dGVfdmFsKSwKKwkgIChzZHBfbWVkaWFfZ2V0X2Zvcm1hdCksIChzZHBfcGFyc2VfbGluZSksCisJICAoc2RwX21lc3NhZ2VfcGFyc2VfYnVmZmVyKToKKwkgIEZpeCBoZWFkZXJzLgorCSAgQWRkIG1ldGhvZHMgZm9yIGdldHRpbmcgbXVsdGlwbGUgYXR0cmlidXRlcyB3aXRoIHRoZSBzYW1lIG5hbWUuCisJICBJbmNyZWFzZSBidWZmZXIgc2l6ZSB3aGVuIHBhcnNpbmcuCisJICBGaXggcGFyc2luZyBvZiBhPWZvbyBmaWVsZHMuCisJICAqIGdzdC9ydHNwL3Rlc3QuYzogKG1haW4pOgorCSAgVXBkYXRlIHRvIG5ldyBjb25uZWN0aW9uIEFQSS4KKwkgICogZ3N0L3J0c3AvcnRzcG1lc3NhZ2UuYzogKHJ0c3BfbWVzc2FnZV9uZXdfcmVzcG9uc2UpLAorCSAgKHJ0c3BfbWVzc2FnZV9pbml0X3Jlc3BvbnNlKSwgKHJ0c3BfbWVzc2FnZV9pbml0X2RhdGEpLAorCSAgKHJ0c3BfbWVzc2FnZV91bnNldCksIChydHNwX21lc3NhZ2VfZnJlZSksIChydHNwX21lc3NhZ2VfZHVtcCk6CisJICAqIGdzdC9ydHNwL3J0c3BtZXNzYWdlLmg6CisJICAqIGdzdC9ydHNwL3J0c3B0cmFuc3BvcnQuYzogKHJ0c3BfdHJhbnNwb3J0X2ZyZWUpOgorCSAgKiBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0Lmg6CisJICAqIGdzdC9ydHNwL3NkcC5oOgorCSAgKiBnc3QvcnRzcC9zZHBtZXNzYWdlLmg6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3AuYzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcC5oOgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRwZGVjLmg6CisJICAqIGdzdC9ydHNwL3J0c3AuaDoKKwkgICogZ3N0L3J0c3AvcnRzcGRlZnMuYzoKKwkgICogZ3N0L3J0c3AvcnRzcGRlZnMuaDoKKwkgIER1YWwgbGljZW5zZWQgdW5kZXIgTUlUIGFuZCBMR1BMIG5vdy4KKworMjAwNi0wOS0xOSAxNzoyNToxNSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy4qOiBSZW9yZ2FuaXplIHN0cmVhbSBwYXJzaW5nIGFuZCBjcmVhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChmaW5kX3N0cmVhbV9ieV9wdCksCisJICAoZ3N0X3J0c3BzcmNfY3JlYXRlX3N0cmVhbSksIChnc3RfcnRzcHNyY19mcmVlX3N0cmVhbSksCisJICAoZ3N0X3J0c3BzcmNfbWVkaWFfdG9fY2FwcyksIChnc3RfcnRzcHNyY19zdHJlYW1fc2V0dXBfcnRwKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksIChmaW5kX3N0cmVhbV9ieV9jaGFubmVsKSwKKwkgIChnc3RfcnRzcHNyY19wdXNoX2V2ZW50KSwgKGdzdF9ydHNwc3JjX2xvb3ApLCAoZ3N0X3J0c3BzcmNfc2VuZCksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfbWV0aG9kcyksIChnc3RfcnRzcHNyY19vcGVuKSwKKwkgIChnc3RfcnRzcHNyY19wYXJzZV9ydHBpbmZvKSwgKGdzdF9ydHNwc3JjX3BsYXkpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBSZW9yZ2FuaXplIHN0cmVhbSBwYXJzaW5nIGFuZCBjcmVhdGlvbi4KKwkgIERldGVjdCBjb250YWluZXIgZm9ybWF0cyBpbiBpbnRlcmxlYXZlZCBtb2RlLgorCSAgS2VlcCBtb3JlIHN0YXRlIGFib3V0IHRoZSBzdHJlYW1zLgorCSAgQXNzdW1lIGEgc2VydmVyIGFsc28gc3VwcG9ydHMgUExBWSBpZiBpdCBkb2VzIG5vdCBzYXkuCisJICBBZGQgdW5pY2FzdCBhbmQgaW50ZXJsZWF2ZWQgcHJvcGVydGllcyB0byBUQ1AgdHJhbnNwb3J0IHJlcXVlc3RzIHRvIG1ha2UKKwkgIHNvbWUgc2VydmVycyBoYXBweSAoV01TZXJ2ZXIpLgorCSAgKiBnc3QvcnRzcC9zZHBtZXNzYWdlLmg6CisJICBBZGQgc29tZSBkZWZpbmVzIGZvciB0aGUgc3RhbmRhcmQgQmFuZHdpZHRoIHR5cGVzLgorCisyMDA2LTA5LTE5IDE2OjI0OjEwICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIHRlc3RzL2ljbGVzL3Y0bDJzcmMtdGVzdC5jOgorCSAgSnVzdCBhIHNtYWxsIGZpeCB0byB0aGUgYXBwIG9wdGlvbnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEp1c3QgYSBzbWFsbCBmaXggdG8gdGhlIGFwcCBvcHRpb25zLgorCisyMDA2LTA5LTE5IDEzOjA4OjM1ICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZG9yaWVudC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZG9yaWVudC5oOgorCSogdGVzdHMvaWNsZXMvdjRsMnNyYy10ZXN0LmM6CisJICBBZGQgVmlkZW8gT3JpZW50YXRpb24gaW50ZXJmYWNlIHN1cHBvcnQgdG8gdjRsMnNyYy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQWRkIFZpZGVvIE9yaWVudGF0aW9uIGludGVyZmFjZSBzdXBwb3J0IHRvIHY0bDJzcmMuCisKKzIwMDYtMDktMTkgMTA6NTM6NTYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL3Rlc3QuYzogRml4IGJ1aWxkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL3Rlc3QuYzogKG1haW4pOgorCSAgRml4IGJ1aWxkLgorCisyMDA2LTA5LTE5IDEwOjE0OjUyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogQWRkIG1zLWdzbSB0byB0aGUgc3JjIHRlbXBsYXRlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgQWRkIG1zLWdzbSB0byB0aGUgc3JjIHRlbXBsYXRlLgorCisyMDA2LTA5LTE4IDE3OjM3OjQ2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLio6IFNtYWxsIGNsZWFudXBzLCBhZGRlZCBkb2N1bWVudGF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX21lZGlhX3RvX2NhcHMpLAorCSAgKGdzdF9ydHNwc3JjX3NlbmQpLCAoZ3N0X3J0c3BzcmNfcGFyc2VfbWV0aG9kcyksCisJICAoZ3N0X3J0c3BzcmNfb3BlbiksIChnc3RfcnRzcHNyY19jbG9zZSksIChnc3RfcnRzcHNyY19wbGF5KSwKKwkgIChnc3RfcnRzcHNyY19wYXVzZSksIChnc3RfcnRzcHNyY19jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9ydHNwc3JjX3VyaV9nZXRfdXJpKSwgKGdzdF9ydHNwc3JjX3VyaV9zZXRfdXJpKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgU21hbGwgY2xlYW51cHMsIGFkZGVkIGRvY3VtZW50YXRpb24uCisJICBUcnkgdG8gY2xlYW4gdXAgdGhlIHJlcXVlc3RzIGFuZCByZXNwb25zZXMuCisJICBSZWZhY3RvciBwYXJzaW5nIHRoZSBzdXBwb3J0ZWQgbWV0aG9kcy4KKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKHJ0c3BfY29ubmVjdGlvbl9vcGVuKSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fY3JlYXRlKSwgKHJ0c3BfY29ubmVjdGlvbl9zZW5kKSwKKwkgIChwYXJzZV9yZXNwb25zZV9zdGF0dXMpLCAocGFyc2VfcmVxdWVzdF9saW5lKSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fcmVjZWl2ZSksIChydHNwX2Nvbm5lY3Rpb25fY2xvc2UpLAorCSAgKHJ0c3BfY29ubmVjdGlvbl9mcmVlKToKKwkgICogZ3N0L3J0c3AvcnRzcHRyYW5zcG9ydC5jOiAocnRzcF90cmFuc3BvcnRfbmV3KSwKKwkgIChydHNwX3RyYW5zcG9ydF9pbml0KSwgKHJ0c3BfdHJhbnNwb3J0X3BhcnNlKSwKKwkgIChydHNwX3RyYW5zcG9ydF9mcmVlKToKKwkgICogZ3N0L3J0c3AvcnRzcHVybC5jOiAocnRzcF91cmxfcGFyc2UpOgorCSAgKiBnc3QvcnRzcC9zZHBtZXNzYWdlLmM6IChzZHBfbWVzc2FnZV9uZXcpLCAoc2RwX21lc3NhZ2VfaW5pdCksCisJICAoc2RwX21lc3NhZ2VfY2xlYW4pLCAoc2RwX21lc3NhZ2VfZnJlZSksIChzZHBfbWVkaWFfbmV3KSwKKwkgIChzZHBfbWVkaWFfaW5pdCksIChzZHBfbWVzc2FnZV9wYXJzZV9idWZmZXIpLCAoc2RwX21lc3NhZ2VfZHVtcCk6CisJICBVc2UgZ19yZXR1cm5fdmFsIHNvbWUgbW9yZS4KKwkgICogZ3N0L3J0c3AvcnRzcGRlZnMuaDoKKwkgIEFkZCBtb3JlIGVudW0gdmFsdWVzIHRvIHRyYWNrIGluaXRpYWwgc3RhdGVzLgorCSAgKiBnc3QvcnRzcC9ydHNwbWVzc2FnZS5jOiAocnRzcF9tZXNzYWdlX25ld19yZXF1ZXN0KSwKKwkgIChydHNwX21lc3NhZ2VfaW5pdF9yZXF1ZXN0KSwgKHJ0c3BfbWVzc2FnZV9uZXdfcmVzcG9uc2UpLAorCSAgKHJ0c3BfbWVzc2FnZV9pbml0X3Jlc3BvbnNlKSwgKHJ0c3BfbWVzc2FnZV9pbml0X2RhdGEpLAorCSAgKHJ0c3BfbWVzc2FnZV91bnNldCksIChydHNwX21lc3NhZ2VfZnJlZSksCisJICAocnRzcF9tZXNzYWdlX2FkZF9oZWFkZXIpLCAocnRzcF9tZXNzYWdlX3JlbW92ZV9oZWFkZXIpLAorCSAgKHJ0c3BfbWVzc2FnZV9nZXRfaGVhZGVyKSwgKHJ0c3BfbWVzc2FnZV9zZXRfYm9keSksCisJICAocnRzcF9tZXNzYWdlX3Rha2VfYm9keSksIChydHNwX21lc3NhZ2VfZ2V0X2JvZHkpLAorCSAgKHJ0c3BfbWVzc2FnZV9zdGVhbF9ib2R5KSwgKHJ0c3BfbWVzc2FnZV9kdW1wKToKKwkgICogZ3N0L3J0c3AvcnRzcG1lc3NhZ2UuaDoKKwkgIFJlb3JkZXIgYXJndW1lbnRzLCBvYmplY3QgZ29lcyBhcyB0aGUgZmlyc3Qgb25lLgorCSAgVXNlIGdfcmV0dXJuX3ZhbCBzb21lIG1vcmUuCisKKzIwMDYtMDktMTggMTU6MzY6MTQgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSAgRml4IEdTVF9CVUZGRVJfRFVSQVRJT04uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEZpeCBHU1RfQlVGRkVSX0RVUkFUSU9OLgorCisyMDA2LTA5LTE4IDE0OjAwOjQxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLio6IEV4cG9ydCBzb21ldGltZXMgc291cmNlIHBhZCB3aXRoIGNvcnJlY3QgY2FwcyBvbiB0aGUgdGVtcGxhdGUsIGNyZWF0ZSB0aGUgZ2hvc3RwYWQgZnJvbSB0aGUgdGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19iYXNlX2luaXQpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KSwgKGdzdF9ydHNwc3JjX3B1c2hfZXZlbnQpLAorCSAgKGdzdF9ydHNwc3JjX2xvb3ApLCAoZ3N0X3J0c3BzcmNfdXJpX3NldF91cmkpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBFeHBvcnQgc29tZXRpbWVzIHNvdXJjZSBwYWQgd2l0aCBjb3JyZWN0IGNhcHMgb24gdGhlIHRlbXBsYXRlLCBjcmVhdGUKKwkgIHRoZSBnaG9zdHBhZCBmcm9tIHRoZSB0ZW1wbGF0ZS4KKwkgIFJlbW92ZSBSVENQIHRlbXBsYXRlIGFzIHdlIG5ldmVyIGV4cG9zZSBSVENQLgorCSAgUHJvdGVjdCBhZ2FpbnN0IGludmFsaWQgYm9keSBzaXplLgorCSAgQXZvaWQgbWVtY3B5IHdoZW4gY3JlYXRpbmcgdGhlIG91dHB1dCBidWZmZXIuCisJICBQcm9wZXJseSBwb3N0IGFuIGVycm9yIGFuZCBzZW5kIEVPUyB3aGVuIHRoZSBsb29wIGZ1bmN0aW9uIGlzIHNodXQgZG93bi4KKworMjAwNi0wOS0xOCAxMToyOToxMiArMDAwMCAgTHV0eiBNdWVsbGVyIDxsdXR6QHRvcGZyb3NlLmRlPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLio6IE1ha2Ugc3VyZSB3ZSBjYW4gbmV2ZXIgc2V0IGFuIGludmFsaWQgbG9jYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5OiBMdXR6IE11ZWxsZXIgPGx1dHogYXQgdG9wZnJvc2UgZG90IGRlPgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfcnRzcHNyY19pbml0KSwgKGdzdF9ydHNwc3JjX3NldF9wcm9wZXJ0eSksIChnc3RfcnRzcHNyY19vcGVuKSwKKwkgIChnc3RfcnRzcHNyY191cmlfZ2V0X3VyaSksIChnc3RfcnRzcHNyY191cmlfc2V0X3VyaSk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIE1ha2Ugc3VyZSB3ZSBjYW4gbmV2ZXIgc2V0IGFuIGludmFsaWQgbG9jYXRpb24uCisJICAqIGdzdC9ydHNwL3J0c3BtZXNzYWdlLmM6IChydHNwX21lc3NhZ2Vfc3RlYWxfYm9keSk6CisJICAqIGdzdC9ydHNwL3J0c3BtZXNzYWdlLmg6CisJICBBZGRlZCBfc3RlYWxfYm9keSBtZXRob2QgZm9yIGZ1dHVyZSB1c2UuCisJICAqIGdzdC9ydHNwL3J0c3B1cmwuYzogKHJ0c3BfdXJsX3BhcnNlKSwgKHJ0c3BfdXJsX2ZyZWUpOgorCSAgTWFrZSBmcmVlaW5nIG9mIE5VTEwgdXJsIHJldHVybiBpbW1lZGlhdGx5LgorCisyMDA2LTA5LTE4IDEwOjQyOjUyICswMDAwICBMdXR6IE11ZWxsZXIgPGx1dHpAdG9wZnJvc2UuZGU+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuKjogVXNlIGJvaWxlcnBsYXRlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBCYXNlZCBvbiBwYXRjaCBieTogTHV0eiBNdWVsbGVyIDxsdXR6IGF0IHRvcGZyb3NlIGRvdCBkZT4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoX2RvX2luaXQpLCAoZ3N0X3J0c3BzcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0c3BzcmNfaW5pdCksIChnc3RfcnRzcHNyY19zdHJlYW1fc2V0dXBfcnRwKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksIChnc3RfcnRzcHNyY19wbGF5KSwKKwkgIChnc3RfcnRzcHNyY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBVc2UgYm9pbGVycGxhdGUuCisJICBNYWtlIHJ0c3BzcmMgc3ViY2xhc3MgR3N0QmluIHRvIG1ha2Ugc3RhdGUgY2hhbmdlcyBlYXNpZXIuCisJICBBZGQgUmFuZ2UgaGVhZGVyIGZpZWxkIG9uIHRoZSBQTEFZIHJlcXVlc3QuCisKKzIwMDYtMDktMTggMDg6NTk6MTcgKzAwMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzLnZlcm1laXJAYmFyY28uY29tPgorCisJICBnc3QvcnRzcC86IFNtYWxsIGNsZWFudXBzLiB3aGVuIG11bHRpY2FzdCBpcyBzZWxlY3RlZCBhcyB0aGUgdHJhbnNwb3J0LCBjcmVhdGUgVURQIHNvdXJjZXMgYW5kIGNvbm5lY3QgdG8gdGhlIG11bHRpY2EuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IFRoaWpzIFZlcm1laXIgPHRoaWpzIGRvdCB2ZXJtZWlyIGF0IGJhcmNvIGRvdCBjb20+CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX3NldF9zdGF0ZSksCisJICAoZ3N0X3J0c3BzcmNfbWVkaWFfdG9fY2FwcyksIChnc3RfcnRzcHNyY19zdHJlYW1fc2V0dXBfcnRwKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksIChnc3RfcnRzcHNyY19vcGVuKSwKKwkgIChnc3RfcnRzcHNyY19jbG9zZSksIChnc3RfcnRzcHNyY19wbGF5KSwgKGdzdF9ydHNwc3JjX3BhdXNlKToKKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKGluZXRfYXRvbik6CisJICBTbWFsbCBjbGVhbnVwcy4KKwkgIHdoZW4gbXVsdGljYXN0IGlzIHNlbGVjdGVkIGFzIHRoZSB0cmFuc3BvcnQsIGNyZWF0ZSBVRFAgc291cmNlcyBhbmQKKwkgIGNvbm5lY3QgdG8gdGhlIG11bHRpY2FzdCBncm91cC4KKwkgIE1vdmUgcGFyc2luZyBhbmQgc2V0dGluZyBvZiBjYXBzIHRvIGEgY29tbW9uIHBsYWNlLgorCSAgRml4ZXMgIzM0OTg5NC4KKworMjAwNi0wOS0xNiAyMjoxNDozNSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBNb3JlIEdfT0JKRUNUIG1hY3JvIGZpeGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvaGVybWVzL2dzdGhlcm1lc2NvbG9yc3BhY2UuYzoKKwkgICogZXh0L2l2b3JiaXMvdm9yYmlzZmlsZS5jOgorCSAgKiBleHQvbGNzL2dzdGNvbG9yc3BhY2UuYzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5oOgorCSAgKiBleHQveGluZS94aW5lYXVkaW9kZWMuYzoKKwkgICogZXh0L3hpbmUveGluZWF1ZGlvc2luay5jOgorCSAgKiBleHQveGluZS94aW5laW5wdXQuYzoKKwkgICogZ3N0L2NoYXJ0L2dzdGNoYXJ0LmM6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJICAqIGdzdC9nYW1lcy9nc3RwdXp6bGUuYzoKKwkgICogZ3N0L2xpYnJmYi9nc3RyZmJzcmMuYzoKKwkgICogZ3N0L21peG1hdHJpeC9taXhtYXRyaXguYzoKKwkgICogZ3N0L25zZi9nc3Ruc2YuaDoKKwkgICogZ3N0L3ZiaWRlYy9nc3R2YmlkZWMuYzoKKwkgICogZ3N0L3ZpcnR1YWxkdWIvZ3N0eHNoYXJwZW4uYzoKKwkgIE1vcmUgR19PQkpFQ1QgbWFjcm8gZml4aW5nLgorCisyMDA2LTA5LTE2IDIxOjU3OjI5ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIE1vcmUgR19PQkpFQ1QgbWFjcm8gZml4aW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzoKKwkgICogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICAqIGdzdC9kZWJ1Zy9icmVha215ZGF0YS5jOgorCSAgKiBnc3QvZGVidWcvbmVnb3RpYXRpb24uYzoKKwkgICogZ3N0L2RlYnVnL3Rlc3RwbHVnaW4uYzoKKwkgICogZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuYzoKKwkgICogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jOgorCSAgKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6CisJICAqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJICAqIGdzdC9lZmZlY3R2L2dzdHJldi5jOgorCSAgKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmM6CisJICAqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkgICogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJICAqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvdGVtcGxhdGUuYzoKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuaDoKKwkgIE1vcmUgR19PQkpFQ1QgbWFjcm8gZml4aW5nLgorCisyMDA2LTA5LTE2IDE0OjMwOjU5ICswMDAwICBZdmVzIExlZmVidnJlIDxpdmFub2hlQGFiYWNvbS5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IENvcnJlY3RseSBzZXQgdGhlIGR3TGVuZ3RoIGluIHN0cmguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBZdmVzIExlZmVidnJlIDxpdmFub2hlIGF0IGFiYWNvbSBkb3QgY29tPgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aV9tdXhfc3RvcF9maWxlKToKKwkgIENvcnJlY3RseSBzZXQgdGhlIGR3TGVuZ3RoIGluIHN0cmguCisJICBXaXRoIHRoaXMgcGF0Y2gsIHRoZSBmaWxlIGR1cmF0aW9uIGlzIG5vdyBkaXNwbGF5ZWQgY29ycmVjdGx5IGluIHdpbmRvdworCSAgbWVkaWEgcGxheWVyIGFuZCB0aGUgQVZJIHBsYXlzIGNvbXBsZXRlbHkuIEZpeGVzICMzNTYxNDcKKworMjAwNi0wOS0xNSAxOToxMTowMCArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYzoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHRlc3RzL2ljbGVzL3Y0bDJzcmMtdGVzdC5jOgorCSAgVGhlIHRlc3QgYXBwbGljYXRpb24gYW5kIHRoZSBwbGdpbmQgZXJyb3IgbWVzc2FnZXMgaGFzIGJlZW4gaW1wcm92ZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFRoZSB0ZXN0IGFwcGxpY2F0aW9uIGFuZCB0aGUgcGxnaW5kIGVycm9yIG1lc3NhZ2VzIGhhcyBiZWVuIGltcHJvdmVkLgorCisyMDA2LTA5LTE1IDE3OjEwOjIyICswMDAwICBEYXJyZW4gS2VubnkgPGRhcnJlbi5rZW5ueUBzdW4uY29tPgorCisJICBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuYzogU2V0IHRoZSBvdXRwdXQgdHJhY2sgYXMgdGhlIE1BU1RFUiBzbyB0aGF0IHRoZSBnbm9tZS1zZXR0aW5ncy1kYWVtb24ga2V5YmluZGluZ3MuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IERhcnJlbiBLZW5ueSA8ZGFycmVuIGRvdCBrZW5ueSBhdCBzdW4gZG90IGNvbT4KKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6CisJICAoZ3N0X3N1bmF1ZGlvbWl4ZXJfY3RybF9idWlsZF9saXN0KToKKwkgIFNldCB0aGUgb3V0cHV0IHRyYWNrIGFzIHRoZSBNQVNURVIgc28gdGhhdCB0aGUgZ25vbWUtc2V0dGluZ3MtZGFlbW9uCisJICBrZXliaW5kaW5ncyBmb3IgY2hhbmdpbmcgdGhlIHZvbHVtZSB1c2luZyB0aGUga2V5Ym9hcmQgd29ya3MuCisJICBGaXhlcyAjMzU2MTQyLgorCisyMDA2LTA5LTE1IDE2OjAxOjQ4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6IEZpeCBkb2N1bWVudGF0aW9uLCBpdCBpcyBub3QgcG9zc2libGUgdG8gY29udHJvbCB0aGUgZnJhbWVyYXRlIG9mIGpwZWdkZWMgdXNpbmcgZmlsdGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6IChnc3RfbXVsdGlwYXJ0X2RlbXV4X2NoYWluKToKKwkgIEZpeCBkb2N1bWVudGF0aW9uLCBpdCBpcyBub3QgcG9zc2libGUgdG8gY29udHJvbCB0aGUgZnJhbWVyYXRlIG9mIGpwZWdkZWMKKwkgIHVzaW5nIGZpbHRlcmVkIGNhcHMgeWV0LiBGaXhlcyAjMzU1MjEwLgorCSAgUmV0dXJuIHRoZSBkb3duc3RyZWFtIEdzdEZsb3dSZXR1cm4gaW5zdGVhZCBvZiBHU1RfRkxPV19PSyBzbyB0aGF0IHdlCisJICBzdG9wIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IuCisKKzIwMDYtMDktMTQgMTE6MDU6MzUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC86IERvbid0IGludGVycHJldCBhIGZpcnN0IGJ1ZmZlciB3aXRoIGFuIG9mZnNldCBvZiBOT05FIGFzICdmcm9tIHRoZSBtaWRkbGUgb2YgdGhlIHN0cmVhbScsIGJ1dCBvbmx5IGEgZmlyc3QgYnVmZi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hcGV0YWcvZ3N0dGFnZGVtdXguYzogKGdzdF90YWdfZGVtdXhfY2hhaW5fcGFyc2VfdGFnKToKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfaWQzZGVtdXhfY2hhaW4pOgorCSAgRG9uJ3QgaW50ZXJwcmV0IGEgZmlyc3QgYnVmZmVyIHdpdGggYW4gb2Zmc2V0IG9mIE5PTkUgYXMKKwkgICdmcm9tIHRoZSBtaWRkbGUgb2YgdGhlIHN0cmVhbScsIGJ1dCBvbmx5IGEgZmlyc3QgYnVmZmVyCisJICB0aGF0IGhhcyBhIHZhbGlkIGJ1ZmZlciBvZmZzZXQgdGhhdCdzIG5vbi16ZXJvIChzZWUgIzM0NTQ0OSkuCisKKzIwMDYtMDktMTQgMTA6Mzg6NDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC4qOiBXaGVuIHdlIG1lcmdlL2NvbGxlY3QgbXVsdGlwbGUgaW5jb21pbmcgYnVmZmVycyBmb3IgdHlwZWZpbmRpbmcgcHVycG9zZXMsIGtlZXAgYW4gaW5pdGlhbC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOiAoZ3N0X2ljeWRlbXV4X3Jlc2V0KSwKKwkgIChnc3RfaWN5ZGVtdXhfdHlwZWZpbmRfb3JfZm9yd2FyZCk6CisJICAqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5oOgorCSAgV2hlbiB3ZSBtZXJnZS9jb2xsZWN0IG11bHRpcGxlIGluY29taW5nIGJ1ZmZlcnMgZm9yIHR5cGVmaW5kaW5nCisJICBwdXJwb3Nlcywga2VlcCBhbiBpbml0aWFsIDAgb2Zmc2V0IG9uIHRoZSBmaXJzdCBvdXRnb2luZyBidWZmZXIKKwkgIGFzIHdlbGwgKG90aGVyd2lzZSBpZDNkZW11eCB3b24ndCB3b3JrIHJpZ2h0KS4gRml4ZXMgIzM0NTQ0OS4KKwkgIEFsc28gTWFrZSBidWZmZXIgbWV0YWRhdGEgd3JpdGFibGUgYmVmb3JlIHNldHRpbmcgYnVmZmVyIGNhcHMuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ljeWRlbXV4LmM6ICh0eXBlZmluZF9zdWNjZWVkKSwKKwkgIChjbGVhbnVwX2ljeWRlbXV4KSwgKHB1c2hfZGF0YSksIChHU1RfU1RBUlRfVEVTVCksCisJICAoaWN5ZGVtdXhfc3VpdGUpOgorCSAgU21hbGwgdGVzdCBjYXNlIGZvciB0aGUgYWJvdmUuCisKKzIwMDYtMDktMTMgMTM6MjY6MTUgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBNb3JlIGNvZGUgcmV1c2UgYW5kIGJldHRlciBsb2dnaW5nIGluIF9wZWVrX2NodW5rKCkuIFJlaW50cm9kdWNlIGNoZWNrIGZvciBjaHVuayBzaXplcyBiZWZvcmUgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wZWVrX2NodW5rKSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksIChnc3RfYXZpX2RlbXV4X3N5bmMpLAorCSAgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlcl9wdXNoKSwKKwkgIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9kYXRhKSwKKwkgIChnc3RfYXZpX2RlbXV4X2xvb3ApOgorCSAgTW9yZSBjb2RlIHJldXNlIGFuZCBiZXR0ZXIgbG9nZ2luZyBpbiBfcGVla19jaHVuaygpLiBSZWludHJvZHVjZSBjaGVjaworCSAgZm9yIGNodW5rIHNpemVzIGJlZm9yZSByZWFkaW5nIHRoZW0gKGF2b2lkIG9vbSkuIEJldHRlciBoYW5kbGluZyBmb3IKKwkgIGludmFsaWQgY2h1bmtzaXplcyB3aGVuIHN0cmVhbWluZy4KKworMjAwNi0wOS0xMiAyMDoxODo1NSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogSW1wbGVtZW50cyBzdG9wKCkgdG8gY2xlYXIgdGhlIGFkYXB0ZXIgYW5kIGV2ZW50KCkgdG8gY2xlYXIgdGhlIGFkYXB0ZXIgb24gRkxVU0hfU1RPUCBhbmQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogKGdzdF9zcGVjdHJ1bV9jbGFzc19pbml0KSwKKwkgIChnc3Rfc3BlY3RydW1fc3RhcnQpLCAoZ3N0X3NwZWN0cnVtX3N0b3ApLCAoZ3N0X3NwZWN0cnVtX2V2ZW50KToKKwkgIEltcGxlbWVudHMgc3RvcCgpIHRvIGNsZWFyIHRoZSBhZGFwdGVyIGFuZCBldmVudCgpIHRvIGNsZWFyIHRoZQorCSAgYWRhcHRlciBvbiBGTFVTSF9TVE9QIGFuZCBFT1MuCisKKzIwMDYtMDktMTEgMjA6Mzg6NDEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2xldmVsL2dzdGxldmVsLio6IEZpeCB0eXBlIG1peHVwIGluIGxldmVsLT5pbnRlcnZhbCAoZ2RvdWJsZTwtPmd1aW50NjQpLiBTcG90dGVkIGJ5CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6IChnc3RfbGV2ZWxfc2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmg6CisJICBGaXggdHlwZSBtaXh1cCBpbiBsZXZlbC0+aW50ZXJ2YWwgKGdkb3VibGU8LT5ndWludDY0KS4gU3BvdHRlZCBieQorCSAgUmVuw6kgU3RhZGxlcgorCisyMDA2LTA5LTExIDE4OjIzOjU5ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS4qOiBGaXggdHlwZSBtaXh1cCBpbiBzcGVjdHJ1bS0+aW50ZXJ2YWwgKGdkb3VibGU8LT5ndWludDY0KS4gU3BvdHRlZCBieQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX2luaXQpLAorCSAgKGdzdF9zcGVjdHJ1bV9zZXRfcHJvcGVydHkpOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uaDoKKwkgIEZpeCB0eXBlIG1peHVwIGluIHNwZWN0cnVtLT5pbnRlcnZhbCAoZ2RvdWJsZTwtPmd1aW50NjQpLiBTcG90dGVkIGJ5CisJICBSZW7DqSBTdGFkbGVyCisKKzIwMDYtMDktMTEgMTg6MDI6MzkgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3NwZWN0cnVtL2RlbW8tb3Nzc3JjLmM6IFVzZSBtb3JlIGRlZmluZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1vc3NzcmMuYzogKGRyYXdfc3BlY3RydW0pLCAobWFpbik6CisJICBVc2UgbW9yZSBkZWZpbmVzCisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX2luaXQpLAorCSAgKGdzdF9zcGVjdHJ1bV9kaXNwb3NlKSwgKGdzdF9zcGVjdHJ1bV9zZXRfY2FwcyksCisJICAoZ3N0X3NwZWN0cnVtX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5oOgorCSAgQXBwbHkgc29tZSBvZiB0aGUgc3BlY3RydW0gY2xlYW51cCBjaGFuZ2VzIHN1Z2dlc3RlZCBpbiAjMzQ4MDg1LgorCisyMDA2LTA5LTA4IDE2OjQ3OjQ2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IEJ1bXAgcmVxdWlyZW1lbnRzIG9mIC1iYXNlICh2aWRlb2Nyb3AgdGVzdCBjYXNlIG5lZWRzIHRoaXMpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEJ1bXAgcmVxdWlyZW1lbnRzIG9mIC1iYXNlICh2aWRlb2Nyb3AgdGVzdCBjYXNlIG5lZWRzIHRoaXMpLgorCSAgKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSAgRG9jdW1lbnQgc2xvcHB5IGhhbmRsaW5nIG9mIHN1YnNhbXBsZWQgY2hyb21hIHBsYW5lcyBpZgorCSAgbGVmdC90b3AgY3JvcHBpbmcgaXMgYW4gb2RkIG51bWJlci4KKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6IChoYW5kb2ZmX2NiKSwKKwkgICh2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZ19pbml0X2NvbnRleHQpLAorCSAgKHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nX2RlaW5pdF9jb250ZXh0KSwKKwkgICh2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyksIChjaGVja18xeDFfYnVmZmVyKSwgKEdTVF9TVEFSVF9URVNUKSwKKwkgICh2aWRlb2Nyb3Bfc3VpdGUpLCAobWFpbik6CisJICBBZGQgYW5vdGhlciB1bml0IHRlc3QgdGhhdCBjcm9wcyB0aGUgaW5wdXQgdG8gMXgxIChhbmQgY2hlY2tzCisJICB0aGF0IHRoYXQgcGl4ZWwgaGFzIHRoZSBleHBlY3RlZCB2YWx1ZXMgaW4gYSBudW1iZXIgb2YgZm9ybWF0cykuCisKKzIwMDYtMDktMDggMTE6MDQ6MjQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC92aWRlb2Nyb3AvOiBTb21lIHF1aWNrIHRlc3RzIGluZGljYXRlIHRoYXQgaXQgZG9lc24ndCBtYWtlIGEgZ3JlYXQgZGVhbCBvZiBzZW5zZSB0byB1c2UgbGlib2lsIGhlcmUsIGF0IGxlYXN0IG5vdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC92aWRlb2Nyb3AvTWFrZWZpbGUuYW06CisJICAqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6IChnc3RfdmlkZW9fY3JvcF9jbGFzc19pbml0KSwKKwkgIChnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fcGFja2VkKSwKKwkgIChnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fcGxhbmFyKToKKwkgIFNvbWUgcXVpY2sgdGVzdHMgaW5kaWNhdGUgdGhhdCBpdCBkb2Vzbid0IG1ha2UgYSBncmVhdCBkZWFsCisJICBvZiBzZW5zZSB0byB1c2UgbGlib2lsIGhlcmUsIGF0IGxlYXN0IG5vdCBmb3IgdGhlIG1lbWNweSgpcworCSAgd2UgZG8sIHNvIHJlbW92ZSBsaWJvaWwgdXNhZ2UgdW50aWwgdGhlcmUgaXMgY2xlYXIgZXZpZGVuY2UKKwkgIGl0IGFjdHVhbGx5IG1ha2VzIGEgcG9zaXRpdmUgZGlmZmVyZW5jZSBzb21ld2hlcmUuCisKKzIwMDYtMDktMDYgMDk6MDU6MzMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBSZXZlcnQgb25lIGNoYW5nZSB0byBmaXggc3RyZWFtaW5nIGF2aSAoYWRhcHRlciBzaXplICE9IGRhdGEgc2l6ZSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9yZWFkX3N1YmluZGV4ZXNfcHVsbCksCisJICAoZ3N0X2F2aV9kZW11eF9zeW5jKSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlcl9wdXNoKSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9kYXRhKToKKwkgIFJldmVydCBvbmUgY2hhbmdlIHRvIGZpeCBzdHJlYW1pbmcgYXZpIChhZGFwdGVyIHNpemUgIT0gZGF0YSBzaXplKS4KKworMjAwNi0wOS0wNCAxNjoyMToxNyArMDAwMCAgRnLDqWTDqXJpYyBSaXNzIDxmcmVkZXJpYy5yaXNzQGdtYWlsLmNvbT4KKworCSAgZ3N0L21hdHJvc2thLzogQWRkIHN1cHBvcnQgZm9yIFZPQlNVQiBzdWJ0aXRsZSB0cmFja3MgYW5kIHpsaWItY29tcHJlc3NlZCB0cmFja3MuIE1ha2Ugc3VyZSB3ZSBzdGFydCBvbiBhIGtleWZyYW1lIGFmLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBGcsOpZMOpcmljIFJpc3MgIDxmcmVkZXJpYy5yaXNzIGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX3RyYWNrX2ZyZWUpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9yZXNldCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3JlYWRfdHJhY2tfZW5jb2RpbmdzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSksIChnc3RfbWF0cm9za2FfZGVjb2RlX2J1ZmZlciksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2Jsb2NrZ3JvdXBfb3Jfc2ltcGxlYmxvY2spLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9zdWJ0aXRsZV9jYXBzKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgQWRkIHN1cHBvcnQgZm9yIFZPQlNVQiBzdWJ0aXRsZSB0cmFja3MgYW5kIHpsaWItY29tcHJlc3NlZAorCSAgdHJhY2tzLiBNYWtlIHN1cmUgd2Ugc3RhcnQgb24gYSBrZXlmcmFtZSBhZnRlciBhIHNlZWsuICgjMzQzMzQ4KQorCisyMDA2LTA5LTA0IDE1OjA2OjI1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvOiBub3QgcGVyZmVjdCB5ZXQgdGhvdWdoLCBuZWVkcyBzb21lIHR3ZWFraW5nIGluIGZsYWNkZWM7IGFsc28sIHNlZWtpbmcgY291bGQgYmUgYmV0dGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X3B1c2hfaGRyX2J1ZiksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3B1c2hfZmxhY19jb2RlY19wcml2X2RhdGEpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wdXNoX3hpcGhfY29kZWNfcHJpdl9kYXRhKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3ZpZGVvX2NhcHMpLCAoZ3N0X21hdHJvc2thX2RlbXV4X2F1ZGlvX2NhcHMpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICBBZGQgYmFzaWMgRkxBQyBzdXBwb3J0ICgjMzExNTg2KSwgbm90IHBlcmZlY3QgeWV0IHRob3VnaCwgbmVlZHMgc29tZQorCSAgdHdlYWtpbmcgaW4gZmxhY2RlYzsgYWxzbywgc2Vla2luZyBjb3VsZCBiZSBiZXR0ZXIuCisJICBEbyBiZXR0ZXIgYm91bmRzIGNoZWNraW5nIHdoZW4gZGVzZXJpYWxpc2luZyB2b3JiaXMgc3RyZWFtIGhlYWRlcnMKKwkgIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCByZWFkIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgb24gYmFkIGlucHV0LgorCisyMDA2LTA5LTA0IDA5OjM0OjI1ICswMDAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyb0BubnZhLm9yZz4KKworCSAgZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOiBTZWVraW5nIGJhY2sgaW4gYSBmaWxlIGNvbnRhaW5pbmcgYSBDTU1MIHN0cmVhbSBlcnJvcnMgb3V0IGlmIHRoZSBzZWVrIGdvZXMgYmFjayB1cCB0byB0aGUgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRybyBhdCBubnZhIGRvdCBvcmc+CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuYzogKGdzdF9jbW1sX2RlY19jaGFpbik6CisJICBTZWVraW5nIGJhY2sgaW4gYSBmaWxlIGNvbnRhaW5pbmcgYSBDTU1MIHN0cmVhbSBlcnJvcnMgb3V0IGlmIHRoZSBzZWVrCisJICBnb2VzIGJhY2sgdXAgdG8gdGhlIENNTUwgaGVhZGVycy4gVGhpcyBpcyBiZWNhdXNlIGFmdGVyIHRoZSBzZWVrIHRoZSB4bWwKKwkgIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gPD94bWwgLi4uPz4gaXMgc3VibWl0dGVkIHRvIHRoZSB4bWwgcGFyc2VyIGFnYWluLAorCSAgd2hpY2ggcmVzdWx0cyBpbiBhbiBlcnJvci4gVGhlIGF0dGFjaGVkIHBhdGNoIGZpeGVzIHRoZSBwcm9ibGVtLgorCSAgRml4ZXMgIzM1MzkwOC4KKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5oOgorCSAgRml4IGF1dGhvcnMgbmFtZS4KKworMjAwNi0wOS0wMyAxMDo0NjoxNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6IE1vcmUgdGVzdHM6IGNoZWNrIHBhc3N0aHJvdWdoIG1vZGUgYW5kIGNhcHMgdHJhbnNmb3JtIGluIGJvdGggZGlyZWN0aW9ucyB3aXRoIGZpeGVkLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6IChoYW5kb2ZmX2NiKSwKKwkgIChidWZmZXJfcHJvYmVfY2IpLCAodGVzdF9jYXBzX3RyYW5zZm9ybSksICh0ZXN0X3Bhc3N0aHJvdWdoKSwKKwkgIChub3Rnc3RfdmFsdWVfbGlzdF9nZXRfbnRoX2ludCksICh2aWRlb2Nyb3Bfc3VpdGUpOgorCSAgTW9yZSB0ZXN0czogY2hlY2sgcGFzc3Rocm91Z2ggbW9kZSBhbmQgY2FwcyB0cmFuc2Zvcm0gaW4KKwkgIGJvdGggZGlyZWN0aW9ucyB3aXRoIGZpeGVkIHZhbHVlcywgcmFuZ2VzIGFuZCBsaXN0cy4KKworMjAwNi0wOS0wMiAxODo0OTowMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogQWRkIHZpZGVvY3JvcCB0byBkb2NzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgIEFkZCB2aWRlb2Nyb3AgdG8gZG9jcy4KKwkgICogZ3N0L3ZpZGVvY3JvcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzoKKwkgICogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuaDoKKwkgIE1vdmUgYm9pbGVycGxhdGUgc3R1ZmYgYW5kIHN0cnVjdHVyZXMgaW50byBhIGhlYWRlciBmaWxlLgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6ICh2aWRlb19jcm9wX2dldF90ZXN0X2NhcHMpLAorCSAgKHRlc3RfdW5pdF9zaXplcyksICh2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZ19pbml0X2NvbnRleHQpLAorCSAgKHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nX2RlaW5pdF9jb250ZXh0KSwKKwkgICh2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyksICh0ZXN0X2Nyb3BwaW5nKSwgKHZpZGVvY3JvcF9zdWl0ZSk6CisJICBBZGQgdW5pdCB0ZXN0cyBmb3IgdmlkZW9jcm9wLgorCisyMDA2LTA5LTAyIDE1OjMwOjQ1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBQb3J0L3Jld3JpdGUgdmlkZW9jcm9wIGZyb20gc2NyYXRjaCBmb3IgR1N0cmVhbWVyLTAuMTAsIGFuZCBtYWtlIGl0IHN1cHBvcnQgYWxsIGZvcm1hdHMgdmlkZW9zY2FsZSBzdXBwb3J0cyAoIzM0NTY1MykuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvdmlkZW9jcm9wL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOiAoZ3N0X3ZpZGVvX2Nyb3BfYmFzZV9pbml0KSwKKwkgIChnc3RfdmlkZW9fY3JvcF9jbGFzc19pbml0KSwgKGdzdF92aWRlb19jcm9wX2luaXQpLAorCSAgKGdzdF92aWRlb19jcm9wX2dldF9pbWFnZV9kZXRhaWxzX2Zyb21fY2FwcyksCisJICAoZ3N0X3ZpZGVvX2Nyb3BfZ2V0X3VuaXRfc2l6ZSksIChnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fcGFja2VkKSwKKwkgIChnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fcGxhbmFyKSwgKGdzdF92aWRlb19jcm9wX3RyYW5zZm9ybSksCisJICAoZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX2RpbWVuc2lvbiksCisJICAoZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX2RpbWVuc2lvbl92YWx1ZSksCisJICAoZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX2NhcHMpLCAoZ3N0X3ZpZGVvX2Nyb3Bfc2V0X2NhcHMpLAorCSAgKGdzdF92aWRlb19jcm9wX3NldF9wcm9wZXJ0eSksIChnc3RfdmlkZW9fY3JvcF9nZXRfcHJvcGVydHkpLAorCSAgKHBsdWdpbl9pbml0KToKKwkgIFBvcnQvcmV3cml0ZSB2aWRlb2Nyb3AgZnJvbSBzY3JhdGNoIGZvciBHU3RyZWFtZXItMC4xMCwgYW5kIG1ha2UKKwkgIGl0IHN1cHBvcnQgYWxsIGZvcm1hdHMgdmlkZW9zY2FsZSBzdXBwb3J0cyAoIzM0NTY1MykuCisKKzIwMDYtMDktMDIgMTQ6NDU6MDQgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgc3lzL3Y0bDIvOiBXaGl0ZXNwYWNlIGNsZWFudXBzLCBkYXNoaWZ5IHByb3BlcnR5LW5hbWVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMmNvbG9yYmFsYW5jZS5jOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICAoZ3N0X3Y0bDJfb2JqZWN0X2luc3RhbGxfcHJvcGVydGllc19oZWxwZXIpOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19jbGFzc19pbml0KToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSAgV2hpdGVzcGFjZSBjbGVhbnVwcywgZGFzaGlmeSBwcm9wZXJ0eS1uYW1lcy4KKworMjAwNi0wOS0wMiAxNDoyODo1NSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBzeXMvdjRsMi86IENsZWFudXAgZXJyb3IgbWVzc2FnZXMgYW5kIHVuaWZ5IGhlYWRlciBjb21tZW50cworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMmNvbG9yYmFsYW5jZS5jOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmg6CisJICAqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5oOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYzogKGdzdF92NGwyX3hvdmVybGF5X29wZW4pOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuaDoKKwkgICogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOiAoZ3N0X3Y0bDJfZ2V0X2NhcGFiaWxpdGllcyksCisJICAoZ3N0X3Y0bDJfb3Blbik6CisJICAqIHN5cy92NGwyL3Y0bDJfY2FsbHMuaDoKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfcXVldWVfZnJhbWUpLAorCSAgKGdzdF92NGwyc3JjX2NhcHR1cmVfaW5pdCk6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuaDoKKwkgIENsZWFudXAgZXJyb3IgbWVzc2FnZXMgYW5kIHVuaWZ5IGhlYWRlciBjb21tZW50cworCisyMDA2LTA4LTMwIDE4OjAxOjUyICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIEFub3RoZXIgc21hbGwgZml4IHRvIHNldF9jYXBzIGZ1bmN0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBBbm90aGVyIHNtYWxsIGZpeCB0byBzZXRfY2FwcyBmdW5jdGlvbi4KKworMjAwNi0wOC0zMCAxMzozMDoxMyArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBTZW5kIG5ld19zZWdtZW50IGluIEdTVF9GT1JNQVRfVElNRSBpbnN0ZWFkIG9mIGluIEdTVF9GT1JNQVRfQllURVMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFNlbmQgbmV3X3NlZ21lbnQgaW4gR1NUX0ZPUk1BVF9USU1FIGluc3RlYWQgb2YgaW4gR1NUX0ZPUk1BVF9CWVRFUy4KKworMjAwNi0wOC0zMCAxMTozNjowNiArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBBIHNtYWxsIGZpeCB0byBzZXRfY2FwcyBmdW5jdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQSBzbWFsbCBmaXggdG8gc2V0X2NhcHMgZnVuY3Rpb24uCisKKzIwMDYtMDgtMzAgMTE6Mjc6NDAgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogUmVzZXQgZWFjaCBzdHJlYW1zIGxhc3RfZmxvdyB0byBHU1RfRkxPV19PSy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICAoZ3N0X3F0ZGVtdXhfZG9fc2Vlayk6CisJICBSZXNldCBlYWNoIHN0cmVhbXMgbGFzdF9mbG93IHRvIEdTVF9GTE9XX09LLgorCSAgKGdzdF9xdGRlbXV4X2FjdGl2YXRlX3NlZ21lbnQpOgorCSAgUmVtb3ZpbmcgbXlzdGljIG1vZGlmaWNhdGlvbnMgZm9yIGdvb2QuCisKKzIwMDYtMDgtMzAgMTE6MDc6MzcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBwdXQgYmFjayAnc2VnbWVudCBzdGFydDw9c3RvcCcgY2hhbmdlIHRoYXQgd2FzIG15c3RpY2FsbHkgcmV2ZXJ0ZWQgYnkgdGhlIGxhc3QgY29tbWl0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfYWN0aXZhdGVfc2VnbWVudCksCisJICAocXRkZW11eF9wYXJzZV90cmVlKToKKwkgIHB1dCBiYWNrICdzZWdtZW50IHN0YXJ0PD1zdG9wJyBjaGFuZ2UgdGhhdCB3YXMgbXlzdGljYWxseSByZXZlcnRlZCBieQorCSAgdGhlIGxhc3QgY29tbWl0CisKKzIwMDYtMDgtMzAgMTA6NDM6NTMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBGaXggdGhlIGJ1aWxkIGZvciBkaXNhYmxlZCBkZWJ1ZworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2FjdGl2YXRlX3NlZ21lbnQpLAorCSAgKHF0ZGVtdXhfcGFyc2VfdHJlZSk6CisJICBGaXggdGhlIGJ1aWxkIGZvciBkaXNhYmxlZCBkZWJ1ZworCisyMDA2LTA4LTI5IDIwOjU5OjQ3ICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuaDoKKwkgIEZpeGVkIGZyYW1lcmF0ZSBuZWdvdGlhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRml4ZWQgZnJhbWVyYXRlIG5lZ290aWF0aW9uLgorCisyMDA2LTA4LTI4IDE3OjQ3OjI5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IE1ha2Ugc3VyZSBzZWdtZW50IHN0YXJ0PD1zdG9wIGluIHdlaXJkIHF1aWNrdGltZSBmaWxlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9hY3RpdmF0ZV9zZWdtZW50KSwKKwkgIChnc3RfcXRkZW11eF9hZGRfc3RyZWFtKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayksCisJICAocXRkZW11eF92aWRlb19jYXBzKToKKwkgIE1ha2Ugc3VyZSBzZWdtZW50IHN0YXJ0PD1zdG9wIGluIHdlaXJkIHF1aWNrdGltZSBmaWxlcy4KKworMjAwNi0wOC0yOCAxNjo1OToxMyArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYyAoZ3N0X2R2MTM5NHNyY19mcm9tX3JhdzEzOTRoYW5kbGUpOiBOZXcgaGVscGVyIGZ1bmN0aW9uIHRvIGxlc3NlbiB0aGUgaWZkZWZzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA4LTI4ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYyAoZ3N0X2R2MTM5NHNyY19mcm9tX3JhdzEzOTRoYW5kbGUpOgorCSAgTmV3IGhlbHBlciBmdW5jdGlvbiB0byBsZXNzZW4gdGhlIGlmZGVmcy4KKwkgIChHU1RfSU5GT19PQkpFQ1QpOgorCSAgKGdzdF9kdjEzOTRzcmNfaXNvX3JlY2VpdmUpOiBVc2UgaXQuCisJICAoZ3N0X2R2MTM5NHNyY19jcmVhdGUpOiBBbHNvIHVzZSB0aGUgY29udHJvbCBzb2NrZXRzIGluIGllYzYxODgzCisJICBtb2RlLgorCSAgKGdzdF9kdjEzOTRzcmNfc3RhcnQsIGdzdF9kdjEzOTRzcmNfc3RvcCk6IEFsd2F5cyB1c2UgYSBzZXBhcmF0ZQorCSAgaGFuZGxlIGZvciBBVkMgb3BlcmF0aW9uczsgZml4ZXMgIzM0ODIzMy4KKworMjAwNi0wOC0yOCAxNDo1OTowNSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBzeXMvdjRsMi92NGwyX2NhbGxzLmM6IGFkZCBjb21tZW50cyBhbmQgbW9yZSBkZWJ1ZyBsb2dnaW5nCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOiAoZ3N0X3Y0bDJfZmlsbF9saXN0cyk6CisJICBhZGQgY29tbWVudHMgYW5kIG1vcmUgZGVidWcgbG9nZ2luZworCisyMDA2LTA4LTI3IDE3OjE0OjA2ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIFJlbmFtZSBhZ2FpbiAoYXVkaW9meGdvb2QgLT4gYXVkaW9meCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meGdvb2QueG1sOgorCSAgKiBnc3QvYXVkaW9meC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9meC5jOgorCSAgKiBnc3QvYXVkaW9meGdvb2QvLmN2c2lnbm9yZToKKwkgICogZ3N0L2F1ZGlvZnhnb29kL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXVkaW9meGdvb2QvYXVkaW9meC5jOgorCSAgKiBnc3QvYXVkaW9meGdvb2QvYXVkaW9wYW5vcmFtYS5jOgorCSAgKiBnc3QvYXVkaW9meGdvb2QvYXVkaW9wYW5vcmFtYS5oOgorCSAgUmVuYW1lIGFnYWluIChhdWRpb2Z4Z29vZCAtPiBhdWRpb2Z4KS4KKworMjAwNi0wOC0yNyAxMzoxMjo1MiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IEluaXRpYWx6ZSB2YXJpYWJsZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9uZXh0X2RhdGFfYnVmZmVyKSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9zY2FuKToKKwkgIEluaXRpYWx6ZSB2YXJpYWJsZXMuCisKKzIwMDYtMDgtMjUgMTY6MjE6MzcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguKjogTW9yZSBhdHRlbXB0cyB0byB0dXJuIHRoaXMgaW50byByZWFkYWJsZSBjb2RlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfY2xhc3NfaW5pdCksCisJICAoZ3N0X2F2aV9kZW11eF9pbml0KSwgKGdzdF9hdmlfZGVtdXhfZmluYWxpemUpLAorCSAgKGdzdF9hdmlfZGVtdXhfcmVzZXQpLCAoZ3N0X2F2aV9kZW11eF9pbmRleF9sYXN0KSwKKwkgIChnc3RfYXZpX2RlbXV4X2luZGV4X25leHQpLCAoZ3N0X2F2aV9kZW11eF9pbmRleF9lbnRyeV9mb3JfdGltZSksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdWJpbmRleCksIChnc3RfYXZpX2RlbXV4X3BhcnNlX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksIChnc3RfYXZpX2RlbXV4X3BlZWtfdGFnKSwKKwkgIChnc3RfYXZpX2RlbXV4X25leHRfZGF0YV9idWZmZXIpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fc2NhbiksCisJICAoZ3N0X2F2aV9kZW11eF9tYXNzYWdlX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X2NhbGN1bGF0ZV9kdXJhdGlvbnNfZnJvbV9pbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyX3B1bGwpLCAoZ3N0X2F2aV9kZW11eF9kb19zZWVrKSwKKwkgIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSksIChnc3RfYXZpX2RlbXV4X2xvb3ApLAorCSAgKGdzdF9hdmlfZGVtdXhfY2hhaW4pLCAoZ3N0X2F2aV9kZW11eF9zaW5rX2FjdGl2YXRlKSwKKwkgIChnc3RfYXZpX2RlbXV4X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIE1vcmUgYXR0ZW1wdHMgdG8gdHVybiB0aGlzIGludG8gcmVhZGFibGUgY29kZS4KKwkgIERvbid0IGxlYWsgYWRhcHRlcnMuCisJICBDYWxjdWxhdGUgZHVyYXRpb24gYWNjb3JkaW5nIHRvIGluZGV4IG1vcmUgZWZmaWNpZW50bHkuCisJICBEb24ndCB0cnkgdG8gYWN0IGxpa2Ugd2UgZHJpdmUgdGhlIHBpcGVsaW5lIGluIGNoYWluIG1vZGUuCisKKzIwMDYtMDgtMjUgMDk6NTM6MTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9hbm5vZGV4L2dzdGNtbWx1dGlscy5jOiBGaXggYnVpbGQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbHV0aWxzLmM6IChnc3RfY21tbF9jbG9ja190aW1lX2Zyb21fbnB0KToKKwkgIEZpeCBidWlsZC4KKworMjAwNi0wOC0yNSAwOTo0Mjo0MyArMDAwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm9Abm52YS5vcmc+CisKKwkgIGV4dC9hbm5vZGV4L2dzdGFubm9kZXguYzogRG8gc29tZSBleHRyYSBzYW5pdHkgY2hlY2tzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8gYXQgbm52YSBkb3Qgb3JnPgorCSAgKiBleHQvYW5ub2RleC9nc3Rhbm5vZGV4LmM6IChnc3RfYW5ub2RleF9ncmFudWxlX3RvX3RpbWUpOgorCSAgRG8gc29tZSBleHRyYSBzYW5pdHkgY2hlY2tzLgorCSAgRml4ZXMgIzM1MDM0MC4KKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOiAoZ3N0X2NtbWxfZW5jX2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X2NtbWxfZW5jX3BhcnNlX3RhZ19oZWFkKSwgKGdzdF9jbW1sX2VuY19wYXJzZV90YWdfY2xpcCksCisJICAoZ3N0X2NtbWxfZW5jX3B1c2hfY2xpcCksIChnc3RfY21tbF9lbmNfcHVzaCk6CisJICBDaGVjayBpZiBjbGlwLT5zdGFydF90aW1lIGlzIHZhbGlkIGJlZm9yZSBhZGRpbmcgdGhlIGNsaXAgdG8gdGhlCisJICB0cmFjayBsaXN0LgorCSAgUmVzZXQgZW5jLT5wcmVhbWJsZSBnb2luZyBmcm9tIFBBVVNFRCB0byBSRUFEWS4KKwkgIERvbid0IHVzZSBHU1RfRkxPV19VTkVYUEVDVEVEIGZvciB3cm9uZyB1c2FnZSBvZiB0aGUgZWxlbWVudCwgaXQgaXMKKwkgIG9ubHkgdXNlZCBmb3IgRU9TLgorCSAgT25seSBwb3N0IGFuIGVycm9yIG1lc3NhZ2UgaWYgd2Ugd2VyZSB0aGUgb25lIHRoYXQgY3JlYXRlZCB0aGUgZmF0YWwKKwkgIEdzdEZsb3dSZXR1cm4gdmFsdWUuCisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWx1dGlscy5jOiAoZ3N0X2NtbWxfY2xvY2tfdGltZV9mcm9tX25wdCksCisJICAoZ3N0X2NtbWxfY2xvY2tfdGltZV90b19ncmFudWxlKSwgKGdzdF9jbW1sX3RyYWNrX2xpc3RfaGFzX2NsaXApOgorCSAgUGFyc2UgdGhlIHNlY29uZHMgZmllbGQgb2YgdGhlIG5wdC1zZWMgdGltZSBmb3JtYXQgdXNpbmcgJWxsdSByYXRoZXIgdGhhbgorCSAgJWQgYW5kIGNoZWNrIHRoYXQgdGhlIHZhbHVlIHNjYWxlZCBieSBHU1RfU0VDT05EIGRvZXNuJ3Qgb3ZlcmZsb3cuCisJICBVc2UgZ3VpbnQ2NChzKSB0byByZXByZXNlbnQgdGhlIGtleWluZGV4IGFuZCBrZXlvZmZzZXQgZmllbGRzIG9mIGEgZ3JhbnVsZXBvcy4KKwkgIExvb2t1cCBhIGNsaXAncyB0cmFjayB3aXRoIGNsaXAtPnRyYWNrIHJhdGhlciB0aGFuIGNsaXAtPmlkIHdoaWNoCisJICBtYWtlcyBubyBzZW5zZS4KKwkgIElkZW50aWZ5IGEgY2xpcCBieSBpdHMgdHJhY2sgYW5kIHN0YXJ0IHRpbWUgYW5kIG5vdCBpdHMgeG1sIGlkLgorCSAgZG8gc29tZSBtb3JlIGlucHV0IGNoZWNraW5nIGFuZCBtYWtlIHN1cmUgd2UgZG9uJ3QgZG8gdW5kZWZpbmVkIHNoaWZ0cy4KKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvY21tbGRlYy5jOiAoc2V0dXBfY21tbGRlYyksCisJICAodGVhcmRvd25fY21tbGRlYyksIChjaGVja19vdXRwdXRfYnVmZmVyX2lzX2VxdWFsKSwgKHB1c2hfZGF0YSksCisJICAoY21tbF90YWdfbWVzc2FnZV9wb3ApLCAoY2hlY2tfaGVhZGVycyksIChwdXNoX2NsaXBfZnVsbCksCisJICAocHVzaF9jbGlwKSwgKHB1c2hfZW1wdHlfY2xpcCksIChjaGVja19vdXRwdXRfY2xpcCksCisJICAoR1NUX1NUQVJUX1RFU1QpLCAoY21tbGRlY19zdWl0ZSk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxlbmMuYzogKHNldHVwX2NtbWxlbmMpLAorCSAgKHRlYXJkb3duX2NtbWxlbmMpLCAoY2hlY2tfb3V0cHV0X2J1ZmZlcl9pc19lcXVhbCksIChwdXNoX2RhdGEpLAorCSAgKGNoZWNrX2hlYWRlcnMpLCAocHVzaF9jbGlwKSwgKGNoZWNrX2NsaXBfdGltZXMpLCAoY2hlY2tfY2xpcCksCisJICAoY2hlY2tfZW1wdHlfY2xpcCksIChHU1RfU1RBUlRfVEVTVCksIChjbW1sZW5jX3N1aXRlKToKKwkgIEFkZGVkIHNvbWUgbW9yZSBjaGVja3MuCisKKzIwMDYtMDgtMjQgMTk6MDA6MjIgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgTWFrZSBhbHNvIHRoZSBwYW4tcHJvcGVydHkgZmxvYXQgKHNhdmVzIHNjYWxpbmcgYW5kIHlpZWxkcyBiZXR0ZXIgcmVzb2x1dGlvbikKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meGdvb2QvYXVkaW9wYW5vcmFtYS5jOiAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX2NsYXNzX2luaXQpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV90cmFuc2Zvcm1fbTJzX2ludCksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybV9zMnNfaW50KSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtX20yc19mbG9hdCksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybV9zMnNfZmxvYXQpOgorCSAgKiBnc3QvYXVkaW9meGdvb2QvYXVkaW9wYW5vcmFtYS5oOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3Bhbm9yYW1hLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICBNYWtlIGFsc28gdGhlIHBhbi1wcm9wZXJ0eSBmbG9hdCAoc2F2ZXMgc2NhbGluZyBhbmQgeWllbGRzIGJldHRlcgorCSAgcmVzb2x1dGlvbikKKworMjAwNi0wOC0yNCAxODoyMzoxNCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXVkaW9meGdvb2QvYXVkaW9wYW5vcmFtYS5jOiBDaGFuZ2VMb2cgc3VyZ2VyeSB0byBhZGQgY3ltYXgncyByZWFsIG5hbWUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meGdvb2QvYXVkaW9wYW5vcmFtYS5jOiAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3NldF9jYXBzKSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtX20yc19mbG9hdCksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybV9zMnNfZmxvYXQpOgorCSAgQ2hhbmdlTG9nIHN1cmdlcnkgdG8gYWRkIGN5bWF4J3MgcmVhbCBuYW1lCisKKzIwMDYtMDgtMjQgMTg6MTc6MjAgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F1ZGlvZnhnb29kL2F1ZGlvcGFub3JhbWEuKjogQWRkZWQgZmxvYXQgc3VwcG9ydCAodGhhbmtzIGN5bWF4KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdWRpb2Z4Z29vZC9hdWRpb3Bhbm9yYW1hLmM6IChnc3RfYXVkaW9fcGFub3JhbWFfc2V0X2NhcHMpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV90cmFuc2Zvcm1fbTJzX2ludCksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybV9zMnNfaW50KSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtX20yc19mbG9hdCksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybV9zMnNfZmxvYXQpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV90cmFuc2Zvcm0pOgorCSAgKiBnc3QvYXVkaW9meGdvb2QvYXVkaW9wYW5vcmFtYS5oOgorCSAgQWRkZWQgZmxvYXQgc3VwcG9ydCAodGhhbmtzIGN5bWF4KQorCisyMDA2LTA4LTI0IDE0OjE2OjU1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9hdWRpb2Z4Z29vZC9hdWRpb3Bhbm9yYW1hLmM6IEZpeCBkb2NzICYgZGVidWcgY2F0ZWdvcnkuIEFkZCBGaXhtZSBmb3Igdm9sdW1lIHBhbiBsZXZlbHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1ZGlvZnhnb29kL2F1ZGlvcGFub3JhbWEuYzoKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtX20ycyk6CisJICBGaXggZG9jcyAmIGRlYnVnIGNhdGVnb3J5LiBBZGQgRml4bWUgZm9yIHZvbHVtZSBwYW4gbGV2ZWxzLgorCisyMDA2LTA4LTI0IDEzOjUxOjE1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogdW5icmVhayBBVkkgaW5kZXggaGFuZGxpbmcsIHNvbWUgbW9yZSBkZWJ1ZywgcmVtb3ZlIGFuIG9ic29sZXRlIGFkYXB0ZXJfZmx1c2ggdGhhdCBjYXVzZWQgc3RyZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcmVhZF9zdWJpbmRleGVzX3B1bGwpLAorCSAgKGdzdF9hdmlfZGVtdXhfc3luYyksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXJfcHVzaCksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyX3B1bGwpLAorCSAgKGdzdF9hdmlfZGVtdXhfcHJvY2Vzc19uZXh0X2VudHJ5KSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2RhdGEpLAorCSAgKGdzdF9hdmlfZGVtdXhfY2hhaW4pOgorCSAgdW5icmVhayBBVkkgaW5kZXggaGFuZGxpbmcsIHNvbWUgbW9yZSBkZWJ1ZywgcmVtb3ZlIGFuIG9ic29sZXRlCisJICBhZGFwdGVyX2ZsdXNoIHRoYXQgY2F1c2VkIHN0cmVhbWluZyB0byB3YW5kZXIgb2ZmIGluIHRoZSB3aWxkCisKKzIwMDYtMDgtMjQgMTE6MjE6MDYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguKjogU29tZSBtb3JlIGNsZWFudXBzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdXBlcmluZGV4KSwgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3ViaW5kZXgpLAorCSAgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKSwgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfb2RtbCksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9pbmRleCksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9jYWxjdWxhdGVfZHVyYXRpb25zX2Zyb21faW5kZXgpLAorCSAgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlcl9wdXNoKSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXJfcHVsbCk6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIFNvbWUgbW9yZSBjbGVhbnVwcy4KKwkgIEZpeCB0b3RhbEZyYW1lcyBwYXJzaW5nIGluIE9ETUwuCisJICBEaXNhYmxlIHVzZSBvZiBpbmRleCBmb3IgbGVuZ3RoIGNhbGN1bGF0aW9uIGluIGNhc2Ugb2YgT0RNTCBhcyB0aGlzIGlzCisJICBicm9rZW4gbm93LgorCisyMDA2LTA4LTI0IDEwOjAzOjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IFVzZSBsaWJnc3R0YWcgaGVscGVyIGZ1bmN0aW9uIGhlcmUgdG9vLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjX2RlY191cGRhdGVfbWV0YWRhdGEpOgorCSAgVXNlIGxpYmdzdHRhZyBoZWxwZXIgZnVuY3Rpb24gaGVyZSB0b28uCisKKzIwMDYtMDgtMjQgMDk6MjQ6MTEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiBQb3N0IGF1ZGlvIGNvZGVjIGFuZCBhdmVyYWdlIGJpdHJhdGUgdGFncyBvbiBidXMgKCMzNDQ0NzIpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW8gYXQgY2lyY3VsYXItY2hhb3Mub3JnPgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfcG9zdF90YWdzKSwKKwkgIChnc3Rfd2F2cGFja19kZWNfY2hhaW4pOgorCSAgUG9zdCBhdWRpbyBjb2RlYyBhbmQgYXZlcmFnZSBiaXRyYXRlIHRhZ3Mgb24gYnVzICgjMzQ0NDcyKS4KKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IChnc3Rfd2F2cGFja19wYXJzZV9iYXNlX2luaXQpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX3NyY19xdWVyeSk6CisJICBGb3J3YXJkIHF1ZXJpZXMgaW4gb3RoZXIgZm9ybWF0cyAoQllURSBmb3JtYXQgaW4gcGFydGljdWxhcikKKwkgIHVwc3RyZWFtOyBhZGQgU2ViYXN0aWFuIHRvIGF1dGhvcnMuCisKKzIwMDYtMDgtMjQgMDA6NDA6MDcgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5oOgorCSAgRml4IHNldF9jYXBzIHRvIHNldCB3aWR0aCBhbmQgaGVpZ2h0IHRvIHRoZSB2YWx1ZXMgdGhlIGRyaXZlciBpcyByZWFsbHkgd29ya2luZyB3aXRoLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGaXggc2V0X2NhcHMgdG8gc2V0IHdpZHRoIGFuZCBoZWlnaHQgdG8gdGhlIHZhbHVlcyB0aGUgZHJpdmVyIGlzIHJlYWxseSB3b3JraW5nIHdpdGguCisKKzIwMDYtMDgtMjMgMTU6MzM6NDcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC4qOiBJbml0aWFsIHN0cmVhbWluZyBzdXBwb3J0IGZvciBhdmlkZW11eCAoZml4ZXMgIzMzNjQ2NSkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2NsYXNzX2luaXQpLAorCSAgKGdzdF9hdmlfZGVtdXhfaW5pdCksIChnc3RfYXZpX2RlbXV4X2Rpc3Bvc2UpLAorCSAgKGdzdF9hdmlfZGVtdXhfcmVzZXQpLCAoZ3N0X2F2aV9kZW11eF9pbmRleF9uZXh0KSwKKwkgIChnc3RfYXZpX2RlbXV4X2luZGV4X2VudHJ5X2Zvcl90aW1lKSwgKGdzdF9hdmlfZGVtdXhfc3JjX2NvbnZlcnQpLAorCSAgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpLAorCSAgKGdzdF9hdmlfZGVtdXhfcGVla19jaHVua19pbmZvKSwgKGdzdF9hdmlfZGVtdXhfcGVla19jaHVuayksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5pdF9wdXNoKSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luaXRfcHVsbCksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdWJpbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9yZWFkX3N1YmluZGV4ZXNfcHVzaCksCisJICAoZ3N0X2F2aV9kZW11eF9yZWFkX3N1YmluZGV4ZXNfcHVsbCksIChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksCisJICAoc29ydCksIChnc3RfYXZpX2RlbXV4X3BhcnNlX2luZGV4KSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N5bmMpLCAoZ3N0X2F2aV9kZW11eF9wZWVrX3RhZyksCisJICAoZ3N0X2F2aV9kZW11eF9tYXNzYWdlX2luZGV4KSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlcl9wdXNoKSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXJfcHVsbCksCisJICAoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSksCisJICAocHVzaF90YWdfbGlzdHMpLCAoZ3N0X2F2aV9kZW11eF9sb29wKSwgKGdzdF9hdmlfZGVtdXhfY2hhaW4pLAorCSAgKGdzdF9hdmlfZGVtdXhfc2lua19hY3RpdmF0ZSksIChnc3RfYXZpX2RlbXV4X2FjdGl2YXRlX3B1c2gpLAorCSAgKGdzdF9hdmlfZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgSW5pdGlhbCBzdHJlYW1pbmcgc3VwcG9ydCBmb3IgYXZpZGVtdXggKGZpeGVzICMzMzY0NjUpCisKKzIwMDYtMDgtMjMgMTA6MzA6MzEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogRml4IG1lbSBsZWFrLCBzZW5kIG5ld3NlZ21lbnQgZXZlbnQgb24gY29ycmVjdGlvbiBwYWQgYXMgd2VsbCAoIzM1MjQ3NikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOiAoZ3N0X3dhdnBhY2tfZW5jX3B1c2hfYmxvY2spOgorCSAgRml4IG1lbSBsZWFrLCBzZW5kIG5ld3NlZ21lbnQgZXZlbnQgb24gY29ycmVjdGlvbiBwYWQKKwkgIGFzIHdlbGwgKCMzNTI0NzYpLgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogKGdzdF93YXZwYWNrX3BhcnNlX2Jhc2VfaW5pdCk6CisJICBSZXN0b3JlIG9yaWdpbmFsIGF1dGhvciAob24gU2ViYXN0aWFuJ3MgcmVxdWVzdCkuCisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9nc3QtcGx1Z2lucy1iYWQuc3VwcDoKKwkgIEFkZCAoc28gZmFyIGVtcHR5KSBzdXBwcmVzc2lvbiBmaWxlIGZvciAtYmFkLiBSZW1vdmUKKwkgIHdhdnBhY2tlbmMgdGVzdCBmcm9tIFZBTEdSSU5EX1RPX0ZJWCBub3cgdGhhdCB0aGUgbGVhaworCSAgaXMgZml4ZWQuCisKKzIwMDYtMDgtMjMgMDk6MjI6MDcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgdGVzdHMvY2hlY2svOiBBZGQgdW5pdCB0ZXN0cyBmb3Igd2F2cGFjayBlbGVtZW50cyAoIzM1MjQ3NikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tbyBhdCBjaXJjdWxhci1jaGFvcy5vcmc+CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZGVjLmM6IChzZXR1cF93YXZwYWNrZGVjKSwKKwkgIChjbGVhbnVwX3dhdnBhY2tkZWMpLCAoR1NUX1NUQVJUX1RFU1QpLCAod2F2cGFja2RlY19zdWl0ZSksIChtYWluKToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFja2VuYy5jOiAoc2V0dXBfd2F2cGFja2VuYyksCisJICAoY2xlYW51cF93YXZwYWNrZW5jKSwgKEdTVF9TVEFSVF9URVNUKSwgKHdhdnBhY2tlbmNfc3VpdGUpLCAobWFpbik6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2twYXJzZS5jOiAod2F2cGFja3BhcnNlX2ZvdW5kX3BhZCksCisJICAoc2V0dXBfd2F2cGFja3BhcnNlKSwgKGNsZWFudXBfd2F2cGFja3BhcnNlKSwgKEdTVF9TVEFSVF9URVNUKSwKKwkgICh3YXZwYWNrcGFyc2Vfc3VpdGUpLCAobWFpbik6CisJICBBZGQgdW5pdCB0ZXN0cyBmb3Igd2F2cGFjayBlbGVtZW50cyAoIzM1MjQ3NikuCisKKzIwMDYtMDgtMjMgMDg6NTI6NTAgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgQWRkIGRvY3MgZm9yIHdhdnBhY2sgZWxlbWVudHMgKCMzNTI0NzYpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW8gYXQgY2lyY3VsYXItY2hhb3Mub3JnPgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmg6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5oOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmg6CisJICBBZGQgZG9jcyBmb3Igd2F2cGFjayBlbGVtZW50cyAoIzM1MjQ3NikuCisKKzIwMDYtMDgtMjIgMjA6Mzk6MjYgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSAgRml4ZWQgcXVlcnkgc2l6ZSB0byB3b3JrIHdpdGggZHJpdmVycyB0aGF0IHVzZXMgaW50ZXJtZWRpYXRlIHN0ZXAgbGlrZSAid2lkdGggKiBoZWlnaHQiIHRvIGZpbmQgY2xvc2VzdCBzaXplLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGaXhlZCBxdWVyeSBzaXplIHRvIHdvcmsgd2l0aCBkcml2ZXJzIHRoYXQgdXNlcyBpbnRlcm1lZGlhdGUgc3RlcCBsaWtlICJ3aWR0aCAqIGhlaWdodCIgdG8gZmluZCBjbG9zZXN0IHNpemUuCisKKzIwMDYtMDgtMjIgMTc6MjA6NDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOiBUaGVyZSBpcyBubyB0YWdsaWJtdXggZWxlbWVudCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgIFRoZXJlIGlzIG5vIHRhZ2xpYm11eCBlbGVtZW50IC4uLgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBVc2UgJyUnIHJhdGhlciB0aGFuICcmcGVyYzsnIGluIGd0ay1kb2MgYmx1cmIsIGRvY3MgYnVpbGQKKwkgIHdhcyBjb21wbGFpbmluZyBhYm91dCB1bmtub3duIGVudGl0eSBoZXJlLgorCisyMDA2LTA4LTIyIDE3OjAyOjM5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4Lio6IE1hcmsgRElTQ09OVC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksCisJICAoZ3N0X2F2aV9kZW11eF9kb19zZWVrKSwgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspLAorCSAgKGdzdF9hdmlfZGVtdXhfcHJvY2Vzc19uZXh0X2VudHJ5KToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgTWFyayBESVNDT05ULgorCSAgUmVtb3ZlIG9sZCB1bnVzZWQgZmllbGRzIGFuZCByZW9yZGVyIHRoZSBzdHJ1Y3QgYSBiaXQuCisKKzIwMDYtMDgtMjIgMTY6NDU6MzcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIFNtYWxsIGRvY3VtZW50YXRpb24gdXBkYXRlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19tZWRpYV90b19jYXBzKSwKKwkgIChnc3RfcnRzcHNyY19zZW5kKSwgKGdzdF9ydHNwc3JjX2Nsb3NlKSwgKGdzdF9ydHNwc3JjX3BsYXkpLAorCSAgKGdzdF9ydHNwc3JjX3BhdXNlKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3Nfc2lua19vcGVuKSwKKwkgIChnc3Rfb3NzX3NpbmtfcHJlcGFyZSksIChnc3Rfb3NzX3NpbmtfdW5wcmVwYXJlKToKKwkgIFNtYWxsIGRvY3VtZW50YXRpb24gdXBkYXRlcy4KKworMjAwNi0wOC0yMiAxNjo0MjoyMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC4qOiBQcmVjYWxjIG1vc3Qgb2YgdGhlIGR1cmF0aW9uIHF1ZXJ5IGZvciBlYWNoIHN0cmVhbS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3Jlc2V0KSwKKwkgIChnc3RfYXZpX2RlbXV4X2luZGV4X2VudHJ5X2Zvcl90aW1lKSwKKwkgIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpLCAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX2V2ZW50KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbml0KSwgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksIChnc3RfYXZpX2RlbXV4X3BlZWtfdGFnKSwKKwkgIChnc3RfYXZpX2RlbXV4X25leHRfZGF0YV9idWZmZXIpLAorCSAgKGdzdF9hdmlfZGVtdXhfY2FsY3VsYXRlX2R1cmF0aW9uc19mcm9tX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXIpLCAoZ3N0X2F2aV9kZW11eF9kb19zZWVrKSwKKwkgIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zZWVrKSwgKGdzdF9hdmlfZGVtdXhfYWdncmVnYXRlZF9mbG93KSwKKwkgIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSksIChnc3RfYXZpX2RlbXV4X2xvb3ApLAorCSAgKGdzdF9hdmlfZGVtdXhfc2lua19hY3RpdmF0ZV9wdWxsKSwgKGdzdF9hdmlfZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgUHJlY2FsYyBtb3N0IG9mIHRoZSBkdXJhdGlvbiBxdWVyeSBmb3IgZWFjaCBzdHJlYW0uCisJICBNYWtlIHNlZWtpbmcgbW9yZSBjb3JyZWN0LgorCSAgVXNlIEdzdFNlZ21lbnQgdG8gdHJhY2sgcG9zaXRpb24gYW5kIGR1cmF0aW9uLgorCSAgQ29kZSBjbGVhbnVwcyBhbmQgbGVhayBmaXhlcy4KKwkgIENhbGN1bGF0ZSBjb3JyZWN0IHRvdGFsIGR1cmF0aW9uIGJhc2VkIG9uIGluZGV4IGxlbmd0aC4KKworMjAwNi0wOC0yMiAxMzo1MzozNCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiBJZiBzdHJpbmdzIGluIHRleHQgZmllbGRzIGFyZSBtYXJrZWQgSVNPODg1OS0xLCBidXQgY29udGFpbiB2YWxpZCBVVEYtOCBhbHJlYWR5LCB0aGVuIGhhbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiAocGFyc2VfdGV4dF9pZGVudGlmaWNhdGlvbl9mcmFtZSksCisJICAocGFyc2VfaW5zZXJ0X3N0cmluZ19maWVsZCk6CisJICBJZiBzdHJpbmdzIGluIHRleHQgZmllbGRzIGFyZSBtYXJrZWQgSVNPODg1OS0xLCBidXQgY29udGFpbgorCSAgdmFsaWQgVVRGLTggYWxyZWFkeSwgdGhlbiBoYW5kbGUgdGhlbSBhcyBVVEYtOCBhbmQgaWdub3JlCisJICB0aGUgZW5jb2RpbmcuICgjMzUxNzk0KQorCisyMDA2LTA4LTIyIDEyOjI4OjI0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLio6IE1ha2UgZmxhYy1pbi1vZ2cgd29yayAoIzM1MjEwMCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfZGVjX3NjYW5fZ290X2ZyYW1lKSwKKwkgIChnc3RfZmxhY19kZWNfd3JpdGUpLCAoZ3N0X2ZsYWNfZGVjX2xvb3ApLAorCSAgKGdzdF9mbGFjX2RlY19zaW5rX2V2ZW50KSwgKGdzdF9mbGFjX2RlY19jaGFpbiksCisJICAoZ3N0X2ZsYWNfZGVjX3NyY19xdWVyeSk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuaDoKKwkgIE1ha2UgZmxhYy1pbi1vZ2cgd29yayAoIzM1MjEwMCkuCisKKzIwMDYtMDgtMjIgMTI6MTA6MzIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6IERvbid0IHVucmVmIGJ1ZmZlcnMgb2Ygd2hpY2ggd2UndmUgYWxyZWFkeSBnaXZlbiBhd2F5IG93bmVyc2hpcCB0byB0aGUgYWRhcHRlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOiAoZ3N0X21vbm9zY29wZV9jaGFpbik6CisJICBEb24ndCB1bnJlZiBidWZmZXJzIG9mIHdoaWNoIHdlJ3ZlIGFscmVhZHkgZ2l2ZW4gYXdheQorCSAgb3duZXJzaGlwIHRvIHRoZSBhZGFwdGVyLgorCisyMDA2LTA4LTIyIDEwOjMyOjM0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzogTWFrZSBtZXRhZGF0YSBleHRyYWN0aW9uIGFjdHVhbGx5IHdvcmsuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IChzcGVleF9kZWNfY2hhaW5fcGFyc2VfY29tbWVudHMpOgorCSAgTWFrZSBtZXRhZGF0YSBleHRyYWN0aW9uIGFjdHVhbGx5IHdvcmsuCisJICAqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiAoZ3N0X3NwZWV4ZW5jX2Jhc2VfaW5pdCksCisJICAoZ3N0X3NwZWV4ZW5jX2luaXQpLCAoZ3N0X3NwZWV4ZW5jX2NyZWF0ZV9tZXRhZGF0YV9idWZmZXIpLAorCSAgKGdzdF9zcGVleGVuY19jaGFpbik6CisJICBGaXggbWV0YWRhdGEgd3JpdGluZzogcmVwbGFjZSBvbGQgY29kZSB3aGljaCB3cm90ZSBjb21wbGV0ZWx5CisJICBicm9rZW4gdGFncyB3aXRoIGxpYmdzdHRhZy1iYXNlZCBjb2RlLiBQbHVzIG1pc2NlbGxhbmVvdXMKKwkgIGNvZGUgY2xlYW51cHMgKHVzZSBzdGF0aWMgcGFkIHRlbXBsYXRlcyBldGMuKSBhbmQgYSBidW5jaAorCSAgb2YgbGVhayBmaXhlcy4KKworMjAwNi0wOC0yMSAxOTozNDowMyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXVkaW9wYW5vcmFtYS86IGRpZSEgZGllISBkaWUhIHlvdSBzaG91bGQgbmV2ZXIgaGF2ZSBiZWVuIHRoZXJlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1ZGlvcGFub3JhbWEvLmN2c2lnbm9yZToKKwkgICogZ3N0L2F1ZGlvcGFub3JhbWEvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdWRpb3Bhbm9yYW1hL2F1ZGlvZnguYzoKKwkgICogZ3N0L2F1ZGlvcGFub3JhbWEvYXVkaW9wYW5vcmFtYS5jOgorCSAgKiBnc3QvYXVkaW9wYW5vcmFtYS9hdWRpb3Bhbm9yYW1hLmg6CisJICBkaWUhIGRpZSEgZGllISB5b3Ugc2hvdWxkIG5ldmVyIGhhdmUgYmVlbiB0aGVyZQorCisyMDA2LTA4LTIxIDE2OjI0OjI4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFNvbWUgbW9yZSBjb25zdGlmaWNhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9hZGRfc3RyZWFtKSwgKHF0ZGVtdXhfcGFyc2UpLAorCSAgKHF0ZGVtdXhfbm9kZV9kdW1wX2ZvcmVhY2gpLCAocXRkZW11eF9wYXJzZV90cmFrKSwKKwkgIChxdGRlbXV4X3ZpZGVvX2NhcHMpLCAocXRkZW11eF9hdWRpb19jYXBzKToKKwkgIFNvbWUgbW9yZSBjb25zdGlmaWNhdGlvbi4KKwkgIEZpeCBzb21lIHBhbGV0dGVkIGRhdGEgZm9ybWF0cyBhZ2Fpbi4KKwkgIEZpeCB1bGF3L2FsYXcgaW4gcXQuCisJICBTZXQgY29ycmVjdCBjYXBzIGZvciByYXcgUkdCLgorCSAgQWRkIHN1cHBvcnQgZm9yIHl1djIsIHdoaWNoIGlzIGxpa2UgWXV2Mi4KKwkgIEFkZCBzdXBwb3J0IGZvciByYXcgYXVkaW8gd2l0aCB0aGUgTk9ORSBmb3VyY2MsIHdoaWNoIGlzIGxpa2UgcmF3LgorCisyMDA2LTA4LTIxIDEzOjU5OjUyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvd2F2cGFjay86IE1vcmUgY2xlYW4tdXBzOiB1c2Ugc2hvcnRlciB2YXJpYWJsZSBuYW1lcyB0byBtYWtlIGNvZGUgZWFzaWVyIHRvIHJlYWQ7IHByZWZpeCBzdHJ1Y3R1cmVzIHdlIGRlZmluZSB3aXQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfaW5pdCksCisJICAoZ3N0X3dhdnBhY2tfZW5jX2ZpbmFsaXplKSwgKGdzdF93YXZwYWNrX2VuY19zaW5rX3NldF9jYXBzKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfc2V0X3dwX2NvbmZpZyksIChnc3Rfd2F2cGFja19lbmNfZm9ybWF0X3NhbXBsZXMpLAorCSAgKGdzdF93YXZwYWNrX2VuY19wdXNoX2Jsb2NrKSwgKGdzdF93YXZwYWNrX2VuY19jaGFpbiksCisJICAoZ3N0X3dhdnBhY2tfZW5jX3Jld3JpdGVfZmlyc3RfYmxvY2spLAorCSAgKGdzdF93YXZwYWNrX2VuY19zaW5rX2V2ZW50KSwgKGdzdF93YXZwYWNrX2VuY19jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF93YXZwYWNrX2VuY19zZXRfcHJvcGVydHkpLCAoZ3N0X3dhdnBhY2tfZW5jX2dldF9wcm9wZXJ0eSk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuaDoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IChnc3Rfd2F2cGFja19wYXJzZV9yZXNldCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2Vfc3JjX3F1ZXJ5KSwgKGdzdF93YXZwYWNrX3BhcnNlX3NyY19ldmVudCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfaW5pdCksIChnc3Rfd2F2cGFja19wYXJzZV9nZXRfdXBzdHJlYW1fbGVuZ3RoKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9sb29wKToKKwkgIE1vcmUgY2xlYW4tdXBzOiB1c2Ugc2hvcnRlciB2YXJpYWJsZSBuYW1lcyB0byBtYWtlIGNvZGUgZWFzaWVyIHRvCisJICByZWFkOyBwcmVmaXggc3RydWN0dXJlcyB3ZSBkZWZpbmUgd2l0aCAnR3N0JyB0byBtYWtlIGl0IGNsZWFyZXIKKwkgIHdoZXJlIHRoZXkgY29tZSBmcm9tLgorCisyMDA2LTA4LTIxIDEzOjI2OjM3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IEZpeCBjYXBzIHNldCBvbiBidWZmZXJzIGFuZCB0ZW1wbGF0ZSBjYXBzIChvdXRwdXQgaXMgZnJhbWVkKSBhbmQgbWFrZSB0aGVtIG1hdGNoICgjMzUxNjYuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfaW5pdCksCisJICAoZ3N0X3dhdnBhY2tfZW5jX3NldF93cF9jb25maWcpLCAoZ3N0X3dhdnBhY2tfZW5jX3B1c2hfYmxvY2spLAorCSAgKGdzdF93YXZwYWNrX2VuY19jaGFpbiksIChnc3Rfd2F2cGFja19lbmNfcmV3cml0ZV9maXJzdF9ibG9jayksCisJICAoZ3N0X3dhdnBhY2tfZW5jX3NpbmtfZXZlbnQpOgorCSAgRml4IGNhcHMgc2V0IG9uIGJ1ZmZlcnMgYW5kIHRlbXBsYXRlIGNhcHMgKG91dHB1dCBpcyBmcmFtZWQpCisJICBhbmQgbWFrZSB0aGVtIG1hdGNoICgjMzUxNjYzKTsgdXNlIEdTVF9XQVJOSU5HX09CSkVDVCBpbnN0ZWFkIG9mCisJICBHU1RfRUxFTUVOVF9XQVJOSU5HOyBzaW1wbGlmeSBwdXNoX2Jsb2NrKCk7IGRvIHNvbWUgc21hbGwKKwkgIGNsZWFuLXVwcyBoZXJlIGFuZCB0aGVyZTsgZml4IG1lbWxlYWsgKCMzNTE2NjMpLgorCisyMDA2LTA4LTIxIDEzOjEyOjQ3ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9wYW5vcmFtYS5jOiBGaXggaW52YWxpZCBtZW1vcnkgYWNjZXNzIGluIGF1ZGlvcGFub3JhbWEgdGVzdCBzdWl0ZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3Bhbm9yYW1hLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICBGaXggaW52YWxpZCBtZW1vcnkgYWNjZXNzIGluIGF1ZGlvcGFub3JhbWEgdGVzdCBzdWl0ZS4KKworMjAwNi0wOC0yMSAxMTozNDo0MSArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZTogaWdub3JlIGJ1aWx0IGZpbGUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOgorCSAgaWdub3JlIGJ1aWx0IGZpbGUKKworMjAwNi0wOC0yMSAxMDo0NjoyMSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9NYWtlZmlsZS5hbTogRml4IHRoZSBidWlsZCBhZ2Fpbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgRml4IHRoZSBidWlsZCBhZ2Fpbi4KKworMjAwNi0wOC0yMSAwOToyMToyNyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXVkaW9meGdvb2QvOiByZXN1Ym1pdCB3aXRoIHRoZSBkZXNpcmVkIG5hbWUgKmFnYWluKgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdWRpb2Z4Z29vZC8uY3ZzaWdub3JlOgorCSAgKiBnc3QvYXVkaW9meGdvb2QvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdWRpb2Z4Z29vZC9hdWRpb2Z4LmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9hdWRpb2Z4Z29vZC9hdWRpb3Bhbm9yYW1hLmM6IChnc3RfYXVkaW9fcGFub3JhbWFfYmFzZV9pbml0KSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfY2xhc3NfaW5pdCksIChnc3RfYXVkaW9fcGFub3JhbWFfaW5pdCksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX2dldF91bml0X3NpemUpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV90cmFuc2Zvcm1fY2FwcyksIChnc3RfYXVkaW9fcGFub3JhbWFfc2V0X2NhcHMpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV90cmFuc2Zvcm1fbTJzKSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtX3MycyksIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtKToKKwkgICogZ3N0L2F1ZGlvZnhnb29kL2F1ZGlvcGFub3JhbWEuaDoKKwkgIHJlc3VibWl0IHdpdGggdGhlIGRlc2lyZWQgbmFtZSAqYWdhaW4qCisKKzIwMDYtMDgtMjAgMTM6MDk6NTEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdXNlIGdfYXNzZXJ0IGluIF9nZXRfdW5pdF9zaXplCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuYzogKGdzdF9waXhidWZzY2FsZV9nZXRfdW5pdF9zaXplKToKKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X2dldF91bml0X3NpemUpOgorCSAgdXNlIGdfYXNzZXJ0IGluIF9nZXRfdW5pdF9zaXplCisKKzIwMDYtMDgtMjAgMTM6MDY6NDQgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogY2xlYW51cCAtdW51c2VkLnR4dCB0byBtYWtlIGl0IHVzZWZ1bCwgYWRkIHByZXZpb3VzbHkgbWlzc2luZyBkb2NzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meGdvb2QueG1sOgorCSAgY2xlYW51cCAtdW51c2VkLnR4dCB0byBtYWtlIGl0IHVzZWZ1bCwgYWRkIHByZXZpb3VzbHkgbWlzc2luZyBkb2NzCisJICAqIGV4dC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2VzZC9lc2Rtb24uYzoKKwkgICogZXh0L2VzZC9lc2RzaW5rLmM6CisJICAqIGV4dC9lc2QvZ3N0ZXNkLmM6IChwbHVnaW5faW5pdCk6CisJICByZWZsb3cgdG8gZ2V0IHJpZCBvZiB0d28gZXh0ZXJuYWwgc3ltYm9scworCSAgKiBnc3QvYXVkaW9meGdvb2QvYXVkaW9meC5jOiAocGx1Z2luX2luaXQpOgorCSAgcmUtYWRkCisKKzIwMDYtMDgtMjAgMTI6MDk6MTYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F1ZGlvZnhnb29kL2F1ZGlvZnguYworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L2F1ZGlvZnhnb29kLy5jdnNpZ25vcmU6CisJICAqIGdzdC9hdWRpb2Z4Z29vZC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvZnhnb29kL2F1ZGlvZnguYworCSAgKiBnc3QvYXVkaW9meGdvb2QvYXVkaW9wYW5vcmFtYS5jOiAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX2Jhc2VfaW5pdCksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX2NsYXNzX2luaXQpLCAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX2luaXQpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV9nZXRfdW5pdF9zaXplKSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtX2NhcHMpLCAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3NldF9jYXBzKSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtX20ycyksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybV9zMnMpLCAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybSk6CisJICAqIGdzdC9hdWRpb2Z4Z29vZC9hdWRpb3Bhbm9yYW1hLmg6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3Bhbm9yYW1hLmM6IChzZXR1cF9wYW5vcmFtYV9tKSwKKwkgIChzZXR1cF9wYW5vcmFtYV9zKSwgKGNsZWFudXBfcGFub3JhbWEpLCAoR1NUX1NUQVJUX1RFU1QpLAorCSAgKHBhbm9yYW1hX3N1aXRlKSwgKG1haW4pOgorCSAgQWRkIGF1ZGlvZnhnb29kIHBsdWdpbiB3aXRoIGF1ZGlvcGFub3JhbWEgZWxlbWVudAorCisyMDA2LTA4LTE4IDIxOjM5OjAwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiBGaXggcmVzeW5jaW5nIGluIHB1c2ggbW9kZSBub3Qgc3RvcHBpbmcgcmUtc3luY2luZyBhdCBlbWJlZGRlZCB6ZXJvZXM7IHNraXAgZ2FyYmFnZSBiZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBCYXNlZCBvbiBwYXRjaCBieTogU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW8gYXQgY2lyY3VsYXItY2hhb3Mub3JnPgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogKGdzdF93YXZwYWNrX3BhcnNlX3NpbmtfZXZlbnQpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2dldF91cHN0cmVhbV9sZW5ndGgpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2ZpbmRfbWFya2VyKSwgKGdzdF93YXZwYWNrX3BhcnNlX3Jlc3luY19sb29wKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9sb29wKSwgKGdzdF93YXZwYWNrX3BhcnNlX3Jlc3luY19hZGFwdGVyKToKKwkgIEZpeCByZXN5bmNpbmcgaW4gcHVzaCBtb2RlIG5vdCBzdG9wcGluZyByZS1zeW5jaW5nIGF0IGVtYmVkZGVkCisJICB6ZXJvZXM7IHNraXAgZ2FyYmFnZSBiZXR3ZWVuIGZyYW1lcyBpbiBwdWxsIG1vZGUgYXMgd2VsbCBpZgorCSAgbmVjZXNzYXJ5OyB1c2UgZ3N0X3BhZF9xdWVyeV9wZWVyX2R1cmF0aW9uKCk7IHB1c2ggRU9TIGFuZAorCSAgTkVXU0VHTUVOVCBldmVudCBpbiByaWdodCBkaXJlY3Rpb24gKCMzNTE2NTkpLgorCisyMDA2LTA4LTE4IDE3OjAwOjUzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06IE1vcmUgT3NzIGRvY3MgZml4YWdlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgIE1vcmUgT3NzIGRvY3MgZml4YWdlLgorCisyMDA2LTA4LTE4IDE2OjUyOjIxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogQWRkZWQgZXhwZXJpbWVudGFsIFNWUTMgZGVwYXlsb2FkZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzogKGdzdF9ydHBfc3Yzdl9kZXBheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfc3Yzdl9kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfc3Yzdl9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX3N2M3ZfZGVwYXlfZmluYWxpemUpLCAoZ3N0X3J0cF9zdjN2X2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfc3Yzdl9kZXBheV9wcm9jZXNzKSwgKGdzdF9ydHBfc3Yzdl9kZXBheV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfc3Yzdl9kZXBheV9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfc3Yzdl9kZXBheV9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9ydHBfc3Yzdl9kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5Lmg6CisJICBBZGRlZCBleHBlcmltZW50YWwgU1ZRMyBkZXBheWxvYWRlci4KKworMjAwNi0wOC0xOCAxMzoyNTowNiArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZXh0L2R2L2dzdGR2ZGVtdXguKjogV2hlbiBoYW5kbGluZyBzZWVrIHJlcXVlc3RzLCBkb24ndCBzZW5kIHRoZSBuZXdzZWdtZW50IGV2ZW50IGZyb20gdGhlIGNhbGxpbmcgdGhyZWFkLiBJbnN0ZWFkIHNhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2hhbmRsZV9wdWxsX3NlZWspLAorCSAgKGdzdF9kdmRlbXV4X2xvb3ApLCAoZ3N0X2R2ZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguaDoKKwkgIFdoZW4gaGFuZGxpbmcgc2VlayByZXF1ZXN0cywgZG9uJ3Qgc2VuZCB0aGUgbmV3c2VnbWVudCBldmVudCBmcm9tIHRoZQorCSAgY2FsbGluZyB0aHJlYWQuIEluc3RlYWQgc2F2ZSBpdCBzbyBpdCBjYW4gYmUgc2VudCBmcm9tIHRoZSBzdHJlYW1pbmcKKwkgIHRocmVhZC4KKworMjAwNi0wOC0xNyAxNTo1MTo1MCArMDAwMCAgU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PgorCisJICBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6IEFjY2VwdCBsZWFkaW5nIHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBib3VuZGFyeQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU2pvZXJkIFNpbW9ucyA8c2pvZXJkIGF0IGx1b24gZG90IG5ldD4KKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOiAobXVsdGlwYXJ0X3BhcnNlX2hlYWRlcik6CisJICBBY2NlcHQgbGVhZGluZyB3aGl0ZXNwYWNlIGJlZm9yZSB0aGUgYm91bmRhcnkKKwkgIFRoaXMgcGF0Y2ggbWFrZXMgdGhlIGRlbXV4ZXIgYWxsb3cgc29tZSB3aGl0ZXNwYWNlIGJlZm9yZSB0aGUgYWN0dWFsCisJICBib3VuZGFyeS4gVGhpcyBtYWtlcyB0aGUgZGVtdXhlciB3b3JrIHdpdGggdGhlIGBgb2xkJycgZ3N0cmVhbWVyCisJICBtdWx0aXBhcnRtdXhlciBhZ2FpbiAod2hpY2ggcGxhY2VkIGFuIGV4dHJhIFxuIGJlZm9yZSB0aGUgc3RhcnQKKwkgIG9mIHRoZSBzdHJlYW0pIEZpeGVzICMzNDkwNjguCisKKzIwMDYtMDgtMTcgMTU6NDc6MjggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6IEVycm9yIG91dCBvbiBub24taW1wbGVtZW50ZWQgc3R1ZmYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzogKGdzdF9ydHBfaDI2NF9kZXBheV9wcm9jZXNzKToKKwkgIEVycm9yIG91dCBvbiBub24taW1wbGVtZW50ZWQgc3R1ZmYuCisKKzIwMDYtMDgtMTYgMTY6NTA6MDAgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSAgZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYzogTWFrZSBsYWRzcGEgZWxlbWVudHMgcmV1c2FibGUuIEZpeGVzICMzNTAwMDYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBBbmR5IFdpbmdvIDx3aW5nbyBhdCBwb2JveCBkb3QgY29tPgorCSAgKiBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5jOiAoZ3N0X3NpZ25hbF9wcm9jZXNzb3Jfc2V0dXApLAorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX3N0YXJ0KSwgKGdzdF9zaWduYWxfcHJvY2Vzc29yX3N0b3ApLAorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX2NsZWFudXApLCAoZ3N0X3NpZ25hbF9wcm9jZXNzb3Jfc2V0Y2FwcyksCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfcGVuX2J1ZmZlciksIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9mbHVzaCksCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfZG9fcHVsbHMpLCAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfZG9fcHVzaGVzKSwKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9jaGFuZ2Vfc3RhdGUpOgorCSAgTWFrZSBsYWRzcGEgZWxlbWVudHMgcmV1c2FibGUuIEZpeGVzICMzNTAwMDYuCisKKzIwMDYtMDgtMTYgMTU6MzM6MTIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9sYWRzcGEvZ3N0bGFkc3BhLmM6IENvbnZlcnQgJyAnIGludG8gJ18nLiBUcnkgdG8ga2VlcCBhcyBtYW55IGNoYXJhY3RlcnMgaW4gdGhlIHBhZHRlbXBsYXRlIG5hbWVzIGFzIHBvc3NpYmxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9sYWRzcGEvZ3N0bGFkc3BhLmM6IChnc3RfbGFkc3BhX2Jhc2VfaW5pdCk6CisJICBDb252ZXJ0ICcgJyBpbnRvICdfJy4gVHJ5IHRvIGtlZXAgYXMgbWFueSBjaGFyYWN0ZXJzIGluIHRoZSBwYWR0ZW1wbGF0ZQorCSAgbmFtZXMgYXMgcG9zc2libGUuCisKKzIwMDYtMDgtMTYgMTQ6NDc6NTAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmM6IEEgcHVzaCgpIGdpdmVzIGF3YXkgb3VyIHJlZmNvdW50IHNvIHdlIHNob3VsZCBub3QgdXNlIHRoZSBidWZmZXIgb24gdGhlIHBlbiBhbnltb3JlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmM6IChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9mbHVzaCksCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfZG9fcHVzaGVzKToKKwkgIEEgcHVzaCgpIGdpdmVzIGF3YXkgb3VyIHJlZmNvdW50IHNvIHdlIHNob3VsZCBub3QgdXNlIHRoZSBidWZmZXIgb24gdGhlCisJICBwZW4gYW55bW9yZS4KKworMjAwNi0wOC0xNiAxMzo0ODowMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgc3lzL29zcy9nc3Rvc3NtaXhlcmVsZW1lbnQuYzogRG9uJ3QgbGVhayBkZXZpY2Ugc3RyaW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3MvZ3N0b3NzbWl4ZXJlbGVtZW50LmM6IChnc3Rfb3NzX21peGVyX2VsZW1lbnRfY2xhc3NfaW5pdCksCisJICAoZ3N0X29zc19taXhlcl9lbGVtZW50X2ZpbmFsaXplKToKKwkgIERvbid0IGxlYWsgZGV2aWNlIHN0cmluZy4KKworMjAwNi0wOC0xNiAxMzowMTozMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBSZXF1aXJlIENWUyBvZiBHU3RyZWFtZXIgY29yZSBhbmQgLWJhc2UgKGZvcgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIFJlcXVpcmUgQ1ZTIG9mIEdTdHJlYW1lciBjb3JlIGFuZCAtYmFzZSAoZm9yCisJICBHU1RfVEFHX0VYVEVOREVEX0NPTU1FTlQgYW5kIGdzdF90YWdfcGFyc2VfZXh0ZW5kZWRfY29tbWVudCgpKS4KKwkgICogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzoKKwkgIFdyaXRlIGV4dGVuZGVkIGNvbW1lbnQgdGFncyBwcm9wZXJseSAoIzM0ODc2MikuCisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiAoaWQzZGVtdXhfaWQzdjJfcGFyc2VfZnJhbWUpLAorCSAgKHBhcnNlX2NvbW1lbnRfZnJhbWUpOgorCSAgRXh0cmFjdCBDT01NIGZyYW1lcyBpbnRvIGV4dGVuZGVkIGNvbW1lbnRzLCB3aGljaCBtYWtlcyBpdAorCSAgZWFzaWVyIHRvIHByb3Blcmx5IHJldGFpbiB0aGUgZGVzY3JpcHRpb24gYml0IG9mIHRoZSB0YWcKKwkgIGFuZCBtYWludGFpbiB0aGlzIGluZm9ybWF0aW9uIHdoZW4gcmUtdGFnZ2luZyAoIzM0ODc2MikuCisKKzIwMDYtMDgtMTYgMTI6MDI6NDggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOiBEb24ndCB0cnkgdG8gcnVuIGFubm9kZXggdW5pdCB0ZXN0cyBpZiB0aGUgYW5ub2RleCBwbHVnaW4gaGFzIG5vdCBiZWVuIGJ1aWx0IChGaXhlcyAjMzUxMTE2KS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIERvbid0IHRyeSB0byBydW4gYW5ub2RleCB1bml0IHRlc3RzIGlmIHRoZSBhbm5vZGV4CisJICBwbHVnaW4gaGFzIG5vdCBiZWVuIGJ1aWx0IChGaXhlcyAjMzUxMTE2KS4KKworMjAwNi0wOC0xNiAxMDo1MzozMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOiBXaGVuIHdlIGNhbid0IGZpbmQgYSB1c2FibGUgYXVkaW9zaW5rLCBkb24ndCBlcnJvciBvdXQsIGJ1dCB1c2UgYSBmYWtlIHNpbmsgaW5zdGVhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSAgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfZmluZF9iZXN0KToKKwkgIFdoZW4gd2UgY2FuJ3QgZmluZCBhIHVzYWJsZSBhdWRpb3NpbmssIGRvbid0IGVycm9yIG91dCwKKwkgIGJ1dCB1c2UgYSBmYWtlIHNpbmsgaW5zdGVhZCBhbmQgcG9zdCBhIHdhcm5pbmcgbWVzc2FnZQorCSAgb24gdGhlIGJ1cyAoIzM0MTI3OCkuCisKKzIwMDYtMDgtMTYgMTA6NDA6MDQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svOiBJbiBwdXNoIG1vZGUsIHJlLXN5bmMgdG8gbmV4dCB3YXZwYWNrIGhlYWRlciBpZiBzeW5jIGlzIGxvc3QgKCMzNTE1NTcpLiBBbHNvIHVzZSBoeXBoZW5zIGluc3RlYWQgb2YgdW5kLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tbyBhdCBjaXJjdWxhci1jaGFvcy5vcmc+CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogKGdzdF93YXZwYWNrX2VuY19jbGFzc19pbml0KToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6CisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfcmVzeW5jX2FkYXB0ZXIpLCAoZ3N0X3dhdnBhY2tfcGFyc2VfY2hhaW4pOgorCSAgSW4gcHVzaCBtb2RlLCByZS1zeW5jIHRvIG5leHQgd2F2cGFjayBoZWFkZXIgaWYgc3luYyBpcyBsb3N0CisJICAoIzM1MTU1NykuIEFsc28gdXNlIGh5cGhlbnMgaW5zdGVhZCBvZiB1bmRlcnNjb3JlcyBpbgorCSAgR09iamVjdCBwcm9wZXJ0eSBuYW1lcy4KKworMjAwNi0wOC0xNiAxMDoyMjozMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgc3lzL29zcy86IERvY3VtZW50IE9TUyBlbGVtZW50czsgYWRkIGd0ay1kb2MgYmx1cmIgd2l0aCAnU2luY2UgMC4xMC41JyBmb3Igb3NzbWl4ZXIncyBuZXcgZGV2aWNlIHByb3BlcnR5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3MvZ3N0b3NzbWl4ZXJlbGVtZW50LmM6IChnc3Rfb3NzX21peGVyX2VsZW1lbnRfY2xhc3NfaW5pdCk6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NyYy5jOgorCSAgRG9jdW1lbnQgT1NTIGVsZW1lbnRzOyBhZGQgZ3RrLWRvYyBibHVyYiB3aXRoICdTaW5jZSAwLjEwLjUnIGZvcgorCSAgb3NzbWl4ZXIncyBuZXcgZGV2aWNlIHByb3BlcnR5LgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBBZGQgZG9jcyBmb3IgT1NTIGVsZW1lbnRzLgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNkaW8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkgIFVwZGF0ZSB0byBDVlMgdmVyc2lvbi4KKworMjAwNi0wOC0xNiAxMDowNTowMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IENhcHMgZXh0cmEgcHJvcGVydGllcyBtdXN0IGJlIGRlZmluZWQgYXMgc3RyaW5ncyBmb3IgZGVwYXlsb2FkZXJzIGJlY2F1c2UgdGhleSBhcmUgZ2VuZXJhdGVkIGZyb20gYW4gU0RQLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzoKKwkgIENhcHMgZXh0cmEgcHJvcGVydGllcyBtdXN0IGJlIGRlZmluZWQgYXMgc3RyaW5ncyBmb3IKKwkgIGRlcGF5bG9hZGVycyBiZWNhdXNlIHRoZXkgYXJlIGdlbmVyYXRlZCBmcm9tIGFuIFNEUC4KKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzogKGdzdF9ydHBfaDI2NF9kZXBheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfaDI2NF9kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfaDI2NF9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX2gyNjRfZGVwYXlfZmluYWxpemUpLCAoZGVjb2RlX2Jhc2U2NCksCisJICAoZ3N0X3J0cF9oMjY0X2RlcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9oMjY0X2RlcGF5X3Byb2Nlc3MpLAorCSAgKGdzdF9ydHBfaDI2NF9kZXBheV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfaDI2NF9kZXBheV9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfaDI2NF9kZXBheV9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9ydHBfaDI2NF9kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5Lmg6CisJICBBZGRlZCBiYXNpYywgbm90IGNvbXBsZXRlbHkgZnVuY3Rpb25hbCBSRkMgMzk4NCBIMjY0IGRlcGF5bG9hZGVyLgorCisyMDA2LTA4LTE2IDA5OjQ4OjI2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHBkZWMuYzogQWRkIHBhZHMgYWZ0ZXIgc2V0dGluZyB0aGVtIHVwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOiAoZ3N0X3J0cGRlY19pbml0KSwgKGdzdF9ydHBkZWNfZ2V0Y2Fwcyk6CisJICBBZGQgcGFkcyBhZnRlciBzZXR0aW5nIHRoZW0gdXAuCisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHNwc3JjX2luaXQpLCAoZ3N0X3J0c3BzcmNfZmluYWxpemUpLAorCSAgKGdzdF9ydHNwc3JjX2ZyZWVfc3RyZWFtKSwgKGdzdF9ydHNwc3JjX21lZGlhX3RvX2NhcHMpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9zZXR1cF9ydHApLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KSwKKwkgIChnc3RfcnRzcHNyY19jb21iaW5lX2Zsb3dzKSwgKGdzdF9ydHNwc3JjX2xvb3ApLAorCSAgKGdzdF9ydHNwc3JjX29wZW4pLCAoZ3N0X3J0c3BzcmNfY2xvc2UpLCAoZ3N0X3J0c3BzcmNfcGxheSksCisJICAoZ3N0X3J0c3BzcmNfcGF1c2UpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBGaXggaW50ZXJsZWF2ZWQgbW9kZS4KKwkgIC0gUHJvdGVjdCBzdHJlYW1pbmcgd2l0aCBsb2NrLgorCSAgLSBDb21iaW5lIGZsb3dzCisJICAtIHNldCBjYXBzIG9uIG91dGdvaW5nIGJ1ZmZlcnMuCisJICAtIHN0cmlwIHRyYWlsaW5nIFwwIGZyb20gZGF0YSBwYWNrZXRzLgorCSAgLSBDb25maWd1cmUgUlRQL1JUQ1AgaW4gc3RyZWFtLgorCSAgVXNlIERFQlVHX09CSkVDVCBtb3JlLgorCisyMDA2LTA4LTE2IDA5OjI5OjIwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiBUdXJuIGEgZ19wcmludCBpbnRvIGEgREVCVUcgbGluZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19hZGQpOgorCSAgVHVybiBhIGdfcHJpbnQgaW50byBhIERFQlVHIGxpbmUuCisKKzIwMDYtMDgtMTYgMDk6MjU6MTcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHN5cy9vc3MvOiBTbWFsbCBjbGVhbnVwcy4gQmV0dGVyIGVycm9yIHJlcG9ydGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3NzL2dzdG9zc21peGVyLmM6IChnc3Rfb3NzbWl4ZXJfb3BlbiksIChnc3Rfb3NzbWl4ZXJfbmV3KToKKwkgICogc3lzL29zcy9nc3Rvc3NtaXhlcmVsZW1lbnQuYzogKGdzdF9vc3NfbWl4ZXJfZWxlbWVudF9jbGFzc19pbml0KSwKKwkgIChnc3Rfb3NzX21peGVyX2VsZW1lbnRfaW5pdCksIChnc3Rfb3NzX21peGVyX2VsZW1lbnRfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfb3NzX21peGVyX2VsZW1lbnRfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfb3NzX21peGVyX2VsZW1lbnRfY2hhbmdlX3N0YXRlKToKKwkgICogc3lzL29zcy9nc3Rvc3NtaXhlcmVsZW1lbnQuaDoKKwkgIFNtYWxsIGNsZWFudXBzLiBCZXR0ZXIgZXJyb3IgcmVwb3J0aW5nLgorCSAgQWRkIGRldmljZSBwcm9wZXJ0eSBmb3IgdGhlIG1peGVyIGluc3RlYWQgb2YgdGhlIGhhcmRjb2RlZAorCSAgL2Rldi9taXhlci4gRml4ZXMgIzM1MDc4NS4KKwkgIEFQSTogR3N0T3NzTWl4ZXJFbGVtZW50OjpkZXZpY2UgcHJvcGVydHkKKworMjAwNi0wOC0xNSAyMjo0NDoyNyArMDAwMCAgSmVucyBHcmFuc2V1ZXIgPGplbnNnckBnbXgubmV0PgorCisJICBnY29uZi9NYWtlZmlsZS5hbTogTWFrZSAtLWRpc2FibGUtc2NoZW1hcyB3b3JrIHJpZ2h0ICh0aGV5IHN0aWxsIG5lZWQgdG8gYmUgY29waWVkIHRvIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LCBqdXMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEplbnMgR3JhbnNldWVyIDxqZW5zZ3IgYXQgZ214IG5ldD4KKwkgICogZ2NvbmYvTWFrZWZpbGUuYW06CisJICBNYWtlIC0tZGlzYWJsZS1zY2hlbWFzIHdvcmsgcmlnaHQgKHRoZXkgc3RpbGwgbmVlZAorCSAgdG8gYmUgY29waWVkIHRvIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LCBqdXN0IG5vdAorCSAgYXBwbGllZCkuIEZpeGVzICMzNTEzNDcgKGFsc28gIzM0NDEwMCkuCisKKzIwMDYtMDgtMTUgMjA6Mjk6NDUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLio6IE1ha2Ugd2F2cGFja3BhcnNlIGFsc28gd29yayBpbiBwdXNoLW1vZGUgKG5vdCBzZWVrYWJsZSB5ZXQgdGhvdWdoKTsgc29tZSBzbWFsbCBjbGVhbi11Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IChnc3Rfd2F2cGFja19wYXJzZV9jbGFzc19pbml0KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9yZXNldCksIChnc3Rfd2F2cGFja19wYXJzZV9nZXRfc3JjX3F1ZXJ5X3R5cGVzKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9zcmNfcXVlcnkpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2hhbmRsZV9zZWVrX2V2ZW50KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9zaW5rX2V2ZW50KSwgKGdzdF93YXZwYWNrX3BhcnNlX2luaXQpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2NyZWF0ZV9zcmNfcGFkKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9wdXNoX2J1ZmZlciksIChnc3Rfd2F2cGFja19wYXJzZV9sb29wKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9jaGFpbiksIChnc3Rfd2F2cGFja19wYXJzZV9zaW5rX2FjdGl2YXRlKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9zaW5rX2FjdGl2YXRlX3B1bGwpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuaDoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tbyBhdCBjaXJjdWxhci1jaGFvcy5vcmc+CisJICBNYWtlIHdhdnBhY2twYXJzZSBhbHNvIHdvcmsgaW4gcHVzaC1tb2RlIChub3Qgc2Vla2FibGUgeWV0IHRob3VnaCk7CisJICBzb21lIHNtYWxsIGNsZWFuLXVwcyBhbG9uZyB0aGUgd2F5OyBhZGQgc3VwcG9ydCBmb3IgU0VFS0lORyBxdWVyeQorCSAgYW5kIHF1ZXJ5IHR5cGVzIGZ1bmN0aW9uLiAoIzM1MTQ5NSkuCisKKzIwMDYtMDgtMTQgMTE6Mzc6MTAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBiYWNrIHRvIEhFQUQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYmFjayB0byBIRUFECisKKzIwMDYtMDgtMTQgMTE6MTQ6NDMgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JhbGFuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICByZWxlYXNpbmcgMC4xMC40CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbGVhc2luZyAwLjEwLjQKKworMjAwNi0wOC0xNCAxMDowNjo1NSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBFeHRyYWN0IGFsbCByZWZlcmVuY2VzL3JlZGlyZWN0aW9ucyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGFuZCBzb3J0IHRoZW07IGFsc28gZXh0cmFjdCBtaW5pLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9yZWRpcmVjdHNfc29ydF9mdW5jKSwKKwkgIChxdGRlbXV4X3Byb2Nlc3NfcmVkaXJlY3RzKSwgKHF0ZGVtdXhfcGFyc2VfdHJlZSk6CisJICBFeHRyYWN0IGFsbCByZWZlcmVuY2VzL3JlZGlyZWN0aW9ucyBpZiB0aGVyZSBpcyBtb3JlCisJICB0aGFuIG9uZSBhbmQgc29ydCB0aGVtOyBhbHNvIGV4dHJhY3QgbWluaW11bSByZXF1aXJlZAorCSAgYml0cmF0ZSBpbmZvcm1hdGlvbiBpZiBhdmFpbGFibGUuICgjMzUwMzk5KQorCisyMDA2LTA4LTEwIDE0OjEwOjI4ICswMDAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAZmx1ZW5kby5jb20+CisKKwkgIFNlbmQgdGhlIG5ld3NlZ21lbnQgZXZlbnQgaW4gdGhlIHN0cmVhbWluZyB0aHJlYWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBFZHdhcmQgSGVydmV5IDxlZHdhcmRAZmx1ZW5kby5jb20+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcGVyZm9ybV9zZWVrKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpOgorCSAgU2VuZCB0aGUgbmV3c2VnbWVudCBldmVudCBpbiB0aGUgc3RyZWFtaW5nIHRocmVhZC4KKwkgIEZpeGVzICMzNDc1MjkKKworMjAwNi0wOC0xMCAxNDowMjo0NSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIGJ1bXBlZCBmb3IgcHJlcmVsCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGJ1bXBlZCBmb3IgcHJlcmVsCisKKzIwMDYtMDgtMTAgMTM6MTA6MzggKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vY3MucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSAgdXBkYXRlIHRyYW5zbGF0aW9ucworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMDYtMDgtMDggMTQ6NTU6NTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRml4IHNpbGx5IHR5cG8uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmVlKToKKwkgIEZpeCBzaWxseSB0eXBvLgorCisyMDA2LTA4LTA4IDE0OjQ2OjAwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBDaGFuZ2VMb2c6CisJICBDaGFuZ2VMb2cgc3VyZ2VyeTogbWVudGlvbiBidWcgbnVtYmVyCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIENoYW5nZUxvZyBzdXJnZXJ5OiBtZW50aW9uIGJ1ZyBudW1iZXIKKworMjAwNi0wOC0wOCAxNDo0MDo0NyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2pwZWcvOiBSZWZ1c2Ugc2luayBjYXBzIGluIHRoZSBlbmNvZGVyIGlmIHdpZHRoIG9yIGhlaWdodCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiwgdGhlIGVuY29kZXIgZG9lcyBub3Qgc3VwcG9ydCB0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2pwZWcvZ3N0c21va2VkZWMuYzogKGdzdF9zbW9rZWRlY19jaGFpbik6CisJICAqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmM6IChnc3Rfc21va2VlbmNfc2V0Y2FwcyksCisJICAoZ3N0X3Ntb2tlZW5jX3Jlc3luYyksIChnc3Rfc21va2VlbmNfY2hhaW4pOgorCSAgUmVmdXNlIHNpbmsgY2FwcyBpbiB0aGUgZW5jb2RlciBpZiB3aWR0aCBvciBoZWlnaHQgaXMgbm90IGEKKwkgIG11bHRpcGxlIG9mIDE2LCB0aGUgZW5jb2RlciBkb2VzIG5vdCBzdXBwb3J0IHRoYXQgeWV0OyBhbG9uZyB0aGUKKwkgIHNhbWUgbGluZXMsIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGVuY29kZXIgc2V0dXAgZnVuY3Rpb247CisJICBhbHNvIHJlbW92ZSBzb21lIGRlYnVnIGxvZyBjbHV0dGVyLgorCisyMDA2LTA4LTA0IDExOjM4OjU0ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmg6IEFkZCBpbmZyYXN0cnVjdHVyZSBmb3Igc3RvcmluZyB3aGV0aGVyIGEgcHJvY2Vzc29yIGNhbiB3b3JrIGluIHBsYWNlIG9yIG5vdCwgYW5kIGZvci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA4LTA0ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5oOiBBZGQgaW5mcmFzdHJ1Y3R1cmUgZm9yIHN0b3JpbmcKKwkgIHdoZXRoZXIgYSBwcm9jZXNzb3IgY2FuIHdvcmsgaW4gcGxhY2Ugb3Igbm90LCBhbmQgZm9yIGtlZXBpbmcKKwkgIHRyYWNrIG9mIGl0cyBzdGF0ZS4gQ2hhbmdlIHRoZSBGbG93UmV0dXJuIGluc3RhbmNlIHZhcmlhYmxlIGZyb20KKwkgICJzdGF0ZSIgdG8gImZsb3dfc3RhdGUiLCBhbGwgY2FsbGVycyBjaGFuZ2VkLgorCSAgKiBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5jIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9zZXR1cCkKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9zdGFydCwgZ3N0X3NpZ25hbF9wcm9jZXNzb3Jfc3RvcCkKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9jbGVhbnVwKTogTmV3IGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlCisJICBwcm9jZXNzb3IncyBzdGF0ZS4KKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9zZXRjYXBzKTogc3RhcnQoKSBhcyB3ZWxsIGFzIHNldHVwKCkgaGVyZS4KKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9wcmVwYXJlKTogUmVzcGVjdCBDQU5fUFJPQ0VTU19JTl9QTEFDRS4KKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9jaGFuZ2Vfc3RhdGUpOiBTdG9wIGFuZCBjbGVhbnVwIHRoZQorCSAgcHJvY2Vzc29yIGFzIHdlIGdvIHRvIE5VTEwuCisJICAqIGV4dC9sYWRzcGEvZ3N0bGFkc3BhLmMgKGdzdF9sYWRzcGFfYmFzZV9pbml0KTogUmV1c2UgYnVmZmVycyBpZgorCSAgSU5QTEFDRV9CUk9LRU4gaXMgbm90IHNldC4KKwkgICogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYyAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfcHJlcGFyZSk6CisJICBEbyB0aGUgYWxsb2NfYnVmZmVyIGluIGJ5dGVzLCBub3QgZnJhbWVzLgorCisyMDA2LTA4LTA0IDEwOjIxOjI2ICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzogRml4IHJnYiBtYXNrcyB3aGVuIHJlY29yZGluZyBpbiA8IDI0YnBwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA4LTA0ICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisJICAqIHN5cy94aW1hZ2UveGltYWdldXRpbC5jOiAoeGltYWdldXRpbF94Y29udGV4dF9nZXQpOgorCSAgRml4IHJnYiBtYXNrcyB3aGVuIHJlY29yZGluZyBpbiA8IDI0YnBwLgorCisyMDA2LTA4LTA0IDA5OjIwOjI2ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmM6CisJICBCUEIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX3NyY19hY3RpdmF0ZV9wdWxsKTogQlBCCisKKzIwMDYtMDgtMDQgMDk6MDU6NTMgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYzoKKwkgIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmMgKGdzdF9zaWduYWxfcHJvY2Vzc29yX3NldGNhcHMpIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9wcmVwYXJlKSAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfdS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA4LTA0ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5jIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9zZXRjYXBzKQorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX3ByZXBhcmUpCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfdXBkYXRlX2lucHV0cykKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9wcm9jZXNzLCBnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9wZW5fYnVmZmVyKQorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX2ZsdXNoKQorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX3NpbmtfYWN0aXZhdGVfcHVzaCkKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9zcmNfYWN0aXZhdGVfcHVsbCkKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9jaGFuZ2Vfc3RhdGUpOiBSZW1vdmUgdGhlIGxhc3Qgb2YgdGhlIGNvZGUKKwkgIHRoYXQgYXNzdW1lcyB0aGF0IHdlIHByb2Nlc3Mgd2hvbGUgYnVmZmVycyBhdCBhIHRpbWUuIEZpeCBzb21lCisJICBkZWJ1Z2dpbmcuIFNlZW1zIHRvIHdvcmsgbm93IGluIHNvbWUgY2FzZXMuCisKKzIwMDYtMDctMzEgMjI6Mjc6MjIgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSAgZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYyAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfcHJvY2Vzcyk6IEZpeCBuZnJhbWVzLWNob29zaW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA4LTAxICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5jIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9wcm9jZXNzKToKKwkgIEZpeCBuZnJhbWVzLWNob29zaW5nLgorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX2luaXQpOiBJbml0IHBlbmRpbmdfaW4gYW5kIHBlbmRpbmdfb3V0LgorCisyMDA2LTA3LTMxIDIyOjAzOjA5ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmMgKGdzdF9zaWduYWxfcHJvY2Vzc29yX2luaXQpOiBObyBtb3JlIGRlZmF1bHQgc2FtcGxlIHJhdGUsIGFsdGhvdWdoIHdlIG5ldmVyIGNoZWNrIHRoYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA4LTAxICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5jIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9pbml0KTogTm8KKwkgIG1vcmUgZGVmYXVsdCBzYW1wbGUgcmF0ZSwgYWx0aG91Z2ggd2UgbmV2ZXIgY2hlY2sgdGhhdCB0aGUgc2FtcGxlCisJICByYXRlIGFjdHVhbGx5IGdldHMgc2V0LiBTb21ldGhpbmcgZm9yIHRoZSBmdXR1cmUuCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3Jfc2V0Y2Fwcyk6IFNvbWUgcmVmY291bnQgZml4ZXMsIGZsb3cgZml4ZXMuCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfZXZlbnQpOiBSZWZjb3VudCBmaXhlbi4KKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9wcm9jZXNzKTogUHVsbCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0bworCSAgcHJvY2VzcyBmcm9tIHRoZSBzaXplcyBvZiB0aGUgYnVmZmVycyBpbiB0aGUgaW5wdXQgcGVucy4KKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9wZW5fYnVmZmVyKTogUmVtb3ZlIGFuIGluY29ycmVjdCBGSVhNRSA6KQorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX2RvX3B1bGxzKTogQWRkIGFuIG5mcmFtZXMgYXJndW1lbnQsIGFuZCB1c2UKKwkgIGl0IGluc3RlYWQgb2YgYnVmZmVyX2ZyYW1lcy4KKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9nZXRyYW5nZSk6IFJlZmNvdW50IGZpeGVuLCBwYXNzIG5mcmFtZXMgb24KKwkgIHRvIGRvX3B1bGxzLgorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX2NoYWluKQorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX3NpbmtfYWN0aXZhdGVfcHVzaCkKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9zcmNfYWN0aXZhdGVfcHVsbCk6ICBSZWZjb3VudCBmaXhlbi4KKwkgICogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuaDogTm8gbW9yZSBidWZmZXJfZnJhbWVzLCB5YXkuCisKKzIwMDYtMDctMzEgMTk6NDQ6MTggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYzogZG9uJ3QgcXVlcnkgYnVmZmVyLWZyYW1lcyBmcm9tIGNhcHMsIGFkZCBsb3RzIG9mIGRlYnVnLWxvZywgdHJ5IGZpeCBmb3IgYXNzZXJ0ICgjMzQ5Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYzogKGdzdF9zaWduYWxfcHJvY2Vzc29yX3NldGNhcHMpLAorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX3Byb2Nlc3MpOgorCSAgZG9uJ3QgcXVlcnkgYnVmZmVyLWZyYW1lcyBmcm9tIGNhcHMsIGFkZCBsb3RzIG9mIGRlYnVnLWxvZywKKwkgIHRyeSBmaXggZm9yIGFzc2VydCAoIzM0OTE4OSkKKworMjAwNi0wNy0zMSAxNTo1ODo0MyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3VkcC9nc3R1ZHBzcmMuYzogRml4IGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIEZpeCBkb2NzLgorCisyMDA2LTA3LTI5IDE2OjMyOjI2ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmM6IEFkZCBkZWJ1Z3MgbG9ncyBoZXJlIGFuZCB0aGVyZSwgYWRkIG1vcmUgZXJyb3IgaGFuZGxpbmcsIGFkZCBzb21lCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYzoKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9hZGRfcGFkX2Zyb21fdGVtcGxhdGUpLAorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX2luaXQpLCAoZ3N0X3NpZ25hbF9wcm9jZXNzb3Jfc2V0Y2FwcyksCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfcHJvY2VzcyksIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9wZW5fYnVmZmVyKSwKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9kb19wdWxscyksIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9nZXRyYW5nZSksCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3Jfc2lua19hY3RpdmF0ZV9wdXNoKSwKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9zcmNfYWN0aXZhdGVfcHVsbCksCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfY2hhbmdlX3N0YXRlKToKKwkgIEFkZCBkZWJ1Z3MgbG9ncyBoZXJlIGFuZCB0aGVyZSwgYWRkIG1vcmUgZXJyb3IgaGFuZGxpbmcsIGFkZCBzb21lCisJICBGSVhNRSBjb21tZW50cywgZmlsZWQgIzM0OTE4OQorCisyMDA2LTA3LTI5IDExOjIyOjQ3ICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBleHQvanBlZy9nc3RzbW9rZWVuYy5jOiBTZXQgY2FwcyBvbiBidWZmZXIgY29ycmVjdGx5LiAgRml4ZXMgYnVnICMzNDkxNTUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDctMjkgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKwkgICogZXh0L2pwZWcvZ3N0c21va2VlbmMuYzogKGdzdF9zbW9rZWVuY19nZXRjYXBzKSwKKwkgIChnc3Rfc21va2VlbmNfc2V0Y2FwcyksIChnc3Rfc21va2VlbmNfY2hhaW4pOgorCSAgU2V0IGNhcHMgb24gYnVmZmVyIGNvcnJlY3RseS4gIEZpeGVzIGJ1ZyAjMzQ5MTU1LgorCisyMDA2LTA3LTI4IDE2OjE3OjE3ICswMDAwICBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisKKwkgIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzogVXNlcyBHc3RBZGFwdGVyIGluc3RlYWQgb2Ygb3duIGJ1ZmZlcmluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFNqb2VyZCBTaW1vbnMgPHNqb2VyZCBhdCBsdW9uIGRvdCBuZXQ+CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzogKGdzdF9tdWx0aXBhcnRfZGVtdXhfYmFzZV9pbml0KSwKKwkgIChnc3RfbXVsdGlwYXJ0X2RlbXV4X2NsYXNzX2luaXQpLCAoZ3N0X211bHRpcGFydF9kZW11eF9pbml0KSwKKwkgIChnc3RfbXVsdGlwYXJ0X2RlbXV4X2ZpbmFsaXplKSwgKGdldF9saW5lX2VuZCksCisJICAobXVsdGlwYXJ0X3BhcnNlX2hlYWRlciksIChtdWx0aXBhcnRfZmluZF9ib3VuZGFyeSksCisJICAoZ3N0X211bHRpcGFydF9kZW11eF9jaGFpbiksIChnc3RfbXVsdGlwYXJ0X2RlbXV4X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X211bHRpcGFydF9zZXRfcHJvcGVydHkpLCAoZ3N0X211bHRpcGFydF9nZXRfcHJvcGVydHkpOgorCSAgVXNlcyBHc3RBZGFwdGVyIGluc3RlYWQgb2Ygb3duIGJ1ZmZlcmluZy4KKwkgIEFjdHVhbGx5IHBhcnNlcyB0aGUgbWltZS10eXBlIGNvcnJlY3RseSAoSW4gdGVzdHMgdGhlIG1pbWUtdHlwZSB3YXMKKwkgIGFsd2F5cyAiIiB3aXRoIHRoZSBvbGQgdmVyc2lvbikuCisJICBVc2VzIHRoZSBDb250ZW50LWxlbmd0aCBoZWFkZXIgaWYgYXZhaWxhYmxlIHRvIHNwZWVkIHVwIHRoaW5ncy4KKwkgIFJlbGlhYmx5IGF1dG9zY2FucyB0aGUgYm91bmRhcnkgbmFtZSBieSBkZWZhdWx0LgorCSAgRml4ZXMgIzM0OTA2OC4KKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogKGdzdF9tdWx0aXBhcnRfbXV4X2NvbGxlY3RlZCk6CisJICBEb24ndCBzdGFydCB0aGUgc3RyZWFtIHdpdGggYSBcbi4KKworMjAwNi0wNy0yOCAwODozMjo0NyArMDAwMCAgQnJpYW4gQ2FtZXJvbiA8YnJpYW4uY2FtZXJvbkBzdW4uY29tPgorCisJICBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuYzogT3BlbiBzb3VyY2Ugd2l0aCBPX05PTkJMT0NLICgjMzQ5MDE1KS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEJyaWFuIENhbWVyb24gPGJyaWFuIGRvdCBjYW1lcm9uIGF0IHN1biBjb20+CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5jOiAoZ3N0X3N1bmF1ZGlvc3JjX29wZW4pOgorCSAgT3BlbiBzb3VyY2Ugd2l0aCBPX05PTkJMT0NLICgjMzQ5MDE1KS4KKworMjAwNi0wNy0yOCAwODoyMToyNyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4Lio6IFdoaXRlc3BhY2UgZml4ZXMgYW5kIG1vcmUgZGVidWcKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9tYXNzYWdlX2luZGV4KToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgV2hpdGVzcGFjZSBmaXhlcyBhbmQgbW9yZSBkZWJ1ZworCisyMDA2LTA3LTI3IDExOjIxOjUzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6IEdldCByaWQgb2Ygb2xkIGFuZCB1bnVzZWQgbWFnaWMgc291bmQtc2VydmVyIHByb3BlcnRpZXMgc3R1ZmYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSAgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfY3JlYXRlX2VsZW1lbnRfd2l0aF9wcmV0dHlfbmFtZSksCisJICAoZ3N0X2F1dG9fYXVkaW9fc2lua19maW5kX2Jlc3QpLAorCSAgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfY2hhbmdlX3N0YXRlKToKKwkgIEdldCByaWQgb2Ygb2xkIGFuZCB1bnVzZWQgbWFnaWMgc291bmQtc2VydmVyIHByb3BlcnRpZXMgc3R1ZmYuCisJICBBZGQgc3VmZml4IHRvIGNoaWxkIHNpbmsncyBuYW1lIHRoYXQgbWFrZXMgaXQgZWFzeSB0byBzZWUgZnJvbQorCSAgdGhlIG5hbWUgYWxvbmUgd2hpY2ggdHlwZSBpdCBhY3R1YWxseSBpcyAoYWxzYSwgb3NzLCBlc2QsIGV0Yy4pLgorCisyMDA2LTA3LTI3IDEwOjA1OjI3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdHVkcHNyYy4qOiBSZW5hbWUgImJ1ZmZlciIgdG8gImJ1ZmZlci1zaXplIiB0byBtYWtlIGNsZWFyIGl0IGlzIGEgc2l6ZSB3ZSBzZXQgYW5kIG5vdCBzb21lIHNvcnQgb2YgZmVhdHVyZSAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19jbGFzc19pbml0KSwgKGdzdF91ZHBzcmNfaW5pdCksCisJICAoZ3N0X3VkcHNyY19zZXRfcHJvcGVydHkpLCAoZ3N0X3VkcHNyY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF91ZHBzcmNfc3RhcnQpOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCSAgUmVuYW1lICJidWZmZXIiIHRvICJidWZmZXItc2l6ZSIgdG8gbWFrZSBjbGVhciBpdCBpcyBhIHNpemUgd2Ugc2V0IGFuZAorCSAgbm90IHNvbWUgc29ydCBvZiBmZWF0dXJlIHdlIGVuYWJsZS4KKworMjAwNi0wNy0yNyAxMDowMTo0OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3VkcC9nc3R1ZHBzcmMuYzogVXNlIENMT1NFX1NPQ0tFVCgpIGhlcmUgaW5zdGVhZCBvZiBjbG9zZSgpIHRvIG1haW50YWluIHdpbjMyIHdvcmtpbmVzcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19zdGFydCk6CisJICBVc2UgQ0xPU0VfU09DS0VUKCkgaGVyZSBpbnN0ZWFkIG9mIGNsb3NlKCkgdG8gbWFpbnRhaW4KKwkgIHdpbjMyIHdvcmtpbmVzcy4KKworMjAwNi0wNy0yNyAwOTowNDo1MSArMDAwMCAgVGhpanMgVmVybWVpciA8dGhpanMudmVybWVpckBiYXJjby5jb20+CisKKwkgIGdzdC91ZHAvZ3N0dWRwc3JjLio6IEFkZGVkICJidWZmZXIiIHByb3BlcnR5IHRvIGNvbnRyb2wgdGhlIGtlcm5lbCByZWNlaXZlIGJ1ZmZlciBzaXplLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVGhpanMgVmVybWVpciA8dGhpanMgZG90IHZlcm1laXIgYXQgYmFyY28gZG90IGNvbT4KKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfY2xhc3NfaW5pdCksIChnc3RfdWRwc3JjX2luaXQpLAorCSAgKGdzdF91ZHBzcmNfY3JlYXRlKSwgKGdzdF91ZHBzcmNfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfdWRwc3JjX2dldF9wcm9wZXJ0eSksIChnc3RfdWRwc3JjX3N0YXJ0KToKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwkgIEFkZGVkICJidWZmZXIiIHByb3BlcnR5IHRvIGNvbnRyb2wgdGhlIGtlcm5lbCByZWNlaXZlIGJ1ZmZlciBzaXplLgorCSAgVXBkYXRlIGRvY3VtZW50YXRpb24uCisJICBTbWFsbCBjbGVhbnVwcy4gRml4ZXMgIzM0ODc1Mi4KKwkgIEFQSTogYnVmZmVyIHByb3BlcnR5CisKKzIwMDYtMDctMjYgMTY6MzY6NTkgKzAwMDAgIEthaSBWZWhtYW5lbiA8a3YyMDA0QGVjYS5jeD4KKworCSAgZ3N0L3J0cC86IEZpeCB0aW1lc3RhbXAgY2FsY3VsYXRpb24gb24gb3V0Z29pbmcgUlRQIHBhY2tldHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBLYWkgVmVobWFuZW4gPGt2MjAwNCBhdCBlY2EgZG90IGN4PgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYzogKGdzdF9ydHBfcGNtYV9wYXlfZmx1c2gpLAorCSAgKGdzdF9ydHBfcGNtYV9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOiAoZ3N0X3J0cF9wY211X3BheV9mbHVzaCksCisJICAoZ3N0X3J0cF9wY211X3BheV9oYW5kbGVfYnVmZmVyKToKKwkgIEZpeCB0aW1lc3RhbXAgY2FsY3VsYXRpb24gb24gb3V0Z29pbmcgUlRQIHBhY2tldHMuCisJICBGaXhlcyAjMzQ4Njc1LgorCisyMDA2LTA3LTI2IDEwOjA3OjI5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOiBpcyBzdGlsbCBzdWItb3B0aW1hbCB0aG91Z2gsIHNpbmNlIHdlIGRvbid0IHJldGFpbiBvciBleHRyYWN0IHRoZSBjb21tZW50IGRlc2NyaXB0aW9ucyBwcm8uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSAgRml4IHdyaXRpbmcgb2YgY29tbWVudCBmcmFtZXMgKHNob3VsZCBiZSBDT01NIG5vdCBUQ09NKSwKKwkgIGlzIHN0aWxsIHN1Yi1vcHRpbWFsIHRob3VnaCwgc2luY2Ugd2UgZG9uJ3QgcmV0YWluIG9yCisJICBleHRyYWN0IHRoZSBjb21tZW50IGRlc2NyaXB0aW9ucyBwcm9wZXJseSAoIzMzNDM3NSwKKwkgIGFsc28gc2VlICMzMzQzNzUpLgorCisyMDA2LTA3LTI2IDA5OjAyOjU2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogI2RlZmluZSAnZmFjdCcgUklGRiBjaHVuayBpZiB3ZSBhcmUgbm90IGNvbXBpbGluZyBhZ2FpbnN0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICAjZGVmaW5lICdmYWN0JyBSSUZGIGNodW5rIGlmIHdlIGFyZSBub3QgY29tcGlsaW5nIGFnYWluc3QKKwkgIC1iYXNlIENWUyAod2UgZG9uJ3Qgd2FudCB0byBkZXBlbmQgb24gLWJhc2UgQ1ZTIGZvciB0aGlzCisJICBvbmUgZGVmaW5lIG9ubHksIGFuZCBhbHNvIG5vdCBmb3IgcmVsZWFzZSBvcmRlciByZWFzb25zKS4KKworMjAwNi0wNy0yNiAwODoxNzo0NSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzogSGFuZGxlIG11bHRpcGxlIHRhZ3Mgb2YgdGhlIHNhbWUgdHlwZSBwcm9wZXJseS4gUmUtaW5qZWN0IHVucGFyc2VkIElEM3YyIGZyYW1lcyB0aGF0IHdlIGdlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzoKKwkgIEhhbmRsZSBtdWx0aXBsZSB0YWdzIG9mIHRoZSBzYW1lIHR5cGUgcHJvcGVybHkuIFJlLWluamVjdAorCSAgdW5wYXJzZWQgSUQzdjIgZnJhbWVzIHRoYXQgd2UgZ2V0IGFzIGJpbmFyeSBibG9icyBmcm9tCisJICBpZDNkZW11eCBpbnRvIHRoZSB0YWcgYWdhaW4gc28gd2UgZG9uJ3QgbG9zZSBpbmZvcm1hdGlvbgorCSAgd2hlbiByZXRhZ2dpbmcgKCMzMzQzNzUpLgorCisyMDA2LTA3LTI1IDE3OjU0OjI1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiBEb2N1bWVudCBuZXdseS1hZGRlZCBwcm9wZXJ0aWVzIHByb3Blcmx5LCBzbyB0aGF0IHRoZXJlIGlzIGEgJ1NpbmNlOiAwLjEwLjQnIGluIHRoZSBwbHVnaW4uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiAoZ3N0X3hpbWFnZV9zcmNfY2xhc3NfaW5pdCk6CisJICBEb2N1bWVudCBuZXdseS1hZGRlZCBwcm9wZXJ0aWVzIHByb3Blcmx5LCBzbyB0aGF0IHRoZXJlIGlzIGEKKwkgICdTaW5jZTogMC4xMC40JyBpbiB0aGUgcGx1Z2luIGRvY3MuIENvbnZlcnQgc29tZSBwcm9wZXJ0eQorCSAgbmFtZXMgaW50byBjYW5vbmljYWwgR09iamVjdCBzdHlsZSAoR09iamVjdCB3aWxsIGRvIHRoYXQKKwkgIGludGVybmFsbHkgYW55d2F5KS4KKworMjAwNi0wNy0yNSAxNjo0NzowNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzogRXh0cmFjdCBmcmFtZXMgZm9yIElEM3YyIHZlcnNpb25zIHByaW9yIHRvIElEM3YyLjMuMCBwcm9wZXJseSBhcyB3ZWxsLCBhbmQgYWRkIHRoZSB2ZXJzaW9uIHRvLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzoKKwkgIChpZDNkZW11eF9hZGRfaWQzdjJfZnJhbWVfYmxvYl90b190YWdsaXN0KToKKwkgIEV4dHJhY3QgZnJhbWVzIGZvciBJRDN2MiB2ZXJzaW9ucyBwcmlvciB0byBJRDN2Mi4zLjAgcHJvcGVybHkgYXMKKwkgIHdlbGwsIGFuZCBhZGQgdGhlIHZlcnNpb24gdG8gdGhlIGJsb2IncyBidWZmZXIgY2Fwcywgc2luY2UgdGhhdAorCSAgaW5mb3JtYXRpb24gd2lsbCBiZSBuZWVkZWQgZm9yIGRlc2VyaWFsaXNhdGlvbiBsYXRlciBvbiAoIzM0ODY0NCkuCisKKzIwMDYtMDctMjUgMTM6MTQ6MDUgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBNb3ZlZCB3aW4zMiB2YXJpYW50IG9mIEdTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gdG8gZ3N0aW5mby5oLiBGaXhlZCBpbmRlbnRhdGlvbiBhbmQgc3BhY2luZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3JlYWRfc3ViaW5kZXhlcyksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0pOgorCSAgTW92ZWQgd2luMzIgdmFyaWFudCBvZiBHU1RfREVCVUdfQ0FURUdPUllfRVhURVJOIHRvIGdzdGluZm8uaC4gRml4ZWQKKwkgIGluZGVudGF0aW9uIGFuZCBzcGFjaW5nLgorCisyMDA2LTA3LTI0IDIxOjQzOjA2ICswMDAwICBTw6liYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisKKwkgIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuKjogQWRkIGFuIGF0dGVudWF0aW9uIHByb3BlcnR5IHRoYXQgd2lsbCBkaXJlY3RseSBhdHRlbnVhdGUgdGhlIGRpcmVjdHNvdW5kIGJ1ZmZlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmg6CisJICAqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIEFkZCBhbiBhdHRlbnVhdGlvbiBwcm9wZXJ0eSB0aGF0IHdpbGwgZGlyZWN0bHkgYXR0ZW51YXRlIHRoZQorCSAgZGlyZWN0c291bmQgYnVmZmVyLgorCSAgQ2hhbmdlIHRoZSBzaXplIG9mIHRoZSBkaXJlY3Rzb3VuZCBzZWNvbmRhcnkgYnVmZmVyIHRvIGEgaGFsZiBzZWNvbmQuCisJICBBZGQgbW9yZSBkZWJ1ZyBsb2dzLgorCSAgQWRkIGEgbG9jayB0byBwcm90ZWN0IGRzb3VuZCBidWZmZXIgd3JpdGUgYWNjZXNzLgorCSAgRml4IGEgYmFkIGltcGxlbWVudGF0aW9uIG9mIHJlc2V0LgorCSAgKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkgICogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdGRyYXdzaW5rLmg6CisJICBBZGQgYSBrZWVwX2FzcGVjdF9yYXRpbyBwcm9wZXJ0eS4KKwkgIERvIG5vdCB1c2Ugb3ZlcmxheSBpZiBub3Qgc3VwcG9ydGVkLgorCSAgQWRkIG1vcmUgZGVidWcgbG9ncy4KKwkgIFJlbW92ZSBvdmVyd3JpdGUgb2YgV01fRVJBU0VCS0dORCBtZXNzYWdlIGhhbmRsaW5nLiBJdCB3YXMgbm90CisJICByZWRyYXdpbmcgYm9yZGVyIHdoZW4ga2VlcF9hc3BlY3RfcmF0aW8gd2FzIGVuYWJsZWQuCisJICAqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIHVwZGF0ZSB2ZXJzaW9uIHdhaXRpbmcgYW4gYXV0by1nZW5lcmF0ZWQgY29uZmlnLmgKKworMjAwNi0wNy0yNCAxNToyNTo0OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogVXBkYXRlIGZpbGVzIHRvIENWUy9QcmVyZWxlYXNlIHZlcnNpb24sIGFkZCBlc2RzaW5rIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNkaW8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSAgVXBkYXRlIGZpbGVzIHRvIENWUy9QcmVyZWxlYXNlIHZlcnNpb24sIGFkZCBlc2RzaW5rIGRvY3MuCisJICAqIGV4dC9lc2QvZXNkc2luay5jOgorCSAgQWRkIGd0ay1kb2MgYmx1cmIuCisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSAgRml4IHR5cG8gaW4gZWxlbWVudCBkZXNjcmlwdGlvbi4KKworMjAwNi0wNy0yNCAxNDo1NDowNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogQ2hhbmdlTG9nOgorCSAgQ2hhbmdlTG9nIHN1cmdlcnk6IGZpeCBTdGVmYW4ncyBlLW1haWwgYWRkcmVzcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBDaGFuZ2VMb2cgc3VyZ2VyeTogZml4IFN0ZWZhbidzIGUtbWFpbCBhZGRyZXNzCisKKzIwMDYtMDctMjQgMTQ6NDk6MTkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9lc2QvZXNkc2luay5jOiBQcmV2ZW50IGxpYmVzZCBmcm9tIGF1dG8tc3Bhd25pbmcgYSBzb3VuZCBkYWVtb24gaWYgaXQgaXMgbm90IGFscmVhZHkgcnVubmluZy4gTm93IHRoYXQgd2UgZG9uJ3QgZC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfb3BlbiksCisJICAoZ3N0X2VzZHNpbmtfZmFjdG9yeV9pbml0KToKKwkgIFByZXZlbnQgbGliZXNkIGZyb20gYXV0by1zcGF3bmluZyBhIHNvdW5kIGRhZW1vbiBpZiBpdAorCSAgaXMgbm90IGFscmVhZHkgcnVubmluZy4gTm93IHRoYXQgd2UgZG9uJ3QgZG8gZXZpbCBzdHVmZgorCSAgbGlrZSB0aGF0IGFueSBsb25nZXIgd2UgY2FuIGdpdmUgZXNkc2luayBhIHJhbmsgc28gdGhhdAorCSAgYXV0b2F1ZGlvc2luayB3aWxsIHRyeSBpdCBhcyB3ZWxsIGlmIGFsbCBvdGhlciBhdWRpbworCSAgc2lua3MgZmFpbCAoIzM0MzA1MSkuCisKKzIwMDYtMDctMjQgMTQ6NDI6MTEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9lc2QvTWFrZWZpbGUuYW06IE9vcHMsIG5lZWQgdG8gcmVtb3ZlIFJFQURNRSBmcm9tIEVYVFJBX0RJU1QgYXMgd2VsbC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZXNkL01ha2VmaWxlLmFtOgorCSAgT29wcywgbmVlZCB0byByZW1vdmUgUkVBRE1FIGZyb20gRVhUUkFfRElTVCBhcyB3ZWxsLgorCisyMDA2LTA3LTI0IDE0OjM3OjM2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZXNkL1JFQURNRTogUmVtb3ZlLCBpdCBjb250YWlucyBub3RoaW5nIHVzZWZ1bCBhbnl3YXkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2VzZC9SRUFETUU6CisJICBSZW1vdmUsIGl0IGNvbnRhaW5zIG5vdGhpbmcgdXNlZnVsIGFueXdheS4KKwkgICogZXh0L2VzZC9lc2RzaW5rLmM6IChnc3RfZXNkc2lua19pbml0KSwgKGdzdF9lc2RzaW5rX3ByZXBhcmUpLAorCSAgKGdzdF9lc2RzaW5rX2RlbGF5KToKKwkgIFNvbWUgc21hbGwgY2xlYW4tdXBzOyB1c2UgR1NUX0JPSUxFUlBMQVRFIGV0Yy4KKworMjAwNi0wNy0yNCAxNDoxNjowNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2xhdy86IEZpeCBuZWdvdGlhdGlvbiB0byBkZWFsIHdpdGggQU5ZL0VNUFRZIGNhcHMgaW5zdGVhZCBvZiBsZWFraW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzogKGFsYXdkZWNfZ2V0Y2Fwcyk6CisJICAqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzogKGFsYXdlbmNfZ2V0Y2FwcyksIChnc3RfYWxhd2VuY19jaGFpbik6CisJICAqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6IChtdWxhd2RlY19nZXRjYXBzKToKKwkgICogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzogKG11bGF3ZW5jX2dldGNhcHMpOgorCSAgRml4IG5lZ290aWF0aW9uIHRvIGRlYWwgd2l0aCBBTlkvRU1QVFkgY2FwcyBpbnN0ZWFkIG9mIGxlYWtpbmcuCisKKzIwMDYtMDctMjQgMTM6NDA6NTYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLio6IFVzZSBpbmZvcm1hdGlvbiBmcm9tICdmYWN0JyBjaHVuayBmb3IgbGVuZ3RoIGNhbGN1bGF0aW9uIG9mIGNvbXByZXNzZWQgc2FtcGxlcy4gQ2FsY3VsYXRlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcmVzZXQpLAorCSAgKGdzdF93YXZwYXJzZV9vdGhlciksIChnc3Rfd2F2cGFyc2VfcGVyZm9ybV9zZWVrKSwKKwkgIChnc3Rfd2F2cGFyc2VfZ2V0X3Vwc3RyZWFtX3NpemUpLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKSwKKwkgIChnc3Rfd2F2cGFyc2VfYWRkX3NyY19wYWQpLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhKSwKKwkgIChnc3Rfd2F2cGFyc2VfcGFkX3F1ZXJ5KToKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICBVc2UgaW5mb3JtYXRpb24gZnJvbSAnZmFjdCcgY2h1bmsgZm9yIGxlbmd0aCBjYWxjdWxhdGlvbiBvZiBjb21wcmVzc2VkCisJICBzYW1wbGVzLiBDYWxjdWxhdGUgYnBzIGlmIGJvZ3VzIHZhbHVlIGlzIGZvdW5kIGluIHdhdiBoZWFkZXIgKGVtYmVkZWQKKwkgIG1wMi9tcDMpLgorCisyMDA2LTA3LTI0IDExOjQ4OjAzICswMDAwICBKb25pIFZhbHRhbmVuIDxqb25pLnZhbHRhbmVuQG1vdmlhbC5maT4KKworCSAgUG9ydCB1ZHAgcGx1Z2luIHRvIHdpbjMyICgjMzQ1Mjg4KS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IEpvbmkgVmFsdGFuZW4gIDxqb25pIGRvdCB2YWx0YW5lbiBhdCBtb3ZpYWwgZmk+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L3VkcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6IChnc3RfZHludWRwc2lua19pbml0KSwKKwkgIChnc3RfZHludWRwc2lua19maW5hbGl6ZSksIChnc3RfZHludWRwc2lua19jbG9zZSk6CisJICAqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5oOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19pbml0KSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX2ZpbmFsaXplKSwgKGdzdF9tdWx0aXVkcHNpbmtfY2xvc2UpOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSAgKiBnc3QvdWRwL2dzdHVkcC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNpbmsuaDoKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfaW5pdCksIChnc3RfdWRwc3JjX2NyZWF0ZSksCisJICAoZ3N0X3VkcHNyY19zdGFydCksIChnc3RfdWRwc3JjX3N0b3ApOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCSAgKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmM6IChnc3RfdWRwX25ldF91dGlsc193aW4zMl9pbmV0X2F0b24pLAorCSAgKGdzdF91ZHBfbmV0X3V0aWxzX3dpbjMyX3dzYV9zdGFydHVwKToKKwkgICogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5oOgorCSAgUG9ydCB1ZHAgcGx1Z2luIHRvIHdpbjMyICgjMzQ1Mjg4KS4KKworMjAwNi0wNy0yNCAxMTowMDozNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogUmVtb3ZlIHVud2FudGVkIERFQlVHIGxpbmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKHJ0c3BfY29ubmVjdGlvbl9zZW5kKToKKwkgIFJlbW92ZSB1bndhbnRlZCBERUJVRyBsaW5lLgorCisyMDA2LTA3LTIzIDExOjMzOjU0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvaWQzZGVtdXgvOiBPbiBzZWNvbmQgdGhvdWdodCwgaXQgbWlnaHQgYmUgd2lzZXIgYW5kIG1vcmUgZWZmaWNpZW50IG5vdCB0byBkbyB0YWcgcmVnaXN0cmF0aW9uIGZyb20gYSBzdHJlYW1pbmcgdGguLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzoKKwkgIChpZDNkZW11eF9hZGRfaWQzdjJfZnJhbWVfYmxvYl90b190YWdsaXN0KToKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuaDoKKwkgIE9uIHNlY29uZCB0aG91Z2h0LCBpdCBtaWdodCBiZSB3aXNlciBhbmQgbW9yZSBlZmZpY2llbnQKKwkgIG5vdCB0byBkbyB0YWcgcmVnaXN0cmF0aW9uIGZyb20gYSBzdHJlYW1pbmcgdGhyZWFkLgorCisyMDA2LTA3LTIzIDEwOjU2OjI3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvaWQzZGVtdXgvaWQzdGFncy5jOiBQdXQgSUQzdjIgZnJhbWVzIHdlIGNhbid0IHBhcnNlIGFzIGJpbmFyeSBibG9icyBpbnRvIHByaXZhdGUgdGFncywgc28gdGhhdCB0aGV5IGFyZSBub3QgbG9zdCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdGFncy5jOgorCSAgKGlkM2RlbXV4X2FkZF9pZDN2Ml9mcmFtZV9ibG9iX3RvX3RhZ2xpc3QpLAorCSAgKGlkM2RlbXV4X2lkM3YyX2ZyYW1lc190b190YWdfbGlzdCk6CisJICBQdXQgSUQzdjIgZnJhbWVzIHdlIGNhbid0IHBhcnNlIGFzIGJpbmFyeSBibG9icyBpbnRvIHByaXZhdGUKKwkgIHRhZ3MsIHNvIHRoYXQgdGhleSBhcmUgbm90IGxvc3Qgd2hlbiByZXRhZ2dpbmcsIGF0IGxlYXN0IG9uY2UKKwkgIGlkM3YybXV4IGhhcyBiZWVuIHRhdWdodCB0byByZS1pbmplY3QgdGhvc2UgZnJhbWVzIGFnYWluLgorCSAgU2VlIGJ1ZyAjMzM0Mzc1LgorCisyMDA2LTA3LTIxIDEwOjU3OjAwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IEZpeCBzb21lIGxlYWtzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKSwKKwkgIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSk6CisJICBGaXggc29tZSBsZWFrcy4KKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzogKGlkM2RlbXV4X2lkM3YyX2ZyYW1lc190b190YWdfbGlzdCk6CisJICBEb24ndCB1c2UgXG4gaW4gZGVidWcgbGluZXMuCisKKzIwMDYtMDctMjAgMTg6NDg6MzIgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogQWRkIGFubm9kZXggYW5kIGljeWRlbXV4LCBjbGVhbnVwIHRoZSBzZWN0aW9ucyBhIGJpdAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgIEFkZCBhbm5vZGV4IGFuZCBpY3lkZW11eCwgY2xlYW51cCB0aGUgc2VjdGlvbnMgYSBiaXQKKworMjAwNi0wNy0xOSAxNDozNjowMCArMDAwMCAgTWFydGluIFN6dWxlY2tpIDxjb21waXpAc3VraW1hc2hpdGEuY29tPgorCisJICBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6IElmICJkZXZpY2UtbmFtZSIgaXMgcmVxdWVzdGVkIGFuZCB0aGUgZGV2aWNlIGlzIG5vdCBvcGVuLCB0cnkgdG8gdGVtcG9yYXJpbHkgb3BlbiBpdCB0byBvYnQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE1hcnRpbiBTenVsZWNraQorCSAgKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6IChnc3RfdjRsMl9vYmplY3RfZ2V0X3Byb3BlcnR5X2hlbHBlcik6CisJICBJZiAiZGV2aWNlLW5hbWUiIGlzIHJlcXVlc3RlZCBhbmQgdGhlIGRldmljZSBpcyBub3QKKwkgIG9wZW4sIHRyeSB0byB0ZW1wb3JhcmlseSBvcGVuIGl0IHRvIG9idGFpbiB0aGlzCisJICBpbmZvcm1hdGlvbiAoIzM0MjQ5NCkuCisKKzIwMDYtMDctMTkgMTE6NTI6NTMgKzAwMDAgIEFsZXggTGFuY2FzdGVyIDxhbGV4bEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6IFdyaXRlIEdTVF9UQUdfRU5DT0RFUiBhbmQgR1NUX1RBR19FTkNPREVSX1ZFUlNJT04gYXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEFsZXggTGFuY2FzdGVyIDxhbGV4bCBhdCB1c2VycyBzb3VyY2Vmb3JnZSBuZXQ+CisJICAqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJICBXcml0ZSBHU1RfVEFHX0VOQ09ERVIgYW5kIEdTVF9UQUdfRU5DT0RFUl9WRVJTSU9OIGFzCisJICBJRDN2MiBUU1NFIGZyYW1lcyAoIzM0Nzg5OCkuCisKKzIwMDYtMDctMTkgMDc6NDA6NTIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIENoYW5nZUxvZzoKKwkgIENoYW5nZUxvZyBzdXJnZXJ5OiBtZW50aW9uIGZpeGVkIGJ1ZworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBDaGFuZ2VMb2cgc3VyZ2VyeTogbWVudGlvbiBmaXhlZCBidWcKKworMjAwNi0wNy0xOCAxOTo1OTowMSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aW11eC5jOiBSZXNwZWN0IG1wZWd2ZXJzaW9uIGZvciAidmlkZW8vbXBlZyIgYW5kIGdpdmUgbWVzc2FnZSBpbiBjYXNlIG9mIHVuaGFuZGxlZCB2ZXJzaW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aV9tdXhfdmlkc2lua19zZXRfY2Fwcyk6CisJICBSZXNwZWN0IG1wZWd2ZXJzaW9uIGZvciAidmlkZW8vbXBlZyIgYW5kIGdpdmUgbWVzc2FnZSBpbiBjYXNlIG9mCisJICB1bmhhbmRsZWQgdmVyc2lvbnMuCisKKzIwMDYtMDctMTggMTg6MDU6MTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogRml4IGNhcHMgYWZ0ZXIgcHJldmlvdXMgY2hhbmdlIHRvIGJ5dGUgb3JkZXIgZW5kaWFubmVzcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfY2hhaW4pOgorCSAgRml4IGNhcHMgYWZ0ZXIgcHJldmlvdXMgY2hhbmdlIHRvIGJ5dGUgb3JkZXIgZW5kaWFubmVzcy4KKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IChnc3Rfd2F2cGFja19wYXJzZV9yZXNldCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2Vfc2lua19ldmVudCksIChnc3Rfd2F2cGFja19wYXJzZV9pbml0KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9sb29wKToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmg6CisJICBRdWV1ZSBpbmNvbWluZyBldmVudHMgaWYgdGhlcmUncyBubyBzb3VyY2UgcGFkIHlldCBhbmQKKwkgIHNlbmQgdGhlbSBkb3duc3RyZWFtIGxhdGVyIHdoZW4gdGhlIHBhZCBpcyB0aGVyZS4KKworMjAwNi0wNy0xOCAxNjo0NzoyNSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy4qOiBPdXRwdXQgYXVkaW8gaW4gbmF0aXZlIGJ5dGUgb3JkZXIgKHdoaWNoIGlzIGFsc28gaG93IHdlIGdldCBzYW1wbGVzIGZyb20gd2F2cGFjayk7IG91dHB1Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX2luaXQpLAorCSAgKGdzdF93YXZwYWNrX2RlY19mb3JtYXRfc2FtcGxlcyksCisJICAoZ3N0X3dhdnBhY2tfZGVjX2NsaXBfb3V0Z29pbmdfYnVmZmVyKSwgKGdzdF93YXZwYWNrX2RlY19jaGFpbiksCisJICAoZ3N0X3dhdnBhY2tfZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuaDoKKwkgIE91dHB1dCBhdWRpbyBpbiBuYXRpdmUgYnl0ZSBvcmRlciAod2hpY2ggaXMgYWxzbyBob3cgd2UgZ2V0CisJICBzYW1wbGVzIGZyb20gd2F2cGFjayk7IG91dHB1dCBzYW1wbGVzIHdpdGggMjEtMjQgYml0IGRlcHRoCisJICB3aXRoIDMyIGJpdCB3aWR0aCAobWFrZXMgdGhpbmdzIGVhc2llciBmb3IgdXMpLgorCisyMDA2LTA3LTE4IDE1OjUzOjM1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLio6IE1vcmUgY2xlYW4tdXBzOiByZW1vdmUgbW9zdCBvZiB0aGUgZGlzZnVuY3Rpb25hbCBjb3JyZWN0aW9uIHBhZCBzdHVmZiBmb3Igbm93LCBpZiBpdCBldmUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfYmFzZV9pbml0KSwKKwkgIChnc3Rfd2F2cGFja19kZWNfY2xhc3NfaW5pdCksIChnc3Rfd2F2cGFja19kZWNfaW5pdCksCisJICAoZ3N0X3dhdnBhY2tfZGVjX2ZpbmFsaXplKSwgKGdzdF93YXZwYWNrX2RlY19mb3JtYXRfc2FtcGxlcyksCisJICAoZ3N0X3dhdnBhY2tfZGVjX2NsaXBfb3V0Z29pbmdfYnVmZmVyKSwgKGdzdF93YXZwYWNrX2RlY19jaGFpbiksCisJICAoZ3N0X3dhdnBhY2tfZGVjX3NpbmtfZXZlbnQpLCAoZ3N0X3dhdnBhY2tfZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuaDoKKwkgIE1vcmUgY2xlYW4tdXBzOiByZW1vdmUgbW9zdCBvZiB0aGUgZGlzZnVuY3Rpb25hbCBjb3JyZWN0aW9uCisJICBwYWQgc3R1ZmYgZm9yIG5vdywgaWYgaXQgZXZlciBnZXRzIGltcGxlbWVudGVkIGEgbG90IG9mIHN0dWZmCisJICB3aWxsIGhhdmUgdG8gYmUgcmV3cml0dGVuIGFueXdheTsgcmVkbyBjaGFpbiBmdW5jdGlvbiwgbW92ZQorCSAgZXJyb3JzIHRvIGVuZCwgZXJyb3Igb3V0IGluc3RlYWQgb2YgZ19hc3NlcnQoKWluZy4gQWxzbyByZW5hbWUKKwkgIG92ZXJseSBsb25nIHZhcmlhYmxlICd3YXZwYWNrZGVjJyB0byBqdXN0ICdkZWMnOyBtaXNjZWxsYW5lb3VzCisJICBvdGhlciBzbWFsbCBzdHVmZi4KKworMjAwNi0wNy0xOCAxNDowODowNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBjb25maWd1cmUuYWM6IENoZWNrIGZvciB3YXZwYWNrIHZlcnNpb24gYW5kIGRlZmluZSBXQVZQQUNLX09MRF9BUEkgaWYgbmVjZXNzYXJ5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW8gYXQgY2lyY3VsYXItY2hhb3Mub3JnPgorCSAgKiBjb25maWd1cmUuYWM6CisJICBDaGVjayBmb3Igd2F2cGFjayB2ZXJzaW9uIGFuZCBkZWZpbmUgV0FWUEFDS19PTERfQVBJIGlmCisJICBuZWNlc3NhcnkuCisJICAqIGV4dC93YXZwYWNrL01ha2VmaWxlLmFtOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrY29tbW9uLmM6IChnc3Rfd2F2cGFja19yZWFkX2hlYWRlciksCisJICAoZ3N0X3dhdnBhY2tfcmVhZF9tZXRhZGF0YSk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tjb21tb24uaDoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX2Jhc2VfaW5pdCksCisJICAoZ3N0X3dhdnBhY2tfZGVjX2NsYXNzX2luaXQpLCAoZ3N0X3dhdnBhY2tfZGVjX2luaXQpLAorCSAgKGdzdF93YXZwYWNrX2RlY19maW5hbGl6ZSksIChnc3Rfd2F2cGFja19kZWNfZm9ybWF0X3NhbXBsZXMpLAorCSAgKGdzdF93YXZwYWNrX2RlY19jbGlwX291dGdvaW5nX2J1ZmZlciksIChnc3Rfd2F2cGFja19kZWNfY2hhaW4pLAorCSAgKGdzdF93YXZwYWNrX2RlY19zaW5rX2V2ZW50KSwgKGdzdF93YXZwYWNrX2RlY19jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF93YXZwYWNrX2RlY19yZXF1ZXN0X25ld19wYWQpLCAoZ3N0X3dhdnBhY2tfZGVjX3BsdWdpbl9pbml0KToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5oOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3dhdnBhY2tfZW5jX2luaXQpLCAoZ3N0X3dhdnBhY2tfZW5jX2ZpbmFsaXplKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfc2V0X3dwX2NvbmZpZyk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiAoZ3N0X3dhdnBhY2tfcGFyc2VfYmFzZV9pbml0KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9maW5hbGl6ZSksIChnc3Rfd2F2cGFja19wYXJzZV9jbGFzc19pbml0KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9pbmRleF9nZXRfZW50cnlfZnJvbV9zYW1wbGUpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX3NjYW5fdG9fZmluZF9zYW1wbGUpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2hhbmRsZV9zZWVrX2V2ZW50KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9jcmVhdGVfc3JjX3BhZCk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tzdHJlYW1yZWFkZXIuYzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3N0cmVhbXJlYWRlci5oOgorCSAgUG9ydCB0byBuZXcvb2ZmaWNpYWwgd2F2cGFjayBBUEksIGRvbid0IHVzZSBBUEkgdGhhdCB3YXMgZXhwb3J0ZWQKKwkgIGluIHdhdnBhY2sgaGVhZGVyIGZpbGVzIGFuZCBpbiB0aGUgbGliIGJ1dCBtZWFudCB0byBiZSBwcml2YXRlLCBhdAorCSAgbGVhc3Qgbm90IGZvciByZWNlbnQgd2F2cGFjayB2ZXJzaW9uczsgbWlzYy4gJ2NsZWFudXBzJyAoIzM0NzQ0MykuCisKKzIwMDYtMDctMTcgMTA6MjU6NTcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogU3RvcmUgZHVyYXRpb24gaW4gdWludDY0IHRvbyBpbnN0ZWFkIG9mIGNsaXBwaW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X3BlcmZvcm1fc2VlayksCisJICAoZ3N0X3F0ZGVtdXhfcHJlcGFyZV9jdXJyZW50X3NhbXBsZSksCisJICAoZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9tb3ZpZSk6CisJICBTdG9yZSBkdXJhdGlvbiBpbiB1aW50NjQgdG9vIGluc3RlYWQgb2YgY2xpcHBpbmcuCisJICBXaGVuIHdlIGRvIGEga2V5ZnJhbWUgc2VlayBhbmQgdGhlIHJlcXVlc3RlZCB0aW1lIGlzIGF0IHRoZQorCSAga2V5ZnJhbWUsIGRvbid0IHNlZWsgYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBrZXlmcmFtZS4KKwkgIEZpeGVzICMzNDc0MzkuCisKKzIwMDYtMDctMTcgMTA6MjI6NTQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZGVjLio6IFVzZSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBzZWdtZW50IGluc3RlYWQgb2YgbGVha2luZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiAoZ3N0X3BuZ2RlY19pbml0KSwgKGJ1ZmZlcl9jbGlwKSwKKwkgIChnc3RfcG5nZGVjX2NhcHNfY3JlYXRlX2FuZF9zZXQpLCAoZ3N0X3BuZ2RlY190YXNrKSwKKwkgIChnc3RfcG5nZGVjX2NoYWluKSwgKGdzdF9wbmdkZWNfc2lua19ldmVudCksCisJICAoZ3N0X3BuZ2RlY19saWJwbmdfaW5pdCksIChnc3RfcG5nZGVjX2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3BuZ2RlY19zaW5rX2FjdGl2YXRlX3B1c2gpOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5oOgorCSAgVXNlIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHNlZ21lbnQgaW5zdGVhZCBvZiBsZWFraW5nLgorCSAgVmFyaW91cyBjbGVhbnVwcy4KKwkgIEZpeCBmbHVzaCBhbmQgc2VlayBoYW5kbGluZy4KKworMjAwNi0wNy0xNiAxNDozMTo0OCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IEFkZGVkIHNpbXBsZSBnZW5lcmljIG1wZWc0IGRlcGF5bG9hZGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHAvZ3N0cnRwLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6IChnc3RfcnRwX21wNGdfZGVwYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX21wNGdfZGVwYXlfY2xhc3NfaW5pdCksIChnc3RfcnRwX21wNGdfZGVwYXlfaW5pdCksCisJICAoZ3N0X3J0cF9tcDRnX2RlcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9tcDRnX2RlcGF5X3Byb2Nlc3MpLAorCSAgKGdzdF9ydHBfbXA0Z19kZXBheV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfbXA0Z19kZXBheV9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfbXA0Z19kZXBheV9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9ydHBfbXA0Z19kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOiAoZ3N0X3J0cF9tcDRnX3BheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX21wNGdfcGF5X3BhcnNlX2F1ZGlvX2NvbmZpZyksIChnc3RfcnRwX21wNGdfcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfbXA0Z19wYXlfZmx1c2gpOgorCSAgQWRkZWQgc2ltcGxlIGdlbmVyaWMgbXBlZzQgZGVwYXlsb2FkZXIuCisJICBGaXggZ2VuZXJpYyBtcGVnNCBwYXlsb2FkZXIuCisKKzIwMDYtMDctMTUgMTU6MjU6MDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogRG9uJ3QgdHJ5IGRvaW5nIHN0YXRlIGNoYW5nZXMgb24gYSBOVUxMIHBvaW50ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc2V0X3N0YXRlKToKKwkgIERvbid0IHRyeSBkb2luZyBzdGF0ZSBjaGFuZ2VzIG9uIGEgTlVMTCBwb2ludGVyLgorCisyMDA2LTA3LTE1IDExOjUwOjI1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9zcGVjdHJ1bS86IERvIG5vdCB1c2UgZGVwcmVjYXRlZCBndGsgZnVuY3Rpb25zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOiAobWFpbik6CisJICAqIGdzdC9zcGVjdHJ1bS9kZW1vLW9zc3NyYy5jOiAobWFpbik6CisJICBEbyBub3QgdXNlIGRlcHJlY2F0ZWQgZ3RrIGZ1bmN0aW9ucy4KKworMjAwNi0wNy0xNCAxMzozMzo1NCArMDAwMCAgU2ViYXN0aWVuIENvdGUgPHNlYmFzNjQyQHlhaG9vLmNhPgorCisJICBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5Lio6IHJ0cGFtcmRlYyBpc24ndCBhIHN1YmNsYXNzIG9mIEdzdEJhc2VSdHBEZXBheWxvYWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpZW4gQ290ZSA8c2ViYXM2NDIgYXQgeWFob28gZG90IGNhPgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6IChnc3RfcnRwX2Ftcl9kZXBheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfYW1yX2RlcGF5X2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9hbXJfZGVwYXlfaW5pdCksCisJICAoZ3N0X3J0cF9hbXJfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX2Ftcl9kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5oOgorCSAgcnRwYW1yZGVjIGlzbid0IGEgc3ViY2xhc3Mgb2YgR3N0QmFzZVJ0cERlcGF5bG9hZC4KKwkgIEZpeGVzICMzMjExOTEKKworMjAwNi0wNy0xNCAxMjowMTowNSArMDAwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSAgc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzogRml4IHNlZ2ZhdWx0IHdoZW4gbW92aW5nIG1vdXNlIHBvaW50ZXIgdG8gdGhlIGJvdHRvbSByaWdodCBjb3JuZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDctMTQgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKwkgICogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzogKGdzdF94aW1hZ2Vfc3JjX3hpbWFnZV9nZXQpLAorCSAgKGdzdF94aW1hZ2Vfc3JjX2dldF9jYXBzKSwgKGdzdF94aW1hZ2Vfc3JjX2NsYXNzX2luaXQpOgorCSAgRml4IHNlZ2ZhdWx0IHdoZW4gbW92aW5nIG1vdXNlIHBvaW50ZXIgdG8gdGhlIGJvdHRvbSByaWdodCBjb3JuZXIuCisKKzIwMDYtMDctMTMgMTU6MjI6MjAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBjb21tb246CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXRkZW11eC54bWw6CisJICByZW1vdmUgc2RsdmlkZW9zaW5rIHBsdWdpbiBhbmQgdXBkYXRlIHRoZSByZXN0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbW92ZSBzZGx2aWRlb3NpbmsgcGx1Z2luIGFuZCB1cGRhdGUgdGhlIHJlc3QKKworMjAwNi0wNy0xMiAwOTozNDoxNSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IEFkZGVkIG1wZWcyIFRTIGRlcGF5bG9hZGVyLiBDbG9zaW5nICMzNDcyMzQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuYzogKGdzdF9ydHBfbXAydF9kZXBheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfbXAydF9kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfbXAydF9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX21wMnRfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX21wMnRfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF9tcDJ0X2RlcGF5X3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9tcDJ0X2RlcGF5X2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9tcDJ0X2RlcGF5X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3J0cF9tcDJ0X2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuaDoKKwkgIEFkZGVkIG1wZWcyIFRTIGRlcGF5bG9hZGVyLiBDbG9zaW5nICMzNDcyMzQuCisKKzIwMDYtMDctMTIgMDk6Mjg6NDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiBGaXggdHlwbyBpbiBwcm9wZXJ0eSBuaWNrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX2NsYXNzX2luaXQpOgorCSAgRml4IHR5cG8gaW4gcHJvcGVydHkgbmljay4KKworMjAwNi0wNy0xMSAyMjo0Njo0NyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2NkaW8vZ3N0Y2Rpb2NkZGFzcmMuYzogUmVtb3ZlIGdfYXNzZXJ0IHRoYXQgc2hvdWxkbid0IGJlIHRoZXJlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9jZGlvL2dzdGNkaW9jZGRhc3JjLmM6IChnc3RfY2Rpb19jZGRhX3NyY19jbG9zZSk6CisJICBSZW1vdmUgZ19hc3NlcnQgdGhhdCBzaG91bGRuJ3QgYmUgdGhlcmUuCisKKzIwMDYtMDctMTAgMjA6MTE6MzQgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguKjogRG9uJ3QgcHVzaCB0YWcgZXZlbnRzIGZvdW5kIGJ5IGdzdF9yaWZmX3BhcnNlX2luZm8oKSBiZWZvcmUgb3V0cHV0dGluZworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcmVzZXQpLAorCSAgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlciksIChwdXNoX3RhZ19saXN0cyk6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIERvbid0IHB1c2ggdGFnIGV2ZW50cyBmb3VuZCBieSBnc3RfcmlmZl9wYXJzZV9pbmZvKCkgYmVmb3JlIG91dHB1dHRpbmcKKwkgIEdTVF9FVkVOVF9ORVdTRUdNRU5ULgorCisyMDA2LTA3LTEwIDE2OjQxOjU3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC86IHJlcGxhY2VkIGNsb3Nlc29ja2V0IGFuZCBjbG9zZSBpbiBjb2RlIHdpdGggb25lIENMT1NFX1NPQ0tFVC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKHJ0c3BfY29ubmVjdGlvbl9zZW5kKSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fY2xvc2UpOgorCSAgKiBnc3QvcnRzcC9ydHNwZGVmcy5oOgorCSAgcmVwbGFjZWQgY2xvc2Vzb2NrZXQgYW5kIGNsb3NlIGluIGNvZGUgd2l0aCBvbmUgQ0xPU0VfU09DS0VULgorCSAgU29tZSBtb3JlIGNsZWFudXBzLiBGaXhlcyAjMzQ1MzAxLgorCisyMDA2LTA3LTEwIDE1OjI2OjM5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6IEZpeCBleGFtcGxlIHBpcGVsaW5lIGluIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSAgRml4IGV4YW1wbGUgcGlwZWxpbmUgaW4gZG9jcy4KKworMjAwNi0wNy0xMCAxNDo0OTo0NiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2ZpbHRlci86IERvbid0IGZvcmdldCBuZXcgZmlsZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ZpbHRlci9nc3RicHdzaW5jLmg6CisJICAqIGdzdC9maWx0ZXIvZ3N0aWlyLmg6CisJICAqIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy5oOgorCSAgRG9uJ3QgZm9yZ2V0IG5ldyBmaWxlcy4KKworMjAwNi0wNy0xMCAxNDo0MjoxNSArMDAwMCAgTWF0aGlzIEhvZmVyIDxtYXRoaXMuaG9mZXJAZHJlYW1sYWIubmV0PgorCisJICBQb3J0ZWQgdGhlIGdzdGZpbHRlciBwbHVnaW4gdG8gR1N0cmVhbWVyIDAuMTAuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBNYXRoaXMgSG9mZXIgPG1hdGhpcyBkb3QgaG9mZXIgYXQgZHJlYW1sYWIgZG90IG5ldD4KKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvZmlsdGVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYzogKGdzdF9icHdzaW5jX2Rpc3Bvc2UpLAorCSAgKGdzdF9icHdzaW5jX2Jhc2VfaW5pdCksIChnc3RfYnB3c2luY19jbGFzc19pbml0KSwKKwkgIChnc3RfYnB3c2luY19pbml0KSwgKGJwd3NpbmNfc2V0X2NhcHMpLCAoYnB3c2luY190cmFuc2Zvcm1faXApLAorCSAgKGJwd3NpbmNfc2V0X3Byb3BlcnR5KSwgKGJwd3NpbmNfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2ZpbHRlci9nc3RmaWx0ZXIuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L2ZpbHRlci9nc3RmaWx0ZXIuaDoKKwkgICogZ3N0L2ZpbHRlci9nc3RpaXIuYzogKGdzdF9paXJfZGlzcG9zZSksIChnc3RfaWlyX2Jhc2VfaW5pdCksCisJICAoZ3N0X2lpcl9jbGFzc19pbml0KSwgKGdzdF9paXJfaW5pdCksIChpaXJfc2V0X2NhcHMpLAorCSAgKGlpcl90cmFuc2Zvcm1faXApLCAoaWlyX3NldF9wcm9wZXJ0eSksIChpaXJfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6IChnc3RfbHB3c2luY19kaXNwb3NlKSwKKwkgIChnc3RfbHB3c2luY19iYXNlX2luaXQpLCAoZ3N0X2xwd3NpbmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X2xwd3NpbmNfaW5pdCksIChscHdzaW5jX3NldF9jYXBzKSwgKGxwd3NpbmNfdHJhbnNmb3JtX2lwKSwKKwkgIChscHdzaW5jX3NldF9wcm9wZXJ0eSksIChscHdzaW5jX2dldF9wcm9wZXJ0eSk6CisJICBQb3J0ZWQgdGhlIGdzdGZpbHRlciBwbHVnaW4gdG8gR1N0cmVhbWVyIDAuMTAuCisKKzIwMDYtMDctMTAgMTA6MjE6NTcgKzAwMDAgIFJvYiBUYXlsb3IgPHJvYnRheWxvckBmbG9vcGlseS5vcmc+CisKKwkgIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IElmIGEgZGVzdGluYXRpb24gaXMgYWRkZWQgYmVmb3JlIHRoZSBzdHJlYW0gaXMgc2V0IHRvIFBBVVNFRCwgdGhlIG11bHRpY2FzdCBncm91cCBpcyBub3Qgai4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUm9iIFRheWxvciA8cm9idGF5bG9yIGF0IGZsb29waWx5IGRvdCBvcmc+CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChqb2luX211bHRpY2FzdCksCisJICAoZ3N0X211bHRpdWRwc2lua19pbml0X3NlbmQpLCAoZ3N0X211bHRpdWRwc2lua19hZGQpOgorCSAgSWYgYSBkZXN0aW5hdGlvbiBpcyBhZGRlZCBiZWZvcmUgdGhlIHN0cmVhbSBpcyBzZXQgdG8gUEFVU0VELCB0aGUKKwkgIG11bHRpY2FzdCBncm91cCBpcyBub3Qgam9pbmVkIGFzIHRoZSBzb2NrZXQgaXMgbm90IGNyZWF0ZWQgeWV0LgorCSAgQWxzbyBUVEwgYW5kIExPT1Agc2hvdWxkIGFsc28gYmUgc2V0LiBGaXhlcyAjMzQ2OTIxLgorCisyMDA2LTA3LTEwIDA5OjU3OjI2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEV4dHJhY3QgY29tbWVudCBpbmZvcm1hdGlvbiEhCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV91ZHRhKToKKwkgIEV4dHJhY3QgY29tbWVudCBpbmZvcm1hdGlvbiEhCisKKzIwMDYtMDctMTAgMDk6NDY6MjUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRXh0cmFjdCB5ZWFyL2RhdGUgaW5mb3JtYXRpb24gKGZpeGVzICMzNDcwNzkpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2VfdWR0YSksCisJICAocXRkZW11eF90YWdfYWRkX2RhdGUpOgorCSAgRXh0cmFjdCB5ZWFyL2RhdGUgaW5mb3JtYXRpb24gKGZpeGVzICMzNDcwNzkpLgorCisyMDA2LTA3LTA4IDIyOjQxOjI1ICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy4qOiBGaXggdXNlLWRhbWFnZSBwcm9wZXJ0eSB0byBhY3R1YWxseSB3b3JrIDopCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDctMDkgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKwkgICogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzogKGdzdF94aW1hZ2Vfc3JjX3hpbWFnZV9nZXQpLAorCSAgKGdzdF94aW1hZ2Vfc3JjX3NldF9wcm9wZXJ0eSksIChnc3RfeGltYWdlX3NyY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF94aW1hZ2Vfc3JjX2dldF9jYXBzKSwgKGdzdF94aW1hZ2Vfc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF94aW1hZ2Vfc3JjX2luaXQpOgorCSAgKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5oOgorCSAgRml4IHVzZS1kYW1hZ2UgcHJvcGVydHkgdG8gYWN0dWFsbHkgd29yayA6KQorCSAgQWRkIHN0YXJ0eCwgc3RhcnR5LCBlbmR4LCBlbmR5IHByb3BlcnRpZXMgc28gc2NyZWVuY2FzdHMgb3RoZXIgdGhhbiBmdWxsCisJICBzY3JlZW4gb25lcyBjYW4gd29yay4KKworMjAwNi0wNy0wOCAxOTowMzo1NCArMDAwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSAgc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuKjogQWRkIHVzZV9kYW1hZ2UgcHJvcGVydHkgdG8gb2ZmZXIgYWJpbGl0eSB0byBjaG9vc2Ugd2hldGhlciB0byB1c2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wNy0wOCAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCSAgKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiAoZ3N0X3hpbWFnZV9zcmNfeGltYWdlX2dldCksCisJICAoZ3N0X3hpbWFnZV9zcmNfc2V0X3Byb3BlcnR5KSwgKGdzdF94aW1hZ2Vfc3JjX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3hpbWFnZV9zcmNfY2xhc3NfaW5pdCksIChnc3RfeGltYWdlX3NyY19pbml0KToKKwkgICogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuaDoKKwkgIEFkZCB1c2VfZGFtYWdlIHByb3BlcnR5IHRvIG9mZmVyIGFiaWxpdHkgdG8gY2hvb3NlIHdoZXRoZXIgdG8gdXNlCisJICBYRGFtYWdlIG9yIG5vdC4KKworMjAwNi0wNy0wNyAxNTowNDoyOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2dvb20vZmlsdGVycy5jOiBBdm9pZCBnb29tIGNvcmVkdW1waW5nIGJ5IGNsZWFyaW5nIG1lbW9yeS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbS9maWx0ZXJzLmM6ICh6b29tRmlsdGVyU2V0UmVzb2x1dGlvbik6CisJICBBdm9pZCBnb29tIGNvcmVkdW1waW5nIGJ5IGNsZWFyaW5nIG1lbW9yeS4KKwkgIEZpeGVzIDM0NTY3OS4KKworMjAwNi0wNy0wNyAxNDozMDoyNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBEb24ndCBjcmFzaCBvbiB0d29zL3Nvd3QvcmF3IGF1ZGlvLiAjMzQ1ODMwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBEb24ndCBjcmFzaCBvbiB0d29zL3Nvd3QvcmF3IGF1ZGlvLiAjMzQ1ODMwLgorCisyMDA2LTA3LTA1IDIwOjIxOjAyICswMDAwICBTw6liYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisKKwkgIHdpbjMyL3ZzNi9saWJnc3RpZDNkZW11eC5kc3A6IEFkZCBhIGxpbmsgdG8gbGliZ3N0dGFnLTAuMTAubGliLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RpZDNkZW11eC5kc3A6CisJICBBZGQgYSBsaW5rIHRvIGxpYmdzdHRhZy0wLjEwLmxpYi4KKworMjAwNi0wNy0wNSAxNDo1MjoxMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0LzogRG9uJ3QgcmV0dXJuIEZMT1dfVU5FWFBFQ1RFRCB3aGVuIGEgYnVmZmVyIGlzIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIHN0cmVhbSAod2hpY2ggbWlnaHQgaGFwcGVuIHdpdGggbGFyZ2UgSUQzLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FwZXRhZy9nc3R0YWdkZW11eC5jOiAoZ3N0X3RhZ19kZW11eF90cmltX2J1ZmZlciksCisJICAoZ3N0X3RhZ19kZW11eF9yZWFkX3JhbmdlKToKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfaWQzZGVtdXhfdHJpbV9idWZmZXIpLAorCSAgKGdzdF9pZDNkZW11eF9yZWFkX3JhbmdlKToKKwkgIERvbid0IHJldHVybiBGTE9XX1VORVhQRUNURUQgd2hlbiBhIGJ1ZmZlciBpcyBiZWZvcmUKKwkgIHRoZSBzdGFydCBvZiB0aGUgc3RyZWFtICh3aGljaCBtaWdodCBoYXBwZW4gd2l0aAorCSAgbGFyZ2UgSUQzdjIgdGFncyBpZiB0aGUgdGFnIHJlYWRpbmcgd2FzIGRvbmUgcHVsbHJhbmdlCisJICBiYXNlZCBhbmQgd2UgdGhlbiBzd2l0Y2hlZCB0byBwdXNoIG1vZGUgbGF0ZXIgb24pLgorCSAgRml4ZXMgcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGJ5IGNvbW1pdCBmcm9tIEp1bmUgMjl0aC4KKworMjAwNi0wNy0wNSAxMDoxNDoxNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzogTWFrZSBVVEYtOCB0aGUgZGVmYXVsdCBlbmNvZGluZyB3aGVuIHdyaXRpbmcgc3RyaW5nIHRhZ3MgKGJlZm9yZSwgb3VyIFVURi04IHN0cmluZ3Mgd291bGQgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzoKKwkgIE1ha2UgVVRGLTggdGhlIGRlZmF1bHQgZW5jb2Rpbmcgd2hlbiB3cml0aW5nIHN0cmluZworCSAgdGFncyAoYmVmb3JlLCBvdXIgVVRGLTggc3RyaW5ncyB3b3VsZCBhdXRvbWF0aWNhbGx5CisJICBiZSBjb252ZXJ0ZWQgdG8gSVNPLTg4NTktMSBieSB0YWdsaWIgYW5kIHdyaXR0ZW4gYXMKKwkgIElTTy04ODU5LTEgZmllbGRzIGlmIHRoYXQgd2FzIHBvc3NpYmxlKS4KKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzdjJtdXguYzogKHV0Zjhfc3RyaW5nX2luX2J1ZiksCisJICAodGVzdF90YWdsaWJfaWQzbXV4X2NoZWNrX3RhZ19idWZmZXIpLCAoaWRlbnRpdHlfY2IpLAorCSAgKHRlc3RfdGFnbGliX2lkM211eF93aXRoX3RhZ3MpOgorCSAgQWRkIHRlc3QgY2FzZSB0aGF0IG1ha2VzIHN1cmUgb3VyIFVURi04IHN0cmluZ3MgaGF2ZQorCSAgYWN0dWFsbHkgYmVlbiB3cml0dGVuIGludG8gdGhlIHRhZyBhcyBVVEYtOC4KKworMjAwNi0wNy0wNCAxNjowMDoyNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBMZXQncyB0cnkgdGhhdCBhZ2Fpbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBMZXQncyB0cnkgdGhhdCBhZ2Fpbi4KKworMjAwNi0wNy0wNCAxNTo0MDo0NyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBEaXNhYmxlIG1vbm9zY29wZSBwbHVnaW4gZm9yIG5vdyB1bnRpbCBpdCBmdWxmaWxscyBhbGwgdGhlIHJlcXVpcmVtZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBEaXNhYmxlIG1vbm9zY29wZSBwbHVnaW4gZm9yIG5vdyB1bnRpbCBpdCBmdWxmaWxscworCSAgYWxsIHRoZSByZXF1aXJlbWVudHMuCisKKzIwMDYtMDctMDMgMjA6MzU6NDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIFBvcnQgbW9ub3Njb3BlIHZpc3VhbGlzYXRpb24gdG8gMC4xMC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9tb25vc2NvcGUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6IChnc3RfbW9ub3Njb3BlX2Jhc2VfaW5pdCksCisJICAoZ3N0X21vbm9zY29wZV9jbGFzc19pbml0KSwgKGdzdF9tb25vc2NvcGVfaW5pdCksCisJICAoZ3N0X21vbm9zY29wZV9maW5hbGl6ZSksIChnc3RfbW9ub3Njb3BlX3Jlc2V0KSwKKwkgIChnc3RfbW9ub3Njb3BlX3Npbmtfc2V0Y2FwcyksIChnc3RfbW9ub3Njb3BlX3NyY19zZXRjYXBzKSwKKwkgIChnc3RfbW9ub3Njb3BlX3NyY19uZWdvdGlhdGUpLCAoZ2V0X2J1ZmZlciksIChnc3RfbW9ub3Njb3BlX2NoYWluKSwKKwkgIChnc3RfbW9ub3Njb3BlX3NpbmtfZXZlbnQpLCAoZ3N0X21vbm9zY29wZV9zcmNfZXZlbnQpLAorCSAgKGdzdF9tb25vc2NvcGVfY2hhbmdlX3N0YXRlKSwgKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuaDoKKwkgIFBvcnQgbW9ub3Njb3BlIHZpc3VhbGlzYXRpb24gdG8gMC4xMC4KKworMjAwNi0wNy0wMyAyMDowMjo1NiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBGaXggc2lsbHkgY3Jhc2hlciBpbiBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb247IGFkZAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9oZWFkZXIpLCAocXRkZW11eF92aWRlb19jYXBzKToKKwkgIEZpeCBzaWxseSBjcmFzaGVyIGluIHN0YXRlIGNoYW5nZSBmdW5jdGlvbjsgYWRkCisJICBJVjQxIGZvdXJjYyAoc2VlIGJ1ZyAjMTcxMTExKTsgZG9uJ3Qgb3V0cHV0IGNvbmZ1c2luZworCSAgZGVidWcgbWVzc2FnZSB3aGVuIHNraXBwaW5nIGF0b21zLgorCisyMDA2LTA3LTAzIDE2OjQzOjEwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvOiBSZXR1cm4gRkxPV19VTkVYUEVDVEVEIHdoZW4gYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwgbm90CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FwZXRhZy9nc3R0YWdkZW11eC5jOiAoZ3N0X3RhZ19kZW11eF9jaGFpbik6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAoZ3N0X2lkM2RlbXV4X2NoYWluKToKKwkgIFJldHVybiBGTE9XX1VORVhQRUNURUQgd2hlbiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCBub3QKKwkgIEZMT1dfRVJST1IuIEZpeGVzICdpbnRlcm5hbCBzdHJlYW0gZXJyb3InIGVycm9ycyB0aGF0CisJICB3b3VsZCBzb21ldGltZXMgb2NjdXIgaW4gdG90ZW0gd2hlbiBzY3J1YmJpbmcgdG8gdGhlCisJICBlbmQgb2YgYW4gSUQzdjEgdGFnZ2VkIG1wMyBmaWxlLgorCisyMDA2LTA3LTAzIDE1OjMxOjIyICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBleHQvbGlicG5nL2dzdHBuZ2RlYy4qOiBJbXBsZW1lbnQgYnVmZmVyIGNsaXBwaW5nL2Ryb3BwaW5nIHVzaW5nIEdzdFNlZ21lbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogKGdzdF9wbmdkZWNfaW5pdCksICh1c2VyX2luZm9fY2FsbGJhY2spLAorCSAgKGJ1ZmZlcl9jbGlwKSwgKHVzZXJfZW5kX2NhbGxiYWNrKSwgKGdzdF9wbmdkZWNfY2hhaW4pLAorCSAgKGdzdF9wbmdkZWNfc2lua19ldmVudCksIChnc3RfcG5nZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmg6CisJICBJbXBsZW1lbnQgYnVmZmVyIGNsaXBwaW5nL2Ryb3BwaW5nIHVzaW5nIEdzdFNlZ21lbnQuCisJICBUaGlzIHByb3ZpZGVzIGFjY3VyYXRlIHNlZWtpbmcuCisKKzIwMDYtMDctMDMgMTU6Mjg6NDggKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguKjogUHJvcGVyIGFnZ3JlZ2F0aW9uIG9mIGVhY2ggc3RyZWFtJ3MgR3N0Rmxvd1JldHVybiBpbiBvcmRlciB0byBmaWd1cmUgb3V0IHdoZXRoZXIgdGhlIHRhc2sgc2hvdS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcmVzZXQpLAorCSAgKGdzdF9hdmlfZGVtdXhfcmVhZF9zdWJpbmRleGVzKSwgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKSwKKwkgIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zZWVrKSwgKGdzdF9hdmlfZGVtdXhfYWdncmVnYXRlZF9mbG93KSwKKwkgIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSksIChwdXNoX3RhZ19saXN0cyksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSksIChnc3RfYXZpX2RlbXV4X2xvb3ApOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBQcm9wZXIgYWdncmVnYXRpb24gb2YgZWFjaCBzdHJlYW0ncyBHc3RGbG93UmV0dXJuIGluIG9yZGVyIHRvIGZpZ3VyZSBvdXQKKwkgIHdoZXRoZXIgdGhlIHRhc2sgc2hvdWxkIHN0b3Agb3Igbm90LgorCSAgRG9uJ3Qgc2VuZCBpbmxpbmUgZXZlbnRzIGJlZm9yZSBwdXNoaW5nIG91dCBhIE5FV19TRUdNRU5ULCBtb3JlCisJICBzcGVjaWZpY2FsbHkgZm9yIEdTVF9UQUdfRVZFTlQuCisJICBDaGFuZ2UgYSBHU1RfRVJST1IgdG8gYSBHU1RfV0FSTklORyBmb3IgYSBub24tZmF0YWwgc2l0dWF0aW9uIGluIHJlYWRpbmcKKwkgIHN1Yi1pbmRleGVzLgorCisyMDA2LTA2LTMwIDA3OjExOjI0ICswMDAwICBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uQHN1bi5jb20+CisKKwkgIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyY3RybC5jOiBNb3ZlICJNb25pdG9yIiBzbGlkZXIgdG8gaW5wdXQgdGFiIHNvIGl0IHdvcmtzIG1vcmUgbGlrZSBzZHRhdWRpb2NvbnRyb2wsIHdoaWNoIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQnJpYW4gQ2FtZXJvbiAgPGJyaWFuIGRvdCBjYW1lcm9uIGF0IHN1biBkb3QgY29tPgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuYzoKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl9jdHJsX2J1aWxkX2xpc3QpOgorCSAgTW92ZSAiTW9uaXRvciIgc2xpZGVyIHRvIGlucHV0IHRhYiBzbyBpdCB3b3JrcyBtb3JlIGxpa2UKKwkgIHNkdGF1ZGlvY29udHJvbCwgd2hpY2ggaXMgd2hhdCBwZW9wbGUgb24gU29sYXJpcyBhcmUgdXNlZAorCSAgdG8gdXNpbmcgZm9yIHRoZWlyIG1peGVyIHByb2dyYW0gKCMzNDYyNTkpLgorCisyMDA2LTA2LTI5IDE0OjUwOjE4ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzogZml4IGEgbGVhaywgY2xlYW4gdXAgYXQgdGhlIGVuZAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICBmaXggYSBsZWFrLCBjbGVhbiB1cCBhdCB0aGUgZW5kCisKKzIwMDYtMDYtMjkgMTE6NDE6NTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS86IFNlbmQgdGFnIGV2ZW50IGFmdGVyIG5ld3NlZ21lbnQgZXZlbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3NlbmRfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9sb29wX3N0cmVhbV9wYXJzZV9pZCk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIFNlbmQgdGFnIGV2ZW50IGFmdGVyIG5ld3NlZ21lbnQgZXZlbnQuCisKKzIwMDYtMDYtMjkgMTE6MTE6NTAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiBNYWtlIHN1cmUgd2UgZG9uJ3QgcmV0dXJuIEdTVF9GTE9XX09LIHdpdGggYSBOVUxMIGJ1ZmZlciBpbiBjZXJ0YWluIGNhc2VzIHdoZXJlIGEgcmVhZCBiZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAoZ3N0X2lkM2RlbXV4X3RyaW1fYnVmZmVyKSwKKwkgIChnc3RfaWQzZGVtdXhfcmVhZF9yYW5nZSk6CisJICBNYWtlIHN1cmUgd2UgZG9uJ3QgcmV0dXJuIEdTVF9GTE9XX09LIHdpdGggYSBOVUxMIGJ1ZmZlciBpbgorCSAgY2VydGFpbiBjYXNlcyB3aGVyZSBhIHJlYWQgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMKKwkgIHJlcXVlc3RlZC4gRml4ZXMgIzM0NTkzMC4KKwkgICogZ3N0L2FwZXRhZy9nc3R0YWdkZW11eC5jOiAoZ3N0X3RhZ19kZW11eF90cmltX2J1ZmZlciksCisJICAoZ3N0X3RhZ19kZW11eF9yZWFkX3JhbmdlKToKKwkgIEZpeCBzYW1lIGlzc3VlIGhlcmUgYXMgd2VsbC4KKworMjAwNi0wNi0yOSAxMTowNToxNCArMDAwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSAgc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzogRml4IGh5cG90aGV0aWNhbCBjcmFzaC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wNi0yOSAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCSAgKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiAoZ3N0X3hpbWFnZV9zcmNfeGltYWdlX2dldCk6CisJICBGaXggaHlwb3RoZXRpY2FsIGNyYXNoLgorCisyMDA2LTA2LTI4IDA4OjM2OjMwICswMDAwICBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uQHN1bi5jb20+CisKKwkgIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NpbmsuYzogRG8gbm90IG1vZGlmeSB0aGUgcG9ydHMgdmFsdWUuIElmIHRoZSB1c2VyIGhhcyB0dXJuZWQgb2ZmIHRoZSBidWlsdC1pbiBzcGVha2VycywgdGhlbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQnJpYW4gQ2FtZXJvbiAgPGJyaWFuIGRvdCBjYW1lcm9uIGF0IHN1biBkb3QgY29tPgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmM6IChnc3Rfc3VuYXVkaW9zaW5rX3ByZXBhcmUpOgorCSAgRG8gbm90IG1vZGlmeSB0aGUgcG9ydHMgdmFsdWUuIElmIHRoZSB1c2VyIGhhcyB0dXJuZWQgb2ZmIHRoZQorCSAgYnVpbHQtaW4gc3BlYWtlcnMsIHRoZW4gd2Ugc2hvdWxkIG5vdCByZXNldCBpdCBpbiB0aGUgcHJlcGFyZQorCSAgZnVuY3Rpb24sIHNpbmNlIHRoaXMgY2F1c2VzIHRoZSBidWlsdC1pbiBzcGVha2VycyB0byB0dXJuCisJICBiYWNrIG9uIGFueXRpbWUgdGhlIHVzZXIgY2hhbmdlcyBhIHRyYWNrIGluIHRvdGVtLCByaHl0aG1ib3gsCisJICBldGMuICgjMzQ2MDY2KS4KKworMjAwNi0wNi0yMyAwOTozNTo0NSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2dvb20vZ3N0Z29vbS5jOiBGaXggZG91YmxlIGNhcHMgdW5yZWYgd2hlbiBuZWdvdGlhdGlvbiBmYWlscy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnc3RfZ29vbV9zcmNfbmVnb3RpYXRlKToKKwkgIEZpeCBkb3VibGUgY2FwcyB1bnJlZiB3aGVuIG5lZ290aWF0aW9uIGZhaWxzLgorCisyMDA2LTA2LTIyIDE5OjMxOjA0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBVc2UgR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyB3aGVyZSBwb3NzaWJsZSAoIzM0MjUwMykgcGx1cyB0d28gbWlub3IgbWFjcm8gZml4ZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1sZW5jLmM6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxwYXJzZXIuYzoKKwkgICogZXh0L2R2L2dzdGR2ZGVjLmM6CisJICAqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJICAqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmM6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgICogZXh0L2pwZWcvZ3N0c21va2VkZWMuYzoKKwkgICogZXh0L2pwZWcvZ3N0c21va2VlbmMuYzoKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJICAqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJICAqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6CisJICAqIGdzdC9kZWJ1Zy9nc3RuYXZpZ2F0aW9udGVzdC5jOgorCSAgKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzoKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRwZGVjLmM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgICogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICAqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICBVc2UgR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyB3aGVyZSBwb3NzaWJsZSAoIzM0MjUwMykKKwkgIHBsdXMgdHdvIG1pbm9yIG1hY3JvIGZpeGVzLgorCisyMDA2LTA2LTIyIDE2OjI3OjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvOiBUcnkgdG8gZml4IHVwIGJyb2tlbiBtYXRyb3NrYSBmaWxlcyBjb250YWluaW5nIHN1YnRpdGxlIHN0cmVhbXMgd2l0aCBub24tVVRGOCBjaGFyYWN0ZXIgZW5jb2RpbmdzIChjb3UuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfY2hlY2tfc3VidGl0bGVfYnVmZmVyKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3N1YnRpdGxlX2NhcHMpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJICAoZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfc3VidGl0bGVfY29udGV4dCk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIFRyeSB0byBmaXggdXAgYnJva2VuIG1hdHJvc2thIGZpbGVzIGNvbnRhaW5pbmcgc3VidGl0bGUKKwkgIHN0cmVhbXMgd2l0aCBub24tVVRGOCBjaGFyYWN0ZXIgZW5jb2RpbmdzIChjb3VydGVzeSBvZgorCSAgbWt2bWVyZ2UpIHVzaW5nIGVpdGhlciB0aGUgZW5jb2Rpbmcgc3BlY2lmaWVkIGluIHRoZQorCSAgR1NUX1NVQlRJVExFX0VOQ09ESU5HIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIHRoZQorCSAgY3VycmVudCBsb2NhbGUncyBjaGFyYWN0ZXIgc2V0IGlmIGl0IGlzIG5vbi1VVEY4LgorCSAgRml4ZXMgIzMzNzA3Ni4KKworMjAwNi0wNi0yMiAxMjoxNzoxMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IFNldCBpbWFnZSB0eXBlIGZyb20gQVBJQyBmcmFtZSBhcyAiaW1hZ2UtdHlwZSIgZmllbGQgb2YgR1NUX1RBR19JTUFHRSBidWZmZXIgY2FwcyAoIzM0NDYwNSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IChwYXJzZV9waWN0dXJlX2ZyYW1lKToKKwkgIFNldCBpbWFnZSB0eXBlIGZyb20gQVBJQyBmcmFtZSBhcyAiaW1hZ2UtdHlwZSIgZmllbGQKKwkgIG9mIEdTVF9UQUdfSU1BR0UgYnVmZmVyIGNhcHMgKCMzNDQ2MDUpLgorCisyMDA2LTA2LTIwIDE5OjQwOjI5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy86IFN1cHBvcnQgY2hhaW4tYmFzZWQgb3BlcmF0aW9uLCBzaG91bGQgbWFrZSBmbGFjLW92ZXItREFBUCB3b3JrICgjMzQwNDkyKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfZGVjX2luaXQpLAorCSAgKGdzdF9mbGFjX2RlY19yZXNldF9kZWNvZGVycyksCisJICAoZ3N0X2ZsYWNfZGVjX3NldHVwX3NlZWthYmxlX2RlY29kZXIpLAorCSAgKGdzdF9mbGFjX2RlY19zZXR1cF9zdHJlYW1fZGVjb2RlciksIChnc3RfZmxhY19kZWNfZmluYWxpemUpLAorCSAgKGdzdF9mbGFjX2RlY19tZXRhZGF0YV9jYWxsYmFjayksCisJICAoZ3N0X2ZsYWNfZGVjX21ldGFkYXRhX2NhbGxiYWNrX3NlZWthYmxlKSwKKwkgIChnc3RfZmxhY19kZWNfbWV0YWRhdGFfY2FsbGJhY2tfc3RyZWFtKSwKKwkgIChnc3RfZmxhY19kZWNfZXJyb3JfY2FsbGJhY2spLAorCSAgKGdzdF9mbGFjX2RlY19lcnJvcl9jYWxsYmFja19zZWVrYWJsZSksCisJICAoZ3N0X2ZsYWNfZGVjX2Vycm9yX2NhbGxiYWNrX3N0cmVhbSksIChnc3RfZmxhY19kZWNfcmVhZF9zZWVrYWJsZSksCisJICAoZ3N0X2ZsYWNfZGVjX3JlYWRfc3RyZWFtKSwgKGdzdF9mbGFjX2RlY193cml0ZSksCisJICAoZ3N0X2ZsYWNfZGVjX3dyaXRlX3NlZWthYmxlKSwgKGdzdF9mbGFjX2RlY193cml0ZV9zdHJlYW0pLAorCSAgKGdzdF9mbGFjX2RlY19sb29wKSwgKGdzdF9mbGFjX2RlY19zaW5rX2V2ZW50KSwKKwkgIChnc3RfZmxhY19kZWNfY2hhaW4pLCAoZ3N0X2ZsYWNfZGVjX2NvbnZlcnRfc2luayksCisJICAoZ3N0X2ZsYWNfZGVjX2dldF9zaW5rX3F1ZXJ5X3R5cGVzKSwgKGdzdF9mbGFjX2RlY19zaW5rX3F1ZXJ5KSwKKwkgIChnc3RfZmxhY19kZWNfZ2V0X3NyY19xdWVyeV90eXBlcyksIChnc3RfZmxhY19kZWNfc3JjX3F1ZXJ5KSwKKwkgIChnc3RfZmxhY19kZWNfaGFuZGxlX3NlZWtfZXZlbnQpLCAoZ3N0X2ZsYWNfZGVjX3NpbmtfYWN0aXZhdGUpLAorCSAgKGdzdF9mbGFjX2RlY19zaW5rX2FjdGl2YXRlX3B1c2gpLAorCSAgKGdzdF9mbGFjX2RlY19zaW5rX2FjdGl2YXRlX3B1bGwpLCAoZ3N0X2ZsYWNfZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuaDoKKwkgIFN1cHBvcnQgY2hhaW4tYmFzZWQgb3BlcmF0aW9uLCBzaG91bGQgbWFrZSBmbGFjLW92ZXItREFBUAorCSAgd29yayAoIzM0MDQ5MikuCisKKzIwMDYtMDYtMjAgMTU6MzU6MDUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OiBEb2MgdXBkYXRlcywgbWVyZ2Ugc29tZSB1bnVzZWQgc3ltYm9scy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgIERvYyB1cGRhdGVzLCBtZXJnZSBzb21lIHVudXNlZCBzeW1ib2xzLgorCisyMDA2LTA2LTIwIDE0OjU3OjA5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBBZGRlZCBkb2N1bWVudGF0aW9uIGZvciB0aGUgcnRzcCBwbHVnaW4uIEZpeGVzICMzNDUzOTMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOiAoZ3N0X3J0cGRlY19jbGFzc19pbml0KToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBBZGRlZCBkb2N1bWVudGF0aW9uIGZvciB0aGUgcnRzcCBwbHVnaW4uIEZpeGVzICMzNDUzOTMuCisKKzIwMDYtMDYtMjAgMTI6MTA6MjkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IFVzZSBiZXR0ZXIgR19PU18qIG1hY3Jvcy4gRml4ZXMgIzM0NTMwMSBzb21lIG1vcmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKGluZXRfYXRvbiksIChydHNwX2Nvbm5lY3Rpb25fc2VuZCksCisJICAocnRzcF9jb25uZWN0aW9uX2Nsb3NlKSwgKHJ0c3BfY29ubmVjdGlvbl9mcmVlKToKKwkgIFVzZSBiZXR0ZXIgR19PU18qIG1hY3Jvcy4gRml4ZXMgIzM0NTMwMSBzb21lIG1vcmUuCisKKzIwMDYtMDYtMjAgMTA6MzU6NDggKzAwMDAgIEJyaWFuIENhbWVyb24gPGJyaWFuLmNhbWVyb25Ac3VuLmNvbT4KKworCSAgc3lzL3N1bmF1ZGlvLzogQWRkIGEgU3VuQXVkaW8gc291cmNlIHBsdWdpbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEJyaWFuIENhbWVyb24gPGJyaWFuIGRvdCBjYW1lcm9uIGF0IHN1biBkb3QgY29tPgorCSAgKiBzeXMvc3VuYXVkaW8vTWFrZWZpbGUuYW06CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpby5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuYzoKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl9jdHJsX2J1aWxkX2xpc3QpLCAoZ3N0X3N1bmF1ZGlvbWl4ZXJfY3RybF9uZXcpLAorCSAgKGdzdF9zdW5hdWRpb21peGVyX2N0cmxfbGlzdF90cmFja3MpLAorCSAgKGdzdF9zdW5hdWRpb21peGVyX2N0cmxfZ2V0X3ZvbHVtZSksCisJICAoZ3N0X3N1bmF1ZGlvbWl4ZXJfY3RybF9zZXRfdm9sdW1lKSwKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl9jdHJsX3NldF9tdXRlKSwKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl9jdHJsX3NldF9yZWNvcmQpOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuaDoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJ0cmFjay5jOgorCSAgKGdzdF9zdW5hdWRpb21peGVyX3RyYWNrX2luaXQpLCAoZ3N0X3N1bmF1ZGlvbWl4ZXJfdHJhY2tfbmV3KToKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJ0cmFjay5oOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuYzogKGdzdF9zdW5hdWRpb3NyY19kaXNwb3NlKSwKKwkgIChnc3Rfc3VuYXVkaW9zcmNfYmFzZV9pbml0KSwgKGdzdF9zdW5hdWRpb3NyY19jbGFzc19pbml0KSwKKwkgIChnc3Rfc3VuYXVkaW9zcmNfaW5pdCksIChnc3Rfc3VuYXVkaW9zcmNfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfc3VuYXVkaW9zcmNfZ2V0X3Byb3BlcnR5KSwgKGdzdF9zdW5hdWRpb3NyY19nZXRjYXBzKSwKKwkgIChnc3Rfc3VuYXVkaW9zcmNfb3BlbiksIChnc3Rfc3VuYXVkaW9zcmNfY2xvc2UpLAorCSAgKGdzdF9zdW5hdWRpb3NyY19wcmVwYXJlKSwgKGdzdF9zdW5hdWRpb3NyY191bnByZXBhcmUpLAorCSAgKGdzdF9zdW5hdWRpb3NyY19yZWFkKSwgKGdzdF9zdW5hdWRpb3NyY19kZWxheSksCisJICAoZ3N0X3N1bmF1ZGlvc3JjX3Jlc2V0KToKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc3JjLmg6CisJICBBZGQgYSBTdW5BdWRpbyBzb3VyY2UgcGx1Z2luLgorCSAgU3VwcG9ydCBzdGVyZW8gYW5kIHJpZ2h0L2xlZnQgY2hhbm5lbCBnYWluIGluIHRoZSBtaXhlciBwbHVnaW4uCisJICBTdXBwb3J0IHRoZSBSRUNPUkQgZmxhZyBzbyB0aGF0IHlvdSBjYW4gc3dpdGNoIGJldHdlZW4gbGluZS1pbnB1dCBhbmQKKwkgIG1pY3JvcGhvbmUgaW4gZ25vbWUtdm9sdW1lLWNvbnRyb2wuCisJICBDb2RlIGNsZWFudXBzIGxpa2UgdXNpbmcgYW4gZW51bWVyYXRvciBmb3IgdHJhY2sgbnVtYmVyIGluc3RlYWQgb2YgYW4KKwkgIGludGVnZXIuIEZpeGVzICMzNDQ5MjMuCisKKzIwMDYtMDYtMjAgMTA6MzE6NDEgKzAwMDAgIEpvbmkgVmFsdGFuZW4gPGpvbmkudmFsdGFuZW5AbW92aWFsLmZpPgorCisJICBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOiBNYWtlIFJUU1AgcGx1Z2luIGNvbXBpbGUgb24gd2luZG93cy4gRml4ZXMgIzM0NTMwMS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEpvbmkgVmFsdGFuZW4gPGpvbmkgZG90IHZhbHRhbmVuIGF0IG1vdmlhbCBkb3QgZmk+CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChpbmV0X2F0b24pLCAocnRzcF9jb25uZWN0aW9uX3NlbmQpLAorCSAgKHJ0c3BfY29ubmVjdGlvbl9jbG9zZSk6CisJICBNYWtlIFJUU1AgcGx1Z2luIGNvbXBpbGUgb24gd2luZG93cy4gRml4ZXMgIzM0NTMwMS4KKwkgIFNvbWUgY2hhbmdlcyB0byBvcmlnaW5hbCBwYXRjaCB0byBjYXRjaCBlcnJvcnMgYmV0dGVyLgorCSAgdXNlIGlmZGVmIFdJTjMyIGluc3RlYWQgb2YgaWZuZGVmLgorCisyMDA2LTA2LTE5IDEwOjAwOjE4ICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBjb25maWd1cmUuYWM6IElmIHdlIGhhdmUgbGlicmF3MTM5NCA+PSAxLjIuMSwgdGhlbiB3ZSBuZWVkIGxpYmllYzYxODgzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA2LTE5ICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIElmIHdlIGhhdmUgbGlicmF3MTM5NCA+PSAxLjIuMSwgdGhlbiB3ZSBuZWVkIGxpYmllYzYxODgzLgorCisyMDA2LTA2LTE4IDE0OjAwOjE5ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBleHQvanBlZy9nc3RqcGVnZGVjLmM6IEFmdGVyIGEgZmFpbGVkIGJ1ZmZlciBhbGxvYywgd2UgbmVlZCB0byBhYm9ydCB0aGUganBlZyBkZWNvZGluZyAoaXQgc3RhcnRlZCB3aGVuIHBhcnNpbmcgaGVhZGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6IChnc3RfanBlZ19kZWNfY2hhaW4pOgorCSAgQWZ0ZXIgYSBmYWlsZWQgYnVmZmVyIGFsbG9jLCB3ZSBuZWVkIHRvIGFib3J0IHRoZSBqcGVnIGRlY29kaW5nIChpdAorCSAgc3RhcnRlZCB3aGVuIHBhcnNpbmcgaGVhZGVycyB0byBmaWd1cmUgb3V0IGhvdyBtYW55IGJ5dGVzIHdlIG5lZWQKKwkgIHRvIHJlcXVlc3QgZG93bnN0cmVhbSkuCisKKzIwMDYtMDYtMTggMTI6Mzc6MTIgKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hbmF1d0Bza3luZXQuYmU+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVhZCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZSAoIzM0NTIzMikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBNYXJrIE5hdXdlbGFlcnRzICA8bWFuYXV3IGF0IHNreW5ldCBiZT4KKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcGVyZm9ybV9zZWVrKToKKwkgIE1ha2Ugc3VyZSB3ZSBkb24ndCByZWFkIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlICgjMzQ1MjMyKS4KKworMjAwNi0wNi0xNyAxNDozNTozNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBGaXggLS1kaXNhYmxlLWV4dGVybmFsIChjYW4ndCBzZXQgY29uZGl0aW9uYWxzIGNvbmRpdGlvbmFsbHksICMzNDM2MDIpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEZpeCAtLWRpc2FibGUtZXh0ZXJuYWwgKGNhbid0IHNldCBjb25kaXRpb25hbHMgY29uZGl0aW9uYWxseSwKKwkgICMzNDM2MDIpLgorCisyMDA2LTA2LTE2IDEyOjM1OjA4ICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBnc3Qvc3BlY3RydW0vTWFrZWZpbGUuYW06IEZpeCBidWlsZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wNi0xNiAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCSAgKiBnc3Qvc3BlY3RydW0vTWFrZWZpbGUuYW06CisJICBGaXggYnVpbGQuCisKKzIwMDYtMDYtMTYgMTA6NTY6MjQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIFVzZSBHU1RfUExVR0lOX0RPQ1MsIC0tZW5hYmxlLXBsdWdpbi1kb2NzIGV0Yy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBhdXRvZ2VuLnNoOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGRvY3MvTWFrZWZpbGUuYW06CisJICBVc2UgR1NUX1BMVUdJTl9ET0NTLCAtLWVuYWJsZS1wbHVnaW4tZG9jcyBldGMuCisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSAgQWRkL2ZpeCBhcGV2Mm11eCBkb2NzLgorCisyMDA2LTA2LTE2IDA5OjQ5OjA3ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9zcGVjdHJ1bS86IHBvcnQgdG8gdXNlIG1lc3NhZ2UgdG8gZ2V0IHJlc3VsdHMsIGNsZWFubHkgZXhpdCB3aGVuIGNsb3NpbmcgdGhlIHdpbmRvdworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOiAob25fd2luZG93X2Rlc3Ryb3kpLAorCSAgKGRyYXdfc3BlY3RydW0pLCAobWVzc2FnZV9oYW5kbGVyKSwgKG1haW4pOgorCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1vc3NzcmMuYzogKG9uX3dpbmRvd19kZXN0cm95KSwgKGRyYXdfc3BlY3RydW0pLAorCSAgKG1lc3NhZ2VfaGFuZGxlciksIChtYWluKToKKwkgIHBvcnQgdG8gdXNlIG1lc3NhZ2UgdG8gZ2V0IHJlc3VsdHMsIGNsZWFubHkgZXhpdCB3aGVuIGNsb3NpbmcgdGhlIHdpbmRvdworCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogKGdzdF9zcGVjdHJ1bV9jbGFzc19pbml0KSwKKwkgIChnc3Rfc3BlY3RydW1faW5pdCksIChnc3Rfc3BlY3RydW1fZGlzcG9zZSksCisJICAoZ3N0X3NwZWN0cnVtX3NldF9wcm9wZXJ0eSksIChnc3Rfc3BlY3RydW1fZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfc3BlY3RydW1fc2V0X2NhcHMpLCAoZ3N0X3NwZWN0cnVtX3N0YXJ0KSwKKwkgIChnc3Rfc3BlY3RydW1fbWVzc2FnZV9uZXcpLCAoZ3N0X3NwZWN0cnVtX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5oOgorCSAgcG9ydCB0byBkZXJpdmUgZnJvbSBiYXNldHJhbnNmb3JtIGFuZCBzZW5kIHJlc3VsdHMgdmlhIG1lc3NhZ2VzCisJICAobGlrZSBsZXZlbCBlbGVtZW50KQorCisyMDA2LTA2LTE1IDE1OjU4OjA5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IENvbWJpbmUgcmV0dXJuIHZhbHVlcyBmcm9tIHNyYyBwYWQgcHVzaGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X3BlcmZvcm1fc2VlayksCisJICAoZ3N0X3F0ZGVtdXhfY29tYmluZV9mbG93cyksIChnc3RfcXRkZW11eF9sb29wX3N0YXRlX21vdmllKSwKKwkgIChnc3RfcXRkZW11eF9sb29wKSwgKGdzdF9xdGRlbXV4X2NoYWluKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBDb21iaW5lIHJldHVybiB2YWx1ZXMgZnJvbSBzcmMgcGFkIHB1c2hlcy4KKworMjAwNi0wNi0xNSAwODo1MDowOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBEb24ndCBjcmFzaCBvbiBmaWxlcyB3aXRoIDAgc2FtcGxlcywgRU9TIGltbWVkaWF0bHkgaW5zdGVhZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX3N0YXRlX2hlYWRlciksCisJICAoZ3N0X3F0ZGVtdXhfcHJlcGFyZV9jdXJyZW50X3NhbXBsZSksIChnc3RfcXRkZW11eF9hZHZhbmNlX3NhbXBsZSksCisJICAoZ3N0X3F0ZGVtdXhfYWRkX3N0cmVhbSk6CisJICBEb24ndCBjcmFzaCBvbiBmaWxlcyB3aXRoIDAgc2FtcGxlcywgRU9TIGltbWVkaWF0bHkgaW5zdGVhZC4KKwkgIEZpeGVzICMzNDQ5NDQuCisKKzIwMDYtMDYtMTQgMTU6NTk6NTYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9kdi9nc3RkdmRlYy5jOiBSZXNldCBzZWdtZW50IGluZm8gb24gZmx1c2guCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVjLmM6IChnc3RfZHZkZWNfY2xhc3NfaW5pdCksIChnc3RfZHZkZWNfaW5pdCksCisJICAoZ3N0X2R2ZGVjX2ZpbmFsaXplKSwgKGdzdF9kdmRlY19zaW5rX2V2ZW50KSwKKwkgIChnc3RfZHZkZWNfY2hhbmdlX3N0YXRlKToKKwkgIFJlc2V0IHNlZ21lbnQgaW5mbyBvbiBmbHVzaC4KKwkgIEFsbG9jIHNlZ21lbnQgaW4gX2luaXQsIGZyZWUgaW4gX2ZpbmFsaXplLgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5jOiAoZ3N0X2R2ZGVtdXhfaGFuZGxlX3B1bGxfc2Vlayk6CisJICBEb24ndCBzZW5kIHNlZ21lbnRzIHR3aWNlLgorCisyMDA2LTA2LTE0IDE1OjA3OjIyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvZHYvZ3N0ZHZkZW11eC5jOiBSZXNwZWN0IHNlZ21lbnQuc3RvcC4gRml4ZXMgIzM0MjU5Mi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5jOiAoZ3N0X2R2ZGVtdXhfZGVtdXhfZnJhbWUpOgorCSAgUmVzcGVjdCBzZWdtZW50LnN0b3AuIEZpeGVzICMzNDI1OTIuCisKKzIwMDYtMDYtMTQgMTE6Mjg6NDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiBObyBsYW5ndWFnZSBzcGVjaWZpZWQgbWVhbnMgdGhlIGltcGxpZWQgbGFuZ3VhZ2UgaXMgRW5nbGlzaCBhY2NvcmRpbmcgdG8gdGhlIG1hdHJvc2thIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X2FkZF9zdHJlYW0pOgorCSAgTm8gbGFuZ3VhZ2Ugc3BlY2lmaWVkIG1lYW5zIHRoZSBpbXBsaWVkIGxhbmd1YWdlIGlzIEVuZ2xpc2gKKwkgIGFjY29yZGluZyB0byB0aGUgbWF0cm9za2Egc3BlYyAocGFydGlhbGx5IGZpeGVzICMzNDQ3MDgpOworCSAgYWRkIHNvbWUgbW9yZSBkZWJ1ZyBvdXRwdXQuCisKKzIwMDYtMDYtMTQgMDk6MzI6MjcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy4qOiBVc2UgYml0cmF0ZSBwcm9wZXJ0eSBzb2xlbHkgZm9yIGJpdHJhdGVzIGFuZCBhZGQgbmV3IGJpdHMtcGVyLXNhbXBsZSBwcm9wZXJ0eSBmb3IgdGhlIG90Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlICA8c2xvbW8gYXQgY2lyY3VsYXItY2hhb3Mgb3JnPgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfYmFzZV9pbml0KSwKKwkgIChnc3Rfd2F2cGFja19lbmNfY2xhc3NfaW5pdCksIChnc3Rfd2F2cGFja19lbmNfc2V0X3dwX2NvbmZpZyksCisJICAoZ3N0X3dhdnBhY2tfZW5jX2NoYWluKSwgKGdzdF93YXZwYWNrX2VuY19zaW5rX2V2ZW50KSwKKwkgIChnc3Rfd2F2cGFja19lbmNfc2V0X3Byb3BlcnR5KSwgKGdzdF93YXZwYWNrX2VuY19nZXRfcHJvcGVydHkpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmg6CisJICBVc2UgYml0cmF0ZSBwcm9wZXJ0eSBzb2xlbHkgZm9yIGJpdHJhdGVzIGFuZCBhZGQgbmV3CisJICBiaXRzLXBlci1zYW1wbGUgcHJvcGVydHkgZm9yIHRoZSBvdGhlciBzdHVmZi4gU2V0IGR1cmF0aW9uCisJICB0byAndW5rbm93bicgaW4gaW5pdGlhbCBoZWFkZXIgYW5kIHJlc2VuZCBoZWFkZXIgd2l0aCBwcm9wZXIKKwkgIGR1cmF0aW9uIG9uIEVPUzsgdXBkYXRlIFNlYmFzdGlhbidzIGUtbWFpbCBhZGRyZXNzLgorCisyMDA2LTA2LTE0IDA4OjA2OjQzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogV2hlbiBvcGVyYXRpbmcgY2hhaW4tYmFzZWQsIGRvbid0IG1ha2UgYW55IGFzc3VtcHRpb25zIGFib3V0IHRoZSBjaHVua2luZyBvZiB0aGUgaW5jb21pbmcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9wZWVrX2NodW5rX2luZm8pLAorCSAgKGdzdF93YXZwYXJzZV9wZWVrX2NodW5rKSwgKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksCisJICAoZ3N0X3dhdnBhcnNlX2NoYWluKToKKwkgIFdoZW4gb3BlcmF0aW5nIGNoYWluLWJhc2VkLCBkb24ndCBtYWtlIGFueSBhc3N1bXB0aW9ucyBhYm91dCB0aGUKKwkgIGNodW5raW5nIG9mIHRoZSBpbmNvbWluZyBkYXRhIGFuZCBtYWtlIHN0cmVhbWluZyB3b3JrIG9uIGRheXMgb3RoZXIKKwkgIHRoYW4gdGhlIHNlY29uZCBUaHVyc2RheSBhZnRlciBhIGZ1bGwgbW9vbi4gQWxzbyBmaXggdXAgZGVidWcKKwkgIG1lc3NhZ2VzIGhlcmUgYW5kIHRoZXJlIGFuZCBtYWtlIHVzZSBvZiB0aGUgbW9zdCBleGNlbGxlbnQgbmV3CisJICBnc3RfcGFkX3F1ZXJ5X3BlZXJfZHVyYXRpb24oKSB1dGlsaXR5IGZ1bmN0aW9uLgorCSAgU2tpcCBhbnkgJ2JleHQnIGNodW5rcyBpbiBmcm9udCBvZiB0aGUgJ2ZtdCAnIGNodW5rLiBGaXhlcyAjMzQzODM3LgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuaDoKKwkgIFJlbW92ZSB0cmFpbGluZyBjb21tYSBhZnRlciBsYXN0IGVudW0gdmFsdWUsIHNvbWUgY29tcGlsZXJzIGRvbid0CisJICBsaWtlIHRoYXQuCisKKzIwMDYtMDYtMTMgMTc6MDU6MjUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBIYW5kbGUgcHJlbWF0dXJlIEVPUyBncmFjZWZ1bGx5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhKToKKwkgIEhhbmRsZSBwcmVtYXR1cmUgRU9TIGdyYWNlZnVsbHkuCisKKzIwMDYtMDYtMTMgMDk6NTQ6MjYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogUHJldmVudCBvdXQgb2YgYm91bmRzIGFycmF5IGFjY2VzcyB3aGVuIHNjcnViYmluZyB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIGZpbGUgYmV0d2VlbiB0aGUgbGFzdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspOgorCSAgUHJldmVudCBvdXQgb2YgYm91bmRzIGFycmF5IGFjY2VzcyB3aGVuIHNjcnViYmluZyB0b3dhcmRzCisJICB0aGUgZW5kIG9mIHRoZSBmaWxlIGJldHdlZW4gdGhlIGxhc3QgaW5kZXggZW50cnkgYW5kIHRoZQorCSAgZW5kLiBGaXhlcyBvY2Nhc2lvbmFsICdzdGFydCA8PSBzdG9wJyBuZXdzZWdtZW50IGV2ZW50CisJICBhc3NlcnRpb25zIHdoZW4gc2NydWJiaW5nIGluIE1KUEVHIGZpbGVzLgorCisyMDA2LTA2LTEyIDExOjEzOjM5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOiBBbmQgYW5vdGhlciBvbmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgIEFuZCBhbm90aGVyIG9uZS4KKworMjAwNi0wNi0xMiAxMTowNDo1OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3NwZWN0cnVtLy5jdnNpZ25vcmU6IElnbm9yZSBtb3JlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS8uY3ZzaWdub3JlOgorCSAgSWdub3JlIG1vcmUuCisKKzIwMDYtMDYtMTIgMTA6NTM6MjYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9saWJtbXMvZ3N0bW1zLmM6IFNldCBjYXBzIG9uIG91dGdvaW5nIGJ1ZmZlcnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2xpYm1tcy9nc3RtbXMuYzogKGdzdF9tbXNfY3JlYXRlKToKKwkgIFNldCBjYXBzIG9uIG91dGdvaW5nIGJ1ZmZlcnMuCisJICAqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6IChnc3RfZGlyZWN0ZHJhd3NpbmtfaW5pdCk6CisJICBDb21tZW50IG91dCB1bnVzZWQgZ2xvYmFsIGluc3RhbmNlIHZhcmlhYmxlLgorCisyMDA2LTA2LTExIDE5OjMxOjEwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogRXh0cmFjdCBpbWFnZXMgZnJvbSBJRDN2MiB0YWdzIChBUElDIGZyYW1lcykuIEZpeGVzICMzMzk3MDQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IChpZDNkZW11eF9pZDN2Ml9wYXJzZV9mcmFtZSksCisJICAoc2Nhbl9lbmNvZGVkX3N0cmluZyksIChwYXJzZV9waWN0dXJlX2ZyYW1lKToKKwkgIEV4dHJhY3QgaW1hZ2VzIGZyb20gSUQzdjIgdGFncyAoQVBJQyBmcmFtZXMpLiBGaXhlcyAjMzM5NzA0LgorCSAgKiBjb25maWd1cmUuYWM6CisJICBSZXF1aXJlIGNvcmUgPj0gMC4xMC44IChmb3IgR1NUX1RBR19JTUFHRSBhbmQKKwkgIEdTVF9UQUdfUFBFVklFV19JTUFHRSB1c2VkIGluIHRoZSBwYXRjaCBhYm92ZSkuCisKKzIwMDYtMDYtMTEgMTg6NTY6MjQgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBleHQvcmF3MTM5NC8uZ2l0aWdub3JlOgorCSogZXh0L3RhZ2xpYi8uZ2l0aWdub3JlOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkqIHRlc3RzL2V4YW1wbGVzL2xldmVsLy5naXRpZ25vcmU6CisJICBtb2FwIGlnbm9yZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBtb2FwIGlnbm9yZQorCisyMDA2LTA2LTExIDE4OjUyOjE5ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IGdyYXR1aXRvdXMgY29tbWVudCBjaGFuZ2VzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IChnc3RfZHYxMzk0c3JjX2Rpc2NvdmVyX2F2Y19ub2RlKToKKwkgIGdyYXR1aXRvdXMgY29tbWVudCBjaGFuZ2VzCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICBmaXggbGV2ZWwgdGVzdCBsZWFrcworCisyMDA2LTA2LTExIDE4OjQ0OjU0ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogLmdpdGlnbm9yZToKKwkgIGlnbm9yZSBtb3JlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGlnbm9yZSBtb3JlCisKKzIwMDYtMDYtMTEgMTg6MjA6MzkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC86IFVzZSBnc3RfcGFkX3F1ZXJ5X3BlZXJfZHVyYXRpb24oKSB1dGlsaXR5IGZ1bmN0aW9uIGhlcmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FwZXRhZy9nc3R0YWdkZW11eC5jOiAoZ3N0X3RhZ19kZW11eF9nZXRfdXBzdHJlYW1fc2l6ZSk6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAoaWQzZGVtdXhfZ2V0X3Vwc3RyZWFtX3NpemUpOgorCSAgVXNlIGdzdF9wYWRfcXVlcnlfcGVlcl9kdXJhdGlvbigpIHV0aWxpdHkgZnVuY3Rpb24gaGVyZS4KKworMjAwNi0wNi0xMSAxMzo1NzoxOSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGF1dG9nZW4uc2g6IHJlcXVpcmUgYW0xNworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGF1dG9nZW4uc2g6CisJICByZXF1aXJlIGFtMTcKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBleHQvYW5ub2RleC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2NkaW8vTWFrZWZpbGUuYW06CisJICAqIGV4dC9kdi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2VzZC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2ZsYWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9nZGtfcGl4YnVmL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbGFkc3BhL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbGliY2FjYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NwZWV4L01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGFnbGliL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3NzL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvc3VuYXVkaW8vTWFrZWZpbGUuYW06CisJICAqIHN5cy94aW1hZ2UvTWFrZWZpbGUuYW06CisJICBjbGVhbiB1cCBidWlsZCBmdXJ0aGVyCisKKzIwMDYtMDYtMTEgMTM6NTU6MzQgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBjb21tb246CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICB1cGRhdGUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdXBkYXRlCisKKzIwMDYtMDYtMTAgMTU6MzM6MTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPG1haWxAc2xvbW9zbmFpbC5kZT4KKworCSAgZXh0L3dhdnBhY2svOiBBZGQgd2F2cGFjayBlbmNvZGVyIGVsZW1lbnQgKCMzNDMxMzEpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU2ViYXN0aWFuIERyw7ZnZSAgPG1haWwgYXQgc2xvbW9zbmFpbCBkZT4KKwkgICogZXh0L3dhdnBhY2svTWFrZWZpbGUuYW06CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2suYzogKHBsdWdpbl9pbml0KToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5oOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X3dhdnBhY2tfZW5jX2NvcnJlY3Rpb25fbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X3dhdnBhY2tfZW5jX2pvaW50X3N0ZXJlb19tb2RlX2dldF90eXBlKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfYmFzZV9pbml0KSwgKGdzdF93YXZwYWNrX2VuY19jbGFzc19pbml0KSwKKwkgIChnc3Rfd2F2cGFja19lbmNfaW5pdCksIChnc3Rfd2F2cGFja19lbmNfZGlzcG9zZSksCisJICAoZ3N0X3dhdnBhY2tfZW5jX3Npbmtfc2V0X2NhcHMpLCAoZ3N0X3dhdnBhY2tfZW5jX3NldF93cF9jb25maWcpLAorCSAgKGdzdF93YXZwYWNrX2VuY19mb3JtYXRfc2FtcGxlcyksIChnc3Rfd2F2cGFja19lbmNfcHVzaF9ibG9jayksCisJICAoZ3N0X3dhdnBhY2tfZW5jX2NoYWluKSwgKGdzdF93YXZwYWNrX2VuY19yZXdyaXRlX2ZpcnN0X2Jsb2NrKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfc2lua19ldmVudCksIChnc3Rfd2F2cGFja19lbmNfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfc2V0X3Byb3BlcnR5KSwgKGdzdF93YXZwYWNrX2VuY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF93YXZwYWNrX2VuY19wbHVnaW5faW5pdCk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuaDoKKwkgICogZXh0L3dhdnBhY2svbWQ1LmM6CisJICAqIGV4dC93YXZwYWNrL21kNS5oOgorCSAgQWRkIHdhdnBhY2sgZW5jb2RlciBlbGVtZW50ICgjMzQzMTMxKS4KKworMjAwNi0wNi0wOSAyMDozNjowMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ2NvbmYvTWFrZWZpbGUuYW06IEhvbm91ciAtLWRpc2FibGUtc2NoZW1hcy1pbnN0YWxsIGNvbmZpZ3VyZSBvcHRpb24uIEZpeGVzICMzNDQxMDAuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ2NvbmYvTWFrZWZpbGUuYW06CisJICBIb25vdXIgLS1kaXNhYmxlLXNjaGVtYXMtaW5zdGFsbCBjb25maWd1cmUgb3B0aW9uLiBGaXhlcyAjMzQ0MTAwLgorCisyMDA2LTA2LTA5IDE4OjMzOjAxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICB0ZXN0cy9leGFtcGxlcy9sZXZlbC9NYWtlZmlsZS5hbTogQWRkIC1sbSB0byBMSUJTIGZvciBwb3coKSBmdW5jdGlvbiwgZG9uJ3QgYXNzdW1lIG9uZSBvZiBvdXIgZGVwZW5kZW5jaWVzIChzdWNoIGFzIGwuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9sZXZlbC9NYWtlZmlsZS5hbToKKwkgIEFkZCAtbG0gdG8gTElCUyBmb3IgcG93KCkgZnVuY3Rpb24sIGRvbid0IGFzc3VtZSBvbmUgb2Ygb3VyCisJICBkZXBlbmRlbmNpZXMgKHN1Y2ggYXMgbGlieG1sLTIuMCkgZHJhZ3MgaXQgaW4gYXV0b21hdGljYWxseQorCSAgKCMzNDM2MDMpLgorCisyMDA2LTA2LTA5IDE4OjE3OjIzICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBXZSBzaG91bGQgdXNlICRTRUQgYW5kIG5vdCAkKFNFRCkgaW4gY29uZmlndXJlLmFjICgjMzQzNjc4KS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFBldGVyIEtqZWxsZXJzdGVkdCAgPHBraiBhdCBheGlzIGRvdCBjb20+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIFdlIHNob3VsZCB1c2UgJFNFRCBhbmQgbm90ICQoU0VEKSBpbiBjb25maWd1cmUuYWMgKCMzNDM2NzgpLgorCisyMDA2LTA2LTA5IDE3OjM4OjE5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IENoZWNrIGZvciBYIGJlZm9yZSB1c2luZyBYX0NGTEFHUyBpbiB0aGUgY2hlY2sgZm9yIG9wZW5nbCAoIzM0Mzg2NikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgQ2hlY2sgZm9yIFggYmVmb3JlIHVzaW5nIFhfQ0ZMQUdTIGluIHRoZSBjaGVjayBmb3Igb3BlbmdsICgjMzQzODY2KS4KKwkgICogZXh0L211c2VwYWNrL01ha2VmaWxlLmFtOgorCSAgKiBleHQvd2F2cGFjay9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NwZWVkL01ha2VmaWxlLmFtOgorCSAgQWRkIG1pc3NpbmcgR1NUX0xJQlMsIGZpeGVzIGJ1aWxkIG9uIGN5Z3dpbiAoIzM0Mzg2NikuCisKKzIwMDYtMDYtMDkgMTc6Mjk6MDggKzAwMDAgIEJyaWFuIENhbWVyb24gPGJyaWFuLmNhbWVyb25Ac3VuLmNvbT4KKworCSAgc3lzL3N1bmF1ZGlvLzogQXR0YWNoZWQgZmluZCBhIHBhdGNoIHRoYXQgZml4ZXMgYSBudW1iZXIgb2YgYnVncyB3aXRoIHRoZSBTdW5BdWRpbyBtaXhlciBwbHVnaW4gYW5kIGZpeGVzICMzNDQxMDE6IDEuLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBCcmlhbiBDYW1lcm9uIDxicmlhbiBkb3QgY2FtZXJvbiBhdCBzdW4gZG90IGNvbT4KKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6CisJICAoZ3N0X3N1bmF1ZGlvbWl4ZXJfY3RybF9vcGVuKSwgKGdzdF9zdW5hdWRpb21peGVyX2N0cmxfYnVpbGRfbGlzdCksCisJICAoZ3N0X3N1bmF1ZGlvbWl4ZXJfY3RybF9uZXcpLCAoZ3N0X3N1bmF1ZGlvbWl4ZXJfY3RybF9zZXRfdm9sdW1lKSwKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl9jdHJsX3NldF9tdXRlKToKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOiAoZ3N0X3N1bmF1ZGlvc2lua19jbGFzc19pbml0KSwKKwkgIChnc3Rfc3VuYXVkaW9zaW5rX2luaXQpLCAoZ3N0X3N1bmF1ZGlvc2lua19wcmVwYXJlKSwKKwkgIChnc3Rfc3VuYXVkaW9zaW5rX3dyaXRlKToKKwkgIEF0dGFjaGVkIGZpbmQgYSBwYXRjaCB0aGF0IGZpeGVzIGEgbnVtYmVyIG9mIGJ1Z3Mgd2l0aCB0aGUgU3VuQXVkaW8gbWl4ZXIKKwkgIHBsdWdpbiBhbmQgZml4ZXMgIzM0NDEwMToKKwkgIDEuIFRoZSBnc3Rfc3VuYXVkaW9taXhlcl9jdHJsX2J1aWxkX2xpc3Qga2VwdCBhcHBlbmRpbmcgdGhlIHNhbWUgMyB0cmFja3Mgb250bworCSAgdGhlIHRyYWNrbGlzdCBjYXVzaW5nIGdub21lLXZvbHVtZS1jb250cm9sJ3MgcHJlZmVyZW5jZXMgZGlhbG9nIHRvIGJlIG1lc3NlZAorCSAgdXAgYW5kIHdvdWxkIGNvcmUgZHVtcCBpZiB5b3UgY2hlY2tlZC91bmNoZWNrZWQgYW55IGl0ZW0uCisJICAyLiBXZSB3ZXJlbid0IHByZXZpb3VzbHkgc2V0dGluZyB0aGUgTVVURSBmbGFnIHByb3Blcmx5LiAgRml4aW5nIHRoaXMgbWFrZXMKKwkgIGdub21lLXZvbHVtZS1jb250cm9sIHdvcmsgYmV0dGVyLgorCSAgMy4gTm93IHdlIHByb3Blcmx5IGRlZmluZSB0aGUgaW5wdXQgdHJhY2sgdG8gYmUgR1NUX01JWEVSX1RSQUNLX0lOUFVUIGFuZAorCSAgdGhlIG1vbml0b3IgdG8gYmUgR1NUX01JWEVSX1RSQUNLX09VVFBVVCwgc28gdGhhdCBtYWtlcyBnbm9tZS12b2x1bWUtY29udHJvbAorCSAgbG9vayBiZXR0ZXIuCisJICBBbHNvIHNvbWUgbWlub3IgY2xlYW51cCBpbiBnc3RzdW5hdWRpb3NpbmsuYy4KKworMjAwNi0wNi0wOSAxNzoxMjo1MiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L2pwZWcvZ3N0anBlZ2RlYy4qOiBBUEk6IEFkZGVkIElEQ1QgbWV0aG9kIHByb3BlcnR5CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2lkY3RfbWV0aG9kX2dldF90eXBlKSwKKwkgIChnc3RfanBlZ19kZWNfY2xhc3NfaW5pdCksIChnc3RfanBlZ19kZWNfaW5pdCksCisJICAoZ3N0X2pwZWdfZGVjX2RlY29kZV9pbmRpcmVjdCksIChnc3RfanBlZ19kZWNfZGVjb2RlX2RpcmVjdCksCisJICAoZ3N0X2pwZWdfZGVjX2NoYWluKSwgKGdzdF9qcGVnX2RlY19zaW5rX2V2ZW50KSwKKwkgIChnc3RfanBlZ19kZWNfc2V0X3Byb3BlcnR5KSwgKGdzdF9qcGVnX2RlY19nZXRfcHJvcGVydHkpOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZGVjLmg6CisJICBBUEk6IEFkZGVkIElEQ1QgbWV0aG9kIHByb3BlcnR5CisJICBTbWFsbCBjbGVhbnVwcy4KKwkgIEF2b2lkIGR5bmFtaWMgYWxsb2NhdGlvbiBvZiB0cml2aWFsIGZpeGVkIHN0cnVjdHVyZS4KKwkgIEFsbG9jYXRlIGVub3VnaCBzcGFjZSBmb3IgdGVtcCA0OjQ6NCBZVVYgYnVmZmVycy4gRml4ZXMgIzM0MzY2MS4KKworMjAwNi0wNi0wNyAwOToyNToxNiArMDAwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSAgY29uZmlndXJlLmFjOiBXZSBub3cgcmVxdWlyZSBsaWJyYXcxMzk0ID49IDEuMS4wIGFuZCB0aGF0IHZlcnNpb24gb253YXJkcyBhbGwgaGF2ZSAucGMgZmlsZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDYtMDcgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKwkgICogY29uZmlndXJlLmFjOgorCSAgV2Ugbm93IHJlcXVpcmUgbGlicmF3MTM5NCA+PSAxLjEuMCBhbmQgdGhhdCB2ZXJzaW9uIG9ud2FyZHMgYWxsCisJICBoYXZlIC5wYyBmaWxlcy4KKworMjAwNi0wNi0wMiAxNTowMjo1NCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2xhdy9hbGF3LWRlY29kZS5jOiBUcnlpbmcgdG8gZ2V0IGl0ZW1zIGZyb20gYW4gQU5ZIG9yIEVNUFRZIGNhcHMgaXMgLi4uIHN0dXBpZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6IChhbGF3ZGVjX2dldGNhcHMpOgorCSAgVHJ5aW5nIHRvIGdldCBpdGVtcyBmcm9tIGFuIEFOWSBvciBFTVBUWSBjYXBzIGlzIC4uLiBzdHVwaWQuCisKKzIwMDYtMDYtMDIgMTE6MzM6MTggKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGV4dC9kdi9nc3RkdmRlYy4qOiBBZGRlZCBHc3RTZWdtZW50IGhhbmRsaW5nLCBub3cgaW1wbGVtZW50cyBkcm9wcGluZy9jbGlwcGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19pbml0KSwgKGdzdF9kdmRlY19zaW5rX2V2ZW50KSwKKwkgIChnc3RfZHZkZWNfY2hhaW4pLCAoZ3N0X2R2ZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9kdi9nc3RkdmRlYy5oOgorCSAgQWRkZWQgR3N0U2VnbWVudCBoYW5kbGluZywgbm93IGltcGxlbWVudHMgZHJvcHBpbmcvY2xpcHBpbmcuCisKKzIwMDYtMDYtMDEgMjI6MDA6MjYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgRml4IG1vcmUgZ29iamVjdCBtYWNyb3M6IG9iajwtPmtsYXNzLCBHc3RYWFg8LT5Hc3RYWFhDbGFzcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9hbHNhc3BkaWYvYWxzYXNwZGlmc2luay5oOgorCSAgKiBleHQvYW1yd2IvZ3N0YW1yd2JkZWMuaDoKKwkgICogZXh0L2FtcndiL2dzdGFtcndiZW5jLmg6CisJICAqIGV4dC9hbXJ3Yi9nc3RhbXJ3YnBhcnNlLmg6CisJICAqIGV4dC9hcnRzL2dzdF9hcnRzLmg6CisJICAqIGV4dC9hcnRzZC9nc3RhcnRzZHNpbmsuaDoKKwkgICogZXh0L2F1ZGlvZmlsZS9nc3RhZnBhcnNlLmg6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzaW5rLmg6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzcmMuaDoKKwkgICogZXh0L2F1ZGlvcmVzYW1wbGUvZ3N0YXVkaW9yZXNhbXBsZS5oOgorCSAgKiBleHQvYnoyL2dzdGJ6MmRlYy5oOgorCSAgKiBleHQvYnoyL2dzdGJ6MmVuYy5oOgorCSAgKiBleHQvZGlyYWMvZ3N0ZGlyYWNkZWMuaDoKKwkgICogZXh0L2RpcmVjdGZiL2RmYnZpZGVvc2luay5oOgorCSAgKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmg6CisJICAqIGV4dC9kaXZ4L2dzdGRpdnhlbmMuaDoKKwkgICogZXh0L2R0cy9nc3RkdHNkZWMuaDoKKwkgICogZXh0L2ZhYWMvZ3N0ZmFhYy5oOgorCSAgKiBleHQvZ3NtL2dzdGdzbWRlYy5oOgorCSAgKiBleHQvZ3NtL2dzdGdzbWVuYy5oOgorCSAgKiBleHQvaXZvcmJpcy92b3JiaXNlbmMuaDoKKwkgICogZXh0L2xpYmZhbWUvZ3N0bGliZmFtZS5oOgorCSAgKiBleHQvbmFzL25hc3NpbmsuaDoKKwkgICogZXh0L25lb24vZ3N0bmVvbmh0dHBzcmMuaDoKKwkgICogZXh0L3BvbHlwL3BvbHlwc2luay5oOgorCSAgKiBleHQvc2RsL3NkbGF1ZGlvc2luay5oOgorCSAgKiBleHQvc2RsL3NkbHZpZGVvc2luay5oOgorCSAgKiBleHQvc2hvdXQvZ3N0c2hvdXQuaDoKKwkgICogZXh0L3NuYXBzaG90L2dzdHNuYXBzaG90Lmg6CisJICAqIGV4dC9zbmRmaWxlL2dzdHNmLmg6CisJICAqIGV4dC9zd2ZkZWMvZ3N0c3dmZGVjLmg6CisJICAqIGV4dC90YXJraW4vZ3N0dGFya2luZGVjLmg6CisJICAqIGV4dC90YXJraW4vZ3N0dGFya2luZW5jLmg6CisJICAqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmg6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuaDoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmg6CisJICAqIGV4dC94aW5lL2dzdHhpbmUuaDoKKwkgICogZXh0L3h2aWQvZ3N0eHZpZGRlYy5oOgorCSAgKiBleHQveHZpZC9nc3R4dmlkZW5jLmg6CisJICAqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXBhcnNlLmg6CisJICAqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXN0cmlwLmg6CisJICAqIGdzdC9jb2xvcnNwYWNlL2dzdGNvbG9yc3BhY2UuaDoKKwkgICogZ3N0L2Zlc3RpdmFsL2dzdGZlc3RpdmFsLmg6CisJICAqIGdzdC9mcmVlemUvZ3N0ZnJlZXplLmg6CisJICAqIGdzdC9nZHAvZ3N0Z2RwZGVwYXkuaDoKKwkgICogZ3N0L2dkcC9nc3RnZHBwYXkuaDoKKwkgICogZ3N0L21vZHBsdWcvZ3N0bW9kcGx1Zy5oOgorCSAgKiBnc3QvbXBlZzFzeXMvZ3N0bXBlZzFzeXN0ZW1lbmNvZGUuaDoKKwkgICogZ3N0L21wZWcxdmlkZW9wYXJzZS9nc3RtcDF2aWRlb3BhcnNlLmg6CisJICAqIGdzdC9tcGVnMnN1Yi9nc3RtcGVnMnN1YnQuaDoKKwkgICogZ3N0L21wZWdhdWRpb3BhcnNlL2dzdG1wZWdhdWRpb3BhcnNlLmg6CisJICAqIGdzdC9tdWx0aWZpbGVzaW5rL2dzdG11bHRpZmlsZXNpbmsuaDoKKwkgICogZ3N0L292ZXJsYXkvZ3N0b3ZlcmxheS5oOgorCSAgKiBnc3QvcGxheW9uZGVtYW5kL2dzdHBsYXlvbmRlbWFuZC5oOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJICAqIGdzdC9ydGpwZWcvZ3N0cnRqcGVnZGVjLmg6CisJICAqIGdzdC9ydGpwZWcvZ3N0cnRqcGVnZW5jLmg6CisJICAqIGdzdC9zbW9vdGgvZ3N0c21vb3RoLmg6CisJICAqIGdzdC9zbW9vdGh3YXZlL2dzdHNtb290aHdhdmUuaDoKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJICAqIGdzdC9zcGVlZC9nc3RzcGVlZC5oOgorCSAgKiBnc3Qvc3RlcmVvL2dzdHN0ZXJlby5oOgorCSAgKiBnc3Qvc3dpdGNoL2dzdHN3aXRjaC5oOgorCSAgKiBnc3QvdHRhL2dzdHR0YWRlYy5oOgorCSAgKiBnc3QvdHRhL2dzdHR0YXBhcnNlLmg6CisJICAqIGdzdC92aWRlb2Ryb3AvZ3N0dmlkZW9kcm9wLmg6CisJICAqIGdzdC94aW5naGVhZGVyL2dzdHhpbmdtdXguaDoKKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuaDoKKwkgICogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5oOgorCSAgKiBzeXMvZHhyMy9keHIzYXVkaW9zaW5rLmg6CisJICAqIHN5cy9keHIzL2R4cjNzcHVzaW5rLmg6CisJICAqIHN5cy9keHIzL2R4cjN2aWRlb3NpbmsuaDoKKwkgICogc3lzL3FjYW0vZ3N0cWNhbXNyYy5oOgorCSAgKiBzeXMvdmNkL3ZjZHNyYy5oOgorCSAgRml4IG1vcmUgZ29iamVjdCBtYWNyb3M6IG9iajwtPmtsYXNzLCBHc3RYWFg8LT5Hc3RYWFhDbGFzcworCisyMDA2LTA2LTAxIDIxOjA3OjI2ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIEZpeCBtb3JlIGdvYmplY3QgbWFjcm9zOiBvYmo8LT5rbGFzcywgR3N0WFhYPC0+R3N0WFhYQ2xhc3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmg6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuaDoKKwkgICogZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5Lmg6CisJICAqIGV4dC9kdi9nc3RkdmRlYy5oOgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5oOgorCSAgKiBleHQvZXNkL2VzZG1vbi5oOgorCSAgKiBleHQvZXNkL2VzZHNpbmsuaDoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5oOgorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NpbmsuaDoKKwkgICogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuaDoKKwkgICogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zaW5rLmg6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc3JjLmg6CisJICAqIGV4dC9nZGtfcGl4YnVmL2dzdGdka2FuaW1hdGlvbi5oOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5oOgorCSAgKiBleHQvaGFsL2dzdGhhbGF1ZGlvc2luay5oOgorCSAgKiBleHQvaGFsL2dzdGhhbGF1ZGlvc3JjLmg6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdlbmMuaDoKKwkgICogZXh0L2pwZWcvZ3N0c21va2VkZWMuaDoKKwkgICogZXh0L2pwZWcvZ3N0c21va2VlbmMuaDoKKwkgICogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuaDoKKwkgICogZXh0L2xpYm1uZy9nc3RtbmdkZWMuaDoKKwkgICogZXh0L2xpYm1uZy9nc3RtbmdlbmMuaDoKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuaDoKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdlbmMuaDoKKwkgICogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmg6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5oOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmg6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuaDoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5oOgorCSAgKiBnc3QvZGVidWcvZWZlbmNlLmg6CisJICAqIGdzdC9kZWJ1Zy9nc3RuYXZpZ2F0aW9udGVzdC5oOgorCSAgKiBnc3QvZGVidWcvZ3N0bmF2c2Vlay5oOgorCSAgKiBnc3QvZmx4L2dzdGZseGRlYy5oOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmg6CisJICAqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5oOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguaDoKKwkgICogZ3N0L2xhdy9hbGF3LWRlY29kZS5oOgorCSAgKiBnc3QvbGF3L2FsYXctZW5jb2RlLmg6CisJICAqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmg6CisJICAqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmg6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkgICogZ3N0L21lZGlhbi9nc3RtZWRpYW4uaDoKKwkgICogZ3N0L29sZGNvcmUvZ3N0YWdncmVnYXRvci5oOgorCSAgKiBnc3Qvb2xkY29yZS9nc3RmZHNpbmsuaDoKKwkgICogZ3N0L29sZGNvcmUvZ3N0bWQ1c2luay5oOgorCSAgKiBnc3Qvb2xkY29yZS9nc3RtdWx0aWZpbGVzcmMuaDoKKwkgICogZ3N0L29sZGNvcmUvZ3N0cGlwZWZpbHRlci5oOgorCSAgKiBnc3Qvb2xkY29yZS9nc3RzaGFwZXIuaDoKKwkgICogZ3N0L29sZGNvcmUvZ3N0c3RhdGlzdGljcy5oOgorCSAgKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2cGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBwY21hcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5oOgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuaDoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgKiBnc3Qvc21wdGUvZ3N0c21wdGUuaDoKKwkgICogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmg6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJICAqIGdzdC91ZHAvZ3N0dWRwc2luay5oOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmg6CisJICAqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuaDoKKwkgICogc3lzL29zcy9nc3Rvc3NkbWFidWZmZXIuaDoKKwkgICogc3lzL29zcy9nc3Rvc3NtaXhlcmVsZW1lbnQuaDoKKwkgICogc3lzL29zcy9nc3Rvc3NzaW5rLmg6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc3JjLmg6CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXIuaDoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5oOgorCSAgKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5oOgorCSAgRml4IG1vcmUgZ29iamVjdCBtYWNyb3M6IG9iajwtPmtsYXNzLCBHc3RYWFg8LT5Hc3RYWFhDbGFzcworCisyMDA2LTA1LTMxIDE2OjIzOjU0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvZ29vbS9nc3Rnb29tLio6IEhhbmRsZSBRb1MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vZ3N0Z29vbS5jOiAoZ3N0X2dvb21fY2xhc3NfaW5pdCksIChnc3RfZ29vbV9pbml0KSwKKwkgIChnc3RfZ29vbV9maW5hbGl6ZSksIChnc3RfZ29vbV9yZXNldCksIChnc3RfZ29vbV9zaW5rX3NldGNhcHMpLAorCSAgKGdzdF9nb29tX3NyY19zZXRjYXBzKSwgKGdzdF9nb29tX3NyY19ldmVudCksCisJICAoZ3N0X2dvb21fc2lua19ldmVudCksIChnZXRfYnVmZmVyKSwgKGdzdF9nb29tX2NoYWluKSwKKwkgIChnc3RfZ29vbV9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmg6CisJICBIYW5kbGUgUW9TLgorCSAgSGFuZGxlIGZsdXNoaW5nLCBkaXNjb250IGFuZCBldmVudHMuCisJICBGaXggdGltZXN0YW1wcyBhbmQgdmFyaW91cyBvdGhlciBjbGVhbnVwcy4KKworMjAwNi0wNS0zMSAxNTozNzoxNiArMDAwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSAgZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IEZpeCBidXMgcmVzZXQgd2hlbiB1c2luZyBsaWJpZWM2MTg4MworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA1LTMxICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisJICAqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOiAoZ3N0X2R2MTM5NHNyY19idXNfcmVzZXQpOgorCSAgRml4IGJ1cyByZXNldCB3aGVuIHVzaW5nIGxpYmllYzYxODgzCisKKzIwMDYtMDUtMzEgMTA6MzE6MjMgKzAwMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkgIGNvbmZpZ3VyZS5hYzogRGV0ZWN0IGxpYmllYzYxODgzIGFuZCBzZXQgbmVjZXNzYXJ5IENGTEFHUyBhbmQgTElCUyBmb3IgZHYxMzk0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA1LTMxICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIERldGVjdCBsaWJpZWM2MTg4MyBhbmQgc2V0IG5lY2Vzc2FyeSBDRkxBR1MgYW5kIExJQlMgZm9yIGR2MTM5NC4KKwkgICogZXh0L3JhdzEzOTQvTWFrZWZpbGUuYW06CisJICBBZGQgQ0ZMQUdTLgorCSAgKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzogKGdzdF9kdjEzOTRzcmNfaWVjNjE4ODNfcmVjZWl2ZSksCisJICBOZXcgbWV0aG9kLCB0byByZWNlaXZlIHVzaW5nIGxpYmllYzYxODgzLgorCSAgKGdzdF9kdjEzOTRzcmNfaXNvX3JlY2VpdmUpLAorCSAgI2lmZGVmJ2Qgb3V0IGlmIGxpYmllYzYxODgzIGlzIHByZXNlbnQuCisJICAoZ3N0X2R2MTM5NHNyY19idXNfcmVzZXQpLAorCSAgR2V0IHVzZXJkYXRhIGNvcnJlY3RseSBpZiB1c2luZyBsaWJpZWM2MTg4My4KKwkgIChnc3RfZHYxMzk0c3JjX2NyZWF0ZSksCisJICBXaGVuIHVzaW5nIGxpYmllYzYxODgzLCBvbmx5IHBvbGwgb25lIGZkIGFuZCBubyBuZWVkIHRvIHJlYWQuCisJICAoZ3N0X2R2MTM5NHNyY19kaXNjb3Zlcl9hdmNfbm9kZSksCisJICBSZXBsYWNlIGdfd2FybmluZ3MuCisJICAoZ3N0X2R2MTM5NHNyY19zdGFydCksCisJICBDcmVhdGUgbmV3IGhhbmRsZSB3aGVuIHdlIGtub3cgd2hpY2ggZHYgcG9ydC4gIE1vcmUgcmVsaWFibGUKKwkgIHRoYW4gc2V0dGluZyBwb3J0IG9uIGFuIGV4aXN0aW5nIGhhbmRsZS4gIEluaXRpYWxpc2UgbGliaWVjNjE4ODMuCisJICAoZ3N0X2R2MTM5NHNyY19zdG9wKToKKwkgIElmIHVzaW5nIGxpYmllYzYxODgzLCB0aGVuIGNsZWFudXAgaXRzIGhhbmRsZSBwcm9wZXJseS4KKwkgICogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmg6CisJICBBZGQgbGliaWVjNjE4ODMgaGFuZGxlLgorCisyMDA2LTA1LTMwIDIxOjA3OjM4ICswMDAwICBTw6liYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogYWRkIGFuIGV4cGxpY2l0IGRsbCBpbXBvcnRlZCBkZWNsYXJhdGlvbiBmb3IgR1NUX0NBVF9FVkVOVCtXSU4zMgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGFkZCBhbiBleHBsaWNpdCBkbGwgaW1wb3J0ZWQgZGVjbGFyYXRpb24gZm9yIEdTVF9DQVRfRVZFTlQrV0lOMzIKKwkgICogd2luMzIvTUFOSUZFU1Q6CisJICBzb3J0IGZpbGUgbGlzdGluZworCSAgKiB3aW4zMi92czYvbGliZ3N0YXZpLmRzcDoKKwkgIGFkZCBnc3RhdmltdXguYyB0byB0aGUgcHJvamVjdAorCSAgKiB3aW4zMi92czYvbGliZ3N0aWQzZGVtdXguZHNwOgorCSAgYWRkIGxpbmsgdG8gemxpYiBsaWJyYXJ5CisJICAqIHdpbjMyL3ZzNi9saWJnc3RtYXRyb3NrYS5kc3A6CisJICBhZGQgbWF0cm9za2EtaWRzLmMgdG8gdGhlIHByb2plY3QKKworMjAwNi0wNS0zMCAxNDozNToxOCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8bWFpbEBzbG9tb3NuYWlsLmRlPgorCisJICBBZGQgYXBldjJtdXggZWxlbWVudCAoIzM0MzEyMikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlICA8bWFpbCBhdCBzbG9tb3NuYWlsIGRlID4KKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBleHQvdGFnbGliL01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGFnbGliL2dzdGFwZXYybXV4LmNjOgorCSAgKiBleHQvdGFnbGliL2dzdGFwZXYybXV4Lmg6CisJICAqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJICAqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4LmM6IChwbHVnaW5faW5pdCk6CisJICAqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4Lmg6CisJICBBZGQgYXBldjJtdXggZWxlbWVudCAoIzM0MzEyMikuCisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hcGV2Mm11eC5jOgorCSAgKHRlc3RfdGFnbGliX2FwZXYybXV4X2NyZWF0ZV90YWdzKSwKKwkgICh0ZXN0X3RhZ2xpYl9hcGV2Mm11eF9jaGVja190YWdzKSwgKGZpbGxfbXAzX2J1ZmZlciksIChnb3RfYnVmZmVyKSwKKwkgIChkZW11eF9wYWRfYWRkZWQpLCAodGVzdF90YWdsaWJfYXBldjJtdXhfY2hlY2tfb3V0cHV0X2J1ZmZlciksCisJICAodGVzdF90YWdsaWJfYXBldjJtdXhfd2l0aF90YWdzKSwgKEdTVF9TVEFSVF9URVNUKSwKKwkgIChhcGV2Mm11eF9zdWl0ZSksIChtYWluKToKKwkgIEFkZCB1bml0IHRlc3QgZm9yIGFwZXYybXV4IGVsZW1lbnQuCisKKzIwMDYtMDUtMjggMTc6MzM6MTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC86IEdTVF9QVFJfRk9STUFUIHNob3VsZCBiZSB1c2VkIHRvIHByaW50IGNhcHMgaW4gZGVidWcgc3RhdGVtZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOiAoZ3N0X2FscGhhX2NvbG9yX3RyYW5zZm9ybV9jYXBzKToKKwkgICogZ3N0L2RlYnVnL25lZ290aWF0aW9uLmM6IChnc3RfbmVnb3RpYXRpb25fdXBkYXRlX2NhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jOiAoZ3N0X3J0cF9pbGJjX2RlcGF5X3NldGNhcHMpOgorCSAgR1NUX1BUUl9GT1JNQVQgc2hvdWxkIGJlIHVzZWQgdG8gcHJpbnQgY2FwcyBpbiBkZWJ1ZyBzdGF0ZW1lbnRzLgorCisyMDA2LTA1LTI4IDE0OjM4OjExICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0B1YnVudHUuY29tPgorCisJICBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6IFNvbWUgY2xlYW4tdXBzIGFuZCBhZGRpdGlvbnM6IG1hcCBBUEUgJ2ZpbGUnIHRhZyB0bworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU2ViYXN0aWFuIERyw7ZnZSAgPHNsb21vIGF0IHVidW50dSBkb3QgY29tPgorCSAgKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6IChhcGVfZGVtdXhfZ2V0X2dzdF90YWdfZnJvbV90YWcpLAorCSAgKGFwZV9kZW11eF9wYXJzZV90YWdzKToKKwkgIFNvbWUgY2xlYW4tdXBzIGFuZCBhZGRpdGlvbnM6IG1hcCBBUEUgJ2ZpbGUnIHRhZyB0bworCSAgR1NUX1RBR19MT0NBVElPTiAoIzM0MzEyMyk7IGFkZCBzdXBwb3J0IGZvciBleHRyYWN0aW5nCisJICB0aGUgdHJhY2sgY291bnQgYW5kIGNsZWFuIHVwIHBhcnNpbmcgYSBiaXQgKCMzNDMxMjcpLgorCisyMDA2LTA1LTI4IDEzOjQ5OjEyICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBleHQvanBlZy9nc3RqcGVnZGVjLmM6IEluaXRpYWxpemUgc2VnbWVudCB0byBHU1RfRk9STUFUX1VOREVGSU5FRCBpbiBSRUFEWS0+UEFVU0VELgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogKGdzdF9qcGVnX2RlY19jaGFuZ2Vfc3RhdGUpOgorCSAgSW5pdGlhbGl6ZSBzZWdtZW50IHRvIEdTVF9GT1JNQVRfVU5ERUZJTkVEIGluIFJFQURZLT5QQVVTRUQuCisKKzIwMDYtMDUtMjggMTM6MzA6MTMgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGV4dC9qcGVnL2dzdGpwZWdkZWMuKjogQ2xpcCBvdXRnb2luZyBidWZmZXJzIGFjY29yZGluZyB0byBjdXJyZW50bHkgY29uZmlndXJlZCBzZWdtZW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogKGdzdF9qcGVnX2RlY19maW5hbGl6ZSksCisJICAoZ3N0X2pwZWdfZGVjX2luaXQpLCAoZ3N0X2pwZWdfZGVjX2NoYWluKSwKKwkgIChnc3RfanBlZ19kZWNfc2lua19ldmVudCksIChnc3RfanBlZ19kZWNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAgQ2xpcCBvdXRnb2luZyBidWZmZXJzIGFjY29yZGluZyB0byBjdXJyZW50bHkgY29uZmlndXJlZCBzZWdtZW50LgorCisyMDA2LTA1LTI4IDEwOjM5OjAwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOiBIYW5kbGUgIHdyaXRpbmcgb2YgdHJhY2stY291bnQgb3IgYWxidW0tdm9sdW1lLWNvdW50IHdpdGhvdXQgdHJhY2stbnVtYmVyIG9yIGFsYnVtZS12b2x1bWUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSAgSGFuZGxlICB3cml0aW5nIG9mIHRyYWNrLWNvdW50IG9yIGFsYnVtLXZvbHVtZS1jb3VudCB3aXRob3V0CisJICB0cmFjay1udW1iZXIgb3IgYWxidW1lLXZvbHVtZS1udW1iZXIgKGluIHRoaXMgY2FzZSB0aGUgbnVtYmVyCisJICB3aWxsIGp1c3QgYmUgc2V0IHRvIDApLgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDN2Mm11eC5jOiAodGVzdF90YWdsaWJfaWQzbXV4X2NoZWNrX3RhZ3MpOgorCSAgSXQgd291bGQgYmUgbmljZSBpZiB3ZSBhY3R1YWxseSBjaGVja2VkIHRoZSB2YWx1ZXMgcmVjZWl2ZWQgZm9yCisJICB0cmFjay9hbGJ1bS12b2x1bWUgbnVtYmVyL2NvdW50IGluICBfY2hlY2tfdGFncygpLCByYXRoZXIgdGhhbgorCSAgc2V0dGluZyB0aGVtIGFnYWluIC4uLgorCisyMDA2LTA1LTI4IDEwOjA1OjQ3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogQSB0cmFjay92b2x1bWUgbnVtYmVyIG9yIGNvdW50IG9mIDAgZG9lcyBub3QgbWFrZSBzZW5zZSwganVzdCBpZ25vcmUgaXQgYWxvbmcgd2l0aCBuZWdhdGkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKGlkM3YyX3RhZ190b190YWdsaXN0KToKKwkgIEEgdHJhY2svdm9sdW1lIG51bWJlciBvciBjb3VudCBvZiAwIGRvZXMgbm90IG1ha2Ugc2Vuc2UsCisJICBqdXN0IGlnbm9yZSBpdCBhbG9uZyB3aXRoIG5lZ2F0aXZlIG51bWJlcnMgKGEgdGFnIG1pZ2h0CisJICBvbmx5IGNvbnRhaW4gYSB0cmFjayBjb3VudCB3aXRob3V0IGEgdHJhY2sgbnVtYmVyKS4KKworMjAwNi0wNS0yNyAxMzoxMTozNyArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiBBYm9ydCBkZWNvbXByZXNzaW9uIHdoZW4gcmVjZWl2aW5nIEZMVVNIX1NUT1AuIFRoaXMgc2hvdWxkIGF2b2lkIGlzc3VlcyB3aGVuIGludGVycnVwdGluZyBkZWNvLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2pwZWdfZGVjX2luaXQpLAorCSAgKGdzdF9qcGVnX2RlY19zaW5rX2V2ZW50KToKKwkgIEFib3J0IGRlY29tcHJlc3Npb24gd2hlbiByZWNlaXZpbmcgRkxVU0hfU1RPUC4gVGhpcyBzaG91bGQgYXZvaWQKKwkgIGlzc3VlcyB3aGVuIGludGVycnVwdGluZyBkZWNvZGluZyB3aXRoIGZsdXNoZXMuCisKKzIwMDYtMDUtMjcgMTI6MTA6NTAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9mbGFjL2dzdGZsYWMuYzogRG9uJ3QgI2luY2x1ZGUgZmlsZSB3ZSBkb24ndCBkaXN0IGFueSBsb25nZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhYy5jOgorCSAgRG9uJ3QgI2luY2x1ZGUgZmlsZSB3ZSBkb24ndCBkaXN0IGFueSBsb25nZXIuCisKKzIwMDYtMDUtMjcgMTE6Mjc6NTkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIFJFQURNRTogUmVwbGFjZSBjdXJyZW50IFJFQURNRSAoY29udGFpbmluZyB0aGUgcmVsZWFzZSBub3RlcyBmcm9tIHNvbWUgMC45LnggdmVyc2lvbikgd2l0aCBhIHByb3BlciBSRUFETUUgdGFrZW4gZnJvbS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIFJFQURNRToKKwkgIFJlcGxhY2UgY3VycmVudCBSRUFETUUgKGNvbnRhaW5pbmcgdGhlIHJlbGVhc2Ugbm90ZXMgZnJvbQorCSAgc29tZSAwLjkueCB2ZXJzaW9uKSB3aXRoIGEgcHJvcGVyIFJFQURNRSB0YWtlbiBmcm9tIHRoZSBjb3JlLgorCisyMDA2LTA1LTI2IDIyOjM1OjAwICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9zcGVjdHJ1bS86IGFkZGVkIGFub3RoZXIgZXhhbXBsZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NwZWN0cnVtL2RlbW8tYXVkaW90ZXN0LmM6IChvbl9mcmVxdWVuY3lfY2hhbmdlZCksCisJICAoc3BlY3RydW1fY2hhaW4pLCAobWFpbik6CisJICAqIGdzdC9zcGVjdHJ1bS9kZW1vLW9zc3NyYy5jOgorCSAgYWRkZWQgYW5vdGhlciBleGFtcGxlCisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIGZpeCB0eXBvCisKKzIwMDYtMDUtMjYgMTM6MTY6NTQgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQ2xpcCB0aGUgb3V0cHV0ZWQgTkVXU0VHTUVOVCBzdG9wIHRpbWUgdG8gdGhlIGNvbmZpZ3VyZWQgc2VnbWVudCBzdG9wIHRpbWUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfYWN0aXZhdGVfc2VnbWVudCk6CisJICBDbGlwIHRoZSBvdXRwdXRlZCBORVdTRUdNRU5UIHN0b3AgdGltZSB0byB0aGUgY29uZmlndXJlZCBzZWdtZW50IHN0b3AKKwkgIHRpbWUuCisKKzIwMDYtMDUtMjYgMTE6NDg6NDQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRG9uJ3QgY2xlYXIgdGhlIHJ1bm5pbmcgdmFyaWFibGUgaW4gdGhlIHNlZWsgY29kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9kb19zZWVrKToKKwkgIERvbid0IGNsZWFyIHRoZSBydW5uaW5nIHZhcmlhYmxlIGluIHRoZSBzZWVrIGNvZGUuCisKKzIwMDYtMDUtMjQgMTY6MDM6NDAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9kdi9nc3RkdmRlbXV4LmM6IEltcGxlbWVudCBFT1MgY29ycmVjdGx5IGJ5IGVpdGhlciBwb3N0aW5nCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2xvb3ApOgorCSAgSW1wbGVtZW50IEVPUyBjb3JyZWN0bHkgYnkgZWl0aGVyIHBvc3RpbmcKKwkgIFNFR01FTlRfRE9ORSBvciBwdXNoaW5nIGFuIEVPUyBtZXNzYWdlIGRlcGVuZGluZworCSAgb24gdGhlIHNlZWsgdHlwZS4gRml4ZXMgIzM0MjU5MgorCisyMDA2LTA1LTI0IDExOjU2OjQzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IERldGVjdCBRQ0VMUCBpbiBtcDRhIGRlc2NyaXB0b3JzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2hhbmRsZV9lc2RzKToKKwkgIERldGVjdCBRQ0VMUCBpbiBtcDRhIGRlc2NyaXB0b3JzLgorCisyMDA2LTA1LTI0IDEwOjAwOjUwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvbGF3LzogU29tZSBjbGVhbnVwcyBpbiB0aGUgY2hhaW4gZnVuY3Rpb25zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzogKGdzdF9hbGF3ZGVjX2NoYWluKToKKwkgICogZ3N0L2xhdy9hbGF3LWRlY29kZS5oOgorCSAgKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6IChnc3RfYWxhd2VuY19jaGFpbik6CisJICAqIGdzdC9sYXcvYWxhdy1lbmNvZGUuaDoKKwkgICogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzogKGdzdF9tdWxhd2RlY19jaGFpbik6CisJICAqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmg6CisJICAqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6IChnc3RfbXVsYXdlbmNfY2hhaW4pOgorCSAgKiBnc3QvbGF3L211bGF3LWVuY29kZS5oOgorCSAgU29tZSBjbGVhbnVwcyBpbiB0aGUgY2hhaW4gZnVuY3Rpb25zLgorCSAgUmVtb3ZlIHNvbWUgR1N0cmVhbWVyIDAuMC4yIGJpdHMuCisKKzIwMDYtMDUtMjMgMjA6MTU6MDQgKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hbmF1d0Bza3luZXQuYmU+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogZ3N0X2NvbGxlY3RfcGFkc19zdG9wKCkgbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSBjaGFpbmluZyB1cCB0byB0aGUgcGFyZW50IGNsYXNzICgjMzQyNy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTWFyayBOYXV3ZWxhZXJ0cyAgPG1hbmF1dyBhdCBza3luZXQgYmU+CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfY2hhbmdlX3N0YXRlKToKKwkgIGdzdF9jb2xsZWN0X3BhZHNfc3RvcCgpIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgY2hhaW5pbmcgdXAKKwkgIHRvIHRoZSBwYXJlbnQgY2xhc3MgKCMzNDI3MzQpLgorCisyMDA2LTA1LTIzIDE2OjQ1OjIyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy86IFJlbW92ZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjcnVmdCBmb3IgZGVhbGluZyB3aXRoIEZMQUMgQVBJIGNoYW5nZXMgaW4gdGhlIDEuMC54IHNlcmllcyAtIHdlIHJlcXVpcmUgMS4uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2ZsYWMvZmxhY19jb21wYXQuaDoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhYy5jOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19kZWNfaW5pdCk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIFJlbW92ZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjcnVmdCBmb3IgZGVhbGluZyB3aXRoIEZMQUMgQVBJCisJICBjaGFuZ2VzIGluIHRoZSAxLjAueCBzZXJpZXMgLSB3ZSByZXF1aXJlIDEuMS4xIG9yIG5ld2VyIHRoZXNlIGRheXMuCisKKzIwMDYtMDUtMjMgMTM6NDQ6MTEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS86IEFkZCBzdXBwb3J0IGZvciBtdXhpbmcvZGVtdXhpbmcgdGhlb3JhIHZpZGVvICgjMzQyNDQ4OyB0b28gYmFkIG5vbmUgb2YgdGhlIHVzdWFsIGxpbnV4IHBsYXllcnMgY2FuIGFjdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X2FkZF9zdHJlYW0pLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wdXNoX3hpcGhfY29kZWNfcHJpdl9kYXRhKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3ZpZGVvX2NhcHMpLCAoZ3N0X21hdHJvc2thX2RlbXV4X2F1ZGlvX2NhcHMpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfYmFzZV9pbml0KSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3ZpZGVvX3BhZF9zZXRjYXBzKSwKKwkgICh4aXBoM19zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhKSwKKwkgICh2b3JiaXNfc3RyZWFtaGVhZGVyX3RvX2NvZGVjZGF0YSksCisJICAodGhlb3JhX3N0cmVhbWhlYWRlcl90b19jb2RlY2RhdGEpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfYXVkaW9fcGFkX3NldGNhcHMpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfZGF0YSk6CisJICBBZGQgc3VwcG9ydCBmb3IgbXV4aW5nL2RlbXV4aW5nIHRoZW9yYSB2aWRlbyAoIzM0MjQ0ODsgdG9vIGJhZAorCSAgbm9uZSBvZiB0aGUgdXN1YWwgbGludXggcGxheWVycyBjYW4gYWN0dWFsbHkgcGxheSB0aGlzKS4gUGxheWJhY2sKKwkgIGluIEdTdHJlYW1lciB3aWxsIHJlcXVpcmUgYWRkaXRpb25hbCBjaGFuZ2VzIHRvIHRoZW9yYWRlYyBpbiAtYmFzZS4KKwkgIFJlZmFjdG9yIHN0cmVhbWhlYWRlcnMgPD0+IENvZGVjUHJpdmF0ZURhdGEgY29kZSBhIGJpdDsgc29tZSBzbWFsbAorCSAgY2xlYW51cHMuCisKKzIwMDYtMDUtMjIgMTg6MDA6NTIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogcG8vUE9URklMRVMuaW46CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKSwgKHBsdWdpbl9pbml0KToKKwkgIHBvL1BPVEZJTEVTLmluOgorCSAgVGhyb3cgYW4gZXJyb3Igd2hlbiB0aGUgZmlsZSBpcyBlbmNyeXB0ZWQuIE1vdmUgcGx1Z2luX2luaXQgc3R1ZmYKKwkgIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFkZCBzdHVmZiBmb3IgaTE4biwgbWFrZSBkZWJ1ZyBjYXRlZ29yeQorCSAgc3RhdGljLgorCisyMDA2LTA1LTIyIDE1OjIzOjA1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvanBlZy9nc3RqcGVnZGVjLmM6IEZpeCBjcmFzaGVzIHdoZW4gdGhlIGhvcml6b250YWwgc3Vic2FtcGxpbmcgaXMgMS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6IChocmVzYW1wbGVjcHkxKSwKKwkgIChnc3RfanBlZ19kZWNfZGVjb2RlX2luZGlyZWN0KSwgKGdzdF9qcGVnX2RlY19jaGFpbik6CisJICBGaXggY3Jhc2hlcyB3aGVuIHRoZSBob3Jpem9udGFsIHN1YnNhbXBsaW5nIGlzIDEuCisJICBGaXhlcyAjMzQyMDk3LgorCisyMDA2LTA1LTIyIDE0OjU2OjI5ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5Lmg6CisJICBjb3ZlciB1cCB0aGUgZGlydHkgdHJ1dGgKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgY292ZXIgdXAgdGhlIGRpcnR5IHRydXRoCisKKzIwMDYtMDUtMjIgMTM6NTM6MTggKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hbmF1d0Bza3luZXQuYmU+CisKKwkgIGdzdC9hdmkvZ3N0YXZpbXV4Lio6IC0gYWRkIG9kbWwgKGxhcmdlIGZpbGUpIGluZGV4IHN1cHBvcnQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE1hcmsgTmF1d2VsYWVydHMgIDxtYW5hdXcgYXQgc2t5bmV0IGJlPgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aV9tdXhfZmluYWxpemUpLCAoZ3N0X2F2aV9tdXhfaW5pdCksCisJICAoZ3N0X2F2aV9tdXhfdmlkc2lua19zZXRfY2FwcyksIChnc3RfYXZpX211eF9hdWRzaW5rX3NldF9jYXBzKSwKKwkgIChnc3RfYXZpX211eF93cml0ZV90YWcpLCAoZ3N0X2F2aV9tdXhfcmlmZl9nZXRfYXZpX2hlYWRlciksCisJICAoZ3N0X2F2aV9tdXhfcmlmZl9nZXRfYXZpeF9oZWFkZXIpLCAoZ3N0X2F2aV9tdXhfd3JpdGVfYXZpeF9pbmRleCksCisJICAoZ3N0X2F2aV9tdXhfYWRkX2luZGV4KSwgKGdzdF9hdmlfbXV4X2JpZ2ZpbGUpLAorCSAgKGdzdF9hdmlfbXV4X3N0YXJ0X2ZpbGUpLCAoZ3N0X2F2aV9tdXhfc3RvcF9maWxlKSwKKwkgIChnc3RfYXZpX211eF9oYW5kbGVfZXZlbnQpLCAoZ3N0X2F2aV9tdXhfZG9fYXVkaW9fYnVmZmVyKSwKKwkgIChnc3RfYXZpX211eF9kb192aWRlb19idWZmZXIpLCAoZ3N0X2F2aV9tdXhfZG9fb25lX2J1ZmZlciksCisJICAoZ3N0X2F2aV9tdXhfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguaDoKKwkgIFNvbWUgZW5oYW5jZW1lbnRzIGZvciBhdmltdXggKCMzNDI1MjYpOgorCSAgLSBhZGQgb2RtbCAobGFyZ2UgZmlsZSkgaW5kZXggc3VwcG9ydAorCSAgLSBzdG9yZSBjb2RlYyBpbml0IGRhdGEgKGUuZy4gaHVmZnl1dikKKwkgIC0gbWlzY2VsbGFuZW91cyBvdGhlciBmaXhlcy9jbGVhbnVwcworCisyMDA2LTA1LTIyIDEzOjUxOjMwICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmM6CisJICBmaXggZGVzY3JpcHRpb25zIGFuZCBsaWNlbnNlIGJsb2NrcyBjdXQgYW5kIHBhc3RlIGFueW9uZSA/CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZpeCBkZXNjcmlwdGlvbnMgYW5kIGxpY2Vuc2UgYmxvY2tzCisJICBjdXQgYW5kIHBhc3RlIGFueW9uZSA/CisKKzIwMDYtMDUtMjEgMTY6NDE6NDQgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IFVzZSBib2lsZXJwbGF0ZSBtYWNybywgZml4IHN0cmluZ3MgdG8gbWF0Y2ggcGx1Z2luLW1vdmFsLXJlcXVpcmVtZW50cworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zcGVjdHJ1bV9pbml0KSwgKGdzdF9zcGVjdHJ1bV9zZXRfc2lua19jYXBzKSwKKwkgIChnc3Rfc3BlY3RydW1fZ2V0X3NpbmtfY2FwcyksIChnc3Rfc3BlY3RydW1fY2hhaW4pOgorCSAgVXNlIGJvaWxlcnBsYXRlIG1hY3JvLCBmaXggc3RyaW5ncyB0byBtYXRjaCBwbHVnaW4tbW92YWwtcmVxdWlyZW1lbnRzCisKKzIwMDYtMDUtMjEgMTY6MjM6MjMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3NwZWN0cnVtL01ha2VmaWxlLmFtOiBMaW5rIHRvIGJhc2UgbGlicmFyaWVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3NwZWN0cnVtL01ha2VmaWxlLmFtOgorCSAgTGluayB0byBiYXNlIGxpYnJhcmllcworCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1vc3NzcmMuYzogKG1haW4pOgorCSAgdXNlIG5ldyB0aHJlc2hob2xkIHByb3BlcnR5CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zcGVjdHJ1bV9pbml0KSwgKGdzdF9zcGVjdHJ1bV9kaXNwb3NlKSwKKwkgIChnc3Rfc3BlY3RydW1fc2V0X3Byb3BlcnR5KSwgKGdzdF9zcGVjdHJ1bV9zZXRfc2lua19jYXBzKSwKKwkgIChnc3Rfc3BlY3RydW1fZ2V0X3NpbmtfY2FwcyksIChnc3Rfc3BlY3RydW1fY2hhaW4pLAorCSAgKGdzdF9zcGVjdHJ1bV9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uaDoKKwkgIFVzZSBnc3RfYWRhcHRlciwgc3VwcG9ydCBtdWx0aXBsZS1jaGFubmVscywgYWRkIHRocmVzaG9sZCBwcm9wZXJ0eSBmb3IKKwkgIHJlc3VsdCwgYWRkIGRvY3MsIGZpeCByZXN1bHRpbmcgc3BlY3RydW0gcmFuZ2UgKHdhcyBpbmNsdWRpbmcgbWlycm9yZWQKKwkgIHJlc3VsdHMpCisKKzIwMDYtMDUtMjAgMjI6NDI6MTUgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgSW5pdGlhbCBwb3J0IG9mIHRoZSBzcGVjdHJ1bSBlbGVtZW50CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1vc3NzcmMuYzogKHNwZWN0cnVtX2NoYWluKSwgKG1haW4pOgorCSAgKiBnc3Qvc3BlY3RydW0vZml4X2ZmdC5jOiAoZ3N0X3NwZWN0cnVtX2ZpeF9kb3QpOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogKGdzdF9zcGVjdHJ1bV9nZXRfdHlwZSksCisJICAoZ3N0X3NwZWN0cnVtX2Jhc2VfaW5pdCksIChnc3Rfc3BlY3RydW1fY2xhc3NfaW5pdCksCisJICAoZ3N0X3NwZWN0cnVtX2luaXQpLCAoZ3N0X3NwZWN0cnVtX2Rpc3Bvc2UpLAorCSAgKGdzdF9zcGVjdHJ1bV9zZXRfcHJvcGVydHkpLCAoZ3N0X3NwZWN0cnVtX2NoYWluKToKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJICBJbml0aWFsIHBvcnQgb2YgdGhlIHNwZWN0cnVtIGVsZW1lbnQKKworMjAwNi0wNS0xOSAxODo1ODowNSArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYzoKKwkgIEkgZm9yZ2V0IHRvIGFkZCBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYyBpbiBsYXMgY29tbWl0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEkgZm9yZ2V0IHRvIGFkZCBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYyBpbiBsYXMgY29tbWl0CisKKzIwMDYtMDUtMTkgMTg6MzE6MjUgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogc3lzL3Y0bDIvZ3N0djRsMi5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgU29tZSBjbGVhbi11cHMgcmVxdWVzdGVkIGJ5IHdpbmdvIGluIGJ1ZyAjMzM4ODE4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBTb21lIGNsZWFuLXVwcyByZXF1ZXN0ZWQgYnkgd2luZ28gaW4gYnVnICMzMzg4MTguCisKKzIwMDYtMDUtMTkgMTQ6MDU6NTMgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogRG9uJ3Qgb3V0cHV0IGFueSB0YWcgd2hlbiB3ZSBlbmNvdW50ZXIgYSBuZWdhdGl2ZSB0cmFjayBudW1iZXIgLSB0aGUgdGFnIHR5cGUgaXMgdWludCwgc28uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKGlkM3YyX3RhZ190b190YWdsaXN0KToKKwkgIERvbid0IG91dHB1dCBhbnkgdGFnIHdoZW4gd2UgZW5jb3VudGVyIGEgbmVnYXRpdmUgdHJhY2sgbnVtYmVyIC0gdGhlCisJICB0YWcgdHlwZSBpcyB1aW50LCBzbyB3ZSBlbmQgdXAgb3V0cHV0dGluZyBodWdlIHBvc2l0aXZlIG51bWJlcnMKKwkgIGluc3RlYWQuIChGaXhlczogIzM0MjAyOSkKKworMjAwNi0wNS0xOCAyMzowNDo1OSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGNvbmZpZ3VyZS5hYzogdXBkYXRlIGZvciBuZXcgR1NUUEJfUExVR0lOU19ESVIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICB1cGRhdGUgZm9yIG5ldyBHU1RQQl9QTFVHSU5TX0RJUgorCisyMDA2LTA1LTE4IDE5OjM0OjQ3ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogQ2hlY2sgZm9yIFgxMQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIENoZWNrIGZvciBYMTEKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOiAoZ3N0X3Y0bDJfY2xhc3NfcHJvYmVfZGV2aWNlcyk6CisJICAqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfaWZhY2Vfc3VwcG9ydGVkKToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYzogKGdzdF92NGwyX3hvdmVybGF5X29wZW4pOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuaDoKKwkgIENvZGUgY2xlYW51cHMsIGZpeCBkZWJ1ZyBtYWNyb3MKKworMjAwNi0wNS0xOCAxNDo0NTozMyArMDAwMCAgUGhpbGlwcGUgS2FsYWYgPHBoaWxpcHBlLmthbGFmQGNvbGxhYm9yYS5jby51az4KKworCSAgcnRwL2dzdC9nc3RydHBoMjYzcGF5LmM6IFByb3Blcmx5IHNldCBzdGF0aWMgY2FwcyBmb3IgSDI2MyBhdCAzNC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wNS0xOCAgUGhpbGlwcGUgS2FsYWYgIDxwaGlsaXBwZS5rYWxhZiBhdCBjb2xsYWJvcmEuY28udWs+CisJICAqIHJ0cC9nc3QvZ3N0cnRwaDI2M3BheS5jOgorCSAgUHJvcGVybHkgc2V0IHN0YXRpYyBjYXBzIGZvciBIMjYzIGF0IDM0LgorCisyMDA2LTA1LTE4IDEyOjQ2OjA4ICswMDAwICBKYW1lcyBEb2MgTGl2aW5nc3RvbiA8ZG9jbGl2aW5nc3RvbkBnbWFpbC5jb20+CisKKwkgIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4LmM6IE1lcmdlIGV2ZW50IHRhZ3MgYW5kIHRhZyBzZXR0ZXIgdGFncyBjb3JyZWN0bHkgKCMzMzk5MTgpLiBBbHNvLCBkb24ndCBsZWFrIHRhZ2xpc3QgaW4gY2FzZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSmFtZXMgIkRvYyIgTGl2aW5nc3RvbiAgPGRvY2xpdmluZ3N0b24gZ21haWwgY29tPgorCSAgKiBleHQvdGFnbGliL2dzdHRhZ2xpYm11eC5jOiAoZ3N0X3RhZ19saWJfbXV4X3JlbmRlcl90YWcpOgorCSAgTWVyZ2UgZXZlbnQgdGFncyBhbmQgdGFnIHNldHRlciB0YWdzIGNvcnJlY3RseSAoIzMzOTkxOCkuIEFsc28sCisJICBkb24ndCBsZWFrIHRhZ2xpc3QgaW4gY2FzZSBvZiBhbiBlcnJvci4KKworMjAwNi0wNS0xNyAxODowOTowNiArMDAwMCAgUGhpbGlwcGUgS2FsYWYgPHBoaWxpcHBlLmthbGFmQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJICBGaXhlZCBjYXBzIGZvciBIMjYzIChub3QgdGhlIHNhbWUgYXMgSDI2MyspCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEZpeGVkIGNhcHMgZm9yIEgyNjMgKG5vdCB0aGUgc2FtZSBhcyBIMjYzKykKKworMjAwNi0wNS0xNyAxMjozNjoyNiArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzogV2UgY2FuIG9ubHkgZG8gY2FwcyBpbnRlcnNlY3Rpb24gaWYgdGhlIG90aGVyY2FwcyBhcmUgbm9uLWVtcHR5IGFuZCBub3QKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOiAobXVsYXdkZWNfZ2V0Y2Fwcyk6CisJICBXZSBjYW4gb25seSBkbyBjYXBzIGludGVyc2VjdGlvbiBpZiB0aGUgb3RoZXJjYXBzIGFyZSBub24tZW1wdHkgYW5kIG5vdAorCSAgQU5ZLiBFbHNlIHdlIHJldHVybiB0aGUgcGFkIHRlbXBsYXRlIChiYXNlX2NhcHMpLgorCisyMDA2LTA1LTE3IDExOjIwOjQ0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvanBlZy9nc3RqcGVnZGVjLmM6IEZpeCBjcmFzaCB3aGVuIG91dHB1dHRpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBjZXJ0YWluIHBpY3R1cmVzIChhbHdheXMgZ29vZCB0byB1c2UgdGhlIHIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6IChnc3RfanBlZ19kZWNfY2hhaW4pOgorCSAgRml4IGNyYXNoIHdoZW4gb3V0cHV0dGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGNlcnRhaW4KKwkgIHBpY3R1cmVzIChhbHdheXMgZ29vZCB0byB1c2UgdGhlIHJpZ2h0IHN0cnVjdCBtZW1iZXIgZm9yCisJICB0aGUgbnVtYmVyIG9mIHJlY29yZHMgaW4gYW4gYXJyYXkpLgorCisyMDA2LTA1LTE3IDA4OjEwOjMxICswMDAwICBKaW5kcmljaCBNYWtvdmlja2EgPGppbmRyaWNoLm1ha2l2aWNrYUBpdG9uaXMudHY+CisKKwkgIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogRG9uJ3QgY3JlYXRlIHVubmVjZXNzYXJ5IHN1Yi1idWZmZXJzIGFsbCB0aGUgdGltZS4gRHJhbWF0aWNhbGx5IGltcHJvdmVzIHBlcmZvcm1hbmNlIHdpdGggbS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSmluZHJpY2ggTWFrb3ZpY2thICA8amluZHJpY2gubWFraXZpY2thIGF0IGl0b25pcyB0dj4KKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOiAoZ3N0X2VibWxfcmVhZF9wZWVrX2J5dGVzKSwKKwkgIChnc3RfZWJtbF9yZWFkX3B1bGxfYnl0ZXMpLCAoZ3N0X2VibWxfcmVhZF9lbGVtZW50X2lkKSwKKwkgIChnc3RfZWJtbF9yZWFkX2VsZW1lbnRfbGVuZ3RoKSwgKGdzdF9lYm1sX3JlYWRfYnVmZmVyKSwKKwkgIChnc3RfZWJtbF9yZWFkX2J5dGVzKSwgKGdzdF9lYm1sX3JlYWRfdWludCksIChnc3RfZWJtbF9yZWFkX3NpbnQpLAorCSAgKGdzdF9lYm1sX3JlYWRfZmxvYXQpLCAoZ3N0X2VibWxfcmVhZF9hc2NpaSksCisJICAoZ3N0X2VibWxfcmVhZF9iaW5hcnkpOgorCSAgRG9uJ3QgY3JlYXRlIHVubmVjZXNzYXJ5IHN1Yi1idWZmZXJzIGFsbCB0aGUgdGltZS4gRHJhbWF0aWNhbGx5CisJICBpbXByb3ZlcyBwZXJmb3JtYW5jZSB3aXRoIG11bHRpcGxlIGNvbmN1cnJlbnRseSBydW5uaW5nCisJICBtYXRyb3NrYWRlbXV4IGluc3RhbmNlcyAoIzM0MTgxOCkgKGFuZCBhdm9pZHMgZG9pbmcKKwkgIHVubmVjZXNzYXJpbHkgaW5lZmZpY2llbnQgdGhpbmdzIGluIHRoZSBnZW5lcmFsIGNhc2UpLgorCisyMDA2LTA1LTE2IDE3OjIwOjA0ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiBJbiBzbmFwc2hvdCBtb2RlLCB3ZSBhbHdheXMgcmV0dXJuIEdTVF9GTE9XX1VORVhQRUNURUQgd2hhdGV2ZXIgdGhlIHJldHVybiB2YWx1ZSBvZiBnc3RfcGFkX3AuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiAoZ3N0X3BuZ2VuY19jaGFpbik6CisJICBJbiBzbmFwc2hvdCBtb2RlLCB3ZSBhbHdheXMgcmV0dXJuIEdTVF9GTE9XX1VORVhQRUNURUQgd2hhdGV2ZXIgdGhlCisJICByZXR1cm4gdmFsdWUgb2YgZ3N0X3BhZF9wdXNoX2V2ZW50KCkuCisKKzIwMDYtMDUtMTYgMTQ6MDc6MjkgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvYXV0b2RldGVjdC86IE1ha2UgdGhlIG5hbWUgb2YgdGhlIGNoaWxkIGVsZW1lbnQgYmUgYmFzZWQgb24gdGhlIG5hbWUgb2YgdGhlIHBhcmVudCwgc28gdGhhdCBkZWJ1ZyBvdXRwdXQgaXMgbW9yZSAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJICAoZ3N0X2F1dG9fYXVkaW9fc2lua19maW5kX2Jlc3QpOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJICAoZ3N0X2F1dG9fdmlkZW9fc2lua19maW5kX2Jlc3QpOgorCSAgTWFrZSB0aGUgbmFtZSBvZiB0aGUgY2hpbGQgZWxlbWVudCBiZSBiYXNlZCBvbiB0aGUgbmFtZSBvZiB0aGUKKwkgIHBhcmVudCwgc28gdGhhdCBkZWJ1ZyBvdXRwdXQgaXMgbW9yZSB1c2VmdWwuCisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiAoZmluZF91dGYxNl9ib20pLAorCSAgKHBhcnNlX2luc2VydF9zdHJpbmdfZmllbGQpLCAocGFyc2Vfc3BsaXRfc3RyaW5ncyk6CisJICBSZXdvcmsgc3RyaW5nIHBhcnNpbmcgdG8gYWx3YXlzIHdhbGsgb3ZlciBCT00gbWFya2VycyBpbiBVVEYxNgorCSAgc3RyaW5ncywgdXNpbmcgdGhlIGVuZGlhbm5lc3MgaW5kaWNhdGVkIGJ5IHRoZSBpbm5lcm1vc3Qgb25lLAorCSAgdGhlbiB0cnlpbmcgdGhlIG9wcG9zaXRlIGVuZGlhbm5lc3MgaWYgdGhhdCBmYWlscyB0byBjb252ZXJ0CisJICB0byB2YWxpZCBVVEYtOC4gRml4ZXMgIzM0MTc3NAorCisyMDA2LTA1LTE2IDEzOjMxOjAyICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBleHQvbGlicG5nL01ha2VmaWxlLmFtOiBBZGQgTElCUE5HX0NGTEFHUy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wNS0xNiAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCSAgUGF0Y2ggZnJvbTogTWF0dGhpZXUgPG1hdHRoaWV1IGF0IGZsdWVuZG8gZG90IGNvbT4KKwkgICogZXh0L2xpYnBuZy9NYWtlZmlsZS5hbToKKwkgIEFkZCBMSUJQTkdfQ0ZMQUdTLgorCisyMDA2LTA1LTE1IDExOjIwOjIxICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIHVwZGF0ZSB3aXRoIGxhdGVzdCBjaGFuZ2VzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHVwZGF0ZSB3aXRoIGxhdGVzdCBjaGFuZ2VzCisKKzIwMDYtMDUtMTUgMDk6MDA6NDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6IEFkZCBzdXBwb3J0IGZvciB3cml0aW5nIGltYWdlcyAoQVBJQyBmcmFtZXMpIGludG8gSUQzdjIgdGFncyAocGljdHVyZSB0eXBlIGFsd2F5cyBzZXQgdG8gJy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJICBBZGQgc3VwcG9ydCBmb3Igd3JpdGluZyBpbWFnZXMgKEFQSUMgZnJhbWVzKSBpbnRvIElEM3YyCisJICB0YWdzIChwaWN0dXJlIHR5cGUgYWx3YXlzIHNldCB0byAnb3RoZXInIGZvciBub3cgdGhvdWdoKS4KKworMjAwNi0wNS0xNCAxMjo1MDowNyArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogVXBkYXRlIGRvY3M7IHdhdnBhcnNlIGltcGxlbWVudHMgcHVzaCBhbmQgcHVsbCBtb2Rlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIFVwZGF0ZSBkb2NzOyB3YXZwYXJzZSBpbXBsZW1lbnRzIHB1c2ggYW5kIHB1bGwgbW9kZXMuCisKKzIwMDYtMDUtMTIgMTg6MTA6MzYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogT29vcHMsIGJpdHRlbiBieSB0aGUgY29weS1hbmQtcGFzdGUgZGVzaWduIHBhcmFkaWdtLCBmaXhlcyBzZWVrIGFnYWluLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaW5kZXhfbmV4dCksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9pbmRleCksIChnc3RfYXZpX2RlbXV4X21hc3NhZ2VfaW5kZXgpLAorCSAgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspLCAoZ3N0X2F2aV9kZW11eF9sb29wKToKKwkgIE9vb3BzLCBiaXR0ZW4gYnkgdGhlIGNvcHktYW5kLXBhc3RlIGRlc2lnbiBwYXJhZGlnbSwgZml4ZXMKKwkgIHNlZWsgYWdhaW4uCisKKzIwMDYtMDUtMTIgMTg6MDQ6MjIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguKjogU29tZSBjbGVhbnVwcywgcHJlcGFyZSB0byB1c2UgR3N0U2VnbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3Jlc2V0KSwKKwkgIChnc3RfYXZpX2RlbXV4X2luZGV4X25leHQpLCAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwKKwkgIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpLCAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdWJpbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0pLCAoZ3N0X2F2aV9kZW11eF9wYXJzZV9pbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5kZXgpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fc2NhbiksCisJICAoZ3N0X2F2aV9kZW11eF9tYXNzYWdlX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X2NhbGN1bGF0ZV9kdXJhdGlvbnNfZnJvbV9pbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9wdXNoX2V2ZW50KSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlciksCisJICAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc2VlayksIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSksCisJICAoZ3N0X2F2aV9kZW11eF9sb29wKToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgU29tZSBjbGVhbnVwcywgcHJlcGFyZSB0byB1c2UgR3N0U2VnbWVudC4KKwkgIEZpeCBlcnJvciBpbiBlbnRyeSB3YWxraW5nIGNvZGUuCisJICBGaXggVkJSIGRldGVjdGlvbi4KKwkgIFNtYXJ0ZXIgdGltZXN0YW1wIGNhbGN1bGF0aW9uIGNvZGUuCisJICBVbmlmb3JtIGVycm9yL2VvcyBoYW5kbGluZy4KKworMjAwNi0wNS0xMiAxNzo0NDoxNSArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogRml4IHVzZSBvZiB1bmluaXRpYWxpc2VkIHZhbHVlcyBpZiB3ZSdyZSBOT1Qgc2Vla2luZyBpbiByZWFkeS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9mbXQpLAorCSAgKGdzdF93YXZwYXJzZV9wZXJmb3JtX3NlZWspLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKToKKwkgIEZpeCB1c2Ugb2YgdW5pbml0aWFsaXNlZCB2YWx1ZXMgaWYgd2UncmUgTk9UIHNlZWtpbmcgaW4gcmVhZHkuCisJICBGaXggdHlwb3MuCisKKzIwMDYtMDUtMTIgMDg6MjM6MTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC93YXZwYXJzZS9NYWtlZmlsZS5hbTogQWRkIENGTEFHUyBhbmQgTElCUyBmb3IgbGliZ3N0YmFzZSwgZml4ZXMgYnVpbGQgb24KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvTWFrZWZpbGUuYW06CisJICBBZGQgQ0ZMQUdTIGFuZCBMSUJTIGZvciBsaWJnc3RiYXNlLCBmaXhlcyBidWlsZCBvbgorCSAgQ3lnd2luICgjMzQxNDg5KS4KKworMjAwNi0wNS0xMiAwODoyMTozNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IFNvbWUgbW9yZSBkZWJ1ZyBpbmZvLiBObyBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHN0cmluZyByZXR1cm5lZCBieSBnX2NvbnZlcnQoKSBpcyByZWFsLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IChwYXJzZV9pbnNlcnRfc3RyaW5nX2ZpZWxkKToKKwkgIFNvbWUgbW9yZSBkZWJ1ZyBpbmZvLiBObyBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHN0cmluZworCSAgcmV0dXJuZWQgYnkgZ19jb252ZXJ0KCkgaXMgcmVhbGx5IFVURi04IC0gZWl0aGVyIGl0IGlzIG9yCisJICB3ZSBnZXQgTlVMTCByZXR1cm5lZC4KKworMjAwNi0wNS0xMSAxNzo1OTo1OSArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJlbGVtZW50LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyZWxlbWVudC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ4b3ZlcmxheS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnhvdmVybGF5Lmg6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmg6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmg6CisJICBDaGFuZ2VzIHByb3Bvc2VkIGJ5IFdpbmdvIGluIGJ1ZyAjMzM4ODE4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBDaGFuZ2VzIHByb3Bvc2VkIGJ5IFdpbmdvIGluIGJ1ZyAjMzM4ODE4LgorCisyMDA2LTA1LTExIDA5OjA5OjQ5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEZpZ3VyZSBvdXQgdGhlIHJlYWwgYXVkaW8gdHlwZSBpbiBtcDRhIGJveGVzIGJ5IHBhcnNpbmcgdGhlIG9wdGlvbmFsIGRlc2NyaXB0b3JzIGluIHRoZSBvcHRpb24uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayksCisJICAoZ3N0X3F0ZGVtdXhfaGFuZGxlX2VzZHMpOgorCSAgRmlndXJlIG91dCB0aGUgcmVhbCBhdWRpbyB0eXBlIGluIG1wNGEgYm94ZXMgYnkgcGFyc2luZyB0aGUKKwkgIG9wdGlvbmFsIGRlc2NyaXB0b3JzIGluIHRoZSBvcHRpb25hbCBlc2RzIGJveC4gUHJvbW90ZSB0aGUKKwkgIGRlZmF1bHQgQUFDIHRvIG1wMyB3aGVuIGluZGljYXRlZC4gRml4ZXMgIzMzMDYzMi4KKworMjAwNi0wNS0xMCAxNzo0NDo1MCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBQYXJzZSB2ZXJzaW9uIDIgc2FtcGxlIGRlc2NyaXB0aW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlKSwgKHF0ZGVtdXhfZHVtcF91bmtub3duKSwKKwkgIChxdGRlbXV4X3BhcnNlX3RyYWspLCAoZ3N0X3F0ZGVtdXhfaGFuZGxlX2VzZHMpOgorCSAgUGFyc2UgdmVyc2lvbiAyIHNhbXBsZSBkZXNjcmlwdGlvbnMuCisJICBEb24ndCAjZGVmaW5lIGdzdF91dGlsX2R1bXBfbWVtKCksIHVzZSBzb21ldGhpbmcgbW9yZQorCSAgc3BlY2lmaWMgaW5zdGVhZCB0byBhdm9pZCBjb25mdXNpb24uCisKKzIwMDYtMDUtMTAgMTM6NTE6MDEgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogRml4IHBhcnNpbmcgb2YgbnVtZXJpYyBnZW5yZSBzdHJpbmdzIHNvbWUgbW9yZSwgYnkgZW5zdXJpbmcgdGhhdCB3ZSBvbmx5IHRyeSBhbmQgcGFyc2Ugc3QuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKGlkM3YyX2dlbnJlX2ZpZWxkc190b190YWdsaXN0KToKKwkgIEZpeCBwYXJzaW5nIG9mIG51bWVyaWMgZ2VucmUgc3RyaW5ncyBzb21lIG1vcmUsIGJ5IGVuc3VyaW5nIHRoYXQKKwkgIHdlIG9ubHkgdHJ5IGFuZCBwYXJzZSBzdHJpbmdzIHRoYXQgYSkgU3RhcnQgd2l0aCAnKCcgYW5kIGIpIENvbnNpc3QKKwkgIG9ubHkgb2YgZGlnaXRzLgorCSAgQWxzbywgd2hlbiBmaW5kaW5nIGFuIGVzY2FwaW5nICcoKCcgc2VxdWVuY2UsIGJ1c3QgaXQgYmFjayB0byAnKCcgYnkKKwkgIHN3YWxsb3dpbmcgdGhlIGZpcnN0IHBhcmVudGhlc2lzCisKKzIwMDYtMDUtMTAgMTE6MTc6MzEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9lc2QvZXNkc2luay4qOiBNb3ZlIHRoZSBlc2RfZ2V0X3NlcnZlcl9pbmZvKCkgaW50byBnc3RfZXNkc2lua19vcGVuKCkgYW5kIGZhaWwgd2l0aCBhIGRlY2VudCBlcnJvciBtZXNzYWdlIG9uIGVyci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfZmluYWxpemUpLCAoZ3N0X2VzZHNpbmtfZ2V0Y2FwcyksCisJICAoZ3N0X2VzZHNpbmtfb3BlbiksIChnc3RfZXNkc2lua19jbG9zZSk6CisJICAqIGV4dC9lc2QvZXNkc2luay5oOgorCSAgTW92ZSB0aGUgZXNkX2dldF9zZXJ2ZXJfaW5mbygpIGludG8gZ3N0X2VzZHNpbmtfb3BlbigpIGFuZCBmYWlsCisJICB3aXRoIGEgZGVjZW50IGVycm9yIG1lc3NhZ2Ugb24gZXJyb3JzLgorCisyMDA2LTA1LTEwIDEwOjI5OjU0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBDb25zdC1pZnkgR0VudW1WYWx1ZSBhcnJheXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2VzZC9lc2Rtb24uYzogKGdzdF9lc2Rtb25fZGVwdGhzX2dldF90eXBlKSwKKwkgIChnc3RfZXNkbW9uX2NoYW5uZWxzX2dldF90eXBlKToKKwkgICogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zaW5rLmM6IChnc3RfZ2NvbmZfcHJvZmlsZV9nZXRfdHlwZSk6CisJICAqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmM6IChnc3RfcGl4YnVmc2NhbGVfbWV0aG9kX2dldF90eXBlKToKKwkgICogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzogKGdzdF9jYWNhc2lua19kaXRoZXJfZ2V0X3R5cGUpOgorCSAgKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOiAoZ3N0X3Nob3V0MnNlbmRfcHJvdG9jb2xfZ2V0X3R5cGUpOgorCSAgKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzogKGdzdF9hbHBoYV9tZXRob2RfZ2V0X3R5cGUpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jOiAoZ3N0X2lsYmNfbW9kZV9nZXRfdHlwZSk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwX3Byb3RvX2dldF90eXBlKToKKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X2ZpbGxfZ2V0X3R5cGUpOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6IChnc3RfdmlkZW9fZmxpcF9tZXRob2RfZ2V0X3R5cGUpOgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICAoZ3N0X3ZpZGVvX21peGVyX2JhY2tncm91bmRfZ2V0X3R5cGUpOgorCSAgQ29uc3QtaWZ5IEdFbnVtVmFsdWUgYXJyYXlzLgorCisyMDA2LTA1LTA5IDE0OjA4OjE1ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJldD4KKworCSAgZ3N0L2F2aS9nc3RhdmltdXguYzogV29yayBhcm91bmQgZ3N0X2J1ZmZlcl9tYWtlX21ldGFkYXRhX3dyaXRhYmxlKCkgYnVnIHRoYXQgcmVzdWx0cyBpbiBhdmltdXggbWFya2luZyBhbGwgZnJhbWVzIGluLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBNYXJrIE5hdXdlbGFlcnRzICA8bWFuYXV3IGF0IHNreW5ldCBiZXQ+CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpX211eF9kb19hdWRpb19idWZmZXIpLAorCSAgKGdzdF9hdmlfbXV4X2RvX3ZpZGVvX2J1ZmZlcik6CisJICBXb3JrIGFyb3VuZCBnc3RfYnVmZmVyX21ha2VfbWV0YWRhdGFfd3JpdGFibGUoKSBidWcgdGhhdAorCSAgcmVzdWx0cyBpbiBhdmltdXggbWFya2luZyBhbGwgZnJhbWVzIGluIHRoZSBpbmRleCBhcworCSAga2V5ZnJhbWVzICgjMzQwODU5KS4KKworMjAwNi0wNS0wOCAxOToyMToxOCArMDAwMCAgTWFydGluIFJ1YmxpIDxtYXJ0aW5fcnVibGlAbG9naXRlY2guY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICBGaXggZm91cmNjIG5hbWUgcHJpbnRlZCBvdXQuIFBhdGNoIGZyb20gTWFydGluIFJ1YmxpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGaXggZm91cmNjIG5hbWUgcHJpbnRlZCBvdXQuIFBhdGNoIGZyb20gTWFydGluIFJ1YmxpLgorCisyMDA2LTA1LTA4IDE1OjIwOjEwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IERvbid0IGNhdXNlIHNpZGUgZWZmZWN0cyBpbiBhIGRlYnVnZ2luZyBmdW5jdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwKKwkgIChxdGRlbXV4X2R1bXBfbXZoZCk6CisJICBEb24ndCBjYXVzZSBzaWRlIGVmZmVjdHMgaW4gYSBkZWJ1Z2dpbmcgZnVuY3Rpb24uCisJICBBbHNvIHJlcG9ydCBkdXJhdGlvbiBpbiBwdXNoIG1vZGUgc2luY2Ugd2UgY2FuLgorCisyMDA2LTA1LTA4IDE0OjM1OjIwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9ydHNwdXJsLmM6IE1ha2UgcGFyc2luZyBvZiB1cmxzIHN1Y2sgc2xpZ2h0bHkgbGVzcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9ydHNwdXJsLmM6IChydHNwX3VybF9wYXJzZSk6CisJICBNYWtlIHBhcnNpbmcgb2YgdXJscyBzdWNrIHNsaWdodGx5IGxlc3MuCisKKzIwMDYtMDUtMDggMTE6NTM6MDMgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGF1dG9nZW4uc2g6IGxpYnRvb2xpemUgb24gRGFyd2luL01hY09TWCBpcyBjYWxsZWQgZ2xpYnRvb2xpemUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogYXV0b2dlbi5zaDogKENPTkZJR1VSRV9ERUZfT1BUKToKKwkgIGxpYnRvb2xpemUgb24gRGFyd2luL01hY09TWCBpcyBjYWxsZWQgZ2xpYnRvb2xpemUuCisKKzIwMDYtMDUtMDggMTA6NTk6MDUgKzAwMDAgIEplbnMgR3JhbnNldWVyIDxqZW5zZ3JAZ214Lm5ldD4KKworCSAgQzg5IGNvbXBsaWFuY2UgZml4ZXMuIEZpeGVzICMzNDA5ODAKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEplbnMgR3JhbnNldWVyIDxqZW5zZ3IgYXQgZ214IGRvdCBuZXQ+CisJICAqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmM6IChnc3RfcGl4YnVmc2NhbGVfaW5pdCk6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2Rpc3Bvc2UpOgorCSAgQzg5IGNvbXBsaWFuY2UgZml4ZXMuIEZpeGVzICMzNDA5ODAKKworMjAwNi0wNS0wNiAwOTowMTozNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2RlYy4qOiBIYW5kbGUgc2VnbWVudCBzZWVrcyB0aGF0IGluY2x1ZGUgdGhlIGVuZCBvZiB0aGUgZmlsZSBhcyBzdG9wIHBvaW50IHByb3Blcmx5OiB3aGVuIHRoZSBkZWNvZGVyLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfZGVjX2xvb3ApOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmg6CisJICBIYW5kbGUgc2VnbWVudCBzZWVrcyB0aGF0IGluY2x1ZGUgdGhlIGVuZCBvZiB0aGUgZmlsZSBhcyBzdG9wIHBvaW50CisJICBwcm9wZXJseTogd2hlbiB0aGUgZGVjb2RlciBoaXRzIEVPUyB3ZSB3YW50IHRvIHNlbmQgYSBTRUdNRU5UX0RPTkUKKwkgIG1lc3NhZ2UgaW5zdGVhZCBvZiBhbiBFT1MgZXZlbnQgaW4gY2FzZSB3ZSdyZSBpbiBzZWdtZW50IHNlZWsKKwkgIG1vZGUgKGZpeGVzICMzNDA2OTkpLgorCisyMDA2LTA1LTA2IDAwOjE0OjA5ICswMDAwICBNYWNpZWogS2F0YWZpYXN6IDxtYXRocmlja0BtYXRocmljay5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkqIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYzoKKwkqIGdzdC9kZWJ1Zy9icmVha215ZGF0YS5jOgorCSogZ3N0L2RlYnVnL3Rlc3RwbHVnaW4uYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkgIEFkZCBzZW1pY29sb25zIGFmdGVyIEdTVF9CT0lMRVJQTEFURVtfRlVMTF0gc28gdGhhdCBpbmRlbnQgZG9lc24ndCBtZXNzIHVwIGZvbGxvd2luZyBsaW5lcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQWRkIHNlbWljb2xvbnMgYWZ0ZXIgR1NUX0JPSUxFUlBMQVRFW19GVUxMXSBzbyB0aGF0IGluZGVudCBkb2Vzbid0IG1lc3MgdXAgZm9sbG93aW5nIGxpbmVzLgorCisyMDA2LTA1LTA1IDIwOjEyOjU5ICswMDAwICBNYXJ0aW4gUnVibGkgPG1hcnRpbl9ydWJsaUBsb2dpdGVjaC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJlbGVtZW50LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyZWxlbWVudC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuaDoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuaDoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuaDoKKwkqIHRlc3RzL2ljbGVzL3Y0bDJzcmMtdGVzdC5jOgorCSAgU29tZSBjaGFuZ2VzIHByb3Bvc2VkIGJ5IHdpbmdvIGluIGJ1ZyAjMzM4ODE4IChidXQgbm90IGV2ZXJ5dGhpbmcgeWV0KS4gUGF0Y2ggZnJvbSBNYXJ0aW4gUnVibGkgdG8gZml4IGZyYW1lcmF0ZSBkZXRlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFNvbWUgY2hhbmdlcyBwcm9wb3NlZCBieSB3aW5nbyBpbiBidWcgIzMzODgxOCAoYnV0IG5vdCBldmVyeXRoaW5nIHlldCkuIFBhdGNoIGZyb20gTWFydGluIFJ1YmxpIHRvIGZpeCBmcmFtZXJhdGUgZGV0ZWN0aW9uLgorCisyMDA2LTA1LTA0IDE3OjI3OjI3ICswMDAwICBNaWNoYWwgQmVuZXMgPG1pY2hhbC5iZW5lc0B4ZXJpcy5jej4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IERvbid0IGxlYWsgY2FwcyB3aGVuIGZyZWVpbmcgdGhlIHN0cmVhbSBjb250ZXh0ICgjMzQwNjIzKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE1pY2hhbCBCZW5lcyAgPG1pY2hhbCBkb3QgYmVuZXMgYXQgeGVyaXMgZG90IGN6PgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9yZXNldCk6CisJICBEb24ndCBsZWFrIGNhcHMgd2hlbiBmcmVlaW5nIHRoZSBzdHJlYW0gY29udGV4dCAoIzM0MDYyMykuCisKKzIwMDYtMDUtMDQgMTU6NDA6MTggKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBjb25maWd1cmUuYWM6IEJhY2sgdG8gQ1ZTCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBDVlMKKworPT09IHJlbGVhc2UgMC4xMC4zID09PQorCisyMDA2LTA1LTA0IDE1OjM2OjAyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlYWxseSByZWxlYXNlIDAuMTAuMworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBSZWFsbHkgcmVsZWFzZSAwLjEwLjMKKworMjAwNi0wNS0wNCAxNToyODo1MyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdGRlbXV4LnhtbDoKKwkgIFJlYWxseSByZWxlYXNlIDAuMTAuMyB0aGlzIHRpbWUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUmVhbGx5IHJlbGVhc2UgMC4xMC4zIHRoaXMgdGltZQorCisyMDA2LTA1LTA0IDE1OjA1OjAwICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnNpZ25hbHM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Rpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxhZHNwYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXRkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JhbGFuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTAuMworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBSZWxlYXNlIDAuMTAuMworCisyMDA2LTA1LTAzIDE4OjQ0OjM4ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDA2LTA1LTAzIDE4OjQxOjQ3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IERvbid0IHN0cmNtcCgpIE5VTEwgc3RyaW5ncy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX211eF9zdHJlYW1faXNfdm9yYmlzX2hlYWRlciksCisJICAoZ3N0X21hdHJvc2thX211eF93cml0ZV9kYXRhKToKKwkgIERvbid0IHN0cmNtcCgpIE5VTEwgc3RyaW5ncy4KKwkgIE9ubHkgc3RhcnQgbmV3IGNsdXN0ZXJzIG9uIHZpZGVvIGtleWZyYW1lcywgbm90IG9uIGFueQorCSAgcmFuZG9tIGF1ZGlvIGJ1ZmZlciB0aGF0IGRvZXNuJ3QgaGF2ZSB0aGUgREVMVEFfVU5JVAorCSAgZmxhZyBzZXQgKGZpeGVzICdtYWtlIGNoZWNrJyBhZ2FpbikuCisKKzIwMDYtMDUtMDMgMTQ6NTE6NTAgKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hbmF1d0Bza3luZXQuYmU+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogRG9uJ3QgbWlzaW50ZXJwcmV0IEdTVF9DTE9DS19USU1FX05PTkUgYXMgdmVyeSBoaWdoIHRpbWVzdGFtcCB2YWx1ZSBhbmQgdGhlbiBkZWFkLWxvY2sgdy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTWFyayBOYXV3ZWxhZXJ0cyAgPG1hbmF1dyBhdCBza3luZXQgYmU+CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfYmVzdF9wYWQpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfc3RyZWFtX2lzX3ZvcmJpc19oZWFkZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfZGF0YSk6CisJICBEb24ndCBtaXNpbnRlcnByZXQgR1NUX0NMT0NLX1RJTUVfTk9ORSBhcyB2ZXJ5IGhpZ2ggdGltZXN0YW1wCisJICB2YWx1ZSBhbmQgdGhlbiBkZWFkLWxvY2sgd2hlbiBtdXhpbmcgdm9yYmlzIGF1ZGlvIHN0cmVhbXMKKwkgICh0aGUgdGhyZWUgdm9yYmlzIGhlYWRlciBidWZmZXJzIGNhcnJ5IG5vIHRpbWVzdGFtcCwgYW5kIGl0CisJICB3b3VsZCB0cnkgdG8gbXV4IHRoZXNlIGFmdGVyIGFsbCB2aWRlbyBidWZmZXJzKS4gRml4ZXMgIzM0MDM0Ni4KKwkgIEltcHJvdmUgY2x1c3RlcmluZzogc3RhcnQgYSBuZXcgY2x1c3RlciBhbHNvIHdoZW5ldmVyIHdlIGdldAorCSAgYSBrZXlmcmFtZS4KKworMjAwNi0wNS0wMyAxNDozMDoyMSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQ2xlYW4gdXAgb25lIHBpZWNlIG9mIGxvZ2ljIHNsaWdodGx5IGFuZCByZW1vdmUgYSBkZWFkIGNvZGUgYmxvY2suCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIENsZWFuIHVwIG9uZSBwaWVjZSBvZiBsb2dpYyBzbGlnaHRseSBhbmQgcmVtb3ZlIGEKKwkgIGRlYWQgY29kZSBibG9jay4KKworMjAwNi0wNS0wMyAxNDoyODo1NyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGFkZCB3aW4zMiBzdHVmZgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIE1ha2VmaWxlLmFtOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIHdpbjMyL2NvbW1vbi9jb25maWcuaC5pbjoKKwkgIGFkZCB3aW4zMiBzdHVmZgorCisyMDA2LTA1LTAzIDE0OjI2OjUxICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgYWRkIHdpbjMyIHN0dWZmCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogTWFrZWZpbGUuYW06CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogd2luMzIvY29tbW9uL2NvbmZpZy5oLmluOgorCSAgYWRkIHdpbjMyIHN0dWZmCisKKzIwMDYtMDUtMDIgMjI6MzQ6NTIgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5LmM6IEZpeCB0aW1lb3ZlcmxheSBmb3Igbm9uLW11bHRpcGxlLW9mLTQgd2lkdGhzLiBUaGlzIGZvdXJjYyBjcmFwCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5LmM6IChnc3RfY2Fpcm9fdGltZV9vdmVybGF5X3RyYW5zZm9ybSk6CisJICBGaXggdGltZW92ZXJsYXkgZm9yIG5vbi1tdWx0aXBsZS1vZi00IHdpZHRocy4gVGhpcyBmb3VyY2MgY3JhcAorCSAgU1VDS1MuCisKKzIwMDYtMDUtMDIgMjE6NTI6NDggKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgRml4IGdldF9jYXBzIGZ1bmMgdG8gd29yayB3aGVuIG5vIGZyYW1lcmF0ZSBpcyBhdmFpbGFibGUgYW5kIHRoZSBjYXBzIGlzbid0IHNpbXBsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRml4IGdldF9jYXBzIGZ1bmMgdG8gd29yayB3aGVuIG5vIGZyYW1lcmF0ZSBpcyBhdmFpbGFibGUgYW5kIHRoZSBjYXBzIGlzbid0IHNpbXBsZS4KKworMjAwNi0wNS0wMiAxODo1MDoyMyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvOiBkb24ndCBsZWFrIGNhcHMtc3RyaW5nCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzogKGdzdF9hbHBoYV9jb2xvcl90cmFuc2Zvcm1fY2Fwcyk6CisJICAqIGdzdC9kZWJ1Zy9uZWdvdGlhdGlvbi5jOiAoZ3N0X25lZ290aWF0aW9uX3VwZGF0ZV9jYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzogKGdzdF9ydHBfaWxiY19kZXBheV9zZXRjYXBzKToKKwkgIGRvbid0IGxlYWsgY2Fwcy1zdHJpbmcKKworMjAwNi0wNS0wMiAxNTo0NjowMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IExldCBjb3JlIGluc2VydCBkZWZhdWx0IGVycm9yIG1lc3NhZ2UgZm9yIFRZUEVfTk9UX0ZPVU5EIGVycm9ycywgaXQncyBqdXN0IGFzIGdvb2QgYXMgb3VyLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfaWQzZGVtdXhfY2hhaW4pLAorCSAgKGdzdF9pZDNkZW11eF9zaW5rX2FjdGl2YXRlKToKKwkgIExldCBjb3JlIGluc2VydCBkZWZhdWx0IGVycm9yIG1lc3NhZ2UgZm9yIFRZUEVfTk9UX0ZPVU5ECisJICBlcnJvcnMsIGl0J3MganVzdCBhcyBnb29kIGFzIG91ciBvd24gYW5kIGhhcyB0aGUgYWRkZWQKKwkgIGJvbnVzIG9mIGJlaW5nIHRyYW5zbGF0ZWQuCisKKzIwMDYtMDUtMDIgMTU6NDA6MTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC86IFBvc3QgYW4gZXJyb3IgbWVzc2FnZSB3aGVuIHdlIGdldCBhbiBFT1MgZXZlbnQgYW5kIHdlcmUgbm90IGFibGUgdG8gZmluZCBvdXQgdGhlIHR5cGUgb2Ygc3RyZWFtLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hcGV0YWcvZ3N0dGFnZGVtdXguYzogKGdzdF90YWdfZGVtdXhfaW5pdCksCisJICAoZ3N0X3RhZ19kZW11eF9zaW5rX2V2ZW50KToKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfaWQzZGVtdXhfaW5pdCksCisJICAoZ3N0X2lkM2RlbXV4X3NpbmtfZXZlbnQpOgorCSAgUG9zdCBhbiBlcnJvciBtZXNzYWdlIHdoZW4gd2UgZ2V0IGFuIEVPUyBldmVudCBhbmQgd2VyZSBub3QKKwkgIGFibGUgdG8gZmluZCBvdXQgdGhlIHR5cGUgb2Ygc3RyZWFtLgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDN2Mm11eC5jOiAoZmlsbF9tcDNfYnVmZmVyKSwgKGdvdF9idWZmZXIpLAorCSAgKHRlc3RfdGFnbGliX2lkM211eF93aXRoX3RhZ3MpOgorCSAgRGVjcmVhc2UgbnVtLWJ1ZmZlcnMgdG8gMTYgcGVyIGl0ZXJhdGlvbiBhZ2Fpbiwgb3RoZXJ3aXNlIHRoZQorCSAgbWFueSBtZW1jcHkoKXMgYW5kIHJlYWxsb2NhdGlvbnMgaW4gdGhlIHRlc3Qgd2lsbCBoYW1tZXIgc2xvdworCSAgQ1BVcyBjb21wbGV0ZWx5IGFuZCBtYWtlIHRoZSB0ZXN0IHRpbWVvdXQuCisKKzIwMDYtMDUtMDIgMTM6MjQ6MzggKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBjb25maWd1cmUuYWM6IGZpZ3VyZSBvdXQgd2hlcmUgcGx1Z2lucy1iYXNlIHBsdWdpbnMgYXJlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgZmlndXJlIG91dCB3aGVyZSBwbHVnaW5zLWJhc2UgcGx1Z2lucyBhcmUKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICB1c2UgcGx1Z2lucy1iYXNlIHBsdWdpbnMsIHNvIHdlIGhhdmUgdHlwZWZpbmQgZnVuY3Rpb25zCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM3YybXV4LmM6ICh0ZXN0X3RhZ2xpYl9pZDNtdXhfd2l0aF90YWdzKToKKwkgIGluY3JlYXNlIG51bS1idWZmZXJzLCB0aGlzIG1ha2VzIHN1cmUgdGhlIHRlc3QgZXJyb3JzIG91dCBpbnN0ZWFkCisJICBvZiB0aW1pbmcgb3V0IHdoZW4gbm8gdHlwZWZpbmQgZnVuY3Rpb25zIGFyZSBwcmVzZW50CisKKzIwMDYtMDUtMDIgMTM6MDE6NTAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIGZpeCBkb2NzIGZvciB3YXZwYXJzZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBmaXggZG9jcyBmb3Igd2F2cGFyc2UKKworMjAwNi0wNS0wMSAyMTozNzo1MSArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ4b3ZlcmxheS5jOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSogdGVzdHMvaWNsZXMvdjRsMnNyYy10ZXN0LmM6CisJICBGZXcgaW1wcm92ZW1lbnRzIHRvIG1vdmUgdG8gZ29vZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRmV3IGltcHJvdmVtZW50cyB0byBtb3ZlIHRvIGdvb2QuCisKKzIwMDYtMDUtMDEgMTE6NDY6MzMgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06IGFsc28gY2hlY2sgLmNjIGZpbGVzIGZvciBndGstZG9jIG1hcmt1cAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgIGFsc28gY2hlY2sgLmNjIGZpbGVzIGZvciBndGstZG9jIG1hcmt1cAorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM3YybXV4LmM6IChpZDN2Mm11eF9zdWl0ZSksIChtYWluKToKKwkgICogZXh0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGFnbGliL01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGFnbGliL2dzdGlkM3YybXV4Lmg6CisJICAqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4LmM6CisJICAqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4Lmg6CisJICBtb3ZlIHRhZ2xpYi1iYXNlZCBpZDN2Mm11eGVyIHRvIC1nb29kLiAgRml4ZXMgIzMzNjExMC4KKworMjAwNi0wNS0wMSAxMTo0NToxNSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJICBhZGQgaWN5ZGVtdXggaW5zcGVjdGlvbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgaWN5ZGVtdXggaW5zcGVjdGlvbgorCisyMDA2LTA1LTAxIDExOjQzOjMxICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogcG8vUE9URklMRVMuaW46CisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vY3MucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSAgYWRkIHhpbWFnZXNyYyBmb3IgdHJhbnNsYXRpb24KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkIHhpbWFnZXNyYyBmb3IgdHJhbnNsYXRpb24KKworMjAwNi0wNC0zMCAxNjoxNjo1OSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJKiBleHQvdGFnbGliL2dzdHRhZ2xpYm11eC5jOgorCSAgc21hbGwgY2xlYW51cHMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgc21hbGwgY2xlYW51cHMKKworMjAwNi0wNC0zMCAxNTozMjoxMyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJICBmaXggZG9jcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBmaXggZG9jcworCisyMDA2LTA0LTMwIDE0OjU1OjE1ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF0ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJICB1cGRhdGUgdG8gbGF0ZXN0IHZlcnNpb24KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdXBkYXRlIHRvIGxhdGVzdCB2ZXJzaW9uCisKKzIwMDYtMDQtMjkgMTg6NDY6MzYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC90YWdsaWIvZ3N0dGFnbGliLmNjOiBQb3N0IGFuIGVycm9yIG1lc3NhZ2Ugb24gdGhlIGJ1cyBpbiB0aGUgKGV4dHJlbWVseSB1bmxpa2VseSkgY2FzZSBvZiBhbiBlcnJvci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvdGFnbGliL2dzdHRhZ2xpYi5jYzoKKwkgIFBvc3QgYW4gZXJyb3IgbWVzc2FnZSBvbiB0aGUgYnVzIGluIHRoZSAoZXh0cmVtZWx5IHVubGlrZWx5KQorCSAgY2FzZSBvZiBhbiBlcnJvci4KKworMjAwNi0wNC0yOSAxODoxODoyNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L3RhZ2xpYi86IFNwbGl0IHRoZSBhY3R1YWwgSUQzdjIgdGFnIHJlbmRlcmluZyBjb2RlIGludG8gaXRzIG93biBzdWJjbGFzcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvdGFnbGliL01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSAgKiBleHQvdGFnbGliL2dzdGlkM3YybXV4Lmg6CisJICAqIGV4dC90YWdsaWIvZ3N0dGFnbGliLmNjOgorCSAgKiBleHQvdGFnbGliL2dzdHRhZ2xpYi5oOgorCSAgU3BsaXQgdGhlIGFjdHVhbCBJRDN2MiB0YWcgcmVuZGVyaW5nIGNvZGUgaW50bworCSAgaXRzIG93biBzdWJjbGFzcy4KKworMjAwNi0wNC0yOSAxNjoxNDoyMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IC4uLiBhbmQgZml4IG11bHRpY2hhbm5lbC9XQVZGT1JNQVRFWCBzdXBwb3J0IGFnYWluLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKToKKwkgIC4uLiBhbmQgZml4IG11bHRpY2hhbm5lbC9XQVZGT1JNQVRFWCBzdXBwb3J0IGFnYWluLgorCisyMDA2LTA0LTI4IDIzOjA5OjE3ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS4qOiBBZGQgcHVzaCAoc3RyZWFtaW5nKSBtb2RlIHRvIHdhdnBhcnNlIChmaXhlcyAjMzM3NjI1KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2Jhc2VfaW5pdCksCisJICAoZ3N0X3dhdnBhcnNlX2NsYXNzX2luaXQpLCAoZ3N0X3dhdnBhcnNlX2Rpc3Bvc2UpLAorCSAgKGdzdF93YXZwYXJzZV9yZXNldCksIChnc3Rfd2F2cGFyc2VfaW5pdCksCisJICAoZ3N0X3dhdnBhcnNlX2NyZWF0ZV9zb3VyY2VwYWQpLCAoZ3N0X3dhdnBhcnNlX3BhcnNlX2FkdGwpLAorCSAgKGdzdF93YXZwYXJzZV9wYXJzZV9jdWVzKSwgKGdzdF93YXZwYXJzZV9wYXJzZV9maWxlX2hlYWRlciksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9pbml0KSwgKGdzdF93YXZwYXJzZV9wZXJmb3JtX3NlZWspLAorCSAgKGdzdF93YXZwYXJzZV9wZWVrX2NodW5rX2luZm8pLCAoZ3N0X3dhdnBhcnNlX3BlZWtfY2h1bmspLAorCSAgKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksIChnc3Rfd2F2cGFyc2VfcGFyc2Vfc3RyZWFtX2luaXQpLAorCSAgKGdzdF93YXZwYXJzZV9zZW5kX2V2ZW50KSwgKGdzdF93YXZwYXJzZV9hZGRfc3JjX3BhZCksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhKSwgKGdzdF93YXZwYXJzZV9sb29wKSwKKwkgIChnc3Rfd2F2cGFyc2VfY2hhaW4pLCAoZ3N0X3dhdnBhcnNlX3NyY3BhZF9ldmVudCksCisJICAoZ3N0X3dhdnBhcnNlX3NpbmtfYWN0aXZhdGUpLCAoZ3N0X3dhdnBhcnNlX3NpbmtfYWN0aXZhdGVfcHVsbCksCisJICAoZ3N0X3dhdnBhcnNlX2NoYW5nZV9zdGF0ZSksIChwbHVnaW5faW5pdCk6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5oOgorCSAgQWRkIHB1c2ggKHN0cmVhbWluZykgbW9kZSB0byB3YXZwYXJzZSAoZml4ZXMgIzMzNzYyNSkKKworMjAwNi0wNC0yOCAyMTo0MzowNyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM3YybXV4LmM6CisJICBlbGVtZW50IHJlbmFtZWQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZWxlbWVudCByZW5hbWVkCisKKzIwMDYtMDQtMjggMTk6MjI6NDYgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkgIGFkZCBwbHVnaW4gZG9jcyBmb3IgeGltYWdlc3JjCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCBwbHVnaW4gZG9jcyBmb3IgeGltYWdlc3JjCisKKzIwMDYtMDQtMjggMTk6MTU6MDggKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBhZGQgeGltYWdlc3JjIGljbGVzIHRlc3QKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIHRlc3RzL01ha2VmaWxlLmFtOgorCSAgYWRkIHhpbWFnZXNyYyBpY2xlcyB0ZXN0CisKKzIwMDYtMDQtMjggMTg6NTc6MDkgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBNb3ZlIHhpbWFnZXNyYyBwbHVnLWluIHRvIGdvb2QgYWZ0ZXIgcmV2aWV3LiAgRml4ZXMgIzMzNjc1Ni4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1sZW5jLmM6IChnc3RfY21tbF9lbmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X2NtbWxfZW5jX3B1c2hfY2xpcCk6CisJICAqIHN5cy9NYWtlZmlsZS5hbToKKwkgICogc3lzL3hpbWFnZS9NYWtlZmlsZS5hbToKKwkgICogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIE1vdmUgeGltYWdlc3JjIHBsdWctaW4gdG8gZ29vZCBhZnRlciByZXZpZXcuICBGaXhlcyAjMzM2NzU2LgorCisyMDA2LTA0LTI4IDE2OjUxOjMzICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmg6CisJICBib3JnaWZ5IG5hbWluZworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBib3JnaWZ5IG5hbWluZworCisyMDA2LTA0LTI4IDE2OjQ2OjUyICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIGRvYyB0d2Vha3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZG9jIHR3ZWFrcworCisyMDA2LTA0LTI4IDE2OjE1OjIwICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogc3lzL3hpbWFnZS9NYWtlZmlsZS5hbToKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICBjbGVhbiB1cCBNYWtlZmlsZS5hbQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBjbGVhbiB1cCBNYWtlZmlsZS5hbQorCisyMDA2LTA0LTI4IDE1OjMzOjA5ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZXh0L3RhZ2xpYi9nc3R0YWdsaWJtdXguYzoKKwkqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4Lmg6CisJICBwZWRhbnRpYyBjbGVhbnVwcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBwZWRhbnRpYyBjbGVhbnVwcworCisyMDA2LTA0LTI4IDE0OjU3OjU3ICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC4qOiBGaXggZXZlbnQgaGFuZGxpbmc6IGNhY2hlIGV2ZW50cyB3aGVuIHR5cGVmaW5kaW5nIGFuZCBmb3J3YXJkIGxhdGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOiAoZ3N0X2ljeWRlbXV4X3Jlc2V0KSwgICAgICAgICAoZ3N0X2ljeWRlbXV4X2luaXQpLCAoZ3N0X2ljeWRlbXV4X3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X2ljeWRlbXV4X2FkZF9zcmNwYWQpLCAoZ3N0X2ljeWRlbXV4X3BhcnNlX2FuZF9zZW5kX3RhZ3MpLAorCSAgKGdzdF9pY3lkZW11eF9oYW5kbGVfZXZlbnQpLCAoZ3N0X2ljeWRlbXV4X3NlbmRfY2FjaGVkX2V2ZW50cyksCisJICAoZ3N0X2ljeWRlbXV4X3R5cGVmaW5kX29yX2ZvcndhcmQpLCAoZ3N0X2ljeWRlbXV4X2FkZF9tZXRhKSwKKwkgIChnc3RfaWN5ZGVtdXhfY2hhaW4pLCAoZ3N0X2ljeWRlbXV4X3NlbmRfdGFnX2V2ZW50KToKKwkgICogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4Lmg6CisJICBGaXggZXZlbnQgaGFuZGxpbmc6IGNhY2hlIGV2ZW50cyB3aGVuIHR5cGVmaW5kaW5nIGFuZCBmb3J3YXJkIGxhdGVyLgorCisyMDA2LTA0LTI4IDE0OjU1OjIwICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6IFJlZ2lzdGVyIG9zeGF1ZGlvc3JjIHRvIHRoZSBwbHVnaW4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDQtMjggIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSAgKHBsdWdpbl9pbml0KToKKwkgIFJlZ2lzdGVyIG9zeGF1ZGlvc3JjIHRvIHRoZSBwbHVnaW4uCisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSAgKGdzdF9vc3hfYXVkaW9fc3JjX29zeGVsZW1lbnRfZG9faW5pdCksCisJICAoZ3N0X29zeF9hdWRpb19zcmNfYmFzZV9pbml0KSwgKGdzdF9vc3hfYXVkaW9fc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9vc3hfYXVkaW9fc3JjX2luaXQpLCAoZ3N0X29zeF9hdWRpb19zcmNfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfb3N4X2F1ZGlvX3NyY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9vc3hfYXVkaW9fc3JjX2NyZWF0ZV9yaW5nYnVmZmVyKSwgKGdzdF9vc3hfYXVkaW9fc3JjX2lvX3Byb2MpLAorCSAgKGdzdF9vc3hfYXVkaW9fc3JjX29zeGVsZW1lbnRfaW5pdCk6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5oOgorCSAgUG9ydCBvZiBvc3hhdWRpb3NyYyB0byAwLjEwLgorCSAgKiBzeXMvb3N4YXVkaW8vTWFrZWZpbGUuYW06CisJICBBZGQgb3N4YXVkaW9zcmMKKworMjAwNi0wNC0yOCAxMjowMDozOSArMDAwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSAgY29tbWl0IENoYW5nZWxvZyBmb3IgcHJldmlvdXMgY29tbWl0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGNvbW1pdCBDaGFuZ2Vsb2cgZm9yIHByZXZpb3VzIGNvbW1pdAorCisyMDA2LTA0LTI4IDExOjU3OjM5ICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4cmluZ2J1ZmZlci5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeHJpbmdidWZmZXIuaDoKKwkgIEZvcmdvdCB0byBjb21taXQsIHF1aWNrIGNvbW1pdCBiZTQgYXBwbGUgZGllcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGb3Jnb3QgdG8gY29tbWl0LCBxdWljayBjb21taXQgYmU0IGFwcGxlIGRpZXMKKworMjAwNi0wNC0yOCAxMTozNzoyMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IFJlY29nbmlzZSBhbmQgc2tpcCBhbnkgYnl0ZSBvcmRlciBtYXJrZXIgKEJPTSkgaW4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKGhhc191dGYxNl9ib20pLAorCSAgKHBhcnNlX3NwbGl0X3N0cmluZ3MpOgorCSAgUmVjb2duaXNlIGFuZCBza2lwIGFueSBieXRlIG9yZGVyIG1hcmtlciAoQk9NKSBpbgorCSAgVVRGLTE2IHN0cmluZ3MuCisKKzIwMDYtMDQtMjcgMTY6MDU6NTQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIEFkZCBkb2NzIGZvciBib3RoIGF2aWRlbXV4IGFuZCBhdmltdXguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgQWRkIGRvY3MgZm9yIGJvdGggYXZpZGVtdXggYW5kIGF2aW11eC4KKworMjAwNi0wNC0yNyAxNDo1MTowNiArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3QHNreW5ldC5iZT4KKworCSAgZ3N0L2F2aS86IFBvcnQgQVZJIG11eGVyIHRvIEdTdHJlYW1lci0wLjEwICgjMzMyMDMxKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE1hcmsgTmF1d2VsYWVydHMgIDxtYW5hdXcgYXQgc2t5bmV0IGRvdCBiZT4KKwkgICogZ3N0L2F2aS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F2aS9nc3RhdmkuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzogKGdzdF9hdmlfbXV4X2dldF90eXBlKSwKKwkgIChnc3RfYXZpX211eF9iYXNlX2luaXQpLCAoZ3N0X2F2aV9tdXhfZmluYWxpemUpLAorCSAgKGdzdF9hdmlfbXV4X2NsYXNzX2luaXQpLCAoZ3N0X2F2aV9tdXhfaW5pdCksCisJICAoZ3N0X2F2aV9tdXhfdmlkc2lua19zZXRfY2FwcyksIChnc3RfYXZpX211eF9hdWRzaW5rX3NldF9jYXBzKSwKKwkgIChnc3RfYXZpX211eF9wYWRfbGluayksIChnc3RfYXZpX211eF9wYWRfdW5saW5rKSwKKwkgIChnc3RfYXZpX211eF9yZXF1ZXN0X25ld19wYWQpLCAoZ3N0X2F2aV9tdXhfcmVsZWFzZV9wYWQpLAorCSAgKGdzdF9hdmlfbXV4X3dyaXRlX3RhZyksIChnc3RfYXZpX211eF9yaWZmX2dldF9hdmlfaGVhZGVyKSwKKwkgIChnc3RfYXZpX211eF9yaWZmX2dldF9hdml4X2hlYWRlciksCisJICAoZ3N0X2F2aV9tdXhfcmlmZl9nZXRfdmlkZW9faGVhZGVyKSwKKwkgIChnc3RfYXZpX211eF9yaWZmX2dldF9hdWRpb19oZWFkZXIpLCAoZ3N0X2F2aV9tdXhfYWRkX2luZGV4KSwKKwkgIChnc3RfYXZpX211eF93cml0ZV9pbmRleCksIChnc3RfYXZpX211eF9iaWdmaWxlKSwKKwkgIChnc3RfYXZpX211eF9zdGFydF9maWxlKSwgKGdzdF9hdmlfbXV4X3N0b3BfZmlsZSksCisJICAoZ3N0X2F2aV9tdXhfcmVzdGFydF9maWxlKSwgKGdzdF9hdmlfbXV4X2hhbmRsZV9ldmVudCksCisJICAoZ3N0X2F2aV9tdXhfZmlsbF9xdWV1ZSksIChnc3RfYXZpX211eF9zZW5kX3BhZF9kYXRhKSwKKwkgIChnc3RfYXZpX211eF9zdHJpcF9idWZmZXIpLCAoZ3N0X2F2aV9tdXhfZG9fYXVkaW9fYnVmZmVyKSwKKwkgIChnc3RfYXZpX211eF9kb192aWRlb19idWZmZXIpLCAoZ3N0X2F2aV9tdXhfZG9fb25lX2J1ZmZlciksCisJICAoZ3N0X2F2aV9tdXhfbG9vcCksIChnc3RfYXZpX211eF9jb2xsZWN0X3BhZHMpLAorCSAgKGdzdF9hdmlfbXV4X2dldF9wcm9wZXJ0eSksIChnc3RfYXZpX211eF9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdmlfbXV4X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4Lmg6CisJICBQb3J0IEFWSSBtdXhlciB0byBHU3RyZWFtZXItMC4xMCAoIzMzMjAzMSkuCisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdmltdXguYzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgIEFkZCB1bml0IHRlc3QgZm9yIEFWSSBtdXhlci4KKworMjAwNi0wNC0yNiAyMToyOTo0NSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuKjogcmV2ZXJ0ZWQgcGF0Y2ggIzMzNzYyNSBmb3IgdGhlIHByaWNlIG9mIDEgaG91ciBzbGVlcAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2Jhc2VfaW5pdCksCisJICAoZ3N0X3dhdnBhcnNlX2NsYXNzX2luaXQpLCAoZ3N0X3dhdnBhcnNlX3Jlc2V0KSwKKwkgIChnc3Rfd2F2cGFyc2VfaW5pdCksIChnc3Rfd2F2cGFyc2VfY3JlYXRlX3NvdXJjZXBhZCksCisJICAoZ3N0X3dhdnBhcnNlX3BhcnNlX2ZpbGVfaGVhZGVyKSwgKGdzdF93YXZwYXJzZV9zdHJlYW1faW5pdCksCisJICAoZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2VlayksIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMpLAorCSAgKGdzdF93YXZwYXJzZV9zZW5kX2V2ZW50KSwgKGdzdF93YXZwYXJzZV9hZGRfc3JjX3BhZCksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhKSwgKGdzdF93YXZwYXJzZV9sb29wKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3JjcGFkX2V2ZW50KSwgKGdzdF93YXZwYXJzZV9zaW5rX2FjdGl2YXRlKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc2lua19hY3RpdmF0ZV9wdWxsKSwgKGdzdF93YXZwYXJzZV9jaGFuZ2Vfc3RhdGUpLAorCSAgKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICByZXZlcnRlZCBwYXRjaCAjMzM3NjI1IGZvciB0aGUgcHJpY2Ugb2YgMSBob3VyIHNsZWVwCisKKzIwMDYtMDQtMjYgMjA6MTE6MTggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLio6IGNvcnJlY3QgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBwdXNoIG1vZGUgKGZyb20gbXkgbGFzdCBjb21taXQpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfYmFzZV9pbml0KSwKKwkgIChnc3Rfd2F2cGFyc2VfY2xhc3NfaW5pdCksIChnc3Rfd2F2cGFyc2VfcmVzZXQpLAorCSAgKGdzdF93YXZwYXJzZV9pbml0KSwgKGdzdF93YXZwYXJzZV9jcmVhdGVfc291cmNlcGFkKSwKKwkgIChnc3Rfd2F2cGFyc2VfcGFyc2VfYWR0bCksIChnc3Rfd2F2cGFyc2VfcGFyc2VfY3VlcyksCisJICAoZ3N0X3dhdnBhcnNlX3BhcnNlX2ZpbGVfaGVhZGVyKSwgKGdzdF93YXZwYXJzZV9zdHJlYW1faW5pdCksCisJICAoZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2VlayksIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMpLAorCSAgKGdzdF93YXZwYXJzZV9zdHJlYW1fZGF0YSksIChnc3Rfd2F2cGFyc2VfbG9vcCksCisJICAoZ3N0X3dhdnBhcnNlX2NoYWluKSwgKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICBjb3JyZWN0IHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgcHVzaCBtb2RlCisJICAoZnJvbSBteSBsYXN0IGNvbW1pdCkKKworMjAwNi0wNC0yNiAxNzozNzoxMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L2VzZC9lc2RzaW5rLmM6IEZpeCBjb21waWxlIHByb2JsZW0gYnkgZGVmaW5pbmcgRVNEX01BWF9XUklURV9TSVpFIGlmIGl0IGlzIG5vdCBpbiBlc2QuaAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOgorCSAgRml4IGNvbXBpbGUgcHJvYmxlbSBieSBkZWZpbmluZyBFU0RfTUFYX1dSSVRFX1NJWkUgaWYKKwkgIGl0IGlzIG5vdCBpbiBlc2QuaAorCisyMDA2LTA0LTI2IDE3OjA4OjI0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLio6IFJld3JpdGUgYXVwYXJzZSB0byBzdWNrIGEgbGl0dGxlIGJpdCBsZXNzOiBtYWtlIHNvdXJjZSBwYWQgZHluYW1pYywgc28gZGVjb2RlYmluL3BsYXliaW4gd28uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6IChnc3RfYXVfcGFyc2VfYmFzZV9pbml0KSwKKwkgIChnc3RfYXVfcGFyc2VfY2xhc3NfaW5pdCksIChnc3RfYXVfcGFyc2VfaW5pdCksCisJICAoZ3N0X2F1X3BhcnNlX3Jlc2V0KSwgKGdzdF9hdV9wYXJzZV9hZGRfc3JjcGFkKSwKKwkgIChnc3RfYXVfcGFyc2VfcmVtb3ZlX3NyY3BhZCksIChnc3RfYXVfcGFyc2VfcGFyc2VfaGVhZGVyKSwKKwkgIChnc3RfYXVfcGFyc2VfY2hhaW4pLCAoZ3N0X2F1X3BhcnNlX3NyY19jb252ZXJ0KSwKKwkgIChnc3RfYXVfcGFyc2Vfc3JjX3F1ZXJ5KSwgKGdzdF9hdV9wYXJzZV9oYW5kbGVfc2VlayksCisJICAoZ3N0X2F1X3BhcnNlX3NpbmtfZXZlbnQpLCAoZ3N0X2F1X3BhcnNlX3NyY19ldmVudCksCisJICAoZ3N0X2F1X3BhcnNlX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuaDoKKwkgIFJld3JpdGUgYXVwYXJzZSB0byBzdWNrIGEgbGl0dGxlIGJpdCBsZXNzOiBtYWtlIHNvdXJjZSBwYWQKKwkgIGR5bmFtaWMsIHNvIGRlY29kZWJpbi9wbGF5YmluIHdvcmsgd2l0aCBub24tcmF3IGZvcm1hdHMKKwkgIGxpa2UgYWxhdy9tdWxhdzsgYWRkIHF1ZXJ5IGZ1bmN0aW9uIGZvciBkdXJhdGlvbi9wb3NpdGlvbgorCSAgcXVlcmllczsgY2hlY2sgd2hldGhlciB3ZSBoYXZlIGVub3VnaCBkYXRhIGJlZm9yZSBhdHRlbXB0aW5nCisJICB0byBwYXJzZSB0aGUgaGVhZGVyIChpbnN0ZWFkIG9mIGNyYXNoaW5nIHdoZW4gdGhhdCBpcyBub3QgdGhlCisJICBjYXNlKTsgd29yayBhcm91bmQgYXVkaW9jb252ZXJ0IHN1Y2tpbmcgYnkgc3dhcHBpbmcgZW5kaWFubmVzcworCSAgdG8gdGhlIG5hdGl2ZSBlbmRpYW5uZXNzIG91cnNlbHZlcyBmb3IgZmxvYXQgZm9ybWF0czsgc2VuZAorCSAgaW5pdGlhbCBuZXdzZWdtZW50IGV2ZW50LiBGaXhlcyAjMTYxNzEyLgorCisyMDA2LTA0LTI2IDE2OjI5OjM4ICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBzeXMvb3N4YXVkaW8vOiBQb3J0IG9mIG9zeGF1ZGlvc2luayB0byAwLjEwCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDQtMjYgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKwkgICogc3lzL29zeGF1ZGlvL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9lbGVtZW50LmM6CisJICAoZ3N0X29zeF9hdWRpb19lbGVtZW50X2dldF90eXBlKSwKKwkgIChnc3Rfb3N4X2F1ZGlvX2VsZW1lbnRfY2xhc3NfaW5pdCk6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2VsZW1lbnQuaDoKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSAgKGdzdF9vc3hfYXVkaW9fc2lua19vc3hlbGVtZW50X2RvX2luaXQpLAorCSAgKGdzdF9vc3hfYXVkaW9fc2lua19iYXNlX2luaXQpLCAoZ3N0X29zeF9hdWRpb19zaW5rX2NsYXNzX2luaXQpLAorCSAgKGdzdF9vc3hfYXVkaW9fc2lua19pbml0KSwgKGdzdF9vc3hfYXVkaW9fc2lua19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9vc3hfYXVkaW9fc2lua19nZXRfcHJvcGVydHkpLCAoZ3N0X29zeF9hdWRpb19zaW5rX2dldGNhcHMpLAorCSAgKGdzdF9vc3hfYXVkaW9fc2lua19jcmVhdGVfcmluZ2J1ZmZlciksCisJICAoZ3N0X29zeF9hdWRpb19zaW5rX2lvX3Byb2MpLCAoZ3N0X29zeF9hdWRpb19zaW5rX29zeGVsZW1lbnRfaW5pdCksCisJICAocGx1Z2luX2luaXQpOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmg6CisJICBQb3J0IG9mIG9zeGF1ZGlvc2luayB0byAwLjEwCisKKzIwMDYtMDQtMjYgMDg6NTU6MjcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9lc2QvZXNkc2luay5jOiBBbHdheXMgd3JpdGUgRVNEX0JVRl9TSVpFIGJ5dGVzIGFuZCB1c2UgRVNEX01BWF9XUklURV9TSVpFIGFzIHRoZSBzaXplIG9mIHRoZSByaW5nYnVmZmVyLiBUaGlzIHNoby4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfcHJlcGFyZSksIChnc3RfZXNkc2lua19kZWxheSk6CisJICBBbHdheXMgd3JpdGUgRVNEX0JVRl9TSVpFIGJ5dGVzIGFuZCB1c2UgRVNEX01BWF9XUklURV9TSVpFIGFzCisJICB0aGUgc2l6ZSBvZiB0aGUgcmluZ2J1ZmZlci4gVGhpcyBzaG91bGQgZml4IGhhbmdzIHdpdGggb2xkZXIKKwkgIGVzZCBzb3VuZCBzZXJ2ZXJzLgorCisyMDA2LTA0LTI1IDIxOjU2OjM4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIERlZmluZSBHc3RFbGVtZW50RGV0YWlscyBhcyBjb25zdCBhbmQgYWxzbyBzdGF0aWMgKHdoZW4gZGVmaW5lZCBhcyBnbG9iYWwpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2FtcndiL2dzdGFtcndiZGVjLmM6CisJICAqIGV4dC9hbXJ3Yi9nc3RhbXJ3YmVuYy5jOgorCSAgKiBleHQvYW1yd2IvZ3N0YW1yd2JwYXJzZS5jOgorCSAgKiBleHQvYXJ0cy9nc3RfYXJ0cy5jOgorCSAgKiBleHQvYXJ0c2QvZ3N0YXJ0c2RzaW5rLmM6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZwYXJzZS5jOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmc2luay5jOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmc3JjLmM6CisJICAqIGV4dC9hdWRpb3Jlc2FtcGxlL2dzdGF1ZGlvcmVzYW1wbGUuYzoKKwkgICogZXh0L2J6Mi9nc3RiejJkZWMuYzoKKwkgICogZXh0L2J6Mi9nc3RiejJlbmMuYzoKKwkgICogZXh0L2NkYXVkaW8vZ3N0Y2RhdWRpby5jOgorCSAgKiBleHQvZGlyZWN0ZmIvZGZidmlkZW9zaW5rLmM6CisJICAqIGV4dC9kaXZ4L2dzdGRpdnhkZWMuYzoKKwkgICogZXh0L2RpdngvZ3N0ZGl2eGVuYy5jOgorCSAgKiBleHQvZHRzL2dzdGR0c2RlYy5jOiAoZ3N0X2R0c2RlY19iYXNlX2luaXQpOgorCSAgKiBleHQvZmFhYy9nc3RmYWFjLmM6IChnc3RfZmFhY19iYXNlX2luaXQpOgorCSAgKiBleHQvZmFhZC9nc3RmYWFkLmM6CisJICAqIGV4dC9nc20vZ3N0Z3NtZGVjLmM6CisJICAqIGV4dC9nc20vZ3N0Z3NtZW5jLmM6CisJICAqIGV4dC9oZXJtZXMvZ3N0aGVybWVzY29sb3JzcGFjZS5jOgorCSAgKiBleHQvaXZvcmJpcy92b3JiaXNmaWxlLmM6CisJICAqIGV4dC9sY3MvZ3N0Y29sb3JzcGFjZS5jOgorCSAgKiBleHQvbGliZmFtZS9nc3RsaWJmYW1lLmM6CisJICAqIGV4dC9saWJtbXMvZ3N0bW1zLmM6IChnc3RfbW1zX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9tdXNlcGFjay9nc3RtdXNlcGFja2RlYy5jOiAoZ3N0X211c2VwYWNrZGVjX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9tdXNpY2JyYWluei9nc3R0cm0uYzogKGdzdF9tdXNpY2JyYWluel9iYXNlX2luaXQpOgorCSAgKiBleHQvbmFzL25hc3NpbmsuYzogKGdzdF9uYXNzaW5rX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9uZW9uL2dzdG5lb25odHRwc3JjLmM6CisJICAqIGV4dC9zZGwvc2RsYXVkaW9zaW5rLmM6CisJICAqIGV4dC9zZGwvc2RsdmlkZW9zaW5rLmM6CisJICAqIGV4dC9zaG91dC9nc3RzaG91dC5jOgorCSAgKiBleHQvc25hcHNob3QvZ3N0c25hcHNob3QuYzoKKwkgICogZXh0L3NuZGZpbGUvZ3N0c2YuYzoKKwkgICogZXh0L3N3ZmRlYy9nc3Rzd2ZkZWMuYzoKKwkgICogZXh0L3Rhcmtpbi9nc3R0YXJraW5kZWMuYzoKKwkgICogZXh0L3Rhcmtpbi9nc3R0YXJraW5lbmMuYzoKKwkgICogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX2Jhc2VfaW5pdCk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiAoZ3N0X3dhdnBhY2tfcGFyc2VfYmFzZV9pbml0KToKKwkgICogZXh0L3h2aWQvZ3N0eHZpZGRlYy5jOgorCSAgKiBleHQveHZpZC9nc3R4dmlkZW5jLmM6CisJICAqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXBhcnNlLmM6IChnc3RfY2R4YV9wYXJzZV9iYXNlX2luaXQpOgorCSAgKiBnc3QvY2R4YXBhcnNlL2dzdGNkeGFzdHJpcC5jOiAoZ3N0X2NkeGFzdHJpcF9iYXNlX2luaXQpOgorCSAgKiBnc3QvY2hhcnQvZ3N0Y2hhcnQuYzoKKwkgICogZ3N0L2NvbG9yc3BhY2UvZ3N0Y29sb3JzcGFjZS5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzogKGdzdF9paXJfZXF1YWxpemVyX2Jhc2VfaW5pdCk6CisJICAqIGdzdC9mZXN0aXZhbC9nc3RmZXN0aXZhbC5jOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYzoKKwkgICogZ3N0L2ZpbHRlci9nc3RpaXIuYzoKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6CisJICAqIGdzdC9mcmVlemUvZ3N0ZnJlZXplLmM6CisJICAqIGdzdC9nYW1lcy9nc3RwdXp6bGUuYzogKGdzdF9wdXp6bGVfYmFzZV9pbml0KToKKwkgICogZ3N0L2xpYnJmYi9nc3RyZmJzcmMuYzoKKwkgICogZ3N0L21peG1hdHJpeC9taXhtYXRyaXguYzoKKwkgICogZ3N0L21wZWcxc3lzL2dzdG1wZWcxc3lzdGVtZW5jb2RlLmM6CisJICAqIGdzdC9tcGVnMXZpZGVvcGFyc2UvZ3N0bXAxdmlkZW9wYXJzZS5jOgorCSAgKiBnc3QvbXBlZzJzdWIvZ3N0bXBlZzJzdWJ0LmM6CisJICAqIGdzdC9tcGVnYXVkaW9wYXJzZS9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSAgKiBnc3QvbXVsdGlmaWxlc2luay9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICAqIGdzdC9vdmVybGF5L2dzdG92ZXJsYXkuYzoKKwkgICogZ3N0L3Bhc3N0aHJvdWdoL2dzdHBhc3N0aHJvdWdoLmM6CisJICAqIGdzdC9wbGF5b25kZW1hbmQvZ3N0cGxheW9uZGVtYW5kLmM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgICogZ3N0L3J0anBlZy9nc3RydGpwZWdkZWMuYzoKKwkgICogZ3N0L3J0anBlZy9nc3RydGpwZWdlbmMuYzoKKwkgICogZ3N0L3Ntb290aC9nc3RzbW9vdGguYzoKKwkgICogZ3N0L3Ntb290aHdhdmUvZ3N0c21vb3Rod2F2ZS5jOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgICogZ3N0L3NwZWVkL2dzdHNwZWVkLmM6CisJICAqIGdzdC9zdGVyZW8vZ3N0c3RlcmVvLmM6CisJICAqIGdzdC9zd2l0Y2gvZ3N0c3dpdGNoLmM6CisJICAqIGdzdC90dGEvZ3N0dHRhZGVjLmM6IChnc3RfdHRhX2RlY19iYXNlX2luaXQpOgorCSAgKiBnc3QvdHRhL2dzdHR0YXBhcnNlLmM6IChnc3RfdHRhX3BhcnNlX2Jhc2VfaW5pdCk6CisJICAqIGdzdC92YmlkZWMvZ3N0dmJpZGVjLmM6CisJICAqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJICAqIGdzdC92aWRlb2Ryb3AvZ3N0dmlkZW9kcm9wLmM6CisJICAqIGdzdC92aXJ0dWFsZHViL2dzdHhzaGFycGVuLmM6CisJICAqIGdzdC94aW5naGVhZGVyL2dzdHhpbmdtdXguYzogKGdzdF94aW5nX211eF9iYXNlX2luaXQpOgorCSAgKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgKiBzeXMvY2Ryb20vZ3N0Y2RwbGF5ZXIuYzoKKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkgICogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgKiBzeXMvZ2xzaW5rL2dsaW1hZ2VzaW5rLmM6CisJICAqIHN5cy9xY2FtL2dzdHFjYW1zcmMuYzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgKiBzeXMvdmNkL3ZjZHNyYy5jOiAoZ3N0X3ZjZHNyY19iYXNlX2luaXQpOgorCSAgKiBzeXMveGltYWdlc3JjL3hpbWFnZXNyYy5jOgorCSAgRGVmaW5lIEdzdEVsZW1lbnREZXRhaWxzIGFzIGNvbnN0IGFuZCBhbHNvIHN0YXRpYyAod2hlbiBkZWZpbmVkIGFzCisJICBnbG9iYWwpCisKKzIwMDYtMDQtMjUgMjE6Mzk6NDYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgRGVmaW5lIEdzdEVsZW1lbnREZXRhaWxzIGFzIGNvbnN0IGFuZCBhbHNvIHN0YXRpYyAod2hlbiBkZWZpbmVkIGFzIGdsb2JhbCkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuYzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzoKKwkgICogZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5LmM6CisJICAqIGV4dC9jZGlvL2dzdGNkaW9jZGRhc3JjLmM6CisJICAqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSAgKiBleHQvZXNkL2VzZG1vbi5jOgorCSAgKiBleHQvZXNkL2VzZHNpbmsuYzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjdGFnLmM6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOiAoZ3N0X2djb25mX2F1ZGlvX3NpbmtfYmFzZV9pbml0KToKKwkgICogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuYzogKGdzdF9nY29uZl9hdWRpb19zcmNfYmFzZV9pbml0KToKKwkgICogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zaW5rLmM6IChnc3RfZ2NvbmZfdmlkZW9fc2lua19iYXNlX2luaXQpOgorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NyYy5jOiAoZ3N0X2djb25mX3ZpZGVvX3NyY19iYXNlX2luaXQpOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5jOgorCSAgKiBleHQvaGFsL2dzdGhhbGF1ZGlvc2luay5jOiAoZ3N0X2hhbF9hdWRpb19zaW5rX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9oYWwvZ3N0aGFsYXVkaW9zcmMuYzogKGdzdF9oYWxfYXVkaW9fc3JjX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAgKiBleHQvanBlZy9nc3RzbW9rZWRlYy5jOgorCSAgKiBleHQvanBlZy9nc3RzbW9rZWVuYy5jOgorCSAgKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5jOgorCSAgKiBleHQvbGlibW5nL2dzdG1uZ2RlYy5jOgorCSAgKiBleHQvbGlibW5nL2dzdG1uZ2VuYy5jOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOgorCSAgKiBleHQvbWlrbW9kL2dzdG1pa21vZC5jOgorCSAgKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkgICogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzogKGdzdF9zaG91dDJzZW5kX2luaXQpOgorCSAgKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5oOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJICAqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSAgKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6CisJICAqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzoKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSAgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfYmFzZV9pbml0KToKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jOgorCSAgKGdzdF9hdXRvX3ZpZGVvX3NpbmtfYmFzZV9pbml0KToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9iYXNlX2luaXQpOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aW11eF9iYXNlX2luaXQpOgorCSAgKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOgorCSAgKiBnc3QvZGVidWcvYnJlYWtteWRhdGEuYzoKKwkgICogZ3N0L2RlYnVnL2VmZW5jZS5jOgorCSAgKiBnc3QvZGVidWcvZ3N0bmF2aWdhdGlvbnRlc3QuYzoKKwkgICogZ3N0L2RlYnVnL2dzdG5hdnNlZWsuYzoKKwkgICogZ3N0L2RlYnVnL25lZ290aWF0aW9uLmM6CisJICAqIGdzdC9kZWJ1Zy9wcm9ncmVzc3JlcG9ydC5jOgorCSAgKiBnc3QvZGVidWcvdGVzdHBsdWdpbi5jOgorCSAgKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSAgKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJICAqIGdzdC9lZmZlY3R2L2dzdGVkZ2UuYzoKKwkgICogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkgICogZ3N0L2VmZmVjdHYvZ3N0cmV2LmM6CisJICAqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYzoKKwkgICogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5jOgorCSAgKiBnc3QvZWZmZWN0di9nc3R3YXJwLmM6CisJICAqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJICAqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkgICogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkgICogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSAgKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6IChnc3RfYWxhd2RlY19iYXNlX2luaXQpOgorCSAgKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6IChnc3RfYWxhd2VuY19iYXNlX2luaXQpOgorCSAgKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOiAoZ3N0X211bGF3ZGVjX2Jhc2VfaW5pdCk6CisJICAqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6IChnc3RfbXVsYXdlbmNfYmFzZV9pbml0KToKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X2Jhc2VfaW5pdCk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfYmFzZV9pbml0KToKKwkgICogZ3N0L21lZGlhbi9nc3RtZWRpYW4uYzoKKwkgICogZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYzoKKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSAgKiBnc3Qvb2xkY29yZS9nc3RhZ2dyZWdhdG9yLmM6CisJICAqIGdzdC9vbGRjb3JlL2dzdGZkc2luay5jOgorCSAgKiBnc3Qvb2xkY29yZS9nc3RtZDVzaW5rLmM6CisJICAqIGdzdC9vbGRjb3JlL2dzdG11bHRpZmlsZXNyYy5jOgorCSAgKiBnc3Qvb2xkY29yZS9nc3RwaXBlZmlsdGVyLmM6CisJICAqIGdzdC9vbGRjb3JlL2dzdHNoYXBlci5jOgorCSAgKiBnc3Qvb2xkY29yZS9nc3RzdGF0aXN0aWNzLmM6CisJICAqIGdzdC9ydHAvZ3N0YXN0ZXJpc2toMjYzLmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBwY21hcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzoKKwkgICogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICAqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6IChnc3RfZ2FtbWFfYmFzZV9pbml0KToKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICAqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb3RlbXBsYXRlLmM6CisJICAoZ3N0X3ZpZGVvdGVtcGxhdGVfYmFzZV9pbml0KToKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9iYXNlX2luaXQpLAorCSAgKGdzdF93YXZwYXJzZV9jbGFzc19pbml0KSwgKGdzdF93YXZwYXJzZV9kaXNwb3NlKSwKKwkgIChnc3Rfd2F2cGFyc2VfcmVzZXQpLCAoZ3N0X3dhdnBhcnNlX2luaXQpLAorCSAgKGdzdF93YXZwYXJzZV9wZXJmb3JtX3NlZWspLCAoZ3N0X3dhdnBhcnNlX3BlZWtfY2h1bmtfaW5mbyksCisJICAoZ3N0X3dhdnBhcnNlX3BlZWtfY2h1bmspLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKSwKKwkgIChnc3Rfd2F2cGFyc2VfcGFyc2Vfc3RyZWFtX2luaXQpLCAoZ3N0X3dhdnBhcnNlX3NlbmRfZXZlbnQpLAorCSAgKGdzdF93YXZwYXJzZV9hZGRfc3JjX3BhZCksIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpLAorCSAgKGdzdF93YXZwYXJzZV9jaGFpbiksIChnc3Rfd2F2cGFyc2Vfc3JjcGFkX2V2ZW50KSwKKwkgIChnc3Rfd2F2cGFyc2Vfc2lua19hY3RpdmF0ZSksIChnc3Rfd2F2cGFyc2Vfc2lua19hY3RpdmF0ZV9wdWxsKSwKKwkgIChnc3Rfd2F2cGFyc2VfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICAqIHN5cy9vc3MvZ3N0b3NzbWl4ZXJlbGVtZW50LmM6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NyYy5jOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9lbGVtZW50LmM6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyLmM6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NpbmsuYzoKKwkgIERlZmluZSBHc3RFbGVtZW50RGV0YWlscyBhcyBjb25zdCBhbmQgYWxzbyBzdGF0aWMgKHdoZW4gZGVmaW5lZCBhcworCSAgZ2xvYmFsKQorCisyMDA2LTA0LTI1IDE3OjU3OjIzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvanBlZy9nc3RqcGVnZGVjLmM6IFNvdXJjZSBwYWQgaGFzIGZpeGVkIGNhcHMuIElmIHdlIGRvbid0IHNldCB0aGlzLCBiYWQgdGhpbmdzIGhhcHBlbiB3aGVuIHRoZSB3aW5kb3cgaXMgcmVzaXplZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6IChnc3RfanBlZ19kZWNfY2hhaW4pOgorCSAgU291cmNlIHBhZCBoYXMgZml4ZWQgY2Fwcy4gSWYgd2UgZG9uJ3Qgc2V0IHRoaXMsIGJhZAorCSAgdGhpbmdzIGhhcHBlbiB3aGVuIHRoZSB3aW5kb3cgaXMgcmVzaXplZC4KKworMjAwNi0wNC0yNSAxNjozODo1MCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thLzogSGFuZGxlIGNhc2Ugd2hlcmUgdGhlIFRyYWNrVHlwZSBlYm1sIGNodW5rIGRvZXMgbm90IGNvbWUgYmVmb3JlIHRoZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJICAoZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfdmlkZW9fY29udGV4dCksCisJICAoZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfYXVkaW9fY29udGV4dCksCisJICAoZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfc3VidGl0bGVfY29udGV4dCksCisJICAoZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfY29tcGxleF9jb250ZXh0KToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgSGFuZGxlIGNhc2Ugd2hlcmUgdGhlIFRyYWNrVHlwZSBlYm1sIGNodW5rIGRvZXMgbm90IGNvbWUgYmVmb3JlIHRoZQorCSAgVHJhY2tJbmZvQXVkaW8gb3IgVHJhY2tJbmZvVmlkZW8gZWJtbCBjaHVuayAoIzMzOTQ0NikuIElnbm9yZSBRb1MKKwkgIGV2ZW50cy4KKworMjAwNi0wNC0yNSAxNjowOTo1NSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IEl0J3MgY29kZWNfZGF0YSwgbm90IGNvZGVjX2luZm8uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6IChnc3RfcnRwX21wNGdfcGF5X3NldGNhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzogKGdzdF9ydHBfbXA0dl9wYXlfc2V0Y2Fwcyk6CisJICBJdCdzIGNvZGVjX2RhdGEsIG5vdCBjb2RlY19pbmZvLgorCisyMDA2LTA0LTI1IDExOjQ1OjAwICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogSGFuZGxlIGNvZGVjX2RhdGEgZm9yIFZmVyBjb21wYXRpYmlsaXR5IGNvZGVjIElEcyAoIzMzOTQ1MSkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE1hcmsgTmF1d2VsYWVydHMgIDxtYW5hdXcgYXQgc2t5bmV0IGRvdCBiZT4KKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfdmlkZW9fY2Fwcyk6CisJICBIYW5kbGUgY29kZWNfZGF0YSBmb3IgVmZXIGNvbXBhdGliaWxpdHkgY29kZWMgSURzICgjMzM5NDUxKQorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX211eF92aWRlb19wYWRfc2V0Y2Fwcyk6CisJICBTYW1lIGhlcmUsIGhhbmRsZSBjb2RlY19kYXRhIGFuZCBhZGQgYWRkaXRpb25hbCBjYXBzIHdlIGNhbiBoYW5kbGUKKwkgIG5vdyB0byB0aGUgcGFkIHRlbXBsYXRlIChodWZmeXV2LCBkdiBhbmQgaDI2MyB2aWRlbykgKCMzMzk0NTEpCisKKzIwMDYtMDQtMjUgMTE6MDk6MjQgKzAwMDAgIEpvc2VmIFpsb21layA8am9zZWYuemxvbWVrQGl0b25pcy50dj4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBGaXggdGltZXN0YW1waW5nIG9mIEItZnJhbWVzLCB1c2Ugc2lnbmVkIGludGVnZXJzLCBkbyBzb21lIHJvdW5kaW5nICgjMzM5Njc4KS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEpvc2VmIFpsb21layAgPGpvc2VmIGRvdCB6bG9tZWsgYXQgaXRvbmlzIGRvdCB0dj4KKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9tdXhfY3JlYXRlX2J1ZmZlcl9oZWFkZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfZGF0YSk6CisJICBGaXggdGltZXN0YW1waW5nIG9mIEItZnJhbWVzLCB1c2Ugc2lnbmVkIGludGVnZXJzLCBkbworCSAgc29tZSByb3VuZGluZyAoIzMzOTY3OCkuCisKKzIwMDYtMDQtMjQgMTg6MzA6NTUgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogQ2hhbmdlTG9nOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbHBhcnNlci5jOgorCSAganVzdCBtYWtlIGl0IGNvbXBpbGUgd2l0aCAtLWRpc2FibGUtZ3N0LWRlYnVnLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBqdXN0IG1ha2UgaXQgY29tcGlsZSB3aXRoIC0tZGlzYWJsZS1nc3QtZGVidWcuCisKKzIwMDYtMDQtMjMgMTU6NTU6MzAgKzAwMDAgIFPDqWJhc3RpZW4gTW91dHRlIDxzZWJhc3RpZW5AbW91dHRlLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IEZpeCBhIGJhZCBjb252ZXJzaW9uIHVzaW5nIGdzdF9ndWludDY0X3RvX2dkb3VibGUuIGZhYnMgKChnZG91YmxlKSBkZW11eC0+aW5kZXhbZW50cnldLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FkZW11eF9kb19pbmRleF9zZWVrKToKKwkgIEZpeCBhIGJhZCBjb252ZXJzaW9uIHVzaW5nIGdzdF9ndWludDY0X3RvX2dkb3VibGUuCisJICBmYWJzICgoZ2RvdWJsZSkgZGVtdXgtPmluZGV4W2VudHJ5XS50aW1lIC0gKGdkb3VibGUpIHNlZWtfcG9zKSBjYW4gbm90IGJlCisJICByZXBsYWNlZCBieSBmYWJzIChnc3RfZ3VpbnQ2NF90b19nZG91YmxlIChkZW11eC0+aW5kZXhbZW50cnldLnRpbWUgLSBzZWVrX3BvcykpIGFzIHRoZQorCSAgZGlmZmVyZW5jZSBjb3VsZCBiZSBuZWdhdGl2ZS4gZmFicyAoZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSAoZGVtdXgtPmluZGV4W2VudHJ5XS50aW1lKSAtCisJICBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIChzZWVrX3BvcykpIGlzIHRoZSBnb29kIHNvbHV0aW9uLiBUaGFua3MgdG8gVGltIHdobyBoYXMgc2VlbiBteQorCSAgbWlzdGFrZS4KKworMjAwNi0wNC0yMiAxNTozMjo0OCArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogVXNlIGdzdF9ndWludDY0X3RvX2dkb3VibGUgZm9yIGNvbnZlcnNpb25zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FkZW11eF9kb19pbmRleF9zZWVrKToKKwkgIFVzZSBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIGZvciBjb252ZXJzaW9ucworCSAgKiB3aW4zMi92czYvZ3N0X3BsdWdpbnNfZ29vZC5kc3c6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RpY3lkZW11eC5kc3A6CisJICBBZGQgYSBwcm9qZWN0IGZpbGUgZm9yIGljeWRlbXV4CisKKzIwMDYtMDQtMjEgMTg6MDc6MTAgKzAwMDAgIEZhYnJpemlvIEdlbm5hcmkgPGZhYnJpemlvLmdlQHRpc2NhbGkuaXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogV2hlbiBzcGxpdHRpbmcgYXVkaW8gY2h1bmtzLCB0aGUgYmxvY2sgYWxpZ25tZW50IGlzIG5vdCB0YWtlbiBpbiBjb25zaWRlcmF0aW9uLCBzbyB0aGUgc21hbGxlci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogRmFicml6aW8gR2VubmFyaSA8ZmFicml6aW8gZG90IGdlIGF0IHRpc2NhbGkgZG90IGl0PgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9pbmRleCksIChnc3RfYXZpX2RlbXV4X21hc3NhZ2VfaW5kZXgpOgorCSAgV2hlbiBzcGxpdHRpbmcgYXVkaW8gY2h1bmtzLCB0aGUgYmxvY2sgYWxpZ25tZW50IGlzIG5vdCB0YWtlbiBpbgorCSAgY29uc2lkZXJhdGlvbiwgc28gdGhlIHNtYWxsZXIgY2h1bmtzIGNvdWxkIGJlIG9mIHNpemUgd2hpY2ggaXMKKwkgIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBibG9jayBhbGlnbm1lbnQuIEZpeGVzICMzMzY5MDQKKworMjAwNi0wNC0yMSAxNzo1OTowMyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IFVzZSBzY2FsZSBmdW5jdGlvbnMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzogKGdzdF9kdjEzOTRzcmNfY29udmVydCk6CisJICBVc2Ugc2NhbGUgZnVuY3Rpb25zCisKKzIwMDYtMDQtMjEgMTc6Mjc6NDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9kdi9nc3Rkdi5jOiBGaXggYnVpbGQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2LmM6IChwbHVnaW5faW5pdCk6CisJICBGaXggYnVpbGQuCisKKzIwMDYtMDQtMjEgMTc6MTU6MjkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9kZWJ1Zy9wcm9ncmVzc3JlcG9ydC5jOiBBZGQgJ2Zvcm1hdCcgcHJvcGVydHkgdG8gZm9yY2UgcXVlcnlpbmcgdG8gYSBwYXJ0aWN1bGFyIGZvcm1hdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVidWcvcHJvZ3Jlc3NyZXBvcnQuYzogKGdzdF9wcm9ncmVzc19yZXBvcnRfZmluYWxpemUpLAorCSAgKGdzdF9wcm9ncmVzc19yZXBvcnRfY2xhc3NfaW5pdCksIChnc3RfcHJvZ3Jlc3NfcmVwb3J0X2luaXQpLAorCSAgKGdzdF9wcm9ncmVzc19yZXBvcnRfZG9fcXVlcnkpLCAoZ3N0X3Byb2dyZXNzX3JlcG9ydF9yZXBvcnQpLAorCSAgKGdzdF9wcm9ncmVzc19yZXBvcnRfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcHJvZ3Jlc3NfcmVwb3J0X2dldF9wcm9wZXJ0eSk6CisJICBBZGQgJ2Zvcm1hdCcgcHJvcGVydHkgdG8gZm9yY2UgcXVlcnlpbmcgdG8gYSBwYXJ0aWN1bGFyIGZvcm1hdC4KKworMjAwNi0wNC0yMSAxNTo1MDoyOCArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBleHQvZHYvZ3N0ZHYuYyAocGx1Z2luX2luaXQpOiBsaWJkdiBpcyBhIG1hcmdpbmFsIGRlY29kZXIsIGF0IGJlc3QsIG9uIGJpZyBlbmRpYW4gc3lzdGVtcy4gRHJvcCBpdHMgcmFuayBpbiB0aGF0IGNhc2UuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wNC0yMSAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKwkgICogZXh0L2R2L2dzdGR2LmMgKHBsdWdpbl9pbml0KTogbGliZHYgaXMgYSBtYXJnaW5hbCBkZWNvZGVyLCBhdAorCSAgYmVzdCwgb24gYmlnIGVuZGlhbiBzeXN0ZW1zLiBEcm9wIGl0cyByYW5rIGluIHRoYXQgY2FzZS4gT1RPSCBvbgorCSAgeDg2IGl0J3MgcXVpdGUgZmluZS4gU2VlIGNoYW5nZXMgZnJvbSB0b2RheSBpbiBnc3QtZmZtcGVnIGFzIHdlbGwuCisKKzIwMDYtMDQtMjEgMDk6Mjc6MTEgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgQWRkIGljeWRlbXV4LCBhbmQgdGVzdHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvaWN5ZGVtdXgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOiAoZ3N0X2ljeWRlbXV4X2dldF90eXBlKSwKKwkgIChnc3RfaWN5ZGVtdXhfYmFzZV9pbml0KSwgKGdzdF9pY3lkZW11eF9jbGFzc19pbml0KSwKKwkgIChnc3RfaWN5ZGVtdXhfcmVzZXQpLCAoZ3N0X2ljeWRlbXV4X2luaXQpLAorCSAgKGdzdF9pY3lkZW11eF9zaW5rX3NldGNhcHMpLCAoZ3N0X2ljeWRlbXV4X2Rpc3Bvc2UpLAorCSAgKGdzdF9pY3lkZW11eF9hZGRfc3JjcGFkKSwgKGdzdF9pY3lkZW11eF9yZW1vdmVfc3JjcGFkKSwKKwkgICh1bmljb2RpZnkpLCAoZ3N0X2ljeWRlbXV4X3VuaWNvZGlmeSksCisJICAoZ3N0X2ljeWRlbXV4X3BhcnNlX2FuZF9zZW5kX3RhZ3MpLAorCSAgKGdzdF9pY3lkZW11eF90eXBlZmluZF9vcl9mb3J3YXJkKSwgKGdzdF9pY3lkZW11eF9hZGRfbWV0YSksCisJICAoZ3N0X2ljeWRlbXV4X2NoYWluKSwgKGdzdF9pY3lkZW11eF9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9pY3lkZW11eF9zZW5kX3RhZ19ldmVudCksIChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5oOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvaWN5ZGVtdXguYzogKHR5cGVmaW5kX3N1Y2NlZWQpLAorCSAgKHBsdWdpbl9pbml0KSwgKGljeWRlbXV4X2ZvdW5kX3BhZCksIChjcmVhdGVfaWN5ZGVtdXgpLAorCSAgKGNsZWFudXBfaWN5ZGVtdXgpLCAocHVzaF9kYXRhKSwgKEdTVF9TVEFSVF9URVNUKSwKKwkgIChpY3lkZW11eF9zdWl0ZSksIChtYWluKToKKwkgIEFkZCBpY3lkZW11eCwgYW5kIHRlc3RzLgorCisyMDA2LTA0LTIwIDE3OjQ4OjI5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IFBvc3QgU0VHTUVOVF9ET05FIG1lc3NhZ2UgaW4gVElNRSBmb3JtYXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfZGVjX2xvb3ApOgorCSAgUG9zdCBTRUdNRU5UX0RPTkUgbWVzc2FnZSBpbiBUSU1FIGZvcm1hdC4KKworMjAwNi0wNC0yMCAxNzoyOTo1NiArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBBZGRlZCBhIGNvdXBsZSBvZiBpZmRlZnMgdG8gbWFrZSBpdCBjb21waWxlIHdpdGggb3RoZXIga2VybmVscy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQWRkZWQgYSBjb3VwbGUgb2YgaWZkZWZzIHRvIG1ha2UgaXQgY29tcGlsZSB3aXRoIG90aGVyIGtlcm5lbHMuCisKKzIwMDYtMDQtMjAgMTY6MzM6NTUgKzAwMDAgIEZhYnJpemlvIEdlbm5hcmkgPGZhYnJpemlvLmdlQHRpc2NhbGkuaXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogRml4IGluZGV4IGNyZWF0aW9uIHdoZW4gd2UgaGF2ZSB0byBzY2FuIHRoZSBmaWxlIHRvIGNyZWF0ZSBhbiBpbmRleC4gVGhlcmUgbWF5IGJlIG90aGVyIHR5cGVzIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogRmFicml6aW8gR2VubmFyaSAgPGZhYnJpemlvIGRvdCBnZSBhdCB0aXNjYWxpIGRvdCBpdD4KKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wZWVrX3RhZyksCisJICAoZ3N0X2F2aV9kZW11eF9uZXh0X2RhdGFfYnVmZmVyKSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX3NjYW4pOgorCSAgRml4IGluZGV4IGNyZWF0aW9uIHdoZW4gd2UgaGF2ZSB0byBzY2FuIHRoZSBmaWxlIHRvIGNyZWF0ZQorCSAgYW4gaW5kZXguIFRoZXJlIG1heSBiZSBvdGhlciB0eXBlcyBvZiBSSUZGICdMSVNUJyBjaHVua3MgdGhhbgorCSAgJ21vdmknIGFuZCB3ZSBuZWVkIHRvIHNraXAgdGhlbSBwcm9wZXJseSBhcyB3ZWxsIG9yIHdlJ2xsIGVuZCB1cAorCSAgcmVhZGluZyBnYXJiYWdlICgjMzM2ODg5KS4gU29tZSBvdGhlciBjb3NtZXRpYyBjaGFuZ2VzLgorCisyMDA2LTA0LTIwIDE0OjIxOjQyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IEFkZCBzdXBwb3J0IGZvciBzZWdtZW50IHNlZWtzIChmaXhlcyAjMzM4MjkwKS4gQWxzbyBkZW1vdGUgc29tZSByZWN1cnJpbmcgZGVidWcgbWVzc2FnZSBmcm9tIEQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19kZWNfbG9vcCksCisJICAoZ3N0X2ZsYWNfZGVjX2hhbmRsZV9zZWVrX2V2ZW50KToKKwkgIEFkZCBzdXBwb3J0IGZvciBzZWdtZW50IHNlZWtzIChmaXhlcyAjMzM4MjkwKS4gQWxzbyBkZW1vdGUKKwkgIHNvbWUgcmVjdXJyaW5nIGRlYnVnIG1lc3NhZ2UgZnJvbSBERUJVRyB0byBMT0cgbGV2ZWwuCisKKzIwMDYtMDQtMjAgMTM6MjM6NDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS86IFNldCBESVNDT05UIGZsYWcgb24gZmlyc3QgYnVmZmVyIGFmdGVyIGEgZGlzY29udGludWl0eS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfc3RyZWFtKSwKKwkgIChnc3RfbWF0cm9za2FkZW11eF9kb19pbmRleF9zZWVrKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NlZWtfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgU2V0IERJU0NPTlQgZmxhZyBvbiBmaXJzdCBidWZmZXIgYWZ0ZXIgYSBkaXNjb250aW51aXR5LgorCSAgRml4IG5ld3NlZ21lbnQgZXZlbnRzIHNlbnQgd2hlbiBzZWVraW5nIGFuZCBob25vdXIgS0VZX1VOSVQKKwkgIHNlZWsgZmxhZy4gQ3JlYXRlIHBhZCB3aXRoIGJvZ3VzIGNhcHMgaWYgd2UgZG9uJ3QgcmVjb2duaXNlCisJICB0aGUgc3RyZWFtIGNvZGVjIGlkLgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkgIEZpeCBHT2JqZWN0IG1hY3Jvcy4KKworMjAwNi0wNC0yMCAxMTowMDoxNiArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3QHNreW5ldC5iZT4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IEhhbmRsZSBlbmQgb2Ygc2VnbWVudCBwcm9wZXJseSB3aGVuIHNldDsgZG9uJ3QgZGVhZC1sb2NrIHdoZW4gcG9zdGluZyBzdGFydCBvZiBzZWdtZW50Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBNYXJrIE5hdXdlbGFlcnRzICA8bWFuYXV3IGF0IHNreW5ldCBkb3QgYmU+CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc2Vla19ldmVudCksIChnc3RfbWF0cm9za2FfZGVtdXhfbG9vcCk6CisJICBIYW5kbGUgZW5kIG9mIHNlZ21lbnQgcHJvcGVybHkgd2hlbiBzZXQ7IGRvbid0IGRlYWQtbG9jayB3aGVuCisJICBwb3N0aW5nIHN0YXJ0IG9mIHNlZ21lbnQgbWVzc2FnZSB3aGVuIGRvaW5nIGEgc2VnbWVudCBzZWVrLgorCSAgRml4ZXMgIzMzODgxMC4KKworMjAwNi0wNC0yMCAwOTo0ODowNSArMDAwMCAgal4gPGpAYm9vdGxhYi5vcmc+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogTmV2ZXIgdHJlYXQgdmlkZW8gc3RyZWFtcyBhcyBhbiBhdWRpbyBzdHJlYW0uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBqXiA8aiBhdCBib290bGFiIGRvdCBvcmc+CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2VfdHJhayksCisJICAocXRkZW11eF92aWRlb19jYXBzKToKKwkgIE5ldmVyIHRyZWF0IHZpZGVvIHN0cmVhbXMgYXMgYW4gYXVkaW8gc3RyZWFtLgorCSAgQWRkIHF0ZHJ3IG1pbWUgdHlwZS4KKwkgIEZpeGVzICMzMzkwNDEKKworMjAwNi0wNC0yMCAwOToxMToyMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IE1ha2UgbXBlZzIgYWFjIGF1ZGlvIHdvcms6IGNyZWF0ZSBhcnRpZmljaWFsIHByaXZhdGUgY29kZWMgZGF0YSBjaHVuayB3aGljaCBmYWFkMiBzZWVtLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfYXVkaW9fY2FwcyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BsdWdpbl9pbml0KToKKwkgIE1ha2UgbXBlZzIgYWFjIGF1ZGlvIHdvcms6IGNyZWF0ZSBhcnRpZmljaWFsIHByaXZhdGUgY29kZWMgZGF0YQorCSAgY2h1bmsgd2hpY2ggZmFhZDIgc2VlbXMgdG8gcmVxdWlyZSwganVzdCBhcyB3ZSBkbyBmb3IgbXBlZzQgYWFjLgorCSAgQWxzbyBjYWxsIGdzdF9yaWZmX2luaXQoKS4gUGFydGlhbGx5IGZpeGVzICMzMzg3NjcuCisKKzIwMDYtMDQtMTkgMTU6MTY6MzMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLio6IFNldCBjYXBzIG9uIGZpcnN0IG91dGdvaW5nIGJ1ZmZlciwgc28gdGhhdCBpdCBkb2Vzbid0IGVycm9yIG91dCBpbW1lZGlhdGVseSB3aXRoIGEgbm9uLW5lZ290aS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChnc3Rfd2F2ZW5jX2Jhc2VfaW5pdCksCisJICAoZ3N0X3dhdmVuY19jbGFzc19pbml0KSwgKGdzdF93YXZlbmNfaW5pdCksCisJICAoZ3N0X3dhdmVuY19jcmVhdGVfaGVhZGVyX2J1ZiksIChnc3Rfd2F2ZW5jX3B1c2hfaGVhZGVyKSwKKwkgIChnc3Rfd2F2ZW5jX3Npbmtfc2V0Y2FwcyksIChnZXRfaWRfZnJvbV9uYW1lKSwgKGdzdF93YXZlbmNfZXZlbnQpLAorCSAgKGdzdF93YXZlbmNfY2hhaW4pLCAoZ3N0X3dhdmVuY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5oOgorCSAgU2V0IGNhcHMgb24gZmlyc3Qgb3V0Z29pbmcgYnVmZmVyLCBzbyB0aGF0IGl0IGRvZXNuJ3QgZXJyb3Igb3V0CisJICBpbW1lZGlhdGVseSB3aXRoIGEgbm9uLW5lZ290aWF0ZWQgZXJyb3IgKCMzMzg3MTYpLiBSZXdyaXRlIGFuZAorCSAgY2xlYW4gdXAgYSBiaXQ7IGZpeCBzZXRjYXBzIGZ1bmN0aW9uIHRvIHBhcnNlIHRoaW5ncyBwcm9wZXJseTsKKwkgIGZpeCBzaW5rIGNhcHMgKDhiaXQgYXVkaW8gaXMgdW5zaWduZWQgYW5kIGRvZXNuJ3QgaGF2ZSBkZXB0aCk7CisJICB1c2UgYm9pbGVycGxhdGUgbWFjcm9zOyByZW1vdmUgdW51c2VkIHByb3BlcnRpZXMgc3R1ZmYuCisKKzIwMDYtMDQtMTkgMDk6Mjc6MDAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRm9yIFZCUiBhdWRpbywgZG9uJ3QgdHJ5IHRvIGNhbGN1bGF0ZSB0aGUgc2FtcGxlc19wZXJfZnJhbWUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIEZvciBWQlIgYXVkaW8sIGRvbid0IHRyeSB0byBjYWxjdWxhdGUgdGhlIHNhbXBsZXNfcGVyX2ZyYW1lLgorCSAgRml4ZXMgIzMzODkzNS4KKworMjAwNi0wNC0xOCAxODoxNDozNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6IExlYXZlIEpQRUcgZGVjb2RpbmcgdG8gb3VyIGpwZWdkZWMgcGx1Z2luLiBnZGtwaXhidWZkZWMgY2Fubm90IGhhbmRsZSBNSlBFRyBzdHJlYW1zIGFuLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJICBMZWF2ZSBKUEVHIGRlY29kaW5nIHRvIG91ciBqcGVnZGVjIHBsdWdpbi4gZ2RrcGl4YnVmZGVjIGNhbm5vdAorCSAgaGFuZGxlIE1KUEVHIHN0cmVhbXMgYW5kIG1pZ2h0IGJlIGF1dG9wbHVnZ2VkIGZvciB0aG9zZSBpZiB0aGUKKwkgIHVzZXIgZG9lc24ndCBoYXZlIGpwZWdkZWMgaW5zdGFsbGVkIChyZXN1bHRpbmcgaW4gYSBjcnlwdGljIGVycm9yCisJICBtZXNzYWdlIGFib3V0IGh1ZmZtYW4gdGFibGVzKS4gQmV0dGVyIHRvIGRpc2FibGUgSlBFRyBkZWNvZGluZyBoZXJlCisJICBhbmQgbGV0IHRoZSB1c2VyIGZpZ3VyZSBvdXQgdGhhdCBzaGUgbmVlZHMgdG8gaW5zdGFsbCBqcGVnZGVjLgorCisyMDA2LTA0LTE4IDE4OjA0OjQ4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuKjogTWFrZSB3b3JrIHdpdGggcGFja2V0aXNlZC9mcmFtZWQgaW5wdXQgKGUuZy4gcG5nLWluLXF1aWNrdGltZSkuIFVzZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOiAoZ3N0X2dka19waXhidWZfc2lua19zZXRjYXBzKSwKKwkgIChnc3RfZ2RrX3BpeGJ1Zl9jbGFzc19pbml0KSwgKGdzdF9nZGtfcGl4YnVmX2luaXQpLAorCSAgKGdzdF9nZGtfcGl4YnVmX2ZsdXNoKSwgKGdzdF9nZGtfcGl4YnVmX2NoYWluKToKKwkgICogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmg6CisJICBNYWtlIHdvcmsgd2l0aCBwYWNrZXRpc2VkL2ZyYW1lZCBpbnB1dCAoZS5nLiBwbmctaW4tcXVpY2t0aW1lKS4gVXNlCisJICBHU1RfRUxFTUVOVF9FUlJPUiB3aGVuIHdlIHJldHVybiBHU1RfRkxPV19FUlJPUi4gQWRkIHNvbWUKKwkgIEdTVF9ERUJVR19GVU5DUFRSIGhlcmUgYW5kIHRoZXJlLiBVc2UgR1NUX0xPRyBmb3IgcmVjdXJyaW5nCisJICBkZWJ1ZyBtZXNzYWdlcy4gRml4IGJvaWxlcnBsYXRlIG1hY3Jvcy4KKworMjAwNi0wNC0xOCAxNzoyOTo0MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6IE5vIG5lZWQgdG8gc3BlY2lhbC1jYXNlIGZvciBHZGstMi4wIGFueSBsb25nZXIsIHdlIHJlcXVpcmUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKGdzdF9nZGtfcGl4YnVmX2dldF9jYXBzbGlzdCksCisJICAoZ3N0X2dka19waXhidWZfc2V0X3Byb3BlcnR5KSwgKGdzdF9nZGtfcGl4YnVmX2dldF9wcm9wZXJ0eSk6CisJICBObyBuZWVkIHRvIHNwZWNpYWwtY2FzZSBmb3IgR2RrLTIuMCBhbnkgbG9uZ2VyLCB3ZSByZXF1aXJlCisJICBHZGsgMi4yIG9yIG5ld2VyOyBtaW5vciBjbGVhbi11cHMuCisKKzIwMDYtMDQtMTggMTc6MTc6NTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIFJld3JpdGUgYSBiaXQ6IHVzZSBHc3RCYXNlU2luazo6c3RhcnQgYW5kIHN0b3AgaW5zdGVhZCBvZiBhIHN0YXRlIGNoYW5nZSBmdW5jdGlvbjsgdXNlIEdTVF9FTEVNRU5UX0VSUk9SIGZvciBlcnJvciByZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmM6IChnc3Rfc2hvdXQyc2VuZF9iYXNlX2luaXQpLAorCSAgKGdzdF9zaG91dDJzZW5kX2NsYXNzX2luaXQpLCAoZ3N0X3Nob3V0MnNlbmRfaW5pdCksCisJICAoc2V0X3Nob3V0X21ldGFkYXRhKSwgKGdzdF9zaG91dDJzZW5kX3NldF9tZXRhZGF0YSksCisJICAoZ3N0X3Nob3V0MnNlbmRfZXZlbnQpLCAoZ3N0X3Nob3V0MnNlbmRfc3RhcnQpLAorCSAgKGdzdF9zaG91dDJzZW5kX2Nvbm5lY3QpLCAoZ3N0X3Nob3V0MnNlbmRfc3RvcCksCisJICAoZ3N0X3Nob3V0MnNlbmRfcmVuZGVyKSwgKGdzdF9zaG91dDJzZW5kX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3Nob3V0MnNlbmRfZ2V0X3Byb3BlcnR5KSwgKGdzdF9zaG91dDJzZW5kX3NldGNhcHMpLAorCSAgKHBsdWdpbl9pbml0KToKKwkgICogZXh0L3Nob3V0Mi9nc3RzaG91dDIuaDoKKwkgICogcG8vUE9URklMRVMuaW46CisJICBSZXdyaXRlIGEgYml0OiB1c2UgR3N0QmFzZVNpbms6OnN0YXJ0IGFuZCBzdG9wIGluc3RlYWQgb2YgYSBzdGF0ZQorCSAgY2hhbmdlIGZ1bmN0aW9uOyB1c2UgR1NUX0VMRU1FTlRfRVJST1IgZm9yIGVycm9yIHJlcG9ydGluZywgbm90CisJICBnX2Vycm9yKCkgb3IgR1NUX0VSUk9SKCk7IGRvbid0IHVucmVmIGNhcHMgaW4gc2V0Y2FwcyBmdW5jdGlvbiwKKwkgIHdpbGwgY2F1c2UgY3Jhc2hlcyBvciBhc3NlcnRpb24gZmFpbHVyZXM7IHJlbW92ZSAodW51c2VkKSAic3luYyIKKwkgIHByb3BlcnR5LCBiYXNlc2luayBhbHJlYWR5IGhhcyBzdWNoIGEgcHJvcGVydHk7IG1pc2MuIG90aGVyCisJICBtaW5vciBmaXhlcyBhbmQgY2xlYW51cHMuCisKKzIwMDYtMDQtMTggMTQ6MTU6MzMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIEFkZCB0cmFuc2xhdGFibGUgZXJyb3IgbWVzc2FnZSBmb3Igd2hlbiB3ZSBjYW5ub3QgY29ubmVjdCB0byB0aGUgc291bmQgc2VydmVyLCBhcyAiQ2Fubm90IG9wZW4gcmVzb3VyY2UgZm9yIHdyaXRpbmciIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfb3BlbiksIChnc3RfZXNkc2lua19wcmVwYXJlKToKKwkgICogZXh0L2VzZC9nc3Rlc2QuYzogKHBsdWdpbl9pbml0KToKKwkgICogcG8vUE9URklMRVMuaW46CisJICBBZGQgdHJhbnNsYXRhYmxlIGVycm9yIG1lc3NhZ2UgZm9yIHdoZW4gd2UgY2Fubm90CisJICBjb25uZWN0IHRvIHRoZSBzb3VuZCBzZXJ2ZXIsIGFzICJDYW5ub3Qgb3BlbiByZXNvdXJjZQorCSAgZm9yIHdyaXRpbmciIGlzbid0IHJlYWxseSBhbiBhY2NlcHRhYmxlIG1lc3NhZ2UgdG8gc2hvdworCSAgdG8gdGhlIHVzZXIgaW4gdGhpcyBjYXNlLgorCisyMDA2LTA0LTE4IDEzOjMyOjI5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvb3NzL2dzdC1pMThuLXBsdWdpbi5oOiBSZW1vdmUgYm9ndXMgZmlsZSB0aGF0IGRvZXNuJ3QgYmVsb25nIGhlcmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL29zcy9nc3QtaTE4bi1wbHVnaW4uaDoKKwkgIFJlbW92ZSBib2d1cyBmaWxlIHRoYXQgZG9lc24ndCBiZWxvbmcgaGVyZS4KKworMjAwNi0wNC0xNyAxOTo1NzoxMCArMDAwMCAgUGhpbGlwcGUgVmFsZW1ib2lzIDxsZXBoaWxvdXNvcGhlQHVzZXJzLnNmLm5ldD4KKworCSAgZXh0L3Nob3V0Mi9nc3RzaG91dDIuKjogSGFuZGxlIHRhZ3MgYmVpbmcgcmVjZWl2ZWQgYmVmb3JlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgaXMgZXN0YWJsaXNoZWQgcHJvcGVybHkgKHNlZSAjLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBQaGlsaXBwZSBWYWxlbWJvaXMKKwkgICogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzogKGdzdF9zaG91dDJzZW5kX2luaXQpLAorCSAgKGdzdF9zaG91dDJzZW5kX3NldF9tZXRhZGF0YSksIChnc3Rfc2hvdXQyc2VuZF9ldmVudCksCisJICAoZ3N0X3Nob3V0MnNlbmRfcmVuZGVyKSwgKGdzdF9zaG91dDJzZW5kX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmg6CisJICBIYW5kbGUgdGFncyBiZWluZyByZWNlaXZlZCBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gdG8KKwkgIHRoZSBzZXJ2ZXIgaXMgZXN0YWJsaXNoZWQgcHJvcGVybHkgKHNlZSAjMzM4NjM2KS4KKworMjAwNi0wNC0xNyAxOTo0MzozMiArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBKdXN0IGFkZGVkIGEgZ3RrLWRvYyBjb21tZW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBKdXN0IGFkZGVkIGEgZ3RrLWRvYyBjb21tZW50LgorCisyMDA2LTA0LTE3IDE5OjEyOjM2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOiBEb24ndCBjcmFzaCBpbiBjYXNlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgZmFpbHM6IGRvbid0IHNldCBwb2ludGVyIHRvIE5VTEwgYnkgYXNzaWduaW4uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOiAoZ3N0X3Nob3V0MnNlbmRfcmVuZGVyKToKKwkgIERvbid0IGNyYXNoIGluIGNhc2UgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBmYWlsczoKKwkgIGRvbid0IHNldCBwb2ludGVyIHRvIE5VTEwgYnkgYXNzaWduaW5nIEZBTFNFOyBlcnJvciBvdXQKKwkgIHByb3Blcmx5IGJ5IHVzaW5nIEdTVF9FTEVNRU5UX0VSUk9SIGFuZCByZXR1cm5pbmcKKwkgIEdTVF9GTE9XX0VSUk9SIChmaXhlcyAjMzM4NjM2KS4gTGFzdGx5LCBmcmVlIGNvbm5lY3Rpb24KKwkgIGJlZm9yZSByZXNldHRpbmcgdGhlIHBvaW50ZXIuCisKKzIwMDYtMDQtMTcgMTA6MDE6NTEgKzAwMDAgIEFsZXggTGFuY2FzdGVyIDxhbGV4bGFuQGZlZG9yYXByb2plY3Qub3JnPgorCisJICBnc3QvaWQzZGVtdXgvaWQzdGFncy5jOiAoRml4ZXMgIzMzODcxMykKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdGFncy5jOgorCSAgUmVjb2duaXNlIFRDTyAoR2VucmUpIHRhZ3MgaW4gSUQzdjIuMi4gUGF0Y2ggYnkgQWxleCBMYW5jYXN0ZXIKKwkgIChGaXhlcyAjMzM4NzEzKQorCisyMDA2LTA0LTEzIDIxOjQ1OjU3ICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIEZpeGVkIHNvbWUgbWVtb3J5IGxlYWtzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGaXhlZCBzb21lIG1lbW9yeSBsZWFrcy4KKworMjAwNi0wNC0xMyAwOToxNTozMSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5oOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBwY21hcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5Lmg6CisJICByZXZlcnRpbmcgcnRwIHBhdGNoZXMgdG8gZml4IGZyZWV6ZSBicmVhayBvbiAtYmFzZSBhcyBleHBsYWluZWQgb24gdGhlIGxpc3QKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmV2ZXJ0aW5nIHJ0cCBwYXRjaGVzIHRvIGZpeCBmcmVlemUgYnJlYWsgb24gLWJhc2UgYXMgZXhwbGFpbmVkIG9uIHRoZSBsaXN0CisKKzIwMDYtMDQtMTMgMDk6MDE6MTcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9ydHAvOiBGaXggR09iamVjdCBtYWNyb3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNnBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBwY211cGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5Lmg6CisJICBGaXggR09iamVjdCBtYWNyb3MuCisKKzIwMDYtMDQtMTMgMDM6NDI6NTEgKzAwMDAgIFBoaWxpcHBlIEthbGFmIDxwaGlsaXBwZS5rYWxhZkBjb2xsYWJvcmEuY28udWs+CisKKwkgIGdzdC9ydHAvOiBQb3J0ZWQgbXVsYXcgYW5kIGFsYXcgcGF5bG9hZGVycyB0byB1c2UgbmV3IGJhc2UgY2xhc3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wNC0xMiBQaGlsaXBwZSBLYWxhZiA8cGhpbGlwcGUua2FsYWZAY29sbGFib3JhLmNvLnVrPgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBwY21hcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuaDoKKwkgIFBvcnRlZCBtdWxhdyBhbmQgYWxhdyBwYXlsb2FkZXJzIHRvIHVzZSBuZXcgYmFzZSBjbGFzcworCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5Lmg6CisJICBBZGRlZCBuZXcgaUxCQyBwYXlsb2FkZXIvZGVwYXlsb2FkZXIuIFBheWxvYWRlciB1c2VzIG5ldyBhdWRpbyBwYXlsb2FkIGJhc2UKKwkgIGNsYXNzLgorCisyMDA2LTA0LTEyIDIxOjU3OjAyICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIEZpeCB0byB3b3JrIGluIHJlYWQgbW9kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRml4IHRvIHdvcmsgaW4gcmVhZCBtb2RlLgorCisyMDA2LTA0LTEyIDA5OjQyOjEwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogU29tZSBjbGVhbnVwcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKGdzdF9nZGtfcGl4YnVmX3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X2dka19waXhidWZfZ2V0X2NhcHNsaXN0KSwgKGdzdF9nZGtfcGl4YnVmX3NpbmtfZ2V0Y2FwcyksCisJICAoZ3N0X2dka19waXhidWZfY2xhc3NfaW5pdCksIChnc3RfZ2RrX3BpeGJ1Zl9pbml0KSwKKwkgIChnc3RfZ2RrX3BpeGJ1Zl9mbHVzaCksIChnc3RfZ2RrX3BpeGJ1Zl9zaW5rX2V2ZW50KSwKKwkgIChnc3RfZ2RrX3BpeGJ1Zl9jaGFpbik6CisJICBTb21lIGNsZWFudXBzLgorCSAgQWRkZWQgUkdCQSBhcyBhIHBvc3NpYmxlIG91dHB1dCBmb3JtYXQuCisJICBDb3JyZWN0bHkgZnJlZSB0aGUgc3VwcG9ydGVkIG1pbWV0eXBlcy4KKwkgIGRlcHJlY2F0ZSBzaWxlbnQgYXJnLCBpdCdzIG5vdCB1c2VkLgorCSAgUmV0dXJuIHJlc3VsdCBmcm9tIF9hbGxvY19idWZmZXIgdG8gcGVlci4KKworMjAwNi0wNC0xMSAxODowMzozNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYzogRG9uJ3QgbGVhayBtZW1vcnkgYWxsb2NhdGVkIGJ5IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYygpIGJ5IG92ZXJ3cml0aW5nIEdTVF9CVUZGRVJfTUFMTE9DLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYzogKGdzdF9ydHBfbXA0dl9kZXBheV9wcm9jZXNzKToKKwkgIERvbid0IGxlYWsgbWVtb3J5IGFsbG9jYXRlZCBieSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MoKSBieQorCSAgb3ZlcndyaXRpbmcgR1NUX0JVRkZFUl9NQUxMT0NEQVRBLgorCisyMDA2LTA0LTExIDE1OjI3OjMxICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIGZpeCB2ZXJzaW9uIG51bWJlciBtYWNybworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBmaXggdmVyc2lvbiBudW1iZXIgbWFjcm8KKworMjAwNi0wNC0xMSAwOTozNTo0NSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2xpYnBuZy9nc3RwbmdkZWMuKjogSGFuZGxlIG1vcmUgdGhhbiBvbmUgZnJhbWUgaWYgdGhlIGNvbnRlbnQgaXMgZnJhbWVkLCBsaWtlIHdpdGggcG5nLWluLXF1aWNrdGltZSAoIzMzMTkxNykuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogKGdzdF9wbmdkZWNfaW5pdCksCisJICAodXNlcl9lbmRyb3dfY2FsbGJhY2spLCAodXNlcl9lbmRfY2FsbGJhY2spLAorCSAgKGdzdF9wbmdkZWNfY2Fwc19jcmVhdGVfYW5kX3NldCksIChnc3RfcG5nZGVjX2NoYWluKSwKKwkgIChnc3RfcG5nZGVjX3Npbmtfc2V0Y2FwcyksIChnc3RfcG5nZGVjX3NpbmtfZXZlbnQpLAorCSAgKGdzdF9wbmdkZWNfbGlicG5nX2NsZWFyKSwgKGdzdF9wbmdkZWNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuaDoKKwkgIEhhbmRsZSBtb3JlIHRoYW4gb25lIGZyYW1lIGlmIHRoZSBjb250ZW50IGlzIGZyYW1lZCwKKwkgIGxpa2Ugd2l0aCBwbmctaW4tcXVpY2t0aW1lICgjMzMxOTE3KS4KKworMjAwNi0wNC0xMCAxOTo1NTozMSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIHN5cy9vc3MvOiAtIHRoZSB1c2VyLXZpc2libGUgZXJyb3Igc3RyaW5ncyB3ZXJlIGluIHRoZSB3cm9uZyBjYXRlZ29yeQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3MvTWFrZWZpbGUuYW06CisJICAqIHN5cy9vc3MvY29tbW9uLmg6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiAoZ3N0X29zc19zaW5rX2luaXQpLCAoZ3N0X29zc19zaW5rX29wZW4pLAorCSAgKGdzdF9vc3Nfc2lua19wcmVwYXJlKSwgKGdzdF9vc3Nfc2lua191bnByZXBhcmUpOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NyYy5jOiAoZ3N0X29zc19zcmNfcHJlcGFyZSksCisJICAoZ3N0X29zc19zcmNfdW5wcmVwYXJlKToKKwkgIC0gdGhlIHVzZXItdmlzaWJsZSBlcnJvciBzdHJpbmdzIHdlcmUgaW4gdGhlIHdyb25nIGNhdGVnb3J5CisJICAtIGFuZCB0aGUgbWVzc2FnZXMgd2VyZSBub3QgbWFya2VkIGZvciB0cmFuc2xhdGlvbgorCSAgLSB3aGljaCBpcyBhY3R1YWxseSBhIGdvb2QgdGhpbmcsIGJlY2F1c2UgdGhleSB3ZXJlIGV4YWN0bHkKKwkgIHRoZSBraW5kIG9mIG1lc3NhZ2UgeW91IHdvdWxkIG5ldmVyIHdhbnQgYW55b25lIHRvIHNlZQorCSAgLSB0aGUgbWFjcm9zIHdlcmUgdXNpbmcgdmFyaWFibGVzIHRoYXQgZGlkbid0IGV4aXN0IGluIHRoZSBtYWNybworCSAgYXJndW1lbnRzCisJICAtIGFuZCB0aGV5IHdlcmUgb2J2aW91c2x5IGNvcGllZCBmcm9tIGVhY2ggb3RoZXIgYW5kIHRoZW4gbW9kaWZpZWQKKwkgIC0gc28gYSBjb21tb24gaGVhZGVyIG1ha2VzIHNlbnNlCisKKzIwMDYtMDQtMTAgMTc6MTY6MDkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRml4IHBhcnNpbmcgb2YgbmV3ZXIgc3RzZCBjaHVua3MgYWdhaW4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIEZpeCBwYXJzaW5nIG9mIG5ld2VyIHN0c2QgY2h1bmtzIGFnYWluLgorCisyMDA2LTA0LTEwIDE2OjA5OjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IERvbid0IHRyeSB0byBtb2RpZnkgcmVhZC1vbmx5IGRhdGEuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOiAoZ3N0X2VibWxfcmVhZF9zaW50KToKKwkgIERvbid0IHRyeSB0byBtb2RpZnkgcmVhZC1vbmx5IGRhdGEuCisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrKToKKwkgIEZpeCBjb21tZW50ICh3b24ndCBjcmFzaCBhbnkgbG9uZ2VyIG5vdykuCisKKzIwMDYtMDQtMTAgMTU6NDg6NTUgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOiBVc2UgY29waWVzIG9mIGhlYWRlciBidWZmZXJzIGZvciBjYXBzIHRvIGF2b2lkIGNpcmN1bGFyIHJlZmNvdW50aW5nIHByb2JsZW1zIChhcyBpbiB0aGVvcmFkLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOiAoZ3N0X2NtbWxfZW5jX3NldF9oZWFkZXJfb25fY2Fwcyk6CisJICBVc2UgY29waWVzIG9mIGhlYWRlciBidWZmZXJzIGZvciBjYXBzIHRvIGF2b2lkIGNpcmN1bGFyIHJlZmNvdW50aW5nCisJICBwcm9ibGVtcyAoYXMgaW4gdGhlb3JhZGVjLCB2b3JiaXNkZWMpLgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZGVjLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICBGaXggYSB0eXBvIGluIHRlc3QgdGhhdCBtZWFudCBpdCB3YXMgdGVzdGluZyB0aGUgd3JvbmcgdGhpbmcuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxlbmMuYzogKGNoZWNrX2hlYWRlcnMpOgorCSAgRml4IHJlZmNvdW50IGNoZWNrcyBub3cgdGhhdCB3ZSB1c2UgYnVmZmVyLWNvcGllcyBmb3IgY2Fwcy4KKworMjAwNi0wNC0xMCAxNTo0Mzo1NCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IFVzZSBzdGF0aWMgcGFkIHRlbXBsYXRlcyB3aXRoIEFOWSBjYXBzIGZvciBhdWRpbyBhbmQgdmlkZW8gc291cmNlIHBhZHMgYW5kIGdldCByaWQgb2YgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfYmFzZV9pbml0KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NlZWtfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF92aWRlb19jYXBzKSwgKGdzdF9tYXRyb3NrYV9kZW11eF9hdWRpb19jYXBzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3VidGl0bGVfY2FwcyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BsdWdpbl9pbml0KToKKwkgIFVzZSBzdGF0aWMgcGFkIHRlbXBsYXRlcyB3aXRoIEFOWSBjYXBzIGZvciBhdWRpbyBhbmQgdmlkZW8KKwkgIHNvdXJjZSBwYWRzIGFuZCBnZXQgcmlkIG9mIGEgbG90IG9mIHVubmVjZXNzYXJ5IChhbmQgcGFydGlhbGx5CisJICBicm9rZW4pIGNvZGUgZm9yIHRoZSB0ZW1wbGF0ZSBjYXBzLiBDbGVhbiB1cCBjYXBzIGZpbmRpbmcKKwkgIGZ1bmN0aW9ucy4gRml4ZXMgcGxheWJhY2sgb2YgYXVkaW8gZmlsZXMvc3RyZWFtcyB0aGF0IGRvIG5vdAorCSAgY29udGFpbiB0aGUgc2FtcGxlIHJhdGUgYW5kL29yIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgYXVkaW8KKwkgIGNvbnRleHQgKGhhcHBlbnMgYSBsb3Qgd2l0aCB2b3JiaXMvbXAzIC5ta2EgZmlsZXMgaXQgc2VlbXMpLgorCSAgRml4ZXMgIzMzNzE4My4KKwkgIEFsc28gYWRkIG15c2VsZiB0byBjb3B5cmlnaHQgaG9sZGVycy4KKworMjAwNi0wNC0xMCAxNToyOToyMSArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBleHQvYW5ub2RleC9nc3RjbW1sdXRpbHMuYzogVXNlIGdfbGlzdF9kZWxldGVfbGluayAoKSBpbnN0ZWFkIG9mIGdfbGlzdF9yZW1vdmVfbGluayAoKSBzbyB0aGF0IHdlIGZyZWUgdGhlIGxpbmsgYXMgd2UuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1sdXRpbHMuYzogKGdzdF9jbW1sX3RyYWNrX2xpc3RfZGVsX2NsaXApOgorCSAgVXNlIGdfbGlzdF9kZWxldGVfbGluayAoKSBpbnN0ZWFkIG9mIGdfbGlzdF9yZW1vdmVfbGluayAoKSBzbyB0aGF0CisJICB3ZSBmcmVlIHRoZSBsaW5rIGFzIHdlbGwgYXMgdGhlIGNvbnRhaW5lZCBkYXRhLgorCisyMDA2LTA0LTEwIDE0OjIwOjQxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEZpeCBmcmFtZXJhdGUgY2FsY3VsYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfYWRkX3N0cmVhbSksCisJICAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIEZpeCBmcmFtZXJhdGUgY2FsY3VsYXRpb24uCisKKzIwMDYtMDQtMTAgMTA6MTA6NTUgKzAwMDAgIFJ5YW4gTG9ydGllIChkZXNydCkgPGRlc3J0QGRlc3RyLmNhPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IEZpeCBzb21lIGNyYXNoZXJzIHdpdGggZW1wdHkgY2h1bmtzLiAoRml4ZXMgIzMzNzc0OSkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFJ5YW4gTG9ydGllIChkZXNydCkgPGRlc3J0IGF0IGRlc3RyIGRvdCBjYT4KKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdXBlcmluZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksIChnc3RfYXZpX2RlbXV4X3BhcnNlX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXIpOgorCSAgRml4IHNvbWUgY3Jhc2hlcnMgd2l0aCBlbXB0eSBjaHVua3MuIChGaXhlcyAjMzM3NzQ5KQorCisyMDA2LTA0LTEwIDA4OjMxOjQwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IGZvcmNlIG1vbm8gODAwMCBIeiBvbiBBTVIgc2FtcGxlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgZm9yY2UgbW9ubyA4MDAwIEh6IG9uIEFNUiBzYW1wbGVzLgorCisyMDA2LTA0LTA5IDE4OjMwOjUxICswMDAwICBTw6liYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGV4dC9uZW9uL2dzdG5lb25odHRwc3JjLmM6IHJlbW92ZSBhdG9sbCBieSB1c2luZyBnX2FzY2lpX3N0cnRvdWxsIChhdG9sbCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdJTjMyKQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9uZW9uL2dzdG5lb25odHRwc3JjLmM6IChnc3RfbmVvbmh0dHBfc3JjX3N0YXJ0KToKKwkgIHJlbW92ZSBhdG9sbCBieSB1c2luZyBnX2FzY2lpX3N0cnRvdWxsIChhdG9sbCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdJTjMyKQorCSAgKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jOgorCSAgKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBkb25lIHNvbWUgY2xlYW5zIGluIHNvdXJjZXMKKwkgICogd2luMzIvdnM2OgorCSAgYWRkIHByb2plY3QgZmlsZXMgZm9yIG5lb24sIHF0ZGVtdXgKKworMjAwNi0wNC0wOSAxNzozMTozNyArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogdXNlIEdfR0lOVDY0X0NPTlNUQU5UIGZvciBJTlQ2NCBjb25zdGFudHMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogKGdzdF9sZXZlbF9zZXRfY2FwcyksKGdzdF9sZXZlbF90cmFuc2Zvcm1faXApOgorCSAgdXNlIEdfR0lOVDY0X0NPTlNUQU5UIGZvciBJTlQ2NCBjb25zdGFudHMKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgZGVmaW5lIHJpbnQgZm9yIFdJTjMyICNkZWZpbmUgcmludCh4KSAoZmxvb3IoKHgpKzAuNSkpCisJICAqIHdpbjMyL3ZzNi9saWJnc3RhdmkuZHNwOgorCSAgYWRkIG1pc3NpbmcgbGlicmFyaWVzIGZvciB0aGUgbGluayBhbmQgcmVtb3ZlIGF2aW11eC5jIGZyb20KKwkgIHRoZSBwcm9qZWN0IGFzIGl0IGlzbid0IHBvcnRlZCB0byAwLjEwIHlldAorCisyMDA2LTA0LTA5IDE0OjAwOjMyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IEV2ZW4gYmV0dGVyIHdvdWxkIGJlIGlmIHdlIGFjdHVhbGx5IGRpZCB0aGUgcmlnaHQgdGhpbmcgaGVyZSAoYWxzbywgR19HVUlOVDY0X0NPTlNUQU5UIG9ubHkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChnc3RfZWJtbF9yZWFkX3NpbnQpOgorCSAgRXZlbiBiZXR0ZXIgd291bGQgYmUgaWYgd2UgYWN0dWFsbHkgZGlkIHRoZSByaWdodCB0aGluZworCSAgaGVyZSAoYWxzbywgR19HVUlOVDY0X0NPTlNUQU5UIG9ubHkgZXhpc3RzIHNpbmNlIEdMaWItMi4xMCkuCisKKzIwMDYtMDQtMDkgMTM6NTI6MDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogQ2FuJ3QganVzdCByZXBsYWNlIDFMTCB3aXRoIDFMIGhlcmUganVzdCBiZWNhdXNlIE1TVkMgZG9lc24ndCBzdXBwb3J0IGl0LCBhcyBpdCBtaWdodCBsZWFkIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogKGdzdF9lYm1sX3JlYWRfc2ludCk6CisJICBDYW4ndCBqdXN0IHJlcGxhY2UgMUxMIHdpdGggMUwgaGVyZSBqdXN0IGJlY2F1c2UgTVNWQyBkb2Vzbid0CisJICBzdXBwb3J0IGl0LCBhcyBpdCBtaWdodCBsZWFkIHRvIGluY29ycmVjdCByZXN1bHRzIHdoZW4gZG9pbmcgdGhlCisJICBiaXRzaGlmdGluZyBoZXJlLiBVc2luZyBHTGliJ3MgR19HVUlOVDY0X0NPTlNUQU5UKCkgbWFjcm8gdG8KKwkgIGZvcmNlIGEgNjQtYml0IGNvbnN0YW50IGluIGEgd2F5IHRoYXQgYWxsIGNvbXBpbGVycyBhcmUgaGFwcHkgd2l0aC4KKworMjAwNi0wNC0wOCAyMTo0ODowMSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBGaXggIzMzNzM2NSAoZ190eXBlX2NsYXNzX3JlZiA8LT4gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9hbXJ3Yi9nc3RhbXJ3YmRlYy5jOiAoZ3N0X2FtcndiZGVjX2NsYXNzX2luaXQpOgorCSAgKiBleHQvYW1yd2IvZ3N0YW1yd2JlbmMuYzogKGdzdF9hbXJ3YmVuY19jbGFzc19pbml0KToKKwkgICogZXh0L2FtcndiL2dzdGFtcndicGFyc2UuYzogKGdzdF9hbXJ3YnBhcnNlX2NsYXNzX2luaXQpOgorCSAgKiBleHQvYXJ0cy9nc3RfYXJ0cy5jOiAoZ3N0X2FydHNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9hcnRzZC9nc3RhcnRzZHNpbmsuYzogKGdzdF9hcnRzZHNpbmtfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzaW5rLmM6IChnc3RfYWZzaW5rX2NsYXNzX2luaXQpOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmc3JjLmM6IChnc3RfYWZzcmNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9hdWRpb3Jlc2FtcGxlL2dzdGF1ZGlvcmVzYW1wbGUuYzoKKwkgICogZXh0L2NkYXVkaW8vZ3N0Y2RhdWRpby5jOiAoZ3N0X2NkYXVkaW9fY2xhc3NfaW5pdCk6CisJICAqIGV4dC9kaXJlY3RmYi9kZmJ2aWRlb3NpbmsuYzogKGdzdF9kZmJ2aWRlb3NpbmtfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9kaXZ4L2dzdGRpdnhkZWMuYzogKGdzdF9kaXZ4ZGVjX2NsYXNzX2luaXQpOgorCSAgKiBleHQvaGVybWVzL2dzdGhlcm1lc2NvbG9yc3BhY2UuYzoKKwkgIChnc3RfaGVybWVzX2NvbG9yc3BhY2VfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9pdm9yYmlzL3ZvcmJpc2ZpbGUuYzogKGdzdF9pdm9yYmlzZmlsZV9jbGFzc19pbml0KToKKwkgICogZXh0L2phY2svZ3N0amFjay5jOiAoZ3N0X2phY2tfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9qYWNrL2dzdGphY2tiaW4uYzogKGdzdF9qYWNrX2Jpbl9jbGFzc19pbml0KToKKwkgICogZXh0L2xjcy9nc3Rjb2xvcnNwYWNlLmM6IChnc3RfY29sb3JzcGFjZV9jbGFzc19pbml0KToKKwkgICogZXh0L2xpYmZhbWUvZ3N0bGliZmFtZS5jOiAoZ3N0X2ZhbWVlbmNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9tdXNpY2JyYWluei9nc3R0cm0uYzogKGdzdF9tdXNpY2JyYWluel9jbGFzc19pbml0KToKKwkgICogZXh0L25hcy9uYXNzaW5rLmM6IChnc3RfbmFzc2lua19jbGFzc19pbml0KToKKwkgICogZXh0L3Nob3V0L2dzdHNob3V0LmM6IChnc3RfaWNlY2FzdHNlbmRfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9zbmFwc2hvdC9nc3RzbmFwc2hvdC5jOiAoZ3N0X3NuYXBzaG90X2NsYXNzX2luaXQpOgorCSAgKiBleHQvc25kZmlsZS9nc3RzZi5jOiAoZ3N0X3NmX2NsYXNzX2luaXQpOgorCSAgKiBleHQvc3dmZGVjL2dzdHN3ZmRlYy5jOiAoZ3N0X3N3ZmRlY2J1ZmZlcl9jbGFzc19pbml0KSwKKwkgIChnc3Rfc3dmZGVjX2NsYXNzX2luaXQpOgorCSAgKiBleHQvdGFya2luL2dzdHRhcmtpbmRlYy5jOiAoZ3N0X3RhcmtpbmRlY19jbGFzc19pbml0KToKKwkgICogZXh0L3Rhcmtpbi9nc3R0YXJraW5lbmMuYzogKGdzdF90YXJraW5lbmNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXN0cmlwLmM6IChnc3RfY2R4YXN0cmlwX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvY2hhcnQvZ3N0Y2hhcnQuYzogKGdzdF9jaGFydF9jbGFzc19pbml0KToKKwkgICogZ3N0L2NvbG9yc3BhY2UvZ3N0Y29sb3JzcGFjZS5jOiAoZ3N0X2NvbG9yc3BhY2VfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOiAoZ3N0X2RlaW50ZXJsYWNlX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZmVzdGl2YWwvZ3N0ZmVzdGl2YWwuYzogKGdzdF9mZXN0aXZhbF9jbGFzc19pbml0KToKKwkgICogZ3N0L2ZpbHRlci9nc3RicHdzaW5jLmM6IChnc3RfYnB3c2luY19jbGFzc19pbml0KToKKwkgICogZ3N0L2ZpbHRlci9nc3RpaXIuYzogKGdzdF9paXJfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy5jOiAoZ3N0X2xwd3NpbmNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9saWJyZmIvZ3N0cmZic3JjLmM6IChnc3RfcmZic3JjX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvbWl4bWF0cml4L21peG1hdHJpeC5jOiAoZ3N0X21peG1hdHJpeF9jbGFzc19pbml0KToKKwkgICogZ3N0L21wZWcxc3lzL2dzdG1wZWcxc3lzdGVtZW5jb2RlLmM6CisJICAoZ3N0X3N5c3RlbV9lbmNvZGVfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9tcGVnMXZpZGVvcGFyc2UvZ3N0bXAxdmlkZW9wYXJzZS5jOgorCSAgKGdzdF9tcDF2aWRlb3BhcnNlX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvbXBlZzJzdWIvZ3N0bXBlZzJzdWJ0LmM6IChnc3RfbXBlZzJzdWJ0X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvbXBlZ2F1ZGlvcGFyc2UvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIChnc3RfbXAzcGFyc2VfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9vdmVybGF5L2dzdG92ZXJsYXkuYzogKGdzdF9vdmVybGF5X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcGFzc3Rocm91Z2gvZ3N0cGFzc3Rocm91Z2guYzogKHBhc3N0aHJvdWdoX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcGxheW9uZGVtYW5kL2dzdHBsYXlvbmRlbWFuZC5jOiAocGxheV9vbl9kZW1hbmRfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydGpwZWcvZ3N0cnRqcGVnZGVjLmM6IChnc3RfcnRqcGVnZGVjX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRqcGVnL2dzdHJ0anBlZ2VuYy5jOiAoZ3N0X3J0anBlZ2VuY19jbGFzc19pbml0KToKKwkgICogZ3N0L3Ntb290aC9nc3RzbW9vdGguYzogKGdzdF9zbW9vdGhfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9zbW9vdGh3YXZlL2dzdHNtb290aHdhdmUuYzogKGdzdF9zbW9vdGh3YXZlX2NsYXNzX2luaXQpOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogKGdzdF9zcGVjdHJ1bV9jbGFzc19pbml0KToKKwkgICogZ3N0L3N0ZXJlby9nc3RzdGVyZW8uYzogKGdzdF9zdGVyZW9fY2xhc3NfaW5pdCk6CisJICAqIGdzdC9zd2l0Y2gvZ3N0c3dpdGNoLmM6IChnc3Rfc3dpdGNoX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvdHRhL2dzdHR0YWRlYy5jOiAoZ3N0X3R0YV9kZWNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC90dGEvZ3N0dHRhcGFyc2UuYzogKGdzdF90dGFfcGFyc2VfY2xhc3NfaW5pdCk6CisJICAqIGdzdC92YmlkZWMvZ3N0dmJpZGVjLmM6IChnc3RfdmJpZGVjX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOiAoZ3N0X3ZpZGVvX2Nyb3BfY2xhc3NfaW5pdCk6CisJICAqIGdzdC92aXJ0dWFsZHViL2dzdHhzaGFycGVuLmM6IChnc3RfeHNoYXJwZW5fY2xhc3NfaW5pdCk6CisJICAqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6IChnc3RfeTRtZW5jb2RlX2NsYXNzX2luaXQpOgorCSAgKiBzeXMvY2Ryb20vZ3N0Y2RwbGF5ZXIuYzogKGNkcGxheWVyX2NsYXNzX2luaXQpOgorCSAgKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICAoZ3N0X2RpcmVjdHNvdW5kc2lua19jbGFzc19pbml0KToKKwkgICogc3lzL2R4cjMvZHhyM2F1ZGlvc2luay5jOiAoZHhyM2F1ZGlvc2lua19jbGFzc19pbml0KToKKwkgICogc3lzL2R4cjMvZHhyM3NwdXNpbmsuYzogKGR4cjNzcHVzaW5rX2NsYXNzX2luaXQpOgorCSAgKiBzeXMvZHhyMy9keHIzdmlkZW9zaW5rLmM6IChkeHIzdmlkZW9zaW5rX2NsYXNzX2luaXQpOgorCSAgKiBzeXMvcWNhbS9nc3RxY2Ftc3JjLmM6IChnc3RfcWNhbXNyY19jbGFzc19pbml0KToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMmNvbG9yYmFsYW5jZS5jOgorCSAgKGdzdF92NGwyX2NvbG9yX2JhbGFuY2VfY2hhbm5lbF9jbGFzc19pbml0KToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmM6IChnc3RfdjRsMl90dW5lcl9jaGFubmVsX2NsYXNzX2luaXQpLAorCSAgKGdzdF92NGwyX3R1bmVyX25vcm1fY2xhc3NfaW5pdCk6CisJICAqIHN5cy94aW1hZ2VzcmMveGltYWdlc3JjLmM6IChnc3RfeGltYWdlc3JjX2NsYXNzX2luaXQpOgorCSAgRml4ICMzMzczNjUgKGdfdHlwZV9jbGFzc19yZWYgPC0+IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCkKKworMjAwNi0wNC0wOCAyMToyMTo0NSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBGaXggIzMzNzM2NSAoZ190eXBlX2NsYXNzX3JlZiA8LT4gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzogKGdzdF9hYXNpbmtfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzogKGdzdF9mbGFjX3RhZ19jbGFzc19pbml0KToKKwkgICogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6IChnc3RfZ2RrX3BpeGJ1Zl9jbGFzc19pbml0KToKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOiAoZ3N0X2pwZWdlbmNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9qcGVnL2dzdHNtb2tlZGVjLmM6IChnc3Rfc21va2VkZWNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmM6IChnc3Rfc21va2VlbmNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmM6IChnc3RfY2FjYXNpbmtfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9saWJtbmcvZ3N0bW5nZGVjLmM6IChnc3RfbW5nZGVjX2NsYXNzX2luaXQpOgorCSAgKiBleHQvbGlibW5nL2dzdG1uZ2VuYy5jOiAoZ3N0X21uZ2VuY19jbGFzc19pbml0KToKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogKGdzdF9wbmdkZWNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6IChnc3RfcG5nZW5jX2NsYXNzX2luaXQpOgorCSAgKiBleHQvbWlrbW9kL2dzdG1pa21vZC5jOiAoZ3N0X21pa21vZF9jbGFzc19pbml0KToKKwkgICogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzogKGdzdF9zaG91dDJzZW5kX2NsYXNzX2luaXQpOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleGVuY19jbGFzc19pbml0KToKKwkgICogZ3N0L2FscGhhL2dzdGFscGhhLmM6IChnc3RfYWxwaGFfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpbXV4X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZGVidWcvZWZlbmNlLmM6IChnc3RfZWZlbmNlX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZGVidWcvbmVnb3RpYXRpb24uYzogKGdzdF9uZWdvdGlhdGlvbl9jbGFzc19pbml0KToKKwkgICogZ3N0L2ZseC9nc3RmbHhkZWMuYzogKGdzdF9mbHhkZWNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9nb29tL2dzdGdvb20uYzogKGdzdF9nb29tX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzogKGdzdF9pZDNkZW11eF9jbGFzc19pbml0KToKKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6IChkZWludGVybGVhdmVfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzogKGludGVybGVhdmVfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzogKGdzdF9hbGF3ZGVjX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6IChnc3RfYWxhd2VuY19jbGFzc19pbml0KToKKwkgICogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzogKGdzdF9tdWxhd2VuY19jbGFzc19pbml0KToKKwkgICogZ3N0L21lZGlhbi9nc3RtZWRpYW4uYzogKGdzdF9tZWRpYW5fY2xhc3NfaW5pdCk6CisJICAqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6IChnc3RfbW9ub3Njb3BlX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOiAoZ3N0X211bHRpcGFydF9tdXhfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0YXN0ZXJpc2toMjYzLmM6IChnc3RfYXN0ZXJpc2toMjYzX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5LmM6IChnc3RfcnRwX0wxNmRlcGF5X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNnBheS5jOiAoZ3N0X3J0cEwxNnBheV9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOiAoZ3N0X3J0cF9hbXJfZGVwYXlfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6IChnc3RfcnRwX2Ftcl9wYXlfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzogKGdzdF9ydHBfZGVwYXlfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuYzogKGdzdF9ydHBfZ3NtX2RlcGF5X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5jOiAoZ3N0X3J0cF9nc21fcGF5X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzogKGdzdF9ydHBfaDI2M19wYXlfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOiAoZ3N0X3J0cF9oMjYzcF9kZXBheV9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOiAoZ3N0X3J0cF9oMjYzcF9wYXlfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOiAoZ3N0X3J0cF9tcDRnX3BheV9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYzogKGdzdF9ydHBfbXA0dl9kZXBheV9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6IChnc3RfcnRwX21wNHZfcGF5X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6IChnc3RfcnRwX21wYV9kZXBheV9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzogKGdzdF9ydHBfbXBhX3BheV9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzogKGdzdF9ydHBfcGNtYV9kZXBheV9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBwY21hcGF5LmM6IChnc3RfcnRwX3BjbWFfcGF5X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbXVkZXBheS5jOiAoZ3N0X3J0cF9wY211X2RlcGF5X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYzogKGdzdF9ydHBfcGNtdV9wYXlfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOiAoZ3N0X3J0cF9zcGVleF9kZXBheV9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOiAoZ3N0X3J0cF9zcGVleF9wYXlfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOiAoZ3N0X3J0cGRlY19jbGFzc19pbml0KToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOiAoZ3N0X3NtcHRlX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzogKGdzdF9keW51ZHBzaW5rX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19jbGFzc19pbml0KToKKwkgICogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6IChnc3RfdWRwc2lua19jbGFzc19pbml0KToKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiAoZ3N0X3ZpZGVvbWl4ZXJfY2xhc3NfaW5pdCk6CisJICAqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChnc3Rfd2F2ZW5jX2NsYXNzX2luaXQpOgorCSAgKiBzeXMvb3NzL2dzdG9zc2RtYWJ1ZmZlci5jOiAoZ3N0X29zc2RtYWJ1ZmZlcl9jbGFzc19pbml0KToKKwkgICogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IChnc3Rfb3NzX3NpbmtfY2xhc3NfaW5pdCk6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2VsZW1lbnQuYzoKKwkgIChnc3Rfb3N4YXVkaW9lbGVtZW50X2NsYXNzX2luaXQpOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6IChnc3Rfb3N4YXVkaW9zaW5rX2NsYXNzX2luaXQpOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzogKGdzdF9vc3hhdWRpb3NyY19jbGFzc19pbml0KToKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOiAoZ3N0X3N1bmF1ZGlvc2lua19jbGFzc19pbml0KToKKwkgIEZpeCAjMzM3MzY1IChnX3R5cGVfY2xhc3NfcmVmIDwtPiBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQpCisKKzIwMDYtMDQtMDggMTk6MDY6MjUgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgRml4IG1vcmUgYnJva2VuIEdPYmplY3QgbWFjcm9zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L21pa21vZC9nc3RtaWttb2QuaDoKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmg6CisJICBGaXggbW9yZSBicm9rZW4gR09iamVjdCBtYWNyb3MKKworMjAwNi0wNC0wOCAxODo0MTowNyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBGaXggYnJva2VuIEdPYmplY3QgbWFjcm9zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3hpbmUvZ3N0eGluZS5oOgorCSAgKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5Lmg6CisJICAqIHN5cy92NGwyL2dzdHY0bDJlbGVtZW50Lmg6CisJICAqIHN5cy94aW1hZ2VzcmMveGltYWdldXRpbC5oOgorCSAgRml4IGJyb2tlbiBHT2JqZWN0IG1hY3JvcworCisyMDA2LTA0LTA4IDE4OjI1OjU1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIEZpeCBicm9rZW4gR09iamVjdCBtYWNyb3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1sZGVjLmg6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxlbmMuaDoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbHRhZy5oOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuaDoKKwkgICogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuaDoKKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5oOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5oOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9lbGVtZW50Lmg6CisJICBGaXggYnJva2VuIEdPYmplY3QgbWFjcm9zCisKKzIwMDYtMDQtMDggMTg6MjM6MDQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRG9uJ3QgbWFrZSByb3VuZGluZyBlcnJvcnMgaW4gdGltZXN0YW1wL2R1cmF0aW9uIGNhbGN1bGF0aW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9wcmVwYXJlX2N1cnJlbnRfc2FtcGxlKSwKKwkgIChnc3RfcXRkZW11eF9jaGFpbiksIChnc3RfcXRkZW11eF9hZGRfc3RyZWFtKSwgKHF0ZGVtdXhfZHVtcF9zdHN6KSwKKwkgIChxdGRlbXV4X2R1bXBfc3RjbyksIChxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgRG9uJ3QgbWFrZSByb3VuZGluZyBlcnJvcnMgaW4gdGltZXN0YW1wL2R1cmF0aW9uIGNhbGN1bGF0aW9ucy4KKwkgIEZpeCB0aW1lc3RhbXBzIGZvciBBTVIgYW5kIElNQTQuICBGaXhlcyAoIzMzNzQzNikuCisJICBDcmVhdGUgYSBkdW1teSBzZWdtZW50IGV2ZW4gd2hlbiB0aGVyZSBpcyBubyBlZGl0IGxpc3QuCisKKzIwMDYtMDQtMDggMTM6MDk6NTAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogRG9uJ3QgdHJ5IHRvIHNlZWsgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpbGUgKHdvdWxkIG9jY2FzaW9uYWxseSBkaXNwbGF5IGVycm9yIGRpYWxvZ3MgaW4gdG90ZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjX2RlY19oYW5kbGVfc2Vla19ldmVudCk6CisJICBEb24ndCB0cnkgdG8gc2VlayBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZSAod291bGQKKwkgIG9jY2FzaW9uYWxseSBkaXNwbGF5IGVycm9yIGRpYWxvZ3MgaW4gdG90ZW0gd2hlbiBzZWVraW5nCisJICB0byB0aGUgZW5kKSAoIzMzNTg2OSkuIFdpbGwgc3RpbGwgdGhyb3cgYW4gZXJyb3IgdGhvdWdoCisJICBpZiB0aGUgZmlsZSBpcyB0cnVuY2F0ZWQgYW5kIHRoZSB0b3RhbF9zYW1wbGVzIHZhbHVlIGluCisJICB0aGUgc3RyZWFtIGhlYWRlciBpcyB3cm9uZy4KKworMjAwNi0wNC0wNyAxODoxNTowOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2RlYy4qOiBJZiB0aGUgc3RyZWFtIGhlYWRlciBkb2Vzbid0IGNvbnRhaW4gdGhlIHRvdGFsIG51bWJlciBvZiBzYW1wbGVzLCBzZWFyY2ggZm9yIHRoZSBsYXN0IGZsYWMgZnJhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfY2FsY3VsYXRlX2NyYzgpLAorCSAgKGdzdF9mbGFjX2RlY19zY2FuX2dvdF9mcmFtZSksIChnc3RfZmxhY19kZWNfc2Nhbl9mb3JfbGFzdF9ibG9jayksCisJICAoZ3N0X2ZsYWNfZGVjX21ldGFkYXRhX2NhbGxiYWNrKToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oOgorCSAgSWYgdGhlIHN0cmVhbSBoZWFkZXIgZG9lc24ndCBjb250YWluIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2FtcGxlcywKKwkgIHNlYXJjaCBmb3IgdGhlIGxhc3QgZmxhYyBmcmFtZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjYWxjdWxhdGUKKwkgIHRoZSB0b3RhbCBkdXJhdGlvbiBmcm9tIHRoYXQgZnJhbWUncyBvZmZzZXQgKGZpeGVzICMzMzc2MDkpLgorCisyMDA2LTA0LTA3IDE1OjUzOjQzICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBUeXBvIGZpeCwgcy9YRnJlZTg2L1gxMSBhbmQgYWRkZWQgZG9jIGJsdXJiIHNheWluZyB0aGF0IGl0IGZpeGF0ZXMgdG8gMjVmcHMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wNC0wNyAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCSAgKiBleHQvYW1yd2IvYW1yd2ItY29kZS9NYWtlZmlsZS5hbToKKwkgICogc3lzL3hpbWFnZXNyYy94aW1hZ2VzcmMuYzogKGdzdF94aW1hZ2VzcmNfcmVjYWxjKSwKKwkgIChnc3RfeGltYWdlc3JjX2NyZWF0ZSksIChnc3RfeGltYWdlc3JjX3NldF9wcm9wZXJ0eSk6CisJICBUeXBvIGZpeCwgcy9YRnJlZTg2L1gxMSBhbmQgYWRkZWQgZG9jIGJsdXJiIHNheWluZyB0aGF0IGl0IGZpeGF0ZXMgdG8KKwkgIDI1ZnBzCisKKzIwMDYtMDQtMDcgMTU6NDc6MjcgKzAwMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkgIHRlc3RzL2ljbGVzL3hpbWFnZXNyYy10ZXN0LmM6IEFjdHVhbGx5IGFzc2VydCB0aGF0IHBpcGVsaW5lIGdvZXMgdG8gcGxheWluZworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA0LTA3ICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisJICAqIHRlc3RzL2ljbGVzL3hpbWFnZXNyYy10ZXN0LmM6IChtYWluKToKKwkgIEFjdHVhbGx5IGFzc2VydCB0aGF0IHBpcGVsaW5lIGdvZXMgdG8gcGxheWluZworCisyMDA2LTA0LTA3IDE1OjI3OjQwICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBzeXMveGltYWdlc3JjL3hpbWFnZXNyYy5jOiBGaXggdHlwbywgQysrIHN0eWxlIGNvbW1lbnRzIGFuZCBvdGhlciBzbWFsbCBjbGVhbnVwcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA0LTA3ICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisJICAqIHN5cy94aW1hZ2VzcmMveGltYWdlc3JjLmM6IChnc3RfeGltYWdlc3JjX3JlY2FsYyksCisJICAoY29tcG9zaXRlX3BpeGVsKSwgKGdzdF94aW1hZ2VzcmNfeGltYWdlX2dldCksCisJICAoZ3N0X3hpbWFnZXNyY19jcmVhdGUpLCAoZ3N0X3hpbWFnZXNyY19zZXRfcHJvcGVydHkpOgorCSAgRml4IHR5cG8sIEMrKyBzdHlsZSBjb21tZW50cyBhbmQgb3RoZXIgc21hbGwgY2xlYW51cHMKKworMjAwNi0wNC0wNyAxMDo0ODoxOSArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBEb24ndCB1bnJlZiB0aGUgR3N0UGFkVGVtcGxhdGUgcmV0dXJuZWQgYnkgZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKToKKwkgIERvbid0IHVucmVmIHRoZSBHc3RQYWRUZW1wbGF0ZSByZXR1cm5lZCBieQorCSAgZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSgpLgorCisyMDA2LTA0LTA2IDE5OjE2OjAyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEFkZGVkIGZ1bGwgZWRpdCBsaXN0IHN1cHBvcnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfaW5pdCksCisJICAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksIChnc3RfcXRkZW11eF9maW5kX2luZGV4KSwKKwkgIChnc3RfcXRkZW11eF9maW5kX2tleWZyYW1lKSwgKGdzdF9xdGRlbXV4X2ZpbmRfc2VnbWVudCksCisJICAoZ3N0X3F0ZGVtdXhfbW92ZV9zdHJlYW0pLCAoZ3N0X3F0ZGVtdXhfcGVyZm9ybV9zZWVrKSwKKwkgIChnc3RfcXRkZW11eF9kb19zZWVrKSwgKGdzdF9xdGRlbXV4X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3F0ZGVtdXhfYWN0aXZhdGVfc2VnbWVudCksCisJICAoZ3N0X3F0ZGVtdXhfcHJlcGFyZV9jdXJyZW50X3NhbXBsZSksIChnc3RfcXRkZW11eF9hZHZhbmNlX3NhbXBsZSksCisJICAoZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9tb3ZpZSksIChnc3RfcXRkZW11eF9sb29wKSwKKwkgIChxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgQWRkZWQgZnVsbCBlZGl0IGxpc3Qgc3VwcG9ydC4KKwkgIEF2b2lkIG92ZXJmbG93cyBpbiBwcm9sb2d1ZSBpbWFnZSBkZXRlY3Rpb24gY29kZS4KKwkgIEF2b2lkIHJvdW5kb2ZmIGVycm9ycyBpbiB0aW1lc3RhbXAgY2FsY3VsYXRpb25zLgorCisyMDA2LTA0LTA2IDExOjM1OjI2ICswMDAwICBqXiA8akBib290bGFiLm9yZz4KKworCSAgVW5pZnkgdGhlIGxvbmcgZGVzY3JpcHRpb25zIGluIHRoZSBwbHVnaW4gZGV0YWlscyAoIzMzNzI2MykuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBqXiAgPGogYXQgYm9vdGxhYiBkb3Qgb3JnPgorCSAgKiBleHQvYW1yd2IvZ3N0YW1yd2JkZWMuYzoKKwkgICogZXh0L2FtcndiL2dzdGFtcndiZW5jLmM6CisJICAqIGV4dC9hbXJ3Yi9nc3RhbXJ3YnBhcnNlLmM6CisJICAqIGV4dC9hcnRzL2dzdF9hcnRzLmM6CisJICAqIGV4dC9hcnRzZC9nc3RhcnRzZHNpbmsuYzoKKwkgICogZXh0L2F1ZGlvZmlsZS9nc3RhZnBhcnNlLmM6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzaW5rLmM6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzcmMuYzoKKwkgICogZXh0L2NkYXVkaW8vZ3N0Y2RhdWRpby5jOgorCSAgKiBleHQvZGlyZWN0ZmIvZGZidmlkZW9zaW5rLmM6CisJICAqIGV4dC9kaXZ4L2dzdGRpdnhkZWMuYzoKKwkgICogZXh0L2RpdngvZ3N0ZGl2eGVuYy5jOgorCSAgKiBleHQvZHRzL2dzdGR0c2RlYy5jOiAoZ3N0X2R0c2RlY19iYXNlX2luaXQpOgorCSAgKiBleHQvZmFhYy9nc3RmYWFjLmM6IChnc3RfZmFhY19iYXNlX2luaXQpOgorCSAgKiBleHQvZmFhZC9nc3RmYWFkLmM6CisJICAqIGV4dC9nc20vZ3N0Z3NtZGVjLmM6CisJICAqIGV4dC9nc20vZ3N0Z3NtZW5jLmM6CisJICAqIGV4dC9oZXJtZXMvZ3N0aGVybWVzY29sb3JzcGFjZS5jOgorCSAgKiBleHQvaXZvcmJpcy92b3JiaXNmaWxlLmM6CisJICAqIGV4dC9sY3MvZ3N0Y29sb3JzcGFjZS5jOgorCSAgKiBleHQvbGliZmFtZS9nc3RsaWJmYW1lLmM6CisJICAqIGV4dC9saWJtbXMvZ3N0bW1zLmM6IChnc3RfbW1zX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9tdXNpY2JyYWluei9nc3R0cm0uYzogKGdzdF9tdXNpY2JyYWluel9iYXNlX2luaXQpOgorCSAgKiBleHQvbmFzL25hc3NpbmsuYzogKGdzdF9uYXNzaW5rX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9uZW9uL2dzdG5lb25odHRwc3JjLmM6CisJICAqIGV4dC9wb2x5cC9wb2x5cHNpbmsuYzogKGdzdF9wb2x5cHNpbmtfYmFzZV9pbml0KToKKwkgICogZXh0L3NkbC9zZGxhdWRpb3NpbmsuYzoKKwkgICogZXh0L3NkbC9zZGx2aWRlb3NpbmsuYzoKKwkgICogZXh0L3Nob3V0L2dzdHNob3V0LmM6CisJICAqIGV4dC9zbmFwc2hvdC9nc3RzbmFwc2hvdC5jOgorCSAgKiBleHQvc25kZmlsZS9nc3RzZi5jOgorCSAgKiBleHQvdGFya2luL2dzdHRhcmtpbmRlYy5jOgorCSAgKiBleHQvdGFya2luL2dzdHRhcmtpbmVuYy5jOgorCSAgKiBleHQvdGhlb3JhL3RoZW9yYWRlYy5jOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfYmFzZV9pbml0KToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IChnc3Rfd2F2cGFja19wYXJzZV9iYXNlX2luaXQpOgorCSAgKiBleHQveHZpZC9nc3R4dmlkZGVjLmM6CisJICAqIGV4dC94dmlkL2dzdHh2aWRlbmMuYzoKKwkgICogZ3N0L2NkeGFwYXJzZS9nc3RjZHhhcGFyc2UuYzogKGdzdF9jZHhhX3BhcnNlX2Jhc2VfaW5pdCk6CisJICAqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXN0cmlwLmM6IChnc3RfY2R4YXN0cmlwX2Jhc2VfaW5pdCk6CisJICAqIGdzdC9jaGFydC9nc3RjaGFydC5jOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOiAoZ3N0X2lpcl9lcXVhbGl6ZXJfYmFzZV9pbml0KToKKwkgICogZ3N0L2Zlc3RpdmFsL2dzdGZlc3RpdmFsLmM6CisJICAqIGdzdC9maWx0ZXIvZ3N0aWlyLmM6CisJICAqIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy5jOgorCSAgKiBnc3QvZnJlZXplL2dzdGZyZWV6ZS5jOgorCSAgKiBnc3QvZ2FtZXMvZ3N0cHV6emxlLmM6IChnc3RfcHV6emxlX2Jhc2VfaW5pdCk6CisJICAqIGdzdC9taXhtYXRyaXgvbWl4bWF0cml4LmM6CisJICAqIGdzdC9tcGVnMXN5cy9nc3RtcGVnMXN5c3RlbWVuY29kZS5jOgorCSAgKiBnc3QvbXBlZzF2aWRlb3BhcnNlL2dzdG1wMXZpZGVvcGFyc2UuYzoKKwkgICogZ3N0L21wZWcyc3ViL2dzdG1wZWcyc3VidC5jOgorCSAgKiBnc3QvbXBlZ2F1ZGlvcGFyc2UvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgICogZ3N0L211bHRpZmlsZXNpbmsvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgKiBnc3Qvb3ZlcmxheS9nc3RvdmVybGF5LmM6CisJICAqIGdzdC9wYXNzdGhyb3VnaC9nc3RwYXNzdGhyb3VnaC5jOgorCSAgKiBnc3QvcGxheW9uZGVtYW5kL2dzdHBsYXlvbmRlbWFuZC5jOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICAqIGdzdC9ydGpwZWcvZ3N0cnRqcGVnZGVjLmM6CisJICAqIGdzdC9ydGpwZWcvZ3N0cnRqcGVnZW5jLmM6CisJICAqIGdzdC9zbW9vdGgvZ3N0c21vb3RoLmM6CisJICAqIGdzdC90dGEvZ3N0dHRhZGVjLmM6IChnc3RfdHRhX2RlY19iYXNlX2luaXQpOgorCSAgKiBnc3QvdHRhL2dzdHR0YXBhcnNlLmM6IChnc3RfdHRhX3BhcnNlX2Jhc2VfaW5pdCk6CisJICAqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJICAqIGdzdC92aWRlb2Ryb3AvZ3N0dmlkZW9kcm9wLmM6CisJICAqIGdzdC92aXJ0dWFsZHViL2dzdHhzaGFycGVuLmM6CisJICAqIGdzdC94aW5naGVhZGVyL2dzdHhpbmdtdXguYzogKGdzdF94aW5nX211eF9iYXNlX2luaXQpOgorCSAgKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgVW5pZnkgdGhlIGxvbmcgZGVzY3JpcHRpb25zIGluIHRoZSBwbHVnaW4gZGV0YWlscyAoIzMzNzI2MykuCisKKzIwMDYtMDQtMDYgMDk6MTQ6MzAgKzAwMDAgIEJyaWFuIENhbWVyb24gPGJyaWFuLmNhbWVyb25Ac3VuLmNvbT4KKworCSAgc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay4qOiBVc2Ugc3BlYy0+c2Vnc2l6ZSBhbmQgc3BlYy0+c2VndG90YWwgaW4gdGhlIHByZXBhcmUgZnVuY3Rpb24gdG8gaW5pdGlhbGlzZSB0aGUgcmluZyBiLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBCcmlhbiBDYW1lcm9uICA8YnJpYW4gZG90IGNhbWVyb24gYXQgc3VuIGRvdCBjb20+CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NpbmsuYzogKGdzdF9zdW5hdWRpb3NpbmtfaW5pdCksCisJICAoZ3N0X3N1bmF1ZGlvc2lua19wcmVwYXJlKSwgKGdzdF9zdW5hdWRpb3Npbmtfd3JpdGUpOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmg6CisJICBVc2Ugc3BlYy0+c2Vnc2l6ZSBhbmQgc3BlYy0+c2VndG90YWwgaW4gdGhlIHByZXBhcmUgZnVuY3Rpb24KKwkgIHRvIGluaXRpYWxpc2UgdGhlIHJpbmcgYnVmZmVyIGluc3RlYWQgb2YgdXNpbmcgdGhlIGJ1ZmZlci10aW1lCisJICBwcm9wZXJ0eSAoIzMzNzQyMSkuCisKKzIwMDYtMDQtMDYgMDg6NTI6NTEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogQnVtcCBjb3JlIHJlcXVpcmVtZW50cyB0byBDVlMgZm9yIGdzdF9wYWRfcXVlcnlfcGVlcl9kdXJhdGlvbigpIHdoaWNoIGlzIHVzZWQgYnkgc3BlZXhkZWMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgQnVtcCBjb3JlIHJlcXVpcmVtZW50cyB0byBDVlMgZm9yIGdzdF9wYWRfcXVlcnlfcGVlcl9kdXJhdGlvbigpCisJICB3aGljaCBpcyB1c2VkIGJ5IHNwZWV4ZGVjLgorCisyMDA2LTA0LTA1IDE4OjI3OjIyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvc3BlZXgvOiBGaXggc2Vla2luZyBhbmQgZHVyYXRpb24gcXVlcmllcyAoIzMzNzAzMyk7IGNsZWFuIHVwIGFuZCByZWZhY3RvciBhIGJpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXguYzogKHBsdWdpbl9pbml0KToKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IChnc3Rfc3BlZXhfZGVjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zcGVleF9kZWNfcmVzZXQpLCAoZ3N0X3NwZWV4X2RlY19pbml0KSwgKHNwZWV4X2RlY19jb252ZXJ0KSwKKwkgIChzcGVleF9nZXRfc2lua19xdWVyeV90eXBlcyksIChzcGVleF9kZWNfc2lua19xdWVyeSksCisJICAoc3BlZXhfZ2V0X3NyY19xdWVyeV90eXBlcyksIChzcGVleF9kZWNfc3JjX3F1ZXJ5KSwKKwkgIChzcGVleF9kZWNfc3JjX2V2ZW50KSwgKHNwZWV4X2RlY19zaW5rX2V2ZW50KSwKKwkgIChzcGVleF9kZWNfY2hhaW5fcGFyc2VfaGVhZGVyKSwgKHNwZWV4X2RlY19jaGFpbl9wYXJzZV9jb21tZW50cyksCisJICAoc3BlZXhfZGVjX2NoYWluX3BhcnNlX2RhdGEpLCAoc3BlZXhfZGVjX2NoYWluKSwKKwkgIChnc3Rfc3BlZXhfZGVjX2dldF9wcm9wZXJ0eSksIChnc3Rfc3BlZXhfZGVjX3NldF9wcm9wZXJ0eSksCisJICAoc3BlZXhfZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5oOgorCSAgRml4IHNlZWtpbmcgYW5kIGR1cmF0aW9uIHF1ZXJpZXMgKCMzMzcwMzMpOyBjbGVhbiB1cCBhbmQKKwkgIHJlZmFjdG9yIGEgYml0LgorCisyMDA2LTA0LTA1IDEyOjQxOjE0ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IGRpc3Rpbmd1aXNoIGJldHdlZW4gZGV2aWNlIG5vdCBmb3VuZCBhbmQgY291bGQgbm90IG9wZW4gZm9yIHJlYWRpbmcKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkgIGRpc3Rpbmd1aXNoIGJldHdlZW4gZGV2aWNlIG5vdCBmb3VuZCBhbmQgY291bGQgbm90IG9wZW4gZm9yCisJICByZWFkaW5nCisKKzIwMDYtMDQtMDUgMDg6MzY6NTUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogVXNlIGR1cmF0aW9uIGFzIHNlZ21lbnQgc3RvcCBwb3NpdGlvbiBpZiBub25lIGlzIGV4cGxpY2l0bHkgY29uZmlndXJlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9wZXJmb3JtX3NlZWspLAorCSAgKGdzdF9xdGRlbXV4X2RvX3NlZWspLCAoZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9tb3ZpZSksCisJICAoZ3N0X3F0ZGVtdXhfbG9vcCk6CisJICBVc2UgZHVyYXRpb24gYXMgc2VnbWVudCBzdG9wIHBvc2l0aW9uIGlmIG5vbmUgaXMKKwkgIGV4cGxpY2l0bHkgY29uZmlndXJlZC4KKwkgIEFsc28gcGVyZm9ybSBFT1Mgd2hlbiB3ZSBydW4gcGFzdCB0aGUgc2VnbWVudCBzdG9wLgorCisyMDA2LTA0LTA0IDExOjIwOjU4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IE1vcmUgY2xlYW51cHMsIGFkZGVkIGNvbW1lbnRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2dvX2JhY2spLAorCSAgKGdzdF9xdGRlbXV4X3BlcmZvcm1fc2VlayksIChnc3RfcXRkZW11eF9kb19zZWVrKSwKKwkgIChnc3RfcXRkZW11eF9sb29wX3N0YXRlX21vdmllKSwgKGdzdF9xdGRlbXV4X2xvb3ApLAorCSAgKGdzdF9xdGRlbXV4X2NoYWluKSwgKHF0ZGVtdXhfcGFyc2VfdHJlZSksIChxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgTW9yZSBjbGVhbnVwcywgYWRkZWQgY29tbWVudHMuCisJICBNYXJrIGRpc2NvbnRpbnVpdGllcyBvbiBvdXRnb2luZyBidWZmZXJzLgorCSAgUG9zdCBiZXR0ZXIgZXJyb3JzIHdoZW4gc29tZXRoaW5nIGdvZXMgd3JvbmcuCisJICBIYW5kbGUgRU9TIGFuZCBzZWdtZW50IGVuZCBwcm9wZXJseS4KKworMjAwNi0wNC0wNCAwODozMToxMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC4qOiBIYW5kbGUgc3RzcyBib3hlcyBzbyB3ZSBjYW4gbWFyayBhbmQgZmluZCBrZXlmcmFtZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfaW5pdCksCisJICAoZ3N0X3F0ZGVtdXhfcHVzaF9ldmVudCksIChnc3RfcXRkZW11eF9nb19iYWNrKSwKKwkgIChnc3RfcXRkZW11eF9wZXJmb3JtX3NlZWspLCAoZ3N0X3F0ZGVtdXhfZG9fc2VlayksCisJICAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19ldmVudCksIChwbHVnaW5faW5pdCksCisJICAoZ3N0X3F0ZGVtdXhfY2hhbmdlX3N0YXRlKSwgKGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfbW92aWUpLAorCSAgKGdzdF9xdGRlbXV4X2xvb3ApLCAoZ3N0X3F0ZGVtdXhfY2hhaW4pLAorCSAgKHF0ZGVtdXhfc2lua19hY3RpdmF0ZV9wdWxsKSwgKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pLAorCSAgKHF0ZGVtdXhfcGFyc2UpLCAocXRkZW11eF9wYXJzZV90cmVlKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayksCisJICAocXRkZW11eF9wYXJzZV91ZHRhKSwgKHF0ZGVtdXhfdGFnX2FkZF9zdHIpLCAocXRkZW11eF90YWdfYWRkX251bSksCisJICAocXRkZW11eF90YWdfYWRkX2ducmUpLCAoZ3N0X3F0ZGVtdXhfaGFuZGxlX2VzZHMpOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJICBIYW5kbGUgc3RzcyBib3hlcyBzbyB3ZSBjYW4gbWFyayBhbmQgZmluZCBrZXlmcmFtZXMuCisJICBJbXBsZW1lbnQgY29ycmVjdCBhY2N1cmF0ZSBhbmQga2V5ZnJhbWUgc2Vla2luZy4KKwkgIFVzZSBfREVCVUdfT0JKRUNUIHdoZW4gcG9zc2libGUuCisKKzIwMDYtMDQtMDMgMTM6Mjk6MjAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSAgaWdub3JlIG1vcmUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgaWdub3JlIG1vcmUKKworMjAwNi0wNC0wMyAxMzoyODo1NSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIHBrZ2NvbmZpZy9NYWtlZmlsZS5hbToKKwkgIGZpeCBkaXN0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZpeCBkaXN0CisKKzIwMDYtMDQtMDMgMDk6MDI6MjkgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBhZGQgYSAucGMgZmlsZSBzbyBvdGhlciBtb2R1bGVzIGNhbiB1c2UgZ29vZCBwbHVnaW5zIGluIHRlc3RzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogTWFrZWZpbGUuYW06CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogcGtnY29uZmlnLy5jdnNpZ25vcmU6CisJICAqIHBrZ2NvbmZpZy9NYWtlZmlsZS5hbToKKwkgICogcGtnY29uZmlnL2dzdHJlYW1lci1wbHVnaW5zLWdvb2QtdW5pbnN0YWxsZWQucGMuaW46CisJICBhZGQgYSAucGMgZmlsZSBzbyBvdGhlciBtb2R1bGVzIGNhbiB1c2UgZ29vZCBwbHVnaW5zIGluIHRlc3RzCisKKzIwMDYtMDQtMDEgMTY6NTA6NDkgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBjb21tb246CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXRkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDN2Mm11eC5jOgorCSAgYWRkIHRhZ2xpYiBjaGVja3MgYW5kIGRvY3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkIHRhZ2xpYiBjaGVja3MgYW5kIGRvY3MKKworMjAwNi0wNC0wMSAxNTozMDo1MSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy91cGxvYWQubWFrOgorCSAgZGlzYWJsZSB1c2Ugb2YgQVNfTElCVE9PTF9UQUdTLCBpdCBkb2Vzbid0IHdvcmsgY29ycmVjdGx5CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGRpc2FibGUgdXNlIG9mIEFTX0xJQlRPT0xfVEFHUywgaXQgZG9lc24ndCB3b3JrIGNvcnJlY3RseQorCisyMDA2LTA0LTAxIDE0OjAzOjAzICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogY29tbW9uOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxhZHNwYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJICBhZGRpbmcgaW5zcGVjdCBmaWxlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGRpbmcgaW5zcGVjdCBmaWxlcworCisyMDA2LTA0LTAxIDEwOjE1OjMzICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogdGVzdHMvaWNsZXMveGltYWdlc3JjLXRlc3QuYzoKKwkgIDUgc2Vjb25kIHRpbWVvdXQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgNSBzZWNvbmQgdGltZW91dAorCisyMDA2LTA0LTAxIDEwOjE0OjI2ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogdGVzdHMvaWNsZXMvLmdpdGlnbm9yZToKKwkqIHRlc3RzL2ljbGVzL01ha2VmaWxlLmFtOgorCSogdGVzdHMvaWNsZXMveGltYWdlc3JjLXRlc3QuYzoKKwkgIHJlbmFtZSB0ZXN0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbmFtZSB0ZXN0CisKKzIwMDYtMDQtMDEgMTA6MDk6MTEgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3BsdWdpbi5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kcGx1Z2luLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSAgcmV3b3JrIGJ1aWxkOyBhZGQgdHJhbnNsYXRpb25zIGZvciB2NGwyCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJld29yayBidWlsZDsgYWRkIHRyYW5zbGF0aW9ucyBmb3IgdjRsMgorCisyMDA2LTA0LTAxIDA5OjU2OjQ1ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgY29uZmlndXJlLmFjOiBjbGVhbiB1cCwgdXNlIEFTX1ZFUlNJT04gYW5kIEFTX05BTk8KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBjbGVhbiB1cCwgdXNlIEFTX1ZFUlNJT04gYW5kIEFTX05BTk8KKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9zdGFydCk6CisJICB1c2UgUEFDS0FHRV9WRVJTSU9OIGRlZmluZQorCSAgKiBwby9hZi5wbzoKKwkgICogcG8vYXoucG86CisJICAqIHBvL2NzLnBvOgorCSAgKiBwby9lbl9HQi5wbzoKKwkgICogcG8vaHUucG86CisJICAqIHBvL2l0LnBvOgorCSAgKiBwby9uYi5wbzoKKwkgICogcG8vbmwucG86CisJICAqIHBvL29yLnBvOgorCSAgKiBwby9zcS5wbzoKKwkgICogcG8vc3IucG86CisJICAqIHBvL3N2LnBvOgorCSAgKiBwby91ay5wbzoKKwkgICogcG8vdmkucG86CisJICB1cGRhdGVkCisKKzIwMDYtMDMtMzEgMTc6NTI6MzYgKzAwMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkgIEFkZCB0ZXN0cyBhbmQgZml4IFBBUiBjYXBzIGlzc3VlIHRvIHhpbWFnZXNyYworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAzLTMxICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisJICAqIE1ha2VmaWxlLmFtOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIHN5cy94aW1hZ2VzcmMveGltYWdlc3JjLmM6CisJICAoZ3N0X3hpbWFnZXNyY194aW1hZ2VfZ2V0KSwKKwkgIChnc3RfeGltYWdlc3JjX2dldF9jYXBzKSwgKGdzdF94aW1hZ2VzcmNfY2xhc3NfaW5pdCk6CisJICAqIHN5cy94aW1hZ2VzcmMveGltYWdldXRpbC5jOgorCSAgKiB0ZXN0cy9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvaWNsZXMvTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2ljbGVzL3hpbWFnZXNyYy10ZXN0LmM6ICh0ZXJtaW5hdGVfcGxheWJhY2spLCAobWFpbik6CisJICBBZGQgdGVzdHMgYW5kIGZpeCBQQVIgY2FwcyBpc3N1ZSB0byB4aW1hZ2VzcmMKKworMjAwNi0wMy0zMSAxNjozMjo0NyArMDAwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSAgc3lzL3hpbWFnZXNyYy94aW1hZ2VzcmMuYzogQWRkIGRvY3MgdG8geGltYWdlc3JjCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDMtMzEgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKwkgICogc3lzL3hpbWFnZXNyYy94aW1hZ2VzcmMuYzoKKwkgIEFkZCBkb2NzIHRvIHhpbWFnZXNyYworCisyMDA2LTAzLTMxIDE1OjIxOjM1ICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBzeXMveGltYWdlc3JjLzogRml4IHhpbWFnZXNyYyBzbyBhKSB0aGUgY3Vyc29yIGRvZXNudCB0cmFpbCBhbmQgYikgdGhlcmUgYXJlIG5vIHllbGxvdyByZWN0YW5nbGVzIHdpdGggdGhlIGN1cnNvcgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAzLTMxICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisJICAqIHN5cy94aW1hZ2VzcmMveGltYWdlc3JjLmM6IChjb21wb3NpdGVfcGl4ZWwpLAorCSAgKGdzdF94aW1hZ2VzcmNfeGltYWdlX2dldCksIChnc3RfeGltYWdlc3JjX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3hpbWFnZXNyY19nZXRfY2FwcyksIChnc3RfeGltYWdlc3JjX2NsYXNzX2luaXQpOgorCSAgKiBzeXMveGltYWdlc3JjL3hpbWFnZXNyYy5oOgorCSAgKiBzeXMveGltYWdlc3JjL3hpbWFnZXV0aWwuYzogKHhpbWFnZXV0aWxfeGNvbnRleHRfZ2V0KToKKwkgICogc3lzL3hpbWFnZXNyYy94aW1hZ2V1dGlsLmg6CisJICBGaXggeGltYWdlc3JjIHNvIGEpIHRoZSBjdXJzb3IgZG9lc250IHRyYWlsIGFuZCBiKSB0aGVyZSBhcmUgbm8KKwkgIHllbGxvdyByZWN0YW5nbGVzIHdpdGggdGhlIGN1cnNvcgorCisyMDA2LTAzLTMwIDIzOjQ2OjQyICswMDAwICBTw6liYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisKKwkqIHdpbjMyL3ZzNi9nc3RfcGx1Z2luc19nb29kLmRzdzoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhbGF3LmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhbHBoYS5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0YWxwaGFjb2xvci5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0YXBldGFnLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhdXBhcnNlLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhdXRvZGV0ZWN0LmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhdmkuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdGN1dHRlci5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0ZWZmZWN0di5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0Zmx4LmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3Rnb29tLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RpZDNkZW11eC5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0aW50ZXJsZWF2ZS5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0anBlZy5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0bGV2ZWwuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdG1hdHJvc2thLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RtZWRpYW4uZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdG1vbm9zY29wZS5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0bXVsYXcuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdG11bHRpcGFydC5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0cnRwLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RydHNwLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RzbXB0ZS5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0c3BlZXguZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdHZpZGVvYmFsYW5jZS5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0dmlkZW9ib3guZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdHZpZGVvZmxpcC5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0dmlkZW9taXhlci5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0d2F2ZW5jLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3R3YXZwYXJzZS5kc3A6CisJICBJJ20gdG9vIGxhenkgdG8gY29tbWVudCB0aGlzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICoqKiBlbXB0eSBsb2cgbWVzc2FnZSAqKioKKworMjAwNi0wMy0zMCAyMzozNzoxNiArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICBleHRcanBlZ1xzbW9rZWNvZGVjLmM6IHVzZSBvZiBHU1RfREVCVUcgaW5zdGVhZCBvZiBERUJVRyhhLi4uKSBmb3IgV0lOMzIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHRcanBlZ1xzbW9rZWNvZGVjLmM6CisJICB1c2Ugb2YgR1NUX0RFQlVHIGluc3RlYWQgb2YgREVCVUcoYS4uLikgZm9yIFdJTjMyCisJICAqIGV4dFxzcGVleFxnc3RzcGVleGVuYy5jOiAoZ3N0X3NwZWV4ZW5jX3NldF9oZWFkZXJfb25fY2Fwcyk6CisJICBtb3ZlIGZpcnN0IGluc3RydWN0aW9uIGFmdGVyIGFsbCB2YXJpYWJsZXMgZGVjbGFyYXRpb25zCisJICAqIGdzdFxhbHBoYVxnc3RhbHBoYS5jOgorCSAgKiBnc3RcZWZmZWN0dlxnc3RzaGFnYWRlbGljLmM6CisJICAqIGdzdFxzbXB0ZVxwYWludC5jOgorCSAgKiBnc3RcdmlkZW9maWx0ZXJcZ3N0dmlkZW9iYWxhbmNlLmM6CisJICBkZWZpbmUgTV9QSSBpZiBpdCdzIG5vdCBkZWZpbmVkIChpdCdzIG5vdCBkZWZpbmVkIG9uIFdJTjMyKQorCSAgKiBnc3RcY3V0dGVyXGdzdGN1dHRlci5jOiAoZ3N0X2N1dHRlcl9jaGFpbik6CisJICAqIGdzdFxpZDNkZW11eFxpZDN2MmZyYW1lcy5jOiAocGFyc2VfcmVsYXRpdmVfdm9sdW1lX2FkanVzdG1lbnRfdHdvKToKKwkgICogZ3N0XGxldmVsXGdzdGxldmVsLmM6IChnc3RfbGV2ZWxfc2V0X3Byb3BlcnR5KSwgKGdzdF9sZXZlbF90cmFuc2Zvcm1faXApOgorCSAgKiBnc3RcbWF0cm9za2FcbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmZvKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfdmlkZW9fY2Fwcyk6CisJICAqIGdzdFxtYXRyb3NrYVxtYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfc3RhcnQpLCAoZ3N0X21hdHJvc2thX211eF9maW5pc2gpOgorCSAgKiBnc3Rcd2F2cGFyc2VcZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9zdHJlYW1fZGF0YSk6CisJICB1c2UgZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSBmb3IgY29udmVyc2lvbnMKKwkgICogZ3N0XGdvb21cZmlsdGVycy5jOiAoc2V0UGl4ZWxSR0JfKToKKwkgIGZpeCBhIGRlYnVnIHdoaWNoIHdhcyB1c2luZyB1bmRlZmluZWQgdmFyaWFibGUKKwkgICogZ3N0XGxldmVsXGdzdGxldmVsLmM6IChnc3RfbGV2ZWxfc2V0X2NhcHMpLCAoZ3N0X2xldmVsX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdFxtYXRyb3NrYVxlYm1sLXJlYWQuYzogKGdzdF9lYm1sX3JlYWRfc2ludCk6CisJICByZXBsYWNlIExMIHN1ZmZpeCB3aXRoIEwgc3VmZml4IChMTCBpc24ndCBzdXBwb3J0ZWQgYnkgTVNWQzYuMCkKKwkgICogd2luMzIvdnM2OgorCSAgYWRkIHZzNiBwcm9qZWN0cyBmaWxlcyBmb3IgbW9zdCBvZiBwbHVnaW5zLWdvb2QKKworMjAwNi0wMy0zMCAxNTozNzowNSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgYmV0dGVyL3VuaWZpZWQgbG9uZyBkZXNjcmlwdGlvbnMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuYzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzoKKwkgICogZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5LmM6CisJICAqIGV4dC9jZGlvL2dzdGNkaW9jZGRhc3JjLmM6CisJICAqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSAgKiBleHQvZXNkL2VzZG1vbi5jOgorCSAgKiBleHQvZXNkL2VzZHNpbmsuYzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzoKKwkgICogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zaW5rLmM6IChnc3RfZ2NvbmZfYXVkaW9fc2lua19iYXNlX2luaXQpOgorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NyYy5jOiAoZ3N0X2djb25mX2F1ZGlvX3NyY19iYXNlX2luaXQpOgorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NpbmsuYzogKGdzdF9nY29uZl92aWRlb19zaW5rX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc3JjLmM6IChnc3RfZ2NvbmZfdmlkZW9fc3JjX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5jOgorCSAgKiBleHQvaGFsL2dzdGhhbGF1ZGlvc2luay5jOiAoZ3N0X2hhbF9hdWRpb19zaW5rX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9oYWwvZ3N0aGFsYXVkaW9zcmMuYzogKGdzdF9oYWxfYXVkaW9fc3JjX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAgKiBleHQvanBlZy9nc3RzbW9rZWRlYy5jOgorCSAgKiBleHQvanBlZy9nc3RzbW9rZWVuYy5jOgorCSAgKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5jOgorCSAgKiBleHQvbGlibW5nL2dzdG1uZ2RlYy5jOgorCSAgKiBleHQvbGlibW5nL2dzdG1uZ2VuYy5jOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOgorCSAgKiBleHQvbWlrbW9kL2dzdG1pa21vZC5jOgorCSAgKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkgICogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzoKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkgICogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkgICogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJICAoZ3N0X2F1dG9fYXVkaW9fc2lua19iYXNlX2luaXQpOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJICAoZ3N0X2F1dG9fdmlkZW9fc2lua19iYXNlX2luaXQpOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aW11eF9iYXNlX2luaXQpOgorCSAgKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOgorCSAgKiBnc3QvZGVidWcvYnJlYWtteWRhdGEuYzoKKwkgICogZ3N0L2RlYnVnL2VmZW5jZS5jOgorCSAgKiBnc3QvZGVidWcvZ3N0bmF2aWdhdGlvbnRlc3QuYzoKKwkgICogZ3N0L2RlYnVnL25lZ290aWF0aW9uLmM6CisJICAqIGdzdC9kZWJ1Zy9wcm9ncmVzc3JlcG9ydC5jOgorCSAgKiBnc3QvZGVidWcvdGVzdHBsdWdpbi5jOgorCSAgKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSAgKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJICAqIGdzdC9lZmZlY3R2L2dzdGVkZ2UuYzoKKwkgICogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkgICogZ3N0L2VmZmVjdHYvZ3N0cmV2LmM6CisJICAqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkgICogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSAgKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJICAqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJICAqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzogKGdzdF9hbGF3ZGVjX2Jhc2VfaW5pdCk6CisJICAqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzogKGdzdF9hbGF3ZW5jX2Jhc2VfaW5pdCk6CisJICAqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6IChnc3RfbXVsYXdkZWNfYmFzZV9pbml0KToKKwkgICogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzogKGdzdF9tdWxhd2VuY19iYXNlX2luaXQpOgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfYmFzZV9pbml0KToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9iYXNlX2luaXQpOgorCSAgKiBnc3QvbWVkaWFuL2dzdG1lZGlhbi5jOgorCSAgKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJICAqIGdzdC9vbGRjb3JlL2dzdG1kNXNpbmsuYzoKKwkgICogZ3N0L29sZGNvcmUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJICAqIGdzdC9vbGRjb3JlL2dzdHBpcGVmaWx0ZXIuYzoKKwkgICogZ3N0L29sZGNvcmUvZ3N0c2hhcGVyLmM6CisJICAqIGdzdC9vbGRjb3JlL2dzdHN0YXRpc3RpY3MuYzoKKwkgICogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNnBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBwY211cGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmM6CisJICAqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOgorCSAgKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzoKKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICAqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jOiAoZ3N0X2dhbW1hX2Jhc2VfaW5pdCk6CisJICAqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW90ZW1wbGF0ZS5jOgorCSAgKGdzdF92aWRlb3RlbXBsYXRlX2Jhc2VfaW5pdCk6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgICogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfYmFzZV9pbml0KToKKwkgIGJldHRlci91bmlmaWVkIGxvbmcgZGVzY3JpcHRpb25zCisJICBGaXhlZCAjMzM2NjAyCisJICBTb21lIGNsZWFudXBzIHRvIGF1cGFyc2UsIGRvbid0IHNlbmQgbXVsdGlwbGUgbmV3c2VnbWVudHMuCisKKzIwMDYtMDMtMjkgMTY6MDY6NTAgKzAwMDAgIE1pY2hhZWwgRG9taW5pYyBLIDxtZGtAbWRrLm9yZy5wbD4KKworCSAgZXh0L2R2L2dzdGR2ZGVtdXguKjogU2VlayBpbiBSRUFEWSBwYXRjaC4gT25seSB3b3JrcyBmb3IgcHVsbCBiYXNlZCBtb2RlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGcm9tIGEgcGF0Y2ggYnk6IE1pY2hhZWwgRG9taW5pYyBLLiA8bWRrIGF0IG1kayBkb3Qgb3JnIGRvdCBwbD4KKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2NsYXNzX2luaXQpLAorCSAgKGdzdF9kdmRlbXV4X3Jlc2V0KSwgKGdzdF9kdmRlbXV4X3NyY19jb252ZXJ0KSwKKwkgIChnc3RfZHZkZW11eF9zZW5kX2V2ZW50KSwgKGdzdF9kdmRlbXV4X2ZsdXNoKSwgKGdzdF9kdmRlbXV4X2xvb3ApLAorCSAgKGdzdF9kdmRlbXV4X3NpbmtfYWN0aXZhdGVfcHVsbCksIChnc3RfZHZkZW11eF9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5oOgorCSAgU2VlayBpbiBSRUFEWSBwYXRjaC4gT25seSB3b3JrcyBmb3IgcHVsbCBiYXNlZCBtb2RlLgorCSAgRml4ZXMgIzMyMzg4MAorCisyMDA2LTAzLTI3IDE3OjA2OjQ1ICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIFNtYWxsIGZpeCwgbm93IHB3YyBkcml2ZXIgY2FuIHRlbGwgYWJvdXQgaXRzIGJ1ZmZlcnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFNtYWxsIGZpeCwgbm93IHB3YyBkcml2ZXIgY2FuIHRlbGwgYWJvdXQgaXRzIGJ1ZmZlcnMuCisKKzIwMDYtMDMtMjcgMTQ6MDk6MTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOiBGaXggdHdvIGNyYXNoZXJzOiBkb24ndCB1bnJlZiB0aGUgc2FtZSBjYXBzIHR3aWNlLCBhbmQgc2V0IHBpeGJ1ZiBsb2FkZXIgdG8gTlVMTCBhZnRlci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOiAoZ3N0X2dka19waXhidWZfZmx1c2gpLAorCSAgKGdzdF9nZGtfcGl4YnVmX2V2ZW50KToKKwkgIEZpeCB0d28gY3Jhc2hlcnM6IGRvbid0IHVucmVmIHRoZSBzYW1lIGNhcHMgdHdpY2UsIGFuZAorCSAgc2V0IHBpeGJ1ZiBsb2FkZXIgdG8gTlVMTCBhZnRlciBmcmVlaW5nIGl0LgorCisyMDA2LTAzLTI3IDE0OjAwOjAyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuKjogRG9uJ3QgbGVhayBhZGFwdGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiAoZ3N0X3NwZWV4ZW5jX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zcGVleGVuY19maW5hbGl6ZSksIChnc3Rfc3BlZXhlbmNfc2lua19zZXRjYXBzKSwKKwkgIChnc3Rfc3BlZXhlbmNfY2hhaW4pOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuaDoKKwkgIERvbid0IGxlYWsgYWRhcHRlci4KKwkgIEEgcHVzaCAqYWx3YXlzKiB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGJ1ZmZlciwgZXZlbiBvbgorCSAgZXJyb3JzLgorCSAgU21hbGwgY2xlYW51cHMuCisKKzIwMDYtMDMtMjYgMTk6NTY6MzcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC90YWdsaWIvZ3N0dGFnbGliLio6IEZpeCBuZXdzZWdtZW50IGV2ZW50IGhhbmRsaW5nIGEgYml0LiBXZSBuZWVkIHRvIGNhY2hlIHRoZSBmaXJzdCBuZXdzZWdtZW50IGV2ZW50LCBiZWNhdXNlIHdlIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC90YWdsaWIvZ3N0dGFnbGliLmNjOgorCSAgKiBleHQvdGFnbGliL2dzdHRhZ2xpYi5oOgorCSAgRml4IG5ld3NlZ21lbnQgZXZlbnQgaGFuZGxpbmcgYSBiaXQuIFdlIG5lZWQgdG8KKwkgIGNhY2hlIHRoZSBmaXJzdCBuZXdzZWdtZW50IGV2ZW50LCBiZWNhdXNlIHdlIGNhbid0CisJICBhZGp1c3Qgb2Zmc2V0cyB5ZXQgd2hlbiB3ZSBnZXQgaXQsIGFzIHdlIGRvbid0CisJICBrbm93IHRoZSBzaXplIG9mIHRoZSB0YWcgeWV0IGZvciBzdXJlIGF0IHRoYXQgcG9pbnQuCisJICBBbHNvIGRvIHNvbWUgbWlub3IgY2xlYW5pbmcgdXAgaGVyZSBhbmQgdGhlcmUgYW5kIGFkZAorCSAgc29tZSBkZWJ1ZyBzdGF0ZW1lbnRzLgorCisyMDA2LTAzLTI2IDEyOjI0OjU2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzogQ3JlYXRlIHNvdXJjZSBwYWQgd2l0aG91dCBsZWFraW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAoZ3N0X2lkM2RlbXV4X2FkZF9zcmNwYWQpOgorCSAgQ3JlYXRlIHNvdXJjZSBwYWQgd2l0aG91dCBsZWFraW5nLgorCisyMDA2LTAzLTI1IDIxOjU3OjI0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvdGFnbGliL2dzdHRhZ2xpYi5jYzogV2UgZG8gbm90IHdhbnQgdG8gcHJveHkgdGhlIGNhcHMgb24gdGhlIHNpbmsgcGFkOyBvdXIgc291cmNlIHBhZCBzaG91bGQgaGF2ZSBhcHBsaWNhdGlvbi94LWkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvdGFnbGliL2dzdHRhZ2xpYi5jYzoKKwkgIFdlIGRvIG5vdCB3YW50IHRvIHByb3h5IHRoZSBjYXBzIG9uIHRoZSBzaW5rIHBhZDsgb3VyCisJICBzb3VyY2UgcGFkIHNob3VsZCBoYXZlIGFwcGxpY2F0aW9uL3gtaWQzIGNhcHM7IGFsc28sCisJICBkb24ndCB1c2UgYWxyZWFkeS1mcmVlZCBzdHJpbmdzIGluIGRlYnVnIG1lc3NhZ2VzOworCSAgZmluYWxseSwgYWRqdXN0IGJ1ZmZlciBvZmZzZXRzIG9uIGJ1ZmZlcnMgc2VudCBvdXQuCisKKzIwMDYtMDMtMjUgMTM6MDI6NTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogT2xkZXIga2VybmVscyBkb24ndCBzZWVtIHRvIGhhdmUgdGhpcyBwYXJ0aWN1bGFyIHY0bDIgZm9ybWF0LCBzbyBjb21tZW50IG91dCB1bnRpbCB0aGlzIGdldHMgZi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIE9sZGVyIGtlcm5lbHMgZG9uJ3Qgc2VlbSB0byBoYXZlIHRoaXMgcGFydGljdWxhciB2NGwyIGZvcm1hdCwKKwkgIHNvIGNvbW1lbnQgb3V0IHVudGlsIHRoaXMgZ2V0cyBmaXhlZCBwcm9wZXJseSAoYW5kIG1ha2UKKwkgIGJ1aWxkYm90cyBoYXBweSkuCisKKzIwMDYtMDMtMjUgMDU6MzE6MjggKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogY29tbW9uOgorCSogc3lzL3Y0bDIvZ3N0djRsMmNvbG9yYmFsYW5jZS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmNvbG9yYmFsYW5jZS5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMmVsZW1lbnQuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5oOgorCSAgSnVzdCBtYWtlIGZldyB0aGluZ3MgbW9yZSByb2J1c3QgYW5kIGFsc28gc29tZSBpZGVudGF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBKdXN0IG1ha2UgZmV3IHRoaW5ncyBtb3JlIHJvYnVzdCBhbmQgYWxzbyBzb21lIGlkZW50YXRpb24uCisKKzIwMDYtMDMtMjQgMTk6NDE6MDMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9mbGFjLzogU3BpZmlmeSBhIGJpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19kZWNfaGFuZGxlX3NlZWtfZXZlbnQpOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmg6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNlbmMuaDoKKwkgIFNwaWZpZnkgYSBiaXQuCisJICBGaXggZGVhZGx5IGxvY2sgb3JkZXIgZXJyb3IgaW4gc2Vla2luZyBjb2RlLCBTVFJFQU1fTE9DSworCSAgY2Fubm90IGJlIHRha2VuIHdpdGhpbiBMT0NLIGFuZCB0aGUgc3RyZWFtaW5nIHZhcmlhYmxlcyBhcmUKKwkgIHByb3RlY3RlZCB3aXRoIHRoZSBTVFJFQU1fTE9DSyBhbnl3YXkuCisKKzIwMDYtMDMtMjQgMTg6NTY6MTYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogdGhpcyBwYXRjaCBjb21iaW5lcyB0aGUgZ2xvYmFsIGluaXRfZnJhbWVzIHdpdGggdGhlIHN0cmVhbSBpbml0X2ZyYW1lcy4gUmF0aW9uYWxlIGJlaW5nIHRoYXQgdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcGFyc2VfaW5kZXgpLAorCSAgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luZGV4KSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX3NjYW4pLAorCSAgKGdzdF9hdmlfZGVtdXhfbWFzc2FnZV9pbmRleCksIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zZWVrKToKKwkgIHRoaXMgcGF0Y2ggY29tYmluZXMgdGhlIGdsb2JhbCBpbml0X2ZyYW1lcyB3aXRoIHRoZSBzdHJlYW0KKwkgIGluaXRfZnJhbWVzLiBSYXRpb25hbGUgYmVpbmcgdGhhdCB0aGUgZ2xvYmFsIGRlbGF5IHNob3VsZAorCSAgYmUgc3VidHJhY3RlZCBmcm9tIGFueSBzdHJlYW0gZGVsYXkuCisJICBGaXhlcyAjMzM1ODU4LgorCisyMDA2LTAzLTI0IDE3OjExOjU2ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC86IHVzZSBERUJVR19GVU5DUFRSIGZvciBjb2xsZWN0cGFkcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfaW5pdCk6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IChnc3RfbXVsdGlwYXJ0X211eF9pbml0KToKKwkgICogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6IChnc3Rfc21wdGVfaW5pdCk6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogKGdzdF92aWRlb21peGVyX2luaXQpOgorCSAgdXNlIERFQlVHX0ZVTkNQVFIgZm9yIGNvbGxlY3RwYWRzCisKKzIwMDYtMDMtMjQgMDk6NTQ6MDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzogRG9uJ3QgY3Jhc2ggd2hlbiBlbmNvZGluZyBpbWFnZXMgd2hlcmUgdGhlIG51bWJlciBvZiByb3dzIGlzbid0IGEgbXVsdGlwbGUgb2YgMipEQ1RTSVpFLiBBZGQgcy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzogKGdzdF9qcGVnZW5jX2luaXQpLCAoZ3N0X2pwZWdlbmNfY2hhaW4pOgorCSAgRG9uJ3QgY3Jhc2ggd2hlbiBlbmNvZGluZyBpbWFnZXMgd2hlcmUgdGhlIG51bWJlciBvZiByb3dzIGlzbid0CisJICBhIG11bHRpcGxlIG9mIDIqRENUU0laRS4gQWRkIHNvbWUgR1NUX0RFQlVHX0ZVTkNQVFIuCisKKzIwMDYtMDMtMjMgMjE6Mjg6MDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIE1vcmUgc3RhdGUgY2hhbmdlIGZ1bmN0aW9uIGZpeGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiAoc3BlZXhfZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOiAoZGVpbnRlcmxlYXZlX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzogKGludGVybGVhdmVfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzogKGdzdF93YXZlbmNfY2hhbmdlX3N0YXRlKToKKwkgIE1vcmUgc3RhdGUgY2hhbmdlIGZ1bmN0aW9uIGZpeGVzLgorCisyMDA2LTAzLTIzIDIwOjEyOjQ3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvZXNkL2VzZHNpbmsuKjogRml4IGVzZCBjaG9wcHkgcGxheWJhY2sgYnkgY29uZmlndXJpbmcgYXVkaW9zaW5rIGNvcnJlY3RseS4gRml4ZXMgIzMyNTE5MQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfY2xhc3NfaW5pdCksCisJICAoZ3N0X2VzZHNpbmtfZ2V0Y2FwcyksIChnc3RfZXNkc2lua19vcGVuKSwgKGdzdF9lc2RzaW5rX2Nsb3NlKSwKKwkgIChnc3RfZXNkc2lua19wcmVwYXJlKSwgKGdzdF9lc2RzaW5rX3VucHJlcGFyZSksCisJICAoZ3N0X2VzZHNpbmtfZGVsYXkpLCAoZ3N0X2VzZHNpbmtfcmVzZXQpOgorCSAgKiBleHQvZXNkL2VzZHNpbmsuaDoKKwkgIEZpeCBlc2QgY2hvcHB5IHBsYXliYWNrIGJ5IGNvbmZpZ3VyaW5nIGF1ZGlvc2luaworCSAgY29ycmVjdGx5LiBGaXhlcyAjMzI1MTkxCisKKzIwMDYtMDMtMjMgMTk6NTc6MzQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IE1ha2Ugc3RhdGUgY2hhbmdlIGZ1bmN0aW9uIHRocmVhZC1zYWZlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IChnc3RfcG5nZGVjX2NoYW5nZV9zdGF0ZSk6CisJICBNYWtlIHN0YXRlIGNoYW5nZSBmdW5jdGlvbiB0aHJlYWQtc2FmZS4KKworMjAwNi0wMy0yMyAxNjo1MDozMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IERvbid0IHRyeSB0byByZWFkIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlIGp1c3QgYmVjYXVzZSB0aGUgaGVhZGVyIGNsYWltcyBhIGJpZ2dlciBzaXplLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfZ2V0X3Vwc3RyZWFtX3NpemUpLAorCSAgKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpOgorCSAgRG9uJ3QgdHJ5IHRvIHJlYWQgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpbGUganVzdCBiZWNhdXNlCisJICB0aGUgaGVhZGVyIGNsYWltcyBhIGJpZ2dlciBzaXplIChsaWtlIHdpdGggdHJ1bmNhdGVkIGZpbGVzKS4KKworMjAwNi0wMy0yMyAxNTozNjoyNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLio6IERlbGF5IHNvdXJjZSBwYWQgY3JlYXRpb24gdW50aWwgd2UgaGF2ZSB0aGUgZmlyc3QgY2h1bmsgb2YgbWVkaWEgZGF0YSwgc28gdGhlIHdlIGNhbiBleGFtLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcGVyZm9ybV9zZWVrKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMpLCAoZ3N0X3dhdnBhcnNlX2FkZF9zcmNfcGFkKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpLCAoZ3N0X3dhdnBhcnNlX2xvb3ApOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuaDoKKwkgIERlbGF5IHNvdXJjZSBwYWQgY3JlYXRpb24gdW50aWwgd2UgaGF2ZSB0aGUgZmlyc3QgY2h1bmsgb2YKKwkgIG1lZGlhIGRhdGEsIHNvIHRoZSB3ZSBjYW4gZXhhbWluZSB0aGUgZGF0YSBhbmQgYWRqdXN0IHRoZQorCSAgY2FwcyBhY2NvcmRpbmdseSBpZiByZXF1aXJlZC4gVGhpcyBtYWtlcyBwbGF5YmFjayBvZiAud2F2CisJICBmaWxlcyB3aXRoIERUUy1kZWNsYXJlZC1hcy1QQ00gY29udGVudCB3b3JrICgjMzEzMjY2KS4KKworMjAwNi0wMy0yMiAxOTo1MDo1NiArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBhZGQgdmlkZW9iYWxhbmNlIHBsdWduCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCB2aWRlb2JhbGFuY2UgcGx1Z24KKworMjAwNi0wMy0yMiAxMzowMjoxMSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkgIG1lbnRpb24gZml4ZWQgYnVnIG51bWJlciBpbiB0aGUgY2hhbmdlbG9nCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIG1lbnRpb24gZml4ZWQgYnVnIG51bWJlciBpbiB0aGUgY2hhbmdlbG9nCisKKzIwMDYtMDMtMjIgMTM6MDA6MzQgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvOiBEb24ndCBhdHRlbXB0IHR5cGVmaW5kaW5nIG9uIHRvby1zaG9ydCBidWZmZXJzIHRoYXQgaGF2ZSBiZWVuIGNvbXBsZXRlbHkgdHJpbW1lZCBhd2F5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hcGV0YWcvZ3N0dGFnZGVtdXguYzogKGdzdF90YWdfZGVtdXhfY2hhaW4pOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzogKGdzdF9pZDNkZW11eF9jaGFpbik6CisJICBEb24ndCBhdHRlbXB0IHR5cGVmaW5kaW5nIG9uIHRvby1zaG9ydCBidWZmZXJzIHRoYXQgaGF2ZSBiZWVuCisJICBjb21wbGV0ZWx5IHRyaW1tZWQgYXdheS4KKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzogKGlkM2RlbXV4X3JlYWRfaWQzdjJfdGFnKToKKwkgIEltcHJvdmUgdGhlIGRlYnVnIG91dHB1dAorCisyMDA2LTAzLTIxIDE4OjEyOjU5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvZXNkL2VzZHNpbmsuYzogU29tZSBjbGVhbnVwcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZXNkL2VzZHNpbmsuYzogKGdzdF9lc2RzaW5rX2NsYXNzX2luaXQpLCAoZ3N0X2VzZHNpbmtfaW5pdCksCisJICAoZ3N0X2VzZHNpbmtfZmluYWxpemUpLCAoZ3N0X2VzZHNpbmtfZ2V0Y2FwcyksIChnc3RfZXNkc2lua19vcGVuKSwKKwkgIChnc3RfZXNkc2lua19jbG9zZSksIChnc3RfZXNkc2lua19wcmVwYXJlKSwgKGdzdF9lc2RzaW5rX3dyaXRlKSwKKwkgIChnc3RfZXNkc2lua19zZXRfcHJvcGVydHkpLCAoZ3N0X2VzZHNpbmtfZ2V0X3Byb3BlcnR5KToKKwkgIFNvbWUgY2xlYW51cHMuCisJICBSZXNldCBmZCB0byAtMSB3aGVuIHdlIGNsb3NlIHRoZW0uCisKKzIwMDYtMDMtMjEgMTY6MTk6MzcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogdGhlIE9QVElPTlMgcmVxdWVzdCByZXN1bHQgaXMgb3B0aW9uYWwgc28gZG9uJ3QgZmFpbCBvbiBpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19vcGVuKToKKwkgIHRoZSBPUFRJT05TIHJlcXVlc3QgcmVzdWx0IGlzIG9wdGlvbmFsIHNvIGRvbid0CisJICBmYWlsIG9uIGl0LgorCisyMDA2LTAzLTIxIDE0OjUzOjM2ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvOiBnY2MgNC4xIHVucmVmZXJlbmNlZCBwb2ludGVyIGZpeGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hcGV0YWcvZ3N0dGFnZGVtdXguYzogKGdzdF90YWdfZGVtdXhfcmVzZXQpOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzogKGdzdF9pZDNkZW11eF9yZXNldCk6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2NyZWF0ZV9zb3VyY2VwYWQpLAorCSAgKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksIChnc3Rfd2F2cGFyc2Vfc2VuZF9ldmVudCksCisJICAoZ3N0X3dhdnBhcnNlX2NoYW5nZV9zdGF0ZSk6CisJICBnY2MgNC4xIHVucmVmZXJlbmNlZCBwb2ludGVyIGZpeGVzLgorCisyMDA2LTAzLTIxIDEzOjA3OjMxICswMDAwICBUb21taSBNecO2aMOkbmVuIDxleHQtdG9tbWkubXlvaGFuZW5Abm9raWEuY29tPgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogRml4IGJsb2NrIGFsaWdubWVudCBjYWxjdWxhdGlvbi4gQWxpZ25tZW50IHNob3VsZCBiZSBkb25lIGJlZm9yZSBhZGRpbmcgdGhlIGJ5dGUgb2Zmc2V0IHcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFRvbW1pIE15w7Zow6RuZW4gIDxleHQtdG9tbWkgZG90IG15b2hhbmVuIGF0IG5va2lhIGRvdCBjb20+CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2Vlayk6CisJICBGaXggYmxvY2sgYWxpZ25tZW50IGNhbGN1bGF0aW9uLiBBbGlnbm1lbnQgc2hvdWxkIGJlIGRvbmUgYmVmb3JlCisJICBhZGRpbmcgdGhlIGJ5dGUgb2Zmc2V0IHdoZXJlIHRoZSBkYXRhIHN0YXJ0cyAoIzMzNTIzMSkuCisKKzIwMDYtMDMtMjAgMTg6MzQ6MjEgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOiBFbnN1cmUgdGhhdCB3ZSBzZXQgY29ycmVjdCBjYXBzIG9uIGJ1ZmZlcnMgdGhhdCBhcmUgdHJhbnNmZXJyZWQgZGlyZWN0IGZyb20gdGhlIGlucHV0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6IChnc3RfZWJtbF93cml0ZV9lbGVtZW50X3B1c2gpOgorCSAgRW5zdXJlIHRoYXQgd2Ugc2V0IGNvcnJlY3QgY2FwcyBvbiBidWZmZXJzIHRoYXQgYXJlIHRyYW5zZmVycmVkCisJICBkaXJlY3QgZnJvbSB0aGUgaW5wdXQuCisKKzIwMDYtMDMtMjAgMTc6Mzg6NDggKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvZ29vbS86IEZyZWUgZmlsdGVyIGRhdGEgd2hlbiBjbGVhbmluZyB1cC4gKEZpeGVzOiAjMzM0OTk1KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9nb29tL2ZpbHRlcnMuYzogKHpvb21GaWx0ZXJEZXN0cm95KToKKwkgICogZ3N0L2dvb20vZ29vbV9jb3JlLmM6IChnb29tX2Nsb3NlKToKKwkgIEZyZWUgZmlsdGVyIGRhdGEgd2hlbiBjbGVhbmluZyB1cC4gKEZpeGVzOiAjMzM0OTk1KQorCisyMDA2LTAzLTIwIDA4OjU5OjI5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvdGFnbGliL2dzdHRhZ2xpYi5oOiBGaXggbGVmdC1vdmVyIGdzdF9teV9maWx0ZXJfZ2V0X3R5cGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3RhZ2xpYi9nc3R0YWdsaWIuaDoKKwkgIEZpeCBsZWZ0LW92ZXIgZ3N0X215X2ZpbHRlcl9nZXRfdHlwZS4KKworMjAwNi0wMy0xNyAxNjozNDozNiArMDAwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIEhhdmUgYSBzaG93IG1vdXNlIHBvaW50ZXIgcHJvcGVydHkgYW5kIHVzZSBpdCBpZiB3ZSBjYW4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgSGF2ZSBhIHNob3cgbW91c2UgcG9pbnRlciBwcm9wZXJ0eSBhbmQgdXNlIGl0IGlmIHdlIGNhbgorCisyMDA2LTAzLTE3IDE1OjMzOjA4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IERvbid0IGNvbXBpbGUgdWRwIGFuZCBydHNwIHBsdWdpbnMgb24gd2luMzIgKG1pbmd3KSBvciBvdGhlciBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSA8c3lzL3NvY2tldC5oPiBmb3IuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBEb24ndCBjb21waWxlIHVkcCBhbmQgcnRzcCBwbHVnaW5zIG9uIHdpbjMyIChtaW5ndykgb3Igb3RoZXIKKwkgIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIDxzeXMvc29ja2V0Lmg+IGZvciBzb21lIHJlYXNvbiAoIzMxNjIwMykuCisKKzIwMDYtMDMtMTYgMTc6Mjg6MDcgKzAwMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmg6CisJICBDaGFuZ2UgYnVzIHJlc2V0IGhhbmRsZXIgc28gaXQgcmVwb3J0cyB1c2VmdWwgaW5mb3JtYXRpb24gc3VjaCBhcyB3aGV0aGVyIHRoZSBkZXZpY2UgYmVpbmcgdXNlZCBjb25uZWN0ZWQgb3IgZGlzY29ubmUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQ2hhbmdlIGJ1cyByZXNldCBoYW5kbGVyIHNvIGl0IHJlcG9ydHMgdXNlZnVsIGluZm9ybWF0aW9uIHN1Y2ggYXMKKwkgIHdoZXRoZXIgdGhlIGRldmljZSBiZWluZyB1c2VkIGNvbm5lY3RlZCBvciBkaXNjb25uZWN0ZWQKKworMjAwNi0wMy0xNiAxNjowNjoyMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IFdlIG9ubHkgY2FyZSBhYm91dCBnYWluIGFuZCBwZWFrIGRhdGEgZm9yIHRoZSBtYXN0ZXIgdm9sdW1lLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOgorCSAgKHBhcnNlX3JlbGF0aXZlX3ZvbHVtZV9hZGp1c3RtZW50X3R3byk6CisJICBXZSBvbmx5IGNhcmUgYWJvdXQgZ2FpbiBhbmQgcGVhayBkYXRhIGZvciB0aGUgbWFzdGVyIHZvbHVtZS4KKworMjAwNi0wMy0xNiAxMzoyMjoyOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IFJlYWQgcmVwbGF5IGdhaW4gdGFncyAoIzMyMzcyMSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IChpZDNkZW11eF9pZDN2Ml9wYXJzZV9mcmFtZSksCisJICAocGFyc2VfaWRfc3RyaW5nKSwgKHBhcnNlX3VuaXF1ZV9maWxlX2lkZW50aWZpZXIpLAorCSAgKHBhcnNlX3JlbGF0aXZlX3ZvbHVtZV9hZGp1c3RtZW50X3R3byksIChpZDN2Ml90YWdfdG9fdGFnbGlzdCk6CisJICBSZWFkIHJlcGxheSBnYWluIHRhZ3MgKCMzMjM3MjEpLgorCisyMDA2LTAzLTE1IDIzOjE5OjMwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IEJ1bXAgcmVxdWlyZW1lbnRzIHRvIGdzdC1wbHVnaW5zLWJhc2UgQ1ZTIGJlY2F1c2Ugb2YgYnVnZ3kgZ3N0X3RhZ19mcm9tX2lkM191c2VyX3RhZygpIGluIDAuMTAuNS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBCdW1wIHJlcXVpcmVtZW50cyB0byBnc3QtcGx1Z2lucy1iYXNlIENWUyBiZWNhdXNlCisJICBvZiBidWdneSBnc3RfdGFnX2Zyb21faWQzX3VzZXJfdGFnKCkgaW4gMC4xMC41LgorCisyMDA2LTAzLTE1IDIyOjMwOjI0ICswMDAwICBQaGlsaXBwZSBLYWxhZiA8cGhpbGlwcGUua2FsYWZAY29sbGFib3JhLmNvLnVrPgorCisJKiBDaGFuZ2VMb2c6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5jOgorCSAgRml4ZWQgb25lIG9mIHRoZSBjYXBzIGluIHRoZSBjb2RlIGZyb20gbXVsYXcgdG8gYWxhdy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRml4ZWQgb25lIG9mIHRoZSBjYXBzIGluIHRoZSBjb2RlIGZyb20gbXVsYXcgdG8gYWxhdy4KKworMjAwNi0wMy0xNSAxNjoyMTozOCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC9hcGV0YWcvZ3N0dGFnZGVtdXguYzogRW5zdXJlIHRoYXQgd2Ugc2V0IGNhcHMgb24gdGhlIGJ1ZmZlcnMgd2UgcGFzcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXBldGFnL2dzdHRhZ2RlbXV4LmM6IChnc3RfdGFnX2RlbXV4X2NoYWluKToKKwkgIEVuc3VyZSB0aGF0IHdlIHNldCBjYXBzIG9uIHRoZSBidWZmZXJzIHdlIHBhc3MuCisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAoZ3N0X2lkM2RlbXV4X2NoYWluKSwKKwkgIChnc3RfaWQzZGVtdXhfc2lua19hY3RpdmF0ZSk6CisJICBFbnN1cmUgdGhhdCB3ZSBzZXQgY2FwcyBvbiB0aGUgYnVmZmVycyB3ZSBwYXNzLgorCSAgVXNlIFNUUkVBTSwgVFlQRV9OT1RfRk9VTkQgYXMgdGhlIGVycm9yIGNsYXNzIHdoZW4KKwkgIHR5cGVmaW5kaW5nIGZhaWxzLgorCisyMDA2LTAzLTE1IDE2OjE3OjEyICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBGaXggbWVtbGVhayB3aXRoIGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldCgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOiAoZ3N0X3RleHRfb3ZlcmxheV9pbml0KToKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2luaXQpLCAoZ3N0X2R2ZGVtdXhfYWRkX3BhZHMpOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKGdzdF9nZGtfcGl4YnVmX2luaXQpOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6IChnc3RfanBlZ19kZWNfaW5pdCksCisJICAoZ3N0X2pwZWdfZGVjX3NldGNhcHMpOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6IChnc3RfanBlZ2VuY19pbml0KToKKwkgICogZXh0L2pwZWcvZ3N0c21va2VkZWMuYzogKGdzdF9zbW9rZWRlY19pbml0KToKKwkgICogZXh0L2pwZWcvZ3N0c21va2VlbmMuYzogKGdzdF9zbW9rZWVuY19pbml0KToKKwkgICogZXh0L2xpYm1uZy9nc3RtbmdkZWMuYzogKGdzdF9tbmdkZWNfaW5pdCksCisJICAoZ3N0X21uZ2RlY19zcmNfZ2V0Y2Fwcyk6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IChnc3RfcG5nZGVjX2luaXQpLAorCSAgKGdzdF9wbmdkZWNfY2Fwc19jcmVhdGVfYW5kX3NldCk6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6IChnc3RfcG5nZW5jX2luaXQpOgorCSAgKiBleHQvbWlrbW9kL2dzdG1pa21vZC5jOiAoZ3N0X21pa21vZF9pbml0KToKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IChnc3Rfc3BlZXhfZGVjX2luaXQpOgorCSAgKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzogKGdzdF9hbHBoYV9pbml0KToKKwkgICogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiAoZ3N0X2F1X3BhcnNlX2luaXQpOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2luaXQpLAorCSAgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19ldmVudCksIChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSk6CisJICAqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6IChnc3RfY3V0dGVyX2luaXQpOgorCSAgKiBnc3QvZGVidWcvZWZlbmNlLmM6IChnc3RfZWZlbmNlX2luaXQpLCAoZ3N0X2VmZW5jZV9nZXRyYW5nZSksCisJICAoZ3N0X2VmZW5jZV9jaGVja2dldHJhbmdlKToKKwkgICogZ3N0L2RlYnVnL25lZ290aWF0aW9uLmM6IChnc3RfbmVnb3RpYXRpb25faW5pdCk6CisJICAqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6IChnc3RfZmx4ZGVjX2luaXQpOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnc3RfZ29vbV9pbml0KToKKwkgICogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzogKGdzdF9hc3Rlcmlza2gyNjNfaW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzogKGdzdF9ydHBfTDE2ZGVwYXlfaW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6IChnc3RfcnRwTDE2cGF5X2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6IChnc3RfcnRwX2Ftcl9kZXBheV9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBkZXBheS5jOiAoZ3N0X3J0cF9kZXBheV9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOiAoZ3N0X3J0cF9tcGFfZGVwYXlfaW5pdCk6CisJICAqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOiAoZ3N0X3J0cGRlY19pbml0KToKKwkgICogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6IChnc3Rfc21wdGVfaW5pdCk6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2luaXQpLAorCSAgKGdzdF93YXZwYXJzZV9jcmVhdGVfc291cmNlcGFkKToKKwkgIEZpeCBtZW1sZWFrIHdpdGggZ3N0X3N0YXRpY19wYWRfdGVtcGxhdGVfZ2V0KCkuCisJICBUaGlzIHVzZXMgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUoKSBpbnN0ZWFkLgorCSAgRml4ZXMgIzMzMzUxMgorCisyMDA2LTAzLTE1IDE1OjA4OjIwICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IExldCdzIG5vdCBmb3JnZXQgdG8gY2hhaW4gdXAgdG8gdGhlIHBhcmVudCBkaXNwb3NlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2Rpc3Bvc2UpOgorCSAgTGV0J3Mgbm90IGZvcmdldCB0byBjaGFpbiB1cCB0byB0aGUgcGFyZW50IGRpc3Bvc2UuCisKKzIwMDYtMDMtMTUgMTQ6Mzk6MjUgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogU2VyaWVzIG9mIG1lbWxlYWsgZml4ZXM6CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfY2xhc3NfaW5pdCksCisJICAoZ3N0X3F0ZGVtdXhfaW5pdCksIChnc3RfcXRkZW11eF9kaXNwb3NlKSwKKwkgIChnc3RfcXRkZW11eF9hZGRfc3RyZWFtKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBTZXJpZXMgb2YgbWVtbGVhayBmaXhlczoKKwkgIC0gVW5yZWYgdGhlIEdzdEFkYXB0ZXIgaW4gZmluYWxpemUuCisJICAtIFVzZSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSgpLCBzaG9ydGVyIGFuZCBzYWZlci4KKwkgIC0gRnJlZSB1bnVzZWQgUXREZW11eFN0cmVhbSB3aGVuIG5vdCB1c2VkLgorCisyMDA2LTAzLTE0IDE3OjU2OjAyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IEJ1bXAgLWJhc2UgcmVxdWlyZW1lbnQgdG8gMC4xMC41IGZvciBnc3RfdGFnX2Zyb21faWQzX3VzZXJfdGFnKCksIHVzZWQgYnkgaWQzZGVtdXguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgQnVtcCAtYmFzZSByZXF1aXJlbWVudCB0byAwLjEwLjUgZm9yIGdzdF90YWdfZnJvbV9pZDNfdXNlcl90YWcoKSwKKwkgIHVzZWQgYnkgaWQzZGVtdXguCisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKGlkM2RlbXV4X2lkM3YyX3BhcnNlX2ZyYW1lKSwKKwkgIChwYXJzZV91c2VyX3RleHRfaWRlbnRpZmljYXRpb25fZnJhbWUpLAorCSAgKHBhcnNlX3VuaXF1ZV9maWxlX2lkZW50aWZpZXIpOgorCSAgQWRkIHN1cHBvcnQgZm9yIFVGSUQgYW5kIFRYWFggZnJhbWVzIGFuZCBleHRyYWN0IG11c2ljYnJhaW56IHRhZ3MuCisKKzIwMDYtMDMtMTQgMTc6MjQ6MDMgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogSW5pdGlhbGl6YXRpb24gb2YgdGhlIGRlYnVnZ2luZyBjYXRlZ29yeSBzaG91bGQgYmUgYXMgZWFybHkgYXMgcG9zc2libGUsIG1vdmluZyBpdCBmcm9tIF9jbGFzcy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogKGdzdF92NGwyc3JjX2Jhc2VfaW5pdCksCisJICAoZ3N0X3Y0bDJzcmNfY2xhc3NfaW5pdCk6CisJICBJbml0aWFsaXphdGlvbiBvZiB0aGUgZGVidWdnaW5nIGNhdGVnb3J5IHNob3VsZCBiZSBhcyBlYXJseSBhcyBwb3NzaWJsZSwKKwkgIG1vdmluZyBpdCBmcm9tIF9jbGFzc19pbml0KCkgdG8gYmVnaW5uaW5nIG9mIF9iYXNlX2luaXQoKS4KKworMjAwNi0wMy0xNCAxNToyODowMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBDYXRjaCBzaG9ydCByZWFkcywgbGlrZSB0aGV5IG1pZ2h0IGhhcHBlbiB3aXRoIHRydW5jYXRlZCBmaWxlcyAoc2VlICMzMDUyNzkpOyByZW1vdmUgdW5uZWNlc3NhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpOgorCSAgQ2F0Y2ggc2hvcnQgcmVhZHMsIGxpa2UgdGhleSBtaWdodCBoYXBwZW4gd2l0aCB0cnVuY2F0ZWQKKwkgIGZpbGVzIChzZWUgIzMwNTI3OSk7IHJlbW92ZSB1bm5lY2Vzc2FyeSBpbmRlbnRhdGlvbi4KKworMjAwNi0wMy0xNCAxNDoxODoxNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBGaXggRElCIGltYWdlIGludmVyc2lvbiBmb3IgcGljdHVyZXMgd2l0aCBhIGRlcHRoICE9IDggKCMzMDUyNzkpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaW52ZXJ0KToKKwkgIEZpeCBESUIgaW1hZ2UgaW52ZXJzaW9uIGZvciBwaWN0dXJlcyB3aXRoIGEKKwkgIGRlcHRoICE9IDggKCMzMDUyNzkpLgorCisyMDA2LTAzLTE0IDA5OjIzOjA5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvanBlZy9nc3RqcGVnZGVjLio6IEZpeCBkdXJhdGlvbnMgb24gb3V0Z29pbmcgYnVmZmVycyBhZnRlciBzZWVraW5nIGluIE1KUEVHIGZpbGVzICgjMzM0MDgzKTsgc29tZSBtaW5vciBjbGVhbi11cHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2pwZWdfZGVjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9qcGVnX2RlY19jaGFpbiksIChnc3RfanBlZ19kZWNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAgRml4IGR1cmF0aW9ucyBvbiBvdXRnb2luZyBidWZmZXJzIGFmdGVyIHNlZWtpbmcKKwkgIGluIE1KUEVHIGZpbGVzICgjMzM0MDgzKTsgc29tZSBtaW5vciBjbGVhbi11cHMuCisKKzIwMDYtMDMtMTMgMTg6Mjg6MTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBJbXBsZW1lbnQgc2VlayBpbiBSRUFEWSAocmUtZml4ZXMgIzMyNzY1OCkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9yZXNldCksCisJICAoZ3N0X3dhdnBhcnNlX2NoYW5nZV9zdGF0ZSk6CisJICBJbXBsZW1lbnQgc2VlayBpbiBSRUFEWSAocmUtZml4ZXMgIzMyNzY1OCkKKworMjAwNi0wMy0xMyAxNzoyMjoxOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L3RhZ2xpYi9nc3R0YWdsaWIuY2M6IEFkZCBndGstZG9jIGJsdXJiICh1bnVzZWQgZm9yIHRoZSB0aW1lIGJlaW5nKTsgbWF0Y2ggcmVnaXN0ZXJlZCBwbHVnaW4gbmFtZSB0byB0aGUgZmlsZW5hbWUgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3RhZ2xpYi9nc3R0YWdsaWIuY2M6CisJICBBZGQgZ3RrLWRvYyBibHVyYiAodW51c2VkIGZvciB0aGUgdGltZSBiZWluZyk7IG1hdGNoIHJlZ2lzdGVyZWQKKwkgIHBsdWdpbiBuYW1lIHRvIHRoZSBmaWxlbmFtZSBvZiB0aGUgcGx1Z2luICh0YWdsaWJtdXggPT4gdGFnbGliKQorCisyMDA2LTAzLTEzIDE1OjQ5OjA4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBjbG9zZSAjMzMzNzg0IHVucmVmIHRoZSByZXN1bHQgb2YgZ3N0X3BhZF9nZXRfcGFyZW50KCkgYnk6IENocmlzdG9waGUgRmVyZ2VhdS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzogKGdzdF90ZXh0X292ZXJsYXlfc2V0Y2Fwcyk6CisJICAqIGV4dC9lc2QvZXNkbW9uLmM6IChnc3RfZXNkbW9uX2dldCk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzogKGdzdF9mbGFjX3RhZ19jaGFpbik6CisJICAqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOiAoZ3N0X2dka19waXhidWZfc2lua19zZXRjYXBzKSwKKwkgIChnc3RfZ2RrX3BpeGJ1Zl9zaW5rX2dldGNhcHMpOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6IChnc3RfanBlZ2VuY19nZXRjYXBzKSwKKwkgIChnc3RfanBlZ2VuY19zZXRjYXBzKToKKwkgICogZXh0L2pwZWcvZ3N0c21va2VkZWMuYzogKGdzdF9zbW9rZWRlY19jaGFpbik6CisJICAqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmM6IChnc3Rfc21va2VlbmNfZ2V0Y2FwcyksCisJICAoZ3N0X3Ntb2tlZW5jX3NldGNhcHMpOgorCSAgKiBleHQvbGlibW5nL2dzdG1uZ2RlYy5jOiAoZ3N0X21uZ2RlY19zaW5rbGluayksCisJICAoZ3N0X21uZ2RlY19zcmNfZ2V0Y2Fwcyk6CisJICAqIGV4dC9saWJtbmcvZ3N0bW5nZW5jLmM6IChnc3RfbW5nZW5jX3NpbmtsaW5rKSwKKwkgIChnc3RfbW5nZW5jX2NoYWluKToKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzogKGdzdF9wbmdlbmNfc2V0Y2Fwcyk6CisJICAqIGV4dC9taWttb2QvZ3N0bWlrbW9kLmM6IChnc3RfbWlrbW9kX3NyY2xpbmspOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzogKHNwZWV4X2RlY19jb252ZXJ0KSwKKwkgIChzcGVleF9kZWNfc3JjX2V2ZW50KSwgKHNwZWV4X2RlY19jaGFpbik6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpbXV4X3ZpZHNpbmtjb25uZWN0KSwKKwkgIChnc3RfYXZpbXV4X2F1ZHNpbmtjb25uZWN0KSwgKGdzdF9hdmltdXhfaGFuZGxlX2V2ZW50KToKKwkgICogZ3N0L2RlYnVnL25lZ290aWF0aW9uLmM6IChnc3RfbmVnb3RpYXRpb25fZ2V0Y2FwcyksCisJICAoZ3N0X25lZ290aWF0aW9uX3BhZF9saW5rKSwgKGdzdF9uZWdvdGlhdGlvbl9jaGFpbik6CisJICAqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6IChnc3RfZmx4ZGVjX3NyY19xdWVyeV9oYW5kbGVyKSwKKwkgIChnc3RfZmx4ZGVjX2NoYWluKToKKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6IChkZWludGVybGVhdmVfc2lua19saW5rKSwKKwkgIChkZWludGVybGVhdmVfY2hhaW4pOgorCSAgKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOiAobXVsYXdlbmNfc2V0Y2Fwcyk6CisJICAqIGdzdC9tZWRpYW4vZ3N0bWVkaWFuLmM6IChnc3RfbWVkaWFuX2xpbmspOgorCSAgKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOiAoZ3N0X21vbm9zY29wZV9zcmNjb25uZWN0KSwKKwkgIChnc3RfbW9ub3Njb3BlX2NoYWluKToKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzogKGdzdF9ydHBMMTZwYXlfc2lua2Nvbm5lY3QpOgorCSAgKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiAoZ3N0X3dhdmVuY19zaW5rX3NldGNhcHMpOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6IChnc3Rfb3N4YXVkaW9zaW5rX2NoYWluKToKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6IChnc3Rfb3N4YXVkaW9zcmNfZ2V0KToKKwkgIGNsb3NlICMzMzM3ODQgdW5yZWYgdGhlIHJlc3VsdCBvZiBnc3RfcGFkX2dldF9wYXJlbnQoKQorCSAgYnk6IENocmlzdG9waGUgRmVyZ2VhdS4KKworMjAwNi0wMy0xMyAxMDowNTowOSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIEZpeCBidWlsZCBvZiB2NGwyIChzaWdoKQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAzLTEzICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1kZWNsLWxpc3QudHh0OgorCSAgKiBzeXMvdjRsMi9NYWtlZmlsZS5hbTogRml4IGJ1aWxkIG9mIHY0bDIgKHNpZ2gpCisKKzIwMDYtMDMtMTIgMTU6MzM6MDAgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogZ19hdG9taWNfaW50X3NldCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBnbGliLTAuMTAsIHVzZSBnc3RfYXRvbWljX2ludF9ldCBpbnN0ZWFkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX2NhcHR1cmVfaW5pdCksCisJICAoZ3N0X3Y0bDJzcmNfYnVmZmVyX3Bvb2xfZnJlZSk6CisJICBnX2F0b21pY19pbnRfc2V0IGlzIG9ubHkgYXZhaWxhYmxlIGluIGdsaWItMC4xMCwgdXNlIGdzdF9hdG9taWNfaW50X2V0CisJICBpbnN0ZWFkLgorCisyMDA2LTAzLTEyIDE1OjI1OjUxICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBzeXMvdjRsMi9nc3R2NGwyZWxlbWVudC5oOiBSZW1vdmUgdGltJ3MgYWRkaXRpb24gb2YgIl9zdGRpbnQuaCIgc2luY2UgaXQgZG9lc24ndCBtYWtlIHRoZSBQUEMgYnVpbGRib3QgaGFwcHkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMmVsZW1lbnQuaDoKKwkgIFJlbW92ZSB0aW0ncyBhZGRpdGlvbiBvZiAiX3N0ZGludC5oIiBzaW5jZSBpdCBkb2Vzbid0IG1ha2UgdGhlIFBQQworCSAgYnVpbGRib3QgaGFwcHkuCisJICBJIHdpbGwganVzdCB1c2UgdGhlIHNhbWUgY29tbWVudCBSb25hbGQgdXNlZCB3aGVuIGhlIGFkZGVkIHRoZXNlIGxpbmVzOgorCSAgWWV0IEFub3RoZXIgSGFjayAodG0pIGZvciBrZXJuZWwgaGVhZGVyIGJvcmtlZG5lc3MuCisKKzIwMDYtMDMtMTIgMTU6MDI6MDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC90YWdsaWIvOiBBZGQgc3VwcG9ydCBmb3Igd3JpdGluZyBNdXNpY0JyYWlueiBJRHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3RhZ2xpYi9NYWtlZmlsZS5hbToKKwkgICogZXh0L3RhZ2xpYi9nc3R0YWdsaWIuY2M6CisJICAqIGV4dC90YWdsaWIvZ3N0dGFnbGliLmg6CisJICBBZGQgc3VwcG9ydCBmb3Igd3JpdGluZyBNdXNpY0JyYWlueiBJRHMuCisKKzIwMDYtMDMtMTIgMTQ6NDM6NTcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHN5cy92NGwyL2dzdHY0bDJlbGVtZW50Lmg6IEluY2x1ZGUgIl9zdGRpbnQuaCIgaW4gYW4gYXR0ZW1wdCB0byBtYWtlIHRoZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJlbGVtZW50Lmg6CisJICBJbmNsdWRlICJfc3RkaW50LmgiIGluIGFuIGF0dGVtcHQgdG8gbWFrZSB0aGUKKwkgIFBQQy1idWlsZGJvdCBoYXBweS4KKworMjAwNi0wMy0xMSAyMjo1MDowMyArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJlbGVtZW50LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyZWxlbWVudC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ4b3ZlcmxheS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnhvdmVybGF5Lmg6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmg6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmg6CisJICBWNEwyIHBvcnRlZCB0byAwLjEwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBWNEwyIHBvcnRlZCB0byAwLjEwLgorCisyMDA2LTAzLTExIDEwOjU4OjA4ICswMDAwICBBbGV4IExhbmNhc3RlciA8YWxleGxhbkBmZWRvcmFwcm9qZWN0Lm9yZz4KKworCSAgZXh0L3RhZ2xpYi9nc3R0YWdsaWIuY2M6IGFuZCBhZGQgc3VwcG9ydCBmb3IgVENPUCAoY29weXJpZ2h0KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAzLTExICBDaHJpc3RvcGhlIEZlcmdlYXUgIDx0ZXVmQGdub21lLm9yZz4KKwkgIFBhdGNoIGJ5OiBBbGV4IExhbmNhc3RlcgorCSAgKiBleHQvdGFnbGliL2dzdHRhZ2xpYi5jYzogZml4IHdyaXRpbmcgb2YgVFBPUyB0YWdzIChhbGJ1bSBudW1iZXIpLAorCSAgYW5kIGFkZCBzdXBwb3J0IGZvciBUQ09QIChjb3B5cmlnaHQpCisKKzIwMDYtMDMtMDkgMjA6MDI6NDQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRml4IGJ1aWxkIHdpdGggZ2NjLTQuMSAoIzMyNzM1NSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfc2VuZF9ldmVudCk6CisJICBGaXggYnVpbGQgd2l0aCBnY2MtNC4xICgjMzI3MzU1KS4KKworMjAwNi0wMy0wOSAxNzo0NDoxNyArMDAwMCAgQ2hyaXN0b3BoZSBGZXJnZWF1IDx0ZXVmQGdub21lLm9yZz4KKworCSAgbmV3IGlkM3YyIG11eGVyIGJhc2VkIG9uIFRhZ0xpYgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAzLTA5ICBDaHJpc3RvcGhlIEZlcmdlYXUgIDx0ZXVmQGdub21lLm9yZz4KKwkgIHJldmlld2VkIGJ5OiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZXh0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGFnbGliL01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGFnbGliL2dzdHRhZ2xpYi5jYzoKKwkgICogZXh0L3RhZ2xpYi9nc3R0YWdsaWIuaDogbmV3IGlkM3YyIG11eGVyIGJhc2VkIG9uIFRhZ0xpYgorCisyMDA2LTAzLTA5IDExOjQ3OjMyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvZHYvZ3N0ZHZkZW11eC5jOiBIYW5kbGUgZXZlbnRzIGluIHB1c2ggbW9kZSBiZXR0ZXIsIGNhbiBub3cgZG8gbm9uLWZsdXNoaW5nIHNlZWtzIGluIHB1c2ggbW9kZSBhcyB3ZWxsLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9kdi9nc3RkdmRlbXV4LmM6IChnc3RfZHZkZW11eF9oYW5kbGVfc2lua19ldmVudCksCisJICAoZ3N0X2R2ZGVtdXhfY29udmVydF9zZWdtZW50KSwgKGdzdF9kdmRlbXV4X2RlbXV4X2ZyYW1lKToKKwkgIEhhbmRsZSBldmVudHMgaW4gcHVzaCBtb2RlIGJldHRlciwgY2FuIG5vdyBkbyBub24tZmx1c2hpbmcKKwkgIHNlZWtzIGluIHB1c2ggbW9kZSBhcyB3ZWxsLgorCisyMDA2LTAzLTA4IDEyOjE2OjE0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEV4dHJhY3QgZGlzYyBudW1iZXIgYW5kIGNvdW50IGZyb20gZmlsZXMgdGhhdCB1c2UgJ2Rpc2snIGluc3RlYWQgb2YgJ2Rpc2MnIGFzIG5vZGUgaWRlbnRpZmllciAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlX3VkdGEpOgorCSAgRXh0cmFjdCBkaXNjIG51bWJlciBhbmQgY291bnQgZnJvbSBmaWxlcyB0aGF0IHVzZQorCSAgJ2Rpc2snIGluc3RlYWQgb2YgJ2Rpc2MnIGFzIG5vZGUgaWRlbnRpZmllciBmb3IgdGhhdAorCSAgKGZpeGVzICMzMzIwNjYpLgorCisyMDA2LTAzLTA3IDE3OjMxOjAzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzogQXBwbGllZCBwYXRjaCBmcm9tIEthaSBWZWhtYW5lbiwgZml4ZXMgIzMzMzYyNC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzogKGdzdF9keW51ZHBzaW5rX2NsYXNzX2luaXQpOgorCSAgQXBwbGllZCBwYXRjaCBmcm9tIEthaSBWZWhtYW5lbiwgZml4ZXMgIzMzMzYyNC4KKworMjAwNi0wMy0wNiAyMjoyMjo0NSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IEltcGxlbWVudCBwYWxldHRlZCBhbmQgZ3JheXNjYWxlIHBuZyBmaWxlcyBoYW5kbGluZy4gKCMxNTAzNjMpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAzLTA2ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IChnc3RfcG5nZGVjX2NhcHNfY3JlYXRlX2FuZF9zZXQpOgorCSAgSW1wbGVtZW50IHBhbGV0dGVkIGFuZCBncmF5c2NhbGUgcG5nIGZpbGVzIGhhbmRsaW5nLgorCSAgKCMxNTAzNjMpLgorCisyMDA2LTAzLTA2IDAwOjEwOjI5ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6IGZpeCBhIHRhZyBsaXN0IGFzc2VydCBmb2xsb3cgZ3N0LXBsdWdpbnMtYmFzZS9leHQvb2dnL1JFQURNRTsgc2V0IE9GRlNFVCBhbmQgT0ZGU0VUX0VORC4gIE11Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6IChnc3Rfc3BlZXhlbmNfc2V0X2hlYWRlcl9vbl9jYXBzKSwKKwkgIChnc3Rfc3BlZXhlbmNfY2hhaW4pOgorCSAgZml4IGEgdGFnIGxpc3QgYXNzZXJ0CisJICBmb2xsb3cgZ3N0LXBsdWdpbnMtYmFzZS9leHQvb2dnL1JFQURNRTsgc2V0IE9GRlNFVAorCSAgYW5kIE9GRlNFVF9FTkQuICBNdXhlcyBjb3JyZWN0bHkgd2l0aCBnc3QtcGx1Z2lucy1iYXNlCisJICA+IDAuOS4zCisKKzIwMDYtMDMtMDUgMTM6MDM6NDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQWRkIHN1cHBvcnQgZm9yICczSVZEJyBmb3VyY2MgKCMzMzM0MDMpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6CisJICBBZGQgc3VwcG9ydCBmb3IgJzNJVkQnIGZvdXJjYyAoIzMzMzQwMykuCisKKzIwMDYtMDMtMDQgMjA6MTE6MzUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9pZDNkZW11eC86IFVzZSBuZXcgdHlwZWZpbmQgaGVscGVyIGZ1bmN0aW9ucyBoZXJlIGFzIHdlbGwsIGFuZCBkbyB0eXBlZmluZGluZyBpbiBwdWxsLW1vZGUgaWYgdXBzdHJlYW0gc3VwcG9ydHMgdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfaWQzZGVtdXhfYWRkX3NyY3BhZCksCisJICAoZ3N0X2lkM2RlbXV4X2NoYWluKSwgKGdzdF9pZDNkZW11eF9zaW5rX2FjdGl2YXRlKToKKwkgIFVzZSBuZXcgdHlwZWZpbmQgaGVscGVyIGZ1bmN0aW9ucyBoZXJlIGFzIHdlbGwsIGFuZAorCSAgZG8gdHlwZWZpbmRpbmcgaW4gcHVsbC1tb2RlIGlmIHVwc3RyZWFtIHN1cHBvcnRzIHRoYXQuCisKKzIwMDYtMDMtMDQgMTg6NTc6MzcgKzAwMDAgIEJlbmphbWluIFBpbmVhdSA8YmVuLnBpbmVhdUBnbWFpbC5jb20+CisKKwkgIHN5cy9zdW5hdWRpby86IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLCBicmVha3MgYnVpbGQgZnJvbSBDVlMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuYzoKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl9jdHJsX2dldF92b2x1bWUpLAorCSAgKGdzdF9zdW5hdWRpb21peGVyX2N0cmxfc2V0X3ZvbHVtZSk6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVydHJhY2suYzoKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl90cmFja19uZXcpOgorCSAgUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMsIGJyZWFrcyBidWlsZCBmcm9tIENWUworCSAgd2l0aCAtV2Vycm9yICgjMzMzMzkyLCBwYXRjaCBieTogQmVuamFtaW4gUGluZWF1KQorCisyMDA2LTAzLTAzIDIzOjQ1OjIzICswMDAwICBTw6liYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisKKwkgIHN5cy86IHNpbmtzIGFyZSBub3cgdXNpbmcgR1NUX1JBTktfUFJJTUFSWSB0byBiZSB1c2VkIHdpdGggYXV0b2RlY3RlY3Rpb24KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvZGlyZWN0ZHJhdzoKKwkgICogc3lzL2RpcmVjdHNvdW5kOgorCSAgc2lua3MgYXJlIG5vdyB1c2luZyBHU1RfUkFOS19QUklNQVJZIHRvIGJlIHVzZWQgd2l0aCBhdXRvZGVjdGVjdGlvbgorCSAgKiB3aW4zMi92czY6CisJICBwcm9qZWN0IGZpbGVzIHVwZGF0ZWQgdG8gZml4IHNvbWUgYnVncworCSAgKiB3aW4zMi92czc6CisJICAqIHdpbjMyL3ZzODoKKwkgIHZzNyBhbmQgdnM4IHByb2plY3QgZmlsZXMgYWRkZWQKKworMjAwNi0wMy0wMyAxODozNjo1MyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZG9jcy9wbHVnaW5zLzogQWRkZWQgd2F2cGFyc2UgZG9jcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgIEFkZGVkIHdhdnBhcnNlIGRvY3MuCisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2NsYXNzX2luaXQpLAorCSAgKGdzdF93YXZwYXJzZV9yZXNldCksIChnc3Rfd2F2cGFyc2VfaW5pdCksCisJICAoZ3N0X3dhdnBhcnNlX2NyZWF0ZV9zb3VyY2VwYWQpLCAoZ3N0X3dhdnBhcnNlX3BhcnNlX2ZpbGVfaGVhZGVyKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2luaXQpLCAoZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2VlayksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKSwgKGdzdF93YXZwYXJzZV9zZW5kX2V2ZW50KSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpLCAoZ3N0X3dhdnBhcnNlX2xvb3ApLAorCSAgKGdzdF93YXZwYXJzZV9zcmNwYWRfZXZlbnQpLCAoZ3N0X3dhdnBhcnNlX3NpbmtfYWN0aXZhdGVfcHVsbCksCisJICAoZ3N0X3dhdnBhcnNlX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5oOgorCSAgSW1wbGVtZW50IHNlZWsgaW4gUkVBRFkgKGZpeGVzICMzMjc2NTgpCisJICBBZGRlZCBkb2NzIGFuZCBkaWQgc29tZSBjbGVhbnVwcy4KKworMjAwNi0wMy0wMyAxNzo1MToxNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC4qOiBJZiB3ZSBoYXZlIGFuIGluZGV4LCB1c2UgYSBkdXJhdGlvbiBiYXNlZCBvbiB0aGUgaW5kZXggaW5zdGVhZCBvZiBibGluZGx5IHRydXN0aW5nIHRoZSBpbmZvcm1hLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwKKwkgIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpLCAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0pLAorCSAgKGdzdF9hdmlfZGVtdXhfY2FsY3VsYXRlX2R1cmF0aW9uc19mcm9tX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXIpOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBJZiB3ZSBoYXZlIGFuIGluZGV4LCB1c2UgYSBkdXJhdGlvbiBiYXNlZCBvbiB0aGUgaW5kZXggaW5zdGVhZAorCSAgb2YgYmxpbmRseSB0cnVzdGluZyB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHN0cmVhbSBoZWFkZXJzCisJICAoZml4ZXMgIzMzMTgxNykuCisKKzIwMDYtMDMtMDMgMTU6NTA6NDAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGRvY3MvcGx1Z2lucy86IEFkZGVkIHNtb2tlIGFuZCBqcGVnIHRvIHRoZSBkb2NzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgIEFkZGVkIHNtb2tlIGFuZCBqcGVnIHRvIHRoZSBkb2NzLgorCSAgKiBleHQvanBlZy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2pwZWcvZ3N0anBlZy5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6IChnc3RfanBlZ19kZWNfY2hhaW4pOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZW5jLmg6CisJICAqIGV4dC9qcGVnL2dzdHNtb2tlZGVjLmM6IChnc3Rfc21va2VkZWNfaW5pdCksCisJICAoZ3N0X3Ntb2tlZGVjX2NoYWluKToKKwkgICogZXh0L2pwZWcvZ3N0c21va2VkZWMuaDoKKwkgICogZXh0L2pwZWcvZ3N0c21va2VlbmMuYzogKGdzdF9zbW9rZWVuY19jaGFpbik6CisJICAqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmg6CisJICAqIGV4dC9qcGVnL3Ntb2tlY29kZWMuaDoKKwkgIFBvcnQgc21va2VkZWMgKGZpeGVzICMzMzE5MDUpLgorCSAgQWRkZWQgc29tZSBkb2NzLgorCSAgU29tZSBjbGVhbnVwcy4KKworMjAwNi0wMy0wMyAxNDozOTo1NSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZG9jcy9wbHVnaW5zLzogQWRkZWQgdmlkZW9iYWxhbmNlIGFuZCB2aWRlb2ZsaXAgdG8gdGhlIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgQWRkZWQgdmlkZW9iYWxhbmNlIGFuZCB2aWRlb2ZsaXAgdG8gdGhlIGRvY3MuCisJICAqIGdzdC92aWRlb2ZpbHRlci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgKGdzdF92aWRlb19iYWxhbmNlX3VwZGF0ZV90YWJsZXNfcGxhbmFyNDExKSwKKwkgIChnc3RfdmlkZW9fYmFsYW5jZV9pc19wYXNzdGhyb3VnaCksCisJICAoZ3N0X3ZpZGVvX2JhbGFuY2VfdXBkYXRlX3Byb3BlcnRpZXMpLCAob2lsX3RhYmxlbG9va3VwX3U4KSwKKwkgIChnc3RfdmlkZW9fYmFsYW5jZV9wbGFuYXI0MTFfaXApLCAoZ3N0X3ZpZGVvX2JhbGFuY2Vfc2V0X2NhcHMpLAorCSAgKGdzdF92aWRlb19iYWxhbmNlX3RyYW5zZm9ybV9pcCksIChnc3RfdmlkZW9fYmFsYW5jZV9iYXNlX2luaXQpLAorCSAgKGdzdF92aWRlb19iYWxhbmNlX2ZpbmFsaXplKSwgKGdzdF92aWRlb19iYWxhbmNlX2NsYXNzX2luaXQpLAorCSAgKGdzdF92aWRlb19iYWxhbmNlX2luaXQpLCAoZ3N0X3ZpZGVvX2JhbGFuY2VfaW50ZXJmYWNlX3N1cHBvcnRlZCksCisJICAoZ3N0X3ZpZGVvX2JhbGFuY2VfaW50ZXJmYWNlX2luaXQpLAorCSAgKGdzdF92aWRlb19iYWxhbmNlX2NvbG9yYmFsYW5jZV9saXN0X2NoYW5uZWxzKSwKKwkgIChnc3RfdmlkZW9fYmFsYW5jZV9jb2xvcmJhbGFuY2Vfc2V0X3ZhbHVlKSwKKwkgIChnc3RfdmlkZW9fYmFsYW5jZV9jb2xvcmJhbGFuY2VfZ2V0X3ZhbHVlKSwKKwkgIChnc3RfdmlkZW9fYmFsYW5jZV9jb2xvcmJhbGFuY2VfaW5pdCksCisJICAoZ3N0X3ZpZGVvX2JhbGFuY2Vfc2V0X3Byb3BlcnR5KSwgKGdzdF92aWRlb19iYWxhbmNlX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3ZpZGVvX2JhbGFuY2VfZ2V0X3R5cGUpLCAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmg6CisJICBQb3J0ZWQgdG8gMC4xMC4gKEZpeGVzICMzMjYxNjApCisJICBBZGRlZCBkb2NzLgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICAqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuaDoKKwkgIEFkZGVkIGRvY3MuCisKKzIwMDYtMDMtMDMgMTE6MDc6NDEgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogVXNlIEdTVF9XQVJOSU5HIGluc3RlYWQgb2YgR1NUX0VSUk9SIGZvciBhbGwgdGhlIHRvbyBzaG9ydC9sb25nIGF0b21zIHdoZW4gcGFyc2luZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBVc2UgR1NUX1dBUk5JTkcgaW5zdGVhZCBvZiBHU1RfRVJST1IgZm9yIGFsbCB0aGUgdG9vIHNob3J0L2xvbmcgYXRvbXMKKwkgIHdoZW4gcGFyc2luZy4KKwkgIEFsc28gbGV0J3MgYmUgYSBiaXQgbGVzcyB2dWxnYXIgaW4gb3VyIHdhcm5pbmcgbWVzc2FnZXMgOikKKworMjAwNi0wMy0wMiAxNToxNDoyMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBCdW1wIHJlcXVpcmVtZW50cyB0byBjdXJyZW50IGNvcmUgYW5kIC1iYXNlIENWUyAoY29yZSBmb3IgbmV3IHR5cGVmaW5kIGhlbHBlciBBUEksIGFuZCAtYmFzZSBmb3IgdGhlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgQnVtcCByZXF1aXJlbWVudHMgdG8gY3VycmVudCBjb3JlIGFuZCAtYmFzZSBDVlMKKwkgIChjb3JlIGZvciBuZXcgdHlwZWZpbmQgaGVscGVyIEFQSSwgYW5kIC1iYXNlIGZvciB0aGUKKwkgIFdBVkZPUk1BVEVYIHN1cHBvcnQgdGhhdCB3YXMgYWRkZWQgdG8gbGliZ3N0cmlmZiBhbmQKKwkgIGlzIG5lZWRlZCBieSB3YXZwYXJzZSkuCisJICAqIGdzdC9hcGV0YWcvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hcGV0YWcvZ3N0dGFnZGVtdXguYzogKGdzdF90YWdfZGVtdXhfY2hhaW4pLAorCSAgKGdzdF90YWdfZGVtdXhfc2lua19hY3RpdmF0ZSk6CisJICBVc2UgbmV3IHR5cGVmaW5kIGhlbHBlcnMgZm9yIHR5cGVmaW5kaW5nIGluc3RlYWQgb2Ygb3VyCisJICBob21lLWdyb3duIHN0dWZmOyBhbHNvLCBkbyB0eXBlZmluZGluZyBpbiBwdWxsLW1vZGUgaWYKKwkgIHVwc3RyZWFtIHN1cHBvcnRzIHRoYXQuCisKKzIwMDYtMDItMjggMTE6NTk6NDkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQ2FuJ3QgZGl2aWRlIHRocm91Z2ggemVybyAoc3VwcHJlc3Mgd2FybmluZyBpbiBjYXNlIG9mIHN0cmVhbSB3aXRoIG9uZSBzaW5nbGUgc3RpbGwgcGljdHVyZSkgKC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBDYW4ndCBkaXZpZGUgdGhyb3VnaCB6ZXJvIChzdXBwcmVzcyB3YXJuaW5nIGluIGNhc2Ugb2YKKwkgIHN0cmVhbSB3aXRoIG9uZSBzaW5nbGUgc3RpbGwgcGljdHVyZSkgKHNlZSAjMzI3MDgzKQorCisyMDA2LTAyLTI4IDEwOjQwOjAxICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkgIHJlbW92ZSBjb25mbGljdCBpbmRpY2F0b3IKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmVtb3ZlIGNvbmZsaWN0IGluZGljYXRvcgorCisyMDA2LTAyLTI4IDEwOjM5OjA4ICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkgIGFkZCBtaXNzaW5nIGVudHJ5CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCBtaXNzaW5nIGVudHJ5CisKKzIwMDYtMDItMjggMTA6Mjk6MTYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBVc2UgREVCVUdfT0JKRUNUIG1vcmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcGVyZm9ybV9zZWVrKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMpLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhKSwKKwkgIChnc3Rfd2F2cGFyc2VfcGFkX2NvbnZlcnQpLCAoZ3N0X3dhdnBhcnNlX3NyY3BhZF9ldmVudCksCisJICAoZ3N0X3dhdnBhcnNlX3NpbmtfYWN0aXZhdGUpLCAoZ3N0X3dhdnBhcnNlX3NpbmtfYWN0aXZhdGVfcHVsbCk6CisJICBVc2UgREVCVUdfT0JKRUNUIG1vcmUuCisKKzIwMDYtMDItMjggMTA6MjI6MTEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGRvY3MvcGx1Z2lucy86IEFkZGVkIGR2ZGVjIGFuZCBkdmRlbXV4IHRvIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBBZGRlZCBkdmRlYyBhbmQgZHZkZW11eCB0byBkb2NzLgorCSAgKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19iYXNlX2luaXQpLCAoZ3N0X2R2ZGVjX2NoYWluKToKKwkgIEFkZGVkIGRvY3MuCisJICBDaGVjayBmcmFtZSBzaXplcyBzbyB3ZSBkb24ndCBjcmFzaCB3aGVuIGRvbid0IGhhdmUgZW5vdWdoCisJICBkYXRhLgorCSAgU2VuZCBuaWNlIGVycm9yIG1lc3NhZ2VzIG9uIGVycm9yLgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5jOiAoZ3N0X2R2ZGVtdXhfYmFzZV9pbml0KSwKKwkgIChnc3RfZHZkZW11eF9jbGFzc19pbml0KSwgKGdzdF9kdmRlbXV4X2luaXQpLAorCSAgKGdzdF9kdmRlbXV4X2ZpbmFsaXplKSwgKGdzdF9kdmRlbXV4X3Jlc2V0KSwKKwkgIChnc3RfZHZkZW11eF9zcmNfY29udmVydCksIChnc3RfZHZkZW11eF9zaW5rX2NvbnZlcnQpLAorCSAgKGdzdF9kdmRlbXV4X3NyY19xdWVyeSksIChnc3RfZHZkZW11eF9zaW5rX3F1ZXJ5KSwKKwkgIChnc3RfZHZkZW11eF9wdXNoX2V2ZW50KSwgKGdzdF9kdmRlbXV4X2hhbmRsZV9zaW5rX2V2ZW50KSwKKwkgIChnc3RfZHZkZW11eF9jb252ZXJ0X3NyY19wYWlyKSwgKGdzdF9kdmRlbXV4X2NvbnZlcnRfc2lua19wYWlyKSwKKwkgIChnc3RfZHZkZW11eF9jb252ZXJ0X3NyY190b19zaW5rKSwgKGdzdF9kdmRlbXV4X2hhbmRsZV9wdXNoX3NlZWspLAorCSAgKGdzdF9kdmRlbXV4X2RvX3NlZWspLCAoZ3N0X2R2ZGVtdXhfaGFuZGxlX3B1bGxfc2VlayksCisJICAoZ3N0X2R2ZGVtdXhfaGFuZGxlX3NyY19ldmVudCksIChnc3RfZHZkZW11eF9kZW11eF9hdWRpbyksCisJICAoZ3N0X2R2ZGVtdXhfZGVtdXhfdmlkZW8pLCAoZ3N0X2R2ZGVtdXhfZGVtdXhfZnJhbWUpLAorCSAgKGdzdF9kdmRlbXV4X2ZsdXNoKSwgKGdzdF9kdmRlbXV4X2NoYWluKSwgKGdzdF9kdmRlbXV4X2xvb3ApLAorCSAgKGdzdF9kdmRlbXV4X3NpbmtfYWN0aXZhdGVfcHVzaCksIChnc3RfZHZkZW11eF9zaW5rX2FjdGl2YXRlX3B1bGwpLAorCSAgKGdzdF9kdmRlbXV4X3NpbmtfYWN0aXZhdGUpLCAoZ3N0X2R2ZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguaDoKKwkgIEFkZGVkIGRvY3MuCisJICBJbXBsZW1lbnQgcHVsbCBtb2RlLgorCSAgRml4IG1lbWxlYWtzLgorCSAgUmVkdWNlIG1lbWNweSBmb3IgdGhlIHZpZGVvIGRlbXV4aW5nLgorCisyMDA2LTAyLTI4IDA5OjIxOjI3ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZXh0L2Fubm9kZXgvOiBBZGQgYSBsaXR0bGUgZXh0cmEgZGVidWcuIE1ha2UgdGhlIGRlY29kZXIgbm90IHJldHVybiBOT1RfTElOS0VELCBhcyB3ZSB3YW50IHRvIGNvbnRpbnVlIGRlY29kaW5nIGFsbCBDLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOiAoZ3N0X2NtbWxfZGVjX3NpbmtfZXZlbnQpLAorCSAgKGdzdF9jbW1sX2RlY19uZXdfYnVmZmVyKSwgKGdzdF9jbW1sX2RlY19wYXJzZV9wcmVhbWJsZSksCisJICAoZ3N0X2NtbWxfZGVjX3BhcnNlX2hlYWQpLCAoZ3N0X2NtbWxfZGVjX3B1c2hfY2xpcCk6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxwYXJzZXIuYzogKGdzdF9jbW1sX3BhcnNlcl9wYXJzZV9jaHVuayk6CisJICBBZGQgYSBsaXR0bGUgZXh0cmEgZGVidWcuIE1ha2UgdGhlIGRlY29kZXIgbm90IHJldHVybiBOT1RfTElOS0VELAorCSAgYXMgd2Ugd2FudCB0byBjb250aW51ZSBkZWNvZGluZyBhbGwgQ01NTCBhbmQgZW1pdHRpbmcgdGFncy4KKworMjAwNi0wMi0yNyAxNDozNzoyOSArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBhZGQgYW5ub2RleCBwbHVnaW4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkIGFubm9kZXggcGx1Z2luCisKKzIwMDYtMDItMjcgMTQ6MDA6MTggKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZXh0L2Fubm9kZXgvZ3N0c2tlbHRhZy4qOiBEZWxldGVkOyB0aGVzZSBmaWxlcyBhcmVuJ3QgdXNlZCBhbnkgbW9yZSBlaXRoZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0c2tlbHRhZy5jOgorCSAgKiBleHQvYW5ub2RleC9nc3Rza2VsdGFnLmg6CisJICBEZWxldGVkOyB0aGVzZSBmaWxlcyBhcmVuJ3QgdXNlZCBhbnkgbW9yZSBlaXRoZXIuCisKKzIwMDYtMDItMjUgMjA6Mzc6MjkgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBleHQvTWFrZWZpbGUuYW06IEZpeCBkaXN0LWNoZWNrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAyLTI1ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGV4dC9NYWtlZmlsZS5hbTogRml4IGRpc3QtY2hlY2suCisKKzIwMDYtMDItMjUgMTk6MzY6MjQgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBleHQvYW5ub2RleC9nc3RjbW1sZW5jLmM6IEZpeCBhbm90aGVyIG1lbWxlYWsuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDItMjUgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOiAoZ3N0X2NtbWxfZW5jX3B1c2hfY2xpcCk6IEZpeCBhbm90aGVyCisJICBtZW1sZWFrLgorCisyMDA2LTAyLTI1IDE5OjA3OjQxICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgRml4IGEgbWVtbGVhayBpbiBnc3RfY21tbF90cmFja19saXN0X2FkZF9jbGlwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAyLTI1ICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyb0BubnZhLm9yZz4KKwkgICogZXh0L2Fubm9kZXgvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hbm5vZGV4L2dzdGFubm9kZXguYzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1sZW5jLmM6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxwYXJzZXIuYzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbHBhcnNlci5oOgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1sdXRpbHMuYzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvY21tbGRlYy5jOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZW5jLmM6CisJICBGaXggYSBtZW1sZWFrIGluIGdzdF9jbW1sX3RyYWNrX2xpc3RfYWRkX2NsaXAuCisJICBIYW5kbGUgb3ZlcmZsb3dzIGluIGNsaXAncyBzdGFydCBhbmQgZW5kIHRpbWVzLgorCSAgQWRkIHRoZSAiZW5jb2RlZCIgcGFyYW1ldGVyIHRvIGNtbWxkZWMgYW5kIGNtbWxlbmMgY2Fwcy4KKwkgIERvIG5vdCBwYXJzZSBqdW5rIGF0IHRoZSBlbmQgb2YgYSBDTU1MIHByZWFtYmxlIGJ1ZmZlci4KKwkgIFJlZ2lzdGVyIGEgbGlieG1sIGVycm9yIGhhbmRsZXIgdG8gbm90IHByaW50IHN0dWZmIG9uIHN0ZGVyci4KKwkgIENoZWNrIGZvciBiYWQgY2xpcCBzdGFydCBhbmQgZW5kIHRpbWVzIGluIHRoZSB0ZXN0c3VpdGVzLgorCisyMDA2LTAyLTI1IDExOjM3OjEwICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZXh0L2Fubm9kZXgvOiBGaXggcG9zc2libGUgbWVtbGVha3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDItMjUgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOiAoZ3N0X2NtbWxfZGVjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9jbW1sX2RlY19maW5hbGl6ZSksIChnc3RfY21tbF9kZWNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOiAoZ3N0X2NtbWxfZW5jX2NsYXNzX2luaXQpLAorCSAgKGdzdF9jbW1sX2VuY19maW5hbGl6ZSksIChnc3RfY21tbF9lbmNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbHV0aWxzLmM6IChnc3RfY21tbF90cmFja19saXN0X2Rlc3Ryb3kpOiBGaXgKKwkgIHBvc3NpYmxlIG1lbWxlYWtzLgorCisyMDA2LTAyLTI0IDIzOjUyOjI4ICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgdGVzdHMvY2hlY2svOiBGaXggdGVzdHMgc28gdGhhdCB0aGV5IHVzZSB0aGUgcGx1Z2lucy1iYXNlIHRhZ3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDItMjUgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxkZWMuYzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvY21tbGVuYy5jOiBGaXggdGVzdHMgc28gdGhhdCB0aGV5IHVzZQorCSAgdGhlIHBsdWdpbnMtYmFzZSB0YWdzLgorCisyMDA2LTAyLTI0IDIzOjM2OjU4ICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZXh0L01ha2VmaWxlLmFtOiBSZS1lbmFibGUgbW9kdWxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAyLTI1ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGV4dC9NYWtlZmlsZS5hbTogUmUtZW5hYmxlIG1vZHVsZS4KKworMjAwNi0wMi0yNCAyMzozMjoxNCArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOiBGb3Jnb3QgdG8gcmVtb3ZlIHRoYXQgdGVzdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wMi0yNSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogRm9yZ290IHRvIHJlbW92ZSB0aGF0IHRlc3QuCisKKzIwMDYtMDItMjQgMjM6MzE6MDggKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBUcnkgdG8gZml4IEFubm9kZXggcGx1Z2luLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAyLTI1ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGV4dC9hbm5vZGV4L01ha2VmaWxlLmFtOgorCSAgKiBleHQvYW5ub2RleC9nc3Rhbm5vZGV4LmM6IChwbHVnaW5faW5pdCk6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuYzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0c2tlbGRlYy5jOgorCSAgKiBleHQvYW5ub2RleC9nc3Rza2VsZGVjLmg6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9za2VsZGVjLmM6IFRyeSB0byBmaXggQW5ub2RleCBwbHVnaW4uCisKKzIwMDYtMDItMjQgMjM6MDY6MjcgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogRGlzYWJsZSB0aG9zZSBjaGVja3MgYXMgd2VsbC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wMi0yNSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogRGlzYWJsZSB0aG9zZSBjaGVja3MgYXMgd2VsbC4KKworMjAwNi0wMi0yNCAyMjo0OToyOSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGV4dC9NYWtlZmlsZS5hbTogRGlzYWJsZSBhbm5vZGV4IGZvciBub3cgdW50aWwgd2UgZmlndXJlIG91dCBob3cgdG8gbWFrZSBpdCBidWlsZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wMi0yNCAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBleHQvTWFrZWZpbGUuYW06IERpc2FibGUgYW5ub2RleCBmb3Igbm93IHVudGlsIHdlIGZpZ3VyZSBvdXQKKwkgIGhvdyB0byBtYWtlIGl0IGJ1aWxkLgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9NYWtlZmlsZS5hbTogTm90ZSBmb3IgVGhvbWFzIDoKKwkgIEFkZCBhIHJ1bGUgdG8geW91ciBjaGVja2xpc3QgOiAicGxlYXNlIHRyeSB0byBhdCBsZWFzdCBidWlsZAorCSAgd2hhdCB5b3UgYXJlIGdvaW5nIHRvIGNvbW1pdCBpbnRvIC1nb29kLCBvciBpZiB5b3UgYXJlIHRvbyBsYXp5CisJICB0byBkbyB0aGF0LCBwbGVhc2UgY2hlY2sgdGhhdCB0aGUgYnVpbGRib3RzIGFyZSBub3QgY3J5aW5nIGJlY2F1c2UKKwkgIG9mIHlvdXIgY29tbWl0LiIKKworMjAwNi0wMi0yNCAxOTo1MToyOSArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBDaGFuZ2VMb2c6CisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvZ2RrX3BpeGJ1Zi9NYWtlZmlsZS5hbToKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmg6CisJKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5jOgorCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuaDoKKwkgIEknbSB0b28gbGF6eSB0byBjb21tZW50IHRoaXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgR2RrcGl4YnVmIHBvcnRlZCBmcm9tIDAuOCB0byAwLjEwIGJ5IFJlbmF0byBGaWxobyA8cmVuYXRvLmZpbGhvQGluZHQub3JnLmJyPi4gZ3N0X2xvYWRlciBhbmQgZ2RrcGl4YnVmYW5pbWF0aW9uIHN0aWxsIG5lZWQgcG9ydC4KKworMjAwNi0wMi0yNCAxOTo0OTozMiArMDAwMCAgRmFicml6aW8gR2VubmFyaSA8ZmFicml6aW8uZ2VAdGlzY2FsaS5pdD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGQgc3VwcG9ydCBmb3IgcGFsZXR0aXNlZCBBcHBsZSBTTUMgdmlkZW9zICgjMzI3MDc1LCBiYXNlZCBvbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pLAorCSAgKHF0ZGVtdXhfcGFyc2VfdHJhayksIChxdGRlbXV4X3ZpZGVvX2NhcHMpOgorCSAgQWRkIHN1cHBvcnQgZm9yIHBhbGV0dGlzZWQgQXBwbGUgU01DIHZpZGVvcyAoIzMyNzA3NSwgYmFzZWQgb24KKwkgIHBhdGNoIGJ5OiBGYWJyaXppbyBHZW5uYXJpIDxmYWJyaXppbyBkb3QgZ2UgYXQgdGlzY2FsaSBkb3QgaXQ+KS4KKworMjAwNi0wMi0yNCAxOTowNzoxMCArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBBZGQgQW5ub2RleCBlbGVtZW50cyBmcm9tIEFsZXNzZW5kcm8gRGVjaW5hOiBza2VsZXRvbiBhbmQgQ01NTC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBleHQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hbm5vZGV4L01ha2VmaWxlLmFtOgorCSAgKiBleHQvYW5ub2RleC9nc3Rhbm5vZGV4LmM6CisJICAqIGV4dC9hbm5vZGV4L2dzdGFubm9kZXguaDoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1sZGVjLmg6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxlbmMuYzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5oOgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1scGFyc2VyLmM6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxwYXJzZXIuaDoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbHRhZy5jOgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1sdGFnLmg6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWx1dGlscy5jOgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1sdXRpbHMuaDoKKwkgICogZXh0L2Fubm9kZXgvZ3N0c2tlbGRlYy5jOgorCSAgKiBleHQvYW5ub2RleC9nc3Rza2VsZGVjLmg6CisJICAqIGV4dC9hbm5vZGV4L2dzdHNrZWx0YWcuYzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0c2tlbHRhZy5oOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvY21tbGRlYy5jOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZW5jLmM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NrZWxkZWMuYzoKKwkgIEFkZCBBbm5vZGV4IGVsZW1lbnRzIGZyb20gQWxlc3NlbmRybyBEZWNpbmE6IHNrZWxldG9uIGFuZCBDTU1MLgorCSAgSW5jbHVkZXMgdGVzdHMgJiBkb2NzLCBvaCBteSEgUGFzc2VzIFRob21hcydzIC1nb29kIGNoZWNrbGlzdAorCSAgZW50aXJlbHkuIFdvdy4KKworMjAwNi0wMi0yNCAxNzowOTo1NiArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBhdXRvZ2VuLnNoOiBDaGVjayBmb3IgYXV0b21ha2UgMS45IGFzIHdlbGwuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogYXV0b2dlbi5zaDoKKwkgIENoZWNrIGZvciBhdXRvbWFrZSAxLjkgYXMgd2VsbC4KKworMjAwNi0wMi0yNCAxNDo0OTo0OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOiBDaGFuZ2UgbWluLiBzYW1wbGUgcmF0ZSB0byA4a0h6IHRvIG1hdGNoIGZsYWNkZWMncy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBDaGFuZ2UgbWluLiBzYW1wbGUgcmF0ZSB0byA4a0h6IHRvIG1hdGNoIGZsYWNkZWMncy4KKworMjAwNi0wMi0yMyAyMDowODo1OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2NkaW8vTWFrZWZpbGUuYW06IEFkZCBHU1RfQkFTRV9DRkxBR1MgYW5kIEdTVF9CQVNFX0xJQlMgKHNlZW1zIHRvIGJlIHJlcXVpcmVkIGZvciBDeWd3aW4sIHNlZSAjMzE3MDQ4KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9jZGlvL01ha2VmaWxlLmFtOgorCSAgQWRkIEdTVF9CQVNFX0NGTEFHUyBhbmQgR1NUX0JBU0VfTElCUyAoc2VlbXMgdG8gYmUKKwkgIHJlcXVpcmVkIGZvciBDeWd3aW4sIHNlZSAjMzE3MDQ4KQorCSAgKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jOgorCSAgQ3lnd2luIGhhcyBpbmNsdWRlcyBmb3IgYm90aCB0aGUgdW5peCBuZXR3b3JrIHNvY2tldCBBUEkKKwkgIGFuZCB0aGUgd2luZG93cyBBUEksIGJ1dCBvbmx5IG9uZSBjYW4gYmUgaW5jbHVkZWQsIHNvIGZpeAorCSAgaW5jbHVkZXMgdG8gb25seSB1c2Ugb25lIG9yIHRoZSBvdGhlciwgcHJlZmVyaW5nIHRoZSB1bnhpCisJICBvbmUgKCMzMTcwNDgpLgorCisyMDA2LTAyLTIzIDEyOjIxOjI1ICswMDAwICBQaGlsaXBwZSBLYWxhZiA8cGhpbGlwcGUua2FsYWZAY29sbGFib3JhLmNvLnVrPgorCisJICBydHAvZ3N0LzogU2VwYXJhdGVkIHRoZSBHNzExIHBheWxvYWRlcnMvZGVwYXlsb2FkZXJzIGludG8gc2VwYXJhdGUgZWxlbWVudHMgZm9yIG11bGF3L2FsYXcuIEFsc28gcmVtb3ZlZCB0aGUgb2xkIGc3MTEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wMi0yMyAgUGhpbGlwcGUgS2FsYWYgIDxwaGlsaXBwZS5rYWxhZiBhdCBjb2xsYWJvcmEuY28udWs+CisJICAqIHJ0cC9nc3QvZ3N0cnRwcGNtYWRlcGF5LmM6CisJICAqIHJ0cC9nc3QvZ3N0cnRwcGNtYWRlcGF5Lmg6CisJICAqIHJ0cC9nc3QvZ3N0Z3N0cnRwcGNtYXBheS5jOgorCSAgKiBydHAvZ3N0L2dzdGdzdHJ0cHBjbWFwYXkuaDoKKwkgICogcnRwL2dzdC9nc3RydHBwY211ZGVwYXkuYzoKKwkgICogcnRwL2dzdC9nc3RydHBwY211ZGVwYXkuaDoKKwkgICogcnRwL2dzdC9nc3RydHBwY211cGF5LmM6CisJICAqIHJ0cC9nc3QvZ3N0cnRwcGNtdXBheS5oOgorCSAgKiBydHAvZ3N0L01ha2VmaWxlLmFtOgorCSAgKiBydHAvZ3N0L2dzdHJ0cC5jOgorCSAgKiBydHAvZ3N0L1JFQURNRToKKwkgIFNlcGFyYXRlZCB0aGUgRzcxMSBwYXlsb2FkZXJzL2RlcGF5bG9hZGVycyBpbnRvIHNlcGFyYXRlIGVsZW1lbnRzIGZvcgorCSAgbXVsYXcvYWxhdy4gQWxzbyByZW1vdmVkIHRoZSBvbGQgZzcxMSBwYXlsb2FkZXJzL2RlcGF5bG9hZGVycy4KKworMjAwNi0wMi0yMiAyMDoyMjoyNSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L2R2LzogVWViZXIgc3BpZmZpZnkgc29tZSBtb3JlLCBhZGRlZCBkZWJ1ZyBjYXRlZ29yeS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19iYXNlX2luaXQpLCAoZ3N0X2R2ZGVjX2luaXQpLAorCSAgKGdzdF9kdmRlY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvZHYvZ3N0ZHZkZWMuaDoKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2Jhc2VfaW5pdCksIChnc3RfZHZkZW11eF9pbml0KSwKKwkgIChnc3RfZHZkZW11eF9zcmNfY29udmVydCksIChnc3RfZHZkZW11eF9zaW5rX2NvbnZlcnQpLAorCSAgKGdzdF9kdmRlbXV4X3NyY19xdWVyeSksIChnc3RfZHZkZW11eF9zaW5rX3F1ZXJ5KSwKKwkgIChnc3RfZHZkZW11eF9oYW5kbGVfc2lua19ldmVudCksIChnc3RfZHZkZW11eF9kZW11eF9mcmFtZSksCisJICAoZ3N0X2R2ZGVtdXhfZmx1c2gpLCAoZ3N0X2R2ZGVtdXhfY2hhaW4pLAorCSAgKGdzdF9kdmRlbXV4X2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9kdi9nc3RkdmRlbXV4Lmg6CisJICBVZWJlciBzcGlmZmlmeSBzb21lIG1vcmUsIGFkZGVkIGRlYnVnIGNhdGVnb3J5LgorCSAgVXNlIF9zY2FsZS4KKwkgIFVzZSBzZWdtZW50cywgcmVzcGVjdCBwbGF5YmFjayByYXRlIGZyb20gbmV3c2VnbWVudC4KKwkgIEZpeCByZWZjb3VudCBpc3N1ZS4KKworMjAwNi0wMi0yMiAwOTozMzoyNSArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGQgJ2R2c2QnIGFuZCAnZHYyNScgdG8gbGlzdCBvZiBwb3NzaWJsZSBmb3VyY2MgdmFsdWVzIGZvciBEViBWaWRlby4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUmV2aWV3ZWQgYnkgOiBFZHdhcmQgSGVydmV5IDxlZHdhcmRAZmx1ZW5kby5jb20+CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6CisJICBBZGQgJ2R2c2QnIGFuZCAnZHYyNScgdG8gbGlzdCBvZiBwb3NzaWJsZSBmb3VyY2MgdmFsdWVzIGZvciBEViBWaWRlby4KKwkgIEFkZCBpbWFnZS9wbmcgZm9yIGZvdXJjYyAncG5nICcKKworMjAwNi0wMi0yMCAyMToxOTo1OSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIFBvcnQgeGltYWdlc3JjIHRvIDAuMTAgKENsb3NlcyAjMzA0Nzk1KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogc3lzL01ha2VmaWxlLmFtOgorCSAgKiBzeXMveGltYWdlc3JjL01ha2VmaWxlLmFtOgorCSAgKiBzeXMveGltYWdlc3JjL3hpbWFnZXNyYy5jOiAoZ3N0X3hpbWFnZXNyY19yZXR1cm5fYnVmKSwKKwkgIChnc3RfeGltYWdlc3JjX29wZW5fZGlzcGxheSksIChnc3RfeGltYWdlc3JjX3N0YXJ0KSwKKwkgIChnc3RfeGltYWdlc3JjX3N0b3ApLCAoZ3N0X3hpbWFnZXNyY191bmxvY2spLAorCSAgKGdzdF94aW1hZ2VzcmNfcmVjYWxjKSwgKGNvbXBvc2l0ZV9waXhlbCksCisJICAoZ3N0X3hpbWFnZXNyY194aW1hZ2VfZ2V0KSwgKGdzdF94aW1hZ2VzcmNfY3JlYXRlKSwKKwkgIChnc3RfeGltYWdlc3JjX3NldF9wcm9wZXJ0eSksIChnc3RfeGltYWdlc3JjX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3hpbWFnZXNyY19jbGVhcl9idWZwb29sKSwgKGdzdF94aW1hZ2VzcmNfYmFzZV9pbml0KSwKKwkgIChnc3RfeGltYWdlc3JjX2Rpc3Bvc2UpLCAoZ3N0X3hpbWFnZXNyY19maW5hbGl6ZSksCisJICAoZ3N0X3hpbWFnZXNyY19nZXRfY2FwcyksIChnc3RfeGltYWdlc3JjX3NldF9jYXBzKSwKKwkgIChnc3RfeGltYWdlc3JjX2ZpeGF0ZSksIChnc3RfeGltYWdlc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF94aW1hZ2VzcmNfaW5pdCksIChwbHVnaW5faW5pdCk6CisJICAqIHN5cy94aW1hZ2VzcmMveGltYWdlc3JjLmg6CisJICAqIHN5cy94aW1hZ2VzcmMveGltYWdldXRpbC5jOiAoeGltYWdldXRpbF9oYW5kbGVfeGVycm9yKSwKKwkgICh4aW1hZ2V1dGlsX2NoZWNrX3hzaG1fY2FsbHMpLCAoeGltYWdldXRpbF94Y29udGV4dF9nZXQpLAorCSAgKHhpbWFnZXV0aWxfeGNvbnRleHRfY2xlYXIpLAorCSAgKHhpbWFnZXV0aWxfY2FsY3VsYXRlX3BpeGVsX2FzcGVjdF9yYXRpbyksCisJICAoZ3N0X3hpbWFnZXNyY19idWZmZXJfZmluYWxpemUpLCAoZ3N0X3hpbWFnZV9idWZmZXJfZnJlZSksCisJICAoZ3N0X3hpbWFnZXNyY19idWZmZXJfaW5pdCksIChnc3RfeGltYWdlc3JjX2J1ZmZlcl9jbGFzc19pbml0KSwKKwkgIChnc3RfeGltYWdlc3JjX2J1ZmZlcl9nZXRfdHlwZSksIChnc3RfeGltYWdldXRpbF94aW1hZ2VfbmV3KSwKKwkgIChnc3RfeGltYWdldXRpbF94aW1hZ2VfZGVzdHJveSk6CisJICAqIHN5cy94aW1hZ2VzcmMveGltYWdldXRpbC5oOgorCSAgUG9ydCB4aW1hZ2VzcmMgdG8gMC4xMCAoQ2xvc2VzICMzMDQ3OTUpCisKKz09PSByZWxlYXNlIDAuMTAuMSA9PT0KKworMjAwNi0wMi0yMCAxOToxMjoxMCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogcmVsZWFzaW5nIDAuMTAuMSwgIlNsaW15IC0geWV0IHNhdGlzZnlpbmciCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDItMjAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCSAgKiBjb25maWd1cmUuYWM6CisJICByZWxlYXNpbmcgMC4xMC4xLCAiU2xpbXkgLSB5ZXQgc2F0aXNmeWluZyIKKworMjAwNi0wMi0yMCAxMzowODo1MCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmM6IEZpeCBjb21waWxhdGlvbiBvZiBMQURQU0EuIEl0IGRvZXNuJ3Qgc2VlbSB0byB3b3JrLCBhbmQgaXNuJ3QgZW5hYmxlZCBmb3IgdGhlIGJ1aWxkLC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmM6IChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9ldmVudCksCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfcHJvY2Vzcyk6CisJICBGaXggY29tcGlsYXRpb24gb2YgTEFEUFNBLiBJdCBkb2Vzbid0IHNlZW0gdG8gd29yaywgYW5kIGlzbid0CisJICBlbmFibGVkIGZvciB0aGUgYnVpbGQsIGJ1dCBpdCBoZWxwcyBtZSB3aW4gdGhlIGZlYXR1cmUtY291bnQKKwkgIGNvbXBldGl0aW9ucyBvb2ggeWVhaC4KKworMjAwNi0wMi0xOSAxNjowMjoyNSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBVc2Ugc2NhbGluZyBjb2RlIGZvciBhZGRlZCBwcmVjaXNzaW9uIGFuZCBtb3JlIGNvcnJlY3Qgc3RvcCBwb3NpdGlvbiBpbiBjYXNlIHNjYWxlPT0wLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfc3JjX2NvbnZlcnQpLAorCSAgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpLAorCSAgKGdzdF9hdmlfZGVtdXhfcGFyc2VfZmlsZV9oZWFkZXIpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5pdCksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9hdmloKSwgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3VwZXJpbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdWJpbmRleCksIChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyKSwgKGdzdF9hdmlfZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgIFVzZSBzY2FsaW5nIGNvZGUgZm9yIGFkZGVkIHByZWNpc3Npb24gYW5kIG1vcmUgY29ycmVjdCBzdG9wCisJICBwb3NpdGlvbiBpbiBjYXNlIHNjYWxlPT0wLgorCisyMDA2LTAyLTE5IDEyOjA5OjE5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvZmx4L2dzdGZseGRlYy4qOiBJbXBsZW1lbnQgRFVSQVRJT04gcXVlcnkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ZseC9nc3RmbHhkZWMuYzogKGdzdF9mbHhkZWNfc3JjX3F1ZXJ5X2hhbmRsZXIpLAorCSAgKGdzdF9mbHhkZWNfY2hhaW4pOgorCSAgKiBnc3QvZmx4L2dzdGZseGRlYy5oOgorCSAgSW1wbGVtZW50IERVUkFUSU9OIHF1ZXJ5LgorCisyMDA2LTAyLTE5IDExOjU3OjU4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvZmx4LzogU2V0IE1BTExPQ0RBVEEgZm9yIHRoZSB0ZW1wIGJ1ZmZlcnMgc28gd2UgZG9uJ3QgbGVhay4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx4L2ZseF9jb2xvci5oOgorCSAgKiBnc3QvZmx4L2ZseF9mbXQuaDoKKwkgICogZ3N0L2ZseC9nc3RmbHhkZWMuYzogKGdzdF9mbHhkZWNfaW5pdCksCisJICAoZ3N0X2ZseGRlY19zcmNfcXVlcnlfaGFuZGxlciksIChmbHhfZGVjb2RlX2NvbG9yKSwKKwkgIChnc3RfZmx4ZGVjX2NoYWluKToKKwkgICogZ3N0L2ZseC9nc3RmbHhkZWMuaDoKKwkgIFNldCBNQUxMT0NEQVRBIGZvciB0aGUgdGVtcCBidWZmZXJzIHNvIHdlIGRvbid0IGxlYWsuCisJICBTb21lIGRlYnVnIGNsZWFudXBzLgorCSAgQ29uc3VtZSBhbGwgZGF0YSBpbiB0aGUgYWRhcHRlciBiZWZvcmUgbGVhdmluZyB0aGUgY2hhaW4KKwkgIGZ1bmN0aW9uLiBGaXhlcyAjMzMwNjc4LgorCisyMDA2LTAyLTE4IDIwOjQ4OjA5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4LzogSGFuZGxlIDAgZGF0YSBzaXplIGluIG90aGVyd2lzZSB2YWxpZCBmcmFtZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzogKGlkM2RlbXV4X2lkM3YyX2ZyYW1lc190b190YWdfbGlzdCk6CisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiAoaWQzdjJfZ2VucmVfZmllbGRzX3RvX3RhZ2xpc3QpOgorCSAgSGFuZGxlIDAgZGF0YSBzaXplIGluIG90aGVyd2lzZSB2YWxpZCBmcmFtZXMuCisJICBIYW5kbGUgbnVtZXJpYyBzdHJpbmdzIGluIDIuNC4wIGV2ZW4gd2hlbiBub3QgaW4gcGFyZW50aGVzZXMKKworMjAwNi0wMi0xOCAxNzoyMDo0OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thLzogUmVjb2duaXNlIFNTQS9BU1MgYW5kIFVTRiBzdWJ0aXRsZSBmb3JtYXRzIGFuZCBzZXQgcHJvcGVyIGNhcHMgd2hlbiB0aGV5IGFyZSBmb3VuZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3VidGl0bGVfY2FwcyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgUmVjb2duaXNlIFNTQS9BU1MgYW5kIFVTRiBzdWJ0aXRsZSBmb3JtYXRzIGFuZAorCSAgc2V0IHByb3BlciBjYXBzIHdoZW4gdGhleSBhcmUgZm91bmQuCisKKzIwMDYtMDItMTcgMTg6MjU6NDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRG9uJ3QgR1NUX0xPRyB0aW1lc3RhbXBzIGZyb20gbm9uZXhpc3RlbnQgaW5kZXggZW50cmllcyAoIzMzMTU4MikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9tb3ZpZSk6CisJICBEb24ndCBHU1RfTE9HIHRpbWVzdGFtcHMgZnJvbSBub25leGlzdGVudCBpbmRleAorCSAgZW50cmllcyAoIzMzMTU4MikuCisKKzIwMDYtMDItMTcgMTc6NTQ6MDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogRml4IGludmFsaWQgbWVtb3J5IGFjY2VzcyBmb3Igc29tZSBvZGQtc2l6ZWQgaW1hZ2VzIChzZWUgaW1hZ2UgY29udGFpbmVkIGluIHF1aWNrdGltZSBzdHJlYW0gaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogKGdzdF9qcGVnX2RlY19kZWNvZGVfZGlyZWN0KSwKKwkgIChnc3RfanBlZ19kZWNfY2hhaW4pOgorCSAgRml4IGludmFsaWQgbWVtb3J5IGFjY2VzcyBmb3Igc29tZSBvZGQtc2l6ZWQgaW1hZ2VzCisJICAoc2VlIGltYWdlIGNvbnRhaW5lZCBpbiBxdWlja3RpbWUgc3RyZWFtIGluICMzMjcwODMpOworCSAgdXNlIGdfbWFsbG9jKCkgaW5zdGVhZCBvZiBnX2FsbG9jYSgpLgorCisyMDA2LTAyLTE3IDE2OjI4OjI5ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IENoZWNrIHRoYXQgdGhlIHNpemUgb2YgdGhlIHJldHVybmVkIGJ1ZmZlciBpcyBvZiB0aGUgY29ycmVjdCBzaXplIGJlY2F1c2UgdGhlIHBhcnNlciBhc3N1bWVzIHQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX3N0YXRlX2hlYWRlcik6CisJICBDaGVjayB0aGF0IHRoZSBzaXplIG9mIHRoZSByZXR1cm5lZCBidWZmZXIgaXMgb2YgdGhlIGNvcnJlY3Qgc2l6ZQorCSAgYmVjYXVzZSB0aGUgcGFyc2VyIGFzc3VtZXMgdGhhdC4KKwkgIEZpeGVzICMzMzE1NDMuCisKKzIwMDYtMDItMTcgMTU6Mzc6MzggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzogUGF0Y2ggZnJvbSBTZWJhc3RpZW4gQ290ZSwgZml4ZXMgIzMxOTg4NAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzogKGdzdF9ydHBfYW1yX2RlcGF5X2NoYWluKToKKwkgIFBhdGNoIGZyb20gU2ViYXN0aWVuIENvdGUsIGZpeGVzICMzMTk4ODQKKworMjAwNi0wMi0xNyAxMToxOTozNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2NkaW8vZ3N0Y2Rpby5jOiBJbml0IGRlYnVnIGNhdGVnb3J5ICgjMzMxMjUzKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvY2Rpby9nc3RjZGlvLmM6IChwbHVnaW5faW5pdCk6CisJICBJbml0IGRlYnVnIGNhdGVnb3J5ICgjMzMxMjUzKS4KKworMjAwNi0wMi0xNyAxMDo1MzozOCArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBleHQvZ2NvbmYvZ2NvbmYuYzoKKwkqIGV4dC9nY29uZi9nY29uZi5oOgorCSogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zaW5rLmM6CisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NpbmsuaDoKKwkqIGdjb25mL2dzdHJlYW1lci5zY2hlbWFzLmluOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgYWRkIEp1cmcncyBwYXRjaCBmb3IgbXVsdGlkZXZpY2Ugc3VwcG9ydAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgSnVyZydzIHBhdGNoIGZvciBtdWx0aWRldmljZSBzdXBwb3J0CisKKzIwMDYtMDItMTYgMjA6MzA6MTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBQYXNzIGV4dHJhX2RhdGEgdG8gZ3N0X3JpZmZfY3JlYXRlX2F1ZGlvX2NhcHMoKSwgc28gdGhhdAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKToKKwkgIFBhc3MgZXh0cmFfZGF0YSB0byBnc3RfcmlmZl9jcmVhdGVfYXVkaW9fY2FwcygpLCBzbyB0aGF0CisJICBXQVZFRk9STUFURVggc3R1ZmYgd29ya3MuIFBvc3QgYXVkaW8gY29kZWMgbmFtZSBhbmQgcG9zdAorCSAgaXQgYXMgdGFnbGlzdCBvbiB0aGUgYnVzLiBBbGxvdyB1cCB0byA4IGNoYW5uZXNsIGZvciByYXcKKwkgIFBDTSBpbiB0aGUgc291cmNlIHBhZCB0ZW1wbGF0ZSBjYXBzLgorCisyMDA2LTAyLTE2IDE2OjUzOjUyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6IEFwcGxpZWQgIzMxODY2My4gR2l2ZXMgcXVpdGUgYSBmZXcgZmFsc2UgcG9zaXRpdmVzIGluIGF1dG9zY2FuIG1vZGUsIGJ1dCBpdCdzIGJldHRlciAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6IChnc3RfbXVsdGlwYXJ0X2RlbXV4X2Jhc2VfaW5pdCksCisJICAoZ3N0X211bHRpcGFydF9kZW11eF9jbGFzc19pbml0KSwgKGdzdF9tdWx0aXBhcnRfZGVtdXhfaW5pdCksCisJICAoZ3N0X211bHRpcGFydF9kZW11eF9maW5hbGl6ZSksIChnc3RfbXVsdGlwYXJ0X2ZpbmRfcGFkX2J5X21pbWUpLAorCSAgKGdzdF9tdWx0aXBhcnRfZGVtdXhfY2hhaW4pLCAoZ3N0X211bHRpcGFydF9kZW11eF9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9tdWx0aXBhcnRfc2V0X3Byb3BlcnR5KSwgKGdzdF9tdWx0aXBhcnRfZ2V0X3Byb3BlcnR5KToKKwkgIEFwcGxpZWQgIzMxODY2My4gR2l2ZXMgcXVpdGUgYSBmZXcgZmFsc2UgcG9zaXRpdmVzIGluCisJICBhdXRvc2NhbiBtb2RlLCBidXQgaXQncyBiZXR0ZXIgdGhhbiBub3RoaW5nLiBOb3QgY2xvc2luZyB5ZXQuCisKKzIwMDYtMDItMTYgMTQ6MTM6NDggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIFVwZGF0ZSBkb2N1bWVudGF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19jbGFzc19pbml0KSwgKGdzdF91ZHBzcmNfaW5pdCksCisJICAoZ3N0X3VkcHNyY19zdGFydCk6CisJICBVcGRhdGUgZG9jdW1lbnRhdGlvbi4KKwkgIEZpeCBhcmdzLgorCisyMDA2LTAyLTE2IDE0OjAyOjU3ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IERvbid0IHN0b3AgdGhlIHRhc2sgaWYgdGhlIHBhZCBpc24ndCBsaW5rZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19ldmVudCksCisJICAoZ3N0X3F0ZGVtdXhfbG9vcCksIChxdGRlbXV4X3NpbmtfYWN0aXZhdGVfcHVsbCk6CisJICBEb24ndCBzdG9wIHRoZSB0YXNrIGlmIHRoZSBwYWQgaXNuJ3QgbGlua2VkLgorCisyMDA2LTAyLTE2IDEwOjU4OjE4ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzogSUQzIDIuMy4wIHVzZWQgc3luY2gtc2FmZSBpbnRlZ2VycyBmb3IgdGhlIHRhZyBzaXplLCBidXQgbm90IGZvciB0aGUgZnJhbWUgc2l6ZS4gKEZpeGVzICMzMzEzNjgpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzogKGlkM2RlbXV4X2lkM3YyX2ZyYW1lc190b190YWdfbGlzdCk6CisJICBJRDMgMi4zLjAgdXNlZCBzeW5jaC1zYWZlIGludGVnZXJzIGZvciB0aGUgdGFnIHNpemUsIGJ1dCBub3QgZm9yIHRoZQorCSAgZnJhbWUgc2l6ZS4gKEZpeGVzICMzMzEzNjgpCisKKzIwMDYtMDItMTYgMTA6NDI6MjUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL1JFQURNRTogVXBkYXRlZCBSRUFETUUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvUkVBRE1FOgorCSAgVXBkYXRlZCBSRUFETUUuCisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2dldF90eXBlKSwKKwkgIChnc3RfcnRzcHNyY19jbGFzc19pbml0KSwgKGdzdF9ydHNwc3JjX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0c3BzcmNfZ2V0X3Byb3BlcnR5KSwgKGdzdF9ydHNwc3JjX3N0cmVhbV9zZXR1cF9ydHApOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBNYWtlIHN1cmUgdGhlIFJUUCBwb3J0IGlzIGFuIGV2ZW4gcG9ydCBhbiB0cnkgdG8gYWxsb2NhdGUKKwkgIGFub3RoZXIgaWYgbm90LgorCSAgQWRkZWQgcmV0cnkgcHJvcGVydHkgdG8gY29udHJvbCBtYXggcmV0cmllcyBmb3IgcG9ydCBhbGxvY2F0aW9uLgorCSAgTWFrZSBzdXJlIFJUQ1AgcG9ydCBpcyBSVFAgcG9ydCsxLgorCSAgQ2xlYW51cCB3aGVuIHBvcnQgYWxsb2NhdGlvbiBmYWlscy4KKwkgIEZpeGVzICMzMTkxODMuCisKKzIwMDYtMDItMTYgMDk6MTc6NTggKzAwMDAgIFdvdXRlciBQYWVzZW4gPHdvdXRlckBrYW5nYXJvb3QubmV0PgorCisJICBnc3QvYWxwaGEvZ3N0YWxwaGEuYzogRG9uJ3QgaWdub3JlIHJldHVybiB2YWx1ZSBvZiB0aGUgcGFyZW50IGNsYXNzJ3Mgc3RhdGUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzogKGdzdF9hbHBoYV9jaGFuZ2Vfc3RhdGUpOgorCSAgRG9uJ3QgaWdub3JlIHJldHVybiB2YWx1ZSBvZiB0aGUgcGFyZW50IGNsYXNzJ3Mgc3RhdGUKKwkgIGNoYW5nZSBmdW5jdGlvbiAoIzMzMTM4NSwgcGF0Y2ggYnk6IFdvdXRlciBQYWVzZW4pLgorCisyMDA2LTAyLTE1IDEyOjE3OjI4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBBZGQgSEFMIHNvdW5kIGRldmljZSB3cmFwcGVyIHBsdWdpbnMuIENsb3NlcyAjMzI5MTA2CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGV4dC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2hhbC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2hhbC9nc3RoYWxhdWRpb3NpbmsuYzogKGdzdF9oYWxfYXVkaW9fc2lua19iYXNlX2luaXQpLAorCSAgKGdzdF9oYWxfYXVkaW9fc2lua19jbGFzc19pbml0KSwgKGdzdF9oYWxfYXVkaW9fc2lua19yZXNldCksCisJICAoZ3N0X2hhbF9hdWRpb19zaW5rX2luaXQpLCAoZ3N0X2hhbF9hdWRpb19zaW5rX2Rpc3Bvc2UpLAorCSAgKGRvX3RvZ2dsZV9lbGVtZW50KSwgKGdzdF9oYWxfYXVkaW9fc2lua19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9oYWxfYXVkaW9fc2lua19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9oYWxfYXVkaW9fc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvaGFsL2dzdGhhbGF1ZGlvc2luay5oOgorCSAgKiBleHQvaGFsL2dzdGhhbGF1ZGlvc3JjLmM6IChnc3RfaGFsX2F1ZGlvX3NyY19iYXNlX2luaXQpLAorCSAgKGdzdF9oYWxfYXVkaW9fc3JjX2NsYXNzX2luaXQpLCAoZ3N0X2hhbF9hdWRpb19zcmNfcmVzZXQpLAorCSAgKGdzdF9oYWxfYXVkaW9fc3JjX2luaXQpLCAoZ3N0X2hhbF9hdWRpb19zcmNfZGlzcG9zZSksCisJICAoZG9fdG9nZ2xlX2VsZW1lbnQpLCAoZ3N0X2hhbF9hdWRpb19zcmNfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfaGFsX2F1ZGlvX3NyY19nZXRfcHJvcGVydHkpLCAoZ3N0X2hhbF9hdWRpb19zcmNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2hhbC9nc3RoYWxhdWRpb3NyYy5oOgorCSAgKiBleHQvaGFsL2dzdGhhbGVsZW1lbnRzLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGV4dC9oYWwvZ3N0aGFsZWxlbWVudHMuaDoKKwkgICogZXh0L2hhbC9oYWwuYzogKGdzdF9oYWxfZ2V0X3N0cmluZyksCisJICAoZ3N0X2hhbF9yZW5kZXJfYmluX2Zyb21fdWRpKSwgKGdzdF9oYWxfZ2V0X2F1ZGlvX3NpbmspLAorCSAgKGdzdF9oYWxfZ2V0X2F1ZGlvX3NyYyk6CisJICAqIGV4dC9oYWwvaGFsLmg6CisJICBBZGQgSEFMIHNvdW5kIGRldmljZSB3cmFwcGVyIHBsdWdpbnMuIENsb3NlcyAjMzI5MTA2CisKKzIwMDYtMDItMTUgMTI6MTM6NDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogSXQgYXBwZWFycyAxMDAlIGVxdWFscyAxLzEgYW5kIG5vdCAxMDAvMSAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9jaGFpbik6CisJICBJdCBhcHBlYXJzIDEwMCUgZXF1YWxzIDEvMSBhbmQgbm90IDEwMC8xIC4uLgorCisyMDA2LTAyLTE1IDEwOjE1OjQ3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IEFkZCBjb21tZW50IGluIGEgZnVsdGlsZSBhdHRlbXB0IHRvIHN0b3AgdGhlIGNvcHktYW5kLXBhc3RlIHBhcmFkaWdtIGxlYWRpbmcgdG8gZHVwbGljYXRpb24gb2YuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpOgorCSAgQWRkIGNvbW1lbnQgaW4gYSBmdWx0aWxlIGF0dGVtcHQgdG8gc3RvcCB0aGUgY29weS1hbmQtcGFzdGUKKwkgIHBhcmFkaWdtIGxlYWRpbmcgdG8gZHVwbGljYXRpb24gb2YgYmFkIGNvZGUuCisJICAqIGdzdC9ydHNwL3J0c3B0cmFuc3BvcnQuYzogKHJ0c3BfdHJhbnNwb3J0X3BhcnNlKToKKwkgIE1pbWUgcGFyYW1ldGVycyBoYXZlIHRvIGJlIGNoZWNrZWQgY2FzZSBpbnNlbnNpdGl2ZQorCisyMDA2LTAyLTE1IDA5OjQ1OjI3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFdoZW4gYnVmZmVyaW5nIE1EQVQgZGF0YSwgc2hvdyB0aGUgdXNlciBzb21ldGhpbmcgaXMgaGFwcGVuaW5nIGJ5IHBvc3RpbmcgJ2J1ZmZlcmluZycgbWVzc2FnZXMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9wb3N0X2J1ZmZlcmluZyksCisJICAoZ3N0X3F0ZGVtdXhfY2hhaW4pOgorCSAgV2hlbiBidWZmZXJpbmcgTURBVCBkYXRhLCBzaG93IHRoZSB1c2VyIHNvbWV0aGluZyBpcworCSAgaGFwcGVuaW5nIGJ5IHBvc3RpbmcgJ2J1ZmZlcmluZycgbWVzc2FnZXMgb24gdGhlIGJ1cy4KKworMjAwNi0wMi0xNCAyMzoyMzowOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IEFkdmFuY2Ugc3RyZWFtIHRpbWUgZm9yIGxhZ2dpbmcgc3VidGl0bGUgc3RyZWFtcyBieSBzZW5kaW5nIG5ld3NlZ21lbnQgZXZlbnRzIHdpdGggdGhlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfc3luY19zdHJlYW1zKToKKwkgIEFkdmFuY2Ugc3RyZWFtIHRpbWUgZm9yIGxhZ2dpbmcgc3VidGl0bGUgc3RyZWFtcyBieSBzZW5kaW5nCisJICBuZXdzZWdtZW50IGV2ZW50cyB3aXRoIHRoZSB1cGRhdGUgZmxhZyBzZXQuCisKKzIwMDYtMDItMTQgMTg6NTA6MTMgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguKjogTWFrZSBwdXNoLWJhc2VkIHdvcmsgaWYgbWRhdCBhdG9tIGlzIGJlZm9yZSBtb292IGF0b20uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfaW5pdCksCisJICAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksIChnc3RfcXRkZW11eF9jaGFuZ2Vfc3RhdGUpLAorCSAgKG5leHRfZW50cnlfc2l6ZSksIChnc3RfcXRkZW11eF9jaGFpbik6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguaDoKKwkgIE1ha2UgcHVzaC1iYXNlZCB3b3JrIGlmIG1kYXQgYXRvbSBpcyBiZWZvcmUgbW9vdiBhdG9tLgorCSAgRG9uJ3QgYW5zd2VyIGR1cmF0aW9uIHF1ZXJ5LiBUaGlzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBpbnRvIHJlcGx5aW5nCisJICBGQUxTRSB0byBzZWVrIGV2ZW50cy4KKworMjAwNi0wMi0xNCAxNjo1ODozMCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBUaGVyZSBjYW4gYmUgYm9ndXMgZGF0YSBiZWZvcmUgdGhlIGhkcmwgTElTVCB0YWcgaW4gdGhlIFJJRkYgaGVhZGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlcik6CisJICBUaGVyZSBjYW4gYmUgYm9ndXMgZGF0YSBiZWZvcmUgdGhlIGhkcmwgTElTVCB0YWcgaW4gdGhlIFJJRkYgaGVhZGVyLgorCSAgSXQncyBoYXJkIHRvIHNheSBpZiBpdCdzIG5vdCByZXNwZWN0aW5nIHRoZSBBVkkgc3BlY2lmaWNhdGlvbnMgb3Igbm90LAorCSAgYnV0IHNpbmNlIEdvb2dsZSBWaWRlbyBpcyBwcm9kdWNpbmcgQVZJcyBsaWtlIHRoYXQgYW5kIHRoZSBvdGhlciBwbGF5ZXIKKwkgIGRvbid0IHNlZW0gdG8gY29tcGxhaW4sIEkgZ3Vlc3Mgd2Ugc2hvdWxkIGRvIHRoZSBzYW1lLgorCisyMDA2LTAyLTE0IDExOjI0OjUzICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBkYXRhIGF0b21zIGFyZSBiZWZvcmUgbW9vdiBhdG9tcyBpbiBwdXNoLWJhc2VkIG1vZGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAobmV4dF9lbnRyeV9zaXplKSwgKGdzdF9xdGRlbXV4X2NoYWluKToKKwkgIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBkYXRhIGF0b21zIGFyZSBiZWZvcmUgbW9vdiBhdG9tcyBpbiBwdXNoLWJhc2VkIG1vZGUuCisJICBFcnJvcnMgb3V0IGdyYWNlZnVsbHkuCisKKzIwMDYtMDItMTMgMjI6MDQ6NDIgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4LzogUXREZW11eCBjYW4gbm93IHdvcmsgcHVzaC1iYXNlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfaW5pdCksCisJICAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQpLCAoZ3N0X3F0ZGVtdXhfY2hhbmdlX3N0YXRlKSwKKwkgIChleHRyYWN0X2luaXRpYWxfbGVuZ3RoX2FuZF9mb3VyY2MpLAorCSAgKGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfaGVhZGVyKSwgKGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfbW92aWUpLAorCSAgKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwgKG5leHRfZW50cnlfc2l6ZSksIChnc3RfcXRkZW11eF9jaGFpbiksCisJICAocXRkZW11eF9zaW5rX2FjdGl2YXRlKSwgKHF0ZGVtdXhfc2lua19hY3RpdmF0ZV9wdWxsKSwKKwkgIChxdGRlbXV4X3NpbmtfYWN0aXZhdGVfcHVzaCksIChxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJICBRdERlbXV4IGNhbiBub3cgd29yayBwdXNoLWJhc2VkLgorCSAgSXQgc3RpbGwgbmVlZHMgc29tZSBsb3ZlIGZvciBzZWVraW5nLgorCisyMDA2LTAyLTEzIDEyOjAwOjUxICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IEFkZCBtb3JlIHZhbGlkYXRpb24gdG8gZW5zdXJlIHRoYXQgYSBjaGFyIGVuY29kaW5nIGNvbnZlcnNpb24gcHJvZHVjZWQgYSB2YWxpZCBVVEYtOCBzdHJpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IChwYXJzZV9pbnNlcnRfc3RyaW5nX2ZpZWxkKSwKKwkgIChwYXJzZV9zcGxpdF9zdHJpbmdzKToKKwkgIEFkZCBtb3JlIHZhbGlkYXRpb24gdG8gZW5zdXJlIHRoYXQgYSBjaGFyIGVuY29kaW5nIGNvbnZlcnNpb24KKwkgIHByb2R1Y2VkIGEgdmFsaWQgVVRGLTggc3RyaW5nLgorCisyMDA2LTAyLTEzIDEwOjQzOjE1ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IFByb3Blcmx5IGhhbmRsZSBlbmQgb2Ygc2VnbWVudC4gQ2xvc2VzICMzMzA4ODUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJldmlld2VkIGJ5OiBFZHdhcmQgSGVydmV5ICA8ZWR3YXJkQGZsdWVuZG8uY29tPgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSk6CisJICBQcm9wZXJseSBoYW5kbGUgZW5kIG9mIHNlZ21lbnQuIENsb3NlcyAjMzMwODg1LgorCisyMDA2LTAyLTEzIDEwOjM2OjIzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuaDogRm9yIGdvdCB0byBjb21taXQgdGhpcyBvbmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRncGF5Lmg6CisJICBGb3IgZ290IHRvIGNvbW1pdCB0aGlzIG9uZS4KKworMjAwNi0wMi0xMiAxODo1OTozNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBtcDRncGF5Lio6IE1ha2UgbW9yZSB0aGluZ3Mgd29yay4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzogKGdzdF9ydHBfbXA0Z19wYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9tcDRnX3BheV9pbml0KSwgKGdzdF9ydHBfbXA0Z19wYXlfcGFyc2VfYXVkaW9fY29uZmlnKSwKKwkgIChnc3RfcnRwX21wNGdfcGF5X3BhcnNlX3ZpZGVvX2NvbmZpZyksIChnc3RfcnRwX21wNGdfcGF5X25ld19jYXBzKSwKKwkgIChnc3RfcnRwX21wNGdfcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9tcDRnX3BheV9mbHVzaCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5oOgorCSAgTWFrZSBtb3JlIHRoaW5ncyB3b3JrLgorCSAgSGFuZGxlIEFDQyBjb25maWcgc3RyaW5ncy4KKworMjAwNi0wMi0xMiAxMzoxMDoyMCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6IHNldCB0aW1lc3RhbXBzIGlmIG5vIGluY29taW5nIHRpbWVzdGFtcHMgc2V0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzogKGdzdF9ydHBfYW1yX3BheV9oYW5kbGVfYnVmZmVyKToKKwkgIHNldCB0aW1lc3RhbXBzIGlmIG5vIGluY29taW5nIHRpbWVzdGFtcHMgc2V0CisKKzIwMDYtMDItMTEgMTM6NTQ6MjYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9hcGV0YWcvZ3N0dGFnZGVtdXguYzogLi4uIGFuZCBmaXggdGhlIHZlcnkgc2FtZSBsZWFrcyBpbiBHc3RUYWdEZW11eC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXBldGFnL2dzdHRhZ2RlbXV4LmM6IChnc3RfdGFnX2RlbXV4X2dldF91cHN0cmVhbV9zaXplKSwKKwkgIChnc3RfdGFnX2RlbXV4X2RvX3R5cGVmaW5kKToKKwkgIC4uLiBhbmQgZml4IHRoZSB2ZXJ5IHNhbWUgbGVha3MgaW4gR3N0VGFnRGVtdXguCisKKzIwMDYtMDItMTEgMTM6MzU6MTMgKzAwMDAgIEpvbiBUcm93YnJpZGdlIDx0cm93QHhpbWlhbi5jb20+CisKKwkgIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAoaWQzZGVtdXhfZ2V0X3Vwc3RyZWFtX3NpemUpLAorCSAgKGdzdF9pZDNkZW11eF9kb190eXBlZmluZCk6CisJICBGaXggYSBjb3VwbGUgb2YgbWVtIGxlYWtzLiAoUGF0Y2ggYnkgSm9uYXRoYW4gTWF0dGhldworCSAgPGpvbmF0aGFuIGF0IGthb2xpbiBkb3Qgd2g5IGRvdCBuZXQ+KQorCisyMDA2LTAyLTEwIDE3OjM3OjM5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzogRmlyc3Qgc2V0IG9wdGlvbnMsIHRoZW4gc2V0IGNhcHMgb3IgZWxzZSB0aGUgYmFzZWNsYXNzIHdpbGwgbm90IGtub3cgYWJvdXQgdGhlIG9wdGlvbnMsIGR1aC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzogKGdzdF9ydHBfbXA0dl9wYXlfc2V0Y2Fwcyk6CisJICBGaXJzdCBzZXQgb3B0aW9ucywgdGhlbiBzZXQgY2FwcyBvciBlbHNlIHRoZSBiYXNlY2xhc3MKKwkgIHdpbGwgbm90IGtub3cgYWJvdXQgdGhlIG9wdGlvbnMsIGR1aC4KKworMjAwNi0wMi0xMCAxNzoxNjo1NSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6IERvbid0IHdhc3RlIHRpbWUgbG9va2luZyBmb3IgYSBjb25maWcgc3RyaW5nIGlmIHdlIGhhdmUgY29kZWNfaW5mbyBvbiB0aGUgaW5jb21taW5nIGNhcHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6IChnc3RfcnRwX21wNHZfcGF5X2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfbXA0dl9wYXlfc2V0Y2Fwcyk6CisJICBEb24ndCB3YXN0ZSB0aW1lIGxvb2tpbmcgZm9yIGEgY29uZmlnIHN0cmluZyBpZiB3ZSBoYXZlIGNvZGVjX2luZm8KKwkgIG9uIHRoZSBpbmNvbW1pbmcgY2Fwcy4KKworMjAwNi0wMi0xMCAxNjo0MDo1OCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9SRUFETUU6IFNheSBzb21ldGhpbmcgYWJvdXQgY2FzZS1zZW5zaXRpdml0eSBvZiBjYXBzIHZzIG1pbWUtYXR0cmlidXRlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL1JFQURNRToKKwkgIFNheSBzb21ldGhpbmcgYWJvdXQgY2FzZS1zZW5zaXRpdml0eSBvZiBjYXBzIHZzIG1pbWUtYXR0cmlidXRlcy4KKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzogKGdzdF9ydHBfYW1yX3BheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX2Ftcl9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOiAoZ3N0X3J0cF9tcDRnX3BheV9nZXRfdHlwZSksCisJICAoZ3N0X3J0cF9tcDRnX3BheV9iYXNlX2luaXQpLCAoZ3N0X3J0cF9tcDRnX3BheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX21wNGdfcGF5X2luaXQpLCAoZ3N0X3J0cF9tcDRnX3BheV9maW5hbGl6ZSksCisJICAoZ3N0X3J0cF9tcDRnX3BheV9uZXdfY2FwcyksIChnc3RfcnRwX21wNGdfcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfbXA0Z19wYXlfZmx1c2gpLCAoZ3N0X3J0cF9tcDRnX3BheV9oYW5kbGVfYnVmZmVyKSwKKwkgIChnc3RfcnRwX21wNGdfcGF5X3NldF9wcm9wZXJ0eSksIChnc3RfcnRwX21wNGdfcGF5X2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9tcDRnX3BheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5oOgorCSAgQWRkZWQgYmVnaW5uaW5ncyBvZiBtcGVnNC1nZW5lcmljIHBheWxvYWRlciAoUkZDIDM2NDApCisKKzIwMDYtMDItMDkgMTQ6MjA6MTQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwLzogUmVzdXJlY3RlZCBydHBkZWMgdG8gbWFrZSBydHNwc3JjIGhhcHB5IGFnYWluLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuYzogKGdzdF9ydHBkZWNfZ2V0X3R5cGUpLAorCSAgKGdzdF9ydHBkZWNfY2xhc3NfaW5pdCksIChnc3RfcnRwZGVjX2luaXQpLCAoZ3N0X3J0cGRlY19nZXRjYXBzKSwKKwkgIChnc3RfcnRwZGVjX2NoYWluX3J0cCksIChnc3RfcnRwZGVjX2NoYWluX3J0Y3ApLAorCSAgKGdzdF9ydHBkZWNfc2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBkZWNfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHNwL2dzdHJ0cGRlYy5oOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KToKKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKHJlYWRfYm9keSksCisJICAocnRzcF9jb25uZWN0aW9uX3JlY2VpdmUpOgorCSAgKiBnc3QvcnRzcC9ydHNwbWVzc2FnZS5jOiAocnRzcF9tZXNzYWdlX2R1bXApOgorCSAgUmVzdXJlY3RlZCBydHBkZWMgdG8gbWFrZSBydHNwc3JjIGhhcHB5IGFnYWluLgorCSAgU2tpcCBhdHRyaWJ1dGVzIGZyb20gdGhlIHNlc3Npb24gaWQuCisJICBEb24ndCBjcmFzaCB3aGVuIGR1bXBpbmcgYSBtZXNzYWdlIHdpdGggYW4gZW1wdHkgYm9keS4KKworMjAwNi0wMi0wOSAxNDoxNDowNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOiBBZGRlZCBtb3JlIG1lYW5pbmdmdWxsIHdhcm5pbmdzIHdoZW4gc29tZXRoaW5nIGdvZXMgd3JvbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOiAoZ3N0X3J0cF9hbXJfZGVwYXlfY2hhaW4pOgorCSAgQWRkZWQgbW9yZSBtZWFuaW5nZnVsbCB3YXJuaW5ncyB3aGVuIHNvbWV0aGluZyBnb2VzIHdyb25nLgorCSAgQ2xlYXIgRiBiaXQgb24gb3V0Z29pbmcgQU1SIHBhY2tldHMuCisJICAqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6IChnc3RfcnRwX2Ftcl9wYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9hbXJfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgQWRkZWQgZGVidWdnaW5nIGNhdGVnb3J5CisJICBTdXBwb3J0IHBheWxvYWRpbmcgb2YgbXVsdGlwbGUgQU1SIGZyYW1lcy4KKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6IChnc3RfcnRwX21wNHZfcGF5X2RlcGF5X2RhdGEpOgorCSAgQWRkZWQgc29tZSBkZWJ1Z2dpbmcuCisKKzIwMDYtMDItMDkgMTE6MjU6NDIgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBjb25maWd1cmUuYWM6IEJhY2sgdG8gQ1ZTCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBDVlMKKworPT09IHJlbGVhc2UgMC4xMC4yID09PQorCisyMDA2LTAyLTA5IDExOjIyOjM4ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Rpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkgIFJlbGVhc2luZyAwLjEwLjIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUmVsZWFzaW5nIDAuMTAuMgorCisyMDA2LTAyLTA4IDE3OjM1OjA1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDA2LTAyLTA4IDE3OjE4OjIwICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSAgT29wcywganVtcGluZyB0aGUgZ3VuIHdpdGggdGhlIENoYW5nZUxvZyBlbnRyeQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBPb3BzLCBqdW1waW5nIHRoZSBndW4gd2l0aCB0aGUgQ2hhbmdlTG9nIGVudHJ5CisKKzIwMDYtMDItMDggMTc6MTY6NDYgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBjb25maWd1cmUuYWM6IEJ1bXAgY29yZSBhbmQgcGx1Z2lucy1iYXNlIHJlcXVpcmVtZW50IHRvIDAuMTAuMi4yIGZvciBBUEkgYWRkaXRpb25zIChhbmQgMSBtaWdyYXRpb24gb2YgZ3N0X2Jpbl9maW5kX3UuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBCdW1wIGNvcmUgYW5kIHBsdWdpbnMtYmFzZSByZXF1aXJlbWVudCB0byAwLjEwLjIuMgorCSAgZm9yIEFQSSBhZGRpdGlvbnMgKGFuZCAxIG1pZ3JhdGlvbiBvZiBnc3RfYmluX2ZpbmRfdW5jb25uZWN0ZWRfcGFkKQorCisyMDA2LTAyLTA4IDE3OjEyOjQwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvOiBSZWdpc3RlciBtdXNpY2JyYWlueiB0YWdzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWMuYzogKHBsdWdpbl9pbml0KToKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4LmM6IChwbHVnaW5faW5pdCk6CisJICBSZWdpc3RlciBtdXNpY2JyYWlueiB0YWdzLgorCisyMDA2LTAyLTA3IDE4OjMxOjMxICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcmVtb3ZlIHVudXNlZCB2YXIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmVtb3ZlIHVudXNlZCB2YXIKKworMjAwNi0wMi0wNyAxODowMToxNyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogdXNlIHRoZSBjb3JyZWN0IHZhcmlhYmxlIHRvIGNoZWNrIGlmIHdlIGNhbiBjYWxjdWxhdGUgdGhlIGxhc3QgY2h1bmsuICBMb29rcyBsaWtlIGFuIG9idmlvdXMgYi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwKKwkgIChxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgdXNlIHRoZSBjb3JyZWN0IHZhcmlhYmxlIHRvIGNoZWNrIGlmIHdlIGNhbiBjYWxjdWxhdGUKKwkgIHRoZSBsYXN0IGNodW5rLiAgTG9va3MgbGlrZSBhbiBvYnZpb3VzIGJ1ZywgYW5kIG1ha2VzCisJICB0aGUgZHVtcCBvZiBvZmZzZXRzIGNvbXBhcmFibGUgdG8gb3RoZXIgdG9vbHMKKworMjAwNi0wMi0wNyAxNzo1NDo0MiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogY2xlYW4gdXAgc29tZSBkZWJ1Z2dpbmcsIHVzaW5nIF9PQkpFQ1QsIG1vdmluZyByZWN1cnJpbmcgbWVzc2FnZXMgdG8gTE9HIGxldmVsCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfbG9vcF9oZWFkZXIpLAorCSAgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBjbGVhbiB1cCBzb21lIGRlYnVnZ2luZywgdXNpbmcgX09CSkVDVCwgbW92aW5nIHJlY3VycmluZworCSAgbWVzc2FnZXMgdG8gTE9HIGxldmVsCisKKzIwMDYtMDItMDcgMTY6MjM6MzMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9nY29uZi9nY29uZi5oOiBSZW1vdmUgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb24gdGhhdCBubyBsb25nZXIgZXhpc3RzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nY29uZi9nY29uZi5oOgorCSAgUmVtb3ZlIGRlY2xhcmF0aW9uIG9mIGZ1bmN0aW9uIHRoYXQgbm8gbG9uZ2VyIGV4aXN0cy4KKworMjAwNi0wMi0wNyAxMzozOTowOCArMDAwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSAgZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzogTWFrZSBzaG91dDIgd29yayBmb3Igbm9uIG9nZyBzdHJlYW1zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDItMDcgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKwkgICogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzogKGdzdF9zaG91dDJzZW5kX3JlbmRlciksCisJICAoZ3N0X3Nob3V0MnNlbmRfc2V0Y2FwcyksIChnc3Rfc2hvdXQyc2VuZF9jaGFuZ2Vfc3RhdGUpOgorCSAgTWFrZSBzaG91dDIgd29yayBmb3Igbm9uIG9nZyBzdHJlYW1zCisKKzIwMDYtMDItMDYgMTc6MjY6NDMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLio6IFVwZGF0ZWQgZG9jcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19jbGFzc19pbml0KSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX3JlbmRlciksIChnc3RfbXVsdGl1ZHBzaW5rX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X211bHRpdWRwc2lua19pbml0X3NlbmQpLCAoZ3N0X211bHRpdWRwc2lua19hZGQpLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfcmVtb3ZlKSwgKGdzdF9tdWx0aXVkcHNpbmtfY2xlYXIpLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3N0YXRzKSwgKGdzdF9tdWx0aXVkcHNpbmtfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaDoKKwkgIFVwZGF0ZWQgZG9jcy4KKwkgIEFkZGVkIHByb3BlcnRpZXMgYnl0ZXMtc2VydmVkLCBieXRlc190b19zZXJ2ZS4KKwkgIFBvc3QgcHJvcGVyIGVycm9yIG1lc3NhZ2VzLAorCSAgRW1pdCBjbGllbnQgYWRkZWQgc2lnbmFsIHRvby4KKworMjAwNi0wMi0wNiAxNTo0MToyNSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC4qOiBTb21lIFFUIGRlbXV4IGxvdmluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwKKwkgIChnc3RfcXRkZW11eF9oYW5kbGVfc3JjX2V2ZW50KSwgKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwKKwkgIChxdGRlbXV4X2luZmxhdGUpLCAocXRkZW11eF9wYXJzZSksIChxdGRlbXV4X3BhcnNlX3RyYWspLAorCSAgKHF0ZGVtdXhfcGFyc2VfdWR0YSksIChxdGRlbXV4X3RhZ19hZGRfc3RyKSwgKHF0ZGVtdXhfdGFnX2FkZF9udW0pLAorCSAgKHF0ZGVtdXhfdGFnX2FkZF9nbnJlKSwgKGdzdF9xdGRlbXV4X2hhbmRsZV9lc2RzKSwKKwkgIChxdGRlbXV4X3ZpZGVvX2NhcHMpLCAocXRkZW11eF9hdWRpb19jYXBzKToKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSAgU29tZSBRVCBkZW11eCBsb3ZpbmcuCisJICBIYW5kbGUgc2Vla2luZyBpbiBhIGxlc3MgYnJva2VuIHdheS4KKwkgIEZpeCBBTVIgY2FwcyB0byBtYXRjaCB0aGUgQU1SIGRlY29kZXIuCisJICBTZXQgZmlyc3QgdGltZXN0YW1wIG9uIEFNUiBzYW1wbGVzIHRvIDAgZm9yIG5vdy4KKwkgIFJlbW92ZSBzb21lIFxuIGluIERFQlVHIHN0cmluZ3MuCisJICBVc2UgX3NjYWxlX2ludCBmb3IgbWF4aW11bSBwcmVjaXNpb24uCisKKzIwMDYtMDItMDYgMTU6MzE6MTYgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBjb21tb246CisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIGFkZGluZyBkb2NzIGZvciBtdWx0aXVkcHNpbmsKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkaW5nIGRvY3MgZm9yIG11bHRpdWRwc2luaworCisyMDA2LTAyLTA2IDE1OjI4OjU2ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgZ3N0L2xldmVsL2dzdGxldmVsLmM6IHBlYWsgYmVsb3cgZGVjYXkgaXMgbm90IG5lY2Vzc2FyaWx5IGFuIGVycm9yLCBzbyBkb24ndCBFUlJPUiBsb2cKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogKGdzdF9sZXZlbF90cmFuc2Zvcm1faXApOgorCSAgcGVhayBiZWxvdyBkZWNheSBpcyBub3QgbmVjZXNzYXJpbHkgYW4gZXJyb3IsIHNvIGRvbid0IEVSUk9SIGxvZworCisyMDA2LTAyLTA2IDE1OjI3OjA2ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSAgY3ZzIHZlcnNpb25zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGN2cyB2ZXJzaW9ucworCisyMDA2LTAyLTA2IDE0OjI1OjM0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS4qOiBNYWtlIHN1cmUgd2Ugc2VuZCBhIG5ld3NlZ21lbnQgZXZlbnQgaW4gQllURVMgZm9ybWF0IGJlZm9yZSBzZW5kaW5nIGJ1ZmZlcnMgKCMzMjg1MzEpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6IChnc3RfZWJtbF93cml0ZV9yZXNldCksCisJICAoZ3N0X2VibWxfd3JpdGVfZmx1c2hfY2FjaGUpLCAoZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9wdXNoKSwKKwkgIChnc3RfZWJtbF93cml0ZV9zZWVrKToKKwkgICogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuaDoKKwkgIE1ha2Ugc3VyZSB3ZSBzZW5kIGEgbmV3c2VnbWVudCBldmVudCBpbiBCWVRFUyBmb3JtYXQKKwkgIGJlZm9yZSBzZW5kaW5nIGJ1ZmZlcnMgKCMzMjg1MzEpLgorCisyMDA2LTAyLTA2IDEyOjE4OjQ1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBQYXNzIHVuaGFuZGxlZCBxdWVyaWVzIHVwc3RyZWFtIGluc3RlYWQgb2YganVzdCBkcm9wcGluZyB0aGVtICgjMzI2NDQ2KS4gVXBkYXRlIHF1ZXJ5IHR5cGUgYXJyYXlzIGhlcmUgYW5kIHRoZXJlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9kdi9nc3RkdmRlbXV4LmM6IChnc3RfZHZkZW11eF9zcmNfcXVlcnkpLAorCSAgKGdzdF9kdmRlbXV4X3NpbmtfcXVlcnkpOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19kZWNfc3JjX3F1ZXJ5KToKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IChzcGVleF9nZXRfcXVlcnlfdHlwZXMpLAorCSAgKHNwZWV4X2RlY19zcmNfcXVlcnkpOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleGVuY19zcmNfcXVlcnkpLAorCSAgKGdzdF9zcGVleGVuY19zaW5rX3F1ZXJ5KToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2dldF9zcmNfcXVlcnlfdHlwZXMpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KToKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfZ2V0X3F1ZXJ5X3R5cGVzKSwKKwkgIChnc3Rfd2F2cGFyc2VfcGFkX3F1ZXJ5KToKKwkgIFBhc3MgdW5oYW5kbGVkIHF1ZXJpZXMgdXBzdHJlYW0gaW5zdGVhZCBvZiBqdXN0IGRyb3BwaW5nCisJICB0aGVtICgjMzI2NDQ2KS4gVXBkYXRlIHF1ZXJ5IHR5cGUgYXJyYXlzIGhlcmUgYW5kIHRoZXJlLgorCisyMDA2LTAyLTA2IDExOjU3OjUyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jOiBDb2xsZWN0cGFkcyBpbiBjb3JlIGdvdCBjaGFuZ2VkIGFuZCBub3cgYWxzbyBob2xkcyBhIHJlZmVyZW5jZSB0byBhbnkgcGFkIHRoYXQgaXMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jOiAoc2V0dXBfc3JjX3BhZCk6CisJICBDb2xsZWN0cGFkcyBpbiBjb3JlIGdvdCBjaGFuZ2VkIGFuZCBub3cgYWxzbyBob2xkcyBhCisJICByZWZlcmVuY2UgdG8gYW55IHBhZCB0aGF0IGlzIHBhcnQgb2YgaXQuIEZpeCByZWZjb3VudAorCSAgY2hlY2tzIGluIHRlc3QgY2FzZSBhY2NvcmRpbmdseS4KKworMjAwNi0wMi0wNiAxMTo0MTo0MyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5oOiBGaXggaW5jbHVkZSwgZm9yIG5vdyBHc3RUYWdEZW11eCBpcyBpbiB0aGUgYXBldGFnIGRpci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4Lmg6CisJICBGaXggaW5jbHVkZSwgZm9yIG5vdyBHc3RUYWdEZW11eCBpcyBpbiB0aGUgYXBldGFnIGRpci4KKworMjAwNi0wMi0wNiAxMTozNDoyMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogQWRkIGNkaW8gcGx1Z2luIHRvIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jZGlvLnhtbDoKKwkgIEFkZCBjZGlvIHBsdWdpbiB0byBkb2NzLgorCSAgKiBleHQvY2Rpby9nc3RjZGlvY2RkYXNyYy5jOgorCSAgQWRkIGd0ay1kb2MgYmx1cmIuCisJICAqIGV4dC9jZGlvL2dzdGNkaW8uYzoKKwkgIFRoZSBwbHVnaW4gaXMgY2FsbGVkICdjZGlvJyBub3QgJ2NkZGlvJy4KKworMjAwNi0wMi0wNiAxMDo1NjowNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgQWRkIEFQRSB0YWcgZGVtdXhlciAoIzMyNTY0OSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSAgKiBnc3QvYXBldGFnL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6CisJICAqIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguaDoKKwkgICogZ3N0L2FwZXRhZy9nc3R0YWdkZW11eC5jOgorCSAgKiBnc3QvYXBldGFnL2dzdHRhZ2RlbXV4Lmg6CisJICBBZGQgQVBFIHRhZyBkZW11eGVyICgjMzI1NjQ5KS4KKworMjAwNi0wMi0wNSAyMjoyMjo1NiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGV4dC9nY29uZi86IElnbm9yZSBjaGFuZ2luZyB0aGUgR0NvbmYga2V5IHRvICIiLiBJZ25vcmUgR0NvbmYga2V5IHVwZGF0ZXMgdGhhdCBkb24ndCBhY3R1YWxseSBjaGFuZ2UgdGhlIHN0cmluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZ2NvbmYvZ2NvbmYuYzogKGdzdF9nY29uZl9nZXRfZGVmYXVsdF9hdWRpb19zaW5rKSwKKwkgIChnc3RfZ2NvbmZfZ2V0X2RlZmF1bHRfdmlkZW9fc2luayksCisJICAoZ3N0X2djb25mX2dldF9kZWZhdWx0X2F1ZGlvX3NyYyksCisJICAoZ3N0X2djb25mX2dldF9kZWZhdWx0X3ZpZGVvX3NyYyk6CisJICAqIGV4dC9nY29uZi9nY29uZi5oOgorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NpbmsuYzogKGdzdF9nY29uZl9hdWRpb19zaW5rX3Jlc2V0KSwKKwkgIChnc3RfZ2NvbmZfYXVkaW9fc2lua19pbml0KSwgKGdzdF9nY29uZl9hdWRpb19zaW5rX2Rpc3Bvc2UpLAorCSAgKGRvX3RvZ2dsZV9lbGVtZW50KToKKwkgICogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zaW5rLmg6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc3JjLmM6IChnc3RfZ2NvbmZfYXVkaW9fc3JjX3Jlc2V0KSwKKwkgIChnc3RfZ2NvbmZfYXVkaW9fc3JjX2luaXQpLCAoZ3N0X2djb25mX2F1ZGlvX3NyY19kaXNwb3NlKSwKKwkgIChkb190b2dnbGVfZWxlbWVudCk6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc3JjLmg6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc2luay5jOiAoZ3N0X2djb25mX3ZpZGVvX3NpbmtfcmVzZXQpLAorCSAgKGdzdF9nY29uZl92aWRlb19zaW5rX2luaXQpLCAoZ3N0X2djb25mX3ZpZGVvX3NpbmtfZGlzcG9zZSksCisJICAoZG9fdG9nZ2xlX2VsZW1lbnQpOgorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NpbmsuaDoKKwkgICogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zcmMuYzogKGdzdF9nY29uZl92aWRlb19zcmNfcmVzZXQpLAorCSAgKGdzdF9nY29uZl92aWRlb19zcmNfaW5pdCksIChnc3RfZ2NvbmZfdmlkZW9fc3JjX2Rpc3Bvc2UpLAorCSAgKGRvX3RvZ2dsZV9lbGVtZW50KToKKwkgICogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zcmMuaDoKKwkgIElnbm9yZSBjaGFuZ2luZyB0aGUgR0NvbmYga2V5IHRvICIiLiBJZ25vcmUgR0NvbmYga2V5IHVwZGF0ZXMKKwkgIHRoYXQgZG9uJ3QgYWN0dWFsbHkgY2hhbmdlIHRoZSBzdHJpbmcuCisJICBGb3Igbm93LCBpZ25vcmUgdGhlIEdDb25mIGtleSB3aGVuIHRoZSBzdGF0ZSBpcyA+IFJFQURZLCBhcworCSAgaXQgYnJlYWtzIHN0cmVhbWluZy4gU29tZXRpbWUgaXQgd2lsbCBiZSBuaWNlIHRvIGJyaW5nIHRoZQorCSAgbmV3IHNpbmsgb25saW5lIGV2ZW4gbWlkLXN0cmVhbSwgYnkgc2VuZGluZyBORVdTRUdNRU5UIGluZm8KKwkgIGFuZCBwb3NzaWJseSBwcmVyb2xsaW5nLgorCSAgKEZpeGVzICMzMjY3MzYpCisKKzIwMDYtMDItMDUgMjA6NDM6NDkgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvZ29vbS86IE1ha2UgZ29vbSByZWVudHJhbnQgYnkgbW92aW5nIGFsbCBpbXBvcnRhbnQgc3RhdGljIHZhcmlhYmxlcyBpbnRvIGluc3RhbmNlIHN0cnVjdHVyZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vZmlsdGVycy5jOiAoem9vbUZpbHRlck5ldyksIChjYWxjdWxhdGVQWGFuZFBZKSwKKwkgIChzZXRQaXhlbFJHQiksIChzZXRQaXhlbFJHQl8pLCAoZ2V0UGl4ZWxSR0IpLCAoZ2V0UGl4ZWxSR0JfKSwKKwkgICh6b29tRmlsdGVyU2V0UmVzb2x1dGlvbiksICh6b29tRmlsdGVyRGVzdHJveSksCisJICAoem9vbUZpbHRlckZhc3RSR0IpLCAocG9pbnRGaWx0ZXIpOgorCSAgKiBnc3QvZ29vbS9maWx0ZXJzLmg6CisJICAqIGdzdC9nb29tL2dvb21fY29yZS5jOiAoZ29vbV9pbml0KSwgKGdvb21fc2V0X3Jlc29sdXRpb24pLAorCSAgKGdvb21fdXBkYXRlKSwgKGdvb21fY2xvc2UpOgorCSAgKiBnc3QvZ29vbS9nb29tX2NvcmUuaDoKKwkgICogZ3N0L2dvb20vZ29vbV90b29scy5oOgorCSAgKiBnc3QvZ29vbS9ncmFwaGljLmM6CisJICAqIGdzdC9nb29tL2dzdGdvb20uYzogKGdzdF9nb29tX2NsYXNzX2luaXQpLCAoZ3N0X2dvb21faW5pdCksCisJICAoZ3N0X2dvb21fZGlzcG9zZSksIChnc3RfZ29vbV9zcmNfc2V0Y2FwcyksIChnc3RfZ29vbV9jaGFpbik6CisJICAqIGdzdC9nb29tL2dzdGdvb20uaDoKKwkgICogZ3N0L2dvb20vbGluZXMuYzogKGdvb21fbGluZXMpOgorCSAgKiBnc3QvZ29vbS9saW5lcy5oOgorCSAgTWFrZSBnb29tIHJlZW50cmFudCBieSBtb3ZpbmcgYWxsIGltcG9ydGFudCBzdGF0aWMgdmFyaWFibGVzCisJICBpbnRvIGluc3RhbmNlIHN0cnVjdHVyZXMuCisJICAoRml4ZXMgIzMyOTE4MSkKKworMjAwNi0wMi0wNCAxNTo0MTo0MyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC4qOiBUaGlyZCBhdHRlbXB0LCB1c2UgZ3N0X3BhZF9pc19saW5rZWQoKSB0aGlzIHRpbWUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0pLAorCSAgKGdzdF9hdmlfZGVtdXhfYWxsX3NvdXJjZV9wYWRzX3VubGlua2VkKSwKKwkgIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSk6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIFRoaXJkIGF0dGVtcHQsIHVzZSBnc3RfcGFkX2lzX2xpbmtlZCgpIHRoaXMgdGltZS4KKworMjAwNi0wMi0wNCAxMzozMDoxMiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiBBZGp1c3QgZm9yIGRhdGEgbGVuZ3RoIGluZGljYXRvcnMgd2hlbiBwYXJzaW5nIChGaXhlcyAjMzI5ODEwKQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiAoaWQzZGVtdXhfaWQzdjJfcGFyc2VfZnJhbWUpLAorCSAgKHBhcnNlX3NwbGl0X3N0cmluZ3MpOgorCSAgQWRqdXN0IGZvciBkYXRhIGxlbmd0aCBpbmRpY2F0b3JzIHdoZW4gcGFyc2luZyAoRml4ZXMgIzMyOTgxMCkKKwkgIEZpeCBzdHVwaWQgYnVnIHBhcnNpbmcgVVRGLTggdGFnIHRleHQuCisJICBPdXRwdXQgdGFnIHN0cmluZ3Mgd2l0aCBtdWx0aXBsZSBmaWVsZHMgYXMgbXVsdGlwbGUgdGFncywgc28gdGhlCisJICBhcHAgZ2V0cyBhbGwgdGhlIGRhdGEuCisKKzIwMDYtMDItMDMgMjA6MDU6MjAgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogQ2hhbmdlTG9nOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgRml4ZWQgYSBidWcgYWRkIGluIGxhc3QgY29tbWl0LCB3aGVyZSBubyBldmVudCBpcyBzZW5kLiBUaGFua3MgVGltIHRvIHNob3cgbWUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEZpeGVkIGEgYnVnIGFkZCBpbiBsYXN0IGNvbW1pdCwgd2hlcmUgbm8gZXZlbnQgaXMgc2VuZC4gVGhhbmtzIFRpbSB0byBzaG93IG1lLgorCisyMDA2LTAyLTAzIDE4OjA3OjM1ICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIENoYW5nZUxvZzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkgIEp1c3QgbWFrZSBpdCBjb21waWxlIHdpdGggLS1kaXNhYmxlLWdzdC1kZWJ1Zy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgSnVzdCBtYWtlIGl0IGNvbXBpbGUgd2l0aCAtLWRpc2FibGUtZ3N0LWRlYnVnLgorCisyMDA2LTAyLTAzIDE2OjU1OjQyICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIHVwZGF0ZSBzcGVjIGZpbGUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdXBkYXRlIHNwZWMgZmlsZQorCisyMDA2LTAyLTAzIDEzOjA2OjI0ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IE5ldmVyIG91dHB1dCBhIHRhZyB3aXRoIGEgbnVsbCBjb250ZW50cyBzdHJpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IChwYXJzZV90ZXh0X2lkZW50aWZpY2F0aW9uX2ZyYW1lKSwKKwkgIChpZDN2Ml90YWdfdG9fdGFnbGlzdCksIChpZDN2Ml9nZW5yZV9zdHJpbmdfdG9fdGFnbGlzdCksCisJICAoaWQzdjJfZ2VucmVfZmllbGRzX3RvX3RhZ2xpc3QpOgorCSAgTmV2ZXIgb3V0cHV0IGEgdGFnIHdpdGggYSBudWxsIGNvbnRlbnRzIHN0cmluZy4KKworMjAwNi0wMi0wMiAyMTowMDoxNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBPbmx5IHBhdXNlIGlmIGFsbCBwYWRzIGFyZSB1bmxpbmtlZCBBTkQgd2UndmUgdHJpZWQgdG8gc2VuZCBkYXRhIG9uIGFsbCBvZiB0aGVtIGF0IGxlYXN0IG9uY2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9hbGxfc291cmNlX3BhZHNfdW5saW5rZWQpOgorCSAgT25seSBwYXVzZSBpZiBhbGwgcGFkcyBhcmUgdW5saW5rZWQgQU5EIHdlJ3ZlIHRyaWVkIHRvIHNlbmQgZGF0YQorCSAgb24gYWxsIG9mIHRoZW0gYXQgbGVhc3Qgb25jZS4KKworMjAwNi0wMi0wMiAxMjoyOToyNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBNYWtlIGxvb3AgZnVuY3Rpb24vdGFzayBwYXVzZSBpdHNlbGYgd2hlbiBhbGwgc291cmNlIHBhZHMgYXJlIHVubGlua2VkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfYWxsX3NvdXJjZV9wYWRzX3VubGlua2VkKSwKKwkgIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSksIChnc3RfYXZpX2RlbXV4X2xvb3ApOgorCSAgTWFrZSBsb29wIGZ1bmN0aW9uL3Rhc2sgcGF1c2UgaXRzZWxmIHdoZW4gYWxsIHNvdXJjZSBwYWRzIGFyZQorCSAgdW5saW5rZWQuCisKKzIwMDYtMDItMDIgMTA6NDc6MTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIFVzZSBuZXcgZnVuY3Rpb25zIGZyb20gY29yZSB0byByZW5kZXIgYSBiaW4gZnJvbSBhIHN0cmluZy4gRml4ZXMgYnVpbGQuIFVwIHJlcXVpcmVtZW50cyB0byBjb3JlIENWUy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGV4dC9nY29uZi9nY29uZi5jOiAoZ3N0X2djb25mX3JlbmRlcl9iaW5fZnJvbV9rZXkpOgorCSAgVXNlIG5ldyBmdW5jdGlvbnMgZnJvbSBjb3JlIHRvIHJlbmRlciBhIGJpbiBmcm9tIGEKKwkgIHN0cmluZy4gRml4ZXMgYnVpbGQuIFVwIHJlcXVpcmVtZW50cyB0byBjb3JlIENWUy4KKworMjAwNi0wMi0wMSAxMTowMTowNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiBEb24ndCBwdXNoIGJ1ZmZlcnMgaW50byB0aGUgYWRhcHRlciB0aGF0IHdlIGFyZSBnb2luZyB0byBwdXNoIGRvd25zdHJlYW0gYWdhaW4gd2l0aG91dCBmcmFtLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiAoZ3N0X2F1X3BhcnNlX2NoYWluKToKKwkgIERvbid0IHB1c2ggYnVmZmVycyBpbnRvIHRoZSBhZGFwdGVyIHRoYXQgd2UgYXJlIGdvaW5nIHRvCisJICBwdXNoIGRvd25zdHJlYW0gYWdhaW4gd2l0aG91dCBmcmFtaW5nIGFueXdheS4gQWxzbywgdGhlCisJICBhZGFwdG9yIHRha2VzIG93bmVyc2hpcCBvZiBidWZmZXJzIHB1dCBpbnRvIGl0IChmaXhlcworCSAgYXVwYXJzZSBwdXNoaW5nIGludmFsaWQgYnVmZmVycyBmb3IgLmF1IGZpbGVzIHdpdGgKKwkgIEFEUENNIGNvbnRlbnRzKS4gRmluYWxseSwgc2V0IGNhcHMgb24gYWxsIG91dGdvaW5nIGJ1ZmZlcnMuCisKKzIwMDYtMDEtMzAgMjM6MTM6MDUgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvaWQzZGVtdXgvOiBTb21lb25lIHNob3VsZCBraWNrIG15IGJ1dHQuIFJlbW92ZSBJRDN2MSB0YWdzIGZyb20gdGhlIGVuZCBvZiB0aGUgZmlsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzogKGdzdF9pZDNkZW11eF9jaGFpbiksCisJICAoZ3N0X2lkM2RlbXV4X3JlYWRfaWQzdjEpLCAoZ3N0X2lkM2RlbXV4X3NpbmtfYWN0aXZhdGUpLAorCSAgKGdzdF9pZDNkZW11eF9zZW5kX3RhZ19ldmVudCk6CisJICAqIGdzdC9pZDNkZW11eC9pZDN0YWdzLmM6IChpZDNkZW11eF9yZWFkX2lkM3YxX3RhZyk6CisJICBTb21lb25lIHNob3VsZCBraWNrIG15IGJ1dHQuIFJlbW92ZSBJRDN2MSB0YWdzIGZyb20gdGhlIGVuZCBvZiB0aGUKKwkgIGZpbGUuCisJICBJbXByb3ZlIGVycm9yIG1lc3NhZ2VzLiBTZW5kIHRoZSBUQUcgbWVzc2FnZSBhcyBzb29uIGFzIHdlIGNvbXBsZXRlCisJICB0eXBlZmluZGluZywgaW5zdGVhZCBvZiB3YWl0aW5nIHVudGlsIHdlIHNlbmQgdGhlIGZpcnN0IGJ1ZmZlci4KKwkgIERvd25zdHJlYW0gdGFnIGV2ZW50IGlzIHN0aWxsIHNlbnQgYmVmb3JlIHRoZSBmaXJzdCBidWZmZXIuCisKKzIwMDYtMDEtMjkgMjA6MDc6NDkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogQWRkIGRlYnVnIGNhdGVnb3J5LCB1c2UgYm9pbGVycGxhdGUgbWFjcm9zLCBmaXggaGFuZGxpbmcgb2Ygd2lkdGhzIG9mIDMyIGJpdHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX3NldGNhcHMpLAorCSAgKGdzdF93YXZwYWNrX2RlY19iYXNlX2luaXQpLCAoZ3N0X3dhdnBhY2tfZGVjX2Rpc3Bvc2UpLAorCSAgKGdzdF93YXZwYWNrX2RlY19jbGFzc19pbml0KSwgKGdzdF93YXZwYWNrX2RlY19zaW5rX2V2ZW50KSwKKwkgIChnc3Rfd2F2cGFja19kZWNfaW5pdCksIChnc3Rfd2F2cGFja19kZWNfZm9ybWF0X3NhbXBsZXMpLAorCSAgKGdzdF93YXZwYWNrX2RlY19jaGFpbiksIChnc3Rfd2F2cGFja19kZWNfcGx1Z2luX2luaXQpOgorCSAgQWRkIGRlYnVnIGNhdGVnb3J5LCB1c2UgYm9pbGVycGxhdGUgbWFjcm9zLCBmaXggaGFuZGxpbmcKKwkgIG9mIHdpZHRocyBvZiAzMiBiaXRzLgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogKGdzdF93YXZwYWNrX3BhcnNlX2Jhc2VfaW5pdCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfZGlzcG9zZSksIChnc3Rfd2F2cGFja19wYXJzZV9jbGFzc19pbml0KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9pbmRleF9nZXRfbGFzdF9lbnRyeSksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfaW5kZXhfZ2V0X2VudHJ5X2Zyb21fc2FtcGxlKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9pbmRleF9hcHBlbmRfZW50cnkpLCAoZ3N0X3dhdnBhY2tfcGFyc2VfcmVzZXQpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX3NyY19xdWVyeSksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2Vfc2Nhbl90b19maW5kX3NhbXBsZSksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2Vfc2VuZF9uZXdzZWdtZW50KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9oYW5kbGVfc2Vla19ldmVudCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2Vfc3JjX2V2ZW50KSwgKGdzdF93YXZwYWNrX3BhcnNlX2luaXQpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2dldF91cHN0cmVhbV9sZW5ndGgpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX3B1bGxfYnVmZmVyKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9jcmVhdGVfc3JjX3BhZCksIChnc3Rfd2F2cGFja19wYXJzZV9sb29wKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF93YXZlcGFja19wYXJzZV9zaW5rX2FjdGl2YXRlKSwKKwkgIChnc3Rfd2F2ZXBhY2tfcGFyc2Vfc2lua19hY3RpdmF0ZV9wdWxsKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9wbHVnaW5faW5pdCk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5oOgorCSAgUmV3cml0ZSBhIGJpdCwgbW9zdGx5IHRvIGZpeCBmbG93IGxvZ2ljIGFuZCB0byBtYWtlIHNlZWtpbmcgd29yay4KKwkgIEZpeCBidWZmZXIvZXZlbnQgcmVmY291bnRpbmcuIEFkZCBzb21lIGRlYnVnIHN0YXRlbWVudHMuIEFkZAorCSAgd2lkdGggb2YgMzIgdG8gc291cmNlIHBhZCB0ZW1wbGF0ZSBjYXBzLiBVc2UgYm9pbGVycGxhdGUgbWFjcm9zLgorCisyMDA2LTAxLTI3IDEyOjE3OjU2ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIGV4dC9kdi86IENhbGwgZHZfc2V0X2Vycm9yX2xvZyAoZHZfZGVjb2Rlcl90ICosIE5VTEwpOyBhZnRlciBkdl9kZWNvZGVyX25ldyB0byBub3QgaGF2ZSB3YXJpbmdzIGZsb29kaW5nIHN0ZGVyci4gdGhpcy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAxLTI3ICBKYW4gR2VyYmVyICA8akBib290bGFiLm9yZz4KKwkgIFJldmlld2VkIGJ5OiBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisJICAqIGV4dC9kdi9nc3RkdmRlYy5jIChnc3RfZHZkZWNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYyAoZ3N0X2R2ZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgIENhbGwgZHZfc2V0X2Vycm9yX2xvZyAoZHZfZGVjb2Rlcl90ICosIE5VTEwpOyBhZnRlciBkdl9kZWNvZGVyX25ldworCSAgdG8gbm90IGhhdmUgd2FyaW5ncyBmbG9vZGluZyBzdGRlcnIuIHRoaXMgaXMgdGhlIHN1Z2dlc3RlZCB3YXkKKwkgIGFsc28gdXNlZCBpbiBkdmdyYWIgYW5kIGtpbm8uICgjMzI4MzM2KQorCisyMDA2LTAxLTI3IDAxOjQzOjA3ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgc3lzL29zcy9nc3Rvc3NzaW5rLmM6IEZyZWUgdGhlIGRldmljZSBuYW1lIHN0cmluZyB3aGVuIGZpbmFsaXNlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3Nfc2lua19jbGFzc19pbml0KSwKKwkgIChnc3Rfb3NzX3NpbmtfaW5pdCksIChnc3Rfb3NzX3NpbmtfZmluYWxpc2UpOgorCSAgRnJlZSB0aGUgZGV2aWNlIG5hbWUgc3RyaW5nIHdoZW4gZmluYWxpc2VkLgorCisyMDA2LTAxLTI2IDE2OjIzOjQyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEZpeCB3cm9uZyBtZW1jcHkgc291cmNlIHBvaW50ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIEZpeCB3cm9uZyBtZW1jcHkgc291cmNlIHBvaW50ZXIuCisKKzIwMDYtMDEtMjUgMjI6MDU6MjggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiBEb24ndCBwdXQgZnVuY3Rpb24gY2FsbHMgaW4gZ19yZXR1cm5faWZfZmFpbCgpIHN0YXRlbWVudHMsIG9yIHRoZXknbGwgYmUgcmVwbGFjZWQgd2l0aCBOTy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAoZ3N0X2lkM2RlbXV4X3JlbW92ZV9zcmNwYWQpOgorCSAgRG9uJ3QgcHV0IGZ1bmN0aW9uIGNhbGxzIGluIGdfcmV0dXJuX2lmX2ZhaWwoKSBzdGF0ZW1lbnRzLAorCSAgb3IgdGhleSdsbCBiZSByZXBsYWNlZCB3aXRoIE5PT1BzIGlmIHNvbWVvbmUgY29tcGlsZXMgd2l0aAorCSAgR19ESVNBQkxFX0NIRUNLUyBkZWZpbmVkLgorCisyMDA2LTAxLTI1IDIwOjMzOjA1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSAgY2hhbmdlbG9nIHN1cmdlcnkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgY2hhbmdlbG9nIHN1cmdlcnkKKworMjAwNi0wMS0yNSAxODoyMzowNSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiBOZXZlciB0cnVzdCBBTlkgaW5mb3JtYXRpb24gZW5jb2RlZCBpbiBhIG1lZGlhIGZpbGUsIGVzcGVjaWFsbHkgd2hlbiBpdCdzIGdpdmluZyB5b3Ugc2l6ZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiAoaWQzZGVtdXhfaWQzdjJfcGFyc2VfZnJhbWUpOgorCSAgTmV2ZXIgdHJ1c3QgQU5ZIGluZm9ybWF0aW9uIGVuY29kZWQgaW4gYSBtZWRpYSBmaWxlLCBlc3BlY2lhbGx5CisJICB3aGVuIGl0J3MgZ2l2aW5nIHlvdSBzaXplcy4gKEZpeGVzICMzMjg0NTIpCisKKzIwMDYtMDEtMjQgMTg6MDM6NDYgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L3J0cC9nc3RydHBnNzExcGF5LmM6CisJICBJJ20gdG9vIGxhenkgdG8gY29tbWVudCB0aGlzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIHdyaXR0ZW4gYnkgS2FpIFZlaG1hbmVuIDxrYWkudmVobWFuZW5Abm9raWEuY29tPiBhcHBsaWVkLiBTZWUgYnVnICMzMjUxNDguCisKKzIwMDYtMDEtMjQgMTE6NTg6NTMgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogTW9yZSBjb2hlcmVudCBmcmFtZXJhdGUgc2V0dGluZyBvbiBjYXBzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwKKwkgIChnc3RfcXRkZW11eF9hZGRfc3RyZWFtKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBNb3JlIGNvaGVyZW50IGZyYW1lcmF0ZSBzZXR0aW5nIG9uIGNhcHMuCisJICBJZiBzYW1wbGVfc2l6ZSBpcyBhdmFpbGFibGUsIHVzZSB0aGF0IGZvciB0aGUgc2FtcGxlcycgZHVyYXRpb24gaW4KKwkgIHRoZSBpbmRleC4gVGhpcyBlbmFibGVzIHNpbmdsZSBmcmFtZSBzdHJlYW1zIHRvIHdvcmsgKGFuZCBJIGltYWdpbmUKKwkgIGZpeGVzIHNvbWUgb3RoZXIgY2FzZXMpLgorCSAgVGVzdGVkIG9uIHRlc3RzdWl0ZSwgbm8gcmVncmVzc2lvbi4KKworMjAwNi0wMS0yMyAxODozOTozMSArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L21hdHJvc2thLzogQWRkZWQgcmVjb2duaXRpb24gb2YgUmVhbCBBdWRpbyBhbmQgVmlkZW8gc3RyZWFtcyBpbiBtYXRyb3NrYSBkZW11eGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X3ZpZGVvX2NhcHMpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9hdWRpb19jYXBzKSwgKGdzdF9tYXRyb3NrYV9kZW11eF9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIEFkZGVkIHJlY29nbml0aW9uIG9mIFJlYWwgQXVkaW8gYW5kIFZpZGVvIHN0cmVhbXMgaW4gbWF0cm9za2EgZGVtdXhlci4KKworMjAwNi0wMS0yMyAxNToxMDo1NSArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGRlZCBjb2RlYyByZWNvZ25pdGlvbiBmb3I6IF8gVlAzMSA6IHZpZGVvL3gtdnAzIF8gQVZESiA6IGltYWdlL2pwZWcgXyBkdmNwLCBkdmMgIDogdmlkZW8veC1kLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKSwKKwkgIChxdGRlbXV4X3ZpZGVvX2NhcHMpLCAocXRkZW11eF9hdWRpb19jYXBzKToKKwkgIEFkZGVkIGNvZGVjIHJlY29nbml0aW9uIGZvcjoKKwkgIF8gVlAzMSA6IHZpZGVvL3gtdnAzCisJICBfIEFWREogOiBpbWFnZS9qcGVnCisJICBfIGR2Y3AsIGR2YyAgOiB2aWRlby94LWR2LCBzeXN0ZW1zdHJlYW09KGJvb2xlYW4pZmFsc2UKKwkgIF8gMHg2ZDczMDAxNyA6IGF1ZGlvL3gtYWRwY20sIGxheW91dD0oc3RyaW5nKXF1aWNrdGltZQorCisyMDA2LTAxLTIzIDE0OjMyOjQ3ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IFJlbW92ZSBlcnJhbnQgYnJlYWsgc3RhdGVtZW50LCBhbmQgZml4IGNvbXBpbGF0aW9uIHdpdGggb2xkZXIgR0NDLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiAoaWQzdjJfdGFnX3RvX3RhZ2xpc3QpOgorCSAgUmVtb3ZlIGVycmFudCBicmVhayBzdGF0ZW1lbnQsIGFuZCBmaXggY29tcGlsYXRpb24gd2l0aAorCSAgb2xkZXIgR0NDLgorCisyMDA2LTAxLTIzIDEyOjA0OjEyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSAgTWVudGlvbiB0aGF0IG15IGxhc3QgY29tbWl0IGZpeGVzICMzMjgyNDEKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgTWVudGlvbiB0aGF0IG15IGxhc3QgY29tbWl0IGZpeGVzICMzMjgyNDEKKworMjAwNi0wMS0yMyAxMTowNjozNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgc3lzL3N1bmF1ZGlvLzogRXhwb3J0IGZ1bmN0aW9ucyB0aGF0IGFyZSBuZWVkZWQgaW4gb3RoZXIgcGFydHMgb2YgdGhlIGNvZGUsIG1ha2VzIHRoZSBtaXhlciBhY3R1YWxseSB3b3JrOyBhZGp1c3QgbWFnLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJldmlld2VkIGJ5OiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyY3RybC5jOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmM6IChnc3Rfc3VuYXVkaW9zaW5rX2luaXQpOgorCSAgRXhwb3J0IGZ1bmN0aW9ucyB0aGF0IGFyZSBuZWVkZWQgaW4gb3RoZXIgcGFydHMgb2YgdGhlIGNvZGUsCisJICBtYWtlcyB0aGUgbWl4ZXIgYWN0dWFsbHkgd29yazsgYWRqdXN0IG1hZ2ljIG1pbmltdW0gYnVmZmVyLXRpbWUKKwkgIHZhbHVlIGZyb20gM21zIHRvIDVtcyB0byB3b3JrIGFyb3VuZCBzdHV0dGVyaW5nIGR1cmluZyBtcDMKKwkgIHBsYXliYWNrICgjMzI3NzY1KS4KKworMjAwNi0wMS0yMyAxMDo0NDowMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBGaXggcG9zc2libGUgZGVhZGxvY2sgaW4gbWF0cm9za2EgbXV4ZXIgKCMzMjc4MjUpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBSZXZpZXdlZCBieTogVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChnc3RfbWF0cm9za2FfbXV4X2Jlc3RfcGFkKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3dyaXRlX2RhdGEpLCAoZ3N0X21hdHJvc2thX211eF9jb2xsZWN0ZWQpOgorCSAgRml4IHBvc3NpYmxlIGRlYWRsb2NrIGluIG1hdHJvc2thIG11eGVyICgjMzI3ODI1KS4KKworMjAwNi0wMS0yMyAwOTo1OTowMyArMDAwMCAgSmVucyBHcmFuc2V1ZXIgPGplbnNnckBnbXgubmV0PgorCisJICBDODkgZml4ZXM6IGRlY2xhcmUgdmFyaWFibGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBibG9jayBhbmQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiAoZ3N0X3BuZ2VuY19jaGFpbik6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaW52ZXJ0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYzogKGdzdF9ydHBfbXA0dl9kZXBheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0c3Avc2RwbWVzc2FnZS5oOgorCSAgKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzogKGdzdF9keW51ZHBzaW5rX3JlbmRlcik6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChnc3RfbXVsdGl1ZHBzaW5rX2dldF9zdGF0cyk6CisJICBDODkgZml4ZXM6IGRlY2xhcmUgdmFyaWFibGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBibG9jayBhbmQKKwkgIG1ha2UgZ2NjLTIuOXggaGFwcHkgKCMzMjgyNjQ7IHBhdGNoIGJ5OiBKZW5zIEdyYW5zZXVlcgorCSAgPGplbnNnciBhdCBnbXggZG90IG5ldD4pLgorCisyMDA2LTAxLTIzIDA5OjIyOjE3ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4LzogUmV3cml0ZSBwYXJzaW5nIG9mIHRleHQgdGFncyB0byBoYW5kbGUgbXVsdGlwbGUgTlVMTCB0ZXJtaW5hdGVkIHN0cmluZ3MuIFBhcnNlIG51bWVyaWMgZ2VucmUgc3RyaW5ncyBhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzogKGlkM2RlbXV4X3JlYWRfaWQzdjJfdGFnKToKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuaDoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IChpZDNkZW11eF9pZDN2Ml9wYXJzZV9mcmFtZSksCisJICAocGFyc2VfY29tbWVudF9mcmFtZSksIChwYXJzZV90ZXh0X2lkZW50aWZpY2F0aW9uX2ZyYW1lKSwKKwkgIChpZDN2Ml90YWdfdG9fdGFnbGlzdCksIChpZDN2Ml9hcmVfZGlnaXRzKSwKKwkgIChpZDN2Ml9nZW5yZV9zdHJpbmdfdG9fdGFnbGlzdCksIChpZDN2Ml9nZW5yZV9maWVsZHNfdG9fdGFnbGlzdCksCisJICAocGFyc2Vfc3BsaXRfc3RyaW5ncyksIChmcmVlX3RhZ19zdHJpbmdzKToKKwkgIFJld3JpdGUgcGFyc2luZyBvZiB0ZXh0IHRhZ3MgdG8gaGFuZGxlIG11bHRpcGxlIE5VTEwgdGVybWluYXRlZAorCSAgc3RyaW5ncy4gUGFyc2UgbnVtZXJpYyBnZW5yZSBzdHJpbmdzIGFuZCBJRDN2MiB0eXBlCisJICAiKDMpKDYpQWx0ZXJuYXRpdmUiIHN0eWxlIGdlbnJlIHN0cmluZ3MuCisJICBQYXJzZSBkYXRlcyB0aGF0IGFyZSBvbmx5IFlZWVkgb3IgWVlZWS1tbSBmb3JtYXQuCisKKzIwMDYtMDEtMjEgMTE6NDM6NTMgKzAwMDAgIEZhYnJpemlvIDxmYWJyaXppby5nZUB0aXNjYWxpLml0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6ICd0d29zJyBhbmQgJ3Nvd3QnIGZvdXJjYyBjYW4gYmUgMTZiaXQgb3IgOGJpdCBhdWRpby4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlX3RyYWspLAorCSAgKHF0ZGVtdXhfYXVkaW9fY2Fwcyk6CisJICAndHdvcycgYW5kICdzb3d0JyBmb3VyY2MgY2FuIGJlIDE2Yml0IG9yIDhiaXQgYXVkaW8uCisJICBGaXggOGJpdCBjYXNlICgjMzI3MTMzLCBiYXNlZCBvbiBwYXRjaCBieTogRmFicml6aW8KKwkgIEdlbm5hcmkgPGZhYnJpemlvIGRvdCBnZSBhdCB0aXNjYWxpIGRvdCBpdD4pLgorCSAgQWxzbywgIkdfTElUVExFX0VORElBTiIgYW5kICJHX0JJR19FTkRJQU4iIGFyZSBub3QKKwkgIHZhbGlkIGxpdGVyYWxzIGZvciBlbmRpYW5uZXNzIGluIGNhcHMgc3RyaW5ncywKKwkgIG9ubHkgIkxJVFRMRV9FTkRJQU4iIGFuZCAiQklHX0VORElBTiIgYXJlIHZhbGlkLgorCisyMDA2LTAxLTIwIDE1OjA2OjI4ICswMDAwICBDaHJpc3RvcGggQnVyZ2hhcmR0IDxoYXdrZXNAd2ViLmRlPgorCisJICBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogRG9uJ3QgZm9yZ2V0IHRvIGluaXRpYWxpemUgbGlib2lsLCBvdGhlcndpc2Ugb3VyIG9pbCBmdW5jdGlvbnMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogKGdzdF92aWRlb19ib3hfY2xhc3NfaW5pdCk6CisJICBEb24ndCBmb3JnZXQgdG8gaW5pdGlhbGl6ZSBsaWJvaWwsIG90aGVyd2lzZSBvdXIgb2lsIGZ1bmN0aW9ucworCSAgd2lsbCBjcmFzaCAoZml4ZXMgIzMyNzg3MTsgcGF0Y2ggYnk6IENocmlzdG9waCBCdXJnaGFyZHQKKwkgIDxoYXdrZXMgYXQgd2ViIGRvdCBkZT4pLgorCisyMDA2LTAxLTE5IDIxOjQ2OjMyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBDaGFuZ2VMb2c6CisJICBDaGFuZ2VMb2cgc3VyZ2VyeSAobGFzdCBlbnRyeSBtYXkgaGF2ZSBiZWVuIHNsaWdodGx5IG1pc2xlYWRpbmcpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIENoYW5nZUxvZyBzdXJnZXJ5IChsYXN0IGVudHJ5IG1heSBoYXZlIGJlZW4gc2xpZ2h0bHkgbWlzbGVhZGluZykKKworMjAwNi0wMS0xOSAyMTowMDo1MCArMDAwMCAgQnJpYW4gQ2FtZXJvbiA8YnJpYW4uY2FtZXJvbkBzdW4uY29tPgorCisJICBjb25maWd1cmUuYWM6IGp1c3QgbGlrZSBpbiB0aGUgY29yZSBhbmQgZ3N0LXBsdWdpbnMtYmFzZS4gRml4ZXMgYnVpbGQgb24gU29sYXJpcyAoZml4ZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBVc2UgcGxhaW4gQVNfTElCVE9PTF9UQUdTIGluc3RlYWQgb2YgQVNfTElCVE9PTF9UQUdTKFtDWFhdKSwganVzdAorCSAgbGlrZSBpbiB0aGUgY29yZSBhbmQgZ3N0LXBsdWdpbnMtYmFzZS4gRml4ZXMgYnVpbGQgb24gU29sYXJpcyAoZml4ZXMKKwkgICMzMjY2ODM7IHBhdGNoIGJ5OiBCcmlhbiBDYW1lcm9uIDxicmlhbiBkb3QgY2FtZXJvbiBhdCBzdW4gZG90IGNvbT4pCisKKzIwMDYtMDEtMTkgMDA6MTA6NTEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9jZGlvLzogRml4IGJ1aWxkIGZvciBsaWJjZGlvIHZlcnNpb25zID49IDc2OyBnaXZlIHNsaWdodGx5IGxvd2VyIHJhbmsgdGhhbiBjZHBhcmFub2lhLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9jZGlvL2dzdGNkaW8uYzogKGdzdF9jZGlvX2FkZF9jZHRleHRfZmllbGQpLCAocGx1Z2luX2luaXQpOgorCSAgKiBleHQvY2Rpby9nc3RjZGlvLmg6CisJICAqIGV4dC9jZGlvL2dzdGNkaW9jZGRhc3JjLmM6IChnc3RfY2Rpb19jZGRhX3NyY19nZXRfY2R0ZXh0KToKKwkgIEZpeCBidWlsZCBmb3IgbGliY2RpbyB2ZXJzaW9ucyA+PSA3NjsgZ2l2ZSBzbGlnaHRseSBsb3dlciByYW5rCisJICB0aGFuIGNkcGFyYW5vaWEuCisKKzIwMDYtMDEtMTggMTk6MzA6MzYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIFBvcnQgbGliY2RpbyBjZGRhIHNvdXJjZSwgZm9ybWVybHkga25vd24gYXMgY2RkYXNyYywgbm93IGtub3duIGFzIGNkaW9jZGRhc3JjIChmaXhlcyAjMzIzMzI3KS4gU2hvdWxkIGFsc28gcmVhZCBDRC1URS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZXh0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvY2Rpby9NYWtlZmlsZS5hbToKKwkgICogZXh0L2NkaW8vZ3N0Y2Rpby5jOgorCSAgKiBleHQvY2Rpby9nc3RjZGlvLmg6CisJICAqIGV4dC9jZGlvL2dzdGNkaW9jZGRhc3JjLmM6CisJICAqIGV4dC9jZGlvL2dzdGNkaW9jZGRhc3JjLmg6CisJICBQb3J0IGxpYmNkaW8gY2RkYSBzb3VyY2UsIGZvcm1lcmx5IGtub3duIGFzIGNkZGFzcmMsIG5vdyBrbm93biBhcworCSAgY2Rpb2NkZGFzcmMgKGZpeGVzICMzMjMzMjcpLiBTaG91bGQgYWxzbyByZWFkIENELVRFWFQgaWYgYXZhaWxhYmxlLAorCSAgYnV0IHRoYXQncyBub3QgdGVzdGVkIChmaXhlcyAjMzE3NjU4KS4KKworMjAwNi0wMS0xOCAxOTowODowOCArMDAwMCAgVG9tbWkgTXnDtmjDpG5lbiA8ZXh0LXRvbW1pLm15b2hhbmVuQG5va2lhLmNvbT4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IEZpeCBjb252ZXJzaW9uIGZyb20gVElNRSB0byBCWVRFUyBmb3JtYXQgKGZpeGVzICMzMjY4NjQ7CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcGFkX2NvbnZlcnQpOgorCSAgRml4IGNvbnZlcnNpb24gZnJvbSBUSU1FIHRvIEJZVEVTIGZvcm1hdCAoZml4ZXMgIzMyNjg2NDsKKwkgIHBhdGNoIGJ5OiBUb21taSBNecO2aMOkbmVuIDxleHQtdG9tbWkgZG90IG15b2hhbmVuIGF0IG5va2lhIGRvdCBjb20+KQorCisyMDA2LTAxLTE4IDE4OjU0OjAyICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIFJvbmFsZCdzIHBhdGNoIGFwcGxpZWQuIHNlZSBidWcgIzMyNjMxOC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUm9uYWxkJ3MgcGF0Y2ggYXBwbGllZC4gc2VlIGJ1ZyAjMzI2MzE4LgorCisyMDA2LTAxLTE3IDE2OjQ1OjQzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4Lio6IEZpeCBzZWVraW5nIGZvciBxdWlja3RpbWUgZmlsZXMuIENvdWxkIHN0aWxsIHVzZSBzb21lIG1vcmUgbG92ZSBhbmQgc29waGlzdGljYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfaW5pdCksCisJICAoZ3N0X3F0ZGVtdXhfc2VuZF9ldmVudCksIChnc3RfcXRkZW11eF9oYW5kbGVfc3JjX2V2ZW50KSwKKwkgIChnc3RfcXRkZW11eF9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3F0ZGVtdXhfbG9vcF9oZWFkZXIpOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJICBGaXggc2Vla2luZyBmb3IgcXVpY2t0aW1lIGZpbGVzLiBDb3VsZCBzdGlsbCB1c2Ugc29tZSBtb3JlCisJICBsb3ZlIGFuZCBzb3BoaXN0aWNhdGlvbi4KKworMjAwNi0wMS0xNiAxMDoyMzo0NyArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICB1cGRhdGUgd2l0aCBsb3ZlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHVwZGF0ZSB3aXRoIGxvdmUKKworMjAwNi0wMS0xNSAyMDoyMTo0OCArMDAwMCAgU2VyZ2V5IFNjb2JpY2ggPHNlcmdleS5zY29iaWNoQGdtYWlsLmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IEZpeCBjb21waWxhdGlvbiBvZiBpZDNkZW11eCB3aGVuIHpsaWIgaXMgbm90IHByZXNlbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IChpZDNkZW11eF9pZDN2Ml9wYXJzZV9mcmFtZSk6CisJICBGaXggY29tcGlsYXRpb24gb2YgaWQzZGVtdXggd2hlbiB6bGliIGlzIG5vdCBwcmVzZW50LgorCSAgKEZpeGVzICMzMjY2MDI7IHBhdGNoIGJ5OiBTZXJnZXkgU2NvYmljaCkKKworMjAwNi0wMS0xNSAxNDoxMjoxMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2VzZC9NYWtlZmlsZS5hbTogb3RoZXJ3aXNlIGJ1aWxkIHdpbGwgZmFpbCBmb3IgZm9sa3Mgd2l0aCBsaWJlc2QgaW4gYSBub24tc3RhbmRhcmQgcHJlZml4ICgjMzI3MDA5KS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZXNkL01ha2VmaWxlLmFtOgorCSAgQWRkICQoRVNEX0NGTEFHUyksIG90aGVyd2lzZSBidWlsZCB3aWxsIGZhaWwgZm9yIGZvbGtzCisJICB3aXRoIGxpYmVzZCBpbiBhIG5vbi1zdGFuZGFyZCBwcmVmaXggKCMzMjcwMDkpLgorCisyMDA2LTAxLTEzIDE5OjI5OjI3ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogY29uZmlndXJlLmFjOgorCSAgYmFjayB0byBoZWFkCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGJhY2sgdG8gaGVhZAorCisyMDA2LTAxLTEzIDE5OjI1OjQwICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3VwbG9hZC5tYWs6CisJICByZWxlYXNpbmcgMC4xMC4xCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbGVhc2luZyAwLjEwLjEKKworMjAwNi0wMS0xMyAxODozNzoxMyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L2pwZWcvZ3N0c21va2VlbmMuYzogZml4IG1lbWxlYWsuICBGaXhlcyAjMzI2NjE4CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHBhdGNoIGJ5OiBXaW0gVGF5bWFucworCSAgKiBleHQvanBlZy9nc3RzbW9rZWVuYy5jOiAoZ3N0X3Ntb2tlZW5jX2NoYWluKToKKwkgIGZpeCBtZW1sZWFrLiAgRml4ZXMgIzMyNjYxOAorCisyMDA2LTAxLTEzIDE4OjM1OjAwICswMDAwICBNaWtlIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiBGaXggbWVtbGVhay4gIEZpeGVzICMzMjY2MTIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wMS0xMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKwkgIHBhdGNoIGJ5OiBNaWtlIFNtaXRoCisJICAqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiAoZ3N0X2xldmVsX21lc3NhZ2VfbmV3KSwKKwkgIChnc3RfbGV2ZWxfbWVzc2FnZV9hcHBlbmRfY2hhbm5lbCk6CisJICBGaXggbWVtbGVhay4gIEZpeGVzICMzMjY2MTIKKworMjAwNi0wMS0xMSAxMTozOToxMCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGNvbmZpZ3VyZS5hYzogcHJlcmVsZWFzaW5nCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgcHJlcmVsZWFzaW5nCisJICAqIHBvL2FmLnBvOgorCSAgKiBwby9hei5wbzoKKwkgICogcG8vY3MucG86CisJICAqIHBvL2VuX0dCLnBvOgorCSAgKiBwby9odS5wbzoKKwkgICogcG8vaXQucG86CisJICAqIHBvL25iLnBvOgorCSAgKiBwby9ubC5wbzoKKwkgICogcG8vb3IucG86CisJICAqIHBvL3NxLnBvOgorCSAgKiBwby9zci5wbzoKKwkgICogcG8vc3YucG86CisJICAqIHBvL3VrLnBvOgorCSAgKiBwby92aS5wbzoKKwkgIHVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAwNi0wMS0xMSAxMTowNDowMyArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGQgc3VwcG9ydCBmb3IgSW5kZW8zIHZpZGVvIGluIFF1aWNrdGltZSBmaWxlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmV2aWV3ZWQgYnk6IEVkd2FyZCBIZXJ2ZXkgIDxlZHdhcmRAZmx1ZW5kby5jb20+CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6CisJICBBZGQgc3VwcG9ydCBmb3IgSW5kZW8zIHZpZGVvIGluIFF1aWNrdGltZSBmaWxlcy4KKwkgIENsb3NlcyAjMzI2NTI0CisKKzIwMDYtMDEtMTAgMTI6Mzg6NTkgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZ3N0L2xldmVsL2dzdGxldmVsLmM6IERvbid0IGxlYWsgZmlsdGVyIGFycmF5cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogKGdzdF9sZXZlbF9jbGFzc19pbml0KSwKKwkgIChnc3RfbGV2ZWxfZGlzcG9zZSk6CisJICBEb24ndCBsZWFrIGZpbHRlciBhcnJheXMuCisKKzIwMDYtMDEtMDkgMTc6MDQ6NTIgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3VwbG9hZC5tYWs6CisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJKiBzeXMvTWFrZWZpbGUuYW06CisJKiBzeXMvc3VuYXVkaW8vTWFrZWZpbGUuYW06CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW8uYzoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlci5oOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuaDoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVydHJhY2suYzoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVydHJhY2suaDoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NpbmsuYzoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NpbmsuaDoKKwkgIGFkZCBTdW4gQXVkaW8gcGx1Z2luLiBWZXJpZmllZCB0aGF0IG5vdGhpbmcgYnJlYWtzIGFuZCB0aGF0IG1ha2UgY2hlY2sgd29ya3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCBTdW4gQXVkaW8gcGx1Z2luLiBWZXJpZmllZCB0aGF0IG5vdGhpbmcgYnJlYWtzIGFuZCB0aGF0IG1ha2UgY2hlY2sgd29ya3MuCisJICBEb24ndCB0aGluayB0aGUgZG9jcyBnZXRzIHByb3Blcmx5IGJ1aWx0IHlldCwgYnV0IEkgZG9uJ3QgdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0byBlbmFibGUgdGhhdC4KKworMjAwNi0wMS0wNyAyMDowMTowOSArMDAwMCAgUGhpbGlwcGUgS2FsYWYgPHBoaWxpcHBlLmthbGFmQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0LXBsdWdpbnMtZ29vZC9nc3QvdWRwLzogQWxsb3cgdWRwc3JjIGFuZCBkeW51ZHBzaW5rIHRvIHRha2UgYSBzb2NrZmQgYXMgYSBwYXJhbWV0ZXIuIEZvciB1ZHBzcmMsIG92ZXJyaWRlcyB0aGUgcG9yLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMDEtMDcgIFBoaWxpcHBlIEtoYWxhZiAgPHBoaWxpcHBlLmthbGFmQGNvbGxhYm9yYS5jby51az4KKwkgICogZ3N0LXBsdWdpbnMtZ29vZC9nc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC9nc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgQWxsb3cgdWRwc3JjIGFuZCBkeW51ZHBzaW5rIHRvIHRha2UgYSBzb2NrZmQgYXMgYSBwYXJhbWV0ZXIuIEZvciB1ZHBzcmMsCisJICBvdmVycmlkZXMgdGhlIHBvcnQgb3IgbXVsdGljYXN0IHBhcmFtZXRlcnMuIEZpeGVzIGJ1Z3MgIzMyMzAyMS4KKworMjAwNi0wMS0wNiAxNjoyODozMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2djb25mLzogQWRkIG5ldyBnY29uZmF1ZGlvc3JjIGFuZCBnY29uZnZpZGVvc3JjIGVsZW1lbnRzIChuZWVkZWQgZm9yIGdub21lLXNvdW5kLXJlY29yZGVyKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZ2NvbmYvTWFrZWZpbGUuYW06CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc3JjLmM6IChnc3RfZ2NvbmZfYXVkaW9fc3JjX2Jhc2VfaW5pdCksCisJICAoZ3N0X2djb25mX2F1ZGlvX3NyY19jbGFzc19pbml0KSwgKGdzdF9nY29uZl9hdWRpb19zcmNfcmVzZXQpLAorCSAgKGdzdF9nY29uZl9hdWRpb19zcmNfaW5pdCksIChnc3RfZ2NvbmZfYXVkaW9fc3JjX2Rpc3Bvc2UpLAorCSAgKGRvX3RvZ2dsZV9lbGVtZW50KSwgKGNiX3RvZ2dsZV9lbGVtZW50KSwKKwkgIChnc3RfZ2NvbmZfYXVkaW9fc3JjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc3JjLmg6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmVsZW1lbnRzLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc3JjLmM6IChnc3RfZ2NvbmZfdmlkZW9fc3JjX2Jhc2VfaW5pdCksCisJICAoZ3N0X2djb25mX3ZpZGVvX3NyY19jbGFzc19pbml0KSwgKGdzdF9nY29uZl92aWRlb19zcmNfcmVzZXQpLAorCSAgKGdzdF9nY29uZl92aWRlb19zcmNfaW5pdCksIChnc3RfZ2NvbmZfdmlkZW9fc3JjX2Rpc3Bvc2UpLAorCSAgKGRvX3RvZ2dsZV9lbGVtZW50KSwgKGNiX3RvZ2dsZV9lbGVtZW50KSwKKwkgIChnc3RfZ2NvbmZfdmlkZW9fc3JjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc3JjLmg6CisJICBBZGQgbmV3IGdjb25mYXVkaW9zcmMgYW5kIGdjb25mdmlkZW9zcmMgZWxlbWVudHMKKwkgIChuZWVkZWQgZm9yIGdub21lLXNvdW5kLXJlY29yZGVyKS4KKworMjAwNi0wMS0wNiAxMTo0Njo1MyArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IEFkZCBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMoKSBmb3IgcHJvcGVyIGRlY29kZWJpbiBiZWhhdmlvdXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfaWQzZGVtdXhfYWRkX3NyY3BhZCk6CisJICBBZGQgZ3N0X2VsZW1lbnRfbm9fbW9yZV9wYWRzKCkgZm9yIHByb3BlciBkZWNvZGViaW4gYmVoYXZpb3VyLgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKHBhcnNlX2NvbW1lbnRfZnJhbWUpLAorCSAgKHBhcnNlX3RleHRfaWRlbnRpZmljYXRpb25fZnJhbWUpLCAocGFyc2Vfc3BsaXRfc3RyaW5ncyk6CisJICBGYWlsdXJlIHRvIGRlY29kZSBzb21lIHRhZ3MgaXMgbm90IGEgR1NUX0VSUk9SKCkgYnV0IGEKKwkgIEdTVF9XQVJOSU5HKCkKKwkgIFdoZW4gaXRlcmF0aW5nIG92ZXIgYSBjaHVuayBvZiB0ZXh0LCBjaGVjayB0aGF0IHdlIGhhdmVuJ3QgZ29uZSB0b28KKwkgIGZhci4KKworMjAwNi0wMS0wNSAyMzoxNzo0NCArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3cGx1Z2luLmM6CisJKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jOgorCSogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuaDoKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHBsdWdpbi5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5oOgorCSogd2luMzIvdnM2L2xpYmdzdGRpcmVjdGRyYXcuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdGRpcmVjdHNvdW5kLmRzcDoKKwkgIGFkZGVkIHN5cy9kaXJlY3RkcmF3IGFkZGVkIHN5cy9kaXJlY3Rzb3VuZCBhZGRlZCB3aW4zMi92czYvZ3N0X3BsdWdpbnNfYmFkLmRzdyBhZGRlZCB3aW4zMi92czYvbGliZ3N0ZGlyZWN0c291bmQuZHNwIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAxLTA1ICBTZWJhc3RpZW4gTW91dHRlICA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisJICAqIGFkZGVkIHN5cy9kaXJlY3RkcmF3CisJICAqIGFkZGVkIHN5cy9kaXJlY3Rzb3VuZAorCSAgKiBhZGRlZCB3aW4zMi92czYvZ3N0X3BsdWdpbnNfYmFkLmRzdworCSAgKiBhZGRlZCB3aW4zMi92czYvbGliZ3N0ZGlyZWN0c291bmQuZHNwCisJICAqIGFkZGVkIHdpbjMyL3ZzNi9saWJnc3RkaXJlY3RkcmF3LmRzcAorCSAgKiBhZGRlZCB3aW4zMi9jb21tb24vY29uZmlnLmgKKworMjAwNi0wMS0wNSAxNzowMzo0NSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogY2FsbCBvaWxfaW5pdCgpIHdoZW4gdXNpbmcgbGlib2lsCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X2NsYXNzX2luaXQpLAorCSAgKHBsdWdpbl9pbml0KToKKwkgIGNhbGwgb2lsX2luaXQoKSB3aGVuIHVzaW5nIGxpYm9pbAorCisyMDA2LTAxLTA0IDE3OjI4OjQ5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvanBlZy86IEZpeCBsZWFrcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvanBlZy9nc3RzbW9rZWRlYy5jOiAoZ3N0X3Ntb2tlZGVjX2NoYWluKToKKwkgICogZXh0L2pwZWcvZ3N0c21va2VlbmMuYzogKGdzdF9zbW9rZWVuY19jaGFpbik6CisJICBGaXggbGVha3MuCisKKzIwMDYtMDEtMDIgMTk6Mzg6MzIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogRG9uJ3QgZ19hc3NlcnQoKSB3aGVyZSB3ZSBzaG91bGQganVzdCByZXR1cm4gRkFMU0U7IHJlbW92ZSB1bm5lY2Vzc2FyeSBnX2Fzc2VydCgpOyBpbml0aWFsaXplIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBSZXZpZXdlZCBieTogVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19kZWNfd3JpdGUpLAorCSAgKGdzdF9mbGFjX2RlY19jb252ZXJ0X3NyYyksIChnc3RfZmxhY19kZWNfc3JjX3F1ZXJ5KSwKKwkgIChnc3RfZmxhY19kZWNfY2hhbmdlX3N0YXRlKToKKwkgIERvbid0IGdfYXNzZXJ0KCkgd2hlcmUgd2Ugc2hvdWxkIGp1c3QgcmV0dXJuIEZBTFNFOyByZW1vdmUKKwkgIHVubmVjZXNzYXJ5IGdfYXNzZXJ0KCk7IGluaXRpYWxpemUgc29tZSBmaWVsZHMgcHJvcGVybHkgaW4KKwkgIHN0YXRlIGNoYW5nZSBmdW5jdGlvbiAoZml4ZXMgIzMyNTUwNCkuIEFsc28sIHVzZQorCSAgR1NUX0RFQlVHX09CSkVDVCBpbiB0d28gbW9yZSBwbGFjZXMuCisKKzIwMDUtMTItMzAgMTU6NTE6MDUgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBhbHNvIHJlbW92ZSBzbW9vdGh3YXZlJ3MgTWFrZWZpbGUuYW0KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBhbHNvIHJlbW92ZSBzbW9vdGh3YXZlJ3MgTWFrZWZpbGUuYW0KKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgZml4IHBsdWdpbiBkb2NzCisKKzIwMDUtMTItMzAgMTU6Mzk6MTcgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3Qvc21vb3Rod2F2ZS8uZ2l0aWdub3JlOgorCSogZ3N0L3Ntb290aHdhdmUvTWFrZWZpbGUuYW06CisJKiBnc3Qvc21vb3Rod2F2ZS9SRUFETUU6CisJKiBnc3Qvc21vb3Rod2F2ZS9kZW1vLW9zc3NyYy5jOgorCSogZ3N0L3Ntb290aHdhdmUvZ3N0c21vb3Rod2F2ZS5jOgorCSogZ3N0L3Ntb290aHdhdmUvZ3N0c21vb3Rod2F2ZS5oOgorCSAgcmVtb3ZlIG9sZCBwbHVnaW4gdGhhdCB3ZW50IGJhZAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZW1vdmUgb2xkIHBsdWdpbiB0aGF0IHdlbnQgYmFkCisKKzIwMDUtMTItMzAgMTU6MzQ6MTggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdGVzdHMvZXhhbXBsZXMvTWFrZWZpbGUuYW06IGFkZGVkIG1pc3NpbmcgTWFrZWZpbGUuYW0KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9NYWtlZmlsZS5hbToKKwkgIGFkZGVkIG1pc3NpbmcgTWFrZWZpbGUuYW0KKworMjAwNS0xMi0zMCAxNToyODo0NCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBtb3ZlZCBsZXZlbC1leGFtcGxlIHRvIHRlc3RzL2V4YW1wbGVzL2xldmVsLWV4YW1wbGUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9sZXZlbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2xldmVsL2xldmVsLWV4YW1wbGUuYzoKKwkgICogdGVzdHMvTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2V4YW1wbGVzL2xldmVsL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9sZXZlbC9sZXZlbC1leGFtcGxlLmM6IChtZXNzYWdlX2hhbmRsZXIpLCAobWFpbik6CisJICBtb3ZlZCBsZXZlbC1leGFtcGxlIHRvIHRlc3RzL2V4YW1wbGVzL2xldmVsLWV4YW1wbGUKKwkgICogdGVzdHMvb2xkL2V4YW1wbGVzL2xldmVsL2RlbW8uYzogKG1haW4pOgorCSAgKiB0ZXN0cy9vbGQvZXhhbXBsZXMvbGV2ZWwvcGxvdC5jOiAobWFpbik6CisJICBzb21lIGluaXRpYWwgZml4ZXMKKworMjAwNS0xMi0yOSAxNjozNjoxOSArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBnc3QvdWRwL2dzdG11bHRpdWRwc2luay4qOiBUcmFjayBwYWNrZXRzIHNlbnQgcGVyIGNsaWVudCBpbiBhZGRpdGlvbiB0byBieXRlcyBzZW50OyBwcm92aWRlIHRoaXMgaW5mbyB0aHJvdWdoIGdldC1zdGEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19yZW5kZXIpLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfcmVtb3ZlKSwgKGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3N0YXRzKToKKwkgICogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaDoKKwkgIFRyYWNrIHBhY2tldHMgc2VudCBwZXIgY2xpZW50IGluIGFkZGl0aW9uIHRvIGJ5dGVzIHNlbnQ7IHByb3ZpZGUKKwkgIHRoaXMgaW5mbyB0aHJvdWdoIGdldC1zdGF0cyBzaWduYWwKKworMjAwNS0xMi0yOSAxMToyNjoxMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiBDYW4ndCB1c2UgZ3N0X29iamVjdF91bnJlZigpIG9uIGEgR3N0QWRhcHRlciAoIzMyNTE5MSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiAoZ3N0X2F1X3BhcnNlX2Rpc3Bvc2UpOgorCSAgQ2FuJ3QgdXNlIGdzdF9vYmplY3RfdW5yZWYoKSBvbiBhIEdzdEFkYXB0ZXIgKCMzMjUxOTEpLgorCisyMDA1LTEyLTI4IDE4OjU1OjMyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzogSWYgYSBicm9rZW4gdGFnIGhhcyAwIGJ5dGVzIHBheWxvYWQsIGF0IGxlYXN0IHN0aWxsIHNraXAgdGhlIDEwIGJ5dGUgaGVhZGVyCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzogKGlkM2RlbXV4X3JlYWRfaWQzdjJfdGFnKToKKwkgIElmIGEgYnJva2VuIHRhZyBoYXMgMCBieXRlcyBwYXlsb2FkLCBhdCBsZWFzdCBzdGlsbCBza2lwCisJICB0aGUgMTAgYnl0ZSBoZWFkZXIKKworMjAwNS0xMi0yMiAxNTowMDo0MSArMDAwMCAgUGhpbGlwcGUgS2FsYWYgPHBoaWxpcHBlLmthbGFmQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0LXBsdWdpbnMtZ29vZC9nc3QvcnRwLzogTWFraW5nIHRoZXNlIGRlcGF5bG9hZGVycyAoSDI2MysgYW5kIG1wZWc0IHZpZGVvKSBpbmhlcml0IGZyb20KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMi0yMiAgUGhpbGlwcGUgS2hhbGFmICA8YnVyZ2VyQHNwZWVkeS5vcmc+CisJICAqIGdzdC1wbHVnaW5zLWdvb2QvZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5Lmg6CisJICAqIGdzdC1wbHVnaW5zLWdvb2QvZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJICAqIGdzdC1wbHVnaW5zLWdvb2QvZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuaDoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC9nc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSAgTWFraW5nIHRoZXNlIGRlcGF5bG9hZGVycyAoSDI2MysgYW5kIG1wZWc0IHZpZGVvKSBpbmhlcml0IGZyb20KKwkgIFJ0cEJhc2VEZXBheWxvYWRlckNsYXNzLiBGaXhlcyBidWdzICMzMjM5MjIgYW5kICMzMjM5MDguCisKKzIwMDUtMTItMjEgMTc6MTU6MDkgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLio6IFJlZ2VuZXJhdGUgdGhlIHBsdWdpbiBoaWVhcmNoeS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgUmVnZW5lcmF0ZSB0aGUgcGx1Z2luIGhpZWFyY2h5LgorCisyMDA1LTEyLTIxIDE1OjI0OjU5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgQWRkIGRvY3VtZW50YXRpb24gZm9yIGlkM2RlbXV4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEyLTIxICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAoZ3N0X2lkM2RlbXV4X2dldF90eXBlKSwKKwkgIChnc3RfaWQzZGVtdXhfYmFzZV9pbml0KSwgKGdzdF9pZDNkZW11eF9jbGFzc19pbml0KSwKKwkgIChnc3RfaWQzZGVtdXhfY2hhaW4pOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguaDoKKwkgIEFkZCBkb2N1bWVudGF0aW9uIGZvciBpZDNkZW11eC4KKwkgIERvbid0IGZhaWwgaWYgdGhlIGZpcnN0IGJ1ZmZlciBpcyBub3QgYXQgb2Zmc2V0IDAsIGp1c3QKKwkgIGF0dGVtcHQgdG8gdHlwZWZpbmQgYW5kIGRvIHBhc3MgdGhyb3VnaAorCSAgUmVuYW1lIHRoZSBnc3RfdHlwZSBmdW5jdGlvbiBmcm9tIGdzdF9nc3RfaWQzZGVtdXguLgorCisyMDA1LTEyLTIwIDEyOjQ0OjI1ICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLio6IENvbGxlY3Qgc3RhdGlzdGljczsgcmV0dXJuIHRoZW0gZnJvbSBnZXRfc3RhdHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogKGdzdF9tdWx0aXVkcHNpbmtfcmVuZGVyKSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX2FkZCksIChnc3RfbXVsdGl1ZHBzaW5rX3JlbW92ZSksCisJICAoZ3N0X211bHRpdWRwc2lua19nZXRfc3RhdHMpOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSAgQ29sbGVjdCBzdGF0aXN0aWNzOyByZXR1cm4gdGhlbSBmcm9tIGdldF9zdGF0cy4KKworMjAwNS0xMi0xOSAxNTo0MzozMCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBTdHVwaWQgc2lnbmVkbmVzcyBpc3N1ZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfc3RyZWFtX3NjYW4pOgorCSAgU3R1cGlkIHNpZ25lZG5lc3MgaXNzdWUuLi4KKworMjAwNS0xMi0xOSAxNToxOTo0NCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZXh0L3N3ZmRlYy9nc3Rzd2ZkZWMuYzogQWRkIGRlYnVnZ2luZyBjYXRlZ29yeSBhbmQgcmV0dXJuIEdzdEZsb3dSZXR1cm4gaW4gdGhlIHJpZ2h0IHBsYWNlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zd2ZkZWMvZ3N0c3dmZGVjLmM6IChnc3Rfc3dmZGVjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zd2ZkZWNfY2hhaW4pLCAoZ3N0X3N3ZmRlY19yZW5kZXIpOgorCSAgQWRkIGRlYnVnZ2luZyBjYXRlZ29yeSBhbmQgcmV0dXJuIEdzdEZsb3dSZXR1cm4gaW4gdGhlIHJpZ2h0IHBsYWNlcworCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfbGluayk6CisJICBHZXQgc29tZXRoaW5nIGZyb20gdGhlIHBlZXIgcGFkIG9uY2Ugd2UndmUgY2hlY2tlZCBpZiB0aGVyZSBpcyBhIHBlZXIgcGFkLgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9jaGFuZ2Vfc3RhdGUpLAorCSAgKHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSksIChxdGRlbXV4X3BhcnNlX3RyYWspLAorCSAgKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6CisJICBDb3VwbGUgb2YgZml4ZXMKKworMjAwNS0xMi0xOSAxNTowNjoyNyArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBDb25zdHJ1Y3QgaW5kZXggZm9yIGluZGV4bGVzcyBmaWxlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3Jlc2V0KSwKKwkgIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpLCAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0pLAorCSAgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfb2RtbCksIChnc3RfYXZpX2RlbXV4X3BlZWtfdGFnKSwKKwkgIChnc3RfYXZpX2RlbXV4X25leHRfZGF0YV9idWZmZXIpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fc2NhbiksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyKSwgKGdzdF9hdmlfZGVtdXhfbG9vcCk6CisJICBDb25zdHJ1Y3QgaW5kZXggZm9yIGluZGV4bGVzcyBmaWxlcy4KKwkgIE1ha2Ugc3VyZSBwYWQvYnVmZmVycyBhcmUgY29ycmVjdGx5IHJlc2V0IHRvIE5VTEwgb25jZSB3ZSBkb24ndCBuZWVkCisJICB0aGVtIGFueW1vcmUsIGVsc2Ugd2UgZ2V0IGxvdmVseSBzZWdmYXVsdHMvYXNzZXJ0aW9ucy4KKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBZZXMsIHlvdSBjYW4gaGF2ZSA5NktIeiBhdWRpbyBhbmQgd21hIGluIHdhdiA6KAorCisyMDA1LTEyLTE4IDE1OjE0OjQ0ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBDaGVjayBmb3Igb3B0aW9uYWwgZGVwZW5kZW5jeSBvbiB6bGliIGZvciBpZDNkZW11eAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIENoZWNrIGZvciBvcHRpb25hbCBkZXBlbmRlbmN5IG9uIHpsaWIgZm9yIGlkM2RlbXV4CisJICAqIGdzdC9pZDNkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfZ3N0X2lkM2RlbXV4X2dldF90eXBlKSwKKwkgIChnc3RfaWQzZGVtdXhfYmFzZV9pbml0KSwgKGdzdF9pZDNkZW11eF9jbGFzc19pbml0KSwKKwkgIChnc3RfaWQzZGVtdXhfcmVzZXQpLCAoZ3N0X2lkM2RlbXV4X2luaXQpLCAoZ3N0X2lkM2RlbXV4X2Rpc3Bvc2UpLAorCSAgKGdzdF9pZDNkZW11eF9hZGRfc3JjcGFkKSwgKGdzdF9pZDNkZW11eF9yZW1vdmVfc3JjcGFkKSwKKwkgIChnc3RfaWQzZGVtdXhfdHJpbV9idWZmZXIpLCAoZ3N0X2lkM2RlbXV4X2NoYWluKSwKKwkgIChnc3RfaWQzZGVtdXhfc2V0X3Byb3BlcnR5KSwgKGdzdF9pZDNkZW11eF9nZXRfcHJvcGVydHkpLAorCSAgKGlkM2RlbXV4X2dldF91cHN0cmVhbV9zaXplKSwgKGdzdF9pZDNkZW11eF9zcmNwYWRfZXZlbnQpLAorCSAgKGdzdF9pZDNkZW11eF9yZWFkX2lkM3YxKSwgKGdzdF9pZDNkZW11eF9yZWFkX2lkM3YyKSwKKwkgIChnc3RfaWQzZGVtdXhfc2lua19hY3RpdmF0ZSksIChnc3RfaWQzZGVtdXhfc3JjX2FjdGl2YXRlX3B1bGwpLAorCSAgKGdzdF9pZDNkZW11eF9zcmNfY2hlY2tnZXRyYW5nZSksIChnc3RfaWQzZGVtdXhfcmVhZF9yYW5nZSksCisJICAoZ3N0X2lkM2RlbXV4X3NyY19nZXRyYW5nZSksIChnc3RfaWQzZGVtdXhfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfaWQzZGVtdXhfcGFkX3F1ZXJ5KSwgKGdzdF9pZDNkZW11eF9nZXRfcXVlcnlfdHlwZXMpLAorCSAgKHNpbXBsZV9maW5kX3BlZWspLCAoc2ltcGxlX2ZpbmRfc3VnZ2VzdCksCisJICAoZ3N0X2lkM2RlbXV4X2RvX3R5cGVmaW5kKSwgKGdzdF9pZDNkZW11eF9zZW5kX3RhZ19ldmVudCksCisJICAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguaDoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzogKHJlYWRfc3luY2hfdWludCksCisJICAoaWQzZGVtdXhfcmVhZF9pZDN2MV90YWcpLCAoaWQzZGVtdXhfcmVhZF9pZDN2Ml90YWcpLAorCSAgKGlkM2RlbXV4X2lkM3YyX2ZyYW1lX2hkcl9zaXplKSwgKGNvbnZlcnRfZmlkX3RvX3YyNDApLAorCSAgKGlkM2RlbXV4X2lkM3YyX2ZyYW1lc190b190YWdfbGlzdCk6CisJICAqIGdzdC9pZDNkZW11eC9pZDN0YWdzLmg6CisJICAqIGdzdC9pZDNkZW11eC9pZDN2Mi40LjAtZnJhbWVzLnR4dDoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyLjQuMC1zdHJ1Y3R1cmUudHh0OgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKGlkM2RlbXV4X2lkM3YyX3BhcnNlX2ZyYW1lKSwKKwkgIChwYXJzZV9jb21tZW50X2ZyYW1lKSwgKHBhcnNlX3RleHRfaWRlbnRpZmljYXRpb25fZnJhbWUpLAorCSAgKGlkM3YyX3RhZ190b190YWdsaXN0KSwgKHBhcnNlX3NwbGl0X3N0cmluZ3MpOgorCSAgQWxsIG5ldyBMR1BMIGlkMyBkZW11eGVyLiBDYW4gdXNlIHpsaWIgZm9yIGNvbXByZXNzZWQgZnJhbWVzLAorCSAgb3RoZXJ3aXNlIGl0IGRpc2NhcmRzIHRoZW0uIFdvcmtzIG9uIG15IHRlc3QgZmlsZXMuCisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2xvb3ApOgorCSAgRG9uJ3Qgc2VuZCBFT1MgdG8gYSBub24tZXhpc3Rpbmcgc3JjcGFkCisJICBUaGUgZGVidWcgY2F0ZWdvcnkgY2FuIGJlIHN0YXRpYworCisyMDA1LTEyLTE3IDE3OjQ4OjM4ICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogVXBkYXRlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMi0xNyAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtZGVjbC50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy11bmRvY3VtZW50ZWQudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLmludGVyZmFjZXM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5zaWduYWxzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGZidmlkZW9zaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF0ZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2RsdmlkZW9zaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWVkLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXR0YS54bWw6IFVwZGF0ZXMuCisJICAqIGV4dC9kaXJlY3RmYi9kZmJ2aWRlb3NpbmsuYzoKKwkgIChnc3RfZGZidmlkZW9zaW5rX3N1cmZhY2VfY3JlYXRlKSwKKwkgIChnc3RfZGZidmlkZW9zaW5rX2V2ZW50X3RocmVhZCksIChnc3RfZGZidmlkZW9zaW5rX2VudW1fdm1vZGVzKSwKKwkgIChnc3RfZGZidmlkZW9zaW5rX2VudW1fZGV2aWNlcyksIChnc3RfZGZidmlkZW9zaW5rX3NldHVwKSwKKwkgIChnc3RfZGZidmlkZW9zaW5rX2NsZWFudXApLAorCSAgKGdzdF9kZmJ2aWRlb3NpbmtfY2FuX2JsaXRfZnJvbV9mb3JtYXQpLAorCSAgKGdzdF9kZmJ2aWRlb3NpbmtfZ2V0X2Jlc3Rfdm1vZGUpLCAoZ3N0X2RmYnZpZGVvc2lua19nZXRjYXBzKSwKKwkgIChnc3RfZGZidmlkZW9zaW5rX3NldGNhcHMpLCAoZ3N0X2RmYnZpZGVvc2lua19zaG93X2ZyYW1lKSwKKwkgIChnc3RfZGZidmlkZW9zaW5rX2J1ZmZlcl9hbGxvYyksIChnc3RfZGZic3VyZmFjZV9maW5hbGl6ZSksCisJICAoZ3N0X2RmYnZpZGVvc2lua19pbnRlcmZhY2Vfc3VwcG9ydGVkKSwKKwkgIChnc3RfZGZidmlkZW9zaW5rX25hdmlnYXRpb25fc2VuZF9ldmVudCksCisJICAoZ3N0X2RmYnZpZGVvc2lua191cGRhdGVfY29sb3JiYWxhbmNlKSwKKwkgIChnc3RfZGZidmlkZW9zaW5rX2NvbG9yYmFsYW5jZV9saXN0X2NoYW5uZWxzKSwKKwkgIChnc3RfZGZidmlkZW9zaW5rX2NvbG9yYmFsYW5jZV9zZXRfdmFsdWUpLAorCSAgKGdzdF9kZmJ2aWRlb3NpbmtfY29sb3JiYWxhbmNlX2dldF92YWx1ZSksCisJICAoZ3N0X2RmYnZpZGVvc2lua19jb2xvcmJhbGFuY2VfaW5pdCksCisJICAoZ3N0X2RmYnZpZGVvc2lua19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9kZmJ2aWRlb3NpbmtfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfZGZidmlkZW9zaW5rX2luaXQpLCAoZ3N0X2RmYnZpZGVvc2lua19jbGFzc19pbml0KToKKwkgICogZXh0L2RpcmVjdGZiL2RmYnZpZGVvc2luay5oOiBJbXBsZW1lbnQgdmVydGljYWwgc3luYyBhbmQKKwkgIGNvbG9yIGJhbGFuY2UgaW50ZXJmYWNlLgorCisyMDA1LTEyLTE2IDIxOjU3OjUxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGNoYW5nZSBzb21lIGNoYXIqIGludG8gY2hhcltdCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2VzZC9lc2Rtb24uYzogKGdzdF9lc2Rtb25fb3Blbl9hdWRpbyk6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfcHJlcGFyZSk6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkgIGNoYW5nZSBzb21lIGNoYXIqIGludG8gY2hhcltdCisKKzIwMDUtMTItMTYgMTk6MzI6NTMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS4qOiBVc2UgR3N0U2VnbWVudCB0byBpbXBsZW1lbnQgbW9yZSBzZWVraW5nIGZlYXR1cmVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX3Jlc2V0KSwKKwkgIChnc3Rfd2F2cGFyc2Vfb3RoZXIpLCAoZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2VlayksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKSwgKGdzdF93YXZwYXJzZV9zdHJlYW1fZGF0YSksCisJICAoZ3N0X3dhdnBhcnNlX2xvb3ApLCAoZ3N0X3dhdnBhcnNlX3BhZF9jb252ZXJ0KSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3JjcGFkX2V2ZW50KSwgKGdzdF93YXZwYXJzZV9zaW5rX2FjdGl2YXRlX3B1bGwpOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuaDoKKwkgIFVzZSBHc3RTZWdtZW50IHRvIGltcGxlbWVudCBtb3JlIHNlZWtpbmcgZmVhdHVyZXMuCisKKzIwMDUtMTItMTYgMTI6MjU6MzggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogT29wcywgcmVtb3ZlIHRyYWlsaW5nIGNvbW1hIGZyb20gY2FwcyBzdHJpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOgorCSAgT29wcywgcmVtb3ZlIHRyYWlsaW5nIGNvbW1hIGZyb20gY2FwcyBzdHJpbmcuCisKKzIwMDUtMTItMTYgMTA6MTI6NDkgKzAwMDAgIEJlbmphbWluIFBpbmVhdSA8YmVuLnBpbmVhdUBnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IEFkZCA8bmV0aW5ldC9pbi5oPiBpbmNsdWRlIGFuZCBtb3ZlIDxhcnBhL2luZXQuaD4gaW5jbHVkZSB0byBtYWtlIHRoaW5ncyB3b3JrIG9uIE9wZW5CU0QgYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6CisJICBBZGQgPG5ldGluZXQvaW4uaD4gaW5jbHVkZSBhbmQgbW92ZSA8YXJwYS9pbmV0Lmg+IGluY2x1ZGUKKwkgIHRvIG1ha2UgdGhpbmdzIHdvcmsgb24gT3BlbkJTRCBhcyB3ZWxsIChmaXhlcyAjMzIzNzE3OworCSAgcGF0Y2ggYnk6IEJlbmphbWluIFBpbmVhdSkKKworMjAwNS0xMi0xNiAwOTo1OToyMSArMDAwMCAgZ2NvY2F0cmVAZ21haWwuY29tIDxnY29jYXRyZUBnbWFpbC5jb20+CisKKwkgIGV4dC93YXZwYWNrLzogV2F2cGFjayBzdXBwb3J0cyBzYW1wbGVyYXRlcyBmcm9tIDYtMTkya0h6LCBmaXggcGFkIHRlbXBsYXRlIHJlbW92ZSBidWZmZXItZnJhbWVzIGZyb20gY2FwcywgdGhleSBhcmUgZy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogKGdzdF93YXZwYWNrX2RlY19saW5rKToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6CisJICBXYXZwYWNrIHN1cHBvcnRzIHNhbXBsZXJhdGVzIGZyb20gNi0xOTJrSHosIGZpeCBwYWQgdGVtcGxhdGUKKwkgIGNhcHMgKGZpeGVzICMzMjI5NzM7IHBhdGNoIGJ5OiBnY29jYXRyZUBnbWFpbC5jb20pLiBBbHNvCisJICByZW1vdmUgYnVmZmVyLWZyYW1lcyBmcm9tIGNhcHMsIHRoZXkgYXJlIGdvbmUgaW4gMC4xMC4KKworMjAwNS0xMi0xNCAyMDowNTo0NSArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBDaGFuZ2VMb2c6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkgIFNldCBjbG9jayByYXRlIHRvIGJlIGZpeGVkIGluIDgwMDAuIEl0IGZpeGVzIGJ1ZyAjMzI0MDEyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBTZXQgY2xvY2sgcmF0ZSB0byBiZSBmaXhlZCBpbiA4MDAwLiBJdCBmaXhlcyBidWcgIzMyNDAxMi4KKworMjAwNS0xMi0xNCAxODowNzoxNiArMDAwMCAgUGhpbGlwcGUgS2FsYWYgPHBoaWxpcHBlLmthbGFmQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0LXBsdWdpbnMtZ29vZC9nc3QvcnRwLzogRml4ZWQgcGF5bG9hZCByYW5nZSBpbiBwYXlsb2RlciBjYXBzLiBSZW1vdmVkIHBheWxvYWQgcmFuZ2UgY29tcGxldGx5IGZyb20gZGVwYXlsb2FkZXJzIGFzLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTItMTQgIFBoaWxpcHBlIEtoYWxhZiAgPGJ1cmdlckBzcGVlZHkub3JnPgorCSAgKiBnc3QtcGx1Z2lucy1nb29kL2dzdC9ydHAvZ3N0YXN0ZXJpc2toMjYzLmM6CisJICAqIGdzdC1wbHVnaW5zLWdvb2QvZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSAgKiBnc3QtcGx1Z2lucy1nb29kL2dzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJICAqIGdzdC1wbHVnaW5zLWdvb2QvZ3N0L3J0cC9nc3RydHBnNzExZGVwYXkuYzoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC9nc3QvcnRwL2dzdHJ0cGc3MTFkZXBheS5jOgorCSAgKiBnc3QtcGx1Z2lucy1nb29kL2dzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuYzoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC9nc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC9nc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC9nc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJICAqIGdzdC1wbHVnaW5zLWdvb2QvZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYzoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC9nc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC9nc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJICAqIGdzdC1wbHVnaW5zLWdvb2QvZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC9nc3QvcnRwL1JFQURNRToKKwkgIEZpeGVkIHBheWxvYWQgcmFuZ2UgaW4gcGF5bG9kZXIgY2Fwcy4gUmVtb3ZlZCBwYXlsb2FkIHJhbmdlIGNvbXBsZXRseSBmcm9tCisJICBkZXBheWxvYWRlcnMgYXMgdGhleSBkb24ndCByZXF1aXJlIHBheWxvYWQgdHlwZSBpbiB0aGVpciBjYXBzLiBJbiBlZmZlY3QsCisJICB0aGVyZSBpc24ndCBhbnkgc3BlY2lmaWMgcGF5bG9hZCB0eXBlIGZvciBhbnkgZ2l2ZW4gY29kZWMsIG9ubHkgc3VnZ2VzdGlvbnMuCisJICBGaXhlcyBidWcgIzMyNDAxMS4KKworMjAwNS0xMi0xMyAyMTo1ODo0MiArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogQ29kZSBjbGVhbnVwIGFuZCByZS1lbmFibGluZyBxdWV1ZWQgdGltZSB2YWxpZGl0eSBjaGVjayBmb3IgY29ycmVjdCBFT1MgaGFuZGxpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTItMTMgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiAoZ3N0X3ZpZGVvbWl4ZXJfaW5pdCksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfZmlsbF9xdWV1ZXMpLCAoZ3N0X3ZpZGVvbWl4ZXJfYmxlbmRfYnVmZmVycyksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfY29sbGVjdGVkKTogQ29kZSBjbGVhbnVwIGFuZCByZS1lbmFibGluZworCSAgcXVldWVkIHRpbWUgdmFsaWRpdHkgY2hlY2sgZm9yIGNvcnJlY3QgRU9TIGhhbmRsaW5nLgorCisyMDA1LTEyLTEzIDE3OjE4OjMyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvb3NzL2dzdG9zc21peGVyZWxlbWVudC5jOiBBZGQgJ2RldmljZS1uYW1lJyBwcm9wZXJ0eSBhbmQgZml4IHN0YXRlIGNoYW5nZSBmdW5jdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3NzL2dzdG9zc21peGVyZWxlbWVudC5jOiAoZ3N0X29zc19taXhlcl9lbGVtZW50X2NsYXNzX2luaXQpLAorCSAgKGdzdF9vc3NfbWl4ZXJfZWxlbWVudF9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9vc3NfbWl4ZXJfZWxlbWVudF9jaGFuZ2Vfc3RhdGUpOgorCSAgQWRkICdkZXZpY2UtbmFtZScgcHJvcGVydHkgYW5kIGZpeCBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24uCisKKzIwMDUtMTItMTMgMTA6NDU6MDQgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6IElmIHRoZSBzcGVlZCBvZiB0aGUgZmlsZSBpcyBudWxsIGluIHRoZSBoZWFkZXIsIHNldCB0aGUgZnJhbWVfdGltZSB0byB0aGUgZGVmYXVsdCBzZXR0aW5nIG9mIEdTVC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6IChnc3RfZmx4ZGVjX2NoYWluKToKKwkgIElmIHRoZSBzcGVlZCBvZiB0aGUgZmlsZSBpcyBudWxsIGluIHRoZSBoZWFkZXIsIHNldCB0aGUgZnJhbWVfdGltZSB0byB0aGUgZGVmYXVsdAorCSAgc2V0dGluZyBvZiBHU1RfU0VDT05EIC8gNzAuIFdoaWNoIGlzIHRoZSBkZWZhdWx0IGZyYW1lX2RlbGF5IGZvciAuZmxpIGZpbGVzIGFzCisJICBzdGF0ZWQgaW4gdGhpcyBkb2N1bWVudCA6IGh0dHA6Ly93d3cuY29tcHVwaGFzZS5jb20vZmxpYy5odG0KKwkgIFdvdWxkIGJlIG5pY2UgdG8gaGF2ZSB0aGUgdGltZSBjb252ZXJzaW9uIGRvbmUgcHJvcGVybHkgdG9vCisJICAoZHVyYXRpb24gPSBmbHhoLT5mcmFtZXMgKiBmbHhkZWMtPmZyYW1lX3RpbWUpCisKKzIwMDUtMTItMTIgMjI6Mjk6MzQgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBBZGRpbmcgZG9jdW1lbnRhdGlvbiBmb3IgdmlkZW9taXhlciBvbiBteSB3YXkgd2l0aCBhIGZ1bm55IHNhbXBsZSBwaXBlbGluZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMi0xMiAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIChnc3RfdmlkZW9taXhlcl9wYWRfc2lua19zZXRjYXBzKSwKKwkgIChnc3RfdmlkZW9taXhlcl9nZXRjYXBzKSwgKGdzdF92aWRlb21peGVyX2ZpbGxfcXVldWVzKSwKKwkgIChnc3RfdmlkZW9taXhlcl91cGRhdGVfcXVldWVzKSwgKGdzdF92aWRlb21peGVyX2NvbGxlY3RlZCk6CisJICBBZGRpbmcKKwkgIGRvY3VtZW50YXRpb24gZm9yIHZpZGVvbWl4ZXIgb24gbXkgd2F5IHdpdGggYSBmdW5ueSBzYW1wbGUKKwkgIHBpcGVsaW5lLgorCisyMDA1LTEyLTEyIDIxOjQzOjAwICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiBGaXggY2FwcyBuZWdvdGlhdGlvbi4gKCMzMjM4OTYpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTItMTIgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgKGdzdF92aWRlb21peGVyX3BhZF9zaW5rX3NldGNhcHMpLAorCSAgKGdzdF92aWRlb21peGVyX2dldGNhcHMpLCAoZ3N0X3ZpZGVvbWl4ZXJfZmlsbF9xdWV1ZXMpLAorCSAgKGdzdF92aWRlb21peGVyX3VwZGF0ZV9xdWV1ZXMpLCAoZ3N0X3ZpZGVvbWl4ZXJfY29sbGVjdGVkKToKKwkgIEZpeCBjYXBzIG5lZ290aWF0aW9uLiAoIzMyMzg5NikKKworMjAwNS0xMi0xMiAxODoxNDo1OCArMDAwMCAgQXJ3ZWQgdi4gTWVya2F0eiA8di5tZXJrYXR6QGdteC5uZXQ+CisKKwkqIENoYW5nZUxvZzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgU2V0IGNvcnJlY3QgdGltZXN0YW1wcyBvbiBhdWRpbyBsYWNlcywgZml4ZXMgcGxheWJhY2sgb2YgbXAzIGZyb20gbWF0cm9za2EuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFNldCBjb3JyZWN0IHRpbWVzdGFtcHMgb24gYXVkaW8gbGFjZXMsIGZpeGVzIHBsYXliYWNrIG9mIG1wMyBmcm9tIG1hdHJvc2thLgorCisyMDA1LTEyLTEyIDEwOjQwOjQyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvOiBHc3RPYmplY3RzIG11c3QgYmUgdW5yZWYnZWQgd2l0aCBnc3Rfb2JqZWN0X3VucmVmKCkgaW5zdGVhZCBvZiBnX29iamVjdF91bnJlZigpLCBvdGhlcndpc2UgdGhpbmdzIGJyZWFrIGZvciBHTGkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvaXZvcmJpcy92b3JiaXNmaWxlLmM6IChnc3RfaXZvcmJpc2ZpbGVfbG9vcCk6CisJICAqIGV4dC9saWJtbXMvZ3N0bW1zLmM6IChnc3RfbW1zX3NyY19xdWVyeSksIChnc3RfbW1zX2NyZWF0ZSk6CisJICAqIGV4dC9tdXNlcGFjay9nc3RtdXNlcGFja2RlYy5jOiAoZ3N0X211c2VwYWNrZGVjX3NyY19xdWVyeSksCisJICAoZ3N0X211c2VwYWNrZGVjX2xvb3ApOgorCSAgKiBleHQvc3dmZGVjL2dzdHN3ZmRlYy5jOiAoZ3N0X3N3ZmRlY192aWRlb19saW5rKSwKKwkgIChnc3Rfc3dmZGVjX3NyY19xdWVyeSk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiAoZ3N0X3dhdnBhY2tfcGFyc2Vfc3JjX3F1ZXJ5KToKKwkgIEdzdE9iamVjdHMgbXVzdCBiZSB1bnJlZidlZCB3aXRoIGdzdF9vYmplY3RfdW5yZWYoKSBpbnN0ZWFkIG9mCisJICBnX29iamVjdF91bnJlZigpLCBvdGhlcndpc2UgdGhpbmdzIGJyZWFrIGZvciBHTGliLTIuNiB1c2Vycy4KKworMjAwNS0xMi0xMiAxMDozMDoyMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS4qOiBVc2UgZ3N0X29iamVjdF91bnJlZigpIGZvciBHc3RPYmplY3RzIGluc3RlYWQgb2YgZ19vYmplY3RfdW5yZWYoKSBhbmQgZml4IGEgbWVtIGxlYWsgaW4gYSBkLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiAoZ3N0X2F1X3BhcnNlX2Jhc2VfaW5pdCksCisJICAoZ3N0X2F1X3BhcnNlX2NsYXNzX2luaXQpLCAoZ3N0X2F1X3BhcnNlX2luaXQpLAorCSAgKGdzdF9hdV9wYXJzZV9kaXNwb3NlKSwgKGdzdF9hdV9wYXJzZV9jaGFpbiksCisJICAoZ3N0X2F1X3BhcnNlX2NoYW5nZV9zdGF0ZSksIChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuaDoKKwkgIFVzZSBnc3Rfb2JqZWN0X3VucmVmKCkgZm9yIEdzdE9iamVjdHMgaW5zdGVhZCBvZgorCSAgZ19vYmplY3RfdW5yZWYoKSBhbmQgZml4IGEgbWVtIGxlYWsgaW4gYSBkZWJ1ZworCSAgc3RhdGVtZW50OyB3aGlsZSB3ZSdyZSBhdCBpdCwgYWxzbyBib3JnaWZ5LCB1c2UKKwkgIGJvaWxlcnBsYXRlIG1hY3JvcyBhbmQgY2xlYW4gdXAgYSBsaXR0bGUgYml0LgorCisyMDA1LTEyLTExIDIwOjI3OjA2ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvZGVidWcvZWZlbmNlLmM6IEFkZGVkIHB1bGwgbW9kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVidWcvZWZlbmNlLmM6IChnc3RfZWZlbmNlX2luaXQpLCAoZ3N0X2VmZW5jZV9nZXRyYW5nZSksCisJICAoZ3N0X2VmZW5jZV9jaGVja2dldHJhbmdlKSwgKGdzdF9lZmVuY2VfYWN0aXZhdGVfc3JjX3B1bGwpOgorCSAgQWRkZWQgcHVsbCBtb2RlLgorCisyMDA1LTEyLTExIDE5OjI1OjQxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvOiBVc2UgYXVkaW90ZXN0c3JjIGluc3RlYWQgb2Ygc2luZXNyYyAoIzMyMzc5OCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSAgKiBnc3QvbGV2ZWwvbGV2ZWwtZXhhbXBsZS5jOiAobWFpbik6CisJICAqIGdzdC9zbW9vdGh3YXZlL2RlbW8tb3Nzc3JjLmM6IChtYWluKToKKwkgIFVzZSBhdWRpb3Rlc3RzcmMgaW5zdGVhZCBvZiBzaW5lc3JjICgjMzIzNzk4KS4KKworMjAwNS0xMi0xMSAxNzo1MDo1MCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBzeXMvb3NzL2dzdG9zc3NpbmsuYzogbW9yZSBkZWJ1Zy1mdW5jLXB0ciB1c2FnZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiAoZ3N0X29zc19zaW5rX2NsYXNzX2luaXQpOgorCSAgbW9yZSBkZWJ1Zy1mdW5jLXB0ciB1c2FnZQorCisyMDA1LTEyLTExIDE2OjQzOjQyICswMDAwICBaZWVzaGFuIEFsaSA8emVlbml4QGdtYWlsLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L2ZseC9mbHhfY29sb3IuYzoKKwkqIGdzdC9mbHgvZmx4X2NvbG9yLmg6CisJKiBnc3QvZmx4L2ZseF9mbXQuaDoKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJKiBnc3QvZmx4L2dzdGZseGRlYy5oOgorCSAgTm93IGZseGRlYyB3b3JrcyBvbiBiaWctZW5kaWFuIG1hY2hpbmVzIGFzIHdlbGwuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIE5vdyBmbHhkZWMgd29ya3Mgb24gYmlnLWVuZGlhbiBtYWNoaW5lcyBhcyB3ZWxsLgorCisyMDA1LTEyLTExIDE2OjE0OjIyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvZGVidWcvZWZlbmNlLmM6IE1ha2Ugc3VyZSBHU1RfQlVGRkVSX0RBVEEgaXMgc2V0IG9uIGZlbmNlZCBjb3BpZWQgYnVmZmVyczsgZml4CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlYnVnL2VmZW5jZS5jOiAoZ3N0X2VmZW5jZV9pbml0KSwgKGdzdF9lZmVuY2VfY2hhaW4pLAorCSAgKGdzdF9mZW5jZWRfYnVmZmVyX2NvcHkpOgorCSAgTWFrZSBzdXJlIEdTVF9CVUZGRVJfREFUQSBpcyBzZXQgb24gZmVuY2VkIGNvcGllZCBidWZmZXJzOyBmaXgKKwkgIEdTVF9ERUJVRyBjcmFzaGVyIHdoZXJlIEdTVF9USU1FX0ZPUk1BVCB3YXMgbm90IHVzZWQgaW4KKwkgIGNvbmp1bmN0aW9uIHdpdGggR1NUX1RJTUVfQVJHUy4gQWxzbywgZG9uJ3QgbGVhayBwYWQgdGVtcGxhdGVzCisJICBhbmQgdXNlIEdTVF9ERUJVR19GVU5DUFRSIGZvciBwYWQgZnVuY3Rpb25zLgorCisyMDA1LTEyLTEwIDIwOjI2OjMzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLio6IFJld3JpdGUgZmxhY2RlYyBhIGJpdCwgc28gdGhhdCBldmVuIHNlZWtpbmcgbWlnaHQgd29yayBub3cuIE1vc3QgaW1wb3J0YW50bHksIGRvbid0IGFjdCB1cG9uIGEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19kZWNfYmFzZV9pbml0KSwKKwkgIChnc3RfZmxhY19kZWNfY2xhc3NfaW5pdCksIChnc3RfZmxhY19kZWNfaW5pdCksCisJICAoZ3N0X2ZsYWNfZGVjX21ldGFkYXRhX2NhbGxiYWNrKSwgKGdzdF9mbGFjX2RlY19lcnJvcl9jYWxsYmFjayksCisJICAoZ3N0X2ZsYWNfZGVjX2VvZiksIChnc3RfZmxhY19kZWNfd3JpdGUpLCAoZ3N0X2ZsYWNfZGVjX2xvb3ApLAorCSAgKGdzdF9mbGFjX2RlY19jb252ZXJ0X3NyYyksIChnc3RfZmxhY19kZWNfZ2V0X3NyY19xdWVyeV90eXBlcyksCisJICAoZ3N0X2ZsYWNfZGVjX3NyY19xdWVyeSksIChnc3RfZmxhY19kZWNfc2VuZF9uZXdzZWdtZW50KSwKKwkgIChnc3RfZmxhY19kZWNfaGFuZGxlX3NlZWtfZXZlbnQpLCAoZ3N0X2ZsYWNfZGVjX3NyY19ldmVudCksCisJICAoZ3N0X2ZsYWNfZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuaDoKKwkgIFJld3JpdGUgZmxhY2RlYyBhIGJpdCwgc28gdGhhdCBldmVuIHNlZWtpbmcgbWlnaHQgd29yayBub3cuIE1vc3QKKwkgIGltcG9ydGFudGx5LCBkb24ndCBhY3QgdXBvbiBhbnkgZmxvdyByZXR1cm4gdmFsdWVzIHdlIGdldCwganVzdCB0ZWxsCisJICB0aGUgZGVjb2RlciBldmVyeXRoaW5nJ3MgZGFuZHkgYW5kIGFjdCBvbiB0aGUgZmxvdyByZXR1cm4gdmFsdWVzCisJICBsYXRlciBvbiBpbiB0aGUgbG9vcCBmdW5jdGlvbi4gV2UgZG9uJ3Qgd2FudCB0byBtZXNzIHVwIHRoZSBpbnRlcm5hbAorCSAgZGVjb2RlciBzdGF0ZSBmb3Igbm9uLWZhdGFsIHRoaW5ncyBsaWtlIGZsdXNoaW5nIHBhZHMgZXRjLiBPdGhlcgorCSAgdGhhbiB0aGF0LCB1c2UgR3N0U2VnbWVudCAoc2VnbWVudCBzZWVrcyBkb24ndCB3b3JrIHlldCB0aG91Z2gsIGJ1dAorCSAgc2hvdWxkIGJlIGVhc3kgdG8gYWRkKSwgdXNlIGJvaWxlcnBsYXRlIG1hY3JvcywgZHJvcCB0aGUgc3VwZXJmbHVvdXMKKwkgICdmbGFjZGVjOicgZnJvbSBkZWJ1ZyBtZXNzYWdlcywgdXNlIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQsIGFuZAorCSAgbG90cyBvZiBvdGhlciB0aGluZ3MuCisKKzIwMDUtMTItMTAgMTQ6NTc6NDggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogVXBkYXRlIGNvbW1lbnQgaW4gT1NTIGluY2x1ZGVzIGNoZWNrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIFVwZGF0ZSBjb21tZW50IGluIE9TUyBpbmNsdWRlcyBjaGVjay4KKwkgICogc3lzL29zcy9nc3Rvc3NkbWFidWZmZXIuYzoKKwkgICogc3lzL29zcy9nc3Rvc3NoZWxwZXIuYzoKKwkgICogc3lzL29zcy9nc3Rvc3NtaXhlci5jOgorCSAgKiBzeXMvb3NzL2dzdG9zc21peGVydHJhY2suYzoKKwkgICogc3lzL29zcy9nc3Rvc3NzaW5rLmM6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc3JjLmM6CisJICAqIHN5cy9vc3Mvb3NzX3Byb2JlLmM6CisJICBEb24ndCBhc3N1bWUgdGhlIE9TUyBzb3VuZGNhcmQuaCBpbmNsdWRlIGlzIGFsd2F5cyBpbgorCSAgdGhlIHN5cy8gZGlyZWN0b3J5LiBJbnN0ZWFkLCB1c2UgdGhlIGV4aXN0aW5nIGRlZmluZXMKKwkgIGZyb20gY29uZmlnLmggdG8gaW5jbHVkZSB0aGUgcmlnaHQgZmlsZS4gRml4ZXMKKwkgIGNvbXBpbGF0aW9uIG9uIE9wZW5CU0QgMy44ICgjMzIzNzE4KS4KKworMjAwNS0xMi0wOSAxOTo1MTowMyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBleHQvZmxhYy9nc3RmbGFjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmg6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmg6CisJICBib3JnaWZ5IGFuZCBmaXggdXAgZG9jdW1lbnRhdGlvbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBib3JnaWZ5IGFuZCBmaXggdXAgZG9jdW1lbnRhdGlvbgorCisyMDA1LTEyLTA5IDE1OjMwOjIxICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZXh0L2ZhYWQvZ3N0ZmFhZC5jOiBBc3N1bWUgdGhhdCBhbiB1bmtub3duIGNoYW5uZWwgbWFwcGluZyB3aXRoIDIgY2hhbm5lbHMgaXMgc3RlcmVvIGFuZCBwbGF5IGl0IHRoYXQgd2F5IGluc3RlYWQgb2YgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZhYWQvZ3N0ZmFhZC5jOiAoZ3N0X2ZhYWRfY2hhbnBvc190b19nc3QpLAorCSAgKGdzdF9mYWFkX3VwZGF0ZV9jYXBzKToKKwkgIEFzc3VtZSB0aGF0IGFuIHVua25vd24gY2hhbm5lbCBtYXBwaW5nIHdpdGggMiBjaGFubmVscworCSAgaXMgc3RlcmVvIGFuZCBwbGF5IGl0IHRoYXQgd2F5IGluc3RlYWQgb2YgZXJyb3JpbmcuCisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwKKwkgIChnc3RfcXRkZW11eF9hZGRfc3RyZWFtKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBIYW5kbGUgZS5nLiBqcGVnIHN0cmVhbXMgd2l0aCAwIGR1cmF0aW9uIGZyYW1lcyBhcyBoYXZpbmcgMCBmcmFtZXJhdGUuCisJICBEZWJ1ZyBmaXhlcy4gU29tZSA2NCBiaXQgdmFyaWFibGUgZml4ZXMKKworMjAwNS0xMi0wOSAxMToxMjo0OCArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IEFjY2VwdCBhIHdpZGVyIHJhbmdlIG9mIGZsYWMgZmlsZXMsIG1vcmUgY2xvc2VseSBtYXRjaGluZyBmbGFjIHNwCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAocmF3X2NhcHNfZmFjdG9yeSksIChnc3RfZmxhY2RlY193cml0ZSk6CisJICBBY2NlcHQgYSB3aWRlciByYW5nZSBvZiBmbGFjIGZpbGVzLCBtb3JlIGNsb3NlbHkgbWF0Y2hpbmcgZmxhYyBzcAorCisyMDA1LTEyLTA4IDE2OjI3OjEyICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOiBBZGQgbXVsdGlwYXJ0IGVsZW1lbnRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEyLTA4ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbTogQWRkIG11bHRpcGFydCBlbGVtZW50cy4KKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OiBGaXggZmxhYy4KKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogQWRkIGRvY3MuCisKKzIwMDUtMTItMDcgMTE6NDY6MTUgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogTWVtbGVhayBmaXhlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX2hlYWRlciksCisJICAoZ3N0X3F0ZGVtdXhfYWRkX3N0cmVhbSk6CisJICBNZW1sZWFrIGZpeGVzLgorCSAgU2VuZCBvdXQgRU9TIGZvciB2YWxpZCByZWFzb25zIChjb3VsZG4ndCBwdWxsX3JhbmdlKCkgZnJvbSB1cHN0cmVhbQorCSAgZm9yIGV4YW1wbGUpLgorCisyMDA1LTEyLTA3IDExOjQwOjQ2ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IE1lbWxlYWsgYW5kIGNyYXNoZXIgZml4ZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX2V2ZW50KSwKKwkgIChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXIpLAorCSAgKGdzdF9hdmlfZGVtdXhfaW52ZXJ0KToKKwkgIE1lbWxlYWsgYW5kIGNyYXNoZXIgZml4ZXMuCisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2Jhc2VfaW5pdCksCisJICAoZ3N0X3dhdnBhcnNlX2NyZWF0ZV9zb3VyY2VwYWQpLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKToKKwkgIE1lbWxlYWsgZml4ZXMKKworMjAwNS0xMi0wNiAxOTo1NTo1OCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyZWxlbWVudC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuaDoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuaDoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuaDoKKwkgIGV4cGFuZCB0YWJzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGV4cGFuZCB0YWJzCisKKzIwMDUtMTItMDYgMTk6NDQ6NTggKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmg6CisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuaDoKKwkqIGV4dC9kdi9nc3RkdmRlYy5oOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9kdi9nc3RkdmRlbXV4Lmg6CisJKiBleHQvZXNkL2VzZHNpbmsuaDoKKwkqIGV4dC9mbGFjL2ZsYWNfY29tcGF0Lmg6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmg6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmg6CisJKiBleHQvZ2NvbmYvZ2NvbmYuaDoKKwkqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5oOgorCSogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zaW5rLmg6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGthbmltYXRpb24uaDoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkqIGV4dC9qcGVnL3Ntb2tlY29kZWMuaDoKKwkqIGV4dC9qcGVnL3Ntb2tlZm9ybWF0Lmg6CisJKiBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5oOgorCSogZXh0L2xhZHNwYS9zZWFyY2guYzoKKwkqIGV4dC9sYWRzcGEvdXRpbHMuaDoKKwkqIGV4dC9saWJtbmcvZ3N0bW5nZGVjLmg6CisJKiBleHQvbGlibW5nL2dzdG1uZ2VuYy5jOgorCSogZXh0L2xpYm1uZy9nc3RtbmdlbmMuaDoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5oOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuaDoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5oOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuaDoKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuaDoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuaDoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmg6CisJKiBnc3QvZGVidWcvdGVzdHMuYzoKKwkqIGdzdC9kZWJ1Zy90ZXN0cy5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSogZ3N0L2ZseC9mbHhfZm10Lmg6CisJKiBnc3QvZmx4L2dzdGZseGRlYy5oOgorCSogZ3N0L2dvb20vZmlsdGVycy5jOgorCSogZ3N0L2dvb20vZmlsdGVycy5oOgorCSogZ3N0L2dvb20vZ29vbV90b29scy5oOgorCSogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOgorCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuaDoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkqIGdzdC9tb25vc2NvcGUvY29udm9sdmUuYzoKKwkqIGdzdC9tb25vc2NvcGUvY29udm9sdmUuaDoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJKiBnc3Qvb2xkY29yZS9nc3RhZ2dyZWdhdG9yLmM6CisJKiBnc3Qvb2xkY29yZS9nc3RhZ2dyZWdhdG9yLmg6CisJKiBnc3Qvb2xkY29yZS9nc3RtZDVzaW5rLmM6CisJKiBnc3Qvb2xkY29yZS9nc3RtZDVzaW5rLmg6CisJKiBnc3Qvb2xkY29yZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkqIGdzdC9vbGRjb3JlL2dzdG11bHRpZmlsZXNyYy5oOgorCSogZ3N0L29sZGNvcmUvZ3N0cGlwZWZpbHRlci5oOgorCSogZ3N0L29sZGNvcmUvZ3N0c2hhcGVyLmg6CisJKiBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cEwxNnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuaDoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmg6CisJKiBnc3QvcnRzcC9ydHNwZGVmcy5oOgorCSogZ3N0L3J0c3AvcnRzcG1lc3NhZ2UuaDoKKwkqIGdzdC9ydHNwL3J0c3B0cmFuc3BvcnQuaDoKKwkqIGdzdC9ydHNwL3J0c3B1cmwuYzoKKwkqIGdzdC9ydHNwL3J0c3B1cmwuaDoKKwkqIGdzdC9ydHNwL3NkcG1lc3NhZ2UuYzoKKwkqIGdzdC9ydHNwL3NkcG1lc3NhZ2UuaDoKKwkqIGdzdC9zbXB0ZS9iYXJib3h3aXBlcy5jOgorCSogZ3N0L3NtcHRlL2dzdG1hc2suaDoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5oOgorCSogZ3N0L3NtcHRlL3BhaW50LmM6CisJKiBnc3Qvc21wdGUvcGFpbnQuaDoKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5oOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaDoKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmg6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSogZ3N0L3dhdmVuYy9yaWZmLmg6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuaDoKKwkqIHN5cy9vc3MvZ3N0b3NzZG1hYnVmZmVyLmg6CisJKiBzeXMvb3NzL2dzdG9zc21peGVyLmg6CisJKiBzeXMvb3NzL2dzdG9zc21peGVyZWxlbWVudC5oOgorCSogc3lzL29zcy9nc3Rvc3NtaXhlcnRyYWNrLmg6CisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzoKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5oOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkqIHN5cy9vc3MvZ3N0b3Nzc3JjLmg6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9lbGVtZW50Lmg6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmg6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuaDoKKwkgIGV4cGFuZCB0YWJzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGV4cGFuZCB0YWJzCisKKzIwMDUtMTItMDUgMTg6MTI6MDcgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBiYWNrIHRvIEhFQUQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYmFjayB0byBIRUFECisKKz09PSByZWxlYXNlIDAuMTAuMCA9PT0KKworMjAwNS0xMi0wNSAxODowMzoyMyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJICByZWxlYXNpbmcgMC4xMC4wCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbGVhc2luZyAwLjEwLjAKKworMjAwNS0xMi0wNSAxODowMTo0OCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdGRlbXV4LnhtbDoKKwkgIHJlbGVhc2luZyAwLjEwLjAKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmVsZWFzaW5nIDAuMTAuMAorCisyMDA1LTEyLTA1IDE2OjIxOjA4ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDA1LTEyLTA1IDE1OjA4OjQ2ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogTWFrZWZpbGUuYW06CisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vY3MucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJICB1cGRhdGUgdHJhbnNsYXRpb25zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAwNS0xMi0wNSAxMzowNDoyMiArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBVcGRhdGUgZm9yIGFsbG9jX2J1ZmZlciBjaGFuZ2VzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEyLTA1ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBleHQvZmFhYy9nc3RmYWFjLmM6IChnc3RfZmFhY19zaW5rX2V2ZW50KSwgKGdzdF9mYWFjX2NoYWluKToKKwkgICogZXh0L2ZhYWQvZ3N0ZmFhZC5jOiAoZ3N0X2ZhYWRfY2hhaW4pOgorCSAgKiBleHQvaGVybWVzL2dzdGhlcm1lc2NvbG9yc3BhY2UuYzogKGdzdF9oZXJtZXNfY29sb3JzcGFjZV9jaGFpbik6CisJICAqIGV4dC9sY3MvZ3N0Y29sb3JzcGFjZS5jOiAoZ3N0X2NvbG9yc3BhY2VfY2hhaW4pOgorCSAgKiBleHQveGluZS94aW5laW5wdXQuYzogKGdzdF94aW5lX2lucHV0X2dldCk6CisJICAqIGdzdC9jb2xvcnNwYWNlL2dzdGNvbG9yc3BhY2UuYzogKGdzdF9jb2xvcnNwYWNlX2NoYWluKToKKwkgICogZ3N0L3NwZWVkL2dzdHNwZWVkLmM6IChzcGVlZF9jaGFpbik6CisJICAqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6IChnc3RfdmlkZW9fY3JvcF9jaGFpbik6IFVwZGF0ZSBmb3IKKwkgIGFsbG9jX2J1ZmZlciBjaGFuZ2VzLgorCisyMDA1LTEyLTA1IDEzOjAzOjAwICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIFVwZGF0ZSBmb3IgYWxsb2NfYnVmZmVyIGNoYW5nZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTItMDUgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisJICAqIGV4dC9kdi9nc3RkdmRlYy5jOiAoZ3N0X2R2ZGVjX2NoYWluKToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNkZWNfd3JpdGUpOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IChnc3RfZmxhY2VuY193cml0ZV9jYWxsYmFjayk6CisJICAqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOiAoZ3N0X2dka19waXhidWZfY2hhaW4pOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5jOiAoZ3N0X3BpeGJ1ZnNjYWxlX2NoYWluKToKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2pwZWdfZGVjX2NoYWluKToKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOiAoZ3N0X2pwZWdlbmNfY2hhaW4pOgorCSAgKiBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5jOiAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfcHJvY2Vzcyk6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6ICh1c2VyX2luZm9fY2FsbGJhY2spLCAoZ3N0X3BuZ2RlY190YXNrKToKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IChzcGVleF9kZWNfY2hhaW4pOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleGVuY19jaGFpbik6CisJICAqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzogKGdzdF9hdXBhcnNlX2NoYWluKToKKwkgICogZ3N0L2ZseC9nc3RmbHhkZWMuYzogKGdzdF9mbHhkZWNfY2hhaW4pOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnc3RfZ29vbV9jaGFpbik6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wdXNoX3ZvcmJpc19jb2RlY19wcml2X2RhdGEpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfd3Zwa19oZWFkZXIpOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6IChnc3RfbXVsdGlwYXJ0X2RlbXV4X2NoYWluKToKKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogKGdzdF9tdWx0aXBhcnRfbXV4X2NvbGxlY3RlZCk6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogKGdzdF92aWRlb21peGVyX2NvbGxlY3RlZCk6CisJICAqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChnc3Rfd2F2ZW5jX2NoYWluKTogVXBkYXRlIGZvcgorCSAgYWxsb2NfYnVmZmVyIGNoYW5nZXMuCisKKzIwMDUtMTItMDUgMTI6MjM6MjIgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOiBSZW1vdmUgYXJncyBmb3IgcGx1Z2lucyB0aGF0IGFyZW4ndCBpbiAtZ29vZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICBSZW1vdmUgYXJncyBmb3IgcGx1Z2lucyB0aGF0IGFyZW4ndCBpbiAtZ29vZC4KKworMjAwNS0xMi0wNCAyMjoyNjowNyArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICByZW1vdmUgcGFuZ28gcGx1Z2luIGFzIGl0cyBnb25lIGludG8gYmFzZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZW1vdmUgcGFuZ28gcGx1Z2luIGFzIGl0cyBnb25lIGludG8gYmFzZQorCisyMDA1LTEyLTAzIDE4OjUxOjQ4ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSAgZml4IGVsZW1lbnQgZGVzY3JpcHRpb25zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZpeCBlbGVtZW50IGRlc2NyaXB0aW9ucworCisyMDA1LTEyLTAzIDE4OjUwOjEyICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZkc3JjLnhtbDoKKwkgIHJlbW92ZSBmZHNyYyBkb2NzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbW92ZSBmZHNyYyBkb2NzCisKKzIwMDUtMTItMDEgMTk6MTg6MDggKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBiYWNrIHRvIEhFQUQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYmFjayB0byBIRUFECisKKz09PSByZWxlYXNlIDAuOS43ID09PQorCisyMDA1LTEyLTAxIDE5OjE0OjI2ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkgIHJlbGVhc2luZyAwLjkuNworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZWxlYXNpbmcgMC45LjcKKworMjAwNS0xMi0wMSAxOToxMzoyMCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdGRlbXV4LnhtbDoKKwkgIHJlbGVhc2luZyAwLjkuNworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZWxlYXNpbmcgMC45LjcKKworMjAwNS0xMi0wMSAxNzo1MzoyOSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGNvbW1vbjoKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAwNS0xMi0wMSAxNTozNDoxMyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGRvY3MvcGx1Z2lucy8uZ2l0aWdub3JlOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSAgYWRkIG11bHRpcGFydCBwbHVnaW4gdG8gZG9jcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgbXVsdGlwYXJ0IHBsdWdpbiB0byBkb2NzCisKKzIwMDUtMTItMDEgMTU6MjI6MjUgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvcGFuZ28vTWFrZWZpbGUuYW06CisJKiBleHQvcGFuZ28vZ3N0Y2xvY2tvdmVybGF5LmM6CisJKiBleHQvcGFuZ28vZ3N0Y2xvY2tvdmVybGF5Lmg6CisJKiBleHQvcGFuZ28vZ3N0dGV4dG92ZXJsYXkuYzoKKwkqIGV4dC9wYW5nby9nc3R0ZXh0b3ZlcmxheS5oOgorCSogZXh0L3BhbmdvL2dzdHRleHRyZW5kZXIuYzoKKwkqIGV4dC9wYW5nby9nc3R0ZXh0cmVuZGVyLmg6CisJKiBleHQvcGFuZ28vZ3N0dGltZW92ZXJsYXkuYzoKKwkqIGV4dC9wYW5nby9nc3R0aW1lb3ZlcmxheS5oOgorCSAgbW92ZSBwYW5nbyB0byBiYXNlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIG1vdmUgcGFuZ28gdG8gYmFzZQorCisyMDA1LTEyLTAxIDE0OjM5OjMwICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgZ3N0L3J0cC86IHBhcnNlcnMgYXJlIGRlcGF5ZXJzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2cGFyc2UuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZwYXJzZS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBnc21wYXJzZS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGdzbXBhcnNlLmg6CisJICBwYXJzZXJzIGFyZSBkZXBheWVycworCisyMDA1LTEyLTAxIDE0OjMwOjAxICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogY29tbW9uOgorCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0YXN0ZXJpc2toMjYzLmM6CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBMMTZlbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZW5jLmg6CisJKiBnc3QvcnRwL2dzdHJ0cEwxNnBhcnNlLmM6CisJKiBnc3QvcnRwL2dzdHJ0cEwxNnBhcnNlLmg6CisJKiBnc3QvcnRwL2dzdHJ0cEwxNnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlYy5oOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBhbXJlbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZW5jLmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGRlYy5oOgorCSogZ3N0L3J0cC9nc3RydHBkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzExZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFkZWMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzExZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFlbmMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzExcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21lbmMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGFyc2UuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGFyc2UuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNlbmMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVjLmg6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGVuYy5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2ZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZWMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2ZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZlbmMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlYy5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFkZWMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWVuYy5oOgorCSogZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVjLmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleGVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleGVuYy5oOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5oOgorCSAgRG8gYnVyZ2VyJ3MgcmVuYW1lIGZvciBydHAgcGF5bG9hZGVycyBhbmQgZGVwYXlsb2FkZXJzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIERvIGJ1cmdlcidzIHJlbmFtZSBmb3IgcnRwIHBheWxvYWRlcnMgYW5kIGRlcGF5bG9hZGVycworCisyMDA1LTExLTMwIDE5OjAyOjM1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvZHYvOiBGaXggc2Vla2luZyBpbiBkdmRlbXV4IGFnYWluLCBhZGQgc29tZSBtb3JlIGRlYnVnIGluZm8uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVjLmM6IChnc3RfZHZkZWNfY2hhaW4pOgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5jOiAoZ3N0X2R2ZGVtdXhfZGVtdXhfZnJhbWUpOgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5oOgorCSAgRml4IHNlZWtpbmcgaW4gZHZkZW11eCBhZ2FpbiwgYWRkIHNvbWUgbW9yZSBkZWJ1ZyBpbmZvLgorCisyMDA1LTExLTMwIDE4OjQ4OjU2ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogY29uZmlndXJlLmFjOgorCSAgZml4IHRlc3RzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZpeCB0ZXN0cworCisyMDA1LTExLTMwIDE4OjQwOjE5ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogTWFrZWZpbGUuYW06CisJICBhZGQgdGVzdHMgc3ViZGlyCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCB0ZXN0cyBzdWJkaXIKKworMjAwNS0xMS0zMCAxODozNjowMiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgYWRkIE1ha2VmaWxlLmFtCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCBNYWtlZmlsZS5hbQorCisyMDA1LTExLTMwIDE4OjI4OjUzICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgbW92ZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIFBPUlRFRF8wOToKKwkgICogZG9jcy9yYW5kb20vUE9SVEVEXzA5OgorCSAgbW92ZQorCSAgKiB0ZXN0cy9NYWtlZmlsZS5hbToKKwkgIGFkZAorCSAgKiB3aW4zMi9nc3Quc2xuOgorCSAgcmVtb3ZlCisKKzIwMDUtMTEtMzAgMTg6MjQ6MDggKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBNYWtlZmlsZS5hbToKKwkqIGNoZWNrLy5naXRpZ25vcmU6CisJKiBjaGVjay9NYWtlZmlsZS5hbToKKwkqIGNoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiBjaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSogY2hlY2svZWxlbWVudHMvbWF0cm9za2FtdXguYzoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4YW1wbGVzL01ha2VmaWxlLmFtOgorCSogZXhhbXBsZXMvY2Fwc2ZpbHRlci9NYWtlZmlsZS5hbToKKwkqIGV4YW1wbGVzL2NhcHNmaWx0ZXIvY2Fwc2ZpbHRlcjEuYzoKKwkqIGV4YW1wbGVzL2dvYi9NYWtlZmlsZS5hbToKKwkqIGV4YW1wbGVzL2dvYi9nc3QtaWRlbnRpdHkyLmdvYjoKKwkqIGV4YW1wbGVzL2dzdHBsYXkvLmdpdGlnbm9yZToKKwkqIGV4YW1wbGVzL2dzdHBsYXkvTWFrZWZpbGUuYW06CisJKiBleGFtcGxlcy9nc3RwbGF5L3BsYXllci5jOgorCSogZXhhbXBsZXMvaW5kZXhpbmcvLmdpdGlnbm9yZToKKwkqIGV4YW1wbGVzL2luZGV4aW5nL01ha2VmaWxlLmFtOgorCSogZXhhbXBsZXMvaW5kZXhpbmcvaW5kZXhtcGVnLmM6CisJKiBleGFtcGxlcy9sZXZlbC9NYWtlZmlsZS5hbToKKwkqIGV4YW1wbGVzL2xldmVsL1JFQURNRToKKwkqIGV4YW1wbGVzL2xldmVsL2RlbW8uYzoKKwkqIGV4YW1wbGVzL2xldmVsL3Bsb3QuYzoKKwkqIGV4YW1wbGVzL3N0YXRzL01ha2VmaWxlLmFtOgorCSogZXhhbXBsZXMvc3RhdHMvbXAyb2dnLmM6CisJKiBleGFtcGxlcy9zd2l0Y2gvLmdpdGlnbm9yZToKKwkqIGV4YW1wbGVzL3N3aXRjaC9NYWtlZmlsZS5hbToKKwkqIGV4YW1wbGVzL3N3aXRjaC9zd2l0Y2hlci5jOgorCSAgbW92ZSB1bmRlciB0ZXN0cworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBtb3ZlIHVuZGVyIHRlc3RzCisKKzIwMDUtMTEtMzAgMTY6NTc6NTcgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogY29tbW9uOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgdXBkYXRlIGZvciBsYXRlc3QgY2hhbmdlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICB1cGRhdGUgZm9yIGxhdGVzdCBjaGFuZ2VzCisKKzIwMDUtMTEtMzAgMTQ6NTM6MjkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9wYW5nby9nc3R0ZXh0cmVuZGVyLio6IEFkZCBtaXNzaW5nIGZpbGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9wYW5nby9nc3R0ZXh0cmVuZGVyLmM6IChnc3RfdGV4dF9yZW5kZXJfYmFzZV9pbml0KSwKKwkgIChnc3RfdGV4dF9yZW5kZXJfY2xhc3NfaW5pdCksIChyZXNpemVfYml0bWFwKSwKKwkgIChnc3RfdGV4dF9yZW5kZXJfcmVuZGVyX3RleHQpLCAoZ3N0X3RleHRfcmVuZGVyX3NldGNhcHMpLAorCSAgKGdzdF90ZXh0X3JlbmRlcl9maXhhdGVfY2FwcyksIChnc3RfdGV4dF9yZW5kZXJlcl9iaXRtYXBfdG9fYXl1diksCisJICAoZ3N0X3RleHRfcmVuZGVyX2NoYWluKSwgKGdzdF90ZXh0X3JlbmRlcl9maW5hbGl6ZSksCisJICAoZ3N0X3RleHRfcmVuZGVyX2luaXQpLCAoZ3N0X3RleHRfcmVuZGVyX3NldF9wcm9wZXJ0eSk6CisJICAqIGV4dC9wYW5nby9nc3R0ZXh0cmVuZGVyLmg6CisJICBBZGQgbWlzc2luZyBmaWxlcy4KKworMjAwNS0xMS0zMCAxMzoyMDo1NyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgUG9ydCBwYW5nby1iYXNlZCB0ZXh0b3ZlcmxheSwgdGltZW92ZXJsYXkgYW5kIHRleHRyZW5kZXIgdG8gMC45IGFuZCBhZGQgYmFja2dyb3VuZCBzaGFkaW5nIGFuZCB0ZXh0IHdyYXBwaW5nIG1vZGVzLiBNLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBleHQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9wYW5nby9NYWtlZmlsZS5hbToKKwkgICogZXh0L3BhbmdvL2dzdGNsb2Nrb3ZlcmxheS5jOiAoZ3N0X2Nsb2NrX292ZXJsYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfY2xvY2tfb3ZlcmxheV9yZW5kZXJfdGltZSksIChnc3RfY2xvY2tfb3ZlcmxheV9nZXRfdGV4dCksCisJICAoZ3N0X2Nsb2NrX292ZXJsYXlfY2xhc3NfaW5pdCksIChnc3RfY2xvY2tfb3ZlcmxheV9pbml0KToKKwkgICogZXh0L3BhbmdvL2dzdGNsb2Nrb3ZlcmxheS5oOgorCSAgKiBleHQvcGFuZ28vZ3N0dGV4dG92ZXJsYXkuYzogKGdzdF90ZXh0X292ZXJsYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X2dldF90ZXh0KSwgKGdzdF90ZXh0X292ZXJsYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3RleHRfb3ZlcmxheV9maW5hbGl6ZSksIChnc3RfdGV4dF9vdmVybGF5X2luaXQpLAorCSAgKGdzdF90ZXh0X292ZXJsYXlfdXBkYXRlX3dyYXBfbW9kZSksIChnc3RfdGV4dF9vdmVybGF5X3NldGNhcHMpLAorCSAgKGdzdF90ZXh0X292ZXJsYXlfdGV4dF9wYWRfbGlua2VkKSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X3RleHRfcGFkX3VubGlua2VkKSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X3NldF9wcm9wZXJ0eSksIChnc3RfdGV4dF9vdmVybGF5X2dldGNhcHMpLAorCSAgKGdzdF90ZXh0X292ZXJsYXlfc2hhZGVfeSksIChnc3RfdGV4dF9vdmVybGF5X2JsaXRfeXV2NDIwKSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X3Jlc2l6ZV9iaXRtYXApLCAoZ3N0X3RleHRfb3ZlcmxheV9yZW5kZXJfdGV4dCksCisJICAoZ3N0X3RleHRfb3ZlcmxheV9wdXNoX2ZyYW1lKSwgKGdzdF90ZXh0X292ZXJsYXlfcG9wX3ZpZGVvKSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X3BvcF90ZXh0KSwgKGdzdF90ZXh0X292ZXJsYXlfY29sbGVjdGVkKSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X2NoYW5nZV9zdGF0ZSksIChwbHVnaW5faW5pdCk6CisJICAqIGV4dC9wYW5nby9nc3R0ZXh0b3ZlcmxheS5oOgorCSAgKiBleHQvcGFuZ28vZ3N0dGltZW92ZXJsYXkuYzogKGdzdF90aW1lX292ZXJsYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfdGltZV9vdmVybGF5X3JlbmRlcl90aW1lKSwgKGdzdF90aW1lX292ZXJsYXlfZ2V0X3RleHQpLAorCSAgKGdzdF90aW1lX292ZXJsYXlfY2xhc3NfaW5pdCksIChnc3RfdGltZV9vdmVybGF5X2luaXQpOgorCSAgKiBleHQvcGFuZ28vZ3N0dGltZW92ZXJsYXkuaDoKKwkgIFBvcnQgcGFuZ28tYmFzZWQgdGV4dG92ZXJsYXksIHRpbWVvdmVybGF5IGFuZCB0ZXh0cmVuZGVyIHRvIDAuOQorCSAgYW5kIGFkZCBiYWNrZ3JvdW5kIHNoYWRpbmcgYW5kIHRleHQgd3JhcHBpbmcgbW9kZXMuIE1ha2UKKwkgIHRpbW92ZXJsYXkgZGVyaXZlIGZyb20gdGV4dG92ZXJsYXkuIEFsc28gYWRkIG5ldyBjbG9ja292ZXJsYXkKKwkgIGVsZW1lbnQuCisKKzIwMDUtMTEtMzAgMTE6MTA6MDEgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvdWRwL01ha2VmaWxlLmFtOiBNb3ZlZCB0byBuZXRidWZmZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTEtMzAgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L3VkcC9NYWtlZmlsZS5hbTogTW92ZWQgdG8gbmV0YnVmZmVyLgorCisyMDA1LTExLTMwIDEwOjE4OjQyICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgUG9ydGVkIG11bHRpcGFydCBtdXgvZGVtdXggdG8gMC45LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTExLTMwICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogUE9SVEVEX085OgorCSAgKiBnc3QvbXVsdGlwYXJ0L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJICAoZ3N0X211bHRpcGFydF9kZW11eF9iYXNlX2luaXQpLAorCSAgKGdzdF9tdWx0aXBhcnRfZGVtdXhfY2xhc3NfaW5pdCksIChnc3RfbXVsdGlwYXJ0X2RlbXV4X2luaXQpLAorCSAgKGdzdF9tdWx0aXBhcnRfZmluZF9wYWRfYnlfbWltZSksIChnc3RfbXVsdGlwYXJ0X2RlbXV4X2NoYWluKSwKKwkgIChnc3RfbXVsdGlwYXJ0X2RlbXV4X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X211bHRpcGFydF9kZW11eF9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IChnc3RfbXVsdGlwYXJ0X211eF9jbGFzc19pbml0KSwKKwkgIChnc3RfbXVsdGlwYXJ0X211eF9pbml0KSwgKGdzdF9tdWx0aXBhcnRfbXV4X2ZpbmFsaXplKSwKKwkgIChnc3RfbXVsdGlwYXJ0X211eF9zaW5rY29ubmVjdCksCisJICAoZ3N0X211bHRpcGFydF9tdXhfcmVxdWVzdF9uZXdfcGFkKSwKKwkgIChnc3RfbXVsdGlwYXJ0X211eF9oYW5kbGVfc3JjX2V2ZW50KSwKKwkgIChnc3RfbXVsdGlwYXJ0X211eF9xdWV1ZV9wYWRzKSwgKGdzdF9tdWx0aXBhcnRfbXV4X2NvbGxlY3RlZCksCisJICAoZ3N0X211bHRpcGFydF9tdXhfY2hhbmdlX3N0YXRlKTogUG9ydGVkIG11bHRpcGFydCBtdXgvZGVtdXggdG8KKwkgIDAuOS4KKworMjAwNS0xMS0zMCAwODoyNjo0NyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGdzdC86IHVwZGF0ZSBmb3Igc3ltYm9scyBjaGFuZ2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVidWcvZ3N0bmF2aWdhdGlvbnRlc3QuYzogKGdzdF9uYXZpZ2F0aW9udGVzdF9nZXRfdHlwZSk6CisJICAqIGdzdC9kZWJ1Zy9nc3RuYXZpZ2F0aW9udGVzdC5oOgorCSAgKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOiAoZ3N0X2FnaW5ndHZfZ2V0X3R5cGUpOgorCSAgKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6IChnc3RfZGljZXR2X2dldF90eXBlKToKKwkgICogZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5jOiAoZ3N0X2VkZ2V0dl9nZXRfdHlwZSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6IChnc3RfcXVhcmt0dl9nZXRfdHlwZSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdHJldi5jOiAoZ3N0X3JldnR2X2dldF90eXBlKToKKwkgICogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5jOiAoZ3N0X3NoYWdhZGVsaWN0dl9nZXRfdHlwZSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzogKGdzdF92ZXJ0aWdvdHZfZ2V0X3R5cGUpOgorCSAgKiBnc3QvZWZmZWN0di9nc3R3YXJwLmM6IChnc3Rfd2FycHR2X2dldF90eXBlKToKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOiAoZ3N0X3ZpZGVvX2ZsaXBfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfdmlkZW9fZmxpcF9nZXRfdHlwZSk6CisJICAqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuaDoKKwkgIHVwZGF0ZSBmb3Igc3ltYm9scyBjaGFuZ2UKKworMjAwNS0xMS0yOSAxNzo0NjowNCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGdzdC91ZHAvOiB0aGUgb2xkIGdzdG5ldCBsaWIgd2FzIHJlbmFtZWQgZ3N0bmV0YnVmZmVyICgjMzIyMjU3KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdGhlIG9sZCBnc3RuZXQgbGliIHdhcyByZW5hbWVkIGdzdG5ldGJ1ZmZlciAoIzMyMjI1NykKKworMjAwNS0xMS0yOSAxNTo0MjowMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6IEFjdHVhbGx5IHJlbmRlciB0aGUgdGV4dCBmcm9tIHRoZSB0ZXh0IHBhZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzogKGdzdF90ZXh0X292ZXJsYXlfcmVuZGVyX3RleHQpLAorCSAgKGdzdF90ZXh0X292ZXJsYXlfY29sbGVjdGVkKToKKwkgIEFjdHVhbGx5IHJlbmRlciB0aGUgdGV4dCBmcm9tIHRoZSB0ZXh0IHBhZC4KKworMjAwNS0xMS0yOSAxNDo0OTowMCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2RlYnVnLzogVXBkYXRlIGZvciBHc3RCYXNlVHJhbnNmb3JtIGV2ZW50IHZpcnR1YWwgbWV0aG9kCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlYnVnL2dzdG5hdnNlZWsuYzogKGdzdF9uYXZzZWVrX2V2ZW50KToKKwkgICogZ3N0L2RlYnVnL3Byb2dyZXNzcmVwb3J0LmM6IChnc3RfcHJvZ3Jlc3NfcmVwb3J0X2V2ZW50KToKKwkgIFVwZGF0ZSBmb3IgR3N0QmFzZVRyYW5zZm9ybSBldmVudCB2aXJ0dWFsIG1ldGhvZAorCisyMDA1LTExLTI5IDEwOjU1OjA5ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgZXh0L2NhaXJvL01ha2VmaWxlLmFtOiBubyBuZWVkIHRvIGxpbmsgdG8gdmlkZW9maWx0ZXIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMS0yOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKwkgICogZXh0L2NhaXJvL01ha2VmaWxlLmFtOgorCSAgbm8gbmVlZCB0byBsaW5rIHRvIHZpZGVvZmlsdGVyCisKKzIwMDUtMTEtMjkgMTA6NDY6MDAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBnc3QvZGVidWcvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVidWcvZ3N0bmF2aWdhdGlvbnRlc3QuaDoKKwkqIGdzdC9lZmZlY3R2L01ha2VmaWxlLmFtOgorCSogZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGRpY2UuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGVkZ2UuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJKiBnc3QvZWZmZWN0di9nc3RyZXYuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZpbHRlci5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmlsdGVyLmg6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmg6CisJICByZW1vdmUgdGhlIHZpZGVvZmlsdGVyIGxpYnJhcnkgYW5kIGxpbmsgdG8gdGhlIG9uZSBpbiBiYXNlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbW92ZSB0aGUgdmlkZW9maWx0ZXIgbGlicmFyeSBhbmQgbGluayB0byB0aGUgb25lIGluIGJhc2UKKworMjAwNS0xMS0yOSAwMTozMDo0MCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGNvbW1vbjoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuaDoKKwkgIGJvcmdpZnkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYm9yZ2lmeQorCisyMDA1LTExLTI4IDE3OjMxOjQ0ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IFVzZWxlc3MgY2hlY2sgbm93IHdlJ3JlIHNldHRpbmcgdGhlIGN1cnJlbnQgZW50cnkgY29ycmVjdGx5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcHJvY2Vzc19uZXh0X2VudHJ5KToKKwkgIFVzZWxlc3MgY2hlY2sgbm93IHdlJ3JlIHNldHRpbmcgdGhlIGN1cnJlbnQgZW50cnkgY29ycmVjdGx5LgorCisyMDA1LTExLTI4IDE2OjU0OjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvanBlZy9nc3RqcGVnZW5jLmM6IERvbid0IGxlYWsgaW5wdXQgYnVmZmVyIGluIGNoYWluIGZ1bmN0aW9uIChmaXhlcyAjMzIyNjY3KTsgbWFrZSBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24gdGhyZWFkLXMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6IChnc3RfanBlZ2VuY19yZXN5bmMpLCAoZ3N0X2pwZWdlbmNfY2hhaW4pLAorCSAgKGdzdF9qcGVnZW5jX3NldF9wcm9wZXJ0eSksIChnc3RfanBlZ2VuY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9qcGVnZW5jX2NoYW5nZV9zdGF0ZSk6CisJICBEb24ndCBsZWFrIGlucHV0IGJ1ZmZlciBpbiBjaGFpbiBmdW5jdGlvbiAoZml4ZXMgIzMyMjY2Nyk7IG1ha2UKKwkgIHN0YXRlIGNoYW5nZSBmdW5jdGlvbiB0aHJlYWQtc2FmZTsgZG9uJ3QgcmVwZWF0IHRoZSBjdXJyZW50IGZ1bmN0aW9uCisJICBuYW1lIGluIEdTVF9ERUJVRyBzdGF0ZW1lbnRzOyB1c2UgR1NUX1JPVU5EX1VQXyogbWFjcm9zOyB1c2UKKwkgIGdzdF9wYWRfYWxsb2NfYnVmZmVyKCk7IG1pc2MuIG1pbm9yIGNsZWFudXBzLgorCisyMDA1LTExLTI4IDE1OjQzOjI5ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBleHQvZmFhZC9nc3RmYWFkLmM6IEhhbmRsZSBncmFjZWZ1bGx5IHRoZSBjb25zZXF1ZW5jZSBvZiAiTWF4aW11bSBudW1iZXIgb2Ygc2NhbGVmYWN0b3IgYmFuZHMgZXhjZWVkZWQiLCB3aGljaCByZXN1bHQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmFhZC9nc3RmYWFkLmM6IChnc3RfZmFhZF9zcmNnZXRjYXBzKToKKwkgIEhhbmRsZSBncmFjZWZ1bGx5IHRoZSBjb25zZXF1ZW5jZSBvZiAiTWF4aW11bSBudW1iZXIgb2Ygc2NhbGVmYWN0b3IKKwkgIGJhbmRzIGV4Y2VlZGVkIiwgd2hpY2ggcmVzdWx0cyBpbiAwIGNoYW5uZWxzIHdpdGggc2FtcGxlcmF0ZXMgb2YgMC4KKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgIERvIHVwd2FyZCB0cmFuc2l0aW9ucywgdGhlbiBjYWxsIHBhcmVudCBzdGF0ZV9jaGFuZ2UsIHRoZW4gZG8KKwkgIGRvd253YXJkIHRyYW5zaXRpb25zLgorCisyMDA1LTExLTI4IDE1OjEzOjIyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBMb29rIGZvciBwaXhlbC1hc3BlY3QtcmF0aW8gaW4gY2Fwcywgbm90IHBpeGVsX3dpZHRoIGFuZCBwaXhlbF9oZWlnaHQgKEZpeGVzOiAjMzIyNjQ1KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIChnc3RfbWF0cm9za2FfbXV4X3ZpZGVvX3BhZF9zZXRjYXBzKToKKwkgIExvb2sgZm9yIHBpeGVsLWFzcGVjdC1yYXRpbyBpbiBjYXBzLCBub3QgcGl4ZWxfd2lkdGggYW5kCisJICBwaXhlbF9oZWlnaHQgKEZpeGVzOiAjMzIyNjQ1KQorCisyMDA1LTExLTI4IDEyOjU5OjA1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBGcm9tIE1pY2hhbCBCZW5lczogZnJhbWUgZHVyYXRpb24gc2hvdWxkIGJlIEdTVF9TRUNPTkQgLyBmcmFtZXJhdGUsIG5vdAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIChnc3RfbWF0cm9za2FfbXV4X3ZpZGVvX3BhZF9zZXRjYXBzKToKKwkgIEZyb20gTWljaGFsIEJlbmVzOgorCSAgZnJhbWUgZHVyYXRpb24gc2hvdWxkIGJlIEdTVF9TRUNPTkQgLyBmcmFtZXJhdGUsIG5vdAorCSAgR1NUX1NFQ09ORCAqIGZyYW1lcmF0ZS4gKEZpeGVzOiAjMzIyNjQzKQorCisyMDA1LTExLTI3IDE3OjAyOjUzICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgY29uZmlndXJlLmFjOiBmaXggdXAgR1NUX1BMVUdJTl9MREZMQUdTCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgZml4IHVwIEdTVF9QTFVHSU5fTERGTEFHUworCSAgKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOgorCSAgZml4IGluY2x1ZGVzIChzZWUgIzMxNzA0MykKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL01ha2VmaWxlLmFtOgorCSAgc3RvcCBpbnN0YWxsaW5nIHRoaXMgbGlicmFyeQorCisyMDA1LTExLTI3IDE1OjMwOjI1ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgbm8gbmVlZCBmb3IgYW4gQVNfTElCVE9PTCBjYWxsCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIG5vIG5lZWQgZm9yIGFuIEFTX0xJQlRPT0wgY2FsbAorCisyMDA1LTExLTI3IDE0OjMzOjMxICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogTWFrZWZpbGUuYW06CisJKiBjb21tb246CisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBhZGQgQUNMT0NBTF9BTUZMQUdTOyByZW1vdmUgb2xkIHN0dWZmIGZyb20gc3BlYyBjaGFuZ2Vsb2cKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkIEFDTE9DQUxfQU1GTEFHUzsgcmVtb3ZlIG9sZCBzdHVmZiBmcm9tIHNwZWMgY2hhbmdlbG9nCisKKzIwMDUtMTEtMjYgMTI6NTQ6NDcgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGV4dC9kdi9nc3RkdmRlYy5jOiBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGluY29taW5nIFZpZGVvIGR2IHN0cmVhbSBkb2Vzbid0IGhhdmUgYSBwaXhlbCBhc3BlY3QgcmF0aW8gc2V0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9kdi9nc3RkdmRlYy5jOiAoZ3N0X2R2ZGVjX3Npbmtfc2V0Y2Fwcyk6CisJICBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGluY29taW5nIFZpZGVvIGR2IHN0cmVhbSBkb2Vzbid0IGhhdmUKKwkgIGEgcGl4ZWwgYXNwZWN0IHJhdGlvIHNldC4KKworMjAwNS0xMS0yNSAyMjoxNDo0NyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBkb2N1bWVudCBmbGFjZGVjCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGRvY3VtZW50IGZsYWNkZWMKKworMjAwNS0xMS0yNSAyMTozNjoxOCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm8uYzoKKwkqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOgorCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5Lmg6CisJKiBleHQvY2Fpcm8vZ3N0dGltZW92ZXJsYXkuYzoKKwkqIGV4dC9jYWlyby9nc3R0aW1lb3ZlcmxheS5oOgorCSAgZG8gc29tZSBuYW1lIGJvcmdpZnlpbmcgZG9jdW1lbnQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZG8gc29tZSBuYW1lIGJvcmdpZnlpbmcKKwkgIGRvY3VtZW50CisKKzIwMDUtMTEtMjUgMjE6MDI6MTYgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBkb2N1bWVudGluZyBhdXRvKnNpbmsgdXNpbmcgc3Ryc3RyIGZvciB0aGUgdmlkZW8gc2luayBsb29rdXAsIGNsYXNzIGZpZWxkIGlzIG5vdCBvcmRlcmVkIHVwZGF0ZSBvdGhlciBwbHVnaW5zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkgIChnc3RfYXV0b19hdWRpb19zaW5rX2Jhc2VfaW5pdCk6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkgIChnc3RfYXV0b192aWRlb19zaW5rX2Jhc2VfaW5pdCksCisJICAoZ3N0X2F1dG9fdmlkZW9fc2lua19mYWN0b3J5X2ZpbHRlcik6CisJICBkb2N1bWVudGluZyBhdXRvKnNpbmsKKwkgIHVzaW5nIHN0cnN0ciBmb3IgdGhlIHZpZGVvIHNpbmsgbG9va3VwLCBjbGFzcyBmaWVsZCBpcyBub3Qgb3JkZXJlZAorCSAgdXBkYXRlIG90aGVyIHBsdWdpbnMKKworMjAwNS0xMS0yNSAxOTo1ODoxOSArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBleHQvd2F2cGFjay9NYWtlZmlsZS5hbToKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuaDoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmg6CisJICBXYXZwYWNrIHBvcnRlZCB0byAwLjkuIE5vIHN1cHBvcnQgZm9yIGNvcnJlY3Rpb24gZmlsZSB5ZXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFdhdnBhY2sgcG9ydGVkIHRvIDAuOS4gTm8gc3VwcG9ydCBmb3IgY29ycmVjdGlvbiBmaWxlIHlldC4KKworMjAwNS0xMS0yNSAxODoxNTo1MSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGV4dC93YXZwYWNrLzogcHV0IGJhY2sgd2F2cGFjayAtIHN0aWxsIG5lZWRzIHBvcnRpbmcKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrY29tbW9uLmg6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogKGdzdF93YXZwYWNrX2RlY19saW5rKSwKKwkgIChnc3Rfd2F2cGFja19kZWNfd3ZjbGluayksIChnc3Rfd2F2cGFja19kZWNfZ2V0X3R5cGUpLAorCSAgKGdzdF93YXZwYWNrX2RlY19iYXNlX2luaXQpLCAoZ3N0X3dhdnBhY2tfZGVjX2Rpc3Bvc2UpLAorCSAgKGdzdF93YXZwYWNrX2RlY19jbGFzc19pbml0KSwgKGdzdF93YXZwYWNrX2RlY19zcmNfcXVlcnkpLAorCSAgKGdzdF93YXZwYWNrX2RlY19pbml0KSwgKGdzdF93YXZwYWNrX2RlY19zZXR1cF9jb250ZXh0KSwKKwkgIChnc3Rfd2F2cGFja19kZWNfZm9ybWF0X3NhbXBsZXMpLCAoZ3N0X3dhdnBhY2tfZGVjX2xvb3ApLAorCSAgKGdzdF93YXZwYWNrX2RlY19wbHVnaW5faW5pdCk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuaDoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IChnc3Rfd2F2cGFja19wYXJzZV9nZXRfdHlwZSksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfYmFzZV9pbml0KSwgKGdzdF93YXZwYWNrX3BhcnNlX2Rpc3Bvc2UpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2NsYXNzX2luaXQpLCAoZ3N0X3dhdnBhY2tfcGFyc2Vfc3JjX3F1ZXJ5KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9zcmNfZXZlbnQpLCAoZmluZF9oZWFkZXIpLCAoZmluZF9zYW1wbGUpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX3NlZWspLCAoZ3N0X3dhdnBhY2tfcGFyc2VfaW5pdCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfaGFuZGxlX2V2ZW50KSwgKGdzdF93YXZwYWNrX3BhcnNlX2xvb3ApLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2NoYW5nZV9zdGF0ZSksIChnc3Rfd2F2cGFja19wYXJzZV9wbHVnaW5faW5pdCk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5oOgorCSAgcHV0IGJhY2sgd2F2cGFjayAtIHN0aWxsIG5lZWRzIHBvcnRpbmcKKworMjAwNS0xMS0yNSAxODowMzoyNCArMDAwMCAgU2ViYXN0aWVuIENvdGUgPHNlYmFzNjQyQHlhaG9vLmNhPgorCisJICBnc3QvdWRwL2dzdHVkcHNyYy5jOiBQYXRjaCBmcm9tIFNlYmFzdGllbiBDb3RlIHRvIGNsb3NlIGNvbnRyb2wgc29ja2V0cyBpbiB1ZHBzcmMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfc3RvcCk6CisJICBQYXRjaCBmcm9tIFNlYmFzdGllbiBDb3RlIHRvIGNsb3NlIGNvbnRyb2wgc29ja2V0cyBpbiB1ZHBzcmMuCisKKzIwMDUtMTEtMjQgMTU6MDc6MDYgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvZWZmZWN0di9nc3RxdWFyay5jOiBGbHVzaCB0aGUgcGxhbmVzIGxpc3Qgb24gcmV2ZXJzZSBjYXBzIG5lZ290aWF0aW9uLiBUaGlzIHdhcyBjcmFzaGluZyBiZWNhdXNlIG9mIGRpZmZlcmVudGx5IHMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMS0yNCAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBnc3QvZWZmZWN0di9nc3RxdWFyay5jOiAoZ3N0X3F1YXJrdHZfc2V0X2NhcHMpLAorCSAgKGdzdF9xdWFya3R2X2dldF91bml0X3NpemUpLCAoZ3N0X3F1YXJrdHZfdHJhbnNmb3JtKSwKKwkgIChnc3RfcXVhcmt0dl9wbGFuZXRhYmxlX2NsZWFyKSwgKGdzdF9xdWFya3R2X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3F1YXJrdHZfYmFzZV9pbml0KSwgKGdzdF9xdWFya3R2X2NsYXNzX2luaXQpLAorCSAgKGdzdF9xdWFya3R2X2luaXQpOiBGbHVzaCB0aGUgcGxhbmVzIGxpc3Qgb24gcmV2ZXJzZSBjYXBzCisJICBuZWdvdGlhdGlvbi4gVGhpcyB3YXMgY3Jhc2hpbmcgYmVjYXVzZSBvZiBkaWZmZXJlbnRseSBzaXplZAorCSAgYnVmZmVycy4KKworMjAwNS0xMS0yNCAxMjo1MDoyOCArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC86IEhhbmRsZSBzdHJpZGVzIGNvcnJlY3RseSwgZml4IGlkZW50aXR5IGZsaXBwaW5nLCBjb252ZXJ0IG5hdmlnYXRpb24gZXZlbnQgY29ycmVjdGx5IGFnYWluLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTExLTI0ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGdzdC9kZWJ1Zy9nc3RuYXZpZ2F0aW9udGVzdC5jOiAoZHJhd19ib3hfcGxhbmFyNDExKToKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSAgKGdzdF92aWRlb2ZsaXBfbWV0aG9kX2dldF90eXBlKSwKKwkgIChnc3RfdmlkZW9mbGlwX3NldF9jYXBzKSwgKGdzdF92aWRlb2ZsaXBfdHJhbnNmb3JtX2NhcHMpLAorCSAgKGdzdF92aWRlb2ZsaXBfZ2V0X3VuaXRfc2l6ZSksIChnc3RfdmlkZW9mbGlwX2ZsaXApLAorCSAgKGdzdF92aWRlb2ZsaXBfdHJhbnNmb3JtKSwgKGdzdF92aWRlb2ZsaXBfaGFuZGxlX3NyY19ldmVudCksCisJICAoZ3N0X3ZpZGVvZmxpcF9zZXRfcHJvcGVydHkpLCAoZ3N0X3ZpZGVvZmxpcF9iYXNlX2luaXQpLAorCSAgKGdzdF92aWRlb2ZsaXBfY2xhc3NfaW5pdCksIChnc3RfdmlkZW9mbGlwX2luaXQpOiBIYW5kbGUgc3RyaWRlcworCSAgY29ycmVjdGx5LCBmaXggaWRlbnRpdHkgZmxpcHBpbmcsIGNvbnZlcnQgbmF2aWdhdGlvbiBldmVudAorCSAgY29ycmVjdGx5IGFnYWluLgorCisyMDA1LTExLTI0IDExOjE2OjUzICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkqIFJFQURNRToKKwkgIEZpeCAjMzIwMjg4OiB3cm9uZyByZWFkbWUgaW4gcGx1Z2lucy1nb29kCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEZpeCAjMzIwMjg4OiB3cm9uZyByZWFkbWUgaW4gcGx1Z2lucy1nb29kCisKKzIwMDUtMTEtMjQgMTE6MDY6MjkgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBNYWtlZmlsZS5hbToKKwkgIGZpeCB0b3J0dXJlIHRhcmdldAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBmaXggdG9ydHVyZSB0YXJnZXQKKworMjAwNS0xMS0yMyAyMToyNTo1NiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIE1ha2VmaWxlLmFtOgorCSAgYWRkIGEgdG9ydHVyZSB0YXJnZXQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkIGEgdG9ydHVyZSB0YXJnZXQKKworMjAwNS0xMS0yMyAyMDowNToyNiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGJhY2sgdG8gSEVBRAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBiYWNrIHRvIEhFQUQKKworPT09IHJlbGVhc2UgMC45LjYgPT09CisKKzIwMDUtMTEtMjMgMTk6NTc6NDkgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXRkZW11eC54bWw6CisJICByZWxlYXNpbmcgMC45LjYKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmVsZWFzaW5nIDAuOS42CisKKzIwMDUtMTEtMjMgMTk6NTY6MzEgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJICByZWxlYXNpbmcgMC45LjYKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmVsZWFzaW5nIDAuOS42CisKKzIwMDUtMTEtMjMgMTk6MTQ6MDcgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkgIGFkZGluZyBjdXR0ZXIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkaW5nIGN1dHRlcgorCisyMDA1LTExLTIzIDE5OjA1OjI5ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDA1LTExLTIzIDE2OjQ5OjE2ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2RlYnVnL2dzdG5hdmlnYXRpb250ZXN0LmM6IE9vcHMsIGluaXRpYWxpc2UgdGhlIGZyYW1lcmF0ZSBHVmFsdWUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVidWcvZ3N0bmF2aWdhdGlvbnRlc3QuYzogKGdzdF9uYXZpZ2F0aW9udGVzdF9pbml0KToKKwkgIE9vcHMsIGluaXRpYWxpc2UgdGhlIGZyYW1lcmF0ZSBHVmFsdWUKKworMjAwNS0xMS0yMyAxNTo1MDo1MSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIFZpZGVvRmlsdGVyIGluaGVyaXRzIGZyb20KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMS0yMyAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBleHQvY2Fpcm8vZ3N0dGltZW92ZXJsYXkuYzoKKwkgIChnc3RfdGltZW92ZXJsYXlfdXBkYXRlX2ZvbnRfaGVpZ2h0KSwKKwkgIChnc3RfdGltZW92ZXJsYXlfc2V0X2NhcHMpLCAoZ3N0X3RpbWVvdmVybGF5X2dldF91bml0X3NpemUpLAorCSAgKGdzdF90aW1lb3ZlcmxheV90cmFuc2Zvcm0pLCAoZ3N0X3RpbWVvdmVybGF5X2Jhc2VfaW5pdCksCisJICAoZ3N0X3RpbWVvdmVybGF5X2NsYXNzX2luaXQpLCAoZ3N0X3RpbWVvdmVybGF5X2luaXQpLAorCSAgKGdzdF90aW1lb3ZlcmxheV9nZXRfdHlwZSk6CisJICAqIGV4dC9jYWlyby9nc3R0aW1lb3ZlcmxheS5oOgorCSAgKiBnc3QvZGVidWcvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWJ1Zy9nc3RuYXZpZ2F0aW9udGVzdC5jOgorCSAgKGdzdF9uYXZpZ2F0aW9udGVzdF9oYW5kbGVfc3JjX2V2ZW50KSwKKwkgIChnc3RfbmF2aWdhdGlvbnRlc3RfZ2V0X3VuaXRfc2l6ZSksCisJICAoZ3N0X25hdmlnYXRpb250ZXN0X3NldF9jYXBzKSwKKwkgIChnc3RfbmF2aWdhdGlvbnRlc3RfdHJhbnNmb3JtKSwKKwkgIChnc3RfbmF2aWdhdGlvbnRlc3RfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfbmF2aWdhdGlvbnRlc3RfYmFzZV9pbml0KSwgKGdzdF9uYXZpZ2F0aW9udGVzdF9jbGFzc19pbml0KSwKKwkgIChnc3RfbmF2aWdhdGlvbnRlc3RfaW5pdCksIChnc3RfbmF2aWdhdGlvbnRlc3RfZ2V0X3R5cGUpLAorCSAgKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L2RlYnVnL2dzdG5hdmlnYXRpb250ZXN0Lmg6CisJICAqIGdzdC9lZmZlY3R2L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOiAoZ3N0X2FnaW5ndHZfc2V0X2NhcHMpLAorCSAgKGdzdF9hZ2luZ3R2X2dldF91bml0X3NpemUpLCAoZ3N0X2FnaW5ndHZfdHJhbnNmb3JtKSwKKwkgIChnc3RfYWdpbmd0dl9iYXNlX2luaXQpLCAoZ3N0X2FnaW5ndHZfY2xhc3NfaW5pdCksCisJICAoZ3N0X2FnaW5ndHZfaW5pdCksIChnc3RfYWdpbmd0dl9nZXRfdHlwZSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdGRpY2UuYzogKGdzdF9kaWNldHZfc2V0X2NhcHMpLAorCSAgKGdzdF9kaWNldHZfZ2V0X3VuaXRfc2l6ZSksIChnc3RfZGljZXR2X3RyYW5zZm9ybSksCisJICAoZ3N0X2RpY2V0dl9iYXNlX2luaXQpLCAoZ3N0X2RpY2V0dl9jbGFzc19pbml0KSwKKwkgIChnc3RfZGljZXR2X2luaXQpLAorCSAgKGdzdF9kaWNldHZfZ2V0X3R5cGUpOgorCSAgKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6IChnc3RfZWRnZXR2X3NldF9jYXBzKSwKKwkgIChnc3RfZWRnZXR2X2dldF91bml0X3NpemUpLCAoZ3N0X2VkZ2V0dl90cmFuc2Zvcm0pLAorCSAgKGdzdF9lZGdldHZfYmFzZV9pbml0KSwgKGdzdF9lZGdldHZfY2xhc3NfaW5pdCksCisJICAoZ3N0X2VkZ2V0dl9pbml0KSwKKwkgIChnc3RfZWRnZXR2X2dldF90eXBlKToKKwkgICogZ3N0L2VmZmVjdHYvZ3N0ZWZmZWN0di5jOgorCSAgKiBnc3QvZWZmZWN0di9nc3RlZmZlY3R2Lmg6CisJICAqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6IChnc3RfcXVhcmt0dl9zZXRfY2FwcyksCisJICAoZ3N0X3F1YXJrdHZfZ2V0X3VuaXRfc2l6ZSksIChmYXN0cmFuZCksCisJICAoZ3N0X3F1YXJrdHZfdHJhbnNmb3JtKSwKKwkgIChnc3RfcXVhcmt0dl9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3F1YXJrdHZfYmFzZV9pbml0KSwKKwkgIChnc3RfcXVhcmt0dl9jbGFzc19pbml0KSwgKGdzdF9xdWFya3R2X2luaXQpLAorCSAgKGdzdF9xdWFya3R2X2dldF90eXBlKToKKwkgICogZ3N0L2VmZmVjdHYvZ3N0cmV2LmM6IChnc3RfcmV2dHZfc2V0X2NhcHMpLAorCSAgKGdzdF9yZXZ0dl9nZXRfdW5pdF9zaXplKSwgKGdzdF9yZXZ0dl90cmFuc2Zvcm0pLAorCSAgKGdzdF9yZXZ0dl9iYXNlX2luaXQpLCAoZ3N0X3JldnR2X2NsYXNzX2luaXQpLCAoZ3N0X3JldnR2X2luaXQpLAorCSAgKGdzdF9yZXZ0dl9nZXRfdHlwZSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYzogKGdzdF9zaGFnYWRlbGljdHZfc2V0X2NhcHMpLAorCSAgKGdzdF9zaGFnYWRlbGljdHZfZ2V0X3VuaXRfc2l6ZSksIChnc3Rfc2hhZ2FkZWxpY3R2X3RyYW5zZm9ybSksCisJICAoZ3N0X3NoYWdhZGVsaWN0dl9iYXNlX2luaXQpLCAoZ3N0X3NoYWdhZGVsaWN0dl9jbGFzc19pbml0KSwKKwkgIChnc3Rfc2hhZ2FkZWxpY3R2X2luaXQpLCAoZ3N0X3NoYWdhZGVsaWN0dl9nZXRfdHlwZSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzogKGdzdF92ZXJ0aWdvdHZfc2V0X2NhcHMpLAorCSAgKGdzdF92ZXJ0aWdvdHZfZ2V0X3VuaXRfc2l6ZSksIChnc3RfdmVydGlnb3R2X3RyYW5zZm9ybSksCisJICAoZ3N0X3ZlcnRpZ290dl9iYXNlX2luaXQpLCAoZ3N0X3ZlcnRpZ290dl9jbGFzc19pbml0KSwKKwkgIChnc3RfdmVydGlnb3R2X2luaXQpLCAoZ3N0X3ZlcnRpZ290dl9nZXRfdHlwZSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzogKGdzdF93YXJwdHZfc2V0X2NhcHMpLAorCSAgKGdzdF93YXJwdHZfZ2V0X3VuaXRfc2l6ZSksIChnc3Rfd2FycHR2X3RyYW5zZm9ybSksCisJICAoZ3N0X3dhcnB0dl9iYXNlX2luaXQpLCAoZ3N0X3dhcnB0dl9jbGFzc19pbml0KSwKKwkgIChnc3Rfd2FycHR2X2luaXQpLAorCSAgKGdzdF93YXJwdHZfZ2V0X3R5cGUpOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5oOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9maWx0ZXIuYzogKGdzdF92aWRlb2ZpbHRlcl9nZXRfdHlwZSksCisJICAoZ3N0X3ZpZGVvZmlsdGVyX2NsYXNzX2luaXQpLCAoZ3N0X3ZpZGVvZmlsdGVyX2luaXQpOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9maWx0ZXIuaDoKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOiAoZ3N0X3ZpZGVvZmxpcF9zZXRfY2FwcyksCisJICAoZ3N0X3ZpZGVvZmxpcF90cmFuc2Zvcm1fY2FwcyksIChnc3RfdmlkZW9mbGlwX2dldF91bml0X3NpemUpLAorCSAgKGdzdF92aWRlb2ZsaXBfZmxpcCksIChnc3RfdmlkZW9mbGlwX3RyYW5zZm9ybSksCisJICAoZ3N0X3ZpZGVvZmxpcF9oYW5kbGVfc3JjX2V2ZW50KSwgKGdzdF92aWRlb2ZsaXBfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfdmlkZW9mbGlwX2Jhc2VfaW5pdCksIChnc3RfdmlkZW9mbGlwX2NsYXNzX2luaXQpLAorCSAgKGdzdF92aWRlb2ZsaXBfaW5pdCksIChwbHVnaW5faW5pdCksIChnc3RfdmlkZW9mbGlwX2dldF90eXBlKToKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5oOiBWaWRlb0ZpbHRlciBpbmhlcml0cyBmcm9tCisJICBCYXNlVHJhbnNmb3JtLCBpdCdzIGp1c3QgYSBwbGFjZSBob2xkZXIgZm9yIG5vdyBhbmQgZXZlcnkgdmlkZW8KKwkgIGVmZmVjdCBwbHVnaW4gaGFzIGJlZW4gcG9ydGVkIHRvIHVzZSBCYXNlVHJhbnNmb3JtIGZlYXR1cmVzCisJICBkaXJlY3RseS4gUXVhcmtUViB3YXMgZml4ZWQgdG9vICh3YXMgYnJva2VuKSwgbmF2aWdhdGlvbnRlc3QKKwkgIHdvcmtzCisJICBhbmQgYmVzdCBmb3IgdGhlIGVuZCwgdmlkZW9mbGlwIGNvbnZlcnRzIG5hdmlnYXRpb24gZXZlbnRzCisJICBkZXBlbmRpbmcKKwkgIG9uIGZsaXAgbWV0aG9kICEgRml4ZXMgIzMyMDk1MworCisyMDA1LTExLTIzIDE0OjIyOjE4ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgRml4ZXMgZm9yIEFQSSBjaGFuZ2VzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2FhbGliL2dzdGFhc2luay5jOiAoZ3N0X2Fhc2lua19maXhhdGUpOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzogKGdzdF90ZXh0X292ZXJsYXlfY29sbGVjdGVkKToKKwkgICogZ3N0L2dvb20vZ3N0Z29vbS5jOiAoZ3N0X2dvb21faW5pdCksIChnc3RfZ29vbV9zcmNfc2V0Y2FwcyksCisJICAoZ3N0X2dvb21fc3JjX25lZ290aWF0ZSksIChnc3RfZ29vbV9jaGFpbik6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIChnc3RfbWF0cm9za2FfbXV4X3ZpZGVvX3BhZF9zZXRjYXBzKToKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgRml4ZXMgZm9yIEFQSSBjaGFuZ2VzCisKKzIwMDUtMTEtMjMgMTI6MTk6MDYgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgYWRkIGN1dHRlciB0byBzcGVjIGluCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCBjdXR0ZXIgdG8gc3BlYyBpbgorCisyMDA1LTExLTIzIDExOjU3OjUxICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBDb252ZXJ0IHRvIGZyYWN0aW9uYWwgZnJhbWVyYXRlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwKKwkgIChnc3RfcXRkZW11eF9hZGRfc3RyZWFtKSwgKHF0ZGVtdXhfZHVtcF9tdmhkKSwKKwkgIChxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgQ29udmVydCB0byBmcmFjdGlvbmFsIGZyYW1lcmF0ZXMKKworMjAwNS0xMS0yMiAyMzo1ODoxNCArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBleHQvanBlZy86IEpQRUcgZnJhY3Rpb255IGdvb2RuZXNzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogKGdzdF9qcGVnX2RlY19zZXRjYXBzKSwKKwkgIChnc3RfanBlZ19kZWNfY2hhaW4pLCAoZ3N0X2pwZWdfZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOiAoZ3N0X2pwZWdlbmNfc2V0Y2Fwcyk6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdlbmMuaDoKKwkgICogZXh0L2pwZWcvZ3N0c21va2VlbmMuYzogKGdzdF9zbW9rZWVuY19zZXRjYXBzKSwKKwkgIChnc3Rfc21va2VlbmNfcmVzeW5jKToKKwkgICogZXh0L2pwZWcvZ3N0c21va2VlbmMuaDoKKwkgIEpQRUcgZnJhY3Rpb255IGdvb2RuZXNzLgorCisyMDA1LTExLTIyIDIyOjM1OjU3ICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGdzdC9nb29tL2ZpbHRlcnMuYzoKKwkqIGdzdC9nb29tL2dyYXBoaWMuaDoKKwkgIEZpeCBmb3IgIzMyMTQzMDogdW5yZXNvbHZlZCBzeW1ib2xzIGR1ZSB0byBpbmNvcnJlY3QgbGlua2FnZSBvbiBpbmxpbmUgZnVuY3Rpb25zIGluIGdvb20uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEZpeCBmb3IgIzMyMTQzMDogdW5yZXNvbHZlZCBzeW1ib2xzIGR1ZSB0byBpbmNvcnJlY3QgbGlua2FnZSBvbiBpbmxpbmUgZnVuY3Rpb25zCisJICBpbiBnb29tLgorCSAgRG9lcyBub3QsIGhvd2V2ZXIsIGZpeCB0aGUgZ2VuZXJhbCBjcmFja2hlYWRlZG5lc3Mgb2YgZ29vbSAoZ2xvYmFsIHZhcmlhYmxlcywKKwkgIG9oIG15ISk7IHRoaXMgc2hvdWxkIGJlIG1vdmVkIHRvIC1iYWQuCisKKzIwMDUtMTEtMjIgMjI6MjE6MzcgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBNb3JlIGZyYWN0aW9uYWwgZnJhbWVyYXRlIGNvbnZlcnNpb25zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6IChnc3RfdGV4dF9vdmVybGF5X2luaXQpLAorCSAgKGdzdF90ZXh0X292ZXJsYXlfc2V0Y2FwcyksIChnc3RfdGV4dF9vdmVybGF5X2NvbGxlY3RlZCk6CisJICAqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5oOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKGdzdF9nZGtfcGl4YnVmX3NpbmtfbGluayk6CisJICAqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5oOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiAoZ3N0X3BuZ2RlY19pbml0KSwKKwkgIChnc3RfcG5nZGVjX2NhcHNfY3JlYXRlX2FuZF9zZXQpOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5oOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiAoZ3N0X3BuZ2VuY19zZXRjYXBzKToKKwkgICogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzogKGdzdF9hbHBoYV9jb2xvcl9zZXRfY2Fwcyk6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpbXV4X2luaXQpLAorCSAgKGdzdF9hdmltdXhfdmlkc2lua2Nvbm5lY3QpOgorCSAgKiBnc3QvZmx4L2dzdGZseGRlYy5jOiAoZ3N0X2ZseGRlY19jaGFpbik6CisJICAqIGdzdC9nb29tL2dzdGdvb20uYzogKGdzdF9nb29tX2luaXQpLCAoZ3N0X2dvb21fc3JjX3NldGNhcHMpLAorCSAgKGdzdF9nb29tX3NyY19uZWdvdGlhdGUpLCAoZ3N0X2dvb21fY2hhaW4pOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmg6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X3ZpZGVvX2NhcHMpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX211eF92aWRlb19wYWRfc2V0Y2Fwcyk6CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgTW9yZSBmcmFjdGlvbmFsIGZyYW1lcmF0ZSBjb252ZXJzaW9ucworCisyMDA1LTExLTIyIDIwOjA3OjQ3ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgQ29udmVydCB0byBmcmFjdGlvbmFsIGZyYW1lcmF0ZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2FhbGliL2dzdGFhc2luay5jOiAoZ3N0X2Fhc2lua19maXhhdGUpOgorCSAgKiBnc3QvZGVidWcvZ3N0bmF2aWdhdGlvbnRlc3QuYzoKKwkgIChnc3RfbmF2aWdhdGlvbnRlc3RfaGFuZGxlX3NyY19ldmVudCk6CisJICAqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZpbHRlci5jOgorCSAgKGdzdF92aWRlb2ZpbHRlcl9mb3JtYXRfZ2V0X3N0cnVjdHVyZSksIChnc3RfdmlkZW9maWx0ZXJfc2V0Y2FwcyksCisJICAoZ3N0X3ZpZGVvZmlsdGVyX2luaXQpOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9maWx0ZXIuaDoKKwkgIENvbnZlcnQgdG8gZnJhY3Rpb25hbCBmcmFtZXJhdGVzLgorCisyMDA1LTExLTIyIDE4OjExOjU4ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBleHQvZXNkL2VzZG1vbi5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuYzoKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmM6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3Qvb2xkY29yZS9nc3RhZ2dyZWdhdG9yLmM6CisJKiBnc3Qvb2xkY29yZS9nc3RzaGFwZXIuYzoKKwkqIGdzdC9zbXB0ZS9iYXJib3h3aXBlcy5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIGZpeCB1cCBtb3JlIGVudW1zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZpeCB1cCBtb3JlIGVudW1zCisKKzIwMDUtMTEtMjIgMTc6Mzk6MTEgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiBGcmFjdGlvbmFsIGZyYW1lcmF0ZXMsIHZpZGVvbWl4ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiAoZ3N0X3ZpZGVvbWl4ZXJfcGFkX3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfZ2V0Y2FwcyksIChnc3RfdmlkZW9taXhlcl9maWxsX3F1ZXVlcyksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfdXBkYXRlX3F1ZXVlcyk6CisJICBGcmFjdGlvbmFsIGZyYW1lcmF0ZXMsIHZpZGVvbWl4ZXIuCisKKzIwMDUtMTEtMjIgMTc6MDk6MzYgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZXh0L2R2LzogRnJhY3Rpb25hbCBmcmFtZXJhdGVzIGZvciBEVi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19pbml0KSwgKGdzdF9kdmRlY19zaW5rX3NldGNhcHMpOgorCSAgKiBleHQvZHYvZ3N0ZHZkZWMuaDoKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2luaXQpLAorCSAgKGdzdF9kdmRlbXV4X3NyY19jb252ZXJ0KSwgKGdzdF9kdmRlbXV4X3NpbmtfY29udmVydCksCisJICAoZ3N0X2R2ZGVtdXhfZGVtdXhfdmlkZW8pLCAoZ3N0X2R2ZGVtdXhfZGVtdXhfZnJhbWUpLAorCSAgKGdzdF9kdmRlbXV4X2ZsdXNoKToKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguaDoKKwkgIEZyYWN0aW9uYWwgZnJhbWVyYXRlcyBmb3IgRFYuCisKKzIwMDUtMTEtMjIgMTQ6NDQ6MjYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9hdXRvZGV0ZWN0LzogVXNlIGdzdF9wbHVnaW5fZmVhdHVyZV9saXN0X2ZyZWUoKSB0byBmcmVlIGZlYXR1cmUgbGlzdCBhbmQgaW4gdGhlIGNhc2Ugb2YgYXV0b3ZpZGVvc2luayBmcmVlIHRoZSBsaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkgIChnc3RfYXV0b19hdWRpb19zaW5rX2ZpbmRfYmVzdCksIChnc3RfYXV0b19hdWRpb19zaW5rX2RldGVjdCk6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkgIChnc3RfYXV0b192aWRlb19zaW5rX2ZpbmRfYmVzdCksIChnc3RfYXV0b192aWRlb19zaW5rX2RldGVjdCk6CisJICBVc2UgZ3N0X3BsdWdpbl9mZWF0dXJlX2xpc3RfZnJlZSgpIHRvIGZyZWUgZmVhdHVyZSBsaXN0IGFuZAorCSAgaW4gdGhlIGNhc2Ugb2YgYXV0b3ZpZGVvc2luayBmcmVlIHRoZSBsaXN0IGF0IGFsbC4gQWxzbworCSAgbWlzY2VsbGFuZW91cyBjb3NtZXRpYyBmaXhlcy4KKworMjAwNS0xMS0yMiAxMzoxMzoyMSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6IGNvcHkgY2FsY3VsYXRpb24gY29kZSBmcm9tIGxldmVsOyByZW1vdmUgdXNlIG9mIHNvbWUgYXVkaW8gZnVuY3Rpb25zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzogKGdzdF9jdXR0ZXJfY2hhaW4pLAorCSAgKGdzdF9jdXR0ZXJfc2V0X3Byb3BlcnR5KSwgKGdzdF9jdXR0ZXJfZ2V0X2NhcHMpOgorCSAgY29weSBjYWxjdWxhdGlvbiBjb2RlIGZyb20gbGV2ZWw7IHJlbW92ZSB1c2Ugb2Ygc29tZSBhdWRpbworCSAgZnVuY3Rpb25zCisKKzIwMDUtMTEtMjIgMTM6MTE6MjUgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIHZhcmlvdXMgY29zbWV0aWMgZml4ZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdmFyaW91cyBjb3NtZXRpYyBmaXhlcworCisyMDA1LTExLTIyIDEyOjQ4OjEwICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJICB2YXJpb3VzIGNvc21ldGljIGZpeGVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHZhcmlvdXMgY29zbWV0aWMgZml4ZXMKKworMjAwNS0xMS0yMiAxMjo0MTozNSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgdmFyaW91cyBjb3NtZXRpYyBmaXhlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICB2YXJpb3VzIGNvc21ldGljIGZpeGVzCisKKzIwMDUtMTEtMjIgMTI6Mzg6MzMgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIFVwZGF0ZSBmb3IgZ3N0X3RhZ19zZXR0ZXIgQVBJIGNoYW5nZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTEtMjIgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisJICAqIFVwZGF0ZSBmb3IgZ3N0X3RhZ19zZXR0ZXIgQVBJIGNoYW5nZXMuCisKKzIwMDUtMTEtMjIgMTE6NTc6NTEgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgZXh0L2ZhYWQvZ3N0ZmFhZC5jIChnc3RfZmFhZF9ldmVudCkgZXh0L2l2b3JiaXMvdm9yYmlzZmlsZS5jIChnc3RfaXZvcmJpc2ZpbGVfbG9vcCkgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jIChnc3RfcXRkZW11Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTEtMjIgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisJICAqIGV4dC9mYWFkL2dzdGZhYWQuYyAoZ3N0X2ZhYWRfZXZlbnQpCisJICAqIGV4dC9pdm9yYmlzL3ZvcmJpc2ZpbGUuYyAoZ3N0X2l2b3JiaXNmaWxlX2xvb3ApCisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYyAoZ3N0X3F0ZGVtdXhfbG9vcF9oZWFkZXIpCisJICAqIGdzdC9zcGVlZC9nc3RzcGVlZC5jIChzcGVlZF9zaW5rX2V2ZW50KQorCSAgKiBnc3QvdHRhL2dzdHR0YXBhcnNlLmMgKGdzdF90dGFfcGFyc2Vfc3JjX2V2ZW50KQorCSAgKGdzdF90dGFfcGFyc2VfcGFyc2VfaGVhZGVyKTogUnVuIHVwZGF0ZS1mdW5jbmFtZXMuCisKKzIwMDUtMTEtMjIgMTE6NTM6MzQgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOgorCSogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zaW5rLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBleHQvZHYvZ3N0ZHZkZW11eC5jIChnc3RfZHZkZW11eF9oYW5kbGVfc2lua19ldmVudCkgKGdzdF9kdmRlbXV4X2RlbXV4X2ZyYW1lKSBleHQvZmxhYy9nc3RmbGFjZGVjLmMgKGdzdF9mbGFjZGVjX3dyaXQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMS0yMiAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYyAoZ3N0X2R2ZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQpCisJICAoZ3N0X2R2ZGVtdXhfZGVtdXhfZnJhbWUpCisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYyAoZ3N0X2ZsYWNkZWNfd3JpdGUpCisJICAqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYyAoZ3N0X2ZsYWNlbmNfc2Vla19jYWxsYmFjaykKKwkgIChnc3RfZmxhY2VuY19zaW5rX2V2ZW50KQorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NpbmsuYyAoZ3N0X2djb25mX2F1ZGlvX3NpbmtfaW5pdCkKKwkgICogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zaW5rLmMgKGdzdF9nY29uZl92aWRlb19zaW5rX2luaXQpCisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmMgKGdzdF9wbmdkZWNfY2Fwc19jcmVhdGVfYW5kX3NldCkKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmMgKHNwZWV4X2RlY19ldmVudCwgc3BlZXhfZGVjX2NoYWluKQorCSAgKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmMgKGdzdF9hdXBhcnNlX2NoYWluKQorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmMgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfaW5pdCkKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jIChnc3RfYXV0b192aWRlb19zaW5rX2luaXQpCisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYyAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyKQorCSAgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspCisJICAqIGdzdC9nb29tL2dzdGdvb20uYyAoZ3N0X2dvb21fZXZlbnQpCisJICAqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmMgKGdzdF9lYm1sX3dyaXRlX3NlZWspCisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX2V2ZW50KQorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9sb29wX3N0cmVhbV9wYXJzZV9pZCkKKwkgICogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYyAoZ3N0X3dhdmVuY19zdG9wX2ZpbGUpCisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jIChnc3Rfd2F2cGFyc2VfaGFuZGxlX3NlZWspCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKTogUnVuIHVwZGF0ZS1mdW5jbmFtZXMuCisKKzIwMDUtMTEtMjIgMTE6NDk6MzAgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIFVSSUhhbmRsZXIgaW50ZXJmYWNlIGFuZCBlbGVtZW50IHByb3BlcnRpZXMgYXJlIG5vdyBwcm9wZXJseSBzeW5jaHJvbml6ZWQgZm9yIERWMTM5NHNyYyBhbmQgVURQU3JjCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IChnc3RfZHYxMzk0c3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9kdjEzOTRzcmNfaW5pdCksIChnc3RfZHYxMzk0c3JjX2Rpc3Bvc2UpLAorCSAgKGdzdF9kdjEzOTRzcmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9kdjEzOTRzcmNfZGlzY292ZXJfYXZjX25vZGUpLAorCSAgKGdzdF9kdjEzOTRzcmNfdXJpX3NldF91cmkpOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfdWRwc3JjX3VwZGF0ZV91cmkpLCAoZ3N0X3VkcHNyY19zZXRfdXJpKSwKKwkgIChnc3RfdWRwc3JjX3NldF9wcm9wZXJ0eSksIChnc3RfdWRwc3JjX3VyaV9nZXRfdXJpKToKKwkgIFVSSUhhbmRsZXIgaW50ZXJmYWNlIGFuZCBlbGVtZW50IHByb3BlcnRpZXMgYXJlIG5vdyBwcm9wZXJseQorCSAgc3luY2hyb25pemVkIGZvciBEVjEzOTRzcmMgYW5kIFVEUFNyYworCisyMDA1LTExLTIyIDExOjM2OjA0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvOiBsaWJnc3R0YWdlZGl0IGhhcyBiZWVuIHJlbmFtZWQgdG8gbGliZ3N0dGFnLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL01ha2VmaWxlLmFtOgorCSAgKiBleHQvc3BlZXgvTWFrZWZpbGUuYW06CisJICBsaWJnc3R0YWdlZGl0IGhhcyBiZWVuIHJlbmFtZWQgdG8gbGliZ3N0dGFnLgorCisyMDA1LTExLTIxIDIwOjExOjU5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOiBBcHBseSBwYXRjaCBmcm9tIFNlYmFzdGllbiBDb3RlIHRvIGZpeCAjMzE5MTg0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChyZWFkX2JvZHkpOgorCSAgQXBwbHkgcGF0Y2ggZnJvbSBTZWJhc3RpZW4gQ290ZSB0byBmaXggIzMxOTE4NC4KKworMjAwNS0xMS0yMSAxOTo1MDoyNSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIHBvcnQgY3V0dGVyCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvY3V0dGVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOiAoZ3N0X2N1dHRlcl9jbGFzc19pbml0KSwKKwkgIChnc3RfY3V0dGVyX2luaXQpLCAoZ3N0X2N1dHRlcl9tZXNzYWdlX25ldyksIChnc3RfY3V0dGVyX2NoYWluKSwKKwkgIChnc3RfY3V0dGVyX3NldF9wcm9wZXJ0eSksIChnc3RfY3V0dGVyX2dldF9wcm9wZXJ0eSksCisJICAocGx1Z2luX2luaXQpLCAoZ3N0X2N1dHRlcl9nZXRfY2Fwcyk6CisJICBwb3J0IGN1dHRlcgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIGZpeCB1cCBwbHVnaW4gZGV0YWlscworCisyMDA1LTExLTIxIDE4OjA5OjAyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBVcGRhdGUgZm9yIHN0cmVhbSBsb2NrIEFQSSBjaGFuZ2VzOiBkb24ndCB0YWtlIHN0cmVhbSBsb2cgaW4gc2luayBldmVudCBoYW5kbGVycyBhbnkgbG9uZ2VyIGFuZCBjaGFuZ2UgR1NUX1NUUkVBTV9MT0MuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5jOiAoZ3N0X2R2ZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQpOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY2RlY19sb29wKSwKKwkgIChnc3RfZmxhY2RlY19zcmNfZXZlbnQpOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IChnc3RfZmxhY2VuY19zaW5rX2V2ZW50KToKKwkgICogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYzogKGdzdF9zaWduYWxfcHJvY2Vzc29yX2V2ZW50KSwKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9nZXRyYW5nZSksIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9jaGFpbik6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspOgorCSAgKiBnc3QvZmx4L2dzdGZseGRlYy5jOiAoZ3N0X2ZseGRlY19zcmNfZXZlbnRfaGFuZGxlciksCisJICAoZ3N0X2ZseGRlY19zaW5rX2V2ZW50X2hhbmRsZXIpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NlZWtfZXZlbnQpOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9oYW5kbGVfc2Vlayk6CisJICBVcGRhdGUgZm9yIHN0cmVhbSBsb2NrIEFQSSBjaGFuZ2VzOiBkb24ndCB0YWtlIHN0cmVhbSBsb2cKKwkgIGluIHNpbmsgZXZlbnQgaGFuZGxlcnMgYW55IGxvbmdlciBhbmQgY2hhbmdlIEdTVF9TVFJFQU1fTE9DSworCSAgdG8gR1NUX1BBRF9TVFJFQU1fTE9DSy4gRG9uJ3QgbGVhayByZWZlcmVuY2VzIGluIGZseGRlYyBldmVudAorCSAgZnVuY3Rpb25zLgorCisyMDA1LTExLTIxIDE3OjUyOjE1ICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkqIGdzdC9hdXBhcnNlL01ha2VmaWxlLmFtOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5oOgorCSAgRm9yZ290IHRvIGNvbW1pdCBoZWFkZXIgZmlsZSBjaGFuZ2VzLCBNYWtlZmlsZS5hbSBjaGFuZ2VzLiBPb3BzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGb3Jnb3QgdG8gY29tbWl0IGhlYWRlciBmaWxlIGNoYW5nZXMsIE1ha2VmaWxlLmFtIGNoYW5nZXMuIE9vcHMuCisKKzIwMDUtMTEtMjEgMTc6NDk6MjEgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSAgZ3N0X29iamVjdF91bnJlZiwgbm90IGdfb2JqZWN0X3VucmVmCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGdzdF9vYmplY3RfdW5yZWYsIG5vdCBnX29iamVjdF91bnJlZgorCisyMDA1LTExLTIxIDE3OjM3OjQxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBGaXggZm9yIHN0cmVhbSBsb2NrIHVwZGF0ZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZhYWMvZ3N0ZmFhYy5jOiAoZ3N0X2ZhYWNfc2lua19ldmVudCk6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2hhbmRsZV9zcmNfZXZlbnQpOgorCSAgKiBnc3QvdHRhL2dzdHR0YXBhcnNlLmM6IChnc3RfdHRhX3BhcnNlX3NyY19ldmVudCk6CisJICBGaXggZm9yIHN0cmVhbSBsb2NrIHVwZGF0ZXMuCisKKzIwMDUtMTEtMjEgMTc6MjM6NDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBVc2UgR1NUX0RFQlVHX0ZVTkNQVFI7IGFkZCBkZWJ1ZyBtZXNzYWdlIGluIHBhZCBhY3RpdmF0ZSBmdW5jdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9pbml0KSwKKwkgIChnc3Rfd2F2cGFyc2VfY3JlYXRlX3NvdXJjZXBhZCksIChnc3Rfd2F2cGFyc2Vfc2lua19hY3RpdmF0ZSk6CisJICBVc2UgR1NUX0RFQlVHX0ZVTkNQVFI7IGFkZCBkZWJ1ZyBtZXNzYWdlIGluIHBhZCBhY3RpdmF0ZSBmdW5jdGlvbi4KKworMjAwNS0xMS0yMSAxNzoxODowMSArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBnc3QvYXVwYXJzZS86IFBhcnRpYWxseSBmaXggIzE2MTcxMi4gcGxheWJpbiBzdGlsbCBkb2Vzbid0IHdvcmsgb24gdGhlc2UgZmlsZXMsIChvbiB0aGUgYnVnIHJlcG9ydCwgQW5keSBzYXlzIHdlIGFyZW4uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiAoZ3N0X2F1cGFyc2VfY2xhc3NfaW5pdCksCisJICAoZ3N0X2F1cGFyc2VfaW5pdCksIChnc3RfYXVwYXJzZV9kaXNwb3NlKSwgKGdzdF9hdXBhcnNlX2NoYWluKSwKKwkgIChnc3RfYXVwYXJzZV9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmg6CisJICBQYXJ0aWFsbHkgZml4ICMxNjE3MTIuIHBsYXliaW4gc3RpbGwgZG9lc24ndCB3b3JrIG9uIHRoZXNlIGZpbGVzLAorCSAgKG9uIHRoZSBidWcgcmVwb3J0LCBBbmR5IHNheXMgd2UgYXJlbid0IHR5cGVmaW5kaW5nIGl0IGZvciBzb21lCisJICByZWFzb24/KSBidXQgYXQgbGVhc3QgYXVwYXJzZSBpc24ndCB0b3RhbGx5IGJ1c3RlZCBsaWtlIGl0IHdhcyBiZWZvcmUuCisKKzIwMDUtMTEtMjEgMTY6NDU6NDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogakBib290bGFiLm9yZywgIzMyMTkwMykuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF92aWRlb19jYXBzKToKKwkgIEFkZCBEWDUwLCBESVZYIGFuZCBESVYzIGZvdXJjY3MgKHBhdGNoIGJ5CisJICBqQGJvb3RsYWIub3JnLCAjMzIxOTAzKS4KKworMjAwNS0xMS0yMSAxNjozNjowNSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICAqLio6IFJhbiBzY3JpcHRzL3VwZGF0ZS1tYWNyb3MuIE9oIHllcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMS0yMSAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKwkgICogKi5oOgorCSAgKiAqLmM6IFJhbiBzY3JpcHRzL3VwZGF0ZS1tYWNyb3MuIE9oIHllcy4KKworMjAwNS0xMS0yMSAxNTowNjozNSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IEZpbGxlciBldmVudHMgYXJlIGdvbmUgZm9yIG5vdywgY29tbWVudCBvdXQgc2VjdGlvbiBnZW5lcmF0aW5nIHRoZW0uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfc3luY19zdHJlYW1zKToKKwkgIEZpbGxlciBldmVudHMgYXJlIGdvbmUgZm9yIG5vdywgY29tbWVudCBvdXQgc2VjdGlvbiBnZW5lcmF0aW5nCisJICB0aGVtLgorCisyMDA1LTExLTIxIDE0OjM5OjA0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBVcGRhdGUgZm9yIEdTVF9GT1VSQ0NfRk9STUFUIEFQSSBjaGFuZ2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2RpcmVjdGZiL2RmYnZpZGVvc2luay5jOgorCSAgKGdzdF9kZmJ2aWRlb3NpbmtfZ2V0X2Zvcm1hdF9mcm9tX2NhcHMpOgorCSAgKiBleHQvc2RsL3NkbHZpZGVvc2luay5jOiAoZ3N0X3NkbHZpZGVvc2lua19jcmVhdGUpOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX2hlYWRlciksCisJICAocXRkZW11eF9wYXJzZSksIChxdGRlbXV4X3R5cGVfZ2V0KSwgKHF0ZGVtdXhfbm9kZV9kdW1wX2ZvcmVhY2gpLAorCSAgKHF0ZGVtdXhfZHVtcF9oZGxyKSwgKHF0ZGVtdXhfZHVtcF9kcmVmKSwgKHF0ZGVtdXhfZHVtcF9zdHNkKSwKKwkgIChxdGRlbXV4X2R1bXBfZGNvbSksIChxdGRlbXV4X3BhcnNlX3RyYWspLCAocXRkZW11eF92aWRlb19jYXBzKSwKKwkgIChxdGRlbXV4X2F1ZGlvX2NhcHMpOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY192NGwyZm91cmNjX3RvX2NhcHMpOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IChnc3RfdjRsMnNyY19maWxsX2Zvcm1hdF9saXN0KSwKKwkgIChnc3RfdjRsMnNyY19jYXB0dXJlX2luaXQpLCAoZ3N0X3Y0bDJzcmNfZ2V0X3NpemVfbGltaXRzKToKKwkgIFVwZGF0ZSBmb3IgR1NUX0ZPVVJDQ19GT1JNQVQgQVBJIGNoYW5nZS4KKworMjAwNS0xMS0yMSAxNDozMzoxMSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIFJlbmFtZSBnc3RfY2Fwc19zdHJ1Y3R1cmVfZml4YXRlXyogdG8gZ3N0X3N0cnVjdHVyZV9maXhhdGVfKiAoIzMyMjAyNykKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYXVkaW9yZXNhbXBsZS9nc3RhdWRpb3Jlc2FtcGxlLmM6CisJICAqIGV4dC9wb2x5cC9wb2x5cHNpbmsuYzogKGdzdF9wb2x5cHNpbmtfc2lua19maXhhdGUpOgorCSAgKiBnc3QvbGlicmZiL2dzdHJmYnNyYy5jOiAoZ3N0X3JmYnNyY19maXhhdGUpOgorCSAgKiBnc3QvbW9kcGx1Zy9nc3Rtb2RwbHVnLmNjOgorCSAgKiBzeXMvZ2xzaW5rL2dsaW1hZ2VzaW5rLmM6IChnc3RfZ2xpbWFnZXNpbmtfZml4YXRlKToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfZml4YXRlKToKKwkgIFJlbmFtZSBnc3RfY2Fwc19zdHJ1Y3R1cmVfZml4YXRlXyogdG8gZ3N0X3N0cnVjdHVyZV9maXhhdGVfKgorCSAgKCMzMjIwMjcpCisKKzIwMDUtMTEtMjEgMTQ6MzE6MDUgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBSZW5hbWUgZ3N0X2NhcHNfc3RydWN0dXJlX2ZpeGF0ZV8qIHRvIGdzdF9zdHJ1Y3R1cmVfZml4YXRlXyogKCMzMjIwMjcpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2FhbGliL2dzdGFhc2luay5jOiAoZ3N0X2Fhc2lua19maXhhdGUpOgorCSAgKiBleHQvbWlrbW9kL2dzdG1pa21vZC5jOiAoZ3N0X21pa21vZF9zcmNmaXhhdGUpOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnc3RfZ29vbV9zcmNfbmVnb3RpYXRlKToKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgUmVuYW1lIGdzdF9jYXBzX3N0cnVjdHVyZV9maXhhdGVfKiB0byBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV8qCisJICAoIzMyMjAyNykKKworMjAwNS0xMS0yMSAxMzozODoyNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgRml4ZXMgZm9yIEdTVF9GT1VSQ0NfRk9STUFUIEFQSSBjaGFuZ2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2FhbGliL2dzdGFhc2luay5jOiAoZ3N0X2Fhc2lua19zZXRjYXBzKToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wYXJzZV9maWxlX2hlYWRlciksCisJICAoZ3N0X2F2aV9kZW11eF9yZWFkX3N1YmluZGV4ZXMpLCAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0pLAorCSAgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfb2RtbCksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9zeW5jKSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlciksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X3ZpZGVvX2NhcHMpOgorCSAgKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiAod3JpdGVfbWV0YWRhdGEpOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9wYXJzZV9hZHRsKSwKKwkgIChnc3Rfd2F2cGFyc2VfcGFyc2VfZmlsZV9oZWFkZXIpLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKToKKwkgIEZpeGVzIGZvciBHU1RfRk9VUkNDX0ZPUk1BVCBBUEkgY2hhbmdlLgorCisyMDA1LTExLTIxIDEyOjEzOjQ4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBGaXggZm9yIGNvbGxlY3QgcGFkcyBBUEkgY2hhbmdlLiBBbHNvIGZpeCB0ZXh0b3ZlcmxheSBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6IChnc3RfdGV4dF9vdmVybGF5X2ZpbmFsaXplKSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X2luaXQpLCAoZ3N0X3RleHRfb3ZlcmxheV90ZXh0X3BhZF9saW5rZWQpLAorCSAgKGdzdF90ZXh0X292ZXJsYXlfdGV4dF9wYWRfdW5saW5rZWQpLCAoZ3N0X3RleHRfb3ZlcmxheV9wb3BfdmlkZW8pLAorCSAgKGdzdF90ZXh0X292ZXJsYXlfcG9wX3RleHQpLCAoZ3N0X3RleHRfb3ZlcmxheV9jb2xsZWN0ZWQpLAorCSAgKGdzdF90ZXh0X292ZXJsYXlfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9pbml0KSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3Jlc2V0KSwgKGdzdF9tYXRyb3NrYV9tdXhfcmVxdWVzdF9uZXdfcGFkKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X2Jlc3RfcGFkKSwgKGdzdF9tYXRyb3NrYV9tdXhfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6IChnc3Rfc21wdGVfaW5pdCksIChnc3Rfc21wdGVfY29sbGVjdGVkKToKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiAoZ3N0X3ZpZGVvbWl4ZXJfaW5pdCksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfcmVxdWVzdF9uZXdfcGFkKSwgKGdzdF92aWRlb21peGVyX2ZpbGxfcXVldWVzKSwKKwkgIChnc3RfdmlkZW9taXhlcl9jaGFuZ2Vfc3RhdGUpOgorCSAgRml4IGZvciBjb2xsZWN0IHBhZHMgQVBJIGNoYW5nZS4gQWxzbyBmaXggdGV4dG92ZXJsYXkgc3RhdGUKKwkgIGNoYW5nZSBmdW5jdGlvbi4KKworMjAwNS0xMS0yMCAxNzowNDo1NSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogUmVwbGFjZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTExLTIwICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfc3RhcnQpOiBSZXBsYWNlCisJICBHU1RfUEFEX0lTX1VTQUJMRSBieSBzb21ldGhpbmcgYXBwcm9hY2hpbmcgaXQuCisKKzIwMDUtMTEtMjAgMTY6NDM6MzIgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IEZpeCBmb3IKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMS0yMCAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChnc3RfbWF0cm9za2FfbXV4X3N0YXJ0KTogRml4IGZvcgorCSAgQVBJIGNoYW5nZXMuCisJICAqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChnc3Rfd2F2ZW5jX2NoYWluKTogRml4IGZvciBBUEkKKwkgIGNoYW5nZXMsCisJICBidXQgYWxzbyBmaXggdGhlIGNvZGUgdGhhdCB3YXMgbm90IGNoZWNraW5nIHJldHVybiB2YWx1ZXMgZnJvbQorCSAgcGFkX3B1c2ggbmVpdGhlciB1c2luZyBwYWRfYWxsb2NfYnVmZmVyLgorCisyMDA1LTExLTE4IDE4OjE5OjIxICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiBBZGRlZCBkZWJ1ZyBjYXRlZ29yeQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6IChnc3RfcG5nZW5jX2NsYXNzX2luaXQpLAorCSAgKGdzdF9wbmdlbmNfY2hhaW4pOgorCSAgQWRkZWQgZGVidWcgY2F0ZWdvcnkKKwkgIFJldHVybiBHU1RfRkxPV19VTkVYUEVDVEVEIHdoZW4gc2VuZGluZyBhbiBFT1MsIHNvIHRoZSB3aG9sZSBwaXBlbGluZQorCSAgZ29lcyB0byBFT1MuCisKKzIwMDUtMTEtMTcgMTg6MjM6MjMgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFkZWMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFlbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWVuYy5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzExcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZWMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZWMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZW5jLmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5Lmg6CisJICBDcmVhdGVkIFNwZWV4IHBheWxvYWRlciBhbmQgZGVwYXlsb2FkZXI7IE9wdGltaXplIEc3MTEgcGF5bG9hZGVyIHRvIHVzZSBhZGFwdGVyIGFuZCBzZW5kIHBhY2tldHMgdW50aWwgTVRVIHNpemUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIENyZWF0ZWQgU3BlZXggcGF5bG9hZGVyIGFuZCBkZXBheWxvYWRlcjsgT3B0aW1pemUgRzcxMSBwYXlsb2FkZXIgdG8gdXNlIGFkYXB0ZXIgYW5kIHNlbmQgcGFja2V0cyB1bnRpbCBNVFUgc2l6ZS4KKworMjAwNS0xMS0xNiAxOTowODo1NCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgY2hlY2svZWxlbWVudHMvbWF0cm9za2FtdXguYzogRml4IGxlYWsgaW4gY2hlY2suCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY2hlY2svZWxlbWVudHMvbWF0cm9za2FtdXguYzogKHNldHVwX3NyY19wYWQpLCAoc2V0dXBfc2lua19wYWQpOgorCSAgRml4IGxlYWsgaW4gY2hlY2suCisKKzIwMDUtMTEtMTYgMTc6MDA6MzIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6IEZpeCBzdGF0ZSBjaGFuZ2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ZseC9nc3RmbHhkZWMuYzogKGdzdF9mbHhkZWNfY2hhbmdlX3N0YXRlKToKKwkgIEZpeCBzdGF0ZSBjaGFuZ2UuCisKKzIwMDUtMTEtMTYgMTE6MDI6MjQgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIE1vdmUgY29tbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKGdzdF91ZHBzcmNfY3JlYXRlKTogTW92ZSBjb21tZW50LgorCisyMDA1LTExLTE2IDEwOjQzOjQ0ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IENsZWFuIHVwIHdpdGggdGhlIGJvaWxlcnBsYXRlIG1hY3JvLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTExLTE2ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiBDbGVhbiB1cCB3aXRoIHRoZSBib2lsZXJwbGF0ZSBtYWNyby4KKworMjAwNS0xMS0xNSAxOTo0MToyMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IFdoZW4gc2Vla2luZywgc2VlayB0byBjbG9zZXN0IGluZGV4IGVudHJ5IGF0IG9yIGJlZm9yZSB0aGUgcmVxdWVzdGVkIHNlZWsgcG9zaXRpb24sIG5vLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJldmlld2VkIGJ5OiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thZGVtdXhfZG9faW5kZXhfc2Vlayk6CisJICBXaGVuIHNlZWtpbmcsIHNlZWsgdG8gY2xvc2VzdCBpbmRleCBlbnRyeSBhdCBvciBiZWZvcmUgdGhlIHJlcXVlc3RlZAorCSAgc2VlayBwb3NpdGlvbiwgbm90IGp1c3QgdGhlIGNsb3Nlc3Qgb25lICgjMzIxMDAxKS4KKworMjAwNS0xMS0xNSAxMjoxNjowMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBJbnZlcnQgRElCIGltYWdlcyBhZ2FpbiAoc2VlICMxMzIzNDEpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKHN3YXBfbGluZSksIChnc3RfYXZpX2RlbXV4X2ludmVydCksCisJICAoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSk6CisJICBJbnZlcnQgRElCIGltYWdlcyBhZ2FpbiAoc2VlICMxMzIzNDEpLgorCisyMDA1LTExLTE0IDAyOjEzOjM1ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogY29tbW9uOgorCSogY29uZmlndXJlLmFjOgorCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvLmM6CisJKiBleHQvZHYvZ3N0ZHYuYzoKKwkqIGV4dC9lc2QvZ3N0ZXNkLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjLmM6CisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZlbGVtZW50cy5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJKiBleHQvanBlZy9nc3RqcGVnLmM6CisJKiBleHQvbGFkc3BhL2dzdGxhZHNwYS5jOgorCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzoKKwkqIGV4dC9saWJtbmcvZ3N0bW5nLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZy5jOgorCSogZXh0L21pa21vZC9nc3RtaWttb2QuYzoKKwkqIGV4dC9wYW5nby9nc3R0ZXh0b3ZlcmxheS5jOgorCSogZXh0L3BhbmdvL2dzdHRpbWVvdmVybGF5LmM6CisJKiBleHQvcmF3MTM5NC9nc3QxMzk0LmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXguYzoKKwkqIGdzdC9hbHBoYS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9kZXRlY3QuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpLmM6CisJKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOgorCSogZ3N0L2RlYnVnL2VmZW5jZS5jOgorCSogZ3N0L2RlYnVnL2dzdGRlYnVnLmM6CisJKiBnc3QvZGVidWcvZ3N0bmF2aWdhdGlvbnRlc3QuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGVmZmVjdHYuYzoKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJKiBnc3QvbGF3L2FsYXcuYzoKKwkqIGdzdC9sYXcvbXVsYXcuYzoKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLmM6CisJKiBnc3QvbWVkaWFuL2dzdG1lZGlhbi5jOgorCSogZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0LmM6CisJKiBnc3Qvb2xkY29yZS9nc3RlbGVtZW50cy5jOgorCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0YXN0ZXJpc2toMjYzLmM6CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcC5jOgorCSogZ3N0L3Ntb290aHdhdmUvZ3N0c21vb3Rod2F2ZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJKiBnc3QvdWRwL2dzdHVkcC5jOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb3RlbXBsYXRlLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJKiBzeXMvb3NzL2dzdG9zc2F1ZGlvLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW8uYzoKKwkgIHJld29yayBjb25maWd1cmUuYWM7IG1ha2UgYXN0ZXJpc2sgcnRwIHN0dWZmIGNvbXBpbGUgb24gbWluZ3cKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmV3b3JrIGNvbmZpZ3VyZS5hYzsgbWFrZSBhc3RlcmlzayBydHAgc3R1ZmYgY29tcGlsZSBvbiBtaW5ndworCisyMDA1LTExLTEyIDEzOjMxOjU2ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBleHQvanBlZy9nc3RqcGVnZGVjLmM6IE9ubHkgR1NUX0RFQlVHKCkgaW5mb3JtYXRpb24gb24gdGhlIHZhbGlkIGNvbXBvbmVudHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2pwZWdfZGVjX2NoYWluKToKKwkgIE9ubHkgR1NUX0RFQlVHKCkgaW5mb3JtYXRpb24gb24gdGhlIHZhbGlkIGNvbXBvbmVudHMuCisKKzIwMDUtMTEtMTEgMTk6MzQ6NTAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBjb25maWd1cmUuYWM6CisJICBiYWNrIHRvIGhlYWQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYmFjayB0byBoZWFkCisKKz09PSByZWxlYXNlIDAuOS41ID09PQorCisyMDA1LTExLTExIDE5OjMzOjIzICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkgIHJlbGVhc2luZyAwLjkuNQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZWxlYXNpbmcgMC45LjUKKworMjAwNS0xMS0xMSAxODozMzoyMSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAwNS0xMS0xMSAxNjo0ODo1OCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC4qOiBZZWFoLCBpbXBsZW1lbnQgcHJvcGVyIHNlZWtpbmcuIEV4YWN0IHNlZWtpbmcgYW5kIHNlZ21lbnQgc2Vla2luZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3Jlc2V0KSwKKwkgIChnc3RfYXZpX2RlbXV4X3NyY19jb252ZXJ0KSwgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19ldmVudCksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyKSwgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspLAorCSAgKGdzdF9hdmlfZGVtdXhfcHJvY2Vzc19uZXh0X2VudHJ5KSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2RhdGEpLAorCSAgKGdzdF9hdmlfZGVtdXhfbG9vcCk6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIFllYWgsIGltcGxlbWVudCBwcm9wZXIgc2Vla2luZy4gRXhhY3Qgc2Vla2luZyBhbmQgc2VnbWVudCBzZWVraW5nLgorCSAgU3RpbGwgbmVlZCB0byBkbyBzb21lIGNoZWNrcyBmb3Igc2VnbWVudF9zdG9wLgorCisyMDA1LTExLTExIDE1OjE3OjQ0ICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIGZpeCBDYWlybyBlbnRyeQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBmaXggQ2Fpcm8gZW50cnkKKworMjAwNS0xMS0xMCAxMjozNDoyNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGQgc3VwcG9ydCBmb3IgY3VzdG9tIGdlbnJlIHRhZ3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJldmlld2VkIGJ5OiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2VfdWR0YSk6CisJICBBZGQgc3VwcG9ydCBmb3IgY3VzdG9tIGdlbnJlIHRhZ3MuCisKKzIwMDUtMTEtMTAgMTI6MjI6MzAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogRG9uJ3QgdHJ5IHRvIHJlYWR5IGJ1ZmZlciBkdXJhdGlvbiBmcm9tIGJ1ZmZlciB0aGF0IHdlIGRvbid0IG93biBhbnkgIGxvbmdlciBhbmQgdGhhdCBtaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBSZXZpZXdlZCBieTogVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChnc3RfbWF0cm9za2FfbXV4X3dyaXRlX2RhdGEpOgorCSAgRG9uJ3QgdHJ5IHRvIHJlYWR5IGJ1ZmZlciBkdXJhdGlvbiBmcm9tIGJ1ZmZlciB0aGF0IHdlIGRvbid0CisJICBvd24gYW55ICBsb25nZXIgYW5kIHRoYXQgbWlnaHQgYWxyZWFkeSBoYXZlIGJlZW4gdW5yZWZmZWQuCisJICAoIzMyMTEzNikKKworMjAwNS0xMS0wOSAyMTozNToyOSArMDAwMCAgWmVlc2hhbiBBbGkgPHplZW5peEBnbWFpbC5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJICBBdHRlbXB0aW5nIHRvIG9wdGltaXplIHRoZSBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBBdHRlbXB0aW5nIHRvIG9wdGltaXplIHRoZSBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLgorCisyMDA1LTExLTA4IDA4OjU0OjMwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvb3NzL2dzdG9zc3NpbmsuYzogRG9uJ3QgcmUtdXNlIGFscmVhZHkgY2xvc2VkIGZpbGUgZGVzY3JpcHRvci4gKCMzMjA5MjApCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJldmlld2VkIGJ5OiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisJICAqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiAoZ3N0X29zc19zaW5rX2Nsb3NlKToKKwkgIERvbid0IHJlLXVzZSBhbHJlYWR5IGNsb3NlZCBmaWxlIGRlc2NyaXB0b3IuICgjMzIwOTIwKQorCisyMDA1LTExLTA3IDE3OjM1OjIwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvb3NzL2dzdG9zc3NpbmsuKjogQ2FjaGUgcHJvYmVkIGNhcHM7IGZpeCBkZWJ1ZyBvdXRwdXQgZm9yIFNFVF9QQVJBTSBtYWNyb3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IChnc3Rfb3NzX3NpbmtfZGlzcG9zZSksCisJICAoZ3N0X29zc19zaW5rX3NldF9wcm9wZXJ0eSksIChnc3Rfb3NzX3NpbmtfZ2V0Y2FwcyksCisJICAoZ3N0X29zc19zaW5rX3ByZXBhcmUpOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NpbmsuaDoKKwkgIENhY2hlIHByb2JlZCBjYXBzOyBmaXggZGVidWcgb3V0cHV0IGZvciBTRVRfUEFSQU0gbWFjcm9zLgorCisyMDA1LTExLTA3IDE1OjA5OjU0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvY2Fpcm8vOiBQb3J0IGNhaXJvIHRleHRvdmVybGF5IHBsdWdpbiB0byAwLjkuIEFkZCAnc2hhZGVkLWJhY2tncm91bmQnIHByb3BlcnR5IGFuZCByZWRvIHBvc2l0aW9uLiBEb2Vzbid0IGhhbmRsZSAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvY2Fpcm8vTWFrZWZpbGUuYW06CisJICAqIGV4dC9jYWlyby9nc3RjYWlyby5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzogKGdzdF90ZXh0X292ZXJsYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X2NsYXNzX2luaXQpLCAoZ3N0X3RleHRfb3ZlcmxheV9maW5hbGl6ZSksCisJICAoZ3N0X3RleHRfb3ZlcmxheV9pbml0KSwgKGdzdF90ZXh0X292ZXJsYXlfZm9udF9pbml0KSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X3NldF9wcm9wZXJ0eSksIChnc3RfdGV4dF9vdmVybGF5X3JlbmRlcl90ZXh0KSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X2dldGNhcHMpLCAoZ3N0X3RleHRfb3ZlcmxheV9zZXRjYXBzKSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X3RleHRfcGFkX2xpbmtlZCksCisJICAoZ3N0X3RleHRfb3ZlcmxheV90ZXh0X3BhZF91bmxpbmtlZCksIChnc3RfdGV4dF9vdmVybGF5X3NoYWRlX3kpLAorCSAgKGdzdF90ZXh0X292ZXJsYXlfYmxpdF8xKSwgKGdzdF90ZXh0X292ZXJsYXlfYmxpdF9zdWIyeDIpLAorCSAgKGdzdF90ZXh0X292ZXJsYXlfcHVzaF9mcmFtZSksIChnc3RfdGV4dF9vdmVybGF5X3BvcF92aWRlbyksCisJICAoZ3N0X3RleHRfb3ZlcmxheV9wb3BfdGV4dCksIChnc3RfdGV4dF9vdmVybGF5X2NvbGxlY3RlZCksCisJICAoZ3N0X3RleHRfb3ZlcmxheV9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuaDoKKwkgIFBvcnQgY2Fpcm8gdGV4dG92ZXJsYXkgcGx1Z2luIHRvIDAuOS4gQWRkICdzaGFkZWQtYmFja2dyb3VuZCcKKwkgIHByb3BlcnR5IGFuZCByZWRvIHBvc2l0aW9uLiBEb2Vzbid0IGhhbmRsZSB1cHN0cmVhbSByZW5lZ290aWF0aW9uCisJICB5ZXQgdGhvdWdoLgorCisyMDA1LTExLTA3IDEwOjMxOjMyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IE5vIG5lZWQgdG8gdGFrZSB0aGUgU1RSRUFNX0xPQ0sgaW4gdGhlIGxvb3AgZnVuY3Rpb24uIEltcHJvdmUgc29tZSBkZWJ1ZyBtZXNzYWdlcy4gRG9uJ3QgbGVhayAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksCisJICAoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSksCisJICAoZ3N0X2F2aV9kZW11eF9sb29wKToKKwkgIE5vIG5lZWQgdG8gdGFrZSB0aGUgU1RSRUFNX0xPQ0sgaW4gdGhlIGxvb3AgZnVuY3Rpb24uIEltcHJvdmUKKwkgIHNvbWUgZGVidWcgbWVzc2FnZXMuIERvbid0IGxlYWsgcGFkIG5hbWVzIGluIGRlYnVnIG1lc3NhZ2VzLgorCisyMDA1LTExLTA3IDEwOjI3OjAwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogRG9uJ3QgZXJyb3Igb3V0IHdoZW4gdGhlIHNvdXJjZSBwYWQgaXNuJ3QgbGlua2VkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wdXNoX3ZvcmJpc19jb2RlY19wcml2X2RhdGEpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfd3Zwa19oZWFkZXIpOgorCSAgRG9uJ3QgZXJyb3Igb3V0IHdoZW4gdGhlIHNvdXJjZSBwYWQgaXNuJ3QgbGlua2VkLgorCisyMDA1LTExLTAyIDE5OjQyOjM4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZ2NvbmYvOiBGaXggc3RhdGUgY2hhbmdlIGZ1bmN0aW9ucyBoZXJlIGFzIHdlbGwgYW5kIHNldCBraWQgdG8gTlVMTCBzdGF0ZSBiZWZvcmUgcmVtb3ZpbmcgaXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zaW5rLmM6IChkb190b2dnbGVfZWxlbWVudCksCisJICAoZ3N0X2djb25mX2F1ZGlvX3NpbmtfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zaW5rLmM6IChkb190b2dnbGVfZWxlbWVudCksCisJICAoZ3N0X2djb25mX3ZpZGVvX3NpbmtfY2hhbmdlX3N0YXRlKToKKwkgIEZpeCBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb25zIGhlcmUgYXMgd2VsbCBhbmQgc2V0IGtpZAorCSAgdG8gTlVMTCBzdGF0ZSBiZWZvcmUgcmVtb3ZpbmcgaXQuCisKKzIwMDUtMTEtMDIgMTY6NDg6NTUgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBjaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jOgorCSogY29tbW9uOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbWF0cm9za2FtdXguYzoKKwkgIHNpZ2gsIHN0YXRpYyBwYWQgdGVtcGxhdGVzIGFyZW4ndCByZWZjb3VudGVkIHByb3Blcmx5CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHNpZ2gsIHN0YXRpYyBwYWQgdGVtcGxhdGVzIGFyZW4ndCByZWZjb3VudGVkIHByb3Blcmx5CisKKzIwMDUtMTEtMDEgMTY6MTQ6MjUgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBjaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSogZ3N0L2xldmVsLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSAgaWdub3JlIG1vcmUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgaWdub3JlIG1vcmUKKworMjAwNS0xMS0wMSAxNToxNTo0NCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzogQWRkZWQgcHJvcGVyIGV2ZW50IGhhbmRsaW5kLCBtYWRlIGRvd25zdHJlYW0gbmV3c2VnbWVudCBldmVudCB1c2UgR1NUX0ZPUk1BVF9CWVRFUyAob3RoZXJ3aXNlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzogKGdzdF93YXZlbmNfc3RvcF9maWxlKSwKKwkgIChnc3Rfd2F2ZW5jX2luaXQpLCAoZ3N0X3dhdmVuY19ldmVudCksIChnc3Rfd2F2ZW5jX2NoYWluKToKKwkgIEFkZGVkIHByb3BlciBldmVudCBoYW5kbGluZCwKKwkgIG1hZGUgZG93bnN0cmVhbSBuZXdzZWdtZW50IGV2ZW50IHVzZSBHU1RfRk9STUFUX0JZVEVTIChvdGhlcndpc2UgaXQncworCSAgaWdub3JlZCksCisJICBhbmQgZG9uJ3Qgc2V0IGEgZHVyYXRpb24gb2YgMCBmb3IgYnVmZmVycyBvdGhlcndpc2UgdGhleSBhcmUgZGlzY2FyZGVkCisJICBieSBHc3RCYXNlU2luay4KKwkgIEdzdFdhdkVuYyBuZWVkcyBzb21lIHNlcmlvdXMgbG92aW5nLCBhZnRlciBnb2luZyB0aHJvdWdoIHRoZSBjb2RlIEknbQorCSAgcmVhbGx5IHdvbmRlcmluZyBob3cgdGhpcyBjYW4gc3RheSBpbiAtZ29vZCAuLi4KKworMjAwNS0xMS0wMSAxNToxMToxNiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIEZpeCBsZWFrcyBhbmQgaW52YWxpZCBtZW1vcnkgYWNjZXNzIGFzIHJlcG9ydGVkIGJ5IHZhbGdyaW5kCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY2hlY2svZWxlbWVudHMvbWF0cm9za2FtdXguYzogKHNldHVwX3NyY19wYWQpLCAoc2V0dXBfc2lua19wYWQpLAorCSAgKHNldHVwX21hdHJvc2thbXV4KSwgKGNoZWNrX2J1ZmZlcl9kYXRhKSwgKEdTVF9TVEFSVF9URVNUKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9maW5hbGl6ZSksCisJICAoZ3N0X21hdHJvc2thX211eF9yZXNldCksIChnc3RfbWF0cm9za2FfbXV4X2F1ZGlvX3BhZF9zZXRjYXBzKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3N0YXJ0KSwgKGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfZGF0YSksCisJICAoZ3N0X21hdHJvc2thX211eF9jb2xsZWN0ZWQpOgorCSAgRml4IGxlYWtzIGFuZCBpbnZhbGlkIG1lbW9yeSBhY2Nlc3MgYXMgcmVwb3J0ZWQgYnkgdmFsZ3JpbmQKKworMjAwNS0xMS0wMSAxNDo0MTowMSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGNoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jOgorCSAgLi4uIGFuZCBhZGQgdGhlIG1pc3NpbmcgZmlsZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAuLi4gYW5kIGFkZCB0aGUgbWlzc2luZyBmaWxlCisKKzIwMDUtMTEtMDEgMTQ6MzY6MDIgKzAwMDAgIE1pY2hhbCBCZW5lcyA8bWljaGFsLmJlbmVzQHhlcmlzLmN6PgorCisJICBhZGQgYSB1bml0IHRlc3QgZm9yIG1hdHJvc2thbXV4IGZpeCB0aGUgYnVncyB0aGF0IHRoZSB1bml0IHRlc3QgZXhwb3NlZAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTWljaGFsIEJlbmVzIDxtaWNoYWwuYmVuZXNAeGVyaXMuY3o+CisJICAqIGNoZWNrL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOiAoZ3N0X2VibWxfd3JpdGVfc2Vlayk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfaGFuZGxlX3NyY19ldmVudCksCisJICAoZ3N0X21hdHJvc2thX211eF9hdWRpb19wYWRfc2V0Y2FwcyksIChnc3RfbWF0cm9za2FfbXV4X3N0YXJ0KToKKwkgIGFkZCBhIHVuaXQgdGVzdCBmb3IgbWF0cm9za2FtdXgKKwkgIGZpeCB0aGUgYnVncyB0aGF0IHRoZSB1bml0IHRlc3QgZXhwb3NlZAorCisyMDA1LTExLTAxIDE0OjM0OjIyICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgIGZpeCBNYWtlZmlsZS5hbQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBmaXggTWFrZWZpbGUuYW0KKworMjAwNS0xMS0wMSAxMjozOToxNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F1dG9kZXRlY3QvOiBGaXggc3RhdGUgY2hhbmdlIGZ1bmN0aW9uIGFuZCB1c2UgR1NUX0RFQlVHX0ZVTkNQVFIgaW4gY2xhc3NfaW5pdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJICAoZ3N0X2F1dG9fYXVkaW9fc2lua19jbGFzc19pbml0KSwKKwkgIChnc3RfYXV0b19hdWRpb19zaW5rX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkgIChnc3RfYXV0b192aWRlb19zaW5rX2NsYXNzX2luaXQpLAorCSAgKGdzdF9hdXRvX3ZpZGVvX3NpbmtfY2hhbmdlX3N0YXRlKToKKwkgIEZpeCBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24gYW5kIHVzZSBHU1RfREVCVUdfRlVOQ1BUUiBpbgorCSAgY2xhc3NfaW5pdC4KKworMjAwNS0xMS0wMSAxMjozNTozOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thLzogU2V0IHRpbWVzdGFtcHMgb24gb3V0Z29pbmcgZWJtbCBoZWFkZXJzIGFzIHdlbGwsIHNvIHRoYXQgdGhlIGVsZW1lbnQgYWZ0ZXIgbWF0cm9za2FtdXggY2FuIGdldCB0aGUgdGltLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJldmlld2VkIGJ5OiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisJICAqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6IChnc3RfZWJtbF93cml0ZV9uZXcpLAorCSAgKGdzdF9lYm1sX3dyaXRlX3Jlc2V0KSwgKGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfbmV3KToKKwkgICogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuaDoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF93cml0ZV9kYXRhKToKKwkgIFNldCB0aW1lc3RhbXBzIG9uIG91dGdvaW5nIGVibWwgaGVhZGVycyBhcyB3ZWxsLCBzbyB0aGF0IHRoZQorCSAgZWxlbWVudCBhZnRlciBtYXRyb3NrYW11eCBjYW4gZ2V0IHRoZSB0aW1lc3RhbXAgYWxyZWFkeSB3aGVuCisJICByZWFkaW5nIHRoZSBmaXJzdCBlYm1sIGVsZW1lbnQgYW5kIGRvZXNuJ3QgaGF2ZSB0byB3YWl0IGZvcgorCSAgdGhlIGFjdHVhbCBkYXRhIGJ1ZmZlciBmb3IgdGhhdCAoIzMyMDMwOCkuCisKKzIwMDUtMTAtMzEgMjI6MDg6NTIgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jIChnc3RfdmlkZW9taXhlcl9wYWRfdW5saW5rKQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEwLTMxICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmMgKGdzdF92aWRlb21peGVyX3BhZF91bmxpbmspCisJICAoZ3N0X3ZpZGVvbWl4ZXJfcGFkX2xpbmspOiBLaWxsIHNvbWUgbWVtbGVha3MuCisJICAoZ3N0X3ZpZGVvbWl4ZXJfcGFkX2dldF9wcm9wZXJ0eSk6IFN0eWxlIGZpeC4KKwkgIChnc3RfdmlkZW9taXhlcl9wYWRfc2V0X3Byb3BlcnR5KTogU3R5bGUgZml4LgorCSAgKGdzdF92aWRlb21peGVyX3BhZF9pbml0KTogU3R5bGUgZml4LgorCSAgKGdzdF92aWRlb21peGVyX3VwZGF0ZV9xdWV1ZXMpOiBLaWxsIG1lbWxlYWsuCisJICAoZ3N0X3ZpZGVvbWl4ZXJfbG9vcCk6IEtpbGwgbWVtbGVhay4KKwkgIChnc3RfdmlkZW9taXhlcl9jb2xsZWN0ZWQpOiBLaWxsIG1lbWxlYWsuCisKKzIwMDUtMTAtMzEgMTk6MDg6MjcgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSAgSnVzdCBzb21lIGNsZWFudXAuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEp1c3Qgc29tZSBjbGVhbnVwLgorCisyMDA1LTEwLTMxIDE0OjQxOjMxICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIENoYW5nZUxvZzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgQWRkIGNoZWNrcyB0byBHU1RfRkxPV19OT1RfTElOS0VEIGZvciB2YWx1ZXMgcmV0dXJuZWQgZnJvbSBnc3RfcGFkX3B1c2guCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEFkZCBjaGVja3MgdG8gR1NUX0ZMT1dfTk9UX0xJTktFRCBmb3IgdmFsdWVzIHJldHVybmVkIGZyb20gZ3N0X3BhZF9wdXNoLgorCisyMDA1LTEwLTMxIDEyOjAwOjEwICswMDAwICBaZWVzaGFuIEFsaSA8emVlbml4QGdtYWlsLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L3J0cC9nc3RydHBnNzExZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFkZXBheS5jOgorCSAgUGF5bG9hZGVyIG5vdyBzZXRzIHNvbWUgZGVmYXVsdCBjYXBzIG9uIHRoZSBzcmNwYWQgaWYgY2FwcyBvbiB0aGUgc2lua3BhZCBhcmUgbmV2ZXIgc2V0LiBUaGlzIGlzIGltcG9ydGFudCBmb3IgdGhlIGc3Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBheWxvYWRlciBub3cgc2V0cyBzb21lIGRlZmF1bHQgY2FwcyBvbiB0aGUgc3JjcGFkIGlmIGNhcHMgb24gdGhlIHNpbmtwYWQgYXJlIG5ldmVyIHNldC4gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHRoZSBnNzExIHRvIHdvcmsgd2l0aCBidXJnZXIncyBydHBiaW4gZWxlbWVudC4KKworMjAwNS0xMC0yOCAxOToxOTo0MCArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBDaGFuZ2VMb2c6CisJKiBjb21tb246CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkgIEFkZCBjaGVja3MgZm9yIHJldHVybiB2YWx1ZXMgZnJvbSBnc3RfcGFkX3B1c2ggYW5kIGdzdF9wYWRfYWxsb2NfYnVmZmVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBBZGQgY2hlY2tzIGZvciByZXR1cm4gdmFsdWVzIGZyb20gZ3N0X3BhZF9wdXNoIGFuZCBnc3RfcGFkX2FsbG9jX2J1ZmZlci4KKworMjAwNS0xMC0yOCAxNTozMjo0OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thLzogQWRkIFNpbXBsZUJsb2NrIHN1cHBvcnQgdG8gbWF0cm9za2EgZGVtdXhlciBhbmQgbXV4ZXIgKHBhcnQgb2YKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUmV2aWV3ZWQgYnk6IFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfaW5pdF9zdHJlYW0pLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmZvKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NsdXN0ZXIpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfY2xhc3NfaW5pdCksCisJICAoZ3N0X21hdHJvc2thX211eF9pbml0KSwgKGdzdF9tYXRyb3NrYV9tdXhfc3RhcnQpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfY3JlYXRlX2J1ZmZlcl9oZWFkZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfZGF0YSksIChnc3RfbWF0cm9za2FfbXV4X3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X21hdHJvc2thX211eF9nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJICBBZGQgU2ltcGxlQmxvY2sgc3VwcG9ydCB0byBtYXRyb3NrYSBkZW11eGVyIGFuZCBtdXhlciAocGFydCBvZgorCSAgTWF0cm9za2EgdjIpLiAoIzMxOTczMSkKKworMjAwNS0xMC0yOCAxMzoyNDo0MCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L2pwZWcvZ3N0anBlZ2RlYy4qOiBDbGVhbnVwcy4gRG9uJ3QgY3JlYXRlIGNhcHMgZm9yIGV2ZXJ5IGNoYWluLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogKGdzdF9qcGVnX2RlY19pbml0KSwgKGdzdF9qcGVnX2RlY19jaGFpbiksCisJICAoZ3N0X2pwZWdfZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkgIENsZWFudXBzLiBEb24ndCBjcmVhdGUgY2FwcyBmb3IgZXZlcnkgY2hhaW4uCisKKzIwMDUtMTAtMjcgMTg6NDY6MzIgKzAwMDAgIEZsYXZpbyBPbGl2ZWlyYSA8ZmxhdmlvLm9saXZlaXJhQGluZHQub3JnLmJyPgorCisJKiBDaGFuZ2VMb2c6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmg6CisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuaDoKKwkgIEZpeCB0byBzZXQgdGltZXN0YW1wIG9uIGJ1ZmZlciwgaXQgd2FzIHRlc3RlZCB3aXRoIFJUUCBHNzExIGVsZW1lbnRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGaXggdG8gc2V0IHRpbWVzdGFtcCBvbiBidWZmZXIsIGl0IHdhcyB0ZXN0ZWQgd2l0aCBSVFAgRzcxMSBlbGVtZW50cy4KKworMjAwNS0xMC0yNyAxMToyNzo1MyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOiBSZW1vdmUgZ290X3JlZGlyZWN0IGZyb20gY2xhc3Mgc3RydWN0dXJlIGFzIHdlbGwuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSAgUmVtb3ZlIGdvdF9yZWRpcmVjdCBmcm9tIGNsYXNzIHN0cnVjdHVyZSBhcyB3ZWxsLgorCisyMDA1LTEwLTI3IDExOjI1OjE5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFJlbW92ZSAnZ290LXJlZGlyZWN0JyBzaWduYWwgYW5kIHBvc3QgZWxlbWVudCBtZXNzYWdlIG9uIHRoZSBidXMgaW5zdGVhZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9jbGFzc19pbml0KSwKKwkgIChxdGRlbXV4X3BhcnNlX3RyZWUpOgorCSAgUmVtb3ZlICdnb3QtcmVkaXJlY3QnIHNpZ25hbCBhbmQgcG9zdCBlbGVtZW50IG1lc3NhZ2UKKwkgIG9uIHRoZSBidXMgaW5zdGVhZC4KKworMjAwNS0xMC0yNyAxMTowMDo0MCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgc3lzL29zcy9nc3Rvc3NzcmMuYzogU2V0IGNvcnJlY3QgZm9ybWF0IG9uIG9zcyBpbnN0ZWFkIG9mIGEgc2lsbHkgdmFsdWUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL29zcy9nc3Rvc3NzcmMuYzogKGdzdF9vc3Nfc3JjX3ByZXBhcmUpOgorCSAgU2V0IGNvcnJlY3QgZm9ybWF0IG9uIG9zcyBpbnN0ZWFkIG9mIGEgc2lsbHkgdmFsdWUuCisKKzIwMDUtMTAtMjcgMDk6NTI6MDggKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogVXNlIGxpYm9pbCBmb3IKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMC0yNyAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogKGdzdF92aWRlb19ib3hfY2xhc3NfaW5pdCksCisJICAoZ3N0X3ZpZGVvX2JveF90cmFuc2Zvcm1fY2FwcyksIChnc3RfdmlkZW9fYm94X3NldF9jYXBzKSwKKwkgIChnc3RfdmlkZW9fYm94X2dldF91bml0X3NpemUpLCAoZ3N0X3ZpZGVvX2JveF9jb3B5X3BsYW5lX2k0MjApLAorCSAgKGdzdF92aWRlb19ib3hfaTQyMCksIChnc3RfdmlkZW9fYm94X2F5dXYpOiBVc2UgbGlib2lsIGZvcgorCSAgSTQyMCByZW5kZXJpbmcgYXMgd2VsbCwgZG9lc24ndCBicmluZyBtdWNoIGZvciBteSBwbGF0Zm9ybS4KKwkgIE1pZ2h0IGhlbHAgb24gc29tZSBvdGhlciBwbGF0Zm9ybXMuCisKKzIwMDUtMTAtMjYgMjE6NDc6MzYgKzAwMDAgIFplZXNoYW4gQWxpIDx6ZWVuaXhAZ21haWwuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXJzZS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkgIERlY2xhcmluZyB0aGUgcGFkdGVtcGxhdGUgY29ycmVjdGx5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBEZWNsYXJpbmcgdGhlIHBhZHRlbXBsYXRlIGNvcnJlY3RseS4KKworMjAwNS0xMC0yNiAyMDoyODozMiArMDAwMCAgWmVlc2hhbiBBbGkgPHplZW5peEBnbWFpbC5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWRlYy5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzExZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzExcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXJzZS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkgIFNldHRpbmcgdGhlIHByb3BlciBjb3B5cmlnaHQgbm90aWNlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBTZXR0aW5nIHRoZSBwcm9wZXIgY29weXJpZ2h0IG5vdGljZS4KKworMjAwNS0xMC0yNiAxNzoyMzowNiArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC92aWRlb2JveC9NYWtlZmlsZS5hbTogVXNlIGxpYm9pbC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMC0yNiAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBnc3QvdmlkZW9ib3gvTWFrZWZpbGUuYW06IFVzZSBsaWJvaWwuCisJICAqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOiAoZ3N0X3ZpZGVvX2JveF9jbGFzc19pbml0KSwKKwkgIChnc3RfdmlkZW9fYm94X3NldF9wcm9wZXJ0eSksIChnc3RfdmlkZW9fYm94X3RyYW5zZm9ybV9jYXBzKSwKKwkgIChnc3RfdmlkZW9fYm94X3NldF9jYXBzKSwgKGdzdF92aWRlb19ib3hfZ2V0X3VuaXRfc2l6ZSksCisJICAoZ3N0X3ZpZGVvX2JveF9heXV2KTogTG90IG9mIG9wdGltaXphdGlvbiBpbiBBWVVWIHJlbmRlcmluZworCSAgdXNpbmcgbGlib2lsLiBXaWxsIGRvdCB0aGUgc2FtZSB0byBJNDIwIGJvcmRlciBnZW5lcmF0aW9uCisJICB0b21vcnJvdy4KKworMjAwNS0xMC0yNiAxNjozNjowMSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICBmaXggYXV0b21ha2Ugd2FybmluZ3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZml4IGF1dG9tYWtlIHdhcm5pbmdzCisKKzIwMDUtMTAtMjYgMTQ6NTA6NTkgKzAwMDAgIFplZXNoYW4gQWxpIDx6ZWVuaXhAZ21haWwuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFkZWMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWRlYy5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzExZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFlbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc21lbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGFyc2UuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGFyc2UuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJICBIYWNrZWQgdGhlIEc3MTEgKGRlKXBheWxvYWRlciB0byB0cnkgdG8gbWFrZSB0aGluZ3MgcmlnaHQuIHJ0cGc3MTFkZWMgbm93IGluaGVyaXRzIGZyb20gdGhlIGJhc2VydHBkZXBheWxvYWRlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgSGFja2VkIHRoZSBHNzExIChkZSlwYXlsb2FkZXIgdG8gdHJ5IHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiBydHBnNzExZGVjIG5vdyBpbmhlcml0cyBmcm9tIHRoZSBiYXNlcnRwZGVwYXlsb2FkZXIuCisKKzIwMDUtMTAtMjYgMTQ6MjM6NDUgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogUmVtb3ZpbmcgdGhpcyBmb3Jnb3R0ZW4gZGVidWcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTAtMjYgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X2NsYXNzX2luaXQpLAorCSAgKGdzdF92aWRlb19ib3hfdHJhbnNmb3JtX2NhcHMpLCAoZ3N0X3ZpZGVvX2JveF9nZXRfdW5pdF9zaXplKSwKKwkgIChnc3RfdmlkZW9fYm94X2F5dXYpOiBSZW1vdmluZyB0aGlzIGZvcmdvdHRlbiBkZWJ1Zy4KKworMjAwNS0xMC0yNiAxNDowODo0OSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOiBGaXggdGhlIHN0cmlkZSBpc3N1ZSB3aGVuIGJveGluZyB0byBBWVVWLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEwLTI2ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOiAoZ3N0X3ZpZGVvX2JveF9jbGFzc19pbml0KSwKKwkgIChnc3RfdmlkZW9fYm94X3RyYW5zZm9ybV9jYXBzKSwgKGdzdF92aWRlb19ib3hfZ2V0X3VuaXRfc2l6ZSksCisJICAoZ3N0X3ZpZGVvX2JveF9heXV2KTogRml4IHRoZSBzdHJpZGUgaXNzdWUgd2hlbiBib3hpbmcgdG8gQVlVVi4KKworMjAwNS0xMC0yNiAxMToxMjozNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgc3lzL29zcy86IEFjdHVhbGx5IHVzZSB0aGUgJ29zcycgZGVidWcgY2F0ZWdvcnkgd2UgcmVnaXN0ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL29zcy9nc3Rvc3NhdWRpby5jOgorCSAgKiBzeXMvb3NzL2dzdG9zc2RtYWJ1ZmZlci5jOgorCSAgKiBzeXMvb3NzL2dzdG9zc2hlbHBlci5jOgorCSAgKiBzeXMvb3NzL2dzdG9zc21peGVyLmM6CisJICAqIHN5cy9vc3MvZ3N0b3NzbWl4ZXJlbGVtZW50LmM6CisJICAqIHN5cy9vc3MvZ3N0b3NzbWl4ZXJ0cmFjay5jOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzoKKwkgICogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkgIEFjdHVhbGx5IHVzZSB0aGUgJ29zcycgZGVidWcgY2F0ZWdvcnkgd2UgcmVnaXN0ZXIuCisKKzIwMDUtMTAtMjYgMTA6Mzg6MTggKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IFVzZSBnc3RfcGFkX2dldF9wYXJlbnQgYW5kIGRyb3AgdGhlIHJlZiB0aGF0IHdhcyBhZGRlZCB0aHJvdWdoIHRoYXQgY2FsbC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMC0yNiAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICAoZ3N0X3ZpZGVvbWl4ZXJfcGFkX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfcGFkX3Npbmtfc2V0Y2FwcyksIChnc3RfdmlkZW9taXhlcl9nZXRjYXBzKToKKwkgIFVzZSBnc3RfcGFkX2dldF9wYXJlbnQgYW5kIGRyb3AgdGhlIHJlZiB0aGF0IHdhcyBhZGRlZCB0aHJvdWdoCisJICB0aGF0IGNhbGwuCisKKzIwMDUtMTAtMjYgMTA6MDM6MDIgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkgIGZpeCBjb21waWxhdGlvbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBmaXggY29tcGlsYXRpb24KKworMjAwNS0xMC0yNSAyMTowOTozNiArMDAwMCAgRmxhdmlvIE9saXZlaXJhIDxmbGF2aW8ub2xpdmVpcmFAaW5kdC5vcmcuYnI+CisKKwkqIENoYW5nZUxvZzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWRlYy5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzExZGVwYXkuYzoKKwkgIEp1c3QgcmVtb3ZlZCBhIGNvdXBsZSBvZiBsaW5lcyBvZiB3ZWlyZCBjb2RlIHVzZWQgZHVyaW5nIGRldmVsb3BtZW50L3Rlc3QgdGltZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgSnVzdCByZW1vdmVkIGEgY291cGxlIG9mIGxpbmVzIG9mIHdlaXJkIGNvZGUgdXNlZCBkdXJpbmcgZGV2ZWxvcG1lbnQvdGVzdCB0aW1lLgorCisyMDA1LTEwLTI1IDE5OjE5OjM4ICswMDAwICBGbGF2aW8gT2xpdmVpcmEgPGZsYXZpby5vbGl2ZWlyYUBpbmR0Lm9yZy5icj4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFkZWMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWRlYy5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzExZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFlbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWVuYy5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzExcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFwYXkuaDoKKwkgIEc3MTEgcGF5bG9hZGVyIGFuZCBkZXBheWxvYWRlciBjcmVhdGVkIGJ5IEVkZ2FyZCBMaW1hIChpdCBzdXBwb3J0cyBtdWxhdyBhbmQgYWxhdyAoZGVjKWVuY29kZXJzKQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBHNzExIHBheWxvYWRlciBhbmQgZGVwYXlsb2FkZXIgY3JlYXRlZCBieSBFZGdhcmQgTGltYSAoaXQgc3VwcG9ydHMKKwkgIG11bGF3IGFuZCBhbGF3IChkZWMpZW5jb2RlcnMpCisKKzIwMDUtMTAtMjUgMTc6NTU6MTkgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogRG9oICEgSSBpbnRyb2R1Y2VkIHdpbmdvJ3MgYnVnIGFnYWluICEgU29ycnkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMC0yNSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogKGdzdF92aWRlb19ib3hfY2xhc3NfaW5pdCksCisJICAoZ3N0X3ZpZGVvX2JveF90cmFuc2Zvcm1fY2FwcyksIChnc3RfdmlkZW9fYm94X2dldF91bml0X3NpemUpOgorCSAgRG9oICEgSSBpbnRyb2R1Y2VkIHdpbmdvJ3MgYnVnIGFnYWluICEgU29ycnkuLi4KKworMjAwNS0xMC0yNSAxNjowMjozOCArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgYWRkIG1pc3NpbmcgaGVhZGVyIGZpbGVzIGZvciBkaXN0aW5nCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCBtaXNzaW5nIGhlYWRlciBmaWxlcyBmb3IgZGlzdGluZworCisyMDA1LTEwLTI1IDE1OjA3OjAyICswMDAwICBaZWVzaGFuIEFsaSA8emVlbml4QGdtYWlsLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc21lbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtZW5jLmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBhcnNlLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBhcnNlLmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuaDoKKwkgIEdldHRpbmcgdGhlIEdTTSAoZGUpcGF5bG9hZGVyIHdvcmtpbmcgYW5kIGNvbXBhdGlibGUgd2l0aCBvdXIgcGxhbnMgZm9yIFJUUC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgR2V0dGluZyB0aGUgR1NNIChkZSlwYXlsb2FkZXIgd29ya2luZyBhbmQgY29tcGF0aWJsZSB3aXRoIG91ciBwbGFucyBmb3IgUlRQLgorCisyMDA1LTEwLTI1IDEzOjAzOjA0ICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJICBmaXggbWlzdGFrZW4gY2xhaW0gb24gR1BMLCBpdHMgTEdQTAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBmaXggbWlzdGFrZW4gY2xhaW0gb24gR1BMLCBpdHMgTEdQTAorCisyMDA1LTEwLTI1IDEwOjQ3OjA5ICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogUHVzaCBhIG5ld3NlZ21lbnQgZXZlbnQsIG1vdmUgc29tZSByZWR1bmRhbnQgY29kZSBpbiBhIHNpbmdsZSBwbGFjZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMC0yNSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiAodXNlcl9pbmZvX2NhbGxiYWNrKSwKKwkgIChnc3RfcG5nZGVjX2NhcHNfY3JlYXRlX2FuZF9zZXQpLCAoZ3N0X3BuZ2RlY190YXNrKTogUHVzaAorCSAgYSBuZXdzZWdtZW50IGV2ZW50LCBtb3ZlIHNvbWUgcmVkdW5kYW50IGNvZGUgaW4gYSBzaW5nbGUgcGxhY2UuCisKKzIwMDUtMTAtMjUgMTA6MjM6MjYgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiBUZW1wb3JhcnkgaGFjayB0byBnZXQgY29ycmVjdCBjb2xvcnMgb3JkZXIgd2hlbiB3ZSBoYXZlIGEgcG5nIGltYWdlIHdpdGggYWxwaGEgY2hhbm5lbC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMC0yNSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiAodXNlcl9pbmZvX2NhbGxiYWNrKSwKKwkgIChnc3RfcG5nZGVjX2NhcHNfY3JlYXRlX2FuZF9zZXQpLCAoZ3N0X3BuZ2RlY190YXNrKTogVGVtcG9yYXJ5CisJICBoYWNrIHRvIGdldCBjb3JyZWN0IGNvbG9ycyBvcmRlciB3aGVuIHdlIGhhdmUgYSBwbmcgaW1hZ2Ugd2l0aAorCSAgYWxwaGEgY2hhbm5lbC4KKworMjAwNS0xMC0yNCAxNzoyOTowMiArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZXh0L2R2L2dzdGR2ZGVtdXguYzogQ2FsbCBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgd2hlbiB0aGVyZSB3aWxsIGJlIG5vIG1vcmUgcGFkcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5jOiAoZ3N0X2R2ZGVtdXhfYWRkX3BhZHMpOgorCSAgQ2FsbCBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgd2hlbiB0aGVyZSB3aWxsIGJlIG5vIG1vcmUgcGFkcy4KKworMjAwNS0xMC0yNCAxNjozOTozOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IEFkZGVkIHR3byBuZXcgcGF5bG9hZGVycywgYW4gUkZDIDIxOTAgcGF5bG9hZGVyIGZvciBoMjYzIGFuZCBhIHBheWxvYWQgY29udmVydG9yIGZvciBhbiBhc3RlcmlzayBzZXJ2ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzogKGdzdF9hc3Rlcmlza2gyNjNfZ2V0X3R5cGUpLAorCSAgKGdzdF9hc3Rlcmlza2gyNjNfYmFzZV9pbml0KSwgKGdzdF9hc3Rlcmlza2gyNjNfY2xhc3NfaW5pdCksCisJICAoZ3N0X2FzdGVyaXNraDI2M19pbml0KSwgKGdzdF9hc3Rlcmlza2gyNjNfZmluYWxpemUpLAorCSAgKGdzdF9hc3Rlcmlza2gyNjNfY2hhaW4pLCAoZ3N0X2FzdGVyaXNraDI2M19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hc3Rlcmlza2gyNjNfZ2V0X3Byb3BlcnR5KSwgKGdzdF9hc3Rlcmlza2gyNjNfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfYXN0ZXJpc2toMjYzX3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuaDoKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzZW5jLmM6IChnc3RfcnRwaDI2M2VuY19nZXRfdHlwZSksCisJICAoZ3N0X3J0cGgyNjNlbmNfYmFzZV9pbml0KSwgKGdzdF9ydHBoMjYzZW5jX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBoMjYzZW5jX2luaXQpLCAoZ3N0X3J0cGgyNjNlbmNfZmluYWxpemUpLAorCSAgKGdzdF9ydHBoMjYzZW5jX3NldGNhcHMpLCAoZ3N0X3J0cGgyNjNlbmNfZ29iZmluZXIpLAorCSAgKGdzdF9ydHBoMjYzZW5jX2ZsdXNoKSwgKGdzdF9ydHBoMjYzZW5jX2hhbmRsZV9idWZmZXIpLAorCSAgKGdzdF9ydHBoMjYzZW5jX3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzZW5jLmg6CisJICBBZGRlZCB0d28gbmV3IHBheWxvYWRlcnMsIGFuIFJGQyAyMTkwIHBheWxvYWRlciBmb3IgaDI2MyBhbmQKKwkgIGEgcGF5bG9hZCBjb252ZXJ0b3IgZm9yIGFuIGFzdGVyaXNrIHNlcnZlci4KKworMjAwNS0xMC0yNCAxNTo1NzoxNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgc3lzL29zcy9nc3Rvc3NzcmMuYzogU2V0IGJ5dGVzX3Blcl9zYW1wbGUgY29ycmVjdGx5IChpcyBub3QgYWx3YXlzIDQsIGJ1dCBkZXBlbmRzIG9uIHdpZHRoIGFuZCBudW1iZXIgb2YgY2hhbm5lbHMpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc3JjLmM6IChnc3Rfb3NzX3NyY19wcmVwYXJlKToKKwkgIFNldCBieXRlc19wZXJfc2FtcGxlIGNvcnJlY3RseSAoaXMgbm90IGFsd2F5cyA0LCBidXQKKwkgIGRlcGVuZHMgb24gd2lkdGggYW5kIG51bWJlciBvZiBjaGFubmVscykuCisKKzIwMDUtMTAtMjQgMTU6NTA6MDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9mbGFjL2dzdGZsYWNlbmMuKjogRml4IHNlZWtpbmcsIHNvIHRoYXQgZmxhY2VuYyBjYW4gcmV3cml0ZSB0aGUgaGVhZGVyIHdpdGggdGhlIGNvcnJlY3QgZHVyYXRpb24gYW5kIGFtb3VudCBvZiBzYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzogKGdzdF9mbGFjZW5jX2Jhc2VfaW5pdCksCisJICAoZ3N0X2ZsYWNlbmNfaW5pdCksIChnc3RfZmxhY2VuY19zaW5rX3NldGNhcHMpLAorCSAgKGdzdF9mbGFjZW5jX3NlZWtfY2FsbGJhY2spLCAoZ3N0X2ZsYWNlbmNfd3JpdGVfY2FsbGJhY2spLAorCSAgKGdzdF9mbGFjZW5jX3NpbmtfZXZlbnQpLCAoZ3N0X2ZsYWNlbmNfY2hhaW4pLAorCSAgKGdzdF9mbGFjZW5jX3NldF9wcm9wZXJ0eSksIChnc3RfZmxhY2VuY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9mbGFjZW5jX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNlbmMuaDoKKwkgIEZpeCBzZWVraW5nLCBzbyB0aGF0IGZsYWNlbmMgY2FuIHJld3JpdGUgdGhlIGhlYWRlciB3aXRoIHRoZQorCSAgY29ycmVjdCBkdXJhdGlvbiBhbmQgYW1vdW50IG9mIHNhbXBsZXMgYW5kIGFsbCB0aGF0IGF0IEVPUzsKKwkgIGFsc28gc2V0IHRpbWVzdGFtcHMgYW5kIGdyYW51bGVwb3Mgb24gb3V0Z29pbmcgYnVmZmVyczsgYWRkCisJICBkZWJ1ZyBjYXRlZ29yeTsgZml4IHN0YXRlIGNoYW5nZSBmdW5jdGlvbi4KKworMjAwNS0xMC0yNCAxMzo0NjowOSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogRG9uJ3QgcmVzdHJpY3QgdmlkZW8gZ2VvbWV0cnkgZnJvbSAxNiB0byA0MDk2LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEwLTI0ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogRG9uJ3QgcmVzdHJpY3QgdmlkZW8gZ2VvbWV0cnkKKwkgIGZyb20gMTYgdG8gNDA5Ni4KKworMjAwNS0xMC0yNCAxMzoyMjoxNCArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOiBGaXggY2FwcyBuZWdvdGlhdGlvbiBjb3JyZWN0bHksIGFkZCBkZWJ1Z2dpbmcgY2F0ZWdvcnkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTAtMjQgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X2NsYXNzX2luaXQpLAorCSAgKGdzdF92aWRlb19ib3hfdHJhbnNmb3JtX2NhcHMpLCAoZ3N0X3ZpZGVvX2JveF9nZXRfdW5pdF9zaXplKToKKwkgIEZpeCBjYXBzIG5lZ290aWF0aW9uIGNvcnJlY3RseSwgYWRkIGRlYnVnZ2luZyBjYXRlZ29yeS4KKworMjAwNS0xMC0yNCAxMzowMjo0NyArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBjb25maWd1cmUuYWM6CisJICBwb3J0IG92ZXIgcGx1Z2luIGxpc3RpbmcgZnJvbSBiYXNlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHBvcnQgb3ZlciBwbHVnaW4gbGlzdGluZyBmcm9tIGJhc2UKKworMjAwNS0xMC0yNCAwODo1OToyNCArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IERvbid0IHVzZSBmaXhlZCBjYXBzIG9uIGEgc2luayBwYWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTAtMjQgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogKGdzdF9wbmdkZWNfaW5pdCk6IERvbid0IHVzZSBmaXhlZAorCSAgY2FwcyBvbgorCSAgYSBzaW5rIHBhZC4KKworMjAwNS0xMC0yMyAyMzowNTo1OSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvdXBsb2FkLm1hazoKKwkgIGJhY2sgdG8gSEVBRAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBiYWNrIHRvIEhFQUQKKworPT09IHJlbGVhc2UgMC45LjQgPT09CisKKzIwMDUtMTAtMjMgMjI6NDM6MDggKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnNpZ25hbHM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJICByZWxlYXNpbmcgMC45LjQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmVsZWFzaW5nIDAuOS40CisKKzIwMDUtMTAtMjMgMTE6MDc6MTAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJKiBwby9QT1RGSUxFUy5pbjoKKwkgIFNUT1BQRUQtPkZBSUxFRAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBTVE9QUEVELT5GQUlMRUQKKworMjAwNS0xMC0yMSAxNzowMDo1OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6IEFkZCBwb3NpdGlvbiBhbmQgZHVyYXRpb24gcXVlcnksIGZpeCBxdWVyeSB0eXBlIGZ1bmN0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiAoZ3N0X3NwZWV4ZW5jX2dldF9xdWVyeV90eXBlcyksCisJICAoZ3N0X3NwZWV4ZW5jX3NyY19xdWVyeSk6CisJICBBZGQgcG9zaXRpb24gYW5kIGR1cmF0aW9uIHF1ZXJ5LCBmaXggcXVlcnkgdHlwZSBmdW5jdGlvbi4KKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3ZpZGVvX2NhcHMpLCAoZ3N0X21hdHJvc2thX2RlbXV4X2F1ZGlvX2NhcHMpOgorCSAgTGV0J3Mgbm90IHNldCBub24tZml4ZWQgY2FwcyBvbiBzb3VyY2UgcGFkcy4KKworMjAwNS0xMC0yMSAxNjoxNTo1NyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgU2V0IGNvcnJlY3Qgc3RyZWFtX3RpbWUgaW4gbmV3c2VnbWVudCBldmVudC4gYXZpIGNhbiBhbHNvIGhhbmRsZSBhIGR1cmF0aW9uIHF1ZXJ5IG5vdy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5jOiAoZ3N0X2R2ZGVtdXhfZGVtdXhfZnJhbWUpOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2dldF9zcmNfcXVlcnlfdHlwZXMpLAorCSAgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspOgorCSAgU2V0IGNvcnJlY3Qgc3RyZWFtX3RpbWUgaW4gbmV3c2VnbWVudCBldmVudC4KKwkgIGF2aSBjYW4gYWxzbyBoYW5kbGUgYSBkdXJhdGlvbiBxdWVyeSBub3cuCisKKzIwMDUtMTAtMjEgMTA6MDY6NDAgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgdXBkYXRlIGZvciBsYXRlc3QgYWRkaXRpb25zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHVwZGF0ZSBmb3IgbGF0ZXN0IGFkZGl0aW9ucworCisyMDA1LTEwLTIwIDE5OjE0OjI3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogRml4IGR1cmF0aW9uIHF1ZXJ5OyBmaXggYmFzZXRpbWUgaW4gbmV3c2VnbWVudCBldmVudCBhZnRlciBzZWVrOyBmaXggZHVyYXRpb24gaW4gaW5pdGkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX2V2ZW50KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfbG9vcF9zdHJlYW1fcGFyc2VfaWQpOgorCSAgRml4IGR1cmF0aW9uIHF1ZXJ5OyBmaXggYmFzZXRpbWUgaW4gbmV3c2VnbWVudCBldmVudCBhZnRlcgorCSAgc2VlazsgZml4IGR1cmF0aW9uIGluIGluaXRpYWwgbmV3c2VnbWVudCBldmVudC4KKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9tdXhfYXVkaW9fcGFkX3NldGNhcHMpLCAoZ3N0X21hdHJvc2thX211eF9zdGFydCk6CisJICBFeHRyYWN0IG51bWJlciBvZiBjaGFubmVscyBhbmQgc2FtcGxlcmF0ZSBmcm9tIHZvcmJpcyBoZWFkZXJzOworCSAgYWRkIHNvbWUgZGVidWcgbWVzc2FnZXMgd2hlbiBxdWVyeWluZyB0aGUgZHVyYXRpb25zIG9mIHRoZQorCSAgaW5wdXQgc3RyZWFtcy4KKworMjAwNS0xMC0yMCAxMTo1MDo1MyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IFNldCBzdHJlYW0gdGltZSBjb3JyZWN0bHkgaW4gbmV3c2VnbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9oYW5kbGVfc2VlayksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKSwgKGdzdF93YXZwYXJzZV9zdHJlYW1fZGF0YSksCisJICAoZ3N0X3dhdnBhcnNlX3BhZF9jb252ZXJ0KSwgKGdzdF93YXZwYXJzZV9zcmNwYWRfZXZlbnQpOgorCSAgU2V0IHN0cmVhbSB0aW1lIGNvcnJlY3RseSBpbiBuZXdzZWdtZW50LgorCisyMDA1LTEwLTIwIDExOjM5OjQwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IENvcnJlY3RseSBmaWxsIGluIHRoZSBzdHJlYW0gdGltZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zZWVrKToKKwkgIENvcnJlY3RseSBmaWxsIGluIHRoZSBzdHJlYW0gdGltZS4KKworMjAwNS0xMC0xOSAyMDo0ODoyNCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGNoZWNrL2VsZW1lbnRzL2xldmVsLmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkqIGdzdC9sZXZlbC9sZXZlbC1leGFtcGxlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgdXNlIEVMRU1FTlQgbWVzc2FnZXMgaW5zdGVhZAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICB1c2UgRUxFTUVOVCBtZXNzYWdlcyBpbnN0ZWFkCisKKzIwMDUtMTAtMTkgMTU6NTg6MDAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC86IEFQSSBjaGFuZ2UgZml4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2dldF9zcmNfcXVlcnlfdHlwZXMpLAorCSAgKGdzdF9xdGRlbXV4X2hhbmRsZV9zcmNfcXVlcnkpOgorCSAgKiBnc3Qvc3BlZWQvZ3N0c3BlZWQuYzogKHNwZWVkX2dldF9xdWVyeV90eXBlcyksIChzcGVlZF9zcmNfcXVlcnkpOgorCSAgKiBnc3QvdHRhL2dzdHR0YXBhcnNlLmM6IChnc3RfdHRhX3BhcnNlX3NyY19ldmVudCksCisJICAoZ3N0X3R0YV9wYXJzZV9nZXRfcXVlcnlfdHlwZXMpLCAoZ3N0X3R0YV9wYXJzZV9xdWVyeSk6CisJICBBUEkgY2hhbmdlIGZpeC4KKworMjAwNS0xMC0xOSAxNTo1NzowNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgQVBJIGNoYW5nZSBmaXguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2dldF9zcmNfcXVlcnlfdHlwZXMpLAorCSAgKGdzdF9kdmRlbXV4X3NyY19xdWVyeSk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjZGVjX2xlbmd0aCksCisJICAoZ3N0X2ZsYWNkZWNfc3JjX3F1ZXJ5KToKKwkgICogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IChnc3RfZHYxMzk0c3JjX3F1ZXJ5KToKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IChzcGVleF9kZWNfc3JjX3F1ZXJ5KToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KToKKwkgICogZ3N0L2RlYnVnL2dzdG5hdnNlZWsuYzogKGdzdF9uYXZzZWVrX3NlZWspOgorCSAgKiBnc3QvZGVidWcvcHJvZ3Jlc3NyZXBvcnQuYzogKGdzdF9wcm9ncmVzc19yZXBvcnRfcmVwb3J0KToKKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOiAoZ3N0X2VibWxfcmVhZF9nZXRfbGVuZ3RoKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChnc3RfbWF0cm9za2FfbXV4X3N0YXJ0KToKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfaGFuZGxlX3NlZWspLAorCSAgKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpLAorCSAgKGdzdF93YXZwYXJzZV9wYWRfY29udmVydCksIChnc3Rfd2F2cGFyc2VfcGFkX3F1ZXJ5KSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3JjcGFkX2V2ZW50KToKKwkgIEFQSSBjaGFuZ2UgZml4LgorCisyMDA1LTEwLTE5IDEwOjU3OjQ2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvZ29vbS86IE1ha2UgaW5saW5lIGZ1bmN0aW9ucyBlaXRoZXIgJ3N0YXRpYyBpbmxpbmUnIG9yICdleHRlcm4gaW5saW5lJywgb3RoZXJ3aXNlIHRoZSBGb3J0ZSBjb21waWxlciBhcHBhcmVudGx5IHcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbS9maWx0ZXJzLmM6CisJICAqIGdzdC9nb29tL2dyYXBoaWMuaDoKKwkgICogZ3N0L2dvb20vbGluZXMuYzoKKwkgIE1ha2UgaW5saW5lIGZ1bmN0aW9ucyBlaXRoZXIgJ3N0YXRpYyBpbmxpbmUnIG9yICdleHRlcm4gaW5saW5lJywKKwkgIG90aGVyd2lzZSB0aGUgRm9ydGUgY29tcGlsZXIgYXBwYXJlbnRseSB3b24ndCBpbmxpbmUgdGhlbSAoIzMxNzMwMCkuCisKKzIwMDUtMTAtMTggMjI6NTA6MTEgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiBmb3Jnb3QgdGhlIGJ1ZmZlciB1bnJlZiBpbiBwdWxsLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEwLTE5ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IGZvcmdvdCB0aGUgYnVmZmVyIHVucmVmIGluIHB1bGwuCisKKzIwMDUtMTAtMTggMjI6NDQ6MTEgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBleHQvbGlicG5nL2dzdHBuZ2RlYy4qOiBDb21wbGV0ZSByZXdyaXRlIG9mIHBuZ2RlYy4gSXQncyBub3cgdmVyeSBuaWNlIGFuZCBoYW5kbGUgcHVzaC9wdWxsIGJhc2VkIG1vZGVsLiBpZiB5b3UgaGF2ZSAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMC0xOSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiAoZ3N0X3BuZ2RlY19jbGFzc19pbml0KSwKKwkgIChnc3RfcG5nZGVjX2luaXQpLCAodXNlcl9lcnJvcl9mbiksICh1c2VyX3dhcm5pbmdfZm4pLAorCSAgKHVzZXJfaW5mb19jYWxsYmFjayksICh1c2VyX2VuZHJvd19jYWxsYmFjayksCisJICAodXNlcl9lbmRfY2FsbGJhY2spLAorCSAgKHVzZXJfcmVhZF9kYXRhKSwgKGdzdF9wbmdkZWNfY2Fwc19jcmVhdGVfYW5kX3NldCksCisJICAoZ3N0X3BuZ2RlY190YXNrKSwgKGdzdF9wbmdkZWNfY2hhaW4pLCAoZ3N0X3BuZ2RlY19zaW5rX2V2ZW50KSwKKwkgIChnc3RfcG5nZGVjX2xpYnBuZ19jbGVhciksIChnc3RfcG5nZGVjX2xpYnBuZ19pbml0KSwKKwkgIChnc3RfcG5nZGVjX2NoYW5nZV9zdGF0ZSksIChnc3RfcG5nZGVjX3NpbmtfYWN0aXZhdGVfcHVzaCksCisJICAoZ3N0X3BuZ2RlY19zaW5rX2FjdGl2YXRlX3B1bGwpLCAoZ3N0X3BuZ2RlY19zaW5rX2FjdGl2YXRlKToKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuaDogQ29tcGxldGUgcmV3cml0ZSBvZiBwbmdkZWMuIEl0J3Mgbm93CisJICB2ZXJ5IG5pY2UgYW5kIGhhbmRsZSBwdXNoL3B1bGwgYmFzZWQgbW9kZWwuIGlmIHlvdSBoYXZlIGZpbGVzcmMKKwkgIGNvbm5lY3RlZCB0byBpdCwgaXQgd2lsbCBkbyByYW5kb20gYWNjZXNzIHRvIGxvYWQgdGhlIHBuZyBmaWxlLgorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIHNvdXJjZSB0aGF0IGNhbid0IGRvIF9nZXRyYW5nZSwgaXQgZG9lcworCSAgcHJvZ3Jlc3NpdmUgbG9hZGluZyB0aHJvdWdoIHRoZSBjaGFpbiBmdW5jdGlvbi4KKwkgICogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzogKGdzdF9hbHBoYV9jb2xvcl90cmFuc2Zvcm1fY2FwcyksCisJICAodHJhbnNmb3JtX3JnYiksICh0cmFuc2Zvcm1fYmdyKTogRml4IGNhcHMgbmVnb3RpYXRpb24gY29ycmVjdGx5CisJICB0aGFua3MgdG8gTWFzdGVyIFdpbSBUYXltYW5zIDstKQorCisyMDA1LTEwLTE4IDE4OjEyOjMxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvOiBQb3J0ZWQgbWF0cm9za2EgZGVtdXhlciB0byAwLjkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6CisJICAqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuaDoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EuYzogKHBsdWdpbl9pbml0KToKKwkgIFBvcnRlZCBtYXRyb3NrYSBkZW11eGVyIHRvIDAuOS4KKworMjAwNS0xMC0xOCAxODowNjoxNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBGaXggbXBlZzQgaW5wdXQgaGFuZGxpbmcgKCMzMTg4NDcpOyBhbHNvLCB3aGlsZSB3ZSdyZSBhdCBpdCwgZml4IG1lZGlhIHR5cGUgZm9yIE1vdGlvbi1KLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJldmlld2VkIGJ5OiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIChnc3RfbWF0cm9za2FfbXV4X3ZpZGVvX3BhZF9zZXRjYXBzKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X2F1ZGlvX3BhZF9zZXRjYXBzKToKKwkgIEZpeCBtcGVnNCBpbnB1dCBoYW5kbGluZyAoIzMxODg0Nyk7IGFsc28sIHdoaWxlIHdlJ3JlIGF0IGl0LAorCSAgZml4IG1lZGlhIHR5cGUgZm9yIE1vdGlvbi1KUEVHOiBzaG91bGQgYmUgaW1hZ2UvanBlZy4KKworMjAwNS0xMC0xOCAxMzoyMToxOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IEZpeCBmb3Igc2VnbWVudC1zdGFydC9zdG9wIEFQSSBjaGFuZ2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfaGFuZGxlX3NlZWspLAorCSAgKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpLAorCSAgKGdzdF93YXZwYXJzZV9wYWRfY29udmVydCksIChnc3Rfd2F2cGFyc2Vfc3JjcGFkX2V2ZW50KToKKwkgIEZpeCBmb3Igc2VnbWVudC1zdGFydC9zdG9wIEFQSSBjaGFuZ2UuCisKKzIwMDUtMTAtMTcgMTc6MTg6NTYgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOiBIYW5kbGUgY2FwcyBuZWdvdGlhdGlvbiBpbiBhIGJldHRlciB3YXkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTAtMTcgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzogKGdzdF9hbHBoYV9jb2xvcl90cmFuc2Zvcm1fY2FwcyksCisJICAodHJhbnNmb3JtX3JnYiksICh0cmFuc2Zvcm1fYmdyKTogSGFuZGxlIGNhcHMgbmVnb3RpYXRpb24gaW4gYQorCSAgYmV0dGVyCisJICB3YXkuCisKKzIwMDUtMTAtMTcgMTY6NTk6MjAgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogRml4IGNhcHMgbmVnbyBzb21lIG1vcmUgdG8gZ2V0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTAtMTcgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X3RyYW5zZm9ybV9jYXBzKSwKKwkgIChnc3RfdmlkZW9fYm94X2dldF91bml0X3NpemUpOiBGaXggY2FwcyBuZWdvIHNvbWUgbW9yZSB0byBnZXQKKwkgIEFZVVYKKwkgIG91dHB1dCBkZWNsYXJlZCBpbiB0cmFuc2Zvcm1fY2Fwcy4KKworMjAwNS0xMC0xNyAxNToyMzoyNCArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IFdlIHVzZSBmaXhlZCBjYXBzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEwLTE3ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IChnc3RfcG5nZGVjX2luaXQpOiBXZSB1c2UgZml4ZWQgY2Fwcy4KKworMjAwNS0xMC0xNyAxNToxNDoyOSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOiBGaXggd3Jvbmcgc2l6ZSBjYWxjdWxhdGlvbnMgYW5kIGltcGxlbWVudCBnZXRfdW5pdF9zaXplIGNvcnJlY3RseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMC0xNyAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogKGdzdF92aWRlb19ib3hfdHJhbnNmb3JtX2NhcHMpLAorCSAgKGdzdF92aWRlb19ib3hfZ2V0X3VuaXRfc2l6ZSk6IEZpeCB3cm9uZyBzaXplIGNhbGN1bGF0aW9ucyBhbmQKKwkgIGltcGxlbWVudCBnZXRfdW5pdF9zaXplIGNvcnJlY3RseS4KKworMjAwNS0xMC0xNyAxNDo1NjoxMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBFbmFibGUgZmx4IHBsdWdpbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBFbmFibGUgZmx4IHBsdWdpbi4KKwkgICogZ3N0L2ZseC9nc3RmbHhkZWMuYzogKGZseF9kZWNvZGVfY2h1bmtzKToKKwkgIEZpeCBnY2M0IHNpZ25lZG5lc3MgaXNzdWUuCisKKzIwMDUtMTAtMTcgMDg6NDY6MzAgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBjb25maWd1cmUuYWM6IEFkZGluZyB2aWRlb21peGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEwLTE3ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGNvbmZpZ3VyZS5hYzogQWRkaW5nIHZpZGVvbWl4ZXIuCisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IChnc3RfcG5nZGVjX2NsYXNzX2luaXQpLAorCSAgKHVzZXJfcmVhZF9kYXRhKSwgKGdzdF9wbmdkZWNfY2hhaW4pOiBNb3JlIGRlYnVnZ2luZy4KKwkgICogZ3N0L2FscGhhL01ha2VmaWxlLmFtOiBBZGRpbmcgYWxwaGFjb2xvcgorCSAgKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOiAoZ3N0X2FscGhhX2NvbG9yX2Jhc2VfaW5pdCksCisJICAoZ3N0X2FscGhhX2NvbG9yX2NsYXNzX2luaXQpLCAoZ3N0X2FscGhhX2NvbG9yX2luaXQpLAorCSAgKGdzdF9hbHBoYV9jb2xvcl90cmFuc2Zvcm1fY2FwcyksIChnc3RfYWxwaGFfY29sb3Jfc2V0X2NhcHMpLAorCSAgKHRyYW5zZm9ybV9yZ2IpLCAodHJhbnNmb3JtX2JnciksCisJICAoZ3N0X2FscGhhX2NvbG9yX3RyYW5zZm9ybV9pcCksCisJICAocGx1Z2luX2luaXQpOiBQb3J0ZWQgdG8gMC45IHVzaW5nIGluIHBsYWNlIGJhc2UgdHJhbmZvcm0uCisJICAqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IChnc3RfdmlkZW9taXhlcl9wYWRfZ2V0X3R5cGUpLAorCSAgKGdzdF92aWRlb21peGVyX3BhZF9jbGFzc19pbml0KSwKKwkgIChnc3RfdmlkZW9taXhlcl9wYWRfc2lua19zZXRjYXBzKSwKKwkgIChnc3RfdmlkZW9taXhlcl9wYWRfbGluayksIChnc3RfdmlkZW9taXhlcl9wYWRfdW5saW5rKSwKKwkgIChnc3RfdmlkZW9taXhlcl9wYWRfaW5pdCksIChnc3RfdmlkZW9taXhlcl9jbGFzc19pbml0KSwKKwkgIChnc3RfdmlkZW9taXhlcl9pbml0KSwgKGdzdF92aWRlb21peGVyX2dldGNhcHMpLAorCSAgKGdzdF92aWRlb21peGVyX3JlcXVlc3RfbmV3X3BhZCksIChnc3RfdmlkZW9taXhlcl9maWxsX3F1ZXVlcyksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfYmxlbmRfYnVmZmVycyksIChnc3RfdmlkZW9taXhlcl91cGRhdGVfcXVldWVzKSwKKwkgIChnc3RfdmlkZW9taXhlcl9jb2xsZWN0ZWQpLCAoZ3N0X3ZpZGVvbWl4ZXJfY2hhbmdlX3N0YXRlKToKKwkgIFBvcnRlZAorCSAgdG8gMC45IHVzaW5nIGNvbGxlY3RwYWRzLgorCisyMDA1LTEwLTE2IDIxOjE5OjQ0ICswMDAwICBaZWVzaGFuIEFsaSA8emVlbml4QGdtYWlsLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogY29tbW9uOgorCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2ZseC9NYWtlZmlsZS5hbToKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJKiBnc3QvZmx4L2dzdGZseGRlYy5oOgorCSAgZmx4IHBsdWdpbiBwb3J0ZWQgdG8gMC45CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZseCBwbHVnaW4gcG9ydGVkIHRvIDAuOQorCisyMDA1LTEwLTE2IDE0OjMzOjA1ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzoKKwkgIHVzZSBnc3RfdmVyc2lvbl9zdHJpbmcKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdXNlIGdzdF92ZXJzaW9uX3N0cmluZworCisyMDA1LTEwLTE2IDEzOjE3OjExICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogR0xJQl9DSEVDSy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMC0xNiAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKwkgICogY29uZmlndXJlLmFjOiBHTElCX0NIRUNLLgorCisyMDA1LTEwLTE1IDE2OjQ4OjU1ICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZXh0L2xpYnBuZy86IFBvcnRlZCBwbmdkZWMgdG8gMC45CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTAtMTUgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZXh0L2xpYnBuZy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xpYnBuZy9nc3RwbmcuYzogKHBsdWdpbl9pbml0KToKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogKGdzdF9wbmdkZWNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3BuZ2RlY19pbml0KSwgKHVzZXJfcmVhZF9kYXRhKSwgKGdzdF9wbmdkZWNfY2hhaW4pOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5oOiBQb3J0ZWQgcG5nZGVjIHRvIDAuOQorCisyMDA1LTEwLTE0IDEyOjQzOjMwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBQb3J0IG1hdHJvc2thIG11eGVyIHRvIDAuOSAoIzMxODg0NykuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJldmlld2VkIGJ5OiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1pZHMuaDoKKwkgICogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkgICogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuaDoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLmM6IChwbHVnaW5faW5pdCk6CisJICBQb3J0IG1hdHJvc2thIG11eGVyIHRvIDAuOSAoIzMxODg0NykuCisKKzIwMDUtMTAtMTMgMTg6NTk6MzUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiBGaXggaGFuZGxpbmcgb2YgR1NUX1RBR19EQVRFLCB3aGljaCBpcyBub3cgb2YgR1NUX1RZUEVfREFURTsgdXNlIEdTVF9SRUFEX1VJTlQzMl9MRSgpIGFuZCBmci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiAoZ3N0X3NwZWV4ZW5jX2dldF90YWdfdmFsdWUpLAorCSAgKGNvbW1lbnRfaW5pdCksIChjb21tZW50X2FkZCk6CisJICBGaXggaGFuZGxpbmcgb2YgR1NUX1RBR19EQVRFLCB3aGljaCBpcyBub3cgb2YgR1NUX1RZUEVfREFURTsKKwkgIHVzZSBHU1RfUkVBRF9VSU5UMzJfTEUoKSBhbmQgZnJpZW5kcyByYXRoZXIgdGhhbiB0aGUgcHJpdmF0ZQorCSAgaW1wbGVtZW50YXRpb24gb2YgdGhvc2Ugc2FtZSBtYWNyb3MuCisKKzIwMDUtMTAtMTMgMTY6MDE6MzUgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBleHQvY2Fpcm8vTWFrZWZpbGUuYW06CisJICBmaXggZGlzdAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBmaXggZGlzdAorCisyMDA1LTEwLTEzIDE1OjI4OjAxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGV4YW1wbGVzL3N0YXRzL21wMm9nZy5jOiBtb3JlIHR5cG8gZml4ZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleGFtcGxlcy9zdGF0cy9tcDJvZ2cuYzoKKwkgIG1vcmUgdHlwbyBmaXhlcworCisyMDA1LTEwLTEyIDE0OjI5OjU1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHJlbmFtZWQgR1NUX0ZMQUdTIG1hY3JvcyB0byBHU1RfT0JKRUNUX0ZMQUdTIG1vdmVkIGJpdHNoaWZ0IGZyb20gbWFjcm8gdG8gZW51bSBkZWZpbml0aW9uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXhhbXBsZXMvaW5kZXhpbmcvaW5kZXhtcGVnLmM6IChtYWluKToKKwkgICogZXh0L2FydHNkL2dzdGFydHNkc2luay5jOiAoZ3N0X2FydHNkc2lua19vcGVuX2F1ZGlvKSwKKwkgIChnc3RfYXJ0c2RzaW5rX2Nsb3NlX2F1ZGlvKSwgKGdzdF9hcnRzZHNpbmtfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2FydHNkL2dzdGFydHNkc2luay5oOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmcGFyc2UuYzogKGdzdF9hZnBhcnNlX29wZW5fZmlsZSksCisJICAoZ3N0X2FmcGFyc2VfY2xvc2VfZmlsZSk6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZwYXJzZS5oOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmc2luay5jOiAoZ3N0X2Fmc2lua19vcGVuX2ZpbGUpLAorCSAgKGdzdF9hZnNpbmtfY2xvc2VfZmlsZSksIChnc3RfYWZzaW5rX2NoYWluKSwKKwkgIChnc3RfYWZzaW5rX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzaW5rLmg6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzcmMuYzogKGdzdF9hZnNyY19vcGVuX2ZpbGUpLAorCSAgKGdzdF9hZnNyY19jbG9zZV9maWxlKSwgKGdzdF9hZnNyY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmc3JjLmg6CisJICAqIGV4dC9jZGF1ZGlvL2dzdGNkYXVkaW8uYzogKGdzdF9jZGF1ZGlvX2luaXQpOgorCSAgKiBleHQvZGlyZWN0ZmIvZGlyZWN0ZmJ2aWRlb3NpbmsuYzogKGdzdF9kaXJlY3RmYnZpZGVvc2lua19pbml0KToKKwkgICogZXh0L2R0cy9nc3RkdHNkZWMuYzogKGdzdF9kdHNkZWNfaW5pdCk6CisJICAqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkgICogZXh0L2phY2svZ3N0amFja2Jpbi5jOiAoZ3N0X2phY2tfYmluX2luaXQpLAorCSAgKGdzdF9qYWNrX2Jpbl9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvbXVzZXBhY2svZ3N0bXVzZXBhY2tkZWMuYzogKGdzdF9tdXNlcGFja2RlY19pbml0KToKKwkgICogZXh0L211c2ljYnJhaW56L2dzdHRybS5jOiAoZ3N0X211c2ljYnJhaW56X2luaXQpOgorCSAgKiBleHQvbmFzL25hc3NpbmsuYzogKGdzdF9uYXNzaW5rX29wZW5fYXVkaW8pLAorCSAgKGdzdF9uYXNzaW5rX2Nsb3NlX2F1ZGlvKSwgKGdzdF9uYXNzaW5rX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9uYXMvbmFzc2luay5oOgorCSAgKiBleHQvcG9seXAvcG9seXBzaW5rLmM6IChnc3RfcG9seXBzaW5rX2luaXQpOgorCSAgKiBleHQvc2RsL3NkbHZpZGVvc2luay5jOiAoZ3N0X3NkbHZpZGVvc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvc2RsL3NkbHZpZGVvc2luay5oOgorCSAgKiBleHQvc21vb3Rod2F2ZS9nc3RzbW9vdGh3YXZlLmM6IChnc3Rfc21vb3Rod2F2ZV9pbml0KToKKwkgICogZXh0L3NuZGZpbGUvZ3N0c2YuYzogKGdzdF9zZl9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9zZl9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3NmX3JlbGVhc2VfcmVxdWVzdF9wYWQpLAorCSAgKGdzdF9zZl9vcGVuX2ZpbGUpLCAoZ3N0X3NmX2Nsb3NlX2ZpbGUpLCAoZ3N0X3NmX2xvb3ApOgorCSAgKiBleHQvc25kZmlsZS9nc3RzZi5oOgorCSAgKiBleHQvc3dmZGVjL2dzdHN3ZmRlYy5jOiAoZ3N0X3N3ZmRlY19pbml0KToKKwkgICogZXh0L3Rhcmtpbi9nc3R0YXJraW5kZWMuYzogKGdzdF90YXJraW5kZWNfaW5pdCk6CisJICAqIGdzdC9hcGV0YWcvYXBlZGVtdXguYzogKGdzdF9hcGVfZGVtdXhfaW5pdCk6CisJICAqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXBhcnNlLmM6IChnc3RfY2R4YXBhcnNlX2luaXQpOgorCSAgKiBnc3QvY2R4YXBhcnNlL2dzdGNkeGFzdHJpcC5jOiAoZ3N0X2NkeGFzdHJpcF9pbml0KToKKwkgICogZ3N0L2Zlc3RpdmFsL2dzdGZlc3RpdmFsLmM6IChnc3RfZmVzdGl2YWxfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L2Zlc3RpdmFsL2dzdGZlc3RpdmFsLmg6CisJICAqIGdzdC9tcGVnMnN1Yi9nc3RtcGVnMnN1YnQuYzogKGdzdF9tcGVnMnN1YnRfaW5pdCk6CisJICAqIGdzdC9tdWx0aWZpbGVzaW5rL2dzdG11bHRpZmlsZXNpbmsuYzogKGdzdF9tdWx0aWZpbGVzaW5rX2luaXQpLAorCSAgKGdzdF9tdWx0aWZpbGVzaW5rX3NldF9sb2NhdGlvbiksIChnc3RfbXVsdGlmaWxlc2lua19vcGVuX2ZpbGUpLAorCSAgKGdzdF9tdWx0aWZpbGVzaW5rX2Nsb3NlX2ZpbGUpLCAoZ3N0X211bHRpZmlsZXNpbmtfbmV4dF9maWxlKSwKKwkgIChnc3RfbXVsdGlmaWxlc2lua19wYWRfcXVlcnkpLCAoZ3N0X211bHRpZmlsZXNpbmtfaGFuZGxlX2V2ZW50KSwKKwkgIChnc3RfbXVsdGlmaWxlc2lua19jaGFpbiksIChnc3RfbXVsdGlmaWxlc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvbXVsdGlmaWxlc2luay9nc3RtdWx0aWZpbGVzaW5rLmg6CisJICAqIGdzdC92aWRlb2Ryb3AvZ3N0dmlkZW9kcm9wLmM6IChnc3RfdmlkZW9kcm9wX2luaXQpOgorCSAgKiBzeXMvY2Ryb20vZ3N0Y2RwbGF5ZXIuYzogKGNkcGxheWVyX2luaXQpOgorCSAgKiBzeXMvZHhyMy9keHIzYXVkaW9zaW5rLmM6IChkeHIzYXVkaW9zaW5rX2luaXQpLAorCSAgKGR4cjNhdWRpb3Npbmtfb3BlbiksIChkeHIzYXVkaW9zaW5rX2Nsb3NlKSwKKwkgIChkeHIzYXVkaW9zaW5rX2NoYWluX3BjbSksIChkeHIzYXVkaW9zaW5rX2NoYWluX2FjMyksCisJICAoZHhyM2F1ZGlvc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBzeXMvZHhyMy9keHIzYXVkaW9zaW5rLmg6CisJICAqIHN5cy9keHIzL2R4cjNzcHVzaW5rLmM6IChkeHIzc3B1c2lua19pbml0KSwgKGR4cjNzcHVzaW5rX29wZW4pLAorCSAgKGR4cjNzcHVzaW5rX2Nsb3NlKSwgKGR4cjNzcHVzaW5rX2NoYWluKSwKKwkgIChkeHIzc3B1c2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBzeXMvZHhyMy9keHIzc3B1c2luay5oOgorCSAgKiBzeXMvZHhyMy9keHIzdmlkZW9zaW5rLmM6IChkeHIzdmlkZW9zaW5rX2luaXQpLAorCSAgKGR4cjN2aWRlb3Npbmtfb3BlbiksIChkeHIzdmlkZW9zaW5rX2Nsb3NlKSwKKwkgIChkeHIzdmlkZW9zaW5rX3dyaXRlX2RhdGEpLCAoZHhyM3ZpZGVvc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBzeXMvZHhyMy9keHIzdmlkZW9zaW5rLmg6CisJICAqIHN5cy9nbHNpbmsvZ2xpbWFnZXNpbmsuYzogKGdzdF9nbGltYWdlc2lua19pbml0KToKKwkgICogc3lzL3FjYW0vZ3N0cWNhbXNyYy5jOiAoZ3N0X3FjYW1zcmNfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcWNhbXNyY19vcGVuKSwgKGdzdF9xY2Ftc3JjX2Nsb3NlKToKKwkgICogc3lzL3FjYW0vZ3N0cWNhbXNyYy5oOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19pbml0KToKKwkgICogc3lzL3ZjZC92Y2RzcmMuYzogKGdzdF92Y2RzcmNfc2V0X3Byb3BlcnR5KSwgKGdzdF92Y2RzcmNfZ2V0KSwKKwkgIChnc3RfdmNkc3JjX29wZW5fZmlsZSksIChnc3RfdmNkc3JjX2Nsb3NlX2ZpbGUpLAorCSAgKGdzdF92Y2RzcmNfY2hhbmdlX3N0YXRlKSwgKGdzdF92Y2RzcmNfcmVjYWxjdWxhdGUpOgorCSAgKiBzeXMvdmNkL3ZjZHNyYy5oOgorCSAgcmVuYW1lZCBHU1RfRkxBR1MgbWFjcm9zIHRvIEdTVF9PQkpFQ1RfRkxBR1MKKwkgIG1vdmVkIGJpdHNoaWZ0IGZyb20gbWFjcm8gdG8gZW51bSBkZWZpbml0aW9uCisKKzIwMDUtMTAtMTIgMTQ6Mjk6NDMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgcmVuYW1lZCBHU1RfRkxBR1MgbWFjcm9zIHRvIEdTVF9PQkpFQ1RfRkxBR1MgbW92ZWQgYml0c2hpZnQgZnJvbSBtYWNybyB0byBlbnVtIGRlZmluaXRpb24KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleGFtcGxlcy9pbmRleGluZy9pbmRleG1wZWcuYzogKG1haW4pOgorCSAgKiBleHQvZXNkL2VzZG1vbi5jOiAoZ3N0X2VzZG1vbl9vcGVuX2F1ZGlvKSwKKwkgIChnc3RfZXNkbW9uX2Nsb3NlX2F1ZGlvKSwgKGdzdF9lc2Rtb25fY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2VzZC9lc2Rtb24uaDoKKwkgICogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6IChnc3RfZ2RrX3BpeGJ1Zl9pbml0KToKKwkgICogZXh0L3BhbmdvL2dzdHRleHRvdmVybGF5LmM6IChnc3RfdGV4dG92ZXJsYXlfaW5pdCk6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzogKGdzdF9hdXRvX2F1ZGlvX3NpbmtfaW5pdCk6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzogKGdzdF9hdXRvX3ZpZGVvX3NpbmtfaW5pdCk6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpbXV4X2luaXQpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9pbml0KToKKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOiAoZ3N0X211bHRpcGFydF9kZW11eF9pbml0KToKKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogKGdzdF9tdWx0aXBhcnRfbXV4X2luaXQpOgorCSAgKiBnc3Qvb2xkY29yZS9nc3RtdWx0aWZpbGVzcmMuYzogKGdzdF9tdWx0aWZpbGVzcmNfaW5pdCksCisJICAoZ3N0X211bHRpZmlsZXNyY19nZXQpLCAoZ3N0X211bHRpZmlsZXNyY19vcGVuX2ZpbGUpLAorCSAgKGdzdF9tdWx0aWZpbGVzcmNfY2xvc2VfZmlsZSksIChnc3RfbXVsdGlmaWxlc3JjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9vbGRjb3JlL2dzdG11bHRpZmlsZXNyYy5oOgorCSAgKiBnc3Qvb2xkY29yZS9nc3RwaXBlZmlsdGVyLmM6IChnc3RfcGlwZWZpbHRlcl9pbml0KSwKKwkgIChnc3RfcGlwZWZpbHRlcl9vcGVuX2ZpbGUpLCAoZ3N0X3BpcGVmaWx0ZXJfY2xvc2VfZmlsZSksCisJICAoZ3N0X3BpcGVmaWx0ZXJfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L29sZGNvcmUvZ3N0cGlwZWZpbHRlci5oOgorCSAgKiBnc3Qvc21vb3Rod2F2ZS9nc3RzbW9vdGh3YXZlLmM6IChnc3Rfc21vb3Rod2F2ZV9pbml0KToKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiAoZ3N0X3ZpZGVvbWl4ZXJfaW5pdCk6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzogKGdzdF9vc3hhdWRpb3NpbmtfaW5pdCk6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuaDoKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmg6CisJICByZW5hbWVkIEdTVF9GTEFHUyBtYWNyb3MgdG8gR1NUX09CSkVDVF9GTEFHUworCSAgbW92ZWQgYml0c2hpZnQgZnJvbSBtYWNybyB0byBlbnVtIGRlZmluaXRpb24KKworMjAwNS0xMC0xMiAwMzoxNDo1NyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkgIGRpc3QgY2Fpcm8KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZGlzdCBjYWlybworCisyMDA1LTEwLTEyIDAzOjEyOjU3ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgZXh0LzogdXBkYXRlIG9mIGNhaXJvLWJhc2VkIHRpbWVvdmVybGF5IHRvIDEuMCBDYWlybyBBUEkgZG9lc24ndCB3b3JrIHlldCBmb3IgcmVzaXppbmcgb2Ygb3V0cHV0IHNpbmsKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9jYWlyby9NYWtlZmlsZS5hbToKKwkgICogZXh0L2NhaXJvL2dzdGNhaXJvLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOiAoZ3N0X3RleHRvdmVybGF5X2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9jYWlyby9nc3R0aW1lb3ZlcmxheS5jOiAoZ3N0X3RpbWVvdmVybGF5X3VwZGF0ZV9mb250X2hlaWdodCksCisJICAoZ3N0X3RpbWVvdmVybGF5X3NldHVwKSwgKGdzdF90aW1lb3ZlcmxheV9wbGFuYXI0MTEpOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGltZW92ZXJsYXkuaDoKKwkgIHVwZGF0ZSBvZiBjYWlyby1iYXNlZCB0aW1lb3ZlcmxheSB0byAxLjAgQ2Fpcm8gQVBJCisJICBkb2Vzbid0IHdvcmsgeWV0IGZvciByZXNpemluZyBvZiBvdXRwdXQgc2luaworCisyMDA1LTEwLTEyIDAzOjA3OjI2ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgZG9uJ3QgYnVpbGQgY2hlY2tzIGlmIHdlIGRvbid0IGhhdmUgY2hlY2sKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZG9uJ3QgYnVpbGQgY2hlY2tzIGlmIHdlIGRvbid0IGhhdmUgY2hlY2sKKworMjAwNS0xMC0xMiAwMzowMzoyNyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogY29tbW9uOgorCSAgZG9uJ3QgYnVpbGQgY2hlY2tzIGlmIHdlIGRvbid0IGhhdmUgZ3N0Y2hlY2sKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZG9uJ3QgYnVpbGQgY2hlY2tzIGlmIHdlIGRvbid0IGhhdmUgZ3N0Y2hlY2sKKworMjAwNS0xMC0xMSAxNzozODoyOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IG5ld3NlZ21lbnQgQVBJIGZpeC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzogKHNwZWV4X2RlY19ldmVudCksIChzcGVleF9kZWNfY2hhaW4pOgorCSAgbmV3c2VnbWVudCBBUEkgZml4LgorCisyMDA1LTEwLTExIDE2OjM0OjM2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvOiBuZXdzZWdtZW50IEFQSSB1cGRhdGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfbG9vcF9oZWFkZXIpOgorCSAgKiBnc3QvdHRhL2dzdHR0YXBhcnNlLmM6IChnc3RfdHRhX3BhcnNlX3NyY19ldmVudCksCisJICAoZ3N0X3R0YV9wYXJzZV9wYXJzZV9oZWFkZXIpOgorCSAgbmV3c2VnbWVudCBBUEkgdXBkYXRlLgorCisyMDA1LTEwLTExIDE2OjMzOjA4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBuZXdzZWdtZW50IEFQSSB1cGRhdGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2hhbmRsZV9zaW5rX2V2ZW50KSwKKwkgIChnc3RfZHZkZW11eF9kZW11eF9mcmFtZSk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjZGVjX3dyaXRlKToKKwkgICogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiAoZ3N0X2F1cGFyc2VfY2hhaW4pOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXIpLAorCSAgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnc3RfZ29vbV9ldmVudCk6CisJICAqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChnc3Rfd2F2ZW5jX3N0b3BfZmlsZSk6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2hhbmRsZV9zZWVrKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMpLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhKSwKKwkgIChnc3Rfd2F2cGFyc2VfbG9vcCksIChnc3Rfd2F2cGFyc2VfcGFkX2NvbnZlcnQpLAorCSAgKGdzdF93YXZwYXJzZV9zcmNwYWRfZXZlbnQpOgorCSAgbmV3c2VnbWVudCBBUEkgdXBkYXRlLgorCisyMDA1LTEwLTExIDEwOjA3OjM1ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiBTaWduZWRuZXNzIGNsZWFudXBzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEwLTExICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogU2lnbmVkbmVzcyBjbGVhbnVwcy4KKworMjAwNS0xMC0xMCAxOTo1Nzo0MCArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBDaGFuZ2VMb2c6CisJKiBQT1JURURfMDk6CisJKiBleHQvc3BlZXgvTWFrZWZpbGUuYW06CisJKiBleHQvc3BlZXgvZ3N0c3BlZXguYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgU3BlZXhlbmMgcG9ydGVkIHRvIDAuOS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgU3BlZXhlbmMgcG9ydGVkIHRvIDAuOS4KKworMjAwNS0xMC0xMCAxNDoxNjoyMSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgc3lzL29zcy86IENsZWFudXBzLCBtYWtlIGRldmljZSBjb25maWd1cmFibGUgaW4gdGhlIHNpbmssIGhhbmRsZSBhbmQgcmVwb3J0IGVycm9ycy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3Nfc2lua19jbGFzc19pbml0KSwKKwkgIChnc3Rfb3NzX3NpbmtfaW5pdCksIChnc3Rfb3NzX3Npbmtfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfb3NzX3NpbmtfZ2V0X3Byb3BlcnR5KSwgKGdzdF9vc3Nfc2lua19vcGVuKSwKKwkgIChnc3Rfb3NzX3NpbmtfcHJlcGFyZSksIChnc3Rfb3NzX3NpbmtfcmVzZXQpOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NpbmsuaDoKKwkgICogc3lzL29zcy9nc3Rvc3NzcmMuYzogKGdzdF9vc3Nfc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9vc3Nfc3JjX3NldF9wcm9wZXJ0eSksIChnc3Rfb3NzX3NyY19pbml0KSwgKGdzdF9vc3Nfc3JjX29wZW4pLAorCSAgKGdzdF9vc3Nfc3JjX3ByZXBhcmUpOgorCSAgQ2xlYW51cHMsIG1ha2UgZGV2aWNlIGNvbmZpZ3VyYWJsZSBpbiB0aGUgc2luaywgaGFuZGxlIGFuZCByZXBvcnQKKwkgIGVycm9ycy4KKworMjAwNS0xMC0xMCAxMjozMTowNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L2djb25mLzogTWFrZSBzdXJlIGVsZW1lbnQgaXMgTlVMTCBiZWZvcmUgcmVtb3ZpbmcgZnJvbSB0aGUgYmluLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOiAoZ3N0X2djb25mX2F1ZGlvX3NpbmtfcmVzZXQpOgorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NpbmsuYzogKGdzdF9nY29uZl92aWRlb19zaW5rX3Jlc2V0KToKKwkgIE1ha2Ugc3VyZSBlbGVtZW50IGlzIE5VTEwgYmVmb3JlIHJlbW92aW5nIGZyb20gdGhlIGJpbi4KKworMjAwNS0xMC0wNyAxNjoyODoyNCArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkgIERvbid0IHVucmVmIHRoZSBtZXNzYWdlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAoZ3N0X2R2MTM5NHNyY19idXNfcmVzZXQpOiBEb24ndCB1bnJlZiB0aGUgbWVzc2FnZS4KKworMjAwNS0xMC0wNyAxNjoyMjo1OSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkgIFBvc3QgYSBtZXNzYWdlIHdoZW4gdGhlIGNhYmxlIGlzIHVucGx1Z2dlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKGdzdF9kdjEzOTRzcmNfYnVzX3Jlc2V0KTogUG9zdCBhIG1lc3NhZ2Ugd2hlbiB0aGUgY2FibGUgaXMKKwkgIHVucGx1Z2dlZC4KKwkgIChnc3RfZHYxMzk0c3JjX2NyZWF0ZSwgZ3N0X2R2MTM5NHNyY191bmxvY2spOiBSZW1vdmUgc29tZSBwcmludHMuCisKKzIwMDUtMTAtMDcgMTU6MjQ6MjQgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSAgZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IE1ha2UgaW50ZXJydXB0aWJsZSwgc28gaXQgd29uJ3QgYmxvY2sgZm9yZXZlciBpbiBhIHJlYWQoKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMC0wNyAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKwkgICogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IE1ha2UgaW50ZXJydXB0aWJsZSwgc28gaXQgd29uJ3QKKwkgIGJsb2NrIGZvcmV2ZXIgaW4gYSByZWFkKCkuCisKKzIwMDUtMTAtMDcgMTM6MTc6NTMgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSAgZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IENsZWFuIHVwIGZvciBzdHlsZSBiZWZvcmUgZG9pbmcgc29tZSBoYWNraW5nLiBUaGUgb25seSBjaGFuZ2Ugc2hvdWxkIGJlIHRoYXQgdGhlIHN0YXRlIGNoLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTAtMDcgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisJICAqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOiBDbGVhbiB1cCBmb3Igc3R5bGUgYmVmb3JlIGRvaW5nIHNvbWUKKwkgIGhhY2tpbmcuIFRoZSBvbmx5IGNoYW5nZSBzaG91bGQgYmUgdGhhdCB0aGUgc3RhdGUgY2hhbmdlIHN0dWZmIHdhcworCSAgcHV0IGludG8gYmFzZXNyYydzIHN0YXJ0KCkgYW5kIHN0b3AoKSByb3V0aW5lcywgd2hpY2ggY29hbGVzY2VzCisJICBzb21lIHN0ZXBzLgorCisyMDA1LTEwLTA3IDExOjMwOjQxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IEFkZCBjaGVjayBmb3IgbW1hcAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEFkZCBjaGVjayBmb3IgbW1hcAorCSAgKiBnc3QvZGVidWcvTWFrZWZpbGUuYW06CisJICBPbmx5IGNvbXBpbGUgZWZlbmNlIHBsdWdpbiBvbiBzeXN0ZW1zIHRoYXQgaGF2ZSBtbWFwLgorCisyMDA1LTEwLTA1IDE2OjM2OjU3ICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIGFkZCBsYXRlc3QgZmlsZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkIGxhdGVzdCBmaWxlcworCisyMDA1LTEwLTA1IDExOjM4OjI5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvZGVidWcvOiBQb3J0IHByb2dyZXNzcmVwb3J0LCBuYXZzZWVrLCBuYXZpZ2F0aW9udGVzdCwgdGVzdHNpbmsgYW5kIGJyZWFrbXlkYXRhLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWJ1Zy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RlYnVnL2JyZWFrbXlkYXRhLmM6CisJICAqIGdzdC9kZWJ1Zy9nc3RkZWJ1Zy5jOgorCSAgKiBnc3QvZGVidWcvZ3N0bmF2aWdhdGlvbnRlc3QuYzoKKwkgICogZ3N0L2RlYnVnL2dzdG5hdnNlZWsuYzoKKwkgICogZ3N0L2RlYnVnL2dzdG5hdnNlZWsuaDoKKwkgICogZ3N0L2RlYnVnL3Byb2dyZXNzcmVwb3J0LmM6CisJICAqIGdzdC9kZWJ1Zy90ZXN0cGx1Z2luLmM6CisJICBQb3J0IHByb2dyZXNzcmVwb3J0LCBuYXZzZWVrLCBuYXZpZ2F0aW9udGVzdCwgdGVzdHNpbmsgYW5kCisJICBicmVha215ZGF0YS4KKworMjAwNS0xMC0wNSAxMToxNToyMyArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZXh0L2R2L2dzdGR2ZGVtdXguYzogRml4ZXMgZm9yIGJldHRlciBjb252ZXJzaW9uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X3NyY19jb252ZXJ0KSwKKwkgIChnc3RfZHZkZW11eF9zcmNfcXVlcnkpOgorCSAgRml4ZXMgZm9yIGJldHRlciBjb252ZXJzaW9uCisKKzIwMDUtMTAtMDQgMTc6NTg6NDAgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZ3N0L2F1dG9kZXRlY3QvOiBTZXQgc3RhdGUgb2YgZWxlbWVudHMgdG8gTlVMTCBiZWZvcmUgcmVtb3ZpbmcgZnJvbSBiaW5zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzogKGdzdF9hdXRvX2F1ZGlvX3NpbmtfcmVzZXQpLAorCSAgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfZmluZF9iZXN0KSwgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfZGV0ZWN0KToKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jOiAoZ3N0X2F1dG9fdmlkZW9fc2lua19yZXNldCksCisJICAoZ3N0X2F1dG9fdmlkZW9fc2lua19maW5kX2Jlc3QpLCAoZ3N0X2F1dG9fdmlkZW9fc2lua19kZXRlY3QpOgorCSAgU2V0IHN0YXRlIG9mIGVsZW1lbnRzIHRvIE5VTEwgYmVmb3JlIHJlbW92aW5nIGZyb20gYmlucy4KKwkgIFNldCBzdGF0ZSBvZiB0ZXN0IGVsZW1lbnQgdG8gTlVMTCBpZiB3ZSBmYWlsZWQgdG8gbW92ZSBpdCB0byBSRUFEWQorCisyMDA1LTEwLTA0IDE3OjQ0OjQzICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBleHQvZHYvOiBBZGRlZCBERUZBVUxUIDw9PT4gQllURVMsIFRJTUUgY29udmVyc2lvbnMgb24gc3JjcGFkLAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9kdi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X3NyY19xdWVyeSksIChnc3RfZHZkZW11eF9zcmNfY29udmVyKToKKwkgIEFkZGVkIERFRkFVTFQgPD09PiBCWVRFUywgVElNRSBjb252ZXJzaW9ucyBvbiBzcmNwYWQsCisJICBDb3JyZWN0ZWQgdGhlIHF1ZXJ5IGZ1bmN0aW9uIGZvciBwb3NpdGlvbiBzbyBpdCBkb2Vzbid0IGZvcmdldCB3aGF0CisJICBmb3JtYXQgd2FzIGFza2VkLCBhbmQgY2FsbHMgdGhlIGNvbnZlcnNpb24gZnVuY3Rpb25zIG9uIHRoZSBjb3JyZWN0IHBhZC4KKworMjAwNS0xMC0wMyAxNzo1OToxOCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGJhY2sgdG8gaGVhZAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBiYWNrIHRvIGhlYWQKKworPT09IHJlbGVhc2UgMC45LjMgPT09CisKKzIwMDUtMTAtMDMgMTc6NDg6NTcgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVBRE1FOgorCSogY29uZmlndXJlLmFjOgorCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkgIHJlbGVhc2UgdGltZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZWxlYXNlIHRpbWUKKworMjAwNS0xMC0wMiAyMzowODozNSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLmMgKGdzdF9mbGFjZGVjX3dyaXRlKTogRGVhbCB3aXRoIHBhZF9hbGxvYyBlcnJvciByZXR1cm5zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEwLTAzICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmMgKGdzdF9mbGFjZGVjX3dyaXRlKTogRGVhbCB3aXRoIHBhZF9hbGxvYworCSAgZXJyb3IgcmV0dXJucy4KKworMjAwNS0xMC0wMiAxNTozMzoxNCArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBjb25maWd1cmUuYWMgKEdTVF9QTFVHSU5fTERGTEFHUyk6IENoYW5nZSB0byBiZSBsaWtlIC1iYXNlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEwLTAyICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBjb25maWd1cmUuYWMgKEdTVF9QTFVHSU5fTERGTEFHUyk6IENoYW5nZSB0byBiZSBsaWtlIC1iYXNlLgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IFBvcnRlZCB0byAwLjkuCisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYyAoZ3N0X2ZsYWNkZWNfbG9vcCk6IEhhbmRsZSBlcnJvcnMgYmV0dGVyLgorCSAgKiBleHQvZmxhYy9NYWtlZmlsZS5hbTogQWRkIHRoZSBHU1RfUExVR0lOU19CQVNFIGNmbGFncyBhbmQgbGlicywKKwkgIGFuZCBsaW5rIHRvIGdzdHRhZ2VkaXQuIEVuYWJsZSBmbGFjZW5jLgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IFJlLWVuYWJsZSB0YWcgcmVhZGluZy4KKworMjAwNS0wOS0zMCAxNjozNjo0OSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IFZhcmlvdXMgY2xhc3MgYW5kIGNhcHMgZml4ZXMgZnJvbSBBbmRyZSBNYWdhbGhhZXMgKGFuZHJ1bmtvKQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZW5jLmM6IChnc3RfcnRwYW1yZW5jX3NldGNhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGdzbXBhcnNlLmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BlbmMuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZW5jLmM6IChnc3RfcnRwbXA0dmVuY19jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwbXA0dmVuY19wYXJzZV9kYXRhKSwgKGdzdF9ydHBtcDR2ZW5jX2hhbmRsZV9idWZmZXIpLAorCSAgKGdzdF9ydHBtcDR2ZW5jX3NldF9wcm9wZXJ0eSk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXBhZW5jLmM6IChnc3RfcnRwbXBhZW5jX2hhbmRsZV9idWZmZXIpOgorCSAgVmFyaW91cyBjbGFzcyBhbmQgY2FwcyBmaXhlcyBmcm9tIEFuZHJlIE1hZ2FsaGFlcyAoYW5kcnVua28pCisKKzIwMDUtMDktMjkgMTM6MDg6NDEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9sZXZlbC9sZXZlbC1leGFtcGxlLmM6IFVwZGF0ZSBmb3IgbmV3IGJ1cyBBUEkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xldmVsL2xldmVsLWV4YW1wbGUuYzogKG1haW4pOgorCSAgVXBkYXRlIGZvciBuZXcgYnVzIEFQSS4KKworMjAwNS0wOS0yOCAxMzozODowMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBObyBuZWVkIHRvIHRha2Ugc3RyZWFtIGxvY2sgaGVyZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX2hlYWRlcik6CisJICBObyBuZWVkIHRvIHRha2Ugc3RyZWFtIGxvY2sgaGVyZS4KKworMjAwNS0wOS0yOCAwOTo0NTowMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBGaXggdW5leHBhbmRlZCBhdXRvY29uZiBtYWNybyBHU1RfRE9DLCB3aGljaCBoYXMgYmVlbiByZW5hbWVkIHRvIEdTVF9ET0NCT09LX0NIRUNLIChzZWUgY29tbW9uL200L2dzdC1kLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgRml4IHVuZXhwYW5kZWQgYXV0b2NvbmYgbWFjcm8gR1NUX0RPQywgd2hpY2ggaGFzIGJlZW4gcmVuYW1lZAorCSAgdG8gR1NUX0RPQ0JPT0tfQ0hFQ0sgKHNlZSBjb21tb24vbTQvZ3N0LWRvYy5tNCkgKCMzMTYyMDIpLgorCisyMDA1LTA5LTI3IDE1OjEyOjQ1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvb3NzL2dzdG9zc3NpbmsuYzogRml4IHBsYXliYWNrIG9mIG1vbm8gc3RyZWFtcyAoYnl0ZXNfcGVyX3NhbXBsZSBzaG91bGQgYmUgc2V0IGZyb20gdGhlIHNhbXBsZSB3aWR0aCBhbmQgdGhlIG51bWIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3Nfc2lua19wcmVwYXJlKToKKwkgIEZpeCBwbGF5YmFjayBvZiBtb25vIHN0cmVhbXMgKGJ5dGVzX3Blcl9zYW1wbGUgc2hvdWxkIGJlIHNldAorCSAgZnJvbSB0aGUgc2FtcGxlIHdpZHRoIGFuZCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG5lZ290aWF0ZWQsCisJICBhbmQgbm90IGp1c3QgYmUgc2V0IHRvIDQpICgjMzE3MzM4KQorCisyMDA1LTA5LTI2IDE0OjU5OjEwICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIGFkZCBhdXBhcnNlIHRvIHBsdWdpbnMgbGlzdAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgYXVwYXJzZSB0byBwbHVnaW5zIGxpc3QKKworMjAwNS0wOS0yNiAxNDo0MjowOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBtcGFlbmMuYzogU2V0IGJ1ZmZlciBkdXJhdGlvbiBjb3JyZWN0bHkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFlbmMuYzogKGdzdF9ydHBtcGFlbmNfZmx1c2gpLAorCSAgKGdzdF9ydHBtcGFlbmNfaGFuZGxlX2J1ZmZlcik6CisJICBTZXQgYnVmZmVyIGR1cmF0aW9uIGNvcnJlY3RseS4KKworMjAwNS0wOS0yNiAxMzowNjoyNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBEb24ndCBjcmFzaCB3aGVuIGVuY291bnRlcmluZyBhIHN0cmVhbSB3aXRoIGFuIHVua25vd24gZm91cmNjIG9yIGNvZGVjIGlkLiBJbnN0ZWFkLCBjcmVhdGUgYSBwLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9iYXNlX2luaXQpLAorCSAgKGdzdF9hdmlfZGVtdXhfY2xhc3NfaW5pdCksIChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksCisJICAoZ3N0X2F2aV9kZW11eF9jaGFuZ2Vfc3RhdGUpOgorCSAgRG9uJ3QgY3Jhc2ggd2hlbiBlbmNvdW50ZXJpbmcgYSBzdHJlYW0gd2l0aCBhbiB1bmtub3duIGZvdXJjYyBvcgorCSAgY29kZWMgaWQuIEluc3RlYWQsIGNyZWF0ZSBhIHBhZCBvZiB0eXBlIHZpZGVvL3gtYXZpLXVua25vd24gb3IKKwkgIGF1ZGlvL3gtYXZpLXVua25vd24sIHdoaWNoIGFzIGEgc2lkZS1lZmZlY3QgYWxzbyByZXN1bHRzIGluIGxlc3MKKwkgIGNvbmZ1c2luZyBlcnJvciBtZXNzYWdlcyBpbiBwbGF5ZXJzICgnbm8gZGVjb2RlcicgdnMuICdubyBzdHJlYW1zJyk7CisJICBtaW5vciBmaXhlcyB0byBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24gYW5kIGNsYXNzX2luaXQgZnVuY3Rpb24uCisKKzIwMDUtMDktMjQgMTM6MzQ6NDYgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBjaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgc2V0IHVwIHBsdWdpbiBwYXRocyBwcm9wZXJseQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBzZXQgdXAgcGx1Z2luIHBhdGhzIHByb3Blcmx5CisKKzIwMDUtMDktMjQgMTM6MTA6NTIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdXRvZGV0ZWN0LzogVGhlc2UgYXJlIHNpbmtzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzogKGdzdF9hdXRvX2F1ZGlvX3NpbmtfaW5pdCk6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzogKGdzdF9hdXRvX3ZpZGVvX3NpbmtfaW5pdCk6CisJICBUaGVzZSBhcmUgc2lua3MuCisKKzIwMDUtMDktMjQgMTI6MTA6MDIgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBjaGVjay9lbGVtZW50cy9sZXZlbC5jOiBmaXggdGVzdCBmb3IgbmV3IEdzdENsb2NrVGltZSB1c2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjaGVjay9lbGVtZW50cy9sZXZlbC5jOiAoR1NUX1NUQVJUX1RFU1QpOgorCSAgZml4IHRlc3QgZm9yIG5ldyBHc3RDbG9ja1RpbWUgdXNlCisJICAqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiAoZ3N0X2xldmVsX2luaXQpLCAoZ3N0X2xldmVsX3NldF9jYXBzKSwKKwkgIChnc3RfbGV2ZWxfdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmg6CisJICBmaXggdXAgdGhlIGRlY2F5IHBlYWssIGVuc3VyaW5nIHRoZSBkZWNheSBwZWFrIGlzIG5ldmVyIGxvd2VyCisJICB0aGFuIHRoZSBwZWFrIGZvciB0aGF0IGludGVydmFsCisKKzIwMDUtMDktMjMgMTg6MjM6MDQgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIHVwZGF0aW5nIGRvY3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdXBkYXRpbmcgZG9jcworCisyMDA1LTA5LTIzIDE4OjE1OjUxICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogTWFrZWZpbGUuYW06CisJKiBjaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSogY29tbW9uOgorCSogZ3N0L2xldmVsL01ha2VmaWxlLmFtOgorCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuaDoKKwkqIGdzdC9sZXZlbC9sZXZlbC1leGFtcGxlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgY29udmVydCB0byB1c2luZyBHc3RDbG9ja1RpbWUgZm9yIGFsbCB0aW1lIHZhbHVlcywgZmluYWxseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgY29udmVydCB0byB1c2luZyBHc3RDbG9ja1RpbWUgZm9yIGFsbCB0aW1lIHZhbHVlcywgZmluYWxseS4KKworMjAwNS0wOS0yMyAxNTowMTowMCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC9nb29tL01ha2VmaWxlLmFtOgorCSAgZml4IGJ1aWxkIG9mIGdvb20KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZml4IGJ1aWxkIG9mIGdvb20KKworMjAwNS0wOS0yMyAxNDoyMDowMSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGNvbW1vbjoKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgd2UgaGFuZGxlIG1vcmUgdGhhbiB0d28gY2hhbm5lbHMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgd2UgaGFuZGxlIG1vcmUgdGhhbiB0d28gY2hhbm5lbHMKKworMjAwNS0wOS0yMyAwNDoyMzowMCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9jYWlyby9NYWtlZmlsZS5hbToKKwkqIGV4dC9kdi9NYWtlZmlsZS5hbToKKwkqIGV4dC9lc2QvTWFrZWZpbGUuYW06CisJKiBleHQvZmxhYy9NYWtlZmlsZS5hbToKKwkqIGV4dC9nY29uZi9NYWtlZmlsZS5hbToKKwkqIGV4dC9nZGtfcGl4YnVmL01ha2VmaWxlLmFtOgorCSogZXh0L2pwZWcvTWFrZWZpbGUuYW06CisJKiBleHQvbGFkc3BhL01ha2VmaWxlLmFtOgorCSogZXh0L2xpYmNhY2EvTWFrZWZpbGUuYW06CisJKiBleHQvbGlibW5nL01ha2VmaWxlLmFtOgorCSogZXh0L2xpYnBuZy9NYWtlZmlsZS5hbToKKwkqIGV4dC9taWttb2QvTWFrZWZpbGUuYW06CisJKiBleHQvcGFuZ28vTWFrZWZpbGUuYW06CisJKiBleHQvcmF3MTM5NC9NYWtlZmlsZS5hbToKKwkqIGV4dC9zaG91dDIvTWFrZWZpbGUuYW06CisJKiBleHQvc3BlZXgvTWFrZWZpbGUuYW06CisJKiBnc3QvYWxwaGEvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVwYXJzZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L01ha2VmaWxlLmFtOgorCSogZ3N0L2F2aS9NYWtlZmlsZS5hbToKKwkqIGdzdC9jdXR0ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVidWcvTWFrZWZpbGUuYW06CisJKiBnc3QvZWZmZWN0di9NYWtlZmlsZS5hbToKKwkqIGdzdC9mbHgvTWFrZWZpbGUuYW06CisJKiBnc3QvZ29vbS9NYWtlZmlsZS5hbToKKwkqIGdzdC9sYXcvTWFrZWZpbGUuYW06CisJKiBnc3QvbWF0cm9za2EvTWFrZWZpbGUuYW06CisJKiBnc3QvbWVkaWFuL01ha2VmaWxlLmFtOgorCSogZ3N0L21vbm9zY29wZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9tdWx0aXBhcnQvTWFrZWZpbGUuYW06CisJKiBnc3Qvb2xkY29yZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRzcC9NYWtlZmlsZS5hbToKKwkqIGdzdC9zbW9vdGh3YXZlL01ha2VmaWxlLmFtOgorCSogZ3N0L3NtcHRlL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvYm94L01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvZmlsdGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3Qvd2F2ZW5jL01ha2VmaWxlLmFtOgorCSogZ3N0L3dhdnBhcnNlL01ha2VmaWxlLmFtOgorCSogc3lzL29zcy9NYWtlZmlsZS5hbToKKwkqIHN5cy9vc3hhdWRpby9NYWtlZmlsZS5hbToKKwkgIGZpeCBidWlsZCBhbmQgdXNlIG9mIEdTVF9MSUJTCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZpeCBidWlsZCBhbmQgdXNlIG9mIEdTVF9MSUJTCisKKzIwMDUtMDktMjIgMjI6Mzg6NDggKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogQ2hhbmdlTG9nOgorCSogUE9SVEVEXzA5OgorCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5oOgorCSAgQXVwYXJzZSBwb3J0ZWQgdG8gMC45LiBUZXN0ZWQgd2l0aCBmaWxlc3JjICEgYXVwYXJzZSAhIG9zc3NpbmsgYW5kIGFsc2FzaW5rCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEF1cGFyc2UgcG9ydGVkIHRvIDAuOS4gVGVzdGVkIHdpdGggZmlsZXNyYyAhIGF1cGFyc2UgISBvc3NzaW5rIGFuZCBhbHNhc2luaworCisyMDA1LTA5LTIyIDE0OjEzOjM2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogVXNlIGlzX2ZpbGxlZCB0byBib3RoIGNoZWNrIE1UVSBhbmQgbWF4LXB0aW1lIG9mIGJhc2UgY2xhc3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9UT0RPOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGRlYy5jOiAoZ3N0X3J0cGRlY19nZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZW5jLmM6IChnc3RfcnRwbXA0dmVuY19jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwbXA0dmVuY19wYXJzZV9kYXRhKSwgKGdzdF9ydHBtcDR2ZW5jX2hhbmRsZV9idWZmZXIpLAorCSAgKGdzdF9ydHBtcDR2ZW5jX3NldF9wcm9wZXJ0eSk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dmVuYy5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYWVuYy5jOiAoZ3N0X3J0cG1wYWVuY19oYW5kbGVfYnVmZmVyKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFlbmMuaDoKKwkgIFVzZSBpc19maWxsZWQgdG8gYm90aCBjaGVjayBNVFUgYW5kIG1heC1wdGltZSBvZiBiYXNlIGNsYXNzLgorCisyMDA1LTA5LTIyIDExOjI4OjIzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cG1wNHZlbmMuYzogRG9uJ3QgZnJhZ21lbnQgcGFja2V0cyB3aXRoIG11bHRpcGxlIGZyYW1lcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZlbmMuYzogKGdzdF9ydHBtcDR2ZW5jX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBtcDR2ZW5jX3BhcnNlX2RhdGEpLCAoZ3N0X3J0cG1wNHZlbmNfaGFuZGxlX2J1ZmZlciksCisJICAoZ3N0X3J0cG1wNHZlbmNfc2V0X3Byb3BlcnR5KToKKwkgIERvbid0IGZyYWdtZW50IHBhY2tldHMgd2l0aCBtdWx0aXBsZSBmcmFtZXMuCisKKzIwMDUtMDktMjIgMTA6Mzk6MTEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvOiBSZW1vdmUgZ19wcmludC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL1RPRE86CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlYy5jOiAoZ3N0X3J0cG1wNHZkZWNfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dmVuYy5jOiAoZ3N0X3J0cG1wNHZlbmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cG1wNHZlbmNfaW5pdCksIChnc3RfcnRwbXA0dmVuY19wYXJzZV9kYXRhKSwKKwkgIChnc3RfcnRwbXA0dmVuY19oYW5kbGVfYnVmZmVyKSwgKGdzdF9ydHBtcDR2ZW5jX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cG1wNHZlbmNfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZW5jLmg6CisJICBSZW1vdmUgZ19wcmludC4KKwkgIFVwZGF0ZSBUT0RPCisJICBNYWtlIHBheWxvYWQgZW5jb2RlciBhIGJpdCBzbWFydGVyIGFuZCBtb3JlIGNvcnJlY3Qgd2l0aAorCSAgdGltZXN0YW1wcy4KKwkgIEFkZGVkIG9wdGlvbiBpbiBwYXlsb2FkZXIgdG8gaW5jbHVkZSBjb25maWcgc3RyaW5nIGluLWJhbmQuCisKKzIwMDUtMDktMjEgMTk6NDE6NDUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogU3RyaXAgc3BhY2VzIGZvciBrZXkvdmFsdWUgcGFpcnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfcGFyc2VfcnRwbWFwKSwKKwkgIChnc3RfcnRzcHNyY19tZWRpYV90b19jYXBzKSwgKGdzdF9ydHNwc3JjX3N0cmVhbV9zZXR1cF9ydHApLAorCSAgKGdzdF9ydHNwc3JjX3NlbmQpOgorCSAgU3RyaXAgc3BhY2VzIGZvciBrZXkvdmFsdWUgcGFpcnMuCisKKzIwMDUtMDktMjEgMTc6NTM6MjYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogTW9yZSBTRFAgcGFyc2luZyBhbmQgY2FwcyBzZXR0aW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX3BhcnNlX3J0cG1hcCksCisJICAoZ3N0X3J0c3BzcmNfbWVkaWFfdG9fY2FwcyksIChnc3RfcnRzcHNyY19zdHJlYW1fc2V0dXBfcnRwKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksIChnc3RfcnRzcHNyY19zZW5kKSwKKwkgIChnc3RfcnRzcHNyY19jaGFuZ2Vfc3RhdGUpOgorCSAgTW9yZSBTRFAgcGFyc2luZyBhbmQgY2FwcyBzZXR0aW5nLgorCSAgRG8gTk9fUFJFUk9MTCBkaWZmZXJlbnRseS4KKwkgIGFkZCBwYWRzIG9ubHkgYWZ0ZXIgbmVnb3RpYXRlZC4KKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3VkcHNyY19nZXRjYXBzKToKKwkgIEltcGxlbWVudCB0aGUgZ2V0Y2FwcyBmdW5jdGlvbi4KKworMjAwNS0wOS0yMSAxNzo1MDoyOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBhbXJkZWMuYzogSGFuZGxlIG11bHRpcGxlIEFNciBwYWNrZXRzIHBlciBwYXlsb2FkLiBIYW5kbGUgQ1JDIGFuZCBwYXJzZSBJTEwvSUxQLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVjLmM6IChnc3RfcnRwYW1yZGVjX3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X3J0cGFtcmRlY19jaGFpbik6CisJICBIYW5kbGUgbXVsdGlwbGUgQU1yIHBhY2tldHMgcGVyIHBheWxvYWQuIEhhbmRsZSBDUkMgYW5kCisJICBwYXJzZSBJTEwvSUxQLgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcmVuYy5jOiAoZ3N0X3J0cGFtcmVuY19zZXRjYXBzKToKKwkgIE1ha2UgY2FwcyBwYXJhbXMgc3RyaW5ncyBmb3IgZWFzeSBTRFAgbWFwcGluZy4KKwkgICogZ3N0L3J0cC9nc3RydHBkZWMuYzogKGdzdF9ydHBkZWNfaW5pdCksIChnc3RfcnRwZGVjX2dldGNhcHMpOgorCSAgSGFuZGxlIGNhcHNuZWdvIGJldHRlci4KKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZGVjLmM6IChnc3RfcnRwbXA0dmRlY19zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZW5jLmM6IChnc3RfcnRwbXA0dmVuY19uZXdfY2Fwcyk6CisJICBHZW5lcmF0ZSBhbmQgcGFyc2UgY29uZmlnIHN0cmluZyBpbiB0aGUgY2Fwcy4KKworMjAwNS0wOS0yMSAxMjoxOToyNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9SRUFETUU6IFVwZGF0ZSBSRUFETUUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL1JFQURNRToKKwkgIFVwZGF0ZSBSRUFETUUKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJkZWMuYzogKGdzdF9ydHBhbXJkZWNfc2lua19zZXRjYXBzKToKKwkgIE1ha2UgZXh0cmEgcGFyYW1zIGFzIHN0cmluZ3MuCisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX3NldF9zdGF0ZSksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfcnRwbWFwKSwgKGdzdF9ydHNwc3JjX21lZGlhX3RvX2NhcHMpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9zZXR1cF9ydHApLCAoZ3N0X3J0c3BzcmNfc2VuZCk6CisJICBNYWtlIHN0YXRlIGNoYW5nZSByZXR1cm4gTk9fUFJFUk9MTCBhcyB0aGlzIGlzIGEgbGl2ZQorCSAgc291cmNlLgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19zZXRfcHJvcGVydHkpOgorCSAgRG9uJ3QgdW5yZWYgb2xkIGNhcHMgd2hlbiBOVUxMLgorCisyMDA1LTA5LTIwIDE3OjM1OjExICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC86IEFkZCBVUkkgaGFuZGxlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19nZXRfdHlwZSksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfcnRwbWFwKSwgKGdzdF9ydHNwc3JjX21lZGlhX3RvX2NhcHMpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9zZXR1cF9ydHApLCAoZ3N0X3J0c3BzcmNfc2VuZCksCisJICAoZ3N0X3J0c3BzcmNfb3BlbiksIChnc3RfcnRzcHNyY191cmlfZ2V0X3R5cGUpLAorCSAgKGdzdF9ydHNwc3JjX3VyaV9nZXRfcHJvdG9jb2xzKSwgKGdzdF9ydHNwc3JjX3VyaV9nZXRfdXJpKSwKKwkgIChnc3RfcnRzcHNyY191cmlfc2V0X3VyaSksIChnc3RfcnRzcHNyY191cmlfaGFuZGxlcl9pbml0KToKKwkgICogZ3N0L3J0c3Avc2RwbWVzc2FnZS5jOiAoc2RwX21lZGlhX2dldF9mb3JtYXQpOgorCSAgKiBnc3QvcnRzcC9zZHBtZXNzYWdlLmg6CisJICBBZGQgVVJJIGhhbmRsZXIuCisJICBQYXJzZSBTRFAgYW5kIGNyZWF0ZSBjYXBzLgorCisyMDA1LTA5LTIwIDE3OjE5OjQzICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIG1vcmUgc3BlYyBmaWxlIGZpeG9yaW5nCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIG1vcmUgc3BlYyBmaWxlIGZpeG9yaW5nCisKKzIwMDUtMDktMjAgMTc6MDQ6MzMgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSogZ3N0LXBsdWdpbnMuc3BlYy5pbjoKKwkgIGZpeCBzcGVjIGZpbGVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZpeCBzcGVjIGZpbGVzCisKKzIwMDUtMDktMjAgMTA6NTE6NTEgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3QvcnRwL1JFQURNRToKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlYy5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZWMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZlbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFkZWMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSAgZG9uJ3QgdXNlIHVuZGVyc2NvcmVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGRvbid0IHVzZSB1bmRlcnNjb3JlcworCisyMDA1LTA5LTIwIDA3OjMwOjMxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9hbHBoYS9nc3RhbHBoYS5jOiBmaXggZWxlbWVudCBkZXNjcmlwdGlvbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgZml4IGVsZW1lbnQgZGVzY3JpcHRpb24KKworMjAwNS0wOS0xOSAxNzo1NzowNiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkgIHByZXJlcXMgYXMgd2VsbAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBwcmVyZXFzIGFzIHdlbGwKKworMjAwNS0wOS0xOSAxNzo1Mzo0MiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGRvY3MvcGx1Z2lucy8uZ2l0aWdub3JlOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnNpZ25hbHM6CisJICBjb21taXQgcmVzdWx0IG9mIHNjYW5vYmogc3RlcAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBjb21taXQgcmVzdWx0IG9mIHNjYW5vYmogc3RlcAorCisyMDA1LTA5LTE5IDE3OjAzOjU1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVjLmM6IERvbid0IGNoZWNrIHBheWxvYWQgZm9yIG5vdy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVjLmM6IChnc3RfcnRwaDI2M3BkZWNfY2hhaW4pOgorCSAgRG9uJ3QgY2hlY2sgcGF5bG9hZCBmb3Igbm93LgorCisyMDA1LTA5LTE5IDE2OjQzOjU2ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogTWFrZWZpbGUuYW06CisJICBhZGQgY2hlY2stdmFsZ3JpbmQgdGFyZ2V0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCBjaGVjay12YWxncmluZCB0YXJnZXQKKworMjAwNS0wOS0xOSAxNjoyNjozMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLio6IEZpeCB3YXZwYXJzZSBzb21lIG1vcmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcmVzZXQpLAorCSAgKGdzdF93YXZwYXJzZV9pbml0KSwgKGdzdF93YXZwYXJzZV9wYXJzZV9maWxlX2hlYWRlciksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9pbml0KSwgKGdzdF93YXZwYXJzZV9oYW5kbGVfc2VlayksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKSwgKGdzdF93YXZwYXJzZV9zdHJlYW1fZGF0YSksCisJICAoZ3N0X3dhdnBhcnNlX2xvb3ApLCAoZ3N0X3dhdnBhcnNlX3BhZF9jb252ZXJ0KSwKKwkgIChnc3Rfd2F2cGFyc2VfcGFkX3F1ZXJ5KSwgKGdzdF93YXZwYXJzZV9zcmNwYWRfZXZlbnQpLAorCSAgKGdzdF93YXZwYXJzZV9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuaDoKKwkgIEZpeCB3YXZwYXJzZSBzb21lIG1vcmUuCisKKzIwMDUtMDktMTkgMTE6NDg6MTMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGNoZWNrL2VsZW1lbnRzL2xldmVsLmM6IEZpeCBmb3IgYnVzIEFQSSBjaGFuZ2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY2hlY2svZWxlbWVudHMvbGV2ZWwuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIEZpeCBmb3IgYnVzIEFQSSBjaGFuZ2UuCisKKzIwMDUtMDktMTkgMTE6Mzg6MTAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9sZXZlbC9sZXZlbC1leGFtcGxlLmM6IEZpeCBmb3IgbmV3IGJ1cyBBUEkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xldmVsL2xldmVsLWV4YW1wbGUuYzogKG1haW4pOgorCSAgRml4IGZvciBuZXcgYnVzIEFQSS4KKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfc2V0X3Byb3BlcnR5KToKKwkgIFNldCBjYXBzIG9uIHBhZHMuCisKKzIwMDUtMDktMTkgMTE6MDY6MDUgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3QvZGVidWcvTWFrZWZpbGUuYW06CisJICBkaXNhYmxlIGZsYWdzIGZvciB1bmJ1aWx0IHBsdWdpbnMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZGlzYWJsZSBmbGFncyBmb3IgdW5idWlsdCBwbHVnaW5zCisKKzIwMDUtMDktMTkgMDg6MjE6MjkgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBjb21tb246CisJKiBkb2NzL3BsdWdpbnMvc2Nhbm9iai1idWlsZC5zdGFtcDoKKwkgIG5vcm1hbCBidWlsZHMgc2hvdWxkbid0IHNjYW4gZ29iamVjdHMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgbm9ybWFsIGJ1aWxkcyBzaG91bGRuJ3Qgc2NhbiBnb2JqZWN0cworCisyMDA1LTA5LTE2IDAwOjM4OjUwICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogY2hlY2svTWFrZWZpbGUuYW06CisJKiBjb21tb246CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHJlbW92ZSBnc3QtcmVnaXN0ZXIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmVtb3ZlIGdzdC1yZWdpc3RlcgorCisyMDA1LTA5LTE1IDEzOjU3OjU2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBjb21tb246CisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9SRUFETUU6CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZWMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmVuYy5oOgorCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21lbmMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGFyc2UuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGFyc2UuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlYy5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZW5jLmg6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZWMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZlbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmVuYy5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFlbmMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5oOgorCSAgVXBkYXRlcyB0byBwYXlsb2FkZXIvZGVwYXlsb2FkZXJzLCBtYWtlIHBheWxvYWRlcnMgdXNlIHRoZSBiYXNlIGNsYXNzZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFVwZGF0ZXMgdG8gcGF5bG9hZGVyL2RlcGF5bG9hZGVycywgbWFrZSBwYXlsb2FkZXJzIHVzZQorCSAgdGhlIGJhc2UgY2xhc3Nlcy4KKwkgIFVwZGF0ZWQgUkVBRE1FIHdpdGggc3VnZ2VzdGVkIFJUUCBjYXBzIGFuZCBob3cgdG8gY29udmVydAorCSAgdG8vZnJvbSBTRFAuCisJICBBZGRlZCBjb25maWcgZGVzY3JpcHRvciBpbiBtcDR2IHBheWxvYWRlci4KKworMjAwNS0wOS0xNSAxMDo0Nzo1OCArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmMgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfZmluZF9iZXN0KTogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMDktMTUgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYyAoZ3N0X2F1dG9fYXVkaW9fc2lua19maW5kX2Jlc3QpOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmMKKwkgIChnc3RfYXV0b192aWRlb19zaW5rX2ZpbmRfYmVzdCk6IFVwZGF0ZSBmb3IgbmV3IHJlZ2lzdHJ5IEFQSS4KKworMjAwNS0wOS0xNCAyMDo1MTo0NyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGNvbW1vbi86IGEgc2ltcGxlIHB5IHNjcmlwdCB0byBnZW5lcmF0ZSB2YWxpZCB4bWwgZnJvbSBhIEMgZXhhbXBsZSBwcm9iYWJseSBhbHNvIG5lZWQgdG8gc3RyaXAgYW4gTUlUIGxpY2Vuc2Ugd2hlbiB3ZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbW1vbi9jLXRvLXhtbC5weToKKwkgICogY29tbW9uL2d0ay1kb2MtcGx1Z2lucy5tYWs6CisJICBhIHNpbXBsZSBweSBzY3JpcHQgdG8gZ2VuZXJhdGUgdmFsaWQgeG1sIGZyb20gYSBDIGV4YW1wbGUKKwkgIHByb2JhYmx5IGFsc28gbmVlZCB0byBzdHJpcCBhbiBNSVQgbGljZW5zZSB3aGVuIHdlIGRlY2lkZQorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGdzdC9sZXZlbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6IChnc3RfbGV2ZWxfaW5pdCk6CisJICAqIGdzdC9sZXZlbC9sZXZlbC1leGFtcGxlLmM6IChtZXNzYWdlX2hhbmRsZXIpLCAobWFpbik6CisJICBhZGQgYW4gZXhhbXBsZSB0byBsZXZlbCB0aGF0IHdpbGwgc2hvdyB1cCBpbiB0aGUgZG9jcworCSAgKiBnc3QvcnRwL1RPRE86CisJICBhZGQgYSBub3RlIGZvciB0aGUgZnV0dXJlCisKKzIwMDUtMDktMTQgMTE6NDQ6MTEgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzogQWN0dWFsbHkgZGVmaW5lIHRoZSBkZWJ1ZyBvYmplY3QgYmVpbmcgdXNlZCBpbiB3YXZlbmMuIEZpeGVzICMzMTYyMDUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiAoZ3N0X3dhdmVuY19jbGFzc19pbml0KToKKwkgIEFjdHVhbGx5IGRlZmluZSB0aGUgZGVidWcgb2JqZWN0IGJlaW5nIHVzZWQgaW4gd2F2ZW5jLiBGaXhlcyAjMzE2MjA1CisKKzIwMDUtMDktMTQgMTE6MjM6NDQgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L3NtcHRlL01ha2VmaWxlLmFtOgorCSAgTGluayBzbXB0ZSBwbHVnaW4gYWdhaW5zdCBHU1RfQkFTRV9MSUJTLCB0byBnZXQgbGliZ3N0YmFzZTsgbmVlZGVkIHRvIGJ1aWxkIG9uIHdpbjMyIGFzIHRoaXMgcGx1Z2luIHVzZXMgY29sbGVjdHBhZHMgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIExpbmsgc21wdGUgcGx1Z2luIGFnYWluc3QgR1NUX0JBU0VfTElCUywgdG8gZ2V0IGxpYmdzdGJhc2U7IG5lZWRlZCB0bworCSAgYnVpbGQgb24gd2luMzIgYXMgdGhpcyBwbHVnaW4gdXNlcyBjb2xsZWN0cGFkcyAoYnVnIDMxNjIwNCkKKworMjAwNS0wOS0xMiAxNjozNzowNSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkgIEZpeCB1cCBib2d1cyBDaGFuZ2VMb2cgZW50cnkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRml4IHVwIGJvZ3VzIENoYW5nZUxvZyBlbnRyeQorCisyMDA1LTA5LTEyIDE2OjE0OjQ4ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIGF1dG9nZW4uc2ggKHBhY2thZ2UpOiBOb3cgdHlwZSAnbWFrZScgdG8gYnVpbGQgZ3N0LXBsdWdpbnMtZ29vZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0wOS0xMiAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKwkgICogYXV0b2dlbi5zaCAocGFja2FnZSk6IE5vdyB0eXBlICdtYWtlJyB0byBidWlsZCBnc3QtcGx1Z2lucy1nb29kLgorCisyMDA1LTA5LTExIDE3OjUyOjA5ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogY29tbW9uOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mZHNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJICBhZGQgc291cmNlIG1vZHVsZSB0byBkb2NzOyByZWluc3BlY3QKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkIHNvdXJjZSBtb2R1bGUgdG8gZG9jczsgcmVpbnNwZWN0CisKKzIwMDUtMDktMDkgMTc6NTY6NDMgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBNb3ZlIGZkc3JjIGJhY2sgaW50byBnc3RyZWFtZXIgY29yZSBlbGVtZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9mZHNyYy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2Zkc3JjL2dzdGZkc3JjLmM6CisJICAqIGdzdC9mZHNyYy9nc3RmZHNyYy5oOgorCSAgTW92ZSBmZHNyYyBiYWNrIGludG8gZ3N0cmVhbWVyIGNvcmUgZWxlbWVudHMuCisJICAqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiAoZ3N0X2xldmVsX2NsYXNzX2luaXQpLAorCSAgKGdzdF9sZXZlbF90cmFuc2Zvcm1faXApOgorCSAgKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogKGdzdF92aWRlb19ib3hfc2V0X3Byb3BlcnR5KToKKwkgIEJhc2V0cmFuc2Zvcm0gY2hhbmdlcy4KKworMjAwNS0wOS0wOSAxNjoxMTo0OCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmM6CisJKiBleHQvanBlZy9zbW9rZWNvZGVjLmM6CisJICBmaXggY29tcGlsZXIgd2FybmluZ3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZml4IGNvbXBpbGVyIHdhcm5pbmdzCisKKzIwMDUtMDktMDkgMTE6MDk6NDkgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46IHNwZWMgZmlsZSBmaXhlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIHNwZWMgZmlsZSBmaXhlcworCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19jbGFzc19pbml0KSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX3JlbmRlciksIChnc3RfbXVsdGl1ZHBzaW5rX2FkZCksCisJICAoZ3N0X211bHRpdWRwc2lua19jbGVhcik6CisJICBpdCBhY3R1YWxseSBoZWxwcyB0byBhY3R1YWxseSBzdHJlYW0gaWYgd2UgaG9vayB1cCB0aGUKKwkgIGFkZCBzaWduYWwgdG8gYW4gYWN0dWFsIGltcGxlbWVudGF0aW9uCisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX3N0YXJ0KToKKwkgIHNvbWUgZGVidWdnaW5nCisKKzIwMDUtMDktMDggMTY6NTg6NDAgKzAwMDAgIEZsYXZpbyBPbGl2ZWlyYSA8ZmxhdmlvLm9saXZlaXJhQGluZHQub3JnLmJyPgorCisJKiBleHQvanBlZy9NYWtlZmlsZS5hbToKKwkqIGV4dC9qcGVnL2dzdGpwZWcuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmM6CisJICBqcGdlbmMgcG9ydGVkIHRvIEdTVHJlYW1lciAwLjkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAganBnZW5jIHBvcnRlZCB0byBHU1RyZWFtZXIgMC45CisKKzIwMDUtMDktMDggMTY6MjY6MTcgKzAwMDAgIEZsYXZpbyBPbGl2ZWlyYSA8ZmxhdmlvLm9saXZlaXJhQGluZHQub3JnLmJyPgorCisJKiBDaGFuZ2VMb2c6CisJICBqcGVnZW5jIHBvcnRlZCB0byBHU3RyZWFtZXIgMC45CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGpwZWdlbmMgcG9ydGVkIHRvIEdTdHJlYW1lciAwLjkKKworMjAwNS0wOS0wNyAxMzo0OTozNyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBleHQvOiBnc3R0YWdpbnRlcmZhY2UuaCAtPiBnc3R0YWdzZXR0ZXIuaAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjdGFnLmM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgZ3N0dGFnaW50ZXJmYWNlLmggLT4gZ3N0dGFnc2V0dGVyLmgKKworMjAwNS0wOS0wNiAyMzozMDowMyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIFBvcnQgdG8gMC45IGFuZCByZS1lbmFibGUgZWZlbmNlIHBsdWdpbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9kZWJ1Zy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RlYnVnL2VmZW5jZS5jOiAoZ3N0X2VmZW5jZV9jbGFzc19pbml0KSwgKGdzdF9lZmVuY2VfaW5pdCksCisJICAoZ3N0X2VmZW5jZV9jaGFpbiksIChnc3RfZWZlbmNlX2J1ZmZlcl9hbGxvYyksIChwbHVnaW5faW5pdCksCisJICAoZ3N0X2ZlbmNlZF9idWZmZXJfZmluYWxpemUpLCAoZ3N0X2ZlbmNlZF9idWZmZXJfY29weSksCisJICAoZ3N0X2ZlbmNlZF9idWZmZXJfYWxsb2MpLCAoZ3N0X2ZlbmNlZF9idWZmZXJfY2xhc3NfaW5pdCksCisJICAoZ3N0X2ZlbmNlZF9idWZmZXJfaW5pdCksIChnc3RfZmVuY2VkX2J1ZmZlcl9nZXRfdHlwZSk6CisJICBQb3J0IHRvIDAuOSBhbmQgcmUtZW5hYmxlIGVmZW5jZSBwbHVnaW4uCisKKzIwMDUtMDktMDYgMjE6MzE6MjUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9mbGFjL2dzdGZsYWNkZWMuKjogQWRkIHN1cHBvcnQgZm9yIGZsYWMgZmlsZXMgd2l0aCAyNC8zMiBiaXRzIHBlciBzYW1wbGU7IGFuZCBtaXNjLiBtaW5vciBjbGVhbi11cHMuIFNlZWtpbmcgaXMgcy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGZsYWNfY2Fwc19mYWN0b3J5KSwgKHJhd19jYXBzX2ZhY3RvcnkpLAorCSAgKGdzdF9mbGFjZGVjX3dyaXRlKSwgKGdzdF9mbGFjZGVjX2NvbnZlcnRfc3JjKToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oOgorCSAgQWRkIHN1cHBvcnQgZm9yIGZsYWMgZmlsZXMgd2l0aCAyNC8zMiBiaXRzIHBlciBzYW1wbGU7IGFuZCBtaXNjLgorCSAgbWlub3IgY2xlYW4tdXBzLiBTZWVraW5nIGlzIHN0aWxsIHBhcnRseSBicm9rZW4gKGZvciBtZSBhdCBsZWFzdCkuCisKKzIwMDUtMDktMDYgMTU6NTA6NTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvOiBBZGRlZCBtcGVnNCB2aWRlbyBwYXlsb2FkIGVuY29kZXIvZGVjb2Rlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwL2dzdHJ0cC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZWMuYzogKGdzdF9ydHBtcDR2ZGVjX2dldF90eXBlKSwKKwkgIChnc3RfcnRwbXA0dmRlY19iYXNlX2luaXQpLCAoZ3N0X3J0cG1wNHZkZWNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cG1wNHZkZWNfaW5pdCksIChnc3RfcnRwbXA0dmRlY19zZXRjYXBzKSwKKwkgIChnc3RfcnRwbXA0dmRlY19jaGFpbiksIChnc3RfcnRwbXA0dmRlY19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBtcDR2ZGVjX2dldF9wcm9wZXJ0eSksIChnc3RfcnRwbXA0dmRlY19jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9ydHBtcDR2ZGVjX3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZGVjLmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dmVuYy5jOiAoZ3N0X3J0cG1wNHZlbmNfZ2V0X3R5cGUpLAorCSAgKGdzdF9ydHBtcDR2ZW5jX2Jhc2VfaW5pdCksIChnc3RfcnRwbXA0dmVuY19jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwbXA0dmVuY19pbml0KSwgKGdzdF9ydHBtcDR2ZW5jX3NldGNhcHMpLAorCSAgKGdzdF9ydHBtcDR2ZW5jX2ZsdXNoKSwgKGdzdF9ydHBtcDR2ZW5jX2NoYWluKSwKKwkgIChnc3RfcnRwbXA0dmVuY19zZXRfcHJvcGVydHkpLCAoZ3N0X3J0cG1wNHZlbmNfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwbXA0dmVuY19jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3J0cG1wNHZlbmNfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZlbmMuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFkZWMuYzogKGdzdF9ydHBtcGFkZWNfY2hhaW4pOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYWVuYy5jOiAoZ3N0X3J0cG1wYWVuY19mbHVzaCk6CisJICBBZGRlZCBtcGVnNCB2aWRlbyBwYXlsb2FkIGVuY29kZXIvZGVjb2Rlci4KKwkgIEFkZGVkIHNvbWUgZG9jcyBpbiBtcGEgcGF5bG9hZGVyLgorCisyMDA1LTA5LTA2IDE0OjA2OjQ3ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgYmFjayB0byBIRUFECisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGJhY2sgdG8gSEVBRAorCis9PT0gcmVsZWFzZSAwLjkuMSA9PT0KKworMjAwNS0wOS0wNiAxNDowNTozMyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUFETUU6CisJKiBSRUxFQVNFOgorCSogYXV0b2dlbi5zaDoKKwkqIGNvbW1vbjoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIHJlbGVhc2luZyAwLjkuMgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZWxlYXNpbmcgMC45LjIKKworMjAwNS0wOS0wNSAxNzoyMDoyOCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyZWxlbWVudC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgRml4IHVwIGFsbCB0aGUgc3RhdGUgY2hhbmdlIGZ1bmN0aW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRml4IHVwIGFsbCB0aGUgc3RhdGUgY2hhbmdlIGZ1bmN0aW9ucy4KKworMjAwNS0wOS0wNSAxNjoyODoxNiArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBleHQvZHYvZ3N0ZHZkZW11eC5jIChnc3RfZHZkZW11eF9jaGFpbik6IE1vdmUgdGhlIHBhZCBhZGRpbmcgaGVyZSBmcm9tIHRoZSBzdGF0ZSBjaGFuZ2UgaGFuZGxlciwgc28gd2UgZmlyZSBzaWduYWxzIHcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0wOS0wNSAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYyAoZ3N0X2R2ZGVtdXhfY2hhaW4pOiBNb3ZlIHRoZSBwYWQgYWRkaW5nCisJICBoZXJlIGZyb20gdGhlIHN0YXRlIGNoYW5nZSBoYW5kbGVyLCBzbyB3ZSBmaXJlIHNpZ25hbHMgd2l0aG91dAorCSAgaG9sZGluZyB0aGUgc3RhdGUgbG9jay4KKworMjAwNS0wOS0wNSAxNToxMDoxOCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIGNsZWFuaW5nIHVwIGJhZAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBjbGVhbmluZyB1cCBiYWQKKworMjAwNS0wOS0wNSAxMzoxODo0MiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGRvY3MvLmdpdGlnbm9yZToKKwkqIGRvY3MvcGx1Z2lucy8uZ2l0aWdub3JlOgorCSAgbWFpbnRlbmFuY2UgY29tbWl0cworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBtYWludGVuYW5jZSBjb21taXRzCisKKzIwMDUtMDktMDQgMTU6MDk6MzMgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0LWJ1aWxkLnN0YW1wOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3Quc3RhbXA6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZkc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkgIGRpc3RjaGVjayBmaXhlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBkaXN0Y2hlY2sgZml4ZXMKKworMjAwNS0wOS0wNCAxMTo1MDo0NyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogYXV0b2dlbi5zaDoKKwkqIGNvbW1vbjoKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJICBmaXggZGlzdGNoZWNrCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZpeCBkaXN0Y2hlY2sKKworMjAwNS0wOS0wMiAxNTo1Njo1MiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIHZhcmlvdXMgc3BlYyBmaXhlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICB2YXJpb3VzIHNwZWMgZml4ZXMKKworMjAwNS0wOS0wMiAxNTo0NDo1MCArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBjaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSogZXhhbXBsZXMvZ3N0cGxheS9wbGF5ZXIuYzoKKwkqIGV4YW1wbGVzL3N0YXRzL21wMm9nZy5jOgorCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJKiBleHQvZHYvZ3N0ZHZkZWMuYzoKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJKiBleHQvZXNkL2VzZG1vbi5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOgorCSogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zaW5rLmM6CisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NpbmsuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka2FuaW1hdGlvbi5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYzoKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmM6CisJKiBleHQvbGlibW5nL2dzdG1uZ2RlYy5jOgorCSogZXh0L21pa21vZC9nc3RtaWttb2QuYzoKKwkqIGV4dC9wYW5nby9nc3R0ZXh0b3ZlcmxheS5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9kZWJ1Zy9icmVha215ZGF0YS5jOgorCSogZ3N0L2RlYnVnL2dzdG5hdmlnYXRpb250ZXN0LmM6CisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5jOgorCSogZ3N0L2Zkc3JjL2dzdGZkc3JjLmM6CisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOgorCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzoKKwkqIGdzdC9vbGRjb3JlL2dzdG1kNXNpbmsuYzoKKwkqIGdzdC9vbGRjb3JlL2dzdG11bHRpZmlsZXNyYy5jOgorCSogZ3N0L29sZGNvcmUvZ3N0cGlwZWZpbHRlci5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZlbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGFyc2UuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlYy5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJlbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGRlYy5jOgorCSogZ3N0L3J0cC9nc3RydHBkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21lbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGFyc2UuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BlbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9zbW9vdGh3YXZlL2dzdHNtb290aHdhdmUuYzoKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBzeXMvb3NzL2dzdG9zc21peGVyZWxlbWVudC5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvZWxlbWVudC5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgQWxsIHBsdWdpbnMgdXBkYXRlZCBmb3IgZWxlbWVudCBzdGF0ZSBjaGFuZ2VzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTA5LTAyICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBBbGwgcGx1Z2lucyB1cGRhdGVkIGZvciBlbGVtZW50IHN0YXRlIGNoYW5nZXMuCisKKzIwMDUtMDktMDEgMjE6MjQ6NTcgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBleHQvYWFsaWIvTWFrZWZpbGUuYW06CisJICBmaXggYnVpbGQgYWZ0ZXIgY2xlYW5pbmcgdXAgbXkgdm9taXQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZml4IGJ1aWxkIGFmdGVyIGNsZWFuaW5nIHVwIG15IHZvbWl0CisKKzIwMDUtMDktMDEgMjE6MjM6MDkgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBleHQvYWFsaWIvTWFrZWZpbGUuYW06CisJICBmaXggYnVpbGQgYWZ0ZXIgY2xlYW5pbmcgdXAgbXkgdm9taXQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZml4IGJ1aWxkIGFmdGVyIGNsZWFuaW5nIHVwIG15IHZvbWl0CisKKzIwMDUtMDktMDEgMjE6MjA6NDUgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3Qvc21wdGUvTWFrZWZpbGUuYW06CisJICBmaXggYnVpbGQgYWZ0ZXIgY2xlYW5pbmcgdXAgbXkgdm9taXQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZml4IGJ1aWxkIGFmdGVyIGNsZWFuaW5nIHVwIG15IHZvbWl0CisKKzIwMDUtMDktMDEgMjE6MTU6MzAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3Qvc21wdGUvTWFrZWZpbGUuYW06CisJICBmaXggYnVpbGQgYWZ0ZXIgY2xlYW5pbmcgdXAgbXkgdm9taXQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZml4IGJ1aWxkIGFmdGVyIGNsZWFuaW5nIHVwIG15IHZvbWl0CisKKzIwMDUtMDktMDEgMjA6MjM6MjIgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBNYWtlZmlsZS5hbToKKwkqIGNoZWNrLy5naXRpZ25vcmU6CisJKiBjaGVjay9NYWtlZmlsZS5hbToKKwkqIGNoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiBjaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSogY29tbW9uOgorCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuaDoKKwkqIHRlc3RzL2NoZWNrLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgQW5kcmV3aW8gUGF0cmlja29mb3J1cyBXaW5nb255bXVzIC0gNSBhZGRpdGlvbmFsIHRlc3RzIGZvciB5b3VyIHNpbnMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQW5kcmV3aW8gUGF0cmlja29mb3J1cyBXaW5nb255bXVzIC0gNSBhZGRpdGlvbmFsIHRlc3RzIGZvciB5b3VyIHNpbnMKKwkgIEFkZCBhIHJlZ3Jlc3Npb24gdGVzdCBmb3IgbGV2ZWwgYW5kIGZpeCBhIGNhc3RpbmcgYnVnIHRoYXQgbWFkZSB0aGUgYWRkaXRpb25hbAorCSAgY2hhbm5lbHMgdHVybiBvdXQgd3JvbmcKKworMjAwNS0wOS0wMSAxNzo1NToxNCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGFkZCBkb2NzIHRvIGJ1aWxkCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogTWFrZWZpbGUuYW06CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIGFkZCBkb2NzIHRvIGJ1aWxkCisJICAqIGNvbW1vbi9wbHVnaW5zLnhzbDoKKwkgIHdyYXAgRGVzY3JpcHRpb24gaW50byBhIHJlZnNlY3QyCisJICAqIGRvY3MvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBnc3QvZ29vbS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2dvb20vZ3N0Z29vbS5jOiAoZ3N0X2dvb21fZ2V0X3R5cGUpLCAoZ3N0X2dvb21fYmFzZV9pbml0KSwKKwkgIChnc3RfZ29vbV9jbGFzc19pbml0KSwgKGdzdF9nb29tX2luaXQpLCAoZ3N0X2dvb21fZGlzcG9zZSksCisJICAoZ3N0X2dvb21fc2lua19zZXRjYXBzKSwgKGdzdF9nb29tX3NyY19zZXRjYXBzKSwKKwkgIChnc3RfZ29vbV9zcmNfbmVnb3RpYXRlKSwgKGdzdF9nb29tX2V2ZW50KSwgKGdzdF9nb29tX2NoYWluKSwKKwkgIChnc3RfZ29vbV9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmg6CisJICBHc3RHT09NIC0+IEdzdEdvb20KKwkgIGFkZCBhbiBleGFtcGxlIGxhdW5jaCBsaW5lCisJICAqIGdzdC9sZXZlbC9nc3RsZXZlbC5oOgorCSAgKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSAgY2xlYW51cHMKKworMjAwNS0wOC0zMSAxNjoyODowNSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC9kdmRscGNtZGVjLy5naXRpZ25vcmU6CisJKiBnc3QvZHZkbHBjbWRlYy9NYWtlZmlsZS5hbToKKwkqIGdzdC9kdmRscGNtZGVjL2dzdGR2ZGxwY21kZWMuYzoKKwkqIGdzdC9kdmRscGNtZGVjL2dzdGR2ZGxwY21kZWMuaDoKKwkgIHJlbW92ZSBkdmRscGNtZGVjLCBpdCdzIGR2ZCBzdHVmZgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZW1vdmUgZHZkbHBjbWRlYywgaXQncyBkdmQgc3R1ZmYKKworMjAwNS0wOC0zMCAxOTo0MToxMiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L2dldHRleHQuaDoKKwkqIGdzdC1saWJzL2dzdC9nc3QtaTE4bi1wbHVnaW4uaDoKKwkgIGFkZCBzb21lIGkxOG4gaGVhZGVycworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgc29tZSBpMThuIGhlYWRlcnMKKworMjAwNS0wOC0zMCAxOToyNDozNyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGRvY3MvcGx1Z2lucy8uZ2l0aWdub3JlOgorCSAgaWdub3JlIG1vcmUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgaWdub3JlIG1vcmUKKworMjAwNS0wOC0zMCAxOToyNDowMyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGRvY3MvTWFrZWZpbGUuYW06CisJICBNYWtlZmlsZS5hbQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBNYWtlZmlsZS5hbQorCisyMDA1LTA4LTMwIDE5OjIwOjAyICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZG9jcy91cGxvYWQubWFrOgorCSogZG9jcy92ZXJzaW9uLmVudGl0aWVzLmluOgorCSAgY29tbWl0IG5ldyBzdHVmZgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBjb21taXQgbmV3IHN0dWZmCisKKzIwMDUtMDgtMzAgMTk6MDE6MTggKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBjb21tb246CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy50eXBlczoKKwkgIGRvY3VtZW50IGVsZW1lbnRzIGFuZCBwbHVnaW5zLiAgU2hhemFtICEKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZG9jdW1lbnQgZWxlbWVudHMgYW5kIHBsdWdpbnMuICBTaGF6YW0gIQorCisyMDA1LTA4LTMwIDE3OjM3OjAwICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogLmdpdGlnbm9yZToKKwkqIENPUFlJTkc6CisJKiBSRUxFQVNFOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgYWRkIHNvbWUgZmlsZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkIHNvbWUgZmlsZXMKKworMjAwMS0xMi0xNyAxODozNzowMSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGJ1aWxkaW5nIHVwIHNwZWVkCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGJ1aWxkaW5nIHVwIHNwZWVkCisKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJhYWM4ZQotLS0gL2Rldi9udWxsCisrKyBiL01BSU5UQUlORVJTCkBAIC0wLDAgKzEsMTIgQEAKK0dTdHJlYW1lciBpcyBjdXJyZW50bHkgbWFpbnRhaW5lZCBieSB0aGUgY29uc2Vuc3VzIG9mIGEgbnVtYmVyCitvZiBwZW9wbGUsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOgorCisgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0Bjb2F4aW9uLm5ldD4KKworTWFpbnRhaW5lci1yZWxhdGVkIGlzc3VlcyBzaG91bGQgYmUgYWRkcmVzc2VkIHRvOgorCisgIGdzdHJlYW1lci1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmFtIGIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjYjU5YQotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsODIgQEAKK0RJU1RDSEVDS19DT05GSUdVUkVfRkxBR1M9LS1lbmFibGUtZ3RrLWRvYworCitBTFdBWVNfU1VCRElSUyA9CQlcCisJZ3N0IHN5cyBleHQgCQlcCisJdGVzdHMJCQlcCisJZG9jcwkJCVwKKwlwbwkJCVwKKwljb21tb24JCQlcCisJbTQJCQlcCisJcGtnY29uZmlnCisKK1NVQkRJUlMgPSAkKEFMV0FZU19TVUJESVJTKQorCitESVNUX1NVQkRJUlMgPSAkKEFMV0FZU19TVUJESVJTKQorCitFWFRSQV9ESVNUID0gXAorCWRlcGNvbXAgXAorCUFVVEhPUlMgQ09QWUlORyBORVdTIFJFQURNRSBSRUxFQVNFIFJFUVVJUkVNRU5UUyBcCisJQ2hhbmdlTG9nIGdzdC1wbHVnaW5zLWdvb2QuZG9hcCBhdXRvZ2VuLnNoIFwKKwkkKHNoZWxsIGZpbmQgIiQodG9wX3NyY2RpcikiIC10eXBlIGYgLW5hbWUgbWVzb24uYnVpbGQgISAtcGF0aCAiJCh0b3Bfc3JjZGlyKS8kKFBBQ0tBR0VfVEFSTkFNRSktKiIgKSBcCisJbWVzb25fb3B0aW9ucy50eHQKKworRElTVENMRUFORklMRVMgPSBfc3RkaW50LmgKKworbm9pbnN0X0hFQURFUlMgPSBcCisJZ3N0LWxpYnMvZ3N0L2dldHRleHQuaCBcCisJZ3N0LWxpYnMvZ3N0L2dzdC1pMThuLXBsdWdpbi5oIFwKKwlnc3QtbGlicy9nc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oCisKK0FDTE9DQUxfQU1GTEFHUyA9IC1JIG00IC1JIGNvbW1vbi9tNAorCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29tbW9uL3JlbGVhc2UubWFrCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29tbW9uL3BvLm1haworCitjaGVjay12YWxncmluZDoKKwkkKE1BS0UpIC1DIHRlc3RzL2NoZWNrIGNoZWNrLXZhbGdyaW5kCisKK2lmIEhBVkVfR1NUX0NIRUNLCitjaGVjay10b3J0dXJlOgorCSQoTUFLRSkgLUMgdGVzdHMvY2hlY2sgdG9ydHVyZQorYnVpbGQtY2hlY2tzOgorCSQoTUFLRSkgLUMgdGVzdHMvY2hlY2sgYnVpbGQtY2hlY2tzCitlbHNlCitjaGVjay10b3J0dXJlOgorCXRydWUKK2J1aWxkLWNoZWNrczoKKwl0cnVlCitlbmRpZgorCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29tbW9uL2NvdmVyYWdlL2xjb3YubWFrCisKKyMgY3J1ZnQ6IHBsdWdpbnMgdGhhdCBoYXZlIGJlZW4gbWVyZ2VkIG9yIG1vdmVkIG9yIHJlbmFtZWQKKworQ1JVRlRfRklMRVMgPSBcCisJJCh0b3BfYnVpbGRkaXIpL2dzdC1wbHVnaW5zLWdvb2Quc3BlYyBcCisJJCh0b3BfYnVpbGRkaXIpL3dpbjMyL2NvbW1vbi9jb25maWcuaC1uZXcgXAorCSQodG9wX2J1aWxkZGlyKS9jb21tb24vc2hhdmUgXAorCSQodG9wX2J1aWxkZGlyKS9jb21tb24vc2hhdmUtbGlidG9vbCBcCisJJCh0b3BfYnVpbGRkaXIpL2RvY3MvcGx1Z2lucy94bWwvcGx1Z2luLXNob3V0MnNlbmQueG1sIFwKKwkkKHRvcF9idWlsZGRpcikvZXh0L3B1bHNlLy5saWJzL2xpYmdzdHB1bHNlLnNvIFwKKwkkKHRvcF9idWlsZGRpcikvZXh0L3NvdXAvLmxpYnMvbGliZ3N0c291cGh0dHBzcmMuc28gXAorCSQodG9wX2J1aWxkZGlyKS9nc3QvbWVkaWFuLy5saWJzLyoue3NvLGRsbCxETEwsZHlsaWJ9IFwKKwkkKHRvcF9idWlsZGRpcikvZ3N0L3F0ZGVtdXgvLmxpYnMvKi57c28sZGxsLERMTCxkeWxpYn0gXAorCSQodG9wX2J1aWxkZGlyKS9nc3QvcXVpY2t0aW1lLy5saWJzLyoue3NvLGRsbCxETEwsZHlsaWJ9IFwKKwkkKHRvcF9idWlsZGRpcikvZ3N0L3ZpZGVvZmlsdGVyLy5saWJzLyp2aWRlb2ZsaXAue3NvLGRsbCxETEwsZHlsaWJ9IFwKKwkkKHRvcF9idWlsZGRpcikvZ3N0L3ZpZGVvZmlsdGVyLy5saWJzLyp2aWRlb2JhbGFuY2Uue3NvLGRsbCxETEwsZHlsaWJ9IFwKKwkkKHRvcF9idWlsZGRpcikvZ3N0L3ZpZGVvZmlsdGVyLy5saWJzLypnYW1tYS57c28sZGxsLERMTCxkeWxpYn0gXAorCSQodG9wX2J1aWxkZGlyKS9zeXMvZGlyZWN0c291bmQvLmxpYnMvbGliZ3N0ZGlyZWN0c291bmRzaW5rLntkbGwsRExMfSBcCisJJCh0b3BfYnVpbGRkaXIpL3N5cy9vc3M0Ly5saWJzL2xpYmdzdG9zczRhdWRpby5zbyBcCisJJCh0b3BfYnVpbGRkaXIpL3N5cy93YXZlZm9ybS8ubGlicy9saWJnc3R3YXZlZm9ybXNpbmsue2RsbCxETEx9CisKK0NSVUZUX0RJUlMgPSBcCisJJCh0b3Bfc3JjZGlyKS9kb2NzL3BsdWdpbnMvdG1wbCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvbWVkaWFuIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9xdGRlbXV4IFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9xdWlja3RpbWUgXAorCSQodG9wX3NyY2RpcikvZXh0L2Fubm9kZXggXAorCSQodG9wX3NyY2RpcikvdGVzdHMvZXhhbXBsZXMvcHVsc2UKKworaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2NvbW1vbi9jcnVmdC5tYWsKKworYWxsLWxvY2FsOiBjaGVjay1jcnVmdApkaWZmIC0tZ2l0IGEvTkVXUyBiL05FV1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRmYjFlYQotLS0gL2Rldi9udWxsCisrKyBiL05FV1MKQEAgLTAsMCArMSw3MzQgQEAKKyMgR1N0cmVhbWVyIDEuMTIgUmVsZWFzZSBOb3RlcworCitHU3RyZWFtZXIgMS4xMi4wIHdhcyBvcmlnaW5hbGx5IHJlbGVhc2VkIG9uIDR0aCBNYXkgMjAxNy4KKworVGhlIEdTdHJlYW1lciB0ZWFtIGlzIHByb3VkIHRvIGFubm91bmNlIGEgbmV3IG1ham9yIGZlYXR1cmUgcmVsZWFzZSBpbiB0aGUKK3N0YWJsZSAxLnggQVBJIHNlcmllcyBvZiB5b3VyIGZhdm91cml0ZSBjcm9zcy1wbGF0Zm9ybSBtdWx0aW1lZGlhIGZyYW1ld29yayEKKworQXMgYWx3YXlzLCB0aGlzIHJlbGVhc2UgaXMgYWdhaW4gcGFja2VkIHdpdGggbmV3IGZlYXR1cmVzLCBidWcgZml4ZXMgYW5kIG90aGVyCitpbXByb3ZlbWVudHMuCisKK1NlZSBbaHR0cHM6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3JlbGVhc2VzLzEuMTIvXVtsYXRlc3RdIGZvciB0aGUgbGF0ZXN0Cit2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQuCisKKypMYXN0IHVwZGF0ZWQ6IFRodXJzZGF5IDQgTWF5IDIwMTcsIDExOjAwIFVUQyBbKGxvZyldW2dpdGxvZ10qCisKK1tsYXRlc3RdOiBodHRwczovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvcmVsZWFzZXMvMS4xMi8KK1tnaXRsb2ddOiBodHRwczovL2NnaXQuZnJlZWRlc2t0b3Aub3JnL2dzdHJlYW1lci93d3cvbG9nL3NyYy9odGRvY3MvcmVsZWFzZXMvMS4xMi9yZWxlYXNlLW5vdGVzLTEuMTIubWQKKworIyMgSW50cm9kdWN0aW9uCisKK1RoZSBHU3RyZWFtZXIgdGVhbSBpcyBwcm91ZCB0byBhbm5vdW5jZSBhIG5ldyBtYWpvciBmZWF0dXJlIHJlbGVhc2UgaW4gdGhlCitzdGFibGUgMS54IEFQSSBzZXJpZXMgb2YgeW91ciBmYXZvdXJpdGUgY3Jvc3MtcGxhdGZvcm0gbXVsdGltZWRpYSBmcmFtZXdvcmshCisKK0FzIGFsd2F5cywgdGhpcyByZWxlYXNlIGlzIGFnYWluIHBhY2tlZCB3aXRoIG5ldyBmZWF0dXJlcywgYnVnIGZpeGVzIGFuZCBvdGhlcgoraW1wcm92ZW1lbnRzLgorCisjIyBIaWdobGlnaHRzCisKKy0gbmV3IGBtc2RrYCBwbHVnaW4gZm9yIEludGVsJ3MgTWVkaWEgU0RLIGZvciBoYXJkd2FyZS1hY2NlbGVyYXRlZCB2aWRlbworICBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgb24gSW50ZWwgZ3JhcGhpY3MgaGFyZHdhcmUgb24gV2luZG93cyBvciBMaW51eC4KKworLSBgeDI2NGVuY2AgY2FuIG5vdyB1c2UgbXVsdGlwbGUgeDI2NCBsaWJyYXJ5IHZlcnNpb25zIGNvbXBpbGVkIGZvciBkaWZmZXJlbnQKKyAgYml0IGRlcHRocyBhdCBydW50aW1lLCB0byB0cmFuc3BhcmVudGx5IHByb3ZpZGUgc3VwcG9ydCBmb3IgbXVsdGlwbGUgYml0CisgIGRlcHRocy4KKworLSBgdmlkZW9zY2FsZWAgYW5kIGB2aWRlb2NvbnZlcnRgIG5vdyBzdXBwb3J0IG11bHRpLXRocmVhZGVkIHNjYWxpbmcgYW5kCisgIGNvbnZlcnNpb24sIHdoaWNoIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2l0aCBoaWdoZXIgcmVzb2x1dGlvbiB2aWRlby4KKworLSBgaDI2NHBhcnNlYCB3aWxsIG5vdyBhdXRvbWF0aWNhbGx5IGluc2VydCBBVSBkZWxpbWl0ZXJzIGlmIG5lZWRlZCB3aGVuCisgIG91dHB1dHRpbmcgYnl0ZS1zdHJlYW0gZm9ybWF0LCB3aGljaCBpbXByb3ZlcyBzdGFuZGFyZCBjb21wbGlhbmNlIGFuZAorICBpcyBuZWVkZWQgaW4gcGFydGljdWxhciBmb3IgSExTIHBsYXliYWNrIG9uIGlPUy9tYWNPUy4KKworLSBgcnRwYmluYCBoYXMgYWNxdWlyZWQgYnVuZGxlIHN1cHBvcnQgZm9yIGluY29taW5nIHN0cmVhbXMKKworIyMgTWFqb3IgbmV3IGZlYXR1cmVzIGFuZCBjaGFuZ2VzCisKKyMjIyBOb3Rld29ydGh5IG5ldyBBUEkKKworLSBUaGUgdmlkZW8gbGlicmFyeSBnYWluZWQgc3VwcG9ydCBmb3IgYSBudW1iZXIgb2YgbmV3IHZpZGVvIGZvcm1hdHM6CisKKyAgLSBgR0JSXzEyTEVgLCBgR0JSXzEyQkVgLCBgR0JSQV8xMkxFYCwgYEdCUkFfMTJCRWAgKHBsYW5hciA0OjQ6NCBSR0IvUkdCQSwgMTIgYml0cyBwZXIgY2hhbm5lbCkKKyAgLSBgR0JSQV8xMExFYCwgYEdCUkFfMTBCRWAgKHBsYW5hciA0OjQ6NDo0IFJHQkEsIDEwIGJpdHMgcGVyIGNoYW5uZWwpCisgIC0gYEdCUkFgIChwbGFuYXIgNDo0OjQ6NCBBUkdCLCA4IGJpdHMgcGVyIGNoYW5uZWwpCisgIC0gYEk0MjBfMTJCRWAsIGBJNDIwXzEyTEVgIChwbGFuYXIgNDoyOjAgWVVWLCAxMiBiaXRzIHBlciBjaGFubmVsKQorICAtIGBJNDIyXzEyQkVgLGBJNDIyXzEyTEVgIChwbGFuYXIgNDoyOjIgWVVWLCAxMiBiaXRzIHBlciBjaGFubmVsKQorICAtIGBZNDQ0XzEyQkVgLCBgWTQ0NF8xMkxFYCAocGxhbmFyIDQ6NDo0IFlVViwgMTIgYml0cyBwZXIgY2hhbm5lbCkKKyAgLSBgVllVWWAgKGFub3RoZXIgcGFja2VkIDQ6MjoyIFlVViBmb3JtYXQpCisKKy0gVGhlIGhpZ2gtbGV2ZWwgYEdzdFBsYXllcmAgQVBJIHdhcyBleHRlbmRlZCB3aXRoIGZ1bmN0aW9ucyBmb3IgdGFraW5nIHZpZGVvCisgIHNuYXBzaG90cyBhbmQgZW5hYmxpbmcgYWNjdXJhdGUgc2Vla2luZy4gSXQgY2FuIG9wdGlvbmFsbHkgYWxzbyB1c2UgdGhlCisgIHN0aWxsLWV4cGVyaW1lbnRhbCBgcGxheWJpbjNgIGVsZW1lbnQgbm93LgorCisjIyMgTmV3IEVsZW1lbnRzCisKKy0gbXNkazogbmV3IHBsdWdpbiBmb3IgSW50ZWwncyBNZWRpYSBTREsgZm9yIGhhcmR3YXJlLWFjY2VsZXJhdGVkIHZpZGVvIGVuY29kaW5nCisgIGFuZCBkZWNvZGluZyBvbiBJbnRlbCBncmFwaGljcyBoYXJkd2FyZSBvbiBXaW5kb3dzIG9yIExpbnV4LiBUaGlzIGluY2x1ZGVzCisgIGFuIEguMjY0IGVuY29kZXIvZGVjb2RlciAoYG1zZGtoMjY0ZGVjYCwgYG1zZGtoMjY0ZW5jYCksCisgIGFuIEguMjY1IGVuY29kZXIvZGVjb2RlciAoYG1zZGtoMjY1ZGVjYCwgYG1zZGtoMjY1ZW5jYCksCisgIGFuIE1KUEVHIGVuY29kZXIvZW5jb2RlciAoYG1zZGttanBlZ2RlY2AsIGBtc2RrbWpwZWdlbmNgKSwKKyAgYW4gTVBFRy0yIHZpZGVvIGVuY29kZXIgKGBtc2RrbXBlZzJlbmNgKSBhbmQgYSBWUDggZW5jb2RlciAoYG1zZGt2cDhlbmNgKS4KKworLSBgaXFhYCBpcyBhIG5ldyBJbWFnZSBRdWFsaXR5IEFzc2Vzc21lbnQgcGx1Z2luIGJhc2VkIG9uIFtEU1NJTV1bZHNzaW1dLAorICBzaW1pbGFyIHRvIHRoZSBvbGQgKHVucG9ydGVkKSB2aWRlb21lYXN1cmUgZWxlbWVudC4KKworLSBUaGUgYGZhY2VvdmVybGF5YCBlbGVtZW50LCB3aGljaCBhbGxvd3MgeW91IHRvIG92ZXJsYXkgU1ZHIGdyYXBoaWNzIG92ZXIKKyAgYSBkZXRlY3RlZCBmYWNlIGluIGEgdmlkZW8gc3RyZWFtLCBoYXMgYmVlbiBwb3J0ZWQgZnJvbSAwLjEwLgorCistIG91ciBgZmZtcGVnYCB3cmFwcGVyIHBsdWdpbiBub3cgZXhwb3Nlcy9tYXBzIHRoZSBmZm1wZWcgT3B1cyBhdWRpbyBkZWNvZGVyCisgIChgYXZkZWNfb3B1c2ApIGFzIHdlbGwgYXMgdGhlIEdvUHJvIENpbmVGb3JtIEhEIC8gQ0ZIRCBkZWNvZGVyIChgYXZkZWNfY2ZoZGApLAorICBhbmQgYWxzbyBhIHBhcnNlci93cml0ZXIgZm9yIHRoZSBJVkYgZm9ybWF0IChgYXZkZW11eF9pdmZgIGFuZCBgYXZtdXhfaXZmYCkuCisKKy0gYGF1ZGlvYnVmZmVyc3BsaXRgIGlzIGEgbmV3IGVsZW1lbnQgdGhhdCBzcGxpdHMgcmF3IGF1ZGlvIGJ1ZmZlcnMgaW50bworICBlcXVhbC1zaXplZCBidWZmZXJzCisKKy0gYGF1ZGlvbWl4bWF0cml4YCBpcyBhIG5ldyBlbGVtZW50IHRoYXQgbWl4ZXMgTjpNIGF1ZGlvIGNoYW5uZWxzIGFjY29yZGluZyB0bworICBhIGNvbmZpZ3VyZWQgbWl4IG1hdHJpeC4KKworLSBUaGUgYHRpbWVjb2Rld2FpdGAgZWxlbWVudCBnb3QgcmVuYW1lZCB0byBgYXZ3YWl0YCBhbmQgY2FuIG9wZXJhdGUgaW4KKyAgZGlmZmVyZW50IG1vZGVzIG5vdy4KKworLSBUaGUgYG9wZW5jdmAgdmlkZW8gcHJvY2Vzc2luZyBwbHVnaW4gaGFzIGdhaW5lZCBhIG5ldyBgZGV3YXJwYCBlbGVtZW50IHRoYXQKKyAgZGV3YXJwcyBmaXNoZXllIGltYWdlcy4KKworLSBgdHRtbGAgaXMgYSBuZXcgcGx1Z2luIGZvciBwYXJzaW5nIGFuZCByZW5kZXJpbmcgc3VidGl0bGVzIGluIFRpbWVkIFRleHQKKyAgTWFya3VwIExhbmd1YWdlIChUVE1MKSBmb3JtYXQuIEZvciB0aGUgdGltZSBiZWluZyB0aGVzZSBlbGVtZW50cyB3aWxsIG5vdAorICBiZSBhdXRvcGx1Z2dlZCBkdXJpbmcgbWVkaWEgcGxheWJhY2sgaG93ZXZlciwgdW5sZXNzIHRoZSBgR1NUX1RUTUxfQVVUT1BMVUc9MWAKKyAgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LiBPbmx5IHRoZSBFQlUtVFQtRCBwcm9maWxlIGlzIHN1cHBvcnRlZCBhdCB0aGlzCisgIHBvaW50LgorCitbZHNzaW1dOiBodHRwczovL2dpdGh1Yi5jb20vcG9ybmVsL2Rzc2ltCisKKyMjIyBOZXcgZWxlbWVudCBmZWF0dXJlcyBhbmQgYWRkaXRpb25zCisKKy0gYHgyNjRlbmNgIGNhbiBub3cgdXNlIG11bHRpcGxlIHgyNjQgbGlicmFyeSB2ZXJzaW9ucyBjb21waWxlZCBmb3IgZGlmZmVyZW50CisgIGJpdCBkZXB0aHMgYXQgcnVudGltZSwgdG8gdHJhbnNwYXJlbnRseSBwcm92aWRlIHN1cHBvcnQgZm9yIG11bHRpcGxlIGJpdAorICBkZXB0aHMuIEEgbmV3IGNvbmZpZ3VyZSBwYXJhbWV0ZXIgYC0td2l0aC14MjY0LWxpYnJhcmllc2AgaGFzIGJlZW4gYWRkZWQgdG8KKyAgc3BlY2lmeSBhZGRpdGlvbmFsIHBhdGhzIHRvIGxvb2sgZm9yIGFkZGl0aW9uYWwgeDI2NCBsaWJyYXJpZXMgdG8gbG9hZC4KKyAgQmFja2dyb3VuZCBpcyB0aGF0IHRoZSBsaWJ4MjY0IGxpYnJhcnkgaXMgYWx3YXlzIGNvbXBpbGUgZm9yIG9uZSBzcGVjaWZpYworICBiaXQgZGVwdGggYW5kIHRoZSBgeDI2NGVuY2AgZWxlbWVudCB3b3VsZCBzaW1wbHkgc3VwcG9ydCB0aGUgZGVwdGggc3VwcG9ydGVkCisgIGJ5IHRoZSB1bmRlcmx5aW5nIGxpYnJhcnkuIE5vdyB3ZSBjYW4gc3VwcG9ydCBtdWx0aXBsZSBkZXB0aHMuCisKKy0gYHgyNjRlbmNgIGFsc28gcGlja3MgdXAgdGhlIGludGVybGFjaW5nIG1vZGUgYXV0b21hdGljYWxseSBmcm9tIHRoZSBpbnB1dAorICBjYXBzIG5vdyBhbmQgcGFzc2VkIGludGVybGFjaW5nL1RGRiBpbmZvcm1hdGlvbiBjb3JyZWN0bHkgdG8gdGhlIGxpYnJhcnkuCisKKy0gYHZpZGVvc2NhbGVgIGFuZCBgdmlkZW9jb252ZXJ0YCBub3cgc3VwcG9ydCBtdWx0aS10aHJlYWRlZCBzY2FsaW5nIGFuZAorICBjb252ZXJzaW9uLCB3aGljaCBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdpdGggaGlnaGVyIHJlc29sdXRpb24gdmlkZW8uCisgIFRoaXMgaGFzIHRvIGJlIGVuYWJsZWQgZXhwbGljaXRseSB2aWEgdGhlIGAibi10aHJlYWRzImAgcHJvcGVydHkuCisKKy0gYHZpZGVvcmF0ZWAncyBuZXcgYCJyYXRlImAgcHJvcGVydHkgbGV0cyB5b3Ugc2V0IGEgc3BlZWQgZmFjdG9yCisgIG9uIHRoZSBvdXRwdXQgc3RyZWFtCisKKy0gYHNwbGl0bXV4c2lua2AncyBidWZmZXIgY29sbGVjdGlvbiBhbmQgc2NoZWR1bGluZyB3YXMgcmV3cml0dGVuIHRvIG1ha2UKKyAgcHJvY2Vzc2luZyBhbmQgc3BsaXR0aW5nIGRldGVybWluaXN0aWM7IGJlZm9yZSBpdCB3YXMgcG9zc2libGUgZm9yIGEgYnVmZmVyCisgIHRvIGVuZCB1cCBpbiBhIGRpZmZlcmVudCBmaWxlIGNodW5rIGluIGRpZmZlcmVudCBydW5zLiBgc3BsaXRtdXhzaW5rYCBhbHNvCisgIGdhaW5lZCBhIG5ldyBgImZvcm1hdC1sb2NhdGlvbi1mdWxsImAgc2lnbmFsIHRoYXQgd29ya3MganVzdCBsaWtlIHRoZSBleGlzdGluZworICBgImZvcm1hdC1sb2NhdGlvbiJgIHNpZ25hbCBvbmx5IHRoYXQgaXQgaXMgYWxzbyBwYXNzZWQgdGhlIHByaW1hcnkgc3RyZWFtJ3MKKyAgZmlyc3QgYnVmZmVyIGFzIGFyZ3VtZW50LCBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGNvbnN0cnVjdCB0aGUgZmlsZSBuYW1lCisgIGJhc2VkIG9uIG1ldGFkYXRhIHN1Y2ggYXMgdGhlIGJ1ZmZlciB0aW1lc3RhbXAgb3IgYW55IEdzdE1ldGEgYXR0YWNoZWQgdG8KKyAgdGhlIGJ1ZmZlci4gVGhlIG5ldyBgIm1heC1zaXplLXRpbWVjb2RlImAgcHJvcGVydHkgYWxsb3dzIGZvciB0aW1lY29kZS1iYXNlZAorICBzcGxpdHRpbmcuIGBzcGxpdG11eHNpbmtgIHdpbGwgbm93IGFsc28gYXV0b21hdGljYWxseSBzdGFydCBhIG5ldyBmaWxlIGlmIHRoZQorICBpbnB1dCBjYXBzIGNoYW5nZSBpbiBhbiBpbmNvbXBhdGlibGUgd2F5LgorCistIGBmYWtlc2lua2AgaGFzIGEgbmV3IGAiZHJvcC1vdXQtb2Ytc2VnbWVudCJgIHByb3BlcnR5IHRvIG5vdCBkcm9wCisgIG91dC1vZi1zZWdtZW50IGJ1ZmZlcnMsIHdoaWNoIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorCistIGBpZGVudGl0eWAgZ2FpbmVkIGEgYCJ0cy1vZmZzZXQiYCBwcm9wZXJ0eS4KKworLSBib3RoIGBmYWtlc2lua2AgYW5kIGBpZGVudGl0eWAgbm93IGFsc28gcHJpbnQgd2hhdCBraW5kIG9mIG1ldGFzIGFyZSBhdHRhY2hlZAorICB0byBidWZmZXJzIHdoZW4gcHJpbnRpbmcgYnVmZmVyIGRldGFpbHMgdmlhIHRoZSBgImxhc3QtbWVzc2FnZSJgIHByb3BlcnR5CisgIHVzZWQgYnkgYGdzdC1sYXVuY2gtMS4wIC12YC4KKworLSBtdWx0aXF1ZXVlOiBtYWRlIGAibWluLWludGVybGVhdmUtdGltZSJgIGEgY29uZmlndXJhYmxlIHByb3BlcnR5LgorCistIHZpZGVvIG5lcmRzIHdpbGwgYmUgdGhyaWxsZWQgdG8ga25vdyB0aGF0IGB2aWRlb3Rlc3RzcmNgJ3Mgc25vdyBpcyBub3cKKyAgZGV0ZXJtaW5pc3RpYy4gYHZpZGVvdGVzdHNyY2AgYWxzbyBnYWluZWQgc29tZSBuZXcgcHJvcGVydGllcyB0byBtYWtlIHRoZQorICBiYWxsIHBhdHRlcm4gYmFzZWQgb24gc3lzdGVtIHRpbWUsIGFuZCBpbnZlcnQgY29sb3VycyBlYWNoIHNlY29uZAorICAoYCJhbmltYXRpb24tbW9kZSJgLCBgIm1vdGlvbiJgLCBhbmQgYCJmbGlwImAgcHJvcGVydGllcykuCisKKy0gYG9nZ2RlbXV4YCByZXZlcnNlIHBsYXliYWNrIHNob3VsZCB3b3JrIGFnYWluIG5vdy4gWW91J3JlIHdlbGNvbWUuCisKKy0gYHBsYXliaW4zYCBhbmQgYHVyaXNvdXJjZWJpbmAgbm93IGhhdmUgYnVmZmVyaW5nIGVuYWJsZWQgYnkgZGVmYXVsdCwgYW5kCisgIGJ1ZmZlcmluZyBtZXNzYWdlIGFnZ3JlZ2F0aW9uIHdhcyBmaXhlZC4KKworLSBgdGNwY2xpZW50c3JjYCBub3cgaGFzIGEgYCJ0aW1lb3V0ImAgcHJvcGVydHkKKworLSBgYXBwc2lua2AgaGFzIGdhaW5lZCBzdXBwb3J0IGZvciBidWZmZXIgbGlzdHMuIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICByZWFzb25zIHVzZXJzIG5lZWQgdG8gZW5hYmxlIHRoaXMgZXhwbGljaXRseSB3aXRoIGBnc3RfYXBwX3Npbmtfc2V0X2J1ZmZlcl9saXN0X3N1cHBvcnQoKWAsCisgIGhvd2V2ZXIuIE9uY2UgYWN0aXZhdGVkLCBhIHB1bGxlZCBgR3N0U2FtcGxlYCBjYW4gY29udGFpbiBlaXRoZXIgYSBidWZmZXIKKyAgbGlzdCBvciBhIHNpbmdsZSBidWZmZXIuCisKKy0gYHNwbGl0bXV4c3JjYCByZXZlcnNlIHBsYXliYWNrIHdhcyBmaXhlZCBhbmQgaGFuZGxpbmcgb2Ygc3BhcnNlIHN0cmVhbXMsIHN1Y2gKKyAgYXMgc3VidGl0bGUgdHJhY2tzIG9yIG1ldGFkYXRhIHRyYWNrcywgd2FzIGltcHJvdmVkLgorCistIGBtYXRyb3NrYW11eGAgaGFzIGFjcXVpcmVkIHN1cHBvcnQgZm9yIG11eGluZyBHNzIyIGF1ZGlvOyBpdCBhbHNvIG1hcmtzIGFsbAorICBidWZmZXJzIGFzIGtleWZyYW1lcyBub3cgd2hlbiBzdHJlYW1pbmcgb25seSBhdWRpbywgc28gdGhhdCBgdGNwc2VydmVyc2lua2AKKyAgd2lsbCBiZWhhdmUgcHJvcGVybHkgd2l0aCBhdWRpby1vbmx5IHN0cmVhbXMuCisKKy0gYHF0bXV4YCBnYWluZWQgc3VwcG9ydCBmb3IgUHJvUmVzIDQ0NDQgWFEsIEhFVkMvSC4yNjUgYW5kIENpbmVGb3JtIChHb1BybykgZm9ybWF0cywKKyAgYW5kIGdlbmVyYWxseSB3cml0ZXMgbW9yZSB2aWRlbyBzdHJlYW0tcmVsYXRlZCBtZXRhZGF0YSBpbnRvIHRoZSB0cmFjayBoZWFkZXJzLgorICBJdCBpcyBhbHNvIGFsbG93cyBjb25maWd1cmF0aW9uIG9mIHRoZSBtYXhpbXVtIGludGVybGVhdmUgc2l6ZSBpbiBieXRlcyBhbmQKKyAgdGltZSBub3cuIEZvciBmcmFnbWVudGVkIG1wNCB3ZSBhbHdheXMgd3JpdGUgdGhlIGB0ZmR0YCBhdG9tIG5vdyBhcyByZXF1aXJlZAorICBieSB0aGUgREFTSCBzcGVjLgorCistIGBxdGRlbXV4YCBzdXBwb3J0cyBGTEFDLCB4dmlkLCBtcDIsIFMxNkwgYW5kIENpbmVGb3JtIChHb1BybykgdHJhY2tzIG5vdywgYW5kCisgIGdlbmVyYWxseSB0cmllcyBoYXJkZXIgdG8gZXh0cmFjdCBtb3JlIHZpZGVvLXJlbGF0ZWQgaW5mb3JtYXRpb24gZnJvbSB0cmFjaworICBoZWFkZXJzLCBzdWNoIGFzIGNvbG9yaW1ldHJ5IG9yIGludGVybGFjaW5nIGRldGFpbHMuIEl0IGFsc28gcmVjZWl2ZWQgYQorICBjb3VwbGUgb2YgZml4ZXMgZm9yIHRoZSBzY2VuYXJpbyB3aGVyZSB1cHN0cmVhbSBvcGVyYXRlcyBpbiBUSU1FIGZvcm1hdCBhbmQKKyAgZmVlZHMgY2h1bmtzIHRvIHF0ZGVtdXggKGUuZy4gREFTSCBvciBNU0UpLgorCistIGBhdWRpb2VjaG9gIGhhcyB0d28gbmV3IHByb3BlcnRpZXMgdG8gYXBwbHkgYSBkZWxheSBvbmx5IHRvIGNlcnRhaW4gY2hhbm5lbHMKKyAgdG8gY3JlYXRlIGEgc3Vycm91bmQgZWZmZWN0LCByYXRoZXIgdGhhbiBhbiBlY2hvIG9uIGFsbCBjaGFubmVscy4gVGhpcyBpcworICB1c2VmdWwgd2hlbiB1cG1peGluZyBmcm9tIHN0ZXJlbywgZm9yIGV4YW1wbGUuIFRoZSBgInN1cnJvdW5kLWRlbGF5ImAgcHJvcGVydHkKKyAgZW5hYmxlcyB0aGlzLCBhbmQgdGhlIGAic3Vycm91bmQtbWFzayJgIHByb3BlcnR5IGNvbnRyb2xzIHdoaWNoIGNoYW5uZWxzCisgIGFyZSBjb25zaWRlcmVkIHN1cnJvdW5kIHNvdW5kIGNoYW5uZWxzIGluIHRoaXMgY2FzZS4KKworLSBgd2VicnRjZHNwYCBnYWluZWQgdmFyaW91cyBuZXcgcHJvcGVydGllcyBmb3IgZ2FpbiBjb250cm9sIGFuZCBhbHNvIGV4cG9zZXMKKyAgdm9pY2UgYWN0aXZpdHkgZGV0ZWN0aW9uIG5vdywgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIHBvc3QgYCJ2b2ljZS1hY3Rpdml0eSJgCisgIG1lc3NhZ2VzIG9uIHRoZSBidXMgd2hlbmV2ZXIgdGhlIHZvaWNlIGRldGVjdGlvbiBzdGF0dXMgY2hhbmdlcy4KKworLSBUaGUgYGRlY2tsaW5rYCBjYXB0dXJlIGVsZW1lbnRzIGZvciBCbGFja21hZ2ljIERlY2tsaW5rIGNhcmRzIGhhdmUgc2VlbiBhCisgIG51bWJlciBvZiBpbXByb3ZlbWVudHM6CisKKyAgLSBgZGVja2xpbmt2aWRlb3NyY2Agd2lsbCBwb3N0IGEgd2FybmluZyBtZXNzYWdlIG9uICJubyBzaWduYWwiIGFuZCBhbiBpbmZvCisgICAgbWVzc2FnZSB3aGVuIHRoZSBzaWduYWwgbG9jayBoYXMgYmVlbiAocmUpYWNxdWlyZWQuIFRoZXJlIGlzIGFsc28gYSBuZXcKKyAgICByZWFkLW9ubHkgYCJzaWduYWwiYCBwcm9wZXJ0eSB0aGF0IGNhbiBiZSB1c2VkIHRvIHF1ZXJ5IHRoZSBzaWduYWwgbG9jaworICAgIHN0YXR1cy4gVGhlIGBHQVBgIGZsYWcgd2lsbCBiZSBzZXQgb24gYnVmZmVycyB0aGF0IGFyZSBjYXB0dXJlZCB3aXRob3V0CisgICAgYSBzaWduYWwgbG9jay4gVGhlIG5ldyBgZHJvcC1uby1zaWduYWwtZnJhbWVzYCB3aWxsIG1ha2UgYGRlY2tsaW5rdmlkZW9zcmNgCisgICAgZHJvcCBhbGwgYnVmZmVycyB0aGF0IGhhdmUgYmVlbiBjYXB0dXJlZCB3aXRob3V0IGFuIGlucHV0IHNpZ25hbC4gVGhlCisgICAgYCJza2lwLWZpcnN0LXRpbWUiYCBwcm9wZXJ0eSB3aWxsIG1ha2UgdGhlIHNvdXJjZSBkcm9wIHRoZSBmaXJzdCBmZXcKKyAgICBidWZmZXJzLCB3aGljaCBpcyBoYW5keSBzaW5jZSBzb21lIGRldmljZXMgd2lsbCBhdCBmaXJzdCBvdXRwdXQgYnVmZmVycworICAgIHdpdGggdGhlIHdyb25nIHJlc29sdXRpb24gYmVmb3JlIHRoZXkgbWFuYWdlIHRvIGZpZ3VyZSBvdXQgdGhlIHJpZ2h0IGlucHV0CisgICAgZm9ybWF0IGFuZCBkZWNpZGUgb24gdGhlIGFjdHVhbCBvdXRwdXQgY2Fwcy4KKworICAtIGBkZWNrbGlua2F1ZGlvc3JjYCBzdXBwb3J0cyBtb3JlIHRoYW4ganVzdCAyIGF1ZGlvIGNoYW5uZWxzIG5vdy4KKworICAtIFRoZSBjYXB0dXJlIHNvdXJjZXMgbm8gbG9uZ2VyIHVzZSB0aGUgImhhcmR3YXJlIiB0aW1lc3RhbXBzIHdoaWNoIHR1cm4KKyAgICBvdXQgdG8gYmUgdXNlbGVzcyBhbmQgaW5zdGVhZCBqdXN0IHVzZSB0aGUgcGlwZWxpbmUgY2xvY2sgZGlyZWN0bHkuCisKKy0gYHNydHBkZWNgIG5vdyBhbHNvIGhhcyBhIHJlYWRvbmx5IGAic3RhdHMiYCBwcm9wZXJ0eSwganVzdCBsaWtlIGBzcnRwZW5jYC4KKworLSBgcnRwYmluYCBnYWluZWQgUlRQIGJ1bmRsZSBzdXBwb3J0LCBhcyB1c2VkIGJ5IGUuZy4gV2ViUlRDLiBUaGUgZmlyc3QKKyAgIHJ0cHNlc3Npb24gd2lsbCBoYXZlIGEgYHJ0cHNzcmNkZW11eGAgZWxlbWVudCBpbnNpZGUgc3BsaXR0aW5nIHRoZSBzdHJlYW1zCisgICBiYXNlZCBvbiB0aGVpciBTU1JDIGFuZCBwb3RlbnRpYWxseSBkaXNwYXRjaCB0byBhIGRpZmZlcmVudCBydHBzZXNzaW9uLgorICAgQmVjYXVzZSByZXRyYW5zbWlzc2lvbiBTU1JDcyBuZWVkIHRvIGJlIG1lcmdlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG1lZGlhCisgICBzdHJlYW0gdGhlIGA6Om9uLWJ1bmRsZWQtc3NyY2Agc2lnbmFsIGlzIGVtaXR0ZWQgb24gYHJ0cGJpbmAgc28gdGhhdCB0aGUKKyAgIGFwcGxpY2F0aW9uIGNhbiBmaW5kIG91dCB0byB3aGljaCBzZXNzaW9uIHRoZSBTU1JDIGJlbG9uZ3MuCisKKy0gYHJ0cHJ0eHF1ZXVlYCBnYWluZWQgdHdvIG5ldyBwcm9wZXJ0aWVzIGV4cG9zaW5nIHJldHJhbnNtaXNzaW9uCisgIHN0YXRpc3RpY3MgKGAicmVxdWVzdHMiYCBhbmQgYCJmdWxmaWxsZWQtcmVxdWVzdHMiYCkKKworLSBga21zc2lua2Agd2lsbCBub3cgdXNlIHRoZSBwcmVmZXJyZWQgbW9kZSBmb3IgdGhlIG1vbml0b3IgYW5kIHJlbmRlciB0byB0aGUKKyAgYmFzZSBwbGFuZSBpZiBub3RoaW5nIGVsc2UgaGFzIHNldCBhIG1vZGUgeWV0LiBUaGlzIGNhbiBhbHNvIGJlIGRvbmUgZm9yY2libHkKKyAgaW4gYW55IGNhc2UgdmlhIHRoZSBuZXcgYCJmb3JjZS1tb2Rlc2V0dGluZyJgIHByb3BlcnR5LiBGdXJ0aGVybW9yZSwgYGttc3NpbmtgCisgIG5vdyBhbGxvd3Mgb25seSB0aGUgc3VwcG9ydGVkIGNvbm5lY3RvciByZXNvbHV0aW9ucyBhcyBpbnB1dCBjYXBzIGluIG9yZGVyIHRvCisgIGF2b2lkIHNjYWxpbmcgb3IgcG9zaXRpb25pbmcgb2YgdGhlIGlucHV0IHN0cmVhbSwgYXMgYGttc3NpbmtgIGNhbid0IGtub3cKKyAgd2hldGhlciBzY2FsaW5nIG9yIHBvc2l0aW9uaW5nIHdvdWxkIGJlIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSB1c2UgY2FzZSBhdAorICBoYW5kLgorCistIGB3YXlsYW5kc2lua2AgY2FuIG5vdyB0YWtlIERNQWJ1ZiBidWZmZXJzIGFzIGlucHV0IGluIHRoZSBwcmVzZW5jZQorICBvZiBhIGNvbXBhdGlibGUgV2F5bGFuZCBjb21wb3NpdG9yLiBUaGlzIGVuYWJsZXMgemVyby1jb3B5IHRyYW5zZmVyCisgIGZyb20gYSBkZWNvZGVyIG9yIHNvdXJjZSB0aGF0IG91dHB1dHMgRE1BYnVmLgorCistIGB1ZHBzcmNgIGNhbiBiZSBib3VuZCB0byBtb3JlIHRoYW4gb25lIGludGVyZmFjZSB3aGVuIGpvaW5pbmcgYQorICBtdWx0aWNhc3QgZ3JvdXAsIHRoaXMgaXMgZG9uZSBieSBnaXZpbmcgYSBjb21tYSBzZXBhcmF0ZSBsaXN0IG9mCisgIGludGVyZmFjZXMgc3VjaCBhcyBtdWx0aWNhc3QtaWZhY2U9ImV0aDAsZXRoMSIuCisKKyMjIyBQbHVnaW4gbW92ZXMKKworLSBgZGF0YXVyaXNyY2AgbW92ZWQgZnJvbSBnc3QtcGx1Z2lucy1iYWQgdG8gY29yZQorCistIFRoZSBgcmF3cGFyc2VgIHBsdWdpbiBjb250YWluaW5nIHRoZSBgcmF3YXVkaW9wYXJzZWAgYW5kIGByYXd2aWRlb3BhcnNlYAorICBlbGVtZW50cyBtb3ZlZCBmcm9tIGdzdC1wbHVnaW5zLWJhZCB0byBnc3QtcGx1Z2lucy1iYXNlLiBUaGVzZSBlbGVtZW50cworICBzdXBlcnNlZGUgdGhlIG9sZCBgdmlkZW9wYXJzZWAgYW5kIGBhdWRpb3BhcnNlYCBlbGVtZW50cy4gVGhleSB3b3JrIHRoZQorICBzYW1lLCB3aXRoIGp1c3Qgc29tZSBtaW5vciBBUEkgY2hhbmdlcy4gVGhlIG9sZCBsZWdhY3kgZWxlbWVudHMgc3RpbGwKKyAgZXhpc3QgaW4gZ3N0LXBsdWdpbnMtYmFkLCBidXQgbWF5IGJlIHJlbW92ZWQgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLgorCistIGB0aW1lY29kZXN0YW1wZXJgIGlzIGFuIGVsZW1lbnQgdGhhdCBhdHRhY2hlcyB0aW1lIGNvZGVzIHRvIHZpZGVvIGJ1ZmZlcnMKKyAgaW4gZm9ybSBvZiBgR3N0VmlkZW9UaW1lQ29kZU1ldGFgcy4gSXQgaGFkIGEgYCJjbG9jay1zb3VyY2UiYCBwcm9wZXJ0eQorICB3aGljaCBoYXMgbm93IGJlZW4gcmVtb3ZlZCBiZWNhdXNlIGl0IHdhcyBmYWlybHkgdXNlbGVzcyBpbiBwcmFjdGljZS4gSXQKKyAgZ2FpbmVkIHNvbWUgbmV3IHByb3BlcnRpZXMgaG93ZXZlcjogdGhlIGAiZmlyc3QtdGltZWNvZGUiYCBwcm9wZXJ0eSBjYW4KKyAgYmUgdXNlZCB0byBzZXQgdGhlIGluaXRhbCB0aW1lY29kZTsgYWx0ZXJuYXRpdmVseSBgImZpcnN0LXRpbWVjb2RlLXRvLW5vdyJgCisgIGNhbiBiZSBzZXQsIGFuZCB0aGVuIHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lIGF0IHRoZSB0aW1lIHRoZSBmaXJzdCBidWZmZXIKKyAgYXJyaXZlcyBpcyB1c2VkIGFzIGJhc2UgdGltZSBmb3IgdGhlIHRpbWUgY29kZXMuCisKKworIyMjIFBsdWdpbiByZW1vdmFscworCistIFRoZSBgbWFkYCBtcDEvbXAyL21wMyBkZWNvZGVyIHBsdWdpbiB3YXMgcmVtb3ZlZCBmcm9tIGdzdC1wbHVnaW5zLXVnbHksCisgIGFzIGxpYm1hZCBpcyBHUEwgbGljZW5zZWQsIGhhcyBiZWVuIHVubWFpbnRhaW5lZCBmb3IgYSB2ZXJ5IGxvbmcgdGltZSwgYW5kCisgIHRoZXJlIGFyZSBiZXR0ZXIgYWx0ZXJuYXRpdmVzIGF2YWlsYWJsZS4gVXNlIHRoZSBgbXBnMTIzYXVkaW9kZWNgIGVsZW1lbnQKKyAgZnJvbSB0aGUgYG1wZzEyM2AgcGx1Z2luIGluIGdzdC1wbHVnaW5zLXVnbHkgaW5zdGVhZCwgb3IgYGF2ZGVjX21wM2AgZnJvbQorICB0aGUgYGdzdC1saWJhdmAgbW9kdWxlIHdoaWNoIHdyYXBzIHRoZSBmZm1wZWcgbGlicmFyeS4gV2UgZXhwZWN0IHRoYXQgd2UKKyAgd2lsbCBiZSBhYmxlIHRvIG1vdmUgbXAzIGRlY29kaW5nIHRvIGdzdC1wbHVnaW5zLWdvb2QgaW4gdGhlIG5leHQgY3ljbGUKKyAgc2VlaW5nIHRoYXQgbW9zdCBwYXRlbnRzIGFyb3VuZCBtcDMgaGF2ZSBleHBpcmVkIHJlY2VudGx5IG9yIGFyZSBhYm91dCB0bworICBleHBpcmUuCisKKy0gVGhlIGBtaW1pY2AgcGx1Z2luIHdhcyByZW1vdmVkIGZyb20gZ3N0LXBsdWdpbnMtYmFkLiBJdCBjb250YWluZWQgYSBkZWNvZGVyCisgIGFuZCBlbmNvZGVyIGZvciBhIHZpZGVvIGNvZGVjIHVzZWQgYnkgTVNOIG1lc3NlbmdlciBtYW55IG1hbnkgeWVhcnMgYWdvIChpbgorICBhIGdhbGF4eSBmYXIgZmFyIGF3YXkpLiBUaGUgdW5kZXJseWluZyBsaWJyYXJ5IGlzIHVubWFpbnRhaW5lZCBhbmQgbm8gb25lCisgIHJlYWxseSBuZWVkcyB0byB1c2UgdGhpcyBjb2RlYyBhbnkgbW9yZS4gUmVjb3JkZWQgdmlkZW9zIGNhbiBzdGlsbCBiZSBwbGF5ZWQKKyAgYmFjayB3aXRoIHRoZSBNSU1JQyBkZWNvZGVyIGluIGdzdC1saWJhdi4KKworIyMgTWlzY2VsbGFuZW91cyBBUEkgYWRkaXRpb25zCisKKy0gUmVxdWVzdCBwYWQgbmFtZSB0ZW1wbGF0ZXMgcGFzc2VkIHRvIGBnc3RfZWxlbWVudF9yZXF1ZXN0X3BhZCgpYCBtYXkgbm93CisgIGNvbnRhaW4gbXVsdGlwbGUgc3BlY2lmaWVycywgc3VjaCBhcyBlLmcuIGBzcmNfJXVfJXVgLgorCistIFtgZ3N0X2J1ZmZlcl9pdGVyYXRlX21ldGFfZmlsdGVyZWQoKWBdW2J1ZmZlci1pdGVyYXRlLW1ldGEtZmlsdGVyZWRdIGlzIGEKKyAgdmFyaWFudCBvZiBgZ3N0X2J1ZmZlcl9pdGVyYXRlX21ldGEoKWAgdGhhdCBvbmx5IHJldHVybnMgbWV0YXMgb2YgdGhlCisgIHJlcXVlc3RlZCB0eXBlIGFuZCBza2lwcyBhbGwgb3RoZXIgbWV0YXMuCisKKy0gW2Bnc3RfcGFkX3Rhc2tfZ2V0X3N0YXRlKClgXVtwYWQtdGFzay1nZXQtc3RhdGVdIGdldHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YKKyAgYSB0YXNrIGluIGEgdGhyZWFkLXNhZmUgd2F5LgorCistIFtgZ3N0X3VyaV9nZXRfbWVkaWFfZnJhZ21lbnRfdGFibGUoKWBdW3VyaS1nZXQtZnJhZ21lbnQtdGFibGVdIHByb3ZpZGVzIHRoZQorICBtZWRpYSBmcmFnbWVudHMgb2YgYW4gVVJJIGFzIGEgdGFibGUgb2Yga2V5PXZhbHVlIHBhaXJzLgorCistIFtgZ3N0X3ByaW50KClgXVtwcmludF0sIFtgZ3N0X3ByaW50bG4oKWBdW3ByaW50bG5dLCBbYGdzdF9wcmludGVycigpYF1bcHJpbnRlcnJdLAorICBhbmQgW2Bnc3RfcHJpbnRlcnJsbigpYF1bcHJpbnRlcnJsbl0gY2FuIGJlIHVzZWQgdG8gcHJpbnQgdG8gc3Rkb3V0IG9yIHN0ZGVyci4KKyAgVGhlc2UgZnVuY3Rpb25zIGFyZSBzaW1pbGFyIHRvIGBnX3ByaW50KClgIGFuZCBgZ19wcmludGVycigpYCBidXQgdGhleSBhbHNvCisgIHN1cHBvcnQgYWxsIHRoZSBhZGRpdGlvbmFsIGZvcm1hdCBzcGVjaWZpZXJzIHByb3ZpZGVkIGJ5IHRoZSBHU3RyZWFtZXIKKyAgbG9nZ2luZyBzeXN0ZW0sIHN1Y2ggYXMgZS5nLiBgR1NUX1BUUl9GT1JNQVRgLgorCistIGEgYEdzdFBhcmFtU3BlY0FycmF5YCBoYXMgYmVlbiBhZGRlZCwgZm9yIGVsZW1lbnRzIHdobyB3YW50IHRvIGhhdmUgYXJyYXkKKyAgdHlwZSBwcm9wZXJ0aWVzLCBzdWNoIGFzIHRoZSBgYXVkaW9taXhtYXRyaXhgIGVsZW1lbnQgZm9yIGV4YW1wbGUuIFRoZXJlIGFyZQorICBhbHNvIHR3byBuZXcgZnVuY3Rpb25zIHRvIHNldCBhbmQgZ2V0IHByb3BlcnRpZXMgb2YgdGhpcyB0eXBlIGZyb20gYmluZGluZ3M6CisgICAtIGdzdF91dGlsX3NldF9vYmplY3RfYXJyYXkoKQorICAgLSBnc3RfdXRpbF9nZXRfb2JqZWN0X2FycmF5KCkKKworLSB2YXJpb3VzIGhlbHBlciBmdW5jdGlvbnMgaGF2ZSBiZWVuIGFkZGVkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHNldCBvciBnZXQKKyAgR3N0U3RydWN0dXJlIGZpZWxkcyBjb250YWluaW5nIGNhcHMtc3R5bGUgYXJyYXkgb3IgbGlzdCBmaWVsZHMgZnJvbSBsYW5ndWFnZQorICBiaW5kaW5ncyAod2hpY2ggdXN1YWxseSBzdXBwb3J0IEdWYWx1ZUFycmF5IGJ1dCBkb24ndCBrbm93IGFib3V0IHRoZSBHU3RyZWFtZXIKKyAgc3BlY2lmaWMgZnVuZGFtZW50YWwgdHlwZXMpOgorICAgLSBbYGdzdF9zdHJ1Y3R1cmVfZ2V0X2FycmF5KClgXVtnZXQtYXJyYXldCisgICAtIFtgZ3N0X3N0cnVjdHVyZV9zZXRfYXJyYXkoKWBdW3NldC1hcnJheV0KKyAgIC0gW2Bnc3Rfc3RydWN0dXJlX2dldF9saXN0KClgXVtnZXQtbGlzdF0KKyAgIC0gW2Bnc3Rfc3RydWN0dXJlX3NldF9saXN0KClgXVtzZXQtbGlzdF0KKworLSBhIG5ldyBbJ2R5bmFtaWMgdHlwZScgcmVnaXN0cnkgZmFjdG9yeSB0eXBlXVtkeW5hbWljLXR5cGVdIHdhcyBhZGRlZCB0bworICByZWdpc3RlciBkeW5hbWljYWxseSBsb2FkYWJsZSBHVHlwZSB0eXBlcy4gVGhpcyBpcyB1c2VmdWwgZm9yIGF1dG9tYXRpY2FsbHkKKyAgbG9hZGluZyBlbnVtL2ZsYWdzIHR5cGVzIHRoYXQgYXJlIHVzZWQgaW4gY2Fwcywgc3VjaCBhcyBmb3IgZXhhbXBsZSB0aGUKKyAgYEdzdFZpZGVvTXVsdGl2aWV3RmxhZ3NTZXRgIHR5cGUgdXNlZCBpbiBtdWx0aXZpZXcgdmlkZW8gY2Fwcy4KKworLSB0aGVyZSBpcyBhIG5ldyBbYEdzdFByb3h5Q29udHJvbEJpbmRpbmdgXVtwcm94eS1jb250cm9sLWJpbmRpbmddIGZvciB1c2UKKyAgd2l0aCBHc3RDb250cm9sbGVyLiBUaGlzIGFsbG93cyBwcm94eWluZyB0aGUgY29udHJvbCBpbnRlcmZhY2UgZnJvbSBvbmUKKyAgcHJvcGVydHkgb24gb25lIEdzdE9iamVjdCB0byBhbm90aGVyIHByb3BlcnR5IChvZiB0aGUgc2FtZSB0eXBlKSBpbiBhbm90aGVyCisgIEdzdE9iamVjdC4gU28gZS5nLiBpbiBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwLCBvbmUgbWF5IG5lZWQgdG8gY2FsbAorICBgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcygpYCBvbiB0aGUgY2hpbGQgYW5kIGhhdmUgYSBiaW5kaW5nIChzZXQgZWxzZXdoZXJlKQorICBvbiB0aGUgcGFyZW50IHVwZGF0ZSB0aGUgdmFsdWUuIFRoaXMgaXMgdXNlZCBpbiBgZ2x2aWRlb21peGVyYCBhbmQgYGdsc2lua2JpbmAKKyAgZm9yIGV4YW1wbGUsIHdoZXJlIGBzeW5jX3ZhbHVlcygpYCBvbiB0aGUgY2hpbGQgcGFkIG9yIGVsZW1lbnQgd2lsbCBjYWxsCisgIGBzeW5jX3ZhbHVlcygpYCBvbiB0aGUgZXhwb3NlZCBiaW4gcGFkIG9yIGVsZW1lbnQuCisKKyAgTm90ZSB0aGF0IHRoaXMgZG9lc24ndCBzb2x2ZSBHT2JqZWN0IHByb3BlcnR5IGZvcndhcmRpbmcsIHRoYXQgbXVzdAorICBiZSB0YWtlbiBjYXJlIG9mIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBtYW51YWxseSBvciB1c2luZyBHQmluZGluZy4KKworLSBgZ3N0X2Jhc2VfcGFyc2VfZHJhaW4oKWAgaGFzIGJlZW4gbWFkZSBwdWJsaWMgZm9yIHN1YmNsYXNzZXMgdG8gdXNlLgorCistIGBnc3RfYmFzZV9zaW5rX3NldF9kcm9wX291dF9vZl9zZWdtZW50KCknIGNhbiBiZSB1c2VkIGJ5IHN1YmNsYXNzZXMgdG8KKyAgcHJldmVudCBHc3RCYXNlU2luayBmcm9tIGRyb3BwaW5nIGJ1ZmZlcnMgdGhhdCBmYWxsIG91dHNpZGUgb2YgdGhlIHNlZ21lbnQuCisKKy0gW2Bnc3RfY2FsY3VsYXRlX2xpbmVhcl9yZWdyZXNzaW9uKClgXVtjYWxjLWxpbi1yZWdyZXNzaW9uXSBpcyBhIG5ldyB1dGlsaXR5CisgIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBhIGxpbmVhciByZWdyZXNzaW9uLgorCistIFtgZ3N0X2RlYnVnX2dldF9zdGFja190cmFjZWBdW2dldC1zdGFjay10cmFjZV0gaXMgYW4gZWFzeSB3YXkgdG8gcmV0cmlldmUgYQorICBzdGFjayB0cmFjZSwgd2hpY2ggY2FuIGJlIHVzZWZ1bCBpbiB0cmFjZXIgcGx1Z2lucy4KKworLSBhbGxvY2F0b3JzOiB0aGUgZG1hYnVmIGFsbG9jYXRvciBpcyBub3cgc3ViLWNsYXNzYWJsZSwgYW5kIHRoZXJlIGlzIGEgbmV3CisgIGBHU1RfQ0FQU19GRUFUVVJFX01FTU9SWV9ETUFCVUZgIGRlZmluZS4KKworLSB2aWRlbyBkZWNvZGVyIHN1YmNsYXNzZXMgY2FuIHVzZSB0aGUgbmV3bHktYWRkZWQgZnVuY3Rpb24KKyAgYGdzdF92aWRlb19kZWNvZGVyX2FsbG9jYXRlX291dHB1dF9mcmFtZV93aXRoX3BhcmFtcygpYCB0bworICBwYXNzIGEgYEdzdEJ1ZmZlclBvb2xBY3F1aXJlUGFyYW1zYCB0byB0aGUgYnVmZmVyIHBvb2wgZm9yCisgIGVhY2ggYnVmZmVyIGFsbG9jYXRpb24uCisKKy0gdGhlIHZpZGVvIHRpbWUgY29kZSBBUEkgaGFzIGdhaW5lZCBhIGRlZGljYXRlZCBbYEdzdFZpZGVvVGltZUNvZGVJbnRlcnZhbGBdW3RpbWVjb2RlLWludGVydmFsXQorICB0eXBlIHBsdXMgcmVsYXRlZCBBUEksIGluY2x1ZGluZyBmdW5jdGlvbnMgdG8gYWRkIGludGVydmFscyB0byB0aW1lY29kZXMuCisKKy0gVGhlcmUgaXMgYSBuZXcgYGxpYmdzdGJhZGFsbG9jYXRvcnMtMS4wYCBsaWJyYXJ5IGluIGdzdC1wbHVnaW5zLWJhZCwgd2hpY2gKKyAgbWF5IGdvIGF3YXkgYWdhaW4gaW4gZnV0dXJlIHJlbGVhc2VzIG9uY2UgdGhlIGBHc3RQaHlzTWVtb3J5QWxsb2NhdG9yYAorICBpbnRlcmZhY2UgQVBJIGhhcyBiZWVuIHZhbGlkYXRlZCBieSBtb3JlIHVzZXJzIGFuZCB3YXMgbW92ZWQgdG8KKyAgYGxpYmdzdGFsbG9jYXRvcnMtMS4wYCBmcm9tIGdzdC1wbHVnaW5zLWJhc2UuCisKK1t0aW1lY29kZS1pbnRlcnZhbF06IGh0dHBzOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9kYXRhL2RvYy9nc3RyZWFtZXIvaGVhZC9nc3QtcGx1Z2lucy1iYXNlLWxpYnMvaHRtbC9nc3QtcGx1Z2lucy1iYXNlLWxpYnMtZ3N0dmlkZW8uaHRtbCNnc3QtdmlkZW8tdGltZS1jb2RlLWludGVydmFsLW5ldworW2J1ZmZlci1pdGVyYXRlLW1ldGEtZmlsdGVyZWRdOiBodHRwczovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvZGF0YS9kb2MvZ3N0cmVhbWVyL2hlYWQvZ3N0cmVhbWVyL2h0bWwvR3N0QnVmZmVyLmh0bWwjZ3N0LWJ1ZmZlci1pdGVyYXRlLW1ldGEtZmlsdGVyZWQKK1twYWQtdGFzay1nZXQtc3RhdGVdOiBodHRwczovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvZGF0YS9kb2MvZ3N0cmVhbWVyL2hlYWQvZ3N0cmVhbWVyL2h0bWwvR3N0UGFkLmh0bWwjZ3N0LXBhZC10YXNrLWdldC1zdGF0ZQorW3VyaS1nZXQtZnJhZ21lbnQtdGFibGVdOiBodHRwczovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvZGF0YS9kb2MvZ3N0cmVhbWVyL2hlYWQvZ3N0cmVhbWVyL2h0bWwvZ3N0cmVhbWVyLUdzdFVyaS5odG1sI2dzdC11cmktZ2V0LW1lZGlhLWZyYWdtZW50LXRhYmxlCitbcHJpbnRdOiBodHRwczovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvZGF0YS9kb2MvZ3N0cmVhbWVyL2hlYWQvZ3N0cmVhbWVyL2h0bWwvZ3N0cmVhbWVyLUdzdEluZm8uaHRtbCNnc3QtcHJpbnQKK1twcmludGxuXTogaHR0cHM6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2RhdGEvZG9jL2dzdHJlYW1lci9oZWFkL2dzdHJlYW1lci9odG1sL2dzdHJlYW1lci1Hc3RJbmZvLmh0bWwjZ3N0LXByaW50bG4KK1twcmludGVycl06IGh0dHBzOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9kYXRhL2RvYy9nc3RyZWFtZXIvaGVhZC9nc3RyZWFtZXIvaHRtbC9nc3RyZWFtZXItR3N0SW5mby5odG1sI2dzdC1wcmludGVycgorW3ByaW50ZXJybG5dOiBodHRwczovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvZGF0YS9kb2MvZ3N0cmVhbWVyL2hlYWQvZ3N0cmVhbWVyL2h0bWwvZ3N0cmVhbWVyLUdzdEluZm8uaHRtbCNnc3QtcHJpbnRlcnJsbgorW2dldC1hcnJheV06IGh0dHBzOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9kYXRhL2RvYy9nc3RyZWFtZXIvaGVhZC9nc3RyZWFtZXIvaHRtbC9Hc3RTdHJ1Y3R1cmUuaHRtbCNnc3Qtc3RydWN0dXJlLWdldC1hcnJheQorW3NldC1hcnJheV06IGh0dHBzOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9kYXRhL2RvYy9nc3RyZWFtZXIvaGVhZC9nc3RyZWFtZXIvaHRtbC9Hc3RTdHJ1Y3R1cmUuaHRtbCNnc3Qtc3RydWN0dXJlLXNldC1hcnJheQorW2dldC1saXN0XTogaHR0cHM6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2RhdGEvZG9jL2dzdHJlYW1lci9oZWFkL2dzdHJlYW1lci9odG1sL0dzdFN0cnVjdHVyZS5odG1sI2dzdC1zdHJ1Y3R1cmUtZ2V0LWxpc3QKK1tzZXQtbGlzdF06IGh0dHBzOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9kYXRhL2RvYy9nc3RyZWFtZXIvaGVhZC9nc3RyZWFtZXIvaHRtbC9Hc3RTdHJ1Y3R1cmUuaHRtbCNnc3Qtc3RydWN0dXJlLXNldC1saXN0CitbZHluYW1pYy10eXBlXTogaHR0cHM6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2RhdGEvZG9jL2dzdHJlYW1lci9oZWFkL2dzdHJlYW1lci9odG1sL0dzdER5bmFtaWNUeXBlRmFjdG9yeS5odG1sCitbcHJveHktY29udHJvbC1iaW5kaW5nXTogaHR0cHM6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2RhdGEvZG9jL2dzdHJlYW1lci9oZWFkL2dzdHJlYW1lci1saWJzL2h0bWwvZ3N0cmVhbWVyLWxpYnMtR3N0UHJveHlDb250cm9sQmluZGluZy5odG1sCitbY2FsYy1saW4tcmVncmVzc2lvbl06IGh0dHBzOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9kYXRhL2RvYy9nc3RyZWFtZXIvaGVhZC9nc3RyZWFtZXIvaHRtbC9nc3RyZWFtZXItR3N0VXRpbHMuaHRtbCNnc3QtY2FsY3VsYXRlLWxpbmVhci1yZWdyZXNzaW9uCitbZ2V0LXN0YWNrLXRyYWNlXTogaHR0cHM6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2RhdGEvZG9jL2dzdHJlYW1lci9oZWFkL2dzdHJlYW1lci9odG1sL2dzdHJlYW1lci1Hc3RVdGlscy5odG1sI2dzdC1kZWJ1Zy1nZXQtc3RhY2stdHJhY2UKKworIyMjIEdzdFBsYXllcgorCitOZXcgQVBJIGhhcyBiZWVuIGFkZGVkIHRvOgorCisgLSBnZXQgdGhlIG51bWJlciBvZiBhdWRpby92aWRlby9zdWJ0aXRsZSBzdHJlYW1zOgorICAgLSBgZ3N0X3BsYXllcl9tZWRpYV9pbmZvX2dldF9udW1iZXJfb2Zfc3RyZWFtcygpYAorICAgLSBgZ3N0X3BsYXllcl9tZWRpYV9pbmZvX2dldF9udW1iZXJfb2ZfdmlkZW9fc3RyZWFtcygpYAorICAgLSBgZ3N0X3BsYXllcl9tZWRpYV9pbmZvX2dldF9udW1iZXJfb2ZfYXVkaW9fc3RyZWFtcygpYAorICAgLSBgZ3N0X3BsYXllcl9tZWRpYV9pbmZvX2dldF9udW1iZXJfb2Zfc3VidGl0bGVfc3RyZWFtcygpYAorCisgLSBlbmFibGUgYWNjdXJhdGUgc2Vla2luZzogYGdzdF9wbGF5ZXJfY29uZmlnX3NldF9zZWVrX2FjY3VyYXRlKClgCisgICBhbmQgYGdzdF9wbGF5ZXJfY29uZmlnX2dldF9zZWVrX2FjY3VyYXRlKClgCisKKyAtIGdldCBhIHNuYXBzaG90IGltYWdlIG9mIHRoZSB2aWRlbyBpbiBSR0J4LCBCR1J4LCBKUEVHLCBQTkcgb3IKKyAgIG5hdGl2ZSBmb3JtYXQ6IFtgZ3N0X3BsYXllcl9nZXRfdmlkZW9fc25hcHNob3QoKWBdW3NuYXBzaG90XQorCisgLSBzZWxlY3RpbmcgdXNlIG9mIGEgc3BlY2lmaWMgdmlkZW8gc2luayBlbGVtZW50CisgICAoW2Bnc3RfcGxheWVyX3ZpZGVvX292ZXJsYXlfdmlkZW9fcmVuZGVyZXJfbmV3X3dpdGhfc2luaygpYF1bcmVuZGVyZXItd2l0aC12c2lua10pCisKKyAtIElmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBgR1NUX1BMQVlFUl9VU0VfUExBWUJJTjNgIGlzIHNldCwgR3N0UGxheWVyIHdpbGwKKyAgIHVzZSB0aGUgc3RpbGwtZXhwZXJpbWVudGFsIGBwbGF5YmluM2AgZWxlbWVudCBhbmQgdGhlIGBHc3RTdHJlYW1zYCBBUEkgZm9yCisgICBwbGF5YmFjay4KKworW3NuYXBzaG90XTogaHR0cHM6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2RhdGEvZG9jL2dzdHJlYW1lci9oZWFkL2dzdC1wbHVnaW5zLWJhZC1saWJzL2h0bWwvZ3N0LXBsdWdpbnMtYmFkLWxpYnMtZ3N0cGxheWVyLmh0bWwjZ3N0LXBsYXllci1nZXQtdmlkZW8tc25hcHNob3QKK1tyZW5kZXJlci13aXRoLXZzaW5rXTogaHR0cHM6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2RhdGEvZG9jL2dzdHJlYW1lci9oZWFkL2dzdC1wbHVnaW5zLWJhZC1saWJzL2h0bWwvZ3N0LXBsdWdpbnMtYmFkLWxpYnMtZ3N0cGxheWVyLXZpZGVvb3ZlcmxheXZpZGVvcmVuZGVyZXIuaHRtbCNnc3QtcGxheWVyLXZpZGVvLW92ZXJsYXktdmlkZW8tcmVuZGVyZXItbmV3LXdpdGgtc2luaworCisjIyBNaXNjZWxsYW5lb3VzIGNoYW5nZXMKKworLSB2aWRlbyBjYXBzIGZvciBpbnRlcmxhY2VkIHZpZGVvIG1heSBjb250YWluIGFuIG9wdGlvbmFsIGAiZmllbGQtb3JkZXIiYCBmaWVsZAorICBub3cgaW4gdGhlIGNhc2Ugb2YgYGludGVybGFjZWQtbW9kZT1pbnRlcmxlYXZlZGAgdG8gc2lnbmFsIHRoYXQgdGhlIGZpZWxkCisgIG9yZGVyIGlzIGFsd2F5cyB0aGUgc2FtZSB0aHJvdWdob3V0IHRoZSBzdHJlYW0uIFRoaXMgaXMgdXNlZnVsIHRvIHNpZ25hbCB0bworICBtdXhlcnMgc3VjaCBhcyBtcDRtdXguIFRoZSBuZXcgZmllbGQgaXMgcGFyc2VkIGZyb20vdG8gYEdzdFZpZGVvSW5mb2Agb2YgY291cnNlLgorCistIHZpZGVvIGRlY29kZXIgYW5kIHZpZGVvIGVuY29kZXIgYmFzZSBjbGFzc2VzIHRyeSBoYXJkZXIgdG8gcHJveHkKKyAgaW50ZXJsYWNpbmcsIGNvbG9yaW1ldHJ5IGFuZCBjaHJvbWEtc2l0ZSByZWxhdGVkIGZpZWxkcyBpbiBjYXBzIHByb3Blcmx5LgorCistIFRoZSBidWZmZXIgc3RvcmVkIGluIHRoZSBgUFJPVEVDVElPTmAgZXZlbnRzIGlzIG5vdyBsZWZ0IHVuY2hhbmdlZC4gVGhpcyBpcyBhCisgIGNoYW5nZSBvZiBiZWhhdmlvdXIgc2luY2UgMS44LCBlc3BlY2lhbGx5IGZvciB0aGUgbXNzZGVtdXggZWxlbWVudCB3aGljaCB1c2VkIHRvCisgIGRlY29kZSB0aGUgYmFzZTY0IHBhcnNlZCBkYXRhIHdyYXBwZWQgaW4gdGhlIHByb3RlY3Rpb24gZXZlbnRzIGVtaXR0ZWQgYnkgdGhlCisgIGRlbXV4ZXIuCisKKy0gYFBST1RFQ1RJT05gIGV2ZW50cyBjYW4gbm93IGJlIGluamVjdGVkIGludG8gdGhlIHBpcGVsaW5lIGZyb20gdGhlIGFwcGxpY2F0aW9uOworICBzb3VyY2UgZWxlbWVudHMgZGVyaXZpbmcgZnJvbSBHc3RCYXNlU3JjIHdpbGwgZm9yd2FyZCB0aG9zZSBkb3duc3RyZWFtIG5vdy4KKworLSBUaGUgREFTSCBkZW11eGVyIGlzIG5vdyBjb3JyZWN0bHkgcGFyc2luZyB0aGUgTVNQUi0yLjAgQ29udGVudFByb3RlY3Rpb24gbm9kZXMKKyAgYW5kIGVtaXRzIFByb3RlY3Rpb24gZXZlbnRzIGFjY29yZGluZ2x5LiBBcHBsaWNhdGlvbnMgcmVseWluZyBvbiB0aG9zZSBldmVudHMKKyAgbWlnaHQgbmVlZCB0byBkZWNvZGUgdGhlIGJhc2U2NCBkYXRhIHN0b3JlZCBpbiB0aGUgZXZlbnQgYnVmZmVyIGJlZm9yZSB1c2luZyBpdC4KKworLSBUaGUgcmVnaXN0cnkgY2FuIG5vdyBhbHNvIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCisgIGBHU1RfUkVHSVNUUllfRElTQUJMRT15ZXNgLCB3aXRoIHNpbWlsYXIgZWZmZWN0IGFzIHRoZSBgR1NUX0RJU0FCTEVfUkVHSVNUUllgCisgIGNvbXBpbGUgdGltZSBzd2l0Y2guCisKKy0gU2Vla2luZyBwZXJmb3JtYW5jZSB3aXRoIGdzdHJlYW1lci12YWFwaSBiYXNlZCBkZWNvZGVycyB3YXMgaW1wcm92ZWQuIEl0IHdvdWxkCisgIHJlY3JlYXRlIHRoZSBkZWNvZGVyIGFuZCBzdXJmYWNlcyBvbiBldmVyeSBzZWVrIHdoaWNoIGNhbiBiZSBxdWl0ZSBzbG93LgorCistIG1vcmUgcm9idXN0IGhhbmRsaW5nIG9mIGlucHV0IGNhcHMgY2hhbmdlcyBpbiB2aWRlb2FnZ3JlZ2F0b3ItYmFzZWQgZWxlbWVudHMKKyAgc3VjaCBhcyBgY29tcG9zaXRvcmAuCisKKy0gTG90cyBvZiBhZGFwdGl2ZSBzdHJlYW1pbmctcmVsYXRlZCBmaXhlcyBhY3Jvc3MgdGhlIGJvYXJkIChEQVNILCBNU1MsIEhMUykuIEFsc286CisKKyAgLSBgbXNzZGVtdXhgLCB0aGUgTWljcm9zb2Z0IFNtb290aCBTdHJlYW1pbmcgZGVtdXhlciwgaGFzIHNlZW4gdmFyaW91cworICAgIGZpeGVzIGZvciBsaXZlIHN0cmVhbXMsIGR1cmF0aW9uIHJlcG9ydGluZyBhbmQgc2Vla2luZy4KKworICAtIFRoZSBEQVNIIG1hbmlmZXN0IHBhcnNlciBub3cgZXh0cmFjdHMgTVMgUGxheVJlYWR5IENvbnRlbnRQcm90ZWN0aW9uIG9iamVjdHMKKyAgICBmcm9tIG1hbmlmZXN0cyBhbmQgc2VuZHMgdGhlbSBkb3duc3RyZWFtIGFzIGBQUk9URUNUSU9OYCBldmVudHMuIEl0IGFsc28KKyAgICBzdXBwb3J0cyBtdWx0aXBsZSBQZXJpb2QgZWxlbWVudHMgaW4gZXh0ZXJuYWwgeG1sIG5vdy4KKworLSBnc3QtbGliYXYgd2FzIHVwZGF0ZWQgdG8gZmZtcGVnIDMuMyBidXQgc2hvdWxkIHN0aWxsIHdvcmsgd2l0aCBhbnkgMy54CisgIHZlcnNpb24uCisKKy0gR3N0RW5jb2RpbmdQcm9maWxlIGhhcyBiZWVuIGdlbmVyYWxseSBlbmhhbmNlZCBzbyBpdCBjYW4sIGZvcgorICBleGFtcGxlLCBiZSB1c2VkIHRvIGdldCBwb3NzaWJsZSBwcm9maWxlcyBmb3IgYSBnaXZlbiBmaWxlCisgIGV4dGVuc2lvbi4gSXQgaXMgbm93IHBvc3NpYmxlIHRvIGRlZmluZSBwcm9maWxlcyBiYXNlZCBvbiBlbGVtZW50CisgIGZhY3RvcnkgbmFtZXMgb3IgdXNpbmcgYSBwYXRoIHRvIGEgYC5nZXBgIGZpbGUgY29udGFpbmluZyBhCisgIHNlcmlhbGl6ZWQgcHJvZmlsZS4KKworLSBgYXVkaW9jb252ZXJ0YCBjYW4gbm93IGRvIGVuZGlhbm5lc3MgY29udmVyc2lvbiBpbi1wbGFjZS4gQWxsIG90aGVyCisgIGNvbnZlcnNpb25zIHN0aWxsIHJlcXVpcmUgYSBjb3B5LCBidXQgZS5nLiBzaWduIGNvbnZlcnNpb24gYW5kIGEgZmV3IG90aGVycworICBjb3VsZCBhbHNvIGJlIGltcGxlbWVudGVkIGluLXBsYWNlIG5vdy4KKworLSBUaGUgbmV3LCBleHBlcmltZW50YWwgYHBsYXliaW4zYCBhbmQgYHVyaXNvdXJjZWJpbmAgZWxlbWVudHMgZ290IG1hbnkKKyAgYnVnZml4ZXMgYW5kIGltcHJvdmVtZW50cyBhbmQgc2hvdWxkIGdlbmVyYWxseSBiZSBjbG9zZXIgdG8gYSBmdWxsCisgIHJlcGxhY2VtZW50IG9mIHRoZSBvbGQgZWxlbWVudHMuCisKKy0gYGludGVybGVhdmVgIG5vdyBzdXBwb3J0cyA+IDY0IGNoYW5uZWxzLgorCisjIyMgT3BlbkdMIGludGVncmF0aW9uCisKKy0gQXMgdXN1YWwgdGhlIEdTdHJlYW1lciBPcGVuR0wgaW50ZWdyYXRpb24gbGlicmFyeSBoYXMgc2VlbiBudW1lcm91cworICBmaXhlcyBhbmQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIGFsbCBvdmVyIHRoZSBwbGFjZSwgYW5kIGlzIGhvcGVmdWxseQorICByZWFkeSBub3cgdG8gYmVjb21lIEFQSSBzdGFibGUgYW5kIGJlIG1vdmVkIHRvIGdzdC1wbHVnaW5zLWJhc2UgZHVyaW5nIHRoZQorICAxLjE0IHJlbGVhc2UgY3ljbGUuCisKKy0gVGhlIEdTdHJlYW1lciBPcGVuR0wgaW50ZWdyYXRpb24gbGF5ZXIgaGFzIGFsc28gZ2FpbmVkIHN1cHBvcnQgZm9yIHRoZQorICBWaXZhbnRlIEVHTCBGQiB3aW5kb3dpbmcgc3lzdGVtLCB3aGljaCBpbXByb3ZlcyBwZXJmb3JtYW5jZSBvbiBwbGF0Zm9ybXMKKyAgc3VjaCBhcyBGcmVlc2NhbGUgaU1YLjYgZm9yIHRob3NlIHdobyBhcmUgc3R1Y2sgd2l0aCB0aGUgcHJvcHJpZXRhcnkgZHJpdmVyLgorICBUaGUgYHFtbGdsc2lua2AgZWxlbWVudCBhbHNvIHN1cHBvcnRzIHRoaXMgbm93IGlmIFF0IGlzIHVzZWQgd2l0aCBlZ2xmcyBvcgorICB3YXlsYW5kIGJhY2tlbmQsIGFuZCBpdCB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIFtnc3RyZWFtZXItaW14XVtnc3RyZWFtZXItaW14XQorICBvZiBjb3Vyc2UuCisKKy0gdmFyaW91cyBgcW1sZ2xzcmNgIGltcHJvdmVtZW50cworCitbZ3N0cmVhbWVyLWlteF06IGh0dHBzOi8vZ2l0aHViLmNvbS9GcmVlc2NhbGUvZ3N0cmVhbWVyLWlteAorCisjIyBUcmFjaW5nIGZyYW1ld29yayBhbmQgZGVidWdnaW5nIGltcHJvdmVtZW50cworCistIE5ldyB0cmFjaW5nIGhvb2tzIGhhdmUgYmVlbiBhZGRlZCB0byB0cmFjayBHc3RNaW5pT2JqZWN0IGFuZCBHc3RPYmplY3QKKyAgcmVmL3VucmVmIG9wZXJhdGlvbnMuCisKKy0gVGhlIG1lbW9yeSBsZWFrcyB0cmFjZXIgY2FuIG9wdGlvbmFsbHkgdXNlIHRoaXMgdG8gcmV0cmlldmUgc3RhY2sgdHJhY2VzIGlmCisgIGVuYWJsZWQgd2l0aCBlLmcuIGBHU1RfVFJBQ0VSUz1sZWFrcyhmaWx0ZXJzPSJHc3RFdmVudCxHc3RNZXNzYWdlIixzdGFjay10cmFjZXMtZmxhZ3M9ZnVsbClgCisKKy0gVGhlIGBHU1RfREVCVUdfRklMRWAgZW52aXJvbm1lbnQgdmFyaWFibGUsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHdyaXRlIHRoZQorICBkZWJ1ZyBsb2cgb3V0cHV0IHRvIGEgZmlsZSBpbnN0ZWFkIG9mIHByaW50aW5nIGl0IHRvIHN0ZGVyciwgY2FuIG5vdyBjb250YWluCisgIGEgbmFtZSBwYXR0ZXJuLCB3aGljaCBpcyB1c2VmdWwgZm9yIGF1dG9tYXRlZCB0ZXN0aW5nIGFuZCBjb250aW51b3VzCisgIGludGVncmF0aW9uIHN5c3RlbXMuIFRoZSBmb2xsb3dpbmcgZm9ybWF0IHNwZWNpZmllcnMgYXJlIHN1cHBvcnRlZDoKKworICAgLSBgJXBgOiB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIFBJRAorICAgLSBgJXJgOiB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYSByYW5kb20gbnVtYmVyLCB3aGljaCBpcyB1c2VmdWwgZm9yIGluc3RhbmNlCisgICAgIHdoZW4gcnVubmluZyB0d28gcHJvY2Vzc2VzIHdpdGggdGhlIHNhbWUgUElEIGJ1dCBpbiBkaWZmZXJlbnQgY29udGFpbmVycy4KKworIyMgVG9vbHMKKworLSBgZ3N0LWluc3BlY3QtMS4wYCBjYW4gbm93IGxpc3QgZWxlbWVudHMgYnkgdHlwZSB3aXRoIHRoZSBuZXcgYC0tdHlwZXNgCisgICBjb21tYW5kLWxpbmUgb3B0aW9uLCBlLmcuIGBnc3QtaW5zcGVjdC0xLjAgLS10eXBlcz1BdWRpby9FbmNvZGVyYCB3aWxsCisgICBzaG93IGEgbGlzdCBvZiBhdWRpbyBlbmNvZGVycy4KKworLSBgZ3N0LWxhdW5jaC0xLjBgIGFuZCBgZ3N0X3BhcnNlX2xhdW5jaCgpYCBoYXZlIGdhaW5lZCBhIG5ldyBvcGVyYXRvciAoYDpgKQorICAgdGhhdCBhbGxvd3MgbGlua2luZyBhbGwgcGFkcyBiZXR3ZWVuIHR3byBlbGVtZW50cy4gVGhpcyBpcyB1c2VmdWwgaW4gY2FzZXMKKyAgIHdoZXJlIHRoZSBleGFjdCBudW1iZXIgb2YgcGFkcyBvciB0eXBlIG9mIHBhZHMgaXMgbm90IGtub3duIGJlZm9yZWhhbmQsIHN1Y2gKKyAgIGFzIGluIHRoZSBgdXJpZGVjb2RlYmluIDogZW5jb2RlYmluYCBzY2VuYXJpbywgZm9yIGV4YW1wbGUuIEluIHRoaXMgY2FzZSwKKyAgIG11bHRpcGxlIGxpbmtzIHdpbGwgYmUgY3JlYXRlZCBpZiB0aGUgZW5jb2RlYmluIGhhcyBtdWx0aXBsZSBwcm9maWxlcworICAgY29tcGF0aWJsZSB3aXRoIHRoZSBvdXRwdXQgb2YgdXJpZGVjb2RlYmluLgorCistIGBnc3QtZGV2aWNlLW1vbml0b3ItMS4wYCBub3cgc2hvd3MgYSBgZ3N0LWxhdW5jaC0xLjBgIHNuaXBwZXQgZm9yIGVhY2gKKyAgZGV2aWNlIHRoYXQgc2hvd3MgaG93IHRvIG1ha2UgdXNlIG9mIGl0IGluIGEgYGdzdC1sYXVuY2gtMS4wYCBwaXBlbGluZSBzdHJpbmcuCisKKyMjIEdTdHJlYW1lciBSVFNQIHNlcnZlcgorCistIFRoZSBSVFNQIHNlcnZlciBub3cgYWxzbyBzdXBwb3J0cyBEaWdlc3QgYXV0aGVudGljYXRpb24gaW4gYWRkaXRpb24gdG8gQmFzaWMKKyAgYXV0aGVudGljYXRpb24uCisKKy0gVGhlIGBHc3RSVFNQQ2xpZW50YCBjbGFzcyBoYXMgZ2FpbmVkIGEgYHByZS0qLXJlcXVlc3RgIHNpZ25hbCBhbmQgdmlydHVhbAorICBtZXRob2QgZm9yIGVhY2ggY2xpZW50IHJlcXVlc3QgdHlwZSwgZW1pdHRlZCBpbiB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcnRzcAorICByZXF1ZXN0LiBUaGVzZSBzaWduYWxzIG9yIHZpcnR1YWwgbWV0aG9kcyBsZXQgdGhlIGFwcGxpY2F0aW9uIHZhbGlkYXRlIHRoZQorICByZXF1ZXN0cywgY29uZmlndXJlIHRoZSBtZWRpYS9zdHJlYW0gaW4gYSBjZXJ0YWluIHdheSBhbmQgYWxzbyBnZW5lcmF0ZSBlcnJvcgorICBzdGF0dXMgY29kZXMgaW4gY2FzZSBvZiBhbiBlcnJvciBvciBhIGJhZCByZXF1ZXN0LgorCisjIyBHU3RyZWFtZXIgVkFBUEkKKworLSBHc3RWYWFwaURpc3BsYXkgbm93IGluaGVyaXRzIGZyb20gR3N0T2JqZWN0LCB0aHVzIHRoZSBWQSBkaXNwbGF5IGxvZ2dpbmcKKyAgbWVzc2FnZXMgYXJlIGJldHRlciBhbmQgdHJhY2luZyB0aGUgY29udGV4dCBzaGFyaW5nIGlzIG1vcmUgcmVhZGFibGUuCisKKy0gV2hlbiB1cGxvYWRpbmcgcmF3IGltYWdlcyBpbnRvIGEgVkEgc3VyZmFjZXMgbm93IFZBRGVyaXZlSW1hZ2VzIGFyZSB0cmllZAorICBmaXN0LCBpbXByb3ZpbmcgdGhlIHVwbG9hZCBwZXJmb3JtYW5jZSwgaWYgaXQgaXMgcG9zc2libGUuCisKKy0gVGhlIGRlY29kZXJzIGFuZCB0aGUgcG9zdC1wcm9jZXNzb3Igbm93IGNhbiBwdXNoIGRtYWJ1Zi1iYXNlZCBidWZmZXJzIHRvCisgIGRvd25zdHJlYW0gdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLiBGb3IgZXhhbXBsZToKKworICBgR1NUX0dMX1BMQVRGT1JNPWVnbCBnc3QtcGxheS0xLjAgdmlkZW8tc2FtcGxlLm1rdiAtLXZpZGVvc2luaz1nbGltYWdlc2lua2AKKworLSBSZWZhY3RvcmVkIHRoZSB3cmFwcGluZyBvZiBWQSBzdXJmYWNlIGludG8gZ3N0cmVhbWVyIG1lbW9yeSwgYWRkaW5nIGxvY2sKKyAgd2hlbiBtYXBwaW5nIGFuZCB1bm1hcHBpbmcsIGFuZCBtYW55IG90aGVyIGZpeGVzLgorCistIE5vdyBgdmFhcGlkZWNvZGViaW5gIGxvYWRzIGB2YWFwaXBvc3Rwcm9jYCBkeW5hbWljYWxseS4gSXQgaXMgcG9zc2libGUgdG8KKyAgYXZvaWQgaXQgdXNhZ2Ugd2l0aCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYEdTVF9WQUFQSV9ESVNBQkxFX1ZQUD0xYC4KKworLSBSZWdhcmRpbmcgZW5jb2RlcnM6IHRoZXkgaGF2ZSBwcmltYXJ5IHJhbmsgYWdhaW4sIHNpbmNlIHRoZXkgY2FuIGRpc2NvdmVyLAorICBpbiBydW4tdGltZSwgdGhlIGNvbG9yIGZvcm1hdHMgdGhleSBjYW4gdXNlIGZvciB1cHN0cmVhbSByYXcgYnVmZmVycyBhbmQKKyAgY2FwcyByZW5lZ290aWF0aW9uIGlzIG5vdyBwb3NzaWJsZS4gQWxzbyB0aGUgZW5jb2RlcnMgcHVzaCBlbmNvZGluZyBpbmZvCisgIGRvd25zdHJlYW0gdmlhIHRhZ3MuCisKKy0gQWJvdXQgc3BlY2lmaWMgZW5jb2RlcnM6IGFkZGVkIGNvbnN0YW50IGJpdC1yYXRlIGVuY29kaW5nIG1vZGUgZm9yIFZQOCBhbmQKKyAgSDI2NSBlbmNvZGVyIGhhbmRsZXMgUDAxMF8xMExFIGNvbG9yIGZvcm1hdC4KKworLSBSZWdhcmRpbmcgZGVjb2RlcnMsIGZsdXNoIG9wZXJhdGlvbiBoYXMgYmVlbiBpbXByb3ZlZCwgbm93IHRoZSBpbnRlcm5hbCBWQQorICBlbmNvZGVyIGlzIG5vdCByZWNyZWF0ZWQgYXQgZWFjaCBmbHVzaC4gQWxzbyB0aGVyZSBhcmUgc2V2ZXJhbCBpbXByb3ZlbWVudHMKKyAgaW4gdGhlIGhhbmRsaW5nIG9mIEgyNjQgYW5kIEgyNjUgc3RyZWFtcy4KKworLSBWQUFQSSBwbHVnaW5zIHRyeSB0byBjcmVhdGUgdGhlaXIgb24gR3N0R0wgY29udGV4dCAod2hlbiBhdmFpbGFibGUpIGlmIHRoZXkKKyAgY2Fubm90IGZpbmQgaXQgaW4gdGhlIHBpcGVsaW5lLCB0byBmaWd1cmUgb3V0IHdoYXQgdHlwZSBvZiBWQSBEaXNwbGF5IHRoZXkKKyAgc2hvdWxkIGNyZWF0ZS4KKworLSBSZWdhcmRpbmcgYHZhYXBpc2lua2AgZm9yIFgxMSwgaWYgdGhlIGJhY2tlbmQgcmVwb3J0cyB0aGF0IGl0IGlzIHVuYWJsZSB0bworICByZW5kZXIgY29ycmVjdGx5IHRoZSBjdXJyZW50IGNvbG9yIGZvcm1hdCwgYW4gaW50ZXJuYWwgVkEgcG9zdC1wcm9jZXNzb3IsIGlzCisgIGluc3RhbnRpYXRlZCAoaWYgYXZhaWxhYmxlKSBhbmQgY29udmVydHMgdGhlIGNvbG9yIGZvcm1hdC4KKworIyMgR1N0cmVhbWVyIEVkaXRpbmcgU2VydmljZXMgYW5kIE5MRQorCistIEVuaGFuY2VkIGF1dG8gdHJhbnNpdGlvbiBiZWhhdmlvdXIKKworLSBGaXggc29tZSByYWNlcyBpbiBgbmxlY29tcG9zaXRpb25gCisKKy0gQWxsb3cgYnVpbGRpbmcgd2l0aCBtc3ZjCisKKy0gQWRkZWQgYSBVTklYIG1hbnBhZ2UgZm9yIGBnZXMtbGF1bmNoYAorCistIEFQSSBjaGFuZ2VzOgorICAtIEFkZGVkIGdlc19kZWluaXQgKGFsbG93aW5nIHRoZSBsZWFrIHRyYWNlciB0byB3b3JrIHByb3Blcmx5KQorICAtIEFkZGVkIGdlc19sYXllcl9nZXRfY2xpcHNfaW5faW50ZXJ2YWwKKyAgLSBGaW5hbGx5IGhpZGUgaW50ZXJuYWwgc3ltYm9scyB0aGF0IHNob3VsZCBuZXZlciBoYXZlIGJlZW4gZXhwb3NlZAorCisjIyBHU3RyZWFtZXIgdmFsaWRhdGUKKworLSBQb3J0IGBnc3QtdmFsaWRhdGUtbGF1bmNoZXJgIHRvIHB5dGhvbiAzCisKKy0gYGdzdC12YWxpZGF0ZS1sYXVuY2hlcmAgbm93IGNoZWNrcyBpZiBibGFja2xpc3RlZCBidWdzIGhhdmUgYmVlbiBmaXhlZCBvbgorICBidWd6aWxsYSBhbmQgZXJyb3JzIG91dCBpZiBpdCBpcyB0aGUgY2FzZQorCistIEFsbG93IGJ1aWxkaW5nIHdpdGggbXN2YworCistIEFkZCBhYmlsaXR5IGZvciB0aGUgbGF1bmNoZXIgdG8gcnVuIEdTdHJlYW1lciB1bml0IHRlc3RzCisKKy0gQWRkZWQgYSB3YXkgdG8gYWN0aXZhdGUgdGhlIGxlYWtzIHRyYWNlciBvbiBvdXIgdGVzdHMgYW5kIGZpeCBsZWFrcworCistIE1ha2UgdGhlIGh0dHAgc2VydmVyIG11bHRpdGhyZWFkZWQKKworLSBOZXcgdGVzdHN1aXRlIGZvciBydW5uaW5nIHZhcmlvdXMgdGVzdCBzY2VuYXJpb3Mgb24gdGhlIERBU0gtSUYgdGVzdCB2ZWN0b3JzCisKKyMjIEJ1aWxkIGFuZCBEZXBlbmRlbmNpZXMKKworLSBNZXNvbiBidWlsZCBmaWxlcyBhcmUgbm93IGRpc3RlZCBpbiB0YXJiYWxscywgZm9yIGpoYnVpbGQgYW5kIHNvIGRpc3RybworICBwYWNrYWdlcnMgY2FuIHN0YXJ0IHVzaW5nIGl0LiBOb3RlIHRoYXQgdGhlIE1lc29uLWJhc2VkIGJ1aWxkIHN5c3RlbSBpcyBub3QKKyAgMTAwJSBmZWF0dXJlLWVxdWl2YWxlbnQgd2l0aCB0aGUgYXV0b3Rvb2xzLWJhc2VkIG9uZSB5ZXQuCisKKy0gU29tZSBwbHVnaW4gZmlsZW5hbWVzIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIG1hdGNoIHRoZSBwbHVnaW4gbmFtZXM6IGZvciBleGFtcGxlCisgIHRoZSBmaWxlIG5hbWUgb2YgdGhlIGBlbmNvZGluZ2AgcGx1Z2luIGluIGdzdC1wbHVnaW5zLWJhc2UgY29udGFpbmluZyB0aGUKKyAgYGVuY29kZWJpbmAgZWxlbWVudCB3YXMgYGxpYmdzdGVuY29kZWJpbi5zb2AgYW5kIGhhcyBiZWVuIGNoYW5nZWQgdG8KKyAgYGxpYmdzdGVuY29kZWJpbi5zb2AuIFRoaXMgYWZmZWN0cyBvbmx5IGEgaGFuZGZ1bCBvZiBwbHVnaW5zIGFjcm9zcyBtb2R1bGVzLgorCisgICoqRGV2ZWxvcGVycyB3aG8gaW5zdGFsbCBHU3RyZWFtZXIgZnJvbSBzb3VyY2UgYW5kIGp1c3QgZG8gYG1ha2UgaW5zdGFsbGAqKgorICAqKmFmdGVyIHVwZGF0aW5nIHRoZSBzb3VyY2UgY29kZSwgd2l0aG91dCBkb2luZyBgbWFrZSB1bmluc3RhbGxgIGZpcnN0LCB3aWxsKioKKyAgKipoYXZlIHRvIG1hbnVhbGx5IHJlbW92ZSB0aGUgb2xkIGluc3RhbGxlZCBwbHVnaW4gZmlsZXMgZnJvbSB0aGUgaW5zdGFsbGF0aW9uKioKKyAgKipwcmVmaXgsIG9yIHRoZXkgd2lsbCBnZXQgJ0Nhbm5vdCByZWdpc3RlciBleGlzdGluZyB0eXBlJyBjcml0aWNhbCB3YXJuaW5ncy4qKgorCistIE1vc3Qgb2YgdGhlIGRvY2Jvb2stYmFzZWQgZG9jdW1lbnRhdGlvbiAoRkFRLCBBcHBsaWNhdGlvbiBEZXZlbG9wbWVudCBNYW51YWwsCisgIFBsdWdpbiBXcml0ZXIncyBHdWlkZSwgZGVzaWduIGRvY3VtZW50cykgaGFzIGJlZW4gY29udmVydGVkIHRvIG1hcmtkb3duIGFuZAorICBtb3ZlZCBpbnRvIGEgbmV3IGdzdC1kb2NzIG1vZHVsZS4gVGhlIGd0ay1kb2MgbGlicmFyeSBBUEkgcmVmZXJlbmNlcyBhbmQKKyAgdGhlIHBsdWdpbnMgZG9jdW1lbnRhdGlvbiBhcmUgc3RpbGwgYnVpbHQgYXMgcGFydCBvZiB0aGUgc291cmNlIG1vZHVsZXMgdGhvdWdoLgorCistIEdTdHJlYW1lciBjb3JlIG5vdyBvcHRpb25hbGx5IHVzZXMgbGlidW53aW5kIGFuZCBsaWJkdyB0byBnZW5lcmF0ZSBiYWNrdHJhY2VzLgorICBUaGlzIGlzIHVzZWZ1bCBmb3IgdHJhY2VyIHBsdWdpbnMgdXNlZCBkdXJpbmcgZGVidWdnaW5nIGFuZCBkZXZlbG9wbWVudC4KKworLSBUaGVyZSBpcyBhIG5ldyBgbGliZ3N0YmFkYWxsb2NhdG9ycy0xLjBgIGxpYnJhcnkgaW4gZ3N0LXBsdWdpbnMtYmFkICh3aGljaAorICBtYXkgZ28gYXdheSBhZ2FpbiBpbiBmdXR1cmUgcmVsZWFzZXMgb25jZSB0aGUgYEdzdFBoeXNNZW1vcnlBbGxvY2F0b3JgCisgIGludGVyZmFjZSBBUEkgaGFzIGJlZW4gdmFsaWRhdGVkIGJ5IG1vcmUgdXNlcnMpLgorCistIGBnc3Qtb214YCBhbmQgYGdzdHJlYW1lci12YWFwaWAgbW9kdWxlcyBjYW4gbm93IGFsc28gYmUgYnVpbHQgdXNpbmcgdGhlCisgIE1lc29uIGJ1aWxkIHN5c3RlbS4KKworLSBUaGUgYHF0a2l0dmlkZW9zcmNgIGVsZW1lbnQgZm9yIG1hY09TIHdhcyByZW1vdmVkLiBUaGUgQVBJIGlzIGRlcHJlY2F0ZWQKKyAgc2luY2UgMTAuOSBhbmQgaXQgd2Fzbid0IHNoaXBwZWQgaW4gdGhlIGJpbmFyaWVzIHNpbmNlIGEgZmV3IHJlbGVhc2VzLgorCisjIyBQbGF0Zm9ybS1zcGVjaWZpYyBpbXByb3ZlbWVudHMKKworIyMjIEFuZHJvaWQKKworLSBhbmRyb2lkbWVkaWE6IGFkZCBzdXBwb3J0IGZvciBWUDkgdmlkZW8gZGVjb2RpbmcvZW5jb2RpbmcgYW5kIE9wdXMgYXVkaW8KKyAgZGVjb2RpbmcgKHdoZXJlIHN1cHBvcnRlZCkKKworIyMjIE9TL1ggYW5kIGlPUworCistIGBhdmZ2aWRlb3NyY2AsIHdoaWNoIHJlcHJlc2VudHMgYW4gaVBob25lIGNhbWVyYSBvciwgb24gYSBNYWMsIGEgc2NyZWVuY2FwdHVyZQorICBzZXNzaW9uLCBzbyBmYXIgYWxsb3dlZCB5b3UgdG8gc2VsZWN0IGFuIGlucHV0IGRldmljZSBieSBkZXZpY2UgaW5kZXggb25seS4KKyAgTmV3IEFQSSBhZGRzIHRoZSBhYmlsaXR5IHRvIHNlbGVjdCB0aGUgcG9zaXRpb24gKGZyb250IG9yIGJhY2sgZmFjaW5nKSBhbmQKKyAgZGV2aWNlLXR5cGUgKHdpZGUgYW5nbGUsIHRlbGVwaG90bywgZXRjLikuIEZ1cnRoZXJtb3JlLCB5b3UgY2FuIG5vdyBhbHNvCisgIHNwZWNpZnkgdGhlIG9yaWVudGF0aW9uIChwb3J0cmFpdCwgbGFuZHNjYXBlLCBldGMuKSBvZiB0aGUgdmlkZW9zdHJlYW0uCisKKyMjIyBXaW5kb3dzCisKKy0gYGR4OXNjcmVlbmNhcHNyY2AgY2FuIG5vdyBvcHRpb25hbGx5IGFsc28gY2FwdHVyZSB0aGUgY3Vyc29yLgorCisjIyBDb250cmlidXRvcnMKKworQWxlaXggQ29uY2hpbGxvIEZsYXF1ZSwgQWxlamFuZHJvIEcuIENhc3RybywgQWxla3NhbmRyIFNsb2JvZGVuaXVrLCBBbGV4YW5kcnUKK0LEg2x1yJssIEFsZXggQXNobGV5LCBBbmRyZSBNY0N1cmR5LCBBbmRyZXcsIEFudG9uIEVsaWFzc29uLCBBbnRvbmlvIE9zcGl0ZSwKK0FybmF1ZCBWcmFjLCBBcnVuIFJhZ2hhdmFuLCBBdXLDqWxpZW4gWmFuZWxsaSwgQXhlbCBNZW56ZWwsIEJlbmphbWluIE90dGUsCitCcmFua28gU3ViYXNpYywgQnJlbmRhbiBTaGFua3MsIENhcmwgS2Fyc3RlbiwgQ2FybG9zIFJhZmFlbCBHaWFuaSwgQ2hhbmdCb2sKK0NoYWUsIENocmlzIEJhc3MsIENocmlzdGlhbiBTY2hhbGxlciwgY2hyaXN0b3BoZWN2ciwgQ2xhdWRpbyBTYWF2ZWRyYSwKK0NvcmVudGluIE5vw6tsLCBEYWcgR3VsbGJlcmcsIERhbmllbCBHYXJiYW56bywgRGFuaWVsIFNoYWhhZiwgRGF2aWQgRXZhbnMsCitEYXZpZCBTY2hsZWVmLCBEYXZpZCBXYXJtYW4sIERvbWluaXF1ZSBMZXVlbmJlcmdlciwgRG9uZ2lsIFBhcmssIERvdWdsYXMKK0JhZ25hbGwsIEVkZ2FyZCBMaW1hLCBFZHdhcmQgSGVydmV5LCBFbWVyaWMgR3JhbmdlLCBFbnJpY28gSm9ybnMsIEVucmlxdWUKK09jYcOxYSBHb256w6FsZXosIEV2YW4gTmVtZXJzb24sIEZhYmlhbiBPcmNjb24sIEZhYmllbiBEZXNzZW5uZSwgRmFicmljZSBCZWxsZXQsCitGbG9yZW50IFRoacOpcnksIEZsb3JpYW4gWndvY2gsIEZyYW5jaXNjbyBWZWxhenF1ZXosIEZyw6lkw6lyaWMgRGFsbGVhdSwgR2FyaW1hCitHYXVyLCBHYXVyYXYgR3VwdGEsIEdlb3JnZSBLaWFnaWFkYWtpcywgR2VvcmcgTGlwcGl0c2NoLCBHw7ZyYW4gSsO2bnNzb24sIEdyYWhhbQorTGVnZ2V0dCwgR3VpbGxhdW1lIERlc21vdHRlcywgR3Vya2lycGFsIFNpbmdoLCBIYWlodWEgSHUsIEhhbm5vIEJvZWNrLCBIYXZhcmQKK0dyYWZmLCBIZWVreW91bmcgU2VvLCBob29uaGVlLmxlZSwgSHl1bmp1biBLbywgSW1yZSBFw7ZycywgScOxYWtpIEdhcmPDrWEKK0V0eGViYXJyaWEsIEphZ2FkaXNoLCBKYWd5dW0gS29vLCBKYW4gQWxleGFuZGVyIFN0ZWZmZW5zIChoZWZ0aWcpLCBKYW4KK1NjaG1pZHQsIEplYW4tQ2hyaXN0b3BoZSBUcm90aW4sIEpvY2hlbiBIZW5uZWJlcmcsIEpvbmFzIEhvbG1iZXJnLCBKb3JpcworVmFsZXR0ZSwgSm9zZXAgVG9ycmEsIEp1YW4gUGFibG8gVWdhcnRlLCBKdWxpZW4gSXNvcmNlLCBKw7xyZ2VuIFNhY2hzLCBLb29wCitNYXN0LCBLc2VuaWlhIFZhc2lsY2h1aywgTGFycyBXZW5kbGVyLCBsZWlnaDEyM2xpbnV4QGdvb2dsZW1haWwuY29tLCBMdWlzIGRlCitCZXRoZW5jb3VydCwgTHlvbiBXYW5nLCBNYXJjaW4gS29sbnksIE1hcmludXMgU2NocmFhbCwgTWFyayBOYXV3ZWxhZXJ0cywKK01hdGhpZXUgRHVwb25jaGVsbGUsIE1hdHRoZXcgV2F0ZXJzLCBNYXR0IFN0YXBsZXMsIE1pY2hhZWwgRHV0a2EsIE1pY2hhZWwKK09sYnJpY2gsIE1pY2hhZWwgU21pdGgsIE1pY2hhZWwgVHJldHRlciwgTWlndWVsIFBhcsOtcyBEw61heiwgbmFtYW55YWRhdjEyLCBOZWhhCitBcm9yYSwgTmljayBLYWxsZW4sIE5pY29sYSBNdXJpbm8sIE5pY29sYXMgRGVjaGVzbmUsIE5pY29sYXMgRHVmcmVzbmUsIE5pY29sYXMKK0h1ZXQsIE5pcmJoZWVrIENoYXVoYW4sIE9sZSBBbmRyw6kgVmFkbGEgUmF2bsOlcywgT2xpdmllciBDcsOqdGUsIFBhdHJpY2lhCitNdXNjYWx1LCBQZXRlciBLb3JzZ2FhcmQsIFBldGVyIFNlaWRlcmVyLCBQZXRyIEt1bGhhdnksIFBoaWxpcHBlIE5vcm1hbmQsCitQaGlsaXBwZSBSZW5vbiwgUGhpbGlwcCBaYWJlbCwgUmFodWwgQmVkYXJrYXIsIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQsCitSaWNhcmRvIFJpYmFsZGEgRGVsZ2FkbywgUmljbyBUenNjaGljaGhvbHosINCg0YPRgdC70LDQvSDQmNC20LHRg9C70LDRgtC+0LIsIFNhbXVlbCBNYXJveSwKK1NhbnRpYWdvIENhcm90LU5lbWVzaW8sIFNjb3R0IEQgUGhpbGxpcHMsIFNlYW4gRHVCb2lzLCBTZWJhc3RpYW4gRHLDtmdlLCBTZXJnZXkKK0Jvcm92a292LCBTZXVuZ2hhIFlhbmcsIHNoYWtpbiBjaG91LCBTb25nIEJpbmcsIFPDuHJlbiBKdXVsLCBTcmVlcmVuagorQmFsYWNoYW5kcmFuLCBTdGVmYW4gS29zdCwgU3RlZmFuIFNhdWVyLCBTdGVwYW4gU2FsZW5pa292aWNoLCBTdGlhbiBTZWxuZXMsCitTdHVhcnQgV2VhdmVyLCBzdWhhczJnbywgVGhpYWdvIFNhbnRvcywgVGhpYmF1bHQgU2F1bmllciwgVGhvbWFzIEJsdWVtZWwsCitUaG9tYXMgUGV0YXp6b25pLCBUaW0tUGhpbGlwcCBNw7xsbGVyLCBUaW5nLVdlaSBMYW4sIFRvYmlhcyBNdWVsbGVyLCBUb2RvcgorVG9tb3YsIFRvbWFzeiBaYWphYywgVWxmIE9sc3NvbiwgVXJzdWxhIE1hcGxlaHVyc3QsIFbDrWN0b3IgTWFudWVsIErDoXF1ZXogTGVhbCwKK1ZpY3RvciBUb3NvLCBWaW5jZW50IFBlbnF1ZXJjJ2gsIFZpbmVldGggVE0sIFZpbm9kIEtlc3RpLCBWaXRvciBNYXNzYXJ1IEloYSwKK1ZpdmlhIE5pa29sYWlkb3UsIFdlaUNodW5nQ2hhbmcsIFdpbGxpYW0gTWFubGV5LCBXaW0gVGF5bWFucywgV29qY2llY2gKK1ByenlieWwsIFdvbmNodWwgTGVlLCBYYXZpZXIgQ2xhZXNzZW5zLCBZYXN1c2hpIFNIT0pJCisKKy4uLiBhbmQgbWFueSBvdGhlcnMgd2hvIGhhdmUgY29udHJpYnV0ZWQgYnVnIHJlcG9ydHMsIHRyYW5zbGF0aW9ucywgc2VudAorc3VnZ2VzdGlvbnMgb3IgaGVscGVkIHRlc3RpbmcuCisKKyMjIEJ1Z3MgZml4ZWQgaW4gMS4xMgorCitNb3JlIHRoYW4gWzYzNSBidWdzXVtidWdzLWZpeGVkLWluLTEuMTJdIGhhdmUgYmVlbiBmaXhlZCBkdXJpbmcKK3RoZSBkZXZlbG9wbWVudCBvZiAxLjEyLgorCitUaGlzIGxpc3QgZG9lcyBub3QgaW5jbHVkZSBpc3N1ZXMgdGhhdCBoYXZlIGJlZW4gY2hlcnJ5LXBpY2tlZCBpbnRvIHRoZQorc3RhYmxlIDEuMTAgYnJhbmNoIGFuZCBmaXhlZCB0aGVyZSBhcyB3ZWxsLCBhbGwgZml4ZXMgdGhhdCBlbmRlZCB1cCBpbiB0aGUKKzEuMTAgYnJhbmNoIGFyZSBhbHNvIGluY2x1ZGVkIGluIDEuMTIuCisKK1RoaXMgbGlzdCBhbHNvIGRvZXMgbm90IGluY2x1ZGUgaXNzdWVzIHRoYXQgaGF2ZSBiZWVuIGZpeGVkIHdpdGhvdXQgYSBidWcKK3JlcG9ydCBpbiBidWd6aWxsYSwgc28gdGhlIGFjdHVhbCBudW1iZXIgb2YgZml4ZXMgaXMgbXVjaCBoaWdoZXIuCisKK1tidWdzLWZpeGVkLWluLTEuMTJdOiBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9idWdsaXN0LmNnaT9idWdfc3RhdHVzPVJFU09MVkVEJmJ1Z19zdGF0dXM9VkVSSUZJRUQmY2xhc3NpZmljYXRpb249UGxhdGZvcm0mbGltaXQ9MCZsaXN0X2lkPTIxMzI2NSZvcmRlcj1idWdfaWQmcHJvZHVjdD1HU3RyZWFtZXImcXVlcnlfZm9ybWF0PWFkdmFuY2VkJnJlc29sdXRpb249RklYRUQmdGFyZ2V0X21pbGVzdG9uZT0xLjEwLjEmdGFyZ2V0X21pbGVzdG9uZT0xLjEwLjImdGFyZ2V0X21pbGVzdG9uZT0xLjEwLjMmdGFyZ2V0X21pbGVzdG9uZT0xLjEwLjQmdGFyZ2V0X21pbGVzdG9uZT0xLjExLjEmdGFyZ2V0X21pbGVzdG9uZT0xLjExLjImdGFyZ2V0X21pbGVzdG9uZT0xLjExLjMmdGFyZ2V0X21pbGVzdG9uZT0xLjExLjQmdGFyZ2V0X21pbGVzdG9uZT0xLjExLjkwJnRhcmdldF9taWxlc3RvbmU9MS4xMS45MSZ0YXJnZXRfbWlsZXN0b25lPTEuMTIuMAorCisjIyBTdGFibGUgMS4xMiBicmFuY2gKKworQWZ0ZXIgdGhlIDEuMTIuMCByZWxlYXNlIHRoZXJlIHdpbGwgYmUgc2V2ZXJhbCAxLjEyLnggYnVnLWZpeCByZWxlYXNlcyB3aGljaAord2lsbCBjb250YWluIGJ1ZyBmaXhlcyB3aGljaCBoYXZlIGJlZW4gZGVlbWVkIHN1aXRhYmxlIGZvciBhIHN0YWJsZSBicmFuY2gsCitidXQgbm8gbmV3IGZlYXR1cmVzIG9yIGludHJ1c2l2ZSBjaGFuZ2VzIHdpbGwgYmUgYWRkZWQgdG8gYSBidWctZml4IHJlbGVhc2UKK3VzdWFsbHkuIFRoZSAxLjEyLnggYnVnLWZpeCByZWxlYXNlcyB3aWxsIGJlIG1hZGUgZnJvbSB0aGUgZ2l0IDEuMTIgYnJhbmNoLCB3aGljaAoraXMgYSBzdGFibGUgYnJhbmNoLgorCisjIyMgMS4xMi4wCisKKzEuMTIuMCB3YXMgcmVsZWFzZWQgb24gNHRoIE1heSAyMDE3LgorCisjIyBLbm93biBJc3N1ZXMKKworLSBUaGUgYHdlYnJ0Y2RzcGAgZWxlbWVudCBpcyBjdXJyZW50bHkgbm90IHNoaXBwZWQgYXMgcGFydCBvZiB0aGUgV2luZG93cworICBiaW5hcnkgcGFja2FnZXMgZHVlIHRvIGEgW2J1aWxkIHN5c3RlbSBpc3N1ZV1bYnVnLTc3MDI2NF0uCisKK1tidWctNzcwMjY0XTogaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MDI2NAorCisjIyBTY2hlZHVsZSBmb3IgMS4xNAorCitPdXIgbmV4dCBtYWpvciBmZWF0dXJlIHJlbGVhc2Ugd2lsbCBiZSAxLjE0LCBhbmQgMS4xMSB3aWxsIGJlIHRoZSB1bnN0YWJsZQorZGV2ZWxvcG1lbnQgdmVyc2lvbiBsZWFkaW5nIHVwIHRvIHRoZSBzdGFibGUgMS4xMiByZWxlYXNlLiBUaGUgZGV2ZWxvcG1lbnQKK29mIDEuMTMvMS4xNCB3aWxsIGhhcHBlbiBpbiB0aGUgZ2l0IG1hc3RlciBicmFuY2guCisKK1RoZSBwbGFuIGZvciB0aGUgMS4xNCBkZXZlbG9wbWVudCBjeWNsZSBpcyB5ZXQgdG8gYmUgY29uZmlybWVkLCBidXQgaXQgaXMKK2V4cGVjdGVkIHRoYXQgZmVhdHVyZSBmcmVlemUgd2lsbCBiZSBhcm91bmQgU2VwdGVtYmVyIDIwMTcKK2ZvbGxvd2VkIGJ5IHNldmVyYWwgMS4xMyBwcmUtcmVsZWFzZXMgYW5kIHRoZSBuZXcgMS4xNCBzdGFibGUgcmVsZWFzZQoraW4gT2N0b2Jlci4KKworMS4xNCB3aWxsIGJlIGJhY2t3YXJkcy1jb21wYXRpYmxlIHRvIHRoZSBzdGFibGUgMS4xMiwgMS4xMCwgMS44LCAxLjYsIDEuNCwKKzEuMiBhbmQgMS4wIHJlbGVhc2Ugc2VyaWVzLgorCistIC0gLQorCisqVGhlc2UgcmVsZWFzZSBub3RlcyBoYXZlIGJlZW4gcHJlcGFyZWQgYnkgU2ViYXN0aWFuIERyw7ZnZSwgVGltLVBoaWxpcHAgTcO8bGxlcgorYW5kIFbDrWN0b3IgTWFudWVsIErDoXF1ZXogTGVhbC4qCisKKypMaWNlbnNlOiBbQ0MgQlktU0EgNC4wXShodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvKSoKZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjMyODQzCi0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FCkBAIC0wLDAgKzEsMjU1IEBACitHU3RyZWFtZXIgMS4xMy54IGRldmVsb3BtZW50IHNlcmllcworCitXSEFUIElUIElTCistLS0tLS0tLS0tCisKK1RoaXMgaXMgR1N0cmVhbWVyLCBhIGZyYW1ld29yayBmb3Igc3RyZWFtaW5nIG1lZGlhLgorCitXSEVSRSBUTyBTVEFSVAorLS0tLS0tLS0tLS0tLS0KKworV2UgaGF2ZSBhIHdlYnNpdGUgYXQKK2h0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnLworCitZb3Ugc2hvdWxkIHN0YXJ0IGJ5IGdvaW5nIHRocm91Z2ggb3VyIEZBUSBhdAoraHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvZGF0YS9kb2MvZ3N0cmVhbWVyL2hlYWQvZmFxL2h0bWwvCisKK1RoZXJlIGlzIG1vcmUgZG9jdW1lbnRhdGlvbjsgZ28gdG8KK2h0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2RvY3VtZW50YXRpb24KKworWW91IGNhbiBzdWJzY3JpYmUgdG8gb3VyIG1haWxpbmcgbGlzdHM7IHNlZSB0aGUgd2Vic2l0ZSBmb3IgZGV0YWlscy4KKworV2UgdHJhY2sgYnVncyBpbiBHTk9NRSdzIGJ1Z3ppbGxhOyBzZWUgdGhlIHdlYnNpdGUgZm9yIGRldGFpbHMuCisKK1lvdSBjYW4gam9pbiB1cyBvbiBJUkMgLSAjZ3N0cmVhbWVyIG9uIGlyYy5mcmVlbm9kZS5vcmcKKworR1N0cmVhbWVyIDEuMCBzZXJpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1N0YXJyaW5nCisKKyAgR1NUUkVBTUVSCisKK1RoZSBjb3JlIGFyb3VuZCB3aGljaCBhbGwgb3RoZXIgbW9kdWxlcyByZXZvbHZlLiAgQmFzZSBmdW5jdGlvbmFsaXR5IGFuZAorbGlicmFyaWVzLCBzb21lIGVzc2VudGlhbCBlbGVtZW50cywgZG9jdW1lbnRhdGlvbiwgYW5kIHRlc3RpbmcuCisKKyAgQkFTRQorCitBIHdlbGwtZ3Jvb21lZCBhbmQgd2VsbC1tYWludGFpbmVkIGNvbGxlY3Rpb24gb2YgR1N0cmVhbWVyIHBsdWctaW5zIGFuZAorZWxlbWVudHMsIHNwYW5uaW5nIHRoZSByYW5nZSBvZiBwb3NzaWJsZSB0eXBlcyBvZiBlbGVtZW50cyBvbmUgd291bGQgd2FudAordG8gd3JpdGUgZm9yIEdTdHJlYW1lci4gIAorCitBbmQgaW50cm9kdWNpbmcsIGZvciB0aGUgZmlyc3QgdGltZSBldmVyLCBvbiB0aGUgZGV2ZWxvcG1lbnQgc2NyZWVuIC4uLgorCisgIFRIRSBHT09ECisKKyAtLS0gIlN1Y2ggaW5ncmF0aXR1ZGUuICBBZnRlciBhbGwgdGhlIHRpbWVzIEkndmUgc2F2ZWQgeW91ciBsaWZlLiIKKworQSBjb2xsZWN0aW9uIG9mIHBsdWctaW5zIHlvdSdkIHdhbnQgdG8gaGF2ZSByaWdodCBuZXh0IHRvIHlvdSBvbiB0aGUKK2JhdHRsZWZpZWxkLiAgU2hvb3Rpbmcgc2hhcnAgYW5kIG1ha2luZyBubyBtaXN0YWtlcywgdGhlc2UgcGx1Zy1pbnMgaGF2ZSBpdAorYWxsOiBnb29kIGxvb2tzLCBnb29kIGNvZGUsIGFuZCBnb29kIGxpY2Vuc2luZy4gIERvY3VtZW50ZWQgYW5kIGRyZXNzZWQgdXAKK2luIHRlc3RzLiAgSWYgeW91J3JlIGxvb2tpbmcgZm9yIGEgcm9sZSBtb2RlbCB0byBiYXNlIHlvdXIgb3duIHBsdWctaW4gb24sCitoZXJlIGl0IGlzLgorCitJZiB5b3UgZmluZCBhIHBsb3QgaG9sZSBvciBhIGJhZGx5IGxpcC1zeW5jZWQgbGluZSBvZiBjb2RlIGluIHRoZW0sCitsZXQgdXMga25vdyAtIGl0IGlzIGEgbWF0dGVyIG9mIGhvbm91ciBmb3IgdXMgdG8gZW5zdXJlIEJsb25kaWUgZG9lc24ndCBsb29rCitsaWtlIGhlJ3MgYmVlbiB3YWxraW5nIDEwMCBtaWxlcyB0aHJvdWdoIHRoZSBkZXNlcnQgd2l0aG91dCB3YXRlci4KKworICBUSEUgVUdMWQorCisgIC0tLSAiV2hlbiB5b3UgaGF2ZSB0byBzaG9vdCwgc2hvb3QuICBEb24ndCB0YWxrLiIKKworVGhlcmUgYXJlIHRpbWVzIHdoZW4gdGhlIHdvcmxkIG5lZWRzIGEgY29sb3IgYmV0d2VlbiBibGFjayBhbmQgd2hpdGUuCitRdWFsaXR5IGNvZGUgdG8gbWF0Y2ggdGhlIGdvb2QncywgYnV0IHR3by10aW1pbmcsIGJhY2tzdGFiYmluZyBhbmQgcmVhZHkgdG8KK3NlbGwgeW91ciBmcmVlZG9tIGRvd24gdGhlIHJpdmVyLiAgVGhlc2UgcGx1Zy1pbnMgbWlnaHQgaGF2ZSBhIHBhdGVudCBub29zZQorYXJvdW5kIHRoZWlyIG5lY2ssIG9yIGEgbG9jay11cCBsaWNlbnNlLCBvciBhbnkgb3RoZXIgcHJvYmxlbSB0aGF0IG1ha2VzIHlvdQordGhpbmsgdHdpY2UgYWJvdXQgc2hpcHBpbmcgdGhlbS4KKworV2UgZG9uJ3QgY2FsbCB0aGVtIHVnbHkgYmVjYXVzZSB3ZSBsaWtlIHRoZW0gbGVzcy4gIERvZXMgYSBtb3RoZXIgbG92ZSBoZXIKK3NvbiBsZXNzIGJlY2F1c2UgaGUncyBub3QgYXMgcHJldHR5IGFzIHRoZSBvdGhlciBvbmVzID8gTm8gIC0gc2hlIGNvbW1lbmRzCitoaW0gb24gaGlzIGdyZWF0IHBlcnNvbmFsaXR5LiAgVGhlc2UgcGx1Zy1pbnMgYXJlIHRoZSBsaWZlIG9mIHRoZSBwYXJ0eS4KK0FuZCB3ZSdsbCBzdGlsbCBzdGVwIGluIGFuZCBzZXQgdGhlbSBzdHJhaWdodCBpZiB5b3UgcmVwb3J0IGFueSB1bmFjY2VwdGFibGUKK2JlaGF2aW91ciAtIGJlY2F1c2UgdGhlcmUgYXJlIHR3byBraW5kcyBvZiBwZW9wbGUgaW4gdGhlIHdvcmxkLCBteSBmcmllbmQ6Cit0aG9zZSB3aXRoIGEgcm9wZSBhcm91bmQgdGhlaXIgbmVjayBhbmQgdGhlIHBlb3BsZSB3aG8gZG8gdGhlIGN1dHRpbmcuCisKKyAgVEhFIEJBRAorCisgIC0tLSAiVGhhdCBhbiBhY2N1c2F0aW9uPyIKKworTm8gcGVyZmVjdGx5IGdyb29tZWQgbW91c3RhY2hlIG9yIGFueSBhbW91bnQgb2YgZmluZSBjbG90aGluZyBpcyBnb2luZyB0bworY292ZXIgdXAgdGhlIHRydXRoIC0gdGhlc2UgcGx1Zy1pbnMgYXJlIEJhZCB3aXRoIGEgY2FwaXRhbCBCLiAKK1RoZXkgbG9vayBmaW5lIG9uIHRoZSBvdXRzaWRlLCBhbmQgbWlnaHQgZXZlbiBhcHBlYXIgdG8gZ2V0IHRoZSBqb2IgZG9uZSwgYnV0CithdCB0aGUgZW5kIG9mIHRoZSBkYXkgdGhleSdyZSBhIGJsYWNrIHNoZWVwLiBXaXRob3V0IGEgZ29sZGVuLWhhaXJlZCBhbmdlbAordG8gd2F0Y2ggb3ZlciB0aGVtLCB0aGV5J2xsIHByb2JhYmx5IGxhbmQgaW4gYW4gdW5tYXJrZWQgZ3JhdmUgYXQgdGhlIGZpbmFsCitzaG93ZG93bi4KKworRG9uJ3QgYnVnIHVzIGFib3V0IHRoZWlyIHF1YWxpdHkgLSBleGVyY2lzZSB5b3VyIEZyZWUgU29mdHdhcmUgcmlnaHRzLAorcGF0Y2ggdXAgdGhlIG9mZmVuZGVyIGFuZCBzZW5kIHVzIHRoZSBwYXRjaCBvbiB0aGUgZmFzdGVzdCBzdGVlZCB5b3UgY2FuCitzdGVhbCBmcm9tIHRoZSBDb25mZWRlcmF0ZXMuIEJlY2F1c2UgeW91IHNlZSwgaW4gdGhpcyB3b3JsZCwgdGhlcmUncyB0d28KK2tpbmRzIG9mIHBlb3BsZSwgbXkgZnJpZW5kOiB0aG9zZSB3aXRoIGxvYWRlZCBndW5zIGFuZCB0aG9zZSB3aG8gZGlnLgorWW91IGRpZy4KKworVGhlIExvd2Rvd24KKy0tLS0tLS0tLS0tCisKKyAgLS0tICJJJ3ZlIG5ldmVyIHNlZW4gc28gbWFueSBwbHVnLWlucyB3YXN0ZWQgc28gYmFkbHkuIgorCitHU3RyZWFtZXIgUGx1Zy1pbnMgaGFzIGdyb3duIHNvIGJpZyB0aGF0IGl0J3MgaGFyZCB0byBzZXBhcmF0ZSB0aGUgd2hlYXQgZnJvbQordGhlIGNoYWZmLiAgQWxzbywgZGlzdHJpYnV0b3JzIGhhdmUgYnJvdWdodCB1cCBpc3N1ZXMgYWJvdXQgdGhlIGxlZ2FsIHN0YXR1cworb2Ygc29tZSBvZiB0aGUgcGx1Zy1pbnMgd2Ugc2hpcC4gIFRvIHJlbWVkeSB0aGlzLCB3ZSd2ZSBkaXZpZGVkIHRoZSBwcmV2aW91cworc2V0IG9mIGF2YWlsYWJsZSBwbHVnLWlucyBpbnRvIGZvdXIgbW9kdWxlczoKKworLSBnc3QtcGx1Z2lucy1iYXNlOiBhIHNtYWxsIGFuZCBmaXhlZCBzZXQgb2YgcGx1Zy1pbnMsIGNvdmVyaW5nIGEgd2lkZSByYW5nZQorICBvZiBwb3NzaWJsZSB0eXBlcyBvZiBlbGVtZW50czsgdGhlc2UgYXJlIGNvbnRpbnVvdXNseSBrZXB0IHVwLXRvLWRhdGUKKyAgd2l0aCBhbnkgY29yZSBjaGFuZ2VzIGR1cmluZyB0aGUgZGV2ZWxvcG1lbnQgc2VyaWVzLgorCisgIC0gV2UgYmVsaWV2ZSBkaXN0cmlidXRvcnMgY2FuIHNhZmVseSBzaGlwIHRoZXNlIHBsdWctaW5zLgorICAtIFBlb3BsZSB3cml0aW5nIGVsZW1lbnRzIHNob3VsZCBiYXNlIHRoZWlyIGNvZGUgb24gdGhlc2UgZWxlbWVudHMuCisgIC0gVGhlc2UgZWxlbWVudHMgY29tZSB3aXRoIGV4YW1wbGVzLCBkb2N1bWVudGF0aW9uLCBhbmQgcmVncmVzc2lvbiB0ZXN0cy4KKworLSBnc3QtcGx1Z2lucy1nb29kOiBhIHNldCBvZiBwbHVnLWlucyB0aGF0IHdlIGNvbnNpZGVyIHRvIGhhdmUgZ29vZCBxdWFsaXR5CisgIGNvZGUsIGNvcnJlY3QgZnVuY3Rpb25hbGl0eSwgb3VyIHByZWZlcnJlZCBsaWNlbnNlIChMR1BMIGZvciB0aGUgcGx1Zy1pbgorICBjb2RlLCBMR1BMIG9yIExHUEwtY29tcGF0aWJsZSBmb3IgdGhlIHN1cHBvcnRpbmcgbGlicmFyeSkuCisKKyAgLSBXZSBiZWxpZXZlIGRpc3RyaWJ1dG9ycyBjYW4gc2FmZWx5IHNoaXAgdGhlc2UgcGx1Zy1pbnMuCisgIC0gUGVvcGxlIHdyaXRpbmcgZWxlbWVudHMgc2hvdWxkIGJhc2UgdGhlaXIgY29kZSBvbiB0aGVzZSBlbGVtZW50cy4KKyAKKy0gZ3N0LXBsdWdpbnMtdWdseTogYSBzZXQgb2YgcGx1Zy1pbnMgdGhhdCBoYXZlIGdvb2QgcXVhbGl0eSBhbmQgY29ycmVjdAorICBmdW5jdGlvbmFsaXR5LCBidXQgZGlzdHJpYnV0aW5nIHRoZW0gbWlnaHQgcG9zZSBwcm9ibGVtcy4gIFRoZSBsaWNlbnNlCisgIG9uIGVpdGhlciB0aGUgcGx1Zy1pbnMgb3IgdGhlIHN1cHBvcnRpbmcgbGlicmFyaWVzIG1pZ2h0IG5vdCBiZSBob3cgd2UnZAorICBsaWtlLiBUaGUgY29kZSBtaWdodCBiZSB3aWRlbHkga25vd24gdG8gcHJlc2VudCBwYXRlbnQgcHJvYmxlbXMuCisKKyAgLSBEaXN0cmlidXRvcnMgc2hvdWxkIGNoZWNrIGlmIHRoZXkgd2FudC9jYW4gc2hpcCB0aGVzZSBwbHVnLWlucy4KKyAgLSBQZW9wbGUgd3JpdGluZyBlbGVtZW50cyBzaG91bGQgYmFzZSB0aGVpciBjb2RlIG9uIHRoZXNlIGVsZW1lbnRzLgorCistIGdzdC1wbHVnaW5zLWJhZDogYSBzZXQgb2YgcGx1Zy1pbnMgdGhhdCBhcmVuJ3QgdXAgdG8gcGFyIGNvbXBhcmVkIHRvIHRoZQorICByZXN0LiAgVGhleSBtaWdodCBiZSBjbG9zZSB0byBiZWluZyBnb29kIHF1YWxpdHksIGJ1dCB0aGV5J3JlIG1pc3NpbmcKKyAgc29tZXRoaW5nIC0gYmUgaXQgYSBnb29kIGNvZGUgcmV2aWV3LCBzb21lIGRvY3VtZW50YXRpb24sIGEgc2V0IG9mIHRlc3RzLAorICBhIHJlYWwgbGl2ZSBtYWludGFpbmVyLCBvciBzb21lIGFjdHVhbCB3aWRlIHVzZS4KKyAgSWYgdGhlIGJsYW5rcyBhcmUgZmlsbGVkIGluIHRoZXkgbWlnaHQgYmUgdXBncmFkZWQgdG8gYmVjb21lIHBhcnQgb2YKKyAgZWl0aGVyIGdzdC1wbHVnaW5zLWdvb2Qgb3IgZ3N0LXBsdWdpbnMtdWdseSwgZGVwZW5kaW5nIG9uIHRoZSBvdGhlciBmYWN0b3JzLgorCisgIC0gSWYgdGhlIHBsdWctaW5zIGJyZWFrLCB5b3UgY2FuJ3QgY29tcGxhaW4gLSBpbnN0ZWFkLCB5b3UgY2FuIGZpeCB0aGUKKyAgICBwcm9ibGVtIGFuZCBzZW5kIHVzIGEgcGF0Y2gsIG9yIGJyaWJlIHNvbWVvbmUgaW50byBmaXhpbmcgdGhlbSBmb3IgeW91LgorICAtIE5ldyBjb250cmlidXRvcnMgY2FuIHN0YXJ0IGhlcmUgZm9yIHRoaW5ncyB0byB3b3JrIG9uLgorCitQTEFURk9STVMKKy0tLS0tLS0tLQorCistIExpbnV4IGlzIG9mIGNvdXJzZSBmdWxseSBzdXBwb3J0ZWQKKy0gRnJlZUJTRCBpcyByZXBvcnRlZCB0byB3b3JrOyBvdGhlciBCU0RzIHNob3VsZCB3b3JrIHRvbworLSBTb2xhcmlzIGlzIHJlcG9ydGVkIHRvIHdvcms7IGEgc3BlY2lmaWMgc3VuYXVkaW9zaW5rIHBsdWdpbiBoYXMgYmVlbiB3cml0dGVuCistIE1hY09TWCB3b3JrcywgYmluYXJ5IDEueCBwYWNrYWdlcyBjYW4gYmUgYnVpbHQgdXNpbmcgdGhlIGNlcmJlcm8gYnVpbGQgdG9vbAorLSBXaW5kb3dzIHdvcmtzOyBiaW5hcnkgMS54IHBhY2thZ2VzIGNhbiBiZSBidWlsdCB1c2luZyB0aGUgY2VyYmVybyBidWlsZCB0b29sCisgIC0gTVN5cy9NaW5HVyBidWlsZHMKKyAgLSBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBidWlsZHMgYXJlIG5vdCB5ZXQgYXZhaWxhYmxlIG9yIHN1cHBvcnRlZAorLSBBbmRyb2lkIHdvcmtzLCBiaW5hcnkgMS54IHBhY2thZ2VzIGNhbiBiZSBidWlsdCB1c2luZyB0aGUgY2VyYmVybyBidWlsZCB0b29sCistIGlPUyB3b3JrcworCitJTlNUQUxMSU5HIEZST00gUEFDS0FHRVMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3Ugc2hvdWxkIGFsd2F5cyBwcmVmZXIgaW5zdGFsbGluZyBmcm9tIHBhY2thZ2VzIGZpcnN0LiAgR1N0cmVhbWVyIGlzCit3ZWxsLW1haW50YWluZWQgZm9yIGEgbnVtYmVyIG9mIGRpc3RyaWJ1dGlvbnMsIGluY2x1ZGluZyBGZWRvcmEsIERlYmlhbiwKK1VidW50dSwgTWFuZHJha2UsIEdlbnRvbywgLi4uCisKK09ubHkgaW4gY2FzZXMgd2hlcmUgeW91OgorLSB3YW50IHRvIGhhY2sgb24gR1N0cmVhbWVyCistIHdhbnQgdG8gdmVyaWZ5IHRoYXQgYSBidWcgaGFzIGJlZW4gZml4ZWQKKy0gZG8gbm90IGhhdmUgYSBzYW5lIGRpc3RyaWJ1dGlvbgorc2hvdWxkIHlvdSBjaG9vc2UgdG8gYnVpbGQgZnJvbSBzb3VyY2UgdGFyYmFsbHMgb3IgZ2l0LgorCitGaW5kIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZhcmlvdXMgcGFja2FnZXMgYXQKK2h0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2Rvd25sb2FkLworCitDT01QSUxJTkcgRlJPTSBTT1VSQ0UgVEFSQkFMTFMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIGFnYWluLCBtYWtlIHN1cmUgdGhhdCB5b3UgcmVhbGx5IG5lZWQgdG8gaW5zdGFsbCBmcm9tIHNvdXJjZSAhCisgIElmIEdTdHJlYW1lciBpcyBvbmUgb2YgeW91ciBmaXJzdCBwcm9qZWN0cyBldmVyIHRoYXQgeW91IGJ1aWxkIGZyb20gc291cmNlLAorICBjb25zaWRlciB0YWtpbmcgb24gYW4gZWFzaWVyIHByb2plY3QuCisKKy0gY2hlY2sgb3V0cHV0IG9mIC4vY29uZmlndXJlIC0taGVscCB0byBzZWUgaWYgYW55IG9wdGlvbnMgYXBwbHkgdG8geW91CistIHJ1bgorICAuL2NvbmZpZ3VyZQorICBtYWtlCisKKyAgdG8gYnVpbGQgR1N0cmVhbWVyLgorLSBpZiB5b3Ugd2FudCB0byBpbnN0YWxsIGl0IChub3QgcmVxdWlyZWQsIGJ1dCB3aGF0IHlvdSB1c3VhbGx5IHdhbnQgdG8gZG8pLCBydW4KKyAgbWFrZSBpbnN0YWxsCisKKy0gdHJ5IG91dCBhIHNpbXBsZSB0ZXN0OgorICBnc3QtbGF1bmNoIC12IGZha2VzcmMgbnVtX2J1ZmZlcnM9NSAhIGZha2VzaW5rCisgIChJZiB5b3UgZGlkbid0IGluc3RhbGwgR1N0cmVhbWVyLCBwcmVmaXggZ3N0LWxhdW5jaCB3aXRoIHRvb2xzLykKKworICBJZiBpdCBvdXRwdXRzIGEgYnVuY2ggb2YgbWVzc2FnZXMgZnJvbSBmYWtlc3JjIGFuZCBmYWtlc2luaywgZXZlcnl0aGluZyBpcworICBvay4KKworICBJZiBpdCBkaWQgbm90IHdvcmssIGtlZXAgaW4gbWluZCB0aGF0IHlvdSBtaWdodCBuZWVkIHRvIGFkanVzdCB0aGUKKyAgUEFUSCBhbmQvb3IgTERfTElCUkFSWV9QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBtYWtlIHRoZSBzeXN0ZW0KKyAgZmluZCBHU3RyZWFtZXIgaW4gdGhlIHByZWZpeCB3aGVyZSB5b3UgaW5zdGFsbGVkIChieSBkZWZhdWx0IHRoYXQgaXMgL3Vzci9sb2NhbCkuCisKKy0gQWZ0ZXIgdGhpcywgeW91J3JlIHJlYWR5IHRvIGluc3RhbGwgZ3N0LXBsdWdpbnMsIHdoaWNoIHdpbGwgcHJvdmlkZSB0aGUKKyAgZnVuY3Rpb25hbGl0eSB5b3UncmUgcHJvYmFibHkgbG9va2luZyBmb3IgYnkgbm93LCBzbyBnbyBvbiBhbmQgcmVhZAorICB0aGF0IFJFQURNRS4KKworQ09NUElMSU5HIEZST00gR0lUCistLS0tLS0tLS0tLS0tLS0tLS0KKworV2hlbiBidWlsZGluZyBmcm9tIGdpdCBzb3VyY2VzLCB5b3Ugd2lsbCBuZWVkIHRvIHJ1biBhdXRvZ2VuLnNoIHRvIGdlbmVyYXRlCit0aGUgYnVpbGQgc3lzdGVtIGZpbGVzLgorCitZb3Ugd2lsbCBuZWVkIGEgc2V0IG9mIGFkZGl0aW9uYWwgdG9vbHMgdHlwaWNhbCBmb3IgYnVpbGRpbmcgZnJvbSBnaXQsCitpbmNsdWRpbmc6CistIGF1dG9jb25mCistIGF1dG9tYWtlCistIGxpYnRvb2wKKworYXV0b2dlbi5zaCB3aWxsIGNoZWNrIGZvciByZWNlbnQgZW5vdWdoIHZlcnNpb25zIGFuZCBjb21wbGFpbiBpZiB5b3UgZG9uJ3QgaGF2ZQordGhlbS4gIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IHNwZWNpZmljIHZlcnNpb25zIG9mIGF1dG9tYWtlIGFuZCBhdXRvY29uZiB3aXRoCistLXdpdGgtYXV0b21ha2UgYW5kIC0td2l0aC1hdXRvY29uZgorCitDaGVjayBhdXRvZ2VuLnNoIG9wdGlvbnMgYnkgcnVubmluZyBhdXRvZ2VuLnNoIC0taGVscAorCithdXRvZ2VuLnNoIGNhbiBwYXNzIG9uIGFyZ3VtZW50cyB0byBjb25maWd1cmUKKworV2hlbiB5b3UgaGF2ZSBkb25lIHRoaXMgb25jZSwgeW91IGNhbiB1c2UgYXV0b3JlZ2VuLnNoIHRvIHJlLWF1dG9nZW4gd2l0aAordGhlIGxhc3QgcGFzc2VkIG9wdGlvbnMgYXMgYSBoYW5keSBzaG9ydGN1dC4gIFVzZSBpdC4KKworQWZ0ZXIgdGhlIGF1dG9nZW4uc2ggc3RhZ2UsIHlvdSBjYW4gZm9sbG93IHRoZSBkaXJlY3Rpb25zIGxpc3RlZCBpbgorIkNPTVBJTElORyBGUk9NIFNPVVJDRSIKKworWW91IGNhbiBhbHNvIHJ1biB5b3VyIHdob2xlIGdpdCBzdGFjayB1bmluc3RhbGxlZCBpbiB5b3VyIGhvbWUgZGlyZWN0b3J5LAorc28gdGhhdCB5b3UgY2FuIHF1aWNrbHkgdGVzdCBjaGFuZ2VzIHdpdGhvdXQgYWZmZWN0aW5nIHlvdXIgc3lzdGVtIHNldHVwIG9yCitpbnRlcmZlcmluZyB3aXRoIEdTdHJlYW1lciBpbnN0YWxsZWQgZnJvbSBwYWNrYWdlcy4gIE1hbnkgR1N0cmVhbWVyIGRldmVsb3BlcnMKK3VzZSBhbiB1bmluc3RhbGxlZCBzZXR1cCBmb3IgdGhlaXIgd29yay4KKworVGhlcmUgaXMgYSAnY3JlYXRlLXVuaW5zdGFsbGVkLXNldHVwLnNoJyBzY3JpcHQgaW4KKworICBodHRwOi8vY2dpdC5mcmVlZGVza3RvcC5vcmcvZ3N0cmVhbWVyL2dzdHJlYW1lci90cmVlL3NjcmlwdHMvCisKK3RvIGVhc2lseSBjcmVhdGUgYW4gdW5pbnN0YWxsZWQgc2V0dXAgZnJvbSBzY3JhdGNoLgorCisKK1BMVUctSU4gREVQRU5ERU5DSUVTIEFORCBMSUNFTlNFUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0dTdHJlYW1lciBpcyBkZXZlbG9wZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBMR1BMIChzZWUgTElDRU5TRSBmaWxlIGZvcgorZGV0YWlscykuIFNvbWUgb2Ygb3VyIHBsdWctaW5zIGhvd2V2ZXIgcmVseSBvbiBsaWJyYXJpZXMgd2hpY2ggYXJlIGF2YWlsYWJsZQordW5kZXIgb3RoZXIgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3UgYXJlIGRpc3RyaWJ1dGluZyBhbiBhcHBsaWNhdGlvbgord2hpY2ggaGFzIGEgbm9uLUdQTCBjb21wYXRpYmxlIGxpY2Vuc2UgKGZvciBpbnN0YW5jZSBhIGNsb3NlZC1zb3VyY2UKK2FwcGxpY2F0aW9uKSB3aXRoIEdTdHJlYW1lciwgeW91IGhhdmUgdG8gbWFrZSBzdXJlIG5vdCB0byBkaXN0cmlidXRlIEdQTC1saW5rZWQKK3BsdWctaW5zLgorCitXaGVuIHVzaW5nIEdQTC1saW5rZWQgcGx1Zy1pbnMsIEdTdHJlYW1lciBpcyBmb3IgYWxsIHByYWN0aWNhbCByZWFzb25zCit1bmRlciB0aGUgR1BMIGl0c2VsZi4KKworSElTVE9SWQorLS0tLS0tLQorCitUaGUgZnVuZGFtZW50YWwgZGVzaWduIGNvbWVzIGZyb20gdGhlIHZpZGVvIHBpcGVsaW5lIGF0IE9yZWdvbiBHcmFkdWF0ZQorSW5zdGl0dXRlLCBhcyB3ZWxsIGFzIHNvbWUgaWRlYXMgZnJvbSBEaXJlY3RNZWRpYS4gIEl0J3MgYmFzZWQgb24gcGx1Zy1pbnMgdGhhdAord2lsbCBwcm92aWRlIHRoZSB2YXJpb3VzIGNvZGVjIGFuZCBvdGhlciBmdW5jdGlvbmFsaXR5LiAgVGhlIGludGVyZmFjZQoraG9wZWZ1bGx5IGlzIGdlbmVyaWMgZW5vdWdoIGZvciB2YXJpb3VzIGNvbXBhbmllcyAoYWhlbSwgQXBwbGUpIHRvIHJlbGVhc2UKK2JpbmFyeSBjb2RlY3MgZm9yIExpbnV4LCB1bnRpbCBzdWNoIHRpbWUgYXMgdGhleSBnZXQgYSBjbHVlIGFuZCByZWxlYXNlIHRoZQorc291cmNlLgpkaWZmIC0tZ2l0IGEvUkVBRE1FLnN0YXRpYy1saW5raW5nIGIvUkVBRE1FLnN0YXRpYy1saW5raW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkODI5OWIKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUuc3RhdGljLWxpbmtpbmcKQEAgLTAsMCArMSwxNzQgQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIEdTdHJlYW1lciBTdGF0aWMgTGlua2luZyBSRUFETUUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitEUkFGVCwgQXByaWwgMjAxMworCisKKyAgIEkuIElOVFJPRFVDVElPTgorCitJdCBpcyBwb3NzaWJsZSB0byBsaW5rIEdTdHJlYW1lciBsaWJyYXJpZXMsIHBsdWdpbnMgYW5kIGFwcGxpY2F0aW9ucworc3RhdGljYWxseSwgYm90aCBpbiBjYXNlIG9mIGZyZWUvbGlicmUvb3Blbi1zb3VyY2Ugc29mdHdhcmUgYXBwbGljYXRpb25zCithbmQgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zLiBPbiBzb21lIHBsYXRmb3JtcyBzdGF0aWMgbGlua2luZyBtYXkgZXZlbgorYmUgcmVxdWlyZWQuCisKK0hvd2V2ZXIsIGRpc3RyaWJ1dGluZyBzdGF0aWNhbGx5IGxpbmtlZCBiaW5hcmllcyB1c2luZyBHU3RyZWFtZXIgdXN1YWxseQorcmVxdWlyZXMgYWRkaXRpb25hbCBlZmZvcnQgdG8gc3RheSBjb21wbGlhbnQgd2l0aCB0aGUgR05VIExHUEwgdjIuMSBsaWNlbnNlLgorCitUaGUgcHVycG9zZSBvZiB0aGlzIGRvY3VtZW50IGlzIHRvIGRyYXcgYXR0ZW50aW9uIHRvIHRoaXMgZmFjdCwgYW5kIHRvCitzdW1tYXJpc2UgaW4gbGF5bWFuJ3MgdGVybXMgd2hhdCB3ZSBiZWxpZXZlIGlzIHJlcXVpcmVkIGZyb20gYW55b25lCitkaXN0cmlidXRpbmcgc3RhdGljYWxseSBsaW5rZWQgR1N0cmVhbWVyIGJpbmFyaWVzLiBNb3N0IG9mIHRoaXMgYWxzbworYXBwbGllcyB0byBkeW5hbWljYWxseSBsaW5rZWQgR1N0cmVhbWVyIGJpbmFyaWVzLgorCisKKyAgIElJLiBESVNDTEFJTUVSCisKK1RoaXMgZG9jdW1lbnQgaXMgbm90IGxlZ2FsIGFkdmljZSwgbm9yIGlzIGl0IGNvbXByZWhlbnNpdmUuIEl0IG1heSB1c2UKK3dvcmRzIGluIHdheXMgdGhhdCBkbyBub3QgbWF0Y2ggdGhlIGRlZmluaXRpb24gb3IgdXNlIGluIHRoZSBsaWNlbnNlCit0ZXh0LiBJdCBtYXkgZXZlbiBiZSBvdXRyaWdodCB3cm9uZy4gUmVhZCB0aGUgbGljZW5zZSB0ZXh0IGZvciBhbGwgdGhlCitkZXRhaWxzLCBpdCBpcyB0aGUgb25seSBsZWdhbGx5IGJpbmRpbmcgZG9jdW1lbnQgaW4gdGhpcyByZXNwZWN0LgorCitUaGlzIGRvY3VtZW50IGlzIHByaW1hcmlseSBjb25jZXJuZWQgd2l0aCB0aGUgaW1wbGljYXRpb25zIGZvciB0aGUKK2Rpc3RyaWJ1dGlvbiBvZiBiaW5hcmllcyBiYXNlZCBvbiBMR1BMLWxpY2Vuc2VkIHNvZnR3YXJlIGFzIGltcG9zZWQgYnkKK3RoZSBMR1BMIGxpY2Vuc2UsIGJ1dCB0aGVyZSBtYXkgYmUgb3RoZXIgcmVzdHJpY3Rpb25zIHRvIHRoZSBkaXN0cmlidXRpb24KK29mIHN1Y2ggYmluYXJpZXMsIHN1Y2ggYXMgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGNoYW5uZWxzCisoZS5nLiAiYXBwIHN0b3JlcyIpLgorCisKKyAgIElJSS4gVEhFIFNQSVJJVCBPRiBUSEUgTEdQTCBMSUNFTlNFCisKK1RoZSBHTlUgTEdQTCB2Mi4xIGxpY2Vuc2UgYWxsb3dzIHVzZSBvZiBzdWNoLWxpY2Vuc2VkIHNvZnR3YXJlIGJ5Citwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMsIGJ1dCBzdGlsbCBhaW1zIHRvIGVuc3VyZSB0aGF0IGF0IGxlYXN0IHRoZQorTEdQTC1saWNlbnNlZCBzb2Z0d2FyZSBwYXJ0cyByZW1haW4gZnJlZSB1bmRlciBhbGwgY2lyY3Vtc3RhbmNlcy4gVGhpcworbWVhbnMgYW55IGNoYW5nZXMgdG8gTEdQTC1saWNlbnNlZCBzb3VyY2UgY29kZSBtdXN0IGJlIGRvY3VtZW50ZWQgYW5kCitiZSBtYWRlIGF2YWlsYWJsZSBvbiByZXF1ZXN0IHRvIHRob3NlIHdobyByZWNlaXZlZCBiaW5hcmllcyBvZiB0aGUKK3NvZnR3YXJlLiBJdCBhbHNvIG1lYW5zIHRoYXQgaXQgbXVzdCBiZSBwb3NzaWJsZSB0byBtYWtlIGNoYW5nZXMgdG8gdGhlCitMR1BMLWxpY2Vuc2VkIHNvZnR3YXJlIHBhcnRzIGFuZCBtYWtlIHRoZSBhcHBsaWNhdGlvbiB1c2UgdGhvc2UsIGFzIGZhcgorYXMgdGhhdCBpcyBwb3NzaWJsZS4gQW5kIHRoYXQgcmVjaXBpZW50cyBvZiBhbiBhcHBsaWNhdGlvbiB1c2luZworTEdQTC1saWNlbnNlZCBzb2Z0d2FyZSBhcmUgbWFkZSBhd2FyZSBvZiB0aGVpciByaWdodHMgYWNjb3JkaW5nIHRvIHRoZQorTEdQTCBsaWNlbnNlLgorCitJbiBhbiBlbnZpcm9ubWVudCB3aGVyZSBHU3RyZWFtZXIgbGlicmFyaWVzIGFuZCBwbHVnaW5zIGFyZSB1c2VkIGFzCitkeW5hbWljYWxseS1sb2FkZWQgc2hhcmVkIG9iamVjdHMgKERMTC8uc28vLmR5biBmaWxlcyksIHRoaXMgaXMgdXN1YWxseQorbm90IGEgYmlnIHByb2JsZW0sIGJlY2F1c2UgaXQgaXMgZmFpcmx5IGVhc3kgdG8gY29tcGlsZSBhIG1vZGlmaWVkIHZlcnNpb24KK29mIHRoZSBHU3RyZWFtZXIgbGlicmFyaWVzIG9yIExHUEwgcGx1Z2lucywgYW5kIHRoZSBhcHBsaWNhdGlvbiB3aWxsL3Nob3VsZAoranVzdCBwaWNrIHVwIGFuZCB1c2UgdGhlIG1vZGlmaWVkIHZlcnNpb24gYXV0b21hdGljYWxseS4gQWxsIHRoYXQgaXMgbmVlZGVkCitpcyBmb3IgdGhlIG9yaWdpbmFsLCBMR1BMLWxpY2Vuc2VkIHNvdXJjZSBjb2RlIGFuZCBzb3VyY2UgY29kZSBtb2RpZmljYXRpb25zCit0byBiZSBtYWRlIGF2YWlsYWJsZSwgYW5kIGZvciBhIHdheSB0byBidWlsZCB0aGUgbGlicmFyaWVzIG9yIHBsdWdpbnMgZm9yCit0aGUgcGxhdGZvcm0gcmVxdWlyZWQgKHVzdWFsbHkgdGhhdCB3aWxsIGJlIHVzaW5nIHRoZSBidWlsZCBzeXN0ZW0gc2NyaXB0cwordGhhdCBjb21lIHdpdGggR1N0cmVhbWVyLCBhbmQgdXNpbmcgdGhlIHR5cGljYWwgYnVpbGQgZW52aXJvbm1lbnQgb24gdGhlCitzeXN0ZW0gaW4gcXVlc3Rpb24sIGJ1dCB3aGVyZSB0aGF0IGlzIG5vdCB0aGUgY2FzZSB0aGUgbmVlZGVkIGJ1aWxkIHNjcmlwdHMKK2FuZC9vciB0b29scyB3b3VsZCBuZWVkIHRvIGJlIHByb3ZpZGVkIGFzIHdlbGwpLgorCisKKyAgIElWLiBUSElOR1MgWU9VIE5FRUQgVE8gRE8KKworICAqIFlvdSBtdXN0IHRlbGwgdXNlcnMgb2YgeW91ciBhcHBsaWNhdGlvbiB0aGF0IHlvdSBhcmUgdXNpbmcgTEdQTC1saWNlbnNlZAorICAgIHNvZnR3YXJlLCB3aGljaCBMR1BMLWxpY2Vuc2VkIHNvZnR3YXJlIGV4YWN0bHksIGFuZCB5b3UgbXVzdCBwcm92aWRlIHRoZW0KKyAgICB3aXRoIGEgY29weSBvZiB0aGUgbGljZW5zZSBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzIHVuZGVyIHRoZSBMR1BMLgorCisgICogWW91IG11c3QgcHJvdmlkZSAob24gcmVxdWVzdCkgYWxsIHRoZSBzb3VyY2UgY29kZSBhbmQgYWxsIHRoZSBjaGFuZ2VzCisgICAgb3IgYWRkaXRpb25zIHlvdSBoYXZlIG1hZGUgdG8gdGhlIExHUEwtbGljZW5zZWQgc29mdHdhcmUgeW91IGFyZSB1c2luZy4KKworICAgIEZvciBHU3RyZWFtZXIgY29kZSB3ZSB3b3VsZCByZWNvbW1lbmQgdGhhdCB0aGUgY2hhbmdlcyBiZSBwcm92aWRlZCBlaXRoZXIKKyAgICBpbiBmb3JtIG9mIGEgYnJhbmNoIGluIGEgZ2l0IHJlcG9zaXRvcnksIG9yIGFzIGEgc2V0IG9mICJnaXQgZm9ybWF0LXBhdGNoIi0KKyAgICBzdHlsZSBwYXRjaGVzIGFnYWluc3QgYSBHU3RyZWFtZXIgcmVsZWFzZSBvciBhIHNuYXBzaG90IG9mIGEgR1N0cmVhbWVyIGdpdAorICAgIHJlcG9zaXRvcnkuIFRoZSBwYXRjaGVzIHNob3VsZCBpZGVhbGx5IHNheSB3aGF0IHdhcyBjaGFuZ2VkIGFuZCB3aHkgaXQKKyAgICB3YXMgY2hhbmdlZCwgYW5kIHRoZXJlIHNob3VsZCBpZGVhbGx5IGJlIHNlcGFyYXRlIHBhdGNoZXMgZm9yIGluZGVwZW5kZW50CisgICAgY2hhbmdlcy4KKworICAqIFlvdSBtdXN0IHByb3ZpZGUgYSB3YXkgZm9yIHVzZXJzIG9mIHlvdXIgYXBwbGljYXRpb24gdG8gbWFrZSBjaGFuZ2VzIHRvCisgICAgdGhlIExHUEwtbGljZW5zZWQgcGFydHMgb2YgdGhlIGNvZGUsIGFuZCByZS1jcmVhdGUgYSBmdWxsIGFwcGxpY2F0aW9uCisgICAgYmluYXJ5IHdpdGggdGhlIGNoYW5nZXMgKHVzaW5nIHRoZSBzdGFuZGFyZCB0b29sY2hhaW4gYW5kIHRvb2xzIG9mIHRoZQorICAgIHRhcmdldCBwbGF0Zm9ybTsgaWYgeW91IGFyZSB1c2luZyBhIGN1c3RvbSB0b29sY2hhaW4gb3IgY3VzdG9tIHRvb2xzCisgICAgeW91IG11c3QgcHJvdmlkZSB0aGVzZSBhbmQgZG9jdW1lbnQgaG93IHRvIHVzZSB0aGVtIHRvIGNyZWF0ZSBhIG5ldworICAgIGFwcGxpY2F0aW9uIGJpbmFyeSkuCisKKyAgICBOb3RlIHRoYXQgdGhpcyBvZiBjb3Vyc2UgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSB1c2VyIGlzIGFsbG93ZWQgdG8KKyAgICByZS1kaXN0cmlidXRlIHRoZSBjaGFuZ2VkIGFwcGxpY2F0aW9uLiBOb3IgZG9lcyBpdCBtZWFuIHRoYXQgeW91IGhhdmUKKyAgICB0byBwcm92aWRlIHlvdXIgcHJvcHJpZXRhcnkgc291cmNlIGNvZGUgLSBpdCBpcyBzdWZmaWNpZW50IHRvIHByb3ZpZGUgYQorICAgIHJlYWR5LW1hZGUgY29tcGlsZWQgb2JqZWN0IGZpbGUgdGhhdCBjYW4gYmUgcmVsaW5rZWQgaW50byBhbiBhcHBsaWNhdGlvbgorICAgIGJpbmFyeSB3aXRoIHRoZSByZS1jb21waWxlZCBMR1BMIGNvbXBvbmVudHMuCisKKworICAgVi4gVEhJTkdTIFRPIExPT0sgT1VUIEZPUgorCitXaGlsZSBtb3N0IEdTdHJlYW1lciBwbHVnaW5zIGFuZCB0aGUgbGlicmFyaWVzIHRoZXkgZGVwZW5kIG9uIGFyZSBsaWNlbnNlZAordW5kZXIgdGhlIExHUEwgb3IgZXZlbiBtb3JlIHBlcm1pc3NpdmUgbGljZW5zZXMsIHRoYXQgaXMgbm90IHRoZSBjYXNlIGZvcgorYWxsIHBsdWdpbnMgYW5kIGxpYnJhcmllcyB1c2VkLCBlc3AuIHRob3NlIGluIHRoZSBnc3QtcGx1Z2lucy11Z2x5IG9yCitzb21lIG9mIHRob3NlIGluIHRoZSBnc3QtcGx1Z2lucy1iYWQgc2V0IG9mIHBsdWdpbnMuCisKK1doZW4gc3RhdGljYWxseSBsaW5raW5nIHByb3ByaWV0YXJ5IGNvZGUsIGNhcmUgbXVzdCBiZSB0YWtlbiBub3QgdG8KK3N0YXRpY2FsbHkgbGluayBwbHVnaW5zIG9yIGxpYnJhcmllcyB0aGF0IGFyZSBsaWNlbnNlZCB1bmRlciBsZXNzIHBlcm1pc3NpdmUKK3Rlcm1zIHRoYW4gdGhlIExHUEwsIHN1Y2ggYXMgZS5nLiBHUEwtbGljZW5zZWQgbGlicmFyaWVzLgorCisKKyAgIFZJLiBTUEVDSUFMIENPTlNJREVSQVRJT05TIEZPUiBTUEVDSUZJQyBVU0UtQ0FTRVMKKworCisgICAxLiBQcm9wcmlldGFyeSBHU3RyZWFtZXIvR0xpYi1iYXNlZCBBcHBsaWNhdGlvbiBPbiBpT1MKKworTGV0J3MgYXNzdW1lIGFuIGluZGl2aWR1YWwgb3IgYSBjb21wYW55IHdhbnRzIHRvIGRpc3RyaWJ1dGUgYSBwcm9wcmlldGFyeQoraU9TIGFwcGxpY2F0aW9uIHRoYXQgaXMgYnVpbHQgb24gdG9wIG9mIEdTdHJlYW1lciBhbmQgR0xpYiB0aHJvdWdoCitBcHBsZSdzIEFwcCBTdG9yZS4gQXQgdGhlIHRpbWUgb2Ygd3JpdGluZyB0aGUgQXBwbGUgaVBob25lIGRldmVsb3BlcgorYWdyZWVtZW50IGRpZG7igJl0IGFsbG93IHRoZSBidW5kbGluZyBvZiBzaGFyZWQgbGlicmFyaWVzLCBzbyBkaXN0cmlidXRpbmcKK2EgcHJvcHJpZXRhcnkgaU9TIGFwcGxpY2F0aW9uIHdpdGggc2hhcmVkIGxpYnJhcmllcyBpcyBvbmx5IHBvc3NpYmxlIHVzaW5nCitkaXN0cmlidXRpb24gbWVjaGFuaXNtcyBvdXRzaWRlIG9mIHRoZSBBcHAgU3RvcmUgYW5kL29yIG9ubHkgdG8gamFpbGJyb2tlbgorZGV2aWNlcywgYSBwcm9zcGVjdCB0aGF0IG1heSBub3QgYXBwZWFsIHRvIG91ciBpbmRpdmlkdWFsIG9yIGNvbXBhbnkuIFNvIHRoZQorb25seSBhbHRlcm5hdGl2ZSB0aGVuIGlzIHRvIGxpbmsgZXZlcnl0aGluZyBzdGF0aWNhbGx5LCB3aGljaCBtZWFucyB0aGUKK29ibGlnYXRpb25zIG1lbnRpb25lZCBhYm92ZSBjb21lIGludG8gcGxheS4KKworCisgICAyLiBFeGFtcGxlOiBKYWJiZXIgb24gaU9TCisKK1RhbmRiZXJnIChub3cgQ2lzY28pIGNyZWF0ZWQgYSBKYWJiZXIgYXBwbGljYXRpb24gZm9yIGlPUywgYmFzZWQgb24gR1N0cmVhbWVyLgorT24gcmVxdWVzdCB0aGV5IHByb3ZpZGVkIGFuIExHUEwgY29tcGxpYW5jZSBidW5kbGUgaW4gZm9ybSBvZiBhIHppcCBmaWxlLCB3aXRoCityb3VnaGx5IHRoZSBmb2xsb3dpbmcgY29udGVudHM6CisKK2J1aWxkYXBwLnNoCityZWFkbWUudHh0CitKYWJiZXIvSmFiYmVyLUluZm8ucGxpc3QKK0phYmJlci9saWJpcC5hIFsyMzZNQiBiaW5hcnkgd2l0aCBwcm9wcmlldGFyeSBjb2RlXQorSmFiYmVyL21haW4ubW0KK0phYmJlci94Y2NvbmZpZy9BcHBsaWNhdGlvbi54Y2NvbmZpZworSmFiYmVyL3hjY29uZmlnL0RlYnVnLnhjY29uZmlnCitKYWJiZXIveGNjb25maWcvUmVsZWFzZS54Y2NvbmZpZworSmFiYmVyL3hjY29uZmlnL1NoYXJlZC54Y2NvbmZpZworSmFiYmVyL1Jlc291cmNlcy8qLmxwcm9qL0xvY2FsaXphYmxlLnN0cmluZ3MKK0phYmJlci9SZXNvdXJjZXMve0ltYWdlcyxBdWRpbyxTb3VuZHMsSUIsTWVzc2FnZSBTdHlsZXMsRW1vdGljb25zLEZvbnRzfS8qCitKYWJiZXIvUmVzb3VyY2VzLyoKK0phYmJlci54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCitKYWJiZXIueGNvZGVwcm9qL3Byb2plY3QueGN3b3Jrc3BhY2UvY29udGVudHMueGN3b3Jrc3BhY2VkYXRhCitvcGVuc291cmNlL2J1aWxkL2NvbmZpZy5zaXRlCitvcGVuc291cmNlL2J1aWxkL200L21vdmkubTQKK29wZW5zb3VyY2UvYnVpbGQvc2NyaXB0cy9jbGVhbi1kZXBzLnNoCitvcGVuc291cmNlL2J1aWxkL3NjcmlwdHMvZml4dXAtbWFrZWZpbGUuc2gKK29wZW5zb3VyY2UvYnVpbGQvc2NyaXB0cy9Nb3ZpTWFrZXIucHkKK29wZW5zb3VyY2UvYnVpbGQuc2gKK29wZW5zb3VyY2UvZW52LnNoCitvcGVuc291cmNlL01ha2VmaWxlCitvcGVuc291cmNlL2V4dGVybmFsL2dsaWIvKgorb3BlbnNvdXJjZS9leHRlcm5hbC9nc3RyZWFtZXIve2dzdHJlYW1lcixnc3QtcGx1Z2lucy0qfS8qCitvcGVuc291cmNlL2V4dGVybmFsL29wZW5zc2wvKgorb3BlbnNvdXJjZS9leHRlcm5hbC9wcm94eS1saWJpbnRsLyoKK29wZW5zb3VyY2UvdG9vbGNoYWluL2Rhcndpbi14ODYvYmluL3ttaXNjIGF1dG90b29vbHMsbTQsZ2xpYi1ta2VudW1zLGdsaWItZ2VubWFyc2hhbCxsaWJ0b29sLHBrZy1jb25maWcsZXRjLn0KK29wZW5zb3VyY2UvdG9vbGNoYWluL2Rhcndpbi14ODYvc2hhcmUve2FjbG9jYWwsYWNsb2NhbC0xLjExLGF1dG9jb25mLGF1dG9tYWtlLTEuMTEsbGlidG9vbH0vKgorb3BlbnNvdXJjZS90b29sY2hhaW4vZGFyd2luLXg4Ni9zaGFyZS9Db25maWcucG0KK29wZW5zb3VyY2UvdG9vbGNoYWluL2Rhcndpbi14ODYvc2hhcmUvQ29uZmlnLnBtLm1vdmkuaW4KK3BhdGNoZXMvZ2xpYi9nbGliLnBhdGNoCitwYXRjaGVzL2dzdC1wbHVnaW5zLWJhZC9nc3QtcGx1Z2lucy1iYWQucGF0Y2gKK3BhdGNoZXMvZ3N0LXBsdWdpbnMtYmFzZS9nc3QtcGx1Z2lucy1iYXNlLnBhdGNoCitwYXRjaGVzL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC5wYXRjaAorcGF0Y2hlcy9nc3RyZWFtZXIvZ3N0cmVhbWVyLnBhdGNoCitwYXRjaGVzL29wZW5zc2wvb3BlbnNzbC5wYXRjaAorCityZWFkbWUudHh0IHN0YXJ0cyB3aXRoICJUaGlzIFJlYWRtZSBmaWxlIGRlc2NyaWJlcyBob3cgdG8gYnVpbGQgdGhlIENpc2NvIAorSmFiYmVyIGZvciBpUGFkIGFwcGxpY2F0aW9uLiBZb3UgbmVlZCB0byBpbnN0YWxsIFhjb2RlLCBidXQgdGhlIGZpbmFsIHBhY2thZ2UKK2lzIGJ1aWx0IGJ5IHJ1bm5pbmcgYnVpbGRhcHAuc2guIiBhbmQgZGVzY3JpYmVzIGhvdyB0byBidWlsZCBwcm9qZWN0LAorcHJlcmVxdWlzaXRlcywgdGhlIHByb2NlZHVyZSBpbiBkZXRhaWwsIGFuZCBhICJIb3cgdG8gSW5jbHVkZSBQcm92aXNpb25pbmcKK1Byb2ZpbGUgTWFudWFsbHkgLyBBbHRlcm5hdGUgQ29kZSBTaWduaW5nIEluc3RydWN0aW9ucyIgc2VjdGlvbi4KKworCisgICAzLiBSYW5kb20gTGlua3MgV2hpY2ggTWF5IEJlIE9mIEludGVyZXN0CisKK1swXSBodHRwOi8vbXVsdGluYy5jb20vMjAwOS8wOC8yNC9jb21wYXRpYmlsaXR5LWJldHdlZW4tdGhlLWlwaG9uZS1hcHAtc3RvcmUtYW5kLXRoZS1sZ3BsLwpkaWZmIC0tZ2l0IGEvUkVMRUFTRSBiL1JFTEVBU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxMWY3ZAotLS0gL2Rldi9udWxsCisrKyBiL1JFTEVBU0UKQEAgLTAsMCArMSw5OCBAQAorCitSZWxlYXNlIG5vdGVzIGZvciBHU3RyZWFtZXIgR29vZCBQbHVnaW5zwqAxLjEyLjAKKworVGhlIEdTdHJlYW1lciB0ZWFtIGlzIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhlIGZpcnN0IHJlbGVhc2UgaW4gdGhlIHN0YWJsZSAxLjEyCityZWxlYXNlIHNlcmllcy4gVGhlIDEuMTIgcmVsZWFzZSBzZXJpZXMgaXMgYWRkaW5nIG5ldyBmZWF0dXJlcyBvbiB0b3Agb2YgdGhlCisxLjAsIDEuMiwgMS40LCAxLjYsIDEuOCBhbmQgMS4xMCBzZXJpZXMgYW5kIGlzIHBhcnQgb2YgdGhlIEFQSSBhbmQgQUJJLXN0YWJsZQorMS54IHJlbGVhc2Ugc2VyaWVzIG9mIHRoZSBHU3RyZWFtZXIgbXVsdGltZWRpYSBmcmFtZXdvcmsuCisKKworRnVsbCByZWxlYXNlIG5vdGVzIGNhbiBiZSBmb3VuZCBoZXJlCisKKworQmluYXJpZXMgZm9yIEFuZHJvaWQsIGlPUywgTWFjIE9TIFggYW5kIFdpbmRvd3Mgd2lsbCBiZSBwcm92aWRlZCBpbiB0aGUgbmV4dCBkYXlzLgorCisKKyJTdWNoIGluZ3JhdGl0dWRlLiAgQWZ0ZXIgYWxsIHRoZSB0aW1lcyBJJ3ZlIHNhdmVkIHlvdXIgbGlmZS4iCisKKworQSBjb2xsZWN0aW9uIG9mIHBsdWdpbnMgeW91J2Qgd2FudCB0byBoYXZlIHJpZ2h0IG5leHQgdG8geW91IG9uIHRoZQorYmF0dGxlZmllbGQuICBTaG9vdGluZyBzaGFycCBhbmQgbWFraW5nIG5vIG1pc3Rha2VzLCB0aGVzZSBwbHVnaW5zIGhhdmUgaXQKK2FsbDogZ29vZCBsb29rcywgZ29vZCBjb2RlLCBhbmQgZ29vZCBsaWNlbnNpbmcuICBEb2N1bWVudGVkIGFuZCBkcmVzc2VkIHVwCitpbiB0ZXN0cy4gIElmIHlvdSdyZSBsb29raW5nIGZvciBhIHJvbGUgbW9kZWwgdG8gYmFzZSB5b3VyIG93biBwbHVnaW4gb24sCitoZXJlIGl0IGlzLgorCisKK0lmIHlvdSBmaW5kIGEgcGxvdCBob2xlIG9yIGEgYmFkbHkgbGlwLXN5bmNlZCBsaW5lIG9mIGNvZGUgaW4gdGhlbSwKK2xldCB1cyBrbm93IC0gaXQgaXMgYSBtYXR0ZXIgb2YgaG9ub3VyIGZvciB1cyB0byBlbnN1cmUgQmxvbmRpZSBkb2Vzbid0IGxvb2sKK2xpa2UgaGUncyBiZWVuIHdhbGtpbmcgMTAwIG1pbGVzIHRocm91Z2ggdGhlIGRlc2VydCB3aXRob3V0IHdhdGVyLgorCisKK1RoaXMgbW9kdWxlIGNvbnRhaW5zIGEgc2V0IG9mIHBsdWdpbnMgdGhhdCB3ZSBjb25zaWRlciB0byBoYXZlIGdvb2QgcXVhbGl0eQorICBjb2RlLCBjb3JyZWN0IGZ1bmN0aW9uYWxpdHksIG91ciBwcmVmZXJyZWQgbGljZW5zZSAoTEdQTCBmb3IgdGhlIHBsdWdpbgorICBjb2RlLCBMR1BMIG9yIExHUEwtY29tcGF0aWJsZSBmb3IgdGhlIHN1cHBvcnRpbmcgbGlicmFyeSkuCitXZSBiZWxpZXZlIGRpc3RyaWJ1dG9ycyBjYW4gc2FmZWx5IHNoaXAgdGhlc2UgcGx1Z2lucy4KK1Blb3BsZSB3cml0aW5nIGVsZW1lbnRzIHNob3VsZCBiYXNlIHRoZWlyIGNvZGUgb24gdGhlc2UgZWxlbWVudHMuCisKKworT3RoZXIgbW9kdWxlcyBjb250YWluaW5nIHBsdWdpbnMgYXJlOgorCisKK2dzdC1wbHVnaW5zLWJhc2UKK2NvbnRhaW5zIGEgYmFzaWMgc2V0IG9mIHdlbGwtc3VwcG9ydGVkIHBsdWdpbnMKK2dzdC1wbHVnaW5zLXVnbHkKK2NvbnRhaW5zIGEgc2V0IG9mIHdlbGwtc3VwcG9ydGVkIHBsdWdpbnMsIGJ1dCBtaWdodCBwb3NlIHByb2JsZW1zIGZvcgorICAgIGRpc3RyaWJ1dG9ycworZ3N0LXBsdWdpbnMtYmFkCitjb250YWlucyBhIHNldCBvZiBsZXNzIHN1cHBvcnRlZCBwbHVnaW5zIHRoYXQgaGF2ZW4ndCBwYXNzZWQgdGhlCisgICAgcmlnb3JvdXMgcXVhbGl0eSB0ZXN0aW5nIHdlIGV4cGVjdCwgb3IgYXJlIHN0aWxsIG1pc3NpbmcgZG9jdW1lbnRhdGlvbgorICAgIGFuZC9vciB1bml0IHRlc3RzCitnc3QtbGliYXYKK2NvbnRhaW5zIGEgc2V0IG9mIGNvZGVjcyBwbHVnaW5zIGJhc2VkIG9uIGxpYmF2IChmb3JtZXJseSBnc3QtZmZtcGVnKQorCisKKworICAKKworQnVncyBmaXhlZCBpbiB0aGlzIHJlbGVhc2UKKyAgICAgCisgICAgICAqIDc4MjA0MiA6IHF0ZGVtdXg6IEZpeCBjcmFzaCBvbiBtc3Mgc3RyZWFtIGNhdXNlZCBieSBpbnZhbGlkIHN0c2QgZW50cnkgYWNjZXNzCisKKz09PT0gRG93bmxvYWQgPT09PQorCitZb3UgY2FuIGZpbmQgc291cmNlIHJlbGVhc2VzIG9mIGdzdC1wbHVnaW5zLWdvb2QgaW4gdGhlIGRvd25sb2FkCitkaXJlY3Rvcnk6IGh0dHBzOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC8KKworVGhlIGdpdCByZXBvc2l0b3J5IGFuZCBkZXRhaWxzIGhvdyB0byBjbG9uZSBpdCBjYW4gYmUgZm91bmQgYXQKK2h0dHA6Ly9jZ2l0LmZyZWVkZXNrdG9wLm9yZy9nc3RyZWFtZXIvZ3N0LXBsdWdpbnMtZ29vZC8KKworPT09PSBIb21lcGFnZSA9PT09CisKK1RoZSBwcm9qZWN0J3Mgd2Vic2l0ZSBpcyBodHRwczovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvCisKKz09PT0gU3VwcG9ydCBhbmQgQnVncyA9PT09CisKK1dlIHVzZSBHTk9NRSdzIGJ1Z3ppbGxhIGZvciBidWcgcmVwb3J0cyBhbmQgZmVhdHVyZSByZXF1ZXN0czoKK2h0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvZW50ZXJfYnVnLmNnaT9wcm9kdWN0PUdTdHJlYW1lcgorCitQbGVhc2Ugc3VibWl0IHBhdGNoZXMgdmlhIGJ1Z3ppbGxhIGFzIHdlbGwuCisKK0ZvciBoZWxwIGFuZCBzdXBwb3J0LCBwbGVhc2Ugc3Vic2NyaWJlIHRvIGFuZCBzZW5kIHF1ZXN0aW9ucyB0byB0aGUKK2dzdHJlYW1lci1kZXZlbCBtYWlsaW5nIGxpc3QgKHNlZSBiZWxvdyBmb3IgZGV0YWlscykuCisKK1RoZXJlIGlzIGFsc28gYSAjZ3N0cmVhbWVyIElSQyBjaGFubmVsIG9uIHRoZSBGcmVlbm9kZSBJUkMgbmV0d29yay4KKworPT09PSBEZXZlbG9wZXJzID09PT0KKworR1N0cmVhbWVyIGlzIHN0b3JlZCBpbiBHaXQsIGhvc3RlZCBhdCBnaXQuZnJlZWRlc2t0b3Aub3JnLCBhbmQgY2FuIGJlIGNsb25lZAorZnJvbSB0aGVyZSAoc2VlIGxpbmsgYWJvdmUpLgorCitJbnRlcmVzdGVkIGRldmVsb3BlcnMgb2YgdGhlIGNvcmUgbGlicmFyeSwgcGx1Z2lucywgYW5kIGFwcGxpY2F0aW9ucyBzaG91bGQKK3N1YnNjcmliZSB0byB0aGUgZ3N0cmVhbWVyLWRldmVsIGxpc3QuCisKKyAgICAgICAgCitDb250cmlidXRvcnMgdG8gdGhpcyByZWxlYXNlCisgICAgCisgICAgICAqIFNlYmFzdGlhbiBEcsO2Z2UKKyAgICAgICogU2V1bmdoYSBZYW5nCivCoApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1JFUVVJUkVNRU5UUyBiL1JFUVVJUkVNRU5UUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDBlODI0Ci0tLSAvZGV2L251bGwKKysrIGIvUkVRVUlSRU1FTlRTCkBAIC0wLDAgKzEsMTgyIEBACitHU3RyZWFtZXIgdXNlcyBhICpsYXJnZSogYXJyYXkgb2YgdG9vbHMgYW5kIGxpYnJhcmllcywgbW9zdCBvZiB3aGljaCBhcmUKK29wdGlvbmFsLiBXZSBoYXZlIGF0dGVtcHRlZCB0byBtYWtlIHN1cmUgdGhhdCBhbnkgY29kZSB0aGF0IGRlcGVuZHMgb24KK29wdGlvbmFsIGxpYnJhcmllcyBkb2Vzbid0IGdldCBidWlsdCB1bmxlc3MgeW91IGhhdmUgdGhvc2UgbGlicmFyaWVzLiBJZgoreW91IGZpbmQgdGhpcyBub3QgdG8gYmUgdGhlIGNhc2UsIHBsZWFzZSwgbGV0IHVzIGtub3cgYnkgZmlsaW5nIGEgYnVnCityZXBvcnQgYXQgaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy8uCisKK09uIERlYmlhbi9VYnVudHUsIHRoZSBlYXNpZXN0IHdheSB0byBpbnN0YWxsIG1vc3QgYnVpbGQgcmVxdWlyZW1lbnRzIGlzOgorCisgICAgICAgIHN1ZG8gYXB0LWdldCBidWlsZC1kZXAgZ3N0LXBsdWdpbnMtZ29vZDEuMAorCitSZXF1aXJlZCB0b29sczoKKz09PT09PT09PT09PT09PQorCitBbiBleHRyYSBzZXQgb2YgdG9vbHMgaXMgcmVxdWlyZWQgaWYgeW91IHdpc2ggdG8gYnVpbGQgR1N0cmVhbWVyCitmcm9tIGdpdCAodXNpbmcgYXV0b2dlbi5zaCk6CisKK2F1dG9jb25mICA+PSAyLjY4ICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi8KK2F1dG9tYWtlICA+PSAxLjExICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvbWFrZS8KK2dldHRleHQgICA+PSAwLjE3ICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nZXR0ZXh0LworbGlidG9vbCAgID49IDIuMi42ICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYnRvb2wvCitwa2djb25maWcgPj0gMC45LjAgIGh0dHBzOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9wa2djb25maWcvCisKK1JlcXVpcmVkIGxpYnJhcmllczoKKz09PT09PT09PT09PT09PT09PT0KKworUGFja2FnZTogICAgICAgIEdTdHJlYW1lcgorVmVyc2lvbjogICAgICAgIDEueCAoc2FtZSAxLnggdmVyc2lvbiBhcyB0aGlzIHBhY2thZ2UpCitSZWNvbW1lbmRlZDogICAgTGF0ZXN0IDEueAorVVJMOiAgICAgICAgICAgIGh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnLworRGViaWFuUGFja2FnZTogIGxpYmdzdHJlYW1lcjEuMC1kZXYKK05vdGVzOiAgICAgICAgICBUaGUgcmVxdWlyZWQgdmVyc2lvbiBpcyB1cGRhdGVkIGZyZXF1ZW50bHksIHNvIHRoZSB2ZXJzaW9uCisgICAgICAgICAgICAgICAgbGlzdGVkIGluIHRoaXMgZmlsZSBpcyBvZnRlbiBvdXQgb2YgZGF0ZS4gSWYgeW91IGFyZSBjb21waWxpbmcKKyAgICAgICAgICAgICAgICBmcm9tIGdpdCBtYXN0ZXIsIHlvdSB3aWxsIHVzdWFsbHkgbmVlZCBHU3RyZWFtZXIgY29yZSBhbmQKKyAgICAgICAgICAgICAgICBnc3QtcGx1Z2lucy1iYXNlIGZyb20gZ2l0IG1hc3RlciBhcyB3ZWxsLgorCitQYWNrYWdlOiAgICAgICAgR1N0cmVhbWVyIEJhc2UgUGx1Z2lucworVmVyc2lvbjogICAgICAgIDEueCAoc2FtZSAxLnggdmVyc2lvbiBhcyB0aGlzIHBhY2thZ2UpCitSZWNvbW1lbmRlZDogICAgTGF0ZXN0IDEueAorVVJMOiAgICAgICAgICAgIGh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnLworRGViaWFuUGFja2FnZTogIGxpYmdzdHJlYW1lci1wbHVnaW5zLWJhc2UxLjAtZGV2CitOb3RlczogICAgICAgICAgVGhlIHJlcXVpcmVkIHZlcnNpb24gaXMgdXBkYXRlZCBmcmVxdWVudGx5LCBzbyB0aGUgdmVyc2lvbgorICAgICAgICAgICAgICAgIGxpc3RlZCBpbiB0aGlzIGZpbGUgaXMgb2Z0ZW4gb3V0IG9mIGRhdGUuIElmIHlvdSBhcmUgY29tcGlsaW5nCisgICAgICAgICAgICAgICAgZnJvbSBnaXQgbWFzdGVyLCB5b3Ugd2lsbCB1c3VhbGx5IG5lZWQgR1N0cmVhbWVyIGNvcmUgYW5kCisgICAgICAgICAgICAgICAgZ3N0LXBsdWdpbnMtYmFzZSBmcm9tIGdpdCBtYXN0ZXIgYXMgd2VsbC4KKworCitPcHRpb25hbCBsaWJyYXJpZXM6Cis9PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZmlsZSBsaXN0cyBzdXBwb3J0aW5nIGxpYnJhcmllcyBmb3Igd2hpY2ggZ3N0LXBsdWdpbnMtZ29vZCBjb250YWlucworcGx1Z2lucywgYXMgd2VsbCBhcyB0aGVpciBtaW5pbXVtIHJlcXVpcmVkIHZlcnNpb24uIFlvdSBjYW4gZmluZCB0aGUKK2NvcnJlc3BvbmRpbmcgcGx1Z2lucyBpbiBleHQvKGxpYnJhcnkpCisKK1BhY2thZ2U6ICAgICAgICBPcmMKK1ZlcnNpb246ICAgICAgICA+PSAwLjQuMTcKK1JlY29tbWVuZGVkOiAgICBMYXRlc3QgMC40LngKK1VSTDogICAgICAgICAgICBodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9kYXRhL3NyYy9vcmMvCitEZWJpYW5QYWNrYWdlOiAgbGlib3JjLTAuNC1kZXYKK05vdGVzOgkJVXNlZCBieSBtYW55IHBsdWdpbnMgZm9yIGFjY2VsZXJhdGluZyBTSU1EIHByb2Nlc3NpbmcgdXNpbmcKKyAgICAgICAgICAgICAgICBydW4tdGltZSBnZW5lcmF0ZWQgYXNzZW1ibHkuIE5vdCBhIGhhcmQgcmVxdWlyZW1lbnQsIGJ1dAorICAgICAgICAgICAgICAgIGhpZ2hseSByZWNvbW1lbmRlZC4gUGFja2FnZXJzLCBwbGVhc2UgaGFyZC1kZXBlbmQgb24gbGlib3JjLgorICAgICAgICAgICAgICAgIFRoZSBnaXQgcmVwb3NpdG9yeSBpcyBodHRwOi8vY2dpdC5mcmVlZGVza3RvcC5vcmcvZ3N0cmVhbWVyL29yYy8KKyAgICAgICAgICAgICAgICAoYWxsIHZlcnNpb25zIG9uIGVudHJvcHl3YXZlLmNvbSBhcmUgb3V0ZGF0ZWQpCisKK1BhY2thZ2U6ICAgICAgICBnZGstcGl4YnVmIExpYnJhcnkKK1ZlcnNpb246ICAgICAgICA+PSAyLjguMAorUmVjb21tZW5kZWQ6ICAgIExhdGVzdCAyLngKK1VSTDogICAgICAgICAgICBodHRwOi8vd3d3Lmd0ay5vcmcvCitEZWJpYW5QYWNrYWdlOiAgbGliZ2RrLXBpeGJ1ZjIuMC1kZXYKK1BsdWdpbnM6ICAgICAgICBnZGtwaXhidWYgKGdka3BpeGJ1ZmRlYywgZ2RrcGl4YnVmb3ZlcmxheSkKK05vdGVzOiAgICAgICAgICBUaGlzIGxpYnJhcnkgZG9lcyBub3QgZGVwZW5kIG9uIEd0aysgb3IgR2RrIG9yIGFueSB3aW5kb3cgc3lzdGVtCisKK1BhY2thZ2U6ICAgICAgICBHVEsrCitWZXJzaW9uOiAgICAgICAgPj0gMy4wCitSZWNvbW1lbmRlZDogICAgTGF0ZXN0IDMueAorVVJMOiAgICAgICAgICAgIGh0dHA6Ly93d3cuZ3RrLm9yZy8KK0RlYmlhblBhY2thZ2U6ICBsaWJndGstMy1kZXYKK1BsdWdpbnM6ICAgICAgICBOb25lCitOb3RlczoJICAgICAgICBPbmx5IG5lZWRlZCBieSBzb21lIG9mIHRoZSBleGFtcGxlcywgbm90IGJ5IGFueSBwbHVnaW5zLgorCitQYWNrYWdlOiAgICAgICAgWGxpYgorUGx1Z2luczogICAgICAgIHhpbWFnZXNyYworRGViaWFuUGFja2FnZTogIGxpYngxMS1kZXYgbGlieHYtZGV2IGxpYnh0LWRldgorCitQYWNrYWdlOiAgICAgICAgQUFMaWIKK1BsdWdpbnM6ICAgICAgICBhYXNpbmsKK1VSTDogICAgICAgICAgICBodHRwOi8vYWEtcHJvamVjdC5zb3VyY2Vmb3JnZS5uZXQvYWFsaWIvCisKK1BhY2thZ2U6ICAgICAgICBDYWlybworVmVyc2lvbjogICAgICAgID49IDEuMTAKK0RlYmlhblBhY2thZ2U6ICBsaWJjYWlybzItZGV2CitQbHVnaW5zOiAgICAgICAgY2Fpcm8gKGNhaXJvb3ZlcmxheSkKK1VSTDogICAgICAgICAgICBodHRwOi8vY2Fpcm9ncmFwaGljcy5vcmcvCisKK1BhY2thZ2U6ICAgICAgICBGTEFDCitWZXJzaW9uOiAgICAgICAgPj0gMS4xLjQKK0RlYmlhblBhY2thZ2U6ICBsaWJmbGFjLWRldgorUGx1Z2luczogICAgICAgIGZsYWMgKGZsYWNlbmMsIGZsYWNkZWMpCitVUkw6ICAgICAgICAgICAgaHR0cDovL2ZsYWMuc291cmNlZm9yZ2UubmV0LworCitQYWNrYWdlOiAgICAgICAgZ3VkZXYKK1ZlcnNpb246ICAgICAgICA+PSAxNDcKK0RlYmlhblBhY2thZ2U6ICBsaWJndWRldi0xLjAtZGV2CitQbHVnaW5zOiAgICAgICAgdjRsMiAodjRsMnNyYykKK1VSTDogICAgICAgICAgICBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9zeXN0ZW1kLworTm90ZXM6ICAgICAgICAgIFRoaXMgZGVwZW5kZW5jeSBpcyBlbnRpcmVseSBvcHRpb25hbCwgdGhlIHZpZGVvNGxpbnV4IHBsdWdpbgorICAgICAgICAgICAgICAgIHdpbGwgd29yayBqdXN0IGZpbmUgd2l0aG91dCBpdC4gZ3VkZXYgaXMgb25seSByZXF1aXJlZCBmb3IKKyAgICAgICAgICAgICAgICB0aGUgZGV2aWNlIHByb2JpbmcgYW5kIG1vbml0b3JpbmcgZnVuY3Rpb25hbGl0eSB0byBkZXRlY3QKKyAgICAgICAgICAgICAgICB2aWRlbzRsaW51eCBkZXZpY2VzIGFwcGVhcmluZy9kaXNhcHBlYXJpbmcgYXQgcnVuLXRpbWUuCisKK1BhY2thZ2U6ICAgICAgICBKUEVHIGxpYnJhcnkKK1BsdWdpbnM6ICAgICAgICBqcGVnIChqcGVnZW5jLCBqcGVnZGVjLCBzbW9rZWVuYywgc21va2VkZWMpCitEZWJpYW5QYWNrYWdlOiAgbGlianBlZy1kZXYKK1VSTDogICAgICAgICAgICBodHRwOi8vd3d3LmxpYmpwZWctdHVyYm8ub3JnLworICAgICAgICAgICAgICAgIG9yIGh0dHA6Ly93d3cuaWpnLm9yZy8gZm9yIHRoZSBJSkcgdmVyc2lvbgorCitQYWNrYWdlOiAgICAgICAgTGliY2FjYQorUGx1Z2luczogICAgICAgIGNhY2FzaW5rCitEZWJpYW5QYWNrYWdlOiAgbGliY2FjYS1kZXYKK1VSTDogICAgICAgICAgICBodHRwOi8vbGliY2FjYS56b3kub3JnLworCitQYWNrYWdlOiAgICAgICAgTGliZHYKK1ZlcnNpb246ICAgICAgICA+PSAwLjEwMAorRGViaWFuUGFja2FnZTogIGxpYmR2NC1kZXYKK1BsdWdpbnM6ICAgICAgICBkdiAoZHZkZWMpCitVUkw6ICAgICAgICAgICAgaHR0cDovL2xpYmR2LnNvdXJjZWZvcmdlLm5ldC8KKworUGFja2FnZToJbGlibGFtZQorVmVyc2lvbjoJPj0gMy45OAorRGViaWFuUGFja2FnZToJbGlibXAzbGFtZS1kZXYKK1BsdWdpbnM6CWxhbWUgKGxhbWVtcDNlbmMpCitVUkw6CQlodHRwOi8vd3d3Lm1wM2Rldi5vcmcvbXAzLworCitQYWNrYWdlOglsaWJtcGcxMjMKK1ZlcnNpb246ICAgICAgICA+PSAxLjMKK0RlYmlhblBhY2thZ2U6ICBsaWJwbmcxMi1kZXYKK1BsdWdpbnM6ICAgICAgICBtcGcxMjMgKG1wZzEyM2F1ZGlvZGVjKQorVVJMOgkJaHR0cHM6Ly93d3cubXBnMTIzLmRlL2FwaS8KKworUGFja2FnZTogICAgICAgIExpYnBuZworVmVyc2lvbjogICAgICAgID49IDEuMgorRGViaWFuUGFja2FnZTogIGxpYnBuZzEyLWRldgorUGx1Z2luczogICAgICAgIHBuZyAocG5nZW5jLCBwbmdkZWMpCitVUkw6ICAgICAgICAgICAgaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvbGlicG5nLmh0bWwKKworUGFja2FnZTogICAgICAgIGxpYnJhdzEzOTQKK1BsdWdpbnM6ICAgICAgICBkdjEzOTQKK1VSTDogICAgICAgICAgICBodHRwOi8vd3d3LmxpbnV4MTM5NC5vcmcvCisKK1BhY2thZ2U6ICAgICAgICBsaWJzaG91dAorVmVyc2lvbjogICAgICAgID49IDIuMAorRGViaWFuUGFja2FnZTogIGxpYnNob3V0My1kZXYKK3BsdWdpbnM6ICAgICAgICBzaG91dDIgKHNob3V0MnNlbmQpCitVUkw6ICAgICAgICAgICAgaHR0cDovL3d3dy5pY2VjYXN0Lm9yZy8KKworUGFja2FnZTogICAgICAgIHNwZWV4CitWZXJzaW9uOiAgICAgICAgPj0gMS4xLjYKK1BsdWdpbnM6ICAgICAgICBzcGVleCAoc3BlZXhlbmMsIHNwZWV4ZGVjKQorVVJMOiAgICAgICAgICAgIGh0dHA6Ly93d3cuc3BlZXgub3JnLworCitQYWNrYWdlOiAgICAgICAgdGFnbGliCitWZXJzaW9uOiAgICAgICAgPj0gMS41CitEZWJpYW5QYWNrYWdlOiAgbGlidGFnMS1kZXYKK1BsdWdpbnM6ICAgICAgICB0YWdsaWIgKGlkM3YybXV4KQorVVJMOiAgICAgICAgICAgIGh0dHA6Ly90YWdsaWIuZ2l0aHViLmlvLworCitQYWNrYWdlOgl0d29sYW1lCitWZXJzaW9uOgk+PSAwLjMuMTMKK0RlYmlhblBhY2thZ2U6CWxpYnR3b2xhbWUtZGV2CitQbHVnaW5zOgl0d29sYW1lICh0d29sYW1lbXAyZW5jKQorVVJMOgkJaHR0cDovL3d3dy50d29sYW1lLm9yZworCitQYWNrYWdlOiAgICAgICAgemxpYgorRGViaWFuUGFja2FnZTogIHpsaWIxZy1kZXYKK1BsdWdpbnM6ICAgICAgICBpc29tcDQgKHF0ZGVtdXgpLCBtYXRyb3NrYSAobWF0cm9za2FkZW11eCkKK1VSTDogICAgICAgICAgICBodHRwOi8vd3d3LnpsaWIubmV0LworCitPcHRpb25hbCAoZGViaWFuKSBwYWNrYWdlczoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitndGstZG9jLXRvb2xzID49IDEuMTIgIC0tIG5lZWRlZCB0byBidWlsZCBkb2N1bWVudGF0aW9uCitweXRob24teG1sICAtLSBuZWVkZWQgdG8gYnVpbGQgcGx1Z2luIGRvY3VtZW50YXRpb24KZGlmZiAtLWdpdCBhL2F1dG9nZW4uc2ggYi9hdXRvZ2VuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM5YWYwMjgKLS0tIC9kZXYvbnVsbAorKysgYi9hdXRvZ2VuLnNoCkBAIC0wLDAgKzEsMTI0IEBACisjIS9iaW4vc2gKKyMKKyMgZ3N0LXBsdWdpbnMtZ29vZCBhdXRvZ2VuLnNoCisjCisjIFJ1biB0aGlzIHRvIGdlbmVyYXRlIGFsbCB0aGUgaW5pdGlhbCBtYWtlZmlsZXMsIGV0Yy4KKyMKKyMgVGhpcyBmaWxlIGhhcyBiZWVuIGdlbmVyYXRlZCBmcm9tIGNvbW1vbi9hdXRvZ2VuLnNoLmluIHZpYSBjb21tb24vdXBkYXRlLWF1dG9nZW4KKworCit0ZXN0IC1uICIkc3JjZGlyIiB8fCBzcmNkaXI9YGRpcm5hbWUgIiQwImAKK3Rlc3QgLW4gIiRzcmNkaXIiIHx8IHNyY2Rpcj0uCisKK29sZGRpcj1gcHdkYAorY2QgIiRzcmNkaXIiCisKK3BhY2thZ2U9Z3N0LXBsdWdpbnMtZ29vZAorc3JjZmlsZT1nc3QtcGx1Z2lucy1nb29kLmRvYXAKKworIyBNYWtlIHN1cmUgd2UgaGF2ZSBjb21tb24KK2lmIHRlc3QgISAtZiBjb21tb24vZ3N0LWF1dG9nZW4uc2g7Cit0aGVuCisgIGVjaG8gIisgU2V0dGluZyB1cCBjb21tb24gc3VibW9kdWxlIgorICBnaXQgc3VibW9kdWxlIGluaXQKK2ZpCitnaXQgc3VibW9kdWxlIHVwZGF0ZQorCisjIHNvdXJjZSBoZWxwZXIgZnVuY3Rpb25zCitpZiB0ZXN0ICEgLWYgY29tbW9uL2dzdC1hdXRvZ2VuLnNoOwordGhlbgorICBlY2hvIFRoZXJlIGlzIHNvbWV0aGluZyB3cm9uZyB3aXRoIHlvdXIgc291cmNlIHRyZWUuCisgIGVjaG8gWW91IGFyZSBtaXNzaW5nIGNvbW1vbi9nc3QtYXV0b2dlbi5zaAorICBleGl0IDEKK2ZpCisuIGNvbW1vbi9nc3QtYXV0b2dlbi5zaAorCisjIGluc3RhbGwgcHJlLWNvbW1pdCBob29rIGZvciBkb2luZyBjbGVhbiBjb21taXRzCitpZiB0ZXN0ICEgXCggLXggLmdpdC9ob29rcy9wcmUtY29tbWl0IC1hIC1MIC5naXQvaG9va3MvcHJlLWNvbW1pdCBcKTsKK3RoZW4KKyAgICBybSAtZiAuZ2l0L2hvb2tzL3ByZS1jb21taXQKKyAgICBpZiAhIGxuIC1zIC4uLy4uL2NvbW1vbi9ob29rcy9wcmUtY29tbWl0Lmhvb2sgLmdpdC9ob29rcy9wcmUtY29tbWl0IDI+IC9kZXYvbnVsbAorICAgIHRoZW4KKyAgICAgICAgZWNobyAiRmFpbGVkIHRvIGNyZWF0ZSBjb21taXQgaG9vayBzeW1saW5rLCBjb3B5aW5nIGluc3RlYWQgLi4uIgorICAgICAgICBjcCBjb21tb24vaG9va3MvcHJlLWNvbW1pdC5ob29rIC5naXQvaG9va3MvcHJlLWNvbW1pdAorICAgIGZpCitmaQorCisjIEdOVSBnZXR0ZXh0IGF1dG9tYWtlIHN1cHBvcnQgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCBnaXQuCisjIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjExMjgKK2lmIHRlc3QgLWQgcG8gOyB0aGVuCisgIHRvdWNoIC10IDIwMDAwMTAxMDAwMCBwby9nc3QtcGx1Z2lucy1nb29kLTEuMC5wb3QKK2ZpCisKK0NPTkZJR1VSRV9ERUZfT1BUPSctLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgLS1lbmFibGUtZ3RrLWRvYycKKworaWYgdGVzdCAieCRwYWNrYWdlIiA9ICJ4Z3N0cmVhbWVyIjsgdGhlbgorICBDT05GSUdVUkVfREVGX09QVD0iJENPTkZJR1VSRV9ERUZfT1BUIC0tZW5hYmxlLWZhaWxpbmctdGVzdHMgLS1lbmFibGUtcG9pc29uaW5nIgorZWxpZiB0ZXN0ICJ4JHBhY2thZ2UiID0gInhnc3QtcGx1Z2lucy1iYWQiOyB0aGVuCisgIENPTkZJR1VSRV9ERUZfT1BUPSIkQ09ORklHVVJFX0RFRl9PUFQgLS13aXRoLXBsYXllci10ZXN0cyIKK2ZpCisKK2F1dG9nZW5fb3B0aW9ucyAkQAorCitwcmludGYgIisgY2hlY2sgZm9yIGJ1aWxkIHRvb2xzIgoraWYgdGVzdCAteiAiJE5PQ0hFQ0siOyB0aGVuCisgIGVjaG8KKworICBwcmludGYgIiAgY2hlY2tpbmcgZm9yIGF1dG9yZWNvbmYgLi4uICIKKyAgZWNobworICB3aGljaCAiYXV0b3JlY29uZiIgMj4vZGV2L251bGwgfHwgeworICAgIGVjaG8gIm5vdCBmb3VuZCEgUGxlYXNlIGluc3RhbGwgdGhlIGF1dG9jb25mIHBhY2thZ2UuIgorICAgIGV4aXQgMQorICB9CisKKyAgcHJpbnRmICIgIGNoZWNraW5nIGZvciBwa2ctY29uZmlnIC4uLiAiCisgIGVjaG8KKyAgd2hpY2ggInBrZy1jb25maWciIDI+L2Rldi9udWxsIHx8IHsKKyAgICBlY2hvICJub3QgZm91bmQhIFBsZWFzZSBpbnN0YWxsIHBrZy1jb25maWcuIgorICAgIGV4aXQgMQorICB9CitlbHNlCisgIGVjaG8gIjogc2tpcHBlZCB2ZXJzaW9uIGNoZWNrcyIKK2ZpCisKKyMgaWYgbm8gYXJndW1lbnRzIHNwZWNpZmllZCB0aGVuIHRoaXMgd2lsbCBiZSBwcmludGVkCitpZiB0ZXN0IC16ICIkKiIgJiYgdGVzdCAteiAiJE5PQ09ORklHVVJFIjsgdGhlbgorICBlY2hvICIrIGNoZWNraW5nIGZvciBhdXRvZ2VuLnNoIG9wdGlvbnMiCisgIGVjaG8gIiAgVGhpcyBhdXRvZ2VuIHNjcmlwdCB3aWxsIGF1dG9tYXRpY2FsbHkgcnVuIC4vY29uZmlndXJlIGFzOiIKKyAgZWNobyAiICAuL2NvbmZpZ3VyZSAkQ09ORklHVVJFX0RFRl9PUFQiCisgIGVjaG8gIiAgVG8gcGFzcyBhbnkgYWRkaXRpb25hbCBvcHRpb25zLCBwbGVhc2Ugc3BlY2lmeSB0aGVtIG9uIHRoZSAkMCIKKyAgZWNobyAiICBjb21tYW5kIGxpbmUuIgorZmkKKwordG9wbGV2ZWxfY2hlY2sgJHNyY2ZpbGUKKworIyBhdXRvcG9pbnQKK2lmIHRlc3QgLWQgcG8gJiYgZ3JlcCBeQU1fR05VX0dFVFRFWFRfVkVSU0lPTiBjb25maWd1cmUuYWMgPi9kZXYvbnVsbCA7IHRoZW4KKyAgdG9vbF9ydW4gImF1dG9wb2ludCIgIi0tZm9yY2UiCitmaQorCisjIGFjbG9jYWwKK2lmIHRlc3QgLWYgYWNpbmNsdWRlLm00OyB0aGVuIHJtIGFjaW5jbHVkZS5tNDsgZmkKKworYXV0b3JlY29uZiAtLWZvcmNlIC0taW5zdGFsbCB8fCBleGl0IDEKKwordGVzdCAtbiAiJE5PQ09ORklHVVJFIiAmJiB7CisgIGVjaG8gIisgc2tpcHBpbmcgY29uZmlndXJlIHN0YWdlIGZvciBwYWNrYWdlICRwYWNrYWdlLCBhcyByZXF1ZXN0ZWQuIgorICBlY2hvICIrIGF1dG9nZW4uc2ggZG9uZS4iCisgIGV4aXQgMAorfQorCitjZCAiJG9sZGRpciIKKworZWNobyAiKyBydW5uaW5nIGNvbmZpZ3VyZSAuLi4gIgordGVzdCAhIC16ICIkQ09ORklHVVJFX0RFRl9PUFQiICYmIGVjaG8gIiAgZGVmYXVsdCBmbGFnczogICRDT05GSUdVUkVfREVGX09QVCIKK3Rlc3QgISAteiAiJENPTkZJR1VSRV9FWFRfT1BUIiAmJiBlY2hvICIgIGV4dGVybmFsIGZsYWdzOiAkQ09ORklHVVJFX0VYVF9PUFQiCitlY2hvCisKK2VjaG8gIiRzcmNkaXIvY29uZmlndXJlIiAkQ09ORklHVVJFX0RFRl9PUFQgJENPTkZJR1VSRV9FWFRfT1BUCisiJHNyY2Rpci9jb25maWd1cmUiICRDT05GSUdVUkVfREVGX09QVCAkQ09ORklHVVJFX0VYVF9PUFQgfHwgeworICAgICAgICBlY2hvICIgIGNvbmZpZ3VyZSBmYWlsZWQiCisgICAgICAgIGV4aXQgMQorfQorCitlY2hvICJOb3cgdHlwZSAnbWFrZScgdG8gY29tcGlsZSAkcGFja2FnZS4iCmRpZmYgLS1naXQgYS9jb21tb24gYi9jb21tb24KbmV3IGZpbGUgbW9kZSAxNjAwMDAKaW5kZXggMDAwMDAwMC4uM2ZhMmM5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbgpAQCAtMCwwICsxIEBACitTdWJwcm9qZWN0IGNvbW1pdCAzZmEyYzllMzcyYmNlZWMzMGJlOTFlNjdmYjAyYjZjYjA1YmVkNDkzCmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg4ODIzOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMCwwICsxLDEyMDggQEAKK0FDX1BSRVJFUShbMi42OV0pCisKK2RubCBwbGVhc2UgcmVhZCBnc3RyZWFtZXIvZG9jcy9yYW5kb20vYXV0b3Rvb2xzIGJlZm9yZSBjaGFuZ2luZyB0aGlzIGZpbGUKKworZG5sIGluaXRpYWxpemUgYXV0b2NvbmYKK2RubCByZWxlYXNlcyBvbmx5IGRvIC1XYWxsLCBnaXQgYW5kIHByZXJlbGVhc2UgZG9lcyAtV2Vycm9yIHRvbworZG5sIHVzZSBhIHRocmVlIGRpZ2l0IHZlcnNpb24gbnVtYmVyIGZvciByZWxlYXNlcywgYW5kIGZvdXIgZm9yIGdpdC9wcmUKK0FDX0lOSVQoW0dTdHJlYW1lciBHb29kIFBsdWctaW5zXSxbMS4xMy4wLjFdLFtodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1HU3RyZWFtZXJdLFtnc3QtcGx1Z2lucy1nb29kXSkKKworQUdfR1NUX0lOSVQKKworZG5sIGluaXRpYWxpemUgYXV0b21ha2UKK0FNX0lOSVRfQVVUT01BS0UoWy1Xbm8tcG9ydGFiaWxpdHkgMS4xNCBuby1kaXN0LWd6aXAgZGlzdC14eiB0YXItdXN0YXIgc3ViZGlyLW9iamVjdHNdKQorCitkbmwgZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTl8qIHZhcmlhYmxlcworQVNfVkVSU0lPTgorCitkbmwgY2hlY2sgaWYgdGhpcyBpcyBhIHJlbGVhc2UgdmVyc2lvbgorQVNfTkFOTyhHU1RfR0lUPSJubyIsIEdTVF9HSVQ9InllcyIpCisKK2RubCBjYW4gYXV0b2NvbmYgZmluZCB0aGUgc291cmNlID8KK0FDX0NPTkZJR19TUkNESVIoW2dzdC9sYXcvYWxhdy5jXSkKKworZG5sIGRlZmluZSB0aGUgb3V0cHV0IGhlYWRlciBmb3IgY29uZmlnCitBQ19DT05GSUdfSEVBREVSUyhbY29uZmlnLmhdKQorCitkbmwgQU1fTUFJTlRBSU5FUl9NT0RFIG9ubHkgcHJvdmlkZXMgdGhlIG9wdGlvbiB0byBjb25maWd1cmUgdG8gZW5hYmxlIGl0CitBTV9NQUlOVEFJTkVSX01PREUoW2VuYWJsZV0pCisKK2RubCBzZXRzIGhvc3RfKiB2YXJpYWJsZXMKK0FDX0NBTk9OSUNBTF9IT1NUCisKK2RubCB1c2UgcHJldHR5IGJ1aWxkIG91dHB1dCB3aXRoIGF1dG9tYWtlID49IDEuMTEKK200X2lmZGVmKFtBTV9TSUxFTlRfUlVMRVNdLFtBTV9TSUxFTlRfUlVMRVMoW3llc10pXSwKKyAgW0FNX0RFRkFVTFRfVkVSQk9TSVRZPTEKKyAgIEFDX1NVQlNUKEFNX0RFRkFVTFRfVkVSQk9TSVRZKV0pCisKK2RubCBvdXIgbGlicmFyaWVzIGFuZCBpbnN0YWxsIGRpcnMgdXNlIEdTVF9BUElfVkVSU0lPTiBpbiB0aGUgZmlsZW5hbWUKK2RubCB0byBhbGxvdyBzaWRlLWJ5LXNpZGUgaW5zdGFsbGF0aW9uIG9mIGRpZmZlcmVudCBBUEkgdmVyc2lvbnMKK0dTVF9BUElfVkVSU0lPTj0xLjAKK0FDX1NVQlNUKEdTVF9BUElfVkVSU0lPTikKK0FDX0RFRklORV9VTlFVT1RFRChHU1RfQVBJX1ZFUlNJT04sICIkR1NUX0FQSV9WRVJTSU9OIiwKKyAgW0dTdHJlYW1lciBBUEkgVmVyc2lvbl0pCisKK0FHX0dTVF9MSUJUT09MX1BSRVBBUkUKK0FTX0xJQlRPT0woR1NULCAxMzAwLCAwLCAxMzAwKQorCitkbmwgKioqIHJlcXVpcmVkIHZlcnNpb25zIG9mIEdTdHJlYW1lciBzdHVmZiAqKioKK0dTVF9SRVE9MS4xMy4wLjEKK0dTVFBCX1JFUT0xLjEzLjAuMQorCitkbmwgKioqIGF1dG90b29scyBzdHVmZiAqKioqCisKK2RubCBhbGxvdyBmb3IgZGlmZmVyZW50IGF1dG90b29scworQVNfQVVUT1RPT0xTX0FMVEVSTkFURQorCitkbmwgQWRkIHBhcmFtZXRlcnMgZm9yIGFjbG9jYWwKK0FDX1NVQlNUKEFDTE9DQUxfQU1GTEFHUywgIi1JIG00IC1JIGNvbW1vbi9tNCIpCisKK2RubCBzZXQgdXAgZ2V0dGV4dAorZG5sIHRoZSB2ZXJzaW9uIGNoZWNrIG5lZWRzIHRvIHN0YXkgaGVyZSBiZWNhdXNlIGF1dG9wb2ludCBncmVwcyBmb3IgaXQKK0FNX0dOVV9HRVRURVhUX1ZFUlNJT04oWzAuMTddKQorQU1fR05VX0dFVFRFWFQoW2V4dGVybmFsXSkKK0FHX0dTVF9HRVRURVhUKFtnc3QtcGx1Z2lucy1nb29kLSRHU1RfQVBJX1ZFUlNJT05dKQorCitkbmwgKioqIGNoZWNrIGZvciBhcmd1bWVudHMgdG8gY29uZmlndXJlICoqKgorCitBR19HU1RfQVJHX0RJU0FCTEVfRkFUQUxfV0FSTklOR1MKK0FHX0dTVF9BUkdfRU5BQkxFX0VYVFJBX0NIRUNLUworCitBR19HU1RfQVJHX0RFQlVHCitBR19HU1RfQVJHX1BST0ZJTElORworQUdfR1NUX0FSR19WQUxHUklORAorQUdfR1NUX0FSR19HQ09WCisKK0FHX0dTVF9BUkdfRVhBTVBMRVMKKworQUdfR1NUX0FSR19XSVRIX1BLR19DT05GSUdfUEFUSAorQUdfR1NUX0FSR19XSVRIX1BBQ0tBR0VfTkFNRQorQUdfR1NUX0FSR19XSVRIX1BBQ0tBR0VfT1JJR0lOCisKK0FHX0dTVF9BUkdfV0lUSF9QTFVHSU5TCisKK0FHX0dTVF9BUkdfRU5BQkxFX0VYVEVSTkFMCisKK0FHX0dTVF9BUkdfRU5BQkxFX0VYUEVSSU1FTlRBTAorCitBR19HU1RfUEtHX0NPTkZJR19QQVRICisKK2RubCAqKiogY2hlY2tzIGZvciBwbGF0Zm9ybSAqKioKKworZG5sICogaGFyZHdhcmUvYXJjaGl0ZWN0dXJlICoKKworZG5sIGNvbW1vbi9tNC9nc3QtYXJjaC5tNAorZG5sIGNoZWNrIENQVSB0eXBlCitBR19HU1RfQVJDSAorCitkbmwgRGV0ZXJtaW5lIGVuZGlhbm5lc3MKK0FDX0NfQklHRU5ESUFOCisKK2RubCAqKiogY2hlY2tzIGZvciBwcm9ncmFtcyAqKioKKworZG5sIGZpbmQgYSBjb21waWxlcgorQUNfUFJPR19DQworQUNfUFJPR19DQ19TVERDCisKK2RubCBkZXRlcm1pbmUgYysrIGNvbXBpbGVyCitBQ19QUk9HX0NYWAorZG5sIGRldGVybWluZSBpZiBjKysgaXMgYXZhaWxhYmxlIG9uIHRoaXMgc3lzdGVtCitBQ19DSEVDS19QUk9HKEhBVkVfQ1hYLCAkQ1hYLCB5ZXMsIG5vKQorCitkbmwgZGV0ZXJtaW5lIGMrKyBwcmVwcm9jZXNzb3IKK2RubCBGSVhNRTogZG8gd2UgbmVlZCB0aGlzID8KK0FDX1BST0dfQ1hYQ1BQCisKK0FDX1BST0dfT0JKQworCitkbmwgY2hlY2sgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzICctYycgYW5kICctbycgb3B0aW9ucworQU1fUFJPR19DQ19DX08KKworZG5sIGZpbmQgYW4gYXNzZW1ibGVyCitBTV9QUk9HX0FTCisKK2RubCBjaGVjayBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgZG8gd2hpbGUoMCkgbWFjcm9zCitBR19HU1RfQ0hFQ0tfRE9XSElMRV9NQUNST1MKKworQUNfUEFUSF9QUk9HKFZBTEdSSU5EX1BBVEgsIHZhbGdyaW5kLCBubykKK0FNX0NPTkRJVElPTkFMKEhBVkVfVkFMR1JJTkQsIHRlc3QgISAieCRWQUxHUklORF9QQVRIIiA9ICJ4bm8iKQorCitkbmwgY2hlY2sgZm9yIGRvY3VtZW50YXRpb24gdG9vbHMKK0dUS19ET0NfQ0hFQ0soWzEuMTJdKQorQUdfR1NUX1BMVUdJTl9ET0NTKFsxLjEyXSkKKworZG5sICoqKiBjaGVja3MgZm9yIGxpYnJhcmllcyAqKioKKworZG5sIGNoZWNrIGZvciBsaWJtLCBmb3Igc2luKCkKK0xUX0xJQl9NCitBQ19TVUJTVChMSUJNKQorCitBQ19DSEVDS19GVU5DUyhjbG9ja19nZXR0aW1lLCBbXSwgWworICBBQ19DSEVDS19MSUIocnQsIGNsb2NrX2dldHRpbWUsIFsKKyAgICBBQ19ERUZJTkUoSEFWRV9DTE9DS19HRVRUSU1FLCAxKQorICAgIExJQlJUPSItbHJ0IgorICAgIEFDX1NVQlNUKFtMSUJSVF0pCisgIF0pCitdKQorCitkbmwgY2hlY2sgZm9yIHB0aHJlYWRzCitBWF9QVEhSRUFECisKK2RubCAqKiogY2hlY2tzIGZvciBoZWFkZXIgZmlsZXMgKioqCisKK2RubCBjaGVjayBpZiB3ZSBoYXZlIEFOU0kgQyBoZWFkZXIgZmlsZXMKK0FDX0hFQURFUl9TVERDCisKK2RubCB1c2VkIGJ5IGV4dC93YXZwYWNrCitBWF9DUkVBVEVfU1RESU5UX0gKKworZG5sIHVzZWQgaW4gZ3N0L3VkcAorQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3RpbWUuaF0pCisKK2RubCB1c2VkIGluIGdzdC91ZHAKK0FDX0NIRUNLX0hFQURFUlMoW3N5cy9zb2NrZXQuaF0pCisKK2RubCAqKiogY2hlY2tzIGZvciB0eXBlcy9kZWZpbmVzICoqKgorCitkbmwgQ2hlY2sgZm9yIEZJT05SRUFEIGlvY3RsIGRlY2xhcmF0aW9uLiAgVGhpcyBjaGVjayBpcyBuZWVkZWQKK2RubCBmb3IgdGhlIFVEUCBwbHVnaW4gdG8gYnVpbGQgb24gU29sYXJpcworR1NUX0NIRUNLX0ZJT05SRUFECisKK2RubCAqKiogY2hlY2tzIGZvciBzdHJ1Y3R1cmVzICoqKgorCitkbmwgKioqIGNoZWNrcyBmb3IgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzICoqKgorCitkbmwgY2hlY2sgaWYgd2UgaGF2ZSBHQ0MgaW5saW5lLWFzbQorQVNfR0NDX0lOTElORV9BU1NFTUJMWShbSEFWRV9HQ0NfQVNNPXllc10sIFtIQVZFX0dDQ19BU009bm9dKQoraWYgdGVzdCB4JEhBVkVfR0NDX0FTTSA9IHh5ZXMgOyB0aGVuCisgIEFDX0RFRklORShIQVZFX0dDQ19BU00sIDEsCisgICAgW0RlZmluZSBpZiBjb21waWxlciBzdXBwb3J0cyBnY2MgaW5saW5lIGFzc2VtYmx5XSkKK2ZpCitBTV9DT05ESVRJT05BTChIQVZFX0dDQ19BU00sIHRlc3QgIngkSEFWRV9HQ0NfQVNNIiA9ICJ4eWVzIikKKworZG5sICoqKiBjaGVja3MgZm9yIGxpYnJhcnkgZnVuY3Rpb25zICoqKgorCitMSUJTX1NBVkU9JExJQlMKK0xJQlM9IiRMSUJTICRMSUJNIgorQUNfQ0hFQ0tfRlVOQ1MocmludCBzaW5oIGNvc2ggYXNpbmggZnBjbGFzcykKK0xJQlM9JExJQlNfU0FWRQorCitkbmwgQ2hlY2sgd2hldGhlciBpc2luZigpIGlzIGRlZmluZWQgYnkgbWF0aC5oCitBQ19DQUNIRV9DSEVDSyhbZm9yIGlzaW5mXSwgYWNfY3ZfaGF2ZV9pc2luZiwKKyAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbI2luY2x1ZGUgPG1hdGguaD5dXSwgW1tmbG9hdCBmID0gMC4wOyBpbnQgaT1pc2luZihmKV1dKV0sW2FjX2N2X2hhdmVfaXNpbmY9InllcyJdLFthY19jdl9oYXZlX2lzaW5mPSJubyJdKSkKK2lmIHRlc3QgIiRhY19jdl9oYXZlX2lzaW5mIiA9ICJ5ZXMiCit0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfSVNJTkYsIDEsIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGlzaW5mJyBmdW5jdGlvbi5dKQorZmkKKworZG5sIENoZWNrIGZvciBtbWFwIChuZWVkZWQgYnkgZWxlY3RyaWNmZW5jZSBwbHVnaW4pCitBQ19GVU5DX01NQVAKK0FDX0NIRUNLX1NJWkVPRihbb2ZmX3RdKQorQU1fQ09ORElUSU9OQUwoR1NUX0hBVkVfTU1BUCwgdGVzdCAieCRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiA9ICJ4eWVzIikKKworZG5sIENoZWNrIGZvciBtbWFwIChuZWVkZWQgYnkgZWxlY3RyaWNmZW5jZSBwbHVnaW4pCisKK0FDX0NIRUNLX1RZUEUoW3N0cnVjdCBpcF9tcmVxbl0sIFsKKyAgICAgICAgICAgICAgQUNfREVGSU5FKEhBVkVfSVBfTVJFUU4sLCBbRGVmaW5lIGlmIHdlIGhhdmUgc3RydWN0IGlwX21yZXFuXSldLCwKKyAgICAgICAgICAgICAgWyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+XSkKKworZG5sICoqKiBjaGVja3MgZm9yIGRlcGVuZGVuY3kgbGlicmFyaWVzICoqKgorCisKK2RubCBHTGliCitHTElCX1JFUT0yLjQwLjAKK0FHX0dTVF9HTElCX0NIRUNLKFskR0xJQl9SRVFdKQorCitkbmwgT3JjCitPUkNfQ0hFQ0soWzAuNC4xN10pCisKK2RubCBjaGVja3MgZm9yIGdzdHJlYW1lcgorZG5sIHVuaW5zdGFsbGVkIGlzIHNlbGVjdGVkIHByZWZlcmVudGlhbGx5IC0tIHNlZSBwa2ctY29uZmlnKDEpCitBR19HU1RfQ0hFQ0tfR1NUKCRHU1RfQVBJX1ZFUlNJT04sIFskR1NUX1JFUV0sIHllcykKK0FHX0dTVF9DSEVDS19HU1RfQkFTRSgkR1NUX0FQSV9WRVJTSU9OLCBbJEdTVF9SRVFdLCB5ZXMpCitBR19HU1RfQ0hFQ0tfR1NUX0NPTlRST0xMRVIoJEdTVF9BUElfVkVSU0lPTiwgWyRHU1RfUkVRXSwgeWVzKQorQUdfR1NUX0NIRUNLX0dTVF9ORVQoJEdTVF9BUElfVkVSU0lPTiwgWyRHU1RfUkVRXSwgeWVzKQorQUdfR1NUX0NIRUNLX0dTVF9DSEVDSygkR1NUX0FQSV9WRVJTSU9OLCBbJEdTVF9SRVFdLCBubykKK0FHX0dTVF9DSEVDS19HU1RfUExVR0lOU19CQVNFKCRHU1RfQVBJX1ZFUlNJT04sIFskR1NUUEJfUkVRXSwgeWVzKQorCitHU1RfVE9PTFNfRElSPWAkUEtHX0NPTkZJRyAtLXZhcmlhYmxlPXRvb2xzZGlyIGdzdHJlYW1lci0kR1NUX0FQSV9WRVJTSU9OYAoraWYgdGVzdCAteiAkR1NUX1RPT0xTX0RJUjsgdGhlbgorICBBQ19NU0dfRVJST1IoW25vIHRvb2xzIGRpciBkZWZpbmVkIGluIEdTdHJlYW1lciBwa2ctY29uZmlnIGZpbGU7IGNvcmUgdXBncmFkZSBuZWVkZWQuXSkKK2ZpCitBQ19TVUJTVChHU1RfVE9PTFNfRElSKQorCitBQ19NU0dfTk9USUNFKFVzaW5nIEdTdHJlYW1lciBDb3JlIFBsdWdpbnMgaW4gJEdTVF9QTFVHSU5TX0RJUikKK0FDX01TR19OT1RJQ0UoVXNpbmcgR1N0cmVhbWVyIEJhc2UgUGx1Z2lucyBpbiAkR1NUUEJfUExVR0lOU19ESVIpCisKK0FHX0dTVF9QS0dfQ0hFQ0tfTU9EVUxFUyhHU1RfR0wsIGdzdHJlYW1lci1nbC1bJEdTVF9BUElfVkVSU0lPTl0sIFskR1NUX1JFUV0sIG5vKQorCitkbmwgRklYTUU6IGlmIHVuaW5zdGFsbGVkIHNldHVwIHdlIG1pZ2h0IG5vdCB3YW50IHRvIHBpY2sgdXAgYW4gaW5zdGFsbGVkIGdzdC1nbD8KK2lmIHRlc3QgIngkSEFWRV9HU1RfR0wiID0gInh5ZXMiOyB0aGVuCisKKyAgQUNfTVNHX0NIRUNLSU5HKFtHU3RyZWFtZXIgT3BlbkdMIHdpbmRvdyBzeXN0ZW1zIC4uLl0pCisgIEdTVF9HTF9XSU5TWVM9YCRQS0dfQ09ORklHIC0tdmFyaWFibGU9Z2xfd2luc3lzIGdzdHJlYW1lci1nbC0xLjBgCisgIEFDX01TR19SRVNVTFQoWyRHU1RfR0xfV0lOU1lTXSkKKyAgR1NUX0dMX0hBVkVfV0lORE9XX1gxMT0iIgorICBHU1RfR0xfSEFWRV9XSU5ET1dfV0FZTEFORD0iIgorICBHU1RfR0xfSEFWRV9XSU5ET1dfQU5EUk9JRD0iIgorICBHU1RfR0xfSEFWRV9XSU5ET1dfQ09DT0E9IiIKKyAgR1NUX0dMX0hBVkVfV0lORE9XX0VBR0w9IiIKKyAgY2FzZSAiJEdTVF9HTF9XSU5TWVMiIGluICAqeDExKikgR1NUX0dMX0hBVkVfV0lORE9XX1gxMT0iMSIgOzsgZXNhYworICBjYXNlICIkR1NUX0dMX1dJTlNZUyIgaW4gICp3YXlsYW5kKikgR1NUX0dMX0hBVkVfV0lORE9XX1dBWUxBTkQ9IjEiIDs7IGVzYWMKKyAgY2FzZSAiJEdTVF9HTF9XSU5TWVMiIGluICAqYW5kcm9pZCopIEdTVF9HTF9IQVZFX1dJTkRPV19BTkRST0lEPSIxIiA7OyBlc2FjCisgIGNhc2UgIiRHU1RfR0xfV0lOU1lTIiBpbiAgKmNvY29hKikgR1NUX0dMX0hBVkVfV0lORE9XX0NPQ09BPSIxIiA7OyBlc2FjCisgIGNhc2UgIiRHU1RfR0xfV0lOU1lTIiBpbiAgKmVhZ2wqKSBHU1RfR0xfSEFWRV9XSU5ET1dfRUFHTD0iMSIgOzsgZXNhYworCisgIEFDX01TR19DSEVDS0lORyhbR1N0cmVhbWVyIE9wZW5HTCBwbGF0Zm9ybXMgLi4uXSkKKyAgR1NUX0dMX1BMQVRGT1JNUz1gJFBLR19DT05GSUcgLS12YXJpYWJsZT1nbF9wbGF0Zm9ybXMgZ3N0cmVhbWVyLWdsLTEuMGAKKyAgQUNfTVNHX1JFU1VMVChbJEdTVF9HTF9QTEFURk9STVNdKQorICBHU1RfR0xfSEFWRV9QTEFURk9STV9HTFg9IiIKKyAgR1NUX0dMX0hBVkVfUExBVEZPUk1fRUdMPSIiCisgIEdTVF9HTF9IQVZFX1BMQVRGT1JNX0NHTD0iIgorICBHU1RfR0xfSEFWRV9QTEFURk9STV9FQUdMPSIiCisgIGNhc2UgIiRHU1RfR0xfUExBVEZPUk1TIiBpbiAgKmdseCopIEdTVF9HTF9IQVZFX1BMQVRGT1JNX0dMWD0iMSIgOzsgZXNhYworICBjYXNlICIkR1NUX0dMX1BMQVRGT1JNUyIgaW4gICplZ2wqKSBHU1RfR0xfSEFWRV9QTEFURk9STV9FR0w9IjEiIDs7IGVzYWMKKyAgY2FzZSAiJEdTVF9HTF9QTEFURk9STVMiIGluICAqY2dsKikgR1NUX0dMX0hBVkVfUExBVEZPUk1fQ0dMPSIxIiA7OyBlc2FjCisgIGNhc2UgIiRHU1RfR0xfUExBVEZPUk1TIiBpbiAgKmVhZ2wqKSBHU1RfR0xfSEFWRV9QTEFURk9STV9FQUdMPSIxIiA7OyBlc2FjCisKKyAgQUNfTVNHX0NIRUNLSU5HKFtHU3RyZWFtZXIgT3BlbkdMIGFwaXMgLi4uXSkKKyAgR1NUX0dMX0FQSVM9YCRQS0dfQ09ORklHIC0tdmFyaWFibGU9Z2xfYXBpcyBnc3RyZWFtZXItZ2wtMS4wYAorICBBQ19NU0dfUkVTVUxUKFskR1NUX0dMX0FQSVNdKQorICBHU1RfR0xfSEFWRV9BUElfR0xFUzI9IiIKKyAgR1NUX0dMX0hBVkVfQVBJX0dMPSIiCisgIGNhc2UgIiRHU1RfR0xfQVBJUyIgaW4gICpnbGVzMiopIEdTVF9HTF9IQVZFX0FQSV9HTEVTMj0iMSIgOzsgZXNhYworICBjYXNlICIkR1NUX0dMX0FQSVMiIGluICJnbCJ8ImdsICIqfCoiIGdsInwqIiBnbCAiKikgR1NUX0dMX0hBVkVfQVBJX0dMPSIxIiA7OyBlc2FjCitmaQorCitBTV9DT05ESVRJT05BTChIQVZFX0dTVF9DSEVDSywgdGVzdCAieCRIQVZFX0dTVF9DSEVDSyIgPSAieHllcyIpCisKK2RubCBDaGVjayBmb3IgZG9jdW1lbnRhdGlvbiB4cmVmcworR0xJQl9QUkVGSVg9ImAkUEtHX0NPTkZJRyAtLXZhcmlhYmxlPXByZWZpeCBnbGliLTIuMGAiCitHU1RfUFJFRklYPSJgJFBLR19DT05GSUcgLS12YXJpYWJsZT1wcmVmaXggZ3N0cmVhbWVyLSRHU1RfQVBJX1ZFUlNJT05gIgorR1NUUEJfUFJFRklYPSJgJFBLR19DT05GSUcgLS12YXJpYWJsZT1wcmVmaXggZ3N0cmVhbWVyLXBsdWdpbnMtYmFzZS0kR1NUX0FQSV9WRVJTSU9OYCIKK0FDX1NVQlNUKEdMSUJfUFJFRklYKQorQUNfU1VCU1QoR1NUX1BSRUZJWCkKK0FDX1NVQlNUKEdTVFBCX1BSRUZJWCkKKworZG5sIEdUSyBpcyBvcHRpb25hbCBhbmQgdXNlZCBpbiBleGFtcGxlcworSEFWRV9HVEs9bm8KK0dUS19SRVE9My4wLjAKK2lmIHRlc3QgIngkQlVJTERfRVhBTVBMRVMiID0gInh5ZXMiOyB0aGVuCisgIFBLR19DSEVDS19NT0RVTEVTKEdUSywgZ3RrKy0zLjAgPj0gJEdUS19SRVEsIEhBVkVfR1RLPXllcywgSEFWRV9HVEs9bm8pCisgIGRubCBzb21lIGV4YW1wbGVzIG5lZWQgZ3RrKy14MTEKKyAgUEtHX0NIRUNLX01PRFVMRVMoR1RLX1gxMSwgZ3RrKy14MTEtMy4wID49ICRHVEtfUkVRLCBIQVZFX0dUS19YMTE9eWVzLCBIQVZFX0dUS19YMTE9bm8pCisgIEFDX1NVQlNUKEdUS19MSUJTKQorICBBQ19TVUJTVChHVEtfQ0ZMQUdTKQorZmkKK0FNX0NPTkRJVElPTkFMKEhBVkVfR1RLLCB0ZXN0ICJ4JEhBVkVfR1RLIiA9ICJ4eWVzIikKK0FNX0NPTkRJVElPTkFMKEhBVkVfR1RLX1gxMSwgdGVzdCAieCRIQVZFX0dUS19YMTEiID0gInh5ZXMiKQorCitkbmwgQ2hlY2sgZm9yIC1Cc3ltYm9saWMtZnVuY3Rpb25zIGxpbmtlciBmbGFnIHVzZWQgdG8gYXZvaWQKK2RubCBpbnRyYS1saWJyYXJ5IFBMVCBqdW1wcywgaWYgYXZhaWxhYmxlLgorQUNfQVJHX0VOQUJMRShCc3ltYm9saWMsCisgICAgICAgICAgICAgIFtBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLUJzeW1ib2xpY10sW2F2b2lkIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljXSldLCwKKyAgICAgICAgICAgICAgW1NBVkVEX0xERkxBR1M9IiR7TERGTEFHU30iIFNBVkVEX0xJQlM9IiR7TElCU30iCisgICAgICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAtQnN5bWJvbGljLWZ1bmN0aW9ucyBsaW5rZXIgZmxhZ10pCisgICAgICAgICAgICAgICBMREZMQUdTPS1XbCwtQnN5bWJvbGljLWZ1bmN0aW9ucworICAgICAgICAgICAgICAgTElCUz0KKyAgICAgICAgICAgICAgIEFDX1RSWV9MSU5LKFtdLCBbcmV0dXJuIDBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVfQnN5bWJvbGljPXllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQobm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVfQnN5bWJvbGljPW5vKQorICAgICAgICAgICAgICAgTERGTEFHUz0iJHtTQVZFRF9MREZMQUdTfSIgTElCUz0iJHtTQVZFRF9MSUJTfSJdKQorCitkbmwgKioqIHNldCB2YXJpYWJsZXMgYmFzZWQgb24gY29uZmlndXJlIGFyZ3VtZW50cyAqKioKKworZG5sIHNldCBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlCitHU1RfTElDRU5TRT0iTEdQTCIKK0FDX0RFRklORV9VTlFVT1RFRChHU1RfTElDRU5TRSwgIiRHU1RfTElDRU5TRSIsIFtHU3RyZWFtZXIgbGljZW5zZV0pCitBQ19TVUJTVChHU1RfTElDRU5TRSkKKworZG5sIHNldCBsb2NhdGlvbiBvZiBwbHVnaW4gZGlyZWN0b3J5CitBR19HU1RfU0VUX1BMVUdJTkRJUgorCitkbmwgc2V0IHJlbGVhc2UgZGF0ZS90aW1lCitBR19HU1RfU0VUX1BBQ0tBR0VfUkVMRUFTRV9EQVRFVElNRV9XSVRIX05BTk8oWyRQQUNLQUdFX1ZFUlNJT05fTkFOT10sCisgIFsiJHtzcmNkaXJ9L2dzdC1wbHVnaW5zLWdvb2QuZG9hcCJdLAorICBbJFBBQ0tBR0VfVkVSU0lPTl9NQUpPUi4kUEFDS0FHRV9WRVJTSU9OX01JTk9SLiRQQUNLQUdFX1ZFUlNJT05fTUlDUk9dKQorCisjIHNldCBieSBBR19HU1RfUEFSU0VfU1VCU1lTVEVNX0RJU0FCTEVTIGFib3ZlCitkbmwgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgY29tcGxhaW4gYWJvdXQgdW51c2VkIHZhcmlhYmxlcyBpZiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQKK05PX1dBUk5JTkdTPSIiCitBR19HU1RfQ0hFQ0tfR1NUX0RFQlVHX0RJU0FCTEVEKFtOT19XQVJOSU5HUz0iLVduby11bnVzZWQiXSwgW05PX1dBUk5JTkdTPSIiXSkKKworZG5sIGRlZmluZSBhbiBFUlJPUl9DRkxBR1MgTWFrZWZpbGUgdmFyaWFibGUKK2RubCAtV3VuZGVmOiB0b28gbWFueSBicm9rZW4gaGVhZGVycworQUdfR1NUX1NFVF9FUlJPUl9DRkxBR1MoJEZBVEFMX1dBUk5JTkdTLCBbCisgICAgICAtV21pc3NpbmctZGVjbGFyYXRpb25zIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XcmVkdW5kYW50LWRlY2xzCisgICAgICAtV3dyaXRlLXN0cmluZ3MgLVdvbGQtc3R5bGUtZGVmaW5pdGlvbiAtV2FnZ3JlZ2F0ZS1yZXR1cm4KKyAgICAgIC1XaW5pdC1zZWxmIC1XbWlzc2luZy1pbmNsdWRlLWRpcnMgLVdhZGRyZXNzIC1Xbm8tbXVsdGljaGFyCisgICAgICAtV25lc3RlZC1leHRlcm5zICROT19XQVJOSU5HU10pCisKK2RubCBkZWZpbmUgYW4gRVJST1JfQ1hYRkxBR1MgTWFrZWZpbGUgdmFyaWFibGUKK0FHX0dTVF9TRVRfRVJST1JfQ1hYRkxBR1MoJEZBVEFMX1dBUk5JTkdTLCBbCisgICAgICAgIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVdyZWR1bmRhbnQtZGVjbHMKKyAgICAgICAgLVd3cml0ZS1zdHJpbmdzCisgICAgICAgIC1XaW5pdC1zZWxmIC1XbWlzc2luZy1pbmNsdWRlLWRpcnMgLVdhZGRyZXNzIC1Xbm8tbXVsdGljaGFyCisgICAgICAgICROT19XQVJOSU5HU10pCisKK2RubCBkZWZpbmUgYW4gRVJST1JfT0JKQ0ZMQUdTIE1ha2VmaWxlIHZhcmlhYmxlCitBR19HU1RfU0VUX0VSUk9SX09CSkNGTEFHUygkRkFUQUxfV0FSTklOR1MsIFsKKyAgICAgIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdyZWR1bmRhbnQtZGVjbHMKKyAgICAgIC1Xd3JpdGUtc3RyaW5ncyAtV29sZC1zdHlsZS1kZWZpbml0aW9uCisgICAgICAtV2luaXQtc2VsZiAtV21pc3NpbmctaW5jbHVkZS1kaXJzIC1Xbm8tbXVsdGljaGFyCisgICAgICAtV25lc3RlZC1leHRlcm5zICROT19XQVJOSU5HU10pCisKK2RubCBkZWZpbmUgY29ycmVjdCBsZXZlbCBmb3IgZGVidWdnaW5nIG1lc3NhZ2VzCitBR19HU1RfU0VUX0xFVkVMX0RFRkFVTFQoJEdTVF9HSVQpCisKK2RubCB1c2VkIGluIGV4YW1wbGVzCitBR19HU1RfREVGQVVMVF9FTEVNRU5UUworCitkbmwgKioqIHBsdWctaW5zIHRvIGluY2x1ZGUgKioqCisKK2RubCB0aGVzZSBhcmUgYWxsIHRoZSBnc3QgcGx1Zy1pbnMsIGNvbXBpbGFibGUgd2l0aG91dCBhZGRpdGlvbmFsIGxpYnMKK2RubCB2aWRlb2ZpbHRlciBpcyBhdCB0aGUgdG9wIGJlY2F1c2Ugb3RoZXJzIGRlcGVuZCBvbiBpdAorQUdfR1NUX0NIRUNLX1BMVUdJTihhbHBoYSkKK0FHX0dTVF9DSEVDS19QTFVHSU4oYXBldGFnKQorQUdfR1NUX0NIRUNLX1BMVUdJTihhdWRpb2Z4KQorQUdfR1NUX0NIRUNLX1BMVUdJTihhdWRpb3BhcnNlcnMpCitBR19HU1RfQ0hFQ0tfUExVR0lOKGF1cGFyc2UpCitBR19HU1RfQ0hFQ0tfUExVR0lOKGF1dG9kZXRlY3QpCitBR19HU1RfQ0hFQ0tfUExVR0lOKGF2aSkKK0FHX0dTVF9DSEVDS19QTFVHSU4oY3V0dGVyKQorQUdfR1NUX0NIRUNLX1BMVUdJTihkZWJ1Z3V0aWxzKQorQUdfR1NUX0NIRUNLX1BMVUdJTihkZWludGVybGFjZSkKK0FHX0dTVF9DSEVDS19QTFVHSU4oZHRtZikKK0FHX0dTVF9DSEVDS19QTFVHSU4oZWZmZWN0dikKK0FHX0dTVF9DSEVDS19QTFVHSU4oZXF1YWxpemVyKQorQUdfR1NUX0NIRUNLX1BMVUdJTihmbHYpCitBR19HU1RfQ0hFQ0tfUExVR0lOKGZseCkKK0FHX0dTVF9DSEVDS19QTFVHSU4oZ29vbSkKK0FHX0dTVF9DSEVDS19QTFVHSU4oZ29vbTJrMSkKK0FHX0dTVF9DSEVDS19QTFVHSU4oaWN5ZGVtdXgpCitBR19HU1RfQ0hFQ0tfUExVR0lOKGlkM2RlbXV4KQorQUdfR1NUX0NIRUNLX1BMVUdJTihpbWFnZWZyZWV6ZSkKK0FHX0dTVF9DSEVDS19QTFVHSU4oaW50ZXJsZWF2ZSkKK0FHX0dTVF9DSEVDS19QTFVHSU4oaXNvbXA0KQorQUdfR1NUX0NIRUNLX1BMVUdJTihsYXcpCitBR19HU1RfQ0hFQ0tfUExVR0lOKGxldmVsKQorQUdfR1NUX0NIRUNLX1BMVUdJTihtYXRyb3NrYSkKK0FHX0dTVF9DSEVDS19QTFVHSU4obW9ub3Njb3BlKQorQUdfR1NUX0NIRUNLX1BMVUdJTihtdWx0aWZpbGUpCitBR19HU1RfQ0hFQ0tfUExVR0lOKG11bHRpcGFydCkKK0FHX0dTVF9DSEVDS19QTFVHSU4ocmVwbGF5Z2FpbikKK0FHX0dTVF9DSEVDS19QTFVHSU4ocnRwKQorQUdfR1NUX0NIRUNLX1BMVUdJTihydHBtYW5hZ2VyKQorQUdfR1NUX0NIRUNLX1BMVUdJTihydHNwKQorQUdfR1NUX0NIRUNLX1BMVUdJTihzaGFwZXdpcGUpCitBR19HU1RfQ0hFQ0tfUExVR0lOKHNtcHRlKQorQUdfR1NUX0NIRUNLX1BMVUdJTihzcGVjdHJ1bSkKK0FHX0dTVF9DSEVDS19QTFVHSU4odWRwKQorQUdfR1NUX0NIRUNLX1BMVUdJTih2aWRlb2JveCkKK0FHX0dTVF9DSEVDS19QTFVHSU4odmlkZW9jcm9wKQorQUdfR1NUX0NIRUNLX1BMVUdJTih2aWRlb2ZpbHRlcikKK0FHX0dTVF9DSEVDS19QTFVHSU4odmlkZW9taXhlcikKK0FHX0dTVF9DSEVDS19QTFVHSU4od2F2ZW5jKQorQUdfR1NUX0NIRUNLX1BMVUdJTih3YXZwYXJzZSkKK0FHX0dTVF9DSEVDS19QTFVHSU4oeTRtKQorCitkbmwgZGlzYWJsZSBleHBlcmltZW50YWwgcGx1Zy1pbnMKK2lmIHRlc3QgIngkQlVJTERfRVhQRVJJTUVOVEFMIiAhPSAieHllcyI7IHRoZW4KKyAgQUdfR1NUX0RJU0FCTEVfUExVR0lOKG1vbm9zY29wZSkKK2ZpCisKK2RubCAqKiogc3lzIHBsdWctaW5zICoqKgorCitlY2hvCitBQ19NU0dfTk9USUNFKFtDaGVja2luZyBsaWJyYXJpZXMgZm9yIHBsdWdpbnMgaW4gc3lzL10pCitlY2hvCisKK2RubCBEaXJlY3RTb3VuZAordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfRElSRUNUU09VTkQsIHRydWUpCitBR19HU1RfQ0hFQ0tfRkVBVFVSRShESVJFQ1RTT1VORCwgW0RpcmVjdFNvdW5kIHBsdWctaW5dLCBkaXJlY3Rzb3VuZHNpbmssIFsKKyAgSEFWRV9ESVJFQ1RTT1VORD0ibm8iCisgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICBzYXZlX0xJQlM9IiRMSUJTIgorICBDRkxBR1M9IiRDRkxBR1MgJERJUkVDVFNPVU5EX0NGTEFHUyIKKyAgTERGTEFHUz0iJExERkxBR1MgJERJUkVDVFNPVU5EX0xERkxBR1MiCisgIExJQlM9IiRMSUJTIC1sZHNvdW5kIC1sZHhlcnI5IC1sdXNlcjMyIC1sb2xlMzIiCisgIEFDX01TR19DSEVDS0lORyhmb3IgRGlyZWN0U291bmQgTERGTEFHUykKKyAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxkeGVycjkuaD4KKyNpbmNsdWRlIDxkc291bmQuaD4KK11dLCBbWworICBEWEdldEVycm9yU3RyaW5nOSAoMCk7CisgIERpcmVjdFNvdW5kQ3JlYXRlKE5VTEwsIE5VTEwsIE5VTEwpOworICBDTFNJREZyb21TdHJpbmcoTlVMTCwgTlVMTCk7CitdXSkKK10sCisgICAgW0hBVkVfRElSRUNUU09VTkQ9InllcyJdLAorICAgIFtIQVZFX0RJUkVDVFNPVU5EPSJubyJdKQorICBBQ19NU0dfUkVTVUxUKCRIQVZFX0RJUkVDVFNPVU5EKQorICBDRkxBR1M9JHNhdmVfQ0ZMQUdTCisgIExERkxBR1M9JHNhdmVfTERGTEFHUworICBMSUJTPSRzYXZlX0xJQlMKKworICBpZiB0ZXN0ICJ4JEhBVkVfRElSRUNUU09VTkQiID0gInh5ZXMiOyAgdGhlbgorICAgIGRubCB0aGlzIGlzIG11Y2ggbW9yZSB0aGFuIHdlIHdhbnQKKyAgICBESVJFQ1RTT1VORF9MSUJTPSItbGRzb3VuZCAtbGR4ZXJyOSAtbHVzZXIzMiAtbG9sZTMyIgorICAgIEFDX1NVQlNUKERJUkVDVFNPVU5EX0NGTEFHUykKKyAgICBBQ19TVUJTVChESVJFQ1RTT1VORF9MREZMQUdTKQorICAgIEFDX1NVQlNUKERJUkVDVFNPVU5EX0xJQlMpCisgIGZpCisgIEFDX1NVQlNUKEhBVkVfRElSRUNUU09VTkQpCitdKQorCitkbmwgKioqIFdpbjMyIFdhdmVPdXQgKioqCit0cmFuc2xpdChkbm0sIG0sIGwpIEFNX0NPTkRJVElPTkFMKFVTRV9XQVZFRk9STSwgdHJ1ZSkKK0FHX0dTVF9DSEVDS19GRUFUVVJFKFdBVkVGT1JNLCBbV2luMzIgV2F2ZUZvcm1dLCB3YXZlZm9ybXNpbmssIFsKKyAgQUNfQ0hFQ0tfSEVBREVSKG1tc3lzdGVtLmgsIEhBVkVfV0FWRUZPUk09InllcyIsIEhBVkVfV0FWRUZPUk09Im5vIiwgWyNpbmNsdWRlIDx3aW5kb3dzLmg+XSkKK10pCisKK2RubCAqKiogT1NTIGF1ZGlvICoqKiAoTGludXgsICpCU0QpCit0cmFuc2xpdChkbm0sIG0sIGwpIEFNX0NPTkRJVElPTkFMKFVTRV9PU1MsIHRydWUpCitBR19HU1RfQ0hFQ0tfRkVBVFVSRShPU1MsIFtPU1MgYXVkaW9dLCBvc3NhdWRpbywgWworIEhBVkVfT1NTPSJ5ZXMiCitkbmwgTGludXggYW5kIG5ld2VyIEJTRCB2ZXJzaW9ucyA6CisgQUNfQ0hFQ0tfSEVBREVSKHN5cy9zb3VuZGNhcmQuaCwgWworICAgQUNfREVGSU5FKEhBVkVfT1NTX0lOQ0xVREVfSU5fU1lTLCwgW0RlZmluZSBpZiBPU1MgaW5jbHVkZXMgYXJlIGluIC9zeXMvXSkKKyAgIF0gLCBbCitkbmwgU29tZSBvbGQgQlNEIHZlcnNpb25zIGFuZCBhbHNvIG5ld2VyIE9wZW5CU0QgdmVyc2lvbnMgOgorICAgQUNfQ0hFQ0tfSEVBREVSKHNvdW5kY2FyZC5oLCBbCisgICAgIEFDX0RFRklORShIQVZFX09TU19JTkNMVURFX0lOX1JPT1QsLCBbRGVmaW5lIGlmIE9TUyBpbmNsdWRlcyBhcmUgaW4gL10pCisgICAgIF0sIFsKKyAgZG5sIFNvbWUgb2xkIEJTRCB2ZXJzaW9ucyA6CisgICAgIEFDX0NIRUNLX0hFQURFUihtYWNoaW5lL3NvdW5kY2FyZC5oLCBbCisgICAgICAgQUNfREVGSU5FKEhBVkVfT1NTX0lOQ0xVREVfSU5fTUFDSElORSwsCisgICAgICAgICBbRGVmaW5lIGlmIE9TUyBpbmNsdWRlcyBhcmUgaW4gL21hY2hpbmUvXSkKKyAgICAgICBdLCBbCisgICAgICAgSEFWRV9PU1M9Im5vIgorICAgICBdKQorICAgXSkKKyBdKQorXSkKKworZG5sICoqKiBvc3M0ICoqKgordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfT1NTNCwgdHJ1ZSkKK0FHX0dTVF9DSEVDS19GRUFUVVJFKE9TUzQsIFtPcGVuIFNvdW5kIFN5c3RlbSA0XSwgb3NzNCwgWworICBBQ19NU0dfQ0hFQ0tJTkcoW0NoZWNraW5nIGlmIHdlIGNhbiBidWlsZCB0aGUgT1NTNCBlbGVtZW50c10pCisgIEFDX0NIRUNLX0hFQURFUlMoW2ZjbnRsLmggc3lzL2lvY3RsLmggc3lzL3N0YXQuaCBzeXMvdHlwZXMuaF0sCisgICAgICBbdGVzdCAteiAiJE9TUzRfTUlTU0lOR19IRUFERVIiICYmIEhBVkVfT1NTND0ieWVzIl0sCisgICAgICBbT1NTNF9NSVNTSU5HX0hFQURFUj0ieWVzIjtIQVZFX09TUzQ9Im5vIl0pCitdKQorCitkbmwgKioqIE9TWCBBdWRpbyAqKioKK3RyYW5zbGl0KGRubSwgbSwgbCkgQU1fQ09ORElUSU9OQUwoVVNFX09TWF9BVURJTywgdHJ1ZSkKK0hBVkVfSU9TPSJubyIKK0FHX0dTVF9DSEVDS19GRUFUVVJFKE9TWF9BVURJTywgW09TWCBhdWRpb10sIG9zeGF1ZGlvLCBbCisgIEFDX0NIRUNLX0hFQURFUihDb3JlQXVkaW8vQ29yZUF1ZGlvLmgsCisgICAgW0hBVkVfT1NYX0FVRElPPSJ5ZXMiXSwKKyAgICBbQUNfQ0hFQ0tfSEVBREVSKENvcmVBdWRpby9Db3JlQXVkaW9UeXBlcy5oLAorICAgIFsKKyAgICAgIEhBVkVfT1NYX0FVRElPPSJ5ZXMiCisgICAgICBIQVZFX0lPUz0ieWVzIgorICAgIF0sIFsKKyAgICAgIEhBVkVfT1NYX0FVRElPPSJubyIKKyAgICAgIEhBVkVfSU9TPSJubyIKKyAgICBdKV0KKyAgKQorXSkKK2lmIHRlc3QgIngkSEFWRV9JT1MiID0gInh5ZXMiOyB0aGVuCisgIEFDX0RFRklORShIQVZFX0lPUywgMSwgW2J1aWxkaW5nIGZvciBpT1MgcGxhdG9mcm1dKQorZmkKK0FNX0NPTkRJVElPTkFMKEhBVkVfSU9TLCB0ZXN0ICJ4JEhBVkVfSU9TIiA9ICJ4eWVzIikKKworZG5sICoqKiBPUyBYIHZpZGVvICoqKgordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfT1NYX1ZJREVPLCB0cnVlKQorSEFWRV9PU1hfVklERU89Im5vIgorQUdfR1NUX0NIRUNLX0ZFQVRVUkUoT1NYX1ZJREVPLCBbT1NYIHZpZGVvXSwgb3N4dmlkZW9zaW5rLCBbCisgIEFDX0NIRUNLX0hFQURFUihPcGVuR0wvZ2wuaCwgSEFWRV9PU1hfVklERU89InllcyIsIEhBVkVfT1NYX1ZJREVPPSJubyIpCisKKyAgZG5sIGluIGNhc2UgaGVhZGVyIE9wZW5HTC9nbC5oIGlzIGZvdW5kIG9uIG90aGVyIHBsYXRmb3JtcyAob3Igb2xkZXIsIHVuc3VwcG9ydGVkIE9TIFgpCisgIGRubCBhbHNvIHJlcXVpcmUgU25vdyBMZW9wYXJkIG9yIG5ld2VyCisKKyAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworICAgICAgICAjaW5jbHVkZSA8QXZhaWxhYmlsaXR5TWFjcm9zLmg+CisgICAgICAgICNpZiBNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8IDEwNjAKKyAgICAgICAgI2Vycm9yIFRvbyBvbGQgT1NYIHZlcnNpb24KKyAgICAgICAgI2VuZGlmCisgICAgICBdXSwgW1tyZXR1cm4gMDtdXSldLFtIQVZFX09TWF9WSURFTz0ieWVzIl0sW0hBVkVfT1NYX1ZJREVPPSJubyJdKQorXSkKKworZG5sICoqKiBWaWRlbyA0IExpbnV4IDIgKioqCitkbmwgcmVuYW1lZCB0byBHU1RfVjRMMiBiZWNhdXNlIG9mIHNvbWUgY29uZmxpY3Qgd2l0aCBrZXJuZWwgaGVhZGVycwordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfR1NUX1Y0TDIsIHRydWUpCitIQVZFX0dTVF9WNEwyPW5vCitBR19HU1RfQ0hFQ0tfRkVBVFVSRShHU1RfVjRMMiwgW1ZpZGVvIDQgTGludXggMl0sIHZpZGVvNGxpbnV4MiwgWworICBBQ19NU0dfQ0hFQ0tJTkcoW0NoZWNraW5nIGZvciB2aWRlbzRsaW51eDIgaGVhZGVyIC4uLl0pCisgIEFDX0NIRUNLX0hFQURFUihsaW51eC92aWRlb2RldjIuaCwgWyBIQVZFX0dTVF9WNEwyPXllcyBdLAorICBbCisgICAgQUNfQ0hFQ0tfSEVBREVSKHN5cy92aWRlb2RldjIuaCwgWyBIQVZFX0dTVF9WNEwyPXllcyBdLAorICAgIFsKKyAgICAgIEFDX0NIRUNLX0hFQURFUihzeXMvdmlkZW9pby5oLCBbIEhBVkVfR1NUX1Y0TDI9eWVzIF0pCisgICAgXSkKKyAgXSkKKyAgaWYgdGVzdCAieCRIQVZFX1ZJREVPREVWIiA9ICJ4bm8iOyB0aGVuCisgICAgIEFDX01TR19XQVJOKFt2aWRlbzRsaW51eDIgd2FzIG5vdCBmb3VuZF0pCisgIGZpCitdKQorCisjIE9wdGlvbmFsIGd1ZGV2IGZvciBkZXZpY2UgcHJvYmluZworQUNfQVJHX1dJVEgoW2d1ZGV2XSwKKyAgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1ndWRldl0sW2RldmljZSBkZXRlY3Rpb24gd2l0aCBndWRldl0pLAorICBbXSwKKyAgW3dpdGhfZ3VkZXY9Y2hlY2tdKQoraWYgdGVzdCB4JEhBVkVfR1NUX1Y0TDIgPSB4eWVzOyB0aGVuCisgIGlmIHRlc3QgeCR3aXRoX2d1ZGV2ICE9IHhubzsgdGhlbgorICAgIFBLR19DSEVDS19NT0RVTEVTKEdVREVWLCBbIGd1ZGV2LTEuMCA+PSAxNDcgXSwKKyAgICAgIFsgQUNfREVGSU5FKEhBVkVfR1VERVYsIDEsCisgICAgICAgICAgW1doZXRoZXIgZ3VkZXYgaXMgYXZhaWxhYmxlIGZvciBkZXZpY2UgZGV0ZWN0aW9uXSkKKyAgICAgIF0sCisgICAgICBbdHJ1ZV0pCisgIGZpCitmaQorCitBQ19TVUJTVChHVURFVl9DRkxBR1MpCitBQ19TVUJTVChHVURFVl9MSUJTKQorCisjIE1ha2UgbGlidjRsMiBub24tYXV0b21hZ2ljCitBQ19BUkdfV0lUSChbbGlidjRsMl0sCisgIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtbGlidjRsMl0sW3N1cHBvcnQgdmlkZW8gYnVmZmVyIGNvbnZlcnNpb24gdXNpbmcgbGlidjRsMl0pLAorICBbXSwKKyAgW3dpdGhfbGlidjRsMj1jaGVja10pCitpZiB0ZXN0IHgkSEFWRV9HU1RfVjRMMiA9IHh5ZXM7IHRoZW4KKyAgaWYgdGVzdCB4JHdpdGhfbGlidjRsMiAhPSB4bm87IHRoZW4KKyAgICAgIFBLR19DSEVDS19NT0RVTEVTKExJQlY0TDIsIGxpYnY0bDIsCisgICAgICAgICAgWyBoYXZlX2xpYnY0bDI9eWVzCisgICAgICAgICAgICBBQ19ERUZJTkUoSEFWRV9MSUJWNEwyLCAxLAorCSAgICAgICAgW1doZXRoZXIgbGlidjRsMiBpcyBhdmFpbGFibGUgZm9yIHZpZGVvIGJ1ZmZlciBjb252ZXJzaW9uXSkKKyAgICAgICAgICBdLCBbCisgICAgICAgICAgaGF2ZV9saWJ2NGwyPW5vCisgICAgICAgICAgXSkKKyAgZWxzZQorICAgIGhhdmVfbGlidjRsMj1ubworICBmaQorZmkKKworZG5sIEFsbG93IGVuYWJsaW5nIHY0bDIgZGV2aWNlIHByb2JpbmcKK0FTX0NBU0UoWyRob3N0XSwKKyAgICBbKi0qbGludXgqXSwKKyAgICAgIFtBU19DQVNFKFskaG9zdF9jcHVdLAorICAgICAgICBbYXJtKl0sIFsKKyAgICAgICAgICBlbmFibGVfdjRsMl9wcm9iZT0ieWVzIl0sCisgICAgICAgIFthYXJjaDY0Kl0sIFsKKyAgICAgICAgICBlbmFibGVfdjRsMl9wcm9iZT0ieWVzIl0pXSkKK0FDX0FSR19FTkFCTEUoCisgIHY0bDItcHJvYmUsCisgIEFDX0hFTFBfU1RSSU5HKAorICAgIFstLWVuYWJsZS12NGwyLXByb2JlXSwKKyAgICBbZW5hYmxlIFY0TDIgcGx1Z2luIHRvIHByb2JlIGRldmljZXMgQDw6QGRlZmF1bHQ9bm9AOj5AXSkpCitpZiB0ZXN0ICJ4JGVuYWJsZV92NGwyX3Byb2JlIiA9ICJ4eWVzIjsgdGhlbgorICBBQ19ERUZJTkUoR1NUX1Y0TDJfRU5BQkxFX1BST0JFLCAxLAorICAgIFtEZWZpbmUgaWYgVmlkZW80TGludXggcHJvYmUgc2hhbGwgYmUgcnVuIGF0IHBsdWdpbiBsb2FkXSkKK2ZpCisKK2RubCBDaGVjayBmb3IgWDExCit0cmFuc2xpdChkbm0sIG0sIGwpIEFNX0NPTkRJVElPTkFMKFVTRV9YLCB0cnVlKQorQUdfR1NUX0NIRUNLX0ZFQVRVUkUoWCwgW1ggbGlicmFyaWVzIGFuZCBwbHVnaW5zXSwKKyAgICAgICAgICAgICAgICAgIFt4aW1hZ2VzcmNdLCBbCisgIFBLR19DSEVDS19NT0RVTEVTKFtYXSwgW3gxMV0sIFsKKyAgICBIQVZFX1g9InllcyIKKyAgICBkbmwgY2hlY2sgZm9yIFhmaXhlcworICAgIFBLR19DSEVDS19NT0RVTEVTKFtYRklYRVNdLCBbIHhmaXhlcyBdLCBbCisgICAgICBBQ19ERUZJTkUoSEFWRV9YRklYRVMsIDEsIFtEZWZpbmVkIGlmIFhmaXhlcyBpcyBhdmFpbGFibGVdKQorICAgIF0sIFsgSEFWRV9YRklYRVM9Im5vIiBdKQorCisgICAgZG5sIGNoZWNrIGZvciBYZGFtYWdlCisgICAgUEtHX0NIRUNLX01PRFVMRVMoW1hEQU1BR0VdLCBbIHhkYW1hZ2UgXSwgWworICAgICAgQUNfREVGSU5FKEhBVkVfWERBTUFHRSwgMSwgW0RlZmluZWQgaWYgWGRhbWFnZSBpcyBhdmFpbGFibGVdKQorICAgIF0sIFsgSEFWRV9YREFNQUdFPSJubyIgXSkKKworICAgIGRubCBjaGVjayBmb3IgWCBTaG0KKyAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhbWEVYVF0sIFsgeGV4dCBdLCBbCisgICAgICBBQ19DSEVDS19MSUIoW1hleHRdLCBbIFhTaG1BdHRhY2ggXSwgWworICAgICAgICBBQ19ERUZJTkUoSEFWRV9YU0hNLCAxLCBbRGVmaW5lZCBpZiBYU2htIGlzIGF2YWlsYWJsZV0pCisgICAgICAgIFhTSE1fTElCUz0iJFhFWFRfTElCUyIKKyAgICAgICAgWFNITV9DRkxBR1M9IiRYRVhUX0NGTEFHUyIKKyAgICAgIF0sIFsgSEFWRV9YRVhUPSJubyIgXSAsIFsgJFhfTElCUyBdKQorICAgIF0pCisgICAgQUNfU1VCU1QoWFNITV9MSUJTKQorICAgIEFDX1NVQlNUKFhTSE1fQ0ZMQUdTKQorICBdLCBbIEhBVkVfWD0ibm8iIF0pCitdKQorCitkbmwgKioqIGV4dCBwbHVnLWlucyAqKioKK2RubCBrZWVwIHRoaXMgbGlzdCBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkgIQorCitpZiB0ZXN0ICJ4JEJVSUxEX0VYVEVSTkFMIiA9ICJ4eWVzIjsgdGhlbgorCitlY2hvCitBQ19NU0dfTk9USUNFKFtDaGVja2luZyBsaWJyYXJpZXMgZm9yIHBsdWdpbnMgaW4gZXh0L10pCitlY2hvCisKK2RubCAqKiogYWFsaWIgKioqCit0cmFuc2xpdChkbm0sIG0sIGwpIEFNX0NPTkRJVElPTkFMKFVTRV9BQUxJQiwgdHJ1ZSkKK0FHX0dTVF9DSEVDS19GRUFUVVJFKEFBTElCLCBbYWFsaWIgQVNDSUkgQXJ0IGxpYnJhcnldLCBhYXNpbmssIFsKKyAgQU1fUEFUSF9BQUxJQigsIEhBVkVfQUFMSUI9eWVzLCBIQVZFX0FBTElCPW5vKQorXSkKKworZG5sICoqKiBjYWlybyAqKioKK3RyYW5zbGl0KGRubSwgbSwgbCkgQU1fQ09ORElUSU9OQUwoVVNFX0NBSVJPLCB0cnVlKQorQUdfR1NUX0NIRUNLX0ZFQVRVUkUoQ0FJUk8sIFtDYWlybyBncmFwaGljcyByZW5kZXJpbmcgYW5kIGdvYmplY3QgYmluZGluZ3NdLCBjYWlybywgWworICBBR19HU1RfUEtHX0NIRUNLX01PRFVMRVMoQ0FJUk8sIGNhaXJvID49IDEuMTAuMCBjYWlyby1nb2JqZWN0ID49IDEuMTAuMCkKK10pCisKK2RubCAqKiogRkxBQyAqKioKK3RyYW5zbGl0KGRubSwgbSwgbCkgQU1fQ09ORElUSU9OQUwoVVNFX0ZMQUMsIHRydWUpCitBR19HU1RfQ0hFQ0tfRkVBVFVSRShGTEFDLCBbRkxBQyBsb3NzbGVzcyBhdWRpb10sIGZsYWMsIFsKKyAgQUdfR1NUX1BLR19DSEVDS19NT0RVTEVTKEZMQUMsIGZsYWMgPj0gMS4xLjQpCitdKQorCitkbmwgKioqIEdESyBwaXhidWYgKioqCit0cmFuc2xpdChkbm0sIG0sIGwpIEFNX0NPTkRJVElPTkFMKFVTRV9HREtfUElYQlVGLCB0cnVlKQorQUdfR1NUX0NIRUNLX0ZFQVRVUkUoR0RLX1BJWEJVRiwgW0dESyBwaXhidWZdLCBnZGtwaXhidWYsIFsKKyAgQUdfR1NUX1BLR19DSEVDS19NT0RVTEVTKEdES19QSVhCVUYsIGdkay1waXhidWYtMi4wID49IDIuOC4wKQorXSkKKworZG5sICoqKiBndGsrICoqKgorSEFWRV9HVEszX0dMPSJubyIKK3RyYW5zbGl0KGRubSwgbSwgbCkgQU1fQ09ORElUSU9OQUwoVVNFX0dUSzMsIHRydWUpCitBR19HU1RfQ0hFQ0tfRkVBVFVSRShHVEszLCBbR3RrKyBlbGVtZW50c10sIGd0aywgWworICBQS0dfQ0hFQ0tfTU9EVUxFUyhHVEszLCBndGsrLTMuMCwgWworICAgIEFDX0RFRklORShbSEFWRV9HVEszXSwgMSwgW0RlZmluZSBpZiBHdGsrIDMuMCBpcyBpbnN0YWxsZWRdKQorICAgIEhBVkVfR1RLMz0ieWVzIgorICBdLCBbCisgICAgSEFWRV9HVEszPSJubyIKKyAgXSkKKyAgUEtHX0NIRUNLX01PRFVMRVMoR1RLM19HTCwgZ3RrKy0zLjAgPj0gMy4xNS4wLCBbCisgICAgR0RLX1dJTkRPV0lORz0ibm8iCisgICAgaWYgdGVzdCAieCRHU1RfR0xfSEFWRV9XSU5ET1dfWDExIiA9ICJ4MSIgLWEgIngkR1NUX0dMX0hBVkVfUExBVEZPUk1fR0xYIiA9ICJ4MSI7IHRoZW4KKyAgICAgIFBLR19DSEVDS19NT0RVTEVTKEdUSzNfWDExLCBndGsrLXgxMS0zLjAsIFsKKyAgICAgICAgR1RLM19DRkxBR1M9IiRHVEszX0NGTEFHUyAkR1RLM19YMTFfQ0ZMQUdTIgorICAgICAgICBHVEszX0xJQlM9IiRHVEszX0xJQlMgJEdUSzNfWDExX0xJQlMiCisgICAgICAgIEdES19XSU5ET1dJTkc9InllcyIKKyAgICAgIF0sIFtBQ19NU0dfTk9USUNFKFtDb3VsZCBub3QgZmluZCBHdGsgWDExIGludGVncmF0aW9uXSldKQorICAgIGZpCisgICAgaWYgdGVzdCAieCRHU1RfR0xfSEFWRV9XSU5ET1dfV0FZTEFORCIgPSAieDEiIC1hICJ4JEdTVF9HTF9IQVZFX1BMQVRGT1JNX0VHTCIgPSAieDEiOyB0aGVuCisgICAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhHVEszX1dBWUxBTkQsIGd0aystd2F5bGFuZC0zLjAsIFsKKyAgICAgICAgR1RLM19DRkxBR1M9IiRHVEszX0NGTEFHUyAkR1RLM19XQVlMQU5EX0NGTEFHUyIKKyAgICAgICAgR1RLM19MSUJTPSIkR1RLM19MSUJTICRHVEszX1dBWUxBTkRfTElCUyIKKyAgICAgICAgR0RLX1dJTkRPV0lORz0ieWVzIgorICAgICAgXSwgW0FDX01TR19OT1RJQ0UoW0NvdWxkIG5vdCBmaW5kIEd0ayBXYXlsYW5kIGludGVncmF0aW9uXSldKQorICAgIGZpCisgICAgaWYgdGVzdCAieCRHREtfV0lORE9XSU5HIiA9ICJ4eWVzIiAtYSAieCRIQVZFX0dTVF9HTCIgPSAieHllcyI7IHRoZW4KKyAgICAgIEFDX0RFRklORShbSEFWRV9HVEszX0dMXSwgMSwgW0RlZmluZSBpZiBHdGsrIDMuMCBHTCBpcyBpbnN0YWxsZWRdKQorICAgICAgSEFWRV9HVEszX0dMPSJ5ZXMiCisgICAgZmkKKyAgXSwgWworICAgICAgSEFWRV9HVEszX0dMPSJubyIKKyAgXSkKK10pCitBTV9DT05ESVRJT05BTChVU0VfR1RLM19HTCwgdGVzdCAieCRIQVZFX0dUSzNfR0wiID0gInh5ZXMiKQorCitkbmwgKioqIEphY2sgKioqCit0cmFuc2xpdChkbm0sIG0sIGwpIEFNX0NPTkRJVElPTkFMKFVTRV9KQUNLLCB0cnVlKQorQUdfR1NUX0NIRUNLX0ZFQVRVUkUoSkFDSywgSmFjaywgamFjaywgWworICBQS0dfQ0hFQ0tfTU9EVUxFUyhKQUNLLCBqYWNrID49IDAuOTkuMTAsIEhBVkVfSkFDSz0ieWVzIiwgSEFWRV9KQUNLPSJubyIpCisgIEFDX1NVQlNUKEpBQ0tfQ0ZMQUdTKQorICBBQ19TVUJTVChKQUNLX0xJQlMpCisKKyAgQUdfR1NUX1BLR19DSEVDS19NT0RVTEVTKEpBQ0tfMF8xMjBfMSwgamFjayA+PSAwLjEyMC4xIGphY2sgPCAxLjApCisgIGlmIHRlc3QgeCRIQVZFX0pBQ0tfMF8xMjBfMSA9IHh5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9KQUNLXzBfMTIwXzEsIDEsIFtkZWZpbmVkIGlmIGphY2sgPj0gMC4xMjAuMSBpcyBhdmFpbGFibGVdKQorICBmaQorICBBR19HU1RfUEtHX0NIRUNLX01PRFVMRVMoSkFDS18xXzlfNywgamFjayA+PSAxLjkuNykKKyAgaWYgdGVzdCB4JEhBVkVfSkFDS18xXzlfNyA9IHh5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9KQUNLXzFfOV83LCAxLCBbZGVmaW5lZCBpZiBqYWNrID49IDEuOS43IGlzIGF2YWlsYWJsZV0pCisgIGZpCisKK10pCisKK2RubCAqKioganBlZyAqKioKK2RubCBGSVhNRTogd2UgY291bGQgdXNlIGhlYWRlciBjaGVja3MgaGVyZSBhcyB3ZWxsIElNTwordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfSlBFRywgdHJ1ZSkKK0FHX0dTVF9DSEVDS19GRUFUVVJFKEpQRUcsIFtqcGVnIGxpYnJhcnldLCBqcGVnLCBbCisgIEFDX0FSR19XSVRIKGpwZWctbW14LAorICAgIFsgIC0td2l0aC1qcGVnLW1teCwgcGF0aCB0byBNTVgnaWZpZWQgSlBFRyBsaWJyYXJ5XSkKKyAgT0xEX0xJQlM9IiRMSUJTIgorICBpZiB0ZXN0IHgkd2l0aF9qcGVnX21teCAhPSB4OyB0aGVuCisgICAgTElCUz0iJExJQlMgLUwkd2l0aF9qcGVnX21teCIKKyAgZmkKKyAgQUNfQ0hFQ0tfTElCKGpwZWctbW14LCBqcGVnX3NldF9kZWZhdWx0cywgSEFWRV9KUEVHPSJ5ZXMiLCBIQVZFX0pQRUc9Im5vIikKKyAgSlBFR19MSUJTPSIkTElCUyAtbGpwZWctbW14IgorICBMSUJTPSIkT0xEX0xJQlMiCisgIGlmIHRlc3QgeCRIQVZFX0pQRUcgIT0geHllczsgdGhlbgorICAgIEFDX0NIRUNLX0xJQihqcGVnLCBqcGVnX3NldF9kZWZhdWx0cywgSEFWRV9KUEVHPSJ5ZXMiLCBIQVZFX0pQRUc9Im5vIikKKyAgICBKUEVHX0xJQlM9Ii1sanBlZyIKKyAgZmkKKyAgQUNfU1VCU1QoSlBFR19MSUJTKQorXSkKKworZG5sICoqKiBsYW1lICoqKgordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfTEFNRSwgdHJ1ZSkKK0FHX0dTVF9DSEVDS19GRUFUVVJFKExBTUUsIFtsYW1lIG1wMyBlbmNvZGVyIGxpYnJhcnldLCBsYW1lLCBbCisgIEFHX0dTVF9DSEVDS19MSUJIRUFERVIoTEFNRSwgbXAzbGFtZSwgbGFtZV9pbml0LCAkTElCTSwgbGFtZS9sYW1lLmgsCisgIFsKKyAgICBIQVZFX0xBTUU9InllcyIKKyAgICBMQU1FX0xJQlM9Ii1sbXAzbGFtZSAkTElCTSIKKyAgICBkbmwgaXMgbGFtZSBwcmVzZXRzIGF2YWlsYWJsZQorICAgIExBTUVfQ0ZMQUdTPSIiCisgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyNpbmNsdWRlIDxsYW1lL2xhbWUuaD5dXSwgW1sgaW50IHByZXNldCA9IE1FRElVTSBdXSldLFtMQU1FX0NGTEFHUz0iLURHU1RMQU1FX1BSRVNFVCJdLFtMQU1FX0NGTEFHUz0iIgorICAgIF0pCisgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyNpbmNsdWRlIDxsYW1lL2xhbWUuaD5dXSwgW1sKKyAgICAgICAgdm9pZCAqcHRyID0gJmxhbWVfc2V0X1ZCUl9xdWFsaXR5CisgICAgICBdXSldLFtMQU1FX0NGTEFHUz0iJExBTUVfQ0ZMQUdTIC1ESEFWRV9MQU1FX1NFVF9WQlJfUVVBTElUWSJdLFtMQU1FX0NGTEFHUz0iJExBTUVfQ0ZMQUdTIgorICAgIF0pCisgIEFDX1NVQlNUKExBTUVfQ0ZMQUdTKQorICBBQ19TVUJTVChMQU1FX0xJQlMpCisgIF0pCitdKQorCitkbmwgKioqIGxpYmNhY2EgKioqCit0cmFuc2xpdChkbm0sIG0sIGwpIEFNX0NPTkRJVElPTkFMKFVTRV9MSUJDQUNBLCB0cnVlKQorQUdfR1NUX0NIRUNLX0ZFQVRVUkUoTElCQ0FDQSwgW2xpYmNhY2EgY29sb3VyZWQgQVNDSUkgYXJ0XSwgY2FjYXNpbmssIFsKKyAgQUdfR1NUX1BLR19DSEVDS19NT0RVTEVTKExJQkNBQ0EsIGNhY2EpCitdKQorCitkbmwgKioqIGxpYmR2ICoqKgordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfTElCRFYsIHRydWUpCitBR19HU1RfQ0hFQ0tfRkVBVFVSRShMSUJEViwgW2xpYmR2IERWIGRlbXV4ZXIvZGVjb2Rlcl0sIGR2LCBbCisgIEFHX0dTVF9QS0dfQ0hFQ0tfTU9EVUxFUyhMSUJEViwgbGliZHYgPj0gMC4xMDApCitdKQorCitkbmwgKioqIGxpYnBuZyAqKioKK3RyYW5zbGl0KGRubSwgbSwgbCkgQU1fQ09ORElUSU9OQUwoVVNFX0xJQlBORywgdHJ1ZSkKK0FHX0dTVF9DSEVDS19GRUFUVVJFKExJQlBORywgW1BvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MgbGlicmFyeV0sIHBuZywgWworICBBR19HU1RfUEtHX0NIRUNLX01PRFVMRVMoTElCUE5HLCBsaWJwbmcgPj0gMS4yKQorICBpZiB0ZXN0ICRIQVZFX0xJQlBORyA9ICJ5ZXMiOyB0aGVuCisgICAgUEtHX0NIRUNLX01PRFVMRVMoTElCUE5HXzFfNSwgbGlicG5nID49IDEuNS4xLCBbCisgICAgICAgIEFDX0RFRklORShIQVZFX0xJQlBOR18xXzUsIDEsIFtEZWZpbmVkIGlmIGxpYnBuZyB2ZXJzaW9uIGlzIDEuNS4xIG9yIG5ld2VyXSkKKyAgICAgIF0sIFt0cnVlXSkKKyAgZmkKK10pCisKK2RubCAqKiogbXBnMTIzICoqKgordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfTVBHMTIzLCB0cnVlKQorQUdfR1NUX0NIRUNLX0ZFQVRVUkUoTVBHMTIzLCBbbXBnMTIzIGF1ZGlvIGRlY29kZXJdLCBtcGcxMjMsIFsKKyAgUEtHX0NIRUNLX01PRFVMRVMoTVBHMTIzLCBsaWJtcGcxMjMgPj0gMS4xMywgSEFWRV9NUEcxMjM9InllcyIsIEhBVkVfTVBHMTIzPSJubyIpCisgIEFDX1NVQlNUKE1QRzEyM19DRkxBR1MpCisgIEFDX1NVQlNUKE1QRzEyM19MSUJTKQorXSkKKworZG5sICoqKiBwdWxzZWF1ZGlvICoqKgordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfUFVMU0UsIHRydWUpCitBR19HU1RfQ0hFQ0tfRkVBVFVSRShQVUxTRSwgW3B1bHNlYXVkaW8gcGx1Zy1pbl0sIHB1bHNlYXVkaW8sIFsKKworICBkbmwgdXNlZCBpbiBleHQvcHVsc2UvcHVsc2V1dGlsLmMKKyAgQUNfQ0hFQ0tfSEVBREVSUyhbcHJvY2Vzcy5oXSkKKworICBBR19HU1RfUEtHX0NIRUNLX01PRFVMRVMoUFVMU0UsIGxpYnB1bHNlID49IDIuMCkKK10pCisKK2RubCAqKiogZHYxMzk0ICoqKgordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfRFYxMzk0LCB0cnVlKQorQUdfR1NUX0NIRUNLX0ZFQVRVUkUoRFYxMzk0LCBbcmF3MTM5NCBhbmQgYXZjMTM5NCBsaWJyYXJ5XSwgMTM5NCwgWworICBkbmwgZmlyc3QgdGVzdCBmb3IgbGlicmF3MTM5NCA+PSAyLjAuMAorICBBR19HU1RfUEtHX0NIRUNLX01PRFVMRVMoUkFXMTM5NCwgbGlicmF3MTM5NCA+PSAyLjAuMCkKKyAgQUdfR1NUX1BLR19DSEVDS19NT0RVTEVTKExJQklFQzYxODgzLCBsaWJpZWM2MTg4MyA+PSAxLjAuMCkKKyAgZG5sIG5vdyBzZWUgaG93IGZhciB3ZSBnb3QKKyAgaWYgdGVzdCB4JEhBVkVfUkFXMTM5NCA9IHh5ZXMgJiYgXAorICAgICB0ZXN0IHgkSEFWRV9MSUJJRUM2MTg4MyA9IHh5ZXM7IHRoZW4KKyAgICAgICBBR19HU1RfQ0hFQ0tfTElCSEVBREVSKEFWQzEzOTQsCisgICAgICAgIGF2YzEzOTQsIGF2YzEzOTRfc2VuZF9jb21tYW5kLCAkUkFXMTM5NF9MSUJTLAorCWxpYmF2YzEzOTQvYXZjMTM5NC5oLCBBVkMxMzk0X0xJQlM9Ii1sYXZjMTM5NCIpCisgICAgICAgQUdfR1NUX0NIRUNLX0xJQkhFQURFUihST00xMzk0LAorICAgICAgICByb20xMzk0LCByb20xMzk0X2ZyZWVfZGlyZWN0b3J5LCAkUkFXMTM5NF9MSUJTLAorICAgICAgICBsaWJhdmMxMzk0L3JvbTEzOTQuaCwgUk9NMTM5NF9MSUJTPSItbHJvbTEzOTQiKQorICAgICAgIGlmIHRlc3QgeCRIQVZFX0FWQzEzOTQgPSB4eWVzICYmIFwKKyAgICAgICAgICB0ZXN0IHgkSEFWRV9BVkMxMzk0ID0geHllcyAmJiBcCisJICB0ZXN0IHgkSEFWRV9ST00xMzk0ID0geHllczsgdGhlbgorCSAgSEFWRV9EVjEzOTQ9eWVzCisgICAgICAgICAgRFYxMzk0X0xJQlM9IiRSQVcxMzk0X0xJQlMgJEFWQzEzOTRfTElCUyAkUk9NMTM5NF9MSUJTICRMSUJJRUM2MTg4M19MSUJTIgorICAgICAgICAgIERWMTM5NF9DRkxBR1M9IiRSQVcxMzk0X0NGTEFHUyAkTElCSUVDNjE4ODNfQ0ZMQUdTIC1ESEFWRV9MSUJJRUM2MTg4MyIKKyAgICAgICAgICBBQ19TVUJTVChEVjEzOTRfQ0ZMQUdTKQorICAgICAgICAgIEFDX1NVQlNUKERWMTM5NF9MSUJTKQorCWZpCisgIGVsc2UKKyAgICAgICBpZiB0ZXN0IHgkSEFWRV9SQVcxMzk0ID0geG5vOyB0aGVuCisJICBBR19HU1RfUEtHX0NIRUNLX01PRFVMRVMoUkFXMTM5NCwgbGlicmF3MTM5NCA+PSAxLjEuMCkKKwkgIEFHX0dTVF9DSEVDS19MSUJIRUFERVIoQVZDMTM5NCwKKwkgICBhdmMxMzk0LCBhdmMxMzk0X3NlbmRfY29tbWFuZCwgJFJBVzEzOTRfTElCUywKKwkgICBsaWJhdmMxMzk0L2F2YzEzOTQuaCwgQVZDMTM5NF9MSUJTPSItbGF2YzEzOTQiKQorCSAgQUdfR1NUX0NIRUNLX0xJQkhFQURFUihST00xMzk0LAorCSAgIHJvbTEzOTQsIHJvbTEzOTRfZnJlZV9kaXJlY3RvcnksICRSQVcxMzk0X0xJQlMsCisJICAgbGliYXZjMTM5NC9yb20xMzk0LmgsIFJPTTEzOTRfTElCUz0iLWxyb20xMzk0IikKKyAgICAgICAgICBpZiB0ZXN0IHgkSEFWRV9SQVcxMzk0ID0geHllcyAmJiBcCisJICAgICB0ZXN0IHgkSEFWRV9BVkMxMzk0ID0geHllcyAmJiBcCisJICAgICB0ZXN0IHgkSEFWRV9ST00xMzk0ID0geHllczsgdGhlbgorCSAgICAgSEFWRV9EVjEzOTQ9eWVzCisJICAgICBEVjEzOTRfTElCUz0iJFJBVzEzOTRfTElCUyAkQVZDMTM5NF9MSUJTICRST00xMzk0X0xJQlMiCisJICAgICBEVjEzOTRfQ0ZMQUdTPSIkUkFXMTM5NF9DRkxBR1MiCisJICAgICBpZiB0ZXN0IHgkSEFWRV9MSUJJRUM2MTg4MyA9IHh5ZXM7IHRoZW4KKwkgICAgICAgRFYxMzk0X0NGTEFHUz0iJFJBVzEzOTRfQ0ZMQUdTICRMSUJJRUM2MTg4M19DRkxBR1MgLURIQVZFX0xJQklFQzYxODgzIgorCSAgICAgICBEVjEzOTRfTElCUz0iJERWMTM5NF9MSUJTICRMSUJJRUM2MTg4M19MSUJTIgorCSAgICAgZmkKKyAgICAgICAgICAgICBBQ19TVUJTVChEVjEzOTRfQ0ZMQUdTKQorICAgICAgICAgICAgIEFDX1NVQlNUKERWMTM5NF9MSUJTKQorICAgICAgICAgICBmaQorCSBmaQorICBmaQorXSkKK0FNX0NPTkRJVElPTkFMKFVTRV9MSUJJRUM2MTg4MywgWyB0ZXN0ICJ4JHtIQVZFX0xJQklFQzYxODgzfSIgPSB4eWVzIF0gKQorCitkbmwgKioqIHNob3V0MiAqKioKK3RyYW5zbGl0KGRubSwgbSwgbCkgQU1fQ09ORElUSU9OQUwoVVNFX1NIT1VUMiwgdHJ1ZSkKK0FHX0dTVF9DSEVDS19GRUFUVVJFKFNIT1VUMiwgW1Nob3V0Y2FzdC9JY2VjYXN0IGNsaWVudCBsaWJyYXJ5XSwgc2hvdXQyLCBbCisgIEFHX0dTVF9QS0dfQ0hFQ0tfTU9EVUxFUyhTSE9VVDIsIHNob3V0ID49IDIuMCkKK10pCisKK2RubCAqKiogc291cCAqKioKK3RyYW5zbGl0KGRubSwgbSwgbCkgQU1fQ09ORElUSU9OQUwoVVNFX1NPVVAsIHRydWUpCitBR19HU1RfQ0hFQ0tfRkVBVFVSRShTT1VQLCBbc291cCBodHRwIGNsaWVudCBwbHVnaW4gKDIuNCldLCBzb3VwaHR0cHNyYywgWworICBQS0dfQ0hFQ0tfTU9EVUxFUyhTT1VQLCBsaWJzb3VwLTIuNCA+PSAyLjQ4LCBbSEFWRV9TT1VQPSJ5ZXMiXSwgW0hBVkVfU09VUD0ibm8iXSkKKyAgQUNfU1VCU1QoU09VUF9DRkxBR1MpCisgIEFDX1NVQlNUKFNPVVBfTElCUykKK10pCisKK2RubCAqKiogc3BlZXggKioqCit0cmFuc2xpdChkbm0sIG0sIGwpIEFNX0NPTkRJVElPTkFMKFVTRV9TUEVFWCwgdHJ1ZSkKK0FHX0dTVF9DSEVDS19GRUFUVVJFKFNQRUVYLCBbc3BlZXggc3BlZWNoIGNvZGVjXSwgc3BlZXgsIFsKKyAgQUdfR1NUX1BLR19DSEVDS19NT0RVTEVTKFNQRUVYLCBzcGVleCA+PSAxLjEuNikKK10pCisKK2RubCAqKiogdGFnbGliICoqKgordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfVEFHTElCLCB0cnVlKQorQUdfR1NUX0NIRUNLX0ZFQVRVUkUoVEFHTElCLCBbdGFnbGliIHRhZ2dpbmcgbGlicmFyeV0sIHRhZ2xpYiwgWworICBBR19HU1RfUEtHX0NIRUNLX01PRFVMRVMoVEFHTElCLCB0YWdsaWIgPj0gMS41KQorICBpZiB0ZXN0ICJ4JEhBVkVfQ1hYIiAhPSAieHllcyI7IHRoZW4KKyAgICBVU0VfVEFHTElCPWZhbHNlCisgICAgQUNfTVNHX05PVElDRShbTm90IGJ1aWxkaW5nIHRhZ2xpYiBwbHVnaW46IG5vIEMrKyBjb21waWxlciBmb3VuZF0pCisgIGVsc2UKKyAgICBkbmwgd29yayBhcm91bmQgYnVnIGluIHRhZ2xpYiAxLjUgaGVhZGVycywgcmVtb3ZlIG9uY2UgdGhlcmUgaXMgYSAxLjYKKyAgICBBU19DWFhfQ09NUElMRVJfRkxBRyhbLVduby1hdHRyaWJ1dGVzXSwgWworICAgICAgICBUQUdMSUJfQ1hYRkxBR1M9IiRUQUdMSUJfQ0ZMQUdTIC1Xbm8tYXR0cmlidXRlcyIKKyAgICAgIF0sIFsKKyAgICAgICAgVEFHTElCX0NYWEZMQUdTPSIkVEFHTElCX0NGTEFHUyIKKyAgICBdKQorICAgIEFDX1NVQlNUKFRBR0xJQl9DWFhGTEFHUykKKyAgZmkKK10pCisKK2RubCAqKiogdHdvbGFtZSAqKioKK3RyYW5zbGl0KGRubSwgbSwgbCkgQU1fQ09ORElUSU9OQUwoVVNFX1RXT0xBTUUsIHRydWUpCitBR19HU1RfQ0hFQ0tfRkVBVFVSRShUV09MQU1FLCBbdHdvbGFtZV0sIHR3b2xhbWUsIFsKKyAgUEtHX0NIRUNLX01PRFVMRVMoVFdPTEFNRSwgdHdvbGFtZSA+PSAwLjMuMTAsIFsKKyAgICAgIEhBVkVfVFdPTEFNRT0ieWVzIl0sIFsKKyAgICAgIEhBVkVfVFdPTEFNRT0ibm8iCisgIF0pCisgIEFDX1NVQlNUKFRXT0xBTUVfQ0ZMQUdTKQorICBBQ19TVUJTVChUV09MQU1FX0xJQlMpCitdKQorCisKK2RubCAqKiogdnB4ICoqKgordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfVlBYLCB2cHgpCitBR19HU1RfQ0hFQ0tfRkVBVFVSRShWUFgsIFtWUFggZGVjb2Rlcl0sIHZweCwgWworICBQS0dfQ0hFQ0tfTU9EVUxFUyhWUFgsIHZweCA+PSAxLjEuMCwgW0hBVkVfVlBYPSJ5ZXMiXSwgW0hBVkVfVlBYPSJubyJdKQorICBIQVZFX1ZQOD1ubworICBIQVZFX1ZQOT1ubworCisgIGlmIHRlc3QgJEhBVkVfVlBYID0gInllcyI7IHRoZW4KKyAgICBPTERfTElCUz0iJExJQlMiCisgICAgT0xEX0NGTEFHUz0iJENGTEFHUyIKKyAgICBDRkxBR1M9IiRDRkxBR1MgJFZQWF9DRkxBR1MiCisgICAgTElCUz0iJExJQlMgJFZQWF9MSUJTIgorICAgIEFDX0NIRUNLX0xJQih2cHgsIHZweF9jb2RlY192cDhfY3hfYWxnbywgWworICAgICAgSEFWRV9WUDg9eWVzCisgICAgICBBQ19ERUZJTkUoSEFWRV9WUDhfRU5DT0RFUiwgMSwgW0RlZmluZWQgaWYgdGhlIFZQOCBlbmNvZGVyIGlzIGF2YWlsYWJsZV0pCisgICAgXSkKKyAgICBBQ19DSEVDS19MSUIodnB4LCB2cHhfY29kZWNfdnA4X2R4X2FsZ28sIFsKKyAgICAgIEhBVkVfVlA4PXllcworICAgICAgQUNfREVGSU5FKEhBVkVfVlA4X0RFQ09ERVIsIDEsIFtEZWZpbmVkIGlmIHRoZSBWUDggZGVjb2RlciBpcyBhdmFpbGFibGVdKQorICAgIF0pCisKKyAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhWUFhfMTMwLCB2cHggPj0gMS4zLjAsIFsKKyAgICAgIEFDX0NIRUNLX0xJQih2cHgsIHZweF9jb2RlY192cDlfY3hfYWxnbywgWworICAgICAgICBIQVZFX1ZQOT15ZXMKKyAgICAgICAgQUNfREVGSU5FKEhBVkVfVlA5X0VOQ09ERVIsIDEsIFtEZWZpbmVkIGlmIHRoZSBWUDkgZW5jb2RlciBpcyBhdmFpbGFibGVdKQorICAgICAgXSkKKyAgICAgIEFDX0NIRUNLX0xJQih2cHgsIHZweF9jb2RlY192cDlfZHhfYWxnbywgWworICAgICAgICBIQVZFX1ZQOT15ZXMKKyAgICAgICAgQUNfREVGSU5FKEhBVkVfVlA5X0RFQ09ERVIsIDEsIFtEZWZpbmVkIGlmIHRoZSBWUDkgZGVjb2RlciBpcyBhdmFpbGFibGVdKQorICAgICAgXSkKKyAgICBdLCBbdHJ1ZV0pCisKKyAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhWUFhfMTQwLCB2cHggPj0gMS40LjAsIFsKKyAgICAgIEFDX0RFRklORShIQVZFX1ZQWF8xXzQsIDEsIFtEZWZpbmVkIGlmIHRoZSBWUFggbGlicmFyeSB2ZXJzaW9uIGlzIDEuNCBvciBiaWdnZXJdKQorICAgIF0sIFt0cnVlXSkKKworICAgIExJQlM9IiRPTERfTElCUyIKKyAgICBDRkxBR1M9IiRPTERfQ0ZMQUdTIgorICBmaQorICBBQ19TVUJTVChWUFhfTElCUykKKyAgQUNfU1VCU1QoVlBYX0NGTEFHUykKK10pCisKK2RubCAqKiogd2F2cGFjayAqKioKK3RyYW5zbGl0KGRubSwgbSwgbCkgQU1fQ09ORElUSU9OQUwoVVNFX1dBVlBBQ0ssIHRydWUpCitBR19HU1RfQ0hFQ0tfRkVBVFVSRShXQVZQQUNLLCBbd2F2cGFjayBwbHVnLWluXSwgd2F2cGFjaywgWworICBBR19HU1RfUEtHX0NIRUNLX01PRFVMRVMoV0FWUEFDSywgd2F2cGFjayA+PSA0LjYwLjApCitdKQorCitkbmwgKioqIHF0ZGVtdXggJiBtYXRyb3NrYSBwcmVmZXIgdG8gaGF2ZSB6bGliICoqKgordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfWkxJQiwgdHJ1ZSkKK0FHX0dTVF9DSEVDS19GRUFUVVJFKFpMSUIsIFt6bGliIHN1cHBvcnQgZm9yIHF0ZGVtdXgvbWF0cm9za2FdLCwgWworICBBR19HU1RfQ0hFQ0tfTElCSEVBREVSKFpMSUIsCisgICAgeiwgdW5jb21wcmVzcywsIHpsaWIuaCwgWworICAgIEhBVkVfWkxJQj0ieWVzIgorICAgIFpMSUJfTElCUz0iLWx6IgorICAgIEFDX1NVQlNUKFpMSUJfTElCUykKKyAgXSkKK10pCisKK2RubCAqKiogbWF0cm9za2EgcHJlZmVycyB0byBoYXZlIGJ6MiAqKioKK3RyYW5zbGl0KGRubSwgbSwgbCkgQU1fQ09ORElUSU9OQUwoVVNFX0JaMiwgdHJ1ZSkKK0FHX0dTVF9DSEVDS19GRUFUVVJFKEJaMiwgW2J6MiBsaWJyYXJ5IGZvciBtYXRyb3NrYSBdLCwgWworICBzYXZlX0xJQlM9JExJQlMKKyAgTElCUz0iJExJQlMgLWxiejIiCisgIEFDX01TR19DSEVDS0lORyhbZm9yIEJaMl9iemxpYlZlcnNpb24gaW4gLWxiejJdKQorICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbI2luY2x1ZGUgPGJ6bGliLmg+XV0sIFtbY29uc3QgY2hhciAqdmVyc2lvbiA9IEJaMl9iemxpYlZlcnNpb24gKCk7XV0pXSxbSEFWRV9CWjI9eWVzXSxbSEFWRV9CWjI9bm9dKQorICBBQ19NU0dfUkVTVUxUKCRIQVZFX0JaMikKKyAgTElCUz0kc2F2ZV9MSUJTCisgIGlmIHRlc3QgIngkSEFWRV9CWjIiID0gInh5ZXMiOyB0aGVuCisgICAgQloyX0xJQlM9Ii1sYnoyIgorICBmaQorICBBQ19TVUJTVChCWjJfTElCUykKK10pCisKK2Vsc2UKKworZG5sIG5vdCBidWlsZGluZyBwbHVnaW5zIHdpdGggZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLAorZG5sIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHNldCB0aGUgY29uZGl0aW9uYWxzCitBTV9DT05ESVRJT05BTChVU0VfQUFMSUIsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX0JaMiwgZmFsc2UpCitBTV9DT05ESVRJT05BTChVU0VfQ0FJUk8sIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX0RJUkVDVFNPVU5ELCBmYWxzZSkKK0FNX0NPTkRJVElPTkFMKFVTRV9EVjEzOTQsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX0ZMQUMsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX0dES19QSVhCVUYsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX0dUSzMsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX0dUSzNfR0wsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX0pBQ0ssIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX0pQRUcsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX0xBTUUsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX0xJQkNBQ0EsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX0xJQkRWLCBmYWxzZSkKK0FNX0NPTkRJVElPTkFMKFVTRV9MSUJJRUM2MTg4MywgZmFsc2UpCitBTV9DT05ESVRJT05BTChVU0VfTElCUE5HLCBmYWxzZSkKK0FNX0NPTkRJVElPTkFMKFVTRV9NUEcxMjMsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX09TUywgZmFsc2UpCitBTV9DT05ESVRJT05BTChVU0VfT1NTNCwgZmFsc2UpCitBTV9DT05ESVRJT05BTChVU0VfT1NYX0FVRElPLCBmYWxzZSkKK0FNX0NPTkRJVElPTkFMKFVTRV9PU1hfVklERU8sIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX1BVTFNFLCBmYWxzZSkKK0FNX0NPTkRJVElPTkFMKFVTRV9TSE9VVDIsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX1NPVVAsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX1NQRUVYLCBmYWxzZSkKK0FNX0NPTkRJVElPTkFMKFVTRV9UQUdMSUIsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX1RXT0xBTUUsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX1ZQWCwgZmFsc2UpCitBTV9DT05ESVRJT05BTChVU0VfV0FWRUZPUk0sIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX1dBVlBBQ0ssIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX1gsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX1pMSUIsIGZhbHNlKQorCitmaSBkbmwgb2YgRVhUIHBsdWdpbnMKKworZG5sICoqKiBmaW5hbGl6ZSBDRkxBR1MsIExERkxBR1MsIExJQlMKKworZG5sIE92ZXJ2aWV3OgorZG5sIEdTVF9PUFRJT05fQ0ZMQUdTOiAgY29tbW9uIGZsYWdzIGZvciBwcm9maWxpbmcsIGRlYnVnZ2luZywgZXJyb3JzLCAuLi4KK2RubCBHU1RfKjogICAgICAgICAgICAgIGZsYWdzIHNoYXJlZCBieSBhbGwgYnVpbHQgb2JqZWN0cworZG5sIEdTVF9BTExfTERGTEFHUzogICAgbGlua2VyIGZsYWdzIHNoYXJlZCBieSBhbGwKK2RubCBHU1RfTElCX0xERkxBR1M6ICAgIG5vdCBuZWVkZWQsIHdlIGRvbid0IGluc3RhbGwgbGlicmFyaWVzCitkbmwgR1NUX0xUX0xERkxBR1M6ICAgICBsaWJyYXJ5IHZlcnNpb25pbmcgb2Ygb3VyIGxpYnJhcmllcworZG5sIEdTVF9QTFVHSU5fTERGTEFHUzogZmxhZ3MgdG8gYmUgdXNlZCBmb3IgYWxsIHBsdWdpbnMKKworZG5sIEdTVF9PUFRJT05fQ0ZMQUdTCitpZiB0ZXN0ICJ4JFVTRV9ERUJVRyIgPSB4eWVzOyB0aGVuCisgICBQUk9GSUxFX0NGTEFHUz0iLWciCitmaQorQUNfU1VCU1QoUFJPRklMRV9DRkxBR1MpCisKK2lmIHRlc3QgIngkUEFDS0FHRV9WRVJTSU9OX05BTk8iID0gIngxIjsgdGhlbgorICBkbmwgRGVmaW5lIF9vbmx5XyBmb3IgZ2l0IChub3QgcHJlLXJlbGVhc2VzIG9yIHJlbGVhc2VzKQorICBERVBSRUNBVEVEX0NGTEFHUz0iLURHU1RfRElTQUJMRV9ERVBSRUNBVEVEIgorZWxzZQorICBERVBSRUNBVEVEX0NGTEFHUz0iIgorZmkKK0FDX1NVQlNUKERFUFJFQ0FURURfQ0ZMQUdTKQorCitWSVNJQklMSVRZX0NGTEFHUz0iIgorQVNfQ09NUElMRVJfRkxBRyhbLWZ2aXNpYmlsaXR5PWhpZGRlbl0sIFtWSVNJQklMSVRZX0NGTEFHUz0iLWZ2aXNpYmlsaXR5PWhpZGRlbiJdKQorQUNfU1VCU1QoVklTSUJJTElUWV9DRkxBR1MpCisKK1ZJU0lCSUxJVFlfQ1hYRkxBR1M9IiIKK2lmIHRlc3QgIngkSEFWRV9DWFgiID0gInh5ZXMiOyB0aGVuCisgIEFTX0NYWF9DT01QSUxFUl9GTEFHKFstZnZpc2liaWxpdHk9aGlkZGVuXSwgW1ZJU0lCSUxJVFlfQ1hYRkxBR1M9Ii1mdmlzaWJpbGl0eT1oaWRkZW4iXSkKK2ZpCitBQ19TVUJTVChWSVNJQklMSVRZX0NYWEZMQUdTKQorCitkbmwgZGlzYWJsZSBzdHJpY3QgYWxpYXNpbmcKK0FTX0NPTVBJTEVSX0ZMQUcoWy1mbm8tc3RyaWN0LWFsaWFzaW5nXSwgW0VYVFJBX0NGTEFHUz0iLWZuby1zdHJpY3QtYWxpYXNpbmciXSkKK0FDX1NVQlNUKEVYVFJBX0NGTEFHUykKKworZG5sIGV2ZXJ5IGZsYWcgaW4gR1NUX09QVElPTl9DRkxBR1MsIEdTVF9PUFRJT05fQ1hYRkxBR1MgYW5kIEdTVF9PUFRJT05fT0JKQ0ZMQUdTIGNhbiBiZSBvdmVycmlkZGVuCitkbmwgYXQgbWFrZSB0aW1lIHdpdGggZS5nLiBtYWtlIEVSUk9SX0NGTEFHUz0iIgorR1NUX09QVElPTl9DRkxBR1M9IlwkKFdBUk5JTkdfQ0ZMQUdTKSBcJChFUlJPUl9DRkxBR1MpIFwkKERFQlVHX0NGTEFHUykgXCQoUFJPRklMRV9DRkxBR1MpIFwkKEdDT1ZfQ0ZMQUdTKSBcJChPUFRfQ0ZMQUdTKSBcJChERVBSRUNBVEVEX0NGTEFHUykiCitHU1RfT1BUSU9OX0NYWEZMQUdTPSJcJChXQVJOSU5HX0NYWEZMQUdTKSBcJChFUlJPUl9DWFhGTEFHUykgXCQoREVCVUdfQ0ZMQUdTKSBcJChQUk9GSUxFX0NGTEFHUykgXCQoR0NPVl9DRkxBR1MpIFwkKE9QVF9DRkxBR1MpIFwkKERFUFJFQ0FURURfQ0ZMQUdTKSIKK0dTVF9PUFRJT05fT0JKQ0ZMQUdTPSJcJChXQVJOSU5HX09CSkNGTEFHUykgXCQoRVJST1JfT0JKQ0ZMQUdTKSBcJChERUJVR19DRkxBR1MpIFwkKFBST0ZJTEVfQ0ZMQUdTKSBcJChHQ09WX0NGTEFHUykgXCQoT1BUX0NGTEFHUykgXCQoREVQUkVDQVRFRF9DRkxBR1MpIgorQUNfU1VCU1QoR1NUX09QVElPTl9DRkxBR1MpCitBQ19TVUJTVChHU1RfT1BUSU9OX0NYWEZMQUdTKQorQUNfU1VCU1QoR1NUX09QVElPTl9PQkpDRkxBR1MpCisKK2RubCBvdXIgbGlicmFyaWVzIG5lZWQgdG8gYmUgdmVyc2lvbmVkIGNvcnJlY3RseQorQUNfU1VCU1QoR1NUX0xUX0xERkxBR1MpCisKK2RubCBGSVhNRTogZG8gd2Ugd2FudCB0byByZW5hbWUgdG8gR1NUX0FMTF8qID8KK2RubCBwcmVmZXIgaW50ZXJuYWwgaGVhZGVycyB0byBhbHJlYWR5IGluc3RhbGxlZCBvbmVzCitkbmwgYWxzbyBhZGQgYnVpbGRkaXIgaW5jbHVkZSBmb3IgZW51bXR5cGVzIGFuZCBtYXJzaGFsCitkbmwgYWRkIEVSUk9SX0NGTEFHUywgYnV0IG92ZXJyaWRhYmxlCitHU1RfQ0ZMQUdTPSIkR1NUX0NGTEFHUyAtREdTVF9VU0VfVU5TVEFCTEVfQVBJIgorR1NUX0NYWEZMQUdTPSItSVwkKHRvcF9zcmNkaXIpL2dzdC1saWJzICRHU1RfQ0ZMQUdTICRFWFRSQV9DRkxBR1MgJEdMSUJfRVhUUkFfQ0ZMQUdTIFwkKEdTVF9PUFRJT05fQ1hYRkxBR1MpIFwkKFZJU0lCSUxJVFlfQ1hYRkxBR1MpIgorR1NUX09CSkNGTEFHUz0iLUlcJCh0b3Bfc3JjZGlyKS9nc3QtbGlicyAkR1NUX0NGTEFHUyAkRVhUUkFfQ0ZMQUdTICRHTElCX0VYVFJBX0NGTEFHUyBcJChHU1RfT1BUSU9OX09CSkNGTEFHUykiCitHU1RfQ0ZMQUdTPSItSVwkKHRvcF9zcmNkaXIpL2dzdC1saWJzICRHU1RfQ0ZMQUdTICRFWFRSQV9DRkxBR1MgJEdMSUJfRVhUUkFfQ0ZMQUdTIFwkKEdTVF9PUFRJT05fQ0ZMQUdTKSBcJChWSVNJQklMSVRZX0NGTEFHUykiCitBQ19TVUJTVChHU1RfQ0ZMQUdTKQorQUNfU1VCU1QoR1NUX0NYWEZMQUdTKQorQUNfU1VCU1QoR1NUX09CSkNGTEFHUykKK0FDX1NVQlNUKEdTVF9MSUJTKQorCitkbmwgTERGTEFHUyByZWFsbHkgc2hvdWxkIG9ubHkgY29udGFpbiBmbGFncywgbm90IGxpYnMgLSB0aGV5IGdldCBhZGRlZCBiZWZvcmUKK2RubCB3aGF0ZXZlcnRhcmdldF9MSUJTIGFuZCAtTCBmbGFncyBoZXJlIGFmZmVjdCB0aGUgcmVzdCBvZiB0aGUgbGlua2luZworR1NUX0FMTF9MREZMQUdTPSItbm8tdW5kZWZpbmVkIgoraWYgdGVzdCAieCR7ZW5hYmxlX0JzeW1ib2xpY30iID0gInh5ZXMiOyB0aGVuCisgIEdTVF9BTExfTERGTEFHUz0iJEdTVF9BTExfTERGTEFHUyAtV2wsLUJzeW1ib2xpYy1mdW5jdGlvbnMiCitmaQorQUNfU1VCU1QoR1NUX0FMTF9MREZMQUdTKQorCitkbmwgdGhpcyByZWFsbHkgc2hvdWxkIG9ubHkgY29udGFpbiBmbGFncywgbm90IGxpYnMgLSB0aGV5IGdldCBhZGRlZCBiZWZvcmUKK2RubCB3aGF0ZXZlcnRhcmdldF9MSUJTIGFuZCAtTCBmbGFncyBoZXJlIGFmZmVjdCB0aGUgcmVzdCBvZiB0aGUgbGlua2luZworR1NUX1BMVUdJTl9MREZMQUdTPSItbW9kdWxlIC1hdm9pZC12ZXJzaW9uICRHU1RfQUxMX0xERkxBR1MiCitBQ19TVUJTVChHU1RfUExVR0lOX0xERkxBR1MpCisKK2RubCAqKiogb3V0cHV0IGZpbGVzICoqKgorCiskTUtESVJfUCB0ZXN0cy9jaGVjay9vcmMKKworZG5sIGtlZXAgdGhpcyBhbHBoYWJldGljIHBlciBkaXJlY3RvcnksIHBsZWFzZQorQUNfQ09ORklHX0ZJTEVTKAorTWFrZWZpbGUKK2dzdC9NYWtlZmlsZQorZ3N0L2FscGhhL01ha2VmaWxlCitnc3QvYXBldGFnL01ha2VmaWxlCitnc3QvYXVkaW9meC9NYWtlZmlsZQorZ3N0L2F1ZGlvcGFyc2Vycy9NYWtlZmlsZQorZ3N0L2F1cGFyc2UvTWFrZWZpbGUKK2dzdC9hdXRvZGV0ZWN0L01ha2VmaWxlCitnc3QvYXZpL01ha2VmaWxlCitnc3QvY3V0dGVyL01ha2VmaWxlCitnc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUKK2dzdC9kdG1mL01ha2VmaWxlCitnc3QvZGVidWd1dGlscy9NYWtlZmlsZQorZ3N0L2VmZmVjdHYvTWFrZWZpbGUKK2dzdC9lcXVhbGl6ZXIvTWFrZWZpbGUKK2dzdC9mbHYvTWFrZWZpbGUKK2dzdC9nb29tL01ha2VmaWxlCitnc3QvZ29vbTJrMS9NYWtlZmlsZQorZ3N0L2lkM2RlbXV4L01ha2VmaWxlCitnc3QvaWN5ZGVtdXgvTWFrZWZpbGUKK2dzdC9pbWFnZWZyZWV6ZS9NYWtlZmlsZQorZ3N0L2ludGVybGVhdmUvTWFrZWZpbGUKK2dzdC9pc29tcDQvTWFrZWZpbGUKK2dzdC9sYXcvTWFrZWZpbGUKK2dzdC9sZXZlbC9NYWtlZmlsZQorZ3N0L21hdHJvc2thL01ha2VmaWxlCitnc3QvbW9ub3Njb3BlL01ha2VmaWxlCitnc3QvbXVsdGlmaWxlL01ha2VmaWxlCitnc3QvbXVsdGlwYXJ0L01ha2VmaWxlCitnc3QvcmVwbGF5Z2Fpbi9NYWtlZmlsZQorZ3N0L3J0cC9NYWtlZmlsZQorZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUKK2dzdC9ydHNwL01ha2VmaWxlCitnc3Qvc2hhcGV3aXBlL01ha2VmaWxlCitnc3Qvc21wdGUvTWFrZWZpbGUKK2dzdC9zcGVjdHJ1bS9NYWtlZmlsZQorZ3N0L3VkcC9NYWtlZmlsZQorZ3N0L3ZpZGVvYm94L01ha2VmaWxlCitnc3QvdmlkZW9jcm9wL01ha2VmaWxlCitnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUKK2dzdC92aWRlb21peGVyL01ha2VmaWxlCitnc3Qvd2F2ZW5jL01ha2VmaWxlCitnc3Qvd2F2cGFyc2UvTWFrZWZpbGUKK2dzdC9mbHgvTWFrZWZpbGUKK2dzdC95NG0vTWFrZWZpbGUKK2V4dC9NYWtlZmlsZQorZXh0L2FhbGliL01ha2VmaWxlCitleHQvY2Fpcm8vTWFrZWZpbGUKK2V4dC9kdi9NYWtlZmlsZQorZXh0L2ZsYWMvTWFrZWZpbGUKK2V4dC9nZGtfcGl4YnVmL01ha2VmaWxlCitleHQvZ3RrL01ha2VmaWxlCitleHQvamFjay9NYWtlZmlsZQorZXh0L2pwZWcvTWFrZWZpbGUKK2V4dC9sYW1lL01ha2VmaWxlCitleHQvbGliY2FjYS9NYWtlZmlsZQorZXh0L2xpYnBuZy9NYWtlZmlsZQorZXh0L21wZzEyMy9NYWtlZmlsZQorZXh0L3B1bHNlL01ha2VmaWxlCitleHQvcmF3MTM5NC9NYWtlZmlsZQorZXh0L3Nob3V0Mi9NYWtlZmlsZQorZXh0L3NvdXAvTWFrZWZpbGUKK2V4dC9zcGVleC9NYWtlZmlsZQorZXh0L3RhZ2xpYi9NYWtlZmlsZQorZXh0L3R3b2xhbWUvTWFrZWZpbGUKK2V4dC92cHgvTWFrZWZpbGUKK2V4dC93YXZwYWNrL01ha2VmaWxlCitzeXMvTWFrZWZpbGUKK3N5cy9kaXJlY3Rzb3VuZC9NYWtlZmlsZQorc3lzL29zcy9NYWtlZmlsZQorc3lzL29zczQvTWFrZWZpbGUKK3N5cy9vc3hhdWRpby9NYWtlZmlsZQorc3lzL29zeHZpZGVvL01ha2VmaWxlCitzeXMvdjRsMi9NYWtlZmlsZQorc3lzL3dhdmVmb3JtL01ha2VmaWxlCitzeXMveGltYWdlL01ha2VmaWxlCitwby9NYWtlZmlsZS5pbgordGVzdHMvTWFrZWZpbGUKK3Rlc3RzL2NoZWNrL01ha2VmaWxlCit0ZXN0cy9leGFtcGxlcy9NYWtlZmlsZQordGVzdHMvZXhhbXBsZXMvYXVkaW9meC9NYWtlZmlsZQordGVzdHMvZXhhbXBsZXMvY2Fpcm8vTWFrZWZpbGUKK3Rlc3RzL2V4YW1wbGVzL2VxdWFsaXplci9NYWtlZmlsZQordGVzdHMvZXhhbXBsZXMvZ3RrL01ha2VmaWxlCit0ZXN0cy9leGFtcGxlcy9qYWNrL01ha2VmaWxlCit0ZXN0cy9leGFtcGxlcy9sZXZlbC9NYWtlZmlsZQordGVzdHMvZXhhbXBsZXMvcnRwL01ha2VmaWxlCit0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvTWFrZWZpbGUKK3Rlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL01ha2VmaWxlCit0ZXN0cy9leGFtcGxlcy92NGwyL01ha2VmaWxlCit0ZXN0cy9maWxlcy9NYWtlZmlsZQordGVzdHMvaWNsZXMvTWFrZWZpbGUKK2NvbW1vbi9NYWtlZmlsZQorY29tbW9uL200L01ha2VmaWxlCittNC9NYWtlZmlsZQorZG9jcy9NYWtlZmlsZQorZG9jcy9wbHVnaW5zL01ha2VmaWxlCitkb2NzL3ZlcnNpb24uZW50aXRpZXMKK3BrZ2NvbmZpZy9NYWtlZmlsZQorcGtnY29uZmlnL2dzdHJlYW1lci1wbHVnaW5zLWdvb2QtdW5pbnN0YWxsZWQucGMKKykKK0FDX09VVFBVVAorCitBR19HU1RfT1VUUFVUX1BMVUdJTlMKK09SQ19PVVRQVVQKKwpkaWZmIC0tZ2l0IGEvZG9jcy8uZ2l0aWdub3JlIGIvZG9jcy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YTdhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAordmVyc2lvbi5lbnRpdGllcwpkaWZmIC0tZ2l0IGEvZG9jcy9NYWtlZmlsZS5hbSBiL2RvY3MvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZmNDFmZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxOSBAQAoraWYgRU5BQkxFX0dUS19ET0MKK2lmIEVOQUJMRV9QTFVHSU5fRE9DUworUExVR0lOX0RPQ1NfRElSUyA9IHBsdWdpbnMKK2Vsc2UKK1BMVUdJTl9ET0NTX0RJUlMgPQorZW5kaWYKK2Vsc2UKK1BMVUdJTl9ET0NTX0RJUlMgPSBwbHVnaW5zCitlbmRpZgorCitTVUJESVJTID0gJChQTFVHSU5fRE9DU19ESVJTKQorRElTVF9TVUJESVJTID0gcGx1Z2lucworCitFWFRSQV9ESVNUID0gXAorICAgICAgICByYW5kb20vQ2hhbmdlTG9nLTAuOCBcCisgICAgICAgIHZlcnNpb24uZW50aXRpZXMuaW4KKwordXBsb2FkOgorCUBpZiB0ZXN0ICJ4JChTVUJESVJTKSIgIT0geDsgdGhlbiBmb3IgYSBpbiAkKFNVQkRJUlMpOyBkbyBjZCAkJGE7IG1ha2UgdXBsb2FkOyBjZCAuLjsgZG9uZTsgZmkKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy8uZ2l0aWdub3JlIGIvZG9jcy9wbHVnaW5zLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA3MmE3MAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMjMgQEAKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorCisqLWRlY2wudHh0CisqLWRlY2wtbGlzdC50eHQKKyotdW5kZWNsYXJlZC50eHQKKyotdW5kb2N1bWVudGVkLnR4dAorKi11bnVzZWQudHh0CisqLW92ZXJyaWRlcy50eHQKKworZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3MubmV3Citnc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFscy5uZXcKKwordG1wbAoraHRtbAorc2dtbAoreG1sCisqLnN0YW1wCisqLmJhaworCitnc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2NhbgorZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNjYW4uYworaW5zcGVjdC1yZWdpc3RyeS4qCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW0gYi9kb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQyYTBiZAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI0NSBAQAorR1NUX0RPQ19TQ0FOT0JKID0gJCh0b3Bfc3JjZGlyKS9jb21tb24vZ3N0ZG9jLXNjYW5nb2JqCisKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgorCisjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUsIGUuZy4gJ2dsaWInLgorI0RPQ19NT0RVTEU9Z3N0LXBsdWdpbnMtbGlicy1AR1NUX0FQSV9WRVJTSU9OQAorTU9EVUxFPWdzdC1wbHVnaW5zLWdvb2QKK0RPQ19NT0RVTEU9JChNT0RVTEUpLXBsdWdpbnMKKworIyBmb3IgdXBsb2FkLWRvYy5tYWsKK0RPQz0kKE1PRFVMRSktcGx1Z2lucworRk9STUFUUz1odG1sCitodG1sOiBodG1sLWJ1aWxkLnN0YW1wCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29tbW9uL3VwbG9hZC1kb2MubWFrCisKKyMgVGhlIHRvcC1sZXZlbCBTR01MIGZpbGUuIENoYW5nZSBpdCBpZiB5b3Ugd2FudC4KK0RPQ19NQUlOX1NHTUxfRklMRT0kKERPQ19NT0RVTEUpLWRvY3Muc2dtbAorCisjIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgc291cmNlIGNvZGUuCisjIGd0ay1kb2Mgd2lsbCBzZWFyY2ggYWxsIC5jICYgLmggZmlsZXMgYmVuZWF0aCBoZXJlIGZvciBpbmxpbmUgY29tbWVudHMKKyMgZG9jdW1lbnRpbmcgZnVuY3Rpb25zIGFuZCBtYWNyb3MuCitET0NfU09VUkNFX0RJUiA9ICQodG9wX3NyY2RpcikvZ3N0ICQodG9wX3NyY2RpcikvZXh0ICQodG9wX3NyY2Rpcikvc3lzCisKKyMgRXh0cmEgb3B0aW9ucyB0byBzdXBwbHkgdG8gZ3RrZG9jLXNjYW4uCitTQ0FOX09QVElPTlM9CisKKyMgRXh0cmEgb3B0aW9ucyB0byBzdXBwbHkgdG8gZ3RrZG9jLW1rZGIuCitNS0RCX09QVElPTlM9LS1zZ21sLW1vZGUgLS1zb3VyY2Utc3VmZml4ZXM9YyxoLGNjCisKKyMgRXh0cmEgb3B0aW9ucyB0byBzdXBwbHkgdG8gZ3RrZG9jLWZpeHJlZi4KK0ZJWFhSRUZfT1BUSU9OUz0tLWV4dHJhLWRpcj0kKEdMSUJfUFJFRklYKS9zaGFyZS9ndGstZG9jL2h0bWwgXAorCS0tZXh0cmEtZGlyPSQoR1NUX1BSRUZJWCkvc2hhcmUvZ3RrLWRvYy9odG1sIFwKKwktLWV4dHJhLWRpcj0kKEdTVFBCX1BSRUZJWCkvc2hhcmUvZ3RrLWRvYy9odG1sCisKKyMgVXNlZCBmb3IgZGVwZW5kZW5jaWVzLgorSEZJTEVfR0xPQj0gXAorICAkKHRvcF9zcmNkaXIpL2dzdC8qLyouaCAkKHRvcF9zcmNkaXIpL2V4dC8qLyouaCAkKHRvcF9zcmNkaXIpL3N5cy8qLyouaAorQ0ZJTEVfR0xPQj0gXAorICAkKHRvcF9zcmNkaXIpL2dzdC8qLyouYyAkKHRvcF9zcmNkaXIpL2V4dC8qLyouYyAkKHRvcF9zcmNkaXIpL3N5cy8qLyouYyBcCisgICQodG9wX3NyY2RpcikvZXh0LyovKi5jYyAkKHRvcF9zcmNkaXIpL3N5cy8qLyoubQorCisjIEhlYWRlciBmaWxlcyB0byBpZ25vcmUgd2hlbiBzY2FubmluZy4KK0lHTk9SRV9IRklMRVMgPSAKK0lHTk9SRV9DRklMRVMgPQorCisjIHdlIGFkZCBhbGwgLmggZmlsZXMgb2YgZWxlbWVudHMgdGhhdCBoYXZlIHNpZ25hbHMvYXJncyB3ZSB3YW50CisjIHNhZGx5IHRoaXMgYWxzbyBwdWxscyBpbiB0aGUgcHJpdmF0ZSBtZXRob2RzIC0gbWF5YmUgd2Ugc2hvdWxkCisjIG1vdmUgdGhvc2UgYXJvdW5kIGluIHRoZSBzb3VyY2UgPworIyBhbHNvLCB3ZSBzaG91bGQgYWRkIHNvbWUgc3R1ZmYgaGVyZSBjb25kaXRpb25hbGx5IGJhc2VkIG9uIHdoZXRoZXIKKyMgb3Igbm90IHRoZSBwbHVnaW4gd2lsbCBhY3R1YWxseSBidWlsZAorIyBidXQgSSdtIG5vdCBzdXJlIGFib3V0IHRoYXQgLSBpdCBtaWdodCBiZSB0aGlzIEp1c3QgV29ya3MgZ2l2ZW4gdGhhdAorIyB0aGUgcmVnaXN0cnkgd29uJ3QgaGF2ZSB0aGUgZWxlbWVudAorCitFWFRSQV9IRklMRVMgPSBcCisJJCh0b3Bfc3JjZGlyKS9leHQvYWFsaWIvZ3N0YWFzaW5rLmggXAorCSQodG9wX3NyY2RpcikvZXh0L2NhaXJvL2dzdGNhaXJvb3ZlcmxheS5oIFwKKwkkKHRvcF9zcmNkaXIpL2V4dC9kdi9nc3RkdmRlYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2V4dC9kdi9nc3RkdmRlbXV4LmggXAorCSQodG9wX3NyY2RpcikvZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2V4dC9mbGFjL2dzdGZsYWNlbmMuaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvZmxhYy9nc3RmbGFjdGFnLmggXAorCSQodG9wX3NyY2RpcikvZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5oIFwKKwkkKHRvcF9zcmNkaXIpL2V4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2V4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvanBlZy9nc3RqcGVnZGVjLmggXAorCSQodG9wX3NyY2RpcikvZXh0L2pwZWcvZ3N0anBlZ2VuYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2V4dC9sYW1lL2dzdGxhbWVtcDNlbmMuaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvbGliY2FjYS9nc3RjYWNhc2luay5oIFwKKwkkKHRvcF9zcmNkaXIpL2V4dC9saWJwbmcvZ3N0cG5nZGVjLmggXAorCSQodG9wX3NyY2RpcikvZXh0L2xpYnBuZy9nc3RwbmdlbmMuaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmggXAorCSQodG9wX3NyY2RpcikvZXh0L3Nob3V0Mi9nc3RzaG91dDIuaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2V4dC90YWdsaWIvZ3N0YXBldjJtdXguaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvdGFnbGliL2dzdGlkM3YybXV4LmggXAorCSQodG9wX3NyY2RpcikvZXh0L3R3b2xhbWUvZ3N0dHdvbGFtZW1wMmVuYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2V4dC9wdWxzZS9wdWxzZXNpbmsuaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvcHVsc2UvcHVsc2VzcmMuaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvc3BlZXgvZ3N0c3BlZXhlbmMuaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvc3BlZXgvZ3N0c3BlZXhkZWMuaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvdnB4L2dzdHZwOGRlYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2V4dC92cHgvZ3N0dnA4ZW5jLmggXAorCSQodG9wX3NyY2RpcikvZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYWxwaGEvZ3N0YWxwaGEuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9hcGV0YWcvZ3N0YXBlZGVtdXguaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYXVkaW9meC9hdWRpb2VjaG8uaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYXVkaW9meC9hdWRpb2R5bmFtaWMuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYXVkaW9meC9hdWRpb2ludmVydC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9hdWRpb2Z4L2F1ZGlvY2hlYmJhbmQuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNiYW5kLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2F1ZGlvZngvYXVkaW93c2luY2xpbWl0LmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2F1ZGlvZngvYXVkaW9maXJmaWx0ZXIuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYXVkaW9meC9nc3RzY2FsZXRlbXBvLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9hdXBhcnNlL2dzdGF1cGFyc2UuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9hdmkvZ3N0YXZpZGVtdXguaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYXZpL2dzdGF2aW11eC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9hdmkvZ3N0YXZpc3VidGl0bGUuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvY3V0dGVyL2dzdGN1dHRlci5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNzZXR0ZXIuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvZGVidWd1dGlscy9wcm9ncmVzc3JlcG9ydC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9kdG1mL2dzdGR0bWZzcmMuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvZHRtZi9nc3RydHBkdG1mc3JjLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvZWZmZWN0di9nc3RkaWNlLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9lZmZlY3R2L2dzdHF1YXJrLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2VmZmVjdHYvZ3N0cmV2LmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9lZmZlY3R2L2dzdHZlcnRpZ28uaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvZWZmZWN0di9nc3R3YXJwLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2VmZmVjdHYvZ3N0c3RyZWFrLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2VmZmVjdHYvZ3N0cmlwcGxlLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2VmZmVjdHYvZ3N0b3AuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvZWZmZWN0di9nc3RyYWRpb2FjLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVybmJhbmRzLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2Zsdi9nc3RmbHZkZW11eC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9mbHYvZ3N0Zmx2bXV4LmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2ZseC9nc3RmbHhkZWMuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvZ29vbS9nc3Rnb29tLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2dvb20yazEvZ3N0Z29vbS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9sYXcvYWxhdy1kZWNvZGUuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvbGF3L2FsYXctZW5jb2RlLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2xhdy9tdWxhdy1kZWNvZGUuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvbGF3L211bGF3LWVuY29kZS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvbGV2ZWwvZ3N0bGV2ZWwuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmggXAorCSQodG9wX3NyY2RpcikvZ3N0L21hdHJvc2thL3dlYm0tbXV4LmggXAorCSQodG9wX3NyY2RpcikvZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRmaWxlc3JjLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNyYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2lzb21wNC9xdGRlbXV4LmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2lzb21wNC9nc3RxdG11eC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9pc29tcDQvZ3N0cXRtdXgtZG9jLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L3JlcGxheWdhaW4vZ3N0cmdhbmFseXNpcy5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9yZXBsYXlnYWluL2dzdHJnbGltaXRlci5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9yZXBsYXlnYWluL2dzdHJndm9sdW1lLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L3J0cC9nc3RydHBqMmtwYXkuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvcnRwL2dzdHJ0cGpwZWdwYXkuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmggXAorCSQodG9wX3NyY2RpcikvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9ydHNwL2dzdHJ0cGRlYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9ydHNwL2dzdHJ0c3BzcmMuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9zbXB0ZS9nc3RzbXB0ZS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvdWRwL2dzdHVkcHNyYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC91ZHAvZ3N0dWRwc2luay5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC92aWRlb2JveC9nc3R2aWRlb2JveC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjJwYWQuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3Qvd2F2ZW5jL2dzdHdhdmVuYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC95NG0vZ3N0eTRtZW5jb2RlLmggXAorCSQodG9wX3NyY2Rpcikvc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5oIFwKKwkkKHRvcF9zcmNkaXIpL3N5cy9vc3M0L29zczQtc2luay5oIFwKKwkkKHRvcF9zcmNkaXIpL3N5cy9vc3M0L29zczQtc291cmNlLmggXAorCSQodG9wX3NyY2Rpcikvc3lzL29zcy9nc3Rvc3NzaW5rLmggXAorCSQodG9wX3NyY2Rpcikvc3lzL29zcy9nc3Rvc3NzcmMuaCBcCisJJCh0b3Bfc3JjZGlyKS9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuaCBcCisJJCh0b3Bfc3JjZGlyKS9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmggXAorCSQodG9wX3NyY2Rpcikvc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oIFwKKwkkKHRvcF9zcmNkaXIpL3N5cy92NGwyL2dzdHY0bDJzcmMuaCBcCisJJCh0b3Bfc3JjZGlyKS9zeXMvdjRsMi9nc3R2NGwyc2luay5oIFwKKwkkKHRvcF9zcmNkaXIpL3N5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uaCBcCisJJCh0b3Bfc3JjZGlyKS9zeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuaCBcCisJJCh0b3Bfc3JjZGlyKS9zeXMvdjRsMi9nc3R2NGwycmFkaW8uaCBcCisJJCh0b3Bfc3JjZGlyKS9zeXMvd2F2ZWZvcm0vZ3N0d2F2ZWZvcm1zaW5rLmggXAorCSQodG9wX3NyY2Rpcikvc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuaAorCisjIGV4YW1wbGUgY29kZSB0aGF0IG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byB4bWwgYW5kIHBsYWNlZCBpbiB4bWwvCitFWEFNUExFX0NGSUxFUyA9IFwKKwkkKHRvcF9zcmNkaXIpL3Rlc3RzL2V4YW1wbGVzL2xldmVsL2xldmVsLWV4YW1wbGUuYyBcCisJJCh0b3Bfc3JjZGlyKS90ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9zcGVjdHJ1bS1leGFtcGxlLmMgXAorCSQodG9wX3NyY2RpcikvdGVzdHMvZXhhbXBsZXMvYXVkaW9meC9maXJmaWx0ZXItZXhhbXBsZS5jIFwKKwkkKHRvcF9zcmNkaXIpL3Rlc3RzL2V4YW1wbGVzL2F1ZGlvZngvaWlyZmlsdGVyLWV4YW1wbGUuYworCisjIEltYWdlcyB0byBjb3B5IGludG8gSFRNTCBkaXJlY3RvcnkuCitIVE1MX0lNQUdFUyA9CisKKyMgRXh0cmEgU0dNTCBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBieSAkKERPQ19NQUlOX1NHTUxfRklMRSkuCitjb250ZW50X2ZpbGVzID0KKworIyBPdGhlciBmaWxlcyB0byBkaXN0cmlidXRlLgorZXh0cmFfZmlsZXMgPQorCisjIENGTEFHUyBhbmQgTERGTEFHUyBmb3IgY29tcGlsaW5nIHNjYW4gcHJvZ3JhbS4gT25seSBuZWVkZWQgaWYgeW91ciBhcHAvbGliCisjIGNvbnRhaW5zIEd0a09iamVjdHMvR09iamVjdHMgYW5kIHlvdSB3YW50IHRvIGRvY3VtZW50IHNpZ25hbHMgYW5kIHByb3BlcnRpZXMuCitHVEtET0NfQ0ZMQUdTID0gJChHU1RfQkFTRV9DRkxBR1MpIC1JJCh0b3BfYnVpbGRkaXIpCitHVEtET0NfTElCUyA9ICQoR1NUX0JBU0VfTElCUykKKworIyBJZiB5b3UgbmVlZCB0byBvdmVycmlkZSBzb21lIG9mIHRoZSBkZWNsYXJhdGlvbnMsIHBsYWNlIHRoZW0gaW4gdGhpcyBmaWxlCisjIGFuZCB1bmNvbW1lbnQgdGhpcyBsaW5lLgorI0RPQ19PVkVSUklERVMgPSAkKERPQ19NT0RVTEUpLW92ZXJyaWRlcy50eHQKK0RPQ19PVkVSUklERVMgPQorCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29tbW9uL2d0ay1kb2MtcGx1Z2lucy5tYWsKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sIGIvZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRlY2IwYQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sCkBAIC0wLDAgKzEsMzc3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBib29rIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC4xLjIvL0VOIiAKKyAgICAgICAgICAgICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMS4yL2RvY2Jvb2t4LmR0ZCIgWworPCFFTlRJVFkgJSBsb2NhbC5jb21tb24uYXR0cmliICJ4bWxuczp4aSAgQ0RBVEEgICNGSVhFRCAnaHR0cDovL3d3dy53My5vcmcvMjAwMy9YSW5jbHVkZSciPgorPCFFTlRJVFkgJSB2ZXJzaW9uLWVudGl0aWVzIFNZU1RFTSAidmVyc2lvbi5lbnRpdGllcyI+CisldmVyc2lvbi1lbnRpdGllczsKK10+CisKKzxib29rIGlkPSJpbmRleCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvWEluY2x1ZGUiPgorICA8Ym9va2luZm8+CisgICAgPHRpdGxlPkdTdHJlYW1lciBHb29kIFBsdWdpbnMgJkdTVF9BUElfVkVSU0lPTjsgUGx1Z2lucyBSZWZlcmVuY2UgTWFudWFsPC90aXRsZT4KKyAgICA8cmVsZWFzZWluZm8+CisgICAgICBmb3IgR1N0cmVhbWVyIEdvb2QgUGx1Z2lucyAmR1NUX0FQSV9WRVJTSU9OOyAoJkdTVF9WRVJTSU9OOykKKyAgICAgIFRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50YXRpb24gY2FuIGJlIGZvdW5kIG9uLWxpbmUgYXQKKyAgICAgIDx1bGluayByb2xlPSJvbmxpbmUtbG9jYXRpb24iIHVybD0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvZGF0YS9kb2MvZ3N0cmVhbWVyL2hlYWQvZ3N0LXBsdWdpbnMtZ29vZC9odG1sLyI+aHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvZGF0YS9kb2MvZ3N0cmVhbWVyL2hlYWQvZ3N0LXBsdWdpbnMtZ29vZC9odG1sLzwvdWxpbms+LgorICAgIDwvcmVsZWFzZWluZm8+CisgIDwvYm9va2luZm8+CisKKyAgPGNoYXB0ZXI+CisgICAgPHRpdGxlPmdzdC1wbHVnaW5zLWdvb2QgRWxlbWVudHM8L3RpdGxlPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LTNncHBtdXgueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWFhY3BhcnNlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hYXNpbmsueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWFjM3BhcnNlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hZ2luZ3R2LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hbGF3ZGVjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hbGF3ZW5jLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hbHBoYWNvbG9yLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hbHBoYS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYW1ycGFyc2UueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWFwZWRlbXV4LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hcGV2Mm11eC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYXNwZWN0cmF0aW9jcm9wLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hc3Rlcmlza2gyNjMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWF1ZGlvYW1wbGlmeS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYXVkaW9jaGViYmFuZC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYXVkaW9jaGVibGltaXQueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWF1ZGlvZHluYW1pYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYXVkaW9lY2hvLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hdWRpb2ZpcmZpbHRlci54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYXVkaW9paXJmaWx0ZXIueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWF1ZGlvaW52ZXJ0LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hdWRpb2thcmFva2UueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWF1ZGlvcGFub3JhbWEueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWF1ZGlvd3NpbmNiYW5kLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hdWRpb3dzaW5jbGltaXQueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWF1cGFyc2UueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWF1dG9hdWRpb3NpbmsueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWF1dG9hdWRpb3NyYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYXV0b3ZpZGVvc2luay54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYXV0b3ZpZGVvc3JjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hdmlkZW11eC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYXZpbXV4LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hdmlzdWJ0aXRsZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYnJlYWtteWRhdGEueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWNhY2FzaW5rLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1jYWlyb292ZXJsYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWNhcHNzZXR0ZXIueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWNwdXJlcG9ydC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtY3V0dGVyLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1kY2FwYXJzZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtZGVpbnRlcmxhY2UueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWRlaW50ZXJsZWF2ZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtZGljZXR2LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1kaXJlY3Rzb3VuZHNpbmsueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWR0bWZzcmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWR2MTM5NHNyYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtZHZkZWMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWR2ZGVtdXgueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWR5bnVkcHNpbmsueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWVkZ2V0di54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtZXF1YWxpemVyLTEwYmFuZHMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWVxdWFsaXplci0zYmFuZHMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWVxdWFsaXplci1uYmFuZHMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWZpcmZpbHRlci1leGFtcGxlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1mbGFjZGVjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1mbGFjZW5jLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1mbGFjcGFyc2UueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWZsYWN0YWcueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWZsdmRlbXV4LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1mbHZtdXgueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWZseGRlYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtZ2FtbWEueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWdka3BpeGJ1ZmRlYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtZ2RrcGl4YnVmb3ZlcmxheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtZ2RrcGl4YnVmc2luay54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtZ29vbTJrMS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtZ29vbS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtZ3RrZ2xzaW5rLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ndGtzaW5rLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1oZHYxMzk0c3JjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1pY3lkZW11eC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtaWQzZGVtdXgueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWlkM3YybXV4LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1paXJlcXVhbGl6ZXIueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWlpcmZpbHRlci1leGFtcGxlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1pbWFnZWZyZWV6ZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtaW50ZXJsZWF2ZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtaXNtbG11eC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtamFja2F1ZGlvc2luay54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtamFja2F1ZGlvc3JjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1qcGVnZGVjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1qcGVnZW5jLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1sYW1lbXAzZW5jLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1sZXZlbC1leGFtcGxlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1sZXZlbC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtbWF0cm9za2FkZW11eC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtbWF0cm9za2FtdXgueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LW1hdHJvc2thcGFyc2UueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LW1qMm11eC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtbW9ub3Njb3BlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1tcDRtdXgueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LW1wZWdhdWRpb3BhcnNlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1tcGcxMjNhdWRpb2RlYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtbXVsYXdkZWMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LW11bGF3ZW5jLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1tdWx0aWZpbGVzaW5rLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1tdWx0aWZpbGVzcmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LW11bHRpcGFydGRlbXV4LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1tdWx0aXBhcnRtdXgueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LW11bHRpdWRwc2luay54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtbmF2aWdhdGlvbnRlc3QueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LW5hdnNlZWsueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LW9wdHYueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LW9zczRzaW5rLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1vc3M0c3JjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1vc3NzaW5rLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1vc3NzcmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LW9zeGF1ZGlvc2luay54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtb3N4YXVkaW9zcmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LW9zeHZpZGVvc2luay54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcG5nZGVjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1wbmdlbmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXByb2dyZXNzcmVwb3J0LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1wdWxzZXNpbmsueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXB1bHNlc3JjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1wdXNoZmlsZXNyYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcXRkZW11eC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcXRtb292cmVjb3Zlci54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcXRtdXgueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXF1YXJrdHYueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJhZGlvYWN0di54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcmV2dHYueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJnYW5hbHlzaXMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJnbGltaXRlci54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcmd2b2x1bWUueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJpcHBsZXR2LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ybmRidWZmZXJzaXplLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBhYzNkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwYWMzcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBhbXJkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwYW1ycGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBiaW4ueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGJ2ZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGJ2cGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBjZWx0ZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGNlbHRwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGRlYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwZHRtZmRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBkdG1mbXV4LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBkdG1mc3JjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBkdmRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBkdnBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwZzcyMmRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBnNzIycGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBnNzIzZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGc3MjNwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGc3MjZkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwZzcyNnBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwZzcyOWRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBnNzI5cGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBnc21kZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwZ3NtcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBnc3RkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwZ3N0cGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBoMjYxZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGgyNjFwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGgyNjNkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwaDI2M3BheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwaDI2M3BkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwaDI2M3BwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGgyNjRkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwaDI2NHBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwaDI2NWRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBoMjY1cGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBpbGJjZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGlsYmNwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGoya2RlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBqMmtwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGppdHRlcmJ1ZmZlci54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwanBlZ2RlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBqcGVncGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBrbHZkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwa2x2cGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBMOGRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBMOHBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwTDE2ZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cEwxNnBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwTDI0ZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cEwyNHBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwbXAxc2RlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBtcDJ0ZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cG1wMnRwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cG1wNGFkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwbXA0YXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwbXA0Z2RlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBtcDRncGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBtcDR2ZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cG1wNHZwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cG1wYWRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBtcGFwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cG1wYXJvYnVzdGRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBtcHZkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwbXB2cGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBtdXgueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cG9wdXNkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwb3B1c3BheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwcGNtYWRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBwY21hcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBwY211ZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHBjbXVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHB0ZGVtdXgueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHFjZWxwZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHFkbTJkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwcnR4cXVldWUueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHJ0eHJlY2VpdmUueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHJ0eHNlbmQueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHNiY2RlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBzYmNwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHNlc3Npb24ueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHNpcmVuZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHNpcmVucGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBzcGVleGRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBzcGVleHBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwc3NyY2RlbXV4LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBzdHJlYW1kZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwc3RyZWFtcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBzdjN2ZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHRoZW9yYWRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHB0aGVvcmFwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHZvcmJpc2RlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHB2b3JiaXNwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHZwOGRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHB2cDhwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHZwOWRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHB2cDlwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHZyYXdkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwdnJhd3BheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRweHF0ZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0c3BzcmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXNiY3BhcnNlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1zY2FsZXRlbXBvLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1zaGFnYWRlbGljdHYueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXNoYXBld2lwZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtc2hvdXQyc2VuZC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtc21wdGVhbHBoYS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtc21wdGUueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXNvdXBodHRwY2xpZW50c2luay54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtc291cGh0dHBzcmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXNwZWN0cnVtLWV4YW1wbGUueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXNwZWN0cnVtLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1zcGVleGRlYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtc3BlZXhlbmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXNwbGl0ZmlsZXNyYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtc3BsaXRtdXhzaW5rLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1zcGxpdG11eHNyYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtc3RyZWFrdHYueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXRhZ2luamVjdC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtdGVzdHNpbmsueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXR3b2xhbWVtcDJlbmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXVkcHNpbmsueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXVkcHNyYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtdjRsMnJhZGlvLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC12NGwyc2luay54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtdjRsMnNyYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtdmVydGlnb3R2LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC12aWRlb2JhbGFuY2UueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXZpZGVvYm94LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC12aWRlb2Nyb3AueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXZpZGVvZmxpcC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtdmlkZW9tZWRpYW4ueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXZpZGVvbWl4ZXIueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXZwOGRlYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtdnA4ZW5jLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC12cDlkZWMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXZwOWVuYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtd2FycHR2LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC13YXZlZm9ybXNpbmsueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXdhdmVuYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtd2F2cGFja2RlYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtd2F2cGFja2VuYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtd2F2cGFja3BhcnNlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC13YXZwYXJzZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtd2VibW11eC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQteGltYWdlc3JjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC15NG1lbmMueG1sIiAvPgorICA8L2NoYXB0ZXI+CisKKyAgPGNoYXB0ZXI+CisgICAgPHRpdGxlPmdzdC1wbHVnaW5zLWdvb2QgUGx1Z2luczwvdGl0bGU+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi0xMzk0LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWFhc2luay54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1hbGF3LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWFscGhhY29sb3IueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tYWxwaGEueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tYXBldGFnLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWF1ZGlvZngueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWF1cGFyc2UueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tYXV0b2RldGVjdC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1hdmkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tY2FjYXNpbmsueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tY2Fpcm8ueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tY3V0dGVyLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWRlYnVnLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWRpcmVjdHNvdW5kLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWR0bWYueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tZHYueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tZWZmZWN0di54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1lcXVhbGl6ZXIueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tZmxhYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1mbHYueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tZmx4ZGVjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWdka3BpeGJ1Zi54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1nb29tMmsxLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWdvb20ueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tZ3RrLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWljeWRlbXV4LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWlkM2RlbXV4LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWltYWdlZnJlZXplLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWludGVybGVhdmUueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4taXNvbXA0LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWphY2sueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tanBlZy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1sYW1lLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWxldmVsLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLW1hdHJvc2thLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLW1vbm9zY29wZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1tcGcxMjMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tbXVsYXcueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tbXVsdGlmaWxlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLW11bHRpcGFydC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1vc3M0LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLW9zc2F1ZGlvLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLW9zeGF1ZGlvLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLW9zeHZpZGVvLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLXBuZy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1wdWxzZWF1ZGlvLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLXJlcGxheWdhaW4ueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tcnRwbWFuYWdlci54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1ydHAueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tcnRzcC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1zaGFwZXdpcGUueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tc2hvdXQyLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLXNtcHRlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLXNvdXAueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tc3BlY3RydW0ueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tc3BlZXgueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tdGFnbGliLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLXR3b2xhbWUueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tdWRwLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi12aWRlb2JveC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi12aWRlb2Nyb3AueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tdmlkZW9taXhlci54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi12cHgueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4td2F2ZWZvcm0ueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4td2F2ZW5jLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLXdhdnBhY2sueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4td2F2cGFyc2UueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4teGltYWdlc3JjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLXk0bWVuYy54bWwiIC8+CisgIDwvY2hhcHRlcj4KKzwvYm9vaz4KZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0IGIvZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZmZDU0YgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0CkBAIC0wLDAgKzEsNDM4MiBAQAorPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LTNncHBtdXg8L0ZJTEU+Cis8VElUTEU+M2dwcG11eDwvVElUTEU+CitHc3QzR1BQTXV4Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdDNHUFBNdXhDbGFzcworR1NUXzNfR1BQX01VWAorR1NUXzNfR1BQX01VWF9DQVNUCitHU1RfSVNfM19HUFBfTVVYCitHU1RfM19HUFBfTVVYX0NMQVNTCitHU1RfSVNfM19HUFBfTVVYX0NMQVNTCitHU1RfVFlQRV8zX0dQUF9NVVgKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfM19ncHBfbXV4X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hYXNpbms8L0ZJTEU+Cis8VElUTEU+YWFzaW5rPC9USVRMRT4KK0dzdEFBU2luaworR3N0QUFTaW5rRGl0aGVyZXJzCitHc3RBQVNpbmtEcml2ZXJzCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEFBU2lua0NsYXNzCitHU1RfQUFfU0lOSworR1NUX0FBX1NJTktfQ0FTVAorR1NUX0lTX0FBX1NJTksKK0dTVF9BQV9TSU5LX0NMQVNTCitHU1RfSVNfQUFfU0lOS19DTEFTUworR1NUX1RZUEVfQUFfU0lOSworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hYV9zaW5rX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hbGF3ZGVjPC9GSUxFPgorPFRJVExFPmFsYXdkZWM8L1RJVExFPgorR3N0QUxhd0RlYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBTGF3RGVjQ2xhc3MKK0dTVF9BX0xBV19ERUMKK0dTVF9BX0xBV19ERUNfQ0FTVAorR1NUX0lTX0FfTEFXX0RFQworR1NUX0FfTEFXX0RFQ19DTEFTUworR1NUX0lTX0FfTEFXX0RFQ19DTEFTUworR1NUX1RZUEVfQV9MQVdfREVDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2FfbGF3X2RlY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtYWxhd2VuYzwvRklMRT4KKzxUSVRMRT5hbGF3ZW5jPC9USVRMRT4KK0dzdEFMYXdFbmMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0QUxhd0VuY0NsYXNzCitHU1RfQV9MQVdfRU5DCitHU1RfQV9MQVdfRU5DX0NBU1QKK0dTVF9JU19BX0xBV19FTkMKK0dTVF9BX0xBV19FTkNfQ0xBU1MKK0dTVF9JU19BX0xBV19FTkNfQ0xBU1MKK0dTVF9UWVBFX0FfTEFXX0VOQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hX2xhd19lbmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWFhY3BhcnNlPC9GSUxFPgorPFRJVExFPmFhY3BhcnNlPC9USVRMRT4KK0dzdEFhY1BhcnNlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEFhY1BhcnNlQ2xhc3MKK0dTVF9BQUNfUEFSU0UKK0dTVF9BQUNfUEFSU0VfQ0FTVAorR1NUX0lTX0FBQ19QQVJTRQorR1NUX0FBQ19QQVJTRV9DTEFTUworR1NUX0lTX0FBQ19QQVJTRV9DTEFTUworR1NUX1RZUEVfQUFDX1BBUlNFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2FhY19wYXJzZV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtYWMzcGFyc2U8L0ZJTEU+Cis8VElUTEU+YWMzcGFyc2U8L1RJVExFPgorR3N0QWMzUGFyc2UKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0QWMzUGFyc2VDbGFzcworR1NUX0FDM19QQVJTRQorR1NUX0FDM19QQVJTRV9DQVNUCitHU1RfSVNfQUMzX1BBUlNFCitHU1RfQUMzX1BBUlNFX0NMQVNTCitHU1RfSVNfQUMzX1BBUlNFX0NMQVNTCitHU1RfVFlQRV9BQzNfUEFSU0UKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfYWMzX3BhcnNlX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hZ2luZ3R2PC9GSUxFPgorPFRJVExFPmFnaW5ndHY8L1RJVExFPgorR3N0QWdpbmdUVgorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBZ2luZ1RWQ2xhc3MKK0dTVF9BR0lOR19UVgorR1NUX0FHSU5HX1RWX0NBU1QKK0dTVF9JU19BR0lOR19UVgorR1NUX0FHSU5HX1RWX0NMQVNTCitHU1RfSVNfQUdJTkdfVFZfQ0xBU1MKK0dTVF9UWVBFX0FHSU5HX1RWCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2FnaW5nX3R2X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hbHBoYTwvRklMRT4KKzxUSVRMRT5hbHBoYTwvVElUTEU+CitHc3RBbHBoYQorR3N0QWxwaGFNZXRob2QKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0QWxwaGFDbGFzcworR1NUX0FMUEhBCitHU1RfQUxQSEFfQ0FTVAorR1NUX0lTX0FMUEhBCitHU1RfQUxQSEFfQ0xBU1MKK0dTVF9JU19BTFBIQV9DTEFTUworR1NUX1RZUEVfQUxQSEEKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfYWxwaGFfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWFscGhhY29sb3I8L0ZJTEU+Cis8VElUTEU+YWxwaGFjb2xvcjwvVElUTEU+CitHc3RBbHBoYUNvbG9yCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEFscGhhQ29sb3JDbGFzcworR1NUX0FMUEhBX0NPTE9SCitHU1RfQUxQSEFfQ09MT1JfQ0FTVAorR1NUX0lTX0FMUEhBX0NPTE9SCitHU1RfQUxQSEFfQ09MT1JfQ0xBU1MKK0dTVF9JU19BTFBIQV9DT0xPUl9DTEFTUworR1NUX1RZUEVfQUxQSEFfQ09MT1IKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfYWxwaGFfY29sb3JfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWFtcnBhcnNlPC9GSUxFPgorPFRJVExFPmFtcnBhcnNlPC9USVRMRT4KK0dzdEFtclBhcnNlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEFtclBhcnNlQ2xhc3MKK0dTVF9BTVJfUEFSU0UKK0dTVF9BTVJfUEFSU0VfQ0FTVAorR1NUX0lTX0FNUl9QQVJTRQorR1NUX0FNUl9QQVJTRV9DTEFTUworR1NUX0lTX0FNUl9QQVJTRV9DTEFTUworR1NUX1RZUEVfQU1SX1BBUlNFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2Ftcl9wYXJzZV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtYXBlZGVtdXg8L0ZJTEU+Cis8VElUTEU+YXBlZGVtdXg8L1RJVExFPgorR3N0QXBlRGVtdXgKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0QXBlRGVtdXhDbGFzcworR1NUX0FQRV9ERU1VWAorR1NUX0FQRV9ERU1VWF9DQVNUCitHU1RfSVNfQVBFX0RFTVVYCitHU1RfQVBFX0RFTVVYX0NMQVNTCitHU1RfSVNfQVBFX0RFTVVYX0NMQVNTCitHU1RfVFlQRV9BUEVfREVNVVgKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfYXBlX2RlbXV4X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hcGV2Mm11eDwvRklMRT4KKzxUSVRMRT5hcGV2Mm11eDwvVElUTEU+CitHc3RBcGV2Mk11eAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBcGV2Mk11eENsYXNzCitHU1RfQVBFVjJfTVVYCitHU1RfQVBFVjJfTVVYX0NBU1QKK0dTVF9JU19BUEVWMl9NVVgKK0dTVF9BUEVWMl9NVVhfQ0xBU1MKK0dTVF9JU19BUEVWMl9NVVhfQ0xBU1MKK0dTVF9UWVBFX0FQRVYyX01VWAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hcGV2Ml9tdXhfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWFzcGVjdHJhdGlvY3JvcDwvRklMRT4KKzxUSVRMRT5hc3BlY3RyYXRpb2Nyb3A8L1RJVExFPgorR3N0QXNwZWN0UmF0aW9Dcm9wCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEFzcGVjdFJhdGlvQ3JvcENsYXNzCitHU1RfQVNQRUNUX1JBVElPX0NST1AKK0dTVF9BU1BFQ1RfUkFUSU9fQ1JPUF9DQVNUCitHU1RfSVNfQVNQRUNUX1JBVElPX0NST1AKK0dTVF9BU1BFQ1RfUkFUSU9fQ1JPUF9DTEFTUworR1NUX0lTX0FTUEVDVF9SQVRJT19DUk9QX0NMQVNTCitHU1RfVFlQRV9BU1BFQ1RfUkFUSU9fQ1JPUAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hc3BlY3RfcmF0aW9fY3JvcF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtYXN0ZXJpc2toMjYzPC9GSUxFPgorPFRJVExFPmFzdGVyaXNraDI2MzwvVElUTEU+CitHc3RBc3Rlcmlza2gyNjMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0QXN0ZXJpc2toMjYzQ2xhc3MKK0dTVF9BU1RFUklTS0gyNjMKK0dTVF9BU1RFUklTS0gyNjNfQ0FTVAorR1NUX0lTX0FTVEVSSVNLSDI2MworR1NUX0FTVEVSSVNLSDI2M19DTEFTUworR1NUX0lTX0FTVEVSSVNLSDI2M19DTEFTUworR1NUX1RZUEVfQVNURVJJU0tIMjYzCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2FzdGVyaXNraDI2M19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtYXVwYXJzZTwvRklMRT4KKzxUSVRMRT5hdXBhcnNlPC9USVRMRT4KK0dzdEF1UGFyc2UKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0QXVQYXJzZUNsYXNzCitHU1RfQVVfUEFSU0UKK0dTVF9BVV9QQVJTRV9DQVNUCitHU1RfSVNfQVVfUEFSU0UKK0dTVF9BVV9QQVJTRV9DTEFTUworR1NUX0lTX0FVX1BBUlNFX0NMQVNTCitHU1RfVFlQRV9BVV9QQVJTRQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hdV9wYXJzZV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtYXVkaW9hbXBsaWZ5PC9GSUxFPgorPFRJVExFPmF1ZGlvYW1wbGlmeTwvVElUTEU+CitHc3RBdWRpb0FtcGxpZnkKK0dzdEF1ZGlvQW1wbGlmeUNsaXBwaW5nTWV0aG9kCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEF1ZGlvQW1wbGlmeUNsYXNzCitHU1RfQVVESU9fQU1QTElGWQorR1NUX0FVRElPX0FNUExJRllfQ0FTVAorR1NUX0lTX0FVRElPX0FNUExJRlkKK0dTVF9BVURJT19BTVBMSUZZX0NMQVNTCitHU1RfSVNfQVVESU9fQU1QTElGWV9DTEFTUworR1NUX1RZUEVfQVVESU9fQU1QTElGWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hdWRpb19hbXBsaWZ5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hdWRpb2NoZWJiYW5kPC9GSUxFPgorPFRJVExFPmF1ZGlvY2hlYmJhbmQ8L1RJVExFPgorR3N0QXVkaW9DaGViQmFuZAorR3N0QXVkaW9DaGViQmFuZE1vZGUKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0QXVkaW9DaGViQmFuZENsYXNzCitHU1RfQVVESU9fQ0hFQl9CQU5ECitHU1RfQVVESU9fQ0hFQl9CQU5EX0NBU1QKK0dTVF9JU19BVURJT19DSEVCX0JBTkQKK0dTVF9BVURJT19DSEVCX0JBTkRfQ0xBU1MKK0dTVF9JU19BVURJT19DSEVCX0JBTkRfQ0xBU1MKK0dTVF9UWVBFX0FVRElPX0NIRUJfQkFORAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hdWRpb19jaGViX2JhbmRfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWF1ZGlvY2hlYmxpbWl0PC9GSUxFPgorPFRJVExFPmF1ZGlvY2hlYmxpbWl0PC9USVRMRT4KK0dzdEF1ZGlvQ2hlYkxpbWl0CitHc3RBdWRpb0NoZWJMaW1pdE1vZGUKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0QXVkaW9DaGViTGltaXRDbGFzcworR1NUX0FVRElPX0NIRUJfTElNSVQKK0dTVF9BVURJT19DSEVCX0xJTUlUX0NBU1QKK0dTVF9JU19BVURJT19DSEVCX0xJTUlUCitHU1RfQVVESU9fQ0hFQl9MSU1JVF9DTEFTUworR1NUX0lTX0FVRElPX0NIRUJfTElNSVRfQ0xBU1MKK0dTVF9UWVBFX0FVRElPX0NIRUJfTElNSVQKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfYXVkaW9fY2hlYl9saW1pdF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtYXVkaW9keW5hbWljPC9GSUxFPgorPFRJVExFPmF1ZGlvZHluYW1pYzwvVElUTEU+CitHc3RBdWRpb0R5bmFtaWMKK0dzdEF1ZGlvRHluYW1pY0NoYXJhY3RlcmlzdGljcworR3N0QXVkaW9EeW5hbWljTW9kZQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBdWRpb0R5bmFtaWNDbGFzcworR1NUX0FVRElPX0RZTkFNSUMKK0dTVF9BVURJT19EWU5BTUlDX0NBU1QKK0dTVF9JU19BVURJT19EWU5BTUlDCitHU1RfQVVESU9fRFlOQU1JQ19DTEFTUworR1NUX0lTX0FVRElPX0RZTkFNSUNfQ0xBU1MKK0dTVF9UWVBFX0FVRElPX0RZTkFNSUMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfYXVkaW9fZHluYW1pY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtYXVkaW9lY2hvPC9GSUxFPgorPFRJVExFPmF1ZGlvZWNobzwvVElUTEU+CitHc3RBdWRpb0VjaG8KKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0QXVkaW9FY2hvQ2xhc3MKK0dTVF9BVURJT19FQ0hPCitHU1RfQVVESU9fRUNIT19DQVNUCitHU1RfSVNfQVVESU9fRUNITworR1NUX0FVRElPX0VDSE9fQ0xBU1MKK0dTVF9JU19BVURJT19FQ0hPX0NMQVNTCitHU1RfVFlQRV9BVURJT19FQ0hPCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2F1ZGlvX2VjaG9fZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWF1ZGlvZmlyZmlsdGVyPC9GSUxFPgorPFRJVExFPmF1ZGlvZmlyZmlsdGVyPC9USVRMRT4KK0dzdEF1ZGlvRklSRmlsdGVyCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEF1ZGlvRklSRmlsdGVyQ2xhc3MKK0dTVF9BVURJT19GSVJfRklMVEVSCitHU1RfQVVESU9fRklSX0ZJTFRFUl9DQVNUCitHU1RfSVNfQVVESU9fRklSX0ZJTFRFUgorR1NUX0FVRElPX0ZJUl9GSUxURVJfQ0xBU1MKK0dTVF9JU19BVURJT19GSVJfRklMVEVSX0NMQVNTCitHU1RfVFlQRV9BVURJT19GSVJfRklMVEVSCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2F1ZGlvX2Zpcl9maWx0ZXJfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWF1ZGlvaWlyZmlsdGVyPC9GSUxFPgorPFRJVExFPmF1ZGlvaWlyZmlsdGVyPC9USVRMRT4KK0dzdEF1ZGlvSUlSRmlsdGVyCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEF1ZGlvSUlSRmlsdGVyQ2xhc3MKK0dTVF9BVURJT19JSVJfRklMVEVSCitHU1RfQVVESU9fSUlSX0ZJTFRFUl9DQVNUCitHU1RfSVNfQVVESU9fSUlSX0ZJTFRFUgorR1NUX0FVRElPX0lJUl9GSUxURVJfQ0xBU1MKK0dTVF9JU19BVURJT19JSVJfRklMVEVSX0NMQVNTCitHU1RfVFlQRV9BVURJT19JSVJfRklMVEVSCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2F1ZGlvX2lpcl9maWx0ZXJfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWF1ZGlvaW52ZXJ0PC9GSUxFPgorPFRJVExFPmF1ZGlvaW52ZXJ0PC9USVRMRT4KK0dzdEF1ZGlvSW52ZXJ0Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEF1ZGlvSW52ZXJ0Q2xhc3MKK0dTVF9BVURJT19JTlZFUlQKK0dTVF9BVURJT19JTlZFUlRfQ0FTVAorR1NUX0lTX0FVRElPX0lOVkVSVAorR1NUX0FVRElPX0lOVkVSVF9DTEFTUworR1NUX0lTX0FVRElPX0lOVkVSVF9DTEFTUworR1NUX1RZUEVfQVVESU9fSU5WRVJUCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2F1ZGlvX2ludmVydF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtYXVkaW9rYXJhb2tlPC9GSUxFPgorPFRJVExFPmF1ZGlva2FyYW9rZTwvVElUTEU+CitHc3RBdWRpb0thcmFva2UKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0QXVkaW9LYXJhb2tlQ2xhc3MKK0dTVF9BVURJT19LQVJBT0tFCitHU1RfQVVESU9fS0FSQU9LRV9DQVNUCitHU1RfSVNfQVVESU9fS0FSQU9LRQorR1NUX0FVRElPX0tBUkFPS0VfQ0xBU1MKK0dTVF9JU19BVURJT19LQVJBT0tFX0NMQVNTCitHU1RfVFlQRV9BVURJT19LQVJBT0tFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2F1ZGlvX2thcmFva2VfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWF1ZGlvcGFub3JhbWE8L0ZJTEU+Cis8VElUTEU+YXVkaW9wYW5vcmFtYTwvVElUTEU+CitHc3RBdWRpb1Bhbm9yYW1hCitHc3RBdWRpb1Bhbm9yYW1hTWV0aG9kCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEF1ZGlvUGFub3JhbWFDbGFzcworR1NUX0FVRElPX1BBTk9SQU1BCitHU1RfQVVESU9fUEFOT1JBTUFfQ0FTVAorR1NUX0lTX0FVRElPX1BBTk9SQU1BCitHU1RfQVVESU9fUEFOT1JBTUFfQ0xBU1MKK0dTVF9JU19BVURJT19QQU5PUkFNQV9DTEFTUworR1NUX1RZUEVfQVVESU9fUEFOT1JBTUEKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfYXVkaW9fcGFub3JhbWFfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWF1ZGlvd3NpbmNiYW5kPC9GSUxFPgorPFRJVExFPmF1ZGlvd3NpbmNiYW5kPC9USVRMRT4KK0dzdEF1ZGlvV1NpbmNCYW5kCitHc3RBdWRpb1dTaW5jQmFuZE1vZGUKK0dzdEF1ZGlvV1NpbmNCYW5kV2luZG93Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEF1ZGlvV1NpbmNCYW5kQ2xhc3MKK0dTVF9BVURJT19XX1NJTkNfQkFORAorR1NUX0FVRElPX1dfU0lOQ19CQU5EX0NBU1QKK0dTVF9JU19BVURJT19XX1NJTkNfQkFORAorR1NUX0FVRElPX1dfU0lOQ19CQU5EX0NMQVNTCitHU1RfSVNfQVVESU9fV19TSU5DX0JBTkRfQ0xBU1MKK0dTVF9UWVBFX0FVRElPX1dfU0lOQ19CQU5ECis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2F1ZGlvX3dfc2luY19iYW5kX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hdWRpb3dzaW5jbGltaXQ8L0ZJTEU+Cis8VElUTEU+YXVkaW93c2luY2xpbWl0PC9USVRMRT4KK0dzdEF1ZGlvV1NpbmNMaW1pdAorR3N0QXVkaW9XU2luY0xpbWl0TW9kZQorR3N0QXVkaW9XU2luY0xpbWl0V2luZG93Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEF1ZGlvV1NpbmNMaW1pdENsYXNzCitHU1RfQVVESU9fV19TSU5DX0xJTUlUCitHU1RfQVVESU9fV19TSU5DX0xJTUlUX0NBU1QKK0dTVF9JU19BVURJT19XX1NJTkNfTElNSVQKK0dTVF9BVURJT19XX1NJTkNfTElNSVRfQ0xBU1MKK0dTVF9JU19BVURJT19XX1NJTkNfTElNSVRfQ0xBU1MKK0dTVF9UWVBFX0FVRElPX1dfU0lOQ19MSU1JVAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hdWRpb193X3NpbmNfbGltaXRfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWF1dG9hdWRpb3Npbms8L0ZJTEU+Cis8VElUTEU+YXV0b2F1ZGlvc2luazwvVElUTEU+CitHc3RBdXRvQXVkaW9TaW5rCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEF1dG9BdWRpb1NpbmtDbGFzcworR1NUX0FVVE9fQVVESU9fU0lOSworR1NUX0FVVE9fQVVESU9fU0lOS19DQVNUCitHU1RfSVNfQVVUT19BVURJT19TSU5LCitHU1RfQVVUT19BVURJT19TSU5LX0NMQVNTCitHU1RfSVNfQVVUT19BVURJT19TSU5LX0NMQVNTCitHU1RfVFlQRV9BVVRPX0FVRElPX1NJTksKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfYXV0b19hdWRpb19zaW5rX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hdXRvYXVkaW9zcmM8L0ZJTEU+Cis8VElUTEU+YXV0b2F1ZGlvc3JjPC9USVRMRT4KK0dzdEF1dG9BdWRpb1NyYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBdXRvQXVkaW9TcmNDbGFzcworR1NUX0FVVE9fQVVESU9fU1JDCitHU1RfQVVUT19BVURJT19TUkNfQ0FTVAorR1NUX0lTX0FVVE9fQVVESU9fU1JDCitHU1RfQVVUT19BVURJT19TUkNfQ0xBU1MKK0dTVF9JU19BVVRPX0FVRElPX1NSQ19DTEFTUworR1NUX1RZUEVfQVVUT19BVURJT19TUkMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfYXV0b19hdWRpb19zcmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWF1dG92aWRlb3Npbms8L0ZJTEU+Cis8VElUTEU+YXV0b3ZpZGVvc2luazwvVElUTEU+CitHc3RBdXRvVmlkZW9TaW5rCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEF1dG9WaWRlb1NpbmtDbGFzcworR1NUX0FVVE9fVklERU9fU0lOSworR1NUX0FVVE9fVklERU9fU0lOS19DQVNUCitHU1RfSVNfQVVUT19WSURFT19TSU5LCitHU1RfQVVUT19WSURFT19TSU5LX0NMQVNTCitHU1RfSVNfQVVUT19WSURFT19TSU5LX0NMQVNTCitHU1RfVFlQRV9BVVRPX1ZJREVPX1NJTksKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfYXV0b192aWRlb19zaW5rX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hdXRvdmlkZW9zcmM8L0ZJTEU+Cis8VElUTEU+YXV0b3ZpZGVvc3JjPC9USVRMRT4KK0dzdEF1dG9WaWRlb1NyYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBdXRvVmlkZW9TcmNDbGFzcworR1NUX0FVVE9fVklERU9fU1JDCitHU1RfQVVUT19WSURFT19TUkNfQ0FTVAorR1NUX0lTX0FVVE9fVklERU9fU1JDCitHU1RfQVVUT19WSURFT19TUkNfQ0xBU1MKK0dTVF9JU19BVVRPX1ZJREVPX1NSQ19DTEFTUworR1NUX1RZUEVfQVVUT19WSURFT19TUkMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfYXV0b192aWRlb19zcmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWF2aWRlbXV4PC9GSUxFPgorPFRJVExFPmF2aWRlbXV4PC9USVRMRT4KK0dzdEF2aURlbXV4Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEF2aURlbXV4Q2xhc3MKK0dTVF9BVklfREVNVVgKK0dTVF9BVklfREVNVVhfQ0FTVAorR1NUX0lTX0FWSV9ERU1VWAorR1NUX0FWSV9ERU1VWF9DTEFTUworR1NUX0lTX0FWSV9ERU1VWF9DTEFTUworR1NUX1RZUEVfQVZJX0RFTVVYCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2F2aV9kZW11eF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtYXZpbXV4PC9GSUxFPgorPFRJVExFPmF2aW11eDwvVElUTEU+CitHc3RBdmlNdXgKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0QXZpTXV4Q2xhc3MKK0dTVF9BVklfTVVYCitHU1RfQVZJX01VWF9DQVNUCitHU1RfSVNfQVZJX01VWAorR1NUX0FWSV9NVVhfQ0xBU1MKK0dTVF9JU19BVklfTVVYX0NMQVNTCitHU1RfVFlQRV9BVklfTVVYCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2F2aV9tdXhfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWF2aXN1YnRpdGxlPC9GSUxFPgorPFRJVExFPmF2aXN1YnRpdGxlPC9USVRMRT4KK0dzdEF2aVN1YnRpdGxlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEF2aVN1YnRpdGxlQ2xhc3MKK0dTVF9BVklfU1VCVElUTEUKK0dTVF9BVklfU1VCVElUTEVfQ0FTVAorR1NUX0lTX0FWSV9TVUJUSVRMRQorR1NUX0FWSV9TVUJUSVRMRV9DTEFTUworR1NUX0lTX0FWSV9TVUJUSVRMRV9DTEFTUworR1NUX1RZUEVfQVZJX1NVQlRJVExFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2F2aV9zdWJ0aXRsZV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtYnJlYWtteWRhdGE8L0ZJTEU+Cis8VElUTEU+YnJlYWtteWRhdGE8L1RJVExFPgorR3N0QnJlYWtNeURhdGEKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0QnJlYWtNeURhdGFDbGFzcworR1NUX0JSRUFLX01ZX0RBVEEKK0dTVF9CUkVBS19NWV9EQVRBX0NBU1QKK0dTVF9JU19CUkVBS19NWV9EQVRBCitHU1RfQlJFQUtfTVlfREFUQV9DTEFTUworR1NUX0lTX0JSRUFLX01ZX0RBVEFfQ0xBU1MKK0dTVF9UWVBFX0JSRUFLX01ZX0RBVEEKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfYnJlYWtfbXlfZGF0YV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtY2FjYXNpbms8L0ZJTEU+Cis8VElUTEU+Y2FjYXNpbms8L1RJVExFPgorR3N0Q0FDQVNpbmsKK0dzdENBQ0FTaW5rRGl0aGVyaW5nCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdENBQ0FTaW5rQ2xhc3MKK0dTVF9DQUNBX1NJTksKK0dTVF9DQUNBX1NJTktfQ0FTVAorR1NUX0lTX0NBQ0FfU0lOSworR1NUX0NBQ0FfU0lOS19DTEFTUworR1NUX0lTX0NBQ0FfU0lOS19DTEFTUworR1NUX1RZUEVfQ0FDQV9TSU5LCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2NhY2Ffc2lua19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtY2Fpcm9vdmVybGF5PC9GSUxFPgorPFRJVExFPmNhaXJvb3ZlcmxheTwvVElUTEU+CitHc3RDYWlyb092ZXJsYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0Q2Fpcm9PdmVybGF5Q2xhc3MKK0dTVF9DQUlST19PVkVSTEFZCitHU1RfQ0FJUk9fT1ZFUkxBWV9DQVNUCitHU1RfSVNfQ0FJUk9fT1ZFUkxBWQorR1NUX0NBSVJPX09WRVJMQVlfQ0xBU1MKK0dTVF9JU19DQUlST19PVkVSTEFZX0NMQVNTCitHU1RfVFlQRV9DQUlST19PVkVSTEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2NhaXJvX292ZXJsYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWNhcHNzZXR0ZXI8L0ZJTEU+Cis8VElUTEU+Y2Fwc3NldHRlcjwvVElUTEU+CitHc3RDYXBzU2V0dGVyCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdENhcHNTZXR0ZXJDbGFzcworR1NUX0NBUFNfU0VUVEVSCitHU1RfQ0FQU19TRVRURVJfQ0FTVAorR1NUX0lTX0NBUFNfU0VUVEVSCitHU1RfQ0FQU19TRVRURVJfQ0xBU1MKK0dTVF9JU19DQVBTX1NFVFRFUl9DTEFTUworR1NUX1RZUEVfQ0FQU19TRVRURVIKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfY2Fwc19zZXR0ZXJfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWNwdXJlcG9ydDwvRklMRT4KKzxUSVRMRT5jcHVyZXBvcnQ8L1RJVExFPgorR3N0Q3B1UmVwb3J0Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdENwdVJlcG9ydENsYXNzCitHU1RfQ1BVX1JFUE9SVAorR1NUX0NQVV9SRVBPUlRfQ0FTVAorR1NUX0lTX0NQVV9SRVBPUlQKK0dTVF9DUFVfUkVQT1JUX0NMQVNTCitHU1RfSVNfQ1BVX1JFUE9SVF9DTEFTUworR1NUX1RZUEVfQ1BVX1JFUE9SVAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9jcHVfcmVwb3J0X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1jdXR0ZXI8L0ZJTEU+Cis8VElUTEU+Y3V0dGVyPC9USVRMRT4KK0dzdEN1dHRlcgorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RDdXR0ZXJDbGFzcworR1NUX0NVVFRFUgorR1NUX0NVVFRFUl9DQVNUCitHU1RfSVNfQ1VUVEVSCitHU1RfQ1VUVEVSX0NMQVNTCitHU1RfSVNfQ1VUVEVSX0NMQVNTCitHU1RfVFlQRV9DVVRURVIKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfY3V0dGVyX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1kaXJlY3Rzb3VuZHNpbms8L0ZJTEU+Cis8VElUTEU+ZGlyZWN0c291bmRzaW5rPC9USVRMRT4KK0dzdERpcmVjdFNvdW5kU2luaworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3REaXJlY3RTb3VuZFNpbmtDbGFzcworR1NUX0RJUkVDVFNPVU5EX1NJTksKK0dTVF9ESVJFQ1RTT1VORF9TSU5LX0NMQVNTCitHU1RfSVNfRElSRUNUU09VTkRfU0lOSworR1NUX0lTX0RJUkVDVFNPVU5EX1NJTktfQ0xBU1MKK0dTVF9UWVBFX0RJUkVDVFNPVU5EX1NJTksKK2dzdF9kaXJlY3Rzb3VuZF9zaW5rX2dldF90eXBlCitHU1RfRFNPVU5EX0xPQ0sKK0dTVF9EU09VTkRfVU5MT0NLCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1kdG1mc3JjPC9GSUxFPgorPFRJVExFPmR0bWZzcmM8L1RJVExFPgorR3N0RFRNRlNyYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3REVE1GU3JjQ2xhc3MKK0dTVF9EVE1GX1NSQworR1NUX0RUTUZfU1JDX0NBU1QKK0dTVF9JU19EVE1GX1NSQworR1NUX0RUTUZfU1JDX0NMQVNTCitHU1RfSVNfRFRNRl9TUkNfQ0xBU1MKK0dTVF9UWVBFX0RUTUZfU1JDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2R0bWZfc3JjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1kdjEzOTRzcmM8L0ZJTEU+Cis8VElUTEU+ZHYxMzk0c3JjPC9USVRMRT4KK0dzdERWMTM5NFNyYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3REVjEzOTRTcmNDbGFzcworR1NUX0RfVjEzOTRfU1JDCitHU1RfRF9WMTM5NF9TUkNfQ0FTVAorR1NUX0lTX0RfVjEzOTRfU1JDCitHU1RfRF9WMTM5NF9TUkNfQ0xBU1MKK0dTVF9JU19EX1YxMzk0X1NSQ19DTEFTUworR1NUX1RZUEVfRF9WMTM5NF9TUkMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfZF92MTM5NF9zcmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWR2ZGVjPC9GSUxFPgorPFRJVExFPmR2ZGVjPC9USVRMRT4KK0dzdERWRGVjCitHc3REVkRlY1F1YWxpdHlFbnVtCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdERWRGVjQ2xhc3MKK0dTVF9EVl9ERUMKK0dTVF9EVl9ERUNfQ0FTVAorR1NUX0lTX0RWX0RFQworR1NUX0RWX0RFQ19DTEFTUworR1NUX0lTX0RWX0RFQ19DTEFTUworR1NUX1RZUEVfRFZfREVDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2R2X2RlY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtZHZkZW11eDwvRklMRT4KKzxUSVRMRT5kdmRlbXV4PC9USVRMRT4KK0dzdERWRGVtdXgKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0RFZEZW11eENsYXNzCitHU1RfRFZfREVNVVgKK0dTVF9EVl9ERU1VWF9DQVNUCitHU1RfSVNfRFZfREVNVVgKK0dTVF9EVl9ERU1VWF9DTEFTUworR1NUX0lTX0RWX0RFTVVYX0NMQVNTCitHU1RfVFlQRV9EVl9ERU1VWAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9kdl9kZW11eF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtZGNhcGFyc2U8L0ZJTEU+Cis8VElUTEU+ZGNhcGFyc2U8L1RJVExFPgorR3N0RGNhUGFyc2UKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0RGNhUGFyc2VDbGFzcworR1NUX0RDQV9QQVJTRQorR1NUX0RDQV9QQVJTRV9DQVNUCitHU1RfSVNfRENBX1BBUlNFCitHU1RfRENBX1BBUlNFX0NMQVNTCitHU1RfSVNfRENBX1BBUlNFX0NMQVNTCitHU1RfVFlQRV9EQ0FfUEFSU0UKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfZGNhX3BhcnNlX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1kZWludGVybGFjZTwvRklMRT4KKzxUSVRMRT5kZWludGVybGFjZTwvVElUTEU+CitHc3REZWludGVybGFjZQorR3N0RGVpbnRlcmxhY2VGaWVsZHMKK0dzdERlaW50ZXJsYWNlTG9ja2luZworR3N0RGVpbnRlcmxhY2VNZXRob2RzCitHc3REZWludGVybGFjZU1vZGVzCitHc3REZWludGVybGFjZUZpZWxkTGF5b3V0Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdERlaW50ZXJsYWNlQ2xhc3MKK0dTVF9ERUlOVEVSTEFDRQorR1NUX0RFSU5URVJMQUNFX0NBU1QKK0dTVF9JU19ERUlOVEVSTEFDRQorR1NUX0RFSU5URVJMQUNFX0NMQVNTCitHU1RfSVNfREVJTlRFUkxBQ0VfQ0xBU1MKK0dTVF9UWVBFX0RFSU5URVJMQUNFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2RlaW50ZXJsYWNlX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1kZWludGVybGVhdmU8L0ZJTEU+Cis8VElUTEU+ZGVpbnRlcmxlYXZlPC9USVRMRT4KK0dzdERlaW50ZXJsZWF2ZQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3REZWludGVybGVhdmVDbGFzcworR1NUX0RFSU5URVJMRUFWRQorR1NUX0RFSU5URVJMRUFWRV9DQVNUCitHU1RfSVNfREVJTlRFUkxFQVZFCitHU1RfREVJTlRFUkxFQVZFX0NMQVNTCitHU1RfSVNfREVJTlRFUkxFQVZFX0NMQVNTCitHU1RfVFlQRV9ERUlOVEVSTEVBVkUKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfZGVpbnRlcmxlYXZlX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1kaWNldHY8L0ZJTEU+Cis8VElUTEU+ZGljZXR2PC9USVRMRT4KK0dzdERpY2VUVgorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3REaWNlVFZDbGFzcworR1NUX0RJQ0VfVFYKK0dTVF9ESUNFX1RWX0NBU1QKK0dTVF9JU19ESUNFX1RWCitHU1RfRElDRV9UVl9DTEFTUworR1NUX0lTX0RJQ0VfVFZfQ0xBU1MKK0dTVF9UWVBFX0RJQ0VfVFYKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfZGljZV90dl9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtZHludWRwc2luazwvRklMRT4KKzxUSVRMRT5keW51ZHBzaW5rPC9USVRMRT4KK0dzdER5blVEUFNpbmsKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0RHluVURQU2lua0NsYXNzCitHU1RfRFlOX1VEUF9TSU5LCitHU1RfRFlOX1VEUF9TSU5LX0NBU1QKK0dTVF9JU19EWU5fVURQX1NJTksKK0dTVF9EWU5fVURQX1NJTktfQ0xBU1MKK0dTVF9JU19EWU5fVURQX1NJTktfQ0xBU1MKK0dTVF9UWVBFX0RZTl9VRFBfU0lOSworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9keW5fdWRwX3NpbmtfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWVkZ2V0djwvRklMRT4KKzxUSVRMRT5lZGdldHY8L1RJVExFPgorR3N0RWRnZVRWCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEVkZ2VUVkNsYXNzCitHU1RfRURHRV9UVgorR1NUX0VER0VfVFZfQ0FTVAorR1NUX0lTX0VER0VfVFYKK0dTVF9FREdFX1RWX0NMQVNTCitHU1RfSVNfRURHRV9UVl9DTEFTUworR1NUX1RZUEVfRURHRV9UVgorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9lZGdlX3R2X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1mbGFjZGVjPC9GSUxFPgorPFRJVExFPmZsYWNkZWM8L1RJVExFPgorR3N0RmxhY0RlYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RGbGFjRGVjQ2xhc3MKK0dTVF9GTEFDX0RFQworR1NUX0ZMQUNfREVDX0NBU1QKK0dTVF9JU19GTEFDX0RFQworR1NUX0ZMQUNfREVDX0NMQVNTCitHU1RfSVNfRkxBQ19ERUNfQ0xBU1MKK0dTVF9UWVBFX0ZMQUNfREVDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2ZsYWNfZGVjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1mbGFjZW5jPC9GSUxFPgorPFRJVExFPmZsYWNlbmM8L1RJVExFPgorR3N0RmxhY0VuYworR3N0RmxhY0VuY1F1YWxpdHkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0RmxhY0VuY0NsYXNzCitHU1RfRkxBQ19FTkMKK0dTVF9GTEFDX0VOQ19DQVNUCitHU1RfSVNfRkxBQ19FTkMKK0dTVF9GTEFDX0VOQ19DTEFTUworR1NUX0lTX0ZMQUNfRU5DX0NMQVNTCitHU1RfVFlQRV9GTEFDX0VOQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9mbGFjX2VuY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtZmxhY3BhcnNlPC9GSUxFPgorPFRJVExFPmZsYWNwYXJzZTwvVElUTEU+CitHc3RGbGFjUGFyc2UKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0RmxhY1BhcnNlQ2xhc3MKK0dTVF9GTEFDX1BBUlNFCitHU1RfRkxBQ19QQVJTRV9DQVNUCitHU1RfSVNfRkxBQ19QQVJTRQorR1NUX0ZMQUNfUEFSU0VfQ0xBU1MKK0dTVF9JU19GTEFDX1BBUlNFX0NMQVNTCitHU1RfVFlQRV9GTEFDX1BBUlNFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2ZsYWNfcGFyc2VfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWZsYWN0YWc8L0ZJTEU+Cis8VElUTEU+ZmxhY3RhZzwvVElUTEU+CitHc3RGbGFjVGFnCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEZsYWNUYWdDbGFzcworR1NUX0ZMQUNfVEFHCitHU1RfRkxBQ19UQUdfQ0FTVAorR1NUX0lTX0ZMQUNfVEFHCitHU1RfRkxBQ19UQUdfQ0xBU1MKK0dTVF9JU19GTEFDX1RBR19DTEFTUworR1NUX1RZUEVfRkxBQ19UQUcKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfZmxhY190YWdfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWZsdmRlbXV4PC9GSUxFPgorPFRJVExFPmZsdmRlbXV4PC9USVRMRT4KK0dzdEZsdkRlbXV4Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEZsdkRlbXV4Q2xhc3MKK0dTVF9GTFZfREVNVVgKK0dTVF9GTFZfREVNVVhfQ0FTVAorR1NUX0lTX0ZMVl9ERU1VWAorR1NUX0ZMVl9ERU1VWF9DTEFTUworR1NUX0lTX0ZMVl9ERU1VWF9DTEFTUworR1NUX1RZUEVfRkxWX0RFTVVYCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2Zsdl9kZW11eF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtZmx2bXV4PC9GSUxFPgorPFRJVExFPmZsdm11eDwvVElUTEU+CitHc3RGbHZNdXgKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0Rmx2TXV4Q2xhc3MKK0dTVF9GTFZfTVVYCitHU1RfRkxWX01VWF9DQVNUCitHU1RfSVNfRkxWX01VWAorR1NUX0ZMVl9NVVhfQ0xBU1MKK0dTVF9JU19GTFZfTVVYX0NMQVNTCitHU1RfVFlQRV9GTFZfTVVYCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2Zsdl9tdXhfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWZseGRlYzwvRklMRT4KKzxUSVRMRT5mbHhkZWM8L1RJVExFPgorR3N0Rmx4RGVjCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEZseERlY0NsYXNzCitHU1RfRkxYX0RFQworR1NUX0ZMWF9ERUNfQ0FTVAorR1NUX0lTX0ZMWF9ERUMKK0dTVF9GTFhfREVDX0NMQVNTCitHU1RfSVNfRkxYX0RFQ19DTEFTUworR1NUX1RZUEVfRkxYX0RFQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9mbHhfZGVjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1nYW1tYTwvRklMRT4KKzxUSVRMRT5nYW1tYTwvVElUTEU+CitHc3RHYW1tYQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RHYW1tYUNsYXNzCitHU1RfR0FNTUEKK0dTVF9HQU1NQV9DQVNUCitHU1RfSVNfR0FNTUEKK0dTVF9HQU1NQV9DTEFTUworR1NUX0lTX0dBTU1BX0NMQVNTCitHU1RfVFlQRV9HQU1NQQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9nYW1tYV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtZ2RrcGl4YnVmZGVjPC9GSUxFPgorPFRJVExFPmdka3BpeGJ1ZmRlYzwvVElUTEU+CitHc3RHZGtQaXhidWZEZWMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0R2RrUGl4YnVmRGVjQ2xhc3MKK0dTVF9HREtfUElYQlVGX0RFQworR1NUX0dES19QSVhCVUZfREVDX0NBU1QKK0dTVF9JU19HREtfUElYQlVGX0RFQworR1NUX0dES19QSVhCVUZfREVDX0NMQVNTCitHU1RfSVNfR0RLX1BJWEJVRl9ERUNfQ0xBU1MKK0dTVF9UWVBFX0dES19QSVhCVUZfREVDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2dka19waXhidWZfZGVjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1nZGtwaXhidWZvdmVybGF5PC9GSUxFPgorPFRJVExFPmdka3BpeGJ1Zm92ZXJsYXk8L1RJVExFPgorR3N0R2RrUGl4YnVmT3ZlcmxheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RHZGtQaXhidWZPdmVybGF5Q2xhc3MKK0dTVF9HREtfUElYQlVGX09WRVJMQVkKK0dTVF9HREtfUElYQlVGX09WRVJMQVlfQ0FTVAorR1NUX0lTX0dES19QSVhCVUZfT1ZFUkxBWQorR1NUX0dES19QSVhCVUZfT1ZFUkxBWV9DTEFTUworR1NUX0lTX0dES19QSVhCVUZfT1ZFUkxBWV9DTEFTUworR1NUX1RZUEVfR0RLX1BJWEJVRl9PVkVSTEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2dka19waXhidWZfb3ZlcmxheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtZ2RrcGl4YnVmc2luazwvRklMRT4KKzxUSVRMRT5nZGtwaXhidWZzaW5rPC9USVRMRT4KK0dzdEdka1BpeGJ1ZlNpbmsKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0R2RrUGl4YnVmU2lua0NsYXNzCitHU1RfR0RLX1BJWEJVRl9TSU5LCitHU1RfR0RLX1BJWEJVRl9TSU5LX0NBU1QKK0dTVF9JU19HREtfUElYQlVGX1NJTksKK0dTVF9HREtfUElYQlVGX1NJTktfQ0xBU1MKK0dTVF9JU19HREtfUElYQlVGX1NJTktfQ0xBU1MKK0dTVF9UWVBFX0dES19QSVhCVUZfU0lOSworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9nZGtfcGl4YnVmX3NpbmtfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWdvb208L0ZJTEU+Cis8VElUTEU+Z29vbTwvVElUTEU+CitHc3RHb29tCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEdvb21DbGFzcworR1NUX0dPT00KK0dTVF9HT09NX0NBU1QKK0dTVF9JU19HT09NCitHU1RfR09PTV9DTEFTUworR1NUX0lTX0dPT01fQ0xBU1MKK0dTVF9UWVBFX0dPT00KKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfZ29vbV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtZ29vbTJrMTwvRklMRT4KKzxUSVRMRT5nb29tMmsxPC9USVRMRT4KK0dzdEdvb20yazEKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0R29vbTJrMUNsYXNzCitHU1RfR09PTTJLMQorR1NUX0dPT00ySzFfQ0FTVAorR1NUX0lTX0dPT00ySzEKK0dTVF9HT09NMksxX0NMQVNTCitHU1RfSVNfR09PTTJLMV9DTEFTUworR1NUX1RZUEVfR09PTTJLMQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9nb29tMmsxX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ndGtnbHNpbms8L0ZJTEU+Cis8VElUTEU+Z3RrZ2xzaW5rPC9USVRMRT4KK0dzdEd0a0dMU2luaworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RHdGtHTFNpbmtDbGFzcworR1NUX0dUS19HTF9TSU5LCitHU1RfR1RLX0dMX1NJTktfQ0FTVAorR1NUX0lTX0dUS19HTF9TSU5LCitHU1RfR1RLX0dMX1NJTktfQ0xBU1MKK0dTVF9JU19HVEtfR0xfU0lOS19DTEFTUworR1NUX1RZUEVfR1RLX0dMX1NJTksKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfZ3RrX2dsX3NpbmtfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWd0a3Npbms8L0ZJTEU+Cis8VElUTEU+Z3Rrc2luazwvVElUTEU+CitHc3RHdGtTaW5rCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEd0a1NpbmtDbGFzcworR1NUX0dUS19TSU5LCitHU1RfR1RLX1NJTktfQ0FTVAorR1NUX0lTX0dUS19TSU5LCitHU1RfR1RLX1NJTktfQ0xBU1MKK0dTVF9JU19HVEtfU0lOS19DTEFTUworR1NUX1RZUEVfR1RLX1NJTksKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfZ3RrX3NpbmtfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWhkdjEzOTRzcmM8L0ZJTEU+Cis8VElUTEU+aGR2MTM5NHNyYzwvVElUTEU+CitHc3RIRFYxMzk0U3JjCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEhEVjEzOTRTcmNDbGFzcworR1NUX0hEX1YxMzk0X1NSQworR1NUX0hEX1YxMzk0X1NSQ19DQVNUCitHU1RfSVNfSERfVjEzOTRfU1JDCitHU1RfSERfVjEzOTRfU1JDX0NMQVNTCitHU1RfSVNfSERfVjEzOTRfU1JDX0NMQVNTCitHU1RfVFlQRV9IRF9WMTM5NF9TUkMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfaGRfdjEzOTRfc3JjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1pY3lkZW11eDwvRklMRT4KKzxUSVRMRT5pY3lkZW11eDwvVElUTEU+CitHc3RJQ1lEZW11eAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RJQ1lEZW11eENsYXNzCitHU1RfSUNZX0RFTVVYCitHU1RfSUNZX0RFTVVYX0NBU1QKK0dTVF9JU19JQ1lfREVNVVgKK0dTVF9JQ1lfREVNVVhfQ0xBU1MKK0dTVF9JU19JQ1lfREVNVVhfQ0xBU1MKK0dTVF9UWVBFX0lDWV9ERU1VWAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9pY3lfZGVtdXhfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWlkM2RlbXV4PC9GSUxFPgorPFRJVExFPmlkM2RlbXV4PC9USVRMRT4KK0dzdElEM0RlbXV4Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdElEM0RlbXV4Q2xhc3MKK0dTVF9JX0QzX0RFTVVYCitHU1RfSV9EM19ERU1VWF9DQVNUCitHU1RfSVNfSV9EM19ERU1VWAorR1NUX0lfRDNfREVNVVhfQ0xBU1MKK0dTVF9JU19JX0QzX0RFTVVYX0NMQVNTCitHU1RfVFlQRV9JX0QzX0RFTVVYCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2lfZDNfZGVtdXhfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWlzbWxtdXg8L0ZJTEU+Cis8VElUTEU+aXNtbG11eDwvVElUTEU+CitHc3RJU01MTXV4Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdElTTUxNdXhDbGFzcworR1NUX0lTTUxfTVVYCitHU1RfSVNNTF9NVVhfQ0FTVAorR1NUX0lTX0lTTUxfTVVYCitHU1RfSVNNTF9NVVhfQ0xBU1MKK0dTVF9JU19JU01MX01VWF9DTEFTUworR1NUX1RZUEVfSVNNTF9NVVgKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfaXNtbF9tdXhfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWlkM3YybXV4PC9GSUxFPgorPFRJVExFPmlkM3YybXV4PC9USVRMRT4KK0dzdElkM3YyTXV4Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdElkM3YyTXV4Q2xhc3MKK0dTVF9JRDNWMl9NVVgKK0dTVF9JRDNWMl9NVVhfQ0FTVAorR1NUX0lTX0lEM1YyX01VWAorR1NUX0lEM1YyX01VWF9DTEFTUworR1NUX0lTX0lEM1YyX01VWF9DTEFTUworR1NUX1RZUEVfSUQzVjJfTVVYCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2lkM3YyX211eF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtaWlyZXF1YWxpemVyPC9GSUxFPgorPFRJVExFPmlpcmVxdWFsaXplcjwvVElUTEU+CitHc3RJaXJFcXVhbGl6ZXIKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0SWlyRXF1YWxpemVyQ2xhc3MKK0dTVF9JSVJfRVFVQUxJWkVSCitHU1RfSUlSX0VRVUFMSVpFUl9DQVNUCitHU1RfSVNfSUlSX0VRVUFMSVpFUgorR1NUX0lJUl9FUVVBTElaRVJfQ0xBU1MKK0dTVF9JU19JSVJfRVFVQUxJWkVSX0NMQVNTCitHU1RfVFlQRV9JSVJfRVFVQUxJWkVSCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2lpcl9lcXVhbGl6ZXJfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWVxdWFsaXplci0xMGJhbmRzPC9GSUxFPgorPFRJVExFPmVxdWFsaXplci0xMGJhbmRzPC9USVRMRT4KK0dzdElpckVxdWFsaXplcjEwQmFuZHMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0SWlyRXF1YWxpemVyMTBCYW5kc0NsYXNzCitHU1RfSUlSX0VRVUFMSVpFUjEwX0JBTkRTCitHU1RfSUlSX0VRVUFMSVpFUjEwX0JBTkRTX0NBU1QKK0dTVF9JU19JSVJfRVFVQUxJWkVSMTBfQkFORFMKK0dTVF9JSVJfRVFVQUxJWkVSMTBfQkFORFNfQ0xBU1MKK0dTVF9JU19JSVJfRVFVQUxJWkVSMTBfQkFORFNfQ0xBU1MKK0dTVF9UWVBFX0lJUl9FUVVBTElaRVIxMF9CQU5EUworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9paXJfZXF1YWxpemVyMTBfYmFuZHNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWVxdWFsaXplci0zYmFuZHM8L0ZJTEU+Cis8VElUTEU+ZXF1YWxpemVyLTNiYW5kczwvVElUTEU+CitHc3RJaXJFcXVhbGl6ZXIzQmFuZHMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0SWlyRXF1YWxpemVyM0JhbmRzQ2xhc3MKK0dTVF9JSVJfRVFVQUxJWkVSM19CQU5EUworR1NUX0lJUl9FUVVBTElaRVIzX0JBTkRTX0NBU1QKK0dTVF9JU19JSVJfRVFVQUxJWkVSM19CQU5EUworR1NUX0lJUl9FUVVBTElaRVIzX0JBTkRTX0NMQVNTCitHU1RfSVNfSUlSX0VRVUFMSVpFUjNfQkFORFNfQ0xBU1MKK0dTVF9UWVBFX0lJUl9FUVVBTElaRVIzX0JBTkRTCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2lpcl9lcXVhbGl6ZXIzX2JhbmRzX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1lcXVhbGl6ZXItbmJhbmRzPC9GSUxFPgorPFRJVExFPmVxdWFsaXplci1uYmFuZHM8L1RJVExFPgorR3N0SWlyRXF1YWxpemVyTkJhbmRzCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdElpckVxdWFsaXplck5CYW5kc0NsYXNzCitHU1RfSUlSX0VRVUFMSVpFUl9OX0JBTkRTCitHU1RfSUlSX0VRVUFMSVpFUl9OX0JBTkRTX0NBU1QKK0dTVF9JU19JSVJfRVFVQUxJWkVSX05fQkFORFMKK0dTVF9JSVJfRVFVQUxJWkVSX05fQkFORFNfQ0xBU1MKK0dTVF9JU19JSVJfRVFVQUxJWkVSX05fQkFORFNfQ0xBU1MKK0dTVF9UWVBFX0lJUl9FUVVBTElaRVJfTl9CQU5EUworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9paXJfZXF1YWxpemVyX25fYmFuZHNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWltYWdlZnJlZXplPC9GSUxFPgorPFRJVExFPmltYWdlZnJlZXplPC9USVRMRT4KK0dzdEltYWdlRnJlZXplCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEltYWdlRnJlZXplQ2xhc3MKK0dTVF9JTUFHRV9GUkVFWkUKK0dTVF9JTUFHRV9GUkVFWkVfQ0FTVAorR1NUX0lTX0lNQUdFX0ZSRUVaRQorR1NUX0lNQUdFX0ZSRUVaRV9DTEFTUworR1NUX0lTX0lNQUdFX0ZSRUVaRV9DTEFTUworR1NUX1RZUEVfSU1BR0VfRlJFRVpFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2ltYWdlX2ZyZWV6ZV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtaW50ZXJsZWF2ZTwvRklMRT4KKzxUSVRMRT5pbnRlcmxlYXZlPC9USVRMRT4KK0dzdEludGVybGVhdmUKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0SW50ZXJsZWF2ZUNsYXNzCitHU1RfSU5URVJMRUFWRQorR1NUX0lOVEVSTEVBVkVfQ0FTVAorR1NUX0lTX0lOVEVSTEVBVkUKK0dTVF9JTlRFUkxFQVZFX0NMQVNTCitHU1RfSVNfSU5URVJMRUFWRV9DTEFTUworR1NUX1RZUEVfSU5URVJMRUFWRQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9pbnRlcmxlYXZlX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1qYWNrYXVkaW9zaW5rPC9GSUxFPgorPFRJVExFPmphY2thdWRpb3Npbms8L1RJVExFPgorR3N0SmFja0F1ZGlvU2luaworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RKYWNrQXVkaW9TaW5rQ2xhc3MKK0dTVF9KQUNLX0FVRElPX1NJTksKK0dTVF9KQUNLX0FVRElPX1NJTktfQ0FTVAorR1NUX0lTX0pBQ0tfQVVESU9fU0lOSworR1NUX0pBQ0tfQVVESU9fU0lOS19DTEFTUworR1NUX0lTX0pBQ0tfQVVESU9fU0lOS19DTEFTUworR1NUX1RZUEVfSkFDS19BVURJT19TSU5LCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2phY2tfYXVkaW9fc2lua19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtamFja2F1ZGlvc3JjPC9GSUxFPgorPFRJVExFPmphY2thdWRpb3NyYzwvVElUTEU+CitHc3RKYWNrQXVkaW9TcmMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0SmFja0F1ZGlvU3JjQ2xhc3MKK0dTVF9KQUNLX0FVRElPX1NSQworR1NUX0pBQ0tfQVVESU9fU1JDX0NBU1QKK0dTVF9JU19KQUNLX0FVRElPX1NSQworR1NUX0pBQ0tfQVVESU9fU1JDX0NMQVNTCitHU1RfSVNfSkFDS19BVURJT19TUkNfQ0xBU1MKK0dTVF9UWVBFX0pBQ0tfQVVESU9fU1JDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2phY2tfYXVkaW9fc3JjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1qcGVnZGVjPC9GSUxFPgorPFRJVExFPmpwZWdkZWM8L1RJVExFPgorR3N0SnBlZ0RlYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RKcGVnRGVjQ2xhc3MKK0dTVF9KUEVHX0RFQworR1NUX0pQRUdfREVDX0NBU1QKK0dTVF9JU19KUEVHX0RFQworR1NUX0pQRUdfREVDX0NMQVNTCitHU1RfSVNfSlBFR19ERUNfQ0xBU1MKK0dTVF9UWVBFX0pQRUdfREVDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2pwZWdfZGVjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1qcGVnZW5jPC9GSUxFPgorPFRJVExFPmpwZWdlbmM8L1RJVExFPgorR3N0SnBlZ0VuYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RKcGVnRW5jQ2xhc3MKK0dTVF9KUEVHX0VOQworR1NUX0pQRUdfRU5DX0NBU1QKK0dTVF9JU19KUEVHX0VOQworR1NUX0pQRUdfRU5DX0NMQVNTCitHU1RfSVNfSlBFR19FTkNfQ0xBU1MKK0dTVF9UWVBFX0pQRUdfRU5DCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2pwZWdfZW5jX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1sYW1lbXAzZW5jPC9GSUxFPgorPFRJVExFPmxhbWVtcDNlbmM8L1RJVExFPgorR3N0TGFtZU1QM0VuYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RMYW1lTVAzRW5jQ2xhc3MKK0dTVF9MQU1FTVAzRU5DCitHU1RfTEFNRU1QM0VOQ19DTEFTUworR1NUX0lTX0xBTUVNUDNFTkMKK0dTVF9JU19MQU1FTVAzRU5DX0NMQVNTCitHU1RfVFlQRV9MQU1FTVAzRU5DCitnc3RfbGFtZW1wM2VuY19nZXRfdHlwZQorZ3N0X2xhbWVtcDNlbmNfcmVnaXN0ZXIKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWxldmVsPC9GSUxFPgorPFRJVExFPmxldmVsPC9USVRMRT4KK0dzdExldmVsCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdExldmVsQ2xhc3MKK0dTVF9MRVZFTAorR1NUX0xFVkVMX0NBU1QKK0dTVF9JU19MRVZFTAorR1NUX0xFVkVMX0NMQVNTCitHU1RfSVNfTEVWRUxfQ0xBU1MKK0dTVF9UWVBFX0xFVkVMCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2xldmVsX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1tajJtdXg8L0ZJTEU+Cis8VElUTEU+bWoybXV4PC9USVRMRT4KK0dzdE1KMk11eAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RNSjJNdXhDbGFzcworR1NUX01fSjJfTVVYCitHU1RfTV9KMl9NVVhfQ0FTVAorR1NUX0lTX01fSjJfTVVYCitHU1RfTV9KMl9NVVhfQ0xBU1MKK0dTVF9JU19NX0oyX01VWF9DTEFTUworR1NUX1RZUEVfTV9KMl9NVVgKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfbV9qMl9tdXhfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LW1wNG11eDwvRklMRT4KKzxUSVRMRT5tcDRtdXg8L1RJVExFPgorR3N0TVA0TXV4Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdE1QNE11eENsYXNzCitHU1RfTV9QNF9NVVgKK0dTVF9NX1A0X01VWF9DQVNUCitHU1RfSVNfTV9QNF9NVVgKK0dTVF9NX1A0X01VWF9DTEFTUworR1NUX0lTX01fUDRfTVVYX0NMQVNTCitHU1RfVFlQRV9NX1A0X01VWAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9tX3A0X211eF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtbWF0cm9za2FkZW11eDwvRklMRT4KKzxUSVRMRT5tYXRyb3NrYWRlbXV4PC9USVRMRT4KK0dzdE1hdHJvc2thRGVtdXgKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0TWF0cm9za2FEZW11eENsYXNzCitHU1RfTUFUUk9TS0FfREVNVVgKK0dTVF9NQVRST1NLQV9ERU1VWF9DQVNUCitHU1RfSVNfTUFUUk9TS0FfREVNVVgKK0dTVF9NQVRST1NLQV9ERU1VWF9DTEFTUworR1NUX0lTX01BVFJPU0tBX0RFTVVYX0NMQVNTCitHU1RfVFlQRV9NQVRST1NLQV9ERU1VWAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9tYXRyb3NrYV9kZW11eF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtbWF0cm9za2FtdXg8L0ZJTEU+Cis8VElUTEU+bWF0cm9za2FtdXg8L1RJVExFPgorR3N0TWF0cm9za2FNdXgKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0TWF0cm9za2FNdXhDbGFzcworR1NUX01BVFJPU0tBX01VWAorR1NUX01BVFJPU0tBX01VWF9DQVNUCitHU1RfSVNfTUFUUk9TS0FfTVVYCitHU1RfTUFUUk9TS0FfTVVYX0NMQVNTCitHU1RfSVNfTUFUUk9TS0FfTVVYX0NMQVNTCitHU1RfVFlQRV9NQVRST1NLQV9NVVgKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfbWF0cm9za2FfbXV4X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1tb25vc2NvcGU8L0ZJTEU+Cis8VElUTEU+bW9ub3Njb3BlPC9USVRMRT4KK0dzdE1vbm9zY29wZQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RNb25vc2NvcGVDbGFzcworR1NUX01PTk9TQ09QRQorR1NUX0lTX01PTk9TQ09QRQorR1NUX1RZUEVfTU9OT1NDT1BFCitHU1RfTU9OT1NDT1BFX0NMQVNTCitHU1RfSVNfTU9OT1NDT1BFX0NMQVNTCitnc3RfbW9ub3Njb3BlX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1tYXRyb3NrYXBhcnNlPC9GSUxFPgorPFRJVExFPm1hdHJvc2thcGFyc2U8L1RJVExFPgorR3N0TWF0cm9za2FQYXJzZQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RNYXRyb3NrYVBhcnNlQ2xhc3MKK0dTVF9NQVRST1NLQV9QQVJTRQorR1NUX01BVFJPU0tBX1BBUlNFX0NBU1QKK0dTVF9JU19NQVRST1NLQV9QQVJTRQorR1NUX01BVFJPU0tBX1BBUlNFX0NMQVNTCitHU1RfSVNfTUFUUk9TS0FfUEFSU0VfQ0xBU1MKK0dTVF9UWVBFX01BVFJPU0tBX1BBUlNFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X21hdHJvc2thX3BhcnNlX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1tcGVnYXVkaW9wYXJzZTwvRklMRT4KKzxUSVRMRT5tcGVnYXVkaW9wYXJzZTwvVElUTEU+CitHc3RNcGVnQXVkaW9QYXJzZQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RNcGVnQXVkaW9QYXJzZUNsYXNzCitHU1RfTVBFR19BVURJT19QQVJTRQorR1NUX01QRUdfQVVESU9fUEFSU0VfQ0FTVAorR1NUX0lTX01QRUdfQVVESU9fUEFSU0UKK0dTVF9NUEVHX0FVRElPX1BBUlNFX0NMQVNTCitHU1RfSVNfTVBFR19BVURJT19QQVJTRV9DTEFTUworR1NUX1RZUEVfTVBFR19BVURJT19QQVJTRQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9tcGVnX2F1ZGlvX3BhcnNlX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1tcGcxMjNhdWRpb2RlYzwvRklMRT4KKzxUSVRMRT5tcGcxMjNhdWRpb2RlYzwvVElUTEU+CitHc3RNcGcxMjNBdWRpb0RlYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RNcGcxMjNBdWRpb0RlY0NsYXNzCitHU1RfTVBHMTIzX0FVRElPX0RFQworR1NUX01QRzEyM19BVURJT19ERUNfQ0xBU1MKK0dTVF9JU19NUEcxMjNfQVVESU9fREVDCitHU1RfSVNfTVBHMTIzX0FVRElPX0RFQ19DTEFTUworR1NUX1RZUEVfTVBHMTIzX0FVRElPX0RFQworZ3N0X21wZzEyM19hdWRpb19kZWNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LW11bGF3ZGVjPC9GSUxFPgorPFRJVExFPm11bGF3ZGVjPC9USVRMRT4KK0dzdE11TGF3RGVjCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdE11TGF3RGVjQ2xhc3MKK0dTVF9NVV9MQVdfREVDCitHU1RfTVVfTEFXX0RFQ19DQVNUCitHU1RfSVNfTVVfTEFXX0RFQworR1NUX01VX0xBV19ERUNfQ0xBU1MKK0dTVF9JU19NVV9MQVdfREVDX0NMQVNTCitHU1RfVFlQRV9NVV9MQVdfREVDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X211X2xhd19kZWNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LW11bGF3ZW5jPC9GSUxFPgorPFRJVExFPm11bGF3ZW5jPC9USVRMRT4KK0dzdE11TGF3RW5jCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdE11TGF3RW5jQ2xhc3MKK0dTVF9NVV9MQVdfRU5DCitHU1RfTVVfTEFXX0VOQ19DQVNUCitHU1RfSVNfTVVfTEFXX0VOQworR1NUX01VX0xBV19FTkNfQ0xBU1MKK0dTVF9JU19NVV9MQVdfRU5DX0NMQVNTCitHU1RfVFlQRV9NVV9MQVdfRU5DCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X211X2xhd19lbmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LW11bHRpZmlsZXNpbms8L0ZJTEU+Cis8VElUTEU+bXVsdGlmaWxlc2luazwvVElUTEU+CitHc3RNdWx0aUZpbGVTaW5rCitHc3RNdWx0aUZpbGVTaW5rTmV4dAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RNdWx0aUZpbGVTaW5rQ2xhc3MKK0dTVF9NVUxUSV9GSUxFX1NJTksKK0dTVF9NVUxUSV9GSUxFX1NJTktfQ0FTVAorR1NUX0lTX01VTFRJX0ZJTEVfU0lOSworR1NUX01VTFRJX0ZJTEVfU0lOS19DTEFTUworR1NUX0lTX01VTFRJX0ZJTEVfU0lOS19DTEFTUworR1NUX1RZUEVfTVVMVElfRklMRV9TSU5LCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X211bHRpX2ZpbGVfc2lua19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtbXVsdGlmaWxlc3JjPC9GSUxFPgorPFRJVExFPm11bHRpZmlsZXNyYzwvVElUTEU+CitHc3RNdWx0aUZpbGVTcmMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0TXVsdGlGaWxlU3JjQ2xhc3MKK0dTVF9NVUxUSV9GSUxFX1NSQworR1NUX01VTFRJX0ZJTEVfU1JDX0NBU1QKK0dTVF9JU19NVUxUSV9GSUxFX1NSQworR1NUX01VTFRJX0ZJTEVfU1JDX0NMQVNTCitHU1RfSVNfTVVMVElfRklMRV9TUkNfQ0xBU1MKK0dTVF9UWVBFX01VTFRJX0ZJTEVfU1JDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X211bHRpX2ZpbGVfc3JjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1tdWx0aXVkcHNpbms8L0ZJTEU+Cis8VElUTEU+bXVsdGl1ZHBzaW5rPC9USVRMRT4KK0dzdE11bHRpVURQU2luaworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RNdWx0aVVEUFNpbmtDbGFzcworR1NUX01VTFRJX1VEUF9TSU5LCitHU1RfTVVMVElfVURQX1NJTktfQ0FTVAorR1NUX0lTX01VTFRJX1VEUF9TSU5LCitHU1RfTVVMVElfVURQX1NJTktfQ0xBU1MKK0dTVF9JU19NVUxUSV9VRFBfU0lOS19DTEFTUworR1NUX1RZUEVfTVVMVElfVURQX1NJTksKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfbXVsdGlfdWRwX3NpbmtfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LW11bHRpcGFydGRlbXV4PC9GSUxFPgorPFRJVExFPm11bHRpcGFydGRlbXV4PC9USVRMRT4KK0dzdE11bHRpcGFydERlbXV4Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdE11bHRpcGFydERlbXV4Q2xhc3MKK0dTVF9NVUxUSVBBUlRfREVNVVgKK0dTVF9NVUxUSVBBUlRfREVNVVhfQ0FTVAorR1NUX0lTX01VTFRJUEFSVF9ERU1VWAorR1NUX01VTFRJUEFSVF9ERU1VWF9DTEFTUworR1NUX0lTX01VTFRJUEFSVF9ERU1VWF9DTEFTUworR1NUX1RZUEVfTVVMVElQQVJUX0RFTVVYCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X211bHRpcGFydF9kZW11eF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtbXVsdGlwYXJ0bXV4PC9GSUxFPgorPFRJVExFPm11bHRpcGFydG11eDwvVElUTEU+CitHc3RNdWx0aXBhcnRNdXgKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0TXVsdGlwYXJ0TXV4Q2xhc3MKK0dTVF9NVUxUSVBBUlRfTVVYCitHU1RfTVVMVElQQVJUX01VWF9DQVNUCitHU1RfSVNfTVVMVElQQVJUX01VWAorR1NUX01VTFRJUEFSVF9NVVhfQ0xBU1MKK0dTVF9JU19NVUxUSVBBUlRfTVVYX0NMQVNTCitHU1RfVFlQRV9NVUxUSVBBUlRfTVVYCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X211bHRpcGFydF9tdXhfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LW5hdnNlZWs8L0ZJTEU+Cis8VElUTEU+bmF2c2VlazwvVElUTEU+CitHc3ROYXZTZWVrCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdE5hdlNlZWtDbGFzcworR1NUX05BVl9TRUVLCitHU1RfTkFWX1NFRUtfQ0FTVAorR1NUX0lTX05BVl9TRUVLCitHU1RfTkFWX1NFRUtfQ0xBU1MKK0dTVF9JU19OQVZfU0VFS19DTEFTUworR1NUX1RZUEVfTkFWX1NFRUsKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfbmF2X3NlZWtfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LW5hdmlnYXRpb250ZXN0PC9GSUxFPgorPFRJVExFPm5hdmlnYXRpb250ZXN0PC9USVRMRT4KK0dzdE5hdmlnYXRpb250ZXN0Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdE5hdmlnYXRpb250ZXN0Q2xhc3MKK0dTVF9OQVZJR0FUSU9OVEVTVAorR1NUX05BVklHQVRJT05URVNUX0NBU1QKK0dTVF9JU19OQVZJR0FUSU9OVEVTVAorR1NUX05BVklHQVRJT05URVNUX0NMQVNTCitHU1RfSVNfTkFWSUdBVElPTlRFU1RfQ0xBU1MKK0dTVF9UWVBFX05BVklHQVRJT05URVNUCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X25hdmlnYXRpb250ZXN0X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1vcHR2PC9GSUxFPgorPFRJVExFPm9wdHY8L1RJVExFPgorR3N0T3BUVgorR3N0T3BUVk1vZGUKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0T3BUVkNsYXNzCitHU1RfT1BfVFYKK0dTVF9PUF9UVl9DQVNUCitHU1RfSVNfT1BfVFYKK0dTVF9PUF9UVl9DTEFTUworR1NUX0lTX09QX1RWX0NMQVNTCitHU1RfVFlQRV9PUF9UVgorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9vcF90dl9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtb3NzNHNpbms8L0ZJTEU+Cis8VElUTEU+b3NzNHNpbms8L1RJVExFPgorR3N0T3NzNFNpbmsKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0T3NzNFNpbmtDbGFzcworR1NUX09TUzRfU0lOSworR1NUX09TUzRfU0lOS19DQVNUCitHU1RfSVNfT1NTNF9TSU5LCitHU1RfT1NTNF9TSU5LX0NMQVNTCitHU1RfSVNfT1NTNF9TSU5LX0NMQVNTCitHU1RfVFlQRV9PU1M0X1NJTksKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfb3NzNF9zaW5rX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1vc3M0c3JjPC9GSUxFPgorPFRJVExFPm9zczRzcmM8L1RJVExFPgorR3N0T3NzNFNvdXJjZQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RPc3M0U291cmNlQ2xhc3MKK0dTVF9PU1M0X1NPVVJDRQorR1NUX09TUzRfU09VUkNFX0NBU1QKK0dTVF9JU19PU1M0X1NPVVJDRQorR1NUX09TUzRfU09VUkNFX0NMQVNTCitHU1RfSVNfT1NTNF9TT1VSQ0VfQ0xBU1MKK0dTVF9UWVBFX09TUzRfU09VUkNFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X29zczRfc291cmNlX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1vc3NzaW5rPC9GSUxFPgorPFRJVExFPm9zc3Npbms8L1RJVExFPgorR3N0T3NzU2luaworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RPc3NTaW5rQ2xhc3MKK0dTVF9PU1NfU0lOSworR1NUX09TU19TSU5LX0NBU1QKK0dTVF9JU19PU1NfU0lOSworR1NUX09TU19TSU5LX0NMQVNTCitHU1RfSVNfT1NTX1NJTktfQ0xBU1MKK0dTVF9UWVBFX09TU19TSU5LCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X29zc19zaW5rX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1vc3NzcmM8L0ZJTEU+Cis8VElUTEU+b3Nzc3JjPC9USVRMRT4KK0dzdE9zc1NyYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RPc3NTcmNDbGFzcworR1NUX09TU19TUkMKK0dTVF9PU1NfU1JDX0NBU1QKK0dTVF9JU19PU1NfU1JDCitHU1RfT1NTX1NSQ19DTEFTUworR1NUX0lTX09TU19TUkNfQ0xBU1MKK0dTVF9UWVBFX09TU19TUkMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfb3NzX3NyY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtb3N4YXVkaW9zaW5rPC9GSUxFPgorPFRJVExFPm9zeGF1ZGlvc2luazwvVElUTEU+CitHc3RPc3hBdWRpb1NpbmsKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0T3N4QXVkaW9TaW5rQ2xhc3MKK0dTVF9UWVBFX09TWF9BVURJT19TSU5LCitHU1RfT1NYX0FVRElPX1NJTksKK0dTVF9PU1hfQVVESU9fU0lOS19DTEFTUworZ3N0X29zeF9hdWRpb19zaW5rX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1vc3hhdWRpb3NyYzwvRklMRT4KKzxUSVRMRT5vc3hhdWRpb3NyYzwvVElUTEU+CitHc3RPc3hBdWRpb1NyYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RPc3hBdWRpb1NyY0NsYXNzCitHU1RfVFlQRV9PU1hfQVVESU9fU1JDCitHU1RfT1NYX0FVRElPX1NSQworR1NUX09TWF9BVURJT19TUkNfQ0xBU1MKK2dzdF9vc3hfYXVkaW9fc3JjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1vc3h2aWRlb3Npbms8L0ZJTEU+Cis8VElUTEU+b3N4dmlkZW9zaW5rPC9USVRMRT4KK0dzdE9TWFZpZGVvU2luaworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RPU1hWaWRlb1NpbmtDbGFzcworR3N0T1NYV2luZG93Cis8U1VCU0VDVElPTiBQcml2YXRlPgorR1NUX0lTX09TWF9WSURFT19TSU5LCitHU1RfSVNfT1NYX1ZJREVPX1NJTktfQ0xBU1MKK0dTVF9PU1hfVklERU9fU0lOSworR1NUX09TWF9WSURFT19TSU5LX0NMQVNTCitHU1RfVFlQRV9PU1hfVklERU9fU0lOSworR1NUX1RZUEVfT1NYVklERU9CVUZGRVIKK2dzdF9vc3hfdmlkZW9fc2lua19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcG5nZGVjPC9GSUxFPgorPFRJVExFPnBuZ2RlYzwvVElUTEU+CitHc3RQbmdEZWMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UG5nRGVjQ2xhc3MKK0dTVF9QTkdfREVDCitHU1RfUE5HX0RFQ19DQVNUCitHU1RfSVNfUE5HX0RFQworR1NUX1BOR19ERUNfQ0xBU1MKK0dTVF9JU19QTkdfREVDX0NMQVNTCitHU1RfVFlQRV9QTkdfREVDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3BuZ19kZWNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXBuZ2VuYzwvRklMRT4KKzxUSVRMRT5wbmdlbmM8L1RJVExFPgorR3N0UG5nRW5jCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFBuZ0VuY0NsYXNzCitHU1RfUE5HX0VOQworR1NUX1BOR19FTkNfQ0FTVAorR1NUX0lTX1BOR19FTkMKK0dTVF9QTkdfRU5DX0NMQVNTCitHU1RfSVNfUE5HX0VOQ19DTEFTUworR1NUX1RZUEVfUE5HX0VOQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9wbmdfZW5jX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1wcm9ncmVzc3JlcG9ydDwvRklMRT4KKzxUSVRMRT5wcm9ncmVzc3JlcG9ydDwvVElUTEU+CitHc3RQcm9ncmVzc1JlcG9ydAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RQcm9ncmVzc1JlcG9ydENsYXNzCitHU1RfUFJPR1JFU1NfUkVQT1JUCitHU1RfUFJPR1JFU1NfUkVQT1JUX0NBU1QKK0dTVF9JU19QUk9HUkVTU19SRVBPUlQKK0dTVF9QUk9HUkVTU19SRVBPUlRfQ0xBU1MKK0dTVF9JU19QUk9HUkVTU19SRVBPUlRfQ0xBU1MKK0dTVF9UWVBFX1BST0dSRVNTX1JFUE9SVAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9wcm9ncmVzc19yZXBvcnRfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXB1bHNlc2luazwvRklMRT4KKzxUSVRMRT5wdWxzZXNpbms8L1RJVExFPgorR3N0UHVsc2VTaW5rCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFB1bHNlU2lua0NsYXNzCitHU1RfUFVMU0VfU0lOSworR1NUX1BVTFNFX1NJTktfQ0FTVAorR1NUX0lTX1BVTFNFX1NJTksKK0dTVF9QVUxTRV9TSU5LX0NMQVNTCitHU1RfSVNfUFVMU0VfU0lOS19DTEFTUworR1NUX1RZUEVfUFVMU0VfU0lOSworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9wdWxzZV9zaW5rX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1wdWxzZXNyYzwvRklMRT4KKzxUSVRMRT5wdWxzZXNyYzwvVElUTEU+CitHc3RQdWxzZVNyYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RQdWxzZVNyY0NsYXNzCitHU1RfUFVMU0VfU1JDCitHU1RfUFVMU0VfU1JDX0NBU1QKK0dTVF9JU19QVUxTRV9TUkMKK0dTVF9QVUxTRV9TUkNfQ0xBU1MKK0dTVF9JU19QVUxTRV9TUkNfQ0xBU1MKK0dTVF9UWVBFX1BVTFNFX1NSQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9wdWxzZV9zcmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXB1c2hmaWxlc3JjPC9GSUxFPgorPFRJVExFPnB1c2hmaWxlc3JjPC9USVRMRT4KK0dzdFB1c2hGaWxlU3JjCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFB1c2hGaWxlU3JjQ2xhc3MKK0dTVF9QVVNIX0ZJTEVfU1JDCitHU1RfUFVTSF9GSUxFX1NSQ19DQVNUCitHU1RfSVNfUFVTSF9GSUxFX1NSQworR1NUX1BVU0hfRklMRV9TUkNfQ0xBU1MKK0dTVF9JU19QVVNIX0ZJTEVfU1JDX0NMQVNTCitHU1RfVFlQRV9QVVNIX0ZJTEVfU1JDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3B1c2hfZmlsZV9zcmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXF0ZGVtdXg8L0ZJTEU+Cis8VElUTEU+cXRkZW11eDwvVElUTEU+CitHc3RRVERlbXV4Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFFURGVtdXhDbGFzcworR1NUX1FUX0RFTVVYCitHU1RfUVRfREVNVVhfQ0FTVAorR1NUX0lTX1FUX0RFTVVYCitHU1RfUVRfREVNVVhfQ0xBU1MKK0dTVF9JU19RVF9ERU1VWF9DTEFTUworR1NUX1RZUEVfUVRfREVNVVgKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcXRfZGVtdXhfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXF0bW9vdnJlY292ZXI8L0ZJTEU+Cis8VElUTEU+cXRtb292cmVjb3ZlcjwvVElUTEU+CitHc3RRVE1vb3ZSZWNvdmVyCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFFUTW9vdlJlY292ZXJDbGFzcworR1NUX1FUX01PT1ZfUkVDT1ZFUgorR1NUX1FUX01PT1ZfUkVDT1ZFUl9DQVNUCitHU1RfSVNfUVRfTU9PVl9SRUNPVkVSCitHU1RfUVRfTU9PVl9SRUNPVkVSX0NMQVNTCitHU1RfSVNfUVRfTU9PVl9SRUNPVkVSX0NMQVNTCitHU1RfVFlQRV9RVF9NT09WX1JFQ09WRVIKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcXRfbW9vdl9yZWNvdmVyX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1xdG11eDwvRklMRT4KKzxUSVRMRT5xdG11eDwvVElUTEU+CitHc3RRVE11eAorR3N0UVRNdXhEdHNNZXRob2RzCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFFUTXV4Q2xhc3MKK0dTVF9RVF9NVVgKK0dTVF9RVF9NVVhfQ0FTVAorR1NUX0lTX1FUX01VWAorR1NUX1FUX01VWF9DTEFTUworR1NUX0lTX1FUX01VWF9DTEFTUworR1NUX1RZUEVfUVRfTVVYCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3F0X211eF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcXVhcmt0djwvRklMRT4KKzxUSVRMRT5xdWFya3R2PC9USVRMRT4KK0dzdFF1YXJrVFYKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UXVhcmtUVkNsYXNzCitHU1RfUVVBUktfVFYKK0dTVF9RVUFSS19UVl9DQVNUCitHU1RfSVNfUVVBUktfVFYKK0dTVF9RVUFSS19UVl9DTEFTUworR1NUX0lTX1FVQVJLX1RWX0NMQVNTCitHU1RfVFlQRV9RVUFSS19UVgorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9xdWFya190dl9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwYnZkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBidmRlcGF5PC9USVRMRT4KK0dzdFJUUEJWRGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UlRQQlZEZXBheUNsYXNzCitHU1RfUlRQQlZfREVQQVkKK0dTVF9SVFBCVl9ERVBBWV9DQVNUCitHU1RfSVNfUlRQQlZfREVQQVkKK0dTVF9SVFBCVl9ERVBBWV9DTEFTUworR1NUX0lTX1JUUEJWX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBCVl9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBidl9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwYnZwYXk8L0ZJTEU+Cis8VElUTEU+cnRwYnZwYXk8L1RJVExFPgorR3N0UlRQQlZQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UlRQQlZQYXlDbGFzcworR1NUX1JUUEJWX1BBWQorR1NUX1JUUEJWX1BBWV9DQVNUCitHU1RfSVNfUlRQQlZfUEFZCitHU1RfUlRQQlZfUEFZX0NMQVNTCitHU1RfSVNfUlRQQlZfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBCVl9QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwYnZfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBkdG1mbXV4PC9GSUxFPgorPFRJVExFPnJ0cGR0bWZtdXg8L1RJVExFPgorR3N0UlRQRFRNRk11eAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSVFBEVE1GTXV4Q2xhc3MKK0dTVF9SVFBEVE1GX01VWAorR1NUX1JUUERUTUZfTVVYX0NBU1QKK0dTVF9JU19SVFBEVE1GX01VWAorR1NUX1JUUERUTUZfTVVYX0NMQVNTCitHU1RfSVNfUlRQRFRNRl9NVVhfQ0xBU1MKK0dTVF9UWVBFX1JUUERUTUZfTVVYCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cGR0bWZfbXV4X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBkdG1mc3JjPC9GSUxFPgorPFRJVExFPnJ0cGR0bWZzcmM8L1RJVExFPgorR3N0UlRQRFRNRlNyYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSVFBEVE1GU3JjQ2xhc3MKK0dTVF9SVFBEVE1GX1NSQworR1NUX1JUUERUTUZfU1JDX0NBU1QKK0dTVF9JU19SVFBEVE1GX1NSQworR1NUX1JUUERUTUZfU1JDX0NMQVNTCitHU1RfSVNfUlRQRFRNRl9TUkNfQ0xBU1MKK0dTVF9UWVBFX1JUUERUTUZfU1JDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cGR0bWZfc3JjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBkdmRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cGR2ZGVwYXk8L1RJVExFPgorR3N0UlRQRFZEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSVFBEVkRlcGF5Q2xhc3MKK0dTVF9SVFBEVl9ERVBBWQorR1NUX1JUUERWX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBEVl9ERVBBWQorR1NUX1JUUERWX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQRFZfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUERWX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cGR2X2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBkdnBheTwvRklMRT4KKzxUSVRMRT5ydHBkdnBheTwvVElUTEU+CitHc3RSVFBEVlBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSVFBEVlBheUNsYXNzCitHU1RfUlRQRFZfUEFZCitHU1RfUlRQRFZfUEFZX0NBU1QKK0dTVF9JU19SVFBEVl9QQVkKK0dTVF9SVFBEVl9QQVlfQ0xBU1MKK0dTVF9JU19SVFBEVl9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUERWX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBkdl9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGRlYzwvRklMRT4KKzxUSVRMRT5ydHBkZWM8L1RJVExFPgorR3N0UlRQRGVjCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJUUERlY0NsYXNzCitHU1RfUlRQX0RFQworR1NUX1JUUF9ERUNfQ0FTVAorR1NUX0lTX1JUUF9ERUMKK0dTVF9SVFBfREVDX0NMQVNTCitHU1RfSVNfUlRQX0RFQ19DTEFTUworR1NUX1RZUEVfUlRQX0RFQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfZGVjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBnNzIzcGF5PC9GSUxFPgorPFRJVExFPnJ0cGc3MjNwYXk8L1RJVExFPgorR3N0UlRQRzcyM1BheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSVFBHNzIzUGF5Q2xhc3MKK0dTVF9SVFBfRzcyM19QQVkKK0dTVF9SVFBfRzcyM19QQVlfQ0FTVAorR1NUX0lTX1JUUF9HNzIzX1BBWQorR1NUX1JUUF9HNzIzX1BBWV9DTEFTUworR1NUX0lTX1JUUF9HNzIzX1BBWV9DTEFTUworR1NUX1RZUEVfUlRQX0c3MjNfUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9nNzIzX3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwZzcyOXBheTwvRklMRT4KKzxUSVRMRT5ydHBnNzI5cGF5PC9USVRMRT4KK0dzdFJUUEc3MjlQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UlRQRzcyOVBheUNsYXNzCitHU1RfUlRQX0c3MjlfUEFZCitHU1RfUlRQX0c3MjlfUEFZX0NBU1QKK0dTVF9JU19SVFBfRzcyOV9QQVkKK0dTVF9SVFBfRzcyOV9QQVlfQ0xBU1MKK0dTVF9JU19SVFBfRzcyOV9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9HNzI5X1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfZzcyOV9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGdzbWRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cGdzbWRlcGF5PC9USVRMRT4KK0dzdFJUUEdTTURlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJUUEdTTURlcGF5Q2xhc3MKK0dTVF9SVFBHU01fREVQQVkKK0dTVF9SVFBHU01fREVQQVlfQ0FTVAorR1NUX0lTX1JUUEdTTV9ERVBBWQorR1NUX1JUUEdTTV9ERVBBWV9DTEFTUworR1NUX0lTX1JUUEdTTV9ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQR1NNX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cGdzbV9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwZ3NtcGF5PC9GSUxFPgorPFRJVExFPnJ0cGdzbXBheTwvVElUTEU+CitHc3RSVFBHU01QYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UlRQR1NNUGF5Q2xhc3MKK0dTVF9SVFBHU01fUEFZCitHU1RfUlRQR1NNX1BBWV9DQVNUCitHU1RfSVNfUlRQR1NNX1BBWQorR1NUX1JUUEdTTV9QQVlfQ0xBU1MKK0dTVF9JU19SVFBHU01fUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBHU01fUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cGdzbV9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGlsYmNwYXk8L0ZJTEU+Cis8VElUTEU+cnRwaWxiY3BheTwvVElUTEU+CitHc3RSVFBJTEJDUGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJUUElMQkNQYXlDbGFzcworR1NUX1JUUElMQkNfUEFZCitHU1RfUlRQSUxCQ19QQVlfQ0FTVAorR1NUX0lTX1JUUElMQkNfUEFZCitHU1RfUlRQSUxCQ19QQVlfQ0xBU1MKK0dTVF9JU19SVFBJTEJDX1BBWV9DTEFTUworR1NUX1RZUEVfUlRQSUxCQ19QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwaWxiY19wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cG1wMnRwYXk8L0ZJTEU+Cis8VElUTEU+cnRwbXAydHBheTwvVElUTEU+CitHc3RSVFBNUDJUUGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJUUE1QMlRQYXlDbGFzcworR1NUX1JUUE1fUDJfVF9QQVkKK0dTVF9SVFBNX1AyX1RfUEFZX0NBU1QKK0dTVF9JU19SVFBNX1AyX1RfUEFZCitHU1RfUlRQTV9QMl9UX1BBWV9DTEFTUworR1NUX0lTX1JUUE1fUDJfVF9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUE1fUDJfVF9QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwbV9wMl90X3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwbXB2cGF5PC9GSUxFPgorPFRJVExFPnJ0cG1wdnBheTwvVElUTEU+CitHc3RSVFBNUFZQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UlRQTVBWUGF5Q2xhc3MKK0dTVF9SVFBNUFZfUEFZCitHU1RfUlRQTVBWX1BBWV9DQVNUCitHU1RfSVNfUlRQTVBWX1BBWQorR1NUX1JUUE1QVl9QQVlfQ0xBU1MKK0dTVF9JU19SVFBNUFZfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBNUFZfUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cG1wdl9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cG11eDwvRklMRT4KKzxUSVRMRT5ydHBtdXg8L1RJVExFPgorR3N0UlRQTXV4Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJUUE11eENsYXNzCitHU1RfUlRQX01VWAorR1NUX1JUUF9NVVhfQ0FTVAorR1NUX0lTX1JUUF9NVVgKK0dTVF9SVFBfTVVYX0NMQVNTCitHU1RfSVNfUlRQX01VWF9DTEFTUworR1NUX1RZUEVfUlRQX01VWAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfbXV4X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBvcHVzZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwb3B1c2RlcGF5PC9USVRMRT4KK0dzdFJUUE9wdXNEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSVFBPcHVzRGVwYXlDbGFzcworR1NUX1JUUF9PUFVTX0RFUEFZCitHU1RfUlRQX09QVVNfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9PUFVTX0RFUEFZCitHU1RfUlRQX09QVVNfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfT1BVU19ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX09QVVNfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX29wdXNfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHJ0eHF1ZXVlPC9GSUxFPgorPFRJVExFPnJ0cHJ0eHF1ZXVlPC9USVRMRT4KK0dzdFJUUFJ0eFF1ZXVlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJUUFJ0eFF1ZXVlQ2xhc3MKK0dTVF9SVFBfUlRYX1FVRVVFCitHU1RfUlRQX1JUWF9RVUVVRV9DQVNUCitHU1RfSVNfUlRQX1JUWF9RVUVVRQorR1NUX1JUUF9SVFhfUVVFVUVfQ0xBU1MKK0dTVF9JU19SVFBfUlRYX1FVRVVFX0NMQVNTCitHU1RfVFlQRV9SVFBfUlRYX1FVRVVFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9ydHhfcXVldWVfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHNpcmVuZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwc2lyZW5kZXBheTwvVElUTEU+CitHc3RSVFBTaXJlbkRlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJUUFNpcmVuRGVwYXlDbGFzcworR1NUX1JUUF9TSVJFTl9ERVBBWQorR1NUX1JUUF9TSVJFTl9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX1NJUkVOX0RFUEFZCitHU1RfUlRQX1NJUkVOX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX1NJUkVOX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfU0lSRU5fREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3NpcmVuX2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBzaXJlbnBheTwvRklMRT4KKzxUSVRMRT5ydHBzaXJlbnBheTwvVElUTEU+CitHc3RSVFBTaXJlblBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSVFBTaXJlblBheUNsYXNzCitHU1RfUlRQX1NJUkVOX1BBWQorR1NUX1JUUF9TSVJFTl9QQVlfQ0FTVAorR1NUX0lTX1JUUF9TSVJFTl9QQVkKK0dTVF9SVFBfU0lSRU5fUEFZX0NMQVNTCitHU1RfSVNfUlRQX1NJUkVOX1BBWV9DTEFTUworR1NUX1RZUEVfUlRQX1NJUkVOX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfc2lyZW5fcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBpbGJjZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwaWxiY2RlcGF5PC9USVRMRT4KK0dzdFJUUGlMQkNEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSVFBpTEJDRGVwYXlDbGFzcworR1NUX1JUX1BJX0xCQ19ERVBBWQorR1NUX1JUX1BJX0xCQ19ERVBBWV9DQVNUCitHU1RfSVNfUlRfUElfTEJDX0RFUEFZCitHU1RfUlRfUElfTEJDX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRfUElfTEJDX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVF9QSV9MQkNfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRfcGlfbGJjX2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHNwc3JjPC9GSUxFPgorPFRJVExFPnJ0c3BzcmM8L1RJVExFPgorR3N0UlRTUFNyYworR3N0UlRTUFNyY0J1ZmZlck1vZGUKK0dzdFJUU1BTcmNOdHBUaW1lU291cmNlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJUU1BTcmNDbGFzcworR1NUX1JUU1BfU1JDCitHU1RfUlRTUF9TUkNfQ0FTVAorR1NUX0lTX1JUU1BfU1JDCitHU1RfUlRTUF9TUkNfQ0xBU1MKK0dTVF9JU19SVFNQX1NSQ19DTEFTUworR1NUX1RZUEVfUlRTUF9TUkMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRzcF9zcmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJhZGlvYWN0djwvRklMRT4KKzxUSVRMRT5yYWRpb2FjdHY8L1RJVExFPgorR3N0UmFkaW9hY1RWCitHc3RSYWRpb2FjVFZDb2xvcgorR3N0UmFkaW9hY1RWTW9kZQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSYWRpb2FjVFZDbGFzcworR1NUX1JBRElPQUNfVFYKK0dTVF9SQURJT0FDX1RWX0NBU1QKK0dTVF9JU19SQURJT0FDX1RWCitHU1RfUkFESU9BQ19UVl9DTEFTUworR1NUX0lTX1JBRElPQUNfVFZfQ0xBU1MKK0dTVF9UWVBFX1JBRElPQUNfVFYKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcmFkaW9hY190dl9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcmV2dHY8L0ZJTEU+Cis8VElUTEU+cmV2dHY8L1RJVExFPgorR3N0UmV2VFYKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UmV2VFZDbGFzcworR1NUX1JFVl9UVgorR1NUX1JFVl9UVl9DQVNUCitHU1RfSVNfUkVWX1RWCitHU1RfUkVWX1RWX0NMQVNTCitHU1RfSVNfUkVWX1RWX0NMQVNTCitHU1RfVFlQRV9SRVZfVFYKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcmV2X3R2X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1yZ2FuYWx5c2lzPC9GSUxFPgorPFRJVExFPnJnYW5hbHlzaXM8L1RJVExFPgorR3N0UmdBbmFseXNpcworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSZ0FuYWx5c2lzQ2xhc3MKK0dTVF9SR19BTkFMWVNJUworR1NUX1JHX0FOQUxZU0lTX0NBU1QKK0dTVF9JU19SR19BTkFMWVNJUworR1NUX1JHX0FOQUxZU0lTX0NMQVNTCitHU1RfSVNfUkdfQU5BTFlTSVNfQ0xBU1MKK0dTVF9UWVBFX1JHX0FOQUxZU0lTCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3JnX2FuYWx5c2lzX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1yZ2xpbWl0ZXI8L0ZJTEU+Cis8VElUTEU+cmdsaW1pdGVyPC9USVRMRT4KK0dzdFJnTGltaXRlcgorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSZ0xpbWl0ZXJDbGFzcworR1NUX1JHX0xJTUlURVIKK0dTVF9SR19MSU1JVEVSX0NBU1QKK0dTVF9JU19SR19MSU1JVEVSCitHU1RfUkdfTElNSVRFUl9DTEFTUworR1NUX0lTX1JHX0xJTUlURVJfQ0xBU1MKK0dTVF9UWVBFX1JHX0xJTUlURVIKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcmdfbGltaXRlcl9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcmd2b2x1bWU8L0ZJTEU+Cis8VElUTEU+cmd2b2x1bWU8L1RJVExFPgorR3N0UmdWb2x1bWUKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UmdWb2x1bWVDbGFzcworR1NUX1JHX1ZPTFVNRQorR1NUX1JHX1ZPTFVNRV9DQVNUCitHU1RfSVNfUkdfVk9MVU1FCitHU1RfUkdfVk9MVU1FX0NMQVNTCitHU1RfSVNfUkdfVk9MVU1FX0NMQVNTCitHU1RfVFlQRV9SR19WT0xVTUUKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfcmdfdm9sdW1lX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1yaXBwbGV0djwvRklMRT4KKzxUSVRMRT5yaXBwbGV0djwvVElUTEU+CitHc3RSaXBwbGVUVgorR3N0UmlwcGxlVFZNb2RlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJpcHBsZVRWQ2xhc3MKK0dTVF9SSVBQTEVfVFYKK0dTVF9SSVBQTEVfVFZfQ0FTVAorR1NUX0lTX1JJUFBMRV9UVgorR1NUX1JJUFBMRV9UVl9DTEFTUworR1NUX0lTX1JJUFBMRV9UVl9DTEFTUworR1NUX1RZUEVfUklQUExFX1RWCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3JpcHBsZV90dl9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcm5kYnVmZmVyc2l6ZTwvRklMRT4KKzxUSVRMRT5ybmRidWZmZXJzaXplPC9USVRMRT4KK0dzdFJuZEJ1ZmZlclNpemUKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0Um5kQnVmZmVyU2l6ZUNsYXNzCitHU1RfUk5EX0JVRkZFUl9TSVpFCitHU1RfUk5EX0JVRkZFUl9TSVpFX0NBU1QKK0dTVF9JU19STkRfQlVGRkVSX1NJWkUKK0dTVF9STkRfQlVGRkVSX1NJWkVfQ0xBU1MKK0dTVF9JU19STkRfQlVGRkVSX1NJWkVfQ0xBU1MKK0dTVF9UWVBFX1JORF9CVUZGRVJfU0laRQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ybmRfYnVmZmVyX3NpemVfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGFjM2RlcGF5PC9GSUxFPgorPFRJVExFPnJ0cGFjM2RlcGF5PC9USVRMRT4KK0dzdFJ0cEFDM0RlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEFDM0RlcGF5Q2xhc3MKK0dTVF9SVFBfQV9DM19ERVBBWQorR1NUX1JUUF9BX0MzX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfQV9DM19ERVBBWQorR1NUX1JUUF9BX0MzX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX0FfQzNfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9BX0MzX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9hX2MzX2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBhYzNwYXk8L0ZJTEU+Cis8VElUTEU+cnRwYWMzcGF5PC9USVRMRT4KK0dzdFJ0cEFDM1BheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBBQzNQYXlDbGFzcworR1NUX1JUUF9BX0MzX1BBWQorR1NUX1JUUF9BX0MzX1BBWV9DQVNUCitHU1RfSVNfUlRQX0FfQzNfUEFZCitHU1RfUlRQX0FfQzNfUEFZX0NMQVNTCitHU1RfSVNfUlRQX0FfQzNfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfQV9DM19QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX2FfYzNfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBhbXJkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBhbXJkZXBheTwvVElUTEU+CitHc3RSdHBBTVJEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBBTVJEZXBheUNsYXNzCitHU1RfUlRQX0FNUl9ERVBBWQorR1NUX1JUUF9BTVJfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9BTVJfREVQQVkKK0dTVF9SVFBfQU1SX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX0FNUl9ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX0FNUl9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfYW1yX2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBhbXJwYXk8L0ZJTEU+Cis8VElUTEU+cnRwYW1ycGF5PC9USVRMRT4KK0dzdFJ0cEFNUlBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBBTVJQYXlDbGFzcworR1NUX1JUUF9BTVJfUEFZCitHU1RfUlRQX0FNUl9QQVlfQ0FTVAorR1NUX0lTX1JUUF9BTVJfUEFZCitHU1RfUlRQX0FNUl9QQVlfQ0xBU1MKK0dTVF9JU19SVFBfQU1SX1BBWV9DTEFTUworR1NUX1RZUEVfUlRQX0FNUl9QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX2Ftcl9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGJpbjwvRklMRT4KKzxUSVRMRT5ydHBiaW48L1RJVExFPgorR3N0UnRwQmluCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEJpbkNsYXNzCitHU1RfUlRQX0JJTgorR1NUX1JUUF9CSU5fQ0FTVAorR1NUX0lTX1JUUF9CSU4KK0dTVF9SVFBfQklOX0NMQVNTCitHU1RfSVNfUlRQX0JJTl9DTEFTUworR1NUX1RZUEVfUlRQX0JJTgorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfYmluX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBjZWx0ZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwY2VsdGRlcGF5PC9USVRMRT4KK0dzdFJ0cENFTFREZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBDRUxURGVwYXlDbGFzcworR1NUX1JUUF9DRUxUX0RFUEFZCitHU1RfUlRQX0NFTFRfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9DRUxUX0RFUEFZCitHU1RfUlRQX0NFTFRfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfQ0VMVF9ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX0NFTFRfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX2NlbHRfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGNlbHRwYXk8L0ZJTEU+Cis8VElUTEU+cnRwY2VsdHBheTwvVElUTEU+CitHc3RSdHBDRUxUUGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cENFTFRQYXlDbGFzcworR1NUX1JUUF9DRUxUX1BBWQorR1NUX1JUUF9DRUxUX1BBWV9DQVNUCitHU1RfSVNfUlRQX0NFTFRfUEFZCitHU1RfUlRQX0NFTFRfUEFZX0NMQVNTCitHU1RfSVNfUlRQX0NFTFRfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfQ0VMVF9QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX2NlbHRfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBkdG1mZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwZHRtZmRlcGF5PC9USVRMRT4KK0dzdFJ0cERUTUZEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBEVE1GRGVwYXlDbGFzcworR1NUX1JUUF9EVE1GX0RFUEFZCitHU1RfUlRQX0RUTUZfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9EVE1GX0RFUEFZCitHU1RfUlRQX0RUTUZfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfRFRNRl9ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX0RUTUZfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX2R0bWZfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGc3MjJkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBnNzIyZGVwYXk8L1RJVExFPgorR3N0UnRwRzcyMkRlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEc3MjJEZXBheUNsYXNzCitHU1RfUlRQX0c3MjJfREVQQVkKK0dTVF9SVFBfRzcyMl9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX0c3MjJfREVQQVkKK0dTVF9SVFBfRzcyMl9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9HNzIyX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfRzcyMl9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfZzcyMl9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwZzcyMnBheTwvRklMRT4KKzxUSVRMRT5ydHBnNzIycGF5PC9USVRMRT4KK0dzdFJ0cEc3MjJQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwRzcyMlBheUNsYXNzCitHU1RfUlRQX0c3MjJfUEFZCitHU1RfUlRQX0c3MjJfUEFZX0NBU1QKK0dTVF9JU19SVFBfRzcyMl9QQVkKK0dTVF9SVFBfRzcyMl9QQVlfQ0xBU1MKK0dTVF9JU19SVFBfRzcyMl9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9HNzIyX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfZzcyMl9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGc3MjNkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBnNzIzZGVwYXk8L1RJVExFPgorR3N0UnRwRzcyM0RlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEc3MjNEZXBheUNsYXNzCitHU1RfUlRQX0c3MjNfREVQQVkKK0dTVF9SVFBfRzcyM19ERVBBWV9DQVNUCitHU1RfSVNfUlRQX0c3MjNfREVQQVkKK0dTVF9SVFBfRzcyM19ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9HNzIzX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfRzcyM19ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfZzcyM19kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwZzcyNmRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cGc3MjZkZXBheTwvVElUTEU+CitHc3RSdHBHNzI2RGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwRzcyNkRlcGF5Q2xhc3MKK0dTVF9SVFBfRzcyNl9ERVBBWQorR1NUX1JUUF9HNzI2X0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfRzcyNl9ERVBBWQorR1NUX1JUUF9HNzI2X0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX0c3MjZfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9HNzI2X0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9nNzI2X2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBnNzI2cGF5PC9GSUxFPgorPFRJVExFPnJ0cGc3MjZwYXk8L1RJVExFPgorR3N0UnRwRzcyNlBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBHNzI2UGF5Q2xhc3MKK0dTVF9SVFBfRzcyNl9QQVkKK0dTVF9SVFBfRzcyNl9QQVlfQ0FTVAorR1NUX0lTX1JUUF9HNzI2X1BBWQorR1NUX1JUUF9HNzI2X1BBWV9DTEFTUworR1NUX0lTX1JUUF9HNzI2X1BBWV9DTEFTUworR1NUX1RZUEVfUlRQX0c3MjZfUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9nNzI2X3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwZzcyOWRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cGc3MjlkZXBheTwvVElUTEU+CitHc3RSdHBHNzI5RGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwRzcyOURlcGF5Q2xhc3MKK0dTVF9SVFBfRzcyOV9ERVBBWQorR1NUX1JUUF9HNzI5X0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfRzcyOV9ERVBBWQorR1NUX1JUUF9HNzI5X0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX0c3MjlfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9HNzI5X0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9nNzI5X2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBnc3RkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBnc3RkZXBheTwvVElUTEU+CitHc3RSdHBHU1REZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBHU1REZXBheUNsYXNzCitHU1RfUlRQX0dTVF9ERVBBWQorR1NUX1JUUF9HU1RfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9HU1RfREVQQVkKK0dTVF9SVFBfR1NUX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX0dTVF9ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX0dTVF9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfZ3N0X2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBnc3RwYXk8L0ZJTEU+Cis8VElUTEU+cnRwZ3N0cGF5PC9USVRMRT4KK0dzdFJ0cEdTVFBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBHU1RQYXlDbGFzcworR1NUX1JUUF9HU1RfUEFZCitHU1RfUlRQX0dTVF9QQVlfQ0FTVAorR1NUX0lTX1JUUF9HU1RfUEFZCitHU1RfUlRQX0dTVF9QQVlfQ0xBU1MKK0dTVF9JU19SVFBfR1NUX1BBWV9DTEFTUworR1NUX1RZUEVfUlRQX0dTVF9QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX2dzdF9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGgyNjFkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBoMjYxZGVwYXk8L1RJVExFPgorR3N0UnRwSDI2MURlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEgyNjFEZXBheUNsYXNzCitHU1RfUlRQX0gyNjFfREVQQVkKK0dTVF9SVFBfSDI2MV9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX0gyNjFfREVQQVkKK0dTVF9SVFBfSDI2MV9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9IMjYxX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfSDI2MV9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfaDI2MV9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwaDI2MXBheTwvRklMRT4KKzxUSVRMRT5ydHBoMjYxcGF5PC9USVRMRT4KK0dzdFJ0cEgyNjFQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwSDI2MVBheUNsYXNzCitHU1RfUlRQX0gyNjFfUEFZCitHU1RfUlRQX0gyNjFfUEFZX0NBU1QKK0dTVF9JU19SVFBfSDI2MV9QQVkKK0dTVF9SVFBfSDI2MV9QQVlfQ0xBU1MKK0dTVF9JU19SVFBfSDI2MV9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9IMjYxX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfaDI2MV9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGgyNjNkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBoMjYzZGVwYXk8L1RJVExFPgorR3N0UnRwSDI2M0RlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEgyNjNEZXBheUNsYXNzCitHU1RfUlRQX0gyNjNfREVQQVkKK0dTVF9SVFBfSDI2M19ERVBBWV9DQVNUCitHU1RfSVNfUlRQX0gyNjNfREVQQVkKK0dTVF9SVFBfSDI2M19ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9IMjYzX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfSDI2M19ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfaDI2M19kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwaDI2M3BkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBoMjYzcGRlcGF5PC9USVRMRT4KK0dzdFJ0cEgyNjNQRGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwSDI2M1BEZXBheUNsYXNzCitHU1RfUlRQX0gyNjNfUF9ERVBBWQorR1NUX1JUUF9IMjYzX1BfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9IMjYzX1BfREVQQVkKK0dTVF9SVFBfSDI2M19QX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX0gyNjNfUF9ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX0gyNjNfUF9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfaDI2M19wX2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBoMjYzcHBheTwvRklMRT4KKzxUSVRMRT5ydHBoMjYzcHBheTwvVElUTEU+CitHc3RSdHBIMjYzUFBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBIMjYzUFBheUNsYXNzCitHU1RfUlRQX0gyNjNfUF9QQVkKK0dTVF9SVFBfSDI2M19QX1BBWV9DQVNUCitHU1RfSVNfUlRQX0gyNjNfUF9QQVkKK0dTVF9SVFBfSDI2M19QX1BBWV9DTEFTUworR1NUX0lTX1JUUF9IMjYzX1BfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfSDI2M19QX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfaDI2M19wX3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwaDI2M3BheTwvRklMRT4KKzxUSVRMRT5ydHBoMjYzcGF5PC9USVRMRT4KK0dzdFJ0cEgyNjNQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwSDI2M1BheUNsYXNzCitHU1RfUlRQX0gyNjNfUEFZCitHU1RfUlRQX0gyNjNfUEFZX0NBU1QKK0dTVF9JU19SVFBfSDI2M19QQVkKK0dTVF9SVFBfSDI2M19QQVlfQ0xBU1MKK0dTVF9JU19SVFBfSDI2M19QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9IMjYzX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfaDI2M19wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGgyNjRkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBoMjY0ZGVwYXk8L1RJVExFPgorR3N0UnRwSDI2NERlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEgyNjREZXBheUNsYXNzCitHU1RfUlRQX0gyNjRfREVQQVkKK0dTVF9SVFBfSDI2NF9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX0gyNjRfREVQQVkKK0dTVF9SVFBfSDI2NF9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9IMjY0X0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfSDI2NF9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfaDI2NF9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwaDI2NHBheTwvRklMRT4KKzxUSVRMRT5ydHBoMjY0cGF5PC9USVRMRT4KK0dzdFJ0cEgyNjRQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwSDI2NFBheUNsYXNzCitHU1RfUlRQX0gyNjRfUEFZCitHU1RfUlRQX0gyNjRfUEFZX0NBU1QKK0dTVF9JU19SVFBfSDI2NF9QQVkKK0dTVF9SVFBfSDI2NF9QQVlfQ0xBU1MKK0dTVF9JU19SVFBfSDI2NF9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9IMjY0X1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfaDI2NF9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGgyNjVkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBoMjY1ZGVwYXk8L1RJVExFPgorR3N0UnRwSDI2NURlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEgyNjVEZXBheUNsYXNzCitHU1RfUlRQX0gyNjVfREVQQVkKK0dTVF9SVFBfSDI2NV9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX0gyNjVfREVQQVkKK0dTVF9SVFBfSDI2NV9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9IMjY1X0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfSDI2NV9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfaDI2NV9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwaDI2NXBheTwvRklMRT4KKzxUSVRMRT5ydHBoMjY1cGF5PC9USVRMRT4KK0dzdFJ0cEgyNjVQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwSDI2NVBheUNsYXNzCitHU1RfUlRQX0gyNjVfUEFZCitHU1RfUlRQX0gyNjVfUEFZX0NBU1QKK0dTVF9JU19SVFBfSDI2NV9QQVkKK0dTVF9SVFBfSDI2NV9QQVlfQ0xBU1MKK0dTVF9JU19SVFBfSDI2NV9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9IMjY1X1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfaDI2NV9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGoya2RlcGF5PC9GSUxFPgorPFRJVExFPnJ0cGoya2RlcGF5PC9USVRMRT4KK0dzdFJ0cEoyS0RlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEoyS0RlcGF5Q2xhc3MKK0dTVF9SVFBfSjJfS19ERVBBWQorR1NUX1JUUF9KMl9LX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfSjJfS19ERVBBWQorR1NUX1JUUF9KMl9LX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX0oyX0tfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9KMl9LX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9qMl9rX2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBqMmtwYXk8L0ZJTEU+Cis8VElUTEU+cnRwajJrcGF5PC9USVRMRT4KK0dzdFJ0cEoyS1BheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBKMktQYXlDbGFzcworR1NUX1JUUF9KMl9LX1BBWQorR1NUX1JUUF9KMl9LX1BBWV9DQVNUCitHU1RfSVNfUlRQX0oyX0tfUEFZCitHU1RfUlRQX0oyX0tfUEFZX0NMQVNTCitHU1RfSVNfUlRQX0oyX0tfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfSjJfS19QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX2oyX2tfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBqcGVnZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwanBlZ2RlcGF5PC9USVRMRT4KK0dzdFJ0cEpQRUdEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBKUEVHRGVwYXlDbGFzcworR1NUX1JUUF9KUEVHX0RFUEFZCitHU1RfUlRQX0pQRUdfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9KUEVHX0RFUEFZCitHU1RfUlRQX0pQRUdfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfSlBFR19ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX0pQRUdfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX2pwZWdfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGpwZWdwYXk8L0ZJTEU+Cis8VElUTEU+cnRwanBlZ3BheTwvVElUTEU+CitHc3RSdHBKUEVHUGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEpQRUdQYXlDbGFzcworR1NUX1JUUF9KUEVHX1BBWQorR1NUX1JUUF9KUEVHX1BBWV9DQVNUCitHU1RfSVNfUlRQX0pQRUdfUEFZCitHU1RfUlRQX0pQRUdfUEFZX0NMQVNTCitHU1RfSVNfUlRQX0pQRUdfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfSlBFR19QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX2pwZWdfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBqaXR0ZXJidWZmZXI8L0ZJTEU+Cis8VElUTEU+cnRwaml0dGVyYnVmZmVyPC9USVRMRT4KK0dzdFJ0cEppdHRlckJ1ZmZlcgorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBKaXR0ZXJCdWZmZXJDbGFzcworR1NUX1JUUF9KSVRURVJfQlVGRkVSCitHU1RfUlRQX0pJVFRFUl9CVUZGRVJfQ0FTVAorR1NUX0lTX1JUUF9KSVRURVJfQlVGRkVSCitHU1RfUlRQX0pJVFRFUl9CVUZGRVJfQ0xBU1MKK0dTVF9JU19SVFBfSklUVEVSX0JVRkZFUl9DTEFTUworR1NUX1RZUEVfUlRQX0pJVFRFUl9CVUZGRVIKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGtsdmRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cGtsdmRlcGF5PC9USVRMRT4KK0dzdFJ0cEtsdkRlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEtsdkRlcGF5Q2xhc3MKK0dTVF9SVFBfS0xWX0RFUEFZCitHU1RfUlRQX0tMVl9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX0tMVl9ERVBBWQorR1NUX1JUUF9LTFZfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfS0xWX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfS0xWX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9rbHZfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGtsdnBheTwvRklMRT4KKzxUSVRMRT5ydHBrbHZwYXk8L1RJVExFPgorR3N0UnRwS2x2UGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEtsdlBheUNsYXNzCitHU1RfUlRQX0tMVl9QQVkKK0dTVF9SVFBfS0xWX1BBWV9DQVNUCitHU1RfSVNfUlRQX0tMVl9QQVkKK0dTVF9SVFBfS0xWX1BBWV9DTEFTUworR1NUX0lTX1JUUF9LTFZfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfS0xWX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfa2x2X3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwTDhkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBMOGRlcGF5PC9USVRMRT4KK0dzdFJ0cEw4RGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwTDhEZXBheUNsYXNzCitHU1RfUlRQX0w4X0RFUEFZCitHU1RfUlRQX0w4X0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfTDhfREVQQVkKK0dTVF9SVFBfTDhfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfTDhfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9MOF9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfbDhfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cEw4cGF5PC9GSUxFPgorPFRJVExFPnJ0cEw4cGF5PC9USVRMRT4KK0dzdFJ0cEw4UGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEw4UGF5Q2xhc3MKK0dTVF9SVFBfTDhfUEFZCitHU1RfUlRQX0w4X1BBWV9DQVNUCitHU1RfSVNfUlRQX0w4X1BBWQorR1NUX1JUUF9MOF9QQVlfQ0xBU1MKK0dTVF9JU19SVFBfTDhfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfTDhfUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9sOF9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cEwxNmRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cEwxNmRlcGF5PC9USVRMRT4KK0dzdFJ0cEwxNkRlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEwxNkRlcGF5Q2xhc3MKK0dTVF9SVFBfTDE2X0RFUEFZCitHU1RfUlRQX0wxNl9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX0wxNl9ERVBBWQorR1NUX1JUUF9MMTZfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfTDE2X0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfTDE2X0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9sMTZfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cEwxNnBheTwvRklMRT4KKzxUSVRMRT5ydHBMMTZwYXk8L1RJVExFPgorR3N0UnRwTDE2UGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEwxNlBheUNsYXNzCitHU1RfUlRQX0wxNl9QQVkKK0dTVF9SVFBfTDE2X1BBWV9DQVNUCitHU1RfSVNfUlRQX0wxNl9QQVkKK0dTVF9SVFBfTDE2X1BBWV9DTEFTUworR1NUX0lTX1JUUF9MMTZfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfTDE2X1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfbDE2X3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwTDI0ZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwTDI0ZGVwYXk8L1RJVExFPgorR3N0UnRwTDI0RGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwTDI0RGVwYXlDbGFzcworR1NUX1JUUF9MMjRfREVQQVkKK0dTVF9SVFBfTDI0X0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfTDI0X0RFUEFZCitHU1RfUlRQX0wyNF9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9MMjRfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9MMjRfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX2wyNF9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwTDI0cGF5PC9GSUxFPgorPFRJVExFPnJ0cEwyNHBheTwvVElUTEU+CitHc3RSdHBMMjRQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwTDI0UGF5Q2xhc3MKK0dTVF9SVFBfTDI0X1BBWQorR1NUX1JUUF9MMjRfUEFZX0NBU1QKK0dTVF9JU19SVFBfTDI0X1BBWQorR1NUX1JUUF9MMjRfUEFZX0NMQVNTCitHU1RfSVNfUlRQX0wyNF9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9MMjRfUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9sMjRfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBtcDFzZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwbXAxc2RlcGF5PC9USVRMRT4KK0dzdFJ0cE1QMVNEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBNUDFTRGVwYXlDbGFzcworR1NUX1JUUF9NX1AxX1NfREVQQVkKK0dTVF9SVFBfTV9QMV9TX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfTV9QMV9TX0RFUEFZCitHU1RfUlRQX01fUDFfU19ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9NX1AxX1NfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9NX1AxX1NfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX21fcDFfc19kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwbXAydGRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cG1wMnRkZXBheTwvVElUTEU+CitHc3RSdHBNUDJURGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwTVAyVERlcGF5Q2xhc3MKK0dTVF9SVFBfTV9QMl9UX0RFUEFZCitHU1RfUlRQX01fUDJfVF9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX01fUDJfVF9ERVBBWQorR1NUX1JUUF9NX1AyX1RfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfTV9QMl9UX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfTV9QMl9UX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9tX3AyX3RfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cG1wNGFkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBtcDRhZGVwYXk8L1RJVExFPgorR3N0UnRwTVA0QURlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cE1QNEFEZXBheUNsYXNzCitHU1RfUlRQX01fUDRfQV9ERVBBWQorR1NUX1JUUF9NX1A0X0FfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9NX1A0X0FfREVQQVkKK0dTVF9SVFBfTV9QNF9BX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX01fUDRfQV9ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX01fUDRfQV9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfbV9wNF9hX2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBtcDRhcGF5PC9GSUxFPgorPFRJVExFPnJ0cG1wNGFwYXk8L1RJVExFPgorR3N0UnRwTVA0QVBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBNUDRBUGF5Q2xhc3MKK0dTVF9SVFBfTV9QNF9BX1BBWQorR1NUX1JUUF9NX1A0X0FfUEFZX0NBU1QKK0dTVF9JU19SVFBfTV9QNF9BX1BBWQorR1NUX1JUUF9NX1A0X0FfUEFZX0NMQVNTCitHU1RfSVNfUlRQX01fUDRfQV9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9NX1A0X0FfUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9tX3A0X2FfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBtcDRnZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwbXA0Z2RlcGF5PC9USVRMRT4KK0dzdFJ0cE1QNEdEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBNUDRHRGVwYXlDbGFzcworR1NUX1JUUF9NX1A0X0dfREVQQVkKK0dTVF9SVFBfTV9QNF9HX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfTV9QNF9HX0RFUEFZCitHU1RfUlRQX01fUDRfR19ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9NX1A0X0dfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9NX1A0X0dfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX21fcDRfZ19kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwbXA0Z3BheTwvRklMRT4KKzxUSVRMRT5ydHBtcDRncGF5PC9USVRMRT4KK0dzdFJ0cE1QNEdQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwTVA0R1BheUNsYXNzCitHU1RfUlRQX01fUDRfR19QQVkKK0dTVF9SVFBfTV9QNF9HX1BBWV9DQVNUCitHU1RfSVNfUlRQX01fUDRfR19QQVkKK0dTVF9SVFBfTV9QNF9HX1BBWV9DTEFTUworR1NUX0lTX1JUUF9NX1A0X0dfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfTV9QNF9HX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfbV9wNF9nX3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwbXA0dmRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cG1wNHZkZXBheTwvVElUTEU+CitHc3RSdHBNUDRWRGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwTVA0VkRlcGF5Q2xhc3MKK0dTVF9SVFBfTV9QNF9WX0RFUEFZCitHU1RfUlRQX01fUDRfVl9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX01fUDRfVl9ERVBBWQorR1NUX1JUUF9NX1A0X1ZfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfTV9QNF9WX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfTV9QNF9WX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9tX3A0X3ZfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cG1wNHZwYXk8L0ZJTEU+Cis8VElUTEU+cnRwbXA0dnBheTwvVElUTEU+CitHc3RSdHBNUDRWUGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cE1QNFZQYXlDbGFzcworR1NUX1JUUF9NX1A0X1ZfUEFZCitHU1RfUlRQX01fUDRfVl9QQVlfQ0FTVAorR1NUX0lTX1JUUF9NX1A0X1ZfUEFZCitHU1RfUlRQX01fUDRfVl9QQVlfQ0xBU1MKK0dTVF9JU19SVFBfTV9QNF9WX1BBWV9DTEFTUworR1NUX1RZUEVfUlRQX01fUDRfVl9QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX21fcDRfdl9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cG1wYWRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cG1wYWRlcGF5PC9USVRMRT4KK0dzdFJ0cE1QQURlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cE1QQURlcGF5Q2xhc3MKK0dTVF9SVFBfTVBBX0RFUEFZCitHU1RfUlRQX01QQV9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX01QQV9ERVBBWQorR1NUX1JUUF9NUEFfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfTVBBX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfTVBBX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9tcGFfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cG1wYXBheTwvRklMRT4KKzxUSVRMRT5ydHBtcGFwYXk8L1RJVExFPgorR3N0UnRwTVBBUGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cE1QQVBheUNsYXNzCitHU1RfUlRQX01QQV9QQVkKK0dTVF9SVFBfTVBBX1BBWV9DQVNUCitHU1RfSVNfUlRQX01QQV9QQVkKK0dTVF9SVFBfTVBBX1BBWV9DTEFTUworR1NUX0lTX1JUUF9NUEFfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfTVBBX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfbXBhX3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwbXBhcm9idXN0ZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwbXBhcm9idXN0ZGVwYXk8L1RJVExFPgorR3N0UnRwTVBBUm9idXN0RGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwTVBBUm9idXN0RGVwYXlDbGFzcworR1NUX1JUUF9NUEFfUk9CVVNUX0RFUEFZCitHU1RfUlRQX01QQV9ST0JVU1RfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9NUEFfUk9CVVNUX0RFUEFZCitHU1RfUlRQX01QQV9ST0JVU1RfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfTVBBX1JPQlVTVF9ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX01QQV9ST0JVU1RfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX21wYV9yb2J1c3RfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cG1wdmRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cG1wdmRlcGF5PC9USVRMRT4KK0dzdFJ0cE1QVkRlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cE1QVkRlcGF5Q2xhc3MKK0dTVF9SVFBfTVBWX0RFUEFZCitHU1RfUlRQX01QVl9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX01QVl9ERVBBWQorR1NUX1JUUF9NUFZfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfTVBWX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfTVBWX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9tcHZfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cG9wdXNwYXk8L0ZJTEU+Cis8VElUTEU+cnRwb3B1c3BheTwvVElUTEU+CitHc3RSdHBPUFVTUGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cE9QVVNQYXlDbGFzcworR1NUX1JUUF9PUFVTX1BBWQorR1NUX1JUUF9PUFVTX1BBWV9DQVNUCitHU1RfSVNfUlRQX09QVVNfUEFZCitHU1RfUlRQX09QVVNfUEFZX0NMQVNTCitHU1RfSVNfUlRQX09QVVNfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfT1BVU19QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX29wdXNfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBwY21hZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwcGNtYWRlcGF5PC9USVRMRT4KK0dzdFJ0cFBjbWFEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBQY21hRGVwYXlDbGFzcworR1NUX1JUUF9QQ01BX0RFUEFZCitHU1RfUlRQX1BDTUFfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9QQ01BX0RFUEFZCitHU1RfUlRQX1BDTUFfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfUENNQV9ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX1BDTUFfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3BjbWFfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHBjbWFwYXk8L0ZJTEU+Cis8VElUTEU+cnRwcGNtYXBheTwvVElUTEU+CitHc3RSdHBQY21hUGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cFBjbWFQYXlDbGFzcworR1NUX1JUUF9QQ01BX1BBWQorR1NUX1JUUF9QQ01BX1BBWV9DQVNUCitHU1RfSVNfUlRQX1BDTUFfUEFZCitHU1RfUlRQX1BDTUFfUEFZX0NMQVNTCitHU1RfSVNfUlRQX1BDTUFfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfUENNQV9QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3BjbWFfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBwY211ZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwcGNtdWRlcGF5PC9USVRMRT4KK0dzdFJ0cFBjbXVEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBQY211RGVwYXlDbGFzcworR1NUX1JUUF9QQ01VX0RFUEFZCitHU1RfUlRQX1BDTVVfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9QQ01VX0RFUEFZCitHU1RfUlRQX1BDTVVfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfUENNVV9ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX1BDTVVfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3BjbXVfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHBjbXVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwcGNtdXBheTwvVElUTEU+CitHc3RSdHBQY211UGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cFBjbXVQYXlDbGFzcworR1NUX1JUUF9QQ01VX1BBWQorR1NUX1JUUF9QQ01VX1BBWV9DQVNUCitHU1RfSVNfUlRQX1BDTVVfUEFZCitHU1RfUlRQX1BDTVVfUEFZX0NMQVNTCitHU1RfSVNfUlRQX1BDTVVfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfUENNVV9QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3BjbXVfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBwdGRlbXV4PC9GSUxFPgorPFRJVExFPnJ0cHB0ZGVtdXg8L1RJVExFPgorR3N0UnRwUHREZW11eAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBQdERlbXV4Q2xhc3MKK0dTVF9SVFBfUFRfREVNVVgKK0dTVF9SVFBfUFRfREVNVVhfQ0FTVAorR1NUX0lTX1JUUF9QVF9ERU1VWAorR1NUX1JUUF9QVF9ERU1VWF9DTEFTUworR1NUX0lTX1JUUF9QVF9ERU1VWF9DTEFTUworR1NUX1RZUEVfUlRQX1BUX0RFTVVYCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9wdF9kZW11eF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwcWNlbHBkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBxY2VscGRlcGF5PC9USVRMRT4KK0dzdFJ0cFFDRUxQRGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwUUNFTFBEZXBheUNsYXNzCitHU1RfUlRQX1FDRUxQX0RFUEFZCitHU1RfUlRQX1FDRUxQX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfUUNFTFBfREVQQVkKK0dTVF9SVFBfUUNFTFBfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfUUNFTFBfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9RQ0VMUF9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfcWNlbHBfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHFkbTJkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBxZG0yZGVwYXk8L1RJVExFPgorR3N0UnRwUURNMkRlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cFFETTJEZXBheUNsYXNzCitHU1RfUlRQX1FEX00yX0RFUEFZCitHU1RfUlRQX1FEX00yX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfUURfTTJfREVQQVkKK0dTVF9SVFBfUURfTTJfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfUURfTTJfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9RRF9NMl9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfcWRfbTJfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHJ0eHJlY2VpdmU8L0ZJTEU+Cis8VElUTEU+cnRwcnR4cmVjZWl2ZTwvVElUTEU+CitHc3RSdHBSdHhSZWNlaXZlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cFJ0eFJlY2VpdmVDbGFzcworR1NUX1JUUF9SVFhfUkVDRUlWRQorR1NUX1JUUF9SVFhfUkVDRUlWRV9DQVNUCitHU1RfSVNfUlRQX1JUWF9SRUNFSVZFCitHU1RfUlRQX1JUWF9SRUNFSVZFX0NMQVNTCitHU1RfSVNfUlRQX1JUWF9SRUNFSVZFX0NMQVNTCitHU1RfVFlQRV9SVFBfUlRYX1JFQ0VJVkUKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3J0eF9yZWNlaXZlX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBydHhzZW5kPC9GSUxFPgorPFRJVExFPnJ0cHJ0eHNlbmQ8L1RJVExFPgorR3N0UnRwUnR4U2VuZAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBSdHhTZW5kQ2xhc3MKK0dTVF9SVFBfUlRYX1NFTkQKK0dTVF9SVFBfUlRYX1NFTkRfQ0FTVAorR1NUX0lTX1JUUF9SVFhfU0VORAorR1NUX1JUUF9SVFhfU0VORF9DTEFTUworR1NUX0lTX1JUUF9SVFhfU0VORF9DTEFTUworR1NUX1RZUEVfUlRQX1JUWF9TRU5ECis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9ydHhfc2VuZF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwc2JjcGF5PC9GSUxFPgorPFRJVExFPnJ0cHNiY3BheTwvVElUTEU+CitHc3RSdHBTQkNQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwU0JDUGF5Q2xhc3MKK0dTVF9SVFBfU0JDX1BBWQorR1NUX1JUUF9TQkNfUEFZX0NBU1QKK0dTVF9JU19SVFBfU0JDX1BBWQorR1NUX1JUUF9TQkNfUEFZX0NMQVNTCitHU1RfSVNfUlRQX1NCQ19QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9TQkNfUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9zYmNfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBzcGVleGRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cHNwZWV4ZGVwYXk8L1RJVExFPgorR3N0UnRwU1BFRVhEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBTUEVFWERlcGF5Q2xhc3MKK0dTVF9SVFBfU1BFRVhfREVQQVkKK0dTVF9SVFBfU1BFRVhfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9TUEVFWF9ERVBBWQorR1NUX1JUUF9TUEVFWF9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9TUEVFWF9ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX1NQRUVYX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9zcGVleF9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwc3BlZXhwYXk8L0ZJTEU+Cis8VElUTEU+cnRwc3BlZXhwYXk8L1RJVExFPgorR3N0UnRwU1BFRVhQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwU1BFRVhQYXlDbGFzcworR1NUX1JUUF9TUEVFWF9QQVkKK0dTVF9SVFBfU1BFRVhfUEFZX0NBU1QKK0dTVF9JU19SVFBfU1BFRVhfUEFZCitHU1RfUlRQX1NQRUVYX1BBWV9DTEFTUworR1NUX0lTX1JUUF9TUEVFWF9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9TUEVFWF9QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3NwZWV4X3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwc3YzdmRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cHN2M3ZkZXBheTwvVElUTEU+CitHc3RSdHBTVjNWRGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwU1YzVkRlcGF5Q2xhc3MKK0dTVF9SVFBfU19WM19WX0RFUEFZCitHU1RfUlRQX1NfVjNfVl9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX1NfVjNfVl9ERVBBWQorR1NUX1JUUF9TX1YzX1ZfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfU19WM19WX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfU19WM19WX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9zX3YzX3ZfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHNiY2RlcGF5PC9GSUxFPgorPFRJVExFPnJ0cHNiY2RlcGF5PC9USVRMRT4KK0dzdFJ0cFNiY0RlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cFNiY0RlcGF5Q2xhc3MKK0dTVF9SVFBfU0JDX0RFUEFZCitHU1RfUlRQX1NCQ19ERVBBWV9DQVNUCitHU1RfSVNfUlRQX1NCQ19ERVBBWQorR1NUX1JUUF9TQkNfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfU0JDX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfU0JDX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9zYmNfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHNlc3Npb248L0ZJTEU+Cis8VElUTEU+cnRwc2Vzc2lvbjwvVElUTEU+CitHc3RSdHBTZXNzaW9uCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cFNlc3Npb25DbGFzcworR1NUX1JUUF9TRVNTSU9OCitHU1RfUlRQX1NFU1NJT05fQ0FTVAorR1NUX0lTX1JUUF9TRVNTSU9OCitHU1RfUlRQX1NFU1NJT05fQ0xBU1MKK0dTVF9JU19SVFBfU0VTU0lPTl9DTEFTUworR1NUX1RZUEVfUlRQX1NFU1NJT04KKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3Nlc3Npb25fZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHNzcmNkZW11eDwvRklMRT4KKzxUSVRMRT5ydHBzc3JjZGVtdXg8L1RJVExFPgorR3N0UnRwU3NyY0RlbXV4Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cFNzcmNEZW11eENsYXNzCitHU1RfUlRQX1NTUkNfREVNVVgKK0dTVF9SVFBfU1NSQ19ERU1VWF9DQVNUCitHU1RfSVNfUlRQX1NTUkNfREVNVVgKK0dTVF9SVFBfU1NSQ19ERU1VWF9DTEFTUworR1NUX0lTX1JUUF9TU1JDX0RFTVVYX0NMQVNTCitHU1RfVFlQRV9SVFBfU1NSQ19ERU1VWAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfc3NyY19kZW11eF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwc3RyZWFtZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwc3RyZWFtZGVwYXk8L1RJVExFPgorR3N0UnRwU3RyZWFtRGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwU3RyZWFtRGVwYXlDbGFzcworR1NUX1JUUF9TVFJFQU1fREVQQVkKK0dTVF9SVFBfU1RSRUFNX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfU1RSRUFNX0RFUEFZCitHU1RfUlRQX1NUUkVBTV9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9TVFJFQU1fREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9TVFJFQU1fREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3N0cmVhbV9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwc3RyZWFtcGF5PC9GSUxFPgorPFRJVExFPnJ0cHN0cmVhbXBheTwvVElUTEU+CitHc3RSdHBTdHJlYW1QYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwU3RyZWFtUGF5Q2xhc3MKK0dTVF9SVFBfU1RSRUFNX1BBWQorR1NUX1JUUF9TVFJFQU1fUEFZX0NBU1QKK0dTVF9JU19SVFBfU1RSRUFNX1BBWQorR1NUX1JUUF9TVFJFQU1fUEFZX0NMQVNTCitHU1RfSVNfUlRQX1NUUkVBTV9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9TVFJFQU1fUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9zdHJlYW1fcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHB0aGVvcmFkZXBheTwvRklMRT4KKzxUSVRMRT5ydHB0aGVvcmFkZXBheTwvVElUTEU+CitHc3RSdHBUaGVvcmFEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBUaGVvcmFEZXBheUNsYXNzCitHU1RfUlRQX1RIRU9SQV9ERVBBWQorR1NUX1JUUF9USEVPUkFfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9USEVPUkFfREVQQVkKK0dTVF9SVFBfVEhFT1JBX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX1RIRU9SQV9ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX1RIRU9SQV9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfdGhlb3JhX2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHB0aGVvcmFwYXk8L0ZJTEU+Cis8VElUTEU+cnRwdGhlb3JhcGF5PC9USVRMRT4KK0dzdFJ0cFRoZW9yYVBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBUaGVvcmFQYXlDbGFzcworR1NUX1JUUF9USEVPUkFfUEFZCitHU1RfUlRQX1RIRU9SQV9QQVlfQ0FTVAorR1NUX0lTX1JUUF9USEVPUkFfUEFZCitHU1RfUlRQX1RIRU9SQV9QQVlfQ0xBU1MKK0dTVF9JU19SVFBfVEhFT1JBX1BBWV9DTEFTUworR1NUX1RZUEVfUlRQX1RIRU9SQV9QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3RoZW9yYV9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHZwOGRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cHZwOGRlcGF5PC9USVRMRT4KK0dzdFJ0cFZQOERlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cFZQOERlcGF5Q2xhc3MKK0dTVF9SVFBfVl9QOF9ERVBBWQorR1NUX1JUUF9WX1A4X0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfVl9QOF9ERVBBWQorR1NUX1JUUF9WX1A4X0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX1ZfUDhfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9WX1A4X0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF92X3A4X2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHB2cDhwYXk8L0ZJTEU+Cis8VElUTEU+cnRwdnA4cGF5PC9USVRMRT4KK0dzdFJ0cFZQOFBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBWUDhQYXlDbGFzcworR1NUX1JUUF9WX1A4X1BBWQorR1NUX1JUUF9WX1A4X1BBWV9DQVNUCitHU1RfSVNfUlRQX1ZfUDhfUEFZCitHU1RfUlRQX1ZfUDhfUEFZX0NMQVNTCitHU1RfSVNfUlRQX1ZfUDhfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfVl9QOF9QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3ZfcDhfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHB2cDlkZXBheTwvRklMRT4KKzxUSVRMRT5ydHB2cDlkZXBheTwvVElUTEU+CitHc3RSdHBWUDlEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBWUDlEZXBheUNsYXNzCitHU1RfUlRQX1ZfUDlfREVQQVkKK0dTVF9SVFBfVl9QOV9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX1ZfUDlfREVQQVkKK0dTVF9SVFBfVl9QOV9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9WX1A5X0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfVl9QOV9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfdl9wOV9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwdnA5cGF5PC9GSUxFPgorPFRJVExFPnJ0cHZwOXBheTwvVElUTEU+CitHc3RSdHBWUDlQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwVlA5UGF5Q2xhc3MKK0dTVF9SVFBfVl9QOV9QQVkKK0dTVF9SVFBfVl9QOV9QQVlfQ0FTVAorR1NUX0lTX1JUUF9WX1A5X1BBWQorR1NUX1JUUF9WX1A5X1BBWV9DTEFTUworR1NUX0lTX1JUUF9WX1A5X1BBWV9DTEFTUworR1NUX1RZUEVfUlRQX1ZfUDlfUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF92X3A5X3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwdnJhd2RlcGF5PC9GSUxFPgorPFRJVExFPnJ0cHZyYXdkZXBheTwvVElUTEU+CitHc3RSdHBWUmF3RGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwVlJhd0RlcGF5Q2xhc3MKK0dTVF9SVFBfVl9SQVdfREVQQVkKK0dTVF9SVFBfVl9SQVdfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9WX1JBV19ERVBBWQorR1NUX1JUUF9WX1JBV19ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9WX1JBV19ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX1ZfUkFXX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF92X3Jhd19kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwdnJhd3BheTwvRklMRT4KKzxUSVRMRT5ydHB2cmF3cGF5PC9USVRMRT4KK0dzdFJ0cFZSYXdQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwVlJhd1BheUNsYXNzCitHU1RfUlRQX1ZfUkFXX1BBWQorR1NUX1JUUF9WX1JBV19QQVlfQ0FTVAorR1NUX0lTX1JUUF9WX1JBV19QQVkKK0dTVF9SVFBfVl9SQVdfUEFZX0NMQVNTCitHU1RfSVNfUlRQX1ZfUkFXX1BBWV9DTEFTUworR1NUX1RZUEVfUlRQX1ZfUkFXX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfdl9yYXdfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHB2b3JiaXNkZXBheTwvRklMRT4KKzxUSVRMRT5ydHB2b3JiaXNkZXBheTwvVElUTEU+CitHc3RSdHBWb3JiaXNEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBWb3JiaXNEZXBheUNsYXNzCitHU1RfUlRQX1ZPUkJJU19ERVBBWQorR1NUX1JUUF9WT1JCSVNfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9WT1JCSVNfREVQQVkKK0dTVF9SVFBfVk9SQklTX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX1ZPUkJJU19ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX1ZPUkJJU19ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfdm9yYmlzX2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHB2b3JiaXNwYXk8L0ZJTEU+Cis8VElUTEU+cnRwdm9yYmlzcGF5PC9USVRMRT4KK0dzdFJ0cFZvcmJpc1BheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBWb3JiaXNQYXlDbGFzcworR1NUX1JUUF9WT1JCSVNfUEFZCitHU1RfUlRQX1ZPUkJJU19QQVlfQ0FTVAorR1NUX0lTX1JUUF9WT1JCSVNfUEFZCitHU1RfUlRQX1ZPUkJJU19QQVlfQ0xBU1MKK0dTVF9JU19SVFBfVk9SQklTX1BBWV9DTEFTUworR1NUX1RZUEVfUlRQX1ZPUkJJU19QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3ZvcmJpc19wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHhxdGRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cHhxdGRlcGF5PC9USVRMRT4KK0dzdFJ0cFhRVERlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cFhRVERlcGF5Q2xhc3MKK0dTVF9SVFBfWFFUX0RFUEFZCitHU1RfUlRQX1hRVF9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX1hRVF9ERVBBWQorR1NUX1JUUF9YUVRfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfWFFUX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfWFFUX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF94cXRfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXNtcHRlPC9GSUxFPgorPFRJVExFPnNtcHRlPC9USVRMRT4KK0dzdFNNUFRFCitHc3RTTVBURVRyYW5zaXRpb25UeXBlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFNNUFRFQ2xhc3MKK0dTVF9TTVBURQorR1NUX1NNUFRFX0NBU1QKK0dTVF9JU19TTVBURQorR1NUX1NNUFRFX0NMQVNTCitHU1RfSVNfU01QVEVfQ0xBU1MKK0dTVF9UWVBFX1NNUFRFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3NtcHRlX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1zbXB0ZWFscGhhPC9GSUxFPgorPFRJVExFPnNtcHRlYWxwaGE8L1RJVExFPgorR3N0U01QVEVBbHBoYQorR3N0U01QVEVBbHBoYVRyYW5zaXRpb25UeXBlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFNNUFRFQWxwaGFDbGFzcworR1NUX1NNUFRFX0FMUEhBCitHU1RfU01QVEVfQUxQSEFfQ0FTVAorR1NUX0lTX1NNUFRFX0FMUEhBCitHU1RfU01QVEVfQUxQSEFfQ0xBU1MKK0dTVF9JU19TTVBURV9BTFBIQV9DTEFTUworR1NUX1RZUEVfU01QVEVfQUxQSEEKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfc21wdGVfYWxwaGFfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXNiY3BhcnNlPC9GSUxFPgorPFRJVExFPnNiY3BhcnNlPC9USVRMRT4KK0dzdFNiY1BhcnNlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFNiY1BhcnNlQ2xhc3MKK0dTVF9TQkNfUEFSU0UKK0dTVF9TQkNfUEFSU0VfQ0FTVAorR1NUX0lTX1NCQ19QQVJTRQorR1NUX1NCQ19QQVJTRV9DTEFTUworR1NUX0lTX1NCQ19QQVJTRV9DTEFTUworR1NUX1RZUEVfU0JDX1BBUlNFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3NiY19wYXJzZV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtc2NhbGV0ZW1wbzwvRklMRT4KKzxUSVRMRT5zY2FsZXRlbXBvPC9USVRMRT4KK0dzdFNjYWxldGVtcG8KKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0U2NhbGV0ZW1wb0NsYXNzCitHU1RfU0NBTEVURU1QTworR1NUX1NDQUxFVEVNUE9fQ0FTVAorR1NUX0lTX1NDQUxFVEVNUE8KK0dTVF9TQ0FMRVRFTVBPX0NMQVNTCitHU1RfSVNfU0NBTEVURU1QT19DTEFTUworR1NUX1RZUEVfU0NBTEVURU1QTworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9zY2FsZXRlbXBvX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1zaGFnYWRlbGljdHY8L0ZJTEU+Cis8VElUTEU+c2hhZ2FkZWxpY3R2PC9USVRMRT4KK0dzdFNoYWdhZGVsaWNUVgorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RTaGFnYWRlbGljVFZDbGFzcworR1NUX1NIQUdBREVMSUNfVFYKK0dTVF9TSEFHQURFTElDX1RWX0NBU1QKK0dTVF9JU19TSEFHQURFTElDX1RWCitHU1RfU0hBR0FERUxJQ19UVl9DTEFTUworR1NUX0lTX1NIQUdBREVMSUNfVFZfQ0xBU1MKK0dTVF9UWVBFX1NIQUdBREVMSUNfVFYKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfc2hhZ2FkZWxpY190dl9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtc2hhcGV3aXBlPC9GSUxFPgorPFRJVExFPnNoYXBld2lwZTwvVElUTEU+CitHc3RTaGFwZVdpcGUKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0U2hhcGVXaXBlQ2xhc3MKK0dTVF9TSEFQRV9XSVBFCitHU1RfU0hBUEVfV0lQRV9DQVNUCitHU1RfSVNfU0hBUEVfV0lQRQorR1NUX1NIQVBFX1dJUEVfQ0xBU1MKK0dTVF9JU19TSEFQRV9XSVBFX0NMQVNTCitHU1RfVFlQRV9TSEFQRV9XSVBFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3NoYXBlX3dpcGVfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXNob3V0MnNlbmQ8L0ZJTEU+Cis8VElUTEU+c2hvdXQyc2VuZDwvVElUTEU+CitHc3RTaG91dDJzZW5kCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFNob3V0MnNlbmRDbGFzcworR1NUX1NIT1VUMlNFTkQKK0dTVF9TSE9VVDJTRU5EX0NBU1QKK0dTVF9JU19TSE9VVDJTRU5ECitHU1RfU0hPVVQyU0VORF9DTEFTUworR1NUX0lTX1NIT1VUMlNFTkRfQ0xBU1MKK0dTVF9UWVBFX1NIT1VUMlNFTkQKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfc2hvdXQyc2VuZF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtc291cGh0dHBzcmM8L0ZJTEU+Cis8VElUTEU+c291cGh0dHBzcmM8L1RJVExFPgorR3N0U291cEhUVFBTcmMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0U291cEhUVFBTcmNDbGFzcworR1NUX1NPVVBfSFRUUF9TUkMKK0dTVF9TT1VQX0hUVFBfU1JDX0NBU1QKK0dTVF9JU19TT1VQX0hUVFBfU1JDCitHU1RfU09VUF9IVFRQX1NSQ19DTEFTUworR1NUX0lTX1NPVVBfSFRUUF9TUkNfQ0xBU1MKK0dTVF9UWVBFX1NPVVBfSFRUUF9TUkMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfc291cF9odHRwX3NyY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtc291cGh0dHBjbGllbnRzaW5rPC9GSUxFPgorPFRJVExFPnNvdXBodHRwY2xpZW50c2luazwvVElUTEU+CitHc3RTb3VwSHR0cENsaWVudFNpbmsKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0U291cEh0dHBDbGllbnRTaW5rQ2xhc3MKK0dTVF9TT1VQX0hUVFBfQ0xJRU5UX1NJTksKK0dTVF9TT1VQX0hUVFBfQ0xJRU5UX1NJTktfQ0FTVAorR1NUX0lTX1NPVVBfSFRUUF9DTElFTlRfU0lOSworR1NUX1NPVVBfSFRUUF9DTElFTlRfU0lOS19DTEFTUworR1NUX0lTX1NPVVBfSFRUUF9DTElFTlRfU0lOS19DTEFTUworR1NUX1RZUEVfU09VUF9IVFRQX0NMSUVOVF9TSU5LCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtc3BlY3RydW08L0ZJTEU+Cis8VElUTEU+c3BlY3RydW08L1RJVExFPgorR3N0U3BlY3RydW0KKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0U3BlY3RydW1DbGFzcworR1NUX1NQRUNUUlVNCitHU1RfU1BFQ1RSVU1fQ0FTVAorR1NUX0lTX1NQRUNUUlVNCitHU1RfU1BFQ1RSVU1fQ0xBU1MKK0dTVF9JU19TUEVDVFJVTV9DTEFTUworR1NUX1RZUEVfU1BFQ1RSVU0KKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfc3BlY3RydW1fZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXNwZWV4ZGVjPC9GSUxFPgorPFRJVExFPnNwZWV4ZGVjPC9USVRMRT4KK0dzdFNwZWV4RGVjCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFNwZWV4RGVjQ2xhc3MKK0dTVF9TUEVFWF9ERUMKK0dTVF9TUEVFWF9ERUNfQ0FTVAorR1NUX0lTX1NQRUVYX0RFQworR1NUX1NQRUVYX0RFQ19DTEFTUworR1NUX0lTX1NQRUVYX0RFQ19DTEFTUworR1NUX1RZUEVfU1BFRVhfREVDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3NwZWV4X2RlY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtc3BlZXhlbmM8L0ZJTEU+Cis8VElUTEU+c3BlZXhlbmM8L1RJVExFPgorR3N0U3BlZXhFbmMKK0dzdFNwZWV4RW5jTW9kZQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RTcGVleEVuY0NsYXNzCitHU1RfU1BFRVhfRU5DCitHU1RfU1BFRVhfRU5DX0NBU1QKK0dTVF9JU19TUEVFWF9FTkMKK0dTVF9TUEVFWF9FTkNfQ0xBU1MKK0dTVF9JU19TUEVFWF9FTkNfQ0xBU1MKK0dTVF9UWVBFX1NQRUVYX0VOQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9zcGVleF9lbmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXNwbGl0ZmlsZXNyYzwvRklMRT4KKzxUSVRMRT5zcGxpdGZpbGVzcmM8L1RJVExFPgorR3N0U3BsaXRGaWxlU3JjCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFNwbGl0RmlsZVNyY0NsYXNzCitHU1RfU1BMSVRfRklMRV9TUkMKK0dTVF9TUExJVF9GSUxFX1NSQ19DQVNUCitHU1RfSVNfU1BMSVRfRklMRV9TUkMKK0dTVF9TUExJVF9GSUxFX1NSQ19DTEFTUworR1NUX0lTX1NQTElUX0ZJTEVfU1JDX0NMQVNTCitHU1RfVFlQRV9TUExJVF9GSUxFX1NSQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9zcGxpdF9maWxlX3NyY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtc3BsaXRtdXhzaW5rPC9GSUxFPgorPFRJVExFPnNwbGl0bXV4c2luazwvVElUTEU+CitHc3RTcGxpdE11eFNpbmsKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0U3BsaXRNdXhTaW5rQ2xhc3MKK0dTVF9TUExJVF9NVVhfU0lOSworR1NUX1NQTElUX01VWF9TSU5LX0NBU1QKK0dTVF9JU19TUExJVF9NVVhfU0lOSworR1NUX1NQTElUX01VWF9TSU5LX0NMQVNTCitHU1RfSVNfU1BMSVRfTVVYX1NJTktfQ0xBU1MKK0dTVF9UWVBFX1NQTElUX01VWF9TSU5LCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3NwbGl0X211eF9zaW5rX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1zcGxpdG11eHNyYzwvRklMRT4KKzxUSVRMRT5zcGxpdG11eHNyYzwvVElUTEU+CitHc3RTcGxpdE11eFNyYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RTcGxpdE11eFNyY0NsYXNzCitHU1RfU1BMSVRfTVVYX1NSQworR1NUX1NQTElUX01VWF9TUkNfQ0FTVAorR1NUX0lTX1NQTElUX01VWF9TUkMKK0dTVF9TUExJVF9NVVhfU1JDX0NMQVNTCitHU1RfSVNfU1BMSVRfTVVYX1NSQ19DTEFTUworR1NUX1RZUEVfU1BMSVRfTVVYX1NSQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9zcGxpdF9tdXhfc3JjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1zdHJlYWt0djwvRklMRT4KKzxUSVRMRT5zdHJlYWt0djwvVElUTEU+CitHc3RTdHJlYWtUVgorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RTdHJlYWtUVkNsYXNzCitHU1RfU1RSRUFLX1RWCitHU1RfU1RSRUFLX1RWX0NBU1QKK0dTVF9JU19TVFJFQUtfVFYKK0dTVF9TVFJFQUtfVFZfQ0xBU1MKK0dTVF9JU19TVFJFQUtfVFZfQ0xBU1MKK0dTVF9UWVBFX1NUUkVBS19UVgorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9zdHJlYWtfdHZfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXRhZ2luamVjdDwvRklMRT4KKzxUSVRMRT50YWdpbmplY3Q8L1RJVExFPgorR3N0VGFnSW5qZWN0Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFRhZ0luamVjdENsYXNzCitHU1RfVEFHX0lOSkVDVAorR1NUX1RBR19JTkpFQ1RfQ0FTVAorR1NUX0lTX1RBR19JTkpFQ1QKK0dTVF9UQUdfSU5KRUNUX0NMQVNTCitHU1RfSVNfVEFHX0lOSkVDVF9DTEFTUworR1NUX1RZUEVfVEFHX0lOSkVDVAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF90YWdfaW5qZWN0X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC10ZXN0c2luazwvRklMRT4KKzxUSVRMRT50ZXN0c2luazwvVElUTEU+CitHc3RUZXN0Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFRlc3RDbGFzcworR1NUX1RFU1QKK0dTVF9URVNUX0NBU1QKK0dTVF9JU19URVNUCitHU1RfVEVTVF9DTEFTUworR1NUX0lTX1RFU1RfQ0xBU1MKK0dTVF9UWVBFX1RFU1QKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfdGVzdF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtdHdvbGFtZW1wMmVuYzwvRklMRT4KKzxUSVRMRT50d29sYW1lPC9USVRMRT4KK0dzdFR3b0xhbWUKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0VHdvTGFtZUNsYXNzCitHU1RfVFdPX0xBTUUKK0dTVF9UV09fTEFNRV9DTEFTUworR1NUX0lTX1RXT19MQU1FCitHU1RfSVNfVFdPX0xBTUVfQ0xBU1MKK0dTVF9UWVBFX1RXT19MQU1FCitnc3RfdHdvX2xhbWVfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXVkcHNpbms8L0ZJTEU+Cis8VElUTEU+dWRwc2luazwvVElUTEU+CitHc3RVRFBTaW5rCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFVEUFNpbmtDbGFzcworR1NUX1VEUF9TSU5LCitHU1RfVURQX1NJTktfQ0FTVAorR1NUX0lTX1VEUF9TSU5LCitHU1RfVURQX1NJTktfQ0xBU1MKK0dTVF9JU19VRFBfU0lOS19DTEFTUworR1NUX1RZUEVfVURQX1NJTksKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfdWRwX3NpbmtfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXVkcHNyYzwvRklMRT4KKzxUSVRMRT51ZHBzcmM8L1RJVExFPgorR3N0VURQU3JjCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFVEUFNyY0NsYXNzCitHU1RfVURQX1NSQworR1NUX1VEUF9TUkNfQ0FTVAorR1NUX0lTX1VEUF9TUkMKK0dTVF9VRFBfU1JDX0NMQVNTCitHU1RfSVNfVURQX1NSQ19DTEFTUworR1NUX1RZUEVfVURQX1NSQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF91ZHBfc3JjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC12NGwycmFkaW88L0ZJTEU+Cis8VElUTEU+djRsMnJhZGlvPC9USVRMRT4KK0dzdFY0bDJSYWRpbworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RWNGwyUmFkaW9DbGFzcworR1NUX1Y0TDJfUkFESU8KK0dTVF9WNEwyX1JBRElPX0NBU1QKK0dTVF9JU19WNEwyX1JBRElPCitHU1RfVjRMMl9SQURJT19DTEFTUworR1NUX0lTX1Y0TDJfUkFESU9fQ0xBU1MKK0dTVF9UWVBFX1Y0TDJfUkFESU8KKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfdjRsMl9yYWRpb19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtdjRsMnNpbms8L0ZJTEU+Cis8VElUTEU+djRsMnNpbms8L1RJVExFPgorR3N0VjRsMlNpbmsKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0VjRsMlNpbmtDbGFzcworR1NUX1Y0TDJfU0lOSworR1NUX1Y0TDJfU0lOS19DQVNUCitHU1RfSVNfVjRMMl9TSU5LCitHU1RfVjRMMl9TSU5LX0NMQVNTCitHU1RfSVNfVjRMMl9TSU5LX0NMQVNTCitHU1RfVFlQRV9WNEwyX1NJTksKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfdjRsMl9zaW5rX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC12NGwyc3JjPC9GSUxFPgorPFRJVExFPnY0bDJzcmM8L1RJVExFPgorR3N0VjRsMlNyYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RWNGwyU3JjQ2xhc3MKK0dTVF9WNEwyX1NSQworR1NUX1Y0TDJfU1JDX0NBU1QKK0dTVF9JU19WNEwyX1NSQworR1NUX1Y0TDJfU1JDX0NMQVNTCitHU1RfSVNfVjRMMl9TUkNfQ0xBU1MKK0dTVF9UWVBFX1Y0TDJfU1JDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3Y0bDJfc3JjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC12cDhkZWM8L0ZJTEU+Cis8VElUTEU+dnA4ZGVjPC9USVRMRT4KK0dzdFZQOERlYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RWUDhEZWNDbGFzcworR1NUX1ZfUDhfREVDCitHU1RfVl9QOF9ERUNfQ0FTVAorR1NUX0lTX1ZfUDhfREVDCitHU1RfVl9QOF9ERUNfQ0xBU1MKK0dTVF9JU19WX1A4X0RFQ19DTEFTUworR1NUX1RZUEVfVl9QOF9ERUMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfdl9wOF9kZWNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXZwOGVuYzwvRklMRT4KKzxUSVRMRT52cDhlbmM8L1RJVExFPgorR3N0VlA4RW5jCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFZQOEVuY0NsYXNzCitHU1RfVl9QOF9FTkMKK0dTVF9WX1A4X0VOQ19DQVNUCitHU1RfSVNfVl9QOF9FTkMKK0dTVF9WX1A4X0VOQ19DTEFTUworR1NUX0lTX1ZfUDhfRU5DX0NMQVNTCitHU1RfVFlQRV9WX1A4X0VOQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF92X3A4X2VuY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtdnA5ZGVjPC9GSUxFPgorPFRJVExFPnZwOWRlYzwvVElUTEU+CitHc3RWUDlEZWMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0VlA5RGVjQ2xhc3MKK0dTVF9WX1A5X0RFQworR1NUX1ZfUDlfREVDX0NBU1QKK0dTVF9JU19WX1A5X0RFQworR1NUX1ZfUDlfREVDX0NMQVNTCitHU1RfSVNfVl9QOV9ERUNfQ0xBU1MKK0dTVF9UWVBFX1ZfUDlfREVDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3ZfcDlfZGVjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC12cDllbmM8L0ZJTEU+Cis8VElUTEU+dnA5ZW5jPC9USVRMRT4KK0dzdFZQOUVuYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RWUDlFbmNDbGFzcworR1NUX1ZfUDlfRU5DCitHU1RfVl9QOV9FTkNfQ0FTVAorR1NUX0lTX1ZfUDlfRU5DCitHU1RfVl9QOV9FTkNfQ0xBU1MKK0dTVF9JU19WX1A5X0VOQ19DTEFTUworR1NUX1RZUEVfVl9QOV9FTkMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfdl9wOV9lbmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXZlcnRpZ290djwvRklMRT4KKzxUSVRMRT52ZXJ0aWdvdHY8L1RJVExFPgorR3N0VmVydGlnb1RWCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFZlcnRpZ29UVkNsYXNzCitHU1RfVkVSVElHT19UVgorR1NUX1ZFUlRJR09fVFZfQ0FTVAorR1NUX0lTX1ZFUlRJR09fVFYKK0dTVF9WRVJUSUdPX1RWX0NMQVNTCitHU1RfSVNfVkVSVElHT19UVl9DTEFTUworR1NUX1RZUEVfVkVSVElHT19UVgorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF92ZXJ0aWdvX3R2X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC12aWRlb2JhbGFuY2U8L0ZJTEU+Cis8VElUTEU+dmlkZW9iYWxhbmNlPC9USVRMRT4KK0dzdFZpZGVvQmFsYW5jZQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RWaWRlb0JhbGFuY2VDbGFzcworR1NUX1ZJREVPX0JBTEFOQ0UKK0dTVF9WSURFT19CQUxBTkNFX0NBU1QKK0dTVF9JU19WSURFT19CQUxBTkNFCitHU1RfVklERU9fQkFMQU5DRV9DTEFTUworR1NUX0lTX1ZJREVPX0JBTEFOQ0VfQ0xBU1MKK0dTVF9UWVBFX1ZJREVPX0JBTEFOQ0UKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfdmlkZW9fYmFsYW5jZV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtdmlkZW9ib3g8L0ZJTEU+Cis8VElUTEU+dmlkZW9ib3g8L1RJVExFPgorR3N0VmlkZW9Cb3gKK0dzdFZpZGVvQm94RmlsbAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RWaWRlb0JveENsYXNzCitHU1RfVklERU9fQk9YCitHU1RfVklERU9fQk9YX0NBU1QKK0dTVF9JU19WSURFT19CT1gKK0dTVF9WSURFT19CT1hfQ0xBU1MKK0dTVF9JU19WSURFT19CT1hfQ0xBU1MKK0dTVF9UWVBFX1ZJREVPX0JPWAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF92aWRlb19ib3hfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXZpZGVvY3JvcDwvRklMRT4KKzxUSVRMRT52aWRlb2Nyb3A8L1RJVExFPgorR3N0VmlkZW9Dcm9wCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFZpZGVvQ3JvcENsYXNzCitHU1RfVklERU9fQ1JPUAorR1NUX1ZJREVPX0NST1BfQ0FTVAorR1NUX0lTX1ZJREVPX0NST1AKK0dTVF9WSURFT19DUk9QX0NMQVNTCitHU1RfSVNfVklERU9fQ1JPUF9DTEFTUworR1NUX1RZUEVfVklERU9fQ1JPUAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF92aWRlb19jcm9wX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC12aWRlb2ZsaXA8L0ZJTEU+Cis8VElUTEU+dmlkZW9mbGlwPC9USVRMRT4KK0dzdFZpZGVvRmxpcAorR3N0VmlkZW9GbGlwTWV0aG9kCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFZpZGVvRmxpcENsYXNzCitHU1RfVklERU9fRkxJUAorR1NUX1ZJREVPX0ZMSVBfQ0FTVAorR1NUX0lTX1ZJREVPX0ZMSVAKK0dTVF9WSURFT19GTElQX0NMQVNTCitHU1RfSVNfVklERU9fRkxJUF9DTEFTUworR1NUX1RZUEVfVklERU9fRkxJUAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF92aWRlb19mbGlwX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC12aWRlb21lZGlhbjwvRklMRT4KKzxUSVRMRT52aWRlb21lZGlhbjwvVElUTEU+CitHc3RWaWRlb01lZGlhbgorR3N0VmlkZW9NZWRpYW5TaXplCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFZpZGVvTWVkaWFuQ2xhc3MKK0dTVF9WSURFT19NRURJQU4KK0dTVF9WSURFT19NRURJQU5fQ0FTVAorR1NUX0lTX1ZJREVPX01FRElBTgorR1NUX1ZJREVPX01FRElBTl9DTEFTUworR1NUX0lTX1ZJREVPX01FRElBTl9DTEFTUworR1NUX1RZUEVfVklERU9fTUVESUFOCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3ZpZGVvX21lZGlhbl9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtdmlkZW9taXhlcjwvRklMRT4KKzxUSVRMRT52aWRlb21peGVyPC9USVRMRT4KK0dzdFZpZGVvTWl4ZXIyCitHc3RWaWRlb01peGVyMkJhY2tncm91bmQKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0VmlkZW9NaXhlcjJDbGFzcworR1NUX1ZJREVPX01JWEVSMgorR1NUX1ZJREVPX01JWEVSMl9DQVNUCitHU1RfSVNfVklERU9fTUlYRVIyCitHU1RfVklERU9fTUlYRVIyX0NMQVNTCitHU1RfSVNfVklERU9fTUlYRVIyX0NMQVNTCitHU1RfVFlQRV9WSURFT19NSVhFUjIKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfdmlkZW9fbWl4ZXIyX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC13YXJwdHY8L0ZJTEU+Cis8VElUTEU+d2FycHR2PC9USVRMRT4KK0dzdFdhcnBUVgorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RXYXJwVFZDbGFzcworR1NUX1dBUlBfVFYKK0dTVF9XQVJQX1RWX0NBU1QKK0dTVF9JU19XQVJQX1RWCitHU1RfV0FSUF9UVl9DTEFTUworR1NUX0lTX1dBUlBfVFZfQ0xBU1MKK0dTVF9UWVBFX1dBUlBfVFYKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfd2FycF90dl9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtd2F2ZWZvcm1zaW5rPC9GSUxFPgorPFRJVExFPndhdmVmb3Jtc2luazwvVElUTEU+CitHc3RXYXZlRm9ybVNpbmsKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0V2F2ZUZvcm1TaW5rQ2xhc3MKK0dTVF9JU19XQVZFRk9STV9TSU5LCitHU1RfSVNfV0FWRUZPUk1fU0lOS19DTEFTUworR1NUX1dBVkVGT1JNX1NJTksKK0dTVF9XQVZFRk9STV9TSU5LX0NMQVNTCitHU1RfVFlQRV9XQVZFRk9STV9TSU5LCitnc3Rfd2F2ZWZvcm1fc2lua19nZXRfdHlwZQorV0FWRV9GT1JNQVRfOTZNMDgKK1dBVkVfRk9STUFUXzk2TTE2CitXQVZFX0ZPUk1BVF85NlMwOAorV0FWRV9GT1JNQVRfOTZTMTYKK0JVRkZFUl9DT1VOVAorQlVGRkVSX1NJWkUKK0VSUk9SX0xFTkdUSAorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtd2F2ZW5jPC9GSUxFPgorPFRJVExFPndhdmVuYzwvVElUTEU+CitHc3RXYXZFbmMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0V2F2RW5jQ2xhc3MKK0dTVF9XQVZfRU5DCitHU1RfV0FWX0VOQ19DQVNUCitHU1RfSVNfV0FWX0VOQworR1NUX1dBVl9FTkNfQ0xBU1MKK0dTVF9JU19XQVZfRU5DX0NMQVNTCitHU1RfVFlQRV9XQVZfRU5DCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3dhdl9lbmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXdhdnBhcnNlPC9GSUxFPgorPFRJVExFPndhdnBhcnNlPC9USVRMRT4KK0dzdFdhdlBhcnNlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFdhdlBhcnNlQ2xhc3MKK0dTVF9XQVZfUEFSU0UKK0dTVF9XQVZfUEFSU0VfQ0FTVAorR1NUX0lTX1dBVl9QQVJTRQorR1NUX1dBVl9QQVJTRV9DTEFTUworR1NUX0lTX1dBVl9QQVJTRV9DTEFTUworR1NUX1RZUEVfV0FWX1BBUlNFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3dhdl9wYXJzZV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtd2F2cGFja2RlYzwvRklMRT4KKzxUSVRMRT53YXZwYWNrZGVjPC9USVRMRT4KK0dzdFdhdnBhY2tEZWMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0V2F2cGFja0RlY0NsYXNzCitHU1RfV0FWUEFDS19ERUMKK0dTVF9XQVZQQUNLX0RFQ19DQVNUCitHU1RfSVNfV0FWUEFDS19ERUMKK0dTVF9XQVZQQUNLX0RFQ19DTEFTUworR1NUX0lTX1dBVlBBQ0tfREVDX0NMQVNTCitHU1RfVFlQRV9XQVZQQUNLX0RFQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF93YXZwYWNrX2RlY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtd2F2cGFja2VuYzwvRklMRT4KKzxUSVRMRT53YXZwYWNrZW5jPC9USVRMRT4KK0dzdFdhdnBhY2tFbmMKK0dzdFdhdnBhY2tFbmNDb3JyZWN0aW9uTW9kZQorR3N0V2F2cGFja0VuY0pTTW9kZQorR3N0V2F2cGFja0VuY01vZGUKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0V2F2cGFja0VuY0NsYXNzCitHU1RfV0FWUEFDS19FTkMKK0dTVF9XQVZQQUNLX0VOQ19DQVNUCitHU1RfSVNfV0FWUEFDS19FTkMKK0dTVF9XQVZQQUNLX0VOQ19DTEFTUworR1NUX0lTX1dBVlBBQ0tfRU5DX0NMQVNTCitHU1RfVFlQRV9XQVZQQUNLX0VOQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF93YXZwYWNrX2VuY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtd2F2cGFja3BhcnNlPC9GSUxFPgorPFRJVExFPndhdnBhY2twYXJzZTwvVElUTEU+CitHc3RXYXZwYWNrUGFyc2UKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0V2F2cGFja1BhcnNlQ2xhc3MKK0dTVF9XQVZQQUNLX1BBUlNFCitHU1RfV0FWUEFDS19QQVJTRV9DQVNUCitHU1RfSVNfV0FWUEFDS19QQVJTRQorR1NUX1dBVlBBQ0tfUEFSU0VfQ0xBU1MKK0dTVF9JU19XQVZQQUNLX1BBUlNFX0NMQVNTCitHU1RfVFlQRV9XQVZQQUNLX1BBUlNFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3dhdnBhY2tfcGFyc2VfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXdlYm1tdXg8L0ZJTEU+Cis8VElUTEU+d2VibW11eDwvVElUTEU+CitHc3RXZWJNTXV4Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFdlYk1NdXhDbGFzcworR1NUX1dFQl9NX01VWAorR1NUX1dFQl9NX01VWF9DQVNUCitHU1RfSVNfV0VCX01fTVVYCitHU1RfV0VCX01fTVVYX0NMQVNTCitHU1RfSVNfV0VCX01fTVVYX0NMQVNTCitHU1RfVFlQRV9XRUJfTV9NVVgKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfd2ViX21fbXV4X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC14aW1hZ2VzcmM8L0ZJTEU+Cis8VElUTEU+eGltYWdlc3JjPC9USVRMRT4KK0dzdFhJbWFnZVNyYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RYSW1hZ2VTcmNDbGFzcworR1NUX1hfSU1BR0VfU1JDCitHU1RfWF9JTUFHRV9TUkNfQ0FTVAorR1NUX0lTX1hfSU1BR0VfU1JDCitHU1RfWF9JTUFHRV9TUkNfQ0xBU1MKK0dTVF9JU19YX0lNQUdFX1NSQ19DTEFTUworR1NUX1RZUEVfWF9JTUFHRV9TUkMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfeF9pbWFnZV9zcmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXk0bWVuYzwvRklMRT4KKzxUSVRMRT55NG1lbmM8L1RJVExFPgorR3N0WTRtRW5jb2RlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFk0bUVuY29kZUNsYXNzCitHU1RfWTRNX0VOQ09ERQorR1NUX1k0TV9FTkNPREVfQ0FTVAorR1NUX0lTX1k0TV9FTkNPREUKK0dTVF9ZNE1fRU5DT0RFX0NMQVNTCitHU1RfSVNfWTRNX0VOQ09ERV9DTEFTUworR1NUX1RZUEVfWTRNX0VOQ09ERQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF95NG1fZW5jb2RlX2dldF90eXBlCis8L1NFQ1RJT04+CisKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJncyBiL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzQxOTUwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzCkBAIC0wLDAgKzEsMjQ1OTAgQEAKKzxBUkc+Cis8TkFNRT5Hc3RJaXJFcXVhbGl6ZXIxMEJhbmRzOjpiYW5kMDwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+Wy0yNCwxMl08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPjI5IEh6PC9OSUNLPgorPEJMVVJCPmdhaW4gZm9yIHRoZSBmcmVxdWVuY3kgYmFuZCAyOSBIeiwgcmFuZ2luZyBmcm9tIC0yNCBkQiB0byArMTIgZEIuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdElpckVxdWFsaXplcjEwQmFuZHM6OmJhbmQxPC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bLTI0LDEyXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+NTkgSHo8L05JQ0s+Cis8QkxVUkI+Z2FpbiBmb3IgdGhlIGZyZXF1ZW5jeSBiYW5kIDU5IEh6LCByYW5naW5nIGZyb20gLTI0IGRCIHRvICsxMiBkQi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SWlyRXF1YWxpemVyMTBCYW5kczo6YmFuZDI8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlstMjQsMTJdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz4xMTkgSHo8L05JQ0s+Cis8QkxVUkI+Z2FpbiBmb3IgdGhlIGZyZXF1ZW5jeSBiYW5kIDExOSBIeiwgcmFuZ2luZyBmcm9tIC0yNCBkQiB0byArMTIgZEIuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdElpckVxdWFsaXplcjEwQmFuZHM6OmJhbmQzPC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bLTI0LDEyXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+MjM3IEh6PC9OSUNLPgorPEJMVVJCPmdhaW4gZm9yIHRoZSBmcmVxdWVuY3kgYmFuZCAyMzcgSHosIHJhbmdpbmcgZnJvbSAtMjQgZEIgdG8gKzEyIGRCLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJaXJFcXVhbGl6ZXIxMEJhbmRzOjpiYW5kNDwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+Wy0yNCwxMl08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPjQ3NCBIejwvTklDSz4KKzxCTFVSQj5nYWluIGZvciB0aGUgZnJlcXVlbmN5IGJhbmQgNDc0IEh6LCByYW5naW5nIGZyb20gLTI0IGRCIHRvICsxMiBkQi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SWlyRXF1YWxpemVyMTBCYW5kczo6YmFuZDU8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlstMjQsMTJdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz45NDcgSHo8L05JQ0s+Cis8QkxVUkI+Z2FpbiBmb3IgdGhlIGZyZXF1ZW5jeSBiYW5kIDk0NyBIeiwgcmFuZ2luZyBmcm9tIC0yNCBkQiB0byArMTIgZEIuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdElpckVxdWFsaXplcjEwQmFuZHM6OmJhbmQ2PC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bLTI0LDEyXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+MTg4OSBIejwvTklDSz4KKzxCTFVSQj5nYWluIGZvciB0aGUgZnJlcXVlbmN5IGJhbmQgMTg4OSBIeiwgcmFuZ2luZyBmcm9tIC0yNCBkQiB0byArMTIgZEIuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdElpckVxdWFsaXplcjEwQmFuZHM6OmJhbmQ3PC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bLTI0LDEyXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Mzc3MCBIejwvTklDSz4KKzxCTFVSQj5nYWluIGZvciB0aGUgZnJlcXVlbmN5IGJhbmQgMzc3MCBIeiwgcmFuZ2luZyBmcm9tIC0yNCBkQiB0byArMTIgZEIuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdElpckVxdWFsaXplcjEwQmFuZHM6OmJhbmQ4PC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bLTI0LDEyXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+NzUyMyBIejwvTklDSz4KKzxCTFVSQj5nYWluIGZvciB0aGUgZnJlcXVlbmN5IGJhbmQgNzUyMyBIeiwgcmFuZ2luZyBmcm9tIC0yNCBkQiB0byArMTIgZEIuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdElpckVxdWFsaXplcjEwQmFuZHM6OmJhbmQ5PC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bLTI0LDEyXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+MTUwMTEgSHo8L05JQ0s+Cis8QkxVUkI+Z2FpbiBmb3IgdGhlIGZyZXF1ZW5jeSBiYW5kIDE1MDExIEh6LCByYW5naW5nIGZyb20gLTI0IGRCIHRvICsxMiBkQi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SWlyRXF1YWxpemVyM0JhbmRzOjpiYW5kMDwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+Wy0yNCwxMl08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPjExMCBIejwvTklDSz4KKzxCTFVSQj5nYWluIGZvciB0aGUgZnJlcXVlbmN5IGJhbmQgMTAwIEh6LCByYW5naW5nIGZyb20gLTI0LjAgdG8gKzEyLjAuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdElpckVxdWFsaXplcjNCYW5kczo6YmFuZDE8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlstMjQsMTJdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz4xMTAwIEh6PC9OSUNLPgorPEJMVVJCPmdhaW4gZm9yIHRoZSBmcmVxdWVuY3kgYmFuZCAxMTAwIEh6LCByYW5naW5nIGZyb20gLTI0LjAgdG8gKzEyLjAuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdElpckVxdWFsaXplcjNCYW5kczo6YmFuZDI8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlstMjQsMTJdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz4xMSBrSHo8L05JQ0s+Cis8QkxVUkI+Z2FpbiBmb3IgdGhlIGZyZXF1ZW5jeSBiYW5kIDExIGtIeiwgcmFuZ2luZyBmcm9tIC0yNC4wIHRvICsxMi4wLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJaXJFcXVhbGl6ZXJOQmFuZHM6Om51bS1iYW5kczwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPlsxLDY0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPm51bS1iYW5kczwvTklDSz4KKzxCTFVSQj5udW1iZXIgb2YgZGlmZmVyZW50IGJhbmRzIHRvIHVzZS48L0JMVVJCPgorPERFRkFVTFQ+MTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpRmlsZVNpbms6OmxvY2F0aW9uPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RmlsZSBMb2NhdGlvbjwvTklDSz4KKzxCTFVSQj5Mb2NhdGlvbiBvZiB0aGUgZmlsZSB0byB3cml0ZS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlGaWxlU2luazo6aW5kZXg8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkluZGV4PC9OSUNLPgorPEJMVVJCPkluZGV4IHRvIHVzZSB3aXRoIGxvY2F0aW9uIHByb3BlcnR5IHRvIGNyZWF0ZSBmaWxlIG5hbWVzLiAgVGhlIGluZGV4IGlzIGluY3JlbWVudGVkIGJ5IG9uZSBmb3IgZWFjaCBidWZmZXIgd3JpdHRlbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlGaWxlU2luazo6bmV4dC1maWxlPC9OQU1FPgorPFRZUEU+R3N0TXVsdGlGaWxlU2lua05leHQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5OZXh0IEZpbGU8L05JQ0s+Cis8QkxVUkI+V2hlbiB0byBzdGFydCBhIG5ldyBmaWxlLjwvQkxVUkI+Cis8REVGQVVMVD5OZXcgZmlsZSBmb3IgZWFjaCBidWZmZXI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpRmlsZVNpbms6OnBvc3QtbWVzc2FnZXM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBvc3QgTWVzc2FnZXM8L05JQ0s+Cis8QkxVUkI+UG9zdCBhIG1lc3NhZ2UgZm9yIGVhY2ggZmlsZSB3aXRoIGluZm9ybWF0aW9uIG9mIHRoZSBidWZmZXIuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNdWx0aUZpbGVTaW5rOjptYXgtZmlsZXM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heCBmaWxlczwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIG51bWJlciBvZiBmaWxlcyB0byBrZWVwIG9uIGRpc2suIE9uY2UgdGhlIG1heGltdW0gaXMgcmVhY2hlZCxvbGQgZmlsZXMgc3RhcnQgdG8gYmUgZGVsZXRlZCB0byBtYWtlIHJvb20gZm9yIG5ldyBvbmVzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNdWx0aUZpbGVTaW5rOjptYXgtZmlsZS1zaXplPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heGltdW0gRmlsZSBTaXplPC9OSUNLPgorPEJMVVJCPk1heGltdW0gZmlsZSBzaXplIGJlZm9yZSBzdGFydGluZyBhIG5ldyBmaWxlIGluIG1heC1zaXplIG1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPjIxNDc0ODM2NDg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpRmlsZVNpbms6OmFnZ3JlZ2F0ZS1nb3BzPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5BZ2dyZWdhdGUgR09QczwvTklDSz4KKzxCTFVSQj5XaGV0aGVyIHRvIGFnZ3JlZ2F0ZSBHT1BzIGFuZCBwcm9jZXNzIHRoZW0gYXMgYSB3aG9sZSB3aXRob3V0IHNwbGl0dGluZy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpRmlsZVNpbms6Om1heC1maWxlLWR1cmF0aW9uPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heGltdW0gRmlsZSBEdXJhdGlvbjwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIGZpbGUgZHVyYXRpb24gYmVmb3JlIHN0YXJ0aW5nIGEgbmV3IGZpbGUgaW4gbWF4LXNpemUgbW9kZSAoaW4gbmFub3NlY29uZHMpLjwvQkxVUkI+Cis8REVGQVVMVD4xODQ0Njc0NDA3MzcwOTU1MTYxNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlGaWxlU3JjOjpjYXBzPC9OQU1FPgorPFRZUEU+R3N0Q2Fwcyo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5DYXBzPC9OSUNLPgorPEJMVVJCPkNhcHMgZGVzY3JpYmluZyB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpRmlsZVNyYzo6aW5kZXg8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZpbGUgSW5kZXg8L05JQ0s+Cis8QkxVUkI+SW5kZXggdG8gdXNlIHdpdGggbG9jYXRpb24gcHJvcGVydHkgdG8gY3JlYXRlIGZpbGUgbmFtZXMuICBUaGUgaW5kZXggaXMgaW5jcmVtZW50ZWQgYnkgb25lIGZvciBlYWNoIGJ1ZmZlciByZWFkLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNdWx0aUZpbGVTcmM6OmxvY2F0aW9uPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RmlsZSBMb2NhdGlvbjwvTklDSz4KKzxCTFVSQj5QYXR0ZXJuIHRvIGNyZWF0ZSBmaWxlIG5hbWVzIG9mIGlucHV0IGZpbGVzLiAgRmlsZSBuYW1lcyBhcmUgY3JlYXRlZCBieSBjYWxsaW5nIHNwcmludGYoKSB3aXRoIHRoZSBwYXR0ZXJuIGFuZCB0aGUgY3VycmVudCBpbmRleC48L0JMVVJCPgorPERFRkFVTFQ+IiUwNWQiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNdWx0aUZpbGVTcmM6Omxvb3A8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkxvb3A8L05JQ0s+Cis8QkxVUkI+V2hldGhlciB0byByZXBlYXQgZnJvbSB0aGUgYmVnaW5uaW5nIHdoZW4gYWxsIGZpbGVzIGhhdmUgYmVlbiByZWFkLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlGaWxlU3JjOjpzdGFydC1pbmRleDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U3RhcnQgSW5kZXg8L05JQ0s+Cis8QkxVUkI+U3RhcnQgdmFsdWUgb2YgaW5kZXguICBUaGUgaW5pdGlhbCB2YWx1ZSBvZiBpbmRleCBjYW4gYmUgc2V0IGVpdGhlciBieSBzZXR0aW5nIGluZGV4IG9yIHN0YXJ0LWluZGV4LiAgV2hlbiB0aGUgZW5kIG9mIHRoZSBsb29wIGlzIHJlYWNoZWQsIHRoZSBpbmRleCB3aWxsIGJlIHNldCB0byB0aGUgdmFsdWUgc3RhcnQtaW5kZXguPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpRmlsZVNyYzo6c3RvcC1pbmRleDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U3RvcCBJbmRleDwvTklDSz4KKzxCTFVSQj5TdG9wIHZhbHVlIG9mIGluZGV4LiAgVGhlIHNwZWNpYWwgdmFsdWUgLTEgbWVhbnMgbm8gc3RvcC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0T3NzU3JjOjpkZXZpY2U8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EZXZpY2U8L05JQ0s+Cis8QkxVUkI+T1NTIGRldmljZSAodXN1YWxseSAvZGV2L2RzcE4pLjwvQkxVUkI+Cis8REVGQVVMVD4iL2Rldi9kc3AiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RPc3NTcmM6OmRldmljZS1uYW1lPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5EZXZpY2UgbmFtZTwvTklDSz4KKzxCTFVSQj5IdW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBzb3VuZCBkZXZpY2UuPC9CTFVSQj4KKzxERUZBVUxUPiIiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTcGVjdHJ1bTo6YmFuZHM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT5bMiwxMDczNzQxODI0XTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QmFuZHM8L05JQ0s+Cis8QkxVUkI+TnVtYmVyIG9mIGZyZXF1ZW5jeSBiYW5kcy48L0JMVVJCPgorPERFRkFVTFQ+MTI4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTcGVjdHJ1bTo6aW50ZXJ2YWw8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPj49IDE8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludGVydmFsPC9OSUNLPgorPEJMVVJCPkludGVydmFsIG9mIHRpbWUgYmV0d2VlbiBtZXNzYWdlIHBvc3RzIChpbiBuYW5vc2Vjb25kcykuPC9CTFVSQj4KKzxERUZBVUxUPjEwMDAwMDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BlY3RydW06OnRocmVzaG9sZDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VGhyZXNob2xkPC9OSUNLPgorPEJMVVJCPmRCIHRocmVzaG9sZCBmb3IgcmVzdWx0LiBBbGwgbG93ZXIgdmFsdWVzIHdpbGwgYmUgc2V0IHRvIHRoaXMuPC9CTFVSQj4KKzxERUZBVUxUPi02MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BlY3RydW06Om1lc3NhZ2UtbWFnbml0dWRlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYWduaXR1ZGU8L05JQ0s+Cis8QkxVUkI+V2hldGhlciB0byBhZGQgYSAnbWFnbml0dWRlJyBmaWVsZCB0byB0aGUgc3RydWN0dXJlIG9mIGFueSAnc3BlY3RydW0nIGVsZW1lbnQgbWVzc2FnZXMgcG9zdGVkIG9uIHRoZSBidXMuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNwZWN0cnVtOjptZXNzYWdlLXBoYXNlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5QaGFzZTwvTklDSz4KKzxCTFVSQj5XaGV0aGVyIHRvIGFkZCBhICdwaGFzZScgZmllbGQgdG8gdGhlIHN0cnVjdHVyZSBvZiBhbnkgJ3NwZWN0cnVtJyBlbGVtZW50IG1lc3NhZ2VzIHBvc3RlZCBvbiB0aGUgYnVzLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BlY3RydW06OnBvc3QtbWVzc2FnZXM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBvc3QgTWVzc2FnZXM8L05JQ0s+Cis8QkxVUkI+V2hldGhlciB0byBwb3N0IGEgJ3NwZWN0cnVtJyBlbGVtZW50IG1lc3NhZ2Ugb24gdGhlIGJ1cyBmb3IgZWFjaCBwYXNzZWQgaW50ZXJ2YWwuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNwZWN0cnVtOjptdWx0aS1jaGFubmVsPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NdWx0aWNoYW5uZWwgcmVzdWx0czwvTklDSz4KKzxCTFVSQj5TZW5kIHNlcGFyYXRlIHJlc3VsdHMgZm9yIGVhY2ggY2hhbm5lbC48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZpZGVvQm94OjphbHBoYTwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkFscGhhPC9OSUNLPgorPEJMVVJCPkFscGhhIHZhbHVlIHBpY3R1cmUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZpZGVvQm94Ojpib3JkZXItYWxwaGE8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Cb3JkZXIgQWxwaGE8L05JQ0s+Cis8QkxVUkI+QWxwaGEgdmFsdWUgb2YgdGhlIGJvcmRlci48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VmlkZW9Cb3g6OmJvdHRvbTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Cb3R0b208L05JQ0s+Cis8QkxVUkI+UGl4ZWxzIHRvIGJveCBhdCBib3R0b20gKDwwID0gYWRkIGEgYm9yZGVyKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VmlkZW9Cb3g6OmZpbGw8L05BTUU+Cis8VFlQRT5Hc3RWaWRlb0JveEZpbGw8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5GaWxsPC9OSUNLPgorPEJMVVJCPkhvdyB0byBmaWxsIHRoZSBib3JkZXJzLjwvQkxVUkI+Cis8REVGQVVMVD5CbGFjazwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VmlkZW9Cb3g6OmxlZnQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TGVmdDwvTklDSz4KKzxCTFVSQj5QaXhlbHMgdG8gYm94IGF0IGxlZnQgKDwwICA9IGFkZCBhIGJvcmRlcikuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZpZGVvQm94OjpyaWdodDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SaWdodDwvTklDSz4KKzxCTFVSQj5QaXhlbHMgdG8gYm94IGF0IHJpZ2h0ICg8MCA9IGFkZCBhIGJvcmRlcikuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZpZGVvQm94Ojp0b3A8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VG9wPC9OSUNLPgorPEJMVVJCPlBpeGVscyB0byBib3ggYXQgdG9wICg8MCA9IGFkZCBhIGJvcmRlcikuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZpZGVvQm94OjphdXRvY3JvcDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QXV0byBjcm9wPC9OSUNLPgorPEJMVVJCPkF1dG8gY3JvcC48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFVEUFNpbms6Omhvc3Q8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5ob3N0PC9OSUNLPgorPEJMVVJCPlRoZSBob3N0L0lQL011bHRpY2FzdCBncm91cCB0byBzZW5kIHRoZSBwYWNrZXRzIHRvLjwvQkxVUkI+Cis8REVGQVVMVD4ibG9jYWxob3N0IjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VURQU2luazo6cG9ydDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNjU1MzVdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5wb3J0PC9OSUNLPgorPEJMVVJCPlRoZSBwb3J0IHRvIHNlbmQgdGhlIHBhY2tldHMgdG8uPC9CTFVSQj4KKzxERUZBVUxUPjUwMDQ8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFVEUFNyYzo6Y2FwczwvTkFNRT4KKzxUWVBFPkdzdENhcHMqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q2FwczwvTklDSz4KKzxCTFVSQj5UaGUgY2FwcyBvZiB0aGUgc291cmNlIHBhZC48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RVRFBTcmM6Om11bHRpY2FzdC1ncm91cDwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk11bHRpY2FzdCBHcm91cDwvTklDSz4KKzxCTFVSQj5UaGUgQWRkcmVzcyBvZiBtdWx0aWNhc3QgZ3JvdXAgdG8gam9pbi4gKERFUFJFQ0FURUQ6IFVzZSBhZGRyZXNzIHByb3BlcnR5IGluc3RlYWQpLjwvQkxVUkI+Cis8REVGQVVMVD4iMC4wLjAuMCI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFVEUFNyYzo6cG9ydDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNjU1MzVdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qb3J0PC9OSUNLPgorPEJMVVJCPlRoZSBwb3J0IHRvIHJlY2VpdmUgdGhlIHBhY2tldHMgZnJvbSwgMD1hbGxvY2F0ZS48L0JMVVJCPgorPERFRkFVTFQ+NTAwNDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VURQU3JjOjp1cmk8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5VUkk8L05JQ0s+Cis8QkxVUkI+VVJJIGluIHRoZSBmb3JtIG9mIHVkcDovL211bHRpY2FzdF9ncm91cDpwb3J0LjwvQkxVUkI+Cis8REVGQVVMVD4idWRwOi8vMC4wLjAuMDo1MDA0IjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VURQU3JjOjpidWZmZXItc2l6ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QnVmZmVyIFNpemU8L05JQ0s+Cis8QkxVUkI+U2l6ZSBvZiB0aGUga2VybmVsIHJlY2VpdmUgYnVmZmVyIGluIGJ5dGVzLCAwPWRlZmF1bHQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFVEUFNyYzo6dGltZW91dDwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UaW1lb3V0PC9OSUNLPgorPEJMVVJCPlBvc3QgYSBtZXNzYWdlIGFmdGVyIHRpbWVvdXQgbmFub3NlY29uZHMgKDAgPSBkaXNhYmxlZCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFVEUFNyYzo6c2tpcC1maXJzdC1ieXRlczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U2tpcCBmaXJzdCBieXRlczwvTklDSz4KKzxCTFVSQj5udW1iZXIgb2YgYnl0ZXMgdG8gc2tpcCBmb3IgZWFjaCB1ZHAgcGFja2V0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RVRFBTcmM6OmF1dG8tbXVsdGljYXN0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5BdXRvIE11bHRpY2FzdDwvTklDSz4KKzxCTFVSQj5BdXRvbWF0aWNhbGx5IGpvaW4vbGVhdmUgbXVsdGljYXN0IGdyb3Vwcy48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VURQU3JjOjptdWx0aWNhc3QtaWZhY2U8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NdWx0aWNhc3QgSW50ZXJmYWNlPC9OSUNLPgorPEJMVVJCPlRoZSBuZXR3b3JrIGludGVyZmFjZSBvbiB3aGljaCB0byBqb2luIHRoZSBtdWx0aWNhc3QgZ3JvdXAuVGhpcyBhbGxvd3MgbXVsdGlwbGUgaW50ZXJmYWNlcyBzZXBlcmF0ZWQgYnkgY29tbWEuICgiZXRoMCxldGgxIikuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFVEUFNyYzo6cmV1c2U8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJldXNlPC9OSUNLPgorPEJMVVJCPkVuYWJsZSByZXVzZSBvZiB0aGUgcG9ydC48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VURQU3JjOjpjbG9zZS1zb2NrZXQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNsb3NlIHNvY2tldDwvTklDSz4KKzxCTFVSQj5DbG9zZSBzb2NrZXQgaWYgcGFzc2VkIGFzIHByb3BlcnR5IG9uIHN0YXRlIGNoYW5nZS48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VURQU3JjOjpzb2NrZXQ8L05BTUU+Cis8VFlQRT5HU29ja2V0KjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNvY2tldDwvTklDSz4KKzxCTFVSQj5Tb2NrZXQgdG8gdXNlIGZvciBVRFAgcmVjZXB0aW9uLiAoTlVMTCA9PSBhbGxvY2F0ZSkuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VURQU3JjOjp1c2VkLXNvY2tldDwvTkFNRT4KKzxUWVBFPkdTb2NrZXQqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5Tb2NrZXQgSGFuZGxlPC9OSUNLPgorPEJMVVJCPlNvY2tldCBjdXJyZW50bHkgaW4gdXNlIGZvciBVRFAgcmVjZXB0aW9uLiAoTlVMTCA9IG5vIHNvY2tldCkuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VURQU3JjOjphZGRyZXNzPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QWRkcmVzczwvTklDSz4KKzxCTFVSQj5BZGRyZXNzIHRvIHJlY2VpdmUgcGFja2V0cyBmb3IuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgbXVsdGljYXN0LWdyb3VwIHByb3BlcnR5IGZvciBub3cuPC9CTFVSQj4KKzxERUZBVUxUPiIwLjAuMC4wIjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VURQU3JjOjpsb29wPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NdWx0aWNhc3QgTG9vcGJhY2s8L05JQ0s+Cis8QkxVUkI+VXNlZCBmb3Igc2V0dGluZyB0aGUgbXVsdGljYXN0IGxvb3AgcGFyYW1ldGVyLiBUUlVFID0gZW5hYmxlLCBGQUxTRSA9IGRpc2FibGUuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFVEUFNyYzo6cmV0cmlldmUtc2VuZGVyLWFkZHJlc3M8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJldHJpZXZlIFNlbmRlciBBZGRyZXNzPC9OSUNLPgorPEJMVVJCPldoZXRoZXIgdG8gcmV0cmlldmUgdGhlIHNlbmRlciBhZGRyZXNzIGFuZCBhZGQgaXQgdG8gYnVmZmVycyBhcyBtZXRhLiBEaXNhYmxpbmcgdGhpcyBtaWdodCByZXN1bHQgaW4gbWlub3IgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIGluIGNlcnRhaW4gc2NlbmFyaW9zLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTTVBURTo6Ym9yZGVyPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Cb3JkZXI8L05JQ0s+Cis8QkxVUkI+VGhlIGJvcmRlciB3aWR0aCBvZiB0aGUgdHJhbnNpdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U01QVEU6OmRlcHRoPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSwyNF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRlcHRoPC9OSUNLPgorPEJMVVJCPkRlcHRoIG9mIHRoZSBtYXNrIGluIGJpdHMuPC9CTFVSQj4KKzxERUZBVUxUPjE2PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTTVBURTo6dHlwZTwvTkFNRT4KKzxUWVBFPkdzdFNNUFRFVHJhbnNpdGlvblR5cGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UeXBlPC9OSUNLPgorPEJMVVJCPlRoZSB0eXBlIG9mIHRyYW5zaXRpb24gdG8gdXNlLjwvQkxVUkI+Cis8REVGQVVMVD5BIGJhciBtb3ZlcyBmcm9tIGxlZnQgdG8gcmlnaHQ8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNNUFRFOjpkdXJhdGlvbjwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EdXJhdGlvbjwvTklDSz4KKzxCTFVSQj5EdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiBlZmZlY3QgaW4gbmFub3NlY29uZHMuPC9CTFVSQj4KKzxERUZBVUxUPjEwMDAwMDAwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNNUFRFOjppbnZlcnQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludmVydDwvTklDSz4KKzxCTFVSQj5JbnZlcnQgdHJhbnNpdGlvbiBtYXNrLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRTUFNyYzo6ZGVidWc8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRlYnVnPC9OSUNLPgorPEJMVVJCPkR1bXAgcmVxdWVzdCBhbmQgcmVzcG9uc2UgbWVzc2FnZXMgdG8gc3Rkb3V0KERFUFJFQ0FURUQ6IFByaW50ZWQgYWxsIFJUU1AgbWVzc2FnZSB0byBnc3RyZWFtZXIgbG9nIGFzICdsb2cnIGxldmVsKS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OmxvY2F0aW9uPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UlRTUCBMb2NhdGlvbjwvTklDSz4KKzxCTFVSQj5Mb2NhdGlvbiBvZiB0aGUgUlRTUCB1cmwgdG8gcmVhZC48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRTUFNyYzo6cHJvdG9jb2xzPC9OQU1FPgorPFRZUEU+R3N0UlRTUExvd2VyVHJhbnM8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qcm90b2NvbHM8L05JQ0s+Cis8QkxVUkI+QWxsb3dlZCBsb3dlciB0cmFuc3BvcnQgcHJvdG9jb2xzLjwvQkxVUkI+Cis8REVGQVVMVD5HU1RfUlRTUF9MT1dFUl9UUkFOU19VRFB8R1NUX1JUU1BfTE9XRVJfVFJBTlNfVURQX01DQVNUfEdTVF9SVFNQX0xPV0VSX1RSQU5TX1RDUDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRTUFNyYzo6cmV0cnk8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSA2NTUzNTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UmV0cnk8L05JQ0s+Cis8QkxVUkI+TWF4IG51bWJlciBvZiByZXRyaWVzIHdoZW4gYWxsb2NhdGluZyBSVFAgcG9ydHMuPC9CTFVSQj4KKzxERUZBVUxUPjIwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjp0aW1lb3V0PC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRpbWVvdXQ8L05JQ0s+Cis8QkxVUkI+UmV0cnkgVENQIHRyYW5zcG9ydCBhZnRlciBVRFAgdGltZW91dCBtaWNyb3NlY29uZHMgKDAgPSBkaXNhYmxlZCkuPC9CTFVSQj4KKzxERUZBVUxUPjUwMDAwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkJ1ZmZlciBsYXRlbmN5IGluIG1zPC9OSUNLPgorPEJMVVJCPkFtb3VudCBvZiBtcyB0byBidWZmZXIuPC9CTFVSQj4KKzxERUZBVUxUPjIwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OnRjcC10aW1lb3V0PC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRDUCBUaW1lb3V0PC9OSUNLPgorPEJMVVJCPkZhaWwgYWZ0ZXIgdGltZW91dCBtaWNyb3NlY29uZHMgb24gVENQIGNvbm5lY3Rpb25zICgwID0gZGlzYWJsZWQpLjwvQkxVUkI+Cis8REVGQVVMVD4yMDAwMDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRTUFNyYzo6Y29ubmVjdGlvbi1zcGVlZDwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PD0gMTg0NDY3NDQwNzM3MDk1NTE8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNvbm5lY3Rpb24gU3BlZWQ8L05JQ0s+Cis8QkxVUkI+TmV0d29yayBjb25uZWN0aW9uIHNwZWVkIGluIGticHMgKDAgPSB1bmtub3duKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRTUFNyYzo6bmF0LW1ldGhvZDwvTkFNRT4KKzxUWVBFPkdzdFJUU1BOYXRNZXRob2Q8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5OQVQgTWV0aG9kPC9OSUNLPgorPEJMVVJCPk1ldGhvZCB0byB1c2UgZm9yIHRyYXZlcnNpbmcgZmlyZXdhbGxzIGFuZCBOQVQuPC9CTFVSQj4KKzxERUZBVUxUPlNlbmQgRHVtbXkgcGFja2V0czwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRTUFNyYzo6ZG8tcnRjcDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RG8gUlRDUDwvTklDSz4KKzxCTFVSQj5TZW5kIFJUQ1AgcGFja2V0cywgZGlzYWJsZSBmb3Igb2xkIGluY29tcGF0aWJsZSBzZXJ2ZXIuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OnByb3h5PC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UHJveHk8L05JQ0s+Cis8QkxVUkI+UHJveHkgc2V0dGluZ3MgZm9yIEhUVFAgdHVubmVsaW5nLiBGb3JtYXQ6IFtodHRwOi8vXVt1c2VyOnBhc3N3ZEBdaG9zdFs6cG9ydF0uPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OnJ0cC1ibG9ja3NpemU8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSA2NTUzNjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UlRQIEJsb2Nrc2l6ZTwvTklDSz4KKzxCTFVSQj5SVFAgcGFja2FnZSBzaXplIHRvIHN1Z2dlc3QgdG8gc2VydmVyICgwID0gZGlzYWJsZWQpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjp1c2VyLWlkPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+dXNlci1pZDwvTklDSz4KKzxCTFVSQj5SVFNQIGxvY2F0aW9uIFVSSSB1c2VyIGlkIGZvciBhdXRoZW50aWNhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRTUFNyYzo6dXNlci1wdzwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPnVzZXItcHc8L05JQ0s+Cis8QkxVUkI+UlRTUCBsb2NhdGlvbiBVUkkgdXNlciBwYXNzd29yZCBmb3IgYXV0aGVudGljYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OmJ1ZmZlci1tb2RlPC9OQU1FPgorPFRZUEU+R3N0UlRTUFNyY0J1ZmZlck1vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CdWZmZXIgTW9kZTwvTklDSz4KKzxCTFVSQj5Db250cm9sIHRoZSBidWZmZXJpbmcgYWxnb3JpdGhtIGluIHVzZS48L0JMVVJCPgorPERFRkFVTFQ+Q2hvb3NlIG1vZGUgZGVwZW5kaW5nIG9uIHN0cmVhbSBsaXZlPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjpwb3J0LXJhbmdlPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UG9ydCByYW5nZTwvTklDSz4KKzxCTFVSQj5DbGllbnQgcG9ydCByYW5nZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlY2VpdmUgUlRQIGFuZCBSVENQIGRhdGEsIGVnLiAzMDAwLTMwMDUgKE5VTEwgPSBubyByZXN0cmljdGlvbnMpLjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjp1ZHAtYnVmZmVyLXNpemU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlVEUCBCdWZmZXIgU2l6ZTwvTklDSz4KKzxCTFVSQj5TaXplIG9mIHRoZSBrZXJuZWwgVURQIHJlY2VpdmUgYnVmZmVyIGluIGJ5dGVzLCAwPWRlZmF1bHQuPC9CTFVSQj4KKzxERUZBVUxUPjUyNDI4ODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRTUFNyYzo6c2hvcnQtaGVhZGVyPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TaG9ydCBIZWFkZXI8L05JQ0s+Cis8QkxVUkI+T25seSBzZW5kIHRoZSBiYXNpYyBSVFNQIGhlYWRlcnMgZm9yIGJyb2tlbiBlbmNvZGVycy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OmRvLXJ0c3Ata2VlcC1hbGl2ZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RG8gUlRTUCBLZWVwIEFsaXZlPC9OSUNLPgorPEJMVVJCPlNlbmQgUlRTUCBrZWVwIGFsaXZlIHBhY2tldHMsIGRpc2FibGUgZm9yIG9sZCBpbmNvbXBhdGlibGUgc2VydmVyLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjpkcm9wLW9uLWxhdGVuY3k8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRyb3AgYnVmZmVycyB3aGVuIG1heGltdW0gbGF0ZW5jeSBpcyByZWFjaGVkPC9OSUNLPgorPEJMVVJCPlRlbGxzIHRoZSBqaXR0ZXJidWZmZXIgdG8gbmV2ZXIgZXhjZWVkIHRoZSBnaXZlbiBsYXRlbmN5IGluIHNpemUuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjpwcm9iYXRpb248L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk51bWJlciBvZiBwcm9iYXRpb25zPC9OSUNLPgorPEJMVVJCPkNvbnNlY3V0aXZlIHBhY2tldCBzZXF1ZW5jZSBudW1iZXJzIHRvIGFjY2VwdCB0aGUgc291cmNlLjwvQkxVUkI+Cis8REVGQVVMVD4yPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjp1ZHAtcmVjb25uZWN0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SZWNvbm5lY3QgdG8gdGhlIHNlcnZlcjwvTklDSz4KKzxCTFVSQj5SZWNvbm5lY3QgdG8gdGhlIHNlcnZlciBpZiBSVFNQIGNvbm5lY3Rpb24gaXMgY2xvc2VkIHdoZW4gZG9pbmcgVURQLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjpwcm94eS1pZDwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPnByb3h5LWlkPC9OSUNLPgorPEJMVVJCPkhUVFAgcHJveHkgVVJJIHVzZXIgaWQgZm9yIGF1dGhlbnRpY2F0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4iIjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRTUFNyYzo6cHJveHktcHc8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5wcm94eS1wdzwvTklDSz4KKzxCTFVSQj5IVFRQIHByb3h5IFVSSSB1c2VyIHBhc3N3b3JkIGZvciBhdXRoZW50aWNhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+IiI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6Om11bHRpY2FzdC1pZmFjZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk11bHRpY2FzdCBJbnRlcmZhY2U8L05JQ0s+Cis8QkxVUkI+VGhlIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHdoaWNoIHRvIGpvaW4gdGhlIG11bHRpY2FzdCBncm91cC48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRTUFNyYzo6bnRwLXN5bmM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlN5bmMgb24gTlRQIGNsb2NrPC9OSUNLPgorPEJMVVJCPlN5bmNocm9uaXplIHJlY2VpdmVkIHN0cmVhbXMgdG8gdGhlIE5UUCBjbG9jay48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OnVzZS1waXBlbGluZS1jbG9jazwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VXNlIHBpcGVsaW5lIGNsb2NrPC9OSUNLPgorPEJMVVJCPlVzZSB0aGUgcGlwZWxpbmUgcnVubmluZy10aW1lIHRvIHNldCB0aGUgTlRQIHRpbWUgaW4gdGhlIFJUQ1AgU1IgbWVzc2FnZXMoREVQUkVDQVRFRDogVXNlIG50cC10aW1lLXNvdXJjZSBwcm9wZXJ0eSkuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjpzZGVzPC9OQU1FPgorPFRZUEU+R3N0U3RydWN0dXJlKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNERVM8L05JQ0s+Cis8QkxVUkI+VGhlIFNERVMgaXRlbXMgb2YgdGhpcyBzZXNzaW9uLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OnRscy1kYXRhYmFzZTwvTkFNRT4KKzxUWVBFPkdUbHNEYXRhYmFzZSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UTFMgZGF0YWJhc2U8L05JQ0s+Cis8QkxVUkI+VExTIGRhdGFiYXNlIHdpdGggYW5jaG9yIGNlcnRpZmljYXRlIGF1dGhvcml0aWVzIHVzZWQgdG8gdmFsaWRhdGUgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZS48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjp0bHMtdmFsaWRhdGlvbi1mbGFnczwvTkFNRT4KKzxUWVBFPkdUbHNDZXJ0aWZpY2F0ZUZsYWdzPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VExTIHZhbGlkYXRpb24gZmxhZ3M8L05JQ0s+Cis8QkxVUkI+VExTIGNlcnRpZmljYXRlIHZhbGlkYXRpb24gZmxhZ3MgdXNlZCB0byB2YWxpZGF0ZSB0aGUgc2VydmVyIGNlcnRpZmljYXRlLjwvQkxVUkI+Cis8REVGQVVMVD5HX1RMU19DRVJUSUZJQ0FURV9VTktOT1dOX0NBfEdfVExTX0NFUlRJRklDQVRFX0JBRF9JREVOVElUWXxHX1RMU19DRVJUSUZJQ0FURV9OT1RfQUNUSVZBVEVEfEdfVExTX0NFUlRJRklDQVRFX0VYUElSRUR8R19UTFNfQ0VSVElGSUNBVEVfUkVWT0tFRHxHX1RMU19DRVJUSUZJQ0FURV9JTlNFQ1VSRXxHX1RMU19DRVJUSUZJQ0FURV9HRU5FUklDX0VSUk9SPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjpkby1yZXRyYW5zbWlzc2lvbjwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UmV0cmFuc21pc3Npb248L05JQ0s+Cis8QkxVUkI+QXNrIHRoZSBzZXJ2ZXIgdG8gcmV0cmFuc21pdCBsb3N0IHBhY2tldHMuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OnRscy1pbnRlcmFjdGlvbjwvTkFNRT4KKzxUWVBFPkdUbHNJbnRlcmFjdGlvbio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UTFMgaW50ZXJhY3Rpb248L05JQ0s+Cis8QkxVUkI+QSBHVGxzSW50ZXJhY3Rpb24gb2JqZWN0IHRvIHByb210IHRoZSB1c2VyIGZvciBwYXNzd29yZCBvciBjZXJ0aWZpY2F0ZS48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjpudHAtdGltZS1zb3VyY2U8L05BTUU+Cis8VFlQRT5Hc3RSVFNQU3JjTnRwVGltZVNvdXJjZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk5UUCBUaW1lIFNvdXJjZTwvTklDSz4KKzxCTFVSQj5OVFAgdGltZSBzb3VyY2UgZm9yIFJUQ1AgcGFja2V0cy48L0JMVVJCPgorPERFRkFVTFQ+TlRQIHRpbWUgYmFzZWQgb24gcmVhbHRpbWUgY2xvY2s8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OnVzZXItYWdlbnQ8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Vc2VyIEFnZW50PC9OSUNLPgorPEJMVVJCPlRoZSBVc2VyLUFnZW50IHN0cmluZyB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuPC9CTFVSQj4KKzxERUZBVUxUPiJHU3RyZWFtZXIvMS4xMy4wLjEiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjptYXgtcnRjcC1ydHAtdGltZS1kaWZmPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSBHX01BWFVMT05HPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXggUlRDUCBSVFAgVGltZSBEaWZmPC9OSUNLPgorPEJMVVJCPk1heGltdW0gYW1vdW50IG9mIHRpbWUgaW4gbXMgdGhhdCB0aGUgUlRQIHRpbWUgaW4gUlRDUCBTUnMgaXMgYWxsb3dlZCB0byBiZSBhaGVhZCAoLTEgZGlzYWJsZWQpLjwvQkxVUkI+Cis8REVGQVVMVD4xMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjpyZmM3MjczLXN5bmM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlN5bmMgb24gUkZDNzI3MyBjbG9jazwvTklDSz4KKzxCTFVSQj5TeW5jaHJvbml6ZSByZWNlaXZlZCBzdHJlYW1zIHRvIHRoZSBSRkM3MjczIGNsb2NrIChyZXF1aXJlcyBjbG9jayBhbmQgb2Zmc2V0IHRvIGJlIHByb3ZpZGVkKS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OmRlZmF1bHQtcnRzcC12ZXJzaW9uPC9OQU1FPgorPFRZUEU+R3N0UlRTUFZlcnNpb248L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UaGUgUlRTUCB2ZXJzaW9uIHRvIHRyeSBmaXJzdDwvTklDSz4KKzxCTFVSQj5UaGUgUlRTUCB2ZXJzaW9uIHRoYXQgc2hvdWxkIGJlIHRyaWVkIGZpcnN0IHdoZW4gbmVnb3RpYXRpbmcgdmVyc2lvbi48L0JMVVJCPgorPERFRkFVTFQ+R1NUX1JUU1BfVkVSU0lPTl8xXzA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6Om1heC10cy1vZmZzZXQ8L05BTUU+Cis8VFlQRT5naW50NjQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4IFRTIE9mZnNldDwvTklDSz4KKzxCTFVSQj5UaGUgbWF4aW11bSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgdGltZSBvZmZzZXQgaW4gKG5hbm9zZWNvbmRzKS4gTm90ZSwgaWYgdGhlIG50cC1zeW5jIHBhcmFtZXRlciBpcyBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgaXMgY2hhbmdlZCB0byAwIChubyBsaW1pdCkuPC9CTFVSQj4KKzxERUZBVUxUPjMwMDAwMDAwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6Om1heC10cy1vZmZzZXQtYWRqdXN0bWVudDwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXggVGltZXN0YW1wIE9mZnNldCBBZGp1c3RtZW50PC9OSUNLPgorPEJMVVJCPlRoZSBtYXhpbXVtIG51bWJlciBvZiBuYW5vc2Vjb25kcyBwZXIgZnJhbWUgdGhhdCB0aW1lIHN0YW1wIG9mZnNldHMgbWF5IGJlIGFkanVzdGVkICgwID0gbm8gbGltaXQpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFBEZWM6OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkJ1ZmZlciBsYXRlbmN5IGluIG1zPC9OSUNLPgorPEJMVVJCPkFtb3VudCBvZiBtcyB0byBidWZmZXIuPC9CTFVSQj4KKzxERUZBVUxUPjIwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TGV2ZWw6OmludGVydmFsPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT4+PSAxPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5JbnRlcnZhbDwvTklDSz4KKzxCTFVSQj5JbnRlcnZhbCBvZiB0aW1lIGJldHdlZW4gbWVzc2FnZSBwb3N0cyAoaW4gbmFub3NlY29uZHMpLjwvQkxVUkI+Cis8REVGQVVMVD4xMDAwMDAwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdExldmVsOjptZXNzYWdlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5tZXNzYWdlPC9OSUNLPgorPEJMVVJCPlBvc3QgYSAnbGV2ZWwnIG1lc3NhZ2UgZm9yIGVhY2ggcGFzc2VkIGludGVydmFsIChkZXByZWNhdGVkLCB1c2UgdGhlIHBvc3QtbWVzc2FnZXMgcHJvcGVydHkgaW5zdGVhZCkuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdExldmVsOjpwZWFrLWZhbGxvZmY8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBlYWsgRmFsbG9mZjwvTklDSz4KKzxCTFVSQj5EZWNheSByYXRlIG9mIGRlY2F5IHBlYWsgYWZ0ZXIgVFRMIChpbiBkQi9zZWMpLjwvQkxVUkI+Cis8REVGQVVMVD4xMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TGV2ZWw6OnBlYWstdHRsPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBlYWsgVFRMPC9OSUNLPgorPEJMVVJCPlRpbWUgVG8gTGl2ZSBvZiBkZWNheSBwZWFrIGJlZm9yZSBpdCBmYWxscyBiYWNrIChpbiBuYW5vc2Vjb25kcykuPC9CTFVSQj4KKzxERUZBVUxUPjMwMDAwMDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TGV2ZWw6OnBvc3QtbWVzc2FnZXM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBvc3QgTWVzc2FnZXM8L05JQ0s+Cis8QkxVUkI+V2hldGhlciB0byBwb3N0IGEgJ2xldmVsJyBlbGVtZW50IG1lc3NhZ2Ugb24gdGhlIGJ1cyBmb3IgZWFjaCBwYXNzZWQgaW50ZXJ2YWwuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdERpY2VUVjo6c3F1YXJlLWJpdHM8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TcXVhcmUgQml0czwvTklDSz4KKzxCTFVSQj5UaGUgc2l6ZSBvZiB0aGUgU3F1YXJlcy48L0JMVVJCPgorPERFRkFVTFQ+NDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VmVydGlnb1RWOjpzcGVlZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMC4wMSwxMDBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TcGVlZDwvTklDSz4KKzxCTFVSQj5Db250cm9sIHRoZSBzcGVlZCBvZiBtb3ZlbWVudC48L0JMVVJCPgorPERFRkFVTFQ+MC4wMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VmVydGlnb1RWOjp6b29tLXNwZWVkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLjAxLDEuMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlpvb20gU3BlZWQ8L05JQ0s+Cis8QkxVUkI+Q29udHJvbCB0aGUgcmF0ZSBvZiB6b29taW5nLjwvQkxVUkI+Cis8REVGQVVMVD4xLjAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSZXZUVjo6ZGVsYXk8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRlbGF5PC9OSUNLPgorPEJMVVJCPkRlbGF5IGluIGZyYW1lcyBiZXR3ZWVuIHVwZGF0ZXMuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJldlRWOjpnYWluPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSwyMDBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5HYWluPC9OSUNLPgorPEJMVVJCPkNvbnRyb2wgZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+NTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJldlRWOjpsaW5lc3BhY2U8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkxpbmVzcGFjZTwvTklDSz4KKzxCTFVSQj5Db250cm9sIGxpbmUgc3BhY2luZy48L0JMVVJCPgorPERFRkFVTFQ+NjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UXVhcmtUVjo6cGxhbmVzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSw2NF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBsYW5lczwvTklDSz4KKzxCTFVSQj5OdW1iZXIgb2YgcGxhbmVzLjwvQkxVUkI+Cis8REVGQVVMVD4xNjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QWxwaGE6OmFscGhhPC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QWxwaGE8L05JQ0s+Cis8QkxVUkI+VGhlIHZhbHVlIGZvciB0aGUgYWxwaGEgY2hhbm5lbC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QWxwaGE6OmFuZ2xlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDkwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QW5nbGU8L05JQ0s+Cis8QkxVUkI+U2l6ZSBvZiB0aGUgY29sb3JjdWJlIHRvIGNoYW5nZS48L0JMVVJCPgorPERFRkFVTFQ+MjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEFscGhhOjptZXRob2Q8L05BTUU+Cis8VFlQRT5Hc3RBbHBoYU1ldGhvZDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1ldGhvZDwvTklDSz4KKzxCTFVSQj5Ib3cgdGhlIGFscGhhIGNoYW5uZWxzIHNob3VsZCBiZSBjcmVhdGVkLjwvQkxVUkI+Cis8REVGQVVMVD5TZXQvYWRqdXN0IGFscGhhIGNoYW5uZWw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEFscGhhOjpub2lzZS1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw2NF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk5vaXNlIExldmVsPC9OSUNLPgorPEJMVVJCPlNpemUgb2Ygbm9pc2UgcmFkaXVzLjwvQkxVUkI+Cis8REVGQVVMVD4yPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBbHBoYTo6dGFyZ2V0LWI8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSAyNTU8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRhcmdldCBCbHVlPC9OSUNLPgorPEJMVVJCPlRoZSBibHVlIGNvbG9yIHZhbHVlIGZvciBjdXN0b20gUkdCIGNocm9tYSBrZXlpbmcuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEFscGhhOjp0YXJnZXQtZzwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDI1NTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VGFyZ2V0IEdyZWVuPC9OSUNLPgorPEJMVVJCPlRoZSBncmVlbiBjb2xvciB2YWx1ZSBmb3IgY3VzdG9tIFJHQiBjaHJvbWEga2V5aW5nLjwvQkxVUkI+Cis8REVGQVVMVD4yNTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEFscGhhOjp0YXJnZXQtcjwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDI1NTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VGFyZ2V0IFJlZDwvTklDSz4KKzxCTFVSQj5UaGUgcmVkIGNvbG9yIHZhbHVlIGZvciBjdXN0b20gUkdCIGNocm9tYSBrZXlpbmcuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEFscGhhOjpibGFjay1zZW5zaXRpdml0eTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDEyODwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QmxhY2sgU2Vuc2l0aXZpdHk8L05JQ0s+Cis8QkxVUkI+U2Vuc2l0aXZpdHkgdG8gZGFyayBjb2xvcnMuPC9CTFVSQj4KKzxERUZBVUxUPjEwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QWxwaGE6OndoaXRlLXNlbnNpdGl2aXR5PC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMTI4PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5XaGl0ZSBTZW5zaXRpdml0eTwvTklDSz4KKzxCTFVSQj5TZW5zaXRpdml0eSB0byBicmlnaHQgY29sb3JzLjwvQkxVUkI+Cis8REVGQVVMVD4xMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEFscGhhOjpwcmVmZXItcGFzc3Rocm91Z2g8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlByZWZlciBQYXNzdGhyb3VnaDwvTklDSz4KKzxCTFVSQj5Eb24ndCBkbyBhbnkgcHJvY2Vzc2luZyBmb3IgYWxwaGE9MS4wIGlmIHBvc3NpYmxlLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U2hvdXQyc2VuZDo6ZGVzY3JpcHRpb248L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5kZXNjcmlwdGlvbjwvTklDSz4KKzxCTFVSQj5kZXNjcmlwdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+IiI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNob3V0MnNlbmQ6OmdlbnJlPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Z2VucmU8L05JQ0s+Cis8QkxVUkI+Z2VucmUuPC9CTFVSQj4KKzxERUZBVUxUPiIiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTaG91dDJzZW5kOjppcDwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPmlwPC9OSUNLPgorPEJMVVJCPklQIGFkZHJlc3Mgb3IgaG9zdG5hbWUuPC9CTFVSQj4KKzxERUZBVUxUPiIxMjcuMC4wLjEiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTaG91dDJzZW5kOjptb3VudDwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPm1vdW50PC9OSUNLPgorPEJMVVJCPm1vdW50LjwvQkxVUkI+Cis8REVGQVVMVD4iIjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U2hvdXQyc2VuZDo6cGFzc3dvcmQ8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5wYXNzd29yZDwvTklDSz4KKzxCTFVSQj5wYXNzd29yZC48L0JMVVJCPgorPERFRkFVTFQ+ImhhY2ttZSI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNob3V0MnNlbmQ6OnBvcnQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDY1NTM1XTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+cG9ydDwvTklDSz4KKzxCTFVSQj5wb3J0LjwvQkxVUkI+Cis8REVGQVVMVD44MDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTaG91dDJzZW5kOjpwcm90b2NvbDwvTkFNRT4KKzxUWVBFPkdzdFNob3V0MlNlbmRQcm90b2NvbDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPnByb3RvY29sPC9OSUNLPgorPEJMVVJCPkNvbm5lY3Rpb24gUHJvdG9jb2wgdG8gdXNlLjwvQkxVUkI+Cis8REVGQVVMVD5IdHRwIFByb3RvY29sIChpY2VjYXN0IDIueCk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNob3V0MnNlbmQ6OnN0cmVhbW5hbWU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5zdHJlYW1uYW1lPC9OSUNLPgorPEJMVVJCPm5hbWUgb2YgdGhlIHN0cmVhbS48L0JMVVJCPgorPERFRkFVTFQ+IiI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNob3V0MnNlbmQ6OnVybDwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPnVybDwvTklDSz4KKzxCTFVSQj50aGUgc3RyZWFtJ3MgaG9tZXBhZ2UgVVJMLjwvQkxVUkI+Cis8REVGQVVMVD4iIjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U2hvdXQyc2VuZDo6dXNlcm5hbWU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz51c2VybmFtZTwvTklDSz4KKzxCTFVSQj51c2VybmFtZS48L0JMVVJCPgorPERFRkFVTFQ+InNvdXJjZSI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNob3V0MnNlbmQ6OnB1YmxpYzwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+cHVibGljPC9OSUNLPgorPEJMVVJCPklmIHRoZSBzdHJlYW0gc2hvdWxkIGJlIGxpc3RlZCBvbiB0aGUgc2VydmVyJ3Mgc3RyZWFtIGRpcmVjdG9yeS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNob3V0MnNlbmQ6OnRpbWVvdXQ8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT4+PSAxPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz50aW1lb3V0PC9OSUNLPgorPEJMVVJCPk1heCBhbW91bnQgb2YgdGltZSB0byB3YWl0IGZvciBuZXR3b3JrIGFjdGl2aXR5LCBpbiBtaWxsaXNlY29uZHMuPC9CTFVSQj4KKzxERUZBVUxUPjEwMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTcGVleERlYzo6ZW5oPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Fbmg8L05JQ0s+Cis8QkxVUkI+RW5hYmxlIHBlcmNlcHR1YWwgZW5oYW5jZW1lbnQuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFBuZ0VuYzo6Y29tcHJlc3Npb24tbGV2ZWw8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSA5PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5jb21wcmVzc2lvbi1sZXZlbDwvTklDSz4KKzxCTFVSQj5QTkcgY29tcHJlc3Npb24gbGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjY8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFBuZ0VuYzo6c25hcHNob3Q8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNuYXBzaG90PC9OSUNLPgorPEJMVVJCPlNlbmQgRU9TIGFmdGVyIGVuY29kaW5nIGEgZnJhbWUsIHVzZWZ1bCBmb3Igc25hcHNob3RzLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0Q0FDQVNpbms6OmFudGktYWxpYXNpbmc8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkFudGkgQWxpYXNpbmc8L05JQ0s+Cis8QkxVUkI+RW5hYmxlcyBBbnRpLUFsaWFzaW5nLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RDQUNBU2luazo6ZGl0aGVyPC9OQU1FPgorPFRZUEU+R3N0Q0FDQVNpbmtEaXRoZXJpbmc8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EaXRoZXIgVHlwZTwvTklDSz4KKzxCTFVSQj5TZXQgdHlwZSBvZiBEaXRoZXIuPC9CTFVSQj4KKzxERUZBVUxUPk5vIGRpdGhlcmluZzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0Q0FDQVNpbms6OnNjcmVlbi1oZWlnaHQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+U2NyZWVuIEhlaWdodDwvTklDSz4KKzxCTFVSQj5UaGUgaGVpZ2h0IG9mIHRoZSBzY3JlZW4uPC9CTFVSQj4KKzxERUZBVUxUPjI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RDQUNBU2luazo6c2NyZWVuLXdpZHRoPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPlNjcmVlbiBXaWR0aDwvTklDSz4KKzxCTFVSQj5UaGUgd2lkdGggb2YgdGhlIHNjcmVlbi48L0JMVVJCPgorPERFRkFVTFQ+ODA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEpwZWdFbmM6OnF1YWxpdHk8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlF1YWxpdHk8L05JQ0s+Cis8QkxVUkI+UXVhbGl0eSBvZiBlbmNvZGluZy48L0JMVVJCPgorPERFRkFVTFQ+ODU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEpwZWdFbmM6OmlkY3QtbWV0aG9kPC9OQU1FPgorPFRZUEU+R3N0SURDVE1ldGhvZDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPklEQ1QgTWV0aG9kPC9OSUNLPgorPEJMVVJCPlRoZSBJRENUIGFsZ29yaXRobSB0byB1c2UuPC9CTFVSQj4KKzxERUZBVUxUPkZhc3RlciwgbGVzcyBhY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SnBlZ0VuYzo6c25hcHNob3Q8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNuYXBzaG90PC9OSUNLPgorPEJMVVJCPlNlbmQgRU9TIGFmdGVyIGVuY29kaW5nIGEgZnJhbWUsIHVzZWZ1bCBmb3Igc25hcHNob3RzLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0RFZEZWM6OmNsYW1wLWNocm9tYTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q2xhbXAgY2hyb21hPC9OSUNLPgorPEJMVVJCPkNsYW1wIGNocm9tYS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdERWRGVjOjpjbGFtcC1sdW1hPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5DbGFtcCBsdW1hPC9OSUNLPgorPEJMVVJCPkNsYW1wIGx1bWEuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3REVkRlYzo6ZHJvcC1mYWN0b3I8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDE8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRyb3AgRmFjdG9yPC9OSUNLPgorPEJMVVJCPk9ubHkgZGVjb2RlIE50aCBmcmFtZS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0RFZEZWM6OnF1YWxpdHk8L05BTUU+Cis8VFlQRT5Hc3REVkRlY1F1YWxpdHlFbnVtPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UXVhbGl0eTwvTklDSz4KKzxCTFVSQj5EZWNvZGluZyBxdWFsaXR5LjwvQkxVUkI+Cis8REVGQVVMVD5IaWdoZXN0IHF1YWxpdHkgY29sb3VyIGRlY29kaW5nPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBQVNpbms6OmJyaWdodG5lc3M8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+YnJpZ2h0bmVzczwvTklDSz4KKzxCTFVSQj5icmlnaHRuZXNzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBQVNpbms6OmNvbnRyYXN0PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPmNvbnRyYXN0PC9OSUNLPgorPEJMVVJCPmNvbnRyYXN0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBQVNpbms6OmRpdGhlcjwvTkFNRT4KKzxUWVBFPkdzdEFBU2lua0RpdGhlcmVyczwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPmRpdGhlcjwvTklDSz4KKzxCTFVSQj5kaXRoZXIuPC9CTFVSQj4KKzxERUZBVUxUPm5vIGRpdGhlcmluZzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QUFTaW5rOjpkcml2ZXI8L05BTUU+Cis8VFlQRT5Hc3RBQVNpbmtEcml2ZXJzPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+ZHJpdmVyPC9OSUNLPgorPEJMVVJCPmRyaXZlci48L0JMVVJCPgorPERFRkFVTFQ+WDExIGRyaXZlciAxLjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEFBU2luazo6ZnJhbWUtdGltZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPmZyYW1lIHRpbWU8L05JQ0s+Cis8QkxVUkI+ZnJhbWUgdGltZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QUFTaW5rOjpmcmFtZXMtZGlzcGxheWVkPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+ZnJhbWVzIGRpc3BsYXllZDwvTklDSz4KKzxCTFVSQj5mcmFtZXMgZGlzcGxheWVkLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBQVNpbms6OmdhbW1hPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5nYW1tYTwvTklDSz4KKzxCTFVSQj5nYW1tYS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QUFTaW5rOjpoZWlnaHQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+aGVpZ2h0PC9OSUNLPgorPEJMVVJCPmhlaWdodC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QUFTaW5rOjppbnZlcnNpb248L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPmludmVyc2lvbjwvTklDSz4KKzxCTFVSQj5pbnZlcnNpb24uPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEFBU2luazo6cmFuZG9tdmFsPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPnJhbmRvbXZhbDwvTklDSz4KKzxCTFVSQj5yYW5kb212YWwuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEFBU2luazo6d2lkdGg8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+d2lkdGg8L05JQ0s+Cis8QkxVUkI+d2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNwZWV4RW5jOjphYnI8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BQlI8L05JQ0s+Cis8QkxVUkI+RW5hYmxlIGF2ZXJhZ2UgYml0LXJhdGUgKDAgPSBkaXNhYmxlZCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNwZWV4RW5jOjpiaXRyYXRlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RW5jb2RpbmcgQml0LXJhdGU8L05JQ0s+Cis8QkxVUkI+U3BlY2lmeSBhbiBlbmNvZGluZyBiaXQtcmF0ZSAoaW4gYnBzKS4gKDAgPSBhdXRvbWF0aWMpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTcGVleEVuYzo6Y29tcGxleGl0eTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkNvbXBsZXhpdHk8L05JQ0s+Cis8QkxVUkI+U2V0IGVuY29kaW5nIGNvbXBsZXhpdHkuPC9CTFVSQj4KKzxERUZBVUxUPjM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNwZWV4RW5jOjpkdHg8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EVFg8L05JQ0s+Cis8QkxVUkI+RW5hYmxlIGRpc2NvbnRpbnVvdXMgdHJhbnNtaXNzaW9uLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BlZXhFbmM6Omxhc3QtbWVzc2FnZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGFzdC1tZXNzYWdlPC9OSUNLPgorPEJMVVJCPlRoZSBsYXN0IHN0YXR1cyBtZXNzYWdlLjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTcGVleEVuYzo6bmZyYW1lczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk5GcmFtZXM8L05JQ0s+Cis8QkxVUkI+TnVtYmVyIG9mIGZyYW1lcyBwZXIgYnVmZmVyLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTcGVleEVuYzo6cXVhbGl0eTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5RdWFsaXR5PC9OSUNLPgorPEJMVVJCPkVuY29kaW5nIHF1YWxpdHkuPC9CTFVSQj4KKzxERUZBVUxUPjg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNwZWV4RW5jOjp2YWQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WQUQ8L05JQ0s+Cis8QkxVUkI+RW5hYmxlIHZvaWNlIGFjdGl2aXR5IGRldGVjdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNwZWV4RW5jOjp2YnI8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WQlI8L05JQ0s+Cis8QkxVUkI+RW5hYmxlIHZhcmlhYmxlIGJpdC1yYXRlLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BlZXhFbmM6Om1vZGU8L05BTUU+Cis8VFlQRT5Hc3RTcGVleEVuY01vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kZTwvTklDSz4KKzxCTFVSQj5UaGUgZW5jb2RpbmcgbW9kZS48L0JMVVJCPgorPERFRkFVTFQ+QXV0bzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0RFYxMzk0U3JjOjpjaGFubmVsPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw2NF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNoYW5uZWw8L05JQ0s+Cis8QkxVUkI+Q2hhbm5lbCBudW1iZXIgZm9yIGxpc3RlbmluZy48L0JMVVJCPgorPERFRkFVTFQ+NjM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdERWMTM5NFNyYzo6Y29uc2VjdXRpdmU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDE8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPmNvbnNlY3V0aXZlIGZyYW1lczwvTklDSz4KKzxCTFVSQj5zZW5kIG4gY29uc2VjdXRpdmUgZnJhbWVzIGFmdGVyIHNraXBwaW5nLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3REVjEzOTRTcmM6OmRyb3AtaW5jb21wbGV0ZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+ZHJvcCBpbmNvbXBsZXRlPC9OSUNLPgorPEJMVVJCPmRyb3AgaW5jb21wbGV0ZSBmcmFtZXMuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdERWMTM5NFNyYzo6Z3VpZDwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5HVUlEPC9OSUNLPgorPEJMVVJCPnNlbGVjdCBvbmUgb2YgbXVsdGlwbGUgRFYgZGV2aWNlcyBieSBpdHMgR1VJRC4gdXNlIGEgaGV4YWRlY2ltYWwgbGlrZSAweGhoaGhoaGhoaGhoaGhoaGguICgwID0gbm8gZ3VpZCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdERWMTM5NFNyYzo6cG9ydDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+W0dfTUFYVUxPTkcsMTZdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qb3J0PC9OSUNLPgorPEJMVVJCPlBvcnQgbnVtYmVyICgtMSBhdXRvbWF0aWMpLjwvQkxVUkI+Cis8REVGQVVMVD4tMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0RFYxMzk0U3JjOjpza2lwPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5za2lwIGZyYW1lczwvTklDSz4KKzxCTFVSQj5za2lwIG4gZnJhbWVzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3REVjEzOTRTcmM6OnVzZS1hdmM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlVzZSBBVi9DPC9OSUNLPgorPEJMVVJCPlVzZSBBVi9DIFZUUiBjb250cm9sLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3REVjEzOTRTcmM6OmRldmljZS1uYW1lPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5kZXZpY2UgbmFtZTwvTklDSz4KKzxCTFVSQj51c2VyLWZyaWVuZGx5IG5hbWUgb2YgdGhlIGRldmljZS48L0JMVVJCPgorPERFRkFVTFQ+IkRlZmF1bHQiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RGbGFjRW5jOjpibG9ja3NpemU8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT5bMTYsNjU1MzVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmxvY2tzaXplPC9OSUNLPgorPEJMVVJCPkJsb2Nrc2l6ZSBpbiBzYW1wbGVzLjwvQkxVUkI+Cis8REVGQVVMVD40NjA4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RGbGFjRW5jOjplc2NhcGUtY29kaW5nPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RG8gRXNjYXBlIGNvZGluZzwvTklDSz4KKzxCTFVSQj5zZWFyY2ggZm9yIGVzY2FwZSBjb2RlcyBpbiB0aGUgZW50cm9weSBjb2Rpbmcgc3RhZ2UgZm9yIHNsaWdodGx5IGJldHRlciBjb21wcmVzc2lvbi48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEZsYWNFbmM6OmV4aGF1c3RpdmUtbW9kZWwtc2VhcmNoPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RG8gZXhoYXVzdGl2ZSBtb2RlbCBzZWFyY2g8L05JQ0s+Cis8QkxVUkI+ZG8gZXhoYXVzdGl2ZSBzZWFyY2ggb2YgTFAgY29lZmZpY2llbnQgcXVhbnRpemF0aW9uIChleHBlbnNpdmUhKS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEZsYWNFbmM6Omxvb3NlLW1pZC1zaWRlLXN0ZXJlbzwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxvb3NlIG1pZCBzaWRlIHN0ZXJlbzwvTklDSz4KKzxCTFVSQj5Mb29zZSBtaWQgc2lkZSBzdGVyZW8uPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RGbGFjRW5jOjptYXgtbHBjLW9yZGVyPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMzI8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5NYXggTFBDIG9yZGVyPC9OSUNLPgorPEJMVVJCPk1heCBMUEMgb3JkZXI7IDAgPT4gdXNlIG9ubHkgZml4ZWQgcHJlZGljdG9ycy48L0JMVVJCPgorPERFRkFVTFQ+ODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0RmxhY0VuYzo6bWF4LXJlc2lkdWFsLXBhcnRpdGlvbi1vcmRlcjwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDE2PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TWF4IHJlc2lkdWFsIHBhcnRpdGlvbiBvcmRlcjwvTklDSz4KKzxCTFVSQj5NYXggcmVzaWR1YWwgcGFydGl0aW9uIG9yZGVyIChhYm92ZSA0IGRvZXNuJ3QgdXN1YWxseSBoZWxwIG11Y2gpLjwvQkxVUkI+Cis8REVGQVVMVD4zPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RGbGFjRW5jOjptaWQtc2lkZS1zdGVyZW88L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EbyBtaWQgc2lkZSBzdGVyZW88L05JQ0s+Cis8QkxVUkI+RG8gbWlkIHNpZGUgc3RlcmVvIChvbmx5IGZvciBzdGVyZW8gaW5wdXQpLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RGbGFjRW5jOjptaW4tcmVzaWR1YWwtcGFydGl0aW9uLW9yZGVyPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMTY8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5NaW4gcmVzaWR1YWwgcGFydGl0aW9uIG9yZGVyPC9OSUNLPgorPEJMVVJCPk1pbiByZXNpZHVhbCBwYXJ0aXRpb24gb3JkZXIgKGFib3ZlIDQgZG9lc24ndCB1c3VhbGx5IGhlbHAgbXVjaCkuPC9CTFVSQj4KKzxERUZBVUxUPjM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEZsYWNFbmM6OnFscC1jb2VmZi1wcmVjLXNlYXJjaDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRvIFFMUCBjb2VmZmljaWVudHMgcHJlY2lzaW9uIHNlYXJjaDwvTklDSz4KKzxCTFVSQj5mYWxzZSA9IHVzZSBxbHBfY29lZmZfcHJlY2lzaW9uLCB0cnVlID0gc2VhcmNoIGFyb3VuZCBxbHBfY29lZmZfcHJlY2lzaW9uLCB0YWtlIGJlc3QuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RGbGFjRW5jOjpxbHAtY29lZmYtcHJlY2lzaW9uPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMzI8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5RTFAgY29lZmZpY2llbnRzIHByZWNpc2lvbjwvTklDSz4KKzxCTFVSQj5QcmVjaXNpb24gaW4gYml0cyBvZiBxdWFudGl6ZWQgbGluZWFyLXByZWRpY3RvciBjb2VmZmljaWVudHM7IDAgPSBhdXRvbWF0aWMuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEZsYWNFbmM6OnF1YWxpdHk8L05BTUU+Cis8VFlQRT5Hc3RGbGFjRW5jUXVhbGl0eTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5RdWFsaXR5PC9OSUNLPgorPEJMVVJCPlNwZWVkIHZlcnN1cyBjb21wcmVzc2lvbiB0cmFkZW9mZi48L0JMVVJCPgorPERFRkFVTFQ+NSAtIERlZmF1bHQ8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEZsYWNFbmM6OnJpY2UtcGFyYW1ldGVyLXNlYXJjaC1kaXN0PC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMTU8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5yaWNlX3BhcmFtZXRlcl9zZWFyY2hfZGlzdDwvTklDSz4KKzxCTFVSQj4wID0gdHJ5IG9ubHkgY2FsYydkIHBhcmFtZXRlciBrOyBlbHNlIHRyeSBhbGwgW2stZGlzdC4uaytkaXN0XSBwYXJhbWV0ZXJzLCB1c2UgYmVzdC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0RmxhY0VuYzo6c3RyZWFtYWJsZS1zdWJzZXQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TdHJlYW1hYmxlIHN1YnNldDwvTklDSz4KKzxCTFVSQj50cnVlIHRvIGxpbWl0IGVuY29kZXIgdG8gZ2VuZXJhdGluZyBhIFN1YnNldCBzdHJlYW0sIGVsc2UgZmFsc2UuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEZsYWNFbmM6OnBhZGRpbmc8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5QYWRkaW5nPC9OSUNLPgorPEJMVVJCPldyaXRlIGEgUEFERElORyBibG9jayB3aXRoIHRoaXMgbGVuZ3RoIGluIGJ5dGVzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RGbGFjRW5jOjpzZWVrcG9pbnRzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAtMjE0NzQ4MzY0NzwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNlZWtwb2ludHM8L05JQ0s+Cis8QkxVUkI+QWRkIFNFRUtUQUJMRSBtZXRhZGF0YSAoaWYgPiAwLCBudW1iZXIgb2YgZW50cmllcywgaWYgPCAwLCBpbnRlcnZhbCBpbiBzZWMpLjwvQkxVUkI+Cis8REVGQVVMVD4tMTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE9zc1Npbms6OmRldmljZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRldmljZTwvTklDSz4KKzxCTFVSQj5PU1MgZGV2aWNlICh1c3VhbGx5IC9kZXYvZHNwTikuPC9CTFVSQj4KKzxERUZBVUxUPiIvZGV2L2RzcCI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1hdHJvc2thTXV4Ojp3cml0aW5nLWFwcDwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPldyaXRpbmcgYXBwbGljYXRpb24uPC9OSUNLPgorPEJMVVJCPlRoZSBuYW1lIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGNyZWF0ZXMgdGhlIG1hdHJvc2thIGZpbGUuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1hdHJvc2thTXV4Ojp2ZXJzaW9uPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSwyXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RG9jVHlwZSB2ZXJzaW9uPC9OSUNLPgorPEJMVVJCPlRoaXMgcGFyYW1ldGVyIGRldGVybWluZXMgd2hhdCBNYXRyb3NrYSBmZWF0dXJlcyBjYW4gYmUgdXNlZC48L0JMVVJCPgorPERFRkFVTFQ+MjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TWF0cm9za2FNdXg6Om1pbi1pbmRleC1pbnRlcnZhbDwvTkFNRT4KKzxUWVBFPmdpbnQ2NDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NaW5pbXVtIHRpbWUgYmV0d2VlbiBpbmRleCBlbnRyaWVzPC9OSUNLPgorPEJMVVJCPkFuIGluZGV4IGVudHJ5IGlzIGNyZWF0ZWQgZXZlcnkgc28gbWFueSBuYW5vc2Vjb25kcy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TWF0cm9za2FNdXg6OnN0cmVhbWFibGU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRldGVybWluZXMgd2hldGhlciBvdXRwdXQgc2hvdWxkIGJlIHN0cmVhbWFibGU8L05JQ0s+Cis8QkxVUkI+SWYgc2V0IHRvIHRydWUsIHRoZSBvdXRwdXQgc2hvdWxkIGJlIGFzIGlmIGl0IGlzIHRvIGJlIHN0cmVhbWVkIGFuZCBoZW5jZSBubyBpbmRleGVzIHdyaXR0ZW4gb3IgZHVyYXRpb24gd3JpdHRlbi48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1hdHJvc2thTXV4Ojp0aW1lY29kZXNjYWxlPC9OQU1FPgorPFRZUEU+Z2ludDY0PC9UWVBFPgorPFJBTkdFPlsxLDEwMDAwMDAwMDBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UaW1lY29kZSBTY2FsZTwvTklDSz4KKzxCTFVSQj5UaW1lY29kZVNjYWxlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBSYXcgVGltZWNvZGUgb2YgYSBCbG9jay48L0JMVVJCPgorPERFRkFVTFQ+MTAwMDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TWF0cm9za2FNdXg6Om1heC1jbHVzdGVyLWR1cmF0aW9uPC9OQU1FPgorPFRZUEU+Z2ludDY0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heGltdW0gY2x1c3RlciBkdXJhdGlvbjwvTklDSz4KKzxCTFVSQj5BIG5ldyBjbHVzdGVyIHdpbGwgYmUgY3JlYXRlZCBpZiBpdHMgZHVyYXRpb24gZXhjZWVkcyB0aGlzIHZhbHVlLiAwIG1lYW5zIG5vIG1heGltdW0gZHVyYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjY1NTM1MDAwMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNYXRyb3NrYU11eDo6bWluLWNsdXN0ZXItZHVyYXRpb248L05BTUU+Cis8VFlQRT5naW50NjQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWluaW11bSBjbHVzdGVyIGR1cmF0aW9uPC9OSUNLPgorPEJMVVJCPkRlc2lkZXJlZCBjbHVzdGVyIGR1cmF0aW9uIGFzIG5hbm9zZWNvbmRzLiBBIG5ldyBjbHVzdGVyIHdpbGwgYmUgY3JlYXRlZCBpcnJlc3BlY3RpdmUgb2YgdGhpcyBwcm9wZXJ0eSBpZiBhIGZvcmNlIGtleSB1bml0IGV2ZW50IGlzIHJlY2VpdmVkLiAwIG1lYW5zIGNyZWF0ZSBhIG5ldyBjbHVzdGVyIGZvciBlYWNoIHZpZGVvIGtleWZyYW1lIG9yIGZvciBlYWNoIGF1ZGlvIGJ1ZmZlciBpbiBhdWRpbyBvbmx5IHN0cmVhbXMuPC9CTFVSQj4KKzxERUZBVUxUPjUwMDAwMDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VGVzdDo6YWxsb3dlZC10aW1lc3RhbXAtZGV2aWF0aW9uPC9OQU1FPgorPFRZUEU+Z2ludDY0PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5hbGxvd2VkIHRpbWVzdGFtcCBkZXZpYXRpb248L05JQ0s+Cis8QkxVUkI+YWxsb3dlZCBhdmVyYWdlIGRpZmZlcmVuY2UgaW4gdXNlYyBiZXR3ZWVuIHRpbWVzdGFtcCBvZiBuZXh0IGJ1ZmZlciBhbmQgZXhwZWN0ZWQgdGltZXN0YW1wIGZyb20gYW5hbHl6aW5nIGxhc3QgYnVmZmVyLjwvQkxVUkI+Cis8REVGQVVMVD4tMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VGVzdDo6YnVmZmVyLWNvdW50PC9OQU1FPgorPFRZUEU+Z2ludDY0PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+YnVmZmVyIGNvdW50PC9OSUNLPgorPEJMVVJCPm51bWJlciBvZiBidWZmZXJzIGluIHN0cmVhbS48L0JMVVJCPgorPERFRkFVTFQ+LTE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFRlc3Q6OmV4cGVjdGVkLWJ1ZmZlci1jb3VudDwvTkFNRT4KKzxUWVBFPmdpbnQ2NDwvVFlQRT4KKzxSQU5HRT4+PSBHX01BWFVMT05HPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZXhwZWN0ZWQgYnVmZmVyIGNvdW50PC9OSUNLPgorPEJMVVJCPmV4cGVjdGVkIG51bWJlciBvZiBidWZmZXJzIGluIHN0cmVhbS48L0JMVVJCPgorPERFRkFVTFQ+LTE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFRlc3Q6OmV4cGVjdGVkLWxlbmd0aDwvTkFNRT4KKzxUWVBFPmdpbnQ2NDwvVFlQRT4KKzxSQU5HRT4+PSBHX01BWFVMT05HPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZXhwZWN0ZWQgbGVuZ3RoPC9OSUNLPgorPEJMVVJCPmV4cGVjdGVkIGxlbmd0aCBvZiBzdHJlYW0uPC9CTFVSQj4KKzxERUZBVUxUPi0xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RUZXN0OjpleHBlY3RlZC1tZDU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZXhwZWN0ZWQgbWQ1PC9OSUNLPgorPEJMVVJCPmV4cGVjdGVkIG1kNSBvZiBwcm9jZXNzaW5nIHRoZSB3aG9sZSBkYXRhLjwvQkxVUkI+Cis8REVGQVVMVD4iLS0tIjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VGVzdDo6bGVuZ3RoPC9OQU1FPgorPFRZUEU+Z2ludDY0PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGVuZ3RoPC9OSUNLPgorPEJMVVJCPmxlbmd0aCBvZiBzdHJlYW0uPC9CTFVSQj4KKzxERUZBVUxUPi0xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RUZXN0OjptZDU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPm1kNTwvTklDSz4KKzxCTFVSQj5tZDUgb2YgcHJvY2Vzc2luZyB0aGUgd2hvbGUgZGF0YS48L0JMVVJCPgorPERFRkFVTFQ+Ii0tLSI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFRlc3Q6OnRpbWVzdGFtcC1kZXZpYXRpb248L05BTUU+Cis8VFlQRT5naW50NjQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz50aW1lc3RhbXAgZGV2aWF0aW9uPC9OSUNLPgorPEJMVVJCPmF2ZXJhZ2UgZGlmZmVyZW5jZSBpbiB1c2VjIGJldHdlZW4gdGltZXN0YW1wIG9mIG5leHQgYnVmZmVyIGFuZCBleHBlY3RlZCB0aW1lc3RhbXAgZnJvbSBhbmFseXppbmcgbGFzdCBidWZmZXIuPC9CTFVSQj4KKzxERUZBVUxUPi0xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RQcm9ncmVzc1JlcG9ydDo6c2lsZW50PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EbyBub3QgcHJpbnQgb3V0cHV0IHRvIHN0ZG91dDwvTklDSz4KKzxCTFVSQj5EbyBub3QgcHJpbnQgb3V0cHV0IHRvIHN0ZG91dC48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFByb2dyZXNzUmVwb3J0Ojp1cGRhdGUtZnJlcTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VXBkYXRlIEZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5OdW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIHJlcG9ydHMgd2hlbiBkYXRhIGlzIGZsb3dpbmcuPC9CTFVSQj4KKzxERUZBVUxUPjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFByb2dyZXNzUmVwb3J0Ojpmb3JtYXQ8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5mb3JtYXQ8L05JQ0s+Cis8QkxVUkI+Rm9ybWF0IHRvIHVzZSBmb3IgdGhlIHF1ZXJ5aW5nLjwvQkxVUkI+Cis8REVGQVVMVD4iYXV0byI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFByb2dyZXNzUmVwb3J0Ojpkby1xdWVyeTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VXNlIGEgcXVlcnkgaW5zdGVhZCBvZiBidWZmZXIgbWV0YWRhdGEgdG8gZGV0ZXJtaW5lIHN0cmVhbSBwb3NpdGlvbjwvTklDSz4KKzxCTFVSQj5Vc2UgYSBxdWVyeSBpbnN0ZWFkIG9mIGJ1ZmZlciBtZXRhZGF0YSB0byBkZXRlcm1pbmUgc3RyZWFtIHBvc2l0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3ROYXZTZWVrOjpzZWVrLW9mZnNldDwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U2VlayBPZmZzZXQ8L05JQ0s+Cis8QkxVUkI+VGltZSBpbiBzZWNvbmRzIHRvIHNlZWsgYnkuPC9CTFVSQj4KKzxERUZBVUxUPjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEJyZWFrTXlEYXRhOjpwcm9iYWJpbGl0eTwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wcm9iYWJpbGl0eTwvTklDSz4KKzxCTFVSQj5wcm9iYWJpbGl0eSBmb3IgZWFjaCBieXRlIGluIHRoZSBidWZmZXIgdG8gYmUgY2hhbmdlZC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QnJlYWtNeURhdGE6OnNlZWQ8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5zZWVkPC9OSUNLPgorPEJMVVJCPnNlZWQgZm9yIHJhbmRvbW5lc3MgKGluaXRpYWxpemVkIHdoZW4gZ29pbmcgZnJvbSBSRUFEWSB0byBQQVVTRUQpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RCcmVha015RGF0YTo6c2V0LXRvPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bR19NQVhVTE9ORywyNTVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+c2V0LXRvPC9OSUNLPgorPEJMVVJCPnNldCBjaGFuZ2VkIGJ5dGVzIHRvIHRoaXMgdmFsdWUgKC0xIG1lYW5zIHJhbmRvbSB2YWx1ZS48L0JMVVJCPgorPERFRkFVTFQ+LTE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEJyZWFrTXlEYXRhOjpza2lwPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+c2tpcDwvTklDSz4KKzxCTFVSQj5hbW91bnQgb2YgYnl0ZXMgc2tpcHBlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHN0cmVhbS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0Q3V0dGVyOjpsZWFreTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TGVha3k8L05JQ0s+Cis8QkxVUkI+ZG8gd2UgbGVhayBidWZmZXJzIHdoZW4gYmVsb3cgdGhyZXNob2xkID8uPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RDdXR0ZXI6OnByZS1sZW5ndGg8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UHJlLXJlY29yZGluZyBidWZmZXIgbGVuZ3RoPC9OSUNLPgorPEJMVVJCPkxlbmd0aCBvZiBwcmUtcmVjb3JkaW5nIGJ1ZmZlciAoaW4gbmFub3NlY29uZHMpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RDdXR0ZXI6OnJ1bi1sZW5ndGg8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UnVuIGxlbmd0aDwvTklDSz4KKzxCTFVSQj5MZW5ndGggb2YgZHJvcCBiZWxvdyB0aHJlc2hvbGQgYmVmb3JlIGN1dF9zdG9wIChpbiBuYW5vc2Vjb25kcykuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEN1dHRlcjo6dGhyZXNob2xkPC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRocmVzaG9sZDwvTklDSz4KKzxCTFVSQj5Wb2x1bWUgdGhyZXNob2xkIGJlZm9yZSB0cmlnZ2VyLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RDdXR0ZXI6OnRocmVzaG9sZC1kQjwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UaHJlc2hvbGQgKGRCKTwvTklDSz4KKzxCTFVSQj5Wb2x1bWUgdGhyZXNob2xkIGJlZm9yZSB0cmlnZ2VyIChpbiBkQikuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZpZGVvRmxpcDo6bWV0aG9kPC9OQU1FPgorPFRZUEU+R3N0VmlkZW9GbGlwTWV0aG9kPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPm1ldGhvZDwvTklDSz4KKzxCTFVSQj5tZXRob2QgKGRlcHJlY2F0ZWQsIHVzZSB2aWRlby1kaXJlY3Rpb24gaW5zdGVhZCkuPC9CTFVSQj4KKzxERUZBVUxUPklkZW50aXR5IChubyByb3RhdGlvbik8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cE1QNFZQYXk6OmNvbmZpZy1pbnRlcnZhbDwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDM2MDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNvbmZpZyBTZW5kIEludGVydmFsPC9OSUNLPgorPEJMVVJCPlNlbmQgQ29uZmlnIEluc2VydGlvbiBJbnRlcnZhbCBpbiBzZWNvbmRzIChjb25maWd1cmF0aW9uIGhlYWRlcnMgd2lsbCBiZSBtdWx0aXBsZXhlZCBpbiB0aGUgZGF0YSBzdHJlYW0gd2hlbiBkZXRlY3RlZC4pICgwID0gZGlzYWJsZWQpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNdWx0aXBhcnRNdXg6OmJvdW5kYXJ5PC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Qm91bmRhcnk8L05JQ0s+Cis8QkxVUkI+Qm91bmRhcnkgc3RyaW5nLjwvQkxVUkI+Cis8REVGQVVMVD4iVGhpc1JhbmRvbVN0cmluZyI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdElEM0RlbXV4OjpwcmVmZXItdjE8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5QcmVmZXIgdmVyc2lvbiAxIHRhZzwvTklDSz4KKzxCTFVSQj5QcmVmZXIgdGFncyBmcm9tIElEM3YxIHRhZyBhdCBlbmQgb2YgZmlsZSB3aGVuIGJvdGggSUQzdjEgYW5kIElEM3YyIHRhZ3MgYXJlIHByZXNlbnQuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3REeW5VRFBTaW5rOjpjbG9zZS1zb2NrZXQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNsb3NlIHNvY2tldDwvTklDSz4KKzxCTFVSQj5DbG9zZSBzb2NrZXQgaWYgcGFzc2VkIGFzIHByb3BlcnR5IG9uIHN0YXRlIGNoYW5nZS48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0RHluVURQU2luazo6c29ja2V0PC9OQU1FPgorPFRZUEU+R1NvY2tldCo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Tb2NrZXQ8L05JQ0s+Cis8QkxVUkI+U29ja2V0IHRvIHVzZSBmb3IgVURQIHNlbmRpbmcuIChOVUxMID09IGFsbG9jYXRlKS48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3REeW5VRFBTaW5rOjpiaW5kLWFkZHJlc3M8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CaW5kIEFkZHJlc3M8L05JQ0s+Cis8QkxVUkI+QWRkcmVzcyB0byBiaW5kIHRoZSBzb2NrZXQgdG8uPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdER5blVEUFNpbms6OmJpbmQtcG9ydDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNjU1MzVdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CaW5kIFBvcnQ8L05JQ0s+Cis8QkxVUkI+UG9ydCB0byBiaW5kIHRoZSBzb2NrZXQgdG8uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdER5blVEUFNpbms6OnNvY2tldC12NjwvTkFNRT4KKzxUWVBFPkdTb2NrZXQqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U29ja2V0IElQdjY8L05JQ0s+Cis8QkxVUkI+U29ja2V0IHRvIHVzZSBmb3IgVURQdjYgc2VuZGluZy4gKE5VTEwgPT0gYWxsb2NhdGUpLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpVURQU2luazo6Ynl0ZXMtc2VydmVkPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+Qnl0ZXMgc2VydmVkPC9OSUNLPgorPEJMVVJCPlRvdGFsIG51bWJlciBvZiBieXRlcyBzZW50IHRvIGFsbCBjbGllbnRzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNdWx0aVVEUFNpbms6OmJ5dGVzLXRvLXNlcnZlPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+Qnl0ZXMgdG8gc2VydmU8L05JQ0s+Cis8QkxVUkI+TnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIHRvIHNlcnZlIHRvIGNsaWVudHMuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpVURQU2luazo6Y2xpZW50czwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNsaWVudHM8L05JQ0s+Cis8QkxVUkI+QSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBob3N0OnBvcnQgcGFpcnMgd2l0aCBkZXN0aW5hdGlvbnMuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpVURQU2luazo6YXV0by1tdWx0aWNhc3Q8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkF1dG9tYXRpY2FsbHkgam9pbi9sZWF2ZSBtdWx0aWNhc3QgZ3JvdXBzPC9OSUNLPgorPEJMVVJCPkF1dG9tYXRpY2FsbHkgam9pbi9sZWF2ZSB0aGUgbXVsdGljYXN0IGdyb3VwcywgRkFMU0UgbWVhbnMgdXNlciBoYXMgdG8gZG8gaXQgaGltc2VsZi48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlVRFBTaW5rOjpsb29wPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NdWx0aWNhc3QgTG9vcGJhY2s8L05JQ0s+Cis8QkxVUkI+VXNlZCBmb3Igc2V0dGluZyB0aGUgbXVsdGljYXN0IGxvb3AgcGFyYW1ldGVyLiBUUlVFID0gZW5hYmxlLCBGQUxTRSA9IGRpc2FibGUuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpVURQU2luazo6cW9zLWRzY3A8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPltHX01BWFVMT05HLDYzXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UW9TIGRpZmYgc3J2IGNvZGUgcG9pbnQ8L05JQ0s+Cis8QkxVUkI+UXVhbGl0eSBvZiBTZXJ2aWNlLCBkaWZmZXJlbnRpYXRlZCBzZXJ2aWNlcyBjb2RlIHBvaW50ICgtMSBkZWZhdWx0KS48L0JMVVJCPgorPERFRkFVTFQ+LTE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpVURQU2luazo6dHRsPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwyNTVdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5VbmljYXN0IFRUTDwvTklDSz4KKzxCTFVSQj5Vc2VkIGZvciBzZXR0aW5nIHRoZSB1bmljYXN0IFRUTCBwYXJhbWV0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjY0PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNdWx0aVVEUFNpbms6OnR0bC1tYzwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMjU1XTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TXVsdGljYXN0IFRUTDwvTklDSz4KKzxCTFVSQj5Vc2VkIGZvciBzZXR0aW5nIHRoZSBtdWx0aWNhc3QgVFRMIHBhcmFtZXRlci48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlVRFBTaW5rOjpzZW5kLWR1cGxpY2F0ZXM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNlbmQgRHVwbGljYXRlczwvTklDSz4KKzxCTFVSQj5XaGVuIGEgZGlzdGluYXRpb24vcG9ydCBwYWlyIGlzIGFkZGVkIG11bHRpcGxlIHRpbWVzLCBzZW5kIHBhY2tldHMgbXVsdGlwbGUgdGltZXMgYXMgd2VsbC48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlVRFBTaW5rOjpidWZmZXItc2l6ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QnVmZmVyIFNpemU8L05JQ0s+Cis8QkxVUkI+U2l6ZSBvZiB0aGUga2VybmVsIHNlbmQgYnVmZmVyIGluIGJ5dGVzLCAwPWRlZmF1bHQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpVURQU2luazo6Y2xvc2Utc29ja2V0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5DbG9zZSBzb2NrZXQ8L05JQ0s+Cis8QkxVUkI+Q2xvc2Ugc29ja2V0IGlmIHBhc3NlZCBhcyBwcm9wZXJ0eSBvbiBzdGF0ZSBjaGFuZ2UuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpVURQU2luazo6c29ja2V0PC9OQU1FPgorPFRZUEU+R1NvY2tldCo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Tb2NrZXQgSGFuZGxlPC9OSUNLPgorPEJMVVJCPlNvY2tldCB0byB1c2UgZm9yIFVEUCBzZW5kaW5nLiAoTlVMTCA9PSBhbGxvY2F0ZSkuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlVRFBTaW5rOjp1c2VkLXNvY2tldDwvTkFNRT4KKzxUWVBFPkdTb2NrZXQqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5Vc2VkIFNvY2tldCBIYW5kbGU8L05JQ0s+Cis8QkxVUkI+U29ja2V0IGN1cnJlbnRseSBpbiB1c2UgZm9yIFVEUCBzZW5kaW5nLiAoTlVMTCA9PSBubyBzb2NrZXQpLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpVURQU2luazo6Zm9yY2UtaXB2NDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Rm9yY2UgSVB2NDwvTklDSz4KKzxCTFVSQj5Gb3JjaW5nIHRoZSB1c2Ugb2YgYW4gSVB2NCBzb2NrZXQgKERFUFJFQ0FURUQsIGhhcyBubyBlZmZlY3QgYW55bW9yZSkuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNdWx0aVVEUFNpbms6Om11bHRpY2FzdC1pZmFjZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk11bHRpY2FzdCBJbnRlcmZhY2U8L05JQ0s+Cis8QkxVUkI+VGhlIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHdoaWNoIHRvIGpvaW4gdGhlIG11bHRpY2FzdCBncm91cC48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlVRFBTaW5rOjpiaW5kLWFkZHJlc3M8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CaW5kIEFkZHJlc3M8L05JQ0s+Cis8QkxVUkI+QWRkcmVzcyB0byBiaW5kIHRoZSBzb2NrZXQgdG8uPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpVURQU2luazo6YmluZC1wb3J0PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw2NTUzNV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkJpbmQgUG9ydDwvTklDSz4KKzxCTFVSQj5Qb3J0IHRvIGJpbmQgdGhlIHNvY2tldCB0by48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlVRFBTaW5rOjpzb2NrZXQtdjY8L05BTUU+Cis8VFlQRT5HU29ja2V0KjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNvY2tldCBIYW5kbGUgSVB2NjwvTklDSz4KKzxCTFVSQj5Tb2NrZXQgdG8gdXNlIGZvciBVRFB2NiBzZW5kaW5nLiAoTlVMTCA9PSBhbGxvY2F0ZSkuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlVRFBTaW5rOjp1c2VkLXNvY2tldC12NjwvTkFNRT4KKzxUWVBFPkdTb2NrZXQqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5Vc2VkIFNvY2tldCBIYW5kbGUgSVB2NjwvTklDSz4KKzxCTFVSQj5Tb2NrZXQgY3VycmVudGx5IGluIHVzZSBmb3IgVURQdjYgc2VuZGluZy4gKE5VTEwgPT0gbm8gc29ja2V0KS48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RYSW1hZ2VTcmM6OmRpc3BsYXktbmFtZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRpc3BsYXk8L05JQ0s+Cis8QkxVUkI+WCBEaXNwbGF5IE5hbWUuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFhJbWFnZVNyYzo6c2hvdy1wb2ludGVyPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TaG93IE1vdXNlIFBvaW50ZXI8L05JQ0s+Cis8QkxVUkI+U2hvdyBtb3VzZSBwb2ludGVyIChpZiBYRml4ZXMgZXh0ZW5zaW9uIGVuYWJsZWQpLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RYSW1hZ2VTcmM6OmVuZHg8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSBHX01BWElOVDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RW5kIFg8L05JQ0s+Cis8QkxVUkI+WCBjb29yZGluYXRlIG9mIGJvdHRvbSByaWdodCBjb3JuZXIgb2YgYXJlYSB0byBiZSByZWNvcmRlZCAoMCBmb3IgYm90dG9tIHJpZ2h0IG9mIHNjcmVlbikuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFhJbWFnZVNyYzo6ZW5keTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IEdfTUFYSU5UPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5FbmQgWTwvTklDSz4KKzxCTFVSQj5ZIGNvb3JkaW5hdGUgb2YgYm90dG9tIHJpZ2h0IGNvcm5lciBvZiBhcmVhIHRvIGJlIHJlY29yZGVkICgwIGZvciBib3R0b20gcmlnaHQgb2Ygc2NyZWVuKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0WEltYWdlU3JjOjpzdGFydHg8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSBHX01BWElOVDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U3RhcnQgWCBjby1vcmRpbmF0ZTwvTklDSz4KKzxCTFVSQj5YIGNvb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIGFyZWEgdG8gYmUgcmVjb3JkZWQgKDAgZm9yIHRvcCBsZWZ0IG9mIHNjcmVlbikuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFhJbWFnZVNyYzo6c3RhcnR5PC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gR19NQVhJTlQ8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlN0YXJ0IFkgY28tb3JkaW5hdGU8L05JQ0s+Cis8QkxVUkI+WSBjb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiBhcmVhIHRvIGJlIHJlY29yZGVkICgwIGZvciB0b3AgbGVmdCBvZiBzY3JlZW4pLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RYSW1hZ2VTcmM6OnVzZS1kYW1hZ2U8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlVzZSBYRGFtYWdlPC9OSUNLPgorPEJMVVJCPlVzZSBYRGFtYWdlIChpZiBYRGFtYWdlIGV4dGVuc2lvbiBlbmFibGVkKS48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0WEltYWdlU3JjOjpyZW1vdGU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJlbW90ZSBkaXNwYXk8L05JQ0s+Cis8QkxVUkI+V2hldGhlciB0aGUgZGlzcGxheSBpcyByZW1vdGUuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RYSW1hZ2VTcmM6OnhpZDwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5XaW5kb3cgWElEPC9OSUNLPgorPEJMVVJCPldpbmRvdyBYSUQgdG8gY2FwdHVyZSBmcm9tLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RYSW1hZ2VTcmM6OnhuYW1lPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+V2luZG93IG5hbWU8L05JQ0s+Cis8QkxVUkI+V2luZG93IG5hbWUgdG8gY2FwdHVyZSBmcm9tLjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWaWRlb0JhbGFuY2U6OmJyaWdodG5lc3M8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QnJpZ2h0bmVzczwvTklDSz4KKzxCTFVSQj5icmlnaHRuZXNzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWaWRlb0JhbGFuY2U6OmNvbnRyYXN0PC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bMCwyXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q29udHJhc3Q8L05JQ0s+Cis8QkxVUkI+Y29udHJhc3QuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZpZGVvQmFsYW5jZTo6aHVlPC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkh1ZTwvTklDSz4KKzxCTFVSQj5odWUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZpZGVvQmFsYW5jZTo6c2F0dXJhdGlvbjwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+WzAsMl08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNhdHVyYXRpb248L05JQ0s+Cis8QkxVUkI+c2F0dXJhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlwYXJ0RGVtdXg6OmJvdW5kYXJ5PC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJvdW5kYXJ5PC9OSUNLPgorPEJMVVJCPlRoZSBib3VuZGFyeSBzdHJpbmcgc2VwYXJhdGluZyBkYXRhLCBhdXRvbWF0aWMgaWYgTlVMTC48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlwYXJ0RGVtdXg6OnNpbmdsZS1zdHJlYW08L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNpbmdsZSBTdHJlYW08L05JQ0s+Cis8QkxVUkI+QXNzdW1lIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgc3RyZWFtIHdob3NlIGNvbnRlbnQtdHlwZSB3aWxsIG5vdCBjaGFuZ2UgYW5kIGVtaXQgbm8tbW9yZS1wYWRzIGFzIHNvb24gYXMgdGhlIGZpcnN0IGJvdW5kYXJ5IGNvbnRlbnQgaXMgcGFyc2VkLCBkZWNvZGVkLCBhbmQgcGFkcyBhcmUgbGlua2VkLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXZpTXV4OjpiaWdmaWxlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CaWdmaWxlIFN1cHBvcnQgKD4yR0IpPC9OSUNLPgorPEJMVVJCPlN1cHBvcnQgZm9yIG9wZW5ETUwtMi4wIChiaWcpIEFWSSBmaWxlcy48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SnBlZ0RlYzo6aWRjdC1tZXRob2Q8L05BTUU+Cis8VFlQRT5Hc3RJRENUTWV0aG9kPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SURDVCBNZXRob2Q8L05JQ0s+Cis8QkxVUkI+VGhlIElEQ1QgYWxnb3JpdGhtIHRvIHVzZS48L0JMVVJCPgorPERFRkFVTFQ+RmFzdGVyLCBsZXNzIGFjY3VyYXRlIGludGVnZXIgbWV0aG9kPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RKcGVnRGVjOjptYXgtZXJyb3JzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSBHX01BWFVMT05HPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXhpbXVtIENvbnNlY3V0aXZlIERlY29kaW5nIEVycm9yczwvTklDSz4KKzxCTFVSQj4oRGVwcmVjYXRlZCkgRXJyb3Igb3V0IGFmdGVyIHJlY2VpdmluZyBOIGNvbnNlY3V0aXZlIGRlY29kaW5nIGVycm9ycyAoLTEgPSBuZXZlciBmYWlsLCAwID0gYXV0b21hdGljLCAxID0gZmFpbCBvbiBmaXJzdCBlcnJvcikuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUUGlMQkNEZXBheTo6bW9kZTwvTkFNRT4KKzxUWVBFPmlMQkNNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TW9kZTwvTklDSz4KKzxCTFVSQj5pTEJDIGZyYW1lIG1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPjMwbXMgZnJhbWVzPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb1Bhbm9yYW1hOjpwYW5vcmFtYTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBhbm9yYW1hPC9OSUNLPgorPEJMVVJCPlBvc2l0aW9uIGluIHN0ZXJlbyBwYW5vcmFtYSAoLTEuMCBsZWZ0IC0+IDEuMCByaWdodCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvUGFub3JhbWE6Om1ldGhvZDwvTkFNRT4KKzxUWVBFPkdzdEF1ZGlvUGFub3JhbWFNZXRob2Q8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5QYW5uaW5nIG1ldGhvZDwvTklDSz4KKzxCTFVSQj5Qc3ljaG9hY291c3RpYyBtb2RlIGtlZXBzIHNhbWUgcGVyY2VpdmVkIGxvdWRuZXNzLCBzaW1wbGUgbW9kZSBqdXN0IGNvbnRyb2xzIHZvbHVtZSBvZiBvbmUgY2hhbm5lbC48L0JMVVJCPgorPERFRkFVTFQ+UHN5Y2hvYWNvdXN0aWMgUGFubmluZyAoZGVmYXVsdCk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvSW52ZXJ0OjpkZWdyZWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRlZ3JlZTwvTklDSz4KKzxCTFVSQj5EZWdyZWUgb2YgaW52ZXJzaW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb0FtcGxpZnk6OmFtcGxpZmljYXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5BbXBsaWZpY2F0aW9uPC9OSUNLPgorPEJMVVJCPkZhY3RvciBvZiBhbXBsaWZpY2F0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb0FtcGxpZnk6OmNsaXBwaW5nLW1ldGhvZDwvTkFNRT4KKzxUWVBFPkdzdEF1ZGlvQW1wbGlmeUNsaXBwaW5nTWV0aG9kPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q2xpcHBpbmcgbWV0aG9kPC9OSUNLPgorPEJMVVJCPlNlbGVjdHMgaG93IHRvIGhhbmRsZSB2YWx1ZXMgaGlnaGVyIHRoYW4gdGhlIG1heGltdW0uPC9CTFVSQj4KKzxERUZBVUxUPk5vcm1hbCBjbGlwcGluZyAoZGVmYXVsdCk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvRHluYW1pYzo6Y2hhcmFjdGVyaXN0aWNzPC9OQU1FPgorPFRZUEU+R3N0QXVkaW9EeW5hbWljQ2hhcmFjdGVyaXN0aWNzPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q2hhcmFjdGVyaXN0aWNzPC9OSUNLPgorPEJMVVJCPlNlbGVjdHMgd2hldGhlciB0aGUgcmF0aW8gc2hvdWxkIGJlIGFwcGxpZWQgc21vb3RoIChzb2Z0LWtuZWUpIG9yIGhhcmQgKGhhcmQta25lZSkuPC9CTFVSQj4KKzxERUZBVUxUPkhhcmQgS25lZSAoZGVmYXVsdCk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvRHluYW1pYzo6bW9kZTwvTkFNRT4KKzxUWVBFPkdzdEF1ZGlvRHluYW1pY01vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Nb2RlPC9OSUNLPgorPEJMVVJCPlNlbGVjdHMgd2hldGhlciB0aGUgZmlsdGVyIHNob3VsZCB3b3JrIG9uIGxvdWQgc2FtcGxlcyAoY29tcHJlc3Nvcikgb3JxdWlldCBzYW1wbGVzIChleHBhbmRlcikuPC9CTFVSQj4KKzxERUZBVUxUPkNvbXByZXNzb3IgKGRlZmF1bHQpPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb0R5bmFtaWM6OnJhdGlvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJhdGlvPC9OSUNLPgorPEJMVVJCPlJhdGlvIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvRHluYW1pYzo6dGhyZXNob2xkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UaHJlc2hvbGQ8L05JQ0s+Cis8QkxVUkI+VGhyZXNob2xkIHVudGlsIHRoZSBmaWx0ZXIgaXMgYWN0aXZhdGVkLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RXYXZwYWNrRW5jOjpiaXRyYXRlPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gOTYwMDAwMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Qml0cmF0ZTwvTklDSz4KKzxCTFVSQj5UcnkgdG8gZW5jb2RlIHdpdGggdGhpcyBhdmVyYWdlIGJpdHJhdGUgKGJpdHMvc2VjKS4gVGhpcyBlbmFibGVzIGxvc3N5IGVuY29kaW5nLCB2YWx1ZXMgc21hbGxlciB0aGFuIDI0MDAwIGRpc2FibGUgaXQgYWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFdhdnBhY2tFbmM6OmJpdHMtcGVyLXNhbXBsZTwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+WzAsMjRdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CaXRzIHBlciBzYW1wbGU8L05JQ0s+Cis8QkxVUkI+VHJ5IHRvIGVuY29kZSB3aXRoIHRoaXMgYW1vdW50IG9mIGJpdHMgcGVyIHNhbXBsZS4gVGhpcyBlbmFibGVzIGxvc3N5IGVuY29kaW5nLCB2YWx1ZXMgc21hbGxlciB0aGFuIDIuMCBkaXNhYmxlIGl0IGFnYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RXYXZwYWNrRW5jOjpjb3JyZWN0aW9uLW1vZGU8L05BTUU+Cis8VFlQRT5Hc3RXYXZwYWNrRW5jQ29ycmVjdGlvbk1vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Db3JyZWN0aW9uIHN0cmVhbSBtb2RlPC9OSUNLPgorPEJMVVJCPlVzZSB0aGlzIG1vZGUgZm9yIHRoZSBjb3JyZWN0aW9uIHN0cmVhbS4gT25seSB3b3JrcyBpbiBsb3NzeSBtb2RlIS48L0JMVVJCPgorPERFRkFVTFQ+Q3JlYXRlIG5vIGNvcnJlY3Rpb24gZmlsZTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0V2F2cGFja0VuYzo6ZXh0cmEtcHJvY2Vzc2luZzwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDY8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkV4dHJhIHByb2Nlc3Npbmc8L05JQ0s+Cis8QkxVUkI+VXNlIGJldHRlciBidXQgc2xvd2VyIGZpbHRlcnMgZm9yIGJldHRlciBjb21wcmVzc2lvbi9xdWFsaXR5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RXYXZwYWNrRW5jOjpqb2ludC1zdGVyZW8tbW9kZTwvTkFNRT4KKzxUWVBFPkdzdFdhdnBhY2tFbmNKU01vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Kb2ludC1TdGVyZW8gbW9kZTwvTklDSz4KKzxCTFVSQj5Vc2UgdGhpcyBqb2ludC1zdGVyZW8gbW9kZS48L0JMVVJCPgorPERFRkFVTFQ+YXV0bzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0V2F2cGFja0VuYzo6bWQ1PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NRDU8L05JQ0s+Cis8QkxVUkI+U3RvcmUgTUQ1IGhhc2ggb2YgcmF3IHNhbXBsZXMgd2l0aGluIHRoZSBmaWxlLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0V2F2cGFja0VuYzo6bW9kZTwvTkFNRT4KKzxUWVBFPkdzdFdhdnBhY2tFbmNNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RW5jb2RpbmcgbW9kZTwvTklDSz4KKzxCTFVSQj5TcGVlZCB2ZXJzdXMgY29tcHJlc3Npb24gdHJhZGVvZmYuPC9CTFVSQj4KKzxERUZBVUxUPk5vcm1hbCBDb21wcmVzc2lvbjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwTVAyVERlcGF5Ojpza2lwLWZpcnN0LWJ5dGVzPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Ta2lwIGZpcnN0IGJ5dGVzPC9OSUNLPgorPEJMVVJCPlRoZSBhbW91bnQgb2YgYnl0ZXMgdGhhdCBuZWVkIHRvIGJlIHNraXBwZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGF5bG9hZC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSDI2M1BQYXk6OmZyYWdtZW50YXRpb24tbW9kZTwvTkFNRT4KKzxUWVBFPkdzdEZyYWdtZW50YXRpb25Nb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RnJhZ21lbnRhdGlvbiBNb2RlPC9OSUNLPgorPEJMVVJCPlBhY2tldCBGcmFnbWVudGF0aW9uIE1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPk5vcm1hbDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0R2FtbWE6OmdhbW1hPC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bMC4wMSwxMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkdhbW1hPC9OSUNLPgorPEJMVVJCPmdhbW1hLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWaWRlb0Nyb3A6OmJvdHRvbTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Qm90dG9tPC9OSUNLPgorPEJMVVJCPlBpeGVscyB0byBjcm9wIGF0IGJvdHRvbSAoLTEgdG8gYXV0by1jcm9wKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VmlkZW9Dcm9wOjpsZWZ0PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSBHX01BWFVMT05HPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5MZWZ0PC9OSUNLPgorPEJMVVJCPlBpeGVscyB0byBjcm9wIGF0IGxlZnQgKC0xIHRvIGF1dG8tY3JvcCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZpZGVvQ3JvcDo6cmlnaHQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJpZ2h0PC9OSUNLPgorPEJMVVJCPlBpeGVscyB0byBjcm9wIGF0IHJpZ2h0ICgtMSB0byBhdXRvLWNyb3ApLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWaWRlb0Nyb3A6OnRvcDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VG9wPC9OSUNLPgorPEJMVVJCPlBpeGVscyB0byBjcm9wIGF0IHRvcCAoLTEgdG8gYXV0by1jcm9wKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNyYzo6ZGV2aWNlPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RGV2aWNlPC9OSUNLPgorPEJMVVJCPkRldmljZSBsb2NhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+Ii9kZXYvdmlkZW8wIjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNyYzo6ZGV2aWNlLW5hbWU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkRldmljZSBuYW1lPC9OSUNLPgorPEJMVVJCPk5hbWUgb2YgdGhlIGRldmljZS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNyYzo6ZmxhZ3M8L05BTUU+Cis8VFlQRT5Hc3RWNGwyRGV2aWNlVHlwZUZsYWdzPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5GbGFnczwvTklDSz4KKzxCTFVSQj5EZXZpY2UgdHlwZSBmbGFncy48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWNGwyU3JjOjpkZXZpY2UtZmQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+RmlsZSBkZXNjcmlwdG9yPC9OSUNLPgorPEJMVVJCPkZpbGUgZGVzY3JpcHRvciBvZiB0aGUgZGV2aWNlLjwvQkxVUkI+Cis8REVGQVVMVD4tMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNyYzo6YnJpZ2h0bmVzczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CcmlnaHRuZXNzPC9OSUNLPgorPEJMVVJCPlBpY3R1cmUgYnJpZ2h0bmVzcywgb3IgbW9yZSBwcmVjaXNlbHksIHRoZSBibGFjayBsZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNyYzo6Y29udHJhc3Q8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q29udHJhc3Q8L05JQ0s+Cis8QkxVUkI+UGljdHVyZSBjb250cmFzdCBvciBsdW1hIGdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTcmM6Omh1ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5IdWU8L05JQ0s+Cis8QkxVUkI+SHVlIG9yIGNvbG9yIGJhbGFuY2UuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTcmM6OnNhdHVyYXRpb248L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U2F0dXJhdGlvbjwvTklDSz4KKzxCTFVSQj5QaWN0dXJlIGNvbG9yIHNhdHVyYXRpb24gb3IgY2hyb21hIGdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTcmM6Om5vcm08L05BTUU+Cis8VFlQRT5WNEwyX1RWX25vcm1zPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VFYgbm9ybTwvTklDSz4KKzxCTFVSQj52aWRlbyBzdGFuZGFyZC48L0JMVVJCPgorPERFRkFVTFQ+bm9uZTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNyYzo6aW8tbW9kZTwvTkFNRT4KKzxUWVBFPkdzdFY0bDJJT01vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5JTyBtb2RlPC9OSUNLPgorPEJMVVJCPkkvTyBtb2RlLjwvQkxVUkI+Cis8REVGQVVMVD5HU1RfVjRMMl9JT19BVVRPPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWNGwyU3JjOjpleHRyYS1jb250cm9sczwvTkFNRT4KKzxUWVBFPkdzdFN0cnVjdHVyZSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5FeHRyYSBDb250cm9sczwvTklDSz4KKzxCTFVSQj5FeHRyYSB2NGwyIGNvbnRyb2xzIChDSURzKSBmb3IgdGhlIGRldmljZS48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWNGwyU3JjOjpmb3JjZS1hc3BlY3QtcmF0aW88L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZvcmNlIGFzcGVjdCByYXRpbzwvTklDSz4KKzxCTFVSQj5XaGVuIGVuYWJsZWQsIHRoZSBwaXhlbCBhc3BlY3QgcmF0aW8gd2lsbCBiZSBlbmZvcmNlZC48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNyYzo6cGl4ZWwtYXNwZWN0LXJhdGlvPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UGl4ZWwgQXNwZWN0IFJhdGlvPC9OSUNLPgorPEJMVVJCPk92ZXJ3cml0ZSB0aGUgcGl4ZWwgYXNwZWN0IHJhdGlvIG9mIHRoZSBkZXZpY2UuPC9CTFVSQj4KKzxERUZBVUxUPiIxLzEiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb0NoZWJCYW5kOjpsb3dlci1mcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TG93ZXIgZnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPlN0YXJ0IGZyZXF1ZW5jeSBvZiB0aGUgYmFuZCAoSHopLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb0NoZWJCYW5kOjptb2RlPC9OQU1FPgorPFRZUEU+R3N0QXVkaW9DaGViQmFuZE1vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Nb2RlPC9OSUNLPgorPEJMVVJCPkxvdyBwYXNzIG9yIGhpZ2ggcGFzcyBtb2RlLjwvQkxVUkI+Cis8REVGQVVMVD5CYW5kIHBhc3MgKGRlZmF1bHQpPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb0NoZWJCYW5kOjpwb2xlczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzQsMzJdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qb2xlczwvTklDSz4KKzxCTFVSQj5OdW1iZXIgb2YgcG9sZXMgdG8gdXNlLCB3aWxsIGJlIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgbXVsdGlwbHkgb2YgZm91ci48L0JMVVJCPgorPERFRkFVTFQ+NDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9DaGViQmFuZDo6cmlwcGxlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDIwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJpcHBsZTwvTklDSz4KKzxCTFVSQj5BbW91bnQgb2YgcmlwcGxlIChkQikuPC9CTFVSQj4KKzxERUZBVUxUPjAuMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvQ2hlYkJhbmQ6OnR5cGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDJdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UeXBlPC9OSUNLPgorPEJMVVJCPlR5cGUgb2YgdGhlIGNoZWJ5Y2hldiBmaWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvQ2hlYkJhbmQ6OnVwcGVyLWZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMDAwMDBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5VcHBlciBmcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+U3RvcCBmcmVxdWVuY3kgb2YgdGhlIGJhbmQgKEh6KS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9DaGViTGltaXQ6OmN1dG9mZjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMDAwMDBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5DdXRvZmY8L05JQ0s+Cis8QkxVUkI+Q3V0IG9mZiBmcmVxdWVuY3kgKEh6KS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9DaGViTGltaXQ6Om1vZGU8L05BTUU+Cis8VFlQRT5Hc3RBdWRpb0NoZWJMaW1pdE1vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Nb2RlPC9OSUNLPgorPEJMVVJCPkxvdyBwYXNzIG9yIGhpZ2ggcGFzcyBtb2RlLjwvQkxVUkI+Cis8REVGQVVMVD5Mb3cgcGFzcyAoZGVmYXVsdCk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvQ2hlYkxpbWl0Ojpwb2xlczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzIsMzJdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qb2xlczwvTklDSz4KKzxCTFVSQj5OdW1iZXIgb2YgcG9sZXMgdG8gdXNlLCB3aWxsIGJlIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgZXZlbiBudW1iZXIuPC9CTFVSQj4KKzxERUZBVUxUPjQ8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvQ2hlYkxpbWl0OjpyaXBwbGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMjAwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UmlwcGxlPC9OSUNLPgorPEJMVVJCPkFtb3VudCBvZiByaXBwbGUgKGRCKS48L0JMVVJCPgorPERFRkFVTFQ+MC4yNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9DaGViTGltaXQ6OnR5cGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDJdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UeXBlPC9OSUNLPgorPEJMVVJCPlR5cGUgb2YgdGhlIGNoZWJ5Y2hldiBmaWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvV1NpbmNCYW5kOjpsb3dlci1mcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TG93ZXIgRnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkN1dC1vZmYgbG93ZXIgZnJlcXVlbmN5IChIeikuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvV1NpbmNCYW5kOjp1cHBlci1mcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VXBwZXIgRnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkN1dC1vZmYgdXBwZXIgZnJlcXVlbmN5IChIeikuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvV1NpbmNCYW5kOjptb2RlPC9OQU1FPgorPFRZUEU+R3N0QXVkaW9XU2luY0JhbmRNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TW9kZTwvTklDSz4KKzxCTFVSQj5CYW5kIHBhc3Mgb3IgYmFuZCByZWplY3QgbW9kZS48L0JMVVJCPgorPERFRkFVTFQ+QmFuZCBwYXNzIChkZWZhdWx0KTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9XU2luY0JhbmQ6OndpbmRvdzwvTkFNRT4KKzxUWVBFPkdzdEF1ZGlvV1NpbmNCYW5kV2luZG93PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+V2luZG93PC9OSUNLPgorPEJMVVJCPldpbmRvdyBmdW5jdGlvbiB0byB1c2UuPC9CTFVSQj4KKzxERUZBVUxUPkhhbW1pbmcgd2luZG93IChkZWZhdWx0KTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9XU2luY0JhbmQ6Omxlbmd0aDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzMsMjU2MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TGVuZ3RoPC9OSUNLPgorPEJMVVJCPkZpbHRlciBrZXJuZWwgbGVuZ3RoLCB3aWxsIGJlIHJvdW5kZWQgdG8gdGhlIG5leHQgb2RkIG51bWJlci48L0JMVVJCPgorPERFRkFVTFQ+MTAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb1dTaW5jTGltaXQ6Omxlbmd0aDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzMsMjU2MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TGVuZ3RoPC9OSUNLPgorPEJMVVJCPkZpbHRlciBrZXJuZWwgbGVuZ3RoLCB3aWxsIGJlIHJvdW5kZWQgdG8gdGhlIG5leHQgb2RkIG51bWJlci48L0JMVVJCPgorPERFRkFVTFQ+MTAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb1dTaW5jTGltaXQ6Om1vZGU8L05BTUU+Cis8VFlQRT5Hc3RBdWRpb1dTaW5jTGltaXRNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TW9kZTwvTklDSz4KKzxCTFVSQj5Mb3cgcGFzcyBvciBoaWdoIHBhc3MgbW9kZS48L0JMVVJCPgorPERFRkFVTFQ+TG93IHBhc3MgKGRlZmF1bHQpPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb1dTaW5jTGltaXQ6OndpbmRvdzwvTkFNRT4KKzxUWVBFPkdzdEF1ZGlvV1NpbmNMaW1pdFdpbmRvdzwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPldpbmRvdzwvTklDSz4KKzxCTFVSQj5XaW5kb3cgZnVuY3Rpb24gdG8gdXNlLjwvQkxVUkI+Cis8REVGQVVMVD5IYW1taW5nIHdpbmRvdyAoZGVmYXVsdCk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvV1NpbmNMaW1pdDo6Y3V0b2ZmPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkN1dG9mZjwvTklDSz4KKzxCTFVSQj5DdXQtb2ZmIEZyZXF1ZW5jeSAoSHopLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSbmRCdWZmZXJTaXplOjptYXg8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDE8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5tYXhpbXVtPC9OSUNLPgorPEJMVVJCPm1heGltdW0gYnVmZmVyIHNpemUuPC9CTFVSQj4KKzxERUZBVUxUPjgxOTI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJuZEJ1ZmZlclNpemU6Om1pbjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPm1pbmludW08L05JQ0s+Cis8QkxVUkI+bWluaW51bSBidWZmZXIgc2l6ZS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0Um5kQnVmZmVyU2l6ZTo6c2VlZDwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnJhbmRvbSBudW1iZXIgc2VlZDwvTklDSz4KKzxCTFVSQj5zZWVkIGZvciByYW5kb21uZXNzIChpbml0aWFsaXplZCB3aGVuIGdvaW5nIGZyb20gUkVBRFkgdG8gUEFVU0VEKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXV0b0F1ZGlvU2luazo6dHMtb2Zmc2V0PC9OQU1FPgorPFRZUEU+Z2ludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VFMgT2Zmc2V0PC9OSUNLPgorPEJMVVJCPlRpbWVzdGFtcCBvZmZzZXQgaW4gbmFub3NlY29uZHMuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1dG9BdWRpb1Npbms6OnN5bmM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlN5bmM8L05JQ0s+Cis8QkxVUkI+U3luYyBvbiB0aGUgY2xvY2suPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1dG9WaWRlb1Npbms6OnRzLW9mZnNldDwvTkFNRT4KKzxUWVBFPmdpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRTIE9mZnNldDwvTklDSz4KKzxCTFVSQj5UaW1lc3RhbXAgb2Zmc2V0IGluIG5hbm9zZWNvbmRzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdXRvVmlkZW9TaW5rOjpzeW5jPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TeW5jPC9OSUNLPgorPEJMVVJCPlN5bmMgb24gdGhlIGNsb2NrLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RPc3hBdWRpb1Npbms6OmRldmljZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RGV2aWNlIElEPC9OSUNLPgorPEJMVVJCPkRldmljZSBJRCBvZiBvdXRwdXQgZGV2aWNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RPc3hBdWRpb1NyYzo6ZGV2aWNlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EZXZpY2UgSUQ8L05JQ0s+Cis8QkxVUkI+RGV2aWNlIElEIG9mIGlucHV0IGRldmljZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0T1NYVmlkZW9TaW5rOjplbWJlZDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+ZW1iZWQ8L05JQ0s+Cis8QkxVUkI+V2hlbiBlbmFibGVkLCBpdCAgY2FuIGJlIGVtYmVkZGVkLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0T1NYVmlkZW9TaW5rOjpmdWxsc2NyZWVuPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5mdWxsc2NyZWVuPC9OSUNLPgorPEJMVVJCPldoZW4gZW5hYmxlZCwgdGhlIHZpZXcgIGlzIGZ1bGxzY3JlZW4uPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RHZGtQaXhidWZTaW5rOjpsYXN0LXBpeGJ1ZjwvTkFNRT4KKzxUWVBFPkdka1BpeGJ1Zio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkxhc3QgUGl4YnVmPC9OSUNLPgorPEJMVVJCPkxhc3QgR2RrUGl4YnVmIG9iamVjdCByZW5kZXJlZC48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RHZGtQaXhidWZTaW5rOjpwb3N0LW1lc3NhZ2VzPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qb3N0IE1lc3NhZ2VzPC9OSUNLPgorPEJMVVJCPldoZXRoZXIgdG8gcG9zdCBtZXNzYWdlcyBjb250YWluaW5nIHBpeGJ1ZnMgb24gdGhlIGJ1cy48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U291cEhUVFBTcmM6OmF1dG9tYXRpYy1yZWRpcmVjdDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+YXV0b21hdGljLXJlZGlyZWN0PC9OSUNLPgorPEJMVVJCPkF1dG9tYXRpY2FsbHkgZm9sbG93IEhUVFAgcmVkaXJlY3RzIChIVFRQIFN0YXR1cyBDb2RlIDN4eCkuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIVFRQU3JjOjpjb29raWVzPC9OQU1FPgorPFRZUEU+R1N0cnY8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Db29raWVzPC9OSUNLPgorPEJMVVJCPkhUVFAgcmVxdWVzdCBjb29raWVzLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIVFRQU3JjOjppcmFkaW8tbW9kZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+aXJhZGlvLW1vZGU8L05JQ0s+Cis8QkxVUkI+RW5hYmxlIGludGVybmV0IHJhZGlvIG1vZGUgKGFzayBzZXJ2ZXIgdG8gc2VuZCBzaG91dGNhc3QvaWNlY2FzdCBtZXRhZGF0YSBpbnRlcmxlYXZlZCB3aXRoIHRoZSBhY3R1YWwgc3RyZWFtIGRhdGEpLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSFRUUFNyYzo6bG9jYXRpb248L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Mb2NhdGlvbjwvTklDSz4KKzxCTFVSQj5Mb2NhdGlvbiB0byByZWFkIGZyb20uPC9CTFVSQj4KKzxERUZBVUxUPiIiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSFRUUFNyYzo6cHJveHk8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qcm94eTwvTklDSz4KKzxCTFVSQj5IVFRQIHByb3h5IHNlcnZlciBVUkkuPC9CTFVSQj4KKzxERUZBVUxUPiIiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSFRUUFNyYzo6dXNlci1hZ2VudDwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlVzZXItQWdlbnQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUgb2YgdGhlIFVzZXItQWdlbnQgSFRUUCByZXF1ZXN0IGhlYWRlciBmaWVsZC48L0JMVVJCPgorPERFRkFVTFQ+IkdTdHJlYW1lciBzb3VwaHR0cHNyYyAxLjEzLjAuMSAiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSFRUUFNyYzo6aXMtbGl2ZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+aXMtbGl2ZTwvTklDSz4KKzxCTFVSQj5BY3QgbGlrZSBhIGxpdmUgc291cmNlLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U291cEhUVFBTcmM6OnByb3h5LWlkPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+cHJveHktaWQ8L05JQ0s+Cis8QkxVUkI+SFRUUCBwcm94eSBVUkkgdXNlciBpZCBmb3IgYXV0aGVudGljYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPiIiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSFRUUFNyYzo6cHJveHktcHc8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5wcm94eS1wdzwvTklDSz4KKzxCTFVSQj5IVFRQIHByb3h5IFVSSSB1c2VyIHBhc3N3b3JkIGZvciBhdXRoZW50aWNhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+IiI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIVFRQU3JjOjp1c2VyLWlkPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+dXNlci1pZDwvTklDSz4KKzxCTFVSQj5IVFRQIGxvY2F0aW9uIFVSSSB1c2VyIGlkIGZvciBhdXRoZW50aWNhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+IiI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIVFRQU3JjOjp1c2VyLXB3PC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+dXNlci1wdzwvTklDSz4KKzxCTFVSQj5IVFRQIGxvY2F0aW9uIFVSSSB1c2VyIHBhc3N3b3JkIGZvciBhdXRoZW50aWNhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+IiI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIVFRQU3JjOjpleHRyYS1oZWFkZXJzPC9OQU1FPgorPFRZUEU+R3N0U3RydWN0dXJlKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkV4dHJhIEhlYWRlcnM8L05JQ0s+Cis8QkxVUkI+RXh0cmEgaGVhZGVycyB0byBhcHBlbmQgdG8gdGhlIEhUVFAgcmVxdWVzdC48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSFRUUFNyYzo6dGltZW91dDwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDM2MDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPnRpbWVvdXQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUgaW4gc2Vjb25kcyB0byB0aW1lb3V0IGEgYmxvY2tpbmcgSS9PICgwID0gTm8gdGltZW91dCkuPC9CTFVSQj4KKzxERUZBVUxUPjE1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSFRUUFNyYzo6Y29tcHJlc3M8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNvbXByZXNzPC9OSUNLPgorPEJMVVJCPkFsbG93IGNvbXByZXNzZWQgY29udGVudCBlbmNvZGluZ3MuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSFRUUFNyYzo6aHR0cC1sb2ctbGV2ZWw8L05BTUU+Cis8VFlQRT5Tb3VwTG9nZ2VyTG9nTGV2ZWw8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5IVFRQIGxvZyBsZXZlbDwvTklDSz4KKzxCTFVSQj5TZXQgbG9nIGxldmVsIGZvciBzb3VwJ3MgSFRUUCBzZXNzaW9uIGxvZy48L0JMVVJCPgorPERFRkFVTFQ+U09VUF9MT0dHRVJfTE9HX0hFQURFUlM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIVFRQU3JjOjprZWVwLWFsaXZlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5rZWVwLWFsaXZlPC9OSUNLPgorPEJMVVJCPlVzZSBIVFRQIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIVFRQU3JjOjpyZXRyaWVzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSBHX01BWFVMT05HPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SZXRyaWVzPC9OSUNLPgorPEJMVVJCPk1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgdW50aWwgZ2l2aW5nIHVwICgtMT1pbmZpbml0ZSkuPC9CTFVSQj4KKzxERUZBVUxUPjM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIVFRQU3JjOjpzc2wtY2EtZmlsZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNTTCBDQSBGaWxlPC9OSUNLPgorPEJMVVJCPkxvY2F0aW9uIG9mIGEgU1NMIGFuY2hvciBDQSBmaWxlIHRvIHVzZS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U291cEhUVFBTcmM6OnNzbC1zdHJpY3Q8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNTTCBTdHJpY3Q8L05JQ0s+Cis8QkxVUkI+U3RyaWN0IFNTTCBjZXJ0aWZpY2F0ZSBjaGVja2luZy48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U291cEhUVFBTcmM6OnNzbC11c2Utc3lzdGVtLWNhLWZpbGU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlVzZSBTeXN0ZW0gQ0EgRmlsZTwvTklDSz4KKzxCTFVSQj5Vc2Ugc3lzdGVtIENBIGZpbGUuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIVFRQU3JjOjp0bHMtZGF0YWJhc2U8L05BTUU+Cis8VFlQRT5HVGxzRGF0YWJhc2UqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VExTIGRhdGFiYXNlPC9OSUNLPgorPEJMVVJCPlRMUyBkYXRhYmFzZSB3aXRoIGFuY2hvciBjZXJ0aWZpY2F0ZSBhdXRob3JpdGllcyB1c2VkIHRvIHZhbGlkYXRlIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U291cEhUVFBTcmM6Om1ldGhvZDwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkhUVFAgbWV0aG9kPC9OSUNLPgorPEJMVVJCPlRoZSBIVFRQIG1ldGhvZCB0byB1c2UgKEdFVCwgSEVBRCwgT1BUSU9OUywgZXRjKS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U291cEhUVFBTcmM6OnRscy1pbnRlcmFjdGlvbjwvTkFNRT4KKzxUWVBFPkdUbHNJbnRlcmFjdGlvbio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UTFMgaW50ZXJhY3Rpb248L05JQ0s+Cis8QkxVUkI+QSBHVGxzSW50ZXJhY3Rpb24gb2JqZWN0IHRvIGJlIHVzZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBvciBjZXJ0aWZpY2F0ZSBkYXRhYmFzZSBuZWVkIHRvIGludGVyYWN0IHdpdGggdGhlIHVzZXIuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRQRFZQYXk6Om1vZGU8L05BTUU+Cis8VFlQRT5Hc3REVlBheU1vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Nb2RlPC9OSUNLPgorPEJMVVJCPlRoZSBwYXlsb2FkIG1vZGUgb2YgcGF5bG9hZGluZy48L0JMVVJCPgorPERFRkFVTFQ+VmlkZW8gb25seTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSDI2NFBheTo6c3Byb3AtcGFyYW1ldGVyLXNldHM8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5zcHJvcC1wYXJhbWV0ZXItc2V0czwvTklDSz4KKzxCTFVSQj5UaGUgYmFzZTY0IHNwcm9wLXBhcmFtZXRlci1zZXRzIHRvIHNldCBpbiBvdXQgY2FwcyAoc2V0IHRvIE5VTEwgdG8gZXh0cmFjdCBmcm9tIHN0cmVhbSkuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEgyNjRQYXk6OmNvbmZpZy1pbnRlcnZhbDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+W0dfTUFYVUxPTkcsMzYwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNQUyBQUFMgU2VuZCBJbnRlcnZhbDwvTklDSz4KKzxCTFVSQj5TZW5kIFNQUyBhbmQgUFBTIEluc2VydGlvbiBJbnRlcnZhbCBpbiBzZWNvbmRzIChzcHJvcCBwYXJhbWV0ZXIgc2V0cyB3aWxsIGJlIG11bHRpcGxleGVkIGluIHRoZSBkYXRhIHN0cmVhbSB3aGVuIGRldGVjdGVkLikgKDAgPSBkaXNhYmxlZCwgLTEgPSBzZW5kIHdpdGggZXZlcnkgSURSIGZyYW1lKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcmRMaW1pdGVyOjpSZXNpZHVlLWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVzaWR1ZS1sZXZlbDwvTklDSz4KKzxCTFVSQj5SZXNpZHVlLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGFyZExpbWl0ZXI6OldldC1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldldC1sZXZlbDwvTklDSz4KKzxCTFVSQj5XZXQtbGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oYXJkTGltaXRlcjo6ZEItbGltaXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy01MCwwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmRCLWxpbWl0PC9OSUNLPgorPEJMVVJCPmRCLWxpbWl0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGotZXEtbW9ubzo6SGktZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SGktZ2FpbjwvTklDSz4KKzxCTFVSQj5IaS1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGotZXEtbW9ubzo6TG8tZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TG8tZ2FpbjwvTklDSz4KKzxCTFVSQj5Mby1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGotZXEtbW9ubzo6TWlkLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCw2XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1pZC1nYWluPC9OSUNLPgorPEJMVVJCPk1pZC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGotZXEtbW9ubzo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kai1lcTo6SGktZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SGktZ2FpbjwvTklDSz4KKzxCTFVSQj5IaS1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGotZXE6OkxvLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCw2XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxvLWdhaW48L05JQ0s+Cis8QkxVUkI+TG8tZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRqLWVxOjpNaWQtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TWlkLWdhaW48L05JQ0s+Cis8QkxVUkI+TWlkLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kai1lcTo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1icmFuY2gtaWMtb2NvYzo6Rmlyc3QtT3V0cHV0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5GaXJzdC1PdXRwdXQ8L05JQ0s+Cis8QkxVUkI+Rmlyc3QtT3V0cHV0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1icmFuY2gtaWMtb2NvYzo6SW5wdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5wdXQ8L05JQ0s+Cis8QkxVUkI+SW5wdXQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWJyYW5jaC1pYy1vY29jOjpTZWNvbmQtT3V0cHV0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5TZWNvbmQtT3V0cHV0PC9OSUNLPgorPEJMVVJCPlNlY29uZC1PdXRwdXQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUV4YWdnZXJhdGU6OmFtb3VudDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+YW1vdW50PC9OSUNLPgorPEJMVVJCPmFtb3VudC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVRyYW5zcG9zZTo6dHJhbnNwb3NlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjQsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+dHJhbnNwb3NlPC9OSUNLPgorPEJMVVJCPnRyYW5zcG9zZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUFjY3VtdWxhdGU6OmRlY2F5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZGVjYXk8L05JQ0s+Cis8QkxVUkI+ZGVjYXkuPC9CTFVSQj4KKzxERUZBVUxUPjAsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BY2N1bXVsYXRlOjpnbGlzc2FuZG88L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Z2xpc3NhbmRvPC9OSUNLPgorPEJMVVJCPmdsaXNzYW5kby48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNpbnVzV2F2ZXdyYXBwZXI6OldyYXAtZGVncmVlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldyYXAtZGVncmVlPC9OSUNLPgorPEJMVVJCPldyYXAtZGVncmVlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm92ZXJkcml2ZTo6RHJpdmUtbGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEsM108L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Ecml2ZS1sZXZlbDwvTklDSz4KKzxCTFVSQj5Ecml2ZS1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW1iZXE6OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPmxhdGVuY3k8L05JQ0s+Cis8QkxVUkI+bGF0ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbWJlcTo6cGFyYW0tMTAwMDBIei1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMTAwMDBIei1nYWluPC9OSUNLPgorPEJMVVJCPnBhcmFtLTEwMDAwSHotZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW1iZXE6OnBhcmFtLTEwMEh6LWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0xMDBIei1nYWluPC9OSUNLPgorPEJMVVJCPnBhcmFtLTEwMEh6LWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1tYmVxOjpwYXJhbS0xMjUwSHotZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTEyNTBIei1nYWluPC9OSUNLPgorPEJMVVJCPnBhcmFtLTEyNTBIei1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbWJlcTo6cGFyYW0tMTU2SHotZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTE1Nkh6LWdhaW48L05JQ0s+Cis8QkxVUkI+cGFyYW0tMTU2SHotZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW1iZXE6OnBhcmFtLTE3NTBIei1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMTc1MEh6LWdhaW48L05JQ0s+Cis8QkxVUkI+cGFyYW0tMTc1MEh6LWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1tYmVxOjpwYXJhbS0yMDAwMEh6LWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0yMDAwMEh6LWdhaW48L05JQ0s+Cis8QkxVUkI+cGFyYW0tMjAwMDBIei1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbWJlcTo6cGFyYW0tMjIwSHotZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTIyMEh6LWdhaW48L05JQ0s+Cis8QkxVUkI+cGFyYW0tMjIwSHotZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW1iZXE6OnBhcmFtLTI1MDBIei1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMjUwMEh6LWdhaW48L05JQ0s+Cis8QkxVUkI+cGFyYW0tMjUwMEh6LWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1tYmVxOjpwYXJhbS0zMTFIei1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMzExSHotZ2FpbjwvTklDSz4KKzxCTFVSQj5wYXJhbS0zMTFIei1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbWJlcTo6cGFyYW0tMzUwMEh6LWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0zNTAwSHotZ2FpbjwvTklDSz4KKzxCTFVSQj5wYXJhbS0zNTAwSHotZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW1iZXE6OnBhcmFtLTQ0MEh6LWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS00NDBIei1nYWluPC9OSUNLPgorPEJMVVJCPnBhcmFtLTQ0MEh6LWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1tYmVxOjpwYXJhbS01MDAwSHotZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTUwMDBIei1nYWluPC9OSUNLPgorPEJMVVJCPnBhcmFtLTUwMDBIei1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbWJlcTo6cGFyYW0tNTBIei1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tNTBIei1nYWluPC9OSUNLPgorPEJMVVJCPnBhcmFtLTUwSHotZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW1iZXE6OnBhcmFtLTYyMkh6LWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS02MjJIei1nYWluPC9OSUNLPgorPEJMVVJCPnBhcmFtLTYyMkh6LWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1tYmVxOjpwYXJhbS04ODBIei1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tODgwSHotZ2FpbjwvTklDSz4KKzxCTFVSQj5wYXJhbS04ODBIei1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXlvcmFtYTo6QW1wbGl0dWRlLWNoYW5nZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QW1wbGl0dWRlLWNoYW5nZTwvTklDSz4KKzxCTFVSQj5BbXBsaXR1ZGUtY2hhbmdlLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXlvcmFtYTo6QW1wbGl0dWRlLXJhbmRvbTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QW1wbGl0dWRlLXJhbmRvbTwvTklDSz4KKzxCTFVSQj5BbXBsaXR1ZGUtcmFuZG9tLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXlvcmFtYTo6RGVsYXktY2hhbmdlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDIsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheS1jaGFuZ2U8L05JQ0s+Cis8QkxVUkI+RGVsYXktY2hhbmdlLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXlvcmFtYTo6RGVsYXktcmFuZG9tPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheS1yYW5kb208L05JQ0s+Cis8QkxVUkI+RGVsYXktcmFuZG9tLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXlvcmFtYTo6RGVsYXktcmFuZ2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDAwMSw2XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbGF5LXJhbmdlPC9OSUNLPgorPEJMVVJCPkRlbGF5LXJhbmdlLjwvQkxVUkI+Cis8REVGQVVMVD42PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXlvcmFtYTo6RHJ5LXdldC1taXg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Ecnktd2V0LW1peDwvTklDSz4KKzxCTFVSQj5Ecnktd2V0LW1peC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRlbGF5b3JhbWE6OkZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GZWVkYmFjazwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRlbGF5b3JhbWE6OkZpcnN0LWRlbGF5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Rmlyc3QtZGVsYXk8L05JQ0s+Cis8QkxVUkI+Rmlyc3QtZGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kZWxheW9yYW1hOjpJbnB1dC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOTYsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5wdXQtZ2FpbjwvTklDSz4KKzxCTFVSQj5JbnB1dC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXlvcmFtYTo6TnVtYmVyLW9mLXRhcHM8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsyLDEyOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5OdW1iZXItb2YtdGFwczwvTklDSz4KKzxCTFVSQj5OdW1iZXItb2YtdGFwcy48L0JMVVJCPgorPERFRkFVTFQ+MjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRlbGF5b3JhbWE6OlJhbmRvbS1zZWVkPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwxMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJhbmRvbS1zZWVkPC9OSUNLPgorPEJMVVJCPlJhbmRvbS1zZWVkLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC0xLUJhbmR3aWR0aC0tb2N0YXZlcy08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMSw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMS1CYW5kd2lkdGgtLW9jdGF2ZXMtPC9OSUNLPgorPEJMVVJCPkJhbmQtMS1CYW5kd2lkdGgtLW9jdGF2ZXMtLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC0xLUZyZXEtLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNDAsMjgwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMS1GcmVxLS1Iei08L05JQ0s+Cis8QkxVUkI+QmFuZC0xLUZyZXEtLUh6LS48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC0xLUdhaW4tLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTUwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMS1HYWluLS1kQi08L05JQ0s+Cis8QkxVUkI+QmFuZC0xLUdhaW4tLWRCLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1lcXVhbGl6ZXItYnc6OkJhbmQtMi1CYW5kd2lkdGgtLW9jdGF2ZXMtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTItQmFuZHdpZHRoLS1vY3RhdmVzLTwvTklDSz4KKzxCTFVSQj5CYW5kLTItQmFuZHdpZHRoLS1vY3RhdmVzLS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1lcXVhbGl6ZXItYnc6OkJhbmQtMi1GcmVxLS1Iei08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEwMCw1MDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0yLUZyZXEtLUh6LTwvTklDSz4KKzxCTFVSQj5CYW5kLTItRnJlcS0tSHotLjwvQkxVUkI+Cis8REVGQVVMVD4yMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyLWJ3OjpCYW5kLTItR2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0yLUdhaW4tLWRCLTwvTklDSz4KKzxCTFVSQj5CYW5kLTItR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC0zLUJhbmR3aWR0aC0tb2N0YXZlcy08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMSw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMy1CYW5kd2lkdGgtLW9jdGF2ZXMtPC9OSUNLPgorPEJMVVJCPkJhbmQtMy1CYW5kd2lkdGgtLW9jdGF2ZXMtLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC0zLUZyZXEtLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMjAwLDEwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0zLUZyZXEtLUh6LTwvTklDSz4KKzxCTFVSQj5CYW5kLTMtRnJlcS0tSHotLjwvQkxVUkI+Cis8REVGQVVMVD40MDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyLWJ3OjpCYW5kLTMtR2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0zLUdhaW4tLWRCLTwvTklDSz4KKzxCTFVSQj5CYW5kLTMtR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC00LUJhbmR3aWR0aC0tb2N0YXZlcy08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMSw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtNC1CYW5kd2lkdGgtLW9jdGF2ZXMtPC9OSUNLPgorPEJMVVJCPkJhbmQtNC1CYW5kd2lkdGgtLW9jdGF2ZXMtLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC00LUZyZXEtLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNDAwLDI4MDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC00LUZyZXEtLUh6LTwvTklDSz4KKzxCTFVSQj5CYW5kLTQtRnJlcS0tSHotLjwvQkxVUkI+Cis8REVGQVVMVD4xMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC00LUdhaW4tLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTUwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtNC1HYWluLS1kQi08L05JQ0s+Cis8QkxVUkI+QmFuZC00LUdhaW4tLWRCLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1lcXVhbGl6ZXItYnc6OkJhbmQtNS1CYW5kd2lkdGgtLW9jdGF2ZXMtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTUtQmFuZHdpZHRoLS1vY3RhdmVzLTwvTklDSz4KKzxCTFVSQj5CYW5kLTUtQmFuZHdpZHRoLS1vY3RhdmVzLS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1lcXVhbGl6ZXItYnc6OkJhbmQtNS1GcmVxLS1Iei08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEwMDAsNTAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTUtRnJlcS0tSHotPC9OSUNLPgorPEJMVVJCPkJhbmQtNS1GcmVxLS1Iei0uPC9CTFVSQj4KKzxERUZBVUxUPjMwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyLWJ3OjpCYW5kLTUtR2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC01LUdhaW4tLWRCLTwvTklDSz4KKzxCTFVSQj5CYW5kLTUtR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC02LUJhbmR3aWR0aC0tb2N0YXZlcy08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMSw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtNi1CYW5kd2lkdGgtLW9jdGF2ZXMtPC9OSUNLPgorPEJMVVJCPkJhbmQtNi1CYW5kd2lkdGgtLW9jdGF2ZXMtLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC02LUZyZXEtLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMzAwMCw5MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtNi1GcmVxLS1Iei08L05JQ0s+Cis8QkxVUkI+QmFuZC02LUZyZXEtLUh6LS48L0JMVVJCPgorPERFRkFVTFQ+NjAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1lcXVhbGl6ZXItYnc6OkJhbmQtNi1HYWluLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy01MCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTYtR2Fpbi0tZEItPC9OSUNLPgorPEJMVVJCPkJhbmQtNi1HYWluLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyLWJ3OjpCYW5kLTctQmFuZHdpZHRoLS1vY3RhdmVzLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC03LUJhbmR3aWR0aC0tb2N0YXZlcy08L05JQ0s+Cis8QkxVUkI+QmFuZC03LUJhbmR3aWR0aC0tb2N0YXZlcy0uPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyLWJ3OjpCYW5kLTctRnJlcS0tSHotPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls2MDAwLDE4MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtNy1GcmVxLS1Iei08L05JQ0s+Cis8QkxVUkI+QmFuZC03LUZyZXEtLUh6LS48L0JMVVJCPgorPERFRkFVTFQ+MTIwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyLWJ3OjpCYW5kLTctR2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC03LUdhaW4tLWRCLTwvTklDSz4KKzxCTFVSQj5CYW5kLTctR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC04LUJhbmR3aWR0aC0tb2N0YXZlcy08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMSw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtOC1CYW5kd2lkdGgtLW9jdGF2ZXMtPC9OSUNLPgorPEJMVVJCPkJhbmQtOC1CYW5kd2lkdGgtLW9jdGF2ZXMtLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC04LUZyZXEtLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMTAwMDAsMjAwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC04LUZyZXEtLUh6LTwvTklDSz4KKzxCTFVSQj5CYW5kLTgtRnJlcS0tSHotLjwvQkxVUkI+Cis8REVGQVVMVD4xNTAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1lcXVhbGl6ZXItYnc6OkJhbmQtOC1HYWluLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy01MCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTgtR2Fpbi0tZEItPC9OSUNLPgorPEJMVVJCPkJhbmQtOC1HYWluLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jcm9zc292ZXJEaXN0OjpDcm9zc292ZXItYW1wbGl0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Dcm9zc292ZXItYW1wbGl0dWRlPC9OSUNLPgorPEJMVVJCPkNyb3Nzb3Zlci1hbXBsaXR1ZGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jcm9zc292ZXJEaXN0OjpTbW9vdGhpbmc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TbW9vdGhpbmc8L05JQ0s+Cis8QkxVUkI+U21vb3RoaW5nLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZmFkRGVsYXk6OkRlbGF5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXk8L05JQ0s+Cis8QkxVUkI+RGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1mYWREZWxheTo6RmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPkZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbXVsdGl2b2ljZUNob3J1czo6RGVsYXktYmFzZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMTAsNDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktYmFzZTwvTklDSz4KKzxCTFVSQj5EZWxheS1iYXNlLjwvQkxVUkI+Cis8REVGQVVMVD4xMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW11bHRpdm9pY2VDaG9ydXM6OkRldHVuZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRldHVuZTwvTklDSz4KKzxCTFVSQj5EZXR1bmUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1tdWx0aXZvaWNlQ2hvcnVzOjpMRk8tZnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxGTy1mcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+TEZPLWZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+OTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW11bHRpdm9pY2VDaG9ydXM6Ok51bWJlci1vZi12b2ljZXM8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TnVtYmVyLW9mLXZvaWNlczwvTklDSz4KKzxCTFVSQj5OdW1iZXItb2Ytdm9pY2VzLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbXVsdGl2b2ljZUNob3J1czo6T3V0cHV0LWF0dGVudWF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRwdXQtYXR0ZW51YXRpb248L05JQ0s+Cis8QkxVUkI+T3V0cHV0LWF0dGVudWF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbXVsdGl2b2ljZUNob3J1czo6Vm9pY2Utc2VwYXJhdGlvbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZvaWNlLXNlcGFyYXRpb248L05JQ0s+Cis8QkxVUkI+Vm9pY2Utc2VwYXJhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc3luY3NxdWFyZS1mY2dhLW9hOjpGcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MTY8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zbW9vdGhEZWNpbWF0ZTo6UmVzYW1wbGUtcmF0ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw0NDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNhbXBsZS1yYXRlPC9OSUNLPgorPEJMVVJCPlJlc2FtcGxlLXJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjQ0MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc21vb3RoRGVjaW1hdGU6OlNtb290aGluZzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNtb290aGluZzwvTklDSz4KKzxCTFVSQj5TbW9vdGhpbmcuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbGxwYXNzLW46OkRlY2F5LVRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlY2F5LVRpbWU8L05JQ0s+Cis8QkxVUkI+RGVjYXktVGltZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFsbHBhc3Mtbjo6RGVsYXktVGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktVGltZTwvTklDSz4KKzxCTFVSQj5EZWxheS1UaW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYWxscGFzcy1uOjpNYXgtRGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1heC1EZWxheTwvTklDSz4KKzxCTFVSQj5NYXgtRGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbGxwYXNzLWw6OkRlY2F5LVRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlY2F5LVRpbWU8L05JQ0s+Cis8QkxVUkI+RGVjYXktVGltZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFsbHBhc3MtbDo6RGVsYXktVGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktVGltZTwvTklDSz4KKzxCTFVSQj5EZWxheS1UaW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYWxscGFzcy1sOjpNYXgtRGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1heC1EZWxheTwvTklDSz4KKzxCTFVSQj5NYXgtRGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbGxwYXNzLWM6OkRlY2F5LVRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlY2F5LVRpbWU8L05JQ0s+Cis8QkxVUkI+RGVjYXktVGltZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFsbHBhc3MtYzo6RGVsYXktVGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktVGltZTwvTklDSz4KKzxCTFVSQj5EZWxheS1UaW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYWxscGFzcy1jOjpNYXgtRGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1heC1EZWxheTwvTklDSz4KKzxCTFVSQj5NYXgtRGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1mbU9zYzo6V2F2ZWZvcm08L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+V2F2ZWZvcm08L05JQ0s+Cis8QkxVUkI+V2F2ZWZvcm0uPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1mb2xkb3Zlcjo6RHJpdmU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Ecml2ZTwvTklDSz4KKzxCTFVSQj5Ecml2ZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZvbGRvdmVyOjpTa2V3PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U2tldzwvTklDSz4KKzxCTFVSQj5Ta2V3LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmFsdmU6OkRpc3RvcnRpb24tY2hhcmFjdGVyPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGlzdG9ydGlvbi1jaGFyYWN0ZXI8L05JQ0s+Cis8QkxVUkI+RGlzdG9ydGlvbi1jaGFyYWN0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12YWx2ZTo6RGlzdG9ydGlvbi1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRpc3RvcnRpb24tbGV2ZWw8L05JQ0s+Cis8QkxVUkI+RGlzdG9ydGlvbi1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRpZmZlcmVuY2UtaWFtYy1vYTo6SW5wdXQtdG8tU3VidHJhY3Q8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5wdXQtdG8tU3VidHJhY3Q8L05JQ0s+Cis8QkxVUkI+SW5wdXQtdG8tU3VidHJhY3QuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRpZmZlcmVuY2UtaWNtYS1vYTo6SW5wdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5wdXQ8L05JQ0s+Cis8QkxVUkI+SW5wdXQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRpZmZlcmVuY2UtaWNtYy1vYzo6RGlmZmVyZW5jZS1PdXRwdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkRpZmZlcmVuY2UtT3V0cHV0PC9OSUNLPgorPEJMVVJCPkRpZmZlcmVuY2UtT3V0cHV0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kaWZmZXJlbmNlLWljbWMtb2M6OklucHV0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklucHV0PC9OSUNLPgorPEJMVVJCPklucHV0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kaWZmZXJlbmNlLWljbWMtb2M6OklucHV0LXRvLVN1YnRyYWN0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklucHV0LXRvLVN1YnRyYWN0PC9OSUNLPgorPEJMVVJCPklucHV0LXRvLVN1YnRyYWN0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtMTo6RXhwLUZNLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RXhwLUZNLWdhaW48L05JQ0s+Cis8QkxVUkI+RXhwLUZNLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtMTo6RnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNiw2XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtMTo6SW5wdXQtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTYwLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklucHV0LWdhaW48L05JQ0s+Cis8QkxVUkI+SW5wdXQtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLU12Y2xwZi0xOjpPdXRwdXQtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTE1LDE1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk91dHB1dC1nYWluPC9OSUNLPgorPEJMVVJCPk91dHB1dC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtTXZjbHBmLTE6OlJlc29uYW5jZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc29uYW5jZTwvTklDSz4KKzxCTFVSQj5SZXNvbmFuY2UuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtMTo6UmVzb25hbmNlLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2UtZ2FpbjwvTklDSz4KKzxCTFVSQj5SZXNvbmFuY2UtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLU12Y2xwZi0yOjpFeHAtRk0tZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5FeHAtRk0tZ2FpbjwvTklDSz4KKzxCTFVSQj5FeHAtRk0tZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLU12Y2xwZi0yOjpGcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy02LDZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLU12Y2xwZi0yOjpJbnB1dC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNjAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5wdXQtZ2FpbjwvTklDSz4KKzxCTFVSQj5JbnB1dC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtTXZjbHBmLTI6Ok91dHB1dC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMTUsMTVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0LWdhaW48L05JQ0s+Cis8QkxVUkI+T3V0cHV0LWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtMjo6UmVzb25hbmNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVzb25hbmNlPC9OSUNLPgorPEJMVVJCPlJlc29uYW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLU12Y2xwZi0yOjpSZXNvbmFuY2UtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc29uYW5jZS1nYWluPC9OSUNLPgorPEJMVVJCPlJlc29uYW5jZS1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtTXZjbHBmLTM6OkV4cC1GTS1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkV4cC1GTS1nYWluPC9OSUNLPgorPEJMVVJCPkV4cC1GTS1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtTXZjbHBmLTM6OkZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTYsNl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtTXZjbHBmLTM6OklucHV0LWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy02MCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5JbnB1dC1nYWluPC9OSUNLPgorPEJMVVJCPklucHV0LWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtMzo6T3V0cHV0LWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xNSwxNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRwdXQtZ2FpbjwvTklDSz4KKzxCTFVSQj5PdXRwdXQtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLU12Y2xwZi0zOjpSZXNvbmFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2U8L05JQ0s+Cis8QkxVUkI+UmVzb25hbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtTXZjbHBmLTM6OlJlc29uYW5jZS1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVzb25hbmNlLWdhaW48L05JQ0s+Cis8QkxVUkI+UmVzb25hbmNlLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtNDo6RXhwLUZNLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RXhwLUZNLWdhaW48L05JQ0s+Cis8QkxVUkI+RXhwLUZNLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtNDo6RmlsdGVyLXBvbGVzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHRlci1wb2xlczwvTklDSz4KKzxCTFVSQj5GaWx0ZXItcG9sZXMuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtNDo6RnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNiw2XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtNDo6SW5wdXQtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTYwLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklucHV0LWdhaW48L05JQ0s+Cis8QkxVUkI+SW5wdXQtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLU12Y2xwZi00OjpPdXRwdXQtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTE1LDE1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk91dHB1dC1nYWluPC9OSUNLPgorPEJMVVJCPk91dHB1dC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtTXZjbHBmLTQ6OlJlc29uYW5jZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc29uYW5jZTwvTklDSz4KKzxCTFVSQj5SZXNvbmFuY2UuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtNDo6UmVzb25hbmNlLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2UtZ2FpbjwvTklDSz4KKzxCTFVSQj5SZXNvbmFuY2UtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFsaWVud2FoLW1vbm86OkRlbGF5PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bNSw1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheTwvTklDSz4KKzxCTFVSQj5EZWxheS48L0JMVVJCPgorPERFRkFVTFQ+NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFsaWVud2FoLW1vbm86OkZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+RmVlZGJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbGllbndhaC1tb25vOjpGcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsaW5mXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbGllbndhaC1tb25vOjpJbml0aWFsLXBoYXNlLWZvci1zdGVyZW88L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5pdGlhbC1waGFzZS1mb3Itc3RlcmVvPC9OSUNLPgorPEJMVVJCPkluaXRpYWwtcGhhc2UtZm9yLXN0ZXJlby48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYWxpZW53YWgtc3RlcmVvOjpEZWxheTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzUsNTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXk8L05JQ0s+Cis8QkxVUkI+RGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbGllbndhaC1zdGVyZW86OkZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+RmVlZGJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbGllbndhaC1zdGVyZW86OkZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCxpbmZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFsaWVud2FoLXN0ZXJlbzo6SW5pdGlhbC1waGFzZS1mb3Itc3RlcmVvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDYsMjgzMTldPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5pdGlhbC1waGFzZS1mb3Itc3RlcmVvPC9OSUNLPgorPEJMVVJCPkluaXRpYWwtcGhhc2UtZm9yLXN0ZXJlby48L0JMVVJCPgorPERFRkFVTFQ+NiwyODMxOTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmdCZWF0ZXI6OkltcHVsc2UtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW1wdWxzZS1nYWluPC9OSUNLPgorPEJMVVJCPkltcHVsc2UtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+LTcwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ29uZ0JlYXRlcjo6U3RyaWtlLWR1cmF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMSwwLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3RyaWtlLWR1cmF0aW9uPC9OSUNLPgorPEJMVVJCPlN0cmlrZS1kdXJhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MCwxMDA1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ29uZ0JlYXRlcjo6U3RyaWtlLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN0cmlrZS1nYWluPC9OSUNLPgorPEJMVVJCPlN0cmlrZS1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2hvcnVzMTo6RGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXk8L05JQ0s+Cis8QkxVUkI+RGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DaG9ydXMxOjpNb2QtQW1wbGl0dWRlLTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kLUFtcGxpdHVkZS0xPC9OSUNLPgorPEJMVVJCPk1vZC1BbXBsaXR1ZGUtMS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNob3J1czE6Ok1vZC1BbXBsaXR1ZGUtMjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwzXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1vZC1BbXBsaXR1ZGUtMjwvTklDSz4KKzxCTFVSQj5Nb2QtQW1wbGl0dWRlLTIuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DaG9ydXMxOjpNb2QtRnJlcXVlbmN5LTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDAzLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1vZC1GcmVxdWVuY3ktMTwvTklDSz4KKzxCTFVSQj5Nb2QtRnJlcXVlbmN5LTEuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDAzPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2hvcnVzMTo6TW9kLUZyZXF1ZW5jeS0yPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1vZC1GcmVxdWVuY3ktMjwvTklDSz4KKzxCTFVSQj5Nb2QtRnJlcXVlbmN5LTIuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DaG9ydXMyOjpEZWxheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheTwvTklDSz4KKzxCTFVSQj5EZWxheS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNob3J1czI6Ok1vZC1BbXBsaXR1ZGUtMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Nb2QtQW1wbGl0dWRlLTE8L05JQ0s+Cis8QkxVUkI+TW9kLUFtcGxpdHVkZS0xLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2hvcnVzMjo6TW9kLUFtcGxpdHVkZS0yPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDNdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kLUFtcGxpdHVkZS0yPC9OSUNLPgorPEJMVVJCPk1vZC1BbXBsaXR1ZGUtMi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNob3J1czI6Ok1vZC1GcmVxdWVuY3ktMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDMsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kLUZyZXF1ZW5jeS0xPC9OSUNLPgorPEJMVVJCPk1vZC1GcmVxdWVuY3ktMS48L0JMVVJCPgorPERFRkFVTFQ+MCwwMDM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DaG9ydXMyOjpNb2QtRnJlcXVlbmN5LTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kLUZyZXF1ZW5jeS0yPC9OSUNLPgorPEJMVVJCPk1vZC1GcmVxdWVuY3ktMi48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhpbGJlcnQ6OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPmxhdGVuY3k8L05JQ0s+Cis8QkxVUkI+bGF0ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwZURlbGF5OjpEcnktbGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy05MCwwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRyeS1sZXZlbDwvTklDSz4KKzxCTFVSQj5EcnktbGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPi05MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcGVEZWxheTo6VGFwLTEtZGlzdGFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UYXAtMS1kaXN0YW5jZTwvTklDSz4KKzxCTFVSQj5UYXAtMS1kaXN0YW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcGVEZWxheTo6VGFwLTEtbGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy05MCwwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRhcC0xLWxldmVsPC9OSUNLPgorPEJMVVJCPlRhcC0xLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwZURlbGF5OjpUYXAtMi1kaXN0YW5jZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRhcC0yLWRpc3RhbmNlPC9OSUNLPgorPEJMVVJCPlRhcC0yLWRpc3RhbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwZURlbGF5OjpUYXAtMi1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTkwLDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGFwLTItbGV2ZWw8L05JQ0s+Cis8QkxVUkI+VGFwLTItbGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPi05MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcGVEZWxheTo6VGFwLTMtZGlzdGFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UYXAtMy1kaXN0YW5jZTwvTklDSz4KKzxCTFVSQj5UYXAtMy1kaXN0YW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcGVEZWxheTo6VGFwLTMtbGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy05MCwwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRhcC0zLWxldmVsPC9OSUNLPgorPEJMVVJCPlRhcC0zLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4tOTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXBlRGVsYXk6OlRhcC00LWRpc3RhbmNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGFwLTQtZGlzdGFuY2U8L05JQ0s+Cis8QkxVUkI+VGFwLTQtZGlzdGFuY2UuPC9CTFVSQj4KKzxERUZBVUxUPjM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXBlRGVsYXk6OlRhcC00LWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOTAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UYXAtNC1sZXZlbDwvTklDSz4KKzxCTFVSQj5UYXAtNC1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+LTkwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwZURlbGF5OjpUYXBlLXNwZWVkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRhcGUtc3BlZWQ8L05JQ0s+Cis8QkxVUkI+VGFwZS1zcGVlZC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXN1bS1pYWljLW9hOjpTZWNvbmQtSW5wdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U2Vjb25kLUlucHV0PC9OSUNLPgorPEJMVVJCPlNlY29uZC1JbnB1dC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc3VtLWljaWMtb2M6OkZpcnN0LUlucHV0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpcnN0LUlucHV0PC9OSUNLPgorPEJMVVJCPkZpcnN0LUlucHV0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zdW0taWNpYy1vYzo6U2Vjb25kLUlucHV0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNlY29uZC1JbnB1dDwvTklDSz4KKzxCTFVSQj5TZWNvbmQtSW5wdXQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXN1bS1pY2ljLW9jOjpTdW1tZWQtT3V0cHV0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5TdW1tZWQtT3V0cHV0PC9OSUNLPgorPEJMVVJCPlN1bW1lZC1PdXRwdXQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjMTo6QXR0YWNrLXRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIsNDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkF0dGFjay10aW1lPC9OSUNLPgorPEJMVVJCPkF0dGFjay10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD4xMDEsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjMTo6S25lZS1yYWRpdXM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+S25lZS1yYWRpdXM8L05JQ0s+Cis8QkxVUkI+S25lZS1yYWRpdXMuPC9CTFVSQj4KKzxERUZBVUxUPjMsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zYzE6Ok1ha2V1cC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1ha2V1cC1nYWluPC9OSUNLPgorPEJMVVJCPk1ha2V1cC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2MxOjpSYXRpbzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SYXRpbzwvTklDSz4KKzxCTFVSQj5SYXRpby48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjMTo6UmVsZWFzZS10aW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyLDgwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZWxlYXNlLXRpbWU8L05JQ0s+Cis8QkxVUkI+UmVsZWFzZS10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD40MDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zYzE6OlRocmVzaG9sZC1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTMwLDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGhyZXNob2xkLWxldmVsPC9OSUNLPgorPEJMVVJCPlRocmVzaG9sZC1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWNvbWJTcGxpdHRlcjo6QmFuZC1zZXBhcmF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxNiw2NDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC1zZXBhcmF0aW9uPC9OSUNLPgorPEJMVVJCPkJhbmQtc2VwYXJhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MTcyPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2M0bTo6QW1wbGl0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNDAsMTJdPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkFtcGxpdHVkZTwvTklDSz4KKzxCTFVSQj5BbXBsaXR1ZGUuPC9CTFVSQj4KKzxERUZBVUxUPi00MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjNG06OkF0dGFjay10aW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDUsNDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkF0dGFjay10aW1lPC9OSUNLPgorPEJMVVJCPkF0dGFjay10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD4xMDEsMTI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2M0bTo6R2Fpbi1yZWR1Y3Rpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yNCwwXTwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5HYWluLXJlZHVjdGlvbjwvTklDSz4KKzxCTFVSQj5HYWluLXJlZHVjdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+LTI0PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2M0bTo6S25lZS1yYWRpdXM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+S25lZS1yYWRpdXM8L05JQ0s+Cis8QkxVUkI+S25lZS1yYWRpdXMuPC9CTFVSQj4KKzxERUZBVUxUPjMsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zYzRtOjpNYWtldXAtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5NYWtldXAtZ2FpbjwvTklDSz4KKzxCTFVSQj5NYWtldXAtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjNG06OlJNUy1wZWFrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Uk1TLXBlYWs8L05JQ0s+Cis8QkxVUkI+Uk1TLXBlYWsuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zYzRtOjpSYXRpbzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SYXRpbzwvTklDSz4KKzxCTFVSQj5SYXRpby48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjNG06OlJlbGVhc2UtdGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMiw4MDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVsZWFzZS10aW1lPC9OSUNLPgorPEJMVVJCPlJlbGVhc2UtdGltZS48L0JMVVJCPgorPERFRkFVTFQ+NDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2M0bTo6VGhyZXNob2xkLWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMzAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UaHJlc2hvbGQtbGV2ZWw8L05JQ0s+Cis8QkxVUkI+VGhyZXNob2xkLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcHJlYW1wOjpmYzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMjAsNDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5mYzwvTklDSz4KKzxCTFVSQj5mYy48L0JMVVJCPgorPERFRkFVTFQ+NDQwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcHJlYW1wOjpnYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmdhaW48L05JQ0s+Cis8QkxVUkI+Z2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxzRmlsdGVyOjpDdXRvZmYtZnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls4OCwyLDIyMDUwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkN1dG9mZi1mcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+Q3V0b2ZmLWZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MTM5NCw1NjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxzRmlsdGVyOjpGaWx0ZXItdHlwZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWx0ZXItdHlwZTwvTklDSz4KKzxCTFVSQj5GaWx0ZXItdHlwZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxzRmlsdGVyOjpSZXNvbmFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2U8L05JQ0s+Cis8QkxVUkI+UmVzb25hbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbWF0cml4TVNTdDo6V2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5XaWR0aDwvTklDSz4KKzxCTFVSQj5XaWR0aC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxwZjo6Q3V0b2ZmLUZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5DdXRvZmYtRnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkN1dG9mZi1GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjQ0MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhwZjo6Q3V0b2ZmLUZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5DdXRvZmYtRnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkN1dG9mZi1GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjQ0MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpNYXRjaC1SYW5nZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TWF0Y2gtUmFuZ2U8L05JQ0s+Cis8QkxVUkI+TWF0Y2gtUmFuZ2UuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6TW9kZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Nb2RlPC9OSUNLPgorPEJMVVJCPk1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6UXVhbnRpc2UtUmFuZ2UtTWF4aW11bTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5RdWFudGlzZS1SYW5nZS1NYXhpbXVtPC9OSUNLPgorPEJMVVJCPlF1YW50aXNlLVJhbmdlLU1heGltdW0uPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpRdWFudGlzZS1SYW5nZS1NaW5pbXVtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlF1YW50aXNlLVJhbmdlLU1pbmltdW08L05JQ0s+Cis8QkxVUkI+UXVhbnRpc2UtUmFuZ2UtTWluaW11bS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlN0ZXBzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSw1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TdGVwczwvTklDSz4KKzxCTFVSQj5TdGVwcy48L0JMVVJCPgorPERFRkFVTFQ+NTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0wPC9OSUNLPgorPEJMVVJCPlZhbHVlLTAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0xPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTEwPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTEwPC9OSUNLPgorPEJMVVJCPlZhbHVlLTEwLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0xMjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0xMjwvTklDSz4KKzxCTFVSQj5WYWx1ZS0xMi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTEzPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTEzPC9OSUNLPgorPEJMVVJCPlZhbHVlLTEzLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMTQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0xNTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0xNTwvTklDSz4KKzxCTFVSQj5WYWx1ZS0xNS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTE2PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTE2PC9OSUNLPgorPEJMVVJCPlZhbHVlLTE2LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMTc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0xODwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0xODwvTklDSz4KKzxCTFVSQj5WYWx1ZS0xOC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTE5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTE5PC9OSUNLPgorPEJMVVJCPlZhbHVlLTE5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0yPC9OSUNLPgorPEJMVVJCPlZhbHVlLTIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0yMDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0yMDwvTklDSz4KKzxCTFVSQj5WYWx1ZS0yMC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTIxPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTIxPC9OSUNLPgorPEJMVVJCPlZhbHVlLTIxLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMjI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0yMzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0yMzwvTklDSz4KKzxCTFVSQj5WYWx1ZS0yMy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTI0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTI0PC9OSUNLPgorPEJMVVJCPlZhbHVlLTI0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMjU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0yNjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0yNjwvTklDSz4KKzxCTFVSQj5WYWx1ZS0yNi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTI3PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTI3PC9OSUNLPgorPEJMVVJCPlZhbHVlLTI3LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMjg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0yOTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0yOTwvTklDSz4KKzxCTFVSQj5WYWx1ZS0yOS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzwvTklDSz4KKzxCTFVSQj5WYWx1ZS0zLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMzA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0zMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0zMTwvTklDSz4KKzxCTFVSQj5WYWx1ZS0zMS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTMyPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTMyPC9OSUNLPgorPEJMVVJCPlZhbHVlLTMyLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMzM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0zNDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0zNDwvTklDSz4KKzxCTFVSQj5WYWx1ZS0zNC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTM1PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTM1PC9OSUNLPgorPEJMVVJCPlZhbHVlLTM1LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMzY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0zNzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0zNzwvTklDSz4KKzxCTFVSQj5WYWx1ZS0zNy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTM4PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTM4PC9OSUNLPgorPEJMVVJCPlZhbHVlLTM4LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMzk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS00PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTQwPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTQwPC9OSUNLPgorPEJMVVJCPlZhbHVlLTQwLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtNDE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS00MjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS00MjwvTklDSz4KKzxCTFVSQj5WYWx1ZS00Mi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTQzPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTQzPC9OSUNLPgorPEJMVVJCPlZhbHVlLTQzLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtNDQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS00NTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS00NTwvTklDSz4KKzxCTFVSQj5WYWx1ZS00NS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTQ2PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTQ2PC9OSUNLPgorPEJMVVJCPlZhbHVlLTQ2LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtNDc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS00ODwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS00ODwvTklDSz4KKzxCTFVSQj5WYWx1ZS00OC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTQ5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTQ5PC9OSUNLPgorPEJMVVJCPlZhbHVlLTQ5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtNTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS01PC9OSUNLPgorPEJMVVJCPlZhbHVlLTUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS02PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzwvTklDSz4KKzxCTFVSQj5WYWx1ZS03LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtODwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS04PC9OSUNLPgorPEJMVVJCPlZhbHVlLTguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS05PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGxhdGU6OkRhbXBpbmc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EYW1waW5nPC9OSUNLPgorPEJMVVJCPkRhbXBpbmcuPC9CTFVSQj4KKzxERUZBVUxUPjAsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1wbGF0ZTo6RHJ5LXdldC1taXg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Ecnktd2V0LW1peDwvTklDSz4KKzxCTFVSQj5Ecnktd2V0LW1peC48L0JMVVJCPgorPERFRkFVTFQ+MCwyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBsYXRlOjpSZXZlcmItdGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSw4LDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmV2ZXJiLXRpbWU8L05JQ0s+Cis8QkxVUkI+UmV2ZXJiLXRpbWUuPC9CTFVSQj4KKzxERUZBVUxUPjQsMjU1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGlvZGU6Ok1vZGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsM108L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Nb2RlPC9OSUNLPgorPEJMVVJCPk1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIxMDA6Ok1hdGNoLVJhbmdlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5NYXRjaC1SYW5nZTwvTklDSz4KKzxCTFVSQj5NYXRjaC1SYW5nZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6TW9kZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Nb2RlPC9OSUNLPgorPEJMVVJCPk1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIxMDA6OlF1YW50aXNlLVJhbmdlLU1heGltdW08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UXVhbnRpc2UtUmFuZ2UtTWF4aW11bTwvTklDSz4KKzxCTFVSQj5RdWFudGlzZS1SYW5nZS1NYXhpbXVtLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIxMDA6OlF1YW50aXNlLVJhbmdlLU1pbmltdW08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UXVhbnRpc2UtUmFuZ2UtTWluaW11bTwvTklDSz4KKzxCTFVSQj5RdWFudGlzZS1SYW5nZS1NaW5pbXVtLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIxMDA6OlN0ZXBzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSwxMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3RlcHM8L05JQ0s+Cis8QkxVUkI+U3RlcHMuPC9CTFVSQj4KKzxERUZBVUxUPjEwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0wPC9OSUNLPgorPEJMVVJCPlZhbHVlLTAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0xPC9OSUNLPgorPEJMVVJCPlZhbHVlLTEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0yPC9OSUNLPgorPEJMVVJCPlZhbHVlLTIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0zPC9OSUNLPgorPEJMVVJCPlZhbHVlLTMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS00PC9OSUNLPgorPEJMVVJCPlZhbHVlLTQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS01PC9OSUNLPgorPEJMVVJCPlZhbHVlLTUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNTAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNTEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNTIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNTMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNTQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNTUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNTYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNTcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNTguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNTkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS02PC9OSUNLPgorPEJMVVJCPlZhbHVlLTYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNjA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNjAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNjE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNjEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNjI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNjIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNjM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNjMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNjQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNjQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNjU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNjUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNjY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNjYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNjc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNjcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNjg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNjguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNjk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNjkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS03PC9OSUNLPgorPEJMVVJCPlZhbHVlLTcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNzAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNzEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNzIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNzMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNzQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNzUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNzYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNzcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNzguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNzkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS04PC9OSUNLPgorPEJMVVJCPlZhbHVlLTguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtODAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtODEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtODIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtODMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtODQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtODUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtODYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtODcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtODguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtODkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS05PC9OSUNLPgorPEJMVVJCPlZhbHVlLTkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtOTA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOTAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtOTE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOTEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtOTI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOTIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtOTM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOTMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtOTQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOTQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtOTU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOTUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtOTY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOTYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtOTc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOTcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtOTg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOTguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtOTk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOTkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC10dWJld2FybXRoOjpEcml2ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRyaXZlPC9OSUNLPgorPEJMVVJCPkRyaXZlLjwvQkxVUkI+Cis8REVGQVVMVD4yLDU3NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC10dWJld2FybXRoOjpUYXBlLS1UdWJlLUJsZW5kPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMTAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGFwZS0tVHViZS1CbGVuZDwvTklDSz4KKzxCTFVSQj5UYXBlLS1UdWJlLUJsZW5kLjwvQkxVUkI+Cis8REVGQVVMVD4xMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1yZXNscDo6RnJlcXVlbmN5LU9mZnNldDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMjAsMjAwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LU9mZnNldDwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3ktT2Zmc2V0LjwvQkxVUkI+Cis8REVGQVVMVD4yMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1yZXNscDo6RnJlcXVlbmN5LVBpdGNoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMiwyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS1QaXRjaDwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3ktUGl0Y2guPC9CTFVSQj4KKzxERUZBVUxUPi0yPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLXJlc2xwOjpHYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+R2FpbjwvTklDSz4KKzxCTFVSQj5HYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLXJlc2xwOjpSZXNvbmFuY2UtT2Zmc2V0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc29uYW5jZS1PZmZzZXQ8L05JQ0s+Cis8QkxVUkI+UmVzb25hbmNlLU9mZnNldC48L0JMVVJCPgorPERFRkFVTFQ+MCwwMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtbHA6OkZyZXF1ZW5jeS1PZmZzZXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIwLDIwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS1PZmZzZXQ8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LU9mZnNldC48L0JMVVJCPgorPERFRkFVTFQ+MjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtbHA6OkZyZXF1ZW5jeS1QaXRjaDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTIsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3ktUGl0Y2g8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LVBpdGNoLjwvQkxVUkI+Cis8REVGQVVMVD4tMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1scDo6R2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkdhaW48L05JQ0s+Cis8QkxVUkI+R2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1scDo6UmVzb25hbmNlLU9mZnNldDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2UtT2Zmc2V0PC9OSUNLPgorPEJMVVJCPlJlc29uYW5jZS1PZmZzZXQuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLWhwOjpGcmVxdWVuY3ktT2Zmc2V0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyMCwyMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3ktT2Zmc2V0PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS1PZmZzZXQuPC9CTFVSQj4KKzxERUZBVUxUPjIwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLWhwOjpGcmVxdWVuY3ktUGl0Y2g8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LVBpdGNoPC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS1QaXRjaC48L0JMVVJCPgorPERFRkFVTFQ+LTI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtaHA6OkdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5HYWluPC9OSUNLPgorPEJMVVJCPkdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtaHA6OlJlc29uYW5jZS1PZmZzZXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDAxLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVzb25hbmNlLU9mZnNldDwvTklDSz4KKzxCTFVSQj5SZXNvbmFuY2UtT2Zmc2V0LjwvQkxVUkI+Cis8REVGQVVMVD4wLDAwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1icDE6OkZyZXF1ZW5jeS1PZmZzZXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIwLDIwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS1PZmZzZXQ8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LU9mZnNldC48L0JMVVJCPgorPERFRkFVTFQ+MjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtYnAxOjpGcmVxdWVuY3ktUGl0Y2g8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LVBpdGNoPC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS1QaXRjaC48L0JMVVJCPgorPERFRkFVTFQ+LTI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtYnAxOjpHYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+R2FpbjwvTklDSz4KKzxCTFVSQj5HYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLWJwMTo6UmVzb25hbmNlLU9mZnNldDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2UtT2Zmc2V0PC9OSUNLPgorPEJMVVJCPlJlc29uYW5jZS1PZmZzZXQuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLWJwMjo6RnJlcXVlbmN5LU9mZnNldDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMjAsMjAwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LU9mZnNldDwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3ktT2Zmc2V0LjwvQkxVUkI+Cis8REVGQVVMVD4yMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1icDI6OkZyZXF1ZW5jeS1QaXRjaDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTIsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3ktUGl0Y2g8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LVBpdGNoLjwvQkxVUkI+Cis8REVGQVVMVD4tMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1icDI6OkdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5HYWluPC9OSUNLPgorPEJMVVJCPkdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtYnAyOjpSZXNvbmFuY2UtT2Zmc2V0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc29uYW5jZS1PZmZzZXQ8L05JQ0s+Cis8QkxVUkI+UmVzb25hbmNlLU9mZnNldC48L0JMVVJCPgorPERFRkFVTFQ+MCwwMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2Ytbm90Y2g6OkZyZXF1ZW5jeS1PZmZzZXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIwLDIwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS1PZmZzZXQ8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LU9mZnNldC48L0JMVVJCPgorPERFRkFVTFQ+MjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2Ytbm90Y2g6OkZyZXF1ZW5jeS1QaXRjaDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTIsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3ktUGl0Y2g8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LVBpdGNoLjwvQkxVUkI+Cis8REVGQVVMVD4tMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1ub3RjaDo6R2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkdhaW48L05JQ0s+Cis8QkxVUkI+R2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1ub3RjaDo6UmVzb25hbmNlLU9mZnNldDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2UtT2Zmc2V0PC9OSUNLPgorPEJMVVJCPlJlc29uYW5jZS1PZmZzZXQuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLXBlYWtlcTo6RnJlcXVlbmN5LU9mZnNldDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMjAsMjAwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LU9mZnNldDwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3ktT2Zmc2V0LjwvQkxVUkI+Cis8REVGQVVMVD4yMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1wZWFrZXE6OkZyZXF1ZW5jeS1QaXRjaDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTIsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3ktUGl0Y2g8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LVBpdGNoLjwvQkxVUkI+Cis8REVGQVVMVD4tMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1wZWFrZXE6OkdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5HYWluPC9OSUNLPgorPEJMVVJCPkdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtcGVha2VxOjpSZXNvbmFuY2UtT2Zmc2V0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc29uYW5jZS1PZmZzZXQ8L05JQ0s+Cis8QkxVUkI+UmVzb25hbmNlLU9mZnNldC48L0JMVVJCPgorPERFRkFVTFQ+MCwwMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtcGVha2VxOjpkQmdhaW4tT2Zmc2V0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls2LDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmRCZ2Fpbi1PZmZzZXQ8L05JQ0s+Cis8QkxVUkI+ZEJnYWluLU9mZnNldC48L0JMVVJCPgorPERFRkFVTFQ+NjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1sc2hlbGY6OkZyZXF1ZW5jeS1PZmZzZXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIwLDIwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS1PZmZzZXQ8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LU9mZnNldC48L0JMVVJCPgorPERFRkFVTFQ+MjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtbHNoZWxmOjpGcmVxdWVuY3ktUGl0Y2g8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LVBpdGNoPC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS1QaXRjaC48L0JMVVJCPgorPERFRkFVTFQ+LTI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtbHNoZWxmOjpHYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+R2FpbjwvTklDSz4KKzxCTFVSQj5HYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLWxzaGVsZjo6UmVzb25hbmNlLU9mZnNldDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2UtT2Zmc2V0PC9OSUNLPgorPEJMVVJCPlJlc29uYW5jZS1PZmZzZXQuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLWxzaGVsZjo6ZEJnYWluLU9mZnNldDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNiwyNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5kQmdhaW4tT2Zmc2V0PC9OSUNLPgorPEJMVVJCPmRCZ2Fpbi1PZmZzZXQuPC9CTFVSQj4KKzxERUZBVUxUPjY8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtaHNoZWxmOjpGcmVxdWVuY3ktT2Zmc2V0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyMCwyMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3ktT2Zmc2V0PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS1PZmZzZXQuPC9CTFVSQj4KKzxERUZBVUxUPjIwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLWhzaGVsZjo6RnJlcXVlbmN5LVBpdGNoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMiwyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS1QaXRjaDwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3ktUGl0Y2guPC9CTFVSQj4KKzxERUZBVUxUPi0yPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLWhzaGVsZjo6R2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkdhaW48L05JQ0s+Cis8QkxVUkI+R2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1oc2hlbGY6OlJlc29uYW5jZS1PZmZzZXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDAxLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVzb25hbmNlLU9mZnNldDwvTklDSz4KKzxCTFVSQj5SZXNvbmFuY2UtT2Zmc2V0LjwvQkxVUkI+Cis8REVGQVVMVD4wLDAwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1oc2hlbGY6OmRCZ2Fpbi1PZmZzZXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzYsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZEJnYWluLU9mZnNldDwvTklDSz4KKzxCTFVSQj5kQmdhaW4tT2Zmc2V0LjwvQkxVUkI+Cis8REVGQVVMVD42PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2F0YW5NYXhpbWlzZXI6OkRlY2F5LXRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVjYXktdGltZTwvTklDSz4KKzxCTFVSQj5EZWNheS10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD4zMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNhdGFuTWF4aW1pc2VyOjpLbmVlLXBvaW50PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOTAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5LbmVlLXBvaW50PC9OSUNLPgorPEJMVVJCPktuZWUtcG9pbnQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zeW5jcHVsc2UtZmNwY2dhLW9hOjpGcmVxdWVuejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw2NF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuejwvTklDSz4KKzxCTFVSQj5GcmVxdWVuei48L0JMVVJCPgorPERFRkFVTFQ+MTY8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zeW5jcHVsc2UtZmNwY2dhLW9hOjpQdWxzZS1XaWR0aDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlB1bHNlLVdpZHRoPC9OSUNLPgorPEJMVVJCPlB1bHNlLVdpZHRoLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmFuc2llbnQ6OkF0dGFjay1zcGVlZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BdHRhY2stc3BlZWQ8L05JQ0s+Cis8QkxVUkI+QXR0YWNrLXNwZWVkLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJhbnNpZW50OjpTdXN0YWluLXRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3VzdGFpbi10aW1lPC9OSUNLPgorPEJMVVJCPlN1c3RhaW4tdGltZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjMzo6QXR0YWNrLXRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIsNDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkF0dGFjay10aW1lPC9OSUNLPgorPEJMVVJCPkF0dGFjay10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD4xMDEsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjMzo6Q2hhaW4tYmFsYW5jZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkNoYWluLWJhbGFuY2U8L05JQ0s+Cis8QkxVUkI+Q2hhaW4tYmFsYW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjMzo6S25lZS1yYWRpdXM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+S25lZS1yYWRpdXM8L05JQ0s+Cis8QkxVUkI+S25lZS1yYWRpdXMuPC9CTFVSQj4KKzxERUZBVUxUPjMsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zYzM6Ok1ha2V1cC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1ha2V1cC1nYWluPC9OSUNLPgorPEJMVVJCPk1ha2V1cC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2MzOjpSYXRpbzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SYXRpbzwvTklDSz4KKzxCTFVSQj5SYXRpby48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjMzo6UmVsZWFzZS10aW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyLDgwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZWxlYXNlLXRpbWU8L05JQ0s+Cis8QkxVUkI+UmVsZWFzZS10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD40MDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zYzM6OlRocmVzaG9sZC1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTMwLDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGhyZXNob2xkLWxldmVsPC9OSUNLPgorPEJMVVJCPlRocmVzaG9sZC1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1zaWdtb2lkOjpQb3N0LUdhaW4tLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTkwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlBvc3QtR2Fpbi0tZEItPC9OSUNLPgorPEJMVVJCPlBvc3QtR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLXNpZ21vaWQ6OlByZS1HYWluLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy05MCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5QcmUtR2Fpbi0tZEItPC9OSUNLPgorPEJMVVJCPlByZS1HYWluLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbmFsb2d1ZU9zYzo6RnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDA0NDEsMjIwMDUsOV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD40NDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbmFsb2d1ZU9zYzo6SW5zdGFiaWxpdHk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5JbnN0YWJpbGl0eTwvTklDSz4KKzxCTFVSQj5JbnN0YWJpbGl0eS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlT3NjOjpXYXJtdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5XYXJtdGg8L05JQ0s+Cis8QkxVUkI+V2FybXRoLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWVPc2M6OldhdmVmb3JtPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSw0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldhdmVmb3JtPC9OSUNLPgorPEJMVVJCPldhdmVmb3JtLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYWRzcjo6QWJrbGluZ3plaXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkFia2xpbmd6ZWl0PC9OSUNLPgorPEJMVVJCPkFia2xpbmd6ZWl0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYWRzcjo6QXVza2xpbmd6ZWl0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BdXNrbGluZ3plaXQ8L05JQ0s+Cis8QkxVUkI+QXVza2xpbmd6ZWl0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYWRzcjo6RWluc2Nod2luZ3plaXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkVpbnNjaHdpbmd6ZWl0PC9OSUNLPgorPEJMVVJCPkVpbnNjaHdpbmd6ZWl0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYWRzcjo6SGFsdGV3ZXJ0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SGFsdGV3ZXJ0PC9OSUNLPgorPEJMVVJCPkhhbHRld2VydC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFkc3I6OlRyaWdnZXItVGhyZXNob2xkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRyaWdnZXItVGhyZXNob2xkPC9OSUNLPgorPEJMVVJCPlRyaWdnZXItVGhyZXNob2xkLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zaWZ0ZXI6OlNpZnQtc2l6ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwxMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNpZnQtc2l6ZTwvTklDSz4KKzxCTFVSQj5TaWZ0LXNpemUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hZHNyLWcrdDo6QWJrbGluZ3plaXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkFia2xpbmd6ZWl0PC9OSUNLPgorPEJMVVJCPkFia2xpbmd6ZWl0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYWRzci1nK3Q6OkF1c2tsaW5nemVpdDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QXVza2xpbmd6ZWl0PC9OSUNLPgorPEJMVVJCPkF1c2tsaW5nemVpdC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFkc3ItZyt0OjpFaW5zY2h3aW5nemVpdDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RWluc2Nod2luZ3plaXQ8L05JQ0s+Cis8QkxVUkI+RWluc2Nod2luZ3plaXQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hZHNyLWcrdDo6SGFsdGV3ZXJ0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SGFsdGV3ZXJ0PC9OSUNLPgorPEJMVVJCPkhhbHRld2VydC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXJhdGlvLW5hZGMtb2E6OkRlbm9taW5hdG9yPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbm9taW5hdG9yPC9OSUNLPgorPEJMVVJCPkRlbm9taW5hdG9yLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1yYXRpby1uY2RhLW9hOjpOdW1lcmF0b3I8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TnVtZXJhdG9yPC9OSUNLPgorPEJMVVJCPk51bWVyYXRvci48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmF0aW8tbmNkYy1vYzo6RGVub21pbmF0b3I8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVub21pbmF0b3I8L05JQ0s+Cis8QkxVUkI+RGVub21pbmF0b3IuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXJhdGlvLW5jZGMtb2M6Ok51bWVyYXRvcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5OdW1lcmF0b3I8L05JQ0s+Cis8QkxVUkI+TnVtZXJhdG9yLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1yYXRpby1uY2RjLW9jOjpSYXRpby1PdXRwdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPlJhdGlvLU91dHB1dDwvTklDSz4KKzxCTFVSQj5SYXRpby1PdXRwdXQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdpYW50RmxhbmdlOjpEZWxheS0xLXJhbmdlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktMS1yYW5nZTwvTklDSz4KKzxCTFVSQj5EZWxheS0xLXJhbmdlLjwvQkxVUkI+Cis8REVGQVVMVD4yLDYyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdpYW50RmxhbmdlOjpEZWxheS0yLXJhbmdlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktMi1yYW5nZTwvTklDSz4KKzxCTFVSQj5EZWxheS0yLXJhbmdlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ2lhbnRGbGFuZ2U6OkRvdWJsZS1kZWxheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Eb3VibGUtZGVsYXk8L05JQ0s+Cis8QkxVUkI+RG91YmxlLWRlbGF5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1naWFudEZsYW5nZTo6RHJ5LVdldC1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRyeS1XZXQtbGV2ZWw8L05JQ0s+Cis8QkxVUkI+RHJ5LVdldC1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdpYW50RmxhbmdlOjpGZWVkYmFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEwMCwxMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+RmVlZGJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1naWFudEZsYW5nZTo6TEZPLWZyZXF1ZW5jeS0xPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxGTy1mcmVxdWVuY3ktMTwvTklDSz4KKzxCTFVSQj5MRk8tZnJlcXVlbmN5LTEuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1naWFudEZsYW5nZTo6TEZPLWZyZXF1ZW5jeS0yPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxGTy1mcmVxdWVuY3ktMjwvTklDSz4KKzxCTFVSQj5MRk8tZnJlcXVlbmN5LTIuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zdmY6OkZpbHRlci1RPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdGVyLVE8L05JQ0s+Cis8QkxVUkI+RmlsdGVyLVEuPC9CTFVSQj4KKzxERUZBVUxUPjAsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zdmY6OkZpbHRlci1mcmVxPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDYwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdGVyLWZyZXE8L05JQ0s+Cis8QkxVUkI+RmlsdGVyLWZyZXEuPC9CTFVSQj4KKzxERUZBVUxUPjQ0MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXN2Zjo6RmlsdGVyLXJlc29uYW5jZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHRlci1yZXNvbmFuY2U8L05JQ0s+Cis8QkxVUkI+RmlsdGVyLXJlc29uYW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXN2Zjo6RmlsdGVyLXR5cGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdGVyLXR5cGU8L05JQ0s+Cis8QkxVUkI+RmlsdGVyLXR5cGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1scDRwb2xlLWZjcmNpYS1vYTo6Q3V0b2ZmLUZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw5MTg3NSwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5DdXRvZmYtRnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkN1dG9mZi1GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjIyMDUwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbHA0cG9sZS1mY3JjaWEtb2E6OlJlc29uYW56PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVzb25hbno8L05JQ0s+Cis8QkxVUkI+UmVzb25hbnouPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcGl0Y2g6OkRyeS1MZXZlbC0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LUxldmVsLS1kQi08L05JQ0s+Cis8QkxVUkI+RHJ5LUxldmVsLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPi05MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1waXRjaDo6UmF0ZS1TaGlmdC0tLS08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy01MCwxMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmF0ZS1TaGlmdC0tLS08L05JQ0s+Cis8QkxVUkI+UmF0ZS1TaGlmdC0tLS0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcGl0Y2g6OlNlbWl0b25lLVNoaWZ0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMTIsMTJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U2VtaXRvbmUtU2hpZnQ8L05JQ0s+Cis8QkxVUkI+U2VtaXRvbmUtU2hpZnQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcGl0Y2g6OldldC1MZXZlbC0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+V2V0LUxldmVsLS1kQi08L05JQ0s+Cis8QkxVUkI+V2V0LUxldmVsLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcGl0Y2g6OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTYwMjddPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPmxhdGVuY3k8L05JQ0s+Cis8QkxVUkI+bGF0ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MTYwMjc8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zcXVhcmUtZmMtb2E6OkZyZXF1ZW56PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDkxODc1LDIyMDUwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW56PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW56LjwvQkxVUkI+Cis8REVGQVVMVD40NDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1iYW5kcGFzcy1hLWlpcjo6QmFuZHdpZHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls0LDQxLDE5ODQ1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmR3aWR0aDwvTklDSz4KKzxCTFVSQj5CYW5kd2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjI5NSw4MzI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1iYW5kcGFzcy1hLWlpcjo6Q2VudGVyLUZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNCw0MSwxOTg0NV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5DZW50ZXItRnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkNlbnRlci1GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjM2LDExOTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbXAtbW9ubzo6R2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+R2FpbjwvTklDSz4KKzxCTFVSQj5HYWluLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW1wLXN0ZXJlbzo6R2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+R2FpbjwvTklDSz4KKzxCTFVSQj5HYWluLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmluZ21vZC0yaTFvOjpNb2R1bGF0aW9uLWRlcHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kdWxhdGlvbi1kZXB0aDwvTklDSz4KKzxCTFVSQj5Nb2R1bGF0aW9uLWRlcHRoLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmluZ21vZC0xaTFvMWw6OkZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwxMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjQ0MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXJpbmdtb2QtMWkxbzFsOjpNb2R1bGF0aW9uLWRlcHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kdWxhdGlvbi1kZXB0aDwvTklDSz4KKzxCTFVSQj5Nb2R1bGF0aW9uLWRlcHRoLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmluZ21vZC0xaTFvMWw6OlNhd3Rvb3RoLWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNhd3Rvb3RoLWxldmVsPC9OSUNLPgorPEJMVVJCPlNhd3Rvb3RoLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmluZ21vZC0xaTFvMWw6OlNpbmUtbGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U2luZS1sZXZlbDwvTklDSz4KKzxCTFVSQj5TaW5lLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmluZ21vZC0xaTFvMWw6OlNxdWFyZS1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TcXVhcmUtbGV2ZWw8L05JQ0s+Cis8QkxVUkI+U3F1YXJlLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmluZ21vZC0xaTFvMWw6OlRyaWFuZ2xlLWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRyaWFuZ2xlLWxldmVsPC9OSUNLPgorPEJMVVJCPlRyaWFuZ2xlLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXktbjo6RGVsYXktVGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktVGltZTwvTklDSz4KKzxCTFVSQj5EZWxheS1UaW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXktbjo6TWF4LURlbGF5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5NYXgtRGVsYXk8L05JQ0s+Cis8QkxVUkI+TWF4LURlbGF5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXktbDo6RGVsYXktVGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktVGltZTwvTklDSz4KKzxCTFVSQj5EZWxheS1UaW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXktbDo6TWF4LURlbGF5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5NYXgtRGVsYXk8L05JQ0s+Cis8QkxVUkI+TWF4LURlbGF5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXktYzo6RGVsYXktVGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktVGltZTwvTklDSz4KKzxCTFVSQj5EZWxheS1UaW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXktYzo6TWF4LURlbGF5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5NYXgtRGVsYXk8L05JQ0s+Cis8QkxVUkI+TWF4LURlbGF5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm1vZC1mYW1jLW9hOjpNb2R1bGF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1vZHVsYXRpb248L05JQ0s+Cis8QkxVUkI+TW9kdWxhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm1vZC1mY21hLW9hOjpGcmVxdWVuejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw5MTg3NSwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuejwvTklDSz4KKzxCTFVSQj5GcmVxdWVuei48L0JMVVJCPgorPERFRkFVTFQ+NDQwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm1vZC1mY21jLW9jOjpGcmVxdWVuejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw5MTg3NSwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuejwvTklDSz4KKzxCTFVSQj5GcmVxdWVuei48L0JMVVJCPgorPERFRkFVTFQ+NDQwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm1vZC1mY21jLW9jOjpNb2R1bGF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1vZHVsYXRpb248L05JQ0s+Cis8QkxVUkI+TW9kdWxhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm1vZC1mY21jLW9jOjpNb2R1bGllcnRlLUZyZXF1ZW56PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5Nb2R1bGllcnRlLUZyZXF1ZW56PC9OSUNLPgorPEJMVVJCPk1vZHVsaWVydGUtRnJlcXVlbnouPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWd2ZXJiOjpEYW1waW5nPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGFtcGluZzwvTklDSz4KKzxCTFVSQj5EYW1waW5nLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1ndmVyYjo6RHJ5LXNpZ25hbC1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LXNpZ25hbC1sZXZlbDwvTklDSz4KKzxCTFVSQj5Ecnktc2lnbmFsLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4tNzA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1ndmVyYjo6RWFybHktcmVmbGVjdGlvbi1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RWFybHktcmVmbGVjdGlvbi1sZXZlbDwvTklDSz4KKzxCTFVSQj5FYXJseS1yZWZsZWN0aW9uLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ3ZlcmI6OklucHV0LWJhbmR3aWR0aDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklucHV0LWJhbmR3aWR0aDwvTklDSz4KKzxCTFVSQj5JbnB1dC1iYW5kd2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjAsNzU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1ndmVyYjo6UmV2ZXJiLXRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMSwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXZlcmItdGltZTwvTklDSz4KKzxCTFVSQj5SZXZlcmItdGltZS48L0JMVVJCPgorPERFRkFVTFQ+Nyw1NzU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1ndmVyYjo6Um9vbXNpemU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEsMzAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJvb21zaXplPC9OSUNLPgorPEJMVVJCPlJvb21zaXplLjwvQkxVUkI+Cis8REVGQVVMVD43NSw3NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWd2ZXJiOjpUYWlsLWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UYWlsLWxldmVsPC9OSUNLPgorPEJMVVJCPlRhaWwtbGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPi0xNyw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2U0OjpBbXBsaXR1ZGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy00MCwxMl08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+QW1wbGl0dWRlPC9OSUNLPgorPEJMVVJCPkFtcGxpdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+LTQwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2U0OjpBdHRhY2stdGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSw1LDQwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BdHRhY2stdGltZTwvTklDSz4KKzxCTFVSQj5BdHRhY2stdGltZS48L0JMVVJCPgorPERFRkFVTFQ+MTAxLDEyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlNDo6QXR0ZW51YXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yNCwwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkF0dGVudWF0aW9uPC9OSUNLPgorPEJMVVJCPkF0dGVudWF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2U0OjpHYWluLWV4cGFuc2lvbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyNF08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+R2Fpbi1leHBhbnNpb248L05JQ0s+Cis8QkxVUkI+R2Fpbi1leHBhbnNpb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZTQ6OktuZWUtcmFkaXVzPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPktuZWUtcmFkaXVzPC9OSUNLPgorPEJMVVJCPktuZWUtcmFkaXVzLjwvQkxVUkI+Cis8REVGQVVMVD4zLDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2U0OjpSTVMtcGVhazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJNUy1wZWFrPC9OSUNLPgorPEJMVVJCPlJNUy1wZWFrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2U0OjpSYXRpbzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SYXRpbzwvTklDSz4KKzxCTFVSQj5SYXRpby48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlNDo6UmVsZWFzZS10aW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyLDgwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZWxlYXNlLXRpbWU8L05JQ0s+Cis8QkxVUkI+UmVsZWFzZS10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD40MDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZTQ6OlRocmVzaG9sZC1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTMwLDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGhyZXNob2xkLWxldmVsPC9OSUNLPgorPEJMVVJCPlRocmVzaG9sZC1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLWRhbXBpbmc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Jbm5lci1kYW1waW5nPC9OSUNLPgorPEJMVVJCPklubmVyLWRhbXBpbmcuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXNpemUtMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklubmVyLXNpemUtMTwvTklDSz4KKzxCTFVSQj5Jbm5lci1zaXplLTEuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXNpemUtMjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklubmVyLXNpemUtMjwvTklDSz4KKzxCTFVSQj5Jbm5lci1zaXplLTIuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXNpemUtMzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklubmVyLXNpemUtMzwvTklDSz4KKzxCTFVSQj5Jbm5lci1zaXplLTMuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXNpemUtNDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklubmVyLXNpemUtNDwvTklDSz4KKzxCTFVSQj5Jbm5lci1zaXplLTQuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXN0aWZmbmVzcy0xLS08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Jbm5lci1zdGlmZm5lc3MtMS0tPC9OSUNLPgorPEJMVVJCPklubmVyLXN0aWZmbmVzcy0xLS0uPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXN0aWZmbmVzcy0xLS0tMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklubmVyLXN0aWZmbmVzcy0xLS0tMTwvTklDSz4KKzxCTFVSQj5Jbm5lci1zdGlmZm5lc3MtMS0tLTEuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXN0aWZmbmVzcy0yLS08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Jbm5lci1zdGlmZm5lc3MtMi0tPC9OSUNLPgorPEJMVVJCPklubmVyLXN0aWZmbmVzcy0yLS0uPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXN0aWZmbmVzcy0yLS0tMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklubmVyLXN0aWZmbmVzcy0yLS0tMTwvTklDSz4KKzxCTFVSQj5Jbm5lci1zdGlmZm5lc3MtMi0tLTEuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXN0aWZmbmVzcy0zLS08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Jbm5lci1zdGlmZm5lc3MtMy0tPC9OSUNLPgorPEJMVVJCPklubmVyLXN0aWZmbmVzcy0zLS0uPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXN0aWZmbmVzcy0zLS0tMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklubmVyLXN0aWZmbmVzcy0zLS0tMTwvTklDSz4KKzxCTFVSQj5Jbm5lci1zdGlmZm5lc3MtMy0tLTEuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXN0aWZmbmVzcy00LS08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Jbm5lci1zdGlmZm5lc3MtNC0tPC9OSUNLPgorPEJMVVJCPklubmVyLXN0aWZmbmVzcy00LS0uPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXN0aWZmbmVzcy00LS0tMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklubmVyLXN0aWZmbmVzcy00LS0tMTwvTklDSz4KKzxCTFVSQj5Jbm5lci1zdGlmZm5lc3MtNC0tLTEuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6Ok1pYy1wb3NpdGlvbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1pYy1wb3NpdGlvbjwvTklDSz4KKzxCTFVSQj5NaWMtcG9zaXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjAsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1kYW1waW5nPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0ZXItZGFtcGluZzwvTklDSz4KKzxCTFVSQj5PdXRlci1kYW1waW5nLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zaXplLTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRlci1zaXplLTE8L05JQ0s+Cis8QkxVUkI+T3V0ZXItc2l6ZS0xLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zaXplLTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRlci1zaXplLTI8L05JQ0s+Cis8QkxVUkI+T3V0ZXItc2l6ZS0yLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zaXplLTM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRlci1zaXplLTM8L05JQ0s+Cis8QkxVUkI+T3V0ZXItc2l6ZS0zLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zaXplLTQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRlci1zaXplLTQ8L05JQ0s+Cis8QkxVUkI+T3V0ZXItc2l6ZS00LjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zdGlmZm5lc3MtMS0tPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0ZXItc3RpZmZuZXNzLTEtLTwvTklDSz4KKzxCTFVSQj5PdXRlci1zdGlmZm5lc3MtMS0tLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zdGlmZm5lc3MtMS0tLTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRlci1zdGlmZm5lc3MtMS0tLTE8L05JQ0s+Cis8QkxVUkI+T3V0ZXItc3RpZmZuZXNzLTEtLS0xLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zdGlmZm5lc3MtMi0tPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0ZXItc3RpZmZuZXNzLTItLTwvTklDSz4KKzxCTFVSQj5PdXRlci1zdGlmZm5lc3MtMi0tLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zdGlmZm5lc3MtMi0tLTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRlci1zdGlmZm5lc3MtMi0tLTE8L05JQ0s+Cis8QkxVUkI+T3V0ZXItc3RpZmZuZXNzLTItLS0xLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zdGlmZm5lc3MtMy0tPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0ZXItc3RpZmZuZXNzLTMtLTwvTklDSz4KKzxCTFVSQj5PdXRlci1zdGlmZm5lc3MtMy0tLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zdGlmZm5lc3MtMy0tLTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRlci1zdGlmZm5lc3MtMy0tLTE8L05JQ0s+Cis8QkxVUkI+T3V0ZXItc3RpZmZuZXNzLTMtLS0xLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zdGlmZm5lc3MtNC0tPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0ZXItc3RpZmZuZXNzLTQtLTwvTklDSz4KKzxCTFVSQj5PdXRlci1zdGlmZm5lc3MtNC0tLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zdGlmZm5lc3MtNC0tLTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRlci1zdGlmZm5lc3MtNC0tLTE8L05JQ0s+Cis8QkxVUkI+T3V0ZXItc3RpZmZuZXNzLTQtLS0xLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1lbmNvZGUtYmZvcm1hdDo6U291bmQtU291cmNlLVgtQ29vcmRpbmF0ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Tb3VuZC1Tb3VyY2UtWC1Db29yZGluYXRlPC9OSUNLPgorPEJMVVJCPlNvdW5kLVNvdXJjZS1YLUNvb3JkaW5hdGUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1lbmNvZGUtYmZvcm1hdDo6U291bmQtU291cmNlLVktQ29vcmRpbmF0ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Tb3VuZC1Tb3VyY2UtWS1Db29yZGluYXRlPC9OSUNLPgorPEJMVVJCPlNvdW5kLVNvdXJjZS1ZLUNvb3JkaW5hdGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1lbmNvZGUtYmZvcm1hdDo6U291bmQtU291cmNlLVotQ29vcmRpbmF0ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Tb3VuZC1Tb3VyY2UtWi1Db29yZGluYXRlPC9OSUNLPgorPEJMVVJCPlNvdW5kLVNvdXJjZS1aLUNvb3JkaW5hdGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1lbmNvZGUtZm1oOjpTb3VuZC1Tb3VyY2UtWC1Db29yZGluYXRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNvdW5kLVNvdXJjZS1YLUNvb3JkaW5hdGU8L05JQ0s+Cis8QkxVUkI+U291bmQtU291cmNlLVgtQ29vcmRpbmF0ZS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWVuY29kZS1mbWg6OlNvdW5kLVNvdXJjZS1ZLUNvb3JkaW5hdGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U291bmQtU291cmNlLVktQ29vcmRpbmF0ZTwvTklDSz4KKzxCTFVSQj5Tb3VuZC1Tb3VyY2UtWS1Db29yZGluYXRlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZW5jb2RlLWZtaDo6U291bmQtU291cmNlLVotQ29vcmRpbmF0ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Tb3VuZC1Tb3VyY2UtWi1Db29yZGluYXRlPC9OSUNLPgorPEJMVVJCPlNvdW5kLVNvdXJjZS1aLUNvb3JkaW5hdGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1iZi1yb3RhdGUtejo6QW5nbGUtb2YtUm90YXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xODAsMTgwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkFuZ2xlLW9mLVJvdGF0aW9uPC9OSUNLPgorPEJMVVJCPkFuZ2xlLW9mLVJvdGF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD45MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZtaC1yb3RhdGUtejo6QW5nbGUtb2YtUm90YXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xODAsMTgwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkFuZ2xlLW9mLVJvdGF0aW9uPC9OSUNLPgorPEJMVVJCPkFuZ2xlLW9mLVJvdGF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD45MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlOjpEQ08xLUF0dGFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzEtQXR0YWNrPC9OSUNLPgorPEJMVVJCPkRDTzEtQXR0YWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkRDTzEtRGVjYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08xLURlY2F5PC9OSUNLPgorPEJMVVJCPkRDTzEtRGVjYXkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbmFsb2d1ZTo6RENPMS1MRk8tRnJlcXVlbmN5LU1vZHVsYXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMS1MRk8tRnJlcXVlbmN5LU1vZHVsYXRpb248L05JQ0s+Cis8QkxVUkI+RENPMS1MRk8tRnJlcXVlbmN5LU1vZHVsYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPi0yPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkRDTzEtTEZPLVB1bHNlLVdpZHRoLU1vZHVsYXRpb248L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMS1MRk8tUHVsc2UtV2lkdGgtTW9kdWxhdGlvbjwvTklDSz4KKzxCTFVSQj5EQ08xLUxGTy1QdWxzZS1XaWR0aC1Nb2R1bGF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkRDTzEtT2N0YXZlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzEtT2N0YXZlPC9OSUNLPgorPEJMVVJCPkRDTzEtT2N0YXZlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlOjpEQ08xLVJlbGVhc2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08xLVJlbGVhc2U8L05JQ0s+Cis8QkxVUkI+RENPMS1SZWxlYXNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkRDTzEtU3VzdGFpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzEtU3VzdGFpbjwvTklDSz4KKzxCTFVSQj5EQ08xLVN1c3RhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbmFsb2d1ZTo6RENPMS1XYXZlZm9ybTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08xLVdhdmVmb3JtPC9OSUNLPgorPEJMVVJCPkRDTzEtV2F2ZWZvcm0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbmFsb2d1ZTo6RENPMi1BdHRhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08yLUF0dGFjazwvTklDSz4KKzxCTFVSQj5EQ08yLUF0dGFjay48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlOjpEQ08yLURlY2F5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMi1EZWNheTwvTklDSz4KKzxCTFVSQj5EQ08yLURlY2F5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkRDTzItTEZPLUZyZXF1ZW5jeS1Nb2R1bGF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMiwyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzItTEZPLUZyZXF1ZW5jeS1Nb2R1bGF0aW9uPC9OSUNLPgorPEJMVVJCPkRDTzItTEZPLUZyZXF1ZW5jeS1Nb2R1bGF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4tMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlOjpEQ08yLUxGTy1QdWxzZS1XaWR0aC1Nb2R1bGF0aW9uPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzItTEZPLVB1bHNlLVdpZHRoLU1vZHVsYXRpb248L05JQ0s+Cis8QkxVUkI+RENPMi1MRk8tUHVsc2UtV2lkdGgtTW9kdWxhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlOjpEQ08yLU9jdGF2ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzItT2N0YXZlPC9OSUNLPgorPEJMVVJCPkRDTzItT2N0YXZlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkRDTzItUmVsZWFzZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzItUmVsZWFzZTwvTklDSz4KKzxCTFVSQj5EQ08yLVJlbGVhc2UuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbmFsb2d1ZTo6RENPMi1TdXN0YWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMi1TdXN0YWluPC9OSUNLPgorPEJMVVJCPkRDTzItU3VzdGFpbi48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlOjpEQ08yLVdhdmVmb3JtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMi1XYXZlZm9ybTwvTklDSz4KKzxCTFVSQj5EQ08yLVdhdmVmb3JtLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkZpbHRlci1BdHRhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWx0ZXItQXR0YWNrPC9OSUNLPgorPEJMVVJCPkZpbHRlci1BdHRhY2suPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbmFsb2d1ZTo6RmlsdGVyLURlY2F5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdGVyLURlY2F5PC9OSUNLPgorPEJMVVJCPkZpbHRlci1EZWNheS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlOjpGaWx0ZXItRW52ZWxvcGUtTW9kdWxhdGlvbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWx0ZXItRW52ZWxvcGUtTW9kdWxhdGlvbjwvTklDSz4KKzxCTFVSQj5GaWx0ZXItRW52ZWxvcGUtTW9kdWxhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlOjpGaWx0ZXItTEZPLU1vZHVsYXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWx0ZXItTEZPLU1vZHVsYXRpb248L05JQ0s+Cis8QkxVUkI+RmlsdGVyLUxGTy1Nb2R1bGF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkZpbHRlci1SZWxlYXNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdGVyLVJlbGVhc2U8L05JQ0s+Cis8QkxVUkI+RmlsdGVyLVJlbGVhc2UuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbmFsb2d1ZTo6RmlsdGVyLVJlc29uYW5jZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHRlci1SZXNvbmFuY2U8L05JQ0s+Cis8QkxVUkI+RmlsdGVyLVJlc29uYW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlOjpGaWx0ZXItU3VzdGFpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHRlci1TdXN0YWluPC9OSUNLPgorPEJMVVJCPkZpbHRlci1TdXN0YWluLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkdhdGU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5HYXRlPC9OSUNLPgorPEJMVVJCPkdhdGUuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkxGTy1GYWRlaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MRk8tRmFkZWluPC9OSUNLPgorPEJMVVJCPkxGTy1GYWRlaW4uPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbmFsb2d1ZTo6TEZPLUZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxGTy1GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+TEZPLUZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlOjpWZWxvY2l0eTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZlbG9jaXR5PC9OSUNLPgorPEJMVVJCPlZlbG9jaXR5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtY2FueW9uLWRlbGF5OjpMZWZ0LXRvLVJpZ2h0LUZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxlZnQtdG8tUmlnaHQtRmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+TGVmdC10by1SaWdodC1GZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+LTE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jYW55b24tZGVsYXk6OkxlZnQtdG8tUmlnaHQtVGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSwwLDk5XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxlZnQtdG8tUmlnaHQtVGltZTwvTklDSz4KKzxCTFVSQj5MZWZ0LXRvLVJpZ2h0LVRpbWUuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jYW55b24tZGVsYXk6Okxvdy1QYXNzLUN1dG9mZjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSw1MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxvdy1QYXNzLUN1dG9mZjwvTklDSz4KKzxCTFVSQj5Mb3ctUGFzcy1DdXRvZmYuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jYW55b24tZGVsYXk6OlJpZ2h0LXRvLUxlZnQtRmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmlnaHQtdG8tTGVmdC1GZWVkYmFjazwvTklDSz4KKzxCTFVSQj5SaWdodC10by1MZWZ0LUZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4tMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWNhbnlvbi1kZWxheTo6UmlnaHQtdG8tTGVmdC1UaW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDAsOTldPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmlnaHQtdG8tTGVmdC1UaW1lPC9OSUNLPgorPEJMVVJCPlJpZ2h0LXRvLUxlZnQtVGltZS48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRpc2ludGVncmF0b3I6Ok11bHRpcGxpZXI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TXVsdGlwbGllcjwvTklDSz4KKzxCTFVSQj5NdWx0aXBsaWVyLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGlzaW50ZWdyYXRvcjo6UHJvYmFiaWxpdHk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Qcm9iYWJpbGl0eTwvTklDSz4KKzxCTFVSQj5Qcm9iYWJpbGl0eS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNsZWRnZWhhbW1lcjo6Q2Fycmllci1pbmZsdWVuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Q2Fycmllci1pbmZsdWVuY2U8L05JQ0s+Cis8QkxVUkI+Q2Fycmllci1pbmZsdWVuY2UuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zbGVkZ2VoYW1tZXI6Ok1vZHVsYXRvci1pbmZsdWVuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kdWxhdG9yLWluZmx1ZW5jZTwvTklDSz4KKzxCTFVSQj5Nb2R1bGF0b3ItaW5mbHVlbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2xlZGdlaGFtbWVyOjpSYXRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxZS0wNSwwLDAwMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SYXRlPC9OSUNLPgorPEJMVVJCPlJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDAwNTA1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXktMC0wMXM6OkRlbGF5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAsMDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXk8L05JQ0s+Cis8QkxVUkI+RGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kZWxheS0wLTAxczo6RHJ5LVdldC1CYWxhbmNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LVdldC1CYWxhbmNlPC9OSUNLPgorPEJMVVJCPkRyeS1XZXQtQmFsYW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXktMC0xczo6RGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbGF5PC9OSUNLPgorPEJMVVJCPkRlbGF5LjwvQkxVUkI+Cis8REVGQVVMVD4wLDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kZWxheS0wLTFzOjpEcnktV2V0LUJhbGFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EcnktV2V0LUJhbGFuY2U8L05JQ0s+Cis8QkxVUkI+RHJ5LVdldC1CYWxhbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kZWxheS0xczo6RGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheTwvTklDSz4KKzxCTFVSQj5EZWxheS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRlbGF5LTFzOjpEcnktV2V0LUJhbGFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EcnktV2V0LUJhbGFuY2U8L05JQ0s+Cis8QkxVUkI+RHJ5LVdldC1CYWxhbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kZWxheS01czo6RGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheTwvTklDSz4KKzxCTFVSQj5EZWxheS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRlbGF5LTVzOjpEcnktV2V0LUJhbGFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EcnktV2V0LUJhbGFuY2U8L05JQ0s+Cis8QkxVUkI+RHJ5LVdldC1CYWxhbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kZWxheS02MHM6OkRlbGF5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDYwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbGF5PC9OSUNLPgorPEJMVVJCPkRlbGF5LjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXktNjBzOjpEcnktV2V0LUJhbGFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EcnktV2V0LUJhbGFuY2U8L05JQ0s+Cis8QkxVUkI+RHJ5LVdldC1CYWxhbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmFjay1tYXgtcGVhazo6RW52ZWxvcGUtRm9yZ2V0dGluZy1GYWN0b3I8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkVudmVsb3BlLUZvcmdldHRpbmctRmFjdG9yPC9OSUNLPgorPEJMVVJCPkVudmVsb3BlLUZvcmdldHRpbmctRmFjdG9yLjwvQkxVUkI+Cis8REVGQVVMVD4zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRyYWNrLW1heC1wZWFrOjpPdXRwdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5PdXRwdXQ8L05JQ0s+Cis8QkxVUkI+T3V0cHV0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJhY2stbWF4LXJtczo6RW52ZWxvcGUtRm9yZ2V0dGluZy1GYWN0b3I8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkVudmVsb3BlLUZvcmdldHRpbmctRmFjdG9yPC9OSUNLPgorPEJMVVJCPkVudmVsb3BlLUZvcmdldHRpbmctRmFjdG9yLjwvQkxVUkI+Cis8REVGQVVMVD4zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRyYWNrLW1heC1ybXM6Ok91dHB1dDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPk91dHB1dDwvTklDSz4KKzxCTFVSQj5PdXRwdXQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmFjay1wZWFrOjpPdXRwdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5PdXRwdXQ8L05JQ0s+Cis8QkxVUkI+T3V0cHV0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJhY2stcGVhazo6U21vb3RoaW5nLUZhY3RvcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNtb290aGluZy1GYWN0b3I8L05JQ0s+Cis8QkxVUkI+U21vb3RoaW5nLUZhY3Rvci48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRyYWNrLXJtczo6T3V0cHV0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0PC9OSUNLPgorPEJMVVJCPk91dHB1dC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRyYWNrLXJtczo6U21vb3RoaW5nLUZhY3RvcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNtb290aGluZy1GYWN0b3I8L05JQ0s+Cis8QkxVUkI+U21vb3RoaW5nLUZhY3Rvci48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZiZGVsYXktMC0wMXM6OkRlbGF5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAsMDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXk8L05JQ0s+Cis8QkxVUkI+RGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1mYmRlbGF5LTAtMDFzOjpEcnktV2V0LUJhbGFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EcnktV2V0LUJhbGFuY2U8L05JQ0s+Cis8QkxVUkI+RHJ5LVdldC1CYWxhbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1mYmRlbGF5LTAtMDFzOjpGZWVkYmFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GZWVkYmFjazwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZmJkZWxheS0wLTFzOjpEZWxheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXk8L05JQ0s+Cis8QkxVUkI+RGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjAsMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZiZGVsYXktMC0xczo6RHJ5LVdldC1CYWxhbmNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LVdldC1CYWxhbmNlPC9OSUNLPgorPEJMVVJCPkRyeS1XZXQtQmFsYW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZmJkZWxheS0wLTFzOjpGZWVkYmFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GZWVkYmFjazwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZmJkZWxheS0xczo6RGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheTwvTklDSz4KKzxCTFVSQj5EZWxheS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZiZGVsYXktMXM6OkRyeS1XZXQtQmFsYW5jZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRyeS1XZXQtQmFsYW5jZTwvTklDSz4KKzxCTFVSQj5EcnktV2V0LUJhbGFuY2UuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZiZGVsYXktMXM6OkZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPkZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1mYmRlbGF5LTVzOjpEZWxheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbGF5PC9OSUNLPgorPEJMVVJCPkRlbGF5LjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZmJkZWxheS01czo6RHJ5LVdldC1CYWxhbmNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LVdldC1CYWxhbmNlPC9OSUNLPgorPEJMVVJCPkRyeS1XZXQtQmFsYW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZmJkZWxheS01czo6RmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+RmVlZGJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZiZGVsYXktNjBzOjpEZWxheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw2MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheTwvTklDSz4KKzxCTFVSQj5EZWxheS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZiZGVsYXktNjBzOjpEcnktV2V0LUJhbGFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EcnktV2V0LUJhbGFuY2U8L05JQ0s+Cis8QkxVUkI+RHJ5LVdldC1CYWxhbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1mYmRlbGF5LTYwczo6RmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+RmVlZGJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZyZWV2ZXJiMzo6RGFtcGluZzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRhbXBpbmc8L05JQ0s+Cis8QkxVUkI+RGFtcGluZy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZyZWV2ZXJiMzo6RHJ5LUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LUxldmVsPC9OSUNLPgorPEJMVVJCPkRyeS1MZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZyZWV2ZXJiMzo6RnJlZXplLU1vZGU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVlemUtTW9kZTwvTklDSz4KKzxCTFVSQj5GcmVlemUtTW9kZS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1mcmVldmVyYjM6OlJvb20tU2l6ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJvb20tU2l6ZTwvTklDSz4KKzxCTFVSQj5Sb29tLVNpemUuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZyZWV2ZXJiMzo6V2V0LUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+V2V0LUxldmVsPC9OSUNLPgorPEJMVVJCPldldC1MZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZyZWV2ZXJiMzo6V2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5XaWR0aDwvTklDSz4KKzxCTFVSQj5XaWR0aC48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ3JhaW4tc2NhdHRlcjo6RGVuc2l0eTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVuc2l0eTwvTklDSz4KKzxCTFVSQj5EZW5zaXR5LjwvQkxVUkI+Cis8REVGQVVMVD4zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdyYWluLXNjYXR0ZXI6OkdyYWluLUF0dGFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+R3JhaW4tQXR0YWNrPC9OSUNLPgorPEJMVVJCPkdyYWluLUF0dGFjay48L0JMVVJCPgorPERFRkFVTFQ+Myw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1ncmFpbi1zY2F0dGVyOjpHcmFpbi1MZW5ndGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkdyYWluLUxlbmd0aDwvTklDSz4KKzxCTFVSQj5HcmFpbi1MZW5ndGguPC9CTFVSQj4KKzxERUZBVUxUPjMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ3JhaW4tc2NhdHRlcjo6U2NhdHRlcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNjYXR0ZXI8L05JQ0s+Cis8QkxVUkI+U2NhdHRlci48L0JMVVJCPgorPERFRkFVTFQ+Miw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGFyZC1nYXRlOjpUaHJlc2hvbGQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UaHJlc2hvbGQ8L05JQ0s+Cis8QkxVUkI+VGhyZXNob2xkLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaWRlbnRpdHktY29udHJvbDo6SW5wdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5wdXQ8L05JQ0s+Cis8QkxVUkI+SW5wdXQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWlkZW50aXR5LWNvbnRyb2w6Ok91dHB1dDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0PC9OSUNLPgorPEJMVVJCPk91dHB1dC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbG9maTo6Q3JhY2tsaW5nPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwxMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Q3JhY2tsaW5nPC9OSUNLPgorPEJMVVJCPkNyYWNrbGluZy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxvZmk6Ok9wYW1wLUJhbmR3aWR0aC1MaW1pdGluZzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwxMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PcGFtcC1CYW5kd2lkdGgtTGltaXRpbmc8L05JQ0s+Cis8QkxVUkI+T3BhbXAtQmFuZHdpZHRoLUxpbWl0aW5nLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbG9maTo6UG93ZXJzdXBwbHktT3ZlcmxvYWRpbmc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlBvd2Vyc3VwcGx5LU92ZXJsb2FkaW5nPC9OSUNLPgorPEJMVVJCPlBvd2Vyc3VwcGx5LU92ZXJsb2FkaW5nLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbG9naXN0aWM6OlN0ZXAtZnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDQ0LDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3RlcC1mcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+U3RlcC1mcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjIyLDA1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbG9naXN0aWM6OnBhcmFtLS1yLS1wYXJhbWV0ZXI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIsOSwzLDk5OTldPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tLXItLXBhcmFtZXRlcjwvTklDSz4KKzxCTFVSQj5wYXJhbS0tci0tcGFyYW1ldGVyLjwvQkxVUkI+Cis8REVGQVVMVD4zLDk5OTk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1ub2lzZS1zb3VyY2Utd2hpdGU6OkFtcGxpdHVkZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QW1wbGl0dWRlPC9OSUNLPgorPEJMVVJCPkFtcGxpdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW51bGwtY2k6OklucHV0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklucHV0PC9OSUNLPgorPEJMVVJCPklucHV0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1udWxsLWNvOjpPdXRwdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPk91dHB1dDwvTklDSz4KKzxCTFVSQj5PdXRwdXQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW9yZ2FuOjpBdHRhY2stSGk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BdHRhY2stSGk8L05JQ0s+Cis8QkxVUkI+QXR0YWNrLUhpLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtb3JnYW46OkF0dGFjay1MbzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkF0dGFjay1MbzwvTklDSz4KKzxCTFVSQj5BdHRhY2stTG8uPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1vcmdhbjo6QnJhc3M8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CcmFzczwvTklDSz4KKzxCTFVSQj5CcmFzcy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1vcmdhbjo6RGVjYXktSGk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWNheS1IaTwvTklDSz4KKzxCTFVSQj5EZWNheS1IaS48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW9yZ2FuOjpEZWNheS1MbzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlY2F5LUxvPC9OSUNLPgorPEJMVVJCPkRlY2F5LUxvLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtb3JnYW46OkZsdXRlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Rmx1dGU8L05JQ0s+Cis8QkxVUkI+Rmx1dGUuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtb3JnYW46OkZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtb3JnYW46OkdhdGU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5HYXRlPC9OSUNLPgorPEJMVVJCPkdhdGUuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtb3JnYW46OlJlZWQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZWVkPC9OSUNLPgorPEJMVVJCPlJlZWQuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtb3JnYW46OlJlbGVhc2UtSGk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZWxlYXNlLUhpPC9OSUNLPgorPEJMVVJCPlJlbGVhc2UtSGkuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1vcmdhbjo6UmVsZWFzZS1MbzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlbGVhc2UtTG88L05JQ0s+Cis8QkxVUkI+UmVsZWFzZS1Mby48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW9yZ2FuOjpTdXN0YWluLUhpPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3VzdGFpbi1IaTwvTklDSz4KKzxCTFVSQj5TdXN0YWluLUhpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtb3JnYW46OlN1c3RhaW4tTG88L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TdXN0YWluLUxvPC9OSUNLPgorPEJMVVJCPlN1c3RhaW4tTG8uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1vcmdhbjo6VmVsb2NpdHk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WZWxvY2l0eTwvTklDSz4KKzxCTFVSQj5WZWxvY2l0eS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW9yZ2FuOjpwYXJhbS0xNnRoLUhhcm1vbmljPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMTZ0aC1IYXJtb25pYzwvTklDSz4KKzxCTFVSQj5wYXJhbS0xNnRoLUhhcm1vbmljLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtb3JnYW46OnBhcmFtLTItMi0zcmQtSGFybW9uaWM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0yLTItM3JkLUhhcm1vbmljPC9OSUNLPgorPEJMVVJCPnBhcmFtLTItMi0zcmQtSGFybW9uaWMuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1vcmdhbjo6cGFyYW0tMm5kLUhhcm1vbmljPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMm5kLUhhcm1vbmljPC9OSUNLPgorPEJMVVJCPnBhcmFtLTJuZC1IYXJtb25pYy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW9yZ2FuOjpwYXJhbS00dGgtSGFybW9uaWM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS00dGgtSGFybW9uaWM8L05JQ0s+Cis8QkxVUkI+cGFyYW0tNHRoLUhhcm1vbmljLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtb3JnYW46OnBhcmFtLTUtMS0zcmQtSGFybW9uaWM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS01LTEtM3JkLUhhcm1vbmljPC9OSUNLPgorPEJMVVJCPnBhcmFtLTUtMS0zcmQtSGFybW9uaWMuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1vcmdhbjo6cGFyYW0tOHRoLUhhcm1vbmljPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tOHRoLUhhcm1vbmljPC9OSUNLPgorPEJMVVJCPnBhcmFtLTh0aC1IYXJtb25pYy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBlYWs6OlBlYWs8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5QZWFrPC9OSUNLPgorPEJMVVJCPlBlYWsuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPMS1BdHRhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08xLUF0dGFjazwvTklDSz4KKzxCTFVSQj5EQ08xLUF0dGFjay48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ08xLURlY2F5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMS1EZWNheTwvTklDSz4KKzxCTFVSQj5EQ08xLURlY2F5LjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzEtTW9kdWxhdGlvbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzEtTW9kdWxhdGlvbjwvTklDSz4KKzxCTFVSQj5EQ08xLU1vZHVsYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPMS1PY3RhdmU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMS1PY3RhdmU8L05JQ0s+Cis8QkxVUkI+RENPMS1PY3RhdmUuPC9CTFVSQj4KKzxERUZBVUxUPi0yPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzEtUmVsZWFzZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzEtUmVsZWFzZTwvTklDSz4KKzxCTFVSQj5EQ08xLVJlbGVhc2UuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPMS1TdXN0YWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMS1TdXN0YWluPC9OSUNLPgorPEJMVVJCPkRDTzEtU3VzdGFpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ08xLVdhdmVmb3JtPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzEtV2F2ZWZvcm08L05JQ0s+Cis8QkxVUkI+RENPMS1XYXZlZm9ybS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ08yLUF0dGFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzItQXR0YWNrPC9OSUNLPgorPEJMVVJCPkRDTzItQXR0YWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzItRGVjYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08yLURlY2F5PC9OSUNLPgorPEJMVVJCPkRDTzItRGVjYXkuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPMi1Nb2R1bGF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMi1Nb2R1bGF0aW9uPC9OSUNLPgorPEJMVVJCPkRDTzItTW9kdWxhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ08yLU9jdGF2ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTIsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08yLU9jdGF2ZTwvTklDSz4KKzxCTFVSQj5EQ08yLU9jdGF2ZS48L0JMVVJCPgorPERFRkFVTFQ+LTI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPMi1SZWxlYXNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMi1SZWxlYXNlPC9OSUNLPgorPEJMVVJCPkRDTzItUmVsZWFzZS48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ08yLVN1c3RhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08yLVN1c3RhaW48L05JQ0s+Cis8QkxVUkI+RENPMi1TdXN0YWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzItV2F2ZWZvcm08L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMi1XYXZlZm9ybTwvTklDSz4KKzxCTFVSQj5EQ08yLVdhdmVmb3JtLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzMtQXR0YWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMy1BdHRhY2s8L05JQ0s+Cis8QkxVUkI+RENPMy1BdHRhY2suPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPMy1EZWNheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzMtRGVjYXk8L05JQ0s+Cis8QkxVUkI+RENPMy1EZWNheS48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ08zLU1vZHVsYXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08zLU1vZHVsYXRpb248L05JQ0s+Cis8QkxVUkI+RENPMy1Nb2R1bGF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzMtT2N0YXZlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMiwyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzMtT2N0YXZlPC9OSUNLPgorPEJMVVJCPkRDTzMtT2N0YXZlLjwvQkxVUkI+Cis8REVGQVVMVD4tMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ08zLVJlbGVhc2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08zLVJlbGVhc2U8L05JQ0s+Cis8QkxVUkI+RENPMy1SZWxlYXNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzMtU3VzdGFpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzMtU3VzdGFpbjwvTklDSz4KKzxCTFVSQj5EQ08zLVN1c3RhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPMy1XYXZlZm9ybTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08zLVdhdmVmb3JtPC9OSUNLPgorPEJMVVJCPkRDTzMtV2F2ZWZvcm0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPNC1BdHRhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ080LUF0dGFjazwvTklDSz4KKzxCTFVSQj5EQ080LUF0dGFjay48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ080LURlY2F5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPNC1EZWNheTwvTklDSz4KKzxCTFVSQj5EQ080LURlY2F5LjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzQtTW9kdWxhdGlvbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzQtTW9kdWxhdGlvbjwvTklDSz4KKzxCTFVSQj5EQ080LU1vZHVsYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPNC1PY3RhdmU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPNC1PY3RhdmU8L05JQ0s+Cis8QkxVUkI+RENPNC1PY3RhdmUuPC9CTFVSQj4KKzxERUZBVUxUPi0yPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzQtUmVsZWFzZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzQtUmVsZWFzZTwvTklDSz4KKzxCTFVSQj5EQ080LVJlbGVhc2UuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPNC1TdXN0YWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPNC1TdXN0YWluPC9OSUNLPgorPEJMVVJCPkRDTzQtU3VzdGFpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ080LVdhdmVmb3JtPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzQtV2F2ZWZvcm08L05JQ0s+Cis8QkxVUkI+RENPNC1XYXZlZm9ybS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ081LUF0dGFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzUtQXR0YWNrPC9OSUNLPgorPEJMVVJCPkRDTzUtQXR0YWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzUtRGVjYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ081LURlY2F5PC9OSUNLPgorPEJMVVJCPkRDTzUtRGVjYXkuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPNS1Nb2R1bGF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPNS1Nb2R1bGF0aW9uPC9OSUNLPgorPEJMVVJCPkRDTzUtTW9kdWxhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ081LU9jdGF2ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTIsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ081LU9jdGF2ZTwvTklDSz4KKzxCTFVSQj5EQ081LU9jdGF2ZS48L0JMVVJCPgorPERFRkFVTFQ+LTI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPNS1SZWxlYXNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPNS1SZWxlYXNlPC9OSUNLPgorPEJMVVJCPkRDTzUtUmVsZWFzZS48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ081LVN1c3RhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ081LVN1c3RhaW48L05JQ0s+Cis8QkxVUkI+RENPNS1TdXN0YWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzUtV2F2ZWZvcm08L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPNS1XYXZlZm9ybTwvTklDSz4KKzxCTFVSQj5EQ081LVdhdmVmb3JtLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzYtQXR0YWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPNi1BdHRhY2s8L05JQ0s+Cis8QkxVUkI+RENPNi1BdHRhY2suPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPNi1EZWNheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzYtRGVjYXk8L05JQ0s+Cis8QkxVUkI+RENPNi1EZWNheS48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ082LU1vZHVsYXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ082LU1vZHVsYXRpb248L05JQ0s+Cis8QkxVUkI+RENPNi1Nb2R1bGF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzYtT2N0YXZlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMiwyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzYtT2N0YXZlPC9OSUNLPgorPEJMVVJCPkRDTzYtT2N0YXZlLjwvQkxVUkI+Cis8REVGQVVMVD4tMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ082LVJlbGVhc2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ082LVJlbGVhc2U8L05JQ0s+Cis8QkxVUkI+RENPNi1SZWxlYXNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzYtU3VzdGFpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzYtU3VzdGFpbjwvTklDSz4KKzxCTFVSQj5EQ082LVN1c3RhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPNi1XYXZlZm9ybTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ082LVdhdmVmb3JtPC9OSUNLPgorPEJMVVJCPkRDTzYtV2F2ZWZvcm0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDIwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6R2F0ZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkdhdGU8L05JQ0s+Cis8QkxVUkI+R2F0ZS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6VmVsb2NpdHk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WZWxvY2l0eTwvTklDSz4KKzxCTFVSQj5WZWxvY2l0eS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBpbmstaW50ZXJwb2xhdGVkLWF1ZGlvOjpIaWdoZXN0LWZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw0NDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5IaWdoZXN0LWZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5IaWdoZXN0LWZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBpbmstc2g6OlNhbXBsZS1hbmQtaG9sZC1mcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsODgyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNhbXBsZS1hbmQtaG9sZC1mcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+U2FtcGxlLWFuZC1ob2xkLWZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWNvbXByZXNzLXBlYWs6OkNvbXByZXNzaW9uLVJhdGlvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjw9IDE8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Db21wcmVzc2lvbi1SYXRpbzwvTklDSz4KKzxCTFVSQj5Db21wcmVzc2lvbi1SYXRpby48L0JMVVJCPgorPERFRkFVTFQ+LTEsNzAxNDFlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtY29tcHJlc3MtcGVhazo6T3V0cHV0LUVudmVsb3BlLUF0dGFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0LUVudmVsb3BlLUF0dGFjazwvTklDSz4KKzxCTFVSQj5PdXRwdXQtRW52ZWxvcGUtQXR0YWNrLjwvQkxVUkI+Cis8REVGQVVMVD4zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWNvbXByZXNzLXBlYWs6Ok91dHB1dC1FbnZlbG9wZS1EZWNheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0LUVudmVsb3BlLURlY2F5PC9OSUNLPgorPEJMVVJCPk91dHB1dC1FbnZlbG9wZS1EZWNheS48L0JMVVJCPgorPERFRkFVTFQ+Myw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jb21wcmVzcy1wZWFrOjpUaHJlc2hvbGQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRocmVzaG9sZDwvTklDSz4KKzxCTFVSQj5UaHJlc2hvbGQuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jb21wcmVzcy1ybXM6OkNvbXByZXNzaW9uLVJhdGlvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjw9IDE8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Db21wcmVzc2lvbi1SYXRpbzwvTklDSz4KKzxCTFVSQj5Db21wcmVzc2lvbi1SYXRpby48L0JMVVJCPgorPERFRkFVTFQ+LTEsNzAxNDFlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtY29tcHJlc3Mtcm1zOjpPdXRwdXQtRW52ZWxvcGUtQXR0YWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRwdXQtRW52ZWxvcGUtQXR0YWNrPC9OSUNLPgorPEJMVVJCPk91dHB1dC1FbnZlbG9wZS1BdHRhY2suPC9CTFVSQj4KKzxERUZBVUxUPjMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtY29tcHJlc3Mtcm1zOjpPdXRwdXQtRW52ZWxvcGUtRGVjYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk91dHB1dC1FbnZlbG9wZS1EZWNheTwvTklDSz4KKzxCTFVSQj5PdXRwdXQtRW52ZWxvcGUtRGVjYXkuPC9CTFVSQj4KKzxERUZBVUxUPjMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtY29tcHJlc3Mtcm1zOjpUaHJlc2hvbGQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRocmVzaG9sZDwvTklDSz4KKzxCTFVSQj5UaHJlc2hvbGQuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1leHBhbmQtcGVhazo6RXhwYW5zaW9uLVJhdGlvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjw9IDE8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5FeHBhbnNpb24tUmF0aW88L05JQ0s+Cis8QkxVUkI+RXhwYW5zaW9uLVJhdGlvLjwvQkxVUkI+Cis8REVGQVVMVD4tMSw3MDE0MWUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1leHBhbmQtcGVhazo6T3V0cHV0LUVudmVsb3BlLUF0dGFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0LUVudmVsb3BlLUF0dGFjazwvTklDSz4KKzxCTFVSQj5PdXRwdXQtRW52ZWxvcGUtQXR0YWNrLjwvQkxVUkI+Cis8REVGQVVMVD4zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWV4cGFuZC1wZWFrOjpPdXRwdXQtRW52ZWxvcGUtRGVjYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk91dHB1dC1FbnZlbG9wZS1EZWNheTwvTklDSz4KKzxCTFVSQj5PdXRwdXQtRW52ZWxvcGUtRGVjYXkuPC9CTFVSQj4KKzxERUZBVUxUPjMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZXhwYW5kLXBlYWs6OlRocmVzaG9sZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGhyZXNob2xkPC9OSUNLPgorPEJMVVJCPlRocmVzaG9sZC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWV4cGFuZC1ybXM6OkV4cGFuc2lvbi1SYXRpbzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48PSAxPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RXhwYW5zaW9uLVJhdGlvPC9OSUNLPgorPEJMVVJCPkV4cGFuc2lvbi1SYXRpby48L0JMVVJCPgorPERFRkFVTFQ+LTEsNzAxNDFlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZXhwYW5kLXJtczo6T3V0cHV0LUVudmVsb3BlLUF0dGFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0LUVudmVsb3BlLUF0dGFjazwvTklDSz4KKzxCTFVSQj5PdXRwdXQtRW52ZWxvcGUtQXR0YWNrLjwvQkxVUkI+Cis8REVGQVVMVD4zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWV4cGFuZC1ybXM6Ok91dHB1dC1FbnZlbG9wZS1EZWNheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0LUVudmVsb3BlLURlY2F5PC9OSUNLPgorPEJMVVJCPk91dHB1dC1FbnZlbG9wZS1EZWNheS48L0JMVVJCPgorPERFRkFVTFQ+Myw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1leHBhbmQtcm1zOjpUaHJlc2hvbGQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRocmVzaG9sZDwvTklDSz4KKzxCTFVSQj5UaHJlc2hvbGQuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1saW1pdC1wZWFrOjpPdXRwdXQtRW52ZWxvcGUtQXR0YWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRwdXQtRW52ZWxvcGUtQXR0YWNrPC9OSUNLPgorPEJMVVJCPk91dHB1dC1FbnZlbG9wZS1BdHRhY2suPC9CTFVSQj4KKzxERUZBVUxUPjMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbGltaXQtcGVhazo6T3V0cHV0LUVudmVsb3BlLURlY2F5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRwdXQtRW52ZWxvcGUtRGVjYXk8L05JQ0s+Cis8QkxVUkI+T3V0cHV0LUVudmVsb3BlLURlY2F5LjwvQkxVUkI+Cis8REVGQVVMVD4zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxpbWl0LXBlYWs6OlRocmVzaG9sZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGhyZXNob2xkPC9OSUNLPgorPEJMVVJCPlRocmVzaG9sZC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxpbWl0LXJtczo6T3V0cHV0LUVudmVsb3BlLUF0dGFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0LUVudmVsb3BlLUF0dGFjazwvTklDSz4KKzxCTFVSQj5PdXRwdXQtRW52ZWxvcGUtQXR0YWNrLjwvQkxVUkI+Cis8REVGQVVMVD4zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxpbWl0LXJtczo6T3V0cHV0LUVudmVsb3BlLURlY2F5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRwdXQtRW52ZWxvcGUtRGVjYXk8L05JQ0s+Cis8QkxVUkI+T3V0cHV0LUVudmVsb3BlLURlY2F5LjwvQkxVUkI+Cis8REVGQVVMVD4zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxpbWl0LXJtczo6VGhyZXNob2xkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UaHJlc2hvbGQ8L05JQ0s+Cis8QkxVUkI+VGhyZXNob2xkLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2luZS1mYWFjOjpBbXBsaXR1ZGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkFtcGxpdHVkZTwvTklDSz4KKzxCTFVSQj5BbXBsaXR1ZGUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zaW5lLWZjYWE6OkZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD40NDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zaW5lLWZjYWM6OkFtcGxpdHVkZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QW1wbGl0dWRlPC9OSUNLPgorPEJMVVJCPkFtcGxpdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNpbmUtZmNhYzo6RnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDIyMDUwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjQ0MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXN5bmRydW06OkZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc3luZHJ1bTo6RnJlcXVlbmN5LVJhdGlvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS1SYXRpbzwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3ktUmF0aW8uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zeW5kcnVtOjpSZXNvbmFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDAxLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVzb25hbmNlPC9OSUNLPgorPEJMVVJCPlJlc29uYW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MCwwMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zeW5kcnVtOjpUcmlnZ2VyPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VHJpZ2dlcjwvTklDSz4KKzxCTFVSQj5UcmlnZ2VyLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXN5bmRydW06OlZlbG9jaXR5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZlbG9jaXR5PC9OSUNLPgorPEJMVVJCPlZlbG9jaXR5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmMzAzOjpDdXRvZmY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5DdXRvZmY8L05JQ0s+Cis8QkxVUkI+Q3V0b2ZmLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmMzAzOjpEZWNheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlY2F5PC9OSUNLPgorPEJMVVJCPkRlY2F5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmMzAzOjpFbnZlbG9wZS1Nb2R1bGF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RW52ZWxvcGUtTW9kdWxhdGlvbjwvTklDSz4KKzxCTFVSQj5FbnZlbG9wZS1Nb2R1bGF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmMzAzOjpSZXNvbmFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2U8L05JQ0s+Cis8QkxVUkI+UmVzb25hbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmMzAzOjpUcmlnZ2VyPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VHJpZ2dlcjwvTklDSz4KKzxCTFVSQj5UcmlnZ2VyLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXdzaGFwZS1zaW5lOjpMaW1pdGluZy1BbXBsaXR1ZGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxpbWl0aW5nLUFtcGxpdHVkZTwvTklDSz4KKzxCTFVSQj5MaW1pdGluZy1BbXBsaXR1ZGUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jaGVic3RvcnRpb246OkRpc3RvcnRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsM108L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EaXN0b3J0aW9uPC9OSUNLPgorPEJMVVJCPkRpc3RvcnRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1sY3JEZWxheTo6Qy1kZWxheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyNzAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkMtZGVsYXk8L05JQ0s+Cis8QkxVUkI+Qy1kZWxheS48L0JMVVJCPgorPERFRkFVTFQ+Njc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbGNyRGVsYXk6OkMtbGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Qy1sZXZlbDwvTklDSz4KKzxCTFVSQj5DLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4yNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxjckRlbGF5OjpEcnktV2V0LWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LVdldC1sZXZlbDwvTklDSz4KKzxCTFVSQj5EcnktV2V0LWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbGNyRGVsYXk6OkZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMTAwLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GZWVkYmFjazwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxjckRlbGF5OjpIaWdoLWRhbXA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkhpZ2gtZGFtcDwvTklDSz4KKzxCTFVSQj5IaWdoLWRhbXAuPC9CTFVSQj4KKzxERUZBVUxUPjUwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbGNyRGVsYXk6OkwtZGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMjcwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MLWRlbGF5PC9OSUNLPgorPEJMVVJCPkwtZGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjY3NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxjckRlbGF5OjpMLWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDUwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkwtbGV2ZWw8L05JQ0s+Cis8QkxVUkI+TC1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1sY3JEZWxheTo6TG93LWRhbXA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxvdy1kYW1wPC9OSUNLPgorPEJMVVJCPkxvdy1kYW1wLjwvQkxVUkI+Cis8REVGQVVMVD41MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxjckRlbGF5OjpSLWRlbGF5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDI3MDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Ui1kZWxheTwvTklDSz4KKzxCTFVSQj5SLWRlbGF5LjwvQkxVUkI+Cis8REVGQVVMVD42NzU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1sY3JEZWxheTo6Ui1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SLWxldmVsPC9OSUNLPgorPEJMVVJCPlItbGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbGNyRGVsYXk6OlNwcmVhZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TcHJlYWQ8L05JQ0s+Cis8QkxVUkI+U3ByZWFkLjwvQkxVUkI+Cis8REVGQVVMVD4yNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRpdmlkZXI6OkRlbm9taW5hdG9yPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbm9taW5hdG9yPC9OSUNLPgorPEJMVVJCPkRlbm9taW5hdG9yLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmFuZG9tLWZhc2Mtb2E6OldhdmUtU21vb3RobmVzczwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldhdmUtU21vb3RobmVzczwvTklDSz4KKzxCTFVSQj5XYXZlLVNtb290aG5lc3MuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1yYW5kb20tZmNzYS1vYTo6RnJlcXVlbno8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsOTE4NzUsMjIwNTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbno8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbnouPC9CTFVSQj4KKzxERUZBVUxUPjQ0MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXJhbmRvbS1mY3NjLW9hOjpGcmVxdWVuejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw5MTg3NSwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuejwvTklDSz4KKzxCTFVSQj5GcmVxdWVuei48L0JMVVJCPgorPERFRkFVTFQ+NDQwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmFuZG9tLWZjc2Mtb2E6OldhdmUtU21vb3RobmVzczwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldhdmUtU21vb3RobmVzczwvTklDSz4KKzxCTFVSQj5XYXZlLVNtb290aG5lc3MuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1sZm9QaGFzZXI6OkZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPkZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbGZvUGhhc2VyOjpMRk8tZGVwdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MRk8tZGVwdGg8L05JQ0s+Cis8QkxVUkI+TEZPLWRlcHRoLjwvQkxVUkI+Cis8REVGQVVMVD4wLDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbGZvUGhhc2VyOjpMRk8tcmF0ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TEZPLXJhdGU8L05JQ0s+Cis8QkxVUkI+TEZPLXJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbGZvUGhhc2VyOjpTcHJlYWQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TcHJlYWQ8L05JQ0s+Cis8QkxVUkI+U3ByZWFkLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm91ckJ5Rm91clBvbGU6OkZlZWRiYWNrLTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2stMTwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay0xLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm91ckJ5Rm91clBvbGU6OkZlZWRiYWNrLTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2stMjwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay0yLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm91ckJ5Rm91clBvbGU6OkZlZWRiYWNrLTM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2stMzwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay0zLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm91ckJ5Rm91clBvbGU6OkZlZWRiYWNrLTQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2stNDwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay00LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm91ckJ5Rm91clBvbGU6OkZyZXF1ZW5jeS0xPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDIwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS0xPC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS0xLjwvQkxVUkI+Cis8REVGQVVMVD41MDAwLDc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm91ckJ5Rm91clBvbGU6OkZyZXF1ZW5jeS0yPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDIwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS0yPC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS0yLjwvQkxVUkI+Cis8REVGQVVMVD4xMDAwMCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm91ckJ5Rm91clBvbGU6OkZyZXF1ZW5jeS0zPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDIwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS0zPC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS0zLjwvQkxVUkI+Cis8REVGQVVMVD4xNTAwMCwyPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm91ckJ5Rm91clBvbGU6OkZyZXF1ZW5jeS00PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDIwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS00PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS00LjwvQkxVUkI+Cis8REVGQVVMVD4yMDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWF1dG9QaGFzZXI6OkF0dGFjay10aW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QXR0YWNrLXRpbWU8L05JQ0s+Cis8QkxVUkI+QXR0YWNrLXRpbWUuPC9CTFVSQj4KKzxERUZBVUxUPjAsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hdXRvUGhhc2VyOjpEZWNheS10aW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVjYXktdGltZTwvTklDSz4KKzxCTFVSQj5EZWNheS10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wLDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYXV0b1BoYXNlcjo6RmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+RmVlZGJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hdXRvUGhhc2VyOjpNb2R1bGF0aW9uLWRlcHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kdWxhdGlvbi1kZXB0aDwvTklDSz4KKzxCTFVSQj5Nb2R1bGF0aW9uLWRlcHRoLjwvQkxVUkI+Cis8REVGQVVMVD4wLDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYXV0b1BoYXNlcjo6U3ByZWFkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3ByZWFkPC9OSUNLPgorPEJMVVJCPlNwcmVhZC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1yZWZsZWN0b3I6OkRyeS1MZXZlbC0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LUxldmVsLS1kQi08L05JQ0s+Cis8QkxVUkI+RHJ5LUxldmVsLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPi05MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1yZWZsZWN0b3I6OkZyYWdtZW50LUxlbmd0aC0tbXMtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyMCwxNjAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyYWdtZW50LUxlbmd0aC0tbXMtPC9OSUNLPgorPEJMVVJCPkZyYWdtZW50LUxlbmd0aC0tbXMtLjwvQkxVUkI+Cis8REVGQVVMVD40MTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcmVmbGVjdG9yOjpXZXQtTGV2ZWwtLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTkwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldldC1MZXZlbC0tZEItPC9OSUNLPgorPEJMVVJCPldldC1MZXZlbC0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZmFzdExvb2thaGVhZExpbWl0ZXI6OkF0dGVudWF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDcwXTwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5BdHRlbnVhdGlvbjwvTklDSz4KKzxCTFVSQj5BdHRlbnVhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZhc3RMb29rYWhlYWRMaW1pdGVyOjpJbnB1dC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5wdXQtZ2FpbjwvTklDSz4KKzxCTFVSQj5JbnB1dC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZmFzdExvb2thaGVhZExpbWl0ZXI6OkxpbWl0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MaW1pdDwvTklDSz4KKzxCTFVSQj5MaW1pdC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZhc3RMb29rYWhlYWRMaW1pdGVyOjpSZWxlYXNlLXRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZWxlYXNlLXRpbWU8L05JQ0s+Cis8QkxVUkI+UmVsZWFzZS10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wLDUwNzU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1mYXN0TG9va2FoZWFkTGltaXRlcjo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIyMDo6TWF0Y2gtUmFuZ2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1hdGNoLVJhbmdlPC9OSUNLPgorPEJMVVJCPk1hdGNoLVJhbmdlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyMjA6Ok1vZGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kZTwvTklDSz4KKzxCTFVSQj5Nb2RlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyMjA6OlF1YW50aXNlLVJhbmdlLU1heGltdW08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UXVhbnRpc2UtUmFuZ2UtTWF4aW11bTwvTklDSz4KKzxCTFVSQj5RdWFudGlzZS1SYW5nZS1NYXhpbXVtLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIyMDo6UXVhbnRpc2UtUmFuZ2UtTWluaW11bTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5RdWFudGlzZS1SYW5nZS1NaW5pbXVtPC9OSUNLPgorPEJMVVJCPlF1YW50aXNlLVJhbmdlLU1pbmltdW0uPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjIwOjpTdGVwczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3RlcHM8L05JQ0s+Cis8QkxVUkI+U3RlcHMuPC9CTFVSQj4KKzxERUZBVUxUPjIwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyMjA6OlZhbHVlLTA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMDwvTklDSz4KKzxCTFVSQj5WYWx1ZS0wLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIyMDo6VmFsdWUtMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0xPC9OSUNLPgorPEJMVVJCPlZhbHVlLTEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjIwOjpWYWx1ZS0xMDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0xMDwvTklDSz4KKzxCTFVSQj5WYWx1ZS0xMC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyMjA6OlZhbHVlLTExPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTExPC9OSUNLPgorPEJMVVJCPlZhbHVlLTExLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIyMDo6VmFsdWUtMTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjIwOjpWYWx1ZS0xMzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0xMzwvTklDSz4KKzxCTFVSQj5WYWx1ZS0xMy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyMjA6OlZhbHVlLTE0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTE0PC9OSUNLPgorPEJMVVJCPlZhbHVlLTE0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIyMDo6VmFsdWUtMTU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjIwOjpWYWx1ZS0xNjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0xNjwvTklDSz4KKzxCTFVSQj5WYWx1ZS0xNi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyMjA6OlZhbHVlLTE3PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTE3PC9OSUNLPgorPEJMVVJCPlZhbHVlLTE3LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIyMDo6VmFsdWUtMTg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjIwOjpWYWx1ZS0xOTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0xOTwvTklDSz4KKzxCTFVSQj5WYWx1ZS0xOS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyMjA6OlZhbHVlLTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjwvTklDSz4KKzxCTFVSQj5WYWx1ZS0yLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIyMDo6VmFsdWUtMzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0zPC9OSUNLPgorPEJMVVJCPlZhbHVlLTMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjIwOjpWYWx1ZS00PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyMjA6OlZhbHVlLTU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTwvTklDSz4KKzxCTFVSQj5WYWx1ZS01LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIyMDo6VmFsdWUtNjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS02PC9OSUNLPgorPEJMVVJCPlZhbHVlLTYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjIwOjpWYWx1ZS03PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyMjA6OlZhbHVlLTg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODwvTklDSz4KKzxCTFVSQj5WYWx1ZS04LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIyMDo6VmFsdWUtOTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS05PC9OSUNLPgorPEJMVVJCPlZhbHVlLTkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZ5bmlsOjpDcmFja2xlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Q3JhY2tsZTwvTklDSz4KKzxCTFVSQj5DcmFja2xlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdnluaWw6OlJQTTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMzMsNzhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UlBNPC9OSUNLPgorPEJMVVJCPlJQTS48L0JMVVJCPgorPERFRkFVTFQ+MzM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12eW5pbDo6U3VyZmFjZS13YXJwaW5nPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3VyZmFjZS13YXJwaW5nPC9OSUNLPgorPEJMVVJCPlN1cmZhY2Utd2FycGluZy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZ5bmlsOjpXZWFyPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+V2VhcjwvTklDSz4KKzxCTFVSQj5XZWFyLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdnluaWw6OlllYXI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzE5MDAsMTk5MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5ZZWFyPC9OSUNLPgorPEJMVVJCPlllYXIuPC9CTFVSQj4KKzxERUZBVUxUPjE5OTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jb25zdDo6U2lnbmFsLWFtcGxpdHVkZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNpZ25hbC1hbXBsaXR1ZGU8L05JQ0s+Cis8QkxVUkI+U2lnbmFsLWFtcGxpdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXByb2R1Y3QtaWFpYy1vYTo6U2Vjb25kLUlucHV0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNlY29uZC1JbnB1dDwvTklDSz4KKzxCTFVSQj5TZWNvbmQtSW5wdXQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXByb2R1Y3QtaWNpYy1vYzo6Rmlyc3QtSW5wdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Rmlyc3QtSW5wdXQ8L05JQ0s+Cis8QkxVUkI+Rmlyc3QtSW5wdXQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXByb2R1Y3QtaWNpYy1vYzo6UHJvZHVjdC1PdXRwdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPlByb2R1Y3QtT3V0cHV0PC9OSUNLPgorPEJMVVJCPlByb2R1Y3QtT3V0cHV0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1wcm9kdWN0LWljaWMtb2M6OlNlY29uZC1JbnB1dDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TZWNvbmQtSW5wdXQ8L05JQ0s+Cis8QkxVUkI+U2Vjb25kLUlucHV0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcmV2ZXJiOjpBbGxwYXNzLUZpbHRlcnM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BbGxwYXNzLUZpbHRlcnM8L05JQ0s+Cis8QkxVUkI+QWxscGFzcy1GaWx0ZXJzLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1yZXZlcmI6OkJhbmRwYXNzLUZpbHRlcjwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmRwYXNzLUZpbHRlcjwvTklDSz4KKzxCTFVSQj5CYW5kcGFzcy1GaWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLXJldmVyYjo6Q29tYi1GaWx0ZXJzPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Q29tYi1GaWx0ZXJzPC9OSUNLPgorPEJMVVJCPkNvbWItRmlsdGVycy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcmV2ZXJiOjpEZWNheS0tbXMtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlY2F5LS1tcy08L05JQ0s+Cis8QkxVUkI+RGVjYXktLW1zLS48L0JMVVJCPgorPERFRkFVTFQ+MjUwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1yZXZlcmI6OkRyeS1MZXZlbC0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LUxldmVsLS1kQi08L05JQ0s+Cis8QkxVUkI+RHJ5LUxldmVsLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcmV2ZXJiOjpFbmhhbmNlZC1TdGVyZW88L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5FbmhhbmNlZC1TdGVyZW88L05JQ0s+Cis8QkxVUkI+RW5oYW5jZWQtU3RlcmVvLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1yZXZlcmI6OlJldmVyYi1UeXBlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw0Ml08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXZlcmItVHlwZTwvTklDSz4KKzxCTFVSQj5SZXZlcmItVHlwZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1yZXZlcmI6OldldC1MZXZlbC0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+V2V0LUxldmVsLS1kQi08L05JQ0s+Cis8QkxVUkI+V2V0LUxldmVsLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QdWxzZS1WQ086OkV4cC1GTS1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RXhwLUZNLWdhaW48L05JQ0s+Cis8QkxVUkI+RXhwLUZNLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QdWxzZS1WQ086OkxQLWZpbHRlcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxQLWZpbHRlcjwvTklDSz4KKzxCTFVSQj5MUC1maWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QdWxzZS1WQ086Okxpbi1GTS1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TGluLUZNLWdhaW48L05JQ0s+Cis8QkxVUkI+TGluLUZNLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QdWxzZS1WQ086Ok9jdGF2ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Wy00LDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T2N0YXZlPC9OSUNLPgorPEJMVVJCPk9jdGF2ZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVB1bHNlLVZDTzo6VHVuZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlR1bmU8L05JQ0s+Cis8QkxVUkI+VHVuZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNhdy1WQ086OkV4cC1GTS1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RXhwLUZNLWdhaW48L05JQ0s+Cis8QkxVUkI+RXhwLUZNLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TYXctVkNPOjpMUC1maWx0ZXI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MUC1maWx0ZXI8L05JQ0s+Cis8QkxVUkI+TFAtZmlsdGVyLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU2F3LVZDTzo6TGluLUZNLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MaW4tRk0tZ2FpbjwvTklDSz4KKzxCTFVSQj5MaW4tRk0tZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNhdy1WQ086Ok9jdGF2ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Wy00LDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T2N0YXZlPC9OSUNLPgorPEJMVVJCPk9jdGF2ZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNhdy1WQ086OlR1bmU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UdW5lPC9OSUNLPgorPEJMVVJCPlR1bmUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1SZWMtVkNPOjpFeHAtRk0tZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkV4cC1GTS1nYWluPC9OSUNLPgorPEJMVVJCPkV4cC1GTS1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUmVjLVZDTzo6Rm9ybS1tb2Q8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Gb3JtLW1vZDwvTklDSz4KKzxCTFVSQj5Gb3JtLW1vZC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVJlYy1WQ086OkxQLWZpbHRlcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxQLWZpbHRlcjwvTklDSz4KKzxCTFVSQj5MUC1maWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1SZWMtVkNPOjpMaW4tRk0tZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxpbi1GTS1nYWluPC9OSUNLPgorPEJMVVJCPkxpbi1GTS1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUmVjLVZDTzo6T2N0YXZlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bLTQsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PY3RhdmU8L05JQ0s+Cis8QkxVUkI+T2N0YXZlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUmVjLVZDTzo6VHVuZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlR1bmU8L05JQ0s+Cis8QkxVUkI+VHVuZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVJlYy1WQ086OldhdmVmb3JtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldhdmVmb3JtPC9OSUNLPgorPEJMVVJCPldhdmVmb3JtLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2luZ2xlUGFyYTo6QmFuZHdpZHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZHdpZHRoPC9OSUNLPgorPEJMVVJCPkJhbmR3aWR0aC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNpbmdsZVBhcmE6OkZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxNzY0MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD40NDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zaW5nbGVQYXJhOjpHYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+R2FpbjwvTklDSz4KKzxCTFVSQj5HYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ2F0ZTo6QXR0YWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDEwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QXR0YWNrPC9OSUNLPgorPEJMVVJCPkF0dGFjay48L0JMVVJCPgorPERFRkFVTFQ+MjUwLDAwODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdhdGU6OkRlY2F5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyLDQwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVjYXk8L05JQ0s+Cis8QkxVUkI+RGVjYXkuPC9CTFVSQj4KKzxERUZBVUxUPjIwMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nYXRlOjpIRi1rZXktZmlsdGVyPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyMjAsNSwyMTYwOV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5IRi1rZXktZmlsdGVyPC9OSUNLPgorPEJMVVJCPkhGLWtleS1maWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjIxNjA5PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ2F0ZTo6SG9sZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMiwyMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkhvbGQ8L05JQ0s+Cis8QkxVUkI+SG9sZC48L0JMVVJCPgorPERFRkFVTFQ+MTUwMCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ2F0ZTo6TEYta2V5LWZpbHRlcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMzAsODcsNDQxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MRi1rZXktZmlsdGVyPC9OSUNLPgorPEJMVVJCPkxGLWtleS1maWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjMwLDg3PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ2F0ZTo6T3V0cHV0LXNlbGVjdDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0LXNlbGVjdDwvTklDSz4KKzxCTFVSQj5PdXRwdXQtc2VsZWN0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ2F0ZTo6UmFuZ2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy05MCwwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJhbmdlPC9OSUNLPgorPEJMVVJCPlJhbmdlLjwvQkxVUkI+Cis8REVGQVVMVD4tOTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nYXRlOjpUaHJlc2hvbGQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UaHJlc2hvbGQ8L05JQ0s+Cis8QkxVUkI+VGhyZXNob2xkLjwvQkxVUkI+Cis8REVGQVVMVD4tNzA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZHluYW1pY3Mtc3Q6OkF0dGFjay0tbXMtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls0LDUwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BdHRhY2stLW1zLTwvTklDSz4KKzxCTFVSQj5BdHRhY2stLW1zLS48L0JMVVJCPgorPERFRkFVTFQ+MTI4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWR5bmFtaWNzLXN0OjpFbnZlbG9wZS1Wb2x1bWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy02MCwyMF08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+RW52ZWxvcGUtVm9sdW1lPC9OSUNLPgorPEJMVVJCPkVudmVsb3BlLVZvbHVtZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1keW5hbWljcy1zdDo6RW52ZWxvcGUtVm9sdW1lLTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy02MCwyMF08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+RW52ZWxvcGUtVm9sdW1lLTE8L05JQ0s+Cis8QkxVUkI+RW52ZWxvcGUtVm9sdW1lLTEuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZHluYW1pY3Mtc3Q6OkZ1bmN0aW9uPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwxNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GdW5jdGlvbjwvTklDSz4KKzxCTFVSQj5GdW5jdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1keW5hbWljcy1zdDo6R2Fpbi1BZGp1c3RtZW50PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNjAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkdhaW4tQWRqdXN0bWVudDwvTklDSz4KKzxCTFVSQj5HYWluLUFkanVzdG1lbnQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZHluYW1pY3Mtc3Q6OkdhaW4tQWRqdXN0bWVudC0xPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNjAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkdhaW4tQWRqdXN0bWVudC0xPC9OSUNLPgorPEJMVVJCPkdhaW4tQWRqdXN0bWVudC0xLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWR5bmFtaWNzLXN0OjpNYWtldXAtR2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TWFrZXVwLUdhaW4tLWRCLTwvTklDSz4KKzxCTFVSQj5NYWtldXAtR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWR5bmFtaWNzLXN0OjpPZmZzZXQtR2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T2Zmc2V0LUdhaW4tLWRCLTwvTklDSz4KKzxCTFVSQj5PZmZzZXQtR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWR5bmFtaWNzLXN0OjpSZWxlYXNlLS1tcy08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzQsMTAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZWxlYXNlLS1tcy08L05JQ0s+Cis8QkxVUkI+UmVsZWFzZS0tbXMtLjwvQkxVUkI+Cis8REVGQVVMVD41MDI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZHluYW1pY3Mtc3Q6OlN0ZXJlby1Nb2RlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN0ZXJlby1Nb2RlPC9OSUNLPgorPEJMVVJCPlN0ZXJlby1Nb2RlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OkJhbmR3aWR0aC0xPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEyNSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmR3aWR0aC0xPC9OSUNLPgorPEJMVVJCPkJhbmR3aWR0aC0xLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OkJhbmR3aWR0aC0yPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEyNSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmR3aWR0aC0yPC9OSUNLPgorPEJMVVJCPkJhbmR3aWR0aC0yLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OkJhbmR3aWR0aC0zPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEyNSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmR3aWR0aC0zPC9OSUNLPgorPEJMVVJCPkJhbmR3aWR0aC0zLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OkJhbmR3aWR0aC00PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEyNSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmR3aWR0aC00PC9OSUNLPgorPEJMVVJCPkJhbmR3aWR0aC00LjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OkZpbHRlcjwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHRlcjwvTklDSz4KKzxCTFVSQj5GaWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OkZyZXF1ZW5jeS0xPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyMCwyMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS0xPC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS0xLjwvQkxVUkI+Cis8REVGQVVMVD4yMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QYXJhbWV0cmljMTo6RnJlcXVlbmN5LTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzQwLDQwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LTI8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LTIuPC9CTFVSQj4KKzxERUZBVUxUPjQwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBhcmFtZXRyaWMxOjpGcmVxdWVuY3ktMzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMTAwLDEwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS0zPC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS0zLjwvQkxVUkI+Cis8REVGQVVMVD4xMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OkZyZXF1ZW5jeS00PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyMDAsMjAwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LTQ8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LTQuPC9CTFVSQj4KKzxERUZBVUxUPjIwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QYXJhbWV0cmljMTo6R2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTIwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkdhaW48L05JQ0s+Cis8QkxVUkI+R2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBhcmFtZXRyaWMxOjpHYWluLTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yMCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5HYWluLTE8L05JQ0s+Cis8QkxVUkI+R2Fpbi0xLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OkdhaW4tMjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTIwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkdhaW4tMjwvTklDSz4KKzxCTFVSQj5HYWluLTIuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QYXJhbWV0cmljMTo6R2Fpbi0zPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+R2Fpbi0zPC9OSUNLPgorPEJMVVJCPkdhaW4tMy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBhcmFtZXRyaWMxOjpHYWluLTQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yMCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5HYWluLTQ8L05JQ0s+Cis8QkxVUkI+R2Fpbi00LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OlNlY3Rpb24tMTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNlY3Rpb24tMTwvTklDSz4KKzxCTFVSQj5TZWN0aW9uLTEuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OlNlY3Rpb24tMjwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNlY3Rpb24tMjwvTklDSz4KKzxCTFVSQj5TZWN0aW9uLTIuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OlNlY3Rpb24tMzwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNlY3Rpb24tMzwvTklDSz4KKzxCTFVSQj5TZWN0aW9uLTMuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OlNlY3Rpb24tNDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNlY3Rpb24tNDwvTklDSz4KKzxCTFVSQj5TZWN0aW9uLTQuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2luQ29zOjpCYXNlLWZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwNDQxLDIyMDUwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhc2UtZnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkJhc2UtZnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD40NDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zaW5Db3M6OlBpdGNoLW9mZnNldDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlBpdGNoLW9mZnNldDwvTklDSz4KKzxCTFVSQj5QaXRjaC1vZmZzZXQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1tYXRyaXhTcGF0aWFsaXNlcjo6V2lkdGg8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlstNTEyLDUxMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5XaWR0aDwvTklDSz4KKzxCTFVSQj5XaWR0aC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1saW1pdGVyOjpMaW1pdC1MZXZlbC0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMzAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TGltaXQtTGV2ZWwtLWRCLTwvTklDSz4KKzxCTFVSQj5MaW1pdC1MZXZlbC0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWxpbWl0ZXI6Ok91dHB1dC1Wb2x1bWUtLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTMwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk91dHB1dC1Wb2x1bWUtLWRCLTwvTklDSz4KKzxCTFVSQj5PdXRwdXQtVm9sdW1lLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtbGltaXRlcjo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyNTAwLDFdPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPmxhdGVuY3k8L05JQ0s+Cis8QkxVUkI+bGF0ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MjUwMCwxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYm9kZVNoaWZ0ZXJDVjo6QmFzZS1zaGlmdDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw1MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhc2Utc2hpZnQ8L05JQ0s+Cis8QkxVUkI+QmFzZS1zaGlmdC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWJvZGVTaGlmdGVyQ1Y6OkNWLUF0dGVudWF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Q1YtQXR0ZW51YXRpb248L05JQ0s+Cis8QkxVUkI+Q1YtQXR0ZW51YXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1ib2RlU2hpZnRlckNWOjpNaXg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TWl4PC9OSUNLPgorPEJMVVJCPk1peC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWJvZGVTaGlmdGVyQ1Y6OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPmxhdGVuY3k8L05JQ0s+Cis8QkxVUkI+bGF0ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGhhc2VyMTo6RXhwLUZNLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RXhwLUZNLWdhaW48L05JQ0s+Cis8QkxVUkI+RXhwLUZNLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QaGFzZXIxOjpGZWVkYmFjay1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZlZWRiYWNrLWdhaW48L05JQ0s+Cis8QkxVUkI+RmVlZGJhY2stZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBoYXNlcjE6OkZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTYsNl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGhhc2VyMTo6SW5wdXQtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTQwLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklucHV0LWdhaW48L05JQ0s+Cis8QkxVUkI+SW5wdXQtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBoYXNlcjE6Okxpbi1GTS1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxpbi1GTS1nYWluPC9OSUNLPgorPEJMVVJCPkxpbi1GTS1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGhhc2VyMTo6T3V0cHV0LW1peDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRwdXQtbWl4PC9OSUNLPgorPEJMVVJCPk91dHB1dC1taXguPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QaGFzZXIxOjpTZWN0aW9uczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U2VjdGlvbnM8L05JQ0s+Cis8QkxVUkI+U2VjdGlvbnMuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QaGFzZXIxK0xGTzo6RmVlZGJhY2stZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GZWVkYmFjay1nYWluPC9OSUNLPgorPEJMVVJCPkZlZWRiYWNrLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QaGFzZXIxK0xGTzo6RnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNiw2XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QaGFzZXIxK0xGTzo6SW5wdXQtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTQwLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklucHV0LWdhaW48L05JQ0s+Cis8QkxVUkI+SW5wdXQtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBoYXNlcjErTEZPOjpMRk8tZnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxGTy1mcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+TEZPLWZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBoYXNlcjErTEZPOjpMRk8td2F2ZWZvcm08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TEZPLXdhdmVmb3JtPC9OSUNLPgorPEJMVVJCPkxGTy13YXZlZm9ybS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBoYXNlcjErTEZPOjpNb2R1bGF0aW9uLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kdWxhdGlvbi1nYWluPC9OSUNLPgorPEJMVVJCPk1vZHVsYXRpb24tZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBoYXNlcjErTEZPOjpPdXRwdXQtbWl4PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk91dHB1dC1taXg8L05JQ0s+Cis8QkxVUkI+T3V0cHV0LW1peC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBoYXNlcjErTEZPOjpTZWN0aW9uczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U2VjdGlvbnM8L05JQ0s+Cis8QkxVUkI+U2VjdGlvbnMuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kZWNpbWF0b3I6OkJpdC1kZXB0aDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwyNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CaXQtZGVwdGg8L05JQ0s+Cis8QkxVUkI+Qml0LWRlcHRoLjwvQkxVUkI+Cis8REVGQVVMVD4yNDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRlY2ltYXRvcjo6U2FtcGxlLXJhdGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzQ0LDEsNDQxMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U2FtcGxlLXJhdGU8L05JQ0s+Cis8QkxVUkI+U2FtcGxlLXJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjQ0MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2hhcGVyOjpXYXZlc2hhcGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5XYXZlc2hhcGU8L05JQ0s+Cis8QkxVUkI+V2F2ZXNoYXBlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJpYW5nbGUtZmFzYy1vYTo6U2xvcGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TbG9wZTwvTklDSz4KKzxCTFVSQj5TbG9wZS48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJpYW5nbGUtZmNzYS1vYTo6RnJlcXVlbno8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsOTE4NzUsMjIwNTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbno8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbnouPC9CTFVSQj4KKzxERUZBVUxUPjQ0MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRyaWFuZ2xlLWZjc2Mtb2E6OkZyZXF1ZW56PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDkxODc1LDIyMDUwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW56PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW56LjwvQkxVUkI+Cis8REVGQVVMVD40NDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmlhbmdsZS1mY3NjLW9hOjpTbG9wZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNsb3BlPC9OSUNLPgorPEJMVVJCPlNsb3BlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kakZsYW5nZXI6OkZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMTAwLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GZWVkYmFjazwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRqRmxhbmdlcjo6TEZPLWRlcHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TEZPLWRlcHRoPC9OSUNLPgorPEJMVVJCPkxGTy1kZXB0aC48L0JMVVJCPgorPERFRkFVTFQ+NDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRqRmxhbmdlcjo6TEZPLXBlcmlvZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxLDMyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxGTy1wZXJpb2Q8L05JQ0s+Cis8QkxVUkI+TEZPLXBlcmlvZC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRqRmxhbmdlcjo6TEZPLXN5bmM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TEZPLXN5bmM8L05JQ0s+Cis8QkxVUkI+TEZPLXN5bmMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWltcDo6R2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTkwLDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkdhaW48L05JQ0s+Cis8QkxVUkI+R2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWltcDo6SGlnaC1sYXRlbmN5LW1vZGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SGlnaC1sYXRlbmN5LW1vZGU8L05JQ0s+Cis8QkxVUkI+SGlnaC1sYXRlbmN5LW1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1pbXA6OkltcHVsc2UtSUQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDIxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkltcHVsc2UtSUQ8L05JQ0s+Cis8QkxVUkI+SW1wdWxzZS1JRC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWltcDo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZHluYW1pY3MtbTo6QXR0YWNrLS1tcy08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzQsNTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkF0dGFjay0tbXMtPC9OSUNLPgorPEJMVVJCPkF0dGFjay0tbXMtLjwvQkxVUkI+Cis8REVGQVVMVD4xMjg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZHluYW1pY3MtbTo6RW52ZWxvcGUtVm9sdW1lLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy02MCwyMF08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+RW52ZWxvcGUtVm9sdW1lLS1kQi08L05JQ0s+Cis8QkxVUkI+RW52ZWxvcGUtVm9sdW1lLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZHluYW1pY3MtbTo6RnVuY3Rpb248L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDE0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZ1bmN0aW9uPC9OSUNLPgorPEJMVVJCPkZ1bmN0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWR5bmFtaWNzLW06OkdhaW4tQWRqdXN0bWVudC0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNjAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkdhaW4tQWRqdXN0bWVudC0tZEItPC9OSUNLPgorPEJMVVJCPkdhaW4tQWRqdXN0bWVudC0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWR5bmFtaWNzLW06Ok1ha2V1cC1HYWluLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yMCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5NYWtldXAtR2Fpbi0tZEItPC9OSUNLPgorPEJMVVJCPk1ha2V1cC1HYWluLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZHluYW1pY3MtbTo6T2Zmc2V0LUdhaW4tLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTIwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk9mZnNldC1HYWluLS1kQi08L05JQ0s+Cis8QkxVUkI+T2Zmc2V0LUdhaW4tLWRCLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1keW5hbWljcy1tOjpSZWxlYXNlLS1tcy08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzQsMTAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZWxlYXNlLS1tcy08L05JQ0s+Cis8QkxVUkI+UmVsZWFzZS0tbXMtLjwvQkxVUkI+Cis8REVGQVVMVD41MDI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS14ZmFkZTo6Q3Jvc3NmYWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkNyb3NzZmFkZTwvTklDSz4KKzxCTFVSQj5Dcm9zc2ZhZGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS14ZmFkZTQ6OkNyb3NzZmFkZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Dcm9zc2ZhZGU8L05JQ0s+Cis8QkxVUkI+Q3Jvc3NmYWRlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLXRyZW1vbG86OkRlcHRoLS0tLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVwdGgtLS0tPC9OSUNLPgorPEJMVVJCPkRlcHRoLS0tLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC10cmVtb2xvOjpGcmVxdWVuY3ktLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3ktLUh6LTwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3ktLUh6LS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC10cmVtb2xvOjpHYWluLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5HYWluLS1kQi08L05JQ0s+Cis8QkxVUkI+R2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGl0Y2hTY2FsZTo6UGl0Y2gtY28tZWZmaWNpZW50PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDUsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5QaXRjaC1jby1lZmZpY2llbnQ8L05JQ0s+Cis8QkxVUkI+UGl0Y2gtY28tZWZmaWNpZW50LjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGl0Y2hTY2FsZTo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waXRjaFNjYWxlSFE6OlBpdGNoLWNvLWVmZmljaWVudDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw1LDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UGl0Y2gtY28tZWZmaWNpZW50PC9OSUNLPgorPEJMVVJCPlBpdGNoLWNvLWVmZmljaWVudC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBpdGNoU2NhbGVIUTo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12YWx2ZVJlY3Q6OkRpc3RvcnRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EaXN0b3J0aW9uPC9OSUNLPgorPEJMVVJCPkRpc3RvcnRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12YWx2ZVJlY3Q6OlNhZy1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNhZy1sZXZlbDwvTklDSz4KKzxCTFVSQj5TYWctbGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcGlua25vaXNlOjpGcmFjdGFsLURpbWVuc2lvbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyYWN0YWwtRGltZW5zaW9uPC9OSUNLPgorPEJMVVJCPkZyYWN0YWwtRGltZW5zaW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcGlua25vaXNlOjpOb2lzZS1MZXZlbC0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Tm9pc2UtTGV2ZWwtLWRCLTwvTklDSz4KKzxCTFVSQj5Ob2lzZS1MZXZlbC0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4tOTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcGlua25vaXNlOjpTaWduYWwtTGV2ZWwtLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTkwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNpZ25hbC1MZXZlbC0tZEItPC9OSUNLPgorPEJMVVJCPlNpZ25hbC1MZXZlbC0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaW50ZXJwb2xhdG9yOjpDb250cm9sLUlucHV0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkNvbnRyb2wtSW5wdXQ8L05JQ0s+Cis8QkxVUkI+Q29udHJvbC1JbnB1dC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpCYW5kLTEtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMS1nYWluPC9OSUNLPgorPEJMVVJCPkJhbmQtMS1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpCYW5kLTItZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMi1nYWluPC9OSUNLPgorPEJMVVJCPkJhbmQtMi1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpCYW5kLTMtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMy1nYWluPC9OSUNLPgorPEJMVVJCPkJhbmQtMy1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEZWxheTEtZmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheTEtZmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+RGVsYXkxLWZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEZWxheTEtbGVuZ3RoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXkxLWxlbmd0aDwvTklDSz4KKzxCTFVSQj5EZWxheTEtbGVuZ3RoLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEZWxheTEtd2V0bmVzczwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbGF5MS13ZXRuZXNzPC9OSUNLPgorPEJMVVJCPkRlbGF5MS13ZXRuZXNzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEZWxheTItZmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheTItZmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+RGVsYXkyLWZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEZWxheTItbGVuZ3RoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXkyLWxlbmd0aDwvTklDSz4KKzxCTFVSQj5EZWxheTItbGVuZ3RoLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEZWxheTItd2V0bmVzczwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbGF5Mi13ZXRuZXNzPC9OSUNLPgorPEJMVVJCPkRlbGF5Mi13ZXRuZXNzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEZWxheTMtZmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheTMtZmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+RGVsYXkzLWZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEZWxheTMtbGVuZ3RoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXkzLWxlbmd0aDwvTklDSz4KKzxCTFVSQj5EZWxheTMtbGVuZ3RoLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEZWxheTMtd2V0bmVzczwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbGF5My13ZXRuZXNzPC9OSUNLPgorPEJMVVJCPkRlbGF5My13ZXRuZXNzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEaXN0MS1kcml2ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwzXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRpc3QxLWRyaXZlPC9OSUNLPgorPEJMVVJCPkRpc3QxLWRyaXZlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEaXN0Mi1kcml2ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwzXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRpc3QyLWRyaXZlPC9OSUNLPgorPEJMVVJCPkRpc3QyLWRyaXZlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEaXN0My1kcml2ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwzXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRpc3QzLWRyaXZlPC9OSUNLPgorPEJMVVJCPkRpc3QzLWRyaXZlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpGaWx0MS1MRk8xLWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNTAwLDUwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWx0MS1MRk8xLWxldmVsPC9OSUNLPgorPEJMVVJCPkZpbHQxLUxGTzEtbGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6OkZpbHQxLUxGTzItbGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy01MDAsNTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHQxLUxGTzItbGV2ZWw8L05JQ0s+Cis8QkxVUkI+RmlsdDEtTEZPMi1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6RmlsdDEtZnJlcTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw4MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHQxLWZyZXE8L05JQ0s+Cis8QkxVUkI+RmlsdDEtZnJlcS48L0JMVVJCPgorPERFRkFVTFQ+NDQwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpGaWx0MS1xPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdDEtcTwvTklDSz4KKzxCTFVSQj5GaWx0MS1xLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpGaWx0MS1yZXNvbmFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWx0MS1yZXNvbmFuY2U8L05JQ0s+Cis8QkxVUkI+RmlsdDEtcmVzb25hbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpGaWx0MS10eXBlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHQxLXR5cGU8L05JQ0s+Cis8QkxVUkI+RmlsdDEtdHlwZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6RmlsdDItTEZPMS1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTUwMCw1MDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdDItTEZPMS1sZXZlbDwvTklDSz4KKzxCTFVSQj5GaWx0Mi1MRk8xLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpGaWx0Mi1MRk8yLWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNTAwLDUwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWx0Mi1MRk8yLWxldmVsPC9OSUNLPgorPEJMVVJCPkZpbHQyLUxGTzItbGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6OkZpbHQyLWZyZXE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsODAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWx0Mi1mcmVxPC9OSUNLPgorPEJMVVJCPkZpbHQyLWZyZXEuPC9CTFVSQj4KKzxERUZBVUxUPjQ0MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6RmlsdDItcTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHQyLXE8L05JQ0s+Cis8QkxVUkI+RmlsdDItcS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6RmlsdDItcmVzb25hbmNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdDItcmVzb25hbmNlPC9OSUNLPgorPEJMVVJCPkZpbHQyLXJlc29uYW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6RmlsdDItdHlwZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWx0Mi10eXBlPC9OSUNLPgorPEJMVVJCPkZpbHQyLXR5cGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6OkZpbHQzLUxGTzEtbGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy01MDAsNTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHQzLUxGTzEtbGV2ZWw8L05JQ0s+Cis8QkxVUkI+RmlsdDMtTEZPMS1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6RmlsdDMtTEZPMi1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTUwMCw1MDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdDMtTEZPMi1sZXZlbDwvTklDSz4KKzxCTFVSQj5GaWx0My1MRk8yLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpGaWx0My1mcmVxPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDgwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdDMtZnJlcTwvTklDSz4KKzxCTFVSQj5GaWx0My1mcmVxLjwvQkxVUkI+Cis8REVGQVVMVD40NDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6OkZpbHQzLXE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWx0My1xPC9OSUNLPgorPEJMVVJCPkZpbHQzLXEuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6OkZpbHQzLXJlc29uYW5jZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHQzLXJlc29uYW5jZTwvTklDSz4KKzxCTFVSQj5GaWx0My1yZXNvbmFuY2UuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6OkZpbHQzLXR5cGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdDMtdHlwZTwvTklDSz4KKzxCTFVSQj5GaWx0My10eXBlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpJbnB1dC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5wdXQtZ2FpbjwvTklDSz4KKzxCTFVSQj5JbnB1dC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpMRk8xLWZyZXE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MRk8xLWZyZXE8L05JQ0s+Cis8QkxVUkI+TEZPMS1mcmVxLjwvQkxVUkI+Cis8REVGQVVMVD4yNTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6OkxGTzEtd2F2ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MRk8xLXdhdmU8L05JQ0s+Cis8QkxVUkI+TEZPMS13YXZlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpMRk8yLWZyZXE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MRk8yLWZyZXE8L05JQ0s+Cis8QkxVUkI+TEZPMi1mcmVxLjwvQkxVUkI+Cis8REVGQVVMVD4yNTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6OkxGTzItd2F2ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MRk8yLXdhdmU8L05JQ0s+Cis8QkxVUkI+TEZPMi13YXZlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpPc2MxLWZyZXE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Pc2MxLWZyZXE8L05JQ0s+Cis8QkxVUkI+T3NjMS1mcmVxLjwvQkxVUkI+Cis8REVGQVVMVD40NDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6Ok9zYzEtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk9zYzEtZ2FpbjwvTklDSz4KKzxCTFVSQj5Pc2MxLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPi03MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6T3NjMS13YXZlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk9zYzEtd2F2ZTwvTklDSz4KKzxCTFVSQj5Pc2MxLXdhdmUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6Ok9zYzItZnJlcTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw0MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk9zYzItZnJlcTwvTklDSz4KKzxCTFVSQj5Pc2MyLWZyZXEuPC9CTFVSQj4KKzxERUZBVUxUPjQ0MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6T3NjMi1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3NjMi1nYWluPC9OSUNLPgorPEJMVVJCPk9zYzItZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+LTcwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpPc2MyLXdhdmU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3NjMi13YXZlPC9OSUNLPgorPEJMVVJCPk9zYzItd2F2ZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6Uk0xLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5STTEtZ2FpbjwvTklDSz4KKzxCTFVSQj5STTEtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+LTcwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpSTTItZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJNMi1nYWluPC9OSUNLPgorPEJMVVJCPlJNMi1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4tNzA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6OlJNMy1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Uk0zLWdhaW48L05JQ0s+Cis8QkxVUkI+Uk0zLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPi03MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6UmluZ21vZC0xLWRlcHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmluZ21vZC0xLWRlcHRoPC9OSUNLPgorPEJMVVJCPlJpbmdtb2QtMS1kZXB0aC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6UmluZ21vZC0yLWRlcHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmluZ21vZC0yLWRlcHRoPC9OSUNLPgorPEJMVVJCPlJpbmdtb2QtMi1kZXB0aC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6UmluZ21vZC0zLWRlcHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmluZ21vZC0zLWRlcHRoPC9OSUNLPgorPEJMVVJCPlJpbmdtb2QtMy1kZXB0aC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6WG92ZXItbG93ZXItZnJlcTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNTAsNjAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Yb3Zlci1sb3dlci1mcmVxPC9OSUNLPgorPEJMVVJCPlhvdmVyLWxvd2VyLWZyZXEuPC9CTFVSQj4KKzxERUZBVUxUPjE1MzcsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6WG92ZXItdXBwZXItZnJlcTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMTAwMCwxMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Yb3Zlci11cHBlci1mcmVxPC9OSUNLPgorPEJMVVJCPlhvdmVyLXVwcGVyLWZyZXEuPC9CTFVSQj4KKzxERUZBVUxUPjc3NTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1pbXB1bHNlLWZjOjpGcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1ib2RlU2hpZnRlcjo6RnJlcXVlbmN5LXNoaWZ0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDUwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LXNoaWZ0PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS1zaGlmdC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWJvZGVTaGlmdGVyOjpsYXRlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5sYXRlbmN5PC9OSUNLPgorPEJMVVJCPmxhdGVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcm1vbmljR2VuOjpGdW5kYW1lbnRhbC1tYWduaXR1ZGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnVuZGFtZW50YWwtbWFnbml0dWRlPC9OSUNLPgorPEJMVVJCPkZ1bmRhbWVudGFsLW1hZ25pdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcm1vbmljR2VuOjpwYXJhbS0xMHRoLWhhcm1vbmljLW1hZ25pdHVkZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0xMHRoLWhhcm1vbmljLW1hZ25pdHVkZTwvTklDSz4KKzxCTFVSQj5wYXJhbS0xMHRoLWhhcm1vbmljLW1hZ25pdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcm1vbmljR2VuOjpwYXJhbS0ybmQtaGFybW9uaWMtbWFnbml0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTJuZC1oYXJtb25pYy1tYWduaXR1ZGU8L05JQ0s+Cis8QkxVUkI+cGFyYW0tMm5kLWhhcm1vbmljLW1hZ25pdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcm1vbmljR2VuOjpwYXJhbS0zcmQtaGFybW9uaWMtbWFnbml0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTNyZC1oYXJtb25pYy1tYWduaXR1ZGU8L05JQ0s+Cis8QkxVUkI+cGFyYW0tM3JkLWhhcm1vbmljLW1hZ25pdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcm1vbmljR2VuOjpwYXJhbS00dGgtaGFybW9uaWMtbWFnbml0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTR0aC1oYXJtb25pYy1tYWduaXR1ZGU8L05JQ0s+Cis8QkxVUkI+cGFyYW0tNHRoLWhhcm1vbmljLW1hZ25pdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcm1vbmljR2VuOjpwYXJhbS01dGgtaGFybW9uaWMtbWFnbml0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTV0aC1oYXJtb25pYy1tYWduaXR1ZGU8L05JQ0s+Cis8QkxVUkI+cGFyYW0tNXRoLWhhcm1vbmljLW1hZ25pdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcm1vbmljR2VuOjpwYXJhbS02dGgtaGFybW9uaWMtbWFnbml0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTZ0aC1oYXJtb25pYy1tYWduaXR1ZGU8L05JQ0s+Cis8QkxVUkI+cGFyYW0tNnRoLWhhcm1vbmljLW1hZ25pdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcm1vbmljR2VuOjpwYXJhbS03dGgtaGFybW9uaWMtbWFnbml0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTd0aC1oYXJtb25pYy1tYWduaXR1ZGU8L05JQ0s+Cis8QkxVUkI+cGFyYW0tN3RoLWhhcm1vbmljLW1hZ25pdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcm1vbmljR2VuOjpwYXJhbS04dGgtaGFybW9uaWMtbWFnbml0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTh0aC1oYXJtb25pYy1tYWduaXR1ZGU8L05JQ0s+Cis8QkxVUkI+cGFyYW0tOHRoLWhhcm1vbmljLW1hZ25pdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcm1vbmljR2VuOjpwYXJhbS05dGgtaGFybW9uaWMtbWFnbml0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTl0aC1oYXJtb25pYy1tYWduaXR1ZGU8L05JQ0s+Cis8QkxVUkI+cGFyYW0tOXRoLWhhcm1vbmljLW1hZ25pdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXB1bHNlLWZhcGMtb2E6OlB1bHNlLVdpZHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UHVsc2UtV2lkdGg8L05JQ0s+Cis8QkxVUkI+UHVsc2UtV2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXB1bHNlLWZjcGEtb2E6OkZyZXF1ZW56PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDkxODc1LDIyMDUwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW56PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW56LjwvQkxVUkI+Cis8REVGQVVMVD40NDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1wdWxzZS1mY3BjLW9hOjpGcmVxdWVuejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw5MTg3NSwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuejwvTklDSz4KKzxCTFVSQj5GcmVxdWVuei48L0JMVVJCPgorPERFRkFVTFQ+NDQwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcHVsc2UtZmNwYy1vYTo6UHVsc2UtV2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5QdWxzZS1XaWR0aDwvTklDSz4KKzxCTFVSQj5QdWxzZS1XaWR0aC48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbG93cGFzcy1paXI6OkN1dG9mZi1GcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzQsNDEsMTk4NDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Q3V0b2ZmLUZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5DdXRvZmYtRnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4yNDIyLDk3PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbG93cGFzcy1paXI6OlN0YWdlcy0yLXBvbGVzLXBlci1zdGFnZS08L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN0YWdlcy0yLXBvbGVzLXBlci1zdGFnZS08L05JQ0s+Cis8QkxVUkI+U3RhZ2VzLTItcG9sZXMtcGVyLXN0YWdlLS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1yb3RzcGVhazo6SG9ybi1GcmVxdWVuY3ktLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Ib3JuLUZyZXF1ZW5jeS0tSHotPC9OSUNLPgorPEJMVVJCPkhvcm4tRnJlcXVlbmN5LS1Iei0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcm90c3BlYWs6Ok1pYy1EaXN0YW5jZS0tLS08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1pYy1EaXN0YW5jZS0tLS08L05JQ0s+Cis8QkxVUkI+TWljLURpc3RhbmNlLS0tLS48L0JMVVJCPgorPERFRkFVTFQ+MjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcm90c3BlYWs6OlJvdG9yLUZyZXF1ZW5jeS0tSHotPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJvdG9yLUZyZXF1ZW5jeS0tSHotPC9OSUNLPgorPEJMVVJCPlJvdG9yLUZyZXF1ZW5jeS0tSHotLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLXJvdHNwZWFrOjpSb3Rvci1Ib3JuLU1peDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJvdG9yLUhvcm4tTWl4PC9OSUNLPgorPEJMVVJCPlJvdG9yLUhvcm4tTWl4LjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcm90c3BlYWs6OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsOTIwMF08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD45MjAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLXZpYnJhdG86OkRlcHRoLS0tLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZXB0aC0tLS08L05JQ0s+Cis8QkxVUkI+RGVwdGgtLS0tLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLXZpYnJhdG86OkRyeS1MZXZlbC0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LUxldmVsLS1kQi08L05JQ0s+Cis8QkxVUkI+RHJ5LUxldmVsLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPi05MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC12aWJyYXRvOjpGcmVxdWVuY3ktLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3ktLUh6LTwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3ktLUh6LS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC12aWJyYXRvOjpXZXQtTGV2ZWwtLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTkwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldldC1MZXZlbC0tZEItPC9OSUNLPgorPEJMVVJCPldldC1MZXZlbC0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLXZpYnJhdG86OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNjMwMF08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD42MzAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc3RlcE11eGVyOjpDcm9zc2ZhZGUtdGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Q3Jvc3NmYWRlLXRpbWU8L05JQ0s+Cis8QkxVUkI+Q3Jvc3NmYWRlLXRpbWUuPC9CTFVSQj4KKzxERUZBVUxUPjUwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZmxhbmdlcjo6RGVsYXktYmFzZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxLDI1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbGF5LWJhc2U8L05JQ0s+Cis8QkxVUkI+RGVsYXktYmFzZS48L0JMVVJCPgorPERFRkFVTFQ+NiwzMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1mbGFuZ2VyOjpGZWVkYmFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GZWVkYmFjazwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZsYW5nZXI6OkxGTy1mcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDUsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxGTy1mcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+TEZPLWZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MCwzMzQzNzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZsYW5nZXI6Ok1heC1zbG93ZG93bjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5NYXgtc2xvd2Rvd248L05JQ0s+Cis8QkxVUkI+TWF4LXNsb3dkb3duLjwvQkxVUkI+Cis8REVGQVVMVD4yLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbXA6OkFtcHMtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDcwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkFtcHMtZ2FpbjwvTklDSz4KKzxCTFVSQj5BbXBzLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kYWhkc3ItZyt0LWNvbnRyb2w6OkFia2xpbmd6ZWl0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BYmtsaW5nemVpdDwvTklDSz4KKzxCTFVSQj5BYmtsaW5nemVpdC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRhaGRzci1nK3QtY29udHJvbDo6QXVza2xpbmd6ZWl0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BdXNrbGluZ3plaXQ8L05JQ0s+Cis8QkxVUkI+QXVza2xpbmd6ZWl0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGFoZHNyLWcrdC1jb250cm9sOjpFaW5zY2h3aW5nemVpdDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RWluc2Nod2luZ3plaXQ8L05JQ0s+Cis8QkxVUkI+RWluc2Nod2luZ3plaXQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kYWhkc3ItZyt0LWNvbnRyb2w6OkhhbHRld2VydDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkhhbHRld2VydDwvTklDSz4KKzxCTFVSQj5IYWx0ZXdlcnQuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kYWhkc3ItZyt0LWNvbnRyb2w6OkhhbHRlemVpdDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SGFsdGV6ZWl0PC9OSUNLPgorPEJMVVJCPkhhbHRlemVpdC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRhaGRzci1nK3QtY29udHJvbDo6VmVyei0tZ2VydW5nc3plaXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZlcnotLWdlcnVuZ3N6ZWl0PC9OSUNLPgorPEJMVVJCPlZlcnotLWdlcnVuZ3N6ZWl0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGFoZHNyLWNnK3QtY29udHJvbDo6QWJrbGluZ3plaXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkFia2xpbmd6ZWl0PC9OSUNLPgorPEJMVVJCPkFia2xpbmd6ZWl0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGFoZHNyLWNnK3QtY29udHJvbDo6QXVza2xpbmd6ZWl0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BdXNrbGluZ3plaXQ8L05JQ0s+Cis8QkxVUkI+QXVza2xpbmd6ZWl0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGFoZHNyLWNnK3QtY29udHJvbDo6QXVzbC0tc2VyPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QXVzbC0tc2VyPC9OSUNLPgorPEJMVVJCPkF1c2wtLXNlci48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kYWhkc3ItY2crdC1jb250cm9sOjpFaW5zY2h3aW5nemVpdDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RWluc2Nod2luZ3plaXQ8L05JQ0s+Cis8QkxVUkI+RWluc2Nod2luZ3plaXQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kYWhkc3ItY2crdC1jb250cm9sOjpHYXR0ZXI8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5HYXR0ZXI8L05JQ0s+Cis8QkxVUkI+R2F0dGVyLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRhaGRzci1jZyt0LWNvbnRyb2w6OkhhbHRld2VydDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkhhbHRld2VydDwvTklDSz4KKzxCTFVSQj5IYWx0ZXdlcnQuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kYWhkc3ItY2crdC1jb250cm9sOjpIYWx0ZXplaXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkhhbHRlemVpdDwvTklDSz4KKzxCTFVSQj5IYWx0ZXplaXQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kYWhkc3ItY2crdC1jb250cm9sOjpWZXJ6LS1nZXJ1bmdzemVpdDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmVyei0tZ2VydW5nc3plaXQ8L05JQ0s+Cis8QkxVUkI+VmVyei0tZ2VydW5nc3plaXQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TeW5jLVNhdy1WQ086OkV4cC1GTS1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RXhwLUZNLWdhaW48L05JQ0s+Cis8QkxVUkI+RXhwLUZNLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TeW5jLVNhdy1WQ086OkxQLWZpbHRlcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxQLWZpbHRlcjwvTklDSz4KKzxCTFVSQj5MUC1maWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN5bmMtU2F3LVZDTzo6TGluLUZNLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MaW4tRk0tZ2FpbjwvTklDSz4KKzxCTFVSQj5MaW4tRk0tZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN5bmMtU2F3LVZDTzo6T2N0YXZlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bLTQsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PY3RhdmU8L05JQ0s+Cis8QkxVUkI+T2N0YXZlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3luYy1TYXctVkNPOjpUdW5lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VHVuZTwvTklDSz4KKzxCTFVSQj5UdW5lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3luYy1SZWN0LVZDTzo6RXhwLUZNLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5FeHAtRk0tZ2FpbjwvTklDSz4KKzxCTFVSQj5FeHAtRk0tZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN5bmMtUmVjdC1WQ086OkxQLWZpbHRlcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxQLWZpbHRlcjwvTklDSz4KKzxCTFVSQj5MUC1maWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN5bmMtUmVjdC1WQ086Okxpbi1GTS1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TGluLUZNLWdhaW48L05JQ0s+Cis8QkxVUkI+TGluLUZNLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TeW5jLVJlY3QtVkNPOjpPY3RhdmU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlstNCw0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk9jdGF2ZTwvTklDSz4KKzxCTFVSQj5PY3RhdmUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TeW5jLVJlY3QtVkNPOjpUdW5lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VHVuZTwvTklDSz4KKzxCTFVSQj5UdW5lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3luYy1SZWN0LVZDTzo6V01vZC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+V01vZC1nYWluPC9OSUNLPgorPEJMVVJCPldNb2QtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN5bmMtUmVjdC1WQ086OldhdmVmb3JtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldhdmVmb3JtPC9OSUNLPgorPEJMVVJCPldhdmVmb3JtLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3luYy1UcmktVkNPOjpFeHAtRk0tZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkV4cC1GTS1nYWluPC9OSUNLPgorPEJMVVJCPkV4cC1GTS1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3luYy1UcmktVkNPOjpMUC1maWx0ZXI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MUC1maWx0ZXI8L05JQ0s+Cis8QkxVUkI+TFAtZmlsdGVyLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TeW5jLVRyaS1WQ086Okxpbi1GTS1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TGluLUZNLWdhaW48L05JQ0s+Cis8QkxVUkI+TGluLUZNLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TeW5jLVRyaS1WQ086Ok9jdGF2ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Wy00LDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T2N0YXZlPC9OSUNLPgorPEJMVVJCPk9jdGF2ZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN5bmMtVHJpLVZDTzo6VHVuZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlR1bmU8L05JQ0s+Cis8QkxVUkI+VHVuZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN5bmMtVHJpLVZDTzo6V01vZC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+V01vZC1nYWluPC9OSUNLPgorPEJMVVJCPldNb2QtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN5bmMtVHJpLVZDTzo6V2F2ZWZvcm08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+V2F2ZWZvcm08L05JQ0s+Cis8QkxVUkI+V2F2ZWZvcm0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1id3hvdmVyLWlpcjo6Q3V0b2ZmLUZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNCw0MSwxOTg0NV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5DdXRvZmYtRnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkN1dG9mZi1GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjM2LDExOTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1id3hvdmVyLWlpcjo6UmVzb25hbmNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEsMSw0MV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2U8L05JQ0s+Cis8QkxVUkI+UmVzb25hbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDc1NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWJ1dHRsb3ctaWlyOjpDdXRvZmYtRnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls0LDQxLDE5ODQ1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkN1dG9mZi1GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+Q3V0b2ZmLUZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MzYsMTE5NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWJ1dHRsb3ctaWlyOjpSZXNvbmFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMSwxLDQxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc29uYW5jZTwvTklDSz4KKzxCTFVSQj5SZXNvbmFuY2UuPC9CTFVSQj4KKzxERUZBVUxUPjAsNzU1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYnV0dGhpZ2gtaWlyOjpDdXRvZmYtRnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls0LDQxLDE5ODQ1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkN1dG9mZi1GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+Q3V0b2ZmLUZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MzYsMTE5NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWJ1dHRoaWdoLWlpcjo6UmVzb25hbmNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEsMSw0MV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2U8L05JQ0s+Cis8QkxVUkI+UmVzb25hbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDc1NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLU12Y2hwZi0xOjpFeHAtRk0tZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5FeHAtRk0tZ2FpbjwvTklDSz4KKzxCTFVSQj5FeHAtRk0tZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLU12Y2hwZi0xOjpGcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy02LDZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLU12Y2hwZi0xOjpJbnB1dC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNjAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5wdXQtZ2FpbjwvTklDSz4KKzxCTFVSQj5JbnB1dC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtTXZjaHBmLTE6Ok91dHB1dC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMTUsMTVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0LWdhaW48L05JQ0s+Cis8QkxVUkI+T3V0cHV0LWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmFja2VyLWdhYWNkY2lhLW9hOjpBdHRhY2stUmF0ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw5MTg3NSwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BdHRhY2stUmF0ZTwvTklDSz4KKzxCTFVSQj5BdHRhY2stUmF0ZS48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJhY2tlci1nYWFjZGNpYS1vYTo6QXR0YWNrLVJhdGUtMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw5MTg3NSwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BdHRhY2stUmF0ZS0xPC9OSUNLPgorPEJMVVJCPkF0dGFjay1SYXRlLTEuPC9CTFVSQj4KKzxERUZBVUxUPjEwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRyYWNrZXItZ2FhY2RjaWEtb2E6OkRlY2F5LVJhdGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsOTE4NzUsMjIwNTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVjYXktUmF0ZTwvTklDSz4KKzxCTFVSQj5EZWNheS1SYXRlLjwvQkxVUkI+Cis8REVGQVVMVD4xMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmFja2VyLWdhYWNkY2lhLW9hOjpEZWNheS1SYXRlLTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsOTE4NzUsMjIwNTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVjYXktUmF0ZS0xPC9OSUNLPgorPEJMVVJCPkRlY2F5LVJhdGUtMS48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWRvdWJsZXI6OkRyeS1MZWZ0LVBvc2l0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LUxlZnQtUG9zaXRpb248L05JQ0s+Cis8QkxVUkI+RHJ5LUxlZnQtUG9zaXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZG91Ymxlcjo6RHJ5LUxldmVsLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy05MCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EcnktTGV2ZWwtLWRCLTwvTklDSz4KKzxCTFVSQj5EcnktTGV2ZWwtLWRCLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1kb3VibGVyOjpEcnktUmlnaHQtUG9zaXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EcnktUmlnaHQtUG9zaXRpb248L05JQ0s+Cis8QkxVUkI+RHJ5LVJpZ2h0LVBvc2l0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWRvdWJsZXI6OlBpdGNoLVRyYWNraW5nPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UGl0Y2gtVHJhY2tpbmc8L05JQ0s+Cis8QkxVUkI+UGl0Y2gtVHJhY2tpbmcuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1kb3VibGVyOjpUaW1lLVRyYWNraW5nPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGltZS1UcmFja2luZzwvTklDSz4KKzxCTFVSQj5UaW1lLVRyYWNraW5nLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZG91Ymxlcjo6V2V0LUxlZnQtUG9zaXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5XZXQtTGVmdC1Qb3NpdGlvbjwvTklDSz4KKzxCTFVSQj5XZXQtTGVmdC1Qb3NpdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1kb3VibGVyOjpXZXQtTGV2ZWwtLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTkwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldldC1MZXZlbC0tZEItPC9OSUNLPgorPEJMVVJCPldldC1MZXZlbC0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWRvdWJsZXI6OldldC1SaWdodC1Qb3NpdGlvbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldldC1SaWdodC1Qb3NpdGlvbjwvTklDSz4KKzxCTFVSQj5XZXQtUmlnaHQtUG9zaXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbXAtZ2NpYS1vYTo6VmVyc3QtLXJrdW5nPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOTYsOTZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmVyc3QtLXJrdW5nPC9OSUNLPgorPEJMVVJCPlZlcnN0LS1ya3VuZy48L0JMVVJCPgorPERFRkFVTFQ+LTk2PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMTY6OkNsb3NlZC1HYXRlLVZhbHVlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkNsb3NlZC1HYXRlLVZhbHVlPC9OSUNLPgorPEJMVVJCPkNsb3NlZC1HYXRlLVZhbHVlLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIxNjo6TG9vcC1TdGVwczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsMTZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TG9vcC1TdGVwczwvTklDSz4KKzxCTFVSQj5Mb29wLVN0ZXBzLjwvQkxVUkI+Cis8REVGQVVMVD4xNjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjE2OjpSZXNldC10by1WYWx1ZS1vbi1HYXRlLUNsb3NlLTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNldC10by1WYWx1ZS1vbi1HYXRlLUNsb3NlLTwvTklDSz4KKzxCTFVSQj5SZXNldC10by1WYWx1ZS1vbi1HYXRlLUNsb3NlLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjE2OjpWYWx1ZS1TdGVwLTA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0wPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMTY6OlZhbHVlLVN0ZXAtMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIxNjo6VmFsdWUtU3RlcC0xMDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTEwPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMTAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjE2OjpWYWx1ZS1TdGVwLTExPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMTE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xMS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMTY6OlZhbHVlLVN0ZXAtMTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0xMjwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTEyLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIxNjo6VmFsdWUtU3RlcC0xMzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTEzPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMTMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjE2OjpWYWx1ZS1TdGVwLTE0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMTQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xNC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMTY6OlZhbHVlLVN0ZXAtMTU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0xNTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTE1LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIxNjo6VmFsdWUtU3RlcC0yPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMjwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjE2OjpWYWx1ZS1TdGVwLTM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0zPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMTY6OlZhbHVlLVN0ZXAtNDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC00LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIxNjo6VmFsdWUtU3RlcC01PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjE2OjpWYWx1ZS1TdGVwLTY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC02PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMTY6OlZhbHVlLVN0ZXAtNzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC03LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIxNjo6VmFsdWUtU3RlcC04PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtODwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjE2OjpWYWx1ZS1TdGVwLTk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC05PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtOS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2MyOjpBdHRhY2stdGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMiw0MDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QXR0YWNrLXRpbWU8L05JQ0s+Cis8QkxVUkI+QXR0YWNrLXRpbWUuPC9CTFVSQj4KKzxERUZBVUxUPjEwMSw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2MyOjpLbmVlLXJhZGl1czwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5LbmVlLXJhZGl1czwvTklDSz4KKzxCTFVSQj5LbmVlLXJhZGl1cy48L0JMVVJCPgorPERFRkFVTFQ+MywyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjMjo6TWFrZXVwLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TWFrZXVwLWdhaW48L05JQ0s+Cis8QkxVUkI+TWFrZXVwLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zYzI6OlJhdGlvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJhdGlvPC9OSUNLPgorPEJMVVJCPlJhdGlvLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2MyOjpSZWxlYXNlLXRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIsODAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlbGVhc2UtdGltZTwvTklDSz4KKzxCTFVSQj5SZWxlYXNlLXRpbWUuPC9CTFVSQj4KKzxERUZBVUxUPjQwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjMjo6VGhyZXNob2xkLWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMzAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UaHJlc2hvbGQtbGV2ZWw8L05JQ0s+Cis8QkxVUkI+VGhyZXNob2xkLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZHlzb25Db21wcmVzczo6Q29tcHJlc3Npb24tcmF0aW88L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Db21wcmVzc2lvbi1yYXRpbzwvTklDSz4KKzxCTFVSQj5Db21wcmVzc2lvbi1yYXRpby48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZHlzb25Db21wcmVzczo6RmFzdC1jb21wcmVzc2lvbi1yYXRpbzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZhc3QtY29tcHJlc3Npb24tcmF0aW88L05JQ0s+Cis8QkxVUkI+RmFzdC1jb21wcmVzc2lvbi1yYXRpby48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZHlzb25Db21wcmVzczo6UGVhay1saW1pdDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTMwLDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UGVhay1saW1pdDwvTklDSz4KKzxCTFVSQj5QZWFrLWxpbWl0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZHlzb25Db21wcmVzczo6UmVsZWFzZS10aW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVsZWFzZS10aW1lPC9OSUNLPgorPEJMVVJCPlJlbGVhc2UtdGltZS48L0JMVVJCPgorPERFRkFVTFQ+MCwyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRlY2F5OjpEZWNheS1UaW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWNheS1UaW1lPC9OSUNLPgorPEJMVVJCPkRlY2F5LVRpbWUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbGlhczo6QWxpYXNpbmctbGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BbGlhc2luZy1sZXZlbDwvTklDSz4KKzxCTFVSQj5BbGlhc2luZy1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNvb3Blckxvb3Blcjo6Q3ljbGUtTGVuZ3RoLU91dDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkN5Y2xlLUxlbmd0aC1PdXQ8L05JQ0s+Cis8QkxVUkI+Q3ljbGUtTGVuZ3RoLU91dC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNvb3Blckxvb3Blcjo6RHJ5LUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LUxldmVsPC9OSUNLPgorPEJMVVJCPkRyeS1MZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNvb3Blckxvb3Blcjo6RmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GZWVkYmFjazwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNvb3Blckxvb3Blcjo6RnJlZS1TYW1wbGUtTWVtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+RnJlZS1TYW1wbGUtTWVtPC9OSUNLPgorPEJMVVJCPkZyZWUtU2FtcGxlLU1lbS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNvb3Blckxvb3Blcjo6TG9vcC1MZW5ndGgtT3V0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+TG9vcC1MZW5ndGgtT3V0PC9OSUNLPgorPEJMVVJCPkxvb3AtTGVuZ3RoLU91dC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNvb3Blckxvb3Blcjo6TG9vcC1Qb3NpdGlvbi1PdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5Mb29wLVBvc2l0aW9uLU91dDwvTklDSz4KKzxCTFVSQj5Mb29wLVBvc2l0aW9uLU91dC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNvb3Blckxvb3Blcjo6TXVsdGktQ29udHJvbDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMTI3XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk11bHRpLUNvbnRyb2w8L05JQ0s+Cis8QkxVUkI+TXVsdGktQ29udHJvbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNvb3Blckxvb3Blcjo6TXVsdGlDdHJsLTEwczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMTJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TXVsdGlDdHJsLTEwczwvTklDSz4KKzxCTFVSQj5NdWx0aUN0cmwtMTBzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU29vcGVyTG9vcGVyOjpRdWFudGl6ZU1vZGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjw9IEdfTUlOSU5UPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UXVhbnRpemVNb2RlPC9OSUNLPgorPEJMVVJCPlF1YW50aXplTW9kZS48L0JMVVJCPgorPERFRkFVTFQ+LTIxNDc0ODM2NDg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Tb29wZXJMb29wZXI6OlJhdGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy00LDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmF0ZTwvTklDSz4KKzxCTFVSQj5SYXRlLjwvQkxVUkI+Cis8REVGQVVMVD4tNDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNvb3Blckxvb3Blcjo6UmVkb1RhcE1vZGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjw9IEdfTUlOSU5UPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVkb1RhcE1vZGU8L05JQ0s+Cis8QkxVUkI+UmVkb1RhcE1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPi0yMTQ3NDgzNjQ4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU29vcGVyTG9vcGVyOjpSb3VuZE1vZGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjw9IEdfTUlOSU5UPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Um91bmRNb2RlPC9OSUNLPgorPEJMVVJCPlJvdW5kTW9kZS48L0JMVVJCPgorPERFRkFVTFQ+LTIxNDc0ODM2NDg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Tb29wZXJMb29wZXI6OlNjcmF0Y2gtRGVzdGluYXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TY3JhdGNoLURlc3RpbmF0aW9uPC9OSUNLPgorPEJMVVJCPlNjcmF0Y2gtRGVzdGluYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Tb29wZXJMb29wZXI6OlN0YXRlLU91dHB1dDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+U3RhdGUtT3V0cHV0PC9OSUNLPgorPEJMVVJCPlN0YXRlLU91dHB1dC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU29vcGVyTG9vcGVyOjpUYXAtRGVsYXktVHJpZ2dlcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRhcC1EZWxheS1UcmlnZ2VyPC9OSUNLPgorPEJMVVJCPlRhcC1EZWxheS1UcmlnZ2VyLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU29vcGVyTG9vcGVyOjpUb3RhbC1TYW1wbGUtTWVtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+VG90YWwtU2FtcGxlLU1lbTwvTklDSz4KKzxCTFVSQj5Ub3RhbC1TYW1wbGUtTWVtLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU29vcGVyTG9vcGVyOjpUcmlnZ2VyLVRocmVzaG9sZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRyaWdnZXItVGhyZXNob2xkPC9OSUNLPgorPEJMVVJCPlRyaWdnZXItVGhyZXNob2xkLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU29vcGVyTG9vcGVyOjpXZXQtTGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5XZXQtTGV2ZWw8L05JQ0s+Cis8QkxVUkI+V2V0LUxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmxldmVsLW1vbm86OkN1cnJlbnQtTXVsdGlwbGllcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMF08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+Q3VycmVudC1NdWx0aXBsaWVyPC9OSUNLPgorPEJMVVJCPkN1cnJlbnQtTXVsdGlwbGllci48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZsZXZlbC1tb25vOjpMb29rLWFoZWFkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TG9vay1haGVhZDwvTklDSz4KKzxCTFVSQj5Mb29rLWFoZWFkLjwvQkxVUkI+Cis8REVGQVVMVD4yLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12bGV2ZWwtbW9ubzo6TWF4aW11bS1NdWx0aXBsaWVyPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1heGltdW0tTXVsdGlwbGllcjwvTklDSz4KKzxCTFVSQj5NYXhpbXVtLU11bHRpcGxpZXIuPC9CTFVSQj4KKzxERUZBVUxUPjEwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmxldmVsLW1vbm86OlN0cmVuZ3RoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3RyZW5ndGg8L05JQ0s+Cis8QkxVUkI+U3RyZW5ndGguPC9CTFVSQj4KKzxERUZBVUxUPjAsNzU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12bGV2ZWwtbW9ubzo6VW5kbzwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlVuZG88L05JQ0s+Cis8QkxVUkI+VW5kby48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12bGV2ZWwtbW9ubzo6VXNlLU1heGltdW0tTXVsdGlwbGllcjwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlVzZS1NYXhpbXVtLU11bHRpcGxpZXI8L05JQ0s+Cis8QkxVUkI+VXNlLU1heGltdW0tTXVsdGlwbGllci48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12bGV2ZWwtc3RlcmVvOjpDdXJyZW50LU11bHRpcGxpZXI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkN1cnJlbnQtTXVsdGlwbGllcjwvTklDSz4KKzxCTFVSQj5DdXJyZW50LU11bHRpcGxpZXIuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12bGV2ZWwtc3RlcmVvOjpMb29rLWFoZWFkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TG9vay1haGVhZDwvTklDSz4KKzxCTFVSQj5Mb29rLWFoZWFkLjwvQkxVUkI+Cis8REVGQVVMVD4yLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12bGV2ZWwtc3RlcmVvOjpNYXhpbXVtLU11bHRpcGxpZXI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TWF4aW11bS1NdWx0aXBsaWVyPC9OSUNLPgorPEJMVVJCPk1heGltdW0tTXVsdGlwbGllci48L0JMVVJCPgorPERFRkFVTFQ+MTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12bGV2ZWwtc3RlcmVvOjpTdHJlbmd0aDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN0cmVuZ3RoPC9OSUNLPgorPEJMVVJCPlN0cmVuZ3RoLjwvQkxVUkI+Cis8REVGQVVMVD4wLDc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmxldmVsLXN0ZXJlbzo6VW5kbzwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlVuZG88L05JQ0s+Cis8QkxVUkI+VW5kby48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12bGV2ZWwtc3RlcmVvOjpVc2UtTWF4aW11bS1NdWx0aXBsaWVyPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VXNlLU1heGltdW0tTXVsdGlwbGllcjwvTklDSz4KKzxCTFVSQj5Vc2UtTWF4aW11bS1NdWx0aXBsaWVyLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFydGlmaWNpYWxMYXRlbmN5OjpEZWxheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheTwvTklDSz4KKzxCTFVSQj5EZWxheS48L0JMVVJCPgorPERFRkFVTFQ+MjUwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFydGlmaWNpYWxMYXRlbmN5OjpsYXRlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5sYXRlbmN5PC9OSUNLPgorPEJMVVJCPmxhdGVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRyaXBsZVBhcmE6OkJhbmQtMS1iYW5kd2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTEtYmFuZHdpZHRoPC9OSUNLPgorPEJMVVJCPkJhbmQtMS1iYW5kd2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmlwbGVQYXJhOjpCYW5kLTEtZnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls0LDQxLDIxNjA5XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMS1mcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+QmFuZC0xLWZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MzYsODk2NzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRyaXBsZVBhcmE6OkJhbmQtMS1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0xLWdhaW48L05JQ0s+Cis8QkxVUkI+QmFuZC0xLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmlwbGVQYXJhOjpCYW5kLTItYmFuZHdpZHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0yLWJhbmR3aWR0aDwvTklDSz4KKzxCTFVSQj5CYW5kLTItYmFuZHdpZHRoLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJpcGxlUGFyYTo6QmFuZC0yLWZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNCw0MSwyMTYwOV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTItZnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkJhbmQtMi1mcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjMwOCw3PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJpcGxlUGFyYTo6QmFuZC0yLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTItZ2FpbjwvTklDSz4KKzxCTFVSQj5CYW5kLTItZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRyaXBsZVBhcmE6OkJhbmQtMy1iYW5kd2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTMtYmFuZHdpZHRoPC9OSUNLPgorPEJMVVJCPkJhbmQtMy1iYW5kd2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmlwbGVQYXJhOjpCYW5kLTMtZnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls0LDQxLDIxNjA5XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMy1mcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+QmFuZC0zLWZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MjU4Miw3NzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRyaXBsZVBhcmE6OkJhbmQtMy1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0zLWdhaW48L05JQ0s+Cis8QkxVUkI+QmFuZC0zLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmlwbGVQYXJhOjpIaWdoLXNoZWx2aW5nLWZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNCw0MSwyMTYwOV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5IaWdoLXNoZWx2aW5nLWZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5IaWdoLXNoZWx2aW5nLWZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MjE2MDk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmlwbGVQYXJhOjpIaWdoLXNoZWx2aW5nLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5IaWdoLXNoZWx2aW5nLWdhaW48L05JQ0s+Cis8QkxVUkI+SGlnaC1zaGVsdmluZy1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJpcGxlUGFyYTo6SGlnaC1zaGVsdmluZy1zbG9wZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkhpZ2gtc2hlbHZpbmctc2xvcGU8L05JQ0s+Cis8QkxVUkI+SGlnaC1zaGVsdmluZy1zbG9wZS48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJpcGxlUGFyYTo6TG93LXNoZWx2aW5nLWZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNCw0MSwyMTYwOV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Mb3ctc2hlbHZpbmctZnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkxvdy1zaGVsdmluZy1mcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjQsNDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmlwbGVQYXJhOjpMb3ctc2hlbHZpbmctZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxvdy1zaGVsdmluZy1nYWluPC9OSUNLPgorPEJMVVJCPkxvdy1zaGVsdmluZy1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJpcGxlUGFyYTo6TG93LXNoZWx2aW5nLXNsb3BlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TG93LXNoZWx2aW5nLXNsb3BlPC9OSUNLPgorPEJMVVJCPkxvdy1zaGVsdmluZy1zbG9wZS48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmV2ZGVsYXk6OkNyb3NzZmFkZS1zYW1wbGVzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw1MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkNyb3NzZmFkZS1zYW1wbGVzPC9OSUNLPgorPEJMVVJCPkNyb3NzZmFkZS1zYW1wbGVzLjwvQkxVUkI+Cis8REVGQVVMVD4xMjUwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmV2ZGVsYXk6OkRlbGF5LVRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheS1UaW1lPC9OSUNLPgorPEJMVVJCPkRlbGF5LVRpbWUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1yZXZkZWxheTo6RHJ5LUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EcnktTGV2ZWw8L05JQ0s+Cis8QkxVUkI+RHJ5LUxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmV2ZGVsYXk6OkZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+RmVlZGJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1yZXZkZWxheTo6V2V0LUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5XZXQtTGV2ZWw8L05JQ0s+Cis8QkxVUkI+V2V0LUxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplcjo6QmFuZC0xLUZyZXEtLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNDAsMjgwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMS1GcmVxLS1Iei08L05JQ0s+Cis8QkxVUkI+QmFuZC0xLUZyZXEtLUh6LS48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplcjo6QmFuZC0xLUdhaW4tLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTUwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMS1HYWluLS1kQi08L05JQ0s+Cis8QkxVUkI+QmFuZC0xLUdhaW4tLWRCLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1lcXVhbGl6ZXI6OkJhbmQtMi1GcmVxLS1Iei08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEwMCw1MDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0yLUZyZXEtLUh6LTwvTklDSz4KKzxCTFVSQj5CYW5kLTItRnJlcS0tSHotLjwvQkxVUkI+Cis8REVGQVVMVD4yMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyOjpCYW5kLTItR2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0yLUdhaW4tLWRCLTwvTklDSz4KKzxCTFVSQj5CYW5kLTItR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplcjo6QmFuZC0zLUZyZXEtLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMjAwLDEwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0zLUZyZXEtLUh6LTwvTklDSz4KKzxCTFVSQj5CYW5kLTMtRnJlcS0tSHotLjwvQkxVUkI+Cis8REVGQVVMVD40MDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyOjpCYW5kLTMtR2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0zLUdhaW4tLWRCLTwvTklDSz4KKzxCTFVSQj5CYW5kLTMtR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplcjo6QmFuZC00LUZyZXEtLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNDAwLDI4MDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC00LUZyZXEtLUh6LTwvTklDSz4KKzxCTFVSQj5CYW5kLTQtRnJlcS0tSHotLjwvQkxVUkI+Cis8REVGQVVMVD4xMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplcjo6QmFuZC00LUdhaW4tLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTUwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtNC1HYWluLS1kQi08L05JQ0s+Cis8QkxVUkI+QmFuZC00LUdhaW4tLWRCLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1lcXVhbGl6ZXI6OkJhbmQtNS1GcmVxLS1Iei08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEwMDAsNTAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTUtRnJlcS0tSHotPC9OSUNLPgorPEJMVVJCPkJhbmQtNS1GcmVxLS1Iei0uPC9CTFVSQj4KKzxERUZBVUxUPjMwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyOjpCYW5kLTUtR2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC01LUdhaW4tLWRCLTwvTklDSz4KKzxCTFVSQj5CYW5kLTUtR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplcjo6QmFuZC02LUZyZXEtLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMzAwMCw5MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtNi1GcmVxLS1Iei08L05JQ0s+Cis8QkxVUkI+QmFuZC02LUZyZXEtLUh6LS48L0JMVVJCPgorPERFRkFVTFQ+NjAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1lcXVhbGl6ZXI6OkJhbmQtNi1HYWluLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy01MCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTYtR2Fpbi0tZEItPC9OSUNLPgorPEJMVVJCPkJhbmQtNi1HYWluLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyOjpCYW5kLTctRnJlcS0tSHotPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls2MDAwLDE4MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtNy1GcmVxLS1Iei08L05JQ0s+Cis8QkxVUkI+QmFuZC03LUZyZXEtLUh6LS48L0JMVVJCPgorPERFRkFVTFQ+MTIwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyOjpCYW5kLTctR2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC03LUdhaW4tLWRCLTwvTklDSz4KKzxCTFVSQj5CYW5kLTctR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplcjo6QmFuZC04LUZyZXEtLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMTAwMDAsMjAwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC04LUZyZXEtLUh6LTwvTklDSz4KKzxCTFVSQj5CYW5kLTgtRnJlcS0tSHotLjwvQkxVUkI+Cis8REVGQVVMVD4xNTAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1lcXVhbGl6ZXI6OkJhbmQtOC1HYWluLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy01MCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTgtR2Fpbi0tZEItPC9OSUNLPgorPEJMVVJCPkJhbmQtOC1HYWluLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1yZXRyb0ZsYW5nZTo6QXZlcmFnZS1zdGFsbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BdmVyYWdlLXN0YWxsPC9OSUNLPgorPEJMVVJCPkF2ZXJhZ2Utc3RhbGwuPC9CTFVSQj4KKzxERUZBVUxUPjIsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXJldHJvRmxhbmdlOjpGbGFuZ2UtZnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDUsOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GbGFuZ2UtZnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkZsYW5nZS1mcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbWJpc29uaWNzLW1vbm8tcGFubmVyOjpBemltdXRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMTgwLDE4MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BemltdXRoPC9OSUNLPgorPEJMVVJCPkF6aW11dGguPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbWJpc29uaWNzLW1vbm8tcGFubmVyOjpFbGV2YXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy05MCw5MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5FbGV2YXRpb248L05JQ0s+Cis8QkxVUkI+RWxldmF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1iaXNvbmljcy1zdGVyby1wYW5uZXI6OkF6aW11dGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xODAsMTgwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkF6aW11dGg8L05JQ0s+Cis8QkxVUkI+QXppbXV0aC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUFtYmlzb25pY3Mtc3Rlcm8tcGFubmVyOjpFbGV2YXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy05MCw5MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5FbGV2YXRpb248L05JQ0s+Cis8QkxVUkI+RWxldmF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1iaXNvbmljcy1zdGVyby1wYW5uZXI6OldpZHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOTAsOTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+V2lkdGg8L05JQ0s+Cis8QkxVUkI+V2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjkwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1iaXNvbmljcy1yb3RhdG9yOjpBbmdsZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTE4MCwxODBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QW5nbGU8L05JQ0s+Cis8QkxVUkI+QW5nbGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbWJpc29uaWNzLXNxdWFyZS1kZWNvZGVyOjpEaXN0YW5jZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EaXN0YW5jZTwvTklDSz4KKzxCTFVSQj5EaXN0YW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MzA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbWJpc29uaWNzLXNxdWFyZS1kZWNvZGVyOjpGcm9udDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyb250PC9OSUNLPgorPEJMVVJCPkZyb250LjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUFtYmlzb25pY3Mtc3F1YXJlLWRlY29kZXI6OkxGLXJhdGlvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TEYtcmF0aW88L05JQ0s+Cis8QkxVUkI+TEYtcmF0aW8uPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbWJpc29uaWNzLWhleGFnb24tZGVjb2Rlcjo6RGlzdGFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGlzdGFuY2U8L05JQ0s+Cis8QkxVUkI+RGlzdGFuY2UuPC9CTFVSQj4KKzxERUZBVUxUPjMwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1iaXNvbmljcy1oZXhhZ29uLWRlY29kZXI6OkZyb250PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJvbnQ8L05JQ0s+Cis8QkxVUkI+RnJvbnQuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1iaXNvbmljcy1oZXhhZ29uLWRlY29kZXI6OkxGLXJhdGlvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TEYtcmF0aW88L05JQ0s+Cis8QkxVUkI+TEYtcmF0aW8uPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1HMnJldmVyYjo6RGFtcGluZzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRhbXBpbmc8L05JQ0s+Cis8QkxVUkI+RGFtcGluZy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUcycmV2ZXJiOjpEcnktc291bmQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy04MCwwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRyeS1zb3VuZDwvTklDSz4KKzxCTFVSQj5Ecnktc291bmQuPC9CTFVSQj4KKzxERUZBVUxUPi04MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUcycmV2ZXJiOjpJbnB1dC1CVzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklucHV0LUJXPC9OSUNLPgorPEJMVVJCPklucHV0LUJXLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRzJyZXZlcmI6OlJlZmxlY3Rpb25zPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstODAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZWZsZWN0aW9uczwvTklDSz4KKzxCTFVSQj5SZWZsZWN0aW9ucy48L0JMVVJCPgorPERFRkFVTFQ+LTgwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRzJyZXZlcmI6OlJldmVyYi10YWlsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstODAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXZlcmItdGFpbDwvTklDSz4KKzxCTFVSQj5SZXZlcmItdGFpbC48L0JMVVJCPgorPERFRkFVTFQ+LTgwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRzJyZXZlcmI6OlJldmVyYi10aW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJldmVyYi10aW1lPC9OSUNLPgorPEJMVVJCPlJldmVyYi10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRzJyZXZlcmI6OlJvb20tc2l6ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMTAsMTUwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJvb20tc2l6ZTwvTklDSz4KKzxCTFVSQj5Sb29tLXNpemUuPC9CTFVSQj4KKzxERUZBVUxUPjEwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW1QaXRjaHNoaWZ0OjpCdWZmZXItc2l6ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsN108L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CdWZmZXItc2l6ZTwvTklDSz4KKzxCTFVSQj5CdWZmZXItc2l6ZS48L0JMVVJCPgorPERFRkFVTFQ+NDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFtUGl0Y2hzaGlmdDo6UGl0Y2gtc2hpZnQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMjUsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5QaXRjaC1zaGlmdDwvTklDSz4KKzxCTFVSQj5QaXRjaC1zaGlmdC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFtUGl0Y2hzaGlmdDo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1tb2REZWxheTo6QmFzZS1kZWxheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhc2UtZGVsYXk8L05JQ0s+Cis8QkxVUkI+QmFzZS1kZWxheS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1hdXRvcGFuOjpEZXB0aC0tLS08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlcHRoLS0tLTwvTklDSz4KKzxCTFVSQj5EZXB0aC0tLS0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtYXV0b3Bhbjo6RnJlcXVlbmN5LS1Iei08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LS1Iei08L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LS1Iei0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtYXV0b3Bhbjo6R2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+R2Fpbi0tZEItPC9OSUNLPgorPEJMVVJCPkdhaW4tLWRCLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXJhdGVTaGlmdGVyOjpSYXRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNCw0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJhdGU8L05JQ0s+Cis8QkxVUkI+UmF0ZS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUZpbHRlcjo6RnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxMCwyMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4xMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUZpbHRlcjo6SW5lcnRpYTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNSwxMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5lcnRpYTwvTklDSz4KKzxCTFVSQj5JbmVydGlhLjwvQkxVUkI+Cis8REVGQVVMVD41PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRmlsdGVyOjpNb2RlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1vZGU8L05JQ0s+Cis8QkxVUkI+TW9kZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUZpbHRlcjo6UmVzb25hbmNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDcwNywyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2U8L05JQ0s+Cis8QkxVUkI+UmVzb25hbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDcwNzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUZsYW5nZXI6OkFtb3VudDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkFtb3VudDwvTklDSz4KKzxCTFVSQj5BbW91bnQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1GbGFuZ2VyOjpGZWVkYmFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTAsOTksMCw5OV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GZWVkYmFjazwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+LTAsOTk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1GbGFuZ2VyOjpNaW5pbXVtLWRlbGF5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TWluaW11bS1kZWxheTwvTklDSz4KKzxCTFVSQj5NaW5pbXVtLWRlbGF5LjwvQkxVUkI+Cis8REVGQVVMVD4wLDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1GbGFuZ2VyOjpNb2R1bGF0aW9uLWRlcHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kdWxhdGlvbi1kZXB0aDwvTklDSz4KKzxCTFVSQj5Nb2R1bGF0aW9uLWRlcHRoLjwvQkxVUkI+Cis8REVGQVVMVD4wLDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1GbGFuZ2VyOjpNb2R1bGF0aW9uLXJhdGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kdWxhdGlvbi1yYXRlPC9OSUNLPgorPEJMVVJCPk1vZHVsYXRpb24tcmF0ZS48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUZsYW5nZXI6OlJlc2V0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVzZXQ8L05JQ0s+Cis8QkxVUkI+UmVzZXQuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRmxhbmdlcjo6U3RlcmVvLXBoYXNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDM2MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TdGVyZW8tcGhhc2U8L05JQ0s+Cis8QkxVUkI+U3RlcmVvLXBoYXNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUmV2ZXJiOjpBbW91bnQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BbW91bnQ8L05JQ0s+Cis8QkxVUkI+QW1vdW50LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUmV2ZXJiOjpEZWNheS10aW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDUsMTVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVjYXktdGltZTwvTklDSz4KKzxCTFVSQj5EZWNheS10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1SZXZlcmI6OkRpZmZ1c2lvbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRpZmZ1c2lvbjwvTklDSz4KKzxCTFVSQj5EaWZmdXNpb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1SZXZlcmI6OkhpZ2gtRnJxLURhbXA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIwMDAsMjAwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SGlnaC1GcnEtRGFtcDwvTklDSz4KKzxCTFVSQj5IaWdoLUZycS1EYW1wLjwvQkxVUkI+Cis8REVGQVVMVD4yMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUmV2ZXJiOjpSb29tLXNpemU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDNdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Um9vbS1zaXplPC9OSUNLPgorPEJMVVJCPlJvb20tc2l6ZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVZpbnRhZ2VEZWxheTo6QW1vdW50PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QW1vdW50PC9OSUNLPgorPEJMVVJCPkFtb3VudC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVZpbnRhZ2VEZWxheTo6RmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GZWVkYmFjazwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVZpbnRhZ2VEZWxheTo6TWVkaXVtPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1lZGl1bTwvTklDSz4KKzxCTFVSQj5NZWRpdW0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1WaW50YWdlRGVsYXk6Ok1peC1tb2RlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1peC1tb2RlPC9OSUNLPgorPEJMVVJCPk1peC1tb2RlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtVmludGFnZURlbGF5OjpTdWJkaXZpZGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDE2XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN1YmRpdmlkZTwvTklDSz4KKzxCTFVSQj5TdWJkaXZpZGUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1WaW50YWdlRGVsYXk6OlRlbXBvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlszMCwzMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGVtcG88L05JQ0s+Cis8QkxVUkI+VGVtcG8uPC9CTFVSQj4KKzxERUZBVUxUPjMwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtVmludGFnZURlbGF5OjpUaW1lLUw8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDE2XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRpbWUtTDwvTklDSz4KKzxCTFVSQj5UaW1lLUwuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1WaW50YWdlRGVsYXk6OlRpbWUtUjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsMTZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGltZS1SPC9OSUNLPgorPEJMVVJCPlRpbWUtUi48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVJvdGFyeVNwZWFrZXI6OlNwZWVkLU1vZGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3BlZWQtTW9kZTwvTklDSz4KKzxCTFVSQj5TcGVlZC1Nb2RlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUm90YXJ5U3BlYWtlcjo6VGFwLU9mZnNldDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRhcC1PZmZzZXQ8L05JQ0s+Cis8QkxVUkI+VGFwLU9mZnNldC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVJvdGFyeVNwZWFrZXI6OlRhcC1TcGFjaW5nPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGFwLVNwYWNpbmc8L05JQ0s+Cis8QkxVUkI+VGFwLVNwYWNpbmcuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZXI6OkFtb3VudDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkFtb3VudDwvTklDSz4KKzxCTFVSQj5BbW91bnQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZXI6OkNlbnRlci1GcmVxPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyMCwyMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5DZW50ZXItRnJlcTwvTklDSz4KKzxCTFVSQj5DZW50ZXItRnJlcS48L0JMVVJCPgorPERFRkFVTFQ+MjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZXI6OkZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMCw5OSwwLDk5XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPkZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4tMCw5OTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlcjo6TW9kdWxhdGlvbi1kZXB0aDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMDgwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Nb2R1bGF0aW9uLWRlcHRoPC9OSUNLPgorPEJMVVJCPk1vZHVsYXRpb24tZGVwdGguPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZXI6Ok1vZHVsYXRpb24tcmF0ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Nb2R1bGF0aW9uLXJhdGU8L05JQ0s+Cis8QkxVUkI+TW9kdWxhdGlvbi1yYXRlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2VyOjpSZXNldDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc2V0PC9OSUNLPgorPEJMVVJCPlJlc2V0LjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlcjo6U3RlcmVvLXBoYXNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDM2MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TdGVyZW8tcGhhc2U8L05JQ0s+Cis8QkxVUkI+U3RlcmVvLXBoYXNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2VyOjpwYXJhbS0tLVN0YWdlczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsMTJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tLS1TdGFnZXM8L05JQ0s+Cis8QkxVUkI+cGFyYW0tLS1TdGFnZXMuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1FcTo6cGFyYW0tMS1rSHo8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy00OCwyNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0xLWtIejwvTklDSz4KKzxCTFVSQj5wYXJhbS0xLWtIei48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUVxOjpwYXJhbS0xMjUtSHo8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy00OCwyNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0xMjUtSHo8L05JQ0s+Cis8QkxVUkI+cGFyYW0tMTI1LUh6LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRXE6OnBhcmFtLTE2LWtIejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTQ4LDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTE2LWtIejwvTklDSz4KKzxCTFVSQj5wYXJhbS0xNi1rSHouPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1FcTo6cGFyYW0tMi1rSHo8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy00OCwyNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0yLWtIejwvTklDSz4KKzxCTFVSQj5wYXJhbS0yLWtIei48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUVxOjpwYXJhbS0yNTAtSHo8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy00OCwyNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0yNTAtSHo8L05JQ0s+Cis8QkxVUkI+cGFyYW0tMjUwLUh6LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRXE6OnBhcmFtLTMxLUh6PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNDgsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMzEtSHo8L05JQ0s+Cis8QkxVUkI+cGFyYW0tMzEtSHouPC9CTFVSQj4KKzxERUZBVUxUPi0zMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUVxOjpwYXJhbS00LWtIejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTQ4LDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTQta0h6PC9OSUNLPgorPEJMVVJCPnBhcmFtLTQta0h6LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRXE6OnBhcmFtLTUwMC1IejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTQ4LDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTUwMC1IejwvTklDSz4KKzxCTFVSQj5wYXJhbS01MDAtSHouPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1FcTo6cGFyYW0tNjMtSHo8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy00OCwyNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS02My1IejwvTklDSz4KKzxCTFVSQj5wYXJhbS02My1Iei48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUVxOjpwYXJhbS04LWtIejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTQ4LDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTgta0h6PC9OSUNLPgorPEJMVVJCPnBhcmFtLTgta0h6LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRXEyeDI6OnBhcmFtLTEta0h6PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNDgsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMS1rSHo8L05JQ0s+Cis8QkxVUkI+cGFyYW0tMS1rSHouPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1FcTJ4Mjo6cGFyYW0tMTI1LUh6PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNDgsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMTI1LUh6PC9OSUNLPgorPEJMVVJCPnBhcmFtLTEyNS1Iei48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUVxMngyOjpwYXJhbS0xNi1rSHo8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy00OCwyNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0xNi1rSHo8L05JQ0s+Cis8QkxVUkI+cGFyYW0tMTYta0h6LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRXEyeDI6OnBhcmFtLTIta0h6PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNDgsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMi1rSHo8L05JQ0s+Cis8QkxVUkI+cGFyYW0tMi1rSHouPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1FcTJ4Mjo6cGFyYW0tMjUwLUh6PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNDgsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMjUwLUh6PC9OSUNLPgorPEJMVVJCPnBhcmFtLTI1MC1Iei48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUVxMngyOjpwYXJhbS0zMS1IejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTQ4LDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTMxLUh6PC9OSUNLPgorPEJMVVJCPnBhcmFtLTMxLUh6LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRXEyeDI6OnBhcmFtLTQta0h6PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNDgsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tNC1rSHo8L05JQ0s+Cis8QkxVUkI+cGFyYW0tNC1rSHouPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1FcTJ4Mjo6cGFyYW0tNTAwLUh6PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNDgsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tNTAwLUh6PC9OSUNLPgorPEJMVVJCPnBhcmFtLTUwMC1Iei48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUVxMngyOjpwYXJhbS02My1IejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTQ4LDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTYzLUh6PC9OSUNLPgorPEJMVVJCPnBhcmFtLTYzLUh6LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRXEyeDI6OnBhcmFtLTgta0h6PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNDgsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tOC1rSHo8L05JQ0s+Cis8QkxVUkI+cGFyYW0tOC1rSHouPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Db21wcmVzczo6YXR0YWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmF0dGFjazwvTklDSz4KKzxCTFVSQj5hdHRhY2suPC9CTFVSQj4KKzxERUZBVUxUPjAsMDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ29tcHJlc3M6OmdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Z2FpbjwvTklDSz4KKzxCTFVSQj5nYWluLjwvQkxVUkI+Cis8REVGQVVMVD42PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ29tcHJlc3M6OmtuZWUtcmFkaXVzPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmtuZWUtcmFkaXVzPC9OSUNLPgorPEJMVVJCPmtuZWUtcmFkaXVzLjwvQkxVUkI+Cis8REVGQVVMVD4zLDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ29tcHJlc3M6OnJhdGlvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnJhdGlvPC9OSUNLPgorPEJMVVJCPnJhdGlvLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ29tcHJlc3M6OnJlbGVhc2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDAxLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cmVsZWFzZTwvTklDSz4KKzxCTFVSQj5yZWxlYXNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDUwMDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Db21wcmVzczo6dGhyZXNob2xkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMzAsNDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnRocmVzaG9sZDwvTklDSz4KKzxCTFVSQj50aHJlc2hvbGQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QYW46Om1vbm88L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5tb25vPC9OSUNLPgorPEJMVVJCPm1vbm8uPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFuOjpwYW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFuPC9OSUNLPgorPEJMVVJCPnBhbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBhbjo6dDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxLDQwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnQ8L05JQ0s+Cis8QkxVUkI+dC48L0JMVVJCPgorPERFRkFVTFQ+MTAsMDc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFuOjp3aWR0aDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPndpZHRoPC9OSUNLPgorPEJMVVJCPndpZHRoLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUHJlYW1wSUlJOjpnYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmdhaW48L05JQ0s+Cis8QkxVUkI+Z2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVByZWFtcElJSTo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QcmVhbXBJSUk6OnRlbXBlcmF0dXJlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwNSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnRlbXBlcmF0dXJlPC9OSUNLPgorPEJMVVJCPnRlbXBlcmF0dXJlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDI1Mzc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUHJlYW1wSVY6OmJhc3M8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yMCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5iYXNzPC9OSUNLPgorPEJMVVJCPmJhc3MuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QcmVhbXBJVjo6Z2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5nYWluPC9OSUNLPgorPEJMVVJCPmdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QcmVhbXBJVjo6aGk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yMCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5oaTwvTklDSz4KKzxCTFVSQj5oaS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVByZWFtcElWOjpsYXRlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5sYXRlbmN5PC9OSUNLPgorPEJMVVJCPmxhdGVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVByZWFtcElWOjptaWQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yMCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5taWQ8L05JQ0s+Cis8QkxVUkI+bWlkLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUHJlYW1wSVY6OnRlbXBlcmF0dXJlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwNSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnRlbXBlcmF0dXJlPC9OSUNLPgorPEJMVVJCPnRlbXBlcmF0dXJlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDUwMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QcmVhbXBJVjo6dHJlYmxlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+dHJlYmxlPC9OSUNLPgorPEJMVVJCPnRyZWJsZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVRvbmVTdGFjazo6YmFzczwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmJhc3M8L05JQ0s+Cis8QkxVUkI+YmFzcy48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtVG9uZVN0YWNrOjptaWQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5taWQ8L05JQ0s+Cis8QkxVUkI+bWlkLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Ub25lU3RhY2s6Om1vZGVsPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPm1vZGVsPC9OSUNLPgorPEJMVVJCPm1vZGVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtVG9uZVN0YWNrOjp0cmVibGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz50cmVibGU8L05JQ0s+Cis8QkxVUkI+dHJlYmxlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Ub25lU3RhY2tMVDo6YmFzczwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmJhc3M8L05JQ0s+Cis8QkxVUkI+YmFzcy48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtVG9uZVN0YWNrTFQ6Om1pZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPm1pZDwvTklDSz4KKzxCTFVSQj5taWQuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVRvbmVTdGFja0xUOjp0cmVibGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz50cmVibGU8L05JQ0s+Cis8QkxVUkI+dHJlYmxlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBJSUk6OmRyaXZlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMDEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5kcml2ZTwvTklDSz4KKzxCTFVSQj5kcml2ZS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUFtcElJSTo6Z2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5nYWluPC9OSUNLPgorPEJMVVJCPmdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBJSUk6OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPmxhdGVuY3k8L05JQ0s+Cis8QkxVUkI+bGF0ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1wSUlJOjp0ZW1wZXJhdHVyZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDUsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz50ZW1wZXJhdHVyZTwvTklDSz4KKzxCTFVSQj50ZW1wZXJhdHVyZS48L0JMVVJCPgorPERFRkFVTFQ+MCw1MDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1wSVY6OmJhc3M8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yMCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5iYXNzPC9OSUNLPgorPEJMVVJCPmJhc3MuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBJVjo6ZHJpdmU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDAwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmRyaXZlPC9OSUNLPgorPEJMVVJCPmRyaXZlLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1wSVY6OmdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Z2FpbjwvTklDSz4KKzxCTFVSQj5nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1wSVY6OmhpPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+aGk8L05JQ0s+Cis8QkxVUkI+aGkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBJVjo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBJVjo6bWlkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+bWlkPC9OSUNLPgorPEJMVVJCPm1pZC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUFtcElWOjp0ZW1wZXJhdHVyZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDUsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz50ZW1wZXJhdHVyZTwvTklDSz4KKzxCTFVSQj50ZW1wZXJhdHVyZS48L0JMVVJCPgorPERFRkFVTFQ+MCw1MDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1wSVY6OnRyZWJsZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTIwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnRyZWJsZTwvTklDSz4KKzxCTFVSQj50cmVibGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBWOjpiYXNzPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOSw5XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmJhc3M8L05JQ0s+Cis8QkxVUkI+YmFzcy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUFtcFY6OmRyaXZlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMDEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5kcml2ZTwvTklDSz4KKzxCTFVSQj5kcml2ZS48L0JMVVJCPgorPERFRkFVTFQ+MCw3NTAwMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBWOjpnYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDNdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Z2FpbjwvTklDSz4KKzxCTFVSQj5nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1wVjo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBWOjp0b25lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+dG9uZTwvTklDSz4KKzxCTFVSQj50b25lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1wVjo6d2F0dHM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzUsMTUwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPndhdHRzPC9OSUNLPgorPEJMVVJCPndhdHRzLjwvQkxVUkI+Cis8REVGQVVMVD43Nyw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1wVlRTOjpiYXNzPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+YmFzczwvTklDSz4KKzxCTFVSQj5iYXNzLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBWVFM6OmRyaXZlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMDEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5kcml2ZTwvTklDSz4KKzxCTFVSQj5kcml2ZS48L0JMVVJCPgorPERFRkFVTFQ+MCwyNTAwNzU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBWVFM6OmdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsM108L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5nYWluPC9OSUNLPgorPEJMVVJCPmdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjIsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBWVFM6OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPmxhdGVuY3k8L05JQ0s+Cis8QkxVUkI+bGF0ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1wVlRTOjptaWQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5taWQ8L05JQ0s+Cis8QkxVUkI+bWlkLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1wVlRTOjptb2RlbDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5tb2RlbDwvTklDSz4KKzxCTFVSQj5tb2RlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUFtcFZUUzo6dHJlYmxlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+dHJlYmxlPC9OSUNLPgorPEJMVVJCPnRyZWJsZS48L0JMVVJCPgorPERFRkFVTFQ+MCw3NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUFtcFZUUzo6d2F0dHM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDAwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPndhdHRzPC9OSUNLPgorPEJMVVJCPndhdHRzLjwvQkxVUkI+Cis8REVGQVVMVD4wLDc1MDAyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNhYmluZXRJOjpnYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjQsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Z2FpbjwvTklDSz4KKzxCTFVSQj5nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2FiaW5ldEk6Om1vZGVsPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPm1vZGVsPC9OSUNLPgorPEJMVVJCPm1vZGVsLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2FiaW5ldElJOjpnYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjQsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Z2FpbjwvTklDSz4KKzxCTFVSQj5nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2FiaW5ldElJOjptb2RlbDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5tb2RlbDwvTklDSz4KKzxCTFVSQj5tb2RlbC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNsaXA6OmdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03Miw3Ml08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5nYWluPC9OSUNLPgorPEJMVVJCPmdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DbGlwOjpsYXRlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5sYXRlbmN5PC9OSUNLPgorPEJMVVJCPmxhdGVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNob3J1c0k6OmJsZW5kPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+YmxlbmQ8L05JQ0s+Cis8QkxVUkI+YmxlbmQuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DaG9ydXNJOjpmZWVkYmFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPmZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2hvcnVzSTo6ZmVlZGZvcndhcmQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5mZWVkZm9yd2FyZDwvTklDSz4KKzxCTFVSQj5mZWVkZm9yd2FyZC48L0JMVVJCPgorPERFRkFVTFQ+MCwyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNob3J1c0k6OnJhdGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5yYXRlPC9OSUNLPgorPEJMVVJCPnJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjEsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DaG9ydXNJOjp0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyLDUsNDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+dDwvTklDSz4KKzxCTFVSQj50LjwvQkxVUkI+Cis8REVGQVVMVD41PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2hvcnVzSTo6d2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNSwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz53aWR0aDwvTklDSz4KKzxCTFVSQj53aWR0aC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN0ZXJlb0Nob3J1c0k6OmJsZW5kPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+YmxlbmQ8L05JQ0s+Cis8QkxVUkI+YmxlbmQuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TdGVyZW9DaG9ydXNJOjpmZWVkYmFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPmZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3RlcmVvQ2hvcnVzSTo6ZmVlZGZvcndhcmQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5mZWVkZm9yd2FyZDwvTklDSz4KKzxCTFVSQj5mZWVkZm9yd2FyZC48L0JMVVJCPgorPERFRkFVTFQ+MCwyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN0ZXJlb0Nob3J1c0k6OnBoYXNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGhhc2U8L05JQ0s+Cis8QkxVUkI+cGhhc2UuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TdGVyZW9DaG9ydXNJOjpyYXRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cmF0ZTwvTklDSz4KKzxCTFVSQj5yYXRlLjwvQkxVUkI+Cis8REVGQVVMVD4xLDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3RlcmVvQ2hvcnVzSTo6dDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMiw1LDQwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnQ8L05JQ0s+Cis8QkxVUkI+dC48L0JMVVJCPgorPERFRkFVTFQ+Miw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3RlcmVvQ2hvcnVzSTo6d2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNSwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz53aWR0aDwvTklDSz4KKzxCTFVSQj53aWR0aC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNob3J1c0lJOjpibGVuZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmJsZW5kPC9OSUNLPgorPEJMVVJCPmJsZW5kLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2hvcnVzSUk6OmZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+ZmVlZGJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DaG9ydXNJSTo6ZmVlZGZvcndhcmQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5mZWVkZm9yd2FyZDwvTklDSz4KKzxCTFVSQj5mZWVkZm9yd2FyZC48L0JMVVJCPgorPERFRkFVTFQ+MCwyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNob3J1c0lJOjpyYXRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cmF0ZTwvTklDSz4KKzxCTFVSQj5yYXRlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2hvcnVzSUk6OnQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIsNSw0MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz50PC9OSUNLPgorPEJMVVJCPnQuPC9CTFVSQj4KKzxERUZBVUxUPjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DaG9ydXNJSTo6d2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNSwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz53aWR0aDwvTklDSz4KKzxCTFVSQj53aWR0aC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN0ZXJlb0Nob3J1c0lJOjpibGVuZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmJsZW5kPC9OSUNLPgorPEJMVVJCPmJsZW5kLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3RlcmVvQ2hvcnVzSUk6OmZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+ZmVlZGJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TdGVyZW9DaG9ydXNJSTo6ZmVlZGZvcndhcmQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5mZWVkZm9yd2FyZDwvTklDSz4KKzxCTFVSQj5mZWVkZm9yd2FyZC48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3RlcmVvQ2hvcnVzSUk6OnJhdGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5yYXRlPC9OSUNLPgorPEJMVVJCPnJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjAsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TdGVyZW9DaG9ydXNJSTo6dDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMiw1LDQwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnQ8L05JQ0s+Cis8QkxVUkI+dC48L0JMVVJCPgorPERFRkFVTFQ+MTEsODc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3RlcmVvQ2hvcnVzSUk6OndpZHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDUsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+d2lkdGg8L05JQ0s+Cis8QkxVUkI+d2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjIsODc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGhhc2VySTo6ZGVwdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5kZXB0aDwvTklDSz4KKzxCTFVSQj5kZXB0aC48L0JMVVJCPgorPERFRkFVTFQ+MCw3NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBoYXNlckk6OmZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAsOTk5XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPmZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wLDc0OTI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGhhc2VySTo6cmF0ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5yYXRlPC9OSUNLPgorPEJMVVJCPnJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QaGFzZXJJOjpzcHJlYWQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMywxNDE1OV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5zcHJlYWQ8L05JQ0s+Cis8QkxVUkI+c3ByZWFkLjwvQkxVUkI+Cis8REVGQVVMVD4wLDc4NTM5ODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBoYXNlcklJOjpkZXB0aDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmRlcHRoPC9OSUNLPgorPEJMVVJCPmRlcHRoLjwvQkxVUkI+Cis8REVGQVVMVD4wLDc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGhhc2VySUk6OmZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAsOTk5XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPmZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wLDc0OTI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGhhc2VySUk6OnJhdGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5yYXRlPC9OSUNLPgorPEJMVVJCPnJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjAsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QaGFzZXJJSTo6c3ByZWFkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEsNTcwOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5zcHJlYWQ8L05JQ0s+Cis8QkxVUkI+c3ByZWFkLjwvQkxVUkI+Cis8REVGQVVMVD4wLDM5MjY5OTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN3ZWVwVkZJOjpRPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMSwwLDk5OV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5RPC9OSUNLPgorPEJMVVJCPlEuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN3ZWVwVkZJOjpkZXB0aC14PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZGVwdGgteDwvTklDSz4KKzxCTFVSQj5kZXB0aC14LjwvQkxVUkI+Cis8REVGQVVMVD4wLDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3dlZXBWRkk6OmRlcHRoLXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5kZXB0aC15PC9OSUNLPgorPEJMVVJCPmRlcHRoLXkuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN3ZWVwVkZJOjpkZXB0aC16PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZGVwdGgtejwvTklDSz4KKzxCTFVSQj5kZXB0aC16LjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3dlZXBWRkk6OmY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzgzLDMzODNdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZjwvTklDSz4KKzxCTFVSQj5mLjwvQkxVUkI+Cis8REVGQVVMVD4yMDksNzE3PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3dlZXBWRkk6Omg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDAxLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+aDwvTklDSz4KKzxCTFVSQj5oLjwvQkxVUkI+Cis8REVGQVVMVD4wLDI1MDc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3dlZXBWRkk6Om1vZGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+bW9kZTwvTklDSz4KKzxCTFVSQj5tb2RlLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3dlZXBWRklJOjpRPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMSwwLDk5OV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5RPC9OSUNLPgorPEJMVVJCPlEuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN3ZWVwVkZJSTo6US1kZXB0aC14PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+US1kZXB0aC14PC9OSUNLPgorPEJMVVJCPlEtZGVwdGgteC48L0JMVVJCPgorPERFRkFVTFQ+MCwyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN3ZWVwVkZJSTo6US1kZXB0aC15PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+US1kZXB0aC15PC9OSUNLPgorPEJMVVJCPlEtZGVwdGgteS48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3dlZXBWRklJOjpRLWRlcHRoLXo8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5RLWRlcHRoLXo8L05JQ0s+Cis8QkxVUkI+US1kZXB0aC16LjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3dlZXBWRklJOjpRLWg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDAxLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+US1oPC9OSUNLPgorPEJMVVJCPlEtaC48L0JMVVJCPgorPERFRkFVTFQ+MCwyNTA3NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN3ZWVwVkZJSTo6ZjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bODMsMzM4M108L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5mPC9OSUNLPgorPEJMVVJCPmYuPC9CTFVSQj4KKzxERUZBVUxUPjIwOSw3MTc8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Td2VlcFZGSUk6OmYtZGVwdGgteDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmYtZGVwdGgteDwvTklDSz4KKzxCTFVSQj5mLWRlcHRoLXguPC9CTFVSQj4KKzxERUZBVUxUPjAsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Td2VlcFZGSUk6OmYtZGVwdGgteTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmYtZGVwdGgteTwvTklDSz4KKzxCTFVSQj5mLWRlcHRoLXkuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN3ZWVwVkZJSTo6Zi1kZXB0aC16PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Zi1kZXB0aC16PC9OSUNLPgorPEJMVVJCPmYtZGVwdGgtei48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN3ZWVwVkZJSTo6Zi1oPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmYtaDwvTklDSz4KKzxCTFVSQj5mLWguPC9CTFVSQj4KKzxERUZBVUxUPjAsMjUwNzU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Td2VlcFZGSUk6Om1vZGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+bW9kZTwvTklDSz4KKzxCTFVSQj5tb2RlLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQXV0b1dhaDo6UTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDEsMCw5OTldPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UTwvTklDSz4KKzxCTFVSQj5RLjwvQkxVUkI+Cis8REVGQVVMVD4wLDI1MDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BdXRvV2FoOjpkZXB0aDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmRlcHRoPC9OSUNLPgorPEJMVVJCPmRlcHRoLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BdXRvV2FoOjpmPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls0Myw5MzNdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZjwvTklDSz4KKzxCTFVSQj5mLjwvQkxVUkI+Cis8REVGQVVMVD45Miw4MDUxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU2NhcGU6OmJsZW5kPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+YmxlbmQ8L05JQ0s+Cis8QkxVUkI+YmxlbmQuPC9CTFVSQj4KKzxERUZBVUxUPjAsNzU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TY2FwZTo6YnBtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlszMCwyNDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+YnBtPC9OSUNLPgorPEJMVVJCPmJwbS48L0JMVVJCPgorPERFRkFVTFQ+ODIsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNjYXBlOjpkaXZpZGVyPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMiw0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmRpdmlkZXI8L05JQ0s+Cis8QkxVUkI+ZGl2aWRlci48L0JMVVJCPgorPERFRkFVTFQ+MjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNjYXBlOjpkcnk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5kcnk8L05JQ0s+Cis8QkxVUkI+ZHJ5LjwvQkxVUkI+Cis8REVGQVVMVD4wLDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU2NhcGU6OmZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+ZmVlZGJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjAsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1WQ09zOjpmPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDU3NTFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZjwvTklDSz4KKzxCTFVSQj5mLjwvQkxVUkI+Cis8REVGQVVMVD4xMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1WQ09zOjpwYXJhbS0tLS0tLXNxdWFyZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLS0tLS0tc3F1YXJlPC9OSUNLPgorPEJMVVJCPnBhcmFtLS0tLS0tc3F1YXJlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtVkNPczo6dHJpLS0tLXNhdzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnRyaS0tLS1zYXc8L05JQ0s+Cis8QkxVUkI+dHJpLS0tLXNhdy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVZDT3M6OnZvbHVtZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMWUtMDYsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz52b2x1bWU8L05JQ0s+Cis8QkxVUkI+dm9sdW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1WQ09kOjpibGVuZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5ibGVuZDwvTklDSz4KKzxCTFVSQj5ibGVuZC48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtVkNPZDo6ZjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSw1NzUxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmY8L05JQ0s+Cis8QkxVUkI+Zi48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtVkNPZDo6cGFyYW0tMS0tLS0tLS1zcXVhcmU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0xLS0tLS0tLXNxdWFyZTwvTklDSz4KKzxCTFVSQj5wYXJhbS0xLS0tLS0tLXNxdWFyZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVZDT2Q6OnBhcmFtLTEtLXRyaS0tLS1zYXc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0xLS10cmktLS0tc2F3PC9OSUNLPgorPEJMVVJCPnBhcmFtLTEtLXRyaS0tLS1zYXcuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1WQ09kOjpwYXJhbS0yLS0tLS0tLXNxdWFyZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTItLS0tLS0tc3F1YXJlPC9OSUNLPgorPEJMVVJCPnBhcmFtLTItLS0tLS0tc3F1YXJlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtVkNPZDo6cGFyYW0tMi0tdHJpLS0tLXNhdzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTItLXRyaS0tLS1zYXc8L05JQ0s+Cis8QkxVUkI+cGFyYW0tMi0tdHJpLS0tLXNhdy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVZDT2Q6OnBhcmFtLTItLXR1bmU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xMiwxMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0yLS10dW5lPC9OSUNLPgorPEJMVVJCPnBhcmFtLTItLXR1bmUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1WQ09kOjpzeW5jPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+c3luYzwvTklDSz4KKzxCTFVSQj5zeW5jLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtVkNPZDo6dm9sdW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxZS0wNiwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnZvbHVtZTwvTklDSz4KKzxCTFVSQj52b2x1bWUuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNFTzo6ZGFtcGluZzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmRhbXBpbmc8L05JQ0s+Cis8QkxVUkI+ZGFtcGluZy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNFTzo6bXBtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls0LDI0NF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5tcG08L05JQ0s+Cis8QkxVUkI+bXBtLjwvQkxVUkI+Cis8REVGQVVMVD4xODQ8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DRU86OnZvbHVtZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnZvbHVtZTwvTklDSz4KKzxCTFVSQj52b2x1bWUuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNpbjo6ZjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDAxLDIwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmY8L05JQ0s+Cis8QkxVUkI+Zi48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU2luOjp2b2x1bWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzFlLTA2LDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+dm9sdW1lPC9OSUNLPgorPEJMVVJCPnZvbHVtZS48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtV2hpdGU6OnZvbHVtZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMWUtMDYsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz52b2x1bWU8L05JQ0s+Cis8QkxVUkI+dm9sdW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Mb3Jlbno6Omg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5oPC9OSUNLPgorPEJMVVJCPmguPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Mb3Jlbno6OnZvbHVtZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMWUtMDYsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz52b2x1bWU8L05JQ0s+Cis8QkxVUkI+dm9sdW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Mb3Jlbno6Ong8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz54PC9OSUNLPgorPEJMVVJCPnguPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Mb3Jlbno6Onk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz55PC9OSUNLPgorPEJMVVJCPnkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Mb3Jlbno6Ono8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz56PC9OSUNLPgorPEJMVVJCPnouPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Sb2Vzc2xlcjo6aDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmg8L05JQ0s+Cis8QkxVUkI+aC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVJvZXNzbGVyOjp2b2x1bWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzFlLTA2LDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+dm9sdW1lPC9OSUNLPgorPEJMVVJCPnZvbHVtZS48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUm9lc3NsZXI6Ong8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz54PC9OSUNLPgorPEJMVVJCPnguPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Sb2Vzc2xlcjo6eTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnk8L05JQ0s+Cis8QkxVUkI+eS48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUm9lc3NsZXI6Ono8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz56PC9OSUNLPgorPEJMVVJCPnouPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1KVlJldjo6YmxlbmQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMCwyOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5ibGVuZDwvTklDSz4KKzxCTFVSQj5ibGVuZC48L0JMVVJCPgorPERFRkFVTFQ+MCwwNzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUpWUmV2Ojp0NjA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNCw2XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnQ2MDwvTklDSz4KKzxCTFVSQj50NjAuPC9CTFVSQj4KKzxERUZBVUxUPjIsMzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBsYXRlOjpiYW5kd2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDA1LDAsOTk5XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmJhbmR3aWR0aDwvTklDSz4KKzxCTFVSQj5iYW5kd2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjAsNTAyPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGxhdGU6OmJsZW5kPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+YmxlbmQ8L05JQ0s+Cis8QkxVUkI+YmxlbmQuPC9CTFVSQj4KKzxERUZBVUxUPjAsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QbGF0ZTo6ZGFtcGluZzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDA1LDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZGFtcGluZzwvTklDSz4KKzxCTFVSQj5kYW1waW5nLjwvQkxVUkI+Cis8REVGQVVMVD4wLDI1MDM3NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBsYXRlOjp0YWlsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAsNzQ5XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnRhaWw8L05JQ0s+Cis8QkxVUkI+dGFpbC48L0JMVVJCPgorPERFRkFVTFQ+MCwzNzQ1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGxhdGUyeDI6OmJhbmR3aWR0aDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDUsMCw5OTldPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+YmFuZHdpZHRoPC9OSUNLPgorPEJMVVJCPmJhbmR3aWR0aC48L0JMVVJCPgorPERFRkFVTFQ+MCw1MDI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QbGF0ZTJ4Mjo6YmxlbmQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5ibGVuZDwvTklDSz4KKzxCTFVSQj5ibGVuZC48L0JMVVJCPgorPERFRkFVTFQ+MCwyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBsYXRlMngyOjpkYW1waW5nPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMDUsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5kYW1waW5nPC9OSUNLPgorPEJMVVJCPmRhbXBpbmcuPC9CTFVSQj4KKzxERUZBVUxUPjAsMjUwMzc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGxhdGUyeDI6OnRhaWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMCw3NDldPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+dGFpbDwvTklDSz4KKzxCTFVSQj50YWlsLjwvQkxVUkI+Cis8REVGQVVMVD4wLDM3NDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DbGljazo6YnBtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls0LDI0NF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5icG08L05JQ0s+Cis8QkxVUkI+YnBtLjwvQkxVUkI+Cis8REVGQVVMVD42NDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNsaWNrOjpkYW1waW5nPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZGFtcGluZzwvTklDSz4KKzxCTFVSQj5kYW1waW5nLjwvQkxVUkI+Cis8REVGQVVMVD4wLDc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2xpY2s6OnZvbHVtZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnZvbHVtZTwvTklDSz4KKzxCTFVSQj52b2x1bWUuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLURpcmFjOjpkYW1waW5nPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZGFtcGluZzwvTklDSz4KKzxCTFVSQj5kYW1waW5nLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRGlyYWM6OnBwbTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMzAsNjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cHBtPC9OSUNLPgorPEJMVVJCPnBwbS48L0JMVVJCPgorPERFRkFVTFQ+MzA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1EaXJhYzo6dm9sdW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+dm9sdW1lPC9OSUNLPgorPEJMVVJCPnZvbHVtZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUhSVEY6OnBhbjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Wy0zNiwzNl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYW48L05JQ0s+Cis8QkxVUkI+cGFuLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OkNsb3NlZC1HYXRlLVZhbHVlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkNsb3NlZC1HYXRlLVZhbHVlPC9OSUNLPgorPEJMVVJCPkNsb3NlZC1HYXRlLVZhbHVlLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6TG9vcC1TdGVwczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsNjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TG9vcC1TdGVwczwvTklDSz4KKzxCTFVSQj5Mb29wLVN0ZXBzLjwvQkxVUkI+Cis8REVGQVVMVD42NDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpSZXNldC10by1WYWx1ZS1vbi1HYXRlLUNsb3NlLTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNldC10by1WYWx1ZS1vbi1HYXRlLUNsb3NlLTwvTklDSz4KKzxCTFVSQj5SZXNldC10by1WYWx1ZS1vbi1HYXRlLUNsb3NlLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0wPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0xMDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTEwPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMTAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTExPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMTE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xMS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0xMjwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTEyLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0xMzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTEzPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMTMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTE0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMTQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xNC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMTU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0xNTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTE1LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0xNjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTE2PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMTYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTE3PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMTc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xNy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMTg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0xODwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTE4LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0xOTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTE5PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMTkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0yPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMjA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0yMDwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTIwLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0yMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTIxPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMjEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTIyPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMjI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0yMi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMjM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0yMzwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTIzLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0yNDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTI0PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMjQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTI1PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMjU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0yNS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMjY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0yNjwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTI2LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0yNzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTI3PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMjcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTI4PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMjg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0yOC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMjk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0yOTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTI5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0zPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMzwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTMwPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMzA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0zMC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMzE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0zMTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTMxLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0zMjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTMyPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMzIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTMzPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMzM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0zMy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMzQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0zNDwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTM0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0zNTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTM1PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMzUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTM2PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMzY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0zNi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMzc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0zNzwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTM3LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0zODwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTM4PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMzguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTM5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMzk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0zOS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtNDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC00LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC00MDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTQwPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNDAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTQxPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNDE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC00MS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtNDI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC00MjwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTQyLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC00MzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTQzPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNDMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTQ0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNDQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC00NC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtNDU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC00NTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTQ1LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC00NjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTQ2PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNDYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTQ3PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNDc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC00Ny48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtNDg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC00ODwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTQ4LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC00OTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTQ5PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNDkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC01PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtNTA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC01MDwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTUwLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC01MTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTUxPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNTEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTUyPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNTI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC01Mi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtNTM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC01MzwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTUzLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC01NDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTU0PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNTQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTU1PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNTU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC01NS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtNTY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC01NjwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTU2LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC01NzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTU3PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNTcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTU4PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNTg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC01OC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtNTk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC01OTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTU5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC02PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNjwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTYwPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNjA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC02MC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtNjE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC02MTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTYxLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC02MjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTYyPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNjIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTYzPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNjM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC02My48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtNzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC03LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC04PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtODwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC05PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtOS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcG9pbnRlckNhc3REaXN0b3J0aW9uOjpEcnktd2V0LW1peDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRyeS13ZXQtbWl4PC9OSUNLPgorPEJMVVJCPkRyeS13ZXQtbWl4LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcG9pbnRlckNhc3REaXN0b3J0aW9uOjpFZmZlY3QtY3V0b2ZmLWZyZXE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzQsNDEsMTMyMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RWZmZWN0LWN1dG9mZi1mcmVxPC9OSUNLPgorPEJMVVJCPkVmZmVjdC1jdXRvZmYtZnJlcS48L0JMVVJCPgorPERFRkFVTFQ+MzIsNjM3NjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWNvbWI6OkJhbmQtc2VwYXJhdGlvbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMTYsNjQwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtc2VwYXJhdGlvbjwvTklDSz4KKzxCTFVSQj5CYW5kLXNlcGFyYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjE3MjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWNvbWI6OkZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMCw5OSwwLDk5XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPkZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLXN0ZXJlby1lY2hvOjpDcm9zcy1Nb2RlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Q3Jvc3MtTW9kZTwvTklDSz4KKzxCTFVSQj5Dcm9zcy1Nb2RlLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1zdGVyZW8tZWNobzo6RHJ5LUxldmVsLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EcnktTGV2ZWwtLWRCLTwvTklDSz4KKzxCTFVSQj5EcnktTGV2ZWwtLWRCLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1zdGVyZW8tZWNobzo6SGFhcy1FZmZlY3Q8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5IYWFzLUVmZmVjdDwvTklDSz4KKzxCTFVSQj5IYWFzLUVmZmVjdC48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtc3RlcmVvLWVjaG86OkwtRGVsYXktLW1zLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkwtRGVsYXktLW1zLTwvTklDSz4KKzxCTFVSQj5MLURlbGF5LS1tcy0uPC9CTFVSQj4KKzxERUZBVUxUPjEwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1zdGVyZW8tZWNobzo6TC1FY2hvLUxldmVsLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MLUVjaG8tTGV2ZWwtLWRCLTwvTklDSz4KKzxCTFVSQj5MLUVjaG8tTGV2ZWwtLWRCLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1zdGVyZW8tZWNobzo6TC1GZWVkYmFjay0tLS08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkwtRmVlZGJhY2stLS0tPC9OSUNLPgorPEJMVVJCPkwtRmVlZGJhY2stLS0tLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLXN0ZXJlby1lY2hvOjpSLUVjaG8tTGV2ZWwtLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlItRWNoby1MZXZlbC0tZEItPC9OSUNLPgorPEJMVVJCPlItRWNoby1MZXZlbC0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLXN0ZXJlby1lY2hvOjpSLUhhYXMtRGVsYXktLW1zLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlItSGFhcy1EZWxheS0tbXMtPC9OSUNLPgorPEJMVVJCPlItSGFhcy1EZWxheS0tbXMtLjwvQkxVUkI+Cis8REVGQVVMVD4xMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtc3RlcmVvLWVjaG86OlItSGFhcy1GZWVkYmFjay0tLS08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlItSGFhcy1GZWVkYmFjay0tLS08L05JQ0s+Cis8QkxVUkI+Ui1IYWFzLUZlZWRiYWNrLS0tLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1zdGVyZW8tZWNobzo6U3dhcC1PdXRwdXRzPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3dhcC1PdXRwdXRzPC9OSUNLPgorPEJMVVJCPlN3YXAtT3V0cHV0cy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nc206OkRyeS13ZXQtbWl4PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LXdldC1taXg8L05JQ0s+Cis8QkxVUkI+RHJ5LXdldC1taXguPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nc206OkVycm9yLXJhdGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RXJyb3ItcmF0ZTwvTklDSz4KKzxCTFVSQj5FcnJvci1yYXRlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ3NtOjpOdW1iZXItb2YtcGFzc2VzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5OdW1iZXItb2YtcGFzc2VzPC9OSUNLPgorPEJMVVJCPk51bWJlci1vZi1wYXNzZXMuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nc206OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPmxhdGVuY3k8L05JQ0s+Cis8QkxVUkI+bGF0ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGlnaHBhc3MtaWlyOjpDdXRvZmYtRnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls0LDQxLDE5ODQ1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkN1dG9mZi1GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+Q3V0b2ZmLUZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MzYsMTE5NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhpZ2hwYXNzLWlpcjo6U3RhZ2VzLTItcG9sZXMtcGVyLXN0YWdlLTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3RhZ2VzLTItcG9sZXMtcGVyLXN0YWdlLTwvTklDSz4KKzxCTFVSQj5TdGFnZXMtMi1wb2xlcy1wZXItc3RhZ2UtLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdm9jb2Rlcjo6QmFuZC0xLUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0xLUxldmVsPC9OSUNLPgorPEJMVVJCPkJhbmQtMS1MZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZvY29kZXI6OkJhbmQtMTAtTGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTEwLUxldmVsPC9OSUNLPgorPEJMVVJCPkJhbmQtMTAtTGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12b2NvZGVyOjpCYW5kLTExLUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0xMS1MZXZlbDwvTklDSz4KKzxCTFVSQj5CYW5kLTExLUxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdm9jb2Rlcjo6QmFuZC0xMi1MZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMTItTGV2ZWw8L05JQ0s+Cis8QkxVUkI+QmFuZC0xMi1MZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZvY29kZXI6OkJhbmQtMTMtTGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTEzLUxldmVsPC9OSUNLPgorPEJMVVJCPkJhbmQtMTMtTGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12b2NvZGVyOjpCYW5kLTE0LUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0xNC1MZXZlbDwvTklDSz4KKzxCTFVSQj5CYW5kLTE0LUxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdm9jb2Rlcjo6QmFuZC0xNS1MZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMTUtTGV2ZWw8L05JQ0s+Cis8QkxVUkI+QmFuZC0xNS1MZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZvY29kZXI6OkJhbmQtMTYtTGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTE2LUxldmVsPC9OSUNLPgorPEJMVVJCPkJhbmQtMTYtTGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12b2NvZGVyOjpCYW5kLTItTGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTItTGV2ZWw8L05JQ0s+Cis8QkxVUkI+QmFuZC0yLUxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdm9jb2Rlcjo6QmFuZC0zLUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0zLUxldmVsPC9OSUNLPgorPEJMVVJCPkJhbmQtMy1MZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZvY29kZXI6OkJhbmQtNC1MZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtNC1MZXZlbDwvTklDSz4KKzxCTFVSQj5CYW5kLTQtTGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12b2NvZGVyOjpCYW5kLTUtTGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTUtTGV2ZWw8L05JQ0s+Cis8QkxVUkI+QmFuZC01LUxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdm9jb2Rlcjo6QmFuZC02LUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC02LUxldmVsPC9OSUNLPgorPEJMVVJCPkJhbmQtNi1MZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZvY29kZXI6OkJhbmQtNy1MZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtNy1MZXZlbDwvTklDSz4KKzxCTFVSQj5CYW5kLTctTGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12b2NvZGVyOjpCYW5kLTgtTGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTgtTGV2ZWw8L05JQ0s+Cis8QkxVUkI+QmFuZC04LUxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdm9jb2Rlcjo6QmFuZC05LUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC05LUxldmVsPC9OSUNLPgorPEJMVVJCPkJhbmQtOS1MZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZvY29kZXI6Ok51bWJlci1vZi1iYW5kczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsMTZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TnVtYmVyLW9mLWJhbmRzPC9OSUNLPgorPEJMVVJCPk51bWJlci1vZi1iYW5kcy48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWthcmFva2U6OlZvY2FsLXZvbHVtZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Vm9jYWwtdm9sdW1lPC9OSUNLPgorPEJMVVJCPlZvY2FsLXZvbHVtZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWphbWluQ29udHJvbGxlcjo6U2NlbmUtbm8tPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TY2VuZS1uby08L05JQ0s+Cis8QkxVUkI+U2NlbmUtbm8tLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWNob3J1c2ZsYW5nZXI6OkNvbnRvdXItLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMjAsMjAwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Q29udG91ci0tSHotPC9OSUNLPgorPEJMVVJCPkNvbnRvdXItLUh6LS48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWNob3J1c2ZsYW5nZXI6OkRlbGF5LS1tcy08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbGF5LS1tcy08L05JQ0s+Cis8QkxVUkI+RGVsYXktLW1zLS48L0JMVVJCPgorPERFRkFVTFQ+MjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtY2hvcnVzZmxhbmdlcjo6RGVwdGgtLS0tPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZXB0aC0tLS08L05JQ0s+Cis8QkxVUkI+RGVwdGgtLS0tLjwvQkxVUkI+Cis8REVGQVVMVD43NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1jaG9ydXNmbGFuZ2VyOjpEcnktTGV2ZWwtLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTkwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRyeS1MZXZlbC0tZEItPC9OSUNLPgorPEJMVVJCPkRyeS1MZXZlbC0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWNob3J1c2ZsYW5nZXI6OkZyZXF1ZW5jeS0tSHotPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LS1Iei08L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LS1Iei0uPC9CTFVSQj4KKzxERUZBVUxUPjEsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtY2hvcnVzZmxhbmdlcjo6TC1SLVBoYXNlLVNoaWZ0LS1kZWctPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDE4MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MLVItUGhhc2UtU2hpZnQtLWRlZy08L05JQ0s+Cis8QkxVUkI+TC1SLVBoYXNlLVNoaWZ0LS1kZWctLjwvQkxVUkI+Cis8REVGQVVMVD45MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1jaG9ydXNmbGFuZ2VyOjpXZXQtTGV2ZWwtLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTkwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldldC1MZXZlbC0tZEItPC9OSUNLPgorPEJMVVJCPldldC1MZXZlbC0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYmFuZHBhc3MtaWlyOjpCYW5kd2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzQsNDEsMTk4NDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZHdpZHRoPC9OSUNLPgorPEJMVVJCPkJhbmR3aWR0aC48L0JMVVJCPgorPERFRkFVTFQ+Mjk1LDgzMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWJhbmRwYXNzLWlpcjo6Q2VudGVyLUZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNCw0MSwxOTg0NV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5DZW50ZXItRnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkNlbnRlci1GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjI5NSw4MzI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1iYW5kcGFzcy1paXI6OlN0YWdlcy0yLXBvbGVzLXBlci1zdGFnZS08L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN0YWdlcy0yLXBvbGVzLXBlci1zdGFnZS08L05JQ0s+Cis8QkxVUkI+U3RhZ2VzLTItcG9sZXMtcGVyLXN0YWdlLS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjNDo6QW1wbGl0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNDAsMTJdPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkFtcGxpdHVkZTwvTklDSz4KKzxCTFVSQj5BbXBsaXR1ZGUuPC9CTFVSQj4KKzxERUZBVUxUPi00MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjNDo6QXR0YWNrLXRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEsNSw0MDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QXR0YWNrLXRpbWU8L05JQ0s+Cis8QkxVUkI+QXR0YWNrLXRpbWUuPC9CTFVSQj4KKzxERUZBVUxUPjEwMSwxMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zYzQ6OkdhaW4tcmVkdWN0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjQsMF08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+R2Fpbi1yZWR1Y3Rpb248L05JQ0s+Cis8QkxVUkI+R2Fpbi1yZWR1Y3Rpb24uPC9CTFVSQj4KKzxERUZBVUxUPi0yNDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjNDo6S25lZS1yYWRpdXM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+S25lZS1yYWRpdXM8L05JQ0s+Cis8QkxVUkI+S25lZS1yYWRpdXMuPC9CTFVSQj4KKzxERUZBVUxUPjMsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zYzQ6Ok1ha2V1cC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1ha2V1cC1nYWluPC9OSUNLPgorPEJMVVJCPk1ha2V1cC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2M0OjpSTVMtcGVhazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJNUy1wZWFrPC9OSUNLPgorPEJMVVJCPlJNUy1wZWFrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2M0OjpSYXRpbzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SYXRpbzwvTklDSz4KKzxCTFVSQj5SYXRpby48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjNDo6UmVsZWFzZS10aW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyLDgwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZWxlYXNlLXRpbWU8L05JQ0s+Cis8QkxVUkI+UmVsZWFzZS10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD40MDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zYzQ6OlRocmVzaG9sZC1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTMwLDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGhyZXNob2xkLWxldmVsPC9OSUNLPgorPEJMVVJCPlRocmVzaG9sZC1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNhd3Rvb3RoLWZjLW9hOjpGcmVxdWVuejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw5MTg3NSwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuejwvTklDSz4KKzxCTFVSQj5GcmVxdWVuei48L0JMVVJCPgorPERFRkFVTFQ+NDQwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbm90Y2gtaWlyOjpCYW5kd2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzQsNDEsMTk4NDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZHdpZHRoPC9OSUNLPgorPEJMVVJCPkJhbmR3aWR0aC48L0JMVVJCPgorPERFRkFVTFQ+Mjk1LDgzMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW5vdGNoLWlpcjo6Q2VudGVyLUZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNCw0MSwxOTg0NV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5DZW50ZXItRnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkNlbnRlci1GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjI5NSw4MzI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1ub3RjaC1paXI6OlN0YWdlcy0yLXBvbGVzLXBlci1zdGFnZS08L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN0YWdlcy0yLXBvbGVzLXBlci1zdGFnZS08L05JQ0s+Cis8QkxVUkI+U3RhZ2VzLTItcG9sZXMtcGVyLXN0YWdlLS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZyZXFUcmFja2VyOjpUcmFja2luZy1zcGVlZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRyYWNraW5nLXNwZWVkPC9OSUNLPgorPEJMVVJCPlRyYWNraW5nLXNwZWVkLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jb21iLW46OkRlY2F5LVRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlY2F5LVRpbWU8L05JQ0s+Cis8QkxVUkI+RGVjYXktVGltZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWNvbWItbjo6RGVsYXktVGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktVGltZTwvTklDSz4KKzxCTFVSQj5EZWxheS1UaW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtY29tYi1uOjpNYXgtRGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1heC1EZWxheTwvTklDSz4KKzxCTFVSQj5NYXgtRGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jb21iLWw6OkRlY2F5LVRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlY2F5LVRpbWU8L05JQ0s+Cis8QkxVUkI+RGVjYXktVGltZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWNvbWItbDo6RGVsYXktVGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktVGltZTwvTklDSz4KKzxCTFVSQj5EZWxheS1UaW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtY29tYi1sOjpNYXgtRGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1heC1EZWxheTwvTklDSz4KKzxCTFVSQj5NYXgtRGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jb21iLWM6OkRlY2F5LVRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlY2F5LVRpbWU8L05JQ0s+Cis8QkxVUkI+RGVjYXktVGltZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWNvbWItYzo6RGVsYXktVGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktVGltZTwvTklDSz4KKzxCTFVSQj5EZWxheS1UaW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtY29tYi1jOjpNYXgtRGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1heC1EZWxheTwvTklDSz4KKzxCTFVSQj5NYXgtRGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6Q2xvc2VkLUdhdGUtVmFsdWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Q2xvc2VkLUdhdGUtVmFsdWU8L05JQ0s+Cis8QkxVUkI+Q2xvc2VkLUdhdGUtVmFsdWUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpMb29wLVN0ZXBzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSwzMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Mb29wLVN0ZXBzPC9OSUNLPgorPEJMVVJCPkxvb3AtU3RlcHMuPC9CTFVSQj4KKzxERUZBVUxUPjMyPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlJlc2V0LXRvLVZhbHVlLW9uLUdhdGUtQ2xvc2UtPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc2V0LXRvLVZhbHVlLW9uLUdhdGUtQ2xvc2UtPC9OSUNLPgorPEJMVVJCPlJlc2V0LXRvLVZhbHVlLW9uLUdhdGUtQ2xvc2UtLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtMDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0wLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC0xPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpWYWx1ZS1TdGVwLTEwPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMTA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xMC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtMTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0xMTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTExLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC0xMjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTEyPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMTIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpWYWx1ZS1TdGVwLTEzPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMTM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xMy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtMTQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0xNDwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTE0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC0xNTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTE1PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMTUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpWYWx1ZS1TdGVwLTE2PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMTY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xNi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtMTc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0xNzwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTE3LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC0xODwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTE4PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMTguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpWYWx1ZS1TdGVwLTE5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMTk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xOS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtMjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0yLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC0yMDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTIwPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMjAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpWYWx1ZS1TdGVwLTIxPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMjE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0yMS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtMjI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0yMjwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTIyLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC0yMzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTIzPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMjMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpWYWx1ZS1TdGVwLTI0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMjQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0yNC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtMjU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0yNTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTI1LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC0yNjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTI2PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMjYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpWYWx1ZS1TdGVwLTI3PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMjc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0yNy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtMjg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0yODwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTI4LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC0yOTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTI5PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMjkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpWYWx1ZS1TdGVwLTM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0zPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtMzA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0zMDwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTMwLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC0zMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTMxPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMzEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpWYWx1ZS1TdGVwLTQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC00PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtNTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC01LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC02PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNjwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpWYWx1ZS1TdGVwLTc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC03PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtODwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC04LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC05PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtOTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1kZWVzc2VyOjpBdHRlbnVhdGlvbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwXTwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5BdHRlbnVhdGlvbi0tZEItPC9OSUNLPgorPEJMVVJCPkF0dGVudWF0aW9uLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZGVlc3Nlcjo6RnJlcXVlbmN5LS1Iei08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIwMDAsMTYwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LS1Iei08L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LS1Iei0uPC9CTFVSQj4KKzxERUZBVUxUPjU1MDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZGVlc3Nlcjo6TW9uaXRvcjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Nb25pdG9yPC9OSUNLPgorPEJMVVJCPk1vbml0b3IuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZGVlc3Nlcjo6U2lkZWNoYWluLUZpbHRlcjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TaWRlY2hhaW4tRmlsdGVyPC9OSUNLPgorPEJMVVJCPlNpZGVjaGFpbi1GaWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZGVlc3Nlcjo6VGhyZXNob2xkLUxldmVsLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy01MCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UaHJlc2hvbGQtTGV2ZWwtLWRCLTwvTklDSz4KKzxCTFVSQj5UaHJlc2hvbGQtTGV2ZWwtLWRCLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW5vaXNlLXdoaXRlOjpBbXBsaXR1ZGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkFtcGxpdHVkZTwvTklDSz4KKzxCTFVSQj5BbXBsaXR1ZGUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNNUFRFQWxwaGE6OmJvcmRlcjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Qm9yZGVyPC9OSUNLPgorPEJMVVJCPlRoZSBib3JkZXIgd2lkdGggb2YgdGhlIHRyYW5zaXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNNUFRFQWxwaGE6OmRlcHRoPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSwyNF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRlcHRoPC9OSUNLPgorPEJMVVJCPkRlcHRoIG9mIHRoZSBtYXNrIGluIGJpdHMuPC9CTFVSQj4KKzxERUZBVUxUPjE2PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTTVBURUFscGhhOjpwb3NpdGlvbjwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBvc2l0aW9uPC9OSUNLPgorPEJMVVJCPlBvc2l0aW9uIG9mIHRoZSB0cmFuc2l0aW9uIGVmZmVjdC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U01QVEVBbHBoYTo6dHlwZTwvTkFNRT4KKzxUWVBFPkdzdFNNUFRFQWxwaGFUcmFuc2l0aW9uVHlwZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlR5cGU8L05JQ0s+Cis8QkxVUkI+VGhlIHR5cGUgb2YgdHJhbnNpdGlvbiB0byB1c2UuPC9CTFVSQj4KKzxERUZBVUxUPkEgYmFyIG1vdmVzIGZyb20gbGVmdCB0byByaWdodDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U01QVEVBbHBoYTo6aW52ZXJ0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5JbnZlcnQ8L05JQ0s+Cis8QkxVUkI+SW52ZXJ0IHRyYW5zaXRpb24gbWFzay48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvS2FyYW9rZTo6ZmlsdGVyLWJhbmQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNDQxXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RmlsdGVyIEJhbmQ8L05JQ0s+Cis8QkxVUkI+VGhlIEZyZXF1ZW5jeSBiYW5kIG9mIHRoZSBmaWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjIyMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9LYXJhb2tlOjpmaWx0ZXItd2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RmlsdGVyIFdpZHRoPC9OSUNLPgorPEJMVVJCPlRoZSBGcmVxdWVuY3kgd2lkdGggb2YgdGhlIGZpbHRlci48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb0thcmFva2U6OmxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5MZXZlbDwvTklDSz4KKzxCTFVSQj5MZXZlbCBvZiB0aGUgZWZmZWN0ICgxLjAgPSBmdWxsKS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9LYXJhb2tlOjptb25vLWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Nb25vIExldmVsPC9OSUNLPgorPEJMVVJCPkxldmVsIG9mIHRoZSBtb25vIGNoYW5uZWwgKDEuMCA9IGZ1bGwpLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RQdWxzZVNpbms6OmRldmljZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRldmljZTwvTklDSz4KKzxCTFVSQj5UaGUgUHVsc2VBdWRpbyBzaW5rIGRldmljZSB0byBjb25uZWN0IHRvLjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RQdWxzZVNpbms6OnNlcnZlcjwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNlcnZlcjwvTklDSz4KKzxCTFVSQj5UaGUgUHVsc2VBdWRpbyBzZXJ2ZXIgdG8gY29ubmVjdCB0by48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UHVsc2VTaW5rOjpkZXZpY2UtbmFtZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+RGV2aWNlIG5hbWU8L05JQ0s+Cis8QkxVUkI+SHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgc291bmQgZGV2aWNlLjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RQdWxzZVNpbms6OnZvbHVtZTwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+WzAsMTBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Wb2x1bWU8L05JQ0s+Cis8QkxVUkI+TGluZWFyIHZvbHVtZSBvZiB0aGlzIHN0cmVhbSwgMS4wPTEwMCUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFB1bHNlU2luazo6bXV0ZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TXV0ZTwvTklDSz4KKzxCTFVSQj5NdXRlIHN0YXRlIG9mIHRoaXMgc3RyZWFtLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UHVsc2VTaW5rOjpzdHJlYW0tcHJvcGVydGllczwvTkFNRT4KKzxUWVBFPkdzdFN0cnVjdHVyZSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5zdHJlYW0gcHJvcGVydGllczwvTklDSz4KKzxCTFVSQj5saXN0IG9mIHB1bHNlYXVkaW8gc3RyZWFtIHByb3BlcnRpZXMuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UHVsc2VTaW5rOjpjbGllbnQtbmFtZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNsaWVudCBOYW1lPC9OSUNLPgorPEJMVVJCPlRoZSBQdWxzZUF1ZGlvIGNsaWVudCBuYW1lIHRvIHVzZS48L0JMVVJCPgorPERFRkFVTFQ+ImdzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zY2FuIjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UHVsc2VTaW5rOjpjdXJyZW50LWRldmljZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+Q3VycmVudCBEZXZpY2U8L05JQ0s+Cis8QkxVUkI+VGhlIGN1cnJlbnQgUHVsc2VBdWRpbyBzaW5rIGRldmljZS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UHVsc2VTcmM6OmRldmljZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRldmljZTwvTklDSz4KKzxCTFVSQj5UaGUgUHVsc2VBdWRpbyBzb3VyY2UgZGV2aWNlIHRvIGNvbm5lY3QgdG8uPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFB1bHNlU3JjOjpzZXJ2ZXI8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TZXJ2ZXI8L05JQ0s+Cis8QkxVUkI+VGhlIFB1bHNlQXVkaW8gc2VydmVyIHRvIGNvbm5lY3QgdG8uPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFB1bHNlU3JjOjpkZXZpY2UtbmFtZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+RGV2aWNlIG5hbWU8L05JQ0s+Cis8QkxVUkI+SHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgc291bmQgZGV2aWNlLjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RQdWxzZVNyYzo6c3RyZWFtLXByb3BlcnRpZXM8L05BTUU+Cis8VFlQRT5Hc3RTdHJ1Y3R1cmUqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+c3RyZWFtIHByb3BlcnRpZXM8L05JQ0s+Cis8QkxVUkI+bGlzdCBvZiBwdWxzZWF1ZGlvIHN0cmVhbSBwcm9wZXJ0aWVzLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFB1bHNlU3JjOjptdXRlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NdXRlPC9OSUNLPgorPEJMVVJCPk11dGUgc3RhdGUgb2YgdGhpcyBzdHJlYW0uPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RQdWxzZVNyYzo6c291cmNlLW91dHB1dC1pbmRleDwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5zb3VyY2Ugb3V0cHV0IGluZGV4PC9OSUNLPgorPEJMVVJCPlRoZSBpbmRleCBvZiB0aGUgUHVsc2VBdWRpbyBzb3VyY2Ugb3V0cHV0IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyByZWNvcmQgc3RyZWFtLjwvQkxVUkI+Cis8REVGQVVMVD40Mjk0OTY3Mjk1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RQdWxzZVNyYzo6dm9sdW1lPC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlZvbHVtZTwvTklDSz4KKzxCTFVSQj5MaW5lYXIgdm9sdW1lIG9mIHRoaXMgc3RyZWFtLCAxLjA9MTAwJS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UHVsc2VTcmM6OmNsaWVudC1uYW1lPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q2xpZW50IE5hbWU8L05JQ0s+Cis8QkxVUkI+VGhlIFB1bHNlQXVkaW8gY2xpZW50X25hbWVfdG9fdXNlLjwvQkxVUkI+Cis8REVGQVVMVD4iZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNjYW4iPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RQdWxzZVNyYzo6Y3VycmVudC1kZXZpY2U8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkN1cnJlbnQgRGV2aWNlPC9OSUNLPgorPEJMVVJCPlRoZSBjdXJyZW50IFB1bHNlQXVkaW8gc291cmNlIGRldmljZS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VGFnSW5qZWN0Ojp0YWdzPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+dzwvRkxBR1M+Cis8TklDSz50YWdsaXN0PC9OSUNLPgorPEJMVVJCPkxpc3Qgb2YgdGFncyB0byBpbmplY3QgaW50byB0aGUgdGFyZ2V0IGZpbGUuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdERlaW50ZXJsZWF2ZTo6a2VlcC1wb3NpdGlvbnM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPktlZXAgcG9zaXRpb25zPC9OSUNLPgorPEJMVVJCPktlZXAgdGhlIG9yaWdpbmFsIGNoYW5uZWwgcG9zaXRpb25zIG9uIHRoZSBvdXRwdXQgYnVmZmVycy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEludGVybGVhdmU6OmNoYW5uZWwtcG9zaXRpb25zPC9OQU1FPgorPFRZUEU+R1ZhbHVlQXJyYXkqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q2hhbm5lbCBwb3NpdGlvbnM8L05JQ0s+Cis8QkxVUkI+Q2hhbm5lbCBwb3NpdGlvbnMgdXNlZCBvbiB0aGUgb3V0cHV0LjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEludGVybGVhdmU6OmNoYW5uZWwtcG9zaXRpb25zLWZyb20taW5wdXQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNoYW5uZWwgcG9zaXRpb25zIGZyb20gaW5wdXQ8L05JQ0s+Cis8QkxVUkI+VGFrZSBjaGFubmVsIHBvc2l0aW9ucyBmcm9tIHRoZSBpbnB1dC48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UmdWb2x1bWU6OmFsYnVtLW1vZGU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkFsYnVtIG1vZGU8L05JQ0s+Cis8QkxVUkI+UHJlZmVyIGFsYnVtIG92ZXIgdHJhY2sgZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UmdWb2x1bWU6OmZhbGxiYWNrLWdhaW48L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlstNjAsNjBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5GYWxsYmFjayBnYWluPC9OSUNLPgorPEJMVVJCPkdhaW4gZm9yIHN0cmVhbXMgbWlzc2luZyB0YWdzIFtkQl0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJnVm9sdW1lOjpoZWFkcm9vbTwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+WzAsNjBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5IZWFkcm9vbTwvTklDSz4KKzxCTFVSQj5FeHRyYSBoZWFkcm9vbSBbZEJdLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSZ1ZvbHVtZTo6cHJlLWFtcDwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+Wy02MCw2MF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlByZS1hbXA8L05JQ0s+Cis8QkxVUkI+RXh0cmEgZ2FpbiBbZEJdLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSZ1ZvbHVtZTo6cmVzdWx0LWdhaW48L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlstMTIwLDEyMF08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+UmVzdWx0LWdhaW48L05JQ0s+Cis8QkxVUkI+QXBwbGllZCBnYWluIFtkQl0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJnVm9sdW1lOjp0YXJnZXQtZ2FpbjwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+Wy0xMjAsMTIwXTwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5UYXJnZXQtZ2FpbjwvTklDSz4KKzxCTFVSQj5BcHBsaWNhYmxlIGdhaW4gW2RCXS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UmdMaW1pdGVyOjplbmFibGVkPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5FbmFibGVkPC9OSUNLPgorPEJMVVJCPkVuYWJsZSBwcm9jZXNzaW5nLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSZ0FuYWx5c2lzOjpmb3JjZWQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZvcmNlZDwvTklDSz4KKzxCTFVSQj5BbmFseXplIGV2ZW4gaWYgUmVwbGF5R2FpbiB0YWdzIGV4aXN0LjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSZ0FuYWx5c2lzOjpudW0tdHJhY2tzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5OdW1iZXIgb2YgYWxidW0gdHJhY2tzPC9OSUNLPgorPEJMVVJCPk51bWJlciBvZiByZW1haW5pbmcgYWxidW0gdHJhY2tzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSZ0FuYWx5c2lzOjpyZWZlcmVuY2UtbGV2ZWw8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlswLDE1MF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJlZmVyZW5jZSBsZXZlbDwvTklDSz4KKzxCTFVSQj5SZWZlcmVuY2UgbGV2ZWwgW2RCXS48L0JMVVJCPgorPERFRkFVTFQ+ODk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJnQW5hbHlzaXM6Om1lc3NhZ2U8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5NZXNzYWdlPC9OSUNLPgorPEJMVVJCPlBvc3Qgc3RhdGljcyBtZXNzYWdlcy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEhEVjEzOTRTcmM6OmNoYW5uZWw8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDY0XTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q2hhbm5lbDwvTklDSz4KKzxCTFVSQj5DaGFubmVsIG51bWJlciBmb3IgbGlzdGVuaW5nLjwvQkxVUkI+Cis8REVGQVVMVD42MzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SERWMTM5NFNyYzo6ZGV2aWNlLW5hbWU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPmRldmljZSBuYW1lPC9OSUNLPgorPEJMVVJCPnVzZXItZnJpZW5kbHkgbmFtZSBvZiB0aGUgZGV2aWNlLjwvQkxVUkI+Cis8REVGQVVMVD4iRGVmYXVsdCI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEhEVjEzOTRTcmM6Omd1aWQ8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+R1VJRDwvTklDSz4KKzxCTFVSQj5zZWxlY3Qgb25lIG9mIG11bHRpcGxlIERWIGRldmljZXMgYnkgaXRzIEdVSUQuIHVzZSBhIGhleGFkZWNpbWFsIGxpa2UgMHhoaGhoaGhoaGhoaGhoaGhoLiAoMCA9IG5vIGd1aWQpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RIRFYxMzk0U3JjOjpwb3J0PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bR19NQVhVTE9ORywxNl08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBvcnQ8L05JQ0s+Cis8QkxVUkI+UG9ydCBudW1iZXIgKC0xIGF1dG9tYXRpYykuPC9CTFVSQj4KKzxERUZBVUxUPi0xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RIRFYxMzk0U3JjOjp1c2UtYXZjPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Vc2UgQVYvQzwvTklDSz4KKzxCTFVSQj5Vc2UgQVYvQyBWVFIgY29udHJvbC48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSlBFR1BheTo6cXVhbGl0eTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMjU1XTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UXVhbGl0eTwvTklDSz4KKzxCTFVSQj5RdWFsaXR5IGZhY3RvciBvbiBKUEVHIGRhdGEgKHVudXNlZCkuPC9CTFVSQj4KKzxERUZBVUxUPjI1NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSlBFR1BheTo6dHlwZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMjU1XTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VHlwZTwvTklDSz4KKzxCTFVSQj5EZWZhdWx0IEpQRUcgVHlwZSwgb3ZlcndyaXR0ZW4gYnkgU09GIHdoZW4gcHJlc2VudC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9GSVJGaWx0ZXI6Omtlcm5lbDwvTkFNRT4KKzxUWVBFPkdWYWx1ZUFycmF5KjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZpbHRlciBLZXJuZWw8L05JQ0s+Cis8QkxVUkI+RmlsdGVyIGtlcm5lbCBmb3IgdGhlIEZJUiBmaWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9GSVJGaWx0ZXI6OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TGF0ZWN5PC9OSUNLPgorPEJMVVJCPkZpbHRlciBsYXRlbmN5IGluIHNhbXBsZXMuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvSUlSRmlsdGVyOjphPC9OQU1FPgorPFRZUEU+R1ZhbHVlQXJyYXkqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QTwvTklDSz4KKzxCTFVSQj5GaWx0ZXIgY29lZmZpY2llbnRzIChkZW5vbWluYXRvciBvZiB0cmFuc2ZlciBmdW5jdGlvbikuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9JSVJGaWx0ZXI6OmI8L05BTUU+Cis8VFlQRT5HVmFsdWVBcnJheSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CPC9OSUNLPgorPEJMVVJCPkZpbHRlciBjb2VmZmljaWVudHMgKG51bWVyYXRvciBvZiB0cmFuc2ZlciBmdW5jdGlvbikuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9FY2hvOjpkZWxheTwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+Pj0gMTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RGVsYXk8L05JQ0s+Cis8QkxVUkI+RGVsYXkgb2YgdGhlIGVjaG8gaW4gbmFub3NlY29uZHMuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvRWNobzo6ZmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPkFtb3VudCBvZiBmZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9FY2hvOjppbnRlbnNpdHk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludGVuc2l0eTwvTklDSz4KKzxCTFVSQj5JbnRlbnNpdHkgb2YgdGhlIGVjaG8uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvRWNobzo6bWF4LWRlbGF5PC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT4+PSAxPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXhpbXVtIERlbGF5PC9OSUNLPgorPEJMVVJCPk1heGltdW0gZGVsYXkgb2YgdGhlIGVjaG8gaW4gbmFub3NlY29uZHMgKGNhbid0IGJlIGNoYW5nZWQgaW4gUExBWUlORyBvciBQQVVTRUQgc3RhdGUpLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb0VjaG86OnN1cnJvdW5kLWRlbGF5PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5FbmFibGUgU3Vycm91bmQgRGVsYXk8L05JQ0s+Cis8QkxVUkI+RGVsYXkgU3Vycm91bmQgQ2hhbm5lbHMgd2hlbiBUUlVFIGluc3RlYWQgb2YgYXBwbHlpbmcgYW4gZWNobyBlZmZlY3QuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb0VjaG86OnN1cnJvdW5kLW1hc2s8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPj49IDE8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlN1cnJvdW5kIE1hc2s8L05JQ0s+Cis8QkxVUkI+QSBiaXRtYXNrIG9mIGNoYW5uZWxzIHRoYXQgYXJlIGNvbnNpZGVyZWQgc3Vycm91bmQgYW5kIGRlbGF5ZWQgd2hlbiBzdXJyb3VuZC1kZWxheSA9IFRSVUUuPC9CTFVSQj4KKzxERUZBVUxUPjE4NDQ2NzQ0MDczNzA5NTUxNjEyPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBc3BlY3RSYXRpb0Nyb3A6OmFzcGVjdC1yYXRpbzwvTkFNRT4KKzxUWVBFPkdzdEZyYWN0aW9uPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+YXNwZWN0LXJhdGlvPC9OSUNLPgorPEJMVVJCPlRhcmdldCBhc3BlY3QtcmF0aW8gb2YgdmlkZW8uPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwRzcyNkRlcGF5Ojpmb3JjZS1hYWwyPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Gb3JjZSBBQUwyPC9OSUNLPgorPEJMVVJCPkZvcmNlIEFBTDIgZGVjb2RpbmcgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBiYWQgcGF5bG9hZGVycy48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwRzcyNlBheTo6Zm9yY2UtYWFsMjwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Rm9yY2UgQUFMMjwvTklDSz4KKzxCTFVSQj5Gb3JjZSBBQUwyIGVuY29kaW5nIGZvciBjb21wYXRpYmlsaXR5IHdpdGggYmFkIGRlcGF5bG9hZGVycy48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSDI2M1BheTo6bW9kZWEtb25seTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RnJhZ21lbnQgcGFja2V0cyBpbiBtb2RlIEEgT25seTwvTklDSz4KKzxCTFVSQj5EaXNhYmxlIHBhY2tldGl6YXRpb24gbW9kZXMgQiBhbmQgQy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdERlaW50ZXJsYWNlOjpmaWVsZHM8L05BTUU+Cis8VFlQRT5Hc3REZWludGVybGFjZUZpZWxkczwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPmZpZWxkczwvTklDSz4KKzxCTFVSQj5GaWVsZHMgdG8gdXNlIGZvciBkZWludGVybGFjaW5nLjwvQkxVUkI+Cis8REVGQVVMVD5BbGwgZmllbGRzPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3REZWludGVybGFjZTo6bWV0aG9kPC9OQU1FPgorPFRZUEU+R3N0RGVpbnRlcmxhY2VNZXRob2RzPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWV0aG9kPC9OSUNLPgorPEJMVVJCPkRlaW50ZXJsYWNlIE1ldGhvZC48L0JMVVJCPgorPERFRkFVTFQ+TGluZWFyPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3REZWludGVybGFjZTo6bW9kZTwvTkFNRT4KKzxUWVBFPkdzdERlaW50ZXJsYWNlTW9kZXM8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Nb2RlPC9OSUNLPgorPEJMVVJCPkRlaW50ZXJsYWNlIE1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPkF1dG8gZGV0ZWN0aW9uIChiZXN0IGVmZm9ydCk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdERlaW50ZXJsYWNlOjp0ZmY8L05BTUU+Cis8VFlQRT5Hc3REZWludGVybGFjZUZpZWxkTGF5b3V0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+dGZmPC9OSUNLPgorPEJMVVJCPkRlaW50ZXJsYWNlIHRvcCBmaWVsZCBmaXJzdC48L0JMVVJCPgorPERFRkFVTFQ+QXV0byBkZXRlY3Rpb248L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdERlaW50ZXJsYWNlOjpkcm9wLW9ycGhhbnM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPmRyb3Atb3JwaGFuczwvTklDSz4KKzxCTFVSQj5Ecm9wIG9ycGhhbiBmaWVsZHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0ZWxlY2luZSBwYXR0ZXJucyBpbiBhY3RpdmUgbG9ja2luZyBtb2RlLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3REZWludGVybGFjZTo6aWdub3JlLW9ic2N1cmU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPmlnbm9yZS1vYnNjdXJlPC9OSUNLPgorPEJMVVJCPklnbm9yZSBvYnNjdXJlIHRlbGVjaW5lIHBhdHRlcm5zIChvbmx5IGNvbnNpZGVyIFAsIEkgYW5kIDI6MyB2YXJpYW50cykuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdERlaW50ZXJsYWNlOjpsb2NraW5nPC9OQU1FPgorPFRZUEU+R3N0RGVpbnRlcmxhY2VMb2NraW5nPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+bG9ja2luZzwvTklDSz4KKzxCTFVSQj5QYXR0ZXJuIGxvY2tpbmcgbW9kZS48L0JMVVJCPgorPERFRkFVTFQ+Tm8gcGF0dGVybiBsb2NraW5nPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBZ2luZ1RWOjpjb2xvci1hZ2luZzwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q29sb3IgQWdpbmc8L05JQ0s+Cis8QkxVUkI+Q29sb3IgQWdpbmcuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEFnaW5nVFY6OmR1c3RzPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EdXN0czwvTklDSz4KKzxCTFVSQj5EdXN0cy48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QWdpbmdUVjo6cGl0czwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UGl0czwvTklDSz4KKzxCTFVSQj5QaXRzLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBZ2luZ1RWOjpzY3JhdGNoLWxpbmVzPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMjA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNjcmF0Y2ggTGluZXM8L05JQ0s+Cis8QkxVUkI+TnVtYmVyIG9mIHNjcmF0Y2ggbGluZXMuPC9CTFVSQj4KKzxERUZBVUxUPjc8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE9wVFY6Om1vZGU8L05BTUU+Cis8VFlQRT5Hc3RPcFRWTW9kZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1vZGU8L05JQ0s+Cis8QkxVUkI+TW9kZS48L0JMVVJCPgorPERFRkFVTFQ+TWFlbHN0cm9tPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RPcFRWOjpzcGVlZDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TcGVlZDwvTklDSz4KKzxCTFVSQj5FZmZlY3Qgc3BlZWQuPC9CTFVSQj4KKzxERUZBVUxUPjE2PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RPcFRWOjp0aHJlc2hvbGQ8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSBHX01BWElOVDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VGhyZXNob2xkPC9OSUNLPgorPEJMVVJCPkx1bWEgdGhyZXNob2xkLjwvQkxVUkI+Cis8REVGQVVMVD42MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UmFkaW9hY1RWOjpjb2xvcjwvTkFNRT4KKzxUWVBFPkdzdFJhZGlvYWNUVkNvbG9yPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q29sb3I8L05JQ0s+Cis8QkxVUkI+Q29sb3IuPC9CTFVSQj4KKzxERUZBVUxUPldoaXRlPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSYWRpb2FjVFY6OmludGVydmFsPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gR19NQVhJTlQ8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludGVydmFsPC9OSUNLPgorPEJMVVJCPlNuYXBzaG90IGludGVydmFsIChpbiBzdHJvYmUgbW9kZSkuPC9CTFVSQj4KKzxERUZBVUxUPjM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJhZGlvYWNUVjo6bW9kZTwvTkFNRT4KKzxUWVBFPkdzdFJhZGlvYWNUVk1vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Nb2RlPC9OSUNLPgorPEJMVVJCPk1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPk5vcm1hbDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UmFkaW9hY1RWOjp0cmlnZ2VyPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UcmlnZ2VyPC9OSUNLPgorPEJMVVJCPlRyaWdnZXIgKGluIHRyaWdnZXIgbW9kZSkuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTdHJlYWtUVjo6ZmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPkZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UmlwcGxlVFY6Om1vZGU8L05BTUU+Cis8VFlQRT5Hc3RSaXBwbGVUVk1vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Nb2RlPC9OSUNLPgorPEJMVVJCPk1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPk1vdGlvbiBEZXRlY3Rpb248L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJpcHBsZVRWOjpyZXNldDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+dzwvRkxBR1M+Cis8TklDSz5SZXNldDwvTklDSz4KKzxCTFVSQj5SZXNldCBhbGwgY3VycmVudCByaXBwbGVzLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjpkby1sb3N0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EbyBMb3N0PC9OSUNLPgorPEJMVVJCPlNlbmQgYW4gZXZlbnQgZG93bnN0cmVhbSB3aGVuIGEgcGFja2V0IGlzIGxvc3QuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBCaW46OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkJ1ZmZlciBsYXRlbmN5IGluIG1zPC9OSUNLPgorPEJMVVJCPkRlZmF1bHQgYW1vdW50IG9mIG1zIHRvIGJ1ZmZlciBpbiB0aGUgaml0dGVyYnVmZmVycy48L0JMVVJCPgorPERFRkFVTFQ+MjAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBCaW46OnNkZXM8L05BTUU+Cis8VFlQRT5Hc3RTdHJ1Y3R1cmUqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U0RFUzwvTklDSz4KKzxCTFVSQj5UaGUgU0RFUyBpdGVtcyBvZiB0aGlzIHNlc3Npb24uPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjppZ25vcmUtcHQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPklnbm9yZSBQVDwvTklDSz4KKzxCTFVSQj5EbyBub3QgZGVtdWx0aXBsZXggYmFzZWQgb24gUFQgdmFsdWVzLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjphdXRvcmVtb3ZlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5BdXRvIFJlbW92ZTwvTklDSz4KKzxCTFVSQj5BdXRvbWF0aWNhbGx5IHJlbW92ZSB0aW1lZCBvdXQgc291cmNlcy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEJpbjo6YnVmZmVyLW1vZGU8L05BTUU+Cis8VFlQRT5SVFBKaXR0ZXJCdWZmZXJNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QnVmZmVyIE1vZGU8L05JQ0s+Cis8QkxVUkI+Q29udHJvbCB0aGUgYnVmZmVyaW5nIGFsZ29yaXRobSBpbiB1c2UuPC9CTFVSQj4KKzxERUZBVUxUPlNsYXZlIHJlY2VpdmVyIHRvIHNlbmRlciBjbG9jazwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjpudHAtc3luYzwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U3luYyBvbiBOVFAgY2xvY2s8L05JQ0s+Cis8QkxVUkI+U3luY2hyb25pemUgcmVjZWl2ZWQgc3RyZWFtcyB0byB0aGUgTlRQIGNsb2NrLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjp1c2UtcGlwZWxpbmUtY2xvY2s8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlVzZSBwaXBlbGluZSBjbG9jazwvTklDSz4KKzxCTFVSQj5Vc2UgdGhlIHBpcGVsaW5lIHJ1bm5pbmctdGltZSB0byBzZXQgdGhlIE5UUCB0aW1lIGluIHRoZSBSVENQIFNSIG1lc3NhZ2VzIChERVBSRUNBVEVEOiBVc2UgbnRwLXRpbWUtc291cmNlIHByb3BlcnR5KS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEJpbjo6cnRjcC1zeW5jPC9OQU1FPgorPFRZUEU+R3N0UlRDUFN5bmM8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SVENQIFN5bmM8L05JQ0s+Cis8QkxVUkI+VXNlIG9mIFJUQ1AgU1IgaW4gc3luY2hyb25pemF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD5hbHdheXM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEJpbjo6cnRjcC1zeW5jLWludGVydmFsPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SVENQIFN5bmMgSW50ZXJ2YWw8L05JQ0s+Cis8QkxVUkI+UlRDUCBTUiBpbnRlcnZhbCBzeW5jaHJvbml6YXRpb24gKG1zKSAoMCA9IGFsd2F5cykuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEJpbjo6ZHJvcC1vbi1sYXRlbmN5PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Ecm9wIGJ1ZmZlcnMgd2hlbiBtYXhpbXVtIGxhdGVuY3kgaXMgcmVhY2hlZDwvTklDSz4KKzxCTFVSQj5UZWxscyB0aGUgaml0dGVyYnVmZmVyIHRvIG5ldmVyIGV4Y2VlZCB0aGUgZ2l2ZW4gbGF0ZW5jeSBpbiBzaXplLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjpkby1zeW5jLWV2ZW50PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EbyBTeW5jIEV2ZW50PC9OSUNLPgorPEJMVVJCPlNlbmQgZXZlbnQgZG93bnN0cmVhbSB3aGVuIGEgc3RyZWFtIGlzIHN5bmNocm9uaXplZCB0byB0aGUgc2VuZGVyLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjpkby1yZXRyYW5zbWlzc2lvbjwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RG8gcmV0cmFuc21pc3Npb248L05JQ0s+Cis8QkxVUkI+RW5hYmxlIHJldHJhbnNtaXNzaW9uIG9uIGFsbCBzdHJlYW1zLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjpydHAtcHJvZmlsZTwvTkFNRT4KKzxUWVBFPkdzdFJUUFByb2ZpbGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SVFAgUHJvZmlsZTwvTklDSz4KKzxCTFVSQj5EZWZhdWx0IFJUUCBwcm9maWxlIG9mIG5ld2x5IGNyZWF0ZWQgc2Vzc2lvbnMuPC9CTFVSQj4KKzxERUZBVUxUPkdTVF9SVFBfUFJPRklMRV9BVlA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEJpbjo6bnRwLXRpbWUtc291cmNlPC9OQU1FPgorPFRZUEU+R3N0UnRwTnRwVGltZVNvdXJjZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk5UUCBUaW1lIFNvdXJjZTwvTklDSz4KKzxCTFVSQj5OVFAgdGltZSBzb3VyY2UgZm9yIFJUQ1AgcGFja2V0cy48L0JMVVJCPgorPERFRkFVTFQ+TlRQIHRpbWUgYmFzZWQgb24gcmVhbHRpbWUgY2xvY2s8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEJpbjo6bWF4LWRyb3BvdXQtdGltZTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4IGRyb3BvdXQgdGltZTwvTklDSz4KKzxCTFVSQj5UaGUgbWF4aW11bSB0aW1lIChtaWxsaXNlY29uZHMpIG9mIG1pc3NpbmcgcGFja2V0cyB0b2xlcmF0ZWQuPC9CTFVSQj4KKzxERUZBVUxUPjYwMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBCaW46Om1heC1taXNvcmRlci10aW1lPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXggbWlzb3JkZXIgdGltZTwvTklDSz4KKzxCTFVSQj5UaGUgbWF4aW11bSB0aW1lIChtaWxsaXNlY29uZHMpIG9mIG1pc29yZGVyZWQgcGFja2V0cyB0b2xlcmF0ZWQuPC9CTFVSQj4KKzxERUZBVUxUPjIwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEJpbjo6bWF4LXJ0Y3AtcnRwLXRpbWUtZGlmZjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4IFJUQ1AgUlRQIFRpbWUgRGlmZjwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIGFtb3VudCBvZiB0aW1lIGluIG1zIHRoYXQgdGhlIFJUUCB0aW1lIGluIFJUQ1AgU1JzIGlzIGFsbG93ZWQgdG8gYmUgYWhlYWQgKC0xIGRpc2FibGVkKS48L0JMVVJCPgorPERFRkFVTFQ+MTAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjpydGNwLXN5bmMtc2VuZC10aW1lPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SVENQIFN5bmMgU2VuZCBUaW1lPC9OSUNLPgorPEJMVVJCPlVzZSBzZW5kIHRpbWUgb3IgY2FwdHVyZSB0aW1lIGZvciBSVENQIHN5bmMgKFRSVUUgPSBzZW5kIHRpbWUsIEZBTFNFID0gY2FwdHVyZSB0aW1lKS48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjpyZmM3MjczLXN5bmM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlN5bmMgb24gUkZDNzI3MyBjbG9jazwvTklDSz4KKzxCTFVSQj5TeW5jaHJvbml6ZSByZWNlaXZlZCBzdHJlYW1zIHRvIHRoZSBSRkM3MjczIGNsb2NrIChyZXF1aXJlcyBjbG9jayBhbmQgb2Zmc2V0IHRvIGJlIHByb3ZpZGVkKS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEJpbjo6bWF4LXN0cmVhbXM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heCBTdHJlYW1zPC9OSUNLPgorPEJMVVJCPlRoZSBtYXhpbXVtIG51bWJlciBvZiBzdHJlYW1zIHRvIGNyZWF0ZSBmb3Igb25lIHNlc3Npb24uPC9CTFVSQj4KKzxERUZBVUxUPjQyOTQ5NjcyOTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEJpbjo6bWF4LXRzLW9mZnNldDwvTkFNRT4KKzxUWVBFPmdpbnQ2NDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXggVFMgT2Zmc2V0PC9OSUNLPgorPEJMVVJCPlRoZSBtYXhpbXVtIGFic29sdXRlIHZhbHVlIG9mIHRoZSB0aW1lIG9mZnNldCBpbiAobmFub3NlY29uZHMpLiBOb3RlLCBpZiB0aGUgbnRwLXN5bmMgcGFyYW1ldGVyIGlzIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBjaGFuZ2VkIHRvIDAgKG5vIGxpbWl0KS48L0JMVVJCPgorPERFRkFVTFQ+MzAwMDAwMDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjptYXgtdHMtb2Zmc2V0LWFkanVzdG1lbnQ8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4IFRpbWVzdGFtcCBPZmZzZXQgQWRqdXN0bWVudDwvTklDSz4KKzxCTFVSQj5UaGUgbWF4aW11bSBudW1iZXIgb2YgbmFub3NlY29uZHMgcGVyIGZyYW1lIHRoYXQgdGltZSBzdGFtcCBvZmZzZXRzIG1heSBiZSBhZGp1c3RlZCAoMCA9IG5vIGxpbWl0KS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSml0dGVyQnVmZmVyOjpkby1sb3N0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EbyBMb3N0PC9OSUNLPgorPEJMVVJCPlNlbmQgYW4gZXZlbnQgZG93bnN0cmVhbSB3aGVuIGEgcGFja2V0IGlzIGxvc3QuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OmRyb3Atb24tbGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RHJvcCBidWZmZXJzIHdoZW4gbWF4aW11bSBsYXRlbmN5IGlzIHJlYWNoZWQ8L05JQ0s+Cis8QkxVUkI+VGVsbHMgdGhlIGppdHRlcmJ1ZmZlciB0byBuZXZlciBleGNlZWQgdGhlIGdpdmVuIGxhdGVuY3kgaW4gc2l6ZS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEppdHRlckJ1ZmZlcjo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QnVmZmVyIGxhdGVuY3kgaW4gbXM8L05JQ0s+Cis8QkxVUkI+QW1vdW50IG9mIG1zIHRvIGJ1ZmZlci48L0JMVVJCPgorPERFRkFVTFQ+MjAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OnRzLW9mZnNldDwvTkFNRT4KKzxUWVBFPmdpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRpbWVzdGFtcCBPZmZzZXQ8L05JQ0s+Cis8QkxVUkI+QWRqdXN0IGJ1ZmZlciB0aW1lc3RhbXBzIHdpdGggb2Zmc2V0IGluIG5hbm9zZWNvbmRzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6Om1vZGU8L05BTUU+Cis8VFlQRT5SVFBKaXR0ZXJCdWZmZXJNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TW9kZTwvTklDSz4KKzxCTFVSQj5Db250cm9sIHRoZSBidWZmZXJpbmcgYWxnb3JpdGhtIGluIHVzZS48L0JMVVJCPgorPERFRkFVTFQ+U2xhdmUgcmVjZWl2ZXIgdG8gc2VuZGVyIGNsb2NrPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OnBlcmNlbnQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDEwMF08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+cGVyY2VudDwvTklDSz4KKzxCTFVSQj5UaGUgYnVmZmVyIGZpbGxlZCBwZXJjZW50LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OmRvLXJldHJhbnNtaXNzaW9uPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EbyBSZXRyYW5zbWlzc2lvbjwvTklDSz4KKzxCTFVSQj5TZW5kIHJldHJhbnNtaXNzaW9uIGV2ZW50cyB1cHN0cmVhbSB3aGVuIGEgcGFja2V0IGlzIGxhdGUuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OnJ0eC1kZWxheTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UlRYIERlbGF5PC9OSUNLPgorPEJMVVJCPkV4dHJhIHRpbWUgaW4gbXMgdG8gd2FpdCBiZWZvcmUgc2VuZGluZyByZXRyYW5zbWlzc2lvbiBldmVudCAoLTEgYXV0b21hdGljKS48L0JMVVJCPgorPERFRkFVTFQ+LTE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEppdHRlckJ1ZmZlcjo6cnR4LWRlbGF5LXJlb3JkZXI8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJUWCBEZWxheSBSZW9yZGVyPC9OSUNLPgorPEJMVVJCPlNlbmRpbmcgcmV0cmFuc21pc3Npb24gZXZlbnQgd2hlbiB0aGlzIG11Y2ggcmVvcmRlcmluZyAoMCBkaXNhYmxlLCAtMSBhdXRvbWF0aWMpLjwvQkxVUkI+Cis8REVGQVVMVD4zPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OnJ0eC1yZXRyeS1wZXJpb2Q8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJUWCBSZXRyeSBQZXJpb2Q8L05JQ0s+Cis8QkxVUkI+VHJ5IHRvIGdldCBhIHJldHJhbnNtaXNzaW9uIGZvciB0aGlzIG1hbnkgbXMgKC0xIGF1dG9tYXRpYykuPC9CTFVSQj4KKzxERUZBVUxUPi0xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OnJ0eC1yZXRyeS10aW1lb3V0PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSBHX01BWFVMT05HPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SVFggUmV0cnkgVGltZW91dDwvTklDSz4KKzxCTFVSQj5SZXRyeSBzZW5kaW5nIGEgdHJhbnNtaXNzaW9uIGV2ZW50IGFmdGVyIHRoaXMgdGltZW91dCBpbiBtcyAoLTEgYXV0b21hdGljKS48L0JMVVJCPgorPERFRkFVTFQ+LTE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEppdHRlckJ1ZmZlcjo6c3RhdHM8L05BTUU+Cis8VFlQRT5Hc3RTdHJ1Y3R1cmUqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5TdGF0aXN0aWNzPC9OSUNLPgorPEJMVVJCPlZhcmlvdXMgc3RhdGlzdGljcy48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OnJ0eC1taW4tZGVsYXk8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1pbmltdW0gUlRYIERlbGF5PC9OSUNLPgorPEJMVVJCPk1pbmltdW0gdGltZSBpbiBtcyB0byB3YWl0IGJlZm9yZSBzZW5kaW5nIHJldHJhbnNtaXNzaW9uIGV2ZW50LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OnJ0eC1taW4tcmV0cnktdGltZW91dDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UlRYIE1pbiBSZXRyeSBUaW1lb3V0PC9OSUNLPgorPEJMVVJCPk1pbmltdW0gdGltZW91dCBiZXR3ZWVuIHNlbmRpbmcgYSB0cmFuc21pc3Npb24gZXZlbnQgaW4gbXMgKC0xIGF1dG9tYXRpYykuPC9CTFVSQj4KKzxERUZBVUxUPi0xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OnJ0eC1tYXgtcmV0cmllczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UlRYIE1heCBSZXRyaWVzPC9OSUNLPgorPEJMVVJCPlRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIHRvIHJlcXVlc3QgYSByZXRyYW5zbWlzc2lvbi4gKC0xIG5vdCBsaW1pdGVkKS48L0JMVVJCPgorPERFRkFVTFQ+LTE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEppdHRlckJ1ZmZlcjo6cnR4LW5leHQtc2VxbnVtPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SVFggbmV4dCBzZXFudW08L05JQ0s+Cis8QkxVUkI+RXN0aW1hdGUgd2hlbiB0aGUgbmV4dCBwYWNrZXQgc2hvdWxkIGFycml2ZSBhbmQgc2NoZWR1bGUgYSByZXRyYW5zbWlzc2lvbiByZXF1ZXN0IGZvciBpdC48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSml0dGVyQnVmZmVyOjptYXgtZHJvcG91dC10aW1lPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXggZHJvcG91dCB0aW1lPC9OSUNLPgorPEJMVVJCPlRoZSBtYXhpbXVtIHRpbWUgKG1pbGxpc2Vjb25kcykgb2YgbWlzc2luZyBwYWNrZXRzIHRvbGVyYXRlZC48L0JMVVJCPgorPERFRkFVTFQ+NjAwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEppdHRlckJ1ZmZlcjo6bWF4LW1pc29yZGVyLXRpbWU8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heCBtaXNvcmRlciB0aW1lPC9OSUNLPgorPEJMVVJCPlRoZSBtYXhpbXVtIHRpbWUgKG1pbGxpc2Vjb25kcykgb2YgbWlzb3JkZXJlZCBwYWNrZXRzIHRvbGVyYXRlZC48L0JMVVJCPgorPERFRkFVTFQ+MjAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSml0dGVyQnVmZmVyOjptYXgtcnRjcC1ydHAtdGltZS1kaWZmPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSBHX01BWFVMT05HPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXggUlRDUCBSVFAgVGltZSBEaWZmPC9OSUNLPgorPEJMVVJCPk1heGltdW0gYW1vdW50IG9mIHRpbWUgaW4gbXMgdGhhdCB0aGUgUlRQIHRpbWUgaW4gUlRDUCBTUnMgaXMgYWxsb3dlZCB0byBiZSBhaGVhZCAoLTEgZGlzYWJsZWQpLjwvQkxVUkI+Cis8REVGQVVMVD4xMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OnJmYzcyNzMtc3luYzwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U3luYyBvbiBSRkM3MjczIGNsb2NrPC9OSUNLPgorPEJMVVJCPlN5bmNocm9uaXplIHJlY2VpdmVkIHN0cmVhbXMgdG8gdGhlIFJGQzcyNzMgY2xvY2sgKHJlcXVpcmVzIGNsb2NrIGFuZCBvZmZzZXQgdG8gYmUgcHJvdmlkZWQpLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSml0dGVyQnVmZmVyOjpydHgtZGVhZGxpbmU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJUWCBEZWFkbGluZSAobXMpPC9OSUNLPgorPEJMVVJCPlRoZSBkZWFkbGluZSBmb3IgYSB2YWxpZCBSVFggcmVxdWVzdCBpbiBtaWxsaXNlY29uZHMuICgtMSBhdXRvbWF0aWMpLjwvQkxVUkI+Cis8REVGQVVMVD4tMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSml0dGVyQnVmZmVyOjpydHgtc3RhdHMtdGltZW91dDwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UlRYIFN0YXRpc3RpY3MgVGltZW91dDwvTklDSz4KKzxCTFVSQj5UaGUgdGltZSB0byB3YWl0IGZvciBhIHJldHJhbnNtaXR0ZWQgcGFja2V0IGFmdGVyIGl0IGhhcyBiZWVuIGNvbnNpZGVyZWQgbG9zdCBpbiBvcmRlciB0byBjb2xsZWN0IHN0YXRpc3RpY3MgKG1zKS48L0JMVVJCPgorPERFRkFVTFQ+MTAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSml0dGVyQnVmZmVyOjpmYXN0c3RhcnQtbWluLXBhY2tldHM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZhc3RzdGFydCBtaW5pbXVtIHBhY2tldHM8L05JQ0s+Cis8QkxVUkI+VGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBwYWNrZXRzIG5lZWRlZCB0byBzdGFydCAoc2V0IHRvIDAgdG8gZGlzYWJsZSBmYXN0c3RhcnQuIFRoZSBqaXR0ZXJidWZmZXIgd2lsbCBieSBkZWZhdWx0IHN0YXJ0IGFmdGVyIHRoZSBsYXRlbmN5IGhhcyBlbGFwc2VkKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSml0dGVyQnVmZmVyOjptYXgtdHMtb2Zmc2V0LWFkanVzdG1lbnQ8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4IFRpbWVzdGFtcCBPZmZzZXQgQWRqdXN0bWVudDwvTklDSz4KKzxCTFVSQj5UaGUgbWF4aW11bSBudW1iZXIgb2YgbmFub3NlY29uZHMgcGVyIGZyYW1lIHRoYXQgdGltZSBzdGFtcCBvZmZzZXRzIG1heSBiZSBhZGp1c3RlZCAoMCA9IG5vIGxpbWl0KS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6YmFuZHdpZHRoPC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CYW5kd2lkdGg8L05JQ0s+Cis8QkxVUkI+VGhlIGJhbmR3aWR0aCBvZiB0aGUgc2Vzc2lvbiBpbiBieXRlcyBwZXIgc2Vjb25kICgwIGZvciBhdXRvLWRpc2NvdmVyKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6aW50ZXJuYWwtc2Vzc2lvbjwvTkFNRT4KKzxUWVBFPlJUUFNlc3Npb24qPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5JbnRlcm5hbCBTZXNzaW9uPC9OSUNLPgorPEJMVVJCPlRoZSBpbnRlcm5hbCBSVFBTZXNzaW9uIG9iamVjdC48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBTZXNzaW9uOjpudW0tYWN0aXZlLXNvdXJjZXM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+TnVtIEFjdGl2ZSBTb3VyY2VzPC9OSUNLPgorPEJMVVJCPlRoZSBudW1iZXIgb2YgYWN0aXZlIHNvdXJjZXMgaW4gdGhlIHNlc3Npb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cFNlc3Npb246Om51bS1zb3VyY2VzPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPk51bSBTb3VyY2VzPC9OSUNLPgorPEJMVVJCPlRoZSBudW1iZXIgb2Ygc291cmNlcyBpbiB0aGUgc2Vzc2lvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6cnRjcC1mcmFjdGlvbjwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UlRDUCBGcmFjdGlvbjwvTklDSz4KKzxCTFVSQj5UaGUgUlRDUCBiYW5kd2lkdGggb2YgdGhlIHNlc3Npb24gaW4gYnl0ZXMgcGVyIHNlY29uZCAob3IgYXMgYSByZWFsIGZyYWN0aW9uIG9mIHRoZSBSVFAgYmFuZHdpZHRoIGlmIDwgMS4wKS48L0JMVVJCPgorPERFRkFVTFQ+MC4wNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6c2RlczwvTkFNRT4KKzxUWVBFPkdzdFN0cnVjdHVyZSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TREVTPC9OSUNLPgorPEJMVVJCPlRoZSBTREVTIGl0ZW1zIG9mIHRoaXMgc2Vzc2lvbi48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBTZXNzaW9uOjpydGNwLXJyLWJhbmR3aWR0aDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UlRDUCBSUiBiYW5kd2lkdGg8L05JQ0s+Cis8QkxVUkI+VGhlIFJUQ1AgYmFuZHdpZHRoIHVzZWQgZm9yIHJlY2VpdmVycyBpbiBieXRlcyBwZXIgc2Vjb25kICgtMSA9IGRlZmF1bHQpLjwvQkxVUkI+Cis8REVGQVVMVD4tMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6cnRjcC1ycy1iYW5kd2lkdGg8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJUQ1AgUlMgYmFuZHdpZHRoPC9OSUNLPgorPEJMVVJCPlRoZSBSVENQIGJhbmR3aWR0aCB1c2VkIGZvciBzZW5kZXJzIGluIGJ5dGVzIHBlciBzZWNvbmQgKC0xID0gZGVmYXVsdCkuPC9CTFVSQj4KKzxERUZBVUxUPi0xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBTZXNzaW9uOjp1c2UtcGlwZWxpbmUtY2xvY2s8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlVzZSBwaXBlbGluZSBjbG9jazwvTklDSz4KKzxCTFVSQj5Vc2UgdGhlIHBpcGVsaW5lIHJ1bm5pbmctdGltZSB0byBzZXQgdGhlIE5UUCB0aW1lIGluIHRoZSBSVENQIFNSIG1lc3NhZ2VzIChERVBSRUNBVEVEOiBVc2UgbnRwLXRpbWUtc291cmNlIHByb3BlcnR5KS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cFNlc3Npb246OnJ0Y3AtbWluLWludGVydmFsPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1pbmltdW0gUlRDUCBpbnRlcnZhbDwvTklDSz4KKzxCTFVSQj5NaW5pbXVtIGludGVydmFsIGJldHdlZW4gUmVndWxhciBSVENQIHBhY2tldCAoaW4gbnMpLjwvQkxVUkI+Cis8REVGQVVMVD41MDAwMDAwMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBTZXNzaW9uOjpwcm9iYXRpb248L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk51bWJlciBvZiBwcm9iYXRpb25zPC9OSUNLPgorPEJMVVJCPkNvbnNlY3V0aXZlIHBhY2tldCBzZXF1ZW5jZSBudW1iZXJzIHRvIGFjY2VwdCB0aGUgc291cmNlLjwvQkxVUkI+Cis8REVGQVVMVD4yPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBTZXNzaW9uOjpzdGF0czwvTkFNRT4KKzxUWVBFPkdzdFN0cnVjdHVyZSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPlN0YXRpc3RpY3M8L05JQ0s+Cis8QkxVUkI+VmFyaW91cyBzdGF0aXN0aWNzLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cFNlc3Npb246OnJ0cC1wcm9maWxlPC9OQU1FPgorPFRZUEU+R3N0UlRQUHJvZmlsZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJUUCBQcm9maWxlPC9OSUNLPgorPEJMVVJCPlJUUCBwcm9maWxlIHRvIHVzZS48L0JMVVJCPgorPERFRkFVTFQ+R1NUX1JUUF9QUk9GSUxFX0FWUDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6bnRwLXRpbWUtc291cmNlPC9OQU1FPgorPFRZUEU+R3N0UnRwTnRwVGltZVNvdXJjZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk5UUCBUaW1lIFNvdXJjZTwvTklDSz4KKzxCTFVSQj5OVFAgdGltZSBzb3VyY2UgZm9yIFJUQ1AgcGFja2V0cy48L0JMVVJCPgorPERFRkFVTFQ+TlRQIHRpbWUgYmFzZWQgb24gcmVhbHRpbWUgY2xvY2s8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cFNlc3Npb246Om1heC1kcm9wb3V0LXRpbWU8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heCBkcm9wb3V0IHRpbWU8L05JQ0s+Cis8QkxVUkI+VGhlIG1heGltdW0gdGltZSAobWlsbGlzZWNvbmRzKSBvZiBtaXNzaW5nIHBhY2tldHMgdG9sZXJhdGVkLjwvQkxVUkI+Cis8REVGQVVMVD42MDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6bWF4LW1pc29yZGVyLXRpbWU8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heCBtaXNvcmRlciB0aW1lPC9OSUNLPgorPEJMVVJCPlRoZSBtYXhpbXVtIHRpbWUgKG1pbGxpc2Vjb25kcykgb2YgbWlzb3JkZXJlZCBwYWNrZXRzIHRvbGVyYXRlZC48L0JMVVJCPgorPERFRkFVTFQ+MjAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6cnRjcC1zeW5jLXNlbmQtdGltZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UlRDUCBTeW5jIFNlbmQgVGltZTwvTklDSz4KKzxCTFVSQj5Vc2Ugc2VuZCB0aW1lIG9yIGNhcHR1cmUgdGltZSBmb3IgUlRDUCBzeW5jIChUUlVFID0gc2VuZCB0aW1lLCBGQUxTRSA9IGNhcHR1cmUgdGltZSkuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cFJ0eFNlbmQ6Om1heC1zaXplLXRpbWU8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heCBTaXplIFRpbWU8L05JQ0s+Cis8QkxVUkI+QW1vdW50IG9mIG1zIHRvIHF1ZXVlICgwID0gdW5saW1pdGVkKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwUnR4U2VuZDo6bWF4LXNpemUtcGFja2V0czwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDMyNzY3PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXggU2l6ZSBQYWNrZXRzPC9OSUNLPgorPEJMVVJCPkFtb3VudCBvZiBwYWNrZXRzIHRvIHF1ZXVlICgwID0gdW5saW1pdGVkKS48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBSdHhTZW5kOjpudW0tcnR4LXJlcXVlc3RzPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPk51bSBSVFggUmVxdWVzdHM8L05JQ0s+Cis8QkxVUkI+TnVtYmVyIG9mIHJldHJhbnNtaXNzaW9uIGV2ZW50cyByZWNlaXZlZC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwUnR4U2VuZDo6bnVtLXJ0eC1wYWNrZXRzPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPk51bSBSVFggUGFja2V0czwvTklDSz4KKzxCTFVSQj4gTnVtYmVyIG9mIHJldHJhbnNtaXNzaW9uIHBhY2tldHMgc2VudC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwUnR4U2VuZDo6cGF5bG9hZC10eXBlLW1hcDwvTkFNRT4KKzxUWVBFPkdzdFN0cnVjdHVyZSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5QYXlsb2FkIFR5cGUgTWFwPC9OSUNLPgorPEJMVVJCPk1hcCBvZiBvcmlnaW5hbCBwYXlsb2FkIHR5cGVzIHRvIHRoZWlyIHJldHJhbnNtaXNzaW9uIHBheWxvYWQgdHlwZXMuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwUnR4U2VuZDo6c3NyYy1tYXA8L05BTUU+Cis8VFlQRT5Hc3RTdHJ1Y3R1cmUqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+dzwvRkxBR1M+Cis8TklDSz5TU1JDIE1hcDwvTklDSz4KKzxCTFVSQj5NYXAgb2YgU1NSQ3MgdG8gdGhlaXIgcmV0cmFuc21pc3Npb24gU1NSQ3MgZm9yIFNTUkMtbXVsdGlwbGV4ZWQgbW9kZSAoZGVmYXVsdCA9IHJhbmRvbSkuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwUnR4UmVjZWl2ZTo6bnVtLXJ0eC1yZXF1ZXN0czwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5OdW0gUlRYIFJlcXVlc3RzPC9OSUNLPgorPEJMVVJCPk51bWJlciBvZiByZXRyYW5zbWlzc2lvbiBldmVudHMgcmVjZWl2ZWQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cFJ0eFJlY2VpdmU6Om51bS1ydHgtcGFja2V0czwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5OdW0gUlRYIFBhY2tldHM8L05JQ0s+Cis8QkxVUkI+IE51bWJlciBvZiByZXRyYW5zbWlzc2lvbiBwYWNrZXRzIHJlY2VpdmVkLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBSdHhSZWNlaXZlOjpudW0tcnR4LWFzc29jLXBhY2tldHM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+TnVtIFJUWCBBc3NvY2lhdGVkIFBhY2tldHM8L05JQ0s+Cis8QkxVUkI+TnVtYmVyIG9mIHJldHJhbnNtaXNzaW9uIHBhY2tldHMgY29ycmVjdGx5IGFzc29jaWF0ZWQgd2l0aCByZXRyYW5zbWlzc2lvbiByZXF1ZXN0cy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwUnR4UmVjZWl2ZTo6cGF5bG9hZC10eXBlLW1hcDwvTkFNRT4KKzxUWVBFPkdzdFN0cnVjdHVyZSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5QYXlsb2FkIFR5cGUgTWFwPC9OSUNLPgorPEJMVVJCPk1hcCBvZiBvcmlnaW5hbCBwYXlsb2FkIHR5cGVzIHRvIHRoZWlyIHJldHJhbnNtaXNzaW9uIHBheWxvYWQgdHlwZXMuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNpbms6OmRldmljZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRldmljZTwvTklDSz4KKzxCTFVSQj5EZXZpY2UgbG9jYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPiIvZGV2L3ZpZGVvMSI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTaW5rOjpkZXZpY2UtZmQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+RmlsZSBkZXNjcmlwdG9yPC9OSUNLPgorPEJMVVJCPkZpbGUgZGVzY3JpcHRvciBvZiB0aGUgZGV2aWNlLjwvQkxVUkI+Cis8REVGQVVMVD4tMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNpbms6OmRldmljZS1uYW1lPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5EZXZpY2UgbmFtZTwvTklDSz4KKzxCTFVSQj5OYW1lIG9mIHRoZSBkZXZpY2UuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTaW5rOjpmbGFnczwvTkFNRT4KKzxUWVBFPkdzdFY0bDJEZXZpY2VUeXBlRmxhZ3M8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkZsYWdzPC9OSUNLPgorPEJMVVJCPkRldmljZSB0eXBlIGZsYWdzLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTaW5rOjpvdmVybGF5LWhlaWdodDwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+T3ZlcmxheSBoZWlnaHQ8L05JQ0s+Cis8QkxVUkI+VGhlIGhlaWdodCBvZiB0aGUgdmlkZW8gb3ZlcmxheTsgZGVmYXVsdCBpcyBlcXVhbCB0byBuZWdvdGlhdGVkIGltYWdlIGhlaWdodC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNpbms6Om92ZXJsYXktbGVmdDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5PdmVybGF5IGxlZnQ8L05JQ0s+Cis8QkxVUkI+VGhlIGxlZnRtb3N0ICh4KSBjb29yZGluYXRlIG9mIHRoZSB2aWRlbyBvdmVybGF5OyB0b3AgbGVmdCBjb3JuZXIgb2Ygc2NyZWVuIGlzIDAsMC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNpbms6Om92ZXJsYXktdG9wPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk92ZXJsYXkgdG9wPC9OSUNLPgorPEJMVVJCPlRoZSB0b3Btb3N0ICh5KSBjb29yZGluYXRlIG9mIHRoZSB2aWRlbyBvdmVybGF5OyB0b3AgbGVmdCBjb3JuZXIgb2Ygc2NyZWVuIGlzIDAsMC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNpbms6Om92ZXJsYXktd2lkdGg8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk92ZXJsYXkgd2lkdGg8L05JQ0s+Cis8QkxVUkI+VGhlIHdpZHRoIG9mIHRoZSB2aWRlbyBvdmVybGF5OyBkZWZhdWx0IGlzIGVxdWFsIHRvIG5lZ290aWF0ZWQgaW1hZ2Ugd2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTaW5rOjpicmlnaHRuZXNzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkJyaWdodG5lc3M8L05JQ0s+Cis8QkxVUkI+UGljdHVyZSBicmlnaHRuZXNzLCBvciBtb3JlIHByZWNpc2VseSwgdGhlIGJsYWNrIGxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWNGwyU2luazo6Y29udHJhc3Q8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q29udHJhc3Q8L05JQ0s+Cis8QkxVUkI+UGljdHVyZSBjb250cmFzdCBvciBsdW1hIGdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTaW5rOjpodWU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SHVlPC9OSUNLPgorPEJMVVJCPkh1ZSBvciBjb2xvciBiYWxhbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWNGwyU2luazo6c2F0dXJhdGlvbjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TYXR1cmF0aW9uPC9OSUNLPgorPEJMVVJCPlBpY3R1cmUgY29sb3Igc2F0dXJhdGlvbiBvciBjaHJvbWEgZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNpbms6OmNyb3AtaGVpZ2h0PC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Dcm9wIGhlaWdodDwvTklDSz4KKzxCTFVSQj5UaGUgaGVpZ2h0IG9mIHRoZSB2aWRlbyBjcm9wOyBkZWZhdWx0IGlzIGVxdWFsIHRvIG5lZ290aWF0ZWQgaW1hZ2UgaGVpZ2h0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWNGwyU2luazo6Y3JvcC1sZWZ0PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNyb3AgbGVmdDwvTklDSz4KKzxCTFVSQj5UaGUgbGVmdG1vc3QgKHgpIGNvb3JkaW5hdGUgb2YgdGhlIHZpZGVvIGNyb3A7IHRvcCBsZWZ0IGNvcm5lciBvZiBpbWFnZSBpcyAwLDAuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTaW5rOjpjcm9wLXRvcDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Dcm9wIHRvcDwvTklDSz4KKzxCTFVSQj5UaGUgdG9wbW9zdCAoeSkgY29vcmRpbmF0ZSBvZiB0aGUgdmlkZW8gY3JvcDsgdG9wIGxlZnQgY29ybmVyIG9mIGltYWdlIGlzIDAsMC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNpbms6OmNyb3Atd2lkdGg8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNyb3Agd2lkdGg8L05JQ0s+Cis8QkxVUkI+VGhlIHdpZHRoIG9mIHRoZSB2aWRlbyBjcm9wOyBkZWZhdWx0IGlzIGVxdWFsIHRvIG5lZ290aWF0ZWQgaW1hZ2Ugd2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTaW5rOjppby1tb2RlPC9OQU1FPgorPFRZUEU+R3N0VjRsMklPTW9kZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPklPIG1vZGU8L05JQ0s+Cis8QkxVUkI+SS9PIG1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPkdTVF9WNEwyX0lPX0FVVE88L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTaW5rOjpub3JtPC9OQU1FPgorPFRZUEU+VjRMMl9UVl9ub3JtczwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRWIG5vcm08L05JQ0s+Cis8QkxVUkI+dmlkZW8gc3RhbmRhcmQuPC9CTFVSQj4KKzxERUZBVUxUPm5vbmU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTaW5rOjpleHRyYS1jb250cm9sczwvTkFNRT4KKzxUWVBFPkdzdFN0cnVjdHVyZSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5FeHRyYSBDb250cm9sczwvTklDSz4KKzxCTFVSQj5FeHRyYSB2NGwyIGNvbnRyb2xzIChDSURzKSBmb3IgdGhlIGRldmljZS48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWNGwyU2luazo6Zm9yY2UtYXNwZWN0LXJhdGlvPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Gb3JjZSBhc3BlY3QgcmF0aW88L05JQ0s+Cis8QkxVUkI+V2hlbiBlbmFibGVkLCB0aGUgcGl4ZWwgYXNwZWN0IHJhdGlvIHdpbGwgYmUgZW5mb3JjZWQuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTaW5rOjpwaXhlbC1hc3BlY3QtcmF0aW88L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5QaXhlbCBBc3BlY3QgUmF0aW88L05JQ0s+Cis8QkxVUkI+T3ZlcndyaXRlIHRoZSBwaXhlbCBhc3BlY3QgcmF0aW8gb2YgdGhlIGRldmljZS48L0JMVVJCPgorPERFRkFVTFQ+IjEvMSI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNoYXBlV2lwZTo6Ym9yZGVyPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Cb3JkZXI8L05JQ0s+Cis8QkxVUkI+Qm9yZGVyIG9mIHRoZSBtYXNrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTaGFwZVdpcGU6OnBvc2l0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qb3NpdGlvbjwvTklDSz4KKzxCTFVSQj5Qb3NpdGlvbiBvZiB0aGUgbWFzay48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0Rmx2TXV4OjpzdHJlYW1hYmxlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5zdHJlYW1hYmxlPC9OSUNLPgorPEJMVVJCPklmIHNldCB0byB0cnVlLCB0aGUgb3V0cHV0IHNob3VsZCBiZSBhcyBpZiBpdCBpcyB0byBiZSBzdHJlYW1lZCBhbmQgaGVuY2Ugbm8gaW5kZXhlcyB3cml0dGVuIG9yIGR1cmF0aW9uIHdyaXR0ZW4uPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RGbHZNdXg6Om1ldGFkYXRhY3JlYXRvcjwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPm1ldGFkYXRhY3JlYXRvcjwvTklDSz4KKzxCTFVSQj5UaGUgdmFsdWUgb2YgbWV0YWRhdGFjcmVhdG9yIGluIHRoZSBtZXRhIHBhY2tldC48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0Q2Fwc1NldHRlcjo6Y2FwczwvTkFNRT4KKzxUWVBFPkdzdENhcHMqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWVyZ2UgY2FwczwvTklDSz4KKzxCTFVSQj5NZXJnZSB0aGVzZSBjYXBzICh0aGVyZWJ5IG92ZXJ3cml0aW5nKSBpbiB0aGUgc3RyZWFtLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdENhcHNTZXR0ZXI6OmpvaW48L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkpvaW48L05JQ0s+Cis8QkxVUkI+TWF0Y2ggaW5jb21pbmcgY2FwcycgbWltZS10eXBlIHRvIG1pbWUtdHlwZSBvZiBwcm92aWRlZCBjYXBzLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RDYXBzU2V0dGVyOjpyZXBsYWNlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SZXBsYWNlPC9OSUNLPgorPEJMVVJCPkRyb3AgZmllbGRzIG9mIGluY29taW5nIGNhcHMuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RPc3M0U291cmNlOjpkZXZpY2U8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EZXZpY2U8L05JQ0s+Cis8QkxVUkI+T1NTNCBkZXZpY2UgKGUuZy4gL2Rldi9vc3MvaGRhdWRpbzAvcGNtMCBvciAvZGV2L2RzcE4pIChOVUxMID0gdXNlIGZpcnN0IGF2YWlsYWJsZSBkZXZpY2UpLjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RPc3M0U291cmNlOjpkZXZpY2UtbmFtZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+RGV2aWNlIG5hbWU8L05JQ0s+Cis8QkxVUkI+SHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgc291bmQgZGV2aWNlLjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RPc3M0U2luazo6ZGV2aWNlPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RGV2aWNlPC9OSUNLPgorPEJMVVJCPk9TUzQgZGV2aWNlIChlLmcuIC9kZXYvb3NzL2hkYXVkaW8wL3BjbTAgb3IgL2Rldi9kc3BOKSAoTlVMTCA9IHVzZSBmaXJzdCBhdmFpbGFibGUgcGxheWJhY2sgZGV2aWNlKS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0T3NzNFNpbms6OmRldmljZS1uYW1lPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5EZXZpY2UgbmFtZTwvTklDSz4KKzxCTFVSQj5IdW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBzb3VuZCBkZXZpY2UuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE9zczRTaW5rOjptdXRlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NdXRlPC9OSUNLPgorPEJMVVJCPk11dGUgc3RhdGUgb2YgdGhpcyBzdHJlYW0uPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RPc3M0U2luazo6dm9sdW1lPC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlZvbHVtZTwvTklDSz4KKzxCTFVSQj5MaW5lYXIgdm9sdW1lIG9mIHRoaXMgc3RyZWFtLCAxLjA9MTAwJS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwVGhlb3JhUGF5Ojpjb25maWctaW50ZXJ2YWw8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSAzNjAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Db25maWcgU2VuZCBJbnRlcnZhbDwvTklDSz4KKzxCTFVSQj5TZW5kIENvbmZpZyBJbnNlcnRpb24gSW50ZXJ2YWwgaW4gc2Vjb25kcyAoY29uZmlndXJhdGlvbiBoZWFkZXJzIHdpbGwgYmUgbXVsdGlwbGV4ZWQgaW4gdGhlIGRhdGEgc3RyZWFtIHdoZW4gZGV0ZWN0ZWQuKSAoMCA9IGRpc2FibGVkKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VmlkZW9NaXhlcjI6OmJhY2tncm91bmQ8L05BTUU+Cis8VFlQRT5Hc3RWaWRlb01peGVyMkJhY2tncm91bmQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CYWNrZ3JvdW5kPC9OSUNLPgorPEJMVVJCPkJhY2tncm91bmQgdHlwZS48L0JMVVJCPgorPERFRkFVTFQ+Q2hlY2tlciBwYXR0ZXJuPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RKYWNrQXVkaW9TcmM6OmNsaWVudDwvTkFNRT4KKzxUWVBFPkphY2tDbGllbnQqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SmFja0NsaWVudDwvTklDSz4KKzxCTFVSQj5IYW5kbGUgZm9yIGphY2sgY2xpZW50LjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEphY2tBdWRpb1NyYzo6Y29ubmVjdDwvTkFNRT4KKzxUWVBFPkdzdEphY2tDb25uZWN0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q29ubmVjdDwvTklDSz4KKzxCTFVSQj5TcGVjaWZ5IGhvdyB0aGUgaW5wdXQgcG9ydHMgd2lsbCBiZSBjb25uZWN0ZWQuPC9CTFVSQj4KKzxERUZBVUxUPkF1dG9tYXRpY2FsbHkgY29ubmVjdCBwb3J0cyB0byBwaHlzaWNhbCBwb3J0czwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SmFja0F1ZGlvU3JjOjpzZXJ2ZXI8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TZXJ2ZXI8L05JQ0s+Cis8QkxVUkI+VGhlIEphY2sgc2VydmVyIHRvIGNvbm5lY3QgdG8gKE5VTEwgPSBkZWZhdWx0KS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SmFja0F1ZGlvU3JjOjpjbGllbnQtbmFtZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNsaWVudCBuYW1lPC9OSUNLPgorPEJMVVJCPlRoZSBjbGllbnQgbmFtZSBvZiB0aGUgSmFjayBpbnN0YW5jZSAoTlVMTCA9IGRlZmF1bHQpLjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RKYWNrQXVkaW9TcmM6OnRyYW5zcG9ydDwvTkFNRT4KKzxUWVBFPkdzdEphY2tUcmFuc3BvcnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UcmFuc3BvcnQgbW9kZTwvTklDSz4KKzxCTFVSQj5KYWNrIHRyYW5zcG9ydCBiZWhhdmlvdXIgb2YgdGhlIGNsaWVudC48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RKYWNrQXVkaW9TcmM6OnBvcnQtcGF0dGVybjwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPnBvcnQgcGF0dGVybjwvTklDSz4KKzxCTFVSQj5BIHBhdHRlcm4gdG8gc2VsZWN0IHdoaWNoIHBvcnRzIHRvIGNvbm5lY3QgdG8gKE5VTEwgPSBmaXJzdCBwaHlzaWNhbCBwb3J0cykuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEphY2tBdWRpb1Npbms6OmNsaWVudDwvTkFNRT4KKzxUWVBFPkphY2tDbGllbnQqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SmFja0NsaWVudDwvTklDSz4KKzxCTFVSQj5IYW5kbGUgZm9yIGphY2sgY2xpZW50LjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEphY2tBdWRpb1Npbms6OmNvbm5lY3Q8L05BTUU+Cis8VFlQRT5Hc3RKYWNrQ29ubmVjdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNvbm5lY3Q8L05JQ0s+Cis8QkxVUkI+U3BlY2lmeSBob3cgdGhlIG91dHB1dCBwb3J0cyB3aWxsIGJlIGNvbm5lY3RlZC48L0JMVVJCPgorPERFRkFVTFQ+QXV0b21hdGljYWxseSBjb25uZWN0IHBvcnRzIHRvIHBoeXNpY2FsIHBvcnRzPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RKYWNrQXVkaW9TaW5rOjpzZXJ2ZXI8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TZXJ2ZXI8L05JQ0s+Cis8QkxVUkI+VGhlIEphY2sgc2VydmVyIHRvIGNvbm5lY3QgdG8gKE5VTEwgPSBkZWZhdWx0KS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SmFja0F1ZGlvU2luazo6Y2xpZW50LW5hbWU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5DbGllbnQgbmFtZTwvTklDSz4KKzxCTFVSQj5UaGUgY2xpZW50IG5hbWUgb2YgdGhlIEphY2sgaW5zdGFuY2UgKE5VTEwgPSBkZWZhdWx0KS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SmFja0F1ZGlvU2luazo6dHJhbnNwb3J0PC9OQU1FPgorPFRZUEU+R3N0SmFja1RyYW5zcG9ydDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRyYW5zcG9ydCBtb2RlPC9OSUNLPgorPEJMVVJCPkphY2sgdHJhbnNwb3J0IGJlaGF2aW91ciBvZiB0aGUgY2xpZW50LjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEphY2tBdWRpb1Npbms6OnBvcnQtcGF0dGVybjwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPnBvcnQgcGF0dGVybjwvTklDSz4KKzxCTFVSQj5BIHBhdHRlcm4gdG8gc2VsZWN0IHdoaWNoIHBvcnRzIHRvIGNvbm5lY3QgdG8gKE5VTEwgPSBmaXJzdCBwaHlzaWNhbCBwb3J0cykuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEZsYWNQYXJzZTo6Y2hlY2stZnJhbWUtY2hlY2tzdW1zPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5DaGVjayBGcmFtZSBDaGVja3N1bXM8L05JQ0s+Cis8QkxVUkI+Q2hlY2sgdGhlIG92ZXJhbGwgY2hlY2tzdW1zIG9mIGV2ZXJ5IGZyYW1lLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlJhZGlvOjpkZXZpY2U8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SYWRpbyBkZXZpY2UgbG9jYXRpb248L05JQ0s+Cis8QkxVUkI+VmlkZW80TGludXgyIHJhZGlvIGRldmljZSBsb2NhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+Ii9kZXYvcmFkaW8wIjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlJhZGlvOjpmcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPls4NzUwMDAwMCwxMDgwMDAwMDBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TdGF0aW9uIGZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5TdGF0aW9uIGZyZXF1ZW5jeSBpbiBIei48L0JMVVJCPgorPERFRkFVTFQ+MTAwMDAwMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RRVE11eDo6ZHRzLW1ldGhvZDwvTkFNRT4KKzxUWVBFPkdzdFFUTXV4RHRzTWV0aG9kczwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5kdHMtbWV0aG9kPC9OSUNLPgorPEJMVVJCPk1ldGhvZCB0byBkZXRlcm1pbmUgRFRTIHRpbWUgKERFUFJFQ0FURUQpLjwvQkxVUkI+Cis8REVGQVVMVD5yZW9yZGVyPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RRVE11eDo6ZmFzdHN0YXJ0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Gb3JtYXQgZmlsZSB0byBmYXN0c3RhcnQ8L05JQ0s+Cis8QkxVUkI+SWYgdGhlIGZpbGUgc2hvdWxkIGJlIGZvcm1hdHRlZCBmb3IgZmFzdHN0YXJ0IChoZWFkZXJzIGZpcnN0KS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFFUTXV4OjpmYXN0c3RhcnQtZmlsZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWxlIHRvIHVzZSBmb3Igc3RvcmluZyBidWZmZXJzPC9OSUNLPgorPEJMVVJCPkZpbGUgdGhhdCB3aWxsIGJlIHVzZWQgdGVtcG9yYXJpbHkgdG8gc3RvcmUgZGF0YSBmcm9tIHRoZSBzdHJlYW0gd2hlbiBjcmVhdGluZyBhIGZhc3RzdGFydCBmaWxlLiBJZiBudWxsIGEgZmlsZXBhdGggd2lsbCBiZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFFUTXV4OjpmcmFnbWVudC1kdXJhdGlvbjwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyYWdtZW50IGR1cmF0aW9uPC9OSUNLPgorPEJMVVJCPkZyYWdtZW50IGR1cmF0aW9ucyBpbiBtcyAocHJvZHVjZSBhIGZyYWdtZW50ZWQgZmlsZSBpZiA+IDApLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RRVE11eDo6bW9vdi1yZWNvdmVyeS1maWxlPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbGUgdG8gc3RvcmUgZGF0YSBmb3IgcG9zdGVyaW9yIG1vb3YgYXRvbSByZWNvdmVyeTwvTklDSz4KKzxCTFVSQj5GaWxlIHRvIGJlIHVzZWQgdG8gc3RvcmUgZGF0YSBmb3IgbW9vdiBhdG9tIG1ha2luZyBtb3ZpZSBmaWxlIHJlY292ZXJ5IHBvc3NpYmxlIGluIGNhc2Ugb2YgYSBjcmFzaCBkdXJpbmcgbXV4aW5nLiBOdWxsIGZvciBkaXNhYmxlZC4gKEV4cGVyaW1lbnRhbCkuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFFUTXV4Ojptb3ZpZS10aW1lc2NhbGU8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Nb3ZpZSB0aW1lc2NhbGU8L05JQ0s+Cis8QkxVUkI+VGltZXNjYWxlIHRvIHVzZSBpbiB0aGUgbW92aWUgKHVuaXRzIHBlciBzZWNvbmQsIDAgPT0gZGVmYXVsdCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFFUTXV4OjpwcmVzZW50YXRpb24tdGltZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkluY2x1ZGUgcHJlc2VudGF0aW9uLXRpbWUgaW5mbzwvTklDSz4KKzxCTFVSQj5DYWxjdWxhdGUgYW5kIGluY2x1ZGUgcHJlc2VudGF0aW9uL2NvbXBvc2l0aW9uIHRpbWUgKGluIGFkZGl0aW9uIHRvIGRlY29kaW5nIHRpbWUpLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RRVE11eDo6c3RyZWFtYWJsZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN0cmVhbWFibGU8L05JQ0s+Cis8QkxVUkI+SWYgc2V0IHRvIHRydWUsIHRoZSBvdXRwdXQgc2hvdWxkIGJlIGFzIGlmIGl0IGlzIHRvIGJlIHN0cmVhbWVkIGFuZCBoZW5jZSBubyBpbmRleGVzIHdyaXR0ZW4gb3IgZHVyYXRpb24gd3JpdHRlbi4gKERFUFJFQ0FURUQsIG9ubHkgdmFsaWQgZm9yIGZyYWdtZW50ZWQgTVA0KS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFFUTXV4Ojp0cmFrLXRpbWVzY2FsZTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRyYWNrIHRpbWVzY2FsZTwvTklDSz4KKzxCTFVSQj5UaW1lc2NhbGUgdG8gdXNlIGZvciB0aGUgdHJhY2tzICh1bml0cyBwZXIgc2Vjb25kLCAwIGlzIGF1dG9tYXRpYykuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFFUTXV4OjpyZXNlcnZlZC1ieXRlcy1wZXItc2VjPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMTAwMDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNlcnZlZCBNT09WIGJ5dGVzIHBlciBzZWNvbmQsIHBlciB0cmFjazwvTklDSz4KKzxCTFVSQj5NdWx0aXBsaWVyIGZvciBjb252ZXJ0aW5nIHJlc2VydmVkLW1heC1kdXJhdGlvbiBpbnRvIGJ5dGVzIG9mIGhlYWRlciB0byByZXNlcnZlLCBwZXIgc2Vjb25kLCBwZXIgdHJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjU1MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UVRNdXg6OnJlc2VydmVkLWR1cmF0aW9uLXJlbWFpbmluZzwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPlJlcG9ydCB0aGUgYXBwcm94aW1hdGUgYW1vdW50IG9mIHJlbWFpbmluZyByZWNvcmRpbmcgc3BhY2UgKG5zKTwvTklDSz4KKzxCTFVSQj5SZXBvcnRzIHRoZSBhcHByb3hpbWF0ZSBhbW91bnQgb2YgcmVtYWluaW5nIG1vb3YgaGVhZGVyIHNwYWNlIHJlc2VydmVkIHVzaW5nIHJlc2VydmVkLW1heC1kdXJhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UVRNdXg6OnJlc2VydmVkLW1heC1kdXJhdGlvbjwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SZXNlcnZlZCBtYXhpbXVtIGZpbGUgZHVyYXRpb24gKG5zKTwvTklDSz4KKzxCTFVSQj5XaGVuIHNldCB0byBhIHZhbHVlID4gMCwgcmVzZXJ2ZXMgc3BhY2UgZm9yIGluZGV4IHRhYmxlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLjwvQkxVUkI+Cis8REVGQVVMVD4xODQ0Njc0NDA3MzcwOTU1MTYxNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UVRNdXg6OnJlc2VydmVkLW1vb3YtdXBkYXRlLXBlcmlvZDwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5JbnRlcnZhbCBhdCB3aGljaCB0byB1cGRhdGUgaW5kZXggdGFibGVzIChucyk8L05JQ0s+Cis8QkxVUkI+V2hlbiB1c2VkIHdpdGggcmVzZXJ2ZWQtbWF4LWR1cmF0aW9uLCBwZXJpb2RpY2FsbHkgdXBkYXRlcyB0aGUgaW5kZXggdGFibGVzIHdpdGggaW5mb3JtYXRpb24gbXV4ZWQgc28gZmFyLjwvQkxVUkI+Cis8REVGQVVMVD4xODQ0Njc0NDA3MzcwOTU1MTYxNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UVRNdXg6OmludGVybGVhdmUtYnl0ZXM8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SW50ZXJsZWF2ZSAoYnl0ZXMpPC9OSUNLPgorPEJMVVJCPkludGVybGVhdmUgYmV0d2VlbiBzdHJlYW1zIGluIGJ5dGVzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RRVE11eDo6aW50ZXJsZWF2ZS10aW1lPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludGVybGVhdmUgKHRpbWUpPC9OSUNLPgorPEJMVVJCPkludGVybGVhdmUgYmV0d2VlbiBzdHJlYW1zIGluIG5hbm9zZWNvbmRzLjwvQkxVUkI+Cis8REVGQVVMVD4yNTAwMDAwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFFUTXV4OjptYXgtcmF3LWF1ZGlvLWRyaWZ0PC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heCBSYXcgQXVkaW8gRHJpZnQ8L05JQ0s+Cis8QkxVUkI+TWF4aW11bSBhbGxvd2VkIGRyaWZ0IG9mIHJhdyBhdWRpbyBzYW1wbGVzIHZzLiB0aW1lc3RhbXBzIGluIG5hbm9zZWNvbmRzLjwvQkxVUkI+Cis8REVGQVVMVD40MDAwMDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UVRNdXg6OnJlc2VydmVkLXByZWZpbGw8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNlcnZlZCBQcmVmaWxsIFNhbXBsZXMgVGFibGU8L05JQ0s+Cis8QkxVUkI+UHJlZmlsbCBzYW1wbGVzIHRhYmxlIG9mIHJlc2VydmVkIGR1cmF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UVRNb292UmVjb3Zlcjo6YnJva2VuLWlucHV0PC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UGF0aCB0byBicm9rZW4gaW5wdXQgZmlsZTwvTklDSz4KKzxCTFVSQj5QYXRoIHRvIGJyb2tlbiBpbnB1dCBmaWxlLiAoSWYgcXRtdXggd2FzIG9uIGZhc3RzdGFydCBtb2RlLCB0aGlzIGZpbGUgaXMgdGhlIGZhc3RzdGFydCBmaWxlKS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UVRNb292UmVjb3Zlcjo6ZmFzdHN0YXJ0LW1vZGU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPklmIHRoZSBicm9rZW4gaW5wdXQgaXMgZnJvbSBmYXN0c3RhcnQgbW9kZTwvTklDSz4KKzxCTFVSQj5JZiB0aGUgYnJva2VuIGlucHV0IGlzIGZyb20gZmFzdHN0YXJ0IG1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RRVE1vb3ZSZWNvdmVyOjpmaXhlZC1vdXRwdXQ8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5QYXRoIHRvIHdyaXRlIHRoZSBmaXhlZCBmaWxlPC9OSUNLPgorPEJMVVJCPlBhdGggdG8gd3JpdGUgdGhlIGZpeGVkIGZpbGUgdG8gKHVzZWQgYXMgb3V0cHV0KS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UVRNb292UmVjb3Zlcjo6cmVjb3ZlcnktaW5wdXQ8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5QYXRoIHRvIHJlY292ZXJ5IGZpbGU8L05JQ0s+Cis8QkxVUkI+UGF0aCB0byByZWNvdmVyeSBmaWxlICh1c2VkIGFzIGlucHV0KS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TVA0TXV4OjpkdHMtbWV0aG9kPC9OQU1FPgorPFRZUEU+R3N0UVRNdXhEdHNNZXRob2RzPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmR0cy1tZXRob2Q8L05JQ0s+Cis8QkxVUkI+TWV0aG9kIHRvIGRldGVybWluZSBEVFMgdGltZSAoREVQUkVDQVRFRCkuPC9CTFVSQj4KKzxERUZBVUxUPnJlb3JkZXI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1QNE11eDo6ZmFzdHN0YXJ0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Gb3JtYXQgZmlsZSB0byBmYXN0c3RhcnQ8L05JQ0s+Cis8QkxVUkI+SWYgdGhlIGZpbGUgc2hvdWxkIGJlIGZvcm1hdHRlZCBmb3IgZmFzdHN0YXJ0IChoZWFkZXJzIGZpcnN0KS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1QNE11eDo6ZmFzdHN0YXJ0LWZpbGU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsZSB0byB1c2UgZm9yIHN0b3JpbmcgYnVmZmVyczwvTklDSz4KKzxCTFVSQj5GaWxlIHRoYXQgd2lsbCBiZSB1c2VkIHRlbXBvcmFyaWx5IHRvIHN0b3JlIGRhdGEgZnJvbSB0aGUgc3RyZWFtIHdoZW4gY3JlYXRpbmcgYSBmYXN0c3RhcnQgZmlsZS4gSWYgbnVsbCBhIGZpbGVwYXRoIHdpbGwgYmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNUDRNdXg6OmZyYWdtZW50LWR1cmF0aW9uPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJhZ21lbnQgZHVyYXRpb248L05JQ0s+Cis8QkxVUkI+RnJhZ21lbnQgZHVyYXRpb25zIGluIG1zIChwcm9kdWNlIGEgZnJhZ21lbnRlZCBmaWxlIGlmID4gMCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1QNE11eDo6bW9vdi1yZWNvdmVyeS1maWxlPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbGUgdG8gc3RvcmUgZGF0YSBmb3IgcG9zdGVyaW9yIG1vb3YgYXRvbSByZWNvdmVyeTwvTklDSz4KKzxCTFVSQj5GaWxlIHRvIGJlIHVzZWQgdG8gc3RvcmUgZGF0YSBmb3IgbW9vdiBhdG9tIG1ha2luZyBtb3ZpZSBmaWxlIHJlY292ZXJ5IHBvc3NpYmxlIGluIGNhc2Ugb2YgYSBjcmFzaCBkdXJpbmcgbXV4aW5nLiBOdWxsIGZvciBkaXNhYmxlZC4gKEV4cGVyaW1lbnRhbCkuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1QNE11eDo6bW92aWUtdGltZXNjYWxlPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW92aWUgdGltZXNjYWxlPC9OSUNLPgorPEJMVVJCPlRpbWVzY2FsZSB0byB1c2UgaW4gdGhlIG1vdmllICh1bml0cyBwZXIgc2Vjb25kLCAwID09IGRlZmF1bHQpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNUDRNdXg6OnByZXNlbnRhdGlvbi10aW1lPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5jbHVkZSBwcmVzZW50YXRpb24tdGltZSBpbmZvPC9OSUNLPgorPEJMVVJCPkNhbGN1bGF0ZSBhbmQgaW5jbHVkZSBwcmVzZW50YXRpb24vY29tcG9zaXRpb24gdGltZSAoaW4gYWRkaXRpb24gdG8gZGVjb2RpbmcgdGltZSkuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1QNE11eDo6c3RyZWFtYWJsZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN0cmVhbWFibGU8L05JQ0s+Cis8QkxVUkI+SWYgc2V0IHRvIHRydWUsIHRoZSBvdXRwdXQgc2hvdWxkIGJlIGFzIGlmIGl0IGlzIHRvIGJlIHN0cmVhbWVkIGFuZCBoZW5jZSBubyBpbmRleGVzIHdyaXR0ZW4gb3IgZHVyYXRpb24gd3JpdHRlbi4gKERFUFJFQ0FURUQsIG9ubHkgdmFsaWQgZm9yIGZyYWdtZW50ZWQgTVA0KS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1QNE11eDo6dHJhay10aW1lc2NhbGU8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UcmFjayB0aW1lc2NhbGU8L05JQ0s+Cis8QkxVUkI+VGltZXNjYWxlIHRvIHVzZSBmb3IgdGhlIHRyYWNrcyAodW5pdHMgcGVyIHNlY29uZCwgMCBpcyBhdXRvbWF0aWMpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNUDRNdXg6OnJlc2VydmVkLWJ5dGVzLXBlci1zZWM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSAxMDAwMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc2VydmVkIE1PT1YgYnl0ZXMgcGVyIHNlY29uZCwgcGVyIHRyYWNrPC9OSUNLPgorPEJMVVJCPk11bHRpcGxpZXIgZm9yIGNvbnZlcnRpbmcgcmVzZXJ2ZWQtbWF4LWR1cmF0aW9uIGludG8gYnl0ZXMgb2YgaGVhZGVyIHRvIHJlc2VydmUsIHBlciBzZWNvbmQsIHBlciB0cmFjay48L0JMVVJCPgorPERFRkFVTFQ+NTUwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNUDRNdXg6OnJlc2VydmVkLWR1cmF0aW9uLXJlbWFpbmluZzwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPlJlcG9ydCB0aGUgYXBwcm94aW1hdGUgYW1vdW50IG9mIHJlbWFpbmluZyByZWNvcmRpbmcgc3BhY2UgKG5zKTwvTklDSz4KKzxCTFVSQj5SZXBvcnRzIHRoZSBhcHByb3hpbWF0ZSBhbW91bnQgb2YgcmVtYWluaW5nIG1vb3YgaGVhZGVyIHNwYWNlIHJlc2VydmVkIHVzaW5nIHJlc2VydmVkLW1heC1kdXJhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TVA0TXV4OjpyZXNlcnZlZC1tYXgtZHVyYXRpb248L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UmVzZXJ2ZWQgbWF4aW11bSBmaWxlIGR1cmF0aW9uIChucyk8L05JQ0s+Cis8QkxVUkI+V2hlbiBzZXQgdG8gYSB2YWx1ZSA+IDAsIHJlc2VydmVzIHNwYWNlIGZvciBpbmRleCB0YWJsZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS48L0JMVVJCPgorPERFRkFVTFQ+MTg0NDY3NDQwNzM3MDk1NTE2MTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1QNE11eDo6cmVzZXJ2ZWQtbW9vdi11cGRhdGUtcGVyaW9kPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludGVydmFsIGF0IHdoaWNoIHRvIHVwZGF0ZSBpbmRleCB0YWJsZXMgKG5zKTwvTklDSz4KKzxCTFVSQj5XaGVuIHVzZWQgd2l0aCByZXNlcnZlZC1tYXgtZHVyYXRpb24sIHBlcmlvZGljYWxseSB1cGRhdGVzIHRoZSBpbmRleCB0YWJsZXMgd2l0aCBpbmZvcm1hdGlvbiBtdXhlZCBzbyBmYXIuPC9CTFVSQj4KKzxERUZBVUxUPjE4NDQ2NzQ0MDczNzA5NTUxNjE1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNUDRNdXg6OmludGVybGVhdmUtYnl0ZXM8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SW50ZXJsZWF2ZSAoYnl0ZXMpPC9OSUNLPgorPEJMVVJCPkludGVybGVhdmUgYmV0d2VlbiBzdHJlYW1zIGluIGJ5dGVzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNUDRNdXg6OmludGVybGVhdmUtdGltZTwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5JbnRlcmxlYXZlICh0aW1lKTwvTklDSz4KKzxCTFVSQj5JbnRlcmxlYXZlIGJldHdlZW4gc3RyZWFtcyBpbiBuYW5vc2Vjb25kcy48L0JMVVJCPgorPERFRkFVTFQ+MjUwMDAwMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNUDRNdXg6Om1heC1yYXctYXVkaW8tZHJpZnQ8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4IFJhdyBBdWRpbyBEcmlmdDwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIGFsbG93ZWQgZHJpZnQgb2YgcmF3IGF1ZGlvIHNhbXBsZXMgdnMuIHRpbWVzdGFtcHMgaW4gbmFub3NlY29uZHMuPC9CTFVSQj4KKzxERUZBVUxUPjQwMDAwMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNUDRNdXg6OnJlc2VydmVkLXByZWZpbGw8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNlcnZlZCBQcmVmaWxsIFNhbXBsZXMgVGFibGU8L05JQ0s+Cis8QkxVUkI+UHJlZmlsbCBzYW1wbGVzIHRhYmxlIG9mIHJlc2VydmVkIGR1cmF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TUoyTXV4OjpkdHMtbWV0aG9kPC9OQU1FPgorPFRZUEU+R3N0UVRNdXhEdHNNZXRob2RzPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmR0cy1tZXRob2Q8L05JQ0s+Cis8QkxVUkI+TWV0aG9kIHRvIGRldGVybWluZSBEVFMgdGltZSAoREVQUkVDQVRFRCkuPC9CTFVSQj4KKzxERUZBVUxUPnJlb3JkZXI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1KMk11eDo6ZmFzdHN0YXJ0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Gb3JtYXQgZmlsZSB0byBmYXN0c3RhcnQ8L05JQ0s+Cis8QkxVUkI+SWYgdGhlIGZpbGUgc2hvdWxkIGJlIGZvcm1hdHRlZCBmb3IgZmFzdHN0YXJ0IChoZWFkZXJzIGZpcnN0KS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1KMk11eDo6ZmFzdHN0YXJ0LWZpbGU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsZSB0byB1c2UgZm9yIHN0b3JpbmcgYnVmZmVyczwvTklDSz4KKzxCTFVSQj5GaWxlIHRoYXQgd2lsbCBiZSB1c2VkIHRlbXBvcmFyaWx5IHRvIHN0b3JlIGRhdGEgZnJvbSB0aGUgc3RyZWFtIHdoZW4gY3JlYXRpbmcgYSBmYXN0c3RhcnQgZmlsZS4gSWYgbnVsbCBhIGZpbGVwYXRoIHdpbGwgYmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNSjJNdXg6OmZyYWdtZW50LWR1cmF0aW9uPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJhZ21lbnQgZHVyYXRpb248L05JQ0s+Cis8QkxVUkI+RnJhZ21lbnQgZHVyYXRpb25zIGluIG1zIChwcm9kdWNlIGEgZnJhZ21lbnRlZCBmaWxlIGlmID4gMCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1KMk11eDo6bW9vdi1yZWNvdmVyeS1maWxlPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbGUgdG8gc3RvcmUgZGF0YSBmb3IgcG9zdGVyaW9yIG1vb3YgYXRvbSByZWNvdmVyeTwvTklDSz4KKzxCTFVSQj5GaWxlIHRvIGJlIHVzZWQgdG8gc3RvcmUgZGF0YSBmb3IgbW9vdiBhdG9tIG1ha2luZyBtb3ZpZSBmaWxlIHJlY292ZXJ5IHBvc3NpYmxlIGluIGNhc2Ugb2YgYSBjcmFzaCBkdXJpbmcgbXV4aW5nLiBOdWxsIGZvciBkaXNhYmxlZC4gKEV4cGVyaW1lbnRhbCkuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1KMk11eDo6bW92aWUtdGltZXNjYWxlPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW92aWUgdGltZXNjYWxlPC9OSUNLPgorPEJMVVJCPlRpbWVzY2FsZSB0byB1c2UgaW4gdGhlIG1vdmllICh1bml0cyBwZXIgc2Vjb25kLCAwID09IGRlZmF1bHQpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNSjJNdXg6OnByZXNlbnRhdGlvbi10aW1lPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5jbHVkZSBwcmVzZW50YXRpb24tdGltZSBpbmZvPC9OSUNLPgorPEJMVVJCPkNhbGN1bGF0ZSBhbmQgaW5jbHVkZSBwcmVzZW50YXRpb24vY29tcG9zaXRpb24gdGltZSAoaW4gYWRkaXRpb24gdG8gZGVjb2RpbmcgdGltZSkuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1KMk11eDo6c3RyZWFtYWJsZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN0cmVhbWFibGU8L05JQ0s+Cis8QkxVUkI+SWYgc2V0IHRvIHRydWUsIHRoZSBvdXRwdXQgc2hvdWxkIGJlIGFzIGlmIGl0IGlzIHRvIGJlIHN0cmVhbWVkIGFuZCBoZW5jZSBubyBpbmRleGVzIHdyaXR0ZW4gb3IgZHVyYXRpb24gd3JpdHRlbi4gKERFUFJFQ0FURUQsIG9ubHkgdmFsaWQgZm9yIGZyYWdtZW50ZWQgTVA0KS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1KMk11eDo6dHJhay10aW1lc2NhbGU8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UcmFjayB0aW1lc2NhbGU8L05JQ0s+Cis8QkxVUkI+VGltZXNjYWxlIHRvIHVzZSBmb3IgdGhlIHRyYWNrcyAodW5pdHMgcGVyIHNlY29uZCwgMCBpcyBhdXRvbWF0aWMpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNSjJNdXg6OnJlc2VydmVkLWJ5dGVzLXBlci1zZWM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSAxMDAwMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc2VydmVkIE1PT1YgYnl0ZXMgcGVyIHNlY29uZCwgcGVyIHRyYWNrPC9OSUNLPgorPEJMVVJCPk11bHRpcGxpZXIgZm9yIGNvbnZlcnRpbmcgcmVzZXJ2ZWQtbWF4LWR1cmF0aW9uIGludG8gYnl0ZXMgb2YgaGVhZGVyIHRvIHJlc2VydmUsIHBlciBzZWNvbmQsIHBlciB0cmFjay48L0JMVVJCPgorPERFRkFVTFQ+NTUwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNSjJNdXg6OnJlc2VydmVkLWR1cmF0aW9uLXJlbWFpbmluZzwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPlJlcG9ydCB0aGUgYXBwcm94aW1hdGUgYW1vdW50IG9mIHJlbWFpbmluZyByZWNvcmRpbmcgc3BhY2UgKG5zKTwvTklDSz4KKzxCTFVSQj5SZXBvcnRzIHRoZSBhcHByb3hpbWF0ZSBhbW91bnQgb2YgcmVtYWluaW5nIG1vb3YgaGVhZGVyIHNwYWNlIHJlc2VydmVkIHVzaW5nIHJlc2VydmVkLW1heC1kdXJhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TUoyTXV4OjpyZXNlcnZlZC1tYXgtZHVyYXRpb248L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UmVzZXJ2ZWQgbWF4aW11bSBmaWxlIGR1cmF0aW9uIChucyk8L05JQ0s+Cis8QkxVUkI+V2hlbiBzZXQgdG8gYSB2YWx1ZSA+IDAsIHJlc2VydmVzIHNwYWNlIGZvciBpbmRleCB0YWJsZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS48L0JMVVJCPgorPERFRkFVTFQ+MTg0NDY3NDQwNzM3MDk1NTE2MTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1KMk11eDo6cmVzZXJ2ZWQtbW9vdi11cGRhdGUtcGVyaW9kPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludGVydmFsIGF0IHdoaWNoIHRvIHVwZGF0ZSBpbmRleCB0YWJsZXMgKG5zKTwvTklDSz4KKzxCTFVSQj5XaGVuIHVzZWQgd2l0aCByZXNlcnZlZC1tYXgtZHVyYXRpb24sIHBlcmlvZGljYWxseSB1cGRhdGVzIHRoZSBpbmRleCB0YWJsZXMgd2l0aCBpbmZvcm1hdGlvbiBtdXhlZCBzbyBmYXIuPC9CTFVSQj4KKzxERUZBVUxUPjE4NDQ2NzQ0MDczNzA5NTUxNjE1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNSjJNdXg6OmludGVybGVhdmUtYnl0ZXM8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SW50ZXJsZWF2ZSAoYnl0ZXMpPC9OSUNLPgorPEJMVVJCPkludGVybGVhdmUgYmV0d2VlbiBzdHJlYW1zIGluIGJ5dGVzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNSjJNdXg6OmludGVybGVhdmUtdGltZTwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5JbnRlcmxlYXZlICh0aW1lKTwvTklDSz4KKzxCTFVSQj5JbnRlcmxlYXZlIGJldHdlZW4gc3RyZWFtcyBpbiBuYW5vc2Vjb25kcy48L0JMVVJCPgorPERFRkFVTFQ+MjUwMDAwMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNSjJNdXg6Om1heC1yYXctYXVkaW8tZHJpZnQ8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4IFJhdyBBdWRpbyBEcmlmdDwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIGFsbG93ZWQgZHJpZnQgb2YgcmF3IGF1ZGlvIHNhbXBsZXMgdnMuIHRpbWVzdGFtcHMgaW4gbmFub3NlY29uZHMuPC9CTFVSQj4KKzxERUZBVUxUPjQwMDAwMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNSjJNdXg6OnJlc2VydmVkLXByZWZpbGw8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNlcnZlZCBQcmVmaWxsIFNhbXBsZXMgVGFibGU8L05JQ0s+Cis8QkxVUkI+UHJlZmlsbCBzYW1wbGVzIHRhYmxlIG9mIHJlc2VydmVkIGR1cmF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SVNNTE11eDo6ZHRzLW1ldGhvZDwvTkFNRT4KKzxUWVBFPkdzdFFUTXV4RHRzTWV0aG9kczwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5kdHMtbWV0aG9kPC9OSUNLPgorPEJMVVJCPk1ldGhvZCB0byBkZXRlcm1pbmUgRFRTIHRpbWUgKERFUFJFQ0FURUQpLjwvQkxVUkI+Cis8REVGQVVMVD5yZW9yZGVyPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJU01MTXV4OjpmYXN0c3RhcnQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZvcm1hdCBmaWxlIHRvIGZhc3RzdGFydDwvTklDSz4KKzxCTFVSQj5JZiB0aGUgZmlsZSBzaG91bGQgYmUgZm9ybWF0dGVkIGZvciBmYXN0c3RhcnQgKGhlYWRlcnMgZmlyc3QpLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SVNNTE11eDo6ZmFzdHN0YXJ0LWZpbGU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsZSB0byB1c2UgZm9yIHN0b3JpbmcgYnVmZmVyczwvTklDSz4KKzxCTFVSQj5GaWxlIHRoYXQgd2lsbCBiZSB1c2VkIHRlbXBvcmFyaWx5IHRvIHN0b3JlIGRhdGEgZnJvbSB0aGUgc3RyZWFtIHdoZW4gY3JlYXRpbmcgYSBmYXN0c3RhcnQgZmlsZS4gSWYgbnVsbCBhIGZpbGVwYXRoIHdpbGwgYmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJU01MTXV4OjpmcmFnbWVudC1kdXJhdGlvbjwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyYWdtZW50IGR1cmF0aW9uPC9OSUNLPgorPEJMVVJCPkZyYWdtZW50IGR1cmF0aW9ucyBpbiBtcyAocHJvZHVjZSBhIGZyYWdtZW50ZWQgZmlsZSBpZiA+IDApLjwvQkxVUkI+Cis8REVGQVVMVD4yMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJU01MTXV4Ojptb292LXJlY292ZXJ5LWZpbGU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsZSB0byBzdG9yZSBkYXRhIGZvciBwb3N0ZXJpb3IgbW9vdiBhdG9tIHJlY292ZXJ5PC9OSUNLPgorPEJMVVJCPkZpbGUgdG8gYmUgdXNlZCB0byBzdG9yZSBkYXRhIGZvciBtb292IGF0b20gbWFraW5nIG1vdmllIGZpbGUgcmVjb3ZlcnkgcG9zc2libGUgaW4gY2FzZSBvZiBhIGNyYXNoIGR1cmluZyBtdXhpbmcuIE51bGwgZm9yIGRpc2FibGVkLiAoRXhwZXJpbWVudGFsKS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SVNNTE11eDo6bW92aWUtdGltZXNjYWxlPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW92aWUgdGltZXNjYWxlPC9OSUNLPgorPEJMVVJCPlRpbWVzY2FsZSB0byB1c2UgaW4gdGhlIG1vdmllICh1bml0cyBwZXIgc2Vjb25kLCAwID09IGRlZmF1bHQpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJU01MTXV4OjpwcmVzZW50YXRpb24tdGltZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkluY2x1ZGUgcHJlc2VudGF0aW9uLXRpbWUgaW5mbzwvTklDSz4KKzxCTFVSQj5DYWxjdWxhdGUgYW5kIGluY2x1ZGUgcHJlc2VudGF0aW9uL2NvbXBvc2l0aW9uIHRpbWUgKGluIGFkZGl0aW9uIHRvIGRlY29kaW5nIHRpbWUpLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJU01MTXV4OjpzdHJlYW1hYmxlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3RyZWFtYWJsZTwvTklDSz4KKzxCTFVSQj5JZiBzZXQgdG8gdHJ1ZSwgdGhlIG91dHB1dCBzaG91bGQgYmUgYXMgaWYgaXQgaXMgdG8gYmUgc3RyZWFtZWQgYW5kIGhlbmNlIG5vIGluZGV4ZXMgd3JpdHRlbiBvciBkdXJhdGlvbiB3cml0dGVuLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJU01MTXV4Ojp0cmFrLXRpbWVzY2FsZTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRyYWNrIHRpbWVzY2FsZTwvTklDSz4KKzxCTFVSQj5UaW1lc2NhbGUgdG8gdXNlIGZvciB0aGUgdHJhY2tzICh1bml0cyBwZXIgc2Vjb25kLCAwIGlzIGF1dG9tYXRpYykuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdElTTUxNdXg6OnJlc2VydmVkLWJ5dGVzLXBlci1zZWM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSAxMDAwMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc2VydmVkIE1PT1YgYnl0ZXMgcGVyIHNlY29uZCwgcGVyIHRyYWNrPC9OSUNLPgorPEJMVVJCPk11bHRpcGxpZXIgZm9yIGNvbnZlcnRpbmcgcmVzZXJ2ZWQtbWF4LWR1cmF0aW9uIGludG8gYnl0ZXMgb2YgaGVhZGVyIHRvIHJlc2VydmUsIHBlciBzZWNvbmQsIHBlciB0cmFjay48L0JMVVJCPgorPERFRkFVTFQ+NTUwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJU01MTXV4OjpyZXNlcnZlZC1kdXJhdGlvbi1yZW1haW5pbmc8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5SZXBvcnQgdGhlIGFwcHJveGltYXRlIGFtb3VudCBvZiByZW1haW5pbmcgcmVjb3JkaW5nIHNwYWNlIChucyk8L05JQ0s+Cis8QkxVUkI+UmVwb3J0cyB0aGUgYXBwcm94aW1hdGUgYW1vdW50IG9mIHJlbWFpbmluZyBtb292IGhlYWRlciBzcGFjZSByZXNlcnZlZCB1c2luZyByZXNlcnZlZC1tYXgtZHVyYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdElTTUxNdXg6OnJlc2VydmVkLW1heC1kdXJhdGlvbjwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SZXNlcnZlZCBtYXhpbXVtIGZpbGUgZHVyYXRpb24gKG5zKTwvTklDSz4KKzxCTFVSQj5XaGVuIHNldCB0byBhIHZhbHVlID4gMCwgcmVzZXJ2ZXMgc3BhY2UgZm9yIGluZGV4IHRhYmxlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLjwvQkxVUkI+Cis8REVGQVVMVD4xODQ0Njc0NDA3MzcwOTU1MTYxNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SVNNTE11eDo6cmVzZXJ2ZWQtbW9vdi11cGRhdGUtcGVyaW9kPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludGVydmFsIGF0IHdoaWNoIHRvIHVwZGF0ZSBpbmRleCB0YWJsZXMgKG5zKTwvTklDSz4KKzxCTFVSQj5XaGVuIHVzZWQgd2l0aCByZXNlcnZlZC1tYXgtZHVyYXRpb24sIHBlcmlvZGljYWxseSB1cGRhdGVzIHRoZSBpbmRleCB0YWJsZXMgd2l0aCBpbmZvcm1hdGlvbiBtdXhlZCBzbyBmYXIuPC9CTFVSQj4KKzxERUZBVUxUPjE4NDQ2NzQ0MDczNzA5NTUxNjE1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJU01MTXV4OjppbnRlcmxlYXZlLWJ5dGVzPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludGVybGVhdmUgKGJ5dGVzKTwvTklDSz4KKzxCTFVSQj5JbnRlcmxlYXZlIGJldHdlZW4gc3RyZWFtcyBpbiBieXRlcy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SVNNTE11eDo6aW50ZXJsZWF2ZS10aW1lPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludGVybGVhdmUgKHRpbWUpPC9OSUNLPgorPEJMVVJCPkludGVybGVhdmUgYmV0d2VlbiBzdHJlYW1zIGluIG5hbm9zZWNvbmRzLjwvQkxVUkI+Cis8REVGQVVMVD4yNTAwMDAwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdElTTUxNdXg6Om1heC1yYXctYXVkaW8tZHJpZnQ8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4IFJhdyBBdWRpbyBEcmlmdDwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIGFsbG93ZWQgZHJpZnQgb2YgcmF3IGF1ZGlvIHNhbXBsZXMgdnMuIHRpbWVzdGFtcHMgaW4gbmFub3NlY29uZHMuPC9CTFVSQj4KKzxERUZBVUxUPjQwMDAwMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJU01MTXV4OjpyZXNlcnZlZC1wcmVmaWxsPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVzZXJ2ZWQgUHJlZmlsbCBTYW1wbGVzIFRhYmxlPC9OSUNLPgorPEJMVVJCPlByZWZpbGwgc2FtcGxlcyB0YWJsZSBvZiByZXNlcnZlZCBkdXJhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdDNHUFBNdXg6OmR0cy1tZXRob2Q8L05BTUU+Cis8VFlQRT5Hc3RRVE11eER0c01ldGhvZHM8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZHRzLW1ldGhvZDwvTklDSz4KKzxCTFVSQj5NZXRob2QgdG8gZGV0ZXJtaW5lIERUUyB0aW1lIChERVBSRUNBVEVEKS48L0JMVVJCPgorPERFRkFVTFQ+cmVvcmRlcjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0M0dQUE11eDo6ZmFzdHN0YXJ0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Gb3JtYXQgZmlsZSB0byBmYXN0c3RhcnQ8L05JQ0s+Cis8QkxVUkI+SWYgdGhlIGZpbGUgc2hvdWxkIGJlIGZvcm1hdHRlZCBmb3IgZmFzdHN0YXJ0IChoZWFkZXJzIGZpcnN0KS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdDNHUFBNdXg6OmZhc3RzdGFydC1maWxlPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbGUgdG8gdXNlIGZvciBzdG9yaW5nIGJ1ZmZlcnM8L05JQ0s+Cis8QkxVUkI+RmlsZSB0aGF0IHdpbGwgYmUgdXNlZCB0ZW1wb3JhcmlseSB0byBzdG9yZSBkYXRhIGZyb20gdGhlIHN0cmVhbSB3aGVuIGNyZWF0aW5nIGEgZmFzdHN0YXJ0IGZpbGUuIElmIG51bGwgYSBmaWxlcGF0aCB3aWxsIGJlIGNyZWF0ZWQgYXV0b21hdGljYWxseS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0M0dQUE11eDo6ZnJhZ21lbnQtZHVyYXRpb248L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmFnbWVudCBkdXJhdGlvbjwvTklDSz4KKzxCTFVSQj5GcmFnbWVudCBkdXJhdGlvbnMgaW4gbXMgKHByb2R1Y2UgYSBmcmFnbWVudGVkIGZpbGUgaWYgPiAwKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0M0dQUE11eDo6bW9vdi1yZWNvdmVyeS1maWxlPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbGUgdG8gc3RvcmUgZGF0YSBmb3IgcG9zdGVyaW9yIG1vb3YgYXRvbSByZWNvdmVyeTwvTklDSz4KKzxCTFVSQj5GaWxlIHRvIGJlIHVzZWQgdG8gc3RvcmUgZGF0YSBmb3IgbW9vdiBhdG9tIG1ha2luZyBtb3ZpZSBmaWxlIHJlY292ZXJ5IHBvc3NpYmxlIGluIGNhc2Ugb2YgYSBjcmFzaCBkdXJpbmcgbXV4aW5nLiBOdWxsIGZvciBkaXNhYmxlZC4gKEV4cGVyaW1lbnRhbCkuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdDNHUFBNdXg6Om1vdmllLXRpbWVzY2FsZTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1vdmllIHRpbWVzY2FsZTwvTklDSz4KKzxCTFVSQj5UaW1lc2NhbGUgdG8gdXNlIGluIHRoZSBtb3ZpZSAodW5pdHMgcGVyIHNlY29uZCwgMCA9PSBkZWZhdWx0KS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0M0dQUE11eDo6cHJlc2VudGF0aW9uLXRpbWU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5JbmNsdWRlIHByZXNlbnRhdGlvbi10aW1lIGluZm88L05JQ0s+Cis8QkxVUkI+Q2FsY3VsYXRlIGFuZCBpbmNsdWRlIHByZXNlbnRhdGlvbi9jb21wb3NpdGlvbiB0aW1lIChpbiBhZGRpdGlvbiB0byBkZWNvZGluZyB0aW1lKS48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0M0dQUE11eDo6c3RyZWFtYWJsZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN0cmVhbWFibGU8L05JQ0s+Cis8QkxVUkI+SWYgc2V0IHRvIHRydWUsIHRoZSBvdXRwdXQgc2hvdWxkIGJlIGFzIGlmIGl0IGlzIHRvIGJlIHN0cmVhbWVkIGFuZCBoZW5jZSBubyBpbmRleGVzIHdyaXR0ZW4gb3IgZHVyYXRpb24gd3JpdHRlbi4gKERFUFJFQ0FURUQsIG9ubHkgdmFsaWQgZm9yIGZyYWdtZW50ZWQgTVA0KS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdDNHUFBNdXg6OnRyYWstdGltZXNjYWxlPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VHJhY2sgdGltZXNjYWxlPC9OSUNLPgorPEJMVVJCPlRpbWVzY2FsZSB0byB1c2UgZm9yIHRoZSB0cmFja3MgKHVuaXRzIHBlciBzZWNvbmQsIDAgaXMgYXV0b21hdGljKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0M0dQUE11eDo6cmVzZXJ2ZWQtYnl0ZXMtcGVyLXNlYzwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDEwMDAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVzZXJ2ZWQgTU9PViBieXRlcyBwZXIgc2Vjb25kLCBwZXIgdHJhY2s8L05JQ0s+Cis8QkxVUkI+TXVsdGlwbGllciBmb3IgY29udmVydGluZyByZXNlcnZlZC1tYXgtZHVyYXRpb24gaW50byBieXRlcyBvZiBoZWFkZXIgdG8gcmVzZXJ2ZSwgcGVyIHNlY29uZCwgcGVyIHRyYWNrLjwvQkxVUkI+Cis8REVGQVVMVD41NTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdDNHUFBNdXg6OnJlc2VydmVkLWR1cmF0aW9uLXJlbWFpbmluZzwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPlJlcG9ydCB0aGUgYXBwcm94aW1hdGUgYW1vdW50IG9mIHJlbWFpbmluZyByZWNvcmRpbmcgc3BhY2UgKG5zKTwvTklDSz4KKzxCTFVSQj5SZXBvcnRzIHRoZSBhcHByb3hpbWF0ZSBhbW91bnQgb2YgcmVtYWluaW5nIG1vb3YgaGVhZGVyIHNwYWNlIHJlc2VydmVkIHVzaW5nIHJlc2VydmVkLW1heC1kdXJhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0M0dQUE11eDo6cmVzZXJ2ZWQtbWF4LWR1cmF0aW9uPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJlc2VydmVkIG1heGltdW0gZmlsZSBkdXJhdGlvbiAobnMpPC9OSUNLPgorPEJMVVJCPldoZW4gc2V0IHRvIGEgdmFsdWUgPiAwLCByZXNlcnZlcyBzcGFjZSBmb3IgaW5kZXggdGFibGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuPC9CTFVSQj4KKzxERUZBVUxUPjE4NDQ2NzQ0MDczNzA5NTUxNjE1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3QzR1BQTXV4OjpyZXNlcnZlZC1tb292LXVwZGF0ZS1wZXJpb2Q8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SW50ZXJ2YWwgYXQgd2hpY2ggdG8gdXBkYXRlIGluZGV4IHRhYmxlcyAobnMpPC9OSUNLPgorPEJMVVJCPldoZW4gdXNlZCB3aXRoIHJlc2VydmVkLW1heC1kdXJhdGlvbiwgcGVyaW9kaWNhbGx5IHVwZGF0ZXMgdGhlIGluZGV4IHRhYmxlcyB3aXRoIGluZm9ybWF0aW9uIG11eGVkIHNvIGZhci48L0JMVVJCPgorPERFRkFVTFQ+MTg0NDY3NDQwNzM3MDk1NTE2MTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdDNHUFBNdXg6OmludGVybGVhdmUtYnl0ZXM8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SW50ZXJsZWF2ZSAoYnl0ZXMpPC9OSUNLPgorPEJMVVJCPkludGVybGVhdmUgYmV0d2VlbiBzdHJlYW1zIGluIGJ5dGVzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3QzR1BQTXV4OjppbnRlcmxlYXZlLXRpbWU8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SW50ZXJsZWF2ZSAodGltZSk8L05JQ0s+Cis8QkxVUkI+SW50ZXJsZWF2ZSBiZXR3ZWVuIHN0cmVhbXMgaW4gbmFub3NlY29uZHMuPC9CTFVSQj4KKzxERUZBVUxUPjI1MDAwMDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0M0dQUE11eDo6bWF4LXJhdy1hdWRpby1kcmlmdDwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXggUmF3IEF1ZGlvIERyaWZ0PC9OSUNLPgorPEJMVVJCPk1heGltdW0gYWxsb3dlZCBkcmlmdCBvZiByYXcgYXVkaW8gc2FtcGxlcyB2cy4gdGltZXN0YW1wcyBpbiBuYW5vc2Vjb25kcy48L0JMVVJCPgorPERFRkFVTFQ+NDAwMDAwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdDNHUFBNdXg6OnJlc2VydmVkLXByZWZpbGw8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNlcnZlZCBQcmVmaWxsIFNhbXBsZXMgVGFibGU8L05JQ0s+Cis8QkxVUkI+UHJlZmlsbCBzYW1wbGVzIHRhYmxlIG9mIHJlc2VydmVkIGR1cmF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BsaXRGaWxlU3JjOjpsb2NhdGlvbjwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZpbGUgTG9jYXRpb248L05JQ0s+Cis8QkxVUkI+V2lsZGNhcmQgcGF0dGVybiB0byBtYXRjaCBmaWxlIG5hbWVzIG9mIHRoZSBpbnB1dCBmaWxlcy4gSWYgdGhlIGxvY2F0aW9uIGlzIGFuIGFic29sdXRlIHBhdGggb3IgY29udGFpbnMgZGlyZWN0b3J5IGNvbXBvbmVudHMsIG9ubHkgdGhlIGJhc2UgZmlsZSBuYW1lIHBhcnQgd2lsbCBiZSBjb25zaWRlcmVkIGZvciBwYXR0ZXJuIG1hdGNoaW5nLiBUaGUgcmVzdWx0cyB3aWxsIGJlIHNvcnRlZC48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TWF0cm9za2FEZW11eDo6bWF4LWdhcC10aW1lPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heGltdW0gZ2FwIHRpbWU8L05JQ0s+Cis8QkxVUkI+VGhlIGRlbXV4ZXIgc2VuZHMgb3V0IHNlZ21lbnQgZXZlbnRzIGZvciBza2lwcGluZyBnYXBzIGxvbmdlciB0aGFuIHRoaXMgKDAgPSBkaXNhYmxlZCkuPC9CTFVSQj4KKzxERUZBVUxUPjIwMDAwMDAwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIdHRwQ2xpZW50U2luazo6YXV0b21hdGljLXJlZGlyZWN0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5hdXRvbWF0aWMtcmVkaXJlY3Q8L05JQ0s+Cis8QkxVUkI+QXV0b21hdGljYWxseSBmb2xsb3cgSFRUUCByZWRpcmVjdHMgKEhUVFAgU3RhdHVzIENvZGUgM3h4KS48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U291cEh0dHBDbGllbnRTaW5rOjpjb29raWVzPC9OQU1FPgorPFRZUEU+R1N0cnY8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Db29raWVzPC9OSUNLPgorPEJMVVJCPkhUVFAgcmVxdWVzdCBjb29raWVzLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIdHRwQ2xpZW50U2luazo6bG9jYXRpb248L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Mb2NhdGlvbjwvTklDSz4KKzxCTFVSQj5VUkkgdG8gc2VuZCB0by48L0JMVVJCPgorPERFRkFVTFQ+IiI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIdHRwQ2xpZW50U2luazo6cHJveHk8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qcm94eTwvTklDSz4KKzxCTFVSQj5IVFRQIHByb3h5IHNlcnZlciBVUkkuPC9CTFVSQj4KKzxERUZBVUxUPiIiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSHR0cENsaWVudFNpbms6OnByb3h5LWlkPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+cHJveHktaWQ8L05JQ0s+Cis8QkxVUkI+dXNlciBpZCBmb3IgcHJveHkgYXV0aGVudGljYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPiIiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSHR0cENsaWVudFNpbms6OnByb3h5LXB3PC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+cHJveHktcHc8L05JQ0s+Cis8QkxVUkI+dXNlciBwYXNzd29yZCBmb3IgcHJveHkgYXV0aGVudGljYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPiIiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSHR0cENsaWVudFNpbms6OnNlc3Npb248L05BTUU+Cis8VFlQRT5Tb3VwU2Vzc2lvbio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5zZXNzaW9uPC9OSUNLPgorPEJMVVJCPlNvdXBTZXNzaW9uIG9iamVjdCB0byB1c2UgZm9yIGNvbW11bmljYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U291cEh0dHBDbGllbnRTaW5rOjp1c2VyLWFnZW50PC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VXNlci1BZ2VudDwvTklDSz4KKzxCTFVSQj5WYWx1ZSBvZiB0aGUgVXNlci1BZ2VudCBIVFRQIHJlcXVlc3QgaGVhZGVyIGZpZWxkLjwvQkxVUkI+Cis8REVGQVVMVD4iR1N0cmVhbWVyIHNvdXBodHRwY2xpZW50c2luayAiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSHR0cENsaWVudFNpbms6OnVzZXItaWQ8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz51c2VyLWlkPC9OSUNLPgorPEJMVVJCPnVzZXIgaWQgZm9yIGF1dGhlbnRpY2F0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4iIjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U291cEh0dHBDbGllbnRTaW5rOjp1c2VyLXB3PC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+dXNlci1wdzwvTklDSz4KKzxCTFVSQj51c2VyIHBhc3N3b3JkIGZvciBhdXRoZW50aWNhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+IiI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIdHRwQ2xpZW50U2luazo6aHR0cC1sb2ctbGV2ZWw8L05BTUU+Cis8VFlQRT5Tb3VwTG9nZ2VyTG9nTGV2ZWw8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5IVFRQIGxvZyBsZXZlbDwvTklDSz4KKzxCTFVSQj5TZXQgbG9nIGxldmVsIGZvciBzb3VwJ3MgSFRUUCBzZXNzaW9uIGxvZy48L0JMVVJCPgorPERFRkFVTFQ+U09VUF9MT0dHRVJfTE9HX05PTkU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIdHRwQ2xpZW50U2luazo6cmV0cmllczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UmV0cmllczwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLCB6ZXJvIHRvIGRpc2FibGUsIC0xIHRvIHJldHJ5IGZvcmV2ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIdHRwQ2xpZW50U2luazo6cmV0cnktZGVsYXk8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDE8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJldHJ5IERlbGF5PC9OSUNLPgorPEJMVVJCPkRlbGF5IGluIHNlY29uZHMgYmV0d2VlbiByZXRyaWVzIGFmdGVyIGEgZmFpbHVyZS48L0JMVVJCPgorPERFRkFVTFQ+NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0V2F2UGFyc2U6Omlnbm9yZS1sZW5ndGg8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPklnbm9yZSBsZW5ndGg8L05JQ0s+Cis8QkxVUkI+SWdub3JlIGxlbmd0aCBmcm9tIHRoZSBXYXZlIGhlYWRlci48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEdka1BpeGJ1Zk92ZXJsYXk6OmxvY2F0aW9uPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+bG9jYXRpb248L05JQ0s+Cis8QkxVUkI+TG9jYXRpb24gb2YgaW1hZ2UgZmlsZSB0byBvdmVybGF5LjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RHZGtQaXhidWZPdmVybGF5OjpvZmZzZXQteDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5YIE9mZnNldDwvTklDSz4KKzxCTFVSQj5Gb3IgcG9zaXRpdmUgdmFsdWUsIGhvcml6b250YWwgb2Zmc2V0IG9mIG92ZXJsYXkgaW1hZ2UgaW4gcGl4ZWxzIGZyb20gbGVmdCBvZiB2aWRlbyBpbWFnZS4gRm9yIG5lZ2F0aXZlIHZhbHVlLCBob3Jpem9udGFsIG9mZnNldCBvZiBvdmVybGF5IGltYWdlIGluIHBpeGVscyBmcm9tIHJpZ2h0IG9mIHZpZGVvIGltYWdlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RHZGtQaXhidWZPdmVybGF5OjpvZmZzZXQteTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5ZIE9mZnNldDwvTklDSz4KKzxCTFVSQj5Gb3IgcG9zaXRpdmUgdmFsdWUsIHZlcnRpY2FsIG9mZnNldCBvZiBvdmVybGF5IGltYWdlIGluIHBpeGVscyBmcm9tIHRvcCBvZiB2aWRlbyBpbWFnZS4gRm9yIG5lZ2F0aXZlIHZhbHVlLCB2ZXJ0aWNhbCBvZmZzZXQgb2Ygb3ZlcmxheSBpbWFnZSBpbiBwaXhlbHMgZnJvbSBib3R0b20gb2YgdmlkZW8gaW1hZ2UuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEdka1BpeGJ1Zk92ZXJsYXk6Om92ZXJsYXktaGVpZ2h0PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5PdmVybGF5IEhlaWdodDwvTklDSz4KKzxCTFVSQj5IZWlnaHQgb2Ygb3ZlcmxheSBpbWFnZSBpbiBwaXhlbHMgKDAgPSBzYW1lIGFzIG92ZXJsYXkgaW1hZ2UpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RHZGtQaXhidWZPdmVybGF5OjpvdmVybGF5LXdpZHRoPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5PdmVybGF5IFdpZHRoPC9OSUNLPgorPEJMVVJCPldpZHRoIG9mIG92ZXJsYXkgaW1hZ2UgaW4gcGl4ZWxzICgwID0gc2FtZSBhcyBvdmVybGF5IGltYWdlKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0R2RrUGl4YnVmT3ZlcmxheTo6cmVsYXRpdmUteDwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SZWxhdGl2ZSBYIE9mZnNldDwvTklDSz4KKzxCTFVSQj5Ib3Jpem9udGFsIG9mZnNldCBvZiBvdmVybGF5IGltYWdlIGluIGZyYWN0aW9ucyBvZiB2aWRlbyBpbWFnZSB3aWR0aCwgZnJvbSB0b3AtbGVmdCBjb3JuZXIgb2YgdmlkZW8gaW1hZ2UgKGluIHJlbGF0aXZlIHBvc2l0aW9uaW5nKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0R2RrUGl4YnVmT3ZlcmxheTo6cmVsYXRpdmUteTwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SZWxhdGl2ZSBZIE9mZnNldDwvTklDSz4KKzxCTFVSQj5WZXJ0aWNhbCBvZmZzZXQgb2Ygb3ZlcmxheSBpbWFnZSBpbiBmcmFjdGlvbnMgb2YgdmlkZW8gaW1hZ2UgaGVpZ2h0LCBmcm9tIHRvcC1sZWZ0IGNvcm5lciBvZiB2aWRlbyBpbWFnZSAoaW4gcmVsYXRpdmUgcG9zaXRpb25pbmcpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RHZGtQaXhidWZPdmVybGF5OjphbHBoYTwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkFscGhhPC9OSUNLPgorPEJMVVJCPkdsb2JhbCBhbHBoYSBvZiBvdmVybGF5IGltYWdlLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RHZGtQaXhidWZPdmVybGF5OjpwaXhidWY8L05BTUU+Cis8VFlQRT5HZGtQaXhidWYqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UGl4YnVmPC9OSUNLPgorPEJMVVJCPkdka1BpeGJ1ZiBvYmplY3QgdG8gcmVuZGVyLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEdka1BpeGJ1Zk92ZXJsYXk6OnBvc2l0aW9uaW5nLW1vZGU8L05BTUU+Cis8VFlQRT5Hc3RHZGtQaXhidWZQb3NpdGlvbmluZ01vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qb3NpdGlvbmluZyBtb2RlPC9OSUNLPgorPEJMVVJCPlBvc2l0aW9uaW5nIG1vZGUgb2Ygb2Zmc2V0LXggYW5kIG9mZnNldC15IHByb3BlcnRpZXMuPC9CTFVSQj4KKzxERUZBVUxUPnBpeGVscy1yZWxhdGl2ZS10by1lZGdlczwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0R2RrUGl4YnVmT3ZlcmxheTo6Y29lZi14PC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJlbGF0aXZlIFggT2Zmc2V0PC9OSUNLPgorPEJMVVJCPkhvcml6b250YWwgb2Zmc2V0IG9mIG92ZXJsYXkgaW1hZ2UgaW4gZnJhY3Rpb25zIG9mIHZpZGVvIGltYWdlIHdpZHRoLCBmcm9tIHRvcC1sZWZ0IGNvcm5lciBvZiB2aWRlbyBpbWFnZSAoYWJzb2x1dGUgcG9zaXRpb25pbmcpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RHZGtQaXhidWZPdmVybGF5Ojpjb2VmLXk8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UmVsYXRpdmUgWSBPZmZzZXQ8L05JQ0s+Cis8QkxVUkI+VmVydGljYWwgb2Zmc2V0IG9mIG92ZXJsYXkgaW1hZ2UgaW4gZnJhY3Rpb25zIG9mIHZpZGVvIGltYWdlIGhlaWdodCwgZnJvbSB0b3AtbGVmdCBjb3JuZXIgb2YgdmlkZW8gaW1hZ2UgKGFic29sdXRlIHBvc2l0aW9uaW5nKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjphcm5yLW1heGZyYW1lczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMTVdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5BbHRSZWYgbWF4IGZyYW1lczwvTklDSz4KKzxCTFVSQj5BbHRSZWYgbWF4aW11bSBudW1iZXIgb2YgZnJhbWVzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OmFybnItc3RyZW5ndGg8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDZdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5BbHRSZWYgc3RyZW5ndGg8L05JQ0s+Cis8QkxVUkI+QWx0UmVmIHN0cmVuZ3RoLjwvQkxVUkI+Cis8REVGQVVMVD4zPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OmFybnItdHlwZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsM108L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkFsdFJlZiB0eXBlPC9OSUNLPgorPEJMVVJCPkFsdFJlZiB0eXBlLjwvQkxVUkI+Cis8REVGQVVMVD4zPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OmF1dG8tYWx0LXJlZjwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QXV0byBhbHQgcmVmZXJlbmNlIGZyYW1lczwvTklDSz4KKzxCTFVSQj5BdXRvbWF0aWNhbGx5IGdlbmVyYXRlIEFsdFJlZiBmcmFtZXMuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OmJ1ZmZlci1pbml0aWFsLXNpemU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkJ1ZmZlciBpbml0aWFsIHNpemU8L05JQ0s+Cis8QkxVUkI+SW5pdGlhbCBjbGllbnQgYnVmZmVyIHNpemUgKG1zKS48L0JMVVJCPgorPERFRkFVTFQ+NDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjpidWZmZXItb3B0aW1hbC1zaXplPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CdWZmZXIgb3B0aW1hbCBzaXplPC9OSUNLPgorPEJMVVJCPk9wdGltYWwgY2xpZW50IGJ1ZmZlciBzaXplIChtcykuPC9CTFVSQj4KKzxERUZBVUxUPjUwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6YnVmZmVyLXNpemU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkJ1ZmZlciBzaXplPC9OSUNLPgorPEJMVVJCPkNsaWVudCBidWZmZXIgc2l6ZSAobXMpLjwvQkxVUkI+Cis8REVGQVVMVD42MDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OmNwdS11c2VkPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bLTE2LDE2XTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q1BVIHVzZWQ8L05JQ0s+Cis8QkxVUkI+Q1BVIHVzZWQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6Y3EtbGV2ZWw8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDYzXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q29uc3RyYWluZWQgcXVhbGl0eSBsZXZlbDwvTklDSz4KKzxCTFVSQj5Db25zdHJhaW5lZCBxdWFsaXR5IGxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4xMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjpkZWFkbGluZTwvTkFNRT4KKzxUWVBFPmdpbnQ2NDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EZWFkbGluZTwvTklDSz4KKzxCTFVSQj5EZWFkbGluZSBwZXIgZnJhbWUgKHVzZWMsIDA9ZGlzYWJsZWQpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OmRyb3BmcmFtZS10aHJlc2hvbGQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRyb3AgRnJhbWUgVGhyZXNob2xkPC9OSUNLPgorPEJMVVJCPlRlbXBvcmFsIHJlc2FtcGxpbmcgdGhyZXNob2xkIChidWYgJSkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6ZW5kLXVzYWdlPC9OQU1FPgorPFRZUEU+R3N0VlA4RW5jRW5kVXNhZ2U8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SYXRlIGNvbnRyb2wgbW9kZTwvTklDSz4KKzxCTFVSQj5SYXRlIGNvbnRyb2wgbW9kZS48L0JMVVJCPgorPERFRkFVTFQ+VmFyaWFibGUgQml0IFJhdGUgKFZCUikgbW9kZTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjplcnJvci1yZXNpbGllbnQ8L05BTUU+Cis8VFlQRT5Hc3RWUDhFbmNFckZsYWdzPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RXJyb3IgcmVzaWxpZW50PC9OSUNLPgorPEJMVVJCPkVycm9yIHJlc2lsaWVuY2UgZmxhZ3MuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjpsYWctaW4tZnJhbWVzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwyNV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkxhZyBpbiBmcmFtZXM8L05JQ0s+Cis8QkxVUkI+TWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIHRvIGxhZy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjptYXgtcXVhbnRpemVyPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw2M108L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heGltdW0gUXVhbnRpemVyPC9OSUNLPgorPEJMVVJCPk1heGltdW0gUXVhbnRpemVyICh3b3JzdCkuPC9CTFVSQj4KKzxERUZBVUxUPjYzPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6Om1pbi1xdWFudGl6ZXI8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDYzXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWluaW11bSBRdWFudGl6ZXI8L05JQ0s+Cis8QkxVUkI+TWluaW11bSBRdWFudGl6ZXIgKGJlc3QpLjwvQkxVUkI+Cis8REVGQVVMVD40PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6Om11bHRpcGFzcy1jYWNoZS1maWxlPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TXVsdGlwYXNzIENhY2hlIEZpbGU8L05JQ0s+Cis8QkxVUkI+TXVsdGlwYXNzIGNhY2hlIGZpbGUuIElmIHN0cmVhbSBjYXBzIHJlaW5pdGVkLCBtdWx0aXBsZSBmaWxlcyB3aWxsIGJlIGNyZWF0ZWQ6IGZpbGUsIGZpbGUuMSwgZmlsZS4yLCAuLi4gYW5kIHNvIG9uLjwvQkxVUkI+Cis8REVGQVVMVD4ibXVsdGlwYXNzLmNhY2hlIjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjptdWx0aXBhc3MtbW9kZTwvTkFNRT4KKzxUWVBFPkdzdFZQOEVuY011bHRpcGFzc01vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NdWx0aXBhc3MgTW9kZTwvTklDSz4KKzxCTFVSQj5NdWx0aXBhc3MgZW5jb2RlIG1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPk9uZSBwYXNzIGVuY29kaW5nIChkZWZhdWx0KTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjpub2lzZS1zZW5zaXRpdml0eTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNl08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk5vaXNlIHNlbnNpdGl2aXR5PC9OSUNLPgorPEJMVVJCPk5vaXNlIHNlbnNpc2l2aXR5IChmcmFtZXMgdG8gYmx1cikuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6cmVzaXplLWFsbG93ZWQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJlc2l6ZSBBbGxvd2VkPC9OSUNLPgorPEJMVVJCPkFsbG93IHNwYXRpYWwgcmVzYW1wbGluZy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6cmVzaXplLWRvd24tdGhyZXNob2xkPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwxMDBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SZXNpemUgRG93biBUaHJlc2hvbGQ8L05JQ0s+Cis8QkxVUkI+RG93bnNjYWxlIHRocmVzaG9sZCAoYnVmICUpLjwvQkxVUkI+Cis8REVGQVVMVD42MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjpyZXNpemUtdXAtdGhyZXNob2xkPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwxMDBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SZXNpemUgVXAgVGhyZXNob2xkPC9OSUNLPgorPEJMVVJCPlVwc2NhbGUgdGhyZXNob2xkIChidWYgJSkuPC9CTFVSQj4KKzxERUZBVUxUPjMwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OnNoYXJwbmVzczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsN108L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNoYXJwbmVzczwvTklDSz4KKzxCTFVSQj5GaWx0ZXIgc2hhcnBuZXNzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OnN0YXRpYy10aHJlc2hvbGQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlN0YXRpYyBUaHJlc2hvbGQ8L05JQ0s+Cis8QkxVUkI+TW90aW9uIGRldGVjdGlvbiB0aHJlc2hvbGQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6dGFyZ2V0LWJpdHJhdGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRhcmdldCBiaXRyYXRlPC9OSUNLPgorPEJMVVJCPlRhcmdldCBiaXRyYXRlIChpbiBiaXRzL3NlYykuPC9CTFVSQj4KKzxERUZBVUxUPjI1NjAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjp0aHJlYWRzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw2NF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRocmVhZHM8L05JQ0s+Cis8QkxVUkI+TnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OnRva2VuLXBhcnRpdGlvbnM8L05BTUU+Cis8VFlQRT5Hc3RWUDhFbmNUb2tlblBhcnRpdGlvbnM8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Ub2tlbiBwYXJ0aXRpb25zPC9OSUNLPgorPEJMVVJCPk51bWJlciBvZiB0b2tlbiBwYXJ0aXRpb25zLjwvQkxVUkI+Cis8REVGQVVMVD5PbmUgdG9rZW4gcGFydGl0aW9uPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OnR1bmluZzwvTkFNRT4KKzxUWVBFPkdzdFZQOEVuY1R1bmluZzwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlR1bmluZzwvTklDSz4KKzxCTFVSQj5UdW5pbmcuPC9CTFVSQj4KKzxERUZBVUxUPlR1bmUgZm9yIFBTTlI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6aG9yaXpvbnRhbC1zY2FsaW5nLW1vZGU8L05BTUU+Cis8VFlQRT5Hc3RWUDhFbmNTY2FsaW5nTW9kZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkhvcml6b250YWwgc2NhbGluZyBtb2RlPC9OSUNLPgorPEJMVVJCPkhvcml6b250YWwgc2NhbGluZyBtb2RlLjwvQkxVUkI+Cis8REVGQVVMVD5Ob3JtYWw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6a2V5ZnJhbWUtbWF4LWRpc3Q8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPktleWZyYW1lIG1heCBkaXN0YW5jZTwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIGRpc3RhbmNlIGJldHdlZW4ga2V5ZnJhbWVzIChudW1iZXIgb2YgZnJhbWVzKS48L0JMVVJCPgorPERFRkFVTFQ+MTI4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OmtleWZyYW1lLW1vZGU8L05BTUU+Cis8VFlQRT5Hc3RWUDhFbmNLZk1vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5LZXlmcmFtZSBNb2RlPC9OSUNLPgorPEJMVVJCPktleWZyYW1lIHBsYWNlbWVudC48L0JMVVJCPgorPERFRkFVTFQ+RGV0ZXJtaW5lIG9wdGltYWwgcGxhY2VtZW50IGF1dG9tYXRpY2FsbHk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6bWF4LWludHJhLWJpdHJhdGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heCBJbnRyYSBiaXRyYXRlPC9OSUNLPgorPEJMVVJCPk1heGltdW0gSW50cmEgZnJhbWUgYml0cmF0ZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjpvdmVyc2hvb3Q8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDEwMDBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5PdmVyc2hvb3QgUENUPC9OSUNLPgorPEJMVVJCPkRhdGFyYXRlIG92ZXJzaG9vdCAobWF4KSB0YXJnZXQgKCUpLjwvQkxVUkI+Cis8REVGQVVMVD4xMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6dGVtcG9yYWwtc2NhbGFiaWxpdHktbGF5ZXItaWQ8L05BTUU+Cis8VFlQRT5HVmFsdWVBcnJheSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Db2RpbmcgbGF5ZXIgaWRlbnRpZmljYXRpb248L05JQ0s+Cis8QkxVUkI+U2VxdWVuY2UgZGVmaW5pbmcgY29kaW5nIGxheWVyIG1lbWJlcnNoaXAuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjp0ZW1wb3JhbC1zY2FsYWJpbGl0eS1udW1iZXItbGF5ZXJzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSw1XTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TnVtYmVyIG9mIGNvZGluZyBsYXllcnM8L05JQ0s+Cis8QkxVUkI+TnVtYmVyIG9mIGNvZGluZyBsYXllcnMgdG8gdXNlLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OnRlbXBvcmFsLXNjYWxhYmlsaXR5LXBlcmlvZGljaXR5PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwxNl08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNvZGluZyBsYXllciBwZXJpb2RpY2l0eTwvTklDSz4KKzxCTFVSQj5MZW5ndGggb2Ygc2VxdWVuY2UgdGhhdCBkZWZpbmVzIGxheWVyIG1lbWJlcnNoaXAgcGVyaW9kaWNpdHkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6dGVtcG9yYWwtc2NhbGFiaWxpdHktcmF0ZS1kZWNpbWF0b3I8L05BTUU+Cis8VFlQRT5HVmFsdWVBcnJheSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Db2RpbmcgbGF5ZXIgcmF0ZSBkZWNpbWF0b3I8L05JQ0s+Cis8QkxVUkI+UmF0ZSBkZWNpbWF0aW9uIGZhY3RvcnMgZm9yIGVhY2ggbGF5ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjp0ZW1wb3JhbC1zY2FsYWJpbGl0eS10YXJnZXQtYml0cmF0ZTwvTkFNRT4KKzxUWVBFPkdWYWx1ZUFycmF5KjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNvZGluZyBsYXllciB0YXJnZXQgYml0cmF0ZXM8L05JQ0s+Cis8QkxVUkI+VGFyZ2V0IGJpdHJhdGVzIGZvciBjb2RpbmcgbGF5ZXJzIChvbmUgcGVyIGxheWVyLCBkZWNyZWFzaW5nKS48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OnR3b3Bhc3MtdmJyLWJpYXM8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPjItcGFzcyBWQlIgYmlhczwvTklDSz4KKzxCTFVSQj5DQlIvVkJSIGJpYXMgKDA9Q0JSLCAxMDA9VkJSKS48L0JMVVJCPgorPERFRkFVTFQ+NTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6dHdvcGFzcy12YnItbWF4c2VjdGlvbjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Mi1wYXNzIEdPUCBtYXggYml0cmF0ZTwvTklDSz4KKzxCTFVSQj5HT1AgbWF4aW11bSBiaXRyYXRlICglIHRhcmdldCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6dHdvcGFzcy12YnItbWluc2VjdGlvbjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Mi1wYXNzIEdPUCBtaW4gYml0cmF0ZTwvTklDSz4KKzxCTFVSQj5HT1AgbWluaW11bSBiaXRyYXRlICglIHRhcmdldCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6dW5kZXJzaG9vdDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlVuZGVyc2hvb3QgUENUPC9OSUNLPgorPEJMVVJCPkRhdGFyYXRlIHVuZGVyc2hvb3QgKG1pbikgdGFyZ2V0ICglKS48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OnZlcnRpY2FsLXNjYWxpbmctbW9kZTwvTkFNRT4KKzxUWVBFPkdzdFZQOEVuY1NjYWxpbmdNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VmVydGljYWwgc2NhbGluZyBtb2RlPC9OSUNLPgorPEJMVVJCPlZlcnRpY2FsIHNjYWxpbmcgbW9kZS48L0JMVVJCPgorPERFRkFVTFQ+Tm9ybWFsPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OnRpbWViYXNlPC9OQU1FPgorPFRZUEU+R3N0RnJhY3Rpb248L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TaG9ydGVzdCBpbnRlcmZyYW1lIHRpbWU8L05JQ0s+Cis8QkxVUkI+RnJhY3Rpb24gb2Ygb25lIHNlY29uZCB0aGF0IGlzIHRoZSBzaG9ydGVzdCBpbnRlcmZyYW1lIHRpbWUgLSBub3JtYWxseSBsZWZ0IGFzIHplcm8gd2hpY2ggd2lsbCBkZWZhdWx0IHRvIHRoZSBmcmFtZXJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RGVjOjpkZWJsb2NraW5nLWxldmVsPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMTY8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRlYmxvY2tpbmcgTGV2ZWw8L05JQ0s+Cis8QkxVUkI+RGVibG9ja2luZyBsZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+NDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RGVjOjpub2lzZS1sZXZlbDwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDE2PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Ob2lzZSBMZXZlbDwvTklDSz4KKzxCTFVSQj5Ob2lzZSBsZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RGVjOjpwb3N0LXByb2Nlc3Npbmc8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBvc3QgUHJvY2Vzc2luZzwvTklDSz4KKzxCTFVSQj5FbmFibGUgcG9zdCBwcm9jZXNzaW5nLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RGVjOjpwb3N0LXByb2Nlc3NpbmctZmxhZ3M8L05BTUU+Cis8VFlQRT5Hc3RWUDhEZWNQb3N0UHJvY2Vzc2luZ0ZsYWdzPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UG9zdCBQcm9jZXNzaW5nIEZsYWdzPC9OSUNLPgorPEJMVVJCPkZsYWdzIHRvIGNvbnRyb2wgcG9zdCBwcm9jZXNzaW5nLjwvQkxVUkI+Cis8REVGQVVMVD5EZWJsb2NrfERlbWFjcm9ibG9ja3xNdWx0aS1mcmFtZSBxdWFsaXR5IGVuaGFuY2VtZW50PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhEZWM6OnRocmVhZHM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT5bMSwxNl08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heCBUaHJlYWRzPC9OSUNLPgorPEJMVVJCPk1heGltdW0gbnVtYmVyIG9mIGRlY29kaW5nIHRocmVhZHMuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZpZGVvTWVkaWFuOjpmaWx0ZXJzaXplPC9OQU1FPgorPFRZUEU+R3N0VmlkZW9NZWRpYW5TaXplPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RmlsdGVyc2l6ZTwvTklDSz4KKzxCTFVSQj5UaGUgc2l6ZSBvZiB0aGUgZmlsdGVyLjwvQkxVUkI+Cis8REVGQVVMVD5NZWRpYW4gb2YgNSBuZWlnaGJvdXIgcGl4ZWxzPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWaWRlb01lZGlhbjo6bHVtLW9ubHk8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkx1bSBPbmx5PC9OSUNLPgorPEJMVVJCPk9ubHkgYXBwbHkgZmlsdGVyIG9uIGx1bWluYW5jZS48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U2NhbGV0ZW1wbzo6b3ZlcmxhcDwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk92ZXJsYXAgTGVuZ3RoPC9OSUNLPgorPEJMVVJCPlBlcmNlbnRhZ2Ugb2Ygc3RyaWRlIHRvIG92ZXJsYXAuPC9CTFVSQj4KKzxERUZBVUxUPjAuMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U2NhbGV0ZW1wbzo6cmF0ZTwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+Wy0yLjE0NzQ4ZSswOSwyLjE0NzQ4ZSswOV08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+UGxheWJhY2sgUmF0ZTwvTklDSz4KKzxCTFVSQj5DdXJyZW50IHBsYXliYWNrIHJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNjYWxldGVtcG86OnNlYXJjaDwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDUwMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U2VhcmNoIExlbmd0aDwvTklDSz4KKzxCTFVSQj5MZW5ndGggaW4gbWlsbGlzZWNvbmRzIHRvIHNlYXJjaCBmb3IgYmVzdCBvdmVybGFwIHBvc2l0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4xNDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U2NhbGV0ZW1wbzo6c3RyaWRlPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsNTAwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlN0cmlkZSBMZW5ndGg8L05JQ0s+Cis8QkxVUkI+TGVuZ3RoIGluIG1pbGxpc2Vjb25kcyB0byBvdXRwdXQgZWFjaCBzdHJpZGUuPC9CTFVSQj4KKzxERUZBVUxUPjMwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFBNdXg6OnNlcW51bTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5TZXF1ZW5jZSBudW1iZXI8L05JQ0s+Cis8QkxVUkI+VGhlIFJUUCBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGxhc3QgcHJvY2Vzc2VkIHBhY2tldC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRQTXV4OjpzZXFudW0tb2Zmc2V0PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSBHX01BWFVMT05HPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TZXF1ZW5jZSBudW1iZXIgT2Zmc2V0PC9OSUNLPgorPEJMVVJCPk9mZnNldCB0byBhZGQgdG8gYWxsIG91dGdvaW5nIHNlcW51bSAoLTEgPSByYW5kb20pLjwvQkxVUkI+Cis8REVGQVVMVD4tMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRQTXV4Ojpzc3JjPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TU1JDPC9OSUNLPgorPEJMVVJCPlRoZSBTU1JDIG9mIHRoZSBwYWNrZXRzIChkZWZhdWx0ID09IHJhbmRvbSkuPC9CTFVSQj4KKzxERUZBVUxUPjQyOTQ5NjcyOTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUUE11eDo6dGltZXN0YW1wLW9mZnNldDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VGltZXN0YW1wIE9mZnNldDwvTklDSz4KKzxCTFVSQj5PZmZzZXQgdG8gYWRkIHRvIGFsbCBvdXRnb2luZyB0aW1lc3RhbXBzICgtMSA9IHJhbmRvbSkuPC9CTFVSQj4KKzxERUZBVUxUPi0xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBTQkNQYXk6Om1pbi1mcmFtZXM8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPm1pbmltdW0gZnJhbWUgbnVtYmVyPC9OSUNLPgorPEJMVVJCPk1pbmltdW0gcXVhbnRpdHkgb2YgZnJhbWVzIHRvIHNlbmQgaW4gb25lIHBhY2tldCAoLTEgZm9yIG1heGltdW0gYWxsb3dlZCBieSB0aGUgbXR1KS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRQRFRNRlNyYzo6Y2xvY2stcmF0ZTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Y2xvY2tyYXRlPC9OSUNLPgorPEJMVVJCPlRoZSBjbG9jay1yYXRlIGF0IHdoaWNoIHRvIGdlbmVyYXRlIHRoZSBkdG1mIHBhY2tldHMuPC9CTFVSQj4KKzxERUZBVUxUPjgwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUUERUTUZTcmM6OnBhY2tldC1yZWR1bmRhbmN5PC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsNV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBhY2tldCBSZWR1bmRhbmN5PC9OSUNLPgorPEJMVVJCPk51bWJlciBvZiBwYWNrZXRzIHRvIHNlbmQgdG8gaW5kaWNhdGUgc3RhcnQgYW5kIHN0b3AgZHRtZiBldmVudHMuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUUERUTUZTcmM6OnB0PC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMTI4PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5wYXlsb2FkIHR5cGU8L05JQ0s+Cis8QkxVUkI+VGhlIHBheWxvYWQgdHlwZSBvZiB0aGUgcGFja2V0cy48L0JMVVJCPgorPERFRkFVTFQ+OTY8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUUERUTUZTcmM6OnNlcW51bTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5TZXF1ZW5jZSBudW1iZXI8L05JQ0s+Cis8QkxVUkI+VGhlIFJUUCBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGxhc3QgcHJvY2Vzc2VkIHBhY2tldC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRQRFRNRlNyYzo6c2VxbnVtLW9mZnNldDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U2VxdWVuY2UgbnVtYmVyIE9mZnNldDwvTklDSz4KKzxCTFVSQj5PZmZzZXQgdG8gYWRkIHRvIGFsbCBvdXRnb2luZyBzZXFudW0gKC0xID0gcmFuZG9tKS48L0JMVVJCPgorPERFRkFVTFQ+LTE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUUERUTUZTcmM6OnNzcmM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNTUkM8L05JQ0s+Cis8QkxVUkI+VGhlIFNTUkMgb2YgdGhlIHBhY2tldHMgKC0xID09IHJhbmRvbSkuPC9CTFVSQj4KKzxERUZBVUxUPjQyOTQ5NjcyOTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUUERUTUZTcmM6OnRpbWVzdGFtcDwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5UaW1lc3RhbXA8L05JQ0s+Cis8QkxVUkI+VGhlIFJUUCB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgcHJvY2Vzc2VkIHBhY2tldC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRQRFRNRlNyYzo6dGltZXN0YW1wLW9mZnNldDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VGltZXN0YW1wIE9mZnNldDwvTklDSz4KKzxCTFVSQj5PZmZzZXQgdG8gYWRkIHRvIGFsbCBvdXRnb2luZyB0aW1lc3RhbXBzICgtMSA9IHJhbmRvbSkuPC9CTFVSQj4KKzxERUZBVUxUPi0xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBEVE1GRGVwYXk6Om1heC1kdXJhdGlvbjwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4aW11bSBkdXJhdGlvbjwvTklDSz4KKzxCTFVSQj5UaGUgbWF4dW1pbXVtIGR1cmF0aW9uIChtcykgb2YgdGhlIG91dGdvaW5nIHNvdW5kcGFja2V0LiAoMCA9IG5vIGxpbWl0KS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwRFRNRkRlcGF5Ojp1bml0LXRpbWU8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSAxMDAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EdXJhdGlvbiB1bml0dGltZTwvTklDSz4KKzxCTFVSQj5UaGUgc21hbGxlc3QgdW5pdCAobXMpIHRoZSBkdXJhdGlvbiBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgKDAgZGlzYWJsZXMgaXQpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3REVE1GU3JjOjppbnRlcnZhbDwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPlsxMCw1MF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludGVydmFsIGJldHdlZW4gdG9uZSBwYWNrZXRzPC9OSUNLPgorPEJMVVJCPkludGVydmFsIGluIG1zIGJldHdlZW4gdHdvIHRvbmUgcGFja2V0cy48L0JMVVJCPgorPERFRkFVTFQ+NTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cFZvcmJpc1BheTo6Y29uZmlnLWludGVydmFsPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMzYwMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q29uZmlnIFNlbmQgSW50ZXJ2YWw8L05JQ0s+Cis8QkxVUkI+U2VuZCBDb25maWcgSW5zZXJ0aW9uIEludGVydmFsIGluIHNlY29uZHMgKGNvbmZpZ3VyYXRpb24gaGVhZGVycyB3aWxsIGJlIG11bHRpcGxleGVkIGluIHRoZSBkYXRhIHN0cmVhbSB3aGVuIGRldGVjdGVkLikgKDAgPSBkaXNhYmxlZCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUUFJ0eFF1ZXVlOjptYXgtc2l6ZS1wYWNrZXRzPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXggU2l6ZSBQYWNrZXRzPC9OSUNLPgorPEJMVVJCPkFtb3VudCBvZiBwYWNrZXRzIHRvIHF1ZXVlICgwID0gdW5saW1pdGVkKS48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFBSdHhRdWV1ZTo6bWF4LXNpemUtdGltZTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4IFNpemUgVGltZXM8L05JQ0s+Cis8QkxVUkI+QW1vdW50IG9mIG1zIHRvIHF1ZXVlICgwID0gdW5saW1pdGVkKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRQUnR4UXVldWU6OmZ1bGZpbGxlZC1yZXF1ZXN0czwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5GdWxmaWxsZWQgUmVxdWVzdHM8L05JQ0s+Cis8QkxVUkI+TnVtYmVyIG9mIGZ1bGZpbGxlZCByZXRyYW5zbWlzc2lvbiByZXF1ZXN0cy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRQUnR4UXVldWU6OnJlcXVlc3RzPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPlJlcXVlc3RzPC9OSUNLPgorPEJMVVJCPlRvdGFsIG51bWJlciBvZiByZXRyYW5zbWlzc2lvbiByZXF1ZXN0cy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwR1NUUGF5Ojpjb25maWctaW50ZXJ2YWw8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSAzNjAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5DYXBzL1RhZ3MgU2VuZCBJbnRlcnZhbDwvTklDSz4KKzxCTFVSQj5JbnRlcnZhbCBmb3Igc2VuZGluZyBjYXBzIGFuZCBUQUcgZXZlbnRzIGluIHNlY29uZHMgKDAgPSBkaXNhYmxlZCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cFZQOFBheTo6cGljdHVyZS1pZC1tb2RlPC9OQU1FPgorPFRZUEU+R3N0VlA4UlRQUGF5TW9kZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBpY3R1cmUgSUQgTW9kZTwvTklDSz4KKzxCTFVSQj5UaGUgcGljdHVyZSBJRCBtb2RlIGZvciBwYXlsb2FkaW5nLjwvQkxVUkI+Cis8REVGQVVMVD5ObyBQaWN0dXJlIElEPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OmFybnItbWF4ZnJhbWVzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwxNV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkFsdFJlZiBtYXggZnJhbWVzPC9OSUNLPgorPEJMVVJCPkFsdFJlZiBtYXhpbXVtIG51bWJlciBvZiBmcmFtZXMuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6YXJuci1zdHJlbmd0aDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNl08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkFsdFJlZiBzdHJlbmd0aDwvTklDSz4KKzxCTFVSQj5BbHRSZWYgc3RyZW5ndGguPC9CTFVSQj4KKzxERUZBVUxUPjM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6YXJuci10eXBlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSwzXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QWx0UmVmIHR5cGU8L05JQ0s+Cis8QkxVUkI+QWx0UmVmIHR5cGUuPC9CTFVSQj4KKzxERUZBVUxUPjM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6YXV0by1hbHQtcmVmPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5BdXRvIGFsdCByZWZlcmVuY2UgZnJhbWVzPC9OSUNLPgorPEJMVVJCPkF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgQWx0UmVmIGZyYW1lcy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6YnVmZmVyLWluaXRpYWwtc2l6ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QnVmZmVyIGluaXRpYWwgc2l6ZTwvTklDSz4KKzxCTFVSQj5Jbml0aWFsIGNsaWVudCBidWZmZXIgc2l6ZSAobXMpLjwvQkxVUkI+Cis8REVGQVVMVD40MDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OmJ1ZmZlci1vcHRpbWFsLXNpemU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkJ1ZmZlciBvcHRpbWFsIHNpemU8L05JQ0s+Cis8QkxVUkI+T3B0aW1hbCBjbGllbnQgYnVmZmVyIHNpemUgKG1zKS48L0JMVVJCPgorPERFRkFVTFQ+NTAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjpidWZmZXItc2l6ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QnVmZmVyIHNpemU8L05JQ0s+Cis8QkxVUkI+Q2xpZW50IGJ1ZmZlciBzaXplIChtcykuPC9CTFVSQj4KKzxERUZBVUxUPjYwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6Y3B1LXVzZWQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlstMTYsMTZdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5DUFUgdXNlZDwvTklDSz4KKzxCTFVSQj5DUFUgdXNlZC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjpjcS1sZXZlbDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNjNdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Db25zdHJhaW5lZCBxdWFsaXR5IGxldmVsPC9OSUNLPgorPEJMVVJCPkNvbnN0cmFpbmVkIHF1YWxpdHkgbGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjEwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OmRlYWRsaW5lPC9OQU1FPgorPFRZUEU+Z2ludDY0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRlYWRsaW5lPC9OSUNLPgorPEJMVVJCPkRlYWRsaW5lIHBlciBmcmFtZSAodXNlYywgMD1kaXNhYmxlZCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6ZHJvcGZyYW1lLXRocmVzaG9sZDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RHJvcCBGcmFtZSBUaHJlc2hvbGQ8L05JQ0s+Cis8QkxVUkI+VGVtcG9yYWwgcmVzYW1wbGluZyB0aHJlc2hvbGQgKGJ1ZiAlKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjplbmQtdXNhZ2U8L05BTUU+Cis8VFlQRT5Hc3RWUDlFbmNFbmRVc2FnZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJhdGUgY29udHJvbCBtb2RlPC9OSUNLPgorPEJMVVJCPlJhdGUgY29udHJvbCBtb2RlLjwvQkxVUkI+Cis8REVGQVVMVD5WYXJpYWJsZSBCaXQgUmF0ZSAoVkJSKSBtb2RlPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OmVycm9yLXJlc2lsaWVudDwvTkFNRT4KKzxUWVBFPkdzdFZQOUVuY0VyRmxhZ3M8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5FcnJvciByZXNpbGllbnQ8L05JQ0s+Cis8QkxVUkI+RXJyb3IgcmVzaWxpZW5jZSBmbGFncy48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6Omhvcml6b250YWwtc2NhbGluZy1tb2RlPC9OQU1FPgorPFRZUEU+R3N0VlA5RW5jU2NhbGluZ01vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Ib3Jpem9udGFsIHNjYWxpbmcgbW9kZTwvTklDSz4KKzxCTFVSQj5Ib3Jpem9udGFsIHNjYWxpbmcgbW9kZS48L0JMVVJCPgorPERFRkFVTFQ+Tm9ybWFsPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OmtleWZyYW1lLW1heC1kaXN0PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5LZXlmcmFtZSBtYXggZGlzdGFuY2U8L05JQ0s+Cis8QkxVUkI+TWF4aW11bSBkaXN0YW5jZSBiZXR3ZWVuIGtleWZyYW1lcyAobnVtYmVyIG9mIGZyYW1lcykuPC9CTFVSQj4KKzxERUZBVUxUPjEyODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjprZXlmcmFtZS1tb2RlPC9OQU1FPgorPFRZUEU+R3N0VlA5RW5jS2ZNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+S2V5ZnJhbWUgTW9kZTwvTklDSz4KKzxCTFVSQj5LZXlmcmFtZSBwbGFjZW1lbnQuPC9CTFVSQj4KKzxERUZBVUxUPkRldGVybWluZSBvcHRpbWFsIHBsYWNlbWVudCBhdXRvbWF0aWNhbGx5PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OmxhZy1pbi1mcmFtZXM8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDI1XTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TGFnIGluIGZyYW1lczwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgdG8gbGFnLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6Om1heC1pbnRyYS1iaXRyYXRlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXggSW50cmEgYml0cmF0ZTwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIEludHJhIGZyYW1lIGJpdHJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6bWF4LXF1YW50aXplcjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNjNdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXhpbXVtIFF1YW50aXplcjwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIFF1YW50aXplciAod29yc3QpLjwvQkxVUkI+Cis8REVGQVVMVD42MzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjptaW4tcXVhbnRpemVyPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw2M108L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1pbmltdW0gUXVhbnRpemVyPC9OSUNLPgorPEJMVVJCPk1pbmltdW0gUXVhbnRpemVyIChiZXN0KS48L0JMVVJCPgorPERFRkFVTFQ+NDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjptdWx0aXBhc3MtY2FjaGUtZmlsZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk11bHRpcGFzcyBDYWNoZSBGaWxlPC9OSUNLPgorPEJMVVJCPk11bHRpcGFzcyBjYWNoZSBmaWxlLiBJZiBzdHJlYW0gY2FwcyByZWluaXRlZCwgbXVsdGlwbGUgZmlsZXMgd2lsbCBiZSBjcmVhdGVkOiBmaWxlLCBmaWxlLjEsIGZpbGUuMiwgLi4uIGFuZCBzbyBvbi48L0JMVVJCPgorPERFRkFVTFQ+Im11bHRpcGFzcy5jYWNoZSI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6bXVsdGlwYXNzLW1vZGU8L05BTUU+Cis8VFlQRT5Hc3RWUDlFbmNNdWx0aXBhc3NNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TXVsdGlwYXNzIE1vZGU8L05JQ0s+Cis8QkxVUkI+TXVsdGlwYXNzIGVuY29kZSBtb2RlLjwvQkxVUkI+Cis8REVGQVVMVD5PbmUgcGFzcyBlbmNvZGluZyAoZGVmYXVsdCk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6bm9pc2Utc2Vuc2l0aXZpdHk8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDZdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Ob2lzZSBzZW5zaXRpdml0eTwvTklDSz4KKzxCTFVSQj5Ob2lzZSBzZW5zaXNpdml0eSAoZnJhbWVzIHRvIGJsdXIpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6Om92ZXJzaG9vdDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk92ZXJzaG9vdCBQQ1Q8L05JQ0s+Cis8QkxVUkI+RGF0YXJhdGUgb3ZlcnNob290IChtYXgpIHRhcmdldCAoJSkuPC9CTFVSQj4KKzxERUZBVUxUPjEwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjpyZXNpemUtYWxsb3dlZDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UmVzaXplIEFsbG93ZWQ8L05JQ0s+Cis8QkxVUkI+QWxsb3cgc3BhdGlhbCByZXNhbXBsaW5nLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjpyZXNpemUtZG93bi10aHJlc2hvbGQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJlc2l6ZSBEb3duIFRocmVzaG9sZDwvTklDSz4KKzxCTFVSQj5Eb3duc2NhbGUgdGhyZXNob2xkIChidWYgJSkuPC9CTFVSQj4KKzxERUZBVUxUPjYwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OnJlc2l6ZS11cC10aHJlc2hvbGQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJlc2l6ZSBVcCBUaHJlc2hvbGQ8L05JQ0s+Cis8QkxVUkI+VXBzY2FsZSB0aHJlc2hvbGQgKGJ1ZiAlKS48L0JMVVJCPgorPERFRkFVTFQ+MzA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6c2hhcnBuZXNzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw3XTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U2hhcnBuZXNzPC9OSUNLPgorPEJMVVJCPkZpbHRlciBzaGFycG5lc3MuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6c3RhdGljLXRocmVzaG9sZDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U3RhdGljIFRocmVzaG9sZDwvTklDSz4KKzxCTFVSQj5Nb3Rpb24gZGV0ZWN0aW9uIHRocmVzaG9sZC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjp0YXJnZXQtYml0cmF0ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VGFyZ2V0IGJpdHJhdGU8L05JQ0s+Cis8QkxVUkI+VGFyZ2V0IGJpdHJhdGUgKGluIGJpdHMvc2VjKS48L0JMVVJCPgorPERFRkFVTFQ+MjU2MDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OnRlbXBvcmFsLXNjYWxhYmlsaXR5LWxheWVyLWlkPC9OQU1FPgorPFRZUEU+R1ZhbHVlQXJyYXkqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q29kaW5nIGxheWVyIGlkZW50aWZpY2F0aW9uPC9OSUNLPgorPEJMVVJCPlNlcXVlbmNlIGRlZmluaW5nIGNvZGluZyBsYXllciBtZW1iZXJzaGlwLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6dGVtcG9yYWwtc2NhbGFiaWxpdHktbnVtYmVyLWxheWVyczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsNV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk51bWJlciBvZiBjb2RpbmcgbGF5ZXJzPC9OSUNLPgorPEJMVVJCPk51bWJlciBvZiBjb2RpbmcgbGF5ZXJzIHRvIHVzZS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjp0ZW1wb3JhbC1zY2FsYWJpbGl0eS1wZXJpb2RpY2l0eTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMTZdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Db2RpbmcgbGF5ZXIgcGVyaW9kaWNpdHk8L05JQ0s+Cis8QkxVUkI+TGVuZ3RoIG9mIHNlcXVlbmNlIHRoYXQgZGVmaW5lcyBsYXllciBtZW1iZXJzaGlwIHBlcmlvZGljaXR5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OnRlbXBvcmFsLXNjYWxhYmlsaXR5LXJhdGUtZGVjaW1hdG9yPC9OQU1FPgorPFRZUEU+R1ZhbHVlQXJyYXkqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q29kaW5nIGxheWVyIHJhdGUgZGVjaW1hdG9yPC9OSUNLPgorPEJMVVJCPlJhdGUgZGVjaW1hdGlvbiBmYWN0b3JzIGZvciBlYWNoIGxheWVyLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6dGVtcG9yYWwtc2NhbGFiaWxpdHktdGFyZ2V0LWJpdHJhdGU8L05BTUU+Cis8VFlQRT5HVmFsdWVBcnJheSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Db2RpbmcgbGF5ZXIgdGFyZ2V0IGJpdHJhdGVzPC9OSUNLPgorPEJMVVJCPlRhcmdldCBiaXRyYXRlcyBmb3IgY29kaW5nIGxheWVycyAob25lIHBlciBsYXllciwgZGVjcmVhc2luZykuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjp0aHJlYWRzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw2NF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRocmVhZHM8L05JQ0s+Cis8QkxVUkI+TnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OnRpbWViYXNlPC9OQU1FPgorPFRZUEU+R3N0RnJhY3Rpb248L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TaG9ydGVzdCBpbnRlcmZyYW1lIHRpbWU8L05JQ0s+Cis8QkxVUkI+RnJhY3Rpb24gb2Ygb25lIHNlY29uZCB0aGF0IGlzIHRoZSBzaG9ydGVzdCBpbnRlcmZyYW1lIHRpbWUgLSBub3JtYWxseSBsZWZ0IGFzIHplcm8gd2hpY2ggd2lsbCBkZWZhdWx0IHRvIHRoZSBmcmFtZXJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjp0b2tlbi1wYXJ0aXRpb25zPC9OQU1FPgorPFRZUEU+R3N0VlA5RW5jVG9rZW5QYXJ0aXRpb25zPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VG9rZW4gcGFydGl0aW9uczwvTklDSz4KKzxCTFVSQj5OdW1iZXIgb2YgdG9rZW4gcGFydGl0aW9ucy48L0JMVVJCPgorPERFRkFVTFQ+T25lIHRva2VuIHBhcnRpdGlvbjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjp0dW5pbmc8L05BTUU+Cis8VFlQRT5Hc3RWUDlFbmNUdW5pbmc8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UdW5pbmc8L05JQ0s+Cis8QkxVUkI+VHVuaW5nLjwvQkxVUkI+Cis8REVGQVVMVD5UdW5lIGZvciBQU05SPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OnR3b3Bhc3MtdmJyLWJpYXM8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPjItcGFzcyBWQlIgYmlhczwvTklDSz4KKzxCTFVSQj5DQlIvVkJSIGJpYXMgKDA9Q0JSLCAxMDA9VkJSKS48L0JMVVJCPgorPERFRkFVTFQ+NTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6dHdvcGFzcy12YnItbWF4c2VjdGlvbjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Mi1wYXNzIEdPUCBtYXggYml0cmF0ZTwvTklDSz4KKzxCTFVSQj5HT1AgbWF4aW11bSBiaXRyYXRlICglIHRhcmdldCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6dHdvcGFzcy12YnItbWluc2VjdGlvbjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Mi1wYXNzIEdPUCBtaW4gYml0cmF0ZTwvTklDSz4KKzxCTFVSQj5HT1AgbWluaW11bSBiaXRyYXRlICglIHRhcmdldCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6dW5kZXJzaG9vdDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlVuZGVyc2hvb3QgUENUPC9OSUNLPgorPEJMVVJCPkRhdGFyYXRlIHVuZGVyc2hvb3QgKG1pbikgdGFyZ2V0ICglKS48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OnZlcnRpY2FsLXNjYWxpbmctbW9kZTwvTkFNRT4KKzxUWVBFPkdzdFZQOUVuY1NjYWxpbmdNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VmVydGljYWwgc2NhbGluZyBtb2RlPC9OSUNLPgorPEJMVVJCPlZlcnRpY2FsIHNjYWxpbmcgbW9kZS48L0JMVVJCPgorPERFRkFVTFQ+Tm9ybWFsPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlEZWM6OmRlYmxvY2tpbmctbGV2ZWw8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSAxNjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RGVibG9ja2luZyBMZXZlbDwvTklDSz4KKzxCTFVSQj5EZWJsb2NraW5nIGxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD40PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlEZWM6Om5vaXNlLWxldmVsPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMTY8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk5vaXNlIExldmVsPC9OSUNLPgorPEJMVVJCPk5vaXNlIGxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlEZWM6OnBvc3QtcHJvY2Vzc2luZzwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UG9zdCBQcm9jZXNzaW5nPC9OSUNLPgorPEJMVVJCPkVuYWJsZSBwb3N0IHByb2Nlc3NpbmcuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlEZWM6OnBvc3QtcHJvY2Vzc2luZy1mbGFnczwvTkFNRT4KKzxUWVBFPkdzdFZQOURlY1Bvc3RQcm9jZXNzaW5nRmxhZ3M8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qb3N0IFByb2Nlc3NpbmcgRmxhZ3M8L05JQ0s+Cis8QkxVUkI+RmxhZ3MgdG8gY29udHJvbCBwb3N0IHByb2Nlc3NpbmcuPC9CTFVSQj4KKzxERUZBVUxUPkRlYmxvY2t8RGVtYWNyb2Jsb2NrPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlEZWM6OnRocmVhZHM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT5bMSwxNl08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heCBUaHJlYWRzPC9OSUNLPgorPEJMVVJCPk1heGltdW0gbnVtYmVyIG9mIGRlY29kaW5nIHRocmVhZHMuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cFZSYXdQYXk6OmNodW5rcy1wZXItZnJhbWU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDE8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNodW5rcyBwZXIgRnJhbWU8L05JQ0s+Cis8QkxVUkI+U3BsaXQgYW5kIHNlbmQgb3V0IGVhY2ggZnJhbWUgaW4gbXVsdGlwbGUgY2h1bmtzIHRvIHJlZHVjZSBvdmVyaGVhZC48L0JMVVJCPgorPERFRkFVTFQ+MTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFB1c2hGaWxlU3JjOjphcHBsaWVkLXJhdGU8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPj49IEdfTUlORE9VQkxFPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5BcHBsaWVkIFJhdGU8L05JQ0s+Cis8QkxVUkI+QXBwbGllZCByYXRlIHRvIHVzZSBpbiBUSU1FIFNFR01FTlQuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFB1c2hGaWxlU3JjOjppbml0aWFsLXRpbWVzdGFtcDwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Jbml0aWFsIFRpbWVzdGFtcDwvTklDSz4KKzxCTFVSQj5Jbml0aWFsIEJ1ZmZlciBUaW1lc3RhbXAgKGlmIHRpbWUtc2VnbWVudCBUUlVFKS48L0JMVVJCPgorPERFRkFVTFQ+MTg0NDY3NDQwNzM3MDk1NTE2MTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFB1c2hGaWxlU3JjOjpsb2NhdGlvbjwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZpbGUgTG9jYXRpb248L05JQ0s+Cis8QkxVUkI+TG9jYXRpb24gb2YgdGhlIGZpbGUgdG8gcmVhZC48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UHVzaEZpbGVTcmM6OnJhdGU8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPj49IEdfTUlORE9VQkxFPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SYXRlPC9OSUNLPgorPEJMVVJCPlJhdGUgdG8gdXNlIGluIFRJTUUgU0VHTUVOVC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UHVzaEZpbGVTcmM6OnN0YXJ0LXRpbWU8L05BTUU+Cis8VFlQRT5naW50NjQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U3RhcnQgVGltZTwvTklDSz4KKzxCTFVSQj5Jbml0aWFsIFN0YXJ0IFRpbWUgKGlmIHRpbWUtc2VnbWVudCBUUlVFKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UHVzaEZpbGVTcmM6OnN0cmVhbS10aW1lPC9OQU1FPgorPFRZUEU+Z2ludDY0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlN0cmVhbSBUaW1lPC9OSUNLPgorPEJMVVJCPkluaXRpYWwgU3RyZWFtIFRpbWUgKGlmIHRpbWUtc2VnbWVudCBUUlVFKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UHVzaEZpbGVTcmM6OnRpbWUtc2VnbWVudDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VGltZSBTZWdtZW50PC9OSUNLPgorPEJMVVJCPkVtaXQgVElNRSBTRUdNRU5UUy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNwbGl0TXV4U3JjOjpsb2NhdGlvbjwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZpbGUgSW5wdXQgUGF0dGVybjwvTklDSz4KKzxCTFVSQj5HbG9iIHBhdHRlcm4gZm9yIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZXMgdG8gcmVhZC48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BsaXRNdXhTaW5rOjpsb2NhdGlvbjwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZpbGUgT3V0cHV0IFBhdHRlcm48L05JQ0s+Cis8QkxVUkI+Rm9ybWF0IHN0cmluZyBwYXR0ZXJuIGZvciB0aGUgbG9jYXRpb24gb2YgdGhlIGZpbGVzIHRvIHdyaXRlIChlLmcuIHZpZGVvJTA1ZC5tcDQpLjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTcGxpdE11eFNpbms6Om1heC1zaXplLWJ5dGVzPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heC4gc2l6ZSBieXRlczwvTklDSz4KKzxCTFVSQj5NYXguIGFtb3VudCBvZiBkYXRhIHBlciBmaWxlIChpbiBieXRlcywgMD1kaXNhYmxlKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BsaXRNdXhTaW5rOjptYXgtc2l6ZS10aW1lPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heC4gc2l6ZSAobnMpPC9OSUNLPgorPEJMVVJCPk1heC4gYW1vdW50IG9mIHRpbWUgcGVyIGZpbGUgKGluIG5zLCAwPWRpc2FibGUpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTcGxpdE11eFNpbms6Om11eC1vdmVyaGVhZDwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk11eGluZyBPdmVyaGVhZDwvTklDSz4KKzxCTFVSQj5FeHRyYSBzaXplIG92ZXJoZWFkIG9mIG11eGluZyAoMC4wMiA9IDIlKS48L0JMVVJCPgorPERFRkFVTFQ+MC4wMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BsaXRNdXhTaW5rOjptdXhlcjwvTkFNRT4KKzxUWVBFPkdzdEVsZW1lbnQqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TXV4ZXI8L05JQ0s+Cis8QkxVUkI+VGhlIG11eGVyIGVsZW1lbnQgdG8gdXNlIChOVUxMID0gZGVmYXVsdCBtcDRtdXgpLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNwbGl0TXV4U2luazo6c2luazwvTkFNRT4KKzxUWVBFPkdzdEVsZW1lbnQqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U2luazwvTklDSz4KKzxCTFVSQj5UaGUgc2luayBlbGVtZW50IChvciBlbGVtZW50IGNoYWluKSB0byB1c2UgKE5VTEwgPSBkZWZhdWx0IGZpbGVzaW5rKS48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTcGxpdE11eFNpbms6Om1heC1maWxlczwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4IGZpbGVzPC9OSUNLPgorPEJMVVJCPk1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRvIGtlZXAgb24gZGlzay4gT25jZSB0aGUgbWF4aW11bSBpcyByZWFjaGVkLG9sZCBmaWxlcyBzdGFydCB0byBiZSBkZWxldGVkIHRvIG1ha2Ugcm9vbSBmb3IgbmV3IG9uZXMuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNwbGl0TXV4U2luazo6c2VuZC1rZXlmcmFtZS1yZXF1ZXN0czwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UmVxdWVzdCBrZXlmcmFtZXMgYXQgbWF4LXNpemUtdGltZTwvTklDSz4KKzxCTFVSQj5SZXF1ZXN0IGEga2V5ZnJhbWUgZXZlcnkgbWF4LXNpemUtdGltZSBucyB0byB0cnkgc3BsaXR0aW5nIGF0IHRoYXQgcG9pbnQuIE5lZWRzIG1heC1zaXplLWJ5dGVzIHRvIGJlIDAgaW4gb3JkZXIgdG8gYmUgZWZmZWN0aXZlLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BsaXRNdXhTaW5rOjptYXgtc2l6ZS10aW1lY29kZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heGltdW0gdGltZWNvZGUgZGlmZmVyZW5jZTwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIGRpZmZlcmVuY2UgaW4gdGltZWNvZGUgYmV0d2VlbiBmaXJzdCBhbmQgbGFzdCBmcmFtZS4gU2VwYXJhdG9yIGlzIGFzc3VtZWQgdG8gYmUgIjoiIGV2ZXJ5d2hlcmUgKGUuZy4gMDE6MDA6MDA6MDApLiBXaWxsIG9ubHkgYmUgZWZmZWN0aXZlIGlmIGEgdGltZWNvZGUgdHJhY2sgaXMgcHJlc2VudC48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BsaXRNdXhTaW5rOjphbGlnbm1lbnQtdGhyZXNob2xkPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkFsaWdubWVudCB0aHJlc2hvbGQgKG5zKTwvTklDSz4KKzxCTFVSQj5BbGxvdyBub24tcmVmZXJlbmNlIHN0cmVhbXMgdG8gYmUgdGhhdCBtYW55IG5zIGJlZm9yZSB0aGUgcmVmZXJlbmNlIHN0cmVhbS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BsaXRNdXhTaW5rOjp1c2Utcm9idXN0LW11eGluZzwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U3VwcG9ydCByb2J1c3QtbXV4aW5nIG1vZGUgb2Ygc29tZSBtdXhlcnM8L05JQ0s+Cis8QkxVUkI+Q2hlY2sgaWYgbXV4ZXJzIHN1cHBvcnQgcm9idXN0IG11eGluZyB2aWEgdGhlIHJlc2VydmVkLW1heC1kdXJhdGlvbiBhbmQgcmVzZXJ2ZWQtZHVyYXRpb24tcmVtYWluaW5nIHByb3BlcnRpZXMgYW5kIHVzZSB0aGVtIGlmIHNvLiAoT25seSBwcmVzZW50IG9uIHF0bXV4IGFuZCBtcDRtdXggZm9yIG5vdykuIHNwbGl0bXV4c2luayBtYXkgdGhlbiBhbHNvICBjcmVhdGUgbmV3IGZyYWdtZW50cyBpZiB0aGUgcmVzZXJ2ZWQgaGVhZGVyIHNwYWNlIGlzIGFib3V0IHRvIG92ZXJmbG93LiBOb3RlIHRoaXMgZG9lcyBub3Qgc2V0IHJlc2VydmVkLW1vb3YtdXBkYXRlLXBlcmlvZCAtIGFwcHMgc2hvdWxkIGRvIHRoYXQgbWFudWFsbHkuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBWUDlQYXk6OnBpY3R1cmUtaWQtbW9kZTwvTkFNRT4KKzxUWVBFPkdzdFZQOVJUUFBheU1vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5QaWN0dXJlIElEIE1vZGU8L05JQ0s+Cis8QkxVUkI+VGhlIHBpY3R1cmUgSUQgbW9kZSBmb3IgcGF5bG9hZGluZy48L0JMVVJCPgorPERFRkFVTFQ+Tm8gUGljdHVyZSBJRDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSDI2NVBheTo6Y29uZmlnLWludGVydmFsPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bR19NQVhVTE9ORywzNjAwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VlBTIFNQUyBQUFMgU2VuZCBJbnRlcnZhbDwvTklDSz4KKzxCTFVSQj5TZW5kIFZQUywgU1BTIGFuZCBQUFMgSW5zZXJ0aW9uIEludGVydmFsIGluIHNlY29uZHMgKHNwcm9wIHBhcmFtZXRlciBzZXRzIHdpbGwgYmUgbXVsdGlwbGV4ZWQgaW4gdGhlIGRhdGEgc3RyZWFtIHdoZW4gZGV0ZWN0ZWQuKSAoMCA9IGRpc2FibGVkLCAtMSA9IHNlbmQgd2l0aCBldmVyeSBJRFIgZnJhbWUpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBIMjY1UGF5OjpzcHJvcC1wYXJhbWV0ZXItc2V0czwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPnNwcm9wLXBhcmFtZXRlci1zZXRzPC9OSUNLPgorPEJMVVJCPlRoZSBiYXNlNjQgc3Byb3AtcGFyYW1ldGVyLXNldHMgdG8gc2V0IGluIG91dCBjYXBzIChzZXQgdG8gTlVMTCB0byBleHRyYWN0IGZyb20gc3RyZWFtKS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TGFtZU1QM0VuYzo6Yml0cmF0ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzgsMzIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJpdHJhdGUgKGtiL3MpPC9OSUNLPgorPEJMVVJCPkJpdHJhdGUgaW4ga2JpdC9zZWMgKE9ubHkgdmFsaWQgaWYgdGFyZ2V0IGlzIGJpdHJhdGUsIGZvciBDQlIgb25lIG9mIDgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYgb3IgMzIwKS48L0JMVVJCPgorPERFRkFVTFQ+MTI4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RMYW1lTVAzRW5jOjpjYnI8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5DQlI8L05JQ0s+Cis8QkxVUkI+RW5mb3JjZSBjb25zdGFudCBiaXRyYXRlIGVuY29kaW5nIChPbmx5IHZhbGlkIGlmIHRhcmdldCBpcyBiaXRyYXRlKS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdExhbWVNUDNFbmM6OmVuY29kaW5nLWVuZ2luZS1xdWFsaXR5PC9OQU1FPgorPFRZUEU+R3N0TGFtZU1QM0VuY0VuY29kaW5nRW5naW5lUXVhbGl0eTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5FbmNvZGluZyBFbmdpbmUgUXVhbGl0eTwvTklDSz4KKzxCTFVSQj5RdWFsaXR5L3NwZWVkIG9mIHRoZSBlbmNvZGluZyBlbmdpbmUsIHRoaXMgZG9lcyBub3QgYWZmZWN0IHRoZSBiaXRyYXRlIS48L0JMVVJCPgorPERFRkFVTFQ+U3RhbmRhcmQ8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdExhbWVNUDNFbmM6Om1vbm88L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Nb25vPC9OSUNLPgorPEJMVVJCPkVuZm9yY2UgbW9ubyBlbmNvZGluZy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdExhbWVNUDNFbmM6OnF1YWxpdHk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsOS45OTldPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UXVhbGl0eTwvTklDSz4KKzxCTFVSQj5WQlIgUXVhbGl0eSBmcm9tIDAgdG8gMTAsIDAgYmVpbmcgdGhlIGJlc3QgKE9ubHkgdmFsaWQgaWYgdGFyZ2V0IGlzIHF1YWxpdHkpLjwvQkxVUkI+Cis8REVGQVVMVD40PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RMYW1lTVAzRW5jOjp0YXJnZXQ8L05BTUU+Cis8VFlQRT5Hc3RMYW1lTVAzRW5jVGFyZ2V0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRhcmdldDwvTklDSz4KKzxCTFVSQj5PcHRpbWl6ZSBmb3IgcXVhbGl0eSBvciBiaXRyYXRlLjwvQkxVUkI+Cis8REVGQVVMVD5RdWFsaXR5PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RUd29MYW1lOjphdGgtbGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5BVEggTGV2ZWw8L05JQ0s+Cis8QkxVUkI+QVRIIExldmVsIGluIGRCLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RUd29MYW1lOjpiaXRyYXRlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bOCwzODRdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CaXRyYXRlIChrYi9zKTwvTklDSz4KKzxCTFVSQj5CaXRyYXRlIGluIGtiaXQvc2VjICg4LCAxNiwgMjQsIDMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTQ0LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMCwgMzg0KS48L0JMVVJCPgorPERFRkFVTFQ+MTkyPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RUd29MYW1lOjpjb3B5cmlnaHQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNvcHlyaWdodDwvTklDSz4KKzxCTFVSQj5NYXJrIGFzIGNvcHlyaWdodC48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFR3b0xhbWU6OmVtcGhhc2lzPC9OQU1FPgorPFRZUEU+R3N0VHdvTGFtZUVtcGhhc2lzPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RW1waGFzaXM8L05JQ0s+Cis8QkxVUkI+UHJlLWVtcGhhc2lzIHRvIGFwcGx5IHRvIHRoZSBkZWNvZGVkIGF1ZGlvLjwvQkxVUkI+Cis8REVGQVVMVD5ObyBlbXBoYXNpczwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VHdvTGFtZTo6ZW5lcmd5LWxldmVsLWV4dGVuc2lvbjwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RW5lcmd5IExldmVsIEV4dGVuc2lvbjwvTklDSz4KKzxCTFVSQj5Xcml0ZSBwZWFrIFBDTSBsZXZlbCB0byBlYWNoIGZyYW1lLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VHdvTGFtZTo6ZXJyb3ItcHJvdGVjdGlvbjwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RXJyb3IgcHJvdGVjdGlvbjwvTklDSz4KKzxCTFVSQj5BZGRzIGNoZWNrc3VtIHRvIGV2ZXJ5IGZyYW1lLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VHdvTGFtZTo6bW9kZTwvTkFNRT4KKzxUWVBFPkdzdFR3b0xhbWVNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TW9kZTwvTklDSz4KKzxCTFVSQj5FbmNvZGluZyBtb2RlLjwvQkxVUkI+Cis8REVGQVVMVD5Kb2ludCBTdGVyZW88L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFR3b0xhbWU6Om9yaWdpbmFsPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5PcmlnaW5hbDwvTklDSz4KKzxCTFVSQj5NYXJrIGFzIG9yaWdpbmFsLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RUd29MYW1lOjpwYWRkaW5nPC9OQU1FPgorPFRZUEU+R3N0VHdvTGFtZVBhZGRpbmc8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5QYWRkaW5nPC9OSUNLPgorPEJMVVJCPlBhZGRpbmcgdHlwZS48L0JMVVJCPgorPERFRkFVTFQ+Tm8gUGFkZGluZzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VHdvTGFtZTo6cHN5bW9kZWw8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPltHX01BWFVMT05HLDRdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qc3ljaG9hY291c3RpYyBNb2RlbDwvTklDSz4KKzxCTFVSQj5Qc3ljaG9hY291c3RpYyBtb2RlbCB1c2VkIHRvIGVuY29kZSB0aGUgYXVkaW8uPC9CTFVSQj4KKzxERUZBVUxUPjM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFR3b0xhbWU6OnF1aWNrLW1vZGU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlF1aWNrIG1vZGU8L05JQ0s+Cis8QkxVUkI+Q2FsY3VsYXRlIFBzeW1vZGVsIGV2ZXJ5IGZyYW1lcy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFR3b0xhbWU6OnF1aWNrLW1vZGUtY291bnQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlF1aWNrIG1vZGUgY291bnQ8L05JQ0s+Cis8QkxVUkI+Q2FsY3VsYXRlIFBzeW1vZGVsIGV2ZXJ5IG4gZnJhbWVzLjwvQkxVUkI+Cis8REVGQVVMVD4xMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VHdvTGFtZTo6dmJyPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5WQlI8L05JQ0s+Cis8QkxVUkI+RW5hYmxlIHZhcmlhYmxlIGJpdHJhdGUgbW9kZS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFR3b0xhbWU6OnZici1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEwLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VkJSIExldmVsPC9OSUNLPgorPEJMVVJCPlZCUiBMZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VHdvTGFtZTo6dmJyLW1heC1iaXRyYXRlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwzODRdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5WQlIgbWF4IGJpdHJhdGU8L05JQ0s+Cis8QkxVUkI+U3BlY2lmeSBtYXhpbXVtIFZCUiBiaXRyYXRlICgwPW9mZiwgOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAsIDM4NCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cFNiY0RlcGF5OjppZ25vcmUtdGltZXN0YW1wczwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SWdub3JlIFRpbWVzdGFtcHM8L05JQ0s+Cis8QkxVUkI+VmFyaW91cyBzdGF0aXN0aWNzLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeSBiL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NmFjYWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeQpAQCAtMCwwICsxLDM3OSBAQAorR09iamVjdAorICBHSU9TdHJlYW0KKyAgICBHVGxzQ29ubmVjdGlvbgorICBHSW5pdGlhbGx5VW5vd25lZAorICAgIEdzdE9iamVjdAorICAgICAgR3N0QWxsb2NhdG9yCisgICAgICAgIEdzdEFsbG9jYXRvclN5c21lbQorICAgICAgR3N0QXVkaW9SaW5nQnVmZmVyCisgICAgICAgIEdzdEF1ZGlvU2lua1JpbmdCdWZmZXIKKyAgICAgICAgR3N0QXVkaW9TcmNSaW5nQnVmZmVyCisgICAgICAgIEdzdEphY2tBdWRpb1NpbmtSaW5nQnVmZmVyCisgICAgICAgIEdzdEphY2tBdWRpb1NyY1JpbmdCdWZmZXIKKyAgICAgIEdzdEJ1cworICAgICAgR3N0Q2xvY2sKKyAgICAgICAgR3N0U3lzdGVtQ2xvY2sKKyAgICAgICAgICBHc3RBdWRpb0Nsb2NrCisgICAgICBHc3RDb250cm9sQmluZGluZworICAgICAgR3N0Q29udHJvbFNvdXJjZQorICAgICAgR3N0RGV2aWNlUHJvdmlkZXIKKyAgICAgICAgR3N0UHVsc2VEZXZpY2VQcm92aWRlcgorICAgICAgICBHc3RWNGwyRGV2aWNlUHJvdmlkZXIKKyAgICAgIEdzdEVsZW1lbnQKKyAgICAgICAgR3N0M0dQUE11eAorICAgICAgICBHc3RBZ2dyZWdhdG9yCisgICAgICAgICAgR3N0Rmx2TXV4CisgICAgICAgIEdzdEFzdGVyaXNraDI2MworICAgICAgICBHc3RBdVBhcnNlCisgICAgICAgIEdzdEF1ZGlvRGVjb2RlcgorICAgICAgICAgIEdzdEFMYXdEZWMKKyAgICAgICAgICBHc3RGbGFjRGVjCisgICAgICAgICAgR3N0TXBnMTIzQXVkaW9EZWMKKyAgICAgICAgICBHc3RNdUxhd0RlYworICAgICAgICAgIEdzdFNwZWV4RGVjCisgICAgICAgICAgR3N0V2F2cGFja0RlYworICAgICAgICBHc3RBdWRpb0VuY29kZXIKKyAgICAgICAgICBHc3RBTGF3RW5jCisgICAgICAgICAgR3N0RmxhY0VuYworICAgICAgICAgIEdzdExhbWVNUDNFbmMKKyAgICAgICAgICBHc3RNdUxhd0VuYworICAgICAgICAgIEdzdFNwZWV4RW5jCisgICAgICAgICAgR3N0VHdvTGFtZQorICAgICAgICAgIEdzdFdhdnBhY2tFbmMKKyAgICAgICAgR3N0QXVkaW9WaXN1YWxpemVyCisgICAgICAgICAgR3N0R29vbQorICAgICAgICAgIEdzdEdvb20yazEKKyAgICAgICAgR3N0QXZpRGVtdXgKKyAgICAgICAgR3N0QXZpTXV4CisgICAgICAgIEdzdEF2aVN1YnRpdGxlCisgICAgICAgIEdzdEJhc2VQYXJzZQorICAgICAgICAgIEdzdEFhY1BhcnNlCisgICAgICAgICAgR3N0QWMzUGFyc2UKKyAgICAgICAgICBHc3RBbXJQYXJzZQorICAgICAgICAgIEdzdERjYVBhcnNlCisgICAgICAgICAgR3N0RmxhY1BhcnNlCisgICAgICAgICAgR3N0TXBlZ0F1ZGlvUGFyc2UKKyAgICAgICAgICBHc3RSdHBTdHJlYW1EZXBheQorICAgICAgICAgIEdzdFNiY1BhcnNlCisgICAgICAgICAgR3N0V2F2cGFja1BhcnNlCisgICAgICAgIEdzdEJhc2VTaW5rCisgICAgICAgICAgR3N0QXVkaW9CYXNlU2luaworICAgICAgICAgICAgR3N0QXVkaW9TaW5rCisgICAgICAgICAgICAgIEdzdE9zczRTaW5rCisgICAgICAgICAgICAgIEdzdE9zc1NpbmsKKyAgICAgICAgICAgIEdzdEphY2tBdWRpb1NpbmsKKyAgICAgICAgICAgIEdzdFB1bHNlU2luaworICAgICAgICAgIEdzdENBQ0FTaW5rCisgICAgICAgICAgR3N0RHluVURQU2luaworICAgICAgICAgIEdzdE11bHRpRmlsZVNpbmsKKyAgICAgICAgICBHc3RNdWx0aVVEUFNpbmsKKyAgICAgICAgICAgIEdzdFVEUFNpbmsKKyAgICAgICAgICBHc3RTaG91dDJzZW5kCisgICAgICAgICAgR3N0U291cEh0dHBDbGllbnRTaW5rCisgICAgICAgICAgR3N0VGVzdAorICAgICAgICAgIEdzdFZpZGVvU2luaworICAgICAgICAgICAgR3N0QUFTaW5rCisgICAgICAgICAgICBHc3RHZGtQaXhidWZTaW5rCisgICAgICAgICAgICBHc3RHdGtCYXNlU2luaworICAgICAgICAgICAgICBHc3RHdGtHTFNpbmsKKyAgICAgICAgICAgICAgR3N0R3RrU2luaworICAgICAgICAgICAgR3N0VjRsMlNpbmsKKyAgICAgICAgR3N0QmFzZVNyYworICAgICAgICAgIEdzdERUTUZTcmMKKyAgICAgICAgICBHc3RQdXNoU3JjCisgICAgICAgICAgICBHc3RBdWRpb0Jhc2VTcmMKKyAgICAgICAgICAgICAgR3N0QXVkaW9TcmMKKyAgICAgICAgICAgICAgICBHc3RPc3M0U291cmNlCisgICAgICAgICAgICAgICAgR3N0T3NzU3JjCisgICAgICAgICAgICAgICAgR3N0UHVsc2VTcmMKKyAgICAgICAgICAgICAgR3N0SmFja0F1ZGlvU3JjCisgICAgICAgICAgICBHc3REVjEzOTRTcmMKKyAgICAgICAgICAgIEdzdEhEVjEzOTRTcmMKKyAgICAgICAgICAgIEdzdE11bHRpRmlsZVNyYworICAgICAgICAgICAgR3N0U291cEhUVFBTcmMKKyAgICAgICAgICAgIEdzdFVEUFNyYworICAgICAgICAgICAgR3N0VjRsMlNyYworICAgICAgICAgICAgR3N0WEltYWdlU3JjCisgICAgICAgICAgR3N0UlRQRFRNRlNyYworICAgICAgICAgIEdzdFNwbGl0RmlsZVNyYworICAgICAgICBHc3RCYXNlVHJhbnNmb3JtCisgICAgICAgICAgR3N0QXVkaW9GaWx0ZXIKKyAgICAgICAgICAgIEdzdEF1ZGlvQW1wbGlmeQorICAgICAgICAgICAgR3N0QXVkaW9EeW5hbWljCisgICAgICAgICAgICBHc3RBdWRpb0VjaG8KKyAgICAgICAgICAgIEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyCisgICAgICAgICAgICAgIEdzdEF1ZGlvRklSRmlsdGVyCisgICAgICAgICAgICAgIEdzdEF1ZGlvV1NpbmNCYW5kCisgICAgICAgICAgICAgIEdzdEF1ZGlvV1NpbmNMaW1pdAorICAgICAgICAgICAgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXIKKyAgICAgICAgICAgICAgR3N0QXVkaW9DaGViQmFuZAorICAgICAgICAgICAgICBHc3RBdWRpb0NoZWJMaW1pdAorICAgICAgICAgICAgICBHc3RBdWRpb0lJUkZpbHRlcgorICAgICAgICAgICAgR3N0QXVkaW9JbnZlcnQKKyAgICAgICAgICAgIEdzdEF1ZGlvS2FyYW9rZQorICAgICAgICAgICAgR3N0SWlyRXF1YWxpemVyCisgICAgICAgICAgICAgIEdzdElpckVxdWFsaXplcjEwQmFuZHMKKyAgICAgICAgICAgICAgR3N0SWlyRXF1YWxpemVyM0JhbmRzCisgICAgICAgICAgICAgIEdzdElpckVxdWFsaXplck5CYW5kcworICAgICAgICAgICAgR3N0U3BlY3RydW0KKyAgICAgICAgICBHc3RBdWRpb1Bhbm9yYW1hCisgICAgICAgICAgR3N0QnJlYWtNeURhdGEKKyAgICAgICAgICBHc3RDYXBzU2V0dGVyCisgICAgICAgICAgR3N0Q3B1UmVwb3J0CisgICAgICAgICAgR3N0TGV2ZWwKKyAgICAgICAgICBHc3ROYXZTZWVrCisgICAgICAgICAgR3N0UHJvZ3Jlc3NSZXBvcnQKKyAgICAgICAgICBHc3RSZ0FuYWx5c2lzCisgICAgICAgICAgR3N0UmdMaW1pdGVyCisgICAgICAgICAgR3N0U2NhbGV0ZW1wbworICAgICAgICAgIEdzdFRhZ0luamVjdAorICAgICAgICAgIEdzdFZpZGVvRmlsdGVyCisgICAgICAgICAgICBHc3RBZ2luZ1RWCisgICAgICAgICAgICBHc3RBbHBoYQorICAgICAgICAgICAgR3N0QWxwaGFDb2xvcgorICAgICAgICAgICAgR3N0Q2Fpcm9PdmVybGF5CisgICAgICAgICAgICBHc3REaWNlVFYKKyAgICAgICAgICAgIEdzdEVkZ2VUVgorICAgICAgICAgICAgR3N0R2FtbWEKKyAgICAgICAgICAgIEdzdEdka1BpeGJ1Zk92ZXJsYXkKKyAgICAgICAgICAgIEdzdE5hdmlnYXRpb250ZXN0CisgICAgICAgICAgICBHc3RPcFRWCisgICAgICAgICAgICBHc3RRdWFya1RWCisgICAgICAgICAgICBHc3RSYWRpb2FjVFYKKyAgICAgICAgICAgIEdzdFJldlRWCisgICAgICAgICAgICBHc3RSaXBwbGVUVgorICAgICAgICAgICAgR3N0U01QVEVBbHBoYQorICAgICAgICAgICAgR3N0U2hhZ2FkZWxpY1RWCisgICAgICAgICAgICBHc3RTdHJlYWtUVgorICAgICAgICAgICAgR3N0VmVydGlnb1RWCisgICAgICAgICAgICBHc3RWaWRlb0JhbGFuY2UKKyAgICAgICAgICAgIEdzdFZpZGVvQm94CisgICAgICAgICAgICBHc3RWaWRlb0Nyb3AKKyAgICAgICAgICAgIEdzdFZpZGVvRmxpcAorICAgICAgICAgICAgR3N0VmlkZW9NZWRpYW4KKyAgICAgICAgICAgIEdzdFdhcnBUVgorICAgICAgICBHc3RCaW4KKyAgICAgICAgICBHc3RBc3BlY3RSYXRpb0Nyb3AKKyAgICAgICAgICBHc3RBdXRvRGV0ZWN0CisgICAgICAgICAgICBHc3RBdXRvQXVkaW9TaW5rCisgICAgICAgICAgICBHc3RBdXRvQXVkaW9TcmMKKyAgICAgICAgICAgIEdzdEF1dG9WaWRlb1NpbmsKKyAgICAgICAgICAgIEdzdEF1dG9WaWRlb1NyYworICAgICAgICAgIEdzdFBpcGVsaW5lCisgICAgICAgICAgICBHc3RRVE1vb3ZSZWNvdmVyCisgICAgICAgICAgR3N0UHVzaEZpbGVTcmMKKyAgICAgICAgICBHc3RSVFNQU3JjCisgICAgICAgICAgR3N0UmdWb2x1bWUKKyAgICAgICAgICBHc3RSdHBCaW4KKyAgICAgICAgICBHc3RTcGxpdE11eFNpbmsKKyAgICAgICAgICBHc3RTcGxpdE11eFNyYworICAgICAgICBHc3RDdXR0ZXIKKyAgICAgICAgR3N0RFZEZWMKKyAgICAgICAgR3N0RFZEZW11eAorICAgICAgICBHc3REZWludGVybGFjZQorICAgICAgICBHc3REZWludGVybGVhdmUKKyAgICAgICAgR3N0RmxhY1RhZworICAgICAgICBHc3RGbHZEZW11eAorICAgICAgICBHc3RGbHhEZWMKKyAgICAgICAgR3N0R2RrUGl4YnVmRGVjCisgICAgICAgIEdzdElDWURlbXV4CisgICAgICAgIEdzdElTTUxNdXgKKyAgICAgICAgR3N0SW1hZ2VGcmVlemUKKyAgICAgICAgR3N0SW50ZXJsZWF2ZQorICAgICAgICBHc3RNSjJNdXgKKyAgICAgICAgR3N0TVA0TXV4CisgICAgICAgIEdzdE1hdHJvc2thRGVtdXgKKyAgICAgICAgR3N0TWF0cm9za2FNdXgKKyAgICAgICAgICBHc3RXZWJNTXV4CisgICAgICAgIEdzdE1hdHJvc2thUGFyc2UKKyAgICAgICAgR3N0TXVsdGlwYXJ0RGVtdXgKKyAgICAgICAgR3N0TXVsdGlwYXJ0TXV4CisgICAgICAgIEdzdFFURGVtdXgKKyAgICAgICAgR3N0UVRNdXgKKyAgICAgICAgR3N0UlRQQmFzZURlcGF5bG9hZAorICAgICAgICAgIEdzdFJUUEJWRGVwYXkKKyAgICAgICAgICBHc3RSVFBEVkRlcGF5CisgICAgICAgICAgR3N0UlRQR1NNRGVwYXkKKyAgICAgICAgICBHc3RSVFBPcHVzRGVwYXkKKyAgICAgICAgICBHc3RSVFBTaXJlbkRlcGF5CisgICAgICAgICAgR3N0UlRQaUxCQ0RlcGF5CisgICAgICAgICAgR3N0UnRwQUMzRGVwYXkKKyAgICAgICAgICBHc3RSdHBBTVJEZXBheQorICAgICAgICAgIEdzdFJ0cENFTFREZXBheQorICAgICAgICAgIEdzdFJ0cERUTUZEZXBheQorICAgICAgICAgIEdzdFJ0cEc3MjJEZXBheQorICAgICAgICAgIEdzdFJ0cEc3MjNEZXBheQorICAgICAgICAgIEdzdFJ0cEc3MjZEZXBheQorICAgICAgICAgIEdzdFJ0cEc3MjlEZXBheQorICAgICAgICAgIEdzdFJ0cEdTVERlcGF5CisgICAgICAgICAgR3N0UnRwSDI2MURlcGF5CisgICAgICAgICAgR3N0UnRwSDI2M0RlcGF5CisgICAgICAgICAgR3N0UnRwSDI2M1BEZXBheQorICAgICAgICAgIEdzdFJ0cEgyNjREZXBheQorICAgICAgICAgIEdzdFJ0cEgyNjVEZXBheQorICAgICAgICAgIEdzdFJ0cEoyS0RlcGF5CisgICAgICAgICAgR3N0UnRwSlBFR0RlcGF5CisgICAgICAgICAgR3N0UnRwS2x2RGVwYXkKKyAgICAgICAgICBHc3RSdHBMMTZEZXBheQorICAgICAgICAgIEdzdFJ0cEwyNERlcGF5CisgICAgICAgICAgR3N0UnRwTDhEZXBheQorICAgICAgICAgIEdzdFJ0cE1QMVNEZXBheQorICAgICAgICAgIEdzdFJ0cE1QMlREZXBheQorICAgICAgICAgIEdzdFJ0cE1QNEFEZXBheQorICAgICAgICAgIEdzdFJ0cE1QNEdEZXBheQorICAgICAgICAgIEdzdFJ0cE1QNFZEZXBheQorICAgICAgICAgIEdzdFJ0cE1QQURlcGF5CisgICAgICAgICAgR3N0UnRwTVBBUm9idXN0RGVwYXkKKyAgICAgICAgICBHc3RSdHBNUFZEZXBheQorICAgICAgICAgIEdzdFJ0cFBjbWFEZXBheQorICAgICAgICAgIEdzdFJ0cFBjbXVEZXBheQorICAgICAgICAgIEdzdFJ0cFFDRUxQRGVwYXkKKyAgICAgICAgICBHc3RSdHBRRE0yRGVwYXkKKyAgICAgICAgICBHc3RSdHBTUEVFWERlcGF5CisgICAgICAgICAgR3N0UnRwU1YzVkRlcGF5CisgICAgICAgICAgR3N0UnRwU2JjRGVwYXkKKyAgICAgICAgICBHc3RSdHBUaGVvcmFEZXBheQorICAgICAgICAgIEdzdFJ0cFZQOERlcGF5CisgICAgICAgICAgR3N0UnRwVlA5RGVwYXkKKyAgICAgICAgICBHc3RSdHBWUmF3RGVwYXkKKyAgICAgICAgICBHc3RSdHBWb3JiaXNEZXBheQorICAgICAgICAgIEdzdFJ0cFhRVERlcGF5CisgICAgICAgIEdzdFJUUEJhc2VQYXlsb2FkCisgICAgICAgICAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZAorICAgICAgICAgICAgR3N0UlRQQlZQYXkKKyAgICAgICAgICAgIEdzdFJUUElMQkNQYXkKKyAgICAgICAgICAgIEdzdFJUUFNpcmVuUGF5CisgICAgICAgICAgICBHc3RSdHBHNzIyUGF5CisgICAgICAgICAgICBHc3RSdHBHNzI2UGF5CisgICAgICAgICAgICBHc3RSdHBMMTZQYXkKKyAgICAgICAgICAgIEdzdFJ0cEwyNFBheQorICAgICAgICAgICAgR3N0UnRwTDhQYXkKKyAgICAgICAgICAgIEdzdFJ0cFBjbWFQYXkKKyAgICAgICAgICAgIEdzdFJ0cFBjbXVQYXkKKyAgICAgICAgICBHc3RSVFBEVlBheQorICAgICAgICAgIEdzdFJUUEc3MjNQYXkKKyAgICAgICAgICBHc3RSVFBHNzI5UGF5CisgICAgICAgICAgR3N0UlRQR1NNUGF5CisgICAgICAgICAgR3N0UlRQTVAyVFBheQorICAgICAgICAgIEdzdFJUUE1QVlBheQorICAgICAgICAgIEdzdFJ0cEFDM1BheQorICAgICAgICAgIEdzdFJ0cEFNUlBheQorICAgICAgICAgIEdzdFJ0cENFTFRQYXkKKyAgICAgICAgICBHc3RSdHBHU1RQYXkKKyAgICAgICAgICBHc3RSdHBIMjYxUGF5CisgICAgICAgICAgR3N0UnRwSDI2M1BQYXkKKyAgICAgICAgICBHc3RSdHBIMjYzUGF5CisgICAgICAgICAgR3N0UnRwSDI2NFBheQorICAgICAgICAgIEdzdFJ0cEgyNjVQYXkKKyAgICAgICAgICBHc3RSdHBKMktQYXkKKyAgICAgICAgICBHc3RSdHBKUEVHUGF5CisgICAgICAgICAgR3N0UnRwS2x2UGF5CisgICAgICAgICAgR3N0UnRwTVA0QVBheQorICAgICAgICAgIEdzdFJ0cE1QNEdQYXkKKyAgICAgICAgICBHc3RSdHBNUDRWUGF5CisgICAgICAgICAgR3N0UnRwTVBBUGF5CisgICAgICAgICAgR3N0UnRwT1BVU1BheQorICAgICAgICAgIEdzdFJ0cFNCQ1BheQorICAgICAgICAgIEdzdFJ0cFNQRUVYUGF5CisgICAgICAgICAgR3N0UnRwVGhlb3JhUGF5CisgICAgICAgICAgR3N0UnRwVlA4UGF5CisgICAgICAgICAgR3N0UnRwVlA5UGF5CisgICAgICAgICAgR3N0UnRwVlJhd1BheQorICAgICAgICAgIEdzdFJ0cFZvcmJpc1BheQorICAgICAgICBHc3RSVFBEZWMKKyAgICAgICAgR3N0UlRQTXV4CisgICAgICAgICAgR3N0UlRQRFRNRk11eAorICAgICAgICBHc3RSVFBSdHhRdWV1ZQorICAgICAgICBHc3RSbmRCdWZmZXJTaXplCisgICAgICAgIEdzdFJ0cEppdHRlckJ1ZmZlcgorICAgICAgICBHc3RSdHBQdERlbXV4CisgICAgICAgIEdzdFJ0cFJ0eFJlY2VpdmUKKyAgICAgICAgR3N0UnRwUnR4U2VuZAorICAgICAgICBHc3RSdHBTZXNzaW9uCisgICAgICAgIEdzdFJ0cFNzcmNEZW11eAorICAgICAgICBHc3RSdHBTdHJlYW1QYXkKKyAgICAgICAgR3N0U01QVEUKKyAgICAgICAgR3N0U2hhcGVXaXBlCisgICAgICAgIEdzdFRhZ0RlbXV4CisgICAgICAgICAgR3N0QXBlRGVtdXgKKyAgICAgICAgICBHc3RJRDNEZW11eAorICAgICAgICBHc3RUYWdNdXgKKyAgICAgICAgICBHc3RBcGV2Mk11eAorICAgICAgICAgIEdzdElkM3YyTXV4CisgICAgICAgIEdzdFY0bDJSYWRpbworICAgICAgICBHc3RWaWRlb0RlY29kZXIKKyAgICAgICAgICBHc3RKcGVnRGVjCisgICAgICAgICAgR3N0UG5nRGVjCisgICAgICAgICAgR3N0VlBYRGVjCisgICAgICAgICAgICBHc3RWUDhEZWMKKyAgICAgICAgICAgIEdzdFZQOURlYworICAgICAgICBHc3RWaWRlb0VuY29kZXIKKyAgICAgICAgICBHc3RKcGVnRW5jCisgICAgICAgICAgR3N0UG5nRW5jCisgICAgICAgICAgR3N0VlBYRW5jCisgICAgICAgICAgICBHc3RWUDhFbmMKKyAgICAgICAgICAgIEdzdFZQOUVuYworICAgICAgICAgIEdzdFk0bUVuY29kZQorICAgICAgICBHc3RWaWRlb01peGVyMgorICAgICAgICBHc3RXYXZFbmMKKyAgICAgICAgR3N0V2F2UGFyc2UKKyAgICAgIEdzdFBhZAorICAgICAgICBHc3RBZ2dyZWdhdG9yUGFkCisgICAgICAgICAgR3N0Rmx2TXV4UGFkCisgICAgICAgIEdzdEludGVybGVhdmVQYWQKKyAgICAgICAgR3N0UVRNdXhQYWQKKyAgICAgICAgR3N0VmlkZW9NaXhlcjJQYWQKKyAgICAgIEdzdFBhZFRlbXBsYXRlCisgICAgICBHc3RQbHVnaW4KKyAgICAgIEdzdFBsdWdpbkZlYXR1cmUKKyAgICAgICAgR3N0RGV2aWNlUHJvdmlkZXJGYWN0b3J5CisgICAgICAgIEdzdER5bmFtaWNUeXBlRmFjdG9yeQorICAgICAgICBHc3RFbGVtZW50RmFjdG9yeQorICAgICAgICBHc3RUcmFjZXJGYWN0b3J5CisgICAgICAgIEdzdFR5cGVGaW5kRmFjdG9yeQorICAgICAgR3N0UmVnaXN0cnkKKyAgICAgIEdzdFRhc2sKKyAgICAgIEdzdFRhc2tQb29sCisgICAgR3RrV2lkZ2V0CisgIEdSZXNvbHZlcgorICBHU29ja2V0CisgIEdTb2NrZXRBZGRyZXNzCisgICAgR0luZXRTb2NrZXRBZGRyZXNzCisgICAgICBHUHJveHlBZGRyZXNzCisgIEdTb2NrZXRDbGllbnQKKyAgR1NvY2tldENvbnRyb2xNZXNzYWdlCisgICAgR3N0SVBQa3RpbmZvTWVzc2FnZQorICAgIEdzdElQVjZQa3RpbmZvTWVzc2FnZQorICBHU29ja2V0TGlzdGVuZXIKKyAgICBHU29ja2V0U2VydmljZQorICBHVGxzQ2VydGlmaWNhdGUKKyAgR1Rsc0RhdGFiYXNlCisgIEdUbHNJbnRlcmFjdGlvbgorICBHZGtQaXhidWYKKyAgR3N0Q29sb3JCYWxhbmNlQ2hhbm5lbAorICBHc3RUdW5lckNoYW5uZWwKKyAgR3N0VHVuZXJOb3JtCisgIFJUUFNlc3Npb24KKyAgU291cFNlc3Npb24KK0dJbnRlcmZhY2UKKyAgQXRrSW1wbGVtZW50b3JJZmFjZQorICBHRGF0YWdyYW1CYXNlZAorICBHSWNvbgorICBHSW5pdGFibGUKKyAgR0xvYWRhYmxlSWNvbgorICBHUHJveHlSZXNvbHZlcgorICBHU29ja2V0Q29ubmVjdGFibGUKKyAgR1R5cGVQbHVnaW4KKyAgR3N0Q2hpbGRQcm94eQorICBHc3RDb2xvckJhbGFuY2UKKyAgR3N0TmF2aWdhdGlvbgorICBHc3RQcmVzZXQKKyAgR3N0U3RyZWFtVm9sdW1lCisgIEdzdFRhZ1NldHRlcgorICBHc3RUYWdYbXBXcml0ZXIKKyAgR3N0VG9jU2V0dGVyCisgIEdzdFR1bmVyCisgIEdzdFVSSUhhbmRsZXIKKyAgR3N0VmlkZW9EaXJlY3Rpb24KKyAgR3N0VmlkZW9PcmllbnRhdGlvbgorICBHdGtCdWlsZGFibGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlcyBiL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTU0ODFjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzCkBAIC0wLDAgKzEsMTE5IEBACitHSW5ldFNvY2tldEFkZHJlc3MgR1NvY2tldENvbm5lY3RhYmxlCitHUHJveHlBZGRyZXNzIEdTb2NrZXRDb25uZWN0YWJsZQorR1NvY2tldCBHSW5pdGFibGUKK0dTb2NrZXQgR0luaXRhYmxlIEdEYXRhZ3JhbUJhc2VkCitHU29ja2V0QWRkcmVzcyBHU29ja2V0Q29ubmVjdGFibGUKK0dka1BpeGJ1ZiBHSWNvbgorR2RrUGl4YnVmIEdJY29uIEdMb2FkYWJsZUljb24KK0dzdDNHUFBNdXggR3N0VGFnU2V0dGVyIEdzdFRhZ1htcFdyaXRlcgorR3N0M0dQUE11eCBHc3RUYWdTZXR0ZXIgR3N0VGFnWG1wV3JpdGVyIEdzdFByZXNldAorR3N0QUxhd0VuYyBHc3RQcmVzZXQKK0dzdEFwZXYyTXV4IEdzdFRhZ1NldHRlcgorR3N0QXNwZWN0UmF0aW9Dcm9wIEdzdENoaWxkUHJveHkKK0dzdEF1ZGlvRW5jb2RlciBHc3RQcmVzZXQKK0dzdEF1dG9BdWRpb1NpbmsgR3N0Q2hpbGRQcm94eQorR3N0QXV0b0F1ZGlvU3JjIEdzdENoaWxkUHJveHkKK0dzdEF1dG9EZXRlY3QgR3N0Q2hpbGRQcm94eQorR3N0QXV0b1ZpZGVvU2luayBHc3RDaGlsZFByb3h5CitHc3RBdXRvVmlkZW9TcmMgR3N0Q2hpbGRQcm94eQorR3N0QXZpTXV4IEdzdFRhZ1NldHRlcgorR3N0QmluIEdzdENoaWxkUHJveHkKK0dzdERWMTM5NFNyYyBHc3RVUklIYW5kbGVyCitHc3REVjEzOTRTcmMgR3N0VVJJSGFuZGxlciBHc3RQcm9wZXJ0eVByb2JlCitHc3REZWludGVybGFjZSBHc3RDaGlsZFByb3h5CitHc3RGbGFjRW5jIEdzdFByZXNldCBHc3RUYWdTZXR0ZXIKK0dzdEZsYWNFbmMgR3N0UHJlc2V0IEdzdFRhZ1NldHRlciBHc3RUb2NTZXR0ZXIKK0dzdEZsYWNFbmMgR3N0VGFnU2V0dGVyIEdzdFByZXNldAorR3N0RmxhY1RhZyBHc3RUYWdTZXR0ZXIKK0dzdEZsdk11eCBHc3RUYWdTZXR0ZXIKK0dzdEdDb25mQXVkaW9TaW5rIEdzdENoaWxkUHJveHkKK0dzdEdDb25mQXVkaW9TcmMgR3N0Q2hpbGRQcm94eQorR3N0R0NvbmZWaWRlb1NpbmsgR3N0Q2hpbGRQcm94eQorR3N0R0NvbmZWaWRlb1NyYyBHc3RDaGlsZFByb3h5CitHc3RHUFBNdXggR3N0VGFnU2V0dGVyIEdzdFRhZ1htcFdyaXRlcgorR3N0R3RrQmFzZVNpbmsgR3N0TmF2aWdhdGlvbgorR3N0R3RrR0xTaW5rIEdzdE5hdmlnYXRpb24KK0dzdEd0a1NpbmsgR3N0TmF2aWdhdGlvbgorR3N0SERWMTM5NFNyYyBHc3RVUklIYW5kbGVyCitHc3RIRFYxMzk0U3JjIEdzdFVSSUhhbmRsZXIgR3N0UHJvcGVydHlQcm9iZQorR3N0SGFsQXVkaW9TaW5rIEdzdENoaWxkUHJveHkKK0dzdEhhbEF1ZGlvU3JjIEdzdENoaWxkUHJveHkKK0dzdElTTUxNdXggR3N0VGFnU2V0dGVyIEdzdFRhZ1htcFdyaXRlcgorR3N0SVNNTE11eCBHc3RUYWdTZXR0ZXIgR3N0VGFnWG1wV3JpdGVyIEdzdFByZXNldAorR3N0SWQzdjJNdXggR3N0VGFnU2V0dGVyCitHc3RJaXJFcXVhbGl6ZXIgR3N0Q2hpbGRQcm94eQorR3N0SWlyRXF1YWxpemVyIEdzdENoaWxkUHJveHkgR3N0UHJlc2V0CitHc3RJaXJFcXVhbGl6ZXIxMEJhbmRzIEdzdENoaWxkUHJveHkgR3N0UHJlc2V0CitHc3RJaXJFcXVhbGl6ZXIzQmFuZHMgR3N0Q2hpbGRQcm94eSBHc3RQcmVzZXQKK0dzdElpckVxdWFsaXplck5CYW5kcyBHc3RDaGlsZFByb3h5CitHc3RJaXJFcXVhbGl6ZXJOQmFuZHMgR3N0Q2hpbGRQcm94eSBHc3RQcmVzZXQKK0dzdEpwZWdFbmMgR3N0UHJlc2V0CitHc3RMYW1lTVAzRW5jIEdzdFByZXNldAorR3N0TUoyTXV4IEdzdFRhZ1NldHRlciBHc3RUYWdYbXBXcml0ZXIKK0dzdE1KMk11eCBHc3RUYWdTZXR0ZXIgR3N0VGFnWG1wV3JpdGVyIEdzdFByZXNldAorR3N0TVA0TXV4IEdzdFRhZ1NldHRlciBHc3RUYWdYbXBXcml0ZXIKK0dzdE1QNE11eCBHc3RUYWdTZXR0ZXIgR3N0VGFnWG1wV3JpdGVyIEdzdFByZXNldAorR3N0TWF0cm9za2FNdXggR3N0VGFnU2V0dGVyCitHc3RNYXRyb3NrYU11eCBHc3RUYWdTZXR0ZXIgR3N0VG9jU2V0dGVyCitHc3RNdUxhd0VuYyBHc3RQcmVzZXQKK0dzdE11bHRpRmlsZVNyYyBHc3RVUklIYW5kbGVyCitHc3RPc3M0TWl4ZXIgR3N0SW1wbGVtZW50c0ludGVyZmFjZSBHc3RNaXhlciBHc3RQcm9wZXJ0eVByb2JlCitHc3RPc3M0U2luayBHc3RTdHJlYW1Wb2x1bWUKK0dzdE9zczRTaW5rIEdzdFN0cmVhbVZvbHVtZSBHc3RQcm9wZXJ0eVByb2JlCitHc3RPc3M0U291cmNlIEdzdEltcGxlbWVudHNJbnRlcmZhY2UgR3N0TWl4ZXIgR3N0UHJvcGVydHlQcm9iZQorR3N0T3NzTWl4ZXJFbGVtZW50IEdzdEltcGxlbWVudHNJbnRlcmZhY2UgR3N0TWl4ZXIKK0dzdE9zc1NyYyBHc3RJbXBsZW1lbnRzSW50ZXJmYWNlIEdzdE1peGVyCitHc3RQaXBlbGluZSBHc3RDaGlsZFByb3h5CitHc3RQbmdFbmMgR3N0UHJlc2V0CitHc3RQdWxzZUF1ZGlvU2luayBHc3RDaGlsZFByb3h5CitHc3RQdWxzZU1peGVyIEdzdEltcGxlbWVudHNJbnRlcmZhY2UgR3N0TWl4ZXIgR3N0UHJvcGVydHlQcm9iZQorR3N0UHVsc2VNaXhlciBHc3RNaXhlcgorR3N0UHVsc2VTaW5rIEdzdFN0cmVhbVZvbHVtZQorR3N0UHVsc2VTaW5rIEdzdFN0cmVhbVZvbHVtZSBHc3RJbXBsZW1lbnRzSW50ZXJmYWNlIEdzdFByb3BlcnR5UHJvYmUKK0dzdFB1bHNlU3JjIEdzdEltcGxlbWVudHNJbnRlcmZhY2UgR3N0TWl4ZXIgR3N0UHJvcGVydHlQcm9iZQorR3N0UHVsc2VTcmMgR3N0TWl4ZXIgR3N0U3RyZWFtVm9sdW1lCitHc3RQdWxzZVNyYyBHc3RTdHJlYW1Wb2x1bWUKK0dzdFB1bHNlU3JjIEdzdFN0cmVhbVZvbHVtZSBHc3RJbXBsZW1lbnRzSW50ZXJmYWNlIEdzdE1peGVyIEdzdFByb3BlcnR5UHJvYmUKK0dzdFB1c2hGaWxlU3JjIEdzdENoaWxkUHJveHkgR3N0VVJJSGFuZGxlcgorR3N0UVRNb292UmVjb3ZlciBHc3RDaGlsZFByb3h5CitHc3RRVE11eCBHc3RUYWdTZXR0ZXIgR3N0VGFnWG1wV3JpdGVyCitHc3RRVE11eCBHc3RUYWdTZXR0ZXIgR3N0VGFnWG1wV3JpdGVyIEdzdFByZXNldAorR3N0UlRTUFNyYyBHc3RDaGlsZFByb3h5IEdzdFVSSUhhbmRsZXIKK0dzdFJnVm9sdW1lIEdzdENoaWxkUHJveHkKK0dzdFJ0cEJpbiBHc3RDaGlsZFByb3h5CitHc3RTaG91dDJzZW5kIEdzdFRhZ1NldHRlcgorR3N0U291cEhUVFBTcmMgR3N0VVJJSGFuZGxlcgorR3N0U3BlZXhFbmMgR3N0UHJlc2V0IEdzdFRhZ1NldHRlcgorR3N0U3BlZXhFbmMgR3N0VGFnU2V0dGVyIEdzdFByZXNldAorR3N0U3BsaXRGaWxlU3JjIEdzdFVSSUhhbmRsZXIKK0dzdFNwbGl0TXV4U2luayBHc3RDaGlsZFByb3h5CitHc3RTcGxpdE11eFNyYyBHc3RDaGlsZFByb3h5IEdzdFVSSUhhbmRsZXIKK0dzdFN3aXRjaFNpbmsgR3N0Q2hpbGRQcm94eQorR3N0U3dpdGNoU3JjIEdzdENoaWxkUHJveHkKK0dzdFRhZ0xpYk11eCBHc3RUYWdTZXR0ZXIKK0dzdFRhZ011eCBHc3RUYWdTZXR0ZXIKK0dzdFR3b0xhbWUgR3N0UHJlc2V0CitHc3RVRFBTaW5rIEdzdFVSSUhhbmRsZXIKK0dzdFVEUFNyYyBHc3RVUklIYW5kbGVyCitHc3RWNGwyUmFkaW8gR3N0VVJJSGFuZGxlciBHc3RJbXBsZW1lbnRzSW50ZXJmYWNlIEdzdFR1bmVyIEdzdFByb3BlcnR5UHJvYmUKK0dzdFY0bDJSYWRpbyBHc3RVUklIYW5kbGVyIEdzdFR1bmVyCitHc3RWNGwyU2luayBHc3RJbXBsZW1lbnRzSW50ZXJmYWNlIEdzdFhPdmVybGF5IEdzdE5hdmlnYXRpb24gR3N0Q29sb3JCYWxhbmNlIEdzdFZpZGVvT3JpZW50YXRpb24gR3N0UHJvcGVydHlQcm9iZQorR3N0VjRsMlNpbmsgR3N0VHVuZXIgR3N0Q29sb3JCYWxhbmNlIEdzdFZpZGVvT3JpZW50YXRpb24KK0dzdFY0bDJTaW5rIEdzdFR1bmVyIEdzdFZpZGVvT3ZlcmxheSBHc3ROYXZpZ2F0aW9uIEdzdENvbG9yQmFsYW5jZSBHc3RWaWRlb09yaWVudGF0aW9uCitHc3RWNGwyU3JjIEdzdFVSSUhhbmRsZXIgR3N0SW1wbGVtZW50c0ludGVyZmFjZSBHc3RUdW5lciBHc3RDb2xvckJhbGFuY2UgR3N0VmlkZW9PcmllbnRhdGlvbiBHc3RQcm9wZXJ0eVByb2JlCitHc3RWNGwyU3JjIEdzdFVSSUhhbmRsZXIgR3N0VHVuZXIgR3N0Q29sb3JCYWxhbmNlIEdzdFZpZGVvT3JpZW50YXRpb24KK0dzdFZQOEVuYyBHc3RQcmVzZXQgR3N0VGFnU2V0dGVyCitHc3RWUDlFbmMgR3N0UHJlc2V0IEdzdFRhZ1NldHRlcgorR3N0VlBYRW5jIEdzdFByZXNldCBHc3RUYWdTZXR0ZXIKK0dzdFZpZGVvQmFsYW5jZSBHc3RDb2xvckJhbGFuY2UKK0dzdFZpZGVvQmFsYW5jZSBHc3RJbXBsZW1lbnRzSW50ZXJmYWNlIEdzdENvbG9yQmFsYW5jZQorR3N0VmlkZW9FbmNvZGVyIEdzdFByZXNldAorR3N0VmlkZW9GbGlwIEdzdFZpZGVvRGlyZWN0aW9uCitHc3RWaWRlb01peGVyIEdzdENoaWxkUHJveHkKK0dzdFZpZGVvTWl4ZXIyIEdzdENoaWxkUHJveHkKK0dzdFdhdkVuYyBHc3RUYWdTZXR0ZXIgR3N0VG9jU2V0dGVyCitHc3RXYXZwYWNrRW5jIEdzdFByZXNldAorR3N0V2ViTU11eCBHc3RUYWdTZXR0ZXIKK0dzdFdlYk1NdXggR3N0VGFnU2V0dGVyIEdzdFRvY1NldHRlcgorR3N0WTRtRW5jb2RlIEdzdFByZXNldAorR3RrV2lkZ2V0IEF0a0ltcGxlbWVudG9ySWZhY2UgR3RrQnVpbGRhYmxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXMgYi9kb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNiMmI5MwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlcwpAQCAtMCwwICsxLDE5IEBACitHRGF0YWdyYW1CYXNlZCBHT2JqZWN0CitHSWNvbiBHT2JqZWN0CitHSW5pdGFibGUgR09iamVjdAorR0xvYWRhYmxlSWNvbiBHSWNvbiBHT2JqZWN0CitHUHJveHlSZXNvbHZlciBHT2JqZWN0CitHU29ja2V0Q29ubmVjdGFibGUgR09iamVjdAorR3N0Q2hpbGRQcm94eSBHT2JqZWN0CitHc3RDaGlsZFByb3h5IEdzdE9iamVjdAorR3N0Q29sb3JCYWxhbmNlIEdzdEltcGxlbWVudHNJbnRlcmZhY2UgR3N0RWxlbWVudAorR3N0SW1wbGVtZW50c0ludGVyZmFjZSBHc3RFbGVtZW50CitHc3RNaXhlciBHc3RJbXBsZW1lbnRzSW50ZXJmYWNlIEdzdEVsZW1lbnQKK0dzdFN0cmVhbVZvbHVtZSBHT2JqZWN0CitHc3RUYWdTZXR0ZXIgR3N0RWxlbWVudAorR3N0VGFnWG1wV3JpdGVyIEdzdEVsZW1lbnQKK0dzdFRvY1NldHRlciBHc3RFbGVtZW50CitHc3RUdW5lciBHc3RJbXBsZW1lbnRzSW50ZXJmYWNlIEdzdEVsZW1lbnQKK0dzdFZpZGVvT3JpZW50YXRpb24gR3N0SW1wbGVtZW50c0ludGVyZmFjZSBHc3RFbGVtZW50CitHc3RYT3ZlcmxheSBHc3RJbXBsZW1lbnRzSW50ZXJmYWNlIEdzdEVsZW1lbnQKK0d0a0J1aWxkYWJsZSBHT2JqZWN0CmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnNpZ25hbHMgYi9kb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnNpZ25hbHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjNmZiYgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFscwpAQCAtMCwwICsxLDcwMiBAQAorPFNJR05BTD4KKzxOQU1FPkdzdE11bHRpVURQU2luazo6YWRkPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sYTwvRkxBR1M+CitHc3RNdWx0aVVEUFNpbmsgKmdzdG11bHRpdWRwc2luaworZ2NoYXIgKmFyZzEKK2dpbnQgIGFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0TXVsdGlVRFBTaW5rOjpjbGVhcjwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bGE8L0ZMQUdTPgorR3N0TXVsdGlVRFBTaW5rICpnc3RtdWx0aXVkcHNpbmsKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0TXVsdGlVRFBTaW5rOjpjbGllbnQtYWRkZWQ8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0TXVsdGlVRFBTaW5rICpnc3RtdWx0aXVkcHNpbmsKK2djaGFyICphcmcxCitnaW50ICBhcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdE11bHRpVURQU2luazo6Y2xpZW50LXJlbW92ZWQ8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0TXVsdGlVRFBTaW5rICpnc3RtdWx0aXVkcHNpbmsKK2djaGFyICphcmcxCitnaW50ICBhcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdE11bHRpVURQU2luazo6Z2V0LXN0YXRzPC9OQU1FPgorPFJFVFVSTlM+R3N0U3RydWN0dXJlKjwvUkVUVVJOUz4KKzxGTEFHUz5sYTwvRkxBR1M+CitHc3RNdWx0aVVEUFNpbmsgKmdzdG11bHRpdWRwc2luaworZ2NoYXIgKmFyZzEKK2dpbnQgIGFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0TXVsdGlVRFBTaW5rOjpyZW1vdmU8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmxhPC9GTEFHUz4KK0dzdE11bHRpVURQU2luayAqZ3N0bXVsdGl1ZHBzaW5rCitnY2hhciAqYXJnMQorZ2ludCAgYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3REeW5VRFBTaW5rOjpnZXQtc3RhdHM8L05BTUU+Cis8UkVUVVJOUz5Hc3RTdHJ1Y3R1cmUqPC9SRVRVUk5TPgorPEZMQUdTPmxhPC9GTEFHUz4KK0dzdER5blVEUFNpbmsgKmdzdGR5bnVkcHNpbmsKK2djaGFyICphcmcxCitnaW50ICBhcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFNob3V0MnNlbmQ6OmNvbm5lY3Rpb24tcHJvYmxlbTwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+YzwvRkxBR1M+CitHc3RTaG91dDJzZW5kICpnc3RzaG91dDJzZW5kCitnaW50ICBhcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdERWMTM5NFNyYzo6ZnJhbWUtZHJvcHBlZDwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3REVjEzOTRTcmMgKmdzdGR2MTM5NHNyYworPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSVFBEZWM6OmNsZWFyLXB0LW1hcDwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSVFBEZWMgKmdzdHJ0cGRlYworPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSVFBEZWM6OnJlcXVlc3QtcHQtbWFwPC9OQU1FPgorPFJFVFVSTlM+R3N0Q2Fwcyo8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSVFBEZWMgKmdzdHJ0cGRlYworZ3VpbnQgIGFyZzEKK2d1aW50ICBhcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJUUERlYzo6b24tYnllLXNzcmM8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UlRQRGVjICpnc3RydHBkZWMKK2d1aW50ICBhcmcxCitndWludCAgYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSVFBEZWM6Om9uLWJ5ZS10aW1lb3V0PC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJUUERlYyAqZ3N0cnRwZGVjCitndWludCAgYXJnMQorZ3VpbnQgIGFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UlRQRGVjOjpvbi1uZXctc3NyYzwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSVFBEZWMgKmdzdHJ0cGRlYworZ3VpbnQgIGFyZzEKK2d1aW50ICBhcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJUUERlYzo6b24tc3NyYy1jb2xsaXNpb248L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UlRQRGVjICpnc3RydHBkZWMKK2d1aW50ICBhcmcxCitndWludCAgYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSVFBEZWM6Om9uLXNzcmMtdmFsaWRhdGVkPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJUUERlYyAqZ3N0cnRwZGVjCitndWludCAgYXJnMQorZ3VpbnQgIGFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UlRQRGVjOjpvbi10aW1lb3V0PC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJUUERlYyAqZ3N0cnRwZGVjCitndWludCAgYXJnMQorZ3VpbnQgIGFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0QXVkaW9GSVJGaWx0ZXI6OnJhdGUtY2hhbmdlZDwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RBdWRpb0ZJUkZpbHRlciAqZ3N0YXVkaW9maXJmaWx0ZXIKK2dpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0QXVkaW9JSVJGaWx0ZXI6OnJhdGUtY2hhbmdlZDwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RBdWRpb0lJUkZpbHRlciAqZ3N0YXVkaW9paXJmaWx0ZXIKK2dpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwQmluOjpjbGVhci1wdC1tYXA8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmxhPC9GTEFHUz4KK0dzdFJ0cEJpbiAqZ3N0cnRwYmluCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cEJpbjo6Z2V0LWludGVybmFsLXNlc3Npb248L05BTUU+Cis8UkVUVVJOUz5SVFBTZXNzaW9uKjwvUkVUVVJOUz4KKzxGTEFHUz5sYTwvRkxBR1M+CitHc3RSdHBCaW4gKmdzdHJ0cGJpbgorZ3VpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwQmluOjpvbi1ieWUtc3NyYzwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBCaW4gKmdzdHJ0cGJpbgorZ3VpbnQgIGFyZzEKK2d1aW50ICBhcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cEJpbjo6b24tYnllLXRpbWVvdXQ8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwQmluICpnc3RydHBiaW4KK2d1aW50ICBhcmcxCitndWludCAgYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBCaW46Om9uLW5ldy1zc3JjPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cEJpbiAqZ3N0cnRwYmluCitndWludCAgYXJnMQorZ3VpbnQgIGFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwQmluOjpvbi1ucHQtc3RvcDwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBCaW4gKmdzdHJ0cGJpbgorZ3VpbnQgIGFyZzEKK2d1aW50ICBhcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cEJpbjo6b24tc2VuZGVyLXRpbWVvdXQ8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwQmluICpnc3RydHBiaW4KK2d1aW50ICBhcmcxCitndWludCAgYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBCaW46Om9uLXNzcmMtYWN0aXZlPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cEJpbiAqZ3N0cnRwYmluCitndWludCAgYXJnMQorZ3VpbnQgIGFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwQmluOjpvbi1zc3JjLWNvbGxpc2lvbjwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBCaW4gKmdzdHJ0cGJpbgorZ3VpbnQgIGFyZzEKK2d1aW50ICBhcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cEJpbjo6b24tc3NyYy1zZGVzPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cEJpbiAqZ3N0cnRwYmluCitndWludCAgYXJnMQorZ3VpbnQgIGFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwQmluOjpvbi1zc3JjLXZhbGlkYXRlZDwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBCaW4gKmdzdHJ0cGJpbgorZ3VpbnQgIGFyZzEKK2d1aW50ICBhcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cEJpbjo6b24tdGltZW91dDwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBCaW4gKmdzdHJ0cGJpbgorZ3VpbnQgIGFyZzEKK2d1aW50ICBhcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cEJpbjo6cmVxdWVzdC1wdC1tYXA8L05BTUU+Cis8UkVUVVJOUz5Hc3RDYXBzKjwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cEJpbiAqZ3N0cnRwYmluCitndWludCAgYXJnMQorZ3VpbnQgIGFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwQmluOjpyZXNldC1zeW5jPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sYTwvRkxBR1M+CitHc3RSdHBCaW4gKmdzdHJ0cGJpbgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBCaW46OnBheWxvYWQtdHlwZS1jaGFuZ2U8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwQmluICpnc3RydHBiaW4KK2d1aW50ICBhcmcxCitndWludCAgYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBCaW46Om5ldy1qaXR0ZXJidWZmZXI8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwQmluICpnc3RydHBiaW4KK0dzdEVsZW1lbnQgKmFyZzEKK2d1aW50ICBhcmcyCitndWludCAgYXJnMworPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBCaW46OnJlcXVlc3QtYXV4LXJlY2VpdmVyPC9OQU1FPgorPFJFVFVSTlM+R3N0RWxlbWVudCo8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBCaW4gKmdzdHJ0cGJpbgorZ3VpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwQmluOjpyZXF1ZXN0LWF1eC1zZW5kZXI8L05BTUU+Cis8UkVUVVJOUz5Hc3RFbGVtZW50KjwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cEJpbiAqZ3N0cnRwYmluCitndWludCAgYXJnMQorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBCaW46OnJlcXVlc3QtcnRjcC1kZWNvZGVyPC9OQU1FPgorPFJFVFVSTlM+R3N0RWxlbWVudCo8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBCaW4gKmdzdHJ0cGJpbgorZ3VpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwQmluOjpyZXF1ZXN0LXJ0Y3AtZW5jb2RlcjwvTkFNRT4KKzxSRVRVUk5TPkdzdEVsZW1lbnQqPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwQmluICpnc3RydHBiaW4KK2d1aW50ICBhcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cEJpbjo6cmVxdWVzdC1ydHAtZGVjb2RlcjwvTkFNRT4KKzxSRVRVUk5TPkdzdEVsZW1lbnQqPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwQmluICpnc3RydHBiaW4KK2d1aW50ICBhcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cEJpbjo6cmVxdWVzdC1ydHAtZW5jb2RlcjwvTkFNRT4KKzxSRVRVUk5TPkdzdEVsZW1lbnQqPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwQmluICpnc3RydHBiaW4KK2d1aW50ICBhcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cEJpbjo6b24tbmV3LXNlbmRlci1zc3JjPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cEJpbiAqZ3N0cnRwYmluCitndWludCAgYXJnMQorZ3VpbnQgIGFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwQmluOjpvbi1zZW5kZXItc3NyYy1hY3RpdmU8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwQmluICpnc3RydHBiaW4KK2d1aW50ICBhcmcxCitndWludCAgYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBCaW46OmdldC1zZXNzaW9uPC9OQU1FPgorPFJFVFVSTlM+R3N0RWxlbWVudCo8L1JFVFVSTlM+Cis8RkxBR1M+bGE8L0ZMQUdTPgorR3N0UnRwQmluICpnc3RydHBiaW4KK2d1aW50ICBhcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cEJpbjo6b24tYnVuZGxlZC1zc3JjPC9OQU1FPgorPFJFVFVSTlM+Z3VpbnQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBCaW4gKmdzdHJ0cGJpbgorZ3VpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwSml0dGVyQnVmZmVyOjpjbGVhci1wdC1tYXA8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmxhPC9GTEFHUz4KK0dzdFJ0cEppdHRlckJ1ZmZlciAqZ3N0cnRwaml0dGVyYnVmZmVyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cEppdHRlckJ1ZmZlcjo6aGFuZGxlLXN5bmM8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwSml0dGVyQnVmZmVyICpnc3RydHBqaXR0ZXJidWZmZXIKK0dzdFN0cnVjdHVyZSAqYXJnMQorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6Om9uLW5wdC1zdG9wPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cEppdHRlckJ1ZmZlciAqZ3N0cnRwaml0dGVyYnVmZmVyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cEppdHRlckJ1ZmZlcjo6cmVxdWVzdC1wdC1tYXA8L05BTUU+Cis8UkVUVVJOUz5Hc3RDYXBzKjwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cEppdHRlckJ1ZmZlciAqZ3N0cnRwaml0dGVyYnVmZmVyCitndWludCAgYXJnMQorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OnNldC1hY3RpdmU8L05BTUU+Cis8UkVUVVJOUz5ndWludDY0PC9SRVRVUk5TPgorPEZMQUdTPmxhPC9GTEFHUz4KK0dzdFJ0cEppdHRlckJ1ZmZlciAqZ3N0cnRwaml0dGVyYnVmZmVyCitnYm9vbGVhbiAgYXJnMQorZ3VpbnQ2NCAgYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBQdERlbXV4OjpjbGVhci1wdC1tYXA8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmxhPC9GTEFHUz4KK0dzdFJ0cFB0RGVtdXggKmdzdHJ0cHB0ZGVtdXgKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwUHREZW11eDo6bmV3LXBheWxvYWQtdHlwZTwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBQdERlbXV4ICpnc3RydHBwdGRlbXV4CitndWludCAgYXJnMQorR3N0UGFkICphcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cFB0RGVtdXg6OnBheWxvYWQtdHlwZS1jaGFuZ2U8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwUHREZW11eCAqZ3N0cnRwcHRkZW11eAorZ3VpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwUHREZW11eDo6cmVxdWVzdC1wdC1tYXA8L05BTUU+Cis8UkVUVVJOUz5Hc3RDYXBzKjwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cFB0RGVtdXggKmdzdHJ0cHB0ZGVtdXgKK2d1aW50ICBhcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cFNlc3Npb246OmNsZWFyLXB0LW1hcDwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+YTwvRkxBR1M+CitHc3RSdHBTZXNzaW9uICpnc3RydHBzZXNzaW9uCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cFNlc3Npb246Om9uLWJ5ZS1zc3JjPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cFNlc3Npb24gKmdzdHJ0cHNlc3Npb24KK2d1aW50ICBhcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cFNlc3Npb246Om9uLWJ5ZS10aW1lb3V0PC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cFNlc3Npb24gKmdzdHJ0cHNlc3Npb24KK2d1aW50ICBhcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cFNlc3Npb246Om9uLW5ldy1zc3JjPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cFNlc3Npb24gKmdzdHJ0cHNlc3Npb24KK2d1aW50ICBhcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cFNlc3Npb246Om9uLXNlbmRlci10aW1lb3V0PC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cFNlc3Npb24gKmdzdHJ0cHNlc3Npb24KK2d1aW50ICBhcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cFNlc3Npb246Om9uLXNzcmMtYWN0aXZlPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cFNlc3Npb24gKmdzdHJ0cHNlc3Npb24KK2d1aW50ICBhcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cFNlc3Npb246Om9uLXNzcmMtY29sbGlzaW9uPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cFNlc3Npb24gKmdzdHJ0cHNlc3Npb24KK2d1aW50ICBhcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cFNlc3Npb246Om9uLXNzcmMtc2RlczwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBTZXNzaW9uICpnc3RydHBzZXNzaW9uCitndWludCAgYXJnMQorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBTZXNzaW9uOjpvbi1zc3JjLXZhbGlkYXRlZDwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBTZXNzaW9uICpnc3RydHBzZXNzaW9uCitndWludCAgYXJnMQorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBTZXNzaW9uOjpvbi10aW1lb3V0PC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cFNlc3Npb24gKmdzdHJ0cHNlc3Npb24KK2d1aW50ICBhcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cFNlc3Npb246OnJlcXVlc3QtcHQtbWFwPC9OQU1FPgorPFJFVFVSTlM+R3N0Q2Fwcyo8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBTZXNzaW9uICpnc3RydHBzZXNzaW9uCitndWludCAgYXJnMQorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBTZXNzaW9uOjpvbi1uZXctc2VuZGVyLXNzcmM8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwU2Vzc2lvbiAqZ3N0cnRwc2Vzc2lvbgorZ3VpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6b24tc2VuZGVyLXNzcmMtYWN0aXZlPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cFNlc3Npb24gKmdzdHJ0cHNlc3Npb24KK2d1aW50ICBhcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cFNzcmNEZW11eDo6Y2xlYXItc3NyYzwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bGE8L0ZMQUdTPgorR3N0UnRwU3NyY0RlbXV4ICpnc3RydHBzc3JjZGVtdXgKK2d1aW50ICBhcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cFNzcmNEZW11eDo6bmV3LXNzcmMtcGFkPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cFNzcmNEZW11eCAqZ3N0cnRwc3NyY2RlbXV4CitndWludCAgYXJnMQorR3N0UGFkICphcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cFNzcmNEZW11eDo6cmVtb3ZlZC1zc3JjLXBhZDwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBTc3JjRGVtdXggKmdzdHJ0cHNzcmNkZW11eAorZ3VpbnQgIGFyZzEKK0dzdFBhZCAqYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RDYWlyb092ZXJsYXk6OmNhcHMtY2hhbmdlZDwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+PC9GTEFHUz4KK0dzdENhaXJvT3ZlcmxheSAqZ3N0Y2Fpcm9vdmVybGF5CitHc3RDYXBzICphcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdENhaXJvT3ZlcmxheTo6ZHJhdzwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+PC9GTEFHUz4KK0dzdENhaXJvT3ZlcmxheSAqZ3N0Y2Fpcm9vdmVybGF5CitDYWlyb0NvbnRleHQgKmFyZzEKK2d1aW50NjQgIGFyZzIKK2d1aW50NjQgIGFyZzMKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0VjRsMlNyYzo6cHJlcGFyZS1mb3JtYXQ8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0VjRsMlNyYyAqZ3N0djRsMnNyYworZ2ludCAgYXJnMQorR3N0Q2FwcyAqYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSVFNQU3JjOjpoYW5kbGUtcmVxdWVzdDwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+PC9GTEFHUz4KK0dzdFJUU1BTcmMgKmdzdHJ0c3BzcmMKK2dwb2ludGVyICBhcmcxCitncG9pbnRlciAgYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSVFNQU3JjOjpvbi1zZHA8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPjwvRkxBR1M+CitHc3RSVFNQU3JjICpnc3RydHNwc3JjCitHc3RTRFBNZXNzYWdlICphcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJUU1BTcmM6OnNlbGVjdC1zdHJlYW08L05BTUU+Cis8UkVUVVJOUz5nYm9vbGVhbjwvUkVUVVJOUz4KKzxGTEFHUz5mYzwvRkxBR1M+CitHc3RSVFNQU3JjICpnc3RydHNwc3JjCitndWludCAgYXJnMQorR3N0Q2FwcyAqYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSVFNQU3JjOjpuZXctbWFuYWdlcjwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+ZmM8L0ZMQUdTPgorR3N0UlRTUFNyYyAqZ3N0cnRzcHNyYworR3N0RWxlbWVudCAqYXJnMQorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSVFNQU3JjOjpyZXF1ZXN0LXJ0Y3Ata2V5PC9OQU1FPgorPFJFVFVSTlM+R3N0Q2Fwcyo8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSVFNQU3JjICpnc3RydHNwc3JjCitndWludCAgYXJnMQorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSVFNQU3JjOjphY2NlcHQtY2VydGlmaWNhdGU8L05BTUU+Cis8UkVUVVJOUz5nYm9vbGVhbjwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJUU1BTcmMgKmdzdHJ0c3BzcmMKK0dUbHNDb25uZWN0aW9uICphcmcxCitHVGxzQ2VydGlmaWNhdGUgKmFyZzIKK0dUbHNDZXJ0aWZpY2F0ZUZsYWdzICBhcmczCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJUU1BTcmM6OmJlZm9yZS1zZW5kPC9OQU1FPgorPFJFVFVSTlM+Z2Jvb2xlYW48L1JFVFVSTlM+Cis8RkxBR1M+ZmM8L0ZMQUdTPgorR3N0UlRTUFNyYyAqZ3N0cnRzcHNyYworR3N0UlRTUE1lc3NhZ2UgKmFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0U3BsaXRNdXhTaW5rOjpmb3JtYXQtbG9jYXRpb248L05BTUU+Cis8UkVUVVJOUz5nY2hhcio8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RTcGxpdE11eFNpbmsgKmdzdHNwbGl0bXV4c2luaworZ3VpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0U3BsaXRNdXhTaW5rOjpmb3JtYXQtbG9jYXRpb24tZnVsbDwvTkFNRT4KKzxSRVRVUk5TPmdjaGFyKjwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFNwbGl0TXV4U2luayAqZ3N0c3BsaXRtdXhzaW5rCitndWludCAgYXJnMQorR3N0U2FtcGxlICphcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFNwbGl0TXV4U2luazo6c3BsaXQtbm93PC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFNwbGl0TXV4U2luayAqZ3N0c3BsaXRtdXhzaW5rCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFNwbGl0TXV4U3JjOjpmb3JtYXQtbG9jYXRpb248L05BTUU+Cis8UkVUVVJOUz5HU3RydjwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFNwbGl0TXV4U3JjICpnc3RzcGxpdG11eHNyYworPC9TSUdOQUw+CisKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMudHlwZXMgYi9kb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnR5cGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNWI0YjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnR5cGVzCkBAIC0wLDAgKzEsNCBAQAorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKwordHlwZTpHc3RJaXJFcXVhbGl6ZXIKK3R5cGU6R3N0VmlkZW9NaXhlclBhZApkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MWM4Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWwKQEAgLTAsMCArMSw0MyBAQAorPHBsdWdpbj4KKyAgPG5hbWU+MTM5NDwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPlNvdXJjZSBmb3IgdmlkZW8gZGF0YSB2aWEgSUVFRTEzOTQgaW50ZXJmYWNlPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2V4dC9yYXcxMzk0Ly5saWJzL2xpYmdzdDEzOTQuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0MTM5NC5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+ZHYxMzk0c3JjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkZpcmV3aXJlICgxMzk0KSBEViB2aWRlbyBzb3VyY2U8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNvdXJjZS9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+U291cmNlIGZvciBEViB2aWRlbyBkYXRhIGZyb20gZmlyZXdpcmUgcG9ydDwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkVyaWsgV2FsdGhpbnNlbiAmbHQ7b21lZ2FAdGVtcGxlLWJhcHRpc3QuY29tJmd0OywgRGFuaWVsIEZpc2NoZXIgJmx0O2RhbkBmM2MuY29tJmd0OywgV2ltIFRheW1hbnMgJmx0O3dpbUBmbHVlbmRvLmNvbSZndDssIFphaGVlciBBYmJhcyBNZXJhbGkgJmx0O3phaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtZHYsIGZvcm1hdD0oc3RyaW5nKXsgTlRTQywgUEFMIH0sIHN5c3RlbXN0cmVhbT0oYm9vbGVhbil0cnVlPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+aGR2MTM5NHNyYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5GaXJld2lyZSAoMTM5NCkgSERWIHZpZGVvIHNvdXJjZTwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U291cmNlL1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5Tb3VyY2UgZm9yIE1QRUctVFMgdmlkZW8gZGF0YSBmcm9tIGZpcmV3aXJlIHBvcnQ8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5FZHdhcmQgSGVydmV5ICZsdDtiaWxib2VkQGJpbGJvZWQuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL21wZWd0cywgc3lzdGVtc3RyZWFtPShib29sZWFuKXRydWUsIHBhY2tldHNpemU9KGludCkxODg8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMWUzODgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbApAQCAtMCwwICsxLDI4IEBACis8cGx1Z2luPgorICA8bmFtZT5hYXNpbms8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5BU0NJSSBBcnQgdmlkZW8gc2luazwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9leHQvYWFsaWIvLmxpYnMvbGliZ3N0YWFzaW5rLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGFhc2luay5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+YWFzaW5rPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkFTQ0lJIGFydCB2aWRlbyBzaW5rPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5TaW5rL1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5BbiBBU0NJSSBhcnQgdmlkZW9zaW5rPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGNoZWxsby5iZSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylJNDIwLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVlYjBlOQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbApAQCAtMCwwICsxLDU1IEBACis8cGx1Z2luPgorICA8bmFtZT5hbGF3PC9uYW1lPgorICA8ZGVzY3JpcHRpb24+QUxhdyBhdWRpbyBjb252ZXJzaW9uIHJvdXRpbmVzPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9sYXcvLmxpYnMvbGliZ3N0YWxhdy5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RhbGF3LnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hbGF3ZGVjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkEgTGF3IGF1ZGlvIGRlY29kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlY29kZXIvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkNvbnZlcnQgOGJpdCBBIGxhdyB0byAxNmJpdCBQQ008L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5aYWhlZXIgQWJiYXMgTWVyYWxpICZsdDt6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZyZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtYWxhdywgcmF0ZT0oaW50KVsgODAwMCwgMTkyMDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVMxNkxFLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgODAwMCwgMTkyMDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hbGF3ZW5jPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkEgTGF3IGF1ZGlvIGVuY29kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0VuY29kZXIvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkNvbnZlcnQgMTZiaXQgUENNIHRvIDhiaXQgQSBsYXc8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5aYWhlZXIgQWJiYXMgTWVyYWxpICZsdDt6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZyZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylTMTZMRSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDgwMDAsIDE5MjAwMCBdLCBjaGFubmVscz0oaW50KVsgMSwgMiBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtYWxhdywgcmF0ZT0oaW50KVsgODAwMCwgMTkyMDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDkyM2M4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbApAQCAtMCwwICsxLDM2IEBACis8cGx1Z2luPgorICA8bmFtZT5hbHBoYTwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPmFkZHMgYW4gYWxwaGEgY2hhbm5lbCB0byB2aWRlbyAtIGNvbnN0YW50IG9yIHZpYSBjaHJvbWEta2V5aW5nPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9hbHBoYS8ubGlicy9saWJnc3RhbHBoYS5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RhbHBoYS5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+YWxwaGE8L25hbWU+CisgICAgICA8bG9uZ25hbWU+QWxwaGEgZmlsdGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5BZGRzIGFuIGFscGhhIGNoYW5uZWwgdG8gdmlkZW8gLSB1bmlmb3JtIG9yIHZpYSBjaHJvbWEta2V5aW5nPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDsKK0Vkd2FyZCBIZXJ2ZXkgJmx0O2Vkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrJmd0OworSmFuIFNjaG1pZHQgJmx0O3RoYXl0YW5Abm9yYWlzaW4ubmV0Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQVlVViwgQVJHQiwgQkdSQSwgQUJHUiwgUkdCQSwgWTQ0NCwgeFJHQiwgQkdSeCwgeEJHUiwgUkdCeCwgUkdCLCBCR1IsIFk0MkIsIFlVWTIsIFlWWVUsIFVZVlksIEk0MjAsIFlWMTIsIFk0MUIgfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEFZVVYsIEFSR0IsIEJHUkEsIEFCR1IsIFJHQkEsIFk0NDQsIHhSR0IsIEJHUngsIHhCR1IsIFJHQngsIFJHQiwgQkdSLCBZNDJCLCBZVVkyLCBZVllVLCBVWVZZLCBJNDIwLCBZVjEyLCBZNDFCIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTFlYjJmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmFscGhhY29sb3I8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5SR0JBIGZyb20vdG8gQVlVViBjb2xvcnNwYWNlIGNvbnZlcnNpb24gcHJlc2VydmluZyB0aGUgYWxwaGEgY2hhbm5lbDwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvYWxwaGEvLmxpYnMvbGliZ3N0YWxwaGFjb2xvci5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RhbHBoYWNvbG9yLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hbHBoYWNvbG9yPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkFscGhhIGNvbG9yIGZpbHRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0NvbnZlcnRlci9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+QVJHQiBmcm9tL3RvIEFZVVYgY29sb3JzcGFjZSBjb252ZXJzaW9uIHByZXNlcnZpbmcgdGhlIGFscGhhIGNoYW5uZWw8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUkdCQSwgQkdSQSwgQVJHQiwgQUJHUiwgQVlVViB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUkdCQSwgQkdSQSwgQVJHQiwgQUJHUiwgQVlVViB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NjUyN2MKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbApAQCAtMCwwICsxLDM0IEBACis8cGx1Z2luPgorICA8bmFtZT5hcGV0YWc8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5BUEV2MS8yIHRhZyByZWFkZXI8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L2FwZXRhZy8ubGlicy9saWJnc3RhcGV0YWcuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0YXBldGFnLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hcGVkZW11eDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BUEUgdGFnIGRlbXV4ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlbXV4ZXIvTWV0YWRhdGE8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlJlYWQgYW5kIG91dHB1dCBBUEUgdGFncyB3aGlsZSBkZW11eGluZyB0aGUgY29udGVudHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5UaW0tUGhpbGlwcCBNw7xsbGVyICZsdDt0aW0gY2VudHJpY3VsYXIgbmV0Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1hcGV0YWc8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MjlhNjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWwKQEAgLTAsMCArMSwyODYgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmF1ZGlvZng8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5BdWRpbyBlZmZlY3RzIHBsdWdpbjwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvYXVkaW9meC8ubGlicy9saWJnc3RhdWRpb2Z4LnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGF1ZGlvZnguc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmF1ZGlvYW1wbGlmeTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BdWRpbyBhbXBsaWZpZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkFtcGxpZmllcyBhbiBhdWRpbyBzdHJlYW0gYnkgYSBnaXZlbiBmYWN0b3I8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5TZWJhc3RpYW4gRHLDtmdlICZsdDtzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTOCwgUzE2TEUsIFMzMkxFLCBGMzJMRSwgRjY0TEUgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZyl7IGludGVybGVhdmVkLCBub24taW50ZXJsZWF2ZWQgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTOCwgUzE2TEUsIFMzMkxFLCBGMzJMRSwgRjY0TEUgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZyl7IGludGVybGVhdmVkLCBub24taW50ZXJsZWF2ZWQgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmF1ZGlvY2hlYmJhbmQ8L25hbWU+CisgICAgICA8bG9uZ25hbWU+QmFuZCBwYXNzICZhbXA7IGJhbmQgcmVqZWN0IGZpbHRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+Q2hlYnlzaGV2IGJhbmQgcGFzcyBhbmQgYmFuZCByZWplY3QgZmlsdGVyPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBGMzJMRSwgRjY0TEUgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBGMzJMRSwgRjY0TEUgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmF1ZGlvY2hlYmxpbWl0PC9uYW1lPgorICAgICAgPGxvbmduYW1lPkxvdyBwYXNzICZhbXA7IGhpZ2ggcGFzcyBmaWx0ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkNoZWJ5c2hldiBsb3cgcGFzcyBhbmQgaGlnaCBwYXNzIGZpbHRlcjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlNlYmFzdGlhbiBEcsO2Z2UgJmx0O3NlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgRjMyTEUsIEY2NExFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgRjMyTEUsIEY2NExFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hdWRpb2R5bmFtaWM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+RHluYW1pYyByYW5nZSBjb250cm9sbGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5Db21wcmVzc29yIGFuZCBFeHBhbmRlcjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlNlYmFzdGlhbiBEcsO2Z2UgJmx0O3Nsb21vQGNpcmN1bGFyLWNoYW9zLm9yZyZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFMxNkxFLCBGMzJMRSB9LCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGxheW91dD0oc3RyaW5nKXsgaW50ZXJsZWF2ZWQsIG5vbi1pbnRlcmxlYXZlZCB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFMxNkxFLCBGMzJMRSB9LCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGxheW91dD0oc3RyaW5nKXsgaW50ZXJsZWF2ZWQsIG5vbi1pbnRlcmxlYXZlZCB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+YXVkaW9lY2hvPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkF1ZGlvIGVjaG88L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkFkZHMgYW4gZWNobyBvciByZXZlcmIgZWZmZWN0IHRvIGFuIGF1ZGlvIHN0cmVhbTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlNlYmFzdGlhbiBEcsO2Z2UgJmx0O3NlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgRjMyTEUsIEY2NExFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgRjMyTEUsIEY2NExFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hdWRpb2ZpcmZpbHRlcjwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BdWRpbyBGSVIgZmlsdGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5HZW5lcmljIGF1ZGlvIEZJUiBmaWx0ZXIgd2l0aCBjdXN0b20gZmlsdGVyIGtlcm5lbDwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlNlYmFzdGlhbiBEcsO2Z2UgJmx0O3NlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgRjMyTEUsIEY2NExFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgRjMyTEUsIEY2NExFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hdWRpb2lpcmZpbHRlcjwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BdWRpbyBJSVIgZmlsdGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5HZW5lcmljIGF1ZGlvIElJUiBmaWx0ZXIgd2l0aCBjdXN0b20gZmlsdGVyIGtlcm5lbDwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlNlYmFzdGlhbiBEcsO2Z2UgJmx0O3NlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgRjMyTEUsIEY2NExFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgRjMyTEUsIEY2NExFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hdWRpb2ludmVydDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BdWRpbyBpbnZlcnNpb248L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlN3YXBzIHVwcGVyIGFuZCBsb3dlciBoYWxmIG9mIGF1ZGlvIHNhbXBsZXM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5TZWJhc3RpYW4gRHLDtmdlICZsdDtzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTMTZMRSwgRjMyTEUgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZyl7IGludGVybGVhdmVkLCBub24taW50ZXJsZWF2ZWQgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTMTZMRSwgRjMyTEUgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZyl7IGludGVybGVhdmVkLCBub24taW50ZXJsZWF2ZWQgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmF1ZGlva2FyYW9rZTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BdWRpb0thcmFva2U8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlJlbW92ZXMgdm9pY2UgZnJvbSBzb3VuZDwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTMTZMRSwgRjMyTEUgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KTIsIGNoYW5uZWwtbWFzaz0oYml0bWFzaykweDAwMDAwMDAwMDAwMDAwMDMsIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFMxNkxFLCBGMzJMRSB9LCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpMiwgY2hhbm5lbC1tYXNrPShiaXRtYXNrKTB4MDAwMDAwMDAwMDAwMDAwMywgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hdWRpb3Bhbm9yYW1hPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlN0ZXJlbyBwb3NpdGlvbmluZzwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UG9zaXRpb25zIGF1ZGlvIHN0cmVhbXMgaW4gdGhlIHN0ZXJlbyBwYW5vcmFtYTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlN0ZWZhbiBLb3N0ICZsdDtlbnNvbmljQHVzZXJzLnNmLm5ldCZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEYzMkxFLCBTMTZMRSB9LCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEYzMkxFLCBTMTZMRSB9LCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpMiwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hdWRpb3dzaW5jYmFuZDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5CYW5kIHBhc3MgJmFtcDsgYmFuZCByZWplY3QgZmlsdGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5CYW5kIHBhc3MgYW5kIGJhbmQgcmVqZWN0IHdpbmRvd2VkIHNpbmMgZmlsdGVyPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+VGhvbWFzIFZhbmRlciBTdGljaGVsZSAmbHQ7dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnJmd0OywgU3RldmVuIFcuIFNtaXRoLCBEcmVhbWxhYiBUZWNobm9sb2dpZXMgTHRkLiAmbHQ7bWF0aGlzLmhvZmVyQGRyZWFtbGFiLm5ldCZndDssIFNlYmFzdGlhbiBEcsO2Z2UgJmx0O3NlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgRjMyTEUsIEY2NExFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgRjMyTEUsIEY2NExFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hdWRpb3dzaW5jbGltaXQ8L25hbWU+CisgICAgICA8bG9uZ25hbWU+TG93IHBhc3MgJmFtcDsgaGlnaCBwYXNzIGZpbHRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+TG93IHBhc3MgYW5kIGhpZ2ggcGFzcyB3aW5kb3dlZCBzaW5jIGZpbHRlcjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlRob21hcyBWYW5kZXIgU3RpY2hlbGUgJmx0O3Rob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZyZndDssIFN0ZXZlbiBXLiBTbWl0aCwgRHJlYW1sYWIgVGVjaG5vbG9naWVzIEx0ZC4gJmx0O21hdGhpcy5ob2ZlckBkcmVhbWxhYi5uZXQmZ3Q7LCBTZWJhc3RpYW4gRHLDtmdlICZsdDtzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEYzMkxFLCBGNjRMRSB9LCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEYzMkxFLCBGNjRMRSB9LCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+c2NhbGV0ZW1wbzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5TY2FsZXRlbXBvPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L1JhdGU8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlN5bmMgYXVkaW8gdGVtcG8gd2l0aCBwbGF5YmFjayByYXRlPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+Um92IEp1dmFubyAmbHQ7cm92anV2YW5vQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylGMzJMRSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpRjY0TEUsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVMxNkxFLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUYzMkxFLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylGNjRMRSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpUzE2TEUsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY0Y2QyYQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sCkBAIC0wLDAgKzEsMTgxIEBACis8cGx1Z2luPgorICA8bmFtZT5hdWRpb3BhcnNlcnM8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5QYXJzZXJzIGZvciB2YXJpb3VzIGF1ZGlvIGZvcm1hdHM8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L2F1ZGlvcGFyc2Vycy8ubGlicy9saWJnc3RhdWRpb3BhcnNlcnMuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0YXVkaW9wYXJzZXJzLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hYWNwYXJzZTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BQUMgYXVkaW8gc3RyZWFtIHBhcnNlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGFyc2VyL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5BZHZhbmNlZCBBdWRpbyBDb2RpbmcgcGFyc2VyPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U3RlZmFuIEtvc3QgJmx0O3N0ZWZhbi5rb3N0QG5va2lhLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpeyAyLCA0IH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vbXBlZywgZnJhbWVkPShib29sZWFuKXRydWUsIG1wZWd2ZXJzaW9uPShpbnQpeyAyLCA0IH0sIHN0cmVhbS1mb3JtYXQ9KHN0cmluZyl7IHJhdywgYWR0cywgYWRpZiwgbG9hcyB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+YWMzcGFyc2U8L25hbWU+CisgICAgICA8bG9uZ25hbWU+QUMzIGF1ZGlvIHN0cmVhbSBwYXJzZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BhcnNlci9Db252ZXJ0ZXIvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkFDMyBwYXJzZXI8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5UaW0tUGhpbGlwcCBNw7xsbGVyICZsdDt0aW0gY2VudHJpY3VsYXIgbmV0Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1hYzM7IGF1ZGlvL3gtZWFjMzsgYXVkaW8vYWMzOyBhdWRpby94LXByaXZhdGUxLWFjMzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LWFjMywgZnJhbWVkPShib29sZWFuKXRydWUsIGNoYW5uZWxzPShpbnQpWyAxLCA2IF0sIHJhdGU9KGludClbIDgwMDAsIDQ4MDAwIF0sIGFsaWdubWVudD0oc3RyaW5nKXsgaWVjNjE5MzcsIGZyYW1lIH07IGF1ZGlvL3gtZWFjMywgZnJhbWVkPShib29sZWFuKXRydWUsIGNoYW5uZWxzPShpbnQpWyAxLCA2IF0sIHJhdGU9KGludClbIDgwMDAsIDQ4MDAwIF0sIGFsaWdubWVudD0oc3RyaW5nKXsgaWVjNjE5MzcsIGZyYW1lIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hbXJwYXJzZTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BTVIgYXVkaW8gc3RyZWFtIHBhcnNlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGFyc2VyL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5BZGFwdGl2ZSBNdWx0aS1SYXRlIGF1ZGlvIHBhcnNlcjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlJvbmFsZCBCdWx0amUgJmx0O3JidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldCZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtYW1yLW5iLXNoOyBhdWRpby94LWFtci13Yi1zaDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby9BTVIsIHJhdGU9KGludCk4MDAwLCBjaGFubmVscz0oaW50KTE7IGF1ZGlvL0FNUi1XQiwgcmF0ZT0oaW50KTE2MDAwLCBjaGFubmVscz0oaW50KTE8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5kY2FwYXJzZTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5EVFMgQ29oZXJlbnQgQWNvdXN0aWNzIGF1ZGlvIHN0cmVhbSBwYXJzZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BhcnNlci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RENBIHBhcnNlcjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlRpbS1QaGlsaXBwIE3DvGxsZXIgJmx0O3RpbSBjZW50cmljdWxhciBuZXQmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LWR0czsgYXVkaW8veC1wcml2YXRlMS1kdHM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1kdHMsIGZyYW1lZD0oYm9vbGVhbil0cnVlLCBjaGFubmVscz0oaW50KVsgMSwgOCBdLCByYXRlPShpbnQpWyA4MDAwLCAxOTIwMDAgXSwgZGVwdGg9KGludCl7IDE0LCAxNiB9LCBlbmRpYW5uZXNzPShpbnQpeyAxMjM0LCA0MzIxIH0sIGJsb2NrLXNpemU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWUtc2l6ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+ZmxhY3BhcnNlPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkZMQUMgYXVkaW8gcGFyc2VyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXJzZXIvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBhcnNlcyBhdWRpbyB3aXRoIHRoZSBGTEFDIGxvc3NsZXNzIGF1ZGlvIGNvZGVjPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LWZsYWM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1mbGFjLCBmcmFtZWQ9KGJvb2xlYW4pdHJ1ZSwgY2hhbm5lbHM9KGludClbIDEsIDggXSwgcmF0ZT0oaW50KVsgMSwgNjU1MzUwIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5tcGVnYXVkaW9wYXJzZTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5NUEVHMSBBdWRpbyBQYXJzZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BhcnNlci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGFyc2VzIGFuZCBmcmFtZXMgbXBlZzEgYXVkaW8gc3RyZWFtcyAobGV2ZWxzIDEtMyksIHByb3ZpZGVzIHNlZWs8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5KYW4gU2NobWlkdCAmbHQ7dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbSZndDssTWFyayBOYXV3ZWxhZXJ0cyAmbHQ7bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTE8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCkxLCBsYXllcj0oaW50KVsgMSwgMyBdLCBtcGVnYXVkaW92ZXJzaW9uPShpbnQpWyAxLCAzIF0sIHJhdGU9KGludClbIDgwMDAsIDQ4MDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF0sIHBhcnNlZD0oYm9vbGVhbil0cnVlPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+c2JjcGFyc2U8L25hbWU+CisgICAgICA8bG9uZ25hbWU+U0JDIGF1ZGlvIHBhcnNlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGFyc2VyL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXJzZXMgYW4gU0JDIGJsdWV0b290aCBhdWRpbyBzdHJlYW08L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5UaW0tUGhpbGlwcCBNw7xsbGVyICZsdDt0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtc2JjPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtc2JjLCBwYXJzZWQ9KGJvb2xlYW4pdHJ1ZSwgY2hhbm5lbHM9KGludClbIDEsIDIgXSwgcmF0ZT0oaW50KXsgMTYwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPndhdnBhY2twYXJzZTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5XYXZwYWNrIGF1ZGlvIHN0cmVhbSBwYXJzZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BhcnNlci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+V2F2cGFjayBwYXJzZXI8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5NYXJrIE5hdXdlbGFlcnRzICZsdDttYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtd2F2cGFjazwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXdhdnBhY2ssIGRlcHRoPShpbnQpWyAxLCAzMiBdLCBjaGFubmVscz0oaW50KVsgMSwgOCBdLCByYXRlPShpbnQpWyA2MDAwLCAxOTIwMDAgXSwgZnJhbWVkPShib29sZWFuKXRydWU7IGF1ZGlvL3gtd2F2cGFjay1jb3JyZWN0aW9uLCBmcmFtZWQ9KGJvb2xlYW4pdHJ1ZTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTM2YjhjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmF1cGFyc2U8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5wYXJzZXMgYXUgc3RyZWFtczwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvYXVwYXJzZS8ubGlicy9saWJnc3RhdXBhcnNlLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGF1cGFyc2Uuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmF1cGFyc2U8L25hbWU+CisgICAgICA8bG9uZ25hbWU+QVUgYXVkaW8gZGVtdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVtdXhlci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGFyc2UgYW4gLmF1IGZpbGUgaW50byByYXcgYXVkaW88L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5FcmlrIFdhbHRoaW5zZW4gJmx0O29tZWdhQGNzZS5vZ2kuZWR1Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1hdTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTOCwgUzE2TEUsIFMxNkJFLCBTMjRMRSwgUzI0QkUsIFMzMkxFLCBTMzJCRSwgRjMyTEUsIEYzMkJFLCBGNjRMRSwgRjY0QkUgfSwgcmF0ZT0oaW50KVsgODAwMCwgMTkyMDAwIF0sIGNoYW5uZWxzPShpbnQpMSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ7IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFM4LCBTMTZMRSwgUzE2QkUsIFMyNExFLCBTMjRCRSwgUzMyTEUsIFMzMkJFLCBGMzJMRSwgRjMyQkUsIEY2NExFLCBGNjRCRSB9LCByYXRlPShpbnQpWyA4MDAwLCAxOTIwMDAgXSwgY2hhbm5lbHM9KGludCkyLCBjaGFubmVsLW1hc2s9KGJpdG1hc2spMHgwMDAwMDAwMDAwMDAwMDAzLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDsgYXVkaW8veC1hbGF3LCByYXRlPShpbnQpWyA4MDAwLCAxOTIwMDAgXSwgY2hhbm5lbHM9KGludClbIDEsIDIgXTsgYXVkaW8veC1tdWxhdywgcmF0ZT0oaW50KVsgODAwMCwgMTkyMDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF07IGF1ZGlvL3gtYWRwY20sIGxheW91dD0oc3RyaW5nKXsgZzcyMSwgZzcyMiwgZzcyM18zLCBnNzIzXzUgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDI4NDExCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sCkBAIC0wLDAgKzEsNzMgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmF1dG9kZXRlY3Q8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5QbHVnaW4gY29udGFpbnMgYXV0by1kZXRlY3Rpb24gcGx1Z2lucyBmb3IgdmlkZW8vYXVkaW8gaW4tIGFuZCBvdXRwdXRzPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9hdXRvZGV0ZWN0Ly5saWJzL2xpYmdzdGF1dG9kZXRlY3Quc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0YXV0b2RldGVjdC5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+YXV0b2F1ZGlvc2luazwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BdXRvIGF1ZGlvIHNpbms8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNpbmsvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPldyYXBwZXIgYXVkaW8gc2luayBmb3IgYXV0b21hdGljYWxseSBkZXRlY3RlZCBhdWRpbyBzaW5rPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+SmFuIFNjaG1pZHQgJmx0O3RoYXl0YW5Abm9yYWlzaW4ubmV0Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+YXV0b2F1ZGlvc3JjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkF1dG8gYXVkaW8gc291cmNlPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Tb3VyY2UvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPldyYXBwZXIgYXVkaW8gc291cmNlIGZvciBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIGF1ZGlvIHNvdXJjZTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkphbiBTY2htaWR0ICZsdDt0aGF5dGFuQG5vcmFpc2luLm5ldCZndDssIFN0ZWZhbiBLb3N0ICZsdDtlbnNvbmljQHVzZXJzLnNmLm5ldCZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hdXRvdmlkZW9zaW5rPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkF1dG8gdmlkZW8gc2luazwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U2luay9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+V3JhcHBlciB2aWRlbyBzaW5rIGZvciBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHZpZGVvIHNpbms8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5KYW4gU2NobWlkdCAmbHQ7dGhheXRhbkBub3JhaXNpbi5uZXQmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hdXRvdmlkZW9zcmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+QXV0byB2aWRlbyBzb3VyY2U8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNvdXJjZS9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+V3JhcHBlciB2aWRlbyBzb3VyY2UgZm9yIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdmlkZW8gc291cmNlPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+SmFuIFNjaG1pZHQgJmx0O3RoYXl0YW5Abm9yYWlzaW4ubmV0Jmd0OywgU3RlZmFuIEtvc3QgJmx0O2Vuc29uaWNAdXNlcnMuc2YubmV0Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNiMDliNwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sCkBAIC0wLDAgKzEsMTAwIEBACis8cGx1Z2luPgorICA8bmFtZT5hdmk8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5BVkkgc3RyZWFtIGhhbmRsaW5nPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9hdmkvLmxpYnMvbGliZ3N0YXZpLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGF2aS5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+YXZpZGVtdXg8L25hbWU+CisgICAgICA8bG9uZ25hbWU+QXZpIGRlbXV4ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlbXV4ZXI8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkRlbXVsdGlwbGV4IGFuIGF2aSBmaWxlIGludG8gYXVkaW8gYW5kIHZpZGVvPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RXJpayBXYWx0aGluc2VuICZsdDtvbWVnYUBjc2Uub2dpLmVkdSZndDssIFdpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BjaGVsbG8uYmUmZ3Q7LCBUaGlqcyBWZXJtZWlyICZsdDt0aGlqc3Zlcm1laXJAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1tc3ZpZGVvPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPmF1ZGlvXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnNvbWV0aW1lczwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vbXMtZ3NtOyBhdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTEsIGxheWVyPShpbnQpMzsgYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCkxLCBsYXllcj0oaW50KTI7IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFM4LCBVOCwgUzE2TEUsIFUxNkxFLCBTMjRMRSwgVTI0TEUsIFMzMkxFLCBVMzJMRSB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDsgYXVkaW8veC12b3JiaXM7IGF1ZGlvL3gtYWMzOyBhdWRpby94LWR0czsgYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCk0OyBhdWRpby94LWFsYXc7IGF1ZGlvL3gtbXVsYXc7IGF1ZGlvL3gtd21zLCBiaXRyYXRlPShpbnQpWyAwLCAyMTQ3NDgzNjQ3IF0sIGJsb2NrX2FsaWduPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtYWRwY20sIGxheW91dD0oc3RyaW5nKW1pY3Jvc29mdCwgYmxvY2tfYWxpZ249KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC1hZHBjbSwgbGF5b3V0PShzdHJpbmcpZHZpLCBibG9ja19hbGlnbj0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LXRydWVzcGVlY2g7IGF1ZGlvL3gtd21hLCB3bWF2ZXJzaW9uPShpbnQpMSwgYml0cmF0ZT0oaW50KVsgMCwgMjE0NzQ4MzY0NyBdLCBibG9ja19hbGlnbj0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LXdtYSwgd21hdmVyc2lvbj0oaW50KTIsIGJpdHJhdGU9KGludClbIDAsIDIxNDc0ODM2NDcgXSwgYmxvY2tfYWxpZ249KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC13bWEsIHdtYXZlcnNpb249KGludCkzLCBiaXRyYXRlPShpbnQpWyAwLCAyMTQ3NDgzNjQ3IF0sIGJsb2NrX2FsaWduPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtdm5kLnNvbnkuYXRyYWMzOyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBGMzJMRSwgRjY0TEUgfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ7IGF1ZGlvL3gtdm94d2FyZSwgdm94d2FyZXR5cGU9KGludCkxMTc7IGF1ZGlvL3gtYWRwY20sIGxheW91dD0oc3RyaW5nKWRrNDsgYXVkaW8veC1hZHBjbSwgbGF5b3V0PShzdHJpbmcpZGszOyBhdWRpby94LWFkcGNtLCBsYXlvdXQ9KHN0cmluZylkdmk7IGF1ZGlvL0FNUjsgYXVkaW8vQU1SLVdCOyBhdWRpby94LXNpcmVuOyBhcHBsaWNhdGlvbi94LW9nZy1hdmk7IGF1ZGlvL3gtYXZpLXVua25vd248L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3VicGljdHVyZV8ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnN1YnBpY3R1cmUveC14c3ViPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnN1YnRpdGxlXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnNvbWV0aW1lczwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1zdWJ0aXRsZS1hdmk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+dmlkZW9fJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+c29tZXRpbWVzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWFzdXMsIGFzdXN2ZXJzaW9uPShpbnQpMSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWFzdXMsIGFzdXN2ZXJzaW9uPShpbnQpMiwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWNpcnJ1cy1sb2dpYy1hY2N1cGFrLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtY2Ftc3R1ZGlvLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtY29tcHJlc3NlZC15dXYsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUkdCOFAsIEJHUiwgQkdSeCB9LCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtZGl2eCwgZGl2eHZlcnNpb249KGludCkzLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtZGl2eCwgZGl2eHZlcnNpb249KGludCk0LCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtdHJ1ZW1vdGlvbiwgdHJ1ZXZlcnNpb249KGludCkxLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtZHYsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZSwgZHZ2ZXJzaW9uPShpbnQpMjUsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1kdiwgc3lzdGVtc3RyZWFtPShib29sZWFuKWZhbHNlLCBkdnZlcnNpb249KGludCk1MCwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWRpdngsIGRpdnh2ZXJzaW9uPShpbnQpNSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWZsYXNoLXZpZGVvLCBmbHZ2ZXJzaW9uPShpbnQpMSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXZwNi1mbGFzaCwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWgyNjMsIHZhcmlhbnQ9KHN0cmluZylpdHUsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1oMjYzLCB2YXJpYW50PShzdHJpbmcpbHVjZW50LCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtaDI2NCwgdmFyaWFudD0oc3RyaW5nKWl0dSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWh1ZmZ5dXYsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1pbnRlbC1oMjYzLCB2YXJpYW50PShzdHJpbmcpaW50ZWwsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUk0MjAsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1pbmRlbywgaW5kZW92ZXJzaW9uPShpbnQpMywgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWluZGVvLCBpbmRlb3ZlcnNpb249KGludCk0LCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtaW5kZW8sIGluZGVvdmVyc2lvbj0oaW50KTUsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1oMjYzLCB2YXJpYW50PShzdHJpbmcpbGVhZCwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWgyNjQsIHZhcmlhbnQ9KHN0cmluZylsZWFkLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtaDI2MywgdmFyaWFudD0oc3RyaW5nKW1pY3Jvc29mdCwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBpbWFnZS9qcGVnLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtbXNtcGVnLCBtc21wZWd2ZXJzaW9uPShpbnQpNDIsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1tc21wZWcsIG1zbXBlZ3ZlcnNpb249KGludCk0MywgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby9tcGVnLCBzeXN0ZW1zdHJlYW09KGJvb2xlYW4pZmFsc2UsIG1wZWd2ZXJzaW9uPShpbnQpMSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby9tcGVnLCBzeXN0ZW1zdHJlYW09KGJvb2xlYW4pZmFsc2UsIG1wZWd2ZXJzaW9uPShpbnQpMiwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LW1zbXBlZywgbXNtcGVndmVyc2lvbj0oaW50KTQxLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtbXN6aCwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBpbWFnZS9wbmcsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1ybGUsIGxheW91dD0oc3RyaW5nKW1pY3Jvc29mdCwgZGVwdGg9KGludClbIDEsIDY0IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1pbmRlbywgaW5kZW92ZXJzaW9uPShpbnQpMiwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby9zcDV4LCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtdHJ1ZW1vdGlvbiwgdHJ1ZXZlcnNpb249KGludCkyLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtY2FtdGFzaWEsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC11bHRpbW90aW9uLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylVWVZZLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtYXRpLXZjciwgdmNydmVyc2lvbj0oaW50KTEsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1hdGktdmNyLCB2Y3J2ZXJzaW9uPShpbnQpMiwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWgyNjMsIHZhcmlhbnQ9KHN0cmluZyl2ZG9saXZlLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtaDI2MywgdmFyaWFudD0oc3RyaW5nKXZpdm8sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC12bW5jLCB2ZXJzaW9uPShpbnQpMSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXZwMywgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWgyNjQsIHZhcmlhbnQ9KHN0cmluZyl2aWRlb3NvZnQsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC13bXYsIHdtdnZlcnNpb249KGludCkxLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtd212LCB3bXZ2ZXJzaW9uPShpbnQpMiwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXdtdiwgd212dmVyc2lvbj0oaW50KTMsIGZvcm1hdD0oc3RyaW5nKVdNVjMsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCk0LCBzeXN0ZW1zdHJlYW09KGJvb2xlYW4pZmFsc2UsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC14YW4sIHdjdmVyc2lvbj0oaW50KTQsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVlVWTIsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVlWVTksIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC16bGliLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtY2luZXBhaywgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWgyNjQsIHZhcmlhbnQ9KHN0cmluZylpdHUsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1tc3ZpZGVvY29kZWMsIG1zdmlkZW92ZXJzaW9uPShpbnQpMSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWgyNjMsIHZhcmlhbnQ9KHN0cmluZyl4aXJsaW5rLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtZGlyYWMsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1mZnYsIGZmdnZlcnNpb249KGludCkxLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gta212YywgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXZwNSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXZwNiwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXZwNi1mbGFzaCwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXZwNywgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXZwOCwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LW1pbWljLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtYXBwbGUtdmlkZW8sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC10aGVvcmEsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1mcmFwcywgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWFhc2MsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVlWMTIsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1sb2NvLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtem1idiwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpdjIxMCwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpcjIxMCwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWR2LCBzeXN0ZW1zdHJlYW09KGJvb2xlYW4pdHJ1ZTsgdmlkZW8veC1hdmktdW5rbm93bjwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmF2aW11eDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BdmkgbXV4ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL011eGVyPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5NdXhlcyBhdWRpbyBhbmQgdmlkZW8gaW50byBhbiBhdmkgc3RyZWFtPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+R1N0cmVhbWVyIG1haW50YWluZXJzICZsdDtnc3RyZWFtZXItZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPmF1ZGlvXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBVOCwgUzE2TEUgfSwgcmF0ZT0oaW50KVsgMTAwMCwgOTYwMDAgXSwgY2hhbm5lbHM9KGludClbIDEsIDIgXTsgYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCkxLCBsYXllcj0oaW50KVsgMSwgMyBdLCByYXRlPShpbnQpWyAxMDAwLCA5NjAwMCBdLCBjaGFubmVscz0oaW50KVsgMSwgMiBdOyBhdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylyYXcsIHJhdGU9KGludClbIDEwMDAsIDk2MDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF07IGF1ZGlvL3gtYWMzLCByYXRlPShpbnQpWyAxMDAwLCA5NjAwMCBdLCBjaGFubmVscz0oaW50KVsgMSwgNiBdOyBhdWRpby94LWFsYXcsIHJhdGU9KGludClbIDEwMDAsIDQ4MDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF07IGF1ZGlvL3gtbXVsYXcsIHJhdGU9KGludClbIDEwMDAsIDQ4MDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF07IGF1ZGlvL3gtd21hLCByYXRlPShpbnQpWyAxMDAwLCA5NjAwMCBdLCBjaGFubmVscz0oaW50KVsgMSwgMiBdLCB3bWF2ZXJzaW9uPShpbnQpWyAxLCAyIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+dmlkZW9fJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFlVWTIsIEk0MjAsIEJHUiwgQkdSeCwgQkdSQSwgR1JBWTgsIFVZVlkgfSwgd2lkdGg9KGludClbIDE2LCA0MDk2IF0sIGhlaWdodD0oaW50KVsgMTYsIDQwOTYgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF07IGltYWdlL2pwZWcsIHdpZHRoPShpbnQpWyAxNiwgNDA5NiBdLCBoZWlnaHQ9KGludClbIDE2LCA0MDk2IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LWRpdngsIHdpZHRoPShpbnQpWyAxNiwgNDA5NiBdLCBoZWlnaHQ9KGludClbIDE2LCA0MDk2IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCBkaXZ4dmVyc2lvbj0oaW50KVsgMywgNSBdOyB2aWRlby94LW1zbXBlZywgd2lkdGg9KGludClbIDE2LCA0MDk2IF0sIGhlaWdodD0oaW50KVsgMTYsIDQwOTYgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIG1zbXBlZ3ZlcnNpb249KGludClbIDQxLCA0MyBdOyB2aWRlby9tcGVnLCB3aWR0aD0oaW50KVsgMTYsIDQwOTYgXSwgaGVpZ2h0PShpbnQpWyAxNiwgNDA5NiBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgbXBlZ3ZlcnNpb249KGludCl7IDEsIDIsIDQgfSwgc3lzdGVtc3RyZWFtPShib29sZWFuKWZhbHNlOyB2aWRlby94LWgyNjMsIHdpZHRoPShpbnQpWyAxNiwgNDA5NiBdLCBoZWlnaHQ9KGludClbIDE2LCA0MDk2IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LWgyNjQsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylieXRlLXN0cmVhbSwgYWxpZ25tZW50PShzdHJpbmcpYXUsIHdpZHRoPShpbnQpWyAxNiwgNDA5NiBdLCBoZWlnaHQ9KGludClbIDE2LCA0MDk2IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LWR2LCB3aWR0aD0oaW50KTcyMCwgaGVpZ2h0PShpbnQpeyA1NzYsIDQ4MCB9LCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgc3lzdGVtc3RyZWFtPShib29sZWFuKWZhbHNlOyB2aWRlby94LWh1ZmZ5dXYsIHdpZHRoPShpbnQpWyAxNiwgNDA5NiBdLCBoZWlnaHQ9KGludClbIDE2LCA0MDk2IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LXdtdiwgd2lkdGg9KGludClbIDE2LCA0MDk2IF0sIGhlaWdodD0oaW50KVsgMTYsIDQwOTYgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdtdnZlcnNpb249KGludClbIDEsIDMgXTsgaW1hZ2UveC1qcGMsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC12cDgsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgaW1hZ2UvcG5nLCB3aWR0aD0oaW50KVsgMTYsIDQwOTYgXSwgaGVpZ2h0PShpbnQpWyAxNiwgNDA5NiBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LW1zdmlkZW88L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hdmlzdWJ0aXRsZTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5Bdmkgc3VidGl0bGUgcGFyc2VyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXJzZXIvU3VidGl0bGU8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBhcnNlIGF2aSBzdWJ0aXRsZSBzdHJlYW08L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5UaGlqcyBWZXJtZWlyICZsdDt0aGlqc3Zlcm1laXJAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1zdWJ0aXRsZS1hdmk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1zdWJ0aXRsZTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYmNlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sCkBAIC0wLDAgKzEsMjggQEAKKzxwbHVnaW4+CisgIDxuYW1lPmNhY2FzaW5rPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+Q29sb3JlZCBBU0NJSSBBcnQgdmlkZW8gc2luazwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9leHQvbGliY2FjYS8ubGlicy9saWJnc3RjYWNhc2luay5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RjYWNhc2luay5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+Y2FjYXNpbms8L25hbWU+CisgICAgICA8bG9uZ25hbWU+QSBjb2xvcmVkIEFTQ0lJIGFydCB2aWRlbyBzaW5rPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5TaW5rL1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5BIGNvbG9yZWQgQVNDSUkgYXJ0IHZpZGVvc2luazwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlplZXNoYW4gQWxpICZsdDt6YWsxNDdAeWFob28uY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUkdCLCBCR1IsIFJHQngsIHhSR0IsIEJHUngsIHhCR1IsIFJHQjE2LCBSR0IxNSB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2MyYTJmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbApAQCAtMCwwICsxLDM0IEBACis8cGx1Z2luPgorICA8bmFtZT5jYWlybzwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkNhaXJvLWJhc2VkIGVsZW1lbnRzPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2V4dC9jYWlyby8ubGlicy9saWJnc3RjYWlyby5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RjYWlyby5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+Y2Fpcm9vdmVybGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPkNhaXJvIG92ZXJsYXk8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZGl0b3IvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlJlbmRlciBvdmVybGF5IG9uIGEgdmlkZW8gc3RyZWFtIHVzaW5nIENhaXJvPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+Sm9uIE5vcmRieSAmbHQ7am9ub25vckBnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBCR1J4LCBCR1JBLCBSR0IxNiB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQkdSeCwgQkdSQSwgUkdCMTYgfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjBkMjE4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWwKQEAgLTAsMCArMSwzNCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+Y3V0dGVyPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+QXVkaW8gQ3V0dGVyIHRvIHNwbGl0IGF1ZGlvIGludG8gbm9uLXNpbGVudCBiaXRzPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9jdXR0ZXIvLmxpYnMvbGliZ3N0Y3V0dGVyLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGN1dHRlci5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+Y3V0dGVyPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkF1ZGlvIGN1dHRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VkaXRvci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+QXVkaW8gQ3V0dGVyIHRvIHNwbGl0IGF1ZGlvIGludG8gbm9uLXNpbGVudCBiaXRzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+VGhvbWFzIFZhbmRlciBTdGljaGVsZSAmbHQ7dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzgsIFMxNkxFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzgsIFMxNkxFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWQ5MWMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbApAQCAtMCwwICsxLDE5MCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+ZGVidWc8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5lbGVtZW50cyBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9kZWJ1Z3V0aWxzLy5saWJzL2xpYmdzdGRlYnVnLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGRlYnVnLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5icmVha215ZGF0YTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5CcmVhayBteSBkYXRhPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5UZXN0aW5nPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5yYW5kb21seSBjaGFuZ2UgZGF0YSBpbiB0aGUgc3RyZWFtPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+QmVuamFtaW4gT3R0ZSAmbHQ7b3R0ZUBnbm9tZSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5jYXBzc2V0dGVyPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkNhcHNTZXR0ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkdlbmVyaWM8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlNldC9tZXJnZSBjYXBzIG9uIHN0cmVhbTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPk1hcmsgTmF1d2VsYWVydHMgJmx0O21uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldCZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5jcHVyZXBvcnQ8L25hbWU+CisgICAgICA8bG9uZ25hbWU+Q1BVIHJlcG9ydDwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+VGVzdGluZzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UG9zdCBjcHUgdXNhZ2UgaW5mb3JtYXRpb24gZXZlcnkgYnVmZmVyPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+WmFoZWVyIEFiYmFzIE1lcmFsaSAmbHQ7emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+bmF2c2VlazwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5TZWVrIGJhc2VkIG9uIGxlZnQtcmlnaHQgYXJyb3dzPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlNlZWsgYmFzZWQgb24gbmF2aWdhdGlvbiBrZXlzIGxlZnQtcmlnaHQ8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5KYW4gU2NobWlkdCAmbHQ7dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5wcm9ncmVzc3JlcG9ydDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5Qcm9ncmVzcyByZXBvcnQ8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlRlc3Rpbmc8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBlcmlvZGljYWxseSBxdWVyeSBhbmQgcmVwb3J0IG9uIHByb2Nlc3NpbmcgcHJvZ3Jlc3M8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5KYW4gU2NobWlkdCAmbHQ7dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5wdXNoZmlsZXNyYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5QdXNoIEZpbGUgU291cmNlPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5UZXN0aW5nPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5JbXBsZW1lbnRzIHB1c2hmaWxlOi8vIFVSSS1oYW5kbGVyIGZvciBwdXNoLWJhc2VkIGZpbGUgYWNjZXNzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+VGltLVBoaWxpcHAgTcO8bGxlciAmbHQ7dGltIGNlbnRyaWN1bGFyIG5ldCZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ybmRidWZmZXJzaXplPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJhbmRvbSBidWZmZXIgc2l6ZTwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+VGVzdGluZzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+cHVsbCByYW5kb20gc2l6ZWQgYnVmZmVyczwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlN0ZWZhbiBLb3N0ICZsdDtzdGVmYW4ua29zdEBub2tpYS5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+dGFnaW5qZWN0PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlRhZ0luamVjdDwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+R2VuZXJpYzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+aW5qZWN0IG1ldGFkYXRhIHRhZ3M8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5TdGVmYW4gS29zdCAmbHQ7ZW5zb25pY0B1c2Vycy5zZi5uZXQmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+dGVzdHNpbms8L25hbWU+CisgICAgICA8bG9uZ25hbWU+VGVzdCBwbHVnaW48L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlRlc3Rpbmc8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPnBlcmZvcm0gYSBudW1iZXIgb2YgdGVzdHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5CZW5qYW1pbiBPdHRlICZsdDtvdHRlQGdub21lJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ4NDdkNQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWwKQEAgLTAsMCArMSwzNCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+ZGVpbnRlcmxhY2U8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5EZWludGVybGFjZXI8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L2RlaW50ZXJsYWNlLy5saWJzL2xpYmdzdGRlaW50ZXJsYWNlLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGRlaW50ZXJsYWNlLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5kZWludGVybGFjZTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5EZWludGVybGFjZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvVmlkZW8vRGVpbnRlcmxhY2U8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkRlaW50ZXJsYWNlIE1ldGhvZHMgcG9ydGVkIGZyb20gRFNjYWxlci9UdlRpbWU8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5NYXJ0aW4gRWlrZXJtYW5uICZsdDttZWlrZXJAdXBiLmRlJmd0OywgU2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBBWVVWLCBBUkdCLCBBQkdSLCBSR0JBLCBCR1JBLCBZNDQ0LCB4UkdCLCB4QkdSLCBSR0J4LCBCR1J4LCBSR0IsIEJHUiwgWVVZMiwgWVZZVSwgVVlWWSwgWTQyQiwgSTQyMCwgWVYxMiwgWTQxQiwgTlYxMiwgTlYyMSB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF07IHZpZGVvL3gtcmF3KEFOWSksIGZvcm1hdD0oc3RyaW5nKXsgSTQyMCwgWVYxMiwgWVVZMiwgVVlWWSwgQVlVViwgUkdCeCwgQkdSeCwgeFJHQiwgeEJHUiwgUkdCQSwgQkdSQSwgQVJHQiwgQUJHUiwgUkdCLCBCR1IsIFk0MUIsIFk0MkIsIFlWWVUsIFk0NDQsIHYyMTAsIHYyMTYsIE5WMTIsIE5WMjEsIEdSQVk4LCBHUkFZMTZfQkUsIEdSQVkxNl9MRSwgdjMwOCwgUkdCMTYsIEJHUjE2LCBSR0IxNSwgQkdSMTUsIFVZVlAsIEE0MjAsIFJHQjhQLCBZVVY5LCBZVlU5LCBJWVUxLCBBUkdCNjQsIEFZVVY2NCwgcjIxMCwgSTQyMF8xMEJFLCBJNDIwXzEwTEUsIEk0MjJfMTBCRSwgSTQyMl8xMExFLCBZNDQ0XzEwQkUsIFk0NDRfMTBMRSwgR0JSLCBHQlJfMTBCRSwgR0JSXzEwTEUsIE5WMTYsIE5WMjQsIE5WMTJfNjRaMzIsIEE0MjBfMTBCRSwgQTQyMF8xMExFLCBBNDIyXzEwQkUsIEE0MjJfMTBMRSwgQTQ0NF8xMEJFLCBBNDQ0XzEwTEUsIE5WNjEsIFAwMTBfMTBCRSwgUDAxMF8xMExFLCBJWVUyLCBWWVVZLCBHQlJBLCBHQlJBXzEwQkUsIEdCUkFfMTBMRSwgR0JSXzEyQkUsIEdCUl8xMkxFLCBHQlJBXzEyQkUsIEdCUkFfMTJMRSwgSTQyMF8xMkJFLCBJNDIwXzEyTEUsIEk0MjJfMTJCRSwgSTQyMl8xMkxFLCBZNDQ0XzEyQkUsIFk0NDRfMTJMRSwgR1JBWTEwX0xFMzIsIE5WMTJfMTBMRTMyLCBOVjE2XzEwTEUzMiB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQVlVViwgQVJHQiwgQUJHUiwgUkdCQSwgQkdSQSwgWTQ0NCwgeFJHQiwgeEJHUiwgUkdCeCwgQkdSeCwgUkdCLCBCR1IsIFlVWTIsIFlWWVUsIFVZVlksIFk0MkIsIEk0MjAsIFlWMTIsIFk0MUIsIE5WMTIsIE5WMjEgfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LXJhdyhBTlkpLCBmb3JtYXQ9KHN0cmluZyl7IEk0MjAsIFlWMTIsIFlVWTIsIFVZVlksIEFZVVYsIFJHQngsIEJHUngsIHhSR0IsIHhCR1IsIFJHQkEsIEJHUkEsIEFSR0IsIEFCR1IsIFJHQiwgQkdSLCBZNDFCLCBZNDJCLCBZVllVLCBZNDQ0LCB2MjEwLCB2MjE2LCBOVjEyLCBOVjIxLCBHUkFZOCwgR1JBWTE2X0JFLCBHUkFZMTZfTEUsIHYzMDgsIFJHQjE2LCBCR1IxNiwgUkdCMTUsIEJHUjE1LCBVWVZQLCBBNDIwLCBSR0I4UCwgWVVWOSwgWVZVOSwgSVlVMSwgQVJHQjY0LCBBWVVWNjQsIHIyMTAsIEk0MjBfMTBCRSwgSTQyMF8xMExFLCBJNDIyXzEwQkUsIEk0MjJfMTBMRSwgWTQ0NF8xMEJFLCBZNDQ0XzEwTEUsIEdCUiwgR0JSXzEwQkUsIEdCUl8xMExFLCBOVjE2LCBOVjI0LCBOVjEyXzY0WjMyLCBBNDIwXzEwQkUsIEE0MjBfMTBMRSwgQTQyMl8xMEJFLCBBNDIyXzEwTEUsIEE0NDRfMTBCRSwgQTQ0NF8xMExFLCBOVjYxLCBQMDEwXzEwQkUsIFAwMTBfMTBMRSwgSVlVMiwgVllVWSwgR0JSQSwgR0JSQV8xMEJFLCBHQlJBXzEwTEUsIEdCUl8xMkJFLCBHQlJfMTJMRSwgR0JSQV8xMkJFLCBHQlJBXzEyTEUsIEk0MjBfMTJCRSwgSTQyMF8xMkxFLCBJNDIyXzEyQkUsIEk0MjJfMTJMRSwgWTQ0NF8xMkJFLCBZNDQ0XzEyTEUsIEdSQVkxMF9MRTMyLCBOVjEyXzEwTEUzMiwgTlYxNl8xMExFMzIgfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRpcmVjdHNvdW5kLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kaXJlY3Rzb3VuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5Y2NkNgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kaXJlY3Rzb3VuZC54bWwKQEAgLTAsMCArMSwyMCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+ZGlyZWN0c291bmQ8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5EaXJlY3RTb3VuZCBwbHVnaW48L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vd2luMzIvdnM2L3JlbGVhc2UvbGliZ3N0ZGlyZWN0c291bmQuZGxsPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGRpcmVjdHNvdW5kLmRsbDwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjAuMTAuNC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWJhZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBDVlM8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5kaXJlY3Rzb3VuZHNpbms8L25hbWU+CisgICAgICA8bG9uZ25hbWU+RGlyZWN0U291bmQgYXVkaW8gc2luazwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U2luay9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RGlyZWN0U291bmQgYXVkaW8gc2luazwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlNlYmFzdGllbiBNb3V0dGUgJmx0O3NlYmFzdGllbkBtb3V0dGUubmV0Jmd0OzwvYXV0aG9yPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNjQ4NDUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWwKQEAgLTAsMCArMSw2NCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+ZHRtZjwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkRUTUYgcGx1Z2luczwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvZHRtZi8ubGlicy9saWJnc3RkdG1mLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGR0bWYuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmR0bWZzcmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+RFRNRiB0b25lIGdlbmVyYXRvcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U291cmNlL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5HZW5lcmF0ZXMgRFRNRiB0b25lczwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPllvdW5lc3MgQWxhb3VpICZsdDt5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVMxNkxFLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpMTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGR0bWZkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgRFRNRiBwYWNrZXQgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcms8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkdlbmVyYXRlcyBEVE1GIFNvdW5kIGZyb20gdGVsZXBob25lLWV2ZW50IFJUUCBwYWNrZXRzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+WW91bmVzcyBBbGFvdWkgJmx0O3lvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludClbIDAsIDIxNDc0ODM2NDcgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKVRFTEVQSE9ORS1FVkVOVDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpUzE2TEUsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludCkxPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwZHRtZnNyYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgRFRNRiBwYWNrZXQgZ2VuZXJhdG9yPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Tb3VyY2UvTmV0d29yazwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+R2VuZXJhdGVzIFJUUCBEVE1GIHBhY2tldHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5aZWVzaGFuIEFsaSAmbHQ7emVlc2hhbi5hbGlAbm9raWEuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludClbIDAsIDIxNDc0ODM2NDcgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKVRFTEVQSE9ORS1FVkVOVDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzk1MGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sCkBAIC0wLDAgKzEsNjEgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmR2PC9uYW1lPgorICA8ZGVzY3JpcHRpb24+RFYgZGVtdXhlciBhbmQgZGVjb2RlciBiYXNlZCBvbiBsaWJkdiAobGliZHYuc2YubmV0KTwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9leHQvZHYvLmxpYnMvbGliZ3N0ZHYuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0ZHYuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmR2ZGVjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkRWIHZpZGVvIGRlY29kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlY29kZXIvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlVzZXMgbGliZHYgdG8gZGVjb2RlIERWIHZpZGVvIChzbXB0ZTMxNCkgKGxpYmR2LnNvdXJjZWZvcmdlLm5ldCk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5FcmlrIFdhbHRoaW5zZW4gJmx0O29tZWdhQGNzZS5vZ2kuZWR1Jmd0OyxXaW0gVGF5bWFucyAmbHQ7d2ltQGZsdWVuZG8uY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1kdiwgc3lzdGVtc3RyZWFtPShib29sZWFuKWZhbHNlPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFlVWTIsIEJHUngsIFJHQiB9LCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMS8xLCA2MC8xIF0sIHdpZHRoPShpbnQpNzIwLCBoZWlnaHQ9KGludCl7IDU3NiwgNDgwIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5kdmRlbXV4PC9uYW1lPgorICAgICAgPGxvbmduYW1lPkRWIHN5c3RlbSBzdHJlYW0gZGVtdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVtdXhlcjwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+VXNlcyBsaWJkdiB0byBzZXBhcmF0ZSBEViBhdWRpbyBmcm9tIERWIHZpZGVvIChsaWJkdi5zb3VyY2Vmb3JnZS5uZXQpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RXJpayBXYWx0aGluc2VuICZsdDtvbWVnYUBjc2Uub2dpLmVkdSZndDssIFdpbSBUYXltYW5zICZsdDt3aW1AZmx1ZW5kby5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LWR2LCBzeXN0ZW1zdHJlYW09KGJvb2xlYW4pdHJ1ZTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5hdWRpbzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylTMTZMRSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludCl7IDMyMDAwLCA0NDEwMCwgNDgwMDAgfSwgY2hhbm5lbHM9KGludCl7IDIsIDQgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT52aWRlbzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtZHYsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTIyYWRiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sCkBAIC0wLDAgKzEsMjY1IEBACis8cGx1Z2luPgorICA8bmFtZT5lZmZlY3R2PC9uYW1lPgorICA8ZGVzY3JpcHRpb24+ZWZmZWN0IHBsdWdpbnMgZnJvbSB0aGUgZWZmZWN0diBwcm9qZWN0PC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9lZmZlY3R2Ly5saWJzL2xpYmdzdGVmZmVjdHYuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0ZWZmZWN0di5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+YWdpbmd0djwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BZ2luZ1RWIGVmZmVjdDwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+QWdpbmdUViBhZGRzIGFnZSB0byB2aWRlbyBpbnB1dCB1c2luZyBzY3JhdGNoZXMgYW5kIGR1c3Q8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5TYW0gTGFudGluZ2EgJmx0O3Nsb3VrZW5AZGV2b2x1dGlvbi5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBCR1J4LCBSR0J4IH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBCR1J4LCBSR0J4IH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmRpY2V0djwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5EaWNlVFYgZWZmZWN0PC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj4mYXBvcztEaWNlcyZhcG9zOyB0aGUgc2NyZWVuIHVwIGludG8gbWFueSBzbWFsbCBzcXVhcmVzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmJlJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUkdCeCwgeFJHQiwgQkdSeCwgeEJHUiB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUkdCeCwgeFJHQiwgQkdSeCwgeEJHUiB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5lZGdldHY8L25hbWU+CisgICAgICA8bG9uZ25hbWU+RWRnZVRWIGVmZmVjdDwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+QXBwbHkgZWRnZSBkZXRlY3Qgb24gdmlkZW88L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAY2hlbGxvLmJlJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQkdSeCwgUkdCeCB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQkdSeCwgUkdCeCB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5vcHR2PC9uYW1lPgorICAgICAgPGxvbmduYW1lPk9wVFYgZWZmZWN0PC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5PcHRpY2FsIGFydCBtZWV0cyByZWFsLXRpbWUgdmlkZW8gZWZmZWN0PC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RlVLVUNISSwgS2VudGFyb3UgJmx0O2Z1a3VjaGlAdXNlcnMuc291cmNlZm9yZ2UubmV0Jmd0OywgU2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBCR1J4LCBSR0J4IH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBCR1J4LCBSR0J4IH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnF1YXJrdHY8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UXVhcmtUViBlZmZlY3Q8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPk1vdGlvbiBkaXNzb2x2ZXI8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5GVUtVQ0hJLCBLZW50YXJvdSAmbHQ7ZnVrdWNoaUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyB4UkdCLCB4QkdSLCBCR1J4LCBSR0J4IH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyB4UkdCLCB4QkdSLCBCR1J4LCBSR0J4IH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJhZGlvYWN0djwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SYWRpb2FjVFYgZWZmZWN0PC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5tb3Rpb24tZW5saWdodG1lbnQgZWZmZWN0PC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RlVLVUNISSwgS2VudGFyb3UgJmx0O2Z1a3VjaGlAdXNlcnMuc291cmNlZm9yZ2UubmV0Jmd0OywgU2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBSR0J4LCBCR1J4IH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBSR0J4LCBCR1J4IH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJldnR2PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJldlRWIGVmZmVjdDwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+QSB2aWRlbyB3YXZlZm9ybSBtb25pdG9yIGZvciBlYWNoIGxpbmUgb2YgdmlkZW8gcHJvY2Vzc2VkPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmJlJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQkdSeCwgUkdCeCB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQkdSeCwgUkdCeCB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5yaXBwbGV0djwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SaXBwbGVUViBlZmZlY3Q8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlJpcHBsZVRWIGRvZXMgcmlwcGxlIG1hcmsgZWZmZWN0IG9uIHRoZSB2aWRlbyBpbnB1dDwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkZVS1VDSEksIEtlbnRhcm91ICZsdDtmdWt1Y2hpQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCZndDssIFNlYmFzdGlhbiBEcsO2Z2UgJmx0O3NlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQkdSeCwgUkdCeCwgeEJHUiwgeFJHQiB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQkdSeCwgUkdCeCwgeEJHUiwgeFJHQiB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5zaGFnYWRlbGljdHY8L25hbWU+CisgICAgICA8bG9uZ25hbWU+U2hhZ2FkZWxpY1RWPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5PaCBiZWhhdmUsIFNoYWdlZGVsaWNUViBtYWtlcyBpbWFnZXMgc2hhZ2FkZWxpYyE8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAY2hlbGxvLmJlJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUJHUngsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpQkdSeCwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+c3RyZWFrdHY8L25hbWU+CisgICAgICA8bG9uZ25hbWU+U3RyZWFrVFYgZWZmZWN0PC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5TdHJlYWtUViBtYWtlcyBhZnRlciBpbWFnZXMgb2YgbW92aW5nIG9iamVjdHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5GVUtVQ0hJLCBLZW50YXJvdSAmbHQ7ZnVrdWNoaUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQmZ3Q7LCBTZWJhc3RpYW4gRHLDtmdlICZsdDtzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEJHUngsIFJHQngsIHhCR1IsIHhSR0IgfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEJHUngsIFJHQngsIHhCR1IsIHhSR0IgfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+dmVydGlnb3R2PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlZlcnRpZ29UViBlZmZlY3Q8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkEgbG9vcGJhY2sgYWxwaGEgYmxlbmRpbmcgZWZmZWN0b3Igd2l0aCByb3RhdGluZyBhbmQgc2NhbGluZzwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5iZSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFJHQngsIEJHUnggfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFJHQngsIEJHUnggfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+d2FycHR2PC9uYW1lPgorICAgICAgPGxvbmduYW1lPldhcnBUViBlZmZlY3Q8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPldhcnBUViBkb2VzIHJlYWx0aW1lIGdvbyZhcG9zO2luZyBvZiB0aGUgdmlkZW8gaW5wdXQ8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5TYW0gTGFudGluZ2EgJmx0O3Nsb3VrZW5AZGV2b2x1dGlvbi5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBSR0J4LCB4UkdCLCBCR1J4LCB4QkdSIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBSR0J4LCB4UkdCLCBCR1J4LCB4QkdSIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U2YjY3NgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sCkBAIC0wLDAgKzEsNzYgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmVxdWFsaXplcjwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkdTdHJlYW1lciBhdWRpbyBlcXVhbGl6ZXJzPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9lcXVhbGl6ZXIvLmxpYnMvbGliZ3N0ZXF1YWxpemVyLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGVxdWFsaXplci5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+ZXF1YWxpemVyLTEwYmFuZHM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+MTAgQmFuZCBFcXVhbGl6ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkRpcmVjdCBGb3JtIDEwIGJhbmQgSUlSIGVxdWFsaXplcjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlN0ZWZhbiBLb3N0ICZsdDtlbnNvbmljQHVzZXJzLnNmLm5ldCZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFMxNkxFLCBGMzJMRSwgRjY0TEUgfSwgcmF0ZT0oaW50KVsgMTAwMCwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTMTZMRSwgRjMyTEUsIEY2NExFIH0sIHJhdGU9KGludClbIDEwMDAsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5lcXVhbGl6ZXItM2JhbmRzPC9uYW1lPgorICAgICAgPGxvbmduYW1lPjMgQmFuZCBFcXVhbGl6ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkRpcmVjdCBGb3JtIDMgYmFuZCBJSVIgZXF1YWxpemVyPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U3RlZmFuIEtvc3QgJmx0O2Vuc29uaWNAdXNlcnMuc2YubmV0Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzE2TEUsIEYzMkxFLCBGNjRMRSB9LCByYXRlPShpbnQpWyAxMDAwLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFMxNkxFLCBGMzJMRSwgRjY0TEUgfSwgcmF0ZT0oaW50KVsgMTAwMCwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmVxdWFsaXplci1uYmFuZHM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+TiBCYW5kIEVxdWFsaXplcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RGlyZWN0IEZvcm0gSUlSIGVxdWFsaXplcjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkJlbmphbWluIE90dGUgJmx0O290dGVAZ25vbWUub3JnJmd0OywgU3RlZmFuIEtvc3QgJmx0O2Vuc29uaWNAdXNlcnMuc2YubmV0Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzE2TEUsIEYzMkxFLCBGNjRMRSB9LCByYXRlPShpbnQpWyAxMDAwLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFMxNkxFLCBGMzJMRSwgRjY0TEUgfSwgcmF0ZT0oaW50KVsgMTAwMCwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODFhMGIwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sCkBAIC0wLDAgKzEsNzYgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmZsYWM8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5UaGUgRkxBQyBMb3NzbGVzcyBjb21wcmVzc29yIENvZGVjPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2V4dC9mbGFjLy5saWJzL2xpYmdzdGZsYWMuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0ZmxhYy5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+ZmxhY2RlYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5GTEFDIGF1ZGlvIGRlY29kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlY29kZXIvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkRlY29kZXMgRkxBQyBsb3NzbGVzcyBhdWRpbyBzdHJlYW1zPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+VGltLVBoaWxpcHAgTcO8bGxlciAmbHQ7dGltQGNlbnRyaWN1bGFyLm5ldCZndDssIFdpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LWZsYWMsIGZyYW1lZD0oYm9vbGVhbil0cnVlLCByYXRlPShpbnQpWyAxLCA2NTUzNTAgXSwgY2hhbm5lbHM9KGludClbIDEsIDggXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTOCwgUzE2TEUsIFMyNF8zMkxFLCBTMzJMRSB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgMSwgNjU1MzUwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCA4IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5mbGFjZW5jPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkZMQUMgYXVkaW8gZW5jb2RlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRW5jb2Rlci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RW5jb2RlcyBhdWRpbyB3aXRoIHRoZSBGTEFDIGxvc3NsZXNzIGF1ZGlvIGVuY29kZXI8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAY2hlbGxvLmJlJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzgsIFMxNkxFLCBTMjRMRSwgUzI0XzMyTEUgfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDEsIDY1NTM1MCBdLCBjaGFubmVscz0oaW50KTE7IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFM4LCBTMTZMRSwgUzI0TEUsIFMyNF8zMkxFIH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyAxLCA2NTUzNTAgXSwgY2hhbm5lbHM9KGludCkyLCBjaGFubmVsLW1hc2s9KGJpdG1hc2spMHgwMDAwMDAwMDAwMDAwMDAzOyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTOCwgUzE2TEUsIFMyNExFLCBTMjRfMzJMRSB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgMSwgNjU1MzUwIF0sIGNoYW5uZWxzPShpbnQpMywgY2hhbm5lbC1tYXNrPShiaXRtYXNrKTB4MDAwMDAwMDAwMDAwMDAwNzsgYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzgsIFMxNkxFLCBTMjRMRSwgUzI0XzMyTEUgfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDEsIDY1NTM1MCBdLCBjaGFubmVscz0oaW50KTQsIGNoYW5uZWwtbWFzaz0oYml0bWFzaykweDAwMDAwMDAwMDAwMDAwMzM7IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFM4LCBTMTZMRSwgUzI0TEUsIFMyNF8zMkxFIH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyAxLCA2NTUzNTAgXSwgY2hhbm5lbHM9KGludCk1LCBjaGFubmVsLW1hc2s9KGJpdG1hc2spMHgwMDAwMDAwMDAwMDAwMDM3OyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTOCwgUzE2TEUsIFMyNExFLCBTMjRfMzJMRSB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgMSwgNjU1MzUwIF0sIGNoYW5uZWxzPShpbnQpNiwgY2hhbm5lbC1tYXNrPShiaXRtYXNrKTB4MDAwMDAwMDAwMDAwMDAzZjsgYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzgsIFMxNkxFLCBTMjRMRSwgUzI0XzMyTEUgfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDEsIDY1NTM1MCBdLCBjaGFubmVscz0oaW50KTcsIGNoYW5uZWwtbWFzaz0oYml0bWFzaykweDAwMDAwMDAwMDAwMDAxM2Y7IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFM4LCBTMTZMRSwgUzI0TEUsIFMyNF8zMkxFIH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyAxLCA2NTUzNTAgXSwgY2hhbm5lbHM9KGludCk4LCBjaGFubmVsLW1hc2s9KGJpdG1hc2spMHgwMDAwMDAwMDAwMDAwYzNmPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtZmxhYzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmZsYWN0YWc8L25hbWU+CisgICAgICA8bG9uZ25hbWU+RkxBQyB0YWdnZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZvcm1hdHRlci9NZXRhZGF0YTwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UmV3cml0ZSB0YWdzIGluIGEgRkxBQyBmaWxlPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+Q2hyaXN0b3BoZSBGZXJnZWF1ICZsdDt0ZXVmQGdub21lLm9yZyZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtZmxhYzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LWZsYWM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNzk1MmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbApAQCAtMCwwICsxLDY3IEBACis8cGx1Z2luPgorICA8bmFtZT5mbHY8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5GTFYgbXV4aW5nIGFuZCBkZW11eGluZyBwbHVnaW48L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L2Zsdi8ubGlicy9saWJnc3RmbHYuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0Zmx2LnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5mbHZkZW11eDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5GTFYgRGVtdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVtdXhlcjwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RGVtdXggRkxWIGZlZWRzIGludG8gZGlnaXRhbCBzdHJlYW1zPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+SnVsaWVuIE1vdXR0ZSAmbHQ7anVsaWVuQG1vdXR0ZS5uZXQmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LWZsdjwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5hdWRpbzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtYWRwY20sIGxheW91dD0oc3RyaW5nKXN3ZiwgY2hhbm5lbHM9KGludCl7IDEsIDIgfSwgcmF0ZT0oaW50KXsgNTUxMiwgMTEwMjUsIDIyMDUwLCA0NDEwMCB9OyBhdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTEsIGxheWVyPShpbnQpMywgY2hhbm5lbHM9KGludCl7IDEsIDIgfSwgcmF0ZT0oaW50KXsgNTUxMiwgODAwMCwgMTEwMjUsIDIyMDUwLCA0NDEwMCB9LCBwYXJzZWQ9KGJvb2xlYW4pdHJ1ZTsgYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCk0LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpcmF3LCBmcmFtZWQ9KGJvb2xlYW4pdHJ1ZTsgYXVkaW8veC1uZWxseW1vc2VyLCBjaGFubmVscz0oaW50KXsgMSwgMiB9LCByYXRlPShpbnQpeyA1NTEyLCA4MDAwLCAxMTAyNSwgMTYwMDAsIDIyMDUwLCA0NDEwMCB9OyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBVOCwgUzE2TEUgfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIGNoYW5uZWxzPShpbnQpeyAxLCAyIH0sIHJhdGU9KGludCl7IDU1MTIsIDExMDI1LCAyMjA1MCwgNDQxMDAgfTsgYXVkaW8veC1hbGF3LCBjaGFubmVscz0oaW50KXsgMSwgMiB9LCByYXRlPShpbnQpeyA1NTEyLCAxMTAyNSwgMjIwNTAsIDQ0MTAwIH07IGF1ZGlvL3gtbXVsYXcsIGNoYW5uZWxzPShpbnQpeyAxLCAyIH0sIHJhdGU9KGludCl7IDU1MTIsIDExMDI1LCAyMjA1MCwgNDQxMDAgfTsgYXVkaW8veC1zcGVleCwgY2hhbm5lbHM9KGludCkxLCByYXRlPShpbnQpMTYwMDA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+dmlkZW88L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+c29tZXRpbWVzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LWZsYXNoLXZpZGVvLCBmbHZ2ZXJzaW9uPShpbnQpMTsgdmlkZW8veC1mbGFzaC1zY3JlZW47IHZpZGVvL3gtdnA2LWZsYXNoOyB2aWRlby94LXZwNi1hbHBoYTsgdmlkZW8veC1oMjY0LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpYXZjPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+Zmx2bXV4PC9uYW1lPgorICAgICAgPGxvbmduYW1lPkZMViBtdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvTXV4ZXI8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPk11eGVzIHZpZGVvL2F1ZGlvIHN0cmVhbXMgaW50byBhIEZMViBzdHJlYW08L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5TZWJhc3RpYW4gRHLDtmdlICZsdDtzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5hdWRpbzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1hZHBjbSwgbGF5b3V0PShzdHJpbmcpc3dmLCBjaGFubmVscz0oaW50KXsgMSwgMiB9LCByYXRlPShpbnQpeyA1NTEyLCAxMTAyNSwgMjIwNTAsIDQ0MTAwIH07IGF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpMSwgbGF5ZXI9KGludCkzLCBjaGFubmVscz0oaW50KXsgMSwgMiB9LCByYXRlPShpbnQpeyA1NTEyLCA4MDAwLCAxMTAyNSwgMjIwNTAsIDQ0MTAwIH0sIHBhcnNlZD0oYm9vbGVhbil0cnVlOyBhdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KXsgNCwgMiB9LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpcmF3OyBhdWRpby94LW5lbGx5bW9zZXIsIGNoYW5uZWxzPShpbnQpeyAxLCAyIH0sIHJhdGU9KGludCl7IDU1MTIsIDgwMDAsIDExMDI1LCAxNjAwMCwgMjIwNTAsIDQ0MTAwIH07IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFU4LCBTMTZMRSB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgY2hhbm5lbHM9KGludCl7IDEsIDIgfSwgcmF0ZT0oaW50KXsgNTUxMiwgMTEwMjUsIDIyMDUwLCA0NDEwMCB9OyBhdWRpby94LWFsYXcsIGNoYW5uZWxzPShpbnQpeyAxLCAyIH0sIHJhdGU9KGludCl7IDU1MTIsIDExMDI1LCAyMjA1MCwgNDQxMDAgfTsgYXVkaW8veC1tdWxhdywgY2hhbm5lbHM9KGludCl7IDEsIDIgfSwgcmF0ZT0oaW50KXsgNTUxMiwgMTEwMjUsIDIyMDUwLCA0NDEwMCB9OyBhdWRpby94LXNwZWV4LCBjaGFubmVscz0oaW50KTEsIHJhdGU9KGludCkxNjAwMDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT52aWRlbzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1mbGFzaC12aWRlbzsgdmlkZW8veC1mbGFzaC1zY3JlZW47IHZpZGVvL3gtdnA2LWZsYXNoOyB2aWRlby94LXZwNi1hbHBoYTsgdmlkZW8veC1oMjY0LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpYXZjPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtZmx2PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2YzMTBhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWwKQEAgLTAsMCArMSwzNCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+Zmx4ZGVjPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+RkxDL0ZMSS9GTFggdmlkZW8gZGVjb2RlcjwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvZmx4Ly5saWJzL2xpYmdzdGZseGRlYy5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RmbHhkZWMuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmZseGRlYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5GTFggdmlkZW8gZGVjb2RlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVjb2Rlci9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RkxDL0ZMSS9GTFggdmlkZW8gZGVjb2RlcjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlNlcHAgV2lqbmFuZHMgJmx0O21ycmF6ekBnYXJiYWdlLWNvZGVyei5uZXQmZ3Q7LCBaZWVzaGFuIEFsaSAmbHQ7emVlbml4QGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtZmxpPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylCR1J4LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZGZiZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbApAQCAtMCwwICsxLDcwIEBACis8cGx1Z2luPgorICA8bmFtZT5nZGtwaXhidWY8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5HZGtQaXhidWYtYmFzZWQgaW1hZ2UgZGVjb2Rlciwgb3ZlcmxheSBhbmQgc2luazwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9leHQvZ2RrX3BpeGJ1Zi8ubGlicy9saWJnc3RnZGtwaXhidWYuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0Z2RrcGl4YnVmLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5nZGtwaXhidWZkZWM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+R2RrUGl4YnVmIGltYWdlIGRlY29kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlY29kZXIvSW1hZ2U8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkRlY29kZXMgaW1hZ2VzIGluIGEgdmlkZW8gc3RyZWFtIHVzaW5nIEdka1BpeGJ1ZjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkRhdmlkIEEuIFNjaGxlZWYgJmx0O2RzQHNjaGxlZWYub3JnJmd0OywgUmVuYXRvIEZpbGhvICZsdDtyZW5hdG8uZmlsaG9AaW5kdC5vcmcuYnImZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5pbWFnZS9wbmc7IGltYWdlL3gtaWNvbjsgYXBwbGljYXRpb24veC1uYXZpLWFuaW1hdGlvbjsgaW1hZ2UveC1jbXUtcmFzdGVyOyBpbWFnZS94LXN1bi1yYXN0ZXI7IGltYWdlL3gtcGl4bWFwOyBpbWFnZS90aWZmOyBpbWFnZS94LXBvcnRhYmxlLWFueW1hcDsgaW1hZ2UveC1wb3J0YWJsZS1iaXRtYXA7IGltYWdlL3gtcG9ydGFibGUtZ3JheW1hcDsgaW1hZ2UveC1wb3J0YWJsZS1waXhtYXA7IGltYWdlL2JtcDsgaW1hZ2UveC1ibXA7IGltYWdlL3gtTVMtYm1wOyBpbWFnZS92bmQud2FwLndibXA7IGltYWdlL3gtYml0bWFwOyBpbWFnZS94LXRnYTsgaW1hZ2UveC1wY3g7IGltYWdlL3N2ZzsgaW1hZ2Uvc3ZnK3htbDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpUkdCLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF07IHZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylSR0JBLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5nZGtwaXhidWZvdmVybGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPkdka1BpeGJ1ZiBPdmVybGF5PC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5PdmVybGF5IGFuIGltYWdlIG9udG8gYSB2aWRlbyBzdHJlYW08L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5UaW0tUGhpbGlwcCBNw7xsbGVyICZsdDt0aW0gY2VudHJpY3VsYXIgbmV0Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUkdCeCwgUkdCLCBCR1IsIEJHUngsIHhSR0IsIHhCR1IsIFJHQkEsIEJHUkEsIEFSR0IsIEFCR1IsIEk0MjAsIFlWMTIsIEFZVVYsIFlVWTIsIFVZVlksIHYzMDgsIHYyMTAsIHYyMTYsIFk0MUIsIFk0MkIsIFk0NDQsIFlWWVUsIE5WMTIsIE5WMjEsIFVZVlAsIFJHQjE2LCBCR1IxNiwgUkdCMTUsIEJHUjE1LCBVWVZQLCBBNDIwLCBZVVY5LCBZVlU5LCBJWVUxLCBBUkdCNjQsIEFZVVY2NCwgcjIxMCwgSTQyMF8xMExFLCBJNDIwXzEwQkUsIEdSQVk4LCBHUkFZMTZfQkUsIEdSQVkxNl9MRSB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUkdCeCwgUkdCLCBCR1IsIEJHUngsIHhSR0IsIHhCR1IsIFJHQkEsIEJHUkEsIEFSR0IsIEFCR1IsIEk0MjAsIFlWMTIsIEFZVVYsIFlVWTIsIFVZVlksIHYzMDgsIHYyMTAsIHYyMTYsIFk0MUIsIFk0MkIsIFk0NDQsIFlWWVUsIE5WMTIsIE5WMjEsIFVZVlAsIFJHQjE2LCBCR1IxNiwgUkdCMTUsIEJHUjE1LCBVWVZQLCBBNDIwLCBZVVY5LCBZVlU5LCBJWVUxLCBBUkdCNjQsIEFZVVY2NCwgcjIxMCwgSTQyMF8xMExFLCBJNDIwXzEwQkUsIEdSQVk4LCBHUkFZMTZfQkUsIEdSQVkxNl9MRSB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5nZGtwaXhidWZzaW5rPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkdka1BpeGJ1ZiBzaW5rPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5TaW5rL1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5PdXRwdXQgaW1hZ2VzIGFzIEdka1BpeGJ1ZiBvYmplY3RzIGluIGJ1cyBtZXNzYWdlczwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlRpbS1QaGlsaXBwIE3DvGxsZXIgJmx0O3RpbSBjZW50cmljdWxhciBuZXQmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpUkdCLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF07IHZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylSR0JBLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg0MzE4MQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbApAQCAtMCwwICsxLDM0IEBACis8cGx1Z2luPgorICA8bmFtZT5nb29tPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+R09PTSB2aXN1YWxpemF0aW9uIGZpbHRlcjwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvZ29vbS8ubGlicy9saWJnc3Rnb29tLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGdvb20uc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmdvb208L25hbWU+CisgICAgICA8bG9uZ25hbWU+R09PTTogd2hhdCBhIEdPT00hPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5WaXN1YWxpemF0aW9uPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5UYWtlcyBmcmFtZXMgb2YgZGF0YSBhbmQgb3V0cHV0cyB2aWRlbyBmcmFtZXMgdXNpbmcgdGhlIEdPT00gZmlsdGVyPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbUBmbHVlbmRvLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylTMTZMRSwgcmF0ZT0oaW50KVsgODAwMCwgOTYwMDAgXSwgY2hhbm5lbHM9KGludCkxLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDsgYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVMxNkxFLCByYXRlPShpbnQpWyA4MDAwLCA5NjAwMCBdLCBjaGFubmVscz0oaW50KTIsIGNoYW5uZWwtbWFzaz0oYml0bWFzaykweDAwMDAwMDAwMDAwMDAwMDMsIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylCR1J4LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwNDQ3OQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbApAQCAtMCwwICsxLDM0IEBACis8cGx1Z2luPgorICA8bmFtZT5nb29tMmsxPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+R09PTSAyazEgdmlzdWFsaXphdGlvbiBmaWx0ZXI8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L2dvb20yazEvLmxpYnMvbGliZ3N0Z29vbTJrMS5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3Rnb29tMmsxLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5nb29tMmsxPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkdPT006IHdoYXQgYSBHT09NISAyazEgZWRpdGlvbjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+VmlzdWFsaXphdGlvbjwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+VGFrZXMgZnJhbWVzIG9mIGRhdGEgYW5kIG91dHB1dHMgdmlkZW8gZnJhbWVzIHVzaW5nIHRoZSBHT09NIDJrMSBmaWx0ZXI8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltQGZsdWVuZG8uY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVMxNkxFLCByYXRlPShpbnQpWyA4MDAwLCA5NjAwMCBdLCBjaGFubmVscz0oaW50KTEsIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkOyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpUzE2TEUsIHJhdGU9KGludClbIDgwMDAsIDk2MDAwIF0sIGNoYW5uZWxzPShpbnQpMiwgY2hhbm5lbC1tYXNrPShiaXRtYXNrKTB4MDAwMDAwMDAwMDAwMDAwMywgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUJHUngsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ndGsueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWd0ay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVjN2VjYwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ndGsueG1sCkBAIC0wLDAgKzEsNDMgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmd0azwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkd0aysgc2luazwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9leHQvZ3RrLy5saWJzL2xpYmdzdGd0ay5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RndGsuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmd0a2dsc2luazwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5HdGsgR0wgVmlkZW8gU2luazwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U2luay9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+QSB2aWRlbyBzaW5rIHRoYXQgcmVuZGVycyB0byBhIEd0a1dpZGdldCB1c2luZyBPcGVuR0w8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5NYXR0aGV3IFdhdGVycyAmbHQ7bWF0dGhld0BjZW50cmljdWxhci5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdyhtZW1vcnk6R0xNZW1vcnkpLCBmb3JtYXQ9KHN0cmluZylSR0JBLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF07IHZpZGVvL3gtcmF3KG1lbW9yeTpHTE1lbW9yeSwgbWV0YTpHc3RWaWRlb092ZXJsYXlDb21wb3NpdGlvbiksIGZvcm1hdD0oc3RyaW5nKVJHQkEsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmd0a3Npbms8L25hbWU+CisgICAgICA8bG9uZ25hbWU+R3RrIFZpZGVvIFNpbms8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNpbmsvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkEgdmlkZW8gc2luayB0aGF0IHJlbmRlcnMgdG8gYSBHdGtXaWRnZXQ8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5NYXR0aGV3IFdhdGVycyAmbHQ7bWF0dGhld0BjZW50cmljdWxhci5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBCR1J4LCBCR1JBIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZTIwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmljeWRlbXV4PC9uYW1lPgorICA8ZGVzY3JpcHRpb24+RGVtdXggSUNZIHRhZ3MgZnJvbSBhIHN0cmVhbTwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvaWN5ZGVtdXgvLmxpYnMvbGliZ3N0aWN5ZGVtdXguc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0aWN5ZGVtdXguc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmljeWRlbXV4PC9uYW1lPgorICAgICAgPGxvbmduYW1lPklDWSB0YWcgZGVtdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVtdXhlci9NZXRhZGF0YTwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UmVhZCBhbmQgb3V0cHV0IElDWSB0YWdzIHdoaWxlIGRlbXV4aW5nIHRoZSBjb250ZW50czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkphbiBTY2htaWR0ICZsdDt0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tJmd0OywgTWljaGFlbCBTbWl0aCAmbHQ7bXNtaXRoQGZsdWVuZG8uY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1pY3ksIG1ldGFkYXRhLWludGVydmFsPShpbnQpWyAwLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnNvbWV0aW1lczwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNhZjM3YwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWwKQEAgLTAsMCArMSwzNCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+aWQzZGVtdXg8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5EZW11eCBJRDN2MSBhbmQgSUQzdjIgdGFncyBmcm9tIGEgZmlsZTwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvaWQzZGVtdXgvLmxpYnMvbGliZ3N0aWQzZGVtdXguc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0aWQzZGVtdXguc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmlkM2RlbXV4PC9uYW1lPgorICAgICAgPGxvbmduYW1lPklEMyB0YWcgZGVtdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVtdXhlci9NZXRhZGF0YTwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UmVhZCBhbmQgb3V0cHV0IElEM3YxIGFuZCBJRDN2MiB0YWdzIHdoaWxlIGRlbXV4aW5nIHRoZSBjb250ZW50czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkphbiBTY2htaWR0ICZsdDt0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1pZDM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I4NDRhNQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWwKQEAgLTAsMCArMSwzNCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+aW1hZ2VmcmVlemU8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5TdGlsbCBmcmFtZSBzdHJlYW0gZ2VuZXJhdG9yPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9pbWFnZWZyZWV6ZS8ubGlicy9saWJnc3RpbWFnZWZyZWV6ZS5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RpbWFnZWZyZWV6ZS5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+aW1hZ2VmcmVlemU8L25hbWU+CisgICAgICA8bG9uZ25hbWU+U3RpbGwgZnJhbWUgc3RyZWFtIGdlbmVyYXRvcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5HZW5lcmF0ZXMgYSBzdGlsbCBmcmFtZSBzdHJlYW0gZnJvbSBhbiBpbWFnZTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlNlYmFzdGlhbiBEcsO2Z2UgJmx0O3NlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXc8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXc8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0NDIyNQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbApAQCAtMCwwICsxLDU1IEBACis8cGx1Z2luPgorICA8bmFtZT5pbnRlcmxlYXZlPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+QXVkaW8gaW50ZXJsZWF2ZXIvZGVpbnRlcmxlYXZlcjwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvaW50ZXJsZWF2ZS8ubGlicy9saWJnc3RpbnRlcmxlYXZlLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGludGVybGVhdmUuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmRlaW50ZXJsZWF2ZTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BdWRpbyBkZWludGVybGVhdmVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvQ29udmVydGVyL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5TcGxpdHMgb25lIGludGVybGVhdmVkIG11bHRpY2hhbm5lbCBhdWRpbyBzdHJlYW0gaW50byBtYW55IG1vbm8gYXVkaW8gc3RyZWFtczwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkFuZHkgV2luZ28gJmx0O3dpbmdvIGF0IHBvYm94LmNvbSZndDssIElhaW4gJmx0O2lhaW5AcHJldHR5cGVvcGxlLm9yZyZndDssIFNlYmFzdGlhbiBEcsO2Z2UgJmx0O3Nsb21vQGNpcmN1bGFyLWNoYW9zLm9yZyZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFM4LCBVOCwgUzE2TEUsIFMxNkJFLCBVMTZMRSwgVTE2QkUsIFMyNF8zMkxFLCBTMjRfMzJCRSwgVTI0XzMyTEUsIFUyNF8zMkJFLCBTMzJMRSwgUzMyQkUsIFUzMkxFLCBVMzJCRSwgUzI0TEUsIFMyNEJFLCBVMjRMRSwgVTI0QkUsIFMyMExFLCBTMjBCRSwgVTIwTEUsIFUyMEJFLCBTMThMRSwgUzE4QkUsIFUxOExFLCBVMThCRSwgRjMyTEUsIEYzMkJFLCBGNjRMRSwgRjY0QkUgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmNfJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+c29tZXRpbWVzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTOCwgVTgsIFMxNkxFLCBTMTZCRSwgVTE2TEUsIFUxNkJFLCBTMjRfMzJMRSwgUzI0XzMyQkUsIFUyNF8zMkxFLCBVMjRfMzJCRSwgUzMyTEUsIFMzMkJFLCBVMzJMRSwgVTMyQkUsIFMyNExFLCBTMjRCRSwgVTI0TEUsIFUyNEJFLCBTMjBMRSwgUzIwQkUsIFUyMExFLCBVMjBCRSwgUzE4TEUsIFMxOEJFLCBVMThMRSwgVTE4QkUsIEYzMkxFLCBGMzJCRSwgRjY0TEUsIEY2NEJFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludCkxLCBsYXlvdXQ9KHN0cmluZyl7IG5vbi1pbnRlcmxlYXZlZCwgaW50ZXJsZWF2ZWQgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmludGVybGVhdmU8L25hbWU+CisgICAgICA8bG9uZ25hbWU+QXVkaW8gaW50ZXJsZWF2ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9Db252ZXJ0ZXIvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkZvbGRzIG1hbnkgbW9ubyBjaGFubmVscyBpbnRvIG9uZSBpbnRlcmxlYXZlZCBhdWRpbyBzdHJlYW08L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5BbmR5IFdpbmdvICZsdDt3aW5nbyBhdCBwb2JveC5jb20mZ3Q7LCBTZWJhc3RpYW4gRHLDtmdlICZsdDtzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2lua18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludCkxLCBmb3JtYXQ9KHN0cmluZyl7IFM4LCBVOCwgUzE2TEUsIFMxNkJFLCBVMTZMRSwgVTE2QkUsIFMyNF8zMkxFLCBTMjRfMzJCRSwgVTI0XzMyTEUsIFUyNF8zMkJFLCBTMzJMRSwgUzMyQkUsIFUzMkxFLCBVMzJCRSwgUzI0TEUsIFMyNEJFLCBVMjRMRSwgVTI0QkUsIFMyMExFLCBTMjBCRSwgVTIwTEUsIFUyMEJFLCBTMThMRSwgUzE4QkUsIFUxOExFLCBVMThCRSwgRjMyTEUsIEYzMkJFLCBGNjRMRSwgRjY0QkUgfSwgbGF5b3V0PShzdHJpbmcpeyBub24taW50ZXJsZWF2ZWQsIGludGVybGVhdmVkIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZm9ybWF0PShzdHJpbmcpeyBTOCwgVTgsIFMxNkxFLCBTMTZCRSwgVTE2TEUsIFUxNkJFLCBTMjRfMzJMRSwgUzI0XzMyQkUsIFUyNF8zMkxFLCBVMjRfMzJCRSwgUzMyTEUsIFMzMkJFLCBVMzJMRSwgVTMyQkUsIFMyNExFLCBTMjRCRSwgVTI0TEUsIFUyNEJFLCBTMjBMRSwgUzIwQkUsIFUyMExFLCBVMjBCRSwgUzE4TEUsIFMxOEJFLCBVMThMRSwgVTE4QkUsIEYzMkxFLCBGMzJCRSwgRjY0TEUsIEY2NEJFIH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGI5YzdiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWwKQEAgLTAsMCArMSwyMjkgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmlzb21wNDwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPklTTyBiYXNlIG1lZGlhIGZpbGUgZm9ybWF0IHN1cHBvcnQgKG1wNCwgM2dwcCwgcXQsIG1qMik8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L2lzb21wNC8ubGlicy9saWJnc3Rpc29tcDQuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0aXNvbXA0LnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT4zZ3BwbXV4PC9uYW1lPgorICAgICAgPGxvbmduYW1lPjNHUFAgTXV4ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL011eGVyPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5NdWx0aXBsZXggYXVkaW8gYW5kIHZpZGVvIGludG8gYSAzR1BQIGZpbGU8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5UaGlhZ28gU291c2EgU2FudG9zICZsdDt0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5iciZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5hdWRpb18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vQU1SLCByYXRlPShpbnQpODAwMCwgY2hhbm5lbHM9KGludClbIDEsIDIgXTsgYXVkaW8vQU1SLVdCLCByYXRlPShpbnQpMTYwMDAsIGNoYW5uZWxzPShpbnQpWyAxLCAyIF07IGF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpMSwgbGF5ZXI9KGludCkzLCBjaGFubmVscz0oaW50KVsgMSwgMiBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpNCwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKXJhdywgY2hhbm5lbHM9KGludClbIDEsIDggXSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LWFjMywgY2hhbm5lbHM9KGludClbIDEsIDYgXSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnN1YnRpdGxlXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz50ZXh0L3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl1dGY4PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnZpZGVvXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LWgyNjMsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpNCwgc3lzdGVtc3RyZWFtPShib29sZWFuKWZhbHNlLCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWRpdngsIGRpdnh2ZXJzaW9uPShpbnQpNSwgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1oMjY0LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpYXZjLCBhbGlnbm1lbnQ9KHN0cmluZylhdSwgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby9xdWlja3RpbWUsIHZhcmlhbnQ9KHN0cmluZykzZ3BwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+aXNtbG11eDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5JU01MIE11eGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9NdXhlcjwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+TXVsdGlwbGV4IGF1ZGlvIGFuZCB2aWRlbyBpbnRvIGEgSVNNTCBmaWxlPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+VGhpYWdvIFNvdXNhIFNhbnRvcyAmbHQ7dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnImZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+YXVkaW9fJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpMSwgbGF5ZXI9KGludCkzLCBjaGFubmVscz0oaW50KVsgMSwgMiBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpNCwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKXJhdywgY2hhbm5lbHM9KGludClbIDEsIDggXSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnZpZGVvXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZSwgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1kaXZ4LCBkaXZ4dmVyc2lvbj0oaW50KTUsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtaDI2NCwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKWF2YywgYWxpZ25tZW50PShzdHJpbmcpYXUsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8vcXVpY2t0aW1lLCB2YXJpYW50PShzdHJpbmcpaXNvLWZyYWdtZW50ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5tajJtdXg8L25hbWU+CisgICAgICA8bG9uZ25hbWU+TUoyIE11eGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9NdXhlcjwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+TXVsdGlwbGV4IGF1ZGlvIGFuZCB2aWRlbyBpbnRvIGEgTUoyIGZpbGU8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5UaGlhZ28gU291c2EgU2FudG9zICZsdDt0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5iciZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5hdWRpb18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzE2TEUsIFMxNkJFLCBTOCwgVTggfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIGNoYW5uZWxzPShpbnQpWyAxLCAyIF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT52aWRlb18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+aW1hZ2UveC1qMmMsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IGltYWdlL3gtanBjLCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL21qMjwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPm1wNG11eDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5NUDQgTXV4ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL011eGVyPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5NdWx0aXBsZXggYXVkaW8gYW5kIHZpZGVvIGludG8gYSBNUDQgZmlsZTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlRoaWFnbyBTb3VzYSBTYW50b3MgJmx0O3RoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPmF1ZGlvXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTEsIGxheWVyPShpbnQpWyAxLCAzIF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCk0LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpcmF3LCBjaGFubmVscz0oaW50KVsgMSwgOCBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtYWMzLCBjaGFubmVscz0oaW50KVsgMSwgNiBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtYWxhYywgY2hhbm5lbHM9KGludClbIDEsIDIgXSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LW9wdXMsIGNoYW5uZWwtbWFwcGluZy1mYW1pbHk9KGludClbIDAsIDI1NSBdLCBjaGFubmVscz0oaW50KVsgMSwgOCBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3VidGl0bGVfJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnRleHQveC1yYXcsIGZvcm1hdD0oc3RyaW5nKXV0Zjg8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+dmlkZW9fJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpNCwgc3lzdGVtc3RyZWFtPShib29sZWFuKWZhbHNlLCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWRpdngsIGRpdnh2ZXJzaW9uPShpbnQpNSwgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1oMjY0LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpYXZjLCBhbGlnbm1lbnQ9KHN0cmluZylhdSwgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1oMjY1LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpeyBodmMxLCBoZXYxIH0sIGFsaWdubWVudD0oc3RyaW5nKWF1LCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LW1wNC1wYXJ0LCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3F1aWNrdGltZSwgdmFyaWFudD0oc3RyaW5nKWlzbzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnF0ZGVtdXg8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UXVpY2tUaW1lIGRlbXV4ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlbXV4ZXI8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkRlbXVsdGlwbGV4IGEgUXVpY2tUaW1lIGZpbGUgaW50byBhdWRpbyBhbmQgdmlkZW8gc3RyZWFtczwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkRhdmlkIFNjaGxlZWYgJmx0O2RzQHNjaGxlZWYub3JnJmd0OywgV2ltIFRheW1hbnMgJmx0O3dpbUBmbHVlbmRvLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3F1aWNrdGltZTsgdmlkZW8vbWoyOyBhdWRpby94LW00YTsgYXBwbGljYXRpb24veC0zZ3A8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+YXVkaW9fJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+c29tZXRpbWVzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3VidGl0bGVfJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+c29tZXRpbWVzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+dmlkZW9fJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+c29tZXRpbWVzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5xdG1vb3ZyZWNvdmVyPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlFUIE1vb3YgUmVjb3ZlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+VXRpbDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UmVjb3ZlcnMgdW5maW5pc2hlZCBxdG11eCBmaWxlczwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlRoaWFnbyBTYW50b3MgJmx0O3RoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cXRtdXg8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UXVpY2tUaW1lIE11eGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9NdXhlcjwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+TXVsdGlwbGV4IGF1ZGlvIGFuZCB2aWRlbyBpbnRvIGEgUXVpY2tUaW1lIGZpbGU8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5UaGlhZ28gU291c2EgU2FudG9zICZsdDt0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5iciZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5hdWRpb18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzMyTEUsIFMzMkJFLCBTMjRMRSwgUzI0QkUsIFMxNkxFLCBTMTZCRSwgUzgsIFU4IH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCBjaGFubmVscz0oaW50KVsgMSwgMiBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFMzMkxFLCBTMzJCRSwgUzI0TEUsIFMyNEJFLCBTMTZMRSwgUzE2QkUsIFM4LCBVOCB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgY2hhbm5lbC1tYXNrPShiaXRtYXNrKTB4MDAwMDAwMDAwMDAwMDAwMCwgY2hhbm5lbHM9KGludClbIDEsIDE2IF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCkxLCBsYXllcj0oaW50KVsgMSwgMyBdLCBjaGFubmVscz0oaW50KVsgMSwgMiBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpNCwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKXJhdywgY2hhbm5lbHM9KGludClbIDEsIDggXSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LWFjMywgY2hhbm5lbHM9KGludClbIDEsIDYgXSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LWFkcGNtLCBsYXlvdXQ9KHN0cmluZylkdmksIGJsb2NrX2FsaWduPShpbnQpWyA2NCwgODA5NiBdLCBjaGFubmVscz0oaW50KVsgMSwgMiBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtYWxhdywgY2hhbm5lbHM9KGludClbIDEsIDIgXSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LW11bGF3LCBjaGFubmVscz0oaW50KVsgMSwgMiBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL0FNUiwgcmF0ZT0oaW50KTgwMDAsIGNoYW5uZWxzPShpbnQpWyAxLCAyIF07IGF1ZGlvL0FNUi1XQiwgcmF0ZT0oaW50KTE2MDAwLCBjaGFubmVscz0oaW50KVsgMSwgMiBdOyBhdWRpby94LWFsYWMsIGNoYW5uZWxzPShpbnQpWyAxLCAyIF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC1vcHVzLCBjaGFubmVsLW1hcHBpbmctZmFtaWx5PShpbnQpWyAwLCAyNTUgXSwgY2hhbm5lbHM9KGludClbIDEsIDggXSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnN1YnRpdGxlXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz50ZXh0L3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl1dGY4PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnZpZGVvXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBSR0IsIFVZVlksIHYyMTAgfSwgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCk0LCBzeXN0ZW1zdHJlYW09KGJvb2xlYW4pZmFsc2UsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtZGl2eCwgZGl2eHZlcnNpb249KGludCk1LCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXByb3JlcywgdmFyaWFudD0oc3RyaW5nKXsgc3RhbmRhcmQsIGx0LCBocSwgcHJveHksIDQ0NDQsIDQ0NDR4cSB9LCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWNpbmVmb3JtLCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWgyNjMsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtaDI2NCwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKWF2YywgYWxpZ25tZW50PShzdHJpbmcpYXUsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtaDI2NSwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKXsgaHZjMSwgaGV2MSB9LCBhbGlnbm1lbnQ9KHN0cmluZylhdSwgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1zdnEsIHN2cXZlcnNpb249KGludCkzLCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWR2LCBzeXN0ZW1zdHJlYW09KGJvb2xlYW4pZmFsc2UsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IGltYWdlL2pwZWcsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IGltYWdlL3BuZywgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC12cDgsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtdnA5LCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWRpcmFjLCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXF0LXBhcnQsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8vcXVpY2t0aW1lLCB2YXJpYW50PShzdHJpbmcpYXBwbGU7IHZpZGVvL3F1aWNrdGltZTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cHhxdGRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBwYWNrZXQgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcms8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIFF1aWNrdGltZSBhdWRpby92aWRlbyBmcm9tIFJUUCBwYWNrZXRzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbUBmbHVlbmRvLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIG1lZGlhPShzdHJpbmcpeyBhdWRpbywgdmlkZW8gfSwgY2xvY2stcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpeyBYLVFULCBYLVFVSUNLVElNRSB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTU1ZjRjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sCkBAIC0wLDAgKzEsNDMgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmphY2s8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5KQUNLIGF1ZGlvIGVsZW1lbnRzPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2V4dC9qYWNrLy5saWJzL2xpYmdzdGphY2suc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0amFjay5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+amFja2F1ZGlvc2luazwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BdWRpbyBTaW5rIChKYWNrKTwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U2luay9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+T3V0cHV0IGF1ZGlvIHRvIGEgSkFDSyBzZXJ2ZXI8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUYzMkxFLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+amFja2F1ZGlvc3JjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkF1ZGlvIFNvdXJjZSAoSmFjayk8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNvdXJjZS9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+Q2FwdHVyZXMgYXVkaW8gZnJvbSBhIEpBQ0sgc2VydmVyPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+VHJpc3RhbiBNYXR0aGV3cyAmbHQ7dHJpc3RhbkBzYXQucWMuY2EmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUYzMkxFLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MDMxZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWwKQEAgLTAsMCArMSw1NSBAQAorPHBsdWdpbj4KKyAgPG5hbWU+anBlZzwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkpQZWcgcGx1Z2luIGxpYnJhcnk8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZXh0L2pwZWcvLmxpYnMvbGliZ3N0anBlZy5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RqcGVnLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5qcGVnZGVjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkpQRUcgaW1hZ2UgZGVjb2RlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVjb2Rlci9JbWFnZTwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RGVjb2RlIGltYWdlcyBmcm9tIEpQRUcgZm9ybWF0PC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbUBmbHVlbmRvLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmltYWdlL2pwZWc8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgSTQyMCwgUkdCLCBCR1IsIFJHQngsIHhSR0IsIEJHUngsIHhCR1IsIEdSQVk4IH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmpwZWdlbmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+SlBFRyBpbWFnZSBlbmNvZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9FbmNvZGVyL0ltYWdlPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FbmNvZGUgaW1hZ2VzIGluIEpQRUcgZm9ybWF0PC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQHR2ZC5iZSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEk0MjAsIFlWMTIsIFlVWTIsIFVZVlksIFk0MUIsIFk0MkIsIFlWWVUsIFk0NDQsIE5WMjEsIE5WMTIsIFJHQiwgQkdSLCBSR0J4LCB4UkdCLCBCR1J4LCB4QkdSLCBHUkFZOCB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+aW1hZ2UvanBlZywgd2lkdGg9KGludClbIDE2LCA2NTUzNSBdLCBoZWlnaHQ9KGludClbIDE2LCA2NTUzNSBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgc29mLW1hcmtlcj0oaW50KXsgMCwgMSwgMiwgOSB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxhbWUueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxhbWUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZmMyZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGFtZS54bWwKQEAgLTAsMCArMSwzNCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+bGFtZTwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkVuY29kZSBNUDNzIHdpdGggTEFNRTwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9leHQvbGFtZS8ubGlicy9saWJnc3RsYW1lLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGxhbWUuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmxhbWVtcDNlbmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+TC5BLk0uRS4gbXAzIGVuY29kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0VuY29kZXIvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkhpZ2gtcXVhbGl0eSBmcmVlIE1QMyBlbmNvZGVyPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpUzE2TEUsIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpeyA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAgfSwgY2hhbm5lbHM9KGludCkxOyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpUzE2TEUsIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpeyA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAgfSwgY2hhbm5lbHM9KGludCkyLCBjaGFubmVsLW1hc2s9KGJpdG1hc2spMHgwMDAwMDAwMDAwMDAwMDAzPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpMSwgbGF5ZXI9KGludCkzLCByYXRlPShpbnQpeyA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAgfSwgY2hhbm5lbHM9KGludClbIDEsIDIgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOGFlNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmxldmVsPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+QXVkaW8gbGV2ZWwgcGx1Z2luPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9sZXZlbC8ubGlicy9saWJnc3RsZXZlbC5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RsZXZlbC5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+bGV2ZWw8L25hbWU+CisgICAgICA8bG9uZ25hbWU+TGV2ZWw8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9BbmFseXplci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+Uk1TL1BlYWsvRGVjYXlpbmcgUGVhayBMZXZlbCBtZXNzYWdlciBmb3IgYXVkaW8vcmF3PC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+VGhvbWFzIFZhbmRlciBTdGljaGVsZSAmbHQ7dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzgsIFMxNkxFLCBTMzJMRSwgRjMyTEUsIEY2NExFIH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzgsIFMxNkxFLCBTMzJMRSwgRjMyTEUsIEY2NExFIH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWY2ZTEyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbApAQCAtMCwwICsxLDEzMyBAQAorPHBsdWdpbj4KKyAgPG5hbWU+bWF0cm9za2E8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5NYXRyb3NrYSBhbmQgV2ViTSBzdHJlYW0gaGFuZGxpbmc8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L21hdHJvc2thLy5saWJzL2xpYmdzdG1hdHJvc2thLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdG1hdHJvc2thLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5tYXRyb3NrYWRlbXV4PC9uYW1lPgorICAgICAgPGxvbmduYW1lPk1hdHJvc2thIGRlbXV4ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlbXV4ZXI8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkRlbXV4ZXMgTWF0cm9za2EvV2ViTSBzdHJlYW1zIGludG8gdmlkZW8vYXVkaW8vc3VidGl0bGVzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+R1N0cmVhbWVyIG1haW50YWluZXJzICZsdDtnc3RyZWFtZXItZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1tYXRyb3NrYTsgdmlkZW8veC1tYXRyb3NrYTsgdmlkZW8veC1tYXRyb3NrYS0zZDsgYXVkaW8vd2VibTsgdmlkZW8vd2VibTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5hdWRpb18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zdWJ0aXRsZV8ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnRleHQveC1yYXcsIGZvcm1hdD0oc3RyaW5nKXBhbmdvLW1hcmt1cDsgYXBwbGljYXRpb24veC1zc2E7IGFwcGxpY2F0aW9uL3gtYXNzOyBhcHBsaWNhdGlvbi94LXVzZjsgc3VicGljdHVyZS94LWR2ZDsgc3VicGljdHVyZS94LXBnczsgc3VidGl0bGUveC1rYXRlOyBhcHBsaWNhdGlvbi94LXN1YnRpdGxlLXVua25vd248L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+dmlkZW9fJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+c29tZXRpbWVzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5tYXRyb3NrYW11eDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5NYXRyb3NrYSBtdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvTXV4ZXI8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPk11eGVzIHZpZGVvL2F1ZGlvL3N1YnRpdGxlIHN0cmVhbXMgaW50byBhIG1hdHJvc2thIHN0cmVhbTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkdTdHJlYW1lciBtYWludGFpbmVycyAmbHQ7Z3N0cmVhbWVyLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZyZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5hdWRpb18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCkxLCBsYXllcj0oaW50KVsgMSwgMyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpeyAyLCA0IH0sIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylyYXcsIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC1hYzMsIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC1lYWMzLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtZHRzLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtdm9yYmlzLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtZmxhYywgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LW9wdXM7IGF1ZGlvL3gtc3BlZXgsIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgVTgsIFMxNkJFLCBTMTZMRSwgUzI0QkUsIFMyNExFLCBTMzJCRSwgUzMyTEUsIEYzMkxFLCBGNjRMRSB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LXR0YSwgd2lkdGg9KGludCl7IDgsIDE2LCAyNCB9LCBjaGFubmVscz0oaW50KXsgMSwgMiB9LCByYXRlPShpbnQpWyA4MDAwLCA5NjAwMCBdOyBhdWRpby94LXBuLXJlYWxhdWRpbywgcmF2ZXJzaW9uPShpbnQpeyAxLCAyLCA4IH0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC13bWEsIHdtYXZlcnNpb249KGludClbIDEsIDMgXSwgYmxvY2tfYWxpZ249KGludClbIDAsIDY1NTM1IF0sIGJpdHJhdGU9KGludClbIDAsIDUyNDI4OCBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtYWxhdywgY2hhbm5lbHM9KGludCl7IDEsIDIgfSwgcmF0ZT0oaW50KVsgODAwMCwgMTkyMDAwIF07IGF1ZGlvL3gtbXVsYXcsIGNoYW5uZWxzPShpbnQpeyAxLCAyIH0sIHJhdGU9KGludClbIDgwMDAsIDE5MjAwMCBdOyBhdWRpby94LWFkcGNtLCBsYXlvdXQ9KHN0cmluZylkdmksIGJsb2NrX2FsaWduPShpbnQpWyA2NCwgODE5MiBdLCBjaGFubmVscz0oaW50KXsgMSwgMiB9LCByYXRlPShpbnQpWyA4MDAwLCA5NjAwMCBdOyBhdWRpby9HNzIyLCBjaGFubmVscz0oaW50KTEsIHJhdGU9KGludCkxNjAwMDsgYXVkaW8veC1hZHBjbSwgbGF5b3V0PShzdHJpbmcpZzcyNiwgY2hhbm5lbHM9KGludCkxLCByYXRlPShpbnQpODAwMDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zdWJ0aXRsZV8ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+c3VidGl0bGUveC1rYXRlOyB0ZXh0L3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl1dGY4OyBhcHBsaWNhdGlvbi94LXNzYTsgYXBwbGljYXRpb24veC1hc3M7IGFwcGxpY2F0aW9uL3gtdXNmOyBzdWJwaWN0dXJlL3gtZHZkOyBhcHBsaWNhdGlvbi94LXN1YnRpdGxlLXVua25vd248L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+dmlkZW9fJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpeyAxLCAyLCA0IH0sIHN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZSwgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1oMjY0LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpYXZjLCBhbGlnbm1lbnQ9KHN0cmluZylhdSwgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1oMjY1LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpaHZjMSwgYWxpZ25tZW50PShzdHJpbmcpYXUsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtZGl2eCwgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1odWZmeXV2LCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWR2LCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWgyNjMsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtbXNtcGVnLCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyBpbWFnZS9qcGVnLCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXRoZW9yYTsgdmlkZW8veC1kaXJhYywgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1wbi1yZWFsdmlkZW8sIHJtdmVyc2lvbj0oaW50KVsgMSwgNCBdLCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXZwOCwgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC12cDksIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFlVWTIsIEk0MjAsIFlWMTIsIFVZVlksIEFZVVYsIEdSQVk4LCBCR1IsIFJHQiB9LCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXByb3Jlcywgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC13bXYsIHdtdnZlcnNpb249KGludClbIDEsIDMgXSwgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LW1hdHJvc2thOyB2aWRlby94LW1hdHJvc2thLTNkOyBhdWRpby94LW1hdHJvc2thPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+bWF0cm9za2FwYXJzZTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5NYXRyb3NrYSBwYXJzZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BhcnNlcjwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGFyc2VzIE1hdHJvc2thL1dlYk0gc3RyZWFtcyBpbnRvIHZpZGVvL2F1ZGlvL3N1YnRpdGxlczwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkdTdHJlYW1lciBtYWludGFpbmVycyAmbHQ7Z3N0cmVhbWVyLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZyZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtbWF0cm9za2E7IHZpZGVvL3gtbWF0cm9za2E7IHZpZGVvL3gtbWF0cm9za2EtM2Q7IGF1ZGlvL3dlYm07IHZpZGVvL3dlYm08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1tYXRyb3NrYTsgdmlkZW8veC1tYXRyb3NrYTsgdmlkZW8veC1tYXRyb3NrYS0zZDsgYXVkaW8vd2VibTsgdmlkZW8vd2VibTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPndlYm1tdXg8L25hbWU+CisgICAgICA8bG9uZ25hbWU+V2ViTSBtdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvTXV4ZXI8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPk11eGVzIHZpZGVvIGFuZCBhdWRpbyBzdHJlYW1zIGludG8gYSBXZWJNIHN0cmVhbTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkdTdHJlYW1lciBtYWludGFpbmVycyAmbHQ7Z3N0cmVhbWVyLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZyZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5hdWRpb18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC12b3JiaXMsIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC1vcHVzLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3VidGl0bGVfJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnN1YnRpdGxlL3gta2F0ZTsgdGV4dC94LXJhdywgZm9ybWF0PShzdHJpbmcpdXRmODsgYXBwbGljYXRpb24veC1zc2E7IGFwcGxpY2F0aW9uL3gtYXNzOyBhcHBsaWNhdGlvbi94LXVzZjsgc3VicGljdHVyZS94LWR2ZDsgYXBwbGljYXRpb24veC1zdWJ0aXRsZS11bmtub3duPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnZpZGVvXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXZwOCwgd2lkdGg9KGludClbIDE2LCA0MDk2IF0sIGhlaWdodD0oaW50KVsgMTYsIDQwOTYgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF07IHZpZGVvL3gtdnA5LCB3aWR0aD0oaW50KVsgMTYsIDQwOTYgXSwgaGVpZ2h0PShpbnQpWyAxNiwgNDA5NiBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC1hdjEsIHdpZHRoPShpbnQpWyAxNiwgNDA5NiBdLCBoZWlnaHQ9KGludClbIDE2LCA0MDk2IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3dlYm07IGF1ZGlvL3dlYm08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb25vc2NvcGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMTE2MzUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbApAQCAtMCwwICsxLDM0IEBACis8cGx1Z2luPgorICA8bmFtZT5tb25vc2NvcGU8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5Nb25vc2NvcGUgdmlzdWFsaXphdGlvbjwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvbW9ub3Njb3BlLy5saWJzL2xpYmdzdG1vbm9zY29wZS5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3Rtb25vc2NvcGUuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEuMzwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIHNvdXJjZSByZWxlYXNlPC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+bW9ub3Njb3BlPC9uYW1lPgorICAgICAgPGxvbmduYW1lPk1vbm9zY29wZTwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+VmlzdWFsaXphdGlvbjwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RGlzcGxheXMgYSBoaWdobHkgc3RhYmlsaXNlZCB3YXZlZm9ybSBvZiBhdWRpbyBpbnB1dDwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlJpY2hhcmQgQm91bHRvbiAmbHQ7cmljaGFyZEB0YXJ0YXJ1cy5vcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpUzE2TEUsIHJhdGU9KGludClbIDgwMDAsIDk2MDAwIF0sIGNoYW5uZWxzPShpbnQpMSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUJHUngsIHdpZHRoPShpbnQpMjU2LCBoZWlnaHQ9KGludCkxMjgsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1wZzEyMy54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXBnMTIzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDQwOTA0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1wZzEyMy54bWwKQEAgLTAsMCArMSwzNCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+bXBnMTIzPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+bXAzIGRlY29kaW5nIGJhc2VkIG9uIHRoZSBtcGcxMjMgbGlicmFyeTwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9leHQvbXBnMTIzLy5saWJzL2xpYmdzdG1wZzEyMy5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RtcGcxMjMuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPm1wZzEyM2F1ZGlvZGVjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPm1wZzEyMyBtcDMgZGVjb2RlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVjb2Rlci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RGVjb2RlcyBtcDMgc3RyZWFtcyB1c2luZyB0aGUgbXBnMTIzIGxpYnJhcnk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5DYXJsb3MgUmFmYWVsIEdpYW5pICZsdDtkdkBwc2V1ZG90ZXJtaW5hbC5vcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTEsIGxheWVyPShpbnQpWyAxLCAzIF0sIHJhdGU9KGludCl7IDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCBjaGFubmVscz0oaW50KVsgMSwgMiBdLCBwYXJzZWQ9KGJvb2xlYW4pdHJ1ZTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTMTZMRSwgVTE2TEUsIFMzMkxFLCBVMzJMRSwgUzI0TEUsIFUyNExFLCBGMzJMRSB9LCByYXRlPShpbnQpeyA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAgfSwgY2hhbm5lbHM9KGludClbIDEsIDIgXSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmRkYWE0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbApAQCAtMCwwICsxLDU1IEBACis8cGx1Z2luPgorICA8bmFtZT5tdWxhdzwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPk11TGF3IGF1ZGlvIGNvbnZlcnNpb24gcm91dGluZXM8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L2xhdy8ubGlicy9saWJnc3RtdWxhdy5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RtdWxhdy5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+bXVsYXdkZWM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+TXUgTGF3IGF1ZGlvIGRlY29kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlY29kZXIvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkNvbnZlcnQgOGJpdCBtdSBsYXcgdG8gMTZiaXQgUENNPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+WmFoZWVyIEFiYmFzIE1lcmFsaSAmbHQ7emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LW11bGF3LCByYXRlPShpbnQpWyA4MDAwLCAxOTIwMDAgXSwgY2hhbm5lbHM9KGludClbIDEsIDIgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpUzE2TEUsIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyA4MDAwLCAxOTIwMDAgXSwgY2hhbm5lbHM9KGludClbIDEsIDIgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPm11bGF3ZW5jPC9uYW1lPgorICAgICAgPGxvbmduYW1lPk11IExhdyBhdWRpbyBlbmNvZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9FbmNvZGVyL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5Db252ZXJ0IDE2Yml0IFBDTSB0byA4Yml0IG11IGxhdzwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlphaGVlciBBYmJhcyBNZXJhbGkgJmx0O3phaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVMxNkxFLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgODAwMCwgMTkyMDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1tdWxhdywgcmF0ZT0oaW50KVsgODAwMCwgMTkyMDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZDAxYTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbApAQCAtMCwwICsxLDExMiBAQAorPHBsdWdpbj4KKyAgPG5hbWU+bXVsdGlmaWxlPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+UmVhZHMvV3JpdGVzIGJ1ZmZlcnMgZnJvbS90byBzZXF1ZW50aWFsbHkgbmFtZWQgZmlsZXM8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L211bHRpZmlsZS8ubGlicy9saWJnc3RtdWx0aWZpbGUuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0bXVsdGlmaWxlLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5tdWx0aWZpbGVzaW5rPC9uYW1lPgorICAgICAgPGxvbmduYW1lPk11bHRpLUZpbGUgU2luazwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U2luay9GaWxlPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5Xcml0ZSBidWZmZXJzIHRvIGEgc2VxdWVudGlhbGx5IG5hbWVkIHNldCBvZiBmaWxlczwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkRhdmlkIFNjaGxlZWYgJmx0O2RzQHNjaGxlZWYub3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+bXVsdGlmaWxlc3JjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPk11bHRpLUZpbGUgU291cmNlPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Tb3VyY2UvRmlsZTwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UmVhZCBhIHNlcXVlbnRpYWxseSBuYW1lZCBzZXQgb2YgZmlsZXMgaW50byBidWZmZXJzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RGF2aWQgU2NobGVlZiAmbHQ7ZHNAc2NobGVlZi5vcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+c3BsaXRmaWxlc3JjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlNwbGl0LUZpbGUgU291cmNlPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Tb3VyY2UvRmlsZTwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UmVhZCBhIHNlcXVlbnRpYWxseSBuYW1lZCBzZXQgb2YgZmlsZXMgYXMgaWYgaXQgd2FzIG9uZSBsYXJnZSBmaWxlPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+VGltLVBoaWxpcHAgTcO8bGxlciAmbHQ7dGltLm11bGxlckBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+c3BsaXRtdXhzaW5rPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlNwbGl0IE11eGluZyBCaW48L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkdlbmVyaWMvQmluL011eGVyPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5Db252ZW5pZW5jZSBiaW4gdGhhdCBtdXhlcyBpbmNvbWluZyBzdHJlYW1zIGludG8gbXVsdGlwbGUgdGltZS9zaXplIGxpbWl0ZWQgZmlsZXM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5KYW4gU2NobWlkdCAmbHQ7amFuQGNlbnRyaWN1bGFyLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5hdWRpb18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnN1YnRpdGxlXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+dmlkZW88L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnNwbGl0bXV4c3JjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlNwbGl0IEZpbGUgRGVtdXhpbmcgQmluPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5HZW5lcmljL0Jpbi9EZW11eGVyPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5Tb3VyY2UgdGhhdCByZWFkcyBhIHNldCBvZiBmaWxlcyBjcmVhdGVkIGJ5IHNwbGl0bXV4c2luazwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkphbiBTY2htaWR0ICZsdDtqYW5AY2VudHJpY3VsYXIuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPmF1ZGlvXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnNvbWV0aW1lczwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnN1YnRpdGxlXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnNvbWV0aW1lczwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnZpZGVvPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnNvbWV0aW1lczwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmQ1NDhiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWwKQEAgLTAsMCArMSw1NSBAQAorPHBsdWdpbj4KKyAgPG5hbWU+bXVsdGlwYXJ0PC9uYW1lPgorICA8ZGVzY3JpcHRpb24+bXVsdGlwYXJ0IHN0cmVhbSBtYW5pcHVsYXRpb248L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L211bHRpcGFydC8ubGlicy9saWJnc3RtdWx0aXBhcnQuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0bXVsdGlwYXJ0LnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5tdWx0aXBhcnRkZW11eDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5NdWx0aXBhcnQgZGVtdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVtdXhlcjwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+ZGVtdXggbXVsdGlwYXJ0IHN0cmVhbXM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OywgU2pvZXJkIFNpbW9ucyAmbHQ7c2pvZXJkQGx1b24ubmV0Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+bXVsdGlwYXJ0L3gtbWl4ZWQtcmVwbGFjZTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmNfJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+c29tZXRpbWVzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5tdWx0aXBhcnRtdXg8L25hbWU+CisgICAgICA8bG9uZ25hbWU+TXVsdGlwYXJ0IG11eGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9NdXhlcjwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+bXV4IG11bHRpcGFydCBzdHJlYW1zPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbUBmbHVlbmRvLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+bXVsdGlwYXJ0L3gtbWl4ZWQtcmVwbGFjZTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZDJiZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzxwbHVnaW4+CisgIDxuYW1lPm5hdmlnYXRpb250ZXN0PC9uYW1lPgorICA8ZGVzY3JpcHRpb24+VGVtcGxhdGUgZm9yIGEgdmlkZW8gZmlsdGVyPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9kZWJ1Z3V0aWxzLy5saWJzL2xpYmdzdG5hdmlnYXRpb250ZXN0LnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdG5hdmlnYXRpb250ZXN0LnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5uYXZpZ2F0aW9udGVzdDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5WaWRlbyBuYXZpZ2F0aW9uIHRlc3Q8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkhhbmRsZSBuYXZpZ2F0aW9uIGV2ZW50cyBzaG93aW5nIGEgYmxhY2sgc3F1YXJlIGZvbGxvd2luZyBtb3VzZSBwb2ludGVyPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RGF2aWQgU2NobGVlZiAmbHQ7ZHNAc2NobGVlZi5vcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpSTQyMCwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylJNDIwLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc1ZjY3YgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbApAQCAtMCwwICsxLDQzIEBACis8cGx1Z2luPgorICA8bmFtZT5vc3M0PC9uYW1lPgorICA8ZGVzY3JpcHRpb24+T3BlbiBTb3VuZCBTeXN0ZW0gKE9TUykgdmVyc2lvbiA0IHN1cHBvcnQgZm9yIEdTdHJlYW1lcjwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9zeXMvb3NzNC8ubGlicy9saWJnc3Rvc3M0LnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdG9zczQuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPm9zczRzaW5rPC9uYW1lPgorICAgICAgPGxvbmduYW1lPk9TUyB2NCBBdWRpbyBTaW5rPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5TaW5rL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5PdXRwdXQgdG8gYSBzb3VuZCBjYXJkIHZpYSBPU1MgdmVyc2lvbiA0PC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+VGltLVBoaWxpcHAgTcO8bGxlciAmbHQ7dGltIGNlbnRyaWN1bGFyIG5ldCZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtYWxhdywgcmF0ZT0oaW50KVsgMSwgMTkyMDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCA0MDk2IF07IGF1ZGlvL3gtbXVsYXcsIHJhdGU9KGludClbIDEsIDE5MjAwMCBdLCBjaGFubmVscz0oaW50KVsgMSwgNDA5NiBdOyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTMzJMRSwgUzMyQkUsIFMyNF8zMkxFLCBTMjRfMzJCRSwgUzI0TEUsIFMxNkxFLCBTMTZCRSwgVTE2TEUsIFUxNkJFLCBTOCwgVTggfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDEsIDE5MjAwMCBdLCBjaGFubmVscz0oaW50KVsgMSwgNDA5NiBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+b3NzNHNyYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5PU1MgdjQgQXVkaW8gU291cmNlPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Tb3VyY2UvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkNhcHR1cmUgZnJvbSBhIHNvdW5kIGNhcmQgdmlhIE9TUyB2ZXJzaW9uIDQ8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5UaW0tUGhpbGlwcCBNw7xsbGVyICZsdDt0aW0gY2VudHJpY3VsYXIgbmV0Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtYWxhdywgcmF0ZT0oaW50KVsgMSwgMTkyMDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCA0MDk2IF07IGF1ZGlvL3gtbXVsYXcsIHJhdGU9KGludClbIDEsIDE5MjAwMCBdLCBjaGFubmVscz0oaW50KVsgMSwgNDA5NiBdOyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTMzJMRSwgUzMyQkUsIFMyNF8zMkxFLCBTMjRfMzJCRSwgUzI0TEUsIFMxNkxFLCBTMTZCRSwgVTE2TEUsIFUxNkJFLCBTOCwgVTggfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDEsIDE5MjAwMCBdLCBjaGFubmVscz0oaW50KVsgMSwgNDA5NiBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRkY2MzZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWwKQEAgLTAsMCArMSw0MyBAQAorPHBsdWdpbj4KKyAgPG5hbWU+b3NzYXVkaW88L25hbWU+CisgIDxkZXNjcmlwdGlvbj5PU1MgKE9wZW4gU291bmQgU3lzdGVtKSBzdXBwb3J0IGZvciBHU3RyZWFtZXI8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vc3lzL29zcy8ubGlicy9saWJnc3Rvc3NhdWRpby5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3Rvc3NhdWRpby5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+b3Nzc2luazwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BdWRpbyBTaW5rIChPU1MpPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5TaW5rL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5PdXRwdXQgdG8gYSBzb3VuZCBjYXJkIHZpYSBPU1M8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5FcmlrIFdhbHRoaW5zZW4gJmx0O29tZWdhQGNzZS5vZ2kuZWR1Jmd0OywgV2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGNoZWxsby5iZSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFMxNkxFLCBVMTZMRSwgUzgsIFU4IH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpMTsgYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzE2TEUsIFUxNkxFLCBTOCwgVTggfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludCkyLCBjaGFubmVsLW1hc2s9KGJpdG1hc2spMHgwMDAwMDAwMDAwMDAwMDAzPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+b3Nzc3JjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkF1ZGlvIFNvdXJjZSAoT1NTKTwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U291cmNlL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5DYXB0dXJlIGZyb20gYSBzb3VuZCBjYXJkIHZpYSBPU1M8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5FcmlrIFdhbHRoaW5zZW4gJmx0O29tZWdhQGNzZS5vZ2kuZWR1Jmd0OywgV2ltIFRheW1hbnMgJmx0O3dpbUBmbHVlbmRvLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTMTZMRSwgVTE2TEUsIFM4LCBVOCB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KTE7IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFMxNkxFLCBVMTZMRSwgUzgsIFU4IH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpMiwgY2hhbm5lbC1tYXNrPShiaXRtYXNrKTB4MDAwMDAwMDAwMDAwMDAwMzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3hhdWRpby54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3N4YXVkaW8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MThhNGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3N4YXVkaW8ueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzxwbHVnaW4+CisgIDxuYW1lPm9zeGF1ZGlvPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+T1NYIChNYWMgT1MgWCkgYXVkaW8gc3VwcG9ydCBmb3IgR1N0cmVhbWVyPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL3N5cy9vc3hhdWRpby8ubGlicy9saWJnc3Rvc3hhdWRpby5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3Rvc3hhdWRpby5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjAuMTAuNS4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgQ1ZTL3ByZXJlbGVhc2U8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5vc3hhdWRpb3Npbms8L25hbWU+CisgICAgICA8bG9uZ25hbWU+QXVkaW8gU2luayAoT1NYKTwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U2luay9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+T3V0cHV0IHRvIGEgc291bmQgY2FyZCBpbiBPUyBYPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+WmFoZWVyIEFiYmFzIE1lcmFsaSAmbHQ7emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmcmZ3Q7PC9hdXRob3I+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+b3N4YXVkaW9zcmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+QXVkaW8gU291cmNlIChPU1gpPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Tb3VyY2UvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPklucHV0IGZyb20gYSBzb3VuZCBjYXJkIGluIE9TIFg8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5aYWhlZXIgQWJiYXMgTWVyYWxpICZsdDt6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZyZndDs8L2F1dGhvcj4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3h2aWRlby54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3N4dmlkZW8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YmRlZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3N4dmlkZW8ueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzxwbHVnaW4+CisgIDxuYW1lPm9zeHZpZGVvPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+T1NYIG5hdGl2ZSB2aWRlbyBvdXRwdXQgcGx1Z2luPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2V4dC9vc3h2aWRlby8ubGlicy9saWJnc3Rvc3h2aWRlby5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3Rvc3h2aWRlby5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjAuMTAuNDwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1iYWQ8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R3N0cmVhbWVyPC9wYWNrYWdlPgorICA8b3JpZ2luPmh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPm9zeHZpZGVvc2luazwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5PU1ggVmlkZW8gc2luazwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U2luay9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+T1NYIG5hdGl2ZSB2aWRlb3Npbms8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5aYWhlZXIgQWJiYXMgTWVyYWxpICZsdDt6YWhlZXJhYmFzIGF0IG1lcmFsaSBkb3Qgb3JnJmd0OzwvYXV0aG9yPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWEzZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWwKQEAgLTAsMCArMSw1NSBAQAorPHBsdWdpbj4KKyAgPG5hbWU+cG5nPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+UE5HIHBsdWdpbiBsaWJyYXJ5PC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2V4dC9saWJwbmcvLmxpYnMvbGliZ3N0cG5nLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdHBuZy5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cG5nZGVjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlBORyBpbWFnZSBkZWNvZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZWNvZGVyL0ltYWdlPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5EZWNvZGUgYSBwbmcgdmlkZW8gZnJhbWUgdG8gYSByYXcgaW1hZ2U8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltQGZsdWVuZG8uY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+aW1hZ2UvcG5nPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFJHQkEsIFJHQiwgQVJHQjY0LCBHUkFZOCwgR1JBWTE2X0JFIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnBuZ2VuYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5QTkcgaW1hZ2UgZW5jb2RlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRW5jb2Rlci9JbWFnZTwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RW5jb2RlIGEgdmlkZW8gZnJhbWUgdG8gYSAucG5nIGltYWdlPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+SmVyZW15IFNJTU9OICZsdDtqc2ltb24xM0B5YWhvby5mciZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFJHQkEsIFJHQiwgR1JBWTgsIEdSQVkxNl9CRSB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+aW1hZ2UvcG5nLCB3aWR0aD0oaW50KVsgMTYsIDEwMDAwMDAgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMTAwMDAwMCBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODA2Nzk4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sCkBAIC0wLDAgKzEsNDMgQEAKKzxwbHVnaW4+CisgIDxuYW1lPnB1bHNlYXVkaW88L25hbWU+CisgIDxkZXNjcmlwdGlvbj5QdWxzZUF1ZGlvIHBsdWdpbiBsaWJyYXJ5PC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2V4dC9wdWxzZS8ubGlicy9saWJnc3RwdWxzZWF1ZGlvLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdHB1bHNlYXVkaW8uc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnB1bHNlc2luazwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5QdWxzZUF1ZGlvIEF1ZGlvIFNpbms8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNpbmsvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBsYXlzIGF1ZGlvIHRvIGEgUHVsc2VBdWRpbyBzZXJ2ZXI8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5MZW5uYXJ0IFBvZXR0ZXJpbmc8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFMxNkxFLCBTMTZCRSwgRjMyTEUsIEYzMkJFLCBTMzJMRSwgUzMyQkUsIFMyNExFLCBTMjRCRSwgUzI0XzMyTEUsIFMyNF8zMkJFLCBVOCB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMzIgXTsgYXVkaW8veC1hbGF3LCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAzMiBdOyBhdWRpby94LW11bGF3LCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAzMiBdOyBhdWRpby94LWFjMywgZnJhbWVkPShib29sZWFuKXRydWU7IGF1ZGlvL3gtZWFjMywgZnJhbWVkPShib29sZWFuKXRydWU7IGF1ZGlvL3gtZHRzLCBmcmFtZWQ9KGJvb2xlYW4pdHJ1ZSwgYmxvY2stc2l6ZT0oaW50KXsgNTEyLCAxMDI0LCAyMDQ4IH07IGF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpMSwgbXBlZ2F1ZGlvdmVyc2lvbj0oaW50KVsgMSwgMyBdLCBwYXJzZWQ9KGJvb2xlYW4pdHJ1ZTsgYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCl7IDIsIDQgfSwgZnJhbWVkPShib29sZWFuKXRydWUsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylhZHRzPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cHVsc2VzcmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UHVsc2VBdWRpbyBBdWRpbyBTb3VyY2U8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNvdXJjZS9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+Q2FwdHVyZXMgYXVkaW8gZnJvbSBhIFB1bHNlQXVkaW8gc2VydmVyPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+TGVubmFydCBQb2V0dGVyaW5nPC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzE2TEUsIFMxNkJFLCBGMzJMRSwgRjMyQkUsIFMzMkxFLCBTMzJCRSwgUzI0TEUsIFMyNEJFLCBTMjRfMzJMRSwgUzI0XzMyQkUsIFU4IH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAzMiBdOyBhdWRpby94LWFsYXcsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDMyIF07IGF1ZGlvL3gtbXVsYXcsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDMyIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FiYWFkYQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbApAQCAtMCwwICsxLDc2IEBACis8cGx1Z2luPgorICA8bmFtZT5yZXBsYXlnYWluPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+UmVwbGF5R2FpbiB2b2x1bWUgbm9ybWFsaXphdGlvbjwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvcmVwbGF5Z2Fpbi8ubGlicy9saWJnc3RyZXBsYXlnYWluLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdHJlcGxheWdhaW4uc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJnYW5hbHlzaXM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UmVwbGF5R2FpbiBhbmFseXNpczwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0FuYWx5emVyL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QZXJmb3JtIHRoZSBSZXBsYXlHYWluIGFuYWx5c2lzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+UmVuw6kgU3RhZGxlciAmbHQ7bWFpbEByZW5lc3RhZGxlci5kZSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEYzMkxFLCBTMTZMRSB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgY2hhbm5lbHM9KGludCkxLCByYXRlPShpbnQpeyA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAgfTsgYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgRjMyTEUsIFMxNkxFIH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCBjaGFubmVscz0oaW50KTIsIGNoYW5uZWwtbWFzaz0oYml0bWFzaykweDAwMDAwMDAwMDAwMDAwMDMsIHJhdGU9KGludCl7IDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEYzMkxFLCBTMTZMRSB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgY2hhbm5lbHM9KGludCkxLCByYXRlPShpbnQpeyA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAgfTsgYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgRjMyTEUsIFMxNkxFIH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCBjaGFubmVscz0oaW50KTIsIGNoYW5uZWwtbWFzaz0oYml0bWFzaykweDAwMDAwMDAwMDAwMDAwMDMsIHJhdGU9KGludCl7IDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cmdsaW1pdGVyPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJlcGxheUdhaW4gbGltaXRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+QXBwbHkgc2lnbmFsIGNvbXByZXNzaW9uIHRvIHJhdyBhdWRpbyBkYXRhPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+UmVuw6kgU3RhZGxlciAmbHQ7bWFpbEByZW5lc3RhZGxlci5kZSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylGMzJMRSwgbGF5b3V0PShzdHJpbmcpeyBpbnRlcmxlYXZlZCwgbm9uLWludGVybGVhdmVkIH0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpRjMyTEUsIGxheW91dD0oc3RyaW5nKXsgaW50ZXJsZWF2ZWQsIG5vbi1pbnRlcmxlYXZlZCB9LCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5yZ3ZvbHVtZTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SZXBsYXlHYWluIHZvbHVtZTwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+QXBwbHkgUmVwbGF5R2FpbiB2b2x1bWUgYWRqdXN0bWVudDwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlJlbsOpIFN0YWRsZXIgJmx0O21haWxAcmVuZXN0YWRsZXIuZGUmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBGMzJMRSwgUzE2TEUgfSwgbGF5b3V0PShzdHJpbmcpeyBpbnRlcmxlYXZlZCwgbm9uLWludGVybGVhdmVkIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBGMzJMRSwgUzE2TEUgfSwgbGF5b3V0PShzdHJpbmcpeyBpbnRlcmxlYXZlZCwgbm9uLWludGVybGVhdmVkIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFmYWVkNgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sCkBAIC0wLDAgKzEsMTg2MSBAQAorPHBsdWdpbj4KKyAgPG5hbWU+cnRwPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+UmVhbC10aW1lIHByb3RvY29sIHBsdWdpbnM8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L3J0cC8ubGlicy9saWJnc3RydHAuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0cnRwLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hc3Rlcmlza2gyNjM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEFzdGVyaXNrIEgyNjMgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBIMjYzIHZpZGVvIGZyb20gUlRQIGFuZCBlbmNvZGVzIGluIEFzdGVyaXNrIEgyNjMgZm9ybWF0PC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+TmVpbCBTdHJhdGZvcmQgJmx0O25laWxzQHZpcGFkaWEuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpSDI2My0xOTk4PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtYXN0ZXJpc2toMjYzPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwTDE2ZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIGF1ZGlvIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgcmF3IGF1ZGlvIGZyb20gUlRQIHBhY2tldHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5aZWVzaGFuIEFsaSAmbHQ7emFrMTQ3QHlhaG9vLmNvbSZndDssV2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylMMTY7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpeyAxMCwgMTEgfSwgY2xvY2stcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylTMTZCRSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cEwxNnBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgYXVkaW8gcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBheWxvYWQtZW5jb2RlIFJhdyBhdWRpbyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgMzU1MSk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVMxNkJFLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUwxNiwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIGVuY29kaW5nLW5hbWU9KHN0cmluZylMMTYsIHBheWxvYWQ9KGludCkxMCwgY2xvY2stcmF0ZT0oaW50KTQ0MTAwOyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUwxNiwgcGF5bG9hZD0oaW50KTExLCBjbG9jay1yYXRlPShpbnQpNDQxMDA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBMMjRkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgYXVkaW8gZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyByYXcgMjQtYml0IGF1ZGlvIGZyb20gUlRQIHBhY2tldHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5aZWVzaGFuIEFsaSAmbHQ7emFrMTQ3QHlhaG9vLmNvbSZndDssV2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDssRGF2aWQgSG9scm95ZCAmbHQ7ZGF2ZUBiYWRnZXJzLWluLWZvaWwuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgY2xvY2stcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpTDI0PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylTMjRCRSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cEwyNHBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgYXVkaW8gcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBheWxvYWQtZW5jb2RlIFJhdyAyNC1iaXQgYXVkaW8gaW50byBSVFAgcGFja2V0cyAoUkZDIDMxOTApPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDssRGF2aWQgSG9scm95ZCAmbHQ7ZGF2ZUBiYWRnZXJzLWluLWZvaWwuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpUzI0QkUsIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpTDI0LCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwTDhkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgYXVkaW8gZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyByYXcgYXVkaW8gZnJvbSBSVFAgcGFja2V0czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlplZXNoYW4gQWxpICZsdDt6YWsxNDdAeWFob28uY29tJmd0OyxXaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OywgR0UgSW50ZWxsaWdlbnQgUGxhdGZvcm1zIEVtYmVkZGVkIFN5c3RlbXMsIEluYy48L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylMODwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpVTgsIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBMOHBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgYXVkaW8gcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBheWxvYWQtZW5jb2RlIFJhdyBhdWRpbyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgMzU1MSk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OywgR0UgSW50ZWxsaWdlbnQgUGxhdGZvcm1zIEVtYmVkZGVkIFN5c3RlbXMsIEluYy48L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylVOCwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylMOCwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGFjM2RlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBBQzMgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBBQzMgYXVkaW8gZnJvbSBSVFAgcGFja2V0cyAoUkZDIDQxODQpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpeyAzMjAwMCwgNDQxMDAsIDQ4MDAwIH0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylBQzM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vYWMzPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwYWMzcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBBQzMgYXVkaW8gcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBheWxvYWQgQUMzIGF1ZGlvIGFzIFJUUCBwYWNrZXRzIChSRkMgNDE4NCk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vYWMzOyBhdWRpby94LWFjMzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpeyAzMjAwMCwgNDQxMDAsIDQ4MDAwIH0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylBQzM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBhbXJkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgQU1SIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgQU1SIG9yIEFNUi1XQiBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMzI2Nyk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIGNsb2NrLXJhdGU9KGludCk4MDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpQU1SLCBvY3RldC1hbGlnbj0oc3RyaW5nKTE7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpMTYwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylBTVItV0IsIG9jdGV0LWFsaWduPShzdHJpbmcpMTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby9BTVIsIGNoYW5uZWxzPShpbnQpMSwgcmF0ZT0oaW50KTgwMDA7IGF1ZGlvL0FNUi1XQiwgY2hhbm5lbHM9KGludCkxLCByYXRlPShpbnQpMTYwMDA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBhbXJwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEFNUiBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZC1lbmNvZGUgQU1SIG9yIEFNUi1XQiBhdWRpbyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgMzI2Nyk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vQU1SLCBjaGFubmVscz0oaW50KTEsIHJhdGU9KGludCk4MDAwOyBhdWRpby9BTVItV0IsIGNoYW5uZWxzPShpbnQpMSwgcmF0ZT0oaW50KTE2MDAwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCk4MDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpQU1SLCBlbmNvZGluZy1wYXJhbXM9KHN0cmluZykxLCBvY3RldC1hbGlnbj0oc3RyaW5nKTEsIGNyYz0oc3RyaW5nKTAsIHJvYnVzdC1zb3J0aW5nPShzdHJpbmcpMCwgaW50ZXJsZWF2aW5nPShzdHJpbmcpMCwgbW9kZS1zZXQ9KGludClbIDAsIDcgXSwgbW9kZS1jaGFuZ2UtcGVyaW9kPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIG1vZGUtY2hhbmdlLW5laWdoYm9yPShzdHJpbmcpeyAwLCAxIH0sIG1heHB0aW1lPShpbnQpWyAyMCwgMjE0NzQ4MzY0NyBdLCBwdGltZT0oaW50KVsgMjAsIDIxNDc0ODM2NDcgXTsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KTE2MDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpQU1SLVdCLCBlbmNvZGluZy1wYXJhbXM9KHN0cmluZykxLCBvY3RldC1hbGlnbj0oc3RyaW5nKTEsIGNyYz0oc3RyaW5nKTAsIHJvYnVzdC1zb3J0aW5nPShzdHJpbmcpMCwgaW50ZXJsZWF2aW5nPShzdHJpbmcpMCwgbW9kZS1zZXQ9KGludClbIDAsIDcgXSwgbW9kZS1jaGFuZ2UtcGVyaW9kPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIG1vZGUtY2hhbmdlLW5laWdoYm9yPShzdHJpbmcpeyAwLCAxIH0sIG1heHB0aW1lPShpbnQpWyAyMCwgMjE0NzQ4MzY0NyBdLCBwdGltZT0oaW50KVsgMjAsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGJ2ZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEJyb2FkY29tVm9pY2UgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBCcm9hZGNvbVZvaWNlIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgKFJGQyA0Mjk4KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgY2xvY2stcmF0ZT0oaW50KTgwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylCVjE2OyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgY2xvY2stcmF0ZT0oaW50KTE2MDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpQlYzMjwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LWJ2LCBtb2RlPShpbnQpeyAxNiwgMzIgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGJ2cGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBCViBQYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGFja2V0aXplIEJyb2FkY29tVm9pY2UgYXVkaW8gc3RyZWFtcyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgNDI5OCk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1idiwgbW9kZT0oaW50KXsgMTYsIDMyIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KTgwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylCVjE2OyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpMTYwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylCVjMyPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwY2VsdGRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBDRUxUIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgQ0VMVCBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpWyAzMjAwMCwgNDgwMDAgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUNFTFQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1jZWx0PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwY2VsdHBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgQ0VMVCBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZC1lbmNvZGVzIENFTFQgYXVkaW8gaW50byBhIFJUUCBwYWNrZXQ8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1jZWx0LCByYXRlPShpbnQpWyAzMjAwMCwgNjQwMDAgXSwgY2hhbm5lbHM9KGludClbIDEsIDIgXSwgZnJhbWUtc2l6ZT0oaW50KVsgNjQsIDUxMiBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludClbIDMyMDAwLCA0ODAwMCBdLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpQ0VMVDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGR2ZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIERWIERlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RGVwYXlsb2FkcyBEViBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMzE4OSk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5NYXJjZWwgTW9yZWF1eCAmbHQ7bWFyY2VsbUBzcGFjZWxhYnMubmwmZ3Q7LCBXaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpeyB2aWRlbywgYXVkaW8gfSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKURWLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kZT0oc3RyaW5nKXsgU0QtVkNSLzUyNS02MCwgU0QtVkNSLzYyNS01MCwgSEQtVkNSLzExMjUtNjAsIEhELVZDUi8xMjUwLTUwLCBTREwtVkNSLzUyNS02MCwgU0RMLVZDUi82MjUtNTAsIDMwNk0vNTI1LTYwLCAzMDZNLzYyNS01MCwgMzE0TS0yNS81MjUtNjAsIDMxNE0tMjUvNjI1LTUwLCAzMTRNLTUwLzUyNS02MCwgMzE0TS01MC82MjUtNTAgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LWR2PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwZHZwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIERWIFBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkcyBEViBpbnRvIFJUUCBwYWNrZXRzIChSRkMgMzE4OSk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5NYXJjZWwgTW9yZWF1eCAmbHQ7bWFyY2VsbUBzcGFjZWxhYnMubmwmZ3Q7LCBXaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1kdjwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl7IHZpZGVvLCBhdWRpbyB9LCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylEViwgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGU9KHN0cmluZyl7IFNELVZDUi81MjUtNjAsIFNELVZDUi82MjUtNTAsIEhELVZDUi8xMTI1LTYwLCBIRC1WQ1IvMTI1MC01MCwgU0RMLVZDUi81MjUtNjAsIFNETC1WQ1IvNjI1LTUwLCAzMDZNLzUyNS02MCwgMzA2TS82MjUtNTAsIDMxNE0tMjUvNTI1LTYwLCAzMTRNLTI1LzYyNS01MCwgMzE0TS01MC81MjUtNjAsIDMxNE0tNTAvNjI1LTUwIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBnNzIyZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIGF1ZGlvIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgRzcyMiBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpODAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUc3MjI7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpOSwgY2xvY2stcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL0c3MjIsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGc3MjJwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIGF1ZGlvIHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkLWVuY29kZSBSYXcgYXVkaW8gaW50byBSVFAgcGFja2V0cyAoUkZDIDM1NTEpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL0c3MjIsIHJhdGU9KGludCkxNjAwMCwgY2hhbm5lbHM9KGludCkxPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpRzcyMiwgcGF5bG9hZD0oaW50KTksIGVuY29kaW5nLXBhcmFtcz0oc3RyaW5nKTEsIGNsb2NrLXJhdGU9KGludCk4MDAwOyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUc3MjIsIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgZW5jb2RpbmctcGFyYW1zPShzdHJpbmcpMSwgY2xvY2stcmF0ZT0oaW50KTgwMDA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBnNzIzZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEcuNzIzIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgRy43MjMgYXVkaW8gZnJvbSBSVFAgcGFja2V0cyAoUkZDIDM1NTEpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpODAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUc3MjM7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpNCwgY2xvY2stcmF0ZT0oaW50KTgwMDA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vRzcyMywgY2hhbm5lbHM9KGludCkxLCByYXRlPShpbnQpODAwMDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGc3MjNwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEcuNzIzIHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYWNrZXRpemUgRy43MjMgYXVkaW8gaW50byBSVFAgcGFja2V0czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby9HNzIzLCBjaGFubmVscz0oaW50KTEsIHJhdGU9KGludCk4MDAwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpNCwgY2xvY2stcmF0ZT0oaW50KTgwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylHNzIzOyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpODAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUc3MjM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBnNzI2ZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEcuNzI2IGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgRy43MjYgYXVkaW8gZnJvbSBSVFAgcGFja2V0czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkF4aXMgQ29tbXVuaWNhdGlvbnMgJmx0O2Rldi1nc3RyZWFtZXJAYXhpcy5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgZW5jb2RpbmctbmFtZT0oc3RyaW5nKXsgRzcyNiwgRzcyNi0xNiwgRzcyNi0yNCwgRzcyNi0zMiwgRzcyNi00MCwgQUFMMi1HNzI2LTE2LCBBQUwyLUc3MjYtMjQsIEFBTDItRzcyNi0zMiwgQUFMMi1HNzI2LTQwIH0sIGNsb2NrLXJhdGU9KGludCk4MDAwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtYWRwY20sIGNoYW5uZWxzPShpbnQpMSwgcmF0ZT0oaW50KTgwMDAsIGJpdHJhdGU9KGludCl7IDE2MDAwLCAyNDAwMCwgMzIwMDAsIDQwMDAwIH0sIGJsb2NrX2FsaWduPShpbnQpeyAyLCAzLCA0LCA1IH0sIGxheW91dD0oc3RyaW5nKWc3MjY8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBnNzI2cGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBHLjcyNiBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZC1lbmNvZGVzIEcuNzI2IGF1ZGlvIGludG8gYSBSVFAgcGFja2V0PC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+QXhpcyBDb21tdW5pY2F0aW9ucyAmbHQ7ZGV2LWdzdHJlYW1lckBheGlzLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtYWRwY20sIGNoYW5uZWxzPShpbnQpMSwgcmF0ZT0oaW50KTgwMDAsIGJpdHJhdGU9KGludCl7IDE2MDAwLCAyNDAwMCwgMzIwMDAsIDQwMDAwIH0sIGxheW91dD0oc3RyaW5nKWc3MjY8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KTgwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZyl7IEc3MjYtMTYsIEc3MjYtMjQsIEc3MjYtMzIsIEc3MjYtNDAsIEFBTDItRzcyNi0xNiwgQUFMMi1HNzI2LTI0LCBBQUwyLUc3MjYtMzIsIEFBTDItRzcyNi00MCB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwZzcyOWRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBHLjcyOSBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIEcuNzI5IGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgKFJGQyAzNTUxKTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkxhdXJlbnQgR2xheWFsICZsdDtzcGdsZWdsZUB5YWhvby5mciZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpODAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUc3Mjk7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpMTgsIGNsb2NrLXJhdGU9KGludCk4MDAwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL0c3MjksIGNoYW5uZWxzPShpbnQpMSwgcmF0ZT0oaW50KTgwMDA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBnNzI5cGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBHLjcyOSBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGFja2V0aXplIEcuNzI5IGF1ZGlvIGludG8gUlRQIHBhY2tldHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5PbGl2aWVyIENyZXRlICZsdDtvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL0c3MjksIGNoYW5uZWxzPShpbnQpMSwgcmF0ZT0oaW50KTgwMDA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludCkxOCwgY2xvY2stcmF0ZT0oaW50KTgwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylHNzI5OyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpODAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUc3Mjk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBnc21kZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgR1NNIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgR1NNIGF1ZGlvIGZyb20gUlRQIHBhY2tldHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5aZWVzaGFuIEFsaSAmbHQ7emVlbml4QGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpODAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUdTTTsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludCkzLCBjbG9jay1yYXRlPShpbnQpODAwMDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LWdzbSwgcmF0ZT0oaW50KTgwMDAsIGNoYW5uZWxzPShpbnQpMTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGdzbXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgR1NNIHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkLWVuY29kZXMgR1NNIGF1ZGlvIGludG8gYSBSVFAgcGFja2V0PC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+WmVlc2hhbiBBbGkgJmx0O3plZW5peEBnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LWdzbSwgcmF0ZT0oaW50KTgwMDAsIGNoYW5uZWxzPShpbnQpMTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KTMsIGNsb2NrLXJhdGU9KGludCk4MDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpR1NNOyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpODAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUdTTTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGdzdGRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPkdTdHJlYW1lciBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yazwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgR1N0cmVhbWVyIGJ1ZmZlcnMgZnJvbSBSVFAgcGFja2V0czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhcHBsaWNhdGlvbiwgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpWC1HU1Q8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwZ3N0cGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBHU3RyZWFtZXIgcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBheWxvYWQgR1N0cmVhbWVyIGJ1ZmZlcnMgYXMgUlRQIHBhY2tldHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWFwcGxpY2F0aW9uLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKVgtR1NUPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwaDI2MWRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBIMjYxIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgSDI2MSB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgNDU4Nyk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5TdGlhbiBTZWxuZXMgJmx0O3N0aWFuQHBleGlwLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBwYXlsb2FkPShpbnQpMzEsIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjE7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjE8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1oMjYxPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwaDI2MXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgSDI2MSBwYWNrZXQgcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBheWxvYWQtZW5jb2RlcyBIMjYxIHZpZGVvIGluIFJUUCBwYWNrZXRzIChSRkMgNDU4Nyk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5TdGlhbiBTZWxuZXMgJmx0O3N0aWFuQHBleGlwLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtaDI2MTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgcGF5bG9hZD0oaW50KTMxLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylIMjYxOyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylIMjYxPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwaDI2M2RlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBIMjYzIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgSDI2MyB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMjE5MCk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5QaGlsaXBwZSBLYWxhZiAmbHQ7cGhpbGlwcGUua2FsYWZAY29sbGFib3JhLmNvLnVrJmd0OywgRWR3YXJkIEhlcnZleSAmbHQ7YmlsYm9lZEBiaWxib2VkLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBwYXlsb2FkPShpbnQpMzQsIGNsb2NrLXJhdGU9KGludCk5MDAwMDsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1oMjYzLCB2YXJpYW50PShzdHJpbmcpaXR1LCBoMjYzdmVyc2lvbj0oc3RyaW5nKWgyNjM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBoMjYzcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBIMjYzIHBhY2tldCBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZC1lbmNvZGVzIEgyNjMgdmlkZW8gaW4gUlRQIHBhY2tldHMgKFJGQyAyMTkwKTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPk5laWwgU3RyYXRmb3JkICZsdDtuZWlsc0B2aXBhZGlhLmNvbSZndDtEZWphbiBTYWtlbHNhayAmbHQ7ZGVqYW4uc2FrZWxzYWtAbWFyYW5kLnNpJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1oMjYzLCB2YXJpYW50PShzdHJpbmcpaXR1LCBoMjYzdmVyc2lvbj0oc3RyaW5nKWgyNjM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIHBheWxvYWQ9KGludCkzNCwgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpSDI2MzsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpSDI2MzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGgyNjNwZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEgyNjMgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBIMjYzLysvKysgdmlkZW8gZnJvbSBSVFAgcGFja2V0cyAoUkZDIDQ2MjkpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylIMjYzLTE5OTg7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylIMjYzLTIwMDA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1oMjYzLCB2YXJpYW50PShzdHJpbmcpaXR1PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwaDI2M3BwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEgyNjMgcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBheWxvYWQtZW5jb2RlcyBIMjYzLysvKysgdmlkZW8gaW4gUlRQIHBhY2tldHMgKFJGQyA0NjI5KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LWgyNjMsIHZhcmlhbnQ9KHN0cmluZylpdHU8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpSDI2My0xOTk4OyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylIMjYzLTIwMDA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBoMjY0ZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEgyNjQgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBIMjY0IHZpZGVvIGZyb20gUlRQIHBhY2tldHMgKFJGQyAzOTg0KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpSDI2NDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LWgyNjQsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylhdmMsIGFsaWdubWVudD0oc3RyaW5nKWF1OyB2aWRlby94LWgyNjQsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylieXRlLXN0cmVhbSwgYWxpZ25tZW50PShzdHJpbmcpeyBuYWwsIGF1IH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBoMjY0cGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBIMjY0IHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkLWVuY29kZSBIMjY0IHZpZGVvIGludG8gUlRQIHBhY2tldHMgKFJGQyAzOTg0KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkxhdXJlbnQgR2xheWFsICZsdDtzcGdsZWdsZUB5YWhvby5mciZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtaDI2NCwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKWF2YywgYWxpZ25tZW50PShzdHJpbmcpYXU7IHZpZGVvL3gtaDI2NCwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKWJ5dGUtc3RyZWFtLCBhbGlnbm1lbnQ9KHN0cmluZyl7IG5hbCwgYXUgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylIMjY0PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwaDI2NWRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBIMjY1IGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgSDI2NSB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgNzc5OCk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5KdXJnZW4gU2xvd2FjayAmbHQ7anVyZ2Vuc2xvd2Fja0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpSDI2NTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LWgyNjUsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylodmMxLCBhbGlnbm1lbnQ9KHN0cmluZylhdTsgdmlkZW8veC1oMjY1LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpYnl0ZS1zdHJlYW0sIGFsaWdubWVudD0oc3RyaW5nKXsgbmFsLCBhdSB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwaDI2NXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgSDI2NSBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZC1lbmNvZGUgSDI2NSB2aWRlbyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgNzc5OCk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5KdXJnZW4gU2xvd2FjayAmbHQ7anVyZ2Vuc2xvd2Fja0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LWgyNjUsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylodmMxLCBhbGlnbm1lbnQ9KHN0cmluZylhdTsgdmlkZW8veC1oMjY1LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpYnl0ZS1zdHJlYW0sIGFsaWdubWVudD0oc3RyaW5nKXsgbmFsLCBhdSB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjU8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBpbGJjZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIGlMQkMgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBpTEJDIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgKFJGQyAzOTUyKTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlBoaWxpcHBlIEthbGFmICZsdDtwaGlsaXBwZS5rYWxhZkBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgY2xvY2stcmF0ZT0oaW50KTgwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylJTEJDPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtaUxCQywgbW9kZT0oaW50KXsgMjAsIDMwIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBpbGJjcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBpTEJDIFBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYWNrZXRpemUgaUxCQyBhdWRpbyBzdHJlYW1zIGludG8gUlRQIHBhY2tldHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5QaGlsaXBwZSBLYWxhZiAmbHQ7cGhpbGlwcGUua2FsYWZAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1pTEJDLCBtb2RlPShpbnQpeyAyMCwgMzAgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpODAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUlMQkMsIG1vZGU9KHN0cmluZyl7IDIwLCAzMCB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwajJrZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEpQRUcgMjAwMCBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIEpQRUcgMjAwMCB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgNTM3MSk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgc2FtcGxpbmc9KHN0cmluZyl7IFJHQiwgQkdSLCBSR0JBLCBCR1JBLCBZQ2JDckEsIFlDYkNyLTQ6NDo0LCBZQ2JDci00OjI6MiwgWUNiQ3ItNDoyOjAsIFlDYkNyLTQ6MToxLCBHUkFZU0NBTEUgfSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUpQRUcyMDAwOyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBjb2xvcnNwYWNlPShzdHJpbmcpeyBzUkdCLCBzWVVWLCBHUkFZIH0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylKUEVHMjAwMDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5pbWFnZS94LWpwYywgY29sb3JzcGFjZT0oc3RyaW5nKXsgc1JHQiwgc1lVViwgR1JBWSB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwajJrcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBKUEVHIDIwMDAgcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBheWxvYWQtZW5jb2RlcyBKUEVHIDIwMDAgcGljdHVyZXMgaW50byBSVFAgcGFja2V0cyAoUkZDIDUzNzEpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmltYWdlL3gtanBjLCBzYW1wbGluZz0oc3RyaW5nKXsgUkdCLCBCR1IsIFJHQkEsIEJHUkEsIFlDYkNyQSwgWUNiQ3ItNDo0OjQsIFlDYkNyLTQ6MjoyLCBZQ2JDci00OjI6MCwgWUNiQ3ItNDoxOjEsIEdSQVlTQ0FMRSB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgc2FtcGxpbmc9KHN0cmluZyl7IFJHQiwgQkdSLCBSR0JBLCBCR1JBLCBZQ2JDckEsIFlDYkNyLTQ6NDo0LCBZQ2JDci00OjI6MiwgWUNiQ3ItNDoyOjAsIFlDYkNyLTQ6MToxLCBHUkFZU0NBTEUgfSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUpQRUcyMDAwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwanBlZ2RlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBKUEVHIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgSlBFRyB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMjQzNSk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUpQRUc7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBwYXlsb2FkPShpbnQpMjYsIGNsb2NrLXJhdGU9KGludCk5MDAwMDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5pbWFnZS9qcGVnPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwanBlZ3BheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgSlBFRyBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZC1lbmNvZGVzIEpQRUcgcGljdHVyZXMgaW50byBSVFAgcGFja2V0cyAoUkZDIDI0MzUpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+QXhpcyBDb21tdW5pY2F0aW9ucyAmbHQ7ZGV2LWdzdHJlYW1lckBheGlzLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmltYWdlL2pwZWc7IHZpZGVvL3gtanBlZzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgcGF5bG9hZD0oaW50KTI2LCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylKUEVHLCB3aWR0aD0oaW50KVsgMSwgNjU1MzYgXSwgaGVpZ2h0PShpbnQpWyAxLCA2NTUzNiBdOyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylKUEVHLCB3aWR0aD0oaW50KVsgMSwgNjU1MzYgXSwgaGVpZ2h0PShpbnQpWyAxLCA2NTUzNiBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwa2x2ZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEtMViBEZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIEtMViAoU01QVEUgU1QgMzM2KSBtZXRhZGF0YSBmcm9tIFJUUCBwYWNrZXRzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+VGltLVBoaWxpcHAgTcO8bGxlciAmbHQ7dGltQGNlbnRyaWN1bGFyLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWFwcGxpY2F0aW9uLCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylTTVBURTMzNk08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+bWV0YS94LWtsdiwgcGFyc2VkPShib29sZWFuKXRydWU8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBrbHZwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEtMViBQYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZHMgS0xWIChTTVBURSBTVCAzMzYpIG1ldGFkYXRhIGFzIFJUUCBwYWNrZXRzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+VGltLVBoaWxpcHAgTcO8bGxlciAmbHQ7dGltQGNlbnRyaWN1bGFyLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPm1ldGEveC1rbHYsIHBhcnNlZD0oYm9vbGVhbil0cnVlPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWFwcGxpY2F0aW9uLCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylTTVBURTMzNk08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBtcDFzZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIE1QRUcxIFN5c3RlbSBTdHJlYW0gZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBNUEVHMSBTeXN0ZW0gU3RyZWFtcyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMzU1NSk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpb3RoZXIsIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKU1QMVM7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylNUDFTPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL21wZWcsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbil0cnVlPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwbXAydGRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBNUEVHIFRyYW5zcG9ydCBTdHJlYW0gZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBNUEVHMiBUUyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMjI1MCk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OywgVGhpanMgVmVybWVpciAmbHQ7dGhpanMudmVybWVpckBiYXJjby5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgY2xvY2stcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpeyBNUDJULCBNUDJULUVTIH07IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBwYXlsb2FkPShpbnQpMzMsIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby9tcGVndHMsIHBhY2tldHNpemU9KGludCkxODgsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbil0cnVlPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwbXAydHBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgTVBFRzIgVHJhbnNwb3J0IFN0cmVhbSBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZC1lbmNvZGVzIE1QRUcyIFRTIGludG8gUlRQIHBhY2tldHMgKFJGQyAyMjUwKTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby9tcGVndHMsIHBhY2tldHNpemU9KGludCkxODgsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbil0cnVlPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBwYXlsb2FkPShpbnQpMzMsIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKU1QMlQ7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKU1QMlQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBtcDRhZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIE1QRUc0IGF1ZGlvIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgTVBFRzQgYXVkaW8gZnJvbSBSVFAgcGFja2V0cyAoUkZDIDMwMTYpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+Tm9raWEgQ29ycG9yYXRpb24gKGNvbnRhY3QgJmx0O3N0ZWZhbi5rb3N0QG5va2lhLmNvbSZndDspLCBXaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKU1QNEEtTEFUTTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQsIGZyYW1lZD0oYm9vbGVhbil7IGZhbHNlLCB0cnVlIH0sIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylyYXc8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBtcDRhcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBNUEVHNCBhdWRpbyBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZCBNUEVHNCBhdWRpbyBhcyBSVFAgcGFja2V0cyAoUkZDIDMwMTYpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpNCwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKXJhdzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylNUDRBLUxBVE08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBtcDRnZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIE1QRUc0IEVTIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgTVBFRzQgZWxlbWVudGFyeSBzdHJlYW1zIGZyb20gUlRQIHBhY2tldHMgKFJGQyAzNjQwKTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl7IHZpZGVvLCBhdWRpbywgYXBwbGljYXRpb24gfSwgY2xvY2stcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpTVBFRzQtR0VORVJJQywgbW9kZT0oc3RyaW5nKXsgZ2VuZXJpYywgQ0VMUC1jYnIsIENFTFAtdmJyLCBBQUMtbGJyLCBBQUMtaGJyIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCk0LCBzeXN0ZW1zdHJlYW09KGJvb2xlYW4pZmFsc2U7IGF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpNCwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKXJhdzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cG1wNGdwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIE1QRUc0IEVTIHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkIE1QRUc0IGVsZW1lbnRhcnkgc3RyZWFtcyBhcyBSVFAgcGFja2V0cyAoUkZDIDM2NDApPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpNCwgc3lzdGVtc3RyZWFtPShib29sZWFuKWZhbHNlOyBhdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylyYXc8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpeyB2aWRlbywgYXVkaW8sIGFwcGxpY2F0aW9uIH0sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpTVBFRzQtR0VORVJJQywgc3RyZWFtdHlwZT0oc3RyaW5nKXsgNCwgNSB9LCBtb2RlPShzdHJpbmcpeyBnZW5lcmljLCBDRUxQLWNiciwgQ0VMUC12YnIsIEFBQy1sYnIsIEFBQy1oYnIgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cG1wNHZkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgTVBFRzQgdmlkZW8gZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBNUEVHNCB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMzAxNik8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKU1QNFYtRVM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCk0LCBzeXN0ZW1zdHJlYW09KGJvb2xlYW4pZmFsc2U8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBtcDR2cGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBNUEVHNCBWaWRlbyBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZCBNUEVHLTQgdmlkZW8gYXMgUlRQIHBhY2tldHMgKFJGQyAzMDE2KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZTsgdmlkZW8veC1kaXZ4PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKU1QNFYtRVM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBtcGFkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgTVBFRyBhdWRpbyBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIE1QRUcgYXVkaW8gZnJvbSBSVFAgcGFja2V0cyAoUkZDIDIwMzgpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpMTQsIGNsb2NrLXJhdGU9KGludCk5MDAwMDsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIGVuY29kaW5nLW5hbWU9KHN0cmluZylNUEEsIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTE8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBtcGFwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIE1QRUcgYXVkaW8gcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBheWxvYWQgTVBFRyBhdWRpbyBhcyBSVFAgcGFja2V0cyAoUkZDIDIwMzgpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpMTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KTE0LCBjbG9jay1yYXRlPShpbnQpOTAwMDA7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKU1QQTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cG1wYXJvYnVzdGRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBNUEVHIGF1ZGlvIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgTVBFRyBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgNTIxOSk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5NYXJrIE5hdXdlbGFlcnRzICZsdDttYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylNUEEtUk9CVVNUOyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgY2xvY2stcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpeyBYLU1QMy1EUkFGVC0wMCwgWC1NUDMtRFJBRlQtMDEsIFgtTVAzLURSQUZULTAyLCBYLU1QMy1EUkFGVC0wMywgWC1NUDMtRFJBRlQtMDQsIFgtTVAzLURSQUZULTA1LCBYLU1QMy1EUkFGVC0wNiB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpMTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cG1wdmRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBNUEVHIHZpZGVvIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgTVBFRyB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMjI1MCk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKU1QVjsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIHBheWxvYWQ9KGludCkzMiwgY2xvY2stcmF0ZT0oaW50KTkwMDAwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpMiwgc3lzdGVtc3RyZWFtPShib29sZWFuKWZhbHNlPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwbXB2cGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBNUEVHMiBFUyB2aWRlbyBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZC1lbmNvZGVzIE1QRUcyIEVTIGludG8gUlRQIHBhY2tldHMgKFJGQyAyMjUwKTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlRoaWpzIFZlcm1laXIgJmx0O3RoaWpzdmVybWVpckBnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTIsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgcGF5bG9hZD0oaW50KTMyLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylNUFY7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKU1QVjwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cG9wdXNkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgT3B1cyBwYWNrZXQgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBPcHVzIGF1ZGlvIGZyb20gUlRQIHBhY2tldHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5EYW5pbG8gQ2VzYXIgTGVtZXMgZGUgUGF1bGEgJmx0O2Rhbmlsby5jZXNhckBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpNDgwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZyl7IE9QVVMsIFgtR1NULU9QVVMtRFJBRlQtU1BJVFRLQS0wMCB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtb3B1cywgY2hhbm5lbC1tYXBwaW5nLWZhbWlseT0oaW50KTA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBvcHVzcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBPcHVzIHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QdXRzIE9wdXMgYXVkaW8gaW4gUlRQIHBhY2tldHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5EYW5pbG8gQ2VzYXIgTGVtZXMgZGUgUGF1bGEgJmx0O2Rhbmlsby5jZXNhckBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LW9wdXMsIGNoYW5uZWxzPShpbnQpWyAxLCAyIF0sIGNoYW5uZWwtbWFwcGluZy1mYW1pbHk9KGludCkwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCk0ODAwMCwgZW5jb2RpbmctcGFyYW1zPShzdHJpbmcpMiwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKXsgT1BVUywgWC1HU1QtT1BVUy1EUkFGVC1TUElUVEtBLTAwIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBwY21hZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIFBDTUEgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBQQ01BIGF1ZGlvIGZyb20gUlRQIHBhY2tldHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5FZGdhcmQgTGltYSAmbHQ7ZWRnYXJkLmxpbWFAZ21haWwuY29tJmd0OywgWmVlc2hhbiBBbGkgJmx0O3plZW5peEBnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KTgsIGNsb2NrLXJhdGU9KGludCk4MDAwOyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgY2xvY2stcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpUENNQTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LWFsYXcsIGNoYW5uZWxzPShpbnQpMSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwcGNtYXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgUENNQSBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZC1lbmNvZGVzIFBDTUEgYXVkaW8gaW50byBhIFJUUCBwYWNrZXQ8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5FZGdhcmQgTGltYSAmbHQ7ZWRnYXJkLmxpbWFAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1hbGF3LCBjaGFubmVscz0oaW50KTEsIHJhdGU9KGludCk4MDAwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpOCwgY2xvY2stcmF0ZT0oaW50KTgwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylQQ01BOyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylQQ01BPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwcGNtdWRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBQQ01VIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgUENNVSBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RWRnYXJkIExpbWEgJmx0O2VkZ2FyZC5saW1hQGdtYWlsLmNvbSZndDssIFplZXNoYW4gQWxpICZsdDt6ZWVuaXhAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludCkwLCBjbG9jay1yYXRlPShpbnQpODAwMDsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIGVuY29kaW5nLW5hbWU9KHN0cmluZylQQ01VLCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1tdWxhdywgY2hhbm5lbHM9KGludCkxLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBwY211cGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBQQ01VIHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkLWVuY29kZXMgUENNVSBhdWRpbyBpbnRvIGEgUlRQIHBhY2tldDwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkVkZ2FyZCBMaW1hICZsdDtlZGdhcmQubGltYUBnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LW11bGF3LCBjaGFubmVscz0oaW50KTEsIHJhdGU9KGludCk4MDAwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpMCwgY2xvY2stcmF0ZT0oaW50KTgwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylQQ01VOyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylQQ01VPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwcWNlbHBkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgUUNFTFAgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBRQ0VMUCAoUHVyZVZvaWNlKSBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMjY1OCk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIGNsb2NrLXJhdGU9KGludCk4MDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpUUNFTFA7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpMTIsIGNsb2NrLXJhdGU9KGludCk4MDAwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3FjZWxwLCBjaGFubmVscz0oaW50KTEsIHJhdGU9KGludCk4MDAwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwcWRtMmRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBRRE0yIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgUURNMiBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIChubyBSRkMpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RWR3YXJkIEhlcnZleSAmbHQ7YmlsYm9lZEBiaWxib2VkLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpWC1RRE08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1xZG0yPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwc2JjZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIFNCQyBhdWRpbyBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIFNCQyBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+QXJ1biBSYWdoYXZhbiAmbHQ7YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpeyAxNjAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCBlbmNvZGluZy1uYW1lPShzdHJpbmcpU0JDPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtc2JjLCByYXRlPShpbnQpeyAxNjAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCBjaGFubmVscz0oaW50KVsgMSwgMiBdLCBtb2RlPShzdHJpbmcpeyBtb25vLCBkdWFsLCBzdGVyZW8sIGpvaW50IH0sIGJsb2Nrcz0oaW50KXsgNCwgOCwgMTIsIDE2IH0sIHN1YmJhbmRzPShpbnQpeyA0LCA4IH0sIGFsbG9jYXRpb24tbWV0aG9kPShzdHJpbmcpeyBzbnIsIGxvdWRuZXNzIH0sIGJpdHBvb2w9KGludClbIDIsIDY0IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBzYmNwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIHBhY2tldCBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkIFNCQyBhdWRpbyBhcyBSVFAgcGFja2V0czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlRoaWFnbyBTb3VzYSBTYW50b3MgJmx0O3RoaWFnb3NzQGxjYy51ZmNnLmVkdS5iciZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtc2JjLCByYXRlPShpbnQpeyAxNjAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCBjaGFubmVscz0oaW50KVsgMSwgMiBdLCBjaGFubmVsLW1vZGU9KHN0cmluZyl7IG1vbm8sIGR1YWwsIHN0ZXJlbywgam9pbnQgfSwgYmxvY2tzPShpbnQpeyA0LCA4LCAxMiwgMTYgfSwgc3ViYmFuZHM9KGludCl7IDQsIDggfSwgYWxsb2NhdGlvbi1tZXRob2Q9KHN0cmluZyl7IHNuciwgbG91ZG5lc3MgfSwgYml0cG9vbD0oaW50KVsgMiwgNjQgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpeyAxNjAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCBlbmNvZGluZy1uYW1lPShzdHJpbmcpU0JDPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwc2lyZW5kZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgU2lyZW4gcGFja2V0IGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgU2lyZW4gYXVkaW8gZnJvbSBSVFAgcGFja2V0czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlBoaWxpcHBlIEthbGFmICZsdDtwaGlsaXBwZS5rYWxhZkBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgY2xvY2stcmF0ZT0oaW50KTE2MDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpU0lSRU48L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1zaXJlbiwgZGN0LWxlbmd0aD0oaW50KTMyMDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cHNpcmVucGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBQYXlsb2FkZXIgZm9yIFNpcmVuIEF1ZGlvPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBhY2tldGl6ZSBTaXJlbiBhdWRpbyBzdHJlYW1zIGludG8gUlRQIHBhY2tldHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5Zb3VuZXNzIEFsYW91aSAmbHQ7a2FrYXJvdG9Aa2FrYXJvdG8uaG9tZWxpbnV4Lm5ldCZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtc2lyZW4sIGRjdC1sZW5ndGg9KGludCkzMjA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KTE2MDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpU0lSRU4sIGJpdHJhdGU9KHN0cmluZykxNjAwMCwgZGN0LWxlbmd0aD0oaW50KTMyMDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cHNwZWV4ZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIFNwZWV4IGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgU3BlZXggYXVkaW8gZnJvbSBSVFAgcGFja2V0czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkVkZ2FyZCBMaW1hICZsdDtlZGdhcmQubGltYUBnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgY2xvY2stcmF0ZT0oaW50KVsgNjAwMCwgNDgwMDAgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKVNQRUVYPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtc3BlZXg8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBzcGVleHBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgU3BlZXggcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBheWxvYWQtZW5jb2RlcyBTcGVleCBhdWRpbyBpbnRvIGEgUlRQIHBhY2tldDwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkVkZ2FyZCBMaW1hICZsdDtlZGdhcmQubGltYUBnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXNwZWV4LCByYXRlPShpbnQpWyA2MDAwLCA0ODAwMCBdLCBjaGFubmVscz0oaW50KTE8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KVsgNjAwMCwgNDgwMDAgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKVNQRUVYLCBlbmNvZGluZy1wYXJhbXM9KHN0cmluZykxPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwc3RyZWFtZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIFN0cmVhbSBEZXBheWxvYWRpbmc8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcms8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkRlcGF5bG9hZHMgUlRQL1JUQ1AgcGFja2V0cyBmb3Igc3RyZWFtaW5nIHByb3RvY29scyBhY2NvcmRpbmcgdG8gUkZDNDU3MTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlNlYmFzdGlhbiBEcsO2Z2UgJmx0O3NlYmFzdGlhbkBjZW50cmljdWxhci5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cC1zdHJlYW07IGFwcGxpY2F0aW9uL3gtcnRjcC1zdHJlYW07IGFwcGxpY2F0aW9uL3gtc3J0cC1zdHJlYW07IGFwcGxpY2F0aW9uL3gtc3J0Y3Atc3RyZWFtPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwOyBhcHBsaWNhdGlvbi94LXJ0Y3A7IGFwcGxpY2F0aW9uL3gtc3J0cDsgYXBwbGljYXRpb24veC1zcnRjcDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cHN0cmVhbXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgU3RyZWFtIFBheWxvYWRpbmc8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkcyBSVFAvUlRDUCBwYWNrZXRzIGZvciBzdHJlYW1pbmcgcHJvdG9jb2xzIGFjY29yZGluZyB0byBSRkM0NTcxPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwOyBhcHBsaWNhdGlvbi94LXJ0Y3A7IGFwcGxpY2F0aW9uL3gtc3J0cDsgYXBwbGljYXRpb24veC1zcnRjcDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cC1zdHJlYW07IGFwcGxpY2F0aW9uL3gtcnRjcC1zdHJlYW07IGFwcGxpY2F0aW9uL3gtc3J0cC1zdHJlYW07IGFwcGxpY2F0aW9uL3gtc3J0Y3Atc3RyZWFtPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwc3YzdmRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBTVlEzIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgU1ZRMyB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChubyBSRkMpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZyl7IFgtU1YzVi1FUywgWC1TT1JFTlNPTi1WSURFTywgWC1TT1JFTlNPTlZJREVPLCBYLVNvcmVuc29uVmlkZW8gfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXN2cSwgc3ZxdmVyc2lvbj0oaW50KTM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHB0aGVvcmFkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgVGhlb3JhIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgVGhlb3JhIHZpZGVvIGZyb20gUlRQIHBhY2tldHMgKGRyYWZ0LTAxIG9mIFJGQyBYWFhYKTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpVEhFT1JBPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtdGhlb3JhPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwdGhlb3JhcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBUaGVvcmEgcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBheWxvYWQtZW5jb2RlIFRoZW9yYSB2aWRlbyBpbnRvIFJUUCBwYWNrZXRzIChkcmFmdC0wMSBSRkMgWFhYWCk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC10aGVvcmE8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpVEhFT1JBPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwdm9yYmlzZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIFZvcmJpcyBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIFZvcmJpcyBBdWRpbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgNTIxNSk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKVZPUkJJUzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXZvcmJpczwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cHZvcmJpc3BheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgVm9yYmlzIHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkLWVuY29kZSBWb3JiaXMgYXVkaW8gaW50byBSVFAgcGFja2V0cyAoUkZDIDUyMTUpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtdm9yYmlzPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKVZPUkJJUzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cHZwOGRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBWUDggZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBWUDggdmlkZW8gZnJvbSBSVFAgcGFja2V0cyk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5Tam9lcmQgU2ltb25zICZsdDtzam9lcmRAbHVvbi5uZXQmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpeyBWUDgsIFZQOC1EUkFGVC1JRVRGLTAxIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC12cDg8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHB2cDhwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIFZQOCBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UHV0cyBWUDggdmlkZW8gaW4gUlRQIHBhY2tldHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5Tam9lcmQgU2ltb25zICZsdDtzam9lcmRAbHVvbi5uZXQmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXZwODwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZyl7IFZQOCwgVlA4LURSQUZULUlFVEYtMDEgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cHZwOWRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBWUDkgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBWUDkgdmlkZW8gZnJvbSBSVFAgcGFja2V0cyk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5TdGlhbiBTZWxuZXMgJmx0O3N0aWFuQHBleGlwLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIGVuY29kaW5nLW5hbWU9KHN0cmluZyl7IFZQOSwgVlA5LURSQUZULUlFVEYtMDEgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXZwOTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cHZwOXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgVlA5IHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QdXRzIFZQOSB2aWRlbyBpbiBSVFAgcGFja2V0cyk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5TdGlhbiBTZWxuZXMgJmx0O3N0aWFuQHBleGlwLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtdnA5PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKXsgVlA5LCBWUDktRFJBRlQtSUVURi0wMSB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwdnJhd2RlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBSYXcgVmlkZW8gZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyByYXcgdmlkZW8gZnJvbSBSVFAgcGFja2V0cyAoUkZDIDQxNzUpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylSQVcsIHNhbXBsaW5nPShzdHJpbmcpeyBSR0IsIFJHQkEsIEJHUiwgQkdSQSwgWUNiQ3ItNDo0OjQsIFlDYkNyLTQ6MjoyLCBZQ2JDci00OjI6MCwgWUNiQ3ItNDoxOjEgfSwgZGVwdGg9KHN0cmluZyl7IDgsIDEwLCAxMiwgMTYgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cHZyYXdwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIFJhdyBWaWRlbyBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZCByYXcgdmlkZW8gYXMgUlRQIHBhY2tldHMgKFJGQyA0MTc1KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBSR0IsIFJHQkEsIEJHUiwgQkdSQSwgQVlVViwgVVlWWSwgSTQyMCwgWTQxQiwgVVlWUCB9LCB3aWR0aD0oaW50KVsgMSwgMzI3NjcgXSwgaGVpZ2h0PShpbnQpWyAxLCAzMjc2NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKVJBVywgc2FtcGxpbmc9KHN0cmluZyl7IFJHQiwgUkdCQSwgQkdSLCBCR1JBLCBZQ2JDci00OjQ6NCwgWUNiQ3ItNDoyOjIsIFlDYkNyLTQ6MjowLCBZQ2JDci00OjE6MSB9LCBkZXB0aD0oc3RyaW5nKXsgOCwgMTAsIDEyLCAxNiB9LCBjb2xvcmltZXRyeT0oc3RyaW5nKXsgQlQ2MDEtNSwgQlQ3MDktMiwgU01QVEUyNDBNIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg0ZWVhZgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbApAQCAtMCwwICsxLDMwMSBAQAorPHBsdWdpbj4KKyAgPG5hbWU+cnRwbWFuYWdlcjwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPlJUUCBzZXNzaW9uIG1hbmFnZW1lbnQgcGx1Z2luIGxpYnJhcnk8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L3J0cG1hbmFnZXIvLmxpYnMvbGliZ3N0cnRwbWFuYWdlci5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RydHBtYW5hZ2VyLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBiaW48L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEJpbjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5SZWFsLVRpbWUgVHJhbnNwb3J0IFByb3RvY29sIGJpbjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+cmVjdl9ydGNwX3NpbmtfJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRjcDsgYXBwbGljYXRpb24veC1zcnRjcDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5yZWN2X3J0cF9zaW5rXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cDsgYXBwbGljYXRpb24veC1zcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNlbmRfcnRwX3NpbmtfJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnJlY3ZfcnRwX3NyY18ldV8ldV8ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNlbmRfcnRwX3NyY18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwOyBhcHBsaWNhdGlvbi94LXNydHA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2VuZF9ydGNwX3NyY18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0Y3A7IGFwcGxpY2F0aW9uL3gtc3J0Y3A8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBkdG1mbXV4PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBtdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvTXV4ZXI8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPm1peGVzIFJUUCBEVE1GIHN0cmVhbXMgaW50byBvdGhlciBSVFAgc3RyZWFtczwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlplZXNoYW4gQWxpICZsdDtmaXJzdC5sYXN0QG5va2lhLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5wcmlvcml0eV9zaW5rXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGppdHRlcmJ1ZmZlcjwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgcGFja2V0IGppdHRlci1idWZmZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+QSBidWZmZXIgdGhhdCBkZWFscyB3aXRoIG5ldHdvcmsgaml0dGVyIGFuZCBvdGhlciB0cmFuc21pc3Npb24gZmF1bHRzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+UGhpbGlwcGUgS2FsYWYgJmx0O3BoaWxpcHBlLmthbGFmQGNvbGxhYm9yYS5jby51ayZndDssIFdpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rX3J0Y3A8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRjcDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cG11eDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgbXV4ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL011eGVyPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5tdWx0aXBsZXggTiBydHAgc3RyZWFtcyBpbnRvIG9uZTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlplZXNoYW4gQWxpICZsdDtmaXJzdC5sYXN0QG5va2lhLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cHB0ZGVtdXg8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIERlbXV4PC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5EZW11eC9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGFyc2VzIGNvZGVjIHN0cmVhbXMgdHJhbnNtaXR0ZWQgaW4gdGhlIHNhbWUgUlRQIHNlc3Npb248L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5LYWkgVmVobWFuZW4gJmx0O2thaS52ZWhtYW5lbkBub2tpYS5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmNfJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+c29tZXRpbWVzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgcGF5bG9hZD0oaW50KVsgMCwgMjU1IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBydHhxdWV1ZTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgUmV0cmFuc21pc3Npb24gUXVldWU8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5LZWVwIFJUUCBwYWNrZXRzIGluIGEgcXVldWUgZm9yIHJldHJhbnNtaXNzaW9uPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwcnR4cmVjZWl2ZTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgUmV0cmFuc21pc3Npb24gcmVjZWl2ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5SZWNlaXZlIHJldHJhbnNtaXR0ZWQgUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQzQ1ODg8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5KdWxpZW4gSXNvcmNlICZsdDtqdWxpZW4uaXNvcmNlQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwcnR4c2VuZDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgUmV0cmFuc21pc3Npb24gU2VuZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UmV0cmFuc21pdCBSVFAgcGFja2V0cyB3aGVuIG5lZWRlZCwgYWNjb3JkaW5nIHRvIFJGQzQ1ODg8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5KdWxpZW4gSXNvcmNlICZsdDtqdWxpZW4uaXNvcmNlQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBzZXNzaW9uPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBTZXNzaW9uPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkltcGxlbWVudCBhbiBSVFAgc2Vzc2lvbjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+cmVjdl9ydGNwX3Npbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRjcDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5yZWN2X3J0cF9zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zZW5kX3J0cF9zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5yZWN2X3J0cF9zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+c29tZXRpbWVzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zZW5kX3J0cF9zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+c29tZXRpbWVzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zeW5jX3NyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRjcDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zZW5kX3J0Y3Bfc3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRjcDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cHNzcmNkZW11eDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgU1NSQyBEZW11eDwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RGVtdXgvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlNwbGl0cyBSVFAgc3RyZWFtcyBiYXNlZCBvbiB0aGUgU1NSQzwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+cnRjcF9zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRjcDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnJ0Y3Bfc3JjXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnNvbWV0aW1lczwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydGNwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyY18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NTI5YjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWwKQEAgLTAsMCArMSw2MSBAQAorPHBsdWdpbj4KKyAgPG5hbWU+cnRzcDwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPnRyYW5zZmVyIGRhdGEgdmlhIFJUU1A8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L3J0c3AvLmxpYnMvbGliZ3N0cnRzcC5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RydHNwLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBkZWM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIERlY29kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BhcnNlci9OZXR3b3JrPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5BY2NlcHRzIHJhdyBSVFAgYW5kIFJUQ1AgcGFja2V0cyBhbmQgc2VuZHMgdGhlbSBmb3J3YXJkPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5yZWN2X3J0Y3Bfc2lua18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydGNwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnJlY3ZfcnRwX3NpbmtfJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnJlY3ZfcnRwX3NyY18ldV8ldV8ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnJ0Y3Bfc3JjXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRjcDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0c3BzcmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRTUCBwYWNrZXQgcmVjZWl2ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNvdXJjZS9OZXR3b3JrPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5SZWNlaXZlIGRhdGEgb3ZlciB0aGUgbmV0d29yayB2aWEgUlRTUCAoUkZDIDIzMjYpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbUBmbHVlbmRvLmNvbSZndDssIFRoaWpzIFZlcm1laXIgJmx0O3RoaWpzLnZlcm1laXJAYmFyY28uY29tJmd0OywgTHV0eiBNdWVsbGVyICZsdDtsdXR6QHRvcGZyb3NlLmRlJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnN0cmVhbV8ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwOyBhcHBsaWNhdGlvbi94LXJkdDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzMjJmMQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzxwbHVnaW4+CisgIDxuYW1lPnNoYXBld2lwZTwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPlNoYXBlIFdpcGUgdHJhbnNpdGlvbiBmaWx0ZXI8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L3NoYXBld2lwZS8ubGlicy9saWJnc3RzaGFwZXdpcGUuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0c2hhcGV3aXBlLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5zaGFwZXdpcGU8L25hbWU+CisgICAgICA8bG9uZ25hbWU+U2hhcGUgV2lwZSB0cmFuc2l0aW9uIGZpbHRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VkaXRvci9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+QWRkcyBhIHNoYXBlIHdpcGUgdHJhbnNpdGlvbiB0byBhIHZpZGVvIHN0cmVhbTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlNlYmFzdGlhbiBEcsO2Z2UgJmx0O3NlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPm1hc2tfc2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpR1JBWTgsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKTAvMTsgdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUdSQVkxNl9MRSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pMC8xPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnZpZGVvX3Npbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQVlVViwgQVJHQiwgQkdSQSwgQUJHUiwgUkdCQSB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQVlVViwgQVJHQiwgQkdSQSwgQUJHUiwgUkdCQSB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMTNhMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyLnhtbApAQCAtMCwwICsxLDI4IEBACis8cGx1Z2luPgorICA8bmFtZT5zaG91dDI8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5TZW5kcyBkYXRhIHRvIGFuIGljZWNhc3Qgc2VydmVyIHVzaW5nIGxpYnNob3V0MjwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9leHQvc2hvdXQyLy5saWJzL2xpYmdzdHNob3V0Mi5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RzaG91dDIuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnNob3V0MnNlbmQ8L25hbWU+CisgICAgICA8bG9uZ25hbWU+SWNlY2FzdCBuZXR3b3JrIHNpbms8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNpbmsvTmV0d29yazwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+U2VuZHMgZGF0YSB0byBhbiBpY2VjYXN0IHNlcnZlcjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BjaGVsbG8uYmUmZ3Q7LCBQZWRybyBDb3J0ZS1SZWFsICZsdDt0eXBvQG5ldGNhYm8ucHQmZ3Q7LCBaYWhlZXIgQWJiYXMgTWVyYWxpICZsdDt6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZyZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL29nZzsgYXVkaW8vb2dnOyB2aWRlby9vZ2c7IGF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpMSwgbGF5ZXI9KGludClbIDEsIDMgXTsgdmlkZW8vd2VibTsgYXVkaW8vd2VibTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZDEwZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sCkBAIC0wLDAgKzEsNjEgQEAKKzxwbHVnaW4+CisgIDxuYW1lPnNtcHRlPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+QXBwbHkgdGhlIHN0YW5kYXJkIFNNUFRFIHRyYW5zaXRpb25zIG9uIHZpZGVvIGltYWdlczwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3Qvc21wdGUvLmxpYnMvbGliZ3N0c21wdGUuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0c21wdGUuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnNtcHRlPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlNNUFRFIHRyYW5zaXRpb25zPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWRpdG9yL1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5BcHBseSB0aGUgc3RhbmRhcmQgU01QVEUgdHJhbnNpdGlvbnMgb24gdmlkZW8gaW1hZ2VzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGNoZWxsby5iZSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rMTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpSTQyMCwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbmsyPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylJNDIwLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUk0MjAsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnNtcHRlYWxwaGE8L25hbWU+CisgICAgICA8bG9uZ25hbWU+U01QVEUgdHJhbnNpdGlvbnM8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZGl0b3IvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkFwcGx5IHRoZSBzdGFuZGFyZCBTTVBURSB0cmFuc2l0aW9ucyBhcyBhbHBoYSBvbiB2aWRlbyBpbWFnZXM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUk0MjAsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVlWMTIsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUFZVVYsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUFSR0IsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUJHUkEsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVJHQkEsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUFSR0IsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpQVlVViwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpQVJHQiwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpQkdSQSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpUkdCQSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpQVJHQiwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMmM2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWwKQEAgLTAsMCArMSw0MyBAQAorPHBsdWdpbj4KKyAgPG5hbWU+c291cDwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPmxpYnNvdXAgSFRUUCBjbGllbnQgc3JjL3Npbms8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZXh0L3NvdXAvLmxpYnMvbGliZ3N0c291cC5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3Rzb3VwLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5zb3VwaHR0cGNsaWVudHNpbms8L25hbWU+CisgICAgICA8bG9uZ25hbWU+SFRUUCBjbGllbnQgc2luazwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+R2VuZXJpYzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+U2VuZHMgc3RyZWFtcyB0byBIVFRQIHNlcnZlciB2aWEgUFVUPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RGF2aWQgU2NobGVlZiAmbHQ7ZHNAZW50cm9weXdhdmUuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+c291cGh0dHBzcmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+SFRUUCBjbGllbnQgc291cmNlPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Tb3VyY2UvTmV0d29yazwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UmVjZWl2ZSBkYXRhIGFzIGEgY2xpZW50IG92ZXIgdGhlIG5ldHdvcmsgdmlhIEhUVFAgdXNpbmcgU09VUDwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldvdXRlciBDbG9ldGVucyAmbHQ7d291dGVyQG1pbmQuYmUmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTViZGQzYwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWwKQEAgLTAsMCArMSwzNCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+c3BlY3RydW08L25hbWU+CisgIDxkZXNjcmlwdGlvbj5SdW4gYW4gRkZUIG9uIHRoZSBhdWRpbyBzaWduYWwsIG91dHB1dCBzcGVjdHJ1bSBkYXRhPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9zcGVjdHJ1bS8ubGlicy9saWJnc3RzcGVjdHJ1bS5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RzcGVjdHJ1bS5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+c3BlY3RydW08L25hbWU+CisgICAgICA8bG9uZ25hbWU+U3BlY3RydW0gYW5hbHl6ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9BbmFseXplci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UnVuIGFuIEZGVCBvbiB0aGUgYXVkaW8gc2lnbmFsLCBvdXRwdXQgc3BlY3RydW0gZGF0YTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkVyaWsgV2FsdGhpbnNlbiAmbHQ7b21lZ2FAY3NlLm9naS5lZHUmZ3Q7LCBTdGVmYW4gS29zdCAmbHQ7ZW5zb25pY0B1c2Vycy5zZi5uZXQmZ3Q7LCBTZWJhc3RpYW4gRHLDtmdlICZsdDtzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFMxNkxFLCBTMjRMRSwgUzMyTEUsIEYzMkxFLCBGNjRMRSB9LCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFMxNkxFLCBTMjRMRSwgUzMyTEUsIEYzMkxFLCBGNjRMRSB9LCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc4MzlkYgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWwKQEAgLTAsMCArMSw1NSBAQAorPHBsdWdpbj4KKyAgPG5hbWU+c3BlZXg8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5TcGVleCBwbHVnaW4gbGlicmFyeTwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9leHQvc3BlZXgvLmxpYnMvbGliZ3N0c3BlZXguc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0c3BlZXguc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnNwZWV4ZGVjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlNwZWV4IGF1ZGlvIGRlY29kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlY29kZXIvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPmRlY29kZSBzcGVleCBzdHJlYW1zIHRvIGF1ZGlvPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbUBmbHVlbmRvLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtc3BlZXg8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVMxNkxFLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgNjAwMCwgNDgwMDAgXSwgY2hhbm5lbHM9KGludClbIDEsIDIgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnNwZWV4ZW5jPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlNwZWV4IGF1ZGlvIGVuY29kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0VuY29kZXIvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkVuY29kZXMgYXVkaW8gaW4gU3BlZXggZm9ybWF0PC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbUBmbHVlbmRvLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylTMTZMRSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDYwMDAsIDQ4MDAwIF0sIGNoYW5uZWxzPShpbnQpMTsgYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVMxNkxFLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgNjAwMCwgNDgwMDAgXSwgY2hhbm5lbHM9KGludCkyLCBjaGFubmVsLW1hc2s9KGJpdG1hc2spMHgwMDAwMDAwMDAwMDAwMDAzPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtc3BlZXgsIHJhdGU9KGludClbIDYwMDAsIDQ4MDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MTNmYTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbApAQCAtMCwwICsxLDU1IEBACis8cGx1Z2luPgorICA8bmFtZT50YWdsaWI8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5UYWcgd3JpdGluZyBwbHVnLWluIGJhc2VkIG9uIHRhZ2xpYjwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9leHQvdGFnbGliLy5saWJzL2xpYmdzdHRhZ2xpYi5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3R0YWdsaWIuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmFwZXYybXV4PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlRhZ0xpYi1iYXNlZCBBUEV2MiBNdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Rm9ybWF0dGVyL01ldGFkYXRhPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5BZGRzIGFuIEFQRXYyIGhlYWRlciB0byB0aGUgYmVnaW5uaW5nIG9mIGZpbGVzIHVzaW5nIHRhZ2xpYjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlNlYmFzdGlhbiBEcsO2Z2UgJmx0O3Nsb21vQGNpcmN1bGFyLWNoYW9zLm9yZyZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LWFwZXRhZzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmlkM3YybXV4PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlRhZ0xpYi1iYXNlZCBJRDN2MiBNdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Rm9ybWF0dGVyL01ldGFkYXRhPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5BZGRzIGFuIElEM3YyIGhlYWRlciB0byB0aGUgYmVnaW5uaW5nIG9mIE1QMyBmaWxlcyB1c2luZyB0YWdsaWI8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5DaHJpc3RvcGhlIEZlcmdlYXUgJmx0O3RldWZAZ25vbWUub3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtaWQzPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXR3b2xhbWUueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXR3b2xhbWUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMGE5YmQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdHdvbGFtZS54bWwKQEAgLTAsMCArMSwzNCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+dHdvbGFtZTwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkVuY29kZSBNUDJzIHdpdGggVHdvTEFNRTwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9leHQvdHdvbGFtZS8ubGlicy9saWJnc3R0d29sYW1lLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdHR3b2xhbWUuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnR3b2xhbWVtcDJlbmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+VHdvTEFNRSBtcDIgZW5jb2RlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRW5jb2Rlci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+SGlnaC1xdWFsaXR5IGZyZWUgTVAyIGVuY29kZXI8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5TZWJhc3RpYW4gRHLDtmdlICZsdDtzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEYzMkxFLCBTMTZMRSB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KXsgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCBjaGFubmVscz0oaW50KTE7IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEYzMkxFLCBTMTZMRSB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KXsgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCBjaGFubmVscz0oaW50KTIsIGNoYW5uZWwtbWFzaz0oYml0bWFzaykweDAwMDAwMDAwMDAwMDAwMDM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCkxLCBsYXllcj0oaW50KTIsIHJhdGU9KGludCl7IDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAgfSwgY2hhbm5lbHM9KGludClbIDEsIDIgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5YmE3MQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sCkBAIC0wLDAgKzEsNzMgQEAKKzxwbHVnaW4+CisgIDxuYW1lPnVkcDwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPnRyYW5zZmVyIGRhdGEgdmlhIFVEUDwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvdWRwLy5saWJzL2xpYmdzdHVkcC5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3R1ZHAuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmR5bnVkcHNpbms8L25hbWU+CisgICAgICA8bG9uZ25hbWU+VURQIHBhY2tldCBzZW5kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNpbmsvTmV0d29yazwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+U2VuZCBkYXRhIG92ZXIgdGhlIG5ldHdvcmsgdmlhIFVEUCB3aXRoIHBhY2tldCBkZXN0aW5hdGlvbnMgcGlja2VkIHVwIGR5bmFtaWNhbGx5IGZyb20gbWV0YSBvbiB0aGUgYnVmZmVycyBwYXNzZWQ8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5QaGlsaXBwZSBLaGFsYWYgJmx0O2J1cmdlckBzcGVlZHkub3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+bXVsdGl1ZHBzaW5rPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlVEUCBwYWNrZXQgc2VuZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5TaW5rL05ldHdvcms8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlNlbmQgZGF0YSBvdmVyIHRoZSBuZXR3b3JrIHZpYSBVRFAgdG8gb25lIG9yIG11bHRpcGxlIHJlY2lwaWVudHMgd2hpY2ggY2FuIGJlIGFkZGVkIG9yIHJlbW92ZWQgYXQgcnVudGltZSB1c2luZyBhY3Rpb24gc2lnbmFsczwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT51ZHBzaW5rPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlVEUCBwYWNrZXQgc2VuZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5TaW5rL05ldHdvcms8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlNlbmQgZGF0YSBvdmVyIHRoZSBuZXR3b3JrIHZpYSBVRFA8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltQGZsdWVuZG8uY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+dWRwc3JjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlVEUCBwYWNrZXQgcmVjZWl2ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNvdXJjZS9OZXR3b3JrPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5SZWNlaXZlIGRhdGEgb3ZlciB0aGUgbmV0d29yayB2aWEgVURQPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbUBmbHVlbmRvLmNvbSZndDssIFRoaWpzIFZlcm1laXIgJmx0O3RoaWpzLnZlcm1laXJAYmFyY28uY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU5MWEyNAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sCkBAIC0wLDAgKzEsNTIgQEAKKzxwbHVnaW4+CisgIDxuYW1lPnZpZGVvNGxpbnV4MjwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPmVsZW1lbnRzIGZvciBWaWRlbyA0IExpbnV4PC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL3N5cy92NGwyLy5saWJzL2xpYmdzdHZpZGVvNGxpbnV4Mi5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3R2aWRlbzRsaW51eDIuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnY0bDJyYWRpbzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SYWRpbyAodmlkZW80bGludXgyKSBUdW5lcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+VHVuZXI8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkNvbnRyb2xzIGEgVmlkZW80TGludXgyIHJhZGlvIGRldmljZTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkFsZXhleSBDaGVybm92ICZsdDs0ZXJub3ZAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+djRsMnNpbms8L25hbWU+CisgICAgICA8bG9uZ25hbWU+VmlkZW8gKHZpZGVvNGxpbnV4MikgU2luazwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U2luay9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RGlzcGxheXMgZnJhbWVzIG9uIGEgdmlkZW80bGludXgyIGRldmljZTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlJvYiBDbGFyayAmbHQ7cm9iQHRpLmNvbSZndDssPC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5pbWFnZS9qcGVnOyB2aWRlby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZTsgdmlkZW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCkyOyB2aWRlby9tcGVndHMsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbil0cnVlOyB2aWRlby94LWJheWVyLCBmb3JtYXQ9KHN0cmluZyl7IGJnZ3IsIGdicmcsIGdyYmcsIHJnZ2IgfSwgd2lkdGg9KGludClbIDEsIDMyNzY4IF0sIGhlaWdodD0oaW50KVsgMSwgMzI3NjggXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF07IHZpZGVvL3gtZHYsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbil0cnVlOyB2aWRlby94LWgyNjMsIHZhcmlhbnQ9KHN0cmluZylpdHU7IHZpZGVvL3gtaDI2NCwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKXsgYnl0ZS1zdHJlYW0sIGF2YyB9LCBhbGlnbm1lbnQ9KHN0cmluZylhdTsgdmlkZW8veC1wd2MxLCB3aWR0aD0oaW50KVsgMSwgMzI3NjggXSwgaGVpZ2h0PShpbnQpWyAxLCAzMjc2OCBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC1wd2MyLCB3aWR0aD0oaW50KVsgMSwgMzI3NjggXSwgaGVpZ2h0PShpbnQpWyAxLCAzMjc2OCBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUkdCMTYsIEJHUiwgUkdCLCBHUkFZOCwgR1JBWTE2X0xFLCBHUkFZMTZfQkUsIFlWVTksIFlWMTIsIFlVWTIsIFlWWVUsIFVZVlksIFk0MkIsIFk0MUIsIFlVVjksIE5WMTJfNjRaMzIsIE5WMjQsIE5WNjEsIE5WMTYsIE5WMjEsIE5WMTIsIEk0MjAsIEJHUkEsIEJHUngsIEFSR0IsIHhSR0IsIEJHUjE1LCBSR0IxNSB9LCB3aWR0aD0oaW50KVsgMSwgMzI3NjggXSwgaGVpZ2h0PShpbnQpWyAxLCAzMjc2OCBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC1zb25peCwgd2lkdGg9KGludClbIDEsIDMyNzY4IF0sIGhlaWdodD0oaW50KVsgMSwgMzI3NjggXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF07IHZpZGVvL3gtdnA4OyB2aWRlby94LXZwOTsgdmlkZW8veC13bXYsIHdtdnZlcnNpb249KGludCkzLCBmb3JtYXQ9KHN0cmluZylXVkMxPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+djRsMnNyYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5WaWRlbyAodmlkZW80bGludXgyKSBTb3VyY2U8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNvdXJjZS9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UmVhZHMgZnJhbWVzIGZyb20gYSBWaWRlbzRMaW51eDIgZGV2aWNlPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RWRnYXJkIExpbWEgJmx0O2VkZ2FyZC5saW1hQGdtYWlsLmNvbSZndDssIFN0ZWZhbiBLb3N0ICZsdDtlbnNvbmljQHVzZXJzLnNmLm5ldCZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5pbWFnZS9qcGVnOyB2aWRlby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZTsgdmlkZW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCkyOyB2aWRlby9tcGVndHMsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbil0cnVlOyB2aWRlby94LWJheWVyLCBmb3JtYXQ9KHN0cmluZyl7IGJnZ3IsIGdicmcsIGdyYmcsIHJnZ2IgfSwgd2lkdGg9KGludClbIDEsIDMyNzY4IF0sIGhlaWdodD0oaW50KVsgMSwgMzI3NjggXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF07IHZpZGVvL3gtZHYsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbil0cnVlOyB2aWRlby94LWgyNjMsIHZhcmlhbnQ9KHN0cmluZylpdHU7IHZpZGVvL3gtaDI2NCwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKXsgYnl0ZS1zdHJlYW0sIGF2YyB9LCBhbGlnbm1lbnQ9KHN0cmluZylhdTsgdmlkZW8veC1wd2MxLCB3aWR0aD0oaW50KVsgMSwgMzI3NjggXSwgaGVpZ2h0PShpbnQpWyAxLCAzMjc2OCBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC1wd2MyLCB3aWR0aD0oaW50KVsgMSwgMzI3NjggXSwgaGVpZ2h0PShpbnQpWyAxLCAzMjc2OCBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUkdCMTYsIEJHUiwgUkdCLCBHUkFZOCwgR1JBWTE2X0xFLCBHUkFZMTZfQkUsIFlWVTksIFlWMTIsIFlVWTIsIFlWWVUsIFVZVlksIFk0MkIsIFk0MUIsIFlVVjksIE5WMTJfNjRaMzIsIE5WMjQsIE5WNjEsIE5WMTYsIE5WMjEsIE5WMTIsIEk0MjAsIEJHUkEsIEJHUngsIEFSR0IsIHhSR0IsIEJHUjE1LCBSR0IxNSB9LCB3aWR0aD0oaW50KVsgMSwgMzI3NjggXSwgaGVpZ2h0PShpbnQpWyAxLCAzMjc2OCBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC1zb25peCwgd2lkdGg9KGludClbIDEsIDMyNzY4IF0sIGhlaWdodD0oaW50KVsgMSwgMzI3NjggXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF07IHZpZGVvL3gtdnA4OyB2aWRlby94LXZwOTsgdmlkZW8veC13bXYsIHdtdnZlcnNpb249KGludCkzLCBmb3JtYXQ9KHN0cmluZylXVkMxPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczNzk1OAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWwKQEAgLTAsMCArMSwzNCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+dmlkZW9ib3g8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5yZXNpemVzIGEgdmlkZW8gYnkgYWRkaW5nIGJvcmRlcnMgb3IgY3JvcHBpbmc8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L3ZpZGVvYm94Ly5saWJzL2xpYmdzdHZpZGVvYm94LnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdHZpZGVvYm94LnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT52aWRlb2JveDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5WaWRlbyBib3ggZmlsdGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5SZXNpemVzIGEgdmlkZW8gYnkgYWRkaW5nIGJvcmRlcnMgb3IgY3JvcHBpbmc8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltQGZsdWVuZG8uY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQVlVViwgQVJHQiwgQkdSQSwgQUJHUiwgUkdCQSwgeFJHQiwgQkdSeCwgeEJHUiwgUkdCeCwgUkdCLCBCR1IsIFk0NDQsIFk0MkIsIFlVWTIsIFlWWVUsIFVZVlksIEk0MjAsIFlWMTIsIFk0MUIsIEdSQVk4LCBHUkFZMTZfQkUsIEdSQVkxNl9MRSB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQVlVViwgQVJHQiwgQkdSQSwgQUJHUiwgUkdCQSwgeFJHQiwgQkdSeCwgeEJHUiwgUkdCeCwgUkdCLCBCR1IsIFk0NDQsIFk0MkIsIFlVWTIsIFlWWVUsIFVZVlksIEk0MjAsIFlWMTIsIFk0MUIsIEdSQVk4LCBHUkFZMTZfQkUsIEdSQVkxNl9MRSB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYTY2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbApAQCAtMCwwICsxLDU1IEBACis8cGx1Z2luPgorICA8bmFtZT52aWRlb2Nyb3A8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5Dcm9wcyB2aWRlbyBpbnRvIGEgdXNlci1kZWZpbmVkIHJlZ2lvbjwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvdmlkZW9jcm9wLy5saWJzL2xpYmdzdHZpZGVvY3JvcC5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3R2aWRlb2Nyb3Auc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmFzcGVjdHJhdGlvY3JvcDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5hc3BlY3RyYXRpb2Nyb3A8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkNyb3BzIHZpZGVvIGludG8gYSB1c2VyLWRlZmluZWQgYXNwZWN0LXJhdGlvPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+VGhpanMgVmVybWVpciAmbHQ7dGhpanN2ZXJtZWlyQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFJHQngsIHhSR0IsIEJHUngsIHhCR1IsIFJHQkEsIEFSR0IsIEJHUkEsIEFCR1IsIFJHQiwgQkdSLCBBWVVWLCBZVVkyLCBZVllVLCBVWVZZLCBJNDIwLCBZVjEyLCBSR0IxNiwgUkdCMTUsIEdSQVk4LCBOVjEyLCBOVjIxLCBHUkFZMTZfTEUsIEdSQVkxNl9CRSB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUkdCeCwgeFJHQiwgQkdSeCwgeEJHUiwgUkdCQSwgQVJHQiwgQkdSQSwgQUJHUiwgUkdCLCBCR1IsIEFZVVYsIFlVWTIsIFlWWVUsIFVZVlksIEk0MjAsIFlWMTIsIFJHQjE2LCBSR0IxNSwgR1JBWTgsIE5WMTIsIE5WMjEsIEdSQVkxNl9MRSwgR1JBWTE2X0JFIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnZpZGVvY3JvcDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5Dcm9wPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5Dcm9wcyB2aWRlbyBpbnRvIGEgdXNlci1kZWZpbmVkIHJlZ2lvbjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlRpbS1QaGlsaXBwIE3DvGxsZXIgJmx0O3RpbSBjZW50cmljdWxhciBuZXQmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBSR0J4LCB4UkdCLCBCR1J4LCB4QkdSLCBSR0JBLCBBUkdCLCBCR1JBLCBBQkdSLCBSR0IsIEJHUiwgQVlVViwgWVVZMiwgWVZZVSwgVVlWWSwgSTQyMCwgWVYxMiwgUkdCMTYsIFJHQjE1LCBHUkFZOCwgTlYxMiwgTlYyMSwgR1JBWTE2X0xFLCBHUkFZMTZfQkUgfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFJHQngsIHhSR0IsIEJHUngsIHhCR1IsIFJHQkEsIEFSR0IsIEJHUkEsIEFCR1IsIFJHQiwgQkdSLCBBWVVWLCBZVVkyLCBZVllVLCBVWVZZLCBJNDIwLCBZVjEyLCBSR0IxNiwgUkdCMTUsIEdSQVk4LCBOVjEyLCBOVjIxLCBHUkFZMTZfTEUsIEdSQVkxNl9CRSB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDFkMzEyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbApAQCAtMCwwICsxLDk3IEBACis8cGx1Z2luPgorICA8bmFtZT52aWRlb2ZpbHRlcjwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPlZpZGVvIGZpbHRlcnMgcGx1Z2luPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC92aWRlb2ZpbHRlci8ubGlicy9saWJnc3R2aWRlb2ZpbHRlci5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3R2aWRlb2ZpbHRlci5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+Z2FtbWE8L25hbWU+CisgICAgICA8bG9uZ25hbWU+VmlkZW8gZ2FtbWEgY29ycmVjdGlvbjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+QWRqdXN0cyBnYW1tYSBvbiBhIHZpZGVvIHN0cmVhbTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkFyd2VkIHYuIE1lcmthdHogJmx0O3YubWVya2F0ekBnbXgubmV0PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBBWVVWLCBBUkdCLCBCR1JBLCBBQkdSLCBSR0JBLCBZNDQ0LCB4UkdCLCBSR0J4LCB4QkdSLCBCR1J4LCBSR0IsIEJHUiwgWTQyQiwgTlYxMiwgTlYyMSwgWVVZMiwgVVlWWSwgWVZZVSwgSTQyMCwgWVYxMiwgSVlVViwgWTQxQiB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQVlVViwgQVJHQiwgQkdSQSwgQUJHUiwgUkdCQSwgWTQ0NCwgeFJHQiwgUkdCeCwgeEJHUiwgQkdSeCwgUkdCLCBCR1IsIFk0MkIsIE5WMTIsIE5WMjEsIFlVWTIsIFVZVlksIFlWWVUsIEk0MjAsIFlWMTIsIElZVVYsIFk0MUIgfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+dmlkZW9iYWxhbmNlPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlZpZGVvIGJhbGFuY2U8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkFkanVzdHMgYnJpZ2h0bmVzcywgY29udHJhc3QsIGh1ZSwgc2F0dXJhdGlvbiBvbiBhIHZpZGVvIHN0cmVhbTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkRhdmlkIFNjaGxlZWYgJmx0O2RzQHNjaGxlZWYub3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQVlVViwgQVJHQiwgQkdSQSwgQUJHUiwgUkdCQSwgWTQ0NCwgeFJHQiwgUkdCeCwgeEJHUiwgQkdSeCwgUkdCLCBCR1IsIFk0MkIsIFlVWTIsIFVZVlksIFlWWVUsIEk0MjAsIFlWMTIsIElZVVYsIFk0MUIsIE5WMTIsIE5WMjEgfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LXJhdyhBTlkpPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEFZVVYsIEFSR0IsIEJHUkEsIEFCR1IsIFJHQkEsIFk0NDQsIHhSR0IsIFJHQngsIHhCR1IsIEJHUngsIFJHQiwgQkdSLCBZNDJCLCBZVVkyLCBVWVZZLCBZVllVLCBJNDIwLCBZVjEyLCBJWVVWLCBZNDFCLCBOVjEyLCBOVjIxIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC1yYXcoQU5ZKTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnZpZGVvZmxpcDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5WaWRlbyBmbGlwcGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5GbGlwcyBhbmQgcm90YXRlcyB2aWRlbzwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkRhdmlkIFNjaGxlZWYgJmx0O2RzQHNjaGxlZWYub3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQVlVViwgQVJHQiwgQkdSQSwgQUJHUiwgUkdCQSwgWTQ0NCwgeFJHQiwgUkdCeCwgeEJHUiwgQkdSeCwgUkdCLCBCR1IsIEk0MjAsIFlWMTIsIElZVVYsIFlVWTIsIFVZVlksIFlWWVUsIE5WMTIsIE5WMjEsIEdSQVk4LCBHUkFZMTZfQkUsIEdSQVkxNl9MRSB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQVlVViwgQVJHQiwgQkdSQSwgQUJHUiwgUkdCQSwgWTQ0NCwgeFJHQiwgUkdCeCwgeEJHUiwgQkdSeCwgUkdCLCBCR1IsIEk0MjAsIFlWMTIsIElZVVYsIFlVWTIsIFVZVlksIFlWWVUsIE5WMTIsIE5WMjEsIEdSQVk4LCBHUkFZMTZfQkUsIEdSQVkxNl9MRSB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT52aWRlb21lZGlhbjwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5NZWRpYW4gZWZmZWN0PC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5BcHBseSBhIG1lZGlhbiBmaWx0ZXIgdG8gYW4gaW1hZ2U8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgSTQyMCwgWVYxMiB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgSTQyMCwgWVYxMiB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM0NjNmOAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbApAQCAtMCwwICsxLDM0IEBACis8cGx1Z2luPgorICA8bmFtZT52aWRlb21peGVyPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+VmlkZW8gbWl4ZXI8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L3ZpZGVvbWl4ZXIvLmxpYnMvbGliZ3N0dmlkZW9taXhlci5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3R2aWRlb21peGVyLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT52aWRlb21peGVyPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlZpZGVvIG1peGVyIDI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZGl0b3IvVmlkZW8vQ29tcG9zaXRvcjwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+TWl4IG11bHRpcGxlIHZpZGVvIHN0cmVhbXM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltQGZsdWVuZG8uY29tJmd0OywgU2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2lua18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQVlVViwgQkdSQSwgQVJHQiwgUkdCQSwgQUJHUiwgWTQ0NCwgWTQyQiwgWVVZMiwgVVlWWSwgWVZZVSwgSTQyMCwgWVYxMiwgTlYxMiwgTlYyMSwgWTQxQiwgUkdCLCBCR1IsIHhSR0IsIHhCR1IsIFJHQngsIEJHUnggfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEFZVVYsIEJHUkEsIEFSR0IsIFJHQkEsIEFCR1IsIFk0NDQsIFk0MkIsIFlVWTIsIFVZVlksIFlWWVUsIEk0MjAsIFlWMTIsIE5WMTIsIE5WMjEsIFk0MUIsIFJHQiwgQkdSLCB4UkdCLCB4QkdSLCBSR0J4LCBCR1J4IH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkNTFmOAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sCkBAIC0wLDAgKzEsOTcgQEAKKzxwbHVnaW4+CisgIDxuYW1lPnZweDwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPlZQOCBwbHVnaW48L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZXh0L3ZweC8ubGlicy9saWJnc3R2cHguc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0dnB4LnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT52cDhkZWM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+T24yIFZQOCBEZWNvZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZWNvZGVyL1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5EZWNvZGUgVlA4IHZpZGVvIHN0cmVhbXM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5EYXZpZCBTY2hsZWVmICZsdDtkc0BlbnRyb3B5d2F2ZS5jb20mZ3Q7LCBTZWJhc3RpYW4gRHLDtmdlICZsdDtzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtdnA4PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylJNDIwLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT52cDhlbmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+T24yIFZQOCBFbmNvZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9FbmNvZGVyL1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FbmNvZGUgVlA4IHZpZGVvIHN0cmVhbXM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5EYXZpZCBTY2hsZWVmICZsdDtkc0BlbnRyb3B5d2F2ZS5jb20mZ3Q7LCBTZWJhc3RpYW4gRHLDtmdlICZsdDtzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylJNDIwLCB3aWR0aD0oaW50KVsgMSwgMTYzODMgXSwgaGVpZ2h0PShpbnQpWyAxLCAxNjM4MyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXZwOCwgcHJvZmlsZT0oc3RyaW5nKXsgMCwgMSwgMiwgMyB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+dnA5ZGVjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPk9uMiBWUDkgRGVjb2RlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVjb2Rlci9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RGVjb2RlIFZQOSB2aWRlbyBzdHJlYW1zPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RGF2aWQgU2NobGVlZiAmbHQ7ZHNAZW50cm9weXdhdmUuY29tJmd0OywgU2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXZwOTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBJNDIwLCBZVjEyLCBZNDJCLCBZNDQ0IH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnZwOWVuYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5PbjIgVlA5IEVuY29kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0VuY29kZXIvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkVuY29kZSBWUDkgdmlkZW8gc3RyZWFtczwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkRhdmlkIFNjaGxlZWYgJmx0O2RzQGVudHJvcHl3YXZlLmNvbSZndDssIFNlYmFzdGlhbiBEcsO2Z2UgJmx0O3NlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgSTQyMCwgWVYxMiB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC12cDksIHByb2ZpbGU9KHN0cmluZyl7IDAsIDEsIDIsIDMgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlZm9ybS54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZWZvcm0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZDI3N2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZWZvcm0ueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzxwbHVnaW4+CisgIDxuYW1lPndhdmVmb3JtPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+V2F2ZUZvcm0gQVBJIGJhc2VkIHBsdWdpbjwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi93aW4zMi92czYvcmVsZWFzZS9saWJnc3R3YXZlZm9ybS5kbGw8L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0d2F2ZWZvcm0uZGxsPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MC4xMC40LjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtYmFkPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIENWUzwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPndhdmVmb3Jtc2luazwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5XYXZlRm9ybSBhdWRpbyBzaW5rPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5TaW5rL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5XYXZlRm9ybSBhdWRpbyBzaW5rPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U2ViYXN0aWVuIE1vdXR0ZSAmbHQ7c2ViYXN0aWVuQG1vdXR0ZS5uZXQmZ3Q7PC9hdXRob3I+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOTg4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbApAQCAtMCwwICsxLDM0IEBACis8cGx1Z2luPgorICA8bmFtZT53YXZlbmM8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5FbmNvZGUgcmF3IGF1ZGlvIGludG8gV0FWPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC93YXZlbmMvLmxpYnMvbGliZ3N0d2F2ZW5jLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdHdhdmVuYy5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+d2F2ZW5jPC9uYW1lPgorICAgICAgPGxvbmduYW1lPldBViBhdWRpbyBtdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvTXV4ZXIvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkVuY29kZSByYXcgYXVkaW8gaW50byBXQVY8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5JYWluIEhvbG1lcyAmbHQ7aWFpbkBwcmV0dHlwZW9wbGUub3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDY1NTM1IF0sIGZvcm1hdD0oc3RyaW5nKXsgUzMyTEUsIFMyNExFLCBTMTZMRSwgVTgsIEYzMkxFLCBGNjRMRSB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDsgYXVkaW8veC1hbGF3LCByYXRlPShpbnQpWyA4MDAwLCAxOTIwMDAgXSwgY2hhbm5lbHM9KGludClbIDEsIDIgXTsgYXVkaW8veC1tdWxhdywgcmF0ZT0oaW50KVsgODAwMCwgMTkyMDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC13YXY7IGF1ZGlvL3gtcmY2NDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDdlYzgzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sCkBAIC0wLDAgKzEsNjEgQEAKKzxwbHVnaW4+CisgIDxuYW1lPndhdnBhY2s8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5XYXZwYWNrIGxvc3NsZXNzL2xvc3N5IGF1ZGlvIGZvcm1hdCBoYW5kbGluZzwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9leHQvd2F2cGFjay8ubGlicy9saWJnc3R3YXZwYWNrLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdHdhdnBhY2suc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPndhdnBhY2tkZWM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+V2F2cGFjayBhdWRpbyBkZWNvZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZWNvZGVyL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5EZWNvZGVzIFdhdnBhY2sgYXVkaW8gZGF0YTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkFyd2VkIHYuIE1lcmthdHogJmx0O3YubWVya2F0ekBnbXgubmV0Jmd0OywgU2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC13YXZwYWNrLCBkZXB0aD0oaW50KVsgMSwgMzIgXSwgY2hhbm5lbHM9KGludClbIDEsIDggXSwgcmF0ZT0oaW50KVsgNjAwMCwgMTkyMDAwIF0sIGZyYW1lZD0oYm9vbGVhbil0cnVlPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylTOCwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIGNoYW5uZWxzPShpbnQpWyAxLCA4IF0sIHJhdGU9KGludClbIDYwMDAsIDE5MjAwMCBdOyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpUzE2TEUsIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCBjaGFubmVscz0oaW50KVsgMSwgOCBdLCByYXRlPShpbnQpWyA2MDAwLCAxOTIwMDAgXTsgYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVMzMkxFLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgY2hhbm5lbHM9KGludClbIDEsIDggXSwgcmF0ZT0oaW50KVsgNjAwMCwgMTkyMDAwIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT53YXZwYWNrZW5jPC9uYW1lPgorICAgICAgPGxvbmduYW1lPldhdnBhY2sgYXVkaW8gZW5jb2RlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRW5jb2Rlci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RW5jb2RlcyBhdWRpbyB3aXRoIHRoZSBXYXZwYWNrIGxvc3NsZXNzL2xvc3N5IGF1ZGlvIGNvZGVjPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVMzMkxFLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgY2hhbm5lbHM9KGludClbIDEsIDggXSwgcmF0ZT0oaW50KVsgNjAwMCwgMTkyMDAwIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC13YXZwYWNrLCBkZXB0aD0oaW50KVsgMSwgMzIgXSwgY2hhbm5lbHM9KGludClbIDEsIDggXSwgcmF0ZT0oaW50KVsgNjAwMCwgMTkyMDAwIF0sIGZyYW1lZD0oYm9vbGVhbil0cnVlPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnd2Y3NyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtd2F2cGFjay1jb3JyZWN0aW9uLCBmcmFtZWQ9KGJvb2xlYW4pdHJ1ZTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMmUyYjEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzxwbHVnaW4+CisgIDxuYW1lPndhdnBhcnNlPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+UGFyc2UgYSAud2F2IGZpbGUgaW50byByYXcgYXVkaW88L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L3dhdnBhcnNlLy5saWJzL2xpYmdzdHdhdnBhcnNlLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdHdhdnBhcnNlLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT53YXZwYXJzZTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5XQVYgYXVkaW8gZGVtdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVtdXhlci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGFyc2UgYSAud2F2IGZpbGUgaW50byByYXcgYXVkaW88L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5FcmlrIFdhbHRoaW5zZW4gJmx0O29tZWdhQGNzZS5vZ2kuZWR1Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC13YXY8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vbXMtZ3NtOyBhdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTEsIGxheWVyPShpbnQpMzsgYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCkxLCBsYXllcj0oaW50KTI7IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFM4LCBVOCwgUzE2TEUsIFUxNkxFLCBTMjRMRSwgVTI0TEUsIFMzMkxFLCBVMzJMRSB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDsgYXVkaW8veC12b3JiaXM7IGF1ZGlvL3gtYWMzOyBhdWRpby94LWR0czsgYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCk0OyBhdWRpby94LWFsYXc7IGF1ZGlvL3gtbXVsYXc7IGF1ZGlvL3gtd21zLCBiaXRyYXRlPShpbnQpWyAwLCAyMTQ3NDgzNjQ3IF0sIGJsb2NrX2FsaWduPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtYWRwY20sIGxheW91dD0oc3RyaW5nKW1pY3Jvc29mdCwgYmxvY2tfYWxpZ249KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC1hZHBjbSwgbGF5b3V0PShzdHJpbmcpZHZpLCBibG9ja19hbGlnbj0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LXRydWVzcGVlY2g7IGF1ZGlvL3gtd21hLCB3bWF2ZXJzaW9uPShpbnQpMSwgYml0cmF0ZT0oaW50KVsgMCwgMjE0NzQ4MzY0NyBdLCBibG9ja19hbGlnbj0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LXdtYSwgd21hdmVyc2lvbj0oaW50KTIsIGJpdHJhdGU9KGludClbIDAsIDIxNDc0ODM2NDcgXSwgYmxvY2tfYWxpZ249KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC13bWEsIHdtYXZlcnNpb249KGludCkzLCBiaXRyYXRlPShpbnQpWyAwLCAyMTQ3NDgzNjQ3IF0sIGJsb2NrX2FsaWduPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtdm5kLnNvbnkuYXRyYWMzOyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBGMzJMRSwgRjY0TEUgfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ7IGF1ZGlvL3gtdm94d2FyZSwgdm94d2FyZXR5cGU9KGludCkxMTc7IGF1ZGlvL3gtYWRwY20sIGxheW91dD0oc3RyaW5nKWRrNDsgYXVkaW8veC1hZHBjbSwgbGF5b3V0PShzdHJpbmcpZGszOyBhdWRpby94LWFkcGNtLCBsYXlvdXQ9KHN0cmluZylkdmk7IGF1ZGlvL0FNUjsgYXVkaW8vQU1SLVdCOyBhdWRpby94LXNpcmVuOyBhcHBsaWNhdGlvbi94LW9nZy1hdmk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MDgwYmQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbApAQCAtMCwwICsxLDI4IEBACis8cGx1Z2luPgorICA8bmFtZT54aW1hZ2VzcmM8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5YMTEgdmlkZW8gaW5wdXQgcGx1Z2luIHVzaW5nIHN0YW5kYXJkIFhsaWIgY2FsbHM8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vc3lzL3hpbWFnZS8ubGlicy9saWJnc3R4aW1hZ2VzcmMuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0eGltYWdlc3JjLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT54aW1hZ2VzcmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+WGltYWdlIHZpZGVvIHNvdXJjZTwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U291cmNlL1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5DcmVhdGVzIGEgc2NyZWVuc2hvdCB2aWRlbyBzdHJlYW08L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5MdXR6IE11ZWxsZXIgJmx0O2x1dHpAdXNlcnMuc291cmNlZm9yZ2UubmV0Jmd0OywgSmFuIFNjaG1pZHQgJmx0O3RoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20mZ3Q7LCBaYWhlZXIgTWVyYWxpICZsdDt6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZyZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBwaXhlbC1hc3BlY3QtcmF0aW89KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE1NDMzYgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzxwbHVnaW4+CisgIDxuYW1lPnk0bWVuYzwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkVuY29kZXMgYSBZVVYgZnJhbWUgaW50byB0aGUgeXV2NG1wZWcgZm9ybWF0IChtanBlZ3Rvb2xzKTwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QveTRtLy5saWJzL2xpYmdzdHk0bWVuYy5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3R5NG1lbmMuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnk0bWVuYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5ZVVY0TVBFRyB2aWRlbyBlbmNvZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9FbmNvZGVyL1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FbmNvZGVzIGEgWVVWIGZyYW1lIGludG8gdGhlIHl1djRtcGVnIGZvcm1hdCAobWpwZWd0b29scyk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgSVlVViwgSTQyMCwgWTQyQiwgWTQxQiwgWTQ0NCB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC15dXY0bXBlZywgeTRtdmVyc2lvbj0oaW50KTI8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3JhbmRvbS9DaGFuZ2VMb2ctMC44IGIvZG9jcy9yYW5kb20vQ2hhbmdlTG9nLTAuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjNlZjZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9yYW5kb20vQ2hhbmdlTG9nLTAuOApAQCAtMCwwICsxLDE3NTAxIEBACisyMDA1LTA4LTI4ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCisJKiBVcGRhdGVzIGZvciB0d28tYXJnIGluaXQgZnJvbSBHU1RfQk9JTEVSUExBVEUuCisKKwkqIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmMgKGdzdF9zaWduYWxfcHJvY2Vzc29yX2luaXQpOiBVc2UKKwl0aGUgc2Vjb25kIGFyZyBmb3IgdGhlIGNsYXNzLCBiZWNhdXNlIEdfT0JKRUNUX0dFVF9DTEFTUyAoc2VsZikKKwlyZXR1cm5zIHRoZSB3cm9uZyB0aGluZy4KKwkoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfYWRkX3BhZF9mcm9tX3RlbXBsYXRlKTogTWFrZSBwYWRzIG9mIHRoZQorCXJpZ2h0IHR5cGUuCisKKwkqIGV4dC9sYWRzcGEvZ3N0bGFkc3BhLmMgKGdzdF9sYWRzcGFfY2xhc3NfZ2V0X3BhcmFtX3NwZWMpOiBNYWtlCisJd3JpdGFibGUgcGFyYW0gc3BlY3MgR19QQVJBTV9DT05TVFJVQ1Qgc28gZGVmYXVsdCB2YWx1ZXMgd29yay4KKwkoZ3N0X2xhZHNwYV9pbml0KTogVXNlIHRoZSBzZWNvbmQgYXJnIGZvciB0aGUgY2xhc3MuCisKKzIwMDUtMDgtMjYgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9sYWRzcGEvZ3N0bGFkc3BhLmM6IAorCSogZXh0L2xhZHNwYS9nc3RsYWRzcGEuaDogRmluaXNoIHBvcnRpbmcsIHN0aWxsIGRvZXNuJ3Qgd29yayBidXQKKwlpdCBkb2VzIGNvbXBpbGUgYW5kIHJlZ2lzdGVyLiBJIGhhdmUgbW9yZSBmZWF0dXJlcyB0aGFuIHlvdS4KKwkKKwkqIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmg6IAorCSogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYzogVXBkYXRlcywgYnVnIGZpeGVuLgorCisyMDA1LTA4LTI2ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5jOiAoZ3N0X3F1YXJrdHZfaW5pdCksCisJKGdzdF9xdWFya3R2X2NoYW5nZV9zdGF0ZSk6CisJICBkbyBwcm9wZXIgY2xlYW51cC9jcmVhdGlvbiwgZml4ZXMgc3RhdGUgY2hhbmdlcworCisyMDA1LTA4LTI1ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiAoZ3N0X2xldmVsX21lc3NhZ2VfbmV3KToKKwlSZXZlcnQgdW5wb3B1bGFyIGNoYW5nZSBmb3IgR1NUX01FU1NBR0VfU1JDIHRvIEdPYmplY3QuCisKKzIwMDUtMDgtMjUgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9sYWRzcGEvZ3N0bGFkc3BhLmg6IAorCSogZXh0L2xhZHNwYS9nc3RsYWRzcGEuYzogSGFsZndheS1wb3J0ZWQuIERvZXNuJ3QgY29tcGlsZSB5ZXQuCisKKwkqIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmg6CisJKiBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5jOiBOZXcgZmlsZXMsIHRoZSBzdGFydCBvZiBhIGJhc2UKKwljbGFzcyBmb3IgRFNQIGVsZW1lbnRzLgorCisJKiBjb25maWd1cmUuYWM6IFNvcnQgdGhlIGV4dGVybmFsIGxpYnMgY2hlY2tzLCBhZGQgYSBsYWRzcGEgY2hlY2ssCisJb3V0cHV0IHRoZSBsYWRzcGEgbWFrZWZpbGUuCisKKzIwMDUtMDgtMjUgIE93ZW4gRnJhc2VyLUdyZWVuICA8b3dlbkBkaXNjb2JhYmUubmV0PgorCisJKiBnc3QvcmVhbG1lZGlhL3JtZGVtdXguYyAoZ3N0X3JtZGVtdXhfbG9vcCwgZ3N0X3JtZGVtdXhfY2hhaW4pOgorCUZpeGVkIEVPUy4KKwkoZ3N0X3JtZGVtdXhfcGFyc2VfaW5keF9kYXRhLCBnc3Rfcm1kZW11eF9wYXJzZV9pbmR4KTogSGFuZGxlCisJbWFsZm9ybWVkIGluZGV4IGhlYWRlcnMgd2hlcmUgdGhlIHBhY2tldCBzaXplIGlzIGluY29ycmVjdC4KKworMjAwNS0wOC0yNCAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYyAoZ3N0X2R2ZGVtdXhfZGVtdXhfZnJhbWUpOiBTZW5kIG91dCB2YWxpZAorCXNlZ21lbnQgZW5kIHRpbWVzdGFtcHMuCisKKzIwMDUtMDgtMjQgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkgIGxhbWUgYW5kIG1wZWdhdWRpb3BhcnNlIHNlZW0gdG8gd29yaworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X2NsYXNzX2luaXQpLAorCShnc3RfdmlkZW9fYm94X3RyYW5zZm9ybV9jYXBzKSwgKGdzdF92aWRlb19ib3hfZ2V0X3VuaXRfc2l6ZSk6CisJICB1cGRhdGUgZm9yIGJhc2V0cmFuc2Zvcm0gY2hhbmdlcworCisyMDA1LTA4LTI0ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogKGdzdF9sZXZlbF9tZXNzYWdlX25ldyk6CisJICBHU1RfTUVTU0FHRV9TUkMgYmVjYW1lIGEgR09iamVjdAorCisyMDA1LTA4LTIzICBTdGVmYW4gS29zdCAgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuaDoKKwkgIEZpeGVkIGluY2x1ZGUgcGF0aCBvZiBhZGFwdGVyCisKKzIwMDUtMDgtMjMgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzogKGdzdF9zcGVleF9kZWNfY2xhc3NfaW5pdCk6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleGVuY19jbGFzc19pbml0KToKKwlGaXggcHJvcGVydHkgd2FybmluZy4KKworMjAwNS0wOC0yMyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVjLmM6IChnc3RfcnRwYW1yZGVjX2luaXQpLAorCShnc3RfcnRwYW1yZGVjX3Npbmtfc2V0Y2FwcyksIChnc3RfcnRwYW1yZGVjX2NoYWluKToKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZW5jLmM6IChnc3RfcnRwYW1yZW5jX2NsYXNzX2luaXQpLAorCShnc3RfcnRwYW1yZW5jX2luaXQpLCAoZ3N0X3J0cGFtcmVuY19jaGFpbik6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZW5jLmM6IChnc3RfcnRwaDI2M3BlbmNfY2xhc3NfaW5pdCksCisJKGdzdF9ydHBoMjYzcGVuY19mbHVzaCksIChnc3RfcnRwaDI2M3BlbmNfY2hhaW4pOgorCVNtYWxsIHVwZGF0ZXMsIFJGQyByZWZlcmVuY2UgdG8gcGF5bG9hZCBlbmNvZGVycy4KKworMjAwNS0wOC0yMyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L3NwZWV4L01ha2VmaWxlLmFtOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4LmM6IChwbHVnaW5faW5pdCk6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzogKHNwZWV4X2dldF9xdWVyeV90eXBlcyksCisJKGdzdF9zcGVleF9kZWNfaW5pdCksIChzcGVleF9kZWNfc3JjX3F1ZXJ5KSwgKHNwZWV4X2RlY19zcmNfZXZlbnQpLAorCShzcGVleF9kZWNfZXZlbnQpLCAoc3BlZXhfZGVjX2NoYWluKToKKwkgIFBvcnQgc3BlZXhkZWMuIExlYWRzIHRvIHNvbWUgdW5mYW1pbGlhciB3YXJuaW5ncyBvbiBjb25zb2xlLAorCSAgYnV0IHdvcmtzIG90aGVyd2lzZS4KKworMjAwNS0wOC0yMyAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKworCSogc3lzL29zcy9nc3Rvc3NzcmMuYyAoZ3N0X29zc19zcmNfb3Blbik6IFNldCB0aGUgZGV2aWNlLW5hbWUKKwlwcm9wZXJ0eSBhZnRlciBvcGVuaW5nIHRoZSBtaXhlci4KKworCSogc3lzL29zcy9nc3Rvc3NzcmMuYzogCisJKiBzeXMvb3NzL2dzdG9zc3NyYy5oOiBFYXN5IHRvIGltcGxlbWVudCBhIG1peGVyLCBlaC4uLgorCisJKiBzeXMvb3NzL2dzdG9zc21peGVyZWxlbWVudC5oOgorCSogc3lzL29zcy9nc3Rvc3NtaXhlcmVsZW1lbnQuYzogQWRkZWQgbWl4ZXIgZWxlbWVudCBsaWtlCisJYWxzYW1peGVyLgorCisJKiBzeXMvb3NzL01ha2VmaWxlLmFtOiAKKwkqIHN5cy9vc3MvZ3N0b3NzYXVkaW8uYzogUmVnaXN0ZXIgdGhlIG9zc21peGVyIGVsZW1lbnQuCisJCisJKiBzeXMvb3NzL2dzdG9zc21peGVyLmg6CisJKiBzeXMvb3NzL2dzdG9zc21peGVyLmM6IFJlZmFjdG9yZWQgdG8gYmUgbW9yZSBsaWtlIGFsc2FtaXhlci4KKworCSogc3lzL29zcy9nc3Rvc3NtaXhlcnRyYWNrLmg6CisJKiBzeXMvb3NzL2dzdG9zc21peGVydHJhY2suYzogU3BsaXQgb3V0IGZyb20gZ3N0b3NzbWl4ZXIuW2NoXSwKKwlsaWtlIGdzdGFsc2FtaXhlci4KKworCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiBXaGVyZSBiZWZvcmUgd2UgdXNlZCBhIGdzdG9zc2VsZW1lbnQKKwlvYmplY3QgYXMgYSBoZWxwZXIgbGlicmFyeSwgbm93IGp1c3QgY2FsbCBmdW5jdGlvbnMgZnJvbQorCWdzdG9zc2hlbHBlci4KKworCSogc3lzL29zcy9nc3Rvc3NoZWxwZXIuaDoKKwkqIHN5cy9vc3MvZ3N0b3NzaGVscGVyLmM6IE1hZGUgYSByZWFsIGxpYnJhcnkuIFJlbW92ZWQKKwlwcm9wZXJ0eXByb2JlIGZvciBub3csIHNob3VsZCBhZGQgaXQgYmFjayBsYXRlci4KKwkKKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5oOgorCSogc3lzL29zcy9nc3Rvc3NlbGVtZW50LmM6IFJlbW92ZWQsIHdlIGRvbid0IGhhdmUgYSBzaGFyZWQgYmFzZQorCWNsYXNzLgorCQorCSogc3lzL29zcy9nc3Rvc3NoZWxwZXIuYyAoZ3N0X29zc19oZWxwZXJfcHJvYmVfY2Fwcyk6IFNlYXJjaAorCWhpZ2hlci10by1sb3dlciwgbWFrZXMgMTYgYml0IGFwcGVhciBlYXJsaWVyIGluIHRoZSBjYXBzLCB3aGljaAorCW1ha2VzIGl0IHByZWZlcnJlZC4KKworCSogc3lzL29zcy9nc3Rvc3NzcmMuaDogCisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jOiBUb3RhbGx5IHBvcnRlZCwgZHVkZS4KKworCSogc3lzL29zcy9NYWtlZmlsZS5hbToKKwkqIHN5cy9vc3MvZ3N0b3NzYXVkaW8uYzogQWRkIG9zc3NyYy4KKwkKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiBXZSBkbyBuYXRpdmUgYnl0ZSBvcmRlci4KKworMjAwNS0wOC0yMyAgT3dlbiBGcmFzZXItR3JlZW4gIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CisKKwkqIGdzdC9yZWFsbWVkaWEvcm1kZW11eC5jIChnc3Rfcm1kZW11eF9zcmNfZXZlbnQpOiBGaXhlZCBidWcKKwljYXVzaW5nIGV2ZW50cyB0byBiZSBwYXNzZWQgd3Jvbmcgd2F5LgorCShnc3Rfcm1kZW11eF9wYXJzZV9wYWNrZXQpOiBBdm9pZCBhY2NpZGVudGFsbHkgc2tpcHBpbmcgYXVkaW8uCisKKzIwMDUtMDgtMjIgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX2luaXQpLAorCShnc3RfaWQzX3RhZ19zaW5rX2V2ZW50KSwgKGdzdF9pZDNfdGFnX2RvX2NhcHNfbmVnbyksCisJKGdzdF9pZDNfdGFnX2NoYWluKSwgKGdzdF9pZDNfdGFnX2NoYW5nZV9zdGF0ZSksIChwbHVnaW5faW5pdCk6CisJICBXb3JrcyBhIGJpdCBiZXR0ZXIgbm93LCBidXQgc3RpbGwgbmVlZHMgYSByZXdyaXRlIHRvIHVzZQorCSAgZ2V0X3JhbmdlIGluc3RlYWQgb2YgdGhpcyBzZWVraW5nIG5hc3RpbmVzcy4KKworMjAwNS0wOC0yMiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L2ZsYWMvTWFrZWZpbGUuYW06CisJKiBleHQvZmxhYy9nc3RmbGFjLmM6IChwbHVnaW5faW5pdCk6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChmbGFjZGVjX2dldF90eXBlKSwgKGdzdF9mbGFjZGVjX2luaXQpLAorCShnc3RfZmxhY2RlY191cGRhdGVfbWV0YWRhdGEpLCAoZ3N0X2ZsYWNkZWNfc2VlayksCisJKGdzdF9mbGFjZGVjX3RlbGwpLCAoZ3N0X2ZsYWNkZWNfbGVuZ3RoKSwgKGdzdF9mbGFjZGVjX3JlYWQpLAorCShnc3RfZmxhY2RlY193cml0ZSksIChnc3RfZmxhY2RlY19sb29wKSwKKwkoZ3N0X2ZsYWNkZWNfZ2V0X3NyY19xdWVyeV90eXBlcyksIChnc3RfZmxhY2RlY19zcmNfcXVlcnkpLAorCShnc3RfZmxhY2RlY19zcmNfZXZlbnQpLCAoZ3N0X2ZsYWNkZWNfc2lua19hY3RpdmF0ZSksCisJKGdzdF9mbGFjZGVjX3NpbmtfYWN0aXZhdGVfcHVsbCksIChnc3RfZmxhY2RlY19jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oOgorCSAgUG9ydCBmbGFjZGVjIChzZWVraW5nIGlzIHN0aWxsIHNsb3cnaXNoKS4KKworMjAwNS0wOC0yMiAgT3dlbiBGcmFzZXItR3JlZW4gIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CisKKwkqIGdzdC9yZWFsbWVkaWEvcm1kZW11eC5jOiAKKwkoZ3N0X3JtZGVtdXhfcGVyZm9ybV9zZWVrLCBnc3Rfcm1kZW11eF9wYXJzZV9wYWNrZXQpOiAKKwlTZWVraW5nIGltcHJvdmVtZW50cy4KKworMjAwNS0wOC0xOSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChnc3RfbXVsdGl1ZHBzaW5rX2NsYXNzX2luaXQpOgorCVJlbW92ZSBnZXRfdGltZSBjb2RlIHRoYXQgaXMgYm90aCB3cm9uZyBhbmQgdW5uZWVkZWQuCisKKzIwMDUtMDgtMTkgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZW5jLmM6IChnc3RfcnRwaDI2M3BlbmNfY2xhc3NfaW5pdCksCisJKGdzdF9ydHBoMjYzcGVuY19mbHVzaCksIChnc3RfcnRwaDI2M3BlbmNfY2hhaW4pLAorCShnc3RfcnRwaDI2M3BlbmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBoMjYzcGVuY19nZXRfcHJvcGVydHkpOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGVuYy5oOgorCUFkZGVkIGNvbmZpZ3VyYWJsZSBwdCBhbmQgc3NyYywgdG8gYmUgbWVyZ2VkIGluIHRoZSBjYXBzIG9yCisJYSBiYXNlIGNsYXNzLi4uCisKKzIwMDUtMDgtMTkgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVjLmM6IChnc3RfcnRwaDI2M3BkZWNfaW5pdCksCisJKGdzdF9ydHBoMjYzcGRlY19jaGFpbik6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZW5jLmM6IChnc3RfcnRwaDI2M3BlbmNfY2xhc3NfaW5pdCksCisJKGdzdF9ydHBoMjYzcGVuY19mbHVzaCksIChnc3RfcnRwaDI2M3BlbmNfY2hhaW4pOgorCVNvbWUgY2xlYW51cHMgaW4gdGhlIGgyNjNwIChkZSlwYXlsb2FkZXJzLgorCisyMDA1LTA4LTE5ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L2Ftcm5iL2Ftcm5iZGVjLmM6CisJKiBleHQvYW1ybmIvYW1ybmJlbmMuYzogKGdzdF9hbXJuYmVuY19zZXRjYXBzKToKKwkqIGV4dC9hbXJuYi9hbXJuYnBhcnNlLmM6CisJVXBkYXRlIGNhcHMgd2l0aCBhdWRpby9BTVIuCisJCisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlYy5jOiAoZ3N0X3J0cGFtcmRlY19pbml0KSwKKwkoZ3N0X3J0cGFtcmRlY19zaW5rX3NldGNhcHMpLCAoZ3N0X3J0cGFtcmRlY19jaGFpbiksCisJKGdzdF9ydHBhbXJkZWNfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVjLmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmVuYy5jOiAoZ3N0X3J0cGFtcmVuY19jbGFzc19pbml0KSwKKwkoZ3N0X3J0cGFtcmVuY19pbml0KSwgKGdzdF9ydHBhbXJlbmNfY2hhaW4pOgorCURvbnQgc2V0IEZUIGhlYWRlcnMgdHdpY2UsIGl0IHdhcyBhbHJlYWR5IGluIHRoZSBlbmNvZGVkCisJYml0c3RyZWFtLgorCQorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc2VuZCksIChnc3RfcnRzcHNyY19vcGVuKSwKKwkoZ3N0X3J0c3BzcmNfY2xvc2UpLCAoZ3N0X3J0c3BzcmNfcGxheSk6CisJKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOiAocGFyc2VfbGluZSk6CisJQ2xlYW51cHMKKwkKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2NsYXNzX2luaXQpLAorCShnc3RfdWRwc3JjX2NyZWF0ZSksIChnc3RfdWRwc3JjX3NldF9wcm9wZXJ0eSksCisJKGdzdF91ZHBzcmNfZ2V0X3Byb3BlcnR5KToKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmg6CisJQWRkZWQgY2FwcyBwcm9wZXJ0eSwgd2UgbmVlZCB0aGlzIHNvb24gdG8gdHlwZSB0aGUgYnVmZmVycy4KKworMjAwNS0wOC0xOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVjLmM6IChnc3RfcnRwYW1yZGVjX2luaXQpLAorCShnc3RfcnRwYW1yZGVjX2NoYWluKToKKwlGaXggdXAgYW1yIGRlcGF5bG9hZGVyIGEgYml0LgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zZW5kKSwgKGdzdF9ydHNwc3JjX29wZW4pLAorCShnc3RfcnRzcHNyY19jbG9zZSksIChnc3RfcnRzcHNyY19wbGF5KToKKwlMb29rIGZvciBvcHRpb25zIHJlc3VsdCBpbiBQdWJsaWMgYW5kIEFsbG93IGhlYWRlciBmaWVsZHMuLgorCXNwZWMgc2F5cyBBbGxvdyBidXQgc29tZSBzZXJ2ZXJzIHJldHVybiBQdWJsaWMuLi4KKworMjAwNS0wOC0xOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZW5jLmM6IChnc3RfcnRwYW1yZW5jX2NsYXNzX2luaXQpLAorCShnc3RfcnRwYW1yZW5jX2luaXQpLCAoZ3N0X3J0cGFtcmVuY19jaGFpbiksCisJKGdzdF9ydHBhbXJlbmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBhbXJlbmNfZ2V0X3Byb3BlcnR5KToKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZW5jLmg6CisJQWRkZWQgcGF5bG9hZF90eXBlIGFuZCBzc3JjIHByb3BlcnRpZXMgdG8gdGhlIHBheWxvYWRlci4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc2VuZCksIChnc3RfcnRzcHNyY19vcGVuKSwKKwkoZ3N0X3J0c3BzcmNfY2xvc2UpLCAoZ3N0X3J0c3BzcmNfcGxheSk6CisJT3B0aW9ucyBuZWVkIHRvIGJlIHN0cmlwcGVkIGFuZCBhcmUgaW4gdGhlIFB1YmxpYyBoZWFkZXIgZmllbGQuCisKKwkqIGdzdC9ydHNwL3J0c3B1cmwuYzogKHJ0c3BfdXJsX3BhcnNlKToKKwlGaXggdXJsIC8gcGFyc2luZy4uLgorCisKKzIwMDUtMDgtMTggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVjLmM6IChnc3RfcnRwYW1yZGVjX2dldF90eXBlKSwKKwkoZ3N0X3J0cGFtcmRlY19iYXNlX2luaXQpLCAoZ3N0X3J0cGFtcmRlY19jbGFzc19pbml0KSwKKwkoZ3N0X3J0cGFtcmRlY19pbml0KSwgKGdzdF9ydHBhbXJkZWNfY2hhaW4pLAorCShnc3RfcnRwYW1yZGVjX3NldF9wcm9wZXJ0eSksIChnc3RfcnRwYW1yZGVjX2dldF9wcm9wZXJ0eSksCisJKGdzdF9ydHBhbXJkZWNfY2hhbmdlX3N0YXRlKSwgKGdzdF9ydHBhbXJkZWNfcGx1Z2luX2luaXQpOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZWMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZW5jLmM6IChnc3RfcnRwYW1yZW5jX2dldF90eXBlKSwKKwkoZ3N0X3J0cGFtcmVuY19iYXNlX2luaXQpLCAoZ3N0X3J0cGFtcmVuY19jbGFzc19pbml0KSwKKwkoZ3N0X3J0cGFtcmVuY19pbml0KSwgKGdzdF9ydHBhbXJlbmNfY2hhaW4pLAorCShnc3RfcnRwYW1yZW5jX3NldF9wcm9wZXJ0eSksIChnc3RfcnRwYW1yZW5jX2dldF9wcm9wZXJ0eSksCisJKGdzdF9ydHBhbXJlbmNfY2hhbmdlX3N0YXRlKSwgKGdzdF9ydHBhbXJlbmNfcGx1Z2luX2luaXQpOgorCSogZ3N0L3J0cC9nc3RydHBhbXJlbmMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZW5jLmM6IChnc3RfcnRwbXBhZW5jX2NsYXNzX2luaXQpLAorCShnc3RfcnRwbXBhZW5jX2ZsdXNoKSwgKGdzdF9ydHBtcGFlbmNfY2hhaW4pOgorCUFkZGVkIHZlcnkgc2ltcGxpc3RpYyBhbXIgcGF5bG9hZGVyLiBkZXBheWxvYWRlciBkb2VzIG5vdAorCXdvcmsgeWV0LgorCisyMDA1LTA4LTE4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc2VuZCksIChnc3RfcnRzcHNyY19vcGVuKSwKKwkoZ3N0X3J0c3BzcmNfY2xvc2UpLCAoZ3N0X3J0c3BzcmNfcGxheSksIChnc3RfcnRzcHNyY19wYXVzZSksCisJKGdzdF9ydHNwc3JjX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJKiBnc3QvcnRzcC9ydHNwZGVmcy5jOiAocnRzcF9tZXRob2RfYXNfdGV4dCksIChydHNwX2ZpbmRfbWV0aG9kKToKKwkqIGdzdC9ydHNwL3J0c3BkZWZzLmg6CisJKiBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0LmM6IChydHNwX3RyYW5zcG9ydF9wYXJzZSk6CisJSGFuZGxlIFJUU1AgZGVmYXVsdHMgYmV0dGVyLgorCUlzc3VlIE9QVElPTlMgcmVxdWVzdCB0byBmaWd1cmUgb3V0IHdoYXQgd2UgYXJlIGFsbG93ZWQgdG8gZG8uCisJTWFrZSB0aGUgbWV0aG9kcyBhIGJpdGZpZWxkIHNvIHdlIGNhbiBlYXNpbHkgY29sbGVjdCBzdXBwb3J0ZWQgCisJb3B0aW9ucy4KKwlGaXggcnRzcF9maW5kX21ldGhvZC4KKwlEbyBwcm9wZXIgUlRTUCBjb25uZWN0aW9uIHNodXRkb3duLgorCisyMDA1LTA4LTE4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLWNvbW1vbi5oOgorCSogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZW5jLmg6CisJKiBnc3QvcnRwL2dzdHJ0cGRlYy5jOiAoZ3N0X3J0cGRlY19nZXRfdHlwZSksCisJKGdzdF9ydHBkZWNfY2xhc3NfaW5pdCksIChnc3RfcnRwZGVjX2NoYWluX3J0cCksCisJKGdzdF9ydHBkZWNfY2hhaW5fcnRjcCksIChnc3RfcnRwZGVjX2NoYW5nZV9zdGF0ZSksCisJKGdzdF9ydHBkZWNfcGx1Z2luX2luaXQpOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlYy5jOiAoZ3N0X3J0cGgyNjNwZGVjX2dldF90eXBlKSwKKwkoZ3N0X3J0cGgyNjNwZGVjX2Jhc2VfaW5pdCksIChnc3RfcnRwaDI2M3BkZWNfY2xhc3NfaW5pdCksCisJKGdzdF9ydHBoMjYzcGRlY19pbml0KSwgKGdzdF9ydHBoMjYzcGRlY19jaGFpbiksCisJKGdzdF9ydHBoMjYzcGRlY19zZXRfcHJvcGVydHkpLCAoZ3N0X3J0cGgyNjNwZGVjX2dldF9wcm9wZXJ0eSksCisJKGdzdF9ydHBoMjYzcGRlY19jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3J0cGgyNjNwZGVjX3BsdWdpbl9pbml0KToKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZWMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BlbmMuYzogKGdzdF9ydHBoMjYzcGVuY19nZXRfdHlwZSksCisJKGdzdF9ydHBoMjYzcGVuY19iYXNlX2luaXQpLCAoZ3N0X3J0cGgyNjNwZW5jX2NsYXNzX2luaXQpLAorCShnc3RfcnRwaDI2M3BlbmNfaW5pdCksIChnc3RfcnRwaDI2M3BlbmNfZmx1c2gpLAorCShnc3RfcnRwaDI2M3BlbmNfY2hhaW4pLCAoZ3N0X3J0cGgyNjNwZW5jX3NldF9wcm9wZXJ0eSksCisJKGdzdF9ydHBoMjYzcGVuY19nZXRfcHJvcGVydHkpLCAoZ3N0X3J0cGgyNjNwZW5jX2NoYW5nZV9zdGF0ZSksCisJKGdzdF9ydHBoMjYzcGVuY19wbHVnaW5faW5pdCk6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZW5jLmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlYy5jOiAoZ3N0X3J0cG1wYWRlY19nZXRfdHlwZSksCisJKGdzdF9ydHBtcGFkZWNfYmFzZV9pbml0KSwgKGdzdF9ydHBtcGFkZWNfY2xhc3NfaW5pdCksCisJKGdzdF9ydHBtcGFkZWNfaW5pdCksIChnc3RfcnRwbXBhZGVjX2NoYWluKSwKKwkoZ3N0X3J0cG1wYWRlY19zZXRfcHJvcGVydHkpLCAoZ3N0X3J0cG1wYWRlY19nZXRfcHJvcGVydHkpLAorCShnc3RfcnRwbXBhZGVjX2NoYW5nZV9zdGF0ZSksIChnc3RfcnRwbXBhZGVjX3BsdWdpbl9pbml0KToKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVjLmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWVuYy5jOiAoZ3N0X3J0cG1wYWVuY19nZXRfdHlwZSksCisJKGdzdF9ydHBtcGFlbmNfYmFzZV9pbml0KSwgKGdzdF9ydHBtcGFlbmNfY2xhc3NfaW5pdCksCisJKGdzdF9ydHBtcGFlbmNfaW5pdCksIChnc3RfcnRwbXBhZW5jX2ZsdXNoKSwgKGdzdF9ydHBtcGFlbmNfY2hhaW4pLAorCShnc3RfcnRwbXBhZW5jX3NldF9wcm9wZXJ0eSksIChnc3RfcnRwbXBhZW5jX2dldF9wcm9wZXJ0eSksCisJKGdzdF9ydHBtcGFlbmNfY2hhbmdlX3N0YXRlKSwgKGdzdF9ydHBtcGFlbmNfcGx1Z2luX2luaXQpOgorCSogZ3N0L3J0cC9nc3RydHBtcGFlbmMuaDoKKwkqIGdzdC9ydHAvcnRwLXBhY2tldC5jOgorCSogZ3N0L3J0cC9ydHAtcGFja2V0Lmg6CisJUmVtb3ZlIG9sZCBjb2RlIHRoYXQgaXMgbm93IGluIGdzdC1saWJzL2dzdC9ydHAvLgorCUFkZGVkIHNvbWUgcGF5bG9hZC9kZXBheWxvYWRlcnMuCisKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5jOiAoZ3N0X3VkcHNpbmtfY2xhc3NfaW5pdCk6CisJRml4IHBvcnQgbnVtYmVyIHJhbmdlLgorCisyMDA1LTA4LTE3ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCUFkZGVkIG1wZWdhdWRpb3BhcnNlCisKKwkqIGV4dC9sYW1lL2dzdGxhbWUuYzogKGdzdF9sYW1lX3NyY19nZXRjYXBzKSwKKwkoZ3N0X2xhbWVfc3JjX3NldGNhcHMpLCAoZ3N0X2xhbWVfc2lua19zZXRjYXBzKSwKKwkoZ3N0X2xhbWVfc2lua19ldmVudCksIChnc3RfbGFtZV9jaGFpbik6CisJU29tZSBjbGVhbnVwcy4KKwlGaXggbWVtbGVhay4KKworCSogZ3N0L21wZWdhdWRpb3BhcnNlL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKGdzdF9tcDNwYXJzZV9jbGFzc19pbml0KSwgKGdzdF9tcDNwYXJzZV9pbml0KSwKKwkoZ3N0X21wM3BhcnNlX2NoYWluKSwgKGdzdF9tcDNwYXJzZV9jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L21wZWdhdWRpb3BhcnNlL2dzdG1wZWdhdWRpb3BhcnNlLmg6CisJUG9ydGVkIG1wZWdhdWRpb3BhcnNlCisKKzIwMDUtMDgtMTcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19vcGVuKSwgKGdzdF9ydHNwc3JjX3BsYXkpOgorCVN1cHBvcnQgYWJzb2x1dGUgY29udHJvbCB1cmxzIHRvby4KKworMjAwNS0wOC0xNiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0pLAorCShnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXIpOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3F0ZGVtdXhfYWRkX3N0cmVhbSksIChxdGRlbXV4X3BhcnNlX3RyZWUpOgorCSAgVW5jb21tZW50IG1ldGFkYXRhIGFuZCBjb2RlYy1uYW1lIGhhbmRsaW5nLgorCisyMDA1LTA4LTE2ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L2Ftcm5iL2Ftcm5icGFyc2UuYzogKGdzdF9hbXJuYnBhcnNlX3JlYWRfaGVhZGVyKToKKwlGaXggY29tcGlsZSB3YXJuaW5nLgorCisJKiBleHQvbGFtZS9nc3RsYW1lLmM6IChnc3RfbGFtZV9jbGFzc19pbml0KSwKKwkoZ3N0X2xhbWVfc3JjX2dldGNhcHMpLCAoZ3N0X2xhbWVfc3JjX3NldGNhcHMpLAorCShnc3RfbGFtZV9zaW5rX3NldGNhcHMpLCAoZ3N0X2xhbWVfaW5pdCksIChnc3RfbGFtZV9zaW5rX2V2ZW50KSwKKwkoZ3N0X2xhbWVfY2hhaW4pLCAoZ3N0X2xhbWVfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9sYW1lL2dzdGxhbWUuaDoKKwlQb3J0IGxhbWUgcGx1Z2luCisKKzIwMDUtMDgtMTYgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmMgKGdzdF9kdmRlbXV4X2ZsdXNoKTogVXNlIGdzdF9hZGFwdGVyX3Rha2Ugc28KKwl3ZSBoYXZlIG91ciBvd24gY29weSBvZiB0aGUgZGF0YS4KKwkoZ3N0X2R2ZGVtdXhfZGVtdXhfdmlkZW8pOiBTZXQgdGhlIHRha2UoKSBkYXRhIGFzIG1hbGxvY19kYXRhIHNvCisJaXQgd2lsbCBnZXQgZnJlZWQgbGF0ZXIuCisKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jIChnc3RfZHYxMzk0c3JjX2lzb19yZWNlaXZlKTogTm90ZQorCWxpY2Vuc2UgaW5mbyBpbiB0aGUgc291cmNlIGNvZGUgLS0gd2FzIG9ubHkgaW4gdGhlIGNvbW1pdCBsb2cKKwliZWZvcmUuCisKKwkqIGV4dC9kdi9nc3RkdmRlYy5oOgorCSogZXh0L2R2L2dzdGR2ZGVjLmM6IE9ubHkgZGVjb2RlcyBzeXN0ZW1zdHJlYW09RkFMU0UgZHYgdmlkZW8gLS0KKwlvbGQgcGlwZWxpbmVzIHVzaW5nIGR2ZGVjIHNob3VsZCBwcm9iYWJseSBoYXZlIGEgZHZkZW11eCBmaXJzdC4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguaDoKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6IFNwbGl0IG91dCBmcm9tIGR2ZGVjLCBjaHVua3MgdGhlIGluY29taW5nCisJc3lzdGVtc3RyZWFtPVRSVUUgZGF0YSBpbnRvIGZyYW1lcywgc2V0cyBjYXBzIGRhdGEsIGFuZCBzcGl0cyBvdXQKKwlQQ00gYXVkaW8gaW4gYWRkaXRpb24gdG8gc3lzdGVtc3RyZWFtPUZBTFNFIHZpZGVvIGZyYW1lcy4gT3BlcmF0ZXMKKwlpbiBjaGFpbiBtb2RlIG9ubHkgZm9yIG5vdzsgc2hvdWxkIG1ha2UgYSBnZXRyYW5nZSB2ZXJzaW9uIGFzCisJd2VsbC4KKworCSogZXh0L2R2L2dzdGR2LmM6IE5ldyBmaWxlLCByZWdpc3RlcnMgdGhlIGxpYmdzdGR2IHBsdWdpbi4KKworCSogZXh0L2R2L01ha2VmaWxlLmFtOiBMaWJyYXJ5IG5hbWUgY2hhbmdlZCB0byBsaWJnc3Rkdi4gU3BsaXQKKwlkdmRlYyBpbnRvIGR2ZGVtdXggYW5kIGR2ZGVjLgorCisyMDA1LTA4LTE2ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZmFhZC9nc3RmYWFkLmM6IChnc3RfZmFhZF9ldmVudCksIChnc3RfZmFhZF9jaGFpbik6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX2hlYWRlcik6CisJICBIYW5kbGUgX3B1c2goKSByZXR1cm4gdmFsdWVzLgorCisyMDA1LTA4LTE1ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZmFhZC9nc3RmYWFkLmM6IChnc3RfZmFhZF9ldmVudCk6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX2hlYWRlcik6CisJICBGaXggZGVidWcuCisKKzIwMDUtMDgtMTUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2VfdHJhayksCisJKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6CisJICBGb3J3YXJkcG9ydCBmcm9tIDAuOCB0byBpbXBsZW1lbnQgUkxFLgorCisyMDA1LTA4LTE1ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3J0c3AvUkVBRE1FOgorCUFkZGVkIHJ0c3Agc2VydmVyIGltcGxlbWVudGF0aW9uIGRvY3MuCisKKzIwMDUtMDgtMTQgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzoKKwkgIGFhbGliIGlzIExHUEwsIHNvIHRoaXMgcGx1Z2luIGNhbiBiZSBMR1BMCisJKiBleHQvYXJ0cy9nc3RfYXJ0cy5jOiAocGx1Z2luX2luaXQpOgorCSAgcmVuYW1lLCB3ZSBkb24ndCBsaWtlIHVuZGVyc2NvcmVzCisJKiBleHQvYXVkaW9maWxlL2dzdGFmLmM6CisJKiBleHQvc25kZmlsZS9nc3RzZi5jOgorCSAgcmVuYW1lLCB3ZSBsaWtlIGEgZGVzY3JpcHRpdmUgcGx1Z2luIG5hbWUKKwkqIGV4dC9nY29uZi9nc3RnY29uZmVsZW1lbnRzLmM6CisJICBjaGFuZ2UgZGVzY3JpcHRpb24gYSBsaXR0bGUKKwkqIGV4dC9tdXNpY2JyYWluei9nc3R0cm0uYzoKKwkgIG11c2ljYnJhaW56IGlzIExHUEwsIHNvIHBsdWdpbiBjYW4gYmUgTEdQTAorCSogZXh0L3JhdzEzOTQvZ3N0MTM5NC5jOgorCSAgcmVuYW1lLCB3ZSBsaWtlIGFsbC1kaWdpdCBuYW1lcworCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkqIGdzdC9mZHNyYy9nc3RmZHNyYy5jOgorCSogZ3N0L211bHRpZmlsZXNpbmsvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgcmVuYW1lCisJKiBnc3QvdmlydHVhbGR1Yi9nc3R2aXJ0dWFsZHViLmM6CisJICB1c2UgR1NUX1BMVUdJTl9ERUZJTkUKKwkqIHN5cy9keHIzL2R4cjNpbml0LmM6CisJICBvbmx5IHVzZXMgc3lzdGVtIGhlYWRlcnMsIGFuZCBjb2RlIGlzIExHUEwsIHNvIHBsdWdpbiBpcyBMR1BMCisKKzIwMDUtMDgtMTMgIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZXh0L21hZC9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdmkvTWFrZWZpbGUuYW06CisJKiBnc3QvZWZmZWN0di9NYWtlZmlsZS5hbToKKwkqIGdzdC91ZHAvTWFrZWZpbGUuYW06CisJKiBnc3Qvd2F2cGFyc2UvTWFrZWZpbGUuYW06CisJICBVc2UgLWxnc3Rmb28tQEdTVF9NQUpPUk1JTk9SQCBpbnN0ZWFkIG9mIC1sZ3N0Zm9vLTAuOQorCisyMDA1LTA4LTEyICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogKGdzdF9qcGVnX2RlY19kZWNvZGVfaW5kaXJlY3QpLAorCShnc3RfanBlZ19kZWNfZGVjb2RlX2RpcmVjdCksIChnc3RfanBlZ19kZWNfY2hhaW4pOgorCSAgRml4IGRlY29kaW5nIG9mIHBpY3R1cmVzIHdpdGggY2VydGFpbiB1bmV2ZW4gb3IgdW5hbGlnbmVkCisJICB3aWR0aHMgd2hlcmUganBlZ2xpYiBuZWVkcyBtb3JlIGhvcml6b250YWwgcGFkZGluZyB0aGFuIG91cgorCSAgSTQyMCBidWZmZXJzIHByb3ZpZGUsIHJlc3VsdGluZyBpbiBibG9ja3kgYXJ0aWZhY3RzIGF0IHRoZQorCSAgbGVmdCBzaWRlIG9mIHRoZSBwaWN0dXJlICgjMTY0MTc2KS4gCisJICBBbHNvIG1ha2UgdXNlIG9mIG91ciBzaGlueSBuZXcgR1NUX1JPVU5EX04oKSBtYWNyb3MuCisKKzIwMDUtMDgtMTEgIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2pwZWdfZGVjX2luaXQpLCAoZ3N0X2pwZWdfZGVjX2NoYWluKSwKKwkoZ3N0X2pwZWdfZGVjX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmg6CisJICBGaXggY3Jhc2hlcy9pbnZhbGlkIG1lbW9yeSBhY2Nlc3MgZm9yIHBpY3R1cmVzIHRoYXQgaGF2ZSBhIGhlaWdodAorCSAgdGhhdCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAob3IgcmF0aGVyOiB2X3NhbXBfZmFjdG9yICogRENUU0laRSkuCisJICAKKwkgIEFsc28gZml4IHRoZSBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24gZm9yIGRvd253YXJkcyBzdGF0ZSBjaGFuZ2VzCisJICAobmVlZCB0byBjaGFpbiB1cCB0byBwYXJlbnQgYmVmb3JlIGRlc3Ryb3lpbmcgb3VyIHJlc291cmNlcywgdG8gCisJICBtYWtlIHN1cmUgcGFkcyBnZXQgZGVhY3RpdmF0ZWQgYW5kIG91ciBjaGFpbiBmdW5jdGlvbiBpc24ndAorCSAgcnVubmluZyBhbmQgdXNpbmcgdGhvc2UgdmVyeSBzYW1lIHJlc291cmNlcyBpbiBhbm90aGVyIHRocmVhZCkuCisKKwkgIFRoZSBqcGVnIGxpbmUgYnVmZmVyIG9ubHkgbmVlZHMgdG8gYmUgdl9zYW1wX2ZhY3RvcipEQ1RTSVpFIGxpbmVzCisJICBwZXIgcGxhbmUsIG5vdCBwaWN0dXJlX2hlaWdodCBsaW5lczsgYWxsb2NhdGUgdGhhdCBvbiB0aGUgc3RhY2suCisKKzIwMDUtMDgtMTAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMpLAorCShnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpOgorCSAgQWRkIHNvbWUgZml4ZXMgZnJvbSAwLjggYnJhbmNoOiBhbGxvdyAyNC8zMmJwcyBzb25ncyBhbmQKKwkgIGJsb2NrYWxpZ24gc2FtcGxlcyB0byB0aGUgaGVhZGVyLXNwZWNpZmllZCBzaXplLCBpZiBhbnkKKwkgICgjMzExMDcwKTsgZXJyb3Igb3V0IG9uIGNoYW5uZWxzPT0wIG9yIGJpdHJhdGU9PTAgCisJICAoIzMwOTA0MywgIzMwNDU4OCkuCisKKzIwMDUtMDgtMTAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiAoZ3N0X2xldmVsX2luaXQpLCAoZ3N0X2xldmVsX3NldF9jYXBzKSwKKwkoZ3N0X2xldmVsX3RyYW5zZm9ybSk6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuaDoKKwkgIHJlbW92ZSB1bnVzZWQgTVMgc3RydWN0IG1lbWJlcgorCSAgZG9uJ3QgcmVzZXQgdGhlIENTIHZhbHVlcyBmb3IgY2hhbm5lbHMgb24gZXZlcnkgX2NoYWluLCBzbyB0aGF0CisJICBsZXZlbCBhY3R1YWxseSBjb3JyZWN0bHkgY2FsY3VsYXRlcyB0aGUgUk1TIHZhbHVlLiAgc2lnaC4KKwkgIGNhbGN1bGF0ZSBSTVMgdmFsdWVzIGNvcnJlY3RseSBmb3IgcGVhayBhbmQgZGVjYXkgcGVhayBzdW1zOworCSAgYmVmb3JlIHdlIHdlcmUgc2lnbmFsbGluZyB0aGVtIGFzIGlmIHRoZXkgYWxyZWFkeSB3ZXJlIGFtcGxpdHVkZQorCSAgYW5kIG5vdCBwb3dlciB2YWx1ZXMuICBzaWdoLgorCVJlbWluZCBtZSB0byBub3QgdHJ5IGFuZCBwcmV0ZW5kIEknbSB3cml0aW5nIERTUCBjb2RlLgorCisyMDA1LTA4LTEwICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZmFhZC9nc3RmYWFkLmM6IChnc3RfZmFhZF9jbGFzc19pbml0KSwgKGdzdF9mYWFkX3NldGNhcHMpOgorCSAgQWRkIGRlYnVnIGNhdGVnb3J5LCByZW1vdmUgQ2xvc2UoKSBjYWxsIHRoYXQgbWFkZSBpdCBjcmFzaAorCSAgd2hlbmV2ZXIgcmV1c2luZywgcmVuZWdvdGlhdGluZyBvciBhbnl0aGluZzsgQ2xvc2UoKSBhY3R1YWxseQorCSAgZnJlZSgpcyB0aGUgaGFuZGxlIGFuZCBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gUkVBRFktPk5VTEwuCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX2hlYWRlcik6CisJICBBY3R1YWxseSBzZXQgY2FwcyBvbiBidWZmZXIgKGluIGFkZGl0aW9uIHRvIHBhZCksIGFsc28uCisKKzIwMDUtMDgtMTAgIE93ZW4gRnJhc2VyLUdyZWVuICA8b3dlbkBkaXNjb2JhYmUubmV0PgorCisJKiBnc3QvcmVhbG1lZGlhL3JtZGVtdXguYyAoZ3N0X3JtZGVtdXhfc2lua19hY3RpdmF0ZSkgCisJKGdzdF9ybWRlbXV4X3NpbmtfYWN0aXZhdGVfcHVzaCwgZ3N0X3JtZGVtdXhfc2lua19hY3RpdmF0ZV9wdWxsKSAKKwkoZ3N0X3JtZGVtdXhfbG9vcCwgZ3N0X3JtZGVtdXhfc3JjX2V2ZW50KSAKKwkoZ3N0X3JtZGVtdXhfcGVyZm9ybV9zZWVrLCBnc3Rfcm1kZW11eF9zcmNfcXVlcnkpOiBJbXBsZW1lbnRlZAorCXB1c2gtcHVsbCBhbmQgc2Vla2luZy4KKworMjAwNS0wOC0wOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2ZhYWQvZ3N0ZmFhZC5jOiAoZ3N0X2ZhYWRfZXZlbnQpOgorCSAgU2lnbi91bnNpZ24gbWlzbWF0Y2guCisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9jbGFzc19pbml0KSwKKwkoZ3N0X3F0ZGVtdXhfaW5pdCksIChnc3RfcXRkZW11eF9nZXRfc3JjX3F1ZXJ5X3R5cGVzKSwKKwkoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksIChnc3RfcXRkZW11eF9oYW5kbGVfc3JjX2V2ZW50KSwKKwkocGx1Z2luX2luaXQpLCAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQpLAorCShnc3RfcXRkZW11eF9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3F0ZGVtdXhfbG9vcF9oZWFkZXIpLAorCShxdGRlbXV4X3NpbmtfYWN0aXZhdGUpLCAocXRkZW11eF9zaW5rX2FjdGl2YXRlX3B1bGwpLAorCShnc3RfcXRkZW11eF9hZGRfc3RyZWFtKSwgKHF0ZGVtdXhfcGFyc2UpLCAocXRkZW11eF9wYXJzZV90cmVlKSwKKwkocXRkZW11eF9wYXJzZV90cmFrKSwgKHF0ZGVtdXhfdmlkZW9fY2FwcyksIChxdGRlbXV4X2F1ZGlvX2NhcHMpOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSAgSGFsZi1hc3NlZCBwb3J0IChoZXksIGl0IHdvcmtzKS4KKworMjAwNS0wOC0wOSAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXIpOgorCSAgRml4IEFWSSBoZWFkZXIgcGFyc2luZzogYWRkIG1pc3NpbmcgYnJlYWsgc3RhdGVtZW50IGFmdGVyCisJICBHU1RfUklGRl9JTkZPX0xJU1QgcGFyc2luZyBjb2RlOyBnc3RfcmlmZl9yZWFkX2NodW5rKCkgaGFzCisJICBhbHJlYWR5IGFkdmFuY2VkIHRoZSBhdmktPm9mZnNldCwgbm8gbmVlZCB0byBkbyBpdCB0d2ljZQorCSAgKGZpeGVzIE1vdmllT2ZNb3ZpZXMuYXZpKS4KKworMjAwNS0wOC0wOSAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6IChnc3RfanBlZ19kZWNfaW5pdCksCisJKGdzdF9qcGVnX2RlY19zZXRjYXBzKSwgKGdzdF9qcGVnX2RlY19jaGFpbiksCisJKGdzdF9qcGVnX2RlY19jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAgTWFrZSBtanBlZyBhY3R1YWxseSB3b3JrIGFuZCBza2lwIGpwZWcgZGF0YSBwYXJzaW5nIGlmIHdlCisJICBrbm93IHRoYXQgdGhlIGlucHV0IGlzIHBhY2tldGl6ZWQgKGllLiBlYWNoIGlucHV0IGJ1ZmZlcgorCSAgaXMgZXhhY3RseSBvbmUganBlZyBmcmFtZSkuCisKKzIwMDUtMDgtMDkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX2luaXQpLCAoZ3N0X21hZF9jaGFpbik6CisJICBJdCdkIGJlIG5pY2UgaWYgSSBjb3VsZCBsaXN0ZW4gdG8gbXkgbXAzIGZpbGVzLCBzbyBzZW5kIG91dCBhbgorCSAgaW5pdGlhbCBkaXNjb250LCBhcyB0aGUgc2luayBhcHBhcmVudGx5IHdhbnRzLgorCisyMDA1LTA4LTA5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpLAorCShnc3RfYXZpX2RlbXV4X2hhbmRsZV9zZWVrKToKKwkgIEZpeCBzZWVraW5nIChvciwgd2VsbCwgZml4IHRocmVhZGluZyBpc3N1ZSB3aGVyZSBhIHZhcmlhYmxlIHdhcworCSAgc2V0IGJlZm9yZSBhIGxvY2sgd2FzIHRha2VuIGFuZCB3YXMgYWxyZWFkeSB1bnNldCBiZWZvcmUgdGhhdAorCSAgc2FtZSBsb2NrIHdhcyB0YWtlbiBhbmQgd2FzIHRodXMgbm8gbG9uZ2VyIGluIGV4aXN0YW5jZSB3aGVuIGl0CisJICBhY3R1YWxseSBoYWQgdG8gYmUgdXNlZCkuCisKKzIwMDUtMDgtMDkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcHJvY2Vzc19uZXh0X2VudHJ5KToKKwkgIE1peGluZyBiaW5hcnkgYW5kIGxvZ2ljYWwgb3BlcmF0b3JzIGlzIG5vdCBnb2luZyB0byB3b3JrOyBmaXgKKwkgIHBvc2l0aW9uLXF1ZXJ5aW5nIGluIFRvdGVtLgorCisyMDA1LTA4LTA4ICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisKKwkqIGV4dC9mYWFkL2dzdGZhYWQuYzogKGdzdF9mYWFkX2Jhc2VfaW5pdCksIChnc3RfZmFhZF9jbGFzc19pbml0KSwKKwkoZ3N0X2ZhYWRfaW5pdCksIChnc3RfZmFhZF9zZXRjYXBzKSwgKGdzdF9mYWFkX3NyY2dldGNhcHMpLAorCShnc3RfZmFhZF9ldmVudCksIChnc3RfZmFhZF91cGRhdGVfY2FwcyksIChnc3RfZmFhZF9jaGFpbiksCisJKGdzdF9mYWFkX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvZmFhZC9nc3RmYWFkLmg6CisJICBGaXggbmVnb3RpYXRpb24gKCMzMTA5MzIpIGFuZCBtaXNjZWxsYW5lb3VzIG90aGVyIHN0dWZmLiBQcm9iYWJseQorCSAgc3RpbGwgbmVlZHMgc29tZSBtb3JlIHdvcmsuCisKKzIwMDUtMDgtMDggIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2pwZWdfZGVjX2luaXQpLAorCShnc3RfanBlZ19kZWNfc2V0Y2FwcyksIChnc3RfanBlZ19kZWNfY2hhaW4pOgorCSAgQWRkIHNldGNhcHMoKSBmdW5jdGlvbiAoZm9yIG1qcGVnKS4KKworMjAwNS0wOC0wOCAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L2VzZC9lc2RzaW5rLmMgKGdzdF9lc2RzaW5rX2dldGNhcHMpOiBTZWVtcyB0aGF0IHdpZXJkCisJdmFfbGlzdCBjYXBzIHNldHRpbmcgZnVuY3Rpb24gd2FzIGJvcmtlZC4gRml4ZWQgZXNkc2luay4KKworCSogc3lzL29zcy9nc3Rvc3NzaW5rLmMgKGdzdF9vc3Nfc2lua19vcGVuLCBnc3Rfb3NzX3NpbmtfY2xvc2UpIAorCShnc3Rfb3NzX3NpbmtfcHJlcGFyZSwgZ3N0X29zc19zaW5rX3VucHJlcGFyZSk6IFVwZGF0ZSBmb3IgbmV3ZXIKKwlhdWRpb3NpbmsgYXBpLgorCisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYyAoZ3N0X2R2MTM5NHNyY19nZXRfcHJvcGVydHkpIAorCShnc3RfZHYxMzk0c3JjX3NldF9wcm9wZXJ0eSk6IFN0eWxlLiBBbGwgYWJvdXQgdGhlIHN0eWxlLgorCisJKiBleHQvZXNkL2VzZHNpbmsuYyAoZ3N0X2VzZHNpbmtfZ2V0Y2Fwcyk6IFJldHVybiBzcGVjaWZpYyBjYXBzCisJb25seSBpZiBpbiBSRUFEWSBvciBoaWdoZXIgKGkuZS4sIGlmIF9vcGVuKCkgaGFzIGJlZW4gY2FsbGVkLikKKwkoZ3N0X2VzZHNpbmtfb3BlbiwgZ3N0X2VzZHNpbmtfY2xvc2UsIGdzdF9lc2RzaW5rX3ByZXBhcmUpIAorCShnc3RfZXNkc2lua191bnByZXBhcmUpOiBVcGRhdGUgZm9yIGF1ZGlvc2luayBjaGFuZ2VzLgorCShnc3RfZXNkc2lua19jaGFuZ2Vfc3RhdGUpOiBEaWUhCisKKzIwMDUtMDgtMDggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9qcGVnL01ha2VmaWxlLmFtOgorCSAgRml4IGNvbXBpbGUuCisKKzIwMDUtMDgtMDggIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L2pwZWcvTWFrZWZpbGUuYW06CisJKiBleHQvanBlZy9nc3RqcGVnLmM6IChwbHVnaW5faW5pdCk6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6IChnc3RfanBlZ19kZWNfZ2V0X3R5cGUpLAorCShnc3RfanBlZ19kZWNfZmluYWxpemUpLCAoZ3N0X2pwZWdfZGVjX2Jhc2VfaW5pdCksCisJKGdzdF9qcGVnX2RlY19jbGFzc19pbml0KSwgKGdzdF9qcGVnX2RlY19maWxsX2lucHV0X2J1ZmZlciksCisJKGdzdF9qcGVnX2RlY19pbml0X3NvdXJjZSksIChnc3RfanBlZ19kZWNfc2tpcF9pbnB1dF9kYXRhKSwKKwkoZ3N0X2pwZWdfZGVjX3Jlc3luY190b19yZXN0YXJ0KSwgKGdzdF9qcGVnX2RlY190ZXJtX3NvdXJjZSksCisJKGdzdF9qcGVnX2RlY19teV9vdXRwdXRfbWVzc2FnZSksIChnc3RfanBlZ19kZWNfbXlfZW1pdF9tZXNzYWdlKSwKKwkoZ3N0X2pwZWdfZGVjX215X2Vycm9yX2V4aXQpLCAoZ3N0X2pwZWdfZGVjX2luaXQpLAorCShpc19qcGVnX3N0YXJ0X21hcmtlciksIChpc19qcGVnX2VuZF9tYXJrZXIpLAorCShnc3RfanBlZ19kZWNfZmluZF9qcGVnX2hlYWRlciksIChnc3RfanBlZ19kZWNfZW5zdXJlX2hlYWRlciksCisJKGdzdF9qcGVnX2RlY19oYXZlX2VuZF9tYXJrZXIpLAorCShnc3RfanBlZ19kZWNfcGFyc2VfdGFnX2hhc19lbnRyb3B5X3NlZ21lbnQpLAorCShnc3RfanBlZ19kZWNfcGFyc2VfaW1hZ2VfZGF0YSksIChnc3RfanBlZ19kZWNfY2hhaW4pLAorCShnc3RfanBlZ19kZWNfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkgIFBvcnQganBlZ2RlYyB0byAwLjk7IGhhbmRsZXMgJ3Byb2dyZXNzaXZlIGxvYWRpbmcnIG5vdywgaWUuIGlucHV0IGRvZXMKKwkgIG5vIGxvbmdlciBuZWVkIHRvIGJlIG9uZSBzaW5nbGUgYnVmZmVyLgorCisyMDA1LTA4LTA0ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCisJKiBzeXMvb3NzL2dzdG9zc2F1ZGlvLmMgKHBsdWdpbl9pbml0KTogU2Vjb25kLWNsYXNzIGNpdGl6ZW4uCisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jIChnc3RfdmlkZW9fYm94X2dldF9zaXplKTogVXBkYXRlIGZvcgorCUFQSSBjaGFuZ2VzLgorCisJKiBjb25maWd1cmUuYWMgKERFRkFVTFRfQVVESU9TSU5LLCBERUZBVUxUX1ZJREVPU0lOSyk6IFNldCB0bworCWF1dG9hdWRpb3NpbmsgYW5kIGF1dG92aWRlb3NpbmsuCisKKzIwMDUtMDgtMDQgIEVkd2FyZCBIZXJ2ZXkgIDxlZHdhcmRAZmx1ZW5kby5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcmVzZXQpLAorCShnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSk6CisJWW91IG5lZWQgdG8gYWxsb2NhdGF0ZSAobGVuKzEpIGNoYXJhY3RlcnMgdG8gc3RvcmUgYSBsZW4gc2l6ZSBzdHJpbmcuCisJQWxzbyBkb24ndCBzdG9wIHRoZSBwcm9jZXNzaW5nIHRhc2sgaWYgdGhlIG91dHB1dCBwYWQgaXMgbm90IGxpbmtlZC4KKworMjAwNS0wOC0wMyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zaW5rLmM6IChnc3RfZ2NvbmZfYXVkaW9fc2lua19yZXNldCksCisJKGdzdF9nY29uZl9hdWRpb19zaW5rX2luaXQpLCAoZG9fdG9nZ2xlX2VsZW1lbnQpLAorCShjYl90b2dnbGVfZWxlbWVudCksIChnc3RfZ2NvbmZfYXVkaW9fc2lua19jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zaW5rLmg6CisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NpbmsuYzogKGdzdF9nY29uZl92aWRlb19zaW5rX3Jlc2V0KSwKKwkoZ3N0X2djb25mX3ZpZGVvX3NpbmtfaW5pdCksIChkb190b2dnbGVfZWxlbWVudCksCisJKGNiX3RvZ2dsZV9lbGVtZW50KSwgKGdzdF9nY29uZl92aWRlb19zaW5rX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NpbmsuaDoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzogKGdzdF9hdXRvX2F1ZGlvX3NpbmtfcmVzZXQpLAorCShnc3RfYXV0b19hdWRpb19zaW5rX2luaXQpLCAoZ3N0X2F1dG9fYXVkaW9fc2lua19kZXRlY3QpLAorCShnc3RfYXV0b19hdWRpb19zaW5rX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmg6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6IChnc3RfYXV0b192aWRlb19zaW5rX3Jlc2V0KSwKKwkoZ3N0X2F1dG9fdmlkZW9fc2lua19pbml0KSwgKGdzdF9hdXRvX3ZpZGVvX3NpbmtfZGV0ZWN0KSwKKwkoZ3N0X2F1dG9fdmlkZW9fc2lua19jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5oOgorCSAgVXNlIG5ldyBnaG9zdHBhZCBBUEk7IG5vdyB0aGV5IGFjdHVhbGx5IHdvcmsgaW4gVG90ZW0sIGFsc28uCisKKzIwMDUtMDgtMDMgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9saWJwbmcvTWFrZWZpbGUuYW06CisJICBGaXggdW5pbnN0YWxsZWQgYnVpbGQuCisKKzIwMDUtMDgtMDIgIEVkd2FyZCBIZXJ2ZXkgIDxlZHdhcmRAZmx1ZW5kby5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkqIGV4dC9saWJwbmcvTWFrZWZpbGUuYW06CisJKiBleHQvbGlicG5nL2dzdHBuZy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwlQb3J0ZWQgcG5nZW5jICwgc3RpbGwgaGF2ZSB0byBwb3J0IHBuZ2RlYy4uLgorCisyMDA1LTA4LTAxICBTdGVmYW4gS29zdCAgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJcmV2aWV3ZWQgYnk6IDxkZWxldGUgaWYgbm90IHVzaW5nIGEgYnVkZHk+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9sYWRzcGEvTWFrZWZpbGUuYW06CisJKiBleHQvbGFkc3BhL2dzdGxhZHNwYS5jOiAoZ3N0X2xhZHNwYV9pbml0KSwgKGdzdF9sYWRzcGFfbG9vcCksCisJKGdzdF9sYWRzcGFfY2hhaW4pLCAoZ3N0X2xhZHNwYV9nZXQpLCAocGx1Z2luX2luaXQpOgorCSogZXh0L2xhZHNwYS9nc3RsYWRzcGEuaDoKKyAgICAgICAgICBkZWFjdGl2YXRlIGFuZCByZW1vdmUgZHBhcmFtcyAobGliZ3N0Y29udHJvbCkKKworMjAwNS0wNy0yNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9mYWFkL2dzdGZhYWQuYzogKGdzdF9mYWFkX2V2ZW50KToKKwlDb21waWxlIGZpeGVzLgorCisyMDA1LTA3LTI3ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L2Ftcm5iL2Ftcm5icGFyc2UuYzogKGdzdF9hbXJuYnBhcnNlX2V2ZW50KSwKKwkoZ3N0X2Ftcm5icGFyc2VfbG9vcCk6CisJKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19oYW5kbGVfc2lua19ldmVudCksCisJKGdzdF9kdmRlY19oYW5kbGVfc3JjX2V2ZW50KSwgKGdzdF9kdmRlY19kZWNvZGVfZnJhbWUpOgorCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX3NyY19ldmVudCksCisJKGdzdF9pZDNfdGFnX3NpbmtfZXZlbnQpLCAoZ3N0X2lkM190YWdfY2hhaW4pOgorCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfc3JjX3F1ZXJ5KSwgKGluZGV4X3NlZWspLAorCShub3JtYWxfc2VlayksIChnc3RfbWFkX3NpbmtfZXZlbnQpLCAoZ3N0X21hZF9jaGFpbik6CisJKiBleHQvbXBlZzJkZWMvZ3N0bXBlZzJkZWMuYzoKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmM6IChnc3Rfc2hvdXQyc2VuZF9ldmVudCk6CisJKiBleHQvc2lkcGxheS9nc3RzaWRkZWMuY2M6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpLAorCShnc3RfYXZpX2RlbXV4X3NlbmRfZXZlbnQpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyKSwKKwkoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc2VlayksIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSk6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnc3RfZ29vbV9ldmVudCk6CisJKiBnc3QvcmVhbG1lZGlhL3JtZGVtdXguYzogKGdzdF9ybWRlbXV4X3NpbmtfZXZlbnQpLAorCShnc3Rfcm1kZW11eF9jaGFpbiksIChnc3Rfcm1kZW11eF9zZW5kX2V2ZW50KSwKKwkoZ3N0X3JtZGVtdXhfYWRkX3N0cmVhbSk6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9oYW5kbGVfc2VlayksCisJKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpLAorCShnc3Rfd2F2cGFyc2VfbG9vcCksIChnc3Rfd2F2cGFyc2Vfc3JjcGFkX2V2ZW50KToKKwlWYXJpb3VzIGV2ZW50IHVwZGF0ZXMgYW5kIGNsZWFudXBzLgorCisyMDA1LTA3LTI1ICBDaHJpc3RpYW4gU2NoYWxsZXIgIDx1cmFldXNAZ25vbWUub3JnPgorCisKKwkqIGdzdC1wbHVnaW5zLnNwZWMuaW46IGFkZCBzaWxlbmNlIGFuZCB2aWRlb2ZsaXAKKwkqIGdzdC92aWRlb2ZpbHRlci9NYWtlZmlsZS5hbTogYWRkIG1pc3NpbmcgaGVhZGVyIHRvIG5vaW5zdAorCisyMDA1LTA3LTI1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzogKGdzdF9nYW1tYV9zZXR1cCk6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6IChnc3RfdmlkZW9iYWxhbmNlX3NldHVwKToKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZpbHRlci5jOiAoZ3N0X3ZpZGVvZmlsdGVyX2NsYXNzX2luaXQpLAorCShnc3RfdmlkZW9maWx0ZXJfZ2V0Y2FwcyksIChnc3RfdmlkZW9maWx0ZXJfc2V0Y2FwcyksCisJKGdzdF92aWRlb2ZpbHRlcl9pbml0KSwgKGdzdF92aWRlb2ZpbHRlcl9jaGFpbiksCisJKGdzdF92aWRlb2ZpbHRlcl9zZXRfcHJvcGVydHkpLCAoZ3N0X3ZpZGVvZmlsdGVyX2dldF9wcm9wZXJ0eSksCisJKGdzdF92aWRlb2ZpbHRlcl9zZXR1cCksIChnc3RfdmlkZW9maWx0ZXJfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZXMpOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmlsdGVyLmg6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6IChnc3RfdmlkZW9mbGlwX2luaXQpLAorCShnc3RfdmlkZW9mbGlwX3NldF9wcm9wZXJ0eSksIChnc3RfdmlkZW9mbGlwX2dldF9wcm9wZXJ0eSksCisJKHBsdWdpbl9pbml0KSwgKGdzdF92aWRlb2ZsaXBfc2V0dXApLCAoZ3N0X3ZpZGVvZmxpcF9wbGFuYXI0MTEpOgorCSAgZm9yd2FyZCBwb3J0IGZyb20gMC45IGFuZCBlbmFibGUgdmlkZW9mbGlwIG5vdyB0aGF0IGl0IHdvcmtzCisKKzIwMDUtMDctMjMgIEVkd2FyZCBIZXJ2ZXkgIDxlZHdhcmRAZmx1ZW5kby5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9zaWxlbmNlL01ha2VmaWxlLmFtOgorCSogZ3N0L3NpbGVuY2UvZ3N0c2lsZW5jZS5oOgorCSogZ3N0L3NpbGVuY2UvZ3N0c2lsZW5jZS5jOgorCVBvcnRlZCBzaWxlbmNlIHRvIDAuOSB1c2luZyBHc3RCYXNlU3JjIC4uLiAxODAgbGluZXMgOikKKworMjAwNS0wNy0yMiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfc3JjX2V2ZW50KToKKwkgIEZpcnN0IHRyeSBmb3J3YXJkaW5nIGV2ZW50cywgbWFrZXMgc2Vla2luZyBpbiBBVkkgZmlsZXMgd2l0aCBtcDMKKwkgIGF1ZGlvIHdvcmsgYWdhaW4uCisKKzIwMDUtMDctMjAgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5jIChnc3RfbXBlZzJkZWNfc2lua19ldmVudCk6IFNpZ25lZG5lc3MKKwlmaXguCisKKzIwMDUtMDctMjAgIEVkd2FyZCBIZXJ2ZXkgIDxlZHdhcmRAZmx1ZW5kby5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuaDoKKwkqIGdzdC93YXZwYXJzZS9NYWtlZmlsZS5hbToKKwlQb3J0ZWQgd2F2cGFyc2UgdG8gMC45IC4gUGxheWluZywgc2Vla2luZyBhbmQgc3RhdGUgY2hhbmdlcyB3b3JrLgorCUNvdWxkIG5lZWQgbW9yZSBsb3Zpbmcgb24gdGhlIGhlYWRlcnMgdGhvdWdoLgorCisyMDA1LTA3LTIwICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvZ2NvbmYvTWFrZWZpbGUuYW06CisJKiBleHQvZ2NvbmYvZ2NvbmYuYzogKGdzdF9iaW5fZmluZF91bmNvbm5lY3RlZF9wYWQpLAorCShnc3RfZ2NvbmZfcmVuZGVyX2Jpbl9mcm9tX2Rlc2NyaXB0aW9uKSwKKwkoZ3N0X2djb25mX2dldF9kZWZhdWx0X3ZpZGVvX3NpbmspOgorCSogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zaW5rLmM6IChnc3RfZ2NvbmZfYXVkaW9fc2lua19iYXNlX2luaXQpLAorCShnc3RfZ2NvbmZfYXVkaW9fc2lua19jbGFzc19pbml0KSwgKGdzdF9nY29uZl9hdWRpb19zaW5rX2Rpc3Bvc2UpLAorCShjYl90b2dnbGVfZWxlbWVudCksIChnc3RfZ2NvbmZfYXVkaW9fc2lua19jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L2djb25mL2dzdGdjb25mZWxlbWVudHMuaDoKKwkqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc2luay5jOiAoZ3N0X2djb25mX3ZpZGVvX3NpbmtfYmFzZV9pbml0KSwKKwkoZ3N0X2djb25mX3ZpZGVvX3NpbmtfY2xhc3NfaW5pdCksIChnc3RfZ2NvbmZfdmlkZW9fc2lua19kaXNwb3NlKSwKKwkoY2JfdG9nZ2xlX2VsZW1lbnQpLCAoZ3N0X2djb25mX3ZpZGVvX3NpbmtfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkoZ3N0X2F1dG9fYXVkaW9fc2lua19iYXNlX2luaXQpLCAoZ3N0X2F1dG9fYXVkaW9fc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X2F1dG9fYXVkaW9fc2lua19kZXRlY3QpLCAoZ3N0X2F1dG9fYXVkaW9fc2lua19jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jOgorCShnc3RfYXV0b192aWRlb19zaW5rX2Jhc2VfaW5pdCksIChnc3RfYXV0b192aWRlb19zaW5rX2NsYXNzX2luaXQpLAorCShnc3RfYXV0b192aWRlb19zaW5rX2ZpbmRfYmVzdCksIChnc3RfYXV0b192aWRlb19zaW5rX2RldGVjdCk6CisJICBQb3J0IGF1dG8vZ2NvbmZzaW5rcyB0byAwLjkuIFRoZXkgYWN0dWFsbHkgYXBwZWFyIHRvIHdvcmsgaGVyZSBpbgorCSAgVG90ZW0gYXMgd2VsbCwgbWFraW5nIHRoZW0gYWN0dWFsbHkgdXNlZnVsLgorCisyMDA1LTA3LTIwICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZmFhZC9NYWtlZmlsZS5hbToKKwkgIEZpeCB1bmluc3RhbGxlZCBidWlsZC4KKworMjAwNS0wNy0xOSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiAoZ3N0X29zc19zaW5rX2dldF9mb3JtYXQpLAorCShnc3Rfb3NzX3Npbmtfb3Blbik6CisJUGFyc2Ugc3BlYyB0byBzZXQgY29ycmVjdCBvc3MgdmFsdWVzLgorCisyMDA1LTA3LTE5ICBFZGdhcmQgTi4gQS4gRy4gTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKyAgICAgICAgKiBjb25maWd1cmUuYWMKKwkqIGV4dC9NYWtlZmlsZS5hbQorCSogZXh0L2Ftcm5iL2Ftcm5iZGVjLmMKKwkqIGV4dC9hbXJuYi9hbXJuYmVuYy5jCisJKiBleHQvYW1ybmIvYW1ybmJwYXJzZS5jCisJKiBleHQvZmFhZC9nc3RmYWFkLmMKKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5jCisJUG9ydGVkIGFtcm5iLCBmYWFkLCBtcGVnMmRlYyB0byAwLjkKKworMjAwNS0wNy0xOSAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmMgKGdzdF9kdmRlY19kZWNvZGVfdmlkZW8pOiBTZXQgdGhlIHByb3BlcgorCWZyYW1lcmF0ZSBvbiB0aGUgb3V0Ym91bmQgYnVmZmVyLgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYyAoZ3N0X2R2ZGVjX2RlY29kZV92aWRlbyk6IERvbid0IGNsb2JiZXIKKwlhbGxvY19idWZmZXIncyByZXR1cm4gdmFsdWUuCisJKGdzdF9kdmRlY19kZWNvZGVfZnJhbWUpOiBIYW5kbGUgdW5saW5rZWQgcGFkcyB3aXRoIGdyYWNlIGFuZAorCWFnaWxpdHkuCisKKwkqIGV4dC9kdi9nc3RkdmRlYy5oOiBGaXggc2lnbmVkbmVzcyBlcnJvci4KKworMjAwNS0wNy0xOSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOiAoZ3N0X2R2ZGVjX2luaXQpLCAoZ3N0X2R2ZGVjX3NyY19jb252ZXJ0KSwKKwkoZ3N0X2R2ZGVjX3NpbmtfY29udmVydCksIChnc3RfZHZkZWNfZ2V0X3NyY19xdWVyeV90eXBlcyksCisJKGdzdF9kdmRlY19zcmNfcXVlcnkpLCAoZ3N0X2R2ZGVjX2dldF9zaW5rX3F1ZXJ5X3R5cGVzKSwKKwkoZ3N0X2R2ZGVjX3NpbmtfcXVlcnkpLCAoZ3N0X2R2ZGVjX3NlbmRfZXZlbnQpLAorCShnc3RfZHZkZWNfaGFuZGxlX3NpbmtfZXZlbnQpLCAoZ3N0X2R2ZGVjX2hhbmRsZV9zcmNfZXZlbnQpLAorCShnc3RfZHZkZWNfZGVjb2RlX2F1ZGlvKSwgKGdzdF9kdmRlY19kZWNvZGVfdmlkZW8pLAorCShnc3RfZHZkZWNfZGVjb2RlX2ZyYW1lKSwgKGdzdF9kdmRlY19mbHVzaCksIChnc3RfZHZkZWNfY2hhaW4pOgorCSogZXh0L2R2L2dzdGR2ZGVjLmg6CisJSW1wbGVtZW50ZWQgc2Vla2luZyBpbiBkdmRlYy4KKworMjAwNS0wNy0xOSAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L01ha2VmaWxlLmFtOiBFbmFibGUgZHZkZXYgYW5kIHJhdzEzOTRzcmMuCisKKzIwMDUtMDctMTggIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogVXNlIEFTX0xJQlRPT0xfVEFHUy4gRml4IGNyYXAgZ2V0dGV4dCBjb21taXQKKwljb21tZW50LgorCisyMDA1LTA3LTE4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfYWRkX2VsZW1lbnQpLAorCShnc3RfcnRzcHNyY19wbGF5KToKKwlGaXggZm9yIGNvcmUgY2hhbmdlcy4KKworMjAwNS0wNy0xOCAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X2lkM190YWdfc2lua19ldmVudCk6CisJICBXaGVuIHJldHVybmluZyB0byBOT1JNQUwgc3RhdGUgYWZ0ZXIgcmVhZGluZyB0YWdzLAorCSAgcGFzcyBvbiB0aGUgZGlzY29udCBldmVudC4KKworMjAwNS0wNy0xOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9yZWFsbWVkaWEvcm1kZW11eC5jOiAoZ3N0X3JtZGVtdXhfc2lua19ldmVudCksCisJKGdzdF9ybWRlbXV4X2NoYW5nZV9zdGF0ZSksIChnc3Rfcm1kZW11eF9jaGFpbiksCisJKGdzdF9ybWRlbXV4X2dldF9zdHJlYW1fYnlfaWQpLCAoZ3N0X3JtZGVtdXhfc2VuZF9ldmVudCksCisJKGdzdF9ybWRlbXV4X2FkZF9zdHJlYW0pOgorCVNlbmQgZGlzY29udCBldmVudCBiZWZvcmUgcHVzaGluZyBmaXJzdCBidWZmZXIuCisKKzIwMDUtMDctMTcgIFBoaWxpcHBlIEtoYWxhZiA8YnVyZ2VyQHNwZWVkeS5vcmc+CisKKwkqIGdzdC9mZHNyYy9nc3RmZHNyYy5jOgorCVJlbW92ZWQgI2luY2x1ZGUgPGdzdF9wcml2YXRlLmg+CisKKzIwMDUtMDctMTYgIFBoaWxpcHBlIEtoYWxhZiA8YnVyZ2VyQHNwZWVkeS5vcmc+CisKKwkqIGdzdC9mZHNyYy9nc3RmZHNyYy5jOgorCSogZ3N0L2Zkc3JjL2dzdGZkc3JjLmg6CisJKiBnc3QvZmRzcmMvTWFrZWZpbGUuYW06CisJTW92ZWQgZmRzcmMgMC45IHBvcnQgZnJvbSBnc3RyZWFtZXIvZ3N0L2VsZW1lbnRzIHRvIGhlcmUuCisKKzIwMDUtMDctMTYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9zcmNfcXVlcnkpLCAoZ3N0X21hZF9zaW5rX2V2ZW50KSwKKwkoZ3N0X21hZF9jaGFpbik6CisJQWRkIGNvbnZlcnQgZnVuY3Rpb24gZm9yIHByb3BlciB0aW1lc3RhbXAgY2FsY3VsYXRpb25zLgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3NlbmRfZXZlbnQpLAorCShnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXIpLCAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc2VlayksCisJKGdzdF9hdmlfZGVtdXhfcHJvY2Vzc19uZXh0X2VudHJ5KSwgKGdzdF9hdmlfZGVtdXhfbG9vcCk6CisJU2VuZCBvdXQgaW5pdGlhbCBkaXNjb250LgorCisyMDA1LTA3LTE1ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6IChnc3RfbGV2ZWxfdHJhbnNmb3JtKToKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOiAoZ3N0X3ZpZGVvX2JveF9jbGFzc19pbml0KSwKKwkoZ3N0X3ZpZGVvX2JveF9nZXRfc2l6ZSksIChnc3RfdmlkZW9fYm94X3RyYW5zZm9ybSk6CisJUG9ydCB0byBuZXcgYmFzZSBjbGFzcy4KKworMjAwNS0wNy0xNCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOiAoZ3N0X2R2MTM5NHNyY19nZXRfdHlwZSksCisJKGdzdF9kdjEzOTRzcmNfY2xhc3NfaW5pdCksIChnc3RfZHYxMzk0c3JjX2luaXQpLAorCShnc3RfZHYxMzk0c3JjX2lzb19yZWNlaXZlKSwgKGdzdF9kdjEzOTRzcmNfY3JlYXRlKSwKKwkoZ3N0X2R2MTM5NHNyY19jaGFuZ2Vfc3RhdGUpLCAoZ3N0X2R2MTM5NHNyY19xdWVyeSk6CisJSXQncyBQVVNIX1NSQyBub3cuCisKKzIwMDUtMDctMTQgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2dldF90eXBlKSwKKwkoZ3N0X3VkcHNyY19jbGFzc19pbml0KToKKwkgIG1vcmUgYXV0aXN0aWMgY2xlYW5saW5lc3MgaW4gZnVuY3Rpb25zL25hbWVzL2RlZmluZXMKKworCisyMDA1LTA3LTEwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6IChnc3RfYWFzaW5rX2dldF90eXBlKSwKKwkoZ3N0X2Fhc2lua19jbGFzc19pbml0KSwgKGdzdF9hYXNpbmtfaW5pdCk6CisJKiBleHQvZXNkL2VzZHNpbmsuYzogKGdzdF9lc2RzaW5rX2dldF90eXBlKSwKKwkoZ3N0X2VzZHNpbmtfY2xhc3NfaW5pdCk6CisJKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5jOiAoZ3N0X2NhY2FzaW5rX2dldF90eXBlKSwKKwkoZ3N0X2NhY2FzaW5rX2NsYXNzX2luaXQpLCAoZ3N0X2NhY2FzaW5rX2luaXQpOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzogKGdzdF9zaG91dDJzZW5kX2dldF90eXBlKSwKKwkoZ3N0X3Nob3V0MnNlbmRfY2xhc3NfaW5pdCksIChnc3Rfc2hvdXQyc2VuZF9pbml0KToKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOiAoZ3N0X2R5bnVkcHNpbmtfZ2V0X3R5cGUpLAorCShnc3RfZHludWRwc2lua19jbGFzc19pbml0KToKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChnc3RfbXVsdGl1ZHBzaW5rX2dldF90eXBlKSwKKwkoZ3N0X211bHRpdWRwc2lua19jbGFzc19pbml0KToKKwkgIG1vcmUgbWFjcm8gc3BsaXR0aW5nCisKKzIwMDUtMDctMDggIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIHN5cy9vc3MvOiBQb3J0IGZyb20gVEhSRUFERUQrd2ltJ3MgZml4ZXMuCisKKwkqIGdzdC9hdmkvTWFrZWZpbGUuYW0gKGxpYmdzdGF2aV9sYV9DRkxBR1MpOiBObyBnZXR0ZXh0IGhhY2tzLCB0aGUKKwlkZWZpbmVzIGNvbWUgZnJvbSBjb25maWcuaC4KKworCSogYXV0b2dlbi5zaDogUnVuIGF1dG9wb2ludCwgZXRjLgorCisJKiBNYWtlZmlsZS5hbSAoRElTVF9TVUJESVJTLCBTVUJESVJTKTogR28gaW50byBwby8uCisKKwkqIGNvbmZpZ3VyZS5hYzogQWRkIGdldHRleHQgc3R1ZmYuCisKKzIwMDUtMDctMDcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogKGdzdF92aWRlb19ib3hfaW5pdCksCisJKGdzdF92aWRlb19ib3hfdHJhbnNmb3JtX2NhcHMpLCAoZ3N0X3ZpZGVvX2JveF9zZXRfY2Fwcyk6CisJTG9naWMgd2FzIHJldmVyc2VkLiBOZWVkcyBzb21lICBtb3JlIGZpeGVzIGluIHRoZSB0cmFuc2Zvcm0KKwlmdW5jdGlvbiB0byBpbmNsdWRlIEFZVVYgb3V0cHV0LgorCU1vdmVkIEFZVVYgYXMgcHJlZmVyZWQgZm9ybWF0LgorCisyMDA1LTA3LTA3ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L2R2L01ha2VmaWxlLmFtOgorCSogZXh0L2R2L2dzdGR2ZGVjLmM6IChnc3RfZHZkZWNfY2xhc3NfaW5pdCksIChnc3RfZHZkZWNfaW5pdCksCisJKGdzdF9kdmRlY19nZXRfc3JjX3F1ZXJ5X3R5cGVzKSwgKGdzdF9kdmRlY19zcmNfcXVlcnkpLAorCShnc3RfZHZkZWNfaGFuZGxlX3NpbmtfZXZlbnQpLCAoZ3N0X2R2ZGVjX2hhbmRsZV9zcmNfZXZlbnQpLAorCShnc3RfZHZkZWNfdmlkZW9fZ2V0Y2FwcyksIChnc3RfZHZkZWNfdmlkZW9fc2V0Y2FwcyksCisJKGdzdF9kdmRlY19kZWNvZGVfYXVkaW8pLCAoZ3N0X2R2ZGVjX2RlY29kZV92aWRlbyksCisJKGdzdF9kdmRlY19kZWNvZGVfZnJhbWUpLCAoZ3N0X2R2ZGVjX2NoYWluKSwKKwkoZ3N0X2R2ZGVjX2NoYW5nZV9zdGF0ZSksIChnc3RfZHZkZWNfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X2R2ZGVjX2dldF9wcm9wZXJ0eSksIChwbHVnaW5faW5pdCk6CisJKiBleHQvZHYvZ3N0ZHZkZWMuaDoKKwkqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfY2xhc3NfaW5pdCk6CisJUG9ydGVkIERWZGVjIHRvIDAuOS4KKwlQYXJlbnQgb2YgZXNkc2luayBpcyBHc3RBdWRpb1NpbmsuCisKKzIwMDUtMDctMDcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvcmF3MTM5NC9NYWtlZmlsZS5hbToKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOiAoZ3N0X2R2MTM5NHNyY19nZXRfdHlwZSksCisJKGdzdF9kdjEzOTRzcmNfY2xhc3NfaW5pdCksIChnc3RfZHYxMzk0c3JjX2luaXQpLAorCShnc3RfZHYxMzk0c3JjX2lzb19yZWNlaXZlKSwgKGdzdF9kdjEzOTRzcmNfY3JlYXRlKSwKKwkoZ3N0X2R2MTM5NHNyY19jaGFuZ2Vfc3RhdGUpLCAoZ3N0X2R2MTM5NHNyY19jb252ZXJ0KSwKKwkoZ3N0X2R2MTM5NHNyY19nZXRfcXVlcnlfdHlwZXMpLCAoZ3N0X2R2MTM5NHNyY19xdWVyeSk6CisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuaDoKKwlQb3J0ZWQgdGhlIDEzOTQgc291cmNlIHRvIDAuOS4KKworMjAwNS0wNy0wNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChnc3RfaWQzX3RhZ19nZXRfcXVlcnlfdHlwZXMpOgorCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfZ2V0X3F1ZXJ5X3R5cGVzKSwgKGdzdF9tYWRfc3JjX3F1ZXJ5KToKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfZ2V0X3NyY19xdWVyeV90eXBlcyk6CisJUmVtb3ZlIGRlcHJlY2F0ZWQvdW5zZWQgY29kZS4KKworMjAwNS0wNy0wNiAgRWR3YXJkIEhlcnZleSAgPGVkd2FyZEBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfaW5pdCk6IAorCUdTVF9CQVNFU1JDIC0tPiBHU1RfQkFTRV9TUkMKKworMjAwNS0wNy0wNSAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKworCSogZ3N0L29uZXRvbjogUmVtb3ZlZCAocmVwbGFjZWQgYnkgZGVpbnRlcmxlYXZlKS4KKworCSogZ3N0L2FkZGVyOgorCSogZ3N0L2F1ZGlvY29udmVydDoKKwkqIGdzdC9hdWRpb3JhdGU6CisJKiBnc3QvYXVkaW9zY2FsZToKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlOgorCSogZ3N0L3BsYXliYWNrOgorCSogZ3N0L3NpbmU6CisJKiBnc3Qvc3VicGFyc2U6CisJKiBnc3QvdGFnczoKKwkqIGdzdC90Y3A6CisJKiBnc3QvdmlkZW9zY2FsZToKKwkqIGdzdC92b2x1bWU6IFJlbW92ZWQgZGlycyB0aGF0IGFyZSBub3cgaW4gZ3N0LXBsdWdpbnMtYmFzZS4KKworMjAwNS0wNy0wNSAgRWR3YXJkIEhlcnZleSAgPGVkd2FyZEBmbHVlbmRvLmNvbT4KKworCSogY29uZmlndXJlLmFjOiAoR1NUX1BMVUdJTlNfQUxMKTogCisJdmlkZW9maWx0ZXIgbXVzdCBiZSBjb21waWxlZCBmaXJzdCwgc2luY2Ugb3RoZXIgcGx1Z2lucyBkZXBlbmQgb250IGl0LgorCisyMDA1LTA3LTA1ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCisJKiBXYXksIHdheSwgd2F5IHRvbyBtYW55IGZpbGVzOgorCVJlbW92ZSBjcmFjayBjb21tZW50IGZyb20gdGhlIDIwMDAgZXJhLgorCisyMDA1LTA3LTA1ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogQ2xlYW4gdXAsIHBvcnQgdG8gMC45LCB1c2UKKwlCYXNlVHJhbnNmb3JtLgorCisJKiBnc3QvdmlkZW9ib3gvTWFrZWZpbGUuYW06IExpbmsgdG8gYmFzZSBsaWJzLCBpbmNsdWRlCisJcGx1Z2lucy1iYXNlIGNmbGFncywgZGlzdCB0aGUgUkVBRE1FLgorCisJKiBjb25maWd1cmUuYWMgKEdTVF9QTFVHSU5fQUxMLCBBQ19DT05GSUdfRklMRVMpOiBBZGQgdmlkZW9ib3ggdG8KKwl0aGUgYnVpbGQuCisKKzIwMDUtMDctMDQgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcmVhbG1lZGlhL3JtZGVtdXguYzoKKwlJIGRvbid0IHRoaW5rIHRoYXQgcGllY2Ugb2YgY2hhbmdlbG9nIHNob3VsZCBnbyB0aGVyZS4KKworMjAwNS0wNy0wNCAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXhhbXBsZXMvbGV2ZWwvOgorCSogZXhhbXBsZXMvbGV2ZWwvTWFrZWZpbGUuYW06CisJKiBleGFtcGxlcy9sZXZlbC9SRUFETUU6CisJKiBleGFtcGxlcy9sZXZlbC9kZW1vLmM6CisJKiBleGFtcGxlcy9sZXZlbC9wbG90LmM6IEV4YW1wbGVzIG1vdmVkIG91dCBvZiB0aGUgc291cmNlIGRpci4gTm90CisJdXBkYXRlZCB0aG8uCisKKwkqIGNvbmZpZ3VyZS5hYzogQWRkIGxldmVsIHRvIHRoZSBidWlsZC4KKworCSogZ3N0L2xldmVsL01ha2VmaWxlLmFtOgorCSogZ3N0L2xldmVsL2dzdGxldmVsLmg6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogQ2xlYW5lZCB1cCwgcG9ydGVkIHRvIDAuOS4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jIChnc3RfYWFzaW5rX2ZpeGF0ZSk6IFVwZGF0ZSBmb3IgbmV3ZXIKKwlmaXhhdGUgcHJvdG90eXBlLgorCisyMDA1LTA3LTAzICBPd2VuIEZyYXNlci1HcmVlbiAgPG93ZW5AZGlzY29iYWJlLm5ldD4KKworCSogZ3N0L3JlYWxtZWRpYS9ybWRlbXV4LmMgKGdzdF9ybWRlbXV4X2FkZF9zdHJlYW0pLAorCShnc3Rfcm1kZW11eF9zcmNfZ2V0Y2FwcyksIChnc3Rfcm1kZW11eF9jaGFpbik6IAorCUFkZGVkIGdldGNhcHMgZnVuY3Rpb24gbm9fbW9yZV9wYWRzIGNhbGwKKworMjAwNS0wNy0wMSAgUGhpbGlwcGUgS2hhbGFmIDxidXJnZXJAc3BlZWR5Lm9yZz4KKwkqIGdzdC91ZHAvTWFrZWZpbGUuYW06CisJKiBnc3QvdWRwL2dzdHVkcC5jOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6IChuZXcpCisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuaDogKG5ldykKKwkgIEFkZGVkIG5ldyBlbGVtZW50ICh1ZHBkeW5zaW5rKSB0aGF0IHJlY2VpdmVzIEdzdE5ldEJ1ZmZlcnMgYW5kIHNlbmRzIHRoZQorCSAgdWRwIHBhY2tldHMgdG8gdGhlIHNvdXJjZSBnaXZlbiBpbiB0aGUgYnVmZmVyLiBJdCdzIHVzZWQgYnkgcnRwc2Vzc2lvbgorCSAgZWxlbWVudCBmb3Igbm93LgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIEZpeGVkIG1lbW9yeSBsZWFrLgorCisyMDA1LTA3LTAxICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9tYWQvTWFrZWZpbGUuYW06CisJKiBzeXMvb3NzL01ha2VmaWxlLmFtOgorCVJvbGwgZ3N0cmVhbWVyLWludGVyZmFjZXMtMC45LnBjIGludG8gZ3N0cmVhbWVyLXBsdWdpbnMtYmFzZS0wLjkucGMKKworMjAwNS0wNy0wMSAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCSogZXh0L2xpYmNhY2EvTWFrZWZpbGUuYW06CisJKiBleHQvbWFkL01ha2VmaWxlLmFtOgorCSogZ3N0L2VmZmVjdHYvTWFrZWZpbGUuYW06CisJKiBnc3QvdWRwL01ha2VmaWxlLmFtOgorCSAgUmVwbGFjZSBHU1RfUExVR0lOU19MSUJTXyogd2l0aCBHU1RfUExVR0lOU19CQVNFXyoKKworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX3NyY19xdWVyeSksCisJKGdzdF9pZDNfdGFnX3NyY19ldmVudCksIChnc3RfaWQzX3RhZ19zaW5rX2V2ZW50KSwKKwkoZ3N0X2lkM190YWdfY2hhaW4pLCAocGx1Z2luX2luaXQpOgorCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfc3JjX3F1ZXJ5KSwgKGdzdF9tYWRfY2hhaW4pOgorCSAgU2lnbmVkbmVzcyB3YXJuaW5nIGZpeCwgdXNlIGdzdF9wYWRfZ2V0X3BlZXIgaW5zdGVhZCBvZiBHU1RfUEFEX1BFRVIKKwkgIGluIHF1ZXJ5aW5nIGFuZCBldmVudCBoYW5kbGluZywgYmVjYXVzZSB3ZSdyZSBub3QgaG9sZGluZyB0aGUgcGFkCisJICBsb2NrIGFuZCB0aGUgcGVlciBtYXkgZGlzYXBwZWFyLgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdWJpbmRleCksCisJKGdzdF9hdmlfZGVtdXhfcGFyc2VfaW5kZXgpLCAoZ3N0X2F2aV9kZW11eF9tYXNzYWdlX2luZGV4KToKKwkgIFNpZ25lZG5lc3Mgd2FybmluZyBmaXhlcy4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvdGVtcGxhdGUuYzogKHBsdWdpbl9pbml0KToKKwkgIFJlbW92ZSBnc3RfbGlicmFyeV9sb2FkCisKKzIwMDUtMDYtMzAgIEVkd2FyZCBIZXJ2ZXkgIDxlZHdhcmRAZmx1ZW5kby5jb20+CisKKwkqIGdzdC9hdmkvTWFrZWZpbGUuYW06IChsaWJnc3RhdmlfbGFfTElCQUREKToKKwlBZGRlZCBsaW5raW5nIHRvIGxpYmdzdHJpZmYtMC45CisJCisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9zcmNfcXVlcnkpOiAKKwljaGVjayB0aGUgZm9ybWF0IG9mIHRoZSB1cHN0cmVhbSBxdWVyeSBhbmQgcmV0dXJuIHF1ZXJ5IGlmIGl0J3MgdGhlCisJc2FtZSBmb3JtYXQgYXMgdGhlIHJlcXVlc3RlZCBvbmUuCisKKzIwMDUtMDYtMzAgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSk6CisJICBDb21waWxlciBwYWlucy4KKworMjAwNS0wNi0zMCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2F2aS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdmkvZ3N0YXZpLmM6IChwbHVnaW5faW5pdCk6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2dldF90eXBlKSwKKwkoZ3N0X2F2aV9kZW11eF9jbGFzc19pbml0KSwgKGdzdF9hdmlfZGVtdXhfaW5pdCksCisJKGdzdF9hdmlfZGVtdXhfcmVzZXQpLCAoZ3N0X2F2aV9kZW11eF9pbmRleF9uZXh0KSwKKwkoZ3N0X2F2aV9kZW11eF9pbmRleF9lbnRyeV9mb3JfdGltZSksCisJKGdzdF9hdmlfZGVtdXhfaW5kZXhfZW50cnlfZm9yX2J5dGUpLAorCShnc3RfYXZpX2RlbXV4X2luZGV4X2VudHJ5X2Zvcl9mcmFtZSksIChnc3RfYXZpX2RlbXV4X3NyY19jb252ZXJ0KSwKKwkoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19ldmVudCksCisJKGdzdF9hdmlfZGVtdXhfcGFyc2VfZmlsZV9oZWFkZXIpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5pdCksCisJKGdzdF9hdmlfZGVtdXhfcGFyc2VfYXZpaCksIChnc3RfYXZpX2RlbXV4X3BhcnNlX3N1cGVyaW5kZXgpLAorCShnc3RfYXZpX2RlbXV4X3BhcnNlX3N1YmluZGV4KSwgKGdzdF9hdmlfZGVtdXhfcmVhZF9zdWJpbmRleGVzKSwKKwkoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0pLCAoZ3N0X2F2aV9kZW11eF9wYXJzZV9vZG1sKSwKKwkoZ3N0X2F2aV9kZW11eF9wYXJzZV9pbmRleCksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksCisJKGdzdF9hdmlfZGVtdXhfc3RyZWFtX3NjYW4pLCAoZ3N0X2F2aV9kZW11eF9tYXNzYWdlX2luZGV4KSwKKwkoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyKSwgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspLAorCShnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9kYXRhKSwKKwkoZ3N0X2F2aV9kZW11eF9sb29wKSwgKGdzdF9hdmlfZGVtdXhfc2lua19hY3RpdmF0ZSksCisJKGdzdF9hdmlfZGVtdXhfc2lua19hY3RpdmF0ZV9wdWxsKToKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIFBvcnQgZnJvbSAtVEhSRUFERUQgdG8gSEVBRCwgYW5kIGZpeCBmb3IgbGF0ZXN0IEFQSSBjaGFuZ2VzIG9mCisJICB0aGUgZGF5LiBLZWVwIGF2aW11eCBkZWFkIGZvciBub3cuCisKKzIwMDUtMDYtMjkgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOiAoZ3N0X3Nob3V0MnNlbmRfcmVuZGVyKToKKwlGaXggYnVpbGQuCisKKzIwMDUtMDYtMjkgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2V4YW1wbGUuYzogUmVtb3ZlZCBnc3RfbGlicmFyeV9sb2FkLCBJCisJdGhpbmsuIFdoYXRldmVyIHRoaXMgcGx1Z2luIGFjdHVhbGx5IGRvZXMsIHRoYXQgSSBkb24ndCBrbm93LgorCisyMDA1LTA2LTI5ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jIChnc3RfaWQzX3RhZ19nZXRfZXZlbnRfbWFza3MpOiBSZXNjaG1vb3ZlLgorCisJKiBleHQvbWFkL2dzdG1hZC5jIChnc3RfbWFkX2dldF9ldmVudF9tYXNrcyk6IFJlbW92ZS4KKwkoZ3N0X21hZF9jaGFpbik6IEFwcGVhc2UgR0NDLgorCisJKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5jIChnc3RfY2FjYXNpbmtfc2V0Y2Fwcyk6IFNpZ25lZG5lc3MuCisKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYyAoZ3N0X2Fhc2lua19maXhhdGUpOiBVbnJlZiBjYXBzLCBub3QgZnJlZS4KKwkoZ3N0X2Fhc2lua19zY2FsZSk6IFNpZ25lZG5lc3MuCisKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5jIChnc3RfdWRwc2lua19nZXRfdHlwZSk6IEFjdHVhbGx5IGFkZCB0aGUKKwlVUkkgaGFuZGxlci4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYyAoZ3N0X3VkcHNyY19zdGFydCk6CisJKGdzdF91ZHBzcmNfY3JlYXRlKTogU2lnbmVkbmVzcy4KKworCSogZ3N0L3J0c3Avc2RwbWVzc2FnZS5jIChzZHBfbWVzc2FnZV9wYXJzZV9idWZmZXIpOiBUaGFua3MKKwljb21waWxlciEKKwkoc2RwX3BhcnNlX2xpbmUpOiBTaWduZWRuZXNzIGZpeC4KKworCSogY29uZmlndXJlLmFjIChHU1RfQ0ZMQUdTKTogR0NDIHN0cmlrZXMgYmFjayEhISBMZXQgdGhlIGJ1aWxkCisJYnJlYWthZ2UgZW5zdWUhISEKKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jIChnc3RfcnRzcHNyY19sb29wLCBnc3RfcnRzcHNyY19vcGVuKToKKwlTaWduZWRuZXNzLCB1bnVzZWQgdmFyIGZpeGVzLgorCShnc3RfcnRzcHNyY19jbG9zZSk6IFVudXNlZD8KKworCSogZ3N0L3JlYWxtZWRpYS9ybWRlbXV4LmMgKHJlX2hleGR1bXBfYnl0ZXMpOiBVbnVzZWQuCisKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmMgKGdzdF9tdWxhd2VuY19jaGFpbik6IFNpZ25lbmVzcyBmaXguCisKKwkqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYyAoYWxhd2VuY19nZXRjYXBzKTogUmVtb3ZlIHVubmVlZGVkCisJZGVjbGFyYXRpb25zLiBUeXBvIChwcm9iYWJseSBjcmFzaGVyKSBmaXguCisJCisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5jIChtdWxhd2RlY19nZXRjYXBzKTogCisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5jIChtdWxhd2VuY19nZXRjYXBzKTogCisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmMgKGFsYXdkZWNfZ2V0Y2Fwcyk6IFNhbWUgY3Jhc2hlciBmaXguCisKKwkqIGdzdC9nb29tL2dzdGdvb20uYyAoZ3N0X2dvb21faW5pdCk6IEhvb2sgdXAgdGhlIGV2ZW50IGZ1bmN0aW9uLgorCisJKiBnc3QvZWZmZWN0di9nc3R3YXJwLmMgKGdzdF93YXJwdHZfc2V0dXApOiBTaWduZWRuZXNzIGZpeC4KKworCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jIChnc3RfZGljZXR2X2RyYXcpOiBVbSwgZGVmZXJlbmNpbmcKKwl1bmluaXRpYWxpemVkIHBvaW50ZXIgbm90IGdvb2QuCisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2V4YW1wbGUuYyAocGx1Z2luX2luaXQpOiAKKwkqIGdzdC92aWRlb2ZpbHRlci9NYWtlZmlsZS5hbSAobGliZ3N0dmlkZW9leGFtcGxlX2xhX0xJQkFERCk6IExpbmsKKwl0byBsaWJnc3R2aWRlb2ZpbHRlciBpbnN0ZWFkIG9mIGdzdF9saWJyYXJ5X2xvYWQuCisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jIChnc3RfYWxwaGFfY2hyb21hX2tleV9pNDIwKSAKKwkoZ3N0X2FscGhhX2Nocm9tYV9rZXlfYXl1dik6IFNpZ25lZG5lc3MgZml4ZW4uCisKKzIwMDUtMDYtMjkgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcF9wcm90b19nZXRfdHlwZSksCisJKGdzdF9ydHNwc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3J0c3BzcmNfY3JlYXRlX3N0cmVhbSksCisJKGdzdF9ydHNwc3JjX2FkZF9lbGVtZW50KSwgKGdzdF9ydHNwc3JjX3NldF9zdGF0ZSksCisJKGdzdF9ydHNwc3JjX3N0cmVhbV9zZXR1cF9ydHApLAorCShnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksIChmaW5kX3N0cmVhbSksCisJKGdzdF9ydHNwc3JjX2xvb3ApLCAoZ3N0X3J0c3BzcmNfb3BlbiksIChnc3RfcnRzcHNyY19wbGF5KSwKKwkoZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlKToKKwlGaXggY2FzZSB3aGVyZSBvdXRwYWQgY291bGQgbm90IGJlIGRlY2lkZWQuCisKKzIwMDUtMDYtMjkgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9NYWtlZmlsZS5hbSAoTUFEX0RJUik6IEFkZCBtYWQgdG8gdGhlIGJ1aWxkLgorCisyMDA1LTA2LTI4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX3NyY19saW5rKToKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2luaXQpOgorCUZpeCBvbGQgUlBBRCBtYWNyby4KKwliYXNlc3JjIC0+IGJhc2Vfc3JjCisKKzIwMDUtMDYtMjcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X2lkM190YWdfc3JjX2xpbmspOgorCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfY2hhaW4pOgorCVJQQURfIC0+IFBBRAorCUZpeCBhcmdzIGluIGJ1ZmZlcmFsbG9jIGZ1bmN0aW9uIGNhbGwuCisJTWFrZXMgdGhlIG1hZCBwbHVnaW4gY29tcGlsZSBhZ2FpbgorCisyMDA1LTA2LTI3ICBPd2VuIEZyYXNlci1HcmVlbiAgPG93ZW5AZGlzY29iYWJlLm5ldD4KKworCSogZ3N0L3JlYWxtZWRpYS9ybWRlbXV4LmM6IFJld3JvdGUgdG8gdXNlIGdzdGFkYXB0ZXIuIEFsc28gcGFyc2VzCisJYXVkaW8gYW5kIHZpZGVvIGhlYWRlciBwYWNrZXRzIGZvciBrbm93biBwcm9wZXJ0aWVzLgorCisyMDA1LTA2LTIzICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BfcHJvdG9fZ2V0X3R5cGUpLAorCShnc3RfcnRzcHNyY19jbGFzc19pbml0KSwgKGdzdF9ydHNwc3JjX2NyZWF0ZV9zdHJlYW0pLAorCShnc3RfcnRzcHNyY19hZGRfZWxlbWVudCksIChnc3RfcnRzcHNyY19zZXRfc3RhdGUpLAorCShnc3RfcnRzcHNyY19zdHJlYW1fc2V0dXBfcnRwKSwKKwkoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV90cmFuc3BvcnQpLCAoZmluZF9zdHJlYW0pLAorCShnc3RfcnRzcHNyY19sb29wKSwgKGdzdF9ydHNwc3JjX29wZW4pLCAoZ3N0X3J0c3BzcmNfcGxheSksCisJKGdzdF9ydHNwc3JjX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvcnRzcC9ydHNwdXJsLmM6IChydHNwX3VybF9wYXJzZSk6CisJTWFrZSBydHNwc3JjIGEgbGl2ZSBzb3VyY2UuCisJRG9uJ3QgdHJ5IHRvIHBhcnNlIE5VTEwgdXJscy4KKworMjAwNS0wNi0yMyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2luaXQpOgorCU1ha2UgdWRwc3JjIGEgbGl2ZSBzb3VyY2UuCisKKzIwMDUtMDYtMDIgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdWRwL01ha2VmaWxlLmFtOgorCVVzZSB2ZXJzaW9uZWQgbmV0IGxpYi4KKworMjAwNS0wNi0wMiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC91ZHAvTWFrZWZpbGUuYW06CisJRml4IGhhY2sgaW4gbWFrZWZpbGUuCisKKzIwMDUtMDYtMDIgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IEZpbmlzaCBwb3J0aW5nIHRvIDAuOTogbm8gbW9yZSBnc3RkYXRhLAorCWNoZWNrIGZvciBsaW5rIGZ1bmN0aW9ucyBiZWZvcmUgY2FsbGluZyB0aGVtLCBnaXZlCisJZ3N0X21lc3NhZ2VfbmV3X3RhZyBpdHMgb3duIGNvcHkgb2YgdGhlIHRhZyBsaXN0LCBzZXQgdGhlIHBhcnNlcgorCXN0YXRlIGJlZm9yZSBzZW5kaW5nIHRoZSBldmVudCAoYmVjYXVzZSBpbiAwLjkgZXZlbnRzIGFyZQorCXByb2Nlc3NlZCBpbW1lZGlhdGVseSksIGNhc3RpbmcgZml4ZXMuCisKKwkqIGV4dC9tYWQvTWFrZWZpbGUuYW0gKGxpYmdzdG1hZF9sYV9MREZMQUdTKTogTGluayB3aXRoCisJZ3N0dGFnZWRpdC4KKworMjAwNS0wNi0wMiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC91ZHAvTWFrZWZpbGUuYW06CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19nZXRfdHlwZSksCisJKGdzdF9tdWx0aXVkcHNpbmtfYmFzZV9pbml0KSwgKGdzdF9tdWx0aXVkcHNpbmtfY2xhc3NfaW5pdCksCisJKGdzdF9tdWx0aXVkcHNpbmtfaW5pdCksIChnc3RfbXVsdGl1ZHBzaW5rX2ZpbmFsaXplKSwKKwkoZ3N0X211bHRpdWRwc2lua19nZXRfdGltZXMpLCAoZ3N0X211bHRpdWRwc2lua19yZW5kZXIpLAorCShnc3RfbXVsdGl1ZHBzaW5rX3NldF9wcm9wZXJ0eSksIChnc3RfbXVsdGl1ZHBzaW5rX2luaXRfc2VuZCksCisJKGdzdF9tdWx0aXVkcHNpbmtfYWRkKSwgKGNsaWVudF9jb21wYXJlKSwgKGZyZWVfY2xpZW50KSwKKwkoZ3N0X211bHRpdWRwc2lua19yZW1vdmUpLCAoZ3N0X211bHRpdWRwc2lua19jbGVhciksCisJKGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3N0YXRzKToKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2dldF90eXBlKSwKKwkoZ3N0X3VkcHNyY19iYXNlX2luaXQpLCAoZ3N0X3VkcHNyY19jbGFzc19pbml0KSwKKwkoZ3N0X3VkcHNyY19jcmVhdGUpLCAoZ3N0X3VkcHNyY19zZXRfdXJpKSwgKGdzdF91ZHBzcmNfc3RhcnQpLAorCShnc3RfdWRwc3JjX3VubG9jayksIChnc3RfdWRwc3JjX3N0b3ApOgorCVVzZSBOZXRCdWZmZXIgYW5kIHNtYWxsIGNsZWFudXBzLgorCUltcGxlbWVudCBjbGllbnQgcmVtb3ZhbCBpbiBtdWx0aXVkcHNpbmsuCisKKzIwMDUtMDYtMDIgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcnRzcC9SRUFETUU6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcF9wcm90b19nZXRfdHlwZSksCisJKGdzdF9ydHNwc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3J0c3BzcmNfY3JlYXRlX3N0cmVhbSksCisJKGdzdF9ydHNwc3JjX2FkZF9lbGVtZW50KSwgKGdzdF9ydHNwc3JjX3NldF9zdGF0ZSksCisJKGdzdF9ydHNwc3JjX3N0cmVhbV9zZXR1cF9ydHApLAorCShnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksIChmaW5kX3N0cmVhbSksCisJKGdzdF9ydHNwc3JjX2xvb3ApLCAoZ3N0X3J0c3BzcmNfb3BlbiksIChnc3RfcnRzcHNyY19wbGF5KSwKKwkoZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC9ydHNwL3J0c3B0cmFuc3BvcnQuYzogKHJ0c3BfdHJhbnNwb3J0X25ldyksCisJKHJ0c3BfdHJhbnNwb3J0X2luaXQpLCAocGFyc2VfbW9kZSksIChwYXJzZV9yYW5nZSksCisJKHJ0c3BfdHJhbnNwb3J0X3BhcnNlKSwgKHJ0c3BfdHJhbnNwb3J0X2ZyZWUpOgorCVJUU1AgY2xlYW51cHMuCisKKzIwMDUtMDYtMDIgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5jOiAoZ3N0X3F1YXJrdHZfY2hhaW4pOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOiAoZ3N0X2dvb21fY2hhaW4pOgorCSogZ3N0L3ZpZGVvYm94L01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X2NsYXNzX2luaXQpLAorCShnc3RfdmlkZW9fYm94X2luaXQpLCAoZ3N0X3ZpZGVvX2JveF9zaW5rX3NldGNhcHMpLAorCShnc3RfdmlkZW9fYm94X2NoYWluKToKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZpbHRlci5jOiAoZ3N0X3ZpZGVvZmlsdGVyX2NoYWluKToKKwkqIGdzdC92aWRlb3JhdGUvZ3N0dmlkZW9yYXRlLmM6IChnc3RfdmlkZW9yYXRlX2NsYXNzX2luaXQpLAorCShnc3RfdmlkZW9yYXRlX2dldGNhcHMpLCAoZ3N0X3ZpZGVvcmF0ZV9zZXRjYXBzKSwKKwkoZ3N0X3ZpZGVvcmF0ZV9pbml0KSwgKGdzdF92aWRlb3JhdGVfZXZlbnQpLCAoZ3N0X3ZpZGVvcmF0ZV9jaGFpbiksCisJKGdzdF92aWRlb3JhdGVfY2hhbmdlX3N0YXRlKToKKwlCdWZmZXJhbGxvYyBjaGFuZ2VzLgorCisyMDA1LTA1LTI1ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfY2hhaW4pLCAoZ3N0X21hZF9jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L3NpZHBsYXkvZ3N0c2lkZGVjLmNjOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6IChnc3RfYWxwaGFfY2hhaW4pOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOiAoZ3N0X2dvb21fY2hhaW4pOgorCU5vIG5lZWQgdG8gdGFrZSB0aGUgbG9jayBhbnltb3JlLCAgY29yZSBhbHJlYWR5IGRpZAorCXRoYXQgYmVmb3JlIGNhbGxpbmcgdXMuCisKKzIwMDUtMDUtMjUgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvYW1ybmIvYW1ybmJkZWMuYzogKGdzdF9hbXJuYmRlY19pbml0KSwgKGdzdF9hbXJuYmRlY19jaGFpbiksCisJKGdzdF9hbXJuYmRlY19zdGF0ZV9jaGFuZ2UpOgorCSogZXh0L2Ftcm5iL2Ftcm5iZW5jLmM6IChnc3RfYW1ybmJlbmNfYmFzZV9pbml0KSwKKwkoZ3N0X2Ftcm5iZW5jX2ZpbmFsaXplKSwgKGdzdF9hbXJuYmVuY19jaGFpbiksCisJKGdzdF9hbXJuYmVuY19zdGF0ZV9jaGFuZ2UpOgorCSogZXh0L2Ftcm5iL2Ftcm5icGFyc2UuYzogKGdzdF9hbXJuYnBhcnNlX2luaXQpLAorCShnc3RfYW1ybmJwYXJzZV9xdWVyeSksIChnc3RfYW1ybmJwYXJzZV9jaGFpbiksCisJKGdzdF9hbXJuYnBhcnNlX3JlYWRfaGVhZGVyKSwgKGdzdF9hbXJuYnBhcnNlX2xvb3ApLAorCShnc3RfYW1ybmJwYXJzZV9zaW5rX2FjdGl2YXRlKSwgKGdzdF9hbXJuYnBhcnNlX3N0YXRlX2NoYW5nZSk6CisJQ29yZSBhbHJlYWR5IHRvb2sgdGhlIGxvY2suCisKKzIwMDUtMDUtMTkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9lc2QvTWFrZWZpbGUuYW06CisJICBEaXNhYmxlIHRjcCBlbGVtZW50cyBhbmQgZXNkbW9uICh0aGV5IGRvbid0IGNvbXBpbGUpLgorCisyMDA1LTA1LTE5ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogc3lzL01ha2VmaWxlLmFtOgorCSAgTWFrZSBteSBhdXRvbWFrZSB2ZXJzaW9uIHNodXQgdXAgYWJvdXQgdW5kZWZpbmVkIHZhcmlhYmxlcworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSAgR3N0QWRhcHRlciBtb3ZlZCB0byBiYXNlIG9iamVjdHMuIAorCisyMDA1LTA1LTE4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L2Ftcm5iL01ha2VmaWxlLmFtOgorCSogZXh0L2Ftcm5iL2Ftcm5iLmM6IChwbHVnaW5faW5pdCk6CisJKiBleHQvYW1ybmIvYW1ybmJkZWMuYzogKGdzdF9hbXJuYmRlY19pbml0KSwKKwkoZ3N0X2Ftcm5iZGVjX3NldGNhcHMpLCAoZ3N0X2Ftcm5iZGVjX2NoYWluKSwKKwkoZ3N0X2Ftcm5iZGVjX3N0YXRlX2NoYW5nZSk6CisJKiBleHQvYW1ybmIvYW1ybmJkZWMuaDoKKwkqIGV4dC9hbXJuYi9hbXJuYmVuYy5jOiAoZ3N0X2Ftcm5iZW5jX2dldF90eXBlKSwKKwkoZ3N0X2Ftcm5iZW5jX2Jhc2VfaW5pdCksIChnc3RfYW1ybmJlbmNfY2xhc3NfaW5pdCksCisJKGdzdF9hbXJuYmVuY19pbml0KSwgKGdzdF9hbXJuYmVuY19maW5hbGl6ZSksCisJKGdzdF9hbXJuYmVuY19zZXRjYXBzKSwgKGdzdF9hbXJuYmVuY19jaGFpbiksCisJKGdzdF9hbXJuYmVuY19zdGF0ZV9jaGFuZ2UpOgorCSogZXh0L2Ftcm5iL2Ftcm5iZW5jLmg6CisJKiBleHQvYW1ybmIvYW1ybmJwYXJzZS5jOiAoZ3N0X2Ftcm5icGFyc2VfaW5pdCksCisJKGdzdF9hbXJuYnBhcnNlX3F1ZXJ5KSwgKGdzdF9hbXJuYnBhcnNlX2V2ZW50KSwKKwkoZ3N0X2Ftcm5icGFyc2VfY2hhaW4pLCAoZ3N0X2Ftcm5icGFyc2VfcmVhZF9oZWFkZXIpLAorCShnc3RfYW1ybmJwYXJzZV9sb29wKSwgKGdzdF9hbXJuYnBhcnNlX3NpbmtfYWN0aXZhdGUpLAorCShnc3RfYW1ybmJwYXJzZV9zdGF0ZV9jaGFuZ2UpOgorCSogZXh0L2Ftcm5iL2Ftcm5icGFyc2UuaDoKKwlQb3J0ZWQgQU1SIGRlY29kZXIvcGFyc2UuCisJQWRkZWQgQU1SIGVuY29kZXIuCisKKzIwMDUtMDUtMTggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QvZ29vbS9NYWtlZmlsZS5hbToKKwkqIGdzdC9nb29tL2dzdGdvb20uYzogKGdzdF9nb29tX2luaXQpLCAoZ3N0X2dvb21fc2lua19zZXRjYXBzKSwKKwkoZ3N0X2dvb21fc3JjX3NldGNhcHMpLCAoZ3N0X2dvb21fc3JjX25lZ290aWF0ZSksIChnc3RfZ29vbV9ldmVudCksCisJKGdzdF9nb29tX2NoYWluKSwgKGdzdF9nb29tX2NoYW5nZV9zdGF0ZSksIChwbHVnaW5faW5pdCk6CisJUG9ydGVkIGdvb20uCisJQWRkZWQgZ29vbSBhbmQgYWxwaGEgdG8gYnVpbGQuCisKKzIwMDUtMDUtMTcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QvYWxwaGEvTWFrZWZpbGUuYW06CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzogKGdzdF9hbHBoYV9jbGFzc19pbml0KSwgKGdzdF9hbHBoYV9pbml0KSwKKwkoZ3N0X2FscGhhX3Npbmtfc2V0Y2FwcyksIChnc3RfYWxwaGFfY2hhaW4pOgorCVBvcnRlZCBhbHBoYSwgIHJlbW92ZSBhbHBoYWNvbG9yIGFzIGZ1bmN0aW9uYWxpdHkgaXMgaW4KKwlmZm1wZWdjb2xvcnNwYWNlLgorCisyMDA1LTA1LTE3ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzogKGdzdF9jYWNhc2lua19zZXRjYXBzKSwKKwkoZ3N0X2NhY2FzaW5rX3JlbmRlciksIChnc3RfY2FjYXNpbmtfb3BlbiksIChnc3RfY2FjYXNpbmtfY2xvc2UpLAorCShnc3RfY2FjYXNpbmtfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmg6CisJQ2xlYW51cHMuCisKKzIwMDUtMDUtMTUgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCU1vdmUgY29yZSBwbHVnaW5zIG91dCBvZiBjb3JlLiAgSSBkb24ndCBtaW5kIGZkc3JjL2Zkc2luaworCWdvaW5nIGJhY2sgaW50byB0aGUgY29yZTsgdGhleSB3ZXJlIGp1c3QgZGlzYWJsZWQgdGhlcmUsIHNvCisJSSBtb3ZlZCB0aGVtLiAgU29tZSBvZiB0aGlzIHN0dWZmIGNvdWxkIChzaG91bGQpIGJlIGRlbGV0ZWQuCisJKiBnc3Qvb2xkY29yZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9vbGRjb3JlL2dzdGFnZ3JlZ2F0b3IuYzoKKwkqIGdzdC9vbGRjb3JlL2dzdGFnZ3JlZ2F0b3IuaDoKKwkqIGdzdC9vbGRjb3JlL2dzdGVsZW1lbnRzLmM6CisJKiBnc3Qvb2xkY29yZS9nc3RmZHNpbmsuYzoKKwkqIGdzdC9vbGRjb3JlL2dzdGZkc2luay5oOgorCSogZ3N0L29sZGNvcmUvZ3N0ZmRzcmMuYzoKKwkqIGdzdC9vbGRjb3JlL2dzdGZkc3JjLmg6CisJKiBnc3Qvb2xkY29yZS9nc3RtZDVzaW5rLmM6CisJKiBnc3Qvb2xkY29yZS9nc3RtZDVzaW5rLmg6CisJKiBnc3Qvb2xkY29yZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkqIGdzdC9vbGRjb3JlL2dzdG11bHRpZmlsZXNyYy5oOgorCSogZ3N0L29sZGNvcmUvZ3N0cGlwZWZpbHRlci5jOgorCSogZ3N0L29sZGNvcmUvZ3N0cGlwZWZpbHRlci5oOgorCSogZ3N0L29sZGNvcmUvZ3N0c2hhcGVyLmM6CisJKiBnc3Qvb2xkY29yZS9nc3RzaGFwZXIuaDoKKwkqIGdzdC9vbGRjb3JlL2dzdHN0YXRpc3RpY3MuYzoKKwkqIGdzdC9vbGRjb3JlL2dzdHN0YXRpc3RpY3MuaDoKKworMjAwNS0wNS0xMyAgQ2hyaXN0aWFuIFNjaGFsbGVyICA8dXJhZXVzQGdub21lLm9yZz4KKworCSogZXh0L01ha2VmaWxlLmFtOiBkaXN0IGVzZCBkaXJlY3RvcnkKKwkqIGdzdC1wbHVnaW5zLnNwZWMuaW46IGFkZCBydHAgcGx1Z2lucyBhbmQgZXNkIHBsdWdpbgorCSogZ3N0L2VmZmVjdHYvTWFrZWZpbGUuYW06IGZpeCB2aWRlb2ZpbHRlciBsaW5raW5nCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOiBhZGQgbWlzc2luZyBoZWFkZXJzIAorCSogZ3N0L3J0c3AvTWFrZWZpbGUuYW06IGFkZCBtaXNzaW5nIGhlYWRlcnMKKworMjAwNS0wNS0xMiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9zaWRwbGF5L2dzdHNpZGRlYy5jYzoKKwlBZGQgd29ya2luZyBwbHVnaW5zIHRvIGJ1aWxkLgorCU1ha2Ugc2lkcGxheSBjb21waWxlIGFnYWluLgorCisyMDA1LTA1LTEyICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX3NyY19xdWVyeSk6CisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9jaGFpbik6CisJRml4IG1hZCBhbmQgaWQzdGFnIGNvbXBpbGF0aW9uIGFnYWluLgorCisyMDA1LTA1LTEyICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3VkcC8uY3ZzaWdub3JlOgorCSogZ3N0L3VkcC9NYWtlZmlsZS5hbToKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChnc3RfbXVsdGl1ZHBzaW5rX2dldF90eXBlKSwKKwkoZ3N0X211bHRpdWRwc2lua19iYXNlX2luaXQpLCAoZ3N0X211bHRpdWRwc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X211bHRpdWRwc2lua19pbml0KSwgKGdzdF9tdWx0aXVkcHNpbmtfZmluYWxpemUpLAorCShnc3RfbXVsdGl1ZHBzaW5rX2dldF90aW1lcyksIChnc3RfbXVsdGl1ZHBzaW5rX3JlbmRlciksCisJKGdzdF9tdWx0aXVkcHNpbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X211bHRpdWRwc2lua19pbml0X3NlbmQpLCAoZ3N0X211bHRpdWRwc2lua19jbG9zZSksCisJKGdzdF9tdWx0aXVkcHNpbmtfYWRkKSwgKGdzdF9tdWx0aXVkcHNpbmtfcmVtb3ZlKSwKKwkoZ3N0X211bHRpdWRwc2lua19jbGVhciksIChnc3RfbXVsdGl1ZHBzaW5rX2dldF9zdGF0cyksCisJKGdzdF9tdWx0aXVkcHNpbmtfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJKiBnc3QvdWRwL2dzdHVkcC1tYXJzaGFsLmxpc3Q6CisJKiBnc3QvdWRwL2dzdHVkcC5jOiAocGx1Z2luX2luaXQpOgorCSogZ3N0L3VkcC9nc3R1ZHAuaDoKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5jOiAoZ3N0X3VkcHNpbmtfZ2V0X3R5cGUpLAorCShnc3RfdWRwc2lua19iYXNlX2luaXQpLCAoZ3N0X3VkcHNpbmtfY2xhc3NfaW5pdCksCisJKGdzdF91ZHBzaW5rX2luaXQpLCAoZ3N0X3VkcHNpbmtfc2V0X3VyaSksCisJKGdzdF91ZHBzaW5rX3NldF9wcm9wZXJ0eSksIChnc3RfdWRwc2lua19nZXRfcHJvcGVydHkpLAorCShnc3RfdWRwc2lua191cmlfZ2V0X3R5cGUpLCAoZ3N0X3VkcHNpbmtfdXJpX2dldF9wcm90b2NvbHMpLAorCShnc3RfdWRwc2lua191cmlfZ2V0X3VyaSksIChnc3RfdWRwc2lua191cmlfc2V0X3VyaSksCisJKGdzdF91ZHBzaW5rX3VyaV9oYW5kbGVyX2luaXQpOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmg6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19nZXRfdHlwZSksCisJKGdzdF91ZHBzcmNfYmFzZV9pbml0KSwgKGdzdF91ZHBzcmNfY2xhc3NfaW5pdCksCisJKGdzdF91ZHBzcmNfY3JlYXRlKSwgKGdzdF91ZHBzcmNfc2V0X3VyaSksIChnc3RfdWRwc3JjX3N0YXJ0KSwKKwkoZ3N0X3VkcHNyY191bmxvY2spLCAoZ3N0X3VkcHNyY19zdG9wKToKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmg6CisJQWRkZWQgbXVsdGlmZHNpbmsgdG8gc2VuZCBVRFAgdG8gbXVsdGlwbGUgYWRkcmVzc2VzLgorCUNsZWFuZWQgdXAgVURQIHNvdXJjZS9zaW5rIGVsZW1lbnRzIHNvbWUgbW9yZS4KKwlNYWtlIFVEUCBzaW5rIGV4dGVuZHMgZnJvbSBtdWx0aXVkcHNpbmsuCisKKzIwMDUtMDUtMTIgIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfc3JjX3F1ZXJ5KSwgKGdzdF9tYWRfc2lua19ldmVudCk6CisJICBNYWtlIHF1ZXJpZXMgYWN0dWFsbHkgd29yayAodXBkYXRlIGNvcmUgZmlyc3QpLgorCisyMDA1LTA1LTEyICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3J0c3AvUkVBRE1FOgorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzcmMuYzogKGdzdF90Y3BjbGllbnRzcmNfZ2V0X3R5cGUpLAorCShnc3RfdGNwY2xpZW50c3JjX2Jhc2VfaW5pdCksIChnc3RfdGNwY2xpZW50c3JjX2NsYXNzX2luaXQpLAorCShnc3RfdGNwY2xpZW50c3JjX2luaXQpLCAoZ3N0X3RjcGNsaWVudHNyY19nZXRjYXBzKSwKKwkoZ3N0X3RjcGNsaWVudHNyY19zdG9wKSwgKGdzdF90Y3BjbGllbnRzcmNfZW9zKSwKKwkoZ3N0X3RjcGNsaWVudHNyY19jcmVhdGUpLCAoZ3N0X3RjcGNsaWVudHNyY19zdGFydCk6CisJKiBnc3QvdGNwL2dzdHRjcGNsaWVudHNyYy5oOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzcmMuYzogKGdzdF90Y3BzZXJ2ZXJzcmNfZ2V0X3R5cGUpLAorCShnc3RfdGNwc2VydmVyc3JjX2Jhc2VfaW5pdCksIChnc3RfdGNwc2VydmVyc3JjX2NsYXNzX2luaXQpLAorCShnc3RfdGNwc2VydmVyc3JjX2luaXQpLCAoZ3N0X3RjcHNlcnZlcnNyY19jcmVhdGUpLAorCShnc3RfdGNwc2VydmVyc3JjX3N0YXJ0KSwgKGdzdF90Y3BzZXJ2ZXJzcmNfc3RvcCk6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNyYy5oOgorCSogZ3N0L3RjcC9nc3R0Y3BzcmMuYzogKGdzdF90Y3BzcmNfZ2V0X3R5cGUpLAorCShnc3RfdGNwc3JjX2Jhc2VfaW5pdCksIChnc3RfdGNwc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3RjcHNyY19pbml0KSwKKwkoZ3N0X3RjcHNyY19jcmVhdGUpLCAoZ3N0X3RjcHNyY19zdGFydCksIChnc3RfdGNwc3JjX3N0b3ApOgorCSogZ3N0L3RjcC9nc3R0Y3BzcmMuaDoKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5jOiAoZ3N0X3VkcHNpbmtfYmFzZV9pbml0KSwKKwkoZ3N0X3VkcHNpbmtfaW5pdCksIChnc3RfdWRwc2lua19nZXRfdGltZXMpLCAoZ3N0X3VkcHNpbmtfcmVuZGVyKSwKKwkoZ3N0X3VkcHNpbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF91ZHBzaW5rX2dldF9wcm9wZXJ0eSksCisJKGdzdF91ZHBzaW5rX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvdWRwL2dzdHVkcHNpbmsuaDoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2dldF90eXBlKSwKKwkoZ3N0X3VkcHNyY19iYXNlX2luaXQpLCAoZ3N0X3VkcHNyY19jbGFzc19pbml0KSwgKGdzdF91ZHBzcmNfaW5pdCksCisJKGdzdF91ZHBzcmNfY3JlYXRlKSwgKGdzdF91ZHBzcmNfc2V0X3VyaSksIChnc3RfdWRwc3JjX3N0YXJ0KSwKKwkoZ3N0X3VkcHNyY19zdG9wKToKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmg6CisJTWFrZSBVRFAgYW5kIFRDUCBlbGVtZW50cyB1c2UgUHVzaFNyYy4KKworCisyMDA1LTA1LTExICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX2luaXQpLCAoZ3N0X21hZF9zcmNfcXVlcnkpLAorCShpbmRleF9zZWVrKSwgKG5vcm1hbF9zZWVrKSwgKGdzdF9tYWRfc2lua19ldmVudCk6CisJICBQb3J0IHRvIG5ldyBxdWVyeSBBUEkgYW5kIHJlcGxhY2UgZ3N0X3BhZF9jb252ZXJ0KCkKKwkgIGFuZCBnc3RfcGFkX2dldF9mb3JtYXRzKCkgdXNhZ2UuIGdzdGlkM3RhZyBsb29rcyBsaWtlCisJICBpdCBuZWVkcyBzb21lIG1vcmUgbG92ZSBiZWZvcmUgaXQgd2lsbCB3b3JrIGFnYWluLCBpZiAKKwkgIG5vdCBhIHJld3JpdGUuCisKKzIwMDUtMDUtMTIgIFplZXNoYW4gQWxpICA8emVlbml4QGdtYWlsLmNvbT4KKworCSogZ3N0L2VmZmVjdHYvTWFrZWZpbGUuYW06CisJRml4ZWQgdGhlIGVmZmVjdHYgYnVpbGQgYWdhaW4uCisKKzIwMDUtMDUtMTEgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL01ha2VmaWxlLmFtOgorCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5jOiAoZ3N0X211bHRpZmRzaW5rX2dldF90eXBlKSwKKwkoZ3N0X211bHRpZmRzaW5rX2Jhc2VfaW5pdCksIChnc3RfbXVsdGlmZHNpbmtfY2xhc3NfaW5pdCksCisJKGdzdF9tdWx0aWZkc2lua19pbml0KSwgKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50X3dyaXRlKSwKKwkoZ3N0X211bHRpZmRzaW5rX3F1ZXVlX2J1ZmZlciksIChnc3RfbXVsdGlmZHNpbmtfcmVuZGVyKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmg6CisJKiBnc3QvdGNwL2dzdHRjcC5jOgorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzaW5rLmM6IChnc3RfdGNwY2xpZW50c2lua19nZXRfdHlwZSksCisJKGdzdF90Y3BjbGllbnRzaW5rX2Jhc2VfaW5pdCksIChnc3RfdGNwY2xpZW50c2lua19jbGFzc19pbml0KSwKKwkoZ3N0X3RjcGNsaWVudHNpbmtfaW5pdCksIChnc3RfdGNwY2xpZW50c2lua19yZW5kZXIpLAorCShnc3RfdGNwY2xpZW50c2lua19zZXRfcHJvcGVydHkpLCAoZ3N0X3RjcGNsaWVudHNpbmtfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3RjcGNsaWVudHNpbmtfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c2luay5oOgorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzcmMuYzogKGdzdF90Y3BjbGllbnRzcmNfY2xhc3NfaW5pdCksCisJKGdzdF90Y3BjbGllbnRzcmNfaW5pdF9yZWNlaXZlKToKKwkqIGdzdC90Y3AvZ3N0dGNwcGx1Z2luLmM6IChwbHVnaW5faW5pdCk6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNpbmsuYzogKGdzdF90Y3BzZXJ2ZXJzaW5rX2NsYXNzX2luaXQpOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzaW5rLmg6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNyYy5jOiAoZ3N0X3RjcHNlcnZlcnNyY19jbGFzc19pbml0KToKKwkqIGdzdC90Y3AvZ3N0dGNwc2luay5jOiAoZ3N0X3RjcHNpbmtfZ2V0X3R5cGUpLAorCShnc3RfdGNwc2lua19iYXNlX2luaXQpLCAoZ3N0X3RjcHNpbmtfY2xhc3NfaW5pdCksCisJKGdzdF90Y3BzaW5rX3NldGNhcHMpLCAoZ3N0X3RjcHNpbmtfaW5pdCksIChnc3RfdGNwc2lua19nZXRfdGltZXMpLAorCShnc3RfdGNwc2lua19yZW5kZXIpLCAoZ3N0X3RjcHNpbmtfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3RjcHNpbmtfZ2V0X3Byb3BlcnR5KToKKwkqIGdzdC90Y3AvZ3N0dGNwc2luay5oOgorCSogZ3N0L3RjcC9nc3R0Y3BzcmMuYzogKGdzdF90Y3BzcmNfY2xhc3NfaW5pdCksIChnc3RfdGNwc3JjX2dldCk6CisJUG9ydGVkIG92ZXIgc29tZSBzaW5rIGVsZW1lbnRzLgorCVNvdXJjZXMgbm90IHBvcnRlZCB5ZXQgYXMgdGhleSByZXF1aXJlIGEgUHVzaFNvdXJjZSBiYXNlIGNsYXNzLgorCisyMDA1LTA1LTExICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisKKwkqIGdzdC9lZmZlY3R2L01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvZmlsdGVyL01ha2VmaWxlLmFtOgorCSAgVHVybiB2aWRlb2ZpbHRlciBpbnRvIGEgbGlicmFyeSAocHJpdmF0ZSBmb3Igbm93KQorCisyMDA1LTA1LTExICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3J0c3AvUkVBRE1FOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BfcHJvdG9fZ2V0X3R5cGUpLAorCShnc3RfcnRzcHNyY19jbGFzc19pbml0KSwgKGdzdF9ydHNwc3JjX2NyZWF0ZV9zdHJlYW0pLAorCShnc3RfcnRzcHNyY19hZGRfZWxlbWVudCksIChnc3RfcnRzcHNyY19zZXRfc3RhdGUpLAorCShnc3RfcnRzcHNyY19zdHJlYW1fc2V0dXBfcnRwKSwKKwkoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV90cmFuc3BvcnQpLCAoZmluZF9zdHJlYW0pLAorCShnc3RfcnRzcHNyY19sb29wKSwgKGdzdF9ydHNwc3JjX29wZW4pLCAoZ3N0X3J0c3BzcmNfcGxheSk6CisJKiBnc3QvcnRzcC9ydHNwLmg6CisJKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOiAocnRzcF9jb25uZWN0aW9uX2NyZWF0ZSksCisJKHJ0c3BfY29ubmVjdGlvbl9zZW5kKSwgKHJlYWRfbGluZSksIChwYXJzZV9yZXF1ZXN0X2xpbmUpLAorCShwYXJzZV9saW5lKSwgKHJlYWRfYm9keSksIChydHNwX2Nvbm5lY3Rpb25fcmVjZWl2ZSksCisJKHJ0c3BfY29ubmVjdGlvbl9mcmVlKToKKwkqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmg6CisJKiBnc3QvcnRzcC9ydHNwZGVmcy5jOiAocnRzcF9maW5kX21ldGhvZCk6CisJKiBnc3QvcnRzcC9ydHNwZGVmcy5oOgorCSogZ3N0L3J0c3AvcnRzcG1lc3NhZ2UuYzogKHJ0c3BfbWVzc2FnZV9zZXRfYm9keSksCisJKHJ0c3BfbWVzc2FnZV90YWtlX2JvZHkpOgorCSogZ3N0L3J0c3AvcnRzcG1lc3NhZ2UuaDoKKwkqIGdzdC9ydHNwL3J0c3BzdHJlYW0uaDoKKwkqIGdzdC9ydHNwL3NkcG1lc3NhZ2UuYzogKHNkcF9wYXJzZV9saW5lKToKKwlBZGRlZCBSRUFETUUKKwlTb21lIGNsZWFudXBzLgorCisyMDA1LTA1LTExICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BfcHJvdG9fZ2V0X3R5cGUpLAorCShnc3RfcnRzcHNyY19jbGFzc19pbml0KSwgKGdzdF9ydHNwc3JjX2luaXQpLAorCShnc3RfcnRzcHNyY19jcmVhdGVfc3RyZWFtKSwgKGdzdF9ydHNwc3JjX2FkZF9lbGVtZW50KSwKKwkoZ3N0X3J0c3BzcmNfc2V0X3N0YXRlKSwgKGdzdF9ydHNwc3JjX3N0cmVhbV9zZXR1cF9ydHApLAorCShnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksIChmaW5kX3N0cmVhbSksCisJKGdzdF9ydHNwc3JjX2xvb3ApLCAoZ3N0X3J0c3BzcmNfb3BlbiksIChnc3RfcnRzcHNyY19jbG9zZSksCisJKGdzdF9ydHNwc3JjX3BsYXkpLCAoZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwlTZXR1cCBVRFAgc291cmNlcyBjb3JyZWN0bHksIHJlY2VpdmVzIHJhdyBkYXRhIGZyb20gUlRTUAorCWNvbXBsaWFudCBzZXJ2ZXJzIG5vdy4KKworMjAwNS0wNS0xMSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9ydHNwLy5jdnNpZ25vcmU6CisJKiBnc3QvcnRzcC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHNwL2dzdHJ0c3AuYzogKHBsdWdpbl9pbml0KToKKwkqIGdzdC9ydHNwL2dzdHJ0c3AuaDoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwX3Byb3RvX2dldF90eXBlKSwKKwkoZ3N0X3J0c3BzcmNfZ2V0X3R5cGUpLCAoZ3N0X3J0c3BzcmNfYmFzZV9pbml0KSwKKwkoZ3N0X3J0c3BzcmNfY2xhc3NfaW5pdCksIChnc3RfcnRzcHNyY19pbml0KSwKKwkoZ3N0X3J0c3BzcmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9ydHNwc3JjX2dldF9wcm9wZXJ0eSksCisJKGdzdF9ydHNwc3JjX2NyZWF0ZV9zdHJlYW0pLCAocnRzcHNyY19hZGRfZWxlbWVudCksCisJKGdzdF9ydHNwc3JjX3N0cmVhbV9zZXR1cF9ydHApLAorCShnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksIChmaW5kX3N0cmVhbSksCisJKGdzdF9ydHNwc3JjX2xvb3ApLCAoZ3N0X3J0c3BzcmNfc2VuZCksIChnc3RfcnRzcHNyY19vcGVuKSwKKwkoZ3N0X3J0c3BzcmNfY2xvc2UpLCAoZ3N0X3J0c3BzcmNfcGxheSksIChnc3RfcnRzcHNyY19wYXVzZSksCisJKGdzdF9ydHNwc3JjX2FjdGl2YXRlKSwgKGdzdF9ydHNwc3JjX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJKiBnc3QvcnRzcC9ydHNwLmg6CisJKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOiAocnRzcF9jb25uZWN0aW9uX29wZW4pLAorCShydHNwX2Nvbm5lY3Rpb25fY3JlYXRlKSwgKGFwcGVuZF9oZWFkZXIpLCAocnRzcF9jb25uZWN0aW9uX3NlbmQpLAorCShyZWFkX2xpbmUpLCAocmVhZF9zdHJpbmcpLCAocmVhZF9rZXkpLCAocGFyc2VfcmVzcG9uc2Vfc3RhdHVzKSwKKwkocGFyc2VfbGluZSksIChyZWFkX2JvZHkpLCAocnRzcF9jb25uZWN0aW9uX3JlY2VpdmUpLAorCShydHNwX2Nvbm5lY3Rpb25fY2xvc2UpOgorCSogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uaDoKKwkqIGdzdC9ydHNwL3J0c3BkZWZzLmM6IChydHNwX2luaXRfc3RhdHVzKSwgKHJ0c3BfbWV0aG9kX2FzX3RleHQpLAorCShydHNwX2hlYWRlcl9hc190ZXh0KSwgKHJ0c3Bfc3RhdHVzX2FzX3RleHQpLAorCShydHNwX3N0YXR1c190b19zdHJpbmcpLCAocnRzcF9maW5kX2hlYWRlcl9maWVsZCk6CisJKiBnc3QvcnRzcC9ydHNwZGVmcy5oOgorCSogZ3N0L3J0c3AvcnRzcG1lc3NhZ2UuYzogKHJ0c3BfbWVzc2FnZV9uZXdfcmVxdWVzdCksCisJKHJ0c3BfbWVzc2FnZV9pbml0X3JlcXVlc3QpLCAocnRzcF9tZXNzYWdlX25ld19yZXNwb25zZSksCisJKHJ0c3BfbWVzc2FnZV9pbml0X3Jlc3BvbnNlKSwgKHJ0c3BfbWVzc2FnZV9pbml0X2RhdGEpLAorCShydHNwX21lc3NhZ2VfYWRkX2hlYWRlciksIChydHNwX21lc3NhZ2VfcmVtb3ZlX2hlYWRlciksCisJKHJ0c3BfbWVzc2FnZV9nZXRfaGVhZGVyKSwgKHJ0c3BfbWVzc2FnZV9nZXRfaGVhZGVyX2NvcHkpLAorCShydHNwX21lc3NhZ2Vfc2V0X2JvZHkpLCAocnRzcF9tZXNzYWdlX3NldF9ib2R5X2NvcHkpLAorCShydHNwX21lc3NhZ2VfZ2V0X2JvZHkpLCAocnRzcF9tZXNzYWdlX2dldF9ib2R5X2NvcHkpLCAoZHVtcF9tZW0pLAorCShkdW1wX2tleV92YWx1ZSksIChydHNwX21lc3NhZ2VfZHVtcCk6CisJKiBnc3QvcnRzcC9ydHNwbWVzc2FnZS5oOgorCSogZ3N0L3J0c3AvcnRzcHN0cmVhbS5oOgorCSogZ3N0L3J0c3AvcnRzcHRyYW5zcG9ydC5jOiAocnRzcF90cmFuc3BvcnRfbmV3KSwKKwkocnRzcF90cmFuc3BvcnRfaW5pdCksIChwYXJzZV9tb2RlKSwgKHBhcnNlX3JhbmdlKSwKKwkocnRzcF90cmFuc3BvcnRfcGFyc2UpLCAocnRzcF90cmFuc3BvcnRfZnJlZSk6CisJKiBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0Lmg6CisJKiBnc3QvcnRzcC9ydHNwdXJsLmM6IChydHNwX3VybF9wYXJzZSksIChydHNwX3VybF9mcmVlKToKKwkqIGdzdC9ydHNwL3J0c3B1cmwuaDoKKwkqIGdzdC9ydHNwL3NkcC5oOgorCSogZ3N0L3J0c3Avc2RwbWVzc2FnZS5jOiAoc2RwX21lc3NhZ2VfbmV3KSwgKHNkcF9tZXNzYWdlX2luaXQpLAorCShzZHBfbWVzc2FnZV9jbGVhbiksIChzZHBfbWVzc2FnZV9mcmVlKSwgKHNkcF9tZWRpYV9uZXcpLAorCShzZHBfbWVkaWFfaW5pdCksIChzZHBfbWVzc2FnZV9zZXRfb3JpZ2luKSwKKwkoc2RwX21lc3NhZ2VfZ2V0X29yaWdpbiksIChzZHBfbWVzc2FnZV9zZXRfY29ubmVjdGlvbiksCisJKHNkcF9tZXNzYWdlX2dldF9jb25uZWN0aW9uKSwgKHNkcF9tZXNzYWdlX2FkZF9iYW5kd2lkdGgpLAorCShzZHBfbWVzc2FnZV9hZGRfdGltZSksIChzZHBfbWVzc2FnZV9hZGRfem9uZSksCisJKHNkcF9tZXNzYWdlX3NldF9rZXkpLCAoc2RwX21lc3NhZ2VfZ2V0X2tleSksCisJKHNkcF9tZXNzYWdlX2dldF9hdHRyaWJ1dGVfdmFsKSwgKHNkcF9tZXNzYWdlX2FkZF9hdHRyaWJ1dGUpLAorCShzZHBfbWVzc2FnZV9hZGRfbWVkaWEpLCAoc2RwX21lZGlhX2FkZF9hdHRyaWJ1dGUpLAorCShzZHBfbWVkaWFfYWRkX2JhbmR3aWR0aCksIChzZHBfbWVkaWFfYWRkX2Zvcm1hdCksCisJKHNkcF9tZWRpYV9nZXRfYXR0cmlidXRlX3ZhbCksIChyZWFkX3N0cmluZyksIChyZWFkX3N0cmluZ19kZWwpLAorCShzZHBfcGFyc2VfbGluZSksIChzZHBfbWVzc2FnZV9wYXJzZV9idWZmZXIpLCAocHJpbnRfbWVkaWEpLAorCShzZHBfbWVzc2FnZV9kdW1wKToKKwkqIGdzdC9ydHNwL3NkcG1lc3NhZ2UuaDoKKwkqIGdzdC9ydHNwL3Rlc3QuYzogKG1haW4pOgorCVBvcnRlZCB0byAwLjkuCisJU2V0IHVwIHRyYW5zcG9ydHMsIGluaXQgVURQIHBvcnRzLCBpbml0IFJUUCBzZXNzaW9uIG1hbmFnZXJzLgorCisyMDA1LTA1LTExICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6IChwbHVnaW5faW5pdCk6CisJKiBnc3QvcnRwL2dzdHJ0cGRlYy5jOiAoZ3N0X3J0cGRlY19nZXRfdHlwZSksCisJKGdzdF9ydHBkZWNfY2xhc3NfaW5pdCksIChnc3RfcnRwZGVjX2luaXQpLCAoZ3N0X3J0cGRlY19jaGFpbl9ydHApLAorCShnc3RfcnRwZGVjX2NoYWluX3J0Y3ApLCAoZ3N0X3J0cGRlY19zZXRfcHJvcGVydHkpLAorCShnc3RfcnRwZGVjX2dldF9wcm9wZXJ0eSksIChnc3RfcnRwZGVjX2NoYW5nZV9zdGF0ZSksCisJKGdzdF9ydHBkZWNfcGx1Z2luX2luaXQpOgorCSogZ3N0L3J0cC9nc3RydHBkZWMuaDoKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5jOiAoZ3N0X3VkcHNpbmtfYmFzZV9pbml0KSwKKwkoZ3N0X3VkcHNpbmtfZ2V0X3RpbWVzKSwgKGdzdF91ZHBzaW5rX3JlbmRlciksCisJKGdzdF91ZHBzaW5rX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19nZXRfdHlwZSksCisJKGdzdF91ZHBzcmNfYmFzZV9pbml0KSwgKGdzdF91ZHBzcmNfY2xhc3NfaW5pdCksIChnc3RfdWRwc3JjX2luaXQpLAorCShnc3RfdWRwc3JjX2xvb3ApLCAoZ3N0X3VkcHNyY19zZXRfdXJpKSwgKGdzdF91ZHBzcmNfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3VkcHNyY19nZXRfcHJvcGVydHkpLCAoZ3N0X3VkcHNyY19pbml0X3JlY2VpdmUpLAorCShnc3RfdWRwc3JjX2FjdGl2YXRlKSwgKGdzdF91ZHBzcmNfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3VkcHNyY191cmlfZ2V0X3R5cGUpLCAoZ3N0X3VkcHNyY191cmlfZ2V0X3Byb3RvY29scyksCisJKGdzdF91ZHBzcmNfdXJpX2dldF91cmkpLCAoZ3N0X3VkcHNyY191cmlfc2V0X3VyaSksCisJKGdzdF91ZHBzcmNfdXJpX2hhbmRsZXJfaW5pdCk6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCVVEUCBmaXhlcywgYWRkZWQgdXJpIGhhbmRsZXIuCisJQWRkZWQgcnRwZGVjIHRoYXQgd2lsbCBtYW5hZ2UgdGhlIFJUUCBzZXNzaW9uIGluIHRoZSBmdXR1cmUuCisKKzIwMDUtMDUtMTAgIEFyd2VkIHYuIE1lcmthdHogIDx2Lm1lcmthdHpAZ214Lm5ldD4KKworCSogUE9SVEVEXzA5OgorCSogY29uZmlndXJlLmFjOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L2VzZC9NYWtlZmlsZS5hbToKKwkqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfZ2V0X3R5cGUpLAorCShnc3RfZXNkc2lua19jbGFzc19pbml0KSwgKGdzdF9lc2RzaW5rX2luaXQpLAorCShnc3RfZXNkc2lua19kaXNwb3NlKSwgKGdzdF9lc2RzaW5rX2NoYW5nZV9zdGF0ZSksCisJKGdzdF9jYXBzX3NldF9lYWNoKSwgKGdzdF9lc2RzaW5rX2dldGNhcHMpLCAoZ3N0X2VzZHNpbmtfb3BlbiksCisJKGdzdF9lc2RzaW5rX2Nsb3NlKSwgKGdzdF9lc2RzaW5rX3dyaXRlKSwgKGdzdF9lc2RzaW5rX2RlbGF5KSwKKwkoZ3N0X2VzZHNpbmtfcmVzZXQpLCAoZ3N0X2VzZHNpbmtfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X2VzZHNpbmtfZ2V0X3Byb3BlcnR5KSwgKGdzdF9lc2RzaW5rX2ZhY3RvcnlfaW5pdCk6CisJKiBleHQvZXNkL2VzZHNpbmsuaDoKKwkqIGV4dC9lc2QvZ3N0ZXNkLmM6IChwbHVnaW5faW5pdCk6CisJUG9ydGVkIGVzZHNpbmsgcGx1Z2luCisKKzIwMDUtMDUtMTAgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdWRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6IChnc3RfdWRwc2lua19nZXRfdHlwZSksCisJKGdzdF91ZHBzaW5rX2Jhc2VfaW5pdCksIChnc3RfdWRwc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X3VkcHNpbmtfaW5pdCksIChnc3RfdWRwc2lua19nZXRfdGltZXMpLCAoZ3N0X3VkcHNpbmtfcmVuZGVyKSwKKwkoZ3N0X3VkcHNpbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF91ZHBzaW5rX2dldF9wcm9wZXJ0eSksCisJKGdzdF91ZHBzaW5rX2luaXRfc2VuZCksIChnc3RfdWRwc2lua19jbG9zZSksCisJKGdzdF91ZHBzaW5rX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvdWRwL2dzdHVkcHNpbmsuaDoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2Jhc2VfaW5pdCksCisJKGdzdF91ZHBzcmNfY2xhc3NfaW5pdCksIChnc3RfdWRwc3JjX2luaXQpLCAoZ3N0X3VkcHNyY19sb29wKSwKKwkoZ3N0X3VkcHNyY19zZXRfcHJvcGVydHkpLCAoZ3N0X3VkcHNyY19nZXRfcHJvcGVydHkpLAorCShnc3RfdWRwc3JjX2luaXRfcmVjZWl2ZSksIChnc3RfdWRwc3JjX2Nsb3NlKSwKKwkoZ3N0X3VkcHNyY19hY3RpdmF0ZSksIChnc3RfdWRwc3JjX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCVBvcnRlZCB1ZHAgc3JjL3NpbmsuCisKKzIwMDUtMDUtMDkgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogUE9SVEVEXzA5OgorCSogY29uZmlndXJlLmFjOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L3Nob3V0Mi9NYWtlZmlsZS5hbToKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmM6IChnc3Rfc2hvdXQyc2VuZF9nZXRfdHlwZSksCisJKGdzdF9zaG91dDJzZW5kX2Jhc2VfaW5pdCksIChnc3Rfc2hvdXQyc2VuZF9jbGFzc19pbml0KSwKKwkoZ3N0X3Nob3V0MnNlbmRfaW5pdCksIChnc3Rfc2hvdXQyc2VuZF9ldmVudCksCisJKGdzdF9zaG91dDJzZW5kX3JlbmRlciksIChnc3Rfc2hvdXQyc2VuZF9zZXRfcHJvcGVydHkpLAorCShnc3Rfc2hvdXQyc2VuZF9nZXRfcHJvcGVydHkpLCAoZ3N0X3Nob3V0MnNlbmRfc2V0Y2FwcyksCisJKGdzdF9zaG91dDJzZW5kX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5oOgorCisJUG9ydCBzaG91dDIgcGx1Z2luCisKKzIwMDUtMDUtMDggIFplZXNoYW4gQWxpICAgPHplZW5peEBnbWFpbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkqIGV4dC9saWJjYWNhL01ha2VmaWxlLmFtOgorCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzogKGdzdF9jYWNhc2lua19nZXRfdHlwZSksCisJKGdzdF9jYWNhc2lua19jbGFzc19pbml0KSwgKGdzdF9jYWNhc2lua19nZXRfdGltZXMpLAorCShnc3RfY2FjYXNpbmtfc2V0Y2FwcyksIChnc3RfY2FjYXNpbmtfaW5pdCksIChnc3RfY2FjYXNpbmtfcmVuZGVyKSwKKwkocGx1Z2luX2luaXQpOgorCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuaDoKKwlQb3J0ZWQgdGhlIGxpYmNhY2EgcGx1Z2luLgorCisyMDA1LTA1LTA4ICBaZWVzaGFuIEFsaSAgPHplZW5peEBnbWFpbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9tYWQvTWFrZWZpbGUuYW06CisJKiBlZmZlY3R2L01ha2VmaWxlLmFtOgorCUZpeGVkIGEgZmV3IHRoaW5ncyB0byBlbmFibGUgdGhlIG1hZCBhbmQgZWZmZWN0diB0byBiZSBhYmxlIHRvIGZpbmQgdGhlCisJaGVhZGVycyBpbiB0aGUgZ3N0LXBsdWdpbnMtYmFzZS9nc3QtbGlicyBhbmQgdG8gbGluayBhZ2FpbnN0IHRoZSBsaWJzCisJaW4gdGhlcmUuCisKKzIwMDUtMDUtMDcgIFplZXNoYW4gQWxpICA8emVlbml4QGdtYWlsLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCUZpeGVkIHRoZSBidWlsZCBieSBmaXhpbmcgYSBzbWFsbCBtaXN0YWtlIG9mIFdpbS4KKwkKKzIwMDUtMDUtMDYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvYWFsaWIvTWFrZWZpbGUuYW06CisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6IChnc3RfYWFzaW5rX2dldF90eXBlKSwKKwkoZ3N0X2Fhc2lua19jbGFzc19pbml0KSwgKGdzdF9hYXNpbmtfZml4YXRlKSwgKGdzdF9hYXNpbmtfc2V0Y2FwcyksCisJKGdzdF9hYXNpbmtfaW5pdCksIChnc3RfYWFzaW5rX2dldF90aW1lcyksIChnc3RfYWFzaW5rX3JlbmRlciksCisJKGdzdF9hYXNpbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF9hYXNpbmtfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X2Fhc2lua19vcGVuKSwgKGdzdF9hYXNpbmtfY2xvc2UpLCAoZ3N0X2Fhc2lua19jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L2FhbGliL2dzdGFhc2luay5oOgorCSogZ3N0L3NtcHRlL01ha2VmaWxlLmFtOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6IChnc3Rfc21wdGVfc2V0Y2FwcyksIChnc3Rfc21wdGVfaW5pdCksCisJKGdzdF9zbXB0ZV9jb2xsZWN0ZWQpOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmg6CisJUG9ydGVkIDIgbW9yZSBwbHVnaW5zLiB1c2dseSBoYWNrIGluIHRoZSBNYWtlZmlsZS5hbSB0aG91Z2gsIEknbQorCXN1cmUgc29tZW9uZSB3aWxsIGZpeCBpdC4KKworMjAwNS0wNS0wNiAgQ2hyaXN0aWFuIFNjaGFsbGVyICA8dXJhZXVzQGdub21lLm9yZz4KKworCSogY29uZmlndXJlLmFjOiBhZGQgc2lkcGxheQorCSogZXh0L01ha2VmaWxlLmFtOiBhZGQgc2lkcGxheQorCSogZXh0L3NpZHBsYXkvTWFrZWZpbGUuYW06IGFkZCBHU1RfUExVR0lOU19DRkxBR1MKKwkqIGV4dC9zaWRwbGF5L2dzdHNpZGRlYy5jYzogcmVtb3ZlIGJ5dGVzdHJlYW0uaAorCisyMDA1LTA1LTA2ICBDaHJpc3RpYW4gU2NoYWxsZXIgIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBjb25maWd1cmUuYWM6IGFkZCBnc3QtcGx1Z2lucy1saWJzCisKKzIwMDUtMDUtMDYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvc2lkcGxheS9nc3RzaWRkZWMuY2M6CisJKiBleHQvc2lkcGxheS9nc3RzaWRkZWMuaDoKKwlQb3J0ZWQgc2lkcGxheS4KKworMjAwNS0wNS0wNiAgQ2hyaXN0aWFuIFNjaGFsbGVyICA8dXJhZXVzQGdub21lLm9yZz4KKworCSogY29uZmlndXJlLmFjOiAKKwkqIGV4dC9tYWQvTWFrZWZpbGUuYW06IGFkZCBsaW5raW5nIG9mIGdzdGludGVyZmFjZXMKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChwbHVnaW5faW5pdCk6IHJlbW92ZSBsaWJyYXJ5X2xvYWQKKwkqIGdzdC1wbHVnaW5zLnNwZWMuaW46IAorCSogZ3N0L2VmZmVjdHYvTWFrZWZpbGUuYW06IGxpbmsgdG8gbGliZ3N0dmlkZW9maWx0ZXIKKwkqIGdzdC9lZmZlY3R2L2dzdGVmZmVjdHYuYzogKHBsdWdpbl9pbml0KTogc2FtZSBhcyBmb3IgbWFkCisJKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06IG1ha2Ugc3VyZSB2aWRlb2ZsaXAgaXMgbm90IGJ1aWx0CisKKzIwMDUtMDUtMDYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6IChhbGF3ZGVjX2dldGNhcHMpLCAoYWxhd2RlY19zZXRjYXBzKSwKKwkoZ3N0X2FsYXdkZWNfaW5pdCksIChnc3RfYWxhd2RlY19jaGFpbik6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6IChhbGF3ZW5jX2dldGNhcHMpLCAoYWxhd2VuY19zZXRjYXBzKSwKKwkoZ3N0X2FsYXdlbmNfaW5pdCksIChnc3RfYWxhd2VuY19jaGFpbik6CisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOiAobXVsYXdkZWNfZ2V0Y2FwcyksIChtdWxhd2RlY19zZXRjYXBzKSwKKwkoZ3N0X211bGF3ZGVjX2luaXQpLCAoZ3N0X211bGF3ZGVjX2NoYWluKToKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6IChtdWxhd2VuY19nZXRjYXBzKSwgKG11bGF3ZW5jX3NldGNhcHMpLAorCShnc3RfbXVsYXdlbmNfaW5pdCksIChnc3RfbXVsYXdlbmNfY2hhaW4pOgorCVBvcnRlZCBhbGF3IGFuZCBtdWxhdyBwbHVnaW5zIHRvIDAuOSwgZml4ZWQgdGhlIG5lZ290aWF0aW9uIGFzCisJd2VsbC4KKworMjAwNS0wNS0wNiAgQ2hyaXN0aWFuIFNjaGFsbGVyICA8dXJhZXVzQGdub21lLm9yZz4KKworCSogZXh0L2Fsc2E6IHJlbW92ZWQgcGx1Z2lucyB0aGF0IGFyZSBub3cgaW4gZ3N0LXBsdWdpbnMtYmFzZQorCSogZXh0L2dub21ldmZzOgorCSogZXh0L3RoZW9yYToKKwkqIGV4dC92b3JiaXM6CisJKiBnc3QvYWRkZXI6CisJKiBnc3QvYXVkaW9jb252ZXJ0OgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2U6CisJKiBnc3QvdHlwZWZpbmQ6CisJKiBnc3QvdmlkZW9maWx0ZXI6IGNvbW1lbnQgb3V0IHZpZGVvZmxpcCBhbmQgZ2FtbWEgcGx1Z2lucworCisyMDA1LTA1LTA2ICBDaHJpc3RpYW4gU2NoYWxsZXIgIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtbGliczogUmVtb3ZlIGFsbCBmaWxlcyBhcyB0aGlzIGlzIGluIGdzdC1wbHVnaW5zLWJhc2Ugbm93CisJKiBnc3QtbGlicy9SRUFETUU6IGFkZCBhIHJlbW92ZSBpbmZvcm1pbmcgb2YgdGhpcyBtb3ZlCisKKzIwMDUtMDUtMDYgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4gCisKKwkqIFBPUlRFRF8wOTogdXBkYXRlIHRvIGFkZCB2aWRlb2ZpbHRlcgorCSogY29uZmlndXJlLmFjOiByZS1hZGQgdmlkZW9maWx0ZXIKKwkqIGdzdC92aWRlb2ZpbHRlci9NYWtlZmlsZS5hbTogcmVtb3ZlIHZpZGVvYmFsYW5jZSAobm90IHBvcnRlZCB5ZXQpCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzogKGdzdF9nYW1tYV9jbGFzc19pbml0KToKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzogKGdzdF92aWRlb2JhbGFuY2VfY2xhc3NfaW5pdCk6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9maWx0ZXIuYzogKGdzdF92aWRlb2ZpbHRlcl9nZXRjYXBzKSwKKwkoZ3N0X3ZpZGVvZmlsdGVyX3NldGNhcHMpLCAoZ3N0X3ZpZGVvZmlsdGVyX2luaXQpLAorCShnc3RfdmlkZW9maWx0ZXJfY2hhaW4pLCAoZ3N0X3ZpZGVvZmlsdGVyX3NldF9vdXRwdXRfc2l6ZSk6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6IChnc3RfdmlkZW9mbGlwX2NsYXNzX2luaXQpOgorCisyMDA1LTA1LTA2ICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGV4dC9tYWQ6IHBvcnRlZCBwbHVnaW4gZnJvbSB0aHJlYWRlZCBicmFuY2gKKwkqIGdzdC9lZmZlY3R2OiBwb3J0ZWQgcGx1Z2lucyBmcm9tIHRocmVhZGVkIGJyYW5jaAorCSogZ3N0L2xhdzogZW5hYmxlIGxhdyBwbHVnaW4gYXMgaXQgY29tcGlsZXMgKFdpbSB3aWxsIGZpeG9yKQorCisyMDA1LTA1LTA2ICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwlmaXggdHlwbworCisyMDA1LTA1LTA1ICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIFVwZGF0ZSBjb25maWd1cmUuYWMgYW5kIE1ha2VmaWxlcyB0byBvbmx5IGJ1aWxkIHdoYXQgaXMgYWN0dWFsbHkKKwlwb3J0ZWQgYW5kIG5vdCBtb3ZlZCBpbnRvIGdzdC1wbHVnaW5zLWJhc2UKKworMjAwNS0wMi0yMiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgaHVudGluZyBzZWFzb24gb24gMC45IGlzIG5vdyBPUEVOCisKKzIwMDUtMDItMjIgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5jOiAoZ3N0X29zc2VsZW1lbnRfY2xhc3NfcHJvYmVfZGV2aWNlcyk6CisJICBLaWNrIHRoZSBoZWxsIG91dCBvZiBnY2MgZm9yIG5vdCB3YXJuaW5nIG1lIGFib3V0IGEgc3ltYm9sIGNvbmZsaWN0LgorCisyMDA1LTAyLTIyICBMdWNhIE9nbmliZW5lICA8bHVvZ25pQHRpbi5pdD4KKworCVJldmlld2VkIGJ5OiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisKKwkqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmM6IChnc3RfcGl4YnVmc2NhbGVfbGluayk6CisJICBEb24ndCBsZWFrIGNhcHMgc3RyaW5nIChmaXhlcyAjMTY4MTM0KQorCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6IChnc3RfanBlZ2VuY19jbGFzc19pbml0KSwKKwkoZ3N0X2pwZWdlbmNfaW5pdCksIChnc3RfanBlZ2VuY19maW5hbGl6ZSksCisJKGdzdF9qcGVnZW5jX2NoYW5nZV9zdGF0ZSk6CisJICBEb24ndCBsZWFrIGxpbmUgYnVmZmVycyBhbmQgY29udGV4dCBzdHJ1Y3QgKGZpeGVzICMxNjgxMzMpLgorCisyMDA1LTAyLTIxICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9kaXJhYy9nc3RkaXJhY2RlYy5jYzoKKwkoZ3N0X2RpcmFjZGVjX2NoYWluKToKKwkgIFNpbmNlIGRpcmFjIDAuNS4wIHRoZSBmcmFtZXJhdGUgaW4gZGlyYWMgaXMgZXhwcmVzc2VkIGFzIGEKKwkgIHJhdGlvbmFsIG51bWJlci4gRml4IGJ1aWxkIGFuZCB1cCByZXF1aXJlbWVudCB0byAwLjUuMCwgYW5kCisJICBhbHNvIHBhc3MgcGFyYW1ldGVycyB0byBnc3RfZGlyYWNkZWNfbGluayBpbiB0aGUgcmlnaHQgb3JkZXIKKwkgIChmaXhlcyAjMTY3OTU5KS4KKworMjAwNS0wMi0yMSAgTWFjaWVqIEthdGFmaWFzeiAgPG1hdGhyaWNrQGZyZWVkZXNrdG9wLm9yZz4KKworCSogZXh0L2ZhYWQvZ3N0ZmFhZC5jOiAoZ3N0X2ZhYWRfc2lua2Nvbm5lY3QpLCAoZ3N0X2ZhYWRfY2hhaW4pOgorCSogZXh0L2ZhYWQvZ3N0ZmFhZC5oOgorCVRFSCBMT05HRVNUIERFQlVHR0lORyBTRVNTSU9OIEVWQVIgaXMgb3Zlci4gRml4IGludGVyYWN0aW9uIHdpdGggCisJY2VydGFpbiBpbnZhbGlkIG11eGVkIHN0cmVhbXMsIHdoZXJlIHNvbWUgcGFja2V0cyB3aWxsIGNvbnRhaW4gCisJanVuayBhZnRlciBkZWNvZGVyIGRhdGEuIFBhcnRpYWxseSBmaXhlcyAjMTQ5MTU4LgorCisyMDA1LTAyLTIxICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKwkqIGdzdC9kdmRscGNtZGVjL2dzdGR2ZGxwY21kZWMuYzogKGdzdF9kdmRscGNtZGVjX2NoYWluKToKKyAgICAgICAgICBNYWtlIHN1cmUgd2Ugb25seSB3cml0ZSB0byB3cml0YWJsZSBidWZmZXJzCisKKzIwMDUtMDItMjAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOgorCShnc3RfcmlmZl9jcmVhdGVfYXVkaW9fY2Fwc193aXRoX2RhdGEpOgorCSAgRG8gYWN0dWFsbHkgZml4IGludmFsaWQgUklGRiBmbXQgaGVhZGVyIHZhbHVlcyBmb3IgYWxhdworCSAgYW5kIG11bGF3IGF1ZGlvIGluc3RlYWQgb2YganVzdCBzYXlpbmcgc28uCisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2ZtdCk6CisJICBHaXZlIGdzdF9yaWZmX2NyZWF0ZV9hdWRpb19jYXBzX3dpdGhfZGF0YSgpIGEgY2hhbmNlIHRvCisJICBmaXggdXAgYnJva2VuIGZvcm1hdCBoZWFkZXIgZmllbGRzIGJlZm9yZSBleHRyYWN0aW5nIGFueQorCSAgcGFyYW1ldGVycyBmcm9tIHRoZSBoZWFkZXIuIChmaXhlcyAjMTY3NjMzKQorCisyMDA1LTAyLTE5ICBNYXJ0aW4gSG9sdGVycyAgPG1hcnRpbi5ob2x0ZXJzQGdteC5kZT4KKworCVJldmlld2VkIGJ5OiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvYnVmZmVyZnJhbWVzY29udmVydC5jOgorCShidWZmZXJfZnJhbWVzX2NvbnZlcnRfbGluayk6CisJICBEb24ndCBsZWFrIG90aGVyY2Fwcy4gKGZpeGVzICMxNjc4NzgpCisKKzIwMDUtMDItMTkgIEFyd2VkIHYuIE1lcmthdHogIDx2Lm1lcmthdHpAZ214Lm5ldD4+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9saWJ2aXN1YWwvdmlzdWFsLmM6IChnc3RfdmlzdWFsX3NyY2xpbmspLAorCShnc3RfdmlzdWFsX2NoYW5nZV9zdGF0ZSk6CisJICBTdXBwb3J0IGxpYnZpc3VhbCAwLjIuMC4KKworMjAwNS0wMi0xOCAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6IChnc3RfanBlZ2RlY19jaGFpbik6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6IChnc3RfanBlZ2VuY19yZXN5bmMpLCAoZ3N0X2pwZWdlbmNfY2hhaW4pOgorCSAgVXNlIHNhbWUgcm93c3RyaWRlcyBmb3IgSTQyMCBhcyB1c2VkIGV2ZXJ5d2hlcmUgZWxzZS4KKworMjAwNS0wMi0xNyAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2ludmVydCk6CisJICBEZWNsYXJlIHZhcmlhYmxlcyBhdCBiZWdpbm5pbmcgb2YgYmxvY2sgYW5kIG1ha2UgZ2NjLTIuOTUgaGFwcHkKKwkgIChmaXhlcyAjIDE2NzQ4MiwgcGF0Y2ggYnkgR2VyZ2VseSBOYWd5KS4KKwkgIAorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzcmMuYzoKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c3JjLmg6CisJICBNb3ZlIHNvbWUgaW5jbHVkZXMgaW50byB0aGUgaGVhZGVyLCBzbyB0aGF0IHN0cnVjdCBzb2NrYWRkcl9pbiBpcworCSAgZGVmaW5lZCB3aGVuIGl0IHNob3VsZCBiZSBkZWZpbmVkIG9uIEZyZWVCU0QgYXMgd2VsbCAoZml4ZXMKKwkgICMxNjc0ODMpLgorCSAgCisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNyYy5jOiAoZ3N0X3RjcHNlcnZlcnNyY19pbml0X3JlY2VpdmUpOgorCSAgRG9uJ3QgcGFzcyB1bmluaXRpYWxpc2VkIHZhbHVlcyB0byBzZXRzb2Nrb3B0KCkgaGVyZSBlaXRoZXIuCisKKzIwMDUtMDItMTcgIEx1Y2EgT2duaWJlbmUgIDxsdW9nbmkgYXQgdGluIGRvdCBpdD4KKworCVJldmlld2VkIGJ5OiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc2luay5jOiAoZ3N0X3RjcHNlcnZlcnNpbmtfaW5pdF9zZW5kKToKKwkgIERvbid0IHBhc3MgdW5pbml0aWFsaXNlZCB2YWx1ZXMgdG8gc2V0c29ja29wdCgpLiAoZml4ZXMgIzE2NzcwNCkKKworMjAwNS0wMi0xNiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGFkZF9zaW5rKToKKwkgIEludmVydCBiaW5fYWRkL2xpbmsgb3JkZXIgdG8gd29ya2Fyb3VuZCBkZWFkbG9jayBpbiBvcHQuCisKKzIwMDUtMDItMTUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9tb2RwbHVnL2dzdG1vZHBsdWcuY2M6CisJICBBZGQgbWlzc2luZyBicmVhayBjYXVzaW5nIHBvc2l0aW9uIHF1ZXJpZXMgdG8gZmFpbC4KKworMjAwNS0wMi0xNSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19wYWRfcG9wdWxhdGUpOgorCSAgR3JhbnBvcyBjYW4gYXBwYXJlbnRseSBiZSAtMSwgd2hpY2ggc2NyZXdzIHVwIGNhbGN1bGF0aW9ucy4uLgorCisyMDA1LTAyLTE2ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfY2hhaW4pLAorCShnc3RfeGltYWdlc2lua19zZW5kX3BlbmRpbmdfbmF2aWdhdGlvbiksCisJKGdzdF94aW1hZ2VzaW5rX25hdmlnYXRpb25fc2VuZF9ldmVudCksIChnc3RfeGltYWdlc2lua19maW5hbGl6ZSksCisJKGdzdF94aW1hZ2VzaW5rX2luaXQpOgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmg6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2NoYWluKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3NlbmRfcGVuZGluZ19uYXZpZ2F0aW9uKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX25hdmlnYXRpb25fc2VuZF9ldmVudCksCisJKGdzdF94dmltYWdlc2lua19maW5hbGl6ZSksIChnc3RfeHZpbWFnZXNpbmtfaW5pdCk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5oOgorCSAgVXNlIGEgbXV0ZXggcHJvdGVjdGVkIGxpc3QgdG8gbWFyc2hhbCBuYXZpZ2F0aW9uCisJICBldmVudHMgaW50byB0aGUgc3RyZWFtIHRocmVhZCBmcm9tIHdoaWNoZXZlciB0aHJlYWQKKwkgIHNlbmRzIHRoZW0uCisKKzIwMDUtMDItMTUgIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZ3N0L3NwZWVkL2RlbW8tbXAzLmM6ICh0aW1lX3RpY2tfY2IpLCAobWFpbik6CisJICBEaXNwbGF5IGN1cnJlbnQgcG9zaXRpb24gYW5kIHRyYWNrIGxlbmd0aDsgbWlzYy4gY2xlYW4tdXBzLgorCSAgCisJKiBnc3Qvc3BlZWQvZ3N0c3BlZWQuYzogKHNwZWVkX2dldF9xdWVyeV90eXBlcyksIChzcGVlZF9zcmNfcXVlcnkpLAorCShzcGVlZF9pbml0KSwgKHNwZWVkX2NoYWluKToKKwkgIEFkZCBxdWVyeSBmdW5jdGlvbiwgc28gdGhhdCB0aGUgc3RyZWFtIGxlbmd0aCBhbmQgY3VycmVudCBwb3NpdGlvbgorCSAgZ2V0IGFkanVzdGVkIHdoZW4gcXVlcmllZCAobm90ZSB0aGF0IGN1cnJlbnQgcG9zaXRpb24gcXVlcmllcyBtYXkKKwkgIHN0aWxsIGJlIHdyb25nIGlmIHRoZSBhdWRpbyBzaW5rIHJldHVybnMgdmFsdWVzIGJhc2VkIG9uIGJ1ZmZlcgorCSAgdGltZXN0YW1wcyBpbnN0ZWFkIG9mIHBhc3Npbmcgb24gdGhlIHF1ZXJ5KS4KKworMjAwNS0wMi0xMyAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOiAoZ3N0X2F1ZGlvX2NvbnZlcnRfbGluayksCisJKGdzdF9hdWRpb19jb252ZXJ0X2NoYW5uZWxzKToKKwkgIGNyZWF0ZSBjaGFubmVsIGNvbnZlcnNpb24gbWF0cml4IHdoZW4gbGlua2luZworCSogZ3N0L2F1ZGlvY29udmVydC8uY3ZzaWdub3JlOgorCSogZ3N0L2F1ZGlvY29udmVydC9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb2NvbnZlcnQvY2hhbm5lbG1peHRlc3QuYzogKG1haW4pOgorCSAgYWRkICh1Z2x5KSB0ZXN0IHRoYXQgZW5zdXJlcyBzdGVyZW8gPD0+IG1vbm8gY29udmVyc2lvbiB3b3JrcworCSAgY29ycmVjdGx5CisKKzIwMDUtMDItMTMgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L2F1ZGlvY29udmVydC9nc3RjaGFubmVsbWl4Lmg6CisJICBpbmNsdWRlIG1pc3NpbmcgaGVhZGVyIGZpbGUKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0Y2hhbm5lbG1peC5jOgorCShnc3RfYXVkaW9fY29udmVydF9maWxsX2NvbXBhdGlibGUpOgorCSAgdXNlIHNhbWUgc2lnbiBmb3IgYm90aCBjaGFubmVscyB3aGVuIGNvbnZlcnRpbmcgdG8vZnJvbSBjb21wYXRpYmxlCisJICBjaGFubmVsLiBQcmV2aW91c2x5IHVzZWQgZGlmZmVyZW50IHNpZ25zIG1hZGUgdGhlIHNpZ25hbHMgY2FuY2VsCisJICBlYWNoIG90aGVyIG91dCBhbmQgYXBwZWFyIGxpa2Ugc2lsZW5jZS4gKGZpeGVzICMxNjcyNjkpCisKKzIwMDUtMDItMTIgIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvYXZjb2RlYy5oOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29kZWNtYXAuYzoKKwkoZ3N0X2ZmbXBlZ19waXhmbXRfdG9fY2FwcyksIChnc3RfZmZtcGVnX2NhcHNfdG9fcGl4Zm10KSwKKwkoZ3N0X2ZmbXBlZ2NzcF9hdnBpY3R1cmVfZmlsbCk6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9pbWdjb252ZXJ0LmM6CisJICBDb252ZXJ0IHRvIGFuZCBmcm9tIFlWMTIgKGZpeGVzICMxNTYzNzkpLgorCisyMDA1LTAyLTEyICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfeHdpbmRvd19uZXcpLAorCShnc3RfeGltYWdlc2lua19zaW5rX2xpbmspLCAoZ3N0X3hpbWFnZXNpbmtfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3hpbWFnZXNpbmtfY2hhaW4pLCAoZ3N0X3hpbWFnZXNpbmtfc2V0X3h3aW5kb3dfaWQpLAorCShnc3RfeGltYWdlc2lua19leHBvc2UpLCAoZ3N0X3hpbWFnZXNpbmtfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3hpbWFnZXNpbmtfZmluYWxpemUpLCAoZ3N0X3hpbWFnZXNpbmtfaW5pdCk6IFByb3RlY3QgaW50ZXJmYWNlCisgICAgICAgIG1ldGhvZHMgZnJvbSBjaGFpbiBhbmQgbmVnb3RpYXRpb24gYW5kIHZpY2UgdmVyc2EgKEZpeGVzICMxNjYxNDIpLgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmg6IEFkZCBzdHJlYW1fbG9jay4KKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfc2lua19saW5rKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NoYWluKSwgKGdzdF94dmltYWdlc2lua19idWZmZXJfZnJlZSksCisJKGdzdF94dmltYWdlc2lua19idWZmZXJfYWxsb2MpLCAoZ3N0X3h2aW1hZ2VzaW5rX3NldF94d2luZG93X2lkKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2V4cG9zZSk6IENoZWNrIGZvciB4Y29udGV4dCBiZWZvcmUgdHJ5aW5nIHRvIGxpbmsuCisKKzIwMDUtMDItMTIgIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZXh0L2R2ZG5hdi9kdmRuYXZzcmMuYzogKGR2ZG5hdnNyY19vcGVuKToKKwkgIERvbid0IHNlbmQgIkhleSEgWW91IGdhdmUgbWUgYSBOVUxMIHBvaW50ZXIgeW91IG5hdWdodHkgcGVyc29uIiBhcworCSAgZXJyb3IgbWVzc2FnZSB3aGVuIHdlIGNhbid0IG9wZW4gdGhlIERWRCBkZXZpY2UgKHdoZW4gZHZkbmF2X29wZW4oKQorCSAgZmFpbHMsIHNyYy0+ZHZkbmF2IGlzIE5VTEwsIHNvIGR2ZG5hdl9lcnJfdG9fc3RyaW5nKCkgd2lsbCByZXR1cm4KKwkgIHRoZSBhYm92ZSkuIFNlbmQgc29tZXRoaW5nIG1vcmUgdXNlZnVsIGluc3RlYWQgKGZpeGVzICMxNjcxMTcpLgorCisyMDA1LTAyLTExICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfeHZpbWFnZV9wdXQpLAorCShnc3RfeHZpbWFnZXNpbmtfc2lua19saW5rKSwgKGdzdF94dmltYWdlc2lua19jaGFuZ2Vfc3RhdGUpLAorCShnc3RfeHZpbWFnZXNpbmtfY2hhaW4pLCAoZ3N0X3h2aW1hZ2VzaW5rX2J1ZmZlcl9mcmVlKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2J1ZmZlcl9hbGxvYyksIChnc3RfeHZpbWFnZXNpbmtfc2V0X3h3aW5kb3dfaWQpLAorCShnc3RfeHZpbWFnZXNpbmtfZXhwb3NlKSwgKGdzdF94dmltYWdlc2lua19zZXRfcHJvcGVydHkpLAorCShnc3RfeHZpbWFnZXNpbmtfZmluYWxpemUpLCAoZ3N0X3h2aW1hZ2VzaW5rX2luaXQpOiBQcm90ZWN0IGludGVyZmFjZQorCW1ldGhvZHMgZnJvbSBjaGFpbiBhbmQgbmVnb3RpYXRpb24gYW5kIHZpY2UgdmVyc2EgKEZpeGVzICMxNjYxNDIpLgorCUZpeCBhIHBvc3NpYmxlIGJ1ZyBvZiBpbWFnZXMgaW4gdGhlIGJ1ZmZlciBwb29sIGJlaW5nIGRpc2NhcmRlZCBiZWNhdXNlCisJd2UgYXJlIGxvb2tpbmcgYXQgdGhlIHdyb25nIGdlb21ldHJ5LgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuaDogQWRkIHN0cmVhbV9sb2NrLgorCisyMDA1LTAyLTExICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5jOiAoY3JvcF9idWZmZXIpOiBDaGFuZ2UgdWludCB0bworCXVuc2lnbmVkIGludC4gKGZpeGVzICMxNjcxMjgpCisKKzIwMDUtMDItMTEgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2xpYnJmYi9NYWtlZmlsZS5hbTogVGVzdGluZyBzdHVmZiBiZWZvcmUgY29tbWl0dGluZyBpcworCSAgZm9yIHdpbXBzLi4uIGFuZCBwZW9wbGUgd2l0aCBmYXN0IG1hY2hpbmVzLiAgRml4IHN0dXBpZAorCSAgbWlzdGFrZS4KKworMjAwNS0wMi0xMSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBjb25maWd1cmUuYWM6IFB1bGwgaW4gbGlicmZiIGZyb20gbXkgQ1ZTIHRyZWUsIGJlY2F1c2UgaXQgaXMKKwkgIHRvbyBzbWFsbCBhbmQgYW5ub3lpbmcgdG8gYmUgc2VwYXJhdGUuICBNb3ZlIHJmYnNyYyBwbHVnaW4KKwkgIHRvIGdzdC8uCisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvbGlicmZiL01ha2VmaWxlLmFtOgorCSogZXh0L2xpYnJmYi9nc3RyZmJzcmMuYzoKKwkqIGdzdC9saWJyZmIvTWFrZWZpbGUuYW06CisJKiBnc3QvbGlicmZiL2dzdHJmYnNyYy5jOgorCSogZ3N0L2xpYnJmYi9yZmIuYzoKKwkqIGdzdC9saWJyZmIvcmZiLmg6CisJKiBnc3QvbGlicmZiL3JmYmJ1ZmZlci5jOgorCSogZ3N0L2xpYnJmYi9yZmJidWZmZXIuaDoKKwkqIGdzdC9saWJyZmIvcmZiYnl0ZXN0cmVhbS5jOgorCSogZ3N0L2xpYnJmYi9yZmJieXRlc3RyZWFtLmg6CisJKiBnc3QvbGlicmZiL3JmYmNvbnRleHQuaDoKKwkqIGdzdC9saWJyZmIvcmZiZGVjb2Rlci5jOgorCSogZ3N0L2xpYnJmYi9yZmJkZWNvZGVyLmg6CisJKiBnc3QvbGlicmZiL3JmYnV0aWwuaDoKKworMjAwNS0wMi0xMCAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCisJKiBnc3Qvc3BlZWQvTWFrZWZpbGUuYW06CisJKiBnc3Qvc3BlZWQvZGVtby1tcDMuYzogKG1haW4pOgorCSogZ3N0L3NwZWVkL2ZpbHRlci5mdW5jOgorCSogZ3N0L3NwZWVkL2dzdHNwZWVkLmM6IChzcGVlZF9saW5rKSwgKHNwZWVkX3BhcnNlX2NhcHMpLAorCShzcGVlZF9jbGFzc19pbml0KSwgKHNwZWVkX2luaXQpLCAoc3BlZWRfY2hhaW5faW50MTYpLAorCShzcGVlZF9jaGFpbl9mbG9hdDMyKSwgKHNwZWVkX2NoYWluKSwgKHNwZWVkX3NldF9wcm9wZXJ0eSksCisJKHNwZWVkX2dldF9wcm9wZXJ0eSksIChzcGVlZF9jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L3NwZWVkL2dzdHNwZWVkLmg6CisJICBGaXggc3BlZWQgZWxlbWVudCBhbmQgbWFrZSBpdCBjaGFpbi1iYXNlZCAoZml4ZXMgIzE1NjQ2NyksCisJICBhbmQgbWFrZSBpdCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBjaGFubmVsLgorCisyMDA1LTAyLTEwICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGV4dC9kdHMvZ3N0ZHRzZGVjLmM6IChnc3RfZHRzZGVjX2luaXQpLCAoZ3N0X2R0c2RlY19jaGFubmVscyksCisJKGdzdF9kdHNkZWNfaGFuZGxlX2V2ZW50KSwgKGdzdF9kdHNkZWNfaGFuZGxlX2ZyYW1lKSwKKwkoZ3N0X2R0c2RlY19jaGFpbiksIChnc3RfZHRzZGVjX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvZHRzL2dzdGR0c2RlYy5oOgorICAgICAgICAgIERvbid0IGNsb2JiZXIgdGhlIHN0YWNrIGNvbnN0cnVjdGluZyB0aGUgY2hhbm5lbHMgYXJyYXkuCisJICBNYWtlIHRoZSBlbGVtZW50IGNoYWluLWJhc2VkLiBEVFMgdHJhY2tzIGNhbiBub3cgYmUgcGxheWVkLgorCSAgCisyMDA1LTAyLTA5ICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9hdWRpby9tdWx0aWNoYW5uZWwuaDoKKwkqIGdzdC1saWJzL2dzdC9nY29uZi9nY29uZi5oOgorCSogZ3N0LWxpYnMvZ3N0L2lkY3QvaWRjdC5oOgorCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby1wcml2Lmg6CisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5Lmg6CisJKiBnc3QtbGlicy9nc3QvcmVzYW1wbGUvcHJpdmF0ZS5oOgorCSogZ3N0LWxpYnMvZ3N0L3Jlc2FtcGxlL3Jlc2FtcGxlLmg6CisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLWlkcy5oOgorCSogZ3N0LWxpYnMvZ3N0L3ZpZGVvL3ZpZGVvLmg6CisJKiBnc3QtbGlicy9nc3QvdmlkZW8vdmlkZW9zaW5rLmg6CisJICBBZGQgR19CRUdJTl9ERUNMUyBhbmQgR19FTkRfREVDTFMgYXJvdW5kIGhlYWRlcnMgd2hlcmUKKwkgIG1pc3NpbmcsIHNvIHRoYXQgdGhleSB3b3JrIHdoZW4gaW5jbHVkZWQgZnJvbSBDKysgY29kZS4KKworMjAwNS0wMi0wOSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiB0ZXN0c3VpdGUvZ3N0LWxpbnQ6IENoZWNrIGZvciBub24tc3RhdGljYWxseSBzY29wZWQKKwkgIHBhcmVudF9jbGFzcyB2YXJpYWJsZXMuICBUaGlzIHdvbid0IGJlIGEgcHJvYmxlbSBvbmNlCisJICBwbHVnaW5zIGFyZSBsb2FkZWQgd2l0aCBSVExEX0xPQ0FMLgorCisyMDA1LTAyLTA5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbXBsZXgvZ3N0bXBsZXhpYml0c3RyZWFtLmNjOgorCSAgZ2NjIG1hZG5lc3MuCisKKzIwMDUtMDItMDkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9vZ2cvZ3N0b2dtcGFyc2UuYzoKKwkqIGdzdC9kZWJ1Zy9nc3RuYXZpZ2F0aW9udGVzdC5jOgorCSAgRGllLCB0aG91IGZhdWx0eSBzeW1ib2wgcG9sbHV0b3JzIChub24tc3RhdGljIHBhcmVudF9jbGFzcykuCisKKzIwMDUtMDItMDggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9tcGxleC9nc3RtcGxleGliaXRzdHJlYW0uY2M6CisJICBGaXggZXZlbnQgaGFuZGxpbmcgKCMxNjU1MjUpLgorCisyMDA1LTAyLTA4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbWlrbW9kL2dzdG1pa21vZC5jOgorCSogZ3N0L21vZHBsdWcvZ3N0bW9kcGx1Zy5jYzoKKwkgIEFkZCBtaXNzaW5nIGVuZGlhbm5lc3MgdG8gdGVtcGxhdGUgKGZpeGVzICMxNjU1MDkpLgorCisyMDA1LTAyLTA4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKGdzdF9hc2ZfZGVtdXhfaGFuZGxlX2RhdGEpOgorCSAgRml4IHdyb25nIG9yZGVyIG9mIHJlYWRpbmcgb2Ygb3B0aW9uYWwgYnl0ZXMgKCMxNjUyOTApLgorCisyMDA1LTAyLTA4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhc2luay5jOiAoZ3N0X2Fsc2Ffc2lua19jaGVja19ldmVudCk6CisJICBJbXBsZW1lbnQgRklMTEVSIGV2ZW50IGF3YXJlbmVzcy4KKworMjAwNS0wMi0wOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2NkcGFyYW5vaWEvZ3N0Y2RwYXJhbm9pYS5jOiAoY2RwYXJhbm9pYV9jb252ZXJ0KToKKwkgIEZpeCB0cmFjayBjYWxjdWxhdGlvbnMgKCMxNjYyMDgpLgorCisyMDA1LTAyLTA4ICBHZXJnZWx5IE5hZ3kgIDxhbGdlcm5vbkBib25laHVudGVyLnJ1bGV6Lm9yZz4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogKGdzdF9wbmdkZWNfaW5pdCksIChnc3RfcG5nZGVjX2NoYWluKToKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJICBGaXggYnl0ZS1vcmRlciwgdXNlIHByb3BlciBmaXhlZCBjYXBzLiBGaXhlcyAjMTY0MTk3LgorCisyMDA1LTAyLTA4ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEFkZCBkdmRscGNtZGVjIAorCisJKiBleHQvbXBlZzJkZWMvZ3N0bXBlZzJkZWMuYzogKGdzdF9tcGVnMmRlY19yZXNldCksCisJKGZyZWVfYWxsX2J1ZmZlcnMpLCAoZ3N0X21wZWcyZGVjX2FsbG9jX2J1ZmZlcik6CisJICBEb24ndCBwdXNoIGJ1ZmZlcnMgaWYgdGhlIHNyYyBwYWQgaXNuJ3QgbmVnb3RpYXRlZCB5ZXQuCisJICAKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6CisJKGdzdF9hdWRpb19jb252ZXJ0X2J1ZmZlcl90b19kZWZhdWx0X2Zvcm1hdCksCisJKGdzdF9hdWRpb19jb252ZXJ0X2J1ZmZlcl9mcm9tX2RlZmF1bHRfZm9ybWF0KToKKwkgIEFkZCBzdXBwb3J0IGZvciAyNC1iaXQgd2lkdGguCisKKwkqIGdzdC9kdmRscGNtZGVjLy5jdnNpZ25vcmU6CisJKiBnc3QvZHZkbHBjbWRlYy9NYWtlZmlsZS5hbToKKwkqIGdzdC9kdmRscGNtZGVjL2dzdGR2ZGxwY21kZWMuYzogKGdzdF9kdmRscGNtZGVjX2dldF90eXBlKSwKKwkoZ3N0X2R2ZGxwY21kZWNfYmFzZV9pbml0KSwgKGdzdF9kdmRscGNtZGVjX2NsYXNzX2luaXQpLAorCShnc3RfZHZkbHBjbV9yZXNldCksIChnc3RfZHZkbHBjbWRlY19pbml0KSwgKGdzdF9kdmRscGNtZGVjX2xpbmspLAorCShnc3RfZHZkbHBjbWRlY19jaGFpbiksIChnc3RfZHZkbHBjbWRlY19jaGFuZ2Vfc3RhdGUpLAorCShwbHVnaW5faW5pdCk6CisJKiBnc3QvZHZkbHBjbWRlYy9nc3RkdmRscGNtZGVjLmg6CisJICBOZXcgZGVjb2RlciBmb3IgcmVhcnJhbmdpbmcgRFZEIExQQ00gaW50byBvdXIgYXVkaW8veC1yYXctaW50CisJICBmb3JtYXQuIE5lZWRzIHN1cHBvcnQgZm9yIHRoZSBjaGFubmVscyBtYXBzIGlmIHNvbWVvbmUgY2FuIGZpbmQgCisJICBhIERWRCBMUENNIHRyYWNrIHdpdGggPiAyIGNoYW5uZWxzLgorCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RkdmRkZW11eC5jOiAoZ3N0X2R2ZF9kZW11eF9oYW5kbGVfZHZkX2V2ZW50KSwKKwkoZ3N0X2R2ZF9kZW11eF9zZW5kX2Rpc2NvbnQpLCAoZ3N0X2R2ZF9kZW11eF9oYW5kbGVfZGlzY29udCksCisJKGdzdF9kdmRfZGVtdXhfZ2V0X2F1ZGlvX3N0cmVhbSksIChnc3RfZHZkX2RlbXV4X3Byb2Nlc3NfcHJpdmF0ZSk6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RkdmRkZW11eC5oOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ2RlbXV4LmM6IChnc3RfbXBlZ19kZW11eF9zZW5kX2Rpc2NvbnQpLAorCShnc3RfbXBlZ19kZW11eF9uZXdfb3V0cHV0X3BhZCksIChnc3RfbXBlZ19kZW11eF9pbml0X3N0cmVhbSksCisJKGdzdF9tcGVnX2RlbXV4X3NlbmRfc3ViYnVmZmVyKSwgKGdzdF9tcGVnX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ2RlbXV4Lmg6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVncGFyc2UuYzogKGdzdF9tcGVnX3BhcnNlX3Jlc2V0KSwKKwkoZ3N0X21wZWdfcGFyc2VfcGFyc2VfcGFja2hlYWQpLCAoZ3N0X21wZWdfcGFyc2VfbG9vcCksCisJKGdzdF9tcGVnX3BhcnNlX2dldF9yYXRlKSwgKGdzdF9tcGVnX3BhcnNlX2NvbnZlcnRfc3JjKSwKKwkoZ3N0X21wZWdfcGFyc2VfaGFuZGxlX3NyY19xdWVyeSksCisJKGdzdF9tcGVnX3BhcnNlX2hhbmRsZV9zcmNfZXZlbnQpOgorCSAgVXNlIGF1ZGlvL3gtZHZkLWxwY20gZm9yIExQQ00gb3V0cHV0LgorCSAgQWRkIERUUyBvdXRwdXQuCisKKzIwMDUtMDItMDggIEdlcmdlbHkgTmFneSAgPGFsZ2Vybm9uQGJvbmVodW50ZXIucnVsZXoub3JnPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOiAoZ3N0X2FscGhhX2NvbG9yX3NpbmtfbGluayksCisJKHRyYW5zZm9ybV9yZ2IpLCAodHJhbnNmb3JtX2JnciksIChnc3RfYWxwaGFfY29sb3JfY2hhaW4pOgorCSAgQWRkIEJHUkEgaGFuZGxpbmcgKCMxNjU3MzYpLgorCisyMDA1LTAyLTA4ICBGcmFuY2lzIExhYm9udGUgIDxmcmFuY2lzX2xhYm9udGVAaG90bWFpbC5jb20+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzogKGFsYXdkZWNfbGluayk6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6IChhbGF3ZW5jX2xpbmspOgorCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzogKG11bGF3ZGVjX2xpbmspOgorCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzogKG11bGF3ZW5jX2xpbmspOgorCSAgRml4IGNhcHMgbWVtbGVha3MgKCMxNjY2MDApLgorCisyMDA1LTAyLTA4ICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisKKwkqIGV4dC90YXJraW4vbWVtLmg6CisJKiBleHQvdGFya2luL3dhdmVsZXQuaDoKKwkqIGV4dC90YXJraW4veXV2Lmg6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9hdmNvZGVjLmg6CisJICBJbmNsdWRlICJfc3RkaW50LmgiIGluc3RlYWQgb2YgPHN0ZGludC5oPi4gRml4ZXMgYnVpbGQgb24KKwkgIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIHN0ZGludC5oLCBsaWtlIFNvbGFyaXM5IChmaXhlcyAjMTY2NjMxKS4KKworMjAwNS0wMi0wNSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19jaGFuZ2Vfc3RhdGUpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua194d2luZG93X2NsZWFyKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NoYW5nZV9zdGF0ZSk6CisJICBDbGVhciB3aW5kb3cgb24gUEFVU0VELT5SRUFEWSBpbnN0ZWFkIG9mIFJFQURZLT5QQVVTRUQuIFN0b3AKKwkgIFh2IHZpZGVvIChhbmQgdGhlcmVieSByZWdlbmVyYXRlIFh2IGNvbG91cmtleSkgaW4gY2xlYXIoKSBzbworCSAgdGhhdCBQTEFZIC0+IFJFQURZIC0+IFBMQVkgd29ya3MgKGZpeGVzICMxNjI1MDQpLgorCisyMDA1LTAyLTA1ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvdjRsL2dzdHY0bG1qcGVnc3JjLmM6IChnc3RfdjRsbWpwZWdzcmNfZ2V0Y2Fwcyk6CisJICBTd2l0Y2ggdG8gbGlzdCBpbnN0ZWFkIG9mIHJhbmdlLCBzaW5jZSBNSlBFRy1kZXZpY2VzIHJlYWxseSBqdXN0CisJICBzdXBwb3J0IGRlY2ltYXRpb25zLCBub3QgYW55IHNpemUuCisKKzIwMDUtMDItMDUgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5jOiAoZ3N0X21wZWcyZGVjX29wZW5fZGVjb2RlciksCisJKGdzdF9tcGVnMmRlY19yZXNldCksIChmcmVlX2FsbF9idWZmZXJzKSwKKwkoZ3N0X21wZWcyZGVjX2FsbG9jX2J1ZmZlciksIChoYW5kbGVfc2VxdWVuY2UpOgorCSogZXh0L21wZWcyZGVjL2dzdG1wZWcyZGVjLmg6CisJICBUaGUgbGlibXBlZzIgdXNlci1hbGxvY2F0ZWQgYnVmZmVyIG1hbmFnZW1lbnQgaXMgYXdrd2FyZCwgCisJICB0byBzYXkgdGhlIGxlYXN0LiBIb3BlZnVsbHkgdGhpcyBmaXhlcyB0aGluZ3MuCisKKzIwMDUtMDItMDQgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvYnVmZmVyZnJhbWVzY29udmVydC5jCisJKGJ1ZmZlcl9mcmFtZXNfY29udmVydF9maXhhdGUpOiBOZXcgZnVuY3Rpb24sIGZpeGF0ZXMgdG8gMjU2CisJZnJhbWVzIHBlciBidWZmZXIgYnkgZGVmYXVsdC4gKE11Y2ggYmV0dGVyIHRoYW4gMS4pCisJKGJ1ZmZlcl9mcmFtZXNfY29udmVydF9pbml0KTogU2V0IHRoZSBmaXhhdGUgZnVuY3Rpb24gZm9yIGJvdGggc3JjCisJYW5kIHNpbmsgcGFkLgorCShidWZmZXJfZnJhbWVzX2NvbnZlcnRfbGluayk6IEFmdGVyIHN1Y2Nlc3Mgc2V0dGluZyBub25maXhlZCBjYXBzLAorCWdldCB0aGUgbmVnb3RpYXRlZCBjYXBzIHNvIHdlIGNhbiBrbm93IGhvdyBtYW55IGJ1ZmZlci1mcmFtZXMgaXQKKwl3aWxsIGJlLiBObyBpZGVhIGhvdyB0aGlzIHdvcmtlZCBhdCBhbGwgYmVmb3JlLgorCisyMDA1LTAyLTA1ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5jOiAoZ3N0X21wZWcyZGVjX2luaXQpLAorCShnc3RfbXBlZzJkZWNfY2xvc2VfZGVjb2RlciksIChwdXRfYnVmZmVyKSwgKGNoZWNrX2J1ZmZlciksCisJKGZyZWVfYnVmZmVyKSwgKGZyZWVfYWxsX2J1ZmZlcnMpLCAoZ3N0X21wZWcyZGVjX2FsbG9jX2J1ZmZlciksCisJKGhhbmRsZV9zZXF1ZW5jZSksIChoYW5kbGVfcGljdHVyZSk6CisJKiBleHQvbXBlZzJkZWMvZ3N0bXBlZzJkZWMuaDoKKwkgIFJlYXJyYW5nZSBidWZmZXIgdHJhY2tpbmcgYW5kIHJlZmNvdW50aW5nIGFuZCByZWZhY3RvcgorCSAgYSBsaXR0bGUgZm9yIHJlYWRhYmlsaXR5LiAKKworMjAwNS0wMi0wNCAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCSogc3lzL3Y0bC9nc3R2NGwuYzogKHBsdWdpbl9pbml0KToKKwkqIHN5cy92NGwvZ3N0djRsanBlZ3NyYy5jOiAoZ3N0X3Y0bGpwZWdzcmNfZ2V0X3R5cGUpLAorCShnc3RfdjRsanBlZ3NyY19iYXNlX2luaXQpLCAoZ3N0X3Y0bGpwZWdzcmNfY2xhc3NfaW5pdCksCisJKGdzdF92NGxqcGVnc3JjX2luaXQpLCAoZ3N0X3Y0bGpwZWdzcmNfc3JjX2xpbmspLAorCShnc3RfdjRsanBlZ3NyY19nZXRjYXBzKSwgKGdzdF92NGxqcGVnc3JjX2dldCk6CisJKiBzeXMvdjRsL2dzdHY0bGpwZWdzcmMuaDoKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6IChnc3RfdjRsc3JjX29wZW4pLCAoZ3N0X3Y0bHNyY19zcmNfbGluayk6CisJKiBzeXMvdjRsL3Y0bF9jYWxscy5oOgorCSogc3lzL3Y0bC92NGxzcmNfY2FsbHMuYzogKGdzdF92NGxzcmNfcGFsZXR0ZV9uYW1lKSwKKwkoZ3N0X3Y0bHNyY19nZXRfZnBzKToKKwkqIHN5cy92NGwvdjRsc3JjX2NhbGxzLmg6CisJICBBZGQgbmV3IHY0bGpwZWdzcmMgZm9yIGhhbmRsaW5nIHRoZSBvdjUxeCBoYWNreSAiSSdsbCBnaXZlCisJICB5b3UganBlZyBpbnNpZGUgcmdiIGZyYW1lcyIgZHJpdmVyLgorCSAgRG9uJ3QgZXJyb3IgaW4gdGhlIHY0bHNyYyBsaW5rIGZ1bmN0aW9uLCBqdXN0IHJldHVybiAKKwkgIFJFRlVTRUQuCisKKzIwMDUtMDItMDMgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy9xY2FtL2dzdHFjYW1zcmMuYzogKGdzdF9xY2Ftc3JjX2NoYW5nZV9zdGF0ZSksCisJKGdzdF9xY2Ftc3JjX29wZW4pOgorCSAgVXNlIEdTVF9FTEVNRU5UX0VSUk9SLCBub3QgZ193YXJuaW5nLCBpZiBvcGVuIGZhaWxlZC4KKworMjAwNS0wMi0wMiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF92aWRlb19jYXBzKToKKwkgIENoYW5nZSBjYXBzIG9uIE1KUEVHLUIgc28gaXQgZG9lc24ndCBpbnRlcmZlcmUgd2l0aCBNSlBFRy9KUEVHLgorCisyMDA1LTAyLTAyICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzogKGdzdF9kdjEzOTRzcmNfY2hhbmdlX3N0YXRlKToKKwkgIFJlc2V0IG5lZ290aWF0ZWQgc3RhdGUgb24gUEFVU0VELT5SRUFEWS4KKworMjAwNS0wMi0wMiAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBjb25maWd1cmUuYWM6IFB1dCBERUZBVUxUX0FVRElPU0lOSyBpbiBjb25maWcuaCBhbmQgdXNlCisJd2hlcmVldmVyIHBvc3NpYmxlLiAgKEZpeGVzICMxNjU5OTcpCisJKiBleGFtcGxlcy9jYXBzZmlsdGVyL2NhcHNmaWx0ZXIxLmM6IChtYWluKToKKwkqIGV4YW1wbGVzL2R5bnBhcmFtcy9maWx0ZXIuYzogKGNyZWF0ZV91aSk6CisJKiBleGFtcGxlcy9zZWVraW5nL2NkcGFyYW5vaWEuYzogKGdldF90cmFja19pbmZvKSwgKG1haW4pOgorCSogZXhhbXBsZXMvc2Vla2luZy9jaGFpbmVkLmM6IChtYWluKToKKwkqIGV4YW1wbGVzL3NlZWtpbmcvc2Vlay5jOiAobWFrZV9tb2RfcGlwZWxpbmUpLCAobWFrZV9kdl9waXBlbGluZSksCisJKG1ha2Vfd2F2X3BpcGVsaW5lKSwgKG1ha2VfZmxhY19waXBlbGluZSksIChtYWtlX3NpZF9waXBlbGluZSksCisJKG1ha2Vfdm9yYmlzX3BpcGVsaW5lKSwgKG1ha2VfbXAzX3BpcGVsaW5lKSwgKG1ha2VfYXZpX3BpcGVsaW5lKSwKKwkobWFrZV9tcGVnX3BpcGVsaW5lKSwgKG1ha2VfbXBlZ250X3BpcGVsaW5lKToKKwkqIGV4YW1wbGVzL3NlZWtpbmcvc3BpZGVyX3NlZWsuYzogKG1ha2Vfc3BpZGVyX3BpcGVsaW5lKToKKwkqIGV4YW1wbGVzL3N3aXRjaC9zd2l0Y2hlci5jOiAobWFpbik6CisJKiBleHQvZHYvZGVtby1wbGF5LmM6IChtYWluKToKKwkqIGV4dC9mYWFkL2dzdGZhYWQuYzogKGdzdF9mYWFkX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9jaGFpbik6CisJKiBleHQvc21vb3Rod2F2ZS9kZW1vLW9zc3NyYy5jOiAobWFpbik6CisJKiBnc3QtbGlicy9nc3QvZ2NvbmYvZ2NvbmYuYzogKGdzdF9nY29uZl9zZXRfc3RyaW5nKSwKKwkoZ3N0X2djb25mX3JlbmRlcl9iaW5fZnJvbV9kZXNjcmlwdGlvbiksCisJKGdzdF9nY29uZl9nZXRfZGVmYXVsdF9hdWRpb19zaW5rKSwKKwkoZ3N0X2djb25mX2dldF9kZWZhdWx0X3ZpZGVvX3NpbmspLAorCShnc3RfZ2NvbmZfZ2V0X2RlZmF1bHRfYXVkaW9fc3JjKSwKKwkoZ3N0X2djb25mX2dldF9kZWZhdWx0X3ZpZGVvX3NyYyksCisJKGdzdF9nY29uZl9nZXRfZGVmYXVsdF92aXN1YWxpemF0aW9uX2VsZW1lbnQpOgorCSogZ3N0L2xldmVsL2RlbW8uYzogKG1haW4pOgorCSogZ3N0L2xldmVsL3Bsb3QuYzogKG1haW4pOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdlbl92aWRlb19lbGVtZW50KSwKKwkoZ2VuX2F1ZGlvX2VsZW1lbnQpOgorCSogZ3N0L3BsYXliYWNrL3Rlc3QuYzogKGdlbl92aWRlb19lbGVtZW50KSwgKGdlbl9hdWRpb19lbGVtZW50KToKKwkqIGdzdC9wbGF5b25kZW1hbmQvZGVtby1tcDMuYzogKHNldHVwX3BpcGVsaW5lKToKKwkqIGdzdC9zaW5lL2RlbW8tZHBhcmFtcy5jOiAobWFpbik6CisJKiBnc3Qvc3BlY3RydW0vZGVtby1vc3NzcmMuYzogKG1haW4pOgorCSogZ3N0L3NwZWVkL2RlbW8tbXAzLmM6IChtYWluKToKKwkqIGdzdC92b2x1bWUvZGVtby5jOiAobWFpbik6CisJKiB0ZXN0c3VpdGUvZW1iZWQvZW1iZWQuYzogKG1haW4pOgorCisyMDA1LTAyLTAyICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c2luay5jOiAoZ3N0X3RjcGNsaWVudHNpbmtfY2xhc3NfaW5pdCksCisJKGdzdF90Y3BjbGllbnRzaW5rX2ZpbmFsaXplKToKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c3JjLmM6IChnc3RfdGNwY2xpZW50c3JjX2NsYXNzX2luaXQpLAorCShnc3RfdGNwY2xpZW50c3JjX2ZpbmFsaXplKToKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc2luay5jOiAoZ3N0X3RjcHNlcnZlcnNpbmtfY2xhc3NfaW5pdCksCisJKGdzdF90Y3BzZXJ2ZXJzaW5rX2luaXQpLCAoZ3N0X3RjcHNlcnZlcnNpbmtfZmluYWxpemUpOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzcmMuYzogKGdzdF90Y3BzZXJ2ZXJzcmNfY2xhc3NfaW5pdCksCisJKGdzdF90Y3BzZXJ2ZXJzcmNfaW5pdCksIChnc3RfdGNwc2VydmVyc3JjX2ZpbmFsaXplKToKKwkgIERvbid0IGxlYWsgdGhlIGhvc3RuYW1lIHdoZW4gc2h1dHRpbmcgZG93bi4KKwkgIEluIHRjcHNlcnZlcnNyYywgdGFrZSBhIGNvcHkgb2YgdGhlIGRlZmF1bHQgaG9zdG5hbWUuCisKKzIwMDUtMDItMDEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOiAoZ3N0X2R2MTM5NHNyY19pc29fcmVjZWl2ZSk6CisJICBTZXQgY2FwcyB0byBzeXN0ZW1zdHJlYW09VFJVRS4KKworMjAwNS0wMi0wMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogdGVzdHN1aXRlL01ha2VmaWxlLmFtOgorCSAgRml4IG1vcmUgT1NYIGJ1aWxkYm90cy4KKworMjAwNS0wMi0wMiAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBleHQvbXBlZzJkZWMvZ3N0bXBlZzJkZWMuYzoKKwkgIERvbid0IHNlbmQgdGhpbmdzIHRvIE5VTEwgUEFEX1BFRVJzCisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOiAoZ3N0X2RlaW50ZXJsYWNlX2NoYWluKToKKwkgIENvcHktb24td3JpdGUgdGhlIGluY29taW5nIGJ1ZmZlci4KKworCSogZ3N0L21wZWdzdHJlYW0vZ3N0ZHZkZGVtdXguaDoKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdjbG9jay5oOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ2RlbXV4LmM6IChnc3RfbXBlZ19kZW11eF9wYXJzZV9zeXNoZWFkKSwKKwkobm9ybWFsX3NlZWspLCAoZ3N0X21wZWdfZGVtdXhfaGFuZGxlX3NyY19ldmVudCk6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVnZGVtdXguaDoKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdwYWNrZXRpemUuaDoKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdwYXJzZS5jOgorCShnc3RfbXBlZ19wYXJzZV91cGRhdGVfc3RyZWFtaW5mbyksIChnc3RfbXBlZ19wYXJzZV9yZXNldCksCisJKGdzdF9tcGVnX3BhcnNlX2hhbmRsZV9kaXNjb250KSwgKGdzdF9tcGVnX3BhcnNlX3BhcnNlX3BhY2toZWFkKSwKKwkoZ3N0X21wZWdfcGFyc2VfbG9vcCksIChnc3RfbXBlZ19wYXJzZV9nZXRfcmF0ZSksCisJKGdzdF9tcGVnX3BhcnNlX2NvbnZlcnRfc3JjKSwgKGdzdF9tcGVnX3BhcnNlX2hhbmRsZV9zcmNfcXVlcnkpLAorCShnc3RfbXBlZ19wYXJzZV9oYW5kbGVfc3JjX2V2ZW50KSwgKGdzdF9tcGVnX3BhcnNlX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVncGFyc2UuaDoKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdHJmYzIyNTBlbmMuaDoKKyAgICAgICAgICBWYXJpb3VzIGNoYW5nZXMgdG8gdGhlIHdheSB0aW1lIGlzIGNvbXB1dGVkIHRoYXQgbWFrZSBzZWVraW5nIGFuZAorCSAgdG90YWwgdGltZSBlc3RpbWF0aW9uIG11Y2ggYmV0dGVyIGhlcmUuCisJICBVc2UgR19CRUdJTi9FTkRfREVDTFMgaW5zdGVhZCBvZiBfX2NwbHVzcGx1cworCisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOiAoZ3N0X3ZpZGVvX2Nyb3BfY2hhaW4pOgorCSAgVXNlIGdzdF9idWZmZXJfc3RhbXAgaW5zdGVhZCBvZiBvbmx5IGNvcHlpbmcgdGhlIFRJTUVTVEFNUAorCisyMDA1LTAyLTAxICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3Qvc3VicGFyc2UvZ3N0c3VicGFyc2UuYzoKKwkgIEZpeCBPU1ggYnVpbGRib3QuCisKKzIwMDUtMDEtMzEgIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZXh0L3RoZW9yYS90aGVvcmFlbmMuYzogKHRoZW9yYV9idWZmZXJfZnJvbV9wYWNrZXQpLAorCSh0aGVvcmFfZW5jX2NoYWluKSwgKHRoZW9yYV9lbmNfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC92b3JiaXMvdm9yYmlzZW5jLmM6IChnc3Rfdm9yYmlzZW5jX2luaXQpLAorCShnc3Rfdm9yYmlzZW5jX2J1ZmZlcl9mcm9tX3BhY2tldCksIChnc3Rfdm9yYmlzZW5jX2NoYWluKSwKKwkoZ3N0X3ZvcmJpc2VuY19jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L3ZvcmJpcy92b3JiaXNlbmMuaDoKKwkgIFNldCBncmFudWxlcG9zIGFuZCB0aW1lc3RhbXAgY29ycmVjdGx5IGZvciBzdHJlYW1zIG5vdAorCSAgc3RhcnRpbmcgYXQgMCwgdGFraW5nIGludG8gYWNjb3VudCB0aGUgaW5pdGlhbCBkZWxheS4KKworMjAwNS0wMS0zMSAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RkdmRkZW11eC5jOgorCSAgQWRkIGF1ZGlvL3gtZHRzIHRvIGF1ZGlvIHBhZCB0ZW1wbGF0ZSBjYXBzCisKKzIwMDUtMDEtMzAgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L3BvbHlwL3BvbHlwc2luay5jOiAoZ3N0X3BvbHlwc2lua19iYXNlX2luaXQpLAorCShjcmVhdGVfY29udGV4dCksIChnc3RfcG9seXBzaW5rX2xpbmspOiBGaXggc2lsbHkgZW5kaWFubmVzcworCWJ1Zy4gIEFkZCBzb21lIGRlYnVnZ2luZy4gIFJlbW92ZSBmbG9hdCBmcm9tIGNhcHM7IGl0IGRvZXNuJ3QKKwl3b3JrLiAgQXR0ZW1wdCB0byBnZXQgcmVtb3RlIGF1ZGlvIHdvcmtpbmcuCisKKzIwMDUtMDEtMjkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6CisJICBBZGQgM0lWMiBmb3VyY2MuCisKKzIwMDUtMDEtMjkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfYWRkX3N0cmVhbSksIChzd2FwX2xpbmUpLAorCShnc3RfYXZpX2RlbXV4X2ludmVydCksIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSksCisJKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2RhdGEpOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgSW52ZXJ0IERJQiBpbWFnZXMuIEZpeGVzICMxMzIzNDEuCisKKzIwMDUtMDEtMjkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvbG9yc3BhY2UuYzoKKwkoZ3N0X2ZmbXBlZ2NzcF9jaGFpbik6CisJICBEJ29oLCByZWZlcmVuY2UgdGhlIHBhbGV0dGUgZGF0YSwgbm90IHRoZSBwYWxldHRlIHN0cnVjdHVyZS4KKwkgIEZpeGVzIGNvbG9yIGRpc3RvcnRpb24gaW4gIzEzMjM0MS4KKworMjAwNS0wMS0yOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3ZpZGVvc2NhbGUvZ3N0dmlkZW9zY2FsZS5jOiAoZ3N0X3ZpZGVvc2NhbGVfbGluayk6CisJICBQQVIgY2FuIGJlIG5vbi1maXhlZCB3aGVuIG5vdCBwcm92aWRlZCBhcyBhcmd1bWVudCAoIzE2MjYyNikuCisKKzIwMDUtMDEtMjkgIERhdmlkIE1vb3JlICA8ZGNtQGFjbS5vcmc+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2NoYW5nZV9zdGF0ZSksCisJKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKToKKwkgIFJlLWFwcGx5IHBhdGNoIGZyb20gIzE0MjI3MiB0aGF0IGFsbG93cyBub24tc2Vla2FibGUgc291cmNlcywKKwkgIHJlLXByb3Bvc2VkIGJ5IERhbmllbCBEcmFrZSA8ZHNkQGdlbnRvby5vcmc+LgorCisyMDA1LTAxLTI5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzbWVuYy5jOiAoZ3N0X3J0cGdzbWVuY19pbml0KToKKwkgIFVzZSB0aGUgc3JjIHRlbXBsYXRlIGZvciBjcmVhdGluZyB0aGUgc3JjIHBhZCAoIzE2MjMzMCkuCisKKzIwMDUtMDEtMjkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9tdXNlcGFjay9NYWtlZmlsZS5hbToKKwkqIGV4dC9tdXNlcGFjay9nc3RtdXNlcGFja2RlYy5jOiAoZ3N0X211c2VwYWNrZGVjX2NsYXNzX2luaXQpLAorCShnc3RfbXVzZXBhY2tkZWNfaW5pdCksIChnc3RfbXVzZXBhY2tkZWNfZGlzcG9zZSksCisJKGdzdF9tdXNlcGFja2RlY19zcmNfcXVlcnkpLCAoZ3N0X211c2VwYWNrZGVjX3NyY19jb252ZXJ0KSwKKwkoZ3N0X211c2VwYWNrX3N0cmVhbV9pbml0KSwgKGdzdF9tdXNlcGFja2RlY19sb29wKSwKKwkoZ3N0X211c2VwYWNrZGVjX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvbXVzZXBhY2svZ3N0bXVzZXBhY2tkZWMuY3BwOgorCSogZXh0L211c2VwYWNrL2dzdG11c2VwYWNrZGVjLmg6CisJKiBleHQvbXVzZXBhY2svZ3N0bXVzZXBhY2tyZWFkZXIuYzogKGdzdF9tdXNlcGFja19yZWFkZXJfcGVlayksCisJKGdzdF9tdXNlcGFja19yZWFkZXJfcmVhZCksIChnc3RfbXVzZXBhY2tfcmVhZGVyX3NlZWspLAorCShnc3RfbXVzZXBhY2tfcmVhZGVyX3RlbGwpLCAoZ3N0X211c2VwYWNrX3JlYWRlcl9nZXRfc2l6ZSksCisJKGdzdF9tdXNlcGFja19yZWFkZXJfY2Fuc2VlayksIChnc3RfbXVzZXBhY2tfaW5pdF9yZWFkZXIpOgorCSogZXh0L211c2VwYWNrL2dzdG11c2VwYWNrcmVhZGVyLmNwcDoKKwkqIGV4dC9tdXNlcGFjay9nc3RtdXNlcGFja3JlYWRlci5oOgorCSAgVXBkYXRlIHRvIDEuMSBBUEkgKCMxNjU0NDYpLgorCisyMDA1LTAxLTI4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvTWFrZWZpbGUuYW06CisJICBVbmJyZWFrIGJ1aWxkYm90LgorCisyMDA1LTAxLTI4ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzogQ2hhbmdlIHRoZSBwaXhlbCBhc3BlY3QgcmF0aW8gb2YgZHZkZWMgb3V0cHV0CisJdG8gcmVmbGVjdCBhIGRpZmZlcmVudCBkdWJpb3VzIGludGVybmV0IHNvdXJjZS4gQWRkIGEgcmVmZXJlbmNlCisJYW5kIHNvbWUgY29tbWVudGFyeS4KKworMjAwNS0wMS0yOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHN0cmVhbXNlbGVjdG9yLmM6IChnc3Rfc3RyZWFtX3NlbGVjdG9yX2luaXQpLAorCShnc3Rfc3RyZWFtX3NlbGVjdG9yX2dldF9jYXBzKSwgKGdzdF9zdHJlYW1fc2VsZWN0b3JfY2hhaW4pOgorCSogZ3N0L3BsYXliYWNrL2dzdHN0cmVhbXNlbGVjdG9yLmg6CisJICBCZSBtb3JlIHNlbGVjdGl2ZSB3aGVuIHdlJ3JlIHJlZG9pbmcgY2FwcyBuZWdvdGlhdGlvbiBmcm9tCisJICB3aXRoaW4gdGhlIGNoYWluIGZ1bmN0aW9uIG9uIGEgc3RyZWFtIGNoYW5nZS4KKworMjAwNS0wMS0yOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L2Ftcm5iL01ha2VmaWxlLmFtOgorCSogZXh0L2Ftcm5iL2Ftcm5iLmM6IChwbHVnaW5faW5pdCk6CisJKiBleHQvYW1ybmIvYW1ybmJkZWMuYzogKGdzdF9hbXJuYmRlY19nZXRfdHlwZSksCisJKGdzdF9hbXJuYmRlY19iYXNlX2luaXQpLCAoZ3N0X2Ftcm5iZGVjX2NsYXNzX2luaXQpLAorCShnc3RfYW1ybmJkZWNfaW5pdCksIChnc3RfYW1ybmJkZWNfbGluayksIChnc3RfYW1ybmJkZWNfY2hhaW4pLAorCShnc3RfYW1ybmJkZWNfc3RhdGVfY2hhbmdlKToKKwkqIGV4dC9hbXJuYi9hbXJuYmRlYy5oOgorCSogZXh0L2Ftcm5iL2Ftcm5icGFyc2UuYzogKGdzdF9hbXJuYnBhcnNlX2dldF90eXBlKSwKKwkoZ3N0X2Ftcm5icGFyc2VfYmFzZV9pbml0KSwgKGdzdF9hbXJuYnBhcnNlX2NsYXNzX2luaXQpLAorCShnc3RfYW1ybmJwYXJzZV9pbml0KSwgKGdzdF9hbXJuYnBhcnNlX2Zvcm1hdHMpLAorCShnc3RfYW1ybmJwYXJzZV9xdWVyeXR5cGVzKSwgKGdzdF9hbXJuYnBhcnNlX3F1ZXJ5KSwKKwkoZ3N0X2Ftcm5icGFyc2VfaGFuZGxlX2V2ZW50KSwgKGdzdF9hbXJuYnBhcnNlX3Jlc2VydmUpLAorCShnc3RfYW1ybmJwYXJzZV9sb29wKSwgKGdzdF9hbXJuYnBhcnNlX3N0YXRlX2NoYW5nZSk6CisJKiBleHQvYW1ybmIvYW1ybmJwYXJzZS5oOgorCSAgQWRkIHN1cHBvcnQgZm9yIEFNUi1OQiAobW9iaWxlIHBob25lIGF1ZGlvIGZvcm1hdDsgIzE1NTE2MywgIzE2MzI4NikuCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKHBsdWdpbl9pbml0KToKKwkgIEFkZCBBTVItTkIvLVdCIHJhdyBmb3JtYXRzLgorCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfbGluayk6CisJICBLZWVwIHZhbGlkIHRpbWUgd2hlbiBjaGFuZ2luZyBmb3JtYXQuCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX2hlYWRlciksCisJKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBBZGQgc29tZSBtb3JlIGZvcm1hdC1zcGVjaWZpYyBvcHRpb25zICgjMTQwMTQxLCAjMTQzNTU1LCAjMTU1MTYzKS4KKworMjAwNS0wMS0yOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwKToKKwkgIEZpeCBsb2dpYyBlcnJvciBpbiB0aW1pbmcgb2Ygc3VidGl0bGUgc3RyZWFtIHN5bmNocm9uaXphdGlvbi4KKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAocXRfdHlwZV9maW5kKToKKwkgIEFkZCBza2lwLWNodW5rLCB3aGljaCBpcyBmb3VuZCBpbiBrb2Rhay1jYW1lcmEgc3RyZWFtcy4KKworMjAwNS0wMS0yNyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogcG8vTElOR1VBUzoKKwkqIHBvL3ZpLnBvOgorCSAgQWRkaW5nIFZpZXRuYW1lc2UgdHJhbnNsYXRpb24gKHN1Ym1pdHRlZCBieSBDbHl0aWUgU2lkZGFsbCkKKworMjAwNS0wMS0yNyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdGRlY29kZWJpbi5jOiAodHJ5X3RvX2xpbmtfMSk6CisJICBVc2UgcmVhbHBhZCBmb3Igc2lnbmFsLgorCisyMDA1LTAxLTI3ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbWFkL2dzdGlkM2RlbXV4YmluLmM6IChnc3RfaWQzZGVtdXhfYmluX2Jhc2VfaW5pdCk6CisJICBGaXggY2F0ZWdvcnkgc28gZGVjb2RlYmluIHBpY2tzIGl0IHVwLgorCisyMDA1LTAxLTI3ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbWFkL01ha2VmaWxlLmFtOgorCSogZXh0L21hZC9nc3RpZDNkZW11eGJpbi5jOiAoZ3N0X2lkM2RlbXV4X2Jpbl9nZXRfdHlwZSksCisJKGdzdF9pZDNkZW11eF9iaW5fYmFzZV9pbml0KSwgKGdzdF9pZDNkZW11eF9iaW5fY2xhc3NfaW5pdCksCisJKGdzdF9pZDNkZW11eF9iaW5faW5pdCksIChnc3RfaWQzZGVtdXhfYmluX3JlbW92ZV9wYWQpLAorCShmb3VuZF90eXBlKSwgKGdzdF9pZDNkZW11eF9iaW5fY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChnc3RfaWQzX3RhZ19hZGRfc3JjX3BhZCksCisJKGdzdF9pZDNfdGFnX2luaXQpLCAoZ3N0X2lkM190YWdfaGFuZGxlX2V2ZW50KSwKKwkoZ3N0X2lkM190YWdfc3JjX2xpbmspLCAoZ3N0X2lkM190YWdfY2hhaW4pLAorCShnc3RfaWQzX3RhZ19jaGFuZ2Vfc3RhdGUpLCAocGx1Z2luX2luaXQpOgorCSogZXh0L21hZC9nc3RtYWQuaDoKKwkgIEFkZCBpZDNkZW11eGJpbiAod2hpY2ggaXMgYSBzaW1wbGUgYmluIGNvbnNpc3Rpbmcgb2YgaWQzZGVtdXgKKwkgIGFuZCB0eXBlZmluZCksIHRha2Ugb3ZlciByYW5rIGZyb20gaWQzZGVtdXgsIHJlbW92ZSB0eXBlZmluZAorCSAgY29kZSBmcm9tIGlkM2RlbXV4LiBNYWtlcyBhbGwgYnJva2VuIG1wM3MgdGhhdCBJIGtub3cgb2Ygd29yaywKKwkgIGFuZCB0aGVyZWJ5IGZpeGVzICMxNTI2ODguCisKKzIwMDUtMDEtMjcgIEVkd2FyZCBIZXJ2ZXkgIDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9zcmNfZXZlbnQpOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX2V2ZW50KToKKwkgIEFsbG93IHNlZWtzIG9uIGF1ZGlvIHBhZCwgbWFrZSBtYWQgZm9yd2FyZCB0aG9zZSAoIzE2NDgyNikuCisJKiBnc3QvYXVkaW9zY2FsZS9nc3RhdWRpb3NjYWxlLmM6IChnc3RfYXVkaW9zY2FsZV9jaGFpbik6CisJICBTZXQgZHVyYXRpb24gKCMxNjUzMzUpLgorCisyMDA1LTAxLTI3ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKGdzdF9hc2ZfZGVtdXhfaW5pdCksCisJKGdzdF9hc2ZfZGVtdXhfY29tbWl0X3RhZ2xpc3QpLCAoZ3N0X2FzZl9kZW11eF9wcm9jZXNzX2NvbW1lbnQpLAorCShnc3RfYXNmX2RlbXV4X3Byb2Nlc3NfZXh0X2NvbnRlbnRfZGVzYyksCisJKGdzdF9hc2ZfZGVtdXhfY2hhbmdlX3N0YXRlKSwgKGdzdF9hc2ZfZGVtdXhfYWRkX2F1ZGlvX3N0cmVhbSksCisJKGdzdF9hc2ZfZGVtdXhfYWRkX3ZpZGVvX3N0cmVhbSksIChnc3RfYXNmX2RlbXV4X3NldHVwX3BhZCk6CisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguaDoKKwkgIEltcHJvdmUgbWV0YWRhdGEgZGlzcGxheSwgZS5nLiBpZiB0aGUgbWV0YWRhdGEgY29tZXMgYmVmb3JlIHRoZQorCSAgc3RyZWFtcyBhcmUgbG9hZGVkICh3aGljaCBpcyBwZXJmZWN0bHkgdmFsaWQpLgorCisyMDA1LTAxLTI3ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiB0b29scy9nc3QtbGF1bmNoLWV4dC1tLm06CisJICBGaXggQVZJL0FTRiBwaXBlbGluZXMgKCMxNjUzNDApLgorCisyMDA1LTAxLTI2ICBBbWF1cnkgSmFjcXVvdCAgPHN4cGVydEBlc2l0Y29tLm9yZz4KKwkqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOiBpbmNsdWRlICBzdHJpbmcuaCBhbmQgc3RyaW5ncy5oIHRvIGZpeAorCWJ1aWxkIGZhaWx1cmUgb24gYW1kNjQKKworMjAwNS0wMS0yNiAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAobWFkX2lkM19wYXJzZV9sYXRpbjFfc3RyaW5nKSwKKwkobWFkX2lkM19wYXJzZV9jb21tZW50X2ZyYW1lKSwgKGdzdF9tYWRfaWQzX3RvX3RhZ19saXN0KToKKwkgIENoZWNrIGVudmlyb25tZW50IHZhcmlhYmxlcyBHU1RfSUQzVjJfVEFHX0VOQ09ESU5HLAorCSAgR1NUX0lEM19UQUdfRU5DT0RJTkcgYW5kIEdTVF9UQUdfRU5DT0RJTkcgZm9yIGEgY29sb24tc2VwYXJhdGVkCisJICBsaXN0IG9mIGNoYXJhY3RlciBlbmNvZGluZ3MgdG8gZm9yY2UgaW50ZXJwcmV0YXRpb24gb2Ygbm9uLXVuaWNvZGUKKwkgIHN0cmluZ3Mgc3RvcmVkIGluIGFuIElEM3YyIHRhZyB0byBhIHBhcnRpY3VsYXIgZW5jb2RpbmcuIElmIG5vbmUKKwkgIGlzIHNwZWNpZmllZCwgdHJ5IHRvIHVzZSBjdXJyZW50IGxvY2FsZSdzIGVuY29kaW5nLCB0aGVuIGZhbGwgYmFjaworCSAgdG8gSVNPLTg4NTktMSAod2hpY2ggd2lsbCBhbHdheXMgc3VjY2VlZCkuIChSZXNvbHZlcyAjMTQ5Mjc0KQorCSogZ3N0L3RhZ3MvZ3N0aWQzdGFnLmM6IChnc3RfdGFnX2Zyb21faWQzX3RhZyksCisJKGdzdF90YWdfZXh0cmFjdF9pZDN2MV9zdHJpbmcpLCAoZ3N0X3RhZ19saXN0X25ld19mcm9tX2lkM3YxKToKKwkgIENoZWNrIGVudmlyb25tZW50IHZhcmlhYmxlcyBHU1RfSUQzVjFfVEFHX0VOQ09ESU5HLAorCSAgR1NUX0lEM19UQUdfRU5DT0RJTkcgYW5kIEdTVF9UQUdfRU5DT0RJTkcgZm9yIGEgY29sb24tc2VwYXJhdGVkCisJICBsaXN0IG9mIGNoYXJhY3RlciBlbmNvZGluZ3MgdG8gdXNlIGluIGNhc2UgYSBzdHJpbmcgZW5jb3VudGVyZWQKKwkgIGluIGFuIElEM3YxIHRhZyBpcyBub3QgdmFsaWQgVVRGLTggYWxyZWFkeS4gSWYgbm8gZW5jb2RpbmcgaXMKKwkgIHNwZWNpZmllZCwgdHJ5IHRvIHVzZSB0aGUgY3VycmVudCBsb2NhbGUncyBlbmNvZGluZywgdGhlbiBmYWxsCisJICBiYWNrIHRvIElTTy04ODU5LTEgKHdoaWNoIHdpbGwgYWx3YXlzIHN1Y2NlZWQpLgorCisyMDA1LTAxLTI1ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX2NoZWNrX2NhcHNfcmVzZXQpLCAoZ3N0X21hZF9jaGFpbik6CisJICAtIG9uIGhhbGYgZnJhbWVyYXRlLCBjb21wdXRlIHRoZSByYXRlIGluIGFkdmFuY2Ugc28gdGhlIGNvbXBhcmlzb25zCisJICAgIGRvbid0IGNvbXBhcmUgd3JvbmcgdmFsdWVzCisJICAtIGRvbid0IHVzZSBtYWRfc3ludGgvZnJhbWVfbXV0ZSBhbnltb3JlLCB0aGlzIG1pcnJvcnMgbWFkX2RlY29kZXIKKwkgICAgYmVoYXZpb3VyCisJICAtIGRvbid0IHVzZSBtYWRfaGVhZGVyX2RlY29kZSBhbnltb3JlLCBtYWRfZnJhbWVfZGVjb2RlIGRvZXMgdGhhdAorCSAgICBhdXRvbWF0aWNhbGx5CisJICAtIHdoZW4gZ2V0dGluZyByaWQgb2YgY29uc3VtZWQgYnl0ZXMsIHJlc2V0IHRoZSBzdHJlYW0ncyBza2lwbGVuCisJICAoZml4ZXMgIzE2Mzg2NykKKworMjAwNS0wMS0yNiAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVncGFyc2UuYzogKGdzdF9tcGVnX3BhcnNlX2NsYXNzX2luaXQpCisJICBVc2UgMS8yIGEgc2Vjb25kIGZvciBkZWZhdWx0IG1heF9kaXNjb250LCBhcyBQRVMgc3RyZWFtcyBmcm9tIERWQgorCSAgc2VlbSB0byBoYXZlIGxhcmdlciBzcGFjaW5ncyBpbiB0aGUgU0NSLiAKKwkgIEZpeCBhIHR5cG8uCisKKzIwMDUtMDEtMjUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoZ3JvdXBfY29tbWl0KToKKwkgIE5vdGlmeSBkZWxheWVkIHN0cmVhbS1pbmZvIGF2YWlsYWJpbGl0eS4KKworMjAwNS0wMS0yNiAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCSogZXh0L2E1MmRlYy9nc3RhNTJkZWMuYzogKGdzdF9hNTJkZWNfcHVzaCksCisJKGdzdF9hNTJkZWNfaGFuZGxlX2V2ZW50KSwgKGdzdF9hNTJkZWNfY2hhaW4pOgorCUFkZCBzb21lIGRlYnVnIG91dHB1dC4gQ2hlY2sgdGhhdCBhIGRpc2NvbnQgaGFzIGEgdmFsaWQKKwl0aW1lIGFzc29jaWF0ZWQuCisJKiBleHQvYWxzYS9nc3RhbHNhc2luay5jOiAoZ3N0X2Fsc2Ffc2lua19jaGVja19ldmVudCksCisJKGdzdF9hbHNhX3NpbmtfbG9vcCk6CisJSWdub3JlIFRBRyBldmVudHMuIEEgbGl0dGxlIGV4dHJhIGRlYnVnIGZvciBicm9rZW4gdGltZXN0YW1wcy4KKwkqIGV4dC9kdmRuYXYvZHZkbmF2c3JjLmM6IChkdmRuYXZzcmNfaW5pdCksIChkdmRuYXZzcmNfbG9vcCksCisJKGR2ZG5hdnNyY19jaGFuZ2Vfc3RhdGUpOgorCUVuc3VyZSB3ZSBzZW5kIGEgZGlzY29udCB0byBlbmdhZ2UgdGhlIGxpbmsgYmVmb3JlIHdlIHNlbmQgYW55CisJb3RoZXIgZXZlbnRzLgorCSogZXh0L2R2ZHJlYWQvZHZkcmVhZHNyYy5jOiAoZHZkcmVhZHNyY19pbml0KSwKKwkoZHZkcmVhZHNyY19maW5hbGl6ZSksIChfY2xvc2UpLCAoX29wZW4pLCAoX3NlZWtfdGl0bGUpLAorCShfc2Vla19jaGFwdGVyKSwgKHNlZWtfc2VjdG9yKSwgKGR2ZHJlYWRzcmNfZ2V0KSwKKwkoZHZkcmVhZHNyY191cmlfZ2V0X3VyaSksIChkdmRyZWFkc3JjX3VyaV9zZXRfdXJpKToKKwlIYW5kbGUgVVJJIG9mIHRoZSBmb3JtIGR2ZDovL3RpdGxlWyxjaGFwdGVyWyxhbmdsZV1dLiBDdXJyZW50bHkgb25seQorCWR2ZDovL3RpdGxlIHdvcmtzIGluIHRvdGVtIGJlY2F1c2UgdHlwZWZpbmRpbmcgc2VuZHMgYSBzZWVrIHRoYXQgZW5kcworCXVwIGdvaW5nIGJhY2sgdG8gY2hhcHRlciAxIHJlZ2FyZGxlc3MuCisJKiBleHQvbXBlZzJkZWMvZ3N0bXBlZzJkZWMuYzoKKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5oOgorCU91dHB1dCBjb3JyZWN0IHRpbWVzdGFtcHMgYW5kIGhhbmRsZSBkaXNjb250cy4KKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdldF9yZWxhdGl2ZSk6CisJU21hbGwgZ3VhcmQgYWdhaW5zdCBhIG51bGwgZGVyZWZlcmVuY2UuCisJKiBleHQvcGFuZ28vZ3N0dGV4dG92ZXJsYXkuYzogKGdzdF90ZXh0b3ZlcmxheV9maW5hbGl6ZSksCisJKGdzdF90ZXh0b3ZlcmxheV9zZXRfcHJvcGVydHkpOgorCUZyZWUgbWVtb3J5IHdoZW4gZG9uZS4gRG9uJ3QgY2FsbCBnc3RfZXZlbnRfZmlsbGVyX2dldF9kdXJhdGlvbiBvbgorCUVPUyBldmVudHMuIFVzZSBHU1RfTE9HIGFuZCBHU1RfV0FSTklORyBpbnN0ZWFkIG9mIGdfbWVzc2FnZSBhbmQKKwlnX3dhcm5pbmcuCisJKiBleHQvc21vb3Rod2F2ZS9nc3RzbW9vdGh3YXZlLmM6IChnc3Rfc21vb3Rod2F2ZV9pbml0KSwKKwkoZHJhd19saW5lKSwgKGdzdF9zbW9vdGh3YXZlX2Rpc3Bvc2UpLCAoZ3N0X3N3X3NpbmtsaW5rKSwKKwkoZ3N0X3N3X3NyY2xpbmspLCAoZ3N0X3Ntb290aHdhdmVfY2hhaW4pOgorCURyYXcgc29saWQgbGluZXMsIHByZXR0aWVyIGNvbG91cnMuCisJKiBnc3QvbXBlZzJzdWIvZ3N0bXBlZzJzdWJ0LmM6IChnc3RfbXBlZzJzdWJ0X2luaXQpOgorCUFkZCBhIGRlZmF1bHQgcGFsZXR0ZSB0aGF0J2xsIHdvcmsgZm9yIHNvbWUgbW92aWVzLgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0ZHZkZGVtdXguYzogKGdzdF9kdmRfZGVtdXhfaW5pdCksCisJKGdzdF9kdmRfZGVtdXhfaGFuZGxlX2R2ZF9ldmVudCksIChnc3RfZHZkX2RlbXV4X3NlbmRfZGlzY29udCksCisJKGdzdF9kdmRfZGVtdXhfc2VuZF9zdWJidWZmZXIpLCAoZ3N0X2R2ZF9kZW11eF9yZXNldCk6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RkdmRkZW11eC5oOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ2RlbXV4LmM6IChnc3RfbXBlZ19kZW11eF9zZW5kX2Rpc2NvbnQpLAorCShnc3RfbXBlZ19kZW11eF9wYXJzZV9zeXNoZWFkKSwgKGdzdF9tcGVnX2RlbXV4X3BhcnNlX3Blcyk6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVncGFyc2UuYzogKGdzdF9tcGVnX3BhcnNlX2luaXQpLAorCShnc3RfbXBlZ19wYXJzZV9oYW5kbGVfZGlzY29udCksIChnc3RfbXBlZ19wYXJzZV9wYXJzZV9wYWNraGVhZCk6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVncGFyc2UuaDoKKwlVc2UgUFRNL05BViBldmVudHMgd2hlbiBmb3IgdGltZXN0YW1wIGFkanVzdG1lbnQgd2hlbiBjb25uZWN0ZWQgdG8gCisJZHZkbmF2c3JjLiBEb24ndCB1c2UgbWFueSBkaXNjb250IGV2ZW50cyB3aGVyZSBvbmUgc3VmZmljZXMuCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKGdyb3VwX2Rlc3Ryb3kpLAorCShnZW5fcHJlcm9sbF9lbGVtZW50KSwgKGdzdF9wbGF5X2Jhc2VfYmluX2FkZF9lbGVtZW50KToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5oOgorCU1ha2Ugc3VyZSB3ZSByZW1vdmUgc3VidGl0bGVzIGZyb20gdGhlIHNhbWUgYmluIHdlIHB1dCB0aGVtIGluLgorCSogZ3N0L3N1YnBhcnNlL2dzdHN1YnBhcnNlLmM6IChjb252ZXJ0X2VuY29kaW5nKSwgKHBhcnNlX3N1YnJpcCksCisJKGdzdF9zdWJwYXJzZV9idWZmZXJfZm9ybWF0X2F1dG9kZXRlY3QpLAorCShnc3Rfc3VicGFyc2VfY2hhbmdlX3N0YXRlKToKKwlGaXggc29tZSBtZW1sZWFrcyBhbmQgaW52YWxpZCBhY2Nlc3Nlcy4KKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAob2dnYW54X3R5cGVfZmluZCksCisJKG9nZ3NrZWxfdHlwZV9maW5kKSwgKGNtbWxfdHlwZV9maW5kKSwgKHBsdWdpbl9pbml0KToKKwlTb21lIHR5cGVmaW5kIGZ1bmN0aW9ucyBmb3IgQW5ub2RleCB2My4wIGZpbGVzCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuaDoKKwlHc3RSaWZmUmVhZENsYXNzIGlzIHRoZSBjb3JyZWN0IHBhcmVudCBjbGFzcy4KKworMjAwNS0wMS0yNSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOgorCShnc3RfcmlmZl9jcmVhdGVfdmlkZW9fY2Fwc193aXRoX2RhdGEpOgorCSAgQWRkIGV4dHJhZGF0YSB0byBodWZmeXV2IChmaXhlcyAjMTY1MDEzKS4KKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5jOgorCShnc3RfcmlmZl9yZWFkX3N0cmZfdmlkc193aXRoX2RhdGEpOgorCSAgRml4IGV4dHJhZGF0YSBleHRyYWN0aW9uIGlmIGl0IGlzIGluIHRoZSBjaHVuayBzaXplLgorCisyMDA1LTAxLTI1ICBFZHdhcmQgSGVydmV5ICA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzogKGdzdF9xdWFya3R2X2NsYXNzX2luaXQpLAorCShnc3RfcXVhcmt0dl9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3F1YXJrdHZfZGlzcG9zZSk6CisJICBNZW1vcnkgZnJlZSdpbmcgbG9jYXRpb24gZml4ICgjMTY0NzA4KS4KKworMjAwNS0wMS0yNSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChncm91cF9jb21taXQpLAorCShnZW5fcHJlcm9sbF9lbGVtZW50KSwgKHByb2JlX3RyaWdnZXJlZCksIChnZW5fc291cmNlX2VsZW1lbnQpLAorCShzZXR1cF9zb3VyY2UpLCAoZ3N0X3BsYXlfYmFzZV9iaW5fY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fYWRkX2VsZW1lbnQpOgorCSAgRG9uJ3QgYmxvY2sgZm9yIHN0cmVhbXMuCisJKiBnc3QvcGxheWJhY2svZ3N0c3RyZWFtaW5mby5jOiAoc3RyZWFtX2luZm9fY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3N0cmVhbV9pbmZvX3NldF9tdXRlKToKKwkgIFVzZSBnc3RfcGFkX3NldF9hY3RpdmVfcmVjdXJzaXZlLgorCisyMDA1LTAxLTI1ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCisJKiBzeXMvdjRsL2dzdHY0bGVsZW1lbnQuYyAoZ3N0X3Y0bF9pZmFjZV9zdXBwb3J0ZWQpOiBGaXggY29tcGlsZQorCWZvciAjaWZuZGVmIEhBVkVfWFZJREVPLgorCisyMDA1LTAxLTI0ICBKZWZmcmV5IEMuIE9sbGllCisKKwlyZXZpZXdlZCBieTogTWFjaWVqIEthdGFmaWFzeiAgPG1hdGhyaWNrQGZyZWVkZXNrdG9wLm9yZz4KKworCSogZXh0L2dzbS9nc3Rnc21kZWMuYzogKGdzdF9nc21kZWNfaW5pdCksIChnc3RfZ3NtZGVjX2NoYWluKToKKwkqIGV4dC9nc20vZ3N0Z3NtZGVjLmg6CisJKiBleHQvZ3NtL2dzdGdzbWVuYy5jOiAoZ3N0X2dzbWVuY19pbml0KSwgKGdzdF9nc21lbmNfY2hhaW4pOgorCSogZXh0L2dzbS9nc3Rnc21lbmMuaDoKKwlGaXggcmF0ZSB0byA4a0h6IGFzIHBlciBzcGVjLCByZW1vdmVzIG9ic2N1cmUgZXJyb3JzIHdoZW4gbm8gcmF0ZQorCXdhcyBnaXZlbiBieSBwcm9wZXJ0eS4gQWRkIHByb3BlciBidWZmZXIgdGltZXN0YW1wcyBhbmQgb2Zmc2V0cy4KKworMjAwNS0wMS0yNCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOgorCShnc3RfcmlmZl9jcmVhdGVfYXVkaW9fY2Fwc193aXRoX2RhdGEpOgorCSAgQXVkaW8gY2FuIGJlIDw4MDAwSHouCisKKzIwMDUtMDEtMjIgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoZ3N0X3BsYXlfYmFzZV9iaW5fY2hhbmdlX3N0YXRlKToKKwkgIEV4cGxpY2l0IHN0YXRlIGNoYW5nZSB0byB3b3JrYXJvdW5kIHJlZmNvdW50IGJ1Z3MuCisKKzIwMDUtMDEtMjIgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpbXV4X3dyaXRlX3RhZyksCisJKGdzdF9hdmltdXhfcmlmZl9nZXRfYXZpX2hlYWRlcik6CisJICBGaXguLi4KKworMjAwNS0wMS0xOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6IChnc3RfcmlmZl9wZWVrX2VsZW1lbnRfZGF0YSksCisJKGdzdF9yaWZmX3JlYWRfZWxlbWVudF9kYXRhKToKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5oOgorCSAgQWRkIF9wZWVrIHZlcnNpb24gKHJlcSdlZCBpbiBDRFhBKS4KKwkqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXBhcnNlLmM6IChnc3RfY2R4YXBhcnNlX2luaXQpLAorCShnc3RfY2R4YXBhcnNlX2xvb3ApOgorCSAgRml4IHBhcnNpbmcgaW4gcGxheWJpbi4KKwkqIGdzdC9wbGF5YmFjay9nc3RkZWNvZGViaW4uYzogKGNsb3NlX3BhZF9saW5rKToKKwkgIElnbm9yZSBjdXJyZW50XyBwYWRzLCB0aGV5IGNhdXNlIG1ham9yIGFubm95YW5jZS4KKworMjAwNS0wMS0xOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuYzogKGdzdF9hbHNhX3NpbmtfbG9vcCk6CisJICBTYWZldHkgZ3VhcmQuCisKKzIwMDUtMDEtMTkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpbXV4X3dyaXRlX3RhZyk6CisJICBGaXggcGFkZGluZy4uLgorCisyMDA1LTAxLTE5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChnc3RfZWJtbF9yZWFkX2J1ZmZlcik6CisJICBBbGxvdyBmb3IgMC1zaXplZCBidWZmZXJzLiBGaXhlcyBsZW5ndGggcXVlcnkgcHJvYmxlbXMgaW4KKwkgIHN0YXJ3YXJzLm1rdiBmcm9tIHRoZSB0ZXN0c3VpdGUuCisKKzIwMDUtMDEtMTkgIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X2NvcHlfcGxhbmVfaTQyMCksCisJKGdzdF92aWRlb19ib3hfaTQyMCksIChnc3RfdmlkZW9fYm94X2NoYWluKToKKwkgIEZpeCByb3cgc3RyaWRlcyBmb3IgSTQyMCAoZml4ZXMgIzE2MzE1OSkKKwkgIAorMjAwNS0wMS0xOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ3BhcnNlLmM6IChnc3RfbXBlZ19wYXJzZV9wYXJzZV9wYWNraGVhZCk6CisJICBNUEVHMiBoYXMgYSB1c2VmdWwgcmF0ZSBwcm9wZXJ0eSwgc28gd2UgY2FuIGFjdHVhbGx5IHVzZSB0aGF0LgorCSAgRm9yIE1QRUctMSwgY29udGludWUgdXNpbmcgdGhlIGJ5dGVzL3RpbWUgcHJvcGVydGllcy4KKworMjAwNS0wMS0xOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOgorCShnc3RfcmlmZl9jcmVhdGVfdmlkZW9fY2Fwc193aXRoX2RhdGEpLAorCShnc3RfcmlmZl9jcmVhdGVfdmlkZW9fdGVtcGxhdGVfY2Fwcyk6CisJICBBZGQgaW50ZWwtaDI2My4KKworMjAwNS0wMS0xOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfY2hlY2tfY2Fwc19yZXNldCksIChnc3RfbWFkX2NoYWluKToKKwkgIEZhaWwgaWYgY2FwcyBuZWdvdGlhdGlvbiBmYWlscy4gU2hvdWxkIGZpeCAjMTYyMTg0LCBhbmQgc2hvdWxkCisJICBkZWZpbmF0ZWx5IGJlIGluIHRoZXJlIHJlZ2FyZGxlc3Mgb2YgaXQgZml4aW5nIHRoZSBhY3R1YWwgYnVnLgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzogKGdzdF9hdmltdXhfZ2V0X3R5cGUpLCAoZ3N0X2F2aW11eF9pbml0KSwKKwkoZ3N0X2F2aW11eF93cml0ZV90YWcpLCAoZ3N0X2F2aW11eF9yaWZmX2dldF9hdmlfaGVhZGVyKSwKKwkoZ3N0X2F2aW11eF9yaWZmX2dldF9hdml4X2hlYWRlciksCisJKGdzdF9hdmltdXhfcmlmZl9nZXRfdmlkZW9faGVhZGVyKSwKKwkoZ3N0X2F2aW11eF9yaWZmX2dldF9hdWRpb19oZWFkZXIpLCAoZ3N0X2F2aW11eF93cml0ZV9pbmRleCksCisJKGdzdF9hdmltdXhfc3RhcnRfZmlsZSksIChnc3RfYXZpbXV4X2hhbmRsZV9ldmVudCksCisJKGdzdF9hdmltdXhfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4Lmg6CisJICBSZWZhY3RvciBzdHJ1Y3R1cmUgd3JpdGluZyB0byB1c2UgR1NUX1dSSVRFX1VJTlQgbWFjcm9zLCBhZGQKKwkgIG1ldGFkYXRhIHdyaXRpbmcgc3VwcG9ydC4KKworMjAwNS0wMS0xOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHN0cmVhbWluZm8uYzogKGdzdF9zdHJlYW1faW5mb19kaXNwb3NlKToKKwkgIEVsZW1lbnRzIG1heSBhbHJlYWR5IGJlIGRlc3Ryb3llZCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorCisyMDA1LTAxLTE4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9jaGFuZ2Vfc3RhdGUpLAorCShnc3RfcXRkZW11eF9sb29wX2hlYWRlciksIChnc3RfcXRkZW11eF9oYW5kbGVfZXNkcyk6CisJICBNb3JlIG1lbW9yeSBsZWFrIGZpeGVzICgjMTQ5MTYyKS4KKworMjAwNS0wMS0xOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3F0ZGVtdXhfYWRkX3N0cmVhbSk6CisJICBGaXggdHdvIG1lbWxlYWtzLgorCisyMDA1LTAxLTE4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZmFhZC9nc3RmYWFkLmM6IChnc3RfZmFhZF9zcmNnZXRjYXBzKToKKwkgIEFyZ2guLi4KKworMjAwNS0wMS0xNyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2ZhYWQvZ3N0ZmFhZC5jOiAoZ3N0X2ZhYWRfc3JjZ2V0Y2Fwcyk6CisJICBGaXggb2ZmLWJ5LW9uZSBidWcuIEZpeGVzIHdhcm5pbmdzIGR1cmluZyBwbGF5YmFjayBvZiBzaW5jaXR5Lm1wNAorCSAgd2hlbiBmaXhhdGluZyB0byBzaXggY2hhbm5lbHMgaW4gVG90ZW0uCisKKzIwMDUtMDEtMTcgIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZXh0L2R2ZHJlYWQvZHZkcmVhZHNyYy5jOiAoZ2V0X25leHRfY2VsbF9mb3IpOgorCSAgRml4IGNvbXBpbGUgd2FybmluZ3Mgb24gU29sYXJpcyAxMCBidWlsZGJvdAorCisyMDA1LTAxLTE3ICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisKKwkqIGV4dC9kdmRyZWFkL2R2ZHJlYWRzcmMuYzogKF9yZWFkKToKKwkgIERvbid0IHJlYWQgYmV5b25kIHRoZSBsYXN0IGNlbGwgaW4gYSBjaGFwdGVyIChmaXhlcyAKKwkgIGludmFsaWQgbWVtb3J5IGFjY2VzcykKKworMjAwNS0wMS0xNyAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCisJKiBleHQvZHZkcmVhZC9zdHJlYW1fbGFiZWxzLmM6CisJKGR2ZHJlYWRzcmNfZ2V0X2F1ZGlvX3N0cmVhbV9sYWJlbHMpOgorCSAgVXNlIE5VTEwgZm9yIGFuIGVtcHR5IEdMaXN0IGluc3RlYWQgb2YgZ19saXN0X2FsbG9jKCk7IGZpeCAKKwkgIG1lbW9yeSBsZWFrczsgcy9MQ1BNL0xQQ00vOyB1c2UgZ19zdHJkdXBfcHJpbnRmKCkgaW5zdGVhZCAKKwkgIG9mIEdTdHJpbmcgKGVhc2llciB0byBidWxrIGZyZWUgbGF0ZXIpCisKKzIwMDUtMDEtMTcgIEdlcmdlbHkgTmFneSAgPGFsZ2Vybm9uQGJvbmVodW50ZXIucnVsZXoub3JnPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2RlY21hcC5jOgorCShnc3RfZmZtcGVnX3BpeGZtdF90b19jYXBzKToKKwkgIEZpeCBCR1JBMzIgY2FwcyAoIzE2NDIwOSkuCisKKzIwMDUtMDEtMTcgIEdlcmdlbHkgTmFneSAgPGFsZ2Vybm9uQGJvbmVodW50ZXIucnVsZXoub3JnPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2RlY21hcC5jOgorCShnc3RfZmZtcGVnX2NhcHNfdG9fcGl4Zm10KToKKwkgIGFscGhhX21hc2sgY2FuIGJlIFJHQkEvQUJHUi4gRml4ZXMgIzE2NDI2NS4KKworMjAwNS0wMS0xNyAgRnJhbmNpcyBMYWJvbnRlICA8ZnJhbmNpc19sYWJvbnRlQGhvdG1haWwuY29tPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbXBlZzJkZWMvZ3N0bXBlZzJkZWMuYzogKGNyb3BfYnVmZmVyKSwKKwkoZ3N0X21wZWcyZGVjX2FsbG9jX2J1ZmZlcik6CisJKiBleHQvbXBlZzJkZWMvZ3N0bXBlZzJkZWMuaDoKKwkgIENyb3AgaWYgZGVjb2Rpbmcgc2l6ZSBpcyBub3QgdGhlIGFjdHVhbCBpbWFnZSBzaXplICgjMTYzNjc2KS4KKworMjAwNS0wMS0xNyAgU3RldmUgQmFrZXIgIDxzdGV2ZUBzdGV2ZWJha2VyLm9yZz4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChhaWZmX3R5cGVfZmluZCksCisJKHN2eF90eXBlX2ZpbmQpLCAoc2RzX3R5cGVfZmluZCksIChpcmNhbV90eXBlX2ZpbmQpLCAocGx1Z2luX2luaXQpOgorCSAgQWRkIGxpYnNuZGZpbGUgdHlwZWZpbmQgZnVuY3Rpb25zICgjMTYzMzA5KS4KKworMjAwNS0wMS0xNyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogdG9vbHMvZ3N0LWxhdW5jaC1leHQtbS5tOgorCSAgQWRkIC5hYWMsIGZpeCAubTF2Ly5tMnYgKCMxNjM4OTEpLgorCisyMDA1LTAxLTE3ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhY2xvY2suYzogKGdzdF9hbHNhX2Nsb2NrX3dhaXQpOgorCSAgU2FuaXR5IGNoZWNrLCBkb24ndCB3YWl0IGVuZGxlc3NseSBzaW5jZSB0aGUgY2xvY2sgbWlnaHQgbm90CisJICBhY3R1YWxseSBydW4gYXQgdGhpcyBwb2ludCAod2hpY2ggaXMgYSBkZWFkbG9jaykuIEZpeGVzICMxNjQwNjkuCisKKzIwMDUtMDEtMTYgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAocHJvYmVfdHJpZ2dlcmVkKToKKwkgIE9mIGNvdXJzZSwgb25seSBwYXVzZSBpZiBncm91cCBpcyBkb25lLi4uCisKKzIwMDUtMDEtMTYgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAocHJvYmVfdHJpZ2dlcmVkKToKKwkgIFRocmVhZCBzYWZldHkuCisKKzIwMDUtMDEtMTYgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZXh0L3N3ZmRlYy9nc3Rzd2ZkZWMuYzogKGdzdF9zd2ZkZWNfY2hhbmdlX3N0YXRlKToKKwkgIERvbid0IHJldHVybiBzdGF0ZSBjaGFuZ2Ugc3VjY2VzcyB3aGVuIHRoZSBwYXJlbnQKKwkgIGZhaWxlZC4KKworMjAwNS0wMS0xNiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzogKGdzdF9hdmltdXhfaGFuZGxlX2V2ZW50KToKKwkgIEZyZWUgZXZlbnRzIChmaXggbWVtbGVhayBpbiAjMTYyOTA1KS4KKworMjAwNS0wMS0xNSAgR2VyZ2VseSBOYWd5ICA8YWxnZXJub25AYm9uZWh1bnRlci5ydWxlei5vcmc+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvZGVjbWFwLmM6CisJKGdzdF9mZm1wZWdfY2Fwc190b19waXhmbXQpOgorCSAgRml4IGZvciBkZXB0aCA9IDE1LiBGaXhlcyAjMTYxNjc1LgorCisyMDA1LTAxLTE0ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvdjRsL2dzdHY0bHNyYy5jOiAoZ3N0X3Y0bHNyY19nZXRjYXBzKToKKwkgIFNldCBGUFMgY29ycmVjdGx5LCBldmVuIGZvciB3ZWJjYW1zIGFuZCB0aGUgbGlrZS4KKwkqIHN5cy92NGwvdjRsX2NhbGxzLmM6IChnc3RfdjRsX3NldF9jaGFuX25vcm0pOgorCSAgRG9uIGVycm9yIG9uIHNldHRpbmcgd2hpbGUgY2FwdHVyaW5nLgorCisyMDA1LTAxLTE0ICBTdGVwaGFuZSBMT0VVSUxMRVQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBnc3Qvc3VicGFyc2UvZ3N0c3VicGFyc2UuYzogKHBhcnNlX21kdmRzdWIpOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzogKGdzdF95NG1lbmNvZGVfc2lua2Nvbm5lY3QpOgorCSAgSSdtIGEgYmFkIGJveS4gdXNpbmcgLzEwMDEuIHRvIGZvcmNlIEMgdG8gZG8gZmxvYXQgZGl2aXNpb24KKwkgIGFuZCBub3QgaW50ZWdlciBkaXZpc2lvbiAoYXMgaXQgZGlkIGluIG15IGxhc3QgY29tbWl0KQorCSAgVGhhbmtzIHRvIERhdmlkIEkuIExlaG4gZm9yIHBvaW50aW5nIHRoaXMgbWlzdGFrZS4KKworMjAwNS0wMS0xNCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL3Y0bC9nc3R2NGxlbGVtZW50LmM6IChnc3RfdjRsX2lmYWNlX3N1cHBvcnRlZCk6CisJICBSZXZlcnQgSm9oYW7CtHMgMS4zNS0+MS4zNiBzaW5jZSBpdCBicmVha3MgY29tcGF0LgorCisyMDA1LTAxLTE0ICBTdGVwaGFuZSBMT0VVSUxMRVQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBleHQvbGliZmFtZS9nc3RsaWJmYW1lLmM6CisJKiBnc3Qvc3VicGFyc2UvZ3N0c3VicGFyc2UuYzogKHBhcnNlX21kdmRzdWIpOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzogKGdzdF95NG1lbmNvZGVfc2lua2Nvbm5lY3QpOgorICAgICAgICAgIHJlcGxhY2UgZnJhbWVyYXRlIGFwcm94aW1hdGlvbnMgYnkgdGhlaXIgcmVhbCB2YWx1ZQorICAgICAgICAgICgyNDAwMC8xMDAxLCAzMDAwMC8xMDAxLCA2MDAwMC8xMDAxKQorICAgICAgICAgIEZpbmlzaCBmaXhpbmcgYnVnICMxNjQwNDkKKworMjAwNS0wMS0xMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L29nZy9nc3RvZ2dtdXguYzoKKwkgIGVvcy9ib3MgZGVidWdnaW5nCisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmM6CisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmg6CisJKiBnc3QvdGNwL2dzdHRjcC5jOgorCSogZ3N0L3RjcC9nc3R0Y3AuaDoKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c2luay5jOgorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzcmMuYzoKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc2luay5jOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzcmMuYzoKKwkgIGltcHJvdmUgcmV1c2FiaWxpdHkgb2YgZWxlbWVudHMgYWZ0ZXIgc3RhdGUgY2hhbmdlcyBhbmQgZXJyb3JzCisJICBtYWtlIG11bHRpZmRzaW5rIHRocm93IGF3YXkgc3RyZWFtaGVhZGVycyB3aGVuIHJlY2VpdmluZyBuZXcgb25lcworCisyMDA1LTAxLTEzICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9yYXRlc19wcm9iZSk6CisJICBGaXggZm9yIGlmIGl0ZW1zIGFyZSBhbHJlYWR5IGluIGxpc3QuLi4KKworMjAwNS0wMS0xMiAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvYWRkZXIvZ3N0YWRkZXIuYzogKGdzdF9hZGRlcl9sb29wKToKKwkgIGZpeCBhZGRlciBhIGJpdCBzbyBpdCBkb2Vzbid0IHNjcmV3IHVwIHdpdGggZXZlbnRzIGFzIG11Y2ggYW55bW9yZQorCisyMDA1LTAxLTEyICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmM6IChnc3RfcGl4YnVmc2NhbGVfbGluayksCisJKHBpeGJ1ZnNjYWxlX3NjYWxlKSwgKGdzdF9waXhidWZzY2FsZV9jaGFpbik6CisJKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5oOgorCSAgSW5jb3Jwb3JhdGUgY2hhbmdlcyBmcm9tIFRpbS1QaGlsaXBwIE11ZWxsZXIgPHQuaS5tQG9yYW5nZS5uZXQ+CisJICB0byBlbnN1cmUgcm93c3RyaWRlcyBhcmUgY2FsY3VsYXRlZCB0aGUgc2FtZSB3YXkgYXMgCisJICBmZm1wZWdjb2xvcnNwYWNlCisJICBVc2UgZ3N0X2J1ZmZlcl9zdGFtcCBpbnN0ZWFkIG9mIGNvcHlpbmcgVElNRVNUQU1QIG1hbnVhbGx5LCBzbworCSAgdGhhdCB3ZSBwaWNrIHVwIGR1cmF0aW9uIGFuZCBvZmZzZXQgYWxzby4KKworMjAwNS0wMS0xMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzogKGdzdF9hdmltdXhfY2xhc3NfaW5pdCksCisJKGdzdF9hdmltdXhfcGFkX3VubGluayksIChnc3RfYXZpbXV4X3JlbGVhc2VfcGFkKToKKwkgIFJldXNhYmlsaXR5IGZpeGVzLgorCisyMDA1LTAxLTExICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhbWl4ZXIuYzogKGdzdF9hbHNhX21peGVyX3VwZGF0ZSksCisJKGdzdF9hbHNhX21peGVyX2dldF92b2x1bWUpLCAoZ3N0X2Fsc2FfbWl4ZXJfc2V0X3ZvbHVtZSksCisJKGdzdF9hbHNhX21peGVyX3NldF9tdXRlKSwgKGdzdF9hbHNhX21peGVyX3NldF9yZWNvcmQpLAorCShnc3RfYWxzYV9taXhlcl9zZXRfb3B0aW9uKSwgKGdzdF9hbHNhX21peGVyX2dldF9vcHRpb24pOgorCSAgVXBkYXRlIGZsYWdzIHdoZW4gcmVxdWVzdGVkLgorCisyMDA1LTAxLTExICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9yYXRlc19wcm9iZSk6CisJICBGaXggZG1peC4KKworMjAwNS0wMS0xMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChnc3RfcGxheV9iYXNlX2Jpbl9jbGFzc19pbml0KSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5faW5pdCksIChnc3RfcGxheV9iYXNlX2Jpbl9kaXNwb3NlKSwKKwkocHJvYmVfdHJpZ2dlcmVkKSwgKG5ld19kZWNvZGVkX3BhZCksIChnZW5fc291cmNlX2VsZW1lbnQpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9zZXRfcHJvcGVydHkpLCAoZ3N0X3BsYXlfYmFzZV9iaW5fZ2V0X3Byb3BlcnR5KToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5oOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdzdF9wbGF5X2Jpbl9jbGFzc19pbml0KSwKKwkoZ3N0X3BsYXlfYmluX2luaXQpLCAoZ3JvdXBfc3dpdGNoKSwgKHJlbW92ZV9zaW5rcyksIChzZXR1cF9zaW5rcyksCisJKGdzdF9wbGF5X2Jpbl9jaGFuZ2Vfc3RhdGUpOgorCSAgSW1wbGVtZW50IGdyb3VwLXN3aXRjaCBzaWduYWwgZm9yIHVzZSBpbiBhcHBzIHRvIGNsZWFyIG1ldGFkYXRhCisJICBjYWNoZSwgY2xlYW4gdXAgc3VidGl0bGUsIGFkZCBzdWJ1cmkgcHJvcGVydHkgaW5zdGVhZCBvZiAjIGhhY2ssCisJICBzb21lIGVycm9yLW91dCBmaXhlcy4KKworMjAwNS0wMS0xMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L3ZvcmJpcy92b3JiaXNkZWMuYzogKHZvcmJpc19kZWNfY2hhaW4pOgorCSAgRGVidWcuCisJKiBzeXMvdjRsL3Y0bHNyY19jYWxscy5jOiAoZ3N0X3Y0bHNyY19ncmFiX2ZyYW1lKToKKwkgIElmIHdlIGdvdCBhIHN0YXRlIGNoYW5nZSBpbiB0aGUgX2dldCBoYW5kbGVyLCBkb24ndCByZXR1cm4gc3VjY2Vzcy4KKworMjAwNS0wMS0xMCAgU3RlcGhhbmUgTE9FVUlMTEVUICA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogKGdzdF9qcGVnZGVjX215X291dHB1dF9tZXNzYWdlKSwKKwkoZ3N0X2pwZWdkZWNfbXlfZW1pdF9tZXNzYWdlKSwgKGdzdF9qcGVnZGVjX2luaXQpOgorCSAgTWFrZSBqcGVnZGVjIHF1aWV0IG9uIE1KUEVHIGRlY29kaW5nCisJKiBnc3QvYXNmZGVtdXgvUkVBRE1FOgorCSAgRml4IG1pbWV0eXBlcyBmb3IgTUpQRUcgYW5kIEgyNjMKKworMjAwNS0wMS0xMCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzogKHRoZW9yYV9kZWNfY2hhaW4pOgorCSAgRml4IGJyb2tlbiBjb2RlIGdlbmVyYXRpb24gYnkgZ2NjIGJ5IHN3YXBwaW5nIGFyZ3VtZW50cy4KKwkqIGV4dC92b3JiaXMvdm9yYmlzZGVjLmM6ICh2b3JiaXNfZGVjX3NyY19xdWVyeSk6CisJICBGaXggXG4gaW4gZGVidWcuCisKKzIwMDUtMDEtMTAgIFN0ZXBoYW5lIExPRVVJTExFVCAgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBUT0RPOgorCSAgZGVsZXRlIHRoaXMgZmlsZSwgaXQgaXMgYnkgZmFyIG91dGRhdGVkCisJKiBleHQvYWxzYS9nc3RhbHNhLjE6IHJlbW92ZQorCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoYWRkX3JhdGVzKSwgKGFkZF9jaGFubmVscyksIChnc3RfYWxzYV9jYXBzKSwKKwkoZ3N0X2Fsc2FfY2hlY2tfc2FtcGxlX3JhdGVzKSwgKGdzdF9hbHNhX3JhdGVzX3Byb2JlKSwKKwkoZ3N0X2Fsc2FfZ2V0X2NhcHMpOgorCSAgQWRkIEhXIHByb2JpbmcgZm9yIHN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMuIEZpeGVzICMxNjE3MDQKKworMjAwNS0wMS0xMCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F1ZGlvc2NhbGUvZ3N0YXVkaW9zY2FsZS5jOiAoZ3N0X2F1ZGlvc2NhbGVfY2hhaW4pOgorCSAgRG9uJ3QgY3Jhc2gsIGJpYXRjaCEgOikuCisKKzIwMDUtMDEtMTAgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9tdXNlcGFjay9nc3RtdXNlcGFja3JlYWRlci5jcHA6CisJKiBnc3QvYXBldGFnL2FwZWRlbXV4LmM6IChnc3RfYXBlX2RlbXV4X3N0cmVhbV9kYXRhKToKKwkgIFNvbWUgd29yayBvbiB0YWdzIC0gc3RpbGwgZG9lc24ndCB3b3JrIGluIHBsYXliaW4uLi4KKwkqIGdzdC9hdWRpb3NjYWxlL2dzdGF1ZGlvc2NhbGUuYzogKGdzdF9hdWRpb3NjYWxlX2NoYWluKToKKwkgIEhhbmRsZSBldmVudHMuLi4KKworMjAwNS0wMS0xMCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmVlKToKKwkgIEFsc28gc2hvdmUgdGFncyBvbiBraWQgcGFkcy4KKworMjAwNS0wMS0xMCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6IChnc3RfcmlmZl9yZWFkX3VzZV9ldmVudCk6CisJICBEb24ndCBiYWlsIG9uIHVua25vd24gZXZlbnRzLgorCSogZ3N0L2F1ZGlvc2NhbGUvZ3N0YXVkaW9zY2FsZS5jOiAoZ3N0X2F1ZGlvc2NhbGVfY2hhaW4pOgorCSAgRG9uJ3QgY3Jhc2ggb24gZXZlbnRzIGJlZm9yZSBuZWdvdGlhdGlvbi4KKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfYWRkX3N0cmVhbSk6CisJICBTZW5kIHRhZ3Mgb24gcGFkcywgdG9vLgorCSogZ3N0L3BsYXliYWNrL2dzdHN0cmVhbXNlbGVjdG9yLmM6CisJKGdzdF9zdHJlYW1fc2VsZWN0b3JfcmVxdWVzdF9uZXdfcGFkKToKKwkgIEZvcndhcmQgZXZlbnRzIG9uIGZpcnN0IHBhZCBpZiBubyBpbnB1dCB3YXMgc2VsZWN0ZWQgeWV0LgorCisyMDA1LTAxLTEwICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKHNldHVwX3N1YnN0cmVhbXMpOgorCSAgRG9uJ3QgZGlzYWJsZSBzdHJlYW10eXBlIGlmIHRoZSBzdHJlYW0gZG9lc24ndCBleGlzdCwgc2luY2UKKwkgIHRoZW4gcGxheWluZyBhIHZpZGVvIGFmdGVyIGF1ZGlvIHdpbGwgZGlzYWJsZSBib3RoIGFuZCBub3RoaW5nCisJICB3aWxsIGhhcHBlbi4gRml4ZXMgdGhlIHRlc3RzdWl0ZS4KKworMjAwNS0wMS0xMCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL3Y0bC9nc3R2NGx4b3ZlcmxheS5jOiAoZ3N0X3Y0bF94b3ZlcmxheV9pbnRlcmZhY2VfaW5pdCksCisJKGdzdF92NGxfeG92ZXJsYXlfc2V0X3h3aW5kb3dfaWQpOgorCSogc3lzL3Y0bDIvZ3N0djRsMnhvdmVybGF5LmM6IChnc3RfdjRsMl94b3ZlcmxheV9pbnRlcmZhY2VfaW5pdCksCisJKGdzdF92NGwyX3hvdmVybGF5X3NldF94d2luZG93X2lkKToKKwkgIEFkZCBkZWJ1ZyBjYXRlZ29yaWVzLCBmaXggb3ZlcmxheSBkaXNhYmxpbmcuCisKKzIwMDUtMDEtMTAgIFN0ZXBoYW5lIExPRVVJTExFVCAgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9jbGFzc19pbml0KSwgKGdzdF9hbHNhX2dldF9jYXBzKToKKwkqIGV4dC9hbHNhL2dzdGFsc2EuaDoKKwkgIEFkZCBIVyBwcm9iaW5nIGZvciBwZXJpb2RfY291bnQvc2l6ZSBhbmQgYnVmZmVyX3NpemUgTUlYL01BWAorCSAgQWRqdXN0IGRlZmF1bHQvdXNlciBkZWZpbmVkIHZhbHVlIGlmIG91dCBvZiBib3VuZHMKKwkgIFNob3VsZCBmaXggYnVnICMxNjIwMjQKKworMjAwNS0wMS0wOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQpOgorCSAgRml4IHdhcm5pbmcgKCMxNjExOTEpLgorCisyMDA1LTAxLTA5ICBTdGVwaGFuZSBMT0VVSUxMRVQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZXh0L2R2ZHJlYWQvc3RyZWFtX2xhYmVscy5jOgorCShkdmRyZWFkc3JjX2dldF9hdWRpb19zdHJlYW1fbGFiZWxzKToKKwkgIEZpeCB3YXJuaW5nIChpbml0IHRoZSBnb29kIHZhcmlhYmxlIGluIHN3aXRjaCBkZWZhdWx0KQorCisyMDA1LTAxLTA5ICBLb29wIE1hc3QgIDxrd21AcmFpbmJvdy1ydW5uZXIubmw+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC90dGEvZ3N0dHRhcGFyc2UuYzogKGdzdF90dGFfc3JjX2V2ZW50KToKKwkgIEZpeCBnY2MtMi45NSBjb21waWxlICgjMTYzNDg1KS4KKworMjAwNS0wMS0wOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOiAoZ3N0X2ZsYWNlbmNfaW5pdCksCisJKGdzdF9mbGFjZW5jX3NlZWtfY2FsbGJhY2spLCAoZ3N0X2ZsYWNlbmNfd3JpdGVfY2FsbGJhY2spLAorCShnc3RfZmxhY2VuY190ZWxsX2NhbGxiYWNrKSwgKGdzdF9mbGFjZW5jX2NoYWluKSwKKwkoZ3N0X2ZsYWNlbmNfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuaDoKKwkgIFVwZGF0ZSBmb3IgQVBJIGNoYW5nZSBpbiBmbGFjLTEuMS4xLiBVcGRhdGUgcmVxdWlyZW1lbnQgaW4KKwkgIGNvbmZpZ3VyZS5hYy4gRml4ZXMgIzE2Mjk3NC4KKworMjAwNS0wMS0wOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChncm91cF9kZXN0cm95KToKKwkgIFJlbW92ZSBoYWNrIHRvIGdldCByaWQgb2YgYXNzZXJ0IGFuZCBnZXQgcmlkIG9mIHVubGlua2VkCisJICBzaWduYWxzIHByb3Blcmx5LgorCisyMDA1LTAxLTA5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKHNldHVwX3NvdXJjZSk6CisJICBTZXQgc291cmNlIHRvIE5VTEwgc28gdGhhdCByZXNvdXJjZXMgYXJlIGZyZWUnZWQuIEZpeGVzIGlzc3VlcworCSAgd2l0aCBwbGF5YmFjayBvZiBDRERBIGFuZCBzaW1pbGFyIGRldmljZS1hY2Nlc3NpbmcgdGhpbmdzLgorCisyMDA1LTAxLTA5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiB0ZXN0c3VpdGUvZW1iZWQvTWFrZWZpbGUuYW06CisJICB0ZXN0LT5ub2luc3QsIGZpeCBtYWtlIHRlc3QgaW4gYnVpbGRib3QuCisKKzIwMDUtMDEtMDkgIFN0ZXBoYW5lIExPRVVJTExFVCAgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBleHQvZHZkcmVhZC9zdHJlYW1fbGFiZWxzLmM6IG5ldyBmaWxlCisJKiBleHQvZHZkcmVhZC9zdHJlYW1fbGFiZWxzLmg6IG5ldyBmaWxlCisJKiBleHQvZHZkcmVhZC9NYWtlZmlsZS5hbToKKwkqIGV4dC9kdmRyZWFkL2R2ZHJlYWRzcmMuYzogKF9zZWVrX3RpdGxlKToKKwkgIEV4dHJhY3QgYXVkaW8gc3RyZWFtIGxhYmVsIGZyb20gRFZEIElGTyBmaWxlcy4KKwkgIEl0IG9ubHkgZHVtcCB0aGVtIG9uIHRoZSBjb25zb2xlIGZvciBub3csIHN0aWxsIGhhdmUgdG8KKwkgIG1ha2UgcGxheWJpbiBhd2FyZSBvZiB0aGVtLgorCisyMDA1LTAxLTA5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKHNldHVwX3NvdXJjZSk6CisJICBGaXggaGFuZ2luZyBzdWJzLgorCisyMDA1LTAxLTA5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKGdzdF9wbGF5X2Jhc2VfYmluX2luaXQpLAorCShnZW5fcHJlcm9sbF9lbGVtZW50KSwgKHJlbW92ZV9ncm91cHMpLCAoc2V0dXBfc3VidGl0bGUpLAorCShnZW5fc291cmNlX2VsZW1lbnQpLCAoc2V0dXBfc291cmNlKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5oOgorCSAgTXVsdGlwbGUgLnN1YiBmaWxlcyBpcyBqdXN0IGEgc3R1cGlkIGlkZWEuLi4gRml4IHNvbWUgdGhyZWFkaW5nCisJICBtaXN0YWtlcy4gSW50ZXJlc3RpbmdseSwgZXh0ZXJuYWwgLnN1YiBmaWxlcyBjYXVzZSBwbGF5YmluIHRvCisJICBoYW5nLCBJIGRvbid0IGtub3cgd2h5Li4uIFBhcnNpbmcgZml4ZXMgY29udHJpYnV0ZWQgYnkgRnJhbsOnb2lzCisJICBLb29tYW4gPGZrb29tYW5AdHV4ZWQubmV0Pi4KKworMjAwNS0wMS0wOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogdGVzdHN1aXRlL2VtYmVkL01ha2VmaWxlLmFtOgorCSAgRml4IGJ1aWxkYm90LgorCisyMDA1LTAxLTA5ICBHZXJnZWx5IE5hZ3kgIDxhbGdlcm5vbkBib25laHVudGVyLnJ1bGV6Lm9yZz4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzogKGdzdF9wbmdlbmNfY2xhc3NfaW5pdCksCisJKGdzdF9wbmdlbmNfaW5pdCksIChnc3RfcG5nZW5jX2NoYWluKSwgKGdzdF9wbmdlbmNfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3BuZ2VuY19zZXRfcHJvcGVydHkpOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuaDoKKwkgIEFkZCBjb21wcmVzc2lvbiBsZXZlbCBwcm9wZXJ0eSAoIzE2MzMyMykuCisKKzIwMDUtMDEtMDkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4YW1wbGVzL2NhcHNmaWx0ZXIvY2Fwc2ZpbHRlcjEuYzogKG1haW4pOgorCSogZXhhbXBsZXMvc2Vla2luZy9zcGlkZXJfc2Vlay5jOiAobWFrZV9zcGlkZXJfcGlwZWxpbmUpOgorCSogZXh0L2R2ZHJlYWQvTWFrZWZpbGUuYW06CisJKiBleHQvZHZkcmVhZC9kZW1vLXBsYXk6CisJKiBleHQvZHZkcmVhZC9kZW1vLXBsYXkuYzoKKwkqIGdjb25mL2dzdHJlYW1lci5zY2hlbWFzLmluOgorCSogZ3N0LWxpYnMvZ3N0L2djb25mL2djb25mLmM6CisJKiBzeXMvdjRsL1RPRE86CisJKiB0ZXN0c3VpdGUvTWFrZWZpbGUuYW06CisJKiB0ZXN0c3VpdGUvZW1iZWQvTWFrZWZpbGUuYW06CisJKiB0ZXN0c3VpdGUvZW1iZWQvZW1iZWQuYzogKGNiX2V4cG9zZSksIChtYWluKToKKwkgIFJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byB4dmlkZW9zaW5rLCBmaXggZXhhbXBsZXMgKCMxNDA4NDUpLgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChncm91cF9kZXN0cm95KToKKwkgIEFwcGFyZW50bHksIGRpc3Bvc2FsIGRvZXMgbm90IHVubGluayAtIHNvIGRvIGV4cGxpY2l0ZWx5LgorCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuYzogKGdzdF9hbHNhX3NpbmtfY2hlY2tfZXZlbnQpOgorCSAgQWRkIGRlYnVnLgorCisyMDA1LTAxLTA5ICBNYWNpZWogS2F0YWZpYXN6IDxtYXRocmlja0BmcmVlZGVza3RvcC5vcmc+CisKKwkqIFJFQURNRTogZml4IFBLR19DT05GSUdfUEFUSCBpbnN0cnVjdGlvbnMsIHdoYXQgd2FzIHRoZXJlCisJcHJldmlvdXNseSB3YXMgYnJlYWtpbmcgZGVmYXVsdCBzZWFyY2ggcGF0aCwgbm90IG5pY2UuIAorCUZpeGVzICMxNjMzNTgKKworMjAwNS0wMS0wOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F1ZGlvc2NhbGUvZ3N0YXVkaW9zY2FsZS5jOiAoZ3N0X2F1ZGlvc2NhbGVfaW5pdCksCisJKGdzdF9hdWRpb3NjYWxlX2NoYWluKToKKwkgICUjXkBeI0BeQCNeI0BeI0BeQCNeQCNeQCNeQCNeI0BeI0BeI0BeQCNeI0AgZml4IHNlZWtpbmcKKwkgIHdoZW4gcmVzYW1wbGluZyAtIGhvdyB0aGUgXkAkXiFAXiEgaXMgdGhpcyBwb3NzaWJsZT8hPworCisyMDA1LTAxLTA5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9jaGFuZ2Vfc3RhdGUpOgorCSAgUmVzZXQgdmFyaWFibGVzIG9uIFJFQURZLgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9yZXF1ZXN0X25ld19wYWQpLAorCShnc3RfbWF0cm9za2FfbXV4X2xvb3ApOgorCSAgUmVxdWlyZSBkYXRhIGJlZm9yZSB3cml0aW5nIGhlYWRlci4KKworMjAwNS0wMS0wOSAgRnJhbmNpcyBMYWJvbnRlICA8ZnJhbmNpc19sYWJvbnRlQGhvdG1haWwuY29tPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9jaGFpbik6CisJICBEb24ndCBjYWxsIG1hZF9zdHJlYW1fc3luYygpIGRpcmVjdGx5IGFmdGVyIHJlY292ZXJpbmcgc3luYy4KKwkgIEZpeGVzICMxNTE2NjEuCisKKzIwMDUtMDEtMDkgIE1hcnRpbiBFaWtlcm1hbm4gIDxtZWlrZXJAdXBiLmRlPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvc25hcHNob3QvZ3N0c25hcHNob3QuYzogKGdzdF9zbmFwc2hvdF9jbGFzc19pbml0KSwKKwkoc25hcHNob3RfaGFuZGxlciksIChnc3Rfc25hcHNob3Rfc2lua2Nvbm5lY3QpLAorCShnc3Rfc25hcHNob3RfY2hhaW4pOgorCSAgQWxsb2NhdGUgcmVzb3VyY2VzIHdoZW4gcmVxdWlyZWQsIGZpeCByZWN1cnNpdmUgc2lnbmFsIGVtaXNzaW9uCisJICBhbmQgZml4IGNhcHMuIEZpeGVzICMxNjE2NjcuCisKKzIwMDUtMDEtMDkgIEdlcmdlbHkgTmFneSAgPGFsZ2Vybm9uQGJvbmVodW50ZXIucnVsZXoub3JnPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiAoZ3N0X3BuZ2RlY19zcmNfZ2V0Y2FwcyksCisJKGdzdF9wbmdkZWNfY2hhaW4pOgorCSAgSGFuZGxlIG9ubHkgOC1icHBjIChiaXRzLXBlci1waXhlbC1jb21wb25lbnQpIGltYWdlcywgYmV0dGVyCisJICBlcnJvciBoYW5kbGluZyBhbmQgY29ycmVjdCBzdHJpZGVzLiBGaXhlcyAjMTYzMTc3LgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzogKGdzdF9wbmdlbmNfc2lua2xpbmspLAorCShnc3RfcG5nZW5jX2NoYWluKToKKwkgIEJldHRlciBlcnJvciBoYW5kbGluZy4gRml4ZXMgIzE2MzM0OC4KKworMjAwNS0wMS0wOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2R2ZG5hdi9kdmRuYXZzcmMuYzogKGR2ZG5hdnNyY19nZXRfdHlwZSksCisJKGR2ZG5hdnNyY191cmlfZ2V0X3R5cGUpLCAoZHZkbmF2c3JjX3VyaV9nZXRfcHJvdG9jb2xzKSwKKwkoZHZkbmF2c3JjX3VyaV9nZXRfdXJpKSwgKGR2ZG5hdnNyY191cmlfc2V0X3VyaSksCisJKGR2ZG5hdnNyY191cmlfaGFuZGxlcl9pbml0KToKKwkgIEFkZCBEVkQtbmF2IFVSSSAoZHZkbmF2Oi8vKSBmb3IgVG90ZW0gdGVzdGluZyBwdXJwb3Nlcy4KKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoZ2VuX3NvdXJjZV9lbGVtZW50KToKKwkgIEFkZCBNTVMgdG8gc3RyZWFtaW5nIFVSSXMuCisKKzIwMDUtMDEtMDkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfbmF2aWdhdGlvbl9zZW5kX2V2ZW50KToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6CisJKGdzdF94dmltYWdlc2lua19uYXZpZ2F0aW9uX3NlbmRfZXZlbnQpOgorCSAgQ2hlY2sgZm9yIHBhZCBhdmFpbGFiaWxpdHkgYmVmb3JlIHNlbmRpbmcgZXZlbnQuCisKKzIwMDUtMDEtMDggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1wbHVnaW5zLnNwZWMuaW46CisJICBBZGQgc3VicGFyc2UuCisKKzIwMDUtMDEtMDggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIFNpbmNlIHdlIHVzZSBmdW5jdGlvbnMgZnJvbSBDVlMsIHVwIHJlcXVpcmVtZW50LgorCisyMDA1LTAxLTA4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svTWFrZWZpbGUuYW06CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKGdzdF9wbGF5X2Jhc2VfYmluX2NsYXNzX2luaXQpLAorCShncm91cF9kZXN0cm95KSwgKGdyb3VwX2NvbW1pdCksIChncm91cF9pc19tdXRlZCksCisJKGdlbl9wcmVyb2xsX2VsZW1lbnQpLCAoYWRkX3N0cmVhbSksICh1bmtub3duX3R5cGUpLAorCShwcm9iZV90cmlnZ2VyZWQpLCAocHJlcm9sbF91bmxpbmtlZCksIChtdXRlX3N0cmVhbSksCisJKHNpbGVuY2Vfc3RyZWFtKSwgKG5ld19kZWNvZGVkX3BhZCksIChzZXR1cF9zdWJzdHJlYW1zKSwKKwkoc2V0dXBfc291cmNlKSwgKGdldF9hY3RpdmVfc291cmNlKSwgKG11dGVfZ3JvdXBfdHlwZSksCisJKG11dGVkX2dyb3VwX2NoYW5nZV9zdGF0ZSksIChzZXRfYWN0aXZlX3NvdXJjZSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX3NldF9wcm9wZXJ0eSksIChnc3RfcGxheV9iYXNlX2Jpbl9nZXRfcHJvcGVydHkpLAorCShwbGF5X2Jhc2VfZW9zKSwgKGdzdF9wbGF5X2Jhc2VfYmluX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uaDoKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChhZGRfc2luayksIChzZXR1cF9zaW5rcyk6CisJKiBnc3QvcGxheWJhY2svZ3N0c3RyZWFtaW5mby5jOiAoZ3N0X3N0cmVhbV9pbmZvX2NsYXNzX2luaXQpLAorCShnc3Rfc3RyZWFtX2luZm9fZGlzcG9zZSksIChzdHJlYW1faW5mb19tdXRlX3BhZCksCisJKHN0cmVhbV9pbmZvX2NoYW5nZV9zdGF0ZSksIChnc3Rfc3RyZWFtX2luZm9fc2V0X211dGUpOgorCSogZ3N0L3BsYXliYWNrL2dzdHN0cmVhbXNlbGVjdG9yLmM6IChnc3Rfc3RyZWFtX3NlbGVjdG9yX2dldF90eXBlKSwKKwkoZ3N0X3N0cmVhbV9zZWxlY3Rvcl9iYXNlX2luaXQpLCAoZ3N0X3N0cmVhbV9zZWxlY3Rvcl9jbGFzc19pbml0KSwKKwkoZ3N0X3N0cmVhbV9zZWxlY3Rvcl9pbml0KSwgKGdzdF9zdHJlYW1fc2VsZWN0b3JfZGlzcG9zZSksCisJKGdzdF9zdHJlYW1fc2VsZWN0b3JfZ2V0X2xpbmtlZF9wYWQpLAorCShnc3Rfc3RyZWFtX3NlbGVjdG9yX2dldF9jYXBzKSwgKGdzdF9zdHJlYW1fc2VsZWN0b3JfbGluayksCisJKGdzdF9zdHJlYW1fc2VsZWN0b3JfZ2V0X2xpbmtlZF9wYWRzKSwKKwkoZ3N0X3N0cmVhbV9zZWxlY3Rvcl9yZXF1ZXN0X25ld19wYWQpLCAoZ3N0X3N0cmVhbV9zZWxlY3Rvcl9jaGFpbik6CisJKiBnc3QvcGxheWJhY2svZ3N0c3RyZWFtc2VsZWN0b3IuaDoKKwkgIEFkZGluZyBzdHJlYW0gc2VsZWN0aW9uIHN1cHBvcnQgcGx1cyByZXF1aXJlZCBwcm9wZXJ0aWVzIGZvcgorCSAgYXBwbGljYXRpb25zIHRvIHVzZSB0aGlzLiBGdWxseSBmaXhlcyAjMTAwOTMxLgorCisyMDA1LTAxLTA4ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9nYW1lcy9nc3RwdXp6bGUuYzogKG5hdl9ldmVudF9oYW5kbGVyKToKKwkgIC0gaGFuZGxlIG5hdiBldmVudHMgZGlmZmVyZW50bHk6IGZvcndhcmQgZXZlcnkgZXZlbnQgbm8gbWF0dGVyIGlmIGl0CisJICAgIHdhcyBoYW5kbGVkIG9yIG5vdC4KKwkgIC0gdHJhbnNsYXRlIGV2ZW50cworCSAgWW91IGNhbiBub3cgY2hlYXQgYnkgdXNpbmcgbmF2aWdhdGlvbnRlc3QgISBwdXp6bGUgYW5kIG1vdmluZyB0aGUKKwkgIG1vdXNlIGNsb3NlIHRvIHRoZSBlZGdlIG9mIGEgdGlsZS4gOykKKworMjAwNS0wMS0wOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19wYWRfbmV3KToKKwkqIGV4dC9vZ2cvZ3N0b2dtcGFyc2UuYzogKGdzdF9vZ21fdGV4dF9wYXJzZV9nZXRfdHlwZSksCisJKGdzdF9vZ21fdGV4dF9wYXJzZV9iYXNlX2luaXQpLCAoZ3N0X29nbV90ZXh0X3BhcnNlX2luaXQpLAorCShnc3Rfb2dtX3BhcnNlX2dldF9zaW5rX3F1ZXJ5dHlwZXMpLCAoZ3N0X29nbV9wYXJzZV9zaW5rX2NvbnZlcnQpLAorCShnc3Rfb2dtX3BhcnNlX3NpbmtfcXVlcnkpLCAoZ3N0X29nbV9wYXJzZV9jaGFpbiksCisJKGdzdF9vZ21fcGFyc2VfcGx1Z2luX2luaXQpOgorCSogZXh0L3BhbmdvL2dzdHRleHRvdmVybGF5LmM6IChnc3RfdGV4dG92ZXJsYXlfbGlua2VkcGFkcyksCisJKGdzdF90ZXh0b3ZlcmxheV9saW5rKSwgKGdzdF90ZXh0b3ZlcmxheV9nZXRjYXBzKSwKKwkoZ3N0X3RleHRvdmVybGF5X2V2ZW50KSwgKGdzdF90ZXh0b3ZlcmxheV92aWRlb19jaGFpbiksCisJKGdzdF90ZXh0b3ZlcmxheV9sb29wKSwgKGdzdF90ZXh0b3ZlcmxheV9pbml0KSwgKHBsdWdpbl9pbml0KToKKwkqIGV4dC9wYW5nby9nc3R0ZXh0b3ZlcmxheS5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSksCisJKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc2Vla19ldmVudCksCisJKGdzdF9tYXRyb3NrYV9kZW11eF9zeW5jX3N0cmVhbXMpLAorCShnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cCksCisJKGdzdF9tYXRyb3NrYV9kZW11eF9zdWJ0aXRsZV9jYXBzKSwKKwkoZ3N0X21hdHJvc2thX2RlbXV4X3BsdWdpbl9pbml0KToKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkqIGdzdC9wbGF5YmFjay9nc3RkZWNvZGViaW4uYzogKGNsb3NlX3BhZF9saW5rKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoZ3N0X3BsYXlfYmFzZV9iaW5faW5pdCksCisJKGdlbl9wcmVyb2xsX2VsZW1lbnQpLCAocmVtb3ZlX2dyb3VwcyksIChhZGRfc3RyZWFtKSwKKwkobmV3X2RlY29kZWRfcGFkKSwgKHNldHVwX3N1YnRpdGxlcyksIChnZW5fc291cmNlX2VsZW1lbnQpLAorCShzZXR1cF9zb3VyY2UpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmg6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJpbi5jOiAoZ2VuX3RleHRfZWxlbWVudCksIChzZXR1cF9zaW5rcyk6CisJKiBnc3Qvc3VicGFyc2UvTWFrZWZpbGUuYW06CisJKiBnc3Qvc3VicGFyc2UvZ3N0c3VicGFyc2UuYzogKGdzdF9zdWJwYXJzZV9nZXRfdHlwZSksCisJKGdzdF9zdWJwYXJzZV9iYXNlX2luaXQpLCAoZ3N0X3N1YnBhcnNlX2NsYXNzX2luaXQpLAorCShnc3Rfc3VicGFyc2VfaW5pdCksIChnc3Rfc3VicGFyc2VfZm9ybWF0cyksCisJKGdzdF9zdWJwYXJzZV9ldmVudG1hc2spLCAoZ3N0X3N1YnBhcnNlX2V2ZW50KSwKKwkoZ3N0X3N1YnBhcnNlX2hhbmRsZV9ldmVudCksIChjb252ZXJ0X2VuY29kaW5nKSwgKGdldF9uZXh0X2xpbmUpLAorCShwYXJzZV9tZHZkc3ViKSwgKHBhcnNlX21kdmRzdWJfaW5pdCksIChwYXJzZV9zdWJyaXApLAorCShwYXJzZV9zdWJyaXBfZGVpbml0KSwgKHBhcnNlX3N1YnJpcF9pbml0KSwgKHBhcnNlX21wc3ViKSwKKwkocGFyc2VfbXBzdWJfZGVpbml0KSwgKHBhcnNlX21wc3ViX2luaXQpLAorCShnc3Rfc3VicGFyc2VfYnVmZmVyX2Zvcm1hdF9hdXRvZGV0ZWN0KSwKKwkoZ3N0X3N1YnBhcnNlX2Zvcm1hdF9hdXRvZGV0ZWN0KSwgKGdzdF9zdWJwYXJzZV9sb29wKSwKKwkoZ3N0X3N1YnBhcnNlX2NoYW5nZV9zdGF0ZSksIChnc3Rfc3VicGFyc2VfdHlwZV9maW5kKSwKKwkocGx1Z2luX2luaXQpOgorCSogZ3N0L3N1YnBhcnNlL2dzdHN1YnBhcnNlLmg6CisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKG9nbXRleHRfdHlwZV9maW5kKSwKKwkocGx1Z2luX2luaXQpOgorCSAgQWRkIHN1YnRpdGxlIHN1cHBvcnQsIC5zdWIgcGFyc2VyIChzdXBwb3J0cyBTUlQgYW5kIE1Qc3ViKSwKKwkgIE9HTSB0ZXh0IHN1cHBvcnQsIE1hdHJvc2thIFVURi04IHRleHQgc3VwcG9ydCwgZGVhZGxvY2sgZml4ZXMKKwkgIGFsbCBvdmVyIHRoZSBwbGFjZSwgc3VidGl0bGUgYXdhcmVuZXNzIGluIGRlY29kZWJpbi9wbGF5YmluCisJICBhbmQgc29tZSBmaXhlcyB0byB0ZXh0b3ZlcmxheSB0byBoYW5kbGUgc3VidGl0bGVzIGluIGEgc3RyZWFtCisJICBjb3JyZWN0bHkuIEZpeGVzICMxMDA5MzEuCisKKzIwMDUtMDEtMDggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC92b3JiaXMvdm9yYmlzZGVjLmM6ICh2b3JiaXNfZGVjX3NyY19xdWVyeSk6CisJICBDaGVjayBmb3IgcGFkIGF2YWlsYWJpbGl0eSBiZWZvcmUgZG9pbmcgYSBxdWVyeSBvbiBpdC4KKworMjAwNS0wMS0wOCAgU3RlcGhhbmUgTE9FVUlMTEVUICA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSAgcmVhbGx5IGZpeCBicHAyNC8zMiBkdmRlYyBjYXBzIChjbGFzc2ljIHJnYmEgaW5kZWVkKQorCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6CisJKGdzdF9hc2ZfZGVtdXhfcHJvY2Vzc19leHRfY29udGVudF9kZXNjKToKKwkgIGRvbid0IHNlbmQgdGV4dCB0YWdzIGlmIHRoZXkgYXJlIGVtcHR5IChiaXMgcmVwZXRpdGEpCisKKzIwMDUtMDEtMDggIFN0ZXBoYW5lIExPRVVJTExFVCAgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzoKKwkgcmVtb3ZlIHVubmVlZGVkIGNvbW1lbnQgZnJvbSBkdmRlYworCSAgKHJlbGF0ZWQgdG8gRFYgNENDIGNvZGVzIGluIEFWSSBmaWxlcykKKwkgIG1vdmVkIHRoZW0gaW4gZ3N0cmVhbWVyL2RvY3MvcmFuZG9tL21pbWV0eXBlcworCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6CisJKGdzdF9hc2ZfZGVtdXhfcHJvY2Vzc19leHRfY29udGVudF9kZXNjKToKKwkgZG9uJ3Qgc2VuZCB0ZXh0IHRhZ3MgaWYgdGhleSBhcmUgZW1wdHkKKwkgZml4IG1lbSBsZWFrIG9uIGVycm9yIHBhdGgKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2F2Y29kZWMuaDoKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvZGVjbWFwLmM6CisJKGdzdF9mZm1wZWdfcGl4Zm10X3RvX2NhcHMpLCAoZ3N0X2ZmbXBlZ19jYXBzX3RvX3BpeGZtdCksCisJKGdzdF9mZm1wZWdjc3BfYXZwaWN0dXJlX2ZpbGwpOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvaW1nY29udmVydC5jOiAoaW1nX2dldF9hbHBoYV9pbmZvKToKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2ltZ2NvbnZlcnRfdGVtcGxhdGUuaDoKKwkgYWRkcyBCR1IzMiBhbmQgQkdSQTMyIHRvIGZmbXBlZ2NvbG9yc3BhY2UKKwkgIChzdGlsbCBiYWQgY29sb3JzLCBmaXhpbmcgaXQgb24gbmV4dCBjb21taXQpCisJICBoZWxwcyB3aXRoIGR2ZGVjIG91dHB1dGluZyBCR1IzMgorCisyMDA1LTAxLTA4ICBTdGVwaGFuZSBMT0VVSUxMRVQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJIEZpeCBhdWRpbyBjYXBzIGkganVzdCBicm9rZSAobWlzc2luZyAnLCcpCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChnc3RfbWF0cm9za2FfbXV4X2dldF90eXBlKSwKKwkoZ3N0X21hdHJvc2thX211eF9yZXNldCk6CisJIEZpeCB0eXBvICsgYWRkIEZJWE1FIGFib3V0IG9sZCAieC1nc3QtbWV0YWRhdGEiIGNyYXAKKworMjAwNS0wMS0wNyAgU3RlcGhhbmUgTE9FVUlMTEVUICA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGV4dC9kdi9kZW1vLXBsYXkuYzogKG1haW4pOgorCSB4dmlkZW9zaW5rIC0+IHh2aW1hZ2VzaW5rCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzoKKwkgY2hhbmdlIHJnYiAzMi8zMiBjYXBzIHRvIDI0LzMyIChubyBhbHBoYSkKKwkgY2hhbmdlIG5iIG9mIGNoYW5uZWxzIHRvIGJlIGEgbGlzdCAoMiBvciA0LCBub3QgMikKKwkgY2hhbmdlIHNhbXBsZSByYXRlIHRvIGJlIGEgbGlzdCAoMzIsIDQ0LjEsIDQ4IGtIeikgbm90IGEgcmFuZ2UKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOgorCShnc3RfYXNmX2RlbXV4X3Byb2Nlc3NfZXh0X2NvbnRlbnRfZGVzYyk6CisJIEFkZCAnZGF0ZS95ZWFyJyB0byBleHRyYWN0ZWQgbWV0YWRhdGEgbGlzdAorCisyMDA1LTAxLTA3ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOiAoZ3N0X2F1ZGlvX2NvbnZlcnRfZml4YXRlKToKKwkgIFRoZSByZXR1cm4gdmFsdWUgb2YgZml4YXRlX3RvIGRvZXMgbm90IGltcGx5IHRoYXQgdGhlIHJlcXVlc3RlZAorCSAgdmFsdWUgd2FzIHNldCwgc28gZG9uJ3QgYXNzdW1lLgorCisyMDA1LTAxLTA3ICBHZXJnZWx5IE5hZ3kgIDxhbGdlcm5vbkBib25laHVudGVyLnJ1bGV6Lm9yZz4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6IChnc3RfcG5nZW5jX2Jhc2VfaW5pdCksCisJKGdzdF9wbmdlbmNfc2lua2xpbmspLCAoZ3N0X3BuZ2VuY19pbml0KSwgKGdzdF9wbmdlbmNfY2hhaW4pOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuaDoKKwkgIEFscGhhIHN1cHBvcnQgKGVuY29kZXI7ICMxNjMxNjEpLCBtaW1lIGZpeGFnZS4KKworMjAwNS0wMS0wNyAgU2ViYXN0aWVuIENvdGUgIDxzYzVAaGVybWVzLnVzaGVyYi5jYT4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2ZhYWMvZ3N0ZmFhYy5jOiAoZ3N0X2ZhYWNfb3V0cHV0Zm9ybWF0X2dldF90eXBlKSwKKwkoZ3N0X2ZhYWNfY2xhc3NfaW5pdCksIChnc3RfZmFhY19pbml0KSwgKGdzdF9mYWFjX3NyY2Nvbm5lY3QpLAorCShnc3RfZmFhY19zZXRfcHJvcGVydHkpLCAoZ3N0X2ZhYWNfZ2V0X3Byb3BlcnR5KToKKwkqIGV4dC9mYWFjL2dzdGZhYWMuaDoKKwkgIEFsbG93IGZvciBBRFRTIG91dHB1dCAoIzE1MzQzNCkuCisKKzIwMDUtMDEtMDcgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogKGdzdF92NGwyc3JjX2dldGNhcHMpOgorCSAgRml4IGFnYWluc3QgdGVtcGxhdGUgKCMxNTA1NzYpLgorCisyMDA1LTAxLTA2ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9nYW1lcy9nc3RwdXp6bGUuYzogKGRyYXdfcHV6emxlKToKKwkgIGRvbid0IGRyYXcgYSBwdXp6bGUgaWYgZWl0aGVyIHdpZHRoIG9yIGhlaWdodCBvZiB0aWxlcyB3b3VsZCBiZSAwLgorCisyMDA1LTAxLTA2ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9nYW1lcy9nc3RwdXp6bGUuYzogKGdzdF9wdXp6bGVfZ2V0X3R5cGUpLAorCShnc3RfcHV6emxlX2NsYXNzX2luaXQpLCAoZ3N0X3B1enpsZV9maW5hbGl6ZSk6CisJICBubyBtZW1sZWFrcywgcGxlYXNlCisJKGdzdF9wdXp6bGVfY3JlYXRlKSwgKGdzdF9wdXp6bGVfaW5pdCksCisJKGdzdF9wdXp6bGVfc2V0X3Byb3BlcnR5KSwgKGdzdF9wdXp6bGVfc2V0dXApOgorCSAgY2hhbmdlIGluaXRpYWxpemF0aW9uIGNvZGUgYXJvdW5kIHNvIHdlIGRvbid0IHJlc2h1ZmZsZSBvbiByZXNpemUKKwkoZHJhd19wdXp6bGUpOgorCSAgZml4IGFub3RoZXIgc3R1cGlkIHR5cG8KKworMjAwNS0wMS0wNiAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvZ2FtZXMvZ3N0dmlkZW9pbWFnZS5jOiAoY29weV9obGluZV9ZVVkyKToKKwkgIGZpeCBzdHVwaWQgdHlwbyB0aGF0IGJvcmtlZCBjb3B5aW5nIG9uIFlVWTIKKworMjAwNS0wMS0wNiAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvZ2FtZXMvZ3N0cHV6emxlLmM6IChkcmF3X3B1enpsZSk6CisJICBmaXggZWRnZXMgd2hlbiBpbWFnZSBzaXplcyBhcmVuJ3QgbXVsdGlwbGVzIG9mIHRpbGUgc2l6ZXMKKworMjAwNS0wMS0wNiAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvZ2FtZXMvZ3N0cHV6emxlLmM6IChnc3RfcHV6emxlX2Jhc2VfaW5pdCk6CisJICBtYWtlIFJHQiBlbmRpYW5uZXNzIHdvcmsgY29ycmVjdGx5CisJKGdzdF9wdXp6bGVfc2hvdyksIChnc3RfcHV6emxlX3N3YXApLCAoZ3N0X3B1enpsZV9tb3ZlKToKKwkgIHJlZmFjdG9yIGFuZCBmaXggcmFjZSB3aXRoIGluaXRpYWwgc2h1ZmZsaW5nCisJKG5hdl9ldmVudF9oYW5kbGVyKToKKwkgIGFsbG93IHVzaW5nIHRoZSBtb3VzZSB0byBwdXp6bGUKKwkoZHJhd19wdXp6bGUpOgorCSAgaW5zaXN0IG9uIHRpbGVzIGhhdmluZyB3aWR0aCBhbmQgaGVpZ2h0IGFzIG11bHRpcGxlcyBvZiA0IHRvIGdldAorCSAgY2xlYW4gWVVWIGltYWdlIGhhbmRsaW5nCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3h2aW1hZ2VfbmV3KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2hhbmRsZV94ZXZlbnRzKSwgKGdzdF94dmltYWdlc2lua19idWZmZXJfYWxsb2MpOgorCSAgcy9ERUJVRy9MT0cvIGZvciBjb21tb24gbWVzc2FnZXMKKwkoZ3N0X3h2aW1hZ2VzaW5rX25hdmlnYXRpb25fc2VuZF9ldmVudCk6CisJICBmaXggbW91c2UgZXZlbnQgdHJhbnNsYXRpb24gdG8gbm90IGluY2x1ZGUgc2NyZWVuIFBBUgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19uYXZpZ2F0aW9uX3NlbmRfZXZlbnQpOgorCSAgZml4IG1vdXNlIGV2ZW50IHRyYW5zbGF0aW9uIHRvIGFjdHVhbGx5IHdvcmsKKworMjAwNS0wMS0wNiAgU3RlcGhhbmUgTE9FVUlMTEVUICA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOgorCShnc3RfYXNmX2RlbXV4X3Byb2Nlc3NfZXh0X2NvbnRlbnRfZGVzYyk6CisJIEV4dHJhY3QgVHJhY2tOdW1iZXIgbWV0YWRhdGEgKyBjbGVhbiB1cCBjb2RlCisJKiBnc3QvZ2FtZXMvZ3N0dmlkZW9pbWFnZS5jOiAoZ3N0X3ZpZGVvX2ltYWdlX2RyYXdfcmVjdGFuZ2xlKToKKwkgSG9wZSB0aGlzIGlzIHRoZSBnb29kIGZpeCAodmFyIHVzZWQgdW5pdGlhbGlzZWQpCisKKzIwMDUtMDEtMDYgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9mYWFkL2dzdGZhYWQuYzogKGdzdF9mYWFkX2NoYWluKToKKwkgIE9ubHkgaW5jcmVtZW50IHRpbWVzdGFtcCBpZiBpdCdzIHZhbGlkLiBGaXhlcyByYXcgQUFDIHN0cmVhbXMuCisKKzIwMDUtMDEtMDYgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2dhbWVzL01ha2VmaWxlLmFtOgorCSogZ3N0L2dhbWVzL2dzdHB1enpsZS5jOgorCSAgYWRkIGEgcHV6emxlIGdhbWUgd2l0aC4uLgorCSogZ3N0L2dhbWVzL2dzdHZpZGVvaW1hZ2UuYzoKKwkqIGdzdC9nYW1lcy9nc3R2aWRlb2ltYWdlLmg6CisJICAuLi4gZnVsbCBjb2xvcnNwYWNlIHN1cHBvcnQgKHRoYXQgaW5jbHVkZXMgWVVWOSBhbmQgUkdCMTYpKSBzdG9sZW4KKwkgIGZyb20gdmlkZW90ZXN0c3JjIGFuZCBtYWRlIGludG8gc29tZXRoaW5nIHRoYXQgd291bGQgYmUgYSBuaWNlCisJICBsaWJyYXJ5IGZvciBhIGxvdCBvZiBvdGhlciBwbHVnaW5zLgorCisyMDA1LTAxLTA2ICBTdGVwaGFuZSBMT0VVSUxMRVQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogY29uZmlndXJlLmFjOgorCSBkb24ndCBjb21waWxlIGZhYWQgcGx1Z2luIGlmIGEgUkMgb2YgMi4wIGlzIGZvdW5kCisJIEZpeGVzICMxNTUzNDYgKGFuZCBGQzEgYnVpbGRib3QpCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzoKKwkoZ3N0X2FzZl9kZW11eF9wcm9jZXNzX2V4dF9jb250ZW50X2Rlc2MpOgorCSB0cnkgdG8gbWFrZSBTb2xhcmlzIGNvbXBpbGVyIGhhcHBpZXIKKworMjAwNS0wMS0wNiAgUGF1bCBKYWNrICA8cGphY2tAc2ZhZi5vcmc+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9zbmFwc2hvdC9nc3RzbmFwc2hvdC5jOiAoZ3N0X3NuYXBzaG90X2NsYXNzX2luaXQpOgorCSAgRml4IHNlZ2ZhdWx0ICgjMTYxNjY3KS4KKworMjAwNS0wMS0wNSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzogKGdzdF92NGxzcmNfZ2V0Y2Fwcyk6CisJICBGaXggZnJhbWVyYXRlIHJlcG9ydGluZy4KKworMjAwNS0wMS0wNSAgU3RlcGhhbmUgTE9FVUlMTEVUICA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtaWRzLmg6CisJKiBnc3Qvd2F2ZW5jL3JpZmYuaDoKKwkgQWRkIEFNUiAoVkJSIGFuZCBDQlIpIGlkcyB0byByaWZmLmggYXVkaW8gY29kZWMgbGlzdAorCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6CisJKGdzdF9hc2ZfZGVtdXhfcHJvY2Vzc19leHRfY29udGVudF9kZXNjKSwKKwkoZ3N0X2FzZl9kZW11eF9wcm9jZXNzX29iamVjdCk6CisJICBSZXRyaWV2ZSBtb3JlIHRhZ3MgZnJvbSBBU0YgZmlsZXMgKEdlbnJlLCBBbGJ1bVRpdGxlLCBBcnRpc3QpCisKKzIwMDUtMDEtMDUgIE1hcnRpbiBFaWtlcm1hbm4gIDxtZWlrZXJAdXBiLmRlPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RkdmRkZW11eC5jOiAoZ3N0X2R2ZF9kZW11eF9jbGFzc19pbml0KSwKKwkoZ3N0X2R2ZF9kZW11eF9oYW5kbGVfZGlzY29udCk6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVnZGVtdXguYzogKGdzdF9tcGVnX2RlbXV4X2NsYXNzX2luaXQpLAorCShnc3RfbXBlZ19kZW11eF9oYW5kbGVfZGlzY29udCk6CisJICBSZWNyZWF0ZSBwYWRzIG9uIG5ldy1tZWRpYSAoIzE2MDczMCkuCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVncGFyc2UuYzogKGdzdF9tcGVnX3BhcnNlX25ld19wYWQpOgorCSAgU2VuZCBkaXNjb250IGV2ZW4gaWYgbWFuYWdlciBjaGFuZ2VzIHRpbWVzdGFtcHMgKCMxNjE5MjkpLgorCisyMDA1LTAxLTA1ICBTZWJhc3RpZW4gQ290ZSAgPHNjNUBoZXJtZXMudXNoZXJiLmNhPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmVzYW1wbGUvcmVzYW1wbGUuYzogKGdzdF9yZXNhbXBsZV9zaW5jX2Z0X3MxNik6CisJICBGaXggaW52YWxpZCBtZW1vcnkgYWNjZXNzICgjMTU5MjExKS4KKworMjAwNS0wMS0wNSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXhhbXBsZXMvZ3N0cGxheS9wbGF5ZXIuYzogKG1haW4pOgorCSAgRG9uJ3QgaXRlcmF0ZS4KKwkqIGV4YW1wbGVzL3NlZWtpbmcvc2Vlay5jOiAoZml4YXRlKSwgKG1ha2VfcGxheWVyYmluX3BpcGVsaW5lKToKKwkgIEFkZCB2aXN1YWxpemF0aW9ucy4KKwkqIGV4dC9hNTJkZWMvZ3N0YTUyZGVjLmM6IChnc3RfYTUyZGVjX3B1c2gpLAorCShnc3RfYTUyZGVjX2hhbmRsZV9mcmFtZSk6CisJICBTZXQgZHVyYXRpb24uCisJKiBleHQvZHZkbmF2L2dzdC1kdmQ6CisJICBBZGQgYXVkaW9jb252ZXJ0LiBGaXhlcyAjMTYxMzI1LgorCSogZXh0L2R2ZHJlYWQvZHZkcmVhZHNyYy5jOiAoZHZkcmVhZHNyY19nZXQpOgorCSAgRXhwbGljaXRlbHkgY2FzZSB0byBnaW50NjQuIFBvc3NpYmxlIHZhbGdyaW5kIGVycm9yLgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5jOiAoY2Fwc19zZXQpLCAoc2V0dXBfc2l6ZSksCisJKGdzdF9wbGF5X3RpY2tfY2FsbGJhY2spLCAoZ3N0X3BsYXlfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3BsYXlfZGlzcG9zZSksIChnc3RfcGxheV9pbml0KSwgKGdzdF9wbGF5X2NsYXNzX2luaXQpLAorCShnc3RfcGxheV9zZXRfbG9jYXRpb24pLCAoZ3N0X3BsYXlfZ2V0X2xvY2F0aW9uKSwKKwkoZ3N0X3BsYXlfc2Vla190b190aW1lKSwgKGdzdF9wbGF5X3NldF9kYXRhX3NyYyksCisJKGdzdF9wbGF5X3NldF92aWRlb19zaW5rKSwgKGdzdF9wbGF5X3NldF9hdWRpb19zaW5rKSwKKwkoZ3N0X3BsYXlfc2V0X3Zpc3VhbGl6YXRpb24pLCAoZ3N0X3BsYXlfY29ubmVjdF92aXN1YWxpemF0aW9uKSwKKwkoZ3N0X3BsYXlfZ2V0X2ZyYW1lcmF0ZSksIChnc3RfcGxheV9nZXRfYWxsX2J5X2ludGVyZmFjZSksCisJKGdzdF9wbGF5X25ldyk6CisJICBVc2UgcGxheWJpbi4gRml4ZXMgIzEzOTc0OSBhbmQgIzE0Nzc0NC4KKwkqIGdzdC9hcGV0YWcvYXBlZGVtdXguYzogKGdzdF9hcGVfZGVtdXhfcGFyc2VfdGFncyk6CisJICBBZGQgZ2VucmUgdGFnLgorCSogZ3N0L2F1ZGlvc2NhbGUvZ3N0YXVkaW9zY2FsZS5jOiAoZ3N0X2F1ZGlvc2NhbGVfbWV0aG9kX2dldF90eXBlKSwKKwkoYXVkaW9zY2FsZV9nZXRfdHlwZSksIChnc3RfYXVkaW9zY2FsZV9iYXNlX2luaXQpLAorCShnc3RfYXVkaW9zY2FsZV9jbGFzc19pbml0KSwgKGdzdF9hdWRpb3NjYWxlX2V4cGFuZF9jYXBzKSwKKwkoZ3N0X2F1ZGlvc2NhbGVfZ2V0Y2FwcyksIChnc3RfYXVkaW9zY2FsZV9maXhhdGUpLAorCShnc3RfYXVkaW9zY2FsZV9saW5rKSwgKGdzdF9hdWRpb3NjYWxlX2dldF9idWZmZXIpLAorCShnc3RfYXVkaW9zY2FsZV9kZWNyZWFzZV9yYXRlKSwgKGdzdF9hdWRpb3NjYWxlX2luY3JlYXNlX3JhdGUpLAorCShnc3RfYXVkaW9zY2FsZV9pbml0KSwgKGdzdF9hdWRpb3NjYWxlX2Rpc3Bvc2UpLAorCShnc3RfYXVkaW9zY2FsZV9jaGFpbiksIChnc3RfYXVkaW9zY2FsZV9zZXRfcHJvcGVydHkpLAorCShnc3RfYXVkaW9zY2FsZV9nZXRfcHJvcGVydHkpLCAocGx1Z2luX2luaXQpOgorCSAgSW5kZW50IHByb3Blcmx5LgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0ZHZkZGVtdXguYzogKGdzdF9kdmRfZGVtdXhfcHJvY2Vzc19wcml2YXRlKToKKwkgIEZpeCBMUENNLgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV91ZHRhKSwKKwkocXRkZW11eF90YWdfYWRkX3N0ciksIChxdGRlbXV4X3RhZ19hZGRfbnVtKSwKKwkocXRkZW11eF90YWdfYWRkX2ducmUpLCAocXRkZW11eF92aWRlb19jYXBzKToKKwkgIEFkZCBtb3JlIG1ldGFkYXRhIChmaXhlcyAjMTYyNjU2KS4KKworMjAwNS0wMS0wNSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgYmFjayB0byBjdnMKKworPT09IHJlbGVhc2UgMC44LjcgPT09CisKKzIwMDUtMDEtMDUgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSAgcmVsZWFzaW5nIDAuOC43LCAiSHlwZXJzcGFjZSIKKworMjAwNS0wMS0wNSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCXBhdGNoIGJ5OiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dC5pLm1AemVuLmNvLnVrPgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzoKKwkgRml4IGZvciAjMTYyOTI0IC0gZnJlZSBjYXBzIGFmdGVyIHVzZSwgbm90IGJlZm9yZQorCisyMDA1LTAxLTA0ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJcGF0Y2ggYnk6IFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIEZpeCBmb3IgIzE1NDc3MyAtIGZpeGVzIHBsYXliYWNrIG9mIHNtYWxsIC53YXYgZmlsZXMKKworMjAwNS0wMS0wMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCXBhdGNoIGJ5OiBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdWRpb3NjYWxlL2dzdGF1ZGlvc2NhbGUuYzoKKwkgIEZpeCBmb3IgIzE2MjgxOSAtIG1ha2UgYXVkaW9zY2FsZSByZXVzYWJsZQorCSAgRml4ZXMgcGxheWJhY2sgb2YgbW9yZSB0aGFuIG9uZSBmaWxlIHdpdGggcGxheWJpbi90b3RlbQorCisyMDA0LTEyLTI5ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9hdmNvZGVjLmg6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2RlY21hcC5jOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvaW1nY29udmVydC5jOgorCSAgY2xlYW4gdXAgdGhlIG1lc3MgdGhhdCBtYWRlIG1lIGNyeSBhbmQgYXZvaWQgbmVlZGxlc3MgZHVwbGljYXRpb24KKworMjAwNC0xMi0yOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvaW1nY29udmVydC5jOgorCSAgZ2l2ZSBzb21lIGluZGljYXRpb24gb2Ygd2h5IHdlJ3JlIHNlZ2ZhdWx0aW5nCisKKzIwMDQtMTItMjkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEZpeCBpbmRlbnRhdGlvbiwgZml4IHY0bDIgcGx1Z2luIGRldGVjdGlvbi4KKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkgIEZpeCBsaWJtbXMgbG9jYXRpb24gKE1hY2llaiwgdXNlIGRpZmYgLXUhKS4KKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX2luaXQpOgorCSAgSW5pdGlhbGl6ZSBjYXBzIGNhY2hlIHRvIE5VTEwuCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJpbi5jOiAoZ3N0X3BsYXlfYmluX2NoYW5nZV9zdGF0ZSk6CisJICBPbmx5IGNoYW5nZSBzdGF0ZSBvbiBhdWRpb3NpbmsgaWYgaXQgZXhpc3RzLgorCisyMDA0LTEyLTI4ICBNYWNpZWogS2F0YWZpYXN6ICA8bWF0aHJpY2tAbWF0aHJpY2sub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCUZpeCBWb3JiaXMgc3RyZWFtcyBmYWlsaW5nIHRvIGRlY29kZSBpbiBzb21lIGZpbGVzLCB3aGVyZSBjbHVzdGVyX3RpbWUKKwlpc24ndCAwLCBiZWNhdXNlIHRoZW4gaXQgZG9lc24ndCBzZW5kIGNvZGVjX3ByaXYgYmVmb3JlIGFjdHVhbCBkYXRhLgorCVJlbW92ZSB0aW1lLWJhc2VkIHRlc3QgYW5kIHJlcGxhY2UgaXQgd2l0aCBtYXJrZXIgc2V0IG9uIGJlZ2lubmluZyBvZgorCW5ldyBzdHJlYW0KKworMjAwNC0xMi0yOCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJTWVyZ2UgcGF0Y2ggZnJvbSBSb25hbGQgZml4aW5nIHByb2JsZW1zIHdpdGggc3RyZWFtaW5nCisJdGV4dC4KKwkqIGV4dC9jYWlyby9nc3RjYWlyby5jOiAocGx1Z2luX2luaXQpOgorCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6IChnc3RfdGV4dG92ZXJsYXlfcmVuZGVyX3RleHQpLAorCShnc3RfdGV4dF9vdmVybGF5X2JsaXRfMSksIChnc3RfdGV4dF9vdmVybGF5X2JsaXRfc3ViMngyKSwKKwkoZ3N0X3RleHRvdmVybGF5X3ZpZGVvX2NoYWluKSwgKGdzdF90ZXh0b3ZlcmxheV9sb29wKSwKKwkoZ3N0X3RleHRvdmVybGF5X2ZvbnRfaW5pdCksIChnc3RfdGV4dG92ZXJsYXlfaW5pdCksCisJKGdzdF90ZXh0b3ZlcmxheV9zZXRfcHJvcGVydHkpOgorCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5Lmg6CisKKzIwMDQtMTItMjcgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6IChnc3RfdGV4dG92ZXJsYXlfcmVuZGVyX3RleHQpLAorCShnc3RfdGV4dF9vdmVybGF5X2JsaXRfMSksIChnc3RfdGV4dF9vdmVybGF5X2JsaXRfc3ViMngyKSwKKwkoZ3N0X3RleHRvdmVybGF5X3ZpZGVvX2NoYWluKSwgKGdzdF90ZXh0b3ZlcmxheV9sb29wKSwKKwkoZ3N0X3RleHRvdmVybGF5X2ZvbnRfaW5pdCksIChnc3RfdGV4dG92ZXJsYXlfaW5pdCksCisJKGdzdF90ZXh0b3ZlcmxheV9zZXRfcHJvcGVydHkpOiBJbXByb3ZlbWVudHMgdG8gYWN0dWFsbHkKKwlyZW5kZXIgdGV4dCBhcyB3aGl0ZSBvbiBibGFjayBvdXRsaW5lIG9uIHZpZGVvLCBpbmNsdWRpbmcKKwlmb250IHNlbGVjdGlvbiBhbmQgaG9yaXpvbnRhbC92ZXJ0aWNhbCBhbGlnbm1lbnQuICAoUm9uYWxkJ3MKKwljaHJpc3RtYXMgcHJlc2VudCkKKwkqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5oOgorCisyMDA0LTEyLTI2ICBTdGVwaGFuZSBMb2V1aWxsZXQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZXh0L29nZy9nc3RvZ2cuYzoKKwkqIGV4dC9vZ2cvZ3N0b2dtcGFyc2UuYzoKKwkgIGZpeCBvZ21bYXVkaW8vdmlkZW9dcGFyc2UgcGx1Z2luIHJlZ2lzdHJhdGlvbgorCSAgKHJpZmYgd29uJ3QgbG9hZCBpZiBieXRlc3RyZWFtIGlzIGFscmVhZHkgbG9hZGVkKQorCisyMDA0LTEyLTI0ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGNoYW5uZWxtaXguYzoKKwkgIGZpeCBmb3IgR0xJQiA8IDIuNAorCisyMDA0LTEyLTI0ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBNYWtlZmlsZS5hbToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGRpc2FibGUgZG9jcyBhZ2FpbiB1bnRpbCBpdCBhY3R1YWxseSBwYXNzZXMgbWFrZSBkaXN0Y2hlY2suCisKKzIwMDQtMTItMjQgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfdHlwZV9nZXQpLCAocXRkZW11eF9hdWRpb19jYXBzKToKKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAocTNncF90eXBlX2ZpbmQpLAorCShwbHVnaW5faW5pdCk6CisJICBBZGQgM0dQICh2YXJpYWJsZXMgbmFtZSBRM0dQIGJlY2F1c2UgdGhleSBjYW4ndCBzdGFydCB3aXRoIGEKKwkgIG51bWJlcikuIEFkZCBzYW1yIGF1ZGlvIGZvdXJjYyAodXNlZCBpbiAuM2dwIGZpbGVzKSwgZGVjb2RlcgorCSAgaXMgd29yayBpbiBwcm9ncmVzcy4gQWxzbyBkbyBhIEdTVF9XQVJOSU5HIGluc3RlYWQgb2YgRVJST1IKKwkgIGluIGNhc2Ugb2YgdW5rbm93biBub2RlcywgdG8gZGVjcmVhc2Ugb3V0cHV0LgorCisyMDA0LTEyLTI0ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBNYWtlZmlsZS5hbToKKwkgIHJlYWxseSBmaXggZGlzdAorCisyMDA0LTEyLTIzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuaDoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5oOgorCSAgRml4ZXMgIzE1ODM4Mi4gIE1ha2Ugc3BlZXggcGx1Z2luIGNvbXBhdGlibGUgd2l0aCBib3RoIDEuMCBhbmQgMS4xLgorCSAgRml4IGRldGVjdGlvbiBjb2RlIGluIGNvbmZpZ3VyZS5hYworCisyMDA0LTEyLTIzICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2Jsb2NrZ3JvdXApOgorCSAgU2F2ZSBwb3NpdGlvbiwgc28gdGhhdCBxdWVyaWVzIGdpdmUgcHJvcGVyIHJldHVybiB2YWx1ZXMuIERvbid0CisJICBrbm93IGhvdyB0aGlzIGNvdWxkIGV2ZXIgaGF2ZSB3b3JrZWQgYmVmb3JlLi4uCisKKzIwMDQtMTItMjMgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIFB1dCBhZGRpdGlvbmFsIExBTUUgY2hlY2sgaW5zaWRlIHRoZSBjb25kaXRpb25hbC4gIEZpeGVzICMxNTIzMzkKKworMjAwNC0xMi0yMyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5kZXgpLAorCShnc3RfYXZpX2RlbXV4X3N0cmVhbV9zY2FuKToKKwkgIEFkZCBzb21lIG1vcmUgZGVidWcuIEZpeCBsb2dpYyBlcnJvciB3aGVuIHNldHRpbmcgbW92aSBvZmZzZXQKKwkgIHdoaWxlIHJlYWRpbmcgaW5kZXguCisKKzIwMDQtMTItMjMgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luZGV4KSwKKwkoZ3N0X2F2aV9kZW11eF9zdHJlYW1fc2NhbiksIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zZWVrKSwKKwkoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpOgorCSAgQWRkIHNvbWUgZGVidWdnaW5nLiBCZXR0ZXIgZGV0ZWN0aW9uIG9mIGJyb2tlbiBpbmRleGVzIGFuZCB0aGUKKwkgIGFjY29tcGFueWluZyBpbmRleCByZWNvdmVyeS4gTm8gaW5maW5pdGUgbG9vcHMgb24gc3RhdGUgY2hhbmdlcworCSAgd2hlbiB3ZSdyZSBzdGlsbCBpbiBvdXIgbG9vcGZ1bmN0aW9uLgorCisyMDA0LTEyLTIyICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJICBGaXggdXAuCisKKzIwMDQtMTItMjIgIEFyY2hhbmEgU2hhaCAgPGFyY2hhbmEuc2hhaEB3aXByby5jb20+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL3N1bmF1ZGlvL2dzdHN1bm1peGVyLmM6IChnc3Rfc3VuYXVkaW9taXhlcl9zZXRfdm9sdW1lKToKKwkgIE5vcm1hbGl6aW5nIHRoZSB2YWx1ZSBiZWZvcmUgc2V0dGluZworCShnc3Rfc3VuYXVkaW9taXhlcl9nZXRfdm9sdW1lKToKKwkgIE5vcm1hbGl6aW5nIHRoZSB2YWx1ZSBhZnRlciBnZXR0aW5nLiBGaXhlcyBidWcjIDE2MTk4MAorCisyMDA0LTEyLTIyICBDaHJpc3RpYW4gRnJlZHJpayBLYWxhZ2VyIFNjaGFsbGVyICA8dXJhZXVzQGdub21lLm9yZz4KKworCSogTWFrZWZpbGUuYW06IE1ha2Ugc3VyZSBkb2NzIGdldHMgZGlzdGVkCisJKiBkb2NzL01ha2VmaWxlLmFtOiBNYWtlIHN1cmUgYWxsIG5lZWRlZCBmaWxlcyBnZXQgZGlzdGVkCisJKiBnc3QtcGx1Z2lucy5zcGVjLmluOiBsYXRlc3QgdXBkYXRlcworCisyMDA0LTEyLTIyICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChnc3RfcGxheV9iYXNlX2Jpbl9hZGRfZWxlbWVudCk6CisJUmV2ZXJ0IHBhdGNoIDEuMzggYXMgY2xvY2sgZGlzdHJpYnV0aW9uIG92ZXIgc2NoZWR1bGVycyBkb2VzCisJbm90IHdvcmsgY29ycmVjbHkgaW4gdGhlIGNvcmUgeWV0LgorCisyMDA0LTEyLTIxICBTdGVwaGFuZSBMb2V1aWxsZXQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogc3lzL29zcy9SRUFETUU6IHJlbW92ZSB0aGlzIGZpbGUsIHdoaWNoIHByZWRhdGVzIG15IGJpcnRoCisJICAoYW5kIHdoaWNoIGNvbnRlbnQgaXMgYnkgZmFyIG91dGRhdGVkKQorCisyMDA0LTEyLTIwICBTdGVmYW4gS29zdCAgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBNYWtlZmlsZS5hbToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvTWFrZWZpbGUuYW06CisJKiBkb2NzL2xpYnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL2xpYnMvZ3N0LXBsdWdpbnMtbGlicy1kb2NzLnNnbWw6CisJKiBkb2NzL2xpYnMvZ3N0LXBsdWdpbnMtbGlicy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL2xpYnMvdG1wbC9nc3RnY29uZi5zZ21sOgorCSogZG9jcy91cGxvYWQubWFrOgorCSogZG9jcy92ZXJzaW9uLmVudGl0aWVzLmluOgorCSAgQWRkZWQgYm9pbGVycGxhdGUgZ3RrLWRvYyBmaWxlcyBmb3IgcGx1Z2luLWxpYnMgZG9jdW1lbnRhdGlvbi4KKworMjAwNC0xMi0xOSAgU3RlcGhhbmUgTG9ldWlsbGV0ICA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzogZml4IGludCBhbmQgZmxvYXQgYXVkaW8gY2FwcworCisyMDA0LTEyLTE5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvdjRsL2dzdHY0bGVsZW1lbnQuYzogKGdzdF92NGxfaWZhY2Vfc3VwcG9ydGVkKToKKwkqIHN5cy92NGwyL2dzdHY0bDJlbGVtZW50LmM6IChnc3RfdjRsMl9pZmFjZV9zdXBwb3J0ZWQpOgorCSAgZ19hc3NlcnQoKSBjYW4gYmUgYSBtYWNybywgZG9uJ3QgdXNlICNpZmRlZiBpbnNpZGUgaXQuCisKKzIwMDQtMTItMTkgIEVkd2FyZCBIZXJ2ZXkgIDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvdmlkZW9yYXRlL2dzdHZpZGVvcmF0ZS5jOiAoZ3N0X3ZpZGVvcmF0ZV9ibGFua19kYXRhKSwKKwkoZ3N0X3ZpZGVvcmF0ZV9pbml0KSwgKGdzdF92aWRlb3JhdGVfY2hhaW4pLAorCShnc3RfdmlkZW9yYXRlX2NoYW5nZV9zdGF0ZSk6CisJICBFdmVudCBoYW5kbGluZyAoZml4ZXMgIzE1OTk4NikuCisKKzIwMDQtMTItMTkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtbWVkaWEuYzoKKwkoZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX2NhcHNfd2l0aF9kYXRhKToKKwkgIEFkZCBCTFowIChCbGl6emFyZCdzIHZlcnNpb24gb2YgRGl2WCkgZm91cmNjLgorCisyMDA0LTEyLTE4ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC90dGEvZ3N0dHRhZGVjLmM6IChnc3RfdHRhX2RlY19saW5rKTogQW5kIHlldCBhbm90aGVyCisJcG9ydGFiaWxpdHkgZml4LgorCisyMDA0LTEyLTE4ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC90dGEvdHRhZGVjLmg6IERpc2FibGUgc29tZSBoZWFkZXIgY29kZSB0aGF0IGlzbid0IHVzZWQKKwlhbmQgY2xlYXJseSBpc24ndCBwb3J0YWJsZS4KKworMjAwNC0xMi0xOCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9pbWdjb252ZXJ0LmM6IChnZXRfcGl4X2ZtdF9pbmZvKSwKKwkoYXZjb2RlY19nZXRfY2hyb21hX3N1Yl9zYW1wbGUpLCAoYXZjb2RlY19nZXRfcGl4X2ZtdF9uYW1lKSwKKwkoYXZjb2RlY19nZXRfcGl4X2ZtdCksIChhdnBpY3R1cmVfbGF5b3V0KSwKKwkoYXZjb2RlY19nZXRfcGl4X2ZtdF9sb3NzKSwgKGF2Z19iaXRzX3Blcl9waXhlbCksIChpbWdfY29weSksCisJKGdldF9jb252ZXJ0X3RhYmxlX2VudHJ5KSwgKGltZ19jb252ZXJ0KSwgKGltZ19nZXRfYWxwaGFfaW5mbyk6CisJRml4IGNvZGUgdG8gbm90IHVzZSBHQ0MgZXh0ZW5zaW9ucyAoYW5kIGM5OSBleHRlbnNpb25zIHRoYXQKKwlGb3J0ZSBkb2VzIG5vdCBsaWtlLikKKworMjAwNC0xMi0xOSAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHQuaS5tQHplbi5jby51az4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6IChnc3RfZGVpbnRlcmxhY2VfbGluayksCisJKGdzdF9kZWludGVybGFjZV9jaGFpbik6CisJICBSb3dzdHJpZGUgZml4ZXMuIEZpeGVzICMxNjEwMzkuCisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOiAoZ3N0X3ZpZGVvX2Nyb3BfaW5pdCksCisJKGdzdF92aWRlb19jcm9wX2dldF9wcm9wZXJ0eSksIChnc3RfdmlkZW9fY3JvcF9hZGRfdG9fc3RydWN0X3ZhbCksCisJKGdzdF92aWRlb19jcm9wX2dldGNhcHMpLCAoZ3N0X3ZpZGVvX2Nyb3BfbGluayksCisJKGdzdF92aWRlb19jcm9wX2k0MjApLCAoZ3N0X3ZpZGVvX2Nyb3BfY2hhaW4pLAorCShnc3RfdmlkZW9fY3JvcF9jaGFuZ2Vfc3RhdGUpOgorCSAgUmV3b3JrIG9mIG5lZ290aWF0aW9uLiBBY3R1YWxseSB3b3JrcyBub3cuIEZpeGVzICMxNTg2NTAuCisKKzIwMDQtMTItMTggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2VibWxudW1fc2ludCk6CisJICBUaGF0IHdhcyB2ZXJ5IHN0dXBpZC4KKworMjAwNC0xMi0xOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwKToKKwkgIEZpeCBwb3NzaWJsZSBjcmFzaGVyLgorCisyMDA0LTEyLTE4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9lYm1sbnVtX3VpbnQpLAorCShnc3RfbWF0cm9za2FfZWJtbG51bV9zaW50KSwgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwKToKKwkgIExhY2Ugc2l6ZXMgY2FuIGJlIHplcm8uCisKKzIwMDQtMTItMTggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9tdXNlcGFjay9nc3RtdXNlcGFja2RlYy5jcHA6CisJICBGZXRjaCBlcnJvciByZXR1cm4gdmFsdWVzLiBGaXhlcyAjMTYxNjI0LgorCSogZ3N0L2FwZXRhZy9hcGVkZW11eC5jOiAoZ3N0X2FwZV9kZW11eF9zdHJlYW1fZGF0YSk6CisJICBSZWFsbHkgRU9TLgorCisyMDA0LTEyLTE4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCk6CisJICBXb3JrIGZvciB0cnVuY2F0ZWQgKHVuZmluaXNoZWQgZG93bmxvYWQgZXRjLikgZmlsZXMuIEZpeGVzICMxNjA1MTQuCisKKzIwMDQtMTItMTggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2xvb3ApOgorCSAgRml4IGZvciBpbnRlZ2VyIG92ZXJmbG93LiBNYWtlcyAjMTU2MDAxIG5vdCBjcmFzaC4gUHJvYmFibHkgbWFza3MKKwkgIHRoZSByZWFsIGJ1Zy4KKworMjAwNC0xMi0xNyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2FjM3BhcnNlL2dzdGFjM3BhcnNlLmM6IChwbHVnaW5faW5pdCk6CisJICBQYXJzZXJzIG5ldmVyIGhhdmUgcmFua3MuIEZpeGVzICMxNTk2NTEuCisKKzIwMDQtMTItMTcgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZ3N0L3BsYXliYWNrL2dzdGRlY29kZWJpbi5jOiAoY29tcGFyZV9yYW5rcyk6CisJICBtYWtlIHN1cmUgdGhlIGZhY290cmllcyBhcmUgb3JkZXJlZCB0aGUgc2FtZSBldmVyeSB0aW1lIGV2ZW4gaWYgdGhleQorCSAgaGF2ZSB0aGUgc2FtZSByYW5rIGJ5IHVzaW5nIHRoZSBuYW1lCisJKiBnc3QvcGxheWJhY2svZ3N0ZGVjb2RlYmluLmM6IChmaW5kX2NvbXBhdGlibGVzKToKKwkgIG1ha2Ugc3VyZSB3ZSBkb24ndCBhZGQgZmFjdG9yaWVzIHRvIHRoZSBsaXN0IHR3aWNlCisKKzIwMDQtMTItMTYgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29uZmlndXJlLmFjOiBsb29rIGZvciBtdXNlcGFjayBoZWFkZXJzIGFzIG11c2VwYWNrLyouaAorCShmaXhlcyAjMTU5ODQ3KQorCSogZXh0L211c2VwYWNrL2dzdG11c2VwYWNrZGVjLmg6IHVzZSA8bXVzZXBhY2svKi5oPgorCSogZXh0L211c2VwYWNrL2dzdG11c2VwYWNrcmVhZGVyLmg6IHNhbWUKKworMjAwNC0xMi0xNyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6CisJKGdzdF9yaWZmX3JlYWRfc3RyZl9hdWRzX3dpdGhfZGF0YSk6CisJICBSZWFkIGV4dHJhZGF0YSBjb3JyZWN0bHkgKGZpeGVzICMxNTU4NzkpLgorCisyMDA0LTEyLTE2ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9hdWRpb3NjYWxlL2dzdGF1ZGlvc2NhbGUuYzogYWxsb3cgcGFzc3RocnUgb2YgPjIgY2hhbm5lbAorCWF1ZGlvLiAgZG9lcyBfbm90XyBhdHRlbXB0IG9yIGFsbG93IGNvbnZlcnNpb24gdW5sZXNzIGNoYW5uZWxzCisJaXMgMSBvciAyLgorCisyMDA0LTEyLTE2ICBDaHJpc3RpYW4gRnJlZHJpayBLYWxhZ2VyIFNjaGFsbGVyICA8dXJhZXVzQGdub21lLm9yZz4KKworCSogdG9vbHMvZ3N0LWxhdW5jaC1leHQtbS5tOiBmaXggbXBlZyBhbmQgdm9iIHBpcGVsaW5lcworCisyMDA0LTEyLTE2ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9hdWRpb3NjYWxlL2dzdGF1ZGlvc2NhbGUuYzogdGhlIHJlc2FtcGxlIGxpYnJhcnkgb25seQorCWhhbmRsZXMgMSBvciAyIGNoYW5uZWxzLiAgQ2hhbmdlIGNhcHMgdG8gY29tcGVuc2F0ZS4KKworMjAwNC0xMi0xNiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChhYWNfcmF0ZV9pZHgpLCAoYWFjX3Byb2ZpbGVfaWR4KSwKKwkoZ3N0X21hdHJvc2thX2RlbXV4X2F1ZGlvX2NhcHMpOgorCSAgU29tZSBNUEVHLUFBQyBoYWNrcywgYmVjYXVzZSBlbHNlIGl0IGRvZXNuJ3Qgd29yay4uLgorCisyMDA0LTEyLTE2ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6CisJKGdzdF9yaWZmX2NyZWF0ZV92aWRlb19jYXBzX3dpdGhfZGF0YSksCisJKGdzdF9yaWZmX2NyZWF0ZV92aWRlb190ZW1wbGF0ZV9jYXBzKToKKwkgIEFkZCBoMjY0LgorCisyMDA0LTEyLTE2ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvYXVkaW8vTWFrZWZpbGUuYW06CisJICBUcnkgdG8gZml4IGJ1aWxkYm90LgorCisyMDA0LTEyLTE2ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmM6CisJICBDbGVhbiB1cCBhbmQgdW5pZm9ybWl6ZSBkZWJ1Z2dpbmcuCisKKzIwMDQtMTItMTYgIEVkd2FyZCBIZXJ2ZXkgIDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RkdmRkZW11eC5jOiAoZ3N0X2R2ZF9kZW11eF9jbGFzc19pbml0KSwKKwkoZ3N0X2R2ZF9kZW11eF9yZXNldCksIChnc3RfZHZkX2RlbXV4X2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVnZGVtdXguYzogKGdzdF9tcGVnX2RlbXV4X3Jlc2V0KSwKKwkoZ3N0X21wZWdfZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgIFJlc2V0IG9uIHJlYWR5LiBGaXhlcyAxNjAyNzYuCisKKzIwMDQtMTItMTYgIFNlYmFzdGllbiBDb3RlICA8c2M1QGhlcm1lcy51c2hlcmIuY2E+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvbG9yc3BhY2UuYzoKKwkoZ3N0X2ZmbXBlZ2NzcF9wYWRfbGluayk6CisJICBGaXggbWVtbGVhayAoIzE1NDgxNSkuCisKKzIwMDQtMTItMTYgIEphbWVzIEJvd2VzICA8Ym93ZXNAY3MuZGFsLmNhPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbXVzaWNicmFpbnovZ3N0dHJtLmM6IChnc3RfbXVzaWNicmFpbnpfY2xhc3NfaW5pdCksCisJKGdzdF9tdXNpY2JyYWluel9pbml0KSwgKGdzdF9tdXNpY2JyYWluel9jaGFpbiksCisJKGdzdF9tdXNpY2JyYWluel9zZXRfcHJvcGVydHkpLCAoZ3N0X211c2ljYnJhaW56X2dldF9wcm9wZXJ0eSk6CisJKiBleHQvbXVzaWNicmFpbnovZ3N0dHJtLmg6CisJICBBZGQgc3VwcG9ydCBmb3IgdXNpbmcgYSBwcm94eSBzZXJ2ZXIgd2hlbiBnZXR0aW5nIGEgdHJtIGlkIGZyb20KKwkgIHRoZSBNdXNpY0JyYWlueiBkYXRhYmFzZSAoIzE0OTYxMykuCisKKzIwMDQtMTItMTYgIENocmlzdG9waGUgRmVyZ2VhdSAgPHRldWZAZ25vbWUub3JnPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0ZGVjb2RlYmluLmM6IChuZXdfcGFkKSwgKGNsb3NlX2xpbmspOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChuZXdfZGVjb2RlZF9wYWQpOgorCSAgRml4IG1lbWxlYWtzICgjMTU3MjMzKS4KKworMjAwNC0xMi0xNiAgU2ViYXN0aWVuIENvdGUgIDxzYzVAaGVybWVzLnVzaGVyYi5jYT4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3Jlc2FtcGxlL3Jlc2FtcGxlLmM6IChnc3RfcmVzYW1wbGVfY2xvc2UpOgorCSogZ3N0LWxpYnMvZ3N0L3Jlc2FtcGxlL3Jlc2FtcGxlLmg6CisJKiBnc3QvYXVkaW9zY2FsZS9nc3RhdWRpb3NjYWxlLmM6CisJICBGaXggbWVtbGVhayAoIzE1OTIxNSkuCisKKzIwMDQtMTItMTYgIFRvbmkgV2lsbGJlcmcgIDx0b25pd0Bpa2kuZmk+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5jOiAoZ3N0X29zc2VsZW1lbnRfcHJvYmVfY2Fwcyk6CisJKiBzeXMvb3NzL29zc19wcm9iZS5jOiAobWFpbik6CisJICBDaGVjayBmb3IgbW9uby9zdGVyZW8gc3VwcG9ydCAoc2ltaWxhciB0byBzYW1wbGVyYXRlIHByb2JpbmcpLAorCSAgZml4ZXMgIzE1OTQzMy4gQWxzbyBhZGQgbWlzc2luZyBjb3B5cmlnaHQgaGVhZGVyIHRvIG9zc19wcm9iZS5jLgorCisyMDA0LTEyLTE1ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogYWRkIGF1ZGlvcmVzYW1wbGUgYW5kIGNhaXJvIHBsdWdpbnMuICBSZW1vdmUKKwlIQVZFX01NWCBzdHVmZiwgYmVjYXVzZSBpdCdzIG5vdCB1c2VkLgorCSogZXh0L01ha2VmaWxlLmFtOiBzYW1lCisJKiBleHQvYXVkaW9yZXNhbXBsZS9NYWtlZmlsZS5hbTogWW91IGFyZSBub3QgcmVhZHkgZm9yIGFuCisJYXVkaW8gcmVzYW1wbGluZyBlbGVtZW50IGJhc2VkIG9uIGF1ZGlvcmVzYW1wbGUuCisJKiBleHQvYXVkaW9yZXNhbXBsZS9nc3RhdWRpb3Jlc2FtcGxlLmM6CisJKiBleHQvYXVkaW9yZXNhbXBsZS9nc3RhdWRpb3Jlc2FtcGxlLmg6CisJKiBleHQvY2Fpcm8vTWFrZWZpbGUuYW06IFlvdSBhcmUgbm90IHJlYWR5IGZvciBvdmVybGF5IGVsZW1lbnRzCisJYmFzZWQgb24gY2Fpcm8uICBEb24ndCBsb29rIHRvbyBjbG9zZWx5LCB0aGVzZSBlbGVtZW50cyBraW5kYQorCXN1Y2sgcmlnaHQgbm93LgorCSogZXh0L2NhaXJvL2dzdGNhaXJvLmM6IG5ldworCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6IG5ldworCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5Lmg6IG5ldworCSogZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5LmM6IG5ldworCSogZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5Lmg6IG5ldworCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby1wcml2Lmg6IGZpeCBjb21waWxlCisJcHJvYmxlbSB3aXRoIGNvbXBpbGVycyB0aGF0IGRvbid0IHN1cHBvcnQgdmFyaWFkaWMgbWFjcm9zLgorCisyMDA0LTEyLTE1ICBCYWxhbXVyYWxpIFZpc3dhbmF0aGFuICA8YmFsYW11cmFsaS52aXN3YW5hdGhhbkB3aXByby5jb20+CisKKwlSZXZpZXdlZCBieTogIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvLmM6IChwbHVnaW5faW5pdCk6ICBBcHBseSBwYXRjaCBmcm9tCisJQmFsYSwgcmVnaXN0ZXJpbmcgc3VuYXVkaW9zcmMgKG9vcHMhKSwgYW5kIGNsZWFuaW5nIHVwIGNvZGUgYQorCWJpdC4gIEFsc28gcmFuIGluZGVudC1nc3QuCisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuYzogKGdzdF9zdW5hdWRpb3NyY19pbml0KSwKKwkoZ3N0X3N1bmF1ZGlvc3JjX2NoYW5nZV9zdGF0ZSksIChnc3Rfc3VuYXVkaW9zcmNfZ2V0KSwKKwkoZ3N0X3N1bmF1ZGlvc3JjX3NldHBhcmFtcyk6CisKKzIwMDQtMTItMTQgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2Zlc3RpdmFsL2dzdGZlc3RpdmFsLmM6IChnc3RfZmVzdGl2YWxfY2hhaW4pOiBTZXQgdGhlCisJb3V0cHV0IHJhdGUgdG8gMTYwMDAuICBTaG91bGQgZml4ICMxNjAyMzUuCisKKzIwMDQtMTItMTQgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChtcGVnMl9zeXNfdHlwZV9maW5kKToKKwlBZGQgdHlwZWZpbmRpbmcgZm9yIG1wZWcyIHBlcyBzdHJlYW1zCisKKzIwMDQtMTItMTMgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29uZmlndXJlLmFjOiAgQXBwbGllZCBwYXRjaCBmcm9tIGJ1ZyAjMTQzNjU5LCBtYWtpbmcgZGVmYXVsdAorCXNvdXJjZXMgYW5kIHNpbmtzIE9TLWRlcGVuZGVudCAoZm9yIFNvbGFyaXMpLCBhbmQgYWRkZWQgY29kZQorCWZvciBPUy9YLgorCSogZ2NvbmYvZ3N0cmVhbWVyLnNjaGVtYXMuaW46IHVzZSBPUy1kZXBlbmRlbnQgc2lua3MgaW4gZ2NvbmYuCisKKzIwMDQtMTItMTMgIFN0ZXBoYW5lIExvZXVpbGxldCAgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6CisJICBmb3Jnb3QgdG8gYWRkIGgyLjY0IHRvIGF2aWRlbXV4IHRlbXBsYXRlIGNhcHMKKworMjAwNC0xMi0xMyAgU3RlcGhhbmUgTG9ldWlsbGV0ICA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGdzdC93YXZlbmMvcmlmZi5oOgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1pZHMuaDoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmMKKwlhZGQgNENDIGNvZGUgZm9yIFZpZGVvU29mdCBoMjY0IGluIEFWSSAoVlNTSCkKKwkgIGZpeGVzIGJ1ZyAjMTYwNjU1CisJcmVtb3ZlIHMzMjMgZnJvbSByaWZmLCBpdCdzIHF1aWNrdGltZSBzcGVjaWZpYyA6KAorCisyMDA0LTEyLTEzICBTdGVwaGFuZSBMb2V1aWxsZXQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZ3N0L2FzZmRlbXV4L1JFQURNRQorCSogZ3N0L3dhdmVuYy9yaWZmLmgKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtaWRzLmgKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtbWVkaWEuYworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgYWRkIG5ldyA0Q0MgY29kZXMgZm9yIGgyNjMgcmVsYXRlZCBjb2RlY3MKKwkgIGZpeGVzIHBhcnRpYWxseSBidWcgIzE1NTE2MworCisyMDA0LTEyLTEyICBDaHJpc3RpYW4gRnJlZHJpayBLYWxhZ2VyIFNjaGFsbGVyICA8Y2hyaXN0aWFuIGF0IGZsdWVuZG8gZG90IGNvbT4KKworCSogY29uZmlndXJlLmFjOiBVcGRhdGUgcG9seWF1ZGlvIHJlcXVpcmVtZW50IHRvIDAuNworCSogZXh0L3BvbHlwL3BvbHlwc2luay5jOiAoY3JlYXRlX3N0cmVhbSk6IGFkZCBwYXRjaCBmcm9tIGlhaW4gKDE1ODI1OCkKKworMjAwNC0xMi0xMSAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwlmaXggbXkgbmFtZSdzIHNwZWxsaW5nISA6KQorCisyMDA0LTEyLTExICBTdGVwaGFuZSBMb2V1aWxsZXQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogQVVUSE9SUyBDaGFuZ2VMb2cKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYworCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmMKKwkqIGdzdC9sYXcvOgorCQlhbGF3LWRlY29kZS5jIGFsYXctZW5jb2RlLmMKKwkJbXVsYXctZGVjb2RlLmMgbXVsYXctZW5jb2RlLmMKKwkqIGdzdC9vbmV0b24vZ3N0b25ldG9uLmMKKwkqIHN5cy9vc3hhdWRpby86CisJCWdzdG9zeGF1ZGlvZWxlbWVudC5jIGdzdG9zeGF1ZGlvc2luay5jIGdzdG9zeGF1ZGlvc3JjLmMKKwkqIHN5cy9vc3h2aWRlby86CisJCWNvY29hd2luZG93LmggY29jb2F3aW5kb3cubQorCQlvc3h2aWRlb3NpbmsuaCBvc3h2aWRlb3NpbmsubQorCisJcHV0IHRoZSBzYW1lIG1haWwgYWRkcmVzcyBmb3IgWmFoZWVyIEFiYmFzIE1lcmFsaSBldmVyeXdoZXJlCisKKzIwMDQtMTItMTAgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOiAoZ3N0X2FzZl9kZW11eF9sb29wKToKKwkgIEFsaWduIGJ5IHBhY2tldHNpemUsIGFuZCBhc3NlcnQgdGhhdCB3ZSBhIHBhY2tldCBhdmFpbGFibGUgYmVmb3JlCisJICBwbGF5aW5nLiBUaGUgZmlyc3QgbWFrZXMgd2Vic3RyZWFtcyB3b3JrICh0aGV5IG9mdGVuIGluY2x1ZGUKKwkgIHRyYWlsaW5nIHBhZGRpbmcgZGF0YSBpbiBhIHBhY2tldCksIHRoZSBzZWNvbmQgYWxsb3dzIHBhdXNpbmcgYQorCSAgQVNGIHN0cmVhbSBpbiB0b3RlbSB3aXRob3V0IGdldHRpbmcgZGVtdXggZXJyb3JzIGFmdGVyd2FyZHMuCisKKzIwMDQtMTItMDkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdldF9yZWxhdGl2ZSk6CisJICBDaGVjayBmb3Igbm9uLU5VTEwgYmVmb3JlIGFjY2Vzc2luZyBtZW1iZXIgKGVuZC1vZi1jaGFpbikuCisKKzIwMDQtMTItMDkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9jZHBhcmFub2lhL2dzdGNkcGFyYW5vaWEuYzogKGNkcGFyYW5vaWFfY2xhc3NfaW5pdCksCisJKGNkcGFyYW5vaWFfc2V0X3Byb3BlcnR5KSwgKGNkcGFyYW5vaWFfZ2V0X3Byb3BlcnR5KToKKwkqIGV4dC9kdmRuYXYvZHZkbmF2c3JjLmM6IChkdmRuYXZzcmNfY2xhc3NfaW5pdCksCisJKGR2ZG5hdnNyY19zZXRfcHJvcGVydHkpLCAoZHZkbmF2c3JjX2dldF9wcm9wZXJ0eSk6CisJKiBleHQvZHZkcmVhZC9kdmRyZWFkc3JjLmM6IChkdmRyZWFkc3JjX2NsYXNzX2luaXQpLAorCShkdmRyZWFkc3JjX2luaXQpLCAoZHZkcmVhZHNyY19zZXRfcHJvcGVydHkpLAorCShkdmRyZWFkc3JjX2dldF9wcm9wZXJ0eSk6CisJKiBzeXMvdmNkL3ZjZHNyYy5jOiAoZ3N0X3ZjZHNyY19jbGFzc19pbml0KSwKKwkoZ3N0X3ZjZHNyY19zZXRfcHJvcGVydHkpLCAoZ3N0X3ZjZHNyY19nZXRfcHJvcGVydHkpOgorCSAgU3luY2hyb25pemUgcHJvcGVydHkgbmFtZXMgd2hlcmUgbm90IHlldCB0aGUgY2FzZS4gRGV2aWNlcyBhcmUKKwkgIG5vdyBkZXZpY2U9WCwgb3RoZXIgdmVyc2lvbnMgYXJlIGRlcHJlY2F0ZWQgKGJ1dCBzdGlsbCBleGlzdCkuCisJICBBbHNvIHVzZSBnX2ZyZWUoKSB1bmNvbmRpdGlvbmFsbHkuCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKGdzdF9wbGF5X2Jhc2VfYmluX2NsYXNzX2luaXQpLAorCShzZXR1cF9zb3VyY2UpLCAoZ3N0X3BsYXlfYmFzZV9iaW5fZ2V0X3Byb3BlcnR5KToKKwkgIEV4cG9zZSBzb3VyY2UuCisKKzIwMDQtMTItMDkgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogbW92ZSBHQ09ORiBtYWNybyBvdXRzaWRlIGNvbmRpdGlvbmFsIGZvciB0aGUgYW0KKwkgIGNvbmRpdGlvbmFsLiBGaXhlcyAjMTYwNDM5CisKKzIwMDQtMTItMDggIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogdG9vbHMvZ3N0LXZpc3VhbGlzZS1tLm06IFN3aXRjaCB0byBlbGVtZW50cyB0aGF0IGN1cnJlbnRseQorCWV4aXN0LgorCisyMDA0LTEyLTA4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvb2dnL2dzdG9nbXBhcnNlLmM6IChnc3Rfb2dtX3BhcnNlX2NoYWluKToKKwkgIFdlIGxvdmUgd3JvbmcgY29tbWFzLgorCisyMDA0LTEyLTA4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpOgorCSAgRG9uJ3Qgc2V0IERFRkFVTFQsIHVuc3VwcG9ydGVkIC0gbWFrZXMgbGVuZ3RoIGRpc3BsYXkgaW5jb3JyZWN0bHkKKwkgIGluIHNvbWUgY2FzZXMuCisKKzIwMDQtMTItMDcgIENocmlzdGlhbiBGcmVkcmlrIEthbGFnZXIgU2NoYWxsZXIgIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QvbW9ub3Njb3BlL1JFQURNRTogcmVtb3ZlIGJsdXJiIGFib3V0IGZpbGVzIGJlaW5nIEdQTAorCSogZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYzogQ2hhbmdlIGxpY2Vuc2UgZmllbGQgdG8gTEdQTAorCSogZ3N0L21vbm9zY29wZS9tb25vc2NvcGUuYzogQ2hhbmdlIGxpY2Vuc2UgdG8gQlNEIHdpdGggZXhwbGFuYXRpb24KKwkgIG1vbm9zY29wZSBpcyBub3cgZWZmZWN0aXZlbHkgTEdQTCBsaWNlbnNlZAorCisyMDA0LTEyLTA3ICBDaHJpc3RpYW4gRnJlZHJpayBLYWxhZ2VyIFNjaGFsbGVyICA8dXJhZXVzQGdub21lLm9yZz4KKworCSogZ3N0L21vbm9zY29wZS9SRUFETUU6IFVwZGF0ZSBpbmZvcm1hdGlvbiB0byBiZSBtb3JlIGNvcnJlY3QKKwkqIGdzdC9tb25vc2NvcGUvY29udm9sdmUuYzogUmVsaWNlbnNlIHRvIExHUEwKKwkqIGdzdC9tb25vc2NvcGUvY29udm9sdmUuaDogUmVsaWNlbnNlIHRvIExHUEwKKworMjAwNC0xMi0wNiAgQXJ3ZWQgdi4gTWVya2F0eiA8di5tZXJrYXR6QGdteC5uZXQ+CisKKwkqIGdzdC9tcGVnYXVkaW9wYXJzZS9nc3RtcGVnYXVkaW9wYXJzZS5jOiAoZ3N0X21wM3BhcnNlX2NoYWluKToKKwkgIHNldCBCVUZGRVJfRFVSQVRJT04gdG8gY29ycmVjdCB2YWx1ZXMgKG1wZWcxIGF1ZGlvIGZyYW1lIGxlbmd0aCBpcyBmaXhlZCkKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfYXVkaW9fcGFkX2xpbmspOgorCSAgc2V0IGRlZmF1bHRfZHVyYXRpb24gZm9yIG1wZWcxIGF1ZGlvCisKKzIwMDQtMTItMDYgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfZ2V0X2NhcHMpLCAoZ3N0X2Fsc2FfY2xvc2VfYXVkaW8pOgorCSogZXh0L2Fsc2EvZ3N0YWxzYS5oOgorCSAgcmVmYWN0b3IgYmlnIGNodW5rcyBvZiB0aGUgY29yZSBjYXBzIG5lZ290aWF0aW9uIGNvZGUgdG8gbWFrZSBpdAorCSAgYSBsb3QgZmFzdGVyLCBiZWNhdXNlIHBlb3BsZSBjbGFpbSBpdCdzIHJlYWxseSBzbG93CisJICAoYWN0dWFsbHksIGp1c3QgY2FjaGUgdGhlIGdldGNhcHMgd2hlbiB0aGUgZGV2aWNlIGlzIG9wZW5lZCkKKworMjAwNC0xMi0wNiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2E1MmRlYy9nc3RhNTJkZWMuYzogKGdzdF9hNTJkZWNfaW5pdCksCisJKGdzdF9hNTJkZWNfaGFuZGxlX2V2ZW50KSwgKGdzdF9hNTJkZWNfdXBkYXRlX3N0cmVhbWluZm8pLAorCShnc3RfYTUyZGVjX2hhbmRsZV9mcmFtZSksIChnc3RfYTUyZGVjX2NoYWluKSwKKwkoZ3N0X2E1MmRlY19jaGFuZ2Vfc3RhdGUpLCAocGx1Z2luX2luaXQpOgorCSogZXh0L2E1MmRlYy9nc3RhNTJkZWMuaDoKKwkgIERvIHNvbWV0aGluZyB1c2VmdWwgd2l0aCB0aW1lc3RhbXBzLiBNYWtlIGNoYWluLWJhc2VkIChzaW5jZQorCSAgdGhlcmUncyByZWFsbHkgbm8gcmVhc29uIHRvIGJlIGxvb3BiYXNlZCkuCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSk6CisJICBVcGRhdGUgY3VycmVudF9ieXRlL2ZyYW1lIGNvcnJlY3RseS4KKworMjAwNC0xMi0wNCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2FwZXRhZy9hcGVkZW11eC5jOiAoZ3N0X2FwZV9kZW11eF9wYXJzZV90YWdzKSwKKwkoZ3N0X2FwZV9kZW11eF9zdHJlYW1faW5pdCk6CisJICBGb3J3YXJkIHRhZ3MsIHRvby4KKworMjAwNC0xMi0wNCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2FwZXRhZy9hcGVkZW11eC5jOiAoZ3N0X2FwZV9kZW11eF9zdHJlYW1faW5pdCk6CisJICBMZXQncyBtYWtlIHN1cmUgd2UncmUgZG9uZSB0eXBlZmluZGluZyB3aGVuIGRldGVjdGluZyB0YWdzLgorCisyMDA0LTEyLTAzICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChnc3RfZWJtbF9yZWFkX2NsYXNzX2luaXQpLAorCShnc3RfZWJtbF9yZWFkX2luaXQpLCAoZ3N0X2VibWxfcmVhZF91c2VfZXZlbnQpLAorCShnc3RfZWJtbF9yZWFkX2VsZW1lbnRfaWQpLCAoZ3N0X2VibWxfcGVla19pZCksCisJKGdzdF9lYm1sX3JlYWRfc2VlayksIChnc3RfZWJtbF9yZWFkX3NraXApLAorCShnc3RfZWJtbF9yZWFkX3Jlc2VydmUpLCAoZ3N0X2VibWxfcmVhZF9idWZmZXIpLAorCShnc3RfZWJtbF9yZWFkX21hc3Rlcik6CisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NvbnRlbnRzKSwKKwkoZ3N0X21hdHJvc2thX2RlbXV4X2xvb3Bfc3RyZWFtKSwgKGdzdF9tYXRyb3NrYV9kZW11eF9hdWRpb19jYXBzKToKKwkgIERpc2d1c3RpbmdseSBldmlsIGhhY2sgZm9yIHdvcmtpbmcgYXJvdW5kIElOVEVSUlVQVCBldmVudHMgYW5kCisJICB0aGVpciBleHRyZW1lbHkgYW5ub3lpbmcgaGFiaXQgb2YgYmVpbmcgYSBwYWluIGluIHRoZSBhc3MuIFdlCisJICBzaW1wbHkgcGVlayBhIGNsdXN0ZXIgYmVmb3JlIHJlYWRpbmcgYW55IG9mIGl0LgorCisyMDA0LTEyLTAzICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbXVzZXBhY2svZ3N0bXVzZXBhY2tkZWMuY3BwOgorCSAgVGhlcmUncyBhbHNvIGZsb2F0aW5nIHBvaW50IGxpYm11c2VwYWNrcy4KKworMjAwNC0xMi0wMyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2ZhYWQvZ3N0ZmFhZC5jOiAoZ3N0X2ZhYWRfY2hhbnBvc19mcm9tX2dzdCksCisJKGdzdF9mYWFkX2NoYW5wb3NfdG9fZ3N0KSwgKGdzdF9mYWFkX2NoYWluKToKKwkgIFNldCBEVVJBVElPTiBldmVuIGlmIHNvdXJjZSBidWZmZXIgZGlkbid0LiBBbHNvIHVzZSBpbmNyZWFzaW5nCisJICB0aW1lc3RhbXBzLgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOgorCShnc3RfcmlmZl9jcmVhdGVfYXVkaW9fY2Fwc193aXRoX2RhdGEpOgorCSAgQmxvY2tfYWxpZ24gY2FuIGhhdmUgbGFyZ2VyIHZhbHVlcyB0aGFuIDgxOTIuCisKKzIwMDQtMTItMDIgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzogKGFsYXdkZWNfZ2V0Y2FwcyksIChhbGF3ZGVjX2xpbmspOgorCSogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOiAoYWxhd2VuY19nZXRjYXBzKSwgKGFsYXdlbmNfbGluayk6CisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOiAobXVsYXdkZWNfZ2V0Y2FwcyksIChtdWxhd2RlY19saW5rKToKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6IChtdWxhd2VuY19nZXRjYXBzKSwgKG11bGF3ZW5jX2xpbmspOgorCSAgRml4IGNhcHMuCisKKzIwMDQtMTItMDEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy92NGwvdjRsX2NhbGxzLmM6IChnc3RfdjRsX2dldF9jaGFuX25hbWVzKToKKwkgIEZpeCBsb2dpYyBidWcuCisKKzIwMDQtMTItMDEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfdHlwZV9maW5kKToKKwkgIFlheSwgYW5vdGhlciBvbmUuCisKKzIwMDQtMTItMDEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfY2hhaW4pOgorCSAgTWFrZSBlcnJvciBhY3R1YWxseSBzYXkgc29tZXRoaW5nIHVzZWZ1bCAoZml4ZXMgIzE1Njc5OCkuCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6CisJKGdzdF9yaWZmX2NyZWF0ZV92aWRlb19jYXBzX3dpdGhfZGF0YSksCisJKGdzdF9yaWZmX2NyZWF0ZV92aWRlb190ZW1wbGF0ZV9jYXBzKToKKwkgIEFkZCBJbnRlbCBWaWRlbyA1LjAgZm91cmNjIChJVjUwKS4KKworMjAwNC0xMi0wMSAgQ2hyaXN0b3BoZSBGZXJnZWF1ICA8dGV1ZkBnbm9tZS5vcmc+CisKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChtcGcxMjNfcGFyc2VfeGluZ19oZWFkZXIpOiBmaXggeGluZyBoZWFkZXIKKwlkZXRlY3Rpb24gb24gbW9ubyBhbmQgc3RlcmVvIG1wMyBmaWxlcy4KKworMjAwNC0xMi0wMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChnc3RfcGxheV9iYXNlX2Jpbl9jaGFuZ2Vfc3RhdGUpOgorCSAgRG9uJ3QgY3Jhc2ggb24gRU1QVFkgY2FwcyAoZS5nLiB3aGVuIHRoZSBkZW11eGVyIGRpZG4ndCByZWNvZ25pemUKKwkgIHRoZSBjb250YWluZWQgc3RyZWFtKS4KKworMjAwNC0xMi0wMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2ZhYWQvZ3N0ZmFhZC5jOiAoZ3N0X2ZhYWRfc3JjY29ubmVjdCksIChnc3RfZmFhZF9jaGFpbik6CisJICBPb3BzLCByZW1vdmUgZGVidWcuCisKKzIwMDQtMTItMDEgIFNlYmFzdGllbiBDb3RlICA8c2M1QGhlcm1lcy51c2hlcmIuY2E+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzogKGFsYXdkZWNfZ2V0Y2Fwcyk6CisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOiAobXVsYXdkZWNfZ2V0Y2Fwcyk6CisJICBQcmV2ZW50IHdhcm5pbmdzIHdoZW4gbmVnb3RpYXRpbmcgY2FwcyAoZml4ZXMgIzE1OTMzOCkuCisKKzIwMDQtMTItMDEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvbG9yc3BhY2UuYzoKKwkoZ3N0X2ZmbXBlZ2NzcF9jaGFpbik6CisJICBSZW1vdmUgb2xkIGxlZnRvdmVyIHRoYXQgc2hvdWxkbid0IGJlIHRoZXJlLi4uCisKKzIwMDQtMTItMDEgIFNlYmFzdGllbiBDb3RlICA8c2M1QGhlcm1lcy51c2hlcmIuY2E+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5jOiAoZ3N0X3JpZmZfcmVhZF91c2VfZXZlbnQpOgorCSAgRG9uJ3QgZm9yd2FyZCBESVNDT05UIGV2ZW50cyAoZml4ZXMgIzE1OTY4NCkuCisKKzIwMDQtMTItMDEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChyZW1vdmVfc2lua3MpLCAoc2V0dXBfc2lua3MpOgorCSAgVW5saW5rIG1hbnVhbGx5IHNpbmNlIHNvbWV0aW1lcyBiaW4gZGlzcG9zYWwgKGFuZCB0aGVyZWZvcmUKKwkgIHBhZCB1bmxpbmtpbmcpIGlzIGRlbGF5ZWQsIHdoaWNoIHdpbGwgY2F1c2UgYSBuZXcgbWVkaWEgZmlsZQorCSAgdG8gbm90IGJlIGFibGUgdG8gc3RhcnQgcGxheWluZyBpbnN0YW50bHkuCisKKzIwMDQtMTEtMjkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RzdHJlYW1pbmZvLmM6IChzdHJlYW1faW5mb19tdXRlX3BhZCk6CisJICBPbiBtdXRlIG9mIGFuIHVubGlua2VkIHN0cmVhbSwgY2hlY2sgZm9yIHBhZCBhdmFpbGFiaWxpdHkgc28KKwkgIHdlIGRvbid0IGNyYXNoIG9uIHVubGlua2VkIHBhZC4KKworMjAwNC0xMS0yOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5kZXgpLAorCShnc3RfYXZpX2RlbXV4X21hc3NhZ2VfaW5kZXgpOgorCSAgRml4IHF1aXRlIGh1bWlsaWF0aW5nIGJ1ZyBpbiBvbWl0dGluZyAwLXNpemVkIGluZGV4IGNodW5rcyBidXQKKwkgIGZvcmdldHRpbmcgdG8gY291bnQgdGhlbSBmb3IgdGltZXN0YW1wcy4KKworMjAwNC0xMS0yOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2E1MmRlYy9nc3RhNTJkZWMuYzogKGdzdF9hNTJkZWNfbG9vcCk6CisJICBBY3R1YWxseSBsZWF2ZSB0aGUgbG9vcCBpZiB3ZSBmYWlsZWQgdG8gc3luYy4gRG9uJ3QgY3Jhc2guCisKKzIwMDQtMTEtMjggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdGR2ZGRlbXV4LmM6IChnc3RfZHZkX2RlbXV4X2dldF9hdWRpb19zdHJlYW0pLAorCShnc3RfZHZkX2RlbXV4X3Byb2Nlc3NfcHJpdmF0ZSk6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RkdmRkZW11eC5oOgorCSAgRml4IGNyYXNoICgjMTU5NzU5KS4gRG9lc24ndCB3b3JrLCB0aG91Z2guIDotKC4KKworMjAwNC0xMS0yOCAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGNoYW5uZWxtaXguYzogKGdzdF9hdWRpb19jb252ZXJ0X21peCk6CisJICBtb3JlIG92ZXJ3cml0aW5nIHByb3RlY3Rpb24gZHVlIHRvIG1vZGlmeWluZyBjaGFubmVscyBvbmUgYnkgb25lCisJICBpbnN0ZWFkIG9mIGFsbCBhdCBvbmNlCisKKzIwMDQtMTEtMjggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0Y2hhbm5lbG1peC5jOgorCShnc3RfYXVkaW9fY29udmVydF9maWxsX25vcm1hbGl6ZSk6CisJICBOb3JtYWxpemUgdXNpbmcgYWJzb2x1dGUgdmFsdWVzLgorCisyMDA0LTExLTI4ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkqIGV4dC9kaXJlY3RmYi9NYWtlZmlsZS5hbToKKwkqIGV4dC9kaXJlY3RmYi9kaXJlY3RmYnZpZGVvc2luay5jOiAoZ3N0X2RpcmVjdGZidmlkZW9zaW5rX2NyZWF0ZSksCisJKGdzdF9kaXJlY3RmYnZpZGVvc2lua19nZXRfcGl4ZWxfZm9ybWF0KSwKKwkoZ3N0X2RpcmVjdGZidmlkZW9zaW5rX2dldF9mb3JtYXRfZnJvbV9mb3VyY2MpLAorCShnc3RfZGlyZWN0ZmJ2aWRlb3NpbmtfZml4YXRlKSwgKGdzdF9kaXJlY3RmYnZpZGVvc2lua19nZXRjYXBzKSwKKwkoZ3N0X2RpcmVjdGZidmlkZW9zaW5rX3NpbmtfbGluayksCisJKGdzdF9kaXJlY3RmYnZpZGVvc2lua19jaGFuZ2Vfc3RhdGUpLAorCShnc3RfZGlyZWN0ZmJ2aWRlb3NpbmtfY2hhaW4pLCAoZ3N0X2RpcmVjdGZidmlkZW9zaW5rX2J1ZmZlcl9mcmVlKSwKKwkoZ3N0X2RpcmVjdGZidmlkZW9zaW5rX2J1ZmZlcl9hbGxvYyksCisJKGdzdF9kaXJlY3RmYnZpZGVvc2lua19pbnRlcmZhY2Vfc3VwcG9ydGVkKSwKKwkoZ3N0X2RpcmVjdGZidmlkZW9zaW5rX2ludGVyZmFjZV9pbml0KSwKKwkoZ3N0X2RpcmVjdGZidmlkZW9zaW5rX25hdmlnYXRpb25fc2VuZF9ldmVudCksCisJKGdzdF9kaXJlY3RmYnZpZGVvc2lua19uYXZpZ2F0aW9uX2luaXQpLAorCShnc3RfZGlyZWN0ZmJ2aWRlb3Npbmtfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X2RpcmVjdGZidmlkZW9zaW5rX2dldF9wcm9wZXJ0eSksCisJKGdzdF9kaXJlY3RmYnZpZGVvc2lua19maW5hbGl6ZSksIChnc3RfZGlyZWN0ZmJ2aWRlb3NpbmtfaW5pdCksCisJKGdzdF9kaXJlY3RmYnZpZGVvc2lua19iYXNlX2luaXQpLAorCShnc3RfZGlyZWN0ZmJ2aWRlb3NpbmtfY2xhc3NfaW5pdCksCisJKGdzdF9kaXJlY3RmYnZpZGVvc2lua19nZXRfdHlwZSksIChwbHVnaW5faW5pdCk6CisJKiBleHQvZGlyZWN0ZmIvZGlyZWN0ZmJ2aWRlb3NpbmsuaDogQWRkaW5nIGEgZmlyc3QgdmVyc2lvbiBvZgorCWRpcmVjdGZidmlkZW9zaW5rLgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19pbml0KTogSW5pdGlhbGl6aW5nIHNvbWUKKwltb3JlLgorCisyMDA0LTExLTI4ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0Y2hhbm5lbG1peC5jOiAoZ3N0X2F1ZGlvX2NvbnZlcnRfbWl4KToKKwkgIHdhbGsgdGhlIHNhbXBsZXMgYmFja3dhcmRzIGlmIG91dF9jaGFubmVscyA+IGluX2NoYW5uZWxzIHNvIHdlIGRvbid0CisJICBvdmVyd3JpdGUgZGF0YQorCisyMDA0LTExLTI4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXVkaW9jb252ZXJ0L01ha2VmaWxlLmFtOgorCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogKGdzdF9hdWRpb19jb252ZXJ0X2luaXQpLAorCShnc3RfYXVkaW9fY29udmVydF9saW5rKSwgKGdzdF9hdWRpb19jb252ZXJ0X2NoYW5nZV9zdGF0ZSksCisJKGdzdF9hdWRpb19jb252ZXJ0X2NoYW5uZWxzKToKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0Y2hhbm5lbG1peC5jOgorCShnc3RfYXVkaW9fY29udmVydF91bnNldF9tYXRyaXgpLAorCShnc3RfYXVkaW9fY29udmVydF9maWxsX2lkZW50aWNhbCksCisJKGdzdF9hdWRpb19jb252ZXJ0X2ZpbGxfY29tcGF0aWJsZSksCisJKGdzdF9hdWRpb19jb252ZXJ0X2RldGVjdF9wb3MpLCAoZ3N0X2F1ZGlvX2NvbnZlcnRfZmlsbF9vbmVfb3RoZXIpLAorCShnc3RfYXVkaW9fY29udmVydF9maWxsX290aGVycyksCisJKGdzdF9hdWRpb19jb252ZXJ0X2ZpbGxfbm9ybWFsaXplKSwKKwkoZ3N0X2F1ZGlvX2NvbnZlcnRfZmlsbF9tYXRyaXgpLCAoZ3N0X2F1ZGlvX2NvbnZlcnRfc2V0dXBfbWF0cml4KSwKKwkoZ3N0X2F1ZGlvX2NvbnZlcnRfcGFzc3Rocm91Z2gpLCAoZ3N0X2F1ZGlvX2NvbnZlcnRfbWl4KToKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0Y2hhbm5lbG1peC5oOgorCSAgSW1wbGVtZW50IGEgY2hhbm5lbCBtaXhlci4KKworMjAwNC0xMS0yOCAgTWFydGluIFNvdG8gIDxtYXJ0aW5zb3RvQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuYyAoZ3N0X2Fsc2Ffc2lua19sb29wKToKKwkqIGV4dC9hbHNhL2dzdGFsc2EuaDoKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYyAoZ3N0X2Fsc2Ffc2V0X2Nsb2NrKToKKwlNYWtlIGFsc2FzaW5rIGFjdHVhbGx5IGhvbm9yIGdzdF9lbGVtZW50X3NldF9jbG9jayBhbmQgdXNlIHRoYXQKKwljbG9jayBpbnN0ZWFkIG9mIGl0cyBpbnRlcm5hbCBvbmUuCisKKzIwMDQtMTEtMjcgIENocmlzdG9waGUgRmVyZ2VhdSAgPHRldWZAZ25vbWUub3JnPgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKHNldHVwX3NvdXJjZSk6IGZpeGVkIGEgY2FwcyBsZWFrCisJKGdzdF9wbGF5X2Jhc2VfYmluX2NoYW5nZV9zdGF0ZSk6IG51bGxpZnkgc291cmNlIGFuZCBkZWNvZGVyIHdoZW4KKwlnb2luZyBmcm9tIFJFQURZIHRvIE5VTEwgc28gdGhhdCB3ZSBkb24ndCB0cnkgdG8gZG8gd2VpcmQgc3R1ZmYgd2l0aAorCXRoZW0gd2hlbiBnb2luZyBmcm9tIE5VTEwgdG8gUkVBRFkKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnc3RfcGxheV9iaW5faW5pdCk6IHVzZSBnc3Rfb2JqZWN0X3VucmVmCisJaW5zdGVhZCBvZiBnX29iamVjdF91bnJlZgorCShnZW5fdmlkZW9fZWxlbWVudCksIChnZW5fYXVkaW9fZWxlbWVudCk6IG1vcmUgcmVmY291bnRpbmcgZml4ZXMsIG5vdworCWl0IHNob3VsZCBiZSBjb3JyZWN0CisJKGdzdF9wbGF5X2Jpbl9jaGFuZ2Vfc3RhdGUpOiBkb24ndCBjYWxsIHJlbW92ZV9zaW5rcyBpZiB3ZSBhcmUKKwljdXJyZW50bHkgZGlzcG9zaW5nIHRoZSBvYmplY3QKKworMjAwNC0xMS0yNyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2E1MmRlYy9nc3RhNTJkZWMuYzogKGdzdF9hNTJkZWNfbG9vcCk6CisJICBEb24ndCBmb3JnZXQgYmFzcyBpZiBpdCdzIHRoZXJlLiBFbHNlIGxlZnQgY2hhbm5lbCBpcyBzaWxlbnQuLi4KKworMjAwNC0xMS0yNyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2E1MmRlYy9nc3RhNTJkZWMuYzogKGdzdF9hNTJkZWNfbG9vcCksCisJKGdzdF9hNTJkZWNfY2hhbmdlX3N0YXRlKToKKwkgIERvbid0IGRvIHNhbXBsZSBhZGp1c3RpbmcgYW55bW9yZSwgd2UgdXNlIGZsb2F0IGF1ZGlvIG5vdy4KKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6IChnc3RfYXVkaW9fY29udmVydF9maXhhdGUpOgorCSAgRG9uJ3QgZml4YXRlIHRvIG5vbi1leGlzdGluZyBwcm9wZXJ0aWVzLgorCisyMDA0LTExLTI3ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYTUyZGVjL2dzdGE1MmRlYy5jOiAoZ3N0X2E1MmRlY19jaGFubmVscyksCisJKGdzdF9hNTJkZWNfY2hhbmdlX3N0YXRlKToKKwkgIEFkdmVydGlzZSB0aGF0IHdlIGNhbiBkbyBzdXJyb3VuZCBzb3VuZC4KKworMjAwNC0xMS0yNyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2E1MmRlYy9nc3RhNTJkZWMuYzogKGdzdF9hNTJkZWNfcmVuZWcpOgorCSAgQWRkIGJ1ZmZlci1mcmFtZXM9MC4KKwkqIGV4dC9kdmRyZWFkL2R2ZHJlYWRzcmMuYzogKGR2ZHJlYWRzcmNfZ2V0X3R5cGUpLAorCShkdmRyZWFkc3JjX2luaXQpLCAoZHZkcmVhZHNyY19nZXRfZXZlbnRfbWFzayksCisJKGR2ZHJlYWRzcmNfZ2V0X3F1ZXJ5X3R5cGVzKSwgKGR2ZHJlYWRzcmNfZ2V0X2Zvcm1hdHMpLAorCShkdmRyZWFkc3JjX3NyY3BhZF9ldmVudCksIChkdmRyZWFkc3JjX3NyY3BhZF9xdWVyeSksCisJKF9zZWVrX3RpdGxlKSwgKF9zZWVrX2NoYXB0ZXIpLCAoZ2V0X25leHRfY2VsbF9mb3IpLCAoX3JlYWQpLAorCShzZWVrX3NlY3RvciksIChkdmRyZWFkc3JjX2dldCksIChkdmRyZWFkc3JjX29wZW5fZmlsZSksCisJKGR2ZHJlYWRzcmNfY2hhbmdlX3N0YXRlKSwgKGR2ZHJlYWRzcmNfdXJpX2dldF90eXBlKSwKKwkoZHZkcmVhZHNyY191cmlfZ2V0X3Byb3RvY29scyksIChkdmRyZWFkc3JjX3VyaV9nZXRfdXJpKSwKKwkoZHZkcmVhZHNyY191cmlfc2V0X3VyaSksIChkdmRyZWFkc3JjX3VyaV9oYW5kbGVyX2luaXQpOgorCSogZXh0L2R2ZHJlYWQvZHZkcmVhZHNyYy5oOgorCSAgQWRkIHNlZWtpbmcsIHF1ZXJ5aW5nIGZvciBieXRlcywgc2VjdG9ycywgdGl0bGUsIGFuZ2xlIGFuZAorCSAgY2hhcHRlci4gSGFuZGxlIG11bHRpcGxlIGNoYXB0ZXJzLiBSZWxpY2Vuc2UgdG8gTEdQTCBiZWNhdXNlCisJICBCaWxseSBhZ3JlZWQgb24gdGhhdCAodGhhbmtzIEJpbGx5ISkuCisKKzIwMDQtMTEtMjcgIENocmlzdG9waGUgRmVyZ2VhdSAgPHRldWZAZ25vbWUub3JnPgorCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOiAoZ3N0X2F1ZGlvX2NvbnZlcnRfZGlzcG9zZSk6CisJY2FsbCBwYXJlbnQgZGlzcG9zZSBtZXRob2QKKworMjAwNC0xMS0yNyAgTWFydGluIFNvdG8gIDxtYXJ0aW5zb3RvQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL2F1ZGlvY2xvY2suYyAoZ3N0X2F1ZGlvX2Nsb2NrX3NldF9hY3RpdmUpCisJKGdzdF9hdWRpb19jbG9ja19nZXRfaW50ZXJuYWxfdGltZSk6CisJRml4IGFjdGl2ZSA8LT4gaW5hY3RpdmUgdHJhbnNpdGlvbnM6IGVuc3VyZSB0aW1lIHZhbHVlIGFsd2F5cworCWdyb3dzIGFuZCBhdm9pZCBhYnJ1cHQgdmFsdWUgY2hhbmdlcy4KKworMjAwNC0xMS0yNyAgQXJ3ZWQgdi4gTWVya2F0eiA8di5tZXJrYXR6QGdteC5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC90dGEvTWFrZWZpbGUuYW06CisJKiBnc3QvdHRhL2NyYzMyLmg6CisJKiBnc3QvdHRhL2ZpbHRlcnMuaDoKKwkqIGdzdC90dGEvZ3N0dHRhLmM6CisJKiBnc3QvdHRhL2dzdHR0YWRlYy5jOgorCSogZ3N0L3R0YS9nc3R0dGFkZWMuaDoKKwkqIGdzdC90dGEvZ3N0dHRhcGFyc2UuYzoKKwkqIGdzdC90dGEvZ3N0dHRhcGFyc2UuaDoKKwkqIGdzdC90dGEvdHRhZGVjLmg6CisJICBhZGRlZCBUVEEgcGFyc2VyIGFuZCBkZWNvZGVyCisKKzIwMDQtMTEtMjYgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoZ3N0X3BsYXlfYmFzZV9iaW5fY2xhc3NfaW5pdCksCisJKHByb2JlX3RyaWdnZXJlZCksIChjaGVja19xdWV1ZSksIChidWZmZXJfdW5kZXJydW4pLAorCShidWZmZXJfcnVubmluZyksIChidWZmZXJfb3ZlcnJ1biksIChnZW5fc291cmNlX2VsZW1lbnQpLAorCShzZXR1cF9zb3VyY2UpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmg6CisJICBJbXBsZW1lbnQgYnVmZmVyaW5nLiBOZWVkcyBzb21lIG1vcmUgd29yay4KKworMjAwNC0xMS0yNiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzogKHRoZW9yYV9kZWNfY2hhaW4pOgorCSAgRml4IGlsb2cgbWFzayByYW5nZSBvdmVyZmxvdy4KKworMjAwNC0xMS0yNiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfZ2V0X2NhcHMpOgorCSAgRG9uJ3Qgb21pdCB0aGUgbGFzdCAod2hpY2ggaW4gY2FzZSBvZiBkbWl4IGlzIHRoZSBvbmx5IDopICkKKwkgIGNoYW5uZWwgY291bnQuIERvbid0IHNldCBjaGFubmVscyBpZiA8PSAyLgorCisyMDA0LTExLTI2ICBDaHJpc3RvcGhlIEZlcmdlYXUgIDx0ZXVmQGdub21lLm9yZz4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdlbl92aWRlb19lbGVtZW50KSwKKwkoZ2VuX2F1ZGlvX2VsZW1lbnQpOiBSZW1vdmVkIDIgb2Jzb2xldGUgY29tbWVudHMKKworMjAwNC0xMS0yNiAgU3RlcGhhbmUgTG9ldWlsbGV0IDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZXh0L3ZvcmJpcy9vZ2d2b3JiaXNlbmMuYworCSogZXh0L3ZvcmJpcy92b3JiaXNlbmMuYyA6CisJICBjaGFuZ2UgZGVzY3JpcHRpb24gZmllbGRzIG9mIHRob3NlIHBsdWdpbnMgdG8gZGlmZmVyZW50aWF0ZSB0aGVtCisJICAocGl0aXZpIHNob3cgRW5jb2RlcnMgYnkgZGVzY3JpcHRpb24sIHRoZXkgaGFkIHRoZSBzYW1lIG9uZSkKKworMjAwNC0xMS0yNSAgQ2hyaXN0b3BoZSBGZXJnZWF1ICA8dGV1ZkBnbm9tZS5vcmc+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnc3RfcGxheV9iaW5fZGlzcG9zZSksCisJKGdzdF9wbGF5X2Jpbl9zZXRfcHJvcGVydHkpLCAoZ2VuX3ZpZGVvX2VsZW1lbnQpLAorCShnZW5fYXVkaW9fZWxlbWVudCk6CisJICBSZWZjb3VudGluZyBmaXhlcyBmb3IgcHJvdmlkZWQgYXVkaW8tL3ZpZGVvc2lua3MuCisKKzIwMDQtMTEtMjUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnZW5fdmlkZW9fZWxlbWVudCksCisJKGdlbl9hdWRpb19lbGVtZW50KSwgKHNldHVwX3NpbmtzKSwgKGdzdF9wbGF5X2Jpbl9jaGFuZ2Vfc3RhdGUpOgorCSAgRG9uJ3QgcmVmZXJlbmNlIGFsbCBzaW5rcywgYnV0IG9ubHkgdGhlIHZpZGVvLSBhbmQgYXVkaW9zaW5rcy4KKwkgIFRoZSB2aXMuIGVsZW1lbnQgc2hvdWxkIGJlIGRpc3Bvc2VkIHdoZW4gd2UncmUgZG9uZSB3aXRoIGl0LgorCSAgV2UgZG9uJ3QgaGF2ZSBhbnkgcmVhc29uIHRvIGtlZXAgaXQgYXJvdW5kLiBUaGlzIGZpeGVzIHdhcm5pbmdzCisJICB3aGVuIHJldXNpbmcgcGxheWJpbiBmb3IgcGxheWluZyBtdWx0aXBsZSBhdWRpbyBmaWxlcyB3aXRoCisJICB2aXMuIGVuYWJsZWQuIEFsc28gcmVsZWFzZSBhdWRpbyBkZXZpY2Ugb24gcGF1c2UgLSBpZGVhIHN0b2xlbgorCSAgZnJvbSBSaHl0aG1ib3guCisKKzIwMDQtMTEtMjUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hNTJkZWMvZ3N0YTUyZGVjLmM6IChnc3RfYTUyZGVjX2NoYW5uZWxzKSwgKGdzdF9hNTJkZWNfcHVzaCksCisJKGdzdF9hNTJkZWNfcmVuZWcpLCAoZ3N0X2E1MmRlY19sb29wKSwgKHBsdWdpbl9pbml0KToKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX2dldF9jYXBzKToKKwkqIGV4dC9hbHNhL2dzdGFsc2FwbHVnaW4uYzogKHBsdWdpbl9pbml0KToKKwkqIGV4dC9kdHMvZ3N0ZHRzZGVjLmM6IChnc3RfZHRzZGVjX2NoYW5uZWxzKSwKKwkoZ3N0X2R0c2RlY19yZW5lZ290aWF0ZSksIChnc3RfZHRzZGVjX2xvb3ApLCAocGx1Z2luX2luaXQpOgorCSogZXh0L2ZhYWQvZ3N0ZmFhZC5jOiAoZ3N0X2ZhYWRfaW5pdCksIChnc3RfZmFhZF9jaGFucG9zX2Zyb21fZ3N0KSwKKwkoZ3N0X2ZhYWRfY2hhbnBvc190b19nc3QpLCAoZ3N0X2ZhYWRfc2lua2Nvbm5lY3QpLAorCShnc3RfZmFhZF9zcmNnZXRjYXBzKSwgKGdzdF9mYWFkX3NyY2Nvbm5lY3QpLCAoZ3N0X2ZhYWRfY2hhaW4pLAorCShnc3RfZmFhZF9jaGFuZ2Vfc3RhdGUpLCAocGx1Z2luX2luaXQpOgorCSogZXh0L2ZhYWQvZ3N0ZmFhZC5oOgorCSogZXh0L3ZvcmJpcy92b3JiaXMuYzogKHBsdWdpbl9pbml0KToKKwkqIGV4dC92b3JiaXMvdm9yYmlzZGVjLmM6ICh2b3JiaXNfZGVjX2NoYWluKToKKwkqIGdzdC1saWJzL2dzdC9hdWRpby9NYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2dzdC9hdWRpby9hdWRpby5jOiAocGx1Z2luX2luaXQpOgorCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL211bHRpY2hhbm5lbC5jOgorCShnc3RfYXVkaW9fY2hlY2tfY2hhbm5lbF9wb3NpdGlvbnMpLAorCShnc3RfYXVkaW9fZ2V0X2NoYW5uZWxfcG9zaXRpb25zKSwKKwkoZ3N0X2F1ZGlvX3NldF9jaGFubmVsX3Bvc2l0aW9ucyksCisJKGdzdF9hdWRpb19zZXRfc3RydWN0dXJlX2NoYW5uZWxfcG9zaXRpb25zX2xpc3QpLAorCShhZGRfbGlzdF90b19zdHJ1Y3QpLCAoZ3N0X2F1ZGlvX3NldF9jYXBzX2NoYW5uZWxfcG9zaXRpb25zX2xpc3QpLAorCShnc3RfYXVkaW9fZml4YXRlX2NoYW5uZWxfcG9zaXRpb25zKToKKwkqIGdzdC1saWJzL2dzdC9hdWRpby9tdWx0aWNoYW5uZWwuaDoKKwkqIGdzdC1saWJzL2dzdC9hdWRpby90ZXN0Y2hhbm5lbHMuYzogKG1haW4pOgorCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzoKKwkoZ3N0X2F1ZGlvX2NvbnZlcnRfY2xhc3NfaW5pdCksIChnc3RfYXVkaW9fY29udmVydF9pbml0KSwKKwkoZ3N0X2F1ZGlvX2NvbnZlcnRfZGlzcG9zZSksIChnc3RfYXVkaW9fY29udmVydF9nZXRjYXBzKSwKKwkoZ3N0X2F1ZGlvX2NvbnZlcnRfcGFyc2VfY2FwcyksIChnc3RfYXVkaW9fY29udmVydF9saW5rKSwKKwkoZ3N0X2F1ZGlvX2NvbnZlcnRfZml4YXRlKSwgKGdzdF9hdWRpb19jb252ZXJ0X2NoYW5uZWxzKToKKwkqIGdzdC9hdWRpb2NvbnZlcnQvcGx1Z2luLmM6IChwbHVnaW5faW5pdCk6CisJICBTdXJyb3VuZCBzb3VuZCBzdXBwb3J0LgorCisyMDA0LTExLTI1ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2RlbXV4X3B1c2gpOgorCSAgRml4IHBvc2l0aW9uIGZvciBkaXNjb250IGlmIHdlJ3JlIGNsb3NlIGFzIHdlbGwuIE5pdHBpY2tpbmcsIGJ1dAorCSAgc2F2ZXMgYSBmZXcgbWlsbGlzZWNvbmRzIG9mIGV4dHJhIHdhaXRpbmcgb3Igc2tpcHBpbmcuCisKKzIwMDQtMTEtMjUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RkZWNvZGViaW4uYzogKGdzdF9kZWNvZGVfYmluX2ZhY3RvcnlfZmlsdGVyKToKKwkgIFdlIHNvbWV0aW1lcyBuZWVkIHBhcnNlcnMgZm9yIHBsYXliYWNrLCBzbyBhZGQgdGhvc2UgdG9vLgorCisyMDA0LTExLTI1ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QvYXBldGFnL01ha2VmaWxlLmFtOgorCSogZ3N0L2FwZXRhZy9hcGVkZW11eC5jOiAoZ3N0X2FwZV9kZW11eF9nZXRfdHlwZSksCisJKGdzdF9hcGVfZGVtdXhfYmFzZV9pbml0KSwgKGdzdF9hcGVfZGVtdXhfY2xhc3NfaW5pdCksCisJKGdzdF9hcGVfZGVtdXhfaW5pdCksIChnc3RfYXBlX2RlbXV4X2dldF9zcmNfZm9ybWF0cyksCisJKGdzdF9hcGVfZGVtdXhfZ2V0X3NyY19xdWVyeV90eXBlcyksCisJKGdzdF9hcGVfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksIChnc3RfYXBlX2RlbXV4X2dldF9ldmVudF9tYXNrKSwKKwkoZ3N0X2FwZV9kZW11eF9oYW5kbGVfc3JjX2V2ZW50KSwgKGdzdF9hcGVfZGVtdXhfaGFuZGxlX2V2ZW50KSwKKwkoZ3N0X2FwZV9kZW11eF90eXBlZmluZF9wZWVrKSwgKGdzdF9hcGVfZGVtdXhfdHlwZWZpbmRfZ2V0X2xlbmd0aCksCisJKGdzdF9hcGVfZGVtdXhfdHlwZWZpbmRfc3VnZ2VzdCksIChnc3RfYXBlX2RlbXV4X3R5cGVmaW5kKSwKKwkoZ3N0X2FwZV9kZW11eF9wYXJzZV90YWdzKSwgKGdzdF9hcGVfZGVtdXhfc3RyZWFtX2luaXQpLAorCShnc3RfYXBlX2RlbXV4X3N0cmVhbV9kYXRhKSwgKGdzdF9hcGVfZGVtdXhfbG9vcCksCisJKGdzdF9hcGVfZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC9hcGV0YWcvYXBlZGVtdXguaDoKKwkqIGdzdC9hcGV0YWcvYXBldGFnLmM6IChwbHVnaW5faW5pdCk6CisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKGFwZXRhZ190eXBlX2ZpbmQpLAorCShwbHVnaW5faW5pdCk6CisJICBBUEUgdjEvMiB0YWcgcmVhZGVyIHBsdXMgdHlwZWZpbmQgZnVuY3Rpb24uCisKKzIwMDQtMTEtMjUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoZ3N0X3BsYXlfYmFzZV9iaW5fYWRkX2VsZW1lbnQpOgorCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChtcDNfdHlwZV9maW5kKToKKwkgIFJlbW92ZSBoYWNrcyBmb3Igb2xkZXIgY29yZS4gUmVxdWlyZSBuZXdlciBjb3JlIHZlcnNpb24KKwkgIGFjY29yZGluZ2x5LgorCisyMDA0LTExLTI1ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvY2R4YXBhcnNlL01ha2VmaWxlLmFtOgorCSogZ3N0L2NkeGFwYXJzZS9nc3RjZHhhcGFyc2UuYzogKGdzdF9jZHhhcGFyc2VfZ2V0X3R5cGUpLAorCShnc3RfY2R4YXBhcnNlX2NsYXNzX2luaXQpLCAoZ3N0X2NkeGFwYXJzZV9pbml0KSwKKwkoZ3N0X2NkeGFwYXJzZV9sb29wKSwgKGdzdF9jZHhhcGFyc2VfY2hhbmdlX3N0YXRlKSwgKHBsdWdpbl9pbml0KToKKwkqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXBhcnNlLmg6CisJKiBnc3QvY2R4YXBhcnNlL2dzdGNkeGFzdHJpcC5jOiAoZ3N0X2NkeGFzdHJpcF9nZXRfdHlwZSksCisJKGdzdF9jZHhhc3RyaXBfYmFzZV9pbml0KSwgKGdzdF9jZHhhc3RyaXBfY2xhc3NfaW5pdCksCisJKGdzdF9jZHhhc3RyaXBfaW5pdCksIChnc3RfY2R4YXN0cmlwX2dldF9zcmNfZm9ybWF0cyksCisJKGdzdF9jZHhhc3RyaXBfZ2V0X3NyY19xdWVyeV90eXBlcyksCisJKGdzdF9jZHhhc3RyaXBfaGFuZGxlX3NyY19xdWVyeSksIChnc3RfY2R4YXN0cmlwX2dldF9ldmVudF9tYXNrKSwKKwkoZ3N0X2NkeGFzdHJpcF9oYW5kbGVfc3JjX2V2ZW50KSwgKGdzdF9jZHhhc3RyaXBfc3RyaXApLAorCShnc3RfY2R4YXN0cmlwX3N5bmMpLCAoZ3N0X2NkeGFzdHJpcF9oYW5kbGVfZXZlbnQpLAorCShnc3RfY2R4YXN0cmlwX2NoYWluKSwgKGdzdF9jZHhhc3RyaXBfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXN0cmlwLmg6CisJICBTVkNEL1ZDRCBoZWFkZXIgc3RyaXBwaW5nIHNlcGFyYXRlZCBmcm9tIENEWEEgaW1hZ2UgcGFyc2luZy4KKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAobXAzX3R5cGVfZmluZCksCisJKHBsdWdpbl9pbml0KToKKwkgIEFkZCBWQ0QvU1ZDRCBoZWFkZXIgdHlwZWZpbmRpbmcgZm9yIFZDRC9TVkNELgorCSogc3lzL3ZjZC92Y2RzcmMuYzogKGdzdF92Y2RzcmNfZ2V0X3R5cGUpLCAoZ3N0X3ZjZHNyY19iYXNlX2luaXQpLAorCShnc3RfdmNkc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3ZjZHNyY19pbml0KSwKKwkoZ3N0X3ZjZHNyY19zZXRfcHJvcGVydHkpLCAoZ3N0X3ZjZHNyY19nZXRfcHJvcGVydHkpLAorCShnc3RfdmNkc3JjX2dldF9ldmVudF9tYXNrKSwgKGdzdF92Y2RzcmNfZ2V0X3F1ZXJ5X3R5cGVzKSwKKwkoZ3N0X3ZjZHNyY19nZXRfZm9ybWF0cyksIChnc3RfdmNkc3JjX3NyY3BhZF9ldmVudCksCisJKGdzdF92Y2RzcmNfc3JjcGFkX3F1ZXJ5KSwgKGdzdF92Y2RzcmNfZ2V0KSwKKwkoZ3N0X3ZjZHNyY19vcGVuX2ZpbGUpLCAoZ3N0X3ZjZHNyY19jbG9zZV9maWxlKSwKKwkoZ3N0X3ZjZHNyY19jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3ZjZHNyY19tc2YpLAorCShnc3RfdmNkc3JjX3JlY2FsY3VsYXRlKSwgKGdzdF92Y2RzcmNfdXJpX2dldF90eXBlKSwKKwkoZ3N0X3ZjZHNyY191cmlfZ2V0X3Byb3RvY29scyksIChnc3RfdmNkc3JjX3VyaV9nZXRfdXJpKSwKKwkoZ3N0X3ZjZHNyY191cmlfc2V0X3VyaSksIChnc3RfdmNkc3JjX3VyaV9oYW5kbGVyX2luaXQpOgorCSogc3lzL3ZjZC92Y2RzcmMuaDoKKwkgIEZpeCB1cCwgYWRkIHNlZWtpbmcsIHF1ZXJ5aW5nLCBVUkkgaW50ZXJmYWNlLiBXb3JrcyBpbiB0b3RlbSBub3cuCisKKzIwMDQtMTEtMjUgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGJhY2sgdG8gQ1ZTCisKKz09PSByZWxlYXNlIDAuOC42ID09PQorCisyMDA0LTExLTI1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSAgcmVsZWFzaW5nIDAuOC42LCAiSU9VIExvdmUiCisKKzIwMDQtMTEtMjMgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwlwYXRjaCBieTogUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzoKKwkgIEZpeCB1bnBsYXlhYmxlIGZpbGVzIGVycm9yIGhhbmRsaW5nLiAgRml4ZXMgIzE1ODM2NQorCisyMDA0LTExLTIzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJcGF0Y2ggYnk6IFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6CisJICBGaXggYnJva2VuIG1wMyB0eXBlZmluZGluZy4gIEZpeGVzICMxNTgzNzUKKworMjAwNC0xMS0yMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCXBhdGNoIGJ5OiBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzoKKwkgIEZpeCBzeW5jIG9uIGJyb2tlbiBmaWxlcy4gIEZpeGVzICMxNTg5NzYKKworMjAwNC0xMS0yMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCXBhdGNoIGJ5OiBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOgorCSAgQ29weSBvdmVyIGJ1ZmZlciBwcm9wZXJ0aWVzLiAgRml4ZXMgIzE1ODgzMgorCisyMDA0LTExLTIzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJcGF0Y2ggYnk6IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHQuaS5tQHplbi5jby51az4KKworCSogZXh0L2R2ZHJlYWQvZHZkcmVhZHNyYy5jOgorCSAgRml4ZXMgaW52YWxpZCByZWFkcyAoIzE1ODQ2MikKKworMjAwNC0xMS0yMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzoKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmg6CisJKiBzeXMvdjRsL3Y0bHNyY19jYWxscy5jOgorCSAgUHJvYmUgbGVzcyBhbmQgY2FjaGUgaXQuICBGaXhlcyAjMTU5MTg3LgorCisyMDA0LTExLTIzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvdmlkZW9yYXRlL2dzdHZpZGVvcmF0ZS5jOgorCSAgSGFuZGxlIGFsbCB2aWRlbyBmb3JtYXRzLiBGaXhlcyAjMTU5MTg2LgorCisyMDA0LTExLTE2ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisJKiBnc3Qvc3luYWVzdGhlc2lhL2dzdHN5bmFlc3RoZXNpYS5jOgorCShnc3Rfc3luYWVzdGhlc2lhX2NsYXNzX2luaXQpLCAoZ3N0X3N5bmFlc3RoZXNpYV9pbml0KSwKKwkoZ3N0X3N5bmFlc3RoZXNpYV9kaXNwb3NlKSwgKGdzdF9zeW5hZXN0aGVzaWFfZmluYWxpemUpLAorCShnc3Rfc3luYWVzdGhlc2lhX3NpbmtfbGluayksIChnc3Rfc3luYWVzdGhlc2lhX3NyY19nZXRjYXBzKSwKKwkoZ3N0X3N5bmFlc3RoZXNpYV9zcmNfbGluayksIChnc3Rfc3luYWVzdGhlc2lhX2NoYWluKSwKKwkoZ3N0X3N5bmFlc3RoZXNpYV9jaGFuZ2Vfc3RhdGUpLCAocGx1Z2luX2luaXQpOgorCUZpeCB1cCBzeW5hZXN0aGVzaWEgdG8gd29yayB1bmRlciBkaWZmZXJlbnQgc2FtcGxlcmF0ZXMvIGJ1ZmZlciBzaXplcy4KKwlGb3JjZSAzMjB4MjAwIG91dHB1dCwgYXMgdGhhdCdzIHRoZSBvbmx5IHRoaW5nIHRoZSB1bmRlcmx5aW5nCisJc3luYWVzdGhlc2lhIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzLiBTdGlsbCBuZWVkcyB0byBiZSBtYWRlCisJcmUtZW50cmFudC4KKworMjAwNC0xMS0xNCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSAgRml4IG1wZWcyZW5jIGNvbmZpZ3VyZSBjaGVjayAoc2ltaWxhciB0byBtcGxleCBjaGVjayBiZWxvdykuCisKKzIwMDQtMTEtMTQgIEtvb3AgTWFzdCAgPGt3bUByYWluYm93LXJ1bm5lci5ubD4KKworCXJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29kZWNtYXAuYzoKKwkgIEZpeCBmb3IgZ2NjLTIuOTUgKGZpeGVzICMxNTgyMjEpLgorCisyMDA0LTExLTEzICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKGdzdF9wbGF5X2Jhc2VfYmluX2FkZF9lbGVtZW50KToKKwkgIFJlLWFkZCBjbG9jayBkaXN0cmlidXRpb24gaGFjayAodW50aWwgbmV3IGNvcmUgaXMgcmVsZWFzZWQpLgorCSAgRml4ZXMgIzE1ODEyNS4KKworMjAwNC0xMS0xMyAgQXJ3ZWQgdi4gTWVya2F0eiAgPHYubWVya2F0ekBnbXgubmV0PgorCSogY29uZmlndXJlLmFjOgorCSAgZml4IG1wbGV4IGNvbmZpZ3VyZSBjaGVjayBzZWdmYXVsdGluZyBvbiBzb21lIHN5c3RlbXMgKGJ1ZyAjMTQwOTk0KQorCisyMDA0LTExLTEzICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX3BjbV93YWl0KToKKwkgIGFkZCBkZWJ1Z2dpbmcKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2xvb3ApOgorCSAgZG8gYSB3YWl0IHdoZW4gd2UgZW50ZXIgdGhlIGxvb3AgZnVuYyB3aXRoIG5vIGRhdGEgYXZhaWxhYmxlIHRvCisJICB3cml0ZSBpbnN0ZWFkIG9mIGdldHRpbmcgaW50byBhbiAxMDAlIENQVSBsb29wIGJ5IGp1c3QgcmV0dXJuaW5nIGFuZAorCSAgYmVpbmcgY2FsbGVkIGFnYWluIGJ5IHRoZSBzY2hlZHVsZXIKKworMjAwNC0xMS0xMyAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvbGlidmlzdWFsL3Zpc3VhbC5jOiAoZ3N0X3Zpc3VhbF9nZXRfdHlwZSksCisJKGxpYnZpc3VhbF9sb2dfaGFuZGxlciksIChnc3RfdmlzdWFsX2dldGNhcHMpLAorCShnc3RfdmlzdWFsX3NyY2xpbmspLCAoZ3N0X3Zpc3VhbF9jaGFuZ2Vfc3RhdGUpLCAobWFrZV92YWxpZF9uYW1lKSwKKwkocGx1Z2luX2luaXQpOgorCSAgVXBkYXRlIGxpYnZpc3VhbCB0byAwLjEuNy4gTGluayBpbiB0aGUgZGVidWcgaGFuZGxpbmcgdG8gZ3N0cmVhbWVyCisJKiBleHQvc21vb3Rod2F2ZS9NYWtlZmlsZS5hbToKKwkqIGV4dC9zbW9vdGh3YXZlL2RlbW8tb3Nzc3JjLmM6IChtYWluKToKKwkqIGV4dC9zbW9vdGh3YXZlL2dzdHNtb290aHdhdmUuYzogKGdzdF9zbW9vdGh3YXZlX2NsYXNzX2luaXQpLAorCShnc3Rfc21vb3Rod2F2ZV9pbml0KSwgKGdzdF9zbW9vdGh3YXZlX2Rpc3Bvc2UpLCAoZ3N0X3N3X3NpbmtsaW5rKSwKKwkoZ3N0X3N3X3NyY2xpbmspLCAoZ3N0X3Ntb290aHdhdmVfY2hhaW4pLCAoZ3N0X3N3X2NoYW5nZV9zdGF0ZSksCisJKHBsdWdpbl9pbml0KToKKwkqIGV4dC9zbW9vdGh3YXZlL2dzdHNtb290aHdhdmUuaDoKKwkgIE1ha2UgZ3N0c21vb3Rod2F2ZSBhIHdvcmtpbmcgZWxlbWVudCBpbiB0aGUgMjB0aCBjZW50dXJ5LgorCisJKiBnc3QvY2hhcnQvZ3N0Y2hhcnQuYzogKGdzdF9jaGFydF9pbml0KSwgKGdzdF9jaGFydF9zcmNjb25uZWN0KToKKwkgIEZpeCBpbmNvcnJlY3QgbGluayBmdW5jdGlvbgorCisyMDA0LTExLTEyICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3Qvdm9sdW1lL2dzdHZvbHVtZS5jOgorCSAgQWxsb3cgYnVmZmVyLWZyYW1lcz0wLgorCisyMDA0LTExLTEyIElhaW4gPGlhaW5nbm9tZUBnbWFpbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogQ2hlY2sgZm9yIHBvbHlwYXVkaW8KKworCSogZXh0L01ha2VmaWxlLmFtOiBCdWlsZCB0aGUgcG9seXAgZGlyCisKKwkqIGV4dC9wb2x5cDogVGhlIHBvbHlwc2luayBzb3VyY2VzLgorCisyMDA0LTEwLTMwIElhaW4gPGlhaW5nbm9tZUBnbWFpbC5jb20+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYyAoaW50ZXJsZWF2ZV91bmxpbmspOiBDaGFuZ2UgdGhlIHNyYyBwYWRzCisJY2FwcyB0byByZWZsZWN0IHRoZSBuZXcgbnVtYmVyIG9mIGNoYW5uZWxzLgorCisyMDA0LTExLTEyICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhc2luay5jOiAoZ3N0X2Fsc2Ffc2lua19sb29wKToKKwkgIEZpeCBmb3IgbmVnb3RpYXRpb24gb3JkZXIgcHJvYmxlbS4gVGhpcyB3b3VsZCBzaG93IHdoZW4gdGhlCisJICBBTFNBIGxvb3BmdWN0aW9uIHdhcyBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBmdW5jdGlvbi4gQUxTQQorCSAgd291bGRuJ3QgZG8gYW55dGhpbmcgYmVjYXVzZSB3ZSdyZSBub3QgbmVnb3RpYXRlZCB5ZXQsIGxlYWRpbmcKKwkgIHRvIGFuIGluZmluaXRlIGxvb3AuIFNob3dlZCBpbiBlLmcuIFJoeXRobWJveC4gRml4ZXMgIzE1ODAwNi4KKworMjAwNC0xMS0xMSAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHQuaS5tQHplbi5jby51az4KKworCXJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L3ZvcmJpcy92b3JiaXNkZWMuYzogKHZvcmJpc19kZWNfc3JjX3F1ZXJ5KToKKwkgIE5vIHdhcm5pbmdzICgjMTU3OTg2KS4KKworMjAwNC0xMS0xMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChwbHVnaW5faW5pdCk6CisJICBQcmVmZXIgYXBldjEvMiBhbmQgaWQzdjEgKGF0IGVuZCBvZiBmaWxlKSBvdmVyIG11c2VwYWNrLgorCisyMDA0LTExLTExICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9sb29wX3N0cmVhbSk6CisJICBTaWduYWwgbm8tbW9yZS1wYWRzIChzbyBpdCB3b3JrcyBpbiBwbGF5YmluKS4KKworMjAwNC0xMS0xMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L211c2VwYWNrL2dzdG11c2VwYWNrcmVhZGVyLmNwcDoKKwkgIFdvcmthcm91bmQgZm9yIG9sZGVyIGNvcmUuCisKKzIwMDQtMTEtMTEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2ltZ2NvbnZlcnQuYzogKHl1djQyMHBfdG9feXV2NDIyKToKKwkgIEFjdHVhbGx5IHRlc3QgZm9yIG9kZCB3aWR0aC9oZWlnaHQgcmF0aGVyIHRoYW4gdGVzdGluZyB3aGV0aGVyCisJICBhIHRlbXBvcmFyeSB2YXJpYWJsZSB0aGF0IHdhcyAwIGJlZm9yZSB3ZSBzdWJ0cmFjdGVkIDEgaXMgbm93CisJICBub3QgZXF1YWwgdG8gemVybyAod2hpY2ggaXQgYWx3YXlzIGlzKS4KKworMjAwNC0xMS0xMSAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyZWxlbWVudC5jOiAoZ3N0X3Y0bDJfaWZhY2Vfc3VwcG9ydGVkKToKKwlGaXggY29tcGlsYXRpb24gaWYgSEFWRV9YVklERU8gaXMgbm90IGRlZmluZWQKKworMjAwNC0xMS0xMSAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBzeXMvdjRsL2dzdHY0bGVsZW1lbnQuYzogKGdzdF92NGxfaWZhY2Vfc3VwcG9ydGVkKToKKwlGaXggY29tcGlsYXRpb24gaWYgSEFWRV9YVklERU8gaXMgbm90IGRlZmluZWQKKworMjAwNC0xMS0xMSAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnc3RfZ29vbV9jbGFzc19pbml0KSwgKGdzdF9nb29tX2luaXQpLAorCShnc3RfZ29vbV9kaXNwb3NlKSwgKGdzdF9nb29tX3Npbmtjb25uZWN0KSwgKGdzdF9nb29tX2NoYWluKSwKKwkoZ3N0X2dvb21fY2hhbmdlX3N0YXRlKSwgKHBsdWdpbl9pbml0KToKKwlVc2UgdGhlIGJ5dGVzdHJlYW0gYWRhcHRlciBzbyBnb29tIGRvZXNuJ3QgZGVwZW5kIG9uIHRoZSBpbnB1dAorCWJ1ZmZlciBzaXplLgorCUFkZCBhIGRlYnVnIGNhdGVnb3J5CisKKzIwMDQtMTEtMTEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX2NoYW5nZV9zdGF0ZSk6CisJICBPbmx5IHNldCBoYXJkd2FyZSBwYXJhbWV0ZXJzICphZnRlciogbmVnb3RpYXRpb24uIEJlZm9yZQorCSAgbmVnb3RpYXRpb24sIGl0IHdpbGwgc2V0IEFOWSBhbmQgdGhhdCBzZWVtcyB0byBjYXVzZSBjcmFzaGVzCisJICAoc2VlIGUuZy4gIzE1MTI4OCwgIzE1MzIyNykuCisKKzIwMDQtMTEtMTAgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2dldF90aW1lKToKKwkgIFRoaXMgc2VlbXMgdG8gYmUgYW50aXF1ZSBsZWZ0b3Zlci4gSXQgbmVlZHMgdG8gcGFzcyBlcnJvcgorCSAgY2hlY2tpbmcuCisJKiBleHQvc2RsL3NkbHZpZGVvc2luay5jOiAoZ3N0X3NkbHZpZGVvc2lua19pbml0KSwKKwkoZ3N0X3NkbHZpZGVvc2lua19kZWluaXRzZGwpLCAoZ3N0X3NkbHZpZGVvc2lua19pbml0c2RsKSwKKwkoZ3N0X3NkbHZpZGVvc2lua19kZXN0cm95KSwgKGdzdF9zZGx2aWRlb3NpbmtfY3JlYXRlKSwKKwkoZ3N0X3NkbHZpZGVvc2lua19zaW5rY29ubmVjdCksIChnc3Rfc2RsdmlkZW9zaW5rX2NoYWluKToKKwkgIEZpeCBHc3RYT3ZlcmxheSBpbXBsZW1lbnRhdGlvbiAoIzE1MTA1OSkuCisKKzIwMDQtMTEtMTAgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoZ3N0X3BsYXlfYmFzZV9iaW5fY2hhbmdlX3N0YXRlKToKKwkgIERvbid0IGFzc2VydCAoIzE1Nzg1MykuCisKKzIwMDQtMTEtMTAgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2NoZWNrX2V2ZW50KSwKKwkgIEZpeCBieXRlcy9zYW1wbGVzIGNvbmZ1c3Rpb24uCisJKGdzdF9hbHNhX3NpbmtfbW1hcCksIChnc3RfYWxzYV9zaW5rX2xvb3ApOgorCSAgRml4IGZvciB1bmRlcnJ1biAoIzE0NDM4OSkuCisKKzIwMDQtMTEtMDkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAobXAzX3R5cGVfZmluZCk6CisJICBEaXNhYmxlIGhhbGZ3YXktc2VlayBmb3IgcGVuZGluZyByZWxlYXNlIChzaW5jZSBpdCBuZWVkcyBhIG5ldworCSAgY29yZSByZWxlYXNlKS4KKworMjAwNC0xMS0wOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzoKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmg6CisJKiBzeXMvdjRsL3Y0bHNyY19jYWxscy5jOgorCSAgYWRkIGF1dG9wcm9iZS1mcHMgcHJvcGVydHkgc28gd2UgY2FuIHNlcGFyYXRlIGF1dG9wcm9iaW5nIHBhcnRzCisKKzIwMDQtMTEtMDkgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6CisJKiBzeXMvdjRsL3Y0bHNyY19jYWxscy5jOgorCWluaXRpYWxpc2UgZm91cmNjIHRvIGNhdGNoIHVuc2V0IGZvdXJjYydzLCBhbmQgZGVidWcKKworMjAwNC0xMS0wOSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9wbGF5YmFjay9SRUFETUU6CisJKiBnc3QvcGxheWJhY2svZ3N0ZGVjb2RlYmluLmM6IChjbG9zZV9wYWRfbGluayksICh0cnlfdG9fbGlua18xKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnc3RfcGxheV9iaW5faW5pdCksCisJKGdzdF9wbGF5X2Jpbl9kaXNwb3NlKSwgKGdzdF9wbGF5X2Jpbl9zZXRfcHJvcGVydHkpLAorCShyZW1vdmVfc2lua3MpLCAoc2V0dXBfc2lua3MpLCAoZ3N0X3BsYXlfYmluX2NoYW5nZV9zdGF0ZSksCisJKGdzdF9wbGF5X2Jpbl9nZXRfZXZlbnRfbWFza3MpLCAoZ3N0X3BsYXlfYmluX3NlbmRfZXZlbnQpLAorCShnc3RfcGxheV9iaW5fZ2V0X2Zvcm1hdHMpLCAoZ3N0X3BsYXlfYmluX2NvbnZlcnQpLAorCShnc3RfcGxheV9iaW5fZ2V0X3F1ZXJ5X3R5cGVzKSwgKGdzdF9wbGF5X2Jpbl9xdWVyeSk6CisJQ2xlYW51cHMgYW5kIHNvbWUgbW9yZSBkb2N1bWVudGF0aW9uLgorCisyMDA0LTExLTA5ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmM6IChnc3RfY2FjYXNpbmtfY2xhc3NfaW5pdCksCisJKGdzdF9jYWNhc2lua19pbml0KSwgKGdzdF9jYWNhc2lua19jaGFpbik6CisJKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5oOgorCUNhY2FzaW5rIGluaGVyaXRzIGZyb20gVmlkZW9TaW5rLCBzbyBsZXQgdGhhdCBzdG9yZSB0aGUgY2xvY2suCisKKzIwMDQtMTEtMDkgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcGxheWJhY2svUkVBRE1FOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChncm91cF9kZXN0cm95KSwgKGdyb3VwX2lzX211dGVkKSwKKwkoYWRkX3N0cmVhbSksICh1bmtub3duX3R5cGUpLCAoYWRkX2VsZW1lbnRfc3RyZWFtKSwgKG5vX21vcmVfcGFkcyksCisJKHByb2JlX3RyaWdnZXJlZCksIChwcmVyb2xsX3VubGlua2VkKSwgKG5ld19kZWNvZGVkX3BhZCksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2NoYW5nZV9zdGF0ZSksIChnc3RfcGxheV9iYXNlX2Jpbl9mb3VuZF90YWcpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdlbl92aXNfZWxlbWVudCksIChyZW1vdmVfc2lua3MpLAorCShzZXR1cF9zaW5rcyk6CisJKiBnc3QvcGxheWJhY2svZ3N0c3RyZWFtaW5mby5jOiAoZ3N0X3N0cmVhbV9pbmZvX3NldF9tdXRlKSwKKwkoZ3N0X3N0cmVhbV9pbmZvX2lzX211dGUpLCAoZ3N0X3N0cmVhbV9pbmZvX3NldF9wcm9wZXJ0eSk6CisJKiBnc3QvcGxheWJhY2svZ3N0c3RyZWFtaW5mby5oOgorCVVwZGF0ZWQgUkVBRE1FLgorCU9ubHkgc3dpdGNoIGdyb3VwcyBpZiBhbGwgc3RyZWFtcyBoYXZlIG11dGVkIChFT1NlZCkuCisJU2VuZCBUYWdzIGluIHN5bmMgd2l0aCB0aGUgc3RyZWFtIHBsYXliYWNrIGluc3RlYWQgb2YgaW4KKwl0aGUgcGxheWJhY2svcHJlcm9sbCBwaGFzZS4KKwlTb21lIGNsZWFudXBzLCBmcmVlIHRoZSBmYWtlc3JjIGVsZW1lbnRzLgorCisyMDA0LTExLTA5ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX2dldF9jYXBzX2ludGVybmFsKToKKwkgIGJ1ZmZlci1mcmFtZXMgcHJvcGVydHkgd2FzIG1pc3NpbmcKKwkqIGV4dC9hcnRzL2dzdF9hcnRzLmM6CisJICByYXRlIG1pc3NpbmcgZnJvbSBzaW5rY2FwcworCSogZXh0L2F1ZGlvZmlsZS9nc3RhZnBhcnNlLmM6CisJKiBleHQvYXVkaW9maWxlL2dzdGFmc2luay5jOgorCSogZXh0L2F1ZGlvZmlsZS9nc3RhZnNyYy5jOgorCSogZXh0L3N3ZmRlYy9nc3Rzd2ZkZWMuYzoKKwkgIGludCBhdWRpbyBkb2Vzbid0IGtub3cgYnVmZmVyLWZyYW1lcworCSogZXh0L2NkcGFyYW5vaWEvZ3N0Y2RwYXJhbm9pYS5jOgorCSAgaW50IGF1ZGlvIGRvZXNuJ3Qga25vdyBjaHVua3NpemUgZWl0aGVyCisJKiBleHQvbmFzL25hc3NpbmsuYzoKKwkgIGl0J3MgZW5kaWFubmVzcywgbm90IGVuZGlhbmVzcworCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL2F1ZGlvLmg6CisJICBtYWtlIGZsb2F0IHN0YW5kYXJkIHBhZCB0ZW1wbGF0ZSBjYXBzIHJlYWxseSBkZXNjcmliZSBmbG9hdAorCSogZ3N0L2xhdy9tdWxhdy5jOiAobGluZWFyX2ZhY3RvcnkpOgorCSAgc2lnbmVkIG9ubHksIHBsZWFzZQorCSogZ3N0L21wZWdzdHJlYW0vZ3N0ZHZkZGVtdXguYzoKKwkgIHdpZHRocyBvZiAyMCBhcmUgbm90IHZhbGlkCisKKzIwMDQtMTEtMDggIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwlTdWJtaXR0ZWQgYnk6IEx1Y2EgRmVycmV0dGkgPGVsbGUudWNhQGluZmluaXRvLml0PgorCisJKiBwby9MSU5HVUFTOgorCSogcG8vaXQucG86CisJICBBZGQgSXRhbGlhbgorCisyMDA0LTExLTA4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3BsYXliYWNrL1JFQURNRToKKwkqIGdzdC9wbGF5YmFjay9nc3RkZWNvZGViaW4uYzogKGNsb3NlX3BhZF9saW5rKSwgKHRyeV90b19saW5rXzEpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChwcm9iZV90cmlnZ2VyZWQpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9jaGFuZ2Vfc3RhdGUpOgorCVVwZGF0ZWQgUkVBRE1FLCBhZGRlZCBtb3JlIGNvbW1lbnRzIGZvciBmaXhtZXMgZXRjLi4KKworMjAwNC0xMS0wOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoZ3N0X3BsYXlfYmFzZV9iaW5fYWRkX2VsZW1lbnQpOgorCVdlIGNhbiByZW1vdmUgdGhpcyBoYWNrIG5vdy4KKworMjAwNC0xMS0wOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogKGdzdF92aWRlb21peGVyX2JsZW5kX2F5dXZfYXl1diksCisJKGdzdF92aWRlb21peGVyX2ZpbGxfY2hlY2tlciksIChnc3RfdmlkZW9taXhlcl9maWxsX2NvbG9yKSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfYmxlbmRfYnVmZmVycyksIChnc3RfdmlkZW9taXhlcl9sb29wKToKKwlPbmx5IG1peCBBWVVWIGZvciBtYXhpbXVtIHF1YWxpdHkuCisKKzIwMDQtMTEtMDggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdldF9yZWxhdGl2ZSksIChnc3Rfb2dnX2RlbXV4X3NyY19xdWVyeSksCisJKGdzdF9vZ2dfZGVtdXhfcHVzaCksIChnc3Rfb2dnX3BhZF9wdXNoKToKKwkgIExldCdzIGFjdCBhcyBpZiB3ZSdyZSBzeW5jaHJvbml6ZWQgbm93ISA6KS4KKwkqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6ICh0aGVvcmFfZGVjX2NoYWluKToKKwkgIEFkZCBzb21lIGRlYnVnLgorCisyMDA0LTExLTA4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6IChnc3RfYWxwaGFfbWV0aG9kX2dldF90eXBlKSwKKwkoZ3N0X2FscGhhX3NldF9wcm9wZXJ0eSksIChnc3RfYWxwaGFfc2lua19saW5rKSwKKwkoZ3N0X2FscGhhX3NldF9heXV2KSwgKGdzdF9hbHBoYV9zZXRfaTQyMCksCisJKGdzdF9hbHBoYV9jaHJvbWFfa2V5X2F5dXYpLCAoZ3N0X2FscGhhX2Nocm9tYV9rZXlfaTQyMCksCisJKGdzdF9hbHBoYV9pbml0X3BhcmFtcyksIChnc3RfYWxwaGFfY2hhaW4pOgorCUltcGxlbWVudCBhbHBoYSBmdW5jdGlvbnMgZm9yIEFZVVYgdG9vLCB0aGlzIGluY3JlYXNlcworCWFjY3VyYWN5IHF1aXRlIGEgYml0LgorCisyMDA0LTExLTA4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvYXZjb2RlYy5oOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29kZWNtYXAuYzoKKwkoZ3N0X2ZmbXBlZ19waXhmbXRfdG9fY2FwcyksIChnc3RfZmZtcGVnX2NhcHNfdG9fcGl4Zm10KSwKKwkoZ3N0X2ZmbXBlZ2NzcF9hdnBpY3R1cmVfZmlsbCk6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2xvcnNwYWNlLmM6CisJKGdzdF9mZm1wZWdjc3BfY2Fwc19yZW1vdmVfZm9ybWF0X2luZm8pOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvaW1nY29udmVydC5jOiAoYXZwaWN0dXJlX2dldF9zaXplKSwKKwkoc2hyaW5rMTIpLCAoaW1nX2dldF9hbHBoYV9pbmZvKSwgKGRlaW50ZXJsYWNlX2xpbmUpLAorCShkZWludGVybGFjZV9saW5lX2lucGxhY2UpOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvaW1nY29udmVydF90ZW1wbGF0ZS5oOgorCUFkZGVkIEFZVVYgY29sb3JzcGFjZSBhbmQgaGFuZGxlIFJHQkEgYSBiaXQgbW9yZSByZXNwZWN0ZnVsLgorCisyMDA0LTExLTA4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX3BhZF9wdXNoKToKKwkgIEFjdHVhbGx5IGFsd2F5cyBzZW5kIGEgZGlzY29udCAoY29ybmVyY2FzZSB3aGVuIHJlc2VuZGluZyB0aGUKKwkgIHNhbWUgc2VyaWFsLXRhZ2dlZCBjaGFpbiB0d2ljZSkuCisKKzIwMDQtMTEtMDggIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua194Y29udGV4dF9jbGVhciksCisJKGdzdF94aW1hZ2VzaW5rX2ZpbmFsaXplKToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfeGNvbnRleHRfY2xlYXIpLAorCShnc3RfeHZpbWFnZXNpbmtfZmluYWxpemUpOiBTb21lIG1vcmUgY2xlYW51cHMsIGxlYWtzIGZpeGVkIGFuZCBjaGVja3MuCisKKzIwMDQtMTEtMDggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKGFhY190eXBlX2ZpbmQpOgorCURvbid0IHNlZ2ZhdWx0IG9uIE5VTEwgZGF0YS4KKworMjAwNC0xMS0wOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RkZWNvZGViaW4uYzogKHVubGlua2VkKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5LW1hcnNoYWwubGlzdDoKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoZ3N0X3BsYXlfYmFzZV9iaW5fY2xhc3NfaW5pdCksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2luaXQpLCAoZ3JvdXBfY3JlYXRlKSwgKGdldF9hY3RpdmVfZ3JvdXApLAorCShnZXRfYnVpbGRpbmdfZ3JvdXApLCAoZ3JvdXBfZGVzdHJveSksIChncm91cF9jb21taXQpLAorCShxdWV1ZV9vdmVycnVuKSwgKHJlbW92ZV9ncm91cHMpLCAoYWRkX3N0cmVhbSksICh1bmtub3duX3R5cGUpLAorCShhZGRfZWxlbWVudF9zdHJlYW0pLCAobm9fbW9yZV9wYWRzKSwgKHByb2JlX3RyaWdnZXJlZCksCisJKHByZXJvbGxfdW5saW5rZWQpLCAobmV3X2RlY29kZWRfcGFkKSwgKHJlbW92ZWRfZGVjb2RlZF9wYWQpLAorCShzdGF0ZV9jaGFuZ2UpLCAoc2V0dXBfc291cmNlKSwgKGdzdF9wbGF5X2Jhc2VfYmluX2dldF9wcm9wZXJ0eSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2NoYW5nZV9zdGF0ZSksIChnc3RfcGxheV9iYXNlX2Jpbl9hZGRfZWxlbWVudCksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2xpbmtfc3RyZWFtKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fZ2V0X3N0cmVhbWluZm8pOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmg6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJpbi5jOiAoZ3N0X3BsYXlfYmluX2NsYXNzX2luaXQpLAorCShyZW1vdmVfc2lua3MpLCAoc2V0dXBfc2lua3MpLCAoZ3N0X3BsYXlfYmluX2NoYW5nZV9zdGF0ZSk6CisJQWRkIHN1cHBvcnQgZm9yIGNoYWluZWQgb2dnIGZpbGVzLiBQcmVwYXJlIGZvciBwbGF5bGlzdAorCXN1cHBvcnQuIFRoaXMgcGF0Y2ggaW50cm9kdWNlcyB0aGUgY29uY2VwdCBvZiBwYWQgZ3JvdXBzLCB3aGljaAorCXRvZ2V0aGVyIGNvbXBvc2Ugb25lIHBsYXlhYmxlIG1lZGlhIGZpbGUuCisKKzIwMDQtMTEtMDcgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogdGVzdHN1aXRlL2dzdC1saW50OiBDaGVjayBmb3IgcGFkIHRlbXBsYXRlcyB0aGF0IGFyZW4ndCBzdGF0aWNhbGx5CisJc2NvcGVkLgorCisyMDA0LTExLTA3ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvbXVzZXBhY2svTWFrZWZpbGUuYW06CisJKiBleHQvbXVzZXBhY2svZ3N0bXVzZXBhY2tkZWMuY3BwOgorCSogZXh0L211c2VwYWNrL2dzdG11c2VwYWNrZGVjLmg6CisJKiBleHQvbXVzZXBhY2svZ3N0bXVzZXBhY2tyZWFkZXIuY3BwOgorCSogZXh0L211c2VwYWNrL2dzdG11c2VwYWNrcmVhZGVyLmg6CisJICBBZGQgbXVzZXBhY2sgZGVjb2Rlci4KKwkqIGV4dC9mYWFkL2dzdGZhYWQuYzogKGdzdF9mYWFkX2Jhc2VfaW5pdCk6CisJICBNYWtlIHBhZCB0ZW1wbGF0ZXMgc3RhdGljLgorCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChtcDNfdHlwZV9maW5kKSwKKwkocGx1Z2luX2luaXQpOgorCSAgQWRkIG11c2VwYWNrIHR5cGVmaW5kZXIsIG1ha2UgbXAzIHR5cGVmaW5kaW5nIHdvcmsgaGFsZndheSBzdHJlYW0sCisJICB3aGljaCBkb2Vzbid0IGFjdHVhbGx5IHdvcmsgeWV0IGJlY2F1c2UgaWQzZGVtdXggZG9lc24ndCBpbXBsZW1lbnQKKwkgIF9nZXRfbGVuZ3RoKCkuCisKKzIwMDQtMTEtMDcgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnbXV4LmM6IChnc3Rfb2dnX211eF9uZXh0X2J1ZmZlciksCisJKGdzdF9vZ2dfbXV4X3F1ZXVlX3BhZHMpLCAoZ3N0X29nZ19tdXhfbG9vcCk6CisJICBGaXggaW50ZXJydXB0IGV2ZW50IGhhbmRsaW5nICgjMTQ0NDM2KS4KKworMjAwNC0xMS0wNyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX2RvX3R5cGVmaW5kKToKKwkgIEhpZGUgdW51c2VkIGdsb3J5LgorCisyMDA0LTExLTA2ICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dC5pLm1AemVuLmNvLnVrPgorCisJcmV2aWV3ZWQgYnk6IFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC92b3JiaXMvdm9yYmlzZW5jLmM6IChyYXdfY2Fwc19mYWN0b3J5KToKKwkgIEZpeCB3ZWlyZCBjYXBzICgjMTU3NTQ4KS4KKworMjAwNC0xMS0wNiAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHQuaS5tQHplbi5jby51az4KKworCVJldmlld2VkIGJ5OiBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBhcnNlLmM6IChnc3RfcnRwZ3NtX2NhcHNfbmVnbyk6CisJICBBZGQgbWlzc2luZyBOVUxMIHRlcm1pbmF0b3IgKCMxNTc1NDMpLgorCisyMDA0LTExLTA1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvdGNwL2dzdHRjcC5oOgorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzaW5rLmM6CisJKiBnc3QvdGNwL2dzdHRjcGNsaWVudHNyYy5jOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzaW5rLmM6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNyYy5jOgorCSAgcG9ydHMgY2FuIGdvIHVwIHRvIDY1NTM1LiAgTW92ZSBjb21tb24gZGVmaW5lcyB0byBnc3R0Y3AuaAorCisyMDA0LTExLTA1ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3ZpZGVvdGVzdHNyYy92aWRlb3Rlc3RzcmMuYzogKHBhaW50X3NldHVwX1k0MUIpLAorCShwYWludF9obGluZV9ZNDFCKSwgKHBhaW50X3NldHVwX1k0MkIpLCAocGFpbnRfaGxpbmVfWTQyQik6CisJQWRkZWQgdHdvIG1vcmUgY29sb3JzcGFjZXMuCisKKzIwMDQtMTEtMDUgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2RlY21hcC5jOgorCShnc3RfZmZtcGVnY3NwX2F2cGljdHVyZV9maWxsKToKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2ltZ2NvbnZlcnQuYzogKGF2cGljdHVyZV9nZXRfc2l6ZSksCisJKHl1djQyMnBfdG9feXV2NDIyKSwgKHl1djQyMHBfdG9feXV2NDIyKSwgKHNocmluazEyKSwKKwkoaW1nX2NvbnZlcnQpLCAoZGVpbnRlcmxhY2VfbGluZSksIChkZWludGVybGFjZV9saW5lX2lucGxhY2UpOgorCU1vcmUgc3RyaWRlIGZpeGVzLgorCisyMDA0LTExLTA1ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6IChnc3RfYWxwaGFfc2V0X3Byb3BlcnR5KSwgKGdzdF9hbHBoYV9hZGQpLAorCShnc3RfYWxwaGFfY2hyb21hX2tleSksIChnc3RfYWxwaGFfaW5pdF9wYXJhbXMpLCAoZ3N0X2FscGhhX2NoYWluKToKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogKGdzdF92aWRlb21peGVyX2JsZW5kX2F5dXZfaTQyMCksCisJKGdzdF92aWRlb21peGVyX2ZpbGxfY2hlY2tlciksIChnc3RfdmlkZW9taXhlcl9ibGVuZF9idWZmZXJzKSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfbG9vcCk6CisJTW9yZSBzdHJpZGUgZml4ZXMuCisKKzIwMDQtMTEtMDUgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfY2hhaW4pOgorCSAgZG9uJ3Qgb3ZlcmZsb3cgZGF0YSBidWZmZXIuIEZsdXNoIG5vdCBuZWVkZWQgc3luYyBkYXRhIHdoZW4gc3luY2luZworCSAgZmFpbGVkLgorCisyMDA0LTExLTA0ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6IChnc3RfYWxwaGFfbWV0aG9kX2dldF90eXBlKSwKKwkoZ3N0X2FscGhhX2NsYXNzX2luaXQpLCAoZ3N0X2FscGhhX2luaXQpLCAoZ3N0X2FscGhhX3NldF9wcm9wZXJ0eSksCisJKGdzdF9hbHBoYV9nZXRfcHJvcGVydHkpLCAoZ3N0X2FscGhhX2FkZCksIChnc3RfYWxwaGFfY2hyb21hX2tleSksCisJKGdzdF9hbHBoYV9pbml0X3BhcmFtcyksIChnc3RfYWxwaGFfY2hhaW4pLAorCShnc3RfYWxwaGFfY2hhbmdlX3N0YXRlKToKKwlVcGRhdGVkIHRoZSBjaHJvbWEga2V5aW5nIGFsZ29yaXRobSB3aXRoIHNvbWV0aGluZyBtb3JlCisJc29waGlzdGljYXRlZC4KKworMjAwNC0xMS0wMyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogKGdzdF92aWRlb21peGVyX2JsZW5kX2F5dXZfaTQyMCksCisJKGdzdF92aWRlb21peGVyX2ZpbGxfY2hlY2tlciksIChnc3RfdmlkZW9taXhlcl9maWxsX2NvbG9yKSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfYmxlbmRfYnVmZmVycyksIChnc3RfdmlkZW9taXhlcl9sb29wKToKKwlGaXggc3RyaWRlIGlzc3Vlcy4gRG9lcyBub3QgY29tcGxldGVseSB3b3JrIGZvciBvZGQKKwloZWlnaHRzLgorCisyMDA0LTExLTAzICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6IChnc3RfYWxwaGFfbWV0aG9kX2dldF90eXBlKSwKKwkoZ3N0X2FscGhhX2Nocm9tYV9rZXkpLCAoZ3N0X2FscGhhX2NoYWluKToKKwlGaXggc3RyaWRlIGlzc3Vlcy4gRG9lcyBub3QgY29tcGxldGVseSB3b3JrIGZvciBvZGQKKwloZWlnaHRzLgorCisyMDA0LTExLTAzICBDaHJpc3RvcGhlIEZlcmdlYXUgIDx0ZXVmQGdub21lLm9yZz4KKworCSogZ3N0L3ZpZGVvc2NhbGUvZ3N0dmlkZW9zY2FsZS5jOiAoZ3N0X3ZpZGVvc2NhbGVfZ2V0Y2Fwcyk6CisJKiBnc3QvdmlkZW9zY2FsZS92aWRlb3NjYWxlLmM6ICh2aWRlb3NjYWxlX2ZpbmRfYnlfc3RydWN0dXJlKToKKwlsZWFrIGZpeGVzCisKKzIwMDQtMTEtMDMgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2RlY21hcC5jOgorCShnc3RfZmZtcGVnY3NwX2F2cGljdHVyZV9maWxsKToKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2ltZ2NvbnZlcnQuYzogKGF2cGljdHVyZV9nZXRfc2l6ZSksCisJKGF2cGljdHVyZV9hbGxvYyk6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9pbWdjb252ZXJ0X3RlbXBsYXRlLmg6CisJVXNlIGNvcnJlY3QgX2ZpbGwgZnVuY3Rpb24gdG8gZ2V0IGNvcnJlY3Qgc3RyaWRlcy4KKworMjAwNC0xMS0wMiAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX2hlYWRlciksCisJKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pLCAocXRkZW11eF9wYXJzZSksIChxdGRlbXV4X3BhcnNlX3RyZWUpLAorCShxdGRlbXV4X3BhcnNlX3VkdGEpLCAocXRkZW11eF90YWdfYWRkKSwgKGdzdF9xdGRlbXV4X2hhbmRsZV9lc2RzKToKKwlDaGFuZ2UgYWxsIGdfcHJpbnQoKXMgdG8gZGVidWdnaW5nLiAgQWRkIGEgYnVuY2ggb2YgY29uc2lzdGVuY3kKKwljaGVja3MuCisKKzIwMDQtMTEtMDIgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcGxheWJhY2svZ3N0ZGVjb2RlYmluLmM6IChnc3RfZGVjb2RlX2Jpbl9jbGFzc19pbml0KSwKKwkodHJ5X3RvX2xpbmtfMSksIChnZXRfb3VyX2dob3N0X3BhZCksIChyZW1vdmVfZWxlbWVudF9jaGFpbiksCisJKHVubGlua2VkKSwgKG5vX21vcmVfcGFkcyksIChjbG9zZV9saW5rKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoZ3N0X3BsYXlfYmFzZV9iaW5faW5pdCksCisJKHVua25vd25fdHlwZSksIChhZGRfZWxlbWVudF9zdHJlYW0pLCAobmV3X2RlY29kZWRfcGFkKSwKKwkocmVtb3ZlZF9kZWNvZGVkX3BhZCksIChzZXR1cF9zb3VyY2UpOgorCSogZ3N0L3BsYXliYWNrL2dzdHN0cmVhbWluZm8uYzogKGdzdF9zdHJlYW1faW5mb19nZXRfdHlwZSksCisJKGdzdF9zdHJlYW1faW5mb19jbGFzc19pbml0KSwgKGdzdF9zdHJlYW1faW5mb19pbml0KSwKKwkoZ3N0X3N0cmVhbV9pbmZvX25ldyksIChnc3Rfc3RyZWFtX2luZm9fZGlzcG9zZSksCisJKHN0cmVhbV9pbmZvX211dGVfcGFkKSwgKGdzdF9zdHJlYW1faW5mb19zZXRfcHJvcGVydHkpLAorCShnc3Rfc3RyZWFtX2luZm9fZ2V0X3Byb3BlcnR5KToKKwkqIGdzdC9wbGF5YmFjay9nc3RzdHJlYW1pbmZvLmg6CisJRml4IHBsYXliYWNrIG9mIG11bHRpcGxlIGZpbGVzLgorCWEgc2xpZ2h0bHkgZGlmZmVyZW50IGFwcHJvYWNoIHRvIGhhbmRsaW5nIGR5bmFtaWMgcGFkIHJlbW92YWxzLgorCVRoaXMgb25lIG9ubHkgbG9va3MgYXQgcGFkcyB0aGF0IHdlIGhhdmUgbGlua2VkLgorCisyMDA0LTExLTAxICBDaHJpc3RvcGhlIEZlcmdlYXUgIDx0ZXVmQGdub21lLm9yZz4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9maW5hbGl6ZSk6IGZpeCBhbiAiaW52YWxpZAorCWZyZWUiIHdhcm5pbmcgZnJvbSBsaWJjLgorCisyMDA0LTExLTAxICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0ZGVjb2RlYmluLmM6IChnc3RfZGVjb2RlX2Jpbl9jbGFzc19pbml0KSwKKwkoZ2V0X3VuY29ubmVjdGVkX2VsZW1lbnQpLCAocmVtb3ZlX3N0YXJ0aW5nX2Zyb20pLCAocGFkX3JlbW92ZWQpLAorCShjbG9zZV9saW5rKToKKwkgIEltcGxlbWVudCBzdXBwb3J0IGZvciBkeW5hbWljIHBhZCBjaGFuZ2luZy4gV2UgbGlzdGVuIHRvICJsaXZlIgorCSAgcGFkIHJlbW92YWxzIChpLmUuIHdoaWxlIHBsYXlpbmcpIGFuZCByZS1zZXR1cCBhdXRvcGx1Z2dpbmcKKwkgIGFmdGVyIHRoYXQuIFBsYXliYXNlYmluL3BsYXliaW4gbmVlZCBzb21lIG1vcmUgd29yayBmb3IgdGhpcworCSAgdG8gZmluYWxseSB3b3JrLCBidXQgZGVjb2RlYmluIHN1cHBvcnRzIChhbmQgcmVwbHVncykgY2hhaW5lZAorCSAgb2dnIG5vdy4KKworMjAwNC0xMS0wMiAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9jbGFzc19pbml0KSwgKGdzdF9hbHNhX2Rpc3Bvc2UpLAorCShnc3RfYWxzYV9maW5hbGl6ZSk6CisJKiBleHQvY2RhdWRpby9nc3RjZGF1ZGlvLmM6IChnc3RfY2RhdWRpb19jbGFzc19pbml0KSwKKwkoZ3N0X2NkYXVkaW9fZmluYWxpemUpOgorCSogZXh0L2NkcGFyYW5vaWEvZ3N0Y2RwYXJhbm9pYS5jOiAoY2RwYXJhbm9pYV9jbGFzc19pbml0KSwKKwkoY2RwYXJhbm9pYV9maW5hbGl6ZSk6CisJKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmM6IChnc3RfZGl2eGRlY19kaXNwb3NlKToKKwkqIGV4dC9kaXZ4L2dzdGRpdnhlbmMuYzogKGdzdF9kaXZ4ZW5jX2Rpc3Bvc2UpOgorCSogZXh0L2R2ZHJlYWQvZHZkcmVhZHNyYy5jOiAoZHZkcmVhZHNyY19jbGFzc19pbml0KSwKKwkoZHZkcmVhZHNyY19maW5hbGl6ZSk6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY2RlY19jbGFzc19pbml0KSwKKwkoZ3N0X2ZsYWNkZWNfZmluYWxpemUpOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOiAoZ3N0X2ZsYWNlbmNfY2xhc3NfaW5pdCksCisJKGdzdF9mbGFjZW5jX2ZpbmFsaXplKToKKwkqIGV4dC9nbm9tZXZmcy9nc3Rnbm9tZXZmc3NpbmsuYzogKGdzdF9nbm9tZXZmc3NpbmtfY2xhc3NfaW5pdCksCisJKGdzdF9nbm9tZXZmc3NpbmtfZmluYWxpemUpOgorCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzc3JjLmM6IChnc3RfZ25vbWV2ZnNzcmNfY2xhc3NfaW5pdCksCisJKGdzdF9nbm9tZXZmc3NyY19maW5hbGl6ZSk6CisJKiBleHQvbGliZmFtZS9nc3RsaWJmYW1lLmM6IChnc3RfZmFtZWVuY19jbGFzc19pbml0KSwKKwkoZ3N0X2ZhbWVlbmNfZmluYWxpemUpOgorCSogZXh0L25hcy9uYXNzaW5rLmM6IChnc3RfbmFzc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X25hc3NpbmtfZmluYWxpemUpOgorCSogZXh0L3NkbC9zZGx2aWRlb3NpbmsuYzogKGdzdF9zZGx2aWRlb3NpbmtfZmluYWxpemUpLAorCShnc3Rfc2RsdmlkZW9zaW5rX2NsYXNzX2luaXQpOgorCSogZXh0L3NuZGZpbGUvZ3N0c2YuYzogKGdzdF9zZl9kaXNwb3NlKToKKwkqIGdzdC1saWJzL2dzdC9taXhlci9taXhlcnRyYWNrLmM6IChnc3RfbWl4ZXJfdHJhY2tfZGlzcG9zZSk6CisJKiBnc3QtbGlicy9nc3QvdHVuZXIvdHVuZXJjaGFubmVsLmM6IChnc3RfdHVuZXJfY2hhbm5lbF9kaXNwb3NlKToKKwkqIGdzdC1saWJzL2dzdC90dW5lci90dW5lcm5vcm0uYzogKGdzdF90dW5lcl9ub3JtX2Rpc3Bvc2UpOgorCSogZ3N0LWxpYnMvZ3N0L3h3aW5kb3dsaXN0ZW5lci94d2luZG93bGlzdGVuZXIuYzoKKwkoZ3N0X3hfd2luZG93X2xpc3RlbmVyX2Rpc3Bvc2UpOgorCSogZ3N0L2F1ZGlvc2NhbGUvZ3N0YXVkaW9zY2FsZS5jOgorCSogZ3N0L3BsYXlvbmRlbWFuZC9nc3RwbGF5b25kZW1hbmQuYzogKHBsYXlfb25fZGVtYW5kX2NsYXNzX2luaXQpLAorCShwbGF5X29uX2RlbWFuZF9maW5hbGl6ZSk6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6IChnc3RfdmlkZW9iYWxhbmNlX2Rpc3Bvc2UpOgorCSogZ3N0L3ZpZGVvc2NhbGUvZ3N0dmlkZW9zY2FsZS5jOiAoZ3N0X3ZpZGVvc2NhbGVfY2hhaW4pOgorCSogc3lzL2Nkcm9tL2dzdGNkcGxheWVyLmM6IChjZHBsYXllcl9jbGFzc19pbml0KSwKKwkoY2RwbGF5ZXJfZmluYWxpemUpOgorCSogc3lzL2dsc2luay9nbGltYWdlc2luay5jOiAoZ3N0X2dsaW1hZ2VzaW5rX2ZpbmFsaXplKSwKKwkoZ3N0X2dsaW1hZ2VzaW5rX2NsYXNzX2luaXQpOgorCSogc3lzL29zcy9nc3Rvc3NlbGVtZW50LmM6IChnc3Rfb3NzZWxlbWVudF9jbGFzc19pbml0KSwKKwkoZ3N0X29zc2VsZW1lbnRfZmluYWxpemUpOgorCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IChnc3Rfb3Nzc2lua19kaXNwb3NlKToKKwkqIHN5cy9vc3MvZ3N0b3Nzc3JjLmM6IChnc3Rfb3Nzc3JjX2Rpc3Bvc2UpOgorCSogc3lzL3Y0bC9nc3R2NGxlbGVtZW50LmM6IChnc3RfdjRsZWxlbWVudF9kaXNwb3NlKToKKwkgIEZpeGVzIGEgYnVuY2ggb2YgcHJvYmxlbXMgd2l0aCBmaW5hbGl6ZSBhbmQgZGlzcG9zZSBmdW5jdGlvbnMsCisJICBlaXRoZXIgYXNzdW1wdGlvbnMgdGhhdCBkaXNwb3NlIGlzIG9ubHkgY2FsbGVkIG9uY2UsIG9yIG5vdCBjYWxsaW5nCisJICB0aGUgcGFyZW50IGNsYXNzIGRpc3Bvc2UvZmluYWxpemUgZnVuY3Rpb24KKworMjAwNC0xMS0wMSAgU3RlZmFuIEtvc3QgIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2VzZC9lc2RzaW5rLmM6IChnc3RfZXNkc2lua19pbml0KSwgKGdzdF9lc2RzaW5rX2xpbmspOgorCSAgYWRkZWQgdHdvIGFwaSBwcmVjb25kaXRpb24gZ3VhcmRzCisJICB1c2UgZ19zdHJkdXAgd2l0aCBnZXRlbnYgdG8gZml4IGNyYXNoIHdoZW4gdXNpbmcgRU5WVkFSCisKKzIwMDQtMTEtMDEgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKwkqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfY2xhc3NfaW5pdCksCisJKGdzdF9lc2RzaW5rX2ZpbmFsaXplKToKKwlVc2UgYSBmaW5hbGl6ZSBmdW5jdGlvbiwgbm90IGRpc3Bvc2UsIGFuZCBtb3JlIGltcG9ydGFudGx5LAorCWNhbGwgdGhlIHBhcmVudCBjbGFzcyBmaW5hbGl6ZSBmdW5jdGlvbiB0b28KKworMjAwNC0xMS0wMSAgSm9oYW4gRGFobGluICA8am9oYW5AZ25vbWUub3JnPgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6CisJKiBnc3QvdGFncy9nc3R2b3JiaXN0YWcuYzoKKwlQbHVnIGxlYWtzLgorCisyMDA0LTEwLTMxICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC90YWdzL2dzdHZvcmJpc3RhZy5jOiAoZ3N0X3ZvcmJpc190YWdfY2hhaW4pOgorCSAgbG90c2EgbWVtbGVha3MgdG9kYXkuIEJ1dCB0aGV5J3JlIGFsbCBzbWFsbC4uLgorCisyMDA0LTEwLTMxICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfcGFkX3B1c2gpOgorCSAgYW5vdGhlciBtZW1sZWFrIGNydXNoZWQKKworMjAwNC0xMC0zMSAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvdGFncy9nc3R2b3JiaXN0YWcuYzogKGdzdF90YWdfdG9fdm9yYmlzX2NvbW1lbnRzKToKKwkgIGZpeCBtZW1sZWFrCisKKzIwMDQtMTAtMzEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfcGFkX3B1c2gpOgorCSAgSGFjayB0byBwcmV2ZW50IGNyYXNoIHdoZW4gZ29pbmcgdG8gUkVBRFkgaW5zaWRlIHNpZ25hbCBoYW5kbGVyCisJICB3aGlsZSB0aGlzIGZ1bmN0aW9uIGlzIGFjdGl2ZS4KKworMjAwNC0xMC0zMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvTWFrZWZpbGUuYW06CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9hdmNvZGVjLmg6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9jb21tb24uaDoKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2RzcHV0aWwuYzogKGRzcHV0aWxfc3RhdGljX2luaXQpOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZHNwdXRpbC5oOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnLmM6IChwbHVnaW5faW5pdCk6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2RlY21hcC5jOgorCShnc3RfZmZtcGVnX2dldF9wYWxldHRlKSwgKGdzdF9mZm1wZWdfc2V0X3BhbGV0dGUpLAorCShnc3RfZmZtcGVnX3BpeGZtdF90b19jYXBzKSwgKGdzdF9mZm1wZWdfc21wZm10X3RvX2NhcHMpLAorCShnc3RfZmZtcGVnY3NwX2NvZGVjdHlwZV90b19jYXBzKSwgKGdzdF9mZm1wZWdfY2Fwc190b19zbXBmbXQpLAorCShnc3RfZmZtcGVnX2NhcHNfdG9fcGl4Zm10KSwgKGdzdF9mZm1wZWdjc3BfY2Fwc193aXRoX2NvZGVjdHlwZSksCisJKGdzdF9mZm1wZWdjc3BfYXZwaWN0dXJlX2ZpbGwpOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29kZWNtYXAuaDoKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvbG9yc3BhY2UuYzoKKwkoZ3N0X2ZmbXBlZ2NzcF9jYXBzX3JlbW92ZV9mb3JtYXRfaW5mbyksIChnc3RfZmZtcGVnY3NwX2dldGNhcHMpLAorCShnc3RfZmZtcGVnY3NwX3BhZF9saW5rKSwgKGdzdF9mZm1wZWdjc3BfZ2V0X3R5cGUpLAorCShnc3RfZmZtcGVnY3NwX2Jhc2VfaW5pdCksIChnc3RfZmZtcGVnY3NwX2NsYXNzX2luaXQpLAorCShnc3RfZmZtcGVnY3NwX2luaXQpLCAoZ3N0X2ZmbXBlZ2NzcF9jaGFpbiksCisJKGdzdF9mZm1wZWdjc3BfY2hhbmdlX3N0YXRlKSwgKGdzdF9mZm1wZWdjc3Bfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X2ZmbXBlZ2NzcF9nZXRfcHJvcGVydHkpLCAoZ3N0X2ZmbXBlZ2NvbG9yc3BhY2VfcmVnaXN0ZXIpOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvaW1nY29udmVydC5jOgorCShhdmNvZGVjX2dldF9jaHJvbWFfc3ViX3NhbXBsZSksIChhdmNvZGVjX2dldF9waXhfZm10X25hbWUpLAorCShhdmNvZGVjX2dldF9waXhfZm10KSwgKGF2cGljdHVyZV9maWxsKSwgKGF2cGljdHVyZV9sYXlvdXQpLAorCShhdnBpY3R1cmVfZ2V0X3NpemUpLCAoYXZjb2RlY19nZXRfcGl4X2ZtdF9sb3NzKSwKKwkoYXZnX2JpdHNfcGVyX3BpeGVsKSwgKGF2Y29kZWNfZmluZF9iZXN0X3BpeF9mbXQxKSwKKwkoYXZjb2RlY19maW5kX2Jlc3RfcGl4X2ZtdCksIChpbWdfY29weV9wbGFuZSksIChpbWdfY29weSksCisJKHl1djQyMl90b195dXY0MjBwKSwgKHV5dnk0MjJfdG9feXV2NDIwcCksICh1eXZ5NDIyX3RvX3l1djQyMnApLAorCSh5dXY0MjJfdG9feXV2NDIycCksICh5dXY0MjJwX3RvX3l1djQyMiksICh5dXY0MjJwX3RvX3V5dnk0MjIpLAorCSh1eXZ5NDExX3RvX3l1djQxMXApLCAoeXV2NDIwcF90b195dXY0MjIpLCAoQ19KUEVHX1RPX0NDSVIpLAorCShpbWdfY29udmVydF9pbml0KSwgKGltZ19hcHBseV90YWJsZSksIChzaHJpbms0MSksIChzaHJpbmsyMSksCisJKHNocmluazEyKSwgKHNocmluazIyKSwgKHNocmluazQ0KSwgKGdyb3cyMV9saW5lKSwgKGdyb3c0MV9saW5lKSwKKwkoZ3JvdzIxKSwgKGdyb3cyMiksIChncm93NDEpLCAoZ3JvdzQ0KSwgKGNvbnY0MTEpLAorCShnaWZfY2x1dF9pbmRleCksIChidWlsZF9yZ2JfcGFsZXR0ZSksIChiaXRjb3B5X24pLCAobW9ub190b19ncmF5KSwKKwkobW9ub3doaXRlX3RvX2dyYXkpLCAobW9ub2JsYWNrX3RvX2dyYXkpLCAoZ3JheV90b19tb25vKSwKKwkoZ3JheV90b19tb25vd2hpdGUpLCAoZ3JheV90b19tb25vYmxhY2spLCAoYXZwaWN0dXJlX2FsbG9jKSwKKwkoYXZwaWN0dXJlX2ZyZWUpLCAoaXNfeXV2X3BsYW5hciksIChpbWdfY29udmVydCksCisJKGdldF9hbHBoYV9pbmZvX3BhbDgpLCAoaW1nX2dldF9hbHBoYV9pbmZvKSwgKGRlaW50ZXJsYWNlX2xpbmUpLAorCShkZWludGVybGFjZV9saW5lX2lucGxhY2UpLCAoZGVpbnRlcmxhY2VfYm90dG9tX2ZpZWxkKSwKKwkoZGVpbnRlcmxhY2VfYm90dG9tX2ZpZWxkX2lucGxhY2UpLCAoYXZwaWN0dXJlX2RlaW50ZXJsYWNlKToKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2ltZ2NvbnZlcnRfdGVtcGxhdGUuaDoKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL21lbS5jOiAoYXZfbWFsbG9jKSwgKGF2X3JlYWxsb2MpLCAoYXZfZnJlZSk6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9tbXguaDoKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL3V0aWxzLmM6IChhdl9tYWxsb2N6KSwgKGF2X3N0cmR1cCksCisJKGF2X2Zhc3RfcmVhbGxvYyksIChhdl9tYWxsb2N6X3N0YXRpYyksIChhdl9mcmVlX3N0YXRpYyksCisJKGF2X2ZyZWVwKSwgKGF2Y29kZWNfZ2V0X2NvbnRleHRfZGVmYXVsdHMpLAorCShhdmNvZGVjX2FsbG9jX2NvbnRleHQpLCAoYXZjb2RlY19pbml0KToKKwkgIFN5bmMgYmFjayBmcm9tIGdzdC1mZm1wZWcuIERlcHJlY2F0ZXMgZmZjb2xvcnNwYWNlLiBBZGRzIHBhbGV0dGUKKwkgIGhhbmRsaW5nIHBsdXMgdXBkYXRlIGZyb20gZmZtcGVnIENWUy4gTGFyZ2UgY2xlYW4tdXAuCisKKzIwMDQtMTAtMzEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9NYWtlZmlsZS5hbToKKwkgIFdlIG5lZWQgdGhlIG1hcnNoYWxsZXJzIGZvciBkZWNvZGViaW4sIHRvby4KKworMjAwNC0xMC0zMCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKHF0X3R5cGVfZmluZCk6IE1ha2UKKwkgIHF1aWNrdGltZSB0eXBlZmluZGluZyB3b3JrIHdpdGggNjQtYml0IG9mZnNldHMuCisKKzIwMDQtMTAtMzAgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6IChnc3RfZHZkZWNfaGFuZGxlX3NpbmtfZXZlbnQpOgorCSAgU2V0IEVPUyBvbiB0aGUgZWxlbWVudCB3aGVuIHByb2Nlc3NpbmcgYW4gRU9TIGV2ZW50LgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmg6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuaDoKKwkgIE9ubHkga2VlcCBhIGNvbnN0IHB0ciB0byB0aGUgbW9kZQorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOgorCShnc3RfcmlmZl9jcmVhdGVfYXVkaW9fY2Fwc193aXRoX2RhdGEpLAorCShnc3RfcmlmZl9jcmVhdGVfYXVkaW9fdGVtcGxhdGVfY2Fwcyk6CisJICBBbGxvdyBXTUFWMywgd2l0aCB1cCB0byA2IGNoYW5uZWxzLgorCSogZ3N0L2FzZmRlbXV4L2dzdGFzZm11eC5jOiAoZ3N0X2FzZm11eF9yZXF1ZXN0X25ld19wYWQpOgorCSAgRG9uJ3QgY2FsbCBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiBvbiBhIHNpbmsgcGFkLgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0ZHZkZGVtdXguYzoKKwkoZ3N0X2R2ZF9kZW11eF9nZXRfc3VicGljdHVyZV9zdHJlYW0pLAorCShnc3RfZHZkX2RlbXV4X3NldF9jdXJfYXVkaW8pLCAoZ3N0X2R2ZF9kZW11eF9zZXRfY3VyX3N1YnBpY3R1cmUpOgorCSAgQ29weSB0aGUgZXhwbGljaXQgY2FwcyB0aGF0IHdlcmUgc2V0IGFjcm9zcyB0byB0aGUgY3VyXyogcGFkcywKKwkgIGluc3RlYWQgb2YgdHJ5aW5nIHRvIHVzZSBhIHBvc3NpYmx5IG5vbi1leGlzdGVudCBuZWdvdGlhdGVkIGNhcHMuCisJICBSZXNldCB0aGUgdHlwZSBvZiBzdWJwaWN0dXJlIHBhZHMgdG8gVU5LTk9XTiBhZnRlciBjYWxsaW5nCisJICBpbml0X3N0cmVhbSwgc28gdGhhdCB0aGUgY2FwcyBnZXQgc2V0LgorCisyMDA0LTEwLTI5ICBNYXJ0aW4gUGl0dCAgPG1hcnRpbi5waXR0QGNhbm9uaWNhbC5jb20+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOiAoZ3N0X2FzZl9kZW11eF9wcm9jZXNzX2NodW5rKToKKwkgIERvbid0IHRvdWNoIGJ1ZmZlciBpZiBpdCBpcyBvZiBzaXplIDAgKGZpeGVzICMxNTEwNjQpLgorCisyMDA0LTEwLTI5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2RlbXV4X3B1c2gpLCAoZ3N0X29nZ19wYWRfcHVzaCk6CisJICBTeW5jaHJvbml6ZWQgZGlzY29udCBoYW5kbGluZy4KKworMjAwNC0xMC0yOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9zcmNfZXZlbnQpLAorCShnc3Rfb2dnX2RlbXV4X3B1c2gpOgorCSAgTWFrZSBzZWVraW5nIHNvcnQtb2YgZXhhY3QgYWdhaW4gKGZpeGVzICMxNTYzODcpLgorCisyMDA0LTEwLTI5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKHVua25vd25fdHlwZSksCisJKGFkZF9lbGVtZW50X3N0cmVhbSksIChuZXdfZGVjb2RlZF9wYWQpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L3BsYXliYWNrL2dzdHN0cmVhbWluZm8uYzogKGdzdF9zdHJlYW1faW5mb19jbGFzc19pbml0KSwKKwkoZ3N0X3N0cmVhbV9pbmZvX2luaXQpLCAoZ3N0X3N0cmVhbV9pbmZvX25ldyksCisJKGdzdF9zdHJlYW1faW5mb19kaXNwb3NlKSwgKGdzdF9zdHJlYW1faW5mb19nZXRfcHJvcGVydHkpOgorCSogZ3N0L3BsYXliYWNrL2dzdHN0cmVhbWluZm8uaDoKKwkgIE1ha2UgY2FwcyBleHBsaWNpdGVseSBhdmFpbGFibGUuIE1ha2VzIHRlc3RpbmcgZm9yIHVuc3VwcG9ydGVkCisJICB0eXBlcyBwb3NzaWJsZS4gSW1wcm92ZXMgZXJyb3IgcmVwb3J0aW5nLgorCisyMDA0LTEwLTI5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOgorCShnc3RfYXVkaW9fY29udmVydF9idWZmZXJfdG9fZGVmYXVsdF9mb3JtYXQpOgorCSAgUmVhbGx5IGRvbid0IHRvdWNoIHJlYWQtb25seSBidWZmZXJzICgjMTU2NTYzKS4KKworMjAwNC0xMC0yOSAgU2ViYXN0aWVuIENvdGUgIDxzYzVAaGVybWVzLnVzaGVyYi5jYT4KKworCVJldmlld2QgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9mbXQpOgorCSAgRml4IG1lbWxlYWsgKCMxNTUyMjMpLgorCisyMDA0LTEwLTI5ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3RjcC8uY3ZzaWdub3JlOgorCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5jOiAoZ3N0X3N5bmNfbWV0aG9kX2dldF90eXBlKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsYXNzX2luaXQpLCAoZ3N0X211bHRpZmRzaW5rX2luaXQpLAorCShnc3RfbXVsdGlmZHNpbmtfYWRkKSwgKGdzdF9tdWx0aWZkc2lua19yZW1vdmUpLAorCShnc3RfbXVsdGlmZHNpbmtfcmVtb3ZlX2NsaWVudF9saW5rKSwgKGlzX3N5bmNfZnJhbWUpLAorCShnc3RfbXVsdGlmZHNpbmtfbmV3X2NsaWVudCksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50X3dyaXRlKSwKKwkoZ3N0X211bHRpZmRzaW5rX3JlY292ZXJfY2xpZW50KSwgKGdzdF9tdWx0aWZkc2lua19xdWV1ZV9idWZmZXIpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudHMpLCAoZ3N0X211bHRpZmRzaW5rX3NldF9wcm9wZXJ0eSksCisJKGdzdF9tdWx0aWZkc2lua19nZXRfcHJvcGVydHkpOgorCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5oOgorCUFkZGVkIGJ1cnN0IG9uIGNvbm5lY3Qgc3luY19tZXRob2QsIGRlcHJlY2F0ZWQgc3luY19jbGllbnRzLAorCXN0cmVhbWxpbmVkIHRoZSBzeW5jIGNvZGUgc29tZSBtb3JlLgorCisyMDA0LTEwLTI5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKHRocmVhZF9lcnJvciksIChzZXR1cF9zb3VyY2UpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9jaGFuZ2Vfc3RhdGUpOgorCSAgSW1wcm92ZSBlcnJvciByZXBvcnRpbmcuCisKKzIwMDQtMTAtMjggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL01ha2VmaWxlLmFtOgorCSogZ3N0L3RjcC9mZHNldHN0cmVzcy5jOiAobWVzc19zb21lX21vcmUpLCAocnVuX3Rlc3QpLCAobWFpbik6CisJKiBnc3QvdGNwL2dzdGZkc2V0LmM6IChuZWFyZXN0X3BvdyksIChyZXNpemUpLCAoZW5zdXJlX3NpemUpLAorCShnc3RfZmRzZXRfbmV3KSwgKGdzdF9mZHNldF9mcmVlKSwgKGdzdF9mZHNldF9zZXRfbW9kZSksCisJKGdzdF9mZHNldF9mZF9jdGxfd3JpdGUpLCAoZ3N0X2Zkc2V0X2ZkX2N0bF9yZWFkKSwKKwkoZ3N0X2Zkc2V0X2ZkX2hhc19jbG9zZWQpLCAoZ3N0X2Zkc2V0X2ZkX2hhc19lcnJvciksCisJKGdzdF9mZHNldF9mZF9jYW5fcmVhZCksIChnc3RfZmRzZXRfZmRfY2FuX3dyaXRlKSwKKwkoZ3N0X2Zkc2V0X3dhaXQpOgorCUFkZGVkIG1vcmUgbG9ja3MgYXJvdW5kIGZkc2V0IHN0cnVjdHVyZXMuIEZpeGVkL3Jld29ya2VkCisJdGhlIHBvbGwgYXJyYXkgcmVzaXppbmcgY29kZS4KKwlBZGRlZCBzdHJlc3MgdGVzdCBmb3IgZmRzZXQuCisKKzIwMDQtMTAtMjggIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmM6IChnc3RfYXVkaW9maWx0ZXJfbGluayk6CisJZml4IGJ1aWxkCisKKzIwMDQtMTAtMjggIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmM6IChnc3RfYXVkaW9maWx0ZXJfbGluayk6CisJICBmaXggbGluayBmdW5jdGlvbiB0byBhbHdheXMgcXVlcnkgY2hhbm5lbHMgYW5kIHF1ZXJ5IHdpZHRoIGZvcgorCSAgZmxvYXRzCisJKiBjb25maWd1cmUuYWM6CisJICBhZGQgZXF1YWxpemVyIGRpcgorCSogZ3N0L2VxdWFsaXplci9NYWtlZmlsZS5hbToKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6IChnc3RfaWlyX2VxdWFsaXplcl9nZXRfdHlwZSksCisJKGdzdF9paXJfZXF1YWxpemVyX2Jhc2VfaW5pdCksIChnc3RfaWlyX2VxdWFsaXplcl9jbGFzc19pbml0KSwKKwkoZ3N0X2lpcl9lcXVhbGl6ZXJfaW5pdCksIChnc3RfaWlyX2VxdWFsaXplcl9maW5hbGl6ZSksCisJKGFyZ190b19zY2FsZSksIChzZXR1cF9maWx0ZXIpLAorCShnc3RfaWlyX2VxdWFsaXplcl9jb21wdXRlX2ZyZXF1ZW5jaWVzKSwKKwkoZ3N0X2lpcl9lcXVhbGl6ZXJfc2V0X3Byb3BlcnR5KSwgKGdzdF9paXJfZXF1YWxpemVyX2dldF9wcm9wZXJ0eSksCisJKGdzdF9paXJfZXF1YWxpemVyX2ZpbHRlcl9pbnBsYWNlKSwgKGdzdF9paXJfZXF1YWxpemVyX3NldHVwKSwKKwkocGx1Z2luX2luaXQpOgorCSAgYWRkIGFuIGVxdWFsaXplcgorCisyMDA0LTEwLTI3ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJU3VibWl0dGVkIGJ5OiBLamFydGFuIE1hcmFhcyA8a21hcmFhc0Bicm9hZHBhcmsubm8+CisKKwkqIHBvL0xJTkdVQVM6CisJKiBwby9uYi5wbzoKKwkgIEFkZGVkIE5vcndlZ2lhbiBCb2ttYWFsIHRyYW5zbGF0aW9uCisKKzIwMDQtMTAtMjcgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FtaXhlci5jOiAoZ3N0X2Fsc2FfbWl4ZXJfYnVpbGRfbGlzdCk6CisJICBEb24ndCBicmVhayBvbiBvcHRpb25zIChmaXhlcyAjMTU2NDg4KS4KKworMjAwNC0xMC0yNyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L2NkYXVkaW8vTWFrZWZpbGUuYW06CisJKiBzeXMvTWFrZWZpbGUuYW06CisJICBmaXggYnVpbGQgb24gb2xkZXIgYXV0b21ha2UKKworMjAwNC0xMC0yNiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOiAoZ3N0X2R2ZGVjX3ZpZGVvX2dldGNhcHMpLAorCShnc3RfZHZkZWNfdmlkZW9fbGluayksIChnc3RfZHZkZWNfcHVzaCksIChnc3RfZHZkZWNfbG9vcCk6CisJQWxsb3cgYSBsaXR0bGUgbWFyZ2luIHdoZW4gbmVnb3RpYXRpbmcgdGhlIGZyYW1lcmF0ZS4KKworMjAwNC0xMC0yNiAgU3RlZmFuIEtvc3QgIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJICBzeW5jaG9uaXNlZCBuYW1pbmcgb2YgcGFkcyBhbmQgcGFkLXRlbXBsYXRlcworCisyMDA0LTEwLTI2ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9zcmNfZXZlbnQpLAorCShnc3Rfb2dnX2RlbXV4X2hhbmRsZV9ldmVudCksIChfZmluZF9jaGFpbl9nZXRfdW5rbm93bl9wYXJ0KSwKKwkoX2ZpbmRfc3RyZWFtc19jaGVjayksIChnc3Rfb2dnX2RlbXV4X3B1c2gpOgorCUZpeCBFT1MgYWdhaW4uIE5lZWRzIHRvIGJlIGRvbmUgaW4gYSBiZXR0ZXIgd2F5LiBXZSBzaG91bGQgbm90CisJcmVtb3ZlIHRoZSBwYWQgaWYgdGhlcmUgaXMgbm8gbmV3IGNoYWluZWQgc3RyZWFtLgorCisyMDA0LTEwLTI2IElhaW4gPGlhaW5nbm9tZUBnbWFpbC5jb20+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYyAoZ3N0X29nZ19wYWRfbmV3KTogRnJlZSB0aGUgdGFnIGxpc3QuCisJKiBnc3QvYXVkaW9zY2FsZS9nc3RhdWRpb3NjYWxlLmMgKGdzdF9hdWRpb3NjYWxlX2xpbmspOiBGcmVlIHRoZSBjb3B5CisJb2YgdGhlIGNhcHMuCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmMgKGludGVybGVhdmVfY2xhc3NfaW5pdCk6IEhvb2sgdXAgcmVsZWFzZQorCXBhZC4KKwkoaW50ZXJsZWF2ZV9yZWxlYXNlX3BhZCk6IFJlbW92ZSB0aGUgcGFkLgorCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6IEFsbG93IHRoZSBsZXZlbCB0byB0YWtlIDEgb3IgMiBjaGFubmVscy4KKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpby5jIChnc3Rfc3VuYXVkaW9fc2V0cGFyYW1zKTogUGF5IGF0dGVudGlvbiB0bworCXRoZSBzZXQgZGV2aWNlLgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYyAoZ3N0X3h2aW1hZ2VzaW5rX2dldF94dl9zdXBwb3J0KTogRnJlZSB0aGUKKwlhdHRycworCShnc3RfeHZpbWFnZXNpbmtfeGNvbnRleHRfY2xlYXIpOiBGcmVlIHRoZSB4Y29udGV4dC4KKwkoZ3N0X3h2aW1hZ2VzaW5rX2ZpbmFsaXplKTogRnJlZSB0aGUgcGFyLgorCisyMDA0LTEwLTI2ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aW11eF9hdWRzaW5rY29ubmVjdCksCisJKGdzdF9hdmltdXhfc3RvcF9maWxlKToKKwkgIEZpcnN0IGNhbGN1bGF0ZSB0aGUgcmF0ZSwgYW5kIG9ubHkgdGhlbiB1c2UgaXQuIEhkci5yYXRlIGlzIGEKKwkgIG11bHRpcGxlIGFuZCBub3QgYSBkZXJpdmF0aXZlIG9mIGhkci5zY2FsZS4gU2NhbGUgaXMgbm90IHRoZQorCSAgc2FtZSBhcyBibG9ja2FsaWduIGJ1dCBpcyBzb2xlbHkgcmVsYXRlZCB0byByYXRlLgorCisyMDA0LTEwLTI2ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzaW5rLmM6IChnc3RfZ25vbWV2ZnNzaW5rX2luaXQpLAorCShnc3RfZ25vbWV2ZnNzaW5rX2hhbmRsZV9ldmVudCksIChnc3RfZ25vbWV2ZnNzaW5rX2NoYWluKToKKwkgIEltcGxlbWVudCBzZWVraW5nLgorCisyMDA0LTEwLTI1ICBKYW1lcyBIZW5zdHJpZGdlICA8amFtZXNAamFtZXNoLmlkLmF1PgorCisJUmV2aWV3ZWQgYnk6ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4YW1wbGVzL2dzdHBsYXkvcGxheWVyLmM6IChnb3Rfc3RyZWFtX2xlbmd0aCksIChtYWluKToKKwkqIGV4YW1wbGVzL3NlZWtpbmcvY2RwbGF5ZXIuYzogKHVwZGF0ZV9zY2FsZSk6CisJKiBleGFtcGxlcy9zZWVraW5nL3NlZWsuYzogKGZvcm1hdF92YWx1ZSksICh1cGRhdGVfc2NhbGUpOgorCSogZXhhbXBsZXMvc2Vla2luZy9zcGlkZXJfc2Vlay5jOiAoZm9ybWF0X3ZhbHVlKSwgKHVwZGF0ZV9zY2FsZSksCisJKHN0b3Bfc2Vlayk6CisJQnVpbGQgZml4ZXMgb24gQU1ENjQuCisKKzIwMDQtMTAtMjUgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCXJldmlld2VkIGJ5OiBSb25hbGQgQnVsdGplIDxyYnVsdGplIGF0IGdub21lIGRvdCBvcmc+CisKKwkqIHN5cy92NGwvdjRsX2NhbGxzLmM6IChnc3RfdjRsX2dldF9jaGFuX25hbWVzKToKKwlGaXggZm9yIHNvbWUgdjRsIGNhcmRzIHdoaWNoIGhhbmcgaW4gdjRsc3JjCisKKzIwMDQtMTAtMjUgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX3BhZF9yZW1vdmUpLAorCShnc3Rfb2dnX2RlbXV4X3B1c2gpLCAoZ3N0X29nZ19jaGFpbnNfY2xlYXIpOgorCU1ha2Ugc3VyZSB0byByZW1vdmUgdGhlIHBhZCB3aGVuIGEgbmV3IGNoYWluIGlzCisJZW5jb3VudGVyZWQuIFNldCBzb21lIHZhcnMgdG8gTlVMTCBzbyB3ZSBkb24ndCB0cnkKKwl0byByZWZlcmVuY2UgZnJlZWQgbWVtb3J5LgorCisyMDA0LTEwLTI1ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXhhbXBsZXMvc2Vla2luZy9NYWtlZmlsZS5hbToKKwkqIGV4YW1wbGVzL3NlZWtpbmcvY2RwbGF5ZXIuYzogKHVwZGF0ZV9zY2FsZSk6CisJKiBleGFtcGxlcy9zZWVraW5nL2NoYWluZWQuYzogKHVubGlua2VkKSwgKG5ld19wYWQpLCAobWFpbik6CisJKiBleGFtcGxlcy9zZWVraW5nL3BsYXliaW4uYzogKG1ha2VfcGxheWVyYmluX3BpcGVsaW5lKSwKKwkoZm9ybWF0X3ZhbHVlKSwgKHVwZGF0ZV9zY2FsZSksIChpdGVyYXRlKSwgKHN0YXJ0X3NlZWspLAorCShzdG9wX3NlZWspLCAocHJpbnRfbWVkaWFfaW5mbyksIChwbGF5X2NiKSwgKHBhdXNlX2NiKSwgKHN0b3BfY2IpLAorCShwcmludF91c2FnZSksIChtYWluKToKKwlBZGRlZCBzb21lIG1vcmUgZXhhbXBsZXMsIHVwZGF0ZSBvdGhlcnMuCisKKzIwMDQtMTAtMjUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjZGVjX3VwZGF0ZV9tZXRhZGF0YSk6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzogKHNwZWV4X2RlY19jaGFpbik6CisJKiBleHQvdGhlb3JhL3RoZW9yYWRlYy5jOiAodGhlb3JhX2RlY19jaGFpbik6CisJKiBleHQvdm9yYmlzL3ZvcmJpc2RlYy5jOiAodm9yYmlzX2RlY19jaGFpbik6CisJICBBZGQgY29kZWMtbmFtZSBtZXRhZGF0YS4KKworMjAwNC0xMC0yNSAgVGFrYW8gRnVqaXdhcmEgIDxUYWthby5GdWppd2FyYUBTdW4uQ09NPgorCisJUmV2aWV3ZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FtaXhlci5jOiAoZ3N0X2Fsc2FfbWl4ZXJfYnVpbGRfbGlzdCk6CisJKiBleHQvYWxzYS9nc3RhbHNhbWl4ZXJ0cmFjay5jOiAoZ3N0X2Fsc2FfbWl4ZXJfdHJhY2tfbmV3KToKKwkqIGV4dC9hbHNhL2dzdGFsc2FtaXhlcnRyYWNrLmg6CisJKiBwby9QT1RGSUxFUy5pbjoKKwkgIEFMU0EgbWl4ZXIgdHJhY2sgbGFiZWwgaW50ZXJuYXRpb25hbGl6YXRpb24gKCMxNTQwNTQpLgorCisyMDA0LTEwLTI1ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvdGhlb3JhL3RoZW9yYWRlYy5jOiAodGhlb3JhX2RlY19jaGFpbik6CisJICBFeHBvcnQgYml0cmF0ZSBhcyBtZXRhZGF0YS4KKworMjAwNC0xMC0yNSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVyLmM6IChnc3RfYWxzYV9taXhlcl9idWlsZF9saXN0KToKKwkqIGV4dC9hbHNhL2dzdGFsc2FtaXhlcnRyYWNrLmM6IChnc3RfYWxzYV9taXhlcl90cmFja19uZXcpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVydHJhY2suaDoKKwkgIEZpeCBuYW1lcywgZml4IGxvb3AuCisKKzIwMDQtMTAtMjUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiAoZ3N0X3NwZWV4X2RlY19pbml0KSwKKwkoc3BlZXhfZGVjX2NvbnZlcnQpOgorCSAgc2lua2NvbnZlcnQgZnVuY3Rpb24gc28gb2dnZGVtdXggY2FuIGdldCB0aGUgZmlsZSBsZW5ndGggKHRvdGVtKS4KKworMjAwNC0xMC0yNSAgSmFtZXMgTW9ycmlzb24gIDxqYTJtb3JyaUBjc2NsdWIudXdhdGVybG9vLmNhPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKGdzdF9hc2ZfZGVtdXhfcHJvY2Vzc19jaHVuayk6CisJICBEb24ndCBwdXNoIGluY29tcGxldGUgcGFja2V0cy4KKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAobTRhX3R5cGVfZmluZCk6CisJICBGaXggTVBFRy00IGF1ZGlvIHR5cGVmaW5kaW5nLgorCisyMDA0LTEwLTI1ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvdjRsL01ha2VmaWxlLmFtOgorCSogc3lzL3Y0bC9nc3R2NGwuYzogKHBsdWdpbl9pbml0KToKKwkqIHN5cy92NGwvZ3N0djRsZWxlbWVudC5jOiAoZ3N0X3Y0bGVsZW1lbnRfZ2V0X3R5cGUpLAorCShnc3RfdjRsZWxlbWVudF9pbml0KSwgKGdzdF92NGxlbGVtZW50X2Rpc3Bvc2UpLAorCShnc3RfdjRsZWxlbWVudF9jaGFuZ2Vfc3RhdGUpOgorCSogc3lzL3Y0bC9nc3R2NGxlbGVtZW50Lmg6CisJKiBzeXMvdjRsL2dzdHY0bHhvdmVybGF5LmM6IChnc3RfdjRsX3hvdmVybGF5X29wZW4pLAorCShnc3RfdjRsX3hvdmVybGF5X2Nsb3NlKSwgKGlkbGVfcmVmcmVzaCksCisJKGdzdF92NGxfeG92ZXJsYXlfc2V0X3h3aW5kb3dfaWQpOgorCSogc3lzL3Y0bC9nc3R2NGx4b3ZlcmxheS5oOgorCSogc3lzL3Y0bC92NGwtb3ZlcmxheV9jYWxscy5jOgorCSogc3lzL3Y0bC92NGxfY2FsbHMuaDoKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSogc3lzL3Y0bDIvZ3N0djRsMi5jOiAocGx1Z2luX2luaXQpOgorCSogc3lzL3Y0bDIvZ3N0djRsMmVsZW1lbnQuYzogKGdzdF92NGwyZWxlbWVudF9nZXRfdHlwZSksCisJKGdzdF92NGwyZWxlbWVudF9pbml0KSwgKGdzdF92NGwyZWxlbWVudF9kaXNwb3NlKSwKKwkoZ3N0X3Y0bDJlbGVtZW50X2NoYW5nZV9zdGF0ZSk6CisJKiBzeXMvdjRsMi9nc3R2NGwyZWxlbWVudC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnhvdmVybGF5LmM6IChnc3RfdjRsMl94b3ZlcmxheV9vcGVuKSwKKwkoZ3N0X3Y0bDJfeG92ZXJsYXlfY2xvc2UpLCAoaWRsZV9yZWZyZXNoKSwKKwkoZ3N0X3Y0bDJfeG92ZXJsYXlfc2V0X3h3aW5kb3dfaWQpOgorCSogc3lzL3Y0bDIvZ3N0djRsMnhvdmVybGF5Lmg6CisJKiBzeXMvdjRsMi92NGwyLW92ZXJsYXlfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuaDoKKwkgIFJlbW92ZSBjbGllbnQtc2lkZSBvdmVybGF5IGhhbmRsaW5nLCB1c2UgdGhlIFgtc2VydmVyIHY0bCBwbHVnaW4KKwkgIGZvciB0aGF0LiBOaWNlciBvdmVybGF5LCBsZXNzIGNvZGUuIEFsc28gbWFrZSB0aGUgcGx1Z2luCisJICBjb21waWxlYWJsZSB3aXRob3V0IFggKGJ1dCB0aGVuIHdpdGhvdXQgb3ZlcmxheSwgb2J2aW91c2x5KS4KKwkgIE1ha2VzIHh3aW5kb3dsaXN0ZW5lciBvYnNvbGV0ZSwgc2hvdWxkIHdlIHJlbW92ZSB0aGF0PworCisyMDA0LTEwLTI1ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jOiAoZ3N0X29zc3NyY19nZXRfdGltZSksIChnc3Rfb3Nzc3JjX2dldCksCisJKGdzdF9vc3NzcmNfc3JjX3F1ZXJ5KToKKwkqIHN5cy9vc3MvZ3N0b3Nzc3JjLmg6CisJICBPSywgc28gcGVvcGxlIHdhbnQgb2Zmc2V0IGluIERFRkFVTFQuIFRoaXMgdGltZSwgYWN0dWFsbHkgZml4IGFsbAorCSAgY2FzZXMuCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19nZXRjYXBzKToKKwkgIEFkZCBGUFMgcHJvcGVybHkuCisKKzIwMDQtMTAtMjQgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBGcmFtZXJhdGUuCisKKzIwMDQtMTAtMjQgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJlbGVtZW50LmM6IChnc3RfdjRsMmVsZW1lbnRfc2V0X3Byb3BlcnR5KToKKwkgIEZpeCBwcm9wZXJ0aWVzIChjaGFubmVsLCBub3JtLCBmcmVxdWVuY3kpLgorCisyMDA0LTEwLTI0ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyZWxlbWVudC5jOiAoZ3N0X3Y0bDJlbGVtZW50X2dldF9wcm9wZXJ0eSk6CisJICBGbGFnIHR5cG8uCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6IChnc3RfdjRsMl9zZXRfZGVmYXVsdHMpOgorCSAgTm8gd2FybmluZ3MuCisKKzIwMDQtMTAtMjQgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX2NsZWFyX2Zvcm1hdF9saXN0KToKKwkgIEZpeCBoYW5nLgorCisyMDA0LTEwLTI0ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyZWxlbWVudC5oOgorCSAgWWV0IEFub3RoZXIgSGFjayAodG0pIGZvciBrZXJuZWwgaGVhZGVyIGJvcmtlZG5lc3MuCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19pbml0KSwKKwkoZ3N0X3Y0bDJzcmNfdjRsMmZvdXJjY190b19jYXBzKSwgKGdzdF92NGwyX2ZvdXJjY19mcm9tX3N0cnVjdHVyZSksCisJKGdzdF92NGwyc3JjX2xpbmspLCAoZ3N0X3Y0bDJzcmNfZ2V0Y2FwcyksCisJKGdzdF92NGwyc3JjX2NoYW5nZV9zdGF0ZSk6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmg6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IChnc3RfdjRsMnNyY19jYXB0dXJlX2luaXQpLAorCShnc3RfdjRsMnNyY19jYXB0dXJlX3N0YXJ0KSwgKGdzdF92NGwyc3JjX2NhcHR1cmVfc3RvcCk6CisJICBGaXggY2Fwcywga2VlcCB0cmFjayBvZiBzdGF0ZSwgd29yay4KKworMjAwNC0xMC0yNCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzogKGdzdF92NGxzcmNfZ2V0Y2Fwcyk6CisJICBRdWlldC4KKworMjAwNC0xMC0yNCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL29zcy9nc3Rvc3NzcmMuYzogKGdzdF9vc3NzcmNfZ2V0KToKKwkgIERvbid0IG1peCBieXRlcyBhbmQgc2FtcGxlcy4KKworMjAwNC0xMC0yNCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L29nZy9nc3RvZ2dtdXguYzoKKwkgIEJhc2ljIHBhZCB0ZW1wbGF0ZSB3aGljaCBhY2NlcHRzIE9HTSB0cmFja3MsIHNwZWV4LCBmbGFjLCB2b3JiaXMKKwkgIGFuZCB0aGVvcmEuIEFueSBpcyBpbmNvcnJlY3QuCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmbXV4LmM6IChnc3RfYXNmbXV4X3ZpZHNpbmtfbGluayk6CisJICBGaXggY2Fwcy4KKwkqIHN5cy92NGwvZ3N0djRsbWpwZWdzaW5rLmM6IChnc3RfdjRsbWpwZWdzaW5rX2Jhc2VfaW5pdCk6CisJKiBzeXMvdjRsL2dzdHY0bG1qcGVnc3JjLmM6IChnc3RfdjRsbWpwZWdzcmNfYmFzZV9pbml0KSwKKwkoZ3N0X3Y0bG1qcGVnc3JjX2luaXQpLCAoZ3N0X3Y0bG1qcGVnc3JjX3NyY2Nvbm5lY3QpLAorCShnc3RfdjRsbWpwZWdzcmNfZ2V0Y2FwcyksIChnc3RfdjRsbWpwZWdzcmNfY2hhbmdlX3N0YXRlKToKKwkqIHN5cy92NGwvZ3N0djRsbWpwZWdzcmMuaDoKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6IChnc3RfdjRsc3JjX3NyY19saW5rKSwgKGdzdF92NGxzcmNfZ2V0Y2FwcyksCisJKGdzdF92NGxzcmNfY2hhbmdlX3N0YXRlKToKKwkqIHN5cy92NGwvdjRsbWpwZWdzcmNfY2FsbHMuYzogKGdzdF92NGxtanBlZ3NyY19jYXB0dXJlX3N0YXJ0KSwKKwkoZ3N0X3Y0bG1qcGVnc3JjX2NhcHR1cmVfc3RvcCk6CisJICBGaXggY2Fwcy4gS2VlcCB0cmFjayBvZiBpbnRlcm5hbCBzdGF0ZS4gV29yay4KKworMjAwNC0xMC0yMyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L01ha2VmaWxlLmFtOgorCSAgRml4IHRoZSBidWlsZCBmaXhlcy4KKworMjAwNC0xMC0yMyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9zcmNfcXVlcnkpLAorCShnc3Rfb2dnX2RlbXV4X3NyY19ldmVudCksIChfZmluZF9jaGFpbl9zZWVrKSwKKwkoZ3N0X29nZ19wYWRfcHVzaCk6CisJICBDaGVjayBmb3IgcGFkIGF2YWlsYWJpbGl0eSBiZWZvcmUgdXNpbmcgaXQuCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChfZmluZF9jaGFpbl9wcm9jZXNzKToKKwkgIEZpeCBwYXJzaW5nIG9mIGNoYWluZWQgb2dnLiBOZWVkcyBtb3JlIHdvcmsgb24gdGhlIGRlY29kZXIgc2lkZS4KKworMjAwNC0xMC0yMiAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBnc3Qvc3BlY3RydW0vTWFrZWZpbGUuYW06CisJKiBnc3Qvc3BlY3RydW0vZGVtby1vc3NzcmMuYzogKHNwZWN0cnVtX2NoYWluKSwgKG1haW4pLAorCShpZGxlX2Z1bmMpOgorCSAgRml4IGRlbW8gYW5kIHJlZW5hYmxlIGl0LiBZZXMsIEknbSBjdXJyZW50bHkgcGxheWluZyB3aXRoIGF1ZGlvCisJICBhbmFseXNpcyB0b29scworCisyMDA0LTEwLTIyICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX3BhZF9wdXNoKToKKwkgIFdlIGxvdmUgaXQgaWYgZmlsZXMgdGhhdCBzdGFydCBhdCB6ZXJvIHdvcmsgdG9vLi4uCisKKzIwMDQtMTAtMjIgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfZGVtdXhfaXRlcmF0ZSk6CisJICBIYW5kbGUgZmlsZXMgd2l0aCBtaXNzaW5nIEVPUyBoZWFkZXJzLgorCisyMDA0LTEwLTIxICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc2luay5jOgorCShnc3RfdGNwc2VydmVyc2lua19oYW5kbGVfc2VydmVyX3JlYWQpLAorCShnc3RfdGNwc2VydmVyc2lua19pbml0X3NlbmQpOgorCVplcm8gc29tZSB2YXJpYWJsZXMgZmlyc3QgKG5lZWQgZm9yIGFjY2VwdCBub3QgdG8gcmV0dXJuIEVJTlZBTCkKKworMjAwNC0xMC0yMCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9zcmNfcXVlcnkpLAorCShnc3Rfb2dnX2RlbXV4X3NyY19ldmVudCksIChnc3Rfb2dnX3BhZF9wdXNoKToKKwkqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6ICh0aGVvcmFfZGVjX3NpbmtfY29udmVydCksCisJKHRoZW9yYV9kZWNfY2hhaW4pOgorCSogZXh0L3ZvcmJpcy92b3JiaXNkZWMuYzogKHZvcmJpc19kZWNfZ2V0X2Zvcm1hdHMpLAorCShnc3Rfdm9yYmlzX2RlY19pbml0KSwgKHZvcmJpc19kZWNfY29udmVydCksICh2b3JiaXNfZGVjX2NoYWluKToKKwkgIFNlZWtpbmcgYW5kIHF1ZXJ5aW5nIGZpbmV0dW5lLgorCisyMDA0LTEwLTIwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvcmF3MTM5NC9NYWtlZmlsZS5hbToKKwkgIGZpeCB0aGUgYnVpbGQKKworMjAwNC0xMC0yMCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9pdGVyYXRlKToKKwkgIFdyb25nIHJldHVybi4KKwkqIGdzdC9wbGF5YmFjay9NYWtlZmlsZS5hbToKKwkqIGdzdC9wbGF5YmFjay9nc3RkZWNvZGViaW4uYzogKGdzdF9kZWNvZGVfYmluX2NsYXNzX2luaXQpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXktbWFyc2hhbC5saXN0OgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChnc3RfcGxheV9iYXNlX2Jpbl9jbGFzc19pbml0KToKKwkgIEZpeCBtYXJzaGFsbGVycy4KKworMjAwNC0xMC0xOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9zcmNfZXZlbnQpOgorCSAgU2lsZW5jZS4KKworMjAwNC0xMC0xOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9zcmNfcXVlcnkpLAorCShnc3Rfb2dnX2RlbXV4X3NyY19ldmVudCksIChnc3Rfb2dnX3BhZF9wb3B1bGF0ZSksCisJKGdzdF9vZ2dfcGFkX3B1c2gpOgorCSAgWWF5IGZvciBub24tbGluZWFpciBncmFudWxlcG9zIGluIHRoZW9yYS4KKworMjAwNC0xMC0xOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOiAoZ3N0X2R2ZGVjX2luaXQpLCAoZ3N0X2R2ZGVjX3ZpZGVvX2dldGNhcHMpLAorCShnc3RfZHZkZWNfdmlkZW9fbGluayksIChnc3RfZHZkZWNfcHVzaCksIChnc3RfZHZkZWNfbG9vcCk6CisJKiBleHQvZHYvZ3N0ZHZkZWMuaDoKKwlNYWtlIHN1cmUgd2UgcmVuZWdvdGlhdGUgYXNwZWN0IHJhdGlvIHdoZW4gdGhlIGNhbWVyYSBzd2l0Y2hlcy4KKworMjAwNC0xMC0xOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9zcmNfcXVlcnkpLAorCShnc3Rfb2dnX2RlbXV4X3NyY19ldmVudCksIChnc3Rfb2dnX3BhZF9wdXNoKToKKwkgIFN0YXJ0IGF0IHplcm8uCisJKiBleHQvdGhlb3JhL3RoZW9yYWRlYy5jOiAodGhlb3JhX2RlY19jaGFpbik6CisJICBTa2lwIGhlYWRlcnMuIEJhZCBpZGVhIGZvciBjaGFpbmVkIG9nZywgYnV0IGZpeGVzIHNlZWtpbmcuCisKKzIwMDQtMTAtMTggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJSSBzd2VhciwgdGhpcyBpcyB0aGUgbGFzdCB0aW1lIEkgdG91Y2ggdGhpcy4KKworMjAwNC0xMC0xOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9zcmNfcXVlcnkpLAorCShnc3Rfb2dnX2RlbXV4X3NyY19ldmVudCksIChnc3Rfb2dnX3BhZF9wb3B1bGF0ZSksCisJKF9yZWFkX2Jvc19wcm9jZXNzKSwgKGdzdF9vZ2dfZGVtdXhfaXRlcmF0ZSksIChnc3Rfb2dnX3BhZF9uZXcpOgorCSAgRmFzdGVyIHNlZWtpbmcuCisJKiBleHQvdGhlb3JhL3RoZW9yYWRlYy5jOiAodGhlb3JhX2RlY19zaW5rX2NvbnZlcnQpOgorCSAgVGltZS10by1kZWZhdWx0IGNvbnZlcnNpb24uCisJKiBleHQvdm9yYmlzL3ZvcmJpc2RlYy5jOiAodm9yYmlzX2RlY19jaGFpbik6CisJICBEb24ndCBlcnJvciBvbiB1bmtub3duIHBhY2tldHMsIGp1c3Qgc2tpcC4gV2Ugc2hvdWxkIHByb2JhYmx5CisJICByZWFkIHRoZW0gaWYgd2Ugd2FudCB0byBzdXBwb3J0IGNoYWluZWQgb2dnLgorCisyMDA0LTEwLTE4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCUFkZGVkIGNkYXVkaW8gdG8gd3JvbmcgbGlzdC4KKworMjAwNC0xMC0xOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwlSZXZpdmUgY2RhdWRpby4KKworMjAwNC0xMC0xOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOiAoZ3N0X2R2ZGVjX3ZpZGVvX2dldGNhcHMpLAorCShnc3RfZHZkZWNfdmlkZW9fbGluayksIChnc3RfZHZkZWNfcHVzaCk6CisJKiBleHQvanBlZy9nc3RzbW9rZWVuYy5jOiAoZ3N0X3Ntb2tlZW5jX2NsYXNzX2luaXQpLAorCShnc3Rfc21va2VlbmNfcmVzeW5jKSwgKGdzdF9zbW9rZWVuY19jaGFpbik6CisJRml4IG1pbWV0eXBlIG9uIHNtb2tlIGVuY29kZXIuCisJQWRkIGFzcGVjdCByYXRpbyB0byBkdmRlYy4gTm90IHN1cmUgaWYgdGhlc2UKKwl2YWx1ZXMgYXJlIGNvcnJlY3QgdGhvdWdoLi4uLgorCisyMDA0LTEwLTE4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L3ZvcmJpcy92b3JiaXNlbmMuYzogKGdzdF92b3JiaXNlbmNfY2xhc3NfaW5pdCk6CisJRml4IHZvcmJpcyBwcm9wZXJ0eSBkZXNjcmlwdGlvbnMgYW5kIHJhbmdlcy4KKworMjAwNC0xMC0xOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfZGVtdXhfaXRlcmF0ZSk6CisJUmVhbGx5IGRvIG5vdGhpbmcgd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZS4KKwlHbyB0byB0aGUgcGxheWluZyBzdGF0ZSB3aGVuIHRoZSBzdHJlYW0gaXMgbm90IHNlZWthYmxlCisJaW5zdGVhZCBvZiBmYWlsaW5nLgorCisyMDA0LTEwLTE4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L2NkYXVkaW8vZ3N0Y2RhdWRpby5jOiAoX2RvX2luaXQpLCAoZ3N0X2NkYXVkaW9fYmFzZV9pbml0KSwKKwkoZ3N0X2NkYXVkaW9fZ2V0X2V2ZW50X21hc2tzKSwgKGdzdF9jZGF1ZGlvX3NlbmRfZXZlbnQpLAorCShnc3RfY2RhdWRpb19xdWVyeSksIChwbHVnaW5faW5pdCksIChjZGF1ZGlvX3VyaV9nZXRfdHlwZSksCisJKGNkYXVkaW9fdXJpX2dldF9wcm90b2NvbHMpLCAoY2RhdWRpb191cmlfZ2V0X3VyaSksCisJKGNkYXVkaW9fdXJpX3NldF91cmkpLCAoY2RhdWRpb191cmlfaGFuZGxlcl9pbml0KToKKwlBZGRlZCB1cmkgaGFuZGxlciBmb3IgY2Q6Ly8KKwlQb3J0IHRvIG5ldyBBUEkuCisKKzIwMDQtMTAtMTggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcGxheWJhY2svZ3N0ZGVjb2RlYmluLmM6IChnc3RfZGVjb2RlX2Jpbl9jbGFzc19pbml0KSwKKwkoZ3N0X2RlY29kZV9iaW5faW5pdCksIChmaW5kX2NvbXBhdGlibGVzKSwgKGNsb3NlX3BhZF9saW5rKSwKKwkodHJ5X3RvX2xpbmtfMSksIChub19tb3JlX3BhZHMpLCAoY2xvc2VfbGluayksICh0eXBlX2ZvdW5kKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoZ2VuX3ByZXJvbGxfZWxlbWVudCksCisJKHJlbW92ZV9wcmVyb2xscyksICh1bmtub3duX3R5cGUpLCAoYWRkX2VsZW1lbnRfc3RyZWFtKSwKKwkobmV3X2RlY29kZWRfcGFkKSwgKHNldHVwX3NvdXJjZSksIChnc3RfcGxheV9iYXNlX2Jpbl9hZGRfZWxlbWVudCksCisJKGdzdF9wbGF5X2Jhc2VfYmluX3JlbW92ZV9lbGVtZW50KSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fbGlua19zdHJlYW0pOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdlbl92aWRlb19lbGVtZW50KSwKKwkoZ2VuX3Zpc19lbGVtZW50KSwgKHJlbW92ZV9zaW5rcyksIChzZXR1cF9zaW5rcyk6CisJKiBnc3QvcGxheWJhY2svZ3N0c3RyZWFtaW5mby5jOiAoZ3N0X3N0cmVhbV90eXBlX2dldF90eXBlKSwKKwkoZ3N0X3N0cmVhbV9pbmZvX2dldF90eXBlKSwgKGdzdF9zdHJlYW1faW5mb19jbGFzc19pbml0KSwKKwkoZ3N0X3N0cmVhbV9pbmZvX2luaXQpLCAoZ3N0X3N0cmVhbV9pbmZvX25ldyksCisJKGdzdF9zdHJlYW1faW5mb19kaXNwb3NlKSwgKHN0cmVhbV9pbmZvX211dGVfcGFkKSwKKwkoZ3N0X3N0cmVhbV9pbmZvX3NldF9wcm9wZXJ0eSksIChnc3Rfc3RyZWFtX2luZm9fZ2V0X3Byb3BlcnR5KToKKwkqIGdzdC9wbGF5YmFjay9nc3RzdHJlYW1pbmZvLmg6CisJQWRkIHNpbmsgcGFkdGVtcGxhdGUgdG8gZGVjb2RlYmluLgorCUFkZGVkIHNvbWUgbW9yZSBjb21tZW50cy4KKwlNYWtlIHF1ZXVlIHNpemUgY29uZmlndXJhYmxlIGluIHBsYXliYXNlYmluLgorCUFkZGVkIHBvc3NpYmlsaXR5IHRvIHVzZSBlbGVtZW50cyBhcyBzaW5rcyAoZXggY2RhdWRpbykuCisKKzIwMDQtMTAtMTUgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleGVuY19jbGFzc19pbml0KSwKKwkoZ3N0X3NwZWV4ZW5jX2NoYWluKToKKwlGaXggc3BlZXggdGltZXN0YW1wcyBzbyB0aGF0IGl0IGdldHMgbXV4ZWQgcHJvcGVybHkuCisKKzIwMDQtMTAtMTUgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzogKGdzdF9kdjEzOTRzcmNfZ2V0X3R5cGUpLAorCShnc3RfZHYxMzk0c3JjX2Jhc2VfaW5pdCksIChnc3RfZHYxMzk0c3JjX2NsYXNzX2luaXQpLAorCShnc3RfZHYxMzk0c3JjX2luaXQpLCAoZ3N0X2R2MTM5NHNyY19kaXNwb3NlKSwKKwkoZ3N0X2R2MTM5NHNyY19pc29fcmVjZWl2ZSksIChnc3RfZHYxMzk0c3JjX2Rpc2NvdmVyX2F2Y19ub2RlKSwKKwkoZ3N0X2R2MTM5NHNyY19jaGFuZ2Vfc3RhdGUpLCAoZ3N0X2R2MTM5NHNyY19nZXRfZXZlbnRfbWFzayksCisJKGdzdF9kdjEzOTRzcmNfZXZlbnQpLCAoZ3N0X2R2MTM5NHNyY19nZXRfZm9ybWF0cyksCisJKGdzdF9kdjEzOTRzcmNfY29udmVydCksIChnc3RfZHYxMzk0c3JjX2dldF9xdWVyeV90eXBlcyksCisJKGdzdF9kdjEzOTRzcmNfcXVlcnkpLCAoZ3N0X2R2MTM5NHNyY191cmlfZ2V0X3R5cGUpLAorCShnc3RfZHYxMzk0c3JjX3VyaV9nZXRfcHJvdG9jb2xzKSwgKGdzdF9kdjEzOTRzcmNfdXJpX2dldF91cmkpLAorCShnc3RfZHYxMzk0c3JjX3VyaV9zZXRfdXJpKSwgKGdzdF9kdjEzOTRzcmNfdXJpX2hhbmRsZXJfaW5pdCk6CisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuaDoKKwlBZGRlZCBjb252ZXJzaW9uL3F1ZXJ5IGZ1bmN0aW9ucy4KKwlVcGRhdGUgYnVmZmVyIHRpbWVzdGFtcHMsCisJQWRkZWQgc2lnbmFscy4KKwlBZGRlZCB1cmkgZHY6Ly8gc28gaXQgbWlnaHQgcGxheSBmcm9tIHRoZSBmaXJld2lyZSBpbiBwbGF5YmluLgorCUZpeCBhIHBvc3NpYmxlIGxlYWsuCisJQWRkZWQgZGVidWdnaW5nLgorCisyMDA0LTEwLTE1ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IChnc3RfZHYxMzk0c3JjX2NsYXNzX2luaXQpLAorCShnc3RfZHYxMzk0c3JjX2luaXQpLCAoZ3N0X2R2MTM5NHNyY19zZXRfcHJvcGVydHkpLAorCShnc3RfZHYxMzk0c3JjX2dldF9wcm9wZXJ0eSksIChnc3RfZHYxMzk0c3JjX2lzb19yZWNlaXZlKSwKKwkoZ3N0X2R2MTM5NHNyY19kaXNjb3Zlcl9hdmNfbm9kZSksIChnc3RfZHYxMzk0c3JjX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuaDoKKwlBZGRlZCBBVi9DIFZUUiBjb250cm9sIHN1cHBvcnQgbmVlZGVkIGZvciBzb21lIGNhbWVyYXMuCisJQWRkZWQgYXV0b21hdGljIHBvcnQgZGV0ZWN0aW9uLgorCUFkZGVkIHByb3BlcnRpZXMgZm9yIHNlbGVjdGluZyB0aGUgY2hhbm5lbC4KKwlUaGUgY29uZmlndXJlLmFjIHNjcmlwdCBpcyBub3QgeWV0IHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUKKwluZXcgbGliYXZjMTM5NCBhbmQgbGlicm9tMTM5NCBkZXBlbmRlbmNpZXMuCisKKzIwMDQtMTAtMTUgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX2hlYWRlciksCisJKHF0ZGVtdXhfcGFyc2UpLCAoZ3N0X3F0ZGVtdXhfaGFuZGxlX2VzZHMpOgorCUFuIGVzZHMgYm94IGlzIG5vdCBhIGNvbnRhaW5lci4KKwlGaXggcGFyc2luZyBvZiBtcDR2IGJveGVzLgorCURvIG5vdCB0cnkgdG8gcmVuZWdvdGlhdGUgZnBzIGZvciBlYWNoIGZyYW1lLiBOZWVkIHRvCisJZmluZCBhIGJldHRlciBtZXRob2QuIFRoaXMgc2hvdWxkIGZpeCBtcDQgcGxheWJhY2suCisKKzIwMDQtMTAtMTQgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29uZmlndXJlLmFjOiB1cGRhdGUgZm9yIHN3ZmRlYy0wLjMgYW5kIGxpYm9pbC0wLjIKKwkqIGV4dC9zd2ZkZWMvZ3N0c3dmZGVjLmM6IHVwZGF0ZSBmb3Igc3dmZGVjLTAuMworCSogZXh0L3N3ZmRlYy9nc3Rzd2ZkZWMuaDogc2FtZQorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOiB1cGRhdGUgZm9yIGxpYm9pbC0wLjIKKwkqIGdzdC92aWRlb3Rlc3RzcmMvdmlkZW90ZXN0c3JjLmM6IHNhbWUKKworMjAwNC0xMC0xNCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuYzogKGdzdF9tdWx0aWZkc2lua19hZGQpLAorCShnc3RfbXVsdGlmZHNpbmtfcmVtb3ZlKSwgKGdzdF9tdWx0aWZkc2lua19yZW1vdmVfY2xpZW50X2xpbmspLAorCShpc19zeW5jX2ZyYW1lKSwgKGdzdF9tdWx0aWZkc2lua19uZXdfY2xpZW50KSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRfd3JpdGUpLAorCShnc3RfbXVsdGlmZHNpbmtfcmVjb3Zlcl9jbGllbnQpLCAoZ3N0X211bHRpZmRzaW5rX3F1ZXVlX2J1ZmZlciksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50cyksIChnc3RfbXVsdGlmZHNpbmtfY2hhbmdlX3N0YXRlKToKKwlUdXJuIHdhcm5pbmdzIGludG8gaW5mby4KKwlEb24ndCBhbGxvdyBhIHN0YXRlIGNoYW5nZSBpbiB0aGUgc3RyZWFtaW5nIHRocmVhZC4KKworMjAwNC0xMC0xNCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L3ZvcmJpcy9vZ2d2b3JiaXNlbmMuYzoKKwkqIGV4dC92b3JiaXMvdm9yYmlzZGVjLmM6CisJICBmaXggdGVtcGxhdGUgc2FtcGxlIHJhdGUKKworMjAwNC0xMC0xMyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX2NoZWNrX2NhcHNfcmVzZXQpLCAoZ3N0X21hZF9jaGFpbik6CisJRGVjb2RpbmcgdGhlIGhlYWRlciBmaXJzdCBmaXhlcyBzb21lIHByb2JsZW1zIGluIHJlc3luY2luZworCWluIG1vcmUgbXAzcy4KKworMjAwNC0xMC0xMiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnZW5fdmlkZW9fZWxlbWVudCksCisJKGdlbl92aXNfZWxlbWVudCksIChyZW1vdmVfc2lua3MpLCAoc2V0dXBfc2lua3MpOgorCUFkZGVkIHZpcyBwbHVnaW4gc3VwcG9ydCwgbmVlZCB0byBjb25maWd1cmUgdGhlIHZpcworCWVsZW1lbnQgdG8gYWN0aXZhdGUgaXQuCisKKzIwMDQtMTAtMTIgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9nbm9tZXZmcy9nc3Rnbm9tZXZmc3NyYy5jOiAoZ3N0X2dub21ldmZzc3JjX2dldCksCisJKGdzdF9nbm9tZXZmc3NyY19zcmNwYWRfcXVlcnkpLCAoZ3N0X2dub21ldmZzc3JjX3NyY3BhZF9ldmVudCk6CisJICBTb21lIGRlYnVnLgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9yZXNldCksCisJKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19ldmVudCksIChnc3RfYXZpX2RlbXV4X3JlYWRfc3VwZXJpbmRleCksCisJKGdzdF9hdmlfZGVtdXhfcmVhZF9zdWJpbmRleGVzKSwgKGdzdF9hdmlfZGVtdXhfYWRkX3N0cmVhbSksCisJKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luZGV4KSwgKGdzdF9hdmlfZGVtdXhfc2tpcCksCisJKGdzdF9hdmlfZGVtdXhfc3luYyksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9zY2FuKSwKKwkoZ3N0X2F2aV9kZW11eF9tYXNzYWdlX2luZGV4KSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlcik6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBTdXBwb3J0IGZvciBvcGVuRE1MLTIuMCBpbmR4L2l4IyMgY2h1bmtzLiBTdXBwb3J0IGZvciBicm9rZW4gaW5kZXgKKwkgIHJlY292ZXJ5ICh3aGVyZSwgaWYgcGFydCBvZiB0aGUgaW5kZXggaXMgYnJva2VuLCB3ZSB3aWxsIHN0aWxsIHJlYWQKKwkgIHRoZSByZXN0IG9mIHRoZSBpbmRleCBhbmQgcmVjb3ZlciB0aGUgYnJva2VuIHBhcnQgYnkgc3RyZWFtCisJICBzY2FubmluZykuIE1vcmUgYnJva2VuIG1lZGlhIHN1cHBvcnQuIEVPUyB3b3JrYXJvdW5kcy4gR2VuZXJhbCBBVkkKKwkgIGJyYWluZGFtYWdlIGhlYWRhY2hlIHJlY292ZXJ5LiBBc3BpcmluIGluY2x1ZGVkLgorCisyMDA0LTEwLTExICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvY2RwYXJhbm9pYS9nc3RjZHBhcmFub2lhLmM6IChjZHBhcmFub2lhX29wZW4pLAorCShjZHBhcmFub2lhX2V2ZW50KSwgKGNkcGFyYW5vaWFfcXVlcnkpOgorCSAgR2V0IHJpZCBvZiBoaWRlb3VzIGxlYWQtaW4uCisKKzIwMDQtMTAtMTEgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKHNldHVwX3NvdXJjZSk6CisJV3JvbmcgdmFyIHVzZWQgdG8gZ2V0IGdfbGlzdF9uZXh0LgorCisyMDA0LTEwLTExICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvY2RwYXJhbm9pYS9nc3RjZHBhcmFub2lhLmM6IChjZHBhcmFub2lhX2NsYXNzX2luaXQpLAorCShjZHBhcmFub2lhX2dldCksIChjZHBhcmFub2lhX29wZW4pOgorCSAgUmVwb3J0IGRpc2NpZCBhcyBtZXRhZGF0YSwgYWRkIGR1cmF0aW9uLgorCisyMDA0LTEwLTExICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChzZXR1cF9zb3VyY2UpOgorCUNsZWFudXAgdGhlIHByZXZpb3VzIHBpcGVsaW5lIGEgbGl0dGxlIGVhcmxpZXIgZm9yIHRoZQorCWNhc2UgdGhhdCBhIHNvdXJjZSBlbGVtZW50IHByb3ZpZGVzIHJhdyBkYXRhLgorCisyMDA0LTEwLTExICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChnc3RfaWQzX3RhZ19jaGFpbik6CisJICByZXNldCB2MSB0YWcgb2Zmc2V0IHdoZW4gdGhlcmUgaXMgbm8gdjEgdGFnLiBGaXhlcyBpZDNkZW11eCBhbHdheXMKKwkgIGNvbnN1bWluZyB0aGUgbGFzdCAxMjggYnl0ZXMsIGV2ZW4gdGhvdWdoIGl0IHdhcyB2YWxpZCBtcDMgZGF0YS4KKworMjAwNC0xMC0xMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBzeXMvdjRsL2dzdHY0bHNyYy5jOiAoZ3N0X3Y0bHNyY19wYWxldHRlX3RvX2NhcHMpLAorCShnc3RfdjRsc3JjX2dldGNhcHMpLCAoZ3N0X3Y0bHNyY19nZXQpOgorCSogc3lzL3Y0bC92NGwtb3ZlcmxheV9jYWxscy5jOiAoZ3N0X3Y0bF9zZXRfb3ZlcmxheSk6CisJQ2hhbmdlIGdfd2FybmluZ3MgdG8gR1NUX1dBUk5JTkdfT0JKRUNUIGFuZCBmaXggY29sb3Vyc3BhY2UgaXNzdWUKKworMjAwNC0xMC0xMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBzeXMvdjRsL2dzdHY0bHNyYy5jOiAoZ3N0X3Y0bHNyY19zcmNfbGluayksIChnc3RfdjRsc3JjX2dldGNhcHMpOgorCUZpeCBmb3Igd2ViY2FtcyB0aGF0IHN1cHBvcnQgb25seSBzcGVjaWZpYyB3aWR0aCBvciBoZWlnaHQKKworMjAwNC0xMC0wOSAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHQuaS5tQHplbi5jby51az4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzogKGdzdF93YXZlbmNfc3RvcF9maWxlKToKKwkgIEZpeCB3cm9uZyBkaXNjb250IGV2ZW50IHNldHVwIChmaXhlcyAjMTU0OTY3KS4KKworMjAwNC0xMC0wOSAgU2ViYXN0aWVuIENvdGUgIDxzYzVAaGVybWVzLnVzaGVyYi5jYT4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiAoZ3N0X2F1cGFyc2VfY2hhaW4pOgorCSAgRXJyb3Igb3V0IG9uIGludmFsaWQgZGF0YSAoZml4ZXMgIzE1NDgwNykuCisKKzIwMDQtMTAtMDkgIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0LmkubUB6ZW4uY28udWs+CisKKwlSZXZpZXdlZCBieTogUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2R2ZHJlYWQvZHZkcmVhZHNyYy5jOiAoX3JlYWQpOgorCSAgTWFrZSB0aXRsZXMgPiAwIHdvcmsgYWdhaW4gKGZpeGVzICMxNTQ4MzQpLgorCisyMDA0LTEwLTA5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6CisJKGdzdF9yaWZmX2NyZWF0ZV92aWRlb190ZW1wbGF0ZV9jYXBzKToKKwkgIFdNVjMgbWlzc2luZyBpbiB0ZW1wbGF0ZSBjYXBzLgorCisyMDA0LTEwLTA5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X21hc3NhZ2VfaW5kZXgpOgorCSAgT0ssIHNvIHRoZSBvcmlnaW5hbCBjb2RlIHdhcyB0b28gc3RyaWN0LiBJdCBtYWtlcyByYW5kb20gQVZJIGZpbGVzCisJICBoYW5nIGZvciBzZWNvbmRzIHVwb24gb3BlbmluZywgd2hpY2ggaXMgdW5hY2NlcHRhYmxlIGFuZCBpcyBmYXIKKwkgIGJleW9uZCB0aGUgb3JpZ2luYWwgZ29hbCBvZiBnZXR0aW5nIG11bHRpcGxlIGNodW5rcyBmb3Igb25lLWNodW5rCisJICBzb3VuYyBzdHJlYW0gZmlsZXMuIFNvIG5vdyBkbyBqdXN0IHRoYXQuCisKKzIwMDQtMTAtMDkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoc2V0dXBfc291cmNlKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fY2hhbmdlX3N0YXRlKToKKwkgIEFjdHVhbGx5IGNsZWFuIHVwIHN0cmVhbWluZm8gaWYgb3V0cHV0IGZhaWxzLiBUaGlzIHdvdWxkIHRyaWdnZXIKKwkgIGlmLCBmb3IgZXhhbXBsZSwgdGhlcmUgd2FzIG5vIENEIGluIHRoZSBkcml2ZS4gTm8gcHJlcm9sbCwgc28KKwkgIGEgc3RyZWFtaW5mbyBzdHJ1Y3R1cmUgaXMgY3JlYXRlZCwgYnV0IHRoZSBzdWJzZXF1ZW50IHN0YXRlIGNoYW5nZQorCSAgb2YgdGhlIHRocmVhZCBmYWlscy4KKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnc3RfcGxheV9iaW5fY2hhbmdlX3N0YXRlKToKKwkgIERvbid0IGNoYW5nZSBzdGF0ZSBpZiBwYXJlbnQgZmFpbGVkLgorCisyMDA0LTEwLTA4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJpbi5jOiAoZ3N0X3BsYXlfYmluX2NsYXNzX2luaXQpLAorCShnc3RfcGxheV9iaW5faW5pdCksIChnc3RfcGxheV9iaW5fZ2V0X3Byb3BlcnR5KSwgKGhhbmRvZmYpLAorCShnZW5fdmlkZW9fZWxlbWVudCksIChyZW1vdmVfc2lua3MpOgorCSAgQWRkIHNtYWxsIGJpdHMgb2YgY29kZSBmb3Igc2NyZWVuc2hvdCBoYW5kbGluZy4KKworMjAwNC0xMC0wOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnc3RfcGxheV9iaW5fc2V0X3Byb3BlcnR5KSwKKwkoZ2VuX3ZpZGVvX2VsZW1lbnQpLCAoZ2VuX2F1ZGlvX2VsZW1lbnQpLCAoc2V0dXBfc2lua3MpOgorCURvbid0IGFzc3VtZSB0aGUgdXNlciBwcm92aWRlZCBzaW5rcyBhcmUgbmFtZWQgInNpbmsiLi4uCisKKzIwMDQtMTAtMDggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKGdlbl9wcmVyb2xsX2VsZW1lbnQpLAorCSh1bmtub3duX3R5cGUpLCAoc2V0dXBfc291cmNlKSwgKGdzdF9wbGF5X2Jhc2VfYmluX3JlbW92ZV9lbGVtZW50KSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fbGlua19zdHJlYW0pOgorCURvIG5vdCB0cnkgdG8gYXV0b3BsdWcgc291cmNlcyB0aGF0IGdlbmVyYXRlIHJhdyBzdHJlYW1zIGxpa2UKKwljZHBhcmFub2lhLgorCWRpc2Nvbm5lY3QgdGhlIHByZXJvbGwgb3ZlcnJ1biBzaWduYWwgd2hlbiB3ZSBkb24ndCBuZWVkIGl0IGFueW1vcmUuCisKKzIwMDQtMTAtMDggIE1pbG9zeiBEZXJlenluc2tpICA8aW50ZXJuYWxlcnJvci5yZXpAZmh0dy1iZXJsaW4uZGU+CisKKwkqIGV4dC9jZHBhcmFub2lhL2dzdGNkcGFyYW5vaWEuYzogKF9kb19pbml0KSwKKwlBZGRlZCByZXdvcmtlZCBwYXRjaCBmcm9tICMxNTQ5MDMgZnJvbSBtaWxvc3ogZGVyZXp5bnNraSAoZGVhZGNoaXApLgorCisyMDA0LTEwLTA4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L2NkcGFyYW5vaWEvZ3N0Y2RwYXJhbm9pYS5jOiAoX2RvX2luaXQpLAorCShjZHBhcmFub2lhX2Jhc2VfaW5pdCksIChjZHBhcmFub2lhX2NsYXNzX2luaXQpLCAoY2RwYXJhbm9pYV9pbml0KSwKKwkoY2RwYXJhbm9pYV9kaXNwb3NlKSwgKGNkcGFyYW5vaWFfZ2V0KSwgKGNkcGFyYW5vaWFfY2hhbmdlX3N0YXRlKSwKKwkoY2RwYXJhbm9pYV9jb252ZXJ0KSwgKGNkcGFyYW5vaWFfdXJpX2dldF90eXBlKSwKKwkoY2RwYXJhbm9pYV91cmlfZ2V0X3Byb3RvY29scyksIChjZHBhcmFub2lhX3VyaV9nZXRfdXJpKSwKKwkoY2RwYXJhbm9pYV91cmlfc2V0X3VyaSksIChjZHBhcmFub2lhX3VyaV9oYW5kbGVyX2luaXQpOgorCSogZXh0L2NkcGFyYW5vaWEvZ3N0Y2RwYXJhbm9pYS5oOgorCVRoaXMgYWRkcyB0aGUgY2RkYTovLzx0cmFja251bT4gdXJpLgorCisyMDA0LTEwLTA4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3BsYXliYWNrL2dzdGRlY29kZWJpbi5jOiAoZ3N0X2RlY29kZV9iaW5fY2xhc3NfaW5pdCksCisJKGdzdF9kZWNvZGVfYmluX2luaXQpLCAoZmluZF9jb21wYXRpYmxlcyksIChjbG9zZV9wYWRfbGluayksCisJKHRyeV90b19saW5rXzEpLCAobm9fbW9yZV9wYWRzKSwgKGNsb3NlX2xpbmspLCAodHlwZV9mb3VuZCk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKGdzdF9wbGF5X2Jhc2VfYmluX2NsYXNzX2luaXQpLAorCSh1bmtub3duX3R5cGUpLCAoZ3N0X3BsYXlfYmFzZV9iaW5fcmVtb3ZlX2VsZW1lbnQpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9saW5rX3N0cmVhbSk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uaDoKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnc3RfcGxheV9iaW5faW5pdCksCisJKGdzdF9wbGF5X2Jpbl9zZXRfcHJvcGVydHkpLCAoZ2VuX3ZpZGVvX2VsZW1lbnQpLAorCShnZW5fYXVkaW9fZWxlbWVudCksIChzZXR1cF9zaW5rcyk6CisJKiBnc3QvcGxheWJhY2svZ3N0c3RyZWFtaW5mby5jOiAoZ3N0X3N0cmVhbV90eXBlX2dldF90eXBlKSwKKwkoZ3N0X3N0cmVhbV9pbmZvX2dldF90eXBlKSwgKGdzdF9zdHJlYW1faW5mb19jbGFzc19pbml0KSwKKwkoZ3N0X3N0cmVhbV9pbmZvX2luaXQpLCAoZ3N0X3N0cmVhbV9pbmZvX25ldyksCisJKGdzdF9zdHJlYW1faW5mb19kaXNwb3NlKSwgKHN0cmVhbV9pbmZvX211dGVfcGFkKSwKKwkoZ3N0X3N0cmVhbV9pbmZvX3NldF9wcm9wZXJ0eSksIChnc3Rfc3RyZWFtX2luZm9fZ2V0X3Byb3BlcnR5KToKKwkqIGdzdC9wbGF5YmFjay9nc3RzdHJlYW1pbmZvLmg6CisJUmV1c2UgdGhlIGF1ZGlvIGFuZCB2aWRlbyBiaW5zLgorCVNvbWUgaW50ZXJuYWwgY2xlYW51cHMgaW4gdGhlIHN0cmVhbSBzZWxlY3Rpb24gY29kZS4KKworMjAwNC0xMC0wOCAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3NpbmtfbGluayksCisJKGdzdF94aW1hZ2VzaW5rX3NldF94d2luZG93X2lkKSwgKGdzdF94aW1hZ2VzaW5rX2luaXQpOgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmg6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3NpbmtfbGluayksCisJKGdzdF94dmltYWdlc2lua19zZXRfeHdpbmRvd19pZCksIChnc3RfeHZpbWFnZXNpbmtfaW5pdCk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5oOiBSZXZlcnRpbmcgUm9uYWxkJ3MgY2hhbmdlcyBhcyB0aGUgaXNzdWUgaXMKKwlub3QgY29taW5nIGZyb20gdGhvc2UgZWxlbWVudHMuIE1vcmVvdmVyIHRoZXNlIGVsZW1lbnRzIHNob3VsZCBub3Qga2VlcAorCXRoZSB4aWQgdGhleSBoYXZlIGJlZW4gZ2l2ZW4gd2hlbiBpbiBOVUxMIHN0YXRlLgorCisyMDA0LTEwLTA3ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3NpbmtfbGluayksCisJKGdzdF94aW1hZ2VzaW5rX3NldF94d2luZG93X2lkKSwgKGdzdF94aW1hZ2VzaW5rX2luaXQpOgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmg6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3NpbmtfbGluayksCisJKGdzdF94dmltYWdlc2lua19zZXRfeHdpbmRvd19pZCksIChnc3RfeHZpbWFnZXNpbmtfaW5pdCk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5oOgorCSAgQWN0dWFsbHkgb25seSBjcmVhdGUgYSBuZXcgdG9wbGV2ZWwgd2luZG93IGlmIHdlJ3JlIG5vdCBnb25uYQorCSAgZW1iZWQgaXQgcmlnaHQgYWZ0ZXIuCisKKzIwMDQtMTAtMDcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKHBsYXlfYmFzZV9iaW5fbXV0ZV9wYWQpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9tdXRlX3N0cmVhbSksIChnc3RfcGxheV9iYXNlX2Jpbl9saW5rX3N0cmVhbSk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJpbi5jOiAoc2V0dXBfc2lua3MpOgorCUltcGxlbWVudCBtdXRpbmcvdW5tdXRpbmcgb2Ygc3RyZWFtcywgbXV0ZSBzdHJlYW1zIHRoYXQgYXJlIG5vdAorCXVzZWQuCisKKzIwMDQtMTAtMDcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKGFjM190eXBlX2ZpbmQpLAorCShwbHVnaW5faW5pdCk6CisJQWRkZWQgbGFtZSBhdWRpby94LWFjMyB0eXBlZmluZCBmdW5jdGlvbi4KKworMjAwNC0xMC0wNiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGJ1bXAgbmFubyB0byBjdnMKKworPT09IHJlbGVhc2UgMC44LjUgPT09CisKKzIwMDQtMTAtMDYgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgKGF0KSBhcGVzdGFhcnQgKGRvdCkgb3JnPgorCisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIHJlbGVhc2luZyAwLjguNSwgIlRha2UgWW91IE9uIgorCisyMDA0LTEwLTA2ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3BsYXliYWNrL2dzdGRlY29kZWJpbi5jOiAoZ3N0X2RlY29kZV9iaW5faW5pdCksCisJKGZpbmRfY29tcGF0aWJsZXMpLCAoY2xvc2VfcGFkX2xpbmspLCAodHJ5X3RvX2xpbmtfMSksIChuZXdfcGFkKSwKKwkobm9fbW9yZV9wYWRzKSwgKGNsb3NlX2xpbmspLCAodHlwZV9mb3VuZCk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKG5ld19kZWNvZGVkX3BhZCk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJpbi5jOiAoZ2VuX3ZpZGVvX2VsZW1lbnQpOgorCURvIG5vdCBzaWduYWwgdGhlIG5vX21vcmVfcGFkcyBhZnRlciB0aGUgZmlyc3QgcGFkIHdoZW4KKwl3ZSBhcmUgcGx1Z2dpbmcgYSBub24gZHluYW1pYyBlbGVtZW50IHdpdGggbXVsdGlwbGUKKwlvdXRwdXQgcGFkcyAobGlrZSBzd2ZkZWMsIGR2ZGVjLCAuLi4pLgorCisyMDA0LTEwLTA2ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBidW1wIGZvciBwcmVyZWxlYXNlCisKKzIwMDQtMTAtMDYgIFN0ZXBoYW5lIExvZXVpbGxldCAgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIGFkZCBBVFJBQzMgdG8gU1RBVElDIENBUFMgdG8gZml4IGEgd2FybmluZworCisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6CisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLXJlYWQuYzoKKwkgIGZpeCB0eXBvcworCisyMDA0LTEwLTA2ICBTdGVwaGFuZSBMb2V1aWxsZXQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOgorCSAgZ2VuZXJhdGUgY2FwcyBmb3IgQVRSQUMzIGF1ZGlvIHN0cmVhbXMKKworCSogZ3N0L3JlYWxtZWRpYS9ybWRlbXV4LmM6CisJICBnZW5lcmF0ZSBjYXBzIGZvciBBVFJBQzMgYXVkaW8gc3RyZWFtcworCisyMDA0LTEwLTA2ICBTdGVwaGFuZSBMb2V1aWxsZXQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZ3N0L3dhdnBhcnNlL01ha2VmaWxlLmFtCisJKiBnc3Qvd2F2cGFyc2UvcmlmZi5oCisJKiBnc3Qvd2F2cGFyc2Uvd2F2cGFyc2UudmNwcm9qCisJICByaWZmLmggcmVtb3ZhbCAodW51c2VkIGFuZCBkdXBsaWNhdGlvbiB3aXRoIHJpZmYtaWRzLmgpCisKKzIwMDQtMTAtMDYgIFN0ZXBoYW5lIExvZXVpbGxldCAgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuaAorCSAgcmVtb3ZlIGR1cGxpY2F0ZWQgZGVmaW5lcyBmb3IgYXVkaW8gY29kZWMgY29kZXMKKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1pZHMuaAorCSogZ3N0L3dhdmVuYy9yaWZmLmg6CisJICBhZGQgIjRDQyIgY29kZSBmb3IgQVRSQUMzIGF1ZGlvIHN0cmVhbXMKKwkgIGFkZCAiNENDIiBjb2RlIGZvciBJVFVfRzcyMV9BRFBDTSAodW51c2VkIGZvciBub3cpCisKKzIwMDQtMTAtMDYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOiAoZ3N0X2ZseGRlY19pbml0KSwgKGdzdF9mbHhkZWNfbG9vcCk6CisJQWN0dWFsbHkgX2RvXyBuZWdvdGlhdGlvbi4gUGFzcyBnZG91YmxlIGFzIGFyZyBpbnN0ZWFkCisJb2YgZ3VpbnQ2NCBmb3IgdGhlIGZyYW1lcmF0ZS4KKworMjAwNC0xMC0wNiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RkZWNvZGViaW4uYzogKGdzdF9kZWNvZGVfYmluX2luaXQpLAorCShmaW5kX2NvbXBhdGlibGVzKSwgKGNsb3NlX3BhZF9saW5rKSwgKHRyeV90b19saW5rXzEpLAorCShub19tb3JlX3BhZHMpLCAoY2xvc2VfbGluayksICh0eXBlX2ZvdW5kKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAobmV3X2RlY29kZWRfcGFkKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnZW5fdmlkZW9fZWxlbWVudCksCisJKGdlbl9hdWRpb19lbGVtZW50KToKKwlTZXQgc3RhdGUgb24gbmV3bHkgYWRkZWQgZWxlbWVudCB0byBSRUFEWSBzbyB0aGF0IG5lZ290aWF0aW9uCisJY2FuIGhhcHBlbiBBU0FQLgorCUFkZGVzIHNvbWUgbW9yZSBkZWJ1ZyBpbmZvLgorCURvIG5vdCB0cnkgdG8gcGx1ZyBwYWRzIHdpdGggbXVsdGlwbGUgY2FwcyBzdHJ1Y3R1cmVzIG9yIEFOWQorCWJlY2F1c2UgaXQgaXMgdG9vIGRhbmdlcm91cyBzaW5jZSB3ZSBkbyBub3QgZG8gZHluYW1pYworCXJlcGx1Z2dpbmcuCisKKzIwMDQtMTAtMDYgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwl3cml0dGVuIGJ5OiBHb3JhIE1vaGFudHkgPGdvcmFfbW9oYW50eUB5YWhvby5jby5pbj4KKworCSogcG8vTElOR1VBUzoKKwkqIHBvL29yLnBvOgorCSAgYWRkIE9yaXlhIHRyYW5zbGF0aW9uCisKKzIwMDQtMTAtMDUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfbWFzc2FnZV9pbmRleCk6CisJICBQcmV2ZW50IG92ZXJ3cml0ZSBvZiBzaXplIG1lbWJlci4gTWFrZXMgYXVkaW8gc291bmQgY3JhcHB5LgorCisyMDA0LTEwLTA1ICBTdGVwaGFuZSBMb2V1aWxsZXQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChwbHVnaW5faW5pdCk6CisJQWRkIHJtdmIgdG8gdGhlIGxpc3Qgb2Yga25vd24gUmVhbE1lZGlhIGV4dGVuc2lvbnMKKworMjAwNC0xMC0wNSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9saWJtbmcvZ3N0bW5nZGVjLmM6IChnc3RfbW5nZGVjX2xvb3ApLCAobW5nZGVjX2Vycm9yKSwKKwkobW5nZGVjX29wZW5zdHJlYW0pLCAobW5nZGVjX2Nsb3Nlc3RyZWFtKSwKKwkobW5nZGVjX2hhbmRsZV9zaW5rX2V2ZW50KSwgKG1uZ2RlY19yZWFkZGF0YSksCisJKG1uZ2RlY19nZXR0aWNrY291bnQpLCAobW5nZGVjX3NldHRpbWVyKSwgKG1uZ2RlY19wcm9jZXNzaGVhZGVyKSwKKwkobW5nZGVjX2dldGNhbnZhc2xpbmUpLCAobW5nZGVjX3JlZnJlc2gpLAorCShnc3RfbW5nZGVjX2NoYW5nZV9zdGF0ZSk6CisJU2V0IHRoZSBmcmFtZXJhdGUgY29ycmVjdGx5LgorCisyMDA0LTEwLTA0ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X21hc3NhZ2VfaW5kZXgpOgorCSAgVGhlcmUgd2FzIHNvbWV0aGluZyB3cm9uZyB3aXRoIHRoZSBpbmRleCBtYXNzYWdpbmcuCisKKzIwMDQtMTAtMDQgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvanBlZy9nc3RqcGVnLmM6IChzbW9rZV90eXBlX2ZpbmQpLCAocGx1Z2luX2luaXQpOgorCSogZXh0L2pwZWcvZ3N0c21va2VkZWMuYzogKGdzdF9zbW9rZWRlY19pbml0KSwKKwkoZ3N0X3Ntb2tlZGVjX2NoYWluKToKKwkqIGV4dC9qcGVnL2dzdHNtb2tlZGVjLmg6CisJKiBleHQvanBlZy9nc3RzbW9rZWVuYy5jOiAoZ3N0X3Ntb2tlZW5jX2NsYXNzX2luaXQpLAorCShnc3Rfc21va2VlbmNfaW5pdCksIChnc3Rfc21va2VlbmNfcmVzeW5jKSwgKGdzdF9zbW9rZWVuY19jaGFpbik6CisJKiBleHQvanBlZy9nc3RzbW9rZWVuYy5oOgorCSogZXh0L2pwZWcvc21va2Vjb2RlYy5jOiAoc21va2Vjb2RlY19lbmNvZGVfbmV3KSwKKwkoc21va2Vjb2RlY19kZWNvZGVfbmV3KSwgKHNtb2tlY29kZWNfaW5mb19mcmVlKSwKKwkoc21va2Vjb2RlY19zZXRfcXVhbGl0eSksIChzbW9rZWNvZGVjX2dldF9xdWFsaXR5KSwKKwkoc21va2Vjb2RlY19zZXRfdGhyZXNob2xkKSwgKHNtb2tlY29kZWNfZ2V0X3RocmVzaG9sZCksCisJKHNtb2tlY29kZWNfc2V0X2JpdHJhdGUpLCAoc21va2Vjb2RlY19nZXRfYml0cmF0ZSksCisJKGZpbmRfYmVzdF9zaXplKSwgKGFic19kaWZmKSwgKHB1dCksIChzbW9rZWNvZGVjX2VuY29kZV9pZCksCisJKHNtb2tlY29kZWNfZW5jb2RlKSwgKHNtb2tlY29kZWNfcGFyc2VfaWQpLAorCShzbW9rZWNvZGVjX3BhcnNlX2hlYWRlciksIChzbW9rZWNvZGVjX2RlY29kZSk6CisJKiBleHQvanBlZy9zbW9rZWNvZGVjLmg6CisJKiBleHQvanBlZy9zbW9rZWZvcm1hdC5oOgorCVVwZGF0ZWQgc21va2UsIG5ldyBiaXRzdHJlYW0sIGFsbG93cyBlbWJlZGRpbmcgaW4gb2dnLgorCisyMDA0LTEwLTA0ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpOgorCSAgRml4IHNlZWtpbmcgaW4gc29tZSBmaWxlcy4gQWxsIHRoaXMgY29kZSBpcyBubyBsb25nZXIgbmVlZGVkIChhbmQKKwkgIGFjdHVhbGx5IGJyZWFrcyBzdHVmZikgYmVjYXVzZSB3ZSBub3cgc3luY2hyb25pemUgdGhlIGZ1bGwgaW5kZXgKKwkgIHJpZ2h0IHdoZW4gcmVhZGluZyB0aGUgaGVhZGVyLgorCisyMDA0LTEwLTA0ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCWNvbmZpZ3VyZSB1cGRhdGUgZm9yIGxpYm1uZy4KKworMjAwNC0xMC0wNCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9saWJtbmcvTWFrZWZpbGUuYW06CisJKiBleHQvbGlibW5nL2dzdG1uZy5jOiAocGx1Z2luX2luaXQpOgorCSogZXh0L2xpYm1uZy9nc3RtbmcuaDoKKwkqIGV4dC9saWJtbmcvZ3N0bW5nZGVjLmM6IChnc3RfbW5nZGVjX2dldF90eXBlKSwKKwkoZ3N0X21uZ2RlY19iYXNlX2luaXQpLCAoZ3N0X21uZ2RlY19jbGFzc19pbml0KSwKKwkoZ3N0X21uZ2RlY19zaW5rbGluayksIChnc3RfbW5nZGVjX2luaXQpLCAoZ3N0X21uZ2RlY19zcmNfZ2V0Y2FwcyksCisJKGdzdF9tbmdkZWNfbG9vcCksIChnc3RfbW5nZGVjX2dldF9wcm9wZXJ0eSksCisJKGdzdF9tbmdkZWNfc2V0X3Byb3BlcnR5KSwgKG1uZ2RlY19lcnJvciksIChtbmdkZWNfb3BlbnN0cmVhbSksCisJKG1uZ2RlY19jbG9zZXN0cmVhbSksIChtbmdkZWNfaGFuZGxlX3NpbmtfZXZlbnQpLAorCShtbmdkZWNfcmVhZGRhdGEpLCAobW5nZGVjX2dldHRpY2tjb3VudCksIChtbmdkZWNfc2V0dGltZXIpLAorCShtbmdkZWNfcHJvY2Vzc2hlYWRlciksIChtbmdkZWNfZ2V0Y2FudmFzbGluZSksIChtbmdkZWNfcmVmcmVzaCksCisJKGdzdF9tbmdkZWNfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9saWJtbmcvZ3N0bW5nZGVjLmg6CisJKiBleHQvbGlibW5nL2dzdG1uZ2VuYy5jOiAoZ3N0X21uZ2VuY19nZXRfdHlwZSksCisJKG1uZ19jYXBzX2ZhY3RvcnkpLCAocmF3X2NhcHNfZmFjdG9yeSksIChnc3RfbW5nZW5jX2Jhc2VfaW5pdCksCisJKGdzdF9tbmdlbmNfY2xhc3NfaW5pdCksIChnc3RfbW5nZW5jX3NpbmtsaW5rKSwgKGdzdF9tbmdlbmNfaW5pdCksCisJKGdzdF9tbmdlbmNfY2hhaW4pLCAoZ3N0X21uZ2VuY19nZXRfcHJvcGVydHkpLAorCShnc3RfbW5nZW5jX3NldF9wcm9wZXJ0eSk6CisJKiBleHQvbGlibW5nL2dzdG1uZ2VuYy5oOgorCUFkZGVkIGJhc2ljIE1ORyBkZWNvZGVyLiBOZWVkcyBtb3JlIHdvcmsuIFRoZSBlbmNvZGVyIGRvZXMKKwlub3Qgd29yayB5ZXQuCisKKzIwMDQtMTAtMDQgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9yZWFsbWVkaWEvcm1kZW11eC5jOiAoZ3N0X3JtZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQpLAorCShnc3Rfcm1kZW11eF9sb29wKSwgKGdzdF9ybWRlbXV4X2FkZF9zdHJlYW0pLAorCShnc3Rfcm1kZW11eF9wYXJzZV9tZHByKSwgKGdzdF9ybWRlbXV4X2R1bXBfbWRwcik6CisJICBEb24ndCBoYW5nIG9uIGxlbmd0aD0wIGNodW5rcy4gU29tZSBuZWdvdGlhdGlvbiBmaXhlcy4gU2lnbmFsCisJICBuby1tb3JlLXBhZHMuCisKKzIwMDQtMTAtMDQgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIHlvdSBuZWVkIGF0IGxlYXN0IDEuMC40IG9mIHNwZWV4CisKKzIwMDQtMTAtMDQgSWFpbiA8aWFpbmdub21lQGdtYWlsLmNvbT4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmg6IFJldmVydCB0aGUgaW5jbHVkZXMgY2hhbmdlcy4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLltjaF06IFJldmVydCB0aGUgaW5jbHVkZXMgY2hhbmdlcy4KKworMjAwNC0wOS0zMCBJYWluIDxpYWluZ25vbWVAZ21haWwuY29tPgorCisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW8uYyAoZ3N0X3N1bmF1ZGlvc2lua19vcGVuKTogVXNlIHRoZSBkZXZpY2UKKwlmb3VuZCBkdXJpbmcgaW5pdCBvciBzZXQgYXMgYSBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGhhcmRjb2RpbmcgL2Rldi9hdWRpbworCisyMDA0LTEwLTA0ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcmVhbG1lZGlhL3JtZGVtdXguYzogKGdzdF9ybWRlbXV4X2NsYXNzX2luaXQpLAorCShnc3Rfcm1kZW11eF9pbml0KSwgKGdzdF9ybWRlbXV4X2hhbmRsZV9zaW5rX2V2ZW50KSwKKwkoZ3N0X3JtZGVtdXhfbG9vcCksIChnc3Rfcm1kZW11eF9hZGRfc3RyZWFtKSwgKHJlX2hleGR1bXBfYnl0ZXMpLAorCShyZV9kdW1wX3Bhc2NhbF9zdHJpbmcpLCAoZ3N0X3JtZGVtdXhfZHVtcF9fcm1mKSwKKwkoZ3N0X3JtZGVtdXhfZHVtcF9wcm9wKSwgKGdzdF9ybWRlbXV4X3BhcnNlX21kcHIpLAorCShnc3Rfcm1kZW11eF9kdW1wX21kcHIpLCAoZ3N0X3JtZGVtdXhfZHVtcF9pbmR4KSwKKwkoZ3N0X3JtZGVtdXhfZHVtcF9kYXRhKToKKwkgIFVzZSBkZWJ1ZyBjYXRlZ29yeSwgZml4IEVPUyBoYW5kbGluZy4gZmlsZXNyYyAhIHJtZGVtdXggbm93CisJICB3b3Jrcy4KKworMjAwNC0xMC0wNCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5kZXgpLAorCShnc3RfYXZpX2RlbXV4X3N0cmVhbV9zY2FuKSwgKHNvcnQpLCAoZ3N0X2F2aV9kZW11eF9tYXNzYWdlX2luZGV4KSwKKwkoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyKSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2RhdGEpOgorCSAgSW1wcm92ZSBhbGxvY2F0aW9uLCBjdXR0aW5nIGFuZCBzb3J0aW5nIG9mIHRoZSBpbmRleC4gSG93IHRha2VzIGEKKwkgIGZldyBzZWNvbmRzIGluc3RlYWQgb2YgbWludXRlcy4KKworMjAwNC0xMC0wMyAgQ2hyaXN0b3BoZSBGZXJnZWF1ICA8dGV1ZkBnbm9tZS5vcmc+CisKKwkqIGdzdC9yZWFsbWVkaWEvcm1kZW11eC5jOiAoZ3N0X3JtZGVtdXhfcGFyc2VfbWRwcik6CisJICBmaXhlZCBjb21waWxhdGlvbgorCisyMDA0LTEwLTAyICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6CisJKGdzdF9yaWZmX2NyZWF0ZV92aWRlb19jYXBzX3dpdGhfZGF0YSksCisJKGdzdF9yaWZmX2NyZWF0ZV92aWRlb190ZW1wbGF0ZV9jYXBzKToKKwkgIEFkZCB3aW5nIGNvbW1hbmRlciBmb3JtYXQgbWltZXR5cGUvZm91cmNjcy4KKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfbWFzc2FnZV9pbmRleCk6CisJICBEb24ndCBjcmFzaCBpZiBzb21lIHZhbHVlIGlzIDAuCisKKzIwMDQtMTAtMDIgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtbWVkaWEuYzoKKwkoZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX2NhcHNfd2l0aF9kYXRhKSwKKwkoZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX3RlbXBsYXRlX2NhcHMpOgorCSAgQWRkIERJQiBmb3VyY2MgKHJhdywgcGFsZXR0aXplZCA4LWJpdCBSR0IpLgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6CisJKGdzdF9yaWZmX3JlYWRfc3RyZl92aWRzX3dpdGhfZGF0YSk6CisJICBPb3BzLCBmaXggc3RyZl9kYXRhIHJlYWRpbmcgYnVnLgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9hZGRfc3RyZWFtKToKKwkgIFVzZSBhIG5vbi1OVUxMIHRhZy4KKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBUaW1lIGZvciBoYWNrcy4gU29ycnkgRGF2ZS4gQXQgbGVhc3Qgb25lIHF1aWNrdGltZSBtb3ZpZSAoYQorCSAgdHJhaWxlcikgdGhhdCBJJ3ZlIGVuY291bnRlcmVkIGNvbnRhaW5zIG11bHRpcGxlIHZpZGVvIHRyYWNrcy4KKwkgIE9uZSBvZiB0aG9zZSBpcyB0aGUgYWN0dWFsIHZpZGVvIHRyYWNrLCB0aGUgb3RoZXIgYXJlIG9uZS1mcmFtZQorCSAgdHJhY2tzIChpbWFnZXMpLiBVbmZvcnR1bmF0ZWx5LCB0aGUgbnVtYmVyIG9mIGZyYW1lcyBhY2NvcmRpbmcKKwkgIHRvIHRoZSB0cmFrIGhlYWRlciBpcyAxIGZvciBlYWNoLCBzbyB0aGF0IGRvZXNuJ3QgaGVscC4gU28KKwkgIGluc3RlYWQsIEkgbG9vayBhdCB0aGUgZHVyYXRpb24gYW5kIGRpc2NhcmQgdHJhY2tzIHdpdGggYQorCSAgZHVyYXRpb24gc2hvcnRlciB0aGFuIDIwJSBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJlYW0uIEJldHRlcgorCSAgdGhhbiBub3RoaW5nLgorCisyMDA0LTEwLTAxICBDaHJpc3RpYW4gU2NoYWxsZXIgPGNocmlzdGlhbkBmbHVlbmRvLmNvbT4KKworCSogZXh0L2l2b3JiaXMvdm9yYmlzLmM6CisJICBQYXRjaCBmcm9tIFBoaWwgQmx1bmRlbGwgKEJ1ZyAxNTIzNDEpCisKKzIwMDQtMTAtMDEgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzogKGdzdF9zcGVleF9kZWNfY2xhc3NfaW5pdCksCisJKHNwZWV4X2RlY19nZXRfZm9ybWF0cyksIChzcGVleF9kZWNfY29udmVydCksCisJKHNwZWV4X2RlY19zcmNfcXVlcnkpLCAoc3BlZXhfZGVjX3NyY19ldmVudCksIChzcGVleF9kZWNfZXZlbnQpLAorCShzcGVleF9kZWNfY2hhaW4pLCAoZ3N0X3NwZWV4ZGVjX2dldF9wcm9wZXJ0eSksCisJKGdzdF9zcGVleGRlY19zZXRfcHJvcGVydHkpOgorCVNtYWxsIGNsZWFudXBzLgorCisyMDA0LTEwLTAxICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfY2xhc3NfaW5pdCksCisJKGdzdF93YXZwYXJzZV9zdHJlYW1faW5pdCksIChnc3Rfd2F2cGFyc2VfZm10KSwKKwkoZ3N0X3dhdnBhcnNlX290aGVyKSwgKGdzdF93YXZwYXJzZV9sb29wKSwKKwkoZ3N0X3dhdnBhcnNlX3BhZF9jb252ZXJ0KSwgKGdzdF93YXZwYXJzZV9wYWRfcXVlcnkpLAorCShnc3Rfd2F2cGFyc2Vfc3JjcGFkX2V2ZW50KToKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5oOgorCUFkZGVkIHNvbWUgbW9yZSBkZWJ1Z2dpbmcgaW5mby4KKwlGaXggdGhlIGNhc2Ugd2hlcmUgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZSBpcyAwLgorCU1ha2Ugc3VyZSB3ZSBzZWVrIHRvIHNhbXBsZSBib3JkZXJzLgorCisyMDA0LTEwLTAxICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3BsYXliYWNrL1JFQURNRToKKwkqIGdzdC9wbGF5YmFjay9nc3RkZWNvZGViaW4uYzogKGdzdF9kZWNvZGVfYmluX2ZhY3RvcnlfZmlsdGVyKSwKKwkoZ3N0X2RlY29kZV9iaW5faW5pdCksIChmaW5kX2NvbXBhdGlibGVzKSwgKGNsb3NlX3BhZF9saW5rKSwKKwkodHJ5X3RvX2xpbmtfMSksIChub19tb3JlX3BhZHMpLCAoY2xvc2VfbGluayksICh0eXBlX2ZvdW5kKToKKwlBZGQgc29tZSBkZWJ1ZyBpbmZvIHRvIGRlY29kZWJpbiwgdXBkYXRlIFJFQURNRQorCisyMDA0LTEwLTAxICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZHZkbmF2L2R2ZG5hdnNyYy5jOiAoZHZkbmF2X2hhbmRsZV9uYXZpZ2F0aW9uX2V2ZW50KToKKwkgIERvbid0IHVzZSBnX3ByaW50KCk7IHVzZSBHU1RfREVCVUcoKS4KKworMjAwNC0xMC0wMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L29nZy9nc3RvZ2dtdXguYzogKGdzdF9vZ2dfbXV4X25leHRfYnVmZmVyKSwKKwkoZ3N0X29nZ19tdXhfcXVldWVfcGFkcyk6CisJICBIYW5kbGUgRU9TIHByb3Blcmx5LgorCisyMDA0LTEwLTAxICBTZWJhc3RpZW4gQ290ZSAgPHNjNUBoZXJtZXMudXNoZXJiLmNhPgorCisJUmV2aWV3ZWQgYnk6IFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9mYWFkL2dzdGZhYWQuYzogKGdzdF9mYWFkX2luaXQpLCAoZ3N0X2ZhYWRfc2lua2Nvbm5lY3QpLAorCShnc3RfZmFhZF9jaGFpbiksIChnc3RfZmFhZF9jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L2ZhYWQvZ3N0ZmFhZC5oOgorCSAgQWxsb3cgcGxheWJhY2sgb2YgcmF3ICh1bmZyYW1lZCkgTVBFRyBBQUMgZmlsZXMgKCMxNDg5OTMpLgorCisyMDA0LTEwLTAxICBTZWJhc3RpZW4gQ290ZSAgPHNjNUBoZXJtZXMudXNoZXJiLmNhPgorCisJUmV2aWV3ZWQgYnk6IFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2ZtdCk6CisJICBUaHJvdyBlcnJvciBpZiB3ZSBkaWRuJ3QgcmVjb2duaXplIHRoZSBzdHJlYW0uIEZpeGVzICMxNTIyODkuCisKKzIwMDQtMTAtMDEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC92aWRlb3NjYWxlL2dzdHZpZGVvc2NhbGUuYzogKGdzdF92aWRlb3NjYWxlX2xpbmspOgorCSAgRml4IG5lZ290aWF0aW9uLgorCisyMDA0LTEwLTAxICBGcmFuY2lzIExhYm9udGUgIDxmcmFuY2lzX2xhYm9udGVAaG90bWFpbC5jb20+CisKKwlSZXZpZXdlZCBieTogUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfZm10KToKKwkgIEZpeCBtZW1sZWFrLgorCisyMDA0LTEwLTAxICBCYWxhbXVyYWxpIFZpc3dhbmF0aGFuICA8YmFsYW11cmFsaS52aXN3YW5hdGhhbkB3aXByby5jb20+CisKKwlSZXZpZXdlZCBieTogUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvLmM6IChnc3Rfc3VuYXVkaW9zaW5rX3NldHBhcmFtcyk6CisJICBTb2x2ZSAjMTUyODA1LgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bm1peGVyLmM6IChnc3Rfc3VuYXVkaW9taXhlcl9zZXRfbXV0ZSk6CisJICBTb2x2ZSAxNTI4MDYuCisKKzIwMDQtMTAtMDEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtbWVkaWEuYzoKKwkoZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX2NhcHNfd2l0aF9kYXRhKSwKKwkoZ3N0X3JpZmZfY3JlYXRlX2F1ZGlvX2NhcHNfd2l0aF9kYXRhKToKKwkgIEFkZCBjb2RlY19kYXRhIGhhbmRsaW5nIChsaWtlIGFzZmRlbXV4IHVzZWQgdG8gZG8pLgorCSogZ3N0L2FzZmRlbXV4L2dzdGFzZi5jOiAocGx1Z2luX2luaXQpOgorCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6IChnc3RfYXNmX2RlbXV4X2Jhc2VfaW5pdCksCisJKGdzdF9hc2ZfZGVtdXhfYWRkX2F1ZGlvX3N0cmVhbSksIChnc3RfYXNmX2RlbXV4X2FkZF92aWRlb19zdHJlYW0pOgorCSAgVXNlIHJpZmYtbWVkaWEgZm9yIGNhcHMgY3JlYXRpb24gaW5zdGVhZCBvZiBvdXIgb3duIChtb3N0bHkKKwkgIGJyb2tlbikgY29weSBvZiBpdHMgZnVuY3Rpb25zLgorCisyMDA0LTEwLTAxICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvdjRsL3Y0bHNyY19jYWxscy5jOiAoZ3N0X3Y0bHNyY190cnlfY2FwdHVyZSk6CisJICBEb24ndCBhY3R1YWxseSBlcnJvciBvdXQgaWYgd2UgZ2V0IGFub3RoZXIgcmV0dXJuIHZhbHVlIHRoYW4KKwkgIC1FSU5WQUwuIE9wcG9zaXRlIHRvIHdoYXQgSSBmaXJzdCB0aG91Z2h0LCBkcml2ZXJzIGhhdmUgcmFuZG9tCisJICByZXR1cm4gdmFsdWVzIGZvciB0aGlzLCBhbHRob3VnaCAtRUlOVkFMIGlzIHRoZSBleHBlY3RlZCByZXR1cm4KKwkgIHZhbHVlLiBTaW5jZSB0aGlzIGlzIG5vdCBmYXRhbCwgd2Ugc2hvdWxkbid0IHVzZQorCSAgR1NUX0VMRU1FTlRfRVJST1IoKSBidXQganVzdCBHU1RfRVJST1JfT0JKRUNUKCkuCisKKzIwMDQtMTAtMDEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9kdmRyZWFkL2R2ZHJlYWRzcmMuYzogKGR2ZHJlYWRzcmNfY2xhc3NfaW5pdCksCisJKGR2ZHJlYWRzcmNfaW5pdCksIChkdmRyZWFkc3JjX2Rpc3Bvc2UpLCAoZHZkcmVhZHNyY19zZXRfcHJvcGVydHkpLAorCShkdmRyZWFkc3JjX2dldF9wcm9wZXJ0eSksIChfb3BlbiksIChfc2VlayksIChfcmVhZCksCisJKGR2ZHJlYWRzcmNfZ2V0KSwgKGR2ZHJlYWRzcmNfb3Blbl9maWxlKSwKKwkoZHZkcmVhZHNyY19jaGFuZ2Vfc3RhdGUpOgorCSAgRml4LiBEb24ndCBkbyBvbmUgYmlnIGh1Z2UgbG9vcCBhcm91bmQgdGhlIHdob2xlIERWRCwgdGhhdCB3aWxsCisJICBjYWNoZSBhbGwgZGF0YSBhbmQgdGh1cyBlYXQgc2l6ZW9mKGR2ZCkgKHNldmVyYWwgR0IpIGJlZm9yZSB3ZQorCSAgc2VlIHNvbWV0aGluZy4KKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5jOiAoZ3N0X3JpZmZfcmVhZF9zZWVrKToKKwkgIEFjdHVhbGx5IE5VTEwnaWZ5IGV2ZW50IGFmdGVyIHVzaW5nIGl0LgorCSogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOiAoZ3N0X2VibWxfcmVhZF91c2VfZXZlbnQpLAorCShnc3RfZWJtbF9yZWFkX2hhbmRsZV9ldmVudCksIChnc3RfZWJtbF9yZWFkX2VsZW1lbnRfaWQpLAorCShnc3RfZWJtbF9yZWFkX2VsZW1lbnRfbGVuZ3RoKSwgKGdzdF9lYm1sX3JlYWRfZWxlbWVudF9kYXRhKSwKKwkoZ3N0X2VibWxfcmVhZF9zZWVrKSwgKGdzdF9lYm1sX3JlYWRfc2tpcCk6CisJICBIYW5kbGUgZXZlbnRzLgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0ZHZkZGVtdXguYzogKGdzdF9kdmRfZGVtdXhfYmFzZV9pbml0KSwKKwkoZ3N0X2R2ZF9kZW11eF9pbml0KSwgKGdzdF9kdmRfZGVtdXhfZ2V0X2F1ZGlvX3N0cmVhbSksCisJKGdzdF9kdmRfZGVtdXhfZ2V0X3N1YnBpY3R1cmVfc3RyZWFtKSwgKGdzdF9kdmRfZGVtdXhfcGx1Z2luX2luaXQpOgorCSAgRml4IHRpbWluZyAodGhpcyB3aWxsIHByb2JhYmx5IGJyZWFrIGlmIEkgc2VlayB1c2luZyBtZW51cywgYnV0CisJICBJIGRpZG4ndCBnZXQgdGhlcmUgeWV0KS4gVk9CcyBhbmQgbm9ybWFsIERWRHMgc2hvdWxkIG5vdyB3b3JrLgorCSAgQWRkIGEgbXBlZzItb25seSBwYWQgd2l0aCBoaWdoIHJhbmsgc28gdGhpcyBnZXQgYXV0b3BsdWdnZWQgZm9yCisJICBNUEVHLTIgbW92aWVzLgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ2RlbXV4LmM6IChnc3RfbXBlZ19kZW11eF9iYXNlX2luaXQpLAorCShnc3RfbXBlZ19kZW11eF9jbGFzc19pbml0KSwgKGdzdF9tcGVnX2RlbXV4X2luaXQpLAorCShnc3RfbXBlZ19kZW11eF9uZXdfb3V0cHV0X3BhZCksIChnc3RfbXBlZ19kZW11eF9nZXRfdmlkZW9fc3RyZWFtKSwKKwkoZ3N0X21wZWdfZGVtdXhfZ2V0X2F1ZGlvX3N0cmVhbSksCisJKGdzdF9tcGVnX2RlbXV4X2dldF9wcml2YXRlX3N0cmVhbSksIChnc3RfbXBlZ19kZW11eF9wYXJzZV9wYWNrZXQpLAorCShnc3RfbXBlZ19kZW11eF9wYXJzZV9wZXMpLCAoZ3N0X21wZWdfZGVtdXhfcGx1Z2luX2luaXQpOgorCSAgVXNlIHRoaXMgYXMgc2Vjb25kIHJhbmsgZm9yIE1QRUctMSBhbmQgTVBFRy0yLiBTdGlsbCB1c2UgdGhpcyBmb3IKKwkgIE1QRUctMSBidXQgdXNlIGR2ZGRlbXV4IGZvciBNUEVHLTIuCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVncGFyc2UuYzogKGdzdF9tcGVnX3BhcnNlX2NsYXNzX2luaXQpLAorCShnc3RfbXBlZ19wYXJzZV9pbml0KSwgKGdzdF9tcGVnX3BhcnNlX25ld19wYWQpLAorCShnc3RfbXBlZ19wYXJzZV9wYXJzZV9wYWNraGVhZCk6CisJICBUaW1pbmcuIE9ubHkgYWRkIHBhZCB0ZW1wbGF0ZSBpZiBpdCBleGlzdHMuIEFkZCBzaW5rIHRlbXBsYXRlIGZyb20KKwkgIGNsYXNzIGFuZCBub3QgZnJvbSBvdXJzZWx2ZXMuIFRoaXMgbWVhbnMgd2Ugd2lsbCBhbHdheXMgdXNlIHRoZQorCSAgY29ycmVjdCBzaW5rIHRlbXBsYXRlIGV2ZW4gaWYgaXQgaXMgbm90IHRoZSBvbmUgZGVmaW5lZCBpbiB0aGlzCisJICBmaWxlLgorCisyMDA0LTA5LTI5ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ2RlbXV4LmM6IChnc3RfbXBlZ19kZW11eF9wYXJzZV9wYWNrZXQpLAorCShnc3RfbXBlZ19kZW11eF9wYXJzZV9wZXMpOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ3BhcnNlLmM6IChnc3RfbXBlZ19wYXJzZV9wYXJzZV9wYWNraGVhZCk6CisJRml4IHBsYXliYWNrIG9mIG1wZWcgYWdhaW4sIHRpbWVzdGFtcHMgd2hlcmUgc2NyZXdlZCB1cCBieQorCXBhdGNoIDEuNjEuCisKKzIwMDQtMDktMjkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjZGVjX3NyY19xdWVyeSk6CisJICBPbmx5IHJldHVybiB0cnVlIGlmIHdlIGFjdHVhbGx5IGZpbGxlZCBzb21ldGhpbmcgaW4uIFByZXZlbnRzCisJICBwbGF5ZXIgYXBwbGljYXRpb25zIGZyb20gc2hvd2luZyBhIHJhbmRvbSBsZW5ndGggZm9yIGZsYWMgZmlsZXMuCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLXJlYWQuYzogKGdzdF9yaWZmX3JlYWRfY2xhc3NfaW5pdCksCisJKGdzdF9yaWZmX3JlYWRfdXNlX2V2ZW50KSwgKGdzdF9yaWZmX3JlYWRfaGFuZGxlX2V2ZW50KSwKKwkoZ3N0X3JpZmZfcmVhZF9zZWVrKSwgKGdzdF9yaWZmX3JlYWRfc2tpcCksIChnc3RfcmlmZl9yZWFkX3N0cmgpLAorCShnc3RfcmlmZl9yZWFkX3N0cmZfdmlkc193aXRoX2RhdGEpLAorCShnc3RfcmlmZl9yZWFkX3N0cmZfYXVkc193aXRoX2RhdGEpLCAoZ3N0X3JpZmZfcmVhZF9zdHJmX2lhdnMpOgorCSAgT0ssIG9rLCBzbyBJIGltcGxlbWVudGVkIGV2ZW50IGhhbmRsaW5nLiBBcHBhcmVudGx5IGl0J3Mgbm9ybWFsCisJICB0aGF0IHdlIHJlY2VpdmUgcmFuZG9tIGV2ZW50cyBhdCByYW5kb20gcG9pbnRzIHdpdGhvdXQgYXNraW5nCisJICBmb3IgaXQuCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3Jlc2V0KSwKKwkoZ3N0X2F2aV9kZW11eF9zcmNfY29udmVydCksIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpLAorCShnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5kZXgpLAorCShnc3RfYXZpX2RlbXV4X3N5bmMpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fc2NhbiksCisJKGdzdF9hdmlfZGVtdXhfbWFzc2FnZV9pbmRleCksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXIpLAorCShnc3RfYXZpX2RlbXV4X2hhbmRsZV9zZWVrKSwgKGdzdF9hdmlfZGVtdXhfcHJvY2Vzc19uZXh0X2VudHJ5KSwKKwkoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSksIChnc3RfYXZpX2RlbXV4X2xvb3ApOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgSW1wbGVtZW50IG5vbi1saW5lYWlyIGNodW5rIGhhbmRsaW5nIGFuZCBzdWJjaHVuayBwcm9jZXNzaW5nLgorCSAgVGhlIGZpcnN0IHNvbHZlcyBwbGF5YmFjayBvZiBBVkkgZmlsZXMgd2hlcmUgdGhlIGF1ZGlvIGFuZCB2aWRlbworCSAgZGF0YSBvZiBpbmRpdmlkdWFsIGJ1ZmZlcnMgdGhhdCB3ZSByZWFkIGFyZSBub3Qgc3luY2hyb25pemVkLgorCSAgVGhpcyBzaG91bGQgbm90IGhhcHBlbiBhY2NvcmRpbmcgdG8gdGhlIHdvbmRlcmZ1bCBBVkkgc3BlY3MsIGJ1dAorCSAgb2YgY291cnNlIGl0IGRvZXMgaGFwcGVuIGluIHJlYWxpdHkuIEl0IGlzIGFsc28gYSBwcmVyZXF1aXNpdGUgZm9yCisJICB0aGUgc2Vjb25kLiBTdWJjaHVuayBwcm9jZXNzaW5nIGFsbG93cyB1cyB0byBjdXQgY2h1bmtzIGluIHNtYWxsCisJICBwaWVjZXMgYW5kIHByb2Nlc3MgZWFjaCBvZiB0aGVzZSBwaWVjZXMgc2VwYXJhdGVseS4gVGhpcyBpcworCSAgcmVxdWlyZWQgYmVjYXVzZSBJJ3ZlIHNlZW4gc2V2ZXJhbCBBVkkgZmlsZXMgd2l0aCBpbmNyZWRpYmx5IGxhcmdlCisJICBhdWRpbyBjaHVua3MsIGV2ZW4gc29tZSBmaWxlcyB3aXRoIG9ubHkgb25lIGF1ZGlvIGNodW5rIGZvciB0aGUKKwkgIHdob2xlIGZpbGUuIFRoaXMgYWxsb3dzIGZvciBwcm9wZXIgcGxheWJhY2sgaW5jbHVkaW5nIHNlZWtpbmcuCisJICBUaGlzIHBhdGNoIGlzIHN1cHBvc2VkIHRvIGZpeCBhbGwgQVZJIEEvViBzeW5jIGlzc3Vlcy4KKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6IChnc3RfZmx4ZGVjX2NsYXNzX2luaXQpLAorCShmbHhfZGVjb2RlX2NodW5rcyksIChmbHhfZGVjb2RlX2NvbG9yKSwgKGdzdF9mbHhkZWNfbG9vcCk6CisJICBXb3JrLgorCSogZ3N0L21vZHBsdWcvZ3N0bW9kcGx1Zy5jYzoKKwkgIFByb3BlciByZXR1cm4gdmFsdWUgc2V0dGluZyBmb3IgdGhlIHF1ZXJ5KCkgZnVuY3Rpb24uCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKHNldHVwX3NvdXJjZSk6CisJICBCZWluZyBpbiBub24tcGxheWluZyBzdGF0ZSAoYWZ0ZXIsIGUuZy4sIEVPUykgaXMgbm90IG5lY2Vzc2FyaWx5CisJICBhIGJhZCB0aGluZy4gQWxsb3cgZm9yIHRoYXQuIFRoaXMgZml4ZXMgcGxheWJhY2sgb2Ygc2hvcnQgZmlsZXMuCisJICBUaGV5IGRvbid0IGFjdHVhbGx5IHBsYXliYWNrIGZ1bGx5IG5vdywgYmVjYXVzZSB0aGUgY2xvY2sgYWxyZWFkeQorCSAgcnVucy4gVGhpcyBtZWFucyB0aGF0IHNtYWxsIGZpbGVzICg8NTAwa0IpIHdpdGggYSBzbWFsbCBsZW5ndGgKKwkgICg8MnNlYykgd2lsbCBzdGlsbCBub3Qgb3IgYmFyZWx5IHBsYXkuIE90aGVyIGZpbGVzLCBzdWNoIGFzIG1vZAorCSAgb3IgZmx4LCB3aWxsIHdvcmsgY29ycmVjdGx5LCBob3dldmVyLgorCisyMDA0LTA5LTI4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4LmM6IChwbHVnaW5faW5pdCk6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzogKGdzdF9zcGVleF9kZWNfYmFzZV9pbml0KSwKKwkoZ3N0X3NwZWV4X2RlY19jbGFzc19pbml0KSwgKHNwZWV4X2RlY19nZXRfZm9ybWF0cyksCisJKHNwZWV4X2dldF9ldmVudF9tYXNrcyksIChzcGVleF9nZXRfcXVlcnlfdHlwZXMpLAorCShnc3Rfc3BlZXhfZGVjX2luaXQpLCAoc3BlZXhfZGVjX2NvbnZlcnQpLCAoc3BlZXhfZGVjX3NyY19xdWVyeSksCisJKHNwZWV4X2RlY19zcmNfZXZlbnQpLCAoc3BlZXhfZGVjX2V2ZW50KSwgKHNwZWV4X2RlY19jaGFpbiksCisJKGdzdF9zcGVleGRlY19nZXRfcHJvcGVydHkpLCAoZ3N0X3NwZWV4ZGVjX3NldF9wcm9wZXJ0eSksCisJKHNwZWV4X2RlY19jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmg6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleGVuY19nZXRfZm9ybWF0cyksCisJKGdzdF9zcGVleGVuY19nZXRfdHlwZSksIChzcGVleF9jYXBzX2ZhY3RvcnkpLCAocmF3X2NhcHNfZmFjdG9yeSksCisJKGdzdF9zcGVleGVuY19iYXNlX2luaXQpLCAoZ3N0X3NwZWV4ZW5jX2NsYXNzX2luaXQpLAorCShnc3Rfc3BlZXhlbmNfc2lua2Nvbm5lY3QpLCAoZ3N0X3NwZWV4ZW5jX2NvbnZlcnRfc3JjKSwKKwkoZ3N0X3NwZWV4ZW5jX2NvbnZlcnRfc2luayksIChnc3Rfc3BlZXhlbmNfZ2V0X3F1ZXJ5X3R5cGVzKSwKKwkoZ3N0X3NwZWV4ZW5jX3NyY19xdWVyeSksIChnc3Rfc3BlZXhlbmNfaW5pdCksCisJKGdzdF9zcGVleGVuY19nZXRfdGFnX3ZhbHVlKSwgKGNvbW1lbnRfaW5pdCksIChjb21tZW50X2FkZCksCisJKGdzdF9zcGVleGVuY19tZXRhZGF0YV9zZXQxKSwgKGdzdF9zcGVleGVuY19zZXRfbWV0YWRhdGEpLAorCShnc3Rfc3BlZXhlbmNfc2V0dXApLCAoZ3N0X3NwZWV4ZW5jX2J1ZmZlcl9mcm9tX2RhdGEpLAorCShnc3Rfc3BlZXhlbmNfcHVzaF9idWZmZXIpLCAoZ3N0X3NwZWV4ZW5jX3NldF9oZWFkZXJfb25fY2FwcyksCisJKGdzdF9zcGVleGVuY19jaGFpbiksIChnc3Rfc3BlZXhlbmNfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3NwZWV4ZW5jX3NldF9wcm9wZXJ0eSksIChnc3Rfc3BlZXhlbmNfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5oOgorCVJld3JvdGUgc3BlZXggZW5jb2RlciwgbWFrZSBzdXJlIGl0IGNhbiBiZSBlbWJlZGRlZCBpbiBvZ2cuCisJSW1wbGVtZW50ZWQgc3BlZXggZGVjb2Rlci4KKworMjAwNC0wOS0yOCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDxjaHJpc3RpYW5AZmx1ZW5kby5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwlSZW1vdmUga2lvc2xhdmUgcGx1Z2luLiBNYXJrZXkgaXMgYnJld2luZyBhIG5ldyB3b3JraW5nIG9uZQorCSogZXh0L01ha2VmaWxlLmFtOiBSZW1vdmUga2lvc2xhdmUgcGx1Z2luCisJKiBleHQva2lvOiByZW1vdmUKKwkqIGdzdC1wbHVnaW5zLnNwZWMuaW46IHJlbW92ZSBraW8gcGx1Z2luIGZyb20gc3BlYworCisyMDA0LTA5LTI3ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5jOiAoZ3N0X211bHRpZmRzaW5rX2FkZCksCisJKGdzdF9tdWx0aWZkc2lua19yZW1vdmUpLCAoZ3N0X211bHRpZmRzaW5rX3JlbW92ZV9jbGllbnRfbGluayksCisJKGlzX3N5bmNfZnJhbWUpLCAoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9xdWV1ZV9idWZmZXIpLAorCShnc3RfbXVsdGlmZHNpbmtfbmV3X2NsaWVudCksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50X3dyaXRlKSwKKwkoZ3N0X211bHRpZmRzaW5rX3JlY292ZXJfY2xpZW50KSwgKGdzdF9tdWx0aWZkc2lua19xdWV1ZV9idWZmZXIpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudHMpOgorCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5oOgorCU1ha2Ugc3luY2luZyB0byBrZXlmcmFtZXMgYWN0dWFsbHkgd29yayBmb3IgbmV3IGNsaWVudHMgYW5kIGxhZ2dpbmcKKwljbGllbnRzLgorCisyMDA0LTA5LTI2ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC9kZWJ1Zy9nc3RuYXZpZ2F0aW9udGVzdC5jOiAoZ3N0X25hdmlnYXRpb250ZXN0X2NsYXNzX2luaXQpLAorCShnc3RfbmF2aWdhdGlvbnRlc3RfaGFuZGxlX3NyY19ldmVudCksIChkcmF3X2JveF9wbGFuYXI0MTEpLAorCShnc3RfbmF2aWdhdGlvbnRlc3RfcGxhbmFyNDExKSwgKGdzdF9uYXZpZ2F0aW9udGVzdF9jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L2RlYnVnL2dzdG5hdmlnYXRpb250ZXN0Lmg6CisJICBtYWtlIG5hdmlnYXRpb250ZXN0IGRpc3BsYXkgYnV0dG9uLXByZXNzIGFuZCBidXR0b24tcmVsZWFzZSBldmVudHMKKworMjAwNC0wOS0yNiBJYWluIDxpYWluZ25vbWVAZ21haWwuY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmMgKGFsbF9jaGFubmVsc19uZXdfbWVkaWEpOiBDaGVja3MgaWYgYWxsCisJdGhlIGNoYW5uZWxzIGhhdmUgcmVjZWl2ZWQgYSBuZXcgbWVkaWEgZXZlbnQuCisJKGludGVybGVhdmVfYnVmZmVyZWRfbG9vcCk6IENvbXByZXNzZXMgYSBuZXcgbWVkaWEgZXZlbnQgb24gYWxsCisJY2hhbm5lbHMgaW50byBvbmUuCisKKzIwMDQtMDktMjYgSWFpbiA8aWFpbmdub21lQGdtYWlsLmNvbT4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYyAoZ3N0X3dhdmVuY19jaGFpbik6IENvbXBhbnkgc2F5cyB3ZSBuZWVkIHRvCisJY2FsbCB0aGUgc2lua3BhZCdzIGRlZmF1bHQgZXZlbnQgaGFuZGxlciBhbmQgbm90IHRoZSBzcmNwYWRzLiBIZSBhbHNvCisJc2F5cyB0aGlzIGlzIGNvbmZ1c2luZyA6KQorCShnc3Rfd2F2ZW5jX3N0b3BfZmlsZSk6IENvbXBhbnkgc2F5cyB0aGF0IHNlZWsgZXZlbnRzIG9ubHkgZ28gdXBzdHJlYW0KKwl3ZSBzaG91bGQgc2VuZCBhIGRpc2NvbnRpbnVvdXMgZG93bnN0cmVhbSBpbnN0ZWFkLgorCisyMDA0LTA5LTI1ICBDaHJpc3RpYW4gU2NoYWxsZXIgPGNocmlzdGlhbkBmbHVlbmRvLmNvbT4KKworCSogVXBkYXRlIFNQRUMgZmlsZSB0byBiZSB1c2FibGUgaW4gY29uanVuY3Rpb24gd2l0aCBGZWRvcmEgQ29yZSwKKwkgIEZlZG9yYS51cyBhbmQgZnJlc2hycG1zIHBhY2thZ2VzCisJKiBGaXggdHlwbyBpbiBtdWx0aWZpbGVzcmMgdGVzdCBNYWtlZmlsZQorCisyMDA0LTA5LTI0ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChuZXdfZGVjb2RlZF9wYWQpOgorCU9ubHkgc2lnbmFsIHRoZSBub19tb3JlX3BhZHMgc2lnbmFsIHdoZW4gd2UgaGF2ZQorCWFkZGVkIHRoZSBzdHJlYW0gdG8gb3VyIGxpc3QuCisKKzIwMDQtMDktMjQgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKHJlbW92ZV9wcmVyb2xscyksCisJKG5ld19kZWNvZGVkX3BhZCk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uaDoKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChzZXR1cF9zaW5rcyk6CisJRG9uJ3QgdHJ5IHRvIHByZXJvbGwgb3IgZGVjb2RlIG1vcmUgdGhhbiBvbmUgYXVkaW8vdmlkZW8KKwl0cmFjay4KKworMjAwNC0wOS0yNCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChnc3RfcGxheV9iYXNlX2Jpbl9jaGFuZ2Vfc3RhdGUpOgorCSAgVGhyb3cgZXJyb3IgaWYgd2UgZmFpbGVkIHRvIGZpbmQgYSBzdWl0YWJsZSBvdXRwdXQuIFRoaXMgc2hvdWxkCisJICB0aHJvdyBhbiBlcnJvciBpZiB3ZSBzdWNjZXNzZnVsbHkgc2V0IHVwIGEgcGlwZWxpbmUgKGUuZy4gYmVjYXVzZQorCSAgd2UgcmVjb2duaXplZCBhIG1lZGlhIGZpbGUpIGJ1dCBmb3VuZCBubyBkZWNvZGFibGUgc3RyZWFtcyBpbiBpdAorCSAgKGUuZy4gYmVjYXVzZSBpdCBjb250YWlucyBvbmx5IG1lZGlhIHN0cmVhbSB0eXBlcyBmb3Igd2hpY2ggd2UKKwkgIGhhdmUgbm8gZGVjb2RlcnMsIG9yIGJlY2F1c2UgaXQncyBub3QgYSBtZWRpYSB0eXBlKS4KKworMjAwNC0wOS0yMyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2RpcmFjL01ha2VmaWxlLmFtOgorCSogZXh0L2RpcmFjL2dzdGRpcmFjLmNjOgorCSogZXh0L2RpcmFjL2dzdGRpcmFjZGVjLmNjOgorCSogZXh0L2RpcmFjL2dzdGRpcmFjZGVjLmg6CisJICBEbyBzb21ldGhpbmcuIERvbid0IGFjdHVhbGx5IGtub3cgaWYgdGhpcyB3b3JrcyBiZWNhdXNlIEkgZG9uJ3QKKwkgIGhhdmUgYSBkZW11eGVyIHlldC4KKwkqIGV4dC9nc20vZ3N0Z3NtZGVjLmM6IChnc3RfZ3NtZGVjX2dldGNhcHMpOgorCSAgQWRkIGNoYW5uZWxzPTEgdG8gY2FwcyByZXR1cm5lZCBmcm9tIF9nZXRjYXBzKCkuCisJKiBleHQvb2dnL2dzdG9nbXBhcnNlLmM6IChnc3Rfb2dtX2F1ZGlvX3BhcnNlX2dldF90eXBlKSwKKwkoZ3N0X29nbV92aWRlb19wYXJzZV9nZXRfdHlwZSksIChnc3Rfb2dtX2F1ZGlvX3BhcnNlX2Jhc2VfaW5pdCksCisJKGdzdF9vZ21fdmlkZW9fcGFyc2VfYmFzZV9pbml0KSwgKGdzdF9vZ21fcGFyc2VfaW5pdCksCisJKGdzdF9vZ21fYXVkaW9fcGFyc2VfaW5pdCksIChnc3Rfb2dtX3ZpZGVvX3BhcnNlX2luaXQpLAorCShnc3Rfb2dtX3BhcnNlX3NpbmtfY29udmVydCksIChnc3Rfb2dtX3BhcnNlX2NoYWluKSwKKwkoZ3N0X29nbV9wYXJzZV9jaGFuZ2Vfc3RhdGUpOgorCSAgU2VwYXJhdGUgYmV0d2VlbiBhdWRpby92aWRlbyBzbyBvZ21hdWRpb3BhcnNlIGFjdHVhbGx5IHVzZXMgdGhlCisJICBhdWRpbyBwYWQgdGVtcGxhdGVzLiBCb3RoIGF1ZGlvIGFuZCB2aWRlbyB3b3JrIG5vdywgaW5jbHVkaW5nCisJICBhdXRvcGx1Z2dpbmcuIEFsc28gdXNlIHNvbWV0aW1lcy1zcmNwYWQgaGFjay4KKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5jOiAoZ3N0X3JpZmZfcmVhZF9zZWVrKToKKwkgIEhhbmRsZSBldmVudHMgYmV0dGVyLiBEb24ndCBoYW5nIG9uIGluZmluaXRlIGxvb3BzLgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9jbGFzc19pbml0KSwKKwkoZ3N0X2F2aV9kZW11eF9pbml0KSwgKGdzdF9hdmlfZGVtdXhfcmVzZXQpLAorCShnc3RfYXZpX2RlbXV4X3NyY19jb252ZXJ0KSwgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksCisJKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlciksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9kYXRhKSwKKwkoZ3N0X2F2aV9kZW11eF9jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgSW1wcm92ZSBBL1Ygc3luYy4gU3RpbGwgbm90IHBlcmZlY3QuCisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChnc3RfZWJtbF9yZWFkX3NlZWspLAorCShnc3RfZWJtbF9yZWFkX3NraXApOgorCSAgSGFuZGxlIGV2ZW50cyBiZXR0ZXIuCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9oYW5kbGVfc2lua19ldmVudCksCisJKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayksCisJKHF0ZGVtdXhfYXVkaW9fY2Fwcyk6CisJICBBZGQgSU1BNC4gSW1wcm92ZSBldmVudCBoYW5kbGluZy4gU2F2ZSBvZmZzZXQgYWZ0ZXIgYSBzZWVrIHdoZW4KKwkgIHRoZSBoZWFkZXJzIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHNvIHRoYXQgd2UgZG9uJ3QgZW5kIHVwIGluCisJICBhbiBpbmZpbml0ZSBsb29wLgorCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChxdF90eXBlX2ZpbmQpOgorCSAgQWRkIGxvdy1wcmlvcml0eSB0eXBlZmluZCBzdXBwb3J0IGZvciBmaWxlcyB3aXRoIG5vIGxlbmd0aC4KKworMjAwNC0wOS0yMyAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiB0ZXN0c3VpdGUvbXVsdGlmaWxlc2luay9NYWtlZmlsZS5hbToKKwlmaXggdHlwbworCisyMDA0LTA5LTIyICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfeGltYWdlX2Rlc3Ryb3kpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19jaGVja194c2htX2NhbGxzKTogRml4CisJbWlzdGFrZXMgZnJvbSB0aGF5dGFuJ3MgcGF0Y2hlcy4KKworMjAwNC0wOS0yMyAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3hpbWFnZV9kZXN0cm95KToKKwkgIEZvciBjb21wbGV0ZW5lc3MsIFhTeW5jIGluIHRoZSBkZXN0cm95IGZ1bmN0aW9uIGFzIHh2aW1hZ2UgZG9lcy4KKworMjAwNC0wOS0yMyAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5jOiAoZ3N0X3BpeGJ1ZnNjYWxlX2dldGNhcHMpOgorCSAgIENvcnJlY3QgY2FwcyBuZWdvdGlhdGlvbgorCSogZ3N0L3ZvbHVtZS9nc3R2b2x1bWUuYzogKHZvbHVtZV9jaGFpbl9mbG9hdCksCisJKHZvbHVtZV9jaGFpbl9pbnQxNik6CisJICAgTW9kaWZ5IGRlYnVnIG91dHB1dCB0byBiZSBsaXR0bGUgbW9yZSBpbmZvcm1hdGl2ZQorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19jaGVja194c2htX2NhbGxzKToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfY2hlY2tfeHNobV9jYWxscyksCisJKGdzdF94dmltYWdlc2lua194dmltYWdlX2Rlc3Ryb3kpOgorCSAgQWRkIFhTeW5jIGNhbGxzIGFmdGVyIGRldGFjaGluZyBmcm9tIHRoZSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQgdG8KKwkgIGF2b2lkIGEgY3Jhc2guCisKKzIwMDQtMDktMjIgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogZXh0L29nZy9nc3RvZ2dtdXguYzogKGdzdF9vZ2dfbXV4X2luaXQpLAorCShnc3Rfb2dnX211eF9uZXh0X2J1ZmZlciksIChnc3Rfb2dnX211eF9sb29wKToKKwkqIGV4dC92b3JiaXMvdm9yYmlzLmM6IChwbHVnaW5faW5pdCk6CisJKiBleHQvdm9yYmlzL3ZvcmJpc2VuYy5jOiAoZ3N0X3ZvcmJpc2VuY19pbml0KSwKKwkoZ3N0X3ZvcmJpc2VuY19jaGFpbik6CisJKiBleHQvdm9yYmlzL3ZvcmJpc2VuYy5oOgorCXJlbW92ZSBleHBsaWNpdCBuZXdtZWRpYSBzdXBwb3J0IGZyb20gb2dnbXV4IGFuZCB2b3JiaXNlbmMKKwlhZGQgZGVidWcgY2F0ZWdvcnkgdG8gdm9yYmlzZW5jCisJKiBnc3QvbXVsdGlmaWxlc2luay9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKGdzdF9tdWx0aWZpbGVzaW5rX2NsYXNzX2luaXQpLCAoZ3N0X211bHRpZmlsZXNpbmtfaW5pdCksCisJKGdzdF9tdWx0aWZpbGVzaW5rX2Rpc3Bvc2UpLCAoZ3N0X211bHRpZmlsZXNpbmtfc2V0X2xvY2F0aW9uKSwKKwkoZ3N0X211bHRpZmlsZXNpbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF9tdWx0aWZpbGVzaW5rX25leHRfZmlsZSksCisJKGdzdF9tdWx0aWZpbGVzaW5rX2hhbmRsZV9ldmVudCksIChnc3RfbXVsdGlmaWxlc2lua19jaGFpbiksCisJKHBsdWdpbl9pbml0KToKKwkqIGdzdC9tdWx0aWZpbGVzaW5rL2dzdG11bHRpZmlsZXNpbmsuaDoKKwlhZGQgc3VwcG9ydCBmb3Igc3RyZWFtaGVhZGVyIGluIG11bHRpZmlsZXNpbmsKKworMjAwNC0wOS0yMiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6IChfcmVhZF92YXJfbGVuZ3RoKSwgKF9yZWFkX2d1aWQpLAorCShnc3RfYXNmX2RlbXV4X3Byb2Nlc3Nfc2VnbWVudCksIChnc3RfYXNmX2RlbXV4X2hhbmRsZV9kYXRhKSwKKwkoZ3N0X2FzZl9kZW11eF9wcm9jZXNzX2NodW5rKSwgKGdzdF9hc2ZfZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQpOgorCSAgUHJldmVudCBpbmZpbml0ZSBsb29wcy4gTW9yZSBjb3JyZWN0IGVycm9yIHJlcG9ydGluZy4KKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzogKGdzdF9hdXBhcnNlX2NoYWluKToKKwkgIEVycm9yIG91dCBpZiBuZWdvdGlhdGlvbiBmYWlscy4KKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoc2V0dXBfc291cmNlKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fY2hhbmdlX3N0YXRlKSwgKGdzdF9wbGF5X2Jhc2VfYmluX2Vycm9yKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fZm91bmRfdGFnKToKKwkgIEVycm9yL3RhZyBmb3J3YXJkaW5nLiBQcmUtcm9sbCBmaXhlcyBmb3Igc291cmNlIGVycm9ycyBvbiBzdGF0ZQorCSAgY2hhbmdlcyAoZS5nLiAiZmlsZSBkb2VzIG5vdCBleGlzdCIpIHRvIHByZXZlbnQgaGFuZ3MuCisKKzIwMDQtMDktMjEgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogdGVzdHN1aXRlL211bHRpZmlsZXNpbmsvTWFrZWZpbGUuYW06CisJKiB0ZXN0c3VpdGUvbXVsdGlmaWxlc2luay9sYW1lX3Rlc3QuYzogKGdzdF9uZXdtZWRpYV9iYXNlX2luaXQpLAorCShnc3RfbmV3bWVkaWFfY2xhc3NfaW5pdCksIChnc3RfbmV3bWVkaWFfaW5pdCksCisJKGdzdF9uZXdtZWRpYV9jaGFpbiksIChnc3RfbmV3bWVkaWFfdHJpZ2dlciksICh0ZXN0X2Zvcm1hdCksCisJKG5ld2ZpbGVfc2lnbmFsKSwgKHRlc3Rfc2lnbmFsKSwgKG1haW4pOgorCSogdGVzdHN1aXRlL211bHRpZmlsZXNpbmsvbXVsdGlmaWxlc3JjX3Rlc3QuYzogKG1haW4pOgorCSogdGVzdHN1aXRlL211bHRpZmlsZXNpbmsvb2dndGhlb3JhX3Rlc3QuYzoKKwkoZ3N0X25ld21lZGlhX2Jhc2VfaW5pdCksIChnc3RfbmV3bWVkaWFfY2xhc3NfaW5pdCksCisJKGdzdF9uZXdtZWRpYV9pbml0KSwgKGdzdF9uZXdtZWRpYV9jaGFpbiksIChnc3RfbmV3bWVkaWFfdHJpZ2dlciksCisJKHRlc3RfZm9ybWF0KSwgKG5ld2ZpbGVfc2lnbmFsKSwgKHRlc3Rfc2lnbmFsKSwgKG1haW4pOgorCSogdGVzdHN1aXRlL211bHRpZmlsZXNpbmsvb2dndm9yYmlzX3Rlc3QuYzoKKwkoZ3N0X25ld21lZGlhX2Jhc2VfaW5pdCksIChnc3RfbmV3bWVkaWFfY2xhc3NfaW5pdCksCisJKGdzdF9uZXdtZWRpYV9pbml0KSwgKGdzdF9uZXdtZWRpYV9jaGFpbiksIChnc3RfbmV3bWVkaWFfdHJpZ2dlciksCisJKHRlc3RfZm9ybWF0KSwgKG5ld2ZpbGVfc2lnbmFsKSwgKHRlc3Rfc2lnbmFsKSwgKG1haW4pOgorCSogdGVzdHN1aXRlL211bHRpZmlsZXNpbmsvd2F2ZW5jX3Rlc3QuYzogKGdzdF9uZXdtZWRpYV9iYXNlX2luaXQpLAorCShnc3RfbmV3bWVkaWFfY2xhc3NfaW5pdCksIChnc3RfbmV3bWVkaWFfaW5pdCksCisJKGdzdF9uZXdtZWRpYV9jaGFpbiksIChnc3RfbmV3bWVkaWFfdHJpZ2dlciksICh0ZXN0X2Zvcm1hdCksCisJKG5ld2ZpbGVfc2lnbmFsKSwgKHRlc3Rfc2lnbmFsKSwgKG1haW4pOgorCU5ldyBtZWRpYSB0ZXN0cworCisyMDA0LTA5LTIwICBDaHJpc3RpYW4gU2NoYWxsZXIgPGNocmlzdGlhbkBmbHVlbmRvLmNvbT4KKworCSogRml4IG1pa21vZCBsaWNlbnNlIHRvIExHUEwgYXMgdGhleSBoYXZlIHJlbGljZW5zZWQKKwkqIE1vdmUgRGlyYWMgYW5kIEVmZmVjdHYgaW50byBMR1BMIHNlY3Rpb24gb2YgUkVBRE1FX2xpY2Vuc2UKKworMjAwNC0wOS0yMCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfY2hlY2tfY2Fwc19yZXNldCksCisJKGdzdF9tYWRfY2hhbmdlX3N0YXRlKToKKwkgIEFsbG93IGZvciBtcDMgcmF0ZS9jaGFubmVscyBjaGFuZ2VzLiBIb3dldmVyLCBvbmx5IHZlcnkKKwkgIGNvbnNlcnZhdGl2ZWx5LiBSZWFzb24gdGhhdCB3ZSAqaGF2ZSogdG8gZW5hYmxlIHRoaXMgaXMgc21pcGx5CisJICBiZWNhdXNlIHRoZSBtYWQgZmluZF9zeW5jKCkgZnVuY3Rpb24gaXMgbm90IGdvb2QgZW5vdWdoLCBpdCB3aWxsCisJICByZWd1bGFybHkgc3luYyBvbiByYW5kb20gZGF0YSBhcyB2YWxpZCBmcmFtZXMgYW5kIHRoZXJlZm9yZSBtYWtlCisJICB1cyBwcm92aWRlIHJhbmRvbSBjYXBzIGFzICpmaW5hbCogY2FwcyBvZiB0aGUgc3RyZWFtLiBUaGUgYmVzdCBmaXgKKwkgIEkgY291bGQgdGhpbmsgb2YgaXMgdG8gc2ltcGx5IHJlcXVpcmUgc2V2ZXJhbCBvZiB0aGUgc2FtZSBzdHJlYW0KKwkgIGNoYW5nZXMgaW4gYSByb3cgYmVmb3JlIHdlIGNoYW5nZSBjYXBzLgorCSAgVGhlIGFjdHVhbCB0ZXN0Y2FzZSB0aGF0IHdvcmtzIG5vdyBpcyAjCisJKiBleHQvb2dnL01ha2VmaWxlLmFtOgorCSogZXh0L29nZy9nc3RvZ2cuYzogKHBsdWdpbl9pbml0KToKKwkqIGV4dC9vZ2cvZ3N0b2dtcGFyc2UuYzoKKwkgIE9HTSBzdXBwb3J0ICh2aWRlbyBvbmx5IGZvciBub3c7IEkgbmVlZCBhbiBhdWRpbyBzYW1wbGUgZmlsZSkuCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKGdzdF9hc2ZfZGVtdXhfYmFzZV9pbml0KSwKKwkoZ3N0X2FzZl9kZW11eF9wcm9jZXNzX3N0cmVhbSksIChnc3RfYXNmX2RlbXV4X3ZpZGVvX2NhcHMpLAorCShnc3RfYXNmX2RlbXV4X2FkZF92aWRlb19zdHJlYW0pOgorCSAgV01WIGV4dHJhZGF0YS4KKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAodW5rbm93bl90eXBlKToKKwkgIERvbid0IGVycm9yIG91dCBvbiBzaW5nbGUgdW5rbm93bi10eXBlcyBhZnRlciBhbGwuIEl0J3Mgd3JvbmcuCisJICBJZiB3ZSBmb3VuZCB0eXBlIG9mIHZpZGVvIGFuZCBhdWRpbyBidXQgbm90IG9mIGEgc3VidGl0bGUgc3RyZWFtLAorCSAgaXQgd2lsbCBzdGlsbCBlcnJvciBvdXQgKHdoaWNoIGlzIHVud2FudGVkKS4gV2lsbCBmaW5kIGEgYmV0dGVyIGZpeAorCSAgbGF0ZXIgb24uCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKG9nbXZpZGVvX3R5cGVfZmluZCksCisJKG9nbWF1ZGlvX3R5cGVfZmluZCksIChwbHVnaW5faW5pdCk6CisJICBPR00gc3VwcG9ydC4KKworMjAwNC0wOS0yMCAgSm9oYW4gRGFobGluICA8am9oYW5AZ25vbWUub3JnPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmMgKGdzdF9qcGVnZGVjX2NoYWluKTogQWxsb2NhdGUgdGhlIGJ1ZmZlcgorCWFmdGVyIHNldHRpbmcgY2Fwcy4KKworMjAwNC0wOS0xOSAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiAoZ3N0X3dhdmVuY19pbml0KSwgKGdzdF93YXZlbmNfY2hhaW4pOgorCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuaDoKKwlBZGRlZCBuZXdtZWRpYSBzdXBwb3J0IHRvIHdhdmVuYworCisyMDA0LTA5LTE3ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3RjcC9nc3RmZHNldC5jOiAoZ3N0X2Zkc2V0X2ZkX2hhc19jbG9zZWQpLAorCShnc3RfZmRzZXRfZmRfaGFzX2Vycm9yKSwgKGdzdF9mZHNldF9mZF9jYW5fcmVhZCksCisJKGdzdF9mZHNldF9mZF9jYW5fd3JpdGUpLCAoZ3N0X2Zkc2V0X3dhaXQpOgorCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5jOiAoZ3N0X2NsaWVudF9zdGF0dXNfZ2V0X3R5cGUpLAorCShnc3RfbXVsdGlmZHNpbmtfaW5pdCksIChnc3RfbXVsdGlmZHNpbmtfYWRkKSwKKwkoZ3N0X211bHRpZmRzaW5rX3JlbW92ZSksIChnc3RfbXVsdGlmZHNpbmtfZ2V0X3N0YXRzKSwKKwkoZ3N0X211bHRpZmRzaW5rX3JlbW92ZV9jbGllbnRfbGluayksCisJKGdzdF9tdWx0aWZkc2lua19jbGllbnRfcXVldWVfYnVmZmVyKSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRfd3JpdGUpLAorCShnc3RfbXVsdGlmZHNpbmtfcmVjb3Zlcl9jbGllbnQpLCAoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRzKSwKKwkoZ3N0X211bHRpZmRzaW5rX2Nsb3NlKSwgKGdzdF9tdWx0aWZkc2lua19jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5oOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzaW5rLmM6IChnc3RfdGNwc2VydmVyc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfcmVtb3ZlZCk6CisJU21hbGwgY2xlYW51cHMgaW4gZmRzZXQuYworCVVzZSBhIGhhc3RhYmxlIHRvIG1hcCBmZCB0byB0aGUgY2xpZW50IHN0cnVjdHVyZSBmb3IgZmFzdGVyCisJbG9va3VwIGluIF9yZW1vdmUgYW5kIGdldF9zdGF0cy4KKwlBZGRlZCB2aXJ0dWFsIGZ1bmN0aW9uIHRvIGNsb3NlIHRoZSBmZHMuCisJSGFuZGxlIGNsaWVudHMgZXZlbiB3aGVuIHRoZSBzZWxlY3QvcG9sbCBjYWxsIHdhcyB1bmJsb2NrZWQgYmVjYXVzZQorCW9mIGEgY29tbWFuZC4KKwlJbXBsZW1lbnQgc3luY2luZyB0byBrZXlmcmFtZSBpbiB0aGUgcmVjb3ZlcnkgcHJvY2VkdXJlLgorCisyMDA0LTA5LTE2IElhaW4gPGlhaW5nbm9tZUBnbWFpbC5jb20+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmMgKF9maXhhdGVfY2Fwc190b19pbnQpOiBGcmVlIHRoZQorCXRyeSBjYXBzLgorCisyMDA0LTA5LTE1ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RkdmRkZW11eC5jOiAoZ3N0X2R2ZF9kZW11eF9nZXRfYXVkaW9fc3RyZWFtKToKKwkgIENhcHMgYXJlIG9ubHkgc2V0IGlmIHRoZSB0eXBlIG9mIHRoZSBzdHJlYW0gaXMgdW5rbm93biwgYnV0IHRoaXMKKwkgIGlzIGluaXRpYWxpemVkIGluIC0+aW5pdF9zdHJlYW0oKSwgc28gc2V0IHRvIFVOS05PV04gYWZ0ZXIgY2FsbGluZworCSAgLT5pbml0X3N0cmVhbSgpIHNvIHRoYXQgY2Fwc25lZ28gc3RhcnRzLgorCisyMDA0LTA5LTE1ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpLAorCShnc3RfYXZpX2RlbXV4X3N0cmVhbV9kYXRhKToKKwkgIEp1c3QgaGFyZGNvZGUgZm9yIHJhdyBhdWRpbyB0aGVuLiBBVkkgYXVkaW8gc3Vja3MuCisKKzIwMDQtMDktMTUgIEFyd2VkIHYuIE1lcmthdHogIDx2Lm1lcmthdHpAZ214Lm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfYXVkaW9fY2Fwcyk6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChhdWRpb3NpbmtfdGVtcGwpLAorCShnc3RfbWF0cm9za2FfbXV4X2F1ZGlvX3BhZF9saW5rKToKKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAodHRhX2NhcHMpLCAocGx1Z2luX2luaXQpOgorCVVzZSBhdWRpby94LXR0YWZpbGUgZm9yIHR0YSBmaWxlcyBhbmQgYXVkaW8veC10dGEgZm9yIHJhdyB0dGEgZnJhbWVzLgorCisyMDA0LTA5LTE1ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpLAorCShnc3RfYXZpX2RlbXV4X3N0cmVhbV9kYXRhKToKKwkgIFRyeSB0byBmaXggYS92IHN5bmMgaXNzdWVzLgorCisyMDA0LTA5LTE1ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogcmVtb3ZlIE5BU00gY2hlY2ssIHNpbmNlIHdlIGRvbid0IHVzZSBpdC4gIFVwZGF0ZQorCWRpcmFjIGNoZWNrIHRvIDAuNAorCSogZXh0L2RpcmFjL2dzdGRpcmFjZGVjLmNjOiB1cGRhdGUgdG8gY3VycmVudCAwLjQgQVBJCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOiAoZ3N0X2F1ZGlvX2NvbnZlcnRfbGluayk6CisJSW5pdGlhbGl6ZWQgdmFyaWFibGVzLgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3F0ZGVtdXhfbG9vcF9oZWFkZXIpLCAocXRkZW11eF9wYXJzZSksIChxdGRlbXV4X3BhcnNlX3RyYWspLAorCShnc3RfcXRkZW11eF9oYW5kbGVfZXNkcyksIChxdGRlbXV4X2F1ZGlvX2NhcHMpOiBGaXggc2Vla2luZywgYWRkCisJU1ZRMyBmb3JtYXQKKworMjAwNC0wOS0xNSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwKKwkoZ3N0X2F2aV9kZW11eF9hZGRfc3RyZWFtKSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2RhdGEpOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgRml4IGZvciBjb21wcmVzc2VkIGF1ZGlvIChtcDMpIHRpbWVzdGFtcCBnZW5lcmF0aW9uLiBIb3cgZGlkIHRoaXMKKwkgIGV2ZXIgd29yaz8KKworMjAwNC0wOS0xNSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdzdF9wbGF5X2Jpbl9nZXRfcHJvcGVydHkpOgorCSAgVm9sdW1lIGlzIGEgZG91YmxlIG5vdCBhIGZsb2F0LgorCisyMDA0LTA5LTE1ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5jOiAoZ3N0X211bHRpZmRzaW5rX3JlbW92ZV9jbGllbnRfbGluayksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50cyksIChnc3RfbXVsdGlmZHNpbmtfY2hhbmdlX3N0YXRlKToKKwlEb24ndCBjbG9zZSB0aGUgZmQgaW4gbXVsdGlmZHNpbmsgYXMgd2UgZGlkbid0IG9wZW4gaXQgaW4gdGhlCisJZmlyc3QgcGxhY2UuIFNvbWUgY2xlYW51cHMuCisKKzIwMDQtMDktMTUgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX3BhZF9wdXNoKToKKwkqIGV4dC9vZ2cvZ3N0b2dnbXV4LmM6IChnc3Rfb2dnX211eF9uZXh0X2J1ZmZlciksCisJKGdzdF9vZ2dfbXV4X3NlbmRfaGVhZGVycyksIChnc3Rfb2dnX211eF9sb29wKToKKwlGaXggdGhlIGNhc2Ugd2hlcmUgdGhlIG11eGVyIHdvdWxkIG1hcmsgcGFnZXMgYXMgZGVsdGEKKwlmcmFtZXMgd2hlbiB0aGV5IGFyZSBub3QgKHZvcmJpcyBvbmx5IG9nZykuCisKKzIwMDQtMDktMTUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoc3RhdGVfY2hhbmdlKSwgKHNldHVwX3NvdXJjZSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2NoYW5nZV9zdGF0ZSk6CisJICBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2UgZmFpbGVkIHRvIHNldHVwIGEgY2xlYXIgcGlwZWxpbmUuIFRoaXMKKwkgIHdpbGwgdGhyb3cgYW4gZXJyb3IgKG9yIEVPUywgYW5vdGhlciBuaWNlIGNhc2UpIGFuZCBpZiB5b3UgZG9uJ3QKKwkgIGNhdGNoIHRoYXQsIHRoZSBhcHAgd2lsbCB3YWl0IGZvciB0aGUgc2lnbmFsIGZvcmV2ZXIgKGFuZCB0aHVzCisJICBoYW5nKS4KKworMjAwNC0wOS0xNSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzc2luay5jOgorCShnc3RfZ25vbWV2ZnNzaW5rX3VyaV9nZXRfcHJvdG9jb2xzKToKKwkqIGV4dC9nbm9tZXZmcy9nc3Rnbm9tZXZmc3NyYy5jOgorCShnc3RfZ25vbWV2ZnNzcmNfdXJpX2dldF9wcm90b2NvbHMpOgorCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzdXJpLmM6IChnc3RfZ25vbWV2ZnNfZ2V0X3N1cHBvcnRlZF91cmlzKToKKwkqIGV4dC9nbm9tZXZmcy9nc3Rnbm9tZXZmc3VyaS5oOgorCSAgVXNlIF91cmlfbmV3KCkgaW5zdGVhZCBvZiBfb3BlbigpLCBzbyBpdCBkb2Vzbid0IHRha2UgYXMgbG9uZyBhbmQKKwkgIENocmlzdG9waGUncyBjb21wdXRlciB3b24ndCBoYW5nLgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6ICh1bmtub3duX3R5cGUpOgorCSAgVGhyb3cgZXJyb3Igb24gdW5rbm93biBtZWRpYSB0eXBlLCBzbyBhcHBzIGFjdHVhbGx5IGRpc3BsYXkgaXQuCisKKzIwMDQtMDktMTQgIEJyaWFuIENhbWVyb24gIDxicmlhbi5jYW1lcm9uQHN1bi5jb20KKworCSogdG9vbHMvZ3N0LWxhdW5jaC1leHQtbS5tOiAgQ2hhbmdlZCB+IHRvICRFTlZ7SE9NRX0gdG8gYWxsb3cKKwkgIHRoaXMgc2NyaXB0IHRvIHdvcmsgb24gU29sYXJpcyBzaW5jZSBiYXNoIHNoZWxsIGhhbmRsZXMgZWNobworCSAgZGlmZmVyZW5seSB0aGFuIGJhc2guCisKKzIwMDQtMDktMTcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKHF1ZXVlX292ZXJydW4pLCAobm9fbW9yZV9wYWRzKSwKKwkoc2V0dXBfc291cmNlKSwgKGdzdF9wbGF5X2Jhc2VfYmluX3NldF9wcm9wZXJ0eSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2FkZF9lbGVtZW50KToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnc3RfcGxheV9iaW5fc2VuZF9ldmVudCk6CisJU29tZSBtb3JlIHdvcmsgb24gbWFraW5nIHN1cmUgc2Vla2luZyBwYXVzZXMgdGhlIHBpcGVsaW5lIGFuZAorCXRoYXQgY2hhbmdpbmcgdGhlIHVyaSBhY3R1YWxseSBkb2VzIHNvbWV0aGluZy4KKworMjAwNC0wOS0xNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC90Y3AvZ3N0ZmRzZXQuYzogKGdzdF9mZHNldF93YWl0KToKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuYzogKGdzdF9tdWx0aWZkc2lua19jbG9zZSk6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNpbmsuYzogKGdzdF90Y3BzZXJ2ZXJzaW5rX2luaXRfc2VuZCksCisJKGdzdF90Y3BzZXJ2ZXJzaW5rX2Nsb3NlKToKKwlCZSBhIGJpdCBtb3JlIHBhcmFub2lkIHdoZW4gZnJlZWluZyBtZW1vcnkuCisKKzIwMDQtMDktMTMgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pLAorCShxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgRG9uJ3QgY3Jhc2ggYnkgZGl2aWRpbmcgYnkgemVybyAoc2VlIHNhbXBsZSBtb3ZpZSBpbiAjMTI2OTIyKS4KKworMjAwNC0wOS0xMyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9hdWRpb19jYXBzKToKKwkgIERvbid0IHRvdWNoIG5vbi1leGlzdGluZyBkYXRhIChmaXhlcyBjcmFzaCBvbiBmaWxlIGluICMxNDAxNDcpLgorCisyMDA0LTA5LTEzICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzoKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fZGlzcG9zZSksIChnc3RfcGxheV9iYXNlX2Jpbl9zZXRfcHJvcGVydHkpOgorCSAgSGFuZGxlIGRvdWJsZSBkaXNwb3NhbHMsIGFuZCBwcm9wZXIgY2hhbmdlIG9mIFVSSXMuCisKKzIwMDQtMDktMTMgIE1hcnRpbiBFaWtlcm1hbm4gPG1laWtlckB1cGIuZGU+CisKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdwYXJzZS5jOgorCSAgZml4IHN5bmNocm9uaXN0YXRpb24gZm9yIHN0cmVhbXMgcmVjb3JkZWQgZnJvbSBkaWdpdGFsIFBDUgorCSAgZml4ZXMgYnVnICMxMTkzNzYKKworMjAwNC0wOS0xMyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2dub21ldmZzL01ha2VmaWxlLmFtOgorCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzLmM6IChwbHVnaW5faW5pdCk6CisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzaW5rLmM6IChnc3RfZ25vbWV2ZnNzaW5rX2dldF90eXBlKSwKKwkoZ3N0X2dub21ldmZzc2lua19kaXNwb3NlKSwgKGdzdF9nbm9tZXZmc3NpbmtfaW5pdCksCisJKGdzdF9nbm9tZXZmc3NpbmtfdXJpX2dldF90eXBlKSwKKwkoZ3N0X2dub21ldmZzc2lua191cmlfZ2V0X3Byb3RvY29scyksCisJKGdzdF9nbm9tZXZmc3NpbmtfdXJpX2dldF91cmkpLCAoZ3N0X2dub21ldmZzc2lua191cmlfc2V0X3VyaSksCisJKGdzdF9nbm9tZXZmc3NpbmtfdXJpX2hhbmRsZXJfaW5pdCksCisJKGdzdF9nbm9tZXZmc3Npbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF9nbm9tZXZmc3NpbmtfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X2dub21ldmZzc2lua19vcGVuX2ZpbGUpLCAoZ3N0X2dub21ldmZzc2lua19jbG9zZV9maWxlKToKKwkqIGV4dC9nbm9tZXZmcy9nc3Rnbm9tZXZmc3NyYy5jOiAoZ3N0X2dub21ldmZzc3JjX2dldF90eXBlKSwKKwkoZ3N0X2dub21ldmZzc3JjX2luaXQpLCAoZ3N0X2dub21ldmZzc3JjX2Rpc3Bvc2UpLAorCShnc3RfZ25vbWV2ZnNzcmNfdXJpX2dldF90eXBlKSwKKwkoZ3N0X2dub21ldmZzc3JjX3VyaV9nZXRfcHJvdG9jb2xzKSwgKGdzdF9nbm9tZXZmc3NyY191cmlfZ2V0X3VyaSksCisJKGdzdF9nbm9tZXZmc3NyY191cmlfc2V0X3VyaSksIChnc3RfZ25vbWV2ZnNzcmNfdXJpX2hhbmRsZXJfaW5pdCksCisJKGdzdF9nbm9tZXZmc3NyY19zZXRfcHJvcGVydHkpLCAoZ3N0X2dub21ldmZzc3JjX2dldF9wcm9wZXJ0eSksCisJKGdzdF9nbm9tZXZmc3NyY19vcGVuX2ZpbGUpLCAoZ3N0X2dub21ldmZzc3JjX2Nsb3NlX2ZpbGUpOgorCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzdXJpLmM6IChnc3RfZ25vbWV2ZnNfZ2V0X3N1cHBvcnRlZF91cmlzKToKKwkqIGV4dC9nbm9tZXZmcy9nc3Rnbm9tZXZmc3VyaS5oOgorCSAgQWRkIFVSSSBzdXBwb3J0IHRvIEdub21lLVZGUyBwbHVnaW5zLiBUcmllcyB0byBsb2FkIGEgZml4ZWQgbGlzdAorCSAgb2YgZmFrZSBVUklzIHRvIHNlZSB3aGljaCB0aGlzIHZlcnNpb24gb2YgR25vbWUtVkZTIGxpa2VzLCBhbmQKKwkgIHVzZXMgdGhhdCBmb3IgdGhlIEdzdC1VUkkgaW50ZXJmYWNlLiBNYWtlcyBwbGF5YmluIHN1cHBvcnQgaHR0cDovLworCSAgc3RyZWFtcy4gQWxzbyBmaXggdXAgc29tZSBzdHVwaWQgYmVoYXZpb3VyIGluIGdub21ldmZzc3JjLgorCisyMDA0LTA5LTEzICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhbWl4ZXIuYzogKGdzdF9hbHNhX21peGVyX3VwZGF0ZSksCisJKGdzdF9hbHNhX21peGVyX2dldF92b2x1bWUpLCAoZ3N0X2Fsc2FfbWl4ZXJfc2V0X3ZvbHVtZSksCisJKGdzdF9hbHNhX21peGVyX3NldF9tdXRlKSwgKGdzdF9hbHNhX21peGVyX3NldF9yZWNvcmQpLAorCShnc3RfYWxzYV9taXhlcl9zZXRfb3B0aW9uKSwgKGdzdF9hbHNhX21peGVyX2dldF9vcHRpb24pOgorCSAgVXBkYXRlIG1peGVyICh0byBzeW5jIHdpdGggb3RoZXIgc2Vzc2lvbnMpIGlmIHdlIHRyeSB0byBvYnRhaW4KKwkgIGEgbmV3IHZhbHVlLiBUaGlzIG1ha2VzIGFsc2FtaXhlciB3b3JrIGFjY3Jvc3MgYXBwbGljYXRpb25zLgorCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuYzogKGdzdF9hbHNhX3NpbmtfZ2V0X3RpbWUpOgorCSAgT25seSBjYWxsIHN5bmMgZnVuY3Rpb25zIGlmIHdlJ3JlIHJ1bm5pbmcsIGVsc2UgYWxzYWxpYiBhc3NlcnRzLgorCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9zcmNfcXVlcnkpOgorCSAgU29tZXRpbWVzIGZhaWxzIHRvIGNvbXBpbGUuIFBvc3NpYmx5IGEgZ2NjIGJ1Zy4KKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnZW5fdmlkZW9fZWxlbWVudCksCisJKGdlbl9hdWRpb19lbGVtZW50KToKKwkgIEFkZCBhIHJlZmVyZW5jZSB0byBhbiBhcHBsaWNhdGlvbi1wcm92aWRlZCBvYmplY3QsIGJlY2F1c2Ugd2UgbG9zZQorCSAgdGhpcyBzYW1lIHJlZmVyZW5jZSBpZiB3ZSBhZGQgaXQgdG8gdGhlIGJpbi4gSWYgd2UgZG9uJ3QgZG8gdGhpcywKKwkgIHdlIGNhbiBvbmx5IHVzZSB0aGlzIG9iamVjdCBvbmNlIGFuZCB0aHVzIGNyYXNoIGlmIHdlIGdvIGZyb20KKwkgIHJlYWR5IHRvIHBsYXlpbmcsIGJhY2sgdG8gcmVhZHkgYW5kIGJhY2sgdG8gcGxheWluZyBhZ2Fpbi4KKwkgIEFsc28gYWRkIGFuIGF1ZGlvc2NhbGUgZWxlbWVudCBiZWNhdXNlIHNldmVyYWwgY2hlYXAgc291bmRjYXJkcyAtCisJICBsaWtlIG1pbmUgLSBkb24ndCBzdXBwb3J0IGFsbCBzYW1wbGVyYXRlcy4KKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KSwKKwkoZ3N0X3hpbWFnZXNpbmtfeGNvbnRleHRfY2xlYXIpLCAoZ3N0X3hpbWFnZXNpbmtfY2hhbmdlX3N0YXRlKToKKwkgIEZpeCB3cm9uZyBvcmRlciBvciBQQVIgY2FsbHMuIE1ha2VzIGF1dG9tYXRpY2FsbHkgb2J0YWluZWQgUEFSCisJICBmcm9tIHRoZSBYIHNlcnZlciBhdHVhbGx5IGJlaW5nIHVzZWQuCisKKzIwMDQtMDktMTIgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCUZpeGVzOiAjMTUxODc5LCAjMTUxODgxLCAjMTUxODgyLCAjMTUxODgzLCAjMTUxODg0LCAjMTUxODg2LAorCSMxNTE4ODcsICMxNTIxMDIsICMxNTIyNDcuCisJKiBleGFtcGxlcy9pbmRleGluZy9pbmRleG1wZWcuYzogNjQtYml0IHdhcm5pbmcgZml4ZXMuCisJKiBleGFtcGxlcy9zZWVraW5nL2NkcGFyYW5vaWEuYzogc2FtZQorCSogZXhhbXBsZXMvc2Vla2luZy9jZHBsYXllci5jOiBzYW1lCisJKiBleGFtcGxlcy9zZWVraW5nL3NlZWsuYzogc2FtZQorCSogZXhhbXBsZXMvc2Vla2luZy9zcGlkZXJfc2Vlay5jOiBzYW1lCisJKiBleGFtcGxlcy9zZWVraW5nL3ZvcmJpc2ZpbGUuYzogc2FtZQorCSogZXhhbXBsZXMvc3RhdHMvbXAyb2dnLmM6IHNhbWUKKwkqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfY2xhc3NfaW5pdCksCisJKGdzdF9lc2RzaW5rX2Rpc3Bvc2UpOiBEaXNwb3NlIG9mIGVsZW1lbnQgcHJvcGVybHkuCisJKiBleHQvaXZvcmJpcy92b3JiaXNmaWxlLmM6IChnc3RfaXZvcmJpc2ZpbGVfc2Vlayk6IDY0LWJpdCB3YXJuaW5nCisJZml4ZXMuCisJKiBleHQvbmFzL25hc3NpbmsuYzogKGdzdF9uYXNzaW5rX2NsYXNzX2luaXQpLAorCShnc3RfbmFzc2lua19kaXNwb3NlKTogRGlzcG9zZSBvZiBlbGVtZW50IGNvcnJlY3RseS4KKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChnc3Rfd2F2ZW5jX2NoYWluKTogRml4IGxlYWsuCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2NoZWNrX3hzaG1fY2FsbHMpLAorCShnc3RfeGltYWdlc2lua194aW1hZ2VfbmV3KSwgKGdzdF94aW1hZ2VzaW5rX3hpbWFnZV9kZXN0cm95KToKKwlGaXggNjQtYml0IHdhcm5pbmcuCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2NoZWNrX3hzaG1fY2FsbHMpLAorCShnc3RfeHZpbWFnZXNpbmtfeHZpbWFnZV9uZXcpLCAoZ3N0X3h2aW1hZ2VzaW5rX3h2aW1hZ2VfZGVzdHJveSk6CisJRml4IDY0LWJpdCB3YXJuaW5nLgorCisyMDA0LTA5LTEyICBTdGVwaGFuZSBMb2V1aWxsZXQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogY29uZmlndXJlLmFjIDogY2hhbmdlIHNwZWV4IGRldGVjdGlvbiBhcyAxLjEuNiBub3cgdXNlcworCSAgLnBjL3BrZy1jb25maWcgYW5kIHRoZXkgY2hhbmdlZCB0aGVpciBoZWFkZXJzIGxvY2F0aW9uLgorCisyMDA0LTA5LTA5ICBBcndlZCB2LiBNZXJrYXR6ICA8di5tZXJrYXR6QGdteC5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfcmVzZXQpLAorCShnc3RfbWF0cm9za2FfbXV4X3N0YXJ0KSwgKGdzdF9tYXRyb3NrYV9tdXhfZmluaXNoKSwKKwkoZ3N0X21hdHJvc2thX211eF93cml0ZV9kYXRhKToKKwkgIFdyaXRlIG11bHRpcGxlIGJsb2Nrcy9mcmFtZXMgcGVyIGNsdXN0ZXIuCisJCVdyaXRlIG1ldGEtc2VlayBpbmZvcm1hdGlvbiAoc2VlayBoZWFkcykuCisKKzIwMDQtMDktMDkgIFNjb3R0IFdoZWVsZXIgPHdoZWVsZXJAa2RlLm9yZz4KKworCSogZ3N0L2dzdHBsYXliaW4uYzogKGdzdF9wbGF5X2Jpbl9jbGFzc19pbml0KSwgKGdzdF9wbGF5X2Jpbl9pbml0KSwKKwkoZ3N0X3BsYXlfYmluX3NldF9wcm9wZXJ0eSksIChnc3RfcGxheV9iaW5fZ2V0X3Byb3BlcnR5KSwKKwkoZ2VuX2F1ZGlvX2VsZW1lbnQpLCAoZ2VuX2F1ZGlvX2VsZW1lbnQpOgorCSAgQWRkIGEgdm9sdW1lIGVsZW1lbnQgLyBwcm9wZXJ0eSB0byB0aGUgcGlwZWxpbmUuCisKKzIwMDQtMDktMDcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IChnc3RfdmlkZW9taXhlcl9ibGVuZF9idWZmZXJzKToKKwlDb3B5IHRpbWVzdGFtcHMgZnJvbSB0aGUgbWFzdGVyIHBhZCB0byB0aGUgb3V0cHV0IGJ1ZmZlcnMuCisKKzIwMDQtMDktMDMgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOgorCSAgdGhyb3cgZXJyb3JzIHdoZW4gYXBwbGljYWJsZQorCisyMDA0LTA5LTAxICBBcndlZCB2LiBNZXJrYXR6ICA8di5tZXJrYXR6QGdteC5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLWlkcy5oOgorCSogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOiAoZ3N0X2VibWxfcmVhZF9kYXRlKToKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6IChnc3RfZWJtbF93cml0ZV9kYXRlKToKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfZmluaXNoKToKKwkgIGF1dG9tYXRpY2FsbHkgY29udmVydCB1bml4IHRpbWUgPC0+IGVibWwgdGltZSB3aGVuIHJlYWRpbmcvd3JpdGluZworCSAgYSBkYXRlLCB1c2UgZ3N0X2VibWxfd3JpdGVfdWludCB0byB3cml0ZSBDVUVUSU1FLAorCSAgbm90IGdzdF9lYm1sX3dyaXRlX2RhdGUuCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChnc3RfbWF0cm9za2FfbXV4X2NyZWF0ZV91aWQpLAorCShnc3RfbWF0cm9za2FfbXV4X3Jlc2V0KSwgKGdzdF9tYXRyb3NrYV9tdXhfYXVkaW9fcGFkX2xpbmspLAorCShnc3RfbWF0cm9za2FfbXV4X3RyYWNrX2hlYWRlciksIChnc3RfbWF0cm9za2FfbXV4X3N0YXJ0KSwKKwkoZ3N0X21hdHJvc2thX211eF93cml0ZV9kYXRhKToKKwkgIFdyaXRlIHRyYWNrIGFuZCBzZWdtZW50IFVJRHMsIHdyaXRlIG11eGluZyBkYXRlLCB3cml0ZQorCSAgVFJBQ0tERUZBVUxURFVSQVRJT04gZm9yIFRUQSBhdWRpbywgd3JpdGUgQkxPQ0tEVVJBVElPTiBpZiBrbm93bi4KKwkgIENyZWF0ZSBjdWVzIGZvciBhdWRpbyBvbmx5IGZpbGVzLgorCisyMDA0LTA4LTMxICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhbWl4ZXIuYzogKGdzdF9hbHNhX21peGVyX2J1aWxkX2xpc3QpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVydHJhY2suYzogKGdzdF9hbHNhX21peGVyX3RyYWNrX25ldyk6CisJICBSZS1jb21taXQgQUxTQSBzd2l0Y2hlcy4KKwkqIGdzdC9hZGRlci9nc3RhZGRlci5jOiAoZ3N0X2FkZGVyX2xvb3ApOgorCSAgNjQtYml0IGZpeCAoIzE1MTQxNikuCisJKiBnc3QvZGVidWcvcHJvZ3Jlc3NyZXBvcnQuYzogKGdzdF9wcm9ncmVzc3JlcG9ydF9yZXBvcnQpOgorCSAgNjQtYml0IGZpeCAoIzE1MTQxOSkuCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NvbnRlbnRzKToKKwkgIDY0LWJpdCBmaXggKCMxNTE0MjApLgorCSogZ3N0L3BsYXliYWNrL3Rlc3QzLmM6ICh1cGRhdGVfc2NhbGUpOgorCSAgNjQtYml0IGZpeCAoIzE1MTQyMSkuCisKKzIwMDQtMDgtMzEgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGJ1bXAgbmFubyB0byBjdnMKKworPT09IHJlbGVhc2UgMC44LjQgPT09CisKKzIwMDQtMDgtMDIgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogcmVsZWFzaW5nIDAuOC40LCAiQWxpYXMiCisKKzIwMDQtMDgtMzEgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC90aGVvcmEvTWFrZWZpbGUuYW06CisJICBmaXggbWFrZWZpbGUuICBGaXhlcyAjMTUxNDYyLgorCisyMDA0LTA4LTMwICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3RjcC9nc3RmZHNldC5jOiAoZ3N0X2Zkc2V0X2ZyZWUpLCAoZ3N0X2Zkc2V0X3dhaXQpOgorCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5jOiAoZ3N0X211bHRpZmRzaW5rX2FkZCksCisJKGdzdF9tdWx0aWZkc2lua19yZW1vdmVfY2xpZW50X2xpbmspLAorCShnc3RfbXVsdGlmZHNpbmtfY2xpZW50X3F1ZXVlX2J1ZmZlciksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50X3dyaXRlKToKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c2luay5jOiAoZ3N0X3RjcGNsaWVudHNpbmtfaW5pdF9zZW5kKToKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c3JjLmM6IChnc3RfdGNwY2xpZW50c3JjX2luaXRfcmVjZWl2ZSk6CisJRml4IHNvbWUgbWVtb3J5IGxlYWtzLgorCisyMDA0LTA4LTMwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJUGF0Y2ggYnk6IERhdmlkIFNjaGxlZWYKKworCSogY29uZmlndXJlLmFjOgorCSogc3lzL01ha2VmaWxlLmFtOgorCSAgcmVuYW1lIG91ciBkZXRlY3Rpb24gbWFjcm8gZm9yIFY0TDIuICBGaXhlcyAjMTUxMjM2LgorCisyMDA0LTA4LTMwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJUGF0Y2ggYnk6IERhdmlkIFNjaGxlZWYKKworCSogY29uZmlndXJlLmFjOgorCSAgY2hlY2sgdG8gZGVmaW5lIExBTUVQUkVTRVQuICBGaXhlcyAjMTUxMjMyLgorCisyMDA0LTA4LTI3ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIHN5cy9nbHNpbmsvZ2xpbWFnZXNpbmsuYzogKGdzdF9nbGltYWdlc2lua194aW1hZ2VfcHV0KSwKKwkoZ3N0X2dsaW1hZ2VzaW5rX3h3aW5kb3dfbmV3KSwgKGdzdF9nbGltYWdlc2lua194Y29udGV4dF9nZXQpLAorCShnc3RfZ2xpbWFnZXNpbmtfZml4YXRlKTogIE1vdmUgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zIHRvCisJbWFrZSBnY2MtMi45NSBoYXBweS4KKworMjAwNC0wOC0yNyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgYnVtcCBuYW5vIGZvciBwcmVyZWxlYXNlCisKKzIwMDQtMDgtMjcgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogc3lzL3N1bmF1ZGlvL01ha2VmaWxlLmFtOiBBZGQgc3VuYXVkaW9zcmMgcGF0Y2ggZnJvbSBCYWxhCisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuYzoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5oOgorCisyMDA0LTA4LTI3IEFyd2VkIHYuIE1lcmthdHogPHYubWVya2F0ekBnbXgubmV0PgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChnc3RfZWJtbF9wZWVkX2lkKSwgKGdzdF9lYm1sX3JlYWRfZWxlbWVudF9pZCksCisJaGFuZGxlIEVPUyBjb3JyZWN0bHkKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfdmlkZW9fcGFkX2xpbmspOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCWFkZGVkIEJJVE1BUElORk9IRUFERVIgc3RydWN0dXJlLCBtdXggdmlkZW8veC1kaXZ4IGFuZCB2aWRlby94LXh2aWQgaW4KKwlWRlcgY29tcGF0aWJpbGl0eSBtb2RlCisKKzIwMDQtMDgtMjcgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwlwYXRjaCBieTogWmFoZWVyIEFiYmFzIE1lcmFsaQorCisJKiBleHQvb2dnL2dzdG9nZ211eC5jOgorCSogZXh0L3ZvcmJpcy92b3JiaXNlbmMuYzoKKwkqIGV4dC92b3JiaXMvdm9yYmlzZW5jLmg6CisJICBoYW5kbGUgTkVXTUVESUEKKworMjAwNC0wOC0yNiBBcndlZCB2LiBNZXJrYXR6IDx2Lm1lcmthdHpAZ214Lm5ldD4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzogKGdzdF9lYm1sX3dyaXRlX2Zsb2F0KSwKKwlmaXggYnl0ZSBvcmRlciByZXZlcnNpb24gb24gbGl0dGxlIGVuZGlhbiBtYWNoaW5lcy4KKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGF1ZGlvc2lua190ZW1wbCksCisJKGdzdF9tYXRyb3NrYV9tdXhfYXVkaW9fcGFkX2xpbmspOgorCWFkZCBUVEEgY29kZWMgdG8gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGNvZGVjcy4KKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfaW5pdCksCisJKGdzdF9tYXRyb3NrYV9tdXhfc3RhcnQpLCAoZ3N0X21hdHJvc2thX211eF9maW5pc2gpLAorCShnc3RfbWF0cm9za2FfbXV4X3dyaXRlX2RhdGEpOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCXdyaXRlIHNlZ21lbnQgZHVyYXRpb24gY29ycmVjdGx5LCB3cml0ZSBtdXhpbmcgYXBwIHN0cmluZywgZml4ZXMgYnVncworCSMxNDA4OTcgYW5kICMxNDA4OTguCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChnc3RfbWF0cm9za2FfbXV4X2xvb3ApLAorCXdhaXQgZm9yIGFsbCBwYWRzIHRvIGJlIG5lZ290aWF0ZWQgYmVmb3JlIHN0YXJ0aW5nIHRvIG11eC4KKworMjAwNC0wOC0yNiAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBleHQvbGFtZS9nc3RsYW1lLmM6IChnc3RfbGFtZV9pbml0KSwgKGdzdF9sYW1lX2NoYWluKToKKwkqIGV4dC9sYW1lL2dzdGxhbWUuaDoKKwlBZGRlZCBuZXcgbWVkaWEgc3VwcG9ydCB0byBsYW1lCisKKzIwMDQtMDgtMjUgQXJ3ZWQgdi4gTWVya2F0eiA8di5tZXJrYXR6QGdteC5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2Jsb2NrZ3JvdXApLAorCXNlbmQgdm9yYmlzIGhlYWRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHN0cmVhbSwgZml4ZXMgYnVnICMxNDE1NTQuCisJSW50ZXJwcmV0IEJMT0NLRFVSQVRJT04gYW5kIHNldCBidWZmZXIgZHVyYXRpb24gYWNjb3JkaW5nbHksIGZpeGVzCisJYnVnICMxNDg5NTAuCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9hdWRpb19jYXBzKSwKKwkoZ3N0X21hdHJvc2thX2RlbXV4X3BsdWdpbl9pbml0KToKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwllbmFibGUgZGVtdXhpbmcgb2YgVFRBIGF1ZGlvIHN0cmVhbXMsIGZpeGVzIGJ1ZyAjMTQ4OTUxLgorCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6ICh0dGFfdHlwZV9maW5kKSwgKHBsdWdpbl9pbml0KSwKKwllbmFibGUgdHlwZWZpbmRpbmcgZm9yIFRUQSBhdWRpbyBmaWxlcywgZml4ZXMgYnVnICMxNDg3MTEuCisJKiBleHQveHZpZC9nc3R4dmlkZGVjLmM6IChnc3RfeHZpZGRlY19jaGFpbiksCisJc2V0IFhWSURfTE9XREVMQVkgZmxhZyBmb3IgZGVjb2Rpbmcgc28geHZpZCBhbHdheXMgcmV0dXJucyBhbiBpbWFnZSwKKwlmaXhlcyBwbGF5YmFjayBvZiBwYWNrZWQgYml0c3RyZWFtIGFuZCB4dmlkIHdpdGggYmZyYW1lcywgYnVnICMxMzU0MDcuCisKKzIwMDQtMDgtMjQgIFNlYmFzdGllbiBDb3RlICA8c2M1QGhlcm1lcy51c2hlcmIuY2E+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5jOiAoZ3N0X3JpZmZfcGVla19oZWFkKSwKKwkoZ3N0X3JpZmZfcmVhZF9lbGVtZW50X2RhdGEpLCAoZ3N0X3JpZmZfcmVhZF9zZWVrKSwKKwkoZ3N0X3JpZmZfcmVhZF9za2lwKTogZml4IGluZmluaXRlIGxvb3AgaW4gd2F2cGFyc2UsIGZpeGVzIGJ1ZworCSMxNDQ2MTYsIHBhdGNoIHJldmlld2VkIGJ5IFJvbmFsZCBhbmQgY29tbWl0dGVkIGJ5IENocmlzdG9waGUgRmVyZ2VhdQorCTx0ZXVmQGdub21lLm9yZz4KKworMjAwNC0wOC0yMyBJYWluIDxpYWluZ25vbWVAZ21haWwuY29tPgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jIChnc3RfbWFkX2lkM190b190YWdfbGlzdCk6IFNwZWNpYWwgY2FzZSBDT01NCisJdGFncy4gVGhleSBhcHBlYXIgdG8gYmUgaGFuZGxlZCBkaWZmZXJlbnRseSB0byBub3JtYWwuCisJKHRhZ19saXN0X3RvX2lkM190YWdfZm9yZWFjaCk6IERpdHRvLgorCisyMDA0LTA4LTIyICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L29nZy9nc3RvZ2dtdXguYzogKGdzdF9vZ2dfbXV4X25leHRfYnVmZmVyKSwKKwkoZ3N0X29nZ19tdXhfc2VuZF9oZWFkZXJzKSwgKGdzdF9vZ2dfbXV4X2xvb3ApOgorCU1ha2Ugc3VyZSB3ZSBuZXZlciBzZW5kIC0xIGdyYW51bGVwb3MuCisKKzIwMDQtMDgtMjAgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvb2dnL2dzdG9nZ211eC5jOiAoZ3N0X29nZ19tdXhfbmV4dF9idWZmZXIpLAorCShnc3Rfb2dnX211eF9sb29wKToKKwlJIHdpbGwgYWNjZXB0IGJpdGNoc2xhcHBpbmdzIHdpdGggbm9uIHNoYXJwIG9iamVjdHMuCisKKzIwMDQtMDgtMjAgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCUNsZWFuIHVwIHRoZSB0ZXN0IGZvciBsYW1lIHByZXNldHMKKworMjAwNC0wOC0xOSAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvbGFtZS9NYWtlZmlsZS5hbToKKwkqIGV4dC9sYW1lL2dzdGxhbWUuYzogKGdzdF9sYW1lX2NsYXNzX2luaXQpLAorCShnc3RfbGFtZV9zZXRfcHJvcGVydHkpLCAoZ3N0X2xhbWVfZ2V0X3Byb3BlcnR5KSwgKGdzdF9sYW1lX3NldHVwKToKKwlPbmx5IGVuYWJsZSBsYW1lIHByZXNldHMgaWYgdmVyc2lvbiBvZiBsYW1lIGhhcyBwcmVzZXRzIGluIEFQSQorCisyMDA0LTA4LTE5ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19pbml0KSwgKGdzdF91ZHBzcmNfZ2V0KToKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmg6CisJICBEb24ndCBjYWxsIGdzdF9wYWRfcHVzaCBpbiBhIGdldCBmdW5jdGlvbi4gRml4ZXMgIzE1MDQ0OQorCisyMDA0LTA4LTE4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3RjcC9nc3RmZHNldC5jOiAoZ3N0X2Zkc2V0X2ZyZWUpLCAoZ3N0X2Zkc2V0X3NldF9tb2RlKSwKKwkoZ3N0X2Zkc2V0X2dldF9tb2RlKSwgKGdzdF9mZHNldF9hZGRfZmQpLCAoZ3N0X2Zkc2V0X3JlbW92ZV9mZCksCisJKGdzdF9mZHNldF9mZF9jdGxfd3JpdGUpLCAoZ3N0X2Zkc2V0X2ZkX2N0bF9yZWFkKSwKKwkoZ3N0X2Zkc2V0X2ZkX2hhc19jbG9zZWQpLCAoZ3N0X2Zkc2V0X2ZkX2hhc19lcnJvciksCisJKGdzdF9mZHNldF9mZF9jYW5fcmVhZCksIChnc3RfZmRzZXRfZmRfY2FuX3dyaXRlKSwKKwkoZ3N0X2Zkc2V0X3dhaXQpOgorCSogZ3N0L3RjcC9nc3RmZHNldC5oOgorCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5jOiAoZ3N0X211bHRpZmRzaW5rX2FkZCksCisJKGdzdF9tdWx0aWZkc2lua19jbGllbnRfcXVldWVfYnVmZmVyKSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRfd3JpdGUpOgorCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5oOgorCVNvbWUgZXh0cmEgY2hlY2tzIGluIGdzdGZkc2V0LgorCU9ubHkgdXNlIHNlbmQoKSB3aGVuIHRoZSBmZCBpcyBhIHNvY2tldC4gRG9uJ3QgdHJ5IHRvCisJcmVhZCBmcm9tIHdyaXRlIG9ubHkgZmRzLgorCisyMDA0LTA4LTE4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3RjcC9nc3RmZHNldC5jOiAoZ3N0X2Zkc2V0X2FkZF9mZCksIChnc3RfZmRzZXRfcmVtb3ZlX2ZkKSwKKwkoZ3N0X2Zkc2V0X2ZkX2N0bF93cml0ZSksIChnc3RfZmRzZXRfZmRfY3RsX3JlYWQpLAorCShnc3RfZmRzZXRfZmRfaGFzX2Nsb3NlZCksIChnc3RfZmRzZXRfZmRfaGFzX2Vycm9yKSwKKwkoZ3N0X2Zkc2V0X2ZkX2Nhbl9yZWFkKSwgKGdzdF9mZHNldF9mZF9jYW5fd3JpdGUpLAorCShnc3RfZmRzZXRfd2FpdCk6CisJQWRkIG1vcmUgbG9ja2luZyBhbmQgYm91bmRzIGNoZWNraW5nLgorCisyMDA0LTA4LTE4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3RjcC9nc3RmZHNldC5jOiAoZW5zdXJlX3NpemUpLCAoZ3N0X2Zkc2V0X3dhaXQpOgorCVJlYWxsb2MgdGVzdCBmZHNldCBpbiB0aGUgbG9jayBhbmQgcmlnaHQgYmVmb3JlIHN0YXJ0aW5nCisJdGhlIHBvbGwgY2FsbC4gQnVtcCB0aGUgbGltaXQgdG8gNDA5Ni4KKworMjAwNC0wOC0xNyAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBzeXMvc3VuYXVkaW8vTWFrZWZpbGUuYW06CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW8uYzogRml4IGNhcHMgdG8gaGFuZGxlIGZ1bGwgcmFuZ2UKKwlvZiByYXRlcyBhbmQgY2hhbm5lbHMuICBNYWtlIGRlYnVnZ2luZyBsZXNzIG9ibm94aW91cy4KKworCVBhdGNoIGZyb20gQmFsYW11cmFsaSBWaXN3YW5hdGhhbiBpbXBsZW1lbnRpbmcgYSBtaXhlciBmb3IKKwlTdW4gYXVkaW8uICAoYnVnICMxNDQwOTEpOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmVsZW1lbnQuYzoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5lbGVtZW50Lmg6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VubWl4ZXIuYzoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5taXhlci5oOgorCisyMDA0LTA4LTE3ICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGdzdC9hdWRpb3NjYWxlL2dzdGF1ZGlvc2NhbGUuYzoKKwkqIGdzdC9hdWRpb3NjYWxlL2dzdGF1ZGlvc2NhbGUuaDoKKwltYWRlIGF1ZGlvc2NhbGUgcmVzYW1wbGUgZnJvbSBhbnkgc2FtcGxlIHJhdGUgdG8gYW55IHNhbXBsZSByYXRlCisKKzIwMDQtMDgtMTcgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJICBlcnJvciBvdXQgb24gdW5zdXBwb3J0ZWQgdHlwZXMKKworMjAwNC0wOC0xNyAgSWFpbiA8aWFpbmdub21lQGdtYWlsLmNvbT4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jIChnc3RfZmxhY2VuY191cGRhdGVfcXVhbGl0eSk6IE9ubHkgc2V0IHRoZQorCW1pZF9zaWRlIGFuZCBsb29zZV9taWRfc2lkZSBwcm9wZXJ0aWVzIGlmIGl0cyBhIHN0ZXJlbyBzdHJlYW0uCisKKzIwMDQtMDgtMTcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvdGhlb3JhL3RoZW9yYWRlYy5jOiAoZ3N0X3RoZW9yYV9kZWNfY2xhc3NfaW5pdCksCisJKHRoZW9yYV9nZXRfZm9ybWF0cyksICh0aGVvcmFfZGVjX3NyY19jb252ZXJ0KSwKKwkodGhlb3JhX2RlY19zaW5rX2NvbnZlcnQpLCAodGhlb3JhX2RlY19zcmNfcXVlcnkpLAorCSh0aGVvcmFfZGVjX3NyY19ldmVudCksICh0aGVvcmFfZGVjX2V2ZW50KSwgKHRoZW9yYV9kZWNfY2hhaW4pOgorCUFkZCBhIGRlYnVnIGxpbmUuCisKKzIwMDQtMDgtMTcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2RlbXV4X2l0ZXJhdGUpLAorCShnc3Rfb2dnX3BhZF9wdXNoKToKKwkqIGV4dC9vZ2cvZ3N0b2dnbXV4LmM6IChnc3Rfb2dnX211eF9pbml0KSwKKwkoZ3N0X29nZ19tdXhfcmVxdWVzdF9uZXdfcGFkKSwgKGdzdF9vZ2dfbXV4X25leHRfYnVmZmVyKSwKKwkoZ3N0X29nZ19tdXhfYnVmZmVyX2Zyb21fcGFnZSksIChnc3Rfb2dnX211eF9wdXNoX3BhZ2UpLAorCShnc3Rfb2dnX211eF9zZW5kX2hlYWRlcnMpLCAoZ3N0X29nZ19tdXhfbG9vcCk6CisJTWFyayBkZWx0YSB1bml0cyBpbiB0aGUgbXV4ZXIuCisJVHJ5IHRvIGRlY29kZSB0aGUgcGFja2V0IGFmdGVyIGFuIG91dC1vZi1zeW5jIGVycm9yIGZyb20KKwlsaWJvZ2cuCisKKzIwMDQtMDgtMTcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmM6IChnc3RfbXVsdGlmZHNpbmtfY2xhc3NfaW5pdCksCisJKGdzdF9tdWx0aWZkc2lua19pbml0KSwgKGdzdF9tdWx0aWZkc2lua19hZGQpLAorCShnc3RfbXVsdGlmZHNpbmtfY2xpZW50X3F1ZXVlX2J1ZmZlciksCisJKGdzdF9tdWx0aWZkc2lua19zZXRfcHJvcGVydHkpLCAoZ3N0X211bHRpZmRzaW5rX2dldF9wcm9wZXJ0eSk6CisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmg6CisJQWRkZWQgb3B0aW9uIHRvIHNlbmQgYSBrZXlmcmFtZSB0byBjbGllbnRzIGFzIHRoZSBmaXJzdCBidWZmZXIuCisJTWFrZSB0aW1lb3V0IHByb3BlcnR5IHdyaXRhYmxlLgorCisyMDA0LTA4LTE3ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJcGF0Y2ggYnk6IFdpbSBUYXltYW5zCisKKwkqIGdzdC90Y3AvZ3N0ZmRzZXQuYzoKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuYzoKKwkgIGZpeCBpbmRleCBjb21wYXJpc29uLCBzaG91bGQgaW5jbHVkZSAwCisKKzIwMDQtMDgtMTYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL2dzdGZkc2V0LmM6IChlbnN1cmVfc2l6ZSksIChnc3RfZmRzZXRfbmV3KSwKKwkoZ3N0X2Zkc2V0X2FkZF9mZCksIChnc3RfZmRzZXRfcmVtb3ZlX2ZkKSwKKwkoZ3N0X2Zkc2V0X2ZkX2hhc19jbG9zZWQpLCAoZ3N0X2Zkc2V0X2ZkX2hhc19lcnJvciksCisJKGdzdF9mZHNldF9mZF9jYW5fcmVhZCksIChnc3RfZmRzZXRfZmRfY2FuX3dyaXRlKSwKKwkoZ3N0X2Zkc2V0X3dhaXQpOgorCSAgY29weSB3aGVuIHJlYWxsb2NpbmcgZm9yIHBvbGwgc28gdGhlIHNlbGVjdCBhcmd1bWVudHMgZG9uJ3QgZ2V0CisJICBjaGFuZ2VkIGR1cmluZyB0aGUgY2FsbAorCisyMDA0LTA4LTE2ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L3RoZW9yYS90aGVvcmFlbmMuYzogKGdzdF9ib3JkZXJfbW9kZV9nZXRfdHlwZSksCisJKGdzdF90aGVvcmFfZW5jX2NsYXNzX2luaXQpLCAodGhlb3JhX2VuY19zaW5rX2xpbmspLAorCSh0aGVvcmFfYnVmZmVyX2Zyb21fcGFja2V0KSwgKHRoZW9yYV9lbmNfY2hhaW4pOgorCUZpeCBidWcgd2hlcmUgYnVmZmVycyB3ZXJlIG5vdCBtYXJrZWQgYXMga2V5ZnJhbWVzCisJY29ycmVjdGx5LgorCisyMDA0LTA4LTE1ICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGV4dC9sYW1lL2dzdGxhbWUuYzogKGdzdF9sYW1lX3Zicm1vZGVfZ2V0X3R5cGUpLAorCShnc3RfbGFtZV9wcmVzZXRfZ2V0X3R5cGUpLCAoZ3N0X2xhbWVfY2xhc3NfaW5pdCk6CisJZGVzY3JpYmUgdGhlIGVudW0gdmFsdWVzIGZvciB2YnIgbW9kZSBhbmQgcHJlc2V0cyBtb3JlIHZlcmJvc2VseQorCisyMDA0LTA4LTEzICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGV4dC9sYW1lL2dzdGxhbWUuYzogKGdzdF9sYW1lX21vZGVfZ2V0X3R5cGUpLAorCShnc3RfbGFtZV9xdWFsaXR5X2dldF90eXBlKSwgKGdzdF9sYW1lX3BhZGRpbmdfZ2V0X3R5cGUpLAorCShnc3RfbGFtZV9wcmVzZXRfZ2V0X3R5cGUpLCAoZ3N0X2xhbWVfY2xhc3NfaW5pdCksIChnc3RfbGFtZV9pbml0KSwKKwkoZ3N0X2xhbWVfc2V0X3Byb3BlcnR5KSwgKGdzdF9sYW1lX2dldF9wcm9wZXJ0eSksIChnc3RfbGFtZV9zZXR1cCk6CisJKiBleHQvbGFtZS9nc3RsYW1lLmg6CisJYWRkIHByZXNldCBwcm9wZXJ0eSB0byBsYW1lIHNvIGl0IGNhbiB1c2UgbGFtZSBwcmVzZXRzCisKKzIwMDQtMDgtMTMgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogZXh0L2xhbWUvZ3N0bGFtZS5jOiAoZ3N0X2xhbWVfZ2V0X3Byb3BlcnR5KToKKwl3aG9vcHMgZm9yZ290IGJyZWFrLCB0aGFua3MgdGV1ZgorCisyMDA0LTA4LTEzICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGV4dC9sYW1lL2dzdGxhbWUuYzogKGdzdF9sYW1lX3Zicm1vZGVfZ2V0X3R5cGUpLAorCShnc3RfbGFtZV9jbGFzc19pbml0KSwgKGdzdF9sYW1lX3NyY19nZXRjYXBzKSwKKwkoZ3N0X2xhbWVfc2lua19saW5rKSwgKGdzdF9sYW1lX2luaXQpLCAoZ3N0X2xhbWVfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X2xhbWVfZ2V0X3Byb3BlcnR5KSwgKGdzdF9sYW1lX3NldHVwKToKKwkqIGV4dC9sYW1lL2dzdGxhbWUuaDoKKwlmaXggbGFtZSdzIGJyb2tlbiB2YnIgc3R1ZmYsIGFsbG93IGl0IHRvIHJlc2FtcGxlIGlmIG5lZWQgYmUsIGFuZCBhbHNvCisJbWFrZSB4aW5nIGhlYWRlciBvcHRpb25hbAorCisyMDA0LTA4LTEyICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGV4dC9sYW1lL2dzdGxhbWUuYzogKGdzdF9sYW1lX3NyY19nZXRjYXBzKSwgKGdzdF9sYW1lX2luaXQpOgorCWFkZGVkIGdldGNhcHMgZnVuY3Rpb24gc28gc2FtcGxlcmF0ZSBkb2VzbnQgZ2V0IGZpeGF0ZWQgdG8gc2lsbHkgdmFsdWVzCisKKzIwMDQtMDgtMTIgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogZXh0L2xhbWUvZ3N0bGFtZS5jOiAoZ3N0X2xhbWVfc3JjX2xpbmspOgorCXJldmVydCBwcmV2aW91cyBmaXgKKworMjAwNC0wOC0xMiAgSm9oYW4gRGFobGluICA8am9oYW5AZ25vbWUub3JnPgorCisJKiBzeXMvdjRsL2dzdHY0bGVsZW1lbnQuYyAoZ3N0X3Y0bF9pZmFjZV9zdXBwb3J0ZWQpOiBSZW1vdmUgYm9ndXMKKwljaGVja3MuIERvZXNuJ3QgbWF0dGVyIHdoYXQgc3RhdGUgd2UgYXJlIGluLiBJbnRlcmZhY2VzIGFyZSBhCisJY29tcGlsZSB0aW1lIHRoaW5nLCBub3QgcnVudGltZS4gSXQgYWxzbyBicm9rZSB0aGUgcHl0aG9uIGJpbmRpbmdzLgorCisyMDA0LTA4LTEyICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGV4dC9sYW1lL2dzdGxhbWUuYzogKGdzdF9sYW1lX3NyY19saW5rKToKKwltYWRlIHNvdXJjZSBwYWQgbGluayBmdW5jdGlvbiBjaGVjayBpZiBzaW5rcGFkIGlzIG9rLi5maXhlcyB0aGUgcHJvYmxlbQorCXdoZXJlIGNvcmUgZml4YXRlcyB0aGUgb3V0cHV0IHJhdGUgb2YgbGFtZSBzdHVwaWRseQorCisyMDA0LTA4LTEyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIChhdCkgYXBlc3RhYXJ0IChkb3QpIG9yZz4KKworCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzogKGdzdF92NGxzcmNfc3JjX2xpbmspLCAoZ3N0X3Y0bHNyY19maXhhdGUpOgorCSogc3lzL3Y0bC92NGxfY2FsbHMuYzoKKwkqIHN5cy92NGwvdjRsc3JjX2NhbGxzLmM6IChnc3RfdjRsc3JjX3NldF9jYXB0dXJlKToKKwkgIGZpeCBmaXhhdGUgZnVuY3Rpb24gdG8gaGFuZGxlIG5vbnNpbXBsZSBjYXBzLgorCSAgcmVtb3ZlIGJvZ3VzIGNoZWNrIGluIF9saW5rCisJICBjbGVhbnVwcworCisyMDA0LTA4LTEyICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGV4dC9sYW1lL2dzdGxhbWUuYzogKGdzdF9sYW1lX2NsYXNzX2luaXQpLCAoZ3N0X2xhbWVfaW5pdCk6CisJc2V0IGRlZmF1bHQgY29tcHJlc3Npb24gcmF0aW8gcGFyYW1ldGVyIHRvIDAuMCBzbyBiaXRyYXRlIHBhcmFtZXRlcgorCXdvcmtzIDopCisKKzIwMDQtMDgtMTEgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3RjcC9nc3RmZHNldC5jOiBGaXggY29tcGlsZSBwcm9ibGVtIG9uIE9TL1guCisKKzIwMDQtMDgtMTEgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L21wZWcxc3lzL2dzdG1wZWcxc3lzdGVtZW5jb2RlLmM6IE9vcHMsIHRoaXMgd2FzIGNvcnJlY3QKKwliZWZvcmUuCisKKzIwMDQtMDgtMTEgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L3ZpZGVvL3ZpZGVvc2luay5oOiBDaGFuZ2UgY29weXJpZ2h0IGJsb2NrIHRvIExHUEwuCisKKzIwMDQtMDgtMTEgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L3BhbmdvL2dzdHRleHRvdmVybGF5LmM6IEFkZCBjb3B5cmlnaHQgYmxvY2sgYW5kIGZpeCBwbHVnaW4KKwkgIGxpY2Vuc2UgZmllbGQKKwkqIGdzdC1saWJzL2dzdC9pZGN0L01ha2VmaWxlLmFtOiBSZW1vdmUgbW14L3NzZSBjb2RlCisJKiBnc3QtbGlicy9nc3QvdmlkZW8vZ3N0dmlkZW9zaW5rLmM6IENoYW5nZSBjb3B5cmlnaHQgYmxvY2sgdG8KKwkgIExHUEwuCisJKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6IEZpeCBwbHVnaW4gbGljZW5zZSBmaWVsZC4KKwkqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6IEZpeCBwbHVnaW4gbGljZW5zZSBmaWVsZC4KKwkqIGdzdC9tcGVnMXN5cy9nc3RtcGVnMXN5c3RlbWVuY29kZS5jOiBGaXggcGx1Z2luIGxpY2Vuc2UgZmllbGQuCisJKiBnc3QvcnRwL2dzdHJ0cC5jOiBGaXggcGx1Z2luIGxpY2Vuc2UgZmllbGQuCisKKzIwMDQtMDgtMTEgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL01ha2VmaWxlLmFtOgorCSogZ3N0L3RjcC9nc3RmZHNldC5jOiAoZ3N0X2Zkc2V0X21vZGVfZ2V0X3R5cGUpLCAobmVhcmVzdF9wb3cpLAorCShlbnN1cmVfc2l6ZSksIChnc3RfZmRzZXRfbmV3KSwgKGdzdF9mZHNldF9mcmVlKSwKKwkoZ3N0X2Zkc2V0X3NldF9tb2RlKSwgKGdzdF9mZHNldF9nZXRfbW9kZSksIChnc3RfZmRzZXRfYWRkX2ZkKSwKKwkoZ3N0X2Zkc2V0X3JlbW92ZV9mZCksIChnc3RfZmRzZXRfZmRfY3RsX3dyaXRlKSwKKwkoZ3N0X2Zkc2V0X2ZkX2N0bF9yZWFkKSwgKGdzdF9mZHNldF9mZF9oYXNfY2xvc2VkKSwKKwkoZ3N0X2Zkc2V0X2ZkX2hhc19lcnJvciksIChnc3RfZmRzZXRfZmRfY2FuX3JlYWQpLAorCShnc3RfZmRzZXRfZmRfY2FuX3dyaXRlKSwgKGdzdF9mZHNldF93YWl0KToKKwkqIGdzdC90Y3AvZ3N0ZmRzZXQuaDoKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuYzogKGdzdF91bml0X3R5cGVfZ2V0X3R5cGUpLAorCShnc3RfbXVsdGlmZHNpbmtfY2xhc3NfaW5pdCksIChnc3RfbXVsdGlmZHNpbmtfaW5pdCksCisJKGdzdF9tdWx0aWZkc2lua19hZGQpLCAoZ3N0X211bHRpZmRzaW5rX3JlbW92ZSksCisJKGdzdF9tdWx0aWZkc2lua19jbGVhciksIChnc3RfbXVsdGlmZHNpbmtfZ2V0X3N0YXRzKSwKKwkoZ3N0X211bHRpZmRzaW5rX3JlbW92ZV9jbGllbnRfbGluayksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50X3JlYWQpLAorCShnc3RfbXVsdGlmZHNpbmtfY2xpZW50X3F1ZXVlX2RhdGEpLAorCShnc3RfbXVsdGlmZHNpbmtfY2xpZW50X3F1ZXVlX2NhcHMpLAorCShnc3RfbXVsdGlmZHNpbmtfY2xpZW50X3F1ZXVlX2J1ZmZlciksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50X3dyaXRlKSwKKwkoZ3N0X211bHRpZmRzaW5rX3JlY292ZXJfY2xpZW50KSwgKGdzdF9tdWx0aWZkc2lua19xdWV1ZV9idWZmZXIpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudHMpLCAoZ3N0X211bHRpZmRzaW5rX3NldF9wcm9wZXJ0eSksCisJKGdzdF9tdWx0aWZkc2lua19nZXRfcHJvcGVydHkpLCAoZ3N0X211bHRpZmRzaW5rX2luaXRfc2VuZCksCisJKGdzdF9tdWx0aWZkc2lua19jbG9zZSk6CisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmg6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNpbmsuYzogKGdzdF90Y3BzZXJ2ZXJzaW5rX2NsYXNzX2luaXQpLAorCShnc3RfdGNwc2VydmVyc2lua19pbml0KSwgKGdzdF90Y3BzZXJ2ZXJzaW5rX2hhbmRsZV9zZXJ2ZXJfcmVhZCksCisJKGdzdF90Y3BzZXJ2ZXJzaW5rX2hhbmRsZV93YWl0KSwgKGdzdF90Y3BzZXJ2ZXJzaW5rX2luaXRfc2VuZCksCisJKGdzdF90Y3BzZXJ2ZXJzaW5rX2Nsb3NlKToKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc2luay5oOgorCUFic3RyYWN0ZWQgYXdheSB0aGUgc2VsZWN0IGNhbGwsIGltcGxlbWVudGVkIHBvbGwgKHllcyB3ZSByYW4gaW50bworCXRoZSAxMDI0IGxpbWl0IGluIHByb2R1Y3Rpb24pLgorCisyMDA0LTA4LTExICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvdGNwL2dzdHRjcC5jOgorCSogZ3N0L3RjcC9nc3R0Y3BwbHVnaW4uYzoKKwkgIGltcHJvdmUgZGVidWdnZ2luZywgcmVtb3ZlIGFzc2VydAorCisyMDA0LTA4LTEwICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5jOiAoZ3N0X3VuaXRfdHlwZV9nZXRfdHlwZSksCisJKGdzdF9jbGllbnRfc3RhdHVzX2dldF90eXBlKSwgKGdzdF9tdWx0aWZkc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X211bHRpZmRzaW5rX2luaXQpLCAoZ3N0X211bHRpZmRzaW5rX3JlbW92ZV9jbGllbnRfbGluayksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50X3JlYWQpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudF93cml0ZSksCisJKGdzdF9tdWx0aWZkc2lua19yZWNvdmVyX2NsaWVudCksIChnc3RfbXVsdGlmZHNpbmtfcXVldWVfYnVmZmVyKSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRzKSwgKGdzdF9tdWx0aWZkc2lua19zZXRfcHJvcGVydHkpLAorCShnc3RfbXVsdGlmZHNpbmtfZ2V0X3Byb3BlcnR5KToKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuaDoKKwkqIGdzdC90Y3AvZ3N0dGNwLW1hcnNoYWwubGlzdDoKKwlTdGFydGluZyB0byBwcmVwYXJlIGZvciBzcGVjaWZ5aW5nIGJ1ZmZlciB0aW1lIGluIG90aGVyIHVuaXRzCisJdGhhbiBidWZmZXJzLiBFeHBvc2UgcmVtb3ZlIHJlYXNvbiBpbiBzaWduYWwuCisKKzIwMDQtMDgtMTAgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmM6IChnc3RfbXVsdGlmZHNpbmtfYWRkKSwKKwkoZ3N0X211bHRpZmRzaW5rX3JlbW92ZSksIChnc3RfbXVsdGlmZHNpbmtfY2xlYXIpLAorCShnc3RfbXVsdGlmZHNpbmtfcmVtb3ZlX2NsaWVudF9saW5rKSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRfcmVhZCksCisJKGdzdF9tdWx0aWZkc2lua19jbGllbnRfcXVldWVfZGF0YSksCisJKGdzdF9tdWx0aWZkc2lua19jbGllbnRfcXVldWVfYnVmZmVyKSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRfd3JpdGUpLAorCShnc3RfbXVsdGlmZHNpbmtfcXVldWVfYnVmZmVyKSwgKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50cyksCisJKGdzdF9tdWx0aWZkc2lua19jaGFpbiksIChnc3RfbXVsdGlmZHNpbmtfY2xvc2UpOgorCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5oOgorCUFkZGVkIG1vcmUgZGVidWdnaW5nIGluZm8uIENoYW5nZWQgdGhlIHdheSBjbGllbnRzIGFyZQorCXJlbW92ZWQgZnJvbSB0aGUgbGlzdHMuIEZpeGVkIGEgYnVnIHdoZXJlIGEgYmFkIGZpbGUgZGVzY3JpcHRvcgorCWNvdWxkIGNhdXNlIG1hbnkgY2xpZW50cyB0byBiZSByZW1vdmVkLgorCisyMDA0LTA4LTA2ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC92aWRlb3Rlc3RzcmMvZ3N0dmlkZW90ZXN0c3JjLmM6IChnZW5lcmF0ZV9jYXBzbGlzdCk6CisJICBhbGxvdyBhbGwgcGl4ZWwtYXNwZWN0LXJhdGlvcywgbm90IGp1c3QgMToxCisKKzIwMDQtMDgtMDkgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogc3lzL2dsc2luay9BUkJfbXVsdGl0ZXh0dXJlLmg6ICBSZW1vdmUgb2xkIGZpbGVzLgorCSogc3lzL2dsc2luay9FWFRfcGFsZXR0ZWRfdGV4dHVyZS5oOgorCSogc3lzL2dsc2luay9OVl9yZWdpc3Rlcl9jb21iaW5lcnMuaDoKKwkqIHN5cy9nbHNpbmsvZ3N0Z2xfbnZpbWFnZS5jOgorCSogc3lzL2dsc2luay9nc3RnbF9wZHJpbWFnZS5jOgorCSogc3lzL2dsc2luay9nc3RnbF9yZ2JpbWFnZS5jOgorCSogc3lzL2dsc2luay9nc3RnbHNpbmsuYzoKKwkqIHN5cy9nbHNpbmsvZ3N0Z2xzaW5rLmg6CisJKiBzeXMvZ2xzaW5rL2dzdGdseHdpbmRvdy5jOgorCSogc3lzL2dsc2luay9yZWdjb21iX3l1dnJnYi5jOgorCisyMDA0LTA4LTA5ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwlQYXRjaCBmcm9tIEdlcm5vdCBaaWVnbGVyIDxnekBseXNhdG9yLmxpdS5zZT4gcmV3cml0aW5nIHRoZQorCUdMIHNpbmsgcGx1Z2luLiAgKEJ1ZyAjMTQ3MzAyKQorCisJKiBjb25maWd1cmUuYWM6IFRlc3QgZm9yIE9wZW5HTAorCSogc3lzL01ha2VmaWxlLmFtOiBVc2UgdGVzdCBmb3IgT3BlbkdMCisJKiBzeXMvZ2xzaW5rL01ha2VmaWxlLmFtOgorCSogc3lzL2dsc2luay9nbGltYWdlc2luay5jOiByZXdyaXRlCisJKiBzeXMvZ2xzaW5rL2dsaW1hZ2VzaW5rLmg6IHJld3JpdGUKKworMjAwNC0wOC0wOSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvc2RsL3NkbHZpZGVvc2luay5jOiAoZ3N0X3NkbHZpZGVvc2lua19iYXNlX2luaXQpOiAgT25seSBhbGxvdworCXNhbmUgZnJhbWVyYXRlcy4KKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KTogc2FtZQorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19nZXRfeHZfc3VwcG9ydCk6IHNhbWUKKwkqIHRlc3RzdWl0ZS9nc3QtbGludDogVGVzdCBmb3IgR19HVUlOVDY0X0ZPUk1BVCB1c2FnZSBuZWFyIGdldHRleHQuCisKKzIwMDQtMDgtMDkgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmM6IChnc3RfbXVsdGlmZHNpbmtfY2xhc3NfaW5pdCksCisJKGdzdF9tdWx0aWZkc2lua19hZGQpLCAoZ3N0X211bHRpZmRzaW5rX2dldF9zdGF0cyksCisJKGdzdF9tdWx0aWZkc2lua19jbGllbnRfcmVtb3ZlKSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRfcmVhZCksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50X3dyaXRlKSwKKwkoZ3N0X211bHRpZmRzaW5rX3F1ZXVlX2J1ZmZlciksIChnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudHMpOgorCURvIGEgYml0IG1vcmUgbG9nZ2luZywgbWFrZSB0aGUgY2xpZW50X3JlYWQgY29kZSBtb3JlIHJvYnVzdC4KKworMjAwNC0wOC0wOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2pwZWdkZWNfaW5pdF9zb3VyY2UpLAorCShnc3RfanBlZ2RlY19maWxsX2lucHV0X2J1ZmZlciksIChnc3RfanBlZ2RlY19za2lwX2lucHV0X2RhdGEpLAorCShnc3RfanBlZ2RlY19yZXN5bmNfdG9fcmVzdGFydCksIChnc3RfanBlZ2RlY190ZXJtX3NvdXJjZSksCisJKGdzdF9qcGVnZGVjX2luaXQpLCAoZ3N0X2pwZWdkZWNfY2hhaW4pOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOiAoZ3N0X211bHRpcGFydF9kZW11eF9pbml0KSwKKwkoZ3N0X211bHRpcGFydF9kZW11eF9jaGFpbiksIChnc3RfbXVsdGlwYXJ0X2RlbXV4X2NoYW5nZV9zdGF0ZSk6CisJICBjbGVhbnVwcywgZGVidWdnaW5nIGZpeGVzIGFuZCBtZW1sZWFrIHBsdWdnaW5nCisKKzIwMDQtMDgtMDkgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvdGhlb3JhL3RoZW9yYWRlYy5jOiAoZ3N0X3RoZW9yYV9kZWNfY2xhc3NfaW5pdCksCisJKHRoZW9yYV9nZXRfZm9ybWF0cyksICh0aGVvcmFfZGVjX3NyY19jb252ZXJ0KSwKKwkodGhlb3JhX2RlY19zaW5rX2NvbnZlcnQpLCAodGhlb3JhX2RlY19zcmNfcXVlcnkpLAorCSh0aGVvcmFfZGVjX3NyY19ldmVudCksICh0aGVvcmFfZGVjX2V2ZW50KSwgKHRoZW9yYV9kZWNfY2hhaW4pLAorCSh0aGVvcmFfZGVjX2NoYW5nZV9zdGF0ZSk6CisJRG9uJ3QgY3Jhc2ggb24gbWlzc2luZyBoZWFkZXIgcGFja2V0cy4KKworMjAwNC0wOC0wOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogcG8vTElOR1VBUzoKKwkqIHBvL3NxLnBvOgorCSAgQWRkZWQgQWxiYW5pYW4gdHJhbnNsYXRpb24gKExhdXJlbnQgRGhpbWEpCisJKiBwby9jcy5wbzoKKwkgIHVwZGF0ZWQKKworMjAwNC0wOC0wOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L2xhbWUvZ3N0bGFtZS5jOgorCSAgZml4L2FkZCBkZWJ1Z2dpbmcKKworMjAwNC0wOC0wOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOgorCSAgYXNzaWduIGFsbCBUT09fTEFaWSdzIHRvIGEgcmVhbCBjYXRlZ29yeS4gIFRoYW5rcyB0byBXYXJ0aHkgV2FydGhvZy4KKworMjAwNC0wOC0wNiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuYzogKGdzdF9tdWx0aWZkc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X211bHRpZmRzaW5rX2FkZCksIChnc3RfbXVsdGlmZHNpbmtfZ2V0X3N0YXRzKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9yZW1vdmUpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudF9yZWFkKSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRfd3JpdGUpLAorCShnc3RfbXVsdGlmZHNpbmtfcXVldWVfYnVmZmVyKSwgKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50cyk6CisJTWFrZSBzdXJlIHdlIGRvbid0IHRyeSB0byByZWFkIG1vcmUgZnJvbSBhIGNsaWVudCB0aGF0IHdoYXQKKwlpb2N0bCBzYXlzIHVzIG9yIHdlIGRlYWRsb2NrLgorCisyMDA0LTA4LTA1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvdmlkZW90ZXN0c3JjL2dzdHZpZGVvdGVzdHNyYy5jOiAoZ3N0X3ZpZGVvdGVzdHNyY19zcmNfbGluayksCisJKGdzdF92aWRlb3Rlc3RzcmNfY2hhbmdlX3N0YXRlKSwgKGdzdF92aWRlb3Rlc3RzcmNfc3JjX3F1ZXJ5KSwKKwkoZ3N0X3ZpZGVvdGVzdHNyY19oYW5kbGVfc3JjX2V2ZW50KSwgKGdzdF92aWRlb3Rlc3RzcmNfZ2V0KToKKwkgIGRlY291cGxlIHJ1bm5pbmdfdGltZSBhbmQgbl9mcmFtZXMgc28gaXQgY2FuIGhhbmRsZSBjaGFuZ2luZworCSAgZnJhbWVyYXRlIHdoaWxlIHJ1bm5pbmcKKworMjAwNC0wOC0wNSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogcG8vbmwucG86CisJKiBwby9zdi5wbzoKKwkgIHVwZGF0ZWQgdHJhbnNsYXRpb25zCisKKzIwMDQtMDgtMDQgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L3ZpZGVvdGVzdHNyYy9nc3R2aWRlb3Rlc3RzcmMuYzoKKwkoZ3N0X3ZpZGVvdGVzdHNyY19nZXRfY2Fwc2xpc3QpLCAoZ2VuZXJhdGVfY2Fwc2xpc3QpLAorCShwbHVnaW5faW5pdCk6CisJICBnZW5lcmF0ZSB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgY2FwcyBhdCBzdGFydHVwIGFuZCByZXVzZSBpdCBpbnN0ZWFkCisJICBvZiBhbHdheXMgZ2VuZXJhdGluZyBpdAorCisyMDA0LTA3LTMwICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IChnc3RfbXVsdGlwYXJ0X211eF9wYWRfbGluayk6CisJICB3aG9vcHMsIGxhc3QgY2hlY2tpbiBicm9rZSBub3JtYWwgYnVpbGQKKworMjAwNC0wOC0wMyAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvYWxzYS9nc3RhbHNhbWl4ZXIuYzogKGdzdF9hbHNhX21peGVyX2dldF92b2x1bWUpLAorCShnc3RfYWxzYV9taXhlcl9zZXRfdm9sdW1lKSwgKGdzdF9hbHNhX21peGVyX3NldF9tdXRlKSwKKwkoZ3N0X2Fsc2FfbWl4ZXJfc2V0X3JlY29yZCksIChnc3RfYWxzYV9taXhlcl9zZXRfb3B0aW9uKSwKKwkoZ3N0X2Fsc2FfbWl4ZXJfZ2V0X29wdGlvbik6CisJKiBleHQvZHZkbmF2L2R2ZG5hdnNyYy5jOiAoZHZkbmF2X2dldF9ldmVudF9uYW1lKSwKKwkoZHZkbmF2c3JjX3ByaW50X2V2ZW50KToKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKF9maW5kX2NoYWluX3Byb2Nlc3MpLCAoZ3N0X29nZ19wcmludCk6CisJKiBleHQvb2dnL2dzdG9nZ211eC5jOiAoZ3N0X29nZ19tdXhfcGFkX2xpbmspLAorCShnc3Rfb2dnX211eF9wYWRfdW5saW5rKToKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IChnc3RfbXVsdGlwYXJ0X211eF9wYWRfbGluayksCisJKGdzdF9tdWx0aXBhcnRfbXV4X3BhZF91bmxpbmspOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCShnc3RfdmlkZW9iYWxhbmNlX2NvbG9yYmFsYW5jZV9zZXRfdmFsdWUpOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiAoZ3N0X3ZpZGVvbWl4ZXJfcGFkX2xpbmspLAorCShnc3RfdmlkZW9taXhlcl9wYWRfdW5saW5rKToKKwkqIHBvL3VrLnBvOgorCSogc3lzL29zcy9nc3Rvc3NtaXhlci5jOgorCSogc3lzL3Y0bC9nc3R2NGxjb2xvcmJhbGFuY2UuYzoKKwkqIHN5cy92NGwvZ3N0djRsdHVuZXIuYzoKKwkqIHN5cy92NGwvdjRsc3JjX2NhbGxzLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuYzoKKwkgIGNvbXBpbGUgZml4ZXMgZm9yIC0tZGlzYWJsZS1nc3QtZGVidWcsIEdfRElTQUJMRV9BU1NFUlQgYW5kIGZyaWVuZHMKKworMjAwNC0wOC0wMyAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleGFtcGxlcy9keW5wYXJhbXMvZmlsdGVyLmM6ICh1aV9jb250cm9sX2NyZWF0ZSk6CisJKiBleGFtcGxlcy9nc3RwbGF5L3BsYXllci5jOiAocHJpbnRfdGFnKToKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX3JlcXVlc3RfbmV3X3BhZCk6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGthbmltYXRpb24uYzoKKwkoZ3N0X2dka19hbmltYXRpb25faXRlcl9tYXlfYWR2YW5jZSk6CisJKiBleHQvamFjay9nc3RqYWNrLmM6IChnc3RfamFja19yZXF1ZXN0X25ld19wYWQpOgorCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9tYWRfaWQzX3RvX3RhZ19saXN0KSwKKwkodGFnX2xpc3RfdG9faWQzX3RhZ19mb3JlYWNoKSwgKGdzdF9pZDNfdGFnX2hhbmRsZV9ldmVudCk6CisJKiBleHQvdm9yYmlzL29nZ3ZvcmJpc2VuYy5jOiAoZ3N0X29nZ3ZvcmJpc2VuY19nZXRfdGFnX3ZhbHVlKToKKwkqIGV4dC92b3JiaXMvdm9yYmlzZW5jLmM6IChnc3Rfdm9yYmlzZW5jX2dldF90YWdfdmFsdWUpOgorCSogZXh0L3hpbmUveGluZWF1ZGlvZGVjLmM6IChnc3RfeGluZV9hdWRpb19kZWNfY2hhaW4pOgorCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby10ZXN0LmM6IChwcmludF90YWcpOgorCSogZ3N0L3NpbmUvZGVtby1kcGFyYW1zLmM6IChtYWluKToKKwkqIGdzdC90YWdzL2dzdHZvcmJpc3RhZy5jOiAoZ3N0X3RhZ190b192b3JiaXNfY29tbWVudHMpOgorCSogdGVzdHN1aXRlL2Fsc2EvZm9ybWF0cy5jOiAoY3JlYXRlX3BpcGVsaW5lKToKKwkqIHRlc3RzdWl0ZS9hbHNhL3NpbmVzcmMuYzogKHNpbmVzcmNfZm9yY2VfY2FwcyksIChzaW5lc3JjX2dldCk6CisJICBmaXhlcyBmb3IgR19ESVNBQkxFX0FTU0VSVCBhbmQgZnJpZW5kcworCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChhYWNfdHlwZV9maW5kKSwKKwkobXAzX3R5cGVfZnJhbWVfbGVuZ3RoX2Zyb21faGVhZGVyKSwgKG1wM190eXBlX2ZpbmQpLAorCShwbHVnaW5faW5pdCk6CisJICByZXF1aXJlIG1wMyB0eXBlZmluZGluZyB0byBoYXZlIGF0IGxlYXN0IE1JTl9IRUFERVJTIHZhbGlkIGhlYWRlcnMKKwkgIGFkZCB0eXBlZmluZGluZyBmb3IgQUFDIGFkdHMgZmlsZXMKKworMjAwNC0wOC0wNCAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzoKKwkoZ3N0X3hpbWFnZXNpbmtfY2FsY3VsYXRlX3BpeGVsX2FzcGVjdF9yYXRpbyk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOgorCShnc3RfeHZpbWFnZXNpbmtfY2FsY3VsYXRlX3BpeGVsX2FzcGVjdF9yYXRpbyk6CisJTWFrZSBzdXJlIHdlIGNhbGN1bGF0ZSBwaXhlbC1hc3BlY3QtcmF0aW8gdXNpbmcgZmxvYXRpbmcgcG9pbnQgbWF0aHMKKworMjAwNC0wOC0wMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogcG8vdWsucG86CisJICB1cGRhdGVkIHRyYW5zbGF0aW9uCisKKzIwMDQtMDgtMDMgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KToKKwkgIGFkZCBkZWJ1Z2dpbmcgZm9yIGRpc3BsYXkgUEFSIGNhbGN1bGF0aW9uCisKKzIwMDQtMDgtMDIgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29uZmlndXJlLmFjOiBGaXggbWlrbW9kIENGTEFHUy4KKworMjAwNC0wNy0yNyAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvYXVkaW9zY2FsZS9nc3RhdWRpb3NjYWxlLmM6CisJLSBmaXggdGVtcGxhdGVzIHRvIG9ubHkgc3VwcG9ydCBTMTYsIGl0J3MgdGhlIG9ubHkgZm9ybWF0IHRoYXQgd29ya3MKKwktIG1ha2UgY2FwcyBuZWdvIGNvZGUgdXNlIHRyeV9zZXRfY2Fwc19ub25maXhlZCBhbmQgZml4YXRpb24gaW5zdGVhZAorCW9mIHRyeV9zZXRfY2FwcyB0d2ljZSwgd2hpY2ggaXMgbm90IG5pY2UgZm9yIGF1dG9wbHVnZ2VycworCS0gY2hhbmdlIHJhbmsgdG8gc2Vjb25kYXJ5LCBzbyBhdXRvcGx1Z2dlcnMgY2FuIHBpY2sgaXQgdXAgYWZ0ZXIKKwlhdWRpb2NvbnZlcnQKKworMjAwNC0wOC0wMiAgSWFpbiA8aWFpbkBwcmV0dHlwZW9wbGUub3JnPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmMgKGludGVybGVhdmVfaW5pdCksCisJKGludGVybGVhdmVfcmVxdWVzdF9uZXdfcGFkKSwKKwkoaW50ZXJsZWF2ZV9wYWRfcmVtb3ZlZCksCisJKGludGVybGVhdmVfYnVmZmVyZWRfbG9vcCk6IFVzZSB0aGUgcmVhbCBwYWQgY291bnQsIG5vdCB0aGUgYXJ0aWZpY2lhbAorCW9uZS4KKworMjAwNC0wOC0wMiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOiBidW1wIG5hbm8gYmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAwLjguMyA9PT0KKworMjAwNC0wOC0wMiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOiByZWxlYXNpbmcgMC44LjMsICJXYXRlciIKKworMjAwNC0wOC0wMiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzoKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NhbGN1bGF0ZV9waXhlbF9hc3BlY3RfcmF0aW8pLAorCShnc3RfeHZpbWFnZXNpbmtfeGNvbnRleHRfY2xlYXIpLCAoZ3N0X3h2aW1hZ2VzaW5rX3NpbmtfbGluayksCisJKGdzdF94dmltYWdlc2lua19jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3h2aW1hZ2VzaW5rX2J1ZmZlcl9hbGxvYyksCisJKGdzdF94dmltYWdlc2lua19zZXRfcHJvcGVydHkpLCAoZ3N0X3h2aW1hZ2VzaW5rX2dldF9wcm9wZXJ0eSksCisJKGdzdF94dmltYWdlc2lua19pbml0KSwgKGdzdF94dmltYWdlc2lua19jbGFzc19pbml0KToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmg6CisJICBhcHBseSBzaW1pbGFyIFBBUiBmaXhlcyBhcyB0byB4aW1hZ2VzaW5rCisKKzIwMDQtMDgtMDIgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwlwYXRjaCBmcm9tOiBCZW5qYW1pbiBPdHRlCisKKwkqIGV4dC9sYW1lL2dzdGxhbWUuYzogKGdzdF9sYW1lX3NyY19saW5rKSwgKGdzdF9sYW1lX2luaXQpOgorCSAgYWRkIGxpbmsgZnVuY3Rpb24gdG8gbGFtZS4gIEZpeGVzICMxNDg5ODYuCisKKzIwMDQtMDgtMDIgIEpvaGFuIERhaGxpbiAgPGpvaGFuQGdub21lLm9yZz4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYyAoZ3N0X211bHRpcGFydF9tdXhfbmV4dF9idWZmZXIpOgorCWZpeCBkZWJ1Z2dpbmcgbG9nCisKKzIwMDQtMDctMzAgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvTWFrZWZpbGUuYW06IEZpeCB0aGluZ3MgdGhhdCBzaG91bGQgaGF2ZSBiZWVuCisJZml4ZWQgaW4gdGhlIGxhc3QgY2hlY2tpbi4KKworMjAwNC0wNy0zMCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvbXVsdGlwYXJ0L01ha2VmaWxlLmFtOiBGaXggdGhpbmdzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbgorCWZpeGVkIGluIHRoZSBsYXN0IGNoZWNraW4uCisKKzIwMDQtMDctMzAgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogdGVzdHN1aXRlL211bHRpZmlsZXNpbmsvTWFrZWZpbGUuYW06IEZpeCB1bnVzZWQgdmFyaWFibGUuCisKKzIwMDQtMDctMzAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGJ1bXAgbmFubyBmb3IgcHJlcmVsZWFzZQorCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9odS5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSAgdXBkYXRlcworCisyMDA0LTA3LTMwICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5jOiAoZ3N0X211bHRpZmRzaW5rX2NsYXNzX2luaXQpLAorCShnc3RfbXVsdGlmZHNpbmtfYWRkKSwgKGdzdF9tdWx0aWZkc2lua19yZW1vdmUpLAorCShnc3RfbXVsdGlmZHNpbmtfY2xlYXIpLCAoZ3N0X211bHRpZmRzaW5rX2dldF9zdGF0cyksCisJKGdzdF9tdWx0aWZkc2lua19jbGllbnRfcmVtb3ZlKSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRfd3JpdGUpLAorCShnc3RfbXVsdGlmZHNpbmtfcXVldWVfYnVmZmVyKSwgKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50cyk6CisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmg6CisJUmVjb3ZlciBmcm9tIGEgc2VsZWN0IHdpdGggYSBiYWQgZmlsZSBkZXNjcmlwdG9yIGJ5IHJlbW92aW5nCisJdGhlIGNsaWVudC4KKworMjAwNC0wNy0zMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgZml4IHJlcXVpcmVtZW50IG9mIGNvcmUKKwkqIGdzdC1saWJzL2dzdC9wbGF5L3BsYXkuYzogKGdzdF9wbGF5X2Vycm9yX3BsdWdpbiksCisJKGdzdF9wbGF5X3BpcGVsaW5lX3NldHVwKToKKwkgIGRvbid0IHVzZSBjb2xvcnNwYWNlIGVsZW1lbnQuICBkbyB1c2UgaGVybWVzY29sb3JzcGFjZSBlbGVtZW50LgorCSAgbWFrZSBtYWNybyB0byBnZXQgYSBjb2xvcnNwYWNlIGVsZW1lbnQuCisJICBtYXJrIHN0cmluZ3MgZm9yIHRyYW5zbGF0aW9uLgorCSogcG8vUE9URklMRVMuaW46CisJICBhZGQgcGxheS5jCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vY3MucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vbmwucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJICB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMDQtMDctMzAgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzogKGdzdF9wbmdlbmNfY2xhc3NfaW5pdCk6CisJZml4IGRlZmF1bHQgZm9yIG5ld21lZGlhIGZsYWcKKworMjAwNC0wNy0zMCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6IChnc3RfdGhlb3JhX2RlY19jbGFzc19pbml0KSwKKwkoZ3N0X3RoZW9yYV9kZWNfaW5pdCksICh0aGVvcmFfZ2V0X2Zvcm1hdHMpLAorCSh0aGVvcmFfZGVjX3NyY19jb252ZXJ0KSwgKHRoZW9yYV9kZWNfc2lua19jb252ZXJ0KSwKKwkodGhlb3JhX2RlY19zcmNfcXVlcnkpLCAodGhlb3JhX2RlY19zcmNfZXZlbnQpLCAodGhlb3JhX2RlY19ldmVudCksCisJKHRoZW9yYV9kZWNfY2hhaW4pLCAodGhlb3JhX2RlY19zZXRfcHJvcGVydHkpLAorCSh0aGVvcmFfZGVjX2dldF9wcm9wZXJ0eSk6CisJKiBleHQvdGhlb3JhL3RoZW9yYWVuYy5jOiAoZ3N0X2JvcmRlcl9tb2RlX2dldF90eXBlKSwKKwkoZ3N0X3RoZW9yYV9lbmNfY2xhc3NfaW5pdCksIChnc3RfdGhlb3JhX2VuY19pbml0KSwKKwkodGhlb3JhX2VuY19zaW5rX2xpbmspLCAodGhlb3JhX2VuY19jaGFpbiksCisJKHRoZW9yYV9lbmNfc2V0X3Byb3BlcnR5KSwgKHRoZW9yYV9lbmNfZ2V0X3Byb3BlcnR5KToKKwlBZGRlZCBjcm9wcGluZyBvcHRpb24gdG8gdGhlb3JhIGRlY29kZXIuCisJQWRkZWQgYm9yZGVyIG9wdGlvbiB0byB0aGVvcmEgZW5jb2Rlci4KKworMjAwNC0wNy0zMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiAoZ3N0X3BuZ2VuY19jbGFzc19pbml0KSwKKwkoZ3N0X3BuZ2VuY19pbml0KSwgKGdzdF9wbmdlbmNfY2hhaW4pLCAoZ3N0X3BuZ2VuY19nZXRfcHJvcGVydHkpLAorCShnc3RfcG5nZW5jX3NldF9wcm9wZXJ0eSk6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5oOgorCUFkZGVkIG5ld21lZGlhIHN1cHBvcnQgdG8gcG5nZW5jIHNvIG5vdyBnc3QtbGF1bmNoLTAuOCB2aWRlb3Rlc3RzcmMgISBmZm1wZWdjb2xvcnNwYWNlICEgcG5nZW5jIHNuYXBzaG90PWZhbHNlIG5ld21lZGlhPXRydWUgISBtdWx0aWZpbGVzaW5rIGxvY2F0aW9uPWJsYWglZC5wbmcgd29ya3MgYXMgZXhwZWN0ZWQKKworMjAwNC0wNy0zMCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC90aGVvcmEvdGhlb3JhZW5jLmM6IChnc3RfdGhlb3JhX2VuY19jbGFzc19pbml0KSwKKwkodGhlb3JhX2VuY19zaW5rX2xpbmspLCAodGhlb3JhX2VuY19jaGFpbiksCisJKHRoZW9yYV9lbmNfc2V0X3Byb3BlcnR5KSwgKHRoZW9yYV9lbmNfZ2V0X3Byb3BlcnR5KToKKwlGaXggZW5jb2Rpbmcgb2Ygbm9uLW11bHRpcGxlLW9mLTE2IHZpZGVvLgorCisyMDA0LTA3LTI5ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogbWFrZSB0ZXN0IGZvciBhdWRpb2ZpbGUgbW9yZSBzdHJpY3QKKworMjAwNC0wNy0yNSAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKHBsdWdpbl9pbml0KToKKwkgIGdpdmUgZGlmZmVyZW50IG5hbWVzIHRvIHR5cGVmaW5kIGZ1bmN0aW9ucworCisyMDA0LTA3LTI4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3JlbmVnb3RpYXRlX3NpemUpLAorCShnc3RfeGltYWdlc2lua19jYWxjdWxhdGVfcGl4ZWxfYXNwZWN0X3JhdGlvKSwKKwkoZ3N0X3hpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KSwgKGdzdF94aW1hZ2VzaW5rX2dldGNhcHMpLAorCShnc3RfeGltYWdlc2lua19zaW5rX2xpbmspLCAoZ3N0X3hpbWFnZXNpbmtfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3hpbWFnZXNpbmtfc2V0X3h3aW5kb3dfaWQpLCAoZ3N0X3hpbWFnZXNpbmtfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3hpbWFnZXNpbmtfZ2V0X3Byb3BlcnR5KSwgKGdzdF94aW1hZ2VzaW5rX2luaXQpOgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmg6CisJICBhbGxvY2F0ZSBQQVIncyBkeW5hbWljYWxseS4KKwkgIHVzZSBhdXRvZGV0ZWN0ZWQgUEFSIGlmIG5vIG9iamVjdC1zZXQgUEFSIGlzIGdpdmVuLgorCSAgYWRkIHdvcmthcm91bmQgZm9yIGRpcmVjdGZiJ3MgWCBub3Qgc2V0dGluZyBwaHlzaWNhbCBzaXplLgorCSAgZml4IHRvIHh2aW1hZ2VzaW5rIHdpbGwgZm9sbG93IHRvbW9ycm93LgorCisyMDA0LTA3LTI4ICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGV4dC9sYW1lL2dzdGxhbWUuYzogKGdzdF9sYW1lX2NoYWluKTogc2VuZCB0YWcgZXZlbnRzIGRvd25zdHJlYW0KKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmM6IChnc3Rfc2hvdXQyc2VuZF9wcm90b2NvbF9nZXRfdHlwZSksCisJKGdzdF9zaG91dDJzZW5kX2dldF90eXBlKSwgKGdzdF9zaG91dDJzZW5kX3NldF9jbG9jayksCisJKGdzdF9zaG91dDJzZW5kX2NsYXNzX2luaXQpLCAoZ3N0X3Nob3V0MnNlbmRfaW5pdCksCisJKHNldF9zaG91dF9tZXRhZGF0YSksIChnc3Rfc2hvdXQyc2VuZF9zZXRfbWV0YWRhdGEpLAorCShnc3Rfc2hvdXQyc2VuZF9jaGFpbiksIChnc3Rfc2hvdXQyc2VuZF9zZXRfcHJvcGVydHkpLAorCShnc3Rfc2hvdXQyc2VuZF9nZXRfcHJvcGVydHkpLCAoZ3N0X3Nob3V0MnNlbmRfY29ubmVjdCksCisJKGdzdF9zaG91dDJzZW5kX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5oOgorCS0gZml4IGZvciBzZW5kaW5nIG1wMyBhdWRpbyB0byBpY2VjYXN0MiBzZXJ2ZXIsIGlmIHBhZCBsaW5rIGZ1bmN0aW9uIG5vdAorCWNhbGxlZCBiZWZvcmUgUEFVU0VEIHN0YXRlCisJLSBhZGRlZCBvcHRpb24gdG8gdXNlIEdTdHJlYW1lciBjbG9jayBzeW5jIChhcyBvcHBvc2VkIHRvIGxpYnNob3V0J3Mgb3duIHN5bmMpCisJLSBhZGRlZCB0YWdnaW5nIHN1cHBvcnQgZm9yIG1wMyBhdWRpbyBicm9hZGNhc3RlZAorCSogZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYzogKGdzdF9tb25vc2NvcGVfY2xhc3NfaW5pdCk6CisJZGVidWcgaW5mbworCisyMDA0LTA3LTI4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9zcmNfcXVlcnkpLAorCShnc3Rfb2dnX2RlbXV4X3B1c2gpOgorCVJldHVybiBxdWVyeSBmYWlsdXJlIHdoZW4gd2UgZG9uJ3Qga25vdyB0aGUgbGVuZ3RoIG9mCisJYW4gb2dnIHN0cmVhbSBpbnN0ZWRhIG9mIHJldHVybmluZyBUUlVFIHdpdGggYSBib2d1cyB2YWx1ZS4KKworMjAwNC0wNy0yOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6ICh0aGVvcmFfZ2V0X2Zvcm1hdHMpLAorCSh0aGVvcmFfZGVjX3NyY19jb252ZXJ0KSwgKHRoZW9yYV9kZWNfc2lua19jb252ZXJ0KSwKKwkodGhlb3JhX2RlY19zcmNfcXVlcnkpLCAodGhlb3JhX2RlY19zcmNfZXZlbnQpLCAodGhlb3JhX2RlY19ldmVudCksCisJKHRoZW9yYV9kZWNfY2hhaW4pOgorCURvbid0IHNjcmV3IHVwIHRoZSAxIENocm9tYSBmb3IgMSBsdW1hIHNhbXBsZSBzaXR1YXRpb24gd2hlbiB3ZQorCWhhdmUgYW4gb2RkIG9mZnNldC93aWR0aCBieSBhZGRpbmcgYSBibGFjayBib3JkZXIgaW4gdGhvc2UgY2FzZXMuCisKKzIwMDQtMDctMjggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvdGhlb3JhL3RoZW9yYWRlYy5jOiAodGhlb3JhX2dldF9mb3JtYXRzKSwKKwkodGhlb3JhX2RlY19zcmNfY29udmVydCksICh0aGVvcmFfZGVjX3NpbmtfY29udmVydCksCisJKHRoZW9yYV9kZWNfc3JjX3F1ZXJ5KSwgKHRoZW9yYV9kZWNfc3JjX2V2ZW50KSwgKHRoZW9yYV9kZWNfZXZlbnQpLAorCSh0aGVvcmFfZGVjX2NoYWluKToKKwkqIGV4dC90aGVvcmEvdGhlb3JhZW5jLmM6ICh0aGVvcmFfZW5jX3NpbmtfbGluayk6CisJQWRkZWQgZmlyc3QgYXR0ZW1wdCBhdCBjcm9wcGluZyBvZiB0aGUgaW1hZ2UgYXMgcmVxdWlyZWQgYnkgdGhlCisJdGhlb3JhIHNwZWMuIFdlIG5lZWQgbW9yZSBwcm9wZXJ0aWVzIGluIHRoZSBjYXBzIChvZmZzZXRfeCwKKwlvZmZzZXRfeSxzdHJpZGUpIHRvIGltcGxlbWVudCB0aGlzIGNvcnJlY3RseS4KKworMjAwNC0wNy0yOCAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBleHQvZHZkbmF2L1JFQURNRToKKwkgIFVwZGF0ZSB0aGUgUkVBRE1FIHRvIHVzZSBkdmRkZW11eAorCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuYzogKGdzdF9waXhidWZzY2FsZV9nZXRjYXBzKToKKwkgIEVuc3VyZSBnZXRjYXBzIHJldHVybnMgYSBzdWJzZXQgb2YgdGhlIHRlbXBsYXRlIGNhcHMKKwkqIGdzdC9tcGVnMnN1Yi9nc3RtcGVnMnN1YnQuYzogKGdzdF9tcGVnMnN1YnRfYmFzZV9pbml0KSwKKwkoZ3N0X21wZWcyc3VidF9pbml0KToKKwkgIEVuc3VyZSBnZXRjYXBzIHJldHVybnMgYSBzdWJzZXQgb2YgdGhlIHRlbXBsYXRlIGNhcHMKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdGR2ZGRlbXV4LmM6IChnc3RfZHZkX2RlbXV4X2NsYXNzX2luaXQpLAorCShnc3RfZHZkX2RlbXV4X2luaXQpLCAoZ3N0X2R2ZF9kZW11eF9nZXRfdmlkZW9fc3RyZWFtKSwKKwkoZ3N0X2R2ZF9kZW11eF9nZXRfc3VicGljdHVyZV9zdHJlYW0pLAorCShnc3RfZHZkX2RlbXV4X3NlbmRfc3ViYnVmZmVyKSwgKGdzdF9kdmRfZGVtdXhfc2V0X2N1cl9zdWJwaWN0dXJlKToKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdGR2ZGRlbXV4Lmg6CisJICBTZXQgdGhlIGV4cGxpY2l0IGNhcHMgb24gdGhlIGN1cnJlbnRfdmlkZW8gcGFkIGJlZm9yZSBwdXNoaW5nCisJICBhbnl0aGluZworCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ2RlbXV4LmM6IChnc3RfbXBlZ19kZW11eF9nZXRfdmlkZW9fc3RyZWFtKSwKKwkoZ3N0X21wZWdfZGVtdXhfZ2V0X2F1ZGlvX3N0cmVhbSk6CisJICBGcmVlIGNhcHMgdXNlZCB0byBnc3RfcGFkX3NldF9leHBsaWNpdF9jYXBzLCB3aGljaCB0YWtlcyBhIGNvbnN0CisJICBHc3RDYXBzICoKKworMjAwNC0wNy0yOCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOiB1cGRhdGUgR1N0cmVhbWVyIHJlcXVpcmVtZW50IHRvIDAuOC40IGJlY2F1c2Ugb2YKKwkgIEdzdEZyYWN0aW9uLgorCisyMDA0LTA3LTI4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfZm10KSwKKwkoZ3N0X3dhdnBhcnNlX2hhbmRsZV9zZWVrKSwgKGdzdF93YXZwYXJzZV9zcmNwYWRfZXZlbnQpOgorCUFkZCB0aGUgcGFkIHRvIHRoZSBlbGVtZW50IGFmdGVyIHNldHRpbmcgdXAgdGhlIGNhcHMuIFRoaXMKKwltYWtlcyBpdCBhIGxvdCBlYXNpZXIgdG8gYXV0b3BsdWcuCisKKzIwMDQtMDctMjcgIFN0ZXZlIExob21tZSAgPHN0ZXZlLmxob21tZUBmcmVlLmZyPgorCisJKiBnc3QvbWVkaWFuL2dzdG1lZGlhbi5jOgorCSogZ3N0L21wZWcyc3VidC9nc3RtcGVnMnN1YnQuYzoKKwkqIGdzdC9tcGVnYXVkaW9wYXJzZS9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0ZHZkZGVtdXguYzoKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdkZW11eC5jOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ3BhY2tldGl6ZS5jOgorCSogZ3N0L3J0anBlZy9nc3RydGpwZWcuYzoKKwkqIGdzdC9ydGpwZWcvZ3N0cnRqcGVnZGVjLmM6CisJKiBnc3QvcnRqcGVnL2dzdHJ0anBlZ2VuYy5jOgorCSogZ3N0L3NpbmUvZ3N0c2luZXNyYy5jOgorCSogZ3N0L3Ntb290aC9nc3RzbW9vdGguYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmg6CisJKiBnc3Qvc3RlcmVvL2dzdHN0ZXJlby5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9maWx0ZXIuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb3NjYWxlL2dzdHZpZGVvc2NhbGUuYzoKKwkqIGdzdC92aWRlb3NjYWxlL3ZpZGVvc2NhbGUuYzoKKwkqIGdzdC92aWRlb3Rlc3RzcmMvZ3N0dmlkZW90ZXN0c3JjLmM6CisJKiBnc3QvdmlkZW90ZXN0c3JjL3ZpZGVvdGVzdHNyYy5jOgorCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgZml4IGxvY2FsIGluY2x1ZGVzIGFuZCA2NCBiaXRzIGNvbnN0YW50cworCisyMDA0LTA3LTI3ICBTdGV2ZSBMaG9tbWUgIDxzdGV2ZS5saG9tbWVAZnJlZS5mcj4KKworCSogd2luMzIvZ3N0LnNsbjoKKwkqIGdzdC1saWJzL2dzdC8qLyoudmNwcm9qOgorCSogZ3N0LyovKi52Y3Byb2o6CisJICBtb3JlIHdvcmtpbmcgcGx1Z2lucworCisyMDA0LTA3LTI3ICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIHRlc3RzdWl0ZS9hbHNhL01ha2VmaWxlLmFtOgorCSogdGVzdHN1aXRlL2Fsc2Evc3Jjc3RhdGUuYzoKKwlhZGQgdGVzdCBmb3IgYWxzYXNyYyBjaGFuZ2luZyBzdGF0ZQorCisyMDA0LTA3LTI3ICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGdzdC9zaWxlbmNlL2dzdHNpbGVuY2UuYzogKGdzdF9zaWxlbmNlX2luaXQpLCAoZ3N0X3NpbGVuY2VfbGluayksCisJKGdzdF9zaWxlbmNlX2dldCk6CisJKiBnc3Qvc2lsZW5jZS9nc3RzaWxlbmNlLmg6CisJZml4IHNpbGVuY2UgZ2VuZXJhdGlvbiBmb3IgMTZiaXQgcmF3IGF1ZGlvCisKKzIwMDQtMDctMjcgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCShnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfbWV0YWRhdGEpLAorCShnc3RfbWF0cm9za2FfZGVtdXhfdmlkZW9fY2FwcyksIChnc3RfbWF0cm9za2FfZGVtdXhfcGx1Z2luX2luaXQpOgorCSogZ3N0L21wZWdhdWRpby9jb21tb24uYzoKKwkqIGdzdC92aWRlb3NjYWxlL2dzdHZpZGVvc2NhbGUuYzogKGdzdF92aWRlb3NjYWxlX2NsYXNzX2luaXQpLAorCShnc3RfdmlkZW9zY2FsZV9nZXRjYXBzKSwgKGdzdF92aWRlb3NjYWxlX2xpbmspLAorCShnc3RfdmlkZW9zY2FsZV9zcmNfZml4YXRlKSwgKGdzdF92aWRlb3NjYWxlX2luaXQpLAorCShnc3RfdmlkZW9zY2FsZV9maW5hbGl6ZSk6CisJKiBnc3QvdmlkZW9zY2FsZS9nc3R2aWRlb3NjYWxlLmg6CisJKiBnc3QvdmlkZW90ZXN0c3JjL2dzdHZpZGVvdGVzdHNyYy5jOgorCShnc3RfdmlkZW90ZXN0c3JjX2dldF9jYXBzbGlzdCk6CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSogc3lzL29zcy9nc3Rvc3NtaXhlci5jOiAoZmlsbF9sYWJlbHMpOgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19yZW5lZ290aWF0ZV9zaXplKSwKKwkoZ3N0X3hpbWFnZXNpbmtfaGFuZGxlX3hldmVudHMpLAorCShnc3RfeGltYWdlc2lua19jYWxjdWxhdGVfcGl4ZWxfYXNwZWN0X3JhdGlvKSwKKwkoZ3N0X3hpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KSwgKGdzdF94aW1hZ2VzaW5rX2ZpeGF0ZSksCisJKGdzdF94aW1hZ2VzaW5rX2dldGNhcHMpLCAoZ3N0X3hpbWFnZXNpbmtfc2lua19saW5rKSwKKwkoZ3N0X3hpbWFnZXNpbmtfY2hhaW4pLCAoZ3N0X3hpbWFnZXNpbmtfc2V0X3h3aW5kb3dfaWQpLAorCShnc3RfeGltYWdlc2lua19zZXRfcHJvcGVydHkpLCAoZ3N0X3hpbWFnZXNpbmtfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3hpbWFnZXNpbmtfaW5pdCksIChnc3RfeGltYWdlc2lua19jbGFzc19pbml0KToKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5oOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzoKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NhbGN1bGF0ZV9waXhlbF9hc3BlY3RfcmF0aW8pLAorCShnc3RfeHZpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KSwgKGdzdF94dmltYWdlc2lua19zaW5rX2xpbmspLAorCShnc3RfeHZpbWFnZXNpbmtfY2hhaW4pLCAoZ3N0X3h2aW1hZ2VzaW5rX2J1ZmZlcl9hbGxvYyksCisJKGdzdF94dmltYWdlc2lua19zZXRfcHJvcGVydHkpLCAoZ3N0X3h2aW1hZ2VzaW5rX2dldF9wcm9wZXJ0eSksCisJKGdzdF94dmltYWdlc2lua19pbml0KSwgKGdzdF94dmltYWdlc2lua19jbGFzc19pbml0KToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmg6CisJICBmaXJzdCBiYXRjaCBvZiBwaXhlbCBhc3BlY3QgcmF0aW8gY29tbWl0cy4KKworMjAwNC0wNy0yNyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29sb3JzcGFjZS5jOgorCShnc3RfZmZtcGVnY29sb3JzcGFjZV9jbGFzc19pbml0KSwgKGdzdF9mZm1wZWdjb2xvcnNwYWNlX2NoYWluKToKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2ltZ2NvbnZlcnQuYzogKGF2cGljdHVyZV9maWxsKToKKwkgIGhhbmRsZSBzdHJpZGUsIG5lZWRzIHdvcmsgaWYgd2Ugd2FudCB0byBtb3ZlIHN0cmlkZSBoYW5kbGluZworCSAgdXBzdHJlYW0sIGJ1dCB3b3JrcyBjb3JyZWN0bHkgZm9yIG91ciBwdXJwb3Nlcy4KKworMjAwNC0wNy0yNyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L3ZpZGVvc2NhbGUvUkVBRE1FOgorCSAgYWRkIHRlc3RpbmcgZXhhbXBsZXMKKwkqIGdzdC92aWRlb3NjYWxlL2dzdHZpZGVvc2NhbGUuYzogKGdzdF92aWRlb3NjYWxlX2xpbmspLAorCShnc3RfdmlkZW9zY2FsZV9jaGFpbik6CisJKiBnc3QvdmlkZW9zY2FsZS92aWRlb3NjYWxlLmM6IChnc3RfdmlkZW9zY2FsZV9zZXR1cCksCisJKGdzdF92aWRlb3NjYWxlX2dldF9zaXplKToKKwkgIGFkZCBnZXRfc2l6ZSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgc3RyaWRlIGxpa2UgdmlkZW90ZXN0c3JjLgorCSAgZml4ZXMgY29udmVyc2lvbiBmb3IgWVVWIGZvcm1hdHMgZm9yIGFzIG11Y2ggYXMgSSBjYW4gdGVzdCB0aGVtLgorCisyMDA0LTA3LTI3ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2NoZWNrX3hzaG1fY2FsbHMpLAorCShnc3RfeGltYWdlc2lua194aW1hZ2VfbmV3KSwgKGdzdF94aW1hZ2VzaW5rX3hpbWFnZV9kZXN0cm95KToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfY2hlY2tfeHNobV9jYWxscyksCisJKGdzdF94dmltYWdlc2lua194dmltYWdlX25ldyksIChnc3RfeHZpbWFnZXNpbmtfeHZpbWFnZV9kZXN0cm95KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3h2aW1hZ2VfcHV0KToKKwkgIGZ1cnRoZXIgY2xlYW51cHMsIGxvZ2dpbmcsIGVycm9yIGhhbmRsaW5nIGFuZCBzeW5jaHJvbml6aW5nCisKKzIwMDQtMDctMjcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IChnc3RfdmlkZW9taXhlcl9wYWRfZ2V0X3R5cGUpLAorCShnc3RfdmlkZW9taXhlcl9wYWRfY2xhc3NfaW5pdCksIChnc3RfdmlkZW9taXhlcl9wYWRfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfcGFkX3NldF9wcm9wZXJ0eSksCisJKGdzdF92aWRlb21peGVyX3BhZF9zaW5rY29ubmVjdCksIChnc3RfdmlkZW9taXhlcl9wYWRfaW5pdCksCisJKGdzdF92aWRlb19taXhlcl9iYWNrZ3JvdW5kX2dldF90eXBlKSwgKGdzdF92aWRlb21peGVyX2dldF90eXBlKSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfY2xhc3NfaW5pdCksIChnc3RfdmlkZW9taXhlcl9pbml0KSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfZ2V0Y2FwcyksIChnc3RfdmlkZW9taXhlcl9yZXF1ZXN0X25ld19wYWQpLAorCShnc3RfdmlkZW9taXhlcl9ibGVuZF9heXV2X2k0MjApLCAocGFkX3pvcmRlcl9jb21wYXJlKSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfc29ydF9wYWRzKSwgKGdzdF92aWRlb21peGVyX2ZpbGxfY2hlY2tlciksCisJKGdzdF92aWRlb21peGVyX2ZpbGxfY29sb3IpLCAoZ3N0X3ZpZGVvbWl4ZXJfZmlsbF9xdWV1ZXMpLAorCShnc3RfdmlkZW9taXhlcl9ibGVuZF9idWZmZXJzKSwgKGdzdF92aWRlb21peGVyX3VwZGF0ZV9xdWV1ZXMpLAorCShnc3RfdmlkZW9taXhlcl9sb29wKSwgKHBsdWdpbl9pbml0KToKKwlCZSBhIG5pY2VyIG5lZ290aWF0aW9uIGNpdGl6ZW4gYW5kIHByb3ZpZGUgYSBnZXRjYXBzIGZ1bmN0aW9uIG9uCisJdGhlIHNyY3BhZC4gVGhpcyBhbHNvIGZpeGVzIGEgY3Jhc2ggd2hlbiByZXNpemluZy4KKworMjAwNC0wNy0yNyAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2NoZWNrX3hzaG1fY2FsbHMpLAorCShnc3RfeHZpbWFnZXNpbmtfeHZpbWFnZV9uZXcpOiBTb21lIGZpeGVzIHRvIGltYWdlIHNpemUgY2FsY3VsYXRpb24uCisKKzIwMDQtMDctMjcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiAoZ3N0X3BuZ2RlY19zcmNfZ2V0Y2Fwcyk6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiAoZ3N0X3BuZ2VuY19jbGFzc19pbml0KSwKKwkoZ3N0X3BuZ2VuY19pbml0KSwgKGdzdF9wbmdlbmNfY2hhaW4pLCAoZ3N0X3BuZ2VuY19nZXRfcHJvcGVydHkpLAorCShnc3RfcG5nZW5jX3NldF9wcm9wZXJ0eSk6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5oOgorCUFkZGVkIHNuYXBzaG90IHByb3BlcnR5IHRvIHBuZ2VuYy4KKwlyZW1vdmVkIGdfcHJpbnQgZnJvbSBwbmdkZWMKKworMjAwNC0wNy0yNyAgU3RldmUgTGhvbW1lICA8c3RldmUubGhvbW1lQGZyZWUuZnI+CisKKwkqIGdzdC9hYzNwYXJzZS9hYzNwYXJzZS52Y3Byb2oKKwkqIGdzdC9hZGRlci9hZGRlci52Y3Byb2oKKwkqIGdzdC9hbHBoYS9hbHBoYS52Y3Byb2oKKwkqIGdzdC9hbHBoYS9hbHBoYWNvbG9yLnZjcHJvagorCSogZ3N0L2FzZmRlbXV4L2FzZi52Y3Byb2oKKwkqIGdzdC9hdWRpb2NvbnZlcnQvYXVkaW9jb252ZXJ0LnZjcHJvagorCSogZ3N0L2F1ZGlvcmF0ZS9hdWRpb3JhdGUudmNwcm9qCisJKiBnc3QvYXVkaW9zY2FsZS9hdWRpb3NjYWxlLnZjcHJvagorCSogZ3N0L2F1cGFyc2UvYXVwYXJzZS52Y3Byb2oKKwkqIGdzdC9hdmkvYXZpLnZjcHJvagorCSogZ3N0L2NkeGFwYXJzZS9jZHhhcGFyc2UudmNwcm9qCisJKiBnc3QvY2hhcnQvY2hhcnQudmNwcm9qCisJKiBnc3QvY29sb3JzcGFjZS9jb2xvcnNwYWNlLnZjcHJvagorCSogZ3N0L2N1dHRlci9jdXR0ZXIudmNwcm9qCisJKiBnc3QvZGVidWcvZGVidWcudmNwcm9qCisJKiBnc3QvZGVidWcvZWZlbmNlLnZjcHJvagorCSogZ3N0L2RlYnVnL25hdmlnYXRpb250ZXN0LnZjcHJvagorCSogZ3N0L2RlaW50ZXJsYWNlL2RlaW50ZXJsYWNlLnZjcHJvagorCSogZ3N0L2VmZmVjdHYvZWZmZWN0di52Y3Byb2oKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2ZmbXBlZ2NvbG9yc3BhY2UudmNwcm9qCisJKiBnc3QvZmlsdGVyL2ZpbHRlci52Y3Byb2oKKwkqIGdzdC9mbHgvZmx4ZGVjLnZjcHJvagorCSogZ3N0L2dvb20vZ29vbS52Y3Byb2oKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUudmNwcm9qCisJKiBnc3QvbGF3L2FsYXcudmNwcm9qCisJKiBnc3QvbGF3L211bGF3LnZjcHJvagorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLnZjcHJvagorCSogZ3N0L21lZGlhbi9tZWRpYW4udmNwcm9qCisJKiBnc3QvbWl4bWF0cml4L21peG1hdHJpeC52Y3Byb2oKKwkqIGdzdC9tcGVnMXN5cy9tcGVnMXN5c3RlbWVuY29kZS52Y3Byb2oKKwkqIGdzdC9tcGVnMXZpZGVvcGFyc2UvbXAxdmlkZW9wYXJzZS52Y3Byb2oKKwkqIGdzdC9tcGVnMnN1Yi9tcGVnMnN1YnQudmNwcm9qCisJKiBnc3QvbXBlZ2F1ZGlvL21wZWdhdWRpby52Y3Byb2oKKwkqIGdzdC9tcGVnYXVkaW9wYXJzZS9tcGVnYXVkaW9wYXJzZS52Y3Byb2oKKwkqIGdzdC9tcGVnc3RyZWFtL21wZWdzdHJlYW0udmNwcm9qCisJKiBnc3QvbXVsdGlmaWxlc2luay9tdWx0aWZpbGVzaW5rLnZjcHJvagorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnQudmNwcm9qCisJKiBnc3Qvb25ldG9uL29uZXRvbi52Y3Byb2oKKwkqIGdzdC9vdmVybGF5L292ZXJsYXkudmNwcm9qCisJKiBnc3QvcGFzc3Rocm91Z2gvcGFzc3Rocm91Z2gudmNwcm9qCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LnZjcHJvagorCSogZ3N0L3JlYWxtZWRpYS9ybWRlbXV4LnZjcHJvagorCSogZ3N0L3J0anBlZy9ydGpwZWcudmNwcm9qCisJKiBnc3QvcnRwL3J0cC52Y3Byb2oKKwkqIGdzdC9zaWxlbmNlL3NpbGVuY2UudmNwcm9qCisJKiBnc3Qvc2luZS9zaW5lc3JjLnZjcHJvagorCSogZ3N0L3Ntb290aC9zbW9vdGgudmNwcm9qCisJKiBnc3Qvc21wdGUvc21wdGUudmNwcm9qCisJKiBnc3Qvc3BlY3RydW0vc3BlY3RydW0udmNwcm9qCisJKiBnc3Qvc3BlZWQvc3BlZWQudmNwcm9qCisJKiBnc3Qvc3RlcmVvL3N0ZXJlby52Y3Byb2oKKwkqIGdzdC9zd2l0Y2gvc3dpdGNoLnZjcHJvagorCSogZ3N0L3RhZ3MvdGFnZWRpdC52Y3Byb2oKKwkqIGdzdC90Y3AvdGNwLnZjcHJvagorCSogZ3N0L3R5cGVmaW5kL3R5cGVmaW5kZnVuY3Rpb25zLnZjcHJvagorCSogZ3N0L3VkcC91ZHAudmNwcm9qCisJKiBnc3QvdmlkZW9ib3gvdmlkZW9ib3gudmNwcm9qCisJKiBnc3QvdmlkZW9jcm9wL3ZpZGVvY3JvcC52Y3Byb2oKKwkqIGdzdC92aWRlb2Ryb3AvdmlkZW9kcm9wLnZjcHJvagorCSogZ3N0L3ZpZGVvZmlsdGVyL2dhbW1hLnZjcHJvagorCSogZ3N0L3ZpZGVvZmlsdGVyL3ZpZGVvYmFsYW5jZS52Y3Byb2oKKwkqIGdzdC92aWRlb2ZpbHRlci92aWRlb2ZpbHRlci52Y3Byb2oKKwkqIGdzdC92aWRlb2ZpbHRlci92aWRlb2ZsaXAudmNwcm9qCisJKiBnc3QvdmlkZW9mbGlwL3ZpZGVvZmxpcC52Y3Byb2oKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIudmNwcm9qCisJKiBnc3QvdmlkZW9yYXRlL3ZpZGVvcmF0ZS52Y3Byb2oKKwkqIGdzdC92aWRlb3NjYWxlL3ZpZGVvc2NhbGUudmNwcm9qCisJKiBnc3QvdmlkZW90ZXN0c3JjL3ZpZGVvdGVzdHNyYy52Y3Byb2oKKwkqIGdzdC92aXJ0dWFsZHViL3ZpcnR1YWxkdWIudmNwcm9qCisJKiBnc3Qvdm9sZW52L3ZvbGVudi52Y3Byb2oKKwkqIGdzdC92b2x1bWUvdm9sdW1lLnZjcHJvagorCSogZ3N0L3dhdmVuYy93YXZlbmMudmNwcm9qCisJKiBnc3Qvd2F2cGFyc2Uvd2F2cGFyc2UudmNwcm9qCisJKiBnc3QveTRtL3k0bWVuYy52Y3Byb2oKKwkqIGdzdC1saWJzL2dzdC9hdWRpby9hdWRpby52Y3Byb2oKKwkqIGdzdC1saWJzL2dzdC9hdWRpby9hdWRpb2ZpbHRlci52Y3Byb2oKKwkqIGdzdC1saWJzL2dzdC9jb2xvcmJhbGFuY2UvY29sb3JiYWxhbmNlLnZjcHJvagorCSogZ3N0LWxpYnMvZ3N0L2lkY3QvaWR0Yy52Y3Byb2oKKwkqIGdzdC1saWJzL2dzdC9tZWRpYS1pbmZvL21lZGlhLWluZm8udmNwcm9qCisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvbWl4ZXIudmNwcm9qCisJKiBnc3QtbGlicy9nc3QvbmF2aWdhdGlvbi9uYXZpZ2F0aW9uLnZjcHJvagorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS52Y3Byb2oKKwkqIGdzdC1saWJzL2dzdC9wcm9wZXJ0eXByb2JlL3Byb3BlcnR5cHJvYmUudmNwcm9qCisJKiBnc3QtbGlicy9nc3QvcmVzYW1wbGUvcmVzYW1wbGUudmNwcm9qCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLnZjcHJvagorCSogZ3N0LWxpYnMvZ3N0L3R1bmVyL3R1bmVyLnZjcHJvagorCSogZ3N0LWxpYnMvZ3N0L3ZpZGVvL3ZpZGVvLnZjcHJvagorCSogZ3N0LWxpYnMvZ3N0L3hvdmVybGF5L3hvdmVybGF5LnZjcHJvagorCSAgYXZvaWQgcHJvYmxlbXMgd2l0aCBtYXRoLmgsIGZpeCByZWxlYXNlIGRlcGVuZGFuY3kKKwkgIHJlbmFtZSBHU3RyZWFtZXItMC44LmxpYiB0byBsaWJnc3RyZWFtZXIubGliCisKKzIwMDQtMDctMjcgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua194d2luZG93X2RlY29yYXRlKToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfeHdpbmRvd19kZWNvcmF0ZSk6IFdoZW4KKwl0aGUgYXRvbSBpcyBub3QgYXZhaWxhYmxlIHdlIGhhdmUgdG8gdW5sb2NrIHRoZSBtdXRleC4gRml4ZXMgIzE0ODAyMworCisyMDA0LTA3LTI2ICBTdGV2ZSBMaG9tbWUgIDxzdGV2ZS5saG9tbWVAZnJlZS5mcj4KKworCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby5oOgorCSAgaXNzdWUgZm9yIGEgdmFyYXJnIG1hY3JvIHdpdGggTVNWQworCisyMDA0LTA3LTI2ICBTdGV2ZSBMaG9tbWUgIDxzdGV2ZS5saG9tbWVAZnJlZS5mcj4KKworCSogZ3N0L2VmZmVjdHYvZWZmZWN0di52Y3Byb2oKKwkqIGdzdC1saWJzL2dzdC9pZGN0L2lkY3QudmNwcm9qOgorCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby52Y3Byb2o6CisJKiBnc3QtbGlicy9nc3QvbmF2aWdhdGlvbi9uYXZpZ2F0aW9uLnZjcHJvajoKKwkqIGdzdC1saWJzL2dzdC9wcm9wZXJ0eXByb2JlL3Byb3BlcnR5cHJvYmUudmNwcm9qOgorCSogZ3N0LWxpYnMvZ3N0L3ZpZGVvL3ZpZGVvLnZjcHJvajoKKwkqIGdzdC1saWJzL2dzdC94b3ZlcmxheS94b3ZlcmxheS52Y3Byb2o6CisJICBmaXhlcyBmb3IgYnVpbGQgcHJvYmxlbXMKKworMjAwNC0wNy0yNiAgU3RldmUgTGhvbW1lICA8c3RldmUubGhvbW1lQGZyZWUuZnI+CisKKwkqIGdzdC1saWJzL2dzdC9hdWRpby9hdWRpby5kZWY6CisJKiBnc3QtbGlicy9nc3QvYXVkaW8vcmlmZi5kZWY6CisJICBhZGQgc29tZSBkZWZpbml0aW9ucyBuZWVkZWQgYnkgcGx1Z2lucworCisyMDA0LTA3LTI2ICBTdGV2ZSBMaG9tbWUgIDxzdGV2ZS5saG9tbWVAZnJlZS5mcj4KKworCSogZ3N0L2FzZmRlbXV4L2dzdGFzZm11eC5jCisJICBGaXggc29tZSA2NCBiaXRzIGNvbnN0YW50cyB0byBiZSBnbGliIGZyaWVuZGx5CisKKzIwMDQtMDctMjYgIFN0ZXZlIExob21tZSAgPHN0ZXZlLmxob21tZUBmcmVlLmZyPgorCisJKiBnc3QvYWMzcGFyc2UvZ3N0YWMzcGFyc2UuYworCSogZ3N0L2F1ZGlvc2NhbGUvZ3N0YXVkaW9zY2FsZS5jCisJKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmMKKwkqIGdzdC9jb2xvcnNwYWNlL2dzdGNvbG9yc3BhY2UuYworCSogZ3N0L2NvbG9yc3BhY2UveXV2MnJnYi5oCisJICBsb2NhbCBpbmNsdWRlIGZpeGVzCisKKzIwMDQtMDctMjYgIFN0ZXZlIExob21tZSAgPHN0ZXZlLmxob21tZUBmcmVlLmZyPgorCisJKiB3aW4zMi9nc3Quc2xuCisJICBhZGQgbW9yZSBwbHVnaW5zIHRvIHRoZSBidWlsZAorCisyMDA0LTA3LTI2ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfY2hlY2tfeHNobV9jYWxscyksCisJKGdzdF94aW1hZ2VzaW5rX3hpbWFnZV9uZXcpOiBTb21lIG1vcmUgZml4ZXMgdG8gaW1hZ2Ugc2l6ZSBjYWxjdWxhdGlvbi4KKworMjAwNC0wNy0yNiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6IChnc3RfbGV2ZWxfbGluayksIChnc3RfbGV2ZWxfY2hhaW4pLAorCShnc3RfbGV2ZWxfc2V0X3Byb3BlcnR5KSwgKGdzdF9sZXZlbF9nZXRfcHJvcGVydHkpLAorCShnc3RfbGV2ZWxfYmFzZV9pbml0KSwgKGdzdF9sZXZlbF9jbGFzc19pbml0KToKKwkgIGFkZCBkZWJ1Z2dpbmcgY2F0ZWdvcmllcy4gIGNsZWFudXBzLgorCisyMDA0LTA3LTI2ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvdmlkZW9zY2FsZS92aWRlb3NjYWxlLmM6IChnc3RfdmlkZW9zY2FsZV9zZXR1cCksCisJKGdzdF92aWRlb3NjYWxlX3BsYW5hcjQxMSksIChnc3RfdmlkZW9zY2FsZV9wbGFuYXI0MDApLAorCShnc3RfdmlkZW9zY2FsZV9wYWNrZWQ0MjIpLCAoZ3N0X3ZpZGVvc2NhbGVfcGFja2VkNDIycmV2KSwKKwkoZ3N0X3ZpZGVvc2NhbGVfc2NhbGVfbmVhcmVzdF9zdHIxKSwKKwkoZ3N0X3ZpZGVvc2NhbGVfc2NhbGVfbmVhcmVzdF9zdHIyKSwKKwkoZ3N0X3ZpZGVvc2NhbGVfc2NhbGVfbmVhcmVzdF9zdHI0KSwKKwkoZ3N0X3ZpZGVvc2NhbGVfc2NhbGVfbmVhcmVzdF8xNmJpdCksCisJKGdzdF92aWRlb3NjYWxlX3NjYWxlX25lYXJlc3RfMjRiaXQpOgorCSAgZml4ZWQgc3RyaWRlIGlzc3VlcworCSAgdGVzdGVkIHdpdGggMzIweDI0MCAtPiAzMjEsIDMyMiwgMzI0IHgyNDAKKwkgIHRlc3RlZCB3aXRoIFlWMTIsIEk0MjAsIFlVWTIsIFVZVlkKKwkgIGZpeGVkIHBhY2tlZDQyMnJldiAoZG9uJ3QgdGhpbmsgaXQgY291bGQgaGF2ZSB3b3JrZWQgYmVmb3JlKQorCSAgYnkgdGVzdGluZyB3aXRoIFVZVlkKKworMjAwNC0wNy0yNiAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvbGFtZS9nc3RsYW1lLmM6IChnc3RfbGFtZV9zaW5rX2xpbmspLCAoZ3N0X2xhbWVfaW5pdCksCisJKGdzdF9sYW1lX2NoYWluKSwgKGdzdF9sYW1lX3NldHVwKSwgKGdzdF9sYW1lX2NoYW5nZV9zdGF0ZSksCisJKHBsdWdpbl9pbml0KToKKwkgIGFkZCBkZWJ1Z2dpbmcgY2F0ZWdvcnksIGFkZCBlcnJvciBjaGVja3MgbGlrZSBjaGVja2luZyByZXR1cm4gdmFsdWVzCisJICBvZiBzZXR1cCBjYWxscywgbWFrZSBzdXJlIGl0IHN0aWxsIHdvcmtzIGFmdGVyCisJICBQTEFZSU5HPT5OVUxMPT5QTEFZSU5HLCBmaXggZW5jb2Rpbmcgb2YgbW9ubyBzdHJlYW1zCisKKzIwMDQtMDctMjYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVnZGVtdXguYzogKGdzdF9tcGVnX2RlbXV4X2dldF92aWRlb19zdHJlYW0pLAorCShnc3RfbXBlZ19kZW11eF9nZXRfYXVkaW9fc3RyZWFtKSwKKwkoZ3N0X21wZWdfZGVtdXhfcHJvY2Vzc19wcml2YXRlKToKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdwYXJzZS5jOiAoZ3N0X21wZWdfcGFyc2Vfc2VuZF9kYXRhKToKKwlDaGVjayBmb3IgZXJyb3IgY29kZXMgZnJvbSB0aGUgbmVnb3RpYXRpb24gZnVuY3Rpb25zLiBNYWtlIHN1cmUKKwl3ZSByZWFsbHkgc2V0IHRoZSBwYWQgY2FwcyB3aGVuIGEgbmV3IHBhZCBpcyBjcmVhdGVkLgorCisyMDA0LTA3LTI2ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2RlY21hcC5jOgorCShnc3RfZmZtcGVnX2NhcHNfdG9fcGl4X2ZtdCk6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2RlY21hcC5oOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29sb3JzcGFjZS5jOgorCShnc3RfZmZtcGVnY29sb3JzcGFjZV9wYWRfbGluayk6CisJICBkb24ndCBtYWtlIGZ1bmN0aW9uIGRvIHR3byB0aGluZ3MgYXQgdGhlIHNhbWUgdGltZSB3aXRob3V0IHJlYXNvbi4KKworMjAwNC0wNy0yNiAgU3RldmUgTGhvbW1lICA8c3RldmUubGhvbW1lQGZyZWUuZnI+CisKKwkqIGdzdC9hYzNwYXJzZS9hYzNwYXJzZS52Y3Byb2oKKwkqIGdzdC9hZGRlci9hZGRlci52Y3Byb2oKKwkqIGdzdC9hbHBoYS9hbHBoYS52Y3Byb2oKKwkqIGdzdC9hbHBoYS9hbHBoYWNvbG9yLnZjcHJvagorCSogZ3N0L2FzZmRlbXV4L2FzZi52Y3Byb2oKKwkqIGdzdC9hdWRpb2NvbnZlcnQvYXVkaW9jb252ZXJ0LnZjcHJvagorCSogZ3N0L2F1ZGlvcmF0ZS9hdWRpb3JhdGUudmNwcm9qCisJKiBnc3QvYXVkaW9zY2FsZS9hdWRpb3NjYWxlLnZjcHJvagorCSogZ3N0L2F1cGFyc2UvYXVwYXJzZS52Y3Byb2oKKwkqIGdzdC9hdmkvYXZpLnZjcHJvagorCSogZ3N0L2NkeGFwYXJzZS9jZHhhcGFyc2UudmNwcm9qCisJKiBnc3QvY2hhcnQvY2hhcnQudmNwcm9qCisJKiBnc3QvY29sb3JzcGFjZS9jb2xvcnNwYWNlLnZjcHJvagorCSogZ3N0L2N1dHRlci9jdXR0ZXIudmNwcm9qCisJKiBnc3QvZGVidWcvZGVidWcudmNwcm9qCisJKiBnc3QvZGVidWcvZWZlbmNlLnZjcHJvagorCSogZ3N0L2RlYnVnL25hdmlnYXRpb250ZXN0LnZjcHJvagorCSogZ3N0L2RlaW50ZXJsYWNlL2RlaW50ZXJsYWNlLnZjcHJvagorCSogZ3N0L2VmZmVjdHYvZWZmZWN0di52Y3Byb2oKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2ZmbXBlZ2NvbG9yc3BhY2UudmNwcm9qCisJKiBnc3QvZmlsdGVyL2ZpbHRlci52Y3Byb2oKKwkqIGdzdC9mbHgvZmx4ZGVjLnZjcHJvagorCSogZ3N0L2dvb20vZ29vbS52Y3Byb2oKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUudmNwcm9qCisJKiBnc3QvbGF3L2FsYXcudmNwcm9qCisJKiBnc3QvbGF3L211bGF3LnZjcHJvagorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLnZjcHJvagorCSogZ3N0L21lZGlhbi9tZWRpYW4udmNwcm9qCisJKiBnc3QvbWl4bWF0cml4L21peG1hdHJpeC52Y3Byb2oKKwkqIGdzdC9tcGVnMXN5cy9tcGVnMXN5c3RlbWVuY29kZS52Y3Byb2oKKwkqIGdzdC9tcGVnMXZpZGVvcGFyc2UvbXAxdmlkZW9wYXJzZS52Y3Byb2oKKwkqIGdzdC9tcGVnMnN1Yi9tcGVnMnN1YnQudmNwcm9qCisJKiBnc3QvbXBlZ2F1ZGlvL21wZWdhdWRpby52Y3Byb2oKKwkqIGdzdC9tcGVnYXVkaW9wYXJzZS9tcGVnYXVkaW9wYXJzZS52Y3Byb2oKKwkqIGdzdC9tcGVnc3RyZWFtL21wZWdzdHJlYW0udmNwcm9qCisJKiBnc3QvbXVsdGlmaWxlc2luay9tdWx0aWZpbGVzaW5rLnZjcHJvagorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnQudmNwcm9qCisJKiBnc3Qvb25ldG9uL29uZXRvbi52Y3Byb2oKKwkqIGdzdC9vdmVybGF5L292ZXJsYXkudmNwcm9qCisJKiBnc3QvcGFzc3Rocm91Z2gvcGFzc3Rocm91Z2gudmNwcm9qCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LnZjcHJvagorCSogZ3N0L3JlYWxtZWRpYS9ybWRlbXV4LnZjcHJvagorCSogZ3N0L3J0anBlZy9ydGpwZWcudmNwcm9qCisJKiBnc3QvcnRwL3J0cC52Y3Byb2oKKwkqIGdzdC9zaWxlbmNlL3NpbGVuY2UudmNwcm9qCisJKiBnc3Qvc2luZS9zaW5lc3JjLnZjcHJvagorCSogZ3N0L3Ntb290aC9zbW9vdGgudmNwcm9qCisJKiBnc3Qvc21wdGUvc21wdGUudmNwcm9qCisJKiBnc3Qvc3BlY3RydW0vc3BlY3RydW0udmNwcm9qCisJKiBnc3Qvc3BlZWQvc3BlZWQudmNwcm9qCisJKiBnc3Qvc3RlcmVvL3N0ZXJlby52Y3Byb2oKKwkqIGdzdC9zd2l0Y2gvc3dpdGNoLnZjcHJvagorCSogZ3N0L3RhZ3MvdGFnZWRpdC52Y3Byb2oKKwkqIGdzdC90Y3AvdGNwLnZjcHJvagorCSogZ3N0L3R5cGVmaW5kL3R5cGVmaW5kZnVuY3Rpb25zLnZjcHJvagorCSogZ3N0L3VkcC91ZHAudmNwcm9qCisJKiBnc3QvdmlkZW9ib3gvdmlkZW9ib3gudmNwcm9qCisJKiBnc3QvdmlkZW9jcm9wL3ZpZGVvY3JvcC52Y3Byb2oKKwkqIGdzdC92aWRlb2Ryb3AvdmlkZW9kcm9wLnZjcHJvagorCSogZ3N0L3ZpZGVvZmlsdGVyL2dhbW1hLnZjcHJvagorCSogZ3N0L3ZpZGVvZmlsdGVyL3ZpZGVvYmFsYW5jZS52Y3Byb2oKKwkqIGdzdC92aWRlb2ZpbHRlci92aWRlb2ZpbHRlci52Y3Byb2oKKwkqIGdzdC92aWRlb2ZpbHRlci92aWRlb2ZsaXAudmNwcm9qCisJKiBnc3QvdmlkZW9mbGlwL3ZpZGVvZmxpcC52Y3Byb2oKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIudmNwcm9qCisJKiBnc3QvdmlkZW9yYXRlL3ZpZGVvcmF0ZS52Y3Byb2oKKwkqIGdzdC92aWRlb3NjYWxlL3ZpZGVvc2NhbGUudmNwcm9qCisJKiBnc3QvdmlkZW90ZXN0c3JjL3ZpZGVvdGVzdHNyYy52Y3Byb2oKKwkqIGdzdC92aXJ0dWFsZHViL3ZpcnR1YWxkdWIudmNwcm9qCisJKiBnc3Qvdm9sZW52L3ZvbGVudi52Y3Byb2oKKwkqIGdzdC92b2x1bWUvdm9sdW1lLnZjcHJvagorCSogZ3N0L3dhdmVuYy93YXZlbmMudmNwcm9qCisJKiBnc3Qvd2F2cGFyc2Uvd2F2cGFyc2UudmNwcm9qCisJKiBnc3QveTRtL3k0bWVuYy52Y3Byb2oKKwkgIG1vcmUgcGx1Z2lucyBzdXBwb3J0ZWQgdW5kZXIgd2luZG93cworCisyMDA0LTA3LTI2ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3hpbWFnZV9uZXcpLAorCShnc3RfeGltYWdlc2lua194aW1hZ2VfcHV0KSwgKGdzdF94aW1hZ2VzaW5rX3JlbmVnb3RpYXRlX3NpemUpLAorCShnc3RfeGltYWdlc2lua19jaGFpbiksIChnc3RfeGltYWdlc2lua19idWZmZXJfYWxsb2MpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua194dmltYWdlX25ldyksCisJKGdzdF94dmltYWdlc2lua19jaGFpbiksIChnc3RfeHZpbWFnZXNpbmtfYnVmZmVyX2FsbG9jKToKKwkgIEFkZCBkZWJ1Z2dpbmcgc3RhdGVtZW50cy4gIFVzZSB0aGUgc2l6ZXMgYXMgcmV0dXJuZWQgYnkgdGhlCisJICAqQ3JlYXRlSW1hZ2UgY2FsbHMuCisKKzIwMDQtMDctMjYgIEpvaGFuIERhaGxpbiAgPGpvaGFuQGdub21lLm9yZz4KKworCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzcmMuYyAoZ3N0X3RjcGNsaWVudHNyY19nZXQpOiBNYWtlIHN1cmUgdGhhdAorCXRoZSBwYWQgaXMgbmVnb3RpYXRlZC4KKworCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29sb3JzcGFjZS5jIChnc3RfZmZtcGVnY29sb3JzcGFjZV9jaGFpbik6IERpdHRvCisKKzIwMDQtMDctMjYgIFN0ZXZlIExob21tZSAgPHN0ZXZlLmxob21tZUBmcmVlLmZyPgorCisJKiBnc3QtbGlicy9nc3QvY29sb3JiYWxhbmNlL2NvbG9yYmFsYW5jZS52Y3Byb2o6CisJKiBnc3QtbGlicy9nc3QvaWRjdC9pZGN0LnZjcHJvajoKKwkqIGdzdC1saWJzL2dzdC9tZWRpYS1pbmZvL21lZGlhLWluZm8udmNwcm9qOgorCSogZ3N0LWxpYnMvZ3N0L21peGVyL21peGVyLnZjcHJvajoKKwkqIGdzdC1saWJzL2dzdC9uYXZpZ2F0aW9uL25hdmlnYXRpb24udmNwcm9qOgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS52Y3Byb2o6CisJKiBnc3QtbGlicy9nc3QvcHJvcGVydHlwcm9iZS9wcm9wZXJ0eXByb2JlLnZjcHJvajoKKwkqIGdzdC1saWJzL2dzdC9yZXNhbXBsZS9yZXNhbXBsZS52Y3Byb2o6CisJKiBnc3QtbGlicy9nc3QvdHVuZXIvdHVuZXIudmNwcm9qOgorCSogZ3N0LWxpYnMvZ3N0L3ZpZGVvL3ZpZGVvLnZjcHJvajoKKwkqIGdzdC1saWJzL2dzdC94b3ZlcmxheS94b3ZlcmxheS52Y3Byb2o6CisJICBtb3JlIHBsdWdpbnMgc3VwcG9ydGVkIHVuZGVyIHdpbmRvd3MKKworMjAwNC0wNy0yNSBJYWluIDxpYWluQHByZXR0eXBlb3BsZS5vcmc+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jIChnc3Rfd2F2cGFyc2VfZm10KTogU2V0IHRoZSBjYXBzIG9uIHRoZQorCXBhZCBub3cgcmF0aGVyIHRoYW4gd2hlbiB0aGUgcGFkIGlzIGNyZWF0ZWQgYmVjYXVzZSBzdGF0ZSBjaGFuZ2VzIHdpcGUKKwlleHBsaWNpdCBjYXBzIChmaXhlcyAjMTQ4MDQzKS4KKworMjAwNC0wNy0yNSAgU2ViYXN0aWVuIENvdGUgIDxzYzVAaGVybWVzLnVzaGVyYi5jYT4KKworCXJldmlld2VkIGJ5IEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L21hZC9nc3RtYWQuYzoKKwkgIGZpeCBtYWQgcGx1Z2luIGNyYXNoaW5nIG9uIFN1biAoZml4ZXMgIzE0ODI4OSkKKworMjAwNC0wNy0yNSAgU3RldmUgTGhvbW1lICA8c3RldmUubGhvbW1lQGZyZWUuZnI+CisKKwkqIGdzdC9hdmkvYXZpLmRlZjoKKwkqIGdzdC9hdmkvYXZpLnZjcHJvajoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS5kZWY6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EudmNwcm9qOgorCSAgcmVtb3ZlIHVudXNlZCAuZGVmIGZpbGVzCisKKzIwMDQtMDctMjUgIFN0ZXZlIExob21tZSAgPHN0ZXZlLmxob21tZUBmcmVlLmZyPgorCisJKiBnc3QtbGlicy9nc3QvYXVkaW8vZ3N0YXVkaW9maWx0ZXIuYzoKKwkgIENsZWFuIHRoZSBsb2NhbCBpbmNsdWRlCisKKzIwMDQtMDctMjUgIFN0ZXZlIExob21tZSAgPHN0ZXZlLmxob21tZUBmcmVlLmZyPgorCisJKiB3aW4zMi9nc3Quc2xuOgorCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL2F1ZGlvLmRlZjoKKwkqIGdzdC1saWJzL2dzdC9hdWRpby9hdWRpby52Y3Byb2o6CisJKiBnc3QtbGlicy9nc3QvYXVkaW8vYXVkaW9maWx0ZXIudmNwcm9qOgorCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL3JpZmYuZGVmOgorCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL3JpZmYudmNwcm9qOgorCSogZ3N0LWxpYnMvZ3N0L2dzdC1saWJzLmRlZjoKKwkqIGdzdC1saWJzL2dzdC9nc3QtbGlicy52Y3Byb2o6CisJKiBnc3QvYXZpL2F2aS52Y3Byb2o6CisJKiBnc3QvYXZpL2F2aS52Y3Byb2o6CisJICBDb3B5IHRoZSBmaWxlcyB3aGVyZSBuZWVkZWQgYWZ0ZXIgYnVpbGRpbmcsIGNsZWFuZXIgcHJvamVjdHMKKworMjAwNC0wNy0yNSAgU3RldmUgTGhvbW1lICA8c3RldmUubGhvbW1lQGZyZWUuZnI+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJICBGaXggc29tZSA2NCBiaXRzIGNvbnN0YW50cyB0byBiZSBnbGliIGZyaWVuZGx5CisKKzIwMDQtMDctMjQgIFN0ZXZlIExob21tZSAgPHN0ZXZlLmxob21tZUBmcmVlLmZyPgorCisJKiB3aW4zMi9nc3Quc2xuOgorCSogZ3N0LWxpYnMvZ3N0L2dzdC1saWJzLmRlZjoKKwkqIGdzdC1saWJzL2dzdC9nc3QtbGlicy52Y3Byb2o6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EuZGVmOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLnZjcHJvajoKKwkgIEFkZCB0aGUgcHJlbGltaW5hcnkgY2FudmFzIHRvIGJ1aWxkIHBsdWdpbnMgb24gV2luMzIKKworMjAwNC0wNy0yMyAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOiAoZ3N0X2F1ZGlvX2NvbnZlcnRfbGluayk6CisJICBkb24ndCBlbmZvcmUgbmVnb3RpYXRpb24gZnJvbSBzb3VyY2Ugc2lkZSwgaXQgYnJlYWtzCisJICBzaW5lc3JjICEgYXVkaW9jb252ZXJ0ICEgb3Nzc2luaworCisyMDA0LTA3LTIyICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAocGx1Z2luX2luaXQpOiBBZGQgdHlwZWZpbmQKKwlmb3IgRUxGIGZpbGVzLCBzaW5jZSB0aGV5IGNhbiBlYXNpbHkgYmUgcmVjb2duaXplZCBhcyBhdWRpby9tcGVnLgorCShidWcgIzE0NzQ0MSkKKworMjAwNC0wNy0yMiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L3ZpZGVvc2NhbGUvdmlkZW9zY2FsZS5jOiAoZ3N0X3ZpZGVvc2NhbGVfc2V0dXApLAorCShnc3RfdmlkZW9zY2FsZV9wbGFuYXI0MTEpLCAoZ3N0X3ZpZGVvc2NhbGVfc2NhbGVfbmVhcmVzdF8zMmJpdCksCisJKGdzdF92aWRlb3NjYWxlX3NjYWxlX25lYXJlc3RfMjRiaXQpLAorCShnc3RfdmlkZW9zY2FsZV9zY2FsZV9uZWFyZXN0XzE2Yml0KToKKwkgIGZpeCAxNmJpdCBhbmQgMjRiaXQgZm9yIHN0cmlkZSAoMjRiaXQgbWlnaHQgbmVlZCB0ZXN0aW5nKQorCSAgZG9uJ3QgcHJldGVuZCB3ZSBkbyBtb3JlIHRoYW4gb25lIGFsZ29yaXRobQorCisyMDA0LTA3LTIyICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9NYWtlZmlsZS5hbToKKwkqIGdzdC9tdWx0aWZpbGVzaW5rL01ha2VmaWxlLmFtOgorCSogZ3N0L211bHRpZmlsZXNpbmsvZ3N0bXVsdGlmaWxlc2luay5jOgorCShnc3RfbXVsdGlmaWxlc2lua19nZXRfZm9ybWF0cyksCisJKGdzdF9tdWx0aWZpbGVzaW5rX2dldF9xdWVyeV90eXBlcyksIChfZG9faW5pdCksCisJKGdzdF9tdWx0aWZpbGVzaW5rX2Jhc2VfaW5pdCksIChnc3RfbXVsdGlmaWxlc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X211bHRpZmlsZXNpbmtfaW5pdCksIChnc3RfbXVsdGlmaWxlc2lua19kaXNwb3NlKSwKKwkoZ3N0X211bHRpZmlsZXNpbmtfc2V0X2xvY2F0aW9uKSwgKGdzdF9tdWx0aWZpbGVzaW5rX3NldF9wcm9wZXJ0eSksCisJKGdzdF9tdWx0aWZpbGVzaW5rX2dldF9wcm9wZXJ0eSksIChnc3RfbXVsdGlmaWxlc2lua19vcGVuX2ZpbGUpLAorCShnc3RfbXVsdGlmaWxlc2lua19jbG9zZV9maWxlKSwgKGdzdF9tdWx0aWZpbGVzaW5rX25leHRfZmlsZSksCisJKGdzdF9tdWx0aWZpbGVzaW5rX3BhZF9xdWVyeSksIChnc3RfbXVsdGlmaWxlc2lua19oYW5kbGVfZXZlbnQpLAorCShnc3RfbXVsdGlmaWxlc2lua19jaGFpbiksIChnc3RfbXVsdGlmaWxlc2lua19jaGFuZ2Vfc3RhdGUpLAorCShnc3RfbXVsdGlmaWxlc2lua191cmlfZ2V0X3R5cGUpLAorCShnc3RfbXVsdGlmaWxlc2lua191cmlfZ2V0X3Byb3RvY29scyksCisJKGdzdF9tdWx0aWZpbGVzaW5rX3VyaV9nZXRfdXJpKSwgKGdzdF9tdWx0aWZpbGVzaW5rX3VyaV9zZXRfdXJpKSwKKwkoZ3N0X211bHRpZmlsZXNpbmtfdXJpX2hhbmRsZXJfaW5pdCksIChwbHVnaW5faW5pdCk6CisJKiBnc3QvbXVsdGlmaWxlc2luay9nc3RtdWx0aWZpbGVzaW5rLmg6CisJKiB0ZXN0c3VpdGUvTWFrZWZpbGUuYW06CisJKiB0ZXN0c3VpdGUvbXVsdGlmaWxlc2luay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzdWl0ZS9tdWx0aWZpbGVzaW5rL2Zha2VzcmNfdGVzdC5jOiAoZ3N0X25ld21lZGlhX2Jhc2VfaW5pdCksCisJKGdzdF9uZXdtZWRpYV9jbGFzc19pbml0KSwgKGdzdF9uZXdtZWRpYV9pbml0KSwKKwkoZ3N0X25ld21lZGlhX2NoYWluKSwgKGdzdF9uZXdtZWRpYV90cmlnZ2VyKSwgKHRlc3RfZm9ybWF0KSwKKwkobmV3ZmlsZV9zaWduYWwpLCAodGVzdF9zaWduYWwpLCAobWFpbik6CisJbXVsdGlmaWxlc2luayBwbHVnaW4gZm9yIGNyZWF0aW5nIG5ldyBmaWxlcyBldmVyeSB0aW1lIGEgbmV3IG1lZGlhCisJZGlzY29udGludWl0eSBldmVudCBvY2N1cnMKKworMjAwNC0wNy0yMiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9hbHBoYS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6IChnc3RfYWxwaGFfY29sb3JfZ2V0X3R5cGUpLAorCShnc3RfYWxwaGFfY29sb3JfYmFzZV9pbml0KSwgKGdzdF9hbHBoYV9jb2xvcl9jbGFzc19pbml0KSwKKwkoZ3N0X2FscGhhX2NvbG9yX2luaXQpLCAoZ3N0X2FscGhhX2NvbG9yX3NldF9wcm9wZXJ0eSksCisJKGdzdF9hbHBoYV9jb2xvcl9nZXRfcHJvcGVydHkpLCAoZ3N0X2FscGhhX2NvbG9yX3NpbmtfbGluayksCisJKHRyYW5zZm9ybSksIChnc3RfYWxwaGFfY29sb3JfY2hhaW4pLAorCShnc3RfYWxwaGFfY29sb3JfY2hhbmdlX3N0YXRlKSwgKHBsdWdpbl9pbml0KToKKwlTdHVwaWQgcGx1Z2luIHRvIHRvIFJHQkEgdG8gQVlVViBjb252ZXJzaW9uIGJlY2F1c2Ugbm9uZSBvZgorCXRoZSBjb2xvcnNwYWNlIHBsdWdpbnMgY2FuIGhhbmRsZSB0aGF0IHlldC4KKworMjAwNC0wNy0yMiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4YW1wbGVzL3NlZWtpbmcvc2Vlay5jOiAodXBkYXRlX3NjYWxlKSwgKG1haW4pOgorCSogZ3N0L3BsYXliYWNrL2dzdGRlY29kZWJpbi5jOiAoZ3N0X2RlY29kZV9iaW5fZ2V0X3R5cGUpLAorCShnc3RfZGVjb2RlX2Jpbl9jbGFzc19pbml0KSwgKGdzdF9kZWNvZGVfYmluX2lzX2R5bmFtaWMpLAorCShnc3RfZGVjb2RlX2Jpbl9mYWN0b3J5X2ZpbHRlciksIChjb21wYXJlX3JhbmtzKSwgKHByaW50X2ZlYXR1cmUpLAorCShnc3RfZGVjb2RlX2Jpbl9pbml0KSwgKGdzdF9kZWNvZGVfYmluX2Rpc3Bvc2UpLAorCShmaW5kX2NvbXBhdGlibGVzKSwgKGNsb3NlX3BhZF9saW5rKSwgKHRyeV90b19saW5rXzEpLCAobmV3X3BhZCksCisJKG5vX21vcmVfcGFkcyksIChjbG9zZV9saW5rKSwgKHR5cGVfZm91bmQpLAorCShnc3RfZGVjb2RlX2Jpbl9zZXRfcHJvcGVydHkpLCAoZ3N0X2RlY29kZV9iaW5fZ2V0X3Byb3BlcnR5KSwKKwkocGx1Z2luX2luaXQpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChnc3RfcGxheV9iYXNlX2Jpbl9nZXRfdHlwZSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2NsYXNzX2luaXQpLCAoZ3N0X3BsYXlfYmFzZV9iaW5faW5pdCksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2Rpc3Bvc2UpLCAocXVldWVfb3ZlcnJ1biksCisJKGdlbl9wcmVyb2xsX2VsZW1lbnQpLCAocmVtb3ZlX3ByZXJvbGxzKSwgKHVua25vd25fdHlwZSksCisJKG5vX21vcmVfcGFkcyksIChuZXdfc3RyZWFtKSwgKHNldHVwX3NvdXJjZSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX3NldF9wcm9wZXJ0eSksIChnc3RfcGxheV9iYXNlX2Jpbl9nZXRfcHJvcGVydHkpLAorCShwbGF5X2Jhc2VfZW9zKSwgKGdzdF9wbGF5X2Jhc2VfYmluX2NoYW5nZV9zdGF0ZSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2FkZF9lbGVtZW50KSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fcmVtb3ZlX2VsZW1lbnQpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9tdXRlX3N0cmVhbSksIChnc3RfcGxheV9iYXNlX2Jpbl9saW5rX3N0cmVhbSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX3VubGlua19zdHJlYW0pLAorCShnc3RfcGxheV9iYXNlX2Jpbl9nZXRfc3RyZWFtaW5mbyk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJpbi5jOiAoZ2VuX3ZpZGVvX2VsZW1lbnQpLAorCShnZW5fYXVkaW9fZWxlbWVudCk6CisJKiBnc3QvcGxheWJhY2svZ3N0c3RyZWFtaW5mby5oOgorCU1vcmUgcGxheWJhY2sgdXBkYXRlcywgYXR0ZW1wdCB0byBmaXggdGhpbmdzIGFmdGVyIHRoZSBzdGF0ZSBjaGFuZ2UKKwlicmVha2FnZS4KKworMjAwNC0wNy0yMiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L3ZpZGVvc2NhbGUvdmlkZW9zY2FsZS5jOiAoZ3N0X3ZpZGVvc2NhbGVfcGxhbmFyNDExKSwKKwkoZ3N0X3ZpZGVvc2NhbGVfc2NhbGVfbmVhcmVzdF8xNmJpdCk6CisJICBjb21tZW50IGFsZ29yaXRobQorCisyMDA0LTA3LTIyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvdmlkZW90ZXN0c3JjL2dzdHZpZGVvdGVzdHNyYy5jOgorCShnc3RfdmlkZW90ZXN0c3JjX2NsYXNzX2luaXQpLCAoZ3N0X3ZpZGVvdGVzdHNyY19zcmNfbGluayksCisJKGdzdF92aWRlb3Rlc3RzcmNfaW5pdCksIChnc3RfdmlkZW90ZXN0c3JjX2dldCksCisJKGdzdF92aWRlb3Rlc3RzcmNfc2V0X3BhdHRlcm4pLCAoZ3N0X3ZpZGVvdGVzdHNyY19zZXRfcHJvcGVydHkpLAorCShnc3RfdmlkZW90ZXN0c3JjX2dldF9wcm9wZXJ0eSk6CisJKiBnc3QvdmlkZW90ZXN0c3JjL2dzdHZpZGVvdGVzdHNyYy5oOgorCSogZ3N0L3ZpZGVvdGVzdHNyYy92aWRlb3Rlc3RzcmMuYzoKKwkqIGdzdC92aWRlb3Rlc3RzcmMvdmlkZW90ZXN0c3JjLmg6CisJICBjbGVhbnVwIGFuZCBjb21tZW50aW5nCisKKzIwMDQtMDctMjEgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2RlbXV4X2luaXQpLAorCShnc3Rfb2dnX2RlbXV4X2dldF9mb3JtYXRzKSwgKGdzdF9vZ2dfZGVtdXhfc3JjX3F1ZXJ5KSwKKwkoZ3N0X29nZ19kZW11eF9zcmNfZXZlbnQpLCAoZ3N0X29nZ19kZW11eF9zcmNfY29udmVydCksCisJKGdzdF9vZ2dfZGVtdXhfaGFuZGxlX2V2ZW50KSwgKGdzdF9vZ2dfZGVtdXhfc2Vla19iZWZvcmUpLAorCShfZmluZF9jaGFpbl9nZXRfdW5rbm93bl9wYXJ0KSwgKF9maW5kX3N0cmVhbXNfY2hlY2spLAorCShnc3Rfb2dnX2RlbXV4X3B1c2gpLCAoZ3N0X29nZ19wYWRfcHVzaCk6CisJKiBleHQvdGhlb3JhL3RoZW9yYWRlYy5jOiAodGhlb3JhX2dldF9mb3JtYXRzKSwKKwkodGhlb3JhX2RlY19zcmNfY29udmVydCksICh0aGVvcmFfZGVjX3NpbmtfY29udmVydCksCisJKHRoZW9yYV9kZWNfc3JjX3F1ZXJ5KSwgKHRoZW9yYV9kZWNfc3JjX2V2ZW50KSwgKHRoZW9yYV9kZWNfZXZlbnQpLAorCSh0aGVvcmFfZGVjX2NoYWluKToKKwkqIGV4dC92b3JiaXMvdm9yYmlzZGVjLmM6ICh2b3JiaXNfZGVjX2dldF9mb3JtYXRzKSwKKwkodm9yYmlzX2RlY19jb252ZXJ0KSwgKHZvcmJpc19kZWNfc3JjX3F1ZXJ5KSwKKwkodm9yYmlzX2RlY19zcmNfZXZlbnQpLCAodm9yYmlzX2RlY19ldmVudCk6CisJTW9yZSBzZWVraW5nIGZpeGVzLCBvZ2dkZW11eCBub3cgc3VwcG9ydHMgc2Vla2luZyB0byB0aW1lIGFuZAorCXVzZXMgdGhlIGRvd25zdHJlYW0gZWxlbWVudCB0byBjb252ZXJ0IGdyYW51bGVwb3MgdG8gdGltZS4KKwlTZWVraW5nIGluIHRoZW9yYS1vbmx5IG9nZyBmaWxlcyBub3cgd29ya3MuCisKKzIwMDQtMDctMjEgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvdGhlb3JhL3RoZW9yYWRlYy5jOiAoZ3N0X3RoZW9yYV9kZWNfaW5pdCksCisJKHRoZW9yYV9nZXRfZm9ybWF0cyksICh0aGVvcmFfZ2V0X2V2ZW50X21hc2tzKSwKKwkodGhlb3JhX2dldF9xdWVyeV90eXBlcyksICh0aGVvcmFfZGVjX3NyY19jb252ZXJ0KSwKKwkodGhlb3JhX2RlY19zaW5rX2NvbnZlcnQpLCAodGhlb3JhX2RlY19zcmNfcXVlcnkpLAorCSh0aGVvcmFfZGVjX3NyY19ldmVudCksICh0aGVvcmFfZGVjX2V2ZW50KSwgKHRoZW9yYV9kZWNfY2hhaW4pOgorCSogZXh0L3ZvcmJpcy92b3JiaXNkZWMuYzogKHZvcmJpc19kZWNfZ2V0X2Zvcm1hdHMpLAorCSh2b3JiaXNfZ2V0X2V2ZW50X21hc2tzKSwgKHZvcmJpc19nZXRfcXVlcnlfdHlwZXMpLAorCShnc3Rfdm9yYmlzX2RlY19pbml0KSwgKHZvcmJpc19kZWNfY29udmVydCksCisJKHZvcmJpc19kZWNfc3JjX3F1ZXJ5KSwgKHZvcmJpc19kZWNfc3JjX2V2ZW50KSwgKHZvcmJpc19kZWNfZXZlbnQpOgorCUFkZGVkIHF1ZXJ5L2NvbnZlcnQvZm9ybWF0cyBmdW5jdGlvbnMgdG8gdm9yYmlzIGFuZCB0aGVvcmEgZGVjb2RlcnMKKwlzbyB0aGF0IHRoZSBvdXRzaWRlIHdvcmxkIGNhbiB1c2UgdGhlbSB0b28uIEZpeGVkIHNlZWtpbmcgb24gYW4KKwlvZ2cvdGhlb3JhL3ZvcmJpcyBmaWxlIGJ5IGRpc2FibGluZyB0aGUgc2Vla2luZyBzZWVraW5nIG9uIHRoZQorCXRoZW9yYSBzcmNwYWQuCisKKzIwMDQtMDctMjEgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua194aW1hZ2VfbmV3KSwKKwkoZ3N0X3hpbWFnZXNpbmtfcmVuZWdvdGlhdGVfc2l6ZSksIChnc3RfeGltYWdlc2lua19zaW5rX2xpbmspLAorCShnc3RfeGltYWdlc2lua19jaGFpbiksIChnc3RfeGltYWdlc2lua19zZXRfeHdpbmRvd19pZCk6IE9wdGltaXplCisJaW1hZ2VzIGNyZWF0aW9uIGZvciBib3RoIGVsZW1lbnRzLiBXZSBkb24ndCBjcmVhdGUgdGhlIGltYWdlIG9uIGNhcHMKKwluZWdvIG9yIHJlbmVnbywgd2UganVzdCBkZXN0cm95IHRoZSBpbnRlcm5hbCBvbmUgaWYgcHJlc2VudCBpZiBpdCBkb2VzCisJbm90IG1hdGNoIHRoZSBuZWVkcy4gVGhlIGNoYWluIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YgY3JlYXRpbmcgYSBuZXcKKwlpbWFnZSB3aGVuIG5lZWRlZC4KKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfeHZpbWFnZV9uZXcpLAorCShnc3RfeHZpbWFnZXNpbmtfeHdpbmRvd19kZWNvcmF0ZSksIChnc3RfeHZpbWFnZXNpbmtfc2lua19saW5rKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NoYWluKSwgKGdzdF94dmltYWdlc2lua19idWZmZXJfYWxsb2MpLAorCShnc3RfeHZpbWFnZXNpbmtfc2V0X3h3aW5kb3dfaWQpOiBBZGRpdGlvbmFsbHkgeHZpbWFnZSBub3cgY29udGFpbnMKKwl0aGUgaW1hZ2UgZm9ybWF0IGluZm9ybWF0aW9uLiBUaGUgYnVmZmVyIHBvb2wgY2hlY2tzIGZvciB0aGUgY29udGV4dAorCWltYWdlIGZvcm1hdCBhbmQgZGlzY2FyZCBpbWFnZXMgd2l0aCBkaWZmZXJlbnQgZm9ybWF0cy4KKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmg6IEFkZGluZyBpbV9mb3JtYXQgaW4gdGhlIHh2aW1hZ2Ugc3RydWN0dXJlLgorCisyMDA0LTA3LTIxICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2xvcnNwYWNlLmM6CisJKGdzdF9mZm1wZWdjb2xvcnNwYWNlX2NoYWluKToKKwkgIG5vIHBvaW50IGluIGRvaW5nIGFueSBjaGFpbmluZyBpZiB0aGUgcGFkIHdlIHdhbnQgdG8gcHVzaCBmcm9tCisJICBpc24ndCB1c2FibGUuCisKKzIwMDQtMDctMjAgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtbWVkaWEuYzoKKwkoZ3N0X3JpZmZfY3JlYXRlX2F1ZGlvX2NhcHNfd2l0aF9kYXRhKToKKwkgIEZpeCBkb3VibGUgZW5kLXRvLW5hdGl2ZSBzeW1ib2wgY29udmVyc2lvbiAoIzE0ODAyMSkuCisKKzIwMDQtMDctMjAgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua194d2luZG93X2RlY29yYXRlKToKKwlEb24ndCB1c2UgYW4gQXRvbSB0aGF0IGRvZXNuJ3QgZXhpc3QuCisKKzIwMDQtMDctMjAgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmM6IChnc3RfbXVsdGlmZHNpbmtfY2xhc3NfaW5pdCksCisJKGdzdF9tdWx0aWZkc2lua19hZGQpLCAoZ3N0X211bHRpZmRzaW5rX2dldF9zdGF0cyksCisJKGdzdF9tdWx0aWZkc2lua19jbGllbnRfcmVtb3ZlKSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRfd3JpdGUpLAorCShnc3RfbXVsdGlmZHNpbmtfcXVldWVfYnVmZmVyKToKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuaDoKKwlNb3JlIG11bHRpZmRzaW5rIHN0YXRzLiBBdm9pZCBkZWFkbG9jayBieSByZWxlYXNpbmcgbG9ja3MKKwliZWZvcmUgc2VuZGluZyBvdXQgYSBzaWduYWwuCisKKzIwMDQtMDctMjAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHBvL0xJTkdVQVM6CisJKiBwby9odS5wbzoKKwkgIGFkZGVkIEh1bmdhcmlhbiB0cmFuc2xhdGlvbiAoTGFzemxvIER2b3JuaWspCisKKzIwMDQtMDctMjAgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmM6IChnc3RfbXVsdGlmZHNpbmtfY2xhc3NfaW5pdCksCisJKGdzdF9tdWx0aWZkc2lua19hZGQpLCAoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9yZW1vdmUpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudF93cml0ZSksCisJKGdzdF9tdWx0aWZkc2lua19xdWV1ZV9idWZmZXIpOgorCSogZ3N0L3RjcC9nc3R0Y3AtbWFyc2hhbC5saXN0OgorCUZpeGVkIHRoZSBzdHVwaWQgbWFyc2hhbCBkZWZpbml0aW9uLgorCisyMDA0LTA3LTIwICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5jOiAoZ3N0X211bHRpZmRzaW5rX2NsYXNzX2luaXQpLAorCShnc3RfbXVsdGlmZHNpbmtfaW5pdCksIChnc3RfbXVsdGlmZHNpbmtfYWRkKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9yZW1vdmUpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudF93cml0ZSksCisJKGdzdF9tdWx0aWZkc2lua19xdWV1ZV9idWZmZXIpLCAoZ3N0X211bHRpZmRzaW5rX2NoYWluKSwKKwkoZ3N0X211bHRpZmRzaW5rX3NldF9wcm9wZXJ0eSksIChnc3RfbXVsdGlmZHNpbmtfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X211bHRpZmRzaW5rX2luaXRfc2VuZCk6CisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmg6CisJQWRkZWQgbW9yZSBzdGF0cywgYWRkZWQgdGltZW91dCBmb3IgYSBjbGllbnQsIGZpeGVkIHNvbWUgdHlwb3MKKwlhbmQgYWRkZWQgc29tZSBjb21tZW50cy4KKworMjAwNC0wNy0yMCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuYzogKGdzdF9tdWx0aWZkc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X211bHRpZmRzaW5rX2FkZCksIChnc3RfbXVsdGlmZHNpbmtfZ2V0X3N0YXRzKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9yZW1vdmUpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudF93cml0ZSk6CisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmg6CisJKiBnc3QvdGNwL2dzdHRjcC1tYXJzaGFsLmxpc3Q6CisJQWRkZWQgZ2V0X3N0YXRzIG1ldGhvZCB0aGF0IHJldHVybnMgYSBHVmFsdWVBcnJheSBvZgorCXN0YXRzIHZhbHVlcy4KKworMjAwNC0wNy0xOSAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvbGFkc3BhL2dzdGxhZHNwYS5jOiAoZ3N0X2xhZHNwYV9iYXNlX2luaXQpOgorCSAgbWFrZSBzdXJlIGxvbmduYW1lLCBkZXNjcmlwdGlvbiBhbmQgYXV0aG9yIGFyZSB2YWxpZCBVVEYtOAorCisyMDA0LTA3LTE5ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2NoYW5nZV9zdGF0ZSksCisJKGdzdF94aW1hZ2VzaW5rX3NldF9wcm9wZXJ0eSk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2NoYW5nZV9zdGF0ZSksCisJKGdzdF94dmltYWdlc2lua19zZXRfcHJvcGVydHkpOgorCSAgbWFrZSBzdXJlIFNZTkNIUk9OT1VTIGlzIHJlc3BlY3RlZCBhZnRlciBnZXR0aW5nIHRoZSBYIGNvbnRleHQKKworMjAwNC0wNy0xOCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc3JjX2V2ZW50KSwKKwkoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2Jsb2NrZ3JvdXApOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgYWRkIEJsb2NrUmVmZXJlbmNlIHRhZyBhbmQgaWdub3JlIGl0IHRvIGNsZWFyIG91dCBsb2cuCisJICBpZ25vcmUgTkFWSUdBVElPTiBldmVudHMgdG8gY2xlYXIgb3V0IGxvZy4KKworMjAwNC0wNy0xOCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfY2xhc3NfaW5pdCksCisJKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfc3RyZWFtKToKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfY2xhc3NfaW5pdCk6CisJICBhZGQgZGVidWcgY2F0ZWdvcmllcworCisyMDA0LTA3LTE2ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L2xpYnBuZy9NYWtlZmlsZS5hbToKKwkqIGV4dC9saWJwbmcvZ3N0cG5nLmM6IChwbHVnaW5faW5pdCk6CisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiAodXNlcl9lcnJvcl9mbiksICh1c2VyX3dhcm5pbmdfZm4pLAorCShnc3RfcG5nZGVjX2dldF90eXBlKSwgKGdzdF9wbmdkZWNfYmFzZV9pbml0KSwKKwkoZ3N0X3BuZ2RlY19jbGFzc19pbml0KSwgKGdzdF9wbmdkZWNfc2lua2xpbmspLCAoZ3N0X3BuZ2RlY19pbml0KSwKKwkoZ3N0X3BuZ2RlY19zcmNfZ2V0Y2FwcyksICh1c2VyX3JlYWRfZGF0YSksIChnc3RfcG5nZGVjX2NoYWluKToKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmg6CisJQWRkZWQgcG5nIGRlY29kZXIuCisKKzIwMDQtMDctMTYgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19oYW5kbGVfeGVycm9yKSwKKwkoZ3N0X3hpbWFnZXNpbmtfY2hlY2tfeHNobV9jYWxscyksIChnc3RfeGltYWdlc2lua194aW1hZ2VfbmV3KSwKKwkoZ3N0X3hpbWFnZXNpbmtfeGltYWdlX2Rlc3Ryb3kpLCAoZ3N0X3hpbWFnZXNpbmtfc2lua19saW5rKSwKKwkoZ3N0X3hpbWFnZXNpbmtfY2hhaW4pLCAoZ3N0X3hpbWFnZXNpbmtfYnVmZmVyX2ZyZWUpLAorCShnc3RfeGltYWdlc2lua19idWZmZXJfYWxsb2MpOgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmg6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2NoZWNrX3hzaG1fY2FsbHMpLAorCShnc3RfeHZpbWFnZXNpbmtfeHZpbWFnZV9uZXcpLCAoZ3N0X3h2aW1hZ2VzaW5rX3h2aW1hZ2VfZGVzdHJveSksCisJKGdzdF94dmltYWdlc2lua19jaGFpbiksIChnc3RfeHZpbWFnZXNpbmtfYnVmZmVyX2ZyZWUpLAorCShnc3RfeHZpbWFnZXNpbmtfYnVmZmVyX2FsbG9jKToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmg6IEdldHRpbmcgdGhlIDIgdmlkZW8gc2lua3Mgc3luY2hyb25pemVkCisJYWdhaW4uIFVzaW5nIGludGVybmFsIGRhdGEgcG9pbnRlciBvZiB0aGUgeCh2KWltYWdlIHRvIHN0b3JlIGltYWdlJ3MKKwlkYXRhIHRvIGJlIGNvaGVyZW50IHdpdGggdGhlIGJ1ZmZlciBhbGxvYyBtZWNoYW5pc20uIEludmVzdGlnYXRlZCB0aGUKKwlpbWFnZSBkZXN0cnVjdGlvbiBjb2RlIHRvIGJlIHN1cmUgdGhhdCBldmVyeXRoaW5nIGdldHMgZnJlZWQgY29ycmVjdGx5LgorCisyMDA0LTA3LTE2ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6CisJKGdzdF9yaWZmX3JlYWRfc3RyZl92aWRzX3dpdGhfZGF0YSksCisJKGdzdF9yaWZmX3JlYWRfc3RyZl9hdWRzX3dpdGhfZGF0YSk6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpLAorCShnc3RfYXZpX2RlbXV4X2FkZF9zdHJlYW0pLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyKToKKwlNYWtlIHN1cmUgd2UgZG9uJ3QgY3JlYXRlIDAgc2l6ZWQgc3ViYnVmZmVycyBpbiByaWZmLXJlYWQuCisJU2lnbmFsIHRoZSBubyBtb3JlIHBhZHMgc2lnbmFsIGFmdGVyIHJlYWRpbmcgdGhlIGF2aSBoZWFkZXIuCisKKzIwMDQtMDctMTYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcGxheWJhY2svZ3N0ZGVjb2RlYmluLmM6IChnc3RfZGVjb2RlX2Jpbl9nZXRfdHlwZSksCisJKGdzdF9kZWNvZGVfYmluX2NsYXNzX2luaXQpLCAoZ3N0X2RlY29kZV9iaW5faXNfZHluYW1pYyksCisJKGdzdF9kZWNvZGVfYmluX2ZhY3RvcnlfZmlsdGVyKSwgKGNvbXBhcmVfcmFua3MpLCAocHJpbnRfZmVhdHVyZSksCisJKGdzdF9kZWNvZGVfYmluX2luaXQpLCAoZ3N0X2RlY29kZV9iaW5fZGlzcG9zZSksCisJKGZpbmRfY29tcGF0aWJsZXMpLCAoY2xvc2VfcGFkX2xpbmspLCAodHJ5X3RvX2xpbmtfMSksIChuZXdfcGFkKSwKKwkobm9fbW9yZV9wYWRzKSwgKGNsb3NlX2xpbmspLCAodHlwZV9mb3VuZCksCisJKGdzdF9kZWNvZGVfYmluX3NldF9wcm9wZXJ0eSksIChnc3RfZGVjb2RlX2Jpbl9nZXRfcHJvcGVydHkpLAorCShnc3RfZGVjb2RlX2Jpbl9jaGFuZ2Vfc3RhdGUpLCAocGx1Z2luX2luaXQpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChnc3RfcGxheV9iYXNlX2Jpbl9nZXRfdHlwZSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2NsYXNzX2luaXQpLCAoZ3N0X3BsYXlfYmFzZV9iaW5faW5pdCksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2Rpc3Bvc2UpLCAocXVldWVfb3ZlcnJ1biksCisJKGdlbl9wcmVyb2xsX2VsZW1lbnQpLCAocmVtb3ZlX3ByZXJvbGxzKSwgKHVua25vd25fdHlwZSksCisJKG5vX21vcmVfcGFkcyksIChuZXdfc3RyZWFtKSwgKHNldHVwX3NvdXJjZSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX3NldF9wcm9wZXJ0eSksIChnc3RfcGxheV9iYXNlX2Jpbl9nZXRfcHJvcGVydHkpLAorCShwbGF5X2Jhc2VfZW9zKSwgKGdzdF9wbGF5X2Jhc2VfYmluX2NoYW5nZV9zdGF0ZSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2FkZF9lbGVtZW50KSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fcmVtb3ZlX2VsZW1lbnQpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9tdXRlX3N0cmVhbSksIChnc3RfcGxheV9iYXNlX2Jpbl9saW5rX3N0cmVhbSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX3VubGlua19zdHJlYW0pLAorCShnc3RfcGxheV9iYXNlX2Jpbl9nZXRfc3RyZWFtaW5mbyk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uaDoKKwlCZXR0ZXIgZXJyb3IgcmVjb3ZlcnkuIEFkZGVkIGNvbmZpZ3VyYWJsZSBwcmVyb2xsIHF1ZXVlIHNpemUuIEZhc3RlcgorCWRldGVjdGlvbiBvZiBuby1tb3JlLXBhZHMuCisKKzIwMDQtMDctMTYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QtbGlicy9nc3QvdmlkZW8vdmlkZW8uaDoKKwlBZGRlZCAzMiBiaXRzIFJHQkEuIE5vdCBzdXJlIGlmIHdlIHNob3VsZCB1c2UgYW5vdGhlciBtaW1lLXR5cGUKKwlmb3IgYWxwaGEgcmdiLiBDdXJyZW50bHkgdGhlIHByZXNlbmNlIG9mIHRoZSBhbHBoYV9tYXNrIHByb3BlcnR5CisJc2lnbmFscyBhbiBhbHBoYSBjaGFubmVsLgorCisyMDA0LTA3LTE2ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua194Y29udGV4dF9nZXQpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19nZXRfeHZfc3VwcG9ydCk6CisJRlBTIHNlZW1zIHRvIGJlIDAuMCB0byBNQVggZXZlcnl3aGVyZSBlbHNlLgorCisyMDA0LTA3LTE1ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6CisJKGdzdF9yaWZmX2NyZWF0ZV92aWRlb19jYXBzX3dpdGhfZGF0YSk6CisJICBtcDQyL21wNDMgKG5vIGNhcHMpIGV4aXN0IHRvby4KKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X3ZpZGVvX2NhcHMpOgorCSAgU2V0IHBpeGVsX3dpZHRoL2hlaWdodDsgd2UndmUgZ290IHRoZW0gaW4tY2Fwcy4KKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAocGx1Z2luX2luaXQpOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChwbHVnaW5faW5pdCk6CisJICBCb3RoIGFyZSB2YWxpZCBwcmltYXJ5LgorCSogc3lzL29zcy9nc3Rvc3NtaXhlci5jOgorCSAgUmVtb3ZlIGkxOG4gaGFjayBhbmQgZW5hYmxlIHRyYW5zbGF0aW9ucy4KKworMjAwNC0wNy0xNSAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2NoZWNrX3hzaG1fY2FsbHMpLAorCShnc3RfeHZpbWFnZXNpbmtfeHZpbWFnZV9uZXcpLCAoZ3N0X3h2aW1hZ2VzaW5rX3h2aW1hZ2VfZGVzdHJveSk6CisJICBmaXggZm9yIG5vbi1zaG0geHYuIE9yaWdpbmFsIHBhdGNoIGJ5IFRpbSBSaW5nZW5iYWNoIChmaXhlcyAjMTQ3MjQ4KQorCisyMDA0LTA3LTE1ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX29wZW5fYXVkaW8pLAorCShnc3RfYWxzYV9zd19wYXJhbXNfZHVtcCksIChnc3RfYWxzYV9od19wYXJhbXNfZHVtcCksCisJKGdzdF9hbHNhX2Nsb3NlX2F1ZGlvKToKKwkgIGRpc2FibGUgc29tZSBvZiB0aGUgZGVidWdnaW5nIGNvZGUgZm9yIG5vdy4gV3JpdGluZyBkZWJ1Z2dpbmcgdG8gYQorCSAgYnVmZmVyIGlzIGJyb2tlbiBpbiBjdXJyZW50IGFsc2FsaWIgcmVsZWFzZXMuCisKKzIwMDQtMDctMTIgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L21wZWcyZGVjL2dzdG1wZWcyZGVjLmM6IChnc3RfbXBlZzJkZWNfYWxsb2NfYnVmZmVyKToKKwkgIHVzZSBidWZmZXJwb29scworCisyMDA0LTA3LTE0ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvdGhlb3JhL3RoZW9yYWRlYy5jOiAoZ3N0X3RoZW9yYV9kZWNfY2xhc3NfaW5pdCksCisJKHRoZW9yYV9kZWNfc3JjX3F1ZXJ5KSwgKHRoZW9yYV9kZWNfZXZlbnQpOgorCSogZXh0L3RoZW9yYS90aGVvcmFlbmMuYzogKGdzdF90aGVvcmFfZW5jX2NsYXNzX2luaXQpOgorCSAgYWRkIGRlYnVnZ2luZyBjYXRlZ29yaWVzLiAgUmVtb3ZlIFxuJ3MuCisKKzIwMDQtMDctMTMgIEpvaGFuIERhaGxpbiAgPGpvaGFuQGdub21lLm9yZz4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYyAoZ3N0X3BsYXlfYmluX3NldF9wcm9wZXJ0eSkKKwkoZ3N0X3BsYXlfYmluX2dldF9wcm9wZXJ0eSk6IEltcGwuCisKKzIwMDQtMDctMTMgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2RlbXV4X3NlZWtfYmVmb3JlKToKKwlXaGVuIHRyeWluZyB0byBmaW5kIHRoZSBzdHJlYW0gbGVuZ3RoLCBzZWVrIGJhY2sgTiBwYWdlcworCWluc3RlYWQgb2YganVzdCBvbmUsIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBzdHJlYW1zIGluCisJdGhlIGN1cnJlbnQgY2hhaW4uCisKKzIwMDQtMDctMTMgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6CisJKGdzdF9yaWZmX2NyZWF0ZV9hdWRpb19jYXBzX3dpdGhfZGF0YSksCisJKGdzdF9yaWZmX2NyZWF0ZV9hdWRpb19jYXBzKSwKKwkoZ3N0X3JpZmZfY3JlYXRlX2F1ZGlvX3RlbXBsYXRlX2NhcHMpOgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5oOgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6CisJKGdzdF9yaWZmX3JlYWRfc3RyZl92aWRzX3dpdGhfZGF0YSksCisJKGdzdF9yaWZmX3JlYWRfc3RyZl9hdWRzX3dpdGhfZGF0YSksIChnc3RfcmlmZl9yZWFkX3N0cmZfYXVkcyk6CisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLXJlYWQuaDoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksCisJKGdzdF9hdmlfZGVtdXhfYWRkX3N0cmVhbSk6CisJU2V0IGNvZGVjX2RhdGEgb24gY2FwcyBmb3IgYXZpZGVtdXhlci4KKworMjAwNC0wNy0xMiAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBjb25maWd1cmUuYWM6IEZpeCB0ZXN0IGZvciBPYmplY3RpdmUgQworCisyMDA0LTA3LTEyICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKGdzdF9nZGtfcGl4YnVmX2dldF9jYXBzbGlzdCksCisJKGdzdF9nZGtfcGl4YnVmX2NoYWluKToKKwkgIEFkZCBzdmcgYW5kIHBjeCB0byB0ZW1wbGF0ZSBjYXBzLCBhbmQgZW5zdXJlIHRoYXQgZ2V0Y2FwcyByZXR1cm5zIGEKKwkgIHN1YnNldCBvZiB0aGUgdGVtcGxhdGUgY2Fwcy4KKwkgIENvcHkgZWFjaCByb3cgbWFudWFsbHkgZm9yIG91dHB1dCwgYXMgZ2RrcGl4YnVmIG1heSBwYWQgdGhlCisJICByb3dzdHJpZGUgdG8gYSAzMi1iaXQgd29yZCBib3VuZGFyeS4KKworMjAwNC0wNy0xMiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtbWVkaWEuYzogKGdzdF9yaWZmX2NyZWF0ZV9hdWRpb19jYXBzKSwKKwkoZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX3RlbXBsYXRlX2NhcHMpOgorCUZpeCB0aGUgdGVtcGxhdGUgY2FwcyB0byBpbmNsdWRlIHNvbWUgbW9yZSBtZWRpYSB0eXBlcy4KKworMjAwNC0wNy0xMiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RkZWNvZGViaW4uYzogKGdzdF9kZWNvZGVfYmluX2dldF90eXBlKSwKKwkoZ3N0X2RlY29kZV9iaW5fY2xhc3NfaW5pdCksIChnc3RfZGVjb2RlX2Jpbl9mYWN0b3J5X2ZpbHRlciksCisJKGNvbXBhcmVfcmFua3MpLCAocHJpbnRfZmVhdHVyZSksIChnc3RfZGVjb2RlX2Jpbl9pbml0KSwKKwkoZ3N0X2RlY29kZV9iaW5fZGlzcG9zZSksIChmaW5kX2NvbXBhdGlibGVzKSwgKGNsb3NlX3BhZF9saW5rKSwKKwkodHJ5X3RvX2xpbmtfMSksIChuZXdfcGFkKSwgKGNsb3NlX2xpbmspLCAodHlwZV9mb3VuZCksCisJKGdzdF9kZWNvZGVfYmluX3NldF9wcm9wZXJ0eSksIChnc3RfZGVjb2RlX2Jpbl9nZXRfcHJvcGVydHkpLAorCShnc3RfZGVjb2RlX2Jpbl9jaGFuZ2Vfc3RhdGUpLCAocGx1Z2luX2luaXQpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChnc3RfcGxheV9iYXNlX2Jpbl9nZXRfdHlwZSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2NsYXNzX2luaXQpLCAoZ3N0X3BsYXlfYmFzZV9iaW5faW5pdCksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2Rpc3Bvc2UpLCAocXVldWVfb3ZlcnJ1biksCisJKGdlbl9wcmVyb2xsX2VsZW1lbnQpLCAocmVtb3ZlX3ByZXJvbGxzKSwgKG5vX21vcmVfcGFkcyksCisJKG5ld19zdHJlYW0pLCAoc2V0dXBfc291cmNlKSwgKGdzdF9wbGF5X2Jhc2VfYmluX3NldF9wcm9wZXJ0eSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2dldF9wcm9wZXJ0eSksIChwbGF5X2Jhc2VfZW9zKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fY2hhbmdlX3N0YXRlKSwgKGdzdF9wbGF5X2Jhc2VfYmluX2FkZF9lbGVtZW50KSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fcmVtb3ZlX2VsZW1lbnQpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9tdXRlX3N0cmVhbSksIChnc3RfcGxheV9iYXNlX2Jpbl9saW5rX3N0cmVhbSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX3VubGlua19zdHJlYW0pLAorCShnc3RfcGxheV9iYXNlX2Jpbl9nZXRfc3RyZWFtaW5mbyk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uaDoKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnc3RfcGxheV9iaW5fZ2V0X3R5cGUpLAorCShnc3RfcGxheV9iaW5fY2xhc3NfaW5pdCksIChnc3RfcGxheV9iaW5faW5pdCksCisJKGdzdF9wbGF5X2Jpbl9kaXNwb3NlKSwgKGdzdF9wbGF5X2Jpbl9zZXRfcHJvcGVydHkpLAorCShnc3RfcGxheV9iaW5fZ2V0X3Byb3BlcnR5KSwgKGdlbl92aWRlb19lbGVtZW50KSwKKwkoZ2VuX2F1ZGlvX2VsZW1lbnQpLCAocmVtb3ZlX3NpbmtzKSwgKHNldHVwX3NpbmtzKSwKKwkoZ3N0X3BsYXlfYmluX2NoYW5nZV9zdGF0ZSksIChnc3RfcGxheV9iaW5fZ2V0X2V2ZW50X21hc2tzKSwKKwkoZ3N0X3BsYXlfYmluX3NlbmRfZXZlbnQpLCAoZ3N0X3BsYXlfYmluX2dldF9mb3JtYXRzKSwKKwkoZ3N0X3BsYXlfYmluX2NvbnZlcnQpLCAoZ3N0X3BsYXlfYmluX2dldF9xdWVyeV90eXBlcyksCisJKGdzdF9wbGF5X2Jpbl9xdWVyeSksIChwbHVnaW5faW5pdCk6CisJKiBnc3QvcGxheWJhY2svdGVzdDQuYzogKG1haW4pOgorCU1vcmUgZml4ZXMgb24gcmV1c2luZyBvZiB0aGUgZWxlbWVudC4KKworMjAwNC0wNy0xMSAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvbWFkL2dzdG1hZC5jOiAobm9ybWFsX3NlZWspOgorCSAgYWxsb3cgc2Vla2luZyBmb3Igb3RoZXIgbWV0aG9kcyB0aGFuIGp1c3QgU0VUCisKKzIwMDQtMDctMTEgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmMgKGdzdF9hdWRpb19jb252ZXJ0X2xpbmspOiBGb3IKKwlmbG9hdCwgImFueSIgY2FwcyAtPiBidWZmZXJfZnJhbWVzPVswLE1BWF0uCisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYyAoaW50ZXJsZWF2ZV9nZXRjYXBzKTogU2VlbXMgdGhlIGNvcmUKKwlkb2Vzbid0IGludGVyc2VjdCBvdXIgY2FwcyB3aXRoIHRoZSB0ZW1wbGF0ZSBhbnkgbW9yZS4gRG8gaXQKKwlvdXJzZWx2ZXMuCisJKGludGVybGVhdmVfYnVmZmVyZWRfbG9vcCk6IFVzZSBnX25ld2EgaW5zdGVhZCBvZiBtYWxsb2MvZnJlZS4KKworMjAwNC0wNy0wOSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RkZWNvZGViaW4uYzogKGdzdF9kZWNvZGVfYmluX2dldF90eXBlKSwKKwkoZ3N0X2RlY29kZV9iaW5fY2xhc3NfaW5pdCksIChnc3RfZGVjb2RlX2Jpbl9mYWN0b3J5X2ZpbHRlciksCisJKGNvbXBhcmVfcmFua3MpLCAocHJpbnRfZmVhdHVyZSksIChnc3RfZGVjb2RlX2Jpbl9pbml0KSwKKwkoZ3N0X2RlY29kZV9iaW5fZGlzcG9zZSksIChmaW5kX2NvbXBhdGlibGVzKSwgKGNsb3NlX3BhZF9saW5rKSwKKwkodHJ5X3RvX2xpbmtfMSksIChuZXdfcGFkKSwgKGNsb3NlX2xpbmspLCAodHlwZV9mb3VuZCksCisJKGdzdF9kZWNvZGVfYmluX3NldF9wcm9wZXJ0eSksIChnc3RfZGVjb2RlX2Jpbl9nZXRfcHJvcGVydHkpLAorCShnc3RfZGVjb2RlX2Jpbl9jaGFuZ2Vfc3RhdGUpLCAocGx1Z2luX2luaXQpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChnc3RfcGxheV9iYXNlX2Jpbl9nZXRfdHlwZSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2NsYXNzX2luaXQpLCAoZ3N0X3BsYXlfYmFzZV9iaW5faW5pdCksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2Rpc3Bvc2UpLCAocXVldWVfb3ZlcnJ1biksCisJKGdlbl9wcmVyb2xsX2VsZW1lbnQpLCAocmVtb3ZlX3ByZXJvbGxzKSwgKG5vX21vcmVfcGFkcyksCisJKG5ld19zdHJlYW0pLCAoc2V0dXBfc291cmNlKSwgKGdzdF9wbGF5X2Jhc2VfYmluX3NldF9wcm9wZXJ0eSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2dldF9wcm9wZXJ0eSksIChwbGF5X2Jhc2VfZW9zKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fY2hhbmdlX3N0YXRlKSwgKGdzdF9wbGF5X2Jhc2VfYmluX2FkZF9lbGVtZW50KSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fcmVtb3ZlX2VsZW1lbnQpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9tdXRlX3N0cmVhbSksIChnc3RfcGxheV9iYXNlX2Jpbl9saW5rX3N0cmVhbSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX3VubGlua19zdHJlYW0pLAorCShnc3RfcGxheV9iYXNlX2Jpbl9nZXRfc3RyZWFtaW5mbyk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uaDoKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnc3RfcGxheV9iaW5fZ2V0X3R5cGUpLAorCShnc3RfcGxheV9iaW5fY2xhc3NfaW5pdCksIChnc3RfcGxheV9iaW5faW5pdCksCisJKGdzdF9wbGF5X2Jpbl9kaXNwb3NlKSwgKGdzdF9wbGF5X2Jpbl9zZXRfcHJvcGVydHkpLAorCShnc3RfcGxheV9iaW5fZ2V0X3Byb3BlcnR5KSwgKGdlbl92aWRlb19lbGVtZW50KSwKKwkoZ2VuX2F1ZGlvX2VsZW1lbnQpLCAocmVtb3ZlX3NpbmtzKSwgKHNldHVwX3NpbmtzKSwKKwkoZ3N0X3BsYXlfYmluX2NoYW5nZV9zdGF0ZSksIChnc3RfcGxheV9iaW5fZ2V0X2V2ZW50X21hc2tzKSwKKwkoZ3N0X3BsYXlfYmluX3NlbmRfZXZlbnQpLCAoZ3N0X3BsYXlfYmluX2dldF9mb3JtYXRzKSwKKwkoZ3N0X3BsYXlfYmluX2NvbnZlcnQpLCAoZ3N0X3BsYXlfYmluX2dldF9xdWVyeV90eXBlcyksCisJKGdzdF9wbGF5X2Jpbl9xdWVyeSksIChwbHVnaW5faW5pdCk6CisJKiBnc3QvcGxheWJhY2svdGVzdDQuYzogKG1haW4pOgorCVdvcmsgb24gb2JqZWN0IHJldXNlIGFuZCBzZWVraW5nLgorCisyMDA0LTA3LTA5ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXhhbXBsZXMvc2Vla2luZy9zZWVrLmM6IChpdGVyYXRlKToKKwlEb24ndCBjb25zdW1lIGFsbCBDUFUgaW4gdGhlIGlkbGUgbG9vcC4KKworMjAwNC0wNy0wOSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdkZW11eC5jOiAoZ3N0X21wZWdfZGVtdXhfbmV3X291dHB1dF9wYWQpLAorCShnc3RfbXBlZ19kZW11eF9wYXJzZV9wYWNrZXQpLCAoZ3N0X21wZWdfZGVtdXhfcHJvY2Vzc19wcml2YXRlKToKKwlBZGQgcGFkIHRvIGVsZW1lbnQgKmFmdGVyKiBzZXR0aW5nIHRoZSBwYWQgZnVuY3Rpb25zIHNvIHRoYXQKKwl0aGUgc2NoZWR1bGVyIGNhbiB1c2UgdGhlIGNvcnJlY3Qgb25lcy4KKworMjAwNC0wNy0wOSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6ICh0aGVvcmFfZGVjX2Zyb21fZ3JhbnVsZXBvcyksCisJKHRoZW9yYV9kZWNfc3JjX3F1ZXJ5KSwgKHRoZW9yYV9kZWNfc3JjX2V2ZW50KSwgKHRoZW9yYV9kZWNfY2hhaW4pOgorCVN5bmMgdG8ga2V5ZnJhbWUgYWZ0ZXIgc2VlaworCisyMDA0LTA3LTA5ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIChhdCkgYXBlc3RhYXJ0IChkb3QpIG9yZz4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2NoZWNrX2V2ZW50KSwKKwkoZ3N0X2Fsc2Ffc2lua19sb29wKSwgKGdzdF9hbHNhX3NpbmtfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9hbHNhL2dzdGFsc2FzcmMuYzogKGdzdF9hbHNhX3NyY19jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L2xpYnZpc3VhbC92aXN1YWwuYzogKGdzdF92aXN1YWxfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6ICh0aGVvcmFfZGVjX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvdGhlb3JhL3RoZW9yYWVuYy5jOiAodGhlb3JhX2VuY19jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L3ZvcmJpcy92b3JiaXNkZWMuYzogKHZvcmJpc19kZWNfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC1saWJzL2dzdC9uYXZpZ2F0aW9uL25hdmlnYXRpb24uYzoKKwkqIGdzdC9hZGRlci9nc3RhZGRlci5jOiAoZ3N0X2FkZGVyX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOiAoZ3N0X2F1ZGlvX2NvbnZlcnRfY2hhaW4pLAorCShnc3RfYXVkaW9fY29udmVydF9nZXRfYnVmZmVyKToKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkoZ3N0X211bHRpcGFydF9kZW11eF9jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L3BsYXliYWNrL2dzdGRlY29kZWJpbi5jOiAoZ3N0X2RlY29kZV9iaW5fY2hhbmdlX3N0YXRlKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoZ3N0X3BsYXlfYmFzZV9iaW5fY2hhbmdlX3N0YXRlKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnc3RfcGxheV9iaW5fY2hhbmdlX3N0YXRlKToKKwkqIGdzdC92aWRlb3NjYWxlL2dzdHZpZGVvc2NhbGUuYzoKKwkoZ3N0X3ZpZGVvc2NhbGVfaGFuZGxlX3NyY19ldmVudCk6CisJKiBnc3Qvdm9sdW1lL2dzdHZvbHVtZS5jOiAodm9sdW1lX2NoYWluX2ludDE2KToKKwkgIGRvbid0IGFzc2VydCBpbiBzdGF0ZSBjaGFuZ2UsIHRoaXMgc2hvdWxkIGJlIGRvbmUgYnkgdGhlIGJhc2UKKwkgIEdzdEVsZW1lbnQgY2xhc3MuCisJICB2YXJpb3VzIGRlYnVnZ2luZyBmaXhlcy4KKworMjAwNC0wNy0wOCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC1saWJzL2dzdC9wbGF5L3BsYXkuYzogKGdzdF9wbGF5X3BpcGVsaW5lX3NldHVwKSwKKwkoZ3N0X3BsYXlfZGlzcG9zZSksIChnc3RfcGxheV9zZXRfbG9jYXRpb24pLAorCShnc3RfcGxheV9zZXRfZGF0YV9zcmMpLCAoZ3N0X3BsYXlfc2V0X3ZpZGVvX3NpbmspLAorCShnc3RfcGxheV9zZXRfYXVkaW9fc2luayksIChnc3RfcGxheV9zZXRfdmlzdWFsaXphdGlvbiksCisJKGdzdF9wbGF5X2Nvbm5lY3RfdmlzdWFsaXphdGlvbiksIChnc3RfcGxheV9nZXRfc2lua19lbGVtZW50KSwKKwkoZ3N0X3BsYXlfZ2V0X2FsbF9ieV9pbnRlcmZhY2UpOgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5oOgorCSAgYWRkIG5ldyBtZXRob2QgdG8gZ2V0IGVsZW1lbnRzIGltcGxlbWVudGluZyBhbiBpbnRlcmZhY2UuCisJICBhZGQgdmFyaW91cyBlcnJvciBsb2dnaW5nCisKKzIwMDQtMDctMDggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleGFtcGxlcy9zZWVraW5nL3NlZWsuYzogKG1ha2VfZHZfcGlwZWxpbmUpLCAobWFrZV9hdmlfcGlwZWxpbmUpLAorCShtYWtlX21wZWdfcGlwZWxpbmUpLCAobWFrZV9tcGVnbnRfcGlwZWxpbmUpLAorCShtYWtlX3BsYXllcmJpbl9waXBlbGluZSksIChxdWVyeV9kdXJhdGlvbnNfZWxlbXMpLAorCShxdWVyeV9kdXJhdGlvbnNfcGFkcyksIChxdWVyeV9wb3NpdGlvbnNfZWxlbXMpLAorCShxdWVyeV9wb3NpdGlvbnNfcGFkcyksICh1cGRhdGVfc2NhbGUpLCAoaXRlcmF0ZSksIChzdG9wX3NlZWspLAorCShtYWluKToKKwlBZGRlZCBwbGF5YmluIHNlZWtpbmcgZXhhbXBsZS4KKworMjAwNC0wNy0wOCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIGdzdC1saWJzL2dzdC9wbGF5L3BsYXkuYzogKGdzdF9wbGF5X3NldF9sb2NhdGlvbiksCisJKGdzdF9wbGF5X3NldF9kYXRhX3NyYyksIChnc3RfcGxheV9zZXRfdmlkZW9fc2luayksCisJKGdzdF9wbGF5X3NldF9hdWRpb19zaW5rKSwgKGdzdF9wbGF5X3NldF92aXN1YWxpemF0aW9uKSwKKwkoZ3N0X3BsYXlfY29ubmVjdF92aXN1YWxpemF0aW9uKSwgKGdzdF9wbGF5X2dldF9mcmFtZXJhdGUpOgorCSAgdXNlIGEgbWFjcm8gdG8gbG9vayB1cCBlbGVtZW50cyBmcm9tIGhhc2ggdGFibGUKKworMjAwNC0wNy0wOCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIGdzdC1saWJzL2dzdC9wbGF5L3BsYXkuYzogKGdzdF9wbGF5X3BpcGVsaW5lX3NldHVwKSwKKwkoZ3N0X3BsYXlfZ2V0X2xlbmd0aF9jYWxsYmFjayksIChnc3RfcGxheV9zZXRfbG9jYXRpb24pLAorCShnc3RfcGxheV9zZWVrX3RvX3RpbWUpLCAoZ3N0X3BsYXlfc2V0X2RhdGFfc3JjKSwKKwkoZ3N0X3BsYXlfc2V0X3ZpZGVvX3NpbmspLCAoZ3N0X3BsYXlfc2V0X2F1ZGlvX3NpbmspLAorCShnc3RfcGxheV9zZXRfdmlzdWFsaXphdGlvbiksIChnc3RfcGxheV9jb25uZWN0X3Zpc3VhbGl6YXRpb24pLAorCShnc3RfcGxheV9nZXRfc2lua19lbGVtZW50KToKKwktIGFkZCBkZWJ1Z2dpbmcgaW5mbworCS0gZml4IGxvb2tpbmcgdXAgc2luayBlbGVtZW50cyBieSBpdGVyYXRpbmcgb3ZlciBjb21wbGV0ZSBjYXBzCisJLSBwdXQgZXZlcnl0aGluZyBleGNlcHQgZm9yIHNvdXJjZSBhbmQgYXV0b3BsdWdnZXIgaW4gYSBjb21wbGV0ZSBiaW4KKworMjAwNC0wNy0wOCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX2RyYWluX2F1ZGlvKToKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2ZsdXNoX29uZV9wYWQpLAorCShnc3RfYWxzYV9zaW5rX2NoZWNrX2V2ZW50KSwgKGdzdF9hbHNhX3NpbmtfbW1hcCksCisJKGdzdF9hbHNhX3Npbmtfd3JpdGUpLCAoZ3N0X2Fsc2Ffc2lua19sb29wKToKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmg6CisJLSBhZGQgZGVidWdnaW5nIGluZm8KKwktIGNsZWFuIHVwIHNjaGl6b3BocmVuaWEgb2YgZGF0YS9idWZmZXIvZXZlbnQKKwktIGZpeCBkb3VibGUgZXZlbnQgdW5yZWYgZXJyb3IKKworMjAwNC0wNy0wOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9wbGF5YmFjay9NYWtlZmlsZS5hbToKKwlBZGQgaGVhZGVycyB0byBub2luc3QKKworMjAwNC0wNy0wOCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIHRvb2xzL2dzdC1sYXVuY2gtZXh0LW0ubToKKwkqIHRvb2xzL2dzdC1sYXVuY2gtZXh0LjEuaW46CisJICBjb252ZXJ0IHRvIHRoZSB0aGlyZCBtaWxsZW5pdW0KKworMjAwNC0wNy0wNyAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBzeXMvZHhyMy9NYWtlZmlsZS5hbTogbm9pbnN0X1NPVVJDRVMgc2hvdWxkIGJlIG5vZGlzdF9TT1VSQ0VTCisKKzIwMDQtMDctMDcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcGxheWJhY2svTWFrZWZpbGUuYW06CisJKiBnc3QvcGxheWJhY2svUkVBRE1FOgorCSogZ3N0L3BsYXliYWNrL2dzdGRlY29kZWJpbi5jOiAoZ3N0X2RlY29kZV9iaW5fZ2V0X3R5cGUpLAorCShnc3RfZGVjb2RlX2Jpbl9jbGFzc19pbml0KSwgKGdzdF9kZWNvZGVfYmluX2ZhY3RvcnlfZmlsdGVyKSwKKwkoY29tcGFyZV9yYW5rcyksIChwcmludF9mZWF0dXJlKSwgKGdzdF9kZWNvZGVfYmluX2luaXQpLAorCShnc3RfZGVjb2RlX2Jpbl9kaXNwb3NlKSwgKGZpbmRfY29tcGF0aWJsZXMpLCAoY2xvc2VfcGFkX2xpbmspLAorCSh0cnlfdG9fbGlua18xKSwgKG5ld19wYWQpLCAoY2xvc2VfbGluayksICh0eXBlX2ZvdW5kKSwKKwkoZ3N0X2RlY29kZV9iaW5fc2V0X3Byb3BlcnR5KSwgKGdzdF9kZWNvZGVfYmluX2dldF9wcm9wZXJ0eSksCisJKHBsdWdpbl9pbml0KToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoZ3N0X3BsYXlfYmFzZV9iaW5fZ2V0X3R5cGUpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9jbGFzc19pbml0KSwgKGdzdF9wbGF5X2Jhc2VfYmluX2luaXQpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9kaXNwb3NlKSwgKHJlYnVpbGRfcGlwZWxpbmUpLCAocXVldWVfb3ZlcnJ1biksCisJKGdlbl9wcmVyb2xsX2VsZW1lbnQpLCAobm9fbW9yZV9wYWRzKSwgKG5ld19zdHJlYW0pLAorCShzZXR1cF9zb3VyY2UpLCAoZ3N0X3BsYXlfYmFzZV9iaW5fc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fZ2V0X3Byb3BlcnR5KSwgKGdzdF9wbGF5X2Jhc2VfYmluX2NoYW5nZV9zdGF0ZSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2FkZF9lbGVtZW50KSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fcmVtb3ZlX2VsZW1lbnQpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9tdXRlX3N0cmVhbSksIChnc3RfcGxheV9iYXNlX2Jpbl9saW5rX3N0cmVhbSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX3VubGlua19zdHJlYW0pLAorCShnc3RfcGxheV9iYXNlX2Jpbl9nZXRfc3RyZWFtaW5mbyk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uaDoKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnc3RfcGxheV9iaW5fZ2V0X3R5cGUpLAorCShnc3RfcGxheV9iaW5fY2xhc3NfaW5pdCksIChnc3RfcGxheV9iaW5faW5pdCksCisJKGdzdF9wbGF5X2Jpbl9kaXNwb3NlKSwgKGdzdF9wbGF5X2Jpbl9zZXRfcHJvcGVydHkpLAorCShnc3RfcGxheV9iaW5fZ2V0X3Byb3BlcnR5KSwgKGdlbl92aWRlb19lbGVtZW50KSwKKwkoZ2VuX2F1ZGlvX2VsZW1lbnQpLCAoc2V0dXBfc2lua3MpLCAoZ3N0X3BsYXlfYmluX2NoYW5nZV9zdGF0ZSksCisJKGdzdF9wbGF5X2Jpbl9nZXRfZXZlbnRfbWFza3MpLCAoZ3N0X3BsYXlfYmluX3NlbmRfZXZlbnQpLAorCShnc3RfcGxheV9iaW5fZ2V0X2Zvcm1hdHMpLCAoZ3N0X3BsYXlfYmluX2NvbnZlcnQpLAorCShnc3RfcGxheV9iaW5fZ2V0X3F1ZXJ5X3R5cGVzKSwgKGdzdF9wbGF5X2Jpbl9xdWVyeSksCisJKHBsdWdpbl9pbml0KToKKwkqIGdzdC9wbGF5YmFjay9nc3RzdHJlYW1pbmZvLmM6IChnc3Rfc3RyZWFtX3R5cGVfZ2V0X3R5cGUpLAorCShnc3Rfc3RyZWFtX2luZm9fZ2V0X3R5cGUpLCAoZ3N0X3N0cmVhbV9pbmZvX2NsYXNzX2luaXQpLAorCShnc3Rfc3RyZWFtX2luZm9faW5pdCksIChnc3Rfc3RyZWFtX2luZm9fbmV3KSwKKwkoZ3N0X3N0cmVhbV9pbmZvX2Rpc3Bvc2UpLCAoZ3N0X3N0cmVhbV9pbmZvX3NldF9wcm9wZXJ0eSksCisJKGdzdF9zdHJlYW1faW5mb19nZXRfcHJvcGVydHkpOgorCSogZ3N0L3BsYXliYWNrL2dzdHN0cmVhbWluZm8uaDoKKwkqIGdzdC9wbGF5YmFjay90ZXN0LmM6IChnZW5fdmlkZW9fZWxlbWVudCksIChnZW5fYXVkaW9fZWxlbWVudCksCisJKG1haW4pOgorCSogZ3N0L3BsYXliYWNrL3Rlc3QyLmM6IChtYWluKToKKwkqIGdzdC9wbGF5YmFjay90ZXN0My5jOiAodXBkYXRlX3NjYWxlKSwgKG1haW4pOgorCU1vcmUgcGxheWJpbiBmaXhlcy4gQWRkZWQgUkVBRE1FLiBEbyBiZXR0ZXIgZWxlbWVudCBmaWx0ZXJpbmcuCisJQWRkZWQgYmFzZSBjbGFzcyB0byBwcmVyb2xsIG1lZGlhLiBBZGRlZCB0ZXN0IGFwcHMuCisKKzIwMDQtMDctMDcgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgKGF0KSBhcGVzdGFhcnQgKGRvdCkgb3JnPgorCisJKiBleHQvbXBlZzJkZWMvZ3N0bXBlZzJkZWMuYzogKGdzdF9tcGVnMmRlY19mbHVzaF9kZWNvZGVyKToKKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5oOgorCSAgdmFyaW91cyBkZWJ1Z2dpbmcgaW1wcm92ZW1lbnRzLiAgUmVzZXQgc3RyZWFtIHRvIG5leHQgcGljdHVyZQorCSAgaW5zdGVhZCBvZiBzZXF1ZW5jZSBoZWFkZXIsIG90aGVyd2lzZSBzZWVrcyBjYW5ub3Qgd29yay4KKworMjAwNC0wNy0wNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOiAoZ3N0X3ZpZGVvX2JveF9maWxsX2dldF90eXBlKSwKKwkoZ3N0X3ZpZGVvX2JveF9jbGFzc19pbml0KSwgKGdzdF92aWRlb19ib3hfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3ZpZGVvX2JveF9pNDIwKSwgKGdzdF92aWRlb19ib3hfYXl1diksIChnc3RfdmlkZW9fYm94X2NoYWluKToKKwlVc2UgcGFkX2FsbG9jIHdoZXJlIHBvc3NpYmxlLgorCisyMDA0LTA3LTA3ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogc3lzL29zcy9nc3Rvc3NlbGVtZW50LmM6IChnc3Rfb3NzZWxlbWVudF9yZXNldCksCisJKGdzdF9vc3NlbGVtZW50X3BhcnNlX2NhcHMpOgorCSogc3lzL29zcy9nc3Rvc3NlbGVtZW50Lmg6CisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jOiAoZ3N0X29zc3NyY19nZXQpOgorCUZpeCBvZmZzZXQgb24gb3Nzc3JjLgorCisyMDA0LTA3LTA3ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L3RoZW9yYS90aGVvcmEuYzogKHBsdWdpbl9pbml0KToKKwkqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6ICh0aGVvcmFfZGVjX2Zyb21fZ3JhbnVsZXBvcyksCisJKHRoZW9yYV9kZWNfc3JjX3F1ZXJ5KSwgKHRoZW9yYV9kZWNfY2hhaW4pOgorCSogZXh0L3RoZW9yYS90aGVvcmFlbmMuYzogKGdzdF90aGVvcmFfZW5jX2NsYXNzX2luaXQpLAorCSh0aGVvcmFfZW5jX3NpbmtfbGluayksICh0aGVvcmFfYnVmZmVyX2Zyb21fcGFja2V0KSwKKwkodGhlb3JhX3B1c2hfcGFja2V0KSwgKHRoZW9yYV9lbmNfY2hhaW4pOgorCUZpeCB0aGVvcmEgZ3JhbnVsZXBvcyBjYWxjdWxhdGlvbi4KKwlGaXggb3ZlcmZsb3cgaW4gZHVyYXRpb24vcG9zaXRpb24gY2FsY3VsYXRpb24uCisJQnVtcCByYW5rIHRvIFBSSU1BUlkgZm9yIHRoZW9yYWRlYy4KKwlVc2UgZ3JhbnVsZXBvcyBvZiBsYXN0IHBhY2tldCB0byBjYWxjdWxhdGUgcG9zaXRpb24uCisJU2V0IGtleWZyYW1lIGZsYWcgb24gYnVmZmVycyB3aGVuIG5lZWRlZC4KKworMjAwNC0wNy0wNiAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvcGxheWJhY2svTWFrZWZpbGUuYW06ICd0ZXN0JyBpbiBiaW5fUFJPR1JBTVM/ICBBcmUgeW91CisJc2VyaW91cz8gIChGaXhlZCwgb2J2aW91c2x5LikKKworMjAwNC0wNy0wNiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogcG8vTElOR1VBUzoKKwkqIHBvL2NzLnBvOgorCSAgYWRkZWQgQ3plY2ggdHJhbnNsYXRpb24gKE1pbG9zbGF2IFRybWFjKQorCisyMDA0LTA3LTA1ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3BsYXliYWNrL2dzdGRlY29kZWJpbi5jOiAoZ3N0X2RlY29kZV9iaW5fZ2V0X3R5cGUpLAorCShnc3RfZGVjb2RlX2Jpbl9jbGFzc19pbml0KSwgKGdzdF9kZWNvZGVfYmluX2ZhY3RvcnlfZmlsdGVyKSwKKwkoY29tcGFyZV9yYW5rcyksIChnc3RfZGVjb2RlX2Jpbl9pbml0KSwgKGdzdF9kZWNvZGVfYmluX2Rpc3Bvc2UpLAorCShmaW5kX2NvbXBhdGlibGVzKSwgKGNsb3NlX3BhZF9saW5rKSwgKHRyeV90b19saW5rXzEpLCAobmV3X3BhZCksCisJKGNsb3NlX2xpbmspLCAodHlwZV9mb3VuZCksIChnc3RfZGVjb2RlX2Jpbl9zZXRfcHJvcGVydHkpLAorCShnc3RfZGVjb2RlX2Jpbl9nZXRfcHJvcGVydHkpLCAoZ3N0X2RlY29kZV9iaW5fZ2V0X2V2ZW50X21hc2tzKSwKKwkoZ3N0X2RlY29kZV9iaW5fc2VuZF9ldmVudCksIChnc3RfZGVjb2RlX2Jpbl9nZXRfZm9ybWF0cyksCisJKGdzdF9kZWNvZGVfYmluX2NvbnZlcnQpLCAoZ3N0X2RlY29kZV9iaW5fZ2V0X3F1ZXJ5X3R5cGVzKSwKKwkoZ3N0X2RlY29kZV9iaW5fcXVlcnkpLCAocGx1Z2luX2luaXQpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdzdF9wbGF5X2Jpbl9nZXRfdHlwZSksCisJKGdzdF9wbGF5X2Jpbl9jbGFzc19pbml0KSwgKGdzdF9wbGF5X2Jpbl9pbml0KSwKKwkoZ3N0X3BsYXlfYmluX2Rpc3Bvc2UpLCAocmVidWlsZF9waXBlbGluZSksIChnZXRfYXVkaW9fZWxlbWVudCksCisJKGdldF92aWRlb19lbGVtZW50KSwgKG5ld19wYWQpLCAoc2V0dXBfc291cmNlKSwKKwkoZ3N0X3BsYXlfYmluX3NldF9wcm9wZXJ0eSksIChnc3RfcGxheV9iaW5fZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3BsYXlfYmluX2NoYW5nZV9zdGF0ZSksIChnc3RfcGxheV9iaW5fYWRkX2VsZW1lbnQpLAorCShnc3RfcGxheV9iaW5fcmVtb3ZlX2VsZW1lbnQpLCAoZ3N0X3BsYXlfYmluX2dldF9ldmVudF9tYXNrcyksCisJKGdzdF9wbGF5X2Jpbl9zZW5kX2V2ZW50KSwgKGdzdF9wbGF5X2Jpbl9nZXRfZm9ybWF0cyksCisJKGdzdF9wbGF5X2Jpbl9jb252ZXJ0KSwgKGdzdF9wbGF5X2Jpbl9nZXRfcXVlcnlfdHlwZXMpLAorCShnc3RfcGxheV9iaW5fcXVlcnkpLCAoZ3N0X3BsYXlfYmluX2dldF9jbG9jayksIChwbHVnaW5faW5pdCk6CisJKiBnc3QvcGxheWJhY2svdGVzdC5jOiAobWFpbik6CisJTW9yZSBmaXhlcywgY2xlYW5lZCB1cCBwbGF5YmluLCBtYWtlIGl0IHVzZSBkZWNvZGViaW4uIEFkZGVkCisJdGhyZWFkZWQgcHJvcGVydHkgdG8gcGxheWJpbi4KKworMjAwNC0wNy0wNSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9wbGF5YmFjay9NYWtlZmlsZS5hbToKKwkqIGdzdC9wbGF5YmFjay9kZWNvZGV0ZXN0LmM6IChtYWluKToKKwkqIGdzdC9wbGF5YmFjay9nc3RkZWNvZGViaW4uYzogKGdzdF9kZWNvZGVfYmluX2dldF90eXBlKSwKKwkoZ3N0X2RlY29kZV9iaW5fY2xhc3NfaW5pdCksIChnc3RfZGVjb2RlX2Jpbl9mYWN0b3J5X2ZpbHRlciksCisJKGNvbXBhcmVfcmFua3MpLCAoZ3N0X2RlY29kZV9iaW5faW5pdCksIChnc3RfZGVjb2RlX2Jpbl9kaXNwb3NlKSwKKwkoZmluZF9jb21wYXRpYmxlcyksIChjbG9zZV9wYWRfbGluayksICh0cnlfdG9fbGlua18xKSwgKG5ld19wYWQpLAorCShjbG9zZV9saW5rKSwgKHR5cGVfZm91bmQpLCAoZ3N0X2RlY29kZV9iaW5fc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X2RlY29kZV9iaW5fZ2V0X3Byb3BlcnR5KSwgKGdzdF9kZWNvZGVfYmluX2NoYW5nZV9zdGF0ZSksCisJKGdzdF9kZWNvZGVfYmluX2dldF9ldmVudF9tYXNrcyksIChnc3RfZGVjb2RlX2Jpbl9zZW5kX2V2ZW50KSwKKwkoZ3N0X2RlY29kZV9iaW5fZ2V0X2Zvcm1hdHMpLCAoZ3N0X2RlY29kZV9iaW5fY29udmVydCksCisJKGdzdF9kZWNvZGVfYmluX2dldF9xdWVyeV90eXBlcyksIChnc3RfZGVjb2RlX2Jpbl9xdWVyeSksCisJKHBsdWdpbl9pbml0KToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnc3RfcGxheV9iaW5fZ2V0X3R5cGUpLAorCShnc3RfcGxheV9iaW5fY2xhc3NfaW5pdCksIChnc3RfcGxheV9iaW5faW5pdCksCisJKGdzdF9wbGF5X2Jpbl9kaXNwb3NlKSwgKGdlbl9kZWZhdWx0X291dHB1dCksIChyZWJ1aWxkX3BpcGVsaW5lKSwKKwkoY29sbGVjdF9zaW5rX3BhZHMpLCAoZmluZF9jb21wYXRpYmxlcyksIChjbG9zZV9wYWRfbGluayksCisJKHRyeV90b19saW5rXzEpLCAobmV3X3BhZCksIChjbG9zZV9saW5rKSwgKHR5cGVfZm91bmQpLAorCShzZXR1cF9zb3VyY2UpLCAoZ3N0X3BsYXlfYmluX3NldF9wcm9wZXJ0eSksCisJKGdzdF9wbGF5X2Jpbl9nZXRfcHJvcGVydHkpLCAoZ3N0X3BsYXlfYmluX2ZhY3RvcnlfZmlsdGVyKSwKKwkoY29tcGFyZV9yYW5rcyksIChnc3RfcGxheV9iaW5fY29sbGVjdF9mYWN0b3JpZXMpLAorCShnc3RfcGxheV9iaW5fY2hhbmdlX3N0YXRlKSwgKGdzdF9wbGF5X2Jpbl9hZGRfZWxlbWVudCksCisJKGdzdF9wbGF5X2Jpbl9yZW1vdmVfZWxlbWVudCksIChnc3RfcGxheV9iaW5fZ2V0X2V2ZW50X21hc2tzKSwKKwkoZ3N0X3BsYXlfYmluX3NlbmRfZXZlbnQpLCAoZ3N0X3BsYXlfYmluX2dldF9mb3JtYXRzKSwKKwkoZ3N0X3BsYXlfYmluX2NvbnZlcnQpLCAoZ3N0X3BsYXlfYmluX2dldF9xdWVyeV90eXBlcyksCisJKGdzdF9wbGF5X2Jpbl9xdWVyeSksIChnc3RfcGxheV9iaW5fZ2V0X2Nsb2NrKSwgKHBsdWdpbl9pbml0KToKKwkqIGdzdC9wbGF5YmFjay90ZXN0LmM6IChtYWluKToKKwlBZGRlZCBzb21lIHBsYXliYWNrIGhlbHBlciBlbGVtZW50cyBhbmQgc29tZSB0ZXN0IGFwcHMsIHZlcnkgYWxwaGEKKwlzdGlsbC4KKworMjAwNC0wNy0wNCAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV94cnVuX3JlY292ZXJ5KToKKwkgIG9ubHkgcmVzdGFydCBhdWRpbyB3aGVuIHdlIGluZGVlZCBoYXZlIGFuIHhydW4gdG8gZml4IHJlcGVhdGVkCisJICB4cnVucy4gRml4IHN1Z2dlc3RlZCBieSBHaXVsaWFubyBQb2NoaW5pLgorCisyMDA0LTA3LTAzICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FwbHVnaW4uYzogKGdzdF9hbHNhX2Vycm9yX3dyYXBwZXIpOiBEaXNhYmxlCisJY2FsbCB0byBnc3RfZGVidWdfbG9nKCkgaWYgZGVidWdnaW5nIGlzIGRpc2FibGVkIChidWcgIzE0NTExOCkKKworMjAwNC0wNy0wMyAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV94cnVuX3JlY292ZXJ5KToKKwkgIHVzZSBvdXIgb3duIGZ1bmN0aW9ucyBmb3IgcmVzdGFydGluZyB0aGUgYWxzYSBkZXZpY2UuCisJKiBleHQvYWxzYS9nc3RhbHNhc2luay5jOiAoZ3N0X2Fsc2Ffc2lua19jaGVja19ldmVudCk6CisJICBJIHNob3VsZCBhcHBseSBwYXRjaGVzIG15c2VsZiAtIHVzZSBNSU4gZm9yIHRoZSB0aGlyZCBhcmd1bWVudCwgbm90CisJICB0aGUgc2Vjb25kLCB0aGlzIGZpeGVzIHNlZWtpbmcKKworMjAwNC0wNy0wMiAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY2RlY19jbGFzc19pbml0KSwKKwkoZ3N0X2ZsYWNkZWNfd3JpdGUpOiAgQWN0dWFsbHksIEdTVF9QQURfQ0FQUygpIGhhcyBub3RoaW5nIHRvCisJZG8gd2l0aCB0aGUgbG9naWMuCisKKzIwMDQtMDctMDIgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNkZWNfd3JpdGUpOiAgU2V0IGR1cmF0aW9uIG9uCisJb3V0cHV0IGJ1ZmZlcnMuICBGaXggbG9naWMgbWlzdGFrZS4gIChidWcgIzE0NDg2NikKKworMjAwNC0wNy0wMiAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QtbGlicy9nc3QveG92ZXJsYXkvTWFrZWZpbGUuYW06IHhvdmVybGF5IG5vIGxvbmdlciBkZXBlbmRzCisJb24gWC4gIChidWcgIzE0NDc1MykKKworMjAwNC0wNy0wMiAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiAoZ3N0X3dhdmVuY19zZXR1cCksCisJKGdzdF93YXZlbmNfc3RvcF9maWxlKTogU3dpdGNoIHRvIEdTVF9XUklURV9VSU5UMzJfTEUgbWFjcm9zCisJKGJ1ZyAjMTQ0NjI0KQorCSogc3lzL29zcy9nc3Rvc3NlbGVtZW50LmM6IChnc3Rfb3NzZWxlbWVudF9wcm9iZV9jYXBzKSwKKwkoZ3N0X29zc2VsZW1lbnRfcmF0ZV9wcm9iZV9jaGVjayk6IEFkZCBhbm90aGVyIHdvcmthcm91bmQgZm9yCisJYnVnZ3kgZHJpdmVycyAoYnVnICMxNDUzMzYpCisKKzIwMDQtMDctMDIgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5jOiAoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRfd3JpdGUpOgorCU1vc3Qgc3lzdGVtcyBkb24ndCBoYXZlIE1TR19OT1NJR05BTC4KKworMjAwNC0wNy0wMiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvY29sb3JiYWxhbmNlL01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvdHVuZXIvTWFrZWZpbGUuYW06CisJICAoaG9wZWZ1bGx5KSBmaXggYm90aCBpbnN0YWxsIGFuZCBkaXN0IGFuZCBtYWtlIGVycm9yIG1lc3NhZ2UgdXNlZnVsLgorCSAgbmVlZHMgdGVzdGluZyBhY3Jvc3MgYXV0b21ha2VzLgorCisyMDA0LTA3LTAyICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnLmM6IChwbHVnaW5faW5pdCk6CisJICB3ZSByZXF1aXJlIGJ5dGVzdHJlYW0gbm93CisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6CisJICBodWdlIGRpZmYgdG8gaW1wbGVtZW50IGNoYWluIHNldHVwIGluIGEgZmFzdCBhbmQgZ2VuZXJpYyB3YXkuIFRoaXMKKwkgIGltcHJvdmVzIHRhZyByZWFkaW5nIGFuZCBzdGFydHVwIG9mIGh1Z2UgZmlsZXMgKHJlYWQ6IFRoZW9yYSB2aWRlb3MpCisJICBxdWl0ZSBhIGJpdC4gSXQgcHJvYmFibHkgY29udGFpbnMgYnVncywgdG9vLCBzbyBwbGVhc2UgdGVzdC4KKwkgIFNlZWtpbmcgaXMgbm90IGltcHJvdmVkIHRvIHRoZSBmYXN0IG1ldGhvZC4KKworMjAwNC0wNi0yOSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfcGFkX3B1c2gpOgorCSogZXh0L29nZy9nc3RvZ2dtdXguYzoKKwlGaXggbWVtbGVhayBpbiBvZ2dkZW11eCB3aGVuIHJ1bm5pbmcgdW5jb25uZWN0ZWQgcGFkcy4KKwlkb2MgdXBkYXRlIGluIG11eCwgc3RhcnQgd29ya2luZyBvbiBrZXlmcmFtZSBtb2RlLgorCisyMDA0LTA2LTI5ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkgIGFkdmVydGlzZSBjb3JyZWN0IHRlbXBsYXRlIGNhcHMgLSB3ZSBpbmRlZWQgZG8gbm9uLW5hdGl2ZSBlbmRpYW5uZXNzCisJICBhbmQgOGJpdCBhdWRpbyBoYXMgbm8gZW5kaWFubmVzcworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19nZXRjYXBzKToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfZ2V0Y2Fwcyk6CisJICBhdm9pZCAod3JvbmcpIGR1cGxpY2F0aW9ucyBpbiBnZXRjYXBzIGZ1bmN0aW9uIGFuZCByZXR1cm4KKwkgIHRlbXBsYXRlIGNhcHMKKworMjAwNC0wNi0yOSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuYzogKGdzdF9yZWNvdmVyX3BvbGljeV9nZXRfdHlwZSksCisJKGdzdF9tdWx0aWZkc2lua19jbGFzc19pbml0KSwgKGdzdF9tdWx0aWZkc2lua19hZGQpLAorCShnc3RfbXVsdGlmZHNpbmtfcmVtb3ZlKSwgKGdzdF9tdWx0aWZkc2lua19jbGVhciksCisJKGdzdF9tdWx0aWZkc2lua19jbGllbnRfcmVtb3ZlKSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRfcmVhZCksCisJKGdzdF9tdWx0aWZkc2lua19jbGllbnRfcXVldWVfZGF0YSksCisJKGdzdF9tdWx0aWZkc2lua19jbGllbnRfcXVldWVfY2FwcyksCisJKGdzdF9tdWx0aWZkc2lua19jbGllbnRfcXVldWVfYnVmZmVyKSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRfd3JpdGUpLAorCShnc3RfbXVsdGlmZHNpbmtfcmVjb3Zlcl9jbGllbnQpLCAoZ3N0X211bHRpZmRzaW5rX3F1ZXVlX2J1ZmZlciksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50cyksIChnc3RfbXVsdGlmZHNpbmtfdGhyZWFkKSwKKwkoZ3N0X211bHRpZmRzaW5rX2luaXRfc2VuZCksIChnc3RfbXVsdGlmZHNpbmtfY2xvc2UpOgorCUZpeCB3cm9uZyBHTGlzdCBpdGVyYXRpb24gdGhhdCBjb3VsZCBjcmFzaCB0aGUgc2VydmVyIHdoZW4KKwltb3JlIHRoZW4gMiBjbGllbnRzIGRpc2Nvbm5lY3QgYXQgdGhlIHNhbWUgdGltZS4gUmVhZCBhbGwgdGhlCisJcGVuZGluZyBjb21tYW5kcyBpbiBvbmUgYmF0Y2ggdG8gcmVjb3ZlciBmcm9tIGNvbW1hbmQgc3Rvcm1zIHVuZGVyCisJdmVyeSBoZWF2eSBsb2FkLgorCisyMDA0LTA2LTI4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiAoZ3N0X3ZpZGVvbWl4ZXJfcGFkX2dldF90eXBlKSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfcGFkX2NsYXNzX2luaXQpLCAoZ3N0X3ZpZGVvbWl4ZXJfcGFkX2dldF9wcm9wZXJ0eSksCisJKGdzdF92aWRlb21peGVyX3BhZF9zZXRfcHJvcGVydHkpLAorCShnc3RfdmlkZW9taXhlcl9wYWRfc2lua2Nvbm5lY3QpLCAoZ3N0X3ZpZGVvbWl4ZXJfcGFkX2luaXQpLAorCShnc3RfdmlkZW9fbWl4ZXJfYmFja2dyb3VuZF9nZXRfdHlwZSksIChnc3RfdmlkZW9taXhlcl9nZXRfdHlwZSksCisJKGdzdF92aWRlb21peGVyX2NsYXNzX2luaXQpLCAoZ3N0X3ZpZGVvbWl4ZXJfaW5pdCksCisJKGdzdF92aWRlb21peGVyX3JlcXVlc3RfbmV3X3BhZCksIChnc3RfdmlkZW9taXhlcl9ibGVuZF9heXV2X2k0MjApLAorCShwYWRfem9yZGVyX2NvbXBhcmUpLCAoZ3N0X3ZpZGVvbWl4ZXJfc29ydF9wYWRzKSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfZmlsbF9jaGVja2VyKSwgKGdzdF92aWRlb21peGVyX2ZpbGxfY29sb3IpLAorCShnc3RfdmlkZW9taXhlcl9maWxsX3F1ZXVlcyksIChnc3RfdmlkZW9taXhlcl9ibGVuZF9idWZmZXJzKSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfdXBkYXRlX3F1ZXVlcyksIChnc3RfdmlkZW9taXhlcl9sb29wKSwKKwkocGx1Z2luX2luaXQpOgorCUF2b2lkIGRpdmlkZSBieSB6ZXJvLCBjaG9vc2UgbWFzdGVycGFkIGFzIHRoZSBwYWQgd2l0aCB0aGUgaGlnaGVzdAorCWZyYW1lcmF0ZS4KKworMjAwNC0wNi0yNyAgSnVsaWVuIE1vdXR0ZSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3h3aW5kb3dfZGVjb3JhdGUpLAorCShnc3RfeGltYWdlc2lua194d2luZG93X25ldyk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3h3aW5kb3dfZGVjb3JhdGUpLAorCShnc3RfeHZpbWFnZXNpbmtfeHdpbmRvd19uZXcpOiBJIHByZWZlciBsb2NraW5nIHRoZSBtdXRleCBpbiB0aGUKKwlmdW5jdGlvbiBkaXJlY3RseS4gV2UgbWlnaHQgd2FudCB0byBjYWxsIGl0IGZyb20gc29tZXdoZXJlIGVsc2Ugb25lIGRheS4KKworMjAwNC0wNi0yNyAgSnVsaWVuIE1vdXR0ZSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3h3aW5kb3dfZGVjb3JhdGUpLAorCShnc3RfeGltYWdlc2lua194d2luZG93X25ldyk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3h3aW5kb3dfZGVjb3JhdGUpLAorCShnc3RfeHZpbWFnZXNpbmtfeHdpbmRvd19uZXcpOiBUcnlpbmcgdG8gZml4IHRoZSByYW5kb20gYmVoYXZpb3VyIG9mCisJd2luZG93IGRlY29yYXRpb25zLgorCisyMDA0LTA2LTI3ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6IChnc3RfZHZkZWNfY2xhc3NfaW5pdCksIChnc3RfZHZkZWNfaW5pdCksCisJKGdzdF9kdmRlY192aWRlb19nZXRjYXBzKSwgKGdzdF9kdmRlY192aWRlb19saW5rKSwKKwkoZ3N0X2R2ZGVjX3B1c2gpLCAoZ3N0X2R2ZGVjX2xvb3ApLCAoZ3N0X2R2ZGVjX2NoYW5nZV9zdGF0ZSksCisJKGdzdF9kdmRlY19zZXRfcHJvcGVydHkpLCAoZ3N0X2R2ZGVjX2dldF9wcm9wZXJ0eSk6CisJKiBleHQvZHYvZ3N0ZHZkZWMuaDoKKwlJbXBsZW1lbnQgZHJvcF9mYWN0b3IgcHJvcGVydHkgdG8gbG93ZXIgdGhlIGZyYW1lcmF0ZSB3aXRoCisJYSBmYWN0b3IuCisKKzIwMDQtMDYtMjcgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC1saWJzL2dzdC9jb2xvcmJhbGFuY2UvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvcGxheS9NYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2dzdC90dW5lci9NYWtlZmlsZS5hbToKKwkgIHVuYnJlYWsgQ29tcGFueSdzIGZpeCB0aGF0IGRpZG4ndCBpbnN0YWxsIHRoZSAtZW51bS5oIGZpbGVzCisKKzIwMDQtMDYtMjcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19wdXNoKSwgKGdzdF9kdmRlY19sb29wKSwKKwkoZ3N0X2R2ZGVjX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvZHYvZ3N0ZHZkZWMuaDoKKwlGaXggdGltZXN0YW1wLCBkdXJhdGlvbiBhbmQgb2Zmc2V0IG9mIHRoZSBidWZmZXJzLgorCisyMDA0LTA2LTI3ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5jOiAoZ3N0X3JlY292ZXJfcG9saWN5X2dldF90eXBlKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsYXNzX2luaXQpLCAoZ3N0X211bHRpZmRzaW5rX2FkZCksCisJKGdzdF9tdWx0aWZkc2lua19yZW1vdmUpLCAoZ3N0X211bHRpZmRzaW5rX2NsZWFyKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9yZW1vdmUpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudF9yZWFkKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9xdWV1ZV9kYXRhKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9xdWV1ZV9jYXBzKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9xdWV1ZV9idWZmZXIpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudF93cml0ZSksCisJKGdzdF9tdWx0aWZkc2lua19yZWNvdmVyX2NsaWVudCksIChnc3RfbXVsdGlmZHNpbmtfcXVldWVfYnVmZmVyKSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRzKSwgKGdzdF9tdWx0aWZkc2lua190aHJlYWQpLAorCShnc3RfbXVsdGlmZHNpbmtfaW5pdF9zZW5kKSwgKGdzdF9tdWx0aWZkc2lua19jbG9zZSk6CisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmg6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNpbmsuYzoKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfaGFuZGxlX3NlcnZlcl9yZWFkKSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfaGFuZGxlX3NlbGVjdCksIChnc3RfdGNwc2VydmVyc2lua19jbG9zZSk6CisJTW9yZSBtdWx0aWZkc2luayBmaXhlcywgbW9yZSByZWNvdmVyeSBwb2xpY3kgZml4ZXMuCisJUmVtb3ZlZCBzdHVwaWQgZ19wcmludAorCisyMDA0LTA2LTI2ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3RjcC9NYWtlZmlsZS5hbToKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuYzogKGdzdF9yZWNvdmVyX3BvbGljeV9nZXRfdHlwZSksCisJKGdzdF9tdWx0aWZkc2lua19nZXRfdHlwZSksIChnc3RfbXVsdGlmZHNpbmtfYmFzZV9pbml0KSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsYXNzX2luaXQpLCAoZ3N0X211bHRpZmRzaW5rX2luaXQpLAorCShnc3RfbXVsdGlmZHNpbmtfZGVidWdfZmRzZXQpLCAoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9yZW1vdmUpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudF9yZWFkKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9xdWV1ZV9kYXRhKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9xdWV1ZV9jYXBzKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9xdWV1ZV9idWZmZXIpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudF93cml0ZSksCisJKGdzdF9tdWx0aWZkc2lua19yZWNvdmVyX2NsaWVudCksIChnc3RfbXVsdGlmZHNpbmtfcXVldWVfYnVmZmVyKSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRzKSwgKGdzdF9tdWx0aWZkc2lua190aHJlYWQpLAorCShnc3RfbXVsdGlmZHNpbmtfY2hhaW4pLCAoZ3N0X211bHRpZmRzaW5rX3NldF9wcm9wZXJ0eSksCisJKGdzdF9tdWx0aWZkc2lua19nZXRfcHJvcGVydHkpLCAoZ3N0X211bHRpZmRzaW5rX2luaXRfc2VuZCksCisJKGdzdF9tdWx0aWZkc2lua19jbG9zZSksIChnc3RfbXVsdGlmZHNpbmtfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuaDoKKwkqIGdzdC90Y3AvZ3N0dGNwcGx1Z2luLmM6IChwbHVnaW5faW5pdCk6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNpbmsuYzogKGdzdF90Y3BzZXJ2ZXJzaW5rX2dldF90eXBlKSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfY2xhc3NfaW5pdCksIChnc3RfdGNwc2VydmVyc2lua19pbml0KSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfaGFuZGxlX3NlcnZlcl9yZWFkKSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfaGFuZGxlX3NlbGVjdCksCisJKGdzdF90Y3BzZXJ2ZXJzaW5rX3NldF9wcm9wZXJ0eSksIChnc3RfdGNwc2VydmVyc2lua19nZXRfcHJvcGVydHkpLAorCShnc3RfdGNwc2VydmVyc2lua19pbml0X3NlbmQpLCAoZ3N0X3RjcHNlcnZlcnNpbmtfY2xvc2UpOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzaW5rLmg6CisJQWRkZWQgbXVsdGlmZHNpbmssIG1hZGUgdGNwc2VydmVyc2luayBhIHN1YmNsYXNzIG9mIGZkc2luaywgcmVtb3ZlZAorCW9uZSBvZiB0aGUgbG9ja3MsIGFkZGVkIHJlY292ZXJ5IHBvbGljeSB0byBtdWx0aWZkc2luay4KKworMjAwNC0wNi0yNiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L3ZpZGVvcmF0ZS9nc3R2aWRlb3JhdGUuYzogKGdzdF92aWRlb3JhdGVfY2hhaW4pOgorCSAgZml4IGRlY2lzaW9uIGZvciB3aGVuIGdldHRpbmcgZnJhbWVzIHdpdGggc2FtZSB0aW1lc3RhbXAKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6IChnc3RfdjRsc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3Y0bHNyY19pbml0KSwKKwkoZ3N0X3Y0bHNyY19nZXQpLCAoZ3N0X3Y0bHNyY19zZXRfcHJvcGVydHkpLAorCShnc3RfdjRsc3JjX2dldF9wcm9wZXJ0eSk6CisJKiBzeXMvdjRsL2dzdHY0bHNyYy5oOgorCSAgYWRkIGxhdGVuY3kgb2Zmc2V0IHByb3BlcnR5CisKKzIwMDQtMDYtMjYgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC92aWRlb3JhdGUvZ3N0dmlkZW9yYXRlLmM6IChnc3RfdmlkZW9yYXRlX2NoYWluKSwKKwkocGx1Z2luX2luaXQpOgorCSAgZml4IGRlYnVnZ2luZy4gYWRkIGNhdGVnb3J5LgorCisyMDA0LTA2LTI1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3Qvc2luZS9nc3RzaW5lc3JjLmM6IChnc3Rfc2luZXNyY19nZXQpOgorICAgICAgICAgIGZpeCB3cm9uZyBvZmZzZXRzCisKKzIwMDQtMDYtMjUgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FzcmMuYzogKGdzdF9hbHNhX3NyY19pbml0KSwKKwkoZ3N0X2Fsc2Ffc3JjX2dldF90aW1lKSwgKGdzdF9hbHNhX3NyY19sb29wKSwKKwkoZ3N0X2Fsc2Ffc3JjX2NoYW5nZV9zdGF0ZSk6CisJICByZXR1cm4gYSB0aW1lIHRoYXQgaXMgaW4gc3luYyB3aXRoIHRoZSBlbGVtZW50J3MgcHJvY2Vzc2luZworCisyMDA0LTA2LTI1ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzaW5rLmM6IChnc3RfdGNwc2VydmVyc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfaW5pdCksIChnc3RfdGNwc2VydmVyc2lua19oYW5kbGVfc2VydmVyX3JlYWQpLAorCShnc3RfdGNwc2VydmVyc2lua19jbGllbnRfcmVtb3ZlKSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfaGFuZGxlX2NsaWVudF9yZWFkKSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfY2xpZW50X3F1ZXVlX2RhdGEpLAorCShnc3RfdGNwc2VydmVyc2lua19jbGllbnRfcXVldWVfY2FwcyksCisJKGdzdF90Y3BzZXJ2ZXJzaW5rX2NsaWVudF9xdWV1ZV9idWZmZXIpLAorCShnc3RfdGNwc2VydmVyc2lua19oYW5kbGVfY2xpZW50X3dyaXRlKSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfcXVldWVfYnVmZmVyKSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfaGFuZGxlX2NsaWVudHMpLCAoZ3N0X3RjcHNlcnZlcnNpbmtfdGhyZWFkKSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfY2hhaW4pLCAoZ3N0X3RjcHNlcnZlcnNpbmtfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfZ2V0X3Byb3BlcnR5KSwgKGdzdF90Y3BzZXJ2ZXJzaW5rX2luaXRfc2VuZCksCisJKGdzdF90Y3BzZXJ2ZXJzaW5rX2Nsb3NlKToKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc2luay5oOgorCVNlcnZlcnNpbmsgcmV3cml0ZS4gUmVhbGx5IGRvIG5vbiBibG9ja2luZyB3cml0ZXMgdG8gY2xpZW50cyBhbmQKKwltYWludGFpbiBhbiBpbnRlcm5hbCBxdWV1ZSB0byBoYW5kbGUgc2xvd2VyIGNsaWVudHMgd2hpbGUgbm90CisJZGlzdHVyYmluZyBmYXN0IGNsaWVudHMuCisKKzIwMDQtMDYtMjUgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c3JjLmM6IChnc3RfdGNwY2xpZW50c3JjX2dldCk6CisJICBiZXR0ZXIgZGVidWcsIGRvbid0IG92ZXJyaWRlIE9GRlNFVCBhbmQgT0ZGU0VUX0VORAorCisyMDA0LTA2LTI1ICBJYWluIDxpYWluQHByZXR0eXBlb3BsZS5vcmc+CisKKwkqIGdzdC1saWJzL2dzdC9tZWRpYS1pbmZvL21lZGlhLWluZm8tcHJpdi5jIChnbWlfc2V0X21pbWUpOiBBZGQKKwluYW1lPXNvdXJjZSBmb3IgdGhlIHdhdnBhcnNlIHBpcGVsaW5lLgorCisyMDA0LTA2LTI0ICBKb2hhbiBEYWhsaW4gIDxqb2hhbkBnbm9tZS5vcmc+CisKKwkqIGV4dC90aGVvcmEvdGhlb3JhZW5jLmMgKHRoZW9yYV9lbmNfY2hhaW4pOiBDYWxsCisJZ3N0X3BhZF90cnlfc2V0X2NhcHMgaW5zdGVhZCBvZiBnc3RfcGFkX3NldF9leHBsaWNpdF9jYXBzIHNvIHRoZQorCXN0cmVhbWhlYWRlciBjYXBzIGFyZSBzZXQgY29ycmVjdGx5LgorCisyMDA0LTA2LTI0ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvdm9yYmlzL3ZvcmJpc2VuYy5jOiAocmF3X2NhcHNfZmFjdG9yeSksCisJKGdzdF92b3JiaXNlbmNfc2V0dXApLCAoZ3N0X3ZvcmJpc2VuY19zZXRfcHJvcGVydHkpOgorCSAgcmVzcGVjdCBtaW5pbXVtIGJpdHJhdGU7IHNhbWUgY291bGQgYmUgZG9uZSBmb3IgbWF4IGJpdHJhdGUKKworMjAwNC0wNi0yNCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L3ZvcmJpcy92b3JiaXNlbmMuYzogKHJhd19jYXBzX2ZhY3RvcnkpLAorCShnc3Rfdm9yYmlzZW5jX3NldHVwKToKKwkgIGZpeCBzYW1wbGUgcmF0ZSByYW5nZQorCisyMDA0LTA2LTI0ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvdm9yYmlzL29nZ3ZvcmJpc2VuYy5jOiAoZ3N0X29nZ3ZvcmJpc2VuY19jbGFzc19pbml0KSwKKwkoZ3N0X29nZ3ZvcmJpc2VuY19zZXR1cCk6CisJKiBleHQvdm9yYmlzL3ZvcmJpc2VuYy5jOiAoZ3N0X3ZvcmJpc2VuY19jbGFzc19pbml0KSwKKwkoZ3N0X3ZvcmJpc2VuY19zZXR1cCk6CisJICByZXNvbHZlIGFtYmlndWl0aWVzIGluIGNvZGUgYW5kIGRlc2NyaXB0aW9uCisKKzIwMDQtMDYtMjQgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9zdGFydCksIChnc3RfYWxzYV94cnVuX3JlY292ZXJ5KToKKwkqIGV4dC9hbHNhL2dzdGFsc2EuaDoKKwkqIGV4dC9hbHNhL2dzdGFsc2FzcmMuYzogKGdzdF9hbHNhX3NyY19pbml0KSwKKwkoZ3N0X2Fsc2Ffc3JjX3VwZGF0ZV9hdmFpbCksIChnc3RfYWxzYV9zcmNfbG9vcCk6CisJVXNlIGFsc2EgdHJpZ2dlcl90c3RhbXAgdG8gZ2V0IHRoZSB0aW1lc3RhbXAgb2YgdGhlIGZpcnN0CisJc2FtcGxlIGluIHRoZSBidWZmZXIgZm9yIG1vcmUgcHJlY2lzZSBzeW5jLiBTb21lIGNsZWFudXBzLgorCisyMDA0LTA2LTI0ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L2F1ZGlvcmF0ZS9nc3RhdWRpb3JhdGUuYzogKGdzdF9hdWRpb3JhdGVfbGluayksCisJKGdzdF9hdWRpb3JhdGVfaW5pdCksIChnc3RfYXVkaW9yYXRlX2NoYWluKSwKKwkoZ3N0X2F1ZGlvcmF0ZV9zZXRfcHJvcGVydHkpLCAoZ3N0X2F1ZGlvcmF0ZV9nZXRfcHJvcGVydHkpOgorCSogZ3N0L3ZpZGVvcmF0ZS9nc3R2aWRlb3JhdGUuYzogKGdzdF92aWRlb3JhdGVfY2xhc3NfaW5pdCksCisJKGdzdF92aWRlb3JhdGVfY2hhaW4pOgorCUFkZGVkIHNvbWUgbG9nZ2luZywgZml4ZWQgYW4gb3ZlcmZsb3cgYnVnIGluIHZpZGVvcmF0ZS4KKworMjAwNC0wNi0yNCAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQva2lvL01ha2VmaWxlLmFtOgorCSAgZml4IGZvciBidWlsZGRpciAhPSBzcmNkaXIgYW5kIGRpc3RjaGVjaworCisyMDA0LTA2LTI0ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC1saWJzL2dzdC9jb2xvcmJhbGFuY2UvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvcGxheS9NYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2dzdC90dW5lci9NYWtlZmlsZS5hbToKKwkqIGdzdC90Y3AvTWFrZWZpbGUuYW06CisJKiBzeXMvZHhyMy9NYWtlZmlsZS5hbToKKwkgIGRvbid0IGluY2x1ZGUgLWVudW10eXBlcy5bY2hdIG9yIC1tYXJzaGFsLltjaF0gZmlsZXMgaW4gdGhlIGRpc3RlZAorCSAgdGFyYmFsbC4KKwkgIEFsc28gYWRkIGFsbCAqLmxpc3QgZmlsZXMgdGhhdCB3ZXJlIG1pc3NpbmcuCisJKiBNYWtlZmlsZS5hbToKKwkgIGFkZCBhIGRpc3RjaGVjayBob29rIHRvIGVuc3VyZSB0aGUgYWJvdmUgZG9lc24ndCBoYXBwZW4gYWdhaW4uCisKKzIwMDQtMDYtMjMgIERhdmlkIEkuIExlaG4gIDxkbGVobkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGV4dC9NYWtlZmlsZS5hbTogcy9EVFNfRElSPWR2ZHJlYWQvRFRTX0RJUj1kdHMvCisKKzIwMDQtMDYtMjMgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHJlZGhhdC5jb20+CisKKwkqIG00L01ha2VmaWxlLmFtOiBEaXN0cmlidXRlIGdzdC1maW9ucmVhZC5tNC4KKworMjAwNC0wNi0yMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOiBiYWNrIHRvIGRldgorCisyMDA0LTA2LTIzICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfY2hhbmdlX3N0YXRlKSwgKGdzdF9hbHNhX3N0YXJ0KSwKKwkoZ3N0X2Fsc2FfeHJ1bl9yZWNvdmVyeSk6CisJKiBleHQvYWxzYS9nc3RhbHNhLmg6CisJKiBleHQvYWxzYS9nc3RhbHNhc2luay5jOiAoZ3N0X2Fsc2Ffc2lua19jaGVja19ldmVudCksCisJKGdzdF9hbHNhX3NpbmtfbG9vcCksIChnc3RfYWxzYV9zaW5rX2dldF90aW1lKToKKwkqIGV4dC9hbHNhL2dzdGFsc2FzcmMuYzogKGdzdF9hbHNhX3NyY19pbml0KSwKKwkoZ3N0X2Fsc2Ffc3JjX2dldF90aW1lKSwgKGdzdF9hbHNhX3NyY191cGRhdGVfYXZhaWwpLAorCShnc3RfYWxzYV9zcmNfbG9vcCk6CisJQWRkIGNsb2NrIHRvIGFsc2FzcmMuIFRha2UgbmV3IGNhcHR1cmUgdGltZXN0YW1wIHdoZW4KKwlyZXN0YXJ0aW5nIGFmdGVyIGFuIG92ZXJydW4uIFNwbGl0IHVwIHNvbWUgZnVuY3Rpb25zIGJldHdlZW4KKwlhbHNhc3JjIGFuZCBhbHNhc2luay4KKworPT09IHJlbGVhc2UgMC44LjIgPT09CisKKzIwMDQtMDYtMjMgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX2luaXQpLCAoZ3N0X2Fsc2FfZGlzcG9zZSksCisJKGdzdF9hbHNhX2NoYW5nZV9zdGF0ZSksIChnc3RfYWxzYV91cGRhdGVfYXZhaWwpLAorCShnc3RfYWxzYV94cnVuX3JlY292ZXJ5KToKKwkqIGV4dC9hbHNhL2dzdGFsc2EuaDoKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2NoZWNrX2V2ZW50KToKKwkgIG1lcmdlIGJhY2sgY2hhbmdlcyBmcm9tIHJlbGVhc2UKKworMjAwNC0wNi0yMyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9hdWRpb3JhdGUvZ3N0YXVkaW9yYXRlLmM6IChnc3RfYXVkaW9yYXRlX2NsYXNzX2luaXQpLAorCShnc3RfYXVkaW9yYXRlX2luaXQpLCAoZ3N0X2F1ZGlvcmF0ZV9jaGFpbiksCisJKGdzdF9hdWRpb3JhdGVfc2V0X3Byb3BlcnR5KSwgKGdzdF9hdWRpb3JhdGVfZ2V0X3Byb3BlcnR5KToKKwlJbXBsZW1lbnQgc2FtcGxlIGRyb3BwaW5nIGFuZCBub3RpZnkKKworMjAwNC0wNi0yMiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC90aGVvcmEvdGhlb3JhZW5jLmM6IChnc3RfdGhlb3JhX2VuY19jbGFzc19pbml0KSwKKwkodGhlb3JhX2VuY19zaW5rX2xpbmspLCAodGhlb3JhX2J1ZmZlcl9mcm9tX3BhY2tldCksCisJKHRoZW9yYV9wdXNoX3BhY2tldCksICh0aGVvcmFfZW5jX2NoYWluKToKKwlTb21lIGNsZWFudXBzLCBtYWtlIHN1cmUgdGhlIHRpbWVzdGFtcHMgYXJlIGNvcnJlY3QuCisKKzIwMDQtMDYtMjIgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9nZXRfdGltZSksIChnc3RfYWxzYV9jbG9ja191cGRhdGUpLAorCShnc3RfYWxzYV9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X2Fsc2FfdXBkYXRlX2F2YWlsKSwKKwkoZ3N0X2Fsc2FfeHJ1bl9yZWNvdmVyeSk6CisJKiBleHQvYWxzYS9nc3RhbHNhLmg6CisJKiBleHQvYWxzYS9nc3RhbHNhc3JjLmM6IChnc3RfYWxzYV9zcmNfbG9vcCk6CisJQ2xlYW51cHMsIHRha2UgcXVldWVkIHNhbXBsZXMgaW50byBhY2NvdW50IHdoZW4gcmVwb3J0aW5nCisJdGhlIHRpbWUuCisKKzIwMDQtMDYtMjIgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdmlkZW9yYXRlL2dzdHZpZGVvcmF0ZS5jOiAoZ3N0X3ZpZGVvcmF0ZV9jbGFzc19pbml0KSwKKwkoZ3N0X3ZpZGVvcmF0ZV9pbml0KToKKwlJbml0aWFsaXplIHRoZSBwcm9wZXJ0eSBhcyB3ZWxsLgorCisyMDA0LTA2LTIyICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3ZpZGVvcmF0ZS9nc3R2aWRlb3JhdGUuYzogKGdzdF92aWRlb3JhdGVfY2xhc3NfaW5pdCksCisJKGdzdF92aWRlb3JhdGVfaW5pdCksIChnc3RfdmlkZW9yYXRlX2NoYWluKSwKKwkoZ3N0X3ZpZGVvcmF0ZV9zZXRfcHJvcGVydHkpLCAoZ3N0X3ZpZGVvcmF0ZV9nZXRfcHJvcGVydHkpOgorCUFkZCBwcm9wZXJ0eSB0byBtYWtlIHZpZGVvcmF0ZSBzaWxlbnQuCisJQWRkIHByb3BlcnR5IHRvIHByZWZlciBuZXcgZnJhbWVzIG92ZXIgb2xkIG9uZXMuCisKKzIwMDQtMDYtMjIgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogc3lzL29zeHZpZGVvL01ha2VmaWxlLmFtOgorICAgICAgICBXb3JrYXJvdW5kIHNvIHRoYXQgdGhlIG9zeHZpZGVvIC5zbyBmaWxlIGdldHMgbGlua2VkIHdpdGggdGhlCisgICAgICAgIENvY29hLCBPcGVuR0wgYW5kIFF1aWNrVGltZSBmcmFtZXdvcmtzCisKKzIwMDQtMDYtMjIgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogc3lzL29zeGF1ZGlvL01ha2VmaWxlLmFtOgorICAgICAgICBXb3JrYXJvdW5kIHNvIHRoYXQgdGhlIG9zeGF1ZGlvIC5zbyBmaWxlIGdldHMgbGlua2VkIHdpdGggdGhlCisgICAgICAgIENvcmVBdWRpbyBmcmFtZXdvcmsKKworMjAwNC0wNi0yMiAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJV2hvb3BzLCBteSBmYXVsdC4uLmZpeGVkIGJ1aWxkIGlzc3VlcworCisyMDA0LTA2LTIyICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKyAgICAgICAgQWRkIG9iamVjdGl2ZS1jIHN1cHBvcnQgaWYgcnVubmluZyBpbiBEYXJ3aW4vTWFjIE9TIFgKKwkqIHN5cy9NYWtlZmlsZS5hbToKKyAgICAgICAgKiBzeXMvb3N4dmlkZW86CisgICAgICAgICogc3lzL29zeHZpZGVvL01ha2VmaWxlLmFtOgorICAgICAgICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKyAgICAgICAgKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisgICAgICAgICogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lmg6CisgICAgICAgICogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisgICAgICAgIEFkZCBvc3h2aWRlb3NpbmssIGEgY29jb2EtYmFzZWQgb3N4IHZpZGVvIHNpbmsKKworCisyMDA0LTA2LTE5ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisJKiBleHQvZHZkbmF2L2dzdC1kdmQ6CisJR3JhYiB0aGUgZ2NvbmYga2V5IGZyb20gdGhlIHJpZ2h0IHNwb3QKKwkqIGdzdC9kZWJ1Zy9nc3RuYXZzZWVrLmM6IChnc3RfbmF2c2Vla19pbml0KSwKKwkoZ3N0X25hdnNlZWtfc2Vnc2VlayksIChnc3RfbmF2c2Vla19oYW5kbGVfc3JjX2V2ZW50KSwKKwkoZ3N0X25hdnNlZWtfY2hhaW4pOgorCSogZ3N0L2RlYnVnL2dzdG5hdnNlZWsuaDoKKwkgIEFkZCAncycsICdlJyBhbmQgJ2wnIGtleXByZXNzZXMgdG8gbmF2c2VlayB0byBkZWZpbmUgdGhlIHN0YXJ0LGVuZAorCSAgYW5kIGxvb3AgcGFyYW1ldGVycyBvZiBhIHNlZ21lbnQgc2Vlay4KKwkqIGdzdC92aWRlb3Rlc3RzcmMvZ3N0dmlkZW90ZXN0c3JjLmM6IChnc3RfdmlkZW90ZXN0c3JjX2luaXQpLAorCShnc3RfdmlkZW90ZXN0c3JjX2dldF9ldmVudF9tYXNrcyksCisJKGdzdF92aWRlb3Rlc3RzcmNfaGFuZGxlX3NyY19ldmVudCksIChnc3RfdmlkZW90ZXN0c3JjX2dldCk6CisJKiBnc3QvdmlkZW90ZXN0c3JjL2dzdHZpZGVvdGVzdHNyYy5oOgorCSAgQWRkIHNlZWtpbmcgc3VwcG9ydCB0byB2aWRlb3Rlc3RzcmMKKwkgIEluaXRpYWxpc2UgdGhlIHRpbWVzdGFtcF9vZmZzZXQgdmFyaWFibGUuCisKKzIwMDQtMDYtMTggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvc2lkcGxheS9nc3RzaWRkZWMuY2M6CisJRml4IG5lZ290aWF0aW9uIGFuZCBzZXQgY29ycmVjdCBlbmQgb2Zmc2V0LgorCisyMDA0LTA2LTE4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6IGJyYW5jaCBhbmQgcHJlcmVsZWFzZQorCisyMDA0LTA2LTE3ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvdGNwL2dzdHRjcGNsaWVudHNyYy5jOiAoZ3N0X3RjcGNsaWVudHNyY19pbml0KSwKKwkoZ3N0X3RjcGNsaWVudHNyY19nZXRjYXBzKSwgKGdzdF90Y3BjbGllbnRzcmNfZ2V0KSwKKwkoZ3N0X3RjcGNsaWVudHNyY19pbml0X3JlY2VpdmUpOgorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzcmMuaDoKKyAgICAgICAgICByZWFkIGNhcHMgd2hlbiBjb25uZWN0aW5nIHRvIHNlcnZlciBmb3IgR0RQIHNvIHdlIHNldCB0aGVtIGNvcnJlY3RseQorCisyMDA0LTA2LTE3ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvdmlkZW9yYXRlL2dzdHZpZGVvcmF0ZS5jOiAoZ3N0X3ZpZGVvcmF0ZV9jaGFpbik6CisJICBub3RpZnkgZHJvcHMgYW5kIGR1cGxpY2F0ZXMKKwkqIGdzdC92aWRlb3NjYWxlL3ZpZGVvc2NhbGUuYzogKHZpZGVvc2NhbGVfZ2V0X3N0cnVjdHVyZSk6CisJICBubyBnb29kIHJlYXNvbiB0byBsaW1pdCBvdXJzZWx2ZXMgdG8gMTAweDEwMAorCisyMDA0LTA2LTE3ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBzeXMvdjRsL2dzdHY0bHNyYy5jOiAoZ3N0X3Y0bHNyY19jbGFzc19pbml0KSwgKGdzdF92NGxzcmNfaW5pdCksCisJKGdzdF92NGxzcmNfb3BlbiksIChnc3RfdjRsc3JjX3NyY19saW5rKSwgKGdzdF92NGxzcmNfZ2V0Y2FwcyksCisJKGdzdF92NGxzcmNfZ2V0KSwgKGdzdF92NGxzcmNfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3Y0bHNyY19nZXRfcHJvcGVydHkpOgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuaDoKKwkqIHN5cy92NGwvdjRsX2NhbGxzLmM6IChnc3RfdjRsX3NldF93aW5kb3dfcHJvcGVydGllcyksCisJKGdzdF92NGxfb3BlbiksIChnc3RfdjRsX2dldF9waWN0dXJlKSwgKGdzdF92NGxfZ2V0X2F1ZGlvKSwKKwkoZ3N0X3Y0bF9zZXRfYXVkaW8pOgorCSogc3lzL3Y0bC92NGxzcmNfY2FsbHMuYzogKGdzdF92NGxzcmNfZ3JhYl9mcmFtZSksCisJKGdzdF92NGxzcmNfdHJ5X2NhcHR1cmUpOgorCSogc3lzL3Y0bC92NGxzcmNfY2FsbHMuaDoKKwkgIGNoYW5nZSB0cnlfcGFsZXR0ZSB0byBtb3JlIGdlbmVyYWwgdHJ5X2NhcHR1cmUKKwkgIGFkZCBhdXRvcHJvYmUgb3B0aW9uIHNvIHdlIGNhbiB0dXJuIG9mZiBhdXRvcHJvYmluZworCSAgdmFyaW91cyBmaXhlcworCisyMDA0LTA2LTE3ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBhZGQgdmlkZW9yYXRlCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2ZpbmFsaXplKSwKKwkoZ3N0X3hpbWFnZXNpbmtfY2xhc3NfaW5pdCk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2ZpbmFsaXplKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NsYXNzX2luaXQpOgorICAgICAgICAgIHJ1biB0aGVtIGFzIGZpbmFsaXplLCBub3QgZGlzcG9zZSwgc2luY2UgZGlzcG9zZSBjYW4gYmUgaW52b2tlZAorICAgICAgICAgIG11bHRpcGxlIHRpbWVzCisKKzIwMDQtMDYtMTcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9pbml0KSwgKGdzdF9hbHNhX2Rpc3Bvc2UpLAorCShnc3RfYWxzYV9nZXRfdGltZSksIChnc3RfYWxzYV94cnVuX3JlY292ZXJ5KToKKwkqIGV4dC9hbHNhL2dzdGFsc2EuaDoKKwkqIGV4dC9hbHNhL2dzdGFsc2FjbG9jay5jOiAoZ3N0X2Fsc2FfY2xvY2tfZ2V0X3R5cGUpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYXNyYy5jOiAoZ3N0X2Fsc2Ffc3JjX2luaXQpLCAoZ3N0X2Fsc2Ffc3JjX2xvb3ApLAorCShnc3RfYWxzYV9zcmNfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9hbHNhL2dzdGFsc2FzcmMuaDoKKwlNYWtlIHRoZSB4cnVuIGNvZGUgdGltZXN0YW1wIGFuZCBvZmZzZXQgdGhlIGJ1ZmZlcnMgY29ycmVjdGx5LgorCW1vdmVkIHRoZSBjbG9jayB0byB0aGUgYmFzZSBjbGFzcywgdXNlIGFsc2EgbWV0aG9kcyB0byBnZXQgdGltZS4KKwlEbyBjb3JyZWN0IHRpbWVzdGFtcGluZyBvbiBvdXRnb2luZyBidWZmZXJzLgorCisyMDA0LTA2LTE3ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L2F1ZGlvcmF0ZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb3JhdGUvZ3N0YXVkaW9yYXRlLmM6IChnc3RfYXVkaW9yYXRlX2dldF90eXBlKSwKKwkoZ3N0X2F1ZGlvcmF0ZV9iYXNlX2luaXQpLCAoZ3N0X2F1ZGlvcmF0ZV9jbGFzc19pbml0KSwKKwkoZ3N0X2F1ZGlvcmF0ZV9saW5rKSwgKGdzdF9hdWRpb3JhdGVfaW5pdCksIChnc3RfYXVkaW9yYXRlX2NoYWluKSwKKwkoZ3N0X2F1ZGlvcmF0ZV9zZXRfcHJvcGVydHkpLCAoZ3N0X2F1ZGlvcmF0ZV9nZXRfcHJvcGVydHkpLAorCShnc3RfYXVkaW9yYXRlX2NoYW5nZV9zdGF0ZSksIChwbHVnaW5faW5pdCk6CisJQWRkZWQgYW4gYXVkaW9yYXRlIGNvbnZlcnRlciB0aGF0IGZpbGxzIGluIGdhcHMuCisKKzIwMDQtMDYtMTcgIEpvaGFuIERhaGxpbiAgPGpvaGFuQGdub21lLm9yZz4KKworCSogZXh0L3RjcC8qOiBSZXZlcnQgWmFoZWVyIGNoYW5nZXMsIHRvIG1ha2UgdGhpbmdzIGFjdHVhbGx5IHdvcmsgYWdhaW4uCisKKzIwMDQtMDYtMTYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBzeXMvdjRsL2dzdHY0bG1qcGVnc3JjLmM6IChnc3RfdjRsbWpwZWdzcmNfZ2V0KToKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6IChnc3RfdjRsc3JjX3N5bmNfbW9kZV9nZXRfdHlwZSksCisJKGdzdF92NGxzcmNfY2xhc3NfaW5pdCksIChnc3RfdjRsc3JjX2luaXQpLCAoZ3N0X3Y0bHNyY19nZXRfZnBzKSwKKwkoZ3N0X3Y0bHNyY19nZXQpLCAoZ3N0X3Y0bHNyY19zZXRfcHJvcGVydHkpLAorCShnc3RfdjRsc3JjX2dldF9wcm9wZXJ0eSk6CisJKiBzeXMvdjRsL2dzdHY0bHNyYy5oOgorCUFkZGVkIGEgY29weSBtb2RlIHRvIHY0bHNyYyB3aGVyZSBpdCB3aWxsIG91dHB1dCBhIGNvcGllZCB2ZXJzaW9uCisJb2YgaXRzIGludGVybmFsIGhhcmR3YXJlIGJ1ZmZlci4KKwlGaXggdGhlIHdyb25nIEZMQUdfU0VUIHVzYWdlLiBUaGUgZmxhZ3MgYXJlIGludGVnZXJzLCBub3QgYml0cywgeW91CisJY2FuJ3QgfCB0aGVtLgorCisyMDA0LTA2LTE2ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogc3lzL29zcy9nc3Rvc3NzcmMuYzogKGdzdF9vc3NzcmNfZ2V0KToKKwlUaW1lc3RhbXAgZml4ZXMuCisKKzIwMDQtMDYtMTYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBzeXMvdjRsL2dzdHY0bHNyYy5jOiAoZ3N0X3Y0bHNyY19zeW5jX21vZGVfZ2V0X3R5cGUpLAorCShnc3RfdjRsc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3Y0bHNyY19pbml0KSwgKGdzdF92NGxzcmNfZ2V0X2ZwcyksCisJKGdzdF92NGxzcmNfZ2V0KSwgKGdzdF92NGxzcmNfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3Y0bHNyY19nZXRfcHJvcGVydHkpOgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuaDoKKwkqIHN5cy92NGwvdjRsLW92ZXJsYXlfY2FsbHMuYzogKGdzdF92NGxfc2V0X292ZXJsYXkpOgorCUFkZGVkIGEgc3luYyBtb2RlIGVudW0gcHJvcGVydHkgdG8gY29udHJvbCB2NGxzcmMgdGltZXN0YW1wIG1ldGhvZAorCVJlbW92ZWQgdGhlIHVzZS1maXhlZC1mcHMgcHJvcGVydHkgYW5kIG1vdmVkIGZ1bmN0aW9uYWxpdHkgaW4KKwl0aGUgZW51bS4KKwlEb24ndCBlcnJvciBvbiBhbiBlcnJvciB2YWx1ZSBmcm9tIHY0bC1jb25mLCBpdCBtaWdodCBub3QgYWx3YXlzCisJYmUgYSByZWFsIGVycm9yLgorCisyMDA0LTA2LTE2ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3ZpZGVvcmF0ZS9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb3JhdGUvZ3N0dmlkZW9yYXRlLmM6IChnc3RfdmlkZW9yYXRlX2dldF90eXBlKSwKKwkoZ3N0X3ZpZGVvcmF0ZV9iYXNlX2luaXQpLCAoZ3N0X3ZpZGVvcmF0ZV9jbGFzc19pbml0KSwKKwkoZ3N0X3ZpZGVvcmF0ZV9nZXRjYXBzKSwgKGdzdF92aWRlb3JhdGVfbGluayksCisJKGdzdF92aWRlb3JhdGVfaW5pdCksIChnc3RfdmlkZW9yYXRlX2NoYWluKSwKKwkoZ3N0X3ZpZGVvcmF0ZV9zZXRfcHJvcGVydHkpLCAoZ3N0X3ZpZGVvcmF0ZV9nZXRfcHJvcGVydHkpLAorCShnc3RfdmlkZW9yYXRlX2NoYW5nZV9zdGF0ZSksIChwbHVnaW5faW5pdCk6CisJQWRkZWQgYSB2aWRlbyB0aW1lc3RhbXAgY29ycmVjdG9yLgorCisyMDA0LTA2LTE1ICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwlmaXhlZCBhIHBvdGVudGlhbCBsZWFrIHdpdGggcHJldmlvdXMgY29tbWl0CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5jOiAoZ3N0X3JpZmZfcGVla19oZWFkKToKKworMjAwNC0wNi0xNSAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLXJlYWQuYzogKGdzdF9yaWZmX3BlZWtfaGVhZCk6CisJQWRkZWQgbWlzc2luZyByZWZjb3VudCwgZml4ZXMgYnVnICMxNDQ0MjUKKwlDaGVlcnMgVGltIGZvciBmaW5kaW5nIHRoZSBidWcKKworMjAwNC0wNi0xNSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogc3lzL3Y0bC9nc3R2NGwuYzogKHBsdWdpbl9pbml0KToKKwkqIHN5cy92NGwvZ3N0djRsY29sb3JiYWxhbmNlLmM6CisJKiBzeXMvdjRsL2dzdHY0bGNvbG9yYmFsYW5jZS5oOgorCSogc3lzL3Y0bC9nc3R2NGxlbGVtZW50LmM6CisJKiBzeXMvdjRsL2dzdHY0bGVsZW1lbnQuaDoKKwkqIHN5cy92NGwvZ3N0djRsbWpwZWdzaW5rLmM6IChnc3RfdjRsbWpwZWdzaW5rX2NsYXNzX2luaXQpOgorCSogc3lzL3Y0bC9nc3R2NGxtanBlZ3NpbmsuaDoKKwkqIHN5cy92NGwvZ3N0djRsbWpwZWdzcmMuYzogKGdzdF92NGxtanBlZ3NyY19jbGFzc19pbml0KToKKwkqIHN5cy92NGwvZ3N0djRsbWpwZWdzcmMuaDoKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6IChnc3RfdjRsc3JjX2dldF9mcHNfbGlzdCksCisJKGdzdF92NGxzcmNfZ2V0X2ZwcyksIChnc3RfdjRsc3JjX3NyY2Nvbm5lY3QpLAorCShnc3RfdjRsc3JjX2dldGNhcHMpLCAoZ3N0X3Y0bHNyY19nZXQpOgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuaDoKKwkqIHN5cy92NGwvZ3N0djRsdHVuZXIuYzoKKwkqIHN5cy92NGwvZ3N0djRsdHVuZXIuaDoKKwkqIHN5cy92NGwvZ3N0djRseG92ZXJsYXkuYzoKKwkqIHN5cy92NGwvZ3N0djRseG92ZXJsYXkuaDoKKwkqIHN5cy92NGwvdjRsLW92ZXJsYXlfY2FsbHMuYzogKGdzdF92NGxfc2V0X292ZXJsYXkpLAorCShnc3RfdjRsX3NldF93aW5kb3cpLCAoZ3N0X3Y0bF9lbmFibGVfb3ZlcmxheSk6CisJKiBzeXMvdjRsL3Y0bF9jYWxscy5jOiAoZ3N0X3Y0bF9zZXRfd2luZG93X3Byb3BlcnRpZXMpLAorCShnc3RfdjRsX29wZW4pLCAoZ3N0X3Y0bF9nZXRfcGljdHVyZSksIChnc3RfdjRsX2dldF9hdWRpbyksCisJKGdzdF92NGxfc2V0X2F1ZGlvKToKKwkqIHN5cy92NGwvdjRsX2NhbGxzLmg6CisJKiBzeXMvdjRsL3Y0bG1qcGVnc2lua19jYWxscy5jOiAoZ3N0X3Y0bG1qcGVnc2lua19zeW5jX3RocmVhZCksCisJKGdzdF92NGxtanBlZ3NpbmtfcXVldWVfZnJhbWUpLCAoZ3N0X3Y0bG1qcGVnc2lua19zeW5jX2ZyYW1lKSwKKwkoZ3N0X3Y0bG1qcGVnc2lua19zZXRfYnVmZmVyKSwgKGdzdF92NGxtanBlZ3Npbmtfc2V0X3BsYXliYWNrKSwKKwkoZ3N0X3Y0bG1qcGVnc2lua19wbGF5YmFja19pbml0KSwKKwkoZ3N0X3Y0bG1qcGVnc2lua19wbGF5YmFja19zdGFydCksIChnc3RfdjRsbWpwZWdzaW5rX2dldF9idWZmZXIpLAorCShnc3RfdjRsbWpwZWdzaW5rX3BsYXlfZnJhbWUpLCAoZ3N0X3Y0bG1qcGVnc2lua193YWl0X2ZyYW1lKSwKKwkoZ3N0X3Y0bG1qcGVnc2lua19wbGF5YmFja19zdG9wKSwKKwkoZ3N0X3Y0bG1qcGVnc2lua19wbGF5YmFja19kZWluaXQpOgorCSogc3lzL3Y0bC92NGxtanBlZ3NpbmtfY2FsbHMuaDoKKwkqIHN5cy92NGwvdjRsbWpwZWdzcmNfY2FsbHMuYzogKGdzdF92NGxtanBlZ3NyY19xdWV1ZV9mcmFtZSksCisJKGdzdF92NGxtanBlZ3NyY19zeW5jX25leHRfZnJhbWUpLCAoZ3N0X3Y0bG1qcGVnc3JjX3NldF9idWZmZXIpLAorCShnc3RfdjRsbWpwZWdzcmNfc2V0X2NhcHR1cmUpLCAoZ3N0X3Y0bG1qcGVnc3JjX3NldF9jYXB0dXJlX20pLAorCShnc3RfdjRsbWpwZWdzcmNfY2FwdHVyZV9pbml0KSwgKGdzdF92NGxtanBlZ3NyY19jYXB0dXJlX3N0YXJ0KSwKKwkoZ3N0X3Y0bG1qcGVnc3JjX2dyYWJfZnJhbWUpLCAoZ3N0X3Y0bG1qcGVnc3JjX3JlcXVldWVfZnJhbWUpLAorCShnc3RfdjRsbWpwZWdzcmNfY2FwdHVyZV9zdG9wKSwgKGdzdF92NGxtanBlZ3NyY19jYXB0dXJlX2RlaW5pdCk6CisJKiBzeXMvdjRsL3Y0bG1qcGVnc3JjX2NhbGxzLmg6CisJKiBzeXMvdjRsL3Y0bHNyY19jYWxscy5jOiAoZ3N0X3Y0bHNyY19xdWV1ZV9mcmFtZSksCisJKGdzdF92NGxzcmNfc3luY19mcmFtZSksIChnc3RfdjRsc3JjX3NldF9jYXB0dXJlKSwKKwkoZ3N0X3Y0bHNyY19jYXB0dXJlX2luaXQpLCAoZ3N0X3Y0bHNyY19jYXB0dXJlX3N0YXJ0KSwKKwkoZ3N0X3Y0bHNyY19ncmFiX2ZyYW1lKSwgKGdzdF92NGxzcmNfcmVxdWV1ZV9mcmFtZSksCisJKGdzdF92NGxzcmNfY2FwdHVyZV9zdG9wKSwgKGdzdF92NGxzcmNfY2FwdHVyZV9kZWluaXQpLAorCShnc3RfdjRsc3JjX3RyeV9wYWxldHRlKToKKwkqIHN5cy92NGwvdjRsc3JjX2NhbGxzLmg6CisJICBidW5jaCBvZiBwYXJhbm9pYSBjbGVhbnVwcworCisyMDA0LTA2LTE0ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9jZHBhcmFub2lhL2dzdGNkcGFyYW5vaWEuYzogKGNkcGFyYW5vaWFfaW5pdCksCisJKGNkcGFyYW5vaWFfZ2V0KSwgKGNkcGFyYW5vaWFfb3BlbiksIChjZHBhcmFub2lhX2NoYW5nZV9zdGF0ZSk6CisJU2VuZCBkaXNjb250IGV2ZW50cyBhbmQgY2hhbmdlIHRpbWVzdGFtcHMgYXBwcm9wcmlhdGVseSB3aGVuCisJd2UgZ2V0IGEgc2VlayBldmVudC4gIChidWcgIzE0NDI0MCkKKwkqIGV4dC9jZHBhcmFub2lhL2dzdGNkcGFyYW5vaWEuaDoKKworMjAwNC0wNi0xNCAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IFVzZSBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZSBfbmVhciBpbnN0ZWFkIG9mCisJICBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZSAgc2luY2UgdGhlIGxhdHRlciBmYWlscyBmb3Igbm8gZ29vZAorCSAgcmVhc29uIG9uIHNvbWUgc2V0dXBzLgorCisyMDA0LTA2LTE0ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC92b2x1bWUvZGVtby5jOiAodmFsdWVfY2hhbmdlZF9jYWxsYmFjayk6IGV4cDEwKCkgaXMgbm90CisJc3RhbmRhcmQuICBUaGFuayB5b3UgZm9yIHBsYXlpbmcuCisKKzIwMDQtMDYtMTQgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9pbWdjb252ZXJ0LmM6IChpbWdfY29udmVydCk6CisJUGF0Y2ggMS4zIGJyb2tlIHRoZSBvcmRlcmluZyBvZiB0aGUgY29sb3JzcGFjZSBpbmZvIGFuZAorCW1hZGUgdGhlIHBsdWdpbiBiYXNpY2FsbHkgd29yayBieSBjb2luY2lkZW5jZSwgcmVvcmRlcmVkCisJdGhlIGluZm8uCisKKzIwMDQtMDYtMTQgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9sYW1lL2dzdGxhbWUuYzoKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6CisJICBzeW5jIGNhcHMuICBNYWtlIHN1cmUgbWFkIGNhbiBvbmx5IG91dHB1dCBhIGxpc3Qgb2YgcmF0ZXMsIG5vdAorCSAgYSBmdWxsIHJhbmdlLiAgSW4gdGhlIGZ1dHVyZSwgaGF2ZSB0aHJlZSBjYXBzIGxpc3RzIGZvciBlYWNoIG9mIHRoZQorCSAgbXBlZyB2ZXJzaW9ucy4gIENoYW5nZSBtcGVndmVyc2lvbiB0byBhIGRvdWJsZSBhcyB3ZWxsLgorCisyMDA0LTA2LTE0ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3Qvdm9sdW1lLy5jdnNpZ25vcmU6CisJKiBnc3Qvdm9sdW1lL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZvbHVtZS9kZW1vLmM6ICh2YWx1ZV9jaGFuZ2VkX2NhbGxiYWNrKSwgKGlkbGVyKSwKKwkoc2V0dXBfZ3VpKSwgKG1haW4pOgorCSAgYWRkZWQgc21hbGwgZGVtbyBhcHAKKworMjAwNC0wNi0xMyAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCSogZXh0L2VzZC9lc2RzaW5rLmM6IChnc3RfZXNkc2lua19jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L2VzZC9lc2RzaW5rLmg6CisJQ2xvc2UgdGhlIGVzZCBjb25uZWN0aW9uIG9uIHBhdXNlLCBiZWNhdXNlIGVzZCB3aWxsIGp1c3Qgd2FpdCAtCisJYmxvY2tpbmcgYWxsIG90aGVyIGVzZCBjbGllbnRzIGluZGVmaW5pdGVseS4KKworMjAwNC0wNi0xMiAgQ2hyaXN0b3BoZSBGZXJnZWF1ICA8dGV1ZkBnbm9tZS5vcmc+CisKKwkqIGdzdC90YWdzL2dzdHZvcmJpc3RhZy5jOiByZXBsYWNlZCBhIGdfd2FybmluZyB3aGljaCBJIGFkZGVkIGluIG15CisJICBwcmV2aW91cyBjb21taXQgd2l0aCBHU1RfREVCVUcKKworMjAwNC0wNi0xMiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgYWRkIGEgaGVhZGVyIGNoZWNrIGZvciBhIGR2ZHJlYWQgaGVhZGVyIGluIGR2ZG5hdi4gIEZpeGVzICMxMzMwMDIKKworMjAwNC0wNi0xMiAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBnc3QvdGNwL2dzdHRjcGNsaWVudHNpbmsuYzogKGdzdF90Y3BjbGllbnRzaW5rX2luaXRfc2VuZCk6CisJKiBnc3QvdGNwL2dzdHRjcGNsaWVudHNpbmsuaDoKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c3JjLmM6IChnc3RfdGNwY2xpZW50c3JjX2luaXRfcmVjZWl2ZSk6CisJKiBnc3QvdGNwL2dzdHRjcGNsaWVudHNyYy5oOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzaW5rLmM6IChnc3RfdGNwc2VydmVyc2lua19pbml0KSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfaGFuZGxlX3NlcnZlcl9yZWFkKSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfaW5pdF9zZW5kKToKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc2luay5oOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzcmMuYzogKGdzdF90Y3BzZXJ2ZXJzcmNfaW5pdF9yZWNlaXZlKToKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc3JjLmg6CisJTW9kaWZpZWQgdGhlIHRjcCBwbHVnaW5zIHNvIHRoZXkgYXJlIHBvcnRhYmxlIChJUHY0LElQdjYsIGFueSBmdXR1cmUKKyAgICAgICAgdmVyc2lvbiBvZiBJUCkKKworMjAwNC0wNi0xMiAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJQWRkZWQgb2dnIGxpYnJhcnkgc28gdGhhdCBPU1ggZGV0ZWN0cyBsaWJ0aGVvcmEgcHJvcGVybHkKKworMjAwNC0wNi0xMSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6ICh0aGVvcmFfZGVjX2NoYWluKSwKKwkodGhlb3JhX2RlY19jaGFuZ2Vfc3RhdGUpOgorCURvbid0IHRyeSB0byBkZWNvZGUgZnJhbWVzIGJlZm9yZSB3ZSByZWNlaXZlZCBhIGtleWZyYW1lLgorCisyMDA0LTA2LTExICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L29nZy9nc3RvZ2dtdXguYzogKGdzdF9vZ2dfbXV4X2NsYXNzX2luaXQpLAorCShnc3Rfb2dnX211eF9pbml0KSwgKGdzdF9vZ2dfbXV4X25leHRfYnVmZmVyKSwKKwkoZ3N0X29nZ19tdXhfZ2V0X2hlYWRlcnMpLCAoZ3N0X29nZ19tdXhfc2V0X2hlYWRlcl9vbl9jYXBzKSwKKwkoZ3N0X29nZ19tdXhfc2VuZF9oZWFkZXJzKSwgKGdzdF9vZ2dfbXV4X2xvb3ApLAorCShnc3Rfb2dnX211eF9nZXRfcHJvcGVydHkpLCAoZ3N0X29nZ19tdXhfc2V0X3Byb3BlcnR5KToKKwlBZGRlZCBwcm9wZXJ0eSB0byBzZXQgdGhlIG1heGltdW0gZGVsYXkgb2YgYSBwYWdlLgorCisyMDA0LTA2LTEwICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L29nZy9nc3RvZ2dtdXguYzogKGdzdF9vZ2dfbXV4X2NsYXNzX2luaXQpLAorCShnc3Rfb2dnX211eF9pbml0KSwgKGdzdF9vZ2dfbXV4X25leHRfYnVmZmVyKSwKKwkoZ3N0X29nZ19tdXhfZ2V0X2hlYWRlcnMpLCAoZ3N0X29nZ19tdXhfc2V0X2hlYWRlcl9vbl9jYXBzKSwKKwkoZ3N0X29nZ19tdXhfc2VuZF9oZWFkZXJzKSwgKGdzdF9vZ2dfbXV4X2xvb3ApLAorCShnc3Rfb2dnX211eF9nZXRfcHJvcGVydHkpLCAoZ3N0X29nZ19tdXhfc2V0X3Byb3BlcnR5KToKKwlBZGRlZCBtYXgtZGVsYXkgcHJvcGVydHkgdG8gY29udHJvbCB0aGUgbWF4aW11bSBhbW91bnQKKwlvZiBkYXRhIHRvIHB1dCBpbiBvbmUgcGFnZS4KKworMjAwNC0wNi0xMCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC90aGVvcmEvdGhlb3JhZW5jLmM6IChnc3RfdGhlb3JhX2VuY19jbGFzc19pbml0KSwKKwkoZ3N0X3RoZW9yYV9lbmNfaW5pdCksICh0aGVvcmFfZW5jX3NpbmtfbGluayksCisJKHRoZW9yYV9idWZmZXJfZnJvbV9wYWNrZXQpLCAodGhlb3JhX2VuY19zZXRfcHJvcGVydHkpLAorCSh0aGVvcmFfZW5jX2dldF9wcm9wZXJ0eSk6CisJU2V0IGR1cmF0aW9uIG9uIGVuY29kZWQgYnVmZmVyLCBhZGRlZCBzb21lIG1vcmUgcHJvcGVydGllcworCisyMDA0LTA2LTEwICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L29nZy9nc3RvZ2dtdXguYzogKGdzdF9vZ2dfbXV4X25leHRfYnVmZmVyKSwKKwkoZ3N0X29nZ19tdXhfZ2V0X2hlYWRlcnMpLCAoZ3N0X29nZ19tdXhfc2V0X2hlYWRlcl9vbl9jYXBzKSwKKwkoZ3N0X29nZ19tdXhfc2VuZF9oZWFkZXJzKSwgKGdzdF9vZ2dfbXV4X2xvb3ApOgorCSogZXh0L3RoZW9yYS90aGVvcmFlbmMuYzogKHRoZW9yYV9lbmNfY2hhaW4pOgorCUZpeCByZWZjb3VudGluZyBidWdzCisKKzIwMDQtMDYtMTAgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOiAoZ3N0X2FzZl9kZW11eF9pbml0KSwKKwkoZ3N0X2FzZl9kZW11eF9sb29wKSwgKGdzdF9hc2ZfZGVtdXhfcHJvY2Vzc19maWxlKSwKKwkoZ3N0X2FzZl9kZW11eF9wcm9jZXNzX2RhdGEpLCAoZ3N0X2FzZl9kZW11eF9oYW5kbGVfZGF0YSksCisJKGdzdF9hc2ZfZGVtdXhfcHJvY2Vzc19vYmplY3QpLCAoZ3N0X2FzZl9kZW11eF9nZXRfc3RyZWFtKSwKKwkoZ3N0X2FzZl9kZW11eF9wcm9jZXNzX2NodW5rKSwgKGdzdF9hc2ZfZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQpLAorCShnc3RfYXNmX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpLCAoZ3N0X2FzZl9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwKKwkoZ3N0X2FzZl9kZW11eF9jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4Lmg6CisJICBZb3Uga25vdyBDaGltYWlyYT8gIkkgLSBIQVRFIC0gRVZFUllUSElORyIuIFllYWgsIHRoYXQncyB3aGF0IHRoaXMKKwkgIGZlZWxzIGxpa2UuIEkgdGhpbmsgd2Ugc2hvdWxkIHNldCBhIG5ldyByZXF1aXJlbWVudCBmb3IgZGVtdXhlcnMKKwkgIGZyb20gbm93IG9uIHRvIGltcGxlbWVudCBzYW5lIGxvb3AgZnVuY3Rpb25zLCBkYXRhIGxvb3BzLCBxdWVyeQorCSAgYW5kIHNlZWsgZnVuY3Rpb25zIGJlZm9yZSBmaXJzdCBjb21taXQgaW50byBDVlMuIEFuZCB0aGlzIGNvbW1pdAorCSAgZml4ZXMgYWxsIG9mIHRoZSBhYm92ZS4KKworMjAwNC0wNi0xMCAgQ2hyaXN0b3BoZSBGZXJnZWF1ICA8dGV1ZkBnbm9tZS5vcmc+CisKKwkqIGdzdC90YWdzL2dzdHZvcmJpc3RhZy5jOiAoZ3N0X3ZvcmJpc190YWdfYWRkKTogbWFrZSBzdXJlIHBhcnNlZAorCSAgdm9yYmlzIGNvbW1lbnRzIGFyZSBwcm9wZXJseSBlbmNvZGVkIGluIFVURi04IGJlZm9yZSBhZGRpbmcgdGhlbQorCSAgdG8gYSBHc3RUYWdMaXN0CisKKzIwMDQtMDYtMDkgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoYWRkX2NoYW5uZWxzKToKKwkgIGhhbmRsZSBtaW4gPD0gbWF4IGNvcnJlY3RseQorCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfZml4YXRlX3RvX21pbWV0eXBlKSwKKwkoZ3N0X2Fsc2FfZml4YXRlX2ZpZWxkX25lYXJlc3RfaW50KSwgKGdzdF9hbHNhX2ZpeGF0ZSk6CisJICBhZGQgZml4YXRpb24gZnVuY3Rpb25zIHNvIHdlIGZpeGF0ZSBjb3JyZWN0bHkuIE5vIHByZWZlcnJpbmcgb2YgYWxhdworCSAgYW55bW9yZSBiZWNhdXNlIGl0J3MgdGhlIGZpcnN0IHN0cnVjdHVyZS4KKwkqIGV4dC9hbHNhL2dzdGFsc2EuaDoKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX3N3X3BhcmFtc19kdW1wKSwKKwkoZ3N0X2Fsc2FfaHdfcGFyYW1zX2R1bXApOgorCSAgYWRkIGZ1bmN0aW9ucyB0byBlYXNlIGRlYnVnZ2luZyBpbiBhbHNhbGliCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9wcm9iZV9od19wYXJhbXMpLAorCShnc3RfYWxzYV9zZXRfaHdfcGFyYW1zKSwgKGdzdF9hbHNhX3NldF9zd19wYXJhbXMpLAorCShnc3RfYWxzYV9zdGFydF9hdWRpbyk6CisJICBvbmx5IHNwZWNpZnkgaHcgcGFyYW1zIGlmIHdlIHJlYWxseSBzZXR1cCBhIGZvcm1hdCAoZml4ZXMgIzEzNDAwNyAtCisJICBvciBhdCBsZWFzdCB3b3JrcyBhcm91bmQgaXQpCisKKzIwMDQtMDYtMDkgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvb2dnL2dzdG9nZ211eC5jOiAoZ3N0X29nZ19tdXhfaW5pdCksCisJKGdzdF9vZ2dfbXV4X25leHRfYnVmZmVyKSwgKGdzdF9vZ2dfbXV4X2J1ZmZlcl9mcm9tX3BhZ2UpLAorCShnc3Rfb2dnX211eF9wdXNoX3BhZ2UpLCAoZ3N0X29nZ19tdXhfZ2V0X2hlYWRlcnMpLAorCShnc3Rfb2dnX211eF9zZXRfaGVhZGVyX29uX2NhcHMpLCAoZ3N0X29nZ19tdXhfc2VuZF9oZWFkZXJzKSwKKwkoZ3N0X29nZ19tdXhfbG9vcCk6CisJVXNlIHN0cmVhbSBjYXBzIHRvIHNldHVwIHRoZSBpbml0aWFsIHBhZ2VzIGluIHRoZSBvZ2cgc3RyZWFtLgorCUNvcnJlY3RseSBzZXQgdGhlIHN0cmVhbWhlYWRlciBjYXBzIG9uIHRoZSBzcmNwYWQuCisKKzIwMDQtMDYtMDkgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6IChnc3RfdjRsc3JjX2dldF9mcHNfbGlzdCksCisJKGdzdF92NGxzcmNfZ2V0X2ZwcyksIChnc3RfdjRsc3JjX3NyY2Nvbm5lY3QpLAorCShnc3RfdjRsc3JjX2dldGNhcHMpOgorCSogc3lzL3Y0bC92NGxfY2FsbHMuYzogKGdzdF92NGxfc2V0X3dpbmRvd19wcm9wZXJ0aWVzKSwKKwkoZ3N0X3Y0bF9nZXRfcGljdHVyZSksIChnc3RfdjRsX2dldF9hdWRpbyksIChnc3RfdjRsX3NldF9hdWRpbyk6CisJICBhZGQgcXVlcnlpbmcgb2YgZnBzIGxpc3RzIGZvciB3ZWJjYW1zLiAgTmVnb3RpYXRpbmcgdG8gYSBmcmFtZXJhdGUKKwkgIG5vdyB3b3Jrcy4KKworMjAwNC0wNi0wOCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L3RoZW9yYS90aGVvcmFlbmMuYzogKHRoZW9yYV9idWZmZXJfZnJvbV9wYWNrZXQpLAorCSh0aGVvcmFfcHVzaF9idWZmZXIpLCAodGhlb3JhX3B1c2hfcGFja2V0KSwKKwkodGhlb3JhX3NldF9oZWFkZXJfb25fY2FwcyksICh0aGVvcmFfZW5jX2NoYWluKToKKwkgIG1hcmsgYnVmZmVycyBhbmQgcHV0IG9uIHN0cmVhbWhlYWRlciwgcmF3IHRoZW9yYSBzdHJlYW1pbmcKKwkgIG5vdyB3b3JrcyB0b28sIHdoZWUKKworMjAwNC0wNi0wOCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L3RjcC9nc3R0Y3AuYzogKGdzdF90Y3BfZ2RwX3JlYWRfaGVhZGVyKSwKKwkoZ3N0X3RjcF9nZHBfcmVhZF9jYXBzKToKKyAgICAgICAgICBkbyBhIGxvb3BpbmcgcmVhZCBmb3IgY2FwcyBhbmQgR0RQIGhlYWRlcnMgdG9vCisKKzIwMDQtMDYtMDggIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c3JjLmM6IChnc3RfdGNwY2xpZW50c3JjX2dldCk6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNyYy5jOiAoZ3N0X3RjcHNlcnZlcnNyY19nZXQpOgorICAgICAgICAgIHJldHVybiBFT1MgaW5zdGVhZCBvZiBOVUxMIGluIF9nZXQKKworMjAwNC0wNi0wOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC90Y3AvZ3N0dGNwLmM6IChnc3RfdGNwX2dkcF9yZWFkX2hlYWRlciksCisJKGdzdF90Y3BfZ2RwX3JlYWRfY2FwcyksIChnc3RfdGNwX2dkcF93cml0ZV9oZWFkZXIpLAorCShnc3RfdGNwX2dkcF93cml0ZV9jYXBzKToKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c3JjLmM6IChnc3RfdGNwY2xpZW50c3JjX2dldCk6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNyYy5jOiAoZ3N0X3RjcHNlcnZlcnNyY19nZHBfcmVhZF9jYXBzKSwKKwkoZ3N0X3RjcHNlcnZlcnNyY19nZHBfcmVhZF9oZWFkZXIpLCAoZ3N0X3RjcHNlcnZlcnNyY19nZXQpOgorCU1lbW9yeSBsZWFrIGZpeGVzCisKKzIwMDQtMDYtMDggIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC92b3JiaXMvTWFrZWZpbGUuYW06CisJKiBleHQvdm9yYmlzL3ZvcmJpcy5jOiAocGx1Z2luX2luaXQpOgorCSogZXh0L3ZvcmJpcy92b3JiaXNwYXJzZS5jOiAoZ3N0X3ZvcmJpc19wYXJzZV9iYXNlX2luaXQpLAorCShnc3Rfdm9yYmlzX3BhcnNlX2NsYXNzX2luaXQpLCAoZ3N0X3ZvcmJpc19wYXJzZV9pbml0KSwKKwkodm9yYmlzX3BhcnNlX3NldF9oZWFkZXJfb25fY2FwcyksICh2b3JiaXNfcGFyc2VfY2hhaW4pLAorCSh2b3JiaXNfcGFyc2VfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC92b3JiaXMvdm9yYmlzcGFyc2UuaDoKKyAgICAgICAgICBhZGRpbmcgYSB2b3JiaXNwYXJzZSBlbGVtZW50IHRoYXQgbWFya3MgdGhlIGJ1ZmZlcnMsIHN0cmVhbWluZworICAgICAgICAgIHJhdyB2b3JiaXMgdXNpbmcgR0RQIG5vdyB3b3Jrcywgd2hlZQorCisyMDA0LTA2LTA4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L2pwZWcvTWFrZWZpbGUuYW06CisJKiBleHQvanBlZy9SRUFETUU6CisJKiBleHQvanBlZy9nc3RqcGVnLmM6IChwbHVnaW5faW5pdCk6CisJKiBleHQvanBlZy9nc3RzbW9rZWRlYy5jOiAoZ3N0X3Ntb2tlZGVjX2dldF90eXBlKSwKKwkoZ3N0X3Ntb2tlZGVjX2Jhc2VfaW5pdCksIChnc3Rfc21va2VkZWNfY2xhc3NfaW5pdCksCisJKGdzdF9zbW9rZWRlY19pbml0KSwgKGdzdF9zbW9rZWRlY19saW5rKSwgKGdzdF9zbW9rZWRlY19jaGFpbik6CisJKiBleHQvanBlZy9nc3RzbW9rZWRlYy5oOgorCSogZXh0L2pwZWcvZ3N0c21va2VlbmMuYzogKGdzdF9zbW9rZWVuY19nZXRfdHlwZSksCisJKGdzdF9zbW9rZWVuY19iYXNlX2luaXQpLCAoZ3N0X3Ntb2tlZW5jX2NsYXNzX2luaXQpLAorCShnc3Rfc21va2VlbmNfaW5pdCksIChnc3Rfc21va2VlbmNfZ2V0Y2FwcyksIChnc3Rfc21va2VlbmNfbGluayksCisJKGdzdF9zbW9rZWVuY19yZXN5bmMpLCAoZ3N0X3Ntb2tlZW5jX2NoYWluKSwKKwkoZ3N0X3Ntb2tlZW5jX3NldF9wcm9wZXJ0eSksIChnc3Rfc21va2VlbmNfZ2V0X3Byb3BlcnR5KToKKwkqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmg6CisJKiBleHQvanBlZy9zbW9rZWNvZGVjLmM6IChzbW9rZWNvZGVjX2luaXRfZGVzdGluYXRpb24pLAorCShzbW9rZWNvZGVjX2ZsdXNoX2Rlc3RpbmF0aW9uKSwgKHNtb2tlY29kZWNfdGVybV9kZXN0aW5hdGlvbiksCisJKHNtb2tlY29kZWNfaW5pdF9zb3VyY2UpLCAoc21va2Vjb2RlY19maWxsX2lucHV0X2J1ZmZlciksCisJKHNtb2tlY29kZWNfc2tpcF9pbnB1dF9kYXRhKSwgKHNtb2tlY29kZWNfcmVzeW5jX3RvX3Jlc3RhcnQpLAorCShzbW9rZWNvZGVjX3Rlcm1fc291cmNlKSwgKHNtb2tlY29kZWNfZW5jb2RlX25ldyksCisJKHNtb2tlY29kZWNfZGVjb2RlX25ldyksIChzbW9rZWNvZGVjX2luZm9fZnJlZSksCisJKHNtb2tlY29kZWNfc2V0X3F1YWxpdHkpLCAoc21va2Vjb2RlY19nZXRfcXVhbGl0eSksCisJKHNtb2tlY29kZWNfc2V0X3RocmVzaG9sZCksIChzbW9rZWNvZGVjX2dldF90aHJlc2hvbGQpLAorCShzbW9rZWNvZGVjX3NldF9iaXRyYXRlKSwgKHNtb2tlY29kZWNfZ2V0X2JpdHJhdGUpLAorCShmaW5kX2Jlc3Rfc2l6ZSksIChhYnNfZGlmZiksIChwdXQpLCAoc21va2Vjb2RlY19lbmNvZGUpLAorCShzbW9rZWNvZGVjX3BhcnNlX2hlYWRlciksIChzbW9rZWNvZGVjX2RlY29kZSk6CisJKiBleHQvanBlZy9zbW9rZWNvZGVjLmg6CisJQWRkZWQgYSBuZXcgc2ltcGxlIGpwZWcgYmFzZWQgY29kZWMKKworMjAwNC0wNi0wOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IChnc3RfbXVsdGlwYXJ0X211eF9jbGFzc19pbml0KSwKKwkoZ3N0X211bHRpcGFydF9tdXhfbG9vcCk6CisJRml4IG1lbW9yeSBsZWFrCisKKzIwMDQtMDYtMDggIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c3JjLmM6IChnc3RfdGNwY2xpZW50c3JjX2dldCk6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNpbmsuYzogKGdzdF90Y3BzZXJ2ZXJzaW5rX2NsaWVudF9yZW1vdmUpLAorCShnc3RfdGNwc2VydmVyc2lua19oYW5kbGVfY2xpZW50X3JlYWQpLCAoZ3N0X3RjcF9idWZmZXJfd3JpdGUpLAorCShnc3RfdGNwc2VydmVyc2lua19oYW5kbGVfY2xpZW50X3dyaXRlKSwgKGdzdF90Y3BzZXJ2ZXJzaW5rX2NoYWluKSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfaW5pdF9zZW5kKSwgKGdzdF90Y3BzZXJ2ZXJzaW5rX2Nsb3NlKToKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc2luay5oOgorICAgICAgICAgIHRha2Ugc3RyZWFtaGVhZGVyIGludG8gYWNjb3VudAorCisyMDA0LTA2LTA4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvbGV2ZWwvTWFrZWZpbGUuYW06CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogKGdzdF9sZXZlbF9jbGFzc19pbml0KToKKwkgIGNsZWFuIHVwIG1hcnNoYWwgZ2VuZXJhdGlvbgorCisyMDA0LTA2LTA4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvdGNwL01ha2VmaWxlLmFtOgorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzaW5rLmM6IChnc3RfdGNwY2xpZW50c2lua19nZXRfdHlwZSksCisJKGdzdF90Y3BjbGllbnRzaW5rX2NsYXNzX2luaXQpLCAoZ3N0X3RjcGNsaWVudHNpbmtfaW5pdCksCisJKGdzdF90Y3BjbGllbnRzaW5rX3NldF9wcm9wZXJ0eSksIChnc3RfdGNwY2xpZW50c2lua19nZXRfcHJvcGVydHkpOgorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzcmMuYzogKGdzdF90Y3BjbGllbnRzcmNfY2xhc3NfaW5pdCksCisJKGdzdF90Y3BjbGllbnRzcmNfaW5pdCksIChnc3RfdGNwY2xpZW50c3JjX3NldF9wcm9wZXJ0eSksCisJKGdzdF90Y3BjbGllbnRzcmNfZ2V0X3Byb3BlcnR5KToKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc2luay5jOiAoZ3N0X3RjcHNlcnZlcnNpbmtfY2xhc3NfaW5pdCksCisJKGdzdF90Y3BzZXJ2ZXJzaW5rX2luaXQpLCAoZ3N0X3RjcHNlcnZlcnNpbmtfaGFuZGxlX3NlcnZlcl9yZWFkKSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfaGFuZGxlX2NsaWVudF9yZWFkKSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfaGFuZGxlX2NsaWVudF93cml0ZSksCisJKGdzdF90Y3BzZXJ2ZXJzaW5rX3NldF9wcm9wZXJ0eSksIChnc3RfdGNwc2VydmVyc2lua19nZXRfcHJvcGVydHkpOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzaW5rLmg6CisJICBhZGQgc2lnbmFscyBjbGllbnQtYWRkZWQgYW5kIGNsaWVudC1yZW1vdmVkCisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNyYy5jOiAoZ3N0X3RjcHNlcnZlcnNyY19jbGFzc19pbml0KSwKKwkoZ3N0X3RjcHNlcnZlcnNyY19pbml0KSwgKGdzdF90Y3BzZXJ2ZXJzcmNfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3RjcHNlcnZlcnNyY19nZXRfcHJvcGVydHkpOgorCXVuaWZvcm1pemVkLCBjaGFuZ2UgZGVmYXVsdCBwcm90b2NvbCB0byBOT05FCisJKiBnc3QvdGNwL2dzdHRjcC1tYXJzaGFsLmxpc3Q6IGFkZGVkCisyMDA0LTA2LTA3ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2NoZWNrX2V2ZW50KToKKwkgIGhhbmRsZSBkaXNjb250IGV2ZW50cyBpZiB0aGV5IGhhcHBlbiBiZWZvcmUgY2FwcyBuZWdvCisKKzIwMDQtMDYtMDcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6IChnc3RfbXVsdGlwYXJ0X2RlbXV4X2Jhc2VfaW5pdCksCisJKGdzdF9tdWx0aXBhcnRfZmluZF9wYWRfYnlfbWltZSksIChnc3RfbXVsdGlwYXJ0X2RlbXV4X2NoYWluKSwKKwkoZ3N0X211bHRpcGFydF9kZW11eF9wbHVnaW5faW5pdCk6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOiAoZ3N0X211bHRpcGFydF9tdXhfY2xhc3NfaW5pdCksCisJKGdzdF9tdWx0aXBhcnRfbXV4X2luaXQpLCAoZ3N0X211bHRpcGFydF9tdXhfbG9vcCksCisJKGdzdF9tdWx0aXBhcnRfbXV4X2NoYW5nZV9zdGF0ZSk6CisJU21hbGwgdXBkYXRlcywgZml4IGEgbWVtbGVhaworCisyMDA0LTA2LTA3ICBTdGVwaGFuZSBMb2V1aWxsZXQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogY29uZmlndXJlLmFjOiBPU1MgcG9ydGFiaWxpdHkKKwkqIGV4dC9hcnRzL2dzdF9hcnRzLmM6IGlkZW0KKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5jOiBpZGVtCisJKiBzeXMvb3NzL2dzdG9zc21peGVyLmM6IGlkZW0KKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiBpZGVtCisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jOiBpZGVtCisJKiBzeXMvb3NzL29zc19wcm9iZS5jOiBpZGVtCisJICAtIGNoZWNrIGZvciBzb3VuZGNhcmQuaCBpbiBkaWZmZXJlbnQgcGxhY2VzIGZvciBzb21lIEJTRAorCisyMDA0LTA2LTA3ICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogQVVUSE9SUzoKKwlBZGQgbWUgdG8gdGhlIGF1dGhvcnMgZmlsZQorCSogY29uZmlndXJlLmFjOgorCUluY3JlYXNlIHRoZSBsaWJkdiByZXF1aXJlbWVudCB0byA+PSB2ZXJzaW9uIDAuMTAwCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19pbml0KSwgKGdzdF9kdmRlY19zcmNfY29udmVydCksCisJKGdzdF9kdmRlY19zcmNfcXVlcnkpLCAoZ3N0X2R2ZGVjX2hhbmRsZV9zaW5rX2V2ZW50KSwKKwkoZ3N0X2R2ZGVjX3B1c2gpLCAoZ3N0X2R2ZGVjX2xvb3ApLCAoZ3N0X2R2ZGVjX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvZHYvZ3N0ZHZkZWMuaDoKKwlBZGQgc3VwcG9ydCBmb3IgdGhlIG5ld19tZWRpYSBmbGFnIHdoZW4gc2VuZGluZyBESVNDT05UIGV2ZW50cworCU1ha2UgdGhlIHF1ZXJ5aW5nIHdvcmsgd2hlbiB2aWRlbyBwYWQgaXMgbm90IGxpbmtlZAorCisyMDA0LTA2LTA3ICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dC5pLm1AemVuLmNvLnVrPgorCisJcmV2aWV3ZWQgYnkgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvbWl4bWF0cml4L21peG1hdHJpeC5jOiAoZ3N0X21peG1hdHJpeF9pbml0KToKKwkgIGNyZWF0ZSBhIE5VTEwtaW5pdGlhbGl6ZWQgYXJyYXkgb2YgcGFkcywgc28gd2UgZG9uJ3QgdGhpbmsgdGhleQorCSAgZXhpc3QgYWxyZWFkeS4gKGZpeGVzICMxNDMxMzApCisKKzIwMDQtMDYtMDcgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L21peG1hdHJpeC9taXhtYXRyaXguYzogKGdzdF9taXhtYXRyaXhfaW5pdCksCisJKG1peG1hdHJpeF9yZXNpemUpLCAoZ3N0X21peG1hdHJpeF9zZXRfYWxsX2NhcHMpLAorCShnc3RfbWl4bWF0cml4X3JlcXVlc3RfbmV3X3BhZCksIChnc3RfbWl4bWF0cml4X2xvb3ApOgorCSAgZG9uJ3QgdXNlIC8vIGNvbWVudHMKKworMjAwNC0wNi0wNyAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9zYW1wbGVzX3RvX3RpbWVzdGFtcCk6CisJICBjYXN0IHRvIEdzdENsb2NrVGltZSB0byBnZXQgaGlnaGVyIGdyYW51bGFyaXR5CisJKiBleHQvYWxzYS9nc3RhbHNhc2luay5jOiAoZ3N0X2Fsc2Ffc2lua19jaGVja19ldmVudCk6CisJICB1c2UgZ3N0X2VsZW1lbnRfc2V0X3RpbWVfZGVsYXkgdG8gZ2V0IHRoZSBleGFjdCB0aW1lCisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9jaGFpbik6CisJICB1c2UgdGhlIG5lZ290aWF0ZWQgcmF0ZSBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IGZyYW1lJ3MgcmF0ZSB3aGljaAorCSAgbWlnaHQgYmUgd3JvbmcgYmVjYXVzZSBvZiBiaXQgZXJyb3JzLiBUaGlzIGF2b2lkcyBlbWl0dGluZyB0b3RhbGx5CisJICBib2d1cyB0aW1lc3RhbXBzIGFuZCBzY3Jld2luZyBzeW5jLgorCShmaXhlcyAjMTQzNDU0KQorCisyMDA0LTA2LTA3ICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dC5pLm1AemVuLmNvLnVrPgorCisJcmV2aWV3ZWQgYnkgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvYWRkZXIvZ3N0YWRkZXIuYzogKGdzdF9hZGRlcl9sb29wKToKKwkgIHByb3Blcmx5IGVycm9yIG91dCB3aGVuIG5vIG5lZ290aWF0aW9uIGhhcyBoYXBwZW5lZCB5ZXQuIChmaXhlcworCSAgIzE0MzAzMikKKworMjAwNC0wNi0wNiAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X2lkM190YWdfaGFuZGxlX2V2ZW50KToKKwkgIGZvcndhcmQgY29ycmVjdGx5IHRyYW5zZm9ybWVkIG9mZnNldCBpbiBkaXNjb250IGV2ZW50cy4gQmFzZWQgb24KKwkgIHBhdGNoIGJ5IEFyd2VkIHYuIE1lcmthdHouIChmaXhlcyAjMTQyODUxKQorCisyMDA0LTA2LTA2ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvZGVjbWFwLmM6IHRoYXQncworCUdfSEFWRV9HTlVDX1ZBUkFSR1MsIG5vdCBHX0hBVkVfR05VX1ZBUkFSR1MuICBTaG91bGQgZml4IGNvbXBpbGUKKwlwcm9ibGVtcyBvbiBzZXZlcmFsIHN5c3RlbXMuCisKKzIwMDQtMDYtMDYgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L3ZvcmJpcy92b3JiaXNkZWMuYzogKGdzdF92b3JiaXNfZGVjX2luaXQpOgorCSAgdXNlIGV4cGxpY2l0IGNhcHMgb24gdGhlIHNyY3BhZAorCSogZXh0L3ZvcmJpcy92b3JiaXNkZWMuYzogKHZvcmJpc19kZWNfY2hhaW4pOgorCSAgcHJvcGVybHkgZXJyb3Igb3V0IGlmIGNhcHMgY291bGRuJ3QgYmUgc2V0IChmaXhlcyAjMTQyNzY0KQorCisyMDA0LTA2LTA2ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX3Byb2JlX2h3X3BhcmFtcyksCisJKGdzdF9hbHNhX3NldF9od19wYXJhbXMpLCAoZ3N0X2Fsc2Ffc2V0X3N3X3BhcmFtcyksCisJKGdzdF9hbHNhX3N0YXJ0X2F1ZGlvKToKKwkgIC0gZG9uJ3QgY2FsbCBzZXRfcGVyaW9kc19pbnRlZ2VyIGFueW1vcmUsIGl0IGJyZWFrcyB0aGUKKwkgIGNvbmZpZ3VyYXRpb24gcmFuZG9tbHkKKwkgIC0gY2FsbCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYWNjZXNzIGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmcgbWFza3MKKwkgIC0gZG9uJ3QgZmFpbCBpZiB0aGUgc3dfcGFyYW1zIGNhbid0IGJlIHNldCwganVzdCB1c2UgdGhlIGRlZmF1bHQKKwkgIHBhcmFtcyBhbmQgaG9wZSBpdCB3b3Jrcy4gQWxzYWxpYiBoYXMgd2VpcmQgaXNzdWVzIHdoZW4geW91IHRvdWNoCisJICBzd19wYXJhbXMgYW5kIGRvZXMgbm8gcHJvcGVyIGVycm9yIHJlcG9ydGluZyBhYm91dCB3aGF0IGZhaWxlZC4KKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX29wZW5fYXVkaW8pLAorCShnc3RfYWxzYV9jbG9zZV9hdWRpbyk6CisJICBtYWtlIG91ciBhbHNhIGRlYnVnZ2luZyBnbyB2aWEgZ3N0IGRlYnVnZ2luZyBhbmQgbm90IGNvbmRpdGlvbmFsbHkKKwkgIGRlZmluZWQKKwkqIGV4dC9hbHNhL2dzdGFsc2EuaDoKKwkgIGFkZCBBTFNBX0RFQlVHX0ZMVVNIIG1hY3JvCisJKiBleHQvYWxzYS9nc3RhbHNhcGx1Z2luLmM6IChnc3RfYWxzYV9lcnJvcl93cmFwcGVyKSwKKwkocGx1Z2luX2luaXQpOgorCSAgd3JhcCBhbHNhIGVycm9ycyB0byBiZSBwcmludGVkIHZpYSB0aGUgZ3N0IGRlYnVnZ2luZyBzeXN0ZW0gYW5kIG5vdAorCSAgc3BhbW1lZCB0byBzdGRlcnIKKworMjAwNC0wNi0wNCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfaW5pdCksCisJKGdzdF9xdGRlbXV4X2hhbmRsZV9zcmNfcXVlcnkpLCAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19ldmVudCksCisJKGdzdF9xdGRlbXV4X2hhbmRsZV9zaW5rX2V2ZW50KSwgKGdzdF9xdGRlbXV4X2NoYW5nZV9zdGF0ZSksCisJKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwgKHF0ZGVtdXhfZHVtcF9tdmhkKSwKKwkocXRkZW11eF9wYXJzZV90cmFrKToKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguaDoKKwkgIEJpdGNoLiBBbHNvIGtub3duIGFzIHNlZWtpbmcsIHF1ZXJ5aW5nICYgY28uCisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3NzaW5rX2luaXQpLCAoZ3N0X29zc3NpbmtfY2hhaW4pLAorCShnc3Rfb3Nzc2lua19jaGFuZ2Vfc3RhdGUpOgorCSogc3lzL29zcy9nc3Rvc3NzaW5rLmg6CisJICBSZXN5bmNpbmcgaXMgZm9yIHdlZW5pZXMsIHRoaXMgaGFjayBpcyBubyBsb25nZXIgbmVlZGVkIGFuZCB3YXMKKwkgIGJyb2tlbiBhbnl3YXkgKHNpbmNlIGl0IC0gdW5pbnRlbmRlZGx5IC0gYWx3YXlzIGxlYXZlcyByZXN5bmMgdG8KKwkgIFRSVUUpLgorCisyMDA0LTA2LTA1ICBBbmRyZXcgVHVybmVyIDx6eG9tYmllQGhvdHBvcC5jb20+CisKKwkqIGdzdC90Y3AvZ3N0dGNwLmM6IHBvcnRhYmlsaXR5IChTb2xhcmlzIDEwL0ZyZWVCU0QpCisJKiBnc3QvdGNwL2dzdHRjcGNsaWVudHNyYy5oOiBpZGVtCisJICAtIGRlZmluZSBNU0dfTk9TSUdOQUwgaWYgbm90IGRvbmUKKwkgIC0gaW5jbHVkZSB1bmlzdGQuaCBmb3Igb2ZmX3QKKyAgICAgICAgICAoZml4ZXMgIzE0Mzc0OSkKKworMjAwNC0wNi0wNSAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQva2lvL01ha2VmaWxlLmFtOgorCSAgY2hlY2sgZm9yIHF0J3MgbW9jIHByZXByb2Nlc3NvciBleHBsaWNpdGx5IGFuZCB1c2UgaXQKKworMjAwNC0wNi0wMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIGdzdC90Y3AvZ3N0dGNwLmM6IChnc3RfdGNwX3NvY2tldF93cml0ZSk6CisJICBkb24ndCBnZXQgYSBzaWduYWwgZm9yIEVQSVBFIG9uIHNvY2tldCB3cml0ZXMKKwkgIChzb21lYm9keSBjaGVjayBpZiB0aGlzIHdvcmtzIG9uIG90aGVyIHBsYXRmb3JtcykKKworMjAwNC0wNi0wMiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYWNsb2NrLmM6IChnc3RfYWxzYV9jbG9ja19nZXRfdHlwZSk6CisJKiBleHQvYWxzYS9nc3RhbHNhc3JjLmM6IChnc3RfYWxzYV9zcmNfbG9vcCk6CisgICAgICAgICAgY2hlY2sgZXJyb3IgY29uZGl0aW9uIG9uIGF2YWlsYWJsZSBzYW1wbGVzIGNvcnJlY3RseQorCisyMDA0LTA2LTAyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvYWxzYS9nc3RhbHNhc3JjLmM6IChnc3RfYWxzYV9zcmNfZ2V0X3RpbWUpOgorICAgICAgICAgIGF2b2lkIGEgc2VnZmF1bHQKKwkqIGdzdC90Y3AvZ3N0dGNwLmM6IChnc3RfdGNwX3NvY2tldF93cml0ZSksIChnc3RfdGNwX3NvY2tldF9yZWFkKSwKKwkoZ3N0X3RjcF9nZHBfcmVhZF9oZWFkZXIpLCAoZ3N0X3RjcF9nZHBfcmVhZF9jYXBzKToKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc3JjLmM6IChnc3RfdGNwc2VydmVyc3JjX2dkcF9yZWFkX2NhcHMpLAorCShnc3RfdGNwc2VydmVyc3JjX2dkcF9yZWFkX2hlYWRlcik6CisgICAgICAgICB1c2Ugc3NpemVfdCBvdmVyIHNpemVfdCBzaW5jZSB0aGUgZm9ybWVyIGlzIHNpZ25lZCBhbmQgdGh1cyB0aGUKKyAgICAgICAgIGNoZWNrIGZvciBlcnJvciBjb2RlcyBjYW4gd29yaworCisyMDA0LTA2LTAyICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCXJldmlld2VkIGJ5OiBKb2hhbgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOiAoZ3N0X211bHRpcGFydF9tdXhfY2xhc3NfaW5pdCksCisJKGdzdF9tdWx0aXBhcnRfbXV4X2xvb3ApOgorCU9vcHMKKworMjAwNC0wNi0wMiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IChnc3RfbXVsdGlwYXJ0X211eF9jbGFzc19pbml0KSwKKwkoZ3N0X211bHRpcGFydF9tdXhfaW5pdCksIChnc3RfbXVsdGlwYXJ0X211eF9sb29wKSwKKwkoZ3N0X211bHRpcGFydF9tdXhfZ2V0X3Byb3BlcnR5KSwgKGdzdF9tdWx0aXBhcnRfbXV4X3NldF9wcm9wZXJ0eSksCisJKGdzdF9tdWx0aXBhcnRfbXV4X2NoYW5nZV9zdGF0ZSk6CisJQWRkZWQgY29uZmlndXJhYmxlIGJvdW5kYXJ5IHNwZWNpZmllciwgYWRkZWQgdGhlIHZhbHVlIGFzIGEKKwljYXBzIGZpZWxkIGFzIHdlbGwuCisKKzIwMDQtMDYtMDIgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogZ3N0L3RjcC9nc3R0Y3AuYzoKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c3JjLmM6CisJKiBnc3QvdGNwL2dzdHRjcGNsaWVudHNyYy5oOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzcmMuYzoKKwkgIC0gcG9ydGFiaWxpdHkgZml4LCB0byBjb21waWxlIG9uIE9TWAorICAgICAgICAgICAgKGZpeGVzICMxNDMxNDYpCisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2VsZW1lbnQuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSAgLSBjb21waWxhdGlvbiB3YXJuaW5ncyBvbiBPU1gKKyAgICAgICAgICAgIChmaXhlcyAjMTQzMTUzKQorCisyMDA0LTA2LTAyICBTdGVwaGFuZSBMb2V1aWxsZXQgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBleHQvdm9yYmlzL3ZvcmJpc2RlYy5jIDogc2lnbiB3YXJuaW5nIGZpeGVzCisKKwkqIGdzdC1saWJzL2dzdC9taXhlci9taXhlcnRyYWNrLmMgOgorCSAgZG8gbm8gdXNlIGRlZmluZXMgd2hpY2ggYXJlIGdsaWIgMi40IHNwZWNpZmljCisKKzIwMDQtMDYtMDEgIENocmlzdG9waGUgRmVyZ2VhdSAgPHRldWZAZ25vbWUub3JnPgorCisJKiBleHQvZmxhYy9nc3RmbGFjdGFnLmM6IHN0cmlwIGVuZGluZyBmcmFtaW5nIGJpdCBmcm9tIHZvcmJpc2NvbW1lbnQKKwkgIGJ1ZmZlciBzaW5jZSBsaWJmbGFjIGRvZXNuJ3QgZXhwZWN0IGl0IChyZXBvcnRzIGEgc3luYyBlcnJvciB3aGVuCisJICBpdCBlbmNvdW50ZXJzIHRoYXQpCisKKworMjAwNC0wNi0wMSAgT3dlbiBGcmFzZXItR3JlZW4gIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9taXhlci9taXhlcnRyYWNrLmg6IENoYW5nZWQgc3RydWN0IHN5bnRheAorCSogZ3N0LWxpYnMvZ3N0L21peGVyL21peGVydHJhY2suYzoKKwkoZ3N0X21peGVyX3RyYWNrX2dldF9wcm9wZXJ0eSksIChnZXRfbWl4ZXJfdHJhY2tfaW5pdCksCisJKGdldF9taXhlcl90cmFja19nZXRfcHJvcGVydHkpOiBBZGRlZCBwcm9wZXJ0eSBhY2Nlc3NvcnMKKwkqIGdzdC1saWJzL2dzdC9taXhlci9taXhlcm9wdGlvbnMuaDogQ2hhbmdlZCBzdHJ1Y3Qgc3ludGF4CisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvbWl4ZXJvcHRpb25zLmM6CisJKGdzdF9taXhlcl9vcHRpb25zX2dldF92YWx1ZXMpOiBBZGRlZAorCSogZ3N0LWxpYnMvZ3N0L21peGVyL21peGVyLmg6IENoYW5nZWQgR3N0TWl4ZXJDbGFzcyBzeW50YXgKKwkqIGdzdC1saWJzL2dzdC9taXhlci9taXhlci5jOiBGaXhlZCBjb21tZW50CisKKworMjAwNC0wNi0wMSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX29wZW5fYXVkaW8pOgorICAgICAgICAgIGltcHJvdmUgZXJyb3IgbWVzc2FnZXMgb24gb3BlbgorCisKKzIwMDQtMDYtMDEgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHN5cy92NGwvdjRsLW92ZXJsYXlfY2FsbHMuYzogKGdzdF92NGxfc2V0X292ZXJsYXkpOgorICAgICAgICAgIGNoZWNrIGlmIHY0bC1jb25mIGlzIGluIHBhdGgKKworMjAwNC0wNi0wMSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby1wcml2LmM6IChnbWlfc2V0X21pbWUpOgorICAgICAgICAgIGNoYW5nZSBhc3NlcnQgdG8gYSBtb3JlIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2UKKworMjAwNC0wNS0zMSAgU3RlcGhhbmUgTG9ldWlsbGV0ICA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGdzdC1saWJzL2dzdC90dW5lci90dW5lcmNoYW5uZWwuaDoKKwkgIC0gYWRkIGEgZnJlcV9tdWx0aXBsaWNhdG9yIGZpZWxkIHRvIG1ha2UgdGhlIGNvbnZlcnNpb24KKwkgICAgYmV0d2VlbiBpbnRlcm5hbCBmcmVxdWVuY3kgdW5pdCBhbmQgSHoKKwkqIHN5cy92NGwvZ3N0djRsZWxlbWVudC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmVsZW1lbnQuYzoKKwkgIC0gY2hhbmdlIGRlZmF1bHQgdmlkZW8gZGV2aWNlIHRvIC9kZXYvdmlkZW8wCisJKiBzeXMvdjRsL3Y0bF9jYWxscy5jOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSAgLSB3ZSBvbmx5IGV4cG9zZSBmcmVxdWVuY3kgdG8gdGhlIHVzZXIgaW4gSHogaW5zdGVhZCBvZgorCSAgICBiYXN0YXJkIHY0bFggdW5pdCAoZWl0aGVyIDYyLjVrSHogb3IgNjIuNUh6KQorCisyMDA0LTA1LTMxICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisJKiBleHQvdm9yYmlzL3ZvcmJpc2RlYy5jOiAodm9yYmlzX2RlY19jaGFpbik6CisJICBJbml0aWFsaXNlIGJfb19zIGFuZCBlX29fcyB2YXJpYWJsZXMKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtbWVkaWEuYzoKKwkoZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX2NhcHNfd2l0aF9kYXRhKToKKwkgIEFkZCBzb21lIHVudXN1YWwgZm91cmNjJ3MgZnJvbSBtcGxheWVyIGF2aSdzCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOiAoZ3N0X211bHRpcGFydF9tdXhfcGx1Z2luX2luaXQpOgorCSAgTWFrZSB0aGUgbXV4ZXIgaGF2ZSByYW5rIEdTVF9SQU5LX05PTkUsIHNvIGl0IGRvZXNuJ3QgbWVzcyB1cAorCSAgYXV0b3BsdWdnaW5nLgorCisyMDA0LTA1LTI4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2FscGhhL01ha2VmaWxlLmFtOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6IChnc3RfYWxwaGFfbWV0aG9kX2dldF90eXBlKSwKKwkoZ3N0X2FscGhhX2dldF90eXBlKSwgKGdzdF9hbHBoYV9iYXNlX2luaXQpLAorCShnc3RfYWxwaGFfY2xhc3NfaW5pdCksIChnc3RfYWxwaGFfaW5pdCksIChnc3RfYWxwaGFfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X2FscGhhX2dldF9wcm9wZXJ0eSksIChnc3RfYWxwaGFfc2lua19saW5rKSwgKGdzdF9hbHBoYV9hZGQpLAorCShnc3RfYWxwaGFfY2hyb21hX2tleSksIChnc3RfYWxwaGFfY2hhaW4pLAorCShnc3RfYWxwaGFfY2hhbmdlX3N0YXRlKSwgKHBsdWdpbl9pbml0KToKKwlBIHBsdWdpbiB0byBhZGQgYW4gYWxwaGEgY2hhbm5lbCB0byBJNDIwIHZpZGVvLiBDYW4gb3B0aW9uYWxseSBkbworCWNocm9tYSBrZXlpbmcuCisJKiBnc3QvbXVsdGlwYXJ0L01ha2VmaWxlLmFtOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnQuYzogKHBsdWdpbl9pbml0KToKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzogKGdzdF9tdWx0aXBhcnRfZGVtdXhfYmFzZV9pbml0KSwKKwkoZ3N0X211bHRpcGFydF9kZW11eF9jbGFzc19pbml0KSwgKGdzdF9tdWx0aXBhcnRfZGVtdXhfaW5pdCksCisJKGdzdF9tdWx0aXBhcnRfZGVtdXhfZmluYWxpemUpLCAoZ3N0X211bHRpcGFydF9kZW11eF9oYW5kbGVfZXZlbnQpLAorCShnc3RfbXVsdGlwYXJ0X2ZpbmRfcGFkX2J5X21pbWUpLCAoZ3N0X211bHRpcGFydF9kZW11eF9jaGFpbiksCisJKGdzdF9tdWx0aXBhcnRfZGVtdXhfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X211bHRpcGFydF9kZW11eF9wbHVnaW5faW5pdCk6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOiAoZ3N0X211bHRpcGFydF9tdXhfZ2V0X3R5cGUpLAorCShnc3RfbXVsdGlwYXJ0X211eF9iYXNlX2luaXQpLCAoZ3N0X211bHRpcGFydF9tdXhfY2xhc3NfaW5pdCksCisJKGdzdF9tdWx0aXBhcnRfbXV4X2dldF9zaW5rX2V2ZW50X21hc2tzKSwgKGdzdF9tdWx0aXBhcnRfbXV4X2luaXQpLAorCShnc3RfbXVsdGlwYXJ0X211eF9zaW5rY29ubmVjdCksIChnc3RfbXVsdGlwYXJ0X211eF9wYWRfbGluayksCisJKGdzdF9tdWx0aXBhcnRfbXV4X3BhZF91bmxpbmspLAorCShnc3RfbXVsdGlwYXJ0X211eF9yZXF1ZXN0X25ld19wYWQpLAorCShnc3RfbXVsdGlwYXJ0X211eF9oYW5kbGVfc3JjX2V2ZW50KSwKKwkoZ3N0X211bHRpcGFydF9tdXhfbmV4dF9idWZmZXIpLCAoZ3N0X211bHRpcGFydF9tdXhfY29tcGFyZV9wYWRzKSwKKwkoZ3N0X211bHRpcGFydF9tdXhfcXVldWVfcGFkcyksIChnc3RfbXVsdGlwYXJ0X211eF9sb29wKSwKKwkoZ3N0X211bHRpcGFydF9tdXhfZ2V0X3Byb3BlcnR5KSwgKGdzdF9tdWx0aXBhcnRfbXV4X3NldF9wcm9wZXJ0eSksCisJKGdzdF9tdWx0aXBhcnRfbXV4X2NoYW5nZV9zdGF0ZSksIChnc3RfbXVsdGlwYXJ0X211eF9wbHVnaW5faW5pdCk6CisJQSBNdWx0aXBhcnQgZGVtdXhlci9tdXhlci4gTm90IHN1cmUgaWYgaXQgdmlvbGF0ZXMgc3BlY3MuIFVzZWQgdG8KKwlzZW5kIG11bHRpcGFydCBqcGVnIGltYWdlcyB0byBhIGJyb3dzZXIuCisJKiBnc3QvdmlkZW9ib3gvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9ib3gvUkVBRE1FOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X2ZpbGxfZ2V0X3R5cGUpLAorCShnc3RfdmlkZW9fYm94X2dldF90eXBlKSwgKGdzdF92aWRlb19ib3hfYmFzZV9pbml0KSwKKwkoZ3N0X3ZpZGVvX2JveF9jbGFzc19pbml0KSwgKGdzdF92aWRlb19ib3hfaW5pdCksCisJKGdzdF92aWRlb19ib3hfc2V0X3Byb3BlcnR5KSwgKGdzdF92aWRlb19ib3hfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3ZpZGVvX2JveF9zaW5rX2xpbmspLCAoZ3N0X3ZpZGVvX2JveF9pNDIwKSwKKwkoZ3N0X3ZpZGVvX2JveF9heXV2KSwgKGdzdF92aWRlb19ib3hfY2hhaW4pLAorCShnc3RfdmlkZW9fYm94X2NoYW5nZV9zdGF0ZSksIChwbHVnaW5faW5pdCk6CisJQ3JvcHMgb3IgYWRkcyBib3JkZXJzIGFyb3VuZCBhbiBpbWFnZS4gY2FuIGRvIGFscGhhIGNoYW5uZWwKKwlib3JkZXJzIGFzIHdlbGwuCisJKiBnc3QvdmlkZW9taXhlci9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb21peGVyL1JFQURNRToKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogKGdzdF92aWRlb21peGVyX3BhZF9nZXRfdHlwZSksCisJKGdzdF92aWRlb21peGVyX3BhZF9iYXNlX2luaXQpLCAoZ3N0X3ZpZGVvbWl4ZXJfcGFkX2NsYXNzX2luaXQpLAorCShnc3RfdmlkZW9taXhlcl9wYWRfZ2V0X3NpbmtfZXZlbnRfbWFza3MpLAorCShnc3RfdmlkZW9taXhlcl9wYWRfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfcGFkX3NldF9wcm9wZXJ0eSksCisJKGdzdF92aWRlb21peGVyX3BhZF9zaW5rY29ubmVjdCksIChnc3RfdmlkZW9taXhlcl9wYWRfbGluayksCisJKGdzdF92aWRlb21peGVyX3BhZF91bmxpbmspLCAoZ3N0X3ZpZGVvbWl4ZXJfcGFkX2luaXQpLAorCShnc3RfdmlkZW9fbWl4ZXJfYmFja2dyb3VuZF9nZXRfdHlwZSksIChnc3RfdmlkZW9taXhlcl9nZXRfdHlwZSksCisJKGdzdF92aWRlb21peGVyX2Jhc2VfaW5pdCksIChnc3RfdmlkZW9taXhlcl9jbGFzc19pbml0KSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfaW5pdCksIChnc3RfdmlkZW9taXhlcl9yZXF1ZXN0X25ld19wYWQpLAorCShnc3RfdmlkZW9taXhlcl9oYW5kbGVfc3JjX2V2ZW50KSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfYmxlbmRfYXl1dl9pNDIwKSwgKGdzdF92aWRlb21peGVyX2ZpbGxfY2hlY2tlciksCisJKGdzdF92aWRlb21peGVyX2ZpbGxfY29sb3IpLCAoZ3N0X3ZpZGVvbWl4ZXJfZmlsbF9xdWV1ZXMpLAorCShnc3RfdmlkZW9taXhlcl9ibGVuZF9idWZmZXJzKSwgKGdzdF92aWRlb21peGVyX3VwZGF0ZV9xdWV1ZXMpLAorCShnc3RfdmlkZW9taXhlcl9sb29wKSwgKGdzdF92aWRlb21peGVyX2dldF9wcm9wZXJ0eSksCisJKGdzdF92aWRlb21peGVyX3NldF9wcm9wZXJ0eSksIChnc3RfdmlkZW9taXhlcl9jaGFuZ2Vfc3RhdGUpLAorCShwbHVnaW5faW5pdCk6CisJR2VuZXJpYyB2aWRlbyBtaXhlciBwbHVnaW4sIGNhbiBoYW5kbGUgbXVsdGlwbGUgaW5wdXRzIGFsbCB3aXRoCisJZGlmZmVyZW50IGZyYW1lcmF0ZXMgYW5kIHZpZGVvIHNpemVzLiBJcyBmdWxseSBhbHBoYSBjaGFubmVsCisJYXdhcmUuCisKKzIwMDQtMDUtMjcgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FtaXhlci5jOiAoZ3N0X2Fsc2FfbWl4ZXJfYnVpbGRfbGlzdCk6CisJICBTZWxlY3QgZmlyc3QgdHJhY2sgYXMgbWFzdGVyIHRyYWNrLiBOb3Qgc3VyZSBob3cgZWxzZSB0byBoYW5kbGUKKwkgIHRoYXQuLi4KKwkqIGV4dC9vZ2cvZ3N0b2dnbXV4LmM6IChnc3Rfb2dnX211eF9uZXh0X2J1ZmZlcik6CisJICBEaXNjYXJkIGRpc2NvbnQgZXZlbnRzLiBTaG91bGQgZml4ICMxNDI5NjIuCisKKzIwMDQtMDUtMjYgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hbHNhL01ha2VmaWxlLmFtOgorCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVyLmM6IChnc3RfYWxzYV9taXhlcl9pbnRlcmZhY2VfaW5pdCksCisJKGdzdF9hbHNhX21peGVyX2J1aWxkX2xpc3QpLCAoZ3N0X2Fsc2FfbWl4ZXJfZ2V0X3ZvbHVtZSksCisJKGdzdF9hbHNhX21peGVyX3NldF92b2x1bWUpLCAoZ3N0X2Fsc2FfbWl4ZXJfc2V0X211dGUpLAorCShnc3RfYWxzYV9taXhlcl9zZXRfcmVjb3JkKSwgKGdzdF9hbHNhX21peGVyX3NldF9vcHRpb24pLAorCShnc3RfYWxzYV9taXhlcl9nZXRfb3B0aW9uKToKKwkqIGV4dC9hbHNhL2dzdGFsc2FtaXhlci5oOgorCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVyb3B0aW9ucy5jOgorCShnc3RfYWxzYV9taXhlcl9vcHRpb25zX2dldF90eXBlKSwKKwkoZ3N0X2Fsc2FfbWl4ZXJfb3B0aW9uc19jbGFzc19pbml0KSwgKGdzdF9hbHNhX21peGVyX29wdGlvbnNfaW5pdCksCisJKGdzdF9hbHNhX21peGVyX29wdGlvbnNfbmV3KToKKwkqIGV4dC9hbHNhL2dzdGFsc2FtaXhlcm9wdGlvbnMuaDoKKwkqIGV4dC9hbHNhL2dzdGFsc2FtaXhlcnRyYWNrLmM6IChnc3RfYWxzYV9taXhlcl90cmFja19uZXcpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVydHJhY2suaDoKKwkgIEFkZCBlbnVtZXJhdGlvbnMgKGFzIEdzdE1peGVyT3B0aW9ucykuIE1ha2UgY29ycmVjdCBkaXN0aW5jdGlvbgorCSAgYmV0d2VlbiBpbnB1dC9vdXRwdXQgdHJhY2tzLiBBZGQgY2FwdHVyZS9wbGF5YmFjayBwcml2YXRlIGZsYWcuCisJICBVc2UgZmxhZyB0byBkZWNpZGUgb24gd2hldGhlciB0byBzZXQgY2FwdHVyZSBvciBwbGF5YmFjayB2b2x1bWVzCisJICBvciBzd2l0Y2hlcy4gVXNlIHBsYXliYWNrIGFuZCByZWNvcmQgc3dpdGNoZXMuCisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvbWl4ZXItbWFyc2hhbC5saXN0OgorCSogZ3N0LWxpYnMvZ3N0L21peGVyL21peGVyLmM6IChnc3RfbWl4ZXJfY2xhc3NfaW5pdCksCisJKGdzdF9taXhlcl9zZXRfb3B0aW9uKSwgKGdzdF9taXhlcl9nZXRfb3B0aW9uKSwKKwkoZ3N0X21peGVyX211dGVfdG9nZ2xlZCksIChnc3RfbWl4ZXJfcmVjb3JkX3RvZ2dsZWQpLAorCShnc3RfbWl4ZXJfdm9sdW1lX2NoYW5nZWQpLCAoZ3N0X21peGVyX29wdGlvbl9jaGFuZ2VkKToKKwkqIGdzdC1saWJzL2dzdC9taXhlci9taXhlci5oOgorCSogZ3N0LWxpYnMvZ3N0L21peGVyL21peGVyb3B0aW9ucy5jOiAoZ3N0X21peGVyX29wdGlvbnNfZ2V0X3R5cGUpLAorCShnc3RfbWl4ZXJfb3B0aW9uc19jbGFzc19pbml0KSwgKGdzdF9taXhlcl9vcHRpb25zX2luaXQpLAorCShnc3RfbWl4ZXJfb3B0aW9uc19kaXNwb3NlKToKKwkqIGdzdC1saWJzL2dzdC9taXhlci9taXhlcm9wdGlvbnMuaDoKKwkgIEFkZCBHc3RNaXhlck9wdGlvbnMuCisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuYzogKGdzdF9vc3NlbGVtZW50X2NsYXNzX3Byb2JlX2RldmljZXMpOgorCSAgUmVuYW1lIEF1ZGlvIE1peGVyIHRvIE9TUyBNaXhlciAoc2ltaWxhciB0byBBbHNhIE1peGVyKS4gRml4CisJICBicm9rZW4gZGV2aWNlIGRldGVjdGlvbiBvbiBjb21wdXRlcnMgd2l0aCBtdWx0aXBsZSBPU1Mgc291bmQKKwkgIGNhcmRzLgorCisyMDA0LTA1LTI2ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6IChnc3RfYXVkaW9fY29udmVydF9maXhhdGUpOgorCSAgZml4YXRlIG5pY2VseSBldmVuIHdoZW4gdGhlIHBlZXIgaXMgbm90IG5lZ290aWF0aW5nCisKKzIwMDQtMDUtMjUgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzoKKwkoZ3N0X2F1ZGlvX2NvbnZlcnRfcGFyc2VfY2Fwcyk6CisJICBtYWtlIHN1cmUgd2UgZG9uJ3QgYWxsb3cgZGVwdGggPiB3aWR0aAorCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogKGdzdF9hdWRpb19jb252ZXJ0X2ZpeGF0ZSk6CisJICBmaXhhdGUgZW5kaWFubmVzcyB0byBHX0JZVEVfT1JERVIgYXMgZGVmYXVsdAorCSogZ3N0L2F1ZGlvc2NhbGUvZ3N0YXVkaW9zY2FsZS5jOgorCSAgd2UgZG9uJ3QgaGFuZGxlIGFub3RoZXIgZW5kaWFubmVzcyBhcyBob3N0LWVuZGlhbm5lc3MKKworMjAwNC0wNS0yNSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9tZW0uYzogIG1hbGxvYygpIGlzIGluIHN0ZGxpYi5oLCBub3QgbWFsbG9jLmgKKworMjAwNC0wNS0yNCAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvdm9yYmlzL29nZ3ZvcmJpc2VuYy5jOiAoZ3N0X29nZ3ZvcmJpc2VuY19zaW5rY29ubmVjdCksCisJKGdzdF9vZ2d2b3JiaXNlbmNfc2V0dXApOgorCSAgcHJvcGVybHkgZmFpbCB3aGVuIHdlIGNhbid0IHNldHVwIHRoZSB2b3JiaXMgZW5jb2RlciBkdWUgdG8KKwkgIHVuc3VwcG9ydGVkIHNldHRpbmdzCisJKiBleHQvdm9yYmlzL3ZvcmJpc2VuYy5jOiAoZ3N0X3ZvcmJpc2VuY19zaW5rY29ubmVjdCksCisJKGdzdF92b3JiaXNlbmNfc2V0dXApOgorCSAgc2FtZQorCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogKGdzdF9hdWRpb19jb252ZXJ0X2xpbmspOgorCSAgZml4IGNhc2Ugd2hlcmUgd2FybmluZ3Mgb2NjdXJlZCB3aGVuIG9uZSBwYWQgd2FzIHVubGlua2VkIHdoaWxlIHRoZQorCSAgb3RoZXIncyBsaW5rIGZ1bmN0aW9uIHdhcyBjYWxsZWQKKworMjAwNC0wNS0yNCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L3RjcC9NYWtlZmlsZS5hbToKKyAgICAgICAgICB1c2UgR1NUX0VOQUJMRV9ORVcKKworMjAwNC0wNS0yNCAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBnc3QtbGlicy9nc3QvcmVzYW1wbGUvcHJpdmF0ZS5oOgorCSAgZG9uJ3QgdXNlIG9wdGltaXphdGlvbnMgdGhhdCBhcmUgI2lmIDAnZWQKKworMjAwNC0wNS0yNCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSk6CisJRml4IHBvdGVudGlhbCBkaXZpc2lvbiBieSB6ZXJvIGVycm9yIGFuZCBob3BlZnVsbHkgZ2V0CisJdGhlIHBvc2l0aW9uIHF1ZXJ5IHJpZ2h0IHRvIGdldCBjb3JyZWN0IHRpbWVzdGFtcHMgb24gYXZpCisJYXVkaW8uCisKKzIwMDQtMDUtMjQgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdmlkZW9zY2FsZS92aWRlb3NjYWxlLmM6IChnc3RfdmlkZW9zY2FsZV9zY2FsZV9uZWFyZXN0KSwKKwkoZ3N0X3ZpZGVvc2NhbGVfc2NhbGVfbmVhcmVzdF9zdHIyKSwKKwkoZ3N0X3ZpZGVvc2NhbGVfc2NhbGVfbmVhcmVzdF9zdHI0KSwKKwkoZ3N0X3ZpZGVvc2NhbGVfc2NhbGVfbmVhcmVzdF8zMmJpdCksCisJKGdzdF92aWRlb3NjYWxlX3NjYWxlX25lYXJlc3RfMjRiaXQpLAorCShnc3RfdmlkZW9zY2FsZV9zY2FsZV9uZWFyZXN0XzE2Yml0KToKKwlGaXggdGhlIHNjYWxpbmcgYWxnb3JpdGhtIGFuZCBhdm9pZCBhIGJ1ZmZlciBvdmVyZmxvdy4KKyAgICAgICAgcmVtb3ZlZCB0aGUgd2hpbGUgbG9vcCBpbiB0aGUgc2NhbGluZyBmdW5jdGlvbiBhcyBpdAorCXdhcyB1c2VkIGZvciBwb2ludCBzYW1wbGluZyBvbmx5LgorCisyMDA0LTA1LTI0ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChnc3RfaWQzX3RhZ19nZXRfdHlwZSksCisJKGdzdF9pZDNfdGFnX2NsYXNzX2luaXQpLCAoZ3N0X2lkM190YWdfaW5pdCksCisJKGdzdF9pZDNfdGFnX3NldF9wcm9wZXJ0eSksIChnc3RfaWQzX3RhZ19nZXRfdGFnX3RvX3JlbmRlciksCisJKGdzdF9pZDNfdGFnX2hhbmRsZV9ldmVudCksIChnc3RfaWQzX3RhZ19kb19jYXBzX25lZ28pLAorCShnc3RfaWQzX3RhZ19zZW5kX3RhZ19ldmVudCk6CisJICBsb3RzIG9mIGZpeGVzIHRvIG1ha2UgaWQzbXV4IHdvcmsgYW5kIGlkM2RlbXV4IHdvcmsgY29ycmVjdGx5CisKKzIwMDQtMDUtMjQgIFN0ZXBoYW5lIExvZXVpbGxldCA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkgIGFkZCBydWxlcyB0byBidWlsZCBzaG91dDJzZW5kICh3YXMgcmVtb3ZlZCBieSBhY2NpZGVudAorCSAgd2hlbiB0aGlzIG1vZHVsZSB3YXMgbm8gbW9yZSBtYXJrZWQgZXhwZXJpbWVudGFsL2Jyb2tlbikKKworMjAwNC0wNS0yNCAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuaDoKKwkgIGFkZGluZyBhICJjb25uZWN0aW9uIHByb2JsZW0iIHNpZ25hbCB0byBzaG91dDJzZW5kCisJICAoZml4ZXMgIzE0Mjk1NCkKKworMjAwNC0wNS0yMSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L2tpby9raW9yZWNlaXZlci5jcHA6CisJKiBleHQva2lvL2tpb3JlY2VpdmVyLmg6CisgICAgICAgICAgZml4IHNpZ24gY29tcGFyaXNvbiBpc3N1ZXMKKworMjAwNC0wNS0yMSAgU3RlcGhhbmUgTG9ldWlsbGV0IDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZ3N0L2NkeGFwYXJzZS9nc3RjZHhhcGFyc2UuYzoKKwkqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXBhcnNlLmg6CisJICBzb21lIHJlbmFtaW5nCisJICBhZGQgc29tZSBjaGVja3Mvc2FuaXR5CisJICBwcmVwYXJlIGZvciBzZWVrIGFkZGl0aW9uCisKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpby5jOgorCSAgcmVtb3ZlIGV4cG9ydGVkIGR1cGUgaW5pdCBmdW5jdGlvbgorCisyMDA0LTA1LTIxICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOiAoZ3N0X2R2ZGVjX2luaXQpLCAoZ3N0X2R2ZGVjX2dldF9mb3JtYXRzKSwKKwkoZ3N0X2R2ZGVjX3NyY19jb252ZXJ0KSwgKGdzdF9kdmRlY19zaW5rX2NvbnZlcnQpOgorCSAgRml4IGZvcm1hdCBjb252ZXJzaW9uIGFuZCBwb3NpdGlvbiBxdWVyeWluZy4KKwkqIGdzdC9kZWJ1Zy9wcm9ncmVzc3JlcG9ydC5jOiAoZ3N0X3Byb2dyZXNzcmVwb3J0X3JlcG9ydCk6CisJICBEb24ndCBvdXRwdXQgYSBib2d1cyB0b3RhbCB2YWx1ZSB0aGF0IHdlIGRpZG4ndCBxdWVyeS4KKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfZ2V0X3h2X3N1cHBvcnQpOgorCSAgQWx3YXlzIHNldCBYVl9BVVRPUEFJTlRfQ09MT1JLRVkgdG8gdHJ1ZS4gRml4ZXMgeHZpbWFnZXNpbmsgc2hvd2luZworCSAgb25seSBhIGJsYW5rIHdpbmRvdyBhZnRlciB4aW5lIGhhcyBiZWVuIHVzZWQuCisKKzIwMDQtMDUtMjEgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgKGF0KSBhcGVzdGFhcnQgKGRvdCkgb3JnPgorCisJKiBtNC9hcy1hcnRzLm00OgorCSAgc3luYyB3aXRoIHVwc3RyZWFtIHZlcnNpb24gdG8gZml4IHRlc3Qgb24gRkMyCisJICByZWFkZCB3aXRoIC1rbyB0byBwcmVzZXJ2ZSBJZCBoZWFkZXIKKworMjAwNC0wNS0yMCAgU3RlcGhhbmUgTG9ldWlsbGV0IDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogY29uZmlndXJlLmFjOgorCSAgdGVzdCBmb3IgRklPTlJFQUQgaW9jdGwgaW4gc3lzL2ZpbGlvLmggZm9yIFNvbGFyaXMgY29tcGF0LgorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzcmMuYzogaWRlbQorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzaW5rLmM6IGlkZW0KKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc3JjLmM6IGlkZW0KKwkqIG00L2dzdC1maW9ucmVhZC5tNDogaWRlbQorCisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW8uYzogY2hhbmdlIGNhdGVnb3J5IHRvIFNpbmsvQXVkaW8KKworCSogY29uZmlndXJlLmFjOiBlbmFibGUgc3BlZXggcGx1Z2luIGZvciBzcGVleCAxLjEuNSsKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiBmaXggY2FzdCB3YXJuaW5nCisKKwkqIGV4dC9lc2QvUkVBRE1FOiBmaXggdHlwbworCisyMDA0LTA1LTIwICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogTWlub3IgY29zbWV0aWMgY2hhbmdlIHRvIGNvbnZpbmNlIHRoZSBidWlsZGJvdCB0bworCXJlYXV0b2dlbi4KKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpby5jOiAoZ3N0X3N1bmF1ZGlvc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X3N1bmF1ZGlvc2lua19pbml0KSwgKGdzdF9zdW5hdWRpb3NpbmtfZ2V0Y2FwcyksCisJKGdzdF9zdW5hdWRpb3NpbmtfcGFkX2xpbmspLCAoZ3N0X3N1bmF1ZGlvc2lua19jaGFpbiksCisJKGdzdF9zdW5hdWRpb3Npbmtfc2V0cGFyYW1zKSwgKGdzdF9zdW5hdWRpb3Npbmtfb3BlbiksCisJKGdzdF9zdW5hdWRpb3NpbmtfY2xvc2UpLCAoZ3N0X3N1bmF1ZGlvc2lua19jaGFuZ2Vfc3RhdGUpLAorCShnc3Rfc3VuYXVkaW9zaW5rX3NldF9wcm9wZXJ0eSksIChnc3Rfc3VuYXVkaW9zaW5rX2dldF9wcm9wZXJ0eSk6CisJTW9yZSBoYWNraW5nLiAgUGxheXMgYXVkaW8gbm93LgorCisyMDA0LTA1LTIwICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHN5cy9NYWtlZmlsZS5hbToKKworMjAwNC0wNS0yMCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBzeXMvb3N4YXVkaW8vTWFrZWZpbGUuYW06ICBOZXcgT1MgWCBhdWRpbyBwbHVnaW4gYnkgWmFoZWVyIEFiYmFzIE1lcmFsaQorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9lbGVtZW50LmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9lbGVtZW50Lmg6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmg6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5oOgorCisyMDA0LTA1LTIwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvdm9yYmlzL3ZvcmJpc2VuYy5jOiAoZ3N0X3ZvcmJpc2VuY19zZXRfaGVhZGVyX29uX2NhcHMpLAorCShnc3Rfdm9yYmlzZW5jX2NoYWluKToKKyAgICAgICAgICBwdXQgdGhlIGNvZGVjIGhlYWRlcnMgb24gdGhlIGNhcHMgYXMgc3RyZWFtaGVhZGVyIGFzIHdlbGwgYXMKKyAgICAgICAgICBwdXNoaW5nIHRoZW0gb3V0CisKKzIwMDQtMDUtMjAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC92b3JiaXMvdm9yYmlzZW5jLmM6ICh2b3JiaXNfZ3JhbnVsZV90aW1lX2NvcHkpLAorCShnc3Rfdm9yYmlzZW5jX2J1ZmZlcl9mcm9tX3BhY2tldCksIChnc3Rfdm9yYmlzZW5jX3B1c2hfYnVmZmVyKSwKKwkoZ3N0X3ZvcmJpc2VuY19wdXNoX3BhY2tldCksIChnc3Rfdm9yYmlzZW5jX2NoYWluKToKKyAgICAgICAgc3BsaXQgdXAgcHVzaF9wYWNrZXQgaW50byB0d28gZnVuY3Rpb25zCisKKzIwMDQtMDUtMjAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC90Y3AvLmN2c2lnbm9yZToKKwkgIGlnbm9yZSBlbnVtcworCSogZ3N0L3RjcC9NYWtlZmlsZS5hbToKKwkqIGdzdC90Y3AvUkVBRE1FOgorCSogZ3N0L3RjcC9nc3R0Y3AuYzoKKwkqIGdzdC90Y3AvZ3N0dGNwLmg6CisJKiBnc3QvdGNwL2dzdHRjcGNsaWVudHNpbmsuYzoKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c2luay5oOgorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzcmMuYzoKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c3JjLmg6CisJKiBnc3QvdGNwL2dzdHRjcHBsdWdpbi5jOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzaW5rLmM6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNpbmsuaDoKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc3JjLmM6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNyYy5oOgorICAgICAgICAgIGFkZCBuZXcgdGNwIGVsZW1lbnRzCisKKzIwMDQtMDUtMTkgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvbGF3L211bGF3LWNvbnZlcnNpb24uYzogKG11bGF3X2VuY29kZSk6CisJRml4IG92ZXJmbG93IGJ1ZyBpbiB1bGF3IGVuY29kaW5nLgorCisyMDA0LTA1LTE5ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX2hhbmRsZV9ldmVudCk6CisJICBkb24ndCB1bnJlZiB0aGUgZXZlbnQgdHdpY2UKKworMjAwNC0wNS0xOSAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBjb25maWd1cmUuYWM6CisJICByZW1vdmUgLVduby1zaWduLWNvbXBhcmUKKworMjAwNC0wNS0xOSAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBjb25maWd1cmUuYWM6CisJICByZW1vdmUgLURHX0RJU0FCTEVfREVQUkVDQVRFRC4gSXQncyBub3QgdXNhYmxlIHdpdGhvdXQgd29ya2Fyb3VuZHMKKwkgIGlmIHlvdSB3YW50IHRvIHdvcmsgYWdhaW5zdCBnbGliIDIuMiBhbmQgMi40CisKKzIwMDQtMDUtMTkgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC90Y3AvTWFrZWZpbGUuYW06CisJKiBnc3QvdGNwL2dzdHRjcC5jOgorCSogZ3N0L3RjcC9nc3R0Y3AuaDoKKwkqIGdzdC90Y3AvZ3N0dGNwc2luay5oOgorCSogZ3N0L3RjcC9nc3R0Y3BzcmMuaDoKKyAgICAgICAgICBnc3R0Y3AgLT4gZ3N0dGNwcGx1Z2luICsgQ1ZTIHN1cmdlcnkgaW4gcHJlcGFyYXRpb24gZm9yIHRjcCBtZXJnZQorCisyMDA0LTA1LTE5ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC9kZWJ1Zy90ZXN0cy5jOiAobWQ1X2dldF92YWx1ZSk6CisJICBmaXggc2VnZmF1bHQgb24gZ3N0LWluc3BlY3QKKworMjAwNC0wNS0xOSAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBnc3QvZGVidWcvdGVzdHBsdWdpbi5jOgorCSogZ3N0L2RlYnVnL3Rlc3RzLmM6CisJKiBnc3QvZGVidWcvdGVzdHMuaDoKKwkgIGFkZCBuZXcgZXh0ZW5zaWJsZSBhbmQgY29uZmlndXJhYmxlIHRlc3RpbmcgZWxlbWVudC4gQ3VycmVudCB0ZXN0cworCSAgaW5jbHVkZSBidWZmZXIgY291bnQsIHN0cmVhbSBsZW5ndGgsIHRpbWVzdGFtcC9kdXJhdGlvbiBtYXRjaGluZyBhbmQKKwkgIG1kNS4KKwkqIGdzdC9kZWJ1Zy9NYWtlZmlsZS5hbToKKwkqIGdzdC9kZWJ1Zy9nc3RkZWJ1Zy5jOiAocGx1Z2luX2luaXQpOgorCSAgYWRkIGluZnJhc3RydWN0dXJlIGZvciBuZXcgZWxlbWVudAorCisyMDA0LTA1LTE5ICBKb2hhbiBEYWhsaW4gIDxqb2hhbkBnbm9tZS5vcmc+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jIChnc3RfZHZkZWNfcXVhbGl0eV9nZXRfdHlwZSk6IEFkZCBwcm9wZXIKKwllbmRpbmcgb2YgdGhlIGFycmF5LiBGaXhlcyBnc3QtaW5zcGVjdCBzZWdmYXVsdCBvbiBwcGMuCisKKzIwMDQtMDUtMTkgIFN0ZXBoYW5lIExvZXVpbGxldCA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGV4dC9kaXJhYy9nc3RkaXJhY2RlYy5jYyA6IGNoYW5nZSBjYXRlZ29yeSB0byBDb2RlYy9EZWNvZGVyL1ZpZGVvCisKKwkqIG00L2E1Mi5tNCA6IGRvbid0IGZpeCBhIHRlc3QgdGhhdCBzaG91bGQgZmFpbCB3aXRoIGN1cnJlbnQgYTUyZGVjIGxpYgorCisyMDA0LTA1LTE4ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2ltZ2NvbnZlcnQuYzogKGltZ19jb252ZXJ0KTogRml4ZXMgZm9yCisJd2FybmluZ3MgKGJ1Z3MsIGFjdHVhbGx5KSBub3RpY2VkIGJ5IGdjYyBidXQgbm90IGZvcnRlLgorCisyMDA0LTA1LTE4ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIHN5cy9zdW5hdWRpby9NYWtlZmlsZS5hbToKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpby5jOiBOZXcgc3VuYXVkaW9zaW5rCisKKzIwMDQtMDUtMTggIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3F0ZGVtdXhfbG9vcF9oZWFkZXIpOiAgUGF0Y2ggZnJvbSBkY21AYWNtLm9yZyAoRGF2aWQgTW9vcmUpCisJdG8gYWxsb3cgcXRkZW11eCB0byB1c2Ugbm9uLXNlZWthYmxlIHN0cmVhbXMuIChidWcgIzE0MjI3MikKKworMjAwNC0wNS0xOCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QtbGlicy9nc3QvcmVzYW1wbGUvcmVzYW1wbGUuYzogKGdzdF9yZXNhbXBsZV9zaW5jX2Z0X3MxNiksCisJKGdzdF9yZXNhbXBsZV9zaW5jX2Z0X2Zsb2F0KTogUmVtb3ZlIHVzZSBvZiBzdGF0aWMgdGVtcG9yYXJ5CisJYnVmZmVyLiAgVGhpcyBjb2RlIHdhcyBvYnZpb3VzbHkgbm90IHN1cHBvc2VkIHRvIGxhc3QgbG9uZywgYnV0CisJaXQncyBzdHVjayBpbiBvdXIgQUJJLCBzbyBpdCByZXF1aXJlZCBhIGxpdHRsZSBoYWNrIHRvIG1ha2UgaXQKKwlBQkktY29tcGF0aWJsZS4gIEZpeGVzICMxNDI1ODUuCisJKiBnc3QtbGlicy9nc3QvcmVzYW1wbGUvcmVzYW1wbGUuaDogc2FtZS4KKworMjAwNC0wNS0xOCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBjb25maWd1cmUuYWM6IEFkZCBzdW5hdWRpbworCSogZXhhbXBsZXMvTWFrZWZpbGUuYW06IG1ha2UgZ3N0cGxheSBkZXBlbmQgb24gZ2NvbmYKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvZGVjbWFwLmM6IFJlbW92ZSBjOTktaXNtcworCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvaW1nY29udmVydC5jOiAoYnVpbGRfcmdiX3BhbGV0dGUpLAorCShjb252ZXJ0X3RhYmxlX2xvb2t1cCksIChpbWdfY29udmVydCk6IHJlbW92ZSBjOTktaXNtcworCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvaW1nY29udmVydF90ZW1wbGF0ZS5oOiBtYWtlIGEgY29uc3RhbnQKKyAgICAgICAgICB1bnNpZ25lZCwgdG8gZml4IGEgd2FybmluZyBvbiBTb2xhcmlzCisJKiBnc3QvbXBlZzFzeXMvc3lzdGVtcy5jOiBiY29weS0+bWVtY3B5CisJKiBnc3QvcnRqcGVnL1JUanBlZy5jOiAoUlRqcGVnX3l1dnJnYjgpOiBiY29weS0+bWVtY3B5CisJKiBzeXMvTWFrZWZpbGUuYW06IEFkZCBzdW5hdWRpbworCisyMDA0LTA1LTE4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L29nZy9nc3RvZ2dtdXguYzogKGdzdF9vZ2dfbXV4X2dldF90eXBlKSwgKGdzdF9vZ2dfbXV4X2luaXQpLAorCShnc3Rfb2dnX211eF9zaW5rY29ubmVjdCksIChnc3Rfb2dnX211eF9yZXF1ZXN0X25ld19wYWQpLAorCShnc3Rfb2dnX211eF9uZXh0X2J1ZmZlciksIChnc3Rfb2dnX211eF9wdXNoX3BhZ2UpLAorCShnc3Rfb2dnX211eF9jb21wYXJlX3BhZHMpLCAoZ3N0X29nZ19tdXhfcXVldWVfcGFkcyksCisJKGdzdF9vZ2dfbXV4X2xvb3ApOgorCUZpeCBhbiB1Z2x5IG1lbWxlYWsgd2hlcmUgdGhlIG11eGVyIGRpZG4ndCBmbHVzaCBlbm91Z2ggb2dnCisJcGFnZXMuIFRoaXMgYWxzbyByZXN1bHRlZCBpbiBiYWRseSBtdXhlZCBvZ2cgZmlsZXMuCisKKzIwMDQtMDUtMTggIFN0ZXBoYW5lIExvZXVpbGxldCA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGdzdC9hc2ZkZW11eC9hc2ZoZWFkZXJzLmMgOgorCSogZ3N0L2FzZmRlbXV4L2FzZmhlYWRlcnMuaCA6CisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYyA6CisJICAtIGZpeCBBU0ZfT0JKX1BBRERJTkcgZ3VpZAorCSAgLSBhZGQgMyBuZXcgb2JqZWN0IGd1aWRzIChsYW5ndWFnZSBsaXN0LCBtZXRhZGF0YSwKKyAgICAgICAgICAgIGV4dGVuZGVkIHN0cmVhbSBwcm9wZXJ0aWVzKQorICAgICAgICAgIC0gYWRkIGEgZnVuY3Rpb24gdG8gcGFyc2UgZXh0ZW5kZWQgaGVhZGVyIG9iamVjdHMKKworMjAwNC0wNS0xOCAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuYzogKGdzdF9vc3NlbGVtZW50X3N5bmNfcGFybXMpOgorCSAgcmVtb3ZlIGxlZnRvdmVyIGRlYnVnZ2luZyBnX3ByaW50CisKKzIwMDQtMDUtMTcgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX2hhbmRsZV9ldmVudCk6CisJICBGaXggZm9yIHdoZW4gdGhlIGZpcnN0IGZvcm1hdCBpbiBhIGRpc2NvbnQgZXZlbnQgaXMgbm90IGEKKwkgIGJ5dGUtYmFzZWQgb25lLiBTaG91bGQgZml4ICMxMzc3MTAuCisKKzIwMDQtMDUtMTggIFN0ZXBoYW5lIExvZXVpbGxldCA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIG00L2E1Mi5tNCA6IGZpeCBjb21waWxhdGlvbiB3aXRoIC1XYWxsIC1XZXJyb3IKKwkqIG00L2xpYmZhbWUubTQgOiBpZGVtCisJKiBtNC9saWJtaWttb2QubTQgOiBpZGVtCisKKzIwMDQtMDUtMTcgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6IChnc3RfYXNmX2RlbXV4X3Byb2Nlc3NfY29tbWVudCk6CisJICBzaWduYWwgdGhlIG5ldyB0YWdzIGJlZm9yZSBnaXZpbmcgdXAgdGhlIHJlZmVyZW5jZQorCisyMDA0LTA1LTE3ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmM6CisJICB1c2UgYXBwbGljYXRpb24vb2dnIGluc3RlYWQgb2YgYXBwbGljYXRpb24veC1vZ2cgKHBhdGNoIGJ5IFBhdHJpY2sKKwkgIEd1aW1vbmQsIGZpeGVzICMxNDI0MzIpCisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuYzogKGdzdF9vc3NlbGVtZW50X3Jlc2V0KSwKKwkoZ3N0X29zc2VsZW1lbnRfc3luY19wYXJtcyk6CisJICBkb24ndCBzZXQgZnJhZ21lbnQgc2l6ZSB1bmxlc3Mgc3BlY2lmaWVkIChmaXhlcyAjMTQyNDkzKQorCisyMDA0LTA1LTE3ICBTdGVwaGFuZSBMb2V1aWxsZXQgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBjb25maWd1cmUuYWMgOiBmaXggY29tcGlsYXRpb24gb2YgdjRsMnNyYyB3aXRoICItV2FsbCAtV2Vycm9yIgorCSAgZml4ZXMgIzE0MjY2NAorCisyMDA0LTA1LTE3ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChnc3RfaWQzX3RhZ19jaGFpbik6CisJICBjb21wdXRlIG9mZnNldHMgY29ycmVjdGx5IGZvciBpbnRlcm5hbCBidWZmZXJzIHNvIHRpbWVzdGFtcHMgYXJlIHNldAorCSAgY29ycmVjdGx5IHdoZW4gd2UgY2FuJ3Qgc2Vlay4gQWxzbyBoYW5kbGUgY2FzZXMgd2hlcmUgdGhlcmUgYXJlIG5vCisJICBvZmZzZXRzLiAoYmFzZWQgb24gYSBwYXRjaCBieSBEYXZpZCBNb29yZSwgZml4ZXMgIzE0MjUwNykKKworMjAwNC0wNS0xNyAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvYWxzYS9nc3RhbHNhc2luay5jOiAoZ3N0X2Fsc2Ffc2lua19sb29wKToKKwkgIHVzZSBjb3JyZWN0IHZhcmlhYmxlIHdoZW4gZGV0ZXJtaW5pbmcgYW1vdW50IG9mIGRhdGEgdG8gc2tpcCBzbyB3ZQorCSAgZG9uJ3Qgc2tpcCBpbnRvIHRoZSB2b2lkIGFuZCBzZWdmYXVsdAorCisyMDA0LTA1LTE2ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOiAoZ3N0X2FzZl9kZW11eF9hdWRpb19jYXBzKToKKwkgIEhpLCBJJ20gYSBtZW1sZWFrCisKKzIwMDQtMDUtMTYgIFN0ZXBoYW5lIExvZXVpbGxldCA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOgorCSAgLSBmaXggYSBtZW0gbGVhayBhbmQgYWx3YXlzIHByb3BhZ2F0ZSB0YWdzCisJICAtIGFkZCBXTVYzIHRvIGtub3duIHZpZGVvIGNvZGVjcyAoYnV0IG5vIGRlY29kZXIgeWV0KQorCSAgLSByZXBsYWNlICJzdXJwbHVzIGRhdGEiIGF0IGVuZCBvZiBhdWRpbyBoZWFkZXIgZm9yIHdoYXQKKwkgICAgaXQgaXMgOiBjb2RlYyBzcGVjaWZpYyBkYXRhCisJICAtIGZpeCBhIHR5cG8KKworMjAwNC0wNS0xNiAgQXJ3ZWQgdi4gTWVya2F0eiAgPHYubWVya2F0ekBnbXgubmV0PgorCisJcmV2aWV3ZWQgYnk6IFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9hdWRpby9hdWRpb2Nsb2NrLmM6CisJICBGaXggd3JvbmcgcmV0dXJuIHR5cGUgKCMxNDIyMDUpLgorCisyMDA0LTA1LTE2ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9jbGFzc19pbml0KSwgKGdzdF9tYWRfaW5pdCk6CisJICBJZ25vcmUgQ1JDcyBieSBkZWZhdWx0IChmaXhlcyAjMTQyNTY2KS4KKworMjAwNC0wNS0xNiAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVyLmM6IChnc3RfYWxzYV9taXhlcl9vcGVuKSwKKwkoZ3N0X2Fsc2FfbWl4ZXJfY2xvc2UpLCAoZ3N0X2Fsc2FfbWl4ZXJfc3VwcG9ydGVkKSwKKwkoZ3N0X2Fsc2FfbWl4ZXJfYnVpbGRfbGlzdCksIChnc3RfYWxzYV9taXhlcl9mcmVlX2xpc3QpLAorCShnc3RfYWxzYV9taXhlcl9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X2Fsc2FfbWl4ZXJfbGlzdF90cmFja3MpLAorCShnc3RfYWxzYV9taXhlcl9nZXRfdm9sdW1lKSwgKGdzdF9hbHNhX21peGVyX3NldF92b2x1bWUpLAorCShnc3RfYWxzYV9taXhlcl9zZXRfbXV0ZSksIChnc3RfYWxzYV9taXhlcl9zZXRfcmVjb3JkKToKKwkgIEZpeCBmb3IgY2FzZXMgd2hlcmUgd2UgZmFpbCB0byBhdHRhY2ggdG8gYSBtaXhlci4KKworMjAwNC0wNS0xNiAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6IChnc3RfcmlmZl9yZWFkX3NlZWspOgorCSAgRG9uJ3QgdG91Y2ggZXZlbnRzIGFmdGVyIG5vdCBvd25pbmcgdGhlbSBhbnltb3JlLgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfYmFzZV9pbml0KSwKKwkoZ3N0X3dhdnBhcnNlX2ZtdCksIChnc3Rfd2F2cGFyc2Vfb3RoZXIpLAorCShnc3Rfd2F2cGFyc2VfaGFuZGxlX3NlZWspLCAoZ3N0X3dhdnBhcnNlX2xvb3ApLAorCShnc3Rfd2F2cGFyc2VfcGFkX2NvbnZlcnQpLCAoZ3N0X3dhdnBhcnNlX3BhZF9xdWVyeSksCisJKGdzdF93YXZwYXJzZV9zcmNwYWRfZXZlbnQpOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICBBZGQgc2Vla2luZywgZml4IHF1ZXJ5aW5nLgorCisyMDA0LTA1LTE2ICBTdGVwaGFuZSBMb2V1aWxsZXQgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKGdzdF9hc2ZfZGVtdXhfcHJvY2Vzc19jb21tZW50KToKKwkgIC0gcHJvY2VzcyBjb21tZW50cyBldmVuIGlmIHRoZXkgZG9uJ3QgZW5kIHdpdGggXDBcMAorICAgICAgICAgICAgZ19jb252ZXJ0IHdvdWxkIGlnbm9yZSB0aGVtIGlmIHByZXNlbnQgYW5kIHdvcmtzIHdlbGwgd2l0aG91dCB0aGVtCisKKzIwMDQtMDUtMTYgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfY2FwcyksIChnc3RfYWxzYV9nZXRfY2Fwcyk6CisJICBzaW1wbGlmeSBjYXBzCisKKzIwMDQtMDUtMTYgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6IChnc3RfYXNmX2RlbXV4X3Byb2Nlc3NfY29tbWVudCk6CisJICBkb24ndCB3cml0ZSB0byBtZW1vcnkgd2UgbWlnaHQgbm90IHdyaXRlIHRvIC0gZ19jb252ZXJ0IGRvZXMgdGhhdAorCSAgZm9yIHVzIGFueXdheSAoZml4ZXMgIzE0MjYxMykKKwkoZ3N0X2FzZl9kZW11eF9hdWRpb19jYXBzKToKKwkgIGNvbW1lbnQgb3V0IGdzdF91dGlsX2R1bXBfbWVtCisKKzIwMDQtMDUtMTYgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuYzogKGdzdF9hbHNhX3NpbmtfbG9vcCk6CisJICBjb21wdXRlIGNvcnJlY3QgZXhwZWN0ZWQgdGltZXN0YW1wcyBhZnRlciBzZWVrIChicm9rZW4gc2luY2UKKwkgIGxhc3QgY29tbWl0KQorCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuYzogKHBpeGJ1ZnNjYWxlX2luaXQpOgorCSAgcmVuYW1lIGVsZW1lbnQgYW5kIGRlYnVnZ2luZyBjYXRlZ29yeSB0byBnZGtwaXhidWZzY2FsZQorCisyMDA0LTA1LTE2ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2xvb3ApOgorCSAgYWRkIGVycm9yIGNoZWNraW5nIHRvIHNuZF9wY21fZGVsYXkgYW5kIHJlbW92ZSBkdXBsaWNhdGUgY2FsbCB0bworCSAgc25kX3BjbV9kZWxheSB0aGF0IGNhdXNlZCBpc3N1ZXMgKHNlZSBpbmxpbmUgY29kZSBjb21tZW50cykKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2dldF90aW1lKToKKwkgIG1ha2UgbW9yZSByZWFkYWJsZSBhbmQgZml4IHJldHVybiB2YWx1ZSB3aGVuIHNuZF9wY21fZGVsYXkgZmFpbHMKKwkoZml4ZXMgIzE0MjU4NikKKworMjAwNC0wNS0xNSAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3RpLmNvbT4KKwkqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmM6IChnc3RfcGl4YnVmc2NhbGVfbWV0aG9kX2dldF90eXBlKSwKKwkoZ3N0X3BpeGJ1ZnNjYWxlX2dldF90eXBlKSwgKGdzdF9waXhidWZzY2FsZV9iYXNlX2luaXQpLAorCShnc3RfcGl4YnVmc2NhbGVfY2xhc3NfaW5pdCksIChnc3RfcGl4YnVmc2NhbGVfZ2V0Y2FwcyksCisJKGdzdF9waXhidWZzY2FsZV9saW5rKSwgKGdzdF9waXhidWZzY2FsZV9pbml0KSwKKwkoZ3N0X3BpeGJ1ZnNjYWxlX2hhbmRsZV9zcmNfZXZlbnQpLCAocGl4YnVmc2NhbGVfc2NhbGUpLAorCShnc3RfcGl4YnVmc2NhbGVfY2hhaW4pLCAoZ3N0X3BpeGJ1ZnNjYWxlX3NldF9wcm9wZXJ0eSksCisJKGdzdF9waXhidWZzY2FsZV9nZXRfcHJvcGVydHkpLCAocGl4YnVmc2NhbGVfaW5pdCk6CisJKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5oOgorCUFkZCB0aGVzZSBmaWxlcyBJIGZvcmdvdCBlYXJsaWVyCisKKzIwMDQtMDUtMTUgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKwkqIGV4dC9nZGtfcGl4YnVmL01ha2VmaWxlLmFtOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6IChwbHVnaW5faW5pdCk6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuaDoKKwlBZGQgbmV3IHBpeGJ1ZnNjYWxlIGVsZW1lbnQgdG8gc2NhbGUgUkdCIHZpZGVvCisJdXNpbmcgZ2RrX3BpeGJ1ZiwgYmVjYXVzZSBnZGtfcGl4YnVmIGRvZXMgQklMSU5FQVIKKwlhbmQgSFlQRVIgaW50ZXJwb2xhdGlvbiBjb3JyZWN0bHkuCisJKiBleHQvdGhlb3JhL3RoZW9yYWVuYy5jOiAodGhlb3JhX2VuY19jaGFpbiksCisJRGlzY2FyZCBidWZmZXIgYW5kIHJldHVybiBpZiBleHBsaWNpdCBjYXBzIGNvdWxkIG5vdCBiZSBzZXQKKwkodGhlb3JhX2VuY19nZXRfcHJvcGVydHkpOgorCU1ha2UgX2dldCByZXR1cm4ga2JwcyBmb3IgdGhlIGJpdHJhdGUgY29uc2lzdGVudCB3aXRoCisJdGhlIF9zZXQgZnVuY3Rpb24uCisKKworMjAwNC0wNS0xNCAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvbGlidmlzdWFsL3Zpc3VhbC5jOiAoZ3N0X3Zpc3VhbF9jaGFpbik6CisJICBhZGQgbWlzc2luZyB2aXN1YWxfYXVkaW9fYW5hbHl6ZQorCisyMDA0LTA1LTE0ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfY2hhaW4pOiBGaXggY3Jhc2ggd2hlbiBFU0QKKwlpcyBraWxsZWQgd2hpbGUgd2UncmUgcGxheWluZy4KKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2UpOiBjYWxsCisJZ3N0X2VsZW1lbnRfbm9fbW9yZV9wYWRzKCkuCisKKzIwMDQtMDUtMTQgIFN0ZXBoYW5lIExvZXVpbGxldCA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5jIDoKKwkgIC0gZml4IElORk8gdGFnIGV4dHJhY3Rpb24gaW4gUklGRi9BVkkgZmlsZXMKKyAgICAgICAgICAgIGJlY2F1c2UgZ3N0X2V2ZW50X3VucmVmIChldmVudCkgYWxzbyBmcmVlZCB0YWdsaXN0CisgICAgICAgICAgLSBhdm9pZCBhIG1lbSBsZWFrCisKKzIwMDQtMDUtMTMgIFN0ZXBoYW5lIExvZXVpbGxldCA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmMgOiBtb3ZlIGZyb20gIkNvZGVjLyhEZW0vTSl1eGVyIiB0byAiQ29kZWMvKERlbS9NKXV4ZXIvQXVkaW8iCisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jIDogbW92ZSBmcm9tICJDb2RlYy9FbmNvZGVyL0F1ZGlvIiB0byAiQ29kZWMvTXV4ZXIvQXVkaW8iCisKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYyA6CisJICAtIGFkZCBjb2RlIChjb21tZW50ZWQgZm9yIG5vdykgdG8gc3VwcG9ydCBhdWRpby94LWFkcGNtIG9uIHNyYyBwYWQKKwkgICAgKHdlIGhhdmUgbm8gZGVjb2RlciBmb3IgdGhvc2UgbGF5b3V0IHlldCkKKworCSogZ3N0L2NkeGFwYXJzZS9nc3RjZHhhcGFyc2UuYyA6CisJKiBnc3QvY2R4YXBhcnNlL2dzdGNkeGFwYXJzZS5oIDoKKwkgIC0gcGFydGlhbCByZXdyaXRlIHVzaW5nIFJpZmZSZWFkIChyaXBwZWQgaWFpbidzIHdhdnBhcnNlIGNvZGUpCisKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZW5jLmMgOiB0eXBvCisJKiBnc3QvcnRwL2dzdHJ0cGdzbWVuYy5jIDogdHlwbworCisyMDA0LTA1LTEzICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNoZWNrIGZvciBleGFjdCB2ZXJzaW9uIG9mIGxpYnZpc3VhbCwgaXQncyBub3Qgc3VwcG9zZWQgdG8gYmUKKwkgIEFQSS9BQkkgc3RhYmxlIHlldAorCisyMDA0LTA1LTEzICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfZGVtdXhfcHVzaCk6CisJICBzaWduYWwgbm8tbW9yZS1wYWRzCisKKzIwMDQtMDUtMTMgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6IChnc3RfZHZkZWNfc3JjX2NvbnZlcnQpCisJUmVwb3J0IHdoaWNoIGZvcm1hdCB3YXMgdXNlZCBmb3IgR1NUX0ZPUk1BVF9ERUZBVUxUCisJKiBnc3QvZGVidWcvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVidWcvZ3N0ZGVidWcuYzogKHBsdWdpbl9pbml0KToKKwkqIGdzdC9kZWJ1Zy9wcm9ncmVzc3JlcG9ydC5jOiAoZ3N0X3Byb2dyZXNzcmVwb3J0X2Jhc2VfaW5pdCksCisJKGdzdF9wcm9ncmVzc3JlcG9ydF9jbGFzc19pbml0KSwgKGdzdF9wcm9ncmVzc3JlcG9ydF9pbml0KSwKKwkoZ3N0X3Byb2dyZXNzcmVwb3J0X3JlcG9ydCksIChnc3RfcHJvZ3Jlc3NyZXBvcnRfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3Byb2dyZXNzcmVwb3J0X2dldF9wcm9wZXJ0eSksIChnc3RfcHJvZ3Jlc3NyZXBvcnRfY2hhaW4pLAorCShnc3RfcHJvZ3Jlc3NyZXBvcnRfcGx1Z2luX2luaXQpOgorCUFkZCBwcm9ncmVzc3JlcG9ydCBlbGVtZW50IGZvciB0ZXN0aW5nLgorCisyMDA0LTA1LTEzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBzeXMvdjRsL2dzdHY0bHNyYy5jOiAoZ3N0X3Y0bHNyY19nZXQpLCAoZ3N0X3Y0bHNyY19jaGFuZ2Vfc3RhdGUpOgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuaDoKKwkqIHN5cy92NGwvdjRsbWpwZWdzaW5rX2NhbGxzLmM6IChnc3RfdjRsbWpwZWdzaW5rX3BsYXliYWNrX2luaXQpOgorCSogc3lzL3Y0bC92NGxtanBlZ3NyY19jYWxscy5jOiAoZ3N0X3Y0bG1qcGVnc3JjX2NhcHR1cmVfaW5pdCk6CisJKiBzeXMvdjRsL3Y0bHNyY19jYWxscy5jOiAoZ3N0X3Y0bHNyY19jYXB0dXJlX2luaXQpLAorCShnc3RfdjRsc3JjX2dyYWJfZnJhbWUpOgorICAgICAgICAgIGFkZCBtb3JlIGRlYnVnZ2luZworICAgICAgICAgIHNlbmQgYSBkaXNjb250IGF0IHN0YXJ0CisKKzIwMDQtMDUtMTIgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHJlZGhhdC5jb20+CisKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jIChnc3RfYXNmX2RlbXV4X3Byb2Nlc3Nfc2VnbWVudCk6IEF2b2lkCisJaW5mbG9vcGluZyBpZiB3ZSBjYW4ndCBmaW5kIGEgY2h1bmsuICBPciBpbiBvdGhlciB3b3JkcywgZG9uJ3QgYmxvdworCWNodW5rcyBpZiB3ZSBkb24ndCBoYXZlIGEgY2h1bmsgdG8gYmxvdy4KKworMjAwNC0wNS0xMyAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCSogZXh0L2F1ZGlvZmlsZS9nc3RhZnNyYy5jOiAoZ3N0X2Fmc3JjX2dldCk6CisJUmVtb3ZlIG9sZCBkZWJ1ZyBvdXRwdXQKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOiAoZ3N0X2R2ZGVjX3F1YWxpdHlfZ2V0X3R5cGUpLAorCShnc3RfZHZkZWNfY2xhc3NfaW5pdCksIChnc3RfZHZkZWNfbG9vcCksIChnc3RfZHZkZWNfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X2R2ZGVjX3NldF9wcm9wZXJ0eSksIChnc3RfZHZkZWNfZ2V0X3Byb3BlcnR5KToKKwlDaGFuZ2UgdGhlIHF1YWxpdHkgc2V0dGluZyB0byBhbiBlbnVtLCBzbyBpdCB3b3JrcyBmcm9tIGdzdC1sYXVuY2gKKwlEb24ndCByZW5lZ290aWF0ZSBhIG5vbi1saW5rZWQgcGFkLiBBbGxvd3MgYXVkaW8gb25seSBkZWNvZGluZy4KKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOiAoZ3N0X2RlaW50ZXJsYWNlX2dldGNhcHMpLAorCShnc3RfZGVpbnRlcmxhY2VfbGluayksIChnc3RfZGVpbnRlcmxhY2VfaW5pdCk6CisJKiBnc3QvdmlkZW9kcm9wL2dzdHZpZGVvZHJvcC5jOiAoZ3N0X3ZpZGVvZHJvcF9nZXRjYXBzKSwKKwkoZ3N0X3ZpZGVvZHJvcF9saW5rKToKKwlTb21lIGNhcHMgbmVnb3RpYXRpb24gZml4ZXMKKworMjAwNC0wNS0xMiAgU3RlcGhhbmUgTG9ldWlsbGV0IDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZXh0L3Rhcmtpbi9nc3R0YXJraW4uYyA6CisJICAtIENoYW5nZSBSQU5LIGZyb20gTk9ORSB0byBQUklNQVJZCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYyA6CisJICAtIENoYW5nZSBSQU5LIGZyb20gTk9ORSB0byBNQVJHSU5BTAorCSogZXh0L2RpdngvZ3N0ZGl2eGVuYy5jIDoKKwkgIC0gQ2hhbmdlIFJBTksgZnJvbSBQUklNQVJZIHRvIE5PTkUgKGVuY29kZXIvc3BpZGVyIGlzc3VlKQorCisyMDA0LTA1LTEyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvdm9yYmlzL3ZvcmJpc2VuYy5jOiAodm9yYmlzX2dyYW51bGVfdGltZV9jb3B5KSwKKwkoZ3N0X3ZvcmJpc2VuY19wdXNoX3BhY2tldCk6CisgICAgICAgICAgY29weSBhIGZ1bmN0aW9uIHRoYXQgd2FzIGFkZGVkIGJldHdlZW4gMS4wIGFuZCAxLjAuMSB1bnRpbCB3ZQorICAgICAgICAgIGRlcGVuZCBvbiB3b3J0aHdoaWxlIGZlYXR1cmVzIG9mIHBvc3QtMS4wCisKKzIwMDQtMDUtMTIgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogY29uZmlndXJlLmFjOgorCSAgZW5hYmxlIHNob3V0MiBieSBkZWZhdWx0CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOiAoZ3N0X3Nob3V0MnNlbmRfcHJvdG9jb2xfZ2V0X3R5cGUpLAorCShnc3Rfc2hvdXQyc2VuZF9iYXNlX2luaXQpLCAoZ3N0X3Nob3V0MnNlbmRfaW5pdCksCisJKGdzdF9zaG91dDJzZW5kX2Nvbm5lY3QpLCAoZ3N0X3Nob3V0MnNlbmRfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmg6CisJICBtYWtlIHRoaXMgd29yayBhZ2Fpbi4gQmFzZWQgb24gYSBwYXRjaCBieSBaYWhlZXIgQWJiYXMgTWVyYWxpIChmaXhlcworCSAgIzE0MjI2MikKKwkqIGV4dC90aGVvcmEvdGhlb3JhLmM6IChwbHVnaW5faW5pdCk6CisJICBkb24ndCBzZXQgcmFuayBvbiBlbmNvZGVycworCisyMDA0LTA1LTExICBKZXJlbXkgU2ltb24gIDxqZXNpbW9uQGxpYmVydHlzdXJmLmZyPgorCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKGdzdF9hc2ZfZGVtdXhfYXVkaW9fY2Fwcyk6CisJICBVc2UgY29kZWNfZGF0YSBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGZsYWcxIGFuZCBmbGFnMiBmb3Igd21hCisKKzIwMDQtMDUtMTEgIFN0ZXBoYW5lIExvZXVpbGxldCA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXBhcnNlLmMgOgorCSAgLSBBZGQgbXBlZ3ZlcnNpb24gdG8gQ0FQUyB0byBtYWtlIGl0IGxpbmsKKwkgIC0gUmFuayBpcyBhcyBHU1RfUkFOS19TRUNPTkRBUlkgaW5zdGVhZCBvZiBOT05FCisJKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmMgOgorCSAgLSBEb2N1bWVudCBhbGwgYXVkaW8gZW5jb2Rpbmcgd2UgY2FuIGVuY291bnRlciBmcm9tIFNvbGFyaXMgOQorCSAgICBoZWFkZXJzIGFuZCBsaWJzbmRmaWxlIGluZm9ybWF0aW9uLgorCSAgLSBJbmNyZWFzZSBtYXguIHJhdGUgZnJvbSA0ODAwMCB0byAxOTIwMDAgKHRvIG1hdGNoIG90aGVyIGVsZW1lbnRzKQorCSAgLSBEb24ndCB0cnkgdG8gcGxheSBqdW5rIGRhdGEgYmV0d2VlbiBoZWFkZXIgYW5kIHNhbXBsZXMKKworMjAwNC0wNS0xMSAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvbGlidmlzdWFsL3Zpc3VhbC5jOiAoZ3N0X3Zpc3VhbF9nZXRjYXBzKToKKwkgIHVzZSB0aGUgcmlnaHQgY2FwcyBkZXBlbmRpbmcgb24gZW5kaWFubmVzcyAoSSBob3BlKQorCSogZXh0L29nZy9nc3RvZ2dtdXguYzogKGdzdF9vZ2dfbXV4X3BsdWdpbl9pbml0KToKKwkgIHVzZSBHU1RfUkFOS19OT05FIGZvciBhbGwgbm9uLWRlY29kaW5nIGVsZW1lbnRzIG9yIHNwaWRlciBnZXRzCisJICBtaWdodHkgY29uZnVzZWQKKworMjAwNC0wNS0xMSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6IChnc3RfYXNmX2RlbXV4X3Byb2Nlc3NfY29tbWVudCk6CisJICBGaXggc29tZSBvZGQgY2FzZXMgYW5kIGZpeCBCRSBtZXRhZGF0YSBwYXJzaW5nIG9mIHVuaWNvZGUxNiB0ZXh0LgorCisyMDA0LTA1LTExICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC9zd2l0Y2gvZ3N0c3dpdGNoLmM6IChnc3Rfc3dpdGNoX3JlbGVhc2VfcGFkKSwKKwkoZ3N0X3N3aXRjaF9yZXF1ZXN0X25ld19wYWQpLCAoZ3N0X3N3aXRjaF9wb2xsX3NpbmtwYWRzKSwKKwkoZ3N0X3N3aXRjaF9sb29wKSwgKGdzdF9zd2l0Y2hfZ2V0X3R5cGUpOgorCSAgd2hvZXZlciB0aGF0IHdhczogRE8gTk9UIElNUE9SVCBQUklWQVRFIFNZTUJPTFMgVEhBVCBBUkUgTk9UIElOCisJICBIRUFERVJTLiBIYWQgdG8gYmUgc2FpZC4KKworMjAwNC0wNS0xMCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBjb25maWd1cmUuYWM6IEFkZCBwcm90b3R5cGUgRGlyYWMgc3VwcG9ydC4KKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkqIGV4dC9kaXJhYy9NYWtlZmlsZS5hbToKKwkqIGV4dC9kaXJhYy9nc3RkaXJhYy5jYzoKKwkqIGV4dC9kaXJhYy9nc3RkaXJhY2RlYy5jYzoKKworMjAwNC0wNS0xMCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiAoZ3N0X2F1cGFyc2VfY2xhc3NfaW5pdCksCisJKGdzdF9hdXBhcnNlX2luaXQpLCAoZ3N0X2F1cGFyc2VfY2hhaW4pLAorCShnc3RfYXVwYXJzZV9jaGFuZ2Vfc3RhdGUpOgorCSAgSGFjayBhcm91bmQgc3BpZGVyLiBSZW1vdmUgbWUgc29tZSBkYXkgcGxlYXNlLgorCisyMDA0LTA1LTEwICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6IChnc3RfYXVwYXJzZV9jaGFpbik6CisJICBGaXggZm9yIHNvbWUgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgaW4gcHJldmlvdXMgcGF0Y2gsIGFsc28KKwkgIG1ha2VzIGl0IHdvcmsuIEZpeGVzICMxNDIyODYgd2hpbGUgd2UncmUgYXQgaXQuCisKKzIwMDQtMDUtMTEgIFN0ZXBoYW5lIExvZXVpbGxldCA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzoKKwkJZml4ZXMgYS1sYXcsIGFkZHMgbXUtbGF3LCBsaW5lYXIgcGNtICg4LDE2LDI0LDMyKSwgaWVlZSAoMzIsIDY0KQorCQlvbmx5IHVuc3VwcG9ydGVkIGZvcm1hdHMgYXJlIEFEUENNL0NDSVRUIEcuNzJ4CisJCXJldmlld2VkIGJ5IFJvbmFsZAorCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL2F1ZGlvLmg6IGFkZHMgMjRiaXQgZGVwdGggdG8gUENNICh4LXJhdy1pbnQpCisKKzIwMDQtMDUtMTAgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvdm9yYmlzL01ha2VmaWxlLmFtOgorCSogZXh0L3ZvcmJpcy9SRUFETUU6CisJKiBleHQvdm9yYmlzL29nZ3ZvcmJpc2VuYy5jOiAoZ3N0X29nZ3ZvcmJpc2VuY19nZXRfZm9ybWF0cyksCisJKG9nZ3ZvcmJpc2VuY19nZXRfdHlwZSksICh2b3JiaXNfY2Fwc19mYWN0b3J5KSwgKHJhd19jYXBzX2ZhY3RvcnkpLAorCShnc3Rfb2dndm9yYmlzZW5jX2Jhc2VfaW5pdCksIChnc3Rfb2dndm9yYmlzZW5jX2NsYXNzX2luaXQpLAorCShnc3Rfb2dndm9yYmlzZW5jX3Npbmtjb25uZWN0KSwgKGdzdF9vZ2d2b3JiaXNlbmNfY29udmVydF9zcmMpLAorCShnc3Rfb2dndm9yYmlzZW5jX2NvbnZlcnRfc2luayksCisJKGdzdF9vZ2d2b3JiaXNlbmNfZ2V0X3F1ZXJ5X3R5cGVzKSwgKGdzdF9vZ2d2b3JiaXNlbmNfc3JjX3F1ZXJ5KSwKKwkoZ3N0X29nZ3ZvcmJpc2VuY19pbml0KSwgKGdzdF9vZ2d2b3JiaXNlbmNfZ2V0X3RhZ192YWx1ZSksCisJKGdzdF9vZ2d2b3JiaXNlbmNfbWV0YWRhdGFfc2V0MSksIChnc3Rfb2dndm9yYmlzZW5jX3NldF9tZXRhZGF0YSksCisJKGdldF9jb25zdHJhaW50c19zdHJpbmcpLCAodXBkYXRlX3N0YXJ0X21lc3NhZ2UpLAorCShnc3Rfb2dndm9yYmlzZW5jX3NldHVwKSwgKGdzdF9vZ2d2b3JiaXNlbmNfd3JpdGVfcGFnZSksCisJKGdzdF9vZ2d2b3JiaXNlbmNfY2hhaW4pLCAoZ3N0X29nZ3ZvcmJpc2VuY19nZXRfcHJvcGVydHkpLAorCShnc3Rfb2dndm9yYmlzZW5jX3NldF9wcm9wZXJ0eSksIChnc3Rfb2dndm9yYmlzZW5jX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvdm9yYmlzL29nZ3ZvcmJpc2VuYy5oOgorCSogZXh0L3ZvcmJpcy92b3JiaXMuYzogKHBsdWdpbl9pbml0KToKKwkqIGV4dC92b3JiaXMvdm9yYmlzZW5jLmM6ICh2b3JiaXNfY2Fwc19mYWN0b3J5KSwKKwkocmF3X2NhcHNfZmFjdG9yeSksIChnc3Rfdm9yYmlzZW5jX2NsYXNzX2luaXQpLAorCShnc3Rfdm9yYmlzZW5jX2luaXQpLCAoZ3N0X3ZvcmJpc2VuY19zZXR1cCksCisJKGdzdF92b3JiaXNlbmNfcHVzaF9wYWNrZXQpLCAoZ3N0X3ZvcmJpc2VuY19jaGFpbiksCisJKGdzdF92b3JiaXNlbmNfZ2V0X3Byb3BlcnR5KSwgKGdzdF92b3JiaXNlbmNfc2V0X3Byb3BlcnR5KToKKwkqIGV4dC92b3JiaXMvdm9yYmlzZW5jLmg6CisJQWRkZWQgYSByYXcgdm9yYmlzIGVuY29kZXIgdG8gYmUgdXNlZCB3aXRoIHRoZSBvZ2dtdXhlci4KKwlXZSBzdGlsbCBuZWVkIHRoZSBvbGQgZW5jb2RlciBmb3Igc29tZSBnbm9tZSBhcHBsaWNhdGlvbnMsCisJcmVhZCB0aGUgUkVBRE1FIHRvIGZpbmQgb3V0IGhvdyB0aGF0IHdvcmtzLgorCVRoZSByYXcgZW5jb2RlciBpcyBjYWxsZWQgInJhd3ZvcmJpc2VuYyIgdW50aWwgMC45LgorCisyMDA0LTA1LTEwICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L29nZy9nc3RvZ2cuYzogKHBsdWdpbl9pbml0KToKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfZGVtdXhfcGx1Z2luX2luaXQpLAorCShnc3Rfb2dnX3ByaW50KToKKwkqIGV4dC9vZ2cvZ3N0b2dnbXV4LmM6IChnc3Rfb2dnX211eF9nZXRfdHlwZSksCisJKGdzdF9vZ2dfbXV4X2Jhc2VfaW5pdCksIChnc3Rfb2dnX211eF9jbGFzc19pbml0KSwKKwkoZ3N0X29nZ19tdXhfZ2V0X3NpbmtfZXZlbnRfbWFza3MpLCAoZ3N0X29nZ19tdXhfaW5pdCksCisJKGdzdF9vZ2dfbXV4X3Npbmtjb25uZWN0KSwgKGdzdF9vZ2dfbXV4X3BhZF9saW5rKSwKKwkoZ3N0X29nZ19tdXhfcGFkX3VubGluayksIChnc3Rfb2dnX211eF9yZXF1ZXN0X25ld19wYWQpLAorCShnc3Rfb2dnX211eF9oYW5kbGVfc3JjX2V2ZW50KSwgKGdzdF9vZ2dfbXV4X25leHRfYnVmZmVyKSwKKwkoZ3N0X29nZ19tdXhfcHVzaF9wYWdlKSwgKGdzdF9vZ2dfbXV4X2NvbXBhcmVfcGFkcyksCisJKGdzdF9vZ2dfbXV4X3F1ZXVlX3BhZHMpLCAoZ3N0X29nZ19tdXhfbG9vcCksCisJKGdzdF9vZ2dfbXV4X2dldF9wcm9wZXJ0eSksIChnc3Rfb2dnX211eF9zZXRfcHJvcGVydHkpLAorCShnc3Rfb2dnX211eF9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X29nZ19tdXhfcGx1Z2luX2luaXQpOgorCUFkZGVkIGFuIG9nZyBtdXhlci4KKwlTbWFsbCB0eXBvIGZpeGVzIGluIHRoZSBkZW11eGVyLgorCisyMDA0LTA1LTEwICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L3RoZW9yYS90aGVvcmFlbmMuYzogKGdzdF90aGVvcmFfZW5jX2NsYXNzX2luaXQpLAorCSh0aGVvcmFfZW5jX3NpbmtfbGluayksICh0aGVvcmFfcHVzaF9wYWNrZXQpLCAodGhlb3JhX2VuY19jaGFpbiksCisJKHRoZW9yYV9lbmNfY2hhbmdlX3N0YXRlKSwgKHRoZW9yYV9lbmNfc2V0X3Byb3BlcnR5KSwKKwkodGhlb3JhX2VuY19nZXRfcHJvcGVydHkpOgorCU1hcmsgdGhlIGxhc3QgcGFja2V0IHdpdGggYW4gRU9TIGZsYWcgd2hpY2ggaXMgbm90IHJlYWxseSBuZWVkZWQKKwlpbiBnc3RyZWFtZXIuCisJRG8gc29tZSBiZXR0ZXIgdmlkZW8gZnJhbWVyYXRlIGluaXRpYWxpc2F0aW9uLgorCVVwZGF0ZSB0aGUgYnVmZmVyIHRpbWVzdGFtcC4KKworMjAwNC0wNS0xMCAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19jaGFuZ2Vfc3RhdGUpOgorCVJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBwYXJlbnQgc3RhdGUgY2hhbmdlIGNhbGwKKworMjAwNC0wNS0xMCAgU3RlcGhhbmUgTG9ldWlsbGV0IDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZ3N0L2xhdy9hbGF3LmMgOiBhbGF3ZGVjIHNob3VsZCBiZSByZWdpc3RlcmVkIHdpdGggdHlwZSBBTEFXREVDLCBub3QgQUxBV0VOQworCSogZ3N0L2xhdy9hbGF3LWRlY29kZS5jIDogcHV0IGF1ZGlvL3gtYWxhdyBvbiBwYWRzLCBpbnN0ZWFkIG9mIGF1ZGlvL3gtbXVsYXcKKwkqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYyA6IChpZGVtKQorCSogZXh0L2E1MmRlYy9nc3RhNTJkZWMuYyA6IG1hcmsgYXVkaW8vYTUyLCBhdWRpby9hYzMgYXMgZGVwcmVjYXRlZCBpbiBhIGNvbW1lbnQKKwkqIGdzdC9hYzNwYXJzZS9nc3RhYzNwYXJzZS5jIDogYXVkaW8vYWMzID0+IGF1ZGlvL3gtYWMzCisJKiBnc3QvcmVhbG1lZGlhL3JtZGVtdXguYyA6IGF1ZGlvL2E1MiA9PiBhdWRpby94LWFjMworCisyMDA0LTA1LTA5ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FzcmMuYzogKGdzdF9hbHNhX3NyY19sb29wKToKKwkgIGRvbid0IHVzZSBhIGZpeGVkIGJ1ZmZlciBzaXplIHdoZW4gd3JpdGluZyB2YXJpYWJsZSBsZW5ndGggZGF0YSB0bworCSAgaXQuIEZpeGVzIG1lbW9yeSBjb3JydXB0aW9uIGFuZCBtYWtlcyBhbHNhc3JjIHdvcmsKKworMjAwNC0wNS0wOSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzc2luay5jOgorCShfZ3N0X2Jvb2xlYW5fYWxsb3dfb3ZlcndyaXRlX2FjY3VtdWxhdG9yKSwKKwkoZ3N0X2dub21ldmZzc2lua19jbGFzc19pbml0KSwgKGdzdF9nbm9tZXZmc3Npbmtfb3Blbl9maWxlKToKKwkgIFJ1biBnbGliJ3MgZGVmYXVsdCBzaWduYWwgaGFuZGxlciAoPz8pIGluIFJVTl9DTEVBTlVQIHJhdGhlciB0aGFuCisJICBSVU5fTEFTVCwgYW5kIGRvbid0IHVzZSB0aGF0IHRvIHNldCB0aGUgYWNjdW11bGF0b3IgdmFsdWUgYmVjYXVzZQorCSAgdGhlbiBpdCdzIGFsd2F5cyBGQUxTRS4KKworMjAwNC0wNS0wOSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOgorCShnc3RfcmlmZl9jcmVhdGVfdmlkZW9fY2Fwc193aXRoX2RhdGEpLAorCShnc3RfcmlmZl9jcmVhdGVfYXVkaW9fY2FwcyksCisJKGdzdF9yaWZmX2NyZWF0ZV9hdWRpb190ZW1wbGF0ZV9jYXBzKToKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5jOiAoZ3N0X3JpZmZfcGVla19oZWFkKToKKwkgIEZpeCBmb3IgdW5hbGlnbmVkIFJJRkYgZmlsZXMgKGkuZS4gd2hlcmUgYWxsIHRoZSBjaHVua3MgdG9nZXRoZXIKKwkgIGluIGEgTElTVCBjaHVuayBhcmUgbm90IG9mIHRoZSBzYW1lIHNpemUgYXMgdGhlIHNpemUgZ2l2ZW4gaW4KKwkgIHRoZSBMSVNUIGNodW5rIGhlYWRlcikuIEZpeGVzIHNldmVyYWwgb2RkIFdBVkUgZmlsZXMuIEFsc28gZml4CisJICBBRFBDTSAoYmxvY2tfYWxpZ24gcHJvcGVydHkpIGluIGF1ZGlvLCBzbyB0aGF0IHdhdnBhcnNlIGJhc2VkCisJICBvbiB0aGlzIHdvcmtzIG5vdyBhcyBpdCB1c2VkIHRvIHN0YW5kLWFsb25lLgorCisyMDA0LTA1LTA5ICBFZHdhcmQgSGVydmV5ICA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCXJldmlld2VkIGJ5IEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L2E1MmRlYy9nc3RhNTJkZWMuYzoKKwkqIGV4dC9kaXZ4L2dzdGRpdnhkZWMuYzoKKwkqIGV4dC9kaXZ4L2dzdGRpdnhlbmMuYzoKKwkqIGV4dC9kdHMvZ3N0ZHRzZGVjLmM6IChnc3RfZHRzZGVjX2Jhc2VfaW5pdCk6CisJKiBleHQvZmFhYy9nc3RmYWFjLmM6IChnc3RfZmFhY19iYXNlX2luaXQpOgorCSogZXh0L2ZhYWQvZ3N0ZmFhZC5jOiAoZ3N0X2ZhYWRfYmFzZV9pbml0KToKKwkqIGV4dC9pdm9yYmlzL3ZvcmJpc2ZpbGUuYzoKKwkqIGV4dC9sYW1lL2dzdGxhbWUuYzoKKwkqIGV4dC9saWJmYW1lL2dzdGxpYmZhbWUuYzoKKwkqIGV4dC9tcGVnMmVuYy9nc3RtcGVnMmVuYy5jYzoKKwkqIGV4dC9tdXNpY2JyYWluei9nc3R0cm0uYzogKGdzdF9tdXNpY2JyYWluel9iYXNlX2luaXQpOgorCSogZXh0L3NpZHBsYXkvZ3N0c2lkZGVjLmNjOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkqIGV4dC94dmlkL2dzdHh2aWRkZWMuYzoKKwkqIGV4dC94dmlkL2dzdHh2aWRlbmMuYzoKKwkgIGNvcnJlY3Qga2xhc3Nlcy4gTW9zdGx5IHMsQ29kZWMvKEF1ZGlvfFZpZGVvKSxcMS9Db2RlYywKKwkgIChmaXhlcyAjMTQyMTkzKQorCisyMDA0LTA1LTA4ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChkZXZpY2VfbGlzdCksCisJKGdzdF9hbHNhX2NsYXNzX3Byb2JlX2RldmljZXMpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVyLmM6IChnc3RfYWxzYV9taXhlcl9vcGVuKToKKwkgIEZpeCBhbHNhIG9kZG5lc3MgaW4gbWl4ZXIgYWZ0ZXIgdGhlIGNvbWJpbmF0aW9uIG9mIHVzaW5nIG1peGVyCisJICBpbiBzb3VyY2Uvc2luayBlbGVtZW50cyBhbmQgdXNpbmcgaHc6eCx5IGluc3RlYWQgb2YganVzdCBodzp4LgorCisyMDA0LTA1LTA5ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2Rlc3Ryb3lfc291cmNlcGFkKSwKKwkoZ3N0X3dhdnBhcnNlX2NyZWF0ZV9zb3VyY2VwYWQpOgorCSAgbWFrZSBQQVVTRUQ9PlJFQURZPT5QQVVTRUQ9UkVBRFkgd29yayBieSBub3QgZGVzdHJveWluZyBOVUxMCisJICBzb3VyY2VwYWRzCisKKzIwMDQtMDUtMDkgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuYzogKGdzdF9hbHNhX3NpbmtfY2hlY2tfZXZlbnQpOgorCSAgYWxsb3cgZGlzY29udCBldmVudHMgYmVmb3JlIGNhcHMgbmVnbworCisyMDA0LTA1LTA4ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC92b3JiaXMvdm9yYmlzZGVjLmM6ICh2b3JiaXNfZGVjX2V2ZW50KToKKwkgIGRvbid0IGxlYWsgZXZlbnRzCisKKzIwMDQtMDUtMDggIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6IChnc3RfbGV2ZWxfbGluayksIChnc3RfbGV2ZWxfY2hhaW4pLAorCShnc3RfbGV2ZWxfY2hhbmdlX3N0YXRlKSwgKGdzdF9sZXZlbF9pbml0KToKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5oOgorCSAgZmlndXJlIG91dCBpZiB3ZSdyZSBpbml0aWFsaXplZCBkaXJlY3RseSBpbnN0ZWFkIG9mIGtlZXBpbmcgYQorCSAgdmFyaWFibGUgdGhhdCdzIHdyb25nIGluIDkwJSBvZiBjYXNlcworCSAgZG9uJ3QgaW5pdGlhbGl6ZSBwYWRzIGFuZCB0aGVuIGxlYWsgdGhlbSBhbmQgdXNlIGEgbmV3IHVuaXRpYWxpemVkCisJICBwYWQuIChmaXhlcyAjMTQyMDg0KQorCSAgdGhlc2Ugd2VyZSBidWdzIHNvIG4wMGJpc2ggSSBkaWRuJ3QgZmluZCB0aGVtIGZvciBhbiBob3VyIDovCisKKzIwMDQtMDUtMDggSWFpbiA8aWFpbkBwcmV0dHlwZW9wbGUub3JnPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuW2NoXTogUmV3cm90ZSB0byB1c2UgUmlmZlJlYWQgaW5zdGVhZC4KKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5jIChnc3RfcmlmZl9yZWFkX3BlZWtfaGVhZCk6IFVuc3RhdGljIGl0CisJKGdzdF9yaWZmX3JlYWRfZWxlbWVudF9kYXRhKTogRGl0dG8sIGFuZCBhZGRlZCBhIGdvdF9ieXRlcyBhcmd1bWVudCB0bworCXJldHVybiB0aGUgbGVuZ3RoIHRoYXQgd2FzIHJlYWQuCisJKGdzdF9yaWZmX3JlYWRfc3RyZl9hdWRzKTogQWxsb3cgZm10IHRhZ3MgYXMgd2VsbC4KKworMjAwNC0wNS0wNyAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvZmFhZC9nc3RmYWFkLmM6IChnc3RfZmFhZF9zaW5rY29ubmVjdCk6IEhBQ0sgdG8gY29ycmVjdAorCXNpZ25lZCBjaGFyIGFzc3VtcHRpb24gaW4gZmFhZC5oLgorCisyMDA0LTA1LTA3ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY192NGwyZm91cmNjX3RvX2NhcHMpOgorCSAgTWlzc2luZyBicmVhaywgZGV0ZWN0ZWQgYnkgRGFuaWVsIEdhemFyZCA8ZGFuaWVsLmdhemFyZEBmcmVlLmZyPi4KKworMjAwNC0wNS0wNyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3ZvbHVtZS9nc3R2b2x1bWUuYyAoZ3N0X3ZvbHVtZV9kaXNwb3NlKTogVW5yZWYgZHBtYW4uCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmMgKGdzdF9mbGFjZGVjX2Rpc3Bvc2UpOiBBZGQgZGlzcG9zZQorCWZ1bmN0aW9uLgorCSogZ3N0L2F1ZGlvc2NhbGUvZ3N0YXVkaW9zY2FsZS5jIChnc3RfYXVkaW9zY2FsZV9kaXNwb3NlKToKKwlBZGQgZGlzcG9zZSBmdW5jdGlvbi4KKworMjAwNC0wNS0wOCAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCSogZXh0L2R2L2dzdGR2ZGVjLmM6IChnc3RfZHZkZWNfdmlkZW9fbGluayk6CisJICBGaXggY2FwcyBuZWdvIGFuZCBwYWQgdGVtcGxhdGVzLiBSR0IgbW9kZSBjYXBzIHNob3VsZAorCSAgd29yayBub3cuCisJKiBleHQvZHZkbmF2L2dzdC1kdmQ6CisJICBNb3ZlIG1wZWcyZGVjIGluc2lkZSB0aGUgdGhyZWFkIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZQorCSAgcXVldWUgcmVqZWN0cyBjYXAgY2hhbmdlcyBtaWQtc3RyZWFtCisJKiBleHQvbXBlZzJkZWMvZ3N0bXBlZzJkZWMuYzogKGdzdF9tcGVnMmRlY19nZXRfdHlwZSksCisJKGdzdF9tcGVnMmRlY19mbHVzaF9kZWNvZGVyKToKKwkgIEZvciBtcGVnMmRlYyA+IDAuNC4wLCBjYWxsIHRoZSBmbHVzaCBmdW5jdGlvbiBpbnN0ZWFkIG9mCisJICBtYW51YWxseSBleHRyYWN0aW5nIGFsbCBpbi1mbGlnaHQgZnJhbWVzLgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IChnc3RfZHYxMzk0c3JjX2ZhY3RvcnkpLAorCShnc3RfZHYxMzk0c3JjX2luaXQpLCAoZ3N0X2R2MTM5NHNyY19pc29fcmVjZWl2ZSk6CisJICBDaGFuZ2UgbWltZSB0eXBlIHZpZGVvL2R2IGdvIHZpZGVvL3gtZHYgdG8gbWF0Y2ggdGhlCisJICByZXN0IG9mIGdzdC1wbHVnaW5zCisKKzIwMDQtMDUtMDcgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FtaXhlci5jOiAoZ3N0X2Fsc2FfbWl4ZXJfYnVpbGRfbGlzdCk6CisJKiBleHQvYWxzYS9nc3RhbHNhc2luay5jOiAoZ3N0X2Fsc2Ffc2lua19nZXRfdHlwZSksCisJKGdzdF9hbHNhX3NpbmtfY2xhc3NfaW5pdCk6CisJKiBleHQvYWxzYS9nc3RhbHNhc2luay5oOgorCSogZXh0L2Fsc2EvZ3N0YWxzYXNyYy5jOiAoZ3N0X2Fsc2Ffc3JjX2dldF90eXBlKSwKKwkoZ3N0X2Fsc2Ffc3JjX2NsYXNzX2luaXQpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYXNyYy5oOgorCSAgTWFrZSBhbHNhc2luay9zcmMgYSBzdWJjbGFzcyBvZiBhbHNhbWl4ZXIgc28gdGhhdCBtaXhlciBzdHVmZgorCSAgc2hvd3MgdXAgaW4gZ3N0LXJlYy4gTmVlZHMgc29tZSBmaW5ldHVuaW5nLgorCisyMDA0LTA1LTA1ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9sYW1lL2dzdGxhbWUuYzogKGdzdF9sYW1lX2NoYWluKToKKwkgIHNpbXBsaWZ5CisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9oYW5kbGVfZXZlbnQpOgorCSAgZml4IGV2ZW50IGxlYWsKKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAobXAzX3R5cGVfZmluZCk6CisJICBiZSBhYmxlIHRvIGRldGVjdCBtcDMgZmlsZXMgPCA0MDk2IGJ5dGVzCisKKzIwMDQtMDUtMDYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvdGhlb3JhL3RoZW9yYWVuYy5jOiAoZ3N0X3RoZW9yYV9lbmNfY2xhc3NfaW5pdCksCisJKHRoZW9yYV9lbmNfc2lua19saW5rKSwgKHRoZW9yYV9wdXNoX3BhY2tldCksICh0aGVvcmFfZW5jX2NoYWluKSwKKwkodGhlb3JhX2VuY19zZXRfcHJvcGVydHkpLCAodGhlb3JhX2VuY19nZXRfcHJvcGVydHkpOgorCUFsc28gZW5jb2RlIHRoZSBmaXJzdCBmcmFtZSwgY2xlYW51cCBzb21lIGNvZGUuCisKKzIwMDQtMDUtMDYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvbXBlZzJlbmMvZ3N0bXBlZzJlbmMuY2M6CisJRm9yd2FyZCBldmVudHMgZmlyc3QgYmVmb3JlIGRlY2lkaW5nIHRoYXQgbmVnb3RpYXRpb24gd2FzCisJbm90IHBlcmZvcm1lZC4KKworMjAwNC0wNS0wNiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChnc3Rfd2F2ZW5jX2NoYWluKToKKwlGaXJzdCBwcm9jZXNzIHRoZSBldmVudHMgYmVmb3JlIGRlY2lkaW5nIHRoYXQgbmVnb3RpYXRpb24KKwl3YXMgbm90IHBlcmZvcm1lZC4KKworMjAwNC0wNS0wNiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC90aGVvcmEvTWFrZWZpbGUuYW06CisJKiBleHQvdGhlb3JhL3RoZW9yYS5jOiAocGx1Z2luX2luaXQpOgorCSogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzogKHRoZW9yYV9kZWNfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC90aGVvcmEvdGhlb3JhZW5jLmM6IChnc3RfdGhlb3JhX2VuY19iYXNlX2luaXQpLAorCShnc3RfdGhlb3JhX2VuY19jbGFzc19pbml0KSwgKGdzdF90aGVvcmFfZW5jX2luaXQpLAorCSh0aGVvcmFfZW5jX3NpbmtfbGluayksICh0aGVvcmFfZW5jX2V2ZW50KSwgKHRoZW9yYV9wdXNoX3BhY2tldCksCisJKHRoZW9yYV9lbmNfY2hhaW4pLCAodGhlb3JhX2VuY19jaGFuZ2Vfc3RhdGUpLAorCSh0aGVvcmFfZW5jX3NldF9wcm9wZXJ0eSksICh0aGVvcmFfZW5jX2dldF9wcm9wZXJ0eSk6CisJQWRkZWQgYSB0aGVvcmEgZW5jb2RlciwgZ3JvdXBlZCB0aGUgZW5jb2RlciBhbmQgZGVjb2RlciBpbnRvIHRoZQorCXNhbWUgcGx1Z2luLgorCisyMDA0LTA1LTA1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6IChnc3RfanBlZ2VuY19nZXRfdHlwZSksCisJKGdzdF9qcGVnZW5jX2NoYWluKToKKyAgICAgICAgZml4IERVUkFUSU9OIG9uIG91dGdvaW5nIGJ1ZmZlcnMKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOiAoZ3N0X2FzZl9kZW11eF9oYW5kbGVfc2lua19ldmVudCk6CisgICAgICAgIGRlYnVnIHVzaW5nIHRpbWUgZm9ybWF0cworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua194Y29udGV4dF9nZXQpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19nZXRfeHZfc3VwcG9ydCksCisJKGdzdF94dmltYWdlc2lua19zaW5rX2xpbmspOgorICAgICAgICB3aW5kb3dzIHdpdGggd2lkdGgvaGVpZ2h0IDAgZ2VuZXJhdGUgWCBlcnJvcnMsIHNvIGRvbid0IGFsbG93IHRoZW0KKworMjAwNC0wNS0wNSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5jOiAoc3JjX3RlbXBsKSwKKwkoZ3N0X21wZWcyZGVjX2Jhc2VfaW5pdCksIChnc3RfbXBlZzJkZWNfaW5pdCksCisJKGdzdF9tcGVnMmRlY19uZWdvdGlhdGVfZm9ybWF0KToKKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5oOgorCSAgcmVtb3ZlZCB0aGUgc3RhdGljIHBhZCB0ZW1wbGF0ZSBzbyB0aGF0IHdlIGNhbiBhZGQgdGhlCisJICBtb3JlIGFjY3VyYXRlIGZyYW1lcmF0ZSB2YWx1ZSB0byB0aGUgY2Fwcy4KKworCisyMDA0LTA1LTA0ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNoZWNrIGZvciBrZGVtYWNyb3MuaCwgdG9vIChzaG91bGQgZml4ICMxNDE4MjEpCisJKiBleHQvdm9yYmlzL3ZvcmJpc2RlYy5jOiAodm9yYmlzX2RlY19ldmVudCksICh2b3JiaXNfZGVjX2NoYWluKToKKwkgIGRvbid0IGNyYXNoIGlmIG5vIGhlYWRlciB3YXMgc2VudCwgYnV0IG5pY2VseSBlcnJvciBvdXQgKGZpeGVzIHBhcnQKKwkgIG9mICMxNDE1NTQpCisKKzIwMDQtMDUtMDQgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvbXBlZzJlbmMvZ3N0bXBlZzJlbmMuY2M6IChnc3RfbXBlZzJlbmNfZGlzcG9zZSk6IGNhbGwgdGhlCisJcGFyZW50IGRpc3Bvc2UgZnVuY3Rpb24gdG8gYXZvaWQgc2VnZmF1bHQgb24gZGVzdHJveS4KKworMjAwNC0wNS0wNCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19zaW5rX2xpbmspLAorCShwbHVnaW5faW5pdCk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3hjb250ZXh0X2dldCksCisJKGdzdF94dmltYWdlc2lua19zaW5rX2xpbmspOgorICAgICAgICBjbGVhbiB1cCBkZWJ1Z2dpbmcgY2FwcworICAgICAgICBhbHNvIHJlY3JlYXRlIHh2aW1hZ2Ugd2hlbiBmb3JtYXQgaGFzIGNoYW5nZWQKKworMjAwNC0wNS0wNCAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvbGlidmlzdWFsL01ha2VmaWxlLmFtOgorCSogZXh0L2xpYnZpc3VhbC92aXN1YWwuYzogKGdzdF92aXN1YWxfY2xhc3NfaW5pdCksCisJKGdzdF92aXN1YWxfaW5pdCksIChnc3RfdmlzdWFsX2Rpc3Bvc2UpLCAoZ3N0X3Zpc3VhbF9nZXRjYXBzKSwKKwkoZ3N0X3Zpc3VhbF9zcmNsaW5rKSwgKGdzdF92aXN1YWxfY2hhaW4pLAorCShnc3RfdmlzdWFsX2NoYW5nZV9zdGF0ZSksIChwbHVnaW5faW5pdCk6CisJICB1c2UgYSBHc3RBZGFwdGVyIHRvIGNvcnJlY3RseSBhZGFwdCBidWZmZXIgc2l6ZXMgLSBhbGxvd3MgdXNpbmcgYQorCSAgZnJhbWVyYXRlCisKKzIwMDQtMDUtMDMgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHN5cy92NGwvZ3N0djRsZWxlbWVudC5oOgorCSogc3lzL3Y0bC9nc3R2NGxtanBlZ3NyYy5jOiAoZ3N0X3Y0bG1qcGVnc3JjX2NsYXNzX2luaXQpOgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzogKGdzdF92NGxzcmNfZ2V0X2ZwcyksIChnc3RfdjRsc3JjX2dldGNhcHMpLAorCShnc3RfdjRsc3JjX2J1ZmZlcl9mcmVlKToKKwkqIHN5cy92NGwvdjRsX2NhbGxzLmM6IChnc3RfdjRsX2dldF9jYXBhYmlsaXRpZXMpOgorCSogc3lzL3Y0bC92NGxzcmNfY2FsbHMuYzogKGdzdF92NGxzcmNfcXVldWVfZnJhbWUpLAorCShnc3RfdjRsc3JjX3N5bmNfZnJhbWUpLCAoZ3N0X3Y0bHNyY19ncmFiX2ZyYW1lKSwKKwkoZ3N0X3Y0bHNyY19yZXF1ZXVlX2ZyYW1lKToKKyAgICAgICAgbW92ZSBzb21lIGRlYnVnZ2luZyBjYXRlZ29yaWVzIGFyb3VuZAorICAgICAgICBxdWVyeSBmb3IgZnBzIGluZGV4IGFuZCBzZXQgYWNjb3JkaW5nbHkgaWYgZm91bmQKKworMjAwNC0wNS0wMyAgU3RlcGhhbmUgTG9ldWlsbGV0IDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZXh0L2xhbWUvZ3N0bGFtZS5jOgorCWNvcnJlY3QgZGVmYXVsdHMgdGhhdCBsYW1lX2luaXQgcHV0cyBvdXQgb2YgcmFuZ2UKKworMjAwNC0wNS0wMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L2RpdngvZ3N0ZGl2eGVuYy5jOiAoZ3N0X2RpdnhlbmNfZ2V0X3R5cGUpLAorCShnc3RfZGl2eGVuY19jbGFzc19pbml0KToKKyAgICAgICAgZml4IHJhbmdlIHNpbmNlIC0xIGlzIHRoZSBkZWZhdWx0CisJKiBnc3QvbXBlZzFzeXMvZ3N0bXBlZzFzeXN0ZW1lbmNvZGUuYzoKKwkoZ3N0X21wZWcxX3N5c3RlbV9lbmNvZGVfZ2V0X3R5cGUpLCAoZ3N0X3N5c3RlbV9lbmNvZGVfbXVsdGlwbGV4KToKKwkqIGdzdC9ydGpwZWcvZ3N0cnRqcGVnZGVjLmM6IChnc3RfcnRqcGVnZGVjX2dldF90eXBlKSwKKwkoZ3N0X3J0anBlZ2RlY19jaGFpbik6CisJKiBnc3QvcnRqcGVnL2dzdHJ0anBlZ2VuYy5jOiAoZ3N0X3J0anBlZ2VuY19nZXRfdHlwZSksCisJKGdzdF9ydGpwZWdlbmNfY2hhaW4pOgorCSogc3lzL3FjYW0vZ3N0cWNhbXNyYy5jOiAoZ3N0X2F1dG9leHBfbW9kZV9nZXRfdHlwZSksCisJKGdzdF9xY2Ftc3JjX2dldF90eXBlKSwgKGdzdF9xY2Ftc3JjX2NoYW5nZV9zdGF0ZSk6CisJKiBzeXMvdjRsL2dzdHY0bG1qcGVnc2luay5jOiAoZ3N0X3Y0bG1qcGVnc2lua19nZXRfdHlwZSk6CisJKiBzeXMvdjRsL2dzdHY0bG1qcGVnc3JjLmM6IChnc3RfdjRsbWpwZWdzcmNfZ2V0X3R5cGUpOgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzoKKwkqIHN5cy92NGwvdjRsX2NhbGxzLmM6IChnc3RfdjRsX29wZW4pOgorCSogc3lzL3Y0bC92NGxtanBlZ3NpbmtfY2FsbHMuYzogKGdzdF92NGxtanBlZ3NpbmtfcGxheWJhY2tfaW5pdCk6CisJKiBzeXMvdjRsL3Y0bG1qcGVnc3JjX2NhbGxzLmM6IChnc3RfdjRsbWpwZWdzcmNfY2FwdHVyZV9pbml0KToKKwkqIHN5cy92NGwvdjRsc3JjX2NhbGxzLmM6IChnc3RfdjRsc3JjX2NhcHR1cmVfaW5pdCk6CisJKiBzeXMvdmNkL3ZjZHNyYy5jOiAodmNkc3JjX2dldF90eXBlKSwgKHZjZHNyY19nZXQpOgorICAgICAgICAgIHJlbW92ZSBnc3RfaW5mbyBjYWxscworCisyMDA0LTA1LTAzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBNYWtlZmlsZS5hbToKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKyAgICAgICAgICBVcGRhdGVkIHRyYW5zbGF0aW9ucworCisyMDA0LTA1LTAzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOiAoX2ZpeGF0ZV9jYXBzX3RvX2ludCk6CisgICAgICAgICAgcmVmYWN0b3IvY29tbWVudCBjb2RlCisKKzIwMDQtMDUtMDIgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hc2ZkZW11eC9NYWtlZmlsZS5hbToKKwkqIGdzdC9hc2ZkZW11eC9hc2ZoZWFkZXJzLmM6CisJKiBnc3QvYXNmZGVtdXgvYXNmaGVhZGVycy5oOgorCSogZ3N0L2FzZmRlbXV4L2dzdGFzZi5jOiAocGx1Z2luX2luaXQpOgorCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6IChnc3RfYXNmX2RlbXV4X2dldF90eXBlKSwKKwkoZ3N0X2FzZl9kZW11eF9iYXNlX2luaXQpLCAoZ3N0X2FzZl9kZW11eF9wcm9jZXNzX2NvbW1lbnQpLAorCShnc3RfYXNmX2RlbXV4X3NldHVwX3BhZCk6CisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguaDoKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZtdXguYzoKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZtdXguaDoKKwkgIEFkZCB0YWdnaW5nIHN1cHBvcnQgdG8gZGVtdXhlciwgc3BsaXQgb3V0IHJlZ2lzdHJhdGlvbiBpbiBpdHMgb3duCisJICBmaWxlIGluc3RlYWQgb2YgaW4gZGVtdXggKGhhY2t5KSwgYW5kIHByZXZlbnQgaGF2aW5nIHNvbWUgdGFibGVzCisJICBpbiBvdXIgbWVtb3J5IG11bHRpcGxlIHRpbWVzIChpbiBhc2ZoZWFkZXJzLmgpLgorCisyMDA0LTA1LTAxICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX21ldGFkYXRhKToKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIEJhc2ljIHRhZyByZWFkaW5nIHN1cHBvcnQuCisKKzIwMDQtMDQtMzAgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X2F1ZGlvX2NhcHMpOgorCSAgUmVhbGx5IGRldGVjdCBhYy0zIGF1ZGlvLgorCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChtYXRyb3NrYV90eXBlX2ZpbmQpOgorCSAgcmVhbGx5IGRldGVjdCBtYXRyb3NrYSBmaWxlcyAob2ZmLWJ5LTEpLgorCisyMDA0LTA0LTMwICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwKKwkoZ3N0X3F0ZGVtdXhfYWRkX3N0cmVhbSksIChxdGRlbXV4X3BhcnNlKSwgKHF0ZGVtdXhfdHlwZV9nZXQpLAorCShxdGRlbXV4X2R1bXBfc3RzeiksIChxdGRlbXV4X2R1bXBfc3RjbyksIChxdGRlbXV4X2R1bXBfY282NCksCisJKHF0ZGVtdXhfZHVtcF91bmtub3duKSwgKHF0ZGVtdXhfcGFyc2VfdHJlZSksIChxdGRlbXV4X3BhcnNlX3VkdGEpLAorCShxdGRlbXV4X3RhZ19hZGQpLCAoZ2V0X3NpemUpLCAoZ3N0X3F0ZGVtdXhfaGFuZGxlX2VzZHMpOiBNb3JlIHF0ZGVtdXgKKwloYWNrYWdlIC0tIHBhcnNlIGEgbG90IG1vcmUgYXRvbXMsIGV4dHJhY3QgYSBmZXcgdGFncy4gIE9uZSBtaWdodCBldmVuCisJbWlzdGFrZSB0aGlzIGZvciB0YWcgc3VwcG9ydC4gIE1heWJlIGl0IGlzLgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCisyMDA0LTA0LTMwICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBleHQvYWxzYS9nc3RhbHNhc2luay5jIChnc3RfYWxzYV9zaW5rX21tYXApOiBQbHVnIGEgbWVtbGVhay4KKworMjAwNC0wNC0zMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29sb3JzcGFjZS5jOgorCShnc3RfZmZtcGVnY29sb3JzcGFjZV9nZXRjYXBzKToKKyAgICAgICAgICByZW1vdmUgYnJva2VuIG5lZ28gZml4CisKKzIwMDQtMDQtMzAgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L2xpYnZpc3VhbC9NYWtlZmlsZS5hbToKKwkqIGV4dC9saWJ2aXN1YWwvdmlzdWFsLmM6CisJICBhZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBsaWJ2aXN1YWwgKGh0dHA6Ly9saWJ2aXN1YWwuc291cmNlZm9yZ2UubmV0KQorCSAgbGlidmlzdWFsIGlzIHN0aWxsIHF1aXRlIGFscGhhLCBzbyBleHBlY3QgY3Jhc2hlcyBpbiB0aGVyZSA6KQorCisyMDA0LTA0LTI5ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pLCAocXRkZW11eF9wYXJzZSksCisJKHF0ZGVtdXhfcGFyc2VfdHJhayksIChnZXRfc2l6ZSksIChnc3RfcXRkZW11eF9oYW5kbGVfZXNkcyk6IEhhY2tlZAorCXVwIHF0ZGVtdXggdG8gbWFrZSBpdCBzcGl0IG91dCBjb2RlY19kYXRhLiAgRG8gX25vdF8gbG9vayBhdCB0aGlzCisJY29kZTsgeW91IHdpbGwgbm8gbG9uZ2VyIHJlc3BlY3QgbWUuCisKKzIwMDQtMDQtMjkgIFN0ZXBoYW5lIExvZXVpbGxldCA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYyA6IChnc3RfYWxzYV9jbGFzc19wcm9iZV9kZXZpY2VzKQorCSogZXh0L2Fsc2EvZ3N0YWxzYS5oIDoKKwljaGFuZ2UgYWxzYSBwY20gZGV2aWNlIGRpc2NvdmVyeSB0byBmaW5kIG1vcmUgdGhhbiAxIGRldmljZQorCXBlciBjYXJkLiBjb2RlIHJldmlldyBieSBSb25hbGQuCisKKzIwMDQtMDQtMjkgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogc3lzL29zcy9nc3Rvc3NlbGVtZW50LmM6IChnc3Rfb3NzZWxlbWVudF9yYXRlX3Byb2JlX2NoZWNrKToKKwlBZGQgYSBjaGVjayBmb3IgYSBkcml2ZXIgYnVnIG9uIEZyZWVCU0QuICAoYnVnICMxNDA1NjUpCisKKzIwMDQtMDQtMjkgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogKGdzdF9qcGVnZGVjX2dldF90eXBlKToKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzogKGdzdF9qcGVnZW5jX2dldF90eXBlKSwKKwkoZ3N0X2pwZWdlbmNfZ2V0Y2Fwcyk6CisgICAgICAgICAgbW92ZSBmb3JtYXQgc2V0dGluZyB0byBpbm5lciBsb29wCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2xvcnNwYWNlLmM6CisJKGdzdF9mZm1wZWdjb2xvcnNwYWNlX2dldGNhcHMpOgorICAgICAgICAgIHVzZSBHU1RfUEFEX0NBUFMgaWYgYXZhaWxhYmxlIHNvIHRoYXQgd2UgdXNlIGFscmVhZHkgbmVnb3RpYXRlZAorICAgICAgICAgIGNhcHMKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwKKwkocXRkZW11eF9wYXJzZV9tb292KSwgKHF0ZGVtdXhfcGFyc2UpOgorICAgICAgICAgIGV4dHJhIGRlYnVnZ2luZworCSogc3lzL3FjYW0vcWNhbS1MaW51eC5jOiAocWNfbG9ja193YWl0KSwgKHFjX3VubG9jayk6CisJKiBzeXMvcWNhbS9xY2FtLW9zLmM6IChxY19sb2NrX3dhaXQpLCAocWNfdW5sb2NrKToKKyAgICAgICAgICBtb3ZlIGhhcmRjb2RlZCBwYXRoIHRvIERFRklORQorCisyMDA0LTA0LTI4ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9zcGVlZC9nc3RzcGVlZC5jOiAoc3BlZWRfcGFyc2VfY2Fwcyk6ICBGaXggY2FwcyBwYXJzaW5nLgorCShidWcgIzE0MDA2NCkKKworMjAwNC0wNC0yOCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfY2xhc3NfcHJvYmVfZGV2aWNlcyk6CisJICBEb24ndCBwcm9iZSBmb3IgcGxheWJhY2sgZGV2aWNlIGlmIHdlJ3JlIGEgc291cmNlIGVsZW1lbnQuIEZpeGVzCisJICAjMTM5NjU4LgorCisyMDA0LTA0LTI5ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChnc3RfaWQzX3RhZ19oYW5kbGVfZXZlbnQpLAorCShnc3RfaWQzX3RhZ19jaGFpbik6CisJICByZXdyaXRlIGJ1ZmZlciBvZmZzZXQKKworMjAwNC0wNC0yOCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L2R0cy9NYWtlZmlsZS5hbToKKwkqIGV4dC9kdHMvZ3N0ZHRzZGVjLmM6IChnc3RfZHRzZGVjX2dldF90eXBlKSwKKwkoZ3N0X2R0c2RlY19iYXNlX2luaXQpLCAoZ3N0X2R0c2RlY19jbGFzc19pbml0KSwgKGdzdF9kdHNkZWNfaW5pdCksCisJKGdzdF9kdHNkZWNfY2hhbm5lbHMpLCAoZ3N0X2R0c2RlY19yZW5lZ290aWF0ZSksCisJKGdzdF9kdHNkZWNfaGFuZGxlX2V2ZW50KSwgKGdzdF9kdHNkZWNfdXBkYXRlX3N0cmVhbWluZm8pLAorCShnc3RfZHRzZGVjX2xvb3ApLCAoZ3N0X2R0c2RlY19jaGFuZ2Vfc3RhdGUpLAorCShnc3RfZHRzZGVjX3NldF9wcm9wZXJ0eSksIChnc3RfZHRzZGVjX2dldF9wcm9wZXJ0eSksCisJKHBsdWdpbl9pbml0KToKKwkqIGV4dC9kdHMvZ3N0ZHRzZGVjLmg6CisJICBOZXcgRFRTIGRlY29kZXIuCisJKiBleHQvZmFhZC9nc3RmYWFkLmM6IChnc3RfZmFhZF9zaW5rY29ubmVjdCksCisJKGdzdF9mYWFkX3NyY2Nvbm5lY3QpOgorCSAgQWRkIEVTRFMgYXRvbSBoYW5kbGluZyAoLm00YSkuCisKKzIwMDQtMDQtMjcgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9kaXZ4L2dzdGRpdnhkZWMuYzogKHBsdWdpbl9pbml0KToKKwkgIFJlbW92ZSBjb21tZW50IHRoYXQgbWFrZXMgbm8gc2Vuc2UuCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X2lkM190YWdfc2V0X3Byb3BlcnR5KToKKwkgIEZpeCBmb3Igb2J2aW91cyB0eXBvIHRoYXQgcmVzdWx0ZWQgaW4gd2FybmluZ3MgZHVyaW5nIGdzdC1yZWdpc3Rlci4KKwkqIGV4dC94dmlkL2dzdHh2aWRkZWMuYzogKGdzdF94dmlkZGVjX3NyY19saW5rKSwKKwkoZ3N0X3h2aWRkZWNfc2lua19saW5rKToKKwkgIEZpeCBjYXBzIG5lZ290aWF0aW9uIGEgYml0IGJldHRlci4KKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBXZSBjYWxsIHRoaXMgJ2NvZGVjX2RhdGEnLCBub3QgJ2VzZHMnLgorCisyMDA0LTA0LTI3ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6CisJICBtYWtlIHN1cmUgd2Ugb25seSBwcm92aWRlIDI1NngxMjgKKwkqIGdzdC9tb25vc2NvcGUvbW9ub3Njb3BlLmM6IChtb25vc2NvcGVfaW5pdCk6CisJICBhc3NlcnQgc2l6ZSBvZiAyNTZ4MTI4CisKKzIwMDQtMDQtMjcgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzogKGdzdF92NGxzcmNfaW5pdCksIChnc3RfdjRsc3JjX2ZpeGF0ZSksCisJKGdzdF92NGxzcmNfZ2V0Y2FwcyksIChnc3RfdjRsc3JjX2J1ZmZlcl9mcmVlKToKKyAgICAgICAgICBmaXhhdGUgdG8gbWF4IHdpZHRoIGFuZCBoZWlnaHQgb2YgZGV2aWNlCisKKzIwMDQtMDQtMjcgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogc3lzL3Y0bC9nc3R2NGwuYzoKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6CisJKiBzeXMvdjRsL3Y0bF9jYWxscy5jOgorCSogc3lzL3Y0bC92NGxzcmNfY2FsbHMuYzoKKyAgICAgICAgICBmaXggZm9yIHFjLXVzYiBkcml2ZXIgd2hpY2ggZmFrZXMgaGF2aW5nIG1vcmUgdGhhbiBvbmUgYnVmZmVyCisgICAgICAgICAgYnkgaGFuZGluZyB0aGUgc2FtZSBidWZmZXIgdHdpY2UsIHdoaWNoIGNvbmZ1c2VkIEdTdHJlYW1lcidzL3Y0bHNyYworICAgICAgICAgIGJ1ZmZlcl9mcmVlIG92ZXJyaWRlCisgICAgICAgICAgYWRkIGRlYnVnZ2luZworCisyMDA0LTA0LTI3ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBNYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb3Rlc3RzcmMvZ3N0dmlkZW90ZXN0c3JjLmM6CisJKGdzdF92aWRlb3Rlc3RzcmNfY2xhc3NfaW5pdCksIChnc3RfdmlkZW90ZXN0c3JjX2NoYW5nZV9zdGF0ZSksCisJKGdzdF92aWRlb3Rlc3RzcmNfaW5pdCksIChnc3RfdmlkZW90ZXN0c3JjX2dldCksCisJKGdzdF92aWRlb3Rlc3RzcmNfc2V0X3Byb3BlcnR5KSwgKGdzdF92aWRlb3Rlc3RzcmNfZ2V0X3Byb3BlcnR5KToKKwkqIGdzdC92aWRlb3Rlc3RzcmMvZ3N0dmlkZW90ZXN0c3JjLmg6CisgICAgICAgICAgYWRkIG51bS1idWZmZXJzIHByb3BlcnR5CisKKwkyMDA0LTA0LTI2ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChwbHVnaW5faW5pdCk6CisJICBzZXQgaWQzbXV4IHJhbmsgdG8gTk9ORSBzbyBpdCBkb2Vzbid0IGNvbmZ1c2Ugc3BpZGVyCisJICByZXF1aXJlIGF1ZGlvL21wZWcsbXBlZ3ZlcnNpb249MSBpbiBpZDNtdXgKKworMjAwNC0wNC0yNiAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBkZXRlY3QgZmFhZCBjb3JyZWN0bHkgYXMgbm9uLXdvcmtpbmcgaWYgaXQncyBpbmRlZWQgbm9uLXdvcmtpbmcKKworMjAwNC0wNC0yNiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogTWFrZWZpbGUuYW06CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6IChnc3RfanBlZ2VuY19nZXRfdHlwZSksCisJKGdzdF9qcGVnZW5jX2NsYXNzX2luaXQpLCAoZ3N0X2pwZWdlbmNfZ2V0Y2Fwcyk6CisgICAgICAgIGZpeCBfZ2V0Y2FwcyBzbyBpdCBvbmx5IG5lZ290aWF0ZXMgdG8gaXRzIHN1cHBvcnRlZCBmb3JtYXQKKworMjAwNC0wNC0yNSAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOiAoX2ZpeGF0ZV9jYXBzX3RvX2ludCk6CisJICBmaXggbWVtbGVhaworCisyMDA0LTA0LTIzICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtbWVkaWEuYzogKGdzdF9yaWZmX2NyZWF0ZV9hdWRpb19jYXBzKToKKwkgIGF1ZGlvL3gtcmF3LWludCB3aXRoIGhlaWdodCBydWxlcyEgbm90LiBOb3cgaXQncyBkZXB0aC4KKworMjAwNC0wNC0yMiAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfY3JlYXRlX3NvdXJjZXBhZCksCisJKGdzdF93YXZwYXJzZV9wYXJzZV9mbXQpLCAoZ3N0X3dhdnBhcnNlX2hhbmRsZV9zaW5rX2V2ZW50KSwKKwkoZ3N0X3dhdnBhcnNlX2xvb3ApOgorCSAgTWlzc2luZyB2YXJpYWJsZSBpbml0aWFsaXphdGlvbi4gQWRkIGhhbmRsaW5nIG9mIERWSSBBRFBDTS4gRml4CisJICBtaXMtcGFyc2luZyBvZiBMSVNUIGNodW5rcy4gVGhpcyB3b3JrcyBhcm91bmQgYSBidWcgd2hlcmUgd2UgbWlzLQorCSAgcGFyc2Ugbm9uLWFsaWduaW5nIExJU1QgY2h1bmtzIChzbyBMSVNUIGNodW5rcyB3aGVyZSB0aGUgY29udGVudHMKKwkgIGRvbid0IGFsaWduIHdpdGggdGhlIGFjdHVhbCBMSVNUIHNpemUpLiBUaGUgY29ycmVjdCBmaXggaXMgdG8gdXNlCisJICByaWZmbGliLCBJJ20gbm90IGdvaW5nIHRvIGZpeCB3YXZwYXJzZSAtIHRvbyBtdWNoIHdvcmsuIEFsbCB0aGlzCisJICBmaXhlcyAjMTA0ODc4LgorCisyMDA0LTA0LTIyICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwlyZXZpZXdlZCBieSBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9zaG91dC9nc3RzaG91dC5jOiAoZ3N0X2ljZWNhc3RzZW5kX2NoYW5nZV9zdGF0ZSk6CisJICBmaXggc2hvdXRjYXN0IG5vdCB3b3JraW5nIChmaXhlcyAjMTQwODQ0KQorCisyMDA0LTA0LTIyICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9oZXJtZXMvZ3N0aGVybWVzY29sb3JzcGFjZS5jOgorCShnc3RfaGVybWVzX2NvbG9yc3BhY2VfY2Fwc19yZW1vdmVfZm9ybWF0X2luZm8pOgorCSogZ3N0L2NvbG9yc3BhY2UvZ3N0Y29sb3JzcGFjZS5jOgorCShnc3RfY29sb3JzcGFjZV9jYXBzX3JlbW92ZV9mb3JtYXRfaW5mbyk6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2xvcnNwYWNlLmM6CisJKGdzdF9mZm1wZWdjb2xvcnNwYWNlX2NhcHNfcmVtb3ZlX2Zvcm1hdF9pbmZvKToKKwkgIHMvZ3N0X2NhcHNfc2ltcGxpZnkvZ3N0X2NhcHNfZG9fc2ltcGxpZnkvCisKKzIwMDQtMDQtMjIgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOgorCShnc3RfcmlmZl9jcmVhdGVfdmlkZW9fY2Fwc193aXRoX2RhdGEpOgorCSAgbXBlZ3ZlcnNpb24gaXMgYW4gaW50CisJKiBzeXMvdjRsL2dzdHY0bHNyYy5jOiAoZ3N0X3Y0bHNyY19iYXNlX2luaXQpOgorCSAgZG9uJ3QgdHJ5IHRvIGNyZWF0ZSBwYWQgdGVtcGxhdGVzIHdpdGggTlVMTCBjYXBzLCB1c2UgYW55IGNhcHMKKwkgIGluc3RlYWQuCisKKzIwMDQtMDQtMjAgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L3NkbC9NYWtlZmlsZS5hbTogTGluayBhZ2FpbnN0IGxpYmdzdGludGVyZmFjZXMsIG5vdAorCWxpYmdzdHhvdmVybGF5LiAgam1tdkBtZW50YS5uZXQgKEp1bGlvIE0uIE1lcmlubyBWaWRhbCkKKwkoYnVnICMxNDAzODQpCisKKzIwMDQtMDQtMjAgIERhbmllbCBHYXphcmQgIDxkYW5pZWwuZ2F6YXJkQGVwaXRhLmZyPgorCisJcmV2aWV3ZWQgYnkgRGF2aWQgU2NobGVlZgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiBBZGQgc3RkbGliLmgKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtZW5jLmM6IHNhbWUKKwkqIGdzdC90YWdzL2dzdGlkM3RhZy5jOiBzYW1lCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19nZXQpOiBGaXggR1NUX0RJU0FCTEVfTE9BRFNBVkUKKwkqIGdzdC90Y3AvZ3N0dGNwc2luay5jOiAoZ3N0X3RjcHNpbmtfc2lua19saW5rKTogQWRqdXN0CisJR1NUX0RJU0FCTEVfTE9BRFNBVkUgdXNlLgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6IChnc3RfdWRwc2lua19zaW5rX2xpbmspOiBMaWtld2lzZS4KKwkqIGdzdC90Y3AvZ3N0dGNwc3JjLmM6IChnc3RfdGNwc3JjX2dldCk6IExpa2V3aXNlLgorCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzc3JjLmM6IEluY2x1ZGUgPHN0ZGxpYi5oPiAobmVlZGVkIGJ5CisJYXRvbCgzKSkuCisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuaDogSW5jbHVkZSA8c3lzL3R5cGVzLmg+IChuZWVkZWQgZm9yIGRldl90KS4KKwkqIGdzdC90YWdzL2dzdHZvcmJpc3RhZy5jOiBJbmNsdWRlIDxzdGRsaWIuaD4gKG5lZWRlZCBieQorCXN0cnRvdWwoMykpLgorCSogZ3N0L3J0cC9nc3RydHBMMTZlbmMuYzogSW5jbHVkZSA8c3RkbGliLmg+IChuZWVkZWQgYnkgcmFuZG9tKDMpKS4KKwkqIGV4dC9tYWQvTWFrZWZpbGUuYW06IChsaWJnc3RtYWRfbGFfQ0ZMQUdTKTogQWRkICQoTUFEX0NGTEFHUykKKwkkKElEM19DRkxBR1MpLgorCSogZXh0L2xpYmZhbWUvTWFrZWZpbGUuYW06IChsaWJnc3RsaWJmYW1lX2xhX0NGTEFHUyk6IEFkZAorCSQoTElCRkFNRV9DRkxBR1MpLgorCisyMDA0LTA0LTIwICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9yZWFsbWVkaWEvcm1kZW11eC5jOiAgVGhpcyB3YXMgc3VwcG9zZWQgdG8gcGFydCBvZiB0aGUKKwlsYXN0IGNoZWNraW4uICBTYW1lIGlkZWEuCisKKzIwMDQtMDQtMjAgIERhbmllbCBHYXphcmQgIDxkYW5pZWwuZ2F6YXJkQGVwaXRhLmZyPgorCisJcmV2aWV3ZWQgYnkgRGF2aWQgU2NobGVlZgorCisJKiBjb25maWd1cmUuYWM6IGJ1bXAgcmVxdWlyZWQgZ3N0cmVhbWVyIHZlcnNpb24gdG8gMC44LjEuMQorCWJlY2F1c2Ugb2YgZm9sbG93aW5nIGNoYW5nZXMgWy0tZHNdCisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5jOiAgSW5jbHVkZSBnc3QvZ3N0dXRpbHMuaC4KKwkoZ3N0X3JpZmZfcGVla19oZWFkLCBnc3RfcmlmZl9wZWVrX2xpc3QsIGdzdF9yaWZmX3JlYWRfbGlzdCkKKwkoZ3N0X3JpZmZfcmVhZF9oZWFkZXIpOiAgVXNlIEdTVF9SRUFEX1VJTlQqCisJbWFjcm9zIHRvIGFjY2VzcyBwb3NzaWJseSB1bmFsaWduZWQgbWVtb3J5LgorCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogSW5jbHVkZSBnc3QvZ3N0dXRpbHMuaC4KKwkobXAzX3R5cGVfZmluZCk6ICBVc2UgR1NUX1JFQURfVUlOVCoKKwltYWNyb3MgdG8gYWNjZXNzIHBvc3NpYmx5IHVuYWxpZ25lZCBtZW1vcnkuCisJKG1wM190eXBlX2ZpbmQsIG1wZWcxX3BhcnNlX2hlYWRlciwgcXRfdHlwZV9maW5kKQorCShzcGVleF90eXBlX2ZpbmQpOiBMaWtld2lzZQorCisJKiBnc3QvdGFncy9nc3R2b3JiaXN0YWcuYzogKEFEVkFOQ0UpOiBMaWtld2lzZQorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEluY2x1ZGUgc3RkbGliLmggKG5lZWRlZCBieSByZWFsbG9jKS4KKwkoUVRERU1VWF9HVUlOVDMyX0dFVCwgUVRERU1VWF9HVUlOVDE2X0dFVCwgUVRERU1VWF9GUDMyX0dFVCkKKwkoUVRERU1VWF9GUDE2X0dFVCwgUVRERU1VWF9GT1VSQ0NfR0VUKQorCShnc3RfcXRkZW11eF9sb29wX2hlYWRlciwgZ3N0X3F0ZGVtdXhfbG9vcF9oZWFkZXIpCisJKHF0ZGVtdXhfbm9kZV9kdW1wX2ZvcmVhY2gsIHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSkKKwkocXRkZW11eF90cmVlX2dldF9zaWJsaW5nX2J5X3R5cGUpOiAgVXNlIEdTVF9SRUFEX1VJTlQqCisJbWFjcm9zIHRvIGFjY2VzcyBwb3NzaWJseSB1bmFsaWduZWQgbWVtb3J5LgorCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVncGFja2V0aXplLmM6IChwYXJzZV9nZW5lcmljLCBwYXJzZV9jaHVuayk6CisJTGlrZXdpc2UuCisKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdkZW11eC5jOiAoZ3N0X21wZWdfZGVtdXhfcGFyc2Vfc3lzaGVhZCkKKwkoZ3N0X21wZWdfZGVtdXhfcGFyc2VfcGFja2V0LCBnc3RfbXBlZ19kZW11eF9wYXJzZV9wZXMpOiBMaWtld2lzZS4KKworCSogZ3N0L21wZWdhdWRpb3BhcnNlL2dzdG1wZWdhdWRpb3BhcnNlLmM6IChnc3RfbXAzcGFyc2VfY2hhaW4pOgorCUxpa2V3aXNlLgorCisJKiBnc3QvbXBlZzJzdWIvZ3N0bXBlZzJzdWJ0LmM6IChHU1RfQlVGRkVSX0RBVEEpCisJKGdzdF9tcGVnMnN1YnRfY2hhaW5fc3VidGl0bGUpOiBMaWtld2lzZS4KKworCSogZ3N0L21wZWcxdmlkZW9wYXJzZS9nc3RtcDF2aWRlb3BhcnNlLmM6IChtcDF2aWRlb3BhcnNlX3BhcnNlX3NlcSkKKwkoZ3N0X21wMXZpZGVvcGFyc2VfdGltZV9jb2RlLCBnc3RfbXAxdmlkZW9wYXJzZV9yZWFsX2NoYWluKToKKwlMaWtld2lzZS4KKworCSogZ3N0L21wZWcxc3lzL2J1ZmZlci5jOiAobXBlZzFtdXhfYnVmZmVyX3VwZGF0ZV9hdWRpb19pbmZvKToKKwlMaWtld2lzZS4KKworCSogZ3N0L2NkeGFwYXJzZS9nc3RjZHhhcGFyc2UuYzogKGdzdF9ieXRlc3RyZWFtX3BlZWtfYnl0ZXMpOgorCUxpa2V3aXNlLgorCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKF9yZWFkX3Zhcl9sZW5ndGgsIF9yZWFkX3VpbnQpOgorCUxpa2V3aXNlLgorCisyMDA0LTA0LTIwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6CisgICAgICAgICAgdXBkYXRlIHJlcXVpcmVkIHZlcnNpb24gb2YgR1N0cmVhbWVyIGJlY2F1c2Ugb2YgR1NUX1RJTUVfRk9STUFUCisKKzIwMDQtMDQtMjAgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX2luaXQpOgorCSAgcmVtb3ZlIGxlZnRvdmVyIGdfcHJpbnQKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6IChnc3RfYXVkaW9fY29udmVydF9saW5rKToKKwkgIGRvbid0IHRyeSBzZXR0aW5nIG9ubHkgYSBzdWJzZXQgb2YgdGhlIGNhcHMuIFdlIGRvbid0IHdhbnQgdG8ga2lsbAorCSAgYXV0b3BsdWdnaW5nIG9uIHB1cnBvc2UKKworMjAwNC0wNC0yMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChwbHVnaW5faW5pdCk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAocGx1Z2luX2luaXQpOgorICAgICAgICAgIGFkZCBkZWJ1Z2dpbmcgY2F0ZWdvcmllcworCisyMDA0LTA0LTIwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBwby9lbl9HQi5wbzoKKyAgICAgICAgKiBwby9MSU5HVUFTOgorICAgICAgICAgIEFkZGluZyBlbl9HQiB0cmFuc2xhdGlvbiAoR2FyZXRoIE93ZW4pCisKKzIwMDQtMDQtMjAgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQpLAorCShxdGRlbXV4X3BhcnNlKSwgKHF0ZGVtdXhfdHlwZV9nZXQpLCAocXRkZW11eF9kdW1wX212aGQpLAorCShxdGRlbXV4X2R1bXBfdGtoZCksIChxdGRlbXV4X2R1bXBfc3RzZCksIChxdGRlbXV4X2R1bXBfdW5rbm93biksCisJKHF0ZGVtdXhfcGFyc2VfdHJhayksIChxdGRlbXV4X3ZpZGVvX2NhcHMpLCAocXRkZW11eF9hdWRpb19jYXBzKToKKwlBIG51bWJlciBvZiBuZXcgZmVhdHVyZXMgYW5kIGhhY2tzIHRvIGV4dHJhY3QgdGhlIGVzZHMgYXRvbSBhbmQKKwlwdXQgaXQgaW50byB0aGUgY2Fwcy4gIChidWcgIzEzNzcyNCkKKworMjAwNC0wNC0xOSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnY29uZi9NYWtlZmlsZS5hbTogRml4IGZvciBub24tR05VIG1ha2UKKwkqIGdzdC1saWJzL2dzdC9NYWtlZmlsZS5hbTogQ2hhbmdlIGRpcmVjdG9yeSBvcmRlciB0byBoYW5kbGUKKwlHc3RQbGF5IGxpbmtpbmcgd2l0aCBnc3RpbnRlcmZhY2VzCisJKiBnc3QtbGlicy9nc3QvYXVkaW8vbWFrZV9maWx0ZXI6IG1ha2UgdXNlIG9mIHRyIHBvcnRhYmxlCisJKiBnc3QtbGlicy9nc3QvcGxheS9NYWtlZmlsZS5hbTogQWRkIGludGVuZGVkIFwKKwkqIGdzdC1saWJzL2dzdC94d2luZG93bGlzdGVuZXIveHdpbmRvd2xpc3RlbmVyLmM6CisJKGdzdF94d2luX3NldF9jbGlwcyk6IFN3aXRjaCB0byBJU08gdmFyaWFkaWMgbWFjcm8uIFVzZSBhCisJZnVuY3Rpb24gcHJvdG90eXBlIGluc3RlYWQgb2Ygdm9pZCAqLgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29kZWNtYXAuYzogU3dpdGNoIHRvIElTTyB2YXJpYWRpYworCW1hY3JvLgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29sb3JzcGFjZS5jOgorCShnc3RfZmZtcGVnY29sb3JzcGFjZV9jaGFpbik6IHdyYXAgTlVMTCBpbiBHU1RfRUxFTUVOVF9FUlJPUiBjYWxsCisJKiBnc3QvdmlkZW9maWx0ZXIvbWFrZV9maWx0ZXI6IG1ha2UgdXNlIG9mIHRyIHBvcnRhYmxlCisJKiBwa2djb25maWcvTWFrZWZpbGUuYW06IFJlbW92ZSBHTlUgZXh0ZW5zaW9uIGluIE1ha2VmaWxlIHRhcmdldAorCisyMDA0LTA0LTE5ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBwby9MSU5HVUFTOgorCSogcG8vdWsucG86CisgICAgICAgICAgQWRkZWQgVWtyYWluaWFuIHRyYW5zbGF0aW9uIChNYXhpbSBWLiBEeml1bWFuZW5rbykKKworMjAwNC0wNC0xOCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2dzbS9nc3Rnc21kZWMuYzogKGdzdF9nc21kZWNfaW5pdCksIChnc3RfZ3NtZGVjX2dldGNhcHMpLAorCShnc3RfZ3NtZGVjX2xpbmspLCAoZ3N0X2dzbWRlY19jaGFpbik6CisJICBGaXggY2Fwc25lZ28sIHNpbXBsaWZ5IGNoYWluIGZ1bmN0aW9uIHNsaWdodGx5LgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9hdWRpb19jYXBzKToKKwkgIEFkZCBHU00uCisKKzIwMDQtMDQtMTggIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2luaXQpLAorCShnc3Rfd2F2cGFyc2VfZGVzdHJveV9zb3VyY2VwYWQpLCAoZ3N0X3dhdnBhcnNlX2NyZWF0ZV9zb3VyY2VwYWQpLAorCShnc3Rfd2F2cGFyc2VfcGFyc2VfZm10KSwgKGdzdF93YXZwYXJzZV9jaGFuZ2Vfc3RhdGUpOgorCSAgSGFjayB0byBtYWtlIHdhdnBhcnNlIHdvcmsgd2l0aCBzcGlkZXIgKGFsd2F5cyAtPiBzb21ldGltZXMgcGFkKS4KKwkgIEZpeGVzICMxMzU4NjIgJiYgIzE0MDQxMS4KKworMjAwNC0wNC0xOCAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuYzogKGdzdF9vc3NlbGVtZW50X3N5bmNfcGFybXMpLAorCShnc3Rfb3NzZWxlbWVudF9yYXRlX3Byb2JlX2NoZWNrKSwKKwkoZ3N0X29zc2VsZW1lbnRfcmF0ZV9jaGVja19yYXRlKSwgKGdzdF9vc3NlbGVtZW50X3JhdGVfYWRkX3JhdGUpOgorCSAgZ2V0IHJpZCBvZiBcbiBpbiBkZWJ1ZyBvdXRwdXQKKworMjAwNC0wNC0xNyAgSWFpbiA8aWFpbkBwcmV0dHlwZW9wbGUub3JnPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYyAoZ3N0X3dhdnBhcnNlX2xvb3ApOiBBbGxvdyBhbGwgZXZlbnRzLAorCW5vdCBqdXN0IEVPUy4KKworMjAwNC0wNC0xNyAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X2lkM190YWdfZ2V0X3R5cGUpLAorCShnc3RfaWQzX3RhZ19jbGFzc19pbml0KSwgKGdzdF9pZDNfdGFnX2dldF9jYXBzKSwKKwkoZ3N0X2lkM190YWdfYWRkX3NyY19wYWQpLCAoZ3N0X2lkM190YWdfaW5pdCksCisJKGdzdF9pZDNfdGFnX3NldF9wcm9wZXJ0eSksIChnc3RfaWQzX3RhZ19kb19jYXBzX25lZ28pLAorCShnc3RfaWQzX3RhZ19zcmNfbGluayksIChnc3RfaWQzX3RhZ19jaGFpbiksCisJKGdzdF9pZDNfdGFnX2NoYW5nZV9zdGF0ZSksIChwbHVnaW5faW5pdCk6CisJICBkZXByZWNhdGUgaWQzdGFnIGVsZW1lbnQgYW5kIHJlcGxhY2Ugd2l0aCBpZDNkZW11eC9pZDNtdXguCisJICBncmVhdCBzaWRlIGVmZmVjdDogdGhpcyB1Z2x5IGZpbGUgaXMgbm93IGV2ZW4gdWdsaWVyLCB5YXkhCisJKiBleHQvbWFkL2dzdG1hZC5oOgorCSAgcmVtb3ZlIG5vbi1hdmFpbGFibGUgZnVuY3Rpb24KKwkgIHVwZGF0ZSBmb3IgbmV3IGdldF90eXBlCisKKzIwMDQtMDQtMTcgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogY29uZmlndXJlLmFjOgorCSAgcmVxdWlyZSBtcGVnMmRlYyA+PSAwLjQuMAorCisyMDA0LTA0LTE3ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfZ2V0X3h2X3N1cHBvcnQpLAorCShnc3RfeHZpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KSwgKGdzdF94dmltYWdlc2lua19jaGFuZ2Vfc3RhdGUpLAorCShnc3RfeHZpbWFnZXNpbmtfc2V0X3h3aW5kb3dfaWQpOgorCSAgY2FsbCBHU1RfRUxFTUVOVF9FUlJPUiB3aGVuZXZlciBnZXRfeGNvbnRleHQgZmFpbHMuIEluY2x1ZGVzCisJICBhc3NvcnRlZCBjbGVhbnVwIGZpeGVzLgorCisyMDA0LTA0LTE2ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5oOiBDb21waWxlIGZpeCBmb3IgRnJlZUJTRC4gKGJ1ZyAjMTQwMjY4KQorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuaDogc2FtZQorCisyMDA0LTA0LTE2ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzaW5rLmM6IChnc3RfZ25vbWV2ZnNzaW5rX29wZW5fZmlsZSk6CisgICAgICAgICAgRml4IEdTVF9FTEVNRU5UX0VSUk9SIHdpdGggKE5VTEwpCisKKzIwMDQtMDQtMTUgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtbWVkaWEuYzoKKwkoZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX2NhcHNfd2l0aF9kYXRhKToKKwkgIEFkZCBkaXZbMzQ1Nl0gYXMgZm91cmNjcyBmb3IgRGl2WCAzIChmaXhlcyAjMTQwMTM3KS4KKworMjAwNC0wNC0xNSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOgorCShnc3RfcmlmZl9jcmVhdGVfdmlkZW9fY2Fwc193aXRoX2RhdGEpLAorCShnc3RfcmlmZl9jcmVhdGVfdmlkZW9fY2FwcyksIChnc3RfcmlmZl9jcmVhdGVfYXVkaW9fY2FwcyksCisJKGdzdF9yaWZmX2NyZWF0ZV92aWRlb190ZW1wbGF0ZV9jYXBzKSwKKwkoZ3N0X3JpZmZfY3JlYXRlX2F1ZGlvX3RlbXBsYXRlX2NhcHMpOgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5oOgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6CisJKGdzdF9yaWZmX3JlYWRfc3RyZl92aWRzX3dpdGhfZGF0YSksIChnc3RfcmlmZl9yZWFkX3N0cmZfdmlkcyk6CisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLXJlYWQuaDoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfYWRkX3N0cmVhbSk6CisJICBBZGQgTVMgUkxFIHN1cHBvcnQuIEkgYWRkZWQgc29tZSBmdW5jdGlvbnMgdG8gcmVhZCBvdXQgc3RyZiBjaHVua3MKKwkgIGludG8gc3RyZiBjaHVua3MgYW5kIHRoZSBkYXRhIGJlaGluZCBpdC4gVGhpcyBpcyB1c3VhbGx5IGNvbG9yCisJICBwYWxldHRlcyAoYXMgaW4gUkxFLCBidXQgYWxzbyBpbiA4LWJpdCBSR0IpLiBBbHNvIHVzZSB0aG9zZSBkdXJpbmcKKwkgIGNhcHMgY3JlYXRpb24uIExhc3RseSwgYWRkIEFEUENNIChzaW1pbGFyIHRvIHdhdnBhcnNlIC0gd2hpY2gKKwkgIHNob3VsZCBldmVudHVhbGx5IGJlIHJpZmZsaWIgYmFzZWQpLgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfY2xhc3NfaW5pdCksCisJKGdzdF9tYXRyb3NrYV9kZW11eF9pbml0KSwgKGdzdF9tYXRyb3NrYV9kZW11eF9yZXNldCk6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkgIFJlbW92ZSBwbGFjZWhvbGRlcnMgZm9yIHNvbWUgcHJlaGlzdG9yaWMgdGFnZ2luZyBzeXN0ZW0uIERpZG4ndCBhZGQKKwkgIHN1cHBvcnQgZm9yIGFueSB0YWcgc3lzdGVtIHJlYWxseSBhbnl3YXkuCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBBZGQgc3VwcG9ydCBmb3IgYXVkaW8veC1tNGEgKE1QRUctNCkgdGhyb3VnaCBzcGlkZXIuCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9wYXJzZV9mbXQpLAorCShnc3Rfd2F2cGFyc2VfbG9vcCk6CisJICBBRFBDTSBzdXBwb3J0ICgjMTM1ODYyKS4gSW5jcmVhc2UgbWF4LiBidWZmZXIgc2l6ZSBiZWNhdXNlIHdlCisJICBjYW5ub3Qgc3BsaXQgYnVmZmVycyBmb3IgQURQQ00gKHNjcmV3cyByZWZlcmVuY2VzKSBhbmQgSSd2ZSBzZWVuCisJICBmaWxlcyB3aXRoIDIwNDggYnl0ZSBjaHVua3MuIDQwOTYgc2VlbXMgc2FmZSBmb3Igbm93LgorCisyMDA0LTA0LTE1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6IGJ1bXAgbmFubyB0byAxCisKKz09PSByZWxlYXNlIDAuOC4xID09PQorCisyMDA0LTA0LTE1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6IHJlbGVhc2luZyAwLjguMSwgIkNvbWZvcnRpbmcgU291bmRzIgorCisyMDA0LTA0LTE0ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6IChnc3RfcmlmZl9jcmVhdGVfdmlkZW9fY2Fwcyk6CisJICBGaXggdHlwbyBpbiBkaXZ4dmVyc2lvbiAoMyBpbnN0ZWFkIG9mIDQgZm9yICJESVZYIiBmb3VyY2MpLgorCSAgRml4ZXMgIzE0MDA1OAorCisyMDA0LTA0LTE0ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RkdmRkZW11eC5jOiAoZ3N0X2R2ZF9kZW11eF9wbHVnaW5faW5pdCk6CisgICAgICAgICAgbG93ZXIgcmFuayBvZiBkdmRkZW11eCBzbyB0aGF0IGl0J3Mgbm90IHVzZWQgZm9yIG1wZWcgcGxheWJhY2suCisKKzIwMDQtMDQtMTQgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogY29uZmlndXJlLmFjOgorCSAgc2F2ZSBsaWJzIGNvcnJlY3RseSB3aGVuIGNoZWNraW5nIG1hZAorCisyMDA0LTA0LTE0ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAocGx1Z2luX2luaXQpOgorICAgICAgICAgIGxvd2VyIHJhbmsgb2YgaWQzdGFnIGFzIHByb3Bvc2VkIGJ5IEJlbmphbWluLiAgRml4ZXMgIzEzOTkyNi4KKworMjAwNC0wNC0xMyAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBjb21tb24vbTQvZ3N0LWZlYXR1cmUubTQ6IENhbGwgLWNvbmZpZyBzY3JpcHRzIHdpdGgKKwktLXBsdWdpbi1saWJzIGlmIGl0IGlzIHN1cHBvcnRlZC4KKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpbXV4X3ZpZHNpbmtjb25uZWN0KTogc2VxdWVuY2VzIG9mCisJSlBFRyBpbWFnZXMgYXJlIGltYWdlL2pwZWcuCisJKiBnc3QvZGVidWcvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVidWcvbmVnb3RpYXRpb24uYzogKGdzdF9uZWdvdGlhdGlvbl9jbGFzc19pbml0KSwKKwkoZ3N0X25lZ290aWF0aW9uX2dldGNhcHMpLCAoZ3N0X25lZ290aWF0aW9uX3BhZF9saW5rKSwKKwkoZ3N0X25lZ290aWF0aW9uX3VwZGF0ZV9jYXBzKSwgKGdzdF9uZWdvdGlhdGlvbl9nZXRfcHJvcGVydHkpLAorCShnc3RfbmVnb3RpYXRpb25fcGx1Z2luX2luaXQpOiBBZGQgYSBwcm9wZXJ0eSB0aGF0IGFjdHMgbGlrZQorCWZpbHRlciBjYXBzLgorCSogdGVzdHN1aXRlL2dzdC1saW50OiAgTW92ZSBsaWNlbnNlIGNoZWNraW5nIHRvIGJlIGEgc3RhbmRhcmQKKwl0ZXN0LgorCisyMDA0LTA0LTEzICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcmVzZXQpOiBGaXggbWVtbGVhay4KKwlwYXRjaCBmcm9tIFNlYmFzdGllbiBDb3RlIChidWcgIzEzOTk1OCkKKworMjAwNC0wNC0xMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXhhbXBsZXMvZ3N0cGxheS9NYWtlZmlsZS5hbToKKwkqIGV4YW1wbGVzL2dzdHBsYXkvcGxheWVyLmM6IChtYWluKToKKyAgICAgICAgICBtYWtlIHRoZSBjb21tYW5kbGluZSBwbGF5ZXIgZXhhbXBsZSB1c2UgZ2NvbmYgc2V0dGluZ3MKKworMjAwNC0wNC0xMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzogKGdzdF9jYWNhc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X2NhY2FzaW5rX3Npbmtjb25uZWN0KSwgKGdzdF9jYWNhc2lua19pbml0KSwKKwkoZ3N0X2NhY2FzaW5rX2NoYWluKSwgKGdzdF9jYWNhc2lua19vcGVuKSwgKGdzdF9jYWNhc2lua19jbG9zZSk6CisgICAgICAgICAgaW5pdC9lbmQgbGlicmFyeSBkdXJpbmcgc3RhdGUgdHJhbnNpdGlvbiwgbm90IG9iamVjdAorICAgICAgICAgIGNyZWF0aW9uL2Rpc3Bvc2FsLiAgZ2V0IHJpZCBvZiBjdXN0b20gZGlzcG9zZSBoYW5kbGVyLgorCisKKzIwMDQtMDQtMTIgIENocmlzdGlhbiBTY2hhbGxlciA8VXJhZXVzQGdub21lLm9yZz4KKworCSogc3lzL29zcy9nc3Rvc3NlbGVtZW50LmM6IHMvbHN0YXQvc3RhdC8gZnJvbSBmcmVlQlNELCBzaW5jZSBpdCBjYW4KKwliZSBhIHN5bWxpbmsKKworMjAwNC0wNC0xMSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSk6CisJICBIYW5kbGUgSlVOSyBjaHVua3MgaW5zaWRlIGRhdGEgc2VjdGlvbi4gUHJldmVudHMgd2FybmluZ3MuCisKKzIwMDQtMDQtMTEgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtbWVkaWEuYzogKGdzdF9yaWZmX2NyZWF0ZV92aWRlb19jYXBzKSwKKwkoZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX3RlbXBsYXRlX2NhcHMpOgorCSAgQWRkIE1TIHZpZGVvIHYxLgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5kZXgpLAorCShnc3RfYXZpX2RlbXV4X3N0cmVhbV9kYXRhKToKKwkgIEFkZCBzdXBwb3J0IGZvciAicmVjLWxpc3QiIGNodW5rcy4KKworMjAwNC0wNC0xMSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOiAoZ3N0X3JpZmZfY3JlYXRlX2F1ZGlvX2NhcHMpOgorCSAgRml4IGFub3RoZXIgY29kZWNuYW1lIG1pc21hdGNoLgorCisyMDA0LTA0LTExICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6IChnc3RfcmlmZl9jcmVhdGVfdmlkZW9fY2Fwcyk6CisJICBGaXggZGl2eCBjYXBzIG1pc21hdGNoIGFuZCBtb3ZlIGZyb20gdmlkZW8veC1qcGVnIHRvIGltYWdlL2pwZWcKKwkgIHNvIHRoYXQgTUpQRUcgcGxheXMgYmFjay4KKworMjAwNC0wNC0xMCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L21wZWcxdmlkZW9wYXJzZS9nc3RtcDF2aWRlb3BhcnNlLmM6IChnc3RfbXAxdmlkZW9wYXJzZV9pbml0KSwKKwkoZ3N0X21wMXZpZGVvcGFyc2VfcmVhbF9jaGFpbiksIChnc3RfbXAxdmlkZW9wYXJzZV9jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L21wZWcxdmlkZW9wYXJzZS9nc3RtcDF2aWRlb3BhcnNlLmg6CisJICBGaXggZm9yIHNvbWUgc2xpZ2h0IG1pcy1jdXRzIGluIGJ1ZmZlciBwYXJzaW5nLCBhbmQgZm9yIHNvbWUKKwkgIHBvdGVudGlhbCBvdmVyZmxvd3Mgb3IgZmF1bHRzLWNhdXNlcnMuIEFkZHMgZGlzY29udHMuIEFsc28gZml4ZXMKKwkgICMxMzkxMDUgd2hpbGUgd2UncmUgYXQgaXQuCisKKzIwMDQtMDQtMTAgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJlbGVtZW50Lmg6CisJICBXb3JrYXJvdW5kIGZvciBtaXNzaW5nIHN0cnVjdCB2NGwyX2J1ZmZlciBkZWNsYXJhdGlvbiBpbiBTdXNlIDkKKwkgIGFuZCBNYW5kcmFrZSAxMCBsaW51eC92aWRlb2RldjIuaCBoZWFkZXIgZmlsZSAoIzEzNTkxOSkuCisKKzIwMDQtMDQtMTAgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9nbm9tZXZmcy9nc3Rnbm9tZXZmc3NpbmsuYzogKGdzdF9nbm9tZXZmc3Npbmtfb3Blbl9maWxlKToKKwkgIEJhaWwgb3V0IGlmIG5vIGZpbGVuYW1lIHdhcyBnaXZlbi4KKworMjAwNC0wNC0xMCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfdjRsMmZvdXJjY190b19jYXBzKSwKKwkoZ3N0X3Y0bDJfZm91cmNjX2Zyb21fc3RydWN0dXJlKToKKwkgIEFkZCBZNDFCL1k0MkIgWVVWIGZvcm1hdHMgKHNlZSAjMTI1NzMyKSwgZml4IFk0MVAgKHdhcyB0eXBvJ2VkIHRvCisJICBZNDFCIHNvbWV3aGVyZSkuCisKKzIwMDQtMDQtMDkgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzc2luay5jOgorCShfZ3N0X2Jvb2xlYW5fYWxsb3dfb3ZlcndyaXRlX2FjY3VtdWxhdG9yKSwKKwkoZ3N0X2dub21ldmZzc2lua19jbGFzc19pbml0KToKKwkgIGZpeCBlcmFzZSBzaWduYWwgLSBpZiBhbnkgaGFuZGxlciByZXR1cm5zIGZhbHNlIHRoZSBmaWxlIHdpbGwgbm90IGJlCisJICBvdmVyd3JpdHRlbi4gSWYgbm8gaGFuZGxlciBpcyBjb25uZWN0ZWQsIHRoZSBmaWxlIHdpbGwgbm90IGJlCisJICBvdmVyd3JpdHRlbiBlaXRoZXIuCisJICByZW5hbWVkIHNpZ25hbCB0byAiYWxsb3ctb3ZlcndyaXRlIgorCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKHRhZ19saXN0X3RvX2lkM190YWdfZm9yZWFjaCk6CisJICBmcmVlIHN0cmluZyB3aGVuIGFkZGluZyBpdCB0byBJRDMgZmFpbGVkCisJKiBleHQvdm9yYmlzL3ZvcmJpc2RlYy5jOiAodm9yYmlzX2RlY19ldmVudCk6CisJICB1bnJlZiBldmVudCB3aGVuIGRvbmUKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6IChfZml4YXRlX2NhcHNfdG9faW50KToKKwkgIGZyZWUgY2FwcworCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6CisJKG1wZWdfdmlkZW9fc3RyZWFtX3R5cGVfZmluZCk6CisJICBmaXggaW52YWxpZCByZWFkCisKKzIwMDQtMDQtMDggIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29sb3JzcGFjZS5jOgorCShnc3RfZmZtcGVnY29sb3JzcGFjZV9yZWdpc3Rlcik6IENoYW5nZSByYW5rIHRvIFBSSU1BUlkuCisKKzIwMDQtMDQtMDggIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2NvbG9yc3BhY2UvZ3N0Y29sb3JzcGFjZS5jOiBEb24ndCBhZHZlcnRpc2UgYSBjb252ZXJzaW9uCisJd2UgZG9uJ3Qgc3VwcG9ydCAoYnVnICMxMzk1MzIpCisKKzIwMDQtMDQtMDcgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX2hhbmRsZV9ldmVudCksCisJKGdzdF9tYWRfY2hlY2tfY2Fwc19yZXNldCksIChnc3RfbWFkX2NoYWluKSwKKwkoZ3N0X21hZF9jaGFuZ2Vfc3RhdGUpOgorICAgICAgICAgIG9ubHkgc2V0IGV4cGxpY2l0IGNhcHMgaWYgdGhleSBoYXZlbid0IGJlZW4gc2V0IGJlZm9yZSBmb3IKKyAgICAgICAgICB0aGlzIHN0cmVhbS4gIE1QRUctYXVkaW8gc2FtcGxlIHJhdGUvY2hhbm5lbHMgYXJlbid0IGFsbG93ZWQKKyAgICAgICAgICB0byBjaGFuZ2UgaW4tc3RyZWFtLgorICAgICAgICAgIEZpeGVzICMxMzkzODIKKworMjAwNC0wNC0wNiAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzc2luay5jOiAoZ3N0X2dub21ldmZzc2lua19iYXNlX2luaXQpLAorCShfZ3N0X2Jvb2xlYW5fZGlkX3NvbWV0aGluZ19hY2N1bXVsYXRvciksCisJKGdzdF9nbm9tZXZmc3NpbmtfY2xhc3NfaW5pdCksIChnc3RfZ25vbWV2ZnNzaW5rX2Rpc3Bvc2UpLAorCShnc3RfZ25vbWV2ZnNzaW5rX2luaXQpLCAoZ3N0X2dub21ldmZzc2lua19zZXRfcHJvcGVydHkpLAorCShnc3RfZ25vbWV2ZnNzaW5rX2dldF9wcm9wZXJ0eSksIChnc3RfZ25vbWV2ZnNzaW5rX29wZW5fZmlsZSksCisJKGdzdF9nbm9tZXZmc3NpbmtfY2xvc2VfZmlsZSksIChnc3RfZ25vbWV2ZnNzaW5rX2NoYWluKSwKKwkoZ3N0X2dub21ldmZzc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgRml4IGVyYXNlIHNpZ25hbC4gRG9uJ3QgZXJhc2UgYnkgZGVmYXVsdC4gUmVtb3ZlIGhhbmRvZmYgc2lnbmFsLgorCSAgUmVtb3ZlIGVyYXNlIHByb3BlcnR5LiBEb24ndCBzZWdmYXVsdC4gR2VuZXJhbCBjbGVhbnVwLgorCisyMDA0LTA0LTA3ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC1saWJzL2dzdC9nY29uZi90ZXN0LWdjb25mLmM6IChtYWluKToKKwkgIGFkZCBtaXNzaW5nIGdzdF9pbml0CisKKzIwMDQtMDQtMDcgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzc3JjLmM6IChnc3RfZ25vbWV2ZnNzcmNfZGlzcG9zZSk6CisJICBmcmVlIHRoZSBtdXRleGVzLCB0b28KKworMjAwNC0wNC0wNyAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzcmMuYzogKGdzdF9nbm9tZXZmc3NyY19kaXNwb3NlKToKKwkgIGFjdHVhbGx5IGZyZWUgdGhlIFVSSSBzdHJpbmcKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChnc3RfaWQzX3RhZ19zcmNfZXZlbnQpOgorCSAgY29tcHV0ZSBvZmZzZXQgY29ycmVjdGx5IHdoZW4gcGFzc2luZyBkaXNjb250IGV2ZW50cworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX2hhbmRsZV9ldmVudCk6CisJICBkb24ndCBsZWFrIGRpc2NvbnQgZXZlbnRzCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKGdzdF9hc2ZfZGVtdXhfdmlkZW9fY2Fwcyk6CisJICBhZGQgc29tZSBtaXNzaW5nIGJyZWFrcyBzbyBjYXBzIGFyZW4ndCBjb3BpZWQgcmFuZG9tbHkKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdkZW11eC5jOiAoZ3N0X21wZWdfZGVtdXhfZ2V0X3ZpZGVvX3N0cmVhbSk6CisJICBpZiB3ZSByZWFsbG9jIG1lbW9yeSwgd2UgYmV0dGVyIHVzZSBpdAorCisyMDA0LTA0LTA2ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChub3JtYWxfc2Vlayk6CisJICBmaXggR1NUX0ZPUk1BVF9USU1FIHVzYWdlCisKKzIwMDQtMDQtMDUgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2tpby9raW9zcmMuY3BwOiAgVW5kZWZpbmUgS0RFX0RFUFJFQ0FURUQgc28gd2UgY2FuIHVzZQorCWEgZGVwcmVjYXRlZCBmdW5jdGlvbiAoaGFjayEpCisKKzIwMDQtMDQtMDUgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L2VzZC9lc2Rtb24uYzogKGdzdF9lc2Rtb25fZ2V0KToKKwkgIGZpeCBub250ZXJtaW5hdGVkIHZhcmFyZyBhbmQgbWVtbGVhaworCisyMDA0LTA0LTA1ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9sYWRzcGEvZ3N0bGFkc3BhLmM6IChnc3RfbGFkc3BhX2NsYXNzX2luaXQpLAorCShnc3RfbGFkc3BhX2luaXQpLCAoZ3N0X2xhZHNwYV9mb3JjZV9zcmNfY2FwcyksCisJKGdzdF9sYWRzcGFfc2V0X3Byb3BlcnR5KSwgKGdzdF9sYWRzcGFfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X2xhZHNwYV9pbnN0YW50aWF0ZSksIChnc3RfbGFkc3BhX2FjdGl2YXRlKSwKKwkoZ3N0X2xhZHNwYV9kZWFjdGl2YXRlKSwgKGdzdF9sYWRzcGFfbG9vcCksIChnc3RfbGFkc3BhX2NoYWluKToKKwkgIGNsZWFuIHVwIGRlYnVnZ2luZworCisyMDA0LTA0LTA1ICBTdGVmYW4gS29zdCA8a29zdEBpbW4uaHR3ay1sZWlwemlnLmRlPgorCisJcmV2aWV3ZWQgYnkgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvbGFkc3BhL2dzdGxhZHNwYS5jOiAoZ3N0X2xhZHNwYV9jbGFzc19pbml0KToKKwkgIGNoZWNrIGZvciBicm9rZW4gTEFEU1BBIHBhcmFtZXRlcnMgKGZpeGVzICMxMzg2MzUpCisKKzIwMDQtMDQtMDUgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogKGdzdF9hdWRpb19jb252ZXJ0X2dldGNhcHMpOgorCSAgYWR2ZXJ0aXNlIGJ1ZmZlci1mcmFtZXMgY29ycmVjdGx5IG9uIHNpbmtwYWRzCisKKzIwMDQtMDQtMDUgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX2dldF90eXBlKSwgKGdzdF9tYWRfbGF5ZXJfZ2V0X3R5cGUpLAorCShnc3RfbWFkX21vZGVfZ2V0X3R5cGUpLCAoZ3N0X21hZF9lbXBoYXNpc19nZXRfdHlwZSksCisJKGdzdF9tYWRfZ2V0X2V2ZW50X21hc2tzKSwgKGdzdF9tYWRfZ2V0X3F1ZXJ5X3R5cGVzKSwgKGluZGV4X3NlZWspLAorCShub3JtYWxfc2VlayksIChnc3RfbWFkX3NyY19ldmVudCksIChnc3RfbWFkX2hhbmRsZV9ldmVudCksCisJKGdzdF9tYWRfY2hlY2tfY2Fwc19yZXNldCksIChnc3RfbWFkX2NoYWluKToKKyAgICAgICAgYWRkIG1vcmUgZGVidWdnaW5nLCBvbmx5IHJlc2V0IGNhcHMgd2hlbiB3ZSdyZSBub3QgaW4gZXJyb3Igc3RhdGUKKworMjAwNC0wNC0wNSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L21hZC9nc3RtYWQuYzogYWRkIGRlYnVnZ2luZyBjYXRlZ29yeSwgY29tbWVudCArIGNsZWFudXBzCisKKzIwMDQtMDQtMDUgIEp1bGlvIE0uIE1lcmlubyBWaWRhbCAgPGptbXZAbWVudGEubmV0PgorCisJcmV2aWV3ZWQgYnkgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBmaXggPT0gaW4gdGVzdCgxKSBvcGVyYXRvcgorCisyMDA0LTA0LTA1ICBKdWxpbyBNLiBNZXJpbm8gVmlkYWwgIDxqbW12QG1lbnRhLm5ldD4KKworCXJldmlld2VkIGJ5IEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgZml4IC0tZXhwb3J0LXN5bWJsb3MtcmVnZXggdG8gYSB3b3JraW5nIHJlZ2V4LgorCisyMDA0LTA0LTA0ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIHN5cy9vc3MvLmN2c2lnbm9yZToKKwkgIGFkZCBmb3Igb3NzX3Byb2JlCisKKzIwMDQtMDQtMDMgIFRpbS1QaGlsbGlwIE3DvGxsZXIgPHQuaS5tQHplbi5jby51az4KKworCXJldmlld2VkIGJ5IEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX2hhbmRsZV9ldmVudCk6CisJICBhZGQgbWlzc2luZyAnbmV3X21lZGlhJyBhcmd1bWVudCAoZml4ZXMgIzEzODE2OCkKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCShnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NlZWtfZXZlbnQpOgorCSAgYWRkIHZhcmFyZyB0ZXJtaW5hdG9yIChmaXhlcyAjMTM4MTY5KQorCisyMDA0LTA0LTAyICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9nZGtfcGl4YnVmL01ha2VmaWxlLmFtOiAgTWFrZSBzdXJlIGdzdGdka2FuaW1hdGlvbi5oIGlzCisJZGlzdGVkIChidWcgIzEzODkxNCkKKworMjAwNC0wNC0wMSAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9jaGFuZ2Vfc3RhdGUpLAorCShnc3RfYWxzYV9jbG9zZV9hdWRpbyk6CisJICBoYW5kbGUgY2FzZSBiZXR0ZXIgd2hlcmUgYSBzb3VuZGNhcmQgY2FuJ3QgcGF1c2UKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzoKKwkgIGRvbid0IGNyYXNoIHdoZW4gd2UgZ2V0IGV2ZW50cyBidXQgZG9uJ3QgaGF2ZSBwYWRzIHlldAorCisyMDA0LTA0LTAxICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuYzogKGdzdF9vc3NlbGVtZW50X3Byb2JlX2NhcHMpOgorICAgICAgICAgIHRocm93IGFuIGVycm9yIGlmIHdlIGNvdWxkbid0IHByb2JlIGFueSBjYXBzLgorCisyMDA0LTA0LTAxICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGV4dC9kdmRuYXYvZ3N0LWR2ZDoKKwlBZGQgYSByZWFsbHkgc2ltcGxlIHNhbXBsZSBEVkQgcGxheWVyCisKKzIwMDQtMDQtMDEgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZXh0L2E1MmRlYy9nc3RhNTJkZWMuYzogKGdzdF9hNTJkZWNfZ2V0X3R5cGUpLCAoZ3N0X2E1MmRlY19pbml0KSwKKwkoZ3N0X2E1MmRlY19wdXNoKSwgKGdzdF9hNTJkZWNfaGFuZGxlX2V2ZW50KSwKKwkoZ3N0X2E1MmRlY191cGRhdGVfc3RyZWFtaW5mbyksIChnc3RfYTUyZGVjX2xvb3ApLAorCShnc3RfYTUyZGVjX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvYTUyZGVjL2dzdGE1MmRlYy5oOgorCSAgVXNlIGEgZGVidWcgY2F0ZWdvcnksIE91dHB1dCB0aW1lc3RhbXBzIGNvcnJlY3RseQorCSAgRW1pdCB0YWcgaW5mbywgSGFuZGxlIGV2ZW50cywgdGVsbCBsaWJhNTJkZWMgYWJvdXQgY3B1CisJICBjYXBhYmlsaXRpZXMgc28gaXQgY2FuIHVzZSBNTVggZXRjLgorCSogZXh0L2R2L2dzdGR2ZGVjLmM6IChnc3RfZHZkZWNfbG9vcCksIChnc3RfZHZkZWNfY2hhbmdlX3N0YXRlKToKKwkgIEZpeCBhIGNyYXNoZXIgYWNjZXNzaW5nIGludmFsaWQgbWVtb3J5CisJKiBleHQvZHZkbmF2L2R2ZG5hdnNyYy5jOiAoZHZkbmF2c3JjX2luaXQpLAorCShkdmRuYXZzcmNfdXBkYXRlX2hpZ2hsaWdodCksIChkdmRuYXZzcmNfbG9vcCksCisJKGR2ZG5hdnNyY19nZXRfZXZlbnRfbWFzayksIChkdmRuYXZfaGFuZGxlX25hdmlnYXRpb25fZXZlbnQpLAorCShkdmRuYXZzcmNfZXZlbnQpLCAoZHZkbmF2c3JjX2dldF9mb3JtYXRzKSwgKGR2ZG5hdnNyY19jb252ZXJ0KSwKKwkoZHZkbmF2c3JjX3F1ZXJ5KToKKwkgIFNvbWUgc3VwcG9ydCBmb3IgYnl0ZS1mb3JtYXQgc2Vla2luZy4KKwkgIFNtYWxsIGZpeGVzIGZvciBzdGlsbCBmcmFtZXMgYW5kIG1lbnUgYnV0dG9uIG92ZXJsYXlzCisJKiBleHQvbXBlZzJkZWMvZ3N0bXBlZzJkZWMuYzogKGdzdF9tcGVnMmRlY19nZXRfdHlwZSksCisJKGdzdF9tcGVnMmRlY19hbGxvY19idWZmZXIpOgorCSAgVXNlIGEgZGVidWcgY2F0ZWdvcnkuIEFkanVzdCB0aGUgcmVwb3J0IGxldmVsIG9mIHNldmVyYWwgaXRlbXMgdG8KKwkgIExPRy4gQ2FsbCBtcGVnMl9jdXN0b21fZmJ1ZiB0byBtYXJrIG91ciBidWZmZXJzIGFzICdjdXN0b20gYnVmZmVycycKKwkgIHNvIGl0IGRvZXNuJ3QgbG9zZSB0aGUgR3N0QnVmZmVyIHBvaW50ZXIKKwkqIGdzdC9kZWJ1Zy9NYWtlZmlsZS5hbToKKwkqIGdzdC9kZWJ1Zy9nc3RkZWJ1Zy5jOiAocGx1Z2luX2luaXQpOgorCSogZ3N0L2RlYnVnL2dzdG5hdnNlZWsuYzogKGdzdF9uYXZzZWVrX2dldF90eXBlKSwKKwkoZ3N0X25hdnNlZWtfYmFzZV9pbml0KSwgKGdzdF9uYXZzZWVrX2NsYXNzX2luaXQpLAorCShnc3RfbmF2c2Vla19pbml0KSwgKGdzdF9uYXZzZWVrX3NlZWspLAorCShnc3RfbmF2c2Vla19oYW5kbGVfc3JjX2V2ZW50KSwgKGdzdF9uYXZzZWVrX3NldF9wcm9wZXJ0eSksCisJKGdzdF9uYXZzZWVrX2dldF9wcm9wZXJ0eSksIChnc3RfbmF2c2Vla19jaGFpbiksCisJKGdzdF9uYXZzZWVrX3BsdWdpbl9pbml0KToKKwkqIGdzdC9kZWJ1Zy9nc3RuYXZzZWVrLmg6CisJICBBZGQgdGhlIG5hdnNlZWsgZGVidWcgZWxlbWVudCBmb3Igc2Vla2luZyBiYWNrIGFuZCBmb3J0aCBpbiBhCisJICB2aWRlbyBzdHJlYW0gdXNpbmcgYXJyb3cga2V5cy4KKwkqIGdzdC9tcGVnMnN1Yi9nc3RtcGVnMnN1YnQuYzogKGdzdF9tcGVnMnN1YnRfZ2V0X3R5cGUpLAorCShnc3RfbXBlZzJzdWJ0X2Jhc2VfaW5pdCksIChnc3RfbXBlZzJzdWJ0X2NsYXNzX2luaXQpLAorCShnc3RfbXBlZzJzdWJ0X2luaXQpLCAoZ3N0X21wZWcyc3VidF9maW5hbGl6ZSksCisJKGdzdF9tcGVnMnN1YnRfZ2V0Y2Fwc192aWRlbyksIChnc3RfbXBlZzJzdWJ0X2xpbmtfdmlkZW8pLAorCShnc3RfbXBlZzJzdWJ0X2hhbmRsZV92aWRlbyksIChnc3RfbXBlZzJzdWJ0X3NyY19ldmVudCksCisJKGdzdF9tcGVnMnN1YnRfcGFyc2VfaGVhZGVyKSwgKGdzdF9nZXRfbmliYmxlKSwKKwkoZ3N0X3NldHVwX3BhbGV0dGUpLCAoZ3N0X2dldF9ybGVfY29kZSksIChnc3RfZHJhd19ybGVfbGluZSksCisJKGdzdF9tZXJnZV91dl9kYXRhKSwgKGdzdF9tcGVnMnN1YnRfbWVyZ2VfdGl0bGUpLAorCShnc3RfdXBkYXRlX3N0aWxsX2ZyYW1lKSwgKGdzdF9tcGVnMnN1YnRfaGFuZGxlX3N1YnRpdGxlKSwKKwkoZ3N0X21wZWcyc3VidF9oYW5kbGVfZHZkX2V2ZW50KSwgKGdzdF9tcGVnMnN1YnRfbG9vcCk6CisJKiBnc3QvbXBlZzJzdWIvZ3N0bXBlZzJzdWJ0Lmg6CisJICBQcmV0dHkgbXVjaCBhIGNvbXBsZXRlIHJld3JpdGUuIE5vdyBhIGxvb3BiYXNlZCBlbGVtZW50LiBNYXkgc3RpbGwKKwkgIHJlcXVpcmUgd29yayB0byBwcm9wZXJseSBzeW5jaHJvbmlzZSBzdWJ0aXRsZSBidWZmZXJzLgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0ZHZkZGVtdXguYzogKGdzdF9kdmRfZGVtdXhfcHJvY2Vzc19wcml2YXRlKSwKKwkoZ3N0X2R2ZF9kZW11eF9zZW5kX3N1YmJ1ZmZlcik6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVnZGVtdXguYzogKGdzdF9tcGVnX2RlbXV4X3NlbmRfc3ViYnVmZmVyKToKKwkgIERvbid0IGF0dGVtcHQgdG8gY3JlYXRlIHN1YmJ1ZmZlcnMgb2Ygc2l6ZSAwCisJICBSZWR1Y2UgYSBjb3VwbGUgb2YgZXJyb3Igb3V0cHV0cyB0byB3YXJuaW5ncy4KKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6IChnc3RfeTRtZW5jb2RlX3Npbmtjb25uZWN0KSwKKwkoZ3N0X3k0bWVuY29kZV9jaGFpbik6CisJT3V0cHV0IHRoZSB5NG0gZnJhbWUgaGVhZGVyIGNvcnJlY3RseS4KKworMjAwNC0wNC0wMSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L2FkZGVyL2dzdGFkZGVyLmM6IChnc3RfYWRkZXJfZ2V0X3R5cGUpLCAoZ3N0X2FkZGVyX2xvb3ApOgorICAgICAgICAgIHRocm93IGVycm9ycyBpbnN0ZWFkIG9mIGFsbG93aW5nIFNJR0ZQRQorCisyMDA0LTA0LTAxICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QtbGlicy9nc3QvZ2NvbmYvZ2NvbmYuYzogKGdzdF9nY29uZl9nZXRfc3RyaW5nKSwKKwkoZ3N0X2djb25mX3JlbmRlcl9iaW5fZnJvbV9rZXkpOgorICAgICAgICAgIGxlYWsgcGx1Z2dpbmcgYW5kIHN0eWxlIGZpeGluZworCisyMDA0LTAzLTMxICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9hdWRpb3NjYWxlL2dzdGF1ZGlvc2NhbGUuYzogKGdzdF9hdWRpb3NjYWxlX2V4cGFuZF92YWx1ZSksCisJKGdzdF9hdWRpb3NjYWxlX2dldGNhcHMpOiBGaXggZ2V0Y2FwcyB0byBleHBhbmQgYW5kIHVuaW9uIGxpc3RzLgorCShidWcgIzEzODIyNSkKKwkqIGdzdC9kZWJ1Zy9NYWtlZmlsZS5hbToKKwkqIGdzdC9kZWJ1Zy9icmVha215ZGF0YS5jOiAoZ3N0X2JyZWFrX215X2RhdGFfcGx1Z2luX2luaXQpOgorCSogZ3N0L2RlYnVnL2dzdGRlYnVnLmM6IChwbHVnaW5faW5pdCk6ICBNZXJnZSBlbGVtZW50cyBpbnRvIG9uZQorCXBsdWdpbi4KKwkqIGdzdC9kZWJ1Zy9uZWdvdGlhdGlvbi5jOiAoZ3N0X2dzdF9uZWdvdGlhdGlvbl9nZXRfdHlwZSksCisJKGdzdF9uZWdvdGlhdGlvbl9iYXNlX2luaXQpLCAoZ3N0X25lZ290aWF0aW9uX2NsYXNzX2luaXQpLAorCShnc3RfbmVnb3RpYXRpb25faW5pdCksIChnc3RfbmVnb3RpYXRpb25fZ2V0Y2FwcyksCisJKGdzdF9uZWdvdGlhdGlvbl9wYWRfbGluayksIChnc3RfbmVnb3RpYXRpb25fY2hhaW4pLAorCShnc3RfbmVnb3RpYXRpb25fc2V0X3Byb3BlcnR5KSwgKGdzdF9uZWdvdGlhdGlvbl9nZXRfcHJvcGVydHkpLAorCShnc3RfbmVnb3RpYXRpb25fcGx1Z2luX2luaXQpOiAgTmV3IGVsZW1lbnQgdG8gdGFsayBhYm91dCByYW5kb20KKwluZWdvdGlhdGlvbiB0aGluZ3MgaGFwcGVuaW5nIGluIGEgcGlwZWxpbmUuCisKKzIwMDQtMDMtMzEgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC9hZGRlci9nc3RhZGRlci5jOiAoZ3N0X2FkZGVyX2dldF90eXBlKSwgKGdzdF9hZGRlcl9sb29wKToKKyAgICAgICAgICBmaXggaW50ZWdlciBhZGRpdGlvbiB3aXRoIGhlbHAgb2YgU3RlZmFuIEtvc3QKKworMjAwNC0wMy0zMSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogcG8vbmwucG86IHVwZGF0ZWQgRHV0Y2ggdHJhbnNsYXRpb24gKEVscm9zIEN5cmlhdGFuKQorCisyMDA0LTAzLTMwICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5jOiAoZ3N0X21wZWcyZGVjX2FsbG9jX2J1ZmZlciksCisJKGdzdF9tcGVnMmRlY19uZWdvdGlhdGVfZm9ybWF0KTogIEhhbmRsZSBZNDJCLWZvcm1hdCBNUEVHCisJdmlkZW8sIHBhdGNoIGZyb20gTWF0dGhldy5TcGVuY2VyQGV1LnNvbnkuY29tIChNYXR0aGV3IFNwZW5jZXIpCisJKGJ1ZyAjMTM3NTA0KQorCSogZXh0L21wZWcyZGVjL2dzdG1wZWcyZGVjLmg6CisKKzIwMDQtMDMtMzAgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2dka19waXhidWYvTWFrZWZpbGUuYW06IFJlbW92ZSBzcHVyaW91cyBydWxlcy4gKGJ1ZyAjMTM2NTI3KQorCisyMDA0LTAzLTMwICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIHRvb2xzL2dzdC1sYXVuY2gtZXh0LW0ubTogIEFwcGxpZWQgcGF0Y2ggZnJvbSBnbm9tZUBmbHluLm9yZyAoVy4KKwlNaWNoYWVsIFBldHVsbG8pIHRvIGhhbmRsZSAubW92CisKKzIwMDQtMDMtMzAgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogc3lzL29zcy9nc3Rvc3NlbGVtZW50LmM6IChnc3Rfb3NzZWxlbWVudF9wcm9iZV9jYXBzKSwKKwkoZ3N0X29zc2VsZW1lbnRfcmF0ZV9jaGVja19yYXRlKToKKwkgIHByb2JlIGNhcHMgY29ycmVjdGx5IGZvciBzb3VuZCBjYXJkcyB0aGF0IG9ubHkgc3VwcG9ydCBvbmUgZm9ybWF0CisKKzIwMDQtMDMtMzAgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L2tpby9raW9zcmMuY3BwOiAocHJvY2Vzc19ldmVudHMpOgorCSAgdXBkYXRlIGhhbmRsaW5nIGV2ZW50IHByb2Nlc3NpbmcgaWYgaW5zaWRlIEtERSAtIHVudGVzdGVkCisKKzIwMDQtMDMtMjkgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2hlcm1lcy9nc3RoZXJtZXNjb2xvcnNwYWNlLmM6IChwbHVnaW5faW5pdCk6IGRlY3JlYXNlIHJhbmsKKwlieSAyIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBvdGhlciBjb2xvcnNwYWNlcy4KKwkqIGV4dC9wYW5nby9nc3R0ZXh0b3ZlcmxheS5jOiAocGx1Z2luX2luaXQpOiBjaGFuZ2UgcmFuayB0byBOT05FCisJKiBnc3QvY29sb3JzcGFjZS9nc3Rjb2xvcnNwYWNlLmM6IChwbHVnaW5faW5pdCk6IGRlY3JlYXNlIHJhbmsgYnkKKwlvbmUgdG8gbm90IGludGVyZmVyZSB3aXRoIGZmbXBlZ19jb2xvcnNwYWNlLgorCisyMDA0LTAzLTI5ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX2ZpeGF0ZSk6IERvbid0IGZpeGF0ZSBmaWVsZHMgdGhhdAorCWFyZW4ndCBpbiB0aGUgY2Fwcy4KKwkqIGdzdC9zaW5lL2dzdHNpbmVzcmMuYzogY2hhbmdlIHJhdGUgY2FwcyB0byBbMSxNQVhdCisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOiAocGx1Z2luX2luaXQpOiBDaGFuZ2UgcmFuayB0byBOT05FLgorCisyMDA0LTAzLTMwICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtbWVkaWEuYzoKKwkgIGZhaWwgb24gZXJyb3IsIGRvbid0IHRyeSB0byBzZXQgc3R1ZmYgb24gTlVMTCBjYXBzCisKKzIwMDQtMDMtMzAgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L2tpby9NYWtlZmlsZS5hbToKKwkqIGV4dC9raW8va2lvcmVjZWl2ZXIuY3BwOgorCSogZXh0L2tpby9raW9yZWNlaXZlci5oOgorCSogZXh0L2tpby9raW9zcmMuY3BwOgorCSogZXh0L2tpby9raW9zcmMuaDoKKwkgIGFkZCBleHBlcmltZW50YWwga2lvc3JjIHBsdWdpbgorCSogZXh0L2Fsc2EvZ3N0YWxzYXBsdWdpbi5jOiAocGx1Z2luX2luaXQpOgorCSAgaW5pdGlhbGl6ZSBkZWJ1Z2dpbmcgY2F0ZWdvcnkgb25seSB3aGVuIHdlJ3JlIHN1cmUgcmVnaXN0ZXJpbmcgdGhlCisJICBwbHVnaW5zIHdvcmtlZC4KKworMjAwNC0wMy0yOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXhhbXBsZXMvZ3N0cGxheS9wbGF5ZXIuYzogKG1haW4pOgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5jOiAoZ3N0X3BsYXlfY2xhc3NfaW5pdCksCisJKGdzdF9wbGF5X3NldF9sb2NhdGlvbiksIChnc3RfcGxheV9zZXRfZGF0YV9zcmMpLAorCShnc3RfcGxheV9zZXRfdmlkZW9fc2luayksIChnc3RfcGxheV9zZXRfYXVkaW9fc2luayksCisJKGdzdF9wbGF5X3NldF92aXN1YWxpemF0aW9uKSwgKGdzdF9wbGF5X2Nvbm5lY3RfdmlzdWFsaXphdGlvbik6CisgICAgICAgICAgY2hlY2sgcmV0dXJuIHZhbHVlcyBvZiBlbGVtZW50X3NldF9zdGF0ZSBhbmQgcmV0dXJuIEZBTFNFIHdoZXJlCisgICAgICAgICAgZmFpbGVkCisKKzIwMDQtMDMtMjkgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX2hhbmRsZV9ldmVudCk6CisJICB0cnkgaGFyZGVyIHRvIGNoZWNrIGlmIGFuIGV2ZW50IGlzIHJlYWxseSBhIGRpc2NvbnQKKworMjAwNC0wMy0yOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogcG8vTElOR1VBUzogYWRkaW5nIEF6ZXJiYWlqYW5pIChNyZl0aW4gxo9taXJvdikKKwkqIHBvL2F6LnBvOgorCisyMDA0LTAzLTI4ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdGR2ZGRlbXV4LmM6IChnc3RfZHZkX2RlbXV4X3Byb2Nlc3NfcHJpdmF0ZSk6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVnZGVtdXguYzogKGdzdF9tcGVnX2RlbXV4X3BhcnNlX3N5c2hlYWQpLAorCShnc3RfbXBlZ19kZW11eF9wYXJzZV9wYWNrZXQpLCAoZ3N0X21wZWdfZGVtdXhfcGFyc2VfcGVzKToKKwkgIGdldCByaWQgb2Ygbm9uLXN0YW5kYXJkICIuLi4iIHJhbmdlcyBpbiBjYXNlIHN0YXRlbWVudHMuCisKKzIwMDQtMDMtMjcgIE1hcnRpbiBTb3RvICA8bWFydGluc290b0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdkZW11eC5jOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ2RlbXV4Lmg6IENvbXBsZXRlIG92ZXJoYXVsLiBBbGwgRFZECisJc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSBzcGxpdCB0byB0aGUgbmV3IGR2ZGRlbXV4IGVsZW1lbnQuCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RkdmRkZW11eC5jOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0ZHZkZGVtdXguaDogTmV3IGRlbXVsdGlwbGV4ZXIgZm9yIERWRCAoVk9CKQorCXN0cmVhbXMsIGRlcml2ZWQgZnJvbSBtcGVnZGVtdXguCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVncGFyc2UuYzogRGlzY29udGludWl0eSBoYW5kbGluZyBjbGVhbmVkCisJdXAuIFNDUiBiYXNlZCB0aW1lc3RhbXAgcmV3cml0aW5nIGNhbiBiZSB0dXJuZWQgb2ZmICh3aWxsIHByb2JhYmx5CisJY29tcGxldGVseSBkaXNhcHBlYXIgc29vbikuCisJKiBleHQvZHZkbmF2L2R2ZG5hdnNyYy5jOiBDaGFuZ2VzIHJlc3VsdGluZyBmcm9tIGEgZmV3IG1vbnRocworCWhhY2tpbmcuIEdlbmVyYWwgY2xlYW51cC4gQWxsIHByaW50ZiBzdGF0ZW1lbnRzIHJlcGxhY2VkIGJ5CisJZGVidWdnaW5nIG1lc3NhZ2VzLiBBbG1vc3QgY29tcGxldGUgbGliZHZkbmF2IHN1cHBvcnQuCisJKGR2ZG5hdnNyY19jbGFzc19pbml0KTogR290IHJpZCBvZiB1bm5lY2Vzc2FyeSBzaWduYWxzIChyZXBsYWNlZAorCWJ5IGV2ZW50cy4gTmV3IHByb3BlcnRpZXMgZm9yIGF1ZGlvIGFuZCBzdWJwaWN0dXJlIGxhbmd1YWdlcy4KKwkoZHZkbmF2c3JjX3VwZGF0ZV9oaWdobGlnaHQpOiBOb3cgdXNlcyBldmVudHMuCisJKGR2ZG5hdnNyY191c2VyX29wKTogQ2xlYW5lZCB1cC4KKwkoZHZkbmF2c3JjX2dldCk6IFJlbmFtZWQgdG8gZHZkbmF2c3JjX2xvb3AgKGVsZW1lbnQgaXMgbm93IGxvb3AKKwliYXNlZCkuIExvdHMgb2YgY2xlYW51cCwgYW5kIHByb3BwZXIgc3VwcG9ydCBmb3IgbW9zdCBsaWJkdmRuYXYKKwlldmVudHMuCisJKGR2ZG5hdnNyY19tYWtlX2R2ZF9ldmVudCk6IE5ldyBmdW5jdGlvbi4KKwkoZHZkbmF2c3JjX21ha2VfZHZkX25hdl9wYWNrZXRfZXZlbnQpOiBOZXcgZnVuY3Rpb24uCisJKGR2ZG5hdnNyY19tYWtlX2NsdXRfY2hhbmdlX2V2ZW50KTogTmV3IGZ1bmN0aW9uLgorCisyMDA0LTAzLTI2ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAodGhlb3JhX3R5cGVfZmluZCk6CisJICBmaXggYnVnIHdoZXJlIHR5cGVmaW5kaW5nIHdvdWxkIGNsYWltIGl0J3MgdGhlb3JhIHdoZW5ldmVyIGxlc3MgdGhlbgorCSAgNyBieXRlcyBvZiBkYXRhIHdlcmUgYXZhaWxhYmxlCisKKzIwMDQtMDMtMjUgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzogKGFsYXdkZWNfZ2V0Y2FwcyksIChhbGF3ZGVjX2xpbmspLAorCShnc3RfYWxhd2RlY19iYXNlX2luaXQpLCAoZ3N0X2FsYXdkZWNfY2xhc3NfaW5pdCksCisJKGdzdF9hbGF3ZGVjX2luaXQpLCAoZ3N0X2FsYXdkZWNfY2hhaW4pOgorCSogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOiAoYWxhd2VuY19nZXRjYXBzKSwgKGFsYXdlbmNfbGluayksCisJKGdzdF9hbGF3ZW5jX2Jhc2VfaW5pdCksIChnc3RfYWxhd2VuY19jbGFzc19pbml0KSwKKwkoZ3N0X2FsYXdlbmNfaW5pdCksIChnc3RfYWxhd2VuY19jaGFpbik6CisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOiAobXVsYXdkZWNfZ2V0Y2FwcyksIChtdWxhd2RlY19saW5rKSwKKwkoZ3N0X211bGF3ZGVjX2Jhc2VfaW5pdCksIChnc3RfbXVsYXdkZWNfY2xhc3NfaW5pdCksCisJKGdzdF9tdWxhd2RlY19pbml0KSwgKGdzdF9tdWxhd2RlY19jaGFpbik6CisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOiAobXVsYXdlbmNfZ2V0Y2FwcyksIChtdWxhd2VuY19saW5rKSwKKwkoZ3N0X211bGF3ZW5jX2Jhc2VfaW5pdCksIChnc3RfbXVsYXdlbmNfY2xhc3NfaW5pdCksCisJKGdzdF9tdWxhd2VuY19pbml0KSwgKGdzdF9tdWxhd2VuY19jaGFpbik6CisJICBGaXggY2Fwc25lZ28gaW4gYWxsIGZvdXIsIHJlbW92ZSB0aGUgdW51c2VkIHByb3BlcnR5IGZ1bmN0aW9ucyBhbmQKKwkgIHNpbXBsaWZ5IHRoZSBjaGFpbiBmdW5jdGlvbnMgc2xpZ2h0bHkuIEkgZ3Vlc3Mgd2UgY291bGQgdXNlIG1hY3JvcworCSAgb3Igc29tZXRoaW5nIHNpbWlsYXIgZm9yIHRob3NlLCBzaW5jZSB0aGUgY29kZSBpcyBzbyBzaW1pbGFyLCBidXQKKwkgIEknbSBjdXJyZW50bHkgdG9vIGxhenkuLi4KKworMjAwNC0wMy0yNCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuYzogKGdzdF9vc3NlbGVtZW50X3N5bmNfcGFybXMpLAorCShnc3Rfb3NzZWxlbWVudF9jbG9zZV9hdWRpbyksIChnc3Rfb3NzZWxlbWVudF9wcm9iZV9jYXBzKSwKKwkoZ3N0X29zc2VsZW1lbnRfZ2V0X2Zvcm1hdF9zdHJ1Y3R1cmUpLAorCShnc3Rfb3NzZWxlbWVudF9yYXRlX3Byb2JlX2NoZWNrKSwgKGdzdF9vc3NlbGVtZW50X3JhdGVfYWRkX3JhbmdlKSwKKwkoZ3N0X29zc2VsZW1lbnRfcmF0ZV9jaGVja19yYXRlKSwgKGdzdF9vc3NlbGVtZW50X3JhdGVfYWRkX3JhdGUpLAorCShnc3Rfb3NzZWxlbWVudF9yYXRlX2ludF9jb21wYXJlKTogQWRkIGNvZGUgdG8gaGFuZGxlIHJhdGUgcHJvYmluZworCShidWcgIzEyMDg4MykKKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5oOiBzYW1lCisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3NzaW5rX2luaXQpLCAoZ3N0X29zc3NpbmtfZ2V0Y2Fwcyk6CisJVXNlIHJhdGUgcHJvYmluZyBwcm92aWRlZCBieSBvc3NlbGVtZW50LgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzogKGdzdF9vc3NzcmNfaW5pdCksIChnc3Rfb3Nzc3JjX2dldGNhcHMpOiBzYW1lCisKKzIwMDQtMDMtMjQgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC94dmlkL2dzdHh2aWRlbmMuYzogKGdzdF94dmlkZW5jX3NldF9wcm9wZXJ0eSksCisJKGdzdF94dmlkZW5jX2dldF9wcm9wZXJ0eSk6CisJICB1bG9uZy9pbnQgbWVzcy11cC4KKworMjAwNC0wMy0yNCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzogKGdzdF9zcGVleGRlY19iYXNlX2luaXQpLAorCShnc3Rfc3BlZXhkZWNfaW5pdCk6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleGVuY19iYXNlX2luaXQpLAorCShnc3Rfc3BlZXhlbmNfaW5pdCk6ICBDcmVhdGUgdGhlIHBhZCB0ZW1wbGF0ZSBjb3JyZWN0bHkgKGZyb20KKwl0aGUgc3RhdGljIHBhZCB0ZW1wbGF0ZSwgbm90IGEgTlVMTCBwb2ludGVyLikKKworMjAwNC0wMy0yNSAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvZGVidWcvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVidWcvYnJlYWtteWRhdGEuYzoKKwkgIGFkZCBlbGVtZW50IHRoYXQgcXVhc2ktcmFuZG9tbHkgY2hhbmdlcyBieXRlcyBpbiB0aGUgc3RyZWFtLgorCSAgSW50ZW5kZWQgdXNlIGlzIHJvYnVzdG5lc3MgY2hlY2tpbmcgb2YgZGVtdXhlcnMgYW5kIGRlY29kZXJzIGluCisJICBtZWRpYSB0ZXN0cy4KKworMjAwNC0wMy0yNCAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9vcGVuX2F1ZGlvKSwKKwkoZ3N0X2Fsc2FfcHJvYmVfaHdfcGFyYW1zKToKKwkqIGV4dC9hbHNhL2dzdGFsc2EuaDoKKwkgIGRlYnVnZ2luZyBvdXRwdXQgZml4ZXMKKworMjAwNC0wMy0yNCAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzcmMuYzogKGdzdF9nbm9tZXZmc3NyY19zZXRfcHJvcGVydHkpOgorCSAgZG9uJ3QgZ19yZXR1cm5faWZfZmFpbCBpZiBlbGVtZW50IGlzIFBMQVlJTkcsIGZhaWwgc2lsZW50bHkgYXMgZXZlcnkKKwkgIG90aGVyIGVsZW1lbnQuCisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5jOiAoZ3N0X3F1YXJrdHZfY2hhaW4pOgorCSAgb25seSBmaXggbmVlZGVkIGZvciBjYXN0IGx2YWx1ZSBpc3N1ZXMgaW4gZ3N0LXBsdWdpbnMKKwkqIGdzdC92b2xlbnYvZ3N0dm9sZW52LmM6IChnc3Rfdm9sZW52X2luaXQpOgorCSAgYWRkIHByb3h5X2dldGNhcHMKKworMjAwNC0wMy0yNCAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogKGdzdF9sZXZlbF9pbml0KToKKwkgIGFkZCBwcm94eWluZyBnZXRjYXBzIGZ1bmN0aW9uLCBzbyBsZXZlbCBkb2Vzbid0IGFkdmVydGlzZSBpbXBvc3NpYmxlCisJICBjYXBzCisKKzIwMDQtMDMtMjQgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQpLAorCShnc3RfcXRkZW11eF9sb29wX2hlYWRlciksIChxdGRlbXV4X3BhcnNlX21vb3YpLCAocXRkZW11eF9wYXJzZSksCisJKHF0ZGVtdXhfbm9kZV9kdW1wX2ZvcmVhY2gpLCAocXRkZW11eF9kdW1wX212aGQpLAorCShxdGRlbXV4X2R1bXBfdGtoZCksIChxdGRlbXV4X2R1bXBfZWxzdCksIChxdGRlbXV4X2R1bXBfbWRoZCksCisJKHF0ZGVtdXhfZHVtcF9oZGxyKSwgKHF0ZGVtdXhfZHVtcF92bWhkKSwgKHF0ZGVtdXhfZHVtcF9kcmVmKSwKKwkocXRkZW11eF9kdW1wX3N0c2QpLCAocXRkZW11eF9kdW1wX3N0dHMpLCAocXRkZW11eF9kdW1wX3N0c3MpLAorCShxdGRlbXV4X2R1bXBfc3RzYyksIChxdGRlbXV4X2R1bXBfc3RzeiksIChxdGRlbXV4X2R1bXBfc3RjbyksCisJKHF0ZGVtdXhfZHVtcF9jbzY0KSwgKHF0ZGVtdXhfZHVtcF9kY29tKSwgKHF0ZGVtdXhfZHVtcF9jbXZkKSwKKwkocXRkZW11eF9wYXJzZV90cmVlKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayk6ICBGaXggZGVidWdnaW5nCisJbWVzc2FnZXMuICBEaXZpZGUgdGhlIGNodW5rIHNpemUgYnkgdGhlIGNvbXByZXNzaW9uIHJhdGlvCisJKG5lZWRlZCBmb3IgTUFDRSBhdWRpbykKKworMjAwNC0wMy0yMyAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L21wZWdhdWRpb3BhcnNlL2dzdG1wZWdhdWRpb3BhcnNlLmM6IChnc3RfbXAzcGFyc2VfY2hhaW4pOgorCSAgRml4IGJ1ZmZlciBvdmVyZmxvdyByZWFkIGVycm9yLgorCisyMDA0LTAzLTIzICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmg6CisJICBSZW1vdmUgdW51c2VkIGVudHJ5LgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOiAoZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX2NhcHMpOgorCSAgQWRkIGNpbmVwYWsuCisJKiBnc3QvdmlkZW9kcm9wL2dzdHZpZGVvZHJvcC5jOiAoZ3N0X3ZpZGVvZHJvcF9nZXRjYXBzKSwKKwkoZ3N0X3ZpZGVvZHJvcF9saW5rKSwgKGdzdF92aWRlb2Ryb3BfY2hhaW4pOgorCSAgRml4LCBzb3J0IG9mLiBXYXMgaG9ycmlibHkgYnJva2VuIHdpdGggbmV3IGNhcHNuZWdvLiBCYWguLi4KKworMjAwNC0wMy0yMyAgSmVyZW15IFNpbW9uICA8amVzaW1vbkBsaWJlcnR5c3VyZi5mcj4KKworCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChhcGVfdHlwZV9maW5kKSwKKwkocGx1Z2luX2luaXQpOgorCUFkZCBhIG1vbmtleXNhdWRpbyB0eXBlZmluZCBmdW5jdGlvbgorCisyMDA0LTAzLTIzICBKb2hhbiBEYWhsaW4gIDxqb2hhbkBnbm9tZS5vcmc+CisKKwkqIGdzdC1saWJzL2dzdC9wbGF5L3BsYXkuYyAoZ3N0X3BsYXlfYXVkaW9fZml4YXRlKQorCShnc3RfcGxheV92aWRlb19maXhhdGUpOiBDaGVjayBzbyB0aGUgc3RydWN0dXJlIGhhcyB0aGUgZmllbGQKKwliZWZvcmUgdHJ5aW5nIHRvIGZpeGF0ZSB0aGVtLCB0aGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGhhdmUKKwlmYWtlc2lua3MgZm9yIHZpZGVvIGFuZCBhdWRpbyBvdXRwdXQgd2l0aG91dCBwcmludGluZyBlcnJvcnMgb24KKwl0aGUgb3V0cHV0IGNvbnNvbGUuCisKKzIwMDQtMDMtMjIgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogc3lzL29zcy9NYWtlZmlsZS5hbToKKwkqIHN5cy9vc3Mvb3NzX3Byb2JlLmM6IChtYWluKSwgKHByb2JlX2NoZWNrKSwgKGFkZF9yYW5nZSksCisJKGNoZWNrX3JhdGUpLCAoYWRkX3JhdGUpOiAgUmF0ZSBwcm9iaW5nIHRlc3QgYXBwLgorCisyMDA0LTAzLTIxICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6IChnc3RfYXVkaW9fY29udmVydF9saW5rKSwKKwkoX2ZpeGF0ZV9jYXBzX3RvX2ludCksIChnc3RfYXVkaW9fY29udmVydF9maXhhdGUpOgorCSAgYWRkIGEgZml4YXRpb24gZnVuY3Rpb24gdGhhdCBwcmV0dHkgbXVjaCBkb2VzIHRoZSByaWdodCB0aGluZyAoZml4ZXMKKwkgICMxMzc1NTYpCisKKzIwMDQtMDMtMjAgIERhdmlkIEkuIExlaG4gIDxkbGVobkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzogR1NUX1BBQ0tBR0UgZGVmYXVsdDogcy9HU3RyZWFtZXIvR1N0cmVhbWVyIFBsdWdpbnMvCisKKzIwMDQtMDMtMjAgIFRpbS1QaGlsbGlwIE3DvGxsZXIgPHQuaS5tQHplbi5jby51az4KKworCXJldmlld2VkIGJ5OiBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfcGFkX3B1c2gpOgorCSAgdGVybWluYXRlIGdzdF9ldmVudF9uZXdfZGlzY29udGludW91cyBjb3JyZWN0bHkgKGZpeGVzIHBhcnRzIG9mCisJICAjMTM3NzExKQorCisyMDA0LTAzLTE5ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC1saWJzL2dzdC9NYWtlZmlsZS5hbTogIEVuYWJsZSB4b3ZlcmxheSB1bmNvbmRpdGlvbmFsbHksCisJc2luY2UgaXQgZG9lc24ndCBkZXBlbmQgb24gWCwgYW5kIGl0J3MgcGFydCBvZiBvdXIgQUJJLgorCisyMDA0LTAzLTE5ICBJYWluIDxpYWluQHByZXR0eXBlb3BsZS5vcmc+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jIChkZWludGVybGVhdmVfc2lua19saW5rKTogVXNlIHRoZQorCWlzX2ludCBpbiB0aGUgc3RydWN0dXJlLCBub3QgdGhlIGxvY2FsIHZhcmlhYmxlLgorCisyMDA0LTAzLTE5ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9saWJyZmIvZ3N0cmZic3JjLmM6IChnc3RfcmZic3JjX2NoYW5nZV9zdGF0ZSksCisJKGdzdF9yZmJzcmNfaW5pdCksIChnc3RfcmZic3JjX2dldGNhcHMpLCAoZ3N0X3JmYnNyY19maXhhdGUpLAorCShnc3RfcmZic3JjX2xpbmspLCAoZ3N0X3JmYnNyY19wYWludF9yZWN0KSwgKGdzdF9yZmJzcmNfZ2V0KToKKwlJbXByb3ZlbWVudHMgaW4gY2FwcyBuZWdvdGlhdGlvbi4KKworMjAwNC0wMy0xOCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogcG8vTElOR1VBUzoKKwkqIHBvL2FmLnBvOgorICAgICAgICAgIGFkZGluZyBBZnJpa2FhbnMgKFBldHJpIEpvb3N0ZSkKKworMjAwNC0wMy0xOCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29sb3JzcGFjZS5jOgorCShnc3RfZmZtcGVnY29sb3JzcGFjZV9jaGFpbik6CisgICAgICAgIHRocm93IGVycm9yIGluc3RlYWQgb2YgZ19jcml0aWNhbCAoIzEzNzU4OCkKKworMjAwNC0wMy0xOCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogTWFrZWZpbGUuYW06CisJKiBjb25maWd1cmUuYWM6CisgICAgICAgICAgZGlzdCBjb21tb24gYW5kIG00IGNvcnJlY3RseQorCSogcG8vc3YucG86CisKKzIwMDQtMDMtMTcgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogcGtnY29uZmlnL2dzdHJlYW1lci1tZWRpYS1pbmZvLnBjLmluOiAgQWRkIFZlcnNpb24uCisJKGJ1ZyAjMTM3MzQ4KQorCisyMDA0LTAzLTE3ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBwby9MSU5HVUFTOgorCSogcG8vc3YucG86CisgICAgICAgICAgYWRkaW5nIFN3ZWRpc2ggdHJhbnNsYXRpb24gKENocmlzdGlhbiBSb3NlKQorCisyMDA0LTAzLTE3ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBNYWtlZmlsZS5hbTogdXNlIHJlbGVhc2UubWFrCisKKzIwMDQtMDMtMTYgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbW1vbi9DaGFuZ2VMb2c6CisJKiBjb21tb24vZ3N0LWF1dG9nZW4uc2g6CisgICAgICAgICAgYWRkIHNvbWUgZXhwbGFuYXRpb24gYWJvdXQgdGhlIHZlcnNpb24gZGV0ZWN0aW9uCisJKiBjb25maWd1cmUuYWM6CisgICAgICAgICAgZml4IFggY2hlY2sKKworMjAwNC0wMy0xNiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOiBidW1wIG5hbm8gdG8gMQorCis9PT0gcmVsZWFzZSAwLjguMCA9PT0KKworMjAwNC0wMy0xNiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOiByZWxlYXNlIDAuOC4wLCAiUGhhcm1hY2V1dGljYWwgSXRjaCIKKworMjAwNC0wMy0xNiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorICAgICAgICAgIHVwZGF0ZSBsaWJ0b29sIHZlcnNpb24KKwkqIGdzdC1saWJzL2dzdC9tZWRpYS1pbmZvL01ha2VmaWxlLmFtOgorICAgICAgICAgIGFjdHVhbGx5IHVzZSBsaWJ0b29sIHZlcnNpb24KKworMjAwNC0wMy0xNSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOiBmaXggc3BlZXggZGV0ZWN0aW9uIHRvIHdvcmsgd2l0aCAxLjAgYnV0IG5vdCAxLjEKKworMjAwNC0wMy0xNSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0LXBsdWdpbnMuc3BlYy5pbjoKKwkqIHBrZ2NvbmZpZy9NYWtlZmlsZS5hbToKKwkqIHBrZ2NvbmZpZy9nc3RyZWFtZXItZ2NvbmYtdW5pbnN0YWxsZWQucGMuaW46CisJKiBwa2djb25maWcvZ3N0cmVhbWVyLWludGVyZmFjZXMtdW5pbnN0YWxsZWQucGMuaW46CisJKiBwa2djb25maWcvZ3N0cmVhbWVyLWxpYnMtdW5pbnN0YWxsZWQucGMuaW46CisJKiBwa2djb25maWcvZ3N0cmVhbWVyLWxpYnMucGMuaW46CisJKiBwa2djb25maWcvZ3N0cmVhbWVyLW1lZGlhLWluZm8tdW5pbnN0YWxsZWQucGMuaW46CisJKiBwa2djb25maWcvZ3N0cmVhbWVyLXBsYXktdW5pbnN0YWxsZWQucGMuaW46CisJKiBwa2djb25maWcvZ3N0cmVhbWVyLXBsdWdpbnMtdW5pbnN0YWxsZWQucGMuaW46CisJKiBwa2djb25maWcvZ3N0cmVhbWVyLXBsdWdpbnMucGMuaW46CisgICAgICAgICAgcmVtb3ZlIEBWRVJTSU9OQCBmcm9tIHNvbWUgb2YgdGhlIHBjIGZpbGVzIHNpbmNlIGNvcmUgYW5kIHBsdWdpbnMKKyAgICAgICAgICBhcmUgZGVjb3VwbGVkLgorICAgICAgICAgIGNyZWF0ZWQgZ3N0cmVhbWVyLXBsdWdpbnMucGMgYXMgaXQncyBhIGJldHRlciBuYW1lLCBidXQga2VlcGluZworICAgICAgICAgIC1saWJzIGFyb3VuZCBmb3Igbm93IHRvIGdldCBmaXhlcyB1cHN0cmVhbSBkb25lIGZpcnN0LgorCisyMDA0LTAzLTE1ICBKdWxpZW4gTU9VVFRFIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5jOiAoZ3N0X3BsYXlfZ2V0X2ZyYW1lcmF0ZSksCisJKGdzdF9wbGF5X2dldF9zaW5rX2VsZW1lbnQpOiBGaXJzdCBkcmFmdCBvZiBnc3RfcGxheV9nZXRfZnJhbWVyYXRlLgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5oOgorCisyMDA0LTAzLTE1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiAqLmMsICouY2M6IGRvbid0IG1peCB0YWJzIGFuZCBzcGFjZXMKKworMjAwNC0wMy0xNSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5jOiAoZ3N0X3BsYXlfcGlwZWxpbmVfc2V0dXApOgorICAgICAgICAgIHVzZSB0aGUgbmV3IGZmbXBlZ2NvbG9yc3BhY2UKKwkqIGdzdC1wbHVnaW5zLnNwZWMuaW46CisgICAgICAgICAgcGFja2FnZSBuZXcgY29sb3JzcGFjZSBhbmQgbWVkaWEtaW5mbworCSogY29uZmlndXJlLmFjOgorCSogcGtnY29uZmlnL01ha2VmaWxlLmFtOgorICAgICAgICAgIGZpeCBzb21lIG1vcmUgZGlzdGluZyBpc3N1ZXMKKwkqIHBrZ2NvbmZpZy9nc3RyZWFtZXItbWVkaWEtaW5mby11bmluc3RhbGxlZC5wYy5pbjoKKwkqIHBrZ2NvbmZpZy9nc3RyZWFtZXItbWVkaWEtaW5mby5wYy5pbjoKKyAgICAgICAgICBnZW5lcmF0ZSBtZWRpYS1pbmZvIHBjIGZpbGVzCisKKzIwMDQtMDMtMTUgIEpvaGFuIERhaGxpbiAgPGpvaGFuQGdub21lLm9yZz4KKworCSogKi5oOiBSZXZlcnQgaW5kZW50aW5nCisKKzIwMDQtMDMtMTUgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKyAgICAgICAgICBhZGRpbmcgZmZtcGVnY29sb3JzcGFjZSBlbGVtZW50CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2F2Y29kZWMuaDoKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2NvbW1vbi5oOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZHNwdXRpbC5jOiAoZHNwdXRpbF9zdGF0aWNfaW5pdCk6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9kc3B1dGlsLmg6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWcuYzogKHBsdWdpbl9pbml0KToKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvZGVjbWFwLmM6CisJKGdzdF9mZm1wZWdfcGl4Zm10X3RvX2NhcHMpLCAoZ3N0X2ZmbXBlZ19waXhfZm10X3RvX2NhcHMpLAorCShnc3RfZmZtcGVnX2NhcHNfdG9fcGl4X2ZtdCk6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2RlY21hcC5oOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29sb3JzcGFjZS5jOgorCShnc3RfZmZtcGVnY29sb3JzcGFjZV9jYXBzX3JlbW92ZV9mb3JtYXRfaW5mbyksCisJKGdzdF9mZm1wZWdjb2xvcnNwYWNlX2dldGNhcHMpLCAoZ3N0X2ZmbXBlZ2NvbG9yc3BhY2VfcGFkX2xpbmspLAorCShnc3RfZmZtcGVnY29sb3JzcGFjZV9nZXRfdHlwZSksIChnc3RfZmZtcGVnY29sb3JzcGFjZV9iYXNlX2luaXQpLAorCShnc3RfZmZtcGVnY29sb3JzcGFjZV9jbGFzc19pbml0KSwgKGdzdF9mZm1wZWdjb2xvcnNwYWNlX2luaXQpLAorCShnc3RfZmZtcGVnY29sb3JzcGFjZV9jaGFpbiksIChnc3RfZmZtcGVnY29sb3JzcGFjZV9jaGFuZ2Vfc3RhdGUpLAorCShnc3RfZmZtcGVnY29sb3JzcGFjZV9zZXRfcHJvcGVydHkpLAorCShnc3RfZmZtcGVnY29sb3JzcGFjZV9nZXRfcHJvcGVydHkpLAorCShnc3RfZmZtcGVnY29sb3JzcGFjZV9yZWdpc3Rlcik6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9pbWdjb252ZXJ0LmM6CisJKGF2Y29kZWNfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKSwgKGF2Y29kZWNfZ2V0X3BpeF9mbXRfbmFtZSksCisJKGF2Y29kZWNfZ2V0X3BpeF9mbXQpLCAoYXZwaWN0dXJlX2ZpbGwpLCAoYXZwaWN0dXJlX2xheW91dCksCisJKGF2cGljdHVyZV9nZXRfc2l6ZSksIChhdmNvZGVjX2dldF9waXhfZm10X2xvc3MpLAorCShhdmdfYml0c19wZXJfcGl4ZWwpLCAoYXZjb2RlY19maW5kX2Jlc3RfcGl4X2ZtdDEpLAorCShhdmNvZGVjX2ZpbmRfYmVzdF9waXhfZm10KSwgKGltZ19jb3B5X3BsYW5lKSwgKGltZ19jb3B5KSwKKwkoeXV2NDIyX3RvX3l1djQyMHApLCAoeXV2NDIyX3RvX3l1djQyMnApLCAoeXV2NDIycF90b195dXY0MjIpLAorCShDX0pQRUdfVE9fQ0NJUiksIChpbWdfY29udmVydF9pbml0KSwgKGltZ19hcHBseV90YWJsZSksCisJKHNocmluazQxKSwgKHNocmluazIxKSwgKHNocmluazEyKSwgKHNocmluazIyKSwgKHNocmluazQ0KSwKKwkoZ3JvdzIxX2xpbmUpLCAoZ3JvdzQxX2xpbmUpLCAoZ3JvdzIxKSwgKGdyb3cyMiksIChncm93NDEpLAorCShncm93NDQpLCAoY29udjQxMSksIChnaWZfY2x1dF9pbmRleCksIChidWlsZF9yZ2JfcGFsZXR0ZSksCisJKGJpdGNvcHlfbiksIChtb25vX3RvX2dyYXkpLCAobW9ub3doaXRlX3RvX2dyYXkpLAorCShtb25vYmxhY2tfdG9fZ3JheSksIChncmF5X3RvX21vbm8pLCAoZ3JheV90b19tb25vd2hpdGUpLAorCShncmF5X3RvX21vbm9ibGFjayksIChhdnBpY3R1cmVfYWxsb2MpLCAoYXZwaWN0dXJlX2ZyZWUpLAorCShpc195dXZfcGxhbmFyKSwgKGltZ19jb252ZXJ0KSwgKGdldF9hbHBoYV9pbmZvX3BhbDgpLAorCShpbWdfZ2V0X2FscGhhX2luZm8pLCAoZGVpbnRlcmxhY2VfbGluZSksCisJKGRlaW50ZXJsYWNlX2xpbmVfaW5wbGFjZSksIChkZWludGVybGFjZV9ib3R0b21fZmllbGQpLAorCShkZWludGVybGFjZV9ib3R0b21fZmllbGRfaW5wbGFjZSksIChhdnBpY3R1cmVfZGVpbnRlcmxhY2UpOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvaW1nY29udmVydF90ZW1wbGF0ZS5oOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvbWVtLmM6IChhdl9tYWxsb2MpLCAoYXZfcmVhbGxvYyksIChhdl9mcmVlKToKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL21teC5oOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvdXRpbHMuYzogKGF2Y29kZWNfaW5pdCk6CisgICAgICAgICAgYWRkaW5nIGZmbXBlZ2NvbG9yc3BhY2UgZWxlbWVudCBzdXBwbGllZCBieSBSb25hbGQgYWZ0ZXIgY2xlYW5pbmcKKyAgICAgICAgICB1cCBhbmQgcHVsbGluZyBpbiB0aGUgcmlnaHQgYml0cyBvZiB1cHN0cmVhbSBzb3VyY2UuCisgICAgICAgICAgSSdtIHN1cmUgYSBiZXR0ZXIgQy9jb21waWxlciB3aXphcmQgY291bGQgZG8gc29tZSBjbGVhbmluZyB1cCAoZm9yCisgICAgICAgICAgZXhhbXBsZSB1c2UgR0xJQidzIG1hbGxvYyBzdHVmZiksIGJ1dCBhcyBhIGZpcnN0IHBhc3MgdGhpcworICAgICAgICAgIHdvcmtzIHZlcnkgd2VsbAorCisyMDA0LTAzLTE1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmg6CisJICBJIGFzc3VtZSBSb25hbGQgZm9yZ290IHRvIGNvbW1pdCB0aGUgY2hhbmdlIHRvIGhhdmUgY2FyZG5hbWUKKyAgICAgICAgICBhcyBhIHN0cnVjdCBtZW1iZXIuICBFeHBlY3Qgc29tZSBwdWJsaWMgc3BhbmtpbmcgYXQgdGhlIG5leHQKKyAgICAgICAgICBvcHBvcnR1bml0eS4KKworMjAwNC0wMy0xNSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X2Fsc2Ffb3Blbl9hdWRpbyksIChnc3RfYWxzYV9jbG9zZV9hdWRpbyk6CisJKiBleHQvYWxzYS9nc3RhbHNhLmM6CisJICBEb24ndCBvcGVuIHRoZSBkZXZpY2UgaWYgd2UncmUgYSBtaXhlciAoPSBwYWRsZXNzKS4KKwkqIGV4dC9hbHNhL2dzdGFsc2FtaXhlci5jOiAoZ3N0X2Fsc2FfbWl4ZXJfY2xhc3NfaW5pdCksCisJKGdzdF9hbHNhX21peGVyX2luaXQpLCAoZ3N0X2Fsc2FfbWl4ZXJfb3BlbiksCisJKGdzdF9hbHNhX21peGVyX2Nsb3NlKSwgKGdzdF9hbHNhX21peGVyX2NoYW5nZV9zdGF0ZSk6CisJICBPcGVuIG1peGVyIGR1cmluZyBzdGF0ZSBjaGFuZ2UgcmF0aGVyIHRoYW4gZHVyaW5nIG9iamVjdAorCSAgaW5pdGlhbGl6YXRpb24uIEFsc28sIGdldCBhIGRldmljZSBuYW1lLiBDdXJyZW50bHkgaW4gYSBzb21ld2hhdAorCSAgaGFja2lzaCBmYXNoaW9uLCBidXQgSSBkaWRuJ3QgcmVhbGx5IGZpbmQgc29tZXRoaW5nIGJldHRlci4KKworMjAwNC0wMy0xNCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogKi5jLCAqLmg6IHJ1biBnc3QtaW5kZW50CisKKzIwMDQtMDMtMTQgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L21vZHBsdWcvZ3N0bW9kcGx1Zy5jYzoKKwkqIGdzdC9tb2RwbHVnL2dzdG1vZHBsdWcuaDoKKwkgIHNldCBjb3JyZWN0IHRpbWVzdGFtcHMgb24gb3V0Z29pbmcgYnVmZmVycworCisyMDA0LTAzLTE0ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9tb2RwbHVnL2dzdG1vZHBsdWcuY2M6CisJICBoYW5kbGUgZXZlbnRzIC0gZG9uJ3QgZG8gY3JhcCB3aGVuIGEgZGlzY29udCBhcnJpdmVzIHRoYXQncyBub3QKKwkgIG5lY2Vzc2FyeQorCSAgVGhpcyBhbGxvd3MgY29ycmVjdCBsb2FkaW5nIGFuZCBwbGF5YmFjayBvZiBtb2RzIGluIFJoeXRobWJveAorCisyMDA0LTAzLTE0ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC1saWJzL2dzdC9nY29uZi9NYWtlZmlsZS5hbToKKwkqIHBrZ2NvbmZpZy9NYWtlZmlsZS5hbToKKwkgIG1vdmUgZ3N0cmVhbWVyLWdjb25mIHBrZ2NvbmZpZyBmaWxlcyB0byBwa2djb25maWcvIGRpci4gTWFrZSBzdXJlCisJICB0aGV5IGdldCByZWJ1aWx0IHByb3Blcmx5CisJKiBjb25maWd1cmUuYWM6CisJICB3aGVuIGNoZWNraW5nIGZvciB2b3JiaXMsIHRyeSBwa2djb25maWcgZmlyc3QuCisJKiBnc3QvbW9kcGx1Zy9nc3Rtb2RwbHVnLmNjOgorCSAgYWRkIGZpeGF0ZSBmdW5jdGlvbgorCisyMDA0LTAzLTE0ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgRml4IGZvciBvYnZpb3VzIG1pc3Rha2UsIHdoZXJlIHdlIGZpcnN0IHNoaWZ0IHRoZSBvZmZzZXQgYW5kIHRoZW4KKwkgIHJlYWQgYSBzYW1wbGVzaXplIGVsZW1lbnQgYXNzdW1pbmcgdGhlIG9sZCBvZmZzZXQuIE5vdGUgdGhhdCB0aGlzCisJICBwYXJ0IHN0aWxsIGhhcyBzb21ldGhpbmcgd2VpcmQsIGkuZS4gbXkgbW92aWVzIGNvbnRhaW5pbmcgdGhvc2UKKwkgIGRvbid0IGFjdHVhbGx5IHBsYXkgd2VsbCwgYnV0IGF0IGxlYXN0IHRoZXJlJ3Mgc29tZXRoaW5nIHRoYXQgbG9va3MKKwkgIGxpa2Ugc291bmQgbm93LgorCisyMDA0LTAzLTE0ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKHNwZWV4X3R5cGVfZmluZCksCisJKHBsdWdpbl9pbml0KToKKwlBZGQgYSB0eXBlZmluZCBmdW5jdGlvbiBmb3Igc3BlZXggZm9ybWF0CisKKzIwMDQtMDMtMTMgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOiAoZ3N0X2FzZl9kZW11eF92aWRlb19jYXBzKSwKKwkoZ3N0X2FzZl9kZW11eF9zZXR1cF9wYWQpOgorCSAgVXNlIDI1ZnBzIGFzIG91ciAiZmFrZSIgZnBzIHZhbHVlIChtYXJrZWQgZm9yIGZpeGFnZSBpbiAwLjkueCkKKwkgIGluc3RlYWQgb2YgMC4gUmVhc29uIGlzIHNpbXBsZTogc29tZSBlbGVtZW50cyBoYXZlIGEgZnBzIHJhbmdlCisJICBvZiAxLW1heCBpbnN0ZWFkIG9mIDAtbWF4LiBTbyBub3cgQVNGIHZpZGVvIGFjdHVhbGx5IHdvcmtzLgorCisyMDA0LTAzLTEzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBwby9MSU5HVUFTOgorCSogcG8vc3IucG86CisJICBhZGRpbmcgc2VyYmlhbiBhcyBhIGxhbmd1YWdlCisKKzIwMDQtMDMtMTMgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L3NpbmUvZ3N0c2luZXNyYy5jOiAoZ3N0X3NpbmVzcmNfZ2V0KToKKwkgIHJldHVybiB0YWdsaXN0IGNvcnJlY3RseSBmcm9tIF9nZXQgZnVuY3Rpb24sIGRvbid0IGdzdF9wYWRfcHVzaCBpdC4KKwkgIChmaXhlcyAjMTM3MDQyKQorCisyMDA0LTAzLTEzICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9jbGFzc19wcm9iZV9kZXZpY2VzKToKKworMjAwNC0wMy0xMyAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVyLmM6IChnc3RfYWxzYV9taXhlcl9mcmVlX2xpc3QpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVydHJhY2suYzogKGdzdF9hbHNhX21peGVyX3RyYWNrX2NsYXNzX2luaXQpLAorCShnc3RfYWxzYV9taXhlcl90cmFja19uZXcpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVydHJhY2suaDoKKwkgIEZpeCBhbmNpZW50IGxlZnRvdmVycy4uLiBNaXhlclRyYWNrIGlzIGEgR09iamVjdC4KKworMjAwNC0wMy0xMyAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfY2xhc3NfcHJvYmVfZGV2aWNlcyk6CisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuYzogKGdzdF9vc3NlbGVtZW50X2NsYXNzX3Byb2JlX2RldmljZXMpOgorCSAgRG9uJ3QgYmxvY2sgZHVyaW5nIHByb2JpbmcuLi4KKworMjAwNC0wMy0xMiAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfZ2V0X3R5cGUpLCAoZ3N0X2Fsc2FfY2xhc3NfaW5pdCksCisJKGdzdF9hbHNhX2dldF9wcm9wZXJ0eSksIChnc3RfYWxzYV9wcm9iZV9nZXRfcHJvcGVydGllcyksCisJKGdzdF9hbHNhX2NsYXNzX3Byb2JlX2RldmljZXMpLCAoZ3N0X2Fsc2FfY2xhc3NfbGlzdF9kZXZpY2VzKSwKKwkoZ3N0X2Fsc2FfcHJvYmVfcHJvYmVfcHJvcGVydHkpLCAoZ3N0X2Fsc2FfcHJvYmVfbmVlZHNfcHJvYmUpLAorCShnc3RfYWxzYV9wcm9iZV9nZXRfdmFsdWVzKSwgKGdzdF9hbHNhX3Byb2JlX2ludGVyZmFjZV9pbml0KSwKKwkoZ3N0X2Fsc2Ffb3Blbl9hdWRpbyksIChnc3RfYWxzYV9jbG9zZV9hdWRpbyk6CisJKiBleHQvYWxzYS9nc3RhbHNhLmg6CisJICBBZGQgcHJvcGVydHlwcm9iZSBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24sIGFkZCBzb21lIGRldmljZS1uYW1lCisJICBwcm9wZXJ0eSwgYWxsIHRoaXMgc28gdGhhdCBpdCBsb29rcyBnb29kIGluIGdub21lLXZvbHVtZS1jb250cm9sLgorCisyMDA0LTAzLTEyICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogdGhlIEhlcm1lcyBsaWJyYXJ5IGNvbnRyb2xzIGhlcm1lc2NvbG9yc3BhY2UsIG5vdAorCWNvbG9yc3BhY2UuCisJKiBleHQvbXBlZzJkZWMvZ3N0bXBlZzJkZWMuYzogKGdzdF9tcGVnMmRlY19iYXNlX2luaXQpLAorCShnc3RfbXBlZzJkZWNfaW5pdCk6IG1pbm9yIHBldCBwZWV2ZTogZGlzYWJsZSBjb2RlIHdpdGggI2lmZGVmLAorCW5vdCAvKiAqLworCSogZXh0L3NkbC9zZGx2aWRlb3NpbmsuYzogQ2hhbmdlIFhJRCB0byB1bnNpZ25lZCBsb25nLgorCSogZXh0L3NkbC9zZGx2aWRlb3NpbmsuaDogZGl0dG8uCisJKiBnc3QvY29sb3JzcGFjZS9nc3Rjb2xvcnNwYWNlLmM6IEZpeCBvbGQgY29tbWVudHMgYWJvdXQgSGVybWVzCisKKzIwMDQtMDMtMTIgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L3hvdmVybGF5L3hvdmVybGF5LmM6IChnc3RfeF9vdmVybGF5X3NldF94d2luZG93X2lkKSwKKwkoZ3N0X3hfb3ZlcmxheV9nb3RfeHdpbmRvd19pZCk6CisJKiBnc3QtbGlicy9nc3QveG92ZXJsYXkveG92ZXJsYXkuaDoKKwkgIHJlcGxhY2UgWElEIHdpdGggdW5zaWduZWQgbG9uZyB0byBnZXQgcmlkIG9mIHRoZSB4bGlicyBkZXBlbmRlbmN5IGluCisJICBYT3ZlcmxheSAoZml4ZXMgIzEzNzAwNCkKKworMjAwNC0wMy0xMyAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCSogZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuYzogKGdzdF9hZ2luZ3R2X2Jhc2VfaW5pdCksCisJKGdzdF9hZ2luZ3R2X3NldHVwKToKKwkqIGdzdC9lZmZlY3R2L2dzdGRpY2UuYzogKGdzdF9kaWNldHZfZ2V0X3R5cGUpLAorCShnc3RfZGljZXR2X2Jhc2VfaW5pdCksIChnc3RfZGljZXR2X2NsYXNzX2luaXQpLAorCShnc3RfZGljZXR2X3NldHVwKSwgKGdzdF9kaWNldHZfaW5pdCksIChnc3RfZGljZXR2X2RyYXcpOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5jOiAoZ3N0X2VkZ2V0dl9nZXRfdHlwZSksCisJKGdzdF9lZGdldHZfYmFzZV9pbml0KSwgKGdzdF9lZGdldHZfY2xhc3NfaW5pdCksIChnc3RfZWRnZXR2X2luaXQpLAorCShnc3RfZWRnZXR2X3NldHVwKSwgKGdzdF9lZGdldHZfcmdiMzIpOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZWZmZWN0di5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzogKGdzdF9xdWFya3R2X2xpbmspLCAoZ3N0X3F1YXJrdHZfaW5pdCksCisJKGdzdF9xdWFya3R2X3NldF9wcm9wZXJ0eSk6CisJKiBnc3QvZWZmZWN0di9nc3RyZXYuYzogKGdzdF9yZXZ0dl9nZXRfdHlwZSksCisJKGdzdF9yZXZ0dl9iYXNlX2luaXQpLCAoZ3N0X3JldnR2X2NsYXNzX2luaXQpLCAoZ3N0X3JldnR2X2luaXQpLAorCShnc3RfcmV2dHZfc2V0dXApLCAoZ3N0X3JldnR2X3JnYjMyKToKKwkqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYzogKGdzdF9zaGFnYWRlbGljdHZfZ2V0X3R5cGUpLAorCShnc3Rfc2hhZ2FkZWxpY3R2X2Jhc2VfaW5pdCksIChnc3Rfc2hhZ2FkZWxpY3R2X2NsYXNzX2luaXQpLAorCShnc3Rfc2hhZ2FkZWxpY3R2X2luaXQpLCAoZ3N0X3NoYWdhZGVsaWN0dl9zZXR1cCksCisJKGdzdF9zaGFnYWRlbGljdHZfcmdiMzIpOgorCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5jOiAoZ3N0X3ZlcnRpZ290dl9nZXRfdHlwZSksCisJKGdzdF92ZXJ0aWdvdHZfYmFzZV9pbml0KSwgKGdzdF92ZXJ0aWdvdHZfY2xhc3NfaW5pdCksCisJKGdzdF92ZXJ0aWdvdHZfc2V0dXApLCAoZ3N0X3ZlcnRpZ290dl9pbml0KSwgKGdzdF92ZXJ0aWdvdHZfcmdiMzIpOgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCVBvcnQgZXZlcnl0aGluZyB0aGF0IGNhbiBiZSBwb3J0ZWQgdG8gdmlkZW9maWx0ZXIgYW5kIGZpeCB1cCB0aGUgY2Fwcy4KKwlDYW4gc29tZW9uZSB3aXRoIGEgYmlnLWVuZGlhbiBtYWNoaW5lIHBsZWFzZSBjaGVjayB0aGVzZT8KKworMjAwNC0wMy0xMCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IChnc3Rfb3Nzc2lua19pbml0KSwgKGdzdF9vc3NzaW5rX2dldF90aW1lKSwKKwkoZ3N0X29zc3NpbmtfY2hhaW4pLCAoZ3N0X29zc3NpbmtfY2hhbmdlX3N0YXRlKToKKwkgIExhdGVzdCBmaXhlcyBmb3IgQS9WIHN5bmMsIGF1ZGlvIHBsYXliYWNrIGFuZCBzdWNoLiBUaGlzIGlzIGFib3V0CisJICBhbGwuLi4gTVBFRyBwbGF5YmFjayBpc3N1ZXMgYXJlIG1vc3RseSByZWxhdGVkIHRvIHRoZSBhc3luYyBidWlsZC0KKwkgIHVwIG9mIE1QRUcgZmlsZXMsIEkgY2Fubm90IGZpeCB0aGF0LiBVc2UgYmFzaWNndGhyZWFkIHRvIHNvbHZlIGl0LgorCisyMDA0LTAzLTEwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJcGF0Y2ggZnJvbTogU3RlcGhhbmUgTG9ldWlsbGV0CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIHVzZSBwa2ctY29uZmlnIGZvciBzb21lIGxpYnJhcmllcywgZmFsbGluZyBiYWNrIHRvIHRoZSBvbGQgLm00IHdheQorICAgICAgICAgIChmaXhlcyAjMTMxMjcwKQorCSogbTQvbGliZHYubTQ6CisgICAgICAgICAgcmVtb3ZlZAorCisyMDA0LTAzLTEwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB0b29scy9NYWtlZmlsZS5hbToKKwkqIHRvb2xzL01ha2VmaWxlLmluOgorCSogdG9vbHMvZ3N0LWxhdW5jaC1leHQtbS5tOgorCSogdG9vbHMvZ3N0LWxhdW5jaC1leHQuMS5pbjoKKwkqIHRvb2xzL2dzdC12aXN1YWxpc2UtbS5tOgorCSogdG9vbHMvZ3N0LXZpc3VhbGlzZS4xOgorCSogdG9vbHMvZ3N0LXZpc3VhbGlzZS4xLmluOgorICAgICAgICAgIHJlb3JnYW5pemluZyBnZW5lcmF0aW9uIG9mIHNjcmlwdCB0b29scworCisyMDA0LTAzLTEwICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmM6CisJICBEb3duZ3JhZGUgcHJpb3JpdHkuIFdlIHByZWZlciBmZmRlY19tcGVnNC4KKwkqIGV4dC9mYWFkL2dzdGZhYWQuYzogKGdzdF9mYWFkX3NyY2dldGNhcHMpLCAoZ3N0X2ZhYWRfc3JjY29ubmVjdCksCisJKGdzdF9mYWFkX2NoYWluKSwgKGdzdF9mYWFkX2NoYW5nZV9zdGF0ZSk6CisJICBGaXggY2Fwc25lZ28uIERvZXNuJ3Qgd29yayBmb3Igc29tZSBzb3VuZHMgYmVjYXVzZSB3ZSBkb24ndCBoYXZlCisJICBhIDU6MSB0byBzdGVyZW8gZWxlbWVudC4KKwkqIGV4dC94dmlkL2dzdHh2aWQuYzogKHBsdWdpbl9pbml0KToKKwkgIEFkZCBwcmlvcml0eS4KKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiAoZ3N0X29zc3NpbmtfaW5pdCksIChnc3Rfb3Nzc2lua19jaGFpbiksCisJKGdzdF9vc3NzaW5rX2NoYW5nZV9zdGF0ZSk6CisJICBBZGQgZGlzY29udCBoYW5kbGluZy4KKworMjAwNC0wMy0wOSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogRml4IHR5cG8gaW4gd2lkdGggOAorCWNvbnZlcnNpb24uCisKKzIwMDQtMDMtMDkgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L21peGVyL21peGVyLmM6IChnc3RfbWl4ZXJfY2xhc3NfaW5pdCk6CisJICB0aGUgc2lnbmFscyB0YWtlIDIgYXJndW1lbnRzCisKKzIwMDQtMDMtMDkgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfcmVxdWVzdF9uZXdfcGFkKSwKKwkoZ3N0X2Fsc2FfZml4YXRlKTogQWRkIGZpeGF0ZSBmdW5jdGlvbi4gIChidWcgIzEzNjY4NikKKwkqIGV4dC9hbHNhL2dzdGFsc2EuaDoKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2luaXQpOgorCisyMDA0LTAzLTA5ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9taWttb2QvZ3N0bWlrbW9kLmM6IChnc3RfbWlrbW9kX2luaXQpLCAoZ3N0X21pa21vZF9sb29wKSwKKwkoZ3N0X21pa21vZF9jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L21pa21vZC9nc3RtaWttb2QuaDoKKwkgIG1ha2UgbWlrbW9kJ3MgbG9vcCBmdW5jdGlvbiBub3QgbG9vcCBpbmZpbml0ZWx5IGFuZCBjYWxsCisJICBnc3RfZWxlbWVudF95aWVsZCBhbnltb3JlCisJKiBnc3QvbW9kcGx1Zy9nc3Rtb2RwbHVnLmNjOgorCSAgZml4IHBhZCBuZWdvdGlhdGlvbiAoZml4ZXMgIzEzNjU5MCkKKworMjAwNC0wMy0wOSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvbGNzL01ha2VmaWxlLmFtOiAgRml4IHNvIHRoYXQgdGhlIGxjcyBjb2xvcnNwYWNlIHBsdWdpbgorCWRvZXNuJ3QgY29uZmxpY3Qgd2l0aCB0aGUgaW50ZXJuYWwgY29sb3JzcGFjZSBwbHVnaW4uCisJKiBnc3QtbGlicy9nc3QvYXVkaW8vbWFrZV9maWx0ZXI6ICBVc2UgYGAgaW5zdGVhZCBvZiAkKCkgdG8KKwlzYXRpc2Z5IHRoZSBjcmFwcHktYXNzIHNoZWxsIHNoaXBwZWQgYnkgYSBjZXJ0YWluIHZlbmRvci4KKwkqIGdzdC92aWRlb2ZpbHRlci9tYWtlX2ZpbHRlcjogc2FtZSAoYnVnICMxMzUyOTkpCisKKzIwMDQtMDMtMDkgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogYnVtcCBuYW5vIHRvIDEKKworPT09IHJlbGVhc2UgMC43LjYgPT09CisKKzIwMDQtMDMtMDkgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5pbjogcmVsZWFzaW5nIDAuNy42LCAiVGhlcmUiCisKKzIwMDQtMDMtMDkgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHBrZ2NvbmZpZy9nc3RyZWFtZXItcGxheS11bmluc3RhbGxlZC5wYy5pbjoKKwkqIHBrZ2NvbmZpZy9nc3RyZWFtZXItcGxheS5wYy5pbjoKKyAgICAgICAgICBzeW5jaHJvbml6ZSB0aGUgdHdvCisKKzIwMDQtMDMtMDkgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9jZHBhcmFub2lhL2dzdGNkcGFyYW5vaWEuYzogKGNkcGFyYW5vaWFfYmFzZV9pbml0KSwKKwkoY2RwYXJhbm9pYV9vcGVuKSwgKGNkcGFyYW5vaWFfZXZlbnQpOgorCSAgZml4L2FkZCBlcnJvciBoYW5kbGluZworCSogcG8vUE9URklMRVMuaW46CisJICBhZGQgY2RwYXJhbm9pYSBzb3VyY2UKKwkqIHRvb2xzL01ha2VmaWxlLmFtOgorCSAgbWFrZSBzY3JpcHRzIGV4ZWN1dGFibGUKKworMjAwNC0wMy0wOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L3ZvcmJpcy9NYWtlZmlsZS5hbToKKwkqIHN5cy9NYWtlZmlsZS5hbToKKwkgIHJlbW92ZSBpZDN0eXBlcywgdm9yYmlzZmlsZSBhbmQgeHZpZGVvc2luayBmcm9tIHRoZSBidWlsZCAoIzEzMzc4MykKKworMjAwNC0wMy0wOCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6IChnc3RfcmlmZl9yZWFkX2luZm8pOgorCSAgRml4IG1ldGFkYXRhIHJlYWQgY3Jhc2ggKCMxMzY1MzcpLgorCisyMDA0LTAzLTA4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QtbGlicy9nc3QvbWVkaWEtaW5mby9tZWRpYS1pbmZvLXByaXYuYzogKGdtaV9zZXRfbWltZSk6CisJKiBnc3QtbGlicy9nc3QvbWVkaWEtaW5mby9tZWRpYS1pbmZvLmM6IChnc3RfbWVkaWFfaW5mb19yZWFkKToKKyAgICAgICAgICBhZGRpbmcgbWltZSB0eXBlcywgZml4aW5nIHRoZSBvbmUtc3RvcCBmdW5jdGlvbgorCisyMDA0LTAzLTA4ICBDaHJpc3RpYW4gU2NoYWxsZXIgPFVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGV4dC9uYXMvbmFzc2luay5jIGFuZCAvZXh0L25hcy9uYXNzaW5rLmg6CisJTW9yZSBOQVMgbG92ZSBmcm9tIEFyd2VkIHZvbiBNZXJrYXR6CisJU28gbGV0cyBhbGwgc2luZyAnQ2FuIHlvdSBmZWVsIHRoZSBOQVMgdG9uaWdodCcKKworMjAwNC0wMy0wOCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDxVcmFldXNAZ25vbWUub3JnPgorCisJKiB0b29scy9nc3QtbGF1bmNoLWV4dC5pbjoKKwlSZXBsYWNlIHZvcmJpc2ZpbGUgd2l0aCBvZ2dkZW11eC92b3JiaXNkZWMvYXVkaW9jb252ZXJ0CisKKzIwMDQtMDMtMDggIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5jOiAoZ3N0X21wZWcyZGVjX2Jhc2VfaW5pdCksCisJKGdzdF9tcGVnMmRlY19pbml0KToKKyAgICAgICAgcmVtb3ZlIHRoZSB1c2VyX2RhdGEgcGFkIGZvciBub3csIGJlY2F1c2UgaXQgaXMgYmVpbmcgdXNlZCBpbgorICAgICAgICBmaXhhdGluZyBjYXVzaW5nIE1QRUcgcGxheWJhY2sgdG8gZml4YXRlIG9uIDEwMDAgSHogZm9yIHBsYXliYWNrLgorICAgICAgICBJZiBzb21lb25lIGtub3dzIGhvdyB0byBmaXggdGhpcyBwcm9wZXJseSwgcGxlYXNlIGRvLgorCisyMDA0LTAzLTA4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3NzaW5rX2dldF9kZWxheSksCisJKGdzdF9vc3NzaW5rX2dldF90aW1lKToKKyAgICAgICAgYWRkIGEgd2FybmluZywgSU1PIHRoaXMgd29uJ3QgZ2V0IHRyaWdnZXJlZCBhbnltb3JlLCByZW1vdmUgbGF0ZXIKKworMjAwNC0wMy0wNyAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3ZpZGVvX2NhcHMpOiAgQWRkZWQgQ2luZXBhaworCWZvcm1hdCAoYnVnICMxMzY0NzApCisKKzIwMDQtMDMtMDcgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC1saWJzL01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvbWVkaWEtaW5mby9tZWRpYS1pbmZvLXByaXYuYzogKGZvdW5kX3RhZ19jYWxsYmFjayksCisJKGVycm9yX2NhbGxiYWNrKSwgKGdzdF9tZWRpYV9pbmZvX2Vycm9yX2NyZWF0ZSksCisJKGdzdF9tZWRpYV9pbmZvX2Vycm9yX2VsZW1lbnQpLCAoZ21pcF9pbml0KSwgKGdtaXBfcmVzZXQpLAorCShnbWlfY2xlYXJfZGVjb2RlciksIChnbWlwX2ZpbmRfdHlwZV9wcmUpLCAoZ21pcF9maW5kX3R5cGUpOgorCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby1wcml2Lmg6CisJKiBnc3QtbGlicy9nc3QvbWVkaWEtaW5mby9tZWRpYS1pbmZvLXRlc3QuYzogKG1haW4pOgorCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby5jOiAoZ3N0X21lZGlhX2luZm9faW5pdCksCisJKGdzdF9tZWRpYV9pbmZvX2NsYXNzX2luaXQpLCAoZ3N0X21lZGlhX2luZm9faW5zdGFuY2VfaW5pdCksCisJKGdzdF9tZWRpYV9pbmZvX3NldF9zb3VyY2UpLCAoZ3N0X21lZGlhX2luZm9fcmVhZF93aXRoX2lkbGVyKSwKKwkoZ3N0X21lZGlhX2luZm9fcmVhZF9pZGxlciksIChnc3RfbWVkaWFfaW5mb19yZWFkKToKKwkqIGdzdC1saWJzL2dzdC9tZWRpYS1pbmZvL21lZGlhLWluZm8uaDoKKwlmaXhlZCwgc2hvdWxkIHdvcmsgbm93CisKKzIwMDQtMDMtMDcgIENocmlzdGlhbiBTY2hhbGxlciA8VXJhZXVzQGdub21lLm9yZz4KKworCSogZXh0L25hcy9uYXNzaW5rLmM6CisJQSBidW5jaCBvZiBOQVMgZml4ZXMgZnJvbSBBcndlZCB2b24gTWVya2F0egorCisyMDA0LTAzLTA2ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9hZGRfc3RyZWFtKSwKKwkocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIEZpeCBjcmFzaCAoaiBtaWdodCBiZSBncmVhdGVyIHRoYW4gbl9zYW1wbGVzLCBpbiB3aGljaCBjYXNlIHdlJ3JlCisJICB3cml0aW5nIG91dHNpZGUgdGhlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlIGFycmF5KSBhbmQgbWVtbGVhay4KKworMjAwNC0wMy0wNiAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IChnc3Rfb3Nzc2lua19jaGFpbik6CisJICBBbmQgYW5vdGhlciBjYWxsZXIgdGhhdCBjb3VsZG4ndCBoYW5kbGUgZGVsYXkgPCAwICh1bnNpZ25lZAorCSAgaW50ZWdlciBvdmVyZmxvdykuIFZpZGVvIG5vdyBjb250aW51ZXMgcGxheWluZyBvbiBhbiBhdWRpbworCSAgYnVmZmVyIHVuZGVycnVuLCBhbmQgdGhlIGNsb2NrIGNvbnRpbnVlcyB3b3JraW5nLiBBdWRpbyBzdGlsbAorCSAgc3RhbGxzLgorCisyMDA0LTAzLTA2ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3NzaW5rX2dldF9kZWxheSksCisJKGdzdF9vc3NzaW5rX2dldF90aW1lKToKKwkgIGdldF9kZWxheSgpIG1heSByZXR1cm4gdmFsdWVzIGxvd2VyIHRoYW4gMC4gSW4gdGhvc2UgY2FzZXMsIHdlCisJICBzaG91bGQgbm90IGFjdHVhbGx5IGNhc3QgdG8gKnVuc2lnbmVkKiBpbnQ2NCwgdGhhdCB3aWxsIGJyZWFrCisJICBzdHVmZiBob3JyaWJseS4gSW4gbXkgY2FzZSwgaXQgc2NyZXdlZCB1cCBBL1Ygc3luYyBpbiBtb3ZpZXMKKwkgIGluIHRvdGVtIHJhdGhlciBiYWRseS4KKworMjAwNC0wMy0wNiAgQ2hyaXN0b3BoZSBGZXJnZWF1ICA8dGV1ZkBnbm9tZS5vcmc+CisKKwkqIGV4dC9mYWFjL2dzdGZhYWMuYzogKGdzdF9mYWFjX2NoYWluKToKKwkqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzogKGdzdF9mbGFjX3RhZ19jaGFpbik6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiAodXNlcl93cml0ZV9kYXRhKToKKwkqIGV4dC9taWttb2QvZ3N0bWlrbW9kLmM6IChnc3RfbWlrbW9kX2xvb3ApOgorCSogZ3N0L2FjM3BhcnNlL2dzdGFjM3BhcnNlLmM6IChnc3RfYWMzcGFyc2VfY2hhaW4pOgorCSogZ3N0L21wZWcyc3ViL2dzdG1wZWcyc3VidC5jOiAoZ3N0X21wZWcyc3VidF9jaGFpbl9zdWJ0aXRsZSk6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RyZmMyMjUwZW5jLmM6IChnc3RfcmZjMjI1MF9lbmNfYWRkX3NsaWNlKToKKwlGaXggc2V2ZXJhbCBtaXN1c2Ugb2YgZ3N0X2J1ZmZlcl9tZXJnZSAoaXQgZG9lc24ndCB0YWtlIG93bmVyc2hpcAorCW9mIGFueSBidWZmZXIpLCBzaG91bGQgZml4IHNvbWUgbGVha3MuIEkgaG9wZSBJIGRpZG4ndCB1bnJlZiBidWZmZXJzCisJdGhhdCBzaG91bGRuJ3QgYmUuLi4KKworMjAwNC0wMy0wNiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby1wcml2LmM6IChoYXZlX3R5cGVfY2FsbGJhY2spLAorCShkZWVwX25vdGlmeV9jYWxsYmFjayksICh0YWdfZmxhZ19zY29yZSksIChmb3VuZF90YWdfY2FsbGJhY2spLAorCShlcnJvcl9jYWxsYmFjayksIChnbWlfcmVzZXQpLCAoZ21pX3NlZWtfdG9fdHJhY2spLAorCShnbWlfZ2V0X2RlY29kZXIpLCAoZ21pX3NldF9taW1lKSwgKGdtaXBfZmluZF90eXBlX3ByZSksCisJKGdtaXBfZmluZF90eXBlX3Bvc3QpLCAoZ21pcF9maW5kX3N0cmVhbV9wb3N0KSwKKwkoZ21pcF9maW5kX3RyYWNrX3N0cmVhbWluZm9fcG9zdCk6CisJKiBnc3QtbGlicy9nc3QvbWVkaWEtaW5mby9tZWRpYS1pbmZvLXByaXYuaDoKKwkqIGdzdC1saWJzL2dzdC9tZWRpYS1pbmZvL21lZGlhLWluZm8tdGVzdC5jOiAocHJpbnRfdGFnKSwKKwkoaW5mb19wcmludCksIChtYWluKToKKwkqIGdzdC1saWJzL2dzdC9tZWRpYS1pbmZvL21lZGlhLWluZm8uYzoKKwkoZ3N0X21lZGlhX2luZm9fZXJyb3JfY3JlYXRlKSwgKGdzdF9tZWRpYV9pbmZvX2Vycm9yX2VsZW1lbnQpLAorCShnc3RfbWVkaWFfaW5mb19pbnN0YW5jZV9pbml0KSwgKGdzdF9tZWRpYV9pbmZvX2dldF9wcm9wZXJ0eSksCisJKGdzdF9tZWRpYV9pbmZvX25ldyksIChnc3RfbWVkaWFfaW5mb19zZXRfc291cmNlKSwKKwkoZ3N0X21lZGlhX2luZm9fcmVhZF9pZGxlciksIChnc3RfbWVkaWFfaW5mb19yZWFkKToKKwkqIGdzdC1saWJzL2dzdC9tZWRpYS1pbmZvL21lZGlhLWluZm8uaDoKKyAgICAgICAgICBmaXJzdCBwYXNzIGF0IG1ha2luZyB0aGlzIHdvcmsgYWdhaW4uICBUaGlzIHNlZW1zIHRvIHdvcmsgb24KKyAgICAgICAgICB0YWdnZWQgb2dnL3ZvcmJpcyBhbmQgbXAzIGZpbGVzLgorCisyMDA0LTAzLTA2ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChnc3RfaWQzX3RhZ19jaGFpbik6CisJICBmaXggaHVnZSBsZWFrOiBnc3RfYnVmZmVyX21lcmdlIGRvZXNuJ3QgdW5yZWYgdGhlIGZpcnN0IGFyZ3VtZW50CisJICBpdHNlbGYuCisKKzIwMDQtMDMtMDYgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX2NsYXNzX2luaXQpLCAoZ3N0X21hZF91cGRhdGVfaW5mbyk6CisgICAgICAgICAgcmVwb3J0IGxheWVyL21vZGUvZW1waGFzaXMKKworMjAwNC0wMy0wNiAgQ2hyaXN0b3BoZSBGZXJnZWF1ICA8dGV1ZkBnbm9tZS5vcmc+CisKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX2NoYWluKTogZml4ZWQgY2FwcyBsZWFrCisKKzIwMDQtMDMtMDYgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfcGFkX25ldyk6CisgICAgICAgICAgc2lnbmFsIHNlcmlhbAorCisyMDA0LTAzLTA2ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvdm9yYmlzL3ZvcmJpcy5jOiAocGx1Z2luX2luaXQpOgorCSogZXh0L3ZvcmJpcy92b3JiaXNkZWMuYzogKHZvcmJpc19kZWNfZ2V0X2Zvcm1hdHMpLAorCShnc3Rfdm9yYmlzX2RlY19pbml0KSwgKHZvcmJpc19kZWNfZXZlbnQpOgorICAgICAgICBhZGQgZGVidWcgY2F0ZWdvcnkKKyAgICAgICAgbWFrZSB2b3JiaXNkZWMgaGFuZGxlIF9CWVRFIGFuZCBfVElNRSBxdWVyaWVzCisKKzIwMDQtMDMtMDYgIENocmlzdG9waGUgRmVyZ2VhdSAgPHRldWZAZ25vbWUub3JnPgorCisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9jaGFpbik6IHNlbmQgdGhlIGF2ZXJhZ2UgYml0cmF0ZSByZWFkCisJICBmcm9tIHRoZSB4aW5nIGhlYWRlcgorCisyMDA0LTAzLTA2ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6IChnc3RfYXVkaW9fY29udmVydF9nZXRjYXBzKSwKKwkoZ3N0X2F1ZGlvX2NvbnZlcnRfbGluayksIChnc3RfYXVkaW9fY29udmVydF9jaGFuZ2Vfc3RhdGUpLAorCShnc3RfYXVkaW9fY29udmVydF9idWZmZXJfZnJvbV9kZWZhdWx0X2Zvcm1hdCk6CisJICBkbyBjb252ZXJzaW9ucyBmcm9tL3RvIGZsb2F0IGNvcnJlY3RseSwgZml4IHNvbWUgY2FwcyBuZWdvIGVycm9ycywKKwkgIGV4cG9ydCBjb3JyZWN0IHN1cHBvcnRlZCBjYXBzIGluIHRlbXBsYXRlIGFuZCBnZXRjYXBzLCB1c2UgY29ycmVjdAorCSAgY2FwcyBpbiB0cnlfc2V0X2NhcHMgZnVuY3Rpb25zCisKKzIwMDQtMDMtMDYgIENocmlzdG9waGUgRmVyZ2VhdSAgPHRldWZAZ25vbWUub3JnPgorCisJRm9yIHNvbWUgcmVhc29uLCBJIG9ubHkgY29tbWl0dGVkIGEgQ2hhbmdlTG9nIGVudHJ5IHllc3RlcmRheSBhbmQKKwlub3QgdGhlIGNvcnJlc3BvbmRpbmcgY29kZS4uLgorCSogZXh0L21hZC9nc3RtYWQuYzogRml4IGRldGVjdGlvbiBvZiBYaW5nIGhlYWRlcnMKKwkqIGdzdC90YWdzL2dzdGlkM3RhZy5jOiBDaGFuZ2VzIHRvIHN1cHBvcnQgVExFTiB0YWdzCisKKzIwMDQtMDMtMDYgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19nZXRfcGFkX2J5X3BhZCksCisJKGdzdF9vZ2dfZGVtdXhfc3JjX3F1ZXJ5KToKKwkgIG1ha2Ugc3VyZSB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlcmUncyBubyBjdXJyZW50IGNoYWluCisJICBncmFjZWZ1bGx5LgorCisyMDA0LTAzLTA1ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzogKGdzdF9hYXNpbmtfZml4YXRlKSwgKGdzdF9hYXNpbmtfaW5pdCk6CisJQWRkIGZpeGF0ZSBmdW5jdGlvbi4gKGJ1ZyAjMTMxMTI4KQorCSogZXh0L3NkbC9zZGx2aWRlb3NpbmsuYzogKGdzdF9zZGx2aWRlb3NpbmtfaW5pdCksCisJKGdzdF9zZGx2aWRlb3NpbmtfZml4YXRlKTogIEFkZCBmaXhhdGUgZnVuY3Rpb24uCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOiAoZ3N0X2F1ZGlvX2NvbnZlcnRfbGluayk6CisJRml4IGF0dGVtcHQgdG8gcHJpbnQgYSBub24tcG9pbnRlciB1c2luZyBHU1RfUFRSX0ZPUk1BVC4KKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX3BhcnNlX2ZtdCk6CisJRml4IG1pc3NpbmcgYnJlYWsgdGhhdCB3YXMgY2F1c2luZyB1bGF3IHRvIGJlIGludGVycHJldGVkIGFzCisJcmF3IGludC4KKworMjAwNC0wMy0wNSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RyZmMyMjUwZW5jLmM6IChnc3RfcmZjMjI1MF9lbmNfYWRkX3NsaWNlKToKKwlGaXggY29kZSB0aGF0IGlnbm9yZXMgcmV0dXJuIHZhbHVlIG9mIGdzdF9idWZmZXJfbWVyZ2UoKS4KKwkoYnVnICMxMTQ1NjApCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKGdzdF9hc2ZfZGVtdXhfZGVzY3JhbWJsZV9zZWdtZW50KToKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdHJmYzIyNTBlbmMuYzogKGdzdF9yZmMyMjUwX2VuY19hZGRfc2xpY2UpOiBzYW1lCisJKiB0ZXN0c3VpdGUvZ3N0LWxpbnQ6ICBDaGVjayBmb3IgYWJvdmUuCisKKzIwMDQtMDMtMDUgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfZ2V0KTogIENoZWNrIGZvciB1bmZpeGVkCisJY2FwcyBhbmQgdGhyb3cgYW4gZWxlbWVudCBlcnJvci4gIChidWcgIzEzNjMzNCkKKworMjAwNC0wMy0wNSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvZmFhZC9nc3RmYWFkLmM6IChnc3RfZmFhZF9pbml0KSwgKGdzdF9mYWFkX3NyY2dldGNhcHMpLAorCShnc3RfZmFhZF9jaGFpbik6IEZpeCBuZWdvdGlhdGlvbi4KKwkqIGV4dC9saWJyZmIvZ3N0cmZic3JjLmM6IChnc3RfcmZic3JjX2hhbmRsZV9zcmNfZXZlbnQpOiBBZGQKKwlrZXkgYW5kIGJ1dHRvbiBldmVudHMuCisJKiBnc3QtbGlicy9nc3QvZmxvYXRjYXN0L2Zsb2F0Y2FzdC5oOiBGaXggYSBtaW5vciBidWcgaW4gdGhpcworCWR1bmcgaGVhcCBvZiBjb2RlLgorCSogZ3N0LWxpYnMvZ3N0L2djb25mL2dzdHJlYW1lci1nY29uZi11bmluc3RhbGxlZC5wYy5pbjogZ3N0Z2NvbmYKKwlkZXBlbmRzIG9uIGdjb25mCisJKiBnc3QtbGlicy9nc3QvZ2NvbmYvZ3N0cmVhbWVyLWdjb25mLnBjLmluOiBzYW1lCisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5LmM6IChnc3RfcGxheV9waXBlbGluZV9zZXR1cCksCisJKGdzdF9wbGF5X3ZpZGVvX2ZpeGF0ZSksIChnc3RfcGxheV9hdWRpb19maXhhdGUpOiBBZGQgYSBmaXhhdGUKKwlmdW5jdGlvbiB0byBlbmNvdXJhZ2UgYmV0dGVyIG5lZ290aWF0aW9uLCBwYXJ0aWN1bGFybHkgYmV0d2VlbgorCWF1ZGlvY29udmVydCBhbmQgb3Nzc2luay4KKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6IChnc3RfYXVkaW9fY29udmVydF9jaGFpbik6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlX3RyYWspOiAgTWFrZSBzb21lIGRlYnVnZ2luZworCW1vcmUgaW1wb3J0YW50LgorCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6ICBGaXggbWlzdGFrZSBpbiBmbGFzaAorCXR5cGVmaW5kaW5nLgorCSogZ3N0L3ZiaWRlYy92YmlzY3JlZW4uYzogIEFkZCBnbGliIGhlYWRlcgorCSogcGtnY29uZmlnL2dzdHJlYW1lci1wbGF5LnBjLmluOiAgRGVwZW5kcyBvbiBnc3QtaW50ZXJmYWNlcy4KKworMjAwNC0wMy0wNiAgQ2hyaXN0b3BoZSBGZXJnZWF1ICA8dGV1ZkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IEZpeCBkZXRlY3Rpb24gb2YgWGluZyBoZWFkZXJzCisJKiBnc3QvdGFncy9nc3RpZDN0YWcuYzogQ2hhbmdlcyB0byBzdXBwb3J0IFRMRU4gdGFncworCisyMDA0LTAzLTA2ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9wYXJzZV9mbXQpLAorCShnc3Rfd2F2cGFyc2VfcGFkX2NvbnZlcnQpLCAoZ3N0X3dhdnBhcnNlX3BhZF9xdWVyeSk6CisgICAgICAgICAgZGVidWcgdXBkYXRlcworCisyMDA0LTAzLTA2ICBDaHJpc3RvcGhlIEZlcmdlYXUgIDx0ZXVmQGdub21lLm9yZz4KKworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9tYWRfaWQzX3RvX3RhZ19saXN0KToKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX2luaXQpLCAoaXNfeGhlYWQpLAorCShtcGcxMjNfcGFyc2VfeGluZ19oZWFkZXIpLCAoZ3N0X21hZF9jaGFpbik6IHBhcnNlIFhpbmcgaGVhZGVyIGluIHZicgorCWZpbGVzLCBhbmQgcmVwb3J0IHRoZSBwYXJzZWQgbGVuZ3RoIGFzIGEgR1NUX1RBR19EVVJBVElPTiB0YWcuCisJKiBnc3QvdGFncy9nc3RpZDN0YWcuYzogc3VwcG9ydCBUTEVOIChkdXJhdGlvbikgdGFnCisKKzIwMDQtMDMtMDUgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogKGdzdF9hdWRpb19jb252ZXJ0X2NoYW5uZWxzKToKKwkgIGNvbnZlcnQgY2hhbm5lbHMgY29ycmVjdGx5LiBjb252ZXJ0IGNvcnJlY3RseSB0byB1bnNpZ25lZC4KKworMjAwNC0wMy0wNSAgSnVsaWVuIE1PVVRURSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfY2hhbmdlX3N0YXRlKTogQ2hlY2sgaWYKKwl3ZSBoYXZlIGEgd2luZG93IGJlZm9yZSBjbGVhcmluZyBpdC4KKworMjAwNC0wMy0wNSAgSnVsaWVuIE1PVVRURSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfY2hhbmdlX3N0YXRlKTogQ2hlY2sgaWYgd2UKKwloYXZlIGEgd2luZG93IGJlZm9yZSBjbGVhcmluZyBpdC4KKworMjAwNC0wMy0wNSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ2NvbmYvZ3N0cmVhbWVyLnNjaGVtYXMuaW46CisJKiBnc3QtbGlicy9nc3QvZ2NvbmYvTWFrZWZpbGUuYW06CisgICAgICAgICAgdmVyc2lvbiBpbnN0YWxsYXRpb24gcGF0aCB0aGUgc2FtZSB3YXkgYXMgZm9yIDAuNgorCSogcGtnY29uZmlnL2dzdHJlYW1lci1pbnRlcmZhY2VzLXVuaW5zdGFsbGVkLnBjLmluOgorCSogcGtnY29uZmlnL2dzdHJlYW1lci1saWJzLXVuaW5zdGFsbGVkLnBjLmluOgorCSogcGtnY29uZmlnL2dzdHJlYW1lci1wbGF5LXVuaW5zdGFsbGVkLnBjLmluOgorICAgICAgICAgIHJlbW92ZSBjb21tZW50IHRoYXQgd2FzIGZpeGVkCisKKzIwMDQtMDMtMDUgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfZ2V0X3NyY19mb3JtYXRzKSwKKwkoZ3N0X3F0ZGVtdXhfc3JjX2NvbnZlcnQpLCAoZ3N0X3F0ZGVtdXhfZ2V0X3NyY19xdWVyeV90eXBlcyksCisJKGdzdF9xdGRlbXV4X2dldF9ldmVudF9tYXNrKSwgKGdzdF9xdGRlbXV4X2hhbmRsZV9zcmNfcXVlcnkpLAorCShnc3RfcXRkZW11eF9oYW5kbGVfc3JjX2V2ZW50KSwgKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pOgorCUFkZCBwcm90b3R5cGUgY29kZSBmb3IgaGFuZGxpbmcgc2Vla2luZyBhbmQgcXVlcnlpbmcuCisKKzIwMDQtMDMtMDQgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4YW1wbGVzL2dzdHBsYXkvcGxheWVyLmM6IChtYWluKToKKwkgIEluaXRpYWxpemUgdmFyaWFibGVzIHRvIE5VTEwuIFByZXZlbnRzIGEgc2VnZmF1bHQgYmVjYXVzZSB0aGUKKwkgICh1bmluaXRpYWxpemVkKSB2YXJpYWJsZSBpcyBub3QgTlVMTCwgcmVzdWx0aW5nIGluIGEgY3Jhc2ggb24KKwkgIHRyeWluZyB0byByZWFjaCBlcnJvci0+bWVzc2FnZS4KKworMjAwNC0wMy0wNSAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOgorCShnc3RfYXVkaW9fY29udmVydF9idWZmZXJfdG9fZGVmYXVsdF9mb3JtYXQpOgorCW1ha2UgZmxvYXQ9PmludCBjb252ZXJzaW9uIHdvcmsgY29ycmVjdGx5IGV2ZW4gaW4gY29ybmVyY2FzZXMuCisKKzIwMDQtMDMtMDQgIERhdmlkIEkuIExlaG4gIDxkbGVobkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGRlYmlhbi9SRUFETUUuRGViaWFuOgorCSogZGViaWFuL2J1aWxkLWRlcHM6CisJKiBkZWJpYW4vY2hhbmdlbG9nOgorCSogZGViaWFuL2NvbnRyb2w6CisJKiBkZWJpYW4vY29udHJvbC5pbjoKKwkqIGRlYmlhbi9jb3B5cmlnaHQ6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLWE1MmRlYy5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItYWEuZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLWFsc2EuZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLWFsc2EubWFucGFnZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLWFydHMuZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLWFydHNkLmZpbGVzOgorCSogZGViaWFuL2dzdHJlYW1lci1hdWRpb2ZpbGUuZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLWF2aWZpbGUuZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLWNkcGFyYW5vaWEuZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLWNvbG9yc3BhY2UuZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLWRvYy5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItZHYuZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLWR2ZC5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItZXNkLmZpbGVzOgorCSogZGViaWFuL2dzdHJlYW1lci1mZXN0aXZhbC5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItZmxhYy5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItZ2NvbmYuY29uZmZpbGVzOgorCSogZGViaWFuL2dzdHJlYW1lci1nY29uZi5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItZ2NvbmYucG9zdGluc3Q6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLWdub21ldmZzLmZpbGVzOgorCSogZGViaWFuL2dzdHJlYW1lci1nc20uZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLWh0dHAuZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLWphY2suZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLWpwZWcuZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLW1hZC5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItbWlrbW9kLmZpbGVzOgorCSogZGViaWFuL2dzdHJlYW1lci1taXNjLmZpbGVzOgorCSogZGViaWFuL2dzdHJlYW1lci1tcGVnMmRlYy5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItb3NzLmZpbGVzOgorCSogZGViaWFuL2dzdHJlYW1lci1wbHVnaW4tYXBwcy5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItcGx1Z2luLWFwcHMubWFucGFnZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLXBsdWdpbi1saWJzLWRldi5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItcGx1Z2luLWxpYnMuZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLXBsdWdpbi10ZW1wbGF0ZS5wb3N0aW5zdDoKKwkqIGRlYmlhbi9nc3RyZWFtZXItcGx1Z2luLXRlbXBsYXRlLnBvc3RybToKKwkqIGRlYmlhbi9nc3RyZWFtZXItc2RsLmZpbGVzOgorCSogZGViaWFuL2dzdHJlYW1lci1zaWQuZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLXZvcmJpcy5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXIteC5maWxlczoKKwkqIGRlYmlhbi9tay5jb250cm9sOgorCSogZGViaWFuL3J1bGVzOgorCURlYmlhbiBwYWNrYWdlIGluZm8gbm90IG1haW50YWluZWQgaGVyZS4KKworMjAwNC0wMy0wNCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jOiAoZ3N0X2Fhc2lua19jbGFzc19pbml0KToKKwkqIGV4dC9jZGF1ZGlvL2dzdGNkYXVkaW8uYzogKGdzdF9jZGF1ZGlvX2NsYXNzX2luaXQpOgorCSogZXh0L2NkcGFyYW5vaWEvZ3N0Y2RwYXJhbm9pYS5jOiAoY2RwYXJhbm9pYV9jbGFzc19pbml0KToKKwkqIGV4dC9kaXZ4L2dzdGRpdnhlbmMuYzogKGdzdF9kaXZ4ZW5jX2NsYXNzX2luaXQpOgorCSogZXh0L2R2ZG5hdi9kdmRuYXZzcmMuYzogKGR2ZG5hdnNyY19jbGFzc19pbml0KToKKwkqIGV4dC9nc20vZ3N0Z3NtZW5jLmM6IChnc3RfZ3NtZW5jX2NsYXNzX2luaXQpOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOiAoZ3N0X2pwZWdlbmNfY2xhc3NfaW5pdCk6CisJKiBleHQvbXVzaWNicmFpbnovZ3N0dHJtLmM6IChnc3RfbXVzaWNicmFpbnpfY2xhc3NfaW5pdCk6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleGVuY19jbGFzc19pbml0KToKKwkqIGV4dC94dmlkL2dzdHh2aWRlbmMuYzogKGdzdF94dmlkZW5jX2NsYXNzX2luaXQpOgorCSogZ3N0LWxpYnMvZ3N0L2NvbG9yYmFsYW5jZS9jb2xvcmJhbGFuY2UuYzoKKwkoZ3N0X2NvbG9yX2JhbGFuY2VfY2xhc3NfaW5pdCk6CisJKiBnc3QtbGlicy9nc3QvY29sb3JiYWxhbmNlL2NvbG9yYmFsYW5jZWNoYW5uZWwuYzoKKwkoZ3N0X2NvbG9yX2JhbGFuY2VfY2hhbm5lbF9jbGFzc19pbml0KToKKwkqIGdzdC1saWJzL2dzdC9taXhlci9taXhlci5jOiAoZ3N0X21peGVyX2NsYXNzX2luaXQpOgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5jOiAoZ3N0X3BsYXlfY2xhc3NfaW5pdCk6CisJKiBnc3QtbGlicy9nc3QvcHJvcGVydHlwcm9iZS9wcm9wZXJ0eXByb2JlLmM6CisJKGdzdF9wcm9wZXJ0eV9wcm9iZV9pZmFjZV9pbml0KToKKwkqIGdzdC1saWJzL2dzdC90dW5lci90dW5lci5jOiAoZ3N0X3R1bmVyX2NsYXNzX2luaXQpOgorCSogZ3N0LWxpYnMvZ3N0L3R1bmVyL3R1bmVyY2hhbm5lbC5jOgorCShnc3RfdHVuZXJfY2hhbm5lbF9jbGFzc19pbml0KToKKwkqIGdzdC1saWJzL2dzdC94b3ZlcmxheS94b3ZlcmxheS5jOiAoZ3N0X3hfb3ZlcmxheV9iYXNlX2luaXQpOgorCSogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzogKGdzdF9jdXR0ZXJfY2xhc3NfaW5pdCk6CisJKiBnc3QvZWZmZWN0di9nc3R2ZXJ0aWdvLmM6IChnc3RfdmVydGlnb3R2X2NsYXNzX2luaXQpOgorCSogc3lzL2Nkcm9tL2dzdGNkcGxheWVyLmM6IChjZHBsYXllcl9jbGFzc19pbml0KToKKwkqIHN5cy9keHIzL2R4cjNzcHVzaW5rLmM6IChkeHIzc3B1c2lua19jbGFzc19pbml0KToKKwkqIHN5cy92NGwvZ3N0djRsbWpwZWdzaW5rLmM6IChnc3RfdjRsbWpwZWdzaW5rX2NsYXNzX2luaXQpOgorCSogc3lzL3Y0bC9nc3R2NGxtanBlZ3NyYy5jOiAoZ3N0X3Y0bG1qcGVnc3JjX2NsYXNzX2luaXQpOgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzogKGdzdF92NGxzcmNfY2xhc3NfaW5pdCk6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19jbGFzc19pbml0KToKKyAgICAgICAgICBmaXggc2lnbmFscyB0byB1c2UgLSBpbnN0ZWFkIG9mIF8KKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmg6CisJKiBleHQvc2RsL3NkbHZpZGVvc2luay5oOgorICAgICAgICAgIGZpeCBoZWFkZXIgcmVuYW1lCisKKzIwMDQtMDMtMDQgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogdGVzdHN1aXRlL2dzdC1saW50OiAgQWRkIGEgY2hlY2sgZm9yIGJhZCBzaWduYWwgbmFtZXMuCisKKzIwMDQtMDMtMDQgIDxrb3N0QGltbi5odHdrLWxlaXB6aWcuZGU+CisKKwlyZXZpZXdlZCBieSBEYXZpZCBTY2hsZWVmCisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jOiAoZ3N0X2dhbW1hX3JnYjMyKTogRml4IHR5cG8gdGhhdAorCW1vZGlmaWVkIHRoZSBhbHBoYSBjaGFubmVsIGFuZCBjYXVzZWQgYSB3YXJuaW5nLiAoYnVnICMxMzYxOTIpCisKKzIwMDQtMDQtMDMgIENocmlzdGlhbiBTY2hhbGxlciA8VXJhZXVzQGdub21lLm9yZz4KKworCSogZ3N0LXBsdWdpbnMuc3BlYy5pbjoKKwlDaGFuZ2UgbmFtZXMgb2YgcGx1Z2lucyB0byBhY3R1YWxseSBiZSBjb3JyZWN0LiBUcnkgdG8ga2VlcCB0aGluZ3MKKwlhbHBoYWJldGljYWwgdG8gYXZvaWQgZ2V0dGluZyBiZWF0IHVwIGJ5IFRob21hcworCisyMDA0LTAzLTAzICBKdWxpZW4gTU9VVFRFIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L2djb25mL2djb25mLmM6IChnc3RfZ2NvbmZfZ2V0X2RlZmF1bHRfdmlkZW9fc2luayk6CisJVXNpbmcgeGltYWdlc2luayBhcyBhIGRlZmF1bHQgaWYgbm8gZ2NvbmYga2V5IGZvdW5kLiBXZSBzaG91bGQKKwlwcm9iYWJseSBjb25zaWRlciB1c2luZyBhbHNhc2luayBpbnN0ZWFkIG9mIG9zc3NpbmsgZm9yIHRoZSBhdWRpbworCXBhcnQuCisKKzIwMDQtMDMtMDIgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGZpeCAtLXdpdGgtcGx1Z2lucywgZG9uJ3QgdGhpbmsgaXQgZXZlciB3b3JrZWQgYmVmb3JlCisJKiBnc3QtcGx1Z2lucy5zcGVjLmluOgorICAgICAgICAgIGV2ZW4gbW9yZSB1cGRhdGVzCisKKzIwMDQtMDMtMDEgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9zZGwvc2RsdmlkZW9zaW5rLmg6CisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuaDoKKwkqIHN5cy94dmlkZW8veHZpZGVvc2luay5oOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuaDoKKwkgIEZpeCBmb3IgbW92ZSBvZiBnc3R2aWRlb3NpbmsuaCAtPiB2aWRlb3NpbmsuaC4KKworMjAwNC0wMy0wMiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L3h3aW5kb3dsaXN0ZW5lci9NYWtlZmlsZS5hbToKKwkgIHRoaXMgaXMgYSBwbHVnaW4gbGlicmFyeSwgbm90IGEgbGlicmFyeQorCisyMDA0LTAzLTAxICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIEFVVEhPUlM6ICBBZGRlZCBzb21lIG5hbWVzLiAgQWRkIHlvdXJzZWxmIGlmIHlvdSdyZSBzdGlsbAorCW1pc3NpbmcuCisKKzIwMDQtMDMtMDEgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogTUFJTlRBSU5FUlM6IEFkZAorCisyMDA0LTAzLTAxICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QtcGx1Z2lucy5zcGVjLmluOiBjbGVhbiB1cCBzcGVjIGZpbGUKKworMjAwNC0wMy0wMSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L3ZpZGVvL01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L3ZpZGVvL2dzdHZpZGVvc2luay5jOgorCSogZ3N0LWxpYnMvZ3N0L3ZpZGVvL2dzdHZpZGVvc2luay5oOgorICAgICAgICAgIHJlbmFtZSBnc3R2aWRlb3NpbmsuaCB0byB2aWRlb3NpbmsuaCB0byBtYXRjaCBvdGhlciBoZWFkZXJzCisJKiBnc3QvbWl4bWF0cml4L01ha2VmaWxlLmFtOgorICAgICAgICAgIGZpeCBwbHVnaW4gZmlsZW5hbWUKKwkqIGdzdC90YWdzL01ha2VmaWxlLmFtOiBmaXggcGx1Z2luIGZpbGVuYW1lCisKKzIwMDQtMDMtMDEgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC90YWdzL01ha2VmaWxlLmFtOiBmaXggcGx1Z2luIGZpbGVuYW1lCisKKzIwMDQtMDMtMDEgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4YW1wbGVzL2dzdHBsYXkvcGxheWVyLmM6IChnb3RfdGltZV90aWNrKSwgKG1haW4pOgorCSAgYWRkIGVycm9yIGhhbmRsZXIKKyAgICAgICAgICBkaXNwbGF5IHRpbWVfdGljayBtb3JlIHJlYWRhYmx5CisJKiBnc3QvbWl4bWF0cml4L01ha2VmaWxlLmFtOgorICAgICAgICAgIGZpeCBwbHVnaW4gZmlsZSBuYW1lCisKKzIwMDQtMDItMjkgIENocmlzdG9waGUgRmVyZ2VhdSAgPHRldWZAZ25vbWUub3JnPgorCisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuYzogKGdzdF9vc3NlbGVtZW50X3Byb2JlKSwKKwkoZGV2aWNlX2NvbWJpbmF0aW9uX2FwcGVuZCksIChnc3Rfb3NzZWxlbWVudF9jbGFzc19wcm9iZV9kZXZpY2VzKToKKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5oOgorCSAgUmV3b3JrZWQgZW51bWVyYXRpb24gb2Ygb3NzIGRzcHMgYW5kIG1peGVycyBzbyB0aGF0IGdzdC1taXhlciB3b3JrcworCSAgb24gbXkgc3lzdGVtIHVzaW5nIGFsc2Egb3NzIGVtdWxhdGlvbiwgZml4ZXMgYnVnICMxMzU1OTcKKworMjAwNC0wMi0yOSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3ZpZGVvZHJvcC9nc3R2aWRlb2Ryb3AuYzogKGdzdF92aWRlb2Ryb3BfaW5pdCksCisJKGdzdF92aWRlb2Ryb3BfY2hhaW4pLCAoZ3N0X3ZpZGVvZHJvcF9jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L3ZpZGVvZHJvcC9nc3R2aWRlb2Ryb3AuaDoKKwkgIFdvcmsgYmFzZWQgb24gdGltZXN0YW1wIG9mIGlucHV0IGRhdGEsIG5vdCBiYXNlZCBvbiB0aGUgZXhwZWN0ZWQKKwkgIGZyYW1lcmF0ZSBmcm9tIHRoZSBpbnB1dC4gVGhlIGNvbnNlcXVlbmNlIGlzIHRoYXQgdGhpcyBlbGVtZW50IG5vdworCSAgbm90IG9ubHkgc2NhbGVzIGZyYW1lcmF0ZXMsIGJ1dCBhbHNvIGZ1bmN0aW9ucyBhcyBhIGZyYW1lcmF0ZQorCSAgY29ycmVjdG9yIG9yIGZyYW1lcmF0ZSBzdGFiaWxpemVyL2NvbnN0YW50aXplci4KKworMjAwNC0wMi0yNyAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJcGF0Y2hlcyBmcm9tIGptbXZAbWVudGEubmV0IChKdWxpbyBNLiBNZXJpbm8gVmlkYWwpCisKKwkqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOiAoZGVpbnRlcmxlYXZlX2NoYWluKTogRml4CisJR1NUX0VMRU1FTlRfRVJST1IgY2FsbCAoYnVnICMxMzU2MzQpCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6IChpbnRlcmxlYXZlX2J1ZmZlcmVkX2xvb3ApLAorCShpbnRlcmxlYXZlX2J5dGVzdHJlYW1fbG9vcCk6IERvbid0IHVzZSBhbGxvY2EoKSAoYnVnICMxMzU2NDApCisJKiBzeXMvY2Ryb20vZ3N0Y2RwbGF5ZXJfaW9jdGxfYnNkLmg6IEZpeCBpb2N0bHMgb24gTmV0QlNEIChidWcgIzEzNTY0NSkKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiAoZ3N0X29zc3NpbmtfZ2V0X2RlbGF5KSwKKwkoZ3N0X29zc3NpbmtfY2hhaW4pOiBGaXggaW9jdGxzIG9uIE5ldEJTRC4gKGJ1ZyAjMTM1NjQ0KQorCSogc3lzL3Y0bC92NGxtanBlZ3NyY19jYWxscy5jOiAoZ3N0X3Y0bG1qcGVnc3JjX3N5bmNfbmV4dF9mcmFtZSksCisJKGdzdF92NGxtanBlZ3NyY19zZXRfY2FwdHVyZSksIChnc3RfdjRsbWpwZWdzcmNfc2V0X2NhcHR1cmVfbSksCisJKGdzdF92NGxtanBlZ3NyY19jYXB0dXJlX2luaXQpLCAoZ3N0X3Y0bG1qcGVnc3JjX3JlcXVldWVfZnJhbWUpOgorCUZpeCBHU1RfRUxFTUVOVF9FUlJPUiBjYWxsLgorCSogc3lzL3Y0bC92NGxzcmNfY2FsbHMuYzogKGdzdF92NGxzcmNfdHJ5X3BhbGV0dGUpOiBGaXgKKwlHU1RfRUxFTUVOVF9FUlJPUiBjYWxsLgorCisyMDA0LTAyLTI3ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC1saWJzL2dzdC9hdWRpby9hdWRpby5oOgorCSAgYWRkIG1hY3JvIHRvIG1ha2Ugc3VyZSBoZWFkZXIgaXNuJ3QgaW5jbHVkZWQgdHdpY2UKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOiAoZ3N0X2FzZl9kZW11eF9wcm9jZXNzX2NodW5rKToKKwkgIGRvbid0IHVzZSBnc3RfYnVmZmVyX2ZyZWUKKwkqIGdzdC9wbGF5b25kZW1hbmQvZmlsdGVyLmZ1bmM6CisJICBkb24ndCB1c2UgZ3N0X2RhdGFfZnJlZS4gRnJlZSBkYXRhIG9ubHkgb25jZS4KKworMjAwNC0wMi0yNiAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QtbGlicy9nc3QvY29sb3JiYWxhbmNlL01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L3R1bmVyL01ha2VmaWxlLmFtOgorCSogZ3N0L2xldmVsL01ha2VmaWxlLmFtOiAtbWFyc2hhbC5bY2hdIGFuZCAtZW51bS5bY2hdIGZpbGVzCisJc2hvdWxkIG5vdCBiZSBkaXN0ZWQsIC1tYXJzaGFsLmggZmlsZXMgc2hvdWxkIG5vdCBiZSBpbnN0YWxsZWQsCisJYW5kIC1lbnVtLmggZmlsZXMgX3Nob3VsZF8gYmUgaW5zdGFsbGVkLiAgRml4IHRvIG1ha2UgdGhpcyB0aGUKKwljYXNlLgorCis9PT0gcmVsZWFzZSAwLjcuNSA9PT0KKworMjAwNC0wMi0yNiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOiByZWxlYXNlIDAuNy41LCAiVW5kZXIgVGhlIFNlYSIKKworMjAwNC0wMi0yNSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogKGdzdF9hdWRpb19jb252ZXJ0X2xpbmspLAorCShnc3RfYXVkaW9fY29udmVydF9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X2F1ZGlvX2NvbnZlcnRfZ2V0X2J1ZmZlcik6CisJKiBnc3QvdmlkZW9zY2FsZS9nc3R2aWRlb3NjYWxlLmM6CisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuYzogKGdzdF9vc3NlbGVtZW50X3N5bmNfcGFybXMpOgorICAgICAgICAgIGFzc29ydGVkIGRlYnVnL3dhcm5pbmcgZml4ZXMKKworMjAwNC0wMi0yNSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L3ZpZGVvc2NhbGUvZ3N0dmlkZW9zY2FsZS5jOiAoZ3N0X3ZpZGVvc2NhbGVfZ2V0Y2FwcyksCisJKGdzdF92aWRlb3NjYWxlX2luaXQpLCAoZ3N0X3ZpZGVvc2NhbGVfY2hhaW4pLAorCShnc3RfdmlkZW9zY2FsZV9zZXRfcHJvcGVydHkpLCAocGx1Z2luX2luaXQpOgorCSogZ3N0L3ZpZGVvc2NhbGUvZ3N0dmlkZW9zY2FsZS5oOgorCSogZ3N0L3ZpZGVvc2NhbGUvdmlkZW9zY2FsZS5jOiAoZ3N0X3ZpZGVvc2NhbGVfc2V0dXApLAorCShnc3RfdmlkZW9zY2FsZV9zY2FsZV9yZ2IpLCAoZ3N0X3ZpZGVvc2NhbGVfcGxhbmFyNDExKSwKKwkoZ3N0X3ZpZGVvc2NhbGVfcGxhbmFyNDAwKSwgKGdzdF92aWRlb3NjYWxlX3BhY2tlZDQyMiksCisJKGdzdF92aWRlb3NjYWxlX3BhY2tlZDQyMnJldiksIChnc3RfdmlkZW9zY2FsZV8zMmJpdCksCisJKGdzdF92aWRlb3NjYWxlXzI0Yml0KSwgKGdzdF92aWRlb3NjYWxlXzE2Yml0KSwKKwkoZ3N0X3ZpZGVvc2NhbGVfYmlsaW5lYXIpLCAoZ3N0X3ZpZGVvc2NhbGVfYmljdWJpYyksCisJKGdzdF92aWRlb3NjYWxlX3NjYWxlX3BsYW5lX3Nsb3cpLAorCShnc3RfdmlkZW9zY2FsZV9zY2FsZV9wb2ludF9zYW1wbGUpLAorCShnc3RfdmlkZW9zY2FsZV9zY2FsZV9uZWFyZXN0KSwKKwkoZ3N0X3ZpZGVvc2NhbGVfc2NhbGVfbmVhcmVzdF9zdHIyKSwKKwkoZ3N0X3ZpZGVvc2NhbGVfc2NhbGVfbmVhcmVzdF9zdHI0KSwKKwkoZ3N0X3ZpZGVvc2NhbGVfc2NhbGVfbmVhcmVzdF8zMmJpdCksCisJKGdzdF92aWRlb3NjYWxlX3NjYWxlX25lYXJlc3RfMjRiaXQpLAorCShnc3RfdmlkZW9zY2FsZV9zY2FsZV9uZWFyZXN0XzE2Yml0KToKKyAgICAgICAgYWRkIGRlYnVnZ2luZyBjYXRlZ29yeSBhbmQgdXNlIGl0IHByb3Blcmx5CisgICAgICAgIGZpeCB1c2Ugb2YgR1NUX1BUUl9GT1JNQVQKKworMjAwNC0wMi0yNSAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKworCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jIChpbnRlcmxlYXZlX2J1ZmZlcmVkX2xvb3ApOiBBbHdheXMKKwlwdXNoIG9ubHkgd2hlbiBjaGFubmVsLT5idWZmZXIgaXMgTlVMTC4gUHJldmVudHMgc2VnZmF1bHRzIGRvaW5nCisJdGhlIHN0YXRlIGNoYW5nZSBhZnRlciBhIG5vbmxvY2FsIGV4aXQsIGxpa2UgYSBzY2hlbWUgZXhjZXB0aW9uLgorCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jIChnc3RfYXVkaW9fY29udmVydF9nZXRjYXBzKToKKwlIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGludGVyc2VjdGVkIGNhcHMgaXMgZW1wdHkuCisKKzIwMDQtMDItMjUgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6IChtdWxhd2RlY19saW5rKToKKwkqIGdzdC9sYXcvbXVsYXcuYzogKHBsdWdpbl9pbml0KToKKyAgICAgICAgICBmaXggbXVsYXdkZWMgc28gaXQgYWN0dWFsbHkgd29ya3MgYWdhaW4KKworMjAwNC0wMi0yNCAgQXJ3ZWQgdi4gTWVya2F0eiAgPHYubWVya2F0ekBnbXgubmV0PgorCisJcmV2aWV3ZWQgYnk6IERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6IChnc3RfZ2FtbWFfY2xhc3NfaW5pdCksCisJKGdzdF9nYW1tYV9pbml0KSwgKGdzdF9nYW1tYV9zZXRfcHJvcGVydHkpLAorCShnc3RfZ2FtbWFfZ2V0X3Byb3BlcnR5KSwgKGdzdF9nYW1tYV9jYWxjdWxhdGVfdGFibGVzKSwKKwkoZ3N0X2dhbW1hX3JnYjI0KSwgKGdzdF9nYW1tYV9yZ2IzMik6ICBBZGRzIGdhbW1hIGNvcnJlY3Rpb24KKwlmb3IgUkdCLCB3aXRoIHNlcGFyYXRlIHIgZyBhbmQgYiBjb3JyZWN0aW9uIGZhY3RvcnMuICgjMTMxMTY3KQorCisyMDA0LTAyLTI0ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvdm9yYmlzL3ZvcmJpc2RlYy5jOiAodm9yYmlzX2RlY19jaGFpbik6CisgICAgICAgICAgb25seSBzaWduYWwgdGFncyBmb3IgYml0cmF0ZSBpZiB0aGV5J3JlID4gMCAoIzEzNDg5NCkKKworMjAwNC0wMi0yNCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChwbHVnaW5faW5pdCksIChnc3RfcXRkZW11eF9sb29wX2hlYWRlciksCisJKHF0ZGVtdXhfcGFyc2VfbW9vdiksIChxdGRlbXV4X3BhcnNlKSwgKHF0ZGVtdXhfbm9kZV9kdW1wX2ZvcmVhY2gpLAorCShxdGRlbXV4X2R1bXBfbXZoZCksIChxdGRlbXV4X2R1bXBfdGtoZCksIChxdGRlbXV4X2R1bXBfZWxzdCksCisJKHF0ZGVtdXhfZHVtcF9tZGhkKSwgKHF0ZGVtdXhfZHVtcF9oZGxyKSwgKHF0ZGVtdXhfZHVtcF92bWhkKSwKKwkocXRkZW11eF9kdW1wX2RyZWYpLCAocXRkZW11eF9kdW1wX3N0c2QpLCAocXRkZW11eF9kdW1wX3N0dHMpLAorCShxdGRlbXV4X2R1bXBfc3RzcyksIChxdGRlbXV4X2R1bXBfc3RzYyksIChxdGRlbXV4X2R1bXBfc3RzeiksCisJKHF0ZGVtdXhfZHVtcF9zdGNvKSwgKHF0ZGVtdXhfZHVtcF9jbzY0KSwgKHF0ZGVtdXhfZHVtcF9kY29tKSwKKwkocXRkZW11eF9kdW1wX2NtdmQpLCAocXRkZW11eF9wYXJzZV90cmVlKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJQ2xlYW51cHMuICBDb252ZXJ0IGdfcHJpbnRzIHRvIEdTVF9MT0dzLiAgQWRkIHF0ZGVtdXggZGVidWcKKwljYXRlZ29yeS4gIEF0dGVtcHQgdG8gZml4IHRpbWVzdGFtcCBjYWxjdWxhdGlvbi4KKworMjAwNC0wMi0yNCAgSm9oYW4gRGFobGluICA8am9oYW5AZ25vbWUub3JnPgorCisJKiBnc3QtbGlicy9nc3QvZ2NvbmYvZ2NvbmYuYzogQWRkIFxuIHRvIGdfcHJpbnQgZXJyb3IgbWVzc2FnZXMKKworMjAwNC0wMi0yMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSogZ2NvbmYvTWFrZWZpbGUuYW06CisJKiBnY29uZi9nc3RyZWFtZXIuc2NoZW1hczoKKwkqIGdzdC1saWJzL2dzdC9nY29uZi9NYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2dzdC9nY29uZi9nY29uZi5jOgorICAgICAgICAgIHZlcnNpb24gZ2NvbmYgc2NoZW1hcyBhbmQgaW5zdGFsbCBsb2NhdGlvbnMKKworMjAwNC0wMi0yMyAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQveGluZS94aW5laW5wdXQuYzogKGdzdF94aW5lX2lucHV0X2Rpc3Bvc2UpOgorCShnc3RfeGluZV9pbnB1dF9zdWJjbGFzc19pbml0KToKKwkgIGNhbGwgcGFyZW50IGRpc3Bvc2UuCisJICBjaGFuZ2UgcGFkIHRlbXBsYXRlIGZvciBDRCByZWFkZXIgY29ycmVjdGx5CisJKiBleHQveGluZS9NYWtlZmlsZS5hbToKKwkqIGV4dC94aW5lL2dzdHhpbmUuaDoKKwkqIGV4dC94aW5lL3hpbmUuYzogKHBsdWdpbl9pbml0KToKKwkqIGV4dC94aW5lL3hpbmVhdWRpb3NpbmsuYzoKKwkgIHdyYXAgYXVkaW8gc2lua3MsIHRvbworCSogZ3N0LWxpYnMvZ3N0L3Jlc2FtcGxlL3ByaXZhdGUuaDoKKwkqIGdzdC1saWJzL2dzdC9yZXNhbXBsZS9yZXNhbXBsZS5jOiAoZ3N0X3Jlc2FtcGxlX2luaXQpLAorCShnc3RfcmVzYW1wbGVfcmVpbml0KSwgKGdzdF9yZXNhbXBsZV9zY2FsZSksCisJKGdzdF9yZXNhbXBsZV9uZWFyZXN0X3MxNiksIChnc3RfcmVzYW1wbGVfYmlsaW5lYXJfczE2KSwKKwkoZ3N0X3Jlc2FtcGxlX3NpbmNfc2xvd19zMTYpLCAoZ3N0X3Jlc2FtcGxlX3NpbmNfczE2KSwKKwkoZ3N0X3Jlc2FtcGxlX3NpbmNfZnRfczE2KSwgKGdzdF9yZXNhbXBsZV9uZWFyZXN0X2Zsb2F0KSwKKwkoZ3N0X3Jlc2FtcGxlX2JpbGluZWFyX2Zsb2F0KSwgKGdzdF9yZXNhbXBsZV9zaW5jX3Nsb3dfZmxvYXQpLAorCShnc3RfcmVzYW1wbGVfc2luY19mbG9hdCksIChnc3RfcmVzYW1wbGVfc2luY19mdF9mbG9hdCk6CisJKiBnc3QtbGlicy9nc3QvcmVzYW1wbGUvcmVzYW1wbGUuaDoKKwkqIGdzdC9hdWRpb3NjYWxlL2dzdGF1ZGlvc2NhbGUuYzogKGdzdF9hdWRpb3NjYWxlX21ldGhvZF9nZXRfdHlwZSksCisJKGdzdF9hdWRpb3NjYWxlX2NsYXNzX2luaXQpLCAoZ3N0X2F1ZGlvc2NhbGVfbGluayksCisJKGdzdF9hdWRpb3NjYWxlX2dldF9idWZmZXIpLCAoZ3N0X2F1ZGlvc2NhbGVfaW5pdCksCisJKGdzdF9hdWRpb3NjYWxlX2NoYWluKSwgKGdzdF9hdWRpb3NjYWxlX3NldF9wcm9wZXJ0eSksCisJKGdzdF9hdWRpb3NjYWxlX2dldF9wcm9wZXJ0eSk6CisJKiBnc3QvYXVkaW9zY2FsZS9nc3RhdWRpb3NjYWxlLmg6CisJICBzL3Jlc2FtcGxlXyovZ3N0X3Jlc2FtcGxlXyovaSB0byBub3QgY2xvYmJlciBuYW1lc3BhY2VzCisKKzIwMDQtMDItMjMgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOiAoZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX2NhcHMpLAorCShnc3RfcmlmZl9jcmVhdGVfYXVkaW9fY2FwcyksIChnc3RfcmlmZl9jcmVhdGVfaWF2c19jYXBzKSwKKwkoZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX3RlbXBsYXRlX2NhcHMpLAorCShnc3RfcmlmZl9jcmVhdGVfYXVkaW9fdGVtcGxhdGVfY2FwcyksCisJKGdzdF9yaWZmX2NyZWF0ZV9pYXZzX3RlbXBsYXRlX2NhcHMpOgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5oOgorCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6IChnc3RfYXNmX2RlbXV4X2Jhc2VfaW5pdCksCisJKGdzdF9hc2ZfZGVtdXhfYXVkaW9fY2FwcyksIChnc3RfYXNmX2RlbXV4X2FkZF9hdWRpb19zdHJlYW0pLAorCShnc3RfYXNmX2RlbXV4X3ZpZGVvX2NhcHMpLCAoZ3N0X2FzZl9kZW11eF9hZGRfdmlkZW9fc3RyZWFtKToKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfYWRkX3N0cmVhbSk6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfc3RyZWFtKSwKKwkoZ3N0X21hdHJvc2thX2RlbXV4X3ZpZGVvX2NhcHMpLCAoZ3N0X21hdHJvc2thX2RlbXV4X2F1ZGlvX2NhcHMpLAorCShnc3RfbWF0cm9za2FfZGVtdXhfcGx1Z2luX2luaXQpOiBGaXJzdCBiYXRjaCBpbXBsZW1lbnRpbmcgYXVkaW8gYW5kCisJdmlkZW8gY29kZWMgdGFncyBpbiBkZW11eGVycy4KKworMjAwNC0wMi0yMiAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQveGluZS9NYWtlZmlsZS5hbToKKwkqIGV4dC94aW5lL2dzdHhpbmUuaDoKKwkqIGV4dC94aW5lL3hpbmUuYzogKHBsdWdpbl9pbml0KToKKwkqIGV4dC94aW5lL3hpbmVpbnB1dC5jOgorCSAgYWRkIGlucHV0IHBsdWdpbiB3cmFwcGVyLiBQbGF5YmFjayBmcm9tIGZpbGVzLCBodHRwLCBtbXMgYW5kIGNkZGEKKwkgIHdvcmtzLgorCSogZXh0L3hpbmUveGluZWF1ZGlvZGVjLmM6IChnc3RfeGluZV9hdWRpb19kZWNfY2hhaW4pOgorCSAgcmVtb3ZlIGxlZnRvdmVyIEdfR05VQ19VTlVTRUQKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOiAoZ3N0X2FzZl9kZW11eF9wcm9jZXNzX3N0cmVhbSksCisJKGdzdF9hc2ZfZGVtdXhfaWRlbnRpZnlfZ3VpZCk6CisJICBpbXByb3ZlIGRlYnVnZ2luZyBvdXRwdXQKKworMjAwNC0wMi0yMiAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJcmVwb3J0ZWQgYnk6IFBhZHJhaWcgTydCcmlhaW4gPHBhZHJhaWcub2JyaWFpbkBzdW4uY29tPgorCisJKiBhdXRvZ2VuLnNoOgorCSAgcmVwbGFjZSB0ZXN0IC1lIHdpdGggdGVzdCAteCBmb3IgbWtpbnN0YWxsZGlycyB0byBiZSBtb3JlIHBvcnRhYmxlLgorCSAgKGZpeGVzICMxMzQ4MTYpCisKKzIwMDQtMDItMjIgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCXJlcG9ydGVkIGJ5OiBTdGVmYW4gS29zdCA8a29zdEBpbW4uaHR3ay1sZWlwemlnLmRlPgorCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOiAocGx1Z2luX2luaXQpOgorCSAgc2V0IHJhbmsgdG8gUFJJTUFSWQorCSogZ3N0L3ZvbHVtZS9nc3R2b2x1bWUuYzogKHBsdWdpbl9pbml0KToKKwkgIHNldCByYW5rIHRvIE5PTkUKKwlmaXhlcyAjMTM0OTYwCisKKzIwMDQtMDItMjIgICBKdWxpbyBNLiBNZXJpbm8gVmlkYWwgPGptbXZAbWVudGEubmV0PgorCisJcmV2aWV3ZWQgYnkgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IChnc3RfZmxhY2VuY19jaGFpbik6CisJICBlc2NhcGUgTlVMTCBzdHJpbmdzIGluIEdTVF9FTEVNRU5UX0VSUk9SIHByb3Blcmx5IChmaXhlcyAjMTM1MTE2KQorCisyMDA0LTAyLTIyICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGV4cG9ydCBbX10qe2dzdCxHc3QsR1NUfS4qIHN5bWJvbHMgZnJvbSBwbHVnaW5zCisKKzIwMDQtMDItMjIgIENocmlzdG9waGUgRmVyZ2VhdSA8dGV1ZkBnbm9tZS5vcmc+CisKKwlyZXZpZXdlZCBieTogQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvbGFtZS9nc3RsYW1lLmM6IChhZGRfb25lX3RhZyk6CisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X21hZF9pZDNfdG9fdGFnX2xpc3QpOgorCSogZXh0L3ZvcmJpcy92b3JiaXNlbmMuYzogKGdzdF92b3JiaXNlbmNfZ2V0X3RhZ192YWx1ZSksCisJKGdzdF92b3JiaXNlbmNfbWV0YWRhdGFfc2V0MSk6CisJKiBnc3QvdGFncy9nc3RpZDN0YWcuYzoKKwkqIGdzdC90YWdzL2dzdHZvcmJpc3RhZy5jOiAoZ3N0X3ZvcmJpc190YWdfYWRkKToKKwkgIGFwcGx5IGZpeGVzIGZyb20gYnVncyAjMTM1MDQyIChsYW1lIGNhbid0IHdyaXRlIHRhZ3MpIGFuZCAjMTMzODE3CisJICAoYWRkIEdTVF9BTEJVTV9WT0xVTUVfe0NPVU5ULE5VTUJFUn0gdGFncykKKworMjAwNC0wMi0yMiBSYW1vbiBHYXJjaWEgPHJhbW9uX2dhcmNpYV9mQHlhaG9vLmNvbT4KKworCSogY29uZmlndXJlLmFjOiBFeHBvcnQgb25seSBnc3RfcGx1Z2luX2Rlc2MgZnJvbSBwbHVnaW5zLgorICAgICAgICAgTm90ZSB0aGF0IHRoaXMgY2hhbmdlIG9ubHkgbWFrZXMgYW55IGVmZmVjdCB3aXRoIExpbnV4IHVzaW5nIGxpYnRvb2wKKwkgMS41LjIgb3IgaGlnaGVyLiBPdGhlcndpc2UgaXQgaXMgc2lsZW50bHkgaWdub3JlZCwgYnV0IGl0IHdvdWxkIGJ1aWxkCisgICAgICAgICBmaW5lLiBBbmQgZG9uJ3QgdHJ5IHRvIGhhdmUgc2V2ZXJhbCB2ZXJzaW9ucyBvZiBsaWJ0b29sIGluIGRpZmZlcmVudAorICAgICAgICAgZGlyZWN0b3JpZXMuCisKKzIwMDQtMDItMjAgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGdzdC9pbnRmbG9hdC8sIGdzdC9vbmV0b246IFJlbW92ZWQsIHJlcGxhY2VkIGJ5IGF1ZGlvY29udmVydCBhbmQKKwlpbnRlcmxlYXZlIHJlc3BlY3RpdmVseS4KKworCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6IE5ldyBwbHVnaW46IGRlaW50ZXJsZWF2ZQorCShyZXBsYWNlcyBvbiBvbmV0b24pLgorCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOiBOZXcgcGx1Z2luOiBpbnRlcmxlYXZlLgorCSogZ3N0L2ludGVybGVhdmUvcGx1Z2luLmg6IFN1cHBvcnQgZmlsZS4KKwkqIGdzdC9pbnRlcmxlYXZlL3BsdWdpbi5jOiBTdXBwb3J0IGZpbGUuCisKKwkqIGNvbmZpZ3VyZS5hYzogUmVtb3ZlIGludGZsb2F0IGFuZCBvbmV0b24sIGFkZCBpbnRlcmxlYXZlLgorCisJKiBleHQvc25kZmlsZS9nc3RzZi5jOiBIYW5kbGUgZXZlbnRzIGJldHRlci4KKworCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogQ2hhbmdlIHRvIHN1cHBvcnQgaW50MmZsb2F0CisJYW5kIGZsb2F0MmludCBvcGVyYXRpb24uIGludDJmbG9hdCBoYXMgc2NoZWR1bGluZyBwcm9ibGVtcyBhcworCW5vdGVkIGluIGluMmZsb2F0X2NoYWluLgorCisyMDA0LTAyLTIwICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC94aW5lL01ha2VmaWxlLmFtOgorCSogZXh0L3hpbmUvZ3N0eGluZS5oOgorCSogZXh0L3hpbmUveGluZS5jOgorCSogZXh0L3hpbmUveGluZWF1ZGlvZGVjLmM6CisJKiBleHQveGluZS94aW5lY2Fwcy5jOgorCSAgYWRkIGZpcnN0IHZlcnNpb24gb2YgeGluZSBwbHVnaW4gd3JhcHBlci4gQ3VycmVudGx5IG9ubHkgd3JhcHMgdGhlCisJICBRRE0yIHdpbjMyIERMTCwgYW5kIGV2ZW4gdGhhdCBvbmx5IGluIHByb29mLW9mLWNvbmNlcHQgcXVhbGl0eS4KKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkgIGFkZCB4aW5lIHBsdWdpbiB3cmFwcGVyLCBkaXNhYmxlZCBieSBkZWZhdWx0LiBVc2UgLS1lbmFibGUteGluZSB0bworCSAgYnVpbGQuIE5vdGUgdGhhdCBpdCdsbCBzZWdmYXVsdCBvbiBnc3QtcmVnaXN0ZXIgaWYgeW91IGRvbid0IHJlbW92ZQorCSAgdGhlIGdvb20gYW5kIHR2dGltZSBwb3N0IHBsdWdpbnMgZnJvbSB4aW5lLgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQpLAorCShxdGRlbXV4X3BhcnNlKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayksIChxdGRlbXV4X2F1ZGlvX2NhcHMpOgorCSAgYWRkIGV4dHJhZGF0YSBwYXJzaW5nIGZvciBRRE0yLgorCSAgY2hhbmdlIGFyb3VuZCBkZWJ1Z2dpbmcgcHJpbnRzLgorCisyMDA0LTAyLTE5ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9sYW1lL2dzdGxhbWUuYzogKGdzdF9sYW1lX2NoYWluKToKKwkqIGV4dC92b3JiaXMvdm9yYmlzZW5jLmM6IChnc3Rfdm9yYmlzZW5jX2NoYWluKToKKwkgIHVzZSBnc3RfdGFnX2xpc3RfaW5zZXJ0IHdoZW4geW91IHdhbnQgdG8gaW5zZXJ0IHRhZ3MKKworMjAwNC0wMi0xOCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBjb25maWd1cmUuYWM6ICBNb3ZlIG1hc3NpbmsgdG8gZ3N0LXJvdHRlbgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L21hcy9NYWtlZmlsZS5hbToKKwkqIGV4dC9tYXMvbWFzc2luay5jOgorCSogZXh0L21hcy9tYXNzaW5rLmg6CisKKzIwMDQtMDItMTggIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6IChwbHVnaW5faW5pdCk6IERpc2FibGUgZ2RrX3BpeGJ1ZgorCXR5cGVmaW5kaW5nLCBzaW5jZSBpdCBzZWVtcyB0byBiZSB3b3JzZSB0aGFuIG5vdGhpbmcuCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKHF0X3R5cGVfZmluZCk6ICBBZGQgZnR5cAorCWF0b20gdG8gcmVjb2duaXplIC5tcDQgYW5kIC5tNGEgZmlsZXMgYXMgdmlkZW8vcXVpY2t0aW1lLgorCisyMDA0LTAyLTE4ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9zaW5lL2RlbW8tZHBhcmFtcy5jOiAocXVpdF9saXZlKSwKKwkoZHlucGFybV9sb2dfdmFsdWVfY2hhbmdlZCksIChkeW5wYXJtX3ZhbHVlX2NoYW5nZWQpLCAobWFpbik6CisJVXNlIGRvdWJsZSBkcGFyYW1zLCBub3QgZmxvYXQuCisJKiBnc3Qvc2luZS9nc3RzaW5lc3JjLmM6IChnc3Rfc2luZXNyY19jbGFzc19pbml0KSwKKwkoZ3N0X3NpbmVzcmNfaW5pdCk6IENoYW5nZSBzeW5jIGRlZmF1bHQgdG8gRkFMU0UsIHNpbmNlIG11bHRpcGxlCisJc3luYydkIGVsZW1lbnRzIGRvbid0IHJlYWxseSB3b3JrIGNvcnJlY3RseS4KKwkqIGdzdC92b2x1bWUvZ3N0dm9sdW1lLmM6ICh2b2x1bWVfY2xhc3NfaW5pdCksICh2b2x1bWVfaW5pdCksCisJKHZvbHVtZV91cGRhdGVfdm9sdW1lKSwgKHZvbHVtZV9nZXRfcHJvcGVydHkpOiAgQ2hhbmdlIGRwYXJhbQorCXRvIGRvdWJsZS4KKworMjAwNC0wMi0xOCAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzoKKwkoZ3N0X3hpbWFnZXNpbmtfeHdpbmRvd191cGRhdGVfZ2VvbWV0cnkpLAorCShnc3RfeGltYWdlc2lua19yZW5lZ290aWF0ZV9zaXplKSwgKGdzdF94aW1hZ2VzaW5rX2hhbmRsZV94ZXZlbnRzKSwKKwkoZ3N0X3hpbWFnZXNpbmtfY2hhbmdlX3N0YXRlKSwgKGdzdF94aW1hZ2VzaW5rX2V4cG9zZSksCisJKGdzdF94aW1hZ2VzaW5rX2luaXQpOiBSZXdvcmsgdGhlIHdheSBzb2Z0d2FyZSB2aWRlbyBzY2FsaW5nIHdvcmtzLiBTbworCW5vdyB3ZSBjaGVjayBvbiBlYWNoIGNoYWluIGNhbGwgaWYgdGhlIHZpZGVvIGZyYW1lcyBhcmUgZmVlbGluZyB0aGUKKwl3aW5kb3cuIElmIG5vdCB3ZSB0cnkgdG8gcmVuZWdvdGlhdGUgY2Fwcy4gT24gZmFpbHVyZSB3ZSBtZW1vcml6ZSB0aGF0CisJYW5kIHdlIHdvbid0IHRyeSBhZ2FpbiBmb3IgdGhhdCBQTEFZSU5HIHNlc3Npb25zLgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmg6IEFkZGluZyBhIGJvb2xlYW4gdG8gc3RvcmUgdGhlIGNhcHMgcmVuZWdvCisJZmFpbHVyZS4KKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfaW5pdCk6IGluaXRpYWxpemUgdGhlCisJc3luY2hyb25vdXMgZmxhZy4KKworMjAwNC0wMi0xOCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5jOiAoZ3N0X3BsYXlfcGlwZWxpbmVfc2V0dXApOgorICAgICAgICAgIGJyZWFrIHVwIF9saW5rIHNvIHdlIGNhbiBnaXZlIGEgYmV0dGVyIGRlYnVnIG1lc3NhZ2UgZm9yIGVycm9ycworCisyMDA0LTAyLTE4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKHBsdWdpbl9pbml0KToKKyAgICAgICAgICBzZXQgdXAgZGVidWcgY2F0ZWdvcnkKKworMjAwNC0wMi0xOCAgSnVsaWVuIE1PVVRURSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfcmVuZWdvdGlhdGVfc2l6ZSksCisJKGdzdF94aW1hZ2VzaW5rX2hhbmRsZV94ZXZlbnRzKSwgKGdzdF94aW1hZ2VzaW5rX2V4cG9zZSk6IFJlb3JnYW5pemluZworCXRoZSB3YXkgcmVuZWdvdGlhdGlvbiB3b3JrLiBUaGUgZXZlbnQgaGFuZGxpbmcgZnVuY3Rpb24gaXMgbm90IHRha2luZworCWNhcmUgb2YgZXh0ZXJuYWwgd2luZG93cyBhbmQgcmVuZWdvdGlhdGUgbWV0aG9kIGNoZWNrIGZvciBwYWQgZmxhZ3MKKwlORUdPVElBVElORy4gU2hvdWxkIGZpeCA6ICMxMzMyMDkKKworMjAwNC0wMi0xNyAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2V4cG9zZSk6IENoZWNraW5nIGlmIHRoZQorCXBhZCBpcyBuZWdvdGlhdGluZyBiZWZvcmUgdHJ5aW5nIHJlbmVnb3RpYXRpb24uCisKKzIwMDQtMDItMTcgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOiAoZ3N0X2dka19waXhidWZfdHlwZV9maW5kKToKKyAgICAgICAgICBwYXNzIG9uIGFsbCBwb3NzaWJsZSBtaW1lIHR5cGVzIGFzIHR5cGVmaW5kIGhpbnRzCisKKzIwMDQtMDItMTcgIEp1bGllbiBNT1VUVEUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3hpbWFnZV9uZXcpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua194dmltYWdlX25ldyk6IEZpeCBhCisJcG9zc2libGUgU0hNIGxlYWsgaWYgd2UgY3Jhc2guIEFsbCBvdGhlciBhcHBzIHVzaW5nIFhTaG0gYXJlIGRvaW5nCisJdGhhdC4KKworMjAwNC0wMi0xNyAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3JlbmVnb3RpYXRlX3NpemUpLAorCShnc3RfeGltYWdlc2lua19leHBvc2UpOiBSZW5lZ290aWF0ZSBzaXplIG9uIGV4cG9zZS4KKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfZXhwb3NlKTogVXBkYXRlIHdpbmRvdworCXNpemUgb24gZXhwb3NlLgorCisyMDA0LTAyLTE2ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIHRlc3RzdWl0ZS9hbHNhL3NpbmVzcmMuYzoKKwkgIGNvc21ldGljIGZpeCB0byBmaXggY29tcGlsZSBpc3N1ZSB3aXRoIGdjYyAyLjk1LjQKKworMjAwNC0wMi0xNiAgSnVsaWVuIE1PVVRURSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX29wZW5fYXVkaW8pLAorCShnc3RfYWxzYV90aW1lc3RhbXBfdG9fYnl0ZXMpOiBBbHNhIHNob3VsZCB0cmlnZ2VyIGFuIGVycm9yIGlmIGl0CisJZmFpbGVkIG9wZW5pbmcgdGhlIGF1ZGlvIGRldmljZS4KKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfeGltYWdlX25ldyksCisJKGdzdF94aW1hZ2VzaW5rX3hpbWFnZV9kZXN0cm95KSwgKGdzdF94aW1hZ2VzaW5rX3hpbWFnZV9wdXQpLAorCShnc3RfeGltYWdlc2lua194d2luZG93X25ldyksIChnc3RfeGltYWdlc2lua194d2luZG93X2Rlc3Ryb3kpLAorCShnc3RfeGltYWdlc2lua194d2luZG93X3Jlc2l6ZSksIChnc3RfeGltYWdlc2lua194d2luZG93X2NsZWFyKSwKKwkoZ3N0X3hpbWFnZXNpbmtfcmVuZWdvdGlhdGVfc2l6ZSksIChnc3RfeGltYWdlc2lua19oYW5kbGVfeGV2ZW50cyksCisJKGdzdF94aW1hZ2VzaW5rX3hjb250ZXh0X2dldCksIChnc3RfeGltYWdlc2lua194Y29udGV4dF9jbGVhciksCisJKGdzdF94aW1hZ2VzaW5rX2NoYW5nZV9zdGF0ZSksIChnc3RfeGltYWdlc2lua19jaGFpbiksCisJKGdzdF94aW1hZ2VzaW5rX3NldF94d2luZG93X2lkKTogQ2xlYXJpbmcgd2luZG93IGluIFJFQURZIFRPIFBBVVNFRC4KKwlSZW1vdmluZyBzb21lIHVzZWxlc3MgZ19yZXR1cm5faWZfZmFpbCBsaWtlIHdpbmdvIHN1Z2dlc3RlZC4KKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfeHZpbWFnZV9uZXcpLAorCShnc3RfeHZpbWFnZXNpbmtfeHZpbWFnZV9kZXN0cm95KSwgKGdzdF94dmltYWdlc2lua194dmltYWdlX3B1dCksCisJKGdzdF94dmltYWdlc2lua194d2luZG93X25ldyksIChnc3RfeHZpbWFnZXNpbmtfeHdpbmRvd19kZXN0cm95KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3h3aW5kb3dfcmVzaXplKSwgKGdzdF94dmltYWdlc2lua194d2luZG93X2NsZWFyKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3VwZGF0ZV9jb2xvcmJhbGFuY2UpLAorCShnc3RfeHZpbWFnZXNpbmtfaGFuZGxlX3hldmVudHMpLCAoZ3N0X3h2aW1hZ2VzaW5rX3hjb250ZXh0X2dldCksCisJKGdzdF94dmltYWdlc2lua194Y29udGV4dF9jbGVhciksCisJKGdzdF94dmltYWdlc2lua19nZXRfZm91cmNjX2Zyb21fY2FwcyksCisJKGdzdF94dmltYWdlc2lua19jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3h2aW1hZ2VzaW5rX2NoYWluKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3NldF94d2luZG93X2lkKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NvbG9yYmFsYW5jZV9saXN0X2NoYW5uZWxzKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NvbG9yYmFsYW5jZV9zZXRfdmFsdWUpLAorCShnc3RfeHZpbWFnZXNpbmtfY29sb3JiYWxhbmNlX2dldF92YWx1ZSk6IENsZWFyaW5nIHdpbmRvdyBpbiBSRUFEWSBUTworCVBBVVNFRC4gUmVtb3Zpbmcgc29tZSB1c2VsZXNzIGdfcmV0dXJuX2lmX2ZhaWwgbGlrZSB3aW5nbyBzdWdnZXN0ZWQuCisKKzIwMDQtMDItMTYgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6IChnc3RfYXVkaW9fY29udmVydF9jaGFpbik6CisgICAgICAgICAgdGhyb3cgZXJyb3Igd2hlbiBub3QgbmVnb3RpYXRlZCBpbnN0ZWFkIG9mIGFzc2VydGluZworCisyMDA0LTAyLTE1ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGdzdC9zd2l0Y2gvZ3N0c3dpdGNoLmM6IChnc3Rfc3dpdGNoX2xvb3ApOiBNb3JlIGZpeGVzIGZvcgorCWNvcnJlY3QgZGF0YSByZWZjb3VudGluZy4KKworMjAwNC0wMi0xNSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBnc3Qvc3dpdGNoL2dzdHN3aXRjaC5jOiAoZ3N0X3N3aXRjaF9jaGFuZ2Vfc3RhdGUpLAorCShnc3Rfc3dpdGNoX2NsYXNzX2luaXQpOiBDbGVhbmluZyB0aGUgc2lua3BhZHMgY29ycmVjdGx5IG9uIHN0YXRlCisJY2hhbmdlLCBtb3N0bHkgdGhlIEVPUyBmbGFnLgorCisyMDA0LTAyLTE1ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGV4YW1wbGVzL2dzdHBsYXkvcGxheWVyLmM6IChnb3RfZW9zKSwgKG1haW4pOiBBZGRpbmcgc29tZQorCW91dHB1dCBmb3IgZGVidWdnaW5nLgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5jOiAoZ3N0X3BsYXlfc3RhdGVfY2hhbmdlKTogU3RvcCBvdXIKKwl0aW1lb3V0cyBpZiB3ZSBnbyB0byBhbnkgc3RhdGUgZGlmZmVyZW50IGZyb20gUExBWUlORy4KKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5jOiAoZ3N0X3JpZmZfcmVhZF9zZWVrKTogRml4IHNvbWUKKwltb3JlIEVPUyBidWdzIGluIHJpZmYgbGliLgorCisyMDA0LTAyLTE0ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9wbGF5L3BsYXkuYzogKGdzdF9wbGF5X2Nvbm5lY3RfdmlzdWFsaXphdGlvbik6IERpc2FibGUKKwl2aXN1YWxpemF0aW9uIHVudGlsIGkgZmluZCBhIHdheSB0byBmaXggc3dpdGNoIGNvcnJlY3RseS4KKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5jOiAoZ3N0X3JpZmZfcGVla19oZWFkKTogRml4IGEgYnVnIHdoZW4KKwlFT1MgYXJyaXZlcy4KKwkqIGdzdC9zd2l0Y2gvZ3N0c3dpdGNoLmM6IChnc3Rfc3dpdGNoX3JlbGVhc2VfcGFkKSwKKwkoZ3N0X3N3aXRjaF9yZXF1ZXN0X25ld19wYWQpLCAoZ3N0X3N3aXRjaF9wb2xsX3NpbmtwYWRzKSwKKwkoZ3N0X3N3aXRjaF9sb29wKSwgKGdzdF9zd2l0Y2hfZGlzcG9zZSksIChnc3Rfc3dpdGNoX2NsYXNzX2luaXQpOgorCVJld29ya2VkIHN3aXRjaCB0byBnZXQgYSBtb3JlIGNvcnJlY3QgYmVoYXZpb3VyIHdpdGggZXZlbnRzIGFuZCByZWZpbmcKKwlvZiBkYXRhIHN0b3JlZCBpbiBzaW5rcGFkcy4KKwkqIGdzdC9zd2l0Y2gvZ3N0c3dpdGNoLmg6IEFkZGluZyBhbiBlb3MgZmxhZyBmb3IgZXZlcnkgc2lua3BhZCBzbyB0aGF0CisJd2UgZG9uJ3QgcHVsbCBmcm9tIGEgcGFkIGluIEVPUy4KKworMjAwNC0wMi0xNCAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X2lkM190YWdfY2hhaW4pOgorCSAgcmVtb3ZlIHYxIHRhZyBldmVuIGlmIHdlIGNhbid0IHJlYWQgaXQgKG1ha2VzIHN1cmUgd2UgZG9uJ3QgZGV0ZWN0CisJICBpdCBhZ2FpbikKKworMjAwNC0wMi0xNCAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9wY21fd2FpdCksCisJKGdzdF9hbHNhX3hydW5fcmVjb3ZlcnkpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYS5oOgorCSAgdHJ5IHhydW4gcmVjb3Zlcnkgd2hlbiB3YWl0IGZhaWxlZC4gTWFrZSB4cnVuIHJlY292ZXJ5IGZ1bmN0aW9uCisJICByZXR1cm4gVFJVRS9GQUxTRSB0byBpbmRpY2F0ZSBzdWNjZXNzLiAobWlnaHQgZml4ICMxMzQzNTQpCisKKzIwMDQtMDItMTMgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3NpbmUvZGVtby1kcGFyYW1zLmM6IChkeW5wYXJtX2xvZ192YWx1ZV9jaGFuZ2VkKSwKKwkoZHlucGFybV92YWx1ZV9jaGFuZ2VkKSwgKG1haW4pOiBDb252ZXJ0IGZyb20gZmxvYXQgdG8gZG91YmxlLgorCSogZ3N0L3NpbmUvZ3N0c2luZXNyYy5jOiAoZ3N0X3NpbmVzcmNfaW5pdCk6IHNhbWUuCisKKzIwMDQtMDItMTMgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3NpbGVuY2UvZ3N0c2lsZW5jZS5jOiAoZ3N0X3NpbGVuY2VfY2xhc3NfaW5pdCksCisJKGdzdF9zaWxlbmNlX3NldF9jbG9jayksIChnc3Rfc2lsZW5jZV9nZXQpLAorCShnc3Rfc2lsZW5jZV9zZXRfcHJvcGVydHkpLCAoZ3N0X3NpbGVuY2VfZ2V0X3Byb3BlcnR5KToKKwkqIGdzdC9zaWxlbmNlL2dzdHNpbGVuY2UuaDogQWRkIHN5bmMgcHJvcGVydHkuCisJKiBnc3Qvc2luZS9nc3RzaW5lc3JjLmM6IChnc3Rfc2luZXNyY19jbGFzc19pbml0KSwKKwkoZ3N0X3NpbmVzcmNfaW5pdCksIChnc3Rfc2luZXNyY19zZXRfY2xvY2spLCAoZ3N0X3NpbmVzcmNfZ2V0KSwKKwkoZ3N0X3NpbmVzcmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9zaW5lc3JjX2dldF9wcm9wZXJ0eSk6CisJKiBnc3Qvc2luZS9nc3RzaW5lc3JjLmg6IEFkZCBzeW5jIHByb3BlcnR5LgorCisyMDA0LTAyLTEzICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9pbnRmbG9hdC9nc3RpbnQyZmxvYXQuYzogKGNvbnZfZjMyX3MxNiksCisJKGdzdF9pbnQyZmxvYXRfY2hhaW5fZ2ludDE2KTogIENoYW5nZSBzdGRpbnQgdXNhZ2UgdG8gZ2xpYiB0eXBlcy4KKworMjAwNC0wMi0xMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZXh0L01ha2VmaWxlLmFtOgorICAgICAgICAgIG1vdmUgZmZtcGVnIHBsdWdpbiB0byBnc3QtZmZtcGVnIG1vZHVsZQorCisyMDA0LTAyLTEzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6IHVzZSBHU1RfQVJDSCB0byBkZXRlY3QgYXJjaGl0ZWN0dXJlCisKKzIwMDQtMDItMTIgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZ3N0L3ZiaWRlYy92YmlzY3JlZW4uYzogRml4aW5nIHRob21hc3ZzIGZpeGVzLiBNaXNzaW5nIGhlYWRlci4KKworMjAwNC0wMi0xMiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L2xhZHNwYS9nc3RsYWRzcGEuYzogKGdzdF9sYWRzcGFfYmFzZV9pbml0KToKKyAgICAgICAgICBjbGFzc2lmeSBMQURTUEEgcGx1Z2lucyBiYXNlZCBvbiBudW1iZXIgb2Ygc3JjL3NpbmsgcGFkcworCSAgKCMxMzM2NjMsIFN0ZWZhbiBLb3N0KQorCSogZ3N0L3NpbmUvZ3N0c2luZXNyYy5jOiAoZ3N0X3NpbmVzcmNfaW5pdCk6CisgICAgICAgICAgZml4IGRwYXJhbXMgcmVnaXN0cmF0aW9uCisJICAoIzEzMzUyOCwgU3RlZmFuIEtvc3QpCisJKiBnc3QvdmJpZGVjL3ZiaXNjcmVlbi5jOiAodmJpc2NyZWVuX3NldF9jdXJyZW50X2NlbGwpOgorICAgICAgICAgIGZpeCB1c2Ugb2YgaXNwcmludCBhbmQgdXNlIGdfYXNjaWlfaXNwcmludCBpbnN0ZWFkCisJICAoIzEzMzMxNiwgU3RlZmFuIEtvc3QpCisKKzIwMDQtMDItMTEgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCUNvbnZlcnQgYSBmZXcgaW5uZXIgbG9vcHMgdG8gdXNlIGxpYm9pbC4gIFRoaXMgaXMgY3VycmVudGx5CisJb3B0aW9uYWwsIGFuZCBpcyBvbmx5IGVuYWJsZWQgaWYgbGlib2lsIGlzIHByZXNlbnQgKGR1aCEpLgorCSogY29uZmlndXJlLmFjOiBDaGVjayBmb3IgbGlib2lsLTAuMQorCSogZ3N0L2ludGZsb2F0L01ha2VmaWxlLmFtOgorCSogZ3N0L2ludGZsb2F0L2dzdGludDJmbG9hdC5jOiAoY29udl9mMzJfczE2KSwgKHNjYWxhcm11bHRfZjMyKSwKKwkoZ3N0X2ludDJmbG9hdF9jaGFpbl9naW50MTYpOgorCSogZ3N0L3ZpZGVvZmlsdGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOiAoZ3N0X3ZpZGVvYmFsYW5jZV9jbGFzc19pbml0KSwKKwkodGFibGVsb29rdXBfdTgpLCAoZ3N0X3ZpZGVvYmFsYW5jZV9wbGFuYXI0MTEpOgorCSogZ3N0L3ZpZGVvdGVzdHNyYy9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb3Rlc3RzcmMvZ3N0dmlkZW90ZXN0c3JjLmM6IChwbHVnaW5faW5pdCk6CisJKiBnc3QvdmlkZW90ZXN0c3JjL3ZpZGVvdGVzdHNyYy5jOiAoc3BsYXRfdTgpLCAocGFpbnRfaGxpbmVfWVVZMiksCisJKHBhaW50X2hsaW5lX0lZVTIpLCAocGFpbnRfaGxpbmVfc3RyNCksIChwYWludF9obGluZV9zdHIzKSwKKwkocGFpbnRfaGxpbmVfUkdCNTY1KSwgKHBhaW50X2hsaW5lX3hSR0IxNTU1KToKKworMjAwNC0wMi0xMSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvbGNzL2dzdGNvbG9yc3BhY2UuYzogKGNvbG9yc3BhY2VfZmluZF9sY3NfZm9ybWF0KSwKKwkoZ3N0X2NvbG9yc3BhY2VfY2Fwc19nZXRfZm91cmNjKSwgKGNvbG9yc3BhY2Vfc2V0dXBfY29udmVydGVyKSwKKwkoZ3N0X2NvbG9yc3BhY2VfZ2V0Y2FwcyksIChnc3RfY29sb3JzcGFjZV9saW5rKSwKKwkoZ3N0X2NvbG9yc3BhY2VfYmFzZV9pbml0KSwgKGdzdF9jb2xvcnNwYWNlX2luaXQpLAorCShnc3RfY29sb3JzcGFjZV9jaGFpbiksIChnc3RfY29sb3JzcGFjZV9jaGFuZ2Vfc3RhdGUpLAorCShwbHVnaW5faW5pdCk6IE1lcmdlIFJvbmFsZCdzIHBhdGNoIChidWcgIzExNzg5NykgYW5kIHVwZGF0ZQorCWZvciBuZXcgY2FwcyBhbmQgbmVnb3RpYXRpb24uICBTZWVtcyB0byB3b3JrLCBhbHRob3VnaCBpdAorCXNob3dzIG9mZiBidWdzIGluIGxjcy4KKworMjAwNC0wMi0xMSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvYWxzYS9NYWtlZmlsZS5hbTogRml4IGxpbmtpbmcgYWdhaW5zdCBsaWJnc3RpbnRlcmZhY2VzLgorCShidWcgIzEzMzg4NikgIE5vdGljZWQgYnkgYnVnc0BsZXJvdXRpZXIubmV0IChTdGVwaGFuZSBMT0VVSUxMRVQpCisKKzIwMDQtMDItMTEgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2xpYnJmYi9nc3RyZmJzcmMuYzogKGdzdF9yZmJzcmNfY2xhc3NfaW5pdCksCisJKGdzdF9yZmJzcmNfY2hhbmdlX3N0YXRlKSwgKGdzdF9yZmJzcmNfaW5pdCksCisJKGdzdF9yZmJzcmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9yZmJzcmNfZ2V0X3Byb3BlcnR5KToKKwlBZGQgc2VydmVyIGFuZCBwb3J0IHByb3BlcnRpZXMKKworMjAwNC0wMi0xMSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogbTQvYTUyLm00OgorCSogbTQvYWFsaWIubTQ6CisJKiBtNC9hcy1mZm1wZWcubTQ6CisJKiBtNC9hcy1saWJsYW1lLm00OgorCSogbTQvYXMtc2x1cnAtZmZtcGVnLm00OgorCSogbTQvY2hlY2stbGliaGVhZGVyLm00OgorCSogbTQvZXNkLm00OgorCSogbTQvZnJlZXR5cGUyLm00OgorCSogbTQvZ2NvbmYtMi5tNDoKKwkqIG00L2dsaWIubTQ6CisJKiBtNC9nc3QtYWxzYS5tNDoKKwkqIG00L2dzdC1hcnRzYy5tNDoKKwkqIG00L2dzdC1pdm9yYmlzLm00OgorCSogbTQvZ3N0LW1hdHJvc2thLm00OgorCSogbTQvZ3N0LXNkbC5tNDoKKwkqIG00L2dzdC1zaG91dDIubTQ6CisJKiBtNC9nc3Qtc2lkLm00OgorCSogbTQvZ3RrLm00OgorCSogbTQvbGliZHYubTQ6CisJKiBtNC9saWJmYW1lLm00OgorCSogbTQvbGlibWlrbW9kLm00OgorCSogbTQvb2dnLm00OgorCSogbTQvdm9yYmlzLm00OgorICAgICAgICAgIGZpeCB1bmRlcnF1b3RlZG5lc3Mgb2YgbWFjcm9zICgjMTMzODAwKQorCSogbTQvYXMtYXZpZmlsZS5tNDoKKwkqIG00L3htbXMubTQ6CisgICAgICAgICAgcmVtb3ZlZCBiZWNhdXNlIG5vIGxvbmdlciB1c2VkCisKKzIwMDQtMDItMTEgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKyAgICAgICAgICByZXF1aXJlIGdldHRleHQgMC4xMS41IHNvIHVsb25nbG9uZy5tNCBnZXRzIGNoZWNrZWQgb3V0IGFuZCBjb3BpZWQKKyAgICAgICAgICBieSBhdXRvcG9pbnQgKGZpeGVzICMxMzI5OTYpCisKKzIwMDQtMDItMTEgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdkZWMuYzogKGdzdF9mZm1wZWdkZWNfYmFzZV9pbml0KToKKwkqIGV4dC9mZm1wZWcvZ3N0ZmZtcGVnZGVtdXguYzogKGdzdF9mZm1wZWdkZW11eF9iYXNlX2luaXQpOgorCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdlbmMuYzogKGdzdF9mZm1wZWdlbmNfYmFzZV9pbml0KToKKwkqIGV4dC9mZm1wZWcvZ3N0ZmZtcGVnbXV4LmM6IChnc3RfZmZtcGVnbXV4X2Jhc2VfaW5pdCk6CisJICBmaXggbWVtbGVha3MKKworMjAwNC0wMi0xMSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKGdzdF9nZGtfcGl4YnVmX3NpbmtfbGluayksCisJKGdzdF9nZGtfcGl4YnVmX2NoYWluKTogRml4IGxvZ2ljIGJ1ZyBjYXVzaW5nIHNwdXJpb3VzIGVycm9ycy4KKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogKGdzdF9qcGVnZGVjX2Jhc2VfaW5pdCksCisJKGdzdF9qcGVnZGVjX2luaXQpLCAoZ3N0X2pwZWdkZWNfY2hhaW4pOiBGaXggbmVnb3RpYXRpb24uCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6IChnc3RfanBlZ2VuY19iYXNlX2luaXQpLAorCShnc3RfanBlZ2VuY19jbGFzc19pbml0KSwgKGdzdF9qcGVnZW5jX2luaXQpLAorCShnc3RfanBlZ2VuY19nZXRjYXBzKSwgKGdzdF9qcGVnZW5jX2xpbmspLCAoZ3N0X2pwZWdlbmNfcmVzeW5jKSwKKwkoZ3N0X2pwZWdlbmNfY2hhaW4pLCAoZ3N0X2pwZWdlbmNfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X2pwZWdlbmNfZ2V0X3Byb3BlcnR5KTogIEZpeCBuZWdvdGlhdGlvbi4gIEFkZCBzb21lIHByb3BlcnRpZXMuCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmg6IEZpeCBuZWdvdGlhdGlvbi4KKworMjAwNC0wMi0xMCAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvbWlrbW9kL2dzdG1pa21vZC5jOiAoZ3N0X21pa21vZF9pbml0KSwKKwkoZ3N0X21pa21vZF9zcmNmaXhhdGUpLCAoZ3N0X21pa21vZF9zcmNsaW5rKSwgKGdzdF9taWttb2RfbG9vcCk6CisJKiBleHQvbWlrbW9kL2dzdG1pa21vZC5oOgorCSAgZml4IGNhcHMgbmVnb3RpYXRpb24gaW4gbWlrbW9kCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX3ByaW50KToKKwkgIG91dHB1dCBkZWJ1ZyBpbmZvcm1hdGlvbgorCisyMDA0LTAyLTA4ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC1saWJzL2dzdC9jb2xvcmJhbGFuY2UvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvbmF2aWdhdGlvbi9NYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2dzdC94b3ZlcmxheS9NYWtlZmlsZS5hbToKKwkgIHJlbW92ZSB1bnVzZWQgR1NUX09QVF9DRkxBR1MgZnJvbSBNYWtlZmlsZXMKKwkgIGluY2x1ZGUgWF9DRkxBR1MgYW5kIFhfTElCUyBpbiB4b3ZlcmxheS4gKCMxMzE5NDgpCisKKzIwMDQtMDItMDcgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9oYW5kbGVfZXZlbnQpOiBEb24ndAorCXB1c2ggZXZlbnRzIHRvIHBhZHMgdGhhdCBoYXZlbid0IGJlZW4gY3JlYXRlZCAoIzEzMzUwOCkKKworMjAwNC0wMi0wNyAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19pbml0KSwgKGdzdF9kdmRlY19zcmNfY29udmVydCksCisJKGdzdF9kdmRlY19zaW5rX2NvbnZlcnQpLCAoZ3N0X2R2ZGVjX2hhbmRsZV9zaW5rX2V2ZW50KSwKKwkoZ3N0X2R2ZGVjX3ZpZGVvX2dldGNhcHMpLCAoZ3N0X2R2ZGVjX3ZpZGVvX2xpbmspLAorCShnc3RfZHZkZWNfbG9vcCksIChnc3RfZHZkZWNfY2hhbmdlX3N0YXRlKToKKwlTZWNvbmQgYXR0ZW1wdCBhdCBjb21taXR0aW5nIGEgd29ya2luZyBkdmRlYyBlbGVtZW50LgorCisyMDA0LTAyLTA2ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwlCdWlsZCBmaXhlcyBmb3IgT1MgWDogKHNlZSAjMTI5NjAwKQorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6IChnc3RfcmlmZl9yZWFkX3N0cmgpLAorCShnc3RfcmlmZl9yZWFkX3N0cmZfdmlkcyksIChnc3RfcmlmZl9yZWFkX3N0cmZfYXVkcyksCisJKGdzdF9yaWZmX3JlYWRfc3RyZl9pYXZzKToKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2F2aWgpLAorCShnc3RfYXZpX2RlbXV4X3N0cmVhbV9vZG1sKToKKwkqIGdzdC9wbGF5b25kZW1hbmQvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL3J0cC1wYWNrZXQuYzoKKworMjAwNC0wMi0wNSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19pbml0KSwgKGdzdF9kdmRlY19sb29wKTogUmV2ZXJ0CisJbGFzdCBjaGFuZ2UsIGJlY2F1c2UgaXQgSnVzdCBEb2Vzbid0IENvbXBpbGUuCisKKzIwMDQtMDItMDUgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX2NoYWluKToKKwkgIHNraXAgdW5kZWNvZGFibGUgaWQzdjIgdGFnIGluc3RlYWQgb2Yga2VlcGluZyBpdAorCisyMDA0LTAyLTA1ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9tcGVnYXVkaW9wYXJzZS9nc3RtcGVnYXVkaW9wYXJzZS5jOiAoZ3N0X21wM3BhcnNlX2NoYWluKToKKwlVbnJlZiBsZWFrZWQgYnVmZmVyLiAgKE5vdGljZWQgYnkgUm9uYWxkKQorCisyMDA0LTAyLTA1ICBEYXZpZCBJLiBMZWhuICA8ZGxlaG5AdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBwa2djb25maWcvZ3N0cmVhbWVyLWxpYnMtdW5pbnN0YWxsZWQucGMuaW46CisJU3luYyByZXF1aXJlcyB3aXRoIG90aGVyIGNoZWNrcy4gID49IHZzID0uCisKKzIwMDQtMDItMDYgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6IChnc3RfZHZkZWNfaW5pdCksIChnc3RfZHZkZWNfdmlkZW9fZ2V0Y2FwcyksCisJKGdzdF9kdmRlY192aWRlb19saW5rKSwgKGdzdF9kdmRlY19sb29wKToKKwkqIGV4dC9kdi9nc3RkdmRlYy5oOgorCSAgcmV3b3JrIHRoZSBjYXBzIG5lZ290aWF0aW9uIHNvIHRoYXQgZHZkZWMgd29ya3MgYWdhaW4gaW5zdGVhZAorCSAgb2YganVzdCBzZWdmYXVsdGluZy4KKworPT09IHJlbGVhc2UgMC43LjQgPT09CisKKzIwMDQtMDItMDYgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIE5FV1M6IEdTdHJlYW1lciBQbHVnaW5zIDAuNy40ICJGb3IgR3JlYXQgSnVzdGljZSIgcmVsZWFzZWQKKwkqIGNvbmZpZ3VyZS5hYzogY2hhbmdlZCBmb3IgcmVsZWFzZQorCisyMDA0LTAyLTA1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QtbGlicy9nc3QvZ2NvbmYvZ3N0cmVhbWVyLWdjb25mLXVuaW5zdGFsbGVkLnBjLmluOgorCSogcGtnY29uZmlnL2dzdHJlYW1lci1pbnRlcmZhY2VzLXVuaW5zdGFsbGVkLnBjLmluOgorCSogcGtnY29uZmlnL2dzdHJlYW1lci1saWJzLXVuaW5zdGFsbGVkLnBjLmluOgorCSogcGtnY29uZmlnL2dzdHJlYW1lci1wbGF5LXVuaW5zdGFsbGVkLnBjLmluOgorICAgICAgICAgIHJld29ya2VkIHBhdGNoIGJ5IERhdmlkIExlaG4gdG8gZml4IGxpYmRpciBhbmQgaW5jbHVkZWRpciBmb3IKKyAgICAgICAgICB1bmluc3RhbGxlZCBsaWJyYXJpZXMKKyAgICAgICAgICByZW1vdmVkIHBsYXkgYW5kIGdjb25mIGZyb20gZ3N0cmVhbWVyLWxpYnMgc2luY2UgdGhleSBoYXZlIHRoZWlyCisgICAgICAgICAgb3duIHBrZ2NvbmZpZyBmaWxlcworCisyMDA0LTAyLTA0ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX3BhcnNlX2ZtdCk6IEZpeCBhIGNhcHMKKwltZW1sZWFrLgorCisyMDA0LTAyLTA1ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5jOiAoZ3N0X3JpZmZfcmVhZF9pbmZvKToKKwkgIHVzZSBjb3JyZWN0IEdTVF9UQUdfRU5DT0RFUiB0YWcKKworMjAwNC0wMi0wNSAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9jaGFuZ2Vfc3RhdGUpOgorCSAgYmUgc3VyZSB0byBzdG9wIHRoZSBjbG9jayB3aGVuIGdvaW5nIHRvIHBhdXNlZAorCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IChnc3Rfb3Nzc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgcmVzZXQgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHdoZW4gZ29pbmcgdG8gcmVhZHkuCisJZml4ZXMgIzEzMjkzNQorCisyMDA0LTAyLTA1ICBDaGFybGVzIFNjaG1pZHQgPGNzY2htaWR0MkBlbWljaC5lZHU+CisKKwlyZXZpZXdlZCBieSBCZW5qYW1pbiBPdHRlCisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChnc3RfbWFkX2lkM190b190YWdfbGlzdCk6CisJICBleHRyYWN0IHRyYWNrIGNvdW50IChmaXhlcyAjMTMzNDEwKQorCisyMDA0LTAyLTA0ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChnc3RfaWQzX3RhZ19kb19jYXBzX25lZ28pOgorCSAgdGhhdCBzaG91bGQgYmUgIT0sIG5vdCA9PSAoZml4ZXMgIzEzMjUxOSkKKworMjAwNC0wMi0wNCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJTWFrZSBzdXJlIHNldF9leHBsaWNpdF9jYXBzKCkgaXMgY2FsbGVkIGJlZm9yZSBhZGRpbmcgcGFkLgorCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdkZW11eC5jOiAoZ3N0X2ZmbXBlZ2RlbXV4X2xvb3ApOgorCSogZ3N0L2lkMy9nc3RpZDN0eXBlcy5jOiAoZ3N0X2lkM3R5cGVzX2xvb3ApOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ2RlbXV4LmM6IChnc3RfbXBlZ19kZW11eF9wYXJzZV9zeXNoZWFkKToKKwkqIGdzdC9yZWFsbWVkaWEvcm1kZW11eC5jOiAoZ3N0X3JtZGVtdXhfYWRkX3N0cmVhbSk6CisKKzIwMDQtMDItMDQgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKyAgICAgICAgICBidW1wIG5hbm8gdG8gMiwgZmlyc3QgcHJlcmVsZWFzZQorICAgICAgICAgIHB1dCBiYWNrIEFNX1BST0dfTElCVE9PTAorCisyMDA0LTAyLTA0ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiB0ZXN0c3VpdGUvYWxzYS9NYWtlZmlsZS5hbToKKyAgICAgICAgICB0aGVzZSBhcmUgdXNlciB0ZXN0IGFwcHMsIG5vdCBhdXRvbWF0aWMgdGVzdHN1aXRlIHRlc3RzCisKKzIwMDQtMDItMDQgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCUNvbnZlcnQgR1NUX0RFQlVHX0NBUFMoKSB0byBHU1RfREVCVUcoKToKKwkqIGdzdC9tcGVnMXZpZGVvcGFyc2UvZ3N0bXAxdmlkZW9wYXJzZS5jOgorCShtcDF2aWRlb3BhcnNlX3BhcnNlX3NlcSk6CisJKiBnc3QvcmVhbG1lZGlhL3JtZGVtdXguYzogKGdzdF9ybWRlbXV4X2FkZF9zdHJlYW0pOgorCSogZ3N0L3ZpZGVvc2NhbGUvZ3N0dmlkZW9zY2FsZS5jOiAoZ3N0X3ZpZGVvc2NhbGVfZ2V0Y2Fwcyk6CisJKiBzeXMveHZpZGVvL2dzdHh3aW5kb3cuYzogKF9nc3RfeHdpbmRvd19uZXcpOgorCSogc3lzL3h2aWRlby94dmlkZW9zaW5rLmM6IChnc3RfeHZpZGVvc2lua19zaW5rY29ubmVjdCksCisJKGdzdF94dmlkZW9zaW5rX2dldGNhcHMpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19nZXRfeHZfc3VwcG9ydCk6CisJKiB0ZXN0c3VpdGUvZ3N0LWxpbnQ6IG1vcmUgdGVzdHMKKworMjAwNC0wMi0wNCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJUmVwbGFjZSB1c2Ugb2YgR1NUX1BBRF9GT1JNQVRTX0ZVTkNUSU9OKCkgYW5kIHNpbWlsYXIgbWFjcm9zCisJd2l0aCB0aGUgY29kZSB0aGF0IHRoZXkgd291bGQgZXhwYW5kIHRvLgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNkZWNfZ2V0X3NyY19mb3JtYXRzKSwKKwkoZ3N0X2ZsYWNkZWNfZ2V0X3NyY19xdWVyeV90eXBlcyksCisJKGdzdF9mbGFjZGVjX2dldF9zcmNfZXZlbnRfbWFza3MpOgorCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzc3JjLmM6IChnc3RfZ25vbWV2ZnNzcmNfZ2V0X2Zvcm1hdHMpLAorCShnc3RfZ25vbWV2ZnNzcmNfZ2V0X3F1ZXJ5X3R5cGVzKSwKKwkoZ3N0X2dub21ldmZzc3JjX2dldF9ldmVudF9tYXNrKToKKworMjAwNC0wMi0wNCAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBnc3Qvc2luZS9nc3RzaW5lc3JjLmM6IChnc3Rfc2luZXNyY19jbGFzc19pbml0KSwKKwkoZ3N0X3NpbmVzcmNfZGlzcG9zZSk6CisJICBmaXggbWVtbGVhayBieSBwcm9wZXJseSBkaXNwb3Npbmcgc2luZXNyYworCisyMDA0LTAyLTA0ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC94b3ZlcmxheS94b3ZlcmxheS5jOiAoZ3N0X3hfb3ZlcmxheV9leHBvc2UpOgorCSogZ3N0LWxpYnMvZ3N0L3hvdmVybGF5L3hvdmVybGF5Lmg6IEFkZGluZyB0aGUgX2V4cG9zZSBtZXRob2QgdG8gdGVsbAorCWFuIG92ZXJsYXkgdG8gcmVkcmF3IHRoZSBpbWFnZSBiZWNhdXNlIGl0IGhhcyBiZWVuIGV4cG9zZWQuCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3hpbWFnZV9kZXN0cm95KSwKKwkoZ3N0X3hpbWFnZXNpbmtfeGltYWdlX3B1dCksIChnc3RfeGltYWdlc2lua19leHBvc2UpLAorCShnc3RfeGltYWdlc2lua194b3ZlcmxheV9pbml0KSwgKGdzdF94aW1hZ2VzaW5rX2luaXQpOgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmg6IEltcGxlbWVudCBleHBvc2UgbWV0aG9kIGZyb20gWE92ZXJsYXkKKwlpbnRlcmZhY2UKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfeHZpbWFnZV9kZXN0cm95KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3h2aW1hZ2VfcHV0KSwgKGdzdF94dmltYWdlc2lua19leHBvc2UpLAorCShnc3RfeHZpbWFnZXNpbmtfeG92ZXJsYXlfaW5pdCksIChnc3RfeHZpbWFnZXNpbmtfaW5pdCk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5oOiBJbXBsZW1lbnQgZXhwb3NlIG1ldGhvZCBmcm9tIFhPdmVybGF5CisJaW50ZXJmYWNlCisKKzIwMDQtMDItMDMgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6IChnc3RfZ2RrX3BpeGJ1Zl90eXBlX2ZpbmQpOgorCSAgbW9yZSBtZW1sZWFrIGZpeGFnZQorCisyMDA0LTAyLTAzICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOiAocGx1Z2luX2luaXQpOgorCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6CisJICBmaXggbWVtbGVha3Mgc2hvd24gYnkgZ3N0LXR5cGVmaW5kCisKKzIwMDQtMDItMDMgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbW1vbi9nbGliLWdlbi5tYWs6CisgICAgICAgICAgYWRkIGhhY2sgcnVsZSB0byB0b3VjaCAuUGxvIGZpbGVzCisJKiBnc3QtbGlicy9nc3QvY29sb3JiYWxhbmNlL01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvdHVuZXIvTWFrZWZpbGUuYW06CisgICAgICAgICAgcmVtb3ZlIGdsaWJfcm9vdCB2YXJpYWJsZQorCisyMDA0LTAyLTAzICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pOgorCSAgc2V0IGV4cGxpY2l0IGNhcHMgYmVmb3JlIGFkZGluZyB0aGUgZWxlbWVudCwgc28gdGhlIGF1dG9wbHVnZ2VycyBjYW4KKwkgIHBsdWcgY29ycmVjdGx5LgorCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChtcDNfdHlwZV9maW5kKSwKKwkobXBlZzJfc3lzX3R5cGVfZmluZCksIChtcGVnMV9zeXNfdHlwZV9maW5kKSwKKwkobXBlZ192aWRlb190eXBlX2ZpbmQpLCAobXBlZ192aWRlb19zdHJlYW1fdHlwZV9maW5kKSwKKwkoZHZfdHlwZV9maW5kKToKKwkgIGZpeCBtZW1sZWFrcyBpbiB0eXBlZmluZCBmdW5jdGlvbnMuIGdzdF90eXBlX2ZpbmRfc3VnZ2VzdCB0YWtlcyBhIGNvbnN0CisJICBhcmd1bWVudC4KKworMjAwNC0wMi0wMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L2NvbG9yYmFsYW5jZS9NYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2dzdC9jb2xvcmJhbGFuY2UvY29sb3JiYWxhbmNlLW1hcnNoYWwubGlzdDoKKwkqIGdzdC1saWJzL2dzdC9jb2xvcmJhbGFuY2UvY29sb3JiYWxhbmNlLmM6CisJKiBnc3QtbGlicy9nc3QvY29sb3JiYWxhbmNlL2NvbG9yYmFsYW5jZS5oOgorCSogZ3N0LWxpYnMvZ3N0L2NvbG9yYmFsYW5jZS9jb2xvcmJhbGFuY2VtYXJzaGFsLmxpc3Q6CisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvbWl4ZXItbWFyc2hhbC5saXN0OgorCSogZ3N0LWxpYnMvZ3N0L21peGVyL21peGVyLmM6CisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvbWl4ZXIuaDoKKwkqIGdzdC1saWJzL2dzdC9taXhlci9taXhlcm1hcnNoYWwubGlzdDoKKwkqIGdzdC1saWJzL2dzdC9wbGF5L01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5oOgorCSogZ3N0LWxpYnMvZ3N0L3R1bmVyL01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L3R1bmVyL3R1bmVyLW1hcnNoYWwubGlzdDoKKwkqIGdzdC1saWJzL2dzdC90dW5lci90dW5lci5jOgorCSogZ3N0LWxpYnMvZ3N0L3R1bmVyL3R1bmVyLmg6CisJKiBnc3QtbGlicy9nc3QvdHVuZXIvdHVuZXJtYXJzaGFsLmxpc3Q6CisgICAgICAgICAgdXNlIG5ldyBnbGliLWdlbi5tYWsgc25pcHBldCB0byBjbGVhbiB1cCBNYWtlZmlsZS5hbQorICAgICAgICAgIGZpeCB2YXJpb3VzIGJ1Z3MgaW4gTWFrZWZpbGUuYW0ncworCisyMDA0LTAyLTAzICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfZGVtdXhfY2hhaW4pOgorCSAgaGFuZGxlIGNoYWluIHBhcnNpbmcgY29ycmVjdGx5IGluIHRoZSBtdWx0aWNoYWluIGNhc2UKKwkqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6IChnc3RfdGhlb3JhX2RlY19pbml0KSwgKF90aGVvcmFfaWxvZyksCisJKHRoZW9yYV9kZWNfZnJvbV9ncmFudWxlcG9zKSwgKHRoZW9yYV9kZWNfdG9fZ3JhbnVsZXBvcyksCisJKHRoZW9yYV9kZWNfc3JjX3F1ZXJ5KSwgKHRoZW9yYV9kZWNfc3JjX2V2ZW50KSwgKHRoZW9yYV9kZWNfZXZlbnQpLAorCSh0aGVvcmFfZGVjX2NoYWluKToKKwkgIGhhbmRsZSBldmVudHMgYW5kIHF1ZXJpZXMgY29ycmVjdGx5CisKKzIwMDQtMDItMDMgIERhdmlkIEkuIExlaG4gIDxkbGVobkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIC5jdnNpZ25vcmU6CisJSWdub3JlIGdlbmVyYXRlZCBmaWxlIF9zdGRpbnQuaC4KKworMjAwNC0wMi0wMyAgRGF2aWQgSS4gTGVobiAgPGRsZWhuQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L2NvbG9yYmFsYW5jZS9NYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2dzdC9jb2xvcmJhbGFuY2UvY29sb3JiYWxhbmNlLmg6CisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvbWl4ZXIuaDoKKwkqIGdzdC1saWJzL2dzdC9wbGF5L01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5oOgorCSogZ3N0LWxpYnMvZ3N0L3R1bmVyL01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L3R1bmVyL3R1bmVyLmg6CisJR2VuZXJhdGUgZW51bSB0eXBlIGNvZGUgd2l0aCBnbGliLW1rZW51bXMuCisJKiBnc3QtbGlicy9nc3QvY29sb3JiYWxhbmNlLy5jdnNpZ25vcmU6CisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvLmN2c2lnbm9yZToKKwkqIGdzdC1saWJzL2dzdC9wbGF5Ly5jdnNpZ25vcmU6CisJKiBnc3QtbGlicy9nc3QvdHVuZXIvLmN2c2lnbm9yZToKKwlJZ25vcmUgZ2VuZXJhdGVkIGZpbGVzLgorCisyMDA0LTAyLTAzICBEYXZpZCBJLiBMZWhuICA8ZGxlaG5AdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QtbGlicy9nc3QvYXVkaW8vLmN2c2lnbm9yZToKKwlJZ25vcmUgZ2VuZXJhdGVkIGZpbGUuCisJKiBnc3QtbGlicy9nc3QvYXVkaW8vTWFrZWZpbGUuYW06CisJRG8gbm90IGluc3RhbGwgZXhhbXBsZSBmaWx0ZXIuCisKKzIwMDQtMDItMDMgIERhdmlkIEkuIExlaG4gIDxkbGVobkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGV4YW1wbGVzL3N3aXRjaC8uY3ZzaWdub3JlOgorCUlnbm9yZSBnZW5lcmF0ZWQgZmlsZS4KKworMjAwNC0wMi0wMyAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBjb21tb24vbTQvYXhfY3JlYXRlX3N0ZGludF9oLm00OgorCSogY29uZmlndXJlLmFjOgorCSAgYWRkIEFYX0NSRUFURV9TVERJTlRfSCB0byBnZXQgY29ycmVjdCB0eXBlIGRlZmluaXRpb25zIGZvciBhNTJkZWMgaW4KKwkgIF9zdGRpbnQuaC4KKwkqIE1ha2VmaWxlLmFtOgorCSAgcmVtb3ZlIGdlbmVyYXRlZCBfc3RkaW50LmggaW4gRElTVENMRUFORklMRVMKKwkqIGV4dC9hNTJkZWMvZ3N0YTUyZGVjLmM6CisJICBpbmNsdWRlIF9zdGRpbnQuaCBmb3IgYTUyZGVjLiAoc2hvdWxkIGZpeCAjMTMzMDY0KQorCisyMDA0LTAyLTAyICBKZXJlbXkgU2ltb24gIDxqZXNpbW9uQGxpYmVydHlzdXJmLmZyPgorCisJKiBnc3QvdGFncy9nc3R2b3JiaXN0YWcuYzogKGdzdF92b3JiaXNfdGFnX2FkZCksCisJKGdzdF90YWdfdG9fdm9yYmlzX2NvbW1lbnRzKToKKwlBZGQgcmVwbGF5Z2FpbiBzdXBwb3J0IHRvIHZvcmJpc3RhZworCisyMDA0LTAyLTAyICBKZXJlbXkgU2ltb24gIDxqZXNpbW9uQGxpYmVydHlzdXJmLmZyPgorCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdjb2RlY21hcC5jOiAoZ3N0X2ZmbXBlZ19jb2RlY2lkX3RvX2NhcHMpLAorCShnc3RfZmZtcGVnX2NhcHNfdG9fZXh0cmFkYXRhKToKKwkgIEZpeCBTVlEzIGNhcHMgZmxhZyBwcm9wZXJ0aWVzCisJICBVc2UgZ2xpYiBtYWNybyBmb3IgYnl0ZXMgc3dhcAorCisyMDA0LTAyLTAyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvYXVkaW9maWxlL2dzdGFmc2luay5jOiAoZ3N0X2Fmc2lua19wbHVnaW5faW5pdCk6CisJKiBleHQvYXVkaW9maWxlL2dzdGFmc3JjLmM6IChnc3RfYWZzcmNfcGx1Z2luX2luaXQpOgorCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzLmM6IChwbHVnaW5faW5pdCk6CisJKiBleHQvc25kZmlsZS9nc3RzZi5jOiAocGx1Z2luX2luaXQpOgorCSogZ3N0L2F2aS9nc3RhdmkuYzogKHBsdWdpbl9pbml0KToKKwkqIHN5cy9keHIzL2R4cjNpbml0LmM6IChwbHVnaW5faW5pdCk6CisJKiBzeXMvb3NzL2dzdG9zc2F1ZGlvLmM6IChwbHVnaW5faW5pdCk6CisJKiBzeXMvdjRsL2dzdHY0bC5jOiAocGx1Z2luX2luaXQpOgorCSogc3lzL3Y0bDIvZ3N0djRsMi5jOiAocGx1Z2luX2luaXQpOgorICAgICAgICAgIHJlbW92ZSB0ZXh0ZG9tYWluIGNhbGxzCisJKiBwby9ubC5wbzoKKyAgICAgICAgICB1cGRhdGUgRHV0Y2ggdHJhbnNsYXRpb24KKworMjAwNC0wMi0wMiAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5LmM6IChnc3RfcGxheV9waXBlbGluZV9zZXR1cCksCisJKGdzdF9wbGF5X3NldF9hdWRpb19zaW5rKTogTW92aW5nIHZvbHVtZSBpbiB0aGUgYXVkaW8gdGhyZWFkIGZvcgorCWluc3RhbnRhbmVvdXMgdm9sdW1lIGNoYW5nZS4gTWF5YmUgaSB3aWxsIGFkZCBhbm90aGVyIHZvbHVtZSBpbiBmcm9udAorCW9mIHZpc3VhbGl6YXRpb24gbGF0ZXIsIG5vdCBzdXJlIHlldCB0aG91Z2guCisKKzIwMDQtMDItMDIgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19yZW5lZ290aWF0ZV9zaXplKSwKKwkoZ3N0X3hpbWFnZXNpbmtfaGFuZGxlX3hldmVudHMpOiBCZXR0ZXIgWCBldmVudHMgaGFuZGxpbmcsIG9ubHkgdGFrZQorCXRoZSBsYXRlc3QgZXZlbnRzIGZvciBjb25maWd1cmUgYW5kIG1vdGlvbi4KKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfaGFuZGxlX3hldmVudHMpOiBzYW1lLgorCisyMDA0LTAyLTAyICBKb24gVHJvd2JyaWRnZSAgPHRyb3dAZ251Lm9yZz4KKworCXJldmlld2VkIGJ5OiBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwlGaXggbWVtb3J5IGxlYWtzOgorCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdkZWMuYzogKGdzdF9mZm1wZWdkZWNfcmVnaXN0ZXIpOgorCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdlbmMuYzogKGdzdF9mZm1wZWdlbmNfcmVnaXN0ZXIpOgorCisyMDA0LTAyLTAyICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwljb2RlIGNsZWFudXAuICBDaGFuZ2UgYnplcm8oKSB0byBtZW1zZXQoKS4gIFJlbW92ZSBkdXBsaWNhdGUgOyBhdCBlbmRzCisJb2YgbGluZXMuCisJKiBleHQvY2RwYXJhbm9pYS9nc3RjZHBhcmFub2lhLmM6IChjZHBhcmFub2lhX2V2ZW50KToKKwkqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzogKGdzdF9mbGFjX3RhZ19jaGFpbik6CisJKiBleHQveHZpZC9nc3R4dmlkZGVjLmM6IChnc3RfeHZpZGRlY19zcmNfbGluayk6CisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5LmM6IChnc3RfcGxheV9nZXRfc2lua19lbGVtZW50KToKKwkqIGdzdC9hYzNwYXJzZS9nc3RhYzNwYXJzZS5jOiAoZ3N0X2FjM3BhcnNlX2NoYWluKToKKwkqIGdzdC9lZmZlY3R2L2dzdGVkZ2UuYzogKGdzdF9lZGdldHZfc2lua2Nvbm5lY3QpOgorCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5jOiAoZ3N0X3ZlcnRpZ290dl9zaW5rY29ubmVjdCk6CisJKiBnc3QvaW50ZmxvYXQvZmxvYXQyMmludC5jOiAoZ3N0X2Zsb2F0Ml8yX2ludF9nZXRjYXBzKSwKKwkoZ3N0X2Zsb2F0Ml8yX2ludF9saW5rKToKKwkqIGdzdC9tcGVnMnN1Yi9nc3RtcGVnMnN1YnQuYzogKGdzdF9tcGVnMnN1YnRfY2hhaW5fc3VidGl0bGUpOgorCSogZ3N0L3J0anBlZy9SVGpwZWcuYzogKFJUanBlZ19pbml0X21jb21wcmVzcyk6CisJKiBnc3QvdGNwL2dzdHRjcHNpbmsuYzogKGdzdF90Y3BzaW5rX2luaXRfc2VuZCk6CisJKiBnc3QvdGNwL2dzdHRjcHNyYy5jOiAoZ3N0X3RjcHNyY19pbml0X3JlY2VpdmUpOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6IChnc3RfdWRwc2lua19pbml0X3NlbmQpOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfaW5pdF9yZWNlaXZlKToKKwkqIHN5cy92NGwvZ3N0djRsZWxlbWVudC5jOiAoZ3N0X3Y0bGVsZW1lbnRfaW5pdCk6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IChnc3RfdjRsMnNyY19zZXRfY2FwdHVyZSk6CisJKiB0ZXN0c3VpdGUvZ3N0LWxpbnQ6IEFkZCB0ZXN0cyBmb3IgYnplcm8gYW5kIDs7CisKKzIwMDQtMDItMDIgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2RlYnVnL2VmZW5jZS5jOiBBZGQgZmFsbGJhY2sgaWYgTUFQX0FOT05ZTU9VUyBpc24ndCBkZWZpbmVkLgorCisyMDA0LTAyLTAyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6IChnc3RfYWFzaW5rX29wZW4pOgorCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfbGluayksIChnc3RfYWxzYV94cnVuX3JlY292ZXJ5KToKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2xvb3ApOgorCSogZXh0L2Fsc2EvZ3N0YWxzYXNyYy5jOiAoZ3N0X2Fsc2Ffc3JjX2xvb3ApOgorCSogZXh0L2F1ZGlvZmlsZS9nc3RhZnNpbmsuYzogKGdzdF9hZnNpbmtfb3Blbl9maWxlKSwKKwkoZ3N0X2Fmc2lua19jbG9zZV9maWxlKToKKwkqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzcmMuYzogKGdzdF9hZnNyY19vcGVuX2ZpbGUpLAorCShnc3RfYWZzcmNfY2xvc2VfZmlsZSk6CisJKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmM6IChnc3RfZGl2eGRlY19zZXR1cCksIChnc3RfZGl2eGRlY19jaGFpbik6CisJKiBleHQvZGl2eC9nc3RkaXZ4ZW5jLmM6IChnc3RfZGl2eGVuY19zZXR1cCksIChnc3RfZGl2eGVuY19jaGFpbik6CisJKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19sb29wKToKKwkqIGV4dC9kdmRuYXYvZHZkbmF2c3JjLmM6IChkdmRuYXZzcmNfdXNlcl9vcCksIChkdmRuYXZzcmNfZ2V0KToKKwkqIGV4dC9lc2QvZXNkbW9uLmM6IChnc3RfZXNkbW9uX2dldCk6CisJKiBleHQvZXNkL2VzZHNpbmsuYzogKGdzdF9lc2RzaW5rX2NoYWluKSwgKGdzdF9lc2RzaW5rX29wZW5fYXVkaW8pOgorCSogZXh0L2ZhYWMvZ3N0ZmFhYy5jOiAoZ3N0X2ZhYWNfY2hhaW4pOgorCSogZXh0L2ZhYWQvZ3N0ZmFhZC5jOiAoZ3N0X2ZhYWRfY2hhaW4pOgorCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdkZWMuYzogKGdzdF9mZm1wZWdkZWNfY2hhaW4pOgorCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdkZW11eC5jOiAoZ3N0X2ZmbXBlZ2RlbXV4X2xvb3ApOgorCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdtdXguYzogKGdzdF9mZm1wZWdtdXhfbG9vcCk6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY2RlY19lcnJvcl9jYWxsYmFjayksCisJKGdzdF9mbGFjZGVjX2xvb3ApOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOiAoZ3N0X2ZsYWNlbmNfY2hhaW4pOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOiAoZ3N0X2ZsYWNfdGFnX2NoYWluKToKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOiAoZ3N0X2dka19waXhidWZfY2hhaW4pOgorCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzc2luay5jOiAoZ3N0X2dub21ldmZzc2lua19vcGVuX2ZpbGUpLAorCShnc3RfZ25vbWV2ZnNzaW5rX2Nsb3NlX2ZpbGUpOgorCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzc3JjLmM6IChhdWRpb2Nhc3RfaW5pdCksCisJKGdzdF9nbm9tZXZmc3NyY19vcGVuX2ZpbGUpOgorCSogZXh0L2l2b3JiaXMvdm9yYmlzZmlsZS5jOiAoZ3N0X2l2b3JiaXNmaWxlX2xvb3ApOgorCSogZXh0L2xhbWUvZ3N0bGFtZS5jOiAoZ3N0X2xhbWVfc2lua19saW5rKSwgKGdzdF9sYW1lX2NoYWluKToKKwkqIGV4dC9sY3MvZ3N0Y29sb3JzcGFjZS5jOiAoZ3N0X2NvbG9yc3BhY2Vfc3JjY29ubmVjdF9mdW5jKToKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChnc3RfaWQzX3RhZ19oYW5kbGVfZXZlbnQpLAorCShnc3RfaWQzX3RhZ19kb190eXBlZmluZCksIChnc3RfaWQzX3RhZ19jaGFpbik6CisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9jaGFpbik6CisJKiBleHQvbWlrbW9kL2dzdG1pa21vZC5jOiAoZ3N0X21pa21vZF9sb29wKToKKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5jOgorCSogZXh0L21wZWcyZW5jL2dzdG1wZWcyZW5jLmNjOgorCSogZXh0L21wbGV4L2dzdG1wbGV4LmNjOgorCSogZXh0L21wbGV4L2dzdG1wbGV4aWJpdHN0cmVhbS5jYzoKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfZGVtdXhfY2hhaW4pLAorCShnc3Rfb2dnX2RlbXV4X3B1c2gpOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvc2RsL3NkbHZpZGVvc2luay5jOiAoZ3N0X3NkbHZpZGVvc2lua19sb2NrKSwKKwkoZ3N0X3NkbHZpZGVvc2lua19pbml0c2RsKSwgKGdzdF9zZGx2aWRlb3NpbmtfY3JlYXRlKToKKwkqIGV4dC9zbmRmaWxlL2dzdHNmLmM6IChnc3Rfc2Zfb3Blbl9maWxlKSwgKGdzdF9zZl9jbG9zZV9maWxlKSwKKwkoZ3N0X3NmX2xvb3ApOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6IChnc3Rfc3BlZXhlbmNfY2hhaW4pOgorCSogZXh0L3N3ZmRlYy9nc3Rzd2ZkZWMuYzogKGdzdF9zd2ZkZWNfbG9vcCk6CisJKiBleHQvdGFya2luL2dzdHRhcmtpbmRlYy5jOiAoZ3N0X3RhcmtpbmRlY19jaGFpbik6CisJKiBleHQvdGFya2luL2dzdHRhcmtpbmVuYy5jOiAoZ3N0X3RhcmtpbmVuY19jaGFpbik6CisJKiBleHQvdm9yYmlzL3ZvcmJpc2VuYy5jOiAoZ3N0X3ZvcmJpc2VuY19jaGFpbik6CisJKiBleHQvdm9yYmlzL3ZvcmJpc2ZpbGUuYzogKGdzdF92b3JiaXNmaWxlX2xvb3ApOgorCSogZXh0L3h2aWQvZ3N0eHZpZGRlYy5jOiAoZ3N0X3h2aWRkZWNfc2V0dXApLCAoZ3N0X3h2aWRkZWNfY2hhaW4pOgorCSogZXh0L3h2aWQvZ3N0eHZpZGVuYy5jOiAoZ3N0X3h2aWRlbmNfc2V0dXApLCAoZ3N0X3h2aWRlbmNfY2hhaW4pOgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6IChnc3RfcmlmZl9wZWVrX2hlYWQpLAorCShnc3RfcmlmZl9yZWFkX2VsZW1lbnRfZGF0YSksIChnc3RfcmlmZl9yZWFkX3NlZWspLAorCShnc3RfcmlmZl9wZWVrX2xpc3QpLCAoZ3N0X3JpZmZfcmVhZF9saXN0KSwgKGdzdF9yaWZmX3JlYWRfaGVhZGVyKToKKwkqIGdzdC9hZGRlci9nc3RhZGRlci5jOiAoZ3N0X2FkZGVyX2xvb3ApOgorCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6IChnc3RfYXNmX2RlbXV4X3Byb2Nlc3Nfc2VnbWVudCksCisJKGdzdF9hc2ZfZGVtdXhfcHJvY2Vzc19zdHJlYW0pLCAoZ3N0X2FzZl9kZW11eF9nZXRfc3RyZWFtKToKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luaXQpLAorCShnc3RfYXZpX2RlbXV4X2FkZF9zdHJlYW0pLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyKToKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpbXV4X3N0b3BfZmlsZSk6CisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOiAoZ3N0X2ZseGRlY19sb29wKToKKwkqIGdzdC9nb29tL2dzdGdvb20uYzogKGdzdF9nb29tX2NoYWluKToKKwkqIGdzdC9pZDMvZ3N0aWQzdHlwZXMuYzogKGdzdF9pZDN0eXBlc19sb29wKToKKwkqIGdzdC9pbnRmbG9hdC9mbG9hdDIyaW50LmM6IChnc3RfZmxvYXQyXzJfaW50X2NoYWluKToKKwkqIGdzdC9pbnRmbG9hdC9nc3RmbG9hdDJpbnQuYzogKGdzdF9mbG9hdDJpbnRfbG9vcCk6CisJKiBnc3QvaW50ZmxvYXQvZ3N0aW50MmZsb2F0LmM6IChnc3RfaW50MmZsb2F0X2NoYWluX2dpbnQxNik6CisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChnc3RfZWJtbF9yZWFkX2VsZW1lbnRfaWQpLAorCShnc3RfZWJtbF9yZWFkX2VsZW1lbnRfbGVuZ3RoKSwgKGdzdF9lYm1sX3JlYWRfZWxlbWVudF9kYXRhKSwKKwkoZ3N0X2VibWxfcmVhZF9zZWVrKSwgKGdzdF9lYm1sX3JlYWRfdWludCksIChnc3RfZWJtbF9yZWFkX3NpbnQpLAorCShnc3RfZWJtbF9yZWFkX2Zsb2F0KSwgKGdzdF9lYm1sX3JlYWRfaGVhZGVyKToKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X2luaXRfc3RyZWFtKSwKKwkoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2Jsb2NrZ3JvdXApOgorCSogZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYzogKGdzdF9tb25vc2NvcGVfY2hhaW4pOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ3BhcnNlLmM6IChnc3RfbXBlZ19wYXJzZV9sb29wKToKKwkqIGdzdC9vbmV0b24vZ3N0b25ldG9uLmM6IChnc3Rfb25ldG9uX2NoYWluKToKKwkqIGdzdC9zaWxlbmNlL2dzdHNpbGVuY2UuYzogKGdzdF9zaWxlbmNlX2dldCk6CisJKiBnc3Qvc2luZS9nc3RzaW5lc3JjLmM6IChnc3Rfc2luZXNyY19nZXQpOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6IChnc3Rfc21wdGVfbG9vcCk6CisJKiBnc3Qvc3BlZWQvZ3N0c3BlZWQuYzogKHNwZWVkX2xvb3ApOgorCSogZ3N0L3RhZ3MvZ3N0dm9yYmlzdGFnLmM6IChnc3Rfdm9yYmlzX3RhZ19jaGFpbik6CisJKiBnc3QvdmlkZW90ZXN0c3JjL2dzdHZpZGVvdGVzdHNyYy5jOiAoZ3N0X3ZpZGVvdGVzdHNyY19nZXQpOgorCSogZ3N0L3ZvbGVudi9nc3R2b2xlbnYuYzogKGdzdF92b2xlbnZfY2hhaW4pOgorCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzogKGdzdF93YXZlbmNfY2hhaW4pOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcGFyc2VfZm10KSwKKwkoZ3N0X3dhdnBhcnNlX2xvb3ApOgorCSogc3lzL2R4cjMvZHhyM2F1ZGlvc2luay5jOiAoZHhyM2F1ZGlvc2lua19vcGVuKSwKKwkoZHhyM2F1ZGlvc2lua19zZXRfbW9kZV9wY20pLCAoZHhyM2F1ZGlvc2lua19zZXRfbW9kZV9hYzMpLAorCShkeHIzYXVkaW9zaW5rX2Nsb3NlKToKKwkqIHN5cy9keHIzL2R4cjNzcHVzaW5rLmM6IChkeHIzc3B1c2lua19vcGVuKSwgKGR4cjNzcHVzaW5rX2Nsb3NlKToKKwkqIHN5cy9keHIzL2R4cjN2aWRlb3NpbmsuYzogKGR4cjN2aWRlb3Npbmtfb3BlbiksCisJKGR4cjN2aWRlb3NpbmtfY2xvc2UpLCAoZHhyM3ZpZGVvc2lua193cml0ZV9kYXRhKToKKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5jOiAoZ3N0X29zc2VsZW1lbnRfb3Blbl9hdWRpbyk6CisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3NzaW5rX2NoYWluKToKKwkqIHN5cy9vc3MvZ3N0b3Nzc3JjLmM6IChnc3Rfb3Nzc3JjX2dldCk6CisJKiBzeXMvdjRsL2dzdHY0bG1qcGVnc2luay5jOiAoZ3N0X3Y0bG1qcGVnc2lua19jaGFpbik6CisJKiBzeXMvdjRsL2dzdHY0bG1qcGVnc3JjLmM6IChnc3RfdjRsbWpwZWdzcmNfYnVmZmVyX2ZyZWUpOgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzogKGdzdF92NGxzcmNfYnVmZmVyX2ZyZWUpOgorCSogc3lzL3Y0bC92NGwtb3ZlcmxheV9jYWxscy5jOiAoZ3N0X3Y0bF9zZXRfb3ZlcmxheSksCisJKGdzdF92NGxfc2V0X3dpbmRvdyksIChnc3RfdjRsX2VuYWJsZV9vdmVybGF5KToKKwkqIHN5cy92NGwvdjRsX2NhbGxzLmM6IChnc3RfdjRsX2dldF9jYXBhYmlsaXRpZXMpLCAoZ3N0X3Y0bF9vcGVuKSwKKwkoZ3N0X3Y0bF9zZXRfY2hhbl9ub3JtKSwgKGdzdF92NGxfZ2V0X3NpZ25hbCksCisJKGdzdF92NGxfZ2V0X2ZyZXF1ZW5jeSksIChnc3RfdjRsX3NldF9mcmVxdWVuY3kpLAorCShnc3RfdjRsX2dldF9waWN0dXJlKSwgKGdzdF92NGxfc2V0X3BpY3R1cmUpLCAoZ3N0X3Y0bF9nZXRfYXVkaW8pLAorCShnc3RfdjRsX3NldF9hdWRpbyk6CisJKiBzeXMvdjRsL3Y0bF9jYWxscy5oOgorCSogc3lzL3Y0bC92NGxtanBlZ3NpbmtfY2FsbHMuYzogKGdzdF92NGxtanBlZ3Npbmtfc3luY190aHJlYWQpLAorCShnc3RfdjRsbWpwZWdzaW5rX3F1ZXVlX2ZyYW1lKSwgKGdzdF92NGxtanBlZ3Npbmtfc2V0X3BsYXliYWNrKSwKKwkoZ3N0X3Y0bG1qcGVnc2lua19wbGF5YmFja19pbml0KSwKKwkoZ3N0X3Y0bG1qcGVnc2lua19wbGF5YmFja19zdGFydCk6CisJKiBzeXMvdjRsL3Y0bG1qcGVnc3JjX2NhbGxzLmM6IChnc3RfdjRsbWpwZWdzcmNfcXVldWVfZnJhbWUpOgorCSogc3lzL3Y0bC92NGxzcmNfY2FsbHMuYzogKGdzdF92NGxzcmNfcXVldWVfZnJhbWUpLAorCShnc3RfdjRsc3JjX3N5bmNfZnJhbWUpLCAoZ3N0X3Y0bHNyY19jYXB0dXJlX2luaXQpLAorCShnc3RfdjRsc3JjX3JlcXVldWVfZnJhbWUpLCAoZ3N0X3Y0bHNyY190cnlfcGFsZXR0ZSk6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19nZXQpOgorCSogc3lzL3Y0bDIvdjRsMi1vdmVybGF5X2NhbGxzLmM6IChnc3RfdjRsMl9zZXRfZGlzcGxheSksCisJKGdzdF92NGwyX3NldF93aW5kb3cpLCAoZ3N0X3Y0bDJfZW5hYmxlX292ZXJsYXkpOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOiAoZ3N0X3Y0bDJfZ2V0X2NhcGFiaWxpdGllcyksCisJKGdzdF92NGwyX2ZpbGxfbGlzdHMpLCAoZ3N0X3Y0bDJfb3BlbiksIChnc3RfdjRsMl9nZXRfbm9ybSksCisJKGdzdF92NGwyX3NldF9ub3JtKSwgKGdzdF92NGwyX2dldF9pbnB1dCksIChnc3RfdjRsMl9zZXRfaW5wdXQpLAorCShnc3RfdjRsMl9nZXRfb3V0cHV0KSwgKGdzdF92NGwyX3NldF9vdXRwdXQpLAorCShnc3RfdjRsMl9nZXRfZnJlcXVlbmN5KSwgKGdzdF92NGwyX3NldF9mcmVxdWVuY3kpLAorCShnc3RfdjRsMl9zaWduYWxfc3RyZW5ndGgpLCAoZ3N0X3Y0bDJfZ2V0X2F0dHJpYnV0ZSksCisJKGdzdF92NGwyX3NldF9hdHRyaWJ1dGUpOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5oOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfZmlsbF9mb3JtYXRfbGlzdCksCisJKGdzdF92NGwyc3JjX3F1ZXVlX2ZyYW1lKSwgKGdzdF92NGwyc3JjX2dyYWJfZnJhbWUpLAorCShnc3RfdjRsMnNyY19nZXRfY2FwdHVyZSksIChnc3RfdjRsMnNyY19zZXRfY2FwdHVyZSksCisJKGdzdF92NGwyc3JjX2NhcHR1cmVfaW5pdCksIChnc3RfdjRsMnNyY19jYXB0dXJlX3N0YXJ0KSwKKwkoZ3N0X3Y0bDJzcmNfY2FwdHVyZV9zdG9wKToKKwkqIHN5cy92Y2QvdmNkc3JjLmM6ICh2Y2RzcmNfb3Blbl9maWxlKToKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KSwKKwkoZ3N0X3hpbWFnZXNpbmtfY2hhaW4pOgorCSogc3lzL3h2aWRlby94dmlkZW9zaW5rLmM6IChnc3RfeHZpZGVvc2lua19idWZmZXJfbmV3KSwKKwkoZ3N0X3h2aWRlb3Npbmtfc2lua2Nvbm5lY3QpLCAoZ3N0X3h2aWRlb3NpbmtfY2hhaW4pLAorCShnc3RfeHZpZGVvc2lua194d2luZG93X25ldyk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3hjb250ZXh0X2dldCksCisJKGdzdF94dmltYWdlc2lua19jaGFpbik6CisKKzIwMDQtMDItMDIgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC92b2x1bWUvZ3N0dm9sdW1lLmM6IChnc3Rfdm9sdW1lX3NldF92b2x1bWUpLAorCShnc3Rfdm9sdW1lX2dldF92b2x1bWUpLCAodm9sdW1lX2NsYXNzX2luaXQpLCAodm9sdW1lX2luaXQpLAorCSh2b2x1bWVfY2hhaW5faW50MTYpLCAodm9sdW1lX3VwZGF0ZV92b2x1bWUpOgorCSogZ3N0L3ZvbHVtZS9nc3R2b2x1bWUuaDoKKyAgICAgICAgICBtYWtlIGNvZGUgbW9yZSByZWFkYWJsZSBieSByZW1vdmluZyBtYWdpYyBudW1iZXJzCisgICAgICAgICAgbWFrZSBtaXhlciBpbnRlcmZhY2UgZXhwb3J0IDAtMTAwIHJhbmdlCisgICAgICAgICAgbWFrZSBpdCBpbnRlcm5hbGx5IG1hcCB0byAwLjAtMS4wIHJhbmdlIHNvIHVzZXJzIGRvbid0IGRpc3RvcnQKKyAgICAgICAgICBvdXRwdXQgYnkgcHV0dGluZyB0aGUgc2xpZGVycyBhdCBmdWxsIHZvbHVtZQorCisyMDA0LTAyLTAyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5LmM6IChnc3RfcGxheV90aWNrX2NhbGxiYWNrKSwKKwkoZ3N0X3BsYXlfc3RhdGVfY2hhbmdlKSwgKGdzdF9wbGF5X3NlZWtfdG9fdGltZSk6CisgICAgICAgIGJsb2NrIHRoZSB0aWNrIGNhbGxiYWNrIGZvciAwLjUgc2VjcyBhZnRlciBkb2luZyBhIHNlZWsKKworMjAwNC0wMi0wMiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5jOiAoZ3N0X3BsYXlfbmV3KToKKyAgICAgICAgICBjaGVjayBmb3IgR0Vycm9yCisKKzIwMDQtMDItMDEgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5jOiAoZ3N0X3BsYXlfc2Vla190b190aW1lKSwKKwkoZ3N0X3BsYXlfbmV3KTogQWNjZXB0aW5nIE5VTEwgR0Vycm9yLCBibG9ja2luZyB0aW1lIHRpY2sgd2hpbGUgc2Vla2luZy4KKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfc2lua19saW5rKSwKKwkoZ3N0X3hpbWFnZXNpbmtfY2hhaW4pLCAoZ3N0X3hpbWFnZXNpbmtfaW5pdCk6IHMvc2lua2Nvbm5lY3Qvc2lua19saW5rCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3NpbmtfbGluayksCisJKGdzdF94dmltYWdlc2lua19jaGFpbiksIChnc3RfeHZpbWFnZXNpbmtfaW5pdCk6IHMvc2lua2Nvbm5lY3Qvc2lua19saW5rCisKKzIwMDQtMDItMDEgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC92b3JiaXMvdm9yYmlzZGVjLmM6ICh2b3JiaXNfZGVjX2V2ZW50KToKKyAgICAgICAgICBjaGVjayBmb3IgYSBmdW5jdGlvbiBhZGRlZCBpbiB2b3JiaXMgMS4xCisKKzIwMDQtMDEtMzEgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfY2hhbmdlX3N0YXRlKSwgKGdzdF9hbHNhX3N0YXJ0KSwKKwkoZ3N0X2Fsc2FfZHJhaW5fYXVkaW8pLCAoZ3N0X2Fsc2Ffc3RvcF9hdWRpbyk6CisJICByZWFsbHkgc3RhcnQvc3RvcCBjbG9jayBvbmx5IG9uIFBMQVlJTkcgPD0+IFBBVVNFRAorCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuYzogKGdzdF9hbHNhX3NpbmtfbG9vcCk6CisJICByZW1vdmUgXG4gZnJvbSBkZWJ1Z2dpbmcgbGluZXMKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfZGVtdXhfY2hhaW4pOgorCSAgbWFrZSBpdCB3b3JrIHdoZW4gc2Vla2luZyBkb2VzIG5vdAorCSogZXh0L3ZvcmJpcy92b3JiaXNkZWMuYzogKHZvcmJpc19kZWNfZXZlbnQpOgorCSAgcmVzZXQgb24gRElTQ09OVAorCisyMDA0LTAxLTMxICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX2NoYW5nZV9zdGF0ZSksIChnc3RfYWxzYV9zdGFydCk6CisJICBzdGFydCBjbG9jayBvbiBQQVVTRUQ9PlBMQVlJTkcsIG5vdCBsYXRlcgorCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuYzogKGdzdF9hbHNhX3NpbmtfY2hlY2tfZXZlbnQpOgorCSAgZXh0cmFjdCBjb3JyZWN0IHRpbWUgZm9yIGRpZmZlcmVudCBkaXNjb250IGZvcm1hdHMKKwkoZ3N0X2Fsc2Ffc2lua19nZXRfdGltZSk6CisJICBkb24ndCBzZWdmYXVsdCB3aGVuIG5vIGZvcm1hdCBpcyBuZWdvdGlhdGVkIHlldCwganVzdCByZXR1cm4gMAorCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9zcmNfZXZlbnQpLAorCShnc3Rfb2dnX2RlbXV4X2hhbmRsZV9ldmVudCksIChnc3Rfb2dnX2RlbXV4X3B1c2gpLAorCShnc3Rfb2dnX3BhZF9wdXNoKToKKwkgIGhhbmRsZSBmbHVzaCBhbmQgZGlzY29udCBldmVudHMgY29ycmVjdGx5CisJKiBleHQvdm9yYmlzL3ZvcmJpc2RlYy5jOiAodm9yYmlzX2RlY19ldmVudCksICh2b3JiaXNfZGVjX2NoYWluKToKKwkgIGhhbmRsZSBkaXNjb250IGV2ZW50cyBjb3JyZWN0bHkKKworMjAwNC0wMS0zMSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5jOiAoZ3N0X3BsYXlfZXJyb3JfcXVhcmspLAorCShnc3RfcGxheV9lcnJvcl9jcmVhdGUpLCAoZ3N0X3BsYXlfZXJyb3JfcGx1Z2luKSwKKwkoZ3N0X3BsYXlfcGlwZWxpbmVfc2V0dXApLCAoZ3N0X3BsYXlfaW5pdCksIChnc3RfcGxheV9uZXcpOgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5oOgorICAgICAgICAgIGFkZCBlcnJvciBoYW5kbGluZyBkdXJpbmcgY3JlYXRpb24KKwkqIGV4YW1wbGVzL2dzdHBsYXkvcGxheWVyLmM6IChtYWluKToKKyAgICAgICAgICB1c2UgbmV3IGdzdF9wbGF5X25ldworCisKKzIwMDQtMDEtMzEgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzogKHRoZW9yYV9kZWNfY2hhaW4pOgorCSAgbWFrZSBjb21tZW50cyB3b3JrCisJKiBleHQvdm9yYmlzL3ZvcmJpc2RlYy5jOiAodm9yYmlzX2RlY19zcmNfcXVlcnkpLAorCSh2b3JiaXNfZGVjX3NyY19ldmVudCksICh2b3JiaXNfZGVjX2NoYWluKToKKwkgIGFkZCBlbmNvZGVyIHRhZywgZml4IHRhZyByZWFkaW5nIHRvIGJlIG1vcmUgZXJyb3IgdG9sZXJhbnQsIGNoYW5nZQorCSAgQklUUkFURSB0byBOT01JTkFMX0JJVFJBVEUsIGFkZCBkZWJ1Z2dpbmcsIGRvbid0IHVucmVmIGV2ZW50cyBhZnRlcgorCSAgZ3N0X3BhZF9ldmVudF9kZWZhdWx0LgorCSogZ3N0L3RhZ3MvZ3N0dm9yYmlzdGFnLmM6CisJKGdzdF90YWdfbGlzdF9mcm9tX3ZvcmJpc2NvbW1lbnRfYnVmZmVyKToKKwkgIHVuZGVmaW5lIGZ1bmN0aW9uIHNwZWNpZmljIGRlZmluZSBhdCBlbmQgb2YgZnVuY3Rpb24KKworMjAwNC0wMS0zMSAgSmVyZW15IFNpbW9uICA8amVzaW1vbkBsaWJlcnR5c3VyZi5mcj4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhYy5jOiAocGx1Z2luX2luaXQpOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNkZWNfY2xhc3NfaW5pdCk6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmg6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmg6CisJICBGaXggdHlwb3MKKworMjAwNC0wMS0zMCAgRGF2aWQgSS4gTGVobiAgPGRsZWhuQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZXhhbXBsZXMvZ3N0cGxheS9wbGF5ZXIuYzogcy9nc3RwbGF5LmgvcGxheS5oLworCisyMDA0LTAxLTMwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QtbGlicy9nc3QvcGxheS9NYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2dzdC9wbGF5L2dzdHBsYXkuYzoKKwkqIGdzdC1saWJzL2dzdC9wbGF5L2dzdHBsYXkuaDoKKwkqIGdzdC1saWJzL2dzdC9wbGF5L3BsYXkuYzoKKyAgICAgICAgICBtb3JlIHN1cmdlcnksIG9wZXJhdGlvbiBjb21wbGV0ZQorCisyMDA0LTAxLTMwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5Lm9sZC5jOgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5vbGQuaDoKKyAgICAgICAgICBhZnRlciBDVlMgc3VyZ2VyeSBieSBtb3ZpbmcsIHJlbW92ZQorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheXBpcGVsaW5lcy5jOgorICAgICAgICAgIHJlbW92ZQorCisJKiBnc3QvaW50ZmxvYXQvZmxvYXQyMmludC5jOiAoZ3N0X2Zsb2F0Ml8yX2ludF9jaGFpbik6CisgICAgICAgICAgYWRkIG5lZ290aWF0aW9uIGVycm9yCisKKzIwMDQtMDEtMzAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfZGVtdXhfc3JjX2V2ZW50KSwKKwkoZ3N0X29nZ19kZW11eF9wdXNoKToKKyAgICAgICAgICBhZGQgc29tZSBzZWVraW5nIGRlYnVnIGluZm8KKyAgICAgICAgICBzZW5kIGEgZmx1c2ggd2hlbiBzZWVraW5nCisKKzIwMDQtMDEtMzAgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogY29uZmlndXJlLmFjOgorCSAgdXNlIEFDX0NfSU5MSU5FCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvdGhlb3JhL01ha2VmaWxlLmFtOgorCSogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzoKKwkgIGFkZCB0aGVvcmEgdmlkZW8gZGVjb2Rlci4gRG9lcyBqdXN0IGRvIHNpbXBsZSBkZWNvZGluZyBmb3Igbm93IGFuZAorCSAgaGFzIGJlZW4gdGVzdGVkIGFnYWluc3QgVGhlb3JhIGN2cyBvbmx5LiBJdCBvbmx5IHdvcmtzIHdoZW4gdGhlb3JhCisJICBpcyBjb21waWxlZCB3aXRoIC0tZW5hYmxlLXN0YXRpYy4KKwkqIGV4dC92b3JiaXMvdm9yYmlzZGVjLmM6ICh2b3JiaXNfZGVjX2V2ZW50KToKKwkgIGFsd2F5cyByZXNldCBwYWNrZXRubyBvbiBESVNDT05UCisKKzIwMDQtMDEtMzAgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdkZW11eC5jOiAoZ3N0X21wZWdfZGVtdXhfcGFyc2Vfc3lzaGVhZCk6CisJICBGaXggYXVkaW8uCisKKzIwMDQtMDEtMzAgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9tcGVnYXVkaW9wYXJzZS9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCShtcDNfdHlwZV9mcmFtZV9sZW5ndGhfZnJvbV9oZWFkZXIpOgorCSAgRml4IGhlYWRlciBwYXJzaW5nIC0gc3RvbGVuIGZyb20gZmZtcGVnICh0aGFuayB5b3UhIDopICkuCisKKzIwMDQtMDEtMzAgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfaW5pdCk6CisJICBTaW5jZSB3ZSBoYXZlIHN0YXRpYyBwYWQgdGVtcGxhdGUgY2Fwcywgd2UgZG9uJ3QgbmVlZCB0byBuZWdvdGlhdGU7CisJICBlaXRoZXIgdGhlIGNvcmUgZXJyb3JzIG91dCBvciB3ZSBrbm93IHRoZSBmb3JtYXQuCisKKzIwMDQtMDEtMzAgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5jOiAoZ3N0X3JpZmZfcGVla19oZWFkKSwKKwkoZ3N0X3JpZmZfcmVhZF9zZWVrKToKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogKGdzdF9lYm1sX3JlYWRfZWxlbWVudF9pZCksCisJKGdzdF9lYm1sX3JlYWRfc2Vlayk6CisJICBGaXggZXZlbnQgaGFuZGxpbmcuCisKKzIwMDQtMDEtMzAgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdjb2RlY21hcC5jOiAoZ3N0X2ZmbXBlZ19jb2RlY2lkX3RvX2NhcHMpOgorCSAgcmVtb3ZlZSB2aWRlby94LXRoZW9yYSBmcm9tIHZwMyBkZWNvZGVyLCBpdCBkb2Vzbid0IGhhbmRsZSByYXcKKwkgIHRoZW9yYSBzdHJlYW1zCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2RlbXV4X2luaXQpOgorCSAgZml4IGJ1ZyB3aXRoIGZpbmFsaXppbmcgZWxlbWVudCB0aGF0IG5ldmVyIHdlbnQgdG8gUEFVU0VECisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2RlbXV4X3NyY19xdWVyeSk6CisJICBsZW5ndGggYW5kIHBvc2l0aW9uIHF1ZXJpZXMgd2VyZSBzd2FwcGVkCisJKiBleHQvdm9yYmlzL3ZvcmJpc2RlYy5jOiAoZ3N0X3ZvcmJpc19kZWNfaW5pdCksCisJKHZvcmJpc19kZWNfZnJvbV9ncmFudWxlcG9zKSwgKHZvcmJpc19kZWNfc3JjX3F1ZXJ5KSwKKwkodm9yYmlzX2RlY19zcmNfZXZlbnQpOgorCSAgaW1wbGVtZW50IHF1ZXJ5aW5nIHRpbWUgYW5kIGJ5dGVzCisKKzIwMDQtMDEtMzAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKyAgICAgICAgKiBqdXN0IGFib3V0IGV2ZXJ5IHNvdXJjZSBmaWxlOgorICAgICAgICAgIGdzdF9lbGVtZW50X2Vycm9yIC0+IEdTVF9FTEVNRU5UX0VSUk9SCisKKzIwMDQtMDEtMjkgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzc3JjLmM6IChnc3RfZ25vbWV2ZnNzcmNfZ2V0KTogRml4aW5nIHNlZWtpbmcKKwllbWl0aW5nIEZMVVNIIGFuZCBldmVuIGJlZm9yZSBESVNDT05ULgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvZ3N0cGxheS5jOiAoZ3N0X3BsYXlfc2Vla190b190aW1lKTogRml4IHNlZWtpbmcgdG8KKwlnZXQgdGhlIGJlc3QgaW5zdGFudCBzZWVraW5nIGFzIHBvc3NpYmxlIHlheSEKKworMjAwNC0wMS0yOSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L21wZWcxdmlkZW9wYXJzZS9nc3RtcDF2aWRlb3BhcnNlLmM6CisJKGdzdF9tcDF2aWRlb3BhcnNlX3JlYWxfY2hhaW4pOgorCSAgQ29tbWl0dGVkIHdyb25nIHZlcnNpb24gbGFzdCB3ZWVrLi4uIEdyci4uLiBEaWRuJ3Qgbm90aWNlIHVudGlsIG5vdy4KKworMjAwNC0wMS0yOSAgSnVsaWVuIE1PVVRURSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfeHdpbmRvd19uZXcpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua194d2luZG93X25ldyk6IEVtaXQgdGhlCisJaGF2ZV94d2luZG93X2lkIHNpZ25hbCBpbiB4d2luZG93X2NyZWF0ZS4KKworMjAwNC0wMS0yOSAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6CisJICBsb3RzIG9mIGNoYW5nZXMgLSBtYWlubHkgc3VwcG9ydCBmb3IgY2hhaW5lZCBiaXRzdHJlYW1zLCBzZWVraW5nLAorCSAgcXVlcnlpbmcgYW5kIGJ1Z2ZpeGVzIG9mIGNvdXJzZQorCSogZXh0L3ZvcmJpcy9NYWtlZmlsZS5hbToKKwkqIGV4dC92b3JiaXMvdm9yYmlzZGVjLmM6CisJKiBleHQvdm9yYmlzL3ZvcmJpc2RlYy5oOgorCSAgYWRkIHZvcmJpc2RlYyByYXcgdm9yYmlzIGRlY29kZXIKKwkqIGV4dC92b3JiaXMvdm9yYmlzLmM6IChwbHVnaW5faW5pdCk6CisJICByZWdpc3RlciB2b3JiaXNkZWMgYXMgUFJJTUFSWSwgdm9yYmlzZmlsZSBhcyBTRUNPTkRBUlkKKwkqIGdzdC9pbnRmbG9hdC9NYWtlZmlsZS5hbToKKwkqIGdzdC9pbnRmbG9hdC9mbG9hdDIyaW50LmM6CisJKiBnc3QvaW50ZmxvYXQvZmxvYXQyMmludC5oOgorCSogZ3N0L2ludGZsb2F0L2dzdGludGZsb2F0Y29udmVydC5jOiAocGx1Z2luX2luaXQpOgorCSAgYWRkIGZsb2F0MmludG5ldyBwbHVnaW4uIEl0IGNvbnZlcnRzIG11bHRpY2hhbm5lbCBpbnRlcmxlYXZlZCBmbG9hdCB0bworCSAgbXVsdGljaGFubmVsIGludGVybGVhdmVkIGludC4gVGhlIG5hbWUgc2hvdWxkIHByb2JhYmx5IGJlIGNoYW5nZWQuCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKHRoZW9yYV90eXBlX2ZpbmQpLAorCShwbHVnaW5faW5pdCk6CisJICBhZGQgdHlwZWZpbmRpbmcgZm9yIHJhdyB0aGVvcmEgdmlkZW8gc28gb2dnZGVtdXggY2FuIGRldGVjdCBpdC4KKworMjAwNC0wMS0yOCAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcGxheS9nc3RwbGF5LmM6IChnc3RfcGxheV9zZWVrX3RvX3RpbWUpOiBzZWVrIG9uIHZpZGVvCisJc2luayBlbGVtZW50IGZpcnN0LgorCSogZ3N0L3ZpZGVvc2NhbGUvZ3N0dmlkZW9zY2FsZS5jOgorCShnc3RfdmlkZW9zY2FsZV9oYW5kbGVfc3JjX2V2ZW50KTogRml4aW5nIHNyYyBldmVudCBoYW5kbGVyLgorCisyMDA0LTAxLTI4ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvdjRsL2dzdHY0bHNyYy5jOiAoZ3N0X3Y0bHNyY19jbGFzc19pbml0KSwgKGdzdF92NGxzcmNfaW5pdCksCisJKGdzdF92NGxzcmNfb3BlbiksIChnc3RfdjRsc3JjX2Nsb3NlKSwKKwkoZ3N0X3Y0bHNyY19wYWxldHRlX3RvX2NhcHMpLCAoZ3N0X3Y0bHNyY19zcmNjb25uZWN0KSwKKwkoZ3N0X3Y0bHNyY19nZXRjYXBzKSwgKGdzdF92NGxzcmNfc2V0X2Nsb2NrKToKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmg6CisJKiBzeXMvdjRsL3Y0bHNyY19jYWxscy5jOiAoZ3N0X3Y0bHNyY19jYXB0dXJlX3N0YXJ0KSwKKwkoZ3N0X3Y0bHNyY19ncmFiX2ZyYW1lKSwgKGdzdF92NGxzcmNfY2FwdHVyZV9zdG9wKToKKwkgIEltcGxlbWVudCByZXNpemluZy4uLiBIYWNrLiBCdXQgdGhhdCdzIHdoeSB2NGwgaXMgYjBya2VkLi4uCisKKzIwMDQtMDEtMjggIEp1bGllbiBNT1VUVEUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2NoZWNrX3hzaG1fY2FsbHMpLAorCShnc3RfeGltYWdlc2lua194aW1hZ2VfbmV3KSwgKGdzdF94aW1hZ2VzaW5rX3hpbWFnZV9kZXN0cm95KSwKKwkoZ3N0X3hpbWFnZXNpbmtfeGltYWdlX3B1dCksIChnc3RfeGltYWdlc2lua194d2luZG93X25ldyksCisJKGdzdF94aW1hZ2VzaW5rX3h3aW5kb3dfZGVzdHJveSk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2NoZWNrX3hzaG1fY2FsbHMpLAorCShnc3RfeHZpbWFnZXNpbmtfeHZpbWFnZV9uZXcpLCAoZ3N0X3h2aW1hZ2VzaW5rX3h2aW1hZ2VfZGVzdHJveSksCisJKGdzdF94dmltYWdlc2lua194d2luZG93X25ldyksIChnc3RfeHZpbWFnZXNpbmtfeHdpbmRvd19kZXN0cm95KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3h3aW5kb3dfcmVzaXplKSwgKGdzdF94dmltYWdlc2lua19nZXRfeHZfc3VwcG9ydCksCisJKGdzdF94dmltYWdlc2lua194Y29udGV4dF9nZXQpOiBSZW1vdmluZyBzb21lIHVzZWxlc3MgZGVidWdzIG1lc3NhZ2VzLAorCWNvcnJlY3RseSBjbGVhbmluZyB0aGUgaW1hZ2UgY3JlYXRlZCB0byBjaGVjayB4c2htIGNhbGxzIG9uIHN1Y2NlcywKKwlhZGRlZCBhIGxvdCBvZiBYU3luYyBjYWxscyBpbiBYMTEgZnVuY3Rpb25zLCBhbmQgZml4ZWQgYSBzZWdmYXVsdCB3aGVuCisJbm8gaW1hZ2UgZm9ybWF0IHdhcyBkZWZpbmVkIGJlZm9yZSBuZWdvdGlhdGlvbiBoYXBwZW5lZC4KKworMjAwNC0wMS0yOCAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9xdWVyeV9mdW5jKToKKwkgIHVzZSBnc3RfZWxlbWVudF9nZXRfdGltZSB0byBnZXQgY29ycmVjdCB0aW1lCisKKzIwMDQtMDEtMjggIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19oYW5kbGVfeGVycm9yKSwKKwkoZ3N0X3hpbWFnZXNpbmtfY2hlY2tfeHNobV9jYWxscyksIChnc3RfeGltYWdlc2lua194aW1hZ2VfZGVzdHJveSksCisJKGdzdF94aW1hZ2VzaW5rX3hjb250ZXh0X2dldCksIChnc3RfeGltYWdlc2lua19jbGFzc19pbml0KToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfaGFuZGxlX3hlcnJvciksCisJKGdzdF94dmltYWdlc2lua19jaGVja194c2htX2NhbGxzKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3h2aW1hZ2VfZGVzdHJveSksIChnc3RfeHZpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KTogT3VyCisJWCBwbHVnaW5zIGFyZSBub3cgYWJsZSB0byBkZXRlY3QgdGhhdCBYU2htIGNhbGxzIHdpbGwgZmFpbCBldmVuIGlmIHRoZQorCXNlcnZlciBjbGFpbXMgdGhhdCBpdCBoYXMgWFNobSBzdXBwb3J0IChyZW1vdGUgZGlzcGxheXMgbW9zdCBvZiB0aGUKKwl0aW1lKS4gV2UgdGhlbiBsb2cgdGhlIGVycm9yIGFzIGEgR1NUX0RFQlVHIGFuZCBzZXQgdXNlX3NobSB0byBGQUxTRQorCXNvIHRoYXQgd2UgdXNlIG5vbiBYU2htIGZ1bmN0aW9ucy4gVGhpcyBmZWF0dXJlIGlzIGFsbW9zdCB1c2VsZXNzIGZvcgorCXh2aW1hZ2VzaW5rIGFzIFh2IGlzIG5vdCBzdXBwb3J0ZWQgb24gcmVtb3RlIGRpc3BsYXlzIGFueXdheSwgYnV0CisJaXQgbWlnaHQgaGFwcGVuIHRoYW4gZXZlbiBvbiB0aGUgbG9jYWwgZGlzcGxheSBYU2htIGNhbGxzIGZhaWwuCisKKzIwMDQtMDEtMjcgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2VzZC9lc2RzaW5rLmM6IChnc3RfZXNkc2lua19jbGFzc19pbml0KSwgKGdzdF9lc2RzaW5rX2luaXQpLAorCShnc3RfZXNkc2lua19saW5rKSwgKGdzdF9lc2RzaW5rX2dldF90aW1lKSwgKGdzdF9lc2RzaW5rX2NoYWluKSwKKwkoZ3N0X2VzZHNpbmtfY2hhbmdlX3N0YXRlKTogIEZpeCBzeW5jIGlzc3VlcyBpbiBlc2RzaW5rLiAgQWxzbworCWNoYW5nZWQgZXNkc2luayB0byBvbmx5IHVzZSA0NDEwMCwxNiwyLCBzaW5jZSBlc2Qgc3Vja3MgYXQgcmF0ZQorCWNvbnZlcnNpb24gYW5kIGVzZHNpbmsgaGFzIGhhZCBkaWZmaWN1bHR5IG5lZ290aWF0aW5nLgorCisyMDA0LTAxLTI3ICBKdWxpZW4gTU9VVFRFIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3BsYXkvZ3N0cGxheS5jOiAoZ3N0X3BsYXlfdGlja19jYWxsYmFjayksCisJKGdzdF9wbGF5X3NlZWtfdG9fdGltZSk6IEZpeGluZyB0aGUgd2F5IHRvIGdldCBjdXJyZW50IHBvc2l0aW9uLgorCisyMDA0LTAxLTI3ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiAoZ3N0X29zc3Npbmtfc2lua19xdWVyeSk6CisJICB1c2UgZ3N0X2VsZW1lbnRfZ2V0X3RpbWUgdG8gZ2V0IGNvcnJlY3QgdGltZQorCisyMDA0LTAxLTI3ICBKdWxpZW4gTU9VVFRFIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3BsYXkvZ3N0cGxheS5jOiAoZ3N0X3BsYXlfc2V0X2xvY2F0aW9uKTogVGhlIGVhc2llc3QKKwlmaXggZXZlci4uLiBJbnZlcnRpbmcgMiBsaW5lcyBvZiBjb2RlIG1ha2Ugc3BpZGVyIGF1dG9wbHVnIGNvcnJlY3RseQorCXRhZ2dlZCBtcDMgIQorCisyMDA0LTAxLTI3ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6IChnc3RfYXVkaW9fY29udmVydF9saW5rKToKKwlVc2UgZ3N0X3BhZF90cnlfc2V0X2NhcHNfbm9uZml4ZWQoKS4KKworMjAwNC0wMS0yNyAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvYWMzcGFyc2UvZ3N0YWMzcGFyc2UuYzogdXBkYXRlIHRvIGNoZWNrbGlzdCA1CisJKiBnc3QvYWRkZXIvZ3N0YWRkZXIuYzogcmV3cml0ZSBuZWdvdGlhdGlvbi4gIHVwZGF0ZSB0byBjaGVja2xpc3QgNQorCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogdXBkYXRlIHRvIGNoZWNrbGlzdCA1CisJKiBnc3QvYXVkaW9zY2FsZS9nc3RhdWRpb3NjYWxlLmM6IHNhbWUKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzogc2FtZQorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBzYW1lCisKKzIwMDQtMDEtMjcgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6IChnc3RfYXNmX2RlbXV4X2hhbmRsZV9zaW5rX2V2ZW50KToKKwkgIHN0b3AgcHJvY2Vzc2luZyBhZnRlciBFT1MKKworMjAwNC0wMS0yNyAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBnc3QvYXNmZGVtdXgvYXNmaGVhZGVycy5oOgorCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6CisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmbXV4LmM6IChnc3RfYXNmbXV4X3B1dF9ndWlkKSwKKwkoZ3N0X2FzZm11eF9wdXRfc3RyaW5nKSwgKGdzdF9hc2ZtdXhfcHV0X3dhdl9oZWFkZXIpLAorCShnc3RfYXNmbXV4X3B1dF92aWRfaGVhZGVyKSwgKGdzdF9hc2ZtdXhfcHV0X2JtcF9oZWFkZXIpOgorCSAgbG90J3Mgb2YgZml4ZXMgdG8gbWFrZSBkYXRhIGV4dHJhY3Rpb24gc2ltcGxlciBhbmQgZ2V0IHRoZSBjb2RlCisJICBhcmNoaXRlY3R1cmUgYW5kIGNvbXBpbGVyIGluZGVwZW5kYW50LiBBZGQgZGVidWdnaW5nIGNhdGVnb3J5CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnc3RfZ29vbV9jaGFuZ2Vfc3RhdGUpOgorCSAgcmVzZXQgY2hhbm5lbCBjb3VudCBvbiBQQVVTRUQ9PlJFQURZLCBub3QgUkVBRFk9PlBBVVNFRAorCisyMDA0LTAxLTI2ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzcmMuYyAoZ3N0X2dub21ldmZzc3JjX2dldCk6IFJlbW92ZSB1Z2x5CisJY29kZSB0byBwdWxsIGEgYmlnZ2VyIGJ1ZmZlciBpbiBpcmFkaW8gbW9kZS4gIFRoaXMgYXMgYSBzaWRlIGVmZmVjdAorCW1ha2VzIHR5cGVmaW5kaW5nIHdvcmsuCisKKzIwMDQtMDEtMjYgIEplcmVteSBTaW1vbiAgPGplc2ltb25AbGliZXJ0eXN1cmYuZnI+CisKKwkqIGV4dC9mZm1wZWcvZ3N0ZmZtcGVnY29kZWNtYXAuYzogKGdzdF9mZm1wZWdfY2Fwc190b19leHRyYWRhdGEpOgorCUZpeCBTVlEzIGRlY29kaW5nIG9uIFBQQworCisyMDA0LTAxLTI2ICBKdWxpZW4gTU9VVFRFIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZ3N0L3ZpZGVvc2NhbGUvZ3N0dmlkZW9zY2FsZS5jOiAoZ3N0X3ZpZGVvc2NhbGVfY2hhaW4pOiBEdW5ubyBob3cKKwl0aGF0IG9uZSBtYW5hZ2VkIHRvIHN0YXkgdGhlcmUuLi4gRml4ZWQuCisKKzIwMDQtMDEtMjYgIEplcmVteSBTaW1vbiAgPGplc2ltb25AbGliZXJ0eXN1cmYuZnI+CisKKwkqIGV4dC9mZm1wZWcvZ3N0ZmZtcGVnY29kZWNtYXAuYzogKGdzdF9mZm1wZWdfY29kZWNpZF90b19jYXBzKSwKKwkoZ3N0X2ZmbXBlZ19jYXBzX3RvX2V4dHJhZGF0YSksIChnc3RfZmZtcGVnX2NhcHNfdG9fcGl4Zm10KToKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHBsdWdpbl9pbml0KSwgKHF0ZGVtdXhfcGFyc2VfdHJhayksCisJKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJQWRkIFNWUTMgc3BlY2lmaWMgZmxhZ3MgdG8gcXRkZW11eCBhbmQgZmZtcGVnCisKKzIwMDQtMDEtMjYgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL2F1ZGlvLmg6CisJICByZW1vdmUgYnVmZmVyLWZyYW1lcyBmcm9tIGF1ZGlvIGNhcHMKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6CisJICBmaXggcGx1Z2luIHRvIHJlYWxseSB3b3JrLgorCisyMDA0LTAxLTI1ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvbWl4ZXIuYzoKKwkqIGdzdC1saWJzL2dzdC9wcm9wZXJ0eXByb2JlL3Byb3BlcnR5cHJvYmUuYzoKKwkqIGdzdC1saWJzL2dzdC90dW5lci90dW5lci5jOiAoZ3N0X3R1bmVyX2ZpbmRfbm9ybV9ieV9uYW1lKSwKKwkoZ3N0X3R1bmVyX2ZpbmRfY2hhbm5lbF9ieV9uYW1lKToKKwkqIGdzdC1saWJzL2dzdC90dW5lci90dW5lci5oOgorCSAgQWRkIGd0ay1kb2Mgc3R5bGUgY29tbWVudHMuIEFsc28gZml4IGEgZnVuY3Rpb24gbmFtZS4KKworMjAwNC0wMS0yNSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2RpdngvZ3N0ZGl2eGRlYy5jOiAoZ3N0X2RpdnhkZWNfaW5pdCksCisJKGdzdF9kaXZ4ZGVjX25lZ290aWF0ZSk6CisJICBGaXggZm9yIG5ldyBjYXBzbmVnbyAtIGFsc28gZml4ZXMgZ3N0LXBsYXllciB3aXRoIGRpdnhkZWMuCisKKzIwMDQtMDEtMjUgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3BsYXkvZ3N0cGxheS5jOiAoZ3N0X3BsYXlfcGlwZWxpbmVfc2V0dXApLAorCShnc3RfcGxheV9pZGVudGl0eV9oYW5kb2ZmKSwgKGdzdF9wbGF5X3NldF9sb2NhdGlvbiksCisJKGdzdF9wbGF5X3NldF92aXN1YWxpemF0aW9uKSwgKGdzdF9wbGF5X2Nvbm5lY3RfdmlzdWFsaXphdGlvbik6IEFub3RoZXIKKwl0cnkgaW4gdmlzdWFsaXphdGlvbiBpbXBsZW1lbnRhdGlvbi4gU3RpbGwgaGF2ZSBhbiBpc3N1ZSB3aXRoIHN3aXRjaAorCWJsb2NraW5nIHdoZW4gcHVsbGluZyBmcm9tIHZpZGVvX3F1ZXVlIGFuZCBvbmx5IGF1ZGlvIGNvbWVzIG91dCBvZgorCXNwaWRlci4KKwkqIGdzdC9zd2l0Y2gvZ3N0c3dpdGNoLmM6IChnc3Rfc3dpdGNoX3JlbGVhc2VfcGFkKSwKKwkoZ3N0X3N3aXRjaF9wb2xsX3NpbmtwYWRzKSwgKGdzdF9zd2l0Y2hfY2xhc3NfaW5pdCk6IEltcGxlbWVudGluZyBwYWQKKwlyZWxlYXNlIG1ldGhvZC4gQW5kIGNoZWNrIGlmIHRoZSBwYWQgaXMgdXNhYmxlIGJlZm9yZSBwdWxsaW5nLgorCisyMDA0LTAxLTI1ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6IChnc3RfdmlkZW9iYWxhbmNlX2Rpc3Bvc2UpLAorCShnc3RfdmlkZW9iYWxhbmNlX2luaXQpLAorCShnc3RfdmlkZW9iYWxhbmNlX2NvbG9yYmFsYW5jZV9saXN0X2NoYW5uZWxzKSwKKwkoZ3N0X3ZpZGVvYmFsYW5jZV9jb2xvcmJhbGFuY2Vfc2V0X3ZhbHVlKSwKKwkoZ3N0X3ZpZGVvYmFsYW5jZV9jb2xvcmJhbGFuY2VfZ2V0X3ZhbHVlKSwKKwkoZ3N0X3ZpZGVvYmFsYW5jZV91cGRhdGVfcHJvcGVydGllcyksCisJKGdzdF92aWRlb2JhbGFuY2VfdXBkYXRlX3RhYmxlc19wbGFuYXI0MTEpLAorCShnc3RfdmlkZW9iYWxhbmNlX3BsYW5hcjQxMSk6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmg6CisJICBJbXBsZW1lbnQgbG9va3VwLXRhYmxlcy4gKy8tIDEweCBmYXN0ZXIuCisKKzIwMDQtMDEtMjUgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2F2aWgpLAorCShnc3RfYXZpX2RlbXV4X3N0cmVhbV9vZG1sKSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luZGV4KToKKwkgIFRoZSBpbmRleCByZWFkaW5nIHdhcyBicm9rZW4uIFRoZSByZXN0IHdvcmtlZCBmaW5lLCBidXQgdGhlIHdob2xlCisJICBnb2FsIG9mIG15IHJld3JpdGUgd2FzIHRvIG1ha2UgYXZpZGVtdXggcmVhZGFibGUsIGFuZCB0aGlzIHdhcworCSAgbm90IGF0IGFsbCByZWFkYWJsZS4gUGxlYXNlIHVzZSB0eXBlZCB2YXJpYWJsZXMuCisKKzIwMDQtMDEtMjUgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5jOiAoZ3N0X3JpZmZfcmVhZF9pbmZvKToKKwkgIEFkZGl0aW9uYWwgcGFkIHVzYWJpbGl0eSBjaGVjay4KKwkqIGdzdC9tcGVnMXZpZGVvcGFyc2UvZ3N0bXAxdmlkZW9wYXJzZS5jOiAoZ3N0X21wMXZpZGVvcGFyc2VfaW5pdCksCisJKG1wMXZpZGVvcGFyc2VfZmluZF9uZXh0X2dvcCksIChnc3RfbXAxdmlkZW9wYXJzZV90aW1lX2NvZGUpLAorCShnc3RfbXAxdmlkZW9wYXJzZV9yZWFsX2NoYWluKToKKwkgIEZpeCBNUEVHIHZpZGVvIHN0cmVhbSBwYXJzaW5nLiBUaGUgb3JpZ2luYWwgcGx1Z2luIGhhZCBzZXZlcmFsCisJICBpc3N1ZXMsIGluY2x1ZGluZyBub3QgdGltZXN0YW1waW5nIHN0cmVhbXMgd2hlcmUgdGhlIHNvdXJjZSB3YXMKKwkgIG5vdCB0aW1lc3RhbXBlZCAodGhpcyBoYXBwZW5zIHdpdGggUFRTIHZhbHVlcyBpbiBtcGVnIHN5c3RlbQorCSAgc3RyZWFtcywgYnV0IE1QRUcgdmlkZW8gaXMgYWxzbyBhIHZhbGlkIHN0cmVhbSBvbiBpdHMgb3duIHNvCisJICB0aGF0IG5lZWRzIHRpbWVzdGFtcHMgdG9vKS4gV2UgdXNlIHRoZSBkaXNwbGF5IHRpbWUgY29kZSBmb3IgdGhhdAorCSAgZm9yIG5vdy4gQWxzbywgaWYgb25lIGluY29taW5nIGJ1ZmZlciBjb250YWlucyBtdWx0aXBsZSB2YWxpZAorCSAgZnJhbWVzLCB3ZSBwdXNoIHRoZW0gYWxsIG9uIGNvcnJlY3RseSBub3csIGluY2x1ZGluZyBwcm9wZXIgRU9TCisJICBoYW5kbGluZy4gTGFzdGx5LCBzZXZlcmFsIHBvdGVudGlhbCBzZWdmYXVsdHMgd2VyZSBmaXhlZCwgYW5kIHdlCisJICBwcm9wZXJseSBzeW5jIG9uIG5ldyBzZXF1ZW5jZS9nb3AgaGVhZGVycyB0byBpbmNsdWRlIHRoZW0gaW4gbmV4dCwKKwkgIG5vdCBwcmV2aW91cyBmcmFtZXMgKHNpbmNlIHRoZXkncmUgaGVhZGVyIGZvciB0aGUgbmV4dCBmcmFtZSwgbm90CisJICB0aGUgcHJldmlvdXMpLiBBbHNvIHNlZSAjMTE5MjA2LgorCSogZ3N0L21wZWdhdWRpb3BhcnNlL2dzdG1wZWdhdWRpb3BhcnNlLmM6IChnc3RfbXAzcGFyc2VfY2hhaW4pLAorCShicGZfZnJvbV9oZWFkZXIpOgorCSAgTW92ZSBjYXBzIHNldHRpbmcgc28gd2Ugb25seSBkbyBpdCBhZnRlciBmaW5kaW5nIHNldmVyYWwgdmFsaWQKKwkgIE1QRUctMSBmcmFlcyBzZXF1ZW50aWFsbHksIG5vdCByaWdodCBhZnRlciB0aGUgZmlyc3Qgb25lICh3aGljaAorCSAgbWlnaHQgYmUgY29pbmNpZGVudGFsKS4KKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAobXBlZzFfc3lzX3R5cGVfZmluZCksCisJKG1wZWdfdmlkZW9fdHlwZV9maW5kKSwgKG1wZWdfdmlkZW9fc3RyZWFtX3R5cGVfZmluZCksCisJKHBsdWdpbl9pbml0KToKKwkgIEFkZCB1bnN5bmNlZCBNUEVHIHZpZGVvIHN0cmVhbSB0eXBlZmluZGluZywgYW5kIGNoYW5nZSBzb21lCisJICBwcm9iYWJpbGl0eSB2YWx1ZXMgc28gd2UgZGV0ZWN0IHN0cmVhbXMgcmlnaHRseS4gVGhlIGlkZWEgaXMgYXMKKwkgIGZvbGxvd3M6IEkgY2FuIGhhdmUgYW4gdW5zeW5jZWQgc3lzdGVtIHN0cmVhbSB3aGljaCBjb250YWlucworCSAgdmlkZW8uIEluIHRoZSBjdXJyZW50IGNvZGUsIEkgd291bGQgcmFuZG9tbHkgZ2V0IGEgdHlwZSBmb3IgZWl0aGVyCisJICBzeXN0ZW0gb3IgdmlkZW8gc3RyZWFtIHR5cGUgZm91bmQsIGJlY2F1c2UgdGhlIHByb2JhYmlsaXRpZXMgYXJlCisJICBiZWluZyBjYWxjdWxhdGVkIHJhdGhlciByYW5kb21seS4gSSBub3cgdXNlIGZpeGVkIHZhbHVlcywgc28gd2UKKwkgIGFsd2F5cyBwcmVmZXIgc3lzdGVtIHN0cmVhbSBpZiB0aGF0IHdhcyBmb3VuZCAoYW5kIHRoYXQgaXMgaG93IGl0CisJICBzaG91bGQgYmUpLiBJZiBubyBzeXN0ZW0gc3RyZWFtIHdhcyBmb3VuZCwgd2UgY2FuIHN0aWxsIGlkZW50aXR5CQkgIHRoZSBzdHJlYW0gYXMgdmlkZW8tb25seS4KKworMjAwNC0wMS0yMyAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3N0cmVhbV9hdmloKSwKKwkoZ3N0X2F2aV9kZW11eF9zdHJlYW1fb2RtbCksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCk6CisJICBkb24ndCB3cml0ZSB0byBidWZmZXIuIEV4dHJhY3QgZGF0YSB3aXRob3V0IHRoZSBuZWVkIG9mCisJICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKworMjAwNC0wMS0yMyAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChtcGVnMV9wYXJzZV9oZWFkZXIpLAorCShtcGVnMV9zeXNfdHlwZV9maW5kKToKKwkgIEZpeCBNUEVHLTEgc3RyZWFtIHR5cGVmaW5kaW5nLgorCisyMDA0LTAxLTIzICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKG1wZWcyX3N5c190eXBlX2ZpbmQpOgorCSAgRml4IHR5cGVmaW5kaW5nIGZvciBNUEVHLTEgc3lzdGVtIHN0cmVhbXMsIHNpbWlsYXIgdG8gTVBFRy0yLgorCisyMDA0LTAxLTIzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvZXNkL2VzZHNpbmsuYzogKGdzdF9lc2RzaW5rX29wZW5fYXVkaW8pOgorCSogZXh0L2VzZC9nc3Rlc2QuYzogKHBsdWdpbl9pbml0KToKKyAgICAgICAgICBwcml2YXRlIGRlYnVnZ2luZywgYmV0dGVyIGVycm9yIHJlcG9ydGluZworCisyMDA0LTAxLTIzICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLXJlYWQuYzogKGdzdF9yaWZmX3JlYWRfY2xhc3NfaW5pdCksCisJKGdzdF9yaWZmX3JlYWRfaW5pdCksIChnc3RfcmlmZl9yZWFkX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLXJlYWQuaDoKKwkgIFJlbW92ZSBzdHVmZiBmcm9tb2xkIG1ldGFkYXRhIHN5c3RlbS4KKworMjAwNC0wMS0yMyAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOgorCSAgRml4IHdyb25nIGZpbGUgY29tbWVudC4KKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5jOiAoZ3N0X3JpZmZfcmVhZF9pbmZvKToKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlcik6CisJICBBZGQgbWV0YWRhdGEgcmVhZGluZyBwcm9wZXJseS4KKworMjAwNC0wMS0yMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L01ha2VmaWxlLmFtOgorICAgICAgICAgIEZpeCBuYXMgRElTVF9TVUJESVJTCisgICAgICAgICAgVXJhZXVzOgorICAgICAgICAgIEZpeCBidWcgd2hlcmUgbWFrZSBkaXN0Y2hlY2sgZG9lc24ndCBnZXQgcnVuIG9uIGFkZGluZyBzdHVmZiB0bworICAgICAgICAgIHRoZSBidWlsZC4KKworMjAwNC0wMS0yMyAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2RpdngvZ3N0ZGl2eGRlYy5jOiAoZ3N0X2RpdnhkZWNfaW5pdCksIChnc3RfZGl2eGRlY19zZXR1cCk6CisJKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmg6CisJICBGaXggZGl2eDMgKCJtc21wZWc0IikgcGxheWJhY2sgdXNpbmcgZGl2eGRlYy4KKworMjAwNC0wMS0yMyAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzoKKwkobXAzX3R5cGVfZnJhbWVfbGVuZ3RoX2Zyb21faGVhZGVyKTogZml4IGJ1ZyBpbiBsZW5ndGggY29tcHV0YXRpb24KKwkobXAzX3R5cGVfZmluZCk6IGltcHJvdmUgZGVidWdnaW5nIG91dHB1dAorCisyMDA0LTAxLTIzICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9wbGF5L2dzdHBsYXkuYzogKGdzdF9wbGF5X3BpcGVsaW5lX3NldHVwKSwKKwkoZ3N0X3BsYXlfc2V0X2xvY2F0aW9uKSwgKGdzdF9wbGF5X3NlZWtfdG9fdGltZSksCisJKGdzdF9wbGF5X3NldF9hdWRpb19zaW5rKSwgKGdzdF9wbGF5X3NldF92aXN1YWxpemF0aW9uKSwKKwkoZ3N0X3BsYXlfY29ubmVjdF92aXN1YWxpemF0aW9uKSwgKGdzdF9wbGF5X2dldF9zaW5rX2VsZW1lbnQpOiBSZXdvcmtlZAorCXRoZSBwaXBlbGluZSBmcm9tIHNjcmF0Y2guIFZpc3VhbGl6YXRpb24gaXMgYmFjayBhbmQgc3dpdGNoIHdlbnQgb3V0IGFzCisJaSByZWFsaXplZCBpdCB3YXMgbm90IHBvc3NpYmxlIHRvIHVzZSB0aGUgd2F5IGkgd2FudGVkLgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19pbWFnZXBvb2xfY2xlYXIpLAorCShnc3RfeGltYWdlc2lua19jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3hpbWFnZXNpbmtfZGlzcG9zZSk6IE1vdmUgeGNvbnRleHQKKwljbGVhcmluZyBpbiBzdGF0ZSBjaGFuZ2UgZnJvbSBSRUFEWSB0byBOVUxMLiBTbyB0aGF0IG9uZSBjYW4gY2xlYW4gdGhlCisJWCByZXNzb3VyY2VzIGtlZXBpbmcgdGhlIGVsZW1lbnQuCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3hjb250ZXh0X2dldCksCisJKGdzdF94dmltYWdlc2lua19pbWFnZXBvb2xfY2xlYXIpLCAoZ3N0X3h2aW1hZ2VzaW5rX2NoYW5nZV9zdGF0ZSksCisJKGdzdF94dmltYWdlc2lua19jb2xvcmJhbGFuY2Vfc2V0X3ZhbHVlKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NvbG9yYmFsYW5jZV9nZXRfdmFsdWUpLAorCShnc3RfeHZpbWFnZXNpbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF94dmltYWdlc2lua19kaXNwb3NlKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2luaXQpOiBTYW1lIHhjb250ZXh0IGNsZWFuaW5nIHRoYW4geGltYWdlc2luayBpbiBzdGF0ZQorCWNoYW5nZSBmcm9tIFJFQURZIHRvIE5VTEwgYW5kIGZpeGVkIHNvbWUgc3R1cGlkIGJ1Z3MgaW4gY29sb3JiYWxhbmNlCisJZ2V0L3NldCB2YWx1ZXMuIEFsc28gYWRkZWQgdGhlIGZvbGxvd2luZyBmZWF0dXJlIDogd2hlbiBub2JvZHkgdHJpZXMgdG8KKwlzZXQgc29tZSB2YWx1ZXMgdG8gdGhlIGNvbG9yYmFsYW5jZSBsZXZlbHMgYmVmb3JlIHRoZSB4Y29udGV4dCBpcworCWdyYWJiZWQsIHRoZW4gd2hlbiBjcmVhdGluZyBjaGFubmVscyBsaXN0IGZyb20gWHYgYXR0cmlidXRlcyB3ZSBzZXQgdGhlCisJaW50ZXJuYWwgdmFsdWVzIHRvIHRoZSBYdiBkZWZhdWx0cy4gVGhpcyB3YXkgd2UgaGFuZGxlIGJ1Z2d5IFh2IGRyaXZlcnMKKwl0aGF0IHNldCBkZWZhdWx0IGh1ZSB2YWx1ZXMgZmFyIGZyb20gdGhlIG1pZGRsZSBvZiB0aGUgcmFuZ2UgKFRoYW5rcworCXRvIEpvbiBUcm93YnJpZGdlIGZvciBwb2ludGluZyB0aGF0IGlzc3VlKS4KKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmg6IEFkZGluZyBhIGNiX2NoYW5nZWQgYm9vbGVhbiB0byBrbm93IGlmCisJY29sb3JiYWxhbmNlIGxldmVscyBoYXZlIGJlZW4gc2V0IGJlZm9yZSB4Y29udGV4dCBpcyBncmFiYmVkLgorCisyMDA0LTAxLTIyICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuYzogKGdzdF9vc3NlbGVtZW50X2NsYXNzX3Byb2JlX2RldmljZXMpOgorCSAgRml4IHRoZSBvc3NtaXhlciBjYXNlIHdoZXJlIHdlIHNob3VsZG4ndCBvcGVuIC9kZXYvZHNwKiBiZWNhdXNlCisJICBpdCBtaWdodCBibG9jayBvcGVyYXRpb25zICh3aGljaCBpcyBiYWQgZm9yIGEgbWl4ZXIpLgorCisyMDA0LTAxLTIyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QtbGlicy9nc3QvbWVkaWEtaW5mby9tZWRpYS1pbmZvLXByaXYuYzogKGhhdmVfdHlwZV9jYWxsYmFjayksCisJKGRlZXBfbm90aWZ5X2NhbGxiYWNrKSwgKGdtaV9zZXRfZGVjb2RlciksIChnbWlfY2xlYXJfZGVjb2RlciksCisJKGdtaXBfZmluZF90eXBlX3ByZSk6CisJKiBnc3QtbGlicy9nc3QvbWVkaWEtaW5mby9tZWRpYS1pbmZvLXByaXYuaDoKKwkqIGdzdC1saWJzL2dzdC9tZWRpYS1pbmZvL21lZGlhLWluZm8uYzoKKwkoZ3N0X21lZGlhX2luZm9faW5zdGFuY2VfaW5pdCksIChnc3RfbWVkaWFfaW5mb19yZWFkX2lkbGVyKToKKyAgICAgICAgYWRkIGZha2VzaW5rIHRvIGdldCBjYXBzIG9uIGRlY29kZXIgc3JjIHBhZCBhZ2FpbgorICAgICAgICBmaXggY2FsbGJhY2sgcHJvdG90eXBlIHRvIG1hdGNoIG5ldyBoYXZlX3R5cGUgc2lnbmFsIHNpZ25hdHVyZQorCisyMDA0LTAxLTIyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvYWRkZXIvZ3N0YWRkZXIuYzogKGdzdF9hZGRlcl9saW5rKToKKyAgICAgICAgICBmaXggbm9uLWNvbXBpbGUgYW5kIGN1dC1uLXBhc3RlIGNvZGUKKworMjAwNC0wMS0yMSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvc3dmZGVjL2dzdHN3ZmRlYy5jOiAoZ3N0X3N3ZmRlY192aWRlb19nZXRjYXBzKSwKKwkoZ3N0X3N3ZmRlY192aWRlb19saW5rKSwgKGNvcHlfaW1hZ2UpLCAoZ3N0X3N3ZmRlY19sb29wKSwKKwkoZ3N0X3N3ZmRlY19pbml0KSwgKGdzdF9zd2ZkZWNfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9zd2ZkZWMvZ3N0c3dmZGVjLmg6CisJRml4IG5lZ290aWF0aW9uLgorCSogZ3N0L2FkZGVyL2dzdGFkZGVyLmM6IChnc3RfYWRkZXJfbGluayksIChnc3RfYWRkZXJfaW5pdCksCisJKGdzdF9hZGRlcl9yZXF1ZXN0X25ld19wYWQpOiBGaXggbmVnb3RpYXRpb24uCisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnc3RfZ29vbV9pbml0KSwgKGdzdF9nb29tX3NyY19maXhhdGUpOgorCUFkZCBhIGZpeGF0ZSBmdW5jdGlvbi4KKwkqIGdzdC9pbnRmbG9hdC9nc3RmbG9hdDJpbnQuYzoKKwkqIGdzdC9pbnRmbG9hdC9nc3RmbG9hdDJpbnQuaDoKKwkqIGdzdC9pbnRmbG9hdC9nc3RpbnQyZmxvYXQuYzoKKwkqIGdzdC9pbnRmbG9hdC9nc3RpbnQyZmxvYXQuaDoKKwlDb21wbGV0ZWx5IHJld3JpdGUgdGhlIG5lZ290aWF0aW9uLiAgRG9lc24ndCBxdWl0ZSB3b3JrIHlldCwKKwlkdWUgdG8gc29tZSBidWZmZXItZnJhbWVzIHByb2JsZW0uCisKKzIwMDQtMDEtMjEgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9nbm9tZXZmcy9nc3Rnbm9tZXZmc3NyYy5jOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5oOgorICAgICAgICAgIGZpeCBpbmNsdWRlcyBmb3IgZGlzdGNoZWNrCisKKzIwMDQtMDEtMjEgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogZXh0L25hcy8KKwlBZGQgbGlibmFzIChuZXR3b3JrIGF1ZGlvIHN5c3RlbSkgcGx1Z2luLCBwYXRjaCBmcm9tIEFyd2VkIHZvbiBNZXJrYXR6CisJYmFzZWQgb24gZWFybGllciBwYXRjaCBmcm9tIExhdXJlbnQgVml2aWVyCisKKzIwMDQtMDEtMjAgIEplcmVteSBTaW1vbiAgPGplc2ltb25AbGliZXJ0eXN1cmYuZnI+CisKKwkqIGV4dC9mZm1wZWcvZ3N0ZmZtcGVnY29kZWNtYXAuYzogKGdzdF9mZm1wZWdfY2Fwc190b19leHRyYWRhdGEpOgorCUZpeCB3bWEgY2FwcyBwcm9wZXJ0eQorCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6IChnc3RfYXNmX2RlbXV4X2F1ZGlvX2NhcHMpOgorCUZpeCB0eXBvIChmbGFnczEgYW5kIGZsYWdzMikKKworMjAwNC0wMS0yMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby1wcml2LmM6CisJKGRlZXBfbm90aWZ5X2NhbGxiYWNrKSwgKGdtaV9zZWVrX3RvX3RyYWNrKSwgKGdtaV9nZXRfZGVjb2RlciksCisJKGdtaXBfZmluZF90eXBlX3ByZSksIChnbWlwX2ZpbmRfdHlwZSksIChnbWlwX2ZpbmRfc3RyZWFtX3Bvc3QpLAorCShnbWlwX2ZpbmRfc3RyZWFtKSwgKGdtaXBfZmluZF90cmFja19tZXRhZGF0YSksCisJKGdtaXBfZmluZF90cmFja19zdHJlYW1pbmZvX3Bvc3QpLCAoZ21pcF9maW5kX3RyYWNrX3N0cmVhbWluZm8pLAorCShnbWlwX2ZpbmRfdHJhY2tfZm9ybWF0KToKKwkqIGdzdC1saWJzL2dzdC9tZWRpYS1pbmZvL21lZGlhLWluZm8tcHJpdi5oOgorCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby10ZXN0LmM6IChtYWluKToKKwkqIGdzdC1saWJzL2dzdC9tZWRpYS1pbmZvL21lZGlhLWluZm8uYzogKGdzdF9tZWRpYV9pbmZvX2luaXQpLAorCShnc3RfbWVkaWFfaW5mb19yZWFkX2lkbGVyKSwgKGdzdF9tZWRpYV9pbmZvX3JlYWQpOgorCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby5oOgorICAgICAgICAgIHJlZ2lzdGVyIGRlYnVnZ2luZyBjYXRlZ29yeSBhbmQgdXNlIGl0IGZvciBkZWJ1Z2dpbmcKKworMjAwNC0wMS0yMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L3ZvcmJpcy92b3JiaXNmaWxlLmM6IChnc3Rfdm9yYmlzZmlsZV91cGRhdGVfc3RyZWFtaW5mbyksCisJKGdzdF92b3JiaXNmaWxlX25ld19saW5rKToKKyAgICAgICAgICBzaWduYWwgc3RyZWFtaW5mbyB0aHJvdWdoIHRhZ3MKKworMjAwNC0wMS0yMCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L21wbGV4L2dzdG1wbGV4LmNjOgorCSogZXh0L21wbGV4L2dzdG1wbGV4aWJpdHN0cmVhbS5jYzoKKwkgIGcrKyBkb2Vzbid0IGxpa2UgTlVMTCBpbiBvdXIgaTE4bi9lcnJvciBtYWNyb3MsIHNob3VsZCBiZQorCSAgZWl0aGVyIChOVUxMKSBvciAoIiIpLgorCisyMDA0LTAxLTIwICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvZHhyMy9keHIzYXVkaW9zaW5rLmM6CisJKiBzeXMvZHhyMy9keHIzaW5pdC5jOgorCSogc3lzL2R4cjMvZHhyM3NwdXNpbmsuYzogKGR4cjNzcHVzaW5rX2Nsb3NlKToKKwkqIHN5cy9keHIzL2R4cjN2aWRlb3NpbmsuYzogKGR4cjN2aWRlb3NpbmtfY2xvc2UpOgorCSAgRml4IG1vcmUgZXJyb3IgZXJyb3IgZXJyb3IgZXJyb3JzIChtaXNzaW5nIGluY2x1ZGVzIGhlcmUpLgorCisyMDA0LTAxLTIwICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbXBlZzJlbmMvZ3N0bXBlZzJlbmNwaWN0dXJlcmVhZGVyLmNjOgorCSAgZml4IHRob21hcycgZXJyb3IgZXJyb3JzLgorCisyMDA0LTAxLTIwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvbXBlZzJlbmMvZ3N0bXBlZzJlbmMuY2M6CisgICAgICAgICAgZml4IGVycm9yIGVycm9ycy4KKworMjAwNC0wMS0yMCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2RpdngvZ3N0ZGl2eGRlYy5jOiAoZ3N0X2RpdnhkZWNfc2V0dXApLCAoZ3N0X2RpdnhkZWNfY2hhaW4pOgorCSogZXh0L2RpdngvZ3N0ZGl2eGVuYy5jOiAoZ3N0X2RpdnhlbmNfc2V0dXApLCAoZ3N0X2RpdnhlbmNfY2hhaW4pOgorCSAgRml4IGZvciBuZXcgZXJyb3Igc3lzdGVtLgorCisyMDA0LTAxLTIwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvZGl2eC9nc3RkaXZ4ZW5jLmM6IChnc3RfZGl2eGVuY19zZXR1cCksIChnc3RfZGl2eGVuY19jaGFpbik6CisgICAgICAgICAgZml4IGZvciBuZXcgZXJyb3IgcmVwb3J0aW5nCisKKzIwMDQtMDEtMjAgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19oYW5kbGVfeGV2ZW50cyksCisJKGdzdF94aW1hZ2VzaW5rX3hjb250ZXh0X2dldCksIChnc3RfeGltYWdlc2lua19nZXRjYXBzKSwKKwkoZ3N0X3hpbWFnZXNpbmtfc2V0X3h3aW5kb3dfaWQpOiBDaGFuZ2UgdG8gdXNpbmcgYSBmcmFtZXJhdGUKKwlvZiBbMSwxMDBdIGluc3RlYWQgb2YgWzAsTUFYXSwgc2luY2UgMCBpc24ndCBoYW5kbGVkIGNvcnJlY3RseSwKKwlhbmQgbmVpdGhlciBpcyAxMDArLCBtb3N0IGxpa2VseS4KKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfZ2V0X3h2X3N1cHBvcnQpLAorCShnc3RfeHZpbWFnZXNpbmtfZ2V0Y2Fwcyk6IHNhbWUKKworMjAwNC0wMS0xOSAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBjb25maWd1cmUuYWM6CisJICBVcCB2ZXJzaW9uIHJlcXVpcmVtZW50IHRvIDIuMC4zIChub3QgeWV0IHJlbGVhc2VkKSB0byBhdm9pZCBzeW1ib2wKKwkgIGNsYXNoZXMgd2l0aCBmZm1wZWcuCisKKzIwMDQtMDEtMjAgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZ3N0L3N3aXRjaC9nc3Rzd2l0Y2guYzogKGdzdF9zd2l0Y2hfcmVxdWVzdF9uZXdfcGFkKSwKKwkoZ3N0X3N3aXRjaF9pbml0KTogRml4ZWQgc3dpdGNoIGVsZW1lbnQgOiBwcm94eWluZyBsaW5rIGFuZCBzZXR0aW5nCisJY2FwcyBmcm9tIHNyYyB0byBzaW5rIG9uIHJlcXVlc3QuCisKKzIwMDQtMDEtMTkgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHN5cy92NGwvdjRsLW92ZXJsYXlfY2FsbHMuYzogKGdzdF92NGxfc2V0X292ZXJsYXkpOgorCSogc3lzL3Y0bDIvdjRsMi1vdmVybGF5X2NhbGxzLmM6IChnc3RfdjRsMl9zZXRfZGlzcGxheSksCisJKGdzdF92NGwyX3NldF93aW5kb3cpLCAoZ3N0X3Y0bDJfZW5hYmxlX292ZXJsYXkpOgorICAgICAgICBmaXggZWxlbWVudF9lcnJvcgorCisyMDA0LTAxLTE5ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBzeXMvdjRsL3Y0bF9jYWxscy5oOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5oOgorICAgICAgICAgIGVsZW1lbnRfZXJyb3IgZml4ZXMKKworMjAwNC0wMS0xOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L2dzdC1pMThuLXBsdWdpbi5oOgorICAgICAgICAgIGFkZCBsb2NhbGUuaAorICAgICAgICAgIHJlbW92ZSBjb25maWcuaCBpbmNsdXNpb24KKworMjAwNC0wMS0xOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogYXV0b2dlbi5zaDoKKyAgICAgICAgICBhZGRpbmcgYXV0b3BvaW50IGludm9jYXRpb24KKwkqIE1ha2VmaWxlLmFtOgorCSogY29uZmlndXJlLmFjOgorCSogZ3N0LWxpYnMvZ3N0L2dldHRleHQuaDoKKyAgICAgICAgICBhZGRpbmcgZ2V0dGV4dCBiaXRzCisJKiBleHQvYXVkaW9maWxlL2dzdGFmc2luay5jOiAoZ3N0X2Fmc2lua19wbHVnaW5faW5pdCk6CisJKiBleHQvYXVkaW9maWxlL2dzdGFmc3JjLmM6IChnc3RfYWZzcmNfcGx1Z2luX2luaXQpOgorCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzLmM6IChwbHVnaW5faW5pdCk6CisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzaW5rLmM6IChnc3RfZ25vbWV2ZnNzaW5rX29wZW5fZmlsZSksCisJKGdzdF9nbm9tZXZmc3NpbmtfY2xvc2VfZmlsZSk6CisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzcmMuYzogKGdzdF9nbm9tZXZmc3NyY19vcGVuX2ZpbGUpOgorCSogZXh0L3NuZGZpbGUvZ3N0c2YuYzogKGdzdF9zZl9sb29wKSwgKHBsdWdpbl9pbml0KToKKwkqIGdzdC1saWJzL2dzdC9nc3QtaTE4bi1wbHVnaW4uaDoKKwkqIGdzdC9hdmkvZ3N0YXZpLmM6IChwbHVnaW5faW5pdCk6CisJKiBzeXMvZHhyMy9keHIzaW5pdC5jOiAocGx1Z2luX2luaXQpOgorCSogc3lzL2R4cjMvZHhyM3ZpZGVvc2luay5jOiAoZHhyM3ZpZGVvc2lua193cml0ZV9kYXRhKToKKwkqIHN5cy9vc3MvZ3N0b3NzYXVkaW8uYzogKHBsdWdpbl9pbml0KToKKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5jOiAoZ3N0X29zc2VsZW1lbnRfb3Blbl9hdWRpbyk6CisJKiBzeXMvdjRsL2dzdHY0bC5jOiAocGx1Z2luX2luaXQpOgorCSogc3lzL3Y0bC92NGxfY2FsbHMuYzogKGdzdF92NGxfb3Blbik6CisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6IChwbHVnaW5faW5pdCk6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6IChnc3RfdjRsMl9nZXRfY2FwYWJpbGl0aWVzKSwKKwkoZ3N0X3Y0bDJfZmlsbF9saXN0cyksIChnc3RfdjRsMl9nZXRfbm9ybSksIChnc3RfdjRsMl9zZXRfbm9ybSksCisJKGdzdF92NGwyX2dldF9pbnB1dCksIChnc3RfdjRsMl9zZXRfaW5wdXQpLCAoZ3N0X3Y0bDJfZ2V0X291dHB1dCksCisJKGdzdF92NGwyX3NldF9vdXRwdXQpLCAoZ3N0X3Y0bDJfZ2V0X2ZyZXF1ZW5jeSksCisJKGdzdF92NGwyX3NldF9mcmVxdWVuY3kpLCAoZ3N0X3Y0bDJfc2lnbmFsX3N0cmVuZ3RoKSwKKwkoZ3N0X3Y0bDJfZ2V0X2F0dHJpYnV0ZSksIChnc3RfdjRsMl9zZXRfYXR0cmlidXRlKToKKwkgIG1ha2Ugc3VyZSBsb2NhbGUgYW5kIHRyYW5zbGF0aW9uIGRvbWFpbiBhcmUgc2V0CisgICAgICAgICAgZml4IHRyYW5zbGF0ZWQgc3RyaW5ncworCSogcG8vLmN2c2lnbm9yZToKKwkqIHBvL0xJTkdVQVM6CisJKiBwby9NYWtldmFyczoKKwkqIHBvL1BPVEZJTEVTLmluOgorCSogcG8vbmwucG86CisgICAgICAgICAgcHV0IHRyYW5zbGF0aW9uIGZpbGVzIGludG8gcGxhY2UKKwkqIHN5cy94dmlkZW8vaW1hZ2V0ZXN0LmM6IChtYWluKToKKwkqIGV4dC9kdi9kZW1vLXBsYXkuYzogKG1haW4pOgorICAgICAgICAgIGZpeCB1bm5lY2Vzc2FyeSB0cmFuc2xhdGlvbnMKKworMjAwNC0wMS0xOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIGV4dC9zbmRmaWxlL2dzdHNmLmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZXh0L2F1ZGlvZmlsZS9nc3RhZnNpbmsuYzoKKwkqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzcmMuYzoKKwkqIGV4dC9nbm9tZXZmcy9nc3Rnbm9tZXZmc3NpbmsuYzoKKwkqIGV4dC9nbm9tZXZmcy9nc3Rnbm9tZXZmc3NyYy5jOgorCSogc3lzL29zcy9nc3Rvc3NlbGVtZW50LmM6CisJKiBzeXMvdjRsL3Y0bF9jYWxscy5oOgorICAgICAgICAgIGZpeCBpMThuIGluY2x1ZGUKKworMjAwNC0wMS0xOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOiAoZ3N0X3Y0bDJfZ2V0X2NhcGFiaWxpdGllcyksCisJKGdzdF92NGwyX2ZpbGxfbGlzdHMpLCAoZ3N0X3Y0bDJfb3BlbiksIChnc3RfdjRsMl9nZXRfbm9ybSksCisJKGdzdF92NGwyX3NldF9ub3JtKSwgKGdzdF92NGwyX2dldF9pbnB1dCksIChnc3RfdjRsMl9zZXRfaW5wdXQpLAorCShnc3RfdjRsMl9nZXRfb3V0cHV0KSwgKGdzdF92NGwyX3NldF9vdXRwdXQpLAorCShnc3RfdjRsMl9nZXRfZnJlcXVlbmN5KSwgKGdzdF92NGwyX3NldF9mcmVxdWVuY3kpLAorCShnc3RfdjRsMl9zaWduYWxfc3RyZW5ndGgpLCAoZ3N0X3Y0bDJfZ2V0X2F0dHJpYnV0ZSksCisJKGdzdF92NGwyX3NldF9hdHRyaWJ1dGUpOgorICAgICAgICB1cGRhdGUgdG8gbmV3IGVycm9yIGhhbmRsaW5nCisKKzIwMDQtMDEtMTkgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9zaWRwbGF5L2dzdHNpZGRlYy5jYzoKKwkqIGdzdC9tb2RwbHVnL2dzdG1vZHBsdWcuY2M6CisgICAgICAgICAgcGFyZW50aGVzZSBOVUxMIGJlY2F1c2UgQysrIHNlZW1zIGFuZ3J5IGFib3V0IGl0CisKKzIwMDQtMDEtMTkgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC1saWJzL2dzdC9nc3QtaTE4bi1wbHVnaW4uaDoKKyAgICAgICAgICBhZGQgc2tlbGV0b24gaTE4biBzdHVmZiwgYnV0IG5lZWRzIHRvIGJlIGZ1cnRoZXIgaW1wbGVtZW50ZWQKKworMjAwNC0wMS0xOCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXhhbXBsZXMvZ3N0cGxheS9wbGF5ZXIuYzogKG1haW4pOgorCSogZXh0L2FhbGliL2dzdGFhc2luay5jOiAoZ3N0X2Fhc2lua19vcGVuKToKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX2xpbmspLCAoZ3N0X2Fsc2FfeHJ1bl9yZWNvdmVyeSk6CisJKiBleHQvYWxzYS9nc3RhbHNhc2luay5jOiAoZ3N0X2Fsc2Ffc2lua19sb29wKToKKwkqIGV4dC9hbHNhL2dzdGFsc2FzcmMuYzogKGdzdF9hbHNhX3NyY19sb29wKToKKwkqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzaW5rLmM6IChnc3RfYWZzaW5rX29wZW5fZmlsZSksCisJKGdzdF9hZnNpbmtfY2xvc2VfZmlsZSk6CisJKiBleHQvYXVkaW9maWxlL2dzdGFmc3JjLmM6IChnc3RfYWZzcmNfb3Blbl9maWxlKSwKKwkoZ3N0X2Fmc3JjX2Nsb3NlX2ZpbGUpOgorCSogZXh0L2RpdngvZ3N0ZGl2eGRlYy5jOiAoZ3N0X2RpdnhkZWNfc2V0dXApLCAoZ3N0X2RpdnhkZWNfY2hhaW4pOgorCSogZXh0L2R2L2dzdGR2ZGVjLmM6IChnc3RfZHZkZWNfbG9vcCk6CisJKiBleHQvZHZkbmF2L2R2ZG5hdnNyYy5jOiAoZHZkbmF2c3JjX3VzZXJfb3ApLCAoZHZkbmF2c3JjX2dldCk6CisJKiBleHQvZXNkL2VzZG1vbi5jOiAoZ3N0X2VzZG1vbl9nZXQpOgorCSogZXh0L2VzZC9lc2RzaW5rLmM6IChnc3RfZXNkc2lua19jaGFpbik6CisJKiBleHQvZmFhYy9nc3RmYWFjLmM6IChnc3RfZmFhY19jaGFpbik6CisJKiBleHQvZmFhZC9nc3RmYWFkLmM6IChnc3RfZmFhZF9jaGFpbik6CisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2RlYy5jOiAoZ3N0X2ZmbXBlZ2RlY19jaGFpbik6CisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2RlbXV4LmM6IChnc3RfZmZtcGVnZGVtdXhfbG9vcCk6CisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ211eC5jOiAoZ3N0X2ZmbXBlZ211eF9sb29wKToKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjZGVjX2Vycm9yX2NhbGxiYWNrKSwKKwkoZ3N0X2ZsYWNkZWNfbG9vcCk6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IChnc3RfZmxhY2VuY19jaGFpbik6CisJKiBleHQvZmxhYy9nc3RmbGFjdGFnLmM6IChnc3RfZmxhY190YWdfY2hhaW4pOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6IChnc3RfZ2RrX3BpeGJ1Zl9jaGFpbik6CisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzaW5rLmM6IChnc3RfZ25vbWV2ZnNzaW5rX29wZW5fZmlsZSksCisJKGdzdF9nbm9tZXZmc3NpbmtfY2xvc2VfZmlsZSk6CisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzcmMuYzogKGF1ZGlvY2FzdF9pbml0KSwKKwkoZ3N0X2dub21ldmZzc3JjX29wZW5fZmlsZSk6CisJKiBleHQvaXZvcmJpcy92b3JiaXNmaWxlLmM6IChnc3RfaXZvcmJpc2ZpbGVfbG9vcCk6CisJKiBleHQvbGFtZS9nc3RsYW1lLmM6IChnc3RfbGFtZV9zaW5rX2xpbmspLCAoZ3N0X2xhbWVfY2hhaW4pOgorCSogZXh0L2xjcy9nc3Rjb2xvcnNwYWNlLmM6IChnc3RfY29sb3JzcGFjZV9zcmNjb25uZWN0X2Z1bmMpOgorCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX2hhbmRsZV9ldmVudCksCisJKGdzdF9pZDNfdGFnX2RvX3R5cGVmaW5kKSwgKGdzdF9pZDNfdGFnX2NoYWluKToKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX2NoYWluKToKKwkqIGV4dC9taWttb2QvZ3N0bWlrbW9kLmM6IChnc3RfbWlrbW9kX2xvb3ApOgorCSogZXh0L21wZWcyZGVjL2dzdG1wZWcyZGVjLmM6CisJKiBleHQvbXBlZzJlbmMvZ3N0bXBlZzJlbmMuY2M6CisJKiBleHQvbXBlZzJlbmMvZ3N0bXBlZzJlbmNwaWN0dXJlcmVhZGVyLmNjOgorCSogZXh0L21wbGV4L2dzdG1wbGV4LmNjOgorCSogZXh0L21wbGV4L2dzdG1wbGV4aWJpdHN0cmVhbS5jYzoKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfZGVtdXhfY2hhaW4pLAorCShnc3Rfb2dnX2RlbXV4X3B1c2gpLCAoZ3N0X29nZ19wYWRfcHVzaCk6CisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkqIGV4dC9zZGwvc2RsdmlkZW9zaW5rLmM6IChnc3Rfc2RsdmlkZW9zaW5rX2xvY2spLAorCShnc3Rfc2RsdmlkZW9zaW5rX2luaXRzZGwpLCAoZ3N0X3NkbHZpZGVvc2lua19jcmVhdGUpOgorCSogZXh0L3NpZHBsYXkvZ3N0c2lkZGVjLmNjOgorCSogZXh0L3NuZGZpbGUvZ3N0c2YuYzogKGdzdF9zZl9vcGVuX2ZpbGUpLCAoZ3N0X3NmX2Nsb3NlX2ZpbGUpLAorCShnc3Rfc2ZfbG9vcCk6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleGVuY19jaGFpbik6CisJKiBleHQvdGFya2luL2dzdHRhcmtpbmRlYy5jOiAoZ3N0X3RhcmtpbmRlY19jaGFpbik6CisJKiBleHQvdGFya2luL2dzdHRhcmtpbmVuYy5jOiAoZ3N0X3RhcmtpbmVuY19jaGFpbik6CisJKiBleHQvdm9yYmlzL3ZvcmJpc2VuYy5jOiAoZ3N0X3ZvcmJpc2VuY19jaGFpbik6CisJKiBleHQvdm9yYmlzL3ZvcmJpc2ZpbGUuYzogKGdzdF92b3JiaXNmaWxlX2xvb3ApOgorCSogZXh0L3h2aWQvZ3N0eHZpZGRlYy5jOiAoZ3N0X3h2aWRkZWNfc2V0dXApLCAoZ3N0X3h2aWRkZWNfY2hhaW4pOgorCSogZXh0L3h2aWQvZ3N0eHZpZGVuYy5jOiAoZ3N0X3h2aWRlbmNfc2V0dXApLCAoZ3N0X3h2aWRlbmNfY2hhaW4pOgorCSogZ3N0LWxpYnMvZ3N0L01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6IChnc3RfcmlmZl9wZWVrX2hlYWQpLAorCShnc3RfcmlmZl9yZWFkX2VsZW1lbnRfZGF0YSksIChnc3RfcmlmZl9yZWFkX3NlZWspLAorCShnc3RfcmlmZl9wZWVrX2xpc3QpLCAoZ3N0X3JpZmZfcmVhZF9saXN0KSwgKGdzdF9yaWZmX3JlYWRfaGVhZGVyKToKKwkqIGdzdC9hZGRlci9nc3RhZGRlci5jOiAoZ3N0X2FkZGVyX3BhcnNlX2NhcHMpLCAoZ3N0X2FkZGVyX2xvb3ApOgorCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6IChnc3RfYXNmX2RlbXV4X3Byb2Nlc3Nfc2VnbWVudCksCisJKGdzdF9hc2ZfZGVtdXhfcHJvY2Vzc19zdHJlYW0pLCAoZ3N0X2FzZl9kZW11eF9nZXRfc3RyZWFtKToKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luaXQpLAorCShnc3RfYXZpX2RlbXV4X2FkZF9zdHJlYW0pLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyKToKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpbXV4X3N0b3BfZmlsZSk6CisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOiAoZ3N0X2ZseGRlY19sb29wKToKKwkqIGdzdC9nb29tL2dzdGdvb20uYzogKGdzdF9nb29tX2NoYWluKToKKwkqIGdzdC9pZDMvZ3N0aWQzdHlwZXMuYzogKGdzdF9pZDN0eXBlc19sb29wKToKKwkqIGdzdC9pbnRmbG9hdC9nc3RmbG9hdDJpbnQuYzogKGdzdF9mbG9hdDJpbnRfbG9vcCk6CisJKiBnc3QvaW50ZmxvYXQvZ3N0aW50MmZsb2F0LmM6IChnc3RfaW50MmZsb2F0X2NoYWluX2dpbnQxNik6CisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChnc3RfZWJtbF9yZWFkX2VsZW1lbnRfaWQpLAorCShnc3RfZWJtbF9yZWFkX2VsZW1lbnRfbGVuZ3RoKSwgKGdzdF9lYm1sX3JlYWRfZWxlbWVudF9kYXRhKSwKKwkoZ3N0X2VibWxfcmVhZF9zZWVrKSwgKGdzdF9lYm1sX3JlYWRfdWludCksIChnc3RfZWJtbF9yZWFkX3NpbnQpLAorCShnc3RfZWJtbF9yZWFkX2Zsb2F0KSwgKGdzdF9lYm1sX3JlYWRfaGVhZGVyKToKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X2luaXRfc3RyZWFtKSwKKwkoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2Jsb2NrZ3JvdXApOgorCSogZ3N0L21vZHBsdWcvZ3N0bW9kcGx1Zy5jYzoKKwkqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6IChnc3RfbW9ub3Njb3BlX2NoYWluKToKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdwYXJzZS5jOiAoZ3N0X21wZWdfcGFyc2VfbG9vcCk6CisJKiBnc3Qvb25ldG9uL2dzdG9uZXRvbi5jOiAoZ3N0X29uZXRvbl9jaGFpbik6CisJKiBnc3Qvc2lsZW5jZS9nc3RzaWxlbmNlLmM6IChnc3Rfc2lsZW5jZV9nZXQpOgorCSogZ3N0L3NpbmUvZ3N0c2luZXNyYy5jOiAoZ3N0X3NpbmVzcmNfZ2V0KToKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOiAoZ3N0X3NtcHRlX2xvb3ApOgorCSogZ3N0L3NwZWVkL2dzdHNwZWVkLmM6IChzcGVlZF9sb29wKToKKwkqIGdzdC90YWdzL2dzdHZvcmJpc3RhZy5jOiAoZ3N0X3ZvcmJpc190YWdfY2hhaW4pOgorCSogZ3N0L3ZpZGVvdGVzdHNyYy9nc3R2aWRlb3Rlc3RzcmMuYzogKGdzdF92aWRlb3Rlc3RzcmNfZ2V0KToKKwkqIGdzdC92b2xlbnYvZ3N0dm9sZW52LmM6IChnc3Rfdm9sZW52X2NoYWluKToKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChnc3Rfd2F2ZW5jX2NoYWluKToKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX3BhcnNlX2ZtdCksCisJKGdzdF93YXZwYXJzZV9sb29wKToKKwkqIHN5cy9keHIzL2R4cjNhdWRpb3NpbmsuYzogKGR4cjNhdWRpb3Npbmtfb3BlbiksCisJKGR4cjNhdWRpb3Npbmtfc2V0X21vZGVfcGNtKSwgKGR4cjNhdWRpb3Npbmtfc2V0X21vZGVfYWMzKSwKKwkoZHhyM2F1ZGlvc2lua19jbG9zZSk6CisJKiBzeXMvZHhyMy9keHIzc3B1c2luay5jOiAoZHhyM3NwdXNpbmtfb3BlbiksIChkeHIzc3B1c2lua19jbG9zZSk6CisJKiBzeXMvZHhyMy9keHIzdmlkZW9zaW5rLmM6IChkeHIzdmlkZW9zaW5rX29wZW4pLAorCShkeHIzdmlkZW9zaW5rX2Nsb3NlKSwgKGR4cjN2aWRlb3Npbmtfd3JpdGVfZGF0YSk6CisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuYzogKGdzdF9vc3NlbGVtZW50X29wZW5fYXVkaW8pOgorCSogc3lzL29zcy9nc3Rvc3NlbGVtZW50Lmg6CisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3NzaW5rX2dldF90eXBlKSwgKGdzdF9vc3NzaW5rX2luaXQpLAorCShnc3Rfb3Nzc2lua19jaGFpbik6CisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jOiAoZ3N0X29zc3NyY19nZXQpOgorCSogc3lzL3Y0bC9nc3R2NGxtanBlZ3NpbmsuYzogKGdzdF92NGxtanBlZ3NpbmtfY2hhaW4pOgorCSogc3lzL3Y0bC9nc3R2NGxtanBlZ3NyYy5jOiAoZ3N0X3Y0bG1qcGVnc3JjX2J1ZmZlcl9mcmVlKToKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6IChnc3RfdjRsc3JjX2J1ZmZlcl9mcmVlKToKKwkqIHN5cy92NGwvdjRsLW92ZXJsYXlfY2FsbHMuYzogKGdzdF92NGxfc2V0X3dpbmRvdyksCisJKGdzdF92NGxfZW5hYmxlX292ZXJsYXkpOgorCSogc3lzL3Y0bC92NGxfY2FsbHMuYzogKGdzdF92NGxfZ2V0X2NhcGFiaWxpdGllcyksIChnc3RfdjRsX29wZW4pLAorCShnc3RfdjRsX3NldF9jaGFuX25vcm0pLCAoZ3N0X3Y0bF9nZXRfc2lnbmFsKSwKKwkoZ3N0X3Y0bF9nZXRfZnJlcXVlbmN5KSwgKGdzdF92NGxfc2V0X2ZyZXF1ZW5jeSksCisJKGdzdF92NGxfZ2V0X3BpY3R1cmUpLCAoZ3N0X3Y0bF9zZXRfcGljdHVyZSksIChnc3RfdjRsX2dldF9hdWRpbyksCisJKGdzdF92NGxfc2V0X2F1ZGlvKToKKwkqIHN5cy92NGwvdjRsX2NhbGxzLmg6CisJKiBzeXMvdjRsL3Y0bG1qcGVnc2lua19jYWxscy5jOiAoZ3N0X3Y0bG1qcGVnc2lua19zeW5jX3RocmVhZCksCisJKGdzdF92NGxtanBlZ3NpbmtfcXVldWVfZnJhbWUpLCAoZ3N0X3Y0bG1qcGVnc2lua19zZXRfcGxheWJhY2spLAorCShnc3RfdjRsbWpwZWdzaW5rX3BsYXliYWNrX2luaXQpLAorCShnc3RfdjRsbWpwZWdzaW5rX3BsYXliYWNrX3N0YXJ0KToKKwkqIHN5cy92NGwvdjRsbWpwZWdzcmNfY2FsbHMuYzogKGdzdF92NGxtanBlZ3NyY19xdWV1ZV9mcmFtZSksCisJKGdzdF92NGxtanBlZ3NyY19zeW5jX25leHRfZnJhbWUpLCAoZ3N0X3Y0bG1qcGVnc3JjX3NldF9jYXB0dXJlKSwKKwkoZ3N0X3Y0bG1qcGVnc3JjX3NldF9jYXB0dXJlX20pLCAoZ3N0X3Y0bG1qcGVnc3JjX2NhcHR1cmVfaW5pdCksCisJKGdzdF92NGxtanBlZ3NyY19yZXF1ZXVlX2ZyYW1lKToKKwkqIHN5cy92NGwvdjRsc3JjX2NhbGxzLmM6IChnc3RfdjRsc3JjX3F1ZXVlX2ZyYW1lKSwKKwkoZ3N0X3Y0bHNyY19zeW5jX2ZyYW1lKSwgKGdzdF92NGxzcmNfY2FwdHVyZV9pbml0KSwKKwkoZ3N0X3Y0bHNyY19yZXF1ZXVlX2ZyYW1lKSwgKGdzdF92NGxzcmNfdHJ5X3BhbGV0dGUpOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfZ2V0KToKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX2ZpbGxfZm9ybWF0X2xpc3QpLAorCShnc3RfdjRsMnNyY19xdWV1ZV9mcmFtZSksIChnc3RfdjRsMnNyY19ncmFiX2ZyYW1lKSwKKwkoZ3N0X3Y0bDJzcmNfZ2V0X2NhcHR1cmUpLCAoZ3N0X3Y0bDJzcmNfc2V0X2NhcHR1cmUpLAorCShnc3RfdjRsMnNyY19jYXB0dXJlX2luaXQpLCAoZ3N0X3Y0bDJzcmNfY2FwdHVyZV9zdGFydCksCisJKGdzdF92NGwyc3JjX2NhcHR1cmVfc3RvcCk6CisJKiBzeXMvdmNkL3ZjZHNyYy5jOiAodmNkc3JjX29wZW5fZmlsZSk6CisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3hjb250ZXh0X2dldCksCisJKGdzdF94aW1hZ2VzaW5rX2NoYWluKToKKwkqIHN5cy94dmlkZW8veHZpZGVvc2luay5jOiAoZ3N0X3h2aWRlb3NpbmtfYnVmZmVyX25ldyksCisJKGdzdF94dmlkZW9zaW5rX3Npbmtjb25uZWN0KSwgKGdzdF94dmlkZW9zaW5rX2NoYWluKSwKKwkoZ3N0X3h2aWRlb3NpbmtfeHdpbmRvd19uZXcpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua194Y29udGV4dF9nZXQpLAorCShnc3RfeHZpbWFnZXNpbmtfY2hhaW4pOgorICAgICAgICB1c2UgbmV3IGVycm9yIHNpZ25hbCwgZnVuY3Rpb24gYW5kIGNhdGVnb3JpZXMKKworMjAwNC0wMS0xOCAgSmVyZW15IFNpbW9uIDxqZXNpbW9uQGxpYmVydHlzdXJmLmZyPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvbXVzaWNicmFpbnovZ3N0dHJtLmM6CisJKiBleHQvbXVzaWNicmFpbnovZ3N0dHJtLmg6CisJKiBleHQvbXVzaWNicmFpbnovTWFrZWZpbGUuYW06CisJQWRkIGEgdHJtIHBsdWdpbgorCisyMDA0LTAxLTE4ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3hpbWFnZXNpbmtfZ2V0X3Byb3BlcnR5KSwgKGdzdF94aW1hZ2VzaW5rX2NsYXNzX2luaXQpOiBBZGRpbmcKKwlzeW5jaHJvbm91cyBwcm9wZXJ0eSBmb3IgZGVidWdnaW5nLgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmg6IEFkZGluZyB0aGUgc3luY2hyb25vdXMgYm9vbGVhbiBmbGFnLgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua194Y29udGV4dF9nZXQpLAorCShnc3RfeHZpbWFnZXNpbmtfc2V0X3Byb3BlcnR5KTogTW92aW5nIGEgcG9pbnRlciBkZWNsYXJhdGlvbiB0byBhCisJc21hbGxlciBibG9jaywgZml4aW5nIGluZGVudC4KKworMjAwNC0wMS0xNiAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6IEZpeCByZWdyZXNzaW9uOyBjaGFuZ2luZyBhCisJcHJvcGVydHkgYWZmZWN0cyB0aGUgdmlkZW8gc3RyZWFtLgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzoKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmg6CisJQWRkIHN5bmNocm9ub3VzIHByb3BlcnR5IGZvciBkZWJ1Z2dpbmcuICBTaG91bGQgcHJvYmFibHkgYmUKKwlkaXNhYmxlZCBpbiBub24tQ1ZTIGJ1aWxkcy4gIE1ha2Ugc3VyZSB0aGF0IHRoZSBYdiBhdHRyaWJ1dGUKKwlleGlzdHMgYmVmb3JlIHdlIHNldCBpdCAoY3Jhc2ghKS4gIEZpeCBhIHNpbGx5IGZsb2F0IGJ1ZyB0aGF0CisJY2F1c2VkIGNvbG9yYmFsYW5jZSB0byBqdXN0IG5vdCB3b3JrLgorCisyMDA0LTAxLTE3ICBDaHJpc3RpYW4gU2NoYWxsZXIgPFVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIHRvb2xzL2dzdC1sYXVuY2gtZXh0LmluIC0gdXBkYXRlIGZvciBuZXcgcGx1Z2lucworCisyMDA0LTAxLTE2ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9mZm1wZWcvZ3N0ZmZtcGVnZW5jLmM6IChnc3RfZmZtcGVnZW5jX2Nvbm5lY3QpOiBGaXggdXNlIG9mCisJYWxyZWFkeS1mcmVlZCBjYXBzLgorCisyOTk0LTAxLTE2ICBDaHJpc3RpYW4gU2NoYWxsZXIgPFVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIFVwZGF0ZSBzcGVjIGZvciBuZXcgY29sb3JzcGFjZSBwbHVnaW4gYW5kIGxpYmNhY2EgcGx1Z2luCisJKiBGaXggY29tcGlsYXRpb24gb2YgbGliY2FjYSBwbHVnaW4gKGNsb2NrIC0+IGlkKQorCisyMDA0LTAxLTE2ICBKdWxpZW4gTU9VVFRFIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua191cGRhdGVfY29sb3JiYWxhbmNlKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3hjb250ZXh0X2dldCksIChnc3RfeHZpbWFnZXNpbmtfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3NldF94d2luZG93X2lkKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NvbG9yYmFsYW5jZV9zZXRfdmFsdWUpLAorCShnc3RfeHZpbWFnZXNpbmtfY29sb3JiYWxhbmNlX2dldF92YWx1ZSksCisJKGdzdF94dmltYWdlc2lua19zZXRfcHJvcGVydHkpLCAoZ3N0X3h2aW1hZ2VzaW5rX2dldF9wcm9wZXJ0eSksCisJKGdzdF94dmltYWdlc2lua19pbml0KSwgKGdzdF94dmltYWdlc2lua19jbGFzc19pbml0KTogSW1wbGVtZW50aW5nCisJY29ycmVjdCBjb2xvcmJhbGFuY2UgcHJvcGVydGllcy4gVGhleSBjYW4gbm93IGJlIHNldCB3aGVuIHRoZSBlbGVtZW50CisJaXMgc3RpbGwgaW4gTlVMTCBzdGF0ZS4gVGhlIHZhbHVlcyB3aWxsIGJlIGNvbW1pdHRlZCB0byB0aGUgWHYgUG9ydAorCXdoZW4geGNvbnRleHQgaXMgaW5pdGlhbGl6ZWQuCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5oOiBBZGRlZCBodWUsIHNhdHVyYXRpb24sIGNvbnRyYXN0LAorCWJyaWdodG5lc3MgaW50IHZhbHVlcyBpbiB0aGUgR3N0WHZJbWFnZXNpbmsgc3RydWN0dXJlLgorCisyMDA0LTAxLTE2ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvTWFrZWZpbGUuYW06CisJICByZXN0cnVjdHVyZSBzbyBoYXZpbmcgbG9jYWwgcGF0Y2hlcyB3b3JrcyBlYXNpZXIuCisKKzIwMDQtMDEtMTYgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9tcGVnMmVuYy9NYWtlZmlsZS5hbToKKwkqIGV4dC9tcGVnMmVuYy9nc3RtcGVnMmVuYy5jYzoKKwkqIGV4dC9tcGVnMmVuYy9nc3RtcGVnMmVuY3BpY3R1cmVyZWFkZXIuY2M6CisJICBCdWdmaXggd2l0aCByZXNwZWN0IHRvIEVPUyBoYW5kbGluZy4KKworMjAwNC0wMS0xNiAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdlbmMuYzogKGdzdF9mZm1wZWdlbmNfY29ubmVjdCk6CisJICBMaW5rIHdpdGggcmlnaHQgY2FwcyAoZWxzZSwgaXQgc2VnZmF1bHRzKS4KKwkqIGV4dC9tcGxleC9nc3RtcGxleGpvYi5jYzoKKwkgIEZpeCBmb3Igc2xpZ2h0IEFQSSBjaGFuZ2UgaW4gMS42LjEuOTMgcmVsZWFzZSBvZiBtanBlZ3Rvb2xzLgorCisyMDA0LTAxLTE1ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC1saWJzL2dzdC9hdWRpby9NYWtlZmlsZS5hbToKKwlBZGQgZ3N0YXVkaW9maWx0ZXJ0ZW1wbGF0ZS5jIGFuZCBidWlsZGluZyBvZiBnc3RhdWRpb2ZpbHRlcmV4YW1wbGUuYworCWZyb20gdGhlIHRlbXBsYXRlLgorCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmM6CisJKiBnc3QtbGlicy9nc3QvYXVkaW8vZ3N0YXVkaW9maWx0ZXIuaDoKKwlBZGQgYnl0ZXNfcGVyX3NhbXBsZSBhbmQgc2l6ZSBhbmQgbl9zYW1wbGVzIGNhbGN1bGF0aW9uLgorCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyZXhhbXBsZS5jOgorCVJlbW92ZSwgbm93IGF1dG9nZW5lcmF0ZWQuCisJKiBnc3QtbGlicy9nc3QvYXVkaW8vZ3N0YXVkaW9maWx0ZXJ0ZW1wbGF0ZS5jOgorCU1vdmVkIGZyb20gZ3N0YXVkaW9maWx0ZXJleGFtcGxlLCBvYmplY3QgbmFtZSBjaGFuZ2VkLCBjb2RlIGFkZGVkCisJc28gdGhhdCBpdCBhY3R1YWxseSB3b3Jrcy4KKwkqIGdzdC1saWJzL2dzdC9hdWRpby9tYWtlX2ZpbHRlcjoKKwlTY3JpcHQgdG8gYnVpbGQgYW4gYXVkaW9maWx0ZXIgc3ViY2xhc3MgZnJvbSB0aGUgdGVtcGxhdGUuCisJKiBnc3QvY29sb3JzcGFjZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9jb2xvcnNwYWNlL3l1djJ5dXYuYzoKKwlSZW1vdmUgZmlsZSwgc2luY2UgaXQncyBHUEwsIGFuZCB3ZSBkb24ndCB1c2UgaXQuCisKKzIwMDQtMDEtMTUgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19jaGFpbik6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2NoYWluKTogTWFraW5nIGJvdGggb2YKKwl0aGVtIHVzZSB0aGUgYnVmZmVyIGZyZWUgZnVuY3Rpb24gdG8gdGVzdCBob3cgdGhlIGJ1ZmZlciB3YXMgYWxsb2NhdGVkLgorCisyMDA0LTAxLTE1ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfY2xhc3NfaW5pdCk6IFJlbW92ZSBwcm9wZXJ0eQorCXRoYXQgaGFuZGxlcyBvc3NzaW5rIGZhbGxiYWNrLgorCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogKGdzdF9hdWRpb19jb252ZXJ0X2luaXQpLAorCShnc3RfYXVkaW9fY29udmVydF9nZXRjYXBzKToKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfYXVkaW9fY2Fwcyk6CisJQWRkIGF1ZGlvL3gtcWRtMiBmb3IgUURNMiBhdWRpby4KKwkqIGdzdC9zaW5lL2dzdHNpbmVzcmMuYzogKGdzdF9zaW5lc3JjX2dldCk6CisJKiBnc3Qvc2luZS9nc3RzaW5lc3JjLmg6IEFkZCBleGFtcGxlIG9mIGhvdyB0byBpbXBsZW1lbnQgdGFncy4KKwkqIGdzdC92aWRlb3NjYWxlL2dzdHZpZGVvc2NhbGUuYzogKGdzdF92aWRlb3NjYWxlX2dldGNhcHMpOgorCURlY3JlYXNlIG1pbmltdW0gc2l6ZSB0byAxNngxNi4KKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCUNvbnZlcnQgZGlzYWJsZWQgcGFkIHRlbXBsYXRlIGNhcHMgdG8gbmV3IGNhcHMuCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3hjb250ZXh0X2dldCk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3hjb250ZXh0X2dldCksCisJKGdzdF94dmltYWdlc2lua19jaGFpbik6IFRocm93IGVsZW1lbnQgZXJyb3Igd2hlbiBkaXNwbGF5IGNhbm5vdAorCWJlIG9wZW5lZC4gIEluY3JlYXNlIG1pbmltdW0gZnJhbWVyYXRlIHRvIDEuMC4gIENoZWNrIHRoZSBkYXRhCisJZnJlZSBmdW5jdGlvbiBvbiBhIGJ1ZmZlciB0byBtYWtlIHN1cmUgaXQgaXMgdGhlIHR5cGUgd2UgZXhwZWN0CisJYmVmb3JlIG1hbmlwdWxhdGluZyBpdC4KKworMjAwNC0wMS0xNSAgSnVsaWVuIE1PVVRURSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzogKGdzdF92aWRlb2JhbGFuY2VfaW5pdCksCisJKGdzdF92aWRlb2JhbGFuY2VfY29sb3JiYWxhbmNlX3NldF92YWx1ZSk6IEltcGxlbWVudCBwYXNzdGhydSBpZgorCXNldHRpbmdzIGFyZSBpbiB0aGUgbWlkZGxlLgorCSogdG9vbHMvZ3N0LWxhdW5jaC1leHQuaW46IFN0b3AgdXNpbmcgeHZpZGVvc2luaywgdXNlIHhpbWFnZXNpbmsuCisKKzIwMDQtMDEtMTUgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9NYWtlZmlsZS5hbToKKwkqIGdzdC92b2x1bWUvTWFrZWZpbGUuYW06CisJICBTaW5jZSB3ZSB1c2UgdmlkZW9maWx0ZXIgc3ltYm9scywgbGluayB0byBpdC4KKworMjAwNC0wMS0xNSAgSnVsaWVuIE1PVVRURSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FtaXhlci5jOiAoZ3N0X2Fsc2FfbWl4ZXJfaW50ZXJmYWNlX2luaXQpOiBTZXR0aW5nCisJbWl4ZXIgaW50ZXJmYWNlIHR5cGUgdG8gSEFSRFdBUkUuCisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvbWl4ZXIuYzogKGdzdF9taXhlcl9jbGFzc19pbml0KTogQWRkaW5nIGEgZGVmYXVsdAorCXR5cGUgdG8gU09GVFdBUkUuCisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvbWl4ZXIuaDogQWRkaW5nIG1peGVyIGludGVyZmFjZSB0eXBlIGFuZCBtYWNyby4KKwkqIGdzdC1saWJzL2dzdC9taXhlci9taXhlcnRyYWNrLmg6IEFkZGluZyBtaXhlcnRyYWNrIGZsYWcgU09GVFdBUkUuCisJKiBnc3Qvdm9sdW1lL2dzdHZvbHVtZS5jOiAoZ3N0X3ZvbHVtZV9pbnRlcmZhY2Vfc3VwcG9ydGVkKSwKKwkoZ3N0X3ZvbHVtZV9pbnRlcmZhY2VfaW5pdCksIChnc3Rfdm9sdW1lX2xpc3RfdHJhY2tzKSwKKwkoZ3N0X3ZvbHVtZV9zZXRfdm9sdW1lKSwgKGdzdF92b2x1bWVfZ2V0X3ZvbHVtZSksCisJKGdzdF92b2x1bWVfc2V0X211dGUpLCAoZ3N0X3ZvbHVtZV9taXhlcl9pbml0KSwKKwkoZ3N0X3ZvbHVtZV9kaXNwb3NlKSwgKGdzdF92b2x1bWVfZ2V0X3R5cGUpLCAodm9sdW1lX2NsYXNzX2luaXQpLAorCSh2b2x1bWVfaW5pdCk6IEltcGxlbWVudGluZyBtaXhlciBpbnRlcmZhY2UuCisJKiBnc3Qvdm9sdW1lL2dzdHZvbHVtZS5oOiBBZGRpbmcgdHJhY2tsaXN0IGZvciBtaXhlciBpbnRlcmZhY2UuCisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuYzogKGdzdF9vc3NlbGVtZW50X2dldF90eXBlKSwKKwkoZ3N0X29zc2VsZW1lbnRfY2hhbmdlX3N0YXRlKTogUmVtb3Zpbmcgc29tZSB0cmFpbGluZyBjb21tYXMgaW4KKwlzdHJ1Y3R1cmVzLgorCSogc3lzL29zcy9nc3Rvc3NtaXhlci5jOiAoZ3N0X29zc21peGVyX2ludGVyZmFjZV9pbml0KTogU2V0dGluZyBtaXhlcgorCWludGVyZmFjZSB0eXBlIHRvIEhBUkRXQVJFLgorCSogc3lzL3Y0bC9nc3R2NGxjb2xvcmJhbGFuY2UuYzoKKwkoZ3N0X3Y0bF9jb2xvcl9iYWxhbmNlX2ludGVyZmFjZV9pbml0KTogU2V0dGluZyBjb2xvcmJhbGFuY2UgaW50ZXJmYWNlCisJdHlwZSB0byBIQVJEV0FSRS4KKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuYzoKKwkoZ3N0X3Y0bDJfY29sb3JfYmFsYW5jZV9pbnRlcmZhY2VfaW5pdCk6IFNldHRpbmcgY29sb3JiYWxhbmNlCisJaW50ZXJmYWNlIHR5cGUgdG8gSEFSRFdBUkUuCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2NoYWluKTogdXNlIGV4YWN0bHkgdGhlCisJc2FtZSBjb2RlIHRoYW4geGltYWdlc2luayBmb3IgZXZlbnQgaGFuZGxpbmcuCisKKzIwMDQtMDEtMTUgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9zbmFwc2hvdC9NYWtlZmlsZS5hbToKKwkqIGV4dC9zbmFwc2hvdC9nc3RzbmFwc2hvdC5jOiAoZ3N0X3NuYXBzaG90X3Npbmtjb25uZWN0KSwKKwkoZ3N0X3NuYXBzaG90X2NoYWluKToKKwkqIGV4dC9zbmFwc2hvdC9nc3RzbmFwc2hvdC5oOgorCSAgVGhpcyBoYXMgdG8gYmUgYSBqb2tlLi4uIFNuYXBzaG90IHNob3VsZCBiZSBjb25uZWN0ZWQgdG8gYSB0ZWUsCisJICBjb2xvcnNwYWNlIGVsZW1lbnQgYmVmb3JlIGl0IGFuZCBFT1MgYWZ0ZXIgdGhhdCwgd2hlcmUgdGhlIG90aGVyCisJICBzcmMgb2YgdGhlIHRlZSByZWNlaXZlcyBub3JtYWwgZGF0YS4KKwkgIFRoZSBjdXJyZW50IHdheSBpcyAqd3JvbmcqLgorCisyMDA0LTAxLTE1ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvaGVybWVzL2dzdGhlcm1lc2NvbG9yc3BhY2UuYzoKKwkgIEZpeCBhbm90aGVyIGNvbXBpbGUgZXJyb3IuIFNhbWUgYXMgYmVsb3cuCisKKzIwMDQtMDEtMTUgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9jb2xvcnNwYWNlL2dzdGNvbG9yc3BhY2UuYzoKKwkqIGdzdC9jb2xvcnNwYWNlL3l1djJ5dXYuYzogKGdzdF9jb2xvcnNwYWNlX3l1eTJfdG9faTQyMCksCisJKGdzdF9jb2xvcnNwYWNlX2k0MjBfdG9feXYxMik6CisJICBGaXggY29tcGlsaW5nLi4uIERpZG4ndCB0ZXN0IGlmIGl0IGFjdHVhbGx5IHdvcmtzLgorCisyMDA0LTAxLTE1ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9jb2xvcnNwYWNlL01ha2VmaWxlLmFtOgorCSogZ3N0L2NvbG9yc3BhY2UvZ3N0Y29sb3JzcGFjZS5jOgorCSogZ3N0L2NvbG9yc3BhY2UvZ3N0Y29sb3JzcGFjZS5oOgorCSogZ3N0L2NvbG9yc3BhY2UveXV2MnJnYi5jOgorCSogZ3N0L2NvbG9yc3BhY2UveXV2MnJnYi5oOgorCUR1cGxpY2F0ZSB0aGUgZXh0L2hlcm1lcyBjb2xvcnNwYWNlIHBsdWdpbiwgYW5kIHJlbW92ZSBIZXJtZXMKKwljb2RlIGFuZCBHUEwgY29kZS4gIEZpeCBmb3IgbmV3IGNhcHMgbmVnb3RpYXRpb24uICBSZXdyaXRlCisJbXVjaCBvZiB0aGUgZm9ybWF0IGhhbmRsaW5nIGNvZGUsIGFuZCBzb21lIG9mIHRoZSBjb252ZXJzaW9uCisJY29kZS4gIEJhc2ljYWxseSwgcmV3cm90ZSBhbG1vc3QgZXZlcnl0aGluZy4gIFRoaXMgZWxlbWVudAorCWhhbmRsZXMgSTQyMCwgWVYxMiB0byBSR0IgY29udmVyc2lvbnMuCisJKiBleHQvaGVybWVzL01ha2VmaWxlLmFtOgorCSogZXh0L2hlcm1lcy9nc3RoZXJtZXNjb2xvcnNwYWNlLmM6CisJUmVuYW1lIGNvbG9yc3BhY2UgdG8gaGVybWVzY29sb3JzcGFjZS4gIEZpeCBuZWdvdGlhdGlvbiBpc3N1ZXMuCisJUmVtb3ZlIG5vbi1IZXJtZXMgcmVsYXRlZCBjb2RlLiAgVGhpcyBlbGVtZW50IGhhbmRsZXMgbG90cyBvZgorCVJHQiB0byBSR0IgY29udmVyc2lvbnMsIGJ1dCBubyBZVVYuCisJKiBleHQvaGVybWVzL2dzdGNvbG9yc3BhY2UuYzoKKwkqIGV4dC9oZXJtZXMvZ3N0Y29sb3JzcGFjZS5oOgorCSogZXh0L2hlcm1lcy9yZ2IyeXV2LmM6CisJKiBleHQvaGVybWVzL3l1djJyZ2IuYzoKKwkqIGV4dC9oZXJtZXMveXV2MnJnYi5oOgorCSogZXh0L2hlcm1lcy95dXYycmdiX21teDE2LnM6CisJKiBleHQvaGVybWVzL3l1djJ5dXYuYzoKKwkqIGV4dC9oZXJtZXMveXV2Mnl1di5oOgorCVJlbW92ZSBvbGQgY29kZS4KKworMjAwNC0wMS0xNCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZXh0L21hZC9nc3RpZDN0YWcuYyAoZ3N0X2lkM190YWdfY2hhaW4pOiBEb24ndCBuZWdvIGNhcHMgaWYKKwl0aGV5J3ZlIGFscmVhZHkgYmVlbi4KKworMjAwNC0wMS0xNSAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X2lkM190YWdfZG9fY2Fwc19uZWdvKToKKwkgIGFzc3VtZSB0YWcgbW9kZSB3aGVuIHBhZCBpcyBub3QgY29ubmVjdGVkCisKKzIwMDQtMDEtMTUgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuYzogKGdzdF9hbHNhX3NpbmtfY2hlY2tfZXZlbnQpOgorCSAgRG9uJ3QgdXBkYXRlIHRoZSB0aW1lIG9mIHRoZSBjbG9jaworCShnc3RfYWxzYV9zaW5rX2xvb3ApOgorCSAgc3luYyB0byB0aGUgY2xvY2sgZ2l2ZW4gdG8gYWxzYXNpbmssIG5vdCB0aGUgb3duIGNsb2NrCisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3NzaW5rX2NoYWluKToKKwkgIHN5bmMgdG8gdGhlIGNsb2NrCisJKGdzdF9vc3NzaW5rX2NoYW5nZV9zdGF0ZSk6CisJICBhY3RpdmF0ZSB0aGUgY2xvY2sKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfY2hhaW4pOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19jaGFpbik6CisJICByZW1vdmUgYm9ndXMgY29kZSB0aGF0IG1hZGUgRElTQ09OVCBldmVudHMgdW5oYW5kbGVkCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKGdzdF9hc2ZfZGVtdXhfdmlkZW9fY2Fwcyk6CisJICBleHBsaWNpdGx5IGNhc2UgdG8gZG91YmxlIGluIF9zZXRfc2ltcGxlLiAoZml4ZXMgMm5kIHdhcm5pbmcgaW4gYnVnCisJICAjMTMxNTAyKQorCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6IChnc3RfYXNmX2RlbXV4X3JlYWRfb2JqZWN0X2hlYWRlciksCisJKGdzdF9hc2ZfZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQpLCAoZ3N0X2FzZl9kZW11eF9hdWRpb19jYXBzKSwKKwkoZ3N0X2FzZl9kZW11eF9hZGRfYXVkaW9fc3RyZWFtKSwgKGdzdF9hc2ZfZGVtdXhfdmlkZW9fY2Fwcyk6CisJICBjb252ZXJ0IGdfd2FybmluZyBiZWNhdXNlIG9mIHdyb25nIGFzZiBkYXRhIHRvIEdTVF9XQVJOSU5HcyAoZml4ZXMKKwkgIDJuZCB3YXJuaW5nIGluIGJ1ZyAjMTMxNTAyKQorCisyMDA0LTAxLTE0ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzogKGdzdF92aWRlb2JhbGFuY2VfaW5pdCksCisJKGdzdF92aWRlb2JhbGFuY2VfY29sb3JiYWxhbmNlX3NldF92YWx1ZSksCisJKGdzdF92aWRlb2JhbGFuY2VfY29sb3JiYWxhbmNlX2dldF92YWx1ZSk6IEZpeGluZyB2aWRlb2JhbGFuY2UgcmFuZ2VzCisJZm9yIGNvbG9yYmFsYW5jZSBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24uCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3hjb250ZXh0X2dldCksCisJKGdzdF94aW1hZ2VzaW5rX3NldF9wcm9wZXJ0eSksIChnc3RfeGltYWdlc2lua19nZXRfcHJvcGVydHkpLAorCShnc3RfeGltYWdlc2lua19kaXNwb3NlKSwgKGdzdF94aW1hZ2VzaW5rX2luaXQpLAorCShnc3RfeGltYWdlc2lua19jbGFzc19pbml0KTogQWRkaW5nIERJU1BMQVkgcHJvcGVydHkuCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuaDogQWRkaW5nIGRpc3BsYXlfbmFtZSB0byBzdG9yZSBkaXNwbGF5LgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua194Y29udGV4dF9nZXQpLAorCShnc3RfeHZpbWFnZXNpbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF94dmltYWdlc2lua19nZXRfcHJvcGVydHkpLAorCShnc3RfeHZpbWFnZXNpbmtfZGlzcG9zZSksIChnc3RfeHZpbWFnZXNpbmtfaW5pdCksCisJKGdzdF94dmltYWdlc2lua19jbGFzc19pbml0KTogQWRkaW5nIERJU1BMQVkgcHJvcGVydHkgYW5kIGNvbG9yYmFsYW5jZQorCXByb3BlcnRpZXMgKHRoZXkgc3RpbGwgbmVlZCBwb2xpc2hpbmcgdGhvdWdoIGZvciBnc3QtbGF1bmNoIHVzZSA6IG5vCisJeGNvbnRleHQgeWV0LCBpIGxsIGRvIHRoYXQgdG9tb3Jyb3cpLgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuaDogQWRkaW5nIGRpc3BsYXlfbmFtZSB0byBzdG9yZSBkaXNwbGF5LgorCisyMDA0LTAxLTE0ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9wbGF5L2dzdHBsYXkuYzogKGdzdF9wbGF5X3BpcGVsaW5lX3NldHVwKSwKKwkoZ3N0X3BsYXlfc2V0X2xvY2F0aW9uKSwgKGdzdF9wbGF5X3NldF92aXN1YWxpemF0aW9uKTogUHJlcGFyaW5nCisJc3dpdGNoIGludGVncmF0aW9uLCBhZGRpbmcgdmlkZW9iYWxhbmNlIGluIHRoZSBwaXBlbGluZS4KKworMjAwNC0wMS0xNCAgSnVsaWVuIE1PVVRURSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9jb2xvcmJhbGFuY2UvY29sb3JiYWxhbmNlLmM6CisJKGdzdF9jb2xvcl9iYWxhbmNlX2NsYXNzX2luaXQpOiBBZGRpbmcgYSBkZWZhdWx0IHR5cGUuCisJKiBnc3QtbGlicy9nc3QvY29sb3JiYWxhbmNlL2NvbG9yYmFsYW5jZS5oOiBBZGRpbmcgYSBtYWNybyB0byBhY2Nlc3MKKwl0aGUgdHlwZS4KKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzogKGdzdF92aWRlb2JhbGFuY2VfZ2V0X3R5cGUpLAorCShnc3RfdmlkZW9iYWxhbmNlX2Rpc3Bvc2UpLCAoZ3N0X3ZpZGVvYmFsYW5jZV9jbGFzc19pbml0KSwKKwkoZ3N0X3ZpZGVvYmFsYW5jZV9pbml0KSwgKGdzdF92aWRlb2JhbGFuY2VfaW50ZXJmYWNlX3N1cHBvcnRlZCksCisJKGdzdF92aWRlb2JhbGFuY2VfaW50ZXJmYWNlX2luaXQpLAorCShnc3RfdmlkZW9iYWxhbmNlX2NvbG9yYmFsYW5jZV9saXN0X2NoYW5uZWxzKSwKKwkoZ3N0X3ZpZGVvYmFsYW5jZV9jb2xvcmJhbGFuY2Vfc2V0X3ZhbHVlKSwKKwkoZ3N0X3ZpZGVvYmFsYW5jZV9jb2xvcmJhbGFuY2VfZ2V0X3ZhbHVlKSwKKwkoZ3N0X3ZpZGVvYmFsYW5jZV9jb2xvcmJhbGFuY2VfaW5pdCk6IEltcGxlbWVudGluZyBjb2xvcmJhbGFuY2UKKwlpbnRlcmZhY2UuCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmg6IEFkZGluZyBjb2xvcmJhbGFuY2UgY2hhbm5lbHMKKwlsaXN0LgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19zZXRfeHdpbmRvd19pZCk6IEZpeGluZyBhCisJYnVnIHdoaWNoIHdhcyB0cmlnZ2VyaW5nIGEgQmFkQWNjZXNzIFggZXJyb3Igd2hlbiBzZXR0aW5nIGFuIG92ZXJsYXkKKwliZWZvcmUgcGFkIHdhcyByZWFsbHkgbmVnb3RpYXRlZC4KKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfY29sb3JiYWxhbmNlX2luaXQpOgorCVVzaW5nIHRoZSBjb2xvcmJhbGFuY2UgdHlwZSBtYWNyby4KKworMjAwNC0wMS0xNCAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IChnc3RfZmxhY2VuY19zZXRfbWV0YWRhdGEpLAorCShnc3RfZmxhY2VuY19jaGFpbik6CisJICBoYW5kbGUgdGFncyBjb3JyZWN0bHkKKwkqIGdzdC90YWdzL2dzdGlkM3RhZy5jOiAoZ3N0X3RhZ19saXN0X25ld19mcm9tX2lkM3YxKToKKwkgIGV4dHJhY3QgSUQzdjEgdGFncyBjb3JyZWN0bHkKKworMjAwNC0wMS0xNCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChtYXRyb3NrYV90eXBlX2ZpbmQpLAorCShwbHVnaW5faW5pdCk6CisJICBJbXByb3ZlIG1hdHJvc2thIHR5cGVmaW5kaW5nIGZvciBvZGQtdHlwZWQgaGVhZGVycy4uLgorCisyMDA0LTAxLTE0ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfc3RyZWFtKToKKwkgIEZpeCBmb3IgdXNpbmcgaW5jcmVtZW50YWwgbnVtYmVyIG9uIHBhZG5hbWVzLgorCisyMDA0LTAxLTE0ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmM6CisJKiBleHQvZGl2eC9nc3RkaXZ4ZW5jLmM6CisJICBTZXQgY2F0ZWdvcnkgdG8gZGl2eDRsaW51eCBpbnN0ZWFkIG9mIGRpdnggKHRvbyBnZW5lcmljKS4KKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2luaXQpLAorCShnc3Rfd2F2cGFyc2VfcGFyc2VfZm10KSwgKGdzdF93YXZwYXJzZV9oYW5kbGVfc2lua19ldmVudCksCisJKGdzdF93YXZwYXJzZV9sb29wKSwgKGdzdF93YXZwYXJzZV9jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICBmaXggcGFyc2luZyBvZiBXQVYgZmlsZXMgd2l0aCBub24tc3RhbmRhcmQgZm10LXRhZyBzaXplIGFuZCBmaXgKKwkgIHNraXBwaW5nIG9mIHVucmVjb2duaXplZCBjaHVua3MuLi4gU29tZW9uZSBwbGVhc2UgZml4IHRoaXMgdGhpbmcKKwkgIHRvIHVzZSByaWZmbGliIHNvIGFsbCB0aGlzIGlzIGF1dG9tYXRlZC4KKwkqIHN5cy92NGwvTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkgIEFkZCBYX0NGTEFHUyBiZWNhdXNlIHdlIGRlcGVuZCBvbiBYIChmb3Igb3ZlcmxheSkuCisKKzIwMDQtMDEtMTQgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZXh0L21wZWcyZGVjL2dzdG1wZWcyZGVjLmM6CisJICBEb24ndCBpc3N1ZSBhIHRpbWVzdGFtcCB1bmxlc3Mgd2UgdGFnZ2VkIHRoZSBmcmFtZQorCSAgd2l0aCBhIFBUUy4KKworMjAwNC0wMS0xNCAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBnc3QtbGlicy9nc3QvcGxheS9nc3RwbGF5LmM6IChnc3RfcGxheV90aWNrX2NhbGxiYWNrKToKKwkgIFF1ZXJ5IHRoZSBhdWRpbyBlbGVtZW50IHRvIGdldCB0aGUgdGltZSwgbm90IHRoZSBjbG9jay4gV2UncmUKKwkgIGludGVyZXN0ZWQgaW4gdGhlIGVsZW1lbnQncyB0aW1lIGhlcmUuCisKKzIwMDQtMDEtMTQgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jOiAoZ3N0X2Fhc2lua19jaGFpbik6CisJKiBleHQvYWxzYS9nc3RhbHNhc2luay5jOiAoZ3N0X2Fsc2Ffc2lua19jaGVja19ldmVudCk6CisJKiBleHQvZXNkL2VzZHNpbmsuYzogKGdzdF9lc2RzaW5rX2NoYWluKToKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmM6IChnc3RfY2FjYXNpbmtfY2hhaW4pOgorCSogZXh0L21hcy9tYXNzaW5rLmM6IChnc3RfbWFzc2lua19jaGFpbik6CisJKiBleHQvc2RsL3NkbHZpZGVvc2luay5jOiAoZ3N0X3NkbHZpZGVvc2lua19jaGFpbik6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmRleCksCisJKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9tZXRhZGF0YSk6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVncGFyc2UuYzogKGdzdF9tcGVnX3BhcnNlX2xvb3ApLAorCShnc3RfbXBlZ19wYXJzZV9yZWxlYXNlX2xvY2tzKToKKwkqIGdzdC90Y3AvZ3N0dGNwc2luay5jOiAoZ3N0X3RjcHNpbmtfY2hhaW4pOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6IChnc3RfdWRwc2lua19jaGFpbik6CisJKiBnc3QvdmlkZW90ZXN0c3JjL2dzdHZpZGVvdGVzdHNyYy5jOiAoZ3N0X3ZpZGVvdGVzdHNyY19nZXQpOgorCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IChnc3Rfb3Nzc2lua19pbml0KSwgKGdzdF9vc3NzaW5rX2NoYWluKSwKKwkoZ3N0X29zc3NpbmtfY2hhbmdlX3N0YXRlKToKKwkqIHN5cy92NGwvZ3N0djRsbWpwZWdzaW5rLmM6IChnc3RfdjRsbWpwZWdzaW5rX2NoYWluKToKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfY2hhaW4pOgorCSogc3lzL3h2aWRlby94dmlkZW9zaW5rLmM6IChnc3RfeHZpZGVvc2lua19jaGFpbiksCisJKGdzdF94dmlkZW9zaW5rX3JlbGVhc2VfbG9ja3MpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19jaGFpbik6CisJICB1c2UgZWxlbWVudCB0aW1lLgorCSogZXh0L2Fsc2EvZ3N0YWxzYWNsb2NrLmM6IChnc3RfYWxzYV9jbG9ja19zdGFydCksCisJKGdzdF9hbHNhX2Nsb2NrX3N0b3ApOgorCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL2F1ZGlvY2xvY2suYzogKGdzdF9hdWRpb19jbG9ja19zZXRfYWN0aXZlKSwKKwkoZ3N0X2F1ZGlvX2Nsb2NrX2dldF9pbnRlcm5hbF90aW1lKToKKwkgIHNpbXBsaWZ5IGZvciB1c2Ugd2l0aCBuZXcgY2xvY2tpbmcgY29kZS4KKwkqIHRlc3RzdWl0ZS9hbHNhL01ha2VmaWxlLmFtOgorCSogdGVzdHN1aXRlL2Fsc2Evc2luZXNyYy5jOiAoc2luZXNyY19pbml0KSwgKHNpbmVzcmNfZm9yY2VfY2Fwcyk6CisJICBmaXggdGVzdHN1aXRlIGZvciBuZXcgY2FwcyBzeXN0ZW0KKworMjAwNC0wMS0xNCAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY2RlY191cGRhdGVfbWV0YWRhdGEpOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOiAoYWRkX29uZV90YWcpOgorCSAgbGVuZ3RoIGlzIGFscmVhZHkgaG9zdCBlbmRpYW4sIG5vIG5lZWQgdG8gY29udmVydC4gRml4ZXMgcGxheWJhY2sgb2YKKwkgIHRhZ2dlZCBmaWxlcyBvbiBQUEMuIChidWcgIzEyODM4NCkKKworMjAwNC0wMS0xMyAgSnVsaWVuIE1PVVRURSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9jb2xvcmJhbGFuY2UvY29sb3JiYWxhbmNlLmg6IEFkZGluZyBhIHR5cGUgdG8gdGhlCisJY29sb3JiYWxhbmNlIGludGVyZmFjZSBzdGF0aW5nIGlmIGl0IGlzIGhhcmR3YXJlIGJhc2VkIG9yIHNvZnR3YXJlCisJYmFzZWQuCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6IChnc3RfdmlkZW9iYWxhbmNlX3BsYW5hcjQxMSk6CisJUmVtb3ZpbmcgYSB0cmFpbGluZyBjb21tYS4KKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NvbG9yYmFsYW5jZV9pbml0KTogSW50ZWdyYXRpbmcgYSBwYXRjaCBmcm9tIEpvbgorCVRyb3dicmlkZ2UgPHRyb3dAeGltaWFuLmNvbT4gcXVlcnlpbmcgWHYgYWRhcHRvciBmb3IgbWluL21heCB2YWx1ZSBhcworCXRoZSBkb2N1bWVudGF0aW9uIHNlZW1zIHRvIGJlIHdyb25nIG9uIHRoZSAtMTAwMCB0byAxMDAwIGludGVydmFsLgorCisyMDA0LTAxLTEyICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9kZWJ1Zy9lZmVuY2UuYzogKGdzdF9lZmVuY2VfaW5pdCksIChnc3RfZWZlbmNlX2NoYWluKSwKKwkoZ3N0X2VmZW5jZV9idWZmZXJfYWxsb2MpLCAoZ3N0X2ZlbmNlZF9idWZmZXJfbmV3KSwKKwkoZ3N0X2ZlbmNlZF9idWZmZXJfZGVmYXVsdF9mcmVlKSwgKGdzdF9mZW5jZWRfYnVmZmVyX2RlZmF1bHRfY29weSk6CisJRml4IG5lZ290aWF0aW9uLiAgQWRkIGEgYnVmZmVyYWxsb2MgZnVuY3Rpb24gZm9yIHRoZSBzaW5rIHBhZCwKKwlhbmQgZ2VuZXJhbGx5IGNsZWFuIHVwIHNvbWUgb2YgdGhlIGNvZGUuCisKKzIwMDQtMDEtMTIgIEp1bGllbiBNT1VUVEUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBnc3QtbGlicy9nc3QvY29sb3JiYWxhbmNlL2NvbG9yYmFsYW5jZWNoYW5uZWwuYzoKKwkoZ3N0X2NvbG9yX2JhbGFuY2VfY2hhbm5lbF9kaXNwb3NlKTogQWRkaW5nIHNhZmV0eSBjaGVjayBpbiBkaXNwb3NlCisJbWV0aG9kLgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua194Y29udGV4dF9nZXQpLAorCShnc3RfeHZpbWFnZXNpbmtfeGNvbnRleHRfY2xlYXIpLAorCShnc3RfeHZpbWFnZXNpbmtfaW50ZXJmYWNlX3N1cHBvcnRlZCksCisJKGdzdF94dmltYWdlc2lua19jb2xvcmJhbGFuY2VfbGlzdF9jaGFubmVscyksCisJKGdzdF94dmltYWdlc2lua19jb2xvcmJhbGFuY2Vfc2V0X3ZhbHVlKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NvbG9yYmFsYW5jZV9nZXRfdmFsdWUpLAorCShnc3RfeHZpbWFnZXNpbmtfY29sb3JiYWxhbmNlX2luaXQpLCAoZ3N0X3h2aW1hZ2VzaW5rX2dldF90eXBlKToKKwlBZGRpbmcgY29sb3JiYWxhbmNlIGludGVyZmFjZSBzdXBwb3J0IHRvIHNldCBYViBwYXJhbWV0ZXJzIHN1Y2ggYXMKKwlIVUUsIEJSSUdIVE5FU1MsIENPTlRSQVNULCBTQVRVUkFUSU9OLgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuaDogQWRkaW5nIHRoZSBjaGFubmVscyBsaXN0IGZvciBjb2xvcmJhbGFuY2UKKwlpbnRlcmZhY2UuCisKKzIwMDQtMDEtMTIgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6IChnc3RfYXVkaW9fY29udmVydF9nZXRfdHlwZSksCisJKGdzdF9hdWRpb19jb252ZXJ0X2NsYXNzX2luaXQpLCAoZ3N0X2F1ZGlvY29udmVydF9nZXRjYXBzKSwKKwkoZ3N0X2F1ZGlvX2NvbnZlcnRfaW5pdCksIChnc3RfYXVkaW9fY29udmVydF9zZXRfcHJvcGVydHkpLAorCShnc3RfYXVkaW9fY29udmVydF9nZXRfcHJvcGVydHkpLCAoZ3N0X2F1ZGlvX2NvbnZlcnRfY2hhaW4pLAorCShnc3RfYXVkaW9fY29udmVydF9saW5rKSwKKwkoZ3N0X2F1ZGlvX2NvbnZlcnRfYnVmZmVyX3RvX2RlZmF1bHRfZm9ybWF0KSwKKwkoZ3N0X2F1ZGlvX2NvbnZlcnRfYnVmZmVyX2Zyb21fZGVmYXVsdF9mb3JtYXQpLCAocGx1Z2luX2luaXQpOgorICAgICAgICAgIC0gaW1wbGVtZW50IF9nZXRjYXBzIGFuZCB1c2UgaXQKKyAgICAgICAgICAtIGltcHJvdmUgbGlua2luZworICAgICAgICAgIC0gcmVtb3ZlIGZsb2F0IGNhcHMgc2luY2Ugbm8gZmxvYXQgY29udmVyc2lvbiBpcyBhY3R1YWxseSBkb25lCisgICAgICAgICAgLSByZW1vdmUgcHJvcGVydGllcyBhbmQgYXJndW1lbnRzIHRoYXQgd2VyZSB0byBiZSB1c2VkIGZvciByYXRlCisgICAgICAgICAgICBjb252ZXJzaW9uCisKKzIwMDQtMDEtMTIgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC1saWJzL2dzdC9hdWRpby9hdWRpby5jOiAoX2dzdF9hdWRpb19zdHJ1Y3R1cmVfc2V0X2xpc3QpLAorCShnc3RfYXVkaW9fc3RydWN0dXJlX3NldF9pbnQpOgorCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL2F1ZGlvLmg6CisgICAgICAgICAgYWRkIGhlbHBlciBmdW5jdGlvbnMgZm9yIF9nZXRjYXBzIG1hdGNoaW5nIHRoZSBzdGFuZGFyZCBhdWRpbworICAgICAgICAgIHRlbXBsYXRlcworCisyMDA0LTAxLTEyICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6IChnc3RfYXVkaW9fY29udmVydF9saW5rKToKKwlUZXN0IHRoYXQgcGFkIGlzIG5lZ290aWF0ZWQgYmVmb3JlIGdldHRpbmcgaXRzIGNhcHMuCisKKzIwMDQtMDEtMTIgIEp1bGllbiBNT1VUVEUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcGxheS9nc3RwbGF5LmM6IChnc3RfcGxheV9nZXRfc2lua19lbGVtZW50KTogV2hlbgorCWFuYWx5emluZyB0aGUgcGFkcyBvZiBhbiBlbGVtZW50IHRoZSBiaW4gaXMgbW9zdGx5IGluIFJFQURZIHN0YXRlIHNvCisJbm8gY2FwcyB3ZXJlIG5lZ290aWF0ZWQuIFRoaXMgaGVscGVyIGZ1bmN0aW9uIG5lZWRzIHRvIHdvcmsgd2l0aAorCV9nZXRfY2FwcyBkaXJlY3RseSB0aGVuLiBJIHdhcyBub3QgZnJlZWluZyB0aGVtIHRob3VnaCwgYWRkZWQgdGhhdCB0bworCWZpeCB0aGUgbWVtIGxlYWsuCisKKzIwMDQtMDEtMTIgIEp1bGllbiBNT1VUVEUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2NoYWluKToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfY2hhaW4pOiBGaXhpbmcgdGhlCisJZGlyZWN0IHB1dCBidWZmZXJzIGRldGVjdGlvbi4gSSBwcmVmZXIgY2hlY2tpbmcgR1NUX0JVRkZFUl9QUklWQVRFCisJdGhhbiB0aGUgZnJlZV9mdW5jLgorCisyMDA0LTAxLTEyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBzeXMvb3NzL2dzdG9zc2F1ZGlvLmM6IChwbHVnaW5faW5pdCk6CisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuYzogKGdzdF9vc3NlbGVtZW50X3N5bmNfcGFybXMpOgorCSogc3lzL29zcy9nc3Rvc3NlbGVtZW50Lmg6CisgICAgICAgICAgbWFrZSBhbiBvc3MgZGVidWdnaW5nIGNhdGVnb3J5CisgICAgICAgICAgbWFrZSBmYWlsdXJlIG1vcmUgZGVzY3JpcHRpdmUKKworMjAwNC0wMS0xMSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZy5jOgorCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdjb2RlY21hcC5jOgorCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdkZWMuYzoKKwkqIGV4dC9mZm1wZWcvZ3N0ZmZtcGVnZW5jLmM6CisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ3Byb3RvY29sLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGthbmltYXRpb24uYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWcuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nLmM6CisJKiBleHQvbXBlZzJkZWMvcGVyZnRlc3QuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleC5jOgorCSogZ3N0LWxpYnMvZ3N0L3Jlc2FtcGxlL2R0b3MuYzoKKwkqIGdzdC9pbnRmbG9hdC9nc3RpbnRmbG9hdGNvbnZlcnQuYzoKKwkqIGdzdC9vbmV0b24vZ3N0b25ldG9uLmM6CisJKiBnc3QvcnRqcGVnL1JUanBlZy5jOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIHN5cy9keHIzL2R4cjNpbml0LmM6CisJKiBzeXMvZ2xzaW5rL2dzdGdsX252aW1hZ2UuYzoKKwkqIHN5cy9nbHNpbmsvZ3N0Z2xfcGRyaW1hZ2UuYzoKKwkqIHN5cy9nbHNpbmsvZ3N0Z2xzaW5rLmM6CisJKiB0ZXN0c3VpdGUvZ3N0LWxpbnQ6CisJTWFrZSBzdXJlIGV2ZXJ5Ym9keSB3cmFwcyAjaW5jbHVkZSAiY29uZmlnLmgiIGluICNpZmRlZiBIQVZFX0NPTkZJR19ICisKKzIwMDQtMDEtMTEgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYXNyYy5jOiAoZ3N0X2Fsc2Ffc3JjX3NldF9jYXBzKToKKwkqIGV4dC9mYWFjL2dzdGZhYWMuYzogKGdzdF9mYWFjX3Npbmtjb25uZWN0KToKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka2FuaW1hdGlvbi5jOgorCShnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX2NyZWF0ZV9waXhidWYpOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6IChnc3RfZ2RrX3BpeGJ1Zl9zaW5rX2xpbmspLAorCShnc3RfZ2RrX3BpeGJ1Zl9jaGFpbik6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuaDoKKwkqIGV4dC9qYWNrL2dzdGphY2suYzogKGdzdF9qYWNrX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQveHZpZC9nc3R4dmlkZGVjLmM6IChnc3RfeHZpZGRlY19zaW5rX2xpbmspOgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvZ3N0cGxheS5jOiAoZ3N0X3BsYXlfZ2V0X3NpbmtfZWxlbWVudCk6CisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5LmM6IChnc3RfcGxheV9nZXRfc2lua19lbGVtZW50KToKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZpbHRlci5jOgorCShnc3RfdmlkZW9maWx0ZXJfc2V0X291dHB1dF9zaXplKToKKwlSZW1vdmUgYWxsIHVzYWdlIG9mIGdzdF9wYWRfZ2V0X2NhcHMoKSwgYW5kIHJlcGxhY2UgaXQgd2l0aAorCWdzdF9wYWRfZ2V0X2FsbG93ZWRfY2FwcygpIG9yIGdzdF9wYWRfZ2V0X25lZ290aWF0ZWRfY2FwKCkuCisKKzIwMDQtMDEtMTEgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L01ha2VmaWxlLmFtOiBGaXhlcyB0byBtYWtlIGV4dC9saWJjYWNhIGNvbXBpbGUuCisJKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKGdzdF9nZGtfcGl4YnVmX3NpbmtfbGluayksCisJKGdzdF9nZGtfcGl4YnVmX2luaXQpLCAoZ3N0X2dka19waXhidWZfY2hhaW4pOiBNYWtlIGdka3BpeGJ1ZmRlYworCWhhbmRsZSBpbWFnZXMgdGhhdCBzcGFuIG11bHRpcGxlIGJ1ZmZlcnMuICBOb3cgd29yayB3aXRoIGJvdGgKKwlmaWxlc3JjICEgZ2RrcGl4YnVmZGVjIGFuZCBxdGRlbXV4ICEgZ2RrcGl4YnVmZGVjLgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmg6CisJKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5oOiBGaXhlcyBuZWVkZWQgZHVlIHRvIHJlY2VudAorCXZpZGVvL3ZpZGVvLmggY2hhbmdlcworCSogZXh0L3h2aWQvZ3N0eHZpZC5jOiAoZ3N0X3h2aWRfY3NwX3RvX2NhcHMpOiBzYW1lCisJKiBzeXMvdjRsL2dzdHY0bG1qcGVnc3JjLmM6IChnc3RfdjRsbWpwZWdzcmNfZ2V0KSwKKwkoZ3N0X3Y0bG1qcGVnc3JjX2J1ZmZlcl9mcmVlKTogVXNlIGJ1ZmZlciBmcmVlIGZ1bmN0aW9uIGluc3RlYWQKKwlvZiBHc3REYXRhIGZyZWUgZnVuY3Rpb24uCisJKiBzeXMvdjRsL2dzdHY0bHNyYy5jOiAoZ3N0X3Y0bHNyY19nZXQpLCAoZ3N0X3Y0bHNyY19idWZmZXJfZnJlZSk6CisJc2FtZS4KKworMjAwNC0wMS0xMiAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyZWxlbWVudC5jOiAoZ3N0X3Y0bDJlbGVtZW50X2NsYXNzX2luaXQpLAorCShnc3RfdjRsMmVsZW1lbnRfZGlzcG9zZSksIChnc3RfdjRsMmVsZW1lbnRfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3Y0bDJlbGVtZW50X2dldF9wcm9wZXJ0eSk6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6IChnc3RfdjRsMl9zZXRfZGVmYXVsdHMpLCAoZ3N0X3Y0bDJfb3Blbik6CisJICBhZGQgbm9ybSwgY2hhbm5lbCBhbmQgZnJlcXVlbmN5IHByb3BlcnRpZXMuCisJKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuYzoKKwkgIGZpeGVzIGZvciB0dW5lciBpbnRlcmZhY2UgY2hhbmdlcworCSogc3lzL3Y0bDIvZ3N0djRsMmVsZW1lbnQuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuaDoKKwkgIHJld29yayB2NGwyc3JjIHRvIHdvcmsgd2l0aCBzYWExNzM0IGNhcmRzIGFuZCBhbGxvdyBtbWFwZWQgYnVmZmVycy4KKworMjAwNC0wMS0xMiAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBnc3QtbGlicy9nc3QvdHVuZXIvdHVuZXIuYzogKGdzdF90dW5lcl9jbGFzc19pbml0KSwKKwkoZ3N0X3R1bmVyX2ZpbmRfbm9ybV9ieV9uYW1lKSwgKGdzdF92NGwyX2ZpbmRfY2hhbm5lbF9ieV9uYW1lKSwKKwkoZ3N0X3R1bmVyX2NoYW5uZWxfY2hhbmdlZCksIChnc3RfdHVuZXJfbm9ybV9jaGFuZ2VkKSwKKwkoZ3N0X3R1bmVyX2ZyZXF1ZW5jeV9jaGFuZ2VkKSwgKGdzdF90dW5lcl9zaWduYWxfY2hhbmdlZCk6CisJKiBnc3QtbGlicy9nc3QvdHVuZXIvdHVuZXIuaDoKKwkgIEdPYmplY3RzIGFyZW4ndCBjb25zdC4KKwkgIEFkZCBmaW5kX2J5X25hbWUgZnVuY3Rpb25zLgorCSAgQWRkIGNoZWNrcyB0byBfY2hhbmdlZCBmdW5jdGlvbnMuCisJKiBzeXMvdjRsL2dzdHY0bHR1bmVyLmM6IChnc3RfdjRsX3R1bmVyX2dldF9jaGFubmVsKSwKKwkoZ3N0X3Y0bF90dW5lcl9nZXRfbm9ybSk6CisJICBGaXhlcyBmb3IgYWJvdmUuCisKKzIwMDQtMDEtMTIgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZ3N0LWxpYnMvZ3N0L3ZpZGVvL3ZpZGVvLmg6CisJICBGaXggY2FwcyB0ZW1wbGF0ZSBuYW1lcyB0byBiZSB1bmRlcnN0YW5kYWJsZS4KKwkgIFByZWZpeCBldmVyeXRoaW5nIHdpdGggR1NUX1ZJREVPLgorCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2RpdngvZ3N0ZGl2eGRlYy5jOgorCSogZXh0L2RpdngvZ3N0ZGl2eGVuYy5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJKiBleHQvaGVybWVzL2dzdGNvbG9yc3BhY2UuYzogKGdzdF9jb2xvcnNwYWNlX2Jhc2VfaW5pdCk6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6IChyYXdfY2Fwc19mYWN0b3J5KToKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzogKHJhd19jYXBzX2ZhY3RvcnkpOgorCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6IChyYXdfY2Fwc19mYWN0b3J5KToKKwkqIGV4dC9zbmFwc2hvdC9nc3RzbmFwc2hvdC5jOgorCSogZXh0L3N3ZmRlYy9nc3Rzd2ZkZWMuYzoKKwkqIGV4dC94dmlkL2dzdHh2aWRkZWMuYzoKKwkqIGV4dC94dmlkL2dzdHh2aWRlbmMuYzoKKwkqIGdzdC9jaGFydC9nc3RjaGFydC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RlZmZlY3R2LmM6CisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOiAoZ3N0X2ZseGRlY19sb29wKToKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkqIGdzdC9tZWRpYW4vZ3N0bWVkaWFuLmM6CisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOiAoZ3N0X21vbm9zY29wZV9pbml0KSwKKwkoZ3N0X21vbm9zY29wZV9zcmNjb25uZWN0KSwgKGdzdF9tb25vc2NvcGVfY2hhaW4pOgorCSogZ3N0L292ZXJsYXkvZ3N0b3ZlcmxheS5jOgorCSogZ3N0L3Ntb290aC9nc3RzbW9vdGguYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSogZ3N0L3N5bmFlc3RoZXNpYS9nc3RzeW5hZXN0aGVzaWEuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJKiBnc3QvdmlkZW9kcm9wL2dzdHZpZGVvZHJvcC5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkqIHN5cy9xY2FtL2dzdHFjYW1zcmMuYzoKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6IChnc3RfdjRsc3JjX3BhbGV0dGVfdG9fY2Fwcyk6CisJICBNYWtlIHRoZW0gd29yayB3aXRoIG5ldyB2aWRlby5oIGZpbGUuCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2NoYWluKSwKKwkoZ3N0X3hpbWFnZXNpbmtfYnVmZmVyX2ZyZWUpLCAoZ3N0X3hpbWFnZXNpbmtfYnVmZmVyX2FsbG9jKToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfY2hhaW4pLAorCShnc3RfeHZpbWFnZXNpbmtfYnVmZmVyX2ZyZWUpLCAoZ3N0X3h2aW1hZ2VzaW5rX2J1ZmZlcl9hbGxvYyk6CisJICBNYWtlIGl0IHdvcmsgd2l0aCBuZXcgYnVmZmVyIGFsbG9jYXRpb24gc3lzdGVtLgorCisyMDA0LTAxLTExICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGV4dC9mZm1wZWcvZ3N0ZmZtcGVnY29sb3JzcGFjZS5jOiAoZ3N0X2ZmbXBlZ2NzcF9jaGFpbik6IEZpeGluZyB0aGUKKwlwYWRfYWxsb2NfYnVmZmVyIGltcGxlbWVudGF0aW9uIHRvIHVzZSAtPnNyY3BhZAorCSogZXh0L2hlcm1lcy9nc3Rjb2xvcnNwYWNlLmM6IChnc3RfY29sb3JzcGFjZV9jaGFpbik6IEZpeGluZyB0aGUKKyAgICAgICAgcGFkX2FsbG9jX2J1ZmZlciBpbXBsZW1lbnRhdGlvbiB0byB1c2UgLT5zcmNwYWQKKwkqIGdzdC92aWRlb3NjYWxlL2dzdHZpZGVvc2NhbGUuYzogKGdzdF92aWRlb3NjYWxlX2NoYWluKTogIEZpeGluZyB0aGUKKyAgICAgICAgcGFkX2FsbG9jX2J1ZmZlciBpbXBsZW1lbnRhdGlvbiB0byB1c2UgLT5zcmNwYWQKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfeGltYWdlX25ldyksCisJKGdzdF94aW1hZ2VzaW5rX2NoYWluKSwgKGdzdF94aW1hZ2VzaW5rX2J1ZmZlcl9mcmVlKSwKKwkoZ3N0X3hpbWFnZXNpbmtfYnVmZmVyX2FsbG9jKTogTm93IG9ubHkgdXNlIEdTVF9CVUZGRVJfUFJJVkFURSB0byBrZWVwCisJYSByZWZlcmVuY2UgdG8gZXZlcnl0aGluZyB3ZSBuZWVkLgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmg6IGFkZGluZyBhIHJlZmVyZW5jZSB0byB0aGUgc2luayBpbiB0aGUgaW1hZ2UuCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3h2aW1hZ2VfbmV3KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NoYWluKSwgKGdzdF94dmltYWdlc2lua19idWZmZXJfZnJlZSksCisJKGdzdF94dmltYWdlc2lua19idWZmZXJfYWxsb2MpOiBOb3cgb25seSB1c2UgR1NUX0JVRkZFUl9QUklWQVRFIHRvIGtlZXAKKyAgICAgICAgYSByZWZlcmVuY2UgdG8gZXZlcnl0aGluZyB3ZSBuZWVkLgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuaDogYWRkaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBzaW5rIGluIHRoZSBpbWFnZQorCisyMDA0LTAxLTExICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9kaXZ4L2dzdGRpdnhlbmMuYzogcmVtb3ZlIGJvZ3VzIGdzdF9jYXBzX2lzX2ZpeGVkKCkgdGVzdAorCSogZ3N0L2RlYnVnL2VmZW5jZS5jOiAoZ3N0X2VmZW5jZV9jaGFpbiksIChnc3RfZmVuY2VkX2J1ZmZlcl9uZXcpLAorCShnc3RfZmVuY2VkX2J1ZmZlcl9kZWZhdWx0X2NvcHkpOiBGaXggZm9yIHJlbmFtZSBvZiBidWZmZXIgcHJpdmF0ZQorCXN0cnVjdHVyZSBtZW1iZXJzLgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOiAoZ3N0X3dhcnB0dl9zZXR1cCk6IERvbid0IHJlc2V0IHRoZSB0aW1lCisJdmFsdWUgZHVyaW5nIGEgcmVzaXplL3JlbmVnb3RpYXRpb24uCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9maWx0ZXIuYzogKGdzdF92aWRlb2ZpbHRlcl9jaGFpbik6IHVzZQorCWdzdF9wYWRfYWxsb2NfYnVmZmVyKCk7CisJKiBzeXMvdjRsL2dzdHY0bG1qcGVnc3JjLmM6IChnc3RfdjRsbWpwZWdzcmNfZ2V0KSwKKwkoZ3N0X3Y0bG1qcGVnc3JjX2J1ZmZlcl9mcmVlKTogRml4IGZvciByZW5hbWUgb2YgYnVmZmVyIHByaXZhdGUKKwlzdHJ1Y3R1cmUgbWVtYmVycy4KKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6IChnc3RfdjRsc3JjX2dldCksIChnc3RfdjRsc3JjX2J1ZmZlcl9mcmVlKToKKwlGaXggZm9yIHJlbmFtZSBvZiBidWZmZXIgcHJpdmF0ZSBzdHJ1Y3R1cmUgbWVtYmVycy4KKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfY2hhaW4pLAorCShnc3RfeGltYWdlc2lua19idWZmZXJfZnJlZSksIChnc3RfeGltYWdlc2lua19idWZmZXJfYWxsb2MpOgorCUZpeCBmb3IgcmVuYW1lIG9mIGJ1ZmZlciBwcml2YXRlIHN0cnVjdHVyZSBtZW1iZXJzLgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19jaGFpbiksCisJKGdzdF94dmltYWdlc2lua19idWZmZXJfZnJlZSksIChnc3RfeHZpbWFnZXNpbmtfYnVmZmVyX2FsbG9jKToKKwlGaXggZm9yIHJlbmFtZSBvZiBidWZmZXIgcHJpdmF0ZSBzdHJ1Y3R1cmUgbWVtYmVycy4KKworMjAwNC0wMS0xMSAgQXJ3ZWQgdi4gTWVya2F0eiA8di5tZXJrYXR6QGdteC5uZXQ+CisKKwlyZXZpZXdlZCBieTogRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jOiBHYW1tYSBjb3JyZWN0aW9uIGZpbHRlci4gIE1vZGlmaWVkCisJZnJvbSB0aGUgcGF0Y2ggYnkgZHMgdG8gZml0IGluIHdpdGggcmVjZW50IG1ha2VfZmlsdGVyIGNoYW5nZXMuCisKKzIwMDQtMDEtMTEgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogY29uZmlndXJlLmFjOiBBZGRpbmcgZXhhbXBsZXMvc3dpdGNoL01ha2VmaWxlCisJKiBleGFtcGxlcy9NYWtlZmlsZS5hbTogQWRkaW5nIGV4YW1wbGVzL3N3aXRjaAorCSogZXhhbXBsZXMvc3dpdGNoL01ha2VmaWxlLmFtOiBBZGRpbmcgc3dpdGNoZXIgZXhhbXBsZS4KKwkqIGV4YW1wbGVzL3N3aXRjaC9zd2l0Y2hlci5jOiAoZ290X2VvcyksIChpZGxlX2l0ZXJhdGUpLAorCShzd2l0Y2hfdGltZXIpLCAobWFpbik6IEFkZGluZyBhbiBleGFtcGxlIGRlbW9uc3RyYXRpbmcgc3dpdGNoIHVzYWdlCisJd2l0aCAyIHZpZGVvdGVzdHNyYyBzaG93aW5nIGRpZmZlcmVudCBwYXR0ZXJucy4KKwkqIGdzdC9zd2l0Y2gvZ3N0c3dpdGNoLmM6IChnc3Rfc3dpdGNoX3JlcXVlc3RfbmV3X3BhZCksCisJKGdzdF9zd2l0Y2hfaW5pdCk6IEZpeGluZyBzd2l0Y2ggd2l0aCB0aGUgbmV3IGNhcHMgc3lzdGVtLgorCisyMDA0LTAxLTExICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC1saWJzL2dzdC92aWRlby92aWRlby5oOgorCSAgRml4IDMyYml0IGNhcHMuIElzc3VlIHJlbWFpbmluZzogVGhlIG1hY3JvIG5hbWVzIGFyZSBjaG9zZW4gcG9vcmx5LgorCSAgVGhleSBzaG91bGQgcHJvYmFibHkgYmUgbGlrZQorCSAgR1NUX1ZJREVPX1BBRF9URU1QTEFURV9DQVBTX3tSR0IsQkdSLFJHQngsQkdSeH0uCisKKzIwMDQtMDEtMTEgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfbG9vcF9oZWFkZXIpLAorCShxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgZml4IGF1ZGlvIGNodW5rIHNpemUvdGltZXN0YW1wIGNhbGN1bGF0aW9uCisKKzIwMDQtMDEtMTEgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdjb2RlY21hcC5jOiAoZ3N0X2ZmbXBlZ19jb2RlY2lkX3RvX2NhcHMpOgorCSAgZml4IFNWUTMgY2FwcworCisyMDA0LTAxLTExICBTdGV2ZSBCYWtlciAgPHN0ZXZlQHN0ZXZlYmFrZXIub3JnPgorCisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOiAoZ3N0X2FnaW5ndHZfZ2V0X3R5cGUpLAorCShnc3RfYWdpbmd0dl9iYXNlX2luaXQpLCAoZ3N0X2FnaW5ndHZfY2xhc3NfaW5pdCksCisJKGdzdF9hZ2luZ3R2X2luaXQpLCAoZ3N0X2FnaW5ndHZfc2V0dXApLCAoZ3N0X2FnaW5ndHZfcmdiMzIpLAorCShnc3RfYWdpbmd0dl9zZXRfcHJvcGVydHkpLCAoZ3N0X2FnaW5ndHZfZ2V0X3Byb3BlcnR5KToKKyAgICAgICAgUG9ydCBhZ2luZ1RWIHRvIHZpZGVvZmlsdGVyCisKKzIwMDQtMDEtMDkgIEp1bGllbiBNT1VUVEUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBleHQvaGVybWVzL2dzdGNvbG9yc3BhY2UuYzogKGdzdF9jb2xvcnNwYWNlX2NoYWluKToKKwlJbXBsZW1lbnRpbmcgZ3N0X3BhZF9hbGxvY19idWZmZXIgdG8gdXNlIG9wdGltaXplZCBidWZmZXIgYWxsb2NhdGlvbi4KKworMjAwNC0wMS0wOSAgSnVsaWVuIE1PVVRURSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGV4dC9mZm1wZWcvZ3N0ZmZtcGVnY29sb3JzcGFjZS5jOiAoZ3N0X2ZmbXBlZ2NzcF9jaGFpbik6CisJSW1wbGVtZW50aW5nIGdzdF9wYWRfYWxsb2NfYnVmZmVyIHRvIHVzZSBvcHRpbWl6ZWQgYnVmZmVyIGFsbG9jYXRpb24uCisJKiBnc3QtbGlicy9nc3QveG92ZXJsYXkveG92ZXJsYXkuYzoKKwkoZ3N0X3hfb3ZlcmxheV9nb3RfZGVzaXJlZF9zaXplKTogVXBkYXRpbmcgZG9jIGZvciB0aGUgeGlkIGJlaW5nIDAuCisJKiBnc3QvdmlkZW9zY2FsZS9nc3R2aWRlb3NjYWxlLmM6IChnc3RfdmlkZW9zY2FsZV9jaGFpbik6CisJSW1wbGVtZW50aW5nIGdzdF9wYWRfYWxsb2NfYnVmZmVyIHRvIHVzZSBvcHRpbWl6ZWQgYnVmZmVyIGFsbG9jYXRpb24uCisJKiBnc3QvdmlkZW90ZXN0c3JjL2dzdHZpZGVvdGVzdHNyYy5jOiAoZ3N0X3ZpZGVvdGVzdHNyY19nZXQpOgorCUltcGxlbWVudGluZyBnc3RfcGFkX2FsbG9jX2J1ZmZlciB0byB1c2Ugb3B0aW1pemVkIGJ1ZmZlciBhbGxvY2F0aW9uLgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19jaGFpbiksCisJKGdzdF94aW1hZ2VzaW5rX2J1ZmZlcl9mcmVlKSwgKGdzdF94aW1hZ2VzaW5rX2J1ZmZlcl9hbGxvYyksCisJKGdzdF94aW1hZ2VzaW5rX3NldF94d2luZG93X2lkKSwgKGdzdF94aW1hZ2VzaW5rX2luaXQpOiBJbXBsZW1lbnRpbmcKKwl0aGUgYnVmZmVyYWxsb2NfZnVuY3Rpb24gdG8gcmVwbGFjZSBidWZmZXJwb29scywgZml4aW5nIHRoZSBYT3ZlcmxheQorCWludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiB0byBoYW5kbGUgeGlkIGJlaW5nIDAgYW5kIGZpeCBzb21lIGJ1Z3MKKwl0cmlnZ2VyZWQgYnkgQmVuamFtaW4ncyB0ZXN0Y2FzZS4KKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfY2hhaW4pLAorCShnc3RfeHZpbWFnZXNpbmtfYnVmZmVyX2ZyZWUpLCAoZ3N0X3h2aW1hZ2VzaW5rX2J1ZmZlcl9hbGxvYyksCisJKGdzdF94dmltYWdlc2lua19zZXRfeHdpbmRvd19pZCksIChnc3RfeHZpbWFnZXNpbmtfaW5pdCk6IEltcGxlbWVudGluZworCXRoZSBidWZmZXJhbGxvY19mdW5jdGlvbiB0byByZXBsYWNlIGJ1ZmZlcnBvb2xzLCBmaXhpbmcgdGhlIFhPdmVybGF5CisJaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIHRvIGhhbmRsZSB4aWQgYmVpbmcgMCBhbmQgZml4IHNvbWUgYnVncworCXRyaWdnZXJlZCBieSBCZW5qYW1pbidzIHRlc3RjYXNlLgorCisyMDA0LTAxLTA5ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9saWJyZmIvZ3N0cmZic3JjLmM6ICBIYWNraW5nLiAgQWRkZWQgYWN0dWFsIGRlY29kaW5nIGFuZAorCW1vdXNlIHBvaW50ZXIgZXZlbnRzLiAgSXQgd29ya3MuCisKKzIwMDQtMDEtMDkgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9kaXZ4L2dzdGRpdnhlbmMuYzogKGdzdF9kaXZ4ZW5jX2luaXQpOgorCSAgVXNlIGV4cGxpY2l0IGNhcHMgLSBmaXggY2Fwc25lZ28uCisJKiBleHQveHZpZC9nc3R4dmlkZGVjLmM6CisJKiBleHQveHZpZC9nc3R4dmlkZW5jLmM6CisJICBSZW1vdmUgbWFjcm8taW5zaWRlLW1hY3JvIHdoaWNoIGNhdXNlZCBjb21waWxlIGVycm9ycy4KKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5jOiAoZ3N0X3JpZmZfcmVhZF9oZWFkZXIpOgorCSAgRXJyb3Igb3V0IGlmIGl0J3Mgbm90IGEgUklGRiBmaWxlLiBFbHNlIHdlIGVycm9yIG91dCB3aXRob3V0CisJICBnc3RfZWxlbWVudF9lcnJvcigpIHdoaWNoIGlzIG5vdCBnb29kLi4uCisKKzIwMDQtMDEtMDggIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdlbmMuYzogKGdzdF9mZm1wZWdlbmNfY29ubmVjdCk6CisJRml4IHBhZF9saW5rIGZ1bmN0aW9uIHRvIGhhbmRsZSBmb3JtYXRzIHRoYXQgZmZtcGVnIHJldHVybnMKKwlhcyBtdWx0aXBsZSBjYXBzIHN0cnVjdHVyZXMuCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9maWx0ZXIuYzogKGdzdF92aWRlb2ZpbHRlcl9jaGFpbik6CisJT25seSBjb21wbGFpbiBpZiBzb3VyY2UgYnVmZmVyIGlzIF9zbWFsbGVyXyB0aGFuIGV4cGVjdGVkLgorCSogZ3N0L3ZpZGVvc2NhbGUvZ3N0dmlkZW9zY2FsZS5jOiAoZ3N0X3ZpZGVvc2NhbGVfaW5pdCksCisJKGdzdF92aWRlb3NjYWxlX2hhbmRsZV9zcmNfZXZlbnQpOiBSZXNpemUgbmF2aWdhdGlvbiBldmVudHMKKwl3aGVuIHBhc3NpbmcgdGhlbSB1cHN0cmVhbS4KKwkqIGdzdC92aWRlb3Rlc3RzcmMvZ3N0dmlkZW90ZXN0c3JjLmM6CisJKiBnc3QvdmlkZW90ZXN0c3JjL2dzdHZpZGVvdGVzdHNyYy5oOgorCSogZ3N0L3ZpZGVvdGVzdHNyYy92aWRlb3Rlc3RzcmMuYzoKKwkqIGdzdC92aWRlb3Rlc3RzcmMvdmlkZW90ZXN0c3JjLmg6CisJUmV3cml0ZSBtYW55IG9mIHRoZSBidWZmZXIgcGFpbnRpbmcgZnVuY3Rpb25zIHRvIGhhbmRsZSBvZGQKKwlzaXplcyAoZm9yIG1hbnkgZm9ybWF0cywgc2l6ZSU0IT0wIG9yIHNpemUlOCE9MCkuICBNb3N0IGhhdmUKKwliZWVuIHZlcmlmaWVkIHRvIHdvcmsgd2l0aCBteSB2aWRlbyBjYXJkLgorCSogdGVzdHN1aXRlL2dzdC1saW50OiAgQWRkIGNoZWNrIGZvciBlbGVtZW50cyBjYWxsaW5nCisJZ3N0X3BhZF9nZXRfY2FwcygpIGluc3RlYWQgb2YgZ3N0X3BhZF9nZXRfYWxsb3dlZF9jYXBzKCkuCisKKzIwMDQtMDEtMDggIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3ZpZGVvZHJvcC9nc3R2aWRlb2Ryb3AuYzogKGdzdF92aWRlb2Ryb3BfZ2V0Y2FwcyksCisJKGdzdF92aWRlb2Ryb3BfbGluayksIChnc3RfdmlkZW9kcm9wX2luaXQpOiBGaXggbmVnb3RpYXRpb24uCisKKzIwMDQtMDEtMDggIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19oYW5kbGVfeGV2ZW50cyk6IEEKKwljb25maWd1cmUgZXZlbnQgaXMgbm90IGVtaXRpbmcgdGhlIGRlc2lyZWQgc2l6ZSBzaWduYWwuIFRoYXQgZml4ZXMKKwlhc3BlY3QgcmF0aW8gaXNzdWVzIHdpdGggZ3N0LXBsYXllci4KKworMjAwNC0wMS0wOCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L21lZGlhbi9nc3RtZWRpYW4uYzogKGdzdF9tZWRpYW5fbGluayksIChnc3RfbWVkaWFuX2luaXQpOgorCSAgRml4IGNhcHNuZWdvLgorCisyMDA0LTAxLTA4ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGV4dC9zZGwvc2RsdmlkZW9zaW5rLmM6IChnc3Rfc2RsdmlkZW9zaW5rX2NyZWF0ZSk6IFVzaW5nIFhPdmVybGF5CisJcHVibGljIG1ldGhvZCB0byBmaXJlIHNpemUgc2lnbmFsLgorCisyMDA0LTAxLTA3ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGV4YW1wbGVzL2dzdHBsYXkvTWFrZWZpbGUuYW06IEFkZGluZyB0aGUgaW50ZXJmYWNlIGxpYnJhcnkuCisJKiBnc3QtbGlicy9nc3QvcGxheS9NYWtlZmlsZS5hbTogQWRkaW5nIHRoZSBpbnRlcmZhY2UgbGlicmFyeS4KKwkqIGdzdC1saWJzL2dzdC9wbGF5L2dzdHBsYXkuYzogKGdzdF9wbGF5X3NldF92aWRlb19zaW5rKTogQ29ubmVjdGluZyB0byAJdGhlIFhPdmVybGF5IHNpemUgc2lnbmFsIGluc3RlYWQgb2YgR3N0VmlkZW9TaW5rLgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvZ3N0cGxheS5oOiBJbmNsdWRpbmcgdGhlIFhPdmVybGF5IGludGVyZmFjZSB0byBjaGVjaworCUdTVF9JU19YX09WRVJMQVkgYmVmb3JlIHNpZ25hbCBjb25uZWN0LgorCSogZ3N0LWxpYnMvZ3N0L3ZpZGVvL2dzdHZpZGVvc2luay5jOiAoZ3N0X3ZpZGVvc2lua19jbGFzc19pbml0KToKKwlSZW1vdmluZyB0aGUgaGF2ZV92aWRlb19zaXplIHNpZ25hbC4KKwkqIGdzdC1saWJzL2dzdC92aWRlby9nc3R2aWRlb3NpbmsuaDogUmVtb3ZpbmcgdGhlIGhhdmVfdmlkZW9fc2l6ZSBzaWduYWwKKwlhbmQgYXNzb2NpYXRlZCBwdWJsaWMgbWV0aG9kLgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19oYW5kbGVfeGV2ZW50cyksCisJKGdzdF94aW1hZ2VzaW5rX3Npbmtjb25uZWN0KTogVXNpbmcgWE92ZXJsYXkgcHVibGljIG1ldGhvZCB0byBmaXJlIHNpemUKKwlzaWduYWwuCisJKiBzeXMveHZpZGVvL3h2aWRlb3NpbmsuYzogKGdzdF94dmlkZW9zaW5rX3Npbmtjb25uZWN0KSwKKwkoZ3N0X3h2aWRlb3NpbmtfeHdpbmRvd19uZXcpOiBVc2luZyBYT3ZlcmxheSBwdWJsaWMgbWV0aG9kIHRvIGZpcmUgc2l6ZQorICAgICAgICBzaWduYWwuCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3Npbmtjb25uZWN0KToKKwlVc2luZyBYT3ZlcmxheSBwdWJsaWMgbWV0aG9kIHRvIGZpcmUgc2l6ZSBzaWduYWwuCisKKzIwMDQtMDEtMDcgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvdGVtcGxhdGUuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9tYWtlX2ZpbHRlcjoKKwlDcmVhdGUgZ3N0dmlkZW9leGFtcGxlLmMgaW4gYSBzcmNkaXIhPWJ1aWxkZGlyIGZyaWVuZGx5IHdheS4KKwlDb252ZXJ0IG1ha2VfZmlsdGVyIHRvIC9iaW4vc2ggc2NyaXB0LgorCisyMDA0LTAxLTA3ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvbW9kcGx1Zy9nc3Rtb2RwbHVnLmNjOiBmaXggZWxlbWVudCBkZXNjcmlwdGlvbgorCisyMDA0LTAxLTA3ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGV4YW1wbGVzL2dzdHBsYXkvcGxheWVyLmM6IChnb3RfdGltZV90aWNrKSwgKGdvdF9zdHJlYW1fbGVuZ3RoKSwKKwkoZ290X3ZpZGVvX3NpemUpOiBBZGRpbmcgc29tZSBuZXcgbGluZXMgaW4gZ19wcmludCBjYWxscy4KKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfeHdpbmRvd19uZXcpLAorCShnc3RfeGltYWdlc2lua194d2luZG93X2Rlc3Ryb3kpLCAoZ3N0X3hpbWFnZXNpbmtfeHdpbmRvd19yZXNpemUpLAorCShnc3RfeGltYWdlc2lua19oYW5kbGVfeGV2ZW50cyksIChnc3RfeGltYWdlc2lua19maXhhdGUpLAorCShnc3RfeGltYWdlc2lua19zaW5rY29ubmVjdCksIChnc3RfeGltYWdlc2lua19jaGFuZ2Vfc3RhdGUpLAorCShnc3RfeGltYWdlc2lua19jaGFpbiksIChnc3RfeGltYWdlc2lua19idWZmZXJfbmV3KSwKKwkoZ3N0X3hpbWFnZXNpbmtfc2V0X3h3aW5kb3dfaWQpLCAoZ3N0X3hpbWFnZXNpbmtfZ2V0X2Rlc2lyZWRfc2l6ZSk6CisJQ29tcGxldGUgY29kZSByZXZpZXcsIHJldmVydGluZyBzb21lIHN0dWZmIGkgZGlzYWdyZWUgd2l0aCwgYWRkaW5nCisJc29tZSBmaXhlcyA6IHRpbWUgc3luY2hyb25pemF0aW9uIG9uIGludmFsaWQgdGltZXN0YW1wcywgcmVuZWdvdGlhdGlvbgorCW9mIHByaXZhdGUgd2luZG93LgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmg6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3h3aW5kb3dfZGVzdHJveSksCisJKGdzdF94dmltYWdlc2lua194d2luZG93X3Jlc2l6ZSksIChnc3RfeHZpbWFnZXNpbmtfaGFuZGxlX3hldmVudHMpLAorCShnc3RfeHZpbWFnZXNpbmtfZ2V0X3h2X3N1cHBvcnQpLCAoZ3N0X3h2aW1hZ2VzaW5rX3hjb250ZXh0X2dldCksCisJKGdzdF94dmltYWdlc2lua19maXhhdGUpLCAoZ3N0X3h2aW1hZ2VzaW5rX3Npbmtjb25uZWN0KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NoYW5nZV9zdGF0ZSksIChnc3RfeHZpbWFnZXNpbmtfY2hhaW4pLAorCShnc3RfeHZpbWFnZXNpbmtfYnVmZmVyX25ldyksCisJKGdzdF94dmltYWdlc2lua19uYXZpZ2F0aW9uX3NlbmRfZXZlbnQpLAorCShnc3RfeHZpbWFnZXNpbmtfc2V0X3h3aW5kb3dfaWQpLAorCShnc3RfeHZpbWFnZXNpbmtfZ2V0X2Rlc2lyZWRfc2l6ZSksCisJKGdzdF94dmltYWdlc2lua194b3ZlcmxheV9pbml0KTogQ29tcGxldGUgY29kZSByZXZpZXcsIHJldmVydGluZyBzb21lCisJc3R1ZmYgaSBkaXNhZ3JlZSB3aXRoLCBhZGRpbmcgc29tZSBmaXhlcyA6IFJlbmVnb3RpYXRpb24gb2YgcHJpdmF0ZQorCXdpbmRvdywgaW1wbGVtZW50aW5nIGdldF9kZXNpcmVkX3NpemUuCisKKzIwMDQtMDEtMDcgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzaW5rLmM6IChnc3RfYWZzaW5rX2luaXQpLCAoZ3N0X2Fmc2lua19jaGFpbiksCisJKGdzdF9hZnNpbmtfaGFuZGxlX2V2ZW50KToKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzogKGdzdF9qcGVnZW5jX2luaXQpOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzogKGdzdF9hdmltdXhfcmVxdWVzdF9uZXdfcGFkKToKKwkqIHN5cy9keHIzL2R4cjNhdWRpb3NpbmsuYzogKGR4cjNhdWRpb3NpbmtfaW5pdCk6CisJKiBzeXMvZHhyMy9keHIzc3B1c2luay5jOiAoZHhyM3NwdXNpbmtfaW5pdCk6CisJKiBzeXMvZHhyMy9keHIzdmlkZW9zaW5rLmM6IChkeHIzdmlkZW9zaW5rX2luaXQpOgorCSAgRml4IGZvciBpbnN0YW50aWF0ZS10ZXN0IChzZWUgY29yZSkuIEFsc28gcmVtb3ZlIGRlYWQgY29kZSBmcm9tCisJICBqcGVnZW5jICh3aGljaCBzdGlsbCBuZWVkcyBmaXhpbmcsIGJ1dCB0aGF0J3MgbG93ZXIgb24gbXkgVE9ETworCSAgbGlzdC4uLikuCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19nZXRjYXBzKToKKwkgIE5ldmVyIHJldHVybiBOVUxMIGFzIGNhcHMuCisKKzIwMDQtMDEtMDcgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L2xpYnJmYi9NYWtlZmlsZS5hbToKKwkqIGV4dC9saWJyZmIvZ3N0cmZic3JjLmM6CisJTmV3IHNvdXJjZSBwbHVnaW4gYmFzZWQgb24gbGlicmZiLTAuMS4gIFJGQiAocmVtb3RlIGZyYW1lYnVmZmVyKQorCWlzIHRoZSBwcm90b2NvbCB1c2VkIGJ5IFZOQy4KKworMjAwNC0wMS0wNyAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW90ZW1wbGF0ZS5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvdGVtcGxhdGUuaDoKKwkqIGdzdC92aWRlb2ZpbHRlci9tYWtlX2ZpbHRlcjoKKwlNZXJnZSB2aWRlb3RlbXBsYXRlIGhlYWRlciBpbnRvIHNvdXJjZSBmaWxlLgorCSogZ3N0L2VmZmVjdHYvTWFrZWZpbGUuYW06CisJKiBnc3QvZWZmZWN0di9nc3RlZmZlY3R2LmM6IChwbHVnaW5faW5pdCk6CisJKiBnc3QvZWZmZWN0di9nc3R3YXJwLmM6CisJTWFrZSB3YXJwVFYgYSBzdWJjbGFzcyBvZiB2aWRlb2ZpbHRlci4KKworMjAwNC0wMS0wNyAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X21hZF9pZDNfdG9fdGFnX2xpc3QpOgorCSAgQWRkIGd1YXJkIGFnYWluc3QgaW52YWxpZCB1dGYtOCBjb252ZXJzaW9ucyBpbiBtYWQuIEp1c3QgaW4gY2FzZS4KKworMjAwNC0wMS0wNyAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3NzaW5rX3NpbmtfZml4YXRlKToKKwkgIEZpeCBmb3IgYnVnIHNob3duIGJ5IHBvaXNvbmluZworCisyMDA0LTAxLTA2ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvdjRsL2dzdHY0bG1qcGVnc3JjLmM6IChnc3RfdjRsbWpwZWdzcmNfZ2V0KSwKKwkoZ3N0X3Y0bG1qcGVnc3JjX2J1ZmZlcl9mcmVlKToKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6IChnc3RfdjRsc3JjX3BhbGV0dGVfdG9fY2FwcyksCisJKGdzdF92NGxzcmNfc3JjY29ubmVjdCksIChnc3RfdjRsc3JjX2dldGNhcHMpLCAoZ3N0X3Y0bHNyY19nZXQpLAorCShnc3RfdjRsc3JjX2J1ZmZlcl9mcmVlKToKKwkgIEZpeCBmb3IgcmVtb3ZlZCBidWZmZXJwb29scy4KKworMjAwNC0wMS0wNyAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19sb29wKToKKwlGaXggY2FwcyBuZWdvdGlhdGlvbi4KKworCSogZXh0L2R2ZG5hdi9kdmRuYXZzcmMuYzogKGR2ZG5hdnNyY19jbGFzc19pbml0KSwKKwkoZHZkbmF2c3JjX3VwZGF0ZV9idXR0b25pbmZvKSwgKGR2ZG5hdnNyY19nZXQpLAorCShkdmRuYXZzcmNfZ2V0X2V2ZW50X21hc2spLCAoZHZkbmF2X2hhbmRsZV9uYXZpZ2F0aW9uX2V2ZW50KSwKKwkoZHZkbmF2c3JjX2V2ZW50KToKKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5jOgorCSogZ3N0LWxpYnMvZ3N0L25hdmlnYXRpb24vbmF2aWdhdGlvbi5jOgorCShnc3RfbmF2aWdhdGlvbl9zZW5kX2tleV9ldmVudCksIChnc3RfbmF2aWdhdGlvbl9zZW5kX21vdXNlX2V2ZW50KToKKwkqIGdzdC1saWJzL2dzdC9uYXZpZ2F0aW9uL25hdmlnYXRpb24uaDoKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdkZW11eC5jOiAoZ3N0X21wZWdfZGVtdXhfaGFuZGxlX3NyY19ldmVudCk6CisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2hhbmRsZV94ZXZlbnRzKToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfaGFuZGxlX3hldmVudHMpOgorCVN1cGVyLXNpbXBsZSBmaXJzdCB2ZXJzaW9uIG9mIG1vdXNlIGFuZCBrZXlib2FyZCBldmVudHMuIENsaWNraW5nCisJb24gYSBEVkQgbWVudSBub3cgd29ya3MsIGFsdGhvdWdoIGl0IG1heSBub3QgdGFrZSB5b3Ugd2hlcmUgeW91CisJZXhwZWN0ZWQuCisKKwkqIGdzdC9zaW5lL2dzdHNpbmVzcmMuYzogKGdzdF9zaW5lc3JjX3NyY19maXhhdGUpOgorCSogZ3N0L3ZpZGVvdGVzdHNyYy9nc3R2aWRlb3Rlc3RzcmMuYzoKKwkoZ3N0X3ZpZGVvdGVzdHNyY19zcmNfZml4YXRlKToKKwlUaGVzZSBmaXhhdGUgZnVuY3Rpb25zIHdlcmUgYnJva2VuIC0gdGhleSBuZXZlciBhY3R1YWxseQorCWZpeGF0ZWQgOikKKworMjAwNC0wMS0wNiAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L3Nob3V0L2dzdHNob3V0LmM6IChnc3RfaWNlY2FzdHNlbmRfYmFzZV9pbml0KSwKKwkoZ3N0X2ljZWNhc3RzZW5kX2luaXQpOgorCSAgZml4IGZvciBuZXcgY2FwcyBzeXN0ZW0uCisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvbWl4ZXJ0cmFjay5oOgorCSogc3lzL29zcy9nc3Rvc3NtaXhlci5jOiAoZ3N0X29zc21peGVyX2J1aWxkX2xpc3QpOgorCSAgQWRkICdtYXN0ZXIgdHJhY2snIGZsYWcgKGZvciB0b29scyBsaWtlIEFDTUUgdGhhdCBvbmx5IHdhbnQgdG8KKwkgIGNoYW5nZSB0aGUgbWFpbiB2b2x1bWUpLgorCisyMDA0LTAxLTA3ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGV4dC94dmlkL2dzdHh2aWQuYzogKGdzdF94dmlkX3N0cnVjdHVyZV90b19jc3ApLAorCShnc3RfeHZpZF9jc3BfdG9fY2Fwcyk6CisJKiBleHQveHZpZC9nc3R4dmlkZGVjLmM6IChnc3RfeHZpZGRlY19zcmNfZ2V0Y2Fwcyk6CisJKiBleHQveHZpZC9nc3R4dmlkZW5jLmM6CisJaWZkZWYgb3V0IEFSR0IgdHlwZSB3aGVuIGl0IGlzbid0IGF2YWlsYWJsZQorCWluIHh2aWRjb3JlIDEuMC4wYmV0YTIKKworMjAwNC0wMS0wNiAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ3BhcnNlLmM6IChnc3RfbXBlZ19wYXJzZV9sb29wKToKKwkgIFdoZW4gd2UgaGF2ZSByZWNlaXZlZCBhIG5ldyBTQ1IgcmlnaHQgaW4gdGhlIGZpcnN0IGJ1ZmZlciBhZnRlcgorCSAgYSBzZWVrIChzbyBpbiB0aGUgc2FtZSBjeWNsZSB0aGF0IGhhbmRsZXMgdGhlIGRpc2NvbnQpLCB3ZSBzaG91bGQKKwkgIGhhbmRsZSB0aGUgYnVmZmVyIGluc3RlYWQgb2YgdW5yZWZmaW5nIGl0LCBlbHNlIHdlIGxvc2UgZGF0YS4KKworMjAwNC0wMS0wNiAgSWFpbiA8aWFpbkBwcmV0dHlwZW9wbGUub3JnPgorCisJKiBnc3QvaW50ZmxvYXQvZ3N0aW50MmZsb2F0LmMgKGdzdF9pbnQyZmxvYXRfbGluayk6IFNldCB0aGUKKwkgIGJ1ZmZlci1mcmFtZXMgY2FwcyB0b28uCisKKwkqIGdzdC9vbmV0b24vZ3N0b25ldG9uLmMgKGdzdF9vbmV0b25fc2lua19jb25uZWN0KTogT25seSBjcmVhdGUgdGhlIG5ldworCSAgY2FwcyB0aGF0IHdlIG5lZWQsIGRvbid0IGRlc3Ryb3kgdGhlbSBhbGwgYW5kIHJlYnVpbGQgdGhlbS4gQW5kIHdoZW4KKwkgIGNyZWF0aW5nIHNyYyBwYWRzLCB1c2UgdGhlIHNyYyBwYWQgdGVtcGxhdGUgcmF0aGVyIHRoYW4gdGhlIHNpbmsuLi4KKworMjAwNC0wMS0wNSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ2RlbXV4LmM6IChnc3RfbXBlZ19kZW11eF9wYXJzZV9zeXNoZWFkKToKKwkgIEFkZCBwYWQgdG8gZWxlbWVudCAqYWZ0ZXIqIHNldHRpbmcgZnVuY3Rpb25zIHN1Y2ggYXMgZXZlbnQgaGFuZGxlci4KKwkgIFdpdGhvdXQgdGhpcywgdGhlIHNjaGVkdWxlciAob3B0KSB3aWxsIGxpbmsgcGFkcywgc2V0IHRoZSBldmVudAorCSAgaGFuZGxlciBmcm9tIHRoZSBkZWZhdWx0IGV2ZW50IGZ1bmN0aW9uIChkaXNwYXRjaGVyIGluIGdzdHBhZC5jKQorCSAgYW5kICphZnRlciogdGhhdCwgd2Ugd2lsbCBzZXQgb3VyIG93biBldmVudCBmdW5jdGlvbiwgd2hpY2ggd2lsbAorCSAgdGh1cyBuZXZlciBiZSB1c2VkIChhbmQgdGh1cyBtcGVnZGVtdXggZG9lc24ndCBoYW5kbGUgZXZlbnRzKS4KKworMjAwNC0wMS0wNCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJRml4IHRoZSBmaXhhdGUgZnVuY3Rpb25zIHRvIGhhbmRsZSBuZXcgcHJvdG90eXBlOgorCSogZ3N0L3NpbmUvZ3N0c2luZXNyYy5jOiAoZ3N0X3NpbmVzcmNfc3JjX2ZpeGF0ZSk6CisJKiBnc3QvdmlkZW90ZXN0c3JjL2dzdHZpZGVvdGVzdHNyYy5jOgorCShnc3RfdmlkZW90ZXN0c3JjX3NyY19maXhhdGUpOgorCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IChnc3Rfb3Nzc2lua19zaW5rX2ZpeGF0ZSk6CisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2ZpeGF0ZSk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2ZpeGF0ZSk6CisKKzIwMDQtMDEtMDQgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmg6CisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3h3aW5kb3dfbmV3KSwKKwkoZ3N0X3hpbWFnZXNpbmtfeHdpbmRvd19kZXN0cm95KSwgKGdzdF94aW1hZ2VzaW5rX3Npbmtjb25uZWN0KSwKKwkoZ3N0X3hpbWFnZXNpbmtfY2hhbmdlX3N0YXRlKSwgKGdzdF94aW1hZ2VzaW5rX3NldF94d2luZG93X2lkKSwKKwkoZ3N0X3hpbWFnZXNpbmtfeG92ZXJsYXlfaW5pdCk6CisJICBhc3NvcnRlZCBmaXhlcyB0byBtYWtlIChyZSllbWJlZGRpbmcgd29yaworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19zaW5rY29ubmVjdCksCisJKGdzdF94aW1hZ2VzaW5rX2dldF9kZXNpcmVkX3NpemUpOgorCSAgaW1wbGVtZW50IGRlc2lyZWQgc2l6ZSBhZGRpdGlvbnMgdG8gWE92ZXJsYXkKKworMjAwNC0wMS0wNCAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBnc3QtbGlicy9nc3QveG92ZXJsYXkveG92ZXJsYXkuYzogKGdzdF94X292ZXJsYXlfYmFzZV9pbml0KSwKKwkoZ3N0X3hfb3ZlcmxheV9nb3RfeHdpbmRvd19pZCksIChnc3RfeF9vdmVybGF5X2dldF9kZXNpcmVkX3NpemUpLAorCShnc3RfeF9vdmVybGF5X2dvdF9kZXNpcmVkX3NpemUpOgorCSogZ3N0LWxpYnMvZ3N0L3hvdmVybGF5L3hvdmVybGF5Lmg6CisJICBBZGQgb3B0aW9uYWwgImRlc2lyZWQgc2l6ZSIgc2lnbmFsIGFuZCBxdWVyeWluZy4KKworMjAwNC0wMS0wNCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwKToKKwkgIEZpeCBFQk1MLWxhY2VkIGJsb2NrIHBhcnNpbmcuIERpZmZzIGFyZSByZWxhdGl2ZSB0byBwcmV2aW91cworCSAgbGFjZSwgbm90IHRoZSBmaXJzdCBsYWNlLiBUaGFua3MgdG8gTW9zdSBmcm9tIHRoZSBNYXRyb3NrYQorCSAgdGVhbSBmb3IgZGV0ZWN0aW5nIHRoaXMuCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9pbml0KSwKKwkoZ3N0X3dhdnBhcnNlX3BhcnNlX2ZtdCksIChnc3Rfd2F2cGFyc2VfZ2V0Y2FwcyksCisJKGdzdF93YXZwYXJzZV9oYW5kbGVfc2lua19ldmVudCksIChnc3Rfd2F2cGFyc2VfbG9vcCksCisJKGdzdF93YXZwYXJzZV9jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICBRdWlja2ZpeCBmb3IgY2Fwc25lZ28uCisKKzIwMDQtMDEtMDQgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChzZXRfcHJvcGVydHkpLCAoZ3N0X3dhdmVuY19pbml0KToKKwkgIEZpeCBpbmRlbnRpbmcsIGZpeCBwYWQgY3JlYXRpb24uCisKKzIwMDQtMDEtMDQgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC94dmlkL2dzdHh2aWRkZWMuYzogKGdzdF94dmlkZGVjX2luaXQpLAorCShnc3RfeHZpZGRlY19zcmNfZ2V0Y2FwcyksIChnc3RfeHZpZGRlY19zcmNfbGluayksCisJKGdzdF94dmlkZGVjX3NpbmtfbGluayk6CisJICBJbXBsZW1lbnQgc3JjX2dldGNhcHMoKSBzbyBwcm9wZXIgc2l6ZSBjYXBzIGlzIG5lZ290aWF0ZWQuCisKKzIwMDQtMDEtMDQgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjZGVjX2xvb3ApOgorCSAgRmluaXNoIGZsYWMgZGVjb2RlciBvbiBFT1MuIFNlZSAjMTE2MTc4LgorCisyMDA0LTAxLTA0ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9zcmNfZ2V0Y2FwcyksCisJKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfc3RyZWFtKToKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIEFkZCBnZXRjYXBzKCkgZnVuY3Rpb24gdG8gZml4IGNhcHNuZWdvLi4uCisKKzIwMDQtMDEtMDQgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdkZW11eC5jOiAoZ3N0X21wZWdfZGVtdXhfcGFyc2Vfc3lzaGVhZCksCisJKGdzdF9tcGVnX2RlbXV4X3BhcnNlX3BhY2tldCksIChnc3RfbXBlZ19kZW11eF9wYXJzZV9wZXMpOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ3BhcnNlLmM6IChnc3RfbXBlZ19wYXJzZV9wYXJzZV9wYWNraGVhZCk6CisJICBGaXggbW9yZSBpbnRlZ2VyIG92ZXJmbG93cy4gQWdhaW4sIHNlZSAjMTI2OTY3LgorCisyMDA0LTAxLTAzICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbXBlZzJkZWMvZ3N0bXBlZzJkZWMuYzoKKwkgIEFkZCBzdXBwb3J0IGZvciBtcGVnMmRlYy0wLjQuMCAocmVsZWFzZWQgdHdvIHdlZWtzIGFnbykuIFNlZQorCSAgIzEzMDQxNi4KKworMjAwNC0wMS0wMyAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L3h2aWQvZ3N0eHZpZC5jOiAoZ3N0X3h2aWRfaW5pdCksIChnc3RfeHZpZF9lcnJvciksCisJKGdzdF94dmlkX3N0cnVjdHVyZV90b19jc3ApLCAoZ3N0X3h2aWRfY3NwX3RvX2NhcHMpOgorCSogZXh0L3h2aWQvZ3N0eHZpZC5oOgorCSogZXh0L3h2aWQvZ3N0eHZpZGRlYy5jOiAoZ3N0X3h2aWRkZWNfY2xhc3NfaW5pdCksCisJKGdzdF94dmlkZGVjX2luaXQpLCAoZ3N0X3h2aWRkZWNfc2V0dXApLCAoZ3N0X3h2aWRkZWNfY2hhaW4pLAorCShnc3RfeHZpZGRlY19zcmNfbGluayksIChnc3RfeHZpZGRlY19zaW5rX2xpbmspLAorCShnc3RfeHZpZGRlY19jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L3h2aWQvZ3N0eHZpZGRlYy5oOgorCSogZXh0L3h2aWQvZ3N0eHZpZGVuYy5jOiAoZ3N0X3h2aWRlbmNfcHJvZmlsZV9nZXRfdHlwZSksCisJKGdzdF94dmlkZW5jX2Jhc2VfaW5pdCksIChnc3RfeHZpZGVuY19jbGFzc19pbml0KSwKKwkoZ3N0X3h2aWRlbmNfaW5pdCksIChnc3RfeHZpZGVuY19zZXR1cCksIChnc3RfeHZpZGVuY19jaGFpbiksCisJKGdzdF94dmlkZW5jX2xpbmspLCAoZ3N0X3h2aWRlbmNfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3h2aWRlbmNfZ2V0X3Byb3BlcnR5KSwgKGdzdF94dmlkZW5jX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQveHZpZC9nc3R4dmlkZW5jLmg6CisJICBVcGRhdGUgeHZpZCBwbHVnaW4gdG8gbGF0ZXN0IHh2aWQgKDEuMC4wLWJldGEzKSBBUEkuCisKKzIwMDQtMDEtMDMgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9ydHAvcnRwLXBhY2tldC5jOgorCSAgQWRkIHN5cy90eXBlcy5oIGluY2x1ZGUsIHNpbmNlIE9TIFggZG9lc24ndCBkZWZpbmUgaW5fYWRkcl90CisJICBpbiBuZXRpbmV0L2luLmgsIGxpa2UgaXQgZG9lcyBvbiBMaW51eCAoc2VlICMxMjk2MDApLgorCisyMDA0LTAxLTAzICBUaG9tYXMgQ2FudHkgPHRvbW15ZGFsQG9wdHVzaG9tZS5jb20uYXU+CisKKwlyZXZpZXdlZCBieTogUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVyLmM6IChnc3RfYWxzYV9taXhlcl9kaXNwb3NlKToKKwkgIENvcnJlY3QgbG9naWMgb2YgZGlzcG9zZSBmdW5jdGlvbiAoc2VlICMxMjkzMDYpLgorCisyMDA0LTAxLTAzICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVnZGVtdXguYzogKGdzdF9tcGVnX2RlbXV4X3BhcnNlX3Blcyk6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVncGFyc2UuYzogKGdzdF9tcGVnX3BhcnNlX2NsYXNzX2luaXQpLAorCShnc3RfbXBlZ19wYXJzZV9pbml0KToKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdwYXJzZS5oOgorCSAgUmVtb3ZlIGNsb2NrICh3aGljaCB3YXMgbmV2ZXIgcHJvdmlkZWQsIGkuZS4gZGVhZCBjb2RlKSwgYW5kCisJICBhbHNvIGZpeCBpbnRlZ2VyIG92ZXJmbG93cyBhdCBoaWdoIFBUUyB2YWx1ZXMgKHNlZSAjMTI2OTY3KS4KKworMjAwNC0wMS0wMyAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuaDoKKwkqIGV4dC9taWttb2QvZ3N0bWlrbW9kLmg6CisJICBPUyBYIGZpeGVzIChzZWUgIzEyNjYyOCkuCisKKzIwMDQtMDEtMDIgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYXNyYy5jOiAoZ3N0X2Fsc2Ffc3JjX3BhZF9mYWN0b3J5KSwKKwkoZ3N0X2Fsc2Ffc3JjX2Jhc2VfaW5pdCk6IFJlbW92ZSBib2d1cyAic3JjIiByZXF1ZXN0IHBhZC4KKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdwYXJzZS5jOiAoZ3N0X21wZWdfcGFyc2VfYmFzZV9pbml0KSwKKwkoZ3N0X21wZWdfcGFyc2VfY2xhc3NfaW5pdCk6IE1vdmUgcGFkIHRlbXBsYXRlIHJlZ2lzdHJhdGlvbgorCXRvIGNsYXNzX2luaXQsIHNpbmNlIHRoZSBkZXJpdmVkIGNsYXNzIChtcGVnZGVtdXgpIGRvZXNuJ3QKKwl3YW50IHRoZW0uCisKKzIwMDQtMDEtMDMgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy94aW1hZ2UvTWFrZWZpbGUuYW06CisJKiBzeXMveHZpZGVvL01ha2VmaWxlLmFtOgorCSogc3lzL3h2aW1hZ2UvTWFrZWZpbGUuYW06CisJICBNb3ZlIGludGVyZmFjZSBsaWJzIGZyb20gTERGTEFHUyB0byBMSUJBREQsIGZpeCByZWxvY2F0aW9uIGVycm9ycworCSAgYWZ0ZXIgaW5zdGFsbGF0aW9uIChzZWUgIzEyNzY2NCkuCisKKzIwMDQtMDEtMDIgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdlbmMuYzogKGdzdF9mZm1wZWdlbmNfaW5pdCksCisJKGdzdF9mZm1wZWdlbmNfY29ubmVjdCk6ICBOZWdvdGlhdGlvbiBmaXhlcy4KKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5jOiAoZ3N0X21wZWcyZGVjX25lZ290aWF0ZV9mb3JtYXQpOgorCVJlbW92ZSBpbmFwcHJvcHJpYXRlIGdzdF9jYXBzX2ZyZWUoKS4KKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfc2lua2Nvbm5lY3QpOgorCVJlZW5hYmxlIFJvbmFsZCdzIGludGVybmFsIHJlc2l6ZSBjb2RlLCBzaW5jZSB0aGUgY29yZSBoYW5kbGVzCisJaXQgY29ycmVjdGx5IG5vdy4KKworMjAwNC0wMS0wMiAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL3Y0bC9nc3R2NGxtanBlZ3NpbmsuYzogKGdzdF92NGxtanBlZ3NpbmtfaW5pdCk6CisJKiBzeXMvdjRsL2dzdHY0bG1qcGVnc3JjLmM6IChnc3RfdjRsbWpwZWdzcmNfaW5pdCk6CisJKiBzeXMvdjRsL2dzdHY0bHNyYy5jOiAoZ3N0X3Y0bHNyY19iYXNlX2luaXQpLCAoZ3N0X3Y0bHNyY19pbml0KToKKwkgIEZpeCBwYWQgdGVtcGxhdGUgc3R1ZmYuCisKKzIwMDQtMDEtMDIgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogKGdzdF9lYm1sX3JlYWRfc2ludCk6CisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOiAoZ3N0X2VibWxfd3JpdGVfc2ludCk6CisJICBmaXggc2lnbmVkIGludGVnZXIgcmVhZGluZy93cml0aW5nLgorCisyMDA0LTAxLTAyICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9hbHNhL1JFQURNRToKKwkgIFJlbW92ZSBvdXRkYXRlZCBkb2N1bWVudAorCisyMDA0LTAxLTAzICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6IChnc3RfY3V0dGVyX2luaXQpOgorCSAgc3JjIHBhZCB3YXMgYmVpbmcgY3JlYXRlZCB0d2ljZSAtIG9vcHMuCisKKzIwMDQtMDEtMDIgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfc2lua2Nvbm5lY3QpOgorCSAgQ29tbWVudCBvdXQgaW50ZXJuYWwgcmVzaXplLiBJdCBkb2Vzbid0IGhhbmRsZSB0aGUgcmVzdWx0aW5nCisJICBYRXZlbnQgaW50ZXJuYWxseSwgZG9lcyBhbm90aGVyIHRyeV9zZXRfY2FwcygpIHdoaWNoIGxlYWRzIHRvCisJICBhIHJlYWxseSBuaWNlIGxvb3AuCisJICBSZWFsIGZpeCB3aWxsIGNvbWUgd2hlbiBKdWxpZW4gYW5kIERhdmUgYXJlIGF3YWtlLiA7KS4KKworMjAwNC0wMS0wMiAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L21wZWcyZW5jL2dzdG1wZWcyZW5jLmNjOgorCSAgZml4IGNvbnN0L25vbmNvbnN0IGNvbXBpbGUgaXNzdWUuCisKKzIwMDQtMDEtMDIgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19maXhhdGUpLAorCShnc3RfeHZpbWFnZXNpbmtfc2lua2Nvbm5lY3QpLCAoZ3N0X3h2aW1hZ2VzaW5rX2luaXQpOgorCUFkZCBmaXhhdGUgZnVuY3Rpb24gYW5kIGEgY2hlY2sgZm9yIGJhZCBmb3JtYXRzLgorCisyMDA0LTAxLTAxICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwlOZWdvdGlhdGlvbiBmaXhlczoKKwkqIGdzdC1saWJzL2dzdC9hdWRpby9nc3RhdWRpb2ZpbHRlci5jOiAoZ3N0X2F1ZGlvZmlsdGVyX2xpbmspLAorCShnc3RfYXVkaW9maWx0ZXJfaW5pdCk6CisJKiBnc3QvZGVidWcvZWZlbmNlLmM6IChnc3RfZWZlbmNlX2luaXQpOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6IChnc3RfZGVpbnRlcmxhY2VfbGluayksCisJKGdzdF9kZWludGVybGFjZV9pbml0KToKKwkqIGdzdC92b2x1bWUvZ3N0dm9sdW1lLmM6ICh2b2x1bWVfY29ubmVjdCk6CisKKzIwMDQtMDEtMDEgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCUNvbnZlcnQgZWxlbWVudHMgdG8gdXNlIGdzdF9wYWRfdXNlX2V4cGxpY2l0X2NhcHMoKSB3aGVyZQorCWFwcHJvcHJpYXRlOgorCSogZXh0L2E1MmRlYy9nc3RhNTJkZWMuYzogKGdzdF9hNTJkZWNfaW5pdCksIChnc3RfYTUyZGVjX3JlbmVnKToKKwkqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZwYXJzZS5jOiAoZ3N0X2FmcGFyc2VfaW5pdCksCisJKGdzdF9hZnBhcnNlX29wZW5fZmlsZSk6CisJKiBleHQvYXVkaW9maWxlL2dzdGFmc3JjLmM6IChnc3RfYWZzcmNfaW5pdCksCisJKGdzdF9hZnNyY19vcGVuX2ZpbGUpOgorCSogZXh0L2VzZC9lc2Rtb24uYzogKGdzdF9lc2Rtb25faW5pdCksIChnc3RfZXNkbW9uX2dldCk6CisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2RlYy5jOiAoZ3N0X2ZmbXBlZ2RlY19pbml0KSwKKwkoZ3N0X2ZmbXBlZ2RlY19jaGFpbik6CisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2RlbXV4LmM6IChnc3RfZmZtcGVnZGVtdXhfbG9vcCk6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY2RlY19pbml0KSwgKGdzdF9mbGFjZGVjX3dyaXRlKToKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOiAoZ3N0X2dka19waXhidWZfaW5pdCksCisJKGdzdF9nZGtfcGl4YnVmX2NoYWluKToKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogKGdzdF9qcGVnZGVjX2luaXQpLCAoZ3N0X2pwZWdkZWNfbGluayksCisJKGdzdF9qcGVnZGVjX2NoYWluKToKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX2luaXQpLCAoZ3N0X21hZF9jaGFpbik6CisJKiBleHQvbWlrbW9kL2dzdG1pa21vZC5jOiAoZ3N0X21pa21vZF9pbml0KSwKKwkoZ3N0X21pa21vZF9uZWdvdGlhdGUpOgorCSogZXh0L21wZWcyZGVjL2dzdG1wZWcyZGVjLmM6IChnc3RfbXBlZzJkZWNfaW5pdCksCisJKGdzdF9tcGVnMmRlY19uZWdvdGlhdGVfZm9ybWF0KToKKwkqIGV4dC9tcGVnMmVuYy9nc3RtcGVnMmVuYy5jYzoKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfcGFkX3B1c2gpOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IChnc3Rfc3BlZXhkZWNfaW5pdCksCisJKGdzdF9zcGVleGRlY19zaW5rY29ubmVjdCk6CisJKiBleHQvc3dmZGVjL2dzdHN3ZmRlYy5jOiAoZ3N0X3N3ZmRlY19sb29wKSwgKGdzdF9zd2ZkZWNfaW5pdCk6CisJKiBleHQvdm9yYmlzL3ZvcmJpc2ZpbGUuYzogKGdzdF92b3JiaXNmaWxlX2luaXQpLAorCShnc3Rfdm9yYmlzZmlsZV9uZXdfbGluayk6CisJKiBnc3QvYWMzcGFyc2UvZ3N0YWMzcGFyc2UuYzogKGdzdF9hYzNwYXJzZV9pbml0KSwKKwkoZ3N0X2FjM3BhcnNlX2NoYWluKToKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOiAoZ3N0X2FzZl9kZW11eF9hZGRfYXVkaW9fc3RyZWFtKSwKKwkoZ3N0X2FzZl9kZW11eF9zZXR1cF9wYWQpOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiAoZ3N0X2F1cGFyc2VfaW5pdCksCisJKGdzdF9hdXBhcnNlX2NoYWluKToKKwkqIGdzdC9pZDMvZ3N0aWQzdHlwZXMuYzogKGdzdF9pZDN0eXBlc19sb29wKToKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X2FkZF9zdHJlYW0pOgorCSogZ3N0L21wZWcxdmlkZW9wYXJzZS9nc3RtcDF2aWRlb3BhcnNlLmM6IChnc3RfbXAxdmlkZW9wYXJzZV9pbml0KSwKKwkobXAxdmlkZW9wYXJzZV9wYXJzZV9zZXEpOgorCSogZ3N0L21wZWdhdWRpb3BhcnNlL2dzdG1wZWdhdWRpb3BhcnNlLmM6IChnc3RfbXAzcGFyc2VfaW5pdCksCisJKGJwZl9mcm9tX2hlYWRlcik6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVnZGVtdXguYzogKGdzdF9tcGVnX2RlbXV4X3BhcnNlX3N5c2hlYWQpLAorCShnc3RfbXBlZ19kZW11eF9wYXJzZV9wZXMpLCAoZ3N0X21wZWdfZGVtdXhfbHBjbV9zZXRfY2Fwcyk6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVncGFyc2UuYzogKGdzdF9tcGVnX3BhcnNlX2luaXQpLAorCShnc3RfbXBlZ19wYXJzZV9zZW5kX2RhdGEpOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfbG9vcF9oZWFkZXIpLAorCShnc3RfcXRkZW11eF9hZGRfc3RyZWFtKToKKwkqIGdzdC9yZWFsbWVkaWEvcm1kZW11eC5jOiAoZ3N0X3JtZGVtdXhfYWRkX3N0cmVhbSk6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9pbml0KSwKKwkoZ3N0X3dhdnBhcnNlX3BhcnNlX2ZtdCk6CisKKzIwMDQtMDEtMDEgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEZpeCBjb25maWd1cmUgY2hlY2sgZm9yIG1wZWcyZW5jLiBXZSBuZWVkIDEuNi4xLjkzIGluc3RlYWQgb2YKKwkgIDEuNi4xLjkyLCBzaW5jZSB0aGUgcGtnLWNvbmZpZyBmaWxlIG9mIDEuNi4xLjkyIGlzIGJvcmtlZCBhbmQKKwkgIGl0IHRoZXJlZm9yZSB1c2VzIHRoZSB3cm9uZyBpbmNsdWRlIHBhdGhzLiBUb28gYmFkLi4uIE5vdGUKKwkgIHRoYXQgMS42LjEuOTMgaXMgbm90IHJlbGVhc2UgeWV0LiA7KS4KKwkgIEFsc28gYWRkIGEgY2hlY2sgZm9yIG1wbGV4LCB3aGljaCBpcyBub3cgdXNpbmcgdGhlIGxpYidpZmllZAorCSAgbXBsZXggZnJvbSBtanBlZ3Rvb2xzLCB0b28uCisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2NvZGVjbWFwLmM6CisJICBBZGQgY29kZWNfdGFnIGZvciAzaXZ4L3h2aWQuIEZvciB4dmlkLCB0aGlzIHNob3VsZCBmaXggcGxheWJhY2sKKwkgIGlzc3Vlcy4gSSBkb24ndCB0aGluayBmZm1wZWcgaGFuZGxlcyAzaXZ4IGNvcnJlY3RseSwgc28gdGhpcworCSAgcHJvYmFibHkgd29uJ3Qgd29yay4gQnV0IGl0IHdvbid0IGh1cnQgZWl0aGVyLgorCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdkZWMuYzogKGdzdF9mZm1wZWdkZWNfY29ubmVjdCksCisJKGdzdF9mZm1wZWdkZWNfY2hhaW4pOgorCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdlbmMuYzogKGdzdF9mZm1wZWdlbmNfY29ubmVjdCksCisJKGdzdF9mZm1wZWdlbmNfY2hhaW5fYXVkaW8pOgorCSAgRml4IG1lbWxlYWsgaW4gYXVkaW8gZW5jb2RpbmcuIENsb3NlIGNvZGVjIGlmIG9wZW4gZmFpbHMsIHRoaXMKKwkgIGNhbGxzIHRoZSBjbGVhbnVwIHJvdXRpbmVzIHNvIHdlIGNhbiByZS11c2UgdGhlIGNvbnRleHQuCisJKiBleHQvbXBlZzJlbmMvZ3N0bXBlZzJlbmMuY2M6CisJICBGaXggcGFkIHRlbXBsYXRlIG5hbWVzL3R5cGVzLCBmaXggbWVtb3J5IGlzc3VlIHdpdGggZ2V0Y2FwcygpLgorCSogZXh0L21wZWcyZW5jL2dzdG1wZWcyZW5jb2Rlci5jYzoKKwkqIGV4dC9tcGVnMmVuYy9nc3RtcGVnMmVuY29kZXIuaGg6CisJICBGaXggY29tcGlsZSBpc3N1ZSB3aXRoIG5ldyBjYXBzIHN5c3RlbSAoY29uc3QgdGhpbmd5KS4KKwkqIGV4dC9tcGVnMmVuYy9nc3RtcGVnMmVuY3BpY3R1cmVyZWFkZXIuY2M6CisJKiBleHQvbXBlZzJlbmMvZ3N0bXBlZzJlbmNwaWN0dXJlcmVhZGVyLmhoOgorCSAgV2UgcmVhZCBhIGZpcnN0IGZyYW1lIHJpZ2h0IG9uIGluaXRpbmcsIHNvIHRoYXQgd2UgaGF2ZSBhIGNhcHMKKwkgIHdoZW4gd2UgaW5pdCB0aGUgb3V0cHV0LiBUaGlzIGNhcHMgaXMgY2FjaGVkIGluIHBhZHByaXZhdGUgYW5kCisJICByZWFkIGFzIGZpcnN0IGZyYW1lLgorCSogZXh0L21wbGV4L01ha2VmaWxlLmFtOgorCSogZXh0L21wbGV4L2dzdG1wbGV4LmNjOgorCSogZXh0L21wbGV4L2dzdG1wbGV4Lmg6CisJKiBleHQvbXBsZXgvZ3N0bXBsZXguaGg6CisJKiBleHQvbXBsZXgvZ3N0bXBsZXhpYml0c3RyZWFtLmNjOgorCSogZXh0L21wbGV4L2dzdG1wbGV4aWJpdHN0cmVhbS5oaDoKKwkqIGV4dC9tcGxleC9nc3RtcGxleGpvYi5jYzoKKwkqIGV4dC9tcGxleC9nc3RtcGxleGpvYi5oaDoKKwkqIGV4dC9tcGxleC9nc3RtcGxleG91dHB1dHN0cmVhbS5jYzoKKwkqIGV4dC9tcGxleC9nc3RtcGxleG91dHB1dHN0cmVhbS5oaDoKKwkgIFdlIHdyYXAgbWpwZWd0b29scyBtcGxleC4gU28gSSByZXdyb3RlIHRoZSBwbHVnaW4uIFRoZSBvbGQgcGx1Z2luCisJICBoYWQgaXNzdWVzLCBkaWRuJ3QgZG8gY2Fwc25lZ28sIHN1cHBvcnRlZCBvbmx5IGEgc3Vic2V0IG9mIHRoZQorCSAgbXBsZXggZmVhdHVyZXMgYW5kIHJlcXVpcmVkIGEgbXBsZXggZm9yayBpbiBvdXIgbG9jYWwgQ1ZTLiBQbHVzCisJICB0aGF0IGl0IHdvcmtlZCBhZ2Fpc3QgYSB2ZXJ5IG9sZCBtcGxleCB2ZXJzaW9uLiBSZXdyaXRpbmcgd2FzCisJICBmYXN0ZXIgdGhhbiB1cGRhdGluZyBpdC4KKwkqIGdzdC1saWJzL2V4dC9NYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9JTlNUUlVDVDoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9NYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9SRUFETUU6CisJKiBnc3QtbGlicy9leHQvbXBsZXgvVE9ETzoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9hYzNzdHJtX2luLmNjOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L2F1ZGlvc3RybS5oaDoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9hdWRpb3N0cm1fb3V0LmNjOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L2F1bml0LmhoOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L2JpdHMuY2M6CisJKiBnc3QtbGlicy9leHQvbXBsZXgvYml0cy5oaDoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9idWZmZXIuY2M6CisJKiBnc3QtbGlicy9leHQvbXBsZXgvYnVmZmVyLmhoOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L2Zhc3RpbnRmbnMuaDoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9mb3JtYXRfY29kZXMuaDoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9pbnB1dHN0cm0uY2M6CisJKiBnc3QtbGlicy9leHQvbXBsZXgvaW5wdXRzdHJtLmhoOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L2xwY21zdHJtX2luLmNjOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L21qcGVnX2xvZ2dpbmcuY2M6CisJKiBnc3QtbGlicy9leHQvbXBsZXgvbWpwZWdfbG9nZ2luZy5oOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L21qcGVnX3R5cGVzLmg6CisJKiBnc3QtbGlicy9leHQvbXBsZXgvbXBhc3RybV9pbi5jYzoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9tcGVnY29uc3RzLmNjOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L21wZWdjb25zdHMuaDoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9tcGxleGNvbnN0cy5oaDoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9tdWx0cGxleC5jYzoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9vdXRwdXRzdHJlYW0uaGg6CisJKiBnc3QtbGlicy9leHQvbXBsZXgvcGFkc3RybS5jYzoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9wYWRzdHJtLmhoOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L3N0aWxsc3N0cmVhbS5jYzoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9zdGlsbHNzdHJlYW0uaGg6CisJKiBnc3QtbGlicy9leHQvbXBsZXgvc3lzdGVtcy5jYzoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9zeXN0ZW1zLmhoOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L3ZlY3Rvci5jYzoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC92ZWN0b3IuaGg6CisJKiBnc3QtbGlicy9leHQvbXBsZXgvdmlkZW9zdHJtLmhoOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L3ZpZGVvc3RybV9pbi5jYzoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC92aWRlb3N0cm1fb3V0LmNjOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L3l1djRtcGVnLmNjOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L3l1djRtcGVnLmg6CisJKiBnc3QtbGlicy9leHQvbXBsZXgveXV2NG1wZWdfaW50ZXJuLmg6CisJKiBnc3QtbGlicy9leHQvbXBsZXgveXV2NG1wZWdfcmF0aW8uY2M6CisJICBXZSBkb24ndCBmb3JrIG1qcGVndG9vbHMnIG1wbGV4IGluIG91ciBDVlMgYW55bW9yZS4KKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfc3JjX2dldGNhcHMpLAorCShnc3RfYXZpX2RlbXV4X2FkZF9zdHJlYW0pOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgQWRkIGdldGNhcHMoKSBmdW5jdGlvbiBmb3IgcHJvcGVyIGNhcHMgbmVnby4gVGhpcyBtYWtlcyBzb21lCisJICBwYXJ0cyBvZiBBVkkgcGxheWJhY2svcmVhZGluZyB3b3JrLgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19zaW5rY29ubmVjdCk6CisJICBSZXNpemUgd2luZG93IG9uIG5ldyBjYXBzbmVnby4gVGhpcyBpcyBwcm9iYWJseSB3cm9uZywgYnV0CisJICBJJ20gc3RpbGwgY29tbWl0dGluZyBpdCBiZWNhdXNlIHdpdGggY3VycmVudCBjYXBzbmVnbywgdGhlCisJICBmaXJzdCBzdWNjZXNzZnVsbCBjYXBzbmVnbyBpcyBhdXRvLWZpeGF0ZWQsIHRoZXJlZm9yZSByb3VuZGVkCisJICBkb3duIHRvIHRoZSBsb3dlc3QgdmFsdWVzIGluIHRoZSBjYXBzLiB0aGlzIHJlc3VsdHMgaW4gYSAxNngxNgorCSAgWFdpbmRvdyB0aGF0IGlzIG5vdCByZWl6ZWQgd2hlbiByZWFsIGNhcHNuZWdvIGZpbmlzaGVzLgorCSAgRGF2ZSwgSSBzZWUgbW9yZSBjYXNlcyBvZiB0aGlzLCBkbyB5b3Uga25vdyBhIHByb3BlciBzb2x1dGlvbj8KKwkqIHRvb2xzL2dzdC1sYXVuY2gtZXh0LmluOgorCSAgRml4IE1QRUctNCBBQUMgKEFwcGxlIGlQb2QvaVR1bmVzKSBmaWxlIGNvbW1hbmRsaW5lLgorCisyMDAzLTEyLTMxICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC90Y3AvZ3N0dGNwc3JjLmM6IChnc3RfdGNwc3JjX2dldCk6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19nZXQpOgorCSAgQ2hhbmdlIGdzdF9wYWRfcHJveHlfbGluaygpIHRvIGdzdF9wYWRfdHJ5X3NldF9jYXBzKCkKKworMjAwMy0xMi0zMCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2NvbG9yc3BhY2UuYzoKKwkoZ3N0X2ZmbXBlZ2NzcF9jYXBzX3JlbW92ZV9mb3JtYXRfaW5mbyksIChnc3RfZmZtcGVnY3NwX2dldGNhcHMpLAorCShnc3RfZmZtcGVnY3NwX3BhZF9saW5rKSwgKGdzdF9mZm1wZWdjc3BfaW5pdCksCisJKGdzdF9mZm1wZWdjc3BfY2hhaW4pOiBOZWdvdGlhdGlvbiBmaXhlcworCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfY2hhaW4pOiBOZWdvdGlhdGlvbiBmaXhlcworCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogKGdzdF9hdWRpb19jb252ZXJ0X2NoYWluKSwKKwkoZ3N0X2F1ZGlvX2NvbnZlcnRfbGluayksIChnc3RfYXVkaW9fY29udmVydF9jaGFubmVscyk6CisJKiBnc3QvYXVkaW9zY2FsZS9nc3RhdWRpb3NjYWxlLmM6IChnc3RfYXVkaW9zY2FsZV9nZXRjYXBzKSwKKwkoZ3N0X2F1ZGlvc2NhbGVfbGluayksIChnc3RfYXVkaW9zY2FsZV9nZXRfYnVmZmVyKSwKKwkoZ3N0X2F1ZGlvc2NhbGVfY2hhaW4pOiBOZWdvdGlhdGlvbiBmaXhlcworCSogZ3N0L2F1ZGlvc2NhbGUvZ3N0YXVkaW9zY2FsZS5oOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmlsdGVyLmM6CisJKGdzdF92aWRlb2ZpbHRlcl9mb3JtYXRfZ2V0X3N0cnVjdHVyZSksIChnc3RfdmlkZW9maWx0ZXJfZ2V0Y2FwcyksCisJKGdzdF92aWRlb2ZpbHRlcl9saW5rKSwgKGdzdF92aWRlb2ZpbHRlcl9pbml0KSwKKwkoZ3N0X3ZpZGVvZmlsdGVyX3NldF9vdXRwdXRfc2l6ZSksIChnc3RfdmlkZW9maWx0ZXJfc2V0dXApLAorCShnc3RfdmlkZW9maWx0ZXJfZmluZF9mb3JtYXRfYnlfc3RydWN0dXJlKToKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZpbHRlci5oOiBOZWdvdGlhdGlvbiBmaXhlcworCSogZ3N0L3ZpZGVvc2NhbGUvZ3N0dmlkZW9zY2FsZS5jOiAoZ3N0X3ZpZGVvc2NhbGVfZ2V0Y2FwcyksCisJKGdzdF92aWRlb3NjYWxlX2xpbmspOgorCSogZ3N0L3ZpZGVvc2NhbGUvdmlkZW9zY2FsZS5jOiAodmlkZW9zY2FsZV9nZXRfc3RydWN0dXJlKSwKKwkodmlkZW9zY2FsZV9maW5kX2J5X3N0cnVjdHVyZSksIChnc3RfdmlkZW9zY2FsZV9zZXR1cCk6CisJKiBnc3QvdmlkZW9zY2FsZS92aWRlb3NjYWxlLmg6IE5lZ290aWF0aW9uIGZpeGVzCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2hhbmRsZV94ZXZlbnRzKSwKKwkoZ3N0X3hpbWFnZXNpbmtfZml4YXRlKSwgKGdzdF94aW1hZ2VzaW5rX2luaXQpOiBBZGQgYSBmaXhhdGUKKwlmdW5jdGlvbiwgcmVzdHJpY3QgcmVzaXppbmcgdG8gYSBtdWx0aXBsZSBvZiA0IChoYWNrIHVudGlsCisJZXZlcnlvbmUgc3VwcG9ydHMgb2RkIHNpemVzIGNvcnJlY3RseSkuCisKKzIwMDMtMTItMjkgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGV4dC9lc2QvZXNkc2luay5jIChnc3RfZXNkc2lua19saW5rKTogRml4IHR5cG87IGdldCBkZXB0aCBpbnN0ZWFkIG9mCisJc2lnbmVkLgorCisyMDAzLTEyLTMwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZXh0L3NuZGZpbGUvZ3N0c2YuYzogKGdzdF9zZl9sb29wKToKKwkgIEZpeCB3YXJuaW5nIGFib3V0IGRpc2NhcmRpbmcgY29uc3QgcXVhbGlmaWVyCisKKzIwMDMtMTItMjcgIEplcmVteSBTaW1vbiAgIDxqZXNpbW9uQGxpYmVydHlzdXJmLmZyPgorCisJKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOgorCSogZ3N0L3ZpZGVvc2NhbGUvZ3N0dmlkZW9zY2FsZS5jOgorCSogZ3N0L3ZvbGVudi9nc3R2b2xlbnYuYzoKKwkqIGdzdC1saWJzL2dzdC9hdWRpby9hdWRpby5jOgorCSogZ3N0LWxpYnMvZ3N0L3ZpZGVvL3ZpZGVvLmM6CisJICBGaXggd2FybmluZ3MKKworMjAwMy0xMi0yNyAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9vcGVuX2F1ZGlvKToKKwkgIERvbid0IHNlbmQgQUxTQSBkZWJ1Z2dpbmcgdG8gc3RkZXJyLgorCSogZXh0L2Fsc2EvZ3N0YWxzYS5oOgorCSAgVXNlIEdTVF9XQVJOSU5HIGluc3RlYWQgb2YgZ193YXJuaW5nIHdoZW4gQUxTQSBmdW5jdGlvbnMgZmFpbC4KKworMjAwMy0xMi0yNyAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2dldF94dl9zdXBwb3J0KToKKwkgIEZyZWUgWFZBZGFwdGVySW5mbyBjb3JyZWN0bHkuCisKKzIwMDMtMTItMjcgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX2FkZF9zcmNfcGFkKSwKKwkoZ3N0X2lkM190YWdfZG9fY2Fwc19uZWdvKSwgKGdzdF9pZDNfdGFnX3NyY19saW5rKToKKwkgIE1ha2UgaWQzdGFnIHVzZSBjb3JyZWN0IGNhcHMgbmVnby4KKworMjAwMy0xMi0yNyAgQW1hdXJ5IEphY3F1b3QgPHN4cGVydEBlc2l0Y29tLm9yZz4KKworCSogZXh0L2l2b3JiaXMvdm9yYmlzLmM6CisJKiBleHQvaXZvcmJpcy92b3JiaXNlbmMuaDoKKwkqIGV4dC9pdm9yYmlzL3ZvcmJpc2ZpbGUuYzoKKwkgIE1vZGlmeSBzbyB0aGF0IGl0IHVzZXMgdGhlIG5ldyBjYXBzIHRoaW5ncworCisyMDAzLTEyLTI3ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIHRlc3RzdWl0ZS9zcGlkZXIvc3BpZGVyMS5jOiAobWFpbik6CisJKiB0ZXN0c3VpdGUvc3BpZGVyL3NwaWRlcjIuYzogKG1haW4pOgorCSogdGVzdHN1aXRlL3NwaWRlci9zcGlkZXIzLmM6IChtYWluKToKKwkgIE1ha2UgdGVzdHMgY29tcGlsZSBhZ2Fpbi4gVGhleSBwcm9iYWJseSBkb24ndCB3b3JrLgorCisyMDAzLTEyLTI0ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYyAoZ3N0X29zc3Npbmtfc2lua19maXhhdGUpOiBSZXR1cm4gTlVMTCBpZgorCXdlIGNhbid0IGZpeGF0ZSB0aGUgY2FwcyBhbnltb3JlLgorCisyMDAzLTEyLTIzICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC92b2x1bWUvZ3N0dm9sdW1lLmM6ICh2b2x1bWVfaW5pdCk6IFByb3h5IGdldGNhcHMuCisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3NzaW5rX2luaXQpLAorCShnc3Rfb3Nzc2lua19zaW5rX2ZpeGF0ZSk6IEFkZCBmaXhhdGUgZnVuY3Rpb24uCisKKzIwMDMtMTItMjQgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9mZm1wZWcvZ3N0ZmZtcGVnY29kZWNtYXAuYzoKKwkqIGV4dC9mZm1wZWcvZ3N0ZmZtcGVnY29sb3JzcGFjZS5jOiAoZ3N0X2ZmbXBlZ2NzcF9nZXRjYXBzKSwKKwkoZ3N0X2ZmbXBlZ2NzcF9zcmNjb25uZWN0X2Z1bmMpLCAoZ3N0X2ZmbXBlZ2NzcF9zaW5rY29ubmVjdCksCisJKGdzdF9mZm1wZWdjc3Bfc3JjY29ubmVjdCksIChnc3RfZmZtcGVnY3NwX2dldF90eXBlKSwKKwkoZ3N0X2ZmbXBlZ2NzcF9iYXNlX2luaXQpLCAoZ3N0X2ZmbXBlZ2NzcF9jbGFzc19pbml0KSwKKwkoZ3N0X2ZmbXBlZ2NzcF9pbml0KSwgKGdzdF9mZm1wZWdjc3BfY2hhaW4pLAorCShnc3RfZmZtcGVnY3NwX2NoYW5nZV9zdGF0ZSksIChnc3RfZmZtcGVnY3NwX3NldF9wcm9wZXJ0eSksCisJKGdzdF9mZm1wZWdjc3BfZ2V0X3Byb3BlcnR5KSwgKGdzdF9mZm1wZWdjc3BfcmVnaXN0ZXIpOgorCSAgZml4IHR5cG8gaW4gUkdCIG1hc2tzLCBhbmQgbW92ZSBiYWNrIHRvICJvbGQiIGNvbG9yc3BhY2UKKwkgIGNhcHNuZWdvIGNvZGUgdW50aWwgd2hvZXZlciB3cm90ZSB0aGlzIG5ldyBjcmFwIGhhcyBhY3R1YWxseQorCSAgdGVzdGVkIGl0IHNvIHRoYXQgaXQgd29ya3MuCisJICBBbmQgeWVzLCB0aGlzIHdvcmtzLCBrZWVwIGl0IHRoYXQgd2F5IHBsZWFzZS4KKworMjAwMy0xMi0yMyAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2RpdngvZ3N0ZGl2eGRlYy5jOiAoZ3N0X2RpdnhkZWNfYmFzZV9pbml0KSwKKwkoZ3N0X2RpdnhkZWNfaW5pdCksIChnc3RfZGl2eGRlY19uZWdvdGlhdGUpOgorCSogZXh0L2RpdngvZ3N0ZGl2eGRlYy5oOgorCSogZXh0L2RpdngvZ3N0ZGl2eGVuYy5jOiAoZ3N0X2RpdnhlbmNfYmFzZV9pbml0KSwKKwkoZ3N0X2RpdnhlbmNfaW5pdCk6CisJKiBleHQvZmFhYy9nc3RmYWFjLmM6IChnc3RfZmFhY19iYXNlX2luaXQpLCAoZ3N0X2ZhYWNfaW5pdCksCisJKGdzdF9mYWFjX3Npbmtjb25uZWN0KSwgKGdzdF9mYWFjX3NyY2Nvbm5lY3QpOgorCSogZXh0L21wZWcyZW5jL2dzdG1wZWcyZW5jLmNjOgorCSogZXh0L21wZWcyZW5jL2dzdG1wZWcyZW5jb2Rlci5jYzoKKwkqIGV4dC9tcGVnMmVuYy9nc3RtcGVnMmVuY3BpY3R1cmVyZWFkZXIuY2M6CisJKiBzeXMvZHhyMy9keHIzYXVkaW9zaW5rLmM6IChkeHIzYXVkaW9zaW5rX2Jhc2VfaW5pdCksCisJKGR4cjNhdWRpb3NpbmtfaW5pdCksIChkeHIzYXVkaW9zaW5rX3BjbV9zaW5rbGluayk6CisJKiBzeXMvZHhyMy9keHIzc3B1c2luay5jOiAoZHhyM3NwdXNpbmtfYmFzZV9pbml0KSwKKwkoZHhyM3NwdXNpbmtfaW5pdCk6CisJKiBzeXMvZHhyMy9keHIzdmlkZW9zaW5rLmM6IChkeHIzdmlkZW9zaW5rX2Jhc2VfaW5pdCksCisJKGR4cjN2aWRlb3NpbmtfaW5pdCk6CisJICBGaXggY2FwcyBicmVha2FnZSBhZnRlciBEYXZlJ3MgY2FwcyBicmFuY2ggbWVyZ2UuCisKKzIwMDMtMTItMjMgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KToKKwkgIEZpeCBmb3IgMjRicHAgZGlzcGxheS4KKworMjAwMy0xMi0yMyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzc2luay5jOiBBZGQgQVJHX0hBTkRMRSBwcm9wZXJ0eSB0aGF0IHRha2VzCisJYSBHbm9tZVZGU0hhbmRsZSBkaXJlY3RseS4KKworMjAwMy0xMi0yMiAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBnc3Qvdm9sdW1lL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZvbHVtZS9nc3R2b2x1bWUuYzogKHZvbHVtZV9jb25uZWN0KSwgKHZvbHVtZV9wYXJzZV9jYXBzKSwKKwkodm9sdW1lX2Jhc2VfaW5pdCksICh2b2x1bWVfaW5pdCk6CisJICBSZWVuYWJsZSB2b2x1bWUgZWxlbWVudCBhbmQgZml4IHRvIHdvcmsgd2l0aCBuZXcgY2FwcyBzdHVmZi4KKwkgIFJoeXRobWJveCBuZWVkcyB0aGlzLgorCisyMDAzLTEyLTIyICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHBsdWdpbl9pbml0KToKKwkgIHF0ZGVtdXggcmVxdWlyZXMgYnl0ZXN0cmVhbQorCisyMDAzLTEyLTIyICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX2dldF9jYXBzKSwgKGdzdF9hbHNhX2xpbmspOgorCSAgRml4IHJlbWFpbmluZyBjYXBzIGhhbmRsaW5nIGVycm9ycyBkdWUgdG8gQ0FQUyBtZXJnZS4KKworMjAwMy0xMi0yMiAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvZmFhZC9nc3RmYWFkLmM6IChnc3RfZmFhZF9iYXNlX2luaXQpLCAoZ3N0X2ZhYWRfaW5pdCksCisJKGdzdF9mYWFkX3Npbmtjb25uZWN0KSwgKGdzdF9mYWFkX3NyY2dldGNhcHMpLAorCShnc3RfZmFhZF9zcmNjb25uZWN0KToKKwkgIFBvcnQgdG8gbmV3IGNhcHMgc3lzdGVtLgorCisyMDAzLTEyLTIxICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGV4YW1wbGVzL2dzdHBsYXkvcGxheWVyLmM6IChnb3RfdGltZV90aWNrKSwgKGdvdF9zdHJlYW1fbGVuZ3RoKSwKKwkoZ290X3ZpZGVvX3NpemUpLCAobWFpbik6IHVzaW5nIGdfcHJpbnQgaW5zdGVhZCBvZiBnX21lc3NhZ2UuCisJKiBnc3QtbGlicy9nc3QvcGxheS9nc3RwbGF5LmM6IChnc3RfcGxheV9waXBlbGluZV9zZXR1cCk6IEZpeGluZyBFT1MKKwlzaWduYWwgd2hpY2ggd2FzIG5vdCBlbWl0dGVkIGJlY2F1c2Ugb2YgInN3aXRjaCIgZWxlbWVudCBhZGRlZCB0byB0aGUKKwliaW4gYnV0IG5vdCBjb25uZWN0ZWQuIChSZW1vdmluZyBmcm9tIHRoZSBiaW4gdGVtcG9yYXJpbHkpCisKKzIwMDMtMTItMjEgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogY29uZmlndXJlLmFjOiBYX0RJU1BMQVlfTUlTU0lORyBpcyBzZXQgdG8gMSBpZiBBQ19QQVRIX1hUUkEgZmFpbHMgdG8KKwlmaW5kIFggZGV2ZWxvcG1lbnQgZmlsZXMuIEkgZG9uJ3QgdW5kZXJzdGFuZCB0aGUgcHJldmlvdXMgdGVzdHMgYW5kCisJdGhleSBmYWlsIG9uIG15IGRlYmlhbi9wcGMgdW5zdGFibGUuIFRoaXMgb25lIHdvcmtzLgorCSogZXhhbXBsZXMvZ3N0cGxheS9wbGF5ZXIuYzogKG1haW4pOiBTZXQgdGhlIHBpcGVsaW5lIHRvIFJFQURZIGJlZm9yZQorCWV4aXRpbmcuCisJKiBnc3QtbGlicy9nc3QvcGxheS9nc3RwbGF5LmM6IChnc3RfcGxheV9nZXRfbGVuZ3RoX2NhbGxiYWNrKSwKKwkoZ3N0X3BsYXlfc2V0X3ZpZGVvX3NpbmspLCAoZ3N0X3BsYXlfc2V0X2F1ZGlvX3NpbmspLAorCShnc3RfcGxheV9zZXRfdmlzdWFsaXphdGlvbik6IEFkZCBzb21lIHNhZmV0eSBjaGVja3MgaW4gc2V0XyBtZXRob2RzCisJYW5kIHN0YXRlX2NoYW5nZS4gVGhpcyB3YXMgdGhyb3dpbmcgc29tZSB1Z2x5IENSSVRJQ0FMIG1lc3NhZ2VzIHdoZW4KKwlwaXBlbGluZSB3YXMgZ2V0dGluZyBkaXNwb3NlZCBhbmQgY2FzdHMgd2VyZSBmYWlsaW5nLgorCisyMDAzLTEyLTIxICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJICBJbXByb3ZlIG1wZWcyZW5jIGRldGVjdGlvbi4gVGhpcyBpcyBmb3IgZGlzdHJpYnV0aW9ucyB0aGF0IGRvCisJICBzaGlwIG1qcGVndG9vbHMsIGJ1dCB3aXRob3V0IG1wZWcyZW5jLiBBbHNvIGRvZXMgb2JqZWN0IGNoZWNrCisJICBmb3IgbWlnaHQgdGhlcmUgZXZlciBiZSBBQkkgaW5jb21wYXRpYmlsaXR5LgorCSogZXh0L21wZWcyZW5jL2dzdG1wZWcyZW5jLmNjOgorCSAgQWRkIEFuZHJldyBhcyBzZWNvbmQgbWFpbnRhaW5lciAoaGUncyBoZWxwaW5nIG1lKSwgYW5kIGFsc28gYWRkCisJICBhbiBlcnJvciBpZiBubyBjYXBzIHdhcyBzZXQuIFRoaXMgaGFwcGVucyBpZiBJIHB1bGwgYmVmb3JlIGNhcHNuZWdvCisJICBhbmQgdGhhdCdzIHNvbWV0aGluZyBJIHNob3VsZCBzb2x2ZSBzb21ldGltZSBlbHNlLgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwKToKKwkgIEZpeCB0aW1lIHBhcnNpbmcuCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChnc3RfbWF0cm9za2FfbXV4X2F1ZGlvX3BhZF9saW5rKSwKKwkoZ3N0X21hdHJvc2thX211eF90cmFja19oZWFkZXIpOgorCSAgQWRkIGNhcHMgdG8gdGVtcGxhdGVzLgorCSogZ3N0L21wZWdhdWRpb3BhcnNlL2dzdG1wZWdhdWRpb3BhcnNlLmM6IChtcDNfc2lua19mYWN0b3J5KToKKwkgIEFkZCBtcGVndmVyc2lvbj0xIHRvIHByZXZlbnQgY29uZnVzaW9uIHdpdGggTVBFRy9BQUMuCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVnZGVtdXguYzoKKwkgIFJlbW92ZSBsYXllciBzaW5jZSBpdCBjYXVzZXMgd2FybmluZ3MgYWJvdXQgdW5maXhlZCBjYXBzLgorCSogZ3N0L3ZpZGVvdGVzdHNyYy9nc3R2aWRlb3Rlc3RzcmMuYzogKGdzdF92aWRlb3Rlc3RzcmNfZ2V0KToKKwkgIEZpeCBvYnZpb3VzIHR5cG8gKHdlIGVycm9yIG91dCBpZiBjYXBzIHdlcmUgc2V0LCB3ZSBzaG91bGQgb2YKKwkgIGNvdXJzZSBlcnJvciBvdXQgaWYgKm5vKiBjYXBzIHdlcmUgc2V0KS4KKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5jOiAoZ3N0X29zc2VsZW1lbnRfY29udmVydCk6CisJICBGaXggZm9ybWF0IGNvbnZlcnNpb24sIHdlIGNvbmZ1c2VkIGJpdHMvYnl0ZXMuCisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuaDoKKwkgIEltcHJvdmUgZG9jdW1lbnRhdGlvbiBmb3IgJ2JwcycuCisJKiBzeXMvdjRsL1RPRE86CisJICBSZW1vdmUgc3R1ZmYgYWJvdXQgcGx1Z2lucyB0aGF0IG5lZWQgcmVtb3ZpbmcgLSB0aGlzIHdhcyBkb25lCisJICBhZ2VzIGFnby4KKwkqIHN5cy92NGwvZ3N0djRsbWpwZWdzcmMuYzogKGdzdF92NGxtanBlZ3NyY19pbml0KSwKKwkoZ3N0X3Y0bG1qcGVnc3JjX3NyY19jb252ZXJ0KSwgKGdzdF92NGxtanBlZ3NyY19zcmNfcXVlcnkpOgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzogKGdzdF92NGxzcmNfaW5pdCksIChnc3RfdjRsc3JjX3NyY19jb252ZXJ0KSwKKwkoZ3N0X3Y0bHNyY19zcmNfcXVlcnkpOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfaW5pdCksCisJKGdzdF92NGwyc3JjX3NyY19jb252ZXJ0KSwgKGdzdF92NGwyc3JjX3NyY19xdWVyeSk6CisJICBBZGQgZ2V0X3F1ZXJ5X3R5cGVzKCksIGdldF9mb3JtYXRzKCkgYW5kIHF1ZXJ5KCkgZnVuY3Rpb25zLgorCisyMDAzLTEyLTIxICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBDaGFuZ2VMb2c6IG1vdmVkIHRvIGdzdHJlYW1lci9kb2NzL3JhbmRvbS9vbGQvQ2hhbmdlTG9nLmdzdC1wbHVnaW5zCisgICAgICAgICogbW92ZWQgQ1ZTIHRvIGZyZWVkZXNrdG9wLm9yZworCmRpZmYgLS1naXQgYS9kb2NzL3JhbmRvbS9QT1JURURfMDkgYi9kb2NzL3JhbmRvbS9QT1JURURfMDkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk2Mjk3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcmFuZG9tL1BPUlRFRF8wOQpAQCAtMCwwICsxLDIwIEBACitXaGVuIHBvcnRpbmcgYSBwbHVnaW4gc3RhcnQgd2l0aCAwLjggQ1ZTIGhlYWQsIG5vdCB0aGUgb2xkIGNvZGUgaW4gdGhpcyBtb2R1bGUuIFRoZXJlIGFyZSBtYW55IGJ1Z2ZpeGVzIHdoaWNoIGhhdmUgZ29uZSBpbnRvIDAuOCB3aGljaCB5b3Ugd2FudCB0byBrZWVwLgorCitMaXN0IG9mIHBvcnRlZCBwbHVnaW5zICh1cGRhdGUgd2hlbiB5b3UgY29tbWl0IGEgcG9ydGVkIHBsdWdpbik6CitzcGVleGVuYyAoYWxpbWEpCithdXBhcnNlIChhbGltYSkKK2VmZmVjdHYgKHdpbSkKK21hZAkod2ltKQordmlkZW9maWx0ZXIgKHdpbSkKK2FhbGliCSh3aW0pCitsaWJjYWNhCSh6ZWVzaGFuKQorbGF3CSh3aW0pCitzaG91dDIgICh6YWhlZXIpIC0gbm90IGZ1bGx5IHRlc3RlZAorZXNkc2luayAoYXJ3ZWQpCittdWx0aXBhcnQgKGRvbHBoeSkKKworb3Nzc2luayBpcyBwYXJ0aWFsbHkgZG9uZSBpbiB0aGUgdGhyZWFkZWQgYnJhbmNoICh3aW0pCisKKy0gUmVtZW1iZXIgdGhhdCBzb21lIHBsdWdpbnMgYXJlIGFscmVhZHkgcG9ydGVkIGFuZCBub3cgaW4gdGhlIGdzdC1wbHVnaW5zLWJhc2UgbW9kdWxlLgorCitXaGVuIHlvdSBoYXZlIHBvcnRlZCBhIHBsdWdpbiByZW1lbWJlciB0byBjb3B5IHRoZSByZWxldmFudCBwYXJ0cyBmcm9tIGNvbmZpZ3VyZS5hYy5vcmlnIGludG8gY29uZmlndXJlLmFjIGFuZCByZS1lbmFibGUgaXQgaW4gdGhlIE1ha2VmaWxlLmFtIGZpbGVzLgpkaWZmIC0tZ2l0IGEvZG9jcy92ZXJzaW9uLmVudGl0aWVzLmluIGIvZG9jcy92ZXJzaW9uLmVudGl0aWVzLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4Njk4OWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3ZlcnNpb24uZW50aXRpZXMuaW4KQEAgLTAsMCArMSwyIEBACis8IUVOVElUWSBHU1RfQVBJX1ZFUlNJT04gIkBHU1RfQVBJX1ZFUlNJT05AIj4KKzwhRU5USVRZIEdTVF9WRVJTSU9OICJAVkVSU0lPTkAiPgpkaWZmIC0tZ2l0IGEvZXh0L01ha2VmaWxlLmFtIGIvZXh0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMTI5M2IKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxNzYgQEAKK2lmIFVTRV9BQUxJQgorQUFMSUJfRElSID0gYWFsaWIKK2Vsc2UKK0FBTElCX0RJUiA9CitlbmRpZgorCitpZiBVU0VfQ0FJUk8KK0NBSVJPX0RJUiA9IGNhaXJvCitlbHNlCitDQUlST19ESVIgPQorZW5kaWYKKworaWYgVVNFX0ZMQUMKK0ZMQUNfRElSID0gZmxhYworZWxzZQorRkxBQ19ESVIgPQorZW5kaWYKKworaWYgVVNFX0dES19QSVhCVUYKK0dES19QSVhCVUZfRElSID0gZ2RrX3BpeGJ1ZgorZWxzZQorR0RLX1BJWEJVRl9ESVIgPQorZW5kaWYKKworICAKK2lmIFVTRV9HVEszCitHVEtfRElSPWd0aworZWxzZQorR1RLX0RJUj0KK2VuZGlmCisgCitpZiBVU0VfSkFDSworSkFDS19ESVI9amFjaworZWxzZQorSkFDS19ESVI9CitlbmRpZgorCitpZiBVU0VfSlBFRworSlBFR19ESVIgPSBqcGVnCitlbHNlCitKUEVHX0RJUiA9CitlbmRpZgorCitpZiBVU0VfTEFNRQorTEFNRV9ESVIgPSBsYW1lCitlbHNlCitMQU1FX0RJUiA9CitlbmRpZgorCitpZiBVU0VfTElCQ0FDQQorTElCQ0FDQV9ESVIgPSBsaWJjYWNhCitlbHNlCitMSUJDQUNBX0RJUiA9CitlbmRpZgorCitpZiBVU0VfTElCRFYKK0xJQkRWX0RJUiA9IGR2CitlbHNlCitMSUJEVl9ESVIgPQorZW5kaWYKKworaWYgVVNFX0xJQlBORworTElCUE5HX0RJUiA9IGxpYnBuZworZWxzZQorTElCUE5HX0RJUiA9CitlbmRpZgorCitpZiBVU0VfTVBHMTIzCitNUEcxMjNfRElSID0gbXBnMTIzCitlbHNlCitNUEcxMjNfRElSID0KK2VuZGlmCisKK2lmIFVTRV9EVjEzOTQKK0RWMTM5NF9ESVIgPSByYXcxMzk0CitlbHNlCitEVjEzOTRfRElSID0KK2VuZGlmCisKK2lmIFVTRV9QVUxTRQorUFVMU0VfRElSID0gcHVsc2UKK2Vsc2UKK1BVTFNFX0RJUiA9CitlbmRpZgorCisKK2lmIFVTRV9TSE9VVDIKK1NIT1VUMl9ESVIgPSBzaG91dDIKK2Vsc2UKK1NIT1VUMl9ESVIgPQorZW5kaWYKKworaWYgVVNFX1NPVVAKK1NPVVBfRElSPXNvdXAKK2Vsc2UKK1NPVVBfRElSPQorZW5kaWYKKworaWYgVVNFX1NQRUVYCitTUEVFWF9ESVIgPSBzcGVleAorZWxzZQorU1BFRVhfRElSID0KK2VuZGlmCisKK2lmIFVTRV9UQUdMSUIKK1RBR0xJQl9ESVIgPSB0YWdsaWIKK2Vsc2UKK1RBR0xJQl9ESVIgPQorZW5kaWYKKworaWYgVVNFX1RXT0xBTUUKK1RXT0xBTUVfRElSID0gdHdvbGFtZQorZWxzZQorVFdPTEFNRV9ESVIgPQorZW5kaWYKKworaWYgVVNFX1ZQWAorVlBYX0RJUj12cHgKK2Vsc2UKK1ZQWF9ESVI9CitlbmRpZgorCitpZiBVU0VfV0FWUEFDSworV0FWUEFDS19ESVI9d2F2cGFjaworZWxzZQorV0FWUEFDS19ESVI9CitlbmRpZgorCitTVUJESVJTID0gXAorCSQoQUFMSUJfRElSKSBcCisJJChDQUlST19ESVIpIFwKKwkkKERWMTM5NF9ESVIpIFwKKwkkKEZMQUNfRElSKSBcCisJJChHREtfUElYQlVGX0RJUikgXAorCSQoR1RLX0RJUikgXAorCSQoSkFDS19ESVIpIFwKKwkkKEpQRUdfRElSKSBcCisJJChMQU1FX0RJUikgXAorCSQoTElCQ0FDQV9ESVIpIFwKKwkkKExJQkRWX0RJUikgXAorCSQoTElCTU5HX0RJUikgXAorCSQoTElCUE5HX0RJUikgXAorCSQoTVBHMTIzX0RJUikgXAorCSQoUFVMU0VfRElSKSBcCisJJChTSE9VVDJfRElSKSBcCisJJChTT1VQX0RJUikgXAorCSQoU1BFRVhfRElSKSBcCisJJChUQUdMSUJfRElSKSBcCisJJChUV09MQU1FX0RJUikgXAorCSQoVlBYX0RJUikgXAorCSQoV0FWUEFDS19ESVIpCisKK0RJU1RfU1VCRElSUyA9IFwKKwlhYWxpYiBcCisJY2Fpcm8gXAorCWR2IFwKKwlmbGFjIFwKKwlnZGtfcGl4YnVmIFwKKwlndGsgXAorCWphY2sgXAorCWpwZWcgXAorCWxhbWUgXAorCWxpYmNhY2EgXAorCWxpYnBuZyBcCisJbXBnMTIzIFwKKwlwdWxzZSBcCisJcmF3MTM5NCBcCisJc2hvdXQyIFwKKwlzb3VwIFwKKwlzcGVleCBcCisJdGFnbGliIFwKKwl0d29sYW1lIFwKKwl2cHggXAorCXdhdnBhY2sKKworaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2NvbW1vbi9wYXJhbGxlbC1zdWJkaXJzLm1hawpkaWZmIC0tZ2l0IGEvZXh0L2FhbGliL01ha2VmaWxlLmFtIGIvZXh0L2FhbGliL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYjY2ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvYWFsaWIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RhYXNpbmsubGEKKworbGliZ3N0YWFzaW5rX2xhX1NPVVJDRVMgPSBnc3RhYXNpbmsuYworbGliZ3N0YWFzaW5rX2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpICQoQUFMSUJfQ0ZMQUdTKQorbGliZ3N0YWFzaW5rX2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHZpZGVvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoQUFMSUJfTElCUykKK2xpYmdzdGFhc2lua19sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gZ3N0YWFzaW5rLmgKZGlmZiAtLWdpdCBhL2V4dC9hYWxpYi9nc3RhYXNpbmsuYyBiL2V4dC9hYWxpYi9nc3RhYXNpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODBlNDc5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2FhbGliL2dzdGFhc2luay5jCkBAIC0wLDAgKzEsNTk1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LWFhc2luaworICogQHNlZV9hbHNvOiAjR3N0Q0FDQVNpbmsKKyAqCisgKiBEaXNwbGF5cyB2aWRlbyBhcyBiL3cgYXNjaWkgYXJ0LgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPXRlc3QuYXZpICEgZGVjb2RlYmluICEgdmlkZW9jb252ZXJ0ICEgYWFzaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIHJlbmRlcnMgYSB2aWRlbyB0byBhc2NpaSBhcnQgaW50byBhIHNlcGFyYXRlIHdpbmRvdy4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPXRlc3QuYXZpICEgZGVjb2RlYmluICEgdmlkZW9jb252ZXJ0ICEgYWFzaW5rIGRyaXZlcj1jdXJzZXMKKyAqIF18IFRoaXMgcGlwZWxpbmUgcmVuZGVycyBhIHZpZGVvIHRvIGFzY2lpIGFydCBpbnRvIHRoZSBjdXJyZW50IHRlcm1pbmFsLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvbWV0YS5oPgorI2luY2x1ZGUgImdzdGFhc2luay5oIgorCisvKiBhYXNpbmsgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICBMQVNUX1NJR05BTAorfTsKKworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9XSURUSCwKKyAgUFJPUF9IRUlHSFQsCisgIFBST1BfRFJJVkVSLAorICBQUk9QX0RJVEhFUiwKKyAgUFJPUF9CUklHSFRORVNTLAorICBQUk9QX0NPTlRSQVNULAorICBQUk9QX0dBTU1BLAorICBQUk9QX0lOVkVSU0lPTiwKKyAgUFJPUF9SQU5ET01WQUwsCisgIFBST1BfRlJBTUVTX0RJU1BMQVlFRCwKKyAgUFJPUF9GUkFNRV9USU1FCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoIkk0MjAiKSkKKyAgICApOworCitzdGF0aWMgR3N0Q2FwcyAqZ3N0X2Fhc2lua19maXhhdGUgKEdzdEJhc2VTaW5rICogYnNpbmssIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYWFzaW5rX3NldGNhcHMgKEdzdEJhc2VTaW5rICogYnNpbmssIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyB2b2lkIGdzdF9hYXNpbmtfZ2V0X3RpbWVzIChHc3RCYXNlU2luayAqIGJzaW5rLCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgR3N0Q2xvY2tUaW1lICogc3RhcnQsIEdzdENsb2NrVGltZSAqIGVuZCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2Fhc2lua19wcm9wb3NlX2FsbG9jYXRpb24gKEdzdEJhc2VTaW5rICogYnNpbmssCisgICAgR3N0UXVlcnkgKiBxdWVyeSk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfYWFzaW5rX3Nob3dfZnJhbWUgKEdzdFZpZGVvU2luayAqIHZpZGVvc2luaywKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworCitzdGF0aWMgdm9pZCBnc3RfYWFzaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hYXNpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X2Fhc2lua19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCisjZGVmaW5lIGdzdF9hYXNpbmtfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0QUFTaW5rLCBnc3RfYWFzaW5rLCBHU1RfVFlQRV9WSURFT19TSU5LKTsKKworI2RlZmluZSBHU1RfVFlQRV9BQURSSVZFUlMgKGdzdF9hYXNpbmtfZHJpdmVyc19nZXRfdHlwZSgpKQorc3RhdGljIEdUeXBlCitnc3RfYWFzaW5rX2RyaXZlcnNfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBkcml2ZXJfdHlwZSA9IDA7CisKKyAgaWYgKCFkcml2ZXJfdHlwZSkgeworICAgIEdFbnVtVmFsdWUgKmRyaXZlcnM7CisgICAgY29uc3Qgc3RydWN0IGFhX2RyaXZlciAqZHJpdmVyOworICAgIGdpbnQgbl9kcml2ZXJzOworICAgIGdpbnQgaTsKKworICAgIGZvciAobl9kcml2ZXJzID0gMDsgYWFfZHJpdmVyc1tuX2RyaXZlcnNdOyBuX2RyaXZlcnMrKykgeworICAgICAgLyogY291bnQgbnVtYmVyIG9mIGRyaXZlcnMgKi8KKyAgICB9CisKKyAgICBkcml2ZXJzID0gZ19uZXcwIChHRW51bVZhbHVlLCBuX2RyaXZlcnMgKyAxKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuX2RyaXZlcnM7IGkrKykgeworICAgICAgZHJpdmVyID0gYWFfZHJpdmVyc1tpXTsKKyAgICAgIGRyaXZlcnNbaV0udmFsdWUgPSBpOworICAgICAgZHJpdmVyc1tpXS52YWx1ZV9uYW1lID0gZ19zdHJkdXAgKGRyaXZlci0+bmFtZSk7CisgICAgICBkcml2ZXJzW2ldLnZhbHVlX25pY2sgPSBnX3V0Zjhfc3RyZG93biAoZHJpdmVyLT5zaG9ydG5hbWUsIC0xKTsKKyAgICB9CisgICAgZHJpdmVyc1tpXS52YWx1ZSA9IDA7CisgICAgZHJpdmVyc1tpXS52YWx1ZV9uYW1lID0gTlVMTDsKKyAgICBkcml2ZXJzW2ldLnZhbHVlX25pY2sgPSBOVUxMOworCisgICAgZHJpdmVyX3R5cGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0QUFTaW5rRHJpdmVycyIsIGRyaXZlcnMpOworICB9CisgIHJldHVybiBkcml2ZXJfdHlwZTsKK30KKworI2RlZmluZSBHU1RfVFlQRV9BQURJVEhFUiAoZ3N0X2Fhc2lua19kaXRoZXJfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X2Fhc2lua19kaXRoZXJfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBkaXRoZXJfdHlwZSA9IDA7CisKKyAgaWYgKCFkaXRoZXJfdHlwZSkgeworICAgIEdFbnVtVmFsdWUgKmRpdGhlcmVyczsKKyAgICBnaW50IG5fZGl0aGVyZXJzOworICAgIGdpbnQgaTsKKworICAgIGZvciAobl9kaXRoZXJlcnMgPSAwOyBhYV9kaXRoZXJuYW1lc1tuX2RpdGhlcmVyc107IG5fZGl0aGVyZXJzKyspIHsKKyAgICAgIC8qIGNvdW50IG51bWJlciBvZiBkaXRoZXJlcnMgKi8KKyAgICB9CisKKyAgICBkaXRoZXJlcnMgPSBnX25ldzAgKEdFbnVtVmFsdWUsIG5fZGl0aGVyZXJzICsgMSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbl9kaXRoZXJlcnM7IGkrKykgeworICAgICAgZGl0aGVyZXJzW2ldLnZhbHVlID0gaTsKKyAgICAgIGRpdGhlcmVyc1tpXS52YWx1ZV9uYW1lID0gZ19zdHJkdXAgKGFhX2RpdGhlcm5hbWVzW2ldKTsKKyAgICAgIGRpdGhlcmVyc1tpXS52YWx1ZV9uaWNrID0KKyAgICAgICAgICBnX3N0cmRlbGltaXQgKGdfc3RyZHVwIChhYV9kaXRoZXJuYW1lc1tpXSksICIgXyIsICctJyk7CisgICAgfQorICAgIGRpdGhlcmVyc1tpXS52YWx1ZSA9IDA7CisgICAgZGl0aGVyZXJzW2ldLnZhbHVlX25hbWUgPSBOVUxMOworICAgIGRpdGhlcmVyc1tpXS52YWx1ZV9uaWNrID0gTlVMTDsKKworICAgIGRpdGhlcl90eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdEFBU2lua0RpdGhlcmVycyIsIGRpdGhlcmVycyk7CisgIH0KKyAgcmV0dXJuIGRpdGhlcl90eXBlOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2Fhc2lua19jbGFzc19pbml0IChHc3RBQVNpbmtDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0QmFzZVNpbmtDbGFzcyAqZ3N0YmFzZXNpbmtfY2xhc3M7CisgIEdzdFZpZGVvU2lua0NsYXNzICpnc3R2aWRlb3NpbmtfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RiYXNlc2lua19jbGFzcyA9IChHc3RCYXNlU2lua0NsYXNzICopIGtsYXNzOworICBnc3R2aWRlb3NpbmtfY2xhc3MgPSAoR3N0VmlkZW9TaW5rQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2Fhc2lua19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9hYXNpbmtfZ2V0X3Byb3BlcnR5OworCisgIC8qIEZJWE1FOiBhZGQgbG9uZyBwcm9wZXJ0eSBkZXNjcmlwdGlvbnMgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9XSURUSCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ3aWR0aCIsICJ3aWR0aCIsICJ3aWR0aCIsIEdfTUlOSU5ULCBHX01BWElOVCwgMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9IRUlHSFQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiaGVpZ2h0IiwgImhlaWdodCIsICJoZWlnaHQiLCBHX01JTklOVCwgR19NQVhJTlQsIDAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfRFJJVkVSLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJkcml2ZXIiLCAiZHJpdmVyIiwgImRyaXZlciIsIEdTVF9UWVBFX0FBRFJJVkVSUywgMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9ESVRIRVIsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoImRpdGhlciIsICJkaXRoZXIiLCAiZGl0aGVyIiwgR1NUX1RZUEVfQUFESVRIRVIsIDAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQlJJR0hUTkVTUywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJicmlnaHRuZXNzIiwgImJyaWdodG5lc3MiLCAiYnJpZ2h0bmVzcyIsIEdfTUlOSU5ULAorICAgICAgICAgIEdfTUFYSU5ULCAwLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9DT05UUkFTVCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJjb250cmFzdCIsICJjb250cmFzdCIsICJjb250cmFzdCIsIEdfTUlOSU5ULCBHX01BWElOVCwKKyAgICAgICAgICAwLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9HQU1NQSwKKyAgICAgIGdfcGFyYW1fc3BlY19mbG9hdCAoImdhbW1hIiwgImdhbW1hIiwgImdhbW1hIiwgMC4wLCA1LjAsIDEuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9JTlZFUlNJT04sCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImludmVyc2lvbiIsICJpbnZlcnNpb24iLCAiaW52ZXJzaW9uIiwgVFJVRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9SQU5ET01WQUwsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicmFuZG9tdmFsIiwgInJhbmRvbXZhbCIsICJyYW5kb212YWwiLCBHX01JTklOVCwKKyAgICAgICAgICBHX01BWElOVCwgMCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksCisgICAgICBQUk9QX0ZSQU1FU19ESVNQTEFZRUQsIGdfcGFyYW1fc3BlY19pbnQgKCJmcmFtZXMtZGlzcGxheWVkIiwKKyAgICAgICAgICAiZnJhbWVzIGRpc3BsYXllZCIsICJmcmFtZXMgZGlzcGxheWVkIiwgR19NSU5JTlQsIEdfTUFYSU5ULCAwLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfRlJBTUVfVElNRSwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJmcmFtZS10aW1lIiwgImZyYW1lIHRpbWUiLCAiZnJhbWUgdGltZSIsIEdfTUlOSU5ULAorICAgICAgICAgIEdfTUFYSU5ULCAwLCBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJBU0NJSSBhcnQgdmlkZW8gc2luayIsICJTaW5rL1ZpZGVvIiwgIkFuIEFTQ0lJIGFydCB2aWRlb3NpbmsiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BjaGVsbG8uYmU+Iik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hYXNpbmtfY2hhbmdlX3N0YXRlKTsKKworICBnc3RiYXNlc2lua19jbGFzcy0+Zml4YXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hYXNpbmtfZml4YXRlKTsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnNldF9jYXBzID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hYXNpbmtfc2V0Y2Fwcyk7CisgIGdzdGJhc2VzaW5rX2NsYXNzLT5nZXRfdGltZXMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Fhc2lua19nZXRfdGltZXMpOworICBnc3RiYXNlc2lua19jbGFzcy0+cHJvcG9zZV9hbGxvY2F0aW9uID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWFzaW5rX3Byb3Bvc2VfYWxsb2NhdGlvbik7CisKKyAgZ3N0dmlkZW9zaW5rX2NsYXNzLT5zaG93X2ZyYW1lID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hYXNpbmtfc2hvd19mcmFtZSk7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9hYXNpbmtfZml4YXRlIChHc3RCYXNlU2luayAqIGJzaW5rLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisKKyAgY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGNhcHMpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfaW50IChzdHJ1Y3R1cmUsICJ3aWR0aCIsIDMyMCk7CisgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfaW50IChzdHJ1Y3R1cmUsICJoZWlnaHQiLCAyNDApOworICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ZyYWN0aW9uIChzdHJ1Y3R1cmUsICJmcmFtZXJhdGUiLCAzMCwgMSk7CisKKyAgY2FwcyA9IEdTVF9CQVNFX1NJTktfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpeGF0ZSAoYnNpbmssIGNhcHMpOworCisgIHJldHVybiBjYXBzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hYXNpbmtfc2V0Y2FwcyAoR3N0QmFzZVNpbmsgKiBiYXNlc2luaywgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdEFBU2luayAqYWFzaW5rOworICBHc3RWaWRlb0luZm8gaW5mbzsKKworICBhYXNpbmsgPSBHU1RfQUFTSU5LIChiYXNlc2luayk7CisKKyAgaWYgKCFnc3RfdmlkZW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBjYXBzKSkKKyAgICBnb3RvIGludmFsaWRfY2FwczsKKworICBhYXNpbmstPmluZm8gPSBpbmZvOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworaW52YWxpZF9jYXBzOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYWFzaW5rLCAiaW52YWxpZCBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYWFzaW5rX2luaXQgKEdzdEFBU2luayAqIGFhc2luaykKK3sKKyAgbWVtY3B5ICgmYWFzaW5rLT5hc2NpaV9zdXJmLCAmYWFfZGVmcGFyYW1zLAorICAgICAgc2l6ZW9mIChzdHJ1Y3QgYWFfaGFyZHdhcmVfcGFyYW1zKSk7CisgIGFhc2luay0+YXNjaWlfcGFybXMuYnJpZ2h0ID0gMDsKKyAgYWFzaW5rLT5hc2NpaV9wYXJtcy5jb250cmFzdCA9IDE2OworICBhYXNpbmstPmFzY2lpX3Bhcm1zLmdhbW1hID0gMS4wOworICBhYXNpbmstPmFzY2lpX3Bhcm1zLmRpdGhlciA9IDA7CisgIGFhc2luay0+YXNjaWlfcGFybXMuaW52ZXJzaW9uID0gMDsKKyAgYWFzaW5rLT5hc2NpaV9wYXJtcy5yYW5kb212YWwgPSAwOworICBhYXNpbmstPmFhX2RyaXZlciA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYWFzaW5rX3NjYWxlIChHc3RBQVNpbmsgKiBhYXNpbmssIGd1Y2hhciAqIHNyYywgZ3VjaGFyICogZGVzdCwKKyAgICBnaW50IHN3LCBnaW50IHNoLCBnaW50IHNzLCBnaW50IGR3LCBnaW50IGRoKQoreworICBnaW50IHlwb3MsIHlpbmMsIHk7CisgIGdpbnQgeHBvcywgeGluYywgeDsKKworICBnX3JldHVybl9pZl9mYWlsICgoZHcgIT0gMCkgJiYgKGRoICE9IDApKTsKKworICB5cG9zID0gMHgxMDAwMDsKKyAgeWluYyA9IChzaCA8PCAxNikgLyBkaDsKKyAgeGluYyA9IChzdyA8PCAxNikgLyBkdzsKKworICBmb3IgKHkgPSBkaDsgeTsgeS0tKSB7CisgICAgd2hpbGUgKHlwb3MgPiAweDEwMDAwKSB7CisgICAgICB5cG9zIC09IDB4MTAwMDA7CisgICAgICBzcmMgKz0gc3M7CisgICAgfQorICAgIHhwb3MgPSAweDEwMDAwOworICAgIHsKKyAgICAgIGd1Y2hhciAqZGVzdHAgPSBkZXN0OworICAgICAgZ3VjaGFyICpzcmNwID0gc3JjOworCisgICAgICBmb3IgKHggPSBkdzsgeDsgeC0tKSB7CisgICAgICAgIHdoaWxlICh4cG9zID49IDB4MTAwMDBMKSB7CisgICAgICAgICAgc3JjcCsrOworICAgICAgICAgIHhwb3MgLT0gMHgxMDAwMEw7CisgICAgICAgIH0KKyAgICAgICAgKmRlc3RwKysgPSAqc3JjcDsKKyAgICAgICAgeHBvcyArPSB4aW5jOworICAgICAgfQorICAgIH0KKyAgICBkZXN0ICs9IGR3OworICAgIHlwb3MgKz0geWluYzsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2Fhc2lua19nZXRfdGltZXMgKEdzdEJhc2VTaW5rICogc2luaywgR3N0QnVmZmVyICogYnVmZmVyLAorICAgIEdzdENsb2NrVGltZSAqIHN0YXJ0LCBHc3RDbG9ja1RpbWUgKiBlbmQpCit7CisgICpzdGFydCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpOworICBpZiAoR1NUX0JVRkZFUl9EVVJBVElPTl9JU19WQUxJRCAoYnVmZmVyKSkKKyAgICAqZW5kID0gKnN0YXJ0ICsgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYWFzaW5rX3Byb3Bvc2VfYWxsb2NhdGlvbiAoR3N0QmFzZVNpbmsgKiBic2luaywgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0VmlkZW9JbmZvIGluZm87CisgIGd1aW50IHNpemU7CisKKyAgZ3N0X3F1ZXJ5X3BhcnNlX2FsbG9jYXRpb24gKHF1ZXJ5LCAmY2FwcywgTlVMTCk7CisKKyAgaWYgKGNhcHMgPT0gTlVMTCkKKyAgICBnb3RvIG5vX2NhcHM7CisKKyAgaWYgKCFnc3RfdmlkZW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBjYXBzKSkKKyAgICBnb3RvIGludmFsaWRfY2FwczsKKworICBzaXplID0gR1NUX1ZJREVPX0lORk9fU0laRSAoJmluZm8pOworCisgIC8qIHdlIG5lZWQgYXQgbGVhc3QgMiBidWZmZXIgYmVjYXVzZSB3ZSBob2xkIG9uIHRvIHRoZSBsYXN0IG9uZSAqLworICBnc3RfcXVlcnlfYWRkX2FsbG9jYXRpb25fcG9vbCAocXVlcnksIE5VTEwsIHNpemUsIDIsIDApOworCisgIC8qIHdlIHN1cHBvcnQgdmFyaW91cyBtZXRhZGF0YSAqLworICBnc3RfcXVlcnlfYWRkX2FsbG9jYXRpb25fbWV0YSAocXVlcnksIEdTVF9WSURFT19NRVRBX0FQSV9UWVBFLCBOVUxMKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK25vX2NhcHM6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChic2luaywgIm5vIGNhcHMgc3BlY2lmaWVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbnZhbGlkX2NhcHM6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChic2luaywgImludmFsaWQgY2FwcyBzcGVjaWZpZWQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hYXNpbmtfc2hvd19mcmFtZSAoR3N0VmlkZW9TaW5rICogdmlkZW9zaW5rLCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdEFBU2luayAqYWFzaW5rOworICBHc3RWaWRlb0ZyYW1lIGZyYW1lOworCisgIGFhc2luayA9IEdTVF9BQVNJTksgKHZpZGVvc2luayk7CisKKyAgR1NUX0RFQlVHICgic2hvdyBmcmFtZSIpOworCisgIGlmICghZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJmZyYW1lLCAmYWFzaW5rLT5pbmZvLCBidWZmZXIsIEdTVF9NQVBfUkVBRCkpCisgICAgZ290byBpbnZhbGlkX2ZyYW1lOworCisgIGdzdF9hYXNpbmtfc2NhbGUgKGFhc2luaywgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKCZmcmFtZSwgMCksICAgICAvKiBzcmMgKi8KKyAgICAgIGFhX2ltYWdlIChhYXNpbmstPmNvbnRleHQpLCAgICAgICAvKiBkZXN0ICovCisgICAgICBHU1RfVklERU9fSU5GT19XSURUSCAoJmFhc2luay0+aW5mbyksICAgICAvKiBzdyAqLworICAgICAgR1NUX1ZJREVPX0lORk9fSEVJR0hUICgmYWFzaW5rLT5pbmZvKSwgICAgLyogc2ggKi8KKyAgICAgIEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKCZmcmFtZSwgMCksIC8qIHNzICovCisgICAgICBhYV9pbWd3aWR0aCAoYWFzaW5rLT5jb250ZXh0KSwgICAgLyogZHcgKi8KKyAgICAgIGFhX2ltZ2hlaWdodCAoYWFzaW5rLT5jb250ZXh0KSk7ICAvKiBkaCAqLworCisgIGFhX3JlbmRlciAoYWFzaW5rLT5jb250ZXh0LCAmYWFzaW5rLT5hc2NpaV9wYXJtcywKKyAgICAgIDAsIDAsIGFhX2ltZ3dpZHRoIChhYXNpbmstPmNvbnRleHQpLCBhYV9pbWdoZWlnaHQgKGFhc2luay0+Y29udGV4dCkpOworICBhYV9mbHVzaCAoYWFzaW5rLT5jb250ZXh0KTsKKyAgYWFfZ2V0ZXZlbnQgKGFhc2luay0+Y29udGV4dCwgRkFMU0UpOworICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKCZmcmFtZSk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIC8qIEVSUk9SUyAqLworaW52YWxpZF9mcmFtZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFhc2luaywgImludmFsaWQgZnJhbWUiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAorZ3N0X2Fhc2lua19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QUFTaW5rICphYXNpbms7CisKKyAgYWFzaW5rID0gR1NUX0FBU0lOSyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfV0lEVEg6CisgICAgICBhYXNpbmstPmFzY2lpX3N1cmYud2lkdGggPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9IRUlHSFQ6CisgICAgICBhYXNpbmstPmFzY2lpX3N1cmYuaGVpZ2h0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRFJJVkVSOnsKKyAgICAgIGFhc2luay0+YWFfZHJpdmVyID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9ESVRIRVI6eworICAgICAgYWFzaW5rLT5hc2NpaV9wYXJtcy5kaXRoZXIgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0JSSUdIVE5FU1M6eworICAgICAgYWFzaW5rLT5hc2NpaV9wYXJtcy5icmlnaHQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfQ09OVFJBU1Q6eworICAgICAgYWFzaW5rLT5hc2NpaV9wYXJtcy5jb250cmFzdCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9HQU1NQTp7CisgICAgICBhYXNpbmstPmFzY2lpX3Bhcm1zLmdhbW1hID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfSU5WRVJTSU9OOnsKKyAgICAgIGFhc2luay0+YXNjaWlfcGFybXMuaW52ZXJzaW9uID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9SQU5ET01WQUw6eworICAgICAgYWFzaW5rLT5hc2NpaV9wYXJtcy5yYW5kb212YWwgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hYXNpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEFBU2luayAqYWFzaW5rOworCisgIGFhc2luayA9IEdTVF9BQVNJTksgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1dJRFRIOnsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGFhc2luay0+YXNjaWlfc3VyZi53aWR0aCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0hFSUdIVDp7CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBhYXNpbmstPmFzY2lpX3N1cmYuaGVpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfRFJJVkVSOnsKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBhYXNpbmstPmFhX2RyaXZlcik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0RJVEhFUjp7CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgYWFzaW5rLT5hc2NpaV9wYXJtcy5kaXRoZXIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9CUklHSFRORVNTOnsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGFhc2luay0+YXNjaWlfcGFybXMuYnJpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfQ09OVFJBU1Q6eworICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgYWFzaW5rLT5hc2NpaV9wYXJtcy5jb250cmFzdCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0dBTU1BOnsKKyAgICAgIGdfdmFsdWVfc2V0X2Zsb2F0ICh2YWx1ZSwgYWFzaW5rLT5hc2NpaV9wYXJtcy5nYW1tYSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0lOVkVSU0lPTjp7CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgYWFzaW5rLT5hc2NpaV9wYXJtcy5pbnZlcnNpb24pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9SQU5ET01WQUw6eworICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgYWFzaW5rLT5hc2NpaV9wYXJtcy5yYW5kb212YWwpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9GUkFNRVNfRElTUExBWUVEOnsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGFhc2luay0+ZnJhbWVzX2Rpc3BsYXllZCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0ZSQU1FX1RJTUU6eworICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgYWFzaW5rLT5mcmFtZV90aW1lIC8gMTAwMDAwMCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDp7CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2Fhc2lua19vcGVuIChHc3RBQVNpbmsgKiBhYXNpbmspCit7CisgIGlmICghYWFzaW5rLT5jb250ZXh0KSB7CisgICAgYWFfcmVjb21tZW5kaGlkaXNwbGF5IChhYV9kcml2ZXJzW2Fhc2luay0+YWFfZHJpdmVyXS0+c2hvcnRuYW1lKTsKKworICAgIGFhc2luay0+Y29udGV4dCA9IGFhX2F1dG9pbml0ICgmYWFzaW5rLT5hc2NpaV9zdXJmKTsKKyAgICBpZiAoYWFzaW5rLT5jb250ZXh0ID09IE5VTEwpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChHU1RfRUxFTUVOVCAoYWFzaW5rKSwgTElCUkFSWSwgVE9PX0xBWlksIChOVUxMKSwKKyAgICAgICAgICAoImVycm9yIG9wZW5pbmcgYWFsaWIgY29udGV4dCIpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgYWFfYXV0b2luaXRrYmQgKGFhc2luay0+Y29udGV4dCwgMCk7CisgICAgYWFfcmVzaXplaGFuZGxlciAoYWFzaW5rLT5jb250ZXh0LCAodm9pZCAqKSBhYV9yZXNpemUpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hYXNpbmtfY2xvc2UgKEdzdEFBU2luayAqIGFhc2luaykKK3sKKyAgYWFfY2xvc2UgKGFhc2luay0+Y29udGV4dCk7CisgIGFhc2luay0+Y29udGV4dCA9IE5VTEw7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2Fhc2lua19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBpZiAoIWdzdF9hYXNpbmtfb3BlbiAoR1NUX0FBU0lOSyAoZWxlbWVudCkpKQorICAgICAgICBnb3RvIG9wZW5fZmFpbGVkOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19QTEFZSU5HOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgZ3N0X2Fhc2lua19jbG9zZSAoR1NUX0FBU0lOSyAoZWxlbWVudCkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKKworb3Blbl9mYWlsZWQ6CisgIHsKKyAgICByZXR1cm4gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYWFzaW5rIiwgR1NUX1JBTktfTk9ORSwgR1NUX1RZUEVfQUFTSU5LKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBhYXNpbmssCisgICAgIkFTQ0lJIEFydCB2aWRlbyBzaW5rIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgIkxHUEwiLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pOwpkaWZmIC0tZ2l0IGEvZXh0L2FhbGliL2dzdGFhc2luay5oIGIvZXh0L2FhbGliL2dzdGFhc2luay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzODZjMjUKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvYWFsaWIvZ3N0YWFzaW5rLmgKQEAgLTAsMCArMSw3NSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9BQVNJTktfSF9fCisjZGVmaW5lIF9fR1NUX0FBU0lOS19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9zaW5rLmg+CisKKyNpbmNsdWRlIDxhYWxpYi5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworI2RlZmluZSBHU1RfVFlQRV9BQVNJTksgXAorICAoZ3N0X2Fhc2lua19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQUFTSU5LKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQUFTSU5LLEdzdEFBU2luaykpCisjZGVmaW5lIEdTVF9BQVNJTktfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfQUFTSU5LLEdzdEFBU2lua0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FBU0lOSyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0FBU0lOSykpCisjZGVmaW5lIEdTVF9JU19BQVNJTktfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfQUFTSU5LKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEFBU2luayBHc3RBQVNpbms7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QUFTaW5rQ2xhc3MgR3N0QUFTaW5rQ2xhc3M7CisKK3N0cnVjdCBfR3N0QUFTaW5rIHsKKyAgR3N0VmlkZW9TaW5rIHBhcmVudDsKKworICBHc3RWaWRlb0luZm8gaW5mbzsKKworICBnaW50IGZyYW1lc19kaXNwbGF5ZWQ7CisgIGd1aW50NjQgZnJhbWVfdGltZTsKKworICBhYV9jb250ZXh0ICpjb250ZXh0OworICBzdHJ1Y3QgYWFfaGFyZHdhcmVfcGFyYW1zIGFzY2lpX3N1cmY7CisgIHN0cnVjdCBhYV9yZW5kZXJwYXJhbXMgYXNjaWlfcGFybXM7CisgIGFhX3BhbGV0dGUgcGFsZXR0ZTsKKyAgZ2ludCBhYV9kcml2ZXI7Cit9OworCitzdHJ1Y3QgX0dzdEFBU2lua0NsYXNzIHsKKyAgR3N0VmlkZW9TaW5rQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2Fhc2lua19nZXRfdHlwZSh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisjZW5kaWYgLyogX19HU1RfQUFTSU5LRV9IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC9hYWxpYi9tZXNvbi5idWlsZCBiL2V4dC9hYWxpYi9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmNkZjcyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2FhbGliL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMTQgQEAKKyMgVmVyeSBtdWNoIG5vdCBnb2luZyB0byBpbXBsZW1lbnQgYWxsIGtpbmRzIG9mIGxvZ2ljIGFyb3VuZCBhYWxpYi1jb25maWcKKyMgb3IgY2F0ZXIgZm9yIG5vbi1zdGFuZGFyZCBwcmVmaXhlcy4KK2lmIGNjLmhhc19oZWFkZXIoJ2FhbGliLmgnKQorICBsaWJhYV9kZXAgPSBjYy5maW5kX2xpYnJhcnkoJ2FhJywgcmVxdWlyZWQgOiBmYWxzZSkKKyAgaWYgbGliYWFfZGVwLmZvdW5kKCkKKyAgICBsaWJyYXJ5KCdnc3RhYXNpbmsnLCAnZ3N0YWFzaW5rLmMnLAorICAgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICAgICAgbGlua19hcmdzIDogbm9zZWhfbGlua19hcmdzLAorICAgICAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICAgICAgZGVwZW5kZW5jaWVzIDogW2dzdHZpZGVvX2RlcCwgZ3N0YmFzZV9kZXAsIGxpYmFhX2RlcF0sCisgICAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICAgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpcikKKyAgZW5kaWYKK2VuZGlmCmRpZmYgLS1naXQgYS9leHQvY2Fpcm8vTWFrZWZpbGUuYW0gYi9leHQvY2Fpcm8vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzNzExMAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jYWlyby9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE2IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RjYWlyby5sYQorCitub2luc3RfSEVBREVSUyA9IFwKKwlnc3RjYWlyb292ZXJsYXkuaAorbGliZ3N0Y2Fpcm9fbGFfU09VUkNFUyA9IFwKKwlnc3RjYWlyby5jIFwKKwlnc3RjYWlyb292ZXJsYXkuYworbGliZ3N0Y2Fpcm9fbGFfQ0ZMQUdTID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9CQVNFX0NGTEFHUykgXAorCSQoR1NUX0NGTEFHUykgJChDQUlST19DRkxBR1MpCitsaWJnc3RjYWlyb19sYV9MSUJBREQgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0dmlkZW8tJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoQ0FJUk9fTElCUykgJChMSUJNKQorbGliZ3N0Y2Fpcm9fbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCmRpZmYgLS1naXQgYS9leHQvY2Fpcm8vZ3N0Y2Fpcm8uYyBiL2V4dC9jYWlyby9nc3RjYWlyby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOTQzODcKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvY2Fpcm8vZ3N0Y2Fpcm8uYwpAQCAtMCwwICsxLDQ1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzLDIwMDQ+IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdGNhaXJvb3ZlcmxheS5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCitHU1RfREVCVUdfQ0FURUdPUlkgKGNhaXJvX2RlYnVnKTsKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiY2Fpcm9vdmVybGF5IiwgR1NUX1JBTktfTk9ORSwKKyAgICAgIEdTVF9UWVBFX0NBSVJPX09WRVJMQVkpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChjYWlyb19kZWJ1ZywgImNhaXJvIiwgMCwgIkNhaXJvIGVsZW1lbnRzIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwgR1NUX1ZFUlNJT05fTUlOT1IsIGNhaXJvLAorICAgICJDYWlyby1iYXNlZCBlbGVtZW50cyIsIHBsdWdpbl9pbml0LCBWRVJTSU9OLAorICAgIEdTVF9MSUNFTlNFLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pOwpkaWZmIC0tZ2l0IGEvZXh0L2NhaXJvL2dzdGNhaXJvb3ZlcmxheS5jIGIvZXh0L2NhaXJvL2dzdGNhaXJvb3ZlcmxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYTRjNTMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvY2Fpcm8vZ3N0Y2Fpcm9vdmVybGF5LmMKQEAgLTAsMCArMSwyNTUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAxMT4gSm9uIE5vcmRieSA8am9ub25vckBnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtY2Fpcm9vdmVybGF5CisgKgorICogY2Fpcm9vdmVybGF5IHJlbmRlcnMgYW4gb3ZlcmxheSB1c2luZyBhIGFwcGxpY2F0aW9uIHByb3ZpZGVkIHJlbmRlciBmdW5jdGlvbi4KKyAqCisgKiBUaGUgZnVsbCBleGFtcGxlIGNhbiBiZSBmb3VuZCBpbiB0ZXN0cy9leGFtcGxlcy9jYWlyby9jYWlyb19vdmVybGF5LmMKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGNvZGU8L3RpdGxlPgorICogfFsKKyAqCisgKiAjaW5jbHVkZSAmbHQ7Z3N0L2dzdC5oJmd0OworICogI2luY2x1ZGUgJmx0O2dzdC92aWRlby92aWRlby5oJmd0OworICoKKyAqIC4uLgorICoKKyAqIHR5cGVkZWYgc3RydWN0IHsKKyAqICAgZ2Jvb2xlYW4gdmFsaWQ7CisgKiAgIGludCB3aWR0aDsKKyAqICAgaW50IGhlaWdodDsKKyAqIH0gQ2Fpcm9PdmVybGF5U3RhdGU7CisgKiAKKyAqIC4uLgorICoKKyAqIHN0YXRpYyB2b2lkCisgKiBwcmVwYXJlX292ZXJsYXkgKEdzdEVsZW1lbnQgKiBvdmVybGF5LCBHc3RDYXBzICogY2FwcywgZ3BvaW50ZXIgdXNlcl9kYXRhKQorICogeworICogICBDYWlyb092ZXJsYXlTdGF0ZSAqc3RhdGUgPSAoQ2Fpcm9PdmVybGF5U3RhdGUgKil1c2VyX2RhdGE7CisgKgorICogICBnc3RfdmlkZW9fZm9ybWF0X3BhcnNlX2NhcHMgKGNhcHMsIE5VTEwsICZhbXA7c3RhdGUtJmd0O3dpZHRoLCAmYW1wO3N0YXRlLSZndDtoZWlnaHQpOworICogICBzdGF0ZS0mZ3Q7dmFsaWQgPSBUUlVFOworICogfQorICoKKyAqIHN0YXRpYyB2b2lkCisgKiBkcmF3X292ZXJsYXkgKEdzdEVsZW1lbnQgKiBvdmVybGF5LCBjYWlyb190ICogY3IsIGd1aW50NjQgdGltZXN0YW1wLCAKKyAqICAgZ3VpbnQ2NCBkdXJhdGlvbiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQorICogeworICogICBDYWlyb092ZXJsYXlTdGF0ZSAqcyA9IChDYWlyb092ZXJsYXlTdGF0ZSAqKXVzZXJfZGF0YTsKKyAqICAgZG91YmxlIHNjYWxlOworICoKKyAqICAgaWYgKCFzLSZndDt2YWxpZCkKKyAqICAgICByZXR1cm47CisgKgorICogICBzY2FsZSA9IDIqKCgodGltZXN0YW1wLyhpbnQpMWU3KSAlIDcwKSszMCkvMTAwLjA7CisgKiAgIGNhaXJvX3RyYW5zbGF0ZShjciwgcy0mZ3Q7d2lkdGgvMiwgKHMtJmd0O2hlaWdodC8yKS0zMCk7CisgKiAgIGNhaXJvX3NjYWxlIChjciwgc2NhbGUsIHNjYWxlKTsKKyAqCisgKiAgIGNhaXJvX21vdmVfdG8gKGNyLCAwLCAwKTsKKyAqICAgY2Fpcm9fY3VydmVfdG8gKGNyLCAwLC0zMCwgLTUwLC0zMCwgLTUwLDApOworICogICBjYWlyb19jdXJ2ZV90byAoY3IsIC01MCwzMCwgMCwzNSwgMCw2MCApOworICogICBjYWlyb19jdXJ2ZV90byAoY3IsIDAsMzUsIDUwLDMwLCA1MCwwICk7ICogIAorICogICBjYWlyb19jdXJ2ZV90byAoY3IsIDUwLC0zMCwgMCwtMzAsIDAsMCApOworICogICBjYWlyb19zZXRfc291cmNlX3JnYmEgKGNyLCAwLjksIDAuMCwgMC4xLCAwLjcpOworICogICBjYWlyb19maWxsIChjcik7CisgKiB9CisgKgorICogLi4uCisgKgorICogY2Fpcm9fb3ZlcmxheSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoJnF1b3Q7Y2Fpcm9vdmVybGF5JnF1b3Q7LCAmcXVvdDtvdmVybGF5JnF1b3Q7KTsKKyAqCisgKiBnX3NpZ25hbF9jb25uZWN0IChjYWlyb19vdmVybGF5LCAmcXVvdDtkcmF3JnF1b3Q7LCBHX0NBTExCQUNLIChkcmF3X292ZXJsYXkpLAorICogICBvdmVybGF5X3N0YXRlKTsKKyAqIGdfc2lnbmFsX2Nvbm5lY3QgKGNhaXJvX292ZXJsYXksICZxdW90O2NhcHMtY2hhbmdlZCZxdW90OywgCisgKiAgIEdfQ0FMTEJBQ0sgKHByZXBhcmVfb3ZlcmxheSksIG92ZXJsYXlfc3RhdGUpOworICogLi4uCisgKgorICogXXwKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0Y2Fpcm9vdmVybGF5LmgiCisKKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworI2luY2x1ZGUgPGNhaXJvLmg+CisKKy8qIFJHQjE2IGlzIG5hdGl2ZS1lbmRpYW5uZXNzIGluIEdTdHJlYW1lciAqLworI2lmIEdfQllURV9PUkRFUiA9PSBHX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgVEVNUExBVEVfQ0FQUyBHU1RfVklERU9fQ0FQU19NQUtFKCJ7IEJHUngsIEJHUkEsIFJHQjE2IH0iKQorI2Vsc2UKKyNkZWZpbmUgVEVNUExBVEVfQ0FQUyBHU1RfVklERU9fQ0FQU19NQUtFKCJ7IHhSR0IsIEFSR0IsIFJHQjE2IH0iKQorI2VuZGlmCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfY2Fpcm9fb3ZlcmxheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoVEVNUExBVEVfQ0FQUykKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X2NhaXJvX292ZXJsYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFRFTVBMQVRFX0NBUFMpCisgICAgKTsKKworR19ERUZJTkVfVFlQRSAoR3N0Q2Fpcm9PdmVybGF5LCBnc3RfY2Fpcm9fb3ZlcmxheSwgR1NUX1RZUEVfVklERU9fRklMVEVSKTsKKworZW51bQoreworICBTSUdOQUxfRFJBVywKKyAgU0lHTkFMX0NBUFNfQ0hBTkdFRCwKKyAgTl9TSUdOQUxTCit9OworCitzdGF0aWMgZ3VpbnQgZ3N0X2NhaXJvX292ZXJsYXlfc2lnbmFsc1tOX1NJR05BTFNdOworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9jYWlyb19vdmVybGF5X3NldF9pbmZvIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsIEdzdENhcHMgKiBpbl9jYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRfY2FwcywgR3N0VmlkZW9JbmZvICogb3V0X2luZm8pCit7CisgIEdzdENhaXJvT3ZlcmxheSAqb3ZlcmxheSA9IEdTVF9DQUlST19PVkVSTEFZICh2ZmlsdGVyKTsKKworICBnX3NpZ25hbF9lbWl0IChvdmVybGF5LCBnc3RfY2Fpcm9fb3ZlcmxheV9zaWduYWxzW1NJR05BTF9DQVBTX0NIQU5HRURdLCAwLAorICAgICAgaW5fY2FwcywgTlVMTCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfY2Fpcm9fb3ZlcmxheV90cmFuc2Zvcm1fZnJhbWVfaXAgKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwKKyAgICBHc3RWaWRlb0ZyYW1lICogZnJhbWUpCit7CisgIEdzdENhaXJvT3ZlcmxheSAqb3ZlcmxheSA9IEdTVF9DQUlST19PVkVSTEFZICh2ZmlsdGVyKTsKKyAgY2Fpcm9fc3VyZmFjZV90ICpzdXJmYWNlOworICBjYWlyb190ICpjcjsKKyAgY2Fpcm9fZm9ybWF0X3QgZm9ybWF0OworCisgIHN3aXRjaCAoR1NUX1ZJREVPX0ZSQU1FX0ZPUk1BVCAoZnJhbWUpKSB7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FSR0I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgICBmb3JtYXQgPSBDQUlST19GT1JNQVRfQVJHQjMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX3hSR0I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUng6CisgICAgICBmb3JtYXQgPSBDQUlST19GT1JNQVRfUkdCMjQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCMTY6CisgICAgICBmb3JtYXQgPSBDQUlST19GT1JNQVRfUkdCMTZfNTY1OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICB7CisgICAgICBHU1RfV0FSTklORyAoIk5vIG1hdGNoaW5nIGNhaXJvIGZvcm1hdCBmb3IgJXMiLAorICAgICAgICAgIGdzdF92aWRlb19mb3JtYXRfdG9fc3RyaW5nIChHU1RfVklERU9fRlJBTUVfRk9STUFUIChmcmFtZSkpKTsKKyAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgICB9CisgIH0KKworICBzdXJmYWNlID0KKyAgICAgIGNhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlX2Zvcl9kYXRhIChHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZnJhbWUsCisgICAgICAgICAgMCksIGZvcm1hdCwgR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChmcmFtZSksCisgICAgICBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChmcmFtZSksIEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGZyYW1lLCAwKSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFzdXJmYWNlKSkKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisKKyAgY3IgPSBjYWlyb19jcmVhdGUgKHN1cmZhY2UpOworICBpZiAoR19VTkxJS0VMWSAoIWNyKSkgeworICAgIGNhaXJvX3N1cmZhY2VfZGVzdHJveSAoc3VyZmFjZSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgZ19zaWduYWxfZW1pdCAob3ZlcmxheSwgZ3N0X2NhaXJvX292ZXJsYXlfc2lnbmFsc1tTSUdOQUxfRFJBV10sIDAsCisgICAgICBjciwgR1NUX0JVRkZFUl9QVFMgKGZyYW1lLT5idWZmZXIpLCBHU1RfQlVGRkVSX0RVUkFUSU9OIChmcmFtZS0+YnVmZmVyKSwKKyAgICAgIE5VTEwpOworCisgIGNhaXJvX2Rlc3Ryb3kgKGNyKTsKKyAgY2Fpcm9fc3VyZmFjZV9kZXN0cm95IChzdXJmYWNlKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfY2Fpcm9fb3ZlcmxheV9jbGFzc19pbml0IChHc3RDYWlyb092ZXJsYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RWaWRlb0ZpbHRlckNsYXNzICp2ZmlsdGVyX2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3M7CisKKyAgdmZpbHRlcl9jbGFzcyA9IChHc3RWaWRlb0ZpbHRlckNsYXNzICopIGtsYXNzOworICBlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICB2ZmlsdGVyX2NsYXNzLT5zZXRfaW5mbyA9IGdzdF9jYWlyb19vdmVybGF5X3NldF9pbmZvOworICB2ZmlsdGVyX2NsYXNzLT50cmFuc2Zvcm1fZnJhbWVfaXAgPSBnc3RfY2Fpcm9fb3ZlcmxheV90cmFuc2Zvcm1fZnJhbWVfaXA7CisKKyAgLyoqCisgICAqIEdzdENhaXJvT3ZlcmxheTo6ZHJhdzoKKyAgICogQG92ZXJsYXk6IE92ZXJsYXkgZWxlbWVudCBlbWl0dGluZyB0aGUgc2lnbmFsLgorICAgKiBAY3I6IENhaXJvIGNvbnRleHQgdG8gZHJhdyB0by4KKyAgICogQHRpbWVzdGFtcDogVGltZXN0YW1wIChzZWUgI0dzdENsb2NrVGltZSkgb2YgdGhlIGN1cnJlbnQgYnVmZmVyLgorICAgKiBAZHVyYXRpb246IER1cmF0aW9uIChzZWUgI0dzdENsb2NrVGltZSkgb2YgdGhlIGN1cnJlbnQgYnVmZmVyLgorICAgKiAKKyAgICogVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSBvdmVybGF5IHNob3VsZCBiZSBkcmF3bi4KKyAgICovCisgIGdzdF9jYWlyb19vdmVybGF5X3NpZ25hbHNbU0lHTkFMX0RSQVddID0KKyAgICAgIGdfc2lnbmFsX25ldyAoImRyYXciLAorICAgICAgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIDAsCisgICAgICAwLAorICAgICAgTlVMTCwKKyAgICAgIE5VTEwsCisgICAgICBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywKKyAgICAgIEdfVFlQRV9OT05FLCAzLCBDQUlST19HT0JKRUNUX1RZUEVfQ09OVEVYVCwgR19UWVBFX1VJTlQ2NCwgR19UWVBFX1VJTlQ2NCk7CisKKyAgLyoqCisgICAqIEdzdENhaXJvT3ZlcmxheTo6Y2Fwcy1jaGFuZ2VkOgorICAgKiBAb3ZlcmxheTogT3ZlcmxheSBlbGVtZW50IGVtaXR0aW5nIHRoZSBzaWduYWwuCisgICAqIEBjYXBzOiBUaGUgI0dzdENhcHMgb2YgdGhlIGVsZW1lbnQuCisgICAqIAorICAgKiBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gdGhlIGNhcHMgb2YgdGhlIGVsZW1lbnQgaGFzIGNoYW5nZWQuCisgICAqLworICBnc3RfY2Fpcm9fb3ZlcmxheV9zaWduYWxzW1NJR05BTF9DQVBTX0NIQU5HRURdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoImNhcHMtY2hhbmdlZCIsCisgICAgICBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgMCwKKyAgICAgIDAsIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMSwgR1NUX1RZUEVfQ0FQUyk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgIkNhaXJvIG92ZXJsYXkiLAorICAgICAgIkZpbHRlci9FZGl0b3IvVmlkZW8iLAorICAgICAgIlJlbmRlciBvdmVybGF5IG9uIGEgdmlkZW8gc3RyZWFtIHVzaW5nIENhaXJvIiwKKyAgICAgICJKb24gTm9yZGJ5IDxqb25vbm9yQGdtYWlsLmNvbT4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfY2Fpcm9fb3ZlcmxheV9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X2NhaXJvX292ZXJsYXlfc3JjX3RlbXBsYXRlKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9jYWlyb19vdmVybGF5X2luaXQgKEdzdENhaXJvT3ZlcmxheSAqIG92ZXJsYXkpCit7CisgIC8qIG5vdGhpbmcgdG8gZG8gKi8KK30KZGlmZiAtLWdpdCBhL2V4dC9jYWlyby9nc3RjYWlyb292ZXJsYXkuaCBiL2V4dC9jYWlyby9nc3RjYWlyb292ZXJsYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzY3YTdiCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NhaXJvL2dzdGNhaXJvb3ZlcmxheS5oCkBAIC0wLDAgKzEsNTggQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAxMT4gSm9uIE5vcmRieSA8am9ub25vckBnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9DQUlST19PVkVSTEFZX0hfXworI2RlZmluZSBfX0dTVF9DQUlST19PVkVSTEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2ZpbHRlci5oPgorCisjaW5jbHVkZSA8Y2Fpcm8uaD4KKyNpbmNsdWRlIDxjYWlyby1nb2JqZWN0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9DQUlST19PVkVSTEFZIFwKKyAgKGdzdF9jYWlyb19vdmVybGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9DQUlST19PVkVSTEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQ0FJUk9fT1ZFUkxBWSxHc3RDYWlyb092ZXJsYXkpKQorI2RlZmluZSBHU1RfQ0FJUk9fT1ZFUkxBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9DQUlST19PVkVSTEFZLEdzdENhaXJvT3ZlcmxheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0NBSVJPX09WRVJMQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9DQUlST19PVkVSTEFZKSkKKyNkZWZpbmUgR1NUX0lTX0NBSVJPX09WRVJMQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfQ0FJUk9fT1ZFUkxBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RDYWlyb092ZXJsYXkgR3N0Q2Fpcm9PdmVybGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdENhaXJvT3ZlcmxheUNsYXNzIEdzdENhaXJvT3ZlcmxheUNsYXNzOworCitzdHJ1Y3QgX0dzdENhaXJvT3ZlcmxheSB7CisgIEdzdFZpZGVvRmlsdGVyIHZpZGVvX2ZpbHRlcjsKK307CisKK3N0cnVjdCBfR3N0Q2Fpcm9PdmVybGF5Q2xhc3MgeworICBHc3RWaWRlb0ZpbHRlckNsYXNzIHZpZGVvX2ZpbHRlcl9jbGFzczsKK307CisKK0dUeXBlIGdzdF9jYWlyb19vdmVybGF5X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0NBSVJPX09WRVJMQVlfSF9fICovCmRpZmYgLS1naXQgYS9leHQvY2Fpcm8vbWVzb24uYnVpbGQgYi9leHQvY2Fpcm8vbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwMWJjNwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jYWlyby9tZXNvbi5idWlsZApAQCAtMCwwICsxLDEzIEBACitjYWlyb19kZXAgPSBkZXBlbmRlbmN5KCdjYWlyby1nb2JqZWN0JywgdmVyc2lvbiA6ICc+PTEuMTAuMCcsIHJlcXVpcmVkIDogZmFsc2UpCisKK2lmIGNhaXJvX2RlcC5mb3VuZCgpCisgIGdzdGNhaXJvID0gbGlicmFyeSgnZ3N0Y2Fpcm8nLAorICAgICdnc3RjYWlyby5jJywgJ2dzdGNhaXJvb3ZlcmxheS5jJywKKyAgICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgICAgbGlua19hcmdzIDogbm9zZWhfbGlua19hcmdzLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgICBkZXBlbmRlbmNpZXMgOiBbZ3N0YmFzZV9kZXAsIGdzdHZpZGVvX2RlcCwgY2Fpcm9fZGVwXSwKKyAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCisgICkKK2VuZGlmCmRpZmYgLS1naXQgYS9leHQvZHYvTWFrZWZpbGUuYW0gYi9leHQvZHYvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNkMTlmNgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9kdi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE5IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3Rkdi5sYQorCitsaWJnc3Rkdl9sYV9TT1VSQ0VTID0gZ3N0ZHYuYyBnc3RkdmRlYy5jIGdzdGR2ZGVtdXguYyBnc3RzbXB0ZXRpbWVjb2RlLmMKK2xpYmdzdGR2X2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpICQoTElCRFZfQ0ZMQUdTKQorbGliZ3N0ZHZfbGFfTElCQUREID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAtbGdzdHZpZGVvLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKExJQkRWX0xJQlMpCitsaWJnc3Rkdl9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gZ3N0ZHZkZW11eC5oIGdzdGR2ZGVjLmggZ3N0c21wdGV0aW1lY29kZS5oCisKK0VYVFJBX0RJU1QgPSBOT1RFUworCitub2luc3RfUFJPR1JBTVMgPSBzbXB0ZV90ZXN0CisKK3NtcHRlX3Rlc3RfU09VUkNFUyA9IHNtcHRlX3Rlc3QuYyBnc3RzbXB0ZXRpbWVjb2RlLmMKK3NtcHRlX3Rlc3RfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKExJQkRWX0NGTEFHUykKK3NtcHRlX3Rlc3RfTERBREQgPSAkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpCisKZGlmZiAtLWdpdCBhL2V4dC9kdi9OT1RFUyBiL2V4dC9kdi9OT1RFUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDIxMTU5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2R2L05PVEVTCkBAIC0wLDAgKzEsMTMgQEAKK1BhY2tldHMgY29tZSBmcm9tIDEzOTQgNDgwIGJ5dGVzIGF0IGEgdGltZS4gIFRoaXMgaXMgbm90IGEgdmlkZW8gc2VnbWVudAorbGVuZ3RoLiAgVGhpcyBjYXVzZXMgcHJvYmxlbXMsIHNpbmNlIGEgcGFja2V0IGJvdW5kYXJ5IGNyb3NzaW5nIGEgdmlkZW8KK3NlZ21lbnQgY2FuIHNwbGl0IGEgdmlkZW8gc2VnbWVudCBpZiB3ZSBsb3NlIGFuIGlzbyBwYWNrZXQuICBXZSBjYW4KK3JlY292ZXIgZnJvbSB0aGlzLCBzb3J0YSwgd2l0aCBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIHRoZSBwYXJzZXIuICBXZSBoYXZlCit0byBkZWFsIHdpdGggdGhlIGlkZWEgdGhhdCBhKSBzb21lIG1hY3JvYmxvY2tzIGp1c3QgZG9uJ3QgZXhpc3QgKHdlIGhhdmUKK3plcm8ncyBmb3IgdGhlbSkgYW5kIGIpIHdoZW4gYW55IG9mIHRoZSA1IG1hY3JvYmxvY2tzIGRvZXNuJ3QgZXhpc3QsIHdlCitjYW4ndCBkbyBwYXNzIDMuCisKK1NpbmNlIHRoaW5ncyBhcmUgYml0c3RyZWFtLWJhc2VkLCB3ZSBjYW4gZGVhbCB3aXRoIHRoaXMsIGJ1dCB3ZSBoYXZlIHRvCithZGQgYSBsYXllciBvZiBjb2RlIHRoYXQgdHJpZXMgdG8gc2F2ZSB0aW1lIChtYXliZSkgYnkgbm90IGRlY29kaW5nIHRoaW5ncwordGhhdCBkb24ndCBleGlzdC4gIE5vdCBzdXJlIGhvdyB0aGlzIGlzIGdvbm5hIHdvcmsgd2l0aCB0aGUgcGFyc2UgY29kZQorYmVpbmcgYmFzZWQgb24gdmlkZW8gc2VnbWVudHMsIGFuZCBub3QgZWFzaWx5IHNwbGl0dGFibGUgaW50bworbWFjcm9ibG9jay1sZXZlbCBwYXJzaW5nIChvciBpcyBpdD8pLgpkaWZmIC0tZ2l0IGEvZXh0L2R2L2dzdGR2LmMgYi9leHQvZHYvZ3N0ZHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODYxYmY2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2R2L2dzdGR2LmMKQEAgLTAsMCArMSw0OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RkdmRlYy5oIgorI2luY2x1ZGUgImdzdGR2ZGVtdXguaCIKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBkdl9pbml0ICgwLCAwKTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJkdmRlbXV4IiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgICAgICBnc3RfZHZkZW11eF9nZXRfdHlwZSAoKSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImR2ZGVjIiwgR1NUX1JBTktfTUFSR0lOQUwsCisgICAgICAgICAgZ3N0X2R2ZGVjX2dldF90eXBlICgpKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBkdiwKKyAgICAiRFYgZGVtdXhlciBhbmQgZGVjb2RlciBiYXNlZCBvbiBsaWJkdiAobGliZHYuc2YubmV0KSIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKTsKZGlmZiAtLWdpdCBhL2V4dC9kdi9nc3RkdmRlYy5jIGIvZXh0L2R2L2dzdGR2ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdjMTkzZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9kdi9nc3RkdmRlYy5jCkBAIC0wLDAgKzEsNjkwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWR2ZGVjCisgKgorICogZHZkZWMgZGVjb2RlcyBEViB2aWRlbyBpbnRvIHJhdyB2aWRlby4gVGhlIGVsZW1lbnQgZXhwZWN0cyBhIGZ1bGwgRFYgZnJhbWUKKyAqIGFzIGlucHV0LCB3aGljaCBpcyAxMjAwMDAgYnl0ZXMgZm9yIE5UU0MgYW5kIDE0NDAwMCBmb3IgUEFMIHZpZGVvLgorICoKKyAqIFRoaXMgZWxlbWVudCBjYW4gcGVyZm9ybSBzaW1wbGUgZnJhbWUgZHJvcHBpbmcgd2l0aCB0aGUgI0dzdERWRGVjOmRyb3AtZmFjdG9yCisgKiBwcm9wZXJ0eS4gU2V0dGluZyB0aGlzIHByb3BlcnR5IHRvIGEgdmFsdWUgTiA+IDEgd2lsbCBvbmx5IGRlY29kZSBldmVyeSAKKyAqIE50aCBmcmFtZS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj10ZXN0LmR2ICEgZHZkZW11eCBuYW1lPWRlbXV4ICEgZHZkZWMgISB4dmltYWdlc2luaworICogXXwgVGhpcyBwaXBlbGluZSBkZWNvZGVzIGFuZCByZW5kZXJzIHRoZSByYXcgRFYgc3RyZWFtIHRvIGEgdmlkZW9zaW5rLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb21ldGEuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9wb29sLmg+CisKKyNpbmNsdWRlICJnc3RkdmRlYy5oIgorCisvKiBzaXplcyBvZiBvbmUgaW5wdXQgYnVmZmVyICovCisjZGVmaW5lIE5UU0NfSEVJR0hUIDQ4MAorI2RlZmluZSBOVFNDX0JVRkZFUiAxMjAwMDAKKyNkZWZpbmUgTlRTQ19GUkFNRVJBVEVfTlVNRVJBVE9SIDMwMDAwCisjZGVmaW5lIE5UU0NfRlJBTUVSQVRFX0RFTk9NSU5BVE9SIDEwMDEKKworI2RlZmluZSBQQUxfSEVJR0hUIDU3NgorI2RlZmluZSBQQUxfQlVGRkVSIDE0NDAwMAorI2RlZmluZSBQQUxfRlJBTUVSQVRFX05VTUVSQVRPUiAyNQorI2RlZmluZSBQQUxfRlJBTUVSQVRFX0RFTk9NSU5BVE9SIDEKKworI2RlZmluZSBQQUxfTk9STUFMX1BBUl9YICAgICAgICAxNgorI2RlZmluZSBQQUxfTk9STUFMX1BBUl9ZICAgICAgICAxNQorI2RlZmluZSBQQUxfV0lERV9QQVJfWCAgICAgICAgICA2NAorI2RlZmluZSBQQUxfV0lERV9QQVJfWSAgICAgICAgICA0NQorCisjZGVmaW5lIE5UU0NfTk9STUFMX1BBUl9YICAgICAgIDgKKyNkZWZpbmUgTlRTQ19OT1JNQUxfUEFSX1kgICAgICAgOQorI2RlZmluZSBOVFNDX1dJREVfUEFSX1ggICAgICAgICAzMgorI2RlZmluZSBOVFNDX1dJREVfUEFSX1kgICAgICAgICAyNworCisjZGVmaW5lIERWX0RFRkFVTFRfUVVBTElUWSBEVl9RVUFMSVRZX0JFU1QKKyNkZWZpbmUgRFZfREVGQVVMVF9ERUNPREVfTlRIIDEKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZHZkZWNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZHZkZWNfZGVidWcKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQ0xBTVBfTFVNQSwKKyAgUFJPUF9DTEFNUF9DSFJPTUEsCisgIFBST1BfUVVBTElUWSwKKyAgUFJPUF9ERUNPREVfTlRICit9OworCitjb25zdCBnaW50IHF1YWxpdGllc1tdID0geworICBEVl9RVUFMSVRZX0RDLAorICBEVl9RVUFMSVRZX0FDXzEsCisgIERWX1FVQUxJVFlfQUNfMiwKKyAgRFZfUVVBTElUWV9EQyB8IERWX1FVQUxJVFlfQ09MT1IsCisgIERWX1FVQUxJVFlfQUNfMSB8IERWX1FVQUxJVFlfQ09MT1IsCisgIERWX1FVQUxJVFlfQUNfMiB8IERWX1FVQUxJVFlfQ09MT1IKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXAgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LWR2LCBzeXN0ZW1zdHJlYW0gPSAoYm9vbGVhbikgZmFsc2UiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcCA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgeyBZVVkyLCBCR1J4LCBSR0IgfSwgIgorICAgICAgICAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSBbIDEvMSwgNjAvMSBdLCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIDcyMCwgIiAiaGVpZ2h0ID0gKGludCkgeyA1NzYsIDQ4MCB9IikKKyAgICApOworCisjZGVmaW5lIEdTVF9UWVBFX0RWREVDX1FVQUxJVFkgKGdzdF9kdmRlY19xdWFsaXR5X2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9kdmRlY19xdWFsaXR5X2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgcXR5cGUgPSAwOworCisgIGlmIChxdHlwZSA9PSAwKSB7CisgICAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAgICB7MCwgIk1vbm9jaHJvbWUsIERDIChGYXN0ZXN0KSIsICJmYXN0ZXN0In0sCisgICAgICB7MSwgIk1vbm9jaHJvbWUsIGZpcnN0IEFDIGNvZWZmaWNpZW50IiwgIm1vbm9jaHJvbWUtYWMifSwKKyAgICAgIHsyLCAiTW9ub2Nocm9tZSwgaGlnaGVzdCBxdWFsaXR5IiwgIm1vbm9jaHJvbWUtYmVzdCJ9LAorICAgICAgezMsICJDb2xvdXIsIERDLCBmYXN0ZXN0IiwgImNvbG91ci1mYXN0ZXN0In0sCisgICAgICB7NCwgIkNvbG91ciwgdXNpbmcgb25seSB0aGUgZmlyc3QgQUMgY29lZmZpY2llbnQiLCAiY29sb3VyLWFjIn0sCisgICAgICB7NSwgIkhpZ2hlc3QgcXVhbGl0eSBjb2xvdXIgZGVjb2RpbmciLCAiYmVzdCJ9LAorICAgICAgezAsIE5VTEwsIE5VTEx9LAorICAgIH07CisKKyAgICBxdHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3REVkRlY1F1YWxpdHlFbnVtIiwgdmFsdWVzKTsKKyAgfQorICByZXR1cm4gcXR5cGU7Cit9CisKKyNkZWZpbmUgZ3N0X2R2ZGVjX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdERWRGVjLCBnc3RfZHZkZWMsIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfZHZkZWNfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2R2ZGVjX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X2R2ZGVjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyB2b2lkIGdzdF9kdmRlY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfZHZkZWNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgdm9pZAorZ3N0X2R2ZGVjX2NsYXNzX2luaXQgKEdzdERWRGVjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9kdmRlY19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9kdmRlY19nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9DTEFNUF9MVU1BLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJjbGFtcC1sdW1hIiwgIkNsYW1wIGx1bWEiLCAiQ2xhbXAgbHVtYSIsCisgICAgICAgICAgRkFMU0UsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0NMQU1QX0NIUk9NQSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiY2xhbXAtY2hyb21hIiwgIkNsYW1wIGNocm9tYSIsICJDbGFtcCBjaHJvbWEiLAorICAgICAgICAgIEZBTFNFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9RVUFMSVRZLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJxdWFsaXR5IiwgIlF1YWxpdHkiLCAiRGVjb2RpbmcgcXVhbGl0eSIsCisgICAgICAgICAgR1NUX1RZUEVfRFZERUNfUVVBTElUWSwgRFZfREVGQVVMVF9RVUFMSVRZLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0RFQ09ERV9OVEgsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiZHJvcC1mYWN0b3IiLCAiRHJvcCBGYWN0b3IiLCAiT25seSBkZWNvZGUgTnRoIGZyYW1lIiwKKyAgICAgICAgICAxLCBHX01BWElOVCwgRFZfREVGQVVMVF9ERUNPREVfTlRILAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZHZkZWNfY2hhbmdlX3N0YXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcCk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc3JjX3RlbXApOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJEViB2aWRlbyBkZWNvZGVyIiwKKyAgICAgICJDb2RlYy9EZWNvZGVyL1ZpZGVvIiwKKyAgICAgICJVc2VzIGxpYmR2IHRvIGRlY29kZSBEViB2aWRlbyAoc21wdGUzMTQpIChsaWJkdi5zb3VyY2Vmb3JnZS5uZXQpIiwKKyAgICAgICJFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PiwiICJXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPiIpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChkdmRlY19kZWJ1ZywgImR2ZGVjIiwgMCwgIkRWIGRlY29kaW5nIGVsZW1lbnQiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kdmRlY19pbml0IChHc3REVkRlYyAqIGR2ZGVjKQoreworICBkdmRlYy0+c2lua3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc2lua190ZW1wLCAic2luayIpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoZHZkZWMtPnNpbmtwYWQsIGdzdF9kdmRlY19jaGFpbik7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChkdmRlYy0+c2lua3BhZCwgZ3N0X2R2ZGVjX3NpbmtfZXZlbnQpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoZHZkZWMpLCBkdmRlYy0+c2lua3BhZCk7CisKKyAgZHZkZWMtPnNyY3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc3JjX3RlbXAsICJzcmMiKTsKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoZHZkZWMtPnNyY3BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChkdmRlYyksIGR2ZGVjLT5zcmNwYWQpOworCisgIGR2ZGVjLT5mcmFtZXJhdGVfbnVtZXJhdG9yID0gMDsKKyAgZHZkZWMtPmZyYW1lcmF0ZV9kZW5vbWluYXRvciA9IDA7CisgIGR2ZGVjLT53aWRlID0gRkFMU0U7CisgIGR2ZGVjLT5kcm9wX2ZhY3RvciA9IDE7CisKKyAgZHZkZWMtPmNsYW1wX2x1bWEgPSBGQUxTRTsKKyAgZHZkZWMtPmNsYW1wX2Nocm9tYSA9IEZBTFNFOworICBkdmRlYy0+cXVhbGl0eSA9IERWX0RFRkFVTFRfUVVBTElUWTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZHZkZWNfc2lua19zZXRjYXBzIChHc3REVkRlYyAqIGR2ZGVjLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzOworICBjb25zdCBHVmFsdWUgKnBhciA9IE5VTEwsICpyYXRlID0gTlVMTDsKKworICAvKiBmaXJzdCBwYXJzZSB0aGUgY2FwcyAqLworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgLyogd2UgYWxsb3cgZnJhbWVyYXRlIGFuZCBQQVIgdG8gYmUgb3ZlcndyaXR0ZW4uIGZyYW1lcmF0ZSBpcyBtYW5kYXRvcnkuICovCisgIGlmICghKHJhdGUgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgImZyYW1lcmF0ZSIpKSkKKyAgICBnb3RvIG5vX2ZyYW1lcmF0ZTsKKyAgcGFyID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iKTsKKworICBpZiAocGFyKSB7CisgICAgZHZkZWMtPnBhcl94ID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9udW1lcmF0b3IgKHBhcik7CisgICAgZHZkZWMtPnBhcl95ID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9kZW5vbWluYXRvciAocGFyKTsKKyAgICBkdmRlYy0+bmVlZF9wYXIgPSBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICBkdmRlYy0+cGFyX3ggPSAwOworICAgIGR2ZGVjLT5wYXJfeSA9IDA7CisgICAgZHZkZWMtPm5lZWRfcGFyID0gVFJVRTsKKyAgfQorICBkdmRlYy0+ZnJhbWVyYXRlX251bWVyYXRvciA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fbnVtZXJhdG9yIChyYXRlKTsKKyAgZHZkZWMtPmZyYW1lcmF0ZV9kZW5vbWluYXRvciA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fZGVub21pbmF0b3IgKHJhdGUpOworICBkdmRlYy0+c2lua19uZWdvdGlhdGVkID0gVFJVRTsKKyAgZHZkZWMtPnNyY19uZWdvdGlhdGVkID0gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub19mcmFtZXJhdGU6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkdmRlYywgIm5vIGZyYW1lcmF0ZSBzcGVjaWZpZWQgaW4gY2FwcyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2R2ZGVjX25lZ290aWF0ZV9wb29sIChHc3REVkRlYyAqIGRlYywgR3N0Q2FwcyAqIGNhcHMsIEdzdFZpZGVvSW5mbyAqIGluZm8pCit7CisgIEdzdFF1ZXJ5ICpxdWVyeTsKKyAgR3N0QnVmZmVyUG9vbCAqcG9vbDsKKyAgZ3VpbnQgc2l6ZSwgbWluLCBtYXg7CisgIEdzdFN0cnVjdHVyZSAqY29uZmlnOworCisgIC8qIGZpbmQgYSBwb29sIGZvciB0aGUgbmVnb3RpYXRlZCBjYXBzIG5vdyAqLworICBxdWVyeSA9IGdzdF9xdWVyeV9uZXdfYWxsb2NhdGlvbiAoY2FwcywgVFJVRSk7CisKKyAgaWYgKCFnc3RfcGFkX3BlZXJfcXVlcnkgKGRlYy0+c3JjcGFkLCBxdWVyeSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZWMsICJkaWRuJ3QgZ2V0IGRvd25zdHJlYW0gQUxMT0NBVElPTiBoaW50cyIpOworICB9CisKKyAgaWYgKGdzdF9xdWVyeV9nZXRfbl9hbGxvY2F0aW9uX3Bvb2xzIChxdWVyeSkgPiAwKSB7CisgICAgLyogd2UgZ290IGNvbmZpZ3VyYXRpb24gZnJvbSBvdXIgcGVlciwgcGFyc2UgdGhlbSAqLworICAgIGdzdF9xdWVyeV9wYXJzZV9udGhfYWxsb2NhdGlvbl9wb29sIChxdWVyeSwgMCwgJnBvb2wsICZzaXplLCAmbWluLCAmbWF4KTsKKyAgICBzaXplID0gTUFYIChzaXplLCBpbmZvLT5zaXplKTsKKyAgfSBlbHNlIHsKKyAgICBwb29sID0gTlVMTDsKKyAgICBzaXplID0gaW5mby0+c2l6ZTsKKyAgICBtaW4gPSBtYXggPSAwOworICB9CisKKyAgaWYgKHBvb2wgPT0gTlVMTCkgeworICAgIC8qIHdlIGRpZCBub3QgZ2V0IGEgcG9vbCwgbWFrZSBvbmUgb3Vyc2VsdmVzIHRoZW4gKi8KKyAgICBwb29sID0gZ3N0X3ZpZGVvX2J1ZmZlcl9wb29sX25ldyAoKTsKKyAgfQorCisgIGlmIChkZWMtPnBvb2wpIHsKKyAgICBnc3RfYnVmZmVyX3Bvb2xfc2V0X2FjdGl2ZSAoZGVjLT5wb29sLCBGQUxTRSk7CisgICAgZ3N0X29iamVjdF91bnJlZiAoZGVjLT5wb29sKTsKKyAgfQorICBkZWMtPnBvb2wgPSBwb29sOworCisgIGNvbmZpZyA9IGdzdF9idWZmZXJfcG9vbF9nZXRfY29uZmlnIChwb29sKTsKKyAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19zZXRfcGFyYW1zIChjb25maWcsIGNhcHMsIHNpemUsIG1pbiwgbWF4KTsKKworICBpZiAoZ3N0X3F1ZXJ5X2ZpbmRfYWxsb2NhdGlvbl9tZXRhIChxdWVyeSwgR1NUX1ZJREVPX01FVEFfQVBJX1RZUEUsIE5VTEwpKSB7CisgICAgLyoganVzdCBzZXQgdGhlIG9wdGlvbiwgaWYgdGhlIHBvb2wgY2FuIHN1cHBvcnQgaXQgd2Ugd2lsbCB0cmFuc3BhcmVudGx5IHVzZQorICAgICAqIGl0IHRocm91Z2ggdGhlIHZpZGVvIGluZm8gQVBJLiBXZSBjb3VsZCBhbHNvIHNlZSBpZiB0aGUgcG9vbCBzdXBwb3J0IHRoaXMKKyAgICAgKiBvcHRpb24gYW5kIG9ubHkgYWN0aXZhdGUgaXQgdGhlbi4gKi8KKyAgICBnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX2FkZF9vcHRpb24gKGNvbmZpZywKKyAgICAgICAgR1NUX0JVRkZFUl9QT09MX09QVElPTl9WSURFT19NRVRBKTsKKyAgfQorICBnc3RfYnVmZmVyX3Bvb2xfc2V0X2NvbmZpZyAocG9vbCwgY29uZmlnKTsKKworICAvKiBhbmQgYWN0aXZhdGUgKi8KKyAgZ3N0X2J1ZmZlcl9wb29sX3NldF9hY3RpdmUgKHBvb2wsIFRSVUUpOworCisgIGdzdF9xdWVyeV91bnJlZiAocXVlcnkpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdmRlY19zcmNfbmVnb3RpYXRlIChHc3REVkRlYyAqIGR2ZGVjKQoreworICBHc3RDYXBzICpvdGhlcmNhcHM7CisgIGdib29sZWFuIHJldDsKKworICAvKiBubyBQQVIgd2FzIHNwZWNpZmllZCBpbiBpbnB1dCwgZGVyaXZlIGZyb20gZW5jb2RlZCBkYXRhICovCisgIGlmIChkdmRlYy0+bmVlZF9wYXIpIHsKKyAgICBpZiAoZHZkZWMtPlBBTCkgeworICAgICAgaWYgKGR2ZGVjLT53aWRlKSB7CisgICAgICAgIGR2ZGVjLT5wYXJfeCA9IFBBTF9XSURFX1BBUl9YOworICAgICAgICBkdmRlYy0+cGFyX3kgPSBQQUxfV0lERV9QQVJfWTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGR2ZGVjLT5wYXJfeCA9IFBBTF9OT1JNQUxfUEFSX1g7CisgICAgICAgIGR2ZGVjLT5wYXJfeSA9IFBBTF9OT1JNQUxfUEFSX1k7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChkdmRlYy0+d2lkZSkgeworICAgICAgICBkdmRlYy0+cGFyX3ggPSBOVFNDX1dJREVfUEFSX1g7CisgICAgICAgIGR2ZGVjLT5wYXJfeSA9IE5UU0NfV0lERV9QQVJfWTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGR2ZGVjLT5wYXJfeCA9IE5UU0NfTk9STUFMX1BBUl9YOworICAgICAgICBkdmRlYy0+cGFyX3kgPSBOVFNDX05PUk1BTF9QQVJfWTsKKyAgICAgIH0KKyAgICB9CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZHZkZWMsICJJbmZlcnJlZCBQQVIgJWQvJWQgZnJvbSB2aWRlbyBmb3JtYXQiLAorICAgICAgICBkdmRlYy0+cGFyX3gsIGR2ZGVjLT5wYXJfeSk7CisgIH0KKworICAvKiBpZ25vcmluZyByZ2IsIGJncjAgZm9yIG5vdyAqLworICBkdmRlYy0+YnBwID0gMjsKKworICBnc3RfdmlkZW9faW5mb19zZXRfZm9ybWF0ICgmZHZkZWMtPnZpbmZvLCBHU1RfVklERU9fRk9STUFUX1lVWTIsCisgICAgICA3MjAsIGR2ZGVjLT5oZWlnaHQpOworICBkdmRlYy0+dmluZm8uZnBzX24gPSBkdmRlYy0+ZnJhbWVyYXRlX251bWVyYXRvcjsKKyAgZHZkZWMtPnZpbmZvLmZwc19kID0gZHZkZWMtPmZyYW1lcmF0ZV9kZW5vbWluYXRvcjsKKyAgZHZkZWMtPnZpbmZvLnBhcl9uID0gZHZkZWMtPnBhcl94OworICBkdmRlYy0+dmluZm8ucGFyX2QgPSBkdmRlYy0+cGFyX3k7CisgIGlmIChkdmRlYy0+aW50ZXJsYWNlZCkgeworICAgIGR2ZGVjLT52aW5mby5pbnRlcmxhY2VfbW9kZSA9IEdTVF9WSURFT19JTlRFUkxBQ0VfTU9ERV9JTlRFUkxFQVZFRDsKKyAgfSBlbHNlIHsKKyAgICBkdmRlYy0+dmluZm8uaW50ZXJsYWNlX21vZGUgPSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfUFJPR1JFU1NJVkU7CisgIH0KKworICBvdGhlcmNhcHMgPSBnc3RfdmlkZW9faW5mb190b19jYXBzICgmZHZkZWMtPnZpbmZvKTsKKyAgcmV0ID0gZ3N0X3BhZF9zZXRfY2FwcyAoZHZkZWMtPnNyY3BhZCwgb3RoZXJjYXBzKTsKKworICBnc3RfZHZkZWNfbmVnb3RpYXRlX3Bvb2wgKGR2ZGVjLCBvdGhlcmNhcHMsICZkdmRlYy0+dmluZm8pOworICBnc3RfY2Fwc191bnJlZiAob3RoZXJjYXBzKTsKKworICBkdmRlYy0+c3JjX25lZ290aWF0ZWQgPSBUUlVFOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2R2ZGVjX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3REVkRlYyAqZHZkZWM7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisKKyAgZHZkZWMgPSBHU1RfRFZERUMgKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9zZWdtZW50X2luaXQgKCZkdmRlYy0+c2VnbWVudCwgR1NUX0ZPUk1BVF9VTkRFRklORUQpOworICAgICAgZHZkZWMtPm5lZWRfc2VnbWVudCA9IEZBTFNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDp7CisgICAgICBjb25zdCBHc3RTZWdtZW50ICpzZWdtZW50OworCisgICAgICBnc3RfZXZlbnRfcGFyc2Vfc2VnbWVudCAoZXZlbnQsICZzZWdtZW50KTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZHZkZWMsICJHb3QgU0VHTUVOVCAlIiBHU1RfU0VHTUVOVF9GT1JNQVQsICZzZWdtZW50KTsKKworICAgICAgZ3N0X3NlZ21lbnRfY29weV9pbnRvIChzZWdtZW50LCAmZHZkZWMtPnNlZ21lbnQpOworICAgICAgaWYgKCFnc3RfcGFkX2hhc19jdXJyZW50X2NhcHMgKGR2ZGVjLT5zcmNwYWQpKSB7CisgICAgICAgIGR2ZGVjLT5uZWVkX3NlZ21lbnQgPSBUUlVFOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgZXZlbnQgPSBOVUxMOworICAgICAgICByZXMgPSBUUlVFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZHZkZWMtPm5lZWRfc2VnbWVudCA9IEZBTFNFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICByZXMgPSBnc3RfZHZkZWNfc2lua19zZXRjYXBzIChkdmRlYywgY2Fwcyk7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGV2ZW50ID0gTlVMTDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChldmVudCkKKyAgICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKGR2ZGVjLT5zcmNwYWQsIGV2ZW50KTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2R2ZGVjX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3REVkRlYyAqZHZkZWM7CisgIGd1aW50OCAqaW5mcmFtZTsKKyAgZ3VpbnQ4ICpvdXRmcmFtZV9wdHJzWzNdOworICBnaW50IG91dGZyYW1lX3BpdGNoZXNbM107CisgIEdzdE1hcEluZm8gbWFwOworICBHc3RWaWRlb0ZyYW1lIGZyYW1lOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ3VpbnQgbGVuZ3RoOworICBndWludDY0IGNzdGFydCA9IEdTVF9DTE9DS19USU1FX05PTkUsIGNzdG9wID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgZ2Jvb2xlYW4gUEFMLCB3aWRlOworCisgIGR2ZGVjID0gR1NUX0RWREVDIChwYXJlbnQpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGluZnJhbWUgPSBtYXAuZGF0YTsKKworICAvKiBidWZmZXIgc2hvdWxkIGJlIGF0IGxlYXN0IHRoZSBzaXplIG9mIG9uZSBOVFNDIGZyYW1lLCB0aGlzIHNob3VsZAorICAgKiBiZSBlbm91Z2ggdG8gZGVjb2RlIHRoZSBoZWFkZXIuICovCisgIGlmIChHX1VOTElLRUxZIChtYXAuc2l6ZSA8IE5UU0NfQlVGRkVSKSkKKyAgICBnb3RvIHdyb25nX3NpemU7CisKKyAgLyogcHJlbGltaW5hcnkgZHJvcHBpbmcuIHVucmVmIGFuZCByZXR1cm4gaWYgb3V0c2lkZSBvZiBjb25maWd1cmVkIHNlZ21lbnQgKi8KKyAgaWYgKChkdmRlYy0+c2VnbWVudC5mb3JtYXQgPT0gR1NUX0ZPUk1BVF9USU1FKSAmJgorICAgICAgKCEoZ3N0X3NlZ21lbnRfY2xpcCAoJmR2ZGVjLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKSwKKyAgICAgICAgICAgICAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpICsgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKSwKKyAgICAgICAgICAgICAgICAgICZjc3RhcnQsICZjc3RvcCkpKSkKKyAgICBnb3RvIGRyb3BwaW5nOworCisgIGlmIChHX1VOTElLRUxZIChkdl9wYXJzZV9oZWFkZXIgKGR2ZGVjLT5kZWNvZGVyLCBpbmZyYW1lKSA8IDApKQorICAgIGdvdG8gcGFyc2VfaGVhZGVyX2Vycm9yOworCisgIC8qIGdldCBzaXplICovCisgIFBBTCA9IGR2X3N5c3RlbV81MF9maWVsZHMgKGR2ZGVjLT5kZWNvZGVyKTsKKyAgd2lkZSA9IGR2X2Zvcm1hdF93aWRlIChkdmRlYy0+ZGVjb2Rlcik7CisKKyAgLyogY2hlY2sgdGhlIGJ1ZmZlciBpcyBvZiByaWdodCBzaXplIGFmdGVyIHdlIGtub3cgaWYgd2UgYXJlCisgICAqIGRlYWxpbmcgd2l0aCBQQUwgb3IgTlRTQyAqLworICBsZW5ndGggPSAoUEFMID8gUEFMX0JVRkZFUiA6IE5UU0NfQlVGRkVSKTsKKyAgaWYgKEdfVU5MSUtFTFkgKG1hcC5zaXplIDwgbGVuZ3RoKSkKKyAgICBnb3RvIHdyb25nX3NpemU7CisKKyAgZHZfcGFyc2VfcGFja3MgKGR2ZGVjLT5kZWNvZGVyLCBpbmZyYW1lKTsKKworICBpZiAoZHZkZWMtPnZpZGVvX29mZnNldCAlIGR2ZGVjLT5kcm9wX2ZhY3RvciAhPSAwKQorICAgIGdvdG8gc2tpcDsKKworICAvKiByZW5lZ290aWF0ZSBvbiBjaGFuZ2UgKi8KKyAgaWYgKFBBTCAhPSBkdmRlYy0+UEFMIHx8IHdpZGUgIT0gZHZkZWMtPndpZGUpIHsKKyAgICBkdmRlYy0+c3JjX25lZ290aWF0ZWQgPSBGQUxTRTsKKyAgICBkdmRlYy0+UEFMID0gUEFMOworICAgIGR2ZGVjLT53aWRlID0gd2lkZTsKKyAgfQorCisgIGR2ZGVjLT5oZWlnaHQgPSAoZHZkZWMtPlBBTCA/IFBBTF9IRUlHSFQgOiBOVFNDX0hFSUdIVCk7CisKKyAgZHZkZWMtPmludGVybGFjZWQgPSAhZHZfaXNfcHJvZ3Jlc3NpdmUgKGR2ZGVjLT5kZWNvZGVyKTsKKworICAvKiBuZWdvdGlhdGUgaWYgbm90IGRvbmUgeWV0ICovCisgIGlmICghZHZkZWMtPnNyY19uZWdvdGlhdGVkKSB7CisgICAgaWYgKCFnc3RfZHZkZWNfc3JjX25lZ290aWF0ZSAoZHZkZWMpKQorICAgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKyAgfQorCisgIGlmIChnc3RfcGFkX2NoZWNrX3JlY29uZmlndXJlIChkdmRlYy0+c3JjcGFkKSkgeworICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChkdmRlYy0+c3JjcGFkKTsKKyAgICBpZiAoIWNhcHMpCisgICAgICBnb3RvIGZsdXNoaW5nOworCisgICAgZ3N0X2R2ZGVjX25lZ290aWF0ZV9wb29sIChkdmRlYywgY2FwcywgJmR2ZGVjLT52aW5mbyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICB9CisKKyAgaWYgKGR2ZGVjLT5uZWVkX3NlZ21lbnQpIHsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKGR2ZGVjLT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJmR2ZGVjLT5zZWdtZW50KSk7CisgICAgZHZkZWMtPm5lZWRfc2VnbWVudCA9IEZBTFNFOworICB9CisKKyAgcmV0ID0gZ3N0X2J1ZmZlcl9wb29sX2FjcXVpcmVfYnVmZmVyIChkdmRlYy0+cG9vbCwgJm91dGJ1ZiwgTlVMTCk7CisgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spKQorICAgIGdvdG8gbm9fYnVmZmVyOworCisgIGdzdF92aWRlb19mcmFtZV9tYXAgKCZmcmFtZSwgJmR2ZGVjLT52aW5mbywgb3V0YnVmLCBHU1RfTUFQX1dSSVRFKTsKKworICBvdXRmcmFtZV9wdHJzWzBdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoJmZyYW1lLCAwKTsKKyAgb3V0ZnJhbWVfcGl0Y2hlc1swXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoJmZyYW1lLCAwKTsKKworICAvKiB0aGUgcmVzdCBvbmx5IG1hdHRlcnMgZm9yIFlVWTIgKi8KKyAgaWYgKGR2ZGVjLT5icHAgPCAzKSB7CisgICAgb3V0ZnJhbWVfcHRyc1sxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKCZmcmFtZSwgMSk7CisgICAgb3V0ZnJhbWVfcHRyc1syXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKCZmcmFtZSwgMik7CisKKyAgICBvdXRmcmFtZV9waXRjaGVzWzFdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFICgmZnJhbWUsIDEpOworICAgIG91dGZyYW1lX3BpdGNoZXNbMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKCZmcmFtZSwgMik7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChkdmRlYywgImRlY29kaW5nIGFuZCBwdXNoaW5nIGJ1ZmZlciIpOworICBkdl9kZWNvZGVfZnVsbF9mcmFtZSAoZHZkZWMtPmRlY29kZXIsIGluZnJhbWUsCisgICAgICBlX2R2X2NvbG9yX3l1diwgb3V0ZnJhbWVfcHRycywgb3V0ZnJhbWVfcGl0Y2hlcyk7CisKKyAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmZnJhbWUpOworCisgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAob3V0YnVmLCBHU1RfVklERU9fQlVGRkVSX0ZMQUdfVEZGKTsKKworICBHU1RfQlVGRkVSX09GRlNFVCAob3V0YnVmKSA9IEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpOworICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKG91dGJ1ZikgPSBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKGJ1Zik7CisKKyAgLyogRklYTUUgOiBDb21wdXRlIHZhbHVlcyB3aGVuIHVzaW5nIG5vbi1USU1FIHNlZ21lbnRzLAorICAgKiBidXQgZm9yIHRoZSBtb21lbnQgbWFrZSBzdXJlIHdlIGF0IGxlYXN0IGRvbid0IHNldCBib2d1cyB2YWx1ZXMKKyAgICovCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoY3N0YXJ0KSkgeworICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpID0gY3N0YXJ0OworICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoY3N0b3ApKQorICAgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9IGNzdG9wIC0gY3N0YXJ0OworICB9CisKKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChkdmRlYy0+c3JjcGFkLCBvdXRidWYpOworCitza2lwOgorICBkdmRlYy0+dmlkZW9fb2Zmc2V0Kys7CisKK2RvbmU6CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX3NpemU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZHZkZWMsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiSW5wdXQgYnVmZmVyIHRvbyBzbWFsbCIpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGRvbmU7CisgIH0KK3BhcnNlX2hlYWRlcl9lcnJvcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkdmRlYywgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJFcnJvciBwYXJzaW5nIERWIGhlYWRlciIpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGRvbmU7CisgIH0KK25vdF9uZWdvdGlhdGVkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZHZkZWMsICJjb3VsZCBub3QgbmVnb3RpYXRlIG91dHB1dCIpOworICAgIGlmIChHU1RfUEFEX0lTX0ZMVVNISU5HIChkdmRlYy0+c3JjcGFkKSkKKyAgICAgIHJldCA9IEdTVF9GTE9XX0ZMVVNISU5HOworICAgIGVsc2UKKyAgICAgIHJldCA9IEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICAgIGdvdG8gZG9uZTsKKyAgfQorZmx1c2hpbmc6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkdmRlYywgImhhdmUgbm8gY3VycmVudCBjYXBzIik7CisgICAgcmV0ID0gR1NUX0ZMT1dfRkxVU0hJTkc7CisgICAgZ290byBkb25lOworICB9Citub19idWZmZXI6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkdmRlYywgImNvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXIiKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworZHJvcHBpbmc6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkdmRlYywKKyAgICAgICAgImRyb3BwaW5nIGJ1ZmZlciBzaW5jZSBpdCdzIG91dCBvZiB0aGUgY29uZmlndXJlZCBzZWdtZW50Iik7CisgICAgZ290byBkb25lOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2R2ZGVjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdERWRGVjICpkdmRlYyA9IEdTVF9EVkRFQyAoZWxlbWVudCk7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGR2ZGVjLT5kZWNvZGVyID0KKyAgICAgICAgICBkdl9kZWNvZGVyX25ldyAoMCwgZHZkZWMtPmNsYW1wX2x1bWEsIGR2ZGVjLT5jbGFtcF9jaHJvbWEpOworICAgICAgZHZkZWMtPmRlY29kZXItPnF1YWxpdHkgPSBxdWFsaXRpZXNbZHZkZWMtPnF1YWxpdHldOworICAgICAgZHZfc2V0X2Vycm9yX2xvZyAoZHZkZWMtPmRlY29kZXIsIE5VTEwpOworICAgICAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoJmR2ZGVjLT52aW5mbyk7CisgICAgICBnc3Rfc2VnbWVudF9pbml0ICgmZHZkZWMtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVU5ERUZJTkVEKTsKKyAgICAgIGR2ZGVjLT5zcmNfbmVnb3RpYXRlZCA9IEZBTFNFOworICAgICAgZHZkZWMtPnNpbmtfbmVnb3RpYXRlZCA9IEZBTFNFOworICAgICAgZHZkZWMtPm5lZWRfc2VnbWVudCA9IEZBTFNFOworICAgICAgLyogCisgICAgICAgKiBFbmFibGUgdGhpcyBmdW5jdGlvbiBjYWxsIHdoZW4gbGliZHYyIDAuMTAwIG9yIGhpZ2hlciBpcyBtb3JlCisgICAgICAgKiBjb21tb24KKyAgICAgICAqLworICAgICAgLyogZHZfc2V0X3F1YWxpdHkgKGR2ZGVjLT5kZWNvZGVyLCBxdWFsaXRpZXMgW2R2ZGVjLT5xdWFsaXR5XSk7ICovCisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1BMQVlJTkc6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUExBWUlOR19UT19QQVVTRUQ6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZHZfZGVjb2Rlcl9mcmVlIChkdmRlYy0+ZGVjb2Rlcik7CisgICAgICBkdmRlYy0+ZGVjb2RlciA9IE5VTEw7CisgICAgICBpZiAoZHZkZWMtPnBvb2wpIHsKKyAgICAgICAgZ3N0X2J1ZmZlcl9wb29sX3NldF9hY3RpdmUgKGR2ZGVjLT5wb29sLCBGQUxTRSk7CisgICAgICAgIGdzdF9vYmplY3RfdW5yZWYgKGR2ZGVjLT5wb29sKTsKKyAgICAgICAgZHZkZWMtPnBvb2wgPSBOVUxMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kdmRlY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0RFZEZWMgKmR2ZGVjID0gR1NUX0RWREVDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DTEFNUF9MVU1BOgorICAgICAgZHZkZWMtPmNsYW1wX2x1bWEgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0xBTVBfQ0hST01BOgorICAgICAgZHZkZWMtPmNsYW1wX2Nocm9tYSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9RVUFMSVRZOgorICAgICAgZHZkZWMtPnF1YWxpdHkgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBpZiAoKGR2ZGVjLT5xdWFsaXR5IDwgMCkgfHwgKGR2ZGVjLT5xdWFsaXR5ID4gNSkpCisgICAgICAgIGR2ZGVjLT5xdWFsaXR5ID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ERUNPREVfTlRIOgorICAgICAgZHZkZWMtPmRyb3BfZmFjdG9yID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZHZkZWNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdERWRGVjICpkdmRlYyA9IEdTVF9EVkRFQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ0xBTVBfTFVNQToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBkdmRlYy0+Y2xhbXBfbHVtYSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0xBTVBfQ0hST01BOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIGR2ZGVjLT5jbGFtcF9jaHJvbWEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1FVQUxJVFk6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgZHZkZWMtPnF1YWxpdHkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RFQ09ERV9OVEg6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBkdmRlYy0+ZHJvcF9mYWN0b3IpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2R2L2dzdGR2ZGVjLmggYi9leHQvZHYvZ3N0ZHZkZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDMxZWYwCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2R2L2dzdGR2ZGVjLmgKQEAgLTAsMCArMSw5OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9EVkRFQ19IX18KKyNkZWZpbmUgX19HU1RfRFZERUNfSF9fCisKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworI2luY2x1ZGUgPGxpYmR2L2R2Lmg+CisKKworR19CRUdJTl9ERUNMUworCisKKyNkZWZpbmUgR1NUX1RZUEVfRFZERUMgXAorICAoZ3N0X2R2ZGVjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9EVkRFQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0RWREVDLEdzdERWRGVjKSkKKyNkZWZpbmUgR1NUX0RWREVDX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0RWREVDLEdzdERWRGVjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfRFZERUMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9EVkRFQykpCisjZGVmaW5lIEdTVF9JU19EVkRFQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9EVkRFQykpCisKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdERWRGVjIEdzdERWRGVjOwordHlwZWRlZiBzdHJ1Y3QgX0dzdERWRGVjQ2xhc3MgR3N0RFZEZWNDbGFzczsKKworCitzdHJ1Y3QgX0dzdERWRGVjIHsKKyAgR3N0RWxlbWVudCAgICAgZWxlbWVudDsKKworICBHc3RQYWQgICAgICAgICpzaW5rcGFkOworICBHc3RQYWQgICAgICAgICpzcmNwYWQ7CisKKyAgZHZfZGVjb2Rlcl90ICAqZGVjb2RlcjsKKyAgZ2Jvb2xlYW4gICAgICAgY2xhbXBfbHVtYTsKKyAgZ2Jvb2xlYW4gICAgICAgY2xhbXBfY2hyb21hOworICBnaW50ICAgICAgICAgICBxdWFsaXR5OworCisgIGdib29sZWFuICAgICAgIFBBTDsKKyAgZ2Jvb2xlYW4gICAgICAgaW50ZXJsYWNlZDsKKyAgZ2Jvb2xlYW4gICAgICAgd2lkZTsKKworICAvKiBpbnB1dCBjYXBzICovCisgIGdib29sZWFuICAgICAgIHNpbmtfbmVnb3RpYXRlZDsKKyAgR3N0VmlkZW9JbmZvICAgdmluZm87CisgIGdpbnQgICAgICAgICAgIGZyYW1lcmF0ZV9udW1lcmF0b3I7CisgIGdpbnQgICAgICAgICAgIGZyYW1lcmF0ZV9kZW5vbWluYXRvcjsKKyAgZ2ludCAgICAgICAgICAgaGVpZ2h0OworICBnaW50ICAgICAgICAgICBwYXJfeDsKKyAgZ2ludCAgICAgICAgICAgcGFyX3k7CisgIGdib29sZWFuICAgICAgIG5lZWRfcGFyOworCisgIC8qIG5lZ290aWF0ZWQgb3V0cHV0ICovCisgIGdpbnQgICAgICAgICAgIGJwcDsKKyAgZ2Jvb2xlYW4gICAgICAgc3JjX25lZ290aWF0ZWQ7CisgIAorICBnaW50ICAgICAgICAgICB2aWRlb19vZmZzZXQ7CisgIGdpbnQgICAgICAgICAgIGRyb3BfZmFjdG9yOworCisgIEdzdEJ1ZmZlclBvb2wgKnBvb2w7CisgIEdzdFNlZ21lbnQgICAgIHNlZ21lbnQ7CisgIGdib29sZWFuICAgICAgIG5lZWRfc2VnbWVudDsKK307CisKK3N0cnVjdCBfR3N0RFZEZWNDbGFzcyB7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCisKK0dUeXBlIGdzdF9kdmRlY19nZXRfdHlwZSAodm9pZCk7CisKKworR19FTkRfREVDTFMKKworCisjZW5kaWYgLyogX19HU1RfRFZERUNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvZHYvZ3N0ZHZkZW11eC5jIGIvZXh0L2R2L2dzdGR2ZGVtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzZkN2RhCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2R2L2dzdGR2ZGVtdXguYwpAQCAtMCwwICsxLDIwNDcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSAiZ3N0ZHZkZW11eC5oIgorI2luY2x1ZGUgImdzdHNtcHRldGltZWNvZGUuaCIKKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtZHZkZW11eAorICoKKyAqIGR2ZGVtdXggc3BsaXRzIHJhdyBEViBpbnRvIGl0cyBhdWRpbyBhbmQgdmlkZW8gY29tcG9uZW50cy4gVGhlIGF1ZGlvIHdpbGwgYmUKKyAqIGRlY29kZWQgcmF3IHNhbXBsZXMgYW5kIHRoZSB2aWRlbyB3aWxsIGJlIGVuY29kZWQgRFYgdmlkZW8uCisgKgorICogVGhpcyBlbGVtZW50IGNhbiBvcGVyYXRlIGluIGJvdGggcHVzaCBhbmQgcHVsbCBtb2RlIGRlcGVuZGluZyBvbiB0aGUKKyAqIGNhcGFiaWxpdGllcyBvZiB0aGUgdXBzdHJlYW0gcGVlci4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj10ZXN0LmR2ICEgZHZkZW11eCBuYW1lPWRlbXV4ICEgcXVldWUgISBhdWRpb2NvbnZlcnQgISBhbHNhc2luayBkZW11eC4gISBxdWV1ZSAhIGR2ZGVjICEgeHZpbWFnZXNpbmsKKyAqIF18IFRoaXMgcGlwZWxpbmUgZGVjb2RlcyBhbmQgcmVuZGVycyB0aGUgcmF3IERWIHN0cmVhbSB0byBhbiBhdWRpbyBhbmQgYSB2aWRlb3NpbmsuCisgKiA8L3JlZnNlY3QyPgorICovCisKKy8qIERWIG91dHB1dCBoYXMgdHdvIG1vZGVzLCBub3JtYWwgYW5kIHdpZGUuIFRoZSByZXNvbHV0aW9uIGlzIHRoZSBzYW1lIGluIGJvdGgKKyAqIGNhc2VzOiA3MjAgcGl4ZWxzIHdpZGUgYnkgNTc2IHBpeGVscyB0YWxsIGluIFBBTCBmb3JtYXQsIGFuZCA3MjB4NDgwIGZvcgorICogTlRTQy4KKyAqCisgKiBFYWNoIG9mIHRoZSBtb2RlcyBoYXMgaXRzIG93biBwaXhlbCBhc3BlY3QgcmF0aW8sIHdoaWNoIGlzIGZpeGVkIGluIHByYWN0aWNlCisgKiBieSBJVFUtUiBCVC42MDEgKGFsc28ga25vd24gYXMgIkNDSVItNjAxIiBvciAiUmVjLjYwMSIpLiBPciBzbyBjbGFpbXMgYQorICogcmVmZXJlbmNlIHRoYXQgSSBjdWxsZWQgZnJvbSB0aGUgcmVsaWFibGUgImludGVybmV0IiwKKyAqIGh0dHA6Ly93d3cubWlyLmNvbS9ETUcvYXNwZWN0Lmh0bWwuIE5vcm1hbCBQQUwgaXMgNTkvNTQgYW5kIG5vcm1hbCBOVFNDIGlzCisgKiAxMC8xMS4gQmVjYXVzZSB0aGUgcGl4ZWwgcmVzb2x1dGlvbiBpcyB0aGUgc2FtZSBmb3IgYm90aCBjYXNlcywgd2UgY2FuIGdldAorICogdGhlIHBpeGVsIGFzcGVjdCByYXRpbyBmb3Igd2lkZSByZWNvcmRpbmdzIGJ5IG11bHRpcGx5aW5nIGJ5IHRoZSByYXRpbyBvZgorICogZGlzcGxheSBhc3BlY3QgcmF0aW9zLCAxNi85IChmb3Igd2lkZSkgZGl2aWRlZCBieSA0LzMgKGZvciBub3JtYWwpOgorICoKKyAqIFdpZGUgTlRTQzogMTAvMTEgKiAoMTYvOSkvKDQvMykgPSA0MC8zMworICogV2lkZSBQQUw6IDU5LzU0ICogKDE2LzkpLyg0LzMpID0gMTE4LzgxCisgKgorICogSG93ZXZlciwgdGhlIHBpeGVsIHJlc29sdXRpb24gY29taW5nIG91dCBvZiBhIERWIHNvdXJjZSBkb2VzIG5vdCBjb21iaW5lIHdpdGgKKyAqIHRoZSBzdGFuZGFyZCBwaXhlbCBhc3BlY3QgcmF0aW9zIHRvIGdpdmUgYSBwcm9wZXIgZGlzcGxheSBhc3BlY3QgcmF0aW8uIEFuCisgKiBpbWFnZSA0ODAgcGl4ZWxzIHRhbGwsIHdpdGggYSA0OjMgZGlzcGxheSBhc3BlY3QgcmF0aW8sIHdpbGwgYmUgNzY4IHBpeGVscworICogd2lkZS4gQnV0LCBpZiB3ZSB0YWtlIHRoZSBub3JtYWwgUEFMIGFzcGVjdCByYXRpbyBvZiA1OS81NCwgYW5kIG11bHRpcGx5IGl0CisgKiB3aXRoIHRoZSB3aWR0aCBvZiB0aGUgRFYgaW1hZ2UgKDcyMCBwaXhlbHMpLCB3ZSBnZXQgNzg2LjY2Ni4uLiwgd2hpY2ggaXMKKyAqIG5vbmludGVncmFsIGFuZCB0b28gd2lkZS4gVGhlIGNhbWVyYSBpcyBub3Qgb3V0cHV0dGluZyBhIDQ6MyBpbWFnZS4KKyAqIAorICogSWYgdGhlIHZpZGVvIHNpbmsgZm9yIHRoaXMgc3RyZWFtIGhhcyBmaXhlZCBkaW1lbnNpb25zIChzdWNoIGFzIGZvcgorICogZnVsbHNjcmVlbiBwbGF5YmFjaywgb3IgZm9yIGEgamF2YSBhcHBsZXQgaW4gYSB3ZWIgcGFnZSksIHlvdSB0aGVuIGhhdmUgdHdvCisgKiBjaG9pY2VzLiBFaXRoZXIgeW91IHNob3cgdGhlIHdob2xlIGltYWdlLCBidXQgcGFkIHRoZSBpbWFnZSB3aXRoIGJsYWNrCisgKiBib3JkZXJzIG9uIHRoZSB0b3AgYW5kIGJvdHRvbSAobGlrZSB3YXRjaGluZyBhIHdpZGVzY3JlZW4gdmlkZW8gb24gYSA0OjMKKyAqIGRldmljZSksIG9yIHlvdSBjcm9wIHRoZSB2aWRlbyB0byB0aGUgcHJvcGVyIHJhdGlvLiBBcHBhcmVudGx5IHRoZSBsYXR0ZXIgaXMKKyAqIHRoZSBzdGFuZGFyZCBwcmFjdGljZS4KKyAqCisgKiBGb3IgaXRzIHBhcnQsIEdTdHJlYW1lciBpcyBjb25jZXJuZWQgd2l0aCBhY2N1cmFjeSBhbmQgcHJlc2VydmF0aW9uIG9mCisgKiBpbmZvcm1hdGlvbi4gVGhpcyBlbGVtZW50IG91dHB1dHMgdGhlIDcyMHg1NzYgb3IgNzIweDQ4MCB2aWRlbyB0aGF0IGl0CisgKiByZWNpZXZlcywgbm90aW5nIHRoZSBwcm9wZXIgYXNwZWN0IHJhdGlvLiBUaGlzIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtIGZvcgorICogd2luZG93ZWQgYXBwbGljYXRpb25zLCB3aGljaCBjYW4gY2hhbmdlIHNpemUgdG8gZml0IHRoZSB2aWRlby4gQXBwbGljYXRpb25zCisgKiB3aXRoIGZpeGVkIHNpemUgcmVxdWlyZW1lbnRzIHNob3VsZCBkZWNpZGUgd2hldGhlciB0byBjcm9wIG9yIHBhZCB3aGljaAorICogYW4gZWxlbWVudCBzdWNoIGFzIHZpZGVvYm94IGNhbiBkby4KKyAqLworCisjZGVmaW5lIE5UU0NfSEVJR0hUIDQ4MAorI2RlZmluZSBOVFNDX0JVRkZFUiAxMjAwMDAKKyNkZWZpbmUgTlRTQ19GUkFNRVJBVEVfTlVNRVJBVE9SIDMwMDAwCisjZGVmaW5lIE5UU0NfRlJBTUVSQVRFX0RFTk9NSU5BVE9SIDEwMDEKKworI2RlZmluZSBQQUxfSEVJR0hUIDU3NgorI2RlZmluZSBQQUxfQlVGRkVSIDE0NDAwMAorI2RlZmluZSBQQUxfRlJBTUVSQVRFX05VTUVSQVRPUiAyNQorI2RlZmluZSBQQUxfRlJBTUVSQVRFX0RFTk9NSU5BVE9SIDEKKworI2RlZmluZSBQQUxfTk9STUFMX1BBUl9YICAgICAgICAxNgorI2RlZmluZSBQQUxfTk9STUFMX1BBUl9ZICAgICAgICAxNQorI2RlZmluZSBQQUxfV0lERV9QQVJfWCAgICAgICAgICA2NAorI2RlZmluZSBQQUxfV0lERV9QQVJfWSAgICAgICAgICA0NQorCisjZGVmaW5lIE5UU0NfTk9STUFMX1BBUl9YICAgICAgIDgKKyNkZWZpbmUgTlRTQ19OT1JNQUxfUEFSX1kgICAgICAgOQorI2RlZmluZSBOVFNDX1dJREVfUEFSX1ggICAgICAgICAzMgorI2RlZmluZSBOVFNDX1dJREVfUEFSX1kgICAgICAgICAyNworCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChkdmRlbXV4X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGR2ZGVtdXhfZGVidWcKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfdGVtcCA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtZHYsIHN5c3RlbXN0cmVhbSA9IChib29sZWFuKSB0cnVlIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgdmlkZW9fc3JjX3RlbXAgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInZpZGVvIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LWR2LCBzeXN0ZW1zdHJlYW0gPSAoYm9vbGVhbikgZmFsc2UiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBhdWRpb19zcmNfdGVtcCA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgiYXVkaW8iLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfU09NRVRJTUVTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoUzE2KSAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIHsgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCAiICJjaGFubmVscyA9IChpbnQpIHsyLCA0fSIpCisgICAgKTsKKworCisjZGVmaW5lIGdzdF9kdmRlbXV4X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdERWRGVtdXgsIGdzdF9kdmRlbXV4LCBHU1RfVFlQRV9FTEVNRU5UKTsKKworc3RhdGljIHZvaWQgZ3N0X2R2ZGVtdXhfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCisvKiBxdWVyeSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBnYm9vbGVhbiBnc3RfZHZkZW11eF9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworc3RhdGljIGdib29sZWFuIGdzdF9kdmRlbXV4X3NpbmtfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworCisvKiBjb252ZXJ0IGZ1bmN0aW9ucyAqLworc3RhdGljIGdib29sZWFuIGdzdF9kdmRlbXV4X3NpbmtfY29udmVydCAoR3N0RFZEZW11eCAqIGRlbXV4LAorICAgIEdzdEZvcm1hdCBzcmNfZm9ybWF0LCBnaW50NjQgc3JjX3ZhbHVlLCBHc3RGb3JtYXQgZGVzdF9mb3JtYXQsCisgICAgZ2ludDY0ICogZGVzdF92YWx1ZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2R2ZGVtdXhfc3JjX2NvbnZlcnQgKEdzdERWRGVtdXggKiBkZW11eCwgR3N0UGFkICogcGFkLAorICAgIEdzdEZvcm1hdCBzcmNfZm9ybWF0LCBnaW50NjQgc3JjX3ZhbHVlLCBHc3RGb3JtYXQgZGVzdF9mb3JtYXQsCisgICAgZ2ludDY0ICogZGVzdF92YWx1ZSk7CisKKy8qIGV2ZW50IGZ1bmN0aW9ucyAqLworc3RhdGljIGdib29sZWFuIGdzdF9kdmRlbXV4X3NlbmRfZXZlbnQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZHZkZW11eF9oYW5kbGVfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZHZkZW11eF9oYW5kbGVfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CisKKy8qIHNjaGVkdWxpbmcgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBnc3RfZHZkZW11eF9sb29wIChHc3RQYWQgKiBwYWQpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2R2ZGVtdXhfZmx1c2ggKEdzdERWRGVtdXggKiBkdmRlbXV4KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9kdmRlbXV4X2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworCisvKiBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb25zICovCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2R2ZGVtdXhfc2lua19hY3RpdmF0ZSAoR3N0UGFkICogc2lua3BhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9kdmRlbXV4X3NpbmtfYWN0aXZhdGVfbW9kZSAoR3N0UGFkICogc2lua3BhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdFBhZE1vZGUgbW9kZSwgZ2Jvb2xlYW4gYWN0aXZlKTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfZHZkZW11eF9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgdm9pZAorZ3N0X2R2ZGVtdXhfY2xhc3NfaW5pdCAoR3N0RFZEZW11eENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9kdmRlbXV4X2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZHZkZW11eF9jaGFuZ2Vfc3RhdGUpOworICBnc3RlbGVtZW50X2NsYXNzLT5zZW5kX2V2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kdmRlbXV4X3NlbmRfZXZlbnQpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZ2aWRlb19zcmNfdGVtcCk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmYXVkaW9fc3JjX3RlbXApOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiRFYgc3lzdGVtIHN0cmVhbSBkZW11eGVyIiwgIkNvZGVjL0RlbXV4ZXIiLAorICAgICAgIlVzZXMgbGliZHYgdG8gc2VwYXJhdGUgRFYgYXVkaW8gZnJvbSBEViB2aWRlbyAobGliZHYuc291cmNlZm9yZ2UubmV0KSIsCisgICAgICAiRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4sIFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGR2ZGVtdXhfZGVidWcsICJkdmRlbXV4IiwgMCwgIkRWIGRlbXV4ZXIgZWxlbWVudCIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2R2ZGVtdXhfaW5pdCAoR3N0RFZEZW11eCAqIGR2ZGVtdXgpCit7CisgIGdpbnQgaTsKKworICBkdmRlbXV4LT5zaW5rcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzaW5rX3RlbXAsICJzaW5rIik7CisgIC8qIHdlIGNhbiBvcGVyYXRlIGluIHB1bGwgYW5kIHB1c2ggbW9kZSBzbyB3ZSBpbnN0YWxsCisgICAqIGEgY3VzdG9tIGFjdGl2YXRlIGZ1bmN0aW9uICovCisgIGdzdF9wYWRfc2V0X2FjdGl2YXRlX2Z1bmN0aW9uIChkdmRlbXV4LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kdmRlbXV4X3NpbmtfYWN0aXZhdGUpKTsKKyAgLyogdGhlIGZ1bmN0aW9uIHRvIGFjdGl2YXRlIGluIHB1c2ggbW9kZSAqLworICBnc3RfcGFkX3NldF9hY3RpdmF0ZW1vZGVfZnVuY3Rpb24gKGR2ZGVtdXgtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2R2ZGVtdXhfc2lua19hY3RpdmF0ZV9tb2RlKSk7CisgIC8qIGZvciBwdXNoIG1vZGUsIHRoaXMgaXMgdGhlIGNoYWluIGZ1bmN0aW9uICovCisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChkdmRlbXV4LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kdmRlbXV4X2NoYWluKSk7CisgIC8qIGhhbmRsaW5nIGV2ZW50cyAoaW4gcHVzaCBtb2RlIG9ubHkpICovCisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChkdmRlbXV4LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kdmRlbXV4X2hhbmRsZV9zaW5rX2V2ZW50KSk7CisgIC8qIHF1ZXJ5IGZ1bmN0aW9ucyAqLworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAoZHZkZW11eC0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZHZkZW11eF9zaW5rX3F1ZXJ5KSk7CisKKyAgLyogbm93IGFkZCB0aGUgcGFkICovCisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChkdmRlbXV4KSwgZHZkZW11eC0+c2lua3BhZCk7CisKKyAgZHZkZW11eC0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKKworICAvKiB3ZSBuZWVkIDQgdGVtcCBidWZmZXJzIGZvciBhdWRpbyBkZWNvZGluZyB3aGljaCBhcmUgb2YgYSBzdGF0aWMKKyAgICogc2l6ZSBhbmQgd2hpY2ggd2UgY2FuIGFsbG9jYXRlIGhlcmUgKi8KKyAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIGR2ZGVtdXgtPmF1ZGlvX2J1ZmZlcnNbaV0gPQorICAgICAgICAoZ2ludDE2ICopIGdfbWFsbG9jIChEVl9BVURJT19NQVhfU0FNUExFUyAqIHNpemVvZiAoZ2ludDE2KSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9kdmRlbXV4X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3REVkRlbXV4ICpkdmRlbXV4OworICBnaW50IGk7CisKKyAgZHZkZW11eCA9IEdTVF9EVkRFTVVYIChvYmplY3QpOworCisgIGdfb2JqZWN0X3VucmVmIChkdmRlbXV4LT5hZGFwdGVyKTsKKworICAvKiBjbGVhbiB1cCB0ZW1wIGF1ZGlvIGJ1ZmZlcnMgKi8KKyAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIGdfZnJlZSAoZHZkZW11eC0+YXVkaW9fYnVmZmVyc1tpXSk7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKKy8qIHJlc2V0IHRvIGRlZmF1bHQgdmFsdWVzIGJlZm9yZSBzdGFydGluZyBzdHJlYW1pbmcgKi8KK3N0YXRpYyB2b2lkCitnc3RfZHZkZW11eF9yZXNldCAoR3N0RFZEZW11eCAqIGR2ZGVtdXgpCit7CisgIGR2ZGVtdXgtPmZyYW1lX29mZnNldCA9IDA7CisgIGR2ZGVtdXgtPmF1ZGlvX29mZnNldCA9IDA7CisgIGR2ZGVtdXgtPnZpZGVvX29mZnNldCA9IDA7CisgIGR2ZGVtdXgtPmRpc2NvbnQgPSBUUlVFOworICBnX2F0b21pY19pbnRfc2V0ICgmZHZkZW11eC0+Zm91bmRfaGVhZGVyLCAwKTsKKyAgZHZkZW11eC0+ZnJhbWVfbGVuID0gLTE7CisgIGR2ZGVtdXgtPm5lZWRfc2VnbWVudCA9IEZBTFNFOworICBkdmRlbXV4LT5uZXdfbWVkaWEgPSBGQUxTRTsKKyAgZHZkZW11eC0+ZnJhbWVyYXRlX251bWVyYXRvciA9IDA7CisgIGR2ZGVtdXgtPmZyYW1lcmF0ZV9kZW5vbWluYXRvciA9IDA7CisgIGR2ZGVtdXgtPmhlaWdodCA9IDA7CisgIGR2ZGVtdXgtPmZyZXF1ZW5jeSA9IDA7CisgIGR2ZGVtdXgtPmNoYW5uZWxzID0gMDsKKyAgZHZkZW11eC0+d2lkZSA9IEZBTFNFOworICBnc3Rfc2VnbWVudF9pbml0ICgmZHZkZW11eC0+Ynl0ZV9zZWdtZW50LCBHU1RfRk9STUFUX0JZVEVTKTsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJmR2ZGVtdXgtPnRpbWVfc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZHZkZW11eC0+c2VnbWVudF9zZXFudW0gPSAwOworICBkdmRlbXV4LT51cHN0cmVhbV90aW1lX3NlZ21lbnQgPSBGQUxTRTsKKyAgZHZkZW11eC0+aGF2ZV9ncm91cF9pZCA9IEZBTFNFOworICBkdmRlbXV4LT5ncm91cF9pZCA9IEdfTUFYVUlOVDsKKyAgZHZkZW11eC0+dGFnX2V2ZW50ID0gTlVMTDsKK30KKworc3RhdGljIGdib29sZWFuCitoYXZlX2dyb3VwX2lkIChHc3REVkRlbXV4ICogZGVtdXgpCit7CisgIEdzdEV2ZW50ICpldmVudDsKKworICBldmVudCA9IGdzdF9wYWRfZ2V0X3N0aWNreV9ldmVudCAoZGVtdXgtPnNpbmtwYWQsIEdTVF9FVkVOVF9TVFJFQU1fU1RBUlQsIDApOworICBpZiAoZXZlbnQpIHsKKyAgICBpZiAoZ3N0X2V2ZW50X3BhcnNlX2dyb3VwX2lkIChldmVudCwgJmRlbXV4LT5ncm91cF9pZCkpCisgICAgICBkZW11eC0+aGF2ZV9ncm91cF9pZCA9IFRSVUU7CisgICAgZWxzZQorICAgICAgZGVtdXgtPmhhdmVfZ3JvdXBfaWQgPSBGQUxTRTsKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgfSBlbHNlIGlmICghZGVtdXgtPmhhdmVfZ3JvdXBfaWQpIHsKKyAgICBkZW11eC0+aGF2ZV9ncm91cF9pZCA9IFRSVUU7CisgICAgZGVtdXgtPmdyb3VwX2lkID0gZ3N0X3V0aWxfZ3JvdXBfaWRfbmV4dCAoKTsKKyAgfQorCisgIHJldHVybiBkZW11eC0+aGF2ZV9ncm91cF9pZDsKK30KKworc3RhdGljIEdzdEV2ZW50ICoKK2dzdF9kdmRlbXV4X2NyZWF0ZV9nbG9iYWxfdGFnX2V2ZW50IChHc3REVkRlbXV4ICogZHZkZW11eCkKK3sKKyAgZ2NoYXIgcmVjX2RhdGV0aW1lWzQwXTsKKyAgR3N0RGF0ZVRpbWUgKnJlY19kdDsKKyAgR3N0VGFnTGlzdCAqdGFnczsKKworICB0YWdzID0gZ3N0X3RhZ19saXN0X25ldyAoR1NUX1RBR19DT05UQUlORVJfRk9STUFULCAiRFYiLCBOVUxMKTsKKyAgZ3N0X3RhZ19saXN0X3NldF9zY29wZSAodGFncywgR1NUX1RBR19TQ09QRV9HTE9CQUwpOworCisgIGlmIChkdl9nZXRfcmVjb3JkaW5nX2RhdGV0aW1lIChkdmRlbXV4LT5kZWNvZGVyLCByZWNfZGF0ZXRpbWUpKSB7CisgICAgcmVjX2R0ID0gZ3N0X2RhdGVfdGltZV9uZXdfZnJvbV9pc284NjAxX3N0cmluZyAocmVjX2RhdGV0aW1lKTsKKyAgICBpZiAocmVjX2R0KSB7CisgICAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIEdTVF9UQUdfREFURV9USU1FLAorICAgICAgICAgIHJlY19kdCwgTlVMTCk7CisgICAgICBnc3RfZGF0ZV90aW1lX3VucmVmIChyZWNfZHQpOworICAgIH0KKyAgfQorCisgIHJldHVybiBnc3RfZXZlbnRfbmV3X3RhZyAodGFncyk7Cit9CisKK3N0YXRpYyBHc3RQYWQgKgorZ3N0X2R2ZGVtdXhfYWRkX3BhZCAoR3N0RFZEZW11eCAqIGR2ZGVtdXgsIEdzdFN0YXRpY1BhZFRlbXBsYXRlICogdGVtcGxhdGUsCisgICAgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFBhZCAqcGFkOworICBHc3RFdmVudCAqZXZlbnQ7CisgIGdjaGFyICpzdHJlYW1faWQ7CisKKyAgcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKHRlbXBsYXRlLCB0ZW1wbGF0ZS0+bmFtZV90ZW1wbGF0ZSk7CisKKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKHBhZCwgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kdmRlbXV4X3NyY19xdWVyeSkpOworCisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2R2ZGVtdXhfaGFuZGxlX3NyY19ldmVudCkpOworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChwYWQpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHBhZCwgVFJVRSk7CisKKyAgc3RyZWFtX2lkID0KKyAgICAgIGdzdF9wYWRfY3JlYXRlX3N0cmVhbV9pZCAocGFkLAorICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAoZHZkZW11eCksCisgICAgICB0ZW1wbGF0ZSA9PSAmdmlkZW9fc3JjX3RlbXAgPyAidmlkZW8iIDogImF1ZGlvIik7CisgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKHN0cmVhbV9pZCk7CisgIGlmIChoYXZlX2dyb3VwX2lkIChkdmRlbXV4KSkKKyAgICBnc3RfZXZlbnRfc2V0X2dyb3VwX2lkIChldmVudCwgZHZkZW11eC0+Z3JvdXBfaWQpOworICBnc3RfcGFkX3B1c2hfZXZlbnQgKHBhZCwgZXZlbnQpOworICBnX2ZyZWUgKHN0cmVhbV9pZCk7CisKKyAgZ3N0X3BhZF9zZXRfY2FwcyAocGFkLCBjYXBzKTsKKworICBnc3RfcGFkX3B1c2hfZXZlbnQgKHBhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmZHZkZW11eC0+dGltZV9zZWdtZW50KSk7CisKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKGR2ZGVtdXgpLCBwYWQpOworCisgIGlmICghZHZkZW11eC0+dGFnX2V2ZW50KSB7CisgICAgZHZkZW11eC0+dGFnX2V2ZW50ID0gZ3N0X2R2ZGVtdXhfY3JlYXRlX2dsb2JhbF90YWdfZXZlbnQgKGR2ZGVtdXgpOworICB9CisKKyAgaWYgKGR2ZGVtdXgtPnRhZ19ldmVudCkgeworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocGFkLCBnc3RfZXZlbnRfcmVmIChkdmRlbXV4LT50YWdfZXZlbnQpKTsKKyAgfQorCisgIHJldHVybiBwYWQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZHZkZW11eF9yZW1vdmVfcGFkcyAoR3N0RFZEZW11eCAqIGR2ZGVtdXgpCit7CisgIGlmIChkdmRlbXV4LT52aWRlb3NyY3BhZCkgeworICAgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKEdTVF9FTEVNRU5UIChkdmRlbXV4KSwgZHZkZW11eC0+dmlkZW9zcmNwYWQpOworICAgIGR2ZGVtdXgtPnZpZGVvc3JjcGFkID0gTlVMTDsKKyAgfQorICBpZiAoZHZkZW11eC0+YXVkaW9zcmNwYWQpIHsKKyAgICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChHU1RfRUxFTUVOVCAoZHZkZW11eCksIGR2ZGVtdXgtPmF1ZGlvc3JjcGFkKTsKKyAgICBkdmRlbXV4LT5hdWRpb3NyY3BhZCA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZHZkZW11eF9zcmNfY29udmVydCAoR3N0RFZEZW11eCAqIGR2ZGVtdXgsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RGb3JtYXQgc3JjX2Zvcm1hdCwgZ2ludDY0IHNyY192YWx1ZSwgR3N0Rm9ybWF0IGRlc3RfZm9ybWF0LAorICAgIGdpbnQ2NCAqIGRlc3RfdmFsdWUpCit7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisKKyAgaWYgKGRlc3RfZm9ybWF0ID09IHNyY19mb3JtYXQgfHwgc3JjX3ZhbHVlID09IC0xKSB7CisgICAgKmRlc3RfdmFsdWUgPSBzcmNfdmFsdWU7CisgICAgZ290byBkb25lOworICB9CisKKyAgaWYgKGR2ZGVtdXgtPmZyYW1lX2xlbiA8PSAwKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKGR2ZGVtdXgtPmRlY29kZXIgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworCisgIEdTVF9JTkZPX09CSkVDVCAocGFkLAorICAgICAgInNyY192YWx1ZTolIiBHX0dJTlQ2NF9GT1JNQVQgIiwgc3JjX2Zvcm1hdDolZCwgZGVzdF9mb3JtYXQ6JWQiLAorICAgICAgc3JjX3ZhbHVlLCBzcmNfZm9ybWF0LCBkZXN0X2Zvcm1hdCk7CisKKyAgc3dpdGNoIChzcmNfZm9ybWF0KSB7CisgICAgY2FzZSBHU1RfRk9STUFUX0JZVEVTOgorICAgICAgc3dpdGNoIChkZXN0X2Zvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfREVGQVVMVDoKKyAgICAgICAgICBpZiAocGFkID09IGR2ZGVtdXgtPnZpZGVvc3JjcGFkKQorICAgICAgICAgICAgKmRlc3RfdmFsdWUgPSBzcmNfdmFsdWUgLyBkdmRlbXV4LT5mcmFtZV9sZW47CisgICAgICAgICAgZWxzZSBpZiAocGFkID09IGR2ZGVtdXgtPmF1ZGlvc3JjcGFkKQorICAgICAgICAgICAgKmRlc3RfdmFsdWUgPSBzcmNfdmFsdWUgLyAoMiAqIGR2ZGVtdXgtPmNoYW5uZWxzKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6CisgICAgICAgICAgaWYgKHBhZCA9PSBkdmRlbXV4LT52aWRlb3NyY3BhZCkKKyAgICAgICAgICAgICpkZXN0X3ZhbHVlID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzcmNfdmFsdWUsCisgICAgICAgICAgICAgICAgR1NUX1NFQ09ORCAqIGR2ZGVtdXgtPmZyYW1lcmF0ZV9kZW5vbWluYXRvciwKKyAgICAgICAgICAgICAgICBkdmRlbXV4LT5mcmFtZV9sZW4gKiBkdmRlbXV4LT5mcmFtZXJhdGVfbnVtZXJhdG9yKTsKKyAgICAgICAgICBlbHNlIGlmIChwYWQgPT0gZHZkZW11eC0+YXVkaW9zcmNwYWQpCisgICAgICAgICAgICAqZGVzdF92YWx1ZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHNyY192YWx1ZSwgR1NUX1NFQ09ORCwKKyAgICAgICAgICAgICAgICAyICogZHZkZW11eC0+ZnJlcXVlbmN5ICogZHZkZW11eC0+Y2hhbm5lbHMpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6CisgICAgICBzd2l0Y2ggKGRlc3RfZm9ybWF0KSB7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9CWVRFUzoKKyAgICAgICAgICBpZiAocGFkID09IGR2ZGVtdXgtPnZpZGVvc3JjcGFkKQorICAgICAgICAgICAgKmRlc3RfdmFsdWUgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHNyY192YWx1ZSwKKyAgICAgICAgICAgICAgICBkdmRlbXV4LT5mcmFtZV9sZW4gKiBkdmRlbXV4LT5mcmFtZXJhdGVfbnVtZXJhdG9yLAorICAgICAgICAgICAgICAgIGR2ZGVtdXgtPmZyYW1lcmF0ZV9kZW5vbWluYXRvciAqIEdTVF9TRUNPTkQpOworICAgICAgICAgIGVsc2UgaWYgKHBhZCA9PSBkdmRlbXV4LT5hdWRpb3NyY3BhZCkKKyAgICAgICAgICAgICpkZXN0X3ZhbHVlID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoc3JjX3ZhbHVlLAorICAgICAgICAgICAgICAgIDIgKiBkdmRlbXV4LT5mcmVxdWVuY3kgKiBkdmRlbXV4LT5jaGFubmVscywgR1NUX1NFQ09ORCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICAgIGlmIChwYWQgPT0gZHZkZW11eC0+dmlkZW9zcmNwYWQpIHsKKyAgICAgICAgICAgIGlmIChzcmNfdmFsdWUpCisgICAgICAgICAgICAgICpkZXN0X3ZhbHVlID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzcmNfdmFsdWUsCisgICAgICAgICAgICAgICAgICBkdmRlbXV4LT5mcmFtZXJhdGVfbnVtZXJhdG9yLAorICAgICAgICAgICAgICAgICAgZHZkZW11eC0+ZnJhbWVyYXRlX2Rlbm9taW5hdG9yICogR1NUX1NFQ09ORCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICpkZXN0X3ZhbHVlID0gMDsKKyAgICAgICAgICB9IGVsc2UgaWYgKHBhZCA9PSBkdmRlbXV4LT5hdWRpb3NyY3BhZCkgeworICAgICAgICAgICAgKmRlc3RfdmFsdWUgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHNyY192YWx1ZSwKKyAgICAgICAgICAgICAgICBkdmRlbXV4LT5mcmVxdWVuY3ksIEdTVF9TRUNPTkQpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgc3dpdGNoIChkZXN0X2Zvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfVElNRToKKyAgICAgICAgICBpZiAocGFkID09IGR2ZGVtdXgtPnZpZGVvc3JjcGFkKSB7CisgICAgICAgICAgICAqZGVzdF92YWx1ZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoc3JjX3ZhbHVlLAorICAgICAgICAgICAgICAgIEdTVF9TRUNPTkQgKiBkdmRlbXV4LT5mcmFtZXJhdGVfZGVub21pbmF0b3IsCisgICAgICAgICAgICAgICAgZHZkZW11eC0+ZnJhbWVyYXRlX251bWVyYXRvcik7CisgICAgICAgICAgfSBlbHNlIGlmIChwYWQgPT0gZHZkZW11eC0+YXVkaW9zcmNwYWQpIHsKKyAgICAgICAgICAgIGlmIChzcmNfdmFsdWUpCisgICAgICAgICAgICAgICpkZXN0X3ZhbHVlID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzcmNfdmFsdWUsCisgICAgICAgICAgICAgICAgICBHU1RfU0VDT05ELCBkdmRlbXV4LT5mcmVxdWVuY3kpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAqZGVzdF92YWx1ZSA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfQllURVM6CisgICAgICAgICAgaWYgKHBhZCA9PSBkdmRlbXV4LT52aWRlb3NyY3BhZCkgeworICAgICAgICAgICAgKmRlc3RfdmFsdWUgPSBzcmNfdmFsdWUgKiBkdmRlbXV4LT5mcmFtZV9sZW47CisgICAgICAgICAgfSBlbHNlIGlmIChwYWQgPT0gZHZkZW11eC0+YXVkaW9zcmNwYWQpIHsKKyAgICAgICAgICAgICpkZXN0X3ZhbHVlID0gc3JjX3ZhbHVlICogMiAqIGR2ZGVtdXgtPmNoYW5uZWxzOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBGQUxTRTsKKyAgfQorCitkb25lOgorICBHU1RfSU5GT19PQkpFQ1QgKHBhZCwKKyAgICAgICJSZXN1bHQgOiBkZXN0X2Zvcm1hdDolZCwgZGVzdF92YWx1ZTolIiBHX0dJTlQ2NF9GT1JNQVQgIiwgcmVzOiVkIiwKKyAgICAgIGRlc3RfZm9ybWF0LCAqZGVzdF92YWx1ZSwgcmVzKTsKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK2Vycm9yOgorICB7CisgICAgR1NUX0lORk8gKCJzb3VyY2UgY29udmVyc2lvbiBmYWlsZWQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZHZkZW11eF9zaW5rX2NvbnZlcnQgKEdzdERWRGVtdXggKiBkdmRlbXV4LCBHc3RGb3JtYXQgc3JjX2Zvcm1hdCwKKyAgICBnaW50NjQgc3JjX3ZhbHVlLCBHc3RGb3JtYXQgZGVzdF9mb3JtYXQsIGdpbnQ2NCAqIGRlc3RfdmFsdWUpCit7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZHZkZW11eCwgIiVkIC0+ICVkIiwgc3JjX2Zvcm1hdCwgZGVzdF9mb3JtYXQpOworICBHU1RfSU5GT19PQkpFQ1QgKGR2ZGVtdXgsCisgICAgICAic3JjX3ZhbHVlOiUiIEdfR0lOVDY0X0ZPUk1BVCAiLCBzcmNfZm9ybWF0OiVkLCBkZXN0X2Zvcm1hdDolZCIsCisgICAgICBzcmNfdmFsdWUsIHNyY19mb3JtYXQsIGRlc3RfZm9ybWF0KTsKKworICBpZiAoZGVzdF9mb3JtYXQgPT0gc3JjX2Zvcm1hdCB8fCBzcmNfdmFsdWUgPT0gLTEpIHsKKyAgICAqZGVzdF92YWx1ZSA9IHNyY192YWx1ZTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBpZiAoZHZkZW11eC0+ZnJhbWVfbGVuIDw9IDApCisgICAgZ290byBlcnJvcjsKKworICBzd2l0Y2ggKHNyY19mb3JtYXQpIHsKKyAgICBjYXNlIEdTVF9GT1JNQVRfQllURVM6CisgICAgICBzd2l0Y2ggKGRlc3RfZm9ybWF0KSB7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9USU1FOgorICAgICAgICB7CisgICAgICAgICAgZ3VpbnQ2NCBmcmFtZTsKKworICAgICAgICAgIC8qIGdldCBmcmFtZSBudW1iZXIsIHJvdW5kcyBkb3duIHNvIGRvbid0IGNvbWJpbmUgdGhpcworICAgICAgICAgICAqIGxpbmUgYW5kIHRoZSBuZXh0IGxpbmUuICovCisgICAgICAgICAgZnJhbWUgPSBzcmNfdmFsdWUgLyBkdmRlbXV4LT5mcmFtZV9sZW47CisKKyAgICAgICAgICAqZGVzdF92YWx1ZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoZnJhbWUsCisgICAgICAgICAgICAgIEdTVF9TRUNPTkQgKiBkdmRlbXV4LT5mcmFtZXJhdGVfZGVub21pbmF0b3IsCisgICAgICAgICAgICAgIGR2ZGVtdXgtPmZyYW1lcmF0ZV9udW1lcmF0b3IpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9GT1JNQVRfVElNRToKKyAgICAgIHN3aXRjaCAoZGVzdF9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0JZVEVTOgorICAgICAgICB7CisgICAgICAgICAgZ3VpbnQ2NCBmcmFtZTsKKworICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgZnJhbWUgKi8KKyAgICAgICAgICBmcmFtZSA9CisgICAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoc3JjX3ZhbHVlLCBkdmRlbXV4LT5mcmFtZXJhdGVfbnVtZXJhdG9yLAorICAgICAgICAgICAgICBkdmRlbXV4LT5mcmFtZXJhdGVfZGVub21pbmF0b3IgKiBHU1RfU0VDT05EKTsKKworICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZyb20gdGhlIHJvdW5kZWQgZnJhbWUgKi8KKyAgICAgICAgICAqZGVzdF92YWx1ZSA9IGZyYW1lICogZHZkZW11eC0+ZnJhbWVfbGVuOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gRkFMU0U7CisgIH0KKyAgR1NUX0lORk9fT0JKRUNUIChkdmRlbXV4LAorICAgICAgIlJlc3VsdCA6IGRlc3RfZm9ybWF0OiVkLCBkZXN0X3ZhbHVlOiUiIEdfR0lOVDY0X0ZPUk1BVCAiLCByZXM6JWQiLAorICAgICAgZGVzdF9mb3JtYXQsICpkZXN0X3ZhbHVlLCByZXMpOworCitkb25lOgorICByZXR1cm4gcmVzOworCitlcnJvcjoKKyAgeworICAgIEdTVF9JTkZPX09CSkVDVCAoZHZkZW11eCwgInNpbmsgY29udmVyc2lvbiBmYWlsZWQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZHZkZW11eF9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnYm9vbGVhbiByZXMgPSBUUlVFOworICBHc3REVkRlbXV4ICpkdmRlbXV4OworCisgIGR2ZGVtdXggPSBHU1RfRFZERU1VWCAocGFyZW50KTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9QT1NJVElPTjoKKyAgICB7CisgICAgICBHc3RGb3JtYXQgZm9ybWF0OworICAgICAgZ2ludDY0IGN1cjsKKworICAgICAgLyogZ2V0IHRhcmdldCBmb3JtYXQgKi8KKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9wb3NpdGlvbiAocXVlcnksICZmb3JtYXQsIE5VTEwpOworCisgICAgICAvKiBicmluZyB0aGUgcG9zaXRpb24gdG8gdGhlIHJlcXVlc3RlZCBmb3JtYXQuICovCisgICAgICBpZiAoIShyZXMgPSBnc3RfZHZkZW11eF9zcmNfY29udmVydCAoZHZkZW11eCwgcGFkLAorICAgICAgICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBkdmRlbXV4LT50aW1lX3NlZ21lbnQucG9zaXRpb24sCisgICAgICAgICAgICAgICAgICBmb3JtYXQsICZjdXIpKSkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIGdzdF9xdWVyeV9zZXRfcG9zaXRpb24gKHF1ZXJ5LCBmb3JtYXQsIGN1cik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfRFVSQVRJT046CisgICAgeworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgICAgIGdpbnQ2NCBlbmQ7CisgICAgICBHc3RRdWVyeSAqcHF1ZXJ5OworCisgICAgICAvKiBGaXJzdCBhc2sgdGhlIHBlZXIgaW4gdGhlIG9yaWdpbmFsIGZvcm1hdCAqLworICAgICAgaWYgKCFnc3RfcGFkX3BlZXJfcXVlcnkgKGR2ZGVtdXgtPnNpbmtwYWQsIHF1ZXJ5KSkgeworICAgICAgICAvKiBnZXQgdGFyZ2V0IGZvcm1hdCAqLworICAgICAgICBnc3RfcXVlcnlfcGFyc2VfZHVyYXRpb24gKHF1ZXJ5LCAmZm9ybWF0LCBOVUxMKTsKKworICAgICAgICAvKiBOb3cgYXNrIHRoZSBwZWVyIGluIEJZVEVTIGZvcm1hdCBhbmQgdHJ5IHRvIGNvbnZlcnQgKi8KKyAgICAgICAgcHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19kdXJhdGlvbiAoR1NUX0ZPUk1BVF9CWVRFUyk7CisgICAgICAgIGlmICghZ3N0X3BhZF9wZWVyX3F1ZXJ5IChkdmRlbXV4LT5zaW5rcGFkLCBwcXVlcnkpKSB7CisgICAgICAgICAgZ3N0X3F1ZXJ5X3VucmVmIChwcXVlcnkpOworICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICAvKiBnZXQgcGVlciB0b3RhbCBsZW5ndGggKi8KKyAgICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2R1cmF0aW9uIChwcXVlcnksIE5VTEwsICZlbmQpOworICAgICAgICBnc3RfcXVlcnlfdW5yZWYgKHBxdWVyeSk7CisKKyAgICAgICAgLyogY29udmVydCBlbmQgdG8gcmVxdWVzdGVkIGZvcm1hdCAqLworICAgICAgICBpZiAoZW5kICE9IC0xKSB7CisgICAgICAgICAgaWYgKCEocmVzID0gZ3N0X2R2ZGVtdXhfc2lua19jb252ZXJ0IChkdmRlbXV4LAorICAgICAgICAgICAgICAgICAgICAgIEdTVF9GT1JNQVRfQllURVMsIGVuZCwgZm9ybWF0LCAmZW5kKSkpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF9xdWVyeV9zZXRfZHVyYXRpb24gKHF1ZXJ5LCBmb3JtYXQsIGVuZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9DT05WRVJUOgorICAgIHsKKyAgICAgIEdzdEZvcm1hdCBzcmNfZm10LCBkZXN0X2ZtdDsKKyAgICAgIGdpbnQ2NCBzcmNfdmFsLCBkZXN0X3ZhbDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2NvbnZlcnQgKHF1ZXJ5LCAmc3JjX2ZtdCwgJnNyY192YWwsICZkZXN0X2ZtdCwgJmRlc3RfdmFsKTsKKyAgICAgIGlmICghKHJlcyA9CisgICAgICAgICAgICAgIGdzdF9kdmRlbXV4X3NyY19jb252ZXJ0IChkdmRlbXV4LCBwYWQsIHNyY19mbXQsIHNyY192YWwsCisgICAgICAgICAgICAgICAgICBkZXN0X2ZtdCwgJmRlc3RfdmFsKSkpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICBnc3RfcXVlcnlfc2V0X2NvbnZlcnQgKHF1ZXJ5LCBzcmNfZm10LCBzcmNfdmFsLCBkZXN0X2ZtdCwgZGVzdF92YWwpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX1NFRUtJTkc6CisgICAgeworICAgICAgR3N0Rm9ybWF0IGZtdDsKKyAgICAgIEdzdFF1ZXJ5ICpwZWVycXVlcnk7CisgICAgICBnYm9vbGVhbiBzZWVrYWJsZTsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3NlZWtpbmcgKHF1ZXJ5LCAmZm10LCBOVUxMLCBOVUxMLCBOVUxMKTsKKworICAgICAgLyogV2UgY2FuIG9ubHkgaGFuZGxlIFRJTUUgc2Vla3MgcmVhbGx5ICovCisgICAgICBpZiAoZm10ICE9IEdTVF9GT1JNQVRfVElNRSkgeworICAgICAgICBnc3RfcXVlcnlfc2V0X3NlZWtpbmcgKHF1ZXJ5LCBmbXQsIEZBTFNFLCAtMSwgLTEpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLyogRmlyc3QgYXNrIHVwc3RyZWFtICovCisgICAgICBpZiAoZ3N0X3BhZF9wZWVyX3F1ZXJ5IChkdmRlbXV4LT5zaW5rcGFkLCBxdWVyeSkpIHsKKyAgICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3NlZWtpbmcgKHF1ZXJ5LCBOVUxMLCAmc2Vla2FibGUsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoc2Vla2FibGUpIHsKKyAgICAgICAgICByZXMgPSBUUlVFOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJlcyA9IFRSVUU7CisKKyAgICAgIHBlZXJxdWVyeSA9IGdzdF9xdWVyeV9uZXdfc2Vla2luZyAoR1NUX0ZPUk1BVF9CWVRFUyk7CisgICAgICBzZWVrYWJsZSA9IGdzdF9wYWRfcGVlcl9xdWVyeSAoZHZkZW11eC0+c2lua3BhZCwgcGVlcnF1ZXJ5KTsKKworICAgICAgaWYgKHNlZWthYmxlKQorICAgICAgICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocGVlcnF1ZXJ5LCBOVUxMLCAmc2Vla2FibGUsIE5VTEwsIE5VTEwpOworICAgICAgZ3N0X3F1ZXJ5X3VucmVmIChwZWVycXVlcnkpOworCisgICAgICBpZiAoc2Vla2FibGUpIHsKKyAgICAgICAgcGVlcnF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19kdXJhdGlvbiAoR1NUX0ZPUk1BVF9USU1FKTsKKyAgICAgICAgc2Vla2FibGUgPSBnc3RfZHZkZW11eF9zcmNfcXVlcnkgKHBhZCwgcGFyZW50LCBwZWVycXVlcnkpOworCisgICAgICAgIGlmIChzZWVrYWJsZSkgeworICAgICAgICAgIGdpbnQ2NCBkdXJhdGlvbjsKKworICAgICAgICAgIGdzdF9xdWVyeV9wYXJzZV9kdXJhdGlvbiAocGVlcnF1ZXJ5LCBOVUxMLCAmZHVyYXRpb24pOworICAgICAgICAgIGdzdF9xdWVyeV9zZXRfc2Vla2luZyAocXVlcnksIEdTVF9GT1JNQVRfVElNRSwgc2Vla2FibGUsIDAsIGR1cmF0aW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnc3RfcXVlcnlfc2V0X3NlZWtpbmcgKHF1ZXJ5LCBHU1RfRk9STUFUX1RJTUUsIEZBTFNFLCAtMSwgLTEpOworICAgICAgICB9CisKKyAgICAgICAgZ3N0X3F1ZXJ5X3VucmVmIChwZWVycXVlcnkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ3N0X3F1ZXJ5X3NldF9zZWVraW5nIChxdWVyeSwgR1NUX0ZPUk1BVF9USU1FLCBGQUxTRSwgLTEsIC0xKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworZXJyb3I6CisgIHsKKyAgICBHU1RfREVCVUcgKCJlcnJvciBzb3VyY2UgcXVlcnkiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZHZkZW11eF9zaW5rX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgZ2Jvb2xlYW4gcmVzID0gVFJVRTsKKyAgR3N0RFZEZW11eCAqZHZkZW11eDsKKworICBkdmRlbXV4ID0gR1NUX0RWREVNVVggKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQ09OVkVSVDoKKyAgICB7CisgICAgICBHc3RGb3JtYXQgc3JjX2ZtdCwgZGVzdF9mbXQ7CisgICAgICBnaW50NjQgc3JjX3ZhbCwgZGVzdF92YWw7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9jb252ZXJ0IChxdWVyeSwgJnNyY19mbXQsICZzcmNfdmFsLCAmZGVzdF9mbXQsICZkZXN0X3ZhbCk7CisgICAgICBpZiAoIShyZXMgPQorICAgICAgICAgICAgICBnc3RfZHZkZW11eF9zaW5rX2NvbnZlcnQgKGR2ZGVtdXgsIHNyY19mbXQsIHNyY192YWwsIGRlc3RfZm10LAorICAgICAgICAgICAgICAgICAgJmRlc3RfdmFsKSkpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICBnc3RfcXVlcnlfc2V0X2NvbnZlcnQgKHF1ZXJ5LCBzcmNfZm10LCBzcmNfdmFsLCBkZXN0X2ZtdCwgZGVzdF92YWwpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBnc3RfcGFkX3F1ZXJ5X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitlcnJvcjoKKyAgeworICAgIEdTVF9ERUJVRyAoImVycm9yIGhhbmRsaW5nIHNpbmsgcXVlcnkiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBldmVudCAqLworc3RhdGljIGdib29sZWFuCitnc3RfZHZkZW11eF9wdXNoX2V2ZW50IChHc3REVkRlbXV4ICogZHZkZW11eCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgaWYgKGR2ZGVtdXgtPnZpZGVvc3JjcGFkKSB7CisgICAgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpOworICAgIHJlcyB8PSBnc3RfcGFkX3B1c2hfZXZlbnQgKGR2ZGVtdXgtPnZpZGVvc3JjcGFkLCBldmVudCk7CisgIH0KKworICBpZiAoZHZkZW11eC0+YXVkaW9zcmNwYWQpCisgICAgcmVzIHw9IGdzdF9wYWRfcHVzaF9ldmVudCAoZHZkZW11eC0+YXVkaW9zcmNwYWQsIGV2ZW50KTsKKyAgZWxzZSB7CisgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgcmVzID0gVFJVRTsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2R2ZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdERWRGVtdXggKmR2ZGVtdXggPSBHU1RfRFZERU1VWCAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmVzID0gVFJVRTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVEFSVDoKKyAgICAgIC8qIHdlIGFyZSBub3QgYmxvY2tpbmcgb24gYW55dGhpbmcgZXhlY3QgdGhlIHB1c2goKSBjYWxscworICAgICAgICogdG8gdGhlIHBlZXIgd2hpY2ggd2lsbCBiZSB1bmJsb2NrZWQgYnkgZm9yd2FyZGluZyB0aGUKKyAgICAgICAqIGV2ZW50LiovCisgICAgICByZXMgPSBnc3RfZHZkZW11eF9wdXNoX2V2ZW50IChkdmRlbXV4LCBldmVudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGR2ZGVtdXgtPmFkYXB0ZXIpOworICAgICAgR1NUX0RFQlVHICgiY2xlYXJlZCBhZGFwdGVyIik7CisgICAgICBnc3Rfc2VnbWVudF9pbml0ICgmZHZkZW11eC0+Ynl0ZV9zZWdtZW50LCBHU1RfRk9STUFUX0JZVEVTKTsKKyAgICAgIGdzdF9zZWdtZW50X2luaXQgKCZkdmRlbXV4LT50aW1lX3NlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgICAgICBkdmRlbXV4LT5kaXNjb250ID0gVFJVRTsKKyAgICAgIHJlcyA9IGdzdF9kdmRlbXV4X3B1c2hfZXZlbnQgKGR2ZGVtdXgsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6CisgICAgeworICAgICAgY29uc3QgR3N0U2VnbWVudCAqc2VnbWVudDsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3NlZ21lbnQgKGV2ZW50LCAmc2VnbWVudCk7CisgICAgICBzd2l0Y2ggKHNlZ21lbnQtPmZvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfQllURVM6CisgICAgICAgICAgZ3N0X3NlZ21lbnRfY29weV9pbnRvIChzZWdtZW50LCAmZHZkZW11eC0+Ynl0ZV9zZWdtZW50KTsKKyAgICAgICAgICBkdmRlbXV4LT5uZWVkX3NlZ21lbnQgPSBUUlVFOworICAgICAgICAgIGR2ZGVtdXgtPnNlZ21lbnRfc2VxbnVtID0gZ3N0X2V2ZW50X2dldF9zZXFudW0gKGV2ZW50KTsKKyAgICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6CisgICAgICAgICAgZ3N0X3NlZ21lbnRfY29weV9pbnRvIChzZWdtZW50LCAmZHZkZW11eC0+dGltZV9zZWdtZW50KTsKKworICAgICAgICAgIGR2ZGVtdXgtPnVwc3RyZWFtX3RpbWVfc2VnbWVudCA9IFRSVUU7CisgICAgICAgICAgZHZkZW11eC0+c2VnbWVudF9zZXFudW0gPSBnc3RfZXZlbnRfZ2V0X3NlcW51bSAoZXZlbnQpOworCisgICAgICAgICAgLyogYW5kIHdlIGNhbiBqdXN0IGZvcndhcmQgdGhpcyB0aW1lIGV2ZW50ICovCisgICAgICAgICAgcmVzID0gZ3N0X2R2ZGVtdXhfcHVzaF9ldmVudCAoZHZkZW11eCwgZXZlbnQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgICAgIC8qIGNhbm5vdCBhY2NlcHQgdGhpcyBmb3JtYXQgKi8KKyAgICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgICAvKiBmbHVzaCBhbnkgcGVuZGluZyBkYXRhLCBzaG91bGQgYmUgbm90aGluZyBsZWZ0LiAqLworICAgICAgZ3N0X2R2ZGVtdXhfZmx1c2ggKGR2ZGVtdXgpOworICAgICAgLyogZm9yd2FyZCBldmVudCAqLworICAgICAgcmVzID0gZ3N0X2R2ZGVtdXhfcHVzaF9ldmVudCAoZHZkZW11eCwgZXZlbnQpOworICAgICAgLyogYW5kIGNsZWFyIHRoZSBhZGFwdGVyICovCisgICAgICBnc3RfYWRhcHRlcl9jbGVhciAoZHZkZW11eC0+YWRhcHRlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9DQVBTOgorICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X2R2ZGVtdXhfcHVzaF9ldmVudCAoZHZkZW11eCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCisvKiBjb252ZXJ0IGEgcGFpciBvZiB2YWx1ZXMgb24gdGhlIGdpdmVuIHNyY3BhZCAqLworc3RhdGljIGdib29sZWFuCitnc3RfZHZkZW11eF9jb252ZXJ0X3NyY19wYWlyIChHc3REVkRlbXV4ICogZHZkZW11eCwgR3N0UGFkICogcGFkLAorICAgIEdzdEZvcm1hdCBzcmNfZm9ybWF0LCBnaW50NjQgc3JjX3N0YXJ0LCBnaW50NjQgc3JjX3N0b3AsCisgICAgR3N0Rm9ybWF0IGRzdF9mb3JtYXQsIGdpbnQ2NCAqIGRzdF9zdGFydCwgZ2ludDY0ICogZHN0X3N0b3ApCit7CisgIGdib29sZWFuIHJlczsKKworICBHU1RfSU5GTyAoInN0YXJ0aW5nIGNvbnZlcnNpb24gb2Ygc3RhcnQiKTsKKyAgLyogYnJpbmcgdGhlIGZvcm1hdCB0byB0aW1lIG9uIHNyY3BhZC4gKi8KKyAgaWYgKCEocmVzID0gZ3N0X2R2ZGVtdXhfc3JjX2NvbnZlcnQgKGR2ZGVtdXgsIHBhZCwKKyAgICAgICAgICAgICAgc3JjX2Zvcm1hdCwgc3JjX3N0YXJ0LCBkc3RfZm9ybWF0LCBkc3Rfc3RhcnQpKSkgeworICAgIGdvdG8gZG9uZTsKKyAgfQorICBHU1RfSU5GTyAoIkZpbmlzaGVkIGNvbnZlcnNpb24gb2Ygc3RhcnQ6ICUiIEdfR0lOVDY0X0ZPUk1BVCwgKmRzdF9zdGFydCk7CisKKyAgR1NUX0lORk8gKCJzdGFydGluZyBjb252ZXJzaW9uIG9mIHN0b3AiKTsKKyAgLyogYnJpbmcgdGhlIGZvcm1hdCB0byB0aW1lIG9uIHNyY3BhZC4gKi8KKyAgaWYgKCEocmVzID0gZ3N0X2R2ZGVtdXhfc3JjX2NvbnZlcnQgKGR2ZGVtdXgsIHBhZCwKKyAgICAgICAgICAgICAgc3JjX2Zvcm1hdCwgc3JjX3N0b3AsIGRzdF9mb3JtYXQsIGRzdF9zdG9wKSkpIHsKKyAgICAvKiBjb3VsZCBub3QgY29udmVydCBzZWVrIGZvcm1hdCB0byB0aW1lIG9mZnNldCAqLworICAgIGdvdG8gZG9uZTsKKyAgfQorICBHU1RfSU5GTyAoIkZpbmlzaGVkIGNvbnZlcnNpb24gb2Ygc3RvcDogJSIgR19HSU5UNjRfRk9STUFULCAqZHN0X3N0b3ApOworZG9uZToKKyAgcmV0dXJuIHJlczsKK30KKworLyogY29udmVydCBhIHBhaXIgb2YgdmFsdWVzIG9uIHRoZSBzaW5rcGFkICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdmRlbXV4X2NvbnZlcnRfc2lua19wYWlyIChHc3REVkRlbXV4ICogZHZkZW11eCwKKyAgICBHc3RGb3JtYXQgc3JjX2Zvcm1hdCwgZ2ludDY0IHNyY19zdGFydCwgZ2ludDY0IHNyY19zdG9wLAorICAgIEdzdEZvcm1hdCBkc3RfZm9ybWF0LCBnaW50NjQgKiBkc3Rfc3RhcnQsIGdpbnQ2NCAqIGRzdF9zdG9wKQoreworICBnYm9vbGVhbiByZXM7CisKKyAgR1NUX0lORk8gKCJzdGFydGluZyBjb252ZXJzaW9uIG9mIHN0YXJ0Iik7CisgIC8qIGJyaW5nIHRoZSBmb3JtYXQgdG8gdGltZSBvbiBzcmNwYWQuICovCisgIGlmICghKHJlcyA9IGdzdF9kdmRlbXV4X3NpbmtfY29udmVydCAoZHZkZW11eCwKKyAgICAgICAgICAgICAgc3JjX2Zvcm1hdCwgc3JjX3N0YXJ0LCBkc3RfZm9ybWF0LCBkc3Rfc3RhcnQpKSkgeworICAgIGdvdG8gZG9uZTsKKyAgfQorICBHU1RfSU5GTyAoIkZpbmlzaGVkIGNvbnZlcnNpb24gb2Ygc3RhcnQ6ICUiIEdfR0lOVDY0X0ZPUk1BVCwgKmRzdF9zdGFydCk7CisKKyAgR1NUX0lORk8gKCJzdGFydGluZyBjb252ZXJzaW9uIG9mIHN0b3AiKTsKKyAgLyogYnJpbmcgdGhlIGZvcm1hdCB0byB0aW1lIG9uIHNyY3BhZC4gKi8KKyAgaWYgKCEocmVzID0gZ3N0X2R2ZGVtdXhfc2lua19jb252ZXJ0IChkdmRlbXV4LAorICAgICAgICAgICAgICBzcmNfZm9ybWF0LCBzcmNfc3RvcCwgZHN0X2Zvcm1hdCwgZHN0X3N0b3ApKSkgeworICAgIC8qIGNvdWxkIG5vdCBjb252ZXJ0IHNlZWsgZm9ybWF0IHRvIHRpbWUgb2Zmc2V0ICovCisgICAgZ290byBkb25lOworICB9CisgIEdTVF9JTkZPICgiRmluaXNoZWQgY29udmVyc2lvbiBvZiBzdG9wOiAlIiBHX0dJTlQ2NF9GT1JNQVQsICpkc3Rfc3RvcCk7Citkb25lOgorICByZXR1cm4gcmVzOworfQorCisvKiBjb252ZXJ0IGEgcGFpciBvZiB2YWx1ZXMgb24gdGhlIHNyY3BhZCB0byBhIHBhaXIgb2YKKyAqIHZhbHVlcyBvbiB0aGUgc2lua3BhZCAKKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfZHZkZW11eF9jb252ZXJ0X3NyY190b19zaW5rIChHc3REVkRlbXV4ICogZHZkZW11eCwgR3N0UGFkICogcGFkLAorICAgIEdzdEZvcm1hdCBzcmNfZm9ybWF0LCBnaW50NjQgc3JjX3N0YXJ0LCBnaW50NjQgc3JjX3N0b3AsCisgICAgR3N0Rm9ybWF0IGRzdF9mb3JtYXQsIGdpbnQ2NCAqIGRzdF9zdGFydCwgZ2ludDY0ICogZHN0X3N0b3ApCit7CisgIEdzdEZvcm1hdCBjb252OworICBnYm9vbGVhbiByZXM7CisKKyAgY29udiA9IEdTVF9GT1JNQVRfVElNRTsKKyAgLyogY29udmVydCB0byBUSU1FIGludGVybWVkaWF0ZSBmb3JtYXQgKi8KKyAgaWYgKCEocmVzID0gZ3N0X2R2ZGVtdXhfY29udmVydF9zcmNfcGFpciAoZHZkZW11eCwgcGFkLAorICAgICAgICAgICAgICBzcmNfZm9ybWF0LCBzcmNfc3RhcnQsIHNyY19zdG9wLCBjb252LCBkc3Rfc3RhcnQsIGRzdF9zdG9wKSkpIHsKKyAgICAvKiBjb3VsZCBub3QgY29udmVydCBmb3JtYXQgdG8gdGltZSBvZmZzZXQgKi8KKyAgICBnb3RvIGRvbmU7CisgIH0KKyAgLyogY29udmVydCB0byBkc3QgZm9ybWF0IG9uIHNpbmtwYWQgKi8KKyAgaWYgKCEocmVzID0gZ3N0X2R2ZGVtdXhfY29udmVydF9zaW5rX3BhaXIgKGR2ZGVtdXgsCisgICAgICAgICAgICAgIGNvbnYsICpkc3Rfc3RhcnQsICpkc3Rfc3RvcCwgZHN0X2Zvcm1hdCwgZHN0X3N0YXJ0LCBkc3Rfc3RvcCkpKSB7CisgICAgLyogY291bGQgbm90IGNvbnZlcnQgZm9ybWF0IHRvIHRpbWUgb2Zmc2V0ICovCisgICAgZ290byBkb25lOworICB9Citkb25lOgorICByZXR1cm4gcmVzOworfQorCisjaWYgMAorc3RhdGljIGdib29sZWFuCitnc3RfZHZkZW11eF9jb252ZXJ0X3NlZ21lbnQgKEdzdERWRGVtdXggKiBkdmRlbXV4LCBHc3RTZWdtZW50ICogc3JjLAorICAgIEdzdFNlZ21lbnQgKiBkZXN0KQoreworICBkZXN0LT5yYXRlID0gc3JjLT5yYXRlOworICBkZXN0LT5hYnNfcmF0ZSA9IHNyYy0+YWJzX3JhdGU7CisgIGRlc3QtPmZsYWdzID0gc3JjLT5mbGFnczsKKworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCisvKiBoYW5kbGUgc2VlayBpbiBwdXNoIGJhc2UgbW9kZS4KKyAqCisgKiBDb252ZXJ0IHRoZSB0aW1lIHNlZWsgdG8gYSBieXRlcyBzZWVrIGFuZCBzZW5kIGl0CisgKiB1cHN0cmVhbQorICogRG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIGV2ZW50LgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdmRlbXV4X2hhbmRsZV9wdXNoX3NlZWsgKEdzdERWRGVtdXggKiBkdmRlbXV4LCBHc3RQYWQgKiBwYWQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisgIGdkb3VibGUgcmF0ZTsKKyAgR3N0U2Vla0ZsYWdzIGZsYWdzOworICBHc3RGb3JtYXQgZm9ybWF0OworICBHc3RTZWVrVHlwZSBjdXJfdHlwZSwgc3RvcF90eXBlOworICBnaW50NjQgY3VyLCBzdG9wOworICBnaW50NjQgc3RhcnRfcG9zaXRpb24sIGVuZF9wb3NpdGlvbjsKKyAgR3N0RXZlbnQgKm5ld2V2ZW50OworCisgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgJnJhdGUsICZmb3JtYXQsICZmbGFncywKKyAgICAgICZjdXJfdHlwZSwgJmN1ciwgJnN0b3BfdHlwZSwgJnN0b3ApOworCisgIC8qIEZpcnN0IHRyeSBpZiB1cHN0cmVhbSBjYW4gaGFuZGxlIHRpbWUgYmFzZWQgc2Vla3MgKi8KKyAgaWYgKGZvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUpCisgICAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChkdmRlbXV4LT5zaW5rcGFkLCBnc3RfZXZlbnRfcmVmIChldmVudCkpOworCisgIGlmICghcmVzKSB7CisgICAgLyogd2UgY29udmVydCB0aGUgc3RhcnQvc3RvcCBvbiB0aGUgc3JjcGFkIHRvIHRoZSBieXRlIGZvcm1hdAorICAgICAqIG9uIHRoZSBzaW5rcGFkIGFuZCBmb3J3YXJkIHRoZSBldmVudCAqLworICAgIHJlcyA9IGdzdF9kdmRlbXV4X2NvbnZlcnRfc3JjX3RvX3NpbmsgKGR2ZGVtdXgsIHBhZCwKKyAgICAgICAgZm9ybWF0LCBjdXIsIHN0b3AsIEdTVF9GT1JNQVRfQllURVMsICZzdGFydF9wb3NpdGlvbiwgJmVuZF9wb3NpdGlvbik7CisgICAgaWYgKCFyZXMpCisgICAgICBnb3RvIGRvbmU7CisKKyAgICAvKiBub3cgdGhpcyBpcyB0aGUgdXBkYXRlZCBzZWVrIGV2ZW50IG9uIGJ5dGVzICovCisgICAgbmV3ZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZWsgKHJhdGUsIEdTVF9GT1JNQVRfQllURVMsIGZsYWdzLAorICAgICAgICBjdXJfdHlwZSwgc3RhcnRfcG9zaXRpb24sIHN0b3BfdHlwZSwgZW5kX3Bvc2l0aW9uKTsKKyAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAobmV3ZXZlbnQsIGdzdF9ldmVudF9nZXRfc2VxbnVtIChldmVudCkpOworCisgICAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChkdmRlbXV4LT5zaW5rcGFkLCBuZXdldmVudCk7CisgIH0KK2RvbmU6CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZHZkZW11eF91cGRhdGVfZnJhbWVfb2Zmc2V0cyAoR3N0RFZEZW11eCAqIGR2ZGVtdXgsIEdzdENsb2NrVGltZSB0aW1lc3RhbXApCit7CisgIC8qIGNhbGN1bGF0ZSBjdXJyZW50IGZyYW1lIG51bWJlciAqLworICBnc3RfZHZkZW11eF9zcmNfY29udmVydCAoZHZkZW11eCwgZHZkZW11eC0+dmlkZW9zcmNwYWQsCisgICAgICBkdmRlbXV4LT50aW1lX3NlZ21lbnQuZm9ybWF0LCB0aW1lc3RhbXAsCisgICAgICBHU1RfRk9STUFUX0RFRkFVTFQsICZkdmRlbXV4LT52aWRlb19vZmZzZXQpOworCisgIC8qIGNhbGN1bGF0ZSBjdXJyZW50IGF1ZGlvIG51bWJlciAqLworICBnc3RfZHZkZW11eF9zcmNfY29udmVydCAoZHZkZW11eCwgZHZkZW11eC0+YXVkaW9zcmNwYWQsCisgICAgICBkdmRlbXV4LT50aW1lX3NlZ21lbnQuZm9ybWF0LCB0aW1lc3RhbXAsCisgICAgICBHU1RfRk9STUFUX0RFRkFVTFQsICZkdmRlbXV4LT5hdWRpb19vZmZzZXQpOworCisgIC8qIGV2ZXJ5IERWIGZyYW1lIGNvcnJlc3BvbnRzIHdpdGggb25lIHZpZGVvIGZyYW1lICovCisgIGR2ZGVtdXgtPmZyYW1lX29mZnNldCA9IGR2ZGVtdXgtPnZpZGVvX29mZnNldDsKK30KKworLyogcG9zaXRpb24gb3Vyc2VsdmVzIHRvIHRoZSBjb25maWd1cmVkIHNlZ21lbnQsIHVzZWQgaW4gcHVsbCBtb2RlLgorICogVGhlIGlucHV0IHNlZ21lbnQgaXMgaW4gVElNRSBmb3JtYXQuIFdlIGNvbnZlcnQgdGhlIHRpbWUgdmFsdWVzCisgKiB0byBieXRlcyB2YWx1ZXMgaW50byBvdXIgYnl0ZV9zZWdtZW50IHdoaWNoIHdlIHVzZSB0byBwdWxsIGRhdGEgZnJvbQorICogdGhlIHNpbmtwYWQgcGVlci4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfZHZkZW11eF9kb19zZWVrIChHc3REVkRlbXV4ICogZGVtdXgsIEdzdFNlZ21lbnQgKiBzZWdtZW50KQoreworICBnYm9vbGVhbiByZXM7CisgIEdzdEZvcm1hdCBmb3JtYXQ7CisKKyAgLyogcG9zaXRpb24gdG8gdmFsdWUgY29uZmlndXJlZCBpcyBsYXN0X3N0b3AsIHRoaXMgd2lsbCByb3VuZCBkb3duCisgICAqIHRvIHRoZSBieXRlIHBvc2l0aW9uIHdoZXJlIHRoZSBmcmFtZSBjb250YWluaW5nIHRoZSBnaXZlbiAKKyAgICogdGltZXN0YW1wIGNhbiBiZSBmb3VuZC4gKi8KKyAgZm9ybWF0ID0gR1NUX0ZPUk1BVF9CWVRFUzsKKyAgcmVzID0gZ3N0X2R2ZGVtdXhfc2lua19jb252ZXJ0IChkZW11eCwKKyAgICAgIHNlZ21lbnQtPmZvcm1hdCwgc2VnbWVudC0+cG9zaXRpb24sCisgICAgICBmb3JtYXQsIChnaW50NjQgKikgJiBkZW11eC0+Ynl0ZV9zZWdtZW50LnBvc2l0aW9uKTsKKyAgaWYgKCFyZXMpCisgICAgZ290byBkb25lOworCisgIC8qIHVwZGF0ZSBieXRlIHNlZ21lbnQgc3RhcnQgKi8KKyAgZ3N0X2R2ZGVtdXhfc2lua19jb252ZXJ0IChkZW11eCwKKyAgICAgIHNlZ21lbnQtPmZvcm1hdCwgc2VnbWVudC0+c3RhcnQsIGZvcm1hdCwKKyAgICAgIChnaW50NjQgKikgJiBkZW11eC0+Ynl0ZV9zZWdtZW50LnN0YXJ0KTsKKworICAvKiB1cGRhdGUgYnl0ZSBzZWdtZW50IHN0b3AgKi8KKyAgZ3N0X2R2ZGVtdXhfc2lua19jb252ZXJ0IChkZW11eCwKKyAgICAgIHNlZ21lbnQtPmZvcm1hdCwgc2VnbWVudC0+c3RvcCwgZm9ybWF0LAorICAgICAgKGdpbnQ2NCAqKSAmIGRlbXV4LT5ieXRlX3NlZ21lbnQuc3RvcCk7CisKKyAgLyogdXBkYXRlIGJ5dGUgc2VnbWVudCB0aW1lICovCisgIGdzdF9kdmRlbXV4X3NpbmtfY29udmVydCAoZGVtdXgsCisgICAgICBzZWdtZW50LT5mb3JtYXQsIHNlZ21lbnQtPnRpbWUsIGZvcm1hdCwKKyAgICAgIChnaW50NjQgKikgJiBkZW11eC0+Ynl0ZV9zZWdtZW50LnRpbWUpOworCisgIGdzdF9kdmRlbXV4X3VwZGF0ZV9mcmFtZV9vZmZzZXRzIChkZW11eCwgc2VnbWVudC0+c3RhcnQpOworCisgIGRlbXV4LT5kaXNjb250ID0gVFJVRTsKKworZG9uZToKKyAgcmV0dXJuIHJlczsKK30KKworLyogaGFuZGxlIHNlZWsgaW4gcHVsbCBiYXNlIG1vZGUuCisgKgorICogRG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIGV2ZW50LgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdmRlbXV4X2hhbmRsZV9wdWxsX3NlZWsgKEdzdERWRGVtdXggKiBkZW11eCwgR3N0UGFkICogcGFkLAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJlczsKKyAgZ2RvdWJsZSByYXRlOworICBHc3RGb3JtYXQgZm9ybWF0OworICBHc3RTZWVrRmxhZ3MgZmxhZ3M7CisgIEdzdFNlZWtUeXBlIGN1cl90eXBlLCBzdG9wX3R5cGU7CisgIGdpbnQ2NCBjdXIsIHN0b3A7CisgIGdib29sZWFuIGZsdXNoOworICBnYm9vbGVhbiB1cGRhdGU7CisgIEdzdFNlZ21lbnQgc2Vla3NlZ21lbnQ7CisgIEdzdEV2ZW50ICpuZXdfZXZlbnQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJkb2luZyBzZWVrIik7CisKKyAgLyogZmlyc3QgYnJpbmcgdGhlIGV2ZW50IGZvcm1hdCB0byBUSU1FLCBvdXIgbmF0aXZlIGZvcm1hdAorICAgKiB0byBwZXJmb3JtIHRoZSBzZWVrIG9uICovCisgIGlmIChldmVudCkgeworICAgIEdzdEZvcm1hdCBjb252OworCisgICAgZ3N0X2V2ZW50X3BhcnNlX3NlZWsgKGV2ZW50LCAmcmF0ZSwgJmZvcm1hdCwgJmZsYWdzLAorICAgICAgICAmY3VyX3R5cGUsICZjdXIsICZzdG9wX3R5cGUsICZzdG9wKTsKKworICAgIC8qIGNhbid0IHNlZWsgYmFja3dhcmRzIHlldCAqLworICAgIGlmIChyYXRlIDw9IDAuMCkKKyAgICAgIGdvdG8gd3JvbmdfcmF0ZTsKKworICAgIC8qIGNvbnZlcnQgaW5wdXQgZm9ybWF0IHRvIFRJTUUgKi8KKyAgICBjb252ID0gR1NUX0ZPUk1BVF9USU1FOworICAgIGlmICghKGdzdF9kdmRlbXV4X2NvbnZlcnRfc3JjX3BhaXIgKGRlbXV4LCBwYWQsCisgICAgICAgICAgICAgICAgZm9ybWF0LCBjdXIsIHN0b3AsIGNvbnYsICZjdXIsICZzdG9wKSkpCisgICAgICBnb3RvIG5vX2Zvcm1hdDsKKworICAgIGZvcm1hdCA9IEdTVF9GT1JNQVRfVElNRTsKKyAgfSBlbHNlIHsKKyAgICBmbGFncyA9IDA7CisgIH0KKworICBkZW11eC0+c2VnbWVudF9zZXFudW0gPSBnc3RfZXZlbnRfZ2V0X3NlcW51bSAoZXZlbnQpOworCisgIGZsdXNoID0gZmxhZ3MgJiBHU1RfU0VFS19GTEFHX0ZMVVNIOworCisgIC8qIHNlbmQgZmx1c2ggc3RhcnQgKi8KKyAgaWYgKGZsdXNoKSB7CisgICAgbmV3X2V2ZW50ID0gZ3N0X2V2ZW50X25ld19mbHVzaF9zdGFydCAoKTsKKyAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAobmV3X2V2ZW50LCBkZW11eC0+c2VnbWVudF9zZXFudW0pOworICAgIGdzdF9kdmRlbXV4X3B1c2hfZXZlbnQgKGRlbXV4LCBuZXdfZXZlbnQpOworICB9IGVsc2UgeworICAgIGdzdF9wYWRfcGF1c2VfdGFzayAoZGVtdXgtPnNpbmtwYWQpOworICB9CisKKyAgLyogZ3JhYiBzdHJlYW1pbmcgbG9jaywgdGhpcyBzaG91bGQgZXZlbnR1YWxseSBiZSBwb3NzaWJsZSwgZWl0aGVyCisgICAqIGJlY2F1c2UgdGhlIHRhc2sgaXMgcGF1c2VkIG9yIG91ciBzdHJlYW1pbmcgdGhyZWFkIHN0b3BwZWQKKyAgICogYmVjYXVzZSBvdXIgcGVlciBpcyBmbHVzaGluZy4gKi8KKyAgR1NUX1BBRF9TVFJFQU1fTE9DSyAoZGVtdXgtPnNpbmtwYWQpOworCisgIC8qIG1ha2UgY29weSBpbnRvIHRlbXAgc3RydWN0dXJlLCB3ZSBjYW4gb25seSB1cGRhdGUgdGhlIG1haW4gb25lCisgICAqIHdoZW4gdGhlIHN1YmNsYXNzIGFjdHVhbGx5IGNvdWxkIHRvIHRoZSBzZWVrLiAqLworICBtZW1jcHkgKCZzZWVrc2VnbWVudCwgJmRlbXV4LT50aW1lX3NlZ21lbnQsIHNpemVvZiAoR3N0U2VnbWVudCkpOworCisgIC8qIG5vdyBjb25maWd1cmUgdGhlIHNlZWsgc2VnbWVudCAqLworICBpZiAoZXZlbnQpIHsKKyAgICBnc3Rfc2VnbWVudF9kb19zZWVrICgmc2Vla3NlZ21lbnQsIHJhdGUsIGZvcm1hdCwgZmxhZ3MsCisgICAgICAgIGN1cl90eXBlLCBjdXIsIHN0b3BfdHlwZSwgc3RvcCwgJnVwZGF0ZSk7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInNlZ21lbnQgY29uZmlndXJlZCBmcm9tICUiIEdfR0lOVDY0X0ZPUk1BVAorICAgICAgIiB0byAlIiBHX0dJTlQ2NF9GT1JNQVQgIiwgcG9zaXRpb24gJSIgR19HSU5UNjRfRk9STUFULAorICAgICAgc2Vla3NlZ21lbnQuc3RhcnQsIHNlZWtzZWdtZW50LnN0b3AsIHNlZWtzZWdtZW50LnBvc2l0aW9uKTsKKworICAvKiBkbyB0aGUgc2Vlaywgc2VnbWVudC5wb3NpdGlvbiBjb250YWlucyBuZXcgcG9zaXRpb24uICovCisgIHJlcyA9IGdzdF9kdmRlbXV4X2RvX3NlZWsgKGRlbXV4LCAmc2Vla3NlZ21lbnQpOworCisgIC8qIGFuZCBwcmVwYXJlIHRvIGNvbnRpbnVlIHN0cmVhbWluZyAqLworICBpZiAoZmx1c2gpIHsKKyAgICAvKiBzZW5kIGZsdXNoIHN0b3AsIHBlZXIgd2lsbCBhY2NlcHQgZGF0YSBhbmQgZXZlbnRzIGFnYWluLiBXZQorICAgICAqIGFyZSBub3QgeWV0IHByb3ZpZGluZyBkYXRhIGFzIHdlIHN0aWxsIGhhdmUgdGhlIFNUUkVBTV9MT0NLLiAqLworICAgIG5ld19ldmVudCA9IGdzdF9ldmVudF9uZXdfZmx1c2hfc3RvcCAoVFJVRSk7CisgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKG5ld19ldmVudCwgZGVtdXgtPnNlZ21lbnRfc2VxbnVtKTsKKyAgICBnc3RfZHZkZW11eF9wdXNoX2V2ZW50IChkZW11eCwgbmV3X2V2ZW50KTsKKyAgfQorCisgIC8qIGlmIHN1Y2Nlc3NmdWxsIHNlZWssIHdlIHVwZGF0ZSBvdXIgcmVhbCBzZWdtZW50IGFuZCBwdXNoCisgICAqIG91dCB0aGUgbmV3IHNlZ21lbnQuICovCisgIGlmIChyZXMpIHsKKyAgICBtZW1jcHkgKCZkZW11eC0+dGltZV9zZWdtZW50LCAmc2Vla3NlZ21lbnQsIHNpemVvZiAoR3N0U2VnbWVudCkpOworCisgICAgaWYgKGRlbXV4LT50aW1lX3NlZ21lbnQuZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NFR01FTlQpIHsKKyAgICAgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgICAgIG1lc3NhZ2UgPSBnc3RfbWVzc2FnZV9uZXdfc2VnbWVudF9zdGFydCAoR1NUX09CSkVDVF9DQVNUIChkZW11eCksCisgICAgICAgICAgZGVtdXgtPnRpbWVfc2VnbWVudC5mb3JtYXQsIGRlbXV4LT50aW1lX3NlZ21lbnQucG9zaXRpb24pOworICAgICAgZ3N0X21lc3NhZ2Vfc2V0X3NlcW51bSAobWVzc2FnZSwgZGVtdXgtPnNlZ21lbnRfc2VxbnVtKTsKKyAgICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCBtZXNzYWdlKTsKKyAgICB9CisgICAgaWYgKChzdG9wID0gZGVtdXgtPnRpbWVfc2VnbWVudC5zdG9wKSA9PSAtMSkKKyAgICAgIHN0b3AgPSBkZW11eC0+dGltZV9zZWdtZW50LmR1cmF0aW9uOworCisgICAgR1NUX0lORk9fT0JKRUNUIChkZW11eCwKKyAgICAgICAgIlNhdmluZyBuZXdzZWdtZW50IGV2ZW50IHRvIGJlIHNlbnQgaW4gc3RyZWFtaW5nIHRocmVhZCIpOworCisgICAgaWYgKGRlbXV4LT5wZW5kaW5nX3NlZ21lbnQpCisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGRlbXV4LT5wZW5kaW5nX3NlZ21lbnQpOworCisgICAgZGVtdXgtPnBlbmRpbmdfc2VnbWVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJmRlbXV4LT50aW1lX3NlZ21lbnQpOworICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChkZW11eC0+cGVuZGluZ19zZWdtZW50LCBkZW11eC0+c2VnbWVudF9zZXFudW0pOworCisgICAgZGVtdXgtPm5lZWRfc2VnbWVudCA9IEZBTFNFOworICB9CisKKyAgLyogYW5kIHJlc3RhcnQgdGhlIHRhc2sgaW4gY2FzZSBpdCBnb3QgcGF1c2VkIGV4cGxpY2l0ZWx5IG9yIGJ5CisgICAqIHRoZSBGTFVTSF9TVEFSVCBldmVudCB3ZSBwdXNoZWQgb3V0LiAqLworICBnc3RfcGFkX3N0YXJ0X3Rhc2sgKGRlbXV4LT5zaW5rcGFkLCAoR3N0VGFza0Z1bmN0aW9uKSBnc3RfZHZkZW11eF9sb29wLAorICAgICAgZGVtdXgtPnNpbmtwYWQsIE5VTEwpOworCisgIC8qIGFuZCByZWxlYXNlIHRoZSBsb2NrIGFnYWluIHNvIHdlIGNhbiBjb250aW51ZSBzdHJlYW1pbmcgKi8KKyAgR1NUX1BBRF9TVFJFQU1fVU5MT0NLIChkZW11eC0+c2lua3BhZCk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCit3cm9uZ19yYXRlOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJuZWdhdGl2ZSBwbGF5YmFjayByYXRlICVsZiBub3Qgc3VwcG9ydGVkLiIsIHJhdGUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fZm9ybWF0OgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJjYW5ub3QgY29udmVydCB0byBUSU1FIGZvcm1hdCwgc2VlayBhYm9ydGVkLiIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdmRlbXV4X3NlbmRfZXZlbnQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3REVkRlbXV4ICpkdmRlbXV4ID0gR1NUX0RWREVNVVggKGVsZW1lbnQpOworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TRUVLOgorICAgIHsKKyAgICAgIC8qIGNoZWNraW5nIGhlYWRlciBhbmQgY29uZmlndXJpbmcgdGhlIHNlZWsgbXVzdCBiZSBhdG9taWMgKi8KKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZHZkZW11eCk7CisgICAgICBpZiAoZ19hdG9taWNfaW50X2dldCAoJmR2ZGVtdXgtPmZvdW5kX2hlYWRlcikgPT0gMCkgeworICAgICAgICBHc3RFdmVudCAqKmV2ZW50X3A7CisKKyAgICAgICAgZXZlbnRfcCA9ICZkdmRlbXV4LT5zZWVrX2V2ZW50OworCisgICAgICAgIC8qIFdlIGRvbid0IGhhdmUgcGFkcyB5ZXQuIEtlZXAgdGhlIGV2ZW50LiAqLworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKGR2ZGVtdXgsICJLZWVwaW5nIHRoZSBzZWVrIGV2ZW50IGZvciBsYXRlciIpOworCisgICAgICAgIGdzdF9ldmVudF9yZXBsYWNlIChldmVudF9wLCBldmVudCk7CisgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdmRlbXV4KTsKKworICAgICAgICByZXMgPSBUUlVFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGR2ZGVtdXgpOworCisgICAgICAgIGlmIChkdmRlbXV4LT5zZWVrX2hhbmRsZXIpCisgICAgICAgICAgcmVzID0gZHZkZW11eC0+c2Vla19oYW5kbGVyIChkdmRlbXV4LCBkdmRlbXV4LT52aWRlb3NyY3BhZCwgZXZlbnQpOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNlbmRfZXZlbnQgKGVsZW1lbnQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworLyogaGFuZGxlIGFuIGV2ZW50IG9uIHRoZSBzb3VyY2UgcGFkLCBpdCdzIG1vc3QgbGlrZWx5IGEgc2VlayAqLworc3RhdGljIGdib29sZWFuCitnc3RfZHZkZW11eF9oYW5kbGVfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKyAgR3N0RFZEZW11eCAqZHZkZW11eDsKKworICBkdmRlbXV4ID0gR1NUX0RWREVNVVggKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICAgIC8qIHNlZWsgaGFuZGxlciBpcyBpbnN0YWxsZWQgYmFzZWQgb24gc2NoZWR1bGluZyBtb2RlICovCisgICAgICBpZiAoZHZkZW11eC0+c2Vla19oYW5kbGVyKQorICAgICAgICByZXMgPSBkdmRlbXV4LT5zZWVrX2hhbmRsZXIgKGR2ZGVtdXgsIHBhZCwgZXZlbnQpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChkdmRlbXV4LT5zaW5rcGFkLCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKKy8qIGRvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIGJ1ZmZlciAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9kdmRlbXV4X2RlbXV4X2F1ZGlvIChHc3REVkRlbXV4ICogZHZkZW11eCwgR3N0QnVmZmVyICogYnVmZmVyLAorICAgIGd1aW50NjQgZHVyYXRpb24pCit7CisgIGdpbnQgbnVtX3NhbXBsZXM7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RNYXBJbmZvIG1hcDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBkdl9kZWNvZGVfZnVsbF9hdWRpbyAoZHZkZW11eC0+ZGVjb2RlciwgbWFwLmRhdGEsIGR2ZGVtdXgtPmF1ZGlvX2J1ZmZlcnMpOworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgIGlmIChHX0xJS0VMWSAoKG51bV9zYW1wbGVzID0gZHZfZ2V0X251bV9zYW1wbGVzIChkdmRlbXV4LT5kZWNvZGVyKSkgPiAwKSkgeworICAgIGdpbnQxNiAqYV9wdHI7CisgICAgZ2ludCBpLCBqOworICAgIEdzdEJ1ZmZlciAqb3V0YnVmOworICAgIGdpbnQgZnJlcXVlbmN5LCBjaGFubmVsczsKKworICAgIC8qIGdldCBpbml0aWFsIGZvcm1hdCBvciBjaGVjayBpZiBmb3JtYXQgY2hhbmdlZCAqLworICAgIGZyZXF1ZW5jeSA9IGR2X2dldF9mcmVxdWVuY3kgKGR2ZGVtdXgtPmRlY29kZXIpOworICAgIGNoYW5uZWxzID0gZHZfZ2V0X251bV9jaGFubmVscyAoZHZkZW11eC0+ZGVjb2Rlcik7CisKKyAgICBpZiAoR19VTkxJS0VMWSAoKGR2ZGVtdXgtPmF1ZGlvc3JjcGFkID09IE5VTEwpCisgICAgICAgICAgICB8fCAoZnJlcXVlbmN5ICE9IGR2ZGVtdXgtPmZyZXF1ZW5jeSkKKyAgICAgICAgICAgIHx8IChjaGFubmVscyAhPSBkdmRlbXV4LT5jaGFubmVscykpKSB7CisgICAgICBHc3RDYXBzICpjYXBzOworICAgICAgR3N0QXVkaW9JbmZvIGluZm87CisKKyAgICAgIGR2ZGVtdXgtPmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKKyAgICAgIGR2ZGVtdXgtPmNoYW5uZWxzID0gY2hhbm5lbHM7CisKKyAgICAgIGdzdF9hdWRpb19pbmZvX2luaXQgKCZpbmZvKTsKKyAgICAgIGdzdF9hdWRpb19pbmZvX3NldF9mb3JtYXQgKCZpbmZvLCBHU1RfQVVESU9fRk9STUFUX1MxNkxFLAorICAgICAgICAgIGZyZXF1ZW5jeSwgY2hhbm5lbHMsIE5VTEwpOworICAgICAgY2FwcyA9IGdzdF9hdWRpb19pbmZvX3RvX2NhcHMgKCZpbmZvKTsKKyAgICAgIGlmIChHX1VOTElLRUxZIChkdmRlbXV4LT5hdWRpb3NyY3BhZCA9PSBOVUxMKSkgeworICAgICAgICBkdmRlbXV4LT5hdWRpb3NyY3BhZCA9CisgICAgICAgICAgICBnc3RfZHZkZW11eF9hZGRfcGFkIChkdmRlbXV4LCAmYXVkaW9fc3JjX3RlbXAsIGNhcHMpOworCisgICAgICAgIGlmIChkdmRlbXV4LT52aWRlb3NyY3BhZCAmJiBkdmRlbXV4LT5hdWRpb3NyY3BhZCkKKyAgICAgICAgICBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgKEdTVF9FTEVNRU5UIChkdmRlbXV4KSk7CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9wYWRfc2V0X2NhcHMgKGR2ZGVtdXgtPmF1ZGlvc3JjcGFkLCBjYXBzKTsKKyAgICAgIH0KKyAgICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICB9CisKKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG51bV9zYW1wbGVzICoKKyAgICAgICAgc2l6ZW9mIChnaW50MTYpICogZHZkZW11eC0+Y2hhbm5lbHMpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgICAgYV9wdHIgPSAoZ2ludDE2ICopIG1hcC5kYXRhOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9zYW1wbGVzOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBkdmRlbXV4LT5jaGFubmVsczsgaisrKSB7CisgICAgICAgICooYV9wdHIrKykgPSBkdmRlbXV4LT5hdWRpb19idWZmZXJzW2pdW2ldOworICAgICAgfQorICAgIH0KKyAgICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWYsICZtYXApOworCisgICAgR1NUX0RFQlVHICgicHVzaGluZyBhdWRpbyAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5wb3NpdGlvbikpOworCisgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgPSBkdmRlbXV4LT50aW1lX3NlZ21lbnQucG9zaXRpb247CisgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9IGR1cmF0aW9uOworICAgIEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpID0gZHZkZW11eC0+YXVkaW9fb2Zmc2V0OworICAgIGR2ZGVtdXgtPmF1ZGlvX29mZnNldCArPSBudW1fc2FtcGxlczsKKyAgICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKG91dGJ1ZikgPSBkdmRlbXV4LT5hdWRpb19vZmZzZXQ7CisKKyAgICBpZiAoZHZkZW11eC0+bmV3X21lZGlhIHx8IGR2ZGVtdXgtPmRpc2NvbnQpCisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICByZXQgPSBnc3RfcGFkX3B1c2ggKGR2ZGVtdXgtPmF1ZGlvc3JjcGFkLCBvdXRidWYpOworICB9IGVsc2UgeworICAgIC8qIG5vIHNhbXBsZXMgKi8KKyAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qIHRha2VzIG93bmVyc2hpcCBvZiBidWZmZXIgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZHZkZW11eF9kZW11eF92aWRlbyAoR3N0RFZEZW11eCAqIGR2ZGVtdXgsIEdzdEJ1ZmZlciAqIGJ1ZmZlciwKKyAgICBndWludDY0IGR1cmF0aW9uKQoreworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ2ludCBoZWlnaHQ7CisgIGdib29sZWFuIHdpZGU7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgLyogZ2V0IHBhcmFtcyAqLworICAvKiBmcmFtZXJhdGUgaXMgYWxyZWFkeSB1cC10by1kYXRlICovCisgIGhlaWdodCA9IGR2ZGVtdXgtPmRlY29kZXItPmhlaWdodDsKKyAgd2lkZSA9IGR2X2Zvcm1hdF93aWRlIChkdmRlbXV4LT5kZWNvZGVyKTsKKworICAvKiBzZWUgaWYgYW55dGhpbmcgY2hhbmdlZCAqLworICBpZiAoR19VTkxJS0VMWSAoKGR2ZGVtdXgtPnZpZGVvc3JjcGFkID09IE5VTEwpIHx8IChkdmRlbXV4LT5oZWlnaHQgIT0gaGVpZ2h0KQorICAgICAgICAgIHx8IGR2ZGVtdXgtPndpZGUgIT0gd2lkZSkpIHsKKyAgICBnaW50IHBhcl94LCBwYXJfeTsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgZHZkZW11eC0+aGVpZ2h0ID0gaGVpZ2h0OworICAgIGR2ZGVtdXgtPndpZGUgPSB3aWRlOworCisgICAgaWYgKGR2ZGVtdXgtPmRlY29kZXItPnN5c3RlbSA9PSBlX2R2X3N5c3RlbV82MjVfNTApIHsKKyAgICAgIGlmICh3aWRlKSB7CisgICAgICAgIHBhcl94ID0gUEFMX1dJREVfUEFSX1g7CisgICAgICAgIHBhcl95ID0gUEFMX1dJREVfUEFSX1k7CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXJfeCA9IFBBTF9OT1JNQUxfUEFSX1g7CisgICAgICAgIHBhcl95ID0gUEFMX05PUk1BTF9QQVJfWTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKHdpZGUpIHsKKyAgICAgICAgcGFyX3ggPSBOVFNDX1dJREVfUEFSX1g7CisgICAgICAgIHBhcl95ID0gTlRTQ19XSURFX1BBUl9ZOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyX3ggPSBOVFNDX05PUk1BTF9QQVJfWDsKKyAgICAgICAgcGFyX3kgPSBOVFNDX05PUk1BTF9QQVJfWTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtZHYiLAorICAgICAgICAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLAorICAgICAgICAid2lkdGgiLCBHX1RZUEVfSU5ULCA3MjAsCisgICAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBoZWlnaHQsCisgICAgICAgICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTiwgZHZkZW11eC0+ZnJhbWVyYXRlX251bWVyYXRvciwKKyAgICAgICAgZHZkZW11eC0+ZnJhbWVyYXRlX2Rlbm9taW5hdG9yLAorICAgICAgICAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgR1NUX1RZUEVfRlJBQ1RJT04sIHBhcl94LCBwYXJfeSwgTlVMTCk7CisKKyAgICBpZiAoR19VTkxJS0VMWSAoZHZkZW11eC0+dmlkZW9zcmNwYWQgPT0gTlVMTCkpIHsKKyAgICAgIGR2ZGVtdXgtPnZpZGVvc3JjcGFkID0KKyAgICAgICAgICBnc3RfZHZkZW11eF9hZGRfcGFkIChkdmRlbXV4LCAmdmlkZW9fc3JjX3RlbXAsIGNhcHMpOworCisgICAgICBpZiAoZHZkZW11eC0+dmlkZW9zcmNwYWQgJiYgZHZkZW11eC0+YXVkaW9zcmNwYWQpCisgICAgICAgIGdzdF9lbGVtZW50X25vX21vcmVfcGFkcyAoR1NUX0VMRU1FTlQgKGR2ZGVtdXgpKTsKKworICAgIH0gZWxzZSB7CisgICAgICBnc3RfcGFkX3NldF9jYXBzIChkdmRlbXV4LT52aWRlb3NyY3BhZCwgY2Fwcyk7CisgICAgfQorICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgfQorCisgIC8qIHRha2VzIG93bmVyc2hpcCBvZiBidWZmZXIgaGVyZSwgd2UganVzdCBuZWVkIHRvIG1vZGlmeQorICAgKiB0aGUgbWV0YWRhdGEuICovCisgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoYnVmZmVyKTsKKworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSA9IGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5wb3NpdGlvbjsKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZikgPSBkdmRlbXV4LT52aWRlb19vZmZzZXQ7CisgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAob3V0YnVmKSA9IGR2ZGVtdXgtPnZpZGVvX29mZnNldCArIDE7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPSBkdXJhdGlvbjsKKworICBpZiAoZHZkZW11eC0+bmV3X21lZGlhIHx8IGR2ZGVtdXgtPmRpc2NvbnQpCisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisKKyAgR1NUX0RFQlVHICgicHVzaGluZyB2aWRlbyAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChkdmRlbXV4LT50aW1lX3NlZ21lbnQucG9zaXRpb24pKTsKKworICByZXQgPSBnc3RfcGFkX3B1c2ggKGR2ZGVtdXgtPnZpZGVvc3JjcGFkLCBvdXRidWYpOworCisgIGR2ZGVtdXgtPnZpZGVvX29mZnNldCsrOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9zc3liX29mZnNldCAoaW50IGRpZiwgaW50IHNzeWIpCit7CisgIGludCBvZmZzZXQ7CisKKyAgb2Zmc2V0ID0gZGlmICogMTIwMDA7ICAgICAgICAgLyogdG8gZGlmICovCisgIG9mZnNldCArPSA4MCAqICgxICsgKHNzeWIgLyA2KSk7ICAgICAgLyogdG8gc3ViY29kZSBwYWNrICovCisgIG9mZnNldCArPSAzOyAgICAgICAgICAgICAgICAgIC8qIHBhc3QgaGVhZGVyICovCisgIG9mZnNldCArPSA4ICogKHNzeWIgJSA2KTsgICAgIC8qIHRvIHNzeWIgKi8KKworICByZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdmRlbXV4X2dldF90aW1lY29kZSAoR3N0RFZEZW11eCAqIGR2ZGVtdXgsIEdzdEJ1ZmZlciAqIGJ1ZmZlciwKKyAgICBHc3RTTVBURVRpbWVDb2RlICogdGltZWNvZGUpCit7CisgIGd1aW50OCAqZGF0YTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGludCBvZmZzZXQ7CisgIGludCBkaWY7CisgIGludCBuX2RpZnMgPSBkdmRlbXV4LT5kZWNvZGVyLT5udW1fZGlmX3NlcXM7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworICBmb3IgKGRpZiA9IDA7IGRpZiA8IG5fZGlmczsgZGlmKyspIHsKKyAgICBvZmZzZXQgPSBnZXRfc3N5Yl9vZmZzZXQgKGRpZiwgMyk7CisgICAgaWYgKGRhdGFbb2Zmc2V0ICsgM10gPT0gMHgxMykgeworICAgICAgdGltZWNvZGUtPmZyYW1lcyA9ICgoZGF0YVtvZmZzZXQgKyA0XSA+PiA0KSAmIDB4MykgKiAxMCArCisgICAgICAgICAgKGRhdGFbb2Zmc2V0ICsgNF0gJiAweGYpOworICAgICAgdGltZWNvZGUtPnNlY29uZHMgPSAoKGRhdGFbb2Zmc2V0ICsgNV0gPj4gNCkgJiAweDMpICogMTAgKworICAgICAgICAgIChkYXRhW29mZnNldCArIDVdICYgMHhmKTsKKyAgICAgIHRpbWVjb2RlLT5taW51dGVzID0gKChkYXRhW29mZnNldCArIDZdID4+IDQpICYgMHgzKSAqIDEwICsKKyAgICAgICAgICAoZGF0YVtvZmZzZXQgKyA2XSAmIDB4Zik7CisgICAgICB0aW1lY29kZS0+aG91cnMgPSAoKGRhdGFbb2Zmc2V0ICsgN10gPj4gNCkgJiAweDMpICogMTAgKworICAgICAgICAgIChkYXRhW29mZnNldCArIDddICYgMHhmKTsKKyAgICAgIEdTVF9ERUJVRyAoImdvdCB0aW1lY29kZSAlIiBHU1RfU01QVEVfVElNRV9DT0RFX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfU01QVEVfVElNRV9DT0RFX0FSR1MgKHRpbWVjb2RlKSk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdmRlbXV4X2lzX25ld19tZWRpYSAoR3N0RFZEZW11eCAqIGR2ZGVtdXgsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgZ3VpbnQ4ICpkYXRhOworICBHc3RNYXBJbmZvIG1hcDsKKyAgaW50IGFhdXhfb2Zmc2V0OworICBpbnQgZGlmOworICBpbnQgbl9kaWZzOworCisgIG5fZGlmcyA9IGR2ZGVtdXgtPmRlY29kZXItPm51bV9kaWZfc2VxczsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBkYXRhID0gbWFwLmRhdGE7CisgIGZvciAoZGlmID0gMDsgZGlmIDwgbl9kaWZzOyBkaWYrKykgeworICAgIGlmIChkaWYgJiAxKSB7CisgICAgICBhYXV4X29mZnNldCA9IChkaWYgKiAxMjAwMCkgKyAoNiArIDE2ICogMSkgKiA4MCArIDM7CisgICAgfSBlbHNlIHsKKyAgICAgIGFhdXhfb2Zmc2V0ID0gKGRpZiAqIDEyMDAwKSArICg2ICsgMTYgKiA0KSAqIDgwICsgMzsKKyAgICB9CisgICAgaWYgKGRhdGFbYWF1eF9vZmZzZXQgKyAwXSA9PSAweDUxKSB7CisgICAgICBpZiAoKGRhdGFbYWF1eF9vZmZzZXQgKyAyXSAmIDB4ODApID09IDApIHsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiB0YWtlcyBvd25lcnNoaXAgb2YgYnVmZmVyICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2R2ZGVtdXhfZGVtdXhfZnJhbWUgKEdzdERWRGVtdXggKiBkdmRlbXV4LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdENsb2NrVGltZSBuZXh0X3RzOworICBHc3RGbG93UmV0dXJuIGFyZXQsIHZyZXQsIHJldDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50NjQgZHVyYXRpb247CisgIEdzdFNNUFRFVGltZUNvZGUgdGltZWNvZGU7CisgIGludCBmcmFtZV9udW1iZXI7CisKKyAgaWYgKGR2ZGVtdXgtPm5lZWRfc2VnbWVudCkgeworICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisgICAgR3N0RXZlbnQgKmV2ZW50OworCisgICAgZ19hc3NlcnQgKCFkdmRlbXV4LT51cHN0cmVhbV90aW1lX3NlZ21lbnQpOworCisgICAgLyogY29udmVydCB0byB0aW1lIGFuZCBzdG9yZSBhcyBzdGFydC9lbmRfdGltZXN0YW1wICovCisgICAgZm9ybWF0ID0gR1NUX0ZPUk1BVF9USU1FOworICAgIGlmICghKGdzdF9kdmRlbXV4X2NvbnZlcnRfc2lua19wYWlyIChkdmRlbXV4LAorICAgICAgICAgICAgICAgIEdTVF9GT1JNQVRfQllURVMsIGR2ZGVtdXgtPmJ5dGVfc2VnbWVudC5zdGFydCwKKyAgICAgICAgICAgICAgICBkdmRlbXV4LT5ieXRlX3NlZ21lbnQuc3RvcCwgZm9ybWF0LAorICAgICAgICAgICAgICAgIChnaW50NjQgKikgJiBkdmRlbXV4LT50aW1lX3NlZ21lbnQuc3RhcnQsCisgICAgICAgICAgICAgICAgKGdpbnQ2NCAqKSAmIGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5zdG9wKSkpCisgICAgICBnb3RvIHNlZ21lbnRfZXJyb3I7CisKKyAgICBkdmRlbXV4LT50aW1lX3NlZ21lbnQudGltZSA9IGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5zdGFydDsKKyAgICBkdmRlbXV4LT50aW1lX3NlZ21lbnQucmF0ZSA9IGR2ZGVtdXgtPmJ5dGVfc2VnbWVudC5yYXRlOworCisgICAgZ3N0X2R2ZGVtdXhfc2lua19jb252ZXJ0IChkdmRlbXV4LAorICAgICAgICBHU1RfRk9STUFUX0JZVEVTLCBkdmRlbXV4LT5ieXRlX3NlZ21lbnQucG9zaXRpb24sCisgICAgICAgIEdTVF9GT1JNQVRfVElNRSwgKGdpbnQ2NCAqKSAmIGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5wb3NpdGlvbik7CisKKyAgICBnc3RfZHZkZW11eF91cGRhdGVfZnJhbWVfb2Zmc2V0cyAoZHZkZW11eCwgZHZkZW11eC0+dGltZV9zZWdtZW50LnBvc2l0aW9uKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR2ZGVtdXgsICJzZW5kaW5nIHNlZ21lbnQgc3RhcnQ6ICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAiLCBzdG9wOiAlIiBHU1RfVElNRV9GT1JNQVQgIiwgdGltZTogJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChkdmRlbXV4LT50aW1lX3NlZ21lbnQuc3RhcnQpLAorICAgICAgICBHU1RfVElNRV9BUkdTIChkdmRlbXV4LT50aW1lX3NlZ21lbnQuc3RvcCksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5zdGFydCkpOworCisgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZkdmRlbXV4LT50aW1lX3NlZ21lbnQpOworICAgIGlmIChkdmRlbXV4LT5zZWdtZW50X3NlcW51bSkKKyAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChldmVudCwgZHZkZW11eC0+c2VnbWVudF9zZXFudW0pOworICAgIGdzdF9kdmRlbXV4X3B1c2hfZXZlbnQgKGR2ZGVtdXgsIGV2ZW50KTsKKworICAgIGR2ZGVtdXgtPm5lZWRfc2VnbWVudCA9IEZBTFNFOworICB9CisKKyAgZ3N0X2R2ZGVtdXhfZ2V0X3RpbWVjb2RlIChkdmRlbXV4LCBidWZmZXIsICZ0aW1lY29kZSk7CisgIGdzdF9zbXB0ZV90aW1lX2NvZGVfZ2V0X2ZyYW1lX251bWJlciAoCisgICAgICAoZHZkZW11eC0+ZGVjb2Rlci0+c3lzdGVtID09IGVfZHZfc3lzdGVtXzYyNV81MCkgPworICAgICAgR1NUX1NNUFRFX1RJTUVfQ09ERV9TWVNURU1fMjUgOiBHU1RfU01QVEVfVElNRV9DT0RFX1NZU1RFTV8zMCwKKyAgICAgICZmcmFtZV9udW1iZXIsICZ0aW1lY29kZSk7CisKKyAgaWYgKGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5yYXRlIDwgMCkgeworICAgIG5leHRfdHMgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50ICgKKyAgICAgICAgKGR2ZGVtdXgtPmZyYW1lX29mZnNldCA+CisgICAgICAgICAgICAwID8gZHZkZW11eC0+ZnJhbWVfb2Zmc2V0IC0gMSA6IDApICogR1NUX1NFQ09ORCwKKyAgICAgICAgZHZkZW11eC0+ZnJhbWVyYXRlX2Rlbm9taW5hdG9yLCBkdmRlbXV4LT5mcmFtZXJhdGVfbnVtZXJhdG9yKTsKKyAgICBkdXJhdGlvbiA9IGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5wb3NpdGlvbiAtIG5leHRfdHM7CisgIH0gZWxzZSB7CisgICAgbmV4dF90cyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKAorICAgICAgICAoZHZkZW11eC0+ZnJhbWVfb2Zmc2V0ICsgMSkgKiBHU1RfU0VDT05ELAorICAgICAgICBkdmRlbXV4LT5mcmFtZXJhdGVfZGVub21pbmF0b3IsIGR2ZGVtdXgtPmZyYW1lcmF0ZV9udW1lcmF0b3IpOworICAgIGR1cmF0aW9uID0gbmV4dF90cyAtIGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5wb3NpdGlvbjsKKyAgfQorCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGR2X3BhcnNlX3BhY2tzIChkdmRlbXV4LT5kZWNvZGVyLCBtYXAuZGF0YSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIGR2ZGVtdXgtPm5ld19tZWRpYSA9IEZBTFNFOworICBpZiAoZ3N0X2R2ZGVtdXhfaXNfbmV3X21lZGlhIChkdmRlbXV4LCBidWZmZXIpICYmCisgICAgICBkdmRlbXV4LT5mcmFtZXNfc2luY2VfbmV3X21lZGlhID4gMikgeworICAgIGR2ZGVtdXgtPm5ld19tZWRpYSA9IFRSVUU7CisgICAgZHZkZW11eC0+ZnJhbWVzX3NpbmNlX25ld19tZWRpYSA9IDA7CisgIH0KKyAgZHZkZW11eC0+ZnJhbWVzX3NpbmNlX25ld19tZWRpYSsrOworCisgIC8qIGRvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIGJ1ZmZlciAqLworICBhcmV0ID0gcmV0ID0gZ3N0X2R2ZGVtdXhfZGVtdXhfYXVkaW8gKGR2ZGVtdXgsIGJ1ZmZlciwgZHVyYXRpb24pOworICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LICYmIHJldCAhPSBHU1RfRkxPV19OT1RfTElOS0VEKSkgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgZ290byBkb25lOworICB9CisKKyAgLyogdGFrZXMgb3duZXJzaGlwIG9mIGJ1ZmZlciAqLworICB2cmV0ID0gcmV0ID0gZ3N0X2R2ZGVtdXhfZGVtdXhfdmlkZW8gKGR2ZGVtdXgsIGJ1ZmZlciwgZHVyYXRpb24pOworICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LICYmIHJldCAhPSBHU1RfRkxPV19OT1RfTElOS0VEKSkKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogaWYgYm90aCBhcmUgbm90IGxpbmtlZCwgd2Ugc3RvcCAqLworICBpZiAoR19VTkxJS0VMWSAoYXJldCA9PSBHU1RfRkxPV19OT1RfTElOS0VEICYmIHZyZXQgPT0gR1NUX0ZMT1dfTk9UX0xJTktFRCkpIHsKKyAgICByZXQgPSBHU1RfRkxPV19OT1RfTElOS0VEOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGR2ZGVtdXgtPmRpc2NvbnQgPSBGQUxTRTsKKyAgZHZkZW11eC0+dGltZV9zZWdtZW50LnBvc2l0aW9uID0gbmV4dF90czsKKworICBpZiAoZHZkZW11eC0+dGltZV9zZWdtZW50LnJhdGUgPCAwKSB7CisgICAgaWYgKGR2ZGVtdXgtPmZyYW1lX29mZnNldCA+IDApCisgICAgICBkdmRlbXV4LT5mcmFtZV9vZmZzZXQtLTsKKyAgICBlbHNlCisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGR2ZGVtdXgsCisgICAgICAgICAgIkdvdCBiZWZvcmUgZnJhbWUgb2Zmc2V0IDAgaW4gcmV2ZXJzZSBwbGF5YmFjayIpOworICB9IGVsc2UgeworICAgIGR2ZGVtdXgtPmZyYW1lX29mZnNldCsrOworICB9CisKKyAgLyogY2hlY2sgZm9yIHRoZSBlbmQgb2YgdGhlIHNlZ21lbnQgKi8KKyAgaWYgKChkdmRlbXV4LT50aW1lX3NlZ21lbnQucmF0ZSA+IDAgJiYgZHZkZW11eC0+dGltZV9zZWdtZW50LnN0b3AgIT0gLTEKKyAgICAgICAgICAmJiBuZXh0X3RzID4gZHZkZW11eC0+dGltZV9zZWdtZW50LnN0b3ApCisgICAgICB8fCAoZHZkZW11eC0+dGltZV9zZWdtZW50LnJhdGUgPCAwCisgICAgICAgICAgJiYgZHZkZW11eC0+dGltZV9zZWdtZW50LnN0YXJ0ID4gbmV4dF90cykpCisgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICBlbHNlCisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisKK2RvbmU6CisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCitzZWdtZW50X2Vycm9yOgorICB7CisgICAgR1NUX0RFQlVHICgiZXJyb3IgZ2VuZXJhdGluZyBuZXdfc2VnbWVudCBldmVudCIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKKy8qIGZsdXNoIGFueSByZW1haW5pbmcgZGF0YSBpbiB0aGUgYWRhcHRlciwgdXNlZCBpbiBjaGFpbiBiYXNlZCBzY2hlZHVsaW5nIG1vZGUgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZHZkZW11eF9mbHVzaCAoR3N0RFZEZW11eCAqIGR2ZGVtdXgpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgd2hpbGUgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoZHZkZW11eC0+YWRhcHRlcikgPj0gZHZkZW11eC0+ZnJhbWVfbGVuKSB7CisgICAgY29uc3QgZ3VpbnQ4ICpkYXRhOworICAgIGdpbnQgbGVuZ3RoOworCisgICAgLyogZ2V0IHRoZSBhY2N1bXVsYXRlZCBieXRlcyAqLworICAgIGRhdGEgPSBnc3RfYWRhcHRlcl9tYXAgKGR2ZGVtdXgtPmFkYXB0ZXIsIGR2ZGVtdXgtPmZyYW1lX2xlbik7CisKKyAgICAvKiBwYXJzZSBoZWFkZXIgdG8ga25vdyB0aGUgbGVuZ3RoIGFuZCBvdGhlciBwYXJhbXMgKi8KKyAgICBpZiAoR19VTkxJS0VMWSAoZHZfcGFyc2VfaGVhZGVyIChkdmRlbXV4LT5kZWNvZGVyLCBkYXRhKSA8IDApKSB7CisgICAgICBnc3RfYWRhcHRlcl91bm1hcCAoZHZkZW11eC0+YWRhcHRlcik7CisgICAgICBnb3RvIHBhcnNlX2hlYWRlcl9lcnJvcjsKKyAgICB9CisgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKGR2ZGVtdXgtPmFkYXB0ZXIpOworCisgICAgLyogYWZ0ZXIgcGFyc2luZyB0aGUgaGVhZGVyIHdlIGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSAqLworICAgIGxlbmd0aCA9IGR2ZGVtdXgtPmZyYW1lX2xlbiA9IGR2ZGVtdXgtPmRlY29kZXItPmZyYW1lX3NpemU7CisgICAgaWYgKGR2ZGVtdXgtPmRlY29kZXItPnN5c3RlbSA9PSBlX2R2X3N5c3RlbV82MjVfNTApIHsKKyAgICAgIGR2ZGVtdXgtPmZyYW1lcmF0ZV9udW1lcmF0b3IgPSBQQUxfRlJBTUVSQVRFX05VTUVSQVRPUjsKKyAgICAgIGR2ZGVtdXgtPmZyYW1lcmF0ZV9kZW5vbWluYXRvciA9IFBBTF9GUkFNRVJBVEVfREVOT01JTkFUT1I7CisgICAgfSBlbHNlIHsKKyAgICAgIGR2ZGVtdXgtPmZyYW1lcmF0ZV9udW1lcmF0b3IgPSBOVFNDX0ZSQU1FUkFURV9OVU1FUkFUT1I7CisgICAgICBkdmRlbXV4LT5mcmFtZXJhdGVfZGVub21pbmF0b3IgPSBOVFNDX0ZSQU1FUkFURV9ERU5PTUlOQVRPUjsKKyAgICB9CisgICAgZ19hdG9taWNfaW50X3NldCAoJmR2ZGVtdXgtPmZvdW5kX2hlYWRlciwgMSk7CisKKyAgICAvKiBsZXQgZGVtdXhfdmlkZW8gc2V0IHRoZSBoZWlnaHQsIGl0IG5lZWRzIHRvIGRldGVjdCB3aGVuIHRoaW5ncyBjaGFuZ2Ugc28KKyAgICAgKiBpdCBjYW4gcmVzZXQgY2FwcyAqLworCisgICAgLyogaWYgd2Ugc3RpbGwgaGF2ZSBlbm91Z2ggZm9yIGEgZnJhbWUsIHN0YXJ0IGRlY29kaW5nICovCisgICAgaWYgKEdfTElLRUxZIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGR2ZGVtdXgtPmFkYXB0ZXIpID49IGxlbmd0aCkpIHsKKyAgICAgIEdzdEJ1ZmZlciAqYnVmZmVyOworCisgICAgICBidWZmZXIgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoZHZkZW11eC0+YWRhcHRlciwgbGVuZ3RoKTsKKworICAgICAgLyogYW5kIGRlY29kZSB0aGUgYnVmZmVyLCB0YWtlcyBvd25lcnNoaXAgKi8KKyAgICAgIHJldCA9IGdzdF9kdmRlbXV4X2RlbXV4X2ZyYW1lIChkdmRlbXV4LCBidWZmZXIpOworICAgICAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSykpCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgIH0KK2RvbmU6CisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCitwYXJzZV9oZWFkZXJfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZHZkZW11eCwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJFcnJvciBwYXJzaW5nIERWIGhlYWRlciIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworLyogc3RyZWFtaW5nIG9wZXJhdGlvbjogCisgKgorICogYWNjdW11bGF0ZSBkYXRhIHVudGlsIHdlIGhhdmUgYSBmcmFtZSwgdGhlbiBkZWNvZGUuIAorICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2R2ZGVtdXhfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdERWRGVtdXggKmR2ZGVtdXg7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworCisgIGR2ZGVtdXggPSBHU1RfRFZERU1VWCAocGFyZW50KTsKKworICAvKiBhIGRpc2NvbnRpbnVpdHkgaW4gdGhlIHN0cmVhbSwgd2UgbmVlZCB0byBnZXQgcmlkIG9mCisgICAqIGFjY3VtdWxhdGVkIGRhdGEgaW4gdGhlIGFkYXB0ZXIgYW5kIGFzc3VtZSBhIG5ldyBmcmFtZQorICAgKiBzdGFydHMgYWZ0ZXIgdGhlIGRpc2NvbnRpbnVpdHkgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpKSkgeworICAgIGdzdF9hZGFwdGVyX2NsZWFyIChkdmRlbXV4LT5hZGFwdGVyKTsKKyAgICBkdmRlbXV4LT5kaXNjb250ID0gVFJVRTsKKworICAgIC8qIFNob3VsZCByZWNoZWNrIHdoZXJlIHdlIGFyZSAqLworICAgIGlmICghZHZkZW11eC0+dXBzdHJlYW1fdGltZV9zZWdtZW50KQorICAgICAgZHZkZW11eC0+bmVlZF9zZWdtZW50ID0gVFJVRTsKKyAgfQorCisgIC8qIGEgdGltZXN0YW1wIGFsd2F5cyBzaG91bGQgYmUgcmVzcGVjdGVkICovCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpOworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHRpbWVzdGFtcCkpIHsKKyAgICBkdmRlbXV4LT50aW1lX3NlZ21lbnQucG9zaXRpb24gPSB0aW1lc3RhbXA7CisKKyAgICBpZiAoZHZkZW11eC0+ZGlzY29udCkKKyAgICAgIGdzdF9kdmRlbXV4X3VwZGF0ZV9mcmFtZV9vZmZzZXRzIChkdmRlbXV4LAorICAgICAgICAgIGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5wb3NpdGlvbik7CisgIH0gZWxzZSBpZiAoZHZkZW11eC0+dXBzdHJlYW1fdGltZV9zZWdtZW50ICYmIGR2ZGVtdXgtPmRpc2NvbnQpIHsKKyAgICAvKiBUaGlzIHdpbGwgcHJvYmFibHkgZmFpbCBsYXRlciB0byBwcm92aWRlIGNvcnJlY3QKKyAgICAgKiB0aW1lc3RhbXBzIGFuZC9vciBkdXJhdGlvbnMgYnV0IGFsc28gc2hvdWxkIG5vdCBoYXBwZW4gKi8KKyAgICBHU1RfRVJST1JfT0JKRUNUIChkdmRlbXV4LAorICAgICAgICAiVXBzdHJlYW0gcHJvdmlkZXMgVElNRSBzZWdtZW50IGJ1dCBubyBQVFMgYWZ0ZXIgZGlzY29udCIpOworICB9CisKKyAgZ3N0X2FkYXB0ZXJfcHVzaCAoZHZkZW11eC0+YWRhcHRlciwgYnVmZmVyKTsKKworICAvKiBBcHBhcmVudGx5IGR2X3BhcnNlX2hlYWRlciBjYW4gcmVhZCBmcm9tIHRoZSBib2R5IG9mIHRoZSBmcmFtZQorICAgKiB0b28sIHNvIGl0IG5lZWRzIG1vcmUgdGhhbiBoZWFkZXJfc2l6ZSBieXRlcy4gV2Fja3khCisgICAqLworICBpZiAoR19VTkxJS0VMWSAoZHZkZW11eC0+ZnJhbWVfbGVuID09IC0xKSkgeworICAgIC8qIGlmIHdlIGRvbid0IGtub3cgdGhlIGxlbmd0aCBvZiBhIGZyYW1lLCB3ZSBhc3N1bWUgaXQgaXMKKyAgICAgKiB0aGUgTlRTQ19CVUZGRVIgbGVuZ3RoLCBhcyB0aGlzIGlzIGVub3VnaCB0byBmaWd1cmUgb3V0IAorICAgICAqIGlmIHRoaXMgaXMgUEFMIG9yIE5UU0MgKi8KKyAgICBkdmRlbXV4LT5mcmFtZV9sZW4gPSBOVFNDX0JVRkZFUjsKKyAgfQorCisgIC8qIGFuZCB0cnkgdG8gZmx1c2ggcGVuZGluZyBmcmFtZXMgKi8KKyAgcmV0ID0gZ3N0X2R2ZGVtdXhfZmx1c2ggKGR2ZGVtdXgpOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qIHB1bGwgYmFzZWQgb3BlcmF0aW9uLgorICoKKyAqIFJlYWQgaGVhZGVyIGZpcnN0IHRvIGZpZ3VyZSBvdXQgdGhlIGZyYW1lIHNpemUuIFRoZW4gcmVhZAorICogYW5kIGRlY29kZSBmdWxsIGZyYW1lcy4KKyAqLworc3RhdGljIHZvaWQKK2dzdF9kdmRlbXV4X2xvb3AgKEdzdFBhZCAqIHBhZCkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdERWRGVtdXggKmR2ZGVtdXg7CisgIEdzdEJ1ZmZlciAqYnVmZmVyID0gTlVMTDsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgZHZkZW11eCA9IEdTVF9EVkRFTVVYIChnc3RfcGFkX2dldF9wYXJlbnQgKHBhZCkpOworCisgIGlmIChHX1VOTElLRUxZIChnX2F0b21pY19pbnRfZ2V0ICgmZHZkZW11eC0+Zm91bmRfaGVhZGVyKSA9PSAwKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR2ZGVtdXgsICJwdWxsaW5nIGZpcnN0IGJ1ZmZlciIpOworICAgIC8qIHB1bGwgaW4gTlRTQyBzaXplZCBidWZmZXIgdG8gZmlndXJlIG91dCB0aGUgZnJhbWUKKyAgICAgKiBsZW5ndGggKi8KKyAgICByZXQgPSBnc3RfcGFkX3B1bGxfcmFuZ2UgKGR2ZGVtdXgtPnNpbmtwYWQsCisgICAgICAgIGR2ZGVtdXgtPmJ5dGVfc2VnbWVudC5wb3NpdGlvbiwgTlRTQ19CVUZGRVIsICZidWZmZXIpOworICAgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spKQorICAgICAgZ290byBwYXVzZTsKKworICAgIC8qIGNoZWNrIGJ1ZmZlciBzaXplLCBkb24ndCB3YW50IHRvIHJlYWQgc21hbGwgYnVmZmVycyAqLworICAgIGlmIChHX1VOTElLRUxZIChnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpIDwgTlRTQ19CVUZGRVIpKQorICAgICAgZ290byBzbWFsbF9idWZmZXI7CisKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIC8qIHBhcnNlIGhlYWRlciB0byBrbm93IHRoZSBsZW5ndGggYW5kIG90aGVyIHBhcmFtcyAqLworICAgIGlmIChHX1VOTElLRUxZIChkdl9wYXJzZV9oZWFkZXIgKGR2ZGVtdXgtPmRlY29kZXIsIG1hcC5kYXRhKSA8IDApKSB7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgICAgZ290byBwYXJzZV9oZWFkZXJfZXJyb3I7CisgICAgfQorICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKKyAgICAvKiBhZnRlciBwYXJzaW5nIHRoZSBoZWFkZXIgd2Uga25vdyB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhICovCisgICAgZHZkZW11eC0+ZnJhbWVfbGVuID0gZHZkZW11eC0+ZGVjb2Rlci0+ZnJhbWVfc2l6ZTsKKyAgICBpZiAoZHZkZW11eC0+ZGVjb2Rlci0+c3lzdGVtID09IGVfZHZfc3lzdGVtXzYyNV81MCkgeworICAgICAgZHZkZW11eC0+ZnJhbWVyYXRlX251bWVyYXRvciA9IFBBTF9GUkFNRVJBVEVfTlVNRVJBVE9SOworICAgICAgZHZkZW11eC0+ZnJhbWVyYXRlX2Rlbm9taW5hdG9yID0gUEFMX0ZSQU1FUkFURV9ERU5PTUlOQVRPUjsKKyAgICB9IGVsc2UgeworICAgICAgZHZkZW11eC0+ZnJhbWVyYXRlX251bWVyYXRvciA9IE5UU0NfRlJBTUVSQVRFX05VTUVSQVRPUjsKKyAgICAgIGR2ZGVtdXgtPmZyYW1lcmF0ZV9kZW5vbWluYXRvciA9IE5UU0NfRlJBTUVSQVRFX0RFTk9NSU5BVE9SOworICAgIH0KKyAgICBkdmRlbXV4LT5uZWVkX3NlZ21lbnQgPSBUUlVFOworCisgICAgLyogc2VlIGlmIHdlIG5lZWQgdG8gcmVhZCBhIGxhcmdlciBwYXJ0ICovCisgICAgaWYgKGR2ZGVtdXgtPmZyYW1lX2xlbiAhPSBOVFNDX0JVRkZFUikgeworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgeworICAgICAgR3N0RXZlbnQgKmV2ZW50OworCisgICAgICAvKiBzZXR0aW5nIGhlYWRlciBhbmQgcHJyZm9ybWluZyB0aGUgc2VlayBtdXN0IGJlIGF0b21pYyAqLworICAgICAgR1NUX09CSkVDVF9MT0NLIChkdmRlbXV4KTsKKyAgICAgIC8qIGdvdCBoZWFkZXIgbm93ICovCisgICAgICBnX2F0b21pY19pbnRfc2V0ICgmZHZkZW11eC0+Zm91bmRfaGVhZGVyLCAxKTsKKworICAgICAgLyogbm93IHBlcmZvcm0gcGVuZGluZyBzZWVrIGlmIGFueS4gKi8KKyAgICAgIGV2ZW50ID0gZHZkZW11eC0+c2Vla19ldmVudDsKKyAgICAgIGlmIChldmVudCkKKyAgICAgICAgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGR2ZGVtdXgpOworCisgICAgICBpZiAoZXZlbnQpIHsKKyAgICAgICAgaWYgKCFnc3RfZHZkZW11eF9oYW5kbGVfcHVsbF9zZWVrIChkdmRlbXV4LCBkdmRlbXV4LT52aWRlb3NyY3BhZCwKKyAgICAgICAgICAgICAgICBldmVudCkpIHsKKyAgICAgICAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChkdmRlbXV4LCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLAorICAgICAgICAgICAgICAoIkVycm9yIHBlcmZvbWluZyBpbml0aWFsIHNlZWsiKSk7CisgICAgICAgIH0KKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisKKyAgICAgICAgLyogYW5kIHdlIG5lZWQgdG8gcHVsbCBhIG5ldyBidWZmZXIgaW4gYWxsIGNhc2VzLiAqLworICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICAgICAgICBidWZmZXIgPSBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKEdfVU5MSUtFTFkgKGR2ZGVtdXgtPnBlbmRpbmdfc2VnbWVudCkpIHsKKworICAgIC8qIG5vdyBzZW5kIHRoZSBuZXdzZWdtZW50ICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZHZkZW11eCwgIlNlbmRpbmcgbmV3c2VnbWVudCBmcm9tIik7CisKKyAgICBnc3RfZHZkZW11eF9wdXNoX2V2ZW50IChkdmRlbXV4LCBkdmRlbXV4LT5wZW5kaW5nX3NlZ21lbnQpOworICAgIGR2ZGVtdXgtPnBlbmRpbmdfc2VnbWVudCA9IE5VTEw7CisgIH0KKworICBpZiAoR19MSUtFTFkgKGJ1ZmZlciA9PSBOVUxMKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR2ZGVtdXgsICJwdWxsaW5nIGJ1ZmZlciBhdCBvZmZzZXQgJSIgR19HSU5UNjRfRk9STUFULAorICAgICAgICBkdmRlbXV4LT5ieXRlX3NlZ21lbnQucG9zaXRpb24pOworCisgICAgcmV0ID0gZ3N0X3BhZF9wdWxsX3JhbmdlIChkdmRlbXV4LT5zaW5rcGFkLAorICAgICAgICBkdmRlbXV4LT5ieXRlX3NlZ21lbnQucG9zaXRpb24sIGR2ZGVtdXgtPmZyYW1lX2xlbiwgJmJ1ZmZlcik7CisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgIGdvdG8gcGF1c2U7CisKKyAgICAvKiBjaGVjayBidWZmZXIgc2l6ZSwgZG9uJ3Qgd2FudCB0byByZWFkIHNtYWxsIGJ1ZmZlcnMgKi8KKyAgICBpZiAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSA8IGR2ZGVtdXgtPmZyYW1lX2xlbikKKyAgICAgIGdvdG8gc21hbGxfYnVmZmVyOworICB9CisgIC8qIGFuZCBkZWNvZGUgdGhlIGJ1ZmZlciAqLworICByZXQgPSBnc3RfZHZkZW11eF9kZW11eF9mcmFtZSAoZHZkZW11eCwgYnVmZmVyKTsKKyAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSykpCisgICAgZ290byBwYXVzZTsKKworICAvKiBhbmQgcG9zaXRpb24gb3Vyc2VsdmVzIGZvciB0aGUgbmV4dCBidWZmZXIgKi8KKyAgZHZkZW11eC0+Ynl0ZV9zZWdtZW50LnBvc2l0aW9uICs9IGR2ZGVtdXgtPmZyYW1lX2xlbjsKKworZG9uZToKKyAgZ3N0X29iamVjdF91bnJlZiAoZHZkZW11eCk7CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworcGFyc2VfaGVhZGVyX2Vycm9yOgorICB7CisgICAgR3N0RXZlbnQgKmV2ZW50OworCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGR2ZGVtdXgsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiRXJyb3IgcGFyc2luZyBEViBoZWFkZXIiKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICBnc3RfcGFkX3BhdXNlX3Rhc2sgKGR2ZGVtdXgtPnNpbmtwYWQpOworICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19lb3MgKCk7CisgICAgaWYgKGR2ZGVtdXgtPnNlZ21lbnRfc2VxbnVtKQorICAgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGV2ZW50LCBkdmRlbXV4LT5zZWdtZW50X3NlcW51bSk7CisgICAgZ3N0X2R2ZGVtdXhfcHVzaF9ldmVudCAoZHZkZW11eCwgZXZlbnQpOworICAgIGdvdG8gZG9uZTsKKyAgfQorc21hbGxfYnVmZmVyOgorICB7CisgICAgR3N0RXZlbnQgKmV2ZW50OworCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGR2ZGVtdXgsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiRXJyb3IgcmVhZGluZyBidWZmZXIiKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICBnc3RfcGFkX3BhdXNlX3Rhc2sgKGR2ZGVtdXgtPnNpbmtwYWQpOworICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19lb3MgKCk7CisgICAgaWYgKGR2ZGVtdXgtPnNlZ21lbnRfc2VxbnVtKQorICAgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGV2ZW50LCBkdmRlbXV4LT5zZWdtZW50X3NlcW51bSk7CisgICAgZ3N0X2R2ZGVtdXhfcHVzaF9ldmVudCAoZHZkZW11eCwgZXZlbnQpOworICAgIGdvdG8gZG9uZTsKKyAgfQorcGF1c2U6CisgIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGR2ZGVtdXgsICJwYXVzaW5nIHRhc2ssICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworICAgIGdzdF9wYWRfcGF1c2VfdGFzayAoZHZkZW11eC0+c2lua3BhZCk7CisgICAgaWYgKHJldCA9PSBHU1RfRkxPV19FT1MpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChkdmRlbXV4LCAiZ290IGVvcyIpOworICAgICAgLyogc28gYWxpZ24gb3VyIHBvc2l0aW9uIHdpdGggdGhlIGVuZCBvZiBpdCwgaWYgdGhlcmUgaXMgb25lCisgICAgICAgKiB0aGlzIGVuc3VyZXMgYSBzdWJzZXF1ZW50IHdpbGwgYXJyaXZlIGF0IGNvcnJlY3QgYmFzZS9hY2MgdGltZSAqLworICAgICAgaWYgKGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5yYXRlID4gMC4wICYmCisgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5zdG9wKSkKKyAgICAgICAgZHZkZW11eC0+dGltZV9zZWdtZW50LnBvc2l0aW9uID0gZHZkZW11eC0+dGltZV9zZWdtZW50LnN0b3A7CisgICAgICBlbHNlIGlmIChkdmRlbXV4LT50aW1lX3NlZ21lbnQucmF0ZSA8IDAuMCkKKyAgICAgICAgZHZkZW11eC0+dGltZV9zZWdtZW50LnBvc2l0aW9uID0gZHZkZW11eC0+dGltZV9zZWdtZW50LnN0YXJ0OworICAgICAgLyogcGVyZm9ybSBFT1MgbG9naWMgKi8KKyAgICAgIGlmIChkdmRlbXV4LT50aW1lX3NlZ21lbnQuZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NFR01FTlQpIHsKKyAgICAgICAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKyAgICAgICAgR3N0RXZlbnQgKmV2ZW50OworCisgICAgICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50X2RvbmUgKGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5mb3JtYXQsCisgICAgICAgICAgICBkdmRlbXV4LT50aW1lX3NlZ21lbnQucG9zaXRpb24pOworICAgICAgICBpZiAoZHZkZW11eC0+c2VnbWVudF9zZXFudW0pCisgICAgICAgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGV2ZW50LCBkdmRlbXV4LT5zZWdtZW50X3NlcW51bSk7CisKKyAgICAgICAgbWVzc2FnZSA9IGdzdF9tZXNzYWdlX25ld19zZWdtZW50X2RvbmUgKEdTVF9PQkpFQ1RfQ0FTVCAoZHZkZW11eCksCisgICAgICAgICAgICBkdmRlbXV4LT50aW1lX3NlZ21lbnQuZm9ybWF0LCBkdmRlbXV4LT50aW1lX3NlZ21lbnQucG9zaXRpb24pOworICAgICAgICBpZiAoZHZkZW11eC0+c2VnbWVudF9zZXFudW0pCisgICAgICAgICAgZ3N0X21lc3NhZ2Vfc2V0X3NlcW51bSAobWVzc2FnZSwgZHZkZW11eC0+c2VnbWVudF9zZXFudW0pOworCisgICAgICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKGR2ZGVtdXgpLCBtZXNzYWdlKTsKKyAgICAgICAgZ3N0X2R2ZGVtdXhfcHVzaF9ldmVudCAoZHZkZW11eCwgZXZlbnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR3N0RXZlbnQgKmV2ZW50ID0gZ3N0X2V2ZW50X25ld19lb3MgKCk7CisgICAgICAgIGlmIChkdmRlbXV4LT5zZWdtZW50X3NlcW51bSkKKyAgICAgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZXZlbnQsIGR2ZGVtdXgtPnNlZ21lbnRfc2VxbnVtKTsKKyAgICAgICAgZ3N0X2R2ZGVtdXhfcHVzaF9ldmVudCAoZHZkZW11eCwgZXZlbnQpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAocmV0ID09IEdTVF9GTE9XX05PVF9MSU5LRUQgfHwgcmV0IDwgR1NUX0ZMT1dfRU9TKSB7CisgICAgICBHc3RFdmVudCAqZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2VvcyAoKTsKKyAgICAgIC8qIGZvciBmYXRhbCBlcnJvcnMgb3Igbm90LWxpbmtlZCB3ZSBwb3N0IGFuIGVycm9yIG1lc3NhZ2UgKi8KKyAgICAgIEdTVF9FTEVNRU5UX0ZMT1dfRVJST1IgKGR2ZGVtdXgsIHJldCk7CisgICAgICBpZiAoZHZkZW11eC0+c2VnbWVudF9zZXFudW0pCisgICAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChldmVudCwgZHZkZW11eC0+c2VnbWVudF9zZXFudW0pOworICAgICAgZ3N0X2R2ZGVtdXhfcHVzaF9ldmVudCAoZHZkZW11eCwgZXZlbnQpOworICAgIH0KKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZHZkZW11eF9zaW5rX2FjdGl2YXRlX21vZGUgKEdzdFBhZCAqIHNpbmtwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RQYWRNb2RlIG1vZGUsIGdib29sZWFuIGFjdGl2ZSkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3REVkRlbXV4ICpkZW11eCA9IEdTVF9EVkRFTVVYIChwYXJlbnQpOworCisgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgR1NUX1BBRF9NT0RFX1BVTEw6CisgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgIGRlbXV4LT5zZWVrX2hhbmRsZXIgPSBnc3RfZHZkZW11eF9oYW5kbGVfcHVsbF9zZWVrOworICAgICAgICByZXMgPSBnc3RfcGFkX3N0YXJ0X3Rhc2sgKHNpbmtwYWQsCisgICAgICAgICAgICAoR3N0VGFza0Z1bmN0aW9uKSBnc3RfZHZkZW11eF9sb29wLCBzaW5rcGFkLCBOVUxMKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlbXV4LT5zZWVrX2hhbmRsZXIgPSBOVUxMOworICAgICAgICByZXMgPSBnc3RfcGFkX3N0b3BfdGFzayAoc2lua3BhZCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9QQURfTU9ERV9QVVNIOgorICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImFjdGl2YXRpbmcgcHVzaC9jaGFpbiBmdW5jdGlvbiIpOworICAgICAgICBkZW11eC0+c2Vla19oYW5kbGVyID0gZ3N0X2R2ZGVtdXhfaGFuZGxlX3B1c2hfc2VlazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZGVhY3RpdmF0aW5nIHB1c2gvY2hhaW4gZnVuY3Rpb24iKTsKKyAgICAgICAgZGVtdXgtPnNlZWtfaGFuZGxlciA9IE5VTEw7CisgICAgICB9CisgICAgICByZXMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IEZBTFNFOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworLyogZGVjaWRlIG9uIHB1c2ggb3IgcHVsbCBiYXNlZCBzY2hlZHVsaW5nICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdmRlbXV4X3NpbmtfYWN0aXZhdGUgKEdzdFBhZCAqIHNpbmtwYWQsIEdzdE9iamVjdCAqIHBhcmVudCkKK3sKKyAgR3N0UXVlcnkgKnF1ZXJ5OworICBnYm9vbGVhbiBwdWxsX21vZGU7CisKKyAgcXVlcnkgPSBnc3RfcXVlcnlfbmV3X3NjaGVkdWxpbmcgKCk7CisKKyAgaWYgKCFnc3RfcGFkX3BlZXJfcXVlcnkgKHNpbmtwYWQsIHF1ZXJ5KSkgeworICAgIGdzdF9xdWVyeV91bnJlZiAocXVlcnkpOworICAgIGdvdG8gYWN0aXZhdGVfcHVzaDsKKyAgfQorCisgIHB1bGxfbW9kZSA9IGdzdF9xdWVyeV9oYXNfc2NoZWR1bGluZ19tb2RlX3dpdGhfZmxhZ3MgKHF1ZXJ5LAorICAgICAgR1NUX1BBRF9NT0RFX1BVTEwsIEdTVF9TQ0hFRFVMSU5HX0ZMQUdfU0VFS0FCTEUpOworICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKworICBpZiAoIXB1bGxfbW9kZSkKKyAgICBnb3RvIGFjdGl2YXRlX3B1c2g7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2lua3BhZCwgImFjdGl2YXRpbmcgcHVsbCIpOworICByZXR1cm4gZ3N0X3BhZF9hY3RpdmF0ZV9tb2RlIChzaW5rcGFkLCBHU1RfUEFEX01PREVfUFVMTCwgVFJVRSk7CisKK2FjdGl2YXRlX3B1c2g6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rcGFkLCAiYWN0aXZhdGluZyBwdXNoIik7CisgICAgcmV0dXJuIGdzdF9wYWRfYWN0aXZhdGVfbW9kZSAoc2lua3BhZCwgR1NUX1BBRF9NT0RFX1BVU0gsIFRSVUUpOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2R2ZGVtdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0RFZEZW11eCAqZHZkZW11eCA9IEdTVF9EVkRFTVVYIChlbGVtZW50KTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGR2ZGVtdXgtPmRlY29kZXIgPSBkdl9kZWNvZGVyX25ldyAoMCwgRkFMU0UsIEZBTFNFKTsKKyAgICAgIGR2X3NldF9lcnJvcl9sb2cgKGR2ZGVtdXgtPmRlY29kZXIsIE5VTEwpOworICAgICAgZ3N0X2R2ZGVtdXhfcmVzZXQgKGR2ZGVtdXgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19QTEFZSU5HOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChkdmRlbXV4LT5hZGFwdGVyKTsKKyAgICAgIGR2X2RlY29kZXJfZnJlZSAoZHZkZW11eC0+ZGVjb2Rlcik7CisgICAgICBkdmRlbXV4LT5kZWNvZGVyID0gTlVMTDsKKworICAgICAgZ3N0X2R2ZGVtdXhfcmVtb3ZlX3BhZHMgKGR2ZGVtdXgpOworCisgICAgICBpZiAoZHZkZW11eC0+dGFnX2V2ZW50KSB7CisgICAgICAgIGdzdF9ldmVudF91bnJlZiAoZHZkZW11eC0+dGFnX2V2ZW50KTsKKyAgICAgICAgZHZkZW11eC0+dGFnX2V2ZW50ID0gTlVMTDsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgeworICAgICAgR3N0RXZlbnQgKipldmVudF9wOworCisgICAgICBldmVudF9wID0gJmR2ZGVtdXgtPnNlZWtfZXZlbnQ7CisgICAgICBnc3RfZXZlbnRfcmVwbGFjZSAoZXZlbnRfcCwgTlVMTCk7CisgICAgICBpZiAoZHZkZW11eC0+cGVuZGluZ19zZWdtZW50KQorICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGR2ZGVtdXgtPnBlbmRpbmdfc2VnbWVudCk7CisgICAgICBkdmRlbXV4LT5wZW5kaW5nX3NlZ21lbnQgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZXh0L2R2L2dzdGR2ZGVtdXguaCBiL2V4dC9kdi9nc3RkdmRlbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjOTMyMAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9kdi9nc3RkdmRlbXV4LmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfRFZERU1VWF9IX18KKyNkZWZpbmUgX19HU1RfRFZERU1VWF9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxsaWJkdi9kdi5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0RWREVNVVggXAorICAoZ3N0X2R2ZGVtdXhfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0RWREVNVVgob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9EVkRFTVVYLEdzdERWRGVtdXgpKQorI2RlZmluZSBHU1RfRFZERU1VWF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9EVkRFTVVYLEdzdERWRGVtdXhDbGFzcykpCisjZGVmaW5lIEdTVF9JU19EVkRFTVVYKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfRFZERU1VWCkpCisjZGVmaW5lIEdTVF9JU19EVkRFTVVYX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0RWREVNVVgpKQorCisKK3R5cGVkZWYgc3RydWN0IF9Hc3REVkRlbXV4IEdzdERWRGVtdXg7Cit0eXBlZGVmIHN0cnVjdCBfR3N0RFZEZW11eENsYXNzIEdzdERWRGVtdXhDbGFzczsKKwordHlwZWRlZiBnYm9vbGVhbiAoKkdzdERWRGVtdXhTZWVrSGFuZGxlcikgKEdzdERWRGVtdXggKmRlbXV4LCBHc3RQYWQgKiBwYWQsIEdzdEV2ZW50ICogZXZlbnQpOworCisKK3N0cnVjdCBfR3N0RFZEZW11eCB7CisgIEdzdEVsZW1lbnQgICAgIGVsZW1lbnQ7CisKKyAgR3N0UGFkICAgICAgICAqc2lua3BhZDsKKyAgR3N0UGFkICAgICAgICAqdmlkZW9zcmNwYWQ7CisgIEdzdFBhZCAgICAgICAgKmF1ZGlvc3JjcGFkOworCisgIGdib29sZWFuICAgICAgIGhhdmVfZ3JvdXBfaWQ7CisgIGd1aW50ICAgICAgICAgIGdyb3VwX2lkOworCisgIGR2X2RlY29kZXJfdCAgKmRlY29kZXI7CisKKyAgR3N0QWRhcHRlciAgICAqYWRhcHRlcjsKKyAgZ2ludCAgICAgICAgICAgZnJhbWVfbGVuOworCisgIC8qIHZpZGVvIHBhcmFtcyAqLworICBnaW50ICAgICAgICAgICBmcmFtZXJhdGVfbnVtZXJhdG9yOworICBnaW50ICAgICAgICAgICBmcmFtZXJhdGVfZGVub21pbmF0b3I7CisgIGdpbnQgICAgICAgICAgIGhlaWdodDsKKyAgZ2Jvb2xlYW4gICAgICAgd2lkZTsKKyAgLyogYXVkaW8gcGFyYW1zICovCisgIGdpbnQgICAgICAgICAgIGZyZXF1ZW5jeTsKKyAgZ2ludCAgICAgICAgICAgY2hhbm5lbHM7CisKKyAgZ2Jvb2xlYW4gICAgICAgZGlzY29udDsKKyAgZ2ludDY0ICAgICAgICAgZnJhbWVfb2Zmc2V0OworICBnaW50NjQgICAgICAgICBhdWRpb19vZmZzZXQ7CisgIGdpbnQ2NCAgICAgICAgIHZpZGVvX29mZnNldDsKKworICBHc3REVkRlbXV4U2Vla0hhbmRsZXIgc2Vla19oYW5kbGVyOworICBHc3RTZWdtZW50ICAgICBieXRlX3NlZ21lbnQ7CisgIGdib29sZWFuICAgICAgIHVwc3RyZWFtX3RpbWVfc2VnbWVudDsKKyAgR3N0U2VnbWVudCAgICAgdGltZV9zZWdtZW50OworICBnYm9vbGVhbiAgICAgICBuZWVkX3NlZ21lbnQ7CisgIGd1aW50MzIgICAgICAgIHNlZ21lbnRfc2VxbnVtOworICBnYm9vbGVhbiAgICAgICBuZXdfbWVkaWE7CisgIGludCAgICAgICAgICAgIGZyYW1lc19zaW5jZV9uZXdfbWVkaWE7CisgIAorICBnaW50ICAgICAgICAgICBmb3VuZF9oZWFkZXI7IC8qIEFUT01JQyAqLworICBHc3RFdmVudCAgICAgICpzZWVrX2V2ZW50OworICBHc3RFdmVudAkqcGVuZGluZ19zZWdtZW50OworICBHc3RFdmVudCAgICAgICp0YWdfZXZlbnQ7CisKKyAgZ2ludDE2ICAgICAgICAqYXVkaW9fYnVmZmVyc1s0XTsKK307CisKK3N0cnVjdCBfR3N0RFZEZW11eENsYXNzIHsKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9kdmRlbXV4X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0RWREVNVVhfSF9fICovCmRpZmYgLS1naXQgYS9leHQvZHYvZ3N0c21wdGV0aW1lY29kZS5jIGIvZXh0L2R2L2dzdHNtcHRldGltZWNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjIwNGVhCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2R2L2dzdHNtcHRldGltZWNvZGUuYwpAQCAtMCwwICsxLDI0MCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kaW5nIFNNUFRFIFRpbWUgQ29kZXMsIGFzIGRlc2NyaWJlZCBpbgorICogU01QVEUgU3RhbmRhcmQgMTJNLTE5OTkuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0c21wdGV0aW1lY29kZS5oIgorCisjZGVmaW5lIE5UU0NfRlJBTUVTX1BFUl8xMF9NSU5TICgxMCo2MCozMCAtIDEwKjIgKyAyKQorI2RlZmluZSBOVFNDX0ZSQU1FU19QRVJfSE9VUiAoNipOVFNDX0ZSQU1FU19QRVJfMTBfTUlOUykKKworLyoqCisgKiBnc3Rfc21wdGVfdGltZV9jb2RlX2Zyb21fZnJhbWVfbnVtYmVyOgorICogQHN5c3RlbTogU01QVEUgVGltZSBDb2RlIHN5c3RlbQorICogQHRpbWVfY29kZTogcG9pbnRlciB0byB0aW1lIGNvZGUgc3RydWN0dXJlCisgKiBAZnJhbWVfbnVtYmVyOiBpbnRlZ2VyIGZyYW1lIG51bWJlcgorICoKKyAqIENvbnZlcnRzIGEgZnJhbWUgbnVtYmVyIHRvIGEgdGltZSBjb2RlLgorICoKKyAqIFJldHVybnM6IFRSVUUgaWYgdGhlIGNvbnZlcnNpb24gd2FzIHN1Y2Nlc3NmdWwKKyAqLworZ2Jvb2xlYW4KK2dzdF9zbXB0ZV90aW1lX2NvZGVfZnJvbV9mcmFtZV9udW1iZXIgKEdzdFNNUFRFVGltZUNvZGVTeXN0ZW0gc3lzdGVtLAorICAgIEdzdFNNUFRFVGltZUNvZGUgKiB0aW1lX2NvZGUsIGludCBmcmFtZV9udW1iZXIpCit7CisgIGludCB0ZW5fbWluczsKKyAgaW50IG47CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHRpbWVfY29kZSAhPSBOVUxMLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfU01QVEVfVElNRV9DT0RFX1NZU1RFTV9JU19WQUxJRCAoc3lzdGVtKSwgRkFMU0UpOworCisgIHRpbWVfY29kZS0+aG91cnMgPSA5OTsKKyAgdGltZV9jb2RlLT5taW51dGVzID0gOTk7CisgIHRpbWVfY29kZS0+c2Vjb25kcyA9IDk5OworICB0aW1lX2NvZGUtPmZyYW1lcyA9IDk5OworCisgIGlmIChmcmFtZV9udW1iZXIgPCAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBzd2l0Y2ggKHN5c3RlbSkgeworICAgIGNhc2UgR1NUX1NNUFRFX1RJTUVfQ09ERV9TWVNURU1fMzA6CisgICAgICBpZiAoZnJhbWVfbnVtYmVyID49IDI0ICogTlRTQ19GUkFNRVNfUEVSX0hPVVIpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgdGVuX21pbnMgPSBmcmFtZV9udW1iZXIgLyBOVFNDX0ZSQU1FU19QRVJfMTBfTUlOUzsKKyAgICAgIGZyYW1lX251bWJlciAtPSB0ZW5fbWlucyAqIE5UU0NfRlJBTUVTX1BFUl8xMF9NSU5TOworCisgICAgICB0aW1lX2NvZGUtPmhvdXJzID0gdGVuX21pbnMgLyA2OworICAgICAgdGltZV9jb2RlLT5taW51dGVzID0gMTAgKiAodGVuX21pbnMgJSA2KTsKKworICAgICAgaWYgKGZyYW1lX251bWJlciA8IDIpIHsKKyAgICAgICAgLyogdHJlYXQgdGhlIGZpcnN0IHR3byBmcmFtZXMgb2YgZWFjaCB0ZW4gbWludXRlcyBzcGVjaWFsbHkgKi8KKyAgICAgICAgdGltZV9jb2RlLT5zZWNvbmRzID0gMDsKKyAgICAgICAgdGltZV9jb2RlLT5mcmFtZXMgPSBmcmFtZV9udW1iZXI7CisgICAgICB9IGVsc2UgeworICAgICAgICBuID0gKGZyYW1lX251bWJlciAtIDIpIC8gKDYwICogMzAgLSAyKTsKKyAgICAgICAgdGltZV9jb2RlLT5taW51dGVzICs9IG47CisgICAgICAgIGZyYW1lX251bWJlciAtPSBuICogKDYwICogMzAgLSAyKTsKKworICAgICAgICB0aW1lX2NvZGUtPnNlY29uZHMgPSBmcmFtZV9udW1iZXIgLyAzMDsKKyAgICAgICAgdGltZV9jb2RlLT5mcmFtZXMgPSBmcmFtZV9udW1iZXIgJSAzMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NNUFRFX1RJTUVfQ09ERV9TWVNURU1fMjU6CisgICAgICBpZiAoZnJhbWVfbnVtYmVyID49IDI0ICogNjAgKiA2MCAqIDI1KQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHRpbWVfY29kZS0+ZnJhbWVzID0gZnJhbWVfbnVtYmVyICUgMjU7CisgICAgICBmcmFtZV9udW1iZXIgLz0gMjU7CisgICAgICB0aW1lX2NvZGUtPnNlY29uZHMgPSBmcmFtZV9udW1iZXIgJSA2MDsKKyAgICAgIGZyYW1lX251bWJlciAvPSA2MDsKKyAgICAgIHRpbWVfY29kZS0+bWludXRlcyA9IGZyYW1lX251bWJlciAlIDYwOworICAgICAgZnJhbWVfbnVtYmVyIC89IDYwOworICAgICAgdGltZV9jb2RlLT5ob3VycyA9IGZyYW1lX251bWJlcjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NNUFRFX1RJTUVfQ09ERV9TWVNURU1fMjQ6CisgICAgICBpZiAoZnJhbWVfbnVtYmVyID49IDI0ICogNjAgKiA2MCAqIDI0KQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHRpbWVfY29kZS0+ZnJhbWVzID0gZnJhbWVfbnVtYmVyICUgMjQ7CisgICAgICBmcmFtZV9udW1iZXIgLz0gMjQ7CisgICAgICB0aW1lX2NvZGUtPnNlY29uZHMgPSBmcmFtZV9udW1iZXIgJSA2MDsKKyAgICAgIGZyYW1lX251bWJlciAvPSA2MDsKKyAgICAgIHRpbWVfY29kZS0+bWludXRlcyA9IGZyYW1lX251bWJlciAlIDYwOworICAgICAgZnJhbWVfbnVtYmVyIC89IDYwOworICAgICAgdGltZV9jb2RlLT5ob3VycyA9IGZyYW1lX251bWJlcjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogZ3N0X3NtcHRlX3RpbWVfY29kZV9pc192YWxpZDoKKyAqIEBzeXN0ZW06IFNNUFRFIFRpbWUgQ29kZSBzeXN0ZW0KKyAqIEB0aW1lX2NvZGU6IHBvaW50ZXIgdG8gdGltZSBjb2RlIHN0cnVjdHVyZQorICoKKyAqIENoZWNrcyB0aGF0IHRoZSB0aW1lIGNvZGUgcmVwcmVzZW50cyBhIHZhbGlkIHRpbWUgY29kZS4KKyAqCisgKiBSZXR1cm5zOiBUUlVFIGlmIHRoZSB0aW1lIGNvZGUgaXMgdmFsaWQKKyAqLworZ2Jvb2xlYW4KK2dzdF9zbXB0ZV90aW1lX2NvZGVfaXNfdmFsaWQgKEdzdFNNUFRFVGltZUNvZGVTeXN0ZW0gc3lzdGVtLAorICAgIEdzdFNNUFRFVGltZUNvZGUgKiB0aW1lX2NvZGUpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsICh0aW1lX2NvZGUgIT0gTlVMTCwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX1NNUFRFX1RJTUVfQ09ERV9TWVNURU1fSVNfVkFMSUQgKHN5c3RlbSksIEZBTFNFKTsKKworICBpZiAodGltZV9jb2RlLT5ob3VycyA8IDAgfHwgdGltZV9jb2RlLT5ob3VycyA+PSAyNCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICh0aW1lX2NvZGUtPm1pbnV0ZXMgPCAwIHx8IHRpbWVfY29kZS0+bWludXRlcyA+PSA2MCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICh0aW1lX2NvZGUtPnNlY29uZHMgPCAwIHx8IHRpbWVfY29kZS0+c2Vjb25kcyA+PSA2MCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICh0aW1lX2NvZGUtPmZyYW1lcyA8IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIHN3aXRjaCAoc3lzdGVtKSB7CisgICAgY2FzZSBHU1RfU01QVEVfVElNRV9DT0RFX1NZU1RFTV8zMDoKKyAgICAgIGlmICh0aW1lX2NvZGUtPmZyYW1lcyA+PSAzMCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgaWYgKHRpbWVfY29kZS0+ZnJhbWVzID49IDIgfHwgdGltZV9jb2RlLT5zZWNvbmRzID4gMCkKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBpZiAodGltZV9jb2RlLT5taW51dGVzICUgMTAgIT0gMCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU01QVEVfVElNRV9DT0RFX1NZU1RFTV8yNToKKyAgICAgIGlmICh0aW1lX2NvZGUtPmZyYW1lcyA+PSAyNSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU01QVEVfVElNRV9DT0RFX1NZU1RFTV8yNDoKKyAgICAgIGlmICh0aW1lX2NvZGUtPmZyYW1lcyA+PSAyNCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogZ3N0X3NtcHRlX3RpbWVfZ2V0X2ZyYW1lX251bWJlcjoKKyAqIEBzeXN0ZW06IFNNUFRFIFRpbWUgQ29kZSBzeXN0ZW0KKyAqIEBmcmFtZV9udW1iZXI6IHBvaW50ZXIgdG8gZnJhbWUgbnVtYmVyCisgKiBAdGltZV9jb2RlOiBwb2ludGVyIHRvIHRpbWUgY29kZSBzdHJ1Y3R1cmUKKyAqCisgKiBDb252ZXJ0cyB0aGUgdGltZSBjb2RlIHN0cnVjdHVyZSB0byBhIGxpbmVhciBmcmFtZSBudW1iZXIuCisgKgorICogUmV0dXJuczogVFJVRSBpZiB0aGUgdGltZSBjb2RlIGNvdWxkIGJlIGNvbnZlcnRlZAorICovCitnYm9vbGVhbgorZ3N0X3NtcHRlX3RpbWVfY29kZV9nZXRfZnJhbWVfbnVtYmVyIChHc3RTTVBURVRpbWVDb2RlU3lzdGVtIHN5c3RlbSwKKyAgICBpbnQgKmZyYW1lX251bWJlciwgR3N0U01QVEVUaW1lQ29kZSAqIHRpbWVfY29kZSkKK3sKKyAgaW50IGZyYW1lID0gMDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX1NNUFRFX1RJTUVfQ09ERV9TWVNURU1fSVNfVkFMSUQgKHN5c3RlbSksIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHRpbWVfY29kZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgaWYgKCFnc3Rfc21wdGVfdGltZV9jb2RlX2lzX3ZhbGlkIChzeXN0ZW0sIHRpbWVfY29kZSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBzd2l0Y2ggKHN5c3RlbSkgeworICAgIGNhc2UgR1NUX1NNUFRFX1RJTUVfQ09ERV9TWVNURU1fMzA6CisgICAgICBmcmFtZSA9IHRpbWVfY29kZS0+aG91cnMgKiBOVFNDX0ZSQU1FU19QRVJfSE9VUjsKKyAgICAgIGZyYW1lICs9ICh0aW1lX2NvZGUtPm1pbnV0ZXMgLyAxMCkgKiBOVFNDX0ZSQU1FU19QRVJfMTBfTUlOUzsKKyAgICAgIGZyYW1lICs9ICh0aW1lX2NvZGUtPm1pbnV0ZXMgJSAxMCkgKiAoMzAgKiA2MCAtIDIpOworICAgICAgZnJhbWUgKz0gdGltZV9jb2RlLT5zZWNvbmRzICogMzA7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNXzI1OgorICAgICAgdGltZV9jb2RlLT5mcmFtZXMgPQorICAgICAgICAgIDI1ICogKCh0aW1lX2NvZGUtPmhvdXJzICogNjAgKyB0aW1lX2NvZGUtPm1pbnV0ZXMpICogNjAgKworICAgICAgICAgIHRpbWVfY29kZS0+c2Vjb25kcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNXzI0OgorICAgICAgdGltZV9jb2RlLT5mcmFtZXMgPQorICAgICAgICAgIDI0ICogKCh0aW1lX2NvZGUtPmhvdXJzICogNjAgKyB0aW1lX2NvZGUtPm1pbnV0ZXMpICogNjAgKworICAgICAgICAgIHRpbWVfY29kZS0+c2Vjb25kcyk7CisgICAgICBicmVhazsKKyAgfQorICBmcmFtZSArPSB0aW1lX2NvZGUtPmZyYW1lczsKKworICBpZiAoZnJhbWVfbnVtYmVyKSB7CisgICAgKmZyYW1lX251bWJlciA9IGZyYW1lOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogZ3N0X3NtcHRlX3RpbWVfZ2V0X3RpbWVzdGFtcDoKKyAqIEBzeXN0ZW06IFNNUFRFIFRpbWUgQ29kZSBzeXN0ZW0KKyAqIEB0aW1lX2NvZGU6IHBvaW50ZXIgdG8gdGltZSBjb2RlIHN0cnVjdHVyZQorICoKKyAqIENvbnZlcnRzIHRoZSB0aW1lIGNvZGUgc3RydWN0dXJlIHRvIGEgdGltZXN0YW1wLgorICoKKyAqIFJldHVybnM6IFRpbWUgc3RhbXAgZm9yIHRpbWUgY29kZSwgb3IgR1NUX0NMT0NLX1RJTUVfTk9ORSBpZiB0aW1lCisgKiAgIGNvZGUgaXMgaW52YWxpZC4KKyAqLworR3N0Q2xvY2tUaW1lCitnc3Rfc21wdGVfdGltZV9jb2RlX2dldF90aW1lc3RhbXAgKEdzdFNNUFRFVGltZUNvZGVTeXN0ZW0gc3lzdGVtLAorICAgIEdzdFNNUFRFVGltZUNvZGUgKiB0aW1lX2NvZGUpCit7CisgIGludCBmcmFtZV9udW1iZXI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNX0lTX1ZBTElEIChzeXN0ZW0pLAorICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsICh0aW1lX2NvZGUgIT0gTlVMTCwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisKKyAgaWYgKGdzdF9zbXB0ZV90aW1lX2NvZGVfZ2V0X2ZyYW1lX251bWJlciAoc3lzdGVtLCAmZnJhbWVfbnVtYmVyLCB0aW1lX2NvZGUpKSB7CisgICAgc3RhdGljIGNvbnN0IGludCBmcmFtZXJhdGVfblszXSA9IHsgMzAwMCwgMjUsIDI0IH07CisgICAgc3RhdGljIGNvbnN0IGludCBmcmFtZXJhdGVfZFszXSA9IHsgMTAwMSwgMSwgMSB9OworCisgICAgcmV0dXJuIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoZnJhbWVfbnVtYmVyLAorICAgICAgICBHU1RfU0VDT05EICogZnJhbWVyYXRlX2Rbc3lzdGVtXSwgZnJhbWVyYXRlX25bc3lzdGVtXSk7CisgIH0KKworICByZXR1cm4gR1NUX0NMT0NLX1RJTUVfTk9ORTsKK30KZGlmZiAtLWdpdCBhL2V4dC9kdi9nc3RzbXB0ZXRpbWVjb2RlLmggYi9leHQvZHYvZ3N0c21wdGV0aW1lY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNDIwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZHYvZ3N0c21wdGV0aW1lY29kZS5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA5IERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0dTVF9TTVBURV9USU1FX0NPREVfSF8KKyNkZWZpbmUgX0dTVF9TTVBURV9USU1FX0NPREVfSF8KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0U01QVEVUaW1lQ29kZSBHc3RTTVBURVRpbWVDb2RlOworCisvKioKKyAqIEdzdFNNUFRFVGltZUNvZGU6CisgKiBAR1NUX1NNUFRFX1RJTUVfQ09ERV9TWVNURU1fMzA6IDI5Ljk3IGZyYW1lIHBlciBzZWNvbmQgc3lzdGVtIChOVFNDKQorICogQEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNXzI1OiAyNSBmcmFtZSBwZXIgc2Vjb25kIHN5c3RlbSAoUEFMKQorICogQEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNXzI0OiAyNCBmcmFtZSBwZXIgc2Vjb25kIHN5c3RlbQorICoKKyAqIEVudW0gdmFsdWUgcmVwcmVzZW50aW5nIFNNUFRFIFRpbWUgQ29kZSBzeXN0ZW0uCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNXzMwID0gMCwKKyAgR1NUX1NNUFRFX1RJTUVfQ09ERV9TWVNURU1fMjUsCisgIEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNXzI0Cit9IEdzdFNNUFRFVGltZUNvZGVTeXN0ZW07CisKK3N0cnVjdCBfR3N0U01QVEVUaW1lQ29kZSB7CisgIGludCBob3VyczsKKyAgaW50IG1pbnV0ZXM7CisgIGludCBzZWNvbmRzOworICBpbnQgZnJhbWVzOworfTsKKworI2RlZmluZSBHU1RfU01QVEVfVElNRV9DT0RFX1NZU1RFTV9JU19WQUxJRCh4KSBcCisgICgoeCkgPj0gR1NUX1NNUFRFX1RJTUVfQ09ERV9TWVNURU1fMzAgJiYgKHgpIDw9IEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNXzI0KQorCisjZGVmaW5lIEdTVF9TTVBURV9USU1FX0NPREVfRk9STUFUICIwMmQ6JTAyZDolMDJkOiUwMmQiCisjZGVmaW5lIEdTVF9TTVBURV9USU1FX0NPREVfQVJHUyh0aW1lY29kZSkgXAorICAodGltZWNvZGUpLT5ob3VycywgKHRpbWVjb2RlKS0+bWludXRlcywgXAorICAodGltZWNvZGUpLT5zZWNvbmRzLCAodGltZWNvZGUpLT5mcmFtZXMKKworZ2Jvb2xlYW4gZ3N0X3NtcHRlX3RpbWVfY29kZV9pc192YWxpZCAoR3N0U01QVEVUaW1lQ29kZVN5c3RlbSBzeXN0ZW0sCisgICAgR3N0U01QVEVUaW1lQ29kZSAqdGltZV9jb2RlKTsKK2dib29sZWFuIGdzdF9zbXB0ZV90aW1lX2NvZGVfZnJvbV9mcmFtZV9udW1iZXIgKEdzdFNNUFRFVGltZUNvZGVTeXN0ZW0gc3lzdGVtLAorICAgIEdzdFNNUFRFVGltZUNvZGUgKnRpbWVfY29kZSwgaW50IGZyYW1lX251bWJlcik7CitnYm9vbGVhbiBnc3Rfc21wdGVfdGltZV9jb2RlX2dldF9mcmFtZV9udW1iZXIgKEdzdFNNUFRFVGltZUNvZGVTeXN0ZW0gc3lzdGVtLAorICAgIGludCAqZnJhbWVfbnVtYmVyLCBHc3RTTVBURVRpbWVDb2RlICp0aW1lX2NvZGUpOworR3N0Q2xvY2tUaW1lIGdzdF9zbXB0ZV90aW1lX2NvZGVfZ2V0X3RpbWVzdGFtcCAoR3N0U01QVEVUaW1lQ29kZVN5c3RlbSBzeXN0ZW0sCisgICAgR3N0U01QVEVUaW1lQ29kZSAqdGltZV9jb2RlKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2V4dC9kdi9tZXNvbi5idWlsZCBiL2V4dC9kdi9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDBhYTA4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2R2L21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMjUgQEAKK2R2X3NvdXJjZXMgPSBbCisgICdnc3Rkdi5jJywKKyAgJ2dzdGR2ZGVjLmMnLAorICAnZ3N0ZHZkZW11eC5jJywKKyAgJ2dzdHNtcHRldGltZWNvZGUuYycsCisgICdzbXB0ZV90ZXN0LmMnLAorXQorCitkdl9kZXAgPSBkZXBlbmRlbmN5KCdsaWJkdicsIHZlcnNpb24gOiAnPj0gMC4xMDAnLCByZXF1aXJlZCA6IGZhbHNlKQorCitpZiBkdl9kZXAuZm91bmQoKQorICBnc3RkdiA9IGxpYnJhcnkoJ2dzdGR2JywKKyAgICBkdl9zb3VyY2VzLAorICAgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luYywgbGlic2luY10sCisgICAgZGVwZW5kZW5jaWVzIDogW2dzdGJhc2VfZGVwLCBnc3R0YWdfZGVwLCBnc3RhdWRpb19kZXAsIGdzdHZpZGVvX2RlcCwgZHZfZGVwXSwKKyAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCisgICkKKworICAjZXhlY3V0YWJsZSgnc21wdGVfdGVzdCcsCisgICMgICdzbXB0ZV90ZXN0LmMnLCAnZ3N0c21wdGV0aW1lY29kZS5jJywKKyAgIyAgZGVwZW5kZW5jaWVzIDogW2dzdGJhc2VfZGVwLCBnc3R0YWdfZGVwLCBnc3RhdWRpb19kZXAsIGdzdHZpZGVvX2RlcCwgZHZfZGVwXSwKKyAgIyAgaW5zdGFsbCA6IGZhbHNlKQorZW5kaWYKZGlmZiAtLWdpdCBhL2V4dC9kdi9zbXB0ZV90ZXN0LmMgYi9leHQvZHYvc21wdGVfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxODExM2MKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZHYvc21wdGVfdGVzdC5jCkBAIC0wLDAgKzEsODEgQEAKKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAiZ3N0c21wdGV0aW1lY29kZS5oIgorCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjZGVmaW5lIE5UU0NfRlJBTUVTX1BFUl8xMF9NSU5TICgxMCo2MCozMCAtIDEwKjIgKyAyKQorI2RlZmluZSBOVFNDX0ZSQU1FU19QRVJfSE9VUiAoNipOVFNDX0ZSQU1FU19QRVJfMTBfTUlOUykKKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIEdzdFNNUFRFVGltZUNvZGUgdGM7CisgIGludCBpOworICBpbnQgbWluOworCisgIGZvciAobWluID0gMDsgbWluIDwgMzsgbWluKyspIHsKKyAgICBnX3ByaW50ICgiLS0tIG1pbnV0ZSAlZCAtLS1cbiIsIG1pbik7CisgICAgZm9yIChpID0gbWluICogNjAgKiAzMCAtIDU7IGkgPD0gbWluICogNjAgKiAzMCArIDU7IGkrKykgeworICAgICAgZ3N0X3NtcHRlX3RpbWVfY29kZV9mcm9tX2ZyYW1lX251bWJlciAoR1NUX1NNUFRFX1RJTUVfQ09ERV9TWVNURU1fMzAsICZ0YywKKyAgICAgICAgICBpKTsKKyAgICAgIGdfcHJpbnQgKCIlZCAlMDJkOiUwMmQ6JTAyZDolMDJkXG4iLCBpLCB0Yy5ob3VycywgdGMubWludXRlcywgdGMuc2Vjb25kcywKKyAgICAgICAgICB0Yy5mcmFtZXMpOworICAgIH0KKyAgfQorCisgIGZvciAobWluID0gOTsgbWluIDwgMTI7IG1pbisrKSB7CisgICAgZ19wcmludCAoIi0tLSBtaW51dGUgJWQgLS0tXG4iLCBtaW4pOworICAgIGZvciAoaSA9IG1pbiAqIDYwICogMzAgLSA1IC0gMTg7IGkgPD0gbWluICogNjAgKiAzMCArIDUgLSAxODsgaSsrKSB7CisgICAgICBnc3Rfc21wdGVfdGltZV9jb2RlX2Zyb21fZnJhbWVfbnVtYmVyIChHU1RfU01QVEVfVElNRV9DT0RFX1NZU1RFTV8zMCwgJnRjLAorICAgICAgICAgIGkpOworICAgICAgZ19wcmludCAoIiVkICUwMmQ6JTAyZDolMDJkOiUwMmRcbiIsIGksIHRjLmhvdXJzLCB0Yy5taW51dGVzLCB0Yy5zZWNvbmRzLAorICAgICAgICAgIHRjLmZyYW1lcyk7CisgICAgfQorICB9CisKKyAgZm9yIChtaW4gPSAtMTsgbWluIDwgMjsgbWluKyspIHsKKyAgICBpbnQgb2Zmc2V0ID0gTlRTQ19GUkFNRVNfUEVSX0hPVVI7CisKKyAgICBnX3ByaW50ICgiLS0tIG1pbnV0ZSAlZCAtLS1cbiIsIG1pbik7CisgICAgZm9yIChpID0gb2Zmc2V0ICsgbWluICogNjAgKiAzMCAtIDU7IGkgPD0gb2Zmc2V0ICsgbWluICogNjAgKiAzMCArIDU7IGkrKykgeworICAgICAgZ3N0X3NtcHRlX3RpbWVfY29kZV9mcm9tX2ZyYW1lX251bWJlciAoR1NUX1NNUFRFX1RJTUVfQ09ERV9TWVNURU1fMzAsICZ0YywKKyAgICAgICAgICBpKTsKKyAgICAgIGdfcHJpbnQgKCIlZCAlMDJkOiUwMmQ6JTAyZDolMDJkXG4iLCBpLCB0Yy5ob3VycywgdGMubWludXRlcywgdGMuc2Vjb25kcywKKyAgICAgICAgICB0Yy5mcmFtZXMpOworICAgIH0KKyAgfQorCisgIGZvciAobWluID0gMDsgbWluIDwgMTsgbWluKyspIHsKKyAgICBpbnQgb2Zmc2V0ID0gTlRTQ19GUkFNRVNfUEVSX0hPVVI7CisKKyAgICBnX3ByaW50ICgiLS0tIG1pbnV0ZSAlZCAtLS1cbiIsIG1pbik7CisgICAgZm9yIChpID0gMjQgKiBvZmZzZXQgLSA1OyBpIDw9IDI0ICogb2Zmc2V0ICsgNTsgaSsrKSB7CisgICAgICBnc3Rfc21wdGVfdGltZV9jb2RlX2Zyb21fZnJhbWVfbnVtYmVyIChHU1RfU01QVEVfVElNRV9DT0RFX1NZU1RFTV8zMCwgJnRjLAorICAgICAgICAgIGkpOworICAgICAgZ19wcmludCAoIiVkICUwMmQ6JTAyZDolMDJkOiUwMmRcbiIsIGksIHRjLmhvdXJzLCB0Yy5taW51dGVzLCB0Yy5zZWNvbmRzLAorICAgICAgICAgIHRjLmZyYW1lcyk7CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IDI0ICogTlRTQ19GUkFNRVNfUEVSX0hPVVI7IGkrKykgeworICAgIGludCBmbjsKKyAgICBpbnQgcmV0OworCisgICAgZ3N0X3NtcHRlX3RpbWVfY29kZV9mcm9tX2ZyYW1lX251bWJlciAoR1NUX1NNUFRFX1RJTUVfQ09ERV9TWVNURU1fMzAsICZ0YywKKyAgICAgICAgaSk7CisKKyAgICByZXQgPSBnc3Rfc21wdGVfdGltZV9jb2RlX2dldF9mcmFtZV9udW1iZXIgKEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNXzMwLAorICAgICAgICAmZm4sICZ0Yyk7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgIGdfcHJpbnQgKCJiYWQgdmFsaWQgYXQgJWRcbiIsIGkpOworICAgIH0KKyAgICBpZiAoZm4gIT0gaSkgeworICAgICAgZ19wcmludCAoImluZGV4IG1pc21hdGNoICVkICE9ICVkXG4iLCBmbiwgaSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9leHQvZmxhYy9NYWtlZmlsZS5hbSBiL2V4dC9mbGFjL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NDk1NWMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZmxhYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEyIEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RmbGFjLmxhCisKK2xpYmdzdGZsYWNfbGFfU09VUkNFUyA9IGdzdGZsYWMuYyBnc3RmbGFjZGVjLmMgZ3N0ZmxhY2VuYy5jIGdzdGZsYWN0YWcuYworbGliZ3N0ZmxhY19sYV9DRkxBR1MgPSAtREdTVF9VU0VfVU5TVEFCTEVfQVBJIFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKEZMQUNfQ0ZMQUdTKQorbGliZ3N0ZmxhY19sYV9MSUJBREQgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0dGFnLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJLWxnc3RhdWRpby0kKEdTVF9BUElfVkVSU0lPTikgXAorCSQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykgJChGTEFDX0xJQlMpCitsaWJnc3RmbGFjX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3RmbGFjZW5jLmggZ3N0ZmxhY2RlYy5oIGdzdGZsYWN0YWcuaApkaWZmIC0tZ2l0IGEvZXh0L2ZsYWMvZ3N0ZmxhYy5jIGIvZXh0L2ZsYWMvZ3N0ZmxhYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiODhiMmEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZmxhYy9nc3RmbGFjLmMKQEAgLTAsMCArMSw2MCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdGZsYWNlbmMuaCIKKyNpbmNsdWRlICJnc3RmbGFjZGVjLmgiCisjaW5jbHVkZSAiZ3N0ZmxhY3RhZy5oIgorCisjaW5jbHVkZSA8Z3N0L3RhZy90YWcuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0LWkxOG4tcGx1Z2luLmg+CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyNpZmRlZiBFTkFCTEVfTkxTCisgIEdTVF9ERUJVRyAoImJpbmRpbmcgdGV4dCBkb21haW4gJXMgdG8gbG9jYWxlIGRpciAlcyIsIEdFVFRFWFRfUEFDS0FHRSwKKyAgICAgIExPQ0FMRURJUik7CisgIGJpbmR0ZXh0ZG9tYWluIChHRVRURVhUX1BBQ0tBR0UsIExPQ0FMRURJUik7CisgIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChHRVRURVhUX1BBQ0tBR0UsICJVVEYtOCIpOworI2VuZGlmCisKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiZmxhY2VuYyIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICAgICAgR1NUX1RZUEVfRkxBQ19FTkMpKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiZmxhY2RlYyIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICAgICAgR1NUX1RZUEVfRkxBQ19ERUMpKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiZmxhY3RhZyIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICAgICAgZ3N0X2ZsYWNfdGFnX2dldF90eXBlICgpKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZ3N0X3RhZ19yZWdpc3Rlcl9tdXNpY2JyYWluel90YWdzICgpOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgZmxhYywKKyAgICAiVGhlIEZMQUMgTG9zc2xlc3MgY29tcHJlc3NvciBDb2RlYyIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jIGIvZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZjE5ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZmxhYy9nc3RmbGFjZGVjLmMKQEAgLTAsMCArMSw4MTYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDYsMjAxMT4gVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IEphbiBTY2htaWR0IDx0aGF5dGFuIGF0IG1hZCBzY2llbnRpc3QgY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWZsYWNkZWMKKyAqIEBzZWVfYWxzbzogI0dzdEZsYWNFbmMKKyAqCisgKiBmbGFjZGVjIGRlY29kZXMgRkxBQyBzdHJlYW1zLgorICogPHVsaW5rIHVybD0iaHR0cDovL2ZsYWMuc291cmNlZm9yZ2UubmV0LyI+RkxBQzwvdWxpbms+CisgKiBpcyBhIEZyZWUgTG9zc2xlc3MgQXVkaW8gQ29kZWMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGZpbGVzcmMgbG9jYXRpb249bWVkaWEvc21hbGwvZGFyay40NDEtMTYtcy5mbGFjICEgZmxhY3BhcnNlICEgZmxhY2RlYyAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhdXRvYXVkaW9zaW5rCisgKiBdfAorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHNvdXBodHRwc3JjIGxvY2F0aW9uPWh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL21lZGlhL3NtYWxsL2RhcmsuNDQxLTE2LXMuZmxhYyAhIGZsYWNwYXJzZSAhIGZsYWNkZWMgISBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgcXVldWUgbWluLXRocmVzaG9sZC1idWZmZXJzPTEwICEgYXV0b2F1ZGlvc2luaworICogXXwKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RmbGFjZGVjLmgiCisjaW5jbHVkZSA8Z3N0L2dzdC1pMThuLXBsdWdpbi5oPgorI2luY2x1ZGUgPGdzdC90YWcvdGFnLmg+CisKKy8qIFRha2VuIGZyb20gaHR0cDovL2ZsYWMuc291cmNlZm9yZ2UubmV0L2Zvcm1hdC5odG1sI2ZyYW1lX2hlYWRlciAqLworc3RhdGljIGNvbnN0IEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIGNoYW5uZWxfcG9zaXRpb25zWzhdWzhdID0geworICB7R1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTU9OT30sCisgIHtHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFR9LCB7CisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULAorICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSfSwgeworICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZULAorICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVH0sIHsKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZULAorICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVH0sIHsKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMSwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZULAorICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVH0sCisgIC8qIEZJWE1FOiA3LzggY2hhbm5lbCBsYXlvdXRzIGFyZSBub3QgZGVmaW5lZCBpbiB0aGUgRkxBQyBzcGVjcyAqLworICB7CisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0xFRlQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfUklHSFQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMSwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfQ0VOVEVSfSwgeworICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX1JJR0hULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0xGRTEsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1NJREVfTEVGVCwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1NJREVfUklHSFR9Cit9OworCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChmbGFjZGVjX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGZsYWNkZWNfZGVidWcKKworc3RhdGljIEZMQUNfX1N0cmVhbURlY29kZXJSZWFkU3RhdHVzCitnc3RfZmxhY19kZWNfcmVhZF9zdHJlYW0gKGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiBkZWNvZGVyLAorICAgIEZMQUNfX2J5dGUgYnVmZmVyW10sIHNpemVfdCAqIGJ5dGVzLCB2b2lkICpjbGllbnRfZGF0YSk7CitzdGF0aWMgRkxBQ19fU3RyZWFtRGVjb2RlcldyaXRlU3RhdHVzCitnc3RfZmxhY19kZWNfd3JpdGVfc3RyZWFtIChjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogZGVjb2RlciwKKyAgICBjb25zdCBGTEFDX19GcmFtZSAqIGZyYW1lLAorICAgIGNvbnN0IEZMQUNfX2ludDMyICogY29uc3QgYnVmZmVyW10sIHZvaWQgKmNsaWVudF9kYXRhKTsKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ZsYWNfZGVjX2hhbmRsZV9kZWNvZGVyX2Vycm9yIChHc3RGbGFjRGVjICogZGVjLCBnYm9vbGVhbiBtc2cpOworc3RhdGljIHZvaWQgZ3N0X2ZsYWNfZGVjX21ldGFkYXRhX2NiIChjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICoKKyAgICBkZWNvZGVyLCBjb25zdCBGTEFDX19TdHJlYW1NZXRhZGF0YSAqIG1ldGFkYXRhLCB2b2lkICpjbGllbnRfZGF0YSk7CitzdGF0aWMgdm9pZCBnc3RfZmxhY19kZWNfZXJyb3JfY2IgKGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKgorICAgIGRlY29kZXIsIEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cyBzdGF0dXMsIHZvaWQgKmNsaWVudF9kYXRhKTsKKworc3RhdGljIHZvaWQgZ3N0X2ZsYWNfZGVjX2ZsdXNoIChHc3RBdWRpb0RlY29kZXIgKiBhdWRpb19kZWMsIGdib29sZWFuIGhhcmQpOworc3RhdGljIGdib29sZWFuIGdzdF9mbGFjX2RlY19zZXRfZm9ybWF0IChHc3RBdWRpb0RlY29kZXIgKiBkZWMsIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZmxhY19kZWNfc3RhcnQgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ZsYWNfZGVjX3N0b3AgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfZmxhY19kZWNfaGFuZGxlX2ZyYW1lIChHc3RBdWRpb0RlY29kZXIgKiBhdWRpb19kZWMsCisgICAgR3N0QnVmZmVyICogYnVmKTsKKworR19ERUZJTkVfVFlQRSAoR3N0RmxhY0RlYywgZ3N0X2ZsYWNfZGVjLCBHU1RfVFlQRV9BVURJT19ERUNPREVSKTsKKworI2lmIEdfQllURV9PUkRFUiA9PSBHX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgRk9STUFUUyAieyBTOCwgUzE2TEUsIFMyNF8zMkxFLCBTMzJMRSB9ICIKKyNlbHNlCisjZGVmaW5lIEZPUk1BVFMgInsgUzgsIFMxNkJFLCBTMjRfMzJCRSwgUzMyQkUgfSAiCisjZW5kaWYKKworI2RlZmluZSBHU1RfRkxBQ19ERUNfU1JDX0NBUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiYXVkaW8veC1yYXcsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImZvcm1hdCA9IChzdHJpbmcpICIgRk9STUFUUyAiLCAiICAgICAgICAgICAgICAgICAgICAgXAorICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicmF0ZSA9IChpbnQpIFsgMSwgNjU1MzUwIF0sICIgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImNoYW5uZWxzID0gKGludCkgWyAxLCA4IF0iCisKKyNkZWZpbmUgR1NUX0ZMQUNfREVDX1NJTktfQ0FQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImF1ZGlvL3gtZmxhYywgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJmcmFtZWQgPSAoYm9vbGVhbikgdHJ1ZSwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicmF0ZSA9IChpbnQpIFsgMSwgNjU1MzUwIF0sICIgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImNoYW5uZWxzID0gKGludCkgWyAxLCA4IF0iCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBmbGFjX2RlY19zcmNfZmFjdG9yeSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfRkxBQ19ERUNfU1JDX0NBUFMpKTsKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBmbGFjX2RlY19zaW5rX2ZhY3RvcnkgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfRkxBQ19ERUNfU0lOS19DQVBTKSk7CisKK3N0YXRpYyB2b2lkCitnc3RfZmxhY19kZWNfY2xhc3NfaW5pdCAoR3N0RmxhY0RlY0NsYXNzICoga2xhc3MpCit7CisgIEdzdEF1ZGlvRGVjb2RlckNsYXNzICphdWRpb2RlY29kZXJfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKworICBhdWRpb2RlY29kZXJfY2xhc3MgPSAoR3N0QXVkaW9EZWNvZGVyQ2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChmbGFjZGVjX2RlYnVnLCAiZmxhY2RlYyIsIDAsICJmbGFjIGRlY29kZXIiKTsKKworICBhdWRpb2RlY29kZXJfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ZsYWNfZGVjX3N0b3ApOworICBhdWRpb2RlY29kZXJfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbGFjX2RlY19zdGFydCk7CisgIGF1ZGlvZGVjb2Rlcl9jbGFzcy0+Zmx1c2ggPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ZsYWNfZGVjX2ZsdXNoKTsKKyAgYXVkaW9kZWNvZGVyX2NsYXNzLT5zZXRfZm9ybWF0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbGFjX2RlY19zZXRfZm9ybWF0KTsKKyAgYXVkaW9kZWNvZGVyX2NsYXNzLT5oYW5kbGVfZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbGFjX2RlY19oYW5kbGVfZnJhbWUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmZsYWNfZGVjX3NyY19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZmxhY19kZWNfc2lua19mYWN0b3J5KTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiRkxBQyBhdWRpbyBkZWNvZGVyIiwKKyAgICAgICJDb2RlYy9EZWNvZGVyL0F1ZGlvIiwgIkRlY29kZXMgRkxBQyBsb3NzbGVzcyBhdWRpbyBzdHJlYW1zIiwKKyAgICAgICJUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PiwgIgorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmxhY19kZWNfaW5pdCAoR3N0RmxhY0RlYyAqIGZsYWNkZWMpCit7CisgIGZsYWNkZWMtPmRvX3Jlc3luYyA9IEZBTFNFOworICBnc3RfYXVkaW9fZGVjb2Rlcl9zZXRfbmVlZHNfZm9ybWF0IChHU1RfQVVESU9fREVDT0RFUiAoZmxhY2RlYyksIFRSVUUpOworICBnc3RfYXVkaW9fZGVjb2Rlcl9zZXRfdXNlX2RlZmF1bHRfcGFkX2FjY2VwdGNhcHMgKEdTVF9BVURJT19ERUNPREVSX0NBU1QKKyAgICAgIChmbGFjZGVjKSwgVFJVRSk7CisgIEdTVF9QQURfU0VUX0FDQ0VQVF9URU1QTEFURSAoR1NUX0FVRElPX0RFQ09ERVJfU0lOS19QQUQgKGZsYWNkZWMpKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmxhY19kZWNfc3RhcnQgKEdzdEF1ZGlvRGVjb2RlciAqIGF1ZGlvX2RlYykKK3sKKyAgRkxBQ19fU3RyZWFtRGVjb2RlckluaXRTdGF0dXMgczsKKyAgR3N0RmxhY0RlYyAqZGVjOworCisgIGRlYyA9IEdTVF9GTEFDX0RFQyAoYXVkaW9fZGVjKTsKKworICBkZWMtPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisKKyAgZGVjLT5kZWNvZGVyID0gRkxBQ19fc3RyZWFtX2RlY29kZXJfbmV3ICgpOworCisgIGdzdF9hdWRpb19pbmZvX2luaXQgKCZkZWMtPmluZm8pOworICBkZWMtPmRlcHRoID0gMDsKKworICAvKiBubyBwb2ludCBjYWxjdWxhdGluZyBNRDUgc2luY2UgaXQncyBuZXZlciBjaGVja2VkIGhlcmUgKi8KKyAgRkxBQ19fc3RyZWFtX2RlY29kZXJfc2V0X21kNV9jaGVja2luZyAoZGVjLT5kZWNvZGVyLCBmYWxzZSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVjLCAiaW5pdGlhbGl6aW5nIGRlY29kZXIiKTsKKyAgcyA9IEZMQUNfX3N0cmVhbV9kZWNvZGVyX2luaXRfc3RyZWFtIChkZWMtPmRlY29kZXIsCisgICAgICBnc3RfZmxhY19kZWNfcmVhZF9zdHJlYW0sIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICBnc3RfZmxhY19kZWNfd3JpdGVfc3RyZWFtLCBnc3RfZmxhY19kZWNfbWV0YWRhdGFfY2IsCisgICAgICBnc3RfZmxhY19kZWNfZXJyb3JfY2IsIGRlYyk7CisKKyAgaWYgKHMgIT0gRkxBQ19fU1RSRUFNX0RFQ09ERVJfSU5JVF9TVEFUVVNfT0spIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoR1NUX0VMRU1FTlQgKGRlYyksIExJQlJBUlksIElOSVQsIChOVUxMKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBkZWMtPmdvdF9oZWFkZXJzID0gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ZsYWNfZGVjX3N0b3AgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYykKK3sKKyAgR3N0RmxhY0RlYyAqZmxhY2RlYyA9IEdTVF9GTEFDX0RFQyAoZGVjKTsKKworICBpZiAoZmxhY2RlYy0+ZGVjb2RlcikgeworICAgIEZMQUNfX3N0cmVhbV9kZWNvZGVyX2RlbGV0ZSAoZmxhY2RlYy0+ZGVjb2Rlcik7CisgICAgZmxhY2RlYy0+ZGVjb2RlciA9IE5VTEw7CisgIH0KKworICBpZiAoZmxhY2RlYy0+YWRhcHRlcikgeworICAgIGdzdF9hZGFwdGVyX2NsZWFyIChmbGFjZGVjLT5hZGFwdGVyKTsKKyAgICBnX29iamVjdF91bnJlZiAoZmxhY2RlYy0+YWRhcHRlcik7CisgICAgZmxhY2RlYy0+YWRhcHRlciA9IE5VTEw7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmxhY19kZWNfc2V0X2Zvcm1hdCAoR3N0QXVkaW9EZWNvZGVyICogZGVjLCBHc3RDYXBzICogY2FwcykKK3sKKyAgY29uc3QgR1ZhbHVlICpoZWFkZXJzOworICBHc3RGbGFjRGVjICpmbGFjZGVjOworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIGd1aW50IGksIG51bTsKKworICBmbGFjZGVjID0gR1NUX0ZMQUNfREVDIChkZWMpOworCisgIEdTVF9MT0dfT0JKRUNUIChkZWMsICJzaW5rIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGhlYWRlcnMgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgInN0cmVhbWhlYWRlciIpOworICBpZiAoaGVhZGVycyA9PSBOVUxMIHx8ICFHU1RfVkFMVUVfSE9MRFNfQVJSQVkgKGhlYWRlcnMpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZWMsICJubyAnc3RyZWFtaGVhZGVyJyBmaWVsZCBpbiBpbnB1dCBjYXBzLCB0cnkgIgorICAgICAgICAiYWRkaW5nIGEgZmxhY3BhcnNlIGVsZW1lbnQgdXBzdHJlYW0iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChmbGFjZGVjLT5hZGFwdGVyKSA+IDApIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlYywgInVuZXhwZWN0ZWQgZGF0YSBsZWZ0IGluIGFkYXB0ZXIiKTsKKyAgICBnc3RfYWRhcHRlcl9jbGVhciAoZmxhY2RlYy0+YWRhcHRlcik7CisgIH0KKworICBudW0gPSBnc3RfdmFsdWVfYXJyYXlfZ2V0X3NpemUgKGhlYWRlcnMpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKKyAgICBjb25zdCBHVmFsdWUgKmhlYWRlcl92YWw7CisgICAgR3N0QnVmZmVyICpoZWFkZXJfYnVmOworCisgICAgaGVhZGVyX3ZhbCA9IGdzdF92YWx1ZV9hcnJheV9nZXRfdmFsdWUgKGhlYWRlcnMsIGkpOworICAgIGlmIChoZWFkZXJfdmFsID09IE5VTEwgfHwgIUdTVF9WQUxVRV9IT0xEU19CVUZGRVIgKGhlYWRlcl92YWwpKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgaGVhZGVyX2J1ZiA9IGdfdmFsdWVfZHVwX2JveGVkIChoZWFkZXJfdmFsKTsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGRlYywgInB1c2hpbmcgaGVhZGVyIGJ1ZmZlciBvZiAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzICIKKyAgICAgICAgImludG8gYWRhcHRlciIsIGdzdF9idWZmZXJfZ2V0X3NpemUgKGhlYWRlcl9idWYpKTsKKyAgICBnc3RfYWRhcHRlcl9wdXNoIChmbGFjZGVjLT5hZGFwdGVyLCBoZWFkZXJfYnVmKTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlYywgIlByb2Nlc3NpbmcgaGVhZGVycyBhbmQgbWV0YWRhdGEiKTsKKyAgaWYgKCFGTEFDX19zdHJlYW1fZGVjb2Rlcl9wcm9jZXNzX3VudGlsX2VuZF9vZl9tZXRhZGF0YSAoZmxhY2RlYy0+ZGVjb2RlcikpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlYywgInByb2Nlc3NfdW50aWxfZW5kX29mX21ldGFkYXRhIGZhaWxlZCIpOworICAgIGlmIChGTEFDX19zdHJlYW1fZGVjb2Rlcl9nZXRfc3RhdGUgKGZsYWNkZWMtPmRlY29kZXIpID09CisgICAgICAgIEZMQUNfX1NUUkVBTV9ERUNPREVSX0FCT1JURUQpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZmxhY2RlYywgIlJlYWQgY2FsbGJhY2sgY2F1c2VkIGludGVybmFsIGFib3J0Iik7CisgICAgICAvKiBhbGxvdyByZWNvdmVyeSAqLworICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGZsYWNkZWMtPmFkYXB0ZXIpOworICAgICAgRkxBQ19fc3RyZWFtX2RlY29kZXJfZmx1c2ggKGZsYWNkZWMtPmRlY29kZXIpOworICAgICAgZ3N0X2ZsYWNfZGVjX2hhbmRsZV9kZWNvZGVyX2Vycm9yIChmbGFjZGVjLCBUUlVFKTsKKyAgICB9CisgIH0KKyAgR1NUX0lORk9fT0JKRUNUIChkZWMsICJoZWFkZXJzIGFuZCBtZXRhZGF0YSBhcmUgbm93IHByb2Nlc3NlZCIpOworICByZXR1cm4gVFJVRTsKK30KKworLyogQ1JDLTgsIHBvbHkgPSB4XjggKyB4XjIgKyB4XjEgKyB4XjAsIGluaXQgPSAwICovCitzdGF0aWMgY29uc3QgZ3VpbnQ4IGNyYzhfdGFibGVbMjU2XSA9IHsKKyAgMHgwMCwgMHgwNywgMHgwRSwgMHgwOSwgMHgxQywgMHgxQiwgMHgxMiwgMHgxNSwKKyAgMHgzOCwgMHgzRiwgMHgzNiwgMHgzMSwgMHgyNCwgMHgyMywgMHgyQSwgMHgyRCwKKyAgMHg3MCwgMHg3NywgMHg3RSwgMHg3OSwgMHg2QywgMHg2QiwgMHg2MiwgMHg2NSwKKyAgMHg0OCwgMHg0RiwgMHg0NiwgMHg0MSwgMHg1NCwgMHg1MywgMHg1QSwgMHg1RCwKKyAgMHhFMCwgMHhFNywgMHhFRSwgMHhFOSwgMHhGQywgMHhGQiwgMHhGMiwgMHhGNSwKKyAgMHhEOCwgMHhERiwgMHhENiwgMHhEMSwgMHhDNCwgMHhDMywgMHhDQSwgMHhDRCwKKyAgMHg5MCwgMHg5NywgMHg5RSwgMHg5OSwgMHg4QywgMHg4QiwgMHg4MiwgMHg4NSwKKyAgMHhBOCwgMHhBRiwgMHhBNiwgMHhBMSwgMHhCNCwgMHhCMywgMHhCQSwgMHhCRCwKKyAgMHhDNywgMHhDMCwgMHhDOSwgMHhDRSwgMHhEQiwgMHhEQywgMHhENSwgMHhEMiwKKyAgMHhGRiwgMHhGOCwgMHhGMSwgMHhGNiwgMHhFMywgMHhFNCwgMHhFRCwgMHhFQSwKKyAgMHhCNywgMHhCMCwgMHhCOSwgMHhCRSwgMHhBQiwgMHhBQywgMHhBNSwgMHhBMiwKKyAgMHg4RiwgMHg4OCwgMHg4MSwgMHg4NiwgMHg5MywgMHg5NCwgMHg5RCwgMHg5QSwKKyAgMHgyNywgMHgyMCwgMHgyOSwgMHgyRSwgMHgzQiwgMHgzQywgMHgzNSwgMHgzMiwKKyAgMHgxRiwgMHgxOCwgMHgxMSwgMHgxNiwgMHgwMywgMHgwNCwgMHgwRCwgMHgwQSwKKyAgMHg1NywgMHg1MCwgMHg1OSwgMHg1RSwgMHg0QiwgMHg0QywgMHg0NSwgMHg0MiwKKyAgMHg2RiwgMHg2OCwgMHg2MSwgMHg2NiwgMHg3MywgMHg3NCwgMHg3RCwgMHg3QSwKKyAgMHg4OSwgMHg4RSwgMHg4NywgMHg4MCwgMHg5NSwgMHg5MiwgMHg5QiwgMHg5QywKKyAgMHhCMSwgMHhCNiwgMHhCRiwgMHhCOCwgMHhBRCwgMHhBQSwgMHhBMywgMHhBNCwKKyAgMHhGOSwgMHhGRSwgMHhGNywgMHhGMCwgMHhFNSwgMHhFMiwgMHhFQiwgMHhFQywKKyAgMHhDMSwgMHhDNiwgMHhDRiwgMHhDOCwgMHhERCwgMHhEQSwgMHhEMywgMHhENCwKKyAgMHg2OSwgMHg2RSwgMHg2NywgMHg2MCwgMHg3NSwgMHg3MiwgMHg3QiwgMHg3QywKKyAgMHg1MSwgMHg1NiwgMHg1RiwgMHg1OCwgMHg0RCwgMHg0QSwgMHg0MywgMHg0NCwKKyAgMHgxOSwgMHgxRSwgMHgxNywgMHgxMCwgMHgwNSwgMHgwMiwgMHgwQiwgMHgwQywKKyAgMHgyMSwgMHgyNiwgMHgyRiwgMHgyOCwgMHgzRCwgMHgzQSwgMHgzMywgMHgzNCwKKyAgMHg0RSwgMHg0OSwgMHg0MCwgMHg0NywgMHg1MiwgMHg1NSwgMHg1QywgMHg1QiwKKyAgMHg3NiwgMHg3MSwgMHg3OCwgMHg3RiwgMHg2QSwgMHg2RCwgMHg2NCwgMHg2MywKKyAgMHgzRSwgMHgzOSwgMHgzMCwgMHgzNywgMHgyMiwgMHgyNSwgMHgyQywgMHgyQiwKKyAgMHgwNiwgMHgwMSwgMHgwOCwgMHgwRiwgMHgxQSwgMHgxRCwgMHgxNCwgMHgxMywKKyAgMHhBRSwgMHhBOSwgMHhBMCwgMHhBNywgMHhCMiwgMHhCNSwgMHhCQywgMHhCQiwKKyAgMHg5NiwgMHg5MSwgMHg5OCwgMHg5RiwgMHg4QSwgMHg4RCwgMHg4NCwgMHg4MywKKyAgMHhERSwgMHhEOSwgMHhEMCwgMHhENywgMHhDMiwgMHhDNSwgMHhDQywgMHhDQiwKKyAgMHhFNiwgMHhFMSwgMHhFOCwgMHhFRiwgMHhGQSwgMHhGRCwgMHhGNCwgMHhGMworfTsKKworc3RhdGljIGd1aW50OAorZ3N0X2ZsYWNfY2FsY3VsYXRlX2NyYzggKGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IGxlbmd0aCkKK3sKKyAgZ3VpbnQ4IGNyYyA9IDA7CisKKyAgd2hpbGUgKGxlbmd0aC0tKSB7CisgICAgY3JjID0gY3JjOF90YWJsZVtjcmMgXiAqZGF0YV07CisgICAgKytkYXRhOworICB9CisKKyAgcmV0dXJuIGNyYzsKK30KKworLyogRklYTUU6IGZvciBvdXIgcHVycG9zZXMgaXQncyBwcm9iYWJseSBlbm91Z2ggdG8ganVzdCBjaGVjayBmb3IgdGhlIHN5bmMKKyAqIG1hcmtlciAtIHdlIGp1c3Qgd2FudCB0byBrbm93IGlmIGl0J3MgYSBoZWFkZXIgZnJhbWUgb3Igbm90ICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbGFjX2RlY19zY2FuX2dvdF9mcmFtZSAoR3N0RmxhY0RlYyAqIGZsYWNkZWMsIGNvbnN0IGd1aW50OCAqIGRhdGEsCisgICAgZ3VpbnQgc2l6ZSkKK3sKKyAgZ3VpbnQgaGVhZGVybGVuOworICBndWludCBzcl9mcm9tX2VuZCA9IDA7ICAgICAgICAvKiBjYW4gYmUgMCwgOCBvciAxNiAqLworICBndWludCBic19mcm9tX2VuZCA9IDA7ICAgICAgICAvKiBjYW4gYmUgMCwgOCBvciAxNiAqLworICBndWludDMyIHZhbCA9IDA7CisgIGd1aW50OCBicywgc3IsIGNhLCBzcywgcGI7CisgIGdib29sZWFuIHZiczsKKworICBpZiAoc2l6ZSA8IDEwKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBzeW5jICovCisgIGlmIChkYXRhWzBdICE9IDB4RkYgfHwgKGRhdGFbMV0gJiAweEZDKSAhPSAweEY4KQorICAgIHJldHVybiBGQUxTRTsKKworICB2YnMgPSAhICEoZGF0YVsxXSAmIDEpOyAgICAgICAvKiB2YXJpYWJsZSBibG9ja3NpemUgKi8KKyAgYnMgPSAoZGF0YVsyXSAmIDB4RjApID4+IDQ7ICAgLyogYmxvY2tzaXplIG1hcmtlciAgICovCisgIHNyID0gKGRhdGFbMl0gJiAweDBGKTsgICAgICAgIC8qIHNhbXBsZXJhdGUgbWFya2VyICAqLworICBjYSA9IChkYXRhWzNdICYgMHhGMCkgPj4gNDsgICAvKiBjaGFubmVsIGFzc2lnbm1lbnQgKi8KKyAgc3MgPSAoZGF0YVszXSAmIDB4MEYpID4+IDE7ICAgLyogc2FtcGxlIHNpemUgbWFya2VyICovCisgIHBiID0gKGRhdGFbM10gJiAweDAxKTsgICAgICAgIC8qIHBhZGRpbmcgYml0ICAgICAgICAqLworCisgIEdTVF9MT0dfT0JKRUNUIChmbGFjZGVjLAorICAgICAgImdvdCBzeW5jLCB2YnM9JWQsYnM9JXgsc3I9JXgsY2E9JXgsc3M9JXgscGI9JXgiLCB2YnMsIGJzLCBzciwgY2EsIHNzLAorICAgICAgcGIpOworCisgIGlmIChicyA9PSAwIHx8IHNyID09IDB4MEYgfHwgY2EgPj0gMHgwQiB8fCBzcyA9PSAweDAzIHx8IHNzID09IDB4MDcpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiByZWFkIGJsb2NrIHNpemUgZnJvbSBlbmQgb2YgaGVhZGVyPyAqLworICBpZiAoYnMgPT0gNikKKyAgICBic19mcm9tX2VuZCA9IDg7CisgIGVsc2UgaWYgKGJzID09IDcpCisgICAgYnNfZnJvbV9lbmQgPSAxNjsKKworICAvKiByZWFkIHNhbXBsZSByYXRlIGZyb20gZW5kIG9mIGhlYWRlcj8gKi8KKyAgaWYgKHNyID09IDB4MEMpCisgICAgc3JfZnJvbV9lbmQgPSA4OworICBlbHNlIGlmIChzciA9PSAweDBEIHx8IHNyID09IDB4MEUpCisgICAgc3JfZnJvbV9lbmQgPSAxNjsKKworICB2YWwgPSBkYXRhWzRdOworICAvKiBUaGlzIGlzIHNsaWdodGx5IGZhc3RlciB0aGFuIGEgbG9vcCAqLworICBpZiAoISh2YWwgJiAweDgwKSkgeworICAgIHZhbCA9IDA7CisgIH0gZWxzZSBpZiAoKHZhbCAmIDB4YzApICYmICEodmFsICYgMHgyMCkpIHsKKyAgICB2YWwgPSAxOworICB9IGVsc2UgaWYgKCh2YWwgJiAweGUwKSAmJiAhKHZhbCAmIDB4MTApKSB7CisgICAgdmFsID0gMjsKKyAgfSBlbHNlIGlmICgodmFsICYgMHhmMCkgJiYgISh2YWwgJiAweDA4KSkgeworICAgIHZhbCA9IDM7CisgIH0gZWxzZSBpZiAoKHZhbCAmIDB4ZjgpICYmICEodmFsICYgMHgwNCkpIHsKKyAgICB2YWwgPSA0OworICB9IGVsc2UgaWYgKCh2YWwgJiAweGZjKSAmJiAhKHZhbCAmIDB4MDIpKSB7CisgICAgdmFsID0gNTsKKyAgfSBlbHNlIGlmICgodmFsICYgMHhmZSkgJiYgISh2YWwgJiAweDAxKSkgeworICAgIHZhbCA9IDY7CisgIH0gZWxzZSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGZsYWNkZWMsICJmYWlsZWQgdG8gcmVhZCBzYW1wbGUvZnJhbWUiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICB2YWwrKzsKKyAgaGVhZGVybGVuID0gNCArIHZhbCArIChic19mcm9tX2VuZCAvIDgpICsgKHNyX2Zyb21fZW5kIC8gOCk7CisKKyAgaWYgKGdzdF9mbGFjX2NhbGN1bGF0ZV9jcmM4IChkYXRhLCBoZWFkZXJsZW4pICE9IGRhdGFbaGVhZGVybGVuXSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChmbGFjZGVjLCAiaW52YWxpZCBjaGVja3N1bSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbGFjX2RlY19oYW5kbGVfZGVjb2Rlcl9lcnJvciAoR3N0RmxhY0RlYyAqIGRlYywgZ2Jvb2xlYW4gbXNnKQoreworICBnYm9vbGVhbiByZXQ7CisKKyAgZGVjLT5lcnJvcl9jb3VudCsrOworICBpZiAoZGVjLT5lcnJvcl9jb3VudCA+IDEwKSB7CisgICAgaWYgKG1zZykKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZWMsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksIChOVUxMKSk7CisgICAgZGVjLT5sYXN0X2Zsb3cgPSBHU1RfRkxPV19FUlJPUjsKKyAgICByZXQgPSBUUlVFOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlYywgImlnbm9yaW5nIGVycm9yIGZvciBub3cgYXQgY291bnQgJWQiLAorICAgICAgICBkZWMtPmVycm9yX2NvdW50KTsKKyAgICByZXQgPSBGQUxTRTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmxhY19kZWNfbWV0YWRhdGFfY2IgKGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiBkZWNvZGVyLAorICAgIGNvbnN0IEZMQUNfX1N0cmVhbU1ldGFkYXRhICogbWV0YWRhdGEsIHZvaWQgKmNsaWVudF9kYXRhKQoreworICBHc3RGbGFjRGVjICpmbGFjZGVjID0gR1NUX0ZMQUNfREVDIChjbGllbnRfZGF0YSk7CisgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHBvc2l0aW9uWzhdOworCisgIEdTVF9MT0dfT0JKRUNUIChmbGFjZGVjLCAibWV0YWRhdGEgdHlwZTogJWQiLCBtZXRhZGF0YS0+dHlwZSk7CisKKyAgc3dpdGNoIChtZXRhZGF0YS0+dHlwZSkgeworICAgIGNhc2UgRkxBQ19fTUVUQURBVEFfVFlQRV9TVFJFQU1JTkZPOnsKKyAgICAgIGdpbnQ2NCBzYW1wbGVzOworICAgICAgZ3VpbnQgZGVwdGgsIHdpZHRoLCBnZGVwdGgsIGNoYW5uZWxzOworCisgICAgICBzYW1wbGVzID0gbWV0YWRhdGEtPmRhdGEuc3RyZWFtX2luZm8udG90YWxfc2FtcGxlczsKKworICAgICAgZmxhY2RlYy0+bWluX2Jsb2Nrc2l6ZSA9IG1ldGFkYXRhLT5kYXRhLnN0cmVhbV9pbmZvLm1pbl9ibG9ja3NpemU7CisgICAgICBmbGFjZGVjLT5tYXhfYmxvY2tzaXplID0gbWV0YWRhdGEtPmRhdGEuc3RyZWFtX2luZm8ubWF4X2Jsb2Nrc2l6ZTsKKyAgICAgIGZsYWNkZWMtPmRlcHRoID0gZGVwdGggPSBtZXRhZGF0YS0+ZGF0YS5zdHJlYW1faW5mby5iaXRzX3Blcl9zYW1wbGU7CisKKyAgICAgIGlmIChkZXB0aCA8IDkpIHsKKyAgICAgICAgZ2RlcHRoID0gd2lkdGggPSA4OworICAgICAgfSBlbHNlIGlmIChkZXB0aCA8IDE3KSB7CisgICAgICAgIGdkZXB0aCA9IHdpZHRoID0gMTY7CisgICAgICB9IGVsc2UgaWYgKGRlcHRoIDwgMjUpIHsKKyAgICAgICAgZ2RlcHRoID0gMjQ7CisgICAgICAgIHdpZHRoID0gMzI7CisgICAgICB9IGVsc2UgeworICAgICAgICBnZGVwdGggPSB3aWR0aCA9IDMyOworICAgICAgfQorCisgICAgICBjaGFubmVscyA9IG1ldGFkYXRhLT5kYXRhLnN0cmVhbV9pbmZvLmNoYW5uZWxzOworICAgICAgbWVtY3B5IChwb3NpdGlvbiwgY2hhbm5lbF9wb3NpdGlvbnNbY2hhbm5lbHMgLSAxXSwgc2l6ZW9mIChwb3NpdGlvbikpOworICAgICAgZ3N0X2F1ZGlvX2NoYW5uZWxfcG9zaXRpb25zX3RvX3ZhbGlkX29yZGVyIChwb3NpdGlvbiwgY2hhbm5lbHMpOworICAgICAgLyogTm90ZTogd2UgY3JlYXRlIHRoZSBpbnZlcnNlIHJlb3JkZXJpbmcgbWFwIGhlcmUgKi8KKyAgICAgIGdzdF9hdWRpb19nZXRfY2hhbm5lbF9yZW9yZGVyX21hcCAoY2hhbm5lbHMsCisgICAgICAgICAgcG9zaXRpb24sIGNoYW5uZWxfcG9zaXRpb25zW2NoYW5uZWxzIC0gMV0sCisgICAgICAgICAgZmxhY2RlYy0+Y2hhbm5lbF9yZW9yZGVyX21hcCk7CisKKyAgICAgIGdzdF9hdWRpb19pbmZvX3NldF9mb3JtYXQgKCZmbGFjZGVjLT5pbmZvLAorICAgICAgICAgIGdzdF9hdWRpb19mb3JtYXRfYnVpbGRfaW50ZWdlciAoVFJVRSwgR19CWVRFX09SREVSLCB3aWR0aCwgZ2RlcHRoKSwKKyAgICAgICAgICBtZXRhZGF0YS0+ZGF0YS5zdHJlYW1faW5mby5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICBtZXRhZGF0YS0+ZGF0YS5zdHJlYW1faW5mby5jaGFubmVscywgcG9zaXRpb24pOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjZGVjLCAiYmxvY2tzaXplOiBtaW49JXUsIG1heD0ldSIsCisgICAgICAgICAgZmxhY2RlYy0+bWluX2Jsb2Nrc2l6ZSwgZmxhY2RlYy0+bWF4X2Jsb2Nrc2l6ZSk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjZGVjLCAic2FtcGxlIHJhdGU6ICV1LCBjaGFubmVsczogJXUiLAorICAgICAgICAgIGZsYWNkZWMtPmluZm8ucmF0ZSwgZmxhY2RlYy0+aW5mby5jaGFubmVscyk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjZGVjLCAiZGVwdGg6ICV1LCB3aWR0aDogJXUiLCBmbGFjZGVjLT5kZXB0aCwKKyAgICAgICAgICBmbGFjZGVjLT5pbmZvLmZpbmZvLT53aWR0aCk7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZsYWNkZWMsICJ0b3RhbCBzYW1wbGVzID0gJSIgR19HSU5UNjRfRk9STUFULCBzYW1wbGVzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9mbGFjX2RlY19lcnJvcl9jYiAoY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIGQsCisgICAgRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIHN0YXR1cywgdm9pZCAqY2xpZW50X2RhdGEpCit7CisgIGNvbnN0IGdjaGFyICplcnJvcjsKKyAgR3N0RmxhY0RlYyAqZGVjOworCisgIGRlYyA9IEdTVF9GTEFDX0RFQyAoY2xpZW50X2RhdGEpOworCisgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgY2FzZSBGTEFDX19TVFJFQU1fREVDT0RFUl9FUlJPUl9TVEFUVVNfTE9TVF9TWU5DOgorICAgICAgZGVjLT5kb19yZXN5bmMgPSBUUlVFOworICAgICAgcmV0dXJuOworICAgIGNhc2UgRkxBQ19fU1RSRUFNX0RFQ09ERVJfRVJST1JfU1RBVFVTX0JBRF9IRUFERVI6CisgICAgICBlcnJvciA9ICJiYWQgaGVhZGVyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRkxBQ19fU1RSRUFNX0RFQ09ERVJfRVJST1JfU1RBVFVTX0ZSQU1FX0NSQ19NSVNNQVRDSDoKKyAgICAgIGVycm9yID0gIkNSQyBtaXNtYXRjaCI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3IgPSAidW5rbm93biBlcnJvciI7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChnc3RfZmxhY19kZWNfaGFuZGxlX2RlY29kZXJfZXJyb3IgKGRlYywgRkFMU0UpKQorICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZWMsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksICgiJXMgKCVkKSIsIGVycm9yLCBzdGF0dXMpKTsKK30KKworc3RhdGljIEZMQUNfX1N0cmVhbURlY29kZXJSZWFkU3RhdHVzCitnc3RfZmxhY19kZWNfcmVhZF9zdHJlYW0gKGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiBkZWNvZGVyLAorICAgIEZMQUNfX2J5dGUgYnVmZmVyW10sIHNpemVfdCAqIGJ5dGVzLCB2b2lkICpjbGllbnRfZGF0YSkKK3sKKyAgR3N0RmxhY0RlYyAqZGVjID0gR1NUX0ZMQUNfREVDIChjbGllbnRfZGF0YSk7CisgIGd1aW50IGxlbjsKKworICBsZW4gPSBNSU4gKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoZGVjLT5hZGFwdGVyKSwgKmJ5dGVzKTsKKworICBpZiAobGVuID09IDApIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoZGVjLCAiMCBieXRlcyBhdmFpbGFibGUgYXQgdGhlIG1vbWVudCIpOworICAgIHJldHVybiBGTEFDX19TVFJFQU1fREVDT0RFUl9SRUFEX1NUQVRVU19BQk9SVDsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChkZWMsICJmZWVkaW5nICV1IGJ5dGVzIHRvIGRlY29kZXIgIgorICAgICAgIihhdmFpbGFibGU9JSIgR19HU0laRV9GT1JNQVQgIiwgYnl0ZXM9JXUpIiwKKyAgICAgIGxlbiwgZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZWMtPmFkYXB0ZXIpLCAoZ3VpbnQpICogYnl0ZXMpOworICBnc3RfYWRhcHRlcl9jb3B5IChkZWMtPmFkYXB0ZXIsIGJ1ZmZlciwgMCwgbGVuKTsKKyAgKmJ5dGVzID0gbGVuOworCisgIGdzdF9hZGFwdGVyX2ZsdXNoIChkZWMtPmFkYXB0ZXIsIGxlbik7CisKKyAgcmV0dXJuIEZMQUNfX1NUUkVBTV9ERUNPREVSX1JFQURfU1RBVFVTX0NPTlRJTlVFOworfQorCitzdGF0aWMgRkxBQ19fU3RyZWFtRGVjb2RlcldyaXRlU3RhdHVzCitnc3RfZmxhY19kZWNfd3JpdGUgKEdzdEZsYWNEZWMgKiBmbGFjZGVjLCBjb25zdCBGTEFDX19GcmFtZSAqIGZyYW1lLAorICAgIGNvbnN0IEZMQUNfX2ludDMyICogY29uc3QgYnVmZmVyW10pCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBndWludCBkZXB0aCA9IGZyYW1lLT5oZWFkZXIuYml0c19wZXJfc2FtcGxlOworICBndWludCB3aWR0aCwgZ2RlcHRoOworICBndWludCBzYW1wbGVfcmF0ZSA9IGZyYW1lLT5oZWFkZXIuc2FtcGxlX3JhdGU7CisgIGd1aW50IGNoYW5uZWxzID0gZnJhbWUtPmhlYWRlci5jaGFubmVsczsKKyAgZ3VpbnQgc2FtcGxlcyA9IGZyYW1lLT5oZWFkZXIuYmxvY2tzaXplOworICBndWludCBqLCBpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2Jvb2xlYW4gY2Fwc19jaGFuZ2VkOworICBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBjaGFucG9zWzhdOworCisgIEdTVF9MT0dfT0JKRUNUIChmbGFjZGVjLCAic2FtcGxlcyBpbiBmcmFtZSBoZWFkZXI6ICVkIiwgc2FtcGxlcyk7CisKKyAgaWYgKGRlcHRoID09IDApIHsKKyAgICBpZiAoZmxhY2RlYy0+ZGVwdGggPCA0IHx8IGZsYWNkZWMtPmRlcHRoID4gMzIpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGZsYWNkZWMsICJ1bnN1cHBvcnRlZCBkZXB0aCAlZCBmcm9tIFNUUkVBTUlORk8iLAorICAgICAgICAgIGZsYWNkZWMtPmRlcHRoKTsKKyAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIGRlcHRoID0gZmxhY2RlYy0+ZGVwdGg7CisgIH0KKworICBzd2l0Y2ggKGRlcHRoKSB7CisgICAgY2FzZSA4OgorICAgICAgZ2RlcHRoID0gd2lkdGggPSA4OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjoKKyAgICBjYXNlIDE2OgorICAgICAgZ2RlcHRoID0gd2lkdGggPSAxNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjA6CisgICAgY2FzZSAyNDoKKyAgICAgIGdkZXB0aCA9IDI0OworICAgICAgd2lkdGggPSAzMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzI6CisgICAgICBnZGVwdGggPSB3aWR0aCA9IDMyOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGZsYWNkZWMsICJ1bnN1cHBvcnRlZCBkZXB0aCAlZCIsIGRlcHRoKTsKKyAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgZ290byBkb25lOworICB9CisKKyAgaWYgKHNhbXBsZV9yYXRlID09IDApIHsKKyAgICBpZiAoZmxhY2RlYy0+aW5mby5yYXRlICE9IDApIHsKKyAgICAgIHNhbXBsZV9yYXRlID0gZmxhY2RlYy0+aW5mby5yYXRlOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChmbGFjZGVjLCAidW5rbm93biBzYW1wbGUgcmF0ZSIpOworICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICB9CisKKyAgY2Fwc19jaGFuZ2VkID0gKHNhbXBsZV9yYXRlICE9IEdTVF9BVURJT19JTkZPX1JBVEUgKCZmbGFjZGVjLT5pbmZvKSkKKyAgICAgIHx8ICh3aWR0aCAhPSBHU1RfQVVESU9fSU5GT19XSURUSCAoJmZsYWNkZWMtPmluZm8pKQorICAgICAgfHwgKGdkZXB0aCAhPSBHU1RfQVVESU9fSU5GT19ERVBUSCAoJmZsYWNkZWMtPmluZm8pKQorICAgICAgfHwgKGNoYW5uZWxzICE9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTICgmZmxhY2RlYy0+aW5mbykpOworCisgIGlmIChjYXBzX2NoYW5nZWQKKyAgICAgIHx8ICFnc3RfcGFkX2hhc19jdXJyZW50X2NhcHMgKEdTVF9BVURJT19ERUNPREVSX1NSQ19QQUQgKGZsYWNkZWMpKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZsYWNkZWMsICJOZWdvdGlhdGluZyAlZCBIeiBAICVkIGNoYW5uZWxzIiwgc2FtcGxlX3JhdGUsCisgICAgICAgIGNoYW5uZWxzKTsKKworICAgIG1lbWNweSAoY2hhbnBvcywgY2hhbm5lbF9wb3NpdGlvbnNbZmxhY2RlYy0+aW5mby5jaGFubmVscyAtIDFdLAorICAgICAgICBzaXplb2YgKGNoYW5wb3MpKTsKKyAgICBnc3RfYXVkaW9fY2hhbm5lbF9wb3NpdGlvbnNfdG9fdmFsaWRfb3JkZXIgKGNoYW5wb3MsCisgICAgICAgIGZsYWNkZWMtPmluZm8uY2hhbm5lbHMpOworICAgIGdzdF9hdWRpb19pbmZvX3NldF9mb3JtYXQgKCZmbGFjZGVjLT5pbmZvLAorICAgICAgICBnc3RfYXVkaW9fZm9ybWF0X2J1aWxkX2ludGVnZXIgKFRSVUUsIEdfQllURV9PUkRFUiwgd2lkdGgsIGdkZXB0aCksCisgICAgICAgIHNhbXBsZV9yYXRlLCBjaGFubmVscywgY2hhbnBvcyk7CisKKyAgICAvKiBOb3RlOiB3ZSBjcmVhdGUgdGhlIGludmVyc2UgcmVvcmRlcmluZyBtYXAgaGVyZSAqLworICAgIGdzdF9hdWRpb19nZXRfY2hhbm5lbF9yZW9yZGVyX21hcCAoZmxhY2RlYy0+aW5mby5jaGFubmVscywKKyAgICAgICAgZmxhY2RlYy0+aW5mby5wb3NpdGlvbiwgY2hhbm5lbF9wb3NpdGlvbnNbZmxhY2RlYy0+aW5mby5jaGFubmVscyAtIDFdLAorICAgICAgICBmbGFjZGVjLT5jaGFubmVsX3Jlb3JkZXJfbWFwKTsKKworICAgIGZsYWNkZWMtPmRlcHRoID0gZGVwdGg7CisKKyAgICBnc3RfYXVkaW9fZGVjb2Rlcl9zZXRfb3V0cHV0X2Zvcm1hdCAoR1NUX0FVRElPX0RFQ09ERVIgKGZsYWNkZWMpLAorICAgICAgICAmZmxhY2RlYy0+aW5mbyk7CisgIH0KKworICBvdXRidWYgPQorICAgICAgZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIHNhbXBsZXMgKiBjaGFubmVscyAqICh3aWR0aCAvIDgpLCBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaWYgKHdpZHRoID09IDgpIHsKKyAgICBnaW50OCAqb3V0YnVmZmVyID0gKGdpbnQ4ICopIG1hcC5kYXRhOworICAgIGdpbnQgKnJlb3JkZXJfbWFwID0gZmxhY2RlYy0+Y2hhbm5lbF9yZW9yZGVyX21hcDsKKworICAgIGdfYXNzZXJ0IChnZGVwdGggPT0gOCAmJiBkZXB0aCA9PSA4KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlczsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgeworICAgICAgICAqb3V0YnVmZmVyKysgPSAoZ2ludDgpIGJ1ZmZlcltyZW9yZGVyX21hcFtqXV1baV07CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKHdpZHRoID09IDE2KSB7CisgICAgZ2ludDE2ICpvdXRidWZmZXIgPSAoZ2ludDE2ICopIG1hcC5kYXRhOworICAgIGdpbnQgKnJlb3JkZXJfbWFwID0gZmxhY2RlYy0+Y2hhbm5lbF9yZW9yZGVyX21hcDsKKworICAgIGlmIChnZGVwdGggIT0gZGVwdGgpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzYW1wbGVzOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspIHsKKyAgICAgICAgICAqb3V0YnVmZmVyKysgPQorICAgICAgICAgICAgICAoZ2ludDE2KSAoYnVmZmVyW3Jlb3JkZXJfbWFwW2pdXVtpXSA8PCAoZ2RlcHRoIC0gZGVwdGgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlczsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBjaGFubmVsczsgaisrKSB7CisgICAgICAgICAgKm91dGJ1ZmZlcisrID0gKGdpbnQxNikgYnVmZmVyW3Jlb3JkZXJfbWFwW2pdXVtpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmICh3aWR0aCA9PSAzMikgeworICAgIGdpbnQzMiAqb3V0YnVmZmVyID0gKGdpbnQzMiAqKSBtYXAuZGF0YTsKKyAgICBnaW50ICpyZW9yZGVyX21hcCA9IGZsYWNkZWMtPmNoYW5uZWxfcmVvcmRlcl9tYXA7CisKKyAgICBpZiAoZ2RlcHRoICE9IGRlcHRoKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlczsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBjaGFubmVsczsgaisrKSB7CisgICAgICAgICAgKm91dGJ1ZmZlcisrID0KKyAgICAgICAgICAgICAgKGdpbnQzMikgKGJ1ZmZlcltyZW9yZGVyX21hcFtqXV1baV0gPDwgKGdkZXB0aCAtIGRlcHRoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpID0gMDsgaSA8IHNhbXBsZXM7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgeworICAgICAgICAgICpvdXRidWZmZXIrKyA9IChnaW50MzIpIGJ1ZmZlcltyZW9yZGVyX21hcFtqXV1baV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChmbGFjZGVjLCAicHVzaGluZyAlZCBzYW1wbGVzIiwgc2FtcGxlcyk7CisgIGlmIChmbGFjZGVjLT5lcnJvcl9jb3VudCkKKyAgICBmbGFjZGVjLT5lcnJvcl9jb3VudC0tOworCisgIHJldCA9IGdzdF9hdWRpb19kZWNvZGVyX2ZpbmlzaF9mcmFtZSAoR1NUX0FVRElPX0RFQ09ERVIgKGZsYWNkZWMpLCBvdXRidWYsIDEpOworCisgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY2RlYywgImZpbmlzaF9mcmFtZSBmbG93ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworICB9CisKK2RvbmU6CisKKyAgLyogd2UgYWN0IG9uIHRoZSBmbG93IHJldHVybiB2YWx1ZSBsYXRlciBpbiB0aGUgaGFuZGxlX2ZyYW1lIGZ1bmN0aW9uLCBhcyB3ZQorICAgKiBkb24ndCB3YW50IHRvIG1lc3MgdXAgdGhlIGludGVybmFsIGRlY29kZXIgc3RhdGUgYnkgcmV0dXJuaW5nIEFCT1JUIHdoZW4KKyAgICogdGhlIGVycm9yIGlzIGluIGZhY3Qgbm9uLWZhdGFsIChsaWtlIGEgcGFkIGluIGZsdXNoaW5nIG1vZGUpIGFuZCB3ZSB3YW50CisgICAqIHRvIGNvbnRpbnVlIGxhdGVyLiBTbyBqdXN0IHByZXRlbmQgZXZlcnl0aGluZydzIGRhbmR5IGFuZCBhY3QgbGF0ZXIuICovCisgIGZsYWNkZWMtPmxhc3RfZmxvdyA9IHJldDsKKworICByZXR1cm4gRkxBQ19fU1RSRUFNX0RFQ09ERVJfV1JJVEVfU1RBVFVTX0NPTlRJTlVFOworfQorCitzdGF0aWMgRkxBQ19fU3RyZWFtRGVjb2RlcldyaXRlU3RhdHVzCitnc3RfZmxhY19kZWNfd3JpdGVfc3RyZWFtIChjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogZGVjb2RlciwKKyAgICBjb25zdCBGTEFDX19GcmFtZSAqIGZyYW1lLAorICAgIGNvbnN0IEZMQUNfX2ludDMyICogY29uc3QgYnVmZmVyW10sIHZvaWQgKmNsaWVudF9kYXRhKQoreworICByZXR1cm4gZ3N0X2ZsYWNfZGVjX3dyaXRlIChHU1RfRkxBQ19ERUMgKGNsaWVudF9kYXRhKSwgZnJhbWUsIGJ1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmxhY19kZWNfZmx1c2ggKEdzdEF1ZGlvRGVjb2RlciAqIGF1ZGlvX2RlYywgZ2Jvb2xlYW4gaGFyZCkKK3sKKyAgR3N0RmxhY0RlYyAqZGVjID0gR1NUX0ZMQUNfREVDIChhdWRpb19kZWMpOworCisgIGlmICghaGFyZCkgeworICAgIGd1aW50IGF2YWlsYWJsZSA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoZGVjLT5hZGFwdGVyKTsKKworICAgIGlmIChhdmFpbGFibGUgPiAwKSB7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGRlYywgImRyYWluaW5nLCAldSBieXRlcyBsZWZ0IGluIGFkYXB0ZXIiLCBhdmFpbGFibGUpOworICAgICAgRkxBQ19fc3RyZWFtX2RlY29kZXJfcHJvY2Vzc191bnRpbF9lbmRfb2Zfc3RyZWFtIChkZWMtPmRlY29kZXIpOworICAgIH0KKyAgfQorCisgIGRlYy0+ZG9fcmVzeW5jID0gRkFMU0U7CisgIEZMQUNfX3N0cmVhbV9kZWNvZGVyX2ZsdXNoIChkZWMtPmRlY29kZXIpOworICBnc3RfYWRhcHRlcl9jbGVhciAoZGVjLT5hZGFwdGVyKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbGFjX2RlY19oYW5kbGVfZnJhbWUgKEdzdEF1ZGlvRGVjb2RlciAqIGF1ZGlvX2RlYywgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RGbGFjRGVjICpkZWM7CisKKyAgZGVjID0gR1NUX0ZMQUNfREVDIChhdWRpb19kZWMpOworCisgIC8qIGRyYWluIHJlbWFpbmluZyBkYXRhPyAqLworICBpZiAoR19VTkxJS0VMWSAoYnVmID09IE5VTEwpKSB7CisgICAgZ3N0X2ZsYWNfZGVjX2ZsdXNoIChhdWRpb19kZWMsIEZBTFNFKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KKworICBpZiAoZGVjLT5kb19yZXN5bmMpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlYywgIkxvc3Qgc3luYywgZmx1c2hpbmcgZGVjb2RlciIpOworICAgIEZMQUNfX3N0cmVhbV9kZWNvZGVyX2ZsdXNoIChkZWMtPmRlY29kZXIpOworICAgIGRlYy0+ZG9fcmVzeW5jID0gRkFMU0U7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAoZGVjLCAiZnJhbWU6IHRzICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBmbGFncyAweCUwNHgsICIKKyAgICAgICIlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIiwgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikpLAorICAgICAgR1NUX0JVRkZFUl9GTEFHUyAoYnVmKSwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSk7CisKKyAgLyogZHJvcCBhbnkgaW4tc3RyZWFtIGhlYWRlcnMsIHdlJ3ZlIHByb2Nlc3NlZCB0aG9zZSBpbiBzZXRfZm9ybWF0IGFscmVhZHkgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKCFkZWMtPmdvdF9oZWFkZXJzKSkgeworICAgIGdib29sZWFuIGdvdF9hdWRpb19mcmFtZTsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgIC8qIGNoZWNrIGlmIHRoaXMgaXMgYSBmbGFjIGF1ZGlvIGZyYW1lIChyYXRoZXIgdGhhbiBhIGhlYWRlciBvciBqdW5rKSAqLworICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgZ290X2F1ZGlvX2ZyYW1lID0gZ3N0X2ZsYWNfZGVjX3NjYW5fZ290X2ZyYW1lIChkZWMsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICAgIGlmICghZ290X2F1ZGlvX2ZyYW1lKSB7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGRlYywgImRyb3BwaW5nIGluLXN0cmVhbSBoZWFkZXIsICUiIEdfR1NJWkVfRk9STUFUICIgIgorICAgICAgICAgICJieXRlcyIsIG1hcC5zaXplKTsKKyAgICAgIGdzdF9hdWRpb19kZWNvZGVyX2ZpbmlzaF9mcmFtZSAoYXVkaW9fZGVjLCBOVUxMLCAxKTsKKyAgICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgICB9CisKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGRlYywgImZpcnN0IGF1ZGlvIGZyYW1lLCBnb3QgYWxsIGluLXN0cmVhbSBoZWFkZXJzIG5vdyIpOworICAgIGRlYy0+Z290X2hlYWRlcnMgPSBUUlVFOworICB9CisKKyAgZ3N0X2FkYXB0ZXJfcHVzaCAoZGVjLT5hZGFwdGVyLCBnc3RfYnVmZmVyX3JlZiAoYnVmKSk7CisgIGJ1ZiA9IE5VTEw7CisKKyAgZGVjLT5sYXN0X2Zsb3cgPSBHU1RfRkxPV19PSzsKKworICAvKiBmcmFtZWQgLSB0aGVyZSBzaG91bGQgYWx3YXlzIGJlIGVub3VnaCBkYXRhIHRvIGRlY29kZSBzb21ldGhpbmcgKi8KKyAgR1NUX0xPR19PQkpFQ1QgKGRlYywgIiUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMgYXZhaWxhYmxlIiwKKyAgICAgIGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoZGVjLT5hZGFwdGVyKSk7CisKKyAgaWYgKCFGTEFDX19zdHJlYW1fZGVjb2Rlcl9wcm9jZXNzX3NpbmdsZSAoZGVjLT5kZWNvZGVyKSkgeworICAgIEdTVF9JTkZPX09CSkVDVCAoZGVjLCAicHJvY2Vzc19zaW5nbGUgZmFpbGVkIik7CisgICAgaWYgKEZMQUNfX3N0cmVhbV9kZWNvZGVyX2dldF9zdGF0ZSAoZGVjLT5kZWNvZGVyKSA9PQorICAgICAgICBGTEFDX19TVFJFQU1fREVDT0RFUl9BQk9SVEVEKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlYywgIlJlYWQgY2FsbGJhY2sgY2F1c2VkIGludGVybmFsIGFib3J0Iik7CisgICAgICAvKiBhbGxvdyByZWNvdmVyeSAqLworICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGRlYy0+YWRhcHRlcik7CisgICAgICBGTEFDX19zdHJlYW1fZGVjb2Rlcl9mbHVzaCAoZGVjLT5kZWNvZGVyKTsKKyAgICAgIGdzdF9mbGFjX2RlY19oYW5kbGVfZGVjb2Rlcl9lcnJvciAoZGVjLCBUUlVFKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZGVjLT5sYXN0X2Zsb3c7Cit9CmRpZmYgLS1naXQgYS9leHQvZmxhYy9nc3RmbGFjZGVjLmggYi9leHQvZmxhYy9nc3RmbGFjZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYzYjMwMAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9mbGFjL2dzdGZsYWNkZWMuaApAQCAtMCwwICsxLDc0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDExPiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9GTEFDX0RFQ19IX18KKyNkZWZpbmUgX19HU1RfRkxBQ19ERUNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZGVjb2Rlci5oPgorCisjaW5jbHVkZSA8RkxBQy9hbGwuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0ZMQUNfREVDIGdzdF9mbGFjX2RlY19nZXRfdHlwZSgpCisjZGVmaW5lIEdTVF9GTEFDX0RFQyhvYmopIEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKG9iaiwgR1NUX1RZUEVfRkxBQ19ERUMsIEdzdEZsYWNEZWMpCisjZGVmaW5lIEdTVF9GTEFDX0RFQ19DTEFTUyhrbGFzcykgR19UWVBFX0NIRUNLX0NMQVNTX0NBU1Qoa2xhc3MsIEdTVF9UWVBFX0ZMQUNfREVDLCBHc3RGbGFjRGVjQ2xhc3MpCisjZGVmaW5lIEdTVF9JU19GTEFDX0RFQyhvYmopIEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKG9iaiwgR1NUX1RZUEVfRkxBQ19ERUMpCisjZGVmaW5lIEdTVF9JU19GTEFDX0RFQ19DTEFTUyhrbGFzcykgR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoa2xhc3MsIEdTVF9UWVBFX0ZMQUNfREVDKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0RmxhY0RlYyBHc3RGbGFjRGVjOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEZsYWNEZWNDbGFzcyBHc3RGbGFjRGVjQ2xhc3M7CisKK3N0cnVjdCBfR3N0RmxhY0RlYyB7CisgIEdzdEF1ZGlvRGVjb2RlciAgYXVkaW9kZWNvZGVyOworCisgIC8qPCBwcml2YXRlID4qLworICBGTEFDX19TdHJlYW1EZWNvZGVyICAgICAgICAgKmRlY29kZXI7CisgIEdzdEFkYXB0ZXIgICAgICAgICAgICAgICAgICAqYWRhcHRlcjsKKworICBnYm9vbGVhbiAgICAgICBnb3RfaGVhZGVyczsgLyogaGF2ZSB3ZSByZWNlaXZlZCBhbGwgdGhlIGhlYWRlciBidWZmZXJzIHlldD8gKi8KKworICBHc3RGbG93UmV0dXJuICBsYXN0X2Zsb3c7ICAgLyogdG8gbWFyc2hhbCBmbG93IHJldHVybiBmcm9tIGZpbmlzX2ZyYW1lIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBoYW5kbGVfZnJhbWUgdmlhIGZsYWMgY2FsbGJhY2tzICovCisKKyAgR3N0QXVkaW9JbmZvICAgaW5mbzsKKyAgZ2ludCAgICAgICAgICAgY2hhbm5lbF9yZW9yZGVyX21hcFs4XTsKKyAgZ2ludCAgICAgICAgICAgZGVwdGg7CisKKyAgLyogZnJvbSB0aGUgc3RyZWFtIGluZm8sIG5lZWRlZCBmb3Igc2Nhbm5pbmcgKi8KKyAgZ3VpbnQxNiAgICAgICAgbWluX2Jsb2Nrc2l6ZTsKKyAgZ3VpbnQxNiAgICAgICAgbWF4X2Jsb2Nrc2l6ZTsKKworICBnYm9vbGVhbiAgICAgICBkb19yZXN5bmM7CisgIGdpbnQgICAgICAgICAgIGVycm9yX2NvdW50OworfTsKKworc3RydWN0IF9Hc3RGbGFjRGVjQ2xhc3MgeworICBHc3RBdWRpb0RlY29kZXJDbGFzcyAgYXVkaW9kZWNvZGVyOworfTsKKworR1R5cGUgZ3N0X2ZsYWNfZGVjX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0ZMQUNfREVDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jIGIvZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMWRlMDcKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZmxhYy9nc3RmbGFjZW5jLmMKQEAgLTAsMCArMSwxNTg2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LWZsYWNlbmMKKyAqIEBzZWVfYWxzbzogI0dzdEZsYWNEZWMKKyAqCisgKiBmbGFjZW5jIGVuY29kZXMgRkxBQyBzdHJlYW1zLgorICogPHVsaW5rIHVybD0iaHR0cDovL2ZsYWMuc291cmNlZm9yZ2UubmV0LyI+RkxBQzwvdWxpbms+CisgKiBpcyBhIEZyZWUgTG9zc2xlc3MgQXVkaW8gQ29kZWMuIEZMQUMgYXVkaW8gY2FuIGRpcmVjdGx5IGJlIHdyaXR0ZW4gaW50bworICogYSBmaWxlLCBvciBlbWJlZGRlZCBpbnRvIGNvbnRhaW5lcnMgc3VjaCBhcyBvZ2dtdXggb3IgbWF0cm9za2FtdXguCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyBudW0tYnVmZmVycz0xMDAgISBmbGFjZW5jICEgZmlsZXNpbmsgbG9jYXRpb249YmVlcC5mbGFjCisgKiBdfCBFbmNvZGUgYSBzaG9ydCBzaW5lIHdhdmUgaW50byBGTEFDCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgY2RwYXJhbm9pYXNyYyBtb2RlPWNvbnRpbnVvdXMgISBxdWV1ZSAhIGF1ZGlvY29udmVydCAhIGZsYWNlbmMgISBmaWxlc2luayBsb2NhdGlvbj1jZC5mbGFjCisgKiBdfCBSaXAgYSB3aG9sZSBhdWRpbyBDRCBpbnRvIGEgc2luZ2xlIEZMQUMgZmlsZSwgd2l0aCB0aGUgdHJhY2sgdGFibGUgc2F2ZWQgYXMgYSBDVUUgc2hlZXQgaW5zaWRlIHRoZSBGTEFDIGZpbGUKKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBjZHBhcmFub2lhc3JjIHRyYWNrPTUgISBxdWV1ZSAhIGF1ZGlvY29udmVydCAhIGZsYWNlbmMgISBmaWxlc2luayBsb2NhdGlvbj10cmFjazUuZmxhYworICogXXwgUmlwIHRyYWNrIDUgb2YgYW4gYXVkaW8gQ0QgYW5kIGVuY29kZSBpdCBsb3NzbGVzc2x5IHRvIGEgRkxBQyBmaWxlCisgKiA8L3JlZnNlY3QyPgorICovCisKKy8qIFRPRE86IC0gV2UgY3VycmVudGx5IGRvbid0IGhhbmRsZSBkaXNjb250aW51aXRpZXMgaW4gdGhlIHN0cmVhbSBpbiBhIHVzZWZ1bAorICogICAgICAgICB3YXkgYW5kIGluc3RlYWQgcmVseSBvbiB0aGUgZGV2ZWxvcGVyIHBsdWdnaW5nIGluIGF1ZGlvcmF0ZSBpZgorICogICAgICAgICB0aGUgc3RyZWFtIGNvbnRhaW5zIGRpc2NvbnRpbnVpdGllcy4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3RmbGFjZW5jLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L3RhZy90YWcuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0dGFnc2V0dGVyLmg+CisKKy8qIFRha2VuIGZyb20gaHR0cDovL2ZsYWMuc291cmNlZm9yZ2UubmV0L2Zvcm1hdC5odG1sI2ZyYW1lX2hlYWRlciAqLworc3RhdGljIGNvbnN0IEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIGNoYW5uZWxfcG9zaXRpb25zWzhdWzhdID0geworICB7R1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTU9OT30sCisgIHtHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFR9LCB7CisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULAorICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSfSwgeworICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZULAorICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVH0sIHsKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZULAorICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVH0sIHsKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMSwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZULAorICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVH0sCisgIC8qIEZJWE1FOiA3LzggY2hhbm5lbCBsYXlvdXRzIGFyZSBub3QgZGVmaW5lZCBpbiB0aGUgRkxBQyBzcGVjcyAqLworICB7CisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0xFRlQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfUklHSFQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMSwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfQ0VOVEVSfSwgeworICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX1JJR0hULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0xGRTEsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1NJREVfTEVGVCwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1NJREVfUklHSFR9Cit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1mbGFjIikKKyAgICApOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9RVUFMSVRZLAorICBQUk9QX1NUUkVBTUFCTEVfU1VCU0VULAorICBQUk9QX01JRF9TSURFX1NURVJFTywKKyAgUFJPUF9MT09TRV9NSURfU0lERV9TVEVSRU8sCisgIFBST1BfQkxPQ0tTSVpFLAorICBQUk9QX01BWF9MUENfT1JERVIsCisgIFBST1BfUUxQX0NPRUZGX1BSRUNJU0lPTiwKKyAgUFJPUF9RTFBfQ09FRkZfUFJFQ19TRUFSQ0gsCisgIFBST1BfRVNDQVBFX0NPRElORywKKyAgUFJPUF9FWEhBVVNUSVZFX01PREVMX1NFQVJDSCwKKyAgUFJPUF9NSU5fUkVTSURVQUxfUEFSVElUSU9OX09SREVSLAorICBQUk9QX01BWF9SRVNJRFVBTF9QQVJUSVRJT05fT1JERVIsCisgIFBST1BfUklDRV9QQVJBTUVURVJfU0VBUkNIX0RJU1QsCisgIFBST1BfUEFERElORywKKyAgUFJPUF9TRUVLUE9JTlRTCit9OworCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChmbGFjZW5jX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGZsYWNlbmNfZGVidWcKKworI2RlZmluZSBnc3RfZmxhY19lbmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdEZsYWNFbmMsIGdzdF9mbGFjX2VuYywgR1NUX1RZUEVfQVVESU9fRU5DT0RFUiwKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1RBR19TRVRURVIsIE5VTEwpCisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9UT0NfU0VUVEVSLCBOVUxMKQorICAgICk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZmxhY19lbmNfc3RhcnQgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ZsYWNfZW5jX3N0b3AgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ZsYWNfZW5jX3NldF9mb3JtYXQgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYywKKyAgICBHc3RBdWRpb0luZm8gKiBpbmZvKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9mbGFjX2VuY19oYW5kbGVfZnJhbWUgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYywKKyAgICBHc3RCdWZmZXIgKiBpbl9idWYpOworc3RhdGljIEdzdENhcHMgKmdzdF9mbGFjX2VuY19nZXRjYXBzIChHc3RBdWRpb0VuY29kZXIgKiBlbmMsIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9mbGFjX2VuY19zaW5rX2V2ZW50IChHc3RBdWRpb0VuY29kZXIgKiBlbmMsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ZsYWNfZW5jX3NpbmtfcXVlcnkgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYywKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworc3RhdGljIHZvaWQgZ3N0X2ZsYWNfZW5jX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIEdzdENhcHMgKmdzdF9mbGFjX2VuY19nZW5lcmF0ZV9zaW5rX2NhcHMgKHZvaWQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ZsYWNfZW5jX3VwZGF0ZV9xdWFsaXR5IChHc3RGbGFjRW5jICogZmxhY2VuYywKKyAgICBnaW50IHF1YWxpdHkpOworc3RhdGljIHZvaWQgZ3N0X2ZsYWNfZW5jX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9mbGFjX2VuY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMKK2dzdF9mbGFjX2VuY193cml0ZV9jYWxsYmFjayAoY29uc3QgRkxBQ19fU3RyZWFtRW5jb2RlciAqIGVuY29kZXIsCisgICAgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwgc2l6ZV90IGJ5dGVzLAorICAgIHVuc2lnbmVkIHNhbXBsZXMsIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUsIHZvaWQgKmNsaWVudF9kYXRhKTsKK3N0YXRpYyBGTEFDX19TdHJlYW1FbmNvZGVyU2Vla1N0YXR1cworZ3N0X2ZsYWNfZW5jX3NlZWtfY2FsbGJhY2sgKGNvbnN0IEZMQUNfX1N0cmVhbUVuY29kZXIgKiBlbmNvZGVyLAorICAgIEZMQUNfX3VpbnQ2NCBhYnNvbHV0ZV9ieXRlX29mZnNldCwgdm9pZCAqY2xpZW50X2RhdGEpOworc3RhdGljIEZMQUNfX1N0cmVhbUVuY29kZXJUZWxsU3RhdHVzCitnc3RfZmxhY19lbmNfdGVsbF9jYWxsYmFjayAoY29uc3QgRkxBQ19fU3RyZWFtRW5jb2RlciAqIGVuY29kZXIsCisgICAgRkxBQ19fdWludDY0ICogYWJzb2x1dGVfYnl0ZV9vZmZzZXQsIHZvaWQgKmNsaWVudF9kYXRhKTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ2Jvb2xlYW4gZXhoYXVzdGl2ZV9tb2RlbF9zZWFyY2g7CisgIGdib29sZWFuIGVzY2FwZV9jb2Rpbmc7CisgIGdib29sZWFuIG1pZF9zaWRlOworICBnYm9vbGVhbiBsb29zZV9taWRfc2lkZTsKKyAgZ3VpbnQgcWxwX2NvZWZmX3ByZWNpc2lvbjsKKyAgZ2Jvb2xlYW4gcWxwX2NvZWZmX3ByZWNfc2VhcmNoOworICBndWludCBtaW5fcmVzaWR1YWxfcGFydGl0aW9uX29yZGVyOworICBndWludCBtYXhfcmVzaWR1YWxfcGFydGl0aW9uX29yZGVyOworICBndWludCByaWNlX3BhcmFtZXRlcl9zZWFyY2hfZGlzdDsKKyAgZ3VpbnQgbWF4X2xwY19vcmRlcjsKKyAgZ3VpbnQgYmxvY2tzaXplOworfQorR3N0RmxhY0VuY1BhcmFtczsKKworc3RhdGljIGNvbnN0IEdzdEZsYWNFbmNQYXJhbXMgZmxhY2VuY19wYXJhbXNbXSA9IHsKKyAge0ZBTFNFLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCAwLCBGQUxTRSwgMiwgMiwgMCwgMCwgMTE1Mn0sCisgIHtGQUxTRSwgRkFMU0UsIFRSVUUsIFRSVUUsIDAsIEZBTFNFLCAyLCAyLCAwLCAwLCAxMTUyfSwKKyAge0ZBTFNFLCBGQUxTRSwgVFJVRSwgRkFMU0UsIDAsIEZBTFNFLCAwLCAzLCAwLCAwLCAxMTUyfSwKKyAge0ZBTFNFLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCAwLCBGQUxTRSwgMywgMywgMCwgNiwgNDYwOH0sCisgIHtGQUxTRSwgRkFMU0UsIFRSVUUsIFRSVUUsIDAsIEZBTFNFLCAzLCAzLCAwLCA4LCA0NjA4fSwKKyAge0ZBTFNFLCBGQUxTRSwgVFJVRSwgRkFMU0UsIDAsIEZBTFNFLCAzLCAzLCAwLCA4LCA0NjA4fSwKKyAge0ZBTFNFLCBGQUxTRSwgVFJVRSwgRkFMU0UsIDAsIEZBTFNFLCAwLCA0LCAwLCA4LCA0NjA4fSwKKyAge1RSVUUsIEZBTFNFLCBUUlVFLCBGQUxTRSwgMCwgRkFMU0UsIDAsIDYsIDAsIDgsIDQ2MDh9LAorICB7VFJVRSwgRkFMU0UsIFRSVUUsIEZBTFNFLCAwLCBGQUxTRSwgMCwgNiwgMCwgMTIsIDQ2MDh9LAorICB7VFJVRSwgVFJVRSwgVFJVRSwgRkFMU0UsIDAsIEZBTFNFLCAwLCAxNiwgMCwgMzIsIDQ2MDh9LAorfTsKKworI2RlZmluZSBERUZBVUxUX1FVQUxJVFkgNQorI2RlZmluZSBERUZBVUxUX1BBRERJTkcgMAorI2RlZmluZSBERUZBVUxUX1NFRUtQT0lOVFMgLTEwCisKKyNkZWZpbmUgR1NUX1RZUEVfRkxBQ19FTkNfUVVBTElUWSAoZ3N0X2ZsYWNfZW5jX3F1YWxpdHlfZ2V0X3R5cGUgKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9mbGFjX2VuY19xdWFsaXR5X2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgcXR5cGUgPSAwOworCisgIGlmIChxdHlwZSA9PSAwKSB7CisgICAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAgICB7MCwgIjAgLSBGYXN0ZXN0IGNvbXByZXNzaW9uIiwgIjAifSwKKyAgICAgIHsxLCAiMSIsICIxIn0sCisgICAgICB7MiwgIjIiLCAiMiJ9LAorICAgICAgezMsICIzIiwgIjMifSwKKyAgICAgIHs0LCAiNCIsICI0In0sCisgICAgICB7NSwgIjUgLSBEZWZhdWx0IiwgIjUifSwKKyAgICAgIHs2LCAiNiIsICI2In0sCisgICAgICB7NywgIjciLCAiNyJ9LAorICAgICAgezgsICI4IC0gSGlnaGVzdCBjb21wcmVzc2lvbiIsICI4In0sCisgICAgICB7OSwgIjkgLSBJbnNhbmUiLCAiOSJ9LAorICAgICAgezAsIE5VTEwsIE5VTEx9CisgICAgfTsKKworICAgIHF0eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdEZsYWNFbmNRdWFsaXR5IiwgdmFsdWVzKTsKKyAgfQorICByZXR1cm4gcXR5cGU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmxhY19lbmNfY2xhc3NfaW5pdCAoR3N0RmxhY0VuY0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RBdWRpb0VuY29kZXJDbGFzcyAqYmFzZV9jbGFzczsKKyAgR3N0Q2FwcyAqc2lua19jYXBzOworICBHc3RQYWRUZW1wbGF0ZSAqc2lua190ZW1wbDsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGJhc2VfY2xhc3MgPSAoR3N0QXVkaW9FbmNvZGVyQ2xhc3MgKikgKGtsYXNzKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZmxhY2VuY19kZWJ1ZywgImZsYWNlbmMiLCAwLAorICAgICAgIkZsYWMgZW5jb2RpbmcgZWxlbWVudCIpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9mbGFjX2VuY19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9mbGFjX2VuY19nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2ZsYWNfZW5jX2ZpbmFsaXplOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfUVVBTElUWSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgicXVhbGl0eSIsCisgICAgICAgICAgIlF1YWxpdHkiLAorICAgICAgICAgICJTcGVlZCB2ZXJzdXMgY29tcHJlc3Npb24gdHJhZGVvZmYiLAorICAgICAgICAgIEdTVF9UWVBFX0ZMQUNfRU5DX1FVQUxJVFksIERFRkFVTFRfUVVBTElUWSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLAorICAgICAgUFJPUF9TVFJFQU1BQkxFX1NVQlNFVCwgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJzdHJlYW1hYmxlLXN1YnNldCIsCisgICAgICAgICAgIlN0cmVhbWFibGUgc3Vic2V0IiwKKyAgICAgICAgICAidHJ1ZSB0byBsaW1pdCBlbmNvZGVyIHRvIGdlbmVyYXRpbmcgYSBTdWJzZXQgc3RyZWFtLCBlbHNlIGZhbHNlIiwKKyAgICAgICAgICBUUlVFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfTUlEX1NJREVfU1RFUkVPLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJtaWQtc2lkZS1zdGVyZW8iLCAiRG8gbWlkIHNpZGUgc3RlcmVvIiwKKyAgICAgICAgICAiRG8gbWlkIHNpZGUgc3RlcmVvIChvbmx5IGZvciBzdGVyZW8gaW5wdXQpIiwKKyAgICAgICAgICBmbGFjZW5jX3BhcmFtc1tERUZBVUxUX1FVQUxJVFldLm1pZF9zaWRlLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksCisgICAgICBQUk9QX0xPT1NFX01JRF9TSURFX1NURVJFTywgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJsb29zZS1taWQtc2lkZS1zdGVyZW8iLAorICAgICAgICAgICJMb29zZSBtaWQgc2lkZSBzdGVyZW8iLCAiTG9vc2UgbWlkIHNpZGUgc3RlcmVvIiwKKyAgICAgICAgICBmbGFjZW5jX3BhcmFtc1tERUZBVUxUX1FVQUxJVFldLmxvb3NlX21pZF9zaWRlLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQkxPQ0tTSVpFLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJibG9ja3NpemUiLCAiQmxvY2tzaXplIiwgIkJsb2Nrc2l6ZSBpbiBzYW1wbGVzIiwKKyAgICAgICAgICBGTEFDX19NSU5fQkxPQ0tfU0laRSwgRkxBQ19fTUFYX0JMT0NLX1NJWkUsCisgICAgICAgICAgZmxhY2VuY19wYXJhbXNbREVGQVVMVF9RVUFMSVRZXS5ibG9ja3NpemUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9NQVhfTFBDX09SREVSLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJtYXgtbHBjLW9yZGVyIiwgIk1heCBMUEMgb3JkZXIiLAorICAgICAgICAgICJNYXggTFBDIG9yZGVyOyAwID0+IHVzZSBvbmx5IGZpeGVkIHByZWRpY3RvcnMiLCAwLAorICAgICAgICAgIEZMQUNfX01BWF9MUENfT1JERVIsIGZsYWNlbmNfcGFyYW1zW0RFRkFVTFRfUVVBTElUWV0ubWF4X2xwY19vcmRlciwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLAorICAgICAgUFJPUF9RTFBfQ09FRkZfUFJFQ0lTSU9OLCBnX3BhcmFtX3NwZWNfdWludCAoInFscC1jb2VmZi1wcmVjaXNpb24iLAorICAgICAgICAgICJRTFAgY29lZmZpY2llbnRzIHByZWNpc2lvbiIsCisgICAgICAgICAgIlByZWNpc2lvbiBpbiBiaXRzIG9mIHF1YW50aXplZCBsaW5lYXItcHJlZGljdG9yIGNvZWZmaWNpZW50czsgMCA9IGF1dG9tYXRpYyIsCisgICAgICAgICAgMCwgMzIsIGZsYWNlbmNfcGFyYW1zW0RFRkFVTFRfUVVBTElUWV0ucWxwX2NvZWZmX3ByZWNpc2lvbiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLAorICAgICAgUFJPUF9RTFBfQ09FRkZfUFJFQ19TRUFSQ0gsIGdfcGFyYW1fc3BlY19ib29sZWFuICgicWxwLWNvZWZmLXByZWMtc2VhcmNoIiwKKyAgICAgICAgICAiRG8gUUxQIGNvZWZmaWNpZW50cyBwcmVjaXNpb24gc2VhcmNoIiwKKyAgICAgICAgICAiZmFsc2UgPSB1c2UgcWxwX2NvZWZmX3ByZWNpc2lvbiwgIgorICAgICAgICAgICJ0cnVlID0gc2VhcmNoIGFyb3VuZCBxbHBfY29lZmZfcHJlY2lzaW9uLCB0YWtlIGJlc3QiLAorICAgICAgICAgIGZsYWNlbmNfcGFyYW1zW0RFRkFVTFRfUVVBTElUWV0ucWxwX2NvZWZmX3ByZWNfc2VhcmNoLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfRVNDQVBFX0NPRElORywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZXNjYXBlLWNvZGluZyIsICJEbyBFc2NhcGUgY29kaW5nIiwKKyAgICAgICAgICAic2VhcmNoIGZvciBlc2NhcGUgY29kZXMgaW4gdGhlIGVudHJvcHkgY29kaW5nIHN0YWdlICIKKyAgICAgICAgICAiZm9yIHNsaWdodGx5IGJldHRlciBjb21wcmVzc2lvbiIsCisgICAgICAgICAgZmxhY2VuY19wYXJhbXNbREVGQVVMVF9RVUFMSVRZXS5lc2NhcGVfY29kaW5nLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksCisgICAgICBQUk9QX0VYSEFVU1RJVkVfTU9ERUxfU0VBUkNILAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJleGhhdXN0aXZlLW1vZGVsLXNlYXJjaCIsCisgICAgICAgICAgIkRvIGV4aGF1c3RpdmUgbW9kZWwgc2VhcmNoIiwKKyAgICAgICAgICAiZG8gZXhoYXVzdGl2ZSBzZWFyY2ggb2YgTFAgY29lZmZpY2llbnQgcXVhbnRpemF0aW9uIChleHBlbnNpdmUhKSIsCisgICAgICAgICAgZmxhY2VuY19wYXJhbXNbREVGQVVMVF9RVUFMSVRZXS5leGhhdXN0aXZlX21vZGVsX3NlYXJjaCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLAorICAgICAgUFJPUF9NSU5fUkVTSURVQUxfUEFSVElUSU9OX09SREVSLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJtaW4tcmVzaWR1YWwtcGFydGl0aW9uLW9yZGVyIiwKKyAgICAgICAgICAiTWluIHJlc2lkdWFsIHBhcnRpdGlvbiBvcmRlciIsCisgICAgICAgICAgIk1pbiByZXNpZHVhbCBwYXJ0aXRpb24gb3JkZXIgKGFib3ZlIDQgZG9lc24ndCB1c3VhbGx5IGhlbHAgbXVjaCkiLCAwLAorICAgICAgICAgIDE2LCBmbGFjZW5jX3BhcmFtc1tERUZBVUxUX1FVQUxJVFldLm1pbl9yZXNpZHVhbF9wYXJ0aXRpb25fb3JkZXIsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIFBST1BfTUFYX1JFU0lEVUFMX1BBUlRJVElPTl9PUkRFUiwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LXJlc2lkdWFsLXBhcnRpdGlvbi1vcmRlciIsCisgICAgICAgICAgIk1heCByZXNpZHVhbCBwYXJ0aXRpb24gb3JkZXIiLAorICAgICAgICAgICJNYXggcmVzaWR1YWwgcGFydGl0aW9uIG9yZGVyIChhYm92ZSA0IGRvZXNuJ3QgdXN1YWxseSBoZWxwIG11Y2gpIiwgMCwKKyAgICAgICAgICAxNiwgZmxhY2VuY19wYXJhbXNbREVGQVVMVF9RVUFMSVRZXS5tYXhfcmVzaWR1YWxfcGFydGl0aW9uX29yZGVyLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksCisgICAgICBQUk9QX1JJQ0VfUEFSQU1FVEVSX1NFQVJDSF9ESVNULAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJyaWNlLXBhcmFtZXRlci1zZWFyY2gtZGlzdCIsCisgICAgICAgICAgInJpY2VfcGFyYW1ldGVyX3NlYXJjaF9kaXN0IiwKKyAgICAgICAgICAiMCA9IHRyeSBvbmx5IGNhbGMnZCBwYXJhbWV0ZXIgazsgZWxzZSB0cnkgYWxsIFtrLWRpc3QuLmsrZGlzdF0gIgorICAgICAgICAgICJwYXJhbWV0ZXJzLCB1c2UgYmVzdCIsIDAsIEZMQUNfX01BWF9SSUNFX1BBUlRJVElPTl9PUkRFUiwKKyAgICAgICAgICBmbGFjZW5jX3BhcmFtc1tERUZBVUxUX1FVQUxJVFldLnJpY2VfcGFyYW1ldGVyX3NlYXJjaF9kaXN0LAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksCisgICAgICBQUk9QX1BBRERJTkcsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInBhZGRpbmciLAorICAgICAgICAgICJQYWRkaW5nIiwKKyAgICAgICAgICAiV3JpdGUgYSBQQURESU5HIGJsb2NrIHdpdGggdGhpcyBsZW5ndGggaW4gYnl0ZXMiLCAwLCBHX01BWFVJTlQsCisgICAgICAgICAgREVGQVVMVF9QQURESU5HLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksCisgICAgICBQUk9QX1NFRUtQT0lOVFMsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgic2Vla3BvaW50cyIsCisgICAgICAgICAgIlNlZWtwb2ludHMiLAorICAgICAgICAgICJBZGQgU0VFS1RBQkxFIG1ldGFkYXRhIChpZiA+IDAsIG51bWJlciBvZiBlbnRyaWVzLCBpZiA8IDAsIGludGVydmFsIGluIHNlYykiLAorICAgICAgICAgIC1HX01BWElOVCwgR19NQVhJTlQsCisgICAgICAgICAgREVGQVVMVF9TRUVLUE9JTlRTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfZmFjdG9yeSk7CisKKyAgc2lua19jYXBzID0gZ3N0X2ZsYWNfZW5jX2dlbmVyYXRlX3NpbmtfY2FwcyAoKTsKKyAgc2lua190ZW1wbCA9IGdzdF9wYWRfdGVtcGxhdGVfbmV3ICgic2luayIsCisgICAgICBHU1RfUEFEX1NJTkssIEdTVF9QQURfQUxXQVlTLCBzaW5rX2NhcHMpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCBzaW5rX3RlbXBsKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNpbmtfY2Fwcyk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkZMQUMgYXVkaW8gZW5jb2RlciIsCisgICAgICAiQ29kZWMvRW5jb2Rlci9BdWRpbyIsCisgICAgICAiRW5jb2RlcyBhdWRpbyB3aXRoIHRoZSBGTEFDIGxvc3NsZXNzIGF1ZGlvIGVuY29kZXIiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BjaGVsbG8uYmU+Iik7CisKKyAgYmFzZV9jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ZsYWNfZW5jX3N0YXJ0KTsKKyAgYmFzZV9jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmxhY19lbmNfc3RvcCk7CisgIGJhc2VfY2xhc3MtPnNldF9mb3JtYXQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ZsYWNfZW5jX3NldF9mb3JtYXQpOworICBiYXNlX2NsYXNzLT5oYW5kbGVfZnJhbWUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ZsYWNfZW5jX2hhbmRsZV9mcmFtZSk7CisgIGJhc2VfY2xhc3MtPmdldGNhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ZsYWNfZW5jX2dldGNhcHMpOworICBiYXNlX2NsYXNzLT5zaW5rX2V2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbGFjX2VuY19zaW5rX2V2ZW50KTsKKyAgYmFzZV9jbGFzcy0+c2lua19xdWVyeSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmxhY19lbmNfc2lua19xdWVyeSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmxhY19lbmNfaW5pdCAoR3N0RmxhY0VuYyAqIGZsYWNlbmMpCit7CisgIEdzdEF1ZGlvRW5jb2RlciAqZW5jID0gR1NUX0FVRElPX0VOQ09ERVIgKGZsYWNlbmMpOworCisgIGZsYWNlbmMtPmVuY29kZXIgPSBGTEFDX19zdHJlYW1fZW5jb2Rlcl9uZXcgKCk7CisgIGdzdF9mbGFjX2VuY191cGRhdGVfcXVhbGl0eSAoZmxhY2VuYywgREVGQVVMVF9RVUFMSVRZKTsKKworICAvKiBhcnJhbmdlIGdyYW51bGVwb3MgbWFya2luZyAoYW5kIHJlcXVpcmVkIHBlcmZlY3QgdHMpICovCisgIGdzdF9hdWRpb19lbmNvZGVyX3NldF9tYXJrX2dyYW51bGUgKGVuYywgVFJVRSk7CisgIGdzdF9hdWRpb19lbmNvZGVyX3NldF9wZXJmZWN0X3RpbWVzdGFtcCAoZW5jLCBUUlVFKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9mbGFjX2VuY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0RmxhY0VuYyAqZmxhY2VuYyA9IEdTVF9GTEFDX0VOQyAob2JqZWN0KTsKKworICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9kZWxldGUgKGZsYWNlbmMtPmVuY29kZXIpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmxhY19lbmNfc3RhcnQgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYykKK3sKKyAgR3N0RmxhY0VuYyAqZmxhY2VuYyA9IEdTVF9GTEFDX0VOQyAoZW5jKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJzdGFydCIpOworICBmbGFjZW5jLT5zdG9wcGVkID0gVFJVRTsKKyAgZmxhY2VuYy0+Z290X2hlYWRlcnMgPSBGQUxTRTsKKyAgZmxhY2VuYy0+bGFzdF9mbG93ID0gR1NUX0ZMT1dfT0s7CisgIGZsYWNlbmMtPm9mZnNldCA9IDA7CisgIGZsYWNlbmMtPmVvcyA9IEZBTFNFOworICBmbGFjZW5jLT50YWdzID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZmxhY2VuYy0+dG9jID0gTlVMTDsKKyAgZmxhY2VuYy0+c2FtcGxlc19pbiA9IDA7CisgIGZsYWNlbmMtPnNhbXBsZXNfb3V0ID0gMDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmxhY19lbmNfc3RvcCAoR3N0QXVkaW9FbmNvZGVyICogZW5jKQoreworICBHc3RGbGFjRW5jICpmbGFjZW5jID0gR1NUX0ZMQUNfRU5DIChlbmMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgInN0b3AiKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmIChmbGFjZW5jLT50YWdzKTsKKyAgZmxhY2VuYy0+dGFncyA9IE5VTEw7CisgIGlmIChmbGFjZW5jLT50b2MpCisgICAgZ3N0X3RvY191bnJlZiAoZmxhY2VuYy0+dG9jKTsKKyAgZmxhY2VuYy0+dG9jID0gTlVMTDsKKyAgaWYgKEZMQUNfX3N0cmVhbV9lbmNvZGVyX2dldF9zdGF0ZSAoZmxhY2VuYy0+ZW5jb2RlcikgIT0KKyAgICAgIEZMQUNfX1NUUkVBTV9FTkNPREVSX1VOSU5JVElBTElaRUQpIHsKKyAgICBmbGFjZW5jLT5zdG9wcGVkID0gVFJVRTsKKyAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9maW5pc2ggKGZsYWNlbmMtPmVuY29kZXIpOworICB9CisgIGlmIChmbGFjZW5jLT5tZXRhKSB7CisgICAgRkxBQ19fbWV0YWRhdGFfb2JqZWN0X2RlbGV0ZSAoZmxhY2VuYy0+bWV0YVswXSk7CisKKyAgICBpZiAoZmxhY2VuYy0+bWV0YVsxXSkKKyAgICAgIEZMQUNfX21ldGFkYXRhX29iamVjdF9kZWxldGUgKGZsYWNlbmMtPm1ldGFbMV0pOworCisgICAgaWYgKGZsYWNlbmMtPm1ldGFbMl0pCisgICAgICBGTEFDX19tZXRhZGF0YV9vYmplY3RfZGVsZXRlIChmbGFjZW5jLT5tZXRhWzJdKTsKKworICAgIGlmIChmbGFjZW5jLT5tZXRhWzNdKQorICAgICAgRkxBQ19fbWV0YWRhdGFfb2JqZWN0X2RlbGV0ZSAoZmxhY2VuYy0+bWV0YVszXSk7CisKKyAgICBnX2ZyZWUgKGZsYWNlbmMtPm1ldGEpOworICAgIGZsYWNlbmMtPm1ldGEgPSBOVUxMOworICB9CisgIGdfbGlzdF9mb3JlYWNoIChmbGFjZW5jLT5oZWFkZXJzLCAoR0Z1bmMpIGdzdF9taW5pX29iamVjdF91bnJlZiwgTlVMTCk7CisgIGdfbGlzdF9mcmVlIChmbGFjZW5jLT5oZWFkZXJzKTsKKyAgZmxhY2VuYy0+aGVhZGVycyA9IE5VTEw7CisKKyAgZ3N0X3RhZ19zZXR0ZXJfcmVzZXRfdGFncyAoR1NUX1RBR19TRVRURVIgKGVuYykpOworICBnc3RfdG9jX3NldHRlcl9yZXNldCAoR1NUX1RPQ19TRVRURVIgKGVuYykpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorYWRkX29uZV90YWcgKGNvbnN0IEdzdFRhZ0xpc3QgKiBsaXN0LCBjb25zdCBnY2hhciAqIHRhZywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHTGlzdCAqY29tbWVudHM7CisgIEdMaXN0ICppdDsKKyAgR3N0RmxhY0VuYyAqZmxhY2VuYyA9IEdTVF9GTEFDX0VOQyAodXNlcl9kYXRhKTsKKworICAvKiBJTUFHRSBhbmQgUFJFVklFV19JTUFHRSB0YWdzIGFyZSBhbHJlYWR5IHdyaXR0ZW4KKyAgICogZGlmZmVyZW50bHksIG5vIG5lZWQgdG8gc3RvcmUgdGhlbSBpbnNpZGUgdGhlCisgICAqIHZvcmJpc2NvbW1lbnRzIHRvbyAqLworICBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfSU1BR0UpID09IDAKKyAgICAgIHx8IHN0cmNtcCAodGFnLCBHU1RfVEFHX1BSRVZJRVdfSU1BR0UpID09IDApCisgICAgcmV0dXJuOworCisgIGNvbW1lbnRzID0gZ3N0X3RhZ190b192b3JiaXNfY29tbWVudHMgKGxpc3QsIHRhZyk7CisgIGZvciAoaXQgPSBjb21tZW50czsgaXQgIT0gTlVMTDsgaXQgPSBpdC0+bmV4dCkgeworICAgIEZMQUNfX1N0cmVhbU1ldGFkYXRhX1ZvcmJpc0NvbW1lbnRfRW50cnkgY29tbW1lbnRfZW50cnk7CisKKyAgICBjb21tbWVudF9lbnRyeS5sZW5ndGggPSBzdHJsZW4gKGl0LT5kYXRhKTsKKyAgICBjb21tbWVudF9lbnRyeS5lbnRyeSA9IGl0LT5kYXRhOworICAgIEZMQUNfX21ldGFkYXRhX29iamVjdF92b3JiaXNjb21tZW50X2luc2VydF9jb21tZW50IChmbGFjZW5jLT5tZXRhWzBdLAorICAgICAgICBmbGFjZW5jLT5tZXRhWzBdLT5kYXRhLnZvcmJpc19jb21tZW50Lm51bV9jb21tZW50cywKKyAgICAgICAgY29tbW1lbnRfZW50cnksIFRSVUUpOworICAgIGdfZnJlZSAoaXQtPmRhdGEpOworICB9CisgIGdfbGlzdF9mcmVlIChjb21tZW50cyk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorYWRkX2N1ZXNoZWV0IChjb25zdCBHc3RUb2MgKiB0b2MsIGd1aW50IHNhbXBsZV9yYXRlLAorICAgIEZMQUNfX1N0cmVhbU1ldGFkYXRhICogY3Vlc2hlZXQpCit7CisgIGdpbnQ4IHRyYWNrX251bSA9IDA7CisgIGdpbnQ2NCBzdGFydCwgc3RvcDsKKyAgZ2NoYXIgKmlzcmMgPSBOVUxMOworICBjb25zdCBnY2hhciAqaXNfbGVnYWw7CisgIEdMaXN0ICpsaXN0OworICBHc3RUYWdMaXN0ICp0YWdzOworICBHc3RUb2NFbnRyeSAqZW50cnksICpzdWJlbnRyeSA9IE5VTEw7CisgIEZMQUNfX1N0cmVhbU1ldGFkYXRhX0N1ZVNoZWV0ICpjczsKKyAgRkxBQ19fU3RyZWFtTWV0YWRhdGFfQ3VlU2hlZXRfVHJhY2sgKnRyYWNrOworCisgIGNzID0gJmN1ZXNoZWV0LT5kYXRhLmN1ZV9zaGVldDsKKyAgaWYgKCFjcykKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogY2hlY2sgaWYgdGhlIFRPQyBlbnRyaWVzIGlzIHZhbGlkICovCisgIGxpc3QgPSBnc3RfdG9jX2dldF9lbnRyaWVzICh0b2MpOworICBlbnRyeSA9IGxpc3QtPmRhdGE7CisgIGlmIChnc3RfdG9jX2VudHJ5X2lzX2FsdGVybmF0aXZlIChlbnRyeSkpIHsKKyAgICBsaXN0ID0gZ3N0X3RvY19lbnRyeV9nZXRfc3ViX2VudHJpZXMgKGVudHJ5KTsKKyAgICB3aGlsZSAobGlzdCkgeworICAgICAgc3ViZW50cnkgPSBsaXN0LT5kYXRhOworICAgICAgaWYgKCFnc3RfdG9jX2VudHJ5X2lzX3NlcXVlbmNlIChzdWJlbnRyeSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGxpc3QgPSBnX2xpc3RfbmV4dCAobGlzdCk7CisgICAgfQorICAgIGxpc3QgPSBnc3RfdG9jX2VudHJ5X2dldF9zdWJfZW50cmllcyAoZW50cnkpOworICB9CisgIGlmIChnc3RfdG9jX2VudHJ5X2lzX3NlcXVlbmNlIChlbnRyeSkpIHsKKyAgICB3aGlsZSAobGlzdCkgeworICAgICAgZW50cnkgPSBsaXN0LT5kYXRhOworICAgICAgaWYgKCFnc3RfdG9jX2VudHJ5X2lzX3NlcXVlbmNlIChlbnRyeSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGxpc3QgPSBnX2xpc3RfbmV4dCAobGlzdCk7CisgICAgfQorICAgIGxpc3QgPSBnc3RfdG9jX2dldF9lbnRyaWVzICh0b2MpOworICB9CisKKyAgLyogYWRkIHRyYWNrcyBpbiBjdWVzaGVldCAqLworICB3aGlsZSAobGlzdCkgeworICAgIGVudHJ5ID0gbGlzdC0+ZGF0YTsKKyAgICBnc3RfdG9jX2VudHJ5X2dldF9zdGFydF9zdG9wX3RpbWVzIChlbnRyeSwgJnN0YXJ0LCAmc3RvcCk7CisgICAgdGFncyA9IGdzdF90b2NfZW50cnlfZ2V0X3RhZ3MgKGVudHJ5KTsKKyAgICBpZiAodGFncykKKyAgICAgIGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nICh0YWdzLCBHU1RfVEFHX0lTUkMsICZpc3JjKTsKKyAgICB0cmFjayA9IEZMQUNfX21ldGFkYXRhX29iamVjdF9jdWVzaGVldF90cmFja19uZXcgKCk7CisgICAgdHJhY2stPm9mZnNldCA9CisgICAgICAgIChGTEFDX191aW50NjQpIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAoc3RhcnQsIHNhbXBsZV9yYXRlLAorICAgICAgICBHU1RfU0VDT05EKTsKKyAgICB0cmFjay0+bnVtYmVyID0gKEZMQUNfX2J5dGUpIHRyYWNrX251bSArIDE7CisgICAgaWYgKGlzcmMgIT0gTlVMTCAmJiBzdHJsZW4gKGlzcmMpIDw9IDEyKQorICAgICAgZ19zdHJsY3B5ICh0cmFjay0+aXNyYywgaXNyYywgMTMpOworICAgIGlmICh0cmFjay0+bnVtYmVyIDw9IDApCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFGTEFDX19tZXRhZGF0YV9vYmplY3RfY3Vlc2hlZXRfaW5zZXJ0X3RyYWNrIChjdWVzaGVldCwgdHJhY2tfbnVtLAorICAgICAgICAgICAgdHJhY2ssIEZBTFNFKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIUZMQUNfX21ldGFkYXRhX29iamVjdF9jdWVzaGVldF90cmFja19pbnNlcnRfYmxhbmtfaW5kZXggKGN1ZXNoZWV0LAorICAgICAgICAgICAgdHJhY2tfbnVtLCAwKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB0cmFja19udW0rKzsKKyAgICBsaXN0ID0gZ19saXN0X25leHQgKGxpc3QpOworICB9CisKKyAgaWYgKGNzLT5udW1fdHJhY2tzIDw9IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIGFkZCBsZWFkLW91dCB0cmFjayBpbiBjdWVzaGVldCAqLworICB0cmFjayA9IEZMQUNfX21ldGFkYXRhX29iamVjdF9jdWVzaGVldF90cmFja19uZXcgKCk7CisgIHRyYWNrLT5vZmZzZXQgPQorICAgICAgKEZMQUNfX3VpbnQ2NCkgZ3N0X3V0aWxfdWludDY0X3NjYWxlX3JvdW5kIChzdG9wLCBzYW1wbGVfcmF0ZSwKKyAgICAgIEdTVF9TRUNPTkQpOworICB0cmFjay0+bnVtYmVyID0gMjU1OworICBpZiAoIUZMQUNfX21ldGFkYXRhX29iamVjdF9jdWVzaGVldF9pbnNlcnRfdHJhY2sgKGN1ZXNoZWV0LCBjcy0+bnVtX3RyYWNrcywKKyAgICAgICAgICB0cmFjaywgRkFMU0UpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBjaGVjayBpZiB0aGUgY3Vlc2hlZXQgaXMgdmFsaWQgKi8KKyAgaWYgKCFGTEFDX19tZXRhZGF0YV9vYmplY3RfY3Vlc2hlZXRfaXNfbGVnYWwgKGN1ZXNoZWV0LCBGQUxTRSwgJmlzX2xlZ2FsKSkgeworICAgIGdfd2FybmluZyAoIiVzXG4iLCBpc19sZWdhbCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmxhY19lbmNfc2V0X21ldGFkYXRhIChHc3RGbGFjRW5jICogZmxhY2VuYywgR3N0QXVkaW9JbmZvICogaW5mbywKKyAgICBndWludDY0IHRvdGFsX3NhbXBsZXMpCit7CisgIGNvbnN0IEdzdFRhZ0xpc3QgKnVzZXJfdGFnczsKKyAgR3N0VGFnTGlzdCAqY29weTsKKyAgZ2ludCBlbnRyaWVzID0gMTsKKyAgZ2ludCBuX2ltYWdlcywgbl9wcmV2aWV3X2ltYWdlczsKKyAgRkxBQ19fU3RyZWFtTWV0YWRhdGEgKmN1ZXNoZWV0OworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKGZsYWNlbmMgIT0gTlVMTCk7CisKKyAgdXNlcl90YWdzID0gZ3N0X3RhZ19zZXR0ZXJfZ2V0X3RhZ19saXN0IChHU1RfVEFHX1NFVFRFUiAoZmxhY2VuYykpOworICBpZiAoKGZsYWNlbmMtPnRhZ3MgPT0gTlVMTCkgJiYgKHVzZXJfdGFncyA9PSBOVUxMKSkgeworICAgIHJldHVybjsKKyAgfQorICBjb3B5ID0gZ3N0X3RhZ19saXN0X21lcmdlICh1c2VyX3RhZ3MsIGZsYWNlbmMtPnRhZ3MsCisgICAgICBnc3RfdGFnX3NldHRlcl9nZXRfdGFnX21lcmdlX21vZGUgKEdTVF9UQUdfU0VUVEVSIChmbGFjZW5jKSkpOworICBuX2ltYWdlcyA9IGdzdF90YWdfbGlzdF9nZXRfdGFnX3NpemUgKGNvcHksIEdTVF9UQUdfSU1BR0UpOworICBuX3ByZXZpZXdfaW1hZ2VzID0gZ3N0X3RhZ19saXN0X2dldF90YWdfc2l6ZSAoY29weSwgR1NUX1RBR19QUkVWSUVXX0lNQUdFKTsKKworICBmbGFjZW5jLT5tZXRhID0KKyAgICAgIGdfbmV3MCAoRkxBQ19fU3RyZWFtTWV0YWRhdGEgKiwgNCArIG5faW1hZ2VzICsgbl9wcmV2aWV3X2ltYWdlcyk7CisKKyAgZmxhY2VuYy0+bWV0YVswXSA9CisgICAgICBGTEFDX19tZXRhZGF0YV9vYmplY3RfbmV3IChGTEFDX19NRVRBREFUQV9UWVBFX1ZPUkJJU19DT01NRU5UKTsKKyAgZ3N0X3RhZ19saXN0X2ZvcmVhY2ggKGNvcHksIGFkZF9vbmVfdGFnLCBmbGFjZW5jKTsKKworICBpZiAoIWZsYWNlbmMtPnRvYykKKyAgICBmbGFjZW5jLT50b2MgPSBnc3RfdG9jX3NldHRlcl9nZXRfdG9jIChHU1RfVE9DX1NFVFRFUiAoZmxhY2VuYykpOworCisgIGlmIChmbGFjZW5jLT50b2MpIHsKKyAgICBjdWVzaGVldCA9IEZMQUNfX21ldGFkYXRhX29iamVjdF9uZXcgKEZMQUNfX01FVEFEQVRBX1RZUEVfQ1VFU0hFRVQpOworICAgIGlmIChhZGRfY3Vlc2hlZXQgKGZsYWNlbmMtPnRvYywgR1NUX0FVRElPX0lORk9fUkFURSAoaW5mbyksIGN1ZXNoZWV0KSkgeworICAgICAgZmxhY2VuYy0+bWV0YVtlbnRyaWVzXSA9IGN1ZXNoZWV0OworICAgICAgZW50cmllcysrOworICAgIH0gZWxzZSB7CisgICAgICBGTEFDX19tZXRhZGF0YV9vYmplY3RfZGVsZXRlIChjdWVzaGVldCk7CisgICAgICBmbGFjZW5jLT5tZXRhW2VudHJpZXNdID0gTlVMTDsKKyAgICB9CisgIH0KKworICBpZiAobl9pbWFnZXMgKyBuX3ByZXZpZXdfaW1hZ2VzID4gMCkgeworICAgIEdzdFNhbXBsZSAqc2FtcGxlOworICAgIEdzdEJ1ZmZlciAqYnVmZmVyOworICAgIEdzdENhcHMgKmNhcHM7CisgICAgY29uc3QgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgICAgR3N0VGFnSW1hZ2VUeXBlIGltYWdlX3R5cGUgPSBHU1RfVEFHX0lNQUdFX1RZUEVfTk9ORTsKKyAgICBnaW50IGksIHdpZHRoID0gMCwgaGVpZ2h0ID0gMCwgcG5nX2ljb25fY291bnQgPSAwLCBvdGhlcl9pY29uX2NvdW50ID0gMDsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuX2ltYWdlcyArIG5fcHJldmlld19pbWFnZXM7IGkrKykgeworICAgICAgZ2Jvb2xlYW4gaXNfcHJldmlld19pbWFnZSA9IChpID49IG5faW1hZ2VzKTsKKworICAgICAgaWYgKGkgPCBuX2ltYWdlcykgeworICAgICAgICBpZiAoIWdzdF90YWdfbGlzdF9nZXRfc2FtcGxlX2luZGV4IChjb3B5LCBHU1RfVEFHX0lNQUdFLCBpLCAmc2FtcGxlKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghZ3N0X3RhZ19saXN0X2dldF9zYW1wbGVfaW5kZXggKGNvcHksIEdTVF9UQUdfUFJFVklFV19JTUFHRSwKKyAgICAgICAgICAgICAgICBpIC0gbl9pbWFnZXMsICZzYW1wbGUpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBzdHJ1Y3R1cmUgPSBnc3Rfc2FtcGxlX2dldF9pbmZvIChzYW1wbGUpOworICAgICAgY2FwcyA9IGdzdF9zYW1wbGVfZ2V0X2NhcHMgKHNhbXBsZSk7CisgICAgICBpZiAoIWNhcHMpIHsKKyAgICAgICAgR1NUX0ZJWE1FX09CSkVDVCAoZmxhY2VuYywgIkltYWdlIHRhZyB3aXRob3V0IGNhcHMiKTsKKyAgICAgICAgZ3N0X3NhbXBsZV91bnJlZiAoc2FtcGxlKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGZsYWNlbmMtPm1ldGFbZW50cmllc10gPQorICAgICAgICAgIEZMQUNfX21ldGFkYXRhX29iamVjdF9uZXcgKEZMQUNfX01FVEFEQVRBX1RZUEVfUElDVFVSRSk7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChmbGFjZW5jLCAiaW1hZ2UgaW5mbzogJSIgR1NUX1BUUl9GT1JNQVQsIHN0cnVjdHVyZSk7CisKKyAgICAgIGlmIChzdHJ1Y3R1cmUpCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0IChzdHJ1Y3R1cmUsICJpbWFnZS10eXBlIiwgR1NUX1RZUEVfVEFHX0lNQUdFX1RZUEUsCisgICAgICAgICAgICAmaW1hZ2VfdHlwZSwgTlVMTCk7CisgICAgICBlbHNlCisgICAgICAgIGltYWdlX3R5cGUgPSBHU1RfVEFHX0lNQUdFX1RZUEVfTk9ORTsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKGZsYWNlbmMsICJpbWFnZSBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICAgICAgZ3N0X3N0cnVjdHVyZV9nZXQgKHN0cnVjdHVyZSwgIndpZHRoIiwgR19UWVBFX0lOVCwgJndpZHRoLAorICAgICAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCAmaGVpZ2h0LCBOVUxMKTsKKworICAgICAgLyogQ29udmVydCB0byBJRDN2MiBBUElDIGltYWdlIHR5cGUgKi8KKyAgICAgIGlmIChpbWFnZV90eXBlID09IEdTVF9UQUdfSU1BR0VfVFlQRV9OT05FKSB7CisgICAgICAgIGlmIChpc19wcmV2aWV3X2ltYWdlKSB7CisgICAgICAgICAgLyogMSAtIDMyeDMyIHBpeGVscyAnZmlsZSBpY29uJyAoUE5HIG9ubHkpCisgICAgICAgICAgICogMiAtIE90aGVyIGZpbGUgaWNvbgorICAgICAgICAgICAqIFRoZXJlIG1heSBvbmx5IGJlIG9uZSBlYWNoIG9mIHBpY3R1cmUgdHlwZSAxIGFuZCAyIGluIGEgZmlsZS4gKi8KKyAgICAgICAgICBpZiAod2lkdGggPT0gMzIgJiYgaGVpZ2h0ID09IDMyCisgICAgICAgICAgICAgICYmIGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImltYWdlL3BuZyIpCisgICAgICAgICAgICAgICYmIHBuZ19pY29uX2NvdW50KysgPT0gMCkgeworICAgICAgICAgICAgaW1hZ2VfdHlwZSA9IDE7CisgICAgICAgICAgfSBlbHNlIGlmICh3aWR0aCA8PSAzMiAmJiBoZWlnaHQgPD0gMzIgJiYgb3RoZXJfaWNvbl9jb3VudCsrID09IDApIHsKKyAgICAgICAgICAgIGltYWdlX3R5cGUgPSAyOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbWFnZV90eXBlID0gMDsgICAgIC8qIE90aGVyICovCisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGltYWdlX3R5cGUgPSAwOyAgICAgICAvKiBPdGhlciAqLworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBHU3RyZWFtZXIgZW51bSBpcyB0aGUgc2FtZSBidXQgd2l0aG91dCB0aGUgdHdvIGljb24gdHlwZXMgMSsyICovCisgICAgICAgIGltYWdlX3R5cGUgPSBpbWFnZV90eXBlICsgMjsKKyAgICAgIH0KKworICAgICAgYnVmZmVyID0gZ3N0X3NhbXBsZV9nZXRfYnVmZmVyIChzYW1wbGUpOworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgIEZMQUNfX21ldGFkYXRhX29iamVjdF9waWN0dXJlX3NldF9kYXRhIChmbGFjZW5jLT5tZXRhW2VudHJpZXNdLAorICAgICAgICAgIG1hcC5kYXRhLCBtYXAuc2l6ZSwgVFJVRSk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgICAgICBHU1RfTE9HX09CSkVDVCAoZmxhY2VuYywgIlNldHRpbmcgcGljdHVyZSB0eXBlICVkIiwgaW1hZ2VfdHlwZSk7CisgICAgICBmbGFjZW5jLT5tZXRhW2VudHJpZXNdLT5kYXRhLnBpY3R1cmUudHlwZSA9IGltYWdlX3R5cGU7CisKKyAgICAgIGlmICh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCkgeworICAgICAgICBmbGFjZW5jLT5tZXRhW2VudHJpZXNdLT5kYXRhLnBpY3R1cmUud2lkdGggPSB3aWR0aDsKKyAgICAgICAgZmxhY2VuYy0+bWV0YVtlbnRyaWVzXS0+ZGF0YS5waWN0dXJlLmhlaWdodCA9IGhlaWdodDsKKyAgICAgIH0KKworICAgICAgRkxBQ19fbWV0YWRhdGFfb2JqZWN0X3BpY3R1cmVfc2V0X21pbWVfdHlwZSAoZmxhY2VuYy0+bWV0YVtlbnRyaWVzXSwKKyAgICAgICAgICAoY2hhciAqKSBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzdHJ1Y3R1cmUpLCBUUlVFKTsKKworICAgICAgZ3N0X3NhbXBsZV91bnJlZiAoc2FtcGxlKTsKKyAgICAgIGVudHJpZXMrKzsKKyAgICB9CisgIH0KKworICBpZiAoZmxhY2VuYy0+c2Vla3BvaW50cyAmJiB0b3RhbF9zYW1wbGVzICE9IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICBnYm9vbGVhbiByZXM7CisgICAgZ3VpbnQgc2FtcGxlczsKKworICAgIGZsYWNlbmMtPm1ldGFbZW50cmllc10gPQorICAgICAgICBGTEFDX19tZXRhZGF0YV9vYmplY3RfbmV3IChGTEFDX19NRVRBREFUQV9UWVBFX1NFRUtUQUJMRSk7CisgICAgaWYgKGZsYWNlbmMtPnNlZWtwb2ludHMgPiAwKSB7CisgICAgICByZXMgPQorICAgICAgICAgIEZMQUNfX21ldGFkYXRhX29iamVjdF9zZWVrdGFibGVfdGVtcGxhdGVfYXBwZW5kX3NwYWNlZF9wb2ludHMKKyAgICAgICAgICAoZmxhY2VuYy0+bWV0YVtlbnRyaWVzXSwgZmxhY2VuYy0+c2Vla3BvaW50cywgdG90YWxfc2FtcGxlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNhbXBsZXMgPSAtZmxhY2VuYy0+c2Vla3BvaW50cyAqIEdTVF9BVURJT19JTkZPX1JBVEUgKGluZm8pOworICAgICAgcmVzID0KKyAgICAgICAgICBGTEFDX19tZXRhZGF0YV9vYmplY3Rfc2Vla3RhYmxlX3RlbXBsYXRlX2FwcGVuZF9zcGFjZWRfcG9pbnRzX2J5X3NhbXBsZXMKKyAgICAgICAgICAoZmxhY2VuYy0+bWV0YVtlbnRyaWVzXSwgc2FtcGxlcywgdG90YWxfc2FtcGxlcyk7CisgICAgfQorICAgIGlmICghcmVzKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjZW5jLCAiYWRkaW5nIHNlZWtwb2ludCB0ZW1wbGF0ZSAlZCBmYWlsZWQiLAorICAgICAgICAgIGZsYWNlbmMtPnNlZWtwb2ludHMpOworICAgICAgRkxBQ19fbWV0YWRhdGFfb2JqZWN0X2RlbGV0ZSAoZmxhY2VuYy0+bWV0YVsxXSk7CisgICAgICBmbGFjZW5jLT5tZXRhW2VudHJpZXNdID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgZW50cmllcysrOworICAgIH0KKyAgfSBlbHNlIGlmIChmbGFjZW5jLT5zZWVrcG9pbnRzICYmIHRvdGFsX3NhbXBsZXMgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZmxhY2VuYywgInRvdGFsIHRpbWUgdW5rbm93bjsgY2FuIG5vdCBhZGQgc2Vla3BvaW50cyIpOworICB9CisKKyAgaWYgKGZsYWNlbmMtPnBhZGRpbmcgPiAwKSB7CisgICAgZmxhY2VuYy0+bWV0YVtlbnRyaWVzXSA9CisgICAgICAgIEZMQUNfX21ldGFkYXRhX29iamVjdF9uZXcgKEZMQUNfX01FVEFEQVRBX1RZUEVfUEFERElORyk7CisgICAgZmxhY2VuYy0+bWV0YVtlbnRyaWVzXS0+bGVuZ3RoID0gZmxhY2VuYy0+cGFkZGluZzsKKyAgICBlbnRyaWVzKys7CisgIH0KKworICBpZiAoRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X21ldGFkYXRhIChmbGFjZW5jLT5lbmNvZGVyLAorICAgICAgICAgIGZsYWNlbmMtPm1ldGEsIGVudHJpZXMpICE9IHRydWUpCisgICAgZ193YXJuaW5nICgiRHVkZSwgaSdtIGFscmVhZHkgaW5pdGlhbGl6ZWQhIik7CisKKyAgZ3N0X3RhZ19saXN0X3VucmVmIChjb3B5KTsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X2ZsYWNfZW5jX2dlbmVyYXRlX3NpbmtfY2FwcyAodm9pZCkKK3sKKyAgR3N0Q2FwcyAqcmV0OworICBnaW50IGk7CisgIEdWYWx1ZSB2X2xpc3QgPSB7IDAsIH07CisgIEdWYWx1ZSB2ID0geyAwLCB9OworICBHc3RTdHJ1Y3R1cmUgKnMsICpzMjsKKworICBnX3ZhbHVlX2luaXQgKCZ2X2xpc3QsIEdTVF9UWVBFX0xJU1QpOworICBnX3ZhbHVlX2luaXQgKCZ2LCBHX1RZUEVfU1RSSU5HKTsKKworICAvKiBVc2Ugc3lzdGVtJ3MgZW5kaWFubmVzcyAqLworICBnX3ZhbHVlX3NldF9zdGF0aWNfc3RyaW5nICgmdiwgIlM4Iik7CisgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJnZfbGlzdCwgJnYpOworICBnX3ZhbHVlX3NldF9zdGF0aWNfc3RyaW5nICgmdiwgR1NUX0FVRElPX05FIChTMTYpKTsKKyAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmdl9saXN0LCAmdik7CisgIGdfdmFsdWVfc2V0X3N0YXRpY19zdHJpbmcgKCZ2LCBHU1RfQVVESU9fTkUgKFMyNCkpOworICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfdmFsdWUgKCZ2X2xpc3QsICZ2KTsKKyAgZ192YWx1ZV9zZXRfc3RhdGljX3N0cmluZyAoJnYsIEdTVF9BVURJT19ORSAoUzI0XzMyKSk7CisgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJnZfbGlzdCwgJnYpOworICBnX3ZhbHVlX3Vuc2V0ICgmdik7CisKKyAgcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5ICgiYXVkaW8veC1yYXciKTsKKyAgZ3N0X3N0cnVjdHVyZV90YWtlX3ZhbHVlIChzLCAiZm9ybWF0IiwgJnZfbGlzdCk7CisKKyAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCAiaW50ZXJsZWF2ZWQiLAorICAgICAgInJhdGUiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIDY1NTM1MCwgTlVMTCk7CisKKyAgcmV0ID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworICBzMiA9IGdzdF9zdHJ1Y3R1cmVfY29weSAocyk7CisgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzMiwgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMSwgTlVMTCk7CisgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKHJldCwgczIpOworICBmb3IgKGkgPSAyOyBpIDw9IDg7IGkrKykgeworICAgIGd1aW50NjQgY2hhbm5lbF9tYXNrOworCisgICAgczIgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHMpOworICAgIGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uc190b19tYXNrIChjaGFubmVsX3Bvc2l0aW9uc1tpIC0gMV0sIGksCisgICAgICAgIEZBTFNFLCAmY2hhbm5lbF9tYXNrKTsKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAoczIsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIGksICJjaGFubmVsLW1hc2siLAorICAgICAgICBHU1RfVFlQRV9CSVRNQVNLLCBjaGFubmVsX21hc2ssIE5VTEwpOworCisgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAocmV0LCBzMik7CisgIH0KKyAgZ3N0X3N0cnVjdHVyZV9mcmVlIChzKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfZmxhY19lbmNfZ2V0Y2FwcyAoR3N0QXVkaW9FbmNvZGVyICogZW5jLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RDYXBzICpyZXQgPSBOVUxMLCAqY2FwcyA9IE5VTEw7CisgIEdzdFBhZCAqcGFkOworCisgIHBhZCA9IEdTVF9BVURJT19FTkNPREVSX1NJTktfUEFEIChlbmMpOworCisgIHJldCA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAocGFkKTsKKyAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgcmV0ID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHBhZCk7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJSZXR1cm4gY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgcmV0KTsKKworICBjYXBzID0gZ3N0X2F1ZGlvX2VuY29kZXJfcHJveHlfZ2V0Y2FwcyAoZW5jLCByZXQsIGZpbHRlcik7CisgIGdzdF9jYXBzX3VucmVmIChyZXQpOworCisgIHJldHVybiBjYXBzOworfQorCitzdGF0aWMgZ3VpbnQ2NAorZ3N0X2ZsYWNfZW5jX3BlZXJfcXVlcnlfdG90YWxfc2FtcGxlcyAoR3N0RmxhY0VuYyAqIGZsYWNlbmMsIEdzdFBhZCAqIHBhZCkKK3sKKyAgZ2ludDY0IGR1cmF0aW9uOworICBHc3RBdWRpb0luZm8gKmluZm8gPQorICAgICAgZ3N0X2F1ZGlvX2VuY29kZXJfZ2V0X2F1ZGlvX2luZm8gKEdTVF9BVURJT19FTkNPREVSIChmbGFjZW5jKSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY2VuYywgInF1ZXJ5aW5nIHBlZXIgZm9yIERFRkFVTFQgZm9ybWF0IGR1cmF0aW9uIik7CisgIGlmIChnc3RfcGFkX3BlZXJfcXVlcnlfZHVyYXRpb24gKHBhZCwgR1NUX0ZPUk1BVF9ERUZBVUxULCAmZHVyYXRpb24pCisgICAgICAmJiBkdXJhdGlvbiAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgIGdvdG8gZG9uZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChmbGFjZW5jLCAicXVlcnlpbmcgcGVlciBmb3IgVElNRSBmb3JtYXQgZHVyYXRpb24iKTsKKworICBpZiAoZ3N0X3BhZF9wZWVyX3F1ZXJ5X2R1cmF0aW9uIChwYWQsIEdTVF9GT1JNQVRfVElNRSwgJmR1cmF0aW9uKQorICAgICAgJiYgZHVyYXRpb24gIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZsYWNlbmMsICJwZWVyIHJlcG9ydGVkIGR1cmF0aW9uICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoZHVyYXRpb24pKTsKKyAgICBkdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX1RPX0ZSQU1FUyAoZHVyYXRpb24sIEdTVF9BVURJT19JTkZPX1JBVEUgKGluZm8pKTsKKworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGZsYWNlbmMsICJVcHN0cmVhbSByZXBvcnRlZCBubyB0b3RhbCBzYW1wbGVzIik7CisgIHJldHVybiBHU1RfQ0xPQ0tfVElNRV9OT05FOworCitkb25lOgorICBHU1RfREVCVUdfT0JKRUNUIChmbGFjZW5jLAorICAgICAgIlVwc3RyZWFtIHJlcG9ydGVkICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiB0b3RhbCBzYW1wbGVzIiwgZHVyYXRpb24pOworCisgIHJldHVybiBkdXJhdGlvbjsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmxhY19lbmNfc2V0X2Zvcm1hdCAoR3N0QXVkaW9FbmNvZGVyICogZW5jLCBHc3RBdWRpb0luZm8gKiBpbmZvKQoreworICBHc3RGbGFjRW5jICpmbGFjZW5jOworICBndWludDY0IHRvdGFsX3NhbXBsZXMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBGTEFDX19TdHJlYW1FbmNvZGVySW5pdFN0YXR1cyBpbml0X3N0YXR1czsKKworICBmbGFjZW5jID0gR1NUX0ZMQUNfRU5DIChlbmMpOworCisgIC8qIGlmIGNvbmZpZ3VyZWQgYWdhaW4sIG1lYW5zIHNvbWV0aGluZyBjaGFuZ2VkLCBjYW4ndCBoYW5kbGUgdGhhdCAqLworICBpZiAoRkxBQ19fc3RyZWFtX2VuY29kZXJfZ2V0X3N0YXRlIChmbGFjZW5jLT5lbmNvZGVyKSAhPQorICAgICAgRkxBQ19fU1RSRUFNX0VOQ09ERVJfVU5JTklUSUFMSVpFRCkKKyAgICBnb3RvIGVuY29kZXJfYWxyZWFkeV9pbml0aWFsaXplZDsKKworICAvKiBkZWxheSBzZXR0aW5nIG91dHB1dCBjYXBzL2Zvcm1hdCB1bnRpbCB3ZSBoYXZlIGFsbCBoZWFkZXJzICovCisKKyAgZ3N0X2F1ZGlvX2dldF9jaGFubmVsX3Jlb3JkZXJfbWFwIChHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoaW5mbyksCisgICAgICBjaGFubmVsX3Bvc2l0aW9uc1tHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoaW5mbykgLSAxXSwgaW5mby0+cG9zaXRpb24sCisgICAgICBmbGFjZW5jLT5jaGFubmVsX3Jlb3JkZXJfbWFwKTsKKworICB0b3RhbF9zYW1wbGVzID0gZ3N0X2ZsYWNfZW5jX3BlZXJfcXVlcnlfdG90YWxfc2FtcGxlcyAoZmxhY2VuYywKKyAgICAgIEdTVF9BVURJT19FTkNPREVSX1NJTktfUEFEIChlbmMpKTsKKworICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfYml0c19wZXJfc2FtcGxlIChmbGFjZW5jLT5lbmNvZGVyLAorICAgICAgR1NUX0FVRElPX0lORk9fREVQVEggKGluZm8pKTsKKyAgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X3NhbXBsZV9yYXRlIChmbGFjZW5jLT5lbmNvZGVyLAorICAgICAgR1NUX0FVRElPX0lORk9fUkFURSAoaW5mbykpOworICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfY2hhbm5lbHMgKGZsYWNlbmMtPmVuY29kZXIsCisgICAgICBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoaW5mbykpOworCisgIGlmICh0b3RhbF9zYW1wbGVzICE9IEdTVF9DTE9DS19USU1FX05PTkUpCisgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X3RvdGFsX3NhbXBsZXNfZXN0aW1hdGUgKGZsYWNlbmMtPmVuY29kZXIsCisgICAgICAgIE1JTiAodG90YWxfc2FtcGxlcywgR19HVUlOVDY0X0NPTlNUQU5UICgweDBGRkZGRkZGRkYpKSk7CisKKyAgZ3N0X2ZsYWNfZW5jX3NldF9tZXRhZGF0YSAoZmxhY2VuYywgaW5mbywgdG90YWxfc2FtcGxlcyk7CisKKyAgLyogY2FsbGJhY2tzIGNsZWFyIHRvIGdvIG5vdzsKKyAgICogd3JpdGUgY2FsbGJhY2tzIHJlY2VpdmVzIGhlYWRlcnMgZHVyaW5nIGluaXQgKi8KKyAgZmxhY2VuYy0+c3RvcHBlZCA9IEZBTFNFOworCisgIGluaXRfc3RhdHVzID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfaW5pdF9zdHJlYW0gKGZsYWNlbmMtPmVuY29kZXIsCisgICAgICBnc3RfZmxhY19lbmNfd3JpdGVfY2FsbGJhY2ssIGdzdF9mbGFjX2VuY19zZWVrX2NhbGxiYWNrLAorICAgICAgZ3N0X2ZsYWNfZW5jX3RlbGxfY2FsbGJhY2ssIE5VTEwsIGZsYWNlbmMpOworICBpZiAoaW5pdF9zdGF0dXMgIT0gRkxBQ19fU1RSRUFNX0VOQ09ERVJfSU5JVF9TVEFUVVNfT0spCisgICAgZ290byBmYWlsZWRfdG9faW5pdGlhbGl6ZTsKKworICAvKiBubyBzcGVjaWFsIGZlZWRiYWNrIHRvIGJhc2UgY2xhc3M7IHNob3VsZCBwcm92aWRlIGFsbCBhdmFpbGFibGUgc2FtcGxlcyAqLworCisgIHJldHVybiBUUlVFOworCitlbmNvZGVyX2FscmVhZHlfaW5pdGlhbGl6ZWQ6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJmbGFjIGFscmVhZHkgaW5pdGlhbGl6ZWQgLS0gZml4bWUgYWxsb3cgdGhpcyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorZmFpbGVkX3RvX2luaXRpYWxpemU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZmxhY2VuYywgTElCUkFSWSwgSU5JVCwgKE5VTEwpLAorICAgICAgICAoImNvdWxkIG5vdCBpbml0aWFsaXplIGVuY29kZXIgKHdyb25nIHBhcmFtZXRlcnM/KSAlZCIsIGluaXRfc3RhdHVzKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ZsYWNfZW5jX3VwZGF0ZV9xdWFsaXR5IChHc3RGbGFjRW5jICogZmxhY2VuYywgZ2ludCBxdWFsaXR5KQoreworICBHc3RBdWRpb0luZm8gKmluZm8gPQorICAgICAgZ3N0X2F1ZGlvX2VuY29kZXJfZ2V0X2F1ZGlvX2luZm8gKEdTVF9BVURJT19FTkNPREVSIChmbGFjZW5jKSk7CisKKyAgZmxhY2VuYy0+cXVhbGl0eSA9IHF1YWxpdHk7CisKKyNkZWZpbmUgRE9fVVBEQVRFKG5hbWUsIHZhbCwgc3RyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEZMQUNfX3N0cmVhbV9lbmNvZGVyX2dldF8jI25hbWUgKGZsYWNlbmMtPmVuY29kZXIpICE9ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmxhY2VuY19wYXJhbXNbcXVhbGl0eV0udmFsKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0XyMjbmFtZSAoZmxhY2VuYy0+ZW5jb2RlciwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZmxhY2VuY19wYXJhbXNbcXVhbGl0eV0udmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKGZsYWNlbmMpLCBzdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gR19TVE1UX0VORAorCisgIGdfb2JqZWN0X2ZyZWV6ZV9ub3RpZnkgKEdfT0JKRUNUIChmbGFjZW5jKSk7CisKKyAgaWYgKEdTVF9BVURJT19JTkZPX0NIQU5ORUxTIChpbmZvKSA9PSAyCisgICAgICB8fCBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoaW5mbykgPT0gMCkgeworICAgIERPX1VQREFURSAoZG9fbWlkX3NpZGVfc3RlcmVvLCBtaWRfc2lkZSwgIm1pZF9zaWRlX3N0ZXJlbyIpOworICAgIERPX1VQREFURSAobG9vc2VfbWlkX3NpZGVfc3RlcmVvLCBsb29zZV9taWRfc2lkZSwgImxvb3NlX21pZF9zaWRlIik7CisgIH0KKworICBET19VUERBVEUgKGJsb2Nrc2l6ZSwgYmxvY2tzaXplLCAiYmxvY2tzaXplIik7CisgIERPX1VQREFURSAobWF4X2xwY19vcmRlciwgbWF4X2xwY19vcmRlciwgIm1heF9scGNfb3JkZXIiKTsKKyAgRE9fVVBEQVRFIChxbHBfY29lZmZfcHJlY2lzaW9uLCBxbHBfY29lZmZfcHJlY2lzaW9uLCAicWxwX2NvZWZmX3ByZWNpc2lvbiIpOworICBET19VUERBVEUgKGRvX3FscF9jb2VmZl9wcmVjX3NlYXJjaCwgcWxwX2NvZWZmX3ByZWNfc2VhcmNoLAorICAgICAgInFscF9jb2VmZl9wcmVjX3NlYXJjaCIpOworICBET19VUERBVEUgKGRvX2VzY2FwZV9jb2RpbmcsIGVzY2FwZV9jb2RpbmcsICJlc2NhcGVfY29kaW5nIik7CisgIERPX1VQREFURSAoZG9fZXhoYXVzdGl2ZV9tb2RlbF9zZWFyY2gsIGV4aGF1c3RpdmVfbW9kZWxfc2VhcmNoLAorICAgICAgImV4aGF1c3RpdmVfbW9kZWxfc2VhcmNoIik7CisgIERPX1VQREFURSAobWluX3Jlc2lkdWFsX3BhcnRpdGlvbl9vcmRlciwgbWluX3Jlc2lkdWFsX3BhcnRpdGlvbl9vcmRlciwKKyAgICAgICJtaW5fcmVzaWR1YWxfcGFydGl0aW9uX29yZGVyIik7CisgIERPX1VQREFURSAobWF4X3Jlc2lkdWFsX3BhcnRpdGlvbl9vcmRlciwgbWF4X3Jlc2lkdWFsX3BhcnRpdGlvbl9vcmRlciwKKyAgICAgICJtYXhfcmVzaWR1YWxfcGFydGl0aW9uX29yZGVyIik7CisgIERPX1VQREFURSAocmljZV9wYXJhbWV0ZXJfc2VhcmNoX2Rpc3QsIHJpY2VfcGFyYW1ldGVyX3NlYXJjaF9kaXN0LAorICAgICAgInJpY2VfcGFyYW1ldGVyX3NlYXJjaF9kaXN0Iik7CisKKyN1bmRlZiBET19VUERBVEUKKworICBnX29iamVjdF90aGF3X25vdGlmeSAoR19PQkpFQ1QgKGZsYWNlbmMpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEZMQUNfX1N0cmVhbUVuY29kZXJTZWVrU3RhdHVzCitnc3RfZmxhY19lbmNfc2Vla19jYWxsYmFjayAoY29uc3QgRkxBQ19fU3RyZWFtRW5jb2RlciAqIGVuY29kZXIsCisgICAgRkxBQ19fdWludDY0IGFic29sdXRlX2J5dGVfb2Zmc2V0LCB2b2lkICpjbGllbnRfZGF0YSkKK3sKKyAgR3N0RmxhY0VuYyAqZmxhY2VuYzsKKyAgR3N0UGFkICpwZWVycGFkOworICBHc3RTZWdtZW50IHNlZzsKKworICBmbGFjZW5jID0gR1NUX0ZMQUNfRU5DIChjbGllbnRfZGF0YSk7CisKKyAgaWYgKGZsYWNlbmMtPnN0b3BwZWQpCisgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1NFRUtfU1RBVFVTX09LOworCisgIGlmICgocGVlcnBhZCA9IGdzdF9wYWRfZ2V0X3BlZXIgKEdTVF9BVURJT19FTkNPREVSX1NSQ19QQUQgKGZsYWNlbmMpKSkpIHsKKyAgICBHc3RFdmVudCAqZXZlbnQ7CisgICAgZ2Jvb2xlYW4gcmV0OworICAgIEdzdFF1ZXJ5ICpxdWVyeTsKKyAgICBnYm9vbGVhbiBzZWVrYWJsZSA9IEZBTFNFOworCisgICAgLyogdHJ5IHRvIHNlZWsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0ICovCisgICAgcXVlcnkgPSBnc3RfcXVlcnlfbmV3X3NlZWtpbmcgKEdTVF9GT1JNQVRfQllURVMpOworICAgIGlmIChnc3RfcGFkX3F1ZXJ5IChwZWVycGFkLCBxdWVyeSkpIHsKKyAgICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9zZWVraW5nIChxdWVyeSwgJmZvcm1hdCwgJnNlZWthYmxlLCBOVUxMLCBOVUxMKTsKKyAgICAgIGlmIChmb3JtYXQgIT0gR1NUX0ZPUk1BVF9CWVRFUykKKyAgICAgICAgc2Vla2FibGUgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKGZsYWNlbmMsICJTRUVLSU5HIHF1ZXJ5IG5vdCBoYW5kbGVkIik7CisgICAgfQorICAgIGdzdF9xdWVyeV91bnJlZiAocXVlcnkpOworCisgICAgaWYgKCFzZWVrYWJsZSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY2VuYywgImRvd25zdHJlYW0gbm90IHNlZWthYmxlOyBub3QgcmV3cml0aW5nIik7CisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChwZWVycGFkKTsKKyAgICAgIHJldHVybiBGTEFDX19TVFJFQU1fRU5DT0RFUl9TRUVLX1NUQVRVU19VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnLCBHU1RfRk9STUFUX0JZVEVTKTsKKyAgICBzZWcuc3RhcnQgPSBhYnNvbHV0ZV9ieXRlX29mZnNldDsKKyAgICBzZWcuc3RvcCA9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkU7CisgICAgc2VnLnRpbWUgPSAwOworICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnKTsKKworICAgIHJldCA9IGdzdF9wYWRfc2VuZF9ldmVudCAocGVlcnBhZCwgZXZlbnQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHBlZXJwYWQpOworCisgICAgaWYgKHJldCkgeworICAgICAgR1NUX0RFQlVHICgiU2VlayB0byAlIiBHX0dVSU5UNjRfRk9STUFUICIgJXMiLAorICAgICAgICAgIChndWludDY0KSBhYnNvbHV0ZV9ieXRlX29mZnNldCwgInN1Y2NlZWRlZCIpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUcgKCJTZWVrIHRvICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiAlcyIsCisgICAgICAgICAgKGd1aW50NjQpIGFic29sdXRlX2J5dGVfb2Zmc2V0LCAiZmFpbGVkIik7CisgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfU0VFS19TVEFUVVNfVU5TVVBQT1JURUQ7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9ERUJVRyAoIlNlZWsgdG8gJSIgR19HVUlOVDY0X0ZPUk1BVCAiIGZhaWxlZCAobm8gcGVlciBwYWQpIiwKKyAgICAgICAgKGd1aW50NjQpIGFic29sdXRlX2J5dGVfb2Zmc2V0KTsKKyAgfQorCisgIGZsYWNlbmMtPm9mZnNldCA9IGFic29sdXRlX2J5dGVfb2Zmc2V0OworICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfU0VFS19TVEFUVVNfT0s7Cit9CisKK3N0YXRpYyB2b2lkCitub3Rnc3RfdmFsdWVfYXJyYXlfYXBwZW5kX2J1ZmZlciAoR1ZhbHVlICogYXJyYXlfdmFsLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdWYWx1ZSB2YWx1ZSA9IHsgMCwgfTsKKworICBnX3ZhbHVlX2luaXQgKCZ2YWx1ZSwgR1NUX1RZUEVfQlVGRkVSKTsKKyAgLyogY29weSBidWZmZXIgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBjaXJjdWxhciByZWZjb3VudHMgKi8KKyAgYnVmID0gZ3N0X2J1ZmZlcl9jb3B5IChidWYpOworICAvKiBhZ2FpbiwgZm9yIGdvb2QgbWVhc3VyZSAqLworICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19IRUFERVIpOworICBnc3RfdmFsdWVfc2V0X2J1ZmZlciAoJnZhbHVlLCBidWYpOworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICBnc3RfdmFsdWVfYXJyYXlfYXBwZW5kX3ZhbHVlIChhcnJheV92YWwsICZ2YWx1ZSk7CisgIGdfdmFsdWVfdW5zZXQgKCZ2YWx1ZSk7Cit9CisKKyNkZWZpbmUgSERSX1RZUEVfU1RSRUFNSU5GTyAgICAgMAorI2RlZmluZSBIRFJfVFlQRV9WT1JCSVNDT01NRU5UICA0CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZmxhY19lbmNfcHJvY2Vzc19zdHJlYW1faGVhZGVycyAoR3N0RmxhY0VuYyAqIGVuYykKK3sKKyAgR3N0QnVmZmVyICp2b3JiaXNjb21tZW50ID0gTlVMTDsKKyAgR3N0QnVmZmVyICpzdHJlYW1pbmZvID0gTlVMTDsKKyAgR3N0QnVmZmVyICptYXJrZXIgPSBOVUxMOworICBHVmFsdWUgYXJyYXkgPSB7IDAsIH07CisgIEdzdENhcHMgKmNhcHM7CisgIEdMaXN0ICpsOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RBdWRpb0luZm8gKmluZm8gPQorICAgICAgZ3N0X2F1ZGlvX2VuY29kZXJfZ2V0X2F1ZGlvX2luZm8gKEdTVF9BVURJT19FTkNPREVSIChlbmMpKTsKKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtZmxhYyIsCisgICAgICAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoaW5mbyksCisgICAgICAicmF0ZSIsIEdfVFlQRV9JTlQsIEdTVF9BVURJT19JTkZPX1JBVEUgKGluZm8pLCBOVUxMKTsKKworICBmb3IgKGwgPSBlbmMtPmhlYWRlcnM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZjsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBndWludDggKmRhdGE7CisgICAgZ3NpemUgc2l6ZTsKKworICAgIC8qIG1hcmsgYnVmZmVycyBzbyBvZ2dtdXggd2lsbCBpZ25vcmUgdGhlbSBpZiBpdCBhbHJlYWR5IG11eGVkIHRoZQorICAgICAqIGhlYWRlciBidWZmZXJzIGZyb20gdGhlIHN0cmVhbWhlYWRlcnMgZmllbGQgaW4gdGhlIGNhcHMgKi8KKyAgICBsLT5kYXRhID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChHU1RfQlVGRkVSX0NBU1QgKGwtPmRhdGEpKTsKKworICAgIGJ1ZiA9IEdTVF9CVUZGRVJfQ0FTVCAobC0+ZGF0YSk7CisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgZGF0YSA9IG1hcC5kYXRhOworICAgIHNpemUgPSBtYXAuc2l6ZTsKKworICAgIC8qIGZpbmQgaW5pdGlhbCA0LWJ5dGUgbWFya2VyIHdoaWNoIHdlIG5lZWQgdG8gc2tpcCBsYXRlciBvbiAqLworICAgIGlmIChzaXplID09IDQgJiYgbWVtY21wIChkYXRhLCAiZkxhQyIsIDQpID09IDApIHsKKyAgICAgIG1hcmtlciA9IGJ1ZjsKKyAgICB9IGVsc2UgaWYgKHNpemUgPiAxICYmIChkYXRhWzBdICYgMHg3ZikgPT0gSERSX1RZUEVfU1RSRUFNSU5GTykgeworICAgICAgc3RyZWFtaW5mbyA9IGJ1ZjsKKyAgICB9IGVsc2UgaWYgKHNpemUgPiAxICYmIChkYXRhWzBdICYgMHg3ZikgPT0gSERSX1RZUEVfVk9SQklTQ09NTUVOVCkgeworICAgICAgdm9yYmlzY29tbWVudCA9IGJ1ZjsKKyAgICB9CisKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICB9CisKKyAgaWYgKG1hcmtlciA9PSBOVUxMIHx8IHN0cmVhbWluZm8gPT0gTlVMTCB8fCB2b3JiaXNjb21tZW50ID09IE5VTEwpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGVuYywgIm1pc3NpbmcgaGVhZGVyICVwICVwICVwLCBtdXhpbmcgaW50byBjb250YWluZXIgIgorICAgICAgICAiZm9ybWF0cyBtYXkgYmUgYnJva2VuIiwgbWFya2VyLCBzdHJlYW1pbmZvLCB2b3JiaXNjb21tZW50KTsKKyAgICBnb3RvIHB1c2hfaGVhZGVyczsKKyAgfQorCisgIGdfdmFsdWVfaW5pdCAoJmFycmF5LCBHU1RfVFlQRV9BUlJBWSk7CisKKyAgLyogYWRkIG1hcmtlciBpbmNsdWRpbmcgU1RSRUFNSU5GTyBoZWFkZXIgKi8KKyAgeworICAgIEdzdEJ1ZmZlciAqYnVmOworICAgIGd1aW50MTYgbnVtOworICAgIEdzdE1hcEluZm8gbWFwOworICAgIGd1aW50OCAqYmRhdGE7CisgICAgZ3NpemUgc2xlbjsKKworICAgIC8qIG1pbnVzIG9uZSBmb3IgdGhlIG1hcmtlciB0aGF0IGlzIG1lcmdlZCB3aXRoIHN0cmVhbWluZm8gaGVyZSAqLworICAgIG51bSA9IGdfbGlzdF9sZW5ndGggKGVuYy0+aGVhZGVycykgLSAxOworCisgICAgc2xlbiA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKHN0cmVhbWluZm8pOworICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTMgKyBzbGVuKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgIGJkYXRhID0gbWFwLmRhdGE7CisgICAgYmRhdGFbMF0gPSAweDdmOworICAgIG1lbWNweSAoYmRhdGEgKyAxLCAiRkxBQyIsIDQpOworICAgIGJkYXRhWzVdID0gMHgwMTsgICAgICAgICAgICAvKiBtYXBwaW5nIHZlcnNpb24gbWFqb3IgKi8KKyAgICBiZGF0YVs2XSA9IDB4MDA7ICAgICAgICAgICAgLyogbWFwcGluZyB2ZXJzaW9uIG1pbm9yICovCisgICAgYmRhdGFbN10gPSAobnVtICYgMHhGRjAwKSA+PiA4OworICAgIGJkYXRhWzhdID0gKG51bSAmIDB4MDBGRikgPj4gMDsKKyAgICBtZW1jcHkgKGJkYXRhICsgOSwgImZMYUMiLCA0KTsKKyAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKHN0cmVhbWluZm8sIDAsIGJkYXRhICsgMTMsIHNsZW4pOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgICBub3Rnc3RfdmFsdWVfYXJyYXlfYXBwZW5kX2J1ZmZlciAoJmFycmF5LCBidWYpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIH0KKworICAvKiBhZGQgVk9SQklTQ09NTUVOVCBoZWFkZXIgKi8KKyAgbm90Z3N0X3ZhbHVlX2FycmF5X2FwcGVuZF9idWZmZXIgKCZhcnJheSwgdm9yYmlzY29tbWVudCk7CisKKyAgLyogYWRkIG90aGVyIGhlYWRlcnMsIGlmIHRoZXJlIGFyZSBhbnkgKi8KKyAgZm9yIChsID0gZW5jLT5oZWFkZXJzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KSB7CisgICAgR3N0QnVmZmVyICpidWYgPSBHU1RfQlVGRkVSX0NBU1QgKGwtPmRhdGEpOworCisgICAgaWYgKGJ1ZiAhPSBtYXJrZXIgJiYgYnVmICE9IHN0cmVhbWluZm8gJiYgYnVmICE9IHZvcmJpc2NvbW1lbnQpIHsKKyAgICAgIG5vdGdzdF92YWx1ZV9hcnJheV9hcHBlbmRfYnVmZmVyICgmYXJyYXksIGJ1Zik7CisgICAgfQorICB9CisKKyAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApLAorICAgICAgInN0cmVhbWhlYWRlciIsICZhcnJheSk7CisgIGdfdmFsdWVfdW5zZXQgKCZhcnJheSk7CisKK3B1c2hfaGVhZGVyczoKKyAgZ3N0X2F1ZGlvX2VuY29kZXJfc2V0X291dHB1dF9mb3JtYXQgKEdTVF9BVURJT19FTkNPREVSIChlbmMpLCBjYXBzKTsKKworICBnc3RfYXVkaW9fZW5jb2Rlcl9zZXRfaGVhZGVycyAoR1NUX0FVRElPX0VOQ09ERVIgKGVuYyksIGVuYy0+aGVhZGVycyk7CisgIGVuYy0+aGVhZGVycyA9IE5VTEw7CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMKK2dzdF9mbGFjX2VuY193cml0ZV9jYWxsYmFjayAoY29uc3QgRkxBQ19fU3RyZWFtRW5jb2RlciAqIGVuY29kZXIsCisgICAgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwgc2l6ZV90IGJ5dGVzLAorICAgIHVuc2lnbmVkIHNhbXBsZXMsIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUsIHZvaWQgKmNsaWVudF9kYXRhKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RGbGFjRW5jICpmbGFjZW5jOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0U2VnbWVudCAqc2VnbWVudDsKKyAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uOworCisgIGZsYWNlbmMgPSBHU1RfRkxBQ19FTkMgKGNsaWVudF9kYXRhKTsKKworICBpZiAoZmxhY2VuYy0+c3RvcHBlZCkKKyAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX09LOworCisgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoYnl0ZXMpOworICBnc3RfYnVmZmVyX2ZpbGwgKG91dGJ1ZiwgMCwgYnVmZmVyLCBieXRlcyk7CisKKyAgLyogd2UgYXNzdW1lIGxpYmZsYWMgcGFzc2VzIHVzIHN0dWZmIG5lYXRseSBmcmFtZWQgKi8KKyAgaWYgKCFmbGFjZW5jLT5nb3RfaGVhZGVycykgeworICAgIGlmIChzYW1wbGVzID09IDApIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZsYWNlbmMsICJHb3QgaGVhZGVyLCBxdWV1ZWluZyAoJXUgYnl0ZXMpIiwKKyAgICAgICAgICAoZ3VpbnQpIGJ5dGVzKTsKKyAgICAgIGZsYWNlbmMtPmhlYWRlcnMgPSBnX2xpc3RfYXBwZW5kIChmbGFjZW5jLT5oZWFkZXJzLCBvdXRidWYpOworICAgICAgLyogbm90ZTogaXQncyBpbXBvcnRhbnQgdGhhdCB3ZSBpbmNyZWFzZSBvdXIgYnl0ZSBvZmZzZXQgKi8KKyAgICAgIGdvdG8gb3V0OworICAgIH0gZWxzZSB7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGZsYWNlbmMsICJOb24taGVhZGVyIHBhY2tldCwgd2UgaGF2ZSBhbGwgaGVhZGVycyBub3ciKTsKKyAgICAgIHJldCA9IGdzdF9mbGFjX2VuY19wcm9jZXNzX3N0cmVhbV9oZWFkZXJzIChmbGFjZW5jKTsKKyAgICAgIGZsYWNlbmMtPmdvdF9oZWFkZXJzID0gVFJVRTsKKyAgICB9CisgIH0KKworICBpZiAoZmxhY2VuYy0+Z290X2hlYWRlcnMgJiYgc2FtcGxlcyA9PSAwKSB7CisgICAgLyogaGVhZGVyIGZpeHVwLCBwdXNoIGRvd25zdHJlYW0gZGlyZWN0bHkgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjZW5jLCAiRml4aW5nIHVwIGhlYWRlcnMgYXQgcG9zPSUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICAgIiwgc2l6ZT0ldSIsIGZsYWNlbmMtPm9mZnNldCwgKGd1aW50KSBieXRlcyk7CisjaWYgMAorICAgIEdTVF9NRU1EVU1QX09CSkVDVCAoZmxhY2VuYywgIlByZXN1bWVkIGhlYWRlciBmcmFnbWVudCIsCisgICAgICAgIEdTVF9CVUZGRVJfREFUQSAob3V0YnVmKSwgR1NUX0JVRkZFUl9TSVpFIChvdXRidWYpKTsKKyNlbmRpZgorICAgIHJldCA9IGdzdF9wYWRfcHVzaCAoR1NUX0FVRElPX0VOQ09ERVJfU1JDX1BBRCAoZmxhY2VuYyksIG91dGJ1Zik7CisgIH0gZWxzZSB7CisgICAgLyogcmVndWxhciBmcmFtZSBkYXRhLCBwYXNzIHRvIGJhc2UgY2xhc3MgKi8KKyAgICBpZiAoZmxhY2VuYy0+ZW9zICYmIGZsYWNlbmMtPnNhbXBsZXNfaW4gPT0gZmxhY2VuYy0+c2FtcGxlc19vdXQgKyBzYW1wbGVzKSB7CisgICAgICAvKiBJZiBlbmNvZGluZyBwYXJ0IG9mIGEgZnJhbWUsIGFuZCB3ZSBoYXZlIG5vIHNldCBzdG9wIHRpbWUgb24KKyAgICAgICAqIHRoZSBvdXRwdXQgc2VnbWVudCwgd2UgdXBkYXRlIHRoZSBzZWdtZW50IHN0b3AgdGltZSB0byByZWZsZWN0CisgICAgICAgKiB0aGUgbGFzdCBzYW1wbGUuIFRoaXMgd2lsbCBsZXQgb2dnbXV4IHNldCB0aGUgbGFzdCBwYWdlJ3MKKyAgICAgICAqIGdyYW5wb3MgdG8gdGVsbCBhIGRlY29kZXIgdGhlIGR1bW15IHNhbXBsZXMgc2hvdWxkIGJlIGNsaXBwZWQuCisgICAgICAgKi8KKyAgICAgIHNlZ21lbnQgPSAmR1NUX0FVRElPX0VOQ09ERVJfT1VUUFVUX1NFR01FTlQgKGZsYWNlbmMpOworICAgICAgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc2VnbWVudC0+c3RvcCkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY2VuYywKKyAgICAgICAgICAgICJObyBzdG9wIHRpbWUgYW5kIHBhcnRpYWwgZnJhbWUsIHVwZGF0aW5nIHNlZ21lbnQiKTsKKyAgICAgICAgZHVyYXRpb24gPQorICAgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChmbGFjZW5jLT5zYW1wbGVzX291dCArIHNhbXBsZXMsCisgICAgICAgICAgICBHU1RfU0VDT05ELAorICAgICAgICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfZ2V0X3NhbXBsZV9yYXRlIChmbGFjZW5jLT5lbmNvZGVyKSk7CisgICAgICAgIHNlZ21lbnQtPnN0b3AgPSBzZWdtZW50LT5zdGFydCArIGR1cmF0aW9uOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjZW5jLCAibmV3IG91dHB1dCBzZWdtZW50ICUiIEdTVF9TRUdNRU5UX0ZPUk1BVCwKKyAgICAgICAgICAgIHNlZ21lbnQpOworICAgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKEdTVF9BVURJT19FTkNPREVSX1NSQ19QQUQgKGZsYWNlbmMpLAorICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19zZWdtZW50IChzZWdtZW50KSk7CisgICAgICB9CisgICAgfQorCisgICAgR1NUX0xPRyAoIlB1c2hpbmcgYnVmZmVyOiBzYW1wbGVzPSV1LCBzaXplPSV1LCBwb3M9JSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgc2FtcGxlcywgKGd1aW50KSBieXRlcywgZmxhY2VuYy0+b2Zmc2V0KTsKKyAgICByZXQgPSBnc3RfYXVkaW9fZW5jb2Rlcl9maW5pc2hfZnJhbWUgKEdTVF9BVURJT19FTkNPREVSIChmbGFjZW5jKSwKKyAgICAgICAgb3V0YnVmLCBzYW1wbGVzKTsKKyAgfQorCisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY2VuYywgImZsb3c6ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworCisgIGZsYWNlbmMtPmxhc3RfZmxvdyA9IHJldDsKKworb3V0OgorICBmbGFjZW5jLT5vZmZzZXQgKz0gYnl0ZXM7CisKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX0ZBVEFMX0VSUk9SOworCisgIHJldHVybiBGTEFDX19TVFJFQU1fRU5DT0RFUl9XUklURV9TVEFUVVNfT0s7Cit9CisKK3N0YXRpYyBGTEFDX19TdHJlYW1FbmNvZGVyVGVsbFN0YXR1cworZ3N0X2ZsYWNfZW5jX3RlbGxfY2FsbGJhY2sgKGNvbnN0IEZMQUNfX1N0cmVhbUVuY29kZXIgKiBlbmNvZGVyLAorICAgIEZMQUNfX3VpbnQ2NCAqIGFic29sdXRlX2J5dGVfb2Zmc2V0LCB2b2lkICpjbGllbnRfZGF0YSkKK3sKKyAgR3N0RmxhY0VuYyAqZmxhY2VuYyA9IEdTVF9GTEFDX0VOQyAoY2xpZW50X2RhdGEpOworCisgICphYnNvbHV0ZV9ieXRlX29mZnNldCA9IGZsYWNlbmMtPm9mZnNldDsKKworICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfVEVMTF9TVEFUVVNfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ZsYWNfZW5jX3NpbmtfZXZlbnQgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYywgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0RmxhY0VuYyAqZmxhY2VuYzsKKyAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKyAgR3N0VG9jICp0b2M7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIGZsYWNlbmMgPSBHU1RfRkxBQ19FTkMgKGVuYyk7CisKKyAgR1NUX0RFQlVHICgiUmVjZWl2ZWQgJXMgZXZlbnQgb24gc2lua3BhZCwgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCksIGV2ZW50KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgICBmbGFjZW5jLT5lb3MgPSBUUlVFOworICAgICAgcmV0ID0gR1NUX0FVRElPX0VOQ09ERVJfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNpbmtfZXZlbnQgKGVuYywgZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfVEFHOgorICAgICAgaWYgKGZsYWNlbmMtPnRhZ3MpIHsKKyAgICAgICAgZ3N0X2V2ZW50X3BhcnNlX3RhZyAoZXZlbnQsICZ0YWdsaXN0KTsKKyAgICAgICAgZ3N0X3RhZ19saXN0X2luc2VydCAoZmxhY2VuYy0+dGFncywgdGFnbGlzdCwKKyAgICAgICAgICAgIGdzdF90YWdfc2V0dGVyX2dldF90YWdfbWVyZ2VfbW9kZSAoR1NUX1RBR19TRVRURVIgKGZsYWNlbmMpKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIH0KKyAgICAgIHJldCA9IEdTVF9BVURJT19FTkNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChlbmMsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX1RPQzoKKyAgICAgIGdzdF9ldmVudF9wYXJzZV90b2MgKGV2ZW50LCAmdG9jLCBOVUxMKTsKKyAgICAgIGlmICh0b2MpIHsKKyAgICAgICAgaWYgKGZsYWNlbmMtPnRvYyAhPSB0b2MpIHsKKyAgICAgICAgICBpZiAoZmxhY2VuYy0+dG9jKQorICAgICAgICAgICAgZ3N0X3RvY191bnJlZiAoZmxhY2VuYy0+dG9jKTsKKyAgICAgICAgICBmbGFjZW5jLT50b2MgPSB0b2M7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldCA9IEdTVF9BVURJT19FTkNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChlbmMsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6CisgICAgICBmbGFjZW5jLT5zYW1wbGVzX2luID0gMDsKKyAgICAgIGZsYWNlbmMtPnNhbXBsZXNfb3V0ID0gMDsKKyAgICAgIHJldCA9IEdTVF9BVURJT19FTkNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChlbmMsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBHU1RfQVVESU9fRU5DT0RFUl9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2lua19ldmVudCAoZW5jLCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ZsYWNfZW5jX3NpbmtfcXVlcnkgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYywgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0UGFkICpwYWQgPSBHU1RfQVVESU9fRU5DT0RFUl9TSU5LX1BBRCAoZW5jKTsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgR1NUX0RFQlVHICgiUmVjZWl2ZWQgJXMgcXVlcnkgb24gc2lua3BhZCwgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBHU1RfUVVFUllfVFlQRV9OQU1FIChxdWVyeSksIHF1ZXJ5KTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9BQ0NFUFRfQ0FQUzp7CisgICAgICBHc3RDYXBzICphY2NlcHRhYmxlLCAqY2FwczsKKworICAgICAgYWNjZXB0YWJsZSA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAocGFkKTsKKyAgICAgIGlmIChhY2NlcHRhYmxlID09IE5VTEwpIHsKKyAgICAgICAgYWNjZXB0YWJsZSA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChwYWQpOworICAgICAgfQorCisgICAgICBnc3RfcXVlcnlfcGFyc2VfYWNjZXB0X2NhcHMgKHF1ZXJ5LCAmY2Fwcyk7CisKKyAgICAgIGdzdF9xdWVyeV9zZXRfYWNjZXB0X2NhcHNfcmVzdWx0IChxdWVyeSwKKyAgICAgICAgICBnc3RfY2Fwc19pc19zdWJzZXQgKGNhcHMsIGFjY2VwdGFibGUpKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChhY2NlcHRhYmxlKTsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IEdTVF9BVURJT19FTkNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX3F1ZXJ5IChlbmMsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworI2lmIEdfQllURV9PUkRFUiA9PSBHX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgUkVBRF9JTlQyNCBHU1RfUkVBRF9VSU5UMjRfTEUKKyNlbHNlCisjZGVmaW5lIFJFQURfSU5UMjQgR1NUX1JFQURfVUlOVDI0X0JFCisjZW5kaWYKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbGFjX2VuY19oYW5kbGVfZnJhbWUgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYywgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RGbGFjRW5jICpmbGFjZW5jOworICBGTEFDX19pbnQzMiAqZGF0YTsKKyAgZ2ludCBzYW1wbGVzLCB3aWR0aCwgY2hhbm5lbHM7CisgIGd1bG9uZyBpOworICBnaW50IGo7CisgIEZMQUNfX2Jvb2wgcmVzOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR3N0QXVkaW9JbmZvICppbmZvID0KKyAgICAgIGdzdF9hdWRpb19lbmNvZGVyX2dldF9hdWRpb19pbmZvIChHU1RfQVVESU9fRU5DT0RFUiAoZW5jKSk7CisgIGdpbnQgKnJlb3JkZXJfbWFwOworCisgIGZsYWNlbmMgPSBHU1RfRkxBQ19FTkMgKGVuYyk7CisKKyAgLyogYmFzZSBjbGFzcyBlbnN1cmVzIGNvbmZpZ3VyYXRpb24gKi8KKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9BVURJT19JTkZPX1dJRFRIIChpbmZvKSAhPSAwLAorICAgICAgR1NUX0ZMT1dfTk9UX05FR09USUFURUQpOworCisgIHdpZHRoID0gR1NUX0FVRElPX0lORk9fV0lEVEggKGluZm8pOworICBjaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTIChpbmZvKTsKKyAgcmVvcmRlcl9tYXAgPSBmbGFjZW5jLT5jaGFubmVsX3Jlb3JkZXJfbWFwOworCisgIGlmIChHX1VOTElLRUxZICghYnVmZmVyKSkgeworICAgIGlmIChmbGFjZW5jLT5lb3MpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZsYWNlbmMsICJmaW5pc2ggZW5jb2RpbmciKTsKKyAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX2ZpbmlzaCAoZmxhY2VuYy0+ZW5jb2Rlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGNhbid0IGhhbmRsZSBpbnRlcm1pdHRlbnQgZHJhaW5pbmcvcmVzeW5jaW5nICovCisgICAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChmbGFjZW5jLCBTVFJFQU0sIEZPUk1BVCwgKE5VTEwpLAorICAgICAgICAgICgiU3RyZWFtIGRpc2NvbnRpbnVpdHkgZGV0ZWN0ZWQuICIKKyAgICAgICAgICAgICAgIlRoZSBvdXRwdXQgbWF5IGhhdmUgd3JvbmcgdGltZXN0YW1wcywgIgorICAgICAgICAgICAgICAiY29uc2lkZXIgdXNpbmcgYXVkaW9yYXRlIHRvIGhhbmRsZSBkaXNjb250aW51aXRpZXMiKSk7CisgICAgfQorICAgIHJldHVybiBmbGFjZW5jLT5sYXN0X2Zsb3c7CisgIH0KKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBzYW1wbGVzID0gbWFwLnNpemUgLyAod2lkdGggPj4gMyk7CisKKyAgZGF0YSA9IGdfbWFsbG9jIChzYW1wbGVzICogc2l6ZW9mIChGTEFDX19pbnQzMikpOworCisgIHNhbXBsZXMgLz0gY2hhbm5lbHM7CisgIEdTVF9MT0dfT0JKRUNUIChmbGFjZW5jLCAicHJvY2Vzc2luZyAlZCBzYW1wbGVzLCAlZCBjaGFubmVscyIsIHNhbXBsZXMsCisgICAgICBjaGFubmVscyk7CisgIGlmICh3aWR0aCA9PSA4KSB7CisgICAgZ2ludDggKmluZGF0YSA9IChnaW50OCAqKSBtYXAuZGF0YTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzYW1wbGVzOyBpKyspCisgICAgICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykKKyAgICAgICAgZGF0YVtpICogY2hhbm5lbHMgKyByZW9yZGVyX21hcFtqXV0gPQorICAgICAgICAgICAgKEZMQUNfX2ludDMyKSBpbmRhdGFbaSAqIGNoYW5uZWxzICsgal07CisgIH0gZWxzZSBpZiAod2lkdGggPT0gMTYpIHsKKyAgICBnaW50MTYgKmluZGF0YSA9IChnaW50MTYgKikgbWFwLmRhdGE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlczsgaSsrKQorICAgICAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspCisgICAgICAgIGRhdGFbaSAqIGNoYW5uZWxzICsgcmVvcmRlcl9tYXBbal1dID0KKyAgICAgICAgICAgIChGTEFDX19pbnQzMikgaW5kYXRhW2kgKiBjaGFubmVscyArIGpdOworICB9IGVsc2UgaWYgKHdpZHRoID09IDI0KSB7CisgICAgZ3VpbnQ4ICppbmRhdGEgPSAoZ3VpbnQ4ICopIG1hcC5kYXRhOworICAgIGd1aW50MzIgdmFsOworCisgICAgZm9yIChpID0gMDsgaSA8IHNhbXBsZXM7IGkrKykKKyAgICAgIGZvciAoaiA9IDA7IGogPCBjaGFubmVsczsgaisrKSB7CisgICAgICAgIHZhbCA9IFJFQURfSU5UMjQgKCZpbmRhdGFbMyAqIChpICogY2hhbm5lbHMgKyBqKV0pOworICAgICAgICBpZiAodmFsICYgMHgwMDgwMDAwMCkKKyAgICAgICAgICB2YWwgfD0gMHhmZjAwMDAwMDsKKyAgICAgICAgZGF0YVtpICogY2hhbm5lbHMgKyByZW9yZGVyX21hcFtqXV0gPSAoRkxBQ19faW50MzIpIHZhbDsKKyAgICAgIH0KKyAgfSBlbHNlIGlmICh3aWR0aCA9PSAzMikgeworICAgIGdpbnQzMiAqaW5kYXRhID0gKGdpbnQzMiAqKSBtYXAuZGF0YTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzYW1wbGVzOyBpKyspCisgICAgICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykKKyAgICAgICAgZGF0YVtpICogY2hhbm5lbHMgKyByZW9yZGVyX21hcFtqXV0gPQorICAgICAgICAgICAgKEZMQUNfX2ludDMyKSBpbmRhdGFbaSAqIGNoYW5uZWxzICsgal07CisgIH0gZWxzZSB7CisgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICByZXMgPSBGTEFDX19zdHJlYW1fZW5jb2Rlcl9wcm9jZXNzX2ludGVybGVhdmVkIChmbGFjZW5jLT5lbmNvZGVyLAorICAgICAgKGNvbnN0IEZMQUNfX2ludDMyICopIGRhdGEsIHNhbXBsZXMpOworICBmbGFjZW5jLT5zYW1wbGVzX2luICs9IHNhbXBsZXM7CisKKyAgZ19mcmVlIChkYXRhKTsKKworICBpZiAoIXJlcykgeworICAgIGlmIChmbGFjZW5jLT5sYXN0X2Zsb3cgPT0gR1NUX0ZMT1dfT0spCisgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGZsYWNlbmMtPmxhc3RfZmxvdzsKKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK2dzdF9mbGFjX2VuY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0RmxhY0VuYyAqdGhpcyA9IEdTVF9GTEFDX0VOQyAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHRoaXMpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9RVUFMSVRZOgorICAgICAgZ3N0X2ZsYWNfZW5jX3VwZGF0ZV9xdWFsaXR5ICh0aGlzLCBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NUUkVBTUFCTEVfU1VCU0VUOgorICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X3N0cmVhbWFibGVfc3Vic2V0ICh0aGlzLT5lbmNvZGVyLAorICAgICAgICAgIGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUlEX1NJREVfU1RFUkVPOgorICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2RvX21pZF9zaWRlX3N0ZXJlbyAodGhpcy0+ZW5jb2RlciwKKyAgICAgICAgICBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0xPT1NFX01JRF9TSURFX1NURVJFTzoKKyAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9sb29zZV9taWRfc2lkZV9zdGVyZW8gKHRoaXMtPmVuY29kZXIsCisgICAgICAgICAgZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CTE9DS1NJWkU6CisgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfYmxvY2tzaXplICh0aGlzLT5lbmNvZGVyLAorICAgICAgICAgIGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX0xQQ19PUkRFUjoKKyAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9tYXhfbHBjX29yZGVyICh0aGlzLT5lbmNvZGVyLAorICAgICAgICAgIGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUUxQX0NPRUZGX1BSRUNJU0lPTjoKKyAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9xbHBfY29lZmZfcHJlY2lzaW9uICh0aGlzLT5lbmNvZGVyLAorICAgICAgICAgIGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUUxQX0NPRUZGX1BSRUNfU0VBUkNIOgorICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2RvX3FscF9jb2VmZl9wcmVjX3NlYXJjaCAodGhpcy0+ZW5jb2RlciwKKyAgICAgICAgICBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0VTQ0FQRV9DT0RJTkc6CisgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfZG9fZXNjYXBlX2NvZGluZyAodGhpcy0+ZW5jb2RlciwKKyAgICAgICAgICBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0VYSEFVU1RJVkVfTU9ERUxfU0VBUkNIOgorICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2RvX2V4aGF1c3RpdmVfbW9kZWxfc2VhcmNoICh0aGlzLT5lbmNvZGVyLAorICAgICAgICAgIGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUlOX1JFU0lEVUFMX1BBUlRJVElPTl9PUkRFUjoKKyAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9taW5fcmVzaWR1YWxfcGFydGl0aW9uX29yZGVyICh0aGlzLT5lbmNvZGVyLAorICAgICAgICAgIGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX1JFU0lEVUFMX1BBUlRJVElPTl9PUkRFUjoKKyAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9tYXhfcmVzaWR1YWxfcGFydGl0aW9uX29yZGVyICh0aGlzLT5lbmNvZGVyLAorICAgICAgICAgIGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUklDRV9QQVJBTUVURVJfU0VBUkNIX0RJU1Q6CisgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfcmljZV9wYXJhbWV0ZXJfc2VhcmNoX2Rpc3QgKHRoaXMtPmVuY29kZXIsCisgICAgICAgICAgZ192YWx1ZV9nZXRfdWludCAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QQURESU5HOgorICAgICAgdGhpcy0+cGFkZGluZyA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TRUVLUE9JTlRTOgorICAgICAgdGhpcy0+c2Vla3BvaW50cyA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorCisgIEdTVF9PQkpFQ1RfVU5MT0NLICh0aGlzKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9mbGFjX2VuY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0RmxhY0VuYyAqdGhpcyA9IEdTVF9GTEFDX0VOQyAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHRoaXMpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9RVUFMSVRZOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHRoaXMtPnF1YWxpdHkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NUUkVBTUFCTEVfU1VCU0VUOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsCisgICAgICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfZ2V0X3N0cmVhbWFibGVfc3Vic2V0ICh0aGlzLT5lbmNvZGVyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUlEX1NJREVfU1RFUkVPOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsCisgICAgICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfZ2V0X2RvX21pZF9zaWRlX3N0ZXJlbyAodGhpcy0+ZW5jb2RlcikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0xPT1NFX01JRF9TSURFX1NURVJFTzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLAorICAgICAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX2dldF9sb29zZV9taWRfc2lkZV9zdGVyZW8gKHRoaXMtPmVuY29kZXIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CTE9DS1NJWkU6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwKKyAgICAgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9nZXRfYmxvY2tzaXplICh0aGlzLT5lbmNvZGVyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX0xQQ19PUkRFUjoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLAorICAgICAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX2dldF9tYXhfbHBjX29yZGVyICh0aGlzLT5lbmNvZGVyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUUxQX0NPRUZGX1BSRUNJU0lPTjoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLAorICAgICAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX2dldF9xbHBfY29lZmZfcHJlY2lzaW9uICh0aGlzLT5lbmNvZGVyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUUxQX0NPRUZGX1BSRUNfU0VBUkNIOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsCisgICAgICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfZ2V0X2RvX3FscF9jb2VmZl9wcmVjX3NlYXJjaCAodGhpcy0+ZW5jb2RlcikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0VTQ0FQRV9DT0RJTkc6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwKKyAgICAgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9nZXRfZG9fZXNjYXBlX2NvZGluZyAodGhpcy0+ZW5jb2RlcikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0VYSEFVU1RJVkVfTU9ERUxfU0VBUkNIOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsCisgICAgICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfZ2V0X2RvX2V4aGF1c3RpdmVfbW9kZWxfc2VhcmNoICh0aGlzLT5lbmNvZGVyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUlOX1JFU0lEVUFMX1BBUlRJVElPTl9PUkRFUjoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLAorICAgICAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX2dldF9taW5fcmVzaWR1YWxfcGFydGl0aW9uX29yZGVyCisgICAgICAgICAgKHRoaXMtPmVuY29kZXIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfUkVTSURVQUxfUEFSVElUSU9OX09SREVSOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsCisgICAgICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfZ2V0X21heF9yZXNpZHVhbF9wYXJ0aXRpb25fb3JkZXIKKyAgICAgICAgICAodGhpcy0+ZW5jb2RlcikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JJQ0VfUEFSQU1FVEVSX1NFQVJDSF9ESVNUOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsCisgICAgICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfZ2V0X3JpY2VfcGFyYW1ldGVyX3NlYXJjaF9kaXN0ICh0aGlzLT5lbmNvZGVyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUEFERElORzoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCB0aGlzLT5wYWRkaW5nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TRUVLUE9JTlRTOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdGhpcy0+c2Vla3BvaW50cyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHRoaXMpOworfQpkaWZmIC0tZ2l0IGEvZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5oIGIvZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYWVjNGUKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZmxhYy9nc3RmbGFjZW5jLmgKQEAgLTAsMCArMSw4MCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9GTEFDX0VOQ19IX18KKyNkZWZpbmUgX19HU1RfRkxBQ19FTkNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZW5jb2Rlci5oPgorCisjaW5jbHVkZSA8RkxBQy9hbGwuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0ZMQUNfRU5DIChnc3RfZmxhY19lbmNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0ZMQUNfRU5DKG9iaikgR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1Qob2JqLCBHU1RfVFlQRV9GTEFDX0VOQywgR3N0RmxhY0VuYykKKyNkZWZpbmUgR1NUX0ZMQUNfRU5DX0NMQVNTKGtsYXNzKSBHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVChrbGFzcywgR1NUX1RZUEVfRkxBQ19FTkMsIEdzdEZsYWNFbmNDbGFzcykKKyNkZWZpbmUgR1NUX0lTX0ZMQUNfRU5DKG9iaikgR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUob2JqLCBHU1RfVFlQRV9GTEFDX0VOQykKKyNkZWZpbmUgR1NUX0lTX0ZMQUNfRU5DX0NMQVNTKGtsYXNzKSBHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRShrbGFzcywgR1NUX1RZUEVfRkxBQ19FTkMpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RGbGFjRW5jIEdzdEZsYWNFbmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0RmxhY0VuY0NsYXNzIEdzdEZsYWNFbmNDbGFzczsKKworc3RydWN0IF9Hc3RGbGFjRW5jIHsKKyAgR3N0QXVkaW9FbmNvZGVyICBlbGVtZW50OworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisKKyAgR3N0Rmxvd1JldHVybiAgbGFzdF9mbG93OyAvKiBzYXZlIGZsb3cgZnJvbSBsYXN0IHB1c2ggc28gd2UgY2FuIHBhc3MgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY29ycmVjdCBmbG93IHJldHVybiB1cHN0cmVhbSBpbiBjYXNlIHRoZSBwdXNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZmFpbHMgZm9yIHNvbWUgcmVhc29uICovCisKKyAgZ3VpbnQ2NCAgICAgICAgb2Zmc2V0OworICBnaW50ICAgICAgICAgICBxdWFsaXR5OworICBnYm9vbGVhbiAgICAgICBzdG9wcGVkOworICBndWludCAgICAgICAgICAgcGFkZGluZzsKKyAgZ2ludCAgICAgICAgICAgIHNlZWtwb2ludHM7CisKKyAgRkxBQ19fU3RyZWFtRW5jb2RlciAqZW5jb2RlcjsKKworICBGTEFDX19TdHJlYW1NZXRhZGF0YSAqKm1ldGE7CisKKyAgR3N0VGFnTGlzdCAqICAgICB0YWdzOworICBHc3RUb2MgKiAgICAgICAgIHRvYzsKKworICBndWludDY0ICAgICAgICAgIHNhbXBsZXNfaW47CisgIGd1aW50NjQgICAgICAgICAgc2FtcGxlc19vdXQ7CisgIGdib29sZWFuICAgICAgICAgZW9zOworICAvKiBxdWV1ZSBoZWFkZXJzIHVudGlsIHdlIGhhdmUgdGhlbSBhbGwgc28gd2UgY2FuIGFkZCBzdHJlYW1oZWFkZXJzIHRvIGNhcHMgKi8KKyAgZ2Jvb2xlYW4gICAgICAgICBnb3RfaGVhZGVyczsKKyAgR0xpc3QgICAgICAgICAgICpoZWFkZXJzOworCisgIGdpbnQgICAgICAgICAgICAgY2hhbm5lbF9yZW9yZGVyX21hcFs4XTsKK307CisKK3N0cnVjdCBfR3N0RmxhY0VuY0NsYXNzIHsKKyAgR3N0QXVkaW9FbmNvZGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2ZsYWNfZW5jX2dldF90eXBlKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfRkxBQ19FTkNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvZmxhYy9nc3RmbGFjdGFnLmMgYi9leHQvZmxhYy9nc3RmbGFjdGFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJlMjM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9mbGFjL2dzdGZsYWN0YWcuYwpAQCAtMCwwICsxLDUwMSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ2hyaXN0b3BoZSBGZXJnZWF1IDx0ZXVmQGdub21lLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBKb25hdGhhbiBNYXR0aGV3IDxqb25hdGhhbkBkMTRuLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBnc3RmbGFjdGFnLmM6IHBsdWctaW4gZm9yIHJlYWRpbmcvbW9kaWZ5aW5nIHZvcmJpcyBjb21tZW50cyBpbiBmbGFjIGZpbGVzCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtZmxhY3RhZworICogQHNlZV9hbHNvOiAjZmxhY2VuYywgI2ZsYWNkZWMsICNHc3RUYWdTZXR0ZXIKKyAqCisgKiBUaGUgZmxhY3RhZyBlbGVtZW50IGNhbiBjaGFuZ2UgdGhlIHRhZyBjb250YWluZWQgd2l0aGluIGEgcmF3CisgKiBGTEFDIHN0cmVhbS4gU3BlY2lmaWNhbGx5LCBpdCBtb2RpZmllcyB0aGUgY29tbWVudHMgaGVhZGVyIHBhY2tldAorICogb2YgdGhlIEZMQUMgc3RyZWFtLgorICoKKyAqIEFwcGxpY2F0aW9ucyBjYW4gc2V0IHRoZSB0YWdzIHRvIHdyaXRlIHVzaW5nIHRoZSAjR3N0VGFnU2V0dGVyIGludGVyZmFjZS4KKyAqIFRhZ3MgY29udGFpbmVkIHdpdGhpbmcgdGhlIEZMQUMgYml0c3RyZWFtIHdpbGwgYmUgcGlja2VkIHVwCisgKiBhdXRvbWF0aWNhbGx5IChhbmQgbWVyZ2VkIGFjY29yZGluZyB0byB0aGUgbWVyZ2UgbW9kZSBzZXQgdmlhIHRoZSB0YWcKKyAqIHNldHRlciBpbnRlcmZhY2UpLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgZmlsZXNyYyBsb2NhdGlvbj1mb28uZmxhYyAhIGZsYWN0YWcgISBmaWxlc2luayBsb2NhdGlvbj1iYXIuZmxhYworICogXXwgVGhpcyBlbGVtZW50IGlzIG5vdCB1c2VmdWwgd2l0aCBnc3QtbGF1bmNoLCBiZWNhdXNlIGl0IGRvZXMgbm90IHN1cHBvcnQKKyAqIHNldHRpbmcgdGhlIHRhZ3Mgb24gYSAjR3N0VGFnU2V0dGVyIGludGVyZmFjZS4gQ29uY2VwdHVhbGx5LCB0aGUgZWxlbWVudAorICogd2lsbCB1c3VhbGx5IGJlIHVzZWQgaW4gdGhpcyBvcmRlciB0aG91Z2guCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0dGFnc2V0dGVyLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC90YWcvdGFnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RmbGFjdGFnLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGZsYWN0YWdfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZmxhY3RhZ19kZWJ1ZworCisvKiBlbGVtZW50ZmFjdG9yeSBpbmZvcm1hdGlvbiAqLworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGZsYWNfdGFnX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1mbGFjIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZmxhY190YWdfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LWZsYWMiKQorICAgICk7CisKKworc3RhdGljIHZvaWQgZ3N0X2ZsYWNfdGFnX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfZmxhY190YWdfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfZmxhY190YWdfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9mbGFjX3RhZ19zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworI2RlZmluZSBnc3RfZmxhY190YWdfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdEZsYWNUYWcsIGdzdF9mbGFjX3RhZywgR1NUX1RZUEVfRUxFTUVOVCwKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1RBR19TRVRURVIsIE5VTEwpKTsKKworCitzdGF0aWMgdm9pZAorZ3N0X2ZsYWNfdGFnX2NsYXNzX2luaXQgKEdzdEZsYWNUYWdDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZmxhY3RhZ19kZWJ1ZywgImZsYWN0YWciLCAwLCAiZmxhYyB0YWcgcmV3cml0ZXIiKTsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF9mbGFjX3RhZ19kaXNwb3NlOworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfZmxhY190YWdfY2hhbmdlX3N0YXRlOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJGTEFDIHRhZ2dlciIsCisgICAgICAiRm9ybWF0dGVyL01ldGFkYXRhIiwKKyAgICAgICJSZXdyaXRlIHRhZ3MgaW4gYSBGTEFDIGZpbGUiLCAiQ2hyaXN0b3BoZSBGZXJnZWF1IDx0ZXVmQGdub21lLm9yZz4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZmbGFjX3RhZ19zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZmxhY190YWdfc3JjX3RlbXBsYXRlKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9mbGFjX3RhZ19kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RGbGFjVGFnICp0YWcgPSBHU1RfRkxBQ19UQUcgKG9iamVjdCk7CisKKyAgaWYgKHRhZy0+YWRhcHRlcikgeworICAgIGdfb2JqZWN0X3VucmVmICh0YWctPmFkYXB0ZXIpOworICAgIHRhZy0+YWRhcHRlciA9IE5VTEw7CisgIH0KKyAgaWYgKHRhZy0+dm9yYmlzY29tbWVudCkgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKHRhZy0+dm9yYmlzY29tbWVudCk7CisgICAgdGFnLT52b3JiaXNjb21tZW50ID0gTlVMTDsKKyAgfQorICBpZiAodGFnLT50YWdzKSB7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWctPnRhZ3MpOworICAgIHRhZy0+dGFncyA9IE5VTEw7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X2ZsYWNfdGFnX2luaXQgKEdzdEZsYWNUYWcgKiB0YWcpCit7CisgIC8qIGNyZWF0ZSB0aGUgc2luayBhbmQgc3JjIHBhZHMgKi8KKyAgdGFnLT5zaW5rcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmZmxhY190YWdfc2lua190ZW1wbGF0ZSwgInNpbmsiKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHRhZy0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmxhY190YWdfY2hhaW4pKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHRhZy0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmxhY190YWdfc2lua19ldmVudCkpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAodGFnKSwgdGFnLT5zaW5rcGFkKTsKKworICB0YWctPnNyY3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJmZsYWNfdGFnX3NyY190ZW1wbGF0ZSwgInNyYyIpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAodGFnKSwgdGFnLT5zcmNwYWQpOworCisgIHRhZy0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmxhY190YWdfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdEZsYWNUYWcgKnRhZzsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIHRhZyA9IEdTVF9GTEFDX1RBRyAocGFyZW50KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJSZWNlaXZlZCAlcyBldmVudCBvbiBzaW5rcGFkLCAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSwgZXZlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgICAvKiBGSVhNRTogcGFyc2UgYW5kIHN0b3JlIHRoZSBjYXBzLiBPbmNlIHdlIHBhcnNlZCBhbmQgYnVpbHQgdGhlIGhlYWRlcnMsCisgICAgICAgKiB1cGRhdGUgdGhlICJzdHJlYW1oZWFkZXIiIGZpZWxkIGluIHRoZSBjYXBzIGFuZCBzZW5kIGEgbmV3IGNhcHMgZXZlbnQKKyAgICAgICAqLworICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoX2V2ZW50ICh0YWctPnNyY3BhZCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBGTEFDX01BR0lDICJmTGFDIgorI2RlZmluZSBGTEFDX01BR0lDX1NJWkUgKHNpemVvZiAoRkxBQ19NQUdJQykgLSAxKQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2ZsYWNfdGFnX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RGbGFjVGFnICp0YWc7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3NpemUgc2l6ZTsKKworICByZXQgPSBHU1RfRkxPV19PSzsKKyAgdGFnID0gR1NUX0ZMQUNfVEFHIChwYXJlbnQpOworCisgIGdzdF9hZGFwdGVyX3B1c2ggKHRhZy0+YWRhcHRlciwgYnVmZmVyKTsKKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAic3RhdGU6ICVkIiwgdGFnLT5zdGF0ZSk7CisKKyAgLyogSW5pdGlhbCBzdGF0ZSwgd2UgZG9uJ3QgZXZlbiBrbm93IGlmIHdlIGFyZSBkZWFsaW5nIHdpdGggYSBmbGFjIGZpbGUgKi8KKyAgaWYgKHRhZy0+c3RhdGUgPT0gR1NUX0ZMQUNfVEFHX1NUQVRFX0lOSVQpIHsKKyAgICBHc3RCdWZmZXIgKmlkX2J1ZmZlcjsKKworICAgIGlmIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHRhZy0+YWRhcHRlcikgPCBzaXplb2YgKEZMQUNfTUFHSUMpKQorICAgICAgZ290byBjbGVhbnVwOworCisgICAgaWRfYnVmZmVyID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHRhZy0+YWRhcHRlciwgRkxBQ19NQUdJQ19TSVpFKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh0YWcsICJsb29raW5nIGZvciAiIEZMQUNfTUFHSUMgIiBpZGVudGlmaWVyIik7CisgICAgaWYgKGdzdF9idWZmZXJfbWVtY21wIChpZF9idWZmZXIsIDAsIEZMQUNfTUFHSUMsIEZMQUNfTUFHSUNfU0laRSkgPT0gMCkgeworCisgICAgICBHU1RfREVCVUdfT0JKRUNUICh0YWcsICJwdXNoaW5nICIgRkxBQ19NQUdJQyAiIGlkZW50aWZpZXIgYnVmZmVyIik7CisgICAgICByZXQgPSBnc3RfcGFkX3B1c2ggKHRhZy0+c3JjcGFkLCBpZF9idWZmZXIpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBjbGVhbnVwOworCisgICAgICB0YWctPnN0YXRlID0gR1NUX0ZMQUNfVEFHX1NUQVRFX01FVEFEQVRBX0JMT0NLUzsKKyAgICB9IGVsc2UgeworICAgICAgLyogRklYTUU6IGRvZXMgdGhhdCB3b3JrIHdlbGwgd2l0aCBGTEFDIGZpbGVzIGNvbnRhaW5pbmcgSUQzdjIgdGFncyA/ICovCisgICAgICBnc3RfYnVmZmVyX3VucmVmIChpZF9idWZmZXIpOworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHRhZywgU1RSRUFNLCBXUk9OR19UWVBFLCAoTlVMTCksIChOVUxMKSk7CisgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICB9CisgIH0KKworCisgIC8qIFRoZSBmTGFDIG1hZ2ljIHN0cmluZyBoYXMgYmVlbiBza2lwcGVkLCB0cnkgdG8gZGV0ZWN0IHRoZSBiZWdpbm5pbmcKKyAgICogb2YgYSBtZXRhZGF0YSBibG9jaworICAgKi8KKyAgaWYgKHRhZy0+c3RhdGUgPT0gR1NUX0ZMQUNfVEFHX1NUQVRFX01FVEFEQVRBX0JMT0NLUykgeworICAgIGd1aW50IHR5cGU7CisgICAgZ2Jvb2xlYW4gaXNfbGFzdDsKKyAgICBjb25zdCBndWludDggKmJsb2NrX2hlYWRlcjsKKworICAgIGdfYXNzZXJ0ICh0YWctPm1ldGFkYXRhX2Jsb2NrX3NpemUgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRhZy0+bWV0YWRhdGFfbGFzdF9ibG9jayA9PSBGQUxTRSk7CisKKyAgICAvKiBUaGUgaGVhZGVyIG9mIGEgZmxhYyBtZXRhZGF0YSBibG9jayBpcyA0IGJ5dGVzIGxvbmc6CisgICAgICogMXN0IGJpdDogaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyB0aGUgbGFzdCBtZXRhZGF0YSBpbmZvIGJsb2NrCisgICAgICogNyBuZXh0IGJpdHM6IDQgaWYgdm9yYmlzIGNvbW1lbnQgYmxvY2sKKyAgICAgKiAyNCBuZXh0IGJpdHM6IHNpemUgb2YgdGhlIG1ldGFkYXRhIHRvIGZvbGxvdyAoYmlnIGVuZGlhbikKKyAgICAgKi8KKyAgICBpZiAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlICh0YWctPmFkYXB0ZXIpIDwgNCkKKyAgICAgIGdvdG8gY2xlYW51cDsKKworICAgIGJsb2NrX2hlYWRlciA9IGdzdF9hZGFwdGVyX21hcCAodGFnLT5hZGFwdGVyLCA0KTsKKworICAgIGlzX2xhc3QgPSAoKGJsb2NrX2hlYWRlclswXSAmIDB4ODApID09IDB4ODApOworICAgIHR5cGUgPSBibG9ja19oZWFkZXJbMF0gJiAweDdGOworICAgIHNpemUgPSAoYmxvY2tfaGVhZGVyWzFdIDw8IDE2KQorICAgICAgICB8IChibG9ja19oZWFkZXJbMl0gPDwgOCkKKyAgICAgICAgfCBibG9ja19oZWFkZXJbM107CisgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKHRhZy0+YWRhcHRlcik7CisKKyAgICAvKiBUaGUgNCBieXRlcyBsb25nIGhlYWRlciBpc24ndCBpbmNsdWRlZCBpbiB0aGUgbWV0YWRhdGEgc2l6ZSAqLworICAgIHRhZy0+bWV0YWRhdGFfYmxvY2tfc2l6ZSA9IHNpemUgKyA0OworICAgIHRhZy0+bWV0YWRhdGFfbGFzdF9ibG9jayA9IGlzX2xhc3Q7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUICh0YWcsCisgICAgICAgICJnb3QgbWV0YWRhdGEgYmxvY2s6ICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMsIHR5cGUgJWQsICIKKyAgICAgICAgImlzIHZvcmJpc2NvbW1lbnQ6ICVkLCBpcyBsYXN0OiAlZCIsCisgICAgICAgIHNpemUsIHR5cGUsICh0eXBlID09IDB4MDQpLCBpc19sYXN0KTsKKworICAgIC8qIE1ldGFkYXRhIGJsb2NrcyBvZiB0eXBlIDQgYXJlIHZvcmJpcyBjb21tZW50IGJsb2NrcyAqLworICAgIGlmICh0eXBlID09IDB4MDQpIHsKKyAgICAgIHRhZy0+c3RhdGUgPSBHU1RfRkxBQ19UQUdfU1RBVEVfVkNfTUVUQURBVEFfQkxPQ0s7CisgICAgfSBlbHNlIHsKKyAgICAgIHRhZy0+c3RhdGUgPSBHU1RfRkxBQ19UQUdfU1RBVEVfV1JJVElOR19NRVRBREFUQV9CTE9DSzsKKyAgICB9CisgIH0KKworCisgIC8qIFJlYWRzIGEgbWV0YWRhdGEgYmxvY2sgKi8KKyAgaWYgKCh0YWctPnN0YXRlID09IEdTVF9GTEFDX1RBR19TVEFURV9XUklUSU5HX01FVEFEQVRBX0JMT0NLKSB8fAorICAgICAgKHRhZy0+c3RhdGUgPT0gR1NUX0ZMQUNfVEFHX1NUQVRFX1ZDX01FVEFEQVRBX0JMT0NLKSkgeworICAgIEdzdEJ1ZmZlciAqbWV0YWRhdGFfYnVmZmVyOworCisgICAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAodGFnLT5hZGFwdGVyKSA8IHRhZy0+bWV0YWRhdGFfYmxvY2tfc2l6ZSkKKyAgICAgIGdvdG8gY2xlYW51cDsKKworICAgIG1ldGFkYXRhX2J1ZmZlciA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyICh0YWctPmFkYXB0ZXIsCisgICAgICAgIHRhZy0+bWV0YWRhdGFfYmxvY2tfc2l6ZSk7CisgICAgLyogY2xlYXIgdGhlIGlzLWxhc3QgZmxhZywgYXMgdGhlIGxhc3QgbWV0YWRhdGEgYmxvY2sgd2lsbAorICAgICAqIGJlIHRoZSB2b3JiaXMgY29tbWVudCBibG9jayB3aGljaCB3ZSB3aWxsIGJ1aWxkIG91cnNlbHZlcy4KKyAgICAgKi8KKyAgICBnc3RfYnVmZmVyX21hcCAobWV0YWRhdGFfYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQURXUklURSk7CisgICAgbWFwLmRhdGFbMF0gJj0gKH4weDgwKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChtZXRhZGF0YV9idWZmZXIsICZtYXApOworCisgICAgaWYgKHRhZy0+c3RhdGUgPT0gR1NUX0ZMQUNfVEFHX1NUQVRFX1dSSVRJTkdfTUVUQURBVEFfQkxPQ0spIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHRhZywgInB1c2hpbmcgbWV0YWRhdGEgYmxvY2sgYnVmZmVyIik7CisgICAgICByZXQgPSBnc3RfcGFkX3B1c2ggKHRhZy0+c3JjcGFkLCBtZXRhZGF0YV9idWZmZXIpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0gZWxzZSB7CisgICAgICB0YWctPnZvcmJpc2NvbW1lbnQgPSBtZXRhZGF0YV9idWZmZXI7CisgICAgfQorICAgIHRhZy0+bWV0YWRhdGFfYmxvY2tfc2l6ZSA9IDA7CisgICAgdGFnLT5zdGF0ZSA9IEdTVF9GTEFDX1RBR19TVEFURV9NRVRBREFUQV9ORVhUX0JMT0NLOworICB9CisKKyAgLyogVGhpcyBzdGF0ZSBpcyBtYWlubHkgdXNlZCB0byBiZSBhYmxlIHRvIHN0b3AgYXMgc29vbiBhcyB3ZSByZWFkCisgICAqIGEgdm9yYmlzY29tbWVudCBibG9jayBmcm9tIHRoZSBmbGFjIGZpbGUgaWYgd2UgYXJlIGluIGFuIG9ubHkgb3V0cHV0CisgICAqIHRhZ3MgbW9kZQorICAgKi8KKyAgaWYgKHRhZy0+c3RhdGUgPT0gR1NUX0ZMQUNfVEFHX1NUQVRFX01FVEFEQVRBX05FWFRfQkxPQ0spIHsKKyAgICAvKiBDaGVjayBpZiBpbiB0aGUgcHJldmlvdXMgaXRlcmF0aW9uIHdlIHJlYWQgYSB2b3JiaXMgY29tbWVudCBtZXRhZGF0YSAKKyAgICAgKiBibG9jaywgYW5kIHN0b3Agbm93IGlmIHRoZSB1c2VyIG9ubHkgd2FudHMgdG8gcmVhZCB0YWdzCisgICAgICovCisgICAgaWYgKHRhZy0+dm9yYmlzY29tbWVudCAhPSBOVUxMKSB7CisgICAgICBndWludDggaWRfZGF0YVs0XTsKKyAgICAgIC8qIFdlIGZvdW5kIHNvbWUgdGFncywgdHJ5IHRvIHBhcnNlIHRoZW0gYW5kIG5vdGlmeSB0aGUgb3RoZXIgZWxlbWVudHMKKyAgICAgICAqIHRoYXQgd2UgZW5jb3VudGVyZWQgc29tZSB0YWdzCisgICAgICAgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHRhZywgImVtaXR0aW5nIHZvcmJpc2NvbW1lbnQgdGFncyIpOworICAgICAgZ3N0X2J1ZmZlcl9leHRyYWN0ICh0YWctPnZvcmJpc2NvbW1lbnQsIDAsIGlkX2RhdGEsIDQpOworICAgICAgdGFnLT50YWdzID0gZ3N0X3RhZ19saXN0X2Zyb21fdm9yYmlzY29tbWVudF9idWZmZXIgKHRhZy0+dm9yYmlzY29tbWVudCwKKyAgICAgICAgICBpZF9kYXRhLCA0LCBOVUxMKTsKKyAgICAgIGlmICh0YWctPnRhZ3MgIT0gTlVMTCkgeworICAgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHRhZy0+c3JjcGFkLAorICAgICAgICAgICAgZ3N0X2V2ZW50X25ld190YWcgKGdzdF90YWdfbGlzdF9yZWYgKHRhZy0+dGFncykpKTsKKyAgICAgIH0KKworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAodGFnLT52b3JiaXNjb21tZW50KTsKKyAgICAgIHRhZy0+dm9yYmlzY29tbWVudCA9IE5VTEw7CisgICAgfQorCisgICAgLyogU2tpcCB0byBuZXh0IHN0YXRlICovCisgICAgaWYgKHRhZy0+bWV0YWRhdGFfbGFzdF9ibG9jayA9PSBGQUxTRSkgeworICAgICAgdGFnLT5zdGF0ZSA9IEdTVF9GTEFDX1RBR19TVEFURV9NRVRBREFUQV9CTE9DS1M7CisgICAgfSBlbHNlIHsKKyAgICAgIHRhZy0+c3RhdGUgPSBHU1RfRkxBQ19UQUdfU1RBVEVfQUREX1ZPUkJJU19DT01NRU5UOworICAgIH0KKyAgfQorCisKKyAgLyogQ3JlYXRlcyBhIHZvcmJpcyBjb21tZW50IGJsb2NrIGZyb20gdGhlIG1ldGFkYXRhIHdoaWNoIHdhcyBzZXQKKyAgICogb24gdGhlIGdzdHJlYW1lciBlbGVtZW50LCBhbmQgYWRkIGl0IHRvIHRoZSBmbGFjIHN0cmVhbQorICAgKi8KKyAgaWYgKHRhZy0+c3RhdGUgPT0gR1NUX0ZMQUNfVEFHX1NUQVRFX0FERF9WT1JCSVNfQ09NTUVOVCkgeworICAgIEdzdEJ1ZmZlciAqYnVmZmVyOworICAgIGNvbnN0IEdzdFRhZ0xpc3QgKnVzZXJfdGFnczsKKyAgICBHc3RUYWdMaXN0ICptZXJnZWRfdGFnczsKKworICAgIC8qIG1lcmdlIHRoZSB0YWcgbGlzdHMgKi8KKyAgICB1c2VyX3RhZ3MgPSBnc3RfdGFnX3NldHRlcl9nZXRfdGFnX2xpc3QgKEdTVF9UQUdfU0VUVEVSICh0YWcpKTsKKyAgICBpZiAodXNlcl90YWdzICE9IE5VTEwpIHsKKyAgICAgIG1lcmdlZF90YWdzID0gZ3N0X3RhZ19saXN0X21lcmdlICh1c2VyX3RhZ3MsIHRhZy0+dGFncywKKyAgICAgICAgICBnc3RfdGFnX3NldHRlcl9nZXRfdGFnX21lcmdlX21vZGUgKEdTVF9UQUdfU0VUVEVSICh0YWcpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lcmdlZF90YWdzID0gZ3N0X3RhZ19saXN0X2NvcHkgKHRhZy0+dGFncyk7CisgICAgfQorCisgICAgaWYgKG1lcmdlZF90YWdzID09IE5VTEwpIHsKKyAgICAgIC8qIElmIHdlIGdldCBhIE5VTEwgbGlzdCBvZiB0YWdzLCB3ZSBtdXN0IGdlbmVyYXRlIGEgcGFkZGluZyBibG9jaworICAgICAgICogd2hpY2ggaXMgbWFya2VkIGFzIHRoZSBsYXN0IG1ldGFkYXRhIGJsb2NrLCBvdGhlcndpc2Ugd2UnbGwKKyAgICAgICAqIGVuZCB1cCB3aXRoIGEgY29ycnVwdGVkIGZsYWMgZmlsZS4KKyAgICAgICAqLworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh0YWcsICJObyB0YWdzIGZvdW5kIik7CisgICAgICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEyKTsKKyAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkKKyAgICAgICAgZ290byBub19idWZmZXI7CisKKyAgICAgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgICAgbWVtc2V0IChtYXAuZGF0YSwgMCwgbWFwLnNpemUpOworICAgICAgbWFwLmRhdGFbMF0gPSAweDgxOyAgICAgICAvKiAweDgwID0gTGFzdCBtZXRhZGF0YSBibG9jaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDB4MDEgPSBwYWRkaW5nIGJsb2NrICovCisgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgIH0gZWxzZSB7CisgICAgICBndWNoYXIgaGVhZGVyWzRdOworICAgICAgZ3VpbnQ4IGZiaXRbMV07CisKKyAgICAgIG1lbXNldCAoaGVhZGVyLCAwLCBzaXplb2YgKGhlYWRlcikpOworICAgICAgaGVhZGVyWzBdID0gMHg4NDsgICAgICAgICAvKiAweDgwID0gTGFzdCBtZXRhZGF0YSBibG9jaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDB4MDQgPSB2b3JiaXNjb21tZW50IGJsb2NrICovCisgICAgICBidWZmZXIgPSBnc3RfdGFnX2xpc3RfdG9fdm9yYmlzY29tbWVudF9idWZmZXIgKG1lcmdlZF90YWdzLCBoZWFkZXIsCisgICAgICAgICAgc2l6ZW9mIChoZWFkZXIpLCBOVUxMKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHRhZywgIldyaXRpbmcgdGFncyAlIiBHU1RfUFRSX0ZPUk1BVCwgbWVyZ2VkX3RhZ3MpOworICAgICAgZ3N0X3RhZ19saXN0X3VucmVmIChtZXJnZWRfdGFncyk7CisgICAgICBpZiAoYnVmZmVyID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9fY29tbWVudDsKKworICAgICAgc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcik7CisgICAgICBpZiAoKHNpemUgPCA0KSB8fCAoKHNpemUgLSA0KSA+IDB4RkZGRkZGKSkKKyAgICAgICAgZ290byBjb21tZW50X3Rvb19sb25nOworCisgICAgICBmYml0WzBdID0gMTsKKyAgICAgIC8qIEdldCByaWQgb2YgdGhlIGZyYW1pbmcgYml0IGF0IHRoZSBlbmQgb2YgdGhlIHZvcmJpc2NvbW1lbnQgYnVmZmVyIAorICAgICAgICogaWYgaXQgZXhpc3RzIHNpbmNlIGxpYkZMQUMgc2VlbXMgdG8gbG9zZSBzeW5jIGJlY2F1c2Ugb2YgdGhpcworICAgICAgICogYml0IGluIGdzdGZsYWNkZWMKKyAgICAgICAqLworICAgICAgaWYgKGdzdF9idWZmZXJfbWVtY21wIChidWZmZXIsIHNpemUgLSAxLCBmYml0LCAxKSA9PSAwKSB7CisgICAgICAgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoYnVmZmVyKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl9yZXNpemUgKGJ1ZmZlciwgMCwgc2l6ZSAtIDEpOworICAgICAgfQorICAgIH0KKworICAgIC8qIFRoZSA0IGJ5dGUgbWV0YWRhdGEgYmxvY2sgaGVhZGVyIGlzbid0IGFjY291bnRlZCBmb3IgaW4gdGhlIHRvdGFsCisgICAgICogc2l6ZSBvZiB0aGUgbWV0YWRhdGEgYmxvY2sKKyAgICAgKi8KKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICBtYXAuZGF0YVsxXSA9ICgoKG1hcC5zaXplIC0gNCkgJiAweEZGMDAwMCkgPj4gMTYpOworICAgIG1hcC5kYXRhWzJdID0gKCgobWFwLnNpemUgLSA0KSAmIDB4MDBGRjAwKSA+PiA4KTsKKyAgICBtYXAuZGF0YVszXSA9ICgobWFwLnNpemUgLSA0KSAmIDB4MDAwMEZGKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAodGFnLCAicHVzaGluZyAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGUgdm9yYmlzY29tbWVudCAiCisgICAgICAgICJidWZmZXIiLCBtYXAuc2l6ZSk7CisKKyAgICByZXQgPSBnc3RfcGFkX3B1c2ggKHRhZy0+c3JjcGFkLCBidWZmZXIpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisgICAgdGFnLT5zdGF0ZSA9IEdTVF9GTEFDX1RBR19TVEFURV9BVURJT19EQVRBOworICB9CisKKyAgLyogVGhlIG1ldGFkYXRhIGJsb2NrcyBoYXZlIGJlZW4gcmVhZCwgbm93IHdlIGFyZSByZWFkaW5nIGF1ZGlvIGRhdGEgKi8KKyAgaWYgKHRhZy0+c3RhdGUgPT0gR1NUX0ZMQUNfVEFHX1NUQVRFX0FVRElPX0RBVEEpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgICBndWludCBhdmFpbDsKKworICAgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlICh0YWctPmFkYXB0ZXIpOworICAgIGlmIChhdmFpbCA+IDApIHsKKyAgICAgIGJ1ZmZlciA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyICh0YWctPmFkYXB0ZXIsIGF2YWlsKTsKKyAgICAgIHJldCA9IGdzdF9wYWRfcHVzaCAodGFnLT5zcmNwYWQsIGJ1ZmZlcik7CisgICAgfQorICB9CisKK2NsZWFudXA6CisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJzdGF0ZTogJWQsIHJldDogJWQiLCB0YWctPnN0YXRlLCByZXQpOworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworbm9fYnVmZmVyOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHRhZywgQ09SRSwgVE9PX0xBWlksIChOVUxMKSwKKyAgICAgICAgKCJFcnJvciBjcmVhdGluZyAxMi1ieXRlIGJ1ZmZlciBmb3IgcGFkZGluZyBibG9jayIpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KK25vX2NvbW1lbnQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAodGFnLCBDT1JFLCBUQUcsIChOVUxMKSwKKyAgICAgICAgKCJFcnJvciBjb252ZXJ0aW5nIHRhZyBsaXN0IHRvIHZvcmJpc2NvbW1lbnQgYnVmZmVyIikpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorY29tbWVudF90b29fbG9uZzoKKyAgeworICAgIC8qIEZMQUMgdm9yYmlzIGNvbW1lbnQgYmxvY2tzIGFyZSBsaW1pdGVkIHRvIDJeMjQgYnl0ZXMsIAorICAgICAqIHdoaWxlIHRoZSB2b3JiaXMgc3BlY3MgYWxsb3cgbW9yZSB0aGFuIHRoYXQuIFNob3VsZG4ndCAKKyAgICAgKiBiZSBhIHJlYWwgd29ybGQgcHJvYmxlbSB0aG91Z2gKKyAgICAgKi8KKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAodGFnLCBDT1JFLCBUQUcsIChOVUxMKSwKKyAgICAgICAgKCJWb3JiaXMgY29tbWVudCBvZiBzaXplICUiIEdfR1NJWkVfRk9STUFUICIgdG9vIGxvbmciLCBzaXplKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBjbGVhbnVwOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2ZsYWNfdGFnX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdEZsYWNUYWcgKnRhZzsKKworICB0YWcgPSBHU1RfRkxBQ19UQUcgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUExBWUlORzoKKyAgICAgIC8qIGRvIHNvbWV0aGluZyB0byBnZXQgb3V0IG9mIHRoZSBjaGFpbiBmdW5jdGlvbiBmYXN0ZXIgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QTEFZSU5HX1RPX1BBVVNFRDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3RfYWRhcHRlcl9jbGVhciAodGFnLT5hZGFwdGVyKTsKKyAgICAgIGlmICh0YWctPnZvcmJpc2NvbW1lbnQpIHsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAodGFnLT52b3JiaXNjb21tZW50KTsKKyAgICAgICAgdGFnLT52b3JiaXNjb21tZW50ID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGlmICh0YWctPnRhZ3MpIHsKKyAgICAgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWctPnRhZ3MpOworICAgICAgICB0YWctPnRhZ3MgPSBOVUxMOworICAgICAgfQorICAgICAgdGFnLT5tZXRhZGF0YV9ibG9ja19zaXplID0gMDsKKyAgICAgIHRhZy0+bWV0YWRhdGFfbGFzdF9ibG9jayA9IEZBTFNFOworICAgICAgdGFnLT5zdGF0ZSA9IEdTVF9GTEFDX1RBR19TVEFURV9JTklUOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7Cit9CmRpZmYgLS1naXQgYS9leHQvZmxhYy9nc3RmbGFjdGFnLmggYi9leHQvZmxhYy9nc3RmbGFjdGFnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2NTQxYQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9mbGFjL2dzdGZsYWN0YWcuaApAQCAtMCwwICsxLDc4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMyBDaHJpc3RvcGhlIEZlcmdlYXUgPHRldWZAZ25vbWUub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4IEpvbmF0aGFuIE1hdHRoZXcgPGpvbmF0aGFuQGQxNG4ub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIGdzdGZsYWN0YWcuYzogcGx1Zy1pbiBmb3IgcmVhZGluZy9tb2RpZnlpbmcgdm9yYmlzIGNvbW1lbnRzIGluIGZsYWMgZmlsZXMKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIEdTVF9GTEFDX1RBR19ICisjZGVmaW5lIEdTVF9GTEFDX1RBR19ICisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorCisjZGVmaW5lIEdTVF9UWVBFX0ZMQUNfVEFHIChnc3RfZmxhY190YWdfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0ZMQUNfVEFHKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0ZMQUNfVEFHLCBHc3RGbGFjVGFnKSkKKyNkZWZpbmUgR1NUX0ZMQUNfVEFHX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9GTEFDX1RBRywgR3N0RmxhY1RhZykpCisjZGVmaW5lIEdTVF9JU19GTEFDX1RBRyhvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9GTEFDX1RBRykpCisjZGVmaW5lIEdTVF9JU19GTEFDX1RBR19DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfRkxBQ19UQUcpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0RmxhY1RhZyBHc3RGbGFjVGFnOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEZsYWNUYWdDbGFzcyBHc3RGbGFjVGFnQ2xhc3M7CisKK3R5cGVkZWYgZW51bQoreworICBHU1RfRkxBQ19UQUdfU1RBVEVfSU5JVCwKKyAgR1NUX0ZMQUNfVEFHX1NUQVRFX01FVEFEQVRBX0JMT0NLUywKKyAgR1NUX0ZMQUNfVEFHX1NUQVRFX01FVEFEQVRBX05FWFRfQkxPQ0ssCisgIEdTVF9GTEFDX1RBR19TVEFURV9XUklUSU5HX01FVEFEQVRBX0JMT0NLLAorICBHU1RfRkxBQ19UQUdfU1RBVEVfVkNfTUVUQURBVEFfQkxPQ0ssCisgIEdTVF9GTEFDX1RBR19TVEFURV9BRERfVk9SQklTX0NPTU1FTlQsCisgIEdTVF9GTEFDX1RBR19TVEFURV9BVURJT19EQVRBCit9CitHc3RGbGFjVGFnU3RhdGU7CisKK3N0cnVjdCBfR3N0RmxhY1RhZworeworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKworICAvKiBwYWRzICovCisgIEdzdFBhZCAqc2lua3BhZDsKKyAgR3N0UGFkICpzcmNwYWQ7CisKKyAgR3N0RmxhY1RhZ1N0YXRlIHN0YXRlOworCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisgIEdzdEJ1ZmZlciAqdm9yYmlzY29tbWVudDsKKyAgR3N0VGFnTGlzdCAqdGFnczsKKworICBndWludCBtZXRhZGF0YV9ibG9ja19zaXplOworICBnYm9vbGVhbiBtZXRhZGF0YV9sYXN0X2Jsb2NrOworfTsKKworc3RydWN0IF9Hc3RGbGFjVGFnQ2xhc3MKK3sKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9mbGFjX3RhZ19nZXRfdHlwZSAodm9pZCk7CisKKyNlbmRpZiAvKiBHU1RfRkxBQ19UQUdfSCAqLwpkaWZmIC0tZ2l0IGEvZXh0L2ZsYWMvbWVzb24uYnVpbGQgYi9leHQvZmxhYy9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjY2ZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2ZsYWMvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwyMCBAQAorZmxhY19zb3VyY2VzID0gWworICAnZ3N0ZmxhYy5jJywKKyAgJ2dzdGZsYWNkZWMuYycsCisgICdnc3RmbGFjZW5jLmMnLAorICAnZ3N0ZmxhY3RhZy5jJywKK10KKworZmxhY19kZXAgPSBkZXBlbmRlbmN5KCdmbGFjJywgdmVyc2lvbiA6ICc+PTEuMS40JywgcmVxdWlyZWQgOiBmYWxzZSkKKworaWYgZmxhY19kZXAuZm91bmQoKQorICBnc3RmbGFjID0gbGlicmFyeSgnZ3N0ZmxhYycsCisgICAgZmxhY19zb3VyY2VzLAorICAgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncyArIFsnLURHU1RfVVNFX1VOU1RBQkxFX0FQSSddLAorICAgIGxpbmtfYXJncyA6IG5vc2VoX2xpbmtfYXJncywKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luYywgbGlic2luY10sCisgICAgZGVwZW5kZW5jaWVzIDogW2dzdGJhc2VfZGVwLCBnc3R0YWdfZGVwLCBnc3RhdWRpb19kZXAsIGZsYWNfZGVwXSwKKyAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCisgICkKK2VuZGlmCmRpZmYgLS1naXQgYS9leHQvZ2RrX3BpeGJ1Zi9NYWtlZmlsZS5hbSBiL2V4dC9nZGtfcGl4YnVmL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NDAwODYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZ2RrX3BpeGJ1Zi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI2IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RnZGtwaXhidWYubGEKKworIyBnc3RnZGthbmltYXRpb24uW2NoXSAtIEdka1BpeGJ1ZiBhbmltYXRpb25zIGRlY29kZSBldmVyeXRoaW5nIGZyb20gdGhlIHN0YXJ0LAorIyB3aGljaCBtZWFucyBpdCdzIGVhc3kgdG8gbWFrZSB1cyBnbyBPT00gd2l0aCBtYW5pcHVsYXRlZCBpbnB1dCwgZGlzYWJsZWQKKworbGliZ3N0Z2RrcGl4YnVmX2xhX1NPVVJDRVMgPSBcCisJZ3N0Z2RrcGl4YnVmZGVjLmMgXAorCWdzdGdka3BpeGJ1Zm92ZXJsYXkuYyBcCisJZ3N0Z2RrcGl4YnVmcGx1Z2luLmMgXAorCWdzdGdka3BpeGJ1ZnNpbmsuYworbGliZ3N0Z2RrcGl4YnVmX2xhX0NGTEFHUyA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQ09OVFJPTExFUl9DRkxBR1MpIFwKKwkkKEdTVF9CQVNFX0NGTEFHUykgXAorCSQoR1NUX0NGTEFHUykgJChHREtfUElYQlVGX0NGTEFHUykKK2xpYmdzdGdka3BpeGJ1Zl9sYV9MSUJBREQgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0dmlkZW8tJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkkKEdTVF9DT05UUk9MTEVSX0xJQlMpIFwKKwkkKEdTVF9CQVNFX0xJQlMpIFwKKwkkKEdTVF9MSUJTKSAkKEdES19QSVhCVUZfTElCUykKK2xpYmdzdGdka3BpeGJ1Zl9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gXAorCWdzdGdka3BpeGJ1ZmRlYy5oIFwKKwlnc3RnZGtwaXhidWZvdmVybGF5LmggXAorCWdzdGdka3BpeGJ1ZnNpbmsuaApkaWZmIC0tZ2l0IGEvZXh0L2dka19waXhidWYvZ3N0Z2RrYW5pbWF0aW9uLmMgYi9leHQvZ2RrX3BpeGJ1Zi9nc3RnZGthbmltYXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjAzN2ZlCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2dka19waXhidWYvZ3N0Z2RrYW5pbWF0aW9uLmMKQEAgLTAsMCArMSw2NjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQmVuamFtaW4gT3R0ZSA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0Z2RrYW5pbWF0aW9uLmgiCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9nZGtfYW5pbWF0aW9uX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9nZGtfYW5pbWF0aW9uX2RlYnVnCisKK3N0YXRpYyB2b2lkIGdzdF9nZGtfYW5pbWF0aW9uX2NsYXNzX2luaXQgKGdwb2ludGVyIGdfY2xhc3MsCisgICAgZ3BvaW50ZXIgY2xhc3NfZGF0YSk7CitzdGF0aWMgdm9pZCBnc3RfZ2RrX2FuaW1hdGlvbl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZ2RrX2FuaW1hdGlvbl9pc19zdGF0aWNfaW1hZ2UgKEdka1BpeGJ1ZkFuaW1hdGlvbiAqCisgICAgYW5pbWF0aW9uKTsKK3N0YXRpYyBHZGtQaXhidWYgKmdzdF9nZGtfYW5pbWF0aW9uX2dldF9zdGF0aWNfaW1hZ2UgKEdka1BpeGJ1ZkFuaW1hdGlvbiAqCisgICAgYW5pbWF0aW9uKTsKK3N0YXRpYyB2b2lkIGdzdF9nZGtfYW5pbWF0aW9uX2dldF9zaXplIChHZGtQaXhidWZBbmltYXRpb24gKiBhbmltLCBnaW50ICogd2lkdGgsCisgICAgZ2ludCAqIGhlaWdodCk7CitzdGF0aWMgR2RrUGl4YnVmQW5pbWF0aW9uSXRlciAqZ3N0X2dka19hbmltYXRpb25fZ2V0X2l0ZXIgKEdka1BpeGJ1ZkFuaW1hdGlvbiAqCisgICAgYW5pbSwgY29uc3QgR1RpbWVWYWwgKiBzdGFydF90aW1lKTsKKworCitzdGF0aWMgZ3BvaW50ZXIgcGFyZW50X2NsYXNzOworCitHVHlwZQorZ3N0X2dka19hbmltYXRpb25fZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBvYmplY3RfdHlwZSA9IDA7CisKKyAgaWYgKCFvYmplY3RfdHlwZSkgeworICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gb2JqZWN0X2luZm8gPSB7CisgICAgICBzaXplb2YgKEdzdEdka0FuaW1hdGlvbkNsYXNzKSwKKyAgICAgIE5VTEwsCisgICAgICBOVUxMLAorICAgICAgZ3N0X2dka19hbmltYXRpb25fY2xhc3NfaW5pdCwKKyAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogY2xhc3NfZmluYWxpemUgKi8KKyAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogY2xhc3NfZGF0YSAqLworICAgICAgc2l6ZW9mIChHc3RHZGtBbmltYXRpb24pLAorICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBuX3ByZWFsbG9jcyAqLworICAgICAgTlVMTCwKKyAgICB9OworCisgICAgb2JqZWN0X3R5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChHREtfVFlQRV9QSVhCVUZfQU5JTUFUSU9OLAorICAgICAgICAiR3N0R2RrQW5pbWF0aW9uIiwgJm9iamVjdF9pbmZvLCAwKTsKKworICAgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfZ2RrX2FuaW1hdGlvbl9kZWJ1ZywgImdzdGxvYWRlcl9hbmltYXRpb24iLCAwLAorICAgICAgICAiR1N0cmVhbWVyIEdka1BpeGJ1ZiBsb2FkZXIgLSBHZGtBbmltYXRpb24gY2xhc3MiKTsKKyAgfQorCisgIHJldHVybiBvYmplY3RfdHlwZTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9nZGtfYW5pbWF0aW9uX2NsYXNzX2luaXQgKGdwb2ludGVyIGdfY2xhc3MsIGdwb2ludGVyIGNsYXNzX2RhdGEpCit7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGdfY2xhc3MpOworICBHZGtQaXhidWZBbmltYXRpb25DbGFzcyAqYW5pbV9jbGFzcyA9IEdES19QSVhCVUZfQU5JTUFUSU9OX0NMQVNTIChnX2NsYXNzKTsKKworICBwYXJlbnRfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKGdfY2xhc3MpOworCisgIG9iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfZ2RrX2FuaW1hdGlvbl9maW5hbGl6ZTsKKworICBhbmltX2NsYXNzLT5pc19zdGF0aWNfaW1hZ2UgPSBnc3RfZ2RrX2FuaW1hdGlvbl9pc19zdGF0aWNfaW1hZ2U7CisgIGFuaW1fY2xhc3MtPmdldF9zdGF0aWNfaW1hZ2UgPSBnc3RfZ2RrX2FuaW1hdGlvbl9nZXRfc3RhdGljX2ltYWdlOworICBhbmltX2NsYXNzLT5nZXRfc2l6ZSA9IGdzdF9nZGtfYW5pbWF0aW9uX2dldF9zaXplOworICBhbmltX2NsYXNzLT5nZXRfaXRlciA9IGdzdF9nZGtfYW5pbWF0aW9uX2dldF9pdGVyOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2dka19hbmltYXRpb25fZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEdka0FuaW1hdGlvbiAqYW5pID0gR1NUX0dES19BTklNQVRJT04gKG9iamVjdCk7CisKKyAgaWYgKGFuaS0+dGVtcF9mZCkgeworICAgIGNsb3NlIChhbmktPnRlbXBfZmQpOworICB9CisgIGlmIChhbmktPnRlbXBfbG9jYXRpb24pIHsKKyAgICByZW1vdmUgKGFuaS0+dGVtcF9sb2NhdGlvbik7CisgICAgZ19mcmVlIChhbmktPnRlbXBfbG9jYXRpb24pOworICB9CisgIGlmIChhbmktPnBpeGJ1ZikgeworICAgIGdfb2JqZWN0X3VucmVmIChhbmktPnBpeGJ1Zik7CisgICAgYW5pLT5waXhidWYgPSBOVUxMOworICB9CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitHc3RHZGtBbmltYXRpb24gKgorZ3N0X2dka19hbmltYXRpb25fbmV3IChHRXJyb3IgKiogZXJyb3IpCit7CisgIEdzdEdka0FuaW1hdGlvbiAqYW5pID0KKyAgICAgIEdTVF9HREtfQU5JTUFUSU9OIChnX29iamVjdF9uZXcgKEdTVF9UWVBFX0dES19BTklNQVRJT04sIE5VTEwpKTsKKworICByZXR1cm4gYW5pOworfQorCitnYm9vbGVhbgorZ3N0X2dka19hbmltYXRpb25fYWRkX2RhdGEgKEdzdEdka0FuaW1hdGlvbiAqIGFuaSwgY29uc3QgZ3VpbnQ4ICogZGF0YSwKKyAgICBndWludCBzaXplKQoreworICByZXR1cm4gKHdyaXRlIChhbmktPnRlbXBfZmQsIGRhdGEsIHNpemUpID09IHNpemUpOworfQorCit2b2lkCitnc3RfZ2RrX2FuaW1hdGlvbl9kb25lX2FkZGluZyAoR3N0R2RrQW5pbWF0aW9uICogYW5pKQoreworICBjbG9zZSAoYW5pLT50ZW1wX2ZkKTsKKyAgYW5pLT50ZW1wX2ZkID0gMDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZ2RrX2FuaW1hdGlvbl9pc19zdGF0aWNfaW1hZ2UgKEdka1BpeGJ1ZkFuaW1hdGlvbiAqIGFuaW1hdGlvbikKK3sKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2dka19hbmltYXRpb25fZ2V0X3NpemUgKEdka1BpeGJ1ZkFuaW1hdGlvbiAqIGFuaW0sIGdpbnQgKiB3aWR0aCwKKyAgICBpbnQgKmhlaWdodCkKK3sKKyAgR3N0R2RrQW5pbWF0aW9uICphbmkgPSBHU1RfR0RLX0FOSU1BVElPTiAoYW5pbSk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGFuaSwgImdldF9zaXplIGNhbGxlZCAoJXAsICVwKSAlZCB4ICVkIiwgd2lkdGgsIGhlaWdodCwKKyAgICAgIGFuaS0+d2lkdGgsIGFuaS0+aGVpZ2h0KTsKKyAgaWYgKHdpZHRoKQorICAgICp3aWR0aCA9IGFuaS0+d2lkdGg7CisKKyAgaWYgKGhlaWdodCkKKyAgICAqaGVpZ2h0ID0gYW5pLT5oZWlnaHQ7Cit9CisKKworc3RhdGljIHZvaWQgZ3N0X2dka19hbmltYXRpb25faXRlcl9jbGFzc19pbml0IChncG9pbnRlciBnX2NsYXNzLAorICAgIGdwb2ludGVyIGNsYXNzX2RhdGEpOworc3RhdGljIHZvaWQgZ3N0X2dka19hbmltYXRpb25faXRlcl9pbml0IChHVHlwZUluc3RhbmNlICogaW5zdGFuY2UsCisgICAgZ3BvaW50ZXIgZ19jbGFzcyk7CitzdGF0aWMgdm9pZCBnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdpbnQgZ3N0X2dka19hbmltYXRpb25faXRlcl9nZXRfZGVsYXlfdGltZSAoR2RrUGl4YnVmQW5pbWF0aW9uSXRlciAqCisgICAgaXRlcik7CitzdGF0aWMgR2RrUGl4YnVmICpnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX2dldF9waXhidWYgKEdka1BpeGJ1ZkFuaW1hdGlvbkl0ZXIgKgorICAgIGl0ZXIpOworc3RhdGljIGdib29sZWFuCitnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX29uX2N1cnJlbnRseV9sb2FkaW5nX2ZyYW1lIChHZGtQaXhidWZBbmltYXRpb25JdGVyICoKKyAgICBpdGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX2FkdmFuY2UgKEdka1BpeGJ1ZkFuaW1hdGlvbkl0ZXIgKiBpdGVyLAorICAgIGNvbnN0IEdUaW1lVmFsICogY3VycmVudF90aW1lKTsKKworc3RhdGljIGdwb2ludGVyIGl0ZXJfcGFyZW50X2NsYXNzOworCitHVHlwZQorZ3N0X2dka19hbmltYXRpb25faXRlcl9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIG9iamVjdF90eXBlID0gMDsKKworICBpZiAoIW9iamVjdF90eXBlKSB7CisgICAgc3RhdGljIGNvbnN0IEdUeXBlSW5mbyBvYmplY3RfaW5mbyA9IHsKKyAgICAgIHNpemVvZiAoR3N0R2RrQW5pbWF0aW9uSXRlckNsYXNzKSwKKyAgICAgIE5VTEwsCisgICAgICBOVUxMLAorICAgICAgZ3N0X2dka19hbmltYXRpb25faXRlcl9jbGFzc19pbml0LAorICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBjbGFzc19maW5hbGl6ZSAqLworICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBjbGFzc19kYXRhICovCisgICAgICBzaXplb2YgKEdzdEdka0FuaW1hdGlvbkl0ZXIpLAorICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBuX3ByZWFsbG9jcyAqLworICAgICAgZ3N0X2dka19hbmltYXRpb25faXRlcl9pbml0LAorICAgIH07CisKKyAgICBvYmplY3RfdHlwZSA9IGdfdHlwZV9yZWdpc3Rlcl9zdGF0aWMgKEdES19UWVBFX1BJWEJVRl9BTklNQVRJT05fSVRFUiwKKyAgICAgICAgIkdka1BpeGJ1ZkFuaUFuaW1JdGVyIiwgJm9iamVjdF9pbmZvLCAwKTsKKyAgfQorCisgIHJldHVybiBvYmplY3RfdHlwZTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfY2xhc3NfaW5pdCAoZ3BvaW50ZXIgZ19jbGFzcywgZ3BvaW50ZXIgY2xhc3NfZGF0YSkKK3sKKyAgR09iamVjdENsYXNzICpvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoZ19jbGFzcyk7CisgIEdka1BpeGJ1ZkFuaW1hdGlvbkl0ZXJDbGFzcyAqYW5pbV9pdGVyX2NsYXNzID0KKyAgICAgIEdES19QSVhCVUZfQU5JTUFUSU9OX0lURVJfQ0xBU1MgKGdfY2xhc3MpOworCisgIGl0ZXJfcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChnX2NsYXNzKTsKKworICBvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2dka19hbmltYXRpb25faXRlcl9maW5hbGl6ZTsKKworICBhbmltX2l0ZXJfY2xhc3MtPmdldF9kZWxheV90aW1lID0gZ3N0X2dka19hbmltYXRpb25faXRlcl9nZXRfZGVsYXlfdGltZTsKKyAgYW5pbV9pdGVyX2NsYXNzLT5nZXRfcGl4YnVmID0gZ3N0X2dka19hbmltYXRpb25faXRlcl9nZXRfcGl4YnVmOworICBhbmltX2l0ZXJfY2xhc3MtPm9uX2N1cnJlbnRseV9sb2FkaW5nX2ZyYW1lID0KKyAgICAgIGdzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfb25fY3VycmVudGx5X2xvYWRpbmdfZnJhbWU7CisgIGFuaW1faXRlcl9jbGFzcy0+YWR2YW5jZSA9IGdzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfYWR2YW5jZTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfaW5pdCAoR1R5cGVJbnN0YW5jZSAqIGluc3RhbmNlLCBncG9pbnRlciBnX2NsYXNzKQoreworICBHc3RHZGtBbmltYXRpb25JdGVyICppdGVyID0gR1NUX0dES19BTklNQVRJT05fSVRFUiAoaW5zdGFuY2UpOworCisgIGl0ZXItPmJ1ZmZlcnMgPSBnX3F1ZXVlX25ldyAoKTsKKyAgaXRlci0+ZW9zID0gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RHZGtBbmltYXRpb25JdGVyICppdGVyID0gR1NUX0dES19BTklNQVRJT05fSVRFUiAob2JqZWN0KTsKKworICBnX29iamVjdF91bnJlZiAoaXRlci0+YW5pKTsKKworICBpZiAoaXRlci0+cGlwZWxpbmUpCisgICAgZ19vYmplY3RfdW5yZWYgKGl0ZXItPnBpcGVsaW5lKTsKKyAgaWYgKGl0ZXItPnBpeGJ1ZikKKyAgICBnX29iamVjdF91bnJlZiAoaXRlci0+cGl4YnVmKTsKKyAgd2hpbGUgKGl0ZXItPmJ1ZmZlcnMpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZmZlciA9IEdTVF9CVUZGRVIgKGdfcXVldWVfcG9wX2hlYWQgKGl0ZXItPmJ1ZmZlcnMpKTsKKworICAgIGlmIChidWZmZXIpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChpdGVyLCAidW5yZWZmaW5nIGJ1ZmZlciAlcCBvbiBmaW5hbGl6ZSIsIGJ1ZmZlcik7CisgICAgICBnc3RfZGF0YV91bnJlZiAoR1NUX0RBVEEgKGJ1ZmZlcikpOworICAgIH0gZWxzZSB7CisgICAgICBnX3F1ZXVlX2ZyZWUgKGl0ZXItPmJ1ZmZlcnMpOworICAgICAgaXRlci0+YnVmZmVycyA9IE5VTEw7CisgICAgfQorICB9CisgIEdfT0JKRUNUX0NMQVNTIChpdGVyX3BhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ290X2hhbmRvZmYgKEdzdEVsZW1lbnQgKiBmYWtlc2luaywgR3N0QnVmZmVyICogYnVmZmVyLCBHc3RQYWQgKiBwYWQsCisgICAgR3N0R2RrQW5pbWF0aW9uSXRlciAqIGl0ZXIpCit7CisgIEdTVF9MT0dfT0JKRUNUIChpdGVyLCAiZW5xdWVpbmcgYnVmZmVyICVwICh0aW1lc3RhbXAgJSIgR19HVUlOVDY0X0ZPUk1BVCAiKSIsCisgICAgICBidWZmZXIsIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpKTsKKyAgZ3N0X2RhdGFfcmVmIChHU1RfREFUQSAoYnVmZmVyKSk7CisgIGdfcXVldWVfcHVzaF90YWlsIChpdGVyLT5idWZmZXJzLCBidWZmZXIpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfY3JlYXRlX3BpcGVsaW5lIChHc3RHZGtBbmltYXRpb25JdGVyICogaXRlcikKK3sKKyAgR3N0RWxlbWVudCAqc3JjLCAqdHlwZWZpbmQsICphdXRvcGx1Z2dlciwgKnNpbmssICpjb2xvcnNwYWNlOworICBHc3RDYXBzICpjYXBzID0gR1NUX0NBUFNfTkVXICgicGl4YnVmX2ZpbHRlcjMyIiwKKyAgICAgICJ2aWRlby94LXJhdy1yZ2IiLAorICAgICAgImVuZGlhbm5lc3MiLCBHU1RfUFJPUFNfSU5UIChHX0JJR19FTkRJQU4pLAorICAgICAgImJwcCIsIEdTVF9QUk9QU19JTlQgKDMyKSwKKyAgICAgICJyZWRfbWFzayIsIEdTVF9QUk9QU19JTlQgKDB4RkYwMDAwMDApLAorICAgICAgImdyZWVuX21hc2siLCBHU1RfUFJPUFNfSU5UICgweDAwRkYwMDAwKSwKKyAgICAgICJibHVlX21hc2siLCBHU1RfUFJPUFNfSU5UICgweDAwMDBGRjAwKQorICAgICAgKTsKKworICBnc3RfY2Fwc19hcHBlbmQgKGNhcHMsIEdTVF9DQVBTX05FVyAoInBpeGJ1Zl9maWx0ZXIyNCIsCisgICAgICAgICAgInZpZGVvL3gtcmF3LXJnYiIsCisgICAgICAgICAgImVuZGlhbm5lc3MiLCBHU1RfUFJPUFNfSU5UIChHX0JJR19FTkRJQU4pLAorICAgICAgICAgICJicHAiLCBHU1RfUFJPUFNfSU5UICgyNCksCisgICAgICAgICAgInJlZF9tYXNrIiwgR1NUX1BST1BTX0lOVCAoMHhGRjAwMDApLAorICAgICAgICAgICJncmVlbl9tYXNrIiwgR1NUX1BST1BTX0lOVCAoMHgwMEZGMDApLAorICAgICAgICAgICJibHVlX21hc2siLCBHU1RfUFJPUFNfSU5UICgweDAwMDBGRikKKyAgICAgICkpOworCisgIGl0ZXItPnBpcGVsaW5lID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicGlwZWxpbmUiLCAibWFpbl9waXBlbGluZSIpOworICBpZiAoaXRlci0+cGlwZWxpbmUgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCEoc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmlsZXNyYyIsICJzb3VyY2UiKSkpCisgICAgZ290byBlcnJvcjsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKGl0ZXItPnBpcGVsaW5lKSwgc3JjKTsKKyAgaWYgKGl0ZXItPmFuaS0+dGVtcF9sb2NhdGlvbikgeworICAgIGdfb2JqZWN0X3NldCAoc3JjLCAibG9jYXRpb24iLCBpdGVyLT5hbmktPnRlbXBfbG9jYXRpb24sIE5VTEwpOworICAgIEdTVF9JTkZPX09CSkVDVCAoaXRlciwgInVzaW5nIGZpbGUgJyVzJyIsIGl0ZXItPmFuaS0+dGVtcF9sb2NhdGlvbik7CisgIH0gZWxzZSB7CisgICAgZ2NoYXIgKmZpbGVuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiL3Byb2Mvc2VsZi9mZC8lZCIsIGl0ZXItPmFuaS0+dGVtcF9mZCk7CisKKyAgICBnX29iamVjdF9zZXQgKHNyYywgImxvY2F0aW9uIiwgZmlsZW5hbWUsIE5VTEwpOworICAgIEdTVF9JTkZPX09CSkVDVCAoaXRlciwgInVzaW5nIGZpbGUgJyVzJyIsIGZpbGVuYW1lKTsKKyAgICBnX2ZyZWUgKGZpbGVuYW1lKTsKKyAgfQorCisgIC8qIGFkZCB0eXBlZmluZCBmb3IgY29ycmVjdCB0eXBlZmluZGluZyAqLworICBpZiAoKHR5cGVmaW5kID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidHlwZWZpbmQiLCAidHlwZWZpbmQiKSkpIHsKKyAgICBnc3RfYmluX2FkZCAoR1NUX0JJTiAoaXRlci0+cGlwZWxpbmUpLCB0eXBlZmluZCk7CisgICAgaWYgKCFnc3RfZWxlbWVudF9saW5rIChzcmMsIHR5cGVmaW5kKSkKKyAgICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBpZiAoIShhdXRvcGx1Z2dlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInNwaWRlciIsICJhdXRvcGx1Z2dlciIpKSkKKyAgICBnb3RvIGVycm9yOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAoaXRlci0+cGlwZWxpbmUpLCBhdXRvcGx1Z2dlcik7CisgIGlmICghZ3N0X2VsZW1lbnRfbGluayAodHlwZWZpbmQsIGF1dG9wbHVnZ2VyKSkKKyAgICBnb3RvIGVycm9yOworCisgIC8qIHRyeSBmZmNvbG9yc3BhY2UgaWYgYXZhaWxhYmxlIHNvIHdlIGdldCBzdnExLCB0b28gKi8KKyAgY29sb3JzcGFjZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZmY29sb3JzcGFjZSIsICJmZmNvbG9yc3BhY2UiKTsKKyAgaWYgKCFjb2xvcnNwYWNlKQorICAgIGNvbG9yc3BhY2UgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJjb2xvcnNwYWNlIiwgImNvbG9yc3BhY2UiKTsKKyAgaWYgKCFjb2xvcnNwYWNlKQorICAgIGdvdG8gZXJyb3I7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChpdGVyLT5waXBlbGluZSksIGNvbG9yc3BhY2UpOworICBpZiAoIWdzdF9lbGVtZW50X2xpbmsgKGF1dG9wbHVnZ2VyLCBjb2xvcnNwYWNlKSkKKyAgICBnb3RvIGVycm9yOworCisgIGlmICghKHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsICJzaW5rIikpKQorICAgIGdvdG8gZXJyb3I7CisgIGdfb2JqZWN0X3NldCAoc2luaywgInNpZ25hbC1oYW5kb2ZmcyIsIFRSVUUsIE5VTEwpOworICBnX3NpZ25hbF9jb25uZWN0IChzaW5rLCAiaGFuZG9mZiIsIChHQ2FsbGJhY2spIGdvdF9oYW5kb2ZmLCBpdGVyKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKGl0ZXItPnBpcGVsaW5lKSwgc2luayk7CisgIGlmICghZ3N0X2VsZW1lbnRfbGlua19maWx0ZXJlZCAoY29sb3JzcGFjZSwgc2luaywgY2FwcykpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoaXRlci0+cGlwZWxpbmUsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpICE9IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUykKKyAgICBnb3RvIGVycm9yOworCisgIHJldHVybiBUUlVFOworZXJyb3I6CisgIGdfb2JqZWN0X3VucmVmIChpdGVyLT5waXBlbGluZSk7CisgIGl0ZXItPnBpcGVsaW5lID0gTlVMTDsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfbWF5X2FkdmFuY2UgKEdzdEdka0FuaW1hdGlvbkl0ZXIgKiBpdGVyKQoreworICBHc3RGb3JtYXQgYnl0ZXMgPSBHU1RfRk9STUFUX0JZVEVTOworICBnaW50NjQgb2Zmc2V0OworICBnaW50NjQgZGF0YV9hbW91bnQ7CisKKyAgaWYgKGl0ZXItPmFuaS0+dGVtcF9mZCA9PSAwIHx8IGl0ZXItPmFuaS0+dGVtcF9sb2NhdGlvbiA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGRhdGFfYW1vdW50ID0gbHNlZWsgKGl0ZXItPmFuaS0+dGVtcF9mZCwgMCwgU0VFS19DVVIpOworICBnX2Fzc2VydCAoZGF0YV9hbW91bnQgPj0gMCk7CisgIGlmICghZ3N0X2VsZW1lbnRfcXVlcnkgKGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKGl0ZXItPnBpcGVsaW5lKSwKKyAgICAgICAgICAgICAgInNvdXJjZSIpLCBHU1RfUVVFUllfUE9TSVRJT04sICZieXRlcywgJm9mZnNldCkpCisgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgIGlmIChkYXRhX2Ftb3VudCAtIG9mZnNldCA+IEdTVF9HREtfQlVGRkVSX1NJWkUpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9nZGtfYW5pbWF0aW9uX2dldF9tb3JlX2J1ZmZlcnMgKEdzdEdka0FuaW1hdGlvbkl0ZXIgKiBpdGVyKQoreworICBHc3RCdWZmZXIgKmxhc3QgPSBnX3F1ZXVlX3BlZWtfdGFpbCAoaXRlci0+YnVmZmVycyk7CisKKyAgZG8geworICAgIEdTVF9MT0dfT0JKRUNUIChpdGVyLCAiaXRlcmF0aW5nLi4uIik7CisgICAgaWYgKCFnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX21heV9hZHZhbmNlIChpdGVyKSkgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKGl0ZXIsICJubyBtb3JlIGRhdGEgYXZhaWxhYmxlIik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFnc3RfYmluX2l0ZXJhdGUgKEdTVF9CSU4gKGl0ZXItPnBpcGVsaW5lKSkpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChpdGVyLCAiaXRlcmF0aW5nIGRvbmUsIHNldHRpbmcgRU9TIik7CisgICAgICBpdGVyLT5lb3MgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICB9IHdoaWxlIChsYXN0ID09IGdfcXVldWVfcGVla190YWlsIChpdGVyLT5idWZmZXJzKSk7CisgIHJldHVybiBsYXN0ICE9IGdfcXVldWVfcGVla190YWlsIChpdGVyLT5idWZmZXJzKTsKK30KKworc3RhdGljIHZvaWQKK3BpeGJ1Zl9kZXN0cm95X25vdGlmeSAoZ3VjaGFyICogcGl4ZWxzLCBncG9pbnRlciBkYXRhKQoreworICBHU1RfTE9HICgidW5yZWZmaW5nIGJ1ZmZlciAlcCBiZWNhdXNlIHBpeGJ1ZiB3YXMgZGVzdHJveWVkIiwgZGF0YSk7CisgIGdzdF9kYXRhX3VucmVmIChHU1RfREFUQSAoZGF0YSkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2dka19hbmltYXRpb25faXRlcl9jcmVhdGVfcGl4YnVmIChHc3RHZGtBbmltYXRpb25JdGVyICogaXRlcikKK3sKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdEdka0FuaW1hdGlvbiAqYW5pID0gaXRlci0+YW5pOworCisgIGJ1ZiA9IGdfcXVldWVfcG9wX2hlYWQgKGl0ZXItPmJ1ZmZlcnMpOworICBnX2Fzc2VydCAoYnVmKTsKKyAgaWYgKGl0ZXItPnBpeGJ1ZikgeworICAgIEdTVF9MT0dfT0JKRUNUIChpdGVyLCAidW5yZWZmaW5nIHBpeGJ1ZiAlcCIsIGl0ZXItPnBpeGJ1Zik7CisgICAgZ19vYmplY3RfdW5yZWYgKGl0ZXItPnBpeGJ1Zik7CisgIH0KKyAgaWYgKGFuaS0+d2lkdGggPT0gMCkgeworICAgIEdzdFBhZCAqcGFkOworICAgIEdzdENhcHMgKmNhcHM7CisgICAgR3N0RWxlbWVudCAqZmFrZXNpbmsgPQorICAgICAgICBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChpdGVyLT5waXBlbGluZSksICJzaW5rIik7CisgICAgZ19hc3NlcnQgKGZha2VzaW5rKTsKKyAgICBwYWQgPSBnc3RfZWxlbWVudF9nZXRfcGFkIChmYWtlc2luaywgInNpbmsiKTsKKyAgICBnX2Fzc2VydCAocGFkKTsKKyAgICBjYXBzID0gZ3N0X3BhZF9nZXRfbmVnb3RpYXRlZF9jYXBzIChwYWQpOworICAgIGdfYXNzZXJ0IChjYXBzKTsKKyAgICBnX2Fzc2VydCAoR1NUX0NBUFNfSVNfRklYRUQgKGNhcHMpKTsKKyAgICBnX2Fzc2VydCAoZ3N0X2NhcHNfaGFzX2ZpeGVkX3Byb3BlcnR5IChjYXBzLCAiYnBwIikgJiYKKyAgICAgICAgZ3N0X2NhcHNfaGFzX2ZpeGVkX3Byb3BlcnR5IChjYXBzLCAid2lkdGgiKSAmJgorICAgICAgICBnc3RfY2Fwc19oYXNfZml4ZWRfcHJvcGVydHkgKGNhcHMsICJoZWlnaHQiKSk7CisgICAgZ3N0X2NhcHNfZ2V0X2ludCAoY2FwcywgIndpZHRoIiwgJmFuaS0+d2lkdGgpOworICAgIGdzdF9jYXBzX2dldF9pbnQgKGNhcHMsICJoZWlnaHQiLCAmYW5pLT5oZWlnaHQpOworICAgIGdzdF9jYXBzX2dldF9pbnQgKGNhcHMsICJicHAiLCAmYW5pLT5icHApOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFuaSwgImZvdW5kIGZvcm1hdCAod2lkdGggJWQsIGhlaWdodCAlZCwgYnBwICVkKSIsCisgICAgICAgIGFuaS0+d2lkdGgsIGFuaS0+aGVpZ2h0LCBhbmktPmJwcCk7CisgIH0KKyAgZ19hc3NlcnQgKEdTVF9CVUZGRVJfU0laRSAoYnVmKSA9PSBhbmktPndpZHRoICogYW5pLT5oZWlnaHQgKiBhbmktPmJwcCAvIDgpOworICBpZiAoYW5pLT5icHAgPT0gMzIpIHsKKyAgICBnaW50IGk7CisgICAgZ3VpbnQzMiAqZGF0YSA9IChndWludDMyICopIEdTVF9CVUZGRVJfREFUQSAoYnVmKTsKKworICAgIC8qIGVuc3VyZSBvcGFjaXR5ICovCisgICAgZm9yIChpID0gMDsgaSA8IGFuaS0+d2lkdGggKiBhbmktPmhlaWdodDsgaSsrKSB7CisgICAgICBkYXRhW2ldIHw9IDB4RkYwMDAwMDA7CisgICAgfQorICB9CisgIGl0ZXItPnBpeGJ1ZiA9IGdka19waXhidWZfbmV3X2Zyb21fZGF0YSAoR1NUX0JVRkZFUl9EQVRBIChidWYpLAorICAgICAgR0RLX0NPTE9SU1BBQ0VfUkdCLCBhbmktPmJwcCA9PSAzMiwgOCwgYW5pLT53aWR0aCwgYW5pLT5oZWlnaHQsCisgICAgICBhbmktPndpZHRoICogYW5pLT5icHAgLyA4LCBwaXhidWZfZGVzdHJveV9ub3RpZnksIGJ1Zik7CisgIEdTVF9MT0dfT0JKRUNUIChpdGVyLCAiY3JlYXRlZCBwaXhidWYgJXAgZnJvbSBidWZmZXIgJXAgKHJlZmNvdW50ICVkKSIsCisgICAgICBpdGVyLT5waXhidWYsIGJ1ZiwgR1NUX0RBVEFfUkVGQ09VTlRfVkFMVUUgKGJ1ZikpOworfQorCitzdGF0aWMgR2RrUGl4YnVmQW5pbWF0aW9uSXRlciAqCitnc3RfZ2RrX2FuaW1hdGlvbl9nZXRfaXRlciAoR2RrUGl4YnVmQW5pbWF0aW9uICogYW5pbSwKKyAgICBjb25zdCBHVGltZVZhbCAqIHN0YXJ0X3RpbWUpCit7CisgIEdzdEdka0FuaW1hdGlvbiAqYW5pID0gR1NUX0dES19BTklNQVRJT04gKGFuaW0pOworICBHc3RHZGtBbmltYXRpb25JdGVyICppdGVyOworCisgIGlmIChhbmktPnRlbXBfZmQgIT0gMCAmJiBhbmktPnRlbXBfbG9jYXRpb24gIT0gTlVMTCAmJgorICAgICAgbHNlZWsgKGFuaS0+dGVtcF9mZCwgMCwgU0VFS19DVVIpIDwgR1NUX0dES19CVUZGRVJfU0laRSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFuaSwgIk5vdCBlbm91Z2ggZGF0YSB0byBjcmVhdGUgaXRlcmF0b3IuIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpdGVyID0gZ19vYmplY3RfbmV3IChHU1RfVFlQRV9HREtfQU5JTUFUSU9OX0lURVIsIE5VTEwpOworCisgIGl0ZXItPnN0YXJ0ID0gKnN0YXJ0X3RpbWU7CisKKyAgaXRlci0+YW5pID0gYW5pOworICBnX29iamVjdF9yZWYgKGFuaSk7CisgIGlmICghZ3N0X2dka19hbmltYXRpb25faXRlcl9jcmVhdGVfcGlwZWxpbmUgKGl0ZXIpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKCFnc3RfZ2RrX2FuaW1hdGlvbl9nZXRfbW9yZV9idWZmZXJzIChpdGVyKSkKKyAgICBnb3RvIGVycm9yOworCisgIGdzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfY3JlYXRlX3BpeGJ1ZiAoaXRlcik7CisKKyAgcmV0dXJuIEdES19QSVhCVUZfQU5JTUFUSU9OX0lURVIgKGl0ZXIpOworCitlcnJvcjoKKyAgZ19vYmplY3RfdW5yZWYgKGl0ZXIpOworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX2FkdmFuY2UgKEdka1BpeGJ1ZkFuaW1hdGlvbkl0ZXIgKiBhbmltX2l0ZXIsCisgICAgY29uc3QgR1RpbWVWYWwgKiBjdXJyZW50X3RpbWUpCit7CisgIEdzdENsb2NrVGltZSBvZmZzZXQ7CisgIEdzdEJ1ZmZlciAqYnVmZmVyID0gTlVMTDsKKyAgR3N0R2RrQW5pbWF0aW9uSXRlciAqaXRlciA9IEdTVF9HREtfQU5JTUFUSU9OX0lURVIgKGFuaW1faXRlcik7CisKKyAgLyogY29tcHV0ZSB0aW1lc3RhbXAgdGhhdCBuZXh0IGJ1ZmZlciBtdXN0IG1hdGNoICovCisgIG9mZnNldCA9CisgICAgICAoKEdzdENsb2NrVGltZSkgY3VycmVudF90aW1lLT50dl9zZWMgLSBpdGVyLT5zdGFydC50dl9zZWMpICogR1NUX1NFQ09ORDsKKyAgaWYgKGl0ZXItPnN0YXJ0LnR2X3VzZWMgPiBjdXJyZW50X3RpbWUtPnR2X3VzZWMpIHsKKyAgICBvZmZzZXQgLT0KKyAgICAgICAgKChHc3RDbG9ja1RpbWUpIGl0ZXItPnN0YXJ0LnR2X3VzZWMgLQorICAgICAgICBjdXJyZW50X3RpbWUtPnR2X3VzZWMpICogR1NUX1NFQ09ORCAvIEdfVVNFQ19QRVJfU0VDOworICB9IGVsc2UgeworICAgIG9mZnNldCArPQorICAgICAgICAoKEdzdENsb2NrVGltZSkgY3VycmVudF90aW1lLT50dl91c2VjIC0KKyAgICAgICAgaXRlci0+c3RhcnQudHZfdXNlYykgKiBHU1RfU0VDT05EIC8gR19VU0VDX1BFUl9TRUM7CisgIH0KKyAgR1NUX0RFQlVHX09CSkVDVCAoaXRlciwKKyAgICAgICJhZHZhbmNpbmcgdG8gJWxkOiVsZCAoc3RhcnRlZCBhdCAlbGQ6JWxkKSBuZWVkIG9mZnNldCAlIgorICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgY3VycmVudF90aW1lLT50dl9zZWMsIGN1cnJlbnRfdGltZS0+dHZfdXNlYywKKyAgICAgIGl0ZXItPnN0YXJ0LnR2X3NlYywgaXRlci0+c3RhcnQudHZfdXNlYywgb2Zmc2V0KTsKKyAgaWYgKCFpdGVyLT5qdXN0X3NlZWtlZAorICAgICAgJiYgb2Zmc2V0IC0gaXRlci0+bGFzdF90aW1lc3RhbXAgPiBHU1RfR0RLX01BWF9ERUxBWV9UT19TRUVLKSB7CisgICAgR1NUX0lORk9fT0JKRUNUIChpdGVyLAorICAgICAgICAiY3VycmVudCBwaXBlbGluZSB0aW1lc3RhbXAgaXMgdG9vIG9sZCAoJSIgR19HVUlOVDY0X0ZPUk1BVCAiIHZzICUiCisgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIiksIHNlZWtpbmcgdGhlcmUiLCBpdGVyLT5sYXN0X3RpbWVzdGFtcCwgb2Zmc2V0KTsKKyAgICBpZiAoZ3N0X2VsZW1lbnRfc2VuZF9ldmVudCAoZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAoaXRlci0+cGlwZWxpbmUpLAorICAgICAgICAgICAgICAgICJzaW5rIiksCisgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X3NlZWsgKEdTVF9GT1JNQVRfVElNRSB8IEdTVF9TRUVLX01FVEhPRF9TRVQgfAorICAgICAgICAgICAgICAgIEdTVF9TRUVLX0ZMQUdfRkxVU0ggfCBHU1RfU0VFS19GTEFHX0FDQ1VSQVRFLCBvZmZzZXQpKSkgeworICAgICAgaXRlci0+bGFzdF90aW1lc3RhbXAgPSBvZmZzZXQ7CisgICAgICBpdGVyLT5qdXN0X3NlZWtlZCA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoaXRlciwKKyAgICAgICAgICAic2VlayB0byAlIiBHX0dVSU5UNjRfRk9STUFUICIgZGlkbid0IHdvcmsuIEl0ZXJhdGluZyB0aGVyZS4uLiIsCisgICAgICAgICAgb2Zmc2V0KTsKKyAgICB9CisgIH0gZWxzZSBpZiAoaXRlci0+anVzdF9zZWVrZWQpIHsKKyAgICBpdGVyLT5qdXN0X3NlZWtlZCA9IEZBTFNFOworICB9CisKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBpZiAoZ19xdWV1ZV9pc19lbXB0eSAoaXRlci0+YnVmZmVycykpIHsKKyAgICAgIGlmIChpdGVyLT5lb3MpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGlmIChnc3RfZ2RrX2FuaW1hdGlvbl9nZXRfbW9yZV9idWZmZXJzIChpdGVyKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChnX3F1ZXVlX3BlZWtfaGVhZCAoaXRlci0+YnVmZmVycykpID4gb2Zmc2V0KQorICAgICAgYnJlYWs7CisgICAgaWYgKGJ1ZmZlcikgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKGl0ZXIsICJ1bnJlZmZpbmcgYnVmZmVyICVwLCBiZWNhdXNlIHRpbWVzdGFtcCB0b28gbG93ICglIgorICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIiB2cyAlIiBHX0dVSU5UNjRfRk9STUFUICIpIiwKKyAgICAgICAgICBidWZmZXIsIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpLCBvZmZzZXQpOworICAgICAgZ3N0X2RhdGFfdW5yZWYgKEdTVF9EQVRBIChidWZmZXIpKTsKKyAgICB9CisgICAgYnVmZmVyID0gR1NUX0JVRkZFUiAoZ19xdWV1ZV9wb3BfaGVhZCAoaXRlci0+YnVmZmVycykpOworICB9CisgIGlmICghYnVmZmVyKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpIDwgaXRlci0+bGFzdF90aW1lc3RhbXApIHsKKyAgICBnc3RfZGF0YV91bnJlZiAoR1NUX0RBVEEgKGJ1ZmZlcikpOworICAgIGl0ZXItPmxhc3RfdGltZXN0YW1wID0gb2Zmc2V0OworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpdGVyLT5sYXN0X3RpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpOworICBnX3F1ZXVlX3B1c2hfaGVhZCAoaXRlci0+YnVmZmVycywgYnVmZmVyKTsKKyAgZ3N0X2dka19hbmltYXRpb25faXRlcl9jcmVhdGVfcGl4YnVmIChpdGVyKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnaW50Citnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX2dldF9kZWxheV90aW1lIChHZGtQaXhidWZBbmltYXRpb25JdGVyICogYW5pbV9pdGVyKQoreworICBnaW50IGRlbGF5OworICBHc3RHZGtBbmltYXRpb25JdGVyICppdGVyID0gR1NUX0dES19BTklNQVRJT05fSVRFUiAoYW5pbV9pdGVyKTsKKworICB3aGlsZSAoZ19xdWV1ZV9pc19lbXB0eSAoaXRlci0+YnVmZmVycykpIHsKKyAgICBpZiAoaXRlci0+ZW9zKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAoaXRlciwgInJldHVybmluZyBkZWxheSBvZiBpbmZpbml0ZSwgd2UncmUgRU9TIik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghZ3N0X2dka19hbmltYXRpb25fZ2V0X21vcmVfYnVmZmVycyAoaXRlcikpCisgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgIC8qIEZJWE1FPyAqLworICB9CisKKyAgZGVsYXkgPQorICAgICAgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChnX3F1ZXVlX3BlZWtfaGVhZCAoaXRlci0+YnVmZmVycykpIC0KKyAgICAgIGl0ZXItPmxhc3RfdGltZXN0YW1wKSAqIDEwMDAgLyBHU1RfU0VDT05EOworICBHU1RfTE9HX09CSkVDVCAoaXRlciwgInJldHVybmluZyBkZWxheSBvZiAlZCBtcyIsIGRlbGF5KTsKKyAgcmV0dXJuIGRlbGF5OworfQorCitHZGtQaXhidWYgKgorZ3N0X2dka19hbmltYXRpb25faXRlcl9nZXRfcGl4YnVmIChHZGtQaXhidWZBbmltYXRpb25JdGVyICogYW5pbV9pdGVyKQoreworICBHc3RHZGtBbmltYXRpb25JdGVyICppdGVyID0gR1NUX0dES19BTklNQVRJT05fSVRFUiAoYW5pbV9pdGVyKTsKKworICBHU1RfTE9HX09CSkVDVCAoaXRlciwgInJldHVybmluZyBwaXhidWYgJXAiLCBpdGVyLT5waXhidWYpOworICByZXR1cm4gaXRlci0+cGl4YnVmOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfb25fY3VycmVudGx5X2xvYWRpbmdfZnJhbWUgKEdka1BpeGJ1ZkFuaW1hdGlvbkl0ZXIgKgorICAgIGFuaW1faXRlcikKK3sKKyAgR3N0R2RrQW5pbWF0aW9uSXRlciAqaXRlciA9IEdTVF9HREtfQU5JTUFUSU9OX0lURVIgKGFuaW1faXRlcik7CisKKyAgLyogRU9TIC0gbGFzdCBmcmFtZSAqLworICBpZiAoaXRlci0+ZW9zICYmIGdfcXVldWVfaXNfZW1wdHkgKGl0ZXItPmJ1ZmZlcnMpKQorICAgIHJldHVybiBUUlVFOworCisgIC8qIGNhbid0IGxvYWQgbW9yZSBmcmFtZXMgKi8KKyAgaWYgKCFnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX21heV9hZHZhbmNlIChpdGVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHZGtQaXhidWYgKgorZ3N0X2dka19hbmltYXRpb25fZ2V0X3N0YXRpY19pbWFnZSAoR2RrUGl4YnVmQW5pbWF0aW9uICogYW5pbWF0aW9uKQoreworICBHc3RHZGtBbmltYXRpb24gKmFuaSA9IEdTVF9HREtfQU5JTUFUSU9OIChhbmltYXRpb24pOworICBHVGltZVZhbCB0djsKKyAgR3N0R2RrQW5pbWF0aW9uSXRlciAqaXRlcjsKKworICBpZiAoIWFuaS0+cGl4YnVmKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGFuaSwgInRyeWluZyB0byBjcmVhdGUgcGl4YnVmIik7CisgICAgZ19nZXRfY3VycmVudF90aW1lICgmdHYpOworICAgIGl0ZXIgPQorICAgICAgICBHU1RfR0RLX0FOSU1BVElPTl9JVEVSIChnZGtfcGl4YnVmX2FuaW1hdGlvbl9nZXRfaXRlciAoYW5pbWF0aW9uLCAmdHYpKTsKKyAgICBpZiAoaXRlcikgeworICAgICAgZ3VpbnQ2NCBvZmZzZXQ7CisgICAgICBHc3RCdWZmZXIgKmJ1ZjsKKyAgICAgIEdzdEZvcm1hdCB0aW1lID0gR1NUX0ZPUk1BVF9USU1FOworCisgICAgICBpZiAoIWdzdF9lbGVtZW50X3F1ZXJ5IChnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChpdGVyLT5waXBlbGluZSksCisgICAgICAgICAgICAgICAgICAic2luayIpLCBHU1RfUVVFUllfVE9UQUwsICZ0aW1lLCAmb2Zmc2V0KSkgeworICAgICAgICBvZmZzZXQgPSAwOworICAgICAgfQorICAgICAgaWYgKG9mZnNldCA+IDEyMCAqIEdTVF9TRUNPTkQpIHsKKyAgICAgICAgb2Zmc2V0ID0gMTIwICogR1NUX1NFQ09ORDsKKyAgICAgIH0gZWxzZSBpZiAob2Zmc2V0IDwgMTIwICogR1NUX1NFQ09ORCAmJiBvZmZzZXQgPj0gMTAgKiBHU1RfU0VDT05EKSB7CisgICAgICAgIG9mZnNldCA9IG9mZnNldCAvIDI7CisgICAgICB9CisgICAgICBnX2Fzc2VydCAodGltZSA9PSBHU1RfRk9STUFUX1RJTUUpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKGFuaSwKKyAgICAgICAgICAidXNpbmcgdGltZSBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCAiIGZvciBjcmVhdGluZyBzdGF0aWMgaW1hZ2UiLAorICAgICAgICAgIG9mZnNldCk7CisgICAgICB3aGlsZSAoKGJ1ZiA9IGdfcXVldWVfcG9wX2hlYWQgKGl0ZXItPmJ1ZmZlcnMpKSAhPSBOVUxMKSB7CisgICAgICAgIGdzdF9kYXRhX3VucmVmIChHU1RfREFUQSAoYnVmKSk7CisgICAgICB9CisgICAgICAvKiBub3cgd2UgZG8gZXZpbCBzdHVmZiwgYmUgc3VyZSB0byBnZXQgcmlkIG9mIHRoZSBpdGVyYXRvciBhZnRlcndhcmRzICovCisgICAgICBpZiAoIWdzdF9lbGVtZW50X3NlbmRfZXZlbnQgKGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4KKyAgICAgICAgICAgICAgICAgIChpdGVyLT5waXBlbGluZSksICJzaW5rIiksCisgICAgICAgICAgICAgIGdzdF9ldmVudF9uZXdfc2VlayAoR1NUX0ZPUk1BVF9USU1FIHwgR1NUX1NFRUtfTUVUSE9EX1NFVCB8CisgICAgICAgICAgICAgICAgICBHU1RfU0VFS19GTEFHX0ZMVVNIIHwgR1NUX1NFRUtfRkxBR19BQ0NVUkFURSwgb2Zmc2V0KSkpIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChhbmksICJzZWVraW5nIGRpZG4ndCB3b3JrLiBVc2luZyBuZXh0IGltYWdlIik7CisgICAgICB9CisKKyAgICAgIGRvIHsKKyAgICAgICAgaWYgKGdfcXVldWVfaXNfZW1wdHkgKGl0ZXItPmJ1ZmZlcnMpKSB7CisgICAgICAgICAgaWYgKGl0ZXItPmVvcykKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICBpZiAoZ3N0X2dka19hbmltYXRpb25fZ2V0X21vcmVfYnVmZmVycyAoaXRlcikpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoRkFMU0UpOworICAgICAgaWYgKCFnX3F1ZXVlX2lzX2VtcHR5IChpdGVyLT5idWZmZXJzKSkgeworICAgICAgICBnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX2NyZWF0ZV9waXhidWYgKGl0ZXIpOworICAgICAgICBhbmktPnBpeGJ1ZiA9CisgICAgICAgICAgICBnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX2dldF9waXhidWYgKEdES19QSVhCVUZfQU5JTUFUSU9OX0lURVIKKyAgICAgICAgICAgIChpdGVyKSk7CisgICAgICAgIGdfb2JqZWN0X3JlZiAoYW5pLT5waXhidWYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ19hc3NlcnQgKGFuaS0+cGl4YnVmID09IE5VTEwpOworICAgICAgfQorICAgICAgLyogRGlFIGl0ZXJhdG9yLCBEaUUgKi8KKyAgICAgIGdfb2JqZWN0X3VucmVmIChpdGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYW5pLCAiQ291bGQgbm90IGdldCBhbiBpdGVyYXRvci4gTm8gcGl4YnVmIGF2YWlsYWJsZSIpOworICAgIH0KKyAgfQorICBHU1RfTE9HX09CSkVDVCAoYW5pLCAiUmV0dXJuaW5nIHBpeGJ1ZiAlcFxuIiwgYW5pLT5waXhidWYpOworICByZXR1cm4gYW5pLT5waXhidWY7Cit9CmRpZmYgLS1naXQgYS9leHQvZ2RrX3BpeGJ1Zi9nc3RnZGthbmltYXRpb24uaCBiL2V4dC9nZGtfcGl4YnVmL2dzdGdka2FuaW1hdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NTg0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZ2RrX3BpeGJ1Zi9nc3RnZGthbmltYXRpb24uaApAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBCZW5qYW1pbiBPdHRlIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0xPQURFUl9IX18KKyNkZWZpbmUgX19HU1RfTE9BREVSX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdkay1waXhidWYvZ2RrLXBpeGJ1Zi5oPgorI2luY2x1ZGUgPGdkay1waXhidWYvZ2RrLXBpeGJ1Zi1hbmltYXRpb24uaD4KKyNpbmNsdWRlIDxnZGstcGl4YnVmL2dkay1waXhidWYtaW8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qIGhvdyBtYW55IGJ5dGVzIHdlIG5lZWQgdG8gaGF2ZSBhdmFpbGFibGUgYmVmb3JlIHdlIGRhcmUgdG8gc3RhcnQgYSBuZXcgaXRlcmF0aW9uICovCisjZGVmaW5lIEdTVF9HREtfQlVGRkVSX1NJWkUgKDEwMjQwMCkKKy8qIGhvdyBmYXIgYmVoaW5kIHdlIG5lZWQgdG8gYmUgYmVmb3JlIHdlIGF0dGVtcHQgdG8gc2VlayAqLworI2RlZmluZSBHU1RfR0RLX01BWF9ERUxBWV9UT19TRUVLIChHU1RfU0VDT05EIC8gNCkKKworCisjZGVmaW5lIEdTVF9UWVBFX0dES19BTklNQVRJT04gICAgICAgICAgICAgICAgICAoZ3N0X2dka19hbmltYXRpb25fZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0dES19BTklNQVRJT04ob2JqKSAgICAgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9HREtfQU5JTUFUSU9OLEdzdEdka0FuaW1hdGlvbikpCisjZGVmaW5lIEdTVF9HREtfQU5JTUFUSU9OX0NMQVNTKGtsYXNzKSAgICAgICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9HREtfQU5JTUFUSU9OLEdzdEdka0FuaW1hdGlvbkNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0dES19BTklNQVRJT04ob2JqKSAgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9HREtfQU5JTUFUSU9OKSkKKyNkZWZpbmUgR1NUX0lTX0dES19BTklNQVRJT05fQ0xBU1Moa2xhc3MpICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0dES19BTklNQVRJT04pKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0R2RrQW5pbWF0aW9uICAgICAgR3N0R2RrQW5pbWF0aW9uOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEdka0FuaW1hdGlvbkNsYXNzIEdzdEdka0FuaW1hdGlvbkNsYXNzOworCit0eXBlZGVmIHN0cnVjdCBfR3N0R2RrQW5pbWF0aW9uSXRlciBHc3RHZGtBbmltYXRpb25JdGVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEdka0FuaW1hdGlvbkl0ZXJDbGFzcyBHc3RHZGtBbmltYXRpb25JdGVyQ2xhc3M7CisKK3N0cnVjdCBfR3N0R2RrQW5pbWF0aW9uCit7CisgIEdka1BpeGJ1ZkFuaW1hdGlvbiAgICAgICAgICAgIHBhcmVudDsKKworICAvKiBuYW1lIG9mIHRlbXBvcmFyeSBidWZmZXIgZmlsZSAqLworICBnY2hhciAqICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX2xvY2F0aW9uOworICAvKiBmaWxlIGRlc2NyaXB0b3IgdG8gdGVtcG9yYXJ5IGZpbGUgb3IgMCBpZiB3ZSdyZSBkb25lIHdyaXRpbmcgKi8KKyAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcF9mZDsKKworICAvKiBzaXplIG9mIGltYWdlICovCisgIGdpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOworICBnaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ7CisgIGdpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGJwcDsKKyAgLyogc3RhdGljIGltYWdlIHdlIHVzZSAqLworICBHZGtQaXhidWYgKiAgICAgICAgICAgICAgICAgICBwaXhidWY7Cit9OworCitzdHJ1Y3QgX0dzdEdka0FuaW1hdGlvbkNsYXNzIAoreworICBHZGtQaXhidWZBbmltYXRpb25DbGFzcyAgICAgICBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSAgICAgICAgICAgICAgICAgICBnc3RfZ2RrX2FuaW1hdGlvbl9nZXRfdHlwZSAgICAgICh2b2lkKTsKKworR3N0R2RrQW5pbWF0aW9uICogICAgICAgZ3N0X2dka19hbmltYXRpb25fbmV3ICAgICAgICAgICAoR0Vycm9yICoqZXJyb3IpOworCitnYm9vbGVhbiAgICAgICAgICAgICAgICBnc3RfZ2RrX2FuaW1hdGlvbl9hZGRfZGF0YSAgICAgIChHc3RHZGtBbmltYXRpb24gKiAgICAgIGFuaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50OCAqICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50ICAgICAgICAgICAgICAgICAgc2l6ZSk7Cit2b2lkICAgICAgICAgICAgICAgICAgICBnc3RfZ2RrX2FuaW1hdGlvbl9kb25lX2FkZGluZyAgIChHc3RHZGtBbmltYXRpb24gKiAgICAgIGFuaSk7CisKKworI2RlZmluZSBHU1RfVFlQRV9HREtfQU5JTUFUSU9OX0lURVIgICAgICAgICAgICAgKGdzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9HREtfQU5JTUFUSU9OX0lURVIob2JqZWN0KSAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmplY3QpLCBHU1RfVFlQRV9HREtfQU5JTUFUSU9OX0lURVIsIEdzdEdka0FuaW1hdGlvbkl0ZXIpKQorI2RlZmluZSBHU1RfSVNfR0RLX0FOSU1BVElPTl9JVEVSKG9iamVjdCkgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqZWN0KSwgR1NUX1RZUEVfR0RLX0FOSU1BVElPTl9JVEVSKSkKKworI2RlZmluZSBHU1RfR0RLX0FOSU1BVElPTl9JVEVSX0NMQVNTKGtsYXNzKSAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9HREtfQU5JTUFUSU9OX0lURVIsIEdzdEdka0FuaW1hdGlvbkl0ZXJDbGFzcykpCisjZGVmaW5lIEdTVF9JU19HREtfQU5JTUFUSU9OX0lURVJfQ0xBU1Moa2xhc3MpICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX0dES19BTklNQVRJT05fSVRFUikpCisjZGVmaW5lIEdTVF9HREtfQU5JTUFUSU9OX0lURVJfR0VUX0NMQVNTKG9iaikgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIEdTVF9UWVBFX0dES19BTklNQVRJT05fSVRFUiwgR3N0R2RrQW5pbWF0aW9uSXRlckNsYXNzKSkKKworc3RydWN0IF9Hc3RHZGtBbmltYXRpb25JdGVyIHsKKyAgR2RrUGl4YnVmQW5pbWF0aW9uSXRlciAgICAgICAgcGFyZW50OworICAgICAgICAKKyAgLyogb3VyIGFuaW1hdGlvbiAqLworICBHc3RHZGtBbmltYXRpb24gKiAgICAgICAgICAgICBhbmk7CisgIC8qIHN0YXJ0IHRpbWV2YWwgKi8KKyAgR1RpbWVWYWwgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ7CisgIC8qIHRpbWVzdGFtcCBvZiBsYXN0IGJ1ZmZlciAqLworICBHc3RDbG9ja1RpbWUgICAgICAgICAgICAgICAgICBsYXN0X3RpbWVzdGFtcDsKKyAgCisgIC8qIHBpcGVsaW5lIHdlJ3JlIHVzaW5nICovCisgIEdzdEVsZW1lbnQgKiAgICAgICAgICAgICAgICAgIHBpcGVsaW5lOworICBnYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICBlb3M7CisgIGdib29sZWFuICAgICAgICAgICAgICAgICAgICAgIGp1c3Rfc2Vla2VkOworICAKKyAgLyogY3VycmVudCBpbWFnZSBhbmQgdGhlIGJ1ZmZlcnMgY29udGFpbmluZyB0aGUgZGF0YSAqLworICBHZGtQaXhidWYgKiAgICAgICAgICAgICAgICAgICBwaXhidWY7CisgIEdRdWV1ZSAqICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnM7Cit9OworCitzdHJ1Y3QgX0dzdEdka0FuaW1hdGlvbkl0ZXJDbGFzcyB7CisgIEdka1BpeGJ1ZkFuaW1hdGlvbkl0ZXJDbGFzcyAgIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfZ2V0X3R5cGUgKHZvaWQpIEdfR05VQ19DT05TVDsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0dES19BTklNQVRJT05fSF9fICovCmRpZmYgLS1naXQgYS9leHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZkZWMuYyBiL2V4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MjExYmYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZkZWMuYwpAQCAtMCwwICsxLDU2MiBAQAorLyogR1N0cmVhbWVyIEdka1BpeGJ1Zi1iYXNlZCBpbWFnZSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSAyMDAzIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnZGstcGl4YnVmL2dkay1waXhidWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdGdka3BpeGJ1ZmRlYy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnZGtwaXhidWZkZWNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ2RrcGl4YnVmZGVjX2RlYnVnCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfZ2RrX3BpeGJ1Zl9kZWNfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiaW1hZ2UvcG5nOyAiCisgICAgICAgIC8qICJpbWFnZS9qcGVnOyAiIGRpc2FibGVkIGJlY2F1c2Ugd2UgY2FuJ3QgaGFuZGxlIE1KUEVHICovCisgICAgICAgIC8qImltYWdlL2dpZjsgIiBkaXNhYmxlZCBiZWNhdXNlIHdlIGNhbid0IGhhbmRsZSBhbmltYXRlZCBnaWZzICovCisgICAgICAgICJpbWFnZS94LWljb247ICIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtbmF2aS1hbmltYXRpb247ICIKKyAgICAgICAgImltYWdlL3gtY211LXJhc3RlcjsgIgorICAgICAgICAiaW1hZ2UveC1zdW4tcmFzdGVyOyAiCisgICAgICAgICJpbWFnZS94LXBpeG1hcDsgIgorICAgICAgICAiaW1hZ2UvdGlmZjsgIgorICAgICAgICAiaW1hZ2UveC1wb3J0YWJsZS1hbnltYXA7ICIKKyAgICAgICAgImltYWdlL3gtcG9ydGFibGUtYml0bWFwOyAiCisgICAgICAgICJpbWFnZS94LXBvcnRhYmxlLWdyYXltYXA7ICIKKyAgICAgICAgImltYWdlL3gtcG9ydGFibGUtcGl4bWFwOyAiCisgICAgICAgICJpbWFnZS9ibXA7ICIKKyAgICAgICAgImltYWdlL3gtYm1wOyAiCisgICAgICAgICJpbWFnZS94LU1TLWJtcDsgIgorICAgICAgICAiaW1hZ2Uvdm5kLndhcC53Ym1wOyAiICJpbWFnZS94LWJpdG1hcDsgIiAiaW1hZ2UveC10Z2E7ICIKKyAgICAgICAgImltYWdlL3gtcGN4OyBpbWFnZS9zdmc7IGltYWdlL3N2Zyt4bWwiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfZ2RrX3BpeGJ1Zl9kZWNfc3JjX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgiUkdCIikgIjsgIgorICAgICAgICBHU1RfVklERU9fQ0FQU19NQUtFICgiUkdCQSIpKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2dka19waXhidWZfZGVjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfZ2RrX3BpeGJ1Zl9kZWNfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2dka19waXhidWZfZGVjX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCisjZGVmaW5lIGdzdF9nZGtfcGl4YnVmX2RlY19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RHZGtQaXhidWZEZWMsIGdzdF9nZGtfcGl4YnVmX2RlYywgR1NUX1RZUEVfRUxFTUVOVCk7CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2dka19waXhidWZfZGVjX3Npbmtfc2V0Y2FwcyAoR3N0R2RrUGl4YnVmRGVjICogZmlsdGVyLCBHc3RDYXBzICogY2FwcykKK3sKKyAgY29uc3QgR1ZhbHVlICpmcmFtZXJhdGU7CisgIEdzdFN0cnVjdHVyZSAqczsKKworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKChmcmFtZXJhdGUgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgImZyYW1lcmF0ZSIpKSAhPSBOVUxMKSB7CisgICAgZmlsdGVyLT5pbl9mcHNfbiA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fbnVtZXJhdG9yIChmcmFtZXJhdGUpOworICAgIGZpbHRlci0+aW5fZnBzX2QgPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX2Rlbm9taW5hdG9yIChmcmFtZXJhdGUpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwgImdvdCBmcmFtZXJhdGUgb2YgJWQvJWQgZnBzID0+IHBhY2tldGl6ZWQgbW9kZSIsCisgICAgICAgIGZpbHRlci0+aW5fZnBzX24sIGZpbHRlci0+aW5fZnBzX2QpOworICB9IGVsc2UgeworICAgIGZpbHRlci0+aW5fZnBzX24gPSAwOworICAgIGZpbHRlci0+aW5fZnBzX2QgPSAxOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwgIm5vIGZyYW1lcmF0ZSwgYXNzdW1pbmcgc2luZ2xlIGltYWdlIik7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X2dka19waXhidWZfZGVjX2dldF9jYXBzbGlzdCAoR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR1NMaXN0ICpzbGlzdDsKKyAgR1NMaXN0ICpzbGlzdDA7CisgIEdzdENhcHMgKmNhcHNsaXN0ID0gTlVMTDsKKyAgR3N0Q2FwcyAqcmV0dXJuX2NhcHMgPSBOVUxMOworICBHc3RDYXBzICp0bXBsX2NhcHM7CisKKyAgY2Fwc2xpc3QgPSBnc3RfY2Fwc19uZXdfZW1wdHkgKCk7CisgIHNsaXN0MCA9IGdka19waXhidWZfZ2V0X2Zvcm1hdHMgKCk7CisKKyAgZm9yIChzbGlzdCA9IHNsaXN0MDsgc2xpc3Q7IHNsaXN0ID0gZ19zbGlzdF9uZXh0IChzbGlzdCkpIHsKKyAgICBHZGtQaXhidWZGb3JtYXQgKnBpeGJ1Zl9mb3JtYXQ7CisgICAgY2hhciAqKm1pbWV0eXBlczsKKyAgICBjaGFyICoqbWltZXR5cGU7CisKKyAgICBwaXhidWZfZm9ybWF0ID0gc2xpc3QtPmRhdGE7CisgICAgbWltZXR5cGVzID0gZ2RrX3BpeGJ1Zl9mb3JtYXRfZ2V0X21pbWVfdHlwZXMgKHBpeGJ1Zl9mb3JtYXQpOworCisgICAgZm9yIChtaW1ldHlwZSA9IG1pbWV0eXBlczsgKm1pbWV0eXBlOyBtaW1ldHlwZSsrKSB7CisgICAgICBnc3RfY2Fwc19hcHBlbmRfc3RydWN0dXJlIChjYXBzbGlzdCwgZ3N0X3N0cnVjdHVyZV9uZXdfZW1wdHkgKCptaW1ldHlwZSkpOworICAgIH0KKyAgICBnX3N0cmZyZWV2IChtaW1ldHlwZXMpOworICB9CisgIGdfc2xpc3RfZnJlZSAoc2xpc3QwKTsKKworICB0bXBsX2NhcHMgPQorICAgICAgZ3N0X3N0YXRpY19jYXBzX2dldCAoJmdzdF9nZGtfcGl4YnVmX2RlY19zaW5rX3RlbXBsYXRlLnN0YXRpY19jYXBzKTsKKyAgcmV0dXJuX2NhcHMgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKGNhcHNsaXN0LCB0bXBsX2NhcHMpOworCisgIGdzdF9jYXBzX3VucmVmICh0bXBsX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwc2xpc3QpOworCisgIGlmIChmaWx0ZXIgJiYgcmV0dXJuX2NhcHMpIHsKKyAgICBHc3RDYXBzICp0ZW1wOworCisgICAgdGVtcCA9IGdzdF9jYXBzX2ludGVyc2VjdCAocmV0dXJuX2NhcHMsIGZpbHRlcik7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHJldHVybl9jYXBzKTsKKyAgICByZXR1cm5fY2FwcyA9IHRlbXA7CisgIH0KKworICByZXR1cm4gcmV0dXJuX2NhcHM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2dka19waXhidWZfZGVjX3NpbmtfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIGdib29sZWFuIHJlczsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKmZpbHRlciwgKmNhcHM7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9jYXBzIChxdWVyeSwgJmZpbHRlcik7CisgICAgICBjYXBzID0gZ3N0X2dka19waXhidWZfZGVjX2dldF9jYXBzbGlzdCAoZmlsdGVyKTsKKyAgICAgIGdzdF9xdWVyeV9zZXRfY2Fwc19yZXN1bHQgKHF1ZXJ5LCBjYXBzKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworCisvKiBpbml0aWFsaXplIHRoZSBwbHVnaW4ncyBjbGFzcyAqLworc3RhdGljIHZvaWQKK2dzdF9nZGtfcGl4YnVmX2RlY19jbGFzc19pbml0IChHc3RHZGtQaXhidWZEZWNDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZ2RrX3BpeGJ1Zl9kZWNfY2hhbmdlX3N0YXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfZ2RrX3BpeGJ1Zl9kZWNfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X2dka19waXhidWZfZGVjX3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIkdka1BpeGJ1ZiBpbWFnZSBkZWNvZGVyIiwgIkNvZGVjL0RlY29kZXIvSW1hZ2UiLAorICAgICAgIkRlY29kZXMgaW1hZ2VzIGluIGEgdmlkZW8gc3RyZWFtIHVzaW5nIEdka1BpeGJ1ZiIsCisgICAgICAiRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+LCBSZW5hdG8gRmlsaG8gPHJlbmF0by5maWxob0BpbmR0Lm9yZy5icj4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ2RrcGl4YnVmZGVjX2RlYnVnLCAiZ2RrcGl4YnVmIiwgMCwKKyAgICAgICJHZGtQaXhidWYgaW1hZ2UgZGVjb2RlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2dka19waXhidWZfZGVjX2luaXQgKEdzdEdka1BpeGJ1ZkRlYyAqIGZpbHRlcikKK3sKKyAgZmlsdGVyLT5zaW5rcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmZ3N0X2dka19waXhidWZfZGVjX3NpbmtfdGVtcGxhdGUsCisgICAgICAic2luayIpOworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAoZmlsdGVyLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9nZGtfcGl4YnVmX2RlY19zaW5rX3F1ZXJ5KSk7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChmaWx0ZXItPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2dka19waXhidWZfZGVjX2NoYWluKSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChmaWx0ZXItPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2dka19waXhidWZfZGVjX3NpbmtfZXZlbnQpKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKGZpbHRlciksIGZpbHRlci0+c2lua3BhZCk7CisKKyAgZmlsdGVyLT5zcmNwYWQgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZnc3RfZ2RrX3BpeGJ1Zl9kZWNfc3JjX3RlbXBsYXRlLAorICAgICAgInNyYyIpOworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChmaWx0ZXItPnNyY3BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChmaWx0ZXIpLCBmaWx0ZXItPnNyY3BhZCk7CisKKyAgZmlsdGVyLT5sYXN0X3RpbWVzdGFtcCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGZpbHRlci0+cGl4YnVmX2xvYWRlciA9IE5VTEw7CisgIGZpbHRlci0+cGFja2V0aXplZCA9IEZBTFNFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9nZGtfcGl4YnVmX2RlY19zZXR1cF9wb29sIChHc3RHZGtQaXhidWZEZWMgKiBmaWx0ZXIsIEdzdFZpZGVvSW5mbyAqIGluZm8pCit7CisgIEdzdENhcHMgKnRhcmdldDsKKyAgR3N0UXVlcnkgKnF1ZXJ5OworICBHc3RCdWZmZXJQb29sICpwb29sOworICBHc3RTdHJ1Y3R1cmUgKmNvbmZpZzsKKyAgZ3VpbnQgc2l6ZSwgbWluLCBtYXg7CisKKyAgdGFyZ2V0ID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChmaWx0ZXItPnNyY3BhZCk7CisgIGlmICghdGFyZ2V0KQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiB0cnkgdG8gZ2V0IGEgYnVmZmVycG9vbCBub3cgKi8KKyAgLyogZmluZCBhIHBvb2wgZm9yIHRoZSBuZWdvdGlhdGVkIGNhcHMgbm93ICovCisgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19hbGxvY2F0aW9uICh0YXJnZXQsIFRSVUUpOworCisgIGlmICghZ3N0X3BhZF9wZWVyX3F1ZXJ5IChmaWx0ZXItPnNyY3BhZCwgcXVlcnkpKSB7CisgICAgLyogbm90IGEgcHJvYmxlbSwgd2UgdXNlIHRoZSBxdWVyeSBkZWZhdWx0cyAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwgIkFMTE9DQVRJT04gcXVlcnkgZmFpbGVkIik7CisgIH0KKworICBpZiAoZ3N0X3F1ZXJ5X2dldF9uX2FsbG9jYXRpb25fcG9vbHMgKHF1ZXJ5KSA+IDApIHsKKyAgICAvKiB3ZSBnb3QgY29uZmlndXJhdGlvbiBmcm9tIG91ciBwZWVyLCBwYXJzZSB0aGVtICovCisgICAgZ3N0X3F1ZXJ5X3BhcnNlX250aF9hbGxvY2F0aW9uX3Bvb2wgKHF1ZXJ5LCAwLCAmcG9vbCwgJnNpemUsICZtaW4sICZtYXgpOworICB9IGVsc2UgeworICAgIHBvb2wgPSBOVUxMOworICAgIHNpemUgPSBpbmZvLT5zaXplOworICAgIG1pbiA9IG1heCA9IDA7CisgIH0KKworICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKworICBpZiAocG9vbCA9PSBOVUxMKSB7CisgICAgLyogd2UgZGlkIG5vdCBnZXQgYSBwb29sLCBtYWtlIG9uZSBvdXJzZWx2ZXMgdGhlbiAqLworICAgIHBvb2wgPSBnc3RfYnVmZmVyX3Bvb2xfbmV3ICgpOworICB9CisKKyAgLyogYW5kIGNvbmZpZ3VyZSAqLworICBjb25maWcgPSBnc3RfYnVmZmVyX3Bvb2xfZ2V0X2NvbmZpZyAocG9vbCk7CisgIGdzdF9idWZmZXJfcG9vbF9jb25maWdfc2V0X3BhcmFtcyAoY29uZmlnLCB0YXJnZXQsIHNpemUsIG1pbiwgbWF4KTsKKyAgZ3N0X2J1ZmZlcl9wb29sX3NldF9jb25maWcgKHBvb2wsIGNvbmZpZyk7CisKKyAgaWYgKGZpbHRlci0+cG9vbCkgeworICAgIGdzdF9idWZmZXJfcG9vbF9zZXRfYWN0aXZlIChmaWx0ZXItPnBvb2wsIEZBTFNFKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChmaWx0ZXItPnBvb2wpOworICB9CisgIGZpbHRlci0+cG9vbCA9IHBvb2w7CisKKyAgLyogYW5kIGFjdGl2YXRlICovCisgIGdzdF9idWZmZXJfcG9vbF9zZXRfYWN0aXZlIChmaWx0ZXItPnBvb2wsIFRSVUUpOworCisgIGdzdF9jYXBzX3VucmVmICh0YXJnZXQpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2dka19waXhidWZfZGVjX2ZsdXNoIChHc3RHZGtQaXhidWZEZWMgKiBmaWx0ZXIpCit7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHZGtQaXhidWYgKnBpeGJ1ZjsKKyAgaW50IHk7CisgIGd1aW50OCAqb3V0X3BpeDsKKyAgZ3VpbnQ4ICppbl9waXg7CisgIGludCBpbl9yb3dzdHJpZGUsIG91dF9yb3dzdHJpZGU7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RDYXBzICpjYXBzID0gTlVMTDsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnaW50IG5fY2hhbm5lbHM7CisgIEdzdFZpZGVvRnJhbWUgZnJhbWU7CisKKyAgcGl4YnVmID0gZ2RrX3BpeGJ1Zl9sb2FkZXJfZ2V0X3BpeGJ1ZiAoZmlsdGVyLT5waXhidWZfbG9hZGVyKTsKKyAgaWYgKHBpeGJ1ZiA9PSBOVUxMKQorICAgIGdvdG8gbm9fcGl4YnVmOworCisgIHdpZHRoID0gZ2RrX3BpeGJ1Zl9nZXRfd2lkdGggKHBpeGJ1Zik7CisgIGhlaWdodCA9IGdka19waXhidWZfZ2V0X2hlaWdodCAocGl4YnVmKTsKKworICBpZiAoR1NUX1ZJREVPX0lORk9fRk9STUFUICgmZmlsdGVyLT5pbmZvKSA9PSBHU1RfVklERU9fRk9STUFUX1VOS05PV04pIHsKKyAgICBHc3RWaWRlb0luZm8gaW5mbzsKKyAgICBHc3RWaWRlb0Zvcm1hdCBmbXQ7CisgICAgR0xpc3QgKmw7CisKKyAgICBHU1RfREVCVUcgKCJTZXQgc2l6ZSB0byAlZHglZCIsIHdpZHRoLCBoZWlnaHQpOworCisgICAgbl9jaGFubmVscyA9IGdka19waXhidWZfZ2V0X25fY2hhbm5lbHMgKHBpeGJ1Zik7CisgICAgc3dpdGNoIChuX2NoYW5uZWxzKSB7CisgICAgICBjYXNlIDM6CisgICAgICAgIGZtdCA9IEdTVF9WSURFT19GT1JNQVRfUkdCOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgZm10ID0gR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gY2hhbm5lbHNfbm90X3N1cHBvcnRlZDsKKyAgICB9CisKKworICAgIGdzdF92aWRlb19pbmZvX2luaXQgKCZpbmZvKTsKKyAgICBnc3RfdmlkZW9faW5mb19zZXRfZm9ybWF0ICgmaW5mbywgZm10LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBpbmZvLmZwc19uID0gZmlsdGVyLT5pbl9mcHNfbjsKKyAgICBpbmZvLmZwc19kID0gZmlsdGVyLT5pbl9mcHNfZDsKKyAgICBjYXBzID0gZ3N0X3ZpZGVvX2luZm9fdG9fY2FwcyAoJmluZm8pOworCisgICAgZmlsdGVyLT5pbmZvID0gaW5mbzsKKworICAgIGdzdF9wYWRfc2V0X2NhcHMgKGZpbHRlci0+c3JjcGFkLCBjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgICBnc3RfZ2RrX3BpeGJ1Zl9kZWNfc2V0dXBfcG9vbCAoZmlsdGVyLCAmaW5mbyk7CisKKyAgICBmb3IgKGwgPSBmaWx0ZXItPnBlbmRpbmdfZXZlbnRzOyBsOyBsID0gbC0+bmV4dCkKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoZmlsdGVyLT5zcmNwYWQsIGwtPmRhdGEpOworICAgIGdfbGlzdF9mcmVlIChmaWx0ZXItPnBlbmRpbmdfZXZlbnRzKTsKKyAgICBmaWx0ZXItPnBlbmRpbmdfZXZlbnRzID0gTlVMTDsKKyAgfQorCisgIHJldCA9IGdzdF9idWZmZXJfcG9vbF9hY3F1aXJlX2J1ZmZlciAoZmlsdGVyLT5wb29sLCAmb3V0YnVmLCBOVUxMKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICBnb3RvIG5vX2J1ZmZlcjsKKworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSA9IGZpbHRlci0+bGFzdF90aW1lc3RhbXA7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIGluX3BpeCA9IGdka19waXhidWZfZ2V0X3BpeGVscyAocGl4YnVmKTsKKyAgaW5fcm93c3RyaWRlID0gZ2RrX3BpeGJ1Zl9nZXRfcm93c3RyaWRlIChwaXhidWYpOworCisgIGdzdF92aWRlb19mcmFtZV9tYXAgKCZmcmFtZSwgJmZpbHRlci0+aW5mbywgb3V0YnVmLCBHU1RfTUFQX1dSSVRFKTsKKyAgb3V0X3BpeCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBICgmZnJhbWUsIDApOworICBvdXRfcm93c3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoJmZyYW1lLCAwKTsKKworICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICBtZW1jcHkgKG91dF9waXgsIGluX3BpeCwgd2lkdGggKiBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFICgmZnJhbWUsIDApKTsKKyAgICBpbl9waXggKz0gaW5fcm93c3RyaWRlOworICAgIG91dF9waXggKz0gb3V0X3Jvd3N0cmlkZTsKKyAgfQorCisgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJmZyYW1lKTsKKworICBHU1RfREVCVUcgKCJwdXNoaW5nLi4uICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMiLAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAob3V0YnVmKSk7CisgIHJldCA9IGdzdF9wYWRfcHVzaCAoZmlsdGVyLT5zcmNwYWQsIG91dGJ1Zik7CisKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsICJmbG93OiAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworbm9fcGl4YnVmOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGZpbHRlciwgU1RSRUFNLCBERUNPREUsIChOVUxMKSwgKCJlcnJvciBnZXRpbmcgcGl4YnVmIikpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorY2hhbm5lbHNfbm90X3N1cHBvcnRlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChmaWx0ZXIsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksCisgICAgICAgICgiJWQgY2hhbm5lbHMgbm90IHN1cHBvcnRlZCIsIG5fY2hhbm5lbHMpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK25vX2J1ZmZlcjoKKyAgeworICAgIEdTVF9ERUJVRyAoIkZhaWxlZCB0byBjcmVhdGUgb3V0YnVmZmVyIC0gJXMiLCBnc3RfZmxvd19nZXRfbmFtZSAocmV0KSk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9nZGtfcGl4YnVmX2RlY19zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RGbG93UmV0dXJuIHJlcyA9IEdTVF9GTE9XX09LOworICBnYm9vbGVhbiByZXQgPSBUUlVFLCBmb3J3YXJkID0gVFJVRTsKKyAgR3N0R2RrUGl4YnVmRGVjICpwaXhidWY7CisKKyAgcGl4YnVmID0gR1NUX0dES19QSVhCVUZfREVDIChwYXJlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICByZXQgPSBnc3RfZ2RrX3BpeGJ1Zl9kZWNfc2lua19zZXRjYXBzIChwaXhidWYsIGNhcHMpOworICAgICAgZm9yd2FyZCA9IEZBTFNFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgIGlmIChwaXhidWYtPnBpeGJ1Zl9sb2FkZXIgIT0gTlVMTCkgeworICAgICAgICBnZGtfcGl4YnVmX2xvYWRlcl9jbG9zZSAocGl4YnVmLT5waXhidWZfbG9hZGVyLCBOVUxMKTsKKyAgICAgICAgcmVzID0gZ3N0X2dka19waXhidWZfZGVjX2ZsdXNoIChwaXhidWYpOworICAgICAgICBnX29iamVjdF91bnJlZiAoR19PQkpFQ1QgKHBpeGJ1Zi0+cGl4YnVmX2xvYWRlcikpOworICAgICAgICBwaXhidWYtPnBpeGJ1Zl9sb2FkZXIgPSBOVUxMOworICAgICAgICAvKiBhcyBsb25nIGFzIHdlIGRvbid0IGhhdmUgZmxvdyByZXR1cm5zIGZvciBldmVudCBmdW5jdGlvbnMgd2UgbmVlZAorICAgICAgICAgKiB0byBwb3N0IGFuIGVycm9yIGhlcmUsIG9yIHRoZSBhcHBsaWNhdGlvbiBtaWdodCBuZXZlciBrbm93IHRoYXQKKyAgICAgICAgICogdGhpbmdzIGZhaWxlZCAqLworICAgICAgICBpZiAocmVzICE9IEdTVF9GTE9XX09LICYmIHJlcyAhPSBHU1RfRkxPV19GTFVTSElORworICAgICAgICAgICAgJiYgcmVzICE9IEdTVF9GTE9XX0VPUyAmJiByZXMgIT0gR1NUX0ZMT1dfTk9UX0xJTktFRCkgeworICAgICAgICAgIEdTVF9FTEVNRU5UX0ZMT1dfRVJST1IgKHBpeGJ1ZiwgcmVzKTsKKyAgICAgICAgICBmb3J3YXJkID0gRkFMU0U7CisgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6CisgICAgICBnX2xpc3RfZnJlZV9mdWxsIChwaXhidWYtPnBlbmRpbmdfZXZlbnRzLAorICAgICAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X2V2ZW50X3VucmVmKTsKKyAgICAgIHBpeGJ1Zi0+cGVuZGluZ19ldmVudHMgPSBOVUxMOworICAgICAgLyogRmFsbCB0aHJvdWdoICovCisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDoKKyAgICB7CisgICAgICBjb25zdCBHc3RTZWdtZW50ICpzZWdtZW50OworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3NlZ21lbnQgKGV2ZW50LCAmc2VnbWVudCk7CisgICAgICBpZiAoc2VnbWVudC0+Zm9ybWF0ID09IEdTVF9GT1JNQVRfQllURVMpCisgICAgICAgIHBpeGJ1Zi0+cGFja2V0aXplZCA9IEZBTFNFOworICAgICAgZWxzZQorICAgICAgICBwaXhidWYtPnBhY2tldGl6ZWQgPSBUUlVFOworICAgICAgaWYgKHBpeGJ1Zi0+cGl4YnVmX2xvYWRlciAhPSBOVUxMKSB7CisgICAgICAgIGdka19waXhidWZfbG9hZGVyX2Nsb3NlIChwaXhidWYtPnBpeGJ1Zl9sb2FkZXIsIE5VTEwpOworICAgICAgICBnX29iamVjdF91bnJlZiAoR19PQkpFQ1QgKHBpeGJ1Zi0+cGl4YnVmX2xvYWRlcikpOworICAgICAgICBwaXhidWYtPnBpeGJ1Zl9sb2FkZXIgPSBOVUxMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICBpZiAoZm9yd2FyZCkgeworICAgIGlmICghZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChwaXhidWYtPnNyY3BhZCkgJiYKKyAgICAgICAgR1NUX0VWRU5UX0lTX1NFUklBTElaRUQgKGV2ZW50KQorICAgICAgICAmJiBHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID4gR1NUX0VWRU5UX0NBUFMKKyAgICAgICAgJiYgR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSAhPSBHU1RfRVZFTlRfRkxVU0hfU1RPUAorICAgICAgICAmJiBHU1RfRVZFTlRfVFlQRSAoZXZlbnQpICE9IEdTVF9FVkVOVF9FT1MpIHsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBwaXhidWYtPnBlbmRpbmdfZXZlbnRzID0gZ19saXN0X3ByZXBlbmQgKHBpeGJ1Zi0+cGVuZGluZ19ldmVudHMsIGV2ZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0ID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2dka19waXhidWZfZGVjX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RHZGtQaXhidWZEZWMgKmZpbHRlcjsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGZpbHRlciA9IEdTVF9HREtfUElYQlVGX0RFQyAocGFyZW50KTsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHRpbWVzdGFtcCkpCisgICAgZmlsdGVyLT5sYXN0X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKworICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiYnVmZmVyIHdpdGggdHM6ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIGlmIChmaWx0ZXItPnBpeGJ1Zl9sb2FkZXIgPT0gTlVMTCkKKyAgICBmaWx0ZXItPnBpeGJ1Zl9sb2FkZXIgPSBnZGtfcGl4YnVmX2xvYWRlcl9uZXcgKCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiV3JpdGluZyBidWZmZXIgc2l6ZSAlZCIsIChnaW50KSBtYXAuc2l6ZSk7CisgIGlmICghZ2RrX3BpeGJ1Zl9sb2FkZXJfd3JpdGUgKGZpbHRlci0+cGl4YnVmX2xvYWRlciwgbWFwLmRhdGEsIG1hcC5zaXplLAorICAgICAgICAgICZlcnJvcikpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoZmlsdGVyLT5wYWNrZXRpemVkID09IFRSVUUpIHsKKyAgICBnZGtfcGl4YnVmX2xvYWRlcl9jbG9zZSAoZmlsdGVyLT5waXhidWZfbG9hZGVyLCBOVUxMKTsKKyAgICByZXQgPSBnc3RfZ2RrX3BpeGJ1Zl9kZWNfZmx1c2ggKGZpbHRlcik7CisgICAgZ19vYmplY3RfdW5yZWYgKGZpbHRlci0+cGl4YnVmX2xvYWRlcik7CisgICAgZmlsdGVyLT5waXhidWZfbG9hZGVyID0gTlVMTDsKKyAgfQorCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGZpbHRlciwgU1RSRUFNLCBERUNPREUsIChOVUxMKSwKKyAgICAgICAgKCJnZGtfcGl4YnVmX2xvYWRlcl93cml0ZSBlcnJvcjogJXMiLCBlcnJvci0+bWVzc2FnZSkpOworICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfZ2RrX3BpeGJ1Zl9kZWNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1M7CisgIEdzdEdka1BpeGJ1ZkRlYyAqZGVjID0gR1NUX0dES19QSVhCVUZfREVDIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgLyogZGVmYXVsdCB0byBzaW5nbGUgaW1hZ2UgbW9kZSwgc2V0Y2FwcyBmdW5jdGlvbiBtaWdodCBub3QgYmUgY2FsbGVkICovCisgICAgICBkZWMtPmluX2Zwc19uID0gMDsKKyAgICAgIGRlYy0+aW5fZnBzX2QgPSAxOworICAgICAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoJmRlYy0+aW5mbyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKyAgaWYgKHJldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpCisgICAgcmV0dXJuIHJldDsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZGVjLT5pbl9mcHNfbiA9IDA7CisgICAgICBkZWMtPmluX2Zwc19kID0gMDsKKyAgICAgIGlmIChkZWMtPnBvb2wpIHsKKyAgICAgICAgZ3N0X2J1ZmZlcl9wb29sX3NldF9hY3RpdmUgKGRlYy0+cG9vbCwgRkFMU0UpOworICAgICAgICBnc3Rfb2JqZWN0X3JlcGxhY2UgKChHc3RPYmplY3QgKiopICYgZGVjLT5wb29sLCBOVUxMKTsKKyAgICAgIH0KKyAgICAgIGdfbGlzdF9mcmVlX2Z1bGwgKGRlYy0+cGVuZGluZ19ldmVudHMsIChHRGVzdHJveU5vdGlmeSkgZ3N0X2V2ZW50X3VucmVmKTsKKyAgICAgIGRlYy0+cGVuZGluZ19ldmVudHMgPSBOVUxMOworICAgICAgaWYgKGRlYy0+cGl4YnVmX2xvYWRlciAhPSBOVUxMKSB7CisgICAgICAgIGdka19waXhidWZfbG9hZGVyX2Nsb3NlIChkZWMtPnBpeGJ1Zl9sb2FkZXIsIE5VTEwpOworICAgICAgICBnX29iamVjdF91bnJlZiAoR19PQkpFQ1QgKGRlYy0+cGl4YnVmX2xvYWRlcikpOworICAgICAgICBkZWMtPnBpeGJ1Zl9sb2FkZXIgPSBOVUxMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2V4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZmRlYy5oIGIvZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxMmY0OAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZmRlYy5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qIEdTdHJlYW1lciBHZGtQaXhidWYtYmFzZWQgaW1hZ2UgZGVjb2RlcgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0dES19QSVhCVUZfREVDX0hfXworI2RlZmluZSBfX0dTVF9HREtfUElYQlVGX0RFQ19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnZGstcGl4YnVmL2dkay1waXhidWYuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0dES19QSVhCVUZfREVDCQkJXAorICAoZ3N0X2dka19waXhidWZfZGVjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9HREtfUElYQlVGX0RFQyhvYmopCQkJCQkJXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfR0RLX1BJWEJVRl9ERUMsR3N0R2RrUGl4YnVmRGVjKSkKKyNkZWZpbmUgR1NUX0dES19QSVhCVUZfREVDX0NMQVNTKGtsYXNzKQkJCQkJXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9HREtfUElYQlVGX0RFQyxHc3RHZGtQaXhidWZEZWNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19HREtfUElYQlVGX0RFQyhvYmopCQkJCQlcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9HREtfUElYQlVGX0RFQykpCisjZGVmaW5lIEdTVF9JU19HREtfUElYQlVGX0RFQ19DTEFTUyhrbGFzcykJCQkJXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9HREtfUElYQlVGX0RFQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RHZGtQaXhidWZEZWMgICAgICBHc3RHZGtQaXhidWZEZWM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0R2RrUGl4YnVmRGVjQ2xhc3MgR3N0R2RrUGl4YnVmRGVjQ2xhc3M7CisKK3N0cnVjdCBfR3N0R2RrUGl4YnVmRGVjCit7CisgIEdzdEVsZW1lbnQgZWxlbWVudDsKKworICBHc3RQYWQgKnNpbmtwYWQsICpzcmNwYWQ7CisKKyAgR3N0Q2xvY2tUaW1lICAgICAgbGFzdF90aW1lc3RhbXA7CisgIEdka1BpeGJ1ZkxvYWRlciAgKnBpeGJ1Zl9sb2FkZXI7CisKKyAgZ2ludCBpbl9mcHNfbiwgaW5fZnBzX2Q7CisKKyAgR3N0VmlkZW9JbmZvICAgaW5mbzsKKyAgR3N0QnVmZmVyUG9vbCAqcG9vbDsKKyAgR0xpc3QgICAgICAgICAqcGVuZGluZ19ldmVudHM7CisgIGdib29sZWFuICAgICAgIHBhY2tldGl6ZWQ7Cit9OworCitzdHJ1Y3QgX0dzdEdka1BpeGJ1ZkRlY0NsYXNzCit7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfZ2RrX3BpeGJ1Zl9kZWNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfR0RLX1BJWEJVRl9ERUNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmMgYi9leHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhiOGVjYwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zm92ZXJsYXkuYwpAQCAtMCwwICsxLDcxMiBAQAorLyogR1N0cmVhbWVyIEdka1BpeGJ1ZiBvdmVybGF5CisgKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNCBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgU3VpdGUgNTAwLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzM1LCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtZ2RrcGl4YnVmb3ZlcmxheQorICoKKyAqIFRoZSBnZGtwaXhidWZvdmVybGF5IGVsZW1lbnQgb3ZlcmxheXMgYW4gaW1hZ2UgbG9hZGVkIGZyb20gZmlsZSBvbnRvCisgKiBhIHZpZGVvIHN0cmVhbS4KKyAqCisgKiBDaGFuZ2luZyB0aGUgcG9zaXRpb25pbmcgb3Igb3ZlcmxheSB3aWR0aCBhbmQgaGVpZ2h0IHByb3BlcnRpZXMgYXQgcnVudGltZQorICogaXMgc3VwcG9ydGVkLCBidXQgaXQgbWlnaHQgYmUgcHJ1ZGVudCB0byB0byBwcm90ZWN0IHRoZSBwcm9wZXJ0eSBzZXR0aW5nCisgKiBjb2RlIHdpdGggR1NUX0JBU0VfVFJBTlNGT1JNX0xPQ0sgYW5kIEdTVF9CQVNFX1RSQU5TRk9STV9VTkxPQ0ssIGFzCisgKiBnX29iamVjdF9zZXQoKSBpcyBub3QgYXRvbWljIGZvciBtdWx0aXBsZSBwcm9wZXJ0aWVzIHBhc3NlZCBpbiBvbmUgZ28uCisgKgorICogQ2hhbmdpbmcgdGhlIGltYWdlIGF0IHJ1bnRpbWUgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuCisgKgorICogTmVnYXRpdmUgb2Zmc2V0cyBhcmUgYWxzbyBub3QgeWV0IHN1cHBvcnRlZC4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgdmlkZW90ZXN0c3JjICEgZ2RrcGl4YnVmb3ZlcmxheSBsb2NhdGlvbj1pbWFnZS5wbmcgISBhdXRvdmlkZW9zaW5rCisgKiBdfAorICogT3ZlcmxheXMgdGhlIGltYWdlIGluIGltYWdlLnBuZyBvbnRvIHRoZSB0ZXN0IHZpZGVvIHBpY3R1cmUgcHJvZHVjZWQgYnkKKyAqIHZpZGVvdGVzdHNyYy4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgImdzdGdka3BpeGJ1Zm92ZXJsYXkuaCIKKworI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb21ldGEuaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ2RrcGl4YnVmb3ZlcmxheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnZGtwaXhidWZvdmVybGF5X2RlYnVnCisKK3N0YXRpYyB2b2lkIGdzdF9nZGtfcGl4YnVmX292ZXJsYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BlcnR5X2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9nZGtfcGl4YnVmX292ZXJsYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BlcnR5X2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9nZGtfcGl4YnVmX292ZXJsYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2dka19waXhidWZfb3ZlcmxheV9zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X3N0b3AgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2dka19waXhidWZfb3ZlcmxheV90cmFuc2Zvcm1fZnJhbWVfaXAgKEdzdFZpZGVvRmlsdGVyICogZmlsdGVyLAorICAgIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSk7CitzdGF0aWMgdm9pZCBnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X2JlZm9yZV90cmFuc2Zvcm0gKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RCdWZmZXIgKiBvdXRidWYpOworc3RhdGljIGdib29sZWFuIGdzdF9nZGtfcGl4YnVmX292ZXJsYXlfc2V0X2luZm8gKEdzdFZpZGVvRmlsdGVyICogZmlsdGVyLAorICAgIEdzdENhcHMgKiBpbmNhcHMsIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIG91dF9pbmZvKTsKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2dka19waXhidWZfb3ZlcmxheV9sb2FkX2ltYWdlIChHc3RHZGtQaXhidWZPdmVybGF5ICogb3ZlcmxheSwKKyAgICBHRXJyb3IgKiogZXJyKTsKK3N0YXRpYyB2b2lkIGdzdF9nZGtfcGl4YnVmX292ZXJsYXlfc2V0X3BpeGJ1ZiAoR3N0R2RrUGl4YnVmT3ZlcmxheSAqIG92ZXJsYXksCisgICAgR2RrUGl4YnVmICogcGl4YnVmKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTE9DQVRJT04sCisgIFBST1BfUElYQlVGLAorICBQUk9QX1BPU0lUSU9OSU5HX01PREUsCisgIFBST1BfT0ZGU0VUX1gsCisgIFBST1BfT0ZGU0VUX1ksCisgIFBST1BfUkVMQVRJVkVfWCwKKyAgUFJPUF9SRUxBVElWRV9ZLAorICBQUk9QX0NPRUZfWCwKKyAgUFJPUF9DT0VGX1ksCisgIFBST1BfT1ZFUkxBWV9XSURUSCwKKyAgUFJPUF9PVkVSTEFZX0hFSUdIVCwKKyAgUFJPUF9BTFBIQQorfTsKKworI2RlZmluZSBWSURFT19GT1JNQVRTICJ7IFJHQngsIFJHQiwgQkdSLCBCR1J4LCB4UkdCLCB4QkdSLCAiIFwKKyAgICAiUkdCQSwgQkdSQSwgQVJHQiwgQUJHUiwgSTQyMCwgWVYxMiwgQVlVViwgWVVZMiwgVVlWWSwgIiBcCisgICAgInYzMDgsIHYyMTAsIHYyMTYsIFk0MUIsIFk0MkIsIFk0NDQsIFlWWVUsIE5WMTIsIE5WMjEsIFVZVlAsICIgXAorICAgICJSR0IxNiwgQkdSMTYsIFJHQjE1LCBCR1IxNSwgVVlWUCwgQTQyMCwgWVVWOSwgWVZVOSwgIiBcCisgICAgIklZVTEsIEFSR0I2NCwgQVlVVjY0LCByMjEwLCBJNDIwXzEwTEUsIEk0MjBfMTBCRSwgIiBcCisgICAgIkdSQVk4LCBHUkFZMTZfQkUsIEdSQVkxNl9MRSB9IgorCisvKiBGSVhNRSAyLjA6IGNoYW5nZSB0byBhYnNvbHV0ZSBwb3NpdGlvbmluZyAqLworI2RlZmluZSBERUZBVUxUX1BPU0lUSU9OSU5HX01PREUgXAorICAgIEdTVF9HREtfUElYQlVGX1BPU0lUSU9OSU5HX1BJWEVMU19SRUxBVElWRV9UT19FREdFUworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoVklERU9fRk9STUFUUykpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKFZJREVPX0ZPUk1BVFMpKQorICAgICk7CisKK0dfREVGSU5FX1RZUEUgKEdzdEdka1BpeGJ1Zk92ZXJsYXksIGdzdF9nZGtfcGl4YnVmX292ZXJsYXksCisgICAgR1NUX1RZUEVfVklERU9fRklMVEVSKTsKKworI2RlZmluZSBHU1RfVFlQRV9HREtfUElYQlVGX1BPU0lUSU9OSU5HX01PREUgXAorICAgIChnc3RfZ2RrX3BpeGJ1Zl9wb3NpdGlvbmluZ19tb2RlX2dldF90eXBlKCkpCisKK3N0YXRpYyBHVHlwZQorZ3N0X2dka19waXhidWZfcG9zaXRpb25pbmdfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgcG9zX21vZGVzW10gPSB7CisgICAge0dTVF9HREtfUElYQlVGX1BPU0lUSU9OSU5HX1BJWEVMU19SRUxBVElWRV9UT19FREdFUywKKyAgICAgICAgInBpeGVscy1yZWxhdGl2ZS10by1lZGdlcyIsICJwaXhlbHMtcmVsYXRpdmUtdG8tZWRnZXMifSwKKyAgICB7R1NUX0dES19QSVhCVUZfUE9TSVRJT05JTkdfUElYRUxTX0FCU09MVVRFLCAicGl4ZWxzLWFic29sdXRlIiwKKyAgICAgICAgInBpeGVscy1hYnNvbHV0ZSJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBzdGF0aWMgR1R5cGUgdHlwZTsgICAgICAgICAgICAvKiAwICovCisKKyAgaWYgKCF0eXBlKSB7CisgICAgdHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RHZGtQaXhidWZQb3NpdGlvbmluZ01vZGUiLCBwb3NfbW9kZXMpOworICB9CisKKyAgcmV0dXJuIHR5cGU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X2NsYXNzX2luaXQgKEdzdEdka1BpeGJ1Zk92ZXJsYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RWaWRlb0ZpbHRlckNsYXNzICp2aWRlb2ZpbHRlcl9jbGFzcyA9IEdTVF9WSURFT19GSUxURVJfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzICpiYXNldHJhbnNfY2xhc3MgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKGtsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2dka19waXhidWZfb3ZlcmxheV9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2dka19waXhidWZfb3ZlcmxheV9maW5hbGl6ZTsKKworICBiYXNldHJhbnNfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9nZGtfcGl4YnVmX292ZXJsYXlfc3RhcnQpOworICBiYXNldHJhbnNfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2dka19waXhidWZfb3ZlcmxheV9zdG9wKTsKKworICBiYXNldHJhbnNfY2xhc3MtPmJlZm9yZV90cmFuc2Zvcm0gPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9nZGtfcGl4YnVmX292ZXJsYXlfYmVmb3JlX3RyYW5zZm9ybSk7CisKKyAgdmlkZW9maWx0ZXJfY2xhc3MtPnNldF9pbmZvID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X3NldF9pbmZvKTsKKyAgdmlkZW9maWx0ZXJfY2xhc3MtPnRyYW5zZm9ybV9mcmFtZV9pcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2dka19waXhidWZfb3ZlcmxheV90cmFuc2Zvcm1fZnJhbWVfaXApOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTE9DQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgibG9jYXRpb24iLCAibG9jYXRpb24iLAorICAgICAgICAgICJMb2NhdGlvbiBvZiBpbWFnZSBmaWxlIHRvIG92ZXJsYXkiLCBOVUxMLCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFCisgICAgICAgICAgfCBHU1RfUEFSQU1fTVVUQUJMRV9QTEFZSU5HIHwgR19QQVJBTV9SRUFEV1JJVEUKKyAgICAgICAgICB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9PRkZTRVRfWCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJvZmZzZXQteCIsICJYIE9mZnNldCIsCisgICAgICAgICAgIkZvciBwb3NpdGl2ZSB2YWx1ZSwgaG9yaXpvbnRhbCBvZmZzZXQgb2Ygb3ZlcmxheSBpbWFnZSBpbiBwaXhlbHMgZnJvbSIKKyAgICAgICAgICAiIGxlZnQgb2YgdmlkZW8gaW1hZ2UuIEZvciBuZWdhdGl2ZSB2YWx1ZSwgaG9yaXpvbnRhbCBvZmZzZXQgb2Ygb3ZlcmxheSIKKyAgICAgICAgICAiIGltYWdlIGluIHBpeGVscyBmcm9tIHJpZ2h0IG9mIHZpZGVvIGltYWdlIiwgR19NSU5JTlQsIEdfTUFYSU5ULCAwLAorICAgICAgICAgIEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHU1RfUEFSQU1fTVVUQUJMRV9QTEFZSU5HIHwgR19QQVJBTV9SRUFEV1JJVEUKKyAgICAgICAgICB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9PRkZTRVRfWSwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJvZmZzZXQteSIsICJZIE9mZnNldCIsCisgICAgICAgICAgIkZvciBwb3NpdGl2ZSB2YWx1ZSwgdmVydGljYWwgb2Zmc2V0IG9mIG92ZXJsYXkgaW1hZ2UgaW4gcGl4ZWxzIGZyb20iCisgICAgICAgICAgIiB0b3Agb2YgdmlkZW8gaW1hZ2UuIEZvciBuZWdhdGl2ZSB2YWx1ZSwgdmVydGljYWwgb2Zmc2V0IG9mIG92ZXJsYXkiCisgICAgICAgICAgIiBpbWFnZSBpbiBwaXhlbHMgZnJvbSBib3R0b20gb2YgdmlkZW8gaW1hZ2UiLCBHX01JTklOVCwgR19NQVhJTlQsIDAsCisgICAgICAgICAgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdTVF9QQVJBTV9NVVRBQkxFX1BMQVlJTkcgfCBHX1BBUkFNX1JFQURXUklURQorICAgICAgICAgIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JFTEFUSVZFX1gsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgicmVsYXRpdmUteCIsICJSZWxhdGl2ZSBYIE9mZnNldCIsCisgICAgICAgICAgIkhvcml6b250YWwgb2Zmc2V0IG9mIG92ZXJsYXkgaW1hZ2UgaW4gZnJhY3Rpb25zIG9mIHZpZGVvIGltYWdlICIKKyAgICAgICAgICAid2lkdGgsIGZyb20gdG9wLWxlZnQgY29ybmVyIG9mIHZpZGVvIGltYWdlIgorICAgICAgICAgICIgKGluIHJlbGF0aXZlIHBvc2l0aW9uaW5nKSIsIC0xLjAsIDEuMCwgMC4wLAorICAgICAgICAgIEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHU1RfUEFSQU1fTVVUQUJMRV9QTEFZSU5HIHwgR19QQVJBTV9SRUFEV1JJVEUKKyAgICAgICAgICB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SRUxBVElWRV9ZLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoInJlbGF0aXZlLXkiLCAiUmVsYXRpdmUgWSBPZmZzZXQiLAorICAgICAgICAgICJWZXJ0aWNhbCBvZmZzZXQgb2Ygb3ZlcmxheSBpbWFnZSBpbiBmcmFjdGlvbnMgb2YgdmlkZW8gaW1hZ2UgIgorICAgICAgICAgICJoZWlnaHQsIGZyb20gdG9wLWxlZnQgY29ybmVyIG9mIHZpZGVvIGltYWdlIgorICAgICAgICAgICIgKGluIHJlbGF0aXZlIHBvc2l0aW9uaW5nKSIsIC0xLjAsIDEuMCwgMC4wLAorICAgICAgICAgIEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHU1RfUEFSQU1fTVVUQUJMRV9QTEFZSU5HIHwgR19QQVJBTV9SRUFEV1JJVEUKKyAgICAgICAgICB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9PVkVSTEFZX1dJRFRILAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoIm92ZXJsYXktd2lkdGgiLCAiT3ZlcmxheSBXaWR0aCIsCisgICAgICAgICAgIldpZHRoIG9mIG92ZXJsYXkgaW1hZ2UgaW4gcGl4ZWxzICgwID0gc2FtZSBhcyBvdmVybGF5IGltYWdlKSIsIDAsCisgICAgICAgICAgR19NQVhJTlQsIDAsCisgICAgICAgICAgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdTVF9QQVJBTV9NVVRBQkxFX1BMQVlJTkcgfCBHX1BBUkFNX1JFQURXUklURQorICAgICAgICAgIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX09WRVJMQVlfSEVJR0hULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoIm92ZXJsYXktaGVpZ2h0IiwgIk92ZXJsYXkgSGVpZ2h0IiwKKyAgICAgICAgICAiSGVpZ2h0IG9mIG92ZXJsYXkgaW1hZ2UgaW4gcGl4ZWxzICgwID0gc2FtZSBhcyBvdmVybGF5IGltYWdlKSIsIDAsCisgICAgICAgICAgR19NQVhJTlQsIDAsCisgICAgICAgICAgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdTVF9QQVJBTV9NVVRBQkxFX1BMQVlJTkcgfCBHX1BBUkFNX1JFQURXUklURQorICAgICAgICAgIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0FMUEhBLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoImFscGhhIiwgIkFscGhhIiwgIkdsb2JhbCBhbHBoYSBvZiBvdmVybGF5IGltYWdlIiwKKyAgICAgICAgICAwLjAsIDEuMCwgMS4wLCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR1NUX1BBUkFNX01VVEFCTEVfUExBWUlORworICAgICAgICAgIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RHZGtQaXhidWZPdmVybGF5OnBpeGJ1ZjoKKyAgICoKKyAgICogR2RrUGl4YnVmIG9iamVjdCB0byByZW5kZXIuCisgICAqCisgICAqIFNpbmNlOiAxLjYKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUElYQlVGLAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoInBpeGJ1ZiIsICJQaXhidWYiLCAiR2RrUGl4YnVmIG9iamVjdCB0byByZW5kZXIiLAorICAgICAgICAgIEdES19UWVBFX1BJWEJVRiwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdTVF9QQVJBTV9NVVRBQkxFX1BMQVlJTkcKKyAgICAgICAgICB8IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0R2RrUGl4YnVmT3ZlcmxheTpwb3NpdGlvbmluZy1tb2RlOgorICAgKgorICAgKiBQb3NpdGlvbmluZyBtb2RlIG9mIG9mZnNldC14IGFuZCBvZmZzZXQteSBwcm9wZXJ0aWVzLiBEZXRlcm1pbmVzIGhvdworICAgKiBuZWdhdGl2ZSB4L3kgb2Zmc2V0cyB3aWxsIGJlIGludGVycHJldGVkLiBCeSBkZWZhdWx0IG5lZ2F0aXZlIHZhbHVlcworICAgKiBhcmUgZm9yIHBvc2l0aW9uaW5nIHJlbGF0aXZlIHRvIHRoZSByaWdodC9ib3R0b20gZWRnZSBvZiB0aGUgdmlkZW8KKyAgICogaW1hZ2UsIGJ1dCB5b3UgY2FuIHVzZSB0aGlzIHByb3BlcnR5IHRvIHNlbGVjdCBhYnNvbHV0ZSBwb3NpdGlvbmluZworICAgKiByZWxhdGl2ZSB0byBhICgwLCAwKSBvcmlnaW4gaW4gdGhlIHRvcC1sZWZ0IGNvcm5lci4gVGhhdCB3YXkgbmVnYXRpdmUKKyAgICogb2Zmc2V0cyB3aWxsIGJlIHRvIHRoZSBsZWZ0L2Fib3ZlIHRoZSB2aWRlbyBpbWFnZSwgd2hpY2ggYWxsb3dzIHlvdSB0bworICAgKiBzbW9vdGhseSBzbGlkZSBsb2dvcyBpbnRvIGFuZCBvdXQgb2YgdGhlIGZyYW1lIGlmIGRlc2lyZWQuCisgICAqCisgICAqIFNpbmNlOiAxLjYKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUE9TSVRJT05JTkdfTU9ERSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgicG9zaXRpb25pbmctbW9kZSIsICJQb3NpdGlvbmluZyBtb2RlIiwKKyAgICAgICAgICAiUG9zaXRpb25pbmcgbW9kZSBvZiBvZmZzZXQteCBhbmQgb2Zmc2V0LXkgcHJvcGVydGllcyIsCisgICAgICAgICAgR1NUX1RZUEVfR0RLX1BJWEJVRl9QT1NJVElPTklOR19NT0RFLCBERUZBVUxUX1BPU0lUSU9OSU5HX01PREUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyogRklYTUUgdGhlIGZvbGxvd2luZyBhY3R1YWxseSBhY3QgYXMgYSBSRUxBVElWRV9YL1JFTEFUSVZFX1ksCisgICAqIGJ1dCB0aG9zZSB3ZXJlIGFscmVhZHkgc2xpZ2h0bHkgbXV0YXRlZC9hYnVzZWQgd2l0aCBBQlNPTFVURSBwb3NpdGlvbmluZywKKyAgICogc28gbGV0J3Mga2VlcCB0aGF0IGFuZCBmb2xsb3cgc3VpdAorICAgKiBTdWZmaWNlIGl0IHRvIHNheSBhbGwgdGhhdCBjb3VsZCBkbyB3aXRoIGNsZWFudXAgKDIuMCA/PykgKi8KKyAgLyoqCisgICAqIEdzdEdka1BpeGJ1Zk92ZXJsYXk6Y29lZi14OgorICAgKgorICAgKiBJbiBhYnNvbHV0ZSBwb3NpdGlvbmluZyBtb2RlLCB0aGUgeCBjb29yZGluYXRlIG9mIG92ZXJsYXkgaW1hZ2UncworICAgKiB0b3AtbGVmdCBjb3JuZXIgaXMgbm93IGdpdmVuIGJ5CisgICAqIG9mZnNldC14ICsgKHJlbGF0aXZlLXggKiBvdmVybGF5X3dpZHRoKSArIChjb2VmLXggKiB2aWRlb193aWR0aCkuCisgICAqIFRoaXMgYWxsb3dzIHRvIGFsaWduIHRoZSBpbWFnZSBhYnNvbHV0ZWx5IGFuZCByZWxhdGl2ZWx5CisgICAqIHRvIGFueSBlZGdlIG9yIGNlbnRlciBwb3NpdGlvbi4KKyAgICoKKyAgICogU2luY2U6IDEuMTIKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ09FRl9YLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoImNvZWYteCIsICJSZWxhdGl2ZSBYIE9mZnNldCIsCisgICAgICAgICAgIkhvcml6b250YWwgb2Zmc2V0IG9mIG92ZXJsYXkgaW1hZ2UgaW4gZnJhY3Rpb25zIG9mIHZpZGVvIGltYWdlICIKKyAgICAgICAgICAid2lkdGgsIGZyb20gdG9wLWxlZnQgY29ybmVyIG9mIHZpZGVvIGltYWdlIChhYnNvbHV0ZSBwb3NpdGlvbmluZykiLAorICAgICAgICAgIC0xLjAsIDEuMCwgMC4wLCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR1NUX1BBUkFNX01VVEFCTEVfUExBWUlORworICAgICAgICAgIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RHZGtQaXhidWZPdmVybGF5OmNvZWYteToKKyAgICoKKyAgICogSW4gYWJzb2x1dGUgcG9zaXRpb25pbmcgbW9kZSwgdGhlIHkgY29vcmRpbmF0ZSBvZiBvdmVybGF5IGltYWdlJ3MKKyAgICogdG9wLWxlZnQgY29ybmVyIGlzIG5vdyBnaXZlbiBieQorICAgKiBvZmZzZXQteSArIChyZWxhdGl2ZS15ICogb3ZlcmxheV9oZWlnaHQpICsgKGNvZWYteSAqIHZpZGVvX2hlaWdodCkuCisgICAqIFRoaXMgYWxsb3dzIHRvIGFsaWduIHRoZSBpbWFnZSBhYnNvbHV0ZWx5IGFuZCByZWxhdGl2ZWx5CisgICAqIHRvIGFueSBlZGdlIG9yIGNlbnRlciBwb3NpdGlvbi4KKyAgICoKKyAgICogU2luY2U6IDEuMTIKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ09FRl9ZLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoImNvZWYteSIsICJSZWxhdGl2ZSBZIE9mZnNldCIsCisgICAgICAgICAgIlZlcnRpY2FsIG9mZnNldCBvZiBvdmVybGF5IGltYWdlIGluIGZyYWN0aW9ucyBvZiB2aWRlbyBpbWFnZSAiCisgICAgICAgICAgImhlaWdodCwgZnJvbSB0b3AtbGVmdCBjb3JuZXIgb2YgdmlkZW8gaW1hZ2UgKGFic29sdXRlIHBvc2l0aW9uaW5nKSIsCisgICAgICAgICAgLTEuMCwgMS4wLCAwLjAsIEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHU1RfUEFSQU1fTVVUQUJMRV9QTEFZSU5HCisgICAgICAgICAgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywKKyAgICAgICJHZGtQaXhidWYgT3ZlcmxheSIsICJGaWx0ZXIvRWZmZWN0L1ZpZGVvIiwKKyAgICAgICJPdmVybGF5IGFuIGltYWdlIG9udG8gYSB2aWRlbyBzdHJlYW0iLAorICAgICAgIlRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+Iik7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnZGtwaXhidWZvdmVybGF5X2RlYnVnLCAiZ2RrcGl4YnVmb3ZlcmxheSIsIDAsCisgICAgICAiZGVidWcgY2F0ZWdvcnkgZm9yIGdka3BpeGJ1Zm92ZXJsYXkgZWxlbWVudCIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2dka19waXhidWZfb3ZlcmxheV9pbml0IChHc3RHZGtQaXhidWZPdmVybGF5ICogb3ZlcmxheSkKK3sKKyAgb3ZlcmxheS0+b2Zmc2V0X3ggPSAwOworICBvdmVybGF5LT5vZmZzZXRfeSA9IDA7CisKKyAgb3ZlcmxheS0+cmVsYXRpdmVfeCA9IDAuMDsKKyAgb3ZlcmxheS0+cmVsYXRpdmVfeSA9IDAuMDsKKworICBvdmVybGF5LT5jb2VmX3ggPSAwLjA7CisgIG92ZXJsYXktPmNvZWZfeSA9IDAuMDsKKworICBvdmVybGF5LT5wb3NpdGlvbmluZ19tb2RlID0gREVGQVVMVF9QT1NJVElPTklOR19NT0RFOworCisgIG92ZXJsYXktPm92ZXJsYXlfd2lkdGggPSAwOworICBvdmVybGF5LT5vdmVybGF5X2hlaWdodCA9IDA7CisKKyAgb3ZlcmxheS0+YWxwaGEgPSAxLjA7CisKKyAgb3ZlcmxheS0+cGl4YnVmID0gTlVMTDsKK30KKwordm9pZAorZ3N0X2dka19waXhidWZfb3ZlcmxheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEdka1BpeGJ1Zk92ZXJsYXkgKm92ZXJsYXkgPSBHU1RfR0RLX1BJWEJVRl9PVkVSTEFZIChvYmplY3QpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAob3ZlcmxheSk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkgeworICAgIGNhc2UgUFJPUF9MT0NBVElPTjp7CisgICAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisgICAgICBnX2ZyZWUgKG92ZXJsYXktPmxvY2F0aW9uKTsKKyAgICAgIG92ZXJsYXktPmxvY2F0aW9uID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBpZiAoIWdzdF9nZGtfcGl4YnVmX292ZXJsYXlfbG9hZF9pbWFnZSAob3ZlcmxheSwgJmVycikpIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAob3ZlcmxheSwgIkNvdWxkIG5vdCBsb2FkIG92ZXJsYXkgaW1hZ2U6ICVzIiwKKyAgICAgICAgICAgIGVyci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfUElYQlVGOnsKKyAgICAgIEdka1BpeGJ1ZiAqcGl4YnVmID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7CisKKyAgICAgIGlmIChvdmVybGF5LT5waXhidWYgIT0gTlVMTCkKKyAgICAgICAgZ19vYmplY3RfdW5yZWYgKG92ZXJsYXktPnBpeGJ1Zik7CisgICAgICBpZiAocGl4YnVmKSB7CisgICAgICAgIG92ZXJsYXktPnBpeGJ1ZiA9IGdfb2JqZWN0X3JlZiAocGl4YnVmKTsKKyAgICAgICAgZ3N0X2dka19waXhidWZfb3ZlcmxheV9zZXRfcGl4YnVmIChvdmVybGF5LCBnX29iamVjdF9yZWYgKHBpeGJ1ZikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3ZlcmxheS0+cGl4YnVmID0gTlVMTDsKKyAgICAgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmb3ZlcmxheS0+cGl4ZWxzLCBOVUxMKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfT0ZGU0VUX1g6CisgICAgICBvdmVybGF5LT5vZmZzZXRfeCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgb3ZlcmxheS0+dXBkYXRlX2NvbXBvc2l0aW9uID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9PRkZTRVRfWToKKyAgICAgIG92ZXJsYXktPm9mZnNldF95ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBvdmVybGF5LT51cGRhdGVfY29tcG9zaXRpb24gPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JFTEFUSVZFX1g6CisgICAgICBvdmVybGF5LT5yZWxhdGl2ZV94ID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisgICAgICBvdmVybGF5LT51cGRhdGVfY29tcG9zaXRpb24gPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JFTEFUSVZFX1k6CisgICAgICBvdmVybGF5LT5yZWxhdGl2ZV95ID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisgICAgICBvdmVybGF5LT51cGRhdGVfY29tcG9zaXRpb24gPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NPRUZfWDoKKyAgICAgIG92ZXJsYXktPmNvZWZfeCA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworICAgICAgb3ZlcmxheS0+dXBkYXRlX2NvbXBvc2l0aW9uID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT0VGX1k6CisgICAgICBvdmVybGF5LT5jb2VmX3kgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIG92ZXJsYXktPnVwZGF0ZV9jb21wb3NpdGlvbiA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfT1ZFUkxBWV9XSURUSDoKKyAgICAgIG92ZXJsYXktPm92ZXJsYXlfd2lkdGggPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIG92ZXJsYXktPnVwZGF0ZV9jb21wb3NpdGlvbiA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfT1ZFUkxBWV9IRUlHSFQ6CisgICAgICBvdmVybGF5LT5vdmVybGF5X2hlaWdodCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgb3ZlcmxheS0+dXBkYXRlX2NvbXBvc2l0aW9uID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9BTFBIQToKKyAgICAgIG92ZXJsYXktPmFscGhhID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisgICAgICBvdmVybGF5LT51cGRhdGVfY29tcG9zaXRpb24gPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BPU0lUSU9OSU5HX01PREU6CisgICAgICBvdmVybGF5LT5wb3NpdGlvbmluZ19tb2RlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgb3ZlcmxheS0+dXBkYXRlX2NvbXBvc2l0aW9uID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKG92ZXJsYXkpOworfQorCit2b2lkCitnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0R2RrUGl4YnVmT3ZlcmxheSAqb3ZlcmxheSA9IEdTVF9HREtfUElYQlVGX09WRVJMQVkgKG9iamVjdCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChvdmVybGF5KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKSB7CisgICAgY2FzZSBQUk9QX0xPQ0FUSU9OOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgb3ZlcmxheS0+bG9jYXRpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BJWEJVRjoKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIG92ZXJsYXktPnBpeGJ1Zik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfT0ZGU0VUX1g6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBvdmVybGF5LT5vZmZzZXRfeCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfT0ZGU0VUX1k6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBvdmVybGF5LT5vZmZzZXRfeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVMQVRJVkVfWDoKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIG92ZXJsYXktPnJlbGF0aXZlX3gpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JFTEFUSVZFX1k6CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCBvdmVybGF5LT5yZWxhdGl2ZV95KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT0VGX1g6CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCBvdmVybGF5LT5jb2VmX3gpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NPRUZfWToKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIG92ZXJsYXktPmNvZWZfeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfT1ZFUkxBWV9XSURUSDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIG92ZXJsYXktPm92ZXJsYXlfd2lkdGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX09WRVJMQVlfSEVJR0hUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgb3ZlcmxheS0+b3ZlcmxheV9oZWlnaHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FMUEhBOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgb3ZlcmxheS0+YWxwaGEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BPU0lUSU9OSU5HX01PREU6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgb3ZlcmxheS0+cG9zaXRpb25pbmdfbW9kZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorCisgIEdTVF9PQkpFQ1RfVU5MT0NLIChvdmVybGF5KTsKK30KKwordm9pZAorZ3N0X2dka19waXhidWZfb3ZlcmxheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0R2RrUGl4YnVmT3ZlcmxheSAqb3ZlcmxheSA9IEdTVF9HREtfUElYQlVGX09WRVJMQVkgKG9iamVjdCk7CisKKyAgZ19mcmVlIChvdmVybGF5LT5sb2NhdGlvbik7CisgIG92ZXJsYXktPmxvY2F0aW9uID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAoZ3N0X2dka19waXhidWZfb3ZlcmxheV9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X2xvYWRfaW1hZ2UgKEdzdEdka1BpeGJ1Zk92ZXJsYXkgKiBvdmVybGF5LCBHRXJyb3IgKiogZXJyKQoreworICBHZGtQaXhidWYgKnBpeGJ1ZjsKKworICBwaXhidWYgPSBnZGtfcGl4YnVmX25ld19mcm9tX2ZpbGUgKG92ZXJsYXktPmxvY2F0aW9uLCBlcnIpOworCisgIGlmIChwaXhidWYgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZ3N0X2dka19waXhidWZfb3ZlcmxheV9zZXRfcGl4YnVmIChvdmVybGF5LCBwaXhidWYpOworICByZXR1cm4gVFJVRTsKK30KKworLyogVGFrZXMgb3duZXJzaGlwIG9mIHBpeGJ1ZjsgY2FsbCB3aXRoIE9CSkVDVF9MT0NLICovCitzdGF0aWMgdm9pZAorZ3N0X2dka19waXhidWZfb3ZlcmxheV9zZXRfcGl4YnVmIChHc3RHZGtQaXhidWZPdmVybGF5ICogb3ZlcmxheSwKKyAgICBHZGtQaXhidWYgKiBwaXhidWYpCit7CisgIEdzdFZpZGVvTWV0YSAqdmlkZW9fbWV0YTsKKyAgZ3VpbnQ4ICpwaXhlbHMsICpwOworICBnaW50IHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgdywgaCwgcGxhbmU7CisKKyAgaWYgKCFnZGtfcGl4YnVmX2dldF9oYXNfYWxwaGEgKHBpeGJ1ZikpIHsKKyAgICBHZGtQaXhidWYgKmFscGhhX3BpeGJ1ZjsKKworICAgIC8qIEZJWE1FOiB3ZSBjb3VsZCBkbyB0aGlzIG11Y2ggbW9yZSBlZmZpY2llbnRseSBvdXJzZWx2ZXMgYmVsb3csIGJ1dAorICAgICAqIHdlJ3JlIGxhenkgZm9yIG5vdyAqLworICAgIC8qIEZJWE1FOiBwZXJoYXBzIGV4cG9zZSBzdWJzdGl0dXRlX2NvbG9yIHZpYSBwcm9wZXJ0aWVzICovCisgICAgYWxwaGFfcGl4YnVmID0gZ2RrX3BpeGJ1Zl9hZGRfYWxwaGEgKHBpeGJ1ZiwgRkFMU0UsIDAsIDAsIDApOworICAgIGdfb2JqZWN0X3VucmVmIChwaXhidWYpOworICAgIHBpeGJ1ZiA9IGFscGhhX3BpeGJ1ZjsKKyAgfQorCisgIHdpZHRoID0gZ2RrX3BpeGJ1Zl9nZXRfd2lkdGggKHBpeGJ1Zik7CisgIGhlaWdodCA9IGdka19waXhidWZfZ2V0X2hlaWdodCAocGl4YnVmKTsKKyAgc3RyaWRlID0gZ2RrX3BpeGJ1Zl9nZXRfcm93c3RyaWRlIChwaXhidWYpOworICBwaXhlbHMgPSBnZGtfcGl4YnVmX2dldF9waXhlbHMgKHBpeGJ1Zik7CisKKyAgLyogdGhlIG1lbW9yeSBsYXlvdXQgaW4gR2RrUGl4YnVmIGlzIFItRy1CLUEsIHdlIHdhbnQ6CisgICAqICAtIEItRy1SLUEgb24gbGl0dGxlLWVuZGlhbiBwbGF0Zm9ybXMKKyAgICogIC0gQS1SLUctQiBvbiBiaWctZW5kaWFuIHBsYXRmb3JtcworICAgKi8KKyAgZm9yIChoID0gMDsgaCA8IGhlaWdodDsgKytoKSB7CisgICAgcCA9IHBpeGVscyArIChoICogc3RyaWRlKTsKKyAgICBmb3IgKHcgPSAwOyB3IDwgd2lkdGg7ICsrdykgeworICAgICAgZ3VpbnQ4IHRtcDsKKworICAgICAgLyogUi1HLUItQSA9PT4gQi1HLVItQSAqLworICAgICAgdG1wID0gcFswXTsKKyAgICAgIHBbMF0gPSBwWzJdOworICAgICAgcFsyXSA9IHRtcDsKKworICAgICAgaWYgKEdfQllURV9PUkRFUiA9PSBHX0JJR19FTkRJQU4pIHsKKyAgICAgICAgLyogQi1HLVItQSA9PT4gQS1SLUctQiAqLworICAgICAgICAvKiB3ZSBjYW4gcHJvYmFibHkgYXNzdW1lIHNhbmUgYWxpZ25tZW50ICovCisgICAgICAgICooKGd1aW50MzIgKikgcCkgPSBHVUlOVDMyX1NXQVBfTEVfQkUgKCooKGd1aW50MzIgKikgcCkpOworICAgICAgfQorCisgICAgICBwICs9IDQ7CisgICAgfQorICB9CisKKyAgaWYgKG92ZXJsYXktPnBpeGVscykKKyAgICBnc3RfYnVmZmVyX3VucmVmIChvdmVybGF5LT5waXhlbHMpOworCisgIC8qIGFzc3VtZSB3ZSBoYXZlIHJvdyBwYWRkaW5nIGV2ZW4gZm9yIHRoZSBsYXN0IHJvdyAqLworICAvKiB0cmFuc2ZlciBvd25lcnNoaXAgb2YgcGl4YnVmIHRvIHRoZSBidWZmZXIgKi8KKyAgb3ZlcmxheS0+cGl4ZWxzID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZF9mdWxsIChHU1RfTUVNT1JZX0ZMQUdfUkVBRE9OTFksCisgICAgICBwaXhlbHMsIGhlaWdodCAqIHN0cmlkZSwgMCwgaGVpZ2h0ICogc3RyaWRlLCBwaXhidWYsCisgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdfb2JqZWN0X3VucmVmKTsKKworICB2aWRlb19tZXRhID0gZ3N0X2J1ZmZlcl9hZGRfdmlkZW9fbWV0YSAob3ZlcmxheS0+cGl4ZWxzLAorICAgICAgR1NUX1ZJREVPX0ZSQU1FX0ZMQUdfTk9ORSwgR1NUX1ZJREVPX09WRVJMQVlfQ09NUE9TSVRJT05fRk9STUFUX1JHQiwKKyAgICAgIHdpZHRoLCBoZWlnaHQpOworCisgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IHZpZGVvX21ldGEtPm5fcGxhbmVzOyArK3BsYW5lKQorICAgIHZpZGVvX21ldGEtPnN0cmlkZVtwbGFuZV0gPSBzdHJpZGU7CisKKyAgb3ZlcmxheS0+dXBkYXRlX2NvbXBvc2l0aW9uID0gVFJVRTsKKworICBHU1RfSU5GT19PQkpFQ1QgKG92ZXJsYXksICJVcGRhdGVkIHBpeGJ1ZiwgJWQgeCAlZCIsIHdpZHRoLCBoZWlnaHQpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9nZGtfcGl4YnVmX292ZXJsYXlfc3RhcnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucykKK3sKKyAgR3N0R2RrUGl4YnVmT3ZlcmxheSAqb3ZlcmxheSA9IEdTVF9HREtfUElYQlVGX09WRVJMQVkgKHRyYW5zKTsKKyAgR0Vycm9yICplcnIgPSBOVUxMOworCisgIGlmIChvdmVybGF5LT5sb2NhdGlvbiAhPSBOVUxMKSB7CisgICAgaWYgKCFnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X2xvYWRfaW1hZ2UgKG92ZXJsYXksICZlcnIpKQorICAgICAgZ290byBlcnJvcl9sb2FkaW5nX2ltYWdlOworCisgICAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9wYXNzdGhyb3VnaCAodHJhbnMsIEZBTFNFKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG92ZXJsYXksICJubyBpbWFnZSBsb2NhdGlvbiBzZXQsIGRvaW5nIG5vdGhpbmciKTsKKyAgICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X3Bhc3N0aHJvdWdoICh0cmFucywgVFJVRSk7CisgIH0KKworICByZXR1cm4gVFJVRTsKKworLyogRVJST1JTICovCitlcnJvcl9sb2FkaW5nX2ltYWdlOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG92ZXJsYXksIFJFU09VUkNFLCBPUEVOX1JFQUQsCisgICAgICAgICgiQ291bGQgbm90IGxvYWQgb3ZlcmxheSBpbWFnZS4iKSwgKCIlcyIsIGVyci0+bWVzc2FnZSkpOworICAgIGdfZXJyb3JfZnJlZSAoZXJyKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X3N0b3AgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucykKK3sKKyAgR3N0R2RrUGl4YnVmT3ZlcmxheSAqb3ZlcmxheSA9IEdTVF9HREtfUElYQlVGX09WRVJMQVkgKHRyYW5zKTsKKworICBpZiAob3ZlcmxheS0+Y29tcCkgeworICAgIGdzdF92aWRlb19vdmVybGF5X2NvbXBvc2l0aW9uX3VucmVmIChvdmVybGF5LT5jb21wKTsKKyAgICBvdmVybGF5LT5jb21wID0gTlVMTDsKKyAgfQorCisgIGdzdF9idWZmZXJfcmVwbGFjZSAoJm92ZXJsYXktPnBpeGVscywgTlVMTCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2dka19waXhidWZfb3ZlcmxheV9zZXRfaW5mbyAoR3N0VmlkZW9GaWx0ZXIgKiBmaWx0ZXIsIEdzdENhcHMgKiBpbmNhcHMsCisgICAgR3N0VmlkZW9JbmZvICogaW5faW5mbywgR3N0Q2FwcyAqIG91dGNhcHMsIEdzdFZpZGVvSW5mbyAqIG91dF9pbmZvKQoreworICBHU1RfSU5GT19PQkpFQ1QgKGZpbHRlciwgImNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBpbmNhcHMpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9nZGtfcGl4YnVmX292ZXJsYXlfdXBkYXRlX2NvbXBvc2l0aW9uIChHc3RHZGtQaXhidWZPdmVybGF5ICogb3ZlcmxheSkKK3sKKyAgR3N0R2RrUGl4YnVmUG9zaXRpb25pbmdNb2RlIHBvc2l0aW9uaW5nX21vZGU7CisgIEdzdFZpZGVvT3ZlcmxheUNvbXBvc2l0aW9uICpjb21wOworICBHc3RWaWRlb092ZXJsYXlSZWN0YW5nbGUgKnJlY3Q7CisgIEdzdFZpZGVvTWV0YSAqb3ZlcmxheV9tZXRhOworICBnaW50IHgsIHksIHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgdmlkZW9fd2lkdGggPQorICAgICAgR1NUX1ZJREVPX0lORk9fV0lEVEggKCZHU1RfVklERU9fRklMVEVSIChvdmVybGF5KS0+aW5faW5mbyk7CisgIGdpbnQgdmlkZW9faGVpZ2h0ID0KKyAgICAgIEdTVF9WSURFT19JTkZPX0hFSUdIVCAoJkdTVF9WSURFT19GSUxURVIgKG92ZXJsYXkpLT5pbl9pbmZvKTsKKworICBpZiAob3ZlcmxheS0+Y29tcCkgeworICAgIGdzdF92aWRlb19vdmVybGF5X2NvbXBvc2l0aW9uX3VucmVmIChvdmVybGF5LT5jb21wKTsKKyAgICBvdmVybGF5LT5jb21wID0gTlVMTDsKKyAgfQorCisgIGlmIChvdmVybGF5LT5hbHBoYSA9PSAwLjAgfHwgb3ZlcmxheS0+cGl4ZWxzID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIG92ZXJsYXlfbWV0YSA9IGdzdF9idWZmZXJfZ2V0X3ZpZGVvX21ldGEgKG92ZXJsYXktPnBpeGVscyk7CisKKyAgcG9zaXRpb25pbmdfbW9kZSA9IG92ZXJsYXktPnBvc2l0aW9uaW5nX21vZGU7CisgIEdTVF9ERUJVR19PQkpFQ1QgKG92ZXJsYXksICJvdmVybGF5IHBvc2l0aW9uaW5nIG1vZGUgJWQiLCBwb3NpdGlvbmluZ19tb2RlKTsKKworICB3aWR0aCA9IG92ZXJsYXktPm92ZXJsYXlfd2lkdGg7CisgIGlmICh3aWR0aCA9PSAwKQorICAgIHdpZHRoID0gb3ZlcmxheV9tZXRhLT53aWR0aDsKKworICBoZWlnaHQgPSBvdmVybGF5LT5vdmVybGF5X2hlaWdodDsKKyAgaWYgKGhlaWdodCA9PSAwKQorICAgIGhlaWdodCA9IG92ZXJsYXlfbWV0YS0+aGVpZ2h0OworCisgIGlmIChwb3NpdGlvbmluZ19tb2RlID09IEdTVF9HREtfUElYQlVGX1BPU0lUSU9OSU5HX1BJWEVMU19BQlNPTFVURSkgeworICAgIHggPSBvdmVybGF5LT5vZmZzZXRfeCArIChvdmVybGF5LT5yZWxhdGl2ZV94ICogd2lkdGgpICsKKyAgICAgICAgKG92ZXJsYXktPmNvZWZfeCAqIHZpZGVvX3dpZHRoKTsKKyAgICB5ID0gb3ZlcmxheS0+b2Zmc2V0X3kgKyAob3ZlcmxheS0+cmVsYXRpdmVfeSAqIGhlaWdodCkgKworICAgICAgICAob3ZlcmxheS0+Y29lZl95ICogdmlkZW9faGVpZ2h0KTsKKyAgfSBlbHNlIHsKKyAgICB4ID0gb3ZlcmxheS0+b2Zmc2V0X3ggPCAwID8KKyAgICAgICAgdmlkZW9fd2lkdGggKyBvdmVybGF5LT5vZmZzZXRfeCAtIHdpZHRoICsKKyAgICAgICAgKG92ZXJsYXktPnJlbGF0aXZlX3ggKiB2aWRlb193aWR0aCkgOgorICAgICAgICBvdmVybGF5LT5vZmZzZXRfeCArIChvdmVybGF5LT5yZWxhdGl2ZV94ICogdmlkZW9fd2lkdGgpOworICAgIHkgPSBvdmVybGF5LT5vZmZzZXRfeSA8IDAgPworICAgICAgICB2aWRlb19oZWlnaHQgKyBvdmVybGF5LT5vZmZzZXRfeSAtIGhlaWdodCArCisgICAgICAgIChvdmVybGF5LT5yZWxhdGl2ZV95ICogdmlkZW9faGVpZ2h0KSA6CisgICAgICAgIG92ZXJsYXktPm9mZnNldF95ICsgKG92ZXJsYXktPnJlbGF0aXZlX3kgKiB2aWRlb19oZWlnaHQpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAob3ZlcmxheSwgIm92ZXJsYXkgaW1hZ2UgZGltZW5zaW9uczogJWQgeCAlZCwgYWxwaGE9JS4yZiIsCisgICAgICBvdmVybGF5X21ldGEtPndpZHRoLCBvdmVybGF5X21ldGEtPmhlaWdodCwgb3ZlcmxheS0+YWxwaGEpOworICBHU1RfREVCVUdfT0JKRUNUIChvdmVybGF5LCAicHJvcGVydGllczogeCx5OiAlZCwlZCAiCisgICAgICAiKCVnJSUsJWclJSkgY29lZiAoJWclJSwlZyUlKSAtIFd4SDogJWR4JWQiLAorICAgICAgb3ZlcmxheS0+b2Zmc2V0X3gsIG92ZXJsYXktPm9mZnNldF95LAorICAgICAgb3ZlcmxheS0+cmVsYXRpdmVfeCAqIDEwMC4wLCBvdmVybGF5LT5yZWxhdGl2ZV95ICogMTAwLjAsCisgICAgICBvdmVybGF5LT5jb2VmX3ggKiAxMDAuMCwgb3ZlcmxheS0+Y29lZl95ICogMTAwLjAsCisgICAgICBvdmVybGF5LT5vdmVybGF5X2hlaWdodCwgb3ZlcmxheS0+b3ZlcmxheV93aWR0aCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKG92ZXJsYXksICJvdmVybGF5IHJlbmRlcmVkOiAlZCB4ICVkIEAgJWQsJWQgKG9udG8gJWQgeCAlZCkiLAorICAgICAgd2lkdGgsIGhlaWdodCwgeCwgeSwgdmlkZW9fd2lkdGgsIHZpZGVvX2hlaWdodCk7CisKKyAgcmVjdCA9IGdzdF92aWRlb19vdmVybGF5X3JlY3RhbmdsZV9uZXdfcmF3IChvdmVybGF5LT5waXhlbHMsCisgICAgICB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBHU1RfVklERU9fT1ZFUkxBWV9GT1JNQVRfRkxBR19OT05FKTsKKworICBpZiAob3ZlcmxheS0+YWxwaGEgIT0gMS4wKQorICAgIGdzdF92aWRlb19vdmVybGF5X3JlY3RhbmdsZV9zZXRfZ2xvYmFsX2FscGhhIChyZWN0LCBvdmVybGF5LT5hbHBoYSk7CisKKyAgY29tcCA9IGdzdF92aWRlb19vdmVybGF5X2NvbXBvc2l0aW9uX25ldyAocmVjdCk7CisgIGdzdF92aWRlb19vdmVybGF5X3JlY3RhbmdsZV91bnJlZiAocmVjdCk7CisKKyAgb3ZlcmxheS0+Y29tcCA9IGNvbXA7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X2JlZm9yZV90cmFuc2Zvcm0gKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RCdWZmZXIgKiBvdXRidWYpCit7CisgIEdzdENsb2NrVGltZSBzdHJlYW1fdGltZTsKKyAgR3N0R2RrUGl4YnVmT3ZlcmxheSAqb3ZlcmxheSA9IEdTVF9HREtfUElYQlVGX09WRVJMQVkgKHRyYW5zKTsKKyAgZ2Jvb2xlYW4gc2V0X3Bhc3N0aHJvdWdoID0gRkFMU0U7CisKKyAgc3RyZWFtX3RpbWUgPSBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJnRyYW5zLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSk7CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdHJlYW1fdGltZSkpCisgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAodHJhbnMpLCBzdHJlYW1fdGltZSk7CisKKyAgLyogbm93IHByb3BlcnRpZXMgaGF2ZSBiZWVuIHN5bmMnZWQ7IG1heWJlIG5lZWQgdG8gdXBkYXRlIGNvbXBvc2l0aW9uICovCisgIEdTVF9PQkpFQ1RfTE9DSyAob3ZlcmxheSk7CisgIGlmIChHX1VOTElLRUxZIChvdmVybGF5LT51cGRhdGVfY29tcG9zaXRpb24pKSB7CisgICAgZ3N0X2dka19waXhidWZfb3ZlcmxheV91cGRhdGVfY29tcG9zaXRpb24gKG92ZXJsYXkpOworICAgIG92ZXJsYXktPnVwZGF0ZV9jb21wb3NpdGlvbiA9IEZBTFNFOworICAgIHNldF9wYXNzdGhyb3VnaCA9IFRSVUU7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKG92ZXJsYXkpOworCisgIC8qIGRldGVybWluZSBwYXNzdGhyb3VnaCBtb2RlIHNvIHRoZSBidWZmZXIgaXMgd3JpdGFibGUgaWYgbmVlZGVkCisgICAqIHdoZW4gcGFzc2VkIGludG8gX3RyYW5zZm9ybV9pcCAqLworICBpZiAoR19VTkxJS0VMWSAoc2V0X3Bhc3N0aHJvdWdoKSkKKyAgICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X3Bhc3N0aHJvdWdoICh0cmFucywgb3ZlcmxheS0+Y29tcCA9PSBOVUxMKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9nZGtfcGl4YnVmX292ZXJsYXlfdHJhbnNmb3JtX2ZyYW1lX2lwIChHc3RWaWRlb0ZpbHRlciAqIGZpbHRlciwKKyAgICBHc3RWaWRlb0ZyYW1lICogZnJhbWUpCit7CisgIEdzdEdka1BpeGJ1Zk92ZXJsYXkgKm92ZXJsYXkgPSBHU1RfR0RLX1BJWEJVRl9PVkVSTEFZIChmaWx0ZXIpOworCisgIGlmIChvdmVybGF5LT5jb21wICE9IE5VTEwpCisgICAgZ3N0X3ZpZGVvX292ZXJsYXlfY29tcG9zaXRpb25fYmxlbmQgKG92ZXJsYXktPmNvbXAsIGZyYW1lKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CmRpZmYgLS1naXQgYS9leHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmggYi9leHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ4MGIwMQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zm92ZXJsYXkuaApAQCAtMCwwICsxLDk0IEBACisvKiBHU3RyZWFtZXIgR2RrUGl4YnVmIG92ZXJsYXkKKyAqIENvcHlyaWdodCAoQykgMjAxMi0yMDE0IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfR1NUX0dES19QSVhCVUZfT1ZFUkxBWV9IXworI2RlZmluZSBfR1NUX0dES19QSVhCVUZfT1ZFUkxBWV9IXworCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZmlsdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLW92ZXJsYXktY29tcG9zaXRpb24uaD4KKworI2luY2x1ZGUgPGdkay1waXhidWYvZ2RrLXBpeGJ1Zi5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfR0RLX1BJWEJVRl9PVkVSTEFZICAgKGdzdF9nZGtfcGl4YnVmX292ZXJsYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0dES19QSVhCVUZfT1ZFUkxBWShvYmopICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0dES19QSVhCVUZfT1ZFUkxBWSxHc3RHZGtQaXhidWZPdmVybGF5KSkKKyNkZWZpbmUgR1NUX0dES19QSVhCVUZfT1ZFUkxBWV9DTEFTUyhrbGFzcykgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9HREtfUElYQlVGX09WRVJMQVksR3N0R2RrUGl4YnVmT3ZlcmxheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0dES19QSVhCVUZfT1ZFUkxBWShvYmopICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0dES19QSVhCVUZfT1ZFUkxBWSkpCisjZGVmaW5lIEdTVF9JU19HREtfUElYQlVGX09WRVJMQVlfQ0xBU1Mob2JqKSAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0dES19QSVhCVUZfT1ZFUkxBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RHZGtQaXhidWZPdmVybGF5IEdzdEdka1BpeGJ1Zk92ZXJsYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0R2RrUGl4YnVmT3ZlcmxheUNsYXNzIEdzdEdka1BpeGJ1Zk92ZXJsYXlDbGFzczsKKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX0dES19QSVhCVUZfUE9TSVRJT05JTkdfUElYRUxTX1JFTEFUSVZFX1RPX0VER0VTLAorICBHU1RfR0RLX1BJWEJVRl9QT1NJVElPTklOR19QSVhFTFNfQUJTT0xVVEUKK30gR3N0R2RrUGl4YnVmUG9zaXRpb25pbmdNb2RlOworCisvKioKKyAqIEdzdEdka1BpeGJ1Zk92ZXJsYXk6CisgKgorICogVGhlIG9wYXF1ZSBlbGVtZW50IGluc3RhbmNlIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IF9Hc3RHZGtQaXhidWZPdmVybGF5Cit7CisgIEdzdFZpZGVvRmlsdGVyICAgICAgICAgICAgICAgdmlkZW9maWx0ZXI7CisKKyAgLyogcHJvcGVydGllcyAqLworICBnY2hhciAgICAgICAgICAgICAgICAgICAgICAqIGxvY2F0aW9uOworCisgIC8qIHBpeGJ1ZiBzZXQgdmlhIHBpeGJ1ZiBwcm9wZXJ0eSAqLworICBHZGtQaXhidWYgICAgICAgICAgICAgICAgICAqIHBpeGJ1ZjsKKworICBnaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF94OworICBnaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF95OworCisgIGdkb3VibGUgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVfeDsKKyAgZ2RvdWJsZSAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZV95OworCisgIGdkb3VibGUgICAgICAgICAgICAgICAgICAgICAgY29lZl94OworICBnZG91YmxlICAgICAgICAgICAgICAgICAgICAgIGNvZWZfeTsKKworICBHc3RHZGtQaXhidWZQb3NpdGlvbmluZ01vZGUgIHBvc2l0aW9uaW5nX21vZGU7CisKKyAgZ2ludCAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5X3dpZHRoOworICBnaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlfaGVpZ2h0OworCisgIGdkb3VibGUgICAgICAgICAgICAgICAgICAgICAgYWxwaGE7CisKKyAgLyogdGhlIGxvYWRlZCBpbWFnZSwgYXMgQkdSQS9BUkdCIHBpeGVscywgd2l0aCBHc3RWaWRlb01ldGEgKi8KKyAgR3N0QnVmZmVyICAgICAgICAgICAgICAgICAgKiBwaXhlbHM7ICAgICAgICAgICAgICAgLyogT0JKRUNUX0xPQ0sgKi8KKworICBHc3RWaWRlb092ZXJsYXlDb21wb3NpdGlvbiAqIGNvbXA7CisKKyAgLyogcmVuZGVyIHBvc2l0aW9uIG9yIGRpbWVuc2lvbiBoYXMgY2hhbmdlZCAqLworICBnYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9jb21wb3NpdGlvbjsKK307CisKK3N0cnVjdCBfR3N0R2RrUGl4YnVmT3ZlcmxheUNsYXNzCit7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgIHZpZGVvZmlsdGVyX2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2dka19waXhidWZfb3ZlcmxheV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmcGx1Z2luLmMgYi9leHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZwbHVnaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjU4YjlkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmcGx1Z2luLmMKQEAgLTAsMCArMSwxMDggQEAKKy8qIEdTdHJlYW1lciBHZGtQaXhidWYgcGx1Z2luCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSAyMDAzIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImdzdGdka3BpeGJ1ZmRlYy5oIgorI2luY2x1ZGUgImdzdGdka3BpeGJ1Zm92ZXJsYXkuaCIKKyNpbmNsdWRlICJnc3RnZGtwaXhidWZzaW5rLmgiCisKKworI2lmIDAKK3N0YXRpYyB2b2lkIGdzdF9nZGtfcGl4YnVmX3R5cGVfZmluZCAoR3N0VHlwZUZpbmQgKiB0ZiwgZ3BvaW50ZXIgaWdub3JlKTsKKworI2RlZmluZSBHU1RfR0RLX1BJWEJVRl9UWVBFX0ZJTkRfU0laRSAxMDI0CisKK3N0YXRpYyB2b2lkCitnc3RfZ2RrX3BpeGJ1Zl90eXBlX2ZpbmQgKEdzdFR5cGVGaW5kICogdGYsIGdwb2ludGVyIGlnbm9yZSkKK3sKKyAgZ3VpbnQ4ICpkYXRhOworICBHZGtQaXhidWZMb2FkZXIgKnBpeGJ1Zl9sb2FkZXI7CisgIEdka1BpeGJ1ZkZvcm1hdCAqZm9ybWF0OworCisgIGRhdGEgPSBnc3RfdHlwZV9maW5kX3BlZWsgKHRmLCAwLCBHU1RfR0RLX1BJWEJVRl9UWVBFX0ZJTkRfU0laRSk7CisgIGlmIChkYXRhID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIEdTVF9ERUJVRyAoImNyZWF0aW5nIG5ldyBsb2FkZXIiKTsKKworICBwaXhidWZfbG9hZGVyID0gZ2RrX3BpeGJ1Zl9sb2FkZXJfbmV3ICgpOworCisgIGdka19waXhidWZfbG9hZGVyX3dyaXRlIChwaXhidWZfbG9hZGVyLCBkYXRhLCBHU1RfR0RLX1BJWEJVRl9UWVBFX0ZJTkRfU0laRSwKKyAgICAgIE5VTEwpOworCisgIGZvcm1hdCA9IGdka19waXhidWZfbG9hZGVyX2dldF9mb3JtYXQgKHBpeGJ1Zl9sb2FkZXIpOworCisgIGlmIChmb3JtYXQgIT0gTlVMTCkgeworICAgIEdzdENhcHMgKmNhcHM7CisgICAgZ2NoYXIgKipwOworICAgIGdjaGFyICoqbWxpc3QgPSBnZGtfcGl4YnVmX2Zvcm1hdF9nZXRfbWltZV90eXBlcyAoZm9ybWF0KTsKKworICAgIGZvciAocCA9IG1saXN0OyAqcDsgKytwKSB7CisgICAgICBHU1RfREVCVUcgKCJzdWdnZXN0aW5nIG1pbWUgdHlwZSAlcyIsICpwKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgqcCwgTlVMTCk7CisgICAgICBnc3RfdHlwZV9maW5kX3N1Z2dlc3QgKHRmLCBHU1RfVFlQRV9GSU5EX01JTklNVU0sIGNhcHMpOworICAgICAgZ3N0X2NhcHNfZnJlZSAoY2Fwcyk7CisgICAgfQorICAgIGdfc3RyZnJlZXYgKG1saXN0KTsKKyAgfQorCisgIEdTVF9ERUJVRyAoImNsb3NpbmcgcGl4YnVmIGxvYWRlciwgaG9wZSBpdCBkb2Vzbid0IGhhbmcgLi4uIik7CisgIC8qIGxpYnJzdmcgMi40LnggaGFzIGEgYnVnIHdoZXJlIGl0IHRyaWdnZXJzIGFuIGVuZGxlc3MgbG9vcCBpbiB0cnlpbmcKKyAgICAgdG8gY2xvc2UgYSBnemlwIHRoYXQncyBub3QgYW4gc3ZnOyBmaXhlZCB1cHN0cmVhbSBidXQgbm8gZ29vZCB3YXkKKyAgICAgdG8gd29yayBhcm91bmQgaXQgKi8KKyAgZ2RrX3BpeGJ1Zl9sb2FkZXJfY2xvc2UgKHBpeGJ1Zl9sb2FkZXIsIE5VTEwpOworICBHU1RfREVCVUcgKCJjbG9zZWQgcGl4YnVmIGxvYWRlciIpOworICBnX29iamVjdF91bnJlZiAoR19PQkpFQ1QgKHBpeGJ1Zl9sb2FkZXIpKTsKK30KKyNlbmRpZgorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImdka3BpeGJ1ZmRlYyIsIEdTVF9SQU5LX1NFQ09OREFSWSwKKyAgICAgICAgICBHU1RfVFlQRV9HREtfUElYQlVGX0RFQykpCisgICAgcmV0dXJuIEZBTFNFOworCisjaWYgMAorICBnc3RfdHlwZV9maW5kX3JlZ2lzdGVyIChwbHVnaW4sICJpbWFnZS8qIiwgR1NUX1JBTktfTUFSR0lOQUwsCisgICAgICBnc3RfZ2RrX3BpeGJ1Zl90eXBlX2ZpbmQsIE5VTEwsIEdTVF9DQVBTX0FOWSwgTlVMTCk7CisjZW5kaWYKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJnZGtwaXhidWZvdmVybGF5IiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9HREtfUElYQlVGX09WRVJMQVkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJnZGtwaXhidWZzaW5rIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9HREtfUElYQlVGX1NJTkspKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGdka3BpeGJ1ZiwKKyAgICAiR2RrUGl4YnVmLWJhc2VkIGltYWdlIGRlY29kZXIsIG92ZXJsYXkgYW5kIHNpbmsiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2V4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZnNpbmsuYyBiL2V4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZnNpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzRjZjNkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5jCkBAIC0wLDAgKzEsNDM5IEBACisvKiBHU3RyZWFtZXIgR2RrUGl4YnVmIHNpbmsKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWdka3BpeGJ1ZnNpbmsKKyAqCisgKiBUaGlzIHNpbmsgZWxlbWVudCB0YWtlcyBSR0Igb3IgUkdCQSBpbWFnZXMgYXMgaW5wdXQgYW5kIHdyYXBzIHRoZW0gaW50bworICogI0dka1BpeGJ1ZiBvYmplY3RzLCBmb3IgZWFzeSBzYXZpbmcgdG8gZmlsZSB2aWEgdGhlCisgKiBHZGtQaXhidWYgbGlicmFyeSBBUEkgb3IgZGlzcGxheWluZyBpbiBHdGsrIGFwcGxpY2F0aW9ucyAoZS5nLiB1c2luZworICogdGhlICNHdGtJbWFnZSB3aWRnZXQpLgorICoKKyAqIFRoZXJlIGFyZSB0d28gd2F5cyB0byB1c2UgdGhpcyBlbGVtZW50IGFuZCBvYnRhaW4gdGhlICNHZGtQaXhidWYgb2JqZWN0cworICogY3JlYXRlZDoKKyAqIDxpdGVtaXplZGxpc3Q+CisgKiA8bGlzdGl0ZW0+CisgKiBXYXRjaGluZyBmb3IgZWxlbWVudCBtZXNzYWdlcyBuYW1lZCA8Y2xhc3NuYW1lPiZxdW90O3ByZXJvbGwtcGl4YnVmJnF1b3Q7CisgKiA8L2NsYXNzbmFtZT4gb3IgPGNsYXNzbmFtZT4mcXVvdDtwaXhidWYmcXVvdDs8L2NsYXNzbmFtZT4gb24gdGhlIGJ1cywgd2hpY2gKKyAqIHdpbGwgYmUgcG9zdGVkIHdoZW5ldmVyIGFuIGltYWdlIHdvdWxkIHVzdWFsbHkgYmUgcmVuZGVyZWQuIFNlZSBiZWxvdyBmb3IKKyAqIG1vcmUgZGV0YWlscyBvbiB0aGVzZSBtZXNzYWdlcyBhbmQgaG93IHRvIGV4dHJhY3QgdGhlIHBpeGJ1ZiBvYmplY3QKKyAqIGNvbnRhaW5lZCBpbiB0aGVtLgorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4KKyAqIFJldHJpZXZpbmcgdGhlIGN1cnJlbnQgcGl4YnVmIHZpYSB0aGUgI0dzdEdka1BpeGJ1ZlNpbms6bGFzdC1waXhidWYgcHJvcGVydHkKKyAqIHdoZW4gbmVlZGVkLiBUaGlzIGlzIHRoZSBlYXNpZXN0IHdheSB0byBnZXQgYXQgcGl4YnVmcyBmb3Igc25hcHNob3R0aW5nCisgKiBwdXJwb3NlcyAtIGp1c3Qgd2FpdCB1bnRpbCB0aGUgcGlwZWxpbmUgaXMgcHJlcm9sbGVkIChBU1lOQ19ET05FIG1lc3NhZ2UKKyAqIG9uIHRoZSBidXMpLCB0aGVuIHJlYWQgdGhlIHByb3BlcnR5LiBJZiB5b3UgdXNlIHRoaXMgbWV0aG9kLCB5b3UgbWF5IHdhbnQKKyAqIHRvIGRpc2FibGUgbWVzc2FnZSBwb3N0aW5nIGJ5IHNldHRpbmcgdGhlICNHc3RHZGtQaXhidWZTaW5rOnBvc3QtbWVzc2FnZXMKKyAqIHByb3BlcnR5IHRvICVGQUxTRS4gVGhpcyBhdm9pZHMgdW5uZWNlc3NhcnkgbWVtb3J5IG92ZXJoZWFkLgorICogPC9saXN0aXRlbT4KKyAqIDwvaXRlbWl6ZWRsaXN0PgorICoKKyAqIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBlbGVtZW50IGlzIHRvIGFic3RyYWN0IGF3YXkgdGhlICNHc3RCdWZmZXIgdG8KKyAqICNHZGtQaXhidWYgY29udmVyc2lvbi4gT3RoZXIgdGhhbiB0aGF0IGl0J3MgdmVyeSBzaW1pbGFyIHRvIHRoZSBmYWtlc2luaworICogZWxlbWVudC4KKyAqCisgKiBUaGlzIGVsZW1lbnQgaXMgbWVhbnQgZm9yIGVhc3kgbm8taGFzc2xlIHZpZGVvIHNuYXBzaG90dGluZy4gSXQgaXMgbm90CisgKiBzdWl0YWJsZSBmb3IgdmlkZW8gcGxheWJhY2sgb3IgdmlkZW8gZGlzcGxheSBhdCBoaWdoIGZyYW1lcmF0ZXMuIFVzZQorICogeGltYWdlc2luaywgeHZpbWFnZXNpbmsgb3Igc29tZSBvdGhlciBzdWl0YWJsZSB2aWRlbyBzaW5rIGluIGNvbm5lY3Rpb24KKyAqIHdpdGggdGhlICNHc3RYT3ZlcmxheSBpbnRlcmZhY2UgaW5zdGVhZCBpZiB5b3Ugd2FudCB0byBkbyB2aWRlbyBwbGF5YmFjay4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+TWVzc2FnZSBkZXRhaWxzPC90aXRsZT4KKyAqIEFzIG1lbnRpb25lZCBhYm92ZSwgdGhpcyBlbGVtZW50IHdpbGwgYnkgZGVmYXVsdCBwb3N0IGVsZW1lbnQgbWVzc2FnZXMKKyAqIGNvbnRhaW5pbmcgc3RydWN0dXJlcyBuYW1lZCA8Y2xhc3NuYW1lPiZxdW90O3ByZXJvbGwtcGl4YnVmJnF1b3Q7CisgKiA8L2NsYXNzbmFtZT4gb3IgPGNsYXNzbmFtZT4mcXVvdDtwaXhidWYmcXVvdDs8L2NsYXNzbmFtZT4gb24gdGhlIGJ1cyAodGhpcworICogY2FuIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgdGhlICNHc3RHZGtQaXhidWZTaW5rOnBvc3QtbWVzc2FnZXMgcHJvcGVydHkKKyAqIHRvICVGQUxTRSB0aG91Z2gpLiBUaGUgZWxlbWVudCBtZXNzYWdlIHN0cnVjdHVyZSBoYXMgdGhlIGZvbGxvd2luZyBmaWVsZHM6CisgKiA8aXRlbWl6ZWRsaXN0PgorICogPGxpc3RpdGVtPgorICogICA8Y2xhc3NuYW1lPiZxdW90O3BpeGJ1ZiZxdW90OzwvY2xhc3NuYW1lPjogdGhlICNHZGtQaXhidWYgb2JqZWN0CisgKiA8L2xpc3RpdGVtPgorICogPGxpc3RpdGVtPgorICogICA8Y2xhc3NuYW1lPiZxdW90O3BpeGVsLWFzcGVjdC1yYXRpbyZxdW90OzwvY2xhc3NuYW1lPjogdGhlIHBpeGVsIGFzcGVjdAorICogICByYXRpbyAoUEFSKSBvZiB0aGUgaW5wdXQgaW1hZ2UgKHRoaXMgZmllbGQgY29udGFpbnMgYSAjR3N0RnJhY3Rpb24pOyB0aGUKKyAqICAgUEFSIGlzIHVzdWFsbHkgMToxIGZvciBpbWFnZXMsIGJ1dCBpcyBvZnRlbiBzb21ldGhpbmcgbm9uLTE6MSBpbiB0aGUgY2FzZQorICogICBvZiB2aWRlbyBpbnB1dC4gSW4gdGhpcyBjYXNlIHRoZSBpbWFnZSBtYXkgYmUgZGlzdG9ydGVkIGFuZCB5b3UgbWF5IG5lZWQKKyAqICAgdG8gcmVzY2FsZSBpdCBhY2NvcmRpbmdseSBiZWZvcmUgc2F2aW5nIGl0IHRvIGZpbGUgb3IgZGlzcGxheWluZyBpdC4gVGhpcworICogICBjYW4gZWFzaWx5IGJlIGRvbmUgdXNpbmcgZ2RrX3BpeGJ1Zl9zY2FsZSgpICh0aGUgcmVhc29uIHRoaXMgaXMgbm90IGRvbmUKKyAqICAgYXV0b21hdGljYWxseSBpcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3aWxsIG9mdGVuIHNjYWxlIHRoZSBpbWFnZSBhbnl3YXkKKyAqICAgYWNjb3JkaW5nIHRvIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgd2luZG93LCBpbiB3aGljaCBjYXNlIGl0IGlzIG11Y2ggbW9yZQorICogICBlZmZpY2llbnQgdG8gb25seSBzY2FsZSBvbmNlIHJhdGhlciB0aGFuIHR3aWNlKS4gWW91IGNhbiBwdXQgYSB2aWRlb3NjYWxlCisgKiAgIGVsZW1lbnQgYW5kIGEgY2Fwc2ZpbHRlciBlbGVtZW50IHdpdGgKKyAqICAgPGxpdGVyYWw+dmlkZW8veC1yYXctcmdiLHBpeGVsLWFzcGVjdC1yYXRpbz0oZnJhY3Rpb24pMS8xPC9saXRlcmFsPiBjYXBzCisgKiAgIGluIGZyb250IG9mIHRoaXMgZWxlbWVudCB0byBtYWtlIHN1cmUgdGhlIHBpeGJ1ZnMgYWx3YXlzIGhhdmUgYSAxOjEgUEFSLgorICogPC9saXN0aXRlbT4KKyAqIDwvaXRlbWl6ZWRsaXN0PgorICogPC9yZWZzZWN0Mj4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLW0gLXYgdmlkZW90ZXN0c3JjIG51bS1idWZmZXJzPTEgISBnZGtwaXhidWZzaW5rCisgKiBdfCBQcm9jZXNzIG9uZSBzaW5nbGUgdGVzdCBpbWFnZSBhcyBwaXhidWYgKG5vdGUgdGhhdCB0aGUgb3V0cHV0IHlvdSBzZWUgd2lsbAorICogYmUgc2xpZ2h0bHkgbWlzbGVhZGluZy4gVGhlIG1lc3NhZ2Ugc3RydWN0dXJlIGRvZXMgY29udGFpbiBhIHZhbGlkIHBpeGJ1ZgorICogb2JqZWN0IGV2ZW4gaWYgdGhlIHN0cnVjdHVyZSBzdHJpbmcgc2F5cyAmYXBvczsoTlVMTCkmYXBvczspLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RnZGtwaXhidWZzaW5rLmgiCisKKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworI2RlZmluZSBERUZBVUxUX1NFTkRfTUVTU0FHRVMgVFJVRQorI2RlZmluZSBERUZBVUxUX1BPU1RfTUVTU0FHRVMgVFJVRQorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9QT1NUX01FU1NBR0VTLAorICBQUk9QX0xBU1RfUElYQlVGLAorICBQUk9QX0xBU1QKK307CisKKworR19ERUZJTkVfVFlQRSAoR3N0R2RrUGl4YnVmU2luaywgZ3N0X2dka19waXhidWZfc2luaywgR1NUX1RZUEVfVklERU9fU0lOSyk7CisKK3N0YXRpYyB2b2lkIGdzdF9nZGtfcGl4YnVmX3Npbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2dka19waXhidWZfc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZ2RrX3BpeGJ1Zl9zaW5rX3N0YXJ0IChHc3RCYXNlU2luayAqIGJhc2VzaW5rKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZ2RrX3BpeGJ1Zl9zaW5rX3N0b3AgKEdzdEJhc2VTaW5rICogYmFzZXNpbmspOworc3RhdGljIGdib29sZWFuIGdzdF9nZGtfcGl4YnVmX3Npbmtfc2V0X2NhcHMgKEdzdEJhc2VTaW5rICogYmFzZXNpbmssCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2dka19waXhidWZfc2lua19yZW5kZXIgKEdzdEJhc2VTaW5rICogYnNpbmssCisgICAgR3N0QnVmZmVyICogYnVmKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9nZGtfcGl4YnVmX3NpbmtfcHJlcm9sbCAoR3N0QmFzZVNpbmsgKiBic2luaywKKyAgICBHc3RCdWZmZXIgKiBidWYpOworc3RhdGljIEdka1BpeGJ1ZiAqZ3N0X2dka19waXhidWZfc2lua19nZXRfcGl4YnVmX2Zyb21fYnVmZmVyIChHc3RHZGtQaXhidWZTaW5rICoKKyAgICBzaW5rLCBHc3RCdWZmZXIgKiBidWYpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgcGl4YnVmc2lua19zaW5rX2ZhY3RvcnkgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoIlJHQiIpICI7IgorICAgICAgICBHU1RfVklERU9fQ0FQU19NQUtFICgiUkdCQSIpKQorICAgICk7CisKK3N0YXRpYyB2b2lkCitnc3RfZ2RrX3BpeGJ1Zl9zaW5rX2NsYXNzX2luaXQgKEdzdEdka1BpeGJ1ZlNpbmtDbGFzcyAqIGtsYXNzKQoreworICBHc3RCYXNlU2lua0NsYXNzICpiYXNlc2lua19jbGFzcyA9IEdTVF9CQVNFX1NJTktfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiR2RrUGl4YnVmIHNpbmsiLAorICAgICAgIlNpbmsvVmlkZW8iLCAiT3V0cHV0IGltYWdlcyBhcyBHZGtQaXhidWYgb2JqZWN0cyBpbiBidXMgbWVzc2FnZXMiLAorICAgICAgIlRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmcGl4YnVmc2lua19zaW5rX2ZhY3RvcnkpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9nZGtfcGl4YnVmX3Npbmtfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfZ2RrX3BpeGJ1Zl9zaW5rX2dldF9wcm9wZXJ0eTsKKworICAvKioKKyAgICogR3N0R2RrUGl4YnVmOnBvc3QtbWVzc2FnZXM6CisgICAqCisgICAqIFBvc3QgbWVzc2FnZXMgb24gdGhlIGJ1cyBjb250YWluaW5nIHBpeGJ1ZnMuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BPU1RfTUVTU0FHRVMsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInBvc3QtbWVzc2FnZXMiLCAiUG9zdCBNZXNzYWdlcyIsCisgICAgICAgICAgIldoZXRoZXIgdG8gcG9zdCBtZXNzYWdlcyBjb250YWluaW5nIHBpeGJ1ZnMgb24gdGhlIGJ1cyIsCisgICAgICAgICAgREVGQVVMVF9QT1NUX01FU1NBR0VTLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0xBU1RfUElYQlVGLAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoImxhc3QtcGl4YnVmIiwgIkxhc3QgUGl4YnVmIiwKKyAgICAgICAgICAiTGFzdCBHZGtQaXhidWYgb2JqZWN0IHJlbmRlcmVkIiwgR0RLX1RZUEVfUElYQlVGLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgYmFzZXNpbmtfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9nZGtfcGl4YnVmX3Npbmtfc3RhcnQpOworICBiYXNlc2lua19jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZ2RrX3BpeGJ1Zl9zaW5rX3N0b3ApOworICBiYXNlc2lua19jbGFzcy0+cmVuZGVyID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9nZGtfcGl4YnVmX3NpbmtfcmVuZGVyKTsKKyAgYmFzZXNpbmtfY2xhc3MtPnByZXJvbGwgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2dka19waXhidWZfc2lua19wcmVyb2xsKTsKKyAgYmFzZXNpbmtfY2xhc3MtPnNldF9jYXBzID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9nZGtfcGl4YnVmX3Npbmtfc2V0X2NhcHMpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2dka19waXhidWZfc2lua19pbml0IChHc3RHZGtQaXhidWZTaW5rICogc2luaykKK3sKKyAgc2luay0+cGFyX24gPSAwOworICBzaW5rLT5wYXJfZCA9IDA7CisgIHNpbmstPmhhc19hbHBoYSA9IEZBTFNFOworICBzaW5rLT5sYXN0X3BpeGJ1ZiA9IE5VTEw7CisgIHNpbmstPnBvc3RfbWVzc2FnZXMgPSBERUZBVUxUX1BPU1RfTUVTU0FHRVM7CisKKyAgLyogd2UncmUgbm90IGEgcmVhbCB2aWRlbyBzaW5rLCB3ZSBqdXN0IGRlcml2ZSBmcm9tIEdzdFZpZGVvU2luayBpbiBjYXNlCisgICAqIGFueXRoaW5nIGludGVyZXN0aW5nIGlzIGFkZGVkIHRvIGl0IGluIGZ1dHVyZSAqLworICBnc3RfYmFzZV9zaW5rX3NldF9tYXhfbGF0ZW5lc3MgKEdTVF9CQVNFX1NJTksgKHNpbmspLCAtMSk7CisgIGdzdF9iYXNlX3Npbmtfc2V0X3Fvc19lbmFibGVkIChHU1RfQkFTRV9TSU5LIChzaW5rKSwgRkFMU0UpOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2dka19waXhidWZfc2lua19zdGFydCAoR3N0QmFzZVNpbmsgKiBiYXNlc2luaykKK3sKKyAgR1NUX0xPR19PQkpFQ1QgKGJhc2VzaW5rLCAic3RhcnQiKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZ2RrX3BpeGJ1Zl9zaW5rX3N0b3AgKEdzdEJhc2VTaW5rICogYmFzZXNpbmspCit7CisgIEdzdEdka1BpeGJ1ZlNpbmsgKnNpbmsgPSBHU1RfR0RLX1BJWEJVRl9TSU5LIChiYXNlc2luayk7CisKKyAgR1NUX1ZJREVPX1NJTktfV0lEVEggKHNpbmspID0gMDsKKyAgR1NUX1ZJREVPX1NJTktfSEVJR0hUIChzaW5rKSA9IDA7CisKKyAgc2luay0+cGFyX24gPSAwOworICBzaW5rLT5wYXJfZCA9IDA7CisgIHNpbmstPmhhc19hbHBoYSA9IEZBTFNFOworCisgIGlmIChzaW5rLT5sYXN0X3BpeGJ1ZikgeworICAgIGdfb2JqZWN0X3VucmVmIChzaW5rLT5sYXN0X3BpeGJ1Zik7CisgICAgc2luay0+bGFzdF9waXhidWYgPSBOVUxMOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNpbmssICJzdG9wIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2dka19waXhidWZfc2lua19zZXRfY2FwcyAoR3N0QmFzZVNpbmsgKiBiYXNlc2luaywgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdEdka1BpeGJ1ZlNpbmsgKnNpbmsgPSBHU1RfR0RLX1BJWEJVRl9TSU5LIChiYXNlc2luayk7CisgIEdzdFZpZGVvSW5mbyBpbmZvOworICBHc3RWaWRlb0Zvcm1hdCBmbXQ7CisgIGdpbnQgdywgaCwgcGFyX24sIHBhcl9kOworCisgIEdTVF9MT0dfT0JKRUNUIChzaW5rLCAiY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIGlmICghZ3N0X3ZpZGVvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgY2FwcykpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNpbmssICJwYXJzZV9jYXBzIGZhaWxlZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGZtdCA9IEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoJmluZm8pOworICB3ID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKCZpbmZvKTsKKyAgaCA9IEdTVF9WSURFT19JTkZPX0hFSUdIVCAoJmluZm8pOworICBwYXJfbiA9IEdTVF9WSURFT19JTkZPX1BBUl9OICgmaW5mbyk7CisgIHBhcl9kID0gR1NUX1ZJREVPX0lORk9fUEFSX04gKCZpbmZvKTsKKworI2lmbmRlZiBHX0RJU0FCTEVfQVNTRVJUCisgIHsKKyAgICBnaW50IHM7CisgICAgcyA9IEdTVF9WSURFT19JTkZPX0NPTVBfUFNUUklERSAoJmluZm8sIDApOworICAgIGdfYXNzZXJ0ICgoZm10ID09IEdTVF9WSURFT19GT1JNQVRfUkdCICYmIHMgPT0gMykgfHwKKyAgICAgICAgKGZtdCA9PSBHU1RfVklERU9fRk9STUFUX1JHQkEgJiYgcyA9PSA0KSk7CisgIH0KKyNlbmRpZgorCisgIEdTVF9WSURFT19TSU5LX1dJRFRIIChzaW5rKSA9IHc7CisgIEdTVF9WSURFT19TSU5LX0hFSUdIVCAoc2luaykgPSBoOworCisgIHNpbmstPnBhcl9uID0gcGFyX247CisgIHNpbmstPnBhcl9kID0gcGFyX2Q7CisKKyAgc2luay0+aGFzX2FscGhhID0gR1NUX1ZJREVPX0lORk9fSEFTX0FMUEhBICgmaW5mbyk7CisKKyAgR1NUX0lORk9fT0JKRUNUIChzaW5rLCAiZm9ybWF0ICAgICAgICAgICAgIDogJWQiLCBmbXQpOworICBHU1RfSU5GT19PQkpFQ1QgKHNpbmssICJ3aWR0aCB4IGhlaWdodCAgICAgOiAlZCB4ICVkIiwgdywgaCk7CisgIEdTVF9JTkZPX09CSkVDVCAoc2luaywgInBpeGVsLWFzcGVjdC1yYXRpbyA6ICVkLyVkIiwgcGFyX24sIHBhcl9kKTsKKworICBzaW5rLT5pbmZvID0gaW5mbzsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9nZGtfcGl4YnVmX3NpbmtfcGl4YnVmX2Rlc3Ryb3lfbm90aWZ5IChndWNoYXIgKiBwaXhlbHMsCisgICAgR3N0VmlkZW9GcmFtZSAqIGZyYW1lKQoreworICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKGZyYW1lKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZnJhbWUtPmJ1ZmZlcik7CisgIGdfc2xpY2VfZnJlZSAoR3N0VmlkZW9GcmFtZSwgZnJhbWUpOworfQorCitzdGF0aWMgR2RrUGl4YnVmICoKK2dzdF9nZGtfcGl4YnVmX3NpbmtfZ2V0X3BpeGJ1Zl9mcm9tX2J1ZmZlciAoR3N0R2RrUGl4YnVmU2luayAqIHNpbmssCisgICAgR3N0QnVmZmVyICogYnVmKQoreworICBHZGtQaXhidWYgKnBpeCA9IE5VTEw7CisgIEdzdFZpZGVvRnJhbWUgKmZyYW1lOworICBnaW50IG1pbnNpemUsIGJ5dGVzX3Blcl9waXhlbDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX1ZJREVPX1NJTktfV0lEVEggKHNpbmspID4gMCwgTlVMTCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfVklERU9fU0lOS19IRUlHSFQgKHNpbmspID4gMCwgTlVMTCk7CisKKyAgZnJhbWUgPSBnX3NsaWNlX25ldzAgKEdzdFZpZGVvRnJhbWUpOworICBnc3RfdmlkZW9fZnJhbWVfbWFwIChmcmFtZSwgJnNpbmstPmluZm8sIGJ1ZiwgR1NUX01BUF9SRUFEKTsKKworICBieXRlc19wZXJfcGl4ZWwgPSAoc2luay0+aGFzX2FscGhhKSA/IDQgOiAzOworCisgIC8qIGxhc3Qgcm93IG5lZWRuJ3QgaGF2ZSByb3cgcGFkZGluZyAqLworICBtaW5zaXplID0gKEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUsIDApICoKKyAgICAgIChHU1RfVklERU9fU0lOS19IRUlHSFQgKHNpbmspIC0gMSkpICsKKyAgICAgIChieXRlc19wZXJfcGl4ZWwgKiBHU1RfVklERU9fU0lOS19XSURUSCAoc2luaykpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChnc3RfYnVmZmVyX2dldF9zaXplIChidWYpID49IG1pbnNpemUsIE5VTEwpOworCisgIGdzdF9idWZmZXJfcmVmIChidWYpOworICBwaXggPSBnZGtfcGl4YnVmX25ld19mcm9tX2RhdGEgKEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lLCAwKSwKKyAgICAgIEdES19DT0xPUlNQQUNFX1JHQiwgc2luay0+aGFzX2FscGhhLCA4LCBHU1RfVklERU9fU0lOS19XSURUSCAoc2luayksCisgICAgICBHU1RfVklERU9fU0lOS19IRUlHSFQgKHNpbmspLCBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAwKSwKKyAgICAgIChHZGtQaXhidWZEZXN0cm95Tm90aWZ5KSBnc3RfZ2RrX3BpeGJ1Zl9zaW5rX3BpeGJ1Zl9kZXN0cm95X25vdGlmeSwKKyAgICAgIGZyYW1lKTsKKworICByZXR1cm4gcGl4OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2dka19waXhidWZfc2lua19oYW5kbGVfYnVmZmVyIChHc3RCYXNlU2luayAqIGJhc2VzaW5rLCBHc3RCdWZmZXIgKiBidWYsCisgICAgY29uc3QgZ2NoYXIgKiBtc2dfbmFtZSkKK3sKKyAgR3N0R2RrUGl4YnVmU2luayAqc2luazsKKyAgR2RrUGl4YnVmICpwaXhidWY7CisgIGdib29sZWFuIGRvX3Bvc3Q7CisKKyAgc2luayA9IEdTVF9HREtfUElYQlVGX1NJTksgKGJhc2VzaW5rKTsKKworICBwaXhidWYgPSBnc3RfZ2RrX3BpeGJ1Zl9zaW5rX2dldF9waXhidWZfZnJvbV9idWZmZXIgKHNpbmssIGJ1Zik7CisKKyAgR1NUX09CSkVDVF9MT0NLIChzaW5rKTsKKworICBkb19wb3N0ID0gc2luay0+cG9zdF9tZXNzYWdlczsKKworICBpZiAoc2luay0+bGFzdF9waXhidWYpCisgICAgZ19vYmplY3RfdW5yZWYgKHNpbmstPmxhc3RfcGl4YnVmKTsKKworICBzaW5rLT5sYXN0X3BpeGJ1ZiA9IHBpeGJ1ZjsgICAvKiB0YWtlIG93bmVyc2hpcCAqLworCisgIEdTVF9PQkpFQ1RfVU5MT0NLIChzaW5rKTsKKworICBpZiAoR19VTkxJS0VMWSAocGl4YnVmID09IE5VTEwpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKGRvX3Bvc3QpIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnM7CisgICAgR3N0TWVzc2FnZSAqbXNnOworICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKyAgICBHc3RDbG9ja1RpbWUgcnVubmluZ190aW1lLCBzdHJlYW1fdGltZTsKKworICAgIEdzdFNlZ21lbnQgKnNlZ21lbnQgPSAmYmFzZXNpbmstPnNlZ21lbnQ7CisgICAgZm9ybWF0ID0gc2VnbWVudC0+Zm9ybWF0OworCisgICAgdGltZXN0YW1wID0gR1NUX0JVRkZFUl9QVFMgKGJ1Zik7CisgICAgcnVubmluZ190aW1lID0gZ3N0X3NlZ21lbnRfdG9fcnVubmluZ190aW1lIChzZWdtZW50LCBmb3JtYXQsIHRpbWVzdGFtcCk7CisgICAgc3RyZWFtX3RpbWUgPSBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoc2VnbWVudCwgZm9ybWF0LCB0aW1lc3RhbXApOworCisgICAgLyogaXQncyBva2F5IHRvIGtlZXAgdXNpbmcgcGl4YnVmIGhlcmUsIHdlIGNhbiBiZSBzdXJlIG5vIG9uZSBpcyBnb2luZyB0bworICAgICAqIHVucmVmIG9yIGNoYW5nZSBzaW5rLT5sYXN0X3BpeGJ1ZiBiZWZvcmUgd2UgcmV0dXJuIGZyb20gdGhpcyBmdW5jdGlvbi4KKyAgICAgKiBUaGUgc3RydWN0dXJlIHdpbGwgdGFrZSBpdHMgb3duIHJlZiB0byB0aGUgcGl4YnVmLiAqLworICAgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAobXNnX25hbWUsCisgICAgICAgICJwaXhidWYiLCBHREtfVFlQRV9QSVhCVUYsIHBpeGJ1ZiwKKyAgICAgICAgInBpeGVsLWFzcGVjdC1yYXRpbyIsIEdTVF9UWVBFX0ZSQUNUSU9OLCBzaW5rLT5wYXJfbiwgc2luay0+cGFyX2QsCisgICAgICAgICJ0aW1lc3RhbXAiLCBHX1RZUEVfVUlOVDY0LCB0aW1lc3RhbXAsCisgICAgICAgICJzdHJlYW0tdGltZSIsIEdfVFlQRV9VSU5UNjQsIHN0cmVhbV90aW1lLAorICAgICAgICAicnVubmluZy10aW1lIiwgR19UWVBFX1VJTlQ2NCwgcnVubmluZ190aW1lLCBOVUxMKTsKKworICAgIG1zZyA9IGdzdF9tZXNzYWdlX25ld19lbGVtZW50IChHU1RfT0JKRUNUX0NBU1QgKHNpbmspLCBzKTsKKyAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHNpbmspLCBtc2cpOworICB9CisKKyAgZ19vYmplY3Rfbm90aWZ5IChHX09CSkVDVCAoc2luayksICJsYXN0LXBpeGJ1ZiIpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworLyogRVJST1JTICovCitlcnJvcjoKKyAgeworICAgIC8qIFRoaXMgc2hvdWxkbid0IHJlYWxseSBoYXBwZW4gKi8KKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2luaywgTElCUkFSWSwgRkFJTEVELAorICAgICAgICAoIkNvdWxkbid0IGNyZWF0ZSBwaXhidWYgZnJvbSBSR0IgaW1hZ2UuIiksCisgICAgICAgICgiUHJvYmFibHkgbm90IGVub3VnaCBmcmVlIG1lbW9yeSIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9nZGtfcGl4YnVmX3NpbmtfcHJlcm9sbCAoR3N0QmFzZVNpbmsgKiBiYXNlc2luaywgR3N0QnVmZmVyICogYnVmKQoreworICByZXR1cm4gZ3N0X2dka19waXhidWZfc2lua19oYW5kbGVfYnVmZmVyIChiYXNlc2luaywgYnVmLCAicHJlcm9sbC1waXhidWYiKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9nZGtfcGl4YnVmX3NpbmtfcmVuZGVyIChHc3RCYXNlU2luayAqIGJhc2VzaW5rLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIHJldHVybiBnc3RfZ2RrX3BpeGJ1Zl9zaW5rX2hhbmRsZV9idWZmZXIgKGJhc2VzaW5rLCBidWYsICJwaXhidWYiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9nZGtfcGl4YnVmX3Npbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEdka1BpeGJ1ZlNpbmsgKnNpbms7CisKKyAgc2luayA9IEdTVF9HREtfUElYQlVGX1NJTksgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BPU1RfTUVTU0FHRVM6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNpbmspOworICAgICAgc2luay0+cG9zdF9tZXNzYWdlcyA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzaW5rKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9nZGtfcGl4YnVmX3NpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEdka1BpeGJ1ZlNpbmsgKnNpbms7CisKKyAgc2luayA9IEdTVF9HREtfUElYQlVGX1NJTksgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BPU1RfTUVTU0FHRVM6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNpbmspOworICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNpbmstPnBvc3RfbWVzc2FnZXMpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNpbmspOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0xBU1RfUElYQlVGOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChzaW5rKTsKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNpbmstPmxhc3RfcGl4YnVmKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzaW5rKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZnNpbmsuaCBiL2V4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZnNpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjQ0MzdhCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qIEdTdHJlYW1lciBHZGtQaXhidWYgc2luaworICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIEdTVF9HREtfUElYQlVGX1NJTktfSAorI2RlZmluZSBHU1RfR0RLX1BJWEJVRl9TSU5LX0gKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9zaW5rLmg+CisKKyNpbmNsdWRlIDxnZGstcGl4YnVmL2dkay1waXhidWYuaD4KKworI2RlZmluZSBHU1RfVFlQRV9HREtfUElYQlVGX1NJTksgICAgICAgICAgICAoZ3N0X2dka19waXhidWZfc2lua19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfR0RLX1BJWEJVRl9TSU5LKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfR0RLX1BJWEJVRl9TSU5LLEdzdEdka1BpeGJ1ZlNpbmspKQorI2RlZmluZSBHU1RfR0RLX1BJWEJVRl9TSU5LX0NMQVNTKGtsYXNzKSAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9HREtfUElYQlVGX1NJTkssR3N0R2RrUGl4YnVmU2lua0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0dES19QSVhCVUZfU0lOSyhvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0dES19QSVhCVUZfU0lOSykpCisjZGVmaW5lIEdTVF9JU19HREtfUElYQlVGX1NJTktfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0dES19QSVhCVUZfU0lOSykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RHZGtQaXhidWZTaW5rICAgICAgIEdzdEdka1BpeGJ1ZlNpbms7Cit0eXBlZGVmIHN0cnVjdCBfR3N0R2RrUGl4YnVmU2lua0NsYXNzICBHc3RHZGtQaXhidWZTaW5rQ2xhc3M7CisKKy8qKgorICogR3N0R2RrUGl4YnVmU2luazoKKyAqCisgKiBPcGFxdWUgZWxlbWVudCBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0R2RrUGl4YnVmU2luaworeworICBHc3RWaWRlb1NpbmsgIGJhc2VzaW5rOworCisgIC8qPCBwcml2YXRlID4qLworCisgIC8qIGN1cnJlbnQgY2FwcyAqLworICBHc3RWaWRlb0luZm8gaW5mbzsKKyAgZ2ludCAgICAgICAgIHdpZHRoOworICBnaW50ICAgICAgICAgaGVpZ2h0OworICBnaW50ICAgICAgICAgcGFyX247CisgIGdpbnQgICAgICAgICBwYXJfZDsKKyAgZ2Jvb2xlYW4gICAgIGhhc19hbHBoYTsKKworICAvKiBwcm9wZXJ0aWVzICovCisgIGdib29sZWFuICAgICBwb3N0X21lc3NhZ2VzOworICBHZGtQaXhidWYgICogbGFzdF9waXhidWY7Cit9OworCisvKioKKyAqIEdzdEdka1BpeGJ1ZlNpbmtDbGFzczoKKyAqCisgKiBPcGFxdWUgZWxlbWVudCBjbGFzcyBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0R2RrUGl4YnVmU2lua0NsYXNzIAoreworICBHc3RWaWRlb1NpbmtDbGFzcyAgYmFzZXNpbmtjbGFzczsKK307CisKK0dUeXBlICAgZ3N0X2dka19waXhidWZfc2lua19nZXRfdHlwZSAodm9pZCk7CisKKyNlbmRpZiAvKiBHU1RfR0RLX1BJWEJVRl9TSU5LX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZXh0L2dka19waXhidWYvbWVzb24uYnVpbGQgYi9leHQvZ2RrX3BpeGJ1Zi9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDc5YTlkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2dka19waXhidWYvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwyMCBAQAorcGl4YnVmX3NvdXJjZXMgPSBbCisgICdnc3RnZGtwaXhidWZkZWMuYycsCisgICdnc3RnZGtwaXhidWZvdmVybGF5LmMnLAorICAnZ3N0Z2RrcGl4YnVmcGx1Z2luLmMnLAorICAnZ3N0Z2RrcGl4YnVmc2luay5jJywKK10KKworZ2RrcGl4YnVmX2RlcCA9IGRlcGVuZGVuY3koJ2dkay1waXhidWYtMi4wJywgdmVyc2lvbiA6ICc+PTIuOC4wJywgcmVxdWlyZWQgOiBmYWxzZSkKKworaWYgZ2RrcGl4YnVmX2RlcC5mb3VuZCgpCisgIGdzdGdka3BpeGJ1ZiA9IGxpYnJhcnkoJ2dzdGdka3BpeGJ1ZicsCisgICAgcGl4YnVmX3NvdXJjZXMsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICAgIGxpbmtfYXJncyA6IG5vc2VoX2xpbmtfYXJncywKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgICAgZGVwZW5kZW5jaWVzIDogW2dzdGJhc2VfZGVwLCBnc3R2aWRlb19kZXAsIGdzdGNvbnRyb2xsZXJfZGVwLCBnZGtwaXhidWZfZGVwXSwKKyAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCisgICkKK2VuZGlmCmRpZmYgLS1naXQgYS9leHQvZ3RrL01ha2VmaWxlLmFtIGIvZXh0L2d0ay9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWVlYzI2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2d0ay9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ0IEBACisjIHByZWFtYmxlCitOVUxMID0KK0JVSUxUX1NPVVJDRVMgPQorQ0xFQU5GSUxFUyA9CitFWFRSQV9ESVNUID0KK0RJU1RDTEVBTkZJTEVTID0KK2xpYl9MVExJQlJBUklFUyA9CisKKyMgc291cmNlCitzb3VyY2VzID0gXAorCWd0a2dzdGJhc2V3aWRnZXQuYyBcCisJZ3RrZ3N0YmFzZXdpZGdldC5oIFwKKwlndGtnc3R3aWRnZXQuYyBcCisJZ3RrZ3N0d2lkZ2V0LmggXAorCWdzdGd0a2Jhc2VzaW5rLmMgXAorCWdzdGd0a2Jhc2VzaW5rLmggXAorCWdzdGd0a3NpbmsuYyBcCisJZ3N0Z3Rrc2luay5oIFwKKwlnc3RndGt1dGlscy5jIFwKKwlnc3RndGt1dGlscy5oIFwKKwlnc3RwbHVnaW4uYyBcCisJJChOVUxMKQorCitsaWJnc3RndGtfbGFfQ0ZMQUdTID0gXAorCSQoR1NUX1BMVUdJTlNfQkFEX0NGTEFHUykgXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9HTF9DRkxBR1MpIFwKKwkkKEdTVF9DRkxBR1MpIFwKKwkkKEdUSzNfQ0ZMQUdTKQorbGliZ3N0Z3RrX2xhX0xJQkFERCA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgXAorCS1sZ3N0dmlkZW8tJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkkKEdTVF9CQVNFX0xJQlMpIFwKKwkkKEdUSzNfTElCUykKKworbGliZ3N0Z3RrX2xhX1NPVVJDRVMgPSAkKHNvdXJjZXMpCitsaWJnc3RndGtfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitpZiBVU0VfR1RLM19HTAorbGliZ3N0Z3RrX2xhX1NPVVJDRVMgKz0gZ3N0Z3RrZ2xzaW5rLmMgZ3N0Z3RrZ2xzaW5rLmggZ3RrZ3N0Z2x3aWRnZXQuYyBndGtnc3RnbHdpZGdldC5oCitsaWJnc3RndGtfbGFfTElCQUREICs9ICQoR1NUX0dMX0xJQlMpCitlbmRpZgorCitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RndGsubGEKZGlmZiAtLWdpdCBhL2V4dC9ndGsvZ3N0Z3RrYmFzZXNpbmsuYyBiL2V4dC9ndGsvZ3N0Z3RrYmFzZXNpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDNjOTdmCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2d0ay9nc3RndGtiYXNlc2luay5jCkBAIC0wLDAgKzEsNDk1IEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgTWF0dGhldyBXYXRlcnMgPG1hdHRoZXdAY2VudHJpY3VsYXIuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjpndGtnc3RzaW5rCisgKiBAdGl0bGU6IEdzdEd0a0Jhc2VTaW5rCisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdGd0a2Jhc2VzaW5rLmgiCisjaW5jbHVkZSAiZ3N0Z3RrdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZIChnc3RfZGVidWdfZ3RrX2Jhc2Vfc2luayk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfZGVidWdfZ3RrX2Jhc2Vfc2luaworCisjZGVmaW5lIERFRkFVTFRfRk9SQ0VfQVNQRUNUX1JBVElPICBUUlVFCisjZGVmaW5lIERFRkFVTFRfUEFSX04gICAgICAgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfUEFSX0QgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFRkFVTFRfSUdOT1JFX0FMUEhBICAgICAgICBUUlVFCisKK3N0YXRpYyB2b2lkIGdzdF9ndGtfYmFzZV9zaW5rX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyB2b2lkIGdzdF9ndGtfYmFzZV9zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBhcmFtX3NwZWMpOworc3RhdGljIHZvaWQgZ3N0X2d0a19iYXNlX3NpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcGFyYW1fc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZ3RrX2Jhc2Vfc2lua19zdGFydCAoR3N0QmFzZVNpbmsgKiBic2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2d0a19iYXNlX3Npbmtfc3RvcCAoR3N0QmFzZVNpbmsgKiBic2luayk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2d0a19iYXNlX3NpbmtfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIHZvaWQgZ3N0X2d0a19iYXNlX3NpbmtfZ2V0X3RpbWVzIChHc3RCYXNlU2luayAqIGJzaW5rLCBHc3RCdWZmZXIgKiBidWYsCisgICAgR3N0Q2xvY2tUaW1lICogc3RhcnQsIEdzdENsb2NrVGltZSAqIGVuZCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2d0a19iYXNlX3Npbmtfc2V0X2NhcHMgKEdzdEJhc2VTaW5rICogYnNpbmssCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2d0a19iYXNlX3Npbmtfc2hvd19mcmFtZSAoR3N0VmlkZW9TaW5rICogYnNpbmssCisgICAgR3N0QnVmZmVyICogYnVmKTsKKworc3RhdGljIHZvaWQKK2dzdF9ndGtfYmFzZV9zaW5rX25hdmlnYXRpb25faW50ZXJmYWNlX2luaXQgKEdzdE5hdmlnYXRpb25JbnRlcmZhY2UgKiBpZmFjZSk7CisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX1dJREdFVCwKKyAgUFJPUF9GT1JDRV9BU1BFQ1RfUkFUSU8sCisgIFBST1BfUElYRUxfQVNQRUNUX1JBVElPLAorICBQUk9QX0lHTk9SRV9BTFBIQSwKK307CisKKyNkZWZpbmUgZ3N0X2d0a19iYXNlX3NpbmtfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfQUJTVFJBQ1RfVFlQRV9XSVRIX0NPREUgKEdzdEd0a0Jhc2VTaW5rLCBnc3RfZ3RrX2Jhc2Vfc2luaywKKyAgICBHU1RfVFlQRV9WSURFT19TSU5LLAorICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfTkFWSUdBVElPTiwKKyAgICAgICAgZ3N0X2d0a19iYXNlX3NpbmtfbmF2aWdhdGlvbl9pbnRlcmZhY2VfaW5pdCk7CisgICAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9kZWJ1Z19ndGtfYmFzZV9zaW5rLAorICAgICAgICAiZ3RrYmFzZXNpbmsiLCAwLCAiR3RrIFZpZGVvIFNpbmsgYmFzZSBjbGFzcyIpKTsKKworCitzdGF0aWMgdm9pZAorZ3N0X2d0a19iYXNlX3NpbmtfY2xhc3NfaW5pdCAoR3N0R3RrQmFzZVNpbmtDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0QmFzZVNpbmtDbGFzcyAqZ3N0YmFzZXNpbmtfY2xhc3M7CisgIEdzdFZpZGVvU2lua0NsYXNzICpnc3R2aWRlb3NpbmtfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RiYXNlc2lua19jbGFzcyA9IChHc3RCYXNlU2lua0NsYXNzICopIGtsYXNzOworICBnc3R2aWRlb3NpbmtfY2xhc3MgPSAoR3N0VmlkZW9TaW5rQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2d0a19iYXNlX3Npbmtfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfZ3RrX2Jhc2Vfc2lua19nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9XSURHRVQsCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgid2lkZ2V0IiwgIkd0ayBXaWRnZXQiLAorICAgICAgICAgICJUaGUgR3RrV2lkZ2V0IHRvIHBsYWNlIGluIHRoZSB3aWRnZXQgaGllcmFyY2h5ICIKKyAgICAgICAgICAiKG11c3Qgb25seSBiZSBnZXQgZnJvbSB0aGUgR1RLIG1haW4gdGhyZWFkKSIsCisgICAgICAgICAgR1RLX1RZUEVfV0lER0VULCBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRk9SQ0VfQVNQRUNUX1JBVElPLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJmb3JjZS1hc3BlY3QtcmF0aW8iLAorICAgICAgICAgICJGb3JjZSBhc3BlY3QgcmF0aW8iLAorICAgICAgICAgICJXaGVuIGVuYWJsZWQsIHNjYWxpbmcgd2lsbCByZXNwZWN0IG9yaWdpbmFsIGFzcGVjdCByYXRpbyIsCisgICAgICAgICAgREVGQVVMVF9GT1JDRV9BU1BFQ1RfUkFUSU8sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QSVhFTF9BU1BFQ1RfUkFUSU8sCisgICAgICBnc3RfcGFyYW1fc3BlY19mcmFjdGlvbiAoInBpeGVsLWFzcGVjdC1yYXRpbyIsICJQaXhlbCBBc3BlY3QgUmF0aW8iLAorICAgICAgICAgICJUaGUgcGl4ZWwgYXNwZWN0IHJhdGlvIG9mIHRoZSBkZXZpY2UiLCBERUZBVUxUX1BBUl9OLCBERUZBVUxUX1BBUl9ELAorICAgICAgICAgIEdfTUFYSU5ULCAxLCAxLCAxLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0lHTk9SRV9BTFBIQSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiaWdub3JlLWFscGhhIiwgIklnbm9yZSBBbHBoYSIsCisgICAgICAgICAgIldoZW4gZW5hYmxlZCwgYWxwaGEgd2lsbCBiZSBpZ25vcmVkIGFuZCBjb252ZXJ0ZWQgdG8gYmxhY2siLAorICAgICAgICAgIERFRkFVTFRfSUdOT1JFX0FMUEhBLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ndGtfYmFzZV9zaW5rX2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ndGtfYmFzZV9zaW5rX2NoYW5nZV9zdGF0ZTsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnNldF9jYXBzID0gZ3N0X2d0a19iYXNlX3Npbmtfc2V0X2NhcHM7CisgIGdzdGJhc2VzaW5rX2NsYXNzLT5nZXRfdGltZXMgPSBnc3RfZ3RrX2Jhc2Vfc2lua19nZXRfdGltZXM7CisgIGdzdGJhc2VzaW5rX2NsYXNzLT5zdGFydCA9IGdzdF9ndGtfYmFzZV9zaW5rX3N0YXJ0OworICBnc3RiYXNlc2lua19jbGFzcy0+c3RvcCA9IGdzdF9ndGtfYmFzZV9zaW5rX3N0b3A7CisKKyAgZ3N0dmlkZW9zaW5rX2NsYXNzLT5zaG93X2ZyYW1lID0gZ3N0X2d0a19iYXNlX3Npbmtfc2hvd19mcmFtZTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ndGtfYmFzZV9zaW5rX2luaXQgKEdzdEd0a0Jhc2VTaW5rICogZ3RrX3NpbmspCit7CisgIGd0a19zaW5rLT5mb3JjZV9hc3BlY3RfcmF0aW8gPSBERUZBVUxUX0ZPUkNFX0FTUEVDVF9SQVRJTzsKKyAgZ3RrX3NpbmstPnBhcl9uID0gREVGQVVMVF9QQVJfTjsKKyAgZ3RrX3NpbmstPnBhcl9kID0gREVGQVVMVF9QQVJfRDsKKyAgZ3RrX3NpbmstPmlnbm9yZV9hbHBoYSA9IERFRkFVTFRfSUdOT1JFX0FMUEhBOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2d0a19iYXNlX3NpbmtfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEd0a0Jhc2VTaW5rICpndGtfc2luayA9IEdTVF9HVEtfQkFTRV9TSU5LIChvYmplY3QpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZ3RrX3NpbmspOworICBpZiAoZ3RrX3NpbmstPndpbmRvdyAmJiBndGtfc2luay0+d2luZG93X2Rlc3Ryb3lfaWQpCisgICAgZ19zaWduYWxfaGFuZGxlcl9kaXNjb25uZWN0IChndGtfc2luay0+d2luZG93LCBndGtfc2luay0+d2luZG93X2Rlc3Ryb3lfaWQpOworICBpZiAoZ3RrX3NpbmstPndpZGdldCAmJiBndGtfc2luay0+d2lkZ2V0X2Rlc3Ryb3lfaWQpCisgICAgZ19zaWduYWxfaGFuZGxlcl9kaXNjb25uZWN0IChndGtfc2luay0+d2lkZ2V0LCBndGtfc2luay0+d2lkZ2V0X2Rlc3Ryb3lfaWQpOworCisgIGdfY2xlYXJfb2JqZWN0ICgmZ3RrX3NpbmstPndpZGdldCk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChndGtfc2luayk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAord2lkZ2V0X2Rlc3Ryb3lfY2IgKEd0a1dpZGdldCAqIHdpZGdldCwgR3N0R3RrQmFzZVNpbmsgKiBndGtfc2luaykKK3sKKyAgR1NUX09CSkVDVF9MT0NLIChndGtfc2luayk7CisgIGdfY2xlYXJfb2JqZWN0ICgmZ3RrX3NpbmstPndpZGdldCk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChndGtfc2luayk7Cit9CisKK3N0YXRpYyB2b2lkCit3aW5kb3dfZGVzdHJveV9jYiAoR3RrV2lkZ2V0ICogd2lkZ2V0LCBHc3RHdGtCYXNlU2luayAqIGd0a19zaW5rKQoreworICBHU1RfT0JKRUNUX0xPQ0sgKGd0a19zaW5rKTsKKyAgZ3RrX3NpbmstPndpbmRvdyA9IE5VTEw7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChndGtfc2luayk7Cit9CisKK3N0YXRpYyBHdGtHc3RCYXNlV2lkZ2V0ICoKK2dzdF9ndGtfYmFzZV9zaW5rX2dldF93aWRnZXQgKEdzdEd0a0Jhc2VTaW5rICogZ3RrX3NpbmspCit7CisgIGlmIChndGtfc2luay0+d2lkZ2V0ICE9IE5VTEwpCisgICAgcmV0dXJuIGd0a19zaW5rLT53aWRnZXQ7CisKKyAgLyogRW5zdXJlIEdUSyBpcyBpbml0aWFsaXplZCwgdGhpcyBoYXMgbm8gc2lkZSBlZmZlY3QgaWYgaXQgd2FzIGFscmVhZHkKKyAgICogaW5pdGlhbGl6ZWQuIEFsc28sIHdlIGRvIHRoYXQgbGF6aWx5LCBzbyB0aGUgYXBwbGljYXRpb24gY2FuIGJlIGZpcnN0ICovCisgIGlmICghZ3RrX2luaXRfY2hlY2sgKE5VTEwsIE5VTEwpKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZ3RrX3NpbmssICJDb3VsZCBub3QgZW5zdXJlIEdUSyBpbml0aWFsaXphdGlvbi4iKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGdfYXNzZXJ0IChHU1RfR1RLX0JBU0VfU0lOS19HRVRfQ0xBU1MgKGd0a19zaW5rKS0+Y3JlYXRlX3dpZGdldCk7CisgIGd0a19zaW5rLT53aWRnZXQgPSAoR3RrR3N0QmFzZVdpZGdldCAqKQorICAgICAgR1NUX0dUS19CQVNFX1NJTktfR0VUX0NMQVNTIChndGtfc2luayktPmNyZWF0ZV93aWRnZXQgKCk7CisKKyAgZ3RrX3NpbmstPmJpbmRfYXNwZWN0X3JhdGlvID0KKyAgICAgIGdfb2JqZWN0X2JpbmRfcHJvcGVydHkgKGd0a19zaW5rLCAiZm9yY2UtYXNwZWN0LXJhdGlvIiwgZ3RrX3NpbmstPndpZGdldCwKKyAgICAgICJmb3JjZS1hc3BlY3QtcmF0aW8iLCBHX0JJTkRJTkdfQklESVJFQ1RJT05BTCB8IEdfQklORElOR19TWU5DX0NSRUFURSk7CisgIGd0a19zaW5rLT5iaW5kX3BpeGVsX2FzcGVjdF9yYXRpbyA9CisgICAgICBnX29iamVjdF9iaW5kX3Byb3BlcnR5IChndGtfc2luaywgInBpeGVsLWFzcGVjdC1yYXRpbyIsIGd0a19zaW5rLT53aWRnZXQsCisgICAgICAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgR19CSU5ESU5HX0JJRElSRUNUSU9OQUwgfCBHX0JJTkRJTkdfU1lOQ19DUkVBVEUpOworICBndGtfc2luay0+YmluZF9pZ25vcmVfYWxwaGEgPQorICAgICAgZ19vYmplY3RfYmluZF9wcm9wZXJ0eSAoZ3RrX3NpbmssICJpZ25vcmUtYWxwaGEiLCBndGtfc2luay0+d2lkZ2V0LAorICAgICAgImlnbm9yZS1hbHBoYSIsIEdfQklORElOR19CSURJUkVDVElPTkFMIHwgR19CSU5ESU5HX1NZTkNfQ1JFQVRFKTsKKworICAvKiBUYWtlIHRoZSBmbG9hdGluZyByZWYsIG90aGVyIHdpc2UgdGhlIGRlc3RydWN0aW9uIG9mIHRoZSBjb250YWluZXIgd2lsbAorICAgKiBtYWtlIHRoaXMgd2lkZ2V0IGRpc2FwZWFyIHBvc3NpYmx5IGJlZm9yZSB3ZSBhcmUgZG9uZS4gKi8KKyAgZ3N0X29iamVjdF9yZWZfc2luayAoZ3RrX3NpbmstPndpZGdldCk7CisgIGd0a19zaW5rLT53aWRnZXRfZGVzdHJveV9pZCA9IGdfc2lnbmFsX2Nvbm5lY3QgKGd0a19zaW5rLT53aWRnZXQsICJkZXN0cm95IiwKKyAgICAgIEdfQ0FMTEJBQ0sgKHdpZGdldF9kZXN0cm95X2NiKSwgZ3RrX3NpbmspOworCisgIC8qIGJhY2sgcG9pbnRlciAqLworICBndGtfZ3N0X2Jhc2Vfd2lkZ2V0X3NldF9lbGVtZW50IChHVEtfR1NUX0JBU0VfV0lER0VUIChndGtfc2luay0+d2lkZ2V0KSwKKyAgICAgIEdTVF9FTEVNRU5UIChndGtfc2luaykpOworCisgIHJldHVybiBndGtfc2luay0+d2lkZ2V0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X2d0a19iYXNlX3NpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEd0a0Jhc2VTaW5rICpndGtfc2luayA9IEdTVF9HVEtfQkFTRV9TSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9XSURHRVQ6CisgICAgeworICAgICAgR09iamVjdCAqd2lkZ2V0ID0gTlVMTDsKKworICAgICAgR1NUX09CSkVDVF9MT0NLIChndGtfc2luayk7CisgICAgICBpZiAoZ3RrX3NpbmstPndpZGdldCAhPSBOVUxMKQorICAgICAgICB3aWRnZXQgPSBHX09CSkVDVCAoZ3RrX3NpbmstPndpZGdldCk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZ3RrX3NpbmspOworCisgICAgICBpZiAoIXdpZGdldCkKKyAgICAgICAgd2lkZ2V0ID0KKyAgICAgICAgICAgIGdzdF9ndGtfaW52b2tlX29uX21haW4gKChHVGhyZWFkRnVuYykgZ3N0X2d0a19iYXNlX3NpbmtfZ2V0X3dpZGdldCwKKyAgICAgICAgICAgIGd0a19zaW5rKTsKKworICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgd2lkZ2V0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfRk9SQ0VfQVNQRUNUX1JBVElPOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIGd0a19zaW5rLT5mb3JjZV9hc3BlY3RfcmF0aW8pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BJWEVMX0FTUEVDVF9SQVRJTzoKKyAgICAgIGdzdF92YWx1ZV9zZXRfZnJhY3Rpb24gKHZhbHVlLCBndGtfc2luay0+cGFyX24sIGd0a19zaW5rLT5wYXJfZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSUdOT1JFX0FMUEhBOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIGd0a19zaW5rLT5pZ25vcmVfYWxwaGEpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2d0a19iYXNlX3Npbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEd0a0Jhc2VTaW5rICpndGtfc2luayA9IEdTVF9HVEtfQkFTRV9TSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9GT1JDRV9BU1BFQ1RfUkFUSU86CisgICAgICBndGtfc2luay0+Zm9yY2VfYXNwZWN0X3JhdGlvID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BJWEVMX0FTUEVDVF9SQVRJTzoKKyAgICAgIGd0a19zaW5rLT5wYXJfbiA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fbnVtZXJhdG9yICh2YWx1ZSk7CisgICAgICBndGtfc2luay0+cGFyX2QgPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX2Rlbm9taW5hdG9yICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSUdOT1JFX0FMUEhBOgorICAgICAgZ3RrX3NpbmstPmlnbm9yZV9hbHBoYSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ndGtfYmFzZV9zaW5rX25hdmlnYXRpb25fc2VuZF9ldmVudCAoR3N0TmF2aWdhdGlvbiAqIG5hdmlnYXRpb24sCisgICAgR3N0U3RydWN0dXJlICogc3RydWN0dXJlKQoreworICBHc3RHdGtCYXNlU2luayAqc2luayA9IEdTVF9HVEtfQkFTRV9TSU5LIChuYXZpZ2F0aW9uKTsKKyAgR3N0RXZlbnQgKmV2ZW50OworICBHc3RQYWQgKnBhZDsKKworICBldmVudCA9IGdzdF9ldmVudF9uZXdfbmF2aWdhdGlvbiAoc3RydWN0dXJlKTsKKyAgcGFkID0gZ3N0X3BhZF9nZXRfcGVlciAoR1NUX1ZJREVPX1NJTktfUEFEIChzaW5rKSk7CisKKyAgR1NUX1RSQUNFX09CSkVDVCAoc2luaywgIm5hdmlnYXRpb24gZXZlbnQgJSIgR1NUX1BUUl9GT1JNQVQsIHN0cnVjdHVyZSk7CisKKyAgaWYgKEdTVF9JU19QQUQgKHBhZCkgJiYgR1NUX0lTX0VWRU5UIChldmVudCkpIHsKKyAgICBpZiAoIWdzdF9wYWRfc2VuZF9ldmVudCAocGFkLCBnc3RfZXZlbnRfcmVmIChldmVudCkpKSB7CisgICAgICAvKiBJZiB1cHN0cmVhbSBkaWRuJ3QgaGFuZGxlIHRoZSBldmVudCB3ZSdsbCBwb3N0IGEgbWVzc2FnZSB3aXRoIGl0CisgICAgICAgKiBmb3IgdGhlIGFwcGxpY2F0aW9uIGluIGNhc2UgaXQgd2FudHMgdG8gZG8gc29tZXRoaW5nIHdpdGggaXQgKi8KKyAgICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAoc2luayksCisgICAgICAgICAgZ3N0X25hdmlnYXRpb25fbWVzc2FnZV9uZXdfZXZlbnQgKEdTVF9PQkpFQ1RfQ0FTVCAoc2luayksIGV2ZW50KSk7CisgICAgfQorICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ndGtfYmFzZV9zaW5rX25hdmlnYXRpb25faW50ZXJmYWNlX2luaXQgKEdzdE5hdmlnYXRpb25JbnRlcmZhY2UgKiBpZmFjZSkKK3sKKyAgaWZhY2UtPnNlbmRfZXZlbnQgPSBnc3RfZ3RrX2Jhc2Vfc2lua19uYXZpZ2F0aW9uX3NlbmRfZXZlbnQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2d0a19iYXNlX3Npbmtfc3RhcnRfb25fbWFpbiAoR3N0QmFzZVNpbmsgKiBic2luaykKK3sKKyAgR3N0R3RrQmFzZVNpbmsgKmdzdF9zaW5rID0gR1NUX0dUS19CQVNFX1NJTksgKGJzaW5rKTsKKyAgR3N0R3RrQmFzZVNpbmtDbGFzcyAqa2xhc3MgPSBHU1RfR1RLX0JBU0VfU0lOS19HRVRfQ0xBU1MgKGJzaW5rKTsKKyAgR3RrV2lkZ2V0ICp0b3BsZXZlbDsKKworICBpZiAoZ3N0X2d0a19iYXNlX3NpbmtfZ2V0X3dpZGdldCAoZ3N0X3NpbmspID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIEFmdGVyIHRoaXMgcG9pbnQsIGd0a19zaW5rLT53aWRnZXQgd2lsbCBhbHdheXMgYmUgc2V0ICovCisKKyAgdG9wbGV2ZWwgPSBndGtfd2lkZ2V0X2dldF90b3BsZXZlbCAoR1RLX1dJREdFVCAoZ3N0X3NpbmstPndpZGdldCkpOworICBpZiAoIWd0a193aWRnZXRfaXNfdG9wbGV2ZWwgKHRvcGxldmVsKSkgeworICAgIC8qIHNhbml0eSBjaGVjayAqLworICAgIGdfYXNzZXJ0IChrbGFzcy0+d2luZG93X3RpdGxlKTsKKworICAgIC8qIFVzZXIgZGlkIG5vdCBhZGQgd2lkZ2V0IGl0cyBvd24gVUksIGxldCdzIHBvcHVwIGEgbmV3IEd0a1dpbmRvdyB0bworICAgICAqIG1ha2UgZ3N0LWxhdW5jaC0xLjAgd29yay4gKi8KKyAgICBnc3Rfc2luay0+d2luZG93ID0gZ3RrX3dpbmRvd19uZXcgKEdUS19XSU5ET1dfVE9QTEVWRUwpOworICAgIGd0a193aW5kb3dfc2V0X2RlZmF1bHRfc2l6ZSAoR1RLX1dJTkRPVyAoZ3N0X3NpbmstPndpbmRvdyksIDY0MCwgNDgwKTsKKyAgICBndGtfd2luZG93X3NldF90aXRsZSAoR1RLX1dJTkRPVyAoZ3N0X3NpbmstPndpbmRvdyksIGtsYXNzLT53aW5kb3dfdGl0bGUpOworICAgIGd0a19jb250YWluZXJfYWRkIChHVEtfQ09OVEFJTkVSIChnc3Rfc2luay0+d2luZG93KSwgdG9wbGV2ZWwpOworICAgIGdzdF9zaW5rLT53aW5kb3dfZGVzdHJveV9pZCA9IGdfc2lnbmFsX2Nvbm5lY3QgKGdzdF9zaW5rLT53aW5kb3csICJkZXN0cm95IiwKKyAgICAgICAgR19DQUxMQkFDSyAod2luZG93X2Rlc3Ryb3lfY2IpLCBnc3Rfc2luayk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZ3RrX2Jhc2Vfc2lua19zdGFydCAoR3N0QmFzZVNpbmsgKiBic2luaykKK3sKKyAgcmV0dXJuICEgIWdzdF9ndGtfaW52b2tlX29uX21haW4gKChHVGhyZWFkRnVuYykKKyAgICAgIGdzdF9ndGtfYmFzZV9zaW5rX3N0YXJ0X29uX21haW4sIGJzaW5rKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZ3RrX2Jhc2Vfc2lua19zdG9wX29uX21haW4gKEdzdEJhc2VTaW5rICogYnNpbmspCit7CisgIEdzdEd0a0Jhc2VTaW5rICpnc3Rfc2luayA9IEdTVF9HVEtfQkFTRV9TSU5LIChic2luayk7CisKKyAgaWYgKGdzdF9zaW5rLT53aW5kb3cpIHsKKyAgICBndGtfd2lkZ2V0X2Rlc3Ryb3kgKGdzdF9zaW5rLT53aW5kb3cpOworICAgIGdzdF9zaW5rLT53aW5kb3cgPSBOVUxMOworICAgIGdzdF9zaW5rLT53aWRnZXQgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2d0a19iYXNlX3Npbmtfc3RvcCAoR3N0QmFzZVNpbmsgKiBic2luaykKK3sKKyAgR3N0R3RrQmFzZVNpbmsgKmdzdF9zaW5rID0gR1NUX0dUS19CQVNFX1NJTksgKGJzaW5rKTsKKworICBpZiAoZ3N0X3NpbmstPndpbmRvdykKKyAgICByZXR1cm4gISAhZ3N0X2d0a19pbnZva2Vfb25fbWFpbiAoKEdUaHJlYWRGdW5jKQorICAgICAgICBnc3RfZ3RrX2Jhc2Vfc2lua19zdG9wX29uX21haW4sIGJzaW5rKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ndGtfd2lkZ2V0X3Nob3dfYWxsX2FuZF91bnJlZiAoR3RrV2lkZ2V0ICogd2lkZ2V0KQoreworICBndGtfd2lkZ2V0X3Nob3dfYWxsICh3aWRnZXQpOworICBnX29iamVjdF91bnJlZiAod2lkZ2V0KTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfZ3RrX2Jhc2Vfc2lua19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RHdGtCYXNlU2luayAqZ3RrX3NpbmsgPSBHU1RfR1RLX0JBU0VfU0lOSyAoZWxlbWVudCk7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUzsKKworICBHU1RfREVCVUdfT0JKRUNUIChlbGVtZW50LCAiY2hhbmdpbmcgc3RhdGU6ICVzID0+ICVzIiwKKyAgICAgIGdzdF9lbGVtZW50X3N0YXRlX2dldF9uYW1lIChHU1RfU1RBVEVfVFJBTlNJVElPTl9DVVJSRU5UICh0cmFuc2l0aW9uKSksCisgICAgICBnc3RfZWxlbWVudF9zdGF0ZV9nZXRfbmFtZSAoR1NUX1NUQVRFX1RSQU5TSVRJT05fTkVYVCAodHJhbnNpdGlvbikpKTsKKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKyAgaWYgKHJldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpCisgICAgcmV0dXJuIHJldDsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgIHsKKyAgICAgIEd0a1dpbmRvdyAqd2luZG93ID0gTlVMTDsKKworICAgICAgR1NUX09CSkVDVF9MT0NLIChndGtfc2luayk7CisgICAgICBpZiAoZ3RrX3NpbmstPndpbmRvdykKKyAgICAgICAgd2luZG93ID0gZ19vYmplY3RfcmVmIChndGtfc2luay0+d2luZG93KTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChndGtfc2luayk7CisKKyAgICAgIGlmICh3aW5kb3cpCisgICAgICAgIGdzdF9ndGtfaW52b2tlX29uX21haW4gKChHVGhyZWFkRnVuYykgZ3N0X2d0a193aWRnZXRfc2hvd19hbGxfYW5kX3VucmVmLAorICAgICAgICAgICAgd2luZG93KTsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGd0a19zaW5rKTsKKyAgICAgIGlmIChndGtfc2luay0+d2lkZ2V0KQorICAgICAgICBndGtfZ3N0X2Jhc2Vfd2lkZ2V0X3NldF9idWZmZXIgKGd0a19zaW5rLT53aWRnZXQsIE5VTEwpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGd0a19zaW5rKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZ3RrX2Jhc2Vfc2lua19nZXRfdGltZXMgKEdzdEJhc2VTaW5rICogYnNpbmssIEdzdEJ1ZmZlciAqIGJ1ZiwKKyAgICBHc3RDbG9ja1RpbWUgKiBzdGFydCwgR3N0Q2xvY2tUaW1lICogZW5kKQoreworICBHc3RHdGtCYXNlU2luayAqZ3RrX3Npbms7CisKKyAgZ3RrX3NpbmsgPSBHU1RfR1RLX0JBU0VfU0lOSyAoYnNpbmspOworCisgIGlmIChHU1RfQlVGRkVSX1RJTUVTVEFNUF9JU19WQUxJRCAoYnVmKSkgeworICAgICpzdGFydCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpOworICAgIGlmIChHU1RfQlVGRkVSX0RVUkFUSU9OX0lTX1ZBTElEIChidWYpKQorICAgICAgKmVuZCA9ICpzdGFydCArIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1Zik7CisgICAgZWxzZSB7CisgICAgICBpZiAoR1NUX1ZJREVPX0lORk9fRlBTX04gKCZndGtfc2luay0+dl9pbmZvKSA+IDApIHsKKyAgICAgICAgKmVuZCA9ICpzdGFydCArCisgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChHU1RfU0VDT05ELAorICAgICAgICAgICAgR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZndGtfc2luay0+dl9pbmZvKSwKKyAgICAgICAgICAgIEdTVF9WSURFT19JTkZPX0ZQU19OICgmZ3RrX3NpbmstPnZfaW5mbykpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X2d0a19iYXNlX3Npbmtfc2V0X2NhcHMgKEdzdEJhc2VTaW5rICogYnNpbmssIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RHdGtCYXNlU2luayAqZ3RrX3NpbmsgPSBHU1RfR1RLX0JBU0VfU0lOSyAoYnNpbmspOworCisgIEdTVF9ERUJVRyAoInNldCBjYXBzIHdpdGggJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIGlmICghZ3N0X3ZpZGVvX2luZm9fZnJvbV9jYXBzICgmZ3RrX3NpbmstPnZfaW5mbywgY2FwcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZ3RrX3NpbmspOworCisgIGlmIChndGtfc2luay0+d2lkZ2V0ID09IE5VTEwpIHsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZ3RrX3NpbmspOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChndGtfc2luaywgUkVTT1VSQ0UsIE5PVF9GT1VORCwKKyAgICAgICAgKCIlcyIsICJPdXRwdXQgd2lkZ2V0IHdhcyBkZXN0cm95ZWQiKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoIWd0a19nc3RfYmFzZV93aWRnZXRfc2V0X2Zvcm1hdCAoZ3RrX3NpbmstPndpZGdldCwgJmd0a19zaW5rLT52X2luZm8pKSB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGd0a19zaW5rKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGd0a19zaW5rKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ndGtfYmFzZV9zaW5rX3Nob3dfZnJhbWUgKEdzdFZpZGVvU2luayAqIHZzaW5rLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdEd0a0Jhc2VTaW5rICpndGtfc2luazsKKworICBHU1RfVFJBQ0UgKCJyZW5kZXJpbmcgYnVmZmVyOiVwIiwgYnVmKTsKKworICBndGtfc2luayA9IEdTVF9HVEtfQkFTRV9TSU5LICh2c2luayk7CisKKyAgR1NUX09CSkVDVF9MT0NLICh2c2luayk7CisKKyAgaWYgKGd0a19zaW5rLT53aWRnZXQgPT0gTlVMTCkgeworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChndGtfc2luayk7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGd0a19zaW5rLCBSRVNPVVJDRSwgTk9UX0ZPVU5ELAorICAgICAgICAoIiVzIiwgIk91dHB1dCB3aWRnZXQgd2FzIGRlc3Ryb3llZCIpLCAoTlVMTCkpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIGd0a19nc3RfYmFzZV93aWRnZXRfc2V0X2J1ZmZlciAoZ3RrX3NpbmstPndpZGdldCwgYnVmKTsKKworICBHU1RfT0JKRUNUX1VOTE9DSyAoZ3RrX3NpbmspOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KZGlmZiAtLWdpdCBhL2V4dC9ndGsvZ3N0Z3RrYmFzZXNpbmsuaCBiL2V4dC9ndGsvZ3N0Z3RrYmFzZXNpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjhjMjg0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2d0ay9nc3RndGtiYXNlc2luay5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxNSBNYXR0aGV3IFdhdGVycyA8bWF0dGhld0BjZW50cmljdWxhci5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9HVEtfQkFTRV9TSU5LX0hfXworI2RlZmluZSBfX0dTVF9HVEtfQkFTRV9TSU5LX0hfXworCisjaW5jbHVkZSA8Z3RrL2d0ay5oPgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9zaW5rLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpbmNsdWRlICJndGtnc3RiYXNld2lkZ2V0LmgiCisKKyNkZWZpbmUgR1NUX1RZUEVfR1RLX0JBU0VfU0lOSyAgICAgICAgICAgIChnc3RfZ3RrX2Jhc2Vfc2lua19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfR1RLX0JBU0VfU0lOSyhvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0dUS19CQVNFX1NJTkssR3N0R3RrQmFzZVNpbmspKQorI2RlZmluZSBHU1RfR1RLX0JBU0VfU0lOS19DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfR1RLX0JBU0VfU0lOSyxHc3RHdGtCYXNlU2lua0NsYXNzKSkKKyNkZWZpbmUgR1NUX0dUS19CQVNFX1NJTktfR0VUX0NMQVNTKG9iaikgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfR1RLX0JBU0VfU0lOSywgR3N0R3RrQmFzZVNpbmtDbGFzcykpCisjZGVmaW5lIEdTVF9JU19HVEtfQkFTRV9TSU5LKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfR1RLX0JBU0VfU0lOSykpCisjZGVmaW5lIEdTVF9JU19HVEtfQkFTRV9TSU5LX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9HVEtfQkFTRV9TSU5LKSkKKyNkZWZpbmUgR1NUX0dUS19CQVNFX1NJTktfQ0FTVChvYmopICAgICAgICgoR3N0R3RrQmFzZVNpbmsqKShvYmopKQorCitHX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RHdGtCYXNlU2luayBHc3RHdGtCYXNlU2luazsKK3R5cGVkZWYgc3RydWN0IF9Hc3RHdGtCYXNlU2lua0NsYXNzIEdzdEd0a0Jhc2VTaW5rQ2xhc3M7CisKK0dUeXBlIGdzdF9ndGtfYmFzZV9zaW5rX2dldF90eXBlICh2b2lkKTsKKworLyoqCisgKiBHc3RHdGtCYXNlU2luazoKKyAqCisgKiBPcGFxdWUgI0dzdEd0a0Jhc2VTaW5rIG9iamVjdAorICovCitzdHJ1Y3QgX0dzdEd0a0Jhc2VTaW5rCit7CisgIC8qIDxwcml2YXRlPiAqLworICBHc3RWaWRlb1NpbmsgICAgICAgICBwYXJlbnQ7CisKKyAgR3N0VmlkZW9JbmZvICAgICAgICAgdl9pbmZvOworCisgIEd0a0dzdEJhc2VXaWRnZXQgICAgICp3aWRnZXQ7CisKKyAgLyogcHJvcGVydGllcyAqLworICBnYm9vbGVhbiAgICAgICAgICAgICBmb3JjZV9hc3BlY3RfcmF0aW87CisgIEdCaW5kaW5nICAgICAgICAgICAgICpiaW5kX2FzcGVjdF9yYXRpbzsKKworICBnaW50ICAgICAgICAgICAgICAgICAgcGFyX247CisgIGdpbnQgICAgICAgICAgICAgICAgICBwYXJfZDsKKyAgR0JpbmRpbmcgICAgICAgICAgICAgKmJpbmRfcGl4ZWxfYXNwZWN0X3JhdGlvOworCisgIGdib29sZWFuICAgICAgICAgICAgICBpZ25vcmVfYWxwaGE7CisgIEdCaW5kaW5nICAgICAgICAgICAgICpiaW5kX2lnbm9yZV9hbHBoYTsKKworICBHdGtXaWRnZXQgICAgICAgICAgICAqd2luZG93OworICBndWxvbmcgICAgICAgICAgICAgICB3aWRnZXRfZGVzdHJveV9pZDsKKyAgZ3Vsb25nICAgICAgICAgICAgICAgd2luZG93X2Rlc3Ryb3lfaWQ7Cit9OworCisvKioKKyAqIEdzdEd0a0Jhc2VTaW5rQ2xhc3M6CisgKgorICogVGhlICNHc3RHdGtCYXNlU2lua0NsYXNzIHN0cnVjdCBvbmx5IGNvbnRhaW5zIHByaXZhdGUgZGF0YQorICovCitzdHJ1Y3QgX0dzdEd0a0Jhc2VTaW5rQ2xhc3MKK3sKKyAgR3N0VmlkZW9TaW5rQ2xhc3Mgb2JqZWN0X2NsYXNzOworCisgIC8qIG1ldGFkYXRhICovCisgIGNvbnN0IGdjaGFyICp3aW5kb3dfdGl0bGU7CisKKyAgLyogdmlydHVhbHMgKi8KKyAgR3RrV2lkZ2V0KiAoKmNyZWF0ZV93aWRnZXQpICh2b2lkKTsKK307CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9HVEtfQkFTRV9TSU5LX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L2d0ay9nc3RndGtnbHNpbmsuYyBiL2V4dC9ndGsvZ3N0Z3RrZ2xzaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQzOWU4NQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9ndGsvZ3N0Z3RrZ2xzaW5rLmMKQEAgLTAsMCArMSwzMTEgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxNSBNYXR0aGV3IFdhdGVycyA8bWF0dGhld0BjZW50cmljdWxhci5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtZ3RrZ2xzaW5rCisgKiBAdGl0bGU6IGd0a2dsc2luaworICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nbC9nc3RnbGZ1bmNzLmg+CisKKyNpbmNsdWRlICJnc3RndGtnbHNpbmsuaCIKKyNpbmNsdWRlICJndGtnc3RnbHdpZGdldC5oIgorCitHU1RfREVCVUdfQ0FURUdPUlkgKGdzdF9kZWJ1Z19ndGtfZ2xfc2luayk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfZGVidWdfZ3RrX2dsX3NpbmsKKworc3RhdGljIGdib29sZWFuIGdzdF9ndGtfZ2xfc2lua19zdGFydCAoR3N0QmFzZVNpbmsgKiBic2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2d0a19nbF9zaW5rX3N0b3AgKEdzdEJhc2VTaW5rICogYnNpbmspOworc3RhdGljIGdib29sZWFuIGdzdF9ndGtfZ2xfc2lua19xdWVyeSAoR3N0QmFzZVNpbmsgKiBic2luaywgR3N0UXVlcnkgKiBxdWVyeSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2d0a19nbF9zaW5rX3Byb3Bvc2VfYWxsb2NhdGlvbiAoR3N0QmFzZVNpbmsgKiBic2luaywKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfZ3RrX2dsX3NpbmtfZ2V0X2NhcHMgKEdzdEJhc2VTaW5rICogYnNpbmssCisgICAgR3N0Q2FwcyAqIGZpbHRlcik7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfZ3RrX2dsX3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRV9XSVRIX0ZFQVRVUkVTCisgICAgICAgIChHU1RfQ0FQU19GRUFUVVJFX01FTU9SWV9HTF9NRU1PUlksICJSR0JBIikgIjsgIgorICAgICAgICBHU1RfVklERU9fQ0FQU19NQUtFX1dJVEhfRkVBVFVSRVMKKyAgICAgICAgKEdTVF9DQVBTX0ZFQVRVUkVfTUVNT1JZX0dMX01FTU9SWSAiLCAiCisgICAgICAgICAgICBHU1RfQ0FQU19GRUFUVVJFX01FVEFfR1NUX1ZJREVPX09WRVJMQVlfQ09NUE9TSVRJT04sICJSR0JBIikpKTsKKworI2RlZmluZSBnc3RfZ3RrX2dsX3NpbmtfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdEd0a0dMU2luaywgZ3N0X2d0a19nbF9zaW5rLAorICAgIEdTVF9UWVBFX0dUS19CQVNFX1NJTkssIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfZGVidWdfZ3RrX2dsX3NpbmssCisgICAgICAgICJndGtnbHNpbmsiLCAwLCAiR3RrIEdMIFZpZGVvIFNpbmsiKSk7CisKK3N0YXRpYyB2b2lkCitnc3RfZ3RrX2dsX3NpbmtfY2xhc3NfaW5pdCAoR3N0R3RrR0xTaW5rQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RCYXNlU2lua0NsYXNzICpnc3RiYXNlc2lua19jbGFzczsKKyAgR3N0R3RrQmFzZVNpbmtDbGFzcyAqZ3N0Z3RrYmFzZXNpbmtfY2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdGJhc2VzaW5rX2NsYXNzID0gKEdzdEJhc2VTaW5rQ2xhc3MgKikga2xhc3M7CisgIGdzdGd0a2Jhc2VzaW5rX2NsYXNzID0gKEdzdEd0a0Jhc2VTaW5rQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnF1ZXJ5ID0gZ3N0X2d0a19nbF9zaW5rX3F1ZXJ5OworICBnc3RiYXNlc2lua19jbGFzcy0+cHJvcG9zZV9hbGxvY2F0aW9uID0gZ3N0X2d0a19nbF9zaW5rX3Byb3Bvc2VfYWxsb2NhdGlvbjsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnN0YXJ0ID0gZ3N0X2d0a19nbF9zaW5rX3N0YXJ0OworICBnc3RiYXNlc2lua19jbGFzcy0+c3RvcCA9IGdzdF9ndGtfZ2xfc2lua19zdG9wOworICBnc3RiYXNlc2lua19jbGFzcy0+Z2V0X2NhcHMgPSBnc3RfZ3RrX2dsX3NpbmtfZ2V0X2NhcHM7CisKKyAgZ3N0Z3RrYmFzZXNpbmtfY2xhc3MtPmNyZWF0ZV93aWRnZXQgPSBndGtfZ3N0X2dsX3dpZGdldF9uZXc7CisgIGdzdGd0a2Jhc2VzaW5rX2NsYXNzLT53aW5kb3dfdGl0bGUgPSAiR3RrKyBHTCByZW5kZXJlciI7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiR3RrIEdMIFZpZGVvIFNpbmsiLAorICAgICAgIlNpbmsvVmlkZW8iLCAiQSB2aWRlbyBzaW5rIHRoYXQgcmVuZGVycyB0byBhIEd0a1dpZGdldCB1c2luZyBPcGVuR0wiLAorICAgICAgIk1hdHRoZXcgV2F0ZXJzIDxtYXR0aGV3QGNlbnRyaWN1bGFyLmNvbT4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfZ3RrX2dsX3NpbmtfdGVtcGxhdGUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2d0a19nbF9zaW5rX2luaXQgKEdzdEd0a0dMU2luayAqIGd0a19zaW5rKQoreworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ndGtfZ2xfc2lua19xdWVyeSAoR3N0QmFzZVNpbmsgKiBic2luaywgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0R3RrR0xTaW5rICpndGtfc2luayA9IEdTVF9HVEtfR0xfU0lOSyAoYnNpbmspOworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9DT05URVhUOgorICAgIHsKKyAgICAgIGlmIChnc3RfZ2xfaGFuZGxlX2NvbnRleHRfcXVlcnkgKChHc3RFbGVtZW50ICopIGd0a19zaW5rLCBxdWVyeSwKKyAgICAgICAgICAgICAgZ3RrX3NpbmstPmRpc3BsYXksIGd0a19zaW5rLT5jb250ZXh0LCBndGtfc2luay0+Z3RrX2NvbnRleHQpKQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gR1NUX0JBU0VfU0lOS19DTEFTUyAocGFyZW50X2NsYXNzKS0+cXVlcnkgKGJzaW5rLCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCitfc2l6ZV9jaGFuZ2VkX2NiIChHdGtXaWRnZXQgKiB3aWRnZXQsIEdka1JlY3RhbmdsZSAqIHJlY3RhbmdsZSwKKyAgICBHc3RHdGtHTFNpbmsgKiBndGtfc2luaykKK3sKKyAgZ2ludCBzY2FsZV9mYWN0b3IsIHdpZHRoLCBoZWlnaHQ7CisgIGdib29sZWFuIHJlY29uZmlndXJlOworCisgIHNjYWxlX2ZhY3RvciA9IGd0a193aWRnZXRfZ2V0X3NjYWxlX2ZhY3RvciAod2lkZ2V0KTsKKyAgd2lkdGggPSBzY2FsZV9mYWN0b3IgKiBndGtfd2lkZ2V0X2dldF9hbGxvY2F0ZWRfd2lkdGggKHdpZGdldCk7CisgIGhlaWdodCA9IHNjYWxlX2ZhY3RvciAqIGd0a193aWRnZXRfZ2V0X2FsbG9jYXRlZF9oZWlnaHQgKHdpZGdldCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChndGtfc2luayk7CisgIHJlY29uZmlndXJlID0KKyAgICAgICh3aWR0aCAhPSBndGtfc2luay0+ZGlzcGxheV93aWR0aCB8fCBoZWlnaHQgIT0gZ3RrX3NpbmstPmRpc3BsYXlfaGVpZ2h0KTsKKyAgZ3RrX3NpbmstPmRpc3BsYXlfd2lkdGggPSB3aWR0aDsKKyAgZ3RrX3NpbmstPmRpc3BsYXlfaGVpZ2h0ID0gaGVpZ2h0OworICBHU1RfT0JKRUNUX1VOTE9DSyAoZ3RrX3NpbmspOworCisgIGlmIChyZWNvbmZpZ3VyZSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGd0a19zaW5rLCAiU2VuZGluZyByZWNvbmZpZ3VyZSBldmVudCBvbiBzaW5rcGFkLiIpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoR1NUX0JBU0VfU0lOSyAoZ3RrX3NpbmspLT5zaW5rcGFkLAorICAgICAgICBnc3RfZXZlbnRfbmV3X3JlY29uZmlndXJlICgpKTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ndGtfZ2xfc2lua19zdGFydCAoR3N0QmFzZVNpbmsgKiBic2luaykKK3sKKyAgR3N0R3RrQmFzZVNpbmsgKmJhc2Vfc2luayA9IEdTVF9HVEtfQkFTRV9TSU5LIChic2luayk7CisgIEdzdEd0a0dMU2luayAqZ3RrX3NpbmsgPSBHU1RfR1RLX0dMX1NJTksgKGJzaW5rKTsKKyAgR3RrR3N0R0xXaWRnZXQgKmdzdF93aWRnZXQ7CisKKyAgaWYgKCFHU1RfQkFTRV9TSU5LX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zdGFydCAoYnNpbmspKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBBZnRlciB0aGlzIHBvaW50LCBndGtfc2luay0+d2lkZ2V0IHdpbGwgYWx3YXlzIGJlIHNldCAqLworICBnc3Rfd2lkZ2V0ID0gR1RLX0dTVF9HTF9XSURHRVQgKGJhc2Vfc2luay0+d2lkZ2V0KTsKKworICAvKiBUcmFjayB0aGUgYWxsb2NhdGlvbiBzaXplICovCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGdzdF93aWRnZXQsICJzaXplLWFsbG9jYXRlIiwgR19DQUxMQkFDSyAoX3NpemVfY2hhbmdlZF9jYiksCisgICAgICBndGtfc2luayk7CisgIF9zaXplX2NoYW5nZWRfY2IgKEdUS19XSURHRVQgKGdzdF93aWRnZXQpLCBOVUxMLCBndGtfc2luayk7CisKKyAgaWYgKCFndGtfZ3N0X2dsX3dpZGdldF9pbml0X3dpbnN5cyAoZ3N0X3dpZGdldCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGd0a19zaW5rLT5kaXNwbGF5ID0gZ3RrX2dzdF9nbF93aWRnZXRfZ2V0X2Rpc3BsYXkgKGdzdF93aWRnZXQpOworICBndGtfc2luay0+Y29udGV4dCA9IGd0a19nc3RfZ2xfd2lkZ2V0X2dldF9jb250ZXh0IChnc3Rfd2lkZ2V0KTsKKyAgZ3RrX3NpbmstPmd0a19jb250ZXh0ID0gZ3RrX2dzdF9nbF93aWRnZXRfZ2V0X2d0a19jb250ZXh0IChnc3Rfd2lkZ2V0KTsKKworICBpZiAoIWd0a19zaW5rLT5kaXNwbGF5IHx8ICFndGtfc2luay0+Y29udGV4dCB8fCAhZ3RrX3NpbmstPmd0a19jb250ZXh0KQorICAgIHJldHVybiBGQUxTRTsKKworICBnc3RfZ2xfZWxlbWVudF9wcm9wYWdhdGVfZGlzcGxheV9jb250ZXh0IChHU1RfRUxFTUVOVCAoYnNpbmspLAorICAgICAgZ3RrX3NpbmstPmRpc3BsYXkpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ndGtfZ2xfc2lua19zdG9wIChHc3RCYXNlU2luayAqIGJzaW5rKQoreworICBHc3RHdGtHTFNpbmsgKmd0a19zaW5rID0gR1NUX0dUS19HTF9TSU5LIChic2luayk7CisKKyAgaWYgKGd0a19zaW5rLT5kaXNwbGF5KSB7CisgICAgZ3N0X29iamVjdF91bnJlZiAoZ3RrX3NpbmstPmRpc3BsYXkpOworICAgIGd0a19zaW5rLT5kaXNwbGF5ID0gTlVMTDsKKyAgfQorCisgIGlmIChndGtfc2luay0+Y29udGV4dCkgeworICAgIGdzdF9vYmplY3RfdW5yZWYgKGd0a19zaW5rLT5jb250ZXh0KTsKKyAgICBndGtfc2luay0+Y29udGV4dCA9IE5VTEw7CisgIH0KKworICBpZiAoZ3RrX3NpbmstPmd0a19jb250ZXh0KSB7CisgICAgZ3N0X29iamVjdF91bnJlZiAoZ3RrX3NpbmstPmd0a19jb250ZXh0KTsKKyAgICBndGtfc2luay0+Z3RrX2NvbnRleHQgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIEdTVF9CQVNFX1NJTktfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnN0b3AgKGJzaW5rKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZ3RrX2dsX3NpbmtfcHJvcG9zZV9hbGxvY2F0aW9uIChHc3RCYXNlU2luayAqIGJzaW5rLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RHdGtHTFNpbmsgKmd0a19zaW5rID0gR1NUX0dUS19HTF9TSU5LIChic2luayk7CisgIEdzdEJ1ZmZlclBvb2wgKnBvb2wgPSBOVUxMOworICBHc3RTdHJ1Y3R1cmUgKmNvbmZpZzsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0VmlkZW9JbmZvIGluZm87CisgIGd1aW50IHNpemU7CisgIGdib29sZWFuIG5lZWRfcG9vbDsKKyAgR3N0U3RydWN0dXJlICphbGxvY2F0aW9uX21ldGEgPSBOVUxMOworICBnaW50IGRpc3BsYXlfd2lkdGgsIGRpc3BsYXlfaGVpZ2h0OworCisgIGlmICghZ3RrX3NpbmstPmRpc3BsYXkgfHwgIWd0a19zaW5rLT5jb250ZXh0KQorICAgIHJldHVybiBGQUxTRTsKKworICBnc3RfcXVlcnlfcGFyc2VfYWxsb2NhdGlvbiAocXVlcnksICZjYXBzLCAmbmVlZF9wb29sKTsKKworICBpZiAoY2FwcyA9PSBOVUxMKQorICAgIGdvdG8gbm9fY2FwczsKKworICBpZiAoIWdzdF92aWRlb19pbmZvX2Zyb21fY2FwcyAoJmluZm8sIGNhcHMpKQorICAgIGdvdG8gaW52YWxpZF9jYXBzOworCisgIC8qIHRoZSBub3JtYWwgc2l6ZSBvZiBhIGZyYW1lICovCisgIHNpemUgPSBpbmZvLnNpemU7CisKKyAgaWYgKG5lZWRfcG9vbCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGd0a19zaW5rLCAiY3JlYXRlIG5ldyBwb29sIik7CisgICAgcG9vbCA9IGdzdF9nbF9idWZmZXJfcG9vbF9uZXcgKGd0a19zaW5rLT5jb250ZXh0KTsKKworICAgIGNvbmZpZyA9IGdzdF9idWZmZXJfcG9vbF9nZXRfY29uZmlnIChwb29sKTsKKyAgICBnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX3NldF9wYXJhbXMgKGNvbmZpZywgY2Fwcywgc2l6ZSwgMCwgMCk7CisgICAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19hZGRfb3B0aW9uIChjb25maWcsCisgICAgICAgIEdTVF9CVUZGRVJfUE9PTF9PUFRJT05fR0xfU1lOQ19NRVRBKTsKKworICAgIGlmICghZ3N0X2J1ZmZlcl9wb29sX3NldF9jb25maWcgKHBvb2wsIGNvbmZpZykpCisgICAgICBnb3RvIGNvbmZpZ19mYWlsZWQ7CisgIH0KKworICAvKiB3ZSBuZWVkIGF0IGxlYXN0IDIgYnVmZmVyIGJlY2F1c2Ugd2UgaG9sZCBvbiB0byB0aGUgbGFzdCBvbmUgKi8KKyAgZ3N0X3F1ZXJ5X2FkZF9hbGxvY2F0aW9uX3Bvb2wgKHF1ZXJ5LCBwb29sLCBzaXplLCAyLCAwKTsKKyAgaWYgKHBvb2wpCisgICAgZ3N0X29iamVjdF91bnJlZiAocG9vbCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChndGtfc2luayk7CisgIGRpc3BsYXlfd2lkdGggPSBndGtfc2luay0+ZGlzcGxheV93aWR0aDsKKyAgZGlzcGxheV9oZWlnaHQgPSBndGtfc2luay0+ZGlzcGxheV9oZWlnaHQ7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChndGtfc2luayk7CisKKyAgaWYgKGRpc3BsYXlfd2lkdGggIT0gMCAmJiBkaXNwbGF5X2hlaWdodCAhPSAwKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZ3RrX3NpbmssICJzZW5kaW5nIGFsbG9jIHF1ZXJ5IHdpdGggc2l6ZSAlZHglZCIsCisgICAgICAgIGRpc3BsYXlfd2lkdGgsIGRpc3BsYXlfaGVpZ2h0KTsKKyAgICBhbGxvY2F0aW9uX21ldGEgPSBnc3Rfc3RydWN0dXJlX25ldyAoIkdzdFZpZGVvT3ZlcmxheUNvbXBvc2l0aW9uTWV0YSIsCisgICAgICAgICJ3aWR0aCIsIEdfVFlQRV9VSU5ULCBkaXNwbGF5X3dpZHRoLAorICAgICAgICAiaGVpZ2h0IiwgR19UWVBFX1VJTlQsIGRpc3BsYXlfaGVpZ2h0LCBOVUxMKTsKKyAgfQorCisgIGdzdF9xdWVyeV9hZGRfYWxsb2NhdGlvbl9tZXRhIChxdWVyeSwKKyAgICAgIEdTVF9WSURFT19PVkVSTEFZX0NPTVBPU0lUSU9OX01FVEFfQVBJX1RZUEUsIGFsbG9jYXRpb25fbWV0YSk7CisKKyAgaWYgKGFsbG9jYXRpb25fbWV0YSkKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKGFsbG9jYXRpb25fbWV0YSk7CisKKyAgLyogd2UgYWxzbyBzdXBwb3J0IHZhcmlvdXMgbWV0YWRhdGEgKi8KKyAgZ3N0X3F1ZXJ5X2FkZF9hbGxvY2F0aW9uX21ldGEgKHF1ZXJ5LCBHU1RfVklERU9fTUVUQV9BUElfVFlQRSwgMCk7CisKKyAgaWYgKGd0a19zaW5rLT5jb250ZXh0LT5nbF92dGFibGUtPkZlbmNlU3luYykKKyAgICBnc3RfcXVlcnlfYWRkX2FsbG9jYXRpb25fbWV0YSAocXVlcnksIEdTVF9HTF9TWU5DX01FVEFfQVBJX1RZUEUsIDApOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworbm9fY2FwczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJzaW5rLCAibm8gY2FwcyBzcGVjaWZpZWQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfY2FwczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJzaW5rLCAiaW52YWxpZCBjYXBzIHNwZWNpZmllZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorY29uZmlnX2ZhaWxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJzaW5rLCAiZmFpbGVkIHNldHRpbmcgY29uZmlnIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9ndGtfZ2xfc2lua19nZXRfY2FwcyAoR3N0QmFzZVNpbmsgKiBic2luaywgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0Q2FwcyAqdG1wID0gTlVMTDsKKyAgR3N0Q2FwcyAqcmVzdWx0ID0gTlVMTDsKKworICB0bXAgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX0JBU0VfU0lOS19QQUQgKGJzaW5rKSk7CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJzaW5rLCAiaW50ZXJzZWN0aW5nIHdpdGggZmlsdGVyIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgIGZpbHRlcik7CisKKyAgICByZXN1bHQgPSBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCB0bXAsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHRtcCk7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0ID0gdG1wOworICB9CisKKyAgcmVzdWx0ID0gZ3N0X2dsX292ZXJsYXlfY29tcG9zaXRvcl9hZGRfY2FwcyAocmVzdWx0KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChic2luaywgInJldHVybmluZyBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgcmVzdWx0KTsKKworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvZXh0L2d0ay9nc3RndGtnbHNpbmsuaCBiL2V4dC9ndGsvZ3N0Z3RrZ2xzaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg5Y2YzMwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9ndGsvZ3N0Z3RrZ2xzaW5rLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDE1IE1hdHRoZXcgV2F0ZXJzIDxtYXR0aGV3QGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0dUS19HTF9TSU5LX0hfXworI2RlZmluZSBfX0dTVF9HVEtfR0xfU0lOS19IX18KKworI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvc2luay5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC9nbC9nbC5oPgorCisjaW5jbHVkZSAiZ3N0Z3RrYmFzZXNpbmsuaCIKKworCisjZGVmaW5lIEdTVF9UWVBFX0dUS19HTF9TSU5LICAgICAgICAgICAgKGdzdF9ndGtfZ2xfc2lua19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfR1RLX0dMX1NJTksob2JqKSAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9HVEtfR0xfU0lOSyxHc3RHdGtHTFNpbmspKQorI2RlZmluZSBHU1RfR1RLX0dMX1NJTktfQ0xBU1Moa2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0dUS19HTF9TSU5LLEdzdEd0a0dMU2lua0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0dUS19HTF9TSU5LKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfR1RLX0dMX1NJTkspKQorI2RlZmluZSBHU1RfSVNfR1RLX0dMX1NJTktfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0dUS19HTF9TSU5LKSkKKyNkZWZpbmUgR1NUX0dUS19HTF9TSU5LX0NBU1Qob2JqKSAgICAgICAoKEdzdEd0a0dMU2luayopKG9iaikpCisKK0dfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEd0a0dMU2luayBHc3RHdGtHTFNpbms7Cit0eXBlZGVmIHN0cnVjdCBfR3N0R3RrR0xTaW5rQ2xhc3MgR3N0R3RrR0xTaW5rQ2xhc3M7CisKK0dUeXBlIGdzdF9ndGtfZ2xfc2lua19nZXRfdHlwZSAodm9pZCk7CisKKy8qKgorICogR3N0R3RrR0xTaW5rOgorICoKKyAqIE9wYXF1ZSAjR3N0R3RrR0xTaW5rIG9iamVjdAorICovCitzdHJ1Y3QgX0dzdEd0a0dMU2luaworeworICAvKiA8cHJpdmF0ZT4gKi8KKyAgR3N0R3RrQmFzZVNpbmsgICAgICAgIHBhcmVudDsKKworICBHc3RHTERpc3BsYXkgICAgICAgICAqZGlzcGxheTsKKyAgR3N0R0xDb250ZXh0ICAgICAgICAgKmNvbnRleHQ7CisgIEdzdEdMQ29udGV4dCAgICAgICAgICpndGtfY29udGV4dDsKKworICBHc3RHTFVwbG9hZCAgICAgICAgICAqdXBsb2FkOworICBHc3RCdWZmZXIgICAgICAgICAgICAqdXBsb2FkZWRfYnVmZmVyOworCisgIC8qIHJlYWQvd3JpdGUgd2l0aCBvYmplY3QgbG9jayAqLworICBnaW50ICAgICAgICAgICAgICAgICAgZGlzcGxheV93aWR0aDsKKyAgZ2ludCAgICAgICAgICAgICAgICAgIGRpc3BsYXlfaGVpZ2h0OworfTsKKworLyoqCisgKiBHc3RHdGtHTFNpbmtDbGFzczoKKyAqCisgKiBUaGUgI0dzdEd0a0dMU2lua0NsYXNzIHN0cnVjdCBvbmx5IGNvbnRhaW5zIHByaXZhdGUgZGF0YQorICovCitzdHJ1Y3QgX0dzdEd0a0dMU2lua0NsYXNzCit7CisgIC8qIDxwcml2YXRlPiAqLworICBHc3RHdGtCYXNlU2lua0NsYXNzIG9iamVjdF9jbGFzczsKK307CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9HVEtfR0xfU0lOS19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC9ndGsvZ3N0Z3Rrc2luay5jIGIvZXh0L2d0ay9nc3RndGtzaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE4ZWEzMwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9ndGsvZ3N0Z3Rrc2luay5jCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxNSBNYXR0aGV3IFdhdGVycyA8bWF0dGhld0BjZW50cmljdWxhci5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtZ3RrZ3N0c2luaworICogQHRpdGxlOiBndGtnc3RzaW5rCisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImd0a2dzdHdpZGdldC5oIgorI2luY2x1ZGUgImdzdGd0a3NpbmsuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZIChnc3RfZGVidWdfZ3RrX3NpbmspOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X2RlYnVnX2d0a19zaW5rCisKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIEZPUk1BVFMgInsgQkdSeCwgQkdSQSB9IgorI2Vsc2UKKyNkZWZpbmUgRk9STUFUUyAieyB4UkdCLCBBUkdCIH0iCisjZW5kaWYKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ndGtfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKEZPUk1BVFMpKQorICAgICk7CisKKyNkZWZpbmUgZ3N0X2d0a19zaW5rX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RHdGtTaW5rLCBnc3RfZ3RrX3NpbmssIEdTVF9UWVBFX0dUS19CQVNFX1NJTkssCisgICAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9kZWJ1Z19ndGtfc2luaywgImd0a3NpbmsiLCAwLAorICAgICAgICAiR3RrIFZpZGVvIFNpbmsiKSk7CisKK3N0YXRpYyB2b2lkCitnc3RfZ3RrX3NpbmtfY2xhc3NfaW5pdCAoR3N0R3RrU2lua0NsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0R3RrQmFzZVNpbmtDbGFzcyAqYmFzZV9jbGFzczsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgYmFzZV9jbGFzcyA9IChHc3RHdGtCYXNlU2lua0NsYXNzICopIGtsYXNzOworCisgIGJhc2VfY2xhc3MtPmNyZWF0ZV93aWRnZXQgPSBndGtfZ3N0X3dpZGdldF9uZXc7CisgIGJhc2VfY2xhc3MtPndpbmRvd190aXRsZSA9ICJHdGsrIENhaXJvIHJlbmRlcmVyIjsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJHdGsgVmlkZW8gU2luayIsCisgICAgICAiU2luay9WaWRlbyIsICJBIHZpZGVvIHNpbmsgdGhhdCByZW5kZXJzIHRvIGEgR3RrV2lkZ2V0IiwKKyAgICAgICJNYXR0aGV3IFdhdGVycyA8bWF0dGhld0BjZW50cmljdWxhci5jb20+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X2d0a19zaW5rX3RlbXBsYXRlKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ndGtfc2lua19pbml0IChHc3RHdGtTaW5rICogZ3RrX3NpbmspCit7Cit9CmRpZmYgLS1naXQgYS9leHQvZ3RrL2dzdGd0a3NpbmsuaCBiL2V4dC9ndGsvZ3N0Z3Rrc2luay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYWQzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZ3RrL2dzdGd0a3NpbmsuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgTWF0dGhldyBXYXRlcnMgPG1hdHRoZXdAY2VudHJpY3VsYXIuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfR1RLX1NJTktfSF9fCisjZGVmaW5lIF9fR1NUX0dUS19TSU5LX0hfXworCisjaW5jbHVkZSA8Z3RrL2d0ay5oPgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9zaW5rLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpbmNsdWRlICJnc3RndGtiYXNlc2luay5oIgorCisjZGVmaW5lIEdTVF9UWVBFX0dUS19TSU5LICAgICAgICAgICAgKGdzdF9ndGtfc2lua19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfR1RLX1NJTksob2JqKSAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9HVEtfU0lOSyxHc3RHdGtTaW5rKSkKKyNkZWZpbmUgR1NUX0dUS19TSU5LX0NMQVNTKGtsYXNzKSAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9HVEtfU0lOSyxHc3RHdGtTaW5rQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfR1RLX1NJTksob2JqKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9HVEtfU0lOSykpCisjZGVmaW5lIEdTVF9JU19HVEtfU0lOS19DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfR1RLX1NJTkspKQorI2RlZmluZSBHU1RfR1RLX1NJTktfQ0FTVChvYmopICAgICAgICgoR3N0R3RrU2luayopKG9iaikpCisKK0dfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEd0a1NpbmsgR3N0R3RrU2luazsKK3R5cGVkZWYgc3RydWN0IF9Hc3RHdGtTaW5rQ2xhc3MgR3N0R3RrU2lua0NsYXNzOworCitHVHlwZSBnc3RfZ3RrX3NpbmtfZ2V0X3R5cGUgKHZvaWQpOworCisvKioKKyAqIEdzdEd0a1Npbms6CisgKgorICogT3BhcXVlICNHc3RHdGtTaW5rIG9iamVjdAorICovCitzdHJ1Y3QgX0dzdEd0a1NpbmsKK3sKKyAgLyogPHByaXZhdGU+ICovCisgIEdzdEd0a0Jhc2VTaW5rICAgICAgIHBhcmVudDsKK307CisKKy8qKgorICogR3N0R3RrU2lua0NsYXNzOgorICoKKyAqIFRoZSAjR3N0R3RrU2lua0NsYXNzIHN0cnVjdCBvbmx5IGNvbnRhaW5zIHByaXZhdGUgZGF0YQorICovCitzdHJ1Y3QgX0dzdEd0a1NpbmtDbGFzcworeworICAvKiA8cHJpdmF0ZT4gKi8KKyAgR3N0R3RrQmFzZVNpbmtDbGFzcyBvYmplY3RfY2xhc3M7Cit9OworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfR1RLX1NJTktfSF9fICovCmRpZmYgLS1naXQgYS9leHQvZ3RrL2dzdGd0a3V0aWxzLmMgYi9leHQvZ3RrL2dzdGd0a3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczMGYwMQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9ndGsvZ3N0Z3RrdXRpbHMuYwpAQCAtMCwwICsxLDcxIEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgTWF0dGhldyBXYXRlcnMgPG1hdHRoZXdAY2VudHJpY3VsYXIuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoaWJhdWx0IFNhdW5pZXIgPHRzYXVuaWVyQGdub21lLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZ3N0Z3RrdXRpbHMuaCIKKworc3RydWN0IGludm9rZV9jb250ZXh0Cit7CisgIEdUaHJlYWRGdW5jIGZ1bmM7CisgIGdwb2ludGVyIGRhdGE7CisgIEdNdXRleCBsb2NrOworICBHQ29uZCBjb25kOworICBnYm9vbGVhbiBmaXJlZDsKKworICBncG9pbnRlciByZXM7Cit9OworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ndGtfaW52b2tlX2Z1bmMgKHN0cnVjdCBpbnZva2VfY29udGV4dCAqaW5mbykKK3sKKyAgZ19tdXRleF9sb2NrICgmaW5mby0+bG9jayk7CisgIGluZm8tPnJlcyA9IGluZm8tPmZ1bmMgKGluZm8tPmRhdGEpOworICBpbmZvLT5maXJlZCA9IFRSVUU7CisgIGdfY29uZF9zaWduYWwgKCZpbmZvLT5jb25kKTsKKyAgZ19tdXRleF91bmxvY2sgKCZpbmZvLT5sb2NrKTsKKworICByZXR1cm4gR19TT1VSQ0VfUkVNT1ZFOworfQorCitncG9pbnRlcgorZ3N0X2d0a19pbnZva2Vfb25fbWFpbiAoR1RocmVhZEZ1bmMgZnVuYywgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR01haW5Db250ZXh0ICptYWluX2NvbnRleHQgPSBnX21haW5fY29udGV4dF9kZWZhdWx0ICgpOworICBzdHJ1Y3QgaW52b2tlX2NvbnRleHQgaW5mbzsKKworICBnX211dGV4X2luaXQgKCZpbmZvLmxvY2spOworICBnX2NvbmRfaW5pdCAoJmluZm8uY29uZCk7CisgIGluZm8uZmlyZWQgPSBGQUxTRTsKKyAgaW5mby5mdW5jID0gZnVuYzsKKyAgaW5mby5kYXRhID0gZGF0YTsKKworICBnX21haW5fY29udGV4dF9pbnZva2UgKG1haW5fY29udGV4dCwgKEdTb3VyY2VGdW5jKSBnc3RfZ3RrX2ludm9rZV9mdW5jLAorICAgICAgJmluZm8pOworCisgIGdfbXV0ZXhfbG9jayAoJmluZm8ubG9jayk7CisgIHdoaWxlICghaW5mby5maXJlZCkKKyAgICBnX2NvbmRfd2FpdCAoJmluZm8uY29uZCwgJmluZm8ubG9jayk7CisgIGdfbXV0ZXhfdW5sb2NrICgmaW5mby5sb2NrKTsKKworICBnX211dGV4X2NsZWFyICgmaW5mby5sb2NrKTsKKyAgZ19jb25kX2NsZWFyICgmaW5mby5jb25kKTsKKworICByZXR1cm4gaW5mby5yZXM7Cit9CmRpZmYgLS1naXQgYS9leHQvZ3RrL2dzdGd0a3V0aWxzLmggYi9leHQvZ3RrL2dzdGd0a3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4NGFlMgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9ndGsvZ3N0Z3RrdXRpbHMuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgTWF0dGhldyBXYXRlcnMgPG1hdHRoZXdAY2VudHJpY3VsYXIuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoaWJhdWx0IFNhdW5pZXIgPHRzYXVuaWVyQGdub21lLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0dUS19VVElMU19IX18KKyNkZWZpbmUgX19HU1RfR1RLX1VUSUxTX0hfXworCisjaW5jbHVkZSA8Z2xpYi5oPgorCitncG9pbnRlciBnc3RfZ3RrX2ludm9rZV9vbl9tYWluIChHVGhyZWFkRnVuYyBmdW5jLCBncG9pbnRlciBkYXRhKTsKKworI2VuZGlmIC8qIF9fR1NUX0dUS19VVElMU19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC9ndGsvZ3N0cGx1Z2luLmMgYi9leHQvZ3RrL2dzdHBsdWdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMjc1NzgKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZ3RrL2dzdHBsdWdpbi5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxNSBNYXR0aGV3IFdhdGVycyA8bWF0dGhld0BjZW50cmljdWxhci5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0Z3Rrc2luay5oIgorI2lmIGRlZmluZWQoSEFWRV9HVEszX0dMKQorI2luY2x1ZGUgImdzdGd0a2dsc2luay5oIgorI2VuZGlmCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiZ3Rrc2luayIsCisgICAgICAgICAgR1NUX1JBTktfTk9ORSwgR1NUX1RZUEVfR1RLX1NJTkspKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisjaWYgZGVmaW5lZChIQVZFX0dUSzNfR0wpCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImd0a2dsc2luayIsCisgICAgICAgICAgR1NUX1JBTktfTk9ORSwgR1NUX1RZUEVfR1RLX0dMX1NJTkspKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisjZW5kaWYKKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGd0aywKKyAgICAiR3RrKyBzaW5rIiwKKyAgICBwbHVnaW5faW5pdCwgUEFDS0FHRV9WRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwKKyAgICBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9leHQvZ3RrL2d0a2dzdGJhc2V3aWRnZXQuYyBiL2V4dC9ndGsvZ3RrZ3N0YmFzZXdpZGdldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NThmMjcKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZ3RrL2d0a2dzdGJhc2V3aWRnZXQuYwpAQCAtMCwwICsxLDQ5NyBAQAorLyoKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDE1IE1hdHRoZXcgV2F0ZXJzIDxtYXR0aGV3QGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiZ3RrZ3N0YmFzZXdpZGdldC5oIgorCitHU1RfREVCVUdfQ0FURUdPUlkgKGdzdF9kZWJ1Z19ndGtfYmFzZV93aWRnZXQpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X2RlYnVnX2d0a19iYXNlX3dpZGdldAorCisjZGVmaW5lIERFRkFVTFRfRk9SQ0VfQVNQRUNUX1JBVElPICBUUlVFCisjZGVmaW5lIERFRkFVTFRfUEFSX04gICAgICAgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfUEFSX0QgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFRkFVTFRfSUdOT1JFX0FMUEhBICAgICAgICBUUlVFCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0ZPUkNFX0FTUEVDVF9SQVRJTywKKyAgUFJPUF9QSVhFTF9BU1BFQ1RfUkFUSU8sCisgIFBST1BfSUdOT1JFX0FMUEhBLAorfTsKKworc3RhdGljIHZvaWQKK2d0a19nc3RfYmFzZV93aWRnZXRfZ2V0X3ByZWZlcnJlZF93aWR0aCAoR3RrV2lkZ2V0ICogd2lkZ2V0LCBnaW50ICogbWluLAorICAgIGdpbnQgKiBuYXR1cmFsKQoreworICBHdGtHc3RCYXNlV2lkZ2V0ICpnc3Rfd2lkZ2V0ID0gKEd0a0dzdEJhc2VXaWRnZXQgKikgd2lkZ2V0OworICBnaW50IHZpZGVvX3dpZHRoID0gZ3N0X3dpZGdldC0+ZGlzcGxheV93aWR0aDsKKworICBpZiAoIWdzdF93aWRnZXQtPm5lZ290aWF0ZWQpCisgICAgdmlkZW9fd2lkdGggPSAxMDsKKworICBpZiAobWluKQorICAgICptaW4gPSAxOworICBpZiAobmF0dXJhbCkKKyAgICAqbmF0dXJhbCA9IHZpZGVvX3dpZHRoOworfQorCitzdGF0aWMgdm9pZAorZ3RrX2dzdF9iYXNlX3dpZGdldF9nZXRfcHJlZmVycmVkX2hlaWdodCAoR3RrV2lkZ2V0ICogd2lkZ2V0LCBnaW50ICogbWluLAorICAgIGdpbnQgKiBuYXR1cmFsKQoreworICBHdGtHc3RCYXNlV2lkZ2V0ICpnc3Rfd2lkZ2V0ID0gKEd0a0dzdEJhc2VXaWRnZXQgKikgd2lkZ2V0OworICBnaW50IHZpZGVvX2hlaWdodCA9IGdzdF93aWRnZXQtPmRpc3BsYXlfaGVpZ2h0OworCisgIGlmICghZ3N0X3dpZGdldC0+bmVnb3RpYXRlZCkKKyAgICB2aWRlb19oZWlnaHQgPSAxMDsKKworICBpZiAobWluKQorICAgICptaW4gPSAxOworICBpZiAobmF0dXJhbCkKKyAgICAqbmF0dXJhbCA9IHZpZGVvX2hlaWdodDsKK30KKworc3RhdGljIHZvaWQKK2d0a19nc3RfYmFzZV93aWRnZXRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEd0a0dzdEJhc2VXaWRnZXQgKmd0a193aWRnZXQgPSBHVEtfR1NUX0JBU0VfV0lER0VUIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9GT1JDRV9BU1BFQ1RfUkFUSU86CisgICAgICBndGtfd2lkZ2V0LT5mb3JjZV9hc3BlY3RfcmF0aW8gPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUElYRUxfQVNQRUNUX1JBVElPOgorICAgICAgZ3RrX3dpZGdldC0+cGFyX24gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX251bWVyYXRvciAodmFsdWUpOworICAgICAgZ3RrX3dpZGdldC0+cGFyX2QgPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX2Rlbm9taW5hdG9yICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSUdOT1JFX0FMUEhBOgorICAgICAgZ3RrX3dpZGdldC0+aWdub3JlX2FscGhhID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3RrX2dzdF9iYXNlX3dpZGdldF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3RrR3N0QmFzZVdpZGdldCAqZ3RrX3dpZGdldCA9IEdUS19HU1RfQkFTRV9XSURHRVQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0ZPUkNFX0FTUEVDVF9SQVRJTzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBndGtfd2lkZ2V0LT5mb3JjZV9hc3BlY3RfcmF0aW8pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BJWEVMX0FTUEVDVF9SQVRJTzoKKyAgICAgIGdzdF92YWx1ZV9zZXRfZnJhY3Rpb24gKHZhbHVlLCBndGtfd2lkZ2V0LT5wYXJfbiwgZ3RrX3dpZGdldC0+cGFyX2QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0lHTk9SRV9BTFBIQToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBndGtfd2lkZ2V0LT5pZ25vcmVfYWxwaGEpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK19jYWxjdWxhdGVfcGFyIChHdGtHc3RCYXNlV2lkZ2V0ICogd2lkZ2V0LCBHc3RWaWRlb0luZm8gKiBpbmZvKQoreworICBnYm9vbGVhbiBvazsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnaW50IHBhcl9uLCBwYXJfZDsKKyAgZ2ludCBkaXNwbGF5X3Bhcl9uLCBkaXNwbGF5X3Bhcl9kOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKGluZm8pOworICBoZWlnaHQgPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKGluZm8pOworCisgIHBhcl9uID0gR1NUX1ZJREVPX0lORk9fUEFSX04gKGluZm8pOworICBwYXJfZCA9IEdTVF9WSURFT19JTkZPX1BBUl9EIChpbmZvKTsKKworICBpZiAoIXBhcl9uKQorICAgIHBhcl9uID0gMTsKKworICAvKiBnZXQgZGlzcGxheSdzIFBBUiAqLworICBpZiAod2lkZ2V0LT5wYXJfbiAhPSAwICYmIHdpZGdldC0+cGFyX2QgIT0gMCkgeworICAgIGRpc3BsYXlfcGFyX24gPSB3aWRnZXQtPnBhcl9uOworICAgIGRpc3BsYXlfcGFyX2QgPSB3aWRnZXQtPnBhcl9kOworICB9IGVsc2UgeworICAgIGRpc3BsYXlfcGFyX24gPSAxOworICAgIGRpc3BsYXlfcGFyX2QgPSAxOworICB9CisKKworICBvayA9IGdzdF92aWRlb19jYWxjdWxhdGVfZGlzcGxheV9yYXRpbyAoJndpZGdldC0+ZGlzcGxheV9yYXRpb19udW0sCisgICAgICAmd2lkZ2V0LT5kaXNwbGF5X3JhdGlvX2Rlbiwgd2lkdGgsIGhlaWdodCwgcGFyX24sIHBhcl9kLCBkaXNwbGF5X3Bhcl9uLAorICAgICAgZGlzcGxheV9wYXJfZCk7CisKKyAgaWYgKG9rKSB7CisgICAgR1NUX0xPRyAoIlBBUjogJXUvJXUgREFSOiV1LyV1IiwgcGFyX24sIHBhcl9kLCBkaXNwbGF5X3Bhcl9uLAorICAgICAgICBkaXNwbGF5X3Bhcl9kKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK19hcHBseV9wYXIgKEd0a0dzdEJhc2VXaWRnZXQgKiB3aWRnZXQpCit7CisgIGd1aW50IGRpc3BsYXlfcmF0aW9fbnVtLCBkaXNwbGF5X3JhdGlvX2RlbjsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworCisgIHdpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKCZ3aWRnZXQtPnZfaW5mbyk7CisgIGhlaWdodCA9IEdTVF9WSURFT19JTkZPX0hFSUdIVCAoJndpZGdldC0+dl9pbmZvKTsKKworICBkaXNwbGF5X3JhdGlvX251bSA9IHdpZGdldC0+ZGlzcGxheV9yYXRpb19udW07CisgIGRpc3BsYXlfcmF0aW9fZGVuID0gd2lkZ2V0LT5kaXNwbGF5X3JhdGlvX2RlbjsKKworICBpZiAoaGVpZ2h0ICUgZGlzcGxheV9yYXRpb19kZW4gPT0gMCkgeworICAgIEdTVF9ERUJVRyAoImtlZXBpbmcgdmlkZW8gaGVpZ2h0Iik7CisgICAgd2lkZ2V0LT5kaXNwbGF5X3dpZHRoID0gKGd1aW50KQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChoZWlnaHQsIGRpc3BsYXlfcmF0aW9fbnVtLAorICAgICAgICBkaXNwbGF5X3JhdGlvX2Rlbik7CisgICAgd2lkZ2V0LT5kaXNwbGF5X2hlaWdodCA9IGhlaWdodDsKKyAgfSBlbHNlIGlmICh3aWR0aCAlIGRpc3BsYXlfcmF0aW9fbnVtID09IDApIHsKKyAgICBHU1RfREVCVUcgKCJrZWVwaW5nIHZpZGVvIHdpZHRoIik7CisgICAgd2lkZ2V0LT5kaXNwbGF5X3dpZHRoID0gd2lkdGg7CisgICAgd2lkZ2V0LT5kaXNwbGF5X2hlaWdodCA9IChndWludCkKKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAod2lkdGgsIGRpc3BsYXlfcmF0aW9fZGVuLCBkaXNwbGF5X3JhdGlvX251bSk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHICgiYXBwcm94aW1hdGluZyB3aGlsZSBrZWVwaW5nIHZpZGVvIGhlaWdodCIpOworICAgIHdpZGdldC0+ZGlzcGxheV93aWR0aCA9IChndWludCkKKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoaGVpZ2h0LCBkaXNwbGF5X3JhdGlvX251bSwKKyAgICAgICAgZGlzcGxheV9yYXRpb19kZW4pOworICAgIHdpZGdldC0+ZGlzcGxheV9oZWlnaHQgPSBoZWlnaHQ7CisgIH0KKworICBHU1RfREVCVUcgKCJzY2FsaW5nIHRvICVkeCVkIiwgd2lkZ2V0LT5kaXNwbGF5X3dpZHRoLCB3aWRnZXQtPmRpc3BsYXlfaGVpZ2h0KTsKK30KKworc3RhdGljIGdib29sZWFuCitfcXVldWVfZHJhdyAoR3RrR3N0QmFzZVdpZGdldCAqIHdpZGdldCkKK3sKKyAgR1RLX0dTVF9CQVNFX1dJREdFVF9MT0NLICh3aWRnZXQpOworICB3aWRnZXQtPmRyYXdfaWQgPSAwOworCisgIGlmICh3aWRnZXQtPnBlbmRpbmdfcmVzaXplKSB7CisgICAgd2lkZ2V0LT5wZW5kaW5nX3Jlc2l6ZSA9IEZBTFNFOworCisgICAgd2lkZ2V0LT52X2luZm8gPSB3aWRnZXQtPnBlbmRpbmdfdl9pbmZvOworICAgIHdpZGdldC0+bmVnb3RpYXRlZCA9IFRSVUU7CisKKyAgICBfYXBwbHlfcGFyICh3aWRnZXQpOworCisgICAgZ3RrX3dpZGdldF9xdWV1ZV9yZXNpemUgKEdUS19XSURHRVQgKHdpZGdldCkpOworICB9IGVsc2UgeworICAgIGd0a193aWRnZXRfcXVldWVfZHJhdyAoR1RLX1dJREdFVCAod2lkZ2V0KSk7CisgIH0KKworICBHVEtfR1NUX0JBU0VfV0lER0VUX1VOTE9DSyAod2lkZ2V0KTsKKworICByZXR1cm4gR19TT1VSQ0VfUkVNT1ZFOworfQorCitzdGF0aWMgY29uc3QgZ2NoYXIgKgorX2dka19rZXlfdG9fbmF2aWdhdGlvbl9zdHJpbmcgKGd1aW50IGtleXZhbCkKK3sKKyAgLyogVE9ETzogZXhwYW5kICovCisgIHN3aXRjaCAoa2V5dmFsKSB7CisjZGVmaW5lIEtFWShrZXkpIGNhc2UgR0RLX0tFWV8gIyMga2V5OiByZXR1cm4gR19TVFJJTkdJRlkoa2V5KQorICAgICAgS0VZIChVcCk7CisgICAgICBLRVkgKERvd24pOworICAgICAgS0VZIChMZWZ0KTsKKyAgICAgIEtFWSAoUmlnaHQpOworICAgICAgS0VZIChIb21lKTsKKyAgICAgIEtFWSAoRW5kKTsKKyN1bmRlZiBLRVkKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitndGtfZ3N0X2Jhc2Vfd2lkZ2V0X2tleV9ldmVudCAoR3RrV2lkZ2V0ICogd2lkZ2V0LCBHZGtFdmVudEtleSAqIGV2ZW50KQoreworICBHdGtHc3RCYXNlV2lkZ2V0ICpiYXNlX3dpZGdldCA9IEdUS19HU1RfQkFTRV9XSURHRVQgKHdpZGdldCk7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQ7CisKKyAgaWYgKChlbGVtZW50ID0gZ193ZWFrX3JlZl9nZXQgKCZiYXNlX3dpZGdldC0+ZWxlbWVudCkpKSB7CisgICAgaWYgKEdTVF9JU19OQVZJR0FUSU9OIChlbGVtZW50KSkgeworICAgICAgY29uc3QgZ2NoYXIgKnN0ciA9IF9nZGtfa2V5X3RvX25hdmlnYXRpb25fc3RyaW5nIChldmVudC0+a2V5dmFsKTsKKyAgICAgIGNvbnN0IGdjaGFyICprZXlfdHlwZSA9CisgICAgICAgICAgZXZlbnQtPnR5cGUgPT0gR0RLX0tFWV9QUkVTUyA/ICJrZXktcHJlc3MiIDogImtleS1yZWxlYXNlIjsKKworICAgICAgaWYgKCFzdHIpCisgICAgICAgIHN0ciA9IGV2ZW50LT5zdHJpbmc7CisKKyAgICAgIGdzdF9uYXZpZ2F0aW9uX3NlbmRfa2V5X2V2ZW50IChHU1RfTkFWSUdBVElPTiAoZWxlbWVudCksIGtleV90eXBlLCBzdHIpOworICAgIH0KKyAgICBnX29iamVjdF91bnJlZiAoZWxlbWVudCk7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitfZml0X3N0cmVhbV90b19hbGxvY2F0ZWRfc2l6ZSAoR3RrR3N0QmFzZVdpZGdldCAqIGJhc2Vfd2lkZ2V0LAorICAgIEd0a0FsbG9jYXRpb24gKiBhbGxvY2F0aW9uLCBHc3RWaWRlb1JlY3RhbmdsZSAqIHJlc3VsdCkKK3sKKyAgaWYgKGJhc2Vfd2lkZ2V0LT5mb3JjZV9hc3BlY3RfcmF0aW8pIHsKKyAgICBHc3RWaWRlb1JlY3RhbmdsZSBzcmMsIGRzdDsKKworICAgIHNyYy54ID0gMDsKKyAgICBzcmMueSA9IDA7CisgICAgc3JjLncgPSBiYXNlX3dpZGdldC0+ZGlzcGxheV93aWR0aDsKKyAgICBzcmMuaCA9IGJhc2Vfd2lkZ2V0LT5kaXNwbGF5X2hlaWdodDsKKworICAgIGRzdC54ID0gMDsKKyAgICBkc3QueSA9IDA7CisgICAgZHN0LncgPSBhbGxvY2F0aW9uLT53aWR0aDsKKyAgICBkc3QuaCA9IGFsbG9jYXRpb24tPmhlaWdodDsKKworICAgIGdzdF92aWRlb19zaW5rX2NlbnRlcl9yZWN0IChzcmMsIGRzdCwgcmVzdWx0LCBUUlVFKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQtPnggPSAwOworICAgIHJlc3VsdC0+eSA9IDA7CisgICAgcmVzdWx0LT53ID0gYWxsb2NhdGlvbi0+d2lkdGg7CisgICAgcmVzdWx0LT5oID0gYWxsb2NhdGlvbi0+aGVpZ2h0OworICB9Cit9CisKK3N0YXRpYyB2b2lkCitfZGlzcGxheV9zaXplX3RvX3N0cmVhbV9zaXplIChHdGtHc3RCYXNlV2lkZ2V0ICogYmFzZV93aWRnZXQsIGdkb3VibGUgeCwKKyAgICBnZG91YmxlIHksIGdkb3VibGUgKiBzdHJlYW1feCwgZ2RvdWJsZSAqIHN0cmVhbV95KQoreworICBnZG91YmxlIHN0cmVhbV93aWR0aCwgc3RyZWFtX2hlaWdodDsKKyAgR3RrQWxsb2NhdGlvbiBhbGxvY2F0aW9uOworICBHc3RWaWRlb1JlY3RhbmdsZSByZXN1bHQ7CisKKyAgZ3RrX3dpZGdldF9nZXRfYWxsb2NhdGlvbiAoR1RLX1dJREdFVCAoYmFzZV93aWRnZXQpLCAmYWxsb2NhdGlvbik7CisgIF9maXRfc3RyZWFtX3RvX2FsbG9jYXRlZF9zaXplIChiYXNlX3dpZGdldCwgJmFsbG9jYXRpb24sICZyZXN1bHQpOworCisgIHN0cmVhbV93aWR0aCA9IChnZG91YmxlKSBHU1RfVklERU9fSU5GT19XSURUSCAoJmJhc2Vfd2lkZ2V0LT52X2luZm8pOworICBzdHJlYW1faGVpZ2h0ID0gKGdkb3VibGUpIEdTVF9WSURFT19JTkZPX0hFSUdIVCAoJmJhc2Vfd2lkZ2V0LT52X2luZm8pOworCisgIC8qIGZyb20gZGlzcGxheSBjb29yZGluYXRlcyB0byBzdHJlYW0gY29vcmRpbmF0ZXMgKi8KKyAgaWYgKHJlc3VsdC53ID4gMCkKKyAgICAqc3RyZWFtX3ggPSAoeCAtIHJlc3VsdC54KSAvIHJlc3VsdC53ICogc3RyZWFtX3dpZHRoOworICBlbHNlCisgICAgKnN0cmVhbV94ID0gMC47CisKKyAgLyogY2xpcCB0byBzdHJlYW0gc2l6ZSAqLworICBpZiAoKnN0cmVhbV94IDwgMC4pCisgICAgKnN0cmVhbV94ID0gMC47CisgIGlmICgqc3RyZWFtX3ggPiBHU1RfVklERU9fSU5GT19XSURUSCAoJmJhc2Vfd2lkZ2V0LT52X2luZm8pKQorICAgICpzdHJlYW1feCA9IEdTVF9WSURFT19JTkZPX1dJRFRIICgmYmFzZV93aWRnZXQtPnZfaW5mbyk7CisKKyAgLyogc2FtZSBmb3IgeS1heGlzICovCisgIGlmIChyZXN1bHQuaCA+IDApCisgICAgKnN0cmVhbV95ID0gKHkgLSByZXN1bHQueSkgLyByZXN1bHQuaCAqIHN0cmVhbV9oZWlnaHQ7CisgIGVsc2UKKyAgICAqc3RyZWFtX3kgPSAwLjsKKworICBpZiAoKnN0cmVhbV95IDwgMC4pCisgICAgKnN0cmVhbV95ID0gMC47CisgIGlmICgqc3RyZWFtX3kgPiBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZiYXNlX3dpZGdldC0+dl9pbmZvKSkKKyAgICAqc3RyZWFtX3kgPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZiYXNlX3dpZGdldC0+dl9pbmZvKTsKKworICBHU1RfVFJBQ0UgKCJ0cmFuc2Zvcm0gJWZ4JWYgaW50byAlZnglZiIsIHgsIHksICpzdHJlYW1feCwgKnN0cmVhbV95KTsKK30KKworc3RhdGljIGdib29sZWFuCitndGtfZ3N0X2Jhc2Vfd2lkZ2V0X2J1dHRvbl9ldmVudCAoR3RrV2lkZ2V0ICogd2lkZ2V0LCBHZGtFdmVudEJ1dHRvbiAqIGV2ZW50KQoreworICBHdGtHc3RCYXNlV2lkZ2V0ICpiYXNlX3dpZGdldCA9IEdUS19HU1RfQkFTRV9XSURHRVQgKHdpZGdldCk7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQ7CisKKyAgaWYgKChlbGVtZW50ID0gZ193ZWFrX3JlZl9nZXQgKCZiYXNlX3dpZGdldC0+ZWxlbWVudCkpKSB7CisgICAgaWYgKEdTVF9JU19OQVZJR0FUSU9OIChlbGVtZW50KSkgeworICAgICAgY29uc3QgZ2NoYXIgKmtleV90eXBlID0KKyAgICAgICAgICBldmVudC0+dHlwZSA9PQorICAgICAgICAgIEdES19CVVRUT05fUFJFU1MgPyAibW91c2UtYnV0dG9uLXByZXNzIiA6ICJtb3VzZS1idXR0b24tcmVsZWFzZSI7CisgICAgICBnZG91YmxlIHgsIHk7CisKKyAgICAgIF9kaXNwbGF5X3NpemVfdG9fc3RyZWFtX3NpemUgKGJhc2Vfd2lkZ2V0LCBldmVudC0+eCwgZXZlbnQtPnksICZ4LCAmeSk7CisKKyAgICAgIGdzdF9uYXZpZ2F0aW9uX3NlbmRfbW91c2VfZXZlbnQgKEdTVF9OQVZJR0FUSU9OIChlbGVtZW50KSwga2V5X3R5cGUsCisgICAgICAgICAgZXZlbnQtPmJ1dHRvbiwgeCwgeSk7CisgICAgfQorICAgIGdfb2JqZWN0X3VucmVmIChlbGVtZW50KTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitndGtfZ3N0X2Jhc2Vfd2lkZ2V0X21vdGlvbl9ldmVudCAoR3RrV2lkZ2V0ICogd2lkZ2V0LCBHZGtFdmVudE1vdGlvbiAqIGV2ZW50KQoreworICBHdGtHc3RCYXNlV2lkZ2V0ICpiYXNlX3dpZGdldCA9IEdUS19HU1RfQkFTRV9XSURHRVQgKHdpZGdldCk7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQ7CisKKyAgaWYgKChlbGVtZW50ID0gZ193ZWFrX3JlZl9nZXQgKCZiYXNlX3dpZGdldC0+ZWxlbWVudCkpKSB7CisgICAgaWYgKEdTVF9JU19OQVZJR0FUSU9OIChlbGVtZW50KSkgeworICAgICAgZ2RvdWJsZSB4LCB5OworCisgICAgICBfZGlzcGxheV9zaXplX3RvX3N0cmVhbV9zaXplIChiYXNlX3dpZGdldCwgZXZlbnQtPngsIGV2ZW50LT55LCAmeCwgJnkpOworCisgICAgICBnc3RfbmF2aWdhdGlvbl9zZW5kX21vdXNlX2V2ZW50IChHU1RfTkFWSUdBVElPTiAoZWxlbWVudCksICJtb3VzZS1tb3ZlIiwKKyAgICAgICAgICAwLCB4LCB5KTsKKyAgICB9CisgICAgZ19vYmplY3RfdW5yZWYgKGVsZW1lbnQpOworICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCit2b2lkCitndGtfZ3N0X2Jhc2Vfd2lkZ2V0X2NsYXNzX2luaXQgKEd0a0dzdEJhc2VXaWRnZXRDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3Rfa2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHdGtXaWRnZXRDbGFzcyAqd2lkZ2V0X2tsYXNzID0gKEd0a1dpZGdldENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3Rfa2xhc3MtPnNldF9wcm9wZXJ0eSA9IGd0a19nc3RfYmFzZV93aWRnZXRfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2tsYXNzLT5nZXRfcHJvcGVydHkgPSBndGtfZ3N0X2Jhc2Vfd2lkZ2V0X2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2tsYXNzLCBQUk9QX0ZPUkNFX0FTUEVDVF9SQVRJTywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZm9yY2UtYXNwZWN0LXJhdGlvIiwKKyAgICAgICAgICAiRm9yY2UgYXNwZWN0IHJhdGlvIiwKKyAgICAgICAgICAiV2hlbiBlbmFibGVkLCBzY2FsaW5nIHdpbGwgcmVzcGVjdCBvcmlnaW5hbCBhc3BlY3QgcmF0aW8iLAorICAgICAgICAgIERFRkFVTFRfRk9SQ0VfQVNQRUNUX1JBVElPLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3Rfa2xhc3MsIFBST1BfUElYRUxfQVNQRUNUX1JBVElPLAorICAgICAgZ3N0X3BhcmFtX3NwZWNfZnJhY3Rpb24gKCJwaXhlbC1hc3BlY3QtcmF0aW8iLCAiUGl4ZWwgQXNwZWN0IFJhdGlvIiwKKyAgICAgICAgICAiVGhlIHBpeGVsIGFzcGVjdCByYXRpbyBvZiB0aGUgZGV2aWNlIiwgREVGQVVMVF9QQVJfTiwgREVGQVVMVF9QQVJfRCwKKyAgICAgICAgICBHX01BWElOVCwgMSwgMSwgMSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9rbGFzcywgUFJPUF9JR05PUkVfQUxQSEEsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImlnbm9yZS1hbHBoYSIsICJJZ25vcmUgQWxwaGEiLAorICAgICAgICAgICJXaGVuIGVuYWJsZWQsIGFscGhhIHdpbGwgYmUgaWdub3JlZCBhbmQgY29udmVydGVkIHRvIGJsYWNrIiwKKyAgICAgICAgICBERUZBVUxUX0lHTk9SRV9BTFBIQSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgd2lkZ2V0X2tsYXNzLT5nZXRfcHJlZmVycmVkX3dpZHRoID0gZ3RrX2dzdF9iYXNlX3dpZGdldF9nZXRfcHJlZmVycmVkX3dpZHRoOworICB3aWRnZXRfa2xhc3MtPmdldF9wcmVmZXJyZWRfaGVpZ2h0ID0gZ3RrX2dzdF9iYXNlX3dpZGdldF9nZXRfcHJlZmVycmVkX2hlaWdodDsKKyAgd2lkZ2V0X2tsYXNzLT5rZXlfcHJlc3NfZXZlbnQgPSBndGtfZ3N0X2Jhc2Vfd2lkZ2V0X2tleV9ldmVudDsKKyAgd2lkZ2V0X2tsYXNzLT5rZXlfcmVsZWFzZV9ldmVudCA9IGd0a19nc3RfYmFzZV93aWRnZXRfa2V5X2V2ZW50OworICB3aWRnZXRfa2xhc3MtPmJ1dHRvbl9wcmVzc19ldmVudCA9IGd0a19nc3RfYmFzZV93aWRnZXRfYnV0dG9uX2V2ZW50OworICB3aWRnZXRfa2xhc3MtPmJ1dHRvbl9yZWxlYXNlX2V2ZW50ID0gZ3RrX2dzdF9iYXNlX3dpZGdldF9idXR0b25fZXZlbnQ7CisgIHdpZGdldF9rbGFzcy0+bW90aW9uX25vdGlmeV9ldmVudCA9IGd0a19nc3RfYmFzZV93aWRnZXRfbW90aW9uX2V2ZW50OworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfZGVidWdfZ3RrX2Jhc2Vfd2lkZ2V0LCAiZ3RrYmFzZXdpZGdldCIsIDAsCisgICAgICAiR3RrIFZpZGVvIEJhc2UgV2lkZ2V0Iik7Cit9CisKK3ZvaWQKK2d0a19nc3RfYmFzZV93aWRnZXRfaW5pdCAoR3RrR3N0QmFzZVdpZGdldCAqIHdpZGdldCkKK3sKKyAgaW50IGV2ZW50X21hc2s7CisKKyAgd2lkZ2V0LT5mb3JjZV9hc3BlY3RfcmF0aW8gPSBERUZBVUxUX0ZPUkNFX0FTUEVDVF9SQVRJTzsKKyAgd2lkZ2V0LT5wYXJfbiA9IERFRkFVTFRfUEFSX047CisgIHdpZGdldC0+cGFyX2QgPSBERUZBVUxUX1BBUl9EOworICB3aWRnZXQtPmlnbm9yZV9hbHBoYSA9IERFRkFVTFRfSUdOT1JFX0FMUEhBOworCisgIGdzdF92aWRlb19pbmZvX2luaXQgKCZ3aWRnZXQtPnZfaW5mbyk7CisgIGdzdF92aWRlb19pbmZvX2luaXQgKCZ3aWRnZXQtPnBlbmRpbmdfdl9pbmZvKTsKKworICBnX3dlYWtfcmVmX2luaXQgKCZ3aWRnZXQtPmVsZW1lbnQsIE5VTEwpOworICBnX211dGV4X2luaXQgKCZ3aWRnZXQtPmxvY2spOworCisgIGd0a193aWRnZXRfc2V0X2Nhbl9mb2N1cyAoR1RLX1dJREdFVCAod2lkZ2V0KSwgVFJVRSk7CisgIGV2ZW50X21hc2sgPSBndGtfd2lkZ2V0X2dldF9ldmVudHMgKEdUS19XSURHRVQgKHdpZGdldCkpOworICBldmVudF9tYXNrIHw9IEdES19LRVlfUFJFU1NfTUFTSworICAgICAgfCBHREtfS0VZX1JFTEVBU0VfTUFTSworICAgICAgfCBHREtfQlVUVE9OX1BSRVNTX01BU0sKKyAgICAgIHwgR0RLX0JVVFRPTl9SRUxFQVNFX01BU0sKKyAgICAgIHwgR0RLX1BPSU5URVJfTU9USU9OX01BU0sgfCBHREtfQlVUVE9OX01PVElPTl9NQVNLOworICBndGtfd2lkZ2V0X3NldF9ldmVudHMgKEdUS19XSURHRVQgKHdpZGdldCksIGV2ZW50X21hc2spOworfQorCit2b2lkCitndGtfZ3N0X2Jhc2Vfd2lkZ2V0X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHdGtHc3RCYXNlV2lkZ2V0ICp3aWRnZXQgPSBHVEtfR1NUX0JBU0VfV0lER0VUIChvYmplY3QpOworCisgIGdzdF9idWZmZXJfcmVwbGFjZSAoJndpZGdldC0+cGVuZGluZ19idWZmZXIsIE5VTEwpOworICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZ3aWRnZXQtPmJ1ZmZlciwgTlVMTCk7CisgIGdfbXV0ZXhfY2xlYXIgKCZ3aWRnZXQtPmxvY2spOworICBnX3dlYWtfcmVmX2NsZWFyICgmd2lkZ2V0LT5lbGVtZW50KTsKKworICBpZiAod2lkZ2V0LT5kcmF3X2lkKQorICAgIGdfc291cmNlX3JlbW92ZSAod2lkZ2V0LT5kcmF3X2lkKTsKK30KKwordm9pZAorZ3RrX2dzdF9iYXNlX3dpZGdldF9zZXRfZWxlbWVudCAoR3RrR3N0QmFzZVdpZGdldCAqIHdpZGdldCwKKyAgICBHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgZ193ZWFrX3JlZl9zZXQgKCZ3aWRnZXQtPmVsZW1lbnQsIGVsZW1lbnQpOworfQorCitnYm9vbGVhbgorZ3RrX2dzdF9iYXNlX3dpZGdldF9zZXRfZm9ybWF0IChHdGtHc3RCYXNlV2lkZ2V0ICogd2lkZ2V0LAorICAgIEdzdFZpZGVvSW5mbyAqIHZfaW5mbykKK3sKKyAgR1RLX0dTVF9CQVNFX1dJREdFVF9MT0NLICh3aWRnZXQpOworCisgIGlmIChnc3RfdmlkZW9faW5mb19pc19lcXVhbCAoJndpZGdldC0+cGVuZGluZ192X2luZm8sIHZfaW5mbykpIHsKKyAgICBHVEtfR1NUX0JBU0VfV0lER0VUX1VOTE9DSyAod2lkZ2V0KTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGlmICghX2NhbGN1bGF0ZV9wYXIgKHdpZGdldCwgdl9pbmZvKSkgeworICAgIEdUS19HU1RfQkFTRV9XSURHRVRfVU5MT0NLICh3aWRnZXQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHdpZGdldC0+cGVuZGluZ19yZXNpemUgPSBUUlVFOworICB3aWRnZXQtPnBlbmRpbmdfdl9pbmZvID0gKnZfaW5mbzsKKworICBHVEtfR1NUX0JBU0VfV0lER0VUX1VOTE9DSyAod2lkZ2V0KTsKKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorZ3RrX2dzdF9iYXNlX3dpZGdldF9zZXRfYnVmZmVyIChHdGtHc3RCYXNlV2lkZ2V0ICogd2lkZ2V0LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIC8qIEFzIHdlIGhhdmUgbm8gdHlwZSwgdGhpcyBpcyBiZXR0ZXIgdGhlbiBubyBjaGVjayAqLworICBnX3JldHVybl9pZl9mYWlsIChHVEtfSVNfV0lER0VUICh3aWRnZXQpKTsKKworICBHVEtfR1NUX0JBU0VfV0lER0VUX0xPQ0sgKHdpZGdldCk7CisKKyAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmd2lkZ2V0LT5wZW5kaW5nX2J1ZmZlciwgYnVmZmVyKTsKKworICBpZiAoIXdpZGdldC0+ZHJhd19pZCkgeworICAgIHdpZGdldC0+ZHJhd19pZCA9IGdfaWRsZV9hZGRfZnVsbCAoR19QUklPUklUWV9ERUZBVUxULAorICAgICAgICAoR1NvdXJjZUZ1bmMpIF9xdWV1ZV9kcmF3LCB3aWRnZXQsIE5VTEwpOworICB9CisKKyAgR1RLX0dTVF9CQVNFX1dJREdFVF9VTkxPQ0sgKHdpZGdldCk7Cit9CmRpZmYgLS1naXQgYS9leHQvZ3RrL2d0a2dzdGJhc2V3aWRnZXQuaCBiL2V4dC9ndGsvZ3RrZ3N0YmFzZXdpZGdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNzM3YzYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZ3RrL2d0a2dzdGJhc2V3aWRnZXQuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgTWF0dGhldyBXYXRlcnMgPG1hdHRoZXdAY2VudHJpY3VsYXIuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HVEtfR1NUX0JBU0VfV0lER0VUX0hfXworI2RlZmluZSBfX0dUS19HU1RfQkFTRV9XSURHRVRfSF9fCisKKyNpbmNsdWRlIDxndGsvZ3RrLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjZGVmaW5lIEdUS19HU1RfQkFTRV9XSURHRVQodykgICAgICAgICAoKEd0a0dzdEJhc2VXaWRnZXQgKikodykpCisjZGVmaW5lIEdUS19HU1RfQkFTRV9XSURHRVRfQ0xBU1MoaykgICAoKEd0a0dzdEJhc2VXaWRnZXRDbGFzcyAqKShrKSkKKyNkZWZpbmUgR1RLX0dTVF9CQVNFX1dJREdFVF9MT0NLKHcpICAgIGdfbXV0ZXhfbG9jaygmKChHdGtHc3RCYXNlV2lkZ2V0KikodykpLT5sb2NrKQorI2RlZmluZSBHVEtfR1NUX0JBU0VfV0lER0VUX1VOTE9DSyh3KSAgZ19tdXRleF91bmxvY2soJigoR3RrR3N0QmFzZVdpZGdldCopKHcpKS0+bG9jaykKKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3RrR3N0QmFzZVdpZGdldCBHdGtHc3RCYXNlV2lkZ2V0OwordHlwZWRlZiBzdHJ1Y3QgX0d0a0dzdEJhc2VXaWRnZXRDbGFzcyBHdGtHc3RCYXNlV2lkZ2V0Q2xhc3M7CisKK3N0cnVjdCBfR3RrR3N0QmFzZVdpZGdldAoreworICB1bmlvbiB7CisgICAgR3RrRHJhd2luZ0FyZWEgZHJhd2luZ19hcmVhOworI2lmIEdUS19DSEVDS19WRVJTSU9OKDMsIDE1LCAwKQorICAgIEd0a0dMQXJlYSBnbF9hcmVhOworI2VuZGlmCisgIH0gcGFyZW50OworCisgIC8qIHByb3BlcnRpZXMgKi8KKyAgZ2Jvb2xlYW4gZm9yY2VfYXNwZWN0X3JhdGlvOworICBnaW50IHBhcl9uLCBwYXJfZDsKKyAgZ2Jvb2xlYW4gaWdub3JlX2FscGhhOworCisgIGdpbnQgZGlzcGxheV93aWR0aDsKKyAgZ2ludCBkaXNwbGF5X2hlaWdodDsKKworICBnYm9vbGVhbiBuZWdvdGlhdGVkOworICBHc3RCdWZmZXIgKnBlbmRpbmdfYnVmZmVyOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0VmlkZW9JbmZvIHZfaW5mbzsKKworICAvKiByZXNpemUgKi8KKyAgZ2Jvb2xlYW4gcGVuZGluZ19yZXNpemU7CisgIEdzdFZpZGVvSW5mbyBwZW5kaW5nX3ZfaW5mbzsKKyAgZ3VpbnQgZGlzcGxheV9yYXRpb19udW07CisgIGd1aW50IGRpc3BsYXlfcmF0aW9fZGVuOworCisgIC8qPCBwcml2YXRlID4qLworICBHTXV0ZXggbG9jazsKKyAgR1dlYWtSZWYgZWxlbWVudDsKKworICAvKiBQZW5kaW5nIGRyYXcgaWRsZXMgY2FsbGJhY2sgKi8KKyAgZ3VpbnQgZHJhd19pZDsKK307CisKK3N0cnVjdCBfR3RrR3N0QmFzZVdpZGdldENsYXNzCit7CisgIHVuaW9uIHsKKyAgICBHdGtEcmF3aW5nQXJlYUNsYXNzIGRyYXdpbmdfYXJlYV9jbGFzczsKKyNpZiBHVEtfQ0hFQ0tfVkVSU0lPTigzLCAxNSwgMCkKKyAgICBHdGtHTEFyZWFDbGFzcyBnbF9hcmVhX2NsYXNzOworI2VuZGlmCisgIH0gcGFyZW50X2NsYXNzOworfTsKKworLyogRm9yIGltcGxlbWVudGVyICovCit2b2lkICAgICAgICAgICAgZ3RrX2dzdF9iYXNlX3dpZGdldF9jbGFzc19pbml0ICAgICAgICAgICAoR3RrR3N0QmFzZVdpZGdldENsYXNzICoga2xhc3MpOwordm9pZCAgICAgICAgICAgIGd0a19nc3RfYmFzZV93aWRnZXRfaW5pdCAgICAgICAgICAgICAgICAgKEd0a0dzdEJhc2VXaWRnZXQgKiB3aWRnZXQpOworCit2b2lkICAgICAgICAgICAgZ3RrX2dzdF9iYXNlX3dpZGdldF9maW5hbGl6ZSAgICAgICAgICAgICAoR09iamVjdCAqIG9iamVjdCk7CisKKy8qIEFQSSAqLworZ2Jvb2xlYW4gICAgICAgIGd0a19nc3RfYmFzZV93aWRnZXRfc2V0X2Zvcm1hdCAgICAgICAgICAgKEd0a0dzdEJhc2VXaWRnZXQgKiB3aWRnZXQsIEdzdFZpZGVvSW5mbyAqIHZfaW5mbyk7Cit2b2lkICAgICAgICAgICAgZ3RrX2dzdF9iYXNlX3dpZGdldF9zZXRfYnVmZmVyICAgICAgICAgICAoR3RrR3N0QmFzZVdpZGdldCAqIHdpZGdldCwgR3N0QnVmZmVyICogYnVmZmVyKTsKK3ZvaWQgICAgICAgICAgICBndGtfZ3N0X2Jhc2Vfd2lkZ2V0X3NldF9lbGVtZW50ICAgICAgICAgIChHdGtHc3RCYXNlV2lkZ2V0ICogd2lkZ2V0LCBHc3RFbGVtZW50ICogZWxlbWVudCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dUS19HU1RfQkFTRV9XSURHRVRfSF9fICovCmRpZmYgLS1naXQgYS9leHQvZ3RrL2d0a2dzdGdsd2lkZ2V0LmMgYi9leHQvZ3RrL2d0a2dzdGdsd2lkZ2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjNDZjOQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9ndGsvZ3RrZ3N0Z2x3aWRnZXQuYwpAQCAtMCwwICsxLDU1OCBAQAorLyoKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDE1IE1hdHRoZXcgV2F0ZXJzIDxtYXR0aGV3QGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiZ3RrZ3N0Z2x3aWRnZXQuaCIKKyNpbmNsdWRlICJnc3RndGt1dGlscy5oIgorI2luY2x1ZGUgPGdzdC9nbC9nc3RnbGZ1bmNzLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpZiBHU1RfR0xfSEFWRV9XSU5ET1dfWDExICYmIEdTVF9HTF9IQVZFX1BMQVRGT1JNX0dMWCAmJiBkZWZpbmVkIChHREtfV0lORE9XSU5HX1gxMSkKKyNpbmNsdWRlIDxnZGsvZ2RreC5oPgorI2luY2x1ZGUgPGdzdC9nbC94MTEvZ3N0Z2xkaXNwbGF5X3gxMS5oPgorI2VuZGlmCisKKyNpZiBHU1RfR0xfSEFWRV9XSU5ET1dfV0FZTEFORCAmJiBHU1RfR0xfSEFWRV9QTEFURk9STV9FR0wgJiYgZGVmaW5lZCAoR0RLX1dJTkRPV0lOR19XQVlMQU5EKQorI2luY2x1ZGUgPGdkay9nZGt3YXlsYW5kLmg+CisjaW5jbHVkZSA8Z3N0L2dsL3dheWxhbmQvZ3N0Z2xkaXNwbGF5X3dheWxhbmQuaD4KKyNlbmRpZgorCisvKioKKyAqIFNFQ1RJT046Z3RrZ3N0Z2x3aWRnZXQKKyAqIEB0aXRsZTogR3RrR3N0R2xXaWRnZXQKKyAqIEBzaG9ydF9kZXNjcmlwdGlvbjogYSAjR3RrR0xBcmVhIHRoYXQgcmVuZGVycyBHU3RyZWFtZXIgdmlkZW8gI0dzdEJ1ZmZlcnMKKyAqIEBzZWVfYWxzbzogI0d0a0dMQXJlYSwgI0dzdEJ1ZmZlcgorICoKKyAqICNHdGtHc3RHTFdpZGdldCBpcyBhbiAjR3RrV2lkZ2V0IHRoYXQgcmVuZGVycyBHU3RyZWFtZXIgdmlkZW8gYnVmZmVycy4KKyAqLworCisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBndGtfZ3N0X2dsX3dpZGdldF9kZWJ1ZworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoR1NUX0NBVF9ERUZBVUxUKTsKKworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEd0a0dzdEdMV2lkZ2V0LCBndGtfZ3N0X2dsX3dpZGdldCwgR1RLX1RZUEVfR0xfQVJFQSwKKyAgICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoR1NUX0NBVF9ERUZBVUxULCAiZ3RrZ3N0Z2x3aWRnZXQiLCAwLAorICAgICAgICAiR3RrIEdzdCBHTCBXaWRnZXQiKTspOworCisjZGVmaW5lIEdUS19HU1RfR0xfV0lER0VUX0dFVF9QUklWQVRFKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfUFJJVkFURSAoKG9iaiksIFwKKyAgICBHVEtfVFlQRV9HU1RfR0xfV0lER0VULCBHdGtHc3RHTFdpZGdldFByaXZhdGUpKQorCitzdHJ1Y3QgX0d0a0dzdEdMV2lkZ2V0UHJpdmF0ZQoreworICBnYm9vbGVhbiBpbml0dGVkOworICBHc3RHTERpc3BsYXkgKmRpc3BsYXk7CisgIEdka0dMQ29udGV4dCAqZ2RrX2NvbnRleHQ7CisgIEdzdEdMQ29udGV4dCAqb3RoZXJfY29udGV4dDsKKyAgR3N0R0xDb250ZXh0ICpjb250ZXh0OworICBHc3RHTFVwbG9hZCAqdXBsb2FkOworICBHc3RHTFNoYWRlciAqc2hhZGVyOworICBHTHVpbnQgdmFvOworICBHTHVpbnQgdmVydGV4X2J1ZmZlcjsKKyAgR0xpbnQgYXR0cl9wb3NpdGlvbjsKKyAgR0xpbnQgYXR0cl90ZXh0dXJlOworICBHTHVpbnQgY3VycmVudF90ZXg7CisgIEdzdEdMT3ZlcmxheUNvbXBvc2l0b3IgKm92ZXJsYXlfY29tcG9zaXRvcjsKK307CisKK3N0YXRpYyBjb25zdCBHTGZsb2F0IHZlcnRpY2VzW10gPSB7CisgIDEuMGYsIDEuMGYsIDAuMGYsIDEuMGYsIDAuMGYsCisgIC0xLjBmLCAxLjBmLCAwLjBmLCAwLjBmLCAwLjBmLAorICAtMS4wZiwgLTEuMGYsIDAuMGYsIDAuMGYsIDEuMGYsCisgIDEuMGYsIC0xLjBmLCAwLjBmLCAxLjBmLCAxLjBmCit9OworCitzdGF0aWMgdm9pZAorZ3RrX2dzdF9nbF93aWRnZXRfYmluZF9idWZmZXIgKEd0a0dzdEdMV2lkZ2V0ICogZ3N0X3dpZGdldCkKK3sKKyAgR3RrR3N0R0xXaWRnZXRQcml2YXRlICpwcml2ID0gZ3N0X3dpZGdldC0+cHJpdjsKKyAgY29uc3QgR3N0R0xGdW5jcyAqZ2wgPSBwcml2LT5jb250ZXh0LT5nbF92dGFibGU7CisKKyAgZ2wtPkJpbmRCdWZmZXIgKEdMX0FSUkFZX0JVRkZFUiwgcHJpdi0+dmVydGV4X2J1ZmZlcik7CisKKyAgLyogTG9hZCB0aGUgdmVydGV4IHBvc2l0aW9uICovCisgIGdsLT5WZXJ0ZXhBdHRyaWJQb2ludGVyIChwcml2LT5hdHRyX3Bvc2l0aW9uLCAzLCBHTF9GTE9BVCwgR0xfRkFMU0UsCisgICAgICA1ICogc2l6ZW9mIChHTGZsb2F0KSwgKHZvaWQgKikgMCk7CisKKyAgLyogTG9hZCB0aGUgdGV4dHVyZSBjb29yZGluYXRlICovCisgIGdsLT5WZXJ0ZXhBdHRyaWJQb2ludGVyIChwcml2LT5hdHRyX3RleHR1cmUsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwKKyAgICAgIDUgKiBzaXplb2YgKEdMZmxvYXQpLCAodm9pZCAqKSAoMyAqIHNpemVvZiAoR0xmbG9hdCkpKTsKKworICBnbC0+RW5hYmxlVmVydGV4QXR0cmliQXJyYXkgKHByaXYtPmF0dHJfcG9zaXRpb24pOworICBnbC0+RW5hYmxlVmVydGV4QXR0cmliQXJyYXkgKHByaXYtPmF0dHJfdGV4dHVyZSk7Cit9CisKK3N0YXRpYyB2b2lkCitndGtfZ3N0X2dsX3dpZGdldF91bmJpbmRfYnVmZmVyIChHdGtHc3RHTFdpZGdldCAqIGdzdF93aWRnZXQpCit7CisgIEd0a0dzdEdMV2lkZ2V0UHJpdmF0ZSAqcHJpdiA9IGdzdF93aWRnZXQtPnByaXY7CisgIGNvbnN0IEdzdEdMRnVuY3MgKmdsID0gcHJpdi0+Y29udGV4dC0+Z2xfdnRhYmxlOworCisgIGdsLT5CaW5kQnVmZmVyIChHTF9BUlJBWV9CVUZGRVIsIDApOworCisgIGdsLT5EaXNhYmxlVmVydGV4QXR0cmliQXJyYXkgKHByaXYtPmF0dHJfcG9zaXRpb24pOworICBnbC0+RGlzYWJsZVZlcnRleEF0dHJpYkFycmF5IChwcml2LT5hdHRyX3RleHR1cmUpOworfQorCitzdGF0aWMgdm9pZAorZ3RrX2dzdF9nbF93aWRnZXRfaW5pdF9yZWRpc3BsYXkgKEd0a0dzdEdMV2lkZ2V0ICogZ3N0X3dpZGdldCkKK3sKKyAgR3RrR3N0R0xXaWRnZXRQcml2YXRlICpwcml2ID0gZ3N0X3dpZGdldC0+cHJpdjsKKyAgY29uc3QgR3N0R0xGdW5jcyAqZ2wgPSBwcml2LT5jb250ZXh0LT5nbF92dGFibGU7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworCisgIGdzdF9nbF9pbnNlcnRfZGVidWdfbWFya2VyIChwcml2LT5vdGhlcl9jb250ZXh0LCAiaW5pdGlhbGl6aW5nIHJlZGlzcGxheSIpOworICBpZiAoIShwcml2LT5zaGFkZXIgPSBnc3RfZ2xfc2hhZGVyX25ld19kZWZhdWx0IChwcml2LT5jb250ZXh0LCAmZXJyb3IpKSkgeworICAgIEdTVF9FUlJPUiAoIkZhaWxlZCB0byBpbml0aWFsaXplIHNoYWRlcjogJXMiLCBlcnJvci0+bWVzc2FnZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgcHJpdi0+YXR0cl9wb3NpdGlvbiA9CisgICAgICBnc3RfZ2xfc2hhZGVyX2dldF9hdHRyaWJ1dGVfbG9jYXRpb24gKHByaXYtPnNoYWRlciwgImFfcG9zaXRpb24iKTsKKyAgcHJpdi0+YXR0cl90ZXh0dXJlID0KKyAgICAgIGdzdF9nbF9zaGFkZXJfZ2V0X2F0dHJpYnV0ZV9sb2NhdGlvbiAocHJpdi0+c2hhZGVyLCAiYV90ZXhjb29yZCIpOworCisgIGlmIChnbC0+R2VuVmVydGV4QXJyYXlzKSB7CisgICAgZ2wtPkdlblZlcnRleEFycmF5cyAoMSwgJnByaXYtPnZhbyk7CisgICAgZ2wtPkJpbmRWZXJ0ZXhBcnJheSAocHJpdi0+dmFvKTsKKyAgfQorCisgIGdsLT5HZW5CdWZmZXJzICgxLCAmcHJpdi0+dmVydGV4X2J1ZmZlcik7CisgIGdsLT5CaW5kQnVmZmVyIChHTF9BUlJBWV9CVUZGRVIsIHByaXYtPnZlcnRleF9idWZmZXIpOworICBnbC0+QnVmZmVyRGF0YSAoR0xfQVJSQVlfQlVGRkVSLCA0ICogNSAqIHNpemVvZiAoR0xmbG9hdCksIHZlcnRpY2VzLAorICAgICAgR0xfU1RBVElDX0RSQVcpOworCisgIGlmIChnbC0+R2VuVmVydGV4QXJyYXlzKSB7CisgICAgZ3RrX2dzdF9nbF93aWRnZXRfYmluZF9idWZmZXIgKGdzdF93aWRnZXQpOworICAgIGdsLT5CaW5kVmVydGV4QXJyYXkgKDApOworICB9CisKKyAgZ2wtPkJpbmRCdWZmZXIgKEdMX0FSUkFZX0JVRkZFUiwgMCk7CisKKyAgcHJpdi0+b3ZlcmxheV9jb21wb3NpdG9yID0KKyAgICAgIGdzdF9nbF9vdmVybGF5X2NvbXBvc2l0b3JfbmV3IChwcml2LT5vdGhlcl9jb250ZXh0KTsKKworICBwcml2LT5pbml0dGVkID0gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK19yZWRyYXdfdGV4dHVyZSAoR3RrR3N0R0xXaWRnZXQgKiBnc3Rfd2lkZ2V0LCBndWludCB0ZXgpCit7CisgIEd0a0dzdEdMV2lkZ2V0UHJpdmF0ZSAqcHJpdiA9IGdzdF93aWRnZXQtPnByaXY7CisgIGNvbnN0IEdzdEdMRnVuY3MgKmdsID0gcHJpdi0+Y29udGV4dC0+Z2xfdnRhYmxlOworICBjb25zdCBHTHVzaG9ydCBpbmRpY2VzW10gPSB7IDAsIDEsIDIsIDAsIDIsIDMgfTsKKworICBpZiAoZ3N0X3dpZGdldC0+YmFzZS5mb3JjZV9hc3BlY3RfcmF0aW8pIHsKKyAgICBHc3RWaWRlb1JlY3RhbmdsZSBzcmMsIGRzdCwgcmVzdWx0OworICAgIGdpbnQgd2lkZ2V0X3dpZHRoLCB3aWRnZXRfaGVpZ2h0LCB3aWRnZXRfc2NhbGU7CisKKyAgICBnbC0+Q2xlYXJDb2xvciAoMC4wLCAwLjAsIDAuMCwgMC4wKTsKKyAgICBnbC0+Q2xlYXIgKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworCisgICAgd2lkZ2V0X3NjYWxlID0gZ3RrX3dpZGdldF9nZXRfc2NhbGVfZmFjdG9yICgoR3RrV2lkZ2V0ICopIGdzdF93aWRnZXQpOworICAgIHdpZGdldF93aWR0aCA9IGd0a193aWRnZXRfZ2V0X2FsbG9jYXRlZF93aWR0aCAoKEd0a1dpZGdldCAqKSBnc3Rfd2lkZ2V0KTsKKyAgICB3aWRnZXRfaGVpZ2h0ID0gZ3RrX3dpZGdldF9nZXRfYWxsb2NhdGVkX2hlaWdodCAoKEd0a1dpZGdldCAqKSBnc3Rfd2lkZ2V0KTsKKworICAgIHNyYy54ID0gMDsKKyAgICBzcmMueSA9IDA7CisgICAgc3JjLncgPSBnc3Rfd2lkZ2V0LT5iYXNlLmRpc3BsYXlfd2lkdGg7CisgICAgc3JjLmggPSBnc3Rfd2lkZ2V0LT5iYXNlLmRpc3BsYXlfaGVpZ2h0OworCisgICAgZHN0LnggPSAwOworICAgIGRzdC55ID0gMDsKKyAgICBkc3QudyA9IHdpZGdldF93aWR0aCAqIHdpZGdldF9zY2FsZTsKKyAgICBkc3QuaCA9IHdpZGdldF9oZWlnaHQgKiB3aWRnZXRfc2NhbGU7CisKKyAgICBnc3RfdmlkZW9fc2lua19jZW50ZXJfcmVjdCAoc3JjLCBkc3QsICZyZXN1bHQsIFRSVUUpOworCisgICAgZ2wtPlZpZXdwb3J0IChyZXN1bHQueCwgcmVzdWx0LnksIHJlc3VsdC53LCByZXN1bHQuaCk7CisgIH0KKworICBnc3RfZ2xfc2hhZGVyX3VzZSAocHJpdi0+c2hhZGVyKTsKKworICBpZiAoZ2wtPkJpbmRWZXJ0ZXhBcnJheSkKKyAgICBnbC0+QmluZFZlcnRleEFycmF5IChwcml2LT52YW8pOworICBndGtfZ3N0X2dsX3dpZGdldF9iaW5kX2J1ZmZlciAoZ3N0X3dpZGdldCk7CisKKyAgZ2wtPkFjdGl2ZVRleHR1cmUgKEdMX1RFWFRVUkUwKTsKKyAgZ2wtPkJpbmRUZXh0dXJlIChHTF9URVhUVVJFXzJELCB0ZXgpOworICBnc3RfZ2xfc2hhZGVyX3NldF91bmlmb3JtXzFpIChwcml2LT5zaGFkZXIsICJ0ZXgiLCAwKTsKKworICBnbC0+RHJhd0VsZW1lbnRzIChHTF9UUklBTkdMRVMsIDYsIEdMX1VOU0lHTkVEX1NIT1JULCBpbmRpY2VzKTsKKworICBpZiAoZ2wtPkJpbmRWZXJ0ZXhBcnJheSkKKyAgICBnbC0+QmluZFZlcnRleEFycmF5ICgwKTsKKyAgZ3RrX2dzdF9nbF93aWRnZXRfdW5iaW5kX2J1ZmZlciAoZ3N0X3dpZGdldCk7CisKKyAgZ2wtPkJpbmRUZXh0dXJlIChHTF9URVhUVVJFXzJELCAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfZHJhd19ibGFjayAoR3N0R0xDb250ZXh0ICogY29udGV4dCkKK3sKKyAgY29uc3QgR3N0R0xGdW5jcyAqZ2wgPSBjb250ZXh0LT5nbF92dGFibGU7CisKKyAgZ3N0X2dsX2luc2VydF9kZWJ1Z19tYXJrZXIgKGNvbnRleHQsICJubyBidWZmZXIuICByZW5kZXJpbmcgYmxhY2siKTsKKyAgZ2wtPkNsZWFyQ29sb3IgKDAuMCwgMC4wLCAwLjAsIDAuMCk7CisgIGdsLT5DbGVhciAoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3RrX2dzdF9nbF93aWRnZXRfcmVuZGVyIChHdGtHTEFyZWEgKiB3aWRnZXQsIEdka0dMQ29udGV4dCAqIGNvbnRleHQpCit7CisgIEd0a0dzdEdMV2lkZ2V0UHJpdmF0ZSAqcHJpdiA9IEdUS19HU1RfR0xfV0lER0VUICh3aWRnZXQpLT5wcml2OworICBHdGtHc3RCYXNlV2lkZ2V0ICpiYXNlX3dpZGdldCA9IEdUS19HU1RfQkFTRV9XSURHRVQgKHdpZGdldCk7CisKKyAgR1RLX0dTVF9CQVNFX1dJREdFVF9MT0NLICh3aWRnZXQpOworCisgIGlmICghcHJpdi0+Y29udGV4dCB8fCAhcHJpdi0+b3RoZXJfY29udGV4dCkKKyAgICBnb3RvIGRvbmU7CisKKyAgZ3N0X2dsX2NvbnRleHRfYWN0aXZhdGUgKHByaXYtPm90aGVyX2NvbnRleHQsIFRSVUUpOworCisgIGlmICghcHJpdi0+aW5pdHRlZCkKKyAgICBndGtfZ3N0X2dsX3dpZGdldF9pbml0X3JlZGlzcGxheSAoR1RLX0dTVF9HTF9XSURHRVQgKHdpZGdldCkpOworCisgIGlmICghcHJpdi0+aW5pdHRlZCB8fCAhYmFzZV93aWRnZXQtPm5lZ290aWF0ZWQpIHsKKyAgICBfZHJhd19ibGFjayAocHJpdi0+b3RoZXJfY29udGV4dCk7CisgICAgZ290byBkb25lOworICB9CisKKyAgLyogVXBsb2FkIGxhdGVzdCBidWZmZXIgKi8KKyAgaWYgKGJhc2Vfd2lkZ2V0LT5wZW5kaW5nX2J1ZmZlcikgeworICAgIEdzdEJ1ZmZlciAqYnVmZmVyID0gYmFzZV93aWRnZXQtPnBlbmRpbmdfYnVmZmVyOworICAgIEdzdFZpZGVvRnJhbWUgZ2xfZnJhbWU7CisgICAgR3N0R0xTeW5jTWV0YSAqc3luY19tZXRhOworCisgICAgaWYgKCFnc3RfdmlkZW9fZnJhbWVfbWFwICgmZ2xfZnJhbWUsICZiYXNlX3dpZGdldC0+dl9pbmZvLCBidWZmZXIsCisgICAgICAgICAgICBHU1RfTUFQX1JFQUQgfCBHU1RfTUFQX0dMKSkgeworICAgICAgX2RyYXdfYmxhY2sgKHByaXYtPm90aGVyX2NvbnRleHQpOworICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIHByaXYtPmN1cnJlbnRfdGV4ID0gKihndWludCAqKSBnbF9mcmFtZS5kYXRhWzBdOworICAgIGdzdF9nbF9pbnNlcnRfZGVidWdfbWFya2VyIChwcml2LT5vdGhlcl9jb250ZXh0LCAicmVkcmF3aW5nIHRleHR1cmUgJXUiLAorICAgICAgICBwcml2LT5jdXJyZW50X3RleCk7CisKKyAgICBnc3RfZ2xfb3ZlcmxheV9jb21wb3NpdG9yX3VwbG9hZF9vdmVybGF5cyAocHJpdi0+b3ZlcmxheV9jb21wb3NpdG9yLAorICAgICAgICBidWZmZXIpOworCisgICAgc3luY19tZXRhID0gZ3N0X2J1ZmZlcl9nZXRfZ2xfc3luY19tZXRhIChidWZmZXIpOworICAgIGlmIChzeW5jX21ldGEpIHsKKyAgICAgIC8qIFhYWDogdGhlIHNldF9zeW5jKCkgc2VlbXMgdG8gYmUgbmVlZGVkIGZvciByZXNpemluZyAqLworICAgICAgZ3N0X2dsX3N5bmNfbWV0YV9zZXRfc3luY19wb2ludCAoc3luY19tZXRhLCBwcml2LT5jb250ZXh0KTsKKyAgICAgIGdzdF9nbF9zeW5jX21ldGFfd2FpdCAoc3luY19tZXRhLCBwcml2LT5vdGhlcl9jb250ZXh0KTsKKyAgICB9CisKKyAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKCZnbF9mcmFtZSk7CisKKyAgICBpZiAoYmFzZV93aWRnZXQtPmJ1ZmZlcikKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJhc2Vfd2lkZ2V0LT5idWZmZXIpOworCisgICAgLyogS2VlcCB0aGUgYnVmZmVyIHRvIGVuc3VyZSBjdXJyZW50X3RleCBzdGF5IHZhbGlkICovCisgICAgYmFzZV93aWRnZXQtPmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICBiYXNlX3dpZGdldC0+cGVuZGluZ19idWZmZXIgPSBOVUxMOworICB9CisKKyAgR1NUX0RFQlVHICgicmVuZGVyaW5nIGJ1ZmZlciAlcCB3aXRoIGdkayBjb250ZXh0ICVwIiwKKyAgICAgIGJhc2Vfd2lkZ2V0LT5idWZmZXIsIGNvbnRleHQpOworCisgIF9yZWRyYXdfdGV4dHVyZSAoR1RLX0dTVF9HTF9XSURHRVQgKHdpZGdldCksIHByaXYtPmN1cnJlbnRfdGV4KTsKKyAgZ3N0X2dsX292ZXJsYXlfY29tcG9zaXRvcl9kcmF3X292ZXJsYXlzIChwcml2LT5vdmVybGF5X2NvbXBvc2l0b3IpOworCisgIGdzdF9nbF9pbnNlcnRfZGVidWdfbWFya2VyIChwcml2LT5vdGhlcl9jb250ZXh0LCAidGV4dHVyZSAldSByZWRyYXduIiwKKyAgICAgIHByaXYtPmN1cnJlbnRfdGV4KTsKKworZG9uZToKKyAgaWYgKHByaXYtPm90aGVyX2NvbnRleHQpCisgICAgZ3N0X2dsX2NvbnRleHRfYWN0aXZhdGUgKHByaXYtPm90aGVyX2NvbnRleHQsIEZBTFNFKTsKKworICBHVEtfR1NUX0JBU0VfV0lER0VUX1VOTE9DSyAod2lkZ2V0KTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorX3Jlc2V0X2dsIChHdGtHc3RHTFdpZGdldCAqIGdzdF93aWRnZXQpCit7CisgIEd0a0dzdEdMV2lkZ2V0UHJpdmF0ZSAqcHJpdiA9IGdzdF93aWRnZXQtPnByaXY7CisgIGNvbnN0IEdzdEdMRnVuY3MgKmdsID0gcHJpdi0+b3RoZXJfY29udGV4dC0+Z2xfdnRhYmxlOworCisgIGlmICghcHJpdi0+Z2RrX2NvbnRleHQpCisgICAgcHJpdi0+Z2RrX2NvbnRleHQgPSBndGtfZ2xfYXJlYV9nZXRfY29udGV4dCAoR1RLX0dMX0FSRUEgKGdzdF93aWRnZXQpKTsKKworICBpZiAocHJpdi0+Z2RrX2NvbnRleHQgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgZ2RrX2dsX2NvbnRleHRfbWFrZV9jdXJyZW50IChwcml2LT5nZGtfY29udGV4dCk7CisgIGdzdF9nbF9jb250ZXh0X2FjdGl2YXRlIChwcml2LT5vdGhlcl9jb250ZXh0LCBUUlVFKTsKKworICBpZiAocHJpdi0+dmFvKSB7CisgICAgZ2wtPkRlbGV0ZVZlcnRleEFycmF5cyAoMSwgJnByaXYtPnZhbyk7CisgICAgcHJpdi0+dmFvID0gMDsKKyAgfQorCisgIGlmIChwcml2LT52ZXJ0ZXhfYnVmZmVyKSB7CisgICAgZ2wtPkRlbGV0ZUJ1ZmZlcnMgKDEsICZwcml2LT52ZXJ0ZXhfYnVmZmVyKTsKKyAgICBwcml2LT52ZXJ0ZXhfYnVmZmVyID0gMDsKKyAgfQorCisgIGlmIChwcml2LT51cGxvYWQpIHsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwcml2LT51cGxvYWQpOworICAgIHByaXYtPnVwbG9hZCA9IE5VTEw7CisgIH0KKworICBpZiAocHJpdi0+c2hhZGVyKSB7CisgICAgZ3N0X29iamVjdF91bnJlZiAocHJpdi0+c2hhZGVyKTsKKyAgICBwcml2LT5zaGFkZXIgPSBOVUxMOworICB9CisKKyAgaWYgKHByaXYtPm92ZXJsYXlfY29tcG9zaXRvcikKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwcml2LT5vdmVybGF5X2NvbXBvc2l0b3IpOworCisgIGdzdF9nbF9jb250ZXh0X2FjdGl2YXRlIChwcml2LT5vdGhlcl9jb250ZXh0LCBGQUxTRSk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocHJpdi0+b3RoZXJfY29udGV4dCk7CisgIHByaXYtPm90aGVyX2NvbnRleHQgPSBOVUxMOworCisgIGdka19nbF9jb250ZXh0X2NsZWFyX2N1cnJlbnQgKCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHByaXYtPmdka19jb250ZXh0KTsKKyAgcHJpdi0+Z2RrX2NvbnRleHQgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3RrX2dzdF9nbF93aWRnZXRfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEd0a0dzdEdMV2lkZ2V0UHJpdmF0ZSAqcHJpdiA9IEdUS19HU1RfR0xfV0lER0VUIChvYmplY3QpLT5wcml2OworICBHdGtHc3RCYXNlV2lkZ2V0ICpiYXNlX3dpZGdldCA9IEdUS19HU1RfQkFTRV9XSURHRVQgKG9iamVjdCk7CisKKyAgaWYgKHByaXYtPm90aGVyX2NvbnRleHQpCisgICAgZ3N0X2d0a19pbnZva2Vfb25fbWFpbiAoKEdUaHJlYWRGdW5jKSBfcmVzZXRfZ2wsIGJhc2Vfd2lkZ2V0KTsKKworICBpZiAocHJpdi0+Y29udGV4dCkKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwcml2LT5jb250ZXh0KTsKKworICBpZiAocHJpdi0+ZGlzcGxheSkKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwcml2LT5kaXNwbGF5KTsKKworICBndGtfZ3N0X2Jhc2Vfd2lkZ2V0X2ZpbmFsaXplIChvYmplY3QpOworICBHX09CSkVDVF9DTEFTUyAoZ3RrX2dzdF9nbF93aWRnZXRfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitndGtfZ3N0X2dsX3dpZGdldF9jbGFzc19pbml0IChHdGtHc3RHTFdpZGdldENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9rbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEd0a0dMQXJlYUNsYXNzICpnbF93aWRnZXRfa2xhc3MgPSAoR3RrR0xBcmVhQ2xhc3MgKikga2xhc3M7CisKKyAgZ190eXBlX2NsYXNzX2FkZF9wcml2YXRlIChrbGFzcywgc2l6ZW9mIChHdGtHc3RHTFdpZGdldFByaXZhdGUpKTsKKyAgZ3RrX2dzdF9iYXNlX3dpZGdldF9jbGFzc19pbml0IChHVEtfR1NUX0JBU0VfV0lER0VUX0NMQVNTIChrbGFzcykpOworCisgIGdvYmplY3Rfa2xhc3MtPmZpbmFsaXplID0gZ3RrX2dzdF9nbF93aWRnZXRfZmluYWxpemU7CisgIGdsX3dpZGdldF9rbGFzcy0+cmVuZGVyID0gZ3RrX2dzdF9nbF93aWRnZXRfcmVuZGVyOworfQorCitzdGF0aWMgdm9pZAorZ3RrX2dzdF9nbF93aWRnZXRfaW5pdCAoR3RrR3N0R0xXaWRnZXQgKiBnc3Rfd2lkZ2V0KQoreworICBHdGtHc3RCYXNlV2lkZ2V0ICpiYXNlX3dpZGdldCA9IEdUS19HU1RfQkFTRV9XSURHRVQgKGdzdF93aWRnZXQpOworICBHZGtEaXNwbGF5ICpkaXNwbGF5OworICBHdGtHc3RHTFdpZGdldFByaXZhdGUgKnByaXY7CisKKyAgZ3RrX2dzdF9iYXNlX3dpZGdldF9pbml0IChiYXNlX3dpZGdldCk7CisKKyAgZ3N0X3dpZGdldC0+cHJpdiA9IHByaXYgPSBHVEtfR1NUX0dMX1dJREdFVF9HRVRfUFJJVkFURSAoZ3N0X3dpZGdldCk7CisKKyAgZGlzcGxheSA9IGdka19kaXNwbGF5X2dldF9kZWZhdWx0ICgpOworCisjaWYgR1NUX0dMX0hBVkVfV0lORE9XX1gxMSAmJiBHU1RfR0xfSEFWRV9QTEFURk9STV9HTFggJiYgZGVmaW5lZCAoR0RLX1dJTkRPV0lOR19YMTEpCisgIGlmIChHREtfSVNfWDExX0RJU1BMQVkgKGRpc3BsYXkpKQorICAgIHByaXYtPmRpc3BsYXkgPSAoR3N0R0xEaXNwbGF5ICopCisgICAgICAgIGdzdF9nbF9kaXNwbGF5X3gxMV9uZXdfd2l0aF9kaXNwbGF5IChnZGtfeDExX2Rpc3BsYXlfZ2V0X3hkaXNwbGF5CisgICAgICAgIChkaXNwbGF5KSk7CisjZW5kaWYKKyNpZiBHU1RfR0xfSEFWRV9XSU5ET1dfV0FZTEFORCAmJiBHU1RfR0xfSEFWRV9QTEFURk9STV9FR0wgJiYgZGVmaW5lZCAoR0RLX1dJTkRPV0lOR19XQVlMQU5EKQorICBpZiAoR0RLX0lTX1dBWUxBTkRfRElTUExBWSAoZGlzcGxheSkpIHsKKyAgICBzdHJ1Y3Qgd2xfZGlzcGxheSAqd2F5bGFuZF9kaXNwbGF5ID0KKyAgICAgICAgZ2RrX3dheWxhbmRfZGlzcGxheV9nZXRfd2xfZGlzcGxheSAoZGlzcGxheSk7CisgICAgcHJpdi0+ZGlzcGxheSA9IChHc3RHTERpc3BsYXkgKikKKyAgICAgICAgZ3N0X2dsX2Rpc3BsYXlfd2F5bGFuZF9uZXdfd2l0aF9kaXNwbGF5ICh3YXlsYW5kX2Rpc3BsYXkpOworICB9CisjZW5kaWYKKworICAodm9pZCkgZGlzcGxheTsKKworICBpZiAoIXByaXYtPmRpc3BsYXkpCisgICAgcHJpdi0+ZGlzcGxheSA9IGdzdF9nbF9kaXNwbGF5X25ldyAoKTsKKworICBndGtfZ2xfYXJlYV9zZXRfaGFzX2FscGhhIChHVEtfR0xfQVJFQSAoZ3N0X3dpZGdldCksCisgICAgICAhYmFzZV93aWRnZXQtPmlnbm9yZV9hbHBoYSk7Cit9CisKK3N0YXRpYyB2b2lkCitfZ2V0X2dsX2NvbnRleHQgKEd0a0dzdEdMV2lkZ2V0ICogZ3N0X3dpZGdldCkKK3sKKyAgR3RrR3N0R0xXaWRnZXRQcml2YXRlICpwcml2ID0gZ3N0X3dpZGdldC0+cHJpdjsKKyAgR3N0R0xQbGF0Zm9ybSBwbGF0Zm9ybTsKKyAgR3N0R0xBUEkgZ2xfYXBpOworICBndWludHB0ciBnbF9oYW5kbGU7CisKKyAgZ3RrX3dpZGdldF9yZWFsaXplIChHVEtfV0lER0VUIChnc3Rfd2lkZ2V0KSk7CisKKyAgaWYgKHByaXYtPm90aGVyX2NvbnRleHQpCisgICAgZ3N0X29iamVjdF91bnJlZiAocHJpdi0+b3RoZXJfY29udGV4dCk7CisgIHByaXYtPm90aGVyX2NvbnRleHQgPSBOVUxMOworCisgIGlmIChwcml2LT5nZGtfY29udGV4dCkKKyAgICBnX29iamVjdF91bnJlZiAocHJpdi0+Z2RrX2NvbnRleHQpOworCisgIHByaXYtPmdka19jb250ZXh0ID0gZ3RrX2dsX2FyZWFfZ2V0X2NvbnRleHQgKEdUS19HTF9BUkVBIChnc3Rfd2lkZ2V0KSk7CisgIGlmIChwcml2LT5nZGtfY29udGV4dCA9PSBOVUxMKSB7CisgICAgR0Vycm9yICplcnJvciA9IGd0a19nbF9hcmVhX2dldF9lcnJvciAoR1RLX0dMX0FSRUEgKGdzdF93aWRnZXQpKTsKKworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGdzdF93aWRnZXQsICJFcnJvciBjcmVhdGluZyBHZGtHTENvbnRleHQgOiAlcyIsCisgICAgICAgIGVycm9yID8gZXJyb3ItPm1lc3NhZ2UgOiAiTm8gZXJyb3Igc2V0IGJ5IEdkayIpOworICAgIGdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisgICAgcmV0dXJuOworICB9CisKKyAgZ19vYmplY3RfcmVmIChwcml2LT5nZGtfY29udGV4dCk7CisKKyAgZ2RrX2dsX2NvbnRleHRfbWFrZV9jdXJyZW50IChwcml2LT5nZGtfY29udGV4dCk7CisKKyNpZiBHU1RfR0xfSEFWRV9XSU5ET1dfWDExICYmIEdTVF9HTF9IQVZFX1BMQVRGT1JNX0dMWCAmJiBkZWZpbmVkIChHREtfV0lORE9XSU5HX1gxMSkKKyAgaWYgKEdTVF9JU19HTF9ESVNQTEFZX1gxMSAocHJpdi0+ZGlzcGxheSkpIHsKKyAgICBwbGF0Zm9ybSA9IEdTVF9HTF9QTEFURk9STV9HTFg7CisgICAgZ2xfYXBpID0gZ3N0X2dsX2NvbnRleHRfZ2V0X2N1cnJlbnRfZ2xfYXBpIChwbGF0Zm9ybSwgTlVMTCwgTlVMTCk7CisgICAgZ2xfaGFuZGxlID0gZ3N0X2dsX2NvbnRleHRfZ2V0X2N1cnJlbnRfZ2xfY29udGV4dCAocGxhdGZvcm0pOworICAgIGlmIChnbF9oYW5kbGUpCisgICAgICBwcml2LT5vdGhlcl9jb250ZXh0ID0KKyAgICAgICAgICBnc3RfZ2xfY29udGV4dF9uZXdfd3JhcHBlZCAocHJpdi0+ZGlzcGxheSwgZ2xfaGFuZGxlLAorICAgICAgICAgIHBsYXRmb3JtLCBnbF9hcGkpOworICB9CisjZW5kaWYKKyNpZiBHU1RfR0xfSEFWRV9XSU5ET1dfV0FZTEFORCAmJiBHU1RfR0xfSEFWRV9QTEFURk9STV9FR0wgJiYgZGVmaW5lZCAoR0RLX1dJTkRPV0lOR19XQVlMQU5EKQorICBpZiAoR1NUX0lTX0dMX0RJU1BMQVlfV0FZTEFORCAocHJpdi0+ZGlzcGxheSkpIHsKKyAgICBwbGF0Zm9ybSA9IEdTVF9HTF9QTEFURk9STV9FR0w7CisgICAgZ2xfYXBpID0gZ3N0X2dsX2NvbnRleHRfZ2V0X2N1cnJlbnRfZ2xfYXBpIChwbGF0Zm9ybSwgTlVMTCwgTlVMTCk7CisgICAgZ2xfaGFuZGxlID0gZ3N0X2dsX2NvbnRleHRfZ2V0X2N1cnJlbnRfZ2xfY29udGV4dCAocGxhdGZvcm0pOworICAgIGlmIChnbF9oYW5kbGUpCisgICAgICBwcml2LT5vdGhlcl9jb250ZXh0ID0KKyAgICAgICAgICBnc3RfZ2xfY29udGV4dF9uZXdfd3JhcHBlZCAocHJpdi0+ZGlzcGxheSwgZ2xfaGFuZGxlLAorICAgICAgICAgIHBsYXRmb3JtLCBnbF9hcGkpOworICB9CisjZW5kaWYKKworICAodm9pZCkgcGxhdGZvcm07CisgICh2b2lkKSBnbF9hcGk7CisgICh2b2lkKSBnbF9oYW5kbGU7CisKKyAgaWYgKHByaXYtPm90aGVyX2NvbnRleHQpIHsKKyAgICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKworICAgIGdzdF9nbF9jb250ZXh0X2FjdGl2YXRlIChwcml2LT5vdGhlcl9jb250ZXh0LCBUUlVFKTsKKyAgICBpZiAoIWdzdF9nbF9jb250ZXh0X2ZpbGxfaW5mbyAocHJpdi0+b3RoZXJfY29udGV4dCwgJmVycm9yKSkgeworICAgICAgR1NUX0VSUk9SICgiZmFpbGVkIHRvIHJldHJpZXZlIGdkayBjb250ZXh0IGluZm86ICVzIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgZ19jbGVhcl9lcnJvciAoJmVycm9yKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChwcml2LT5vdGhlcl9jb250ZXh0KTsKKyAgICAgIHByaXYtPm90aGVyX2NvbnRleHQgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICBnc3RfZ2xfY29udGV4dF9hY3RpdmF0ZSAocHJpdi0+b3RoZXJfY29udGV4dCwgRkFMU0UpOworICAgIH0KKyAgfQorfQorCitHdGtXaWRnZXQgKgorZ3RrX2dzdF9nbF93aWRnZXRfbmV3ICh2b2lkKQoreworICByZXR1cm4gKEd0a1dpZGdldCAqKSBnX29iamVjdF9uZXcgKEdUS19UWVBFX0dTVF9HTF9XSURHRVQsIE5VTEwpOworfQorCitnYm9vbGVhbgorZ3RrX2dzdF9nbF93aWRnZXRfaW5pdF93aW5zeXMgKEd0a0dzdEdMV2lkZ2V0ICogZ3N0X3dpZGdldCkKK3sKKyAgR3RrR3N0R0xXaWRnZXRQcml2YXRlICpwcml2ID0gZ3N0X3dpZGdldC0+cHJpdjsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdUS19JU19HU1RfR0xfV0lER0VUIChnc3Rfd2lkZ2V0KSwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAocHJpdi0+ZGlzcGxheSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgR1RLX0dTVF9CQVNFX1dJREdFVF9MT0NLIChnc3Rfd2lkZ2V0KTsKKworICBpZiAocHJpdi0+ZGlzcGxheSAmJiBwcml2LT5nZGtfY29udGV4dCAmJiBwcml2LT5vdGhlcl9jb250ZXh0KSB7CisgICAgR1RLX0dTVF9CQVNFX1dJREdFVF9VTkxPQ0sgKGdzdF93aWRnZXQpOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgaWYgKCFwcml2LT5vdGhlcl9jb250ZXh0KSB7CisgICAgR1RLX0dTVF9CQVNFX1dJREdFVF9VTkxPQ0sgKGdzdF93aWRnZXQpOworICAgIGdzdF9ndGtfaW52b2tlX29uX21haW4gKChHVGhyZWFkRnVuYykgX2dldF9nbF9jb250ZXh0LCBnc3Rfd2lkZ2V0KTsKKyAgICBHVEtfR1NUX0JBU0VfV0lER0VUX0xPQ0sgKGdzdF93aWRnZXQpOworICB9CisKKyAgaWYgKCFHU1RfSVNfR0xfQ09OVEVYVCAocHJpdi0+b3RoZXJfY29udGV4dCkpIHsKKyAgICBHVEtfR1NUX0JBU0VfV0lER0VUX1VOTE9DSyAoZ3N0X3dpZGdldCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgR1NUX09CSkVDVF9MT0NLIChwcml2LT5kaXNwbGF5KTsKKyAgaWYgKCFnc3RfZ2xfZGlzcGxheV9jcmVhdGVfY29udGV4dCAocHJpdi0+ZGlzcGxheSwgcHJpdi0+b3RoZXJfY29udGV4dCwKKyAgICAgICAgICAmcHJpdi0+Y29udGV4dCwgJmVycm9yKSkgeworICAgIGdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHByaXYtPmRpc3BsYXkpOworICAgIEdUS19HU1RfQkFTRV9XSURHRVRfVU5MT0NLIChnc3Rfd2lkZ2V0KTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZ3N0X2dsX2Rpc3BsYXlfYWRkX2NvbnRleHQgKHByaXYtPmRpc3BsYXksIHByaXYtPmNvbnRleHQpOworICBHU1RfT0JKRUNUX1VOTE9DSyAocHJpdi0+ZGlzcGxheSk7CisKKyAgR1RLX0dTVF9CQVNFX1dJREdFVF9VTkxPQ0sgKGdzdF93aWRnZXQpOworICByZXR1cm4gVFJVRTsKK30KKworR3N0R0xDb250ZXh0ICoKK2d0a19nc3RfZ2xfd2lkZ2V0X2dldF9ndGtfY29udGV4dCAoR3RrR3N0R0xXaWRnZXQgKiBnc3Rfd2lkZ2V0KQoreworICBpZiAoIWdzdF93aWRnZXQtPnByaXYtPm90aGVyX2NvbnRleHQpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIGdzdF9vYmplY3RfcmVmIChnc3Rfd2lkZ2V0LT5wcml2LT5vdGhlcl9jb250ZXh0KTsKK30KKworR3N0R0xDb250ZXh0ICoKK2d0a19nc3RfZ2xfd2lkZ2V0X2dldF9jb250ZXh0IChHdGtHc3RHTFdpZGdldCAqIGdzdF93aWRnZXQpCit7CisgIGlmICghZ3N0X3dpZGdldC0+cHJpdi0+Y29udGV4dCkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gZ3N0X29iamVjdF9yZWYgKGdzdF93aWRnZXQtPnByaXYtPmNvbnRleHQpOworfQorCitHc3RHTERpc3BsYXkgKgorZ3RrX2dzdF9nbF93aWRnZXRfZ2V0X2Rpc3BsYXkgKEd0a0dzdEdMV2lkZ2V0ICogZ3N0X3dpZGdldCkKK3sKKyAgaWYgKCFnc3Rfd2lkZ2V0LT5wcml2LT5kaXNwbGF5KQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiBnc3Rfb2JqZWN0X3JlZiAoZ3N0X3dpZGdldC0+cHJpdi0+ZGlzcGxheSk7Cit9CmRpZmYgLS1naXQgYS9leHQvZ3RrL2d0a2dzdGdsd2lkZ2V0LmggYi9leHQvZ3RrL2d0a2dzdGdsd2lkZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwNTVjNAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9ndGsvZ3RrZ3N0Z2x3aWRnZXQuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgTWF0dGhldyBXYXRlcnMgPG1hdHRoZXdAY2VudHJpY3VsYXIuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HVEtfR1NUX0dMX1dJREdFVF9IX18KKyNkZWZpbmUgX19HVEtfR1NUX0dMX1dJREdFVF9IX18KKworI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2dsL2dsLmg+CisKKyNpbmNsdWRlICJndGtnc3RiYXNld2lkZ2V0LmgiCisKK0dfQkVHSU5fREVDTFMKKworR1R5cGUgZ3RrX2dzdF9nbF93aWRnZXRfZ2V0X3R5cGUgKHZvaWQpOworI2RlZmluZSBHVEtfVFlQRV9HU1RfR0xfV0lER0VUIChndGtfZ3N0X2dsX3dpZGdldF9nZXRfdHlwZSgpKQorI2RlZmluZSBHVEtfR1NUX0dMX1dJREdFVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHVEtfVFlQRV9HU1RfR0xfV0lER0VULEd0a0dzdEdMV2lkZ2V0KSkKKyNkZWZpbmUgR1RLX0dTVF9HTF9XSURHRVRfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdUS19UWVBFX0dTVF9HTF9XSURHRVQsR3RrR3N0R0xXaWRnZXRDbGFzcykpCisjZGVmaW5lIEdUS19JU19HU1RfR0xfV0lER0VUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdUS19UWVBFX0dTVF9HTF9XSURHRVQpKQorI2RlZmluZSBHVEtfSVNfR1NUX0dMX1dJREdFVF9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1RLX1RZUEVfR1NUX0dMX1dJREdFVCkpCisjZGVmaW5lIEdUS19HU1RfR0xfV0lER0VUX0NBU1Qob2JqKSAoKEd0a0dzdEdMV2lkZ2V0Kikob2JqKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0d0a0dzdEdMV2lkZ2V0IEd0a0dzdEdMV2lkZ2V0OwordHlwZWRlZiBzdHJ1Y3QgX0d0a0dzdEdMV2lkZ2V0Q2xhc3MgR3RrR3N0R0xXaWRnZXRDbGFzczsKK3R5cGVkZWYgc3RydWN0IF9HdGtHc3RHTFdpZGdldFByaXZhdGUgR3RrR3N0R0xXaWRnZXRQcml2YXRlOworCisvKioKKyAqIEd0a0dzdEdMV2lkZ2V0OgorICoKKyAqIE9wYXF1ZSAjR3RrR3N0R0xXaWRnZXQgb2JqZWN0CisgKi8KK3N0cnVjdCBfR3RrR3N0R0xXaWRnZXQKK3sKKyAgLyogPHByaXZhdGU+ICovCisgIEd0a0dzdEJhc2VXaWRnZXQgYmFzZTsKKworICBHdGtHc3RHTFdpZGdldFByaXZhdGUgICAqcHJpdjsKK307CisKKy8qKgorICogR3RrR3N0R0xXaWRnZXRDbGFzczoKKyAqCisgKiBUaGUgI0d0a0dzdEdMV2lkZ2V0Q2xhc3Mgc3RydWN0IG9ubHkgY29udGFpbnMgcHJpdmF0ZSBkYXRhCisgKi8KK3N0cnVjdCBfR3RrR3N0R0xXaWRnZXRDbGFzcworeworICAvKiA8cHJpdmF0ZT4gKi8KKyAgR3RrR3N0QmFzZVdpZGdldENsYXNzIGJhc2VfY2xhc3M7Cit9OworCitHdGtXaWRnZXQgKiAgICAgZ3RrX2dzdF9nbF93aWRnZXRfbmV3ICh2b2lkKTsKKworZ2Jvb2xlYW4gICAgICAgIGd0a19nc3RfZ2xfd2lkZ2V0X2luaXRfd2luc3lzICAgICAgICAgIChHdGtHc3RHTFdpZGdldCAqIHdpZGdldCk7CitHc3RHTERpc3BsYXkgKiAgZ3RrX2dzdF9nbF93aWRnZXRfZ2V0X2Rpc3BsYXkgICAgICAgICAgKEd0a0dzdEdMV2lkZ2V0ICogd2lkZ2V0KTsKK0dzdEdMQ29udGV4dCAqICBndGtfZ3N0X2dsX3dpZGdldF9nZXRfY29udGV4dCAgICAgICAgICAoR3RrR3N0R0xXaWRnZXQgKiB3aWRnZXQpOworR3N0R0xDb250ZXh0ICogIGd0a19nc3RfZ2xfd2lkZ2V0X2dldF9ndGtfY29udGV4dCAgICAgIChHdGtHc3RHTFdpZGdldCAqIHdpZGdldCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dUS19HU1RfR0xfV0lER0VUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L2d0ay9ndGtnc3R3aWRnZXQuYyBiL2V4dC9ndGsvZ3RrZ3N0d2lkZ2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkzNjIxMAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9ndGsvZ3RrZ3N0d2lkZ2V0LmMKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxNSBNYXR0aGV3IFdhdGVycyA8bWF0dGhld0BjZW50cmljdWxhci5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImd0a2dzdHdpZGdldC5oIgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisvKioKKyAqIFNFQ1RJT046Z3RrZ3N0d2lkZ2V0CisgKiBAdGl0bGU6IEd0a0dzdFdpZGdldAorICogQHNob3J0X2Rlc2NyaXB0aW9uOiBhICNHdGtXaWRnZXQgdGhhdCByZW5kZXJzIEdTdHJlYW1lciB2aWRlbyAjR3N0QnVmZmVycworICogQHNlZV9hbHNvOiAjR3RrRHJhd2luZ0FyZWEsICNHc3RCdWZmZXIKKyAqCisgKiAjR3RrR3N0V2lkZ2V0IGlzIGFuICNHdGtXaWRnZXQgdGhhdCByZW5kZXJzIEdTdHJlYW1lciB2aWRlbyBidWZmZXJzLgorICovCisKK0dfREVGSU5FX1RZUEUgKEd0a0dzdFdpZGdldCwgZ3RrX2dzdF93aWRnZXQsIEdUS19UWVBFX0RSQVdJTkdfQVJFQSk7CisKK3N0YXRpYyBnYm9vbGVhbgorZ3RrX2dzdF93aWRnZXRfZHJhdyAoR3RrV2lkZ2V0ICogd2lkZ2V0LCBjYWlyb190ICogY3IpCit7CisgIEd0a0dzdEJhc2VXaWRnZXQgKmdzdF93aWRnZXQgPSAoR3RrR3N0QmFzZVdpZGdldCAqKSB3aWRnZXQ7CisgIGd1aW50IHdpZGdldF93aWR0aCwgd2lkZ2V0X2hlaWdodDsKKyAgY2Fpcm9fc3VyZmFjZV90ICpzdXJmYWNlOworICBHc3RWaWRlb0ZyYW1lIGZyYW1lOworCisgIHdpZGdldF93aWR0aCA9IGd0a193aWRnZXRfZ2V0X2FsbG9jYXRlZF93aWR0aCAod2lkZ2V0KTsKKyAgd2lkZ2V0X2hlaWdodCA9IGd0a193aWRnZXRfZ2V0X2FsbG9jYXRlZF9oZWlnaHQgKHdpZGdldCk7CisKKyAgR1RLX0dTVF9CQVNFX1dJREdFVF9MT0NLIChnc3Rfd2lkZ2V0KTsKKworICAvKiBUaGVyZSBpcyBub3QgbXVjaCB0byBvcHRpbWl6ZSBpbiB0ZXJtIG9mIHJlZGlzcGxheSwgc28gc2ltcGx5IHN3YXAgdGhlCisgICAqIHBlbmRpbmdfYnVmZmVyIHdpdGggdGhlIGFjdGl2ZSBidWZmZXIgKi8KKyAgaWYgKGdzdF93aWRnZXQtPnBlbmRpbmdfYnVmZmVyKSB7CisgICAgaWYgKGdzdF93aWRnZXQtPmJ1ZmZlcikKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF93aWRnZXQtPmJ1ZmZlcik7CisgICAgZ3N0X3dpZGdldC0+YnVmZmVyID0gZ3N0X3dpZGdldC0+cGVuZGluZ19idWZmZXI7CisgICAgZ3N0X3dpZGdldC0+cGVuZGluZ19idWZmZXIgPSBOVUxMOworICB9CisKKyAgLyogZmFpbGVkIHRvIG1hcCB0aGUgdmlkZW8gZnJhbWUgKi8KKyAgaWYgKGdzdF93aWRnZXQtPm5lZ290aWF0ZWQgJiYgZ3N0X3dpZGdldC0+YnVmZmVyCisgICAgICAmJiBnc3RfdmlkZW9fZnJhbWVfbWFwICgmZnJhbWUsICZnc3Rfd2lkZ2V0LT52X2luZm8sCisgICAgICAgICAgZ3N0X3dpZGdldC0+YnVmZmVyLCBHU1RfTUFQX1JFQUQpKSB7CisgICAgZ2RvdWJsZSBzY2FsZV94ID0gKGdkb3VibGUpIHdpZGdldF93aWR0aCAvIGdzdF93aWRnZXQtPmRpc3BsYXlfd2lkdGg7CisgICAgZ2RvdWJsZSBzY2FsZV95ID0gKGdkb3VibGUpIHdpZGdldF9oZWlnaHQgLyBnc3Rfd2lkZ2V0LT5kaXNwbGF5X2hlaWdodDsKKyAgICBHc3RWaWRlb1JlY3RhbmdsZSByZXN1bHQ7CisgICAgY2Fpcm9fZm9ybWF0X3QgZm9ybWF0OworCisgICAgZ3N0X3dpZGdldC0+dl9pbmZvID0gZnJhbWUuaW5mbzsKKyAgICBpZiAoZnJhbWUuaW5mby5maW5mby0+Zm9ybWF0ID09IEdTVF9WSURFT19GT1JNQVRfQVJHQiB8fAorICAgICAgICBmcmFtZS5pbmZvLmZpbmZvLT5mb3JtYXQgPT0gR1NUX1ZJREVPX0ZPUk1BVF9CR1JBKSB7CisgICAgICBmb3JtYXQgPSBDQUlST19GT1JNQVRfQVJHQjMyOworICAgIH0gZWxzZSB7CisgICAgICBmb3JtYXQgPSBDQUlST19GT1JNQVRfUkdCMjQ7CisgICAgfQorCisgICAgc3VyZmFjZSA9IGNhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlX2Zvcl9kYXRhIChmcmFtZS5kYXRhWzBdLAorICAgICAgICBmb3JtYXQsIGZyYW1lLmluZm8ud2lkdGgsIGZyYW1lLmluZm8uaGVpZ2h0LCBmcmFtZS5pbmZvLnN0cmlkZVswXSk7CisKKyAgICBpZiAoZ3N0X3dpZGdldC0+Zm9yY2VfYXNwZWN0X3JhdGlvKSB7CisgICAgICBHc3RWaWRlb1JlY3RhbmdsZSBzcmMsIGRzdDsKKworICAgICAgc3JjLnggPSAwOworICAgICAgc3JjLnkgPSAwOworICAgICAgc3JjLncgPSBnc3Rfd2lkZ2V0LT5kaXNwbGF5X3dpZHRoOworICAgICAgc3JjLmggPSBnc3Rfd2lkZ2V0LT5kaXNwbGF5X2hlaWdodDsKKworICAgICAgZHN0LnggPSAwOworICAgICAgZHN0LnkgPSAwOworICAgICAgZHN0LncgPSB3aWRnZXRfd2lkdGg7CisgICAgICBkc3QuaCA9IHdpZGdldF9oZWlnaHQ7CisKKyAgICAgIGdzdF92aWRlb19zaW5rX2NlbnRlcl9yZWN0IChzcmMsIGRzdCwgJnJlc3VsdCwgVFJVRSk7CisKKyAgICAgIHNjYWxlX3ggPSBzY2FsZV95ID0gTUlOIChzY2FsZV94LCBzY2FsZV95KTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0LnggPSAwOworICAgICAgcmVzdWx0LnkgPSAwOworICAgICAgcmVzdWx0LncgPSB3aWRnZXRfd2lkdGg7CisgICAgICByZXN1bHQuaCA9IHdpZGdldF9oZWlnaHQ7CisgICAgfQorCisgICAgaWYgKGdzdF93aWRnZXQtPmlnbm9yZV9hbHBoYSkgeworICAgICAgR2RrUkdCQSBjb2xvciA9IHsgMC4wLCAwLjAsIDAuMCwgMS4wIH07CisKKyAgICAgIGdka19jYWlyb19zZXRfc291cmNlX3JnYmEgKGNyLCAmY29sb3IpOworICAgICAgaWYgKHJlc3VsdC54ID4gMCkgeworICAgICAgICBjYWlyb19yZWN0YW5nbGUgKGNyLCAwLCAwLCByZXN1bHQueCwgd2lkZ2V0X2hlaWdodCk7CisgICAgICAgIGNhaXJvX2ZpbGwgKGNyKTsKKyAgICAgIH0KKyAgICAgIGlmIChyZXN1bHQueSA+IDApIHsKKyAgICAgICAgY2Fpcm9fcmVjdGFuZ2xlIChjciwgMCwgMCwgd2lkZ2V0X3dpZHRoLCByZXN1bHQueSk7CisgICAgICAgIGNhaXJvX2ZpbGwgKGNyKTsKKyAgICAgIH0KKyAgICAgIGlmIChyZXN1bHQudyA8IHdpZGdldF93aWR0aCkgeworICAgICAgICBjYWlyb19yZWN0YW5nbGUgKGNyLCByZXN1bHQueCArIHJlc3VsdC53LCAwLCB3aWRnZXRfd2lkdGggLSByZXN1bHQudywKKyAgICAgICAgICAgIHdpZGdldF9oZWlnaHQpOworICAgICAgICBjYWlyb19maWxsIChjcik7CisgICAgICB9CisgICAgICBpZiAocmVzdWx0LmggPCB3aWRnZXRfaGVpZ2h0KSB7CisgICAgICAgIGNhaXJvX3JlY3RhbmdsZSAoY3IsIDAsIHJlc3VsdC55ICsgcmVzdWx0LmgsIHdpZGdldF93aWR0aCwKKyAgICAgICAgICAgIHdpZGdldF9oZWlnaHQgLSByZXN1bHQuaCk7CisgICAgICAgIGNhaXJvX2ZpbGwgKGNyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzY2FsZV94ICo9IChnZG91YmxlKSBnc3Rfd2lkZ2V0LT5kaXNwbGF5X3dpZHRoIC8gKGdkb3VibGUpIGZyYW1lLmluZm8ud2lkdGg7CisgICAgc2NhbGVfeSAqPQorICAgICAgICAoZ2RvdWJsZSkgZ3N0X3dpZGdldC0+ZGlzcGxheV9oZWlnaHQgLyAoZ2RvdWJsZSkgZnJhbWUuaW5mby5oZWlnaHQ7CisKKyAgICBjYWlyb190cmFuc2xhdGUgKGNyLCByZXN1bHQueCwgcmVzdWx0LnkpOworICAgIGNhaXJvX3NjYWxlIChjciwgc2NhbGVfeCwgc2NhbGVfeSk7CisgICAgY2Fpcm9fcmVjdGFuZ2xlIChjciwgMCwgMCwgcmVzdWx0LncsIHJlc3VsdC5oKTsKKyAgICBjYWlyb19zZXRfc291cmNlX3N1cmZhY2UgKGNyLCBzdXJmYWNlLCAwLCAwKTsKKyAgICBjYWlyb19wYWludCAoY3IpOworCisgICAgY2Fpcm9fc3VyZmFjZV9kZXN0cm95IChzdXJmYWNlKTsKKworICAgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJmZyYW1lKTsKKyAgfSBlbHNlIHsKKyAgICBHZGtSR0JBIGNvbG9yOworCisgICAgaWYgKGdzdF93aWRnZXQtPmlnbm9yZV9hbHBoYSkgeworICAgICAgY29sb3IucmVkID0gY29sb3IuYmx1ZSA9IGNvbG9yLmdyZWVuID0gMC4wOworICAgICAgY29sb3IuYWxwaGEgPSAxLjA7CisgICAgfSBlbHNlIHsKKyAgICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9jb2xvciAoZ3RrX3dpZGdldF9nZXRfc3R5bGVfY29udGV4dCAod2lkZ2V0KSwKKyAgICAgICAgICBHVEtfU1RBVEVfRkxBR19OT1JNQUwsICZjb2xvcik7CisgICAgfQorICAgIGdka19jYWlyb19zZXRfc291cmNlX3JnYmEgKGNyLCAmY29sb3IpOworICAgIGNhaXJvX3JlY3RhbmdsZSAoY3IsIDAsIDAsIHdpZGdldF93aWR0aCwgd2lkZ2V0X2hlaWdodCk7CisgICAgY2Fpcm9fZmlsbCAoY3IpOworICB9CisKKyAgR1RLX0dTVF9CQVNFX1dJREdFVF9VTkxPQ0sgKGdzdF93aWRnZXQpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitndGtfZ3N0X3dpZGdldF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgZ3RrX2dzdF9iYXNlX3dpZGdldF9maW5hbGl6ZSAob2JqZWN0KTsKKworICBHX09CSkVDVF9DTEFTUyAoZ3RrX2dzdF93aWRnZXRfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitndGtfZ3N0X3dpZGdldF9jbGFzc19pbml0IChHdGtHc3RXaWRnZXRDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3Rfa2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHdGtXaWRnZXRDbGFzcyAqd2lkZ2V0X2tsYXNzID0gKEd0a1dpZGdldENsYXNzICopIGtsYXNzOworCisgIGd0a19nc3RfYmFzZV93aWRnZXRfY2xhc3NfaW5pdCAoR1RLX0dTVF9CQVNFX1dJREdFVF9DTEFTUyAoa2xhc3MpKTsKKyAgZ29iamVjdF9rbGFzcy0+ZmluYWxpemUgPSBndGtfZ3N0X3dpZGdldF9maW5hbGl6ZTsKKyAgd2lkZ2V0X2tsYXNzLT5kcmF3ID0gZ3RrX2dzdF93aWRnZXRfZHJhdzsKK30KKworc3RhdGljIHZvaWQKK2d0a19nc3Rfd2lkZ2V0X2luaXQgKEd0a0dzdFdpZGdldCAqIHdpZGdldCkKK3sKKyAgZ3RrX2dzdF9iYXNlX3dpZGdldF9pbml0IChHVEtfR1NUX0JBU0VfV0lER0VUICh3aWRnZXQpKTsKK30KKworR3RrV2lkZ2V0ICoKK2d0a19nc3Rfd2lkZ2V0X25ldyAodm9pZCkKK3sKKyAgcmV0dXJuIChHdGtXaWRnZXQgKikgZ19vYmplY3RfbmV3IChHVEtfVFlQRV9HU1RfV0lER0VULCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2V4dC9ndGsvZ3RrZ3N0d2lkZ2V0LmggYi9leHQvZ3RrL2d0a2dzdHdpZGdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyN2VlYmEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZ3RrL2d0a2dzdHdpZGdldC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxNSBNYXR0aGV3IFdhdGVycyA8bWF0dGhld0BjZW50cmljdWxhci5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dUS19HU1RfV0lER0VUX0hfXworI2RlZmluZSBfX0dUS19HU1RfV0lER0VUX0hfXworCisjaW5jbHVkZSA8Z3RrL2d0ay5oPgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImd0a2dzdGJhc2V3aWRnZXQuaCIKKworR19CRUdJTl9ERUNMUworCitHVHlwZSBndGtfZ3N0X3dpZGdldF9nZXRfdHlwZSAodm9pZCk7CisjZGVmaW5lIEdUS19UWVBFX0dTVF9XSURHRVQgKGd0a19nc3Rfd2lkZ2V0X2dldF90eXBlKCkpCisjZGVmaW5lIEdUS19HU1RfV0lER0VUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdUS19UWVBFX0dTVF9XSURHRVQsR3RrR3N0V2lkZ2V0KSkKKyNkZWZpbmUgR1RLX0dTVF9XSURHRVRfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdUS19UWVBFX0dTVF9XSURHRVQsR3RrR3N0V2lkZ2V0Q2xhc3MpKQorI2RlZmluZSBHVEtfSVNfR1NUX1dJREdFVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHVEtfVFlQRV9HU1RfV0lER0VUKSkKKyNkZWZpbmUgR1NUX0lTX0dTVF9XSURHRVRfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdUS19UWVBFX0dTVF9XSURHRVQpKQorI2RlZmluZSBHVEtfR1NUX1dJREdFVF9DQVNUKG9iaikgKChHdGtHc3RXaWRnZXQqKShvYmopKQorCit0eXBlZGVmIHN0cnVjdCBfR3RrR3N0V2lkZ2V0IEd0a0dzdFdpZGdldDsKK3R5cGVkZWYgc3RydWN0IF9HdGtHc3RXaWRnZXRDbGFzcyBHdGtHc3RXaWRnZXRDbGFzczsKKworLyoqCisgKiBHdGtHc3RXaWRnZXQ6CisgKgorICogT3BhcXVlICNHdGtHc3RXaWRnZXQgb2JqZWN0CisgKi8KK3N0cnVjdCBfR3RrR3N0V2lkZ2V0Cit7CisgIC8qIDxwcml2YXRlPiAqLworICBHdGtHc3RCYXNlV2lkZ2V0IGJhc2U7Cit9OworCisvKioKKyAqIEd0a0dzdFdpZGdldENsYXNzOgorICoKKyAqIFRoZSAjR3RrR3N0V2lkZ2V0Q2xhc3Mgc3RydWN0IG9ubHkgY29udGFpbnMgcHJpdmF0ZSBkYXRhCisgKi8KK3N0cnVjdCBfR3RrR3N0V2lkZ2V0Q2xhc3MKK3sKKyAgLyogPHByaXZhdGU+ICovCisgIEd0a0dzdEJhc2VXaWRnZXRDbGFzcyBiYXNlX2NsYXNzOworfTsKKworR3RrV2lkZ2V0ICogICAgIGd0a19nc3Rfd2lkZ2V0X25ldyAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dUS19HU1RfV0lER0VUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L2d0ay9tZXNvbi5idWlsZCBiL2V4dC9ndGsvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdhZWVlMgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9ndGsvbWVzb24uYnVpbGQKQEAgLTAsMCArMSw1NCBAQAorZ3RrX3NvdXJjZXMgPSBbCisgICdnc3RndGtiYXNlc2luay5jJywKKyAgJ2dzdGd0a3NpbmsuYycsCisgICdnc3RndGt1dGlscy5jJywKKyAgJ2dzdHBsdWdpbi5jJywKKyAgJ2d0a2dzdGJhc2V3aWRnZXQuYycsCisgICdndGtnc3R3aWRnZXQuYycsCitdCisKK2d0a19kZWZpbmVzID0gW10KK29wdGlvbmFsX2RlcHMgPSBbXQorCitndGtfZGVwID0gZGVwZW5kZW5jeSgnZ3RrKy0zLjAnLCByZXF1aXJlZCA6IGZhbHNlKQoraWYgZ3RrX2RlcC5mb3VuZCgpCisgIGlmIGJ1aWxkX2dzdGdsIGFuZCBnc3RnbF9kZXAuZm91bmQoKSBhbmQgZ3RrX2RlcC52ZXJzaW9uKCkudmVyc2lvbl9jb21wYXJlKCc+PTMuMTUuMCcpCisgICAgaGF2ZV9ndGszX2dsX3dpbmRvd2luZyA9IGZhbHNlCisKKyAgICBpZiBnc3RfZ2xfaGF2ZV93aW5kb3dfeDExIGFuZCBnc3RfZ2xfaGF2ZV9wbGF0Zm9ybV9nbHgKKyAgICAgIGd0a194MTFfZGVwID0gZGVwZW5kZW5jeSgnZ3RrKy14MTEtMy4wJywgcmVxdWlyZWQgOiBmYWxzZSkKKyAgICAgIGlmIGd0a194MTFfZGVwLmZvdW5kKCkKKyAgICAgICAgb3B0aW9uYWxfZGVwcyArPSBndGtfeDExX2RlcAorICAgICAgICBoYXZlX2d0azNfZ2xfd2luZG93aW5nID0gdHJ1ZQorICAgICAgZW5kaWYKKyAgICBlbmRpZgorCisgICAgaWYgZ3N0X2dsX2hhdmVfd2luZG93X3dheWxhbmQgYW5kIGdzdF9nbF9oYXZlX3BsYXRmb3JtX2VnbAorICAgICAgZ3RrX3dheWxhbmRfZGVwID0gZGVwZW5kZW5jeSgnZ3RrKy13YXlsYW5kLTMuMCcsIHJlcXVpcmVkIDogZmFsc2UpCisgICAgICBpZiBndGtfd2F5bGFuZF9kZXAuZm91bmQoKQorICAgICAgICBvcHRpb25hbF9kZXBzICs9IGd0a193YXlsYW5kX2RlcAorICAgICAgICBoYXZlX2d0azNfZ2xfd2luZG93aW5nID0gdHJ1ZQorICAgICAgZW5kaWYKKyAgICBlbmRpZgorCisgICAgaWYgaGF2ZV9ndGszX2dsX3dpbmRvd2luZworICAgICAgZ3RrX3NvdXJjZXMgKz0gWworICAgICAgICAnZ3N0Z3RrZ2xzaW5rLmMnLAorICAgICAgICAnZ3RrZ3N0Z2x3aWRnZXQuYycsCisgICAgICBdCisgICAgICBvcHRpb25hbF9kZXBzICs9IGdzdGdsX2RlcAorICAgICAgZ3RrX2RlZmluZXMgKz0gWyctREdTVF9VU0VfVU5TVEFCTEVfQVBJJywgJy1ESEFWRV9HVEszX0dMJ10KKyAgICBlbmRpZgorICBlbmRpZgorCisgIGdzdGd0ayA9IGxpYnJhcnkoJ2dzdGd0aycsCisgICAgZ3RrX3NvdXJjZXMsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzICsgZ3RrX2RlZmluZXMsCisgICAgbGlua19hcmdzIDogbm9zZWhfbGlua19hcmdzLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgICBkZXBlbmRlbmNpZXMgOiBbZ3RrX2RlcCwgZ3N0dmlkZW9fZGVwLCBnc3RiYXNlX2RlcCwgbGlibV0gKyBvcHRpb25hbF9kZXBzLAorICAgIGluc3RhbGwgOiB0cnVlLAorICAgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKyAgKQorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZXh0L2phY2svLmdpdGlnbm9yZSBiL2V4dC9qYWNrLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2ZjI2NQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qYWNrLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorKi5sb1QKZGlmZiAtLWdpdCBhL2V4dC9qYWNrL01ha2VmaWxlLmFtIGIvZXh0L2phY2svTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlZjI3YQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qYWNrL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOSBAQAorCitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RqYWNrLmxhCisKK2xpYmdzdGphY2tfbGFfU09VUkNFUyA9IGdzdGphY2t1dGlsLmMgZ3N0amFjay5jIGdzdGphY2thdWRpb3NyYy5jIGdzdGphY2thdWRpb3NpbmsuYyBnc3RqYWNrYXVkaW9jbGllbnQuYworbGliZ3N0amFja19sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpICQoSkFDS19DRkxBR1MpCitsaWJnc3RqYWNrX2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKEpBQ0tfTElCUykKK2xpYmdzdGphY2tfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdGphY2t1dGlsLmggZ3N0amFja2F1ZGlvc3JjLmggZ3N0amFja2F1ZGlvc2luay5oIGdzdGphY2thdWRpb2NsaWVudC5oIGdzdGphY2suaCBnc3RqYWNrcmluZ2J1ZmZlci5oCmRpZmYgLS1naXQgYS9leHQvamFjay9nc3RqYWNrLmMgYi9leHQvamFjay9nc3RqYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5OGRjNAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qYWNrL2dzdGphY2suYwpAQCAtMCwwICsxLDExNyBAQAorLyogR1N0cmVhbWVyIEphY2sgcGx1Z2lucworICogQ29weXJpZ2h0IChDKSAyMDA2IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0amFjay5oIgorI2luY2x1ZGUgImdzdGphY2thdWRpb3NyYy5oIgorI2luY2x1ZGUgImdzdGphY2thdWRpb3NpbmsuaCIKKworR1R5cGUKK2dzdF9qYWNrX2Nvbm5lY3RfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyB2b2xhdGlsZSBnc2l6ZSBqYWNrX2Nvbm5lY3RfdHlwZSA9IDA7CisKKyAgaWYgKGdfb25jZV9pbml0X2VudGVyICgmamFja19jb25uZWN0X3R5cGUpKSB7CisgICAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgamFja19jb25uZWN0X2VudW1zW10gPSB7CisgICAgICB7R1NUX0pBQ0tfQ09OTkVDVF9OT05FLAorICAgICAgICAgICJEb24ndCBhdXRvbWF0aWNhbGx5IGNvbm5lY3QgcG9ydHMgdG8gcGh5c2ljYWwgcG9ydHMiLCAibm9uZSJ9LAorICAgICAge0dTVF9KQUNLX0NPTk5FQ1RfQVVUTywKKyAgICAgICAgICAiQXV0b21hdGljYWxseSBjb25uZWN0IHBvcnRzIHRvIHBoeXNpY2FsIHBvcnRzIiwgImF1dG8ifSwKKyAgICAgIHtHU1RfSkFDS19DT05ORUNUX0FVVE9fRk9SQ0VELAorICAgICAgICAgICAgIkF1dG9tYXRpY2FsbHkgY29ubmVjdCBwb3J0cyB0byBhcyBtYW55IHBoeXNpY2FsIHBvcnRzIGFzIHBvc3NpYmxlIiwKKyAgICAgICAgICAiYXV0by1mb3JjZWQifSwKKyAgICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgICB9OworICAgIEdUeXBlIHRtcCA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RKYWNrQ29ubmVjdCIsIGphY2tfY29ubmVjdF9lbnVtcyk7CisgICAgZ19vbmNlX2luaXRfbGVhdmUgKCZqYWNrX2Nvbm5lY3RfdHlwZSwgdG1wKTsKKyAgfQorICByZXR1cm4gKEdUeXBlKSBqYWNrX2Nvbm5lY3RfdHlwZTsKK30KKworR1R5cGUKK2dzdF9qYWNrX3RyYW5zcG9ydF9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIHZvbGF0aWxlIGdzaXplIHR5cGUgPSAwOworCisgIGlmIChnX29uY2VfaW5pdF9lbnRlciAoJnR5cGUpKSB7CisgICAgc3RhdGljIGNvbnN0IEdGbGFnc1ZhbHVlIGZsYWdfdmFsdWVzW10gPSB7CisgICAgICB7R1NUX0pBQ0tfVFJBTlNQT1JUX01BU1RFUiwKKyAgICAgICAgICAiU3RhcnQgYW5kIHN0b3AgdHJhbnNwb3J0IHdpdGggc3RhdGUgY2hhbmdlcyIsICJtYXN0ZXIifSwKKyAgICAgIHtHU1RfSkFDS19UUkFOU1BPUlRfU0xBVkUsCisgICAgICAgICAgIkZvbGxvdyB0cmFuc3BvcnQgc3RhdGUgY2hhbmdlcyIsICJzbGF2ZSJ9LAorICAgICAgezAsIE5VTEwsIE5VTEx9LAorICAgIH07CisgICAgR1R5cGUgdG1wID0gZ19mbGFnc19yZWdpc3Rlcl9zdGF0aWMgKCJHc3RKYWNrVHJhbnNwb3J0IiwgZmxhZ192YWx1ZXMpOworICAgIGdfb25jZV9pbml0X2xlYXZlICgmdHlwZSwgdG1wKTsKKyAgfQorICByZXR1cm4gKEdUeXBlKSB0eXBlOworfQorCisKK3N0YXRpYyBncG9pbnRlcgorZ3N0X2phY2tfY2xpZW50X2NvcHkgKGdwb2ludGVyIGpjbGllbnQpCit7CisgIHJldHVybiBqY2xpZW50OworfQorCisKK3N0YXRpYyB2b2lkCitnc3RfamFja19jbGllbnRfZnJlZSAoZ3BvaW50ZXIgamNsaWVudCkKK3sKKyAgcmV0dXJuOworfQorCisKK0dUeXBlCitnc3RfamFja19jbGllbnRfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyB2b2xhdGlsZSBnc2l6ZSBqYWNrX2NsaWVudF90eXBlID0gMDsKKworICBpZiAoZ19vbmNlX2luaXRfZW50ZXIgKCZqYWNrX2NsaWVudF90eXBlKSkgeworICAgIC8qIGhhY2tpc2gsIGJ1dCBtYWtlcyBpdCBzaG93IHVwIG5pY2VseSBpbiBnc3QtaW5zcGVjdCAqLworICAgIEdUeXBlIHRtcCA9IGdfYm94ZWRfdHlwZV9yZWdpc3Rlcl9zdGF0aWMgKCJKYWNrQ2xpZW50IiwKKyAgICAgICAgKEdCb3hlZENvcHlGdW5jKSBnc3RfamFja19jbGllbnRfY29weSwKKyAgICAgICAgKEdCb3hlZEZyZWVGdW5jKSBnc3RfamFja19jbGllbnRfZnJlZSk7CisgICAgZ19vbmNlX2luaXRfbGVhdmUgKCZqYWNrX2NsaWVudF90eXBlLCB0bXApOworICB9CisKKyAgcmV0dXJuIChHVHlwZSkgamFja19jbGllbnRfdHlwZTsKK30KKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJqYWNrYXVkaW9zcmMiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIEdTVF9UWVBFX0pBQ0tfQVVESU9fU1JDKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImphY2thdWRpb3NpbmsiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIEdTVF9UWVBFX0pBQ0tfQVVESU9fU0lOSykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgamFjaywKKyAgICAiSkFDSyBhdWRpbyBlbGVtZW50cyIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sIEdTVF9MSUNFTlNFLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9leHQvamFjay9nc3RqYWNrLmggYi9leHQvamFjay9nc3RqYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTViMDQwZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qYWNrL2dzdGphY2suaApAQCAtMCwwICsxLDc5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIGdzdGphY2suaDoKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9HU1RfSkFDS19IXworI2RlZmluZSBfR1NUX0pBQ0tfSF8KKworI2luY2x1ZGUgPGphY2svamFjay5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisvKioKKyAqIEdzdEphY2tDb25uZWN0OgorICogQEdTVF9KQUNLX0NPTk5FQ1RfTk9ORTogRG9uJ3QgYXV0b21hdGljYWxseSBjb25uZWN0IHRvIHBoeXNpY2FsIHBvcnRzLgorICogICAgIEluIHRoaXMgbW9kZSwgdGhlIGVsZW1lbnQgd2lsbCBhY2NlcHQgYW55IG51bWJlciBvZiBpbnB1dCBjaGFubmVscyBhbmQgd2lsbAorICogICAgIGNyZWF0ZSAoYnV0IG5vdCBjb25uZWN0KSBhbiBvdXRwdXQgcG9ydCBmb3IgZWFjaCBjaGFubmVsLgorICogQEdTVF9KQUNLX0NPTk5FQ1RfQVVUTzogSW4gdGhpcyBtb2RlLCB0aGUgZWxlbWVudCB3aWxsIHRyeSB0byBjb25uZWN0IGVhY2gKKyAqICAgICBvdXRwdXQgcG9ydCB0byBhIHJhbmRvbSBwaHlzaWNhbCBqYWNrIGlucHV0IHBpbi4gVGhlIHNpbmsgd2lsbAorICogICAgIGV4cG9zZSB0aGUgbnVtYmVyIG9mIHBoeXNpY2FsIGNoYW5uZWxzIG9uIGl0cyBwYWQgY2Fwcy4KKyAqIEBHU1RfSkFDS19DT05ORUNUX0FVVE9fRk9SQ0VEOiBJbiB0aGlzIG1vZGUsIHRoZSBlbGVtZW50IHdpbGwgdHJ5IHRvIGNvbm5lY3QgZWFjaAorICogICAgIG91dHB1dCBwb3J0IHRvIGEgcmFuZG9tIHBoeXNpY2FsIGphY2sgaW5wdXQgcGluLiBUaGUgIGVsZW1lbnQgd2lsbCBhY2NlcHQgYW55IG51bWJlcgorICogICAgIG9mIGlucHV0IGNoYW5uZWxzLgorICoKKyAqIFNwZWNpZnkgaG93IHRoZSBvdXRwdXQgcG9ydHMgd2lsbCBiZSBjb25uZWN0ZWQuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEdTVF9KQUNLX0NPTk5FQ1RfTk9ORSwKKyAgR1NUX0pBQ0tfQ09OTkVDVF9BVVRPLAorICBHU1RfSkFDS19DT05ORUNUX0FVVE9fRk9SQ0VECit9IEdzdEphY2tDb25uZWN0OworCisvKioKKyAqIEdzdEphY2tUcmFuc3BvcnQ6CisgKiBAR1NUX0pBQ0tfVFJBTlNQT1JUX0FVVE9OT01PVVM6IG5vIHRyYW5zcG9ydCBzdXBwb3J0CisgKiBAR1NUX0pBQ0tfVFJBTlNQT1JUX01BU1RFUjogc3RhcnQgYW5kIHN0b3AgdHJhbnNwb3J0IHdpdGggc3RhdGUtY2hhbmdlcworICogQEdTVF9KQUNLX1RSQU5TUE9SVF9TTEFWRTogZm9sbG93IHRyYW5zcG9ydCBzdGF0ZSBjaGFuZ2VzCisgKgorICogVGhlIGphY2sgdHJhbnNwb3J0IHN0YXRlIGFsbG93IHRvIHN5bmMgbXVsdGlwbGUgY2xpZW50cy4gVGhpcyBlbnVtIGRlZmluZXMgYQorICogY2xpZW50IGJlaGF2aW91ciByZWdhcmRpbmcgdG8gdGhlIHRyYW5zcG9ydCBtZWNoYW5pc20uCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEdTVF9KQUNLX1RSQU5TUE9SVF9BVVRPTk9NT1VTID0gMCwKKyAgR1NUX0pBQ0tfVFJBTlNQT1JUX01BU1RFUiA9ICgxIDw8IDApLAorICBHU1RfSkFDS19UUkFOU1BPUlRfU0xBVkUgPSAoMSA8PCAxKSwKK30gR3N0SmFja1RyYW5zcG9ydDsKKwordHlwZWRlZiBqYWNrX2RlZmF1bHRfYXVkaW9fc2FtcGxlX3Qgc2FtcGxlX3Q7CisKKyNkZWZpbmUgR1NUX1RZUEVfSkFDS19DT05ORUNUICAgKGdzdF9qYWNrX2Nvbm5lY3RfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9UWVBFX0pBQ0tfVFJBTlNQT1JUIChnc3RfamFja190cmFuc3BvcnRfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9UWVBFX0pBQ0tfQ0xJRU5UICAgIChnc3RfamFja19jbGllbnRfZ2V0X3R5cGUgKCkpCisKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIEdTVF9KQUNLX0ZPUk1BVF9TVFIgIkYzMkxFIgorI2Vsc2UKKyNkZWZpbmUgR1NUX0pBQ0tfRk9STUFUX1NUUiAiRjMyQkUiCisjZW5kaWYKKworR1R5cGUgZ3N0X2phY2tfY2xpZW50X2dldF90eXBlKHZvaWQpOworR1R5cGUgZ3N0X2phY2tfY29ubmVjdF9nZXRfdHlwZSh2b2lkKTsKK0dUeXBlIGdzdF9qYWNrX3RyYW5zcG9ydF9nZXRfdHlwZSh2b2lkKTsKKworI2VuZGlmICAvLyBfR1NUX0pBQ0tfSF8KZGlmZiAtLWdpdCBhL2V4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5jIGIvZXh0L2phY2svZ3N0amFja2F1ZGlvY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwMjJjMAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5jCkBAIC0wLDAgKzEsNjM3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIGdzdGphY2thdWRpb2NsaWVudC5jOiBqYWNrIGF1ZGlvIGNsaWVudCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdGphY2thdWRpb2NsaWVudC5oIgorI2luY2x1ZGUgImdzdGphY2suaCIKKworI2luY2x1ZGUgPGdzdC9nbGliLWNvbXBhdC1wcml2YXRlLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfamFja19hdWRpb19jbGllbnRfZGVidWcKKworc3RhdGljIHZvaWQKK2phY2tfbG9nX2Vycm9yIChjb25zdCBnY2hhciAqIG1zZykKK3sKKyAgR1NUX0VSUk9SICgiJXMiLCBtc2cpOworfQorCitzdGF0aWMgdm9pZAoramFja19pbmZvX2Vycm9yIChjb25zdCBnY2hhciAqIG1zZykKK3sKKyAgR1NUX0lORk8gKCIlcyIsIG1zZyk7Cit9CisKK3ZvaWQKK2dzdF9qYWNrX2F1ZGlvX2NsaWVudF9pbml0ICh2b2lkKQoreworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X2phY2tfYXVkaW9fY2xpZW50X2RlYnVnLCAiamFja2NsaWVudCIsIDAsCisgICAgICAiamFja2NsaWVudCBoZWxwZXJzIik7CisKKyAgamFja19zZXRfZXJyb3JfZnVuY3Rpb24gKGphY2tfbG9nX2Vycm9yKTsKKyAgamFja19zZXRfaW5mb19mdW5jdGlvbiAoamFja19pbmZvX2Vycm9yKTsKK30KKworLyogYSBsaXN0IG9mIGdsb2JhbCBjb25uZWN0aW9ucyBpbmRleGVkIGJ5IGlkIGFuZCBzZXJ2ZXIuICovCitHX0xPQ0tfREVGSU5FX1NUQVRJQyAoY29ubmVjdGlvbnNfbG9jayk7CitzdGF0aWMgR0xpc3QgKmNvbm5lY3Rpb25zOworCisvKiB0aGUgY29ubmVjdGlvbiB0byBhIHNlcnZlciAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGdpbnQgcmVmY291bnQ7CisgIEdNdXRleCBsb2NrOworICBHQ29uZCBmbHVzaF9jb25kOworCisgIC8qIGlkL3NlcnZlciBwYWlyIGFuZCB0aGUgY29ubmVjdGlvbiAqLworICBnY2hhciAqaWQ7CisgIGdjaGFyICpzZXJ2ZXI7CisgIGphY2tfY2xpZW50X3QgKmNsaWVudDsKKworICAvKiBsaXN0cyBvZiBHc3RKYWNrQXVkaW9DbGllbnRzICovCisgIGdpbnQgbl9jbGllbnRzOworICBHTGlzdCAqc3JjX2NsaWVudHM7CisgIEdMaXN0ICpzaW5rX2NsaWVudHM7CisKKyAgLyogdHJhbnNwb3J0IHN0YXRlIGhhbmRsaW5nICovCisgIGdpbnQgY3VyX3RzOworICBHc3RTdGF0ZSB0cmFuc3BvcnRfc3RhdGU7Cit9IEdzdEphY2tBdWRpb0Nvbm5lY3Rpb247CisKKy8qIGFuIG9iamVjdCBzaGFyaW5nIGEgamFja19jbGllbnRfdCBjb25uZWN0aW9uLiAqLworc3RydWN0IF9Hc3RKYWNrQXVkaW9DbGllbnQKK3sKKyAgR3N0SmFja0F1ZGlvQ29ubmVjdGlvbiAqY29ubjsKKworICBHc3RKYWNrQ2xpZW50VHlwZSB0eXBlOworICBnYm9vbGVhbiBhY3RpdmU7CisgIGdib29sZWFuIGRlYWN0aXZhdGU7CisgIGdib29sZWFuIHNlcnZlcl9kb3duOworCisgIEphY2tTaHV0ZG93bkNhbGxiYWNrIHNodXRkb3duOworICBKYWNrUHJvY2Vzc0NhbGxiYWNrIHByb2Nlc3M7CisgIEphY2tCdWZmZXJTaXplQ2FsbGJhY2sgYnVmZmVyX3NpemU7CisgIEphY2tTYW1wbGVSYXRlQ2FsbGJhY2sgc2FtcGxlX3JhdGU7CisgIGdwb2ludGVyIHVzZXJfZGF0YTsKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGphY2tfbmZyYW1lc190IG5mcmFtZXM7CisgIGdwb2ludGVyIHVzZXJfZGF0YTsKK30gSmFja0NCOworCitzdGF0aWMgZ2Jvb2xlYW4KK2phY2tfaGFuZGxlX3RyYW5zcG9ydF9jaGFuZ2UgKEdzdEphY2tBdWRpb0NsaWVudCAqIGNsaWVudCwgR3N0U3RhdGUgc3RhdGUpCit7CisgIEdzdE9iamVjdCAqb2JqID0gR1NUX09CSkVDVF9QQVJFTlQgKGNsaWVudC0+dXNlcl9kYXRhKTsKKyAgZ3VpbnQgbW9kZTsKKworICBnX29iamVjdF9nZXQgKG9iaiwgInRyYW5zcG9ydCIsICZtb2RlLCBOVUxMKTsKKyAgaWYgKChtb2RlICYgR1NUX0pBQ0tfVFJBTlNQT1JUX1NMQVZFKSAmJiAoR1NUX1NUQVRFIChvYmopICE9IHN0YXRlKSkgeworICAgIEdTVF9JTkZPX09CSkVDVCAob2JqLCAicmVxdWVzdGluZyBzdGF0ZSBjaGFuZ2U6ICVzIiwKKyAgICAgICAgZ3N0X2VsZW1lbnRfc3RhdGVfZ2V0X25hbWUgKHN0YXRlKSk7CisgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVCAob2JqKSwKKyAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X3JlcXVlc3Rfc3RhdGUgKG9iaiwgc3RhdGUpKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQKK2phY2tfcHJvY2Vzc19jYiAoamFja19uZnJhbWVzX3QgbmZyYW1lcywgdm9pZCAqYXJnKQoreworICBHc3RKYWNrQXVkaW9Db25uZWN0aW9uICpjb25uID0gKEdzdEphY2tBdWRpb0Nvbm5lY3Rpb24gKikgYXJnOworICBHTGlzdCAqd2FsazsKKyAgaW50IHJlcyA9IDA7CisgIGphY2tfdHJhbnNwb3J0X3N0YXRlX3QgdHMgPSBqYWNrX3RyYW5zcG9ydF9xdWVyeSAoY29ubi0+Y2xpZW50LCBOVUxMKTsKKworICBpZiAodHMgIT0gY29ubi0+Y3VyX3RzKSB7CisgICAgY29ubi0+Y3VyX3RzID0gdHM7CisgICAgc3dpdGNoICh0cykgeworICAgICAgY2FzZSBKYWNrVHJhbnNwb3J0U3RvcHBlZDoKKyAgICAgICAgR1NUX0RFQlVHICgidHJhbnNwb3J0IHN0YXRlIGlzICdzdG9wcGVkJyIpOworICAgICAgICBjb25uLT50cmFuc3BvcnRfc3RhdGUgPSBHU1RfU1RBVEVfUEFVU0VEOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSmFja1RyYW5zcG9ydFN0YXJ0aW5nOgorICAgICAgICBHU1RfREVCVUcgKCJ0cmFuc3BvcnQgc3RhdGUgaXMgJ3N0YXJ0aW5nJyIpOworICAgICAgICBjb25uLT50cmFuc3BvcnRfc3RhdGUgPSBHU1RfU1RBVEVfUkVBRFk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBKYWNrVHJhbnNwb3J0Um9sbGluZzoKKyAgICAgICAgR1NUX0RFQlVHICgidHJhbnNwb3J0IHN0YXRlIGlzICdyb2xsaW5nJyIpOworICAgICAgICBjb25uLT50cmFuc3BvcnRfc3RhdGUgPSBHU1RfU1RBVEVfUExBWUlORzsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgR1NUX0RFQlVHICgibnVtIG9mIGNsaWVudHM6IHNyYz0lZCwgc2luaz0lZCIsCisgICAgICAgIGdfbGlzdF9sZW5ndGggKGNvbm4tPnNyY19jbGllbnRzKSwgZ19saXN0X2xlbmd0aCAoY29ubi0+c2lua19jbGllbnRzKSk7CisgIH0KKworICBnX211dGV4X2xvY2sgKCZjb25uLT5sb2NrKTsKKyAgLyogY2FsbCBzb3VyY2VzIGZpcnN0LCB0aGVuIHNpbmtzLiBTb3VyY2VzIHdpbGwgZWl0aGVyIHB1c2ggZGF0YSBpbnRvIHRoZQorICAgKiByaW5nYnVmZmVyIG9mIHRoZSBzaW5rcywgd2hpY2ggd2lsbCB0aGVuIHB1bGwgdGhlIGRhdGEgb3V0IG9mIGl0LCBvcgorICAgKiBzaW5rcyB3aWxsIHB1bGwgdGhlIGRhdGEgZnJvbSB0aGUgc291cmNlcy4gKi8KKyAgZm9yICh3YWxrID0gY29ubi0+c3JjX2NsaWVudHM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RKYWNrQXVkaW9DbGllbnQgKmNsaWVudCA9IChHc3RKYWNrQXVkaW9DbGllbnQgKikgd2Fsay0+ZGF0YTsKKworICAgIC8qIG9ubHkgY2FsbCBhY3RpdmUgY2xpZW50cyAqLworICAgIGlmICgoY2xpZW50LT5hY3RpdmUgfHwgY2xpZW50LT5kZWFjdGl2YXRlKSAmJiBjbGllbnQtPnByb2Nlc3MpIHsKKyAgICAgIHJlcyA9IGNsaWVudC0+cHJvY2VzcyAobmZyYW1lcywgY2xpZW50LT51c2VyX2RhdGEpOworICAgICAgaWYgKGNsaWVudC0+ZGVhY3RpdmF0ZSkgeworICAgICAgICBjbGllbnQtPmRlYWN0aXZhdGUgPSBGQUxTRTsKKyAgICAgICAgZ19jb25kX3NpZ25hbCAoJmNvbm4tPmZsdXNoX2NvbmQpOworICAgICAgfQorICAgIH0KKyAgfQorICBmb3IgKHdhbGsgPSBjb25uLT5zaW5rX2NsaWVudHM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RKYWNrQXVkaW9DbGllbnQgKmNsaWVudCA9IChHc3RKYWNrQXVkaW9DbGllbnQgKikgd2Fsay0+ZGF0YTsKKworICAgIC8qIG9ubHkgY2FsbCBhY3RpdmUgY2xpZW50cyAqLworICAgIGlmICgoY2xpZW50LT5hY3RpdmUgfHwgY2xpZW50LT5kZWFjdGl2YXRlKSAmJiBjbGllbnQtPnByb2Nlc3MpIHsKKyAgICAgIHJlcyA9IGNsaWVudC0+cHJvY2VzcyAobmZyYW1lcywgY2xpZW50LT51c2VyX2RhdGEpOworICAgICAgaWYgKGNsaWVudC0+ZGVhY3RpdmF0ZSkgeworICAgICAgICBjbGllbnQtPmRlYWN0aXZhdGUgPSBGQUxTRTsKKyAgICAgICAgZ19jb25kX3NpZ25hbCAoJmNvbm4tPmZsdXNoX2NvbmQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGhhbmRsZSB0cmFuc3BvcnQgc3RhdGUgcmVxdWlzaXRpb24sIGRvIHNpbmtzIGZpcnN0LCBzdG9wIGFmdGVyIHRoZSBmaXJzdAorICAgKiBlbGVtZW50IHRoYXQgaGFuZGxlZCBpdCAqLworICBpZiAoY29ubi0+dHJhbnNwb3J0X3N0YXRlICE9IEdTVF9TVEFURV9WT0lEX1BFTkRJTkcpIHsKKyAgICBmb3IgKHdhbGsgPSBjb25uLT5zaW5rX2NsaWVudHM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICAgIGlmIChqYWNrX2hhbmRsZV90cmFuc3BvcnRfY2hhbmdlICgoR3N0SmFja0F1ZGlvQ2xpZW50ICopIHdhbGstPmRhdGEsCisgICAgICAgICAgICAgIGNvbm4tPnRyYW5zcG9ydF9zdGF0ZSkpIHsKKyAgICAgICAgY29ubi0+dHJhbnNwb3J0X3N0YXRlID0gR1NUX1NUQVRFX1ZPSURfUEVORElORzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChjb25uLT50cmFuc3BvcnRfc3RhdGUgIT0gR1NUX1NUQVRFX1ZPSURfUEVORElORykgeworICAgIGZvciAod2FsayA9IGNvbm4tPnNyY19jbGllbnRzOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgICBpZiAoamFja19oYW5kbGVfdHJhbnNwb3J0X2NoYW5nZSAoKEdzdEphY2tBdWRpb0NsaWVudCAqKSB3YWxrLT5kYXRhLAorICAgICAgICAgICAgICBjb25uLT50cmFuc3BvcnRfc3RhdGUpKSB7CisgICAgICAgIGNvbm4tPnRyYW5zcG9ydF9zdGF0ZSA9IEdTVF9TVEFURV9WT0lEX1BFTkRJTkc7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICBnX211dGV4X3VubG9jayAoJmNvbm4tPmxvY2spOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCitqYWNrX3NodXRkb3duX2NiICh2b2lkICphcmcpCit7CisgIEdzdEphY2tBdWRpb0Nvbm5lY3Rpb24gKmNvbm4gPSAoR3N0SmFja0F1ZGlvQ29ubmVjdGlvbiAqKSBhcmc7CisgIEdMaXN0ICp3YWxrOworCisgIEdTVF9ERUJVRyAoImRpc2Nvbm5lY3QgY2xpZW50ICVzIGZyb20gc2VydmVyICVzIiwgY29ubi0+aWQsCisgICAgICBHU1RfU1RSX05VTEwgKGNvbm4tPnNlcnZlcikpOworCisgIGdfbXV0ZXhfbG9jayAoJmNvbm4tPmxvY2spOworICBmb3IgKHdhbGsgPSBjb25uLT5zcmNfY2xpZW50czsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdEphY2tBdWRpb0NsaWVudCAqY2xpZW50ID0gKEdzdEphY2tBdWRpb0NsaWVudCAqKSB3YWxrLT5kYXRhOworCisgICAgY2xpZW50LT5zZXJ2ZXJfZG93biA9IFRSVUU7CisgICAgZ19jb25kX3NpZ25hbCAoJmNvbm4tPmZsdXNoX2NvbmQpOworICAgIGlmIChjbGllbnQtPnNodXRkb3duKQorICAgICAgY2xpZW50LT5zaHV0ZG93biAoY2xpZW50LT51c2VyX2RhdGEpOworICB9CisgIGZvciAod2FsayA9IGNvbm4tPnNpbmtfY2xpZW50czsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdEphY2tBdWRpb0NsaWVudCAqY2xpZW50ID0gKEdzdEphY2tBdWRpb0NsaWVudCAqKSB3YWxrLT5kYXRhOworCisgICAgY2xpZW50LT5zZXJ2ZXJfZG93biA9IFRSVUU7CisgICAgZ19jb25kX3NpZ25hbCAoJmNvbm4tPmZsdXNoX2NvbmQpOworICAgIGlmIChjbGllbnQtPnNodXRkb3duKQorICAgICAgY2xpZW50LT5zaHV0ZG93biAoY2xpZW50LT51c2VyX2RhdGEpOworICB9CisgIGdfbXV0ZXhfdW5sb2NrICgmY29ubi0+bG9jayk7Cit9CisKKy8qIHdlIGVycm9yIG91dCAqLworc3RhdGljIGludAoramFja19zYW1wbGVfcmF0ZV9jYiAoamFja19uZnJhbWVzX3QgbmZyYW1lcywgdm9pZCAqYXJnKQoreworICBqYWNrX3NodXRkb3duX2NiIChhcmcpOworICByZXR1cm4gMDsKK30KKworLyogd2UgZXJyb3Igb3V0ICovCitzdGF0aWMgaW50CitqYWNrX2J1ZmZlcl9zaXplX2NiIChqYWNrX25mcmFtZXNfdCBuZnJhbWVzLCB2b2lkICphcmcpCit7CisgIGphY2tfc2h1dGRvd25fY2IgKGFyZyk7CisgIHJldHVybiAwOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBnY2hhciAqaWQ7CisgIGNvbnN0IGdjaGFyICpzZXJ2ZXI7Cit9IEZpbmREYXRhOworCitzdGF0aWMgZ2ludAorY29ubmVjdGlvbl9maW5kIChHc3RKYWNrQXVkaW9Db25uZWN0aW9uICogY29ubiwgRmluZERhdGEgKiBkYXRhKQoreworICAvKiBpZCdzIG11c3QgbWF0Y2ggKi8KKyAgaWYgKHN0cmNtcCAoY29ubi0+aWQsIGRhdGEtPmlkKSkKKyAgICByZXR1cm4gMTsKKworICAvKiBib3RoIHRoZSBzYW1lIG9yIE5VTEwgKi8KKyAgaWYgKGNvbm4tPnNlcnZlciA9PSBkYXRhLT5zZXJ2ZXIpCisgICAgcmV0dXJuIDA7CisKKyAgLyogd2UgY2Fubm90IGNvbXBhcmUgTlVMTCAqLworICBpZiAoY29ubi0+c2VydmVyID09IE5VTEwgfHwgZGF0YS0+c2VydmVyID09IE5VTEwpCisgICAgcmV0dXJuIDE7CisKKyAgaWYgKHN0cmNtcCAoY29ubi0+c2VydmVyLCBkYXRhLT5zZXJ2ZXIpKQorICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCisvKiBtYWtlIGEgY29ubmVjdGlvbiB3aXRoIEBpZCBhbmQgQHNlcnZlci4gUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUgd2l0aCB0aGUKKyAqIHN0YXR1cyBzZXQuICovCitzdGF0aWMgR3N0SmFja0F1ZGlvQ29ubmVjdGlvbiAqCitnc3RfamFja19hdWRpb19tYWtlX2Nvbm5lY3Rpb24gKGNvbnN0IGdjaGFyICogaWQsIGNvbnN0IGdjaGFyICogc2VydmVyLAorICAgIGphY2tfY2xpZW50X3QgKiBqY2xpZW50LCBqYWNrX3N0YXR1c190ICogc3RhdHVzKQoreworICBHc3RKYWNrQXVkaW9Db25uZWN0aW9uICpjb25uOworICBqYWNrX29wdGlvbnNfdCBvcHRpb25zOworICBnaW50IHJlczsKKworICAqc3RhdHVzID0gMDsKKworICBHU1RfREVCVUcgKCJuZXcgY2xpZW50ICVzLCBjb25uZWN0aW5nIHRvIHNlcnZlciAlcyIsIGlkLAorICAgICAgR1NUX1NUUl9OVUxMIChzZXJ2ZXIpKTsKKworICAvKiBuZXZlciBzdGFydCBhIHNlcnZlciAqLworICBvcHRpb25zID0gSmFja05vU3RhcnRTZXJ2ZXI7CisgIC8qIGlmIHdlIGhhdmUgYSBzZXJ2ZXJuYW1lLCB1c2UgaXQgKi8KKyAgaWYgKHNlcnZlciAhPSBOVUxMKQorICAgIG9wdGlvbnMgfD0gSmFja1NlcnZlck5hbWU7CisgIC8qIG9wZW4gdGhlIGNsaWVudCAqLworICBpZiAoamNsaWVudCA9PSBOVUxMKQorICAgIGpjbGllbnQgPSBqYWNrX2NsaWVudF9vcGVuIChpZCwgb3B0aW9ucywgc3RhdHVzLCBzZXJ2ZXIpOworICBpZiAoamNsaWVudCA9PSBOVUxMKQorICAgIGdvdG8gY291bGRfbm90X29wZW47CisKKyAgLyogbm93IGNyZWF0ZSBvYmplY3QgKi8KKyAgY29ubiA9IGdfbmV3IChHc3RKYWNrQXVkaW9Db25uZWN0aW9uLCAxKTsKKyAgY29ubi0+cmVmY291bnQgPSAxOworICBnX211dGV4X2luaXQgKCZjb25uLT5sb2NrKTsKKyAgZ19jb25kX2luaXQgKCZjb25uLT5mbHVzaF9jb25kKTsKKyAgY29ubi0+aWQgPSBnX3N0cmR1cCAoaWQpOworICBjb25uLT5zZXJ2ZXIgPSBnX3N0cmR1cCAoc2VydmVyKTsKKyAgY29ubi0+Y2xpZW50ID0gamNsaWVudDsKKyAgY29ubi0+bl9jbGllbnRzID0gMDsKKyAgY29ubi0+c3JjX2NsaWVudHMgPSBOVUxMOworICBjb25uLT5zaW5rX2NsaWVudHMgPSBOVUxMOworICBjb25uLT5jdXJfdHMgPSAtMTsKKyAgY29ubi0+dHJhbnNwb3J0X3N0YXRlID0gR1NUX1NUQVRFX1ZPSURfUEVORElORzsKKworICAvKiBzZXQgb3VyIGNhbGxiYWNrcyAgKi8KKyAgamFja19zZXRfcHJvY2Vzc19jYWxsYmFjayAoamNsaWVudCwgamFja19wcm9jZXNzX2NiLCBjb25uKTsKKyAgLyogdGhlc2UgY2FsbGJhY2tzIGNhdXNlIHVzIHRvIGVycm9yICovCisgIGphY2tfc2V0X2J1ZmZlcl9zaXplX2NhbGxiYWNrIChqY2xpZW50LCBqYWNrX2J1ZmZlcl9zaXplX2NiLCBjb25uKTsKKyAgamFja19zZXRfc2FtcGxlX3JhdGVfY2FsbGJhY2sgKGpjbGllbnQsIGphY2tfc2FtcGxlX3JhdGVfY2IsIGNvbm4pOworICBqYWNrX29uX3NodXRkb3duIChqY2xpZW50LCBqYWNrX3NodXRkb3duX2NiLCBjb25uKTsKKworICAvKiBhbGwgY2FsbGJhY2tzIGFyZSBzZXQsIGFjdGl2YXRlIHRoZSBjbGllbnQgKi8KKyAgR1NUX0lORk8gKCJhY3RpdmF0ZSBqYWNrX2NsaWVudCAlcCIsIGpjbGllbnQpOworICBpZiAoKHJlcyA9IGphY2tfYWN0aXZhdGUgKGpjbGllbnQpKSkKKyAgICBnb3RvIGNvdWxkX25vdF9hY3RpdmF0ZTsKKworICBHU1RfREVCVUcgKCJvcGVuZWQgY29ubmVjdGlvbiAlcCIsIGNvbm4pOworCisgIHJldHVybiBjb25uOworCisgIC8qIEVSUk9SUyAqLworY291bGRfbm90X29wZW46CisgIHsKKyAgICBHU1RfREVCVUcgKCJmYWlsZWQgdG8gb3BlbiBqYWNrIGNsaWVudCwgJWQiLCAqc3RhdHVzKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorY291bGRfbm90X2FjdGl2YXRlOgorICB7CisgICAgR1NUX0VSUk9SICgiQ291bGQgbm90IGFjdGl2YXRlIGNsaWVudCAoJWQpIiwgcmVzKTsKKyAgICAqc3RhdHVzID0gSmFja0ZhaWx1cmU7CisgICAgZ19tdXRleF9jbGVhciAoJmNvbm4tPmxvY2spOworICAgIGdfZnJlZSAoY29ubi0+aWQpOworICAgIGdfZnJlZSAoY29ubi0+c2VydmVyKTsKKyAgICBnX2ZyZWUgKGNvbm4pOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyBHc3RKYWNrQXVkaW9Db25uZWN0aW9uICoKK2dzdF9qYWNrX2F1ZGlvX2dldF9jb25uZWN0aW9uIChjb25zdCBnY2hhciAqIGlkLCBjb25zdCBnY2hhciAqIHNlcnZlciwKKyAgICBqYWNrX2NsaWVudF90ICogamNsaWVudCwgamFja19zdGF0dXNfdCAqIHN0YXR1cykKK3sKKyAgR3N0SmFja0F1ZGlvQ29ubmVjdGlvbiAqY29ubjsKKyAgR0xpc3QgKmZvdW5kOworICBGaW5kRGF0YSBkYXRhOworCisgIEdTVF9ERUJVRyAoImdldHRpbmcgY29ubmVjdGlvbiBmb3IgaWQgJXMsIHNlcnZlciAlcyIsIGlkLAorICAgICAgR1NUX1NUUl9OVUxMIChzZXJ2ZXIpKTsKKworICBkYXRhLmlkID0gaWQ7CisgIGRhdGEuc2VydmVyID0gc2VydmVyOworCisgIEdfTE9DSyAoY29ubmVjdGlvbnNfbG9jayk7CisgIGZvdW5kID0KKyAgICAgIGdfbGlzdF9maW5kX2N1c3RvbSAoY29ubmVjdGlvbnMsICZkYXRhLCAoR0NvbXBhcmVGdW5jKSBjb25uZWN0aW9uX2ZpbmQpOworICBpZiAoZm91bmQgIT0gTlVMTCAmJiBqY2xpZW50ICE9IE5VTEwpIHsKKyAgICAvKiB3ZSBmb3VuZCBpdCwgaW5jcmVhc2UgcmVmY291bnQgYW5kIHJldHVybiBpdCAqLworICAgIGNvbm4gPSAoR3N0SmFja0F1ZGlvQ29ubmVjdGlvbiAqKSBmb3VuZC0+ZGF0YTsKKyAgICBjb25uLT5yZWZjb3VudCsrOworCisgICAgR1NUX0RFQlVHICgiZm91bmQgY29ubmVjdGlvbiAlcCIsIGNvbm4pOworICB9IGVsc2UgeworICAgIC8qIG1ha2UgbmV3IGNvbm5lY3Rpb24gKi8KKyAgICBjb25uID0gZ3N0X2phY2tfYXVkaW9fbWFrZV9jb25uZWN0aW9uIChpZCwgc2VydmVyLCBqY2xpZW50LCBzdGF0dXMpOworICAgIGlmIChjb25uICE9IE5VTEwpIHsKKyAgICAgIEdTVF9ERUJVRyAoImNyZWF0ZWQgY29ubmVjdGlvbiAlcCIsIGNvbm4pOworICAgICAgLyogYWRkIHRvIGxpc3Qgb24gc3VjY2VzcyAqLworICAgICAgY29ubmVjdGlvbnMgPSBnX2xpc3RfcHJlcGVuZCAoY29ubmVjdGlvbnMsIGNvbm4pOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklORyAoImNvdWxkIG5vdCBjcmVhdGUgY29ubmVjdGlvbiIpOworICAgIH0KKyAgfQorICBHX1VOTE9DSyAoY29ubmVjdGlvbnNfbG9jayk7CisKKyAgcmV0dXJuIGNvbm47Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfamFja19hdWRpb191bnJlZl9jb25uZWN0aW9uIChHc3RKYWNrQXVkaW9Db25uZWN0aW9uICogY29ubikKK3sKKyAgZ2ludCByZXM7CisgIGdib29sZWFuIHplcm87CisKKyAgR1NUX0RFQlVHICgidW5yZWYgY29ubmVjdGlvbiAlcCByZWZjbnQgJWQiLCBjb25uLCBjb25uLT5yZWZjb3VudCk7CisKKyAgR19MT0NLIChjb25uZWN0aW9uc19sb2NrKTsKKyAgY29ubi0+cmVmY291bnQtLTsKKyAgaWYgKCh6ZXJvID0gKGNvbm4tPnJlZmNvdW50ID09IDApKSkgeworICAgIEdTVF9ERUJVRyAoImNsb3NpbmcgY29ubmVjdGlvbiAlcCIsIGNvbm4pOworICAgIC8qIHJlbW92ZSBmcm9tIGxpc3QsIHdlIGNhbiByZWxlYXNlIHRoZSBtdXRleCBhZnRlciByZW1vdmluZyB0aGUgY29ubmVjdGlvbgorICAgICAqIGZyb20gdGhlIGxpc3QgYmVjYXVzZSBhZnRlciB0aGF0LCBub2JvZHkgY2FuIGFjY2VzcyB0aGUgY29ubmVjdGlvbiBhbnltb3JlLiAqLworICAgIGNvbm5lY3Rpb25zID0gZ19saXN0X3JlbW92ZSAoY29ubmVjdGlvbnMsIGNvbm4pOworICB9CisgIEdfVU5MT0NLIChjb25uZWN0aW9uc19sb2NrKTsKKworICAvKiBpZiB3ZSBhcmUgemVybywgY2xvc2UgYW5kIGNsZWFudXAgdGhlIGNvbm5lY3Rpb24gKi8KKyAgaWYgKHplcm8pIHsKKyAgICAvKiBkb24ndCB1c2UgY29ubi0+bG9jayBoZXJlLiB0d28gcmVhc29uczoKKyAgICAgKgorICAgICAqICAxKSBpdHMgbm90IG5lY2Vzc2FyeTogamFja19kZWFjdGl2YXRlKCkgd2lsbCBub3QgcmV0dXJuIHVudGlsIHRoZSBKQUNLIHRocmVhZAorICAgICAqICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29ubmVjdGlvbiBpcyBjbGVhbmVkIHVwIGJ5IGEgdGhyZWFkIGpvaW4sIGhlbmNlIAorICAgICAqICAgICAgbm8gbW9yZSBjYWxsYmFja3MgY2FuIG9jY3VyIG9yIGJlIGluIHByb2dyZXNzLgorICAgICAqCisgICAgICogMikgaXQgd291bGQgZGVhZGxvY2sgYW55d2F5LCBiZWNhdXNlIGphY2tfZGVhY3RpdmF0ZSgpIHdpbGwgc2xlZXAKKyAgICAgKiAgICAgIHdhaXRpbmcgZm9yIHRoZSBKQUNLIHRocmVhZCwgYW5kIGNhbiB0aHVzIGNhdXNlIGRlYWRsb2NrIGluIAorICAgICAqICAgICAgamFja19wcm9jZXNzX2NiKCkKKyAgICAgKi8KKyAgICBHU1RfSU5GTyAoImRlYWN0aXZhdGUgamFja19jbGllbnQgJXAiLCBjb25uLT5jbGllbnQpOworICAgIGlmICgocmVzID0gamFja19kZWFjdGl2YXRlIChjb25uLT5jbGllbnQpKSkgeworICAgICAgLyogd2Ugb25seSB3YXJuLCB0aGlzIG1lYW5zIHRoZSBzZXJ2ZXIgaXMgcHJvYmFibHkgc2h1dCBkb3duIGFuZCB0aGUgY2xpZW50CisgICAgICAgKiBpcyBnb25lIGFueXdheS4gKi8KKyAgICAgIEdTVF9XQVJOSU5HICgiQ291bGQgbm90IGRlYWN0aXZhdGUgSmFjayBjbGllbnQgKCVkKSIsIHJlcyk7CisgICAgfQorICAgIC8qIGNsb3NlIGNvbm5lY3Rpb24gKi8KKyAgICBpZiAoKHJlcyA9IGphY2tfY2xpZW50X2Nsb3NlIChjb25uLT5jbGllbnQpKSkgeworICAgICAgLyogd2UgYXNzdW1lIHRoZSBjbGllbnQgaXMgZ29uZS4gKi8KKyAgICAgIEdTVF9XQVJOSU5HICgiY2xvc2UgZmFpbGVkICglZCkiLCByZXMpOworICAgIH0KKworICAgIC8qIGZyZWUgcmVzb3VyY2VzICovCisgICAgZ19tdXRleF9jbGVhciAoJmNvbm4tPmxvY2spOworICAgIGdfY29uZF9jbGVhciAoJmNvbm4tPmZsdXNoX2NvbmQpOworICAgIGdfZnJlZSAoY29ubi0+aWQpOworICAgIGdfZnJlZSAoY29ubi0+c2VydmVyKTsKKyAgICBnX2ZyZWUgKGNvbm4pOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfamFja19hdWRpb19jb25uZWN0aW9uX2FkZF9jbGllbnQgKEdzdEphY2tBdWRpb0Nvbm5lY3Rpb24gKiBjb25uLAorICAgIEdzdEphY2tBdWRpb0NsaWVudCAqIGNsaWVudCkKK3sKKyAgZ19tdXRleF9sb2NrICgmY29ubi0+bG9jayk7CisgIHN3aXRjaCAoY2xpZW50LT50eXBlKSB7CisgICAgY2FzZSBHU1RfSkFDS19DTElFTlRfU09VUkNFOgorICAgICAgY29ubi0+c3JjX2NsaWVudHMgPSBnX2xpc3RfYXBwZW5kIChjb25uLT5zcmNfY2xpZW50cywgY2xpZW50KTsKKyAgICAgIGNvbm4tPm5fY2xpZW50cysrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfSkFDS19DTElFTlRfU0lOSzoKKyAgICAgIGNvbm4tPnNpbmtfY2xpZW50cyA9IGdfbGlzdF9hcHBlbmQgKGNvbm4tPnNpbmtfY2xpZW50cywgY2xpZW50KTsKKyAgICAgIGNvbm4tPm5fY2xpZW50cysrOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfd2FybmluZyAoInRyeWluZyB0byBhZGQgdW5rbm93biBjbGllbnQgdHlwZSIpOworICAgICAgYnJlYWs7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZjb25uLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9qYWNrX2F1ZGlvX2Nvbm5lY3Rpb25fcmVtb3ZlX2NsaWVudCAoR3N0SmFja0F1ZGlvQ29ubmVjdGlvbiAqIGNvbm4sCisgICAgR3N0SmFja0F1ZGlvQ2xpZW50ICogY2xpZW50KQoreworICBnX211dGV4X2xvY2sgKCZjb25uLT5sb2NrKTsKKyAgc3dpdGNoIChjbGllbnQtPnR5cGUpIHsKKyAgICBjYXNlIEdTVF9KQUNLX0NMSUVOVF9TT1VSQ0U6CisgICAgICBjb25uLT5zcmNfY2xpZW50cyA9IGdfbGlzdF9yZW1vdmUgKGNvbm4tPnNyY19jbGllbnRzLCBjbGllbnQpOworICAgICAgY29ubi0+bl9jbGllbnRzLS07CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9KQUNLX0NMSUVOVF9TSU5LOgorICAgICAgY29ubi0+c2lua19jbGllbnRzID0gZ19saXN0X3JlbW92ZSAoY29ubi0+c2lua19jbGllbnRzLCBjbGllbnQpOworICAgICAgY29ubi0+bl9jbGllbnRzLS07CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ193YXJuaW5nICgidHJ5aW5nIHRvIHJlbW92ZSB1bmtub3duIGNsaWVudCB0eXBlIik7CisgICAgICBicmVhazsKKyAgfQorICBnX211dGV4X3VubG9jayAoJmNvbm4tPmxvY2spOworfQorCisvKioKKyAqIGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9nZXQ6CisgKiBAaWQ6IHRoZSBjbGllbnQgaWQKKyAqIEBzZXJ2ZXI6IHRoZSBzZXJ2ZXIgdG8gY29ubmVjdCB0byBvciBOVUxMIGZvciB0aGUgZGVmYXVsdCBzZXJ2ZXIKKyAqIEB0eXBlOiB0aGUgY2xpZW50IHR5cGUKKyAqIEBzaHV0ZG93bjogYSBjYWxsYmFjayB3aGVuIHRoZSBqYWNrIHNlcnZlciBzaHV0cyBkb3duCisgKiBAcHJvY2VzczogYSBjYWxsYmFjayB3aGVuIHNhbXBsZXMgYXJlIGF2YWlsYWJsZQorICogQGJ1ZmZlcl9zaXplOiBhIGNhbGxiYWNrIHdoZW4gdGhlIGJ1ZmZlcl9zaXplIGNoYW5nZXMKKyAqIEBzYW1wbGVfcmF0ZTogYSBjYWxsYmFjayB3aGVuIHRoZSBzYW1wbGVfcmF0ZSBjaGFuZ2VzCisgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFja3MKKyAqIEBzdGF0dXM6IHBvaW50ZXIgdG8gaG9sZCB0aGUgamFjayBzdGF0dXMgY29kZSBpbiBjYXNlIG9mIGVycm9ycworICoKKyAqIEdldCB0aGUgamFjayBjbGllbnQgY29ubmVjdGlvbiBmb3IgQGlkIGFuZCBAc2VydmVyLiBDb25uZWN0aW9ucyB0byB0aGUgc2FtZQorICogQGlkIGFuZCBAc2VydmVyIHdpbGwgcmVjZWl2ZSB0aGUgc2FtZSBwaHlzaWNhbCBKYWNrIGNsaWVudCBjb25uZWN0aW9uIGFuZAorICogd2lsbCB0aGVyZWZvcmUgYmUgc2NoZWR1bGVkIGluIHRoZSBzYW1lIHByb2Nlc3MgY2FsbGJhY2suCisgKiAKKyAqIFJldHVybnM6IGEgI0dzdEphY2tBdWRpb0NsaWVudC4KKyAqLworR3N0SmFja0F1ZGlvQ2xpZW50ICoKK2dzdF9qYWNrX2F1ZGlvX2NsaWVudF9uZXcgKGNvbnN0IGdjaGFyICogaWQsIGNvbnN0IGdjaGFyICogc2VydmVyLAorICAgIGphY2tfY2xpZW50X3QgKiBqY2xpZW50LCBHc3RKYWNrQ2xpZW50VHlwZSB0eXBlLAorICAgIHZvaWQgKCpzaHV0ZG93bikgKHZvaWQgKmFyZyksIEphY2tQcm9jZXNzQ2FsbGJhY2sgcHJvY2VzcywKKyAgICBKYWNrQnVmZmVyU2l6ZUNhbGxiYWNrIGJ1ZmZlcl9zaXplLCBKYWNrU2FtcGxlUmF0ZUNhbGxiYWNrIHNhbXBsZV9yYXRlLAorICAgIGdwb2ludGVyIHVzZXJfZGF0YSwgamFja19zdGF0dXNfdCAqIHN0YXR1cykKK3sKKyAgR3N0SmFja0F1ZGlvQ2xpZW50ICpjbGllbnQ7CisgIEdzdEphY2tBdWRpb0Nvbm5lY3Rpb24gKmNvbm47CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGlkICE9IE5VTEwsIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc3RhdHVzICE9IE5VTEwsIE5VTEwpOworCisgIC8qIGZpcnN0IGdldCBhIGNvbm5lY3Rpb24gZm9yIHRoZSBpZC9zZXJ2ZXIgcGFpciAqLworICBjb25uID0gZ3N0X2phY2tfYXVkaW9fZ2V0X2Nvbm5lY3Rpb24gKGlkLCBzZXJ2ZXIsIGpjbGllbnQsIHN0YXR1cyk7CisgIGlmIChjb25uID09IE5VTEwpCisgICAgZ290byBub19jb25uZWN0aW9uOworCisgIEdTVF9JTkZPICgibmV3IGNsaWVudCAlcyIsIGlkKTsKKworICAvKiBtYWtlIG5ldyBjbGllbnQgdXNpbmcgdGhlIGNvbm5lY3Rpb24gKi8KKyAgY2xpZW50ID0gZ19uZXcgKEdzdEphY2tBdWRpb0NsaWVudCwgMSk7CisgIGNsaWVudC0+YWN0aXZlID0gY2xpZW50LT5kZWFjdGl2YXRlID0gRkFMU0U7CisgIGNsaWVudC0+Y29ubiA9IGNvbm47CisgIGNsaWVudC0+dHlwZSA9IHR5cGU7CisgIGNsaWVudC0+c2h1dGRvd24gPSBzaHV0ZG93bjsKKyAgY2xpZW50LT5wcm9jZXNzID0gcHJvY2VzczsKKyAgY2xpZW50LT5idWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplOworICBjbGllbnQtPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7CisgIGNsaWVudC0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworICBjbGllbnQtPnNlcnZlcl9kb3duID0gRkFMU0U7CisKKyAgLyogYWRkIHRoZSBjbGllbnQgdG8gdGhlIGNvbm5lY3Rpb24gKi8KKyAgZ3N0X2phY2tfYXVkaW9fY29ubmVjdGlvbl9hZGRfY2xpZW50IChjb25uLCBjbGllbnQpOworCisgIHJldHVybiBjbGllbnQ7CisKKyAgLyogRVJST1JTICovCitub19jb25uZWN0aW9uOgorICB7CisgICAgR1NUX0RFQlVHICgiQ291bGQgbm90IGdldCBzZXJ2ZXIgY29ubmVjdGlvbiAoJWQpIiwgKnN0YXR1cyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworLyoqCisgKiBnc3RfamFja19hdWRpb19jbGllbnRfZnJlZToKKyAqIEBjbGllbnQ6IGEgI0dzdEphY2tBdWRpb0NsaWVudAorICoKKyAqIEZyZWUgdGhlIHJlc291cmNlcyB1c2VkIGJ5IEBjbGllbnQuCisgKi8KK3ZvaWQKK2dzdF9qYWNrX2F1ZGlvX2NsaWVudF9mcmVlIChHc3RKYWNrQXVkaW9DbGllbnQgKiBjbGllbnQpCit7CisgIEdzdEphY2tBdWRpb0Nvbm5lY3Rpb24gKmNvbm47CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoY2xpZW50ICE9IE5VTEwpOworCisgIEdTVF9JTkZPICgiZnJlZSBjbGllbnQiKTsKKworICBjb25uID0gY2xpZW50LT5jb25uOworCisgIC8qIHJlbW92ZSBmcm9tIGNvbm5lY3Rpb24gZmlyc3Qgc28gdGhhdCBpdCdzIG5vdCBzY2hlZHVsZWQgYW55bW9yZSBhZnRlciB0aGlzCisgICAqIGNhbGwgKi8KKyAgZ3N0X2phY2tfYXVkaW9fY29ubmVjdGlvbl9yZW1vdmVfY2xpZW50IChjb25uLCBjbGllbnQpOworICBnc3RfamFja19hdWRpb191bnJlZl9jb25uZWN0aW9uIChjb25uKTsKKworICBnX2ZyZWUgKGNsaWVudCk7Cit9CisKKy8qKgorICogZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF9jbGllbnQ6CisgKiBAY2xpZW50OiBhICNHc3RKYWNrQXVkaW9DbGllbnQKKyAqCisgKiBHZXQgdGhlIGphY2sgYXVkaW8gY2xpZW50IGZvciBAY2xpZW50LiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGVyZm9ybQorICogb3BlcmF0aW9ucyBvbiB0aGUgamFjayBzZXJ2ZXIgZnJvbSB0aGlzIGNsaWVudC4KKyAqCisgKiBSZXR1cm5zOiBUaGUgamFjayBhdWRpbyBjbGllbnQuCisgKi8KK2phY2tfY2xpZW50X3QgKgorZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF9jbGllbnQgKEdzdEphY2tBdWRpb0NsaWVudCAqIGNsaWVudCkKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNsaWVudCAhPSBOVUxMLCBOVUxMKTsKKworICAvKiBubyBsb2NrIG5lZWRlZCwgdGhlIGNvbm5lY3Rpb24gYW5kIHRoZSBjbGllbnQgZG9lcyBub3QgY2hhbmdlIAorICAgKiBvbmNlIHRoZSBjbGllbnQgaXMgY3JlYXRlZC4gKi8KKyAgcmV0dXJuIGNsaWVudC0+Y29ubi0+Y2xpZW50OworfQorCisvKioKKyAqIGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9zZXRfYWN0aXZlOgorICogQGNsaWVudDogYSAjR3N0SmFja0F1ZGlvQ2xpZW50CisgKiBAYWN0aXZlOiBuZXcgbW9kZSBmb3IgdGhlIGNsaWVudAorICoKKyAqIEFjdGl2YXRlIG9yIGRlYWN0aXZlIEBjbGllbnQuIFdoZW4gYSBjbGllbnQgaXMgYWN0aXZhdGVkIGl0IHdpbGwgcmVjZWl2ZQorICogY2FsbGJhY2tzIHdoZW4gZGF0YSBzaG91bGQgYmUgcHJvY2Vzc2VkLgorICoKKyAqIFJldHVybnM6IDAgaWYgYWxsIG9rLgorICovCitnaW50Citnc3RfamFja19hdWRpb19jbGllbnRfc2V0X2FjdGl2ZSAoR3N0SmFja0F1ZGlvQ2xpZW50ICogY2xpZW50LCBnYm9vbGVhbiBhY3RpdmUpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChjbGllbnQgIT0gTlVMTCwgLTEpOworCisgIC8qIG1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBub3QgZGlzcGF0Y2hpbmcgdGhlIGNsaWVudCAqLworICBnX211dGV4X2xvY2sgKCZjbGllbnQtPmNvbm4tPmxvY2spOworICBpZiAoY2xpZW50LT5hY3RpdmUgJiYgIWFjdGl2ZSkgeworICAgIC8qIHdlIG5lZWQgdG8gcHJvY2VzcyBvbmNlIG1vcmUgdG8gZmx1c2ggdGhlIHBvcnQgKi8KKyAgICBjbGllbnQtPmRlYWN0aXZhdGUgPSBUUlVFOworCisgICAgLyogbmVlZCB0byB3YWl0IGZvciBwcm9jZXNzX2NiIHJ1biBvbmNlIG1vcmUgKi8KKyAgICB3aGlsZSAoY2xpZW50LT5kZWFjdGl2YXRlICYmICFjbGllbnQtPnNlcnZlcl9kb3duKQorICAgICAgZ19jb25kX3dhaXQgKCZjbGllbnQtPmNvbm4tPmZsdXNoX2NvbmQsICZjbGllbnQtPmNvbm4tPmxvY2spOworICB9CisgIGNsaWVudC0+YWN0aXZlID0gYWN0aXZlOworICBnX211dGV4X3VubG9jayAoJmNsaWVudC0+Y29ubi0+bG9jayk7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF90cmFuc3BvcnRfc3RhdGU6CisgKiBAY2xpZW50OiBhICNHc3RKYWNrQXVkaW9DbGllbnQKKyAqCisgKiBDaGVjayB0aGUgY3VycmVudCB0cmFuc3BvcnQgc3RhdGUuIFRoZSBjbGllbnQgY2FuIHVzZSB0aGlzIHRvIHJlcXVlc3QgYSBzdGF0ZQorICogY2hhbmdlIGZyb20gdGhlIGFwcGxpY2F0aW9uLgorICoKKyAqIFJldHVybnM6IHRoZSBzdGF0ZSwgJUdTVF9TVEFURV9WT0lEX1BFTkRJTkcgZm9yIG5vIGNoYW5nZSBpbiB0aGUgdHJhbnNwb3J0CisgKiBzdGF0ZQorICovCitHc3RTdGF0ZQorZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF90cmFuc3BvcnRfc3RhdGUgKEdzdEphY2tBdWRpb0NsaWVudCAqIGNsaWVudCkKK3sKKyAgR3N0U3RhdGUgc3RhdGUgPSBjbGllbnQtPmNvbm4tPnRyYW5zcG9ydF9zdGF0ZTsKKworICBjbGllbnQtPmNvbm4tPnRyYW5zcG9ydF9zdGF0ZSA9IEdTVF9TVEFURV9WT0lEX1BFTkRJTkc7CisgIHJldHVybiBzdGF0ZTsKK30KZGlmZiAtLWdpdCBhL2V4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5oIGIvZXh0L2phY2svZ3N0amFja2F1ZGlvY2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRjZDcwYwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA2IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogZ3N0amFja2F1ZGlvY2xpZW50Lmg6CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9KQUNLX0FVRElPX0NMSUVOVF9IX18KKyNkZWZpbmUgX19HU1RfSkFDS19BVURJT19DTElFTlRfSF9fCisKKyNpbmNsdWRlIDxqYWNrL2phY2suaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIGVudW0gCit7CisgIEdTVF9KQUNLX0NMSUVOVF9TT1VSQ0UsCisgIEdTVF9KQUNLX0NMSUVOVF9TSU5LCit9IEdzdEphY2tDbGllbnRUeXBlOworCit0eXBlZGVmIHN0cnVjdCBfR3N0SmFja0F1ZGlvQ2xpZW50IEdzdEphY2tBdWRpb0NsaWVudDsKKwordm9pZCAgICAgICAgICAgICAgICAgIGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9pbml0ICAgICAgICAgICAodm9pZCk7CisKKworR3N0SmFja0F1ZGlvQ2xpZW50ICogIGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9uZXcgICAgICAgICAgICAoY29uc3QgZ2NoYXIgKmlkLCBjb25zdCBnY2hhciAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFja19jbGllbnRfdCAqamNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdEphY2tDbGllbnRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqc2h1dGRvd24pICh2b2lkICphcmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmFja1Byb2Nlc3NDYWxsYmFjayAgICBwcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmFja0J1ZmZlclNpemVDYWxsYmFjayBidWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphY2tTYW1wbGVSYXRlQ2FsbGJhY2sgc2FtcGxlX3JhdGUsCisJCQkJCQkJICAgIGdwb2ludGVyIHVzZXJfZGF0YSwKKwkJCQkJCQkgICAgamFja19zdGF0dXNfdCAqc3RhdHVzKTsKK3ZvaWQgICAgICAgICAgICAgICAgICBnc3RfamFja19hdWRpb19jbGllbnRfZnJlZSAgICAgICAgICAgKEdzdEphY2tBdWRpb0NsaWVudCAqY2xpZW50KTsKKworamFja19jbGllbnRfdCAqICAgICAgIGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9nZXRfY2xpZW50ICAgICAoR3N0SmFja0F1ZGlvQ2xpZW50ICpjbGllbnQpOworCitnYm9vbGVhbiAgICAgICAgICAgICAgZ3N0X2phY2tfYXVkaW9fY2xpZW50X3NldF9hY3RpdmUgICAgIChHc3RKYWNrQXVkaW9DbGllbnQgKmNsaWVudCwgZ2Jvb2xlYW4gYWN0aXZlKTsKKworR3N0U3RhdGUgICAgICAgICAgICAgIGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9nZXRfdHJhbnNwb3J0X3N0YXRlIChHc3RKYWNrQXVkaW9DbGllbnQgKmNsaWVudCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9KQUNLX0FVRElPX0NMSUVOVF9IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYyBiL2V4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjQ5ZjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jCkBAIC0wLDAgKzEsOTczIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIGdzdGphY2thdWRpb3NpbmsuYzogamFjayBhdWRpbyBzaW5rIGltcGxlbWVudGF0aW9uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtamFja2F1ZGlvc2luaworICogQHNlZV9hbHNvOiAjR3N0QXVkaW9CYXNlU2luaywgI0dzdEF1ZGlvUmluZ0J1ZmZlcgorICoKKyAqIEEgU2luayB0aGF0IG91dHB1dHMgZGF0YSB0byBKYWNrIHBvcnRzLgorICogCisgKiBJdCB3aWxsIGNyZWF0ZSBOIEphY2sgcG9ydHMgbmFtZWQgb3V0XyZsdDtuYW1lJmd0O18mbHQ7bnVtJmd0OyB3aGVyZSAKKyAqICZsdDtuYW1lJmd0OyBpcyB0aGUgZWxlbWVudCBuYW1lIGFuZCAmbHQ7bnVtJmd0OyBpcyBzdGFydGluZyBmcm9tIDEuCisgKiBFYWNoIHBvcnQgY29ycmVzcG9uZHMgdG8gYSBnc3RyZWFtZXIgY2hhbm5lbC4KKyAqIAorICogVGhlIHNhbXBsZXJhdGUgYXMgZXhwb3NlZCBvbiB0aGUgY2FwcyBpcyBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIHNhbXBsZXJhdGUgb2YKKyAqIHRoZSBqYWNrIHNlcnZlci4KKyAqIAorICogV2hlbiB0aGUgI0dzdEphY2tBdWRpb1Npbms6Y29ubmVjdCBwcm9wZXJ0eSBpcyBzZXQgdG8gYXV0bywgdGhpcyBlbGVtZW50CisgKiB3aWxsIHRyeSB0byBjb25uZWN0IGVhY2ggb3V0cHV0IHBvcnQgdG8gYSByYW5kb20gcGh5c2ljYWwgamFjayBpbnB1dCBwaW4uIEluCisgKiB0aGlzIG1vZGUsIHRoZSBzaW5rIHdpbGwgZXhwb3NlIHRoZSBudW1iZXIgb2YgcGh5c2ljYWwgY2hhbm5lbHMgb24gaXRzIHBhZAorICogY2Fwcy4KKyAqIAorICogV2hlbiB0aGUgI0dzdEphY2tBdWRpb1Npbms6Y29ubmVjdCBwcm9wZXJ0eSBpcyBzZXQgdG8gbm9uZSwgdGhlIGVsZW1lbnQgd2lsbAorICogYWNjZXB0IGFueSBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMgYW5kIHdpbGwgY3JlYXRlIChidXQgbm90IGNvbm5lY3QpIGFuCisgKiBvdXRwdXQgcG9ydCBmb3IgZWFjaCBjaGFubmVsLgorICogCisgKiBUaGUgZWxlbWVudCB3aWxsIGdlbmVyYXRlIGFuIGVycm9yIHdoZW4gdGhlIEphY2sgc2VydmVyIGlzIHNodXQgZG93biB3aGVuIGl0CisgKiB3YXMgUEFVU0VEIG9yIFBMQVlJTkcuIFRoaXMgZWxlbWVudCBkb2VzIG5vdCBzdXBwb3J0IGR5bmFtaWMgcmF0ZSBhbmQgYnVmZmVyCisgKiBzaXplIGNoYW5nZXMgYXQgcnVudGltZS4KKyAqIAorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyAhIGphY2thdWRpb3NpbmsKKyAqIF18IFBsYXkgYSBzaW5lIHdhdmUgdG8gdXNpbmcgamFjay4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC1pMThuLXBsdWdpbi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSAiZ3N0amFja2F1ZGlvc2luay5oIgorI2luY2x1ZGUgImdzdGphY2tyaW5nYnVmZmVyLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9qYWNrX2F1ZGlvX3NpbmtfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X2phY2tfYXVkaW9fc2lua19kZWJ1ZworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9qYWNrX2F1ZGlvX3NpbmtfYWxsb2NhdGVfY2hhbm5lbHMgKEdzdEphY2tBdWRpb1NpbmsgKiBzaW5rLCBnaW50IGNoYW5uZWxzKQoreworICBqYWNrX2NsaWVudF90ICpjbGllbnQ7CisKKyAgY2xpZW50ID0gZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF9jbGllbnQgKHNpbmstPmNsaWVudCk7CisKKyAgLyogcmVtb3ZlIHBvcnRzIHdlIGRvbid0IG5lZWQgKi8KKyAgd2hpbGUgKHNpbmstPnBvcnRfY291bnQgPiBjaGFubmVscykgeworICAgIGphY2tfcG9ydF91bnJlZ2lzdGVyIChjbGllbnQsIHNpbmstPnBvcnRzWy0tc2luay0+cG9ydF9jb3VudF0pOworICB9CisKKyAgLyogYWxsb2MgZW5vdWdoIG91dHB1dCBwb3J0cyAqLworICBzaW5rLT5wb3J0cyA9IGdfcmVhbGxvYyAoc2luay0+cG9ydHMsIHNpemVvZiAoamFja19wb3J0X3QgKikgKiBjaGFubmVscyk7CisgIHNpbmstPmJ1ZmZlcnMgPSBnX3JlYWxsb2MgKHNpbmstPmJ1ZmZlcnMsIHNpemVvZiAoc2FtcGxlX3QgKikgKiBjaGFubmVscyk7CisKKyAgLyogY3JlYXRlIGFuIG91dHB1dCBwb3J0IGZvciBlYWNoIGNoYW5uZWwgKi8KKyAgd2hpbGUgKHNpbmstPnBvcnRfY291bnQgPCBjaGFubmVscykgeworICAgIGdjaGFyICpuYW1lOworCisgICAgLyogcG9ydCBuYW1lcyBzdGFydCBmcm9tIDEgYW5kIGFyZSBsb2NhbCB0byB0aGUgZWxlbWVudCAqLworICAgIG5hbWUgPQorICAgICAgICBnX3N0cmR1cF9wcmludGYgKCJvdXRfJXNfJWQiLCBHU1RfRUxFTUVOVF9OQU1FIChzaW5rKSwKKyAgICAgICAgc2luay0+cG9ydF9jb3VudCArIDEpOworICAgIHNpbmstPnBvcnRzW3NpbmstPnBvcnRfY291bnRdID0KKyAgICAgICAgamFja19wb3J0X3JlZ2lzdGVyIChjbGllbnQsIG5hbWUsIEpBQ0tfREVGQVVMVF9BVURJT19UWVBFLAorICAgICAgICBKYWNrUG9ydElzT3V0cHV0LCAwKTsKKyAgICBpZiAoc2luay0+cG9ydHNbc2luay0+cG9ydF9jb3VudF0gPT0gTlVMTCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHNpbmstPnBvcnRfY291bnQrKzsKKworICAgIGdfZnJlZSAobmFtZSk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfamFja19hdWRpb19zaW5rX2ZyZWVfY2hhbm5lbHMgKEdzdEphY2tBdWRpb1NpbmsgKiBzaW5rKQoreworICBnaW50IHJlcywgaSA9IDA7CisgIGphY2tfY2xpZW50X3QgKmNsaWVudDsKKworICBjbGllbnQgPSBnc3RfamFja19hdWRpb19jbGllbnRfZ2V0X2NsaWVudCAoc2luay0+Y2xpZW50KTsKKworICAvKiBnZXQgcmlkIG9mIGFsbCBwb3J0cyAqLworICB3aGlsZSAoc2luay0+cG9ydF9jb3VudCkgeworICAgIEdTVF9MT0dfT0JKRUNUIChzaW5rLCAidW5yZWdpc3RlciBwb3J0ICVkIiwgaSk7CisgICAgaWYgKChyZXMgPSBqYWNrX3BvcnRfdW5yZWdpc3RlciAoY2xpZW50LCBzaW5rLT5wb3J0c1tpKytdKSkpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJ1bnJlZ2lzdGVyIG9mIHBvcnQgZmFpbGVkICglZCkiLCByZXMpOworICAgIH0KKyAgICBzaW5rLT5wb3J0X2NvdW50LS07CisgIH0KKyAgZ19mcmVlIChzaW5rLT5wb3J0cyk7CisgIHNpbmstPnBvcnRzID0gTlVMTDsKKyAgZ19mcmVlIChzaW5rLT5idWZmZXJzKTsKKyAgc2luay0+YnVmZmVycyA9IE5VTEw7Cit9CisKKy8qIHJpbmdidWZmZXIgYWJzdHJhY3QgYmFzZSBjbGFzcyAqLworc3RhdGljIEdUeXBlCitnc3RfamFja19yaW5nX2J1ZmZlcl9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIHZvbGF0aWxlIGdzaXplIHJpbmdidWZmZXJfdHlwZSA9IDA7CisKKyAgaWYgKGdfb25jZV9pbml0X2VudGVyICgmcmluZ2J1ZmZlcl90eXBlKSkgeworICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gcmluZ2J1ZmZlcl9pbmZvID0geworICAgICAgc2l6ZW9mIChHc3RKYWNrUmluZ0J1ZmZlckNsYXNzKSwKKyAgICAgIE5VTEwsCisgICAgICBOVUxMLAorICAgICAgKEdDbGFzc0luaXRGdW5jKSBnc3RfamFja19yaW5nX2J1ZmZlcl9jbGFzc19pbml0LAorICAgICAgTlVMTCwKKyAgICAgIE5VTEwsCisgICAgICBzaXplb2YgKEdzdEphY2tSaW5nQnVmZmVyKSwKKyAgICAgIDAsCisgICAgICAoR0luc3RhbmNlSW5pdEZ1bmMpIGdzdF9qYWNrX3JpbmdfYnVmZmVyX2luaXQsCisgICAgICBOVUxMCisgICAgfTsKKyAgICBHVHlwZSB0bXAgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChHU1RfVFlQRV9BVURJT19SSU5HX0JVRkZFUiwKKyAgICAgICAgIkdzdEphY2tBdWRpb1NpbmtSaW5nQnVmZmVyIiwgJnJpbmdidWZmZXJfaW5mbywgMCk7CisgICAgZ19vbmNlX2luaXRfbGVhdmUgKCZyaW5nYnVmZmVyX3R5cGUsIHRtcCk7CisgIH0KKworICByZXR1cm4gKEdUeXBlKSByaW5nYnVmZmVyX3R5cGU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfamFja19yaW5nX2J1ZmZlcl9jbGFzc19pbml0IChHc3RKYWNrUmluZ0J1ZmZlckNsYXNzICoga2xhc3MpCit7CisgIEdzdEF1ZGlvUmluZ0J1ZmZlckNsYXNzICpnc3RyaW5nYnVmZmVyX2NsYXNzOworCisgIGdzdHJpbmdidWZmZXJfY2xhc3MgPSAoR3N0QXVkaW9SaW5nQnVmZmVyQ2xhc3MgKikga2xhc3M7CisKKyAgcmluZ19wYXJlbnRfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKGtsYXNzKTsKKworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5vcGVuX2RldmljZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2phY2tfcmluZ19idWZmZXJfb3Blbl9kZXZpY2UpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5jbG9zZV9kZXZpY2UgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX2Nsb3NlX2RldmljZSk7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPmFjcXVpcmUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX2FjcXVpcmUpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5yZWxlYXNlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfamFja19yaW5nX2J1ZmZlcl9yZWxlYXNlKTsKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2phY2tfcmluZ19idWZmZXJfc3RhcnQpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5wYXVzZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfamFja19yaW5nX2J1ZmZlcl9wYXVzZSk7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPnJlc3VtZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfamFja19yaW5nX2J1ZmZlcl9zdGFydCk7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2phY2tfcmluZ19idWZmZXJfc3RvcCk7CisKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcy0+ZGVsYXkgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2phY2tfcmluZ19idWZmZXJfZGVsYXkpOworfQorCisvKiB0aGlzIGlzIHRoZSBjYWxsYmFjayBvZiBqYWNrLiBUaGlzIHNob3VsZCBSVC1zYWZlLgorICovCitzdGF0aWMgaW50CitqYWNrX3Byb2Nlc3NfY2IgKGphY2tfbmZyYW1lc190IG5mcmFtZXMsIHZvaWQgKmFyZykKK3sKKyAgR3N0SmFja0F1ZGlvU2luayAqc2luazsKKyAgR3N0QXVkaW9SaW5nQnVmZmVyICpidWY7CisgIGdpbnQgcmVhZHNlZywgbGVuOworICBndWludDggKnJlYWRwdHI7CisgIGdpbnQgaSwgaiwgZmxlbiwgY2hhbm5lbHM7CisgIHNhbXBsZV90ICpkYXRhOworCisgIGJ1ZiA9IEdTVF9BVURJT19SSU5HX0JVRkZFUl9DQVNUIChhcmcpOworICBzaW5rID0gR1NUX0pBQ0tfQVVESU9fU0lOSyAoR1NUX09CSkVDVF9QQVJFTlQgKGJ1ZikpOworCisgIGNoYW5uZWxzID0gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKCZidWYtPnNwZWMuaW5mbyk7CisKKyAgLyogZ2V0IHRhcmdldCBidWZmZXJzICovCisgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CisgICAgc2luay0+YnVmZmVyc1tpXSA9CisgICAgICAgIChzYW1wbGVfdCAqKSBqYWNrX3BvcnRfZ2V0X2J1ZmZlciAoc2luay0+cG9ydHNbaV0sIG5mcmFtZXMpOworICB9CisKKyAgaWYgKGdzdF9hdWRpb19yaW5nX2J1ZmZlcl9wcmVwYXJlX3JlYWQgKGJ1ZiwgJnJlYWRzZWcsICZyZWFkcHRyLCAmbGVuKSkgeworICAgIGZsZW4gPSBsZW4gLyBjaGFubmVsczsKKworICAgIC8qIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBtdXN0IGJlIGV4YWN0bHkgdGhlIHNlZ21lbnQgc2l6ZSAqLworICAgIGlmIChuZnJhbWVzICogc2l6ZW9mIChzYW1wbGVfdCkgIT0gZmxlbikKKyAgICAgIGdvdG8gd3Jvbmdfc2l6ZTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJjb3B5ICVkIGZyYW1lczogJXAsICVkIGJ5dGVzLCAlZCBjaGFubmVscyIsCisgICAgICAgIG5mcmFtZXMsIHJlYWRwdHIsIGZsZW4sIGNoYW5uZWxzKTsKKyAgICBkYXRhID0gKHNhbXBsZV90ICopIHJlYWRwdHI7CisKKyAgICAvKiB0aGUgc2FtcGxlcyBpbiB0aGUgcmluZ2J1ZmZlciBoYXZlIHRoZSBjaGFubmVscyBpbnRlcmxlYXZlZCwgd2UgbmVlZCB0bworICAgICAqIGRlaW50ZXJsZWF2ZSBpbnRvIHRoZSBqYWNrIHRhcmdldCBidWZmZXJzICovCisgICAgZm9yIChpID0gMDsgaSA8IG5mcmFtZXM7IGkrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspIHsKKyAgICAgICAgc2luay0+YnVmZmVyc1tqXVtpXSA9ICpkYXRhKys7CisgICAgICB9CisgICAgfQorCisgICAgLyogY2xlYXIgd3JpdHRlbiBzYW1wbGVzIGluIHRoZSByaW5nYnVmZmVyICovCisgICAgZ3N0X2F1ZGlvX3JpbmdfYnVmZmVyX2NsZWFyIChidWYsIHJlYWRzZWcpOworCisgICAgLyogd2Ugd3JvdGUgb25lIHNlZ21lbnQgKi8KKyAgICBnc3RfYXVkaW9fcmluZ19idWZmZXJfYWR2YW5jZSAoYnVmLCAxKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAid3JpdGUgJWQgZnJhbWVzIHNpbGVuY2UiLCBuZnJhbWVzKTsKKyAgICAvKiBXZSBhcmUgbm90IGFsbG93ZWQgdG8gcmVhZCBmcm9tIHRoZSByaW5nYnVmZmVyLCB3cml0ZSBzaWxlbmNlIHRvIGFsbAorICAgICAqIGphY2sgb3V0cHV0IGJ1ZmZlcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgeworICAgICAgbWVtc2V0IChzaW5rLT5idWZmZXJzW2ldLCAwLCBuZnJhbWVzICogc2l6ZW9mIChzYW1wbGVfdCkpOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX3NpemU6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzaW5rLCAibmJ5dGVzICglZCkgIT0gZmxlbiAoJWQpIiwKKyAgICAgICAgKGdpbnQpIChuZnJhbWVzICogc2l6ZW9mIChzYW1wbGVfdCkpLCBmbGVuKTsKKyAgICByZXR1cm4gMTsKKyAgfQorfQorCisvKiB3ZSBlcnJvciBvdXQgKi8KK3N0YXRpYyBpbnQKK2phY2tfc2FtcGxlX3JhdGVfY2IgKGphY2tfbmZyYW1lc190IG5mcmFtZXMsIHZvaWQgKmFyZykKK3sKKyAgR3N0SmFja0F1ZGlvU2luayAqc2luazsKKyAgR3N0SmFja1JpbmdCdWZmZXIgKmFidWY7CisKKyAgYWJ1ZiA9IEdTVF9KQUNLX1JJTkdfQlVGRkVSX0NBU1QgKGFyZyk7CisgIHNpbmsgPSBHU1RfSkFDS19BVURJT19TSU5LIChHU1RfT0JKRUNUX1BBUkVOVCAoYXJnKSk7CisKKyAgaWYgKGFidWYtPnNhbXBsZV9yYXRlICE9IC0xICYmIGFidWYtPnNhbXBsZV9yYXRlICE9IG5mcmFtZXMpCisgICAgZ290byBub3Rfc3VwcG9ydGVkOworCisgIHJldHVybiAwOworCisgIC8qIEVSUk9SUyAqLworbm90X3N1cHBvcnRlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChOVUxMKSwgKCJKYWNrIGNoYW5nZWQgdGhlIHNhbXBsZSByYXRlLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIikpOworICAgIHJldHVybiAxOworICB9Cit9CisKKy8qIHdlIGVycm9yIG91dCAqLworc3RhdGljIGludAoramFja19idWZmZXJfc2l6ZV9jYiAoamFja19uZnJhbWVzX3QgbmZyYW1lcywgdm9pZCAqYXJnKQoreworICBHc3RKYWNrQXVkaW9TaW5rICpzaW5rOworICBHc3RKYWNrUmluZ0J1ZmZlciAqYWJ1ZjsKKworICBhYnVmID0gR1NUX0pBQ0tfUklOR19CVUZGRVJfQ0FTVCAoYXJnKTsKKyAgc2luayA9IEdTVF9KQUNLX0FVRElPX1NJTksgKEdTVF9PQkpFQ1RfUEFSRU5UIChhcmcpKTsKKworICBpZiAoYWJ1Zi0+YnVmZmVyX3NpemUgIT0gLTEgJiYgYWJ1Zi0+YnVmZmVyX3NpemUgIT0gbmZyYW1lcykKKyAgICBnb3RvIG5vdF9zdXBwb3J0ZWQ7CisKKyAgcmV0dXJuIDA7CisKKyAgLyogRVJST1JTICovCitub3Rfc3VwcG9ydGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNpbmssIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKE5VTEwpLCAoIkphY2sgY2hhbmdlZCB0aGUgYnVmZmVyIHNpemUsIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQiKSk7CisgICAgcmV0dXJuIDE7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2phY2tfc2h1dGRvd25fY2IgKHZvaWQgKmFyZykKK3sKKyAgR3N0SmFja0F1ZGlvU2luayAqc2luazsKKworICBzaW5rID0gR1NUX0pBQ0tfQVVESU9fU0lOSyAoR1NUX09CSkVDVF9QQVJFTlQgKGFyZykpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJzaHV0ZG93biIpOworCisgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBSRVNPVVJDRSwgTk9UX0ZPVU5ELAorICAgICAgKE5VTEwpLCAoIkphY2sgc2VydmVyIHNodXRkb3duIikpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2phY2tfcmluZ19idWZmZXJfaW5pdCAoR3N0SmFja1JpbmdCdWZmZXIgKiBidWYsCisgICAgR3N0SmFja1JpbmdCdWZmZXJDbGFzcyAqIGdfY2xhc3MpCit7CisgIGJ1Zi0+Y2hhbm5lbHMgPSAtMTsKKyAgYnVmLT5idWZmZXJfc2l6ZSA9IC0xOworICBidWYtPnNhbXBsZV9yYXRlID0gLTE7Cit9CisKKy8qIHRoZSBfb3Blbl9kZXZpY2UgbWV0aG9kIHNob3VsZCBtYWtlIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBzZXJ2ZXIKKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfamFja19yaW5nX2J1ZmZlcl9vcGVuX2RldmljZSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RKYWNrQXVkaW9TaW5rICpzaW5rOworICBqYWNrX3N0YXR1c190IHN0YXR1cyA9IDA7CisgIGNvbnN0IGdjaGFyICpuYW1lOworCisgIHNpbmsgPSBHU1RfSkFDS19BVURJT19TSU5LIChHU1RfT0JKRUNUX1BBUkVOVCAoYnVmKSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgIm9wZW4iKTsKKworICBpZiAoc2luay0+Y2xpZW50X25hbWUpIHsKKyAgICBuYW1lID0gc2luay0+Y2xpZW50X25hbWU7CisgIH0gZWxzZSB7CisgICAgbmFtZSA9IGdfZ2V0X2FwcGxpY2F0aW9uX25hbWUgKCk7CisgIH0KKyAgaWYgKCFuYW1lKQorICAgIG5hbWUgPSAiR1N0cmVhbWVyIjsKKworICBzaW5rLT5jbGllbnQgPSBnc3RfamFja19hdWRpb19jbGllbnRfbmV3IChuYW1lLCBzaW5rLT5zZXJ2ZXIsCisgICAgICBzaW5rLT5qY2xpZW50LAorICAgICAgR1NUX0pBQ0tfQ0xJRU5UX1NJTkssCisgICAgICBqYWNrX3NodXRkb3duX2NiLAorICAgICAgamFja19wcm9jZXNzX2NiLCBqYWNrX2J1ZmZlcl9zaXplX2NiLCBqYWNrX3NhbXBsZV9yYXRlX2NiLCBidWYsICZzdGF0dXMpOworICBpZiAoc2luay0+Y2xpZW50ID09IE5VTEwpCisgICAgZ290byBjb3VsZF9ub3Rfb3BlbjsKKworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAib3BlbmVkIik7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitjb3VsZF9ub3Rfb3BlbjoKKyAgeworICAgIGlmIChzdGF0dXMgJiBKYWNrU2VydmVyRmFpbGVkKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2luaywgUkVTT1VSQ0UsIE5PVF9GT1VORCwKKyAgICAgICAgICAoXygiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIikpLAorICAgICAgICAgICgiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIEphY2sgc2VydmVyIChzdGF0dXMgJWQpIiwgc3RhdHVzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBSRVNPVVJDRSwgT1BFTl9XUklURSwKKyAgICAgICAgICAoTlVMTCksICgiSmFjayBjbGllbnQgb3BlbiBlcnJvciAoc3RhdHVzICVkKSIsIHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogY2xvc2UgdGhlIGNvbm5lY3Rpb24gd2l0aCB0aGUgc2VydmVyCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2phY2tfcmluZ19idWZmZXJfY2xvc2VfZGV2aWNlIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpCit7CisgIEdzdEphY2tBdWRpb1NpbmsgKnNpbms7CisKKyAgc2luayA9IEdTVF9KQUNLX0FVRElPX1NJTksgKEdTVF9PQkpFQ1RfUEFSRU5UIChidWYpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiY2xvc2UiKTsKKworICBnc3RfamFja19hdWRpb19zaW5rX2ZyZWVfY2hhbm5lbHMgKHNpbmspOworICBnc3RfamFja19hdWRpb19jbGllbnRfZnJlZSAoc2luay0+Y2xpZW50KTsKKyAgc2luay0+Y2xpZW50ID0gTlVMTDsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogYWxsb2NhdGUgYSBidWZmZXIgYW5kIHNldHVwIHJlc291cmNlcyB0byBwcm9jZXNzIHRoZSBhdWRpbyBzYW1wbGVzIG9mCisgKiB0aGUgZm9ybWF0IGFzIHNwZWNpZmllZCBpbiBAc3BlYy4KKyAqCisgKiBXZSBhbGxvY2F0ZSBOIGphY2sgcG9ydHMsIG9uZSBmb3IgZWFjaCBjaGFubmVsLiBJZiB3ZSBhcmUgYXNrZWQgdG8KKyAqIGF1dG9tYXRpY2FsbHkgbWFrZSBhIGNvbm5lY3Rpb24gd2l0aCBwaHlzaWNhbCBwb3J0cywgd2UgY29ubmVjdCBhcyBtYW55CisgKiBwb3J0cyBhcyB0aGVyZSBhcmUgcGh5c2ljYWwgcG9ydHMsIGxlYXZpbmcgbGVmdG92ZXIgcG9ydHMgdW5jb25uZWN0ZWQuCisgKgorICogSXQgaXMgYXNzdW1lZCB0aGF0IHNhbXBsZXJhdGUgYW5kIG51bWJlciBvZiBjaGFubmVscyBhcmUgYWNjZXB0YWJsZSBzaW5jZSBvdXIKKyAqIGdldGNhcHMgbWV0aG9kIHdpbGwgYWx3YXlzIHByb3ZpZGUgY29ycmVjdCB2YWx1ZXMuIElmIHVuYWNjZXB0YWJsZSBjYXBzIGFyZQorICogcmVjZWl2ZWQgZm9yIHNvbWUgcmVhc29uLCB3ZSBmYWlsIGhlcmUuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2phY2tfcmluZ19idWZmZXJfYWNxdWlyZSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmLAorICAgIEdzdEF1ZGlvUmluZ0J1ZmZlclNwZWMgKiBzcGVjKQoreworICBHc3RKYWNrQXVkaW9TaW5rICpzaW5rOworICBHc3RKYWNrUmluZ0J1ZmZlciAqYWJ1ZjsKKyAgY29uc3QgY2hhciAqKnBvcnRzOworICBnaW50IHNhbXBsZV9yYXRlLCBidWZmZXJfc2l6ZTsKKyAgZ2ludCBpLCByYXRlLCBicGYsIGNoYW5uZWxzLCByZXM7CisgIGphY2tfY2xpZW50X3QgKmNsaWVudDsKKworICBzaW5rID0gR1NUX0pBQ0tfQVVESU9fU0lOSyAoR1NUX09CSkVDVF9QQVJFTlQgKGJ1ZikpOworICBhYnVmID0gR1NUX0pBQ0tfUklOR19CVUZGRVJfQ0FTVCAoYnVmKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiYWNxdWlyZSIpOworCisgIGNsaWVudCA9IGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9nZXRfY2xpZW50IChzaW5rLT5jbGllbnQpOworCisgIHJhdGUgPSBHU1RfQVVESU9fSU5GT19SQVRFICgmc3BlYy0+aW5mbyk7CisKKyAgLyogc2FtcGxlIHJhdGUgbXVzdCBiZSB0aGF0IG9mIHRoZSBzZXJ2ZXIgKi8KKyAgc2FtcGxlX3JhdGUgPSBqYWNrX2dldF9zYW1wbGVfcmF0ZSAoY2xpZW50KTsKKyAgaWYgKHNhbXBsZV9yYXRlICE9IHJhdGUpCisgICAgZ290byB3cm9uZ19zYW1wbGVyYXRlOworCisgIGNoYW5uZWxzID0gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKCZzcGVjLT5pbmZvKTsKKyAgYnBmID0gR1NUX0FVRElPX0lORk9fQlBGICgmc3BlYy0+aW5mbyk7CisKKyAgaWYgKCFnc3RfamFja19hdWRpb19zaW5rX2FsbG9jYXRlX2NoYW5uZWxzIChzaW5rLCBjaGFubmVscykpCisgICAgZ290byBvdXRfb2ZfcG9ydHM7CisKKyAgYnVmZmVyX3NpemUgPSBqYWNrX2dldF9idWZmZXJfc2l6ZSAoY2xpZW50KTsKKworICAvKiB0aGUgc2VnbWVudCBzaXplIGluIGJ5dGVzLCB0aGlzIGlzIGxhcmdlIGVub3VnaCB0byBob2xkIGEgYnVmZmVyIG9mIDMyYml0IGZsb2F0cworICAgKiBmb3IgYWxsIGNoYW5uZWxzICAqLworICBzcGVjLT5zZWdzaXplID0gYnVmZmVyX3NpemUgKiBzaXplb2YgKGdmbG9hdCkgKiBjaGFubmVsczsKKyAgc3BlYy0+bGF0ZW5jeV90aW1lID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzcGVjLT5zZWdzaXplLAorICAgICAgKEdTVF9TRUNPTkQgLyBHU1RfVVNFQ09ORCksIHJhdGUgKiBicGYpOworICAvKiBzZWd0b3RhbCBiYXNlZCBvbiBidWZmZXItdGltZSBsYXRlbmN5ICovCisgIHNwZWMtPnNlZ3RvdGFsID0gc3BlYy0+YnVmZmVyX3RpbWUgLyBzcGVjLT5sYXRlbmN5X3RpbWU7CisgIGlmIChzcGVjLT5zZWd0b3RhbCA8IDIpIHsKKyAgICBzcGVjLT5zZWd0b3RhbCA9IDI7CisgICAgc3BlYy0+YnVmZmVyX3RpbWUgPSBzcGVjLT5sYXRlbmN5X3RpbWUgKiBzcGVjLT5zZWd0b3RhbDsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJidWZmZXIgdGltZTogJSIgR19HSU5UNjRfRk9STUFUICIgdXNlYyIsCisgICAgICBzcGVjLT5idWZmZXJfdGltZSk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJsYXRlbmN5IHRpbWU6ICUiIEdfR0lOVDY0X0ZPUk1BVCAiIHVzZWMiLAorICAgICAgc3BlYy0+bGF0ZW5jeV90aW1lKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgImJ1ZmZlcl9zaXplICVkLCBzZWdzaXplICVkLCBzZWd0b3RhbCAlZCIsCisgICAgICBidWZmZXJfc2l6ZSwgc3BlYy0+c2Vnc2l6ZSwgc3BlYy0+c2VndG90YWwpOworCisgIC8qIGFsbG9jYXRlIHRoZSByaW5nYnVmZmVyIG1lbW9yeSBub3cgKi8KKyAgYnVmLT5zaXplID0gc3BlYy0+c2VndG90YWwgKiBzcGVjLT5zZWdzaXplOworICBidWYtPm1lbW9yeSA9IGdfbWFsbG9jMCAoYnVmLT5zaXplKTsKKworICBpZiAoKHJlcyA9IGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9zZXRfYWN0aXZlIChzaW5rLT5jbGllbnQsIFRSVUUpKSkKKyAgICBnb3RvIGNvdWxkX25vdF9hY3RpdmF0ZTsKKworICAvKiBpZiB3ZSBuZWVkIHRvIGF1dG9tYXRpY2FsbHkgY29ubmVjdCB0aGUgcG9ydHMsIGRvIHNvIG5vdy4gV2UgbXVzdCBkbyB0aGlzCisgICAqIGFmdGVyIGFjdGl2YXRpbmcgdGhlIGNsaWVudC4gKi8KKyAgaWYgKHNpbmstPmNvbm5lY3QgPT0gR1NUX0pBQ0tfQ09OTkVDVF9BVVRPCisgICAgICB8fCBzaW5rLT5jb25uZWN0ID09IEdTVF9KQUNLX0NPTk5FQ1RfQVVUT19GT1JDRUQpIHsKKyAgICAvKiBmaW5kIGFsbCB0aGUgcGh5c2ljYWwgaW5wdXQgcG9ydHMuIEEgcGh5c2ljYWwgaW5wdXQgcG9ydCBpcyBhIHBvcnQKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggYSBoYXJkd2FyZSBkZXZpY2UuIFNvbWVvbmUgbmVlZHMgY29ubmVjdCB0byBhIHBoeXNpY2FsCisgICAgICogcG9ydCBpbiBvcmRlciB0byBoZWFyIHNvbWV0aGluZy4gKi8KKyAgICBpZiAoc2luay0+cG9ydF9wYXR0ZXJuID09IE5VTEwpIHsKKyAgICAgIHBvcnRzID0gamFja19nZXRfcG9ydHMgKGNsaWVudCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICBKYWNrUG9ydElzUGh5c2ljYWwgfCBKYWNrUG9ydElzSW5wdXQpOworICAgIH0gZWxzZSB7CisgICAgICBwb3J0cyA9IGphY2tfZ2V0X3BvcnRzIChjbGllbnQsIHNpbmstPnBvcnRfcGF0dGVybiwgTlVMTCwKKyAgICAgICAgICBKYWNrUG9ydElzSW5wdXQpOworICAgIH0KKyAgICBpZiAocG9ydHMgPT0gTlVMTCkgeworICAgICAgLyogbm8gcG9ydHM/IGZpbmUgdGhlbiB3ZSBkb24ndCBkbyBhbnl0aGluZyBleGNlcHQgZm9yIHBvc3RpbmcgYSB3YXJuaW5nCisgICAgICAgKiBtZXNzYWdlLiAqLworICAgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoc2luaywgUkVTT1VSQ0UsIE5PVF9GT1VORCwgKE5VTEwpLAorICAgICAgICAgICgiTm8gcGh5c2ljYWwgaW5wdXQgcG9ydHMgZm91bmQsIGxlYXZpbmcgcG9ydHMgdW5jb25uZWN0ZWQiKSk7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKKyAgICAgIC8qIHN0b3Agd2hlbiBhbGwgaW5wdXQgcG9ydHMgYXJlIGV4aGF1c3RlZCAqLworICAgICAgaWYgKHBvcnRzW2ldID09IE5VTEwpIHsKKyAgICAgICAgLyogcG9zdCBhIHdhcm5pbmcgdGhhdCB3ZSBjb3VsZCBub3QgY29ubmVjdCBhbGwgcG9ydHMgKi8KKyAgICAgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoc2luaywgUkVTT1VSQ0UsIE5PVF9GT1VORCwgKE5VTEwpLAorICAgICAgICAgICAgKCJObyBtb3JlIHBoeXNpY2FsIHBvcnRzLCBsZWF2aW5nIHNvbWUgcG9ydHMgdW5jb25uZWN0ZWQiKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgInRyeSBjb25uZWN0aW5nIHRvICVzIiwKKyAgICAgICAgICBqYWNrX3BvcnRfbmFtZSAoc2luay0+cG9ydHNbaV0pKTsKKyAgICAgIC8qIGNvbm5lY3QgdGhlIHBvcnQgdG8gYSBwaHlzaWNhbCBwb3J0ICovCisgICAgICByZXMgPSBqYWNrX2Nvbm5lY3QgKGNsaWVudCwgamFja19wb3J0X25hbWUgKHNpbmstPnBvcnRzW2ldKSwgcG9ydHNbaV0pOworICAgICAgaWYgKHJlcyAhPSAwICYmIHJlcyAhPSBFRVhJU1QpCisgICAgICAgIGdvdG8gY2Fubm90X2Nvbm5lY3Q7CisgICAgfQorICAgIGZyZWUgKHBvcnRzKTsKKyAgfQorZG9uZToKKworICBhYnVmLT5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOworICBhYnVmLT5idWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplOworICBhYnVmLT5jaGFubmVscyA9IGNoYW5uZWxzOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLword3Jvbmdfc2FtcGxlcmF0ZToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJXcm9uZyBzYW1wbGVyYXRlLCBzZXJ2ZXIgaXMgcnVubmluZyBhdCAlZCBhbmQgd2UgcmVjZWl2ZWQgJWQiLAorICAgICAgICAgICAgc2FtcGxlX3JhdGUsIHJhdGUpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK291dF9vZl9wb3J0czoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJDYW5ub3QgYWxsb2NhdGUgbW9yZSBKYWNrIHBvcnRzIikpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorY291bGRfbm90X2FjdGl2YXRlOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNpbmssIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAoIkNvdWxkIG5vdCBhY3RpdmF0ZSBjbGllbnQgKCVkOiVzKSIsIHJlcywgZ19zdHJlcnJvciAocmVzKSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorY2Fubm90X2Nvbm5lY3Q6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2luaywgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgiQ291bGQgbm90IGNvbm5lY3Qgb3V0cHV0IHBvcnRzIHRvIHBoeXNpY2FsIHBvcnRzICglZDolcykiLAorICAgICAgICAgICAgcmVzLCBnX3N0cmVycm9yIChyZXMpKSk7CisgICAgZnJlZSAocG9ydHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKiBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBMT0NLICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9qYWNrX3JpbmdfYnVmZmVyX3JlbGVhc2UgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0SmFja0F1ZGlvU2luayAqc2luazsKKyAgR3N0SmFja1JpbmdCdWZmZXIgKmFidWY7CisgIGdpbnQgcmVzOworCisgIGFidWYgPSBHU1RfSkFDS19SSU5HX0JVRkZFUl9DQVNUIChidWYpOworICBzaW5rID0gR1NUX0pBQ0tfQVVESU9fU0lOSyAoR1NUX09CSkVDVF9QQVJFTlQgKGJ1ZikpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJyZWxlYXNlIik7CisKKyAgaWYgKChyZXMgPSBnc3RfamFja19hdWRpb19jbGllbnRfc2V0X2FjdGl2ZSAoc2luay0+Y2xpZW50LCBGQUxTRSkpKSB7CisgICAgLyogd2Ugb25seSB3YXJuLCB0aGlzIG1lYW5zIHRoZSBzZXJ2ZXIgaXMgcHJvYmFibHkgc2h1dCBkb3duIGFuZCB0aGUgY2xpZW50CisgICAgICogaXMgZ29uZSBhbnl3YXkuICovCisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoc2luaywgUkVTT1VSQ0UsIENMT1NFLCAoTlVMTCksCisgICAgICAgICgiQ291bGQgbm90IGRlYWN0aXZhdGUgSmFjayBjbGllbnQgKCVkKSIsIHJlcykpOworICB9CisKKyAgYWJ1Zi0+Y2hhbm5lbHMgPSAtMTsKKyAgYWJ1Zi0+YnVmZmVyX3NpemUgPSAtMTsKKyAgYWJ1Zi0+c2FtcGxlX3JhdGUgPSAtMTsKKworICAvKiBmcmVlIHRoZSBidWZmZXIgKi8KKyAgZ19mcmVlIChidWYtPm1lbW9yeSk7CisgIGJ1Zi0+bWVtb3J5ID0gTlVMTDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfamFja19yaW5nX2J1ZmZlcl9zdGFydCAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RKYWNrQXVkaW9TaW5rICpzaW5rOworCisgIHNpbmsgPSBHU1RfSkFDS19BVURJT19TSU5LIChHU1RfT0JKRUNUX1BBUkVOVCAoYnVmKSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgInN0YXJ0Iik7CisKKyAgaWYgKHNpbmstPnRyYW5zcG9ydCAmIEdTVF9KQUNLX1RSQU5TUE9SVF9NQVNURVIpIHsKKyAgICBqYWNrX2NsaWVudF90ICpjbGllbnQ7CisKKyAgICBjbGllbnQgPSBnc3RfamFja19hdWRpb19jbGllbnRfZ2V0X2NsaWVudCAoc2luay0+Y2xpZW50KTsKKyAgICBqYWNrX3RyYW5zcG9ydF9zdGFydCAoY2xpZW50KTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9qYWNrX3JpbmdfYnVmZmVyX3BhdXNlIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpCit7CisgIEdzdEphY2tBdWRpb1NpbmsgKnNpbms7CisKKyAgc2luayA9IEdTVF9KQUNLX0FVRElPX1NJTksgKEdTVF9PQkpFQ1RfUEFSRU5UIChidWYpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAicGF1c2UiKTsKKworICBpZiAoc2luay0+dHJhbnNwb3J0ICYgR1NUX0pBQ0tfVFJBTlNQT1JUX01BU1RFUikgeworICAgIGphY2tfY2xpZW50X3QgKmNsaWVudDsKKworICAgIGNsaWVudCA9IGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9nZXRfY2xpZW50IChzaW5rLT5jbGllbnQpOworICAgIGphY2tfdHJhbnNwb3J0X3N0b3AgKGNsaWVudCk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfamFja19yaW5nX2J1ZmZlcl9zdG9wIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpCit7CisgIEdzdEphY2tBdWRpb1NpbmsgKnNpbms7CisKKyAgc2luayA9IEdTVF9KQUNLX0FVRElPX1NJTksgKEdTVF9PQkpFQ1RfUEFSRU5UIChidWYpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic3RvcCIpOworCisgIGlmIChzaW5rLT50cmFuc3BvcnQgJiBHU1RfSkFDS19UUkFOU1BPUlRfTUFTVEVSKSB7CisgICAgamFja19jbGllbnRfdCAqY2xpZW50OworCisgICAgY2xpZW50ID0gZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF9jbGllbnQgKHNpbmstPmNsaWVudCk7CisgICAgamFja190cmFuc3BvcnRfc3RvcCAoY2xpZW50KTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisjaWYgZGVmaW5lZCAoSEFWRV9KQUNLXzBfMTIwXzEpIHx8IGRlZmluZWQoSEFWRV9KQUNLXzFfOV83KQorc3RhdGljIGd1aW50Citnc3RfamFja19yaW5nX2J1ZmZlcl9kZWxheSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RKYWNrQXVkaW9TaW5rICpzaW5rOworICBndWludCBpLCByZXMgPSAwOworICBqYWNrX2xhdGVuY3lfcmFuZ2VfdCByYW5nZTsKKworICBzaW5rID0gR1NUX0pBQ0tfQVVESU9fU0lOSyAoR1NUX09CSkVDVF9QQVJFTlQgKGJ1ZikpOworCisgIGZvciAoaSA9IDA7IGkgPCBzaW5rLT5wb3J0X2NvdW50OyBpKyspIHsKKyAgICBqYWNrX3BvcnRfZ2V0X2xhdGVuY3lfcmFuZ2UgKHNpbmstPnBvcnRzW2ldLCBKYWNrUGxheWJhY2tMYXRlbmN5LCAmcmFuZ2UpOworICAgIGlmIChyYW5nZS5tYXggPiByZXMpCisgICAgICByZXMgPSByYW5nZS5tYXg7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAoc2luaywgImRlbGF5ICV1IiwgcmVzKTsKKworICByZXR1cm4gcmVzOworfQorI2Vsc2UgLyogIShkZWZpbmVkIChIQVZFX0pBQ0tfMF8xMjBfMSkgfHwgZGVmaW5lZChIQVZFX0pBQ0tfMV85XzcpKSAqLworc3RhdGljIGd1aW50Citnc3RfamFja19yaW5nX2J1ZmZlcl9kZWxheSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RKYWNrQXVkaW9TaW5rICpzaW5rOworICBndWludCBpLCByZXMgPSAwOworICBndWludCBsYXRlbmN5OworICBqYWNrX2NsaWVudF90ICpjbGllbnQ7CisKKyAgc2luayA9IEdTVF9KQUNLX0FVRElPX1NJTksgKEdTVF9PQkpFQ1RfUEFSRU5UIChidWYpKTsKKyAgY2xpZW50ID0gZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF9jbGllbnQgKHNpbmstPmNsaWVudCk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpbmstPnBvcnRfY291bnQ7IGkrKykgeworICAgIGxhdGVuY3kgPSBqYWNrX3BvcnRfZ2V0X3RvdGFsX2xhdGVuY3kgKGNsaWVudCwgc2luay0+cG9ydHNbaV0pOworICAgIGlmIChsYXRlbmN5ID4gcmVzKQorICAgICAgcmVzID0gbGF0ZW5jeTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChzaW5rLCAiZGVsYXkgJXUiLCByZXMpOworCisgIHJldHVybiByZXM7Cit9CisjZW5kaWYKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGphY2thdWRpb3Npbmtfc2lua19mYWN0b3J5ID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9KQUNLX0ZPUk1BVF9TVFIgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgTUFYIF0iKQorICAgICk7CisKKy8qIEF1ZGlvU2luayBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgU0lHTkFMX0xBU1QKK307CisKKyNkZWZpbmUgREVGQVVMVF9QUk9QX0NPTk5FQ1QgCQlHU1RfSkFDS19DT05ORUNUX0FVVE8KKyNkZWZpbmUgREVGQVVMVF9QUk9QX1NFUlZFUiAJCU5VTEwKKyNkZWZpbmUgREVGQVVMVF9QUk9QX0NMSUVOVF9OQU1FCU5VTEwKKyNkZWZpbmUgREVGQVVMVF9QUk9QX1BPUlRfUEFUVEVSTiAgICAgIAlOVUxMCisjZGVmaW5lIERFRkFVTFRfUFJPUF9UUkFOU1BPUlQJR1NUX0pBQ0tfVFJBTlNQT1JUX0FVVE9OT01PVVMKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQ09OTkVDVCwKKyAgUFJPUF9TRVJWRVIsCisgIFBST1BfQ0xJRU5ULAorICBQUk9QX0NMSUVOVF9OQU1FLAorICBQUk9QX1BPUlRfUEFUVEVSTiwKKyAgUFJPUF9UUkFOU1BPUlQsCisgIFBST1BfTEFTVAorfTsKKworI2RlZmluZSBnc3RfamFja19hdWRpb19zaW5rX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdEphY2tBdWRpb1NpbmssIGdzdF9qYWNrX2F1ZGlvX3NpbmssIEdTVF9UWVBFX0FVRElPX0JBU0VfU0lOSyk7CisKK3N0YXRpYyB2b2lkIGdzdF9qYWNrX2F1ZGlvX3NpbmtfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgdm9pZCBnc3RfamFja19hdWRpb19zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9qYWNrX2F1ZGlvX3NpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0Q2FwcyAqZ3N0X2phY2tfYXVkaW9fc2lua19nZXRjYXBzIChHc3RCYXNlU2luayAqIGJzaW5rLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIEdzdEF1ZGlvUmluZ0J1ZmZlcgorICAgICogZ3N0X2phY2tfYXVkaW9fc2lua19jcmVhdGVfcmluZ2J1ZmZlciAoR3N0QXVkaW9CYXNlU2luayAqIHNpbmspOworCitzdGF0aWMgdm9pZAorZ3N0X2phY2tfYXVkaW9fc2lua19jbGFzc19pbml0IChHc3RKYWNrQXVkaW9TaW5rQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEJhc2VTaW5rQ2xhc3MgKmdzdGJhc2VzaW5rX2NsYXNzOworICBHc3RBdWRpb0Jhc2VTaW5rQ2xhc3MgKmdzdGF1ZGlvYmFzZXNpbmtfY2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9qYWNrX2F1ZGlvX3NpbmtfZGVidWcsICJqYWNrc2luayIsIDAsCisgICAgICAiamFja3NpbmsgZWxlbWVudCIpOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MgPSAoR3N0QmFzZVNpbmtDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YXVkaW9iYXNlc2lua19jbGFzcyA9IChHc3RBdWRpb0Jhc2VTaW5rQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF9qYWNrX2F1ZGlvX3NpbmtfZGlzcG9zZTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2phY2tfYXVkaW9fc2lua19nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9qYWNrX2F1ZGlvX3Npbmtfc2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ09OTkVDVCwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgiY29ubmVjdCIsICJDb25uZWN0IiwKKyAgICAgICAgICAiU3BlY2lmeSBob3cgdGhlIG91dHB1dCBwb3J0cyB3aWxsIGJlIGNvbm5lY3RlZCIsCisgICAgICAgICAgR1NUX1RZUEVfSkFDS19DT05ORUNULCBERUZBVUxUX1BST1BfQ09OTkVDVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NFUlZFUiwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJzZXJ2ZXIiLCAiU2VydmVyIiwKKyAgICAgICAgICAiVGhlIEphY2sgc2VydmVyIHRvIGNvbm5lY3QgdG8gKE5VTEwgPSBkZWZhdWx0KSIsCisgICAgICAgICAgREVGQVVMVF9QUk9QX1NFUlZFUiwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdEphY2tBdWRpb1Npbms6Y2xpZW50LW5hbWU6CisgICAqCisgICAqIFRoZSBjbGllbnQgbmFtZSB0byB1c2UuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NMSUVOVF9OQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImNsaWVudC1uYW1lIiwgIkNsaWVudCBuYW1lIiwKKyAgICAgICAgICAiVGhlIGNsaWVudCBuYW1lIG9mIHRoZSBKYWNrIGluc3RhbmNlIChOVUxMID0gZGVmYXVsdCkiLAorICAgICAgICAgIERFRkFVTFRfUFJPUF9DTElFTlRfTkFNRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NMSUVOVCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoImNsaWVudCIsICJKYWNrQ2xpZW50IiwgIkhhbmRsZSBmb3IgamFjayBjbGllbnQiLAorICAgICAgICAgIEdTVF9UWVBFX0pBQ0tfQ0xJRU5ULAorICAgICAgICAgIEdTVF9QQVJBTV9NVVRBQkxFX1JFQURZIHwgR19QQVJBTV9SRUFEV1JJVEUgfAorICAgICAgICAgIEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAgLyoqCisgICAqIEdzdEphY2tBdWRpb1Npbms6cG9ydC1wYXR0ZXJuCisgICAqCisgICAqIGF1dG9jb25uZWN0IHRvIHBvcnRzIG1hdGNoaW5nIHBhdHRlcm4sIHdoZW4gTlVMTCBjb25uZWN0IHRvIHBoeXNpY2FsIHBvcnRzCisgICAqCisgICAqIFNpbmNlOiAxLjYKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUE9SVF9QQVRURVJOLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInBvcnQtcGF0dGVybiIsICJwb3J0IHBhdHRlcm4iLAorICAgICAgICAgICJBIHBhdHRlcm4gdG8gc2VsZWN0IHdoaWNoIHBvcnRzIHRvIGNvbm5lY3QgdG8gKE5VTEwgPSBmaXJzdCBwaHlzaWNhbCBwb3J0cykiLAorICAgICAgICAgIERFRkFVTFRfUFJPUF9QT1JUX1BBVFRFUk4sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdEphY2tBdWRpb1Npbms6dHJhbnNwb3J0OgorICAgKgorICAgKiBUaGUgamFjayB0cmFuc3BvcnQgYmVoYXZpb3VyIGZvciB0aGUgY2xpZW50LgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UUkFOU1BPUlQsCisgICAgICBnX3BhcmFtX3NwZWNfZmxhZ3MgKCJ0cmFuc3BvcnQiLCAiVHJhbnNwb3J0IG1vZGUiLAorICAgICAgICAgICJKYWNrIHRyYW5zcG9ydCBiZWhhdmlvdXIgb2YgdGhlIGNsaWVudCIsCisgICAgICAgICAgR1NUX1RZUEVfSkFDS19UUkFOU1BPUlQsIERFRkFVTFRfUFJPUF9UUkFOU1BPUlQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkF1ZGlvIFNpbmsgKEphY2spIiwKKyAgICAgICJTaW5rL0F1ZGlvIiwgIk91dHB1dCBhdWRpbyB0byBhIEpBQ0sgc2VydmVyIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmphY2thdWRpb3Npbmtfc2lua19mYWN0b3J5KTsKKworICBnc3RiYXNlc2lua19jbGFzcy0+Z2V0X2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2phY2tfYXVkaW9fc2lua19nZXRjYXBzKTsKKworICBnc3RhdWRpb2Jhc2VzaW5rX2NsYXNzLT5jcmVhdGVfcmluZ2J1ZmZlciA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2phY2tfYXVkaW9fc2lua19jcmVhdGVfcmluZ2J1ZmZlcik7CisKKyAgLyogcmVmIGNsYXNzIGZyb20gYSB0aHJlYWQtc2FmZSBjb250ZXh0IHRvIHdvcmsgYXJvdW5kIG1pc3NpbmcgYml0IG9mCisgICAqIHRocmVhZC1zYWZldHkgaW4gR09iamVjdCAqLworICBnX3R5cGVfY2xhc3NfcmVmIChHU1RfVFlQRV9KQUNLX1JJTkdfQlVGRkVSKTsKKworICBnc3RfamFja19hdWRpb19jbGllbnRfaW5pdCAoKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9qYWNrX2F1ZGlvX3NpbmtfaW5pdCAoR3N0SmFja0F1ZGlvU2luayAqIHNpbmspCit7CisgIHNpbmstPmNvbm5lY3QgPSBERUZBVUxUX1BST1BfQ09OTkVDVDsKKyAgc2luay0+c2VydmVyID0gZ19zdHJkdXAgKERFRkFVTFRfUFJPUF9TRVJWRVIpOworICBzaW5rLT5qY2xpZW50ID0gTlVMTDsKKyAgc2luay0+cG9ydHMgPSBOVUxMOworICBzaW5rLT5wb3J0X2NvdW50ID0gMDsKKyAgc2luay0+YnVmZmVycyA9IE5VTEw7CisgIHNpbmstPmNsaWVudF9uYW1lID0gZ19zdHJkdXAgKERFRkFVTFRfUFJPUF9DTElFTlRfTkFNRSk7CisgIHNpbmstPnRyYW5zcG9ydCA9IERFRkFVTFRfUFJPUF9UUkFOU1BPUlQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfamFja19hdWRpb19zaW5rX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEphY2tBdWRpb1NpbmsgKnNpbmsgPSBHU1RfSkFDS19BVURJT19TSU5LIChvYmplY3QpOworCisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzaW5rLT5jYXBzLCBOVUxMKTsKKworICBpZiAoc2luay0+Y2xpZW50X25hbWUgIT0gTlVMTCkgeworICAgIGdfZnJlZSAoc2luay0+Y2xpZW50X25hbWUpOworICAgIHNpbmstPmNsaWVudF9uYW1lID0gTlVMTDsKKyAgfQorCisgIGlmIChzaW5rLT5wb3J0X3BhdHRlcm4gIT0gTlVMTCkgeworICAgIGdfZnJlZSAoc2luay0+cG9ydF9wYXR0ZXJuKTsKKyAgICBzaW5rLT5wb3J0X3BhdHRlcm4gPSBOVUxMOworICB9CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfamFja19hdWRpb19zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RKYWNrQXVkaW9TaW5rICpzaW5rOworCisgIHNpbmsgPSBHU1RfSkFDS19BVURJT19TSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DTElFTlRfTkFNRToKKyAgICAgIGdfZnJlZSAoc2luay0+Y2xpZW50X25hbWUpOworICAgICAgc2luay0+Y2xpZW50X25hbWUgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QT1JUX1BBVFRFUk46CisgICAgICBnX2ZyZWUgKHNpbmstPnBvcnRfcGF0dGVybik7CisgICAgICBzaW5rLT5wb3J0X3BhdHRlcm4gPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT05ORUNUOgorICAgICAgc2luay0+Y29ubmVjdCA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TRVJWRVI6CisgICAgICBnX2ZyZWUgKHNpbmstPnNlcnZlcik7CisgICAgICBzaW5rLT5zZXJ2ZXIgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTElFTlQ6CisgICAgICBpZiAoR1NUX1NUQVRFIChzaW5rKSA9PSBHU1RfU1RBVEVfTlVMTCB8fAorICAgICAgICAgIEdTVF9TVEFURSAoc2luaykgPT0gR1NUX1NUQVRFX1JFQURZKSB7CisgICAgICAgIHNpbmstPmpjbGllbnQgPSBnX3ZhbHVlX2dldF9ib3hlZCAodmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RSQU5TUE9SVDoKKyAgICAgIHNpbmstPnRyYW5zcG9ydCA9IGdfdmFsdWVfZ2V0X2ZsYWdzICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfamFja19hdWRpb19zaW5rX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RKYWNrQXVkaW9TaW5rICpzaW5rOworCisgIHNpbmsgPSBHU1RfSkFDS19BVURJT19TSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DTElFTlRfTkFNRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNpbmstPmNsaWVudF9uYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QT1JUX1BBVFRFUk46CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzaW5rLT5wb3J0X3BhdHRlcm4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NPTk5FQ1Q6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgc2luay0+Y29ubmVjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0VSVkVSOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc2luay0+c2VydmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTElFTlQ6CisgICAgICBnX3ZhbHVlX3NldF9ib3hlZCAodmFsdWUsIHNpbmstPmpjbGllbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RSQU5TUE9SVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ZsYWdzICh2YWx1ZSwgc2luay0+dHJhbnNwb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X2phY2tfYXVkaW9fc2lua19nZXRjYXBzIChHc3RCYXNlU2luayAqIGJzaW5rLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RKYWNrQXVkaW9TaW5rICpzaW5rID0gR1NUX0pBQ0tfQVVESU9fU0lOSyAoYnNpbmspOworICBjb25zdCBjaGFyICoqcG9ydHM7CisgIGdpbnQgbWluLCBtYXg7CisgIGdpbnQgcmF0ZTsKKyAgamFja19jbGllbnRfdCAqY2xpZW50OworCisgIGlmIChzaW5rLT5jbGllbnQgPT0gTlVMTCkKKyAgICBnb3RvIG5vX2NsaWVudDsKKworICBjbGllbnQgPSBnc3RfamFja19hdWRpb19jbGllbnRfZ2V0X2NsaWVudCAoc2luay0+Y2xpZW50KTsKKworICBpZiAoc2luay0+Y29ubmVjdCA9PSBHU1RfSkFDS19DT05ORUNUX0FVVE8pIHsKKyAgICAvKiBnZXQgYSBwb3J0IGNvdW50LCB0aGlzIGlzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgd2UgY2FuIGF1dG9tYXRpY2FsbHkKKyAgICAgKiBjb25uZWN0LiAqLworICAgIHBvcnRzID0gamFja19nZXRfcG9ydHMgKGNsaWVudCwgTlVMTCwgTlVMTCwKKyAgICAgICAgSmFja1BvcnRJc1BoeXNpY2FsIHwgSmFja1BvcnRJc0lucHV0KTsKKyAgICBtYXggPSAwOworICAgIGlmIChwb3J0cyAhPSBOVUxMKSB7CisgICAgICBmb3IgKDsgcG9ydHNbbWF4XTsgbWF4KyspOworICAgICAgZnJlZSAocG9ydHMpOworICAgIH0gZWxzZQorICAgICAgbWF4ID0gMDsKKyAgfSBlbHNlIHsKKyAgICAvKiB3ZSBhbGxvdyBhbnkgbnVtYmVyIG9mIHBhZHMsIHNvbWV0aGluZyBlbHNlIGlzIGdvaW5nIHRvIGNvbm5lY3QgdGhlCisgICAgICogcGFkcy4gKi8KKyAgICBtYXggPSBHX01BWElOVDsKKyAgfQorICBtaW4gPSBNSU4gKDEsIG1heCk7CisKKyAgcmF0ZSA9IGphY2tfZ2V0X3NhbXBsZV9yYXRlIChjbGllbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJnb3QgJWQtJWQgcG9ydHMsIHNhbXBsZXJhdGU6ICVkIiwgbWluLCBtYXgsIHJhdGUpOworCisgIGlmICghc2luay0+Y2FwcykgeworICAgIHNpbmstPmNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLAorICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgR1NUX0pBQ0tfRk9STUFUX1NUUiwKKyAgICAgICAgImxheW91dCIsIEdfVFlQRV9TVFJJTkcsICJpbnRlcmxlYXZlZCIsCisgICAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgcmF0ZSwKKyAgICAgICAgImNoYW5uZWxzIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCBtaW4sIG1heCwgTlVMTCk7CisgIH0KKyAgR1NUX0lORk9fT0JKRUNUIChzaW5rLCAicmV0dXJuaW5nIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIHNpbmstPmNhcHMpOworCisgIHJldHVybiBnc3RfY2Fwc19yZWYgKHNpbmstPmNhcHMpOworCisgIC8qIEVSUk9SUyAqLworbm9fY2xpZW50OgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgImRldmljZSBub3Qgb3BlbiwgdXNpbmcgdGVtcGxhdGUgY2FwcyIpOworICAgIC8qIGJhc2UgY2xhc3Mgd2lsbCBnZXQgdGVtcGxhdGUgY2FwcyBmb3IgdXMgd2hlbiB3ZSByZXR1cm4gTlVMTCAqLworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyBHc3RBdWRpb1JpbmdCdWZmZXIgKgorZ3N0X2phY2tfYXVkaW9fc2lua19jcmVhdGVfcmluZ2J1ZmZlciAoR3N0QXVkaW9CYXNlU2luayAqIHNpbmspCit7CisgIEdzdEF1ZGlvUmluZ0J1ZmZlciAqYnVmZmVyOworCisgIGJ1ZmZlciA9IGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfSkFDS19SSU5HX0JVRkZFUiwgTlVMTCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJjcmVhdGVkIHJpbmdidWZmZXIgQCVwIiwgYnVmZmVyKTsKKworICByZXR1cm4gYnVmZmVyOworfQpkaWZmIC0tZ2l0IGEvZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5oIGIvZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmY2NjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmgKQEAgLTAsMCArMSw4MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBnc3RqYWNrc2luay5oOgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfSkFDS19BVURJT19TSU5LX0hfXworI2RlZmluZSBfX0dTVF9KQUNLX0FVRElPX1NJTktfSF9fCisKKyNpbmNsdWRlIDxqYWNrL2phY2suaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9iYXNlc2luay5oPgorCisjaW5jbHVkZSAiZ3N0amFjay5oIgorI2luY2x1ZGUgImdzdGphY2thdWRpb2NsaWVudC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfSkFDS19BVURJT19TSU5LICAgICAgICAgICAgIChnc3RfamFja19hdWRpb19zaW5rX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9KQUNLX0FVRElPX1NJTksob2JqKSAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfSkFDS19BVURJT19TSU5LLEdzdEphY2tBdWRpb1NpbmspKQorI2RlZmluZSBHU1RfSkFDS19BVURJT19TSU5LX0NMQVNTKGtsYXNzKSAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfSkFDS19BVURJT19TSU5LLEdzdEphY2tBdWRpb1NpbmtDbGFzcykpCisjZGVmaW5lIEdTVF9KQUNLX0FVRElPX1NJTktfR0VUX0NMQVNTKG9iaikgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksR1NUX1RZUEVfSkFDS19BVURJT19TSU5LLEdzdEphY2tBdWRpb1NpbmtDbGFzcykpCisjZGVmaW5lIEdTVF9JU19KQUNLX0FVRElPX1NJTksob2JqKSAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfSkFDS19BVURJT19TSU5LKSkKKyNkZWZpbmUgR1NUX0lTX0pBQ0tfQVVESU9fU0lOS19DTEFTUyhrbGFzcykgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0pBQ0tfQVVESU9fU0lOSykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RKYWNrQXVkaW9TaW5rIEdzdEphY2tBdWRpb1Npbms7Cit0eXBlZGVmIHN0cnVjdCBfR3N0SmFja0F1ZGlvU2lua0NsYXNzIEdzdEphY2tBdWRpb1NpbmtDbGFzczsKKworLyoqCisgKiBHc3RKYWNrQXVkaW9TaW5rOgorICogCisgKiBPcGFxdWUgI0dzdEphY2tBdWRpb1NpbmsuCisgKi8KK3N0cnVjdCBfR3N0SmFja0F1ZGlvU2luayB7CisgIEdzdEF1ZGlvQmFzZVNpbmsgZWxlbWVudDsKKworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgLyogY2FjaGVkIGNhcHMgKi8KKyAgR3N0Q2FwcyAgICAgICAgICpjYXBzOworCisgIC8qIHByb3BlcnRpZXMgKi8KKyAgR3N0SmFja0Nvbm5lY3QgICBjb25uZWN0OworICBnY2hhciAgICAgICAgICAgKnNlcnZlcjsKKyAgamFja19jbGllbnRfdCAgICpqY2xpZW50OworICBnY2hhciAgICAgICAgICAgKmNsaWVudF9uYW1lOworICBnY2hhciAgICAgICAgICAgKnBvcnRfcGF0dGVybjsKKyAgZ3VpbnQgICAgICAgICAgICB0cmFuc3BvcnQ7CisKKyAgLyogb3VyIGNsaWVudCAqLworICBHc3RKYWNrQXVkaW9DbGllbnQgKmNsaWVudDsKKworICAvKiBvdXIgcG9ydHMgKi8KKyAgamFja19wb3J0X3QgICAgKipwb3J0czsKKyAgaW50ICAgICAgICAgICAgICBwb3J0X2NvdW50OworICBzYW1wbGVfdCAgICAgICAqKmJ1ZmZlcnM7Cit9OworCitzdHJ1Y3QgX0dzdEphY2tBdWRpb1NpbmtDbGFzcyB7CisgIEdzdEF1ZGlvQmFzZVNpbmtDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfamFja19hdWRpb19zaW5rX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0pBQ0tfQVVESU9fU0lOS19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jIGIvZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNlYmVlNwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jCkBAIC0wLDAgKzEsOTkwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUcmlzdGFuIE1hdHRoZXdzIDx0cmlzdGFuQHNhdC5xYy5jYT4KKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgKHRoZSAiTEdQTCIpLCBpbgorICogd2hpY2ggY2FzZSB0aGUgZm9sbG93aW5nIHByb3Zpc2lvbnMgYXBwbHkgaW5zdGVhZCBvZiB0aGUgb25lcworICogbWVudGlvbmVkIGFib3ZlOgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWphY2thdWRpb3NyYworICogQHNlZV9hbHNvOiAjR3N0QXVkaW9CYXNlU3JjLCAjR3N0QXVkaW9SaW5nQnVmZmVyCisgKgorICogQSBTcmMgdGhhdCBpbnB1dHMgZGF0YSBmcm9tIEphY2sgcG9ydHMuCisgKiAKKyAqIEl0IHdpbGwgY3JlYXRlIE4gSmFjayBwb3J0cyBuYW1lZCBpbl8mbHQ7bmFtZSZndDtfJmx0O251bSZndDsgd2hlcmUgCisgKiAmbHQ7bmFtZSZndDsgaXMgdGhlIGVsZW1lbnQgbmFtZSBhbmQgJmx0O251bSZndDsgaXMgc3RhcnRpbmcgZnJvbSAxLgorICogRWFjaCBwb3J0IGNvcnJlc3BvbmRzIHRvIGEgZ3N0cmVhbWVyIGNoYW5uZWwuCisgKiAKKyAqIFRoZSBzYW1wbGVyYXRlIGFzIGV4cG9zZWQgb24gdGhlIGNhcHMgaXMgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSBzYW1wbGVyYXRlIG9mCisgKiB0aGUgamFjayBzZXJ2ZXIuCisgKiAKKyAqIFdoZW4gdGhlICNHc3RKYWNrQXVkaW9TcmM6Y29ubmVjdCBwcm9wZXJ0eSBpcyBzZXQgdG8gYXV0bywgdGhpcyBlbGVtZW50CisgKiB3aWxsIHRyeSB0byBjb25uZWN0IGVhY2ggaW5wdXQgcG9ydCB0byBhIHJhbmRvbSBwaHlzaWNhbCBqYWNrIG91dHB1dCBwaW4uIAorICogCisgKiBXaGVuIHRoZSAjR3N0SmFja0F1ZGlvU3JjOmNvbm5lY3QgcHJvcGVydHkgaXMgc2V0IHRvIG5vbmUsIHRoZSBlbGVtZW50IHdpbGwKKyAqIGFjY2VwdCBhbnkgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyBhbmQgd2lsbCBjcmVhdGUgKGJ1dCBub3QgY29ubmVjdCkgYW4KKyAqIGlucHV0IHBvcnQgZm9yIGVhY2ggY2hhbm5lbC4KKyAqIAorICogVGhlIGVsZW1lbnQgd2lsbCBnZW5lcmF0ZSBhbiBlcnJvciB3aGVuIHRoZSBKYWNrIHNlcnZlciBpcyBzaHV0IGRvd24gd2hlbiBpdAorICogd2FzIFBBVVNFRCBvciBQTEFZSU5HLiBUaGlzIGVsZW1lbnQgZG9lcyBub3Qgc3VwcG9ydCBkeW5hbWljIHJhdGUgYW5kIGJ1ZmZlcgorICogc2l6ZSBjaGFuZ2VzIGF0IHJ1bnRpbWUuCisgKiAKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBqYWNrYXVkaW9zcmMgY29ubmVjdD0wICEgamFja2F1ZGlvc2luayBjb25uZWN0PTAKKyAqIF18IEdldCBhdWRpbyBpbnB1dCBpbnRvIGdzdHJlYW1lciBmcm9tIGphY2suCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSAiZ3N0amFja2F1ZGlvc3JjLmgiCisjaW5jbHVkZSAiZ3N0amFja3JpbmdidWZmZXIuaCIKKyNpbmNsdWRlICJnc3RqYWNrdXRpbC5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfamFja19hdWRpb19zcmNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X2phY2tfYXVkaW9fc3JjX2RlYnVnCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2phY2tfYXVkaW9fc3JjX2FsbG9jYXRlX2NoYW5uZWxzIChHc3RKYWNrQXVkaW9TcmMgKiBzcmMsIGdpbnQgY2hhbm5lbHMpCit7CisgIGphY2tfY2xpZW50X3QgKmNsaWVudDsKKworICBjbGllbnQgPSBnc3RfamFja19hdWRpb19jbGllbnRfZ2V0X2NsaWVudCAoc3JjLT5jbGllbnQpOworCisgIC8qIHJlbW92ZSBwb3J0cyB3ZSBkb24ndCBuZWVkICovCisgIHdoaWxlIChzcmMtPnBvcnRfY291bnQgPiBjaGFubmVscykKKyAgICBqYWNrX3BvcnRfdW5yZWdpc3RlciAoY2xpZW50LCBzcmMtPnBvcnRzWy0tc3JjLT5wb3J0X2NvdW50XSk7CisKKyAgLyogYWxsb2MgZW5vdWdoIGlucHV0IHBvcnRzICovCisgIHNyYy0+cG9ydHMgPSBnX3JlYWxsb2MgKHNyYy0+cG9ydHMsIHNpemVvZiAoamFja19wb3J0X3QgKikgKiBjaGFubmVscyk7CisgIHNyYy0+YnVmZmVycyA9IGdfcmVhbGxvYyAoc3JjLT5idWZmZXJzLCBzaXplb2YgKHNhbXBsZV90ICopICogY2hhbm5lbHMpOworCisgIC8qIGNyZWF0ZSBhbiBpbnB1dCBwb3J0IGZvciBlYWNoIGNoYW5uZWwgKi8KKyAgd2hpbGUgKHNyYy0+cG9ydF9jb3VudCA8IGNoYW5uZWxzKSB7CisgICAgZ2NoYXIgKm5hbWU7CisKKyAgICAvKiBwb3J0IG5hbWVzIHN0YXJ0IGZyb20gMSBhbmQgYXJlIGxvY2FsIHRvIHRoZSBlbGVtZW50ICovCisgICAgbmFtZSA9CisgICAgICAgIGdfc3RyZHVwX3ByaW50ZiAoImluXyVzXyVkIiwgR1NUX0VMRU1FTlRfTkFNRSAoc3JjKSwKKyAgICAgICAgc3JjLT5wb3J0X2NvdW50ICsgMSk7CisgICAgc3JjLT5wb3J0c1tzcmMtPnBvcnRfY291bnRdID0KKyAgICAgICAgamFja19wb3J0X3JlZ2lzdGVyIChjbGllbnQsIG5hbWUsIEpBQ0tfREVGQVVMVF9BVURJT19UWVBFLAorICAgICAgICBKYWNrUG9ydElzSW5wdXQsIDApOworICAgIGlmIChzcmMtPnBvcnRzW3NyYy0+cG9ydF9jb3VudF0gPT0gTlVMTCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHNyYy0+cG9ydF9jb3VudCsrOworCisgICAgZ19mcmVlIChuYW1lKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9qYWNrX2F1ZGlvX3NyY19mcmVlX2NoYW5uZWxzIChHc3RKYWNrQXVkaW9TcmMgKiBzcmMpCit7CisgIGdpbnQgcmVzLCBpID0gMDsKKyAgamFja19jbGllbnRfdCAqY2xpZW50OworCisgIGNsaWVudCA9IGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9nZXRfY2xpZW50IChzcmMtPmNsaWVudCk7CisKKyAgLyogZ2V0IHJpZCBvZiBhbGwgcG9ydHMgKi8KKyAgd2hpbGUgKHNyYy0+cG9ydF9jb3VudCkgeworICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICJ1bnJlZ2lzdGVyIHBvcnQgJWQiLCBpKTsKKyAgICBpZiAoKHJlcyA9IGphY2tfcG9ydF91bnJlZ2lzdGVyIChjbGllbnQsIHNyYy0+cG9ydHNbaSsrXSkpKQorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAidW5yZWdpc3RlciBvZiBwb3J0IGZhaWxlZCAoJWQpIiwgcmVzKTsKKworICAgIHNyYy0+cG9ydF9jb3VudC0tOworICB9CisgIGdfZnJlZSAoc3JjLT5wb3J0cyk7CisgIHNyYy0+cG9ydHMgPSBOVUxMOworICBnX2ZyZWUgKHNyYy0+YnVmZmVycyk7CisgIHNyYy0+YnVmZmVycyA9IE5VTEw7Cit9CisKKy8qIHJpbmdidWZmZXIgYWJzdHJhY3QgYmFzZSBjbGFzcyAqLworc3RhdGljIEdUeXBlCitnc3RfamFja19yaW5nX2J1ZmZlcl9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIHZvbGF0aWxlIGdzaXplIHJpbmdidWZmZXJfdHlwZSA9IDA7CisKKyAgaWYgKGdfb25jZV9pbml0X2VudGVyICgmcmluZ2J1ZmZlcl90eXBlKSkgeworICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gcmluZ2J1ZmZlcl9pbmZvID0geyBzaXplb2YgKEdzdEphY2tSaW5nQnVmZmVyQ2xhc3MpLAorICAgICAgTlVMTCwKKyAgICAgIE5VTEwsCisgICAgICAoR0NsYXNzSW5pdEZ1bmMpIGdzdF9qYWNrX3JpbmdfYnVmZmVyX2NsYXNzX2luaXQsCisgICAgICBOVUxMLAorICAgICAgTlVMTCwKKyAgICAgIHNpemVvZiAoR3N0SmFja1JpbmdCdWZmZXIpLAorICAgICAgMCwKKyAgICAgIChHSW5zdGFuY2VJbml0RnVuYykgZ3N0X2phY2tfcmluZ19idWZmZXJfaW5pdCwKKyAgICAgIE5VTEwKKyAgICB9OworICAgIEdUeXBlIHRtcCA9IGdfdHlwZV9yZWdpc3Rlcl9zdGF0aWMgKEdTVF9UWVBFX0FVRElPX1JJTkdfQlVGRkVSLAorICAgICAgICAiR3N0SmFja0F1ZGlvU3JjUmluZ0J1ZmZlciIsICZyaW5nYnVmZmVyX2luZm8sIDApOworICAgIGdfb25jZV9pbml0X2xlYXZlICgmcmluZ2J1ZmZlcl90eXBlLCB0bXApOworICB9CisKKyAgcmV0dXJuIChHVHlwZSkgcmluZ2J1ZmZlcl90eXBlOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2phY2tfcmluZ19idWZmZXJfY2xhc3NfaW5pdCAoR3N0SmFja1JpbmdCdWZmZXJDbGFzcyAqIGtsYXNzKQoreworICBHc3RBdWRpb1JpbmdCdWZmZXJDbGFzcyAqZ3N0cmluZ2J1ZmZlcl9jbGFzczsKKworICBnc3RyaW5nYnVmZmVyX2NsYXNzID0gKEdzdEF1ZGlvUmluZ0J1ZmZlckNsYXNzICopIGtsYXNzOworCisgIHJpbmdfcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcy0+b3Blbl9kZXZpY2UgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX29wZW5fZGV2aWNlKTsKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcy0+Y2xvc2VfZGV2aWNlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfamFja19yaW5nX2J1ZmZlcl9jbG9zZV9kZXZpY2UpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5hY3F1aXJlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfamFja19yaW5nX2J1ZmZlcl9hY3F1aXJlKTsKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcy0+cmVsZWFzZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2phY2tfcmluZ19idWZmZXJfcmVsZWFzZSk7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX3N0YXJ0KTsKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcy0+cGF1c2UgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2phY2tfcmluZ19idWZmZXJfcGF1c2UpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5yZXN1bWUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2phY2tfcmluZ19idWZmZXJfc3RhcnQpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX3N0b3ApOworCisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPmRlbGF5ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX2RlbGF5KTsKK30KKworLyogdGhpcyBpcyB0aGUgY2FsbGJhY2sgb2YgamFjay4gVGhpcyBzaG91bGQgYmUgUlQtc2FmZS4KKyAqIFdyaXRlcyBzYW1wbGVzIGZyb20gdGhlIGphY2sgaW5wdXQgcG9ydCdzIGJ1ZmZlciB0byB0aGUgZ3N0IHJpbmcgYnVmZmVyLgorICovCitzdGF0aWMgaW50CitqYWNrX3Byb2Nlc3NfY2IgKGphY2tfbmZyYW1lc190IG5mcmFtZXMsIHZvaWQgKmFyZykKK3sKKyAgR3N0SmFja0F1ZGlvU3JjICpzcmM7CisgIEdzdEF1ZGlvUmluZ0J1ZmZlciAqYnVmOworICBnaW50IGxlbjsKKyAgZ3VpbnQ4ICp3cml0ZXB0cjsKKyAgZ2ludCB3cml0ZXNlZzsKKyAgZ2ludCBjaGFubmVscywgaSwgaiwgZmxlbjsKKyAgc2FtcGxlX3QgKmRhdGE7CisKKyAgYnVmID0gR1NUX0FVRElPX1JJTkdfQlVGRkVSX0NBU1QgKGFyZyk7CisgIHNyYyA9IEdTVF9KQUNLX0FVRElPX1NSQyAoR1NUX09CSkVDVF9QQVJFTlQgKGJ1ZikpOworCisgIGNoYW5uZWxzID0gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKCZidWYtPnNwZWMuaW5mbyk7CisKKyAgLyogZ2V0IGlucHV0IGJ1ZmZlcnMgKi8KKyAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspCisgICAgc3JjLT5idWZmZXJzW2ldID0KKyAgICAgICAgKHNhbXBsZV90ICopIGphY2tfcG9ydF9nZXRfYnVmZmVyIChzcmMtPnBvcnRzW2ldLCBuZnJhbWVzKTsKKworICBpZiAoZ3N0X2F1ZGlvX3JpbmdfYnVmZmVyX3ByZXBhcmVfcmVhZCAoYnVmLCAmd3JpdGVzZWcsICZ3cml0ZXB0ciwgJmxlbikpIHsKKyAgICBmbGVuID0gbGVuIC8gY2hhbm5lbHM7CisKKyAgICAvKiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgbXVzdCBiZSBleGFjdGx5IHRoZSBzZWdtZW50IHNpemUgKi8KKyAgICBpZiAobmZyYW1lcyAqIHNpemVvZiAoc2FtcGxlX3QpICE9IGZsZW4pCisgICAgICBnb3RvIHdyb25nX3NpemU7CisKKyAgICAvKiB0aGUgc2FtcGxlcyBpbiB0aGUgamFjayBpbnB1dCBidWZmZXJzIGhhdmUgdG8gYmUgaW50ZXJsZWF2ZWQgaW50byB0aGUKKyAgICAgKiByaW5nYnVmZmVyICovCisgICAgZGF0YSA9IChzYW1wbGVfdCAqKSB3cml0ZXB0cjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmZyYW1lczsgKytpKQorICAgICAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyArK2opCisgICAgICAgICpkYXRhKysgPSBzcmMtPmJ1ZmZlcnNbal1baV07CisKKyAgICBHU1RfREVCVUcgKCJjb3B5ICVkIGZyYW1lczogJXAsICVkIGJ5dGVzLCAlZCBjaGFubmVscyIsIG5mcmFtZXMsIHdyaXRlcHRyLAorICAgICAgICBsZW4gLyBjaGFubmVscywgY2hhbm5lbHMpOworCisgICAgLyogd2Ugd3JvdGUgb25lIHNlZ21lbnQgKi8KKyAgICBnc3RfYXVkaW9fcmluZ19idWZmZXJfYWR2YW5jZSAoYnVmLCAxKTsKKyAgfQorICByZXR1cm4gMDsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX3NpemU6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzcmMsICJuYnl0ZXMgKCVkKSAhPSBmbGVuICglZCkiLAorICAgICAgICAoZ2ludCkgKG5mcmFtZXMgKiBzaXplb2YgKHNhbXBsZV90KSksIGZsZW4pOworICAgIHJldHVybiAxOworICB9Cit9CisKKy8qIHdlIGVycm9yIG91dCAqLworc3RhdGljIGludAoramFja19zYW1wbGVfcmF0ZV9jYiAoamFja19uZnJhbWVzX3QgbmZyYW1lcywgdm9pZCAqYXJnKQoreworICBHc3RKYWNrQXVkaW9TcmMgKnNyYzsKKyAgR3N0SmFja1JpbmdCdWZmZXIgKmFidWY7CisKKyAgYWJ1ZiA9IEdTVF9KQUNLX1JJTkdfQlVGRkVSX0NBU1QgKGFyZyk7CisgIHNyYyA9IEdTVF9KQUNLX0FVRElPX1NSQyAoR1NUX09CSkVDVF9QQVJFTlQgKGFyZykpOworCisgIGlmIChhYnVmLT5zYW1wbGVfcmF0ZSAhPSAtMSAmJiBhYnVmLT5zYW1wbGVfcmF0ZSAhPSBuZnJhbWVzKQorICAgIGdvdG8gbm90X3N1cHBvcnRlZDsKKworICByZXR1cm4gMDsKKworICAvKiBFUlJPUlMgKi8KK25vdF9zdXBwb3J0ZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChOVUxMKSwgKCJKYWNrIGNoYW5nZWQgdGhlIHNhbXBsZSByYXRlLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIikpOworICAgIHJldHVybiAxOworICB9Cit9CisKKy8qIHdlIGVycm9yIG91dCAqLworc3RhdGljIGludAoramFja19idWZmZXJfc2l6ZV9jYiAoamFja19uZnJhbWVzX3QgbmZyYW1lcywgdm9pZCAqYXJnKQoreworICBHc3RKYWNrQXVkaW9TcmMgKnNyYzsKKyAgR3N0SmFja1JpbmdCdWZmZXIgKmFidWY7CisKKyAgYWJ1ZiA9IEdTVF9KQUNLX1JJTkdfQlVGRkVSX0NBU1QgKGFyZyk7CisgIHNyYyA9IEdTVF9KQUNLX0FVRElPX1NSQyAoR1NUX09CSkVDVF9QQVJFTlQgKGFyZykpOworCisgIGlmIChhYnVmLT5idWZmZXJfc2l6ZSAhPSAtMSAmJiBhYnVmLT5idWZmZXJfc2l6ZSAhPSBuZnJhbWVzKQorICAgIGdvdG8gbm90X3N1cHBvcnRlZDsKKworICByZXR1cm4gMDsKKworICAvKiBFUlJPUlMgKi8KK25vdF9zdXBwb3J0ZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChOVUxMKSwgKCJKYWNrIGNoYW5nZWQgdGhlIGJ1ZmZlciBzaXplLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIikpOworICAgIHJldHVybiAxOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitqYWNrX3NodXRkb3duX2NiICh2b2lkICphcmcpCit7CisgIEdzdEphY2tBdWRpb1NyYyAqc3JjOworCisgIHNyYyA9IEdTVF9KQUNLX0FVRElPX1NSQyAoR1NUX09CSkVDVF9QQVJFTlQgKGFyZykpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNodXRkb3duIik7CisKKyAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIE5PVF9GT1VORCwKKyAgICAgIChOVUxMKSwgKCJKYWNrIHNlcnZlciBzaHV0ZG93biIpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9qYWNrX3JpbmdfYnVmZmVyX2luaXQgKEdzdEphY2tSaW5nQnVmZmVyICogYnVmLAorICAgIEdzdEphY2tSaW5nQnVmZmVyQ2xhc3MgKiBnX2NsYXNzKQoreworICBidWYtPmNoYW5uZWxzID0gLTE7CisgIGJ1Zi0+YnVmZmVyX3NpemUgPSAtMTsKKyAgYnVmLT5zYW1wbGVfcmF0ZSA9IC0xOworfQorCisvKiB0aGUgX29wZW5fZGV2aWNlIG1ldGhvZCBzaG91bGQgbWFrZSBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgc2VydmVyCisqLworc3RhdGljIGdib29sZWFuCitnc3RfamFja19yaW5nX2J1ZmZlcl9vcGVuX2RldmljZSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RKYWNrQXVkaW9TcmMgKnNyYzsKKyAgamFja19zdGF0dXNfdCBzdGF0dXMgPSAwOworICBjb25zdCBnY2hhciAqbmFtZTsKKworICBzcmMgPSBHU1RfSkFDS19BVURJT19TUkMgKEdTVF9PQkpFQ1RfUEFSRU5UIChidWYpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJvcGVuIik7CisKKyAgaWYgKHNyYy0+Y2xpZW50X25hbWUpIHsKKyAgICBuYW1lID0gc3JjLT5jbGllbnRfbmFtZTsKKyAgfSBlbHNlIHsKKyAgICBuYW1lID0gZ19nZXRfYXBwbGljYXRpb25fbmFtZSAoKTsKKyAgfQorICBpZiAoIW5hbWUpCisgICAgbmFtZSA9ICJHU3RyZWFtZXIiOworCisgIHNyYy0+Y2xpZW50ID0gZ3N0X2phY2tfYXVkaW9fY2xpZW50X25ldyAobmFtZSwgc3JjLT5zZXJ2ZXIsCisgICAgICBzcmMtPmpjbGllbnQsCisgICAgICBHU1RfSkFDS19DTElFTlRfU09VUkNFLAorICAgICAgamFja19zaHV0ZG93bl9jYiwKKyAgICAgIGphY2tfcHJvY2Vzc19jYiwgamFja19idWZmZXJfc2l6ZV9jYiwgamFja19zYW1wbGVfcmF0ZV9jYiwgYnVmLCAmc3RhdHVzKTsKKyAgaWYgKHNyYy0+Y2xpZW50ID09IE5VTEwpCisgICAgZ290byBjb3VsZF9ub3Rfb3BlbjsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJvcGVuZWQiKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2NvdWxkX25vdF9vcGVuOgorICB7CisgICAgaWYgKHN0YXR1cyAmIChKYWNrU2VydmVyRmFpbGVkIHwgSmFja0ZhaWx1cmUpKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgTk9UX0ZPVU5ELAorICAgICAgICAgIChfKCJKYWNrIHNlcnZlciBub3QgZm91bmQiKSksCisgICAgICAgICAgKCJDYW5ub3QgY29ubmVjdCB0byB0aGUgSmFjayBzZXJ2ZXIgKHN0YXR1cyAlZCkiLCBzdGF0dXMpKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwKKyAgICAgICAgICAoTlVMTCksICgiSmFjayBjbGllbnQgb3BlbiBlcnJvciAoc3RhdHVzICVkKSIsIHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogY2xvc2UgdGhlIGNvbm5lY3Rpb24gd2l0aCB0aGUgc2VydmVyCisqLworc3RhdGljIGdib29sZWFuCitnc3RfamFja19yaW5nX2J1ZmZlcl9jbG9zZV9kZXZpY2UgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0SmFja0F1ZGlvU3JjICpzcmM7CisKKyAgc3JjID0gR1NUX0pBQ0tfQVVESU9fU1JDIChHU1RfT0JKRUNUX1BBUkVOVCAoYnVmKSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY2xvc2UiKTsKKworICBnc3RfamFja19hdWRpb19zcmNfZnJlZV9jaGFubmVscyAoc3JjKTsKKyAgZ3N0X2phY2tfYXVkaW9fY2xpZW50X2ZyZWUgKHNyYy0+Y2xpZW50KTsKKyAgc3JjLT5jbGllbnQgPSBOVUxMOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qIGFsbG9jYXRlIGEgYnVmZmVyIGFuZCBzZXR1cCByZXNvdXJjZXMgdG8gcHJvY2VzcyB0aGUgYXVkaW8gc2FtcGxlcyBvZgorICogdGhlIGZvcm1hdCBhcyBzcGVjaWZpZWQgaW4gQHNwZWMuCisgKgorICogV2UgYWxsb2NhdGUgTiBqYWNrIHBvcnRzLCBvbmUgZm9yIGVhY2ggY2hhbm5lbC4gSWYgd2UgYXJlIGFza2VkIHRvCisgKiBhdXRvbWF0aWNhbGx5IG1ha2UgYSBjb25uZWN0aW9uIHdpdGggcGh5c2ljYWwgcG9ydHMsIHdlIGNvbm5lY3QgYXMgbWFueQorICogcG9ydHMgYXMgdGhlcmUgYXJlIHBoeXNpY2FsIHBvcnRzLCBsZWF2aW5nIGxlZnRvdmVyIHBvcnRzIHVuY29ubmVjdGVkLgorICoKKyAqIEl0IGlzIGFzc3VtZWQgdGhhdCBzYW1wbGVyYXRlIGFuZCBudW1iZXIgb2YgY2hhbm5lbHMgYXJlIGFjY2VwdGFibGUgc2luY2Ugb3VyCisgKiBnZXRjYXBzIG1ldGhvZCB3aWxsIGFsd2F5cyBwcm92aWRlIGNvcnJlY3QgdmFsdWVzLiBJZiB1bmFjY2VwdGFibGUgY2FwcyBhcmUKKyAqIHJlY2VpdmVkIGZvciBzb21lIHJlYXNvbiwgd2UgZmFpbCBoZXJlLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9qYWNrX3JpbmdfYnVmZmVyX2FjcXVpcmUgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZiwKKyAgICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYykKK3sKKyAgR3N0SmFja0F1ZGlvU3JjICpzcmM7CisgIEdzdEphY2tSaW5nQnVmZmVyICphYnVmOworICBjb25zdCBjaGFyICoqcG9ydHM7CisgIGdpbnQgc2FtcGxlX3JhdGUsIGJ1ZmZlcl9zaXplOworICBnaW50IGksIGJwZiwgcmF0ZSwgY2hhbm5lbHMsIHJlczsKKyAgamFja19jbGllbnRfdCAqY2xpZW50OworCisgIHNyYyA9IEdTVF9KQUNLX0FVRElPX1NSQyAoR1NUX09CSkVDVF9QQVJFTlQgKGJ1ZikpOworICBhYnVmID0gR1NUX0pBQ0tfUklOR19CVUZGRVJfQ0FTVCAoYnVmKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJhY3F1aXJlIik7CisKKyAgY2xpZW50ID0gZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF9jbGllbnQgKHNyYy0+Y2xpZW50KTsKKworICByYXRlID0gR1NUX0FVRElPX0lORk9fUkFURSAoJnNwZWMtPmluZm8pOworCisgIC8qIHNhbXBsZSByYXRlIG11c3QgYmUgdGhhdCBvZiB0aGUgc2VydmVyICovCisgIHNhbXBsZV9yYXRlID0gamFja19nZXRfc2FtcGxlX3JhdGUgKGNsaWVudCk7CisgIGlmIChzYW1wbGVfcmF0ZSAhPSByYXRlKQorICAgIGdvdG8gd3Jvbmdfc2FtcGxlcmF0ZTsKKworICBicGYgPSBHU1RfQVVESU9fSU5GT19CUEYgKCZzcGVjLT5pbmZvKTsKKyAgY2hhbm5lbHMgPSBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJnNwZWMtPmluZm8pOworCisgIGlmICghZ3N0X2phY2tfYXVkaW9fc3JjX2FsbG9jYXRlX2NoYW5uZWxzIChzcmMsIGNoYW5uZWxzKSkKKyAgICBnb3RvIG91dF9vZl9wb3J0czsKKworICBnc3RfamFja19zZXRfbGF5b3V0IChidWYsIHNwZWMpOworCisgIGJ1ZmZlcl9zaXplID0gamFja19nZXRfYnVmZmVyX3NpemUgKGNsaWVudCk7CisKKyAgLyogdGhlIHNlZ21lbnQgc2l6ZSBpbiBieXRlcywgdGhpcyBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhIGJ1ZmZlciBvZiAzMmJpdCBmbG9hdHMKKyAgICogZm9yIGFsbCBjaGFubmVscyAgKi8KKyAgc3BlYy0+c2Vnc2l6ZSA9IGJ1ZmZlcl9zaXplICogc2l6ZW9mIChnZmxvYXQpICogY2hhbm5lbHM7CisgIHNwZWMtPmxhdGVuY3lfdGltZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoc3BlYy0+c2Vnc2l6ZSwKKyAgICAgIChHU1RfU0VDT05EIC8gR1NUX1VTRUNPTkQpLCByYXRlICogYnBmKTsKKyAgLyogc2VndG90YWwgYmFzZWQgb24gYnVmZmVyLXRpbWUgbGF0ZW5jeSAqLworICBzcGVjLT5zZWd0b3RhbCA9IHNwZWMtPmJ1ZmZlcl90aW1lIC8gc3BlYy0+bGF0ZW5jeV90aW1lOworICBpZiAoc3BlYy0+c2VndG90YWwgPCAyKSB7CisgICAgc3BlYy0+c2VndG90YWwgPSAyOworICAgIHNwZWMtPmJ1ZmZlcl90aW1lID0gc3BlYy0+bGF0ZW5jeV90aW1lICogc3BlYy0+c2VndG90YWw7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJidWZmZXIgdGltZTogJSIgR19HSU5UNjRfRk9STUFUICIgdXNlYyIsCisgICAgICBzcGVjLT5idWZmZXJfdGltZSk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImxhdGVuY3kgdGltZTogJSIgR19HSU5UNjRfRk9STUFUICIgdXNlYyIsCisgICAgICBzcGVjLT5sYXRlbmN5X3RpbWUpOworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJidWZmZXJfc2l6ZSAlZCwgc2Vnc2l6ZSAlZCwgc2VndG90YWwgJWQiLAorICAgICAgYnVmZmVyX3NpemUsIHNwZWMtPnNlZ3NpemUsIHNwZWMtPnNlZ3RvdGFsKTsKKworICAvKiBhbGxvY2F0ZSB0aGUgcmluZ2J1ZmZlciBtZW1vcnkgbm93ICovCisgIGJ1Zi0+c2l6ZSA9IHNwZWMtPnNlZ3RvdGFsICogc3BlYy0+c2Vnc2l6ZTsKKyAgYnVmLT5tZW1vcnkgPSBnX21hbGxvYzAgKGJ1Zi0+c2l6ZSk7CisKKyAgaWYgKChyZXMgPSBnc3RfamFja19hdWRpb19jbGllbnRfc2V0X2FjdGl2ZSAoc3JjLT5jbGllbnQsIFRSVUUpKSkKKyAgICBnb3RvIGNvdWxkX25vdF9hY3RpdmF0ZTsKKworICAvKiBpZiB3ZSBuZWVkIHRvIGF1dG9tYXRpY2FsbHkgY29ubmVjdCB0aGUgcG9ydHMsIGRvIHNvIG5vdy4gV2UgbXVzdCBkbyB0aGlzCisgICAqIGFmdGVyIGFjdGl2YXRpbmcgdGhlIGNsaWVudC4gKi8KKyAgaWYgKHNyYy0+Y29ubmVjdCA9PSBHU1RfSkFDS19DT05ORUNUX0FVVE8KKyAgICAgIHx8IHNyYy0+Y29ubmVjdCA9PSBHU1RfSkFDS19DT05ORUNUX0FVVE9fRk9SQ0VEKSB7CisgICAgLyogZmluZCBhbGwgdGhlIHBoeXNpY2FsIG91dHB1dCBwb3J0cy4gQSBwaHlzaWNhbCBvdXRwdXQgcG9ydCBpcyBhIHBvcnQKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggYSBoYXJkd2FyZSBkZXZpY2UuIFNvbWVvbmUgbmVlZHMgY29ubmVjdCB0byBhIHBoeXNpY2FsCisgICAgICogcG9ydCBpbiBvcmRlciB0byBjYXB0dXJlIHNvbWV0aGluZy4gKi8KKworICAgIGlmIChzcmMtPnBvcnRfcGF0dGVybiA9PSBOVUxMKSB7CisgICAgICBwb3J0cyA9IGphY2tfZ2V0X3BvcnRzIChjbGllbnQsIE5VTEwsIE5VTEwsCisgICAgICAgICAgSmFja1BvcnRJc1BoeXNpY2FsIHwgSmFja1BvcnRJc091dHB1dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBvcnRzID0gamFja19nZXRfcG9ydHMgKGNsaWVudCwgc3JjLT5wb3J0X3BhdHRlcm4sIE5VTEwsCisgICAgICAgICAgSmFja1BvcnRJc091dHB1dCk7CisgICAgfQorCisgICAgaWYgKHBvcnRzID09IE5VTEwpIHsKKyAgICAgIC8qIG5vIHBvcnRzPyBmaW5lIHRoZW4gd2UgZG9uJ3QgZG8gYW55dGhpbmcgZXhjZXB0IGZvciBwb3N0aW5nIGEgd2FybmluZworICAgICAgICogbWVzc2FnZS4gKi8KKyAgICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNyYywgUkVTT1VSQ0UsIE5PVF9GT1VORCwgKE5VTEwpLAorICAgICAgICAgICgiTm8gcGh5c2ljYWwgb3V0cHV0IHBvcnRzIGZvdW5kLCBsZWF2aW5nIHBvcnRzIHVuY29ubmVjdGVkIikpOworICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CisgICAgICAvKiBzdG9wIHdoZW4gYWxsIG91dHB1dCBwb3J0cyBhcmUgZXhoYXVzdGVkICovCisgICAgICBpZiAocG9ydHNbaV0gPT0gTlVMTCkgeworICAgICAgICAvKiBwb3N0IGEgd2FybmluZyB0aGF0IHdlIGNvdWxkIG5vdCBjb25uZWN0IGFsbCBwb3J0cyAqLworICAgICAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChzcmMsIFJFU09VUkNFLCBOT1RfRk9VTkQsIChOVUxMKSwKKyAgICAgICAgICAgICgiTm8gbW9yZSBwaHlzaWNhbCBwb3J0cywgbGVhdmluZyBzb21lIHBvcnRzIHVuY29ubmVjdGVkIikpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInRyeSBjb25uZWN0aW5nIHRvICVzIiwKKyAgICAgICAgICBqYWNrX3BvcnRfbmFtZSAoc3JjLT5wb3J0c1tpXSkpOworCisgICAgICAvKiBjb25uZWN0IHRoZSBwaHlzaWNhbCBwb3J0IHRvIGEgcG9ydCAqLworICAgICAgcmVzID0gamFja19jb25uZWN0IChjbGllbnQsIHBvcnRzW2ldLCBqYWNrX3BvcnRfbmFtZSAoc3JjLT5wb3J0c1tpXSkpOworICAgICAgaWYgKHJlcyAhPSAwICYmIHJlcyAhPSBFRVhJU1QpCisgICAgICAgIGdvdG8gY2Fubm90X2Nvbm5lY3Q7CisgICAgfQorICAgIGZyZWUgKHBvcnRzKTsKKyAgfQorZG9uZToKKworICBhYnVmLT5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOworICBhYnVmLT5idWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplOworICBhYnVmLT5jaGFubmVscyA9IGNoYW5uZWxzOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLword3Jvbmdfc2FtcGxlcmF0ZToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAoIldyb25nIHNhbXBsZXJhdGUsIHNlcnZlciBpcyBydW5uaW5nIGF0ICVkIGFuZCB3ZSByZWNlaXZlZCAlZCIsCisgICAgICAgICAgICBzYW1wbGVfcmF0ZSwgcmF0ZSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorb3V0X29mX3BvcnRzOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgiQ2Fubm90IGFsbG9jYXRlIG1vcmUgSmFjayBwb3J0cyIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2NvdWxkX25vdF9hY3RpdmF0ZToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAoIkNvdWxkIG5vdCBhY3RpdmF0ZSBjbGllbnQgKCVkOiVzKSIsIHJlcywgZ19zdHJlcnJvciAocmVzKSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorY2Fubm90X2Nvbm5lY3Q6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJDb3VsZCBub3QgY29ubmVjdCBpbnB1dCBwb3J0cyB0byBwaHlzaWNhbCBwb3J0cyAoJWQ6JXMpIiwKKyAgICAgICAgICAgIHJlcywgZ19zdHJlcnJvciAocmVzKSkpOworICAgIGZyZWUgKHBvcnRzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggTE9DSyAqLworc3RhdGljIGdib29sZWFuCitnc3RfamFja19yaW5nX2J1ZmZlcl9yZWxlYXNlIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpCit7CisgIEdzdEphY2tBdWRpb1NyYyAqc3JjOworICBHc3RKYWNrUmluZ0J1ZmZlciAqYWJ1ZjsKKyAgZ2ludCByZXM7CisKKyAgYWJ1ZiA9IEdTVF9KQUNLX1JJTkdfQlVGRkVSX0NBU1QgKGJ1Zik7CisgIHNyYyA9IEdTVF9KQUNLX0FVRElPX1NSQyAoR1NUX09CSkVDVF9QQVJFTlQgKGJ1ZikpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInJlbGVhc2UiKTsKKworICBpZiAoKHJlcyA9IGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9zZXRfYWN0aXZlIChzcmMtPmNsaWVudCwgRkFMU0UpKSkgeworICAgIC8qIHdlIG9ubHkgd2FybiwgdGhpcyBtZWFucyB0aGUgc2VydmVyIGlzIHByb2JhYmx5IHNodXQgZG93biBhbmQgdGhlIGNsaWVudAorICAgICAqIGlzIGdvbmUgYW55d2F5LiAqLworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNyYywgUkVTT1VSQ0UsIENMT1NFLCAoTlVMTCksCisgICAgICAgICgiQ291bGQgbm90IGRlYWN0aXZhdGUgSmFjayBjbGllbnQgKCVkKSIsIHJlcykpOworICB9CisKKyAgYWJ1Zi0+Y2hhbm5lbHMgPSAtMTsKKyAgYWJ1Zi0+YnVmZmVyX3NpemUgPSAtMTsKKyAgYWJ1Zi0+c2FtcGxlX3JhdGUgPSAtMTsKKworICAvKiBmcmVlIHRoZSBidWZmZXIgKi8KKyAgZ19mcmVlIChidWYtPm1lbW9yeSk7CisgIGJ1Zi0+bWVtb3J5ID0gTlVMTDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfamFja19yaW5nX2J1ZmZlcl9zdGFydCAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RKYWNrQXVkaW9TcmMgKnNyYzsKKworICBzcmMgPSBHU1RfSkFDS19BVURJT19TUkMgKEdTVF9PQkpFQ1RfUEFSRU5UIChidWYpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzdGFydCIpOworCisgIGlmIChzcmMtPnRyYW5zcG9ydCAmIEdTVF9KQUNLX1RSQU5TUE9SVF9NQVNURVIpIHsKKyAgICBqYWNrX2NsaWVudF90ICpjbGllbnQ7CisKKyAgICBjbGllbnQgPSBnc3RfamFja19hdWRpb19jbGllbnRfZ2V0X2NsaWVudCAoc3JjLT5jbGllbnQpOworICAgIGphY2tfdHJhbnNwb3J0X3N0YXJ0IChjbGllbnQpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2phY2tfcmluZ19idWZmZXJfcGF1c2UgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0SmFja0F1ZGlvU3JjICpzcmM7CisKKyAgc3JjID0gR1NUX0pBQ0tfQVVESU9fU1JDIChHU1RfT0JKRUNUX1BBUkVOVCAoYnVmKSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicGF1c2UiKTsKKworICBpZiAoc3JjLT50cmFuc3BvcnQgJiBHU1RfSkFDS19UUkFOU1BPUlRfTUFTVEVSKSB7CisgICAgamFja19jbGllbnRfdCAqY2xpZW50OworCisgICAgY2xpZW50ID0gZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF9jbGllbnQgKHNyYy0+Y2xpZW50KTsKKyAgICBqYWNrX3RyYW5zcG9ydF9zdG9wIChjbGllbnQpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2phY2tfcmluZ19idWZmZXJfc3RvcCAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RKYWNrQXVkaW9TcmMgKnNyYzsKKworICBzcmMgPSBHU1RfSkFDS19BVURJT19TUkMgKEdTVF9PQkpFQ1RfUEFSRU5UIChidWYpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzdG9wIik7CisKKyAgaWYgKHNyYy0+dHJhbnNwb3J0ICYgR1NUX0pBQ0tfVFJBTlNQT1JUX01BU1RFUikgeworICAgIGphY2tfY2xpZW50X3QgKmNsaWVudDsKKworICAgIGNsaWVudCA9IGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9nZXRfY2xpZW50IChzcmMtPmNsaWVudCk7CisgICAgamFja190cmFuc3BvcnRfc3RvcCAoY2xpZW50KTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisjaWYgZGVmaW5lZCAoSEFWRV9KQUNLXzBfMTIwXzEpIHx8IGRlZmluZWQoSEFWRV9KQUNLXzFfOV83KQorc3RhdGljIGd1aW50Citnc3RfamFja19yaW5nX2J1ZmZlcl9kZWxheSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RKYWNrQXVkaW9TcmMgKnNyYzsKKyAgZ3VpbnQgaSwgcmVzID0gMDsKKyAgamFja19sYXRlbmN5X3JhbmdlX3QgcmFuZ2U7CisKKyAgc3JjID0gR1NUX0pBQ0tfQVVESU9fU1JDIChHU1RfT0JKRUNUX1BBUkVOVCAoYnVmKSk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNyYy0+cG9ydF9jb3VudDsgaSsrKSB7CisgICAgamFja19wb3J0X2dldF9sYXRlbmN5X3JhbmdlIChzcmMtPnBvcnRzW2ldLCBKYWNrQ2FwdHVyZUxhdGVuY3ksICZyYW5nZSk7CisgICAgaWYgKHJhbmdlLm1heCA+IHJlcykKKyAgICAgIHJlcyA9IHJhbmdlLm1heDsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImRlbGF5ICV1IiwgcmVzKTsKKworICByZXR1cm4gcmVzOworfQorI2Vsc2UgLyogIShkZWZpbmVkIChIQVZFX0pBQ0tfMF8xMjBfMSkgfHwgZGVmaW5lZChIQVZFX0pBQ0tfMV85XzcpKSAqLworc3RhdGljIGd1aW50Citnc3RfamFja19yaW5nX2J1ZmZlcl9kZWxheSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RKYWNrQXVkaW9TcmMgKnNyYzsKKyAgZ3VpbnQgaSwgcmVzID0gMDsKKyAgZ3VpbnQgbGF0ZW5jeTsKKyAgamFja19jbGllbnRfdCAqY2xpZW50OworCisgIHNyYyA9IEdTVF9KQUNLX0FVRElPX1NSQyAoR1NUX09CSkVDVF9QQVJFTlQgKGJ1ZikpOworCisgIGNsaWVudCA9IGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9nZXRfY2xpZW50IChzcmMtPmNsaWVudCk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNyYy0+cG9ydF9jb3VudDsgaSsrKSB7CisgICAgbGF0ZW5jeSA9IGphY2tfcG9ydF9nZXRfdG90YWxfbGF0ZW5jeSAoY2xpZW50LCBzcmMtPnBvcnRzW2ldKTsKKyAgICBpZiAobGF0ZW5jeSA+IHJlcykKKyAgICAgIHJlcyA9IGxhdGVuY3k7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJkZWxheSAldSIsIHJlcyk7CisKKyAgcmV0dXJuIHJlczsKK30KKyNlbmRpZgorCisvKiBBdWRpb3NyYyBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKKyNkZWZpbmUgREVGQVVMVF9QUk9QX0NPTk5FQ1QgCQlHU1RfSkFDS19DT05ORUNUX0FVVE8KKyNkZWZpbmUgREVGQVVMVF9QUk9QX1NFUlZFUiAJCU5VTEwKKyNkZWZpbmUgREVGQVVMVF9QUk9QX0NMSUVOVF9OQU1FCU5VTEwKKyNkZWZpbmUgREVGQVVMVF9QUk9QX1RSQU5TUE9SVAlHU1RfSkFDS19UUkFOU1BPUlRfQVVUT05PTU9VUworI2RlZmluZSBERUZBVUxUX1BST1BfUE9SVF9QQVRURVJOICAgICAJTlVMTAorZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQ09OTkVDVCwKKyAgUFJPUF9TRVJWRVIsCisgIFBST1BfQ0xJRU5ULAorICBQUk9QX0NMSUVOVF9OQU1FLAorICBQUk9QX1BPUlRfUEFUVEVSTiwKKyAgUFJPUF9UUkFOU1BPUlQsCisgIFBST1BfTEFTVAorfTsKKworLyogdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgaW5wdXRzIGFuZCBvdXRwdXRzLgorICoKKyAqIGRlc2NyaWJlIHRoZSByZWFsIGZvcm1hdHMgaGVyZS4KKyAqLworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0pBQ0tfRk9STUFUX1NUUiAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIgImNoYW5uZWxzID0gKGludCkgWyAxLCBNQVggXSIpCisgICAgKTsKKworI2RlZmluZSBnc3RfamFja19hdWRpb19zcmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0SmFja0F1ZGlvU3JjLCBnc3RfamFja19hdWRpb19zcmMsIEdTVF9UWVBFX0FVRElPX0JBU0VfU1JDKTsKKworc3RhdGljIHZvaWQgZ3N0X2phY2tfYXVkaW9fc3JjX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X2phY2tfYXVkaW9fc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9qYWNrX2F1ZGlvX3NyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBHc3RDYXBzICpnc3RfamFja19hdWRpb19zcmNfZ2V0Y2FwcyAoR3N0QmFzZVNyYyAqIGJzcmMsCisgICAgR3N0Q2FwcyAqIGZpbHRlcik7CitzdGF0aWMgR3N0QXVkaW9SaW5nQnVmZmVyICpnc3RfamFja19hdWRpb19zcmNfY3JlYXRlX3JpbmdidWZmZXIgKEdzdEF1ZGlvQmFzZVNyYworICAgICogc3JjKTsKKworLyogR09iamVjdCB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCisvKiBpbml0aWFsaXplIHRoZSBqYWNrX2F1ZGlvX3NyYydzIGNsYXNzICovCitzdGF0aWMgdm9pZAorZ3N0X2phY2tfYXVkaW9fc3JjX2NsYXNzX2luaXQgKEdzdEphY2tBdWRpb1NyY0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RCYXNlU3JjQ2xhc3MgKmdzdGJhc2VzcmNfY2xhc3M7CisgIEdzdEF1ZGlvQmFzZVNyY0NsYXNzICpnc3RhdWRpb2Jhc2VzcmNfY2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9qYWNrX2F1ZGlvX3NyY19kZWJ1ZywgImphY2tzcmMiLCAwLAorICAgICAgImphY2tzcmMgZWxlbWVudCIpOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YmFzZXNyY19jbGFzcyA9IChHc3RCYXNlU3JjQ2xhc3MgKikga2xhc3M7CisgIGdzdGF1ZGlvYmFzZXNyY19jbGFzcyA9IChHc3RBdWRpb0Jhc2VTcmNDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X2phY2tfYXVkaW9fc3JjX2Rpc3Bvc2U7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9qYWNrX2F1ZGlvX3NyY19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9qYWNrX2F1ZGlvX3NyY19nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DT05ORUNULAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJjb25uZWN0IiwgIkNvbm5lY3QiLAorICAgICAgICAgICJTcGVjaWZ5IGhvdyB0aGUgaW5wdXQgcG9ydHMgd2lsbCBiZSBjb25uZWN0ZWQiLAorICAgICAgICAgIEdTVF9UWVBFX0pBQ0tfQ09OTkVDVCwgREVGQVVMVF9QUk9QX0NPTk5FQ1QsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TRVJWRVIsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgic2VydmVyIiwgIlNlcnZlciIsCisgICAgICAgICAgIlRoZSBKYWNrIHNlcnZlciB0byBjb25uZWN0IHRvIChOVUxMID0gZGVmYXVsdCkiLAorICAgICAgICAgIERFRkFVTFRfUFJPUF9TRVJWRVIsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RKYWNrQXVkaW9TcmM6Y2xpZW50LW5hbWU6CisgICAqCisgICAqIFRoZSBjbGllbnQgbmFtZSB0byB1c2UuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NMSUVOVF9OQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImNsaWVudC1uYW1lIiwgIkNsaWVudCBuYW1lIiwKKyAgICAgICAgICAiVGhlIGNsaWVudCBuYW1lIG9mIHRoZSBKYWNrIGluc3RhbmNlIChOVUxMID0gZGVmYXVsdCkiLAorICAgICAgICAgIERFRkFVTFRfUFJPUF9DTElFTlRfTkFNRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NMSUVOVCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoImNsaWVudCIsICJKYWNrQ2xpZW50IiwgIkhhbmRsZSBmb3IgamFjayBjbGllbnQiLAorICAgICAgICAgIEdTVF9UWVBFX0pBQ0tfQ0xJRU5ULAorICAgICAgICAgIEdTVF9QQVJBTV9NVVRBQkxFX1JFQURZIHwgR19QQVJBTV9SRUFEV1JJVEUgfAorICAgICAgICAgIEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgIC8qKgorICAgICogR3N0SmFja0F1ZGlvU3JjOnBvcnQtcGF0dGVybgorICAgICoKKyAgICAqIGF1dG9jb25uZWN0IHRvIHBvcnRzIG1hdGNoaW5nIHBhdHRlcm4sIHdoZW4gTlVMTCBjb25uZWN0IHRvIHBoeXNpY2FsIHBvcnRzCisgICAgKgorICAgICogU2luY2U6IDEuNgorICAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUE9SVF9QQVRURVJOLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInBvcnQtcGF0dGVybiIsICJwb3J0IHBhdHRlcm4iLAorICAgICAgICAgICJBIHBhdHRlcm4gdG8gc2VsZWN0IHdoaWNoIHBvcnRzIHRvIGNvbm5lY3QgdG8gKE5VTEwgPSBmaXJzdCBwaHlzaWNhbCBwb3J0cykiLAorICAgICAgICAgIERFRkFVTFRfUFJPUF9QT1JUX1BBVFRFUk4sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdEphY2tBdWRpb1Npbms6dHJhbnNwb3J0OgorICAgKgorICAgKiBUaGUgamFjayB0cmFuc3BvcnQgYmVoYXZpb3VyIGZvciB0aGUgY2xpZW50LgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UUkFOU1BPUlQsCisgICAgICBnX3BhcmFtX3NwZWNfZmxhZ3MgKCJ0cmFuc3BvcnQiLCAiVHJhbnNwb3J0IG1vZGUiLAorICAgICAgICAgICJKYWNrIHRyYW5zcG9ydCBiZWhhdmlvdXIgb2YgdGhlIGNsaWVudCIsCisgICAgICAgICAgR1NUX1RZUEVfSkFDS19UUkFOU1BPUlQsIERFRkFVTFRfUFJPUF9UUkFOU1BPUlQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfZmFjdG9yeSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJBdWRpbyBTb3VyY2UgKEphY2spIiwgIlNvdXJjZS9BdWRpbyIsCisgICAgICAiQ2FwdHVyZXMgYXVkaW8gZnJvbSBhIEpBQ0sgc2VydmVyIiwKKyAgICAgICJUcmlzdGFuIE1hdHRoZXdzIDx0cmlzdGFuQHNhdC5xYy5jYT4iKTsKKworICBnc3RiYXNlc3JjX2NsYXNzLT5nZXRfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfamFja19hdWRpb19zcmNfZ2V0Y2Fwcyk7CisgIGdzdGF1ZGlvYmFzZXNyY19jbGFzcy0+Y3JlYXRlX3JpbmdidWZmZXIgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9qYWNrX2F1ZGlvX3NyY19jcmVhdGVfcmluZ2J1ZmZlcik7CisKKyAgLyogcmVmIGNsYXNzIGZyb20gYSB0aHJlYWQtc2FmZSBjb250ZXh0IHRvIHdvcmsgYXJvdW5kIG1pc3NpbmcgYml0IG9mCisgICAqIHRocmVhZC1zYWZldHkgaW4gR09iamVjdCAqLworICBnX3R5cGVfY2xhc3NfcmVmIChHU1RfVFlQRV9KQUNLX1JJTkdfQlVGRkVSKTsKKworICBnc3RfamFja19hdWRpb19jbGllbnRfaW5pdCAoKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9qYWNrX2F1ZGlvX3NyY19pbml0IChHc3RKYWNrQXVkaW9TcmMgKiBzcmMpCit7CisgIC8vZ3N0X2Jhc2Vfc3JjX3NldF9saXZlKEdTVF9CQVNFX1NSQyAoc3JjKSwgVFJVRSk7CisgIHNyYy0+Y29ubmVjdCA9IERFRkFVTFRfUFJPUF9DT05ORUNUOworICBzcmMtPnNlcnZlciA9IGdfc3RyZHVwIChERUZBVUxUX1BST1BfU0VSVkVSKTsKKyAgc3JjLT5qY2xpZW50ID0gTlVMTDsKKyAgc3JjLT5wb3J0cyA9IE5VTEw7CisgIHNyYy0+cG9ydF9jb3VudCA9IDA7CisgIHNyYy0+YnVmZmVycyA9IE5VTEw7CisgIHNyYy0+Y2xpZW50X25hbWUgPSBnX3N0cmR1cCAoREVGQVVMVF9QUk9QX0NMSUVOVF9OQU1FKTsKKyAgc3JjLT50cmFuc3BvcnQgPSBERUZBVUxUX1BST1BfVFJBTlNQT1JUOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2phY2tfYXVkaW9fc3JjX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEphY2tBdWRpb1NyYyAqc3JjID0gR1NUX0pBQ0tfQVVESU9fU1JDIChvYmplY3QpOworCisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzcmMtPmNhcHMsIE5VTEwpOworCisgIGlmIChzcmMtPmNsaWVudF9uYW1lICE9IE5VTEwpIHsKKyAgICBnX2ZyZWUgKHNyYy0+Y2xpZW50X25hbWUpOworICAgIHNyYy0+Y2xpZW50X25hbWUgPSBOVUxMOworICB9CisKKyAgaWYgKHNyYy0+cG9ydF9wYXR0ZXJuICE9IE5VTEwpIHsKKyAgICBnX2ZyZWUgKHNyYy0+cG9ydF9wYXR0ZXJuKTsKKyAgICBzcmMtPnBvcnRfcGF0dGVybiA9IE5VTEw7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9qYWNrX2F1ZGlvX3NyY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0SmFja0F1ZGlvU3JjICpzcmMgPSBHU1RfSkFDS19BVURJT19TUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0NMSUVOVF9OQU1FOgorICAgICAgZ19mcmVlIChzcmMtPmNsaWVudF9uYW1lKTsKKyAgICAgIHNyYy0+Y2xpZW50X25hbWUgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QT1JUX1BBVFRFUk46CisgICAgICBnX2ZyZWUgKHNyYy0+cG9ydF9wYXR0ZXJuKTsKKyAgICAgIHNyYy0+cG9ydF9wYXR0ZXJuID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ09OTkVDVDoKKyAgICAgIHNyYy0+Y29ubmVjdCA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TRVJWRVI6CisgICAgICBnX2ZyZWUgKHNyYy0+c2VydmVyKTsKKyAgICAgIHNyYy0+c2VydmVyID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0xJRU5UOgorICAgICAgaWYgKEdTVF9TVEFURSAoc3JjKSA9PSBHU1RfU1RBVEVfTlVMTCB8fAorICAgICAgICAgIEdTVF9TVEFURSAoc3JjKSA9PSBHU1RfU1RBVEVfUkVBRFkpIHsKKyAgICAgICAgc3JjLT5qY2xpZW50ID0gZ192YWx1ZV9nZXRfYm94ZWQgKHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UUkFOU1BPUlQ6CisgICAgICBzcmMtPnRyYW5zcG9ydCA9IGdfdmFsdWVfZ2V0X2ZsYWdzICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfamFja19hdWRpb19zcmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEphY2tBdWRpb1NyYyAqc3JjID0gR1NUX0pBQ0tfQVVESU9fU1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DTElFTlRfTkFNRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNyYy0+Y2xpZW50X25hbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BPUlRfUEFUVEVSTjoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNyYy0+cG9ydF9wYXR0ZXJuKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT05ORUNUOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHNyYy0+Y29ubmVjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0VSVkVSOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc3JjLT5zZXJ2ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NMSUVOVDoKKyAgICAgIGdfdmFsdWVfc2V0X2JveGVkICh2YWx1ZSwgc3JjLT5qY2xpZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UUkFOU1BPUlQ6CisgICAgICBnX3ZhbHVlX3NldF9mbGFncyAodmFsdWUsIHNyYy0+dHJhbnNwb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X2phY2tfYXVkaW9fc3JjX2dldGNhcHMgKEdzdEJhc2VTcmMgKiBic3JjLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RKYWNrQXVkaW9TcmMgKnNyYyA9IEdTVF9KQUNLX0FVRElPX1NSQyAoYnNyYyk7CisgIGNvbnN0IGNoYXIgKipwb3J0czsKKyAgZ2ludCBtaW4sIG1heDsKKyAgZ2ludCByYXRlOworICBqYWNrX2NsaWVudF90ICpjbGllbnQ7CisKKyAgaWYgKHNyYy0+Y2xpZW50ID09IE5VTEwpCisgICAgZ290byBub19jbGllbnQ7CisKKyAgY2xpZW50ID0gZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF9jbGllbnQgKHNyYy0+Y2xpZW50KTsKKworICBpZiAoc3JjLT5jb25uZWN0ID09IEdTVF9KQUNLX0NPTk5FQ1RfQVVUTykgeworICAgIC8qIGdldCBhIHBvcnQgY291bnQsIHRoaXMgaXMgdGhlIG51bWJlciBvZiBjaGFubmVscyB3ZSBjYW4gYXV0b21hdGljYWxseQorICAgICAqIGNvbm5lY3QuICovCisgICAgcG9ydHMgPSBqYWNrX2dldF9wb3J0cyAoY2xpZW50LCBOVUxMLCBOVUxMLAorICAgICAgICBKYWNrUG9ydElzUGh5c2ljYWwgfCBKYWNrUG9ydElzT3V0cHV0KTsKKyAgICBtYXggPSAwOworICAgIGlmIChwb3J0cyAhPSBOVUxMKSB7CisgICAgICBmb3IgKDsgcG9ydHNbbWF4XTsgbWF4KyspOworCisgICAgICBmcmVlIChwb3J0cyk7CisgICAgfSBlbHNlCisgICAgICBtYXggPSAwOworICB9IGVsc2UgeworICAgIC8qIHdlIGFsbG93IGFueSBudW1iZXIgb2YgcGFkcywgc29tZXRoaW5nIGVsc2UgaXMgZ29pbmcgdG8gY29ubmVjdCB0aGUKKyAgICAgKiBwYWRzLiAqLworICAgIG1heCA9IEdfTUFYSU5UOworICB9CisgIG1pbiA9IE1JTiAoMSwgbWF4KTsKKworICByYXRlID0gamFja19nZXRfc2FtcGxlX3JhdGUgKGNsaWVudCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZ290ICVkLSVkIHBvcnRzLCBzYW1wbGVyYXRlOiAlZCIsIG1pbiwgbWF4LCByYXRlKTsKKworICBpZiAoIXNyYy0+Y2FwcykgeworICAgIHNyYy0+Y2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsCisgICAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCBHU1RfSkFDS19GT1JNQVRfU1RSLAorICAgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImludGVybGVhdmVkIiwKKyAgICAgICAgInJhdGUiLCBHX1RZUEVfSU5ULCByYXRlLAorICAgICAgICAiY2hhbm5lbHMiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIG1pbiwgbWF4LCBOVUxMKTsKKyAgfQorICBHU1RfSU5GT19PQkpFQ1QgKHNyYywgInJldHVybmluZyBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBzcmMtPmNhcHMpOworCisgIHJldHVybiBnc3RfY2Fwc19yZWYgKHNyYy0+Y2Fwcyk7CisKKyAgLyogRVJST1JTICovCitub19jbGllbnQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJkZXZpY2Ugbm90IG9wZW4sIHVzaW5nIHRlbXBsYXRlIGNhcHMiKTsKKyAgICAvKiBiYXNlIGNsYXNzIHdpbGwgZ2V0IHRlbXBsYXRlIGNhcHMgZm9yIHVzIHdoZW4gd2UgcmV0dXJuIE5VTEwgKi8KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgR3N0QXVkaW9SaW5nQnVmZmVyICoKK2dzdF9qYWNrX2F1ZGlvX3NyY19jcmVhdGVfcmluZ2J1ZmZlciAoR3N0QXVkaW9CYXNlU3JjICogc3JjKQoreworICBHc3RBdWRpb1JpbmdCdWZmZXIgKmJ1ZmZlcjsKKworICBidWZmZXIgPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX0pBQ0tfUklOR19CVUZGRVIsIE5VTEwpOworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjcmVhdGVkIHJpbmdidWZmZXIgQCVwIiwgYnVmZmVyKTsKKworICByZXR1cm4gYnVmZmVyOworfQpkaWZmIC0tZ2l0IGEvZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmggYi9leHQvamFjay9nc3RqYWNrYXVkaW9zcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2ZmZTNmCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRyaXN0YW4gTWF0dGhld3MgPHRyaXN0YW5Ac2F0LnFjLmNhPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xICh0aGUgIkxHUEwiKSwgaW4KKyAqIHdoaWNoIGNhc2UgdGhlIGZvbGxvd2luZyBwcm92aXNpb25zIGFwcGx5IGluc3RlYWQgb2YgdGhlIG9uZXMKKyAqIG1lbnRpb25lZCBhYm92ZToKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0pBQ0tfQVVESU9fU1JDX0hfXworI2RlZmluZSBfX0dTVF9KQUNLX0FVRElPX1NSQ19IX18KKworI2luY2x1ZGUgPGphY2svamFjay5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb3NyYy5oPgorCisjaW5jbHVkZSAiZ3N0amFja2F1ZGlvY2xpZW50LmgiCisjaW5jbHVkZSAiZ3N0amFjay5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfSkFDS19BVURJT19TUkMgICAgICAgICAgICAgKGdzdF9qYWNrX2F1ZGlvX3NyY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfSkFDS19BVURJT19TUkMob2JqKSAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfSkFDS19BVURJT19TUkMsR3N0SmFja0F1ZGlvU3JjKSkKKyNkZWZpbmUgR1NUX0pBQ0tfQVVESU9fU1JDX0NMQVNTKGtsYXNzKSAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfSkFDS19BVURJT19TUkMsR3N0SmFja0F1ZGlvU3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSkFDS19BVURJT19TUkNfR0VUX0NMQVNTKG9iaikgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksR1NUX1RZUEVfSkFDS19BVURJT19TUkMsR3N0SmFja0F1ZGlvU3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfSkFDS19BVURJT19TUkMob2JqKSAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfSkFDS19BVURJT19TUkMpKQorI2RlZmluZSBHU1RfSVNfSkFDS19BVURJT19TUkNfQ0xBU1Moa2xhc3MpICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9KQUNLX0FVRElPX1NSQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RKYWNrQXVkaW9TcmMgR3N0SmFja0F1ZGlvU3JjOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEphY2tBdWRpb1NyY0NsYXNzIEdzdEphY2tBdWRpb1NyY0NsYXNzOworCitzdHJ1Y3QgX0dzdEphY2tBdWRpb1NyYworeworICAgIEdzdEF1ZGlvQmFzZVNyYyBzcmM7CisKKyAgICAvKjwgcHJpdmF0ZSA+Ki8KKyAgICAvKiBjYWNoZWQgY2FwcyAqLworICAgIEdzdENhcHMgICAgICAgICAqY2FwczsKKworICAgIC8qIHByb3BlcnRpZXMgKi8KKyAgICBHc3RKYWNrQ29ubmVjdCAgIGNvbm5lY3Q7CisgICAgZ2NoYXIgICAgICAgICAgICpzZXJ2ZXI7CisgICAgamFja19jbGllbnRfdCAgICpqY2xpZW50OworICAgIGdjaGFyICAgICAgICAgICAqY2xpZW50X25hbWU7CisgICAgZ2NoYXIgICAgICAgICAgICpwb3J0X3BhdHRlcm47CisgICAgZ3VpbnQgICAgICAgICAgICB0cmFuc3BvcnQ7CisKKyAgICAvKiBvdXIgY2xpZW50ICovCisgICAgR3N0SmFja0F1ZGlvQ2xpZW50ICpjbGllbnQ7CisKKyAgICAvKiBvdXIgcG9ydHMgKi8KKyAgICBqYWNrX3BvcnRfdCAgICAqKnBvcnRzOworICAgIGludCBwb3J0X2NvdW50OworICAgIHNhbXBsZV90ICoqYnVmZmVyczsKK307CisKK3N0cnVjdCBfR3N0SmFja0F1ZGlvU3JjQ2xhc3MKK3sKKyAgICBHc3RBdWRpb0Jhc2VTcmNDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfamFja19hdWRpb19zcmNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfSkFDS19BVURJT19TUkNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvamFjay9nc3RqYWNrcmluZ2J1ZmZlci5oIGIvZXh0L2phY2svZ3N0amFja3JpbmdidWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGRlNGI4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2phY2svZ3N0amFja3JpbmdidWZmZXIuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBUcmlzdGFuIE1hdHRoZXdzIDx0cmlzdGFuQHNhdC5xYy5jYT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSAodGhlICJMR1BMIiksIGluCisgKiB3aGljaCBjYXNlIHRoZSBmb2xsb3dpbmcgcHJvdmlzaW9ucyBhcHBseSBpbnN0ZWFkIG9mIHRoZSBvbmVzCisgKiBtZW50aW9uZWQgYWJvdmU6CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9KQUNLX1JJTkdfQlVGRkVSX0hfXworI2RlZmluZSBfX0dTVF9KQUNLX1JJTkdfQlVGRkVSX0hfXworCisjZGVmaW5lIEdTVF9UWVBFX0pBQ0tfUklOR19CVUZGRVIgICAgICAgICAgICAgICAoZ3N0X2phY2tfcmluZ19idWZmZXJfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0pBQ0tfUklOR19CVUZGRVIob2JqKSAgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9KQUNLX1JJTkdfQlVGRkVSLEdzdEphY2tSaW5nQnVmZmVyKSkKKyNkZWZpbmUgR1NUX0pBQ0tfUklOR19CVUZGRVJfQ0xBU1Moa2xhc3MpICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0pBQ0tfUklOR19CVUZGRVIsR3N0SmFja1JpbmdCdWZmZXJDbGFzcykpCisjZGVmaW5lIEdTVF9KQUNLX1JJTkdfQlVGRkVSX0dFVF9DTEFTUyhvYmopICAgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIEdTVF9UWVBFX0pBQ0tfUklOR19CVUZGRVIsR3N0SmFja1JpbmdCdWZmZXJDbGFzcykpCisjZGVmaW5lIEdTVF9KQUNLX1JJTkdfQlVGRkVSX0NBU1Qob2JqKSAgICAgICAgICAoKEdzdEphY2tSaW5nQnVmZmVyICopb2JqKQorI2RlZmluZSBHU1RfSVNfSkFDS19SSU5HX0JVRkZFUihvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0pBQ0tfUklOR19CVUZGRVIpKQorI2RlZmluZSBHU1RfSVNfSkFDS19SSU5HX0JVRkZFUl9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfSkFDS19SSU5HX0JVRkZFUikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RKYWNrUmluZ0J1ZmZlciBHc3RKYWNrUmluZ0J1ZmZlcjsKK3R5cGVkZWYgc3RydWN0IF9Hc3RKYWNrUmluZ0J1ZmZlckNsYXNzIEdzdEphY2tSaW5nQnVmZmVyQ2xhc3M7CisKK3N0cnVjdCBfR3N0SmFja1JpbmdCdWZmZXIKK3sKKyAgR3N0QXVkaW9SaW5nQnVmZmVyIG9iamVjdDsKKworICBnaW50IHNhbXBsZV9yYXRlOworICBnaW50IGJ1ZmZlcl9zaXplOworICBnaW50IGNoYW5uZWxzOworfTsKKworc3RydWN0IF9Hc3RKYWNrUmluZ0J1ZmZlckNsYXNzCit7CisgIEdzdEF1ZGlvUmluZ0J1ZmZlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK3N0YXRpYyB2b2lkIGdzdF9qYWNrX3JpbmdfYnVmZmVyX2NsYXNzX2luaXQoR3N0SmFja1JpbmdCdWZmZXJDbGFzcyAqIGtsYXNzKTsKK3N0YXRpYyB2b2lkIGdzdF9qYWNrX3JpbmdfYnVmZmVyX2luaXQoR3N0SmFja1JpbmdCdWZmZXIgKiByaW5nYnVmZmVyLAorICAgIEdzdEphY2tSaW5nQnVmZmVyQ2xhc3MgKiBrbGFzcyk7CisKK3N0YXRpYyBHc3RBdWRpb1JpbmdCdWZmZXJDbGFzcyAqcmluZ19wYXJlbnRfY2xhc3MgPSBOVUxMOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2phY2tfcmluZ19idWZmZXJfb3Blbl9kZXZpY2UoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfamFja19yaW5nX2J1ZmZlcl9jbG9zZV9kZXZpY2UoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfamFja19yaW5nX2J1ZmZlcl9hY3F1aXJlKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZixHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2phY2tfcmluZ19idWZmZXJfcmVsZWFzZShHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpOworc3RhdGljIGdib29sZWFuIGdzdF9qYWNrX3JpbmdfYnVmZmVyX3N0YXJ0KEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2phY2tfcmluZ19idWZmZXJfcGF1c2UoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfamFja19yaW5nX2J1ZmZlcl9zdG9wKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1Zik7CitzdGF0aWMgZ3VpbnQgZ3N0X2phY2tfcmluZ19idWZmZXJfZGVsYXkoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKTsKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEvZXh0L2phY2svZ3N0amFja3V0aWwuYyBiL2V4dC9qYWNrL2dzdGphY2t1dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwZTE0YQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qYWNrL2dzdGphY2t1dGlsLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qIEdTdHJlYW1lciBKYWNrIHV0aWxpdHkgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVHJpc3RhbiBNYXR0aGV3cyA8dHJpc3RhbkBzYXQucWMuY2E+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImdzdGphY2t1dGlsLmgiCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKK3N0YXRpYyBjb25zdCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBkZWZhdWx0X3Bvc2l0aW9uc1s4XVs4XSA9IHsKKyAgLyogMSBjaGFubmVsICovCisgIHsKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTU9OTywKKyAgICAgIH0sCisgIC8qIDIgY2hhbm5lbHMgKi8KKyAgeworICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgICAgIH0sCisgIC8qIDMgY2hhbm5lbHMgKDIuMSkgKi8KKyAgeworICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMSwgICAgICAgIC8qIG9yIEZST05UX0NFTlRFUiBmb3IgMy4wPyAqLworICAgICAgfSwKKyAgLyogNCBjaGFubmVscyAoNC4wIG9yIDMuMT8pICovCisgIHsKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVCwKKyAgICAgIH0sCisgIC8qIDUgY2hhbm5lbHMgKi8KKyAgeworICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX1JJR0hULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIsCisgICAgICB9LAorICAvKiA2IGNoYW5uZWxzICovCisgIHsKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSLAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxLAorICAgICAgfSwKKyAgLyogNyBjaGFubmVscyAqLworICB7CisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0xFRlQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfUklHSFQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMSwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9DRU5URVIsCisgICAgICB9LAorICAvKiA4IGNoYW5uZWxzICovCisgIHsKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSLAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxLAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1NJREVfUklHSFQsCisgICAgICB9Cit9OworCisKKy8qIGlmIGNoYW5uZWxzIGFyZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gOCwgd2Ugc2V0IGEgZGVmYXVsdCBsYXlvdXQsCisgKiBvdGhlcndpc2Ugc2V0IGxheW91dCB0byBhbiBhcnJheSBvZiBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FICovCit2b2lkCitnc3RfamFja19zZXRfbGF5b3V0IChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWZmZXIsIEdzdEF1ZGlvUmluZ0J1ZmZlclNwZWMgKiBzcGVjKQoreworICBnaW50IGk7CisKKyAgaWYgKHNwZWMtPmluZm8uY2hhbm5lbHMgPD0gOCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBzcGVjLT5pbmZvLmNoYW5uZWxzOyBpKyspCisgICAgICBzcGVjLT5pbmZvLnBvc2l0aW9uW2ldID0gZGVmYXVsdF9wb3NpdGlvbnNbc3BlYy0+aW5mby5jaGFubmVscyAtIDFdW2ldOworICAgIGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uc190b192YWxpZF9vcmRlciAoc3BlYy0+aW5mby5wb3NpdGlvbiwKKyAgICAgICAgc3BlYy0+aW5mby5jaGFubmVscyk7CisgICAgZ3N0X2F1ZGlvX3JpbmdfYnVmZmVyX3NldF9jaGFubmVsX3Bvc2l0aW9ucyAoYnVmZmVyLAorICAgICAgICBkZWZhdWx0X3Bvc2l0aW9uc1tzcGVjLT5pbmZvLmNoYW5uZWxzIC0gMV0pOworICB9IGVsc2UgeworICAgIHNwZWMtPmluZm8uZmxhZ3MgfD0gR1NUX0FVRElPX0ZMQUdfVU5QT1NJVElPTkVEOworICAgIGZvciAoaSA9IDA7IGkgPCBHX05fRUxFTUVOVFMgKHNwZWMtPmluZm8ucG9zaXRpb24pOyBpKyspCisgICAgICBzcGVjLT5pbmZvLnBvc2l0aW9uW2ldID0gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTk9ORTsKKyAgICBnc3RfYXVkaW9fcmluZ19idWZmZXJfc2V0X2NoYW5uZWxfcG9zaXRpb25zIChidWZmZXIsIHNwZWMtPmluZm8ucG9zaXRpb24pOworICB9CisKKyAgZ3N0X2NhcHNfdW5yZWYgKHNwZWMtPmNhcHMpOworICBzcGVjLT5jYXBzID0gZ3N0X2F1ZGlvX2luZm9fdG9fY2FwcyAoJnNwZWMtPmluZm8pOworfQpkaWZmIC0tZ2l0IGEvZXh0L2phY2svZ3N0amFja3V0aWwuaCBiL2V4dC9qYWNrL2dzdGphY2t1dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0YmNjNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qYWNrL2dzdGphY2t1dGlsLmgKQEAgLTAsMCArMSwzMSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVHJpc3RhbiBNYXR0aGV3cyA8dHJpc3RhbkBzYXQucWMuY2E+CisgKgorICogZ3N0amFja3V0aWwuaDoKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9HU1RfSkFDS19VVElMX0hfCisjZGVmaW5lIF9HU1RfSkFDS19VVElMX0hfCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKK3ZvaWQKK2dzdF9qYWNrX3NldF9sYXlvdXQgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZmZlciwgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqc3BlYyk7CisKKyNlbmRpZiAgLy8gX0dTVF9KQUNLX1VUSUxfSF8KZGlmZiAtLWdpdCBhL2V4dC9qYWNrL21lc29uLmJ1aWxkIGIvZXh0L2phY2svbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE5OGEwNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qYWNrL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMjAgQEAKK2phY2tfc291cmNlcyA9IFsKKyAgJ2dzdGphY2thdWRpb2NsaWVudC5jJywKKyAgJ2dzdGphY2thdWRpb3NpbmsuYycsCisgICdnc3RqYWNrYXVkaW9zcmMuYycsCisgICdnc3RqYWNrLmMnLAorICAnZ3N0amFja3V0aWwuYycsCitdCisKK2xpYmphY2tfZGVwID0gZGVwZW5kZW5jeSgnamFjaycsIHZlcnNpb24gOiAnPj0gMS45LjcnLCByZXF1aXJlZCA6IGZhbHNlKQorCitpZiBsaWJqYWNrX2RlcC5mb3VuZCgpCisgIGdzdGphY2sgPSBsaWJyYXJ5KCdnc3RqYWNrJywKKyAgICBqYWNrX3NvdXJjZXMsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzICsgWyctREhBVkVfSkFDS18xXzlfNyddLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgICBkZXBlbmRlbmNpZXMgOiBbZ3N0X2RlcCwgZ3N0YmFzZV9kZXAsIGdzdGF1ZGlvX2RlcCwgbGliamFja19kZXBdLAorICAgIGluc3RhbGwgOiB0cnVlLAorICAgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKyAgKQorZW5kaWYKZGlmZiAtLWdpdCBhL2V4dC9qcGVnL01ha2VmaWxlLmFtIGIvZXh0L2pwZWcvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk3NTQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qcGVnL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTcgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdGpwZWcubGEKKworbGliZ3N0anBlZ19sYV9TT1VSQ0VTID0gXAorCWdzdGpwZWcuYyBcCisJZ3N0anBlZ2VuYy5jIFwKKwlnc3RqcGVnZGVjLmMKKyMgZGVwcmVjdGVkIGdzdHNtb2tlZW5jLmMgc21va2Vjb2RlYy5jIGdzdHNtb2tlZGVjLmMKKworbGliZ3N0anBlZ19sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKQorbGliZ3N0anBlZ19sYV9MSUJBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAtbGdzdHZpZGVvLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJJChKUEVHX0xJQlMpICQoTElCTSkKK2xpYmdzdGpwZWdfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IFwKKwlnc3RqcGVnLmggXAorCWdzdGpwZWdkZWMuaCBnc3RqcGVnZW5jLmgKKyMgZGVwcmVjYXRlZCBnc3RzbW9rZWVuYy5oIGdzdHNtb2tlZGVjLmggc21va2Vjb2RlYy5oIHNtb2tlZm9ybWF0LmgKZGlmZiAtLWdpdCBhL2V4dC9qcGVnL1JFQURNRSBiL2V4dC9qcGVnL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmExZDBjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2pwZWcvUkVBRE1FCkBAIC0wLDAgKzEsMjAgQEAKK1RoZSBTbW9rZSBDb2RlYworLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgaXMgYSB2ZXJ5IHNpbXBsZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gSSB3YXMgdG95aW5nIHdpdGggd2hlbiBkb2luZyBhCitKYXZhIGJhc2VkIHBsYXllci4gRGVjb2RpbmcgYSBKUEVHIGluIEphdmEgaGFzIGFjY2VwdGFibGUgc3BlZWQgc28gdGhpcyBjb2RlYwordHJpZXMgdG8gZXhwbG9pdCB0aGF0IGZlYXR1cmUuIFRoZSBhbGdvcml0aG0gZmlyc3QgY29tcGFyZXMgdGhlIGxhc3QgYW5kIHRoZSAKK25ldyBpbWFnZSBhbmQgZmluZHMgYWxsIDE2eDE2IGJsb2NrcyB0aGF0IGhhdmUgYSBzcXVhcmVkIGRpZmZlcmVuY2UgYmlnZ2VyIHRoYW4KK2EgY29uZmlndXJhYmxlIHRocmVzaG9sZC4gVGhlbiBhbGwgdGhlc2UgYmxvY2tzIGFyZSBjb21wcmVzc2VkIGludG8gYW4gTnhNIEpQRUcuCitUaGUgcXVhbGl0eSBvZiB0aGUgSlBFRyBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgYmxvY2tzLCB0aGlzCit3YXksIHRoZSBwaWN0dXJlIHF1YWxpdHkgZGVncmFkZXMgd2l0aCBoZWF2eSBtb3Rpb24gc2NlbmVzIGJ1dCB0aGUgYml0cmF0ZSBzdGF5cworbW9yZSBvciBsZXNzIGNvbnN0YW50LgorRGVjb2RpbmcgZGVjb21wcmVzc2VzIHRoZSBKUEVHIGFuZCB0aGVuIHVwZGF0ZXMgdGhlIG9sZCBwaWN0dXJlIHdpdGggdGhlIG5ldworYmxvY2tzLgorCisKK1RPRE86CistLS0tCistIG1ha2UgZm9ybWF0IGV4dGVuc2libGUKKy0gbW90aW9uIHZlY3RvcnMKKy0gZG8gc29tZSByZWFsIGJpdHJhdGUgY29udHJvbApkaWZmIC0tZ2l0IGEvZXh0L2pwZWcvZ3N0anBlZy5jIGIvZXh0L2pwZWcvZ3N0anBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllY2RkNWQKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvanBlZy9nc3RqcGVnLmMKQEAgLTAsMCArMSw4MSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImdzdGpwZWcuaCIKKyNpbmNsdWRlICJnc3RqcGVnZGVjLmgiCisjaW5jbHVkZSAiZ3N0anBlZ2VuYy5oIgorI2lmIDAKKyNpbmNsdWRlICJnc3RzbW9rZWVuYy5oIgorI2luY2x1ZGUgImdzdHNtb2tlZGVjLmgiCisjZW5kaWYKKworR1R5cGUKK2dzdF9pZGN0X21ldGhvZF9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGlkY3RfbWV0aG9kX3R5cGUgPSAwOworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSBpZGN0X21ldGhvZFtdID0geworICAgIHtKRENUX0lTTE9XLCAiU2xvdyBidXQgYWNjdXJhdGUgaW50ZWdlciBhbGdvcml0aG0iLCAiaXNsb3cifSwKKyAgICB7SkRDVF9JRkFTVCwgIkZhc3RlciwgbGVzcyBhY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZCIsICJpZmFzdCJ9LAorICAgIHtKRENUX0ZMT0FULCAiRmxvYXRpbmctcG9pbnQ6IGFjY3VyYXRlLCBmYXN0IG9uIGZhc3QgSFciLCAiZmxvYXQifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0sCisgIH07CisKKyAgaWYgKCFpZGN0X21ldGhvZF90eXBlKSB7CisgICAgaWRjdF9tZXRob2RfdHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RJRENUTWV0aG9kIiwgaWRjdF9tZXRob2QpOworICB9CisgIHJldHVybiBpZGN0X21ldGhvZF90eXBlOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAianBlZ2VuYyIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICAgICAgR1NUX1RZUEVfSlBFR0VOQykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImpwZWdkZWMiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIEdTVF9UWVBFX0pQRUdfREVDKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyNpZiAwCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInNtb2tlZW5jIiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgICAgICBHU1RfVFlQRV9TTU9LRUVOQykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInNtb2tlZGVjIiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgICAgICBHU1RfVFlQRV9TTU9LRURFQykpCisgICAgcmV0dXJuIEZBTFNFOworI2VuZGlmCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBqcGVnLAorICAgICJKUGVnIHBsdWdpbiBsaWJyYXJ5IiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgIkxHUEwiLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9leHQvanBlZy9nc3RqcGVnLmggYi9leHQvanBlZy9nc3RqcGVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhMzBhMgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qcGVnL2dzdGpwZWcuaApAQCAtMCwwICsxLDM1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX0pQRUdfSF9fCisjZGVmaW5lIF9fR1NUX0pQRUdfSF9fCisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKworI2RlZmluZSBHU1RfVFlQRV9JRENUX01FVEhPRCAoZ3N0X2lkY3RfbWV0aG9kX2dldF90eXBlKCkpCitHVHlwZSBnc3RfaWRjdF9tZXRob2RfZ2V0X3R5cGUgKHZvaWQpOworCisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9KUEVHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L2pwZWcvZ3N0anBlZ2RlYy5jIGIvZXh0L2pwZWcvZ3N0anBlZ2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OGIyNTgKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvanBlZy9nc3RqcGVnZGVjLmMKQEAgLTAsMCArMSwxNTU1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICogQ29weXJpZ2h0IChDKSAyMDEyIENvbGxhYm9yYSBMdGQuCisgKglBdXRob3IgOiBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY29sbGFib3JhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1qcGVnZGVjCisgKgorICogRGVjb2RlcyBqcGVnIGltYWdlcy4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgZmlsZXNyYyBsb2NhdGlvbj1tanBlZy5hdmkgISBhdmlkZW11eCAhICBxdWV1ZSAhIGpwZWdkZWMgISB2aWRlb2NvbnZlcnQgISB2aWRlb3NjYWxlICEgYXV0b3ZpZGVvc2luaworICogXXwgVGhlIGFib3ZlIHBpcGVsaW5lIGRlY29kZSB0aGUgbWpwZWcgc3RyZWFtIGFuZCByZW5kZXJzIGl0IHRvIHRoZSBzY3JlZW4uCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdGpwZWdkZWMuaCIKKyNpbmNsdWRlICJnc3RqcGVnLmgiCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvbWV0YS5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb3Bvb2wuaD4KKyNpbmNsdWRlICJnc3QvZ3N0LWkxOG4tcGx1Z2luLmgiCisjaW5jbHVkZSA8amVycm9yLmg+CisKKyNkZWZpbmUgTUlOX1dJRFRIICAxCisjZGVmaW5lIE1BWF9XSURUSCAgNjU1MzUKKyNkZWZpbmUgTUlOX0hFSUdIVCAxCisjZGVmaW5lIE1BWF9IRUlHSFQgNjU1MzUKKworI2RlZmluZSBDSU5GT19HRVRfSlBFR0RFQyhjaW5mb19wdHIpIFwKKyAgICAgICAgKCgoc3RydWN0IEdzdEpwZWdEZWNTb3VyY2VNZ3IqKSgoY2luZm9fcHRyKS0+c3JjKSktPmRlYykKKworI2RlZmluZSBKUEVHX0RFRkFVTFRfSURDVF9NRVRIT0QJSkRDVF9GQVNURVNUCisjZGVmaW5lIEpQRUdfREVGQVVMVF9NQVhfRVJST1JTIAkwCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0lEQ1RfTUVUSE9ELAorICBQUk9QX01BWF9FUlJPUlMKK307CisKKy8qICpJTkRFTlQtT0ZGKiAqLworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9qcGVnX2RlY19zcmNfcGFkX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UKKyAgICAgICAgKCJ7IEk0MjAsIFJHQiwgQkdSLCBSR0J4LCB4UkdCLCBCR1J4LCB4QkdSLCBHUkFZOCB9IikpCisgICAgKTsKKy8qICpJTkRFTlQtT04qICovCisKKy8qIEZJWE1FOiBzb2YtbWFya2VyIGlzIGZvciBJSkcgbGlianBlZyA4LCBzaG91bGQgYmUgZGlmZmVyZW50IGZvciA2LjIgKi8KKy8qIEZJWE1FOiBhZGQgYmFjayAic29mLW1hcmtlciA9IChpbnQpIHsgMCwgMSwgMiwgNSwgNiwgNywgOSwgMTAsIDEzLCAxNCB9IgorICogb25jZSB3ZSBoYXZlIGEgcGFyc2VyIGFuZC9vciBkZW11eGVyIHNldCBjYXBzIHByb3Blcmx5ICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X2pwZWdfZGVjX3NpbmtfcGFkX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImltYWdlL2pwZWciKQorICAgICk7CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGpwZWdfZGVjX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGpwZWdfZGVjX2RlYnVnCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChHU1RfQ0FUX1BFUkZPUk1BTkNFKTsKKworc3RhdGljIHZvaWQgZ3N0X2pwZWdfZGVjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9qcGVnX2RlY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfanBlZ19kZWNfc2V0X2Zvcm1hdCAoR3N0VmlkZW9EZWNvZGVyICogZGVjLAorICAgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqIHN0YXRlKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfanBlZ19kZWNfc3RhcnQgKEdzdFZpZGVvRGVjb2RlciAqIGJkZWMpOworc3RhdGljIGdib29sZWFuIGdzdF9qcGVnX2RlY19zdG9wIChHc3RWaWRlb0RlY29kZXIgKiBiZGVjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfanBlZ19kZWNfZmx1c2ggKEdzdFZpZGVvRGVjb2RlciAqIGJkZWMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2pwZWdfZGVjX3BhcnNlIChHc3RWaWRlb0RlY29kZXIgKiBiZGVjLAorICAgIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lLCBHc3RBZGFwdGVyICogYWRhcHRlciwgZ2Jvb2xlYW4gYXRfZW9zKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9qcGVnX2RlY19oYW5kbGVfZnJhbWUgKEdzdFZpZGVvRGVjb2RlciAqIGJkZWMsCisgICAgR3N0VmlkZW9Db2RlY0ZyYW1lICogZnJhbWUpOworc3RhdGljIGdib29sZWFuIGdzdF9qcGVnX2RlY19kZWNpZGVfYWxsb2NhdGlvbiAoR3N0VmlkZW9EZWNvZGVyICogYmRlYywKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfanBlZ19kZWNfc2lua19ldmVudCAoR3N0VmlkZW9EZWNvZGVyICogYmRlYywKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworI2RlZmluZSBnc3RfanBlZ19kZWNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0SnBlZ0RlYywgZ3N0X2pwZWdfZGVjLCBHU1RfVFlQRV9WSURFT19ERUNPREVSKTsKKworc3RhdGljIHZvaWQKK2dzdF9qcGVnX2RlY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0SnBlZ0RlYyAqZGVjID0gR1NUX0pQRUdfREVDIChvYmplY3QpOworCisgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzICgmZGVjLT5jaW5mbyk7CisgIGlmIChkZWMtPmlucHV0X3N0YXRlKQorICAgIGdzdF92aWRlb19jb2RlY19zdGF0ZV91bnJlZiAoZGVjLT5pbnB1dF9zdGF0ZSk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdfZGVjX2NsYXNzX2luaXQgKEdzdEpwZWdEZWNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKyAgR3N0VmlkZW9EZWNvZGVyQ2xhc3MgKnZkZWNfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICB2ZGVjX2NsYXNzID0gKEdzdFZpZGVvRGVjb2RlckNsYXNzICopIGtsYXNzOworCisgIHBhcmVudF9jbGFzcyA9IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2pwZWdfZGVjX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfanBlZ19kZWNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfanBlZ19kZWNfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSURDVF9NRVRIT0QsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoImlkY3QtbWV0aG9kIiwgIklEQ1QgTWV0aG9kIiwKKyAgICAgICAgICAiVGhlIElEQ1QgYWxnb3JpdGhtIHRvIHVzZSIsIEdTVF9UWVBFX0lEQ1RfTUVUSE9ELAorICAgICAgICAgIEpQRUdfREVGQVVMVF9JRENUX01FVEhPRCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0SnBlZ0RlYzptYXgtZXJyb3JzOgorICAgKgorICAgKiBFcnJvciBvdXQgYWZ0ZXIgcmVjZWl2aW5nIE4gY29uc2VjdXRpdmUgZGVjb2RpbmcgZXJyb3JzCisgICAqICgtMSA9IG5ldmVyIGVycm9yIG91dCwgMCA9IGF1dG9tYXRpYywgMSA9IGZhaWwgb24gZmlyc3QgZXJyb3IsIGV0Yy4pCisgICAqCisgICAqIERlcHJlY2F0ZWQ6IDEuMy4xOiBQcm9wZXJ0eSB3YXNuJ3QgdXNlZCBpbnRlcm5hbGx5CisgICAqLworI2lmbmRlZiBHU1RfUkVNT1ZFX0RFUFJFQ0FURUQKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfRVJST1JTLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoIm1heC1lcnJvcnMiLCAiTWF4aW11bSBDb25zZWN1dGl2ZSBEZWNvZGluZyBFcnJvcnMiLAorICAgICAgICAgICIoRGVwcmVjYXRlZCkgRXJyb3Igb3V0IGFmdGVyIHJlY2VpdmluZyBOIGNvbnNlY3V0aXZlIGRlY29kaW5nIGVycm9ycyIKKyAgICAgICAgICAiICgtMSA9IG5ldmVyIGZhaWwsIDAgPSBhdXRvbWF0aWMsIDEgPSBmYWlsIG9uIGZpcnN0IGVycm9yKSIsCisgICAgICAgICAgLTEsIEdfTUFYSU5ULCBKUEVHX0RFRkFVTFRfTUFYX0VSUk9SUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHX1BBUkFNX0RFUFJFQ0FURUQpKTsKKyNlbmRpZgorCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9qcGVnX2RlY19zcmNfcGFkX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X2pwZWdfZGVjX3NpbmtfcGFkX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgIkpQRUcgaW1hZ2UgZGVjb2RlciIsCisgICAgICAiQ29kZWMvRGVjb2Rlci9JbWFnZSIsICJEZWNvZGUgaW1hZ2VzIGZyb20gSlBFRyBmb3JtYXQiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+Iik7CisKKyAgdmRlY19jbGFzcy0+c3RhcnQgPSBnc3RfanBlZ19kZWNfc3RhcnQ7CisgIHZkZWNfY2xhc3MtPnN0b3AgPSBnc3RfanBlZ19kZWNfc3RvcDsKKyAgdmRlY19jbGFzcy0+Zmx1c2ggPSBnc3RfanBlZ19kZWNfZmx1c2g7CisgIHZkZWNfY2xhc3MtPnBhcnNlID0gZ3N0X2pwZWdfZGVjX3BhcnNlOworICB2ZGVjX2NsYXNzLT5zZXRfZm9ybWF0ID0gZ3N0X2pwZWdfZGVjX3NldF9mb3JtYXQ7CisgIHZkZWNfY2xhc3MtPmhhbmRsZV9mcmFtZSA9IGdzdF9qcGVnX2RlY19oYW5kbGVfZnJhbWU7CisgIHZkZWNfY2xhc3MtPmRlY2lkZV9hbGxvY2F0aW9uID0gZ3N0X2pwZWdfZGVjX2RlY2lkZV9hbGxvY2F0aW9uOworICB2ZGVjX2NsYXNzLT5zaW5rX2V2ZW50ID0gZ3N0X2pwZWdfZGVjX3NpbmtfZXZlbnQ7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGpwZWdfZGVjX2RlYnVnLCAianBlZ2RlYyIsIDAsICJKUEVHIGRlY29kZXIiKTsKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0dFVCAoR1NUX0NBVF9QRVJGT1JNQU5DRSwgIkdTVF9QRVJGT1JNQU5DRSIpOworfQorCitzdGF0aWMgYm9vbGVhbgorZ3N0X2pwZWdfZGVjX2ZpbGxfaW5wdXRfYnVmZmVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBXZSBwYXNzIGluIGZ1bGwgZnJhbWUgaW5pdGlhbGx5LCBpZiB0aGlzIGdldCBjYWxsZWQsIHRoZSBmcmFtZSBpcyBtb3N0IGxpa2VseQorICAgKiBjb3JydXB0ZWQgKi8KKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdfZGVjX2luaXRfc291cmNlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBHU1RfTE9HX09CSkVDVCAoQ0lORk9fR0VUX0pQRUdERUMgKGNpbmZvKSwgImluaXRfc291cmNlIik7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9qcGVnX2RlY19za2lwX2lucHV0X2RhdGEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGdsb25nIG51bV9ieXRlcykKK3sKKyAgR3N0SnBlZ0RlYyAqZGVjID0gQ0lORk9fR0VUX0pQRUdERUMgKGNpbmZvKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZWMsICJza2lwICVsZCBieXRlcyIsIG51bV9ieXRlcyk7CisKKyAgaWYgKG51bV9ieXRlcyA+IDAgJiYgY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyID49IG51bV9ieXRlcykgeworICAgIGNpbmZvLT5zcmMtPm5leHRfaW5wdXRfYnl0ZSArPSAoc2l6ZV90KSBudW1fYnl0ZXM7CisgICAgY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyIC09IChzaXplX3QpIG51bV9ieXRlczsKKyAgfQorfQorCitzdGF0aWMgYm9vbGVhbgorZ3N0X2pwZWdfZGVjX3Jlc3luY190b19yZXN0YXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBnaW50IGRlc2lyZWQpCit7CisgIEdTVF9MT0dfT0JKRUNUIChDSU5GT19HRVRfSlBFR0RFQyAoY2luZm8pLCAicmVzeW5jX3RvX3N0YXJ0Iik7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdfZGVjX3Rlcm1fc291cmNlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBHU1RfTE9HX09CSkVDVCAoQ0lORk9fR0VUX0pQRUdERUMgKGNpbmZvKSwgInRlcm1fc291cmNlIik7CisgIHJldHVybjsKK30KKworTUVUSE9EREVGICh2b2lkKQorICAgIGdzdF9qcGVnX2RlY19teV9vdXRwdXRfbWVzc2FnZSAoal9jb21tb25fcHRyIGNpbmZvKQoreworICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyBub3RoaW5nICovCit9CisKK01FVEhPRERFRiAodm9pZCkKKyAgICBnc3RfanBlZ19kZWNfbXlfZW1pdF9tZXNzYWdlIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBtc2dfbGV2ZWwpCit7CisgIC8qIEdTVF9MT0dfT0JKRUNUIChDSU5GT19HRVRfSlBFR0RFQyAoJmNpbmZvKSwgIm1zZ19sZXZlbD0lZCIsIG1zZ19sZXZlbCk7ICovCisgIHJldHVybjsKK30KKworTUVUSE9EREVGICh2b2lkKQorICAgIGdzdF9qcGVnX2RlY19teV9lcnJvcl9leGl0IChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIHN0cnVjdCBHc3RKcGVnRGVjRXJyb3JNZ3IgKmVycl9tZ3IgPSAoc3RydWN0IEdzdEpwZWdEZWNFcnJvck1nciAqKSBjaW5mby0+ZXJyOworCisgICgqY2luZm8tPmVyci0+b3V0cHV0X21lc3NhZ2UpIChjaW5mbyk7CisgIGxvbmdqbXAgKGVycl9tZ3ItPnNldGptcF9idWZmZXIsIDEpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdfZGVjX2luaXQgKEdzdEpwZWdEZWMgKiBkZWMpCit7CisgIEdTVF9ERUJVRyAoImluaXRpYWxpemluZyIpOworCisgIC8qIHNldHVwIGpwZWdsaWIgKi8KKyAgbWVtc2V0ICgmZGVjLT5jaW5mbywgMCwgc2l6ZW9mIChkZWMtPmNpbmZvKSk7CisgIG1lbXNldCAoJmRlYy0+amVyciwgMCwgc2l6ZW9mIChkZWMtPmplcnIpKTsKKyAgZGVjLT5jaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvciAoJmRlYy0+amVyci5wdWIpOworICBkZWMtPmplcnIucHViLm91dHB1dF9tZXNzYWdlID0gZ3N0X2pwZWdfZGVjX215X291dHB1dF9tZXNzYWdlOworICBkZWMtPmplcnIucHViLmVtaXRfbWVzc2FnZSA9IGdzdF9qcGVnX2RlY19teV9lbWl0X21lc3NhZ2U7CisgIGRlYy0+amVyci5wdWIuZXJyb3JfZXhpdCA9IGdzdF9qcGVnX2RlY19teV9lcnJvcl9leGl0OworCisgIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MgKCZkZWMtPmNpbmZvKTsKKworICBkZWMtPmNpbmZvLnNyYyA9IChzdHJ1Y3QganBlZ19zb3VyY2VfbWdyICopICZkZWMtPmpzcmM7CisgIGRlYy0+Y2luZm8uc3JjLT5pbml0X3NvdXJjZSA9IGdzdF9qcGVnX2RlY19pbml0X3NvdXJjZTsKKyAgZGVjLT5jaW5mby5zcmMtPmZpbGxfaW5wdXRfYnVmZmVyID0gZ3N0X2pwZWdfZGVjX2ZpbGxfaW5wdXRfYnVmZmVyOworICBkZWMtPmNpbmZvLnNyYy0+c2tpcF9pbnB1dF9kYXRhID0gZ3N0X2pwZWdfZGVjX3NraXBfaW5wdXRfZGF0YTsKKyAgZGVjLT5jaW5mby5zcmMtPnJlc3luY190b19yZXN0YXJ0ID0gZ3N0X2pwZWdfZGVjX3Jlc3luY190b19yZXN0YXJ0OworICBkZWMtPmNpbmZvLnNyYy0+dGVybV9zb3VyY2UgPSBnc3RfanBlZ19kZWNfdGVybV9zb3VyY2U7CisgIGRlYy0+anNyYy5kZWMgPSBkZWM7CisKKyAgLyogaW5pdCBwcm9wZXJ0aWVzICovCisgIGRlYy0+aWRjdF9tZXRob2QgPSBKUEVHX0RFRkFVTFRfSURDVF9NRVRIT0Q7CisgIGRlYy0+bWF4X2Vycm9ycyA9IEpQRUdfREVGQVVMVF9NQVhfRVJST1JTOworCisgIGdzdF92aWRlb19kZWNvZGVyX3NldF91c2VfZGVmYXVsdF9wYWRfYWNjZXB0Y2FwcyAoR1NUX1ZJREVPX0RFQ09ERVJfQ0FTVAorICAgICAgKGRlYyksIFRSVUUpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9WSURFT19ERUNPREVSX1NJTktfUEFEIChkZWMpKTsKK30KKworc3RhdGljIGlubGluZSBnYm9vbGVhbgorZ3N0X2pwZWdfZGVjX3BhcnNlX3RhZ19oYXNfZW50cm9weV9zZWdtZW50IChndWludDggdGFnKQoreworICBpZiAodGFnID09IDB4ZGEgfHwgKHRhZyA+PSAweGQwICYmIHRhZyA8PSAweGQ3KSkKKyAgICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2pwZWdfZGVjX3BhcnNlIChHc3RWaWRlb0RlY29kZXIgKiBiZGVjLCBHc3RWaWRlb0NvZGVjRnJhbWUgKiBmcmFtZSwKKyAgICBHc3RBZGFwdGVyICogYWRhcHRlciwgZ2Jvb2xlYW4gYXRfZW9zKQoreworICBndWludCBzaXplOworICBnaW50IHRvYWRkID0gMDsKKyAgZ2Jvb2xlYW4gcmVzeW5jOworICBnaW50IG9mZnNldCA9IDAsIG5vZmZzZXQ7CisgIEdzdEpwZWdEZWMgKmRlYyA9IChHc3RKcGVnRGVjICopIGJkZWM7CisKKyAgR1NUX1ZJREVPX0NPREVDX0ZSQU1FX1NFVF9TWU5DX1BPSU5UIChmcmFtZSk7CisKKyAgLyogRklYTUUgOiBUaGUgb3ZlcmhlYWQgb2YgdXNpbmcgc2Nhbl91aW50MzIgaXMgbWFzc2l2ZSAqLworCisgIHNpemUgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGFkYXB0ZXIpOworICBHU1RfREVCVUcgKCJQYXJzaW5nIGpwZWcgaW1hZ2UgZGF0YSAoJXUgYnl0ZXMpIiwgc2l6ZSk7CisKKyAgaWYgKGF0X2VvcykgeworICAgIEdTVF9ERUJVRyAoIkZsdXNoaW5nIGFsbCBkYXRhIG91dCIpOworICAgIHRvYWRkID0gc2l6ZTsKKworICAgIC8qIElmIHdlIGhhdmUgbGVmdG92ZXIgZGF0YSwgdGhyb3cgaXQgYXdheSAqLworICAgIGlmICghZGVjLT5zYXdfaGVhZGVyKQorICAgICAgZ290byBkcm9wX2ZyYW1lOworICAgIGdvdG8gaGF2ZV9mdWxsX2ZyYW1lOworICB9CisKKyAgaWYgKHNpemUgPCA4KQorICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisKKyAgaWYgKCFkZWMtPnNhd19oZWFkZXIpIHsKKyAgICBnaW50IHJldDsKKyAgICAvKiB3ZSBleHBlY3QgYXQgbGVhc3QgNCBieXRlcywgZmlyc3Qgb2Ygd2hpY2ggc3RhcnQgbWFya2VyICovCisgICAgcmV0ID0KKyAgICAgICAgZ3N0X2FkYXB0ZXJfbWFza2VkX3NjYW5fdWludDMyIChhZGFwdGVyLCAweGZmZmYwMDAwLCAweGZmZDgwMDAwLCAwLAorICAgICAgICBzaXplIC0gNCk7CisKKyAgICBHU1RfREVCVUcgKCJyZXQ6JWQiLCByZXQpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgZ290byBuZWVkX21vcmVfZGF0YTsKKworICAgIGlmIChyZXQpIHsKKyAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChhZGFwdGVyLCByZXQpOworICAgICAgc2l6ZSAtPSByZXQ7CisgICAgfQorICAgIGRlYy0+c2F3X2hlYWRlciA9IFRSVUU7CisgIH0KKworICB3aGlsZSAoMSkgeworICAgIGd1aW50IGZyYW1lX2xlbjsKKyAgICBndWludDMyIHZhbHVlOworCisgICAgR1NUX0RFQlVHICgib2Zmc2V0OiVkLCBzaXplOiVkIiwgb2Zmc2V0LCBzaXplKTsKKworICAgIG5vZmZzZXQgPQorICAgICAgICBnc3RfYWRhcHRlcl9tYXNrZWRfc2Nhbl91aW50MzJfcGVlayAoYWRhcHRlciwgMHgwMDAwZmYwMCwgMHgwMDAwZmYwMCwKKyAgICAgICAgb2Zmc2V0LCBzaXplIC0gb2Zmc2V0LCAmdmFsdWUpOworCisgICAgLyogbG9zdCBzeW5jIGlmIDB4ZmYgbWFya2VyIG5vdCB3aGVyZSBleHBlY3RlZCAqLworICAgIGlmICgocmVzeW5jID0gKG5vZmZzZXQgIT0gb2Zmc2V0KSkpIHsKKyAgICAgIEdTVF9ERUJVRyAoIkxvc3Qgc3luYyBhdCAweCUwOHgsIHJlc3luY2luZyIsIG9mZnNldCArIDIpOworICAgIH0KKyAgICAvKiBtYXkgaGF2ZSBtYXJrZXIsIGJ1dCBjb3VsZCBoYXZlIGJlZW4gcmVzeW5jbmcgKi8KKyAgICByZXN5bmMgPSByZXN5bmMgfHwgZGVjLT5wYXJzZV9yZXN5bmM7CisgICAgLyogU2tpcCBvdmVyIGV4dHJhIDB4ZmYgKi8KKyAgICB3aGlsZSAoKG5vZmZzZXQgPj0gMCkgJiYgKCh2YWx1ZSAmIDB4ZmYpID09IDB4ZmYpKSB7CisgICAgICBub2Zmc2V0Kys7CisgICAgICBub2Zmc2V0ID0KKyAgICAgICAgICBnc3RfYWRhcHRlcl9tYXNrZWRfc2Nhbl91aW50MzJfcGVlayAoYWRhcHRlciwgMHgwMDAwZmYwMCwgMHgwMDAwZmYwMCwKKyAgICAgICAgICBub2Zmc2V0LCBzaXplIC0gbm9mZnNldCwgJnZhbHVlKTsKKyAgICB9CisgICAgLyogZW5vdWdoIGJ5dGVzIGxlZnQgZm9yIG1hcmtlcj8gKHdlIG5lZWQgMHhOTiBhZnRlciB0aGUgMHhmZikgKi8KKyAgICBpZiAobm9mZnNldCA8IDApIHsKKyAgICAgIEdTVF9ERUJVRyAoImF0IGVuZCBvZiBpbnB1dCBhbmQgbm8gRU9JIG1hcmtlciBmb3VuZCwgbmVlZCBtb3JlIGRhdGEiKTsKKyAgICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisgICAgfQorCisgICAgLyogbm93IGxvY2sgb24gdGhlIG1hcmtlciB3ZSBmb3VuZCAqLworICAgIG9mZnNldCA9IG5vZmZzZXQ7CisgICAgdmFsdWUgPSB2YWx1ZSAmIDB4ZmY7CisgICAgaWYgKHZhbHVlID09IDB4ZDkpIHsKKyAgICAgIEdTVF9ERUJVRyAoIjB4JTA4eDogRU9JIG1hcmtlciIsIG9mZnNldCArIDIpOworICAgICAgLyogY2xlYXIgcGFyc2Ugc3RhdGUgKi8KKyAgICAgIGRlYy0+c2F3X2hlYWRlciA9IEZBTFNFOworICAgICAgZGVjLT5wYXJzZV9yZXN5bmMgPSBGQUxTRTsKKyAgICAgIHRvYWRkID0gb2Zmc2V0ICsgNDsKKyAgICAgIGdvdG8gaGF2ZV9mdWxsX2ZyYW1lOworICAgIH0KKyAgICBpZiAodmFsdWUgPT0gMHhkOCkgeworICAgICAgR1NUX0RFQlVHICgiMHglMDh4OiBTT0kgbWFya2VyIGJlZm9yZSBFT0kgbWFya2VyIiwgb2Zmc2V0ICsgMik7CisKKyAgICAgIC8qIGNsZWFyIHBhcnNlIHN0YXRlICovCisgICAgICBkZWMtPnNhd19oZWFkZXIgPSBGQUxTRTsKKyAgICAgIGRlYy0+cGFyc2VfcmVzeW5jID0gRkFMU0U7CisgICAgICB0b2FkZCA9IG9mZnNldDsKKyAgICAgIGdvdG8gaGF2ZV9mdWxsX2ZyYW1lOworICAgIH0KKworCisgICAgaWYgKHZhbHVlID49IDB4ZDAgJiYgdmFsdWUgPD0gMHhkNykKKyAgICAgIGZyYW1lX2xlbiA9IDA7CisgICAgZWxzZSB7CisgICAgICAvKiBwZWVrIHRhZyBhbmQgc3Vic2VxdWVudCBsZW5ndGggKi8KKyAgICAgIGlmIChvZmZzZXQgKyAyICsgNCA+IHNpemUpCisgICAgICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisgICAgICBlbHNlCisgICAgICAgIGdzdF9hZGFwdGVyX21hc2tlZF9zY2FuX3VpbnQzMl9wZWVrIChhZGFwdGVyLCAweDAsIDB4MCwgb2Zmc2V0ICsgMiwgNCwKKyAgICAgICAgICAgICZmcmFtZV9sZW4pOworICAgICAgZnJhbWVfbGVuID0gZnJhbWVfbGVuICYgMHhmZmZmOworICAgIH0KKyAgICBHU1RfREVCVUcgKCIweCUwOHg6IHRhZyAlMDJ4LCBmcmFtZV9sZW49JXUiLCBvZmZzZXQgKyAyLCB2YWx1ZSwgZnJhbWVfbGVuKTsKKyAgICAvKiB0aGUgZnJhbWUgbGVuZ3RoIGluY2x1ZGVzIHRoZSAyIGJ5dGVzIGZvciB0aGUgbGVuZ3RoOyBoZXJlIHdlIHdhbnQgYXQKKyAgICAgKiBsZWFzdCAyIG1vcmUgYnl0ZXMgYXQgdGhlIGVuZCBmb3IgYW4gZW5kIG1hcmtlciAqLworICAgIGlmIChvZmZzZXQgKyAyICsgMiArIGZyYW1lX2xlbiArIDIgPiBzaXplKSB7CisgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworICAgIH0KKworICAgIGlmIChnc3RfanBlZ19kZWNfcGFyc2VfdGFnX2hhc19lbnRyb3B5X3NlZ21lbnQgKHZhbHVlKSkgeworICAgICAgZ3VpbnQgZXNlZ2xlbiA9IGRlYy0+cGFyc2VfZW50cm9weV9sZW47CisKKyAgICAgIEdTVF9ERUJVRyAoIjB4JTA4eDogZmluZGluZyBlbnRyb3B5IHNlZ21lbnQgbGVuZ3RoIChlc2VnbGVuOiVkKSIsCisgICAgICAgICAgb2Zmc2V0ICsgMiwgZXNlZ2xlbik7CisgICAgICBpZiAoc2l6ZSA8IG9mZnNldCArIDIgKyBmcmFtZV9sZW4gKyBlc2VnbGVuKQorICAgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworICAgICAgbm9mZnNldCA9IG9mZnNldCArIDIgKyBmcmFtZV9sZW4gKyBkZWMtPnBhcnNlX2VudHJvcHlfbGVuOworICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgR1NUX0RFQlVHICgibm9mZnNldDolZCwgc2l6ZTolZCwgc2l6ZSAtIG5vZmZzZXQ6JWQiLAorICAgICAgICAgICAgbm9mZnNldCwgc2l6ZSwgc2l6ZSAtIG5vZmZzZXQpOworICAgICAgICBub2Zmc2V0ID0gZ3N0X2FkYXB0ZXJfbWFza2VkX3NjYW5fdWludDMyX3BlZWsgKGFkYXB0ZXIsIDB4MDAwMGZmMDAsCisgICAgICAgICAgICAweDAwMDBmZjAwLCBub2Zmc2V0LCBzaXplIC0gbm9mZnNldCwgJnZhbHVlKTsKKyAgICAgICAgaWYgKG5vZmZzZXQgPCAwKSB7CisgICAgICAgICAgLyogbmVlZCBtb3JlIGRhdGEgKi8KKyAgICAgICAgICBkZWMtPnBhcnNlX2VudHJvcHlfbGVuID0gc2l6ZSAtIG9mZnNldCAtIDQgLSBmcmFtZV9sZW4gLSAyOworICAgICAgICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh2YWx1ZSAmIDB4ZmYpICE9IDB4MDApIHsKKyAgICAgICAgICBlc2VnbGVuID0gbm9mZnNldCAtIG9mZnNldCAtIGZyYW1lX2xlbiAtIDI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbm9mZnNldCsrOworICAgICAgfQorICAgICAgZGVjLT5wYXJzZV9lbnRyb3B5X2xlbiA9IDA7CisgICAgICBmcmFtZV9sZW4gKz0gZXNlZ2xlbjsKKyAgICAgIEdTVF9ERUJVRyAoImVudHJvcHkgc2VnbWVudCBsZW5ndGg9JXUgPT4gZnJhbWVfbGVuPSV1IiwgZXNlZ2xlbiwKKyAgICAgICAgICBmcmFtZV9sZW4pOworICAgIH0KKyAgICBpZiAocmVzeW5jKSB7CisgICAgICAvKiBjaGVjayBpZiB3ZSB3aWxsIHN0aWxsIGJlIGluIHN5bmMgaWYgd2UgaW50ZXJwcmV0CisgICAgICAgKiB0aGlzIGFzIGEgc3luYyBwb2ludCBhbmQgc2tpcCB0aGlzIGZyYW1lICovCisgICAgICBub2Zmc2V0ID0gb2Zmc2V0ICsgZnJhbWVfbGVuICsgMjsKKyAgICAgIG5vZmZzZXQgPSBnc3RfYWRhcHRlcl9tYXNrZWRfc2Nhbl91aW50MzIgKGFkYXB0ZXIsIDB4MDAwMGZmMDAsIDB4MDAwMGZmMDAsCisgICAgICAgICAgbm9mZnNldCwgNCk7CisgICAgICBpZiAobm9mZnNldCA8IDApIHsKKyAgICAgICAgLyogaWdub3JlIGFuZCBjb250aW51ZSByZXN5bmNpbmcgdW50aWwgd2UgaGl0IHRoZSBlbmQKKyAgICAgICAgICogb2Ygb3VyIGRhdGEgb3IgZmluZCBhIHN5bmMgcG9pbnQgdGhhdCBsb29rcyBva2F5ICovCisgICAgICAgIG9mZnNldCsrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIEdTVF9ERUJVRyAoImZvdW5kIHN5bmMgYXQgMHgleCIsIG9mZnNldCArIDIpOworICAgIH0KKworICAgIC8qIEFkZCBjdXJyZW50IGRhdGEgdG8gb3V0cHV0IGJ1ZmZlciAqLworICAgIHRvYWRkICs9IGZyYW1lX2xlbiArIDI7CisgICAgb2Zmc2V0ICs9IGZyYW1lX2xlbiArIDI7CisgIH0KKworbmVlZF9tb3JlX2RhdGE6CisgIGlmICh0b2FkZCkKKyAgICBnc3RfdmlkZW9fZGVjb2Rlcl9hZGRfdG9fZnJhbWUgKGJkZWMsIHRvYWRkKTsKKyAgcmV0dXJuIEdTVF9WSURFT19ERUNPREVSX0ZMT1dfTkVFRF9EQVRBOworCitoYXZlX2Z1bGxfZnJhbWU6CisgIGlmICh0b2FkZCkKKyAgICBnc3RfdmlkZW9fZGVjb2Rlcl9hZGRfdG9fZnJhbWUgKGJkZWMsIHRvYWRkKTsKKyAgR1NUX1ZJREVPX0NPREVDX0ZSQU1FX1NFVF9TWU5DX1BPSU5UIChmcmFtZSk7CisgIHJldHVybiBnc3RfdmlkZW9fZGVjb2Rlcl9oYXZlX2ZyYW1lIChiZGVjKTsKKworZHJvcF9mcmFtZToKKyAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGFkYXB0ZXIsIHNpemUpOworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKKworLyogc2hhbWVsZXNzbHkgcmlwcGVkIGZyb20ganBlZ3V0aWxzLmMgaW4gbWpwZWd0b29scyAqLworc3RhdGljIHZvaWQKK2FkZF9odWZmX3RhYmxlIChqX2RlY29tcHJlc3NfcHRyIGRpbmZvLAorICAgIEpIVUZGX1RCTCAqKiBodGJscHRyLCBjb25zdCBVSU5UOCAqIGJpdHMsIGNvbnN0IFVJTlQ4ICogdmFsKQorLyogRGVmaW5lIGEgSHVmZm1hbiB0YWJsZSAqLworeworICBpbnQgbnN5bWJvbHMsIGxlbjsKKworICBpZiAoKmh0YmxwdHIgPT0gTlVMTCkKKyAgICAqaHRibHB0ciA9IGpwZWdfYWxsb2NfaHVmZl90YWJsZSAoKGpfY29tbW9uX3B0cikgZGluZm8pOworCisgIGdfYXNzZXJ0ICgqaHRibHB0cik7CisKKyAgLyogQ29weSB0aGUgbnVtYmVyLW9mLXN5bWJvbHMtb2YtZWFjaC1jb2RlLWxlbmd0aCBjb3VudHMgKi8KKyAgbWVtY3B5ICgoKmh0YmxwdHIpLT5iaXRzLCBiaXRzLCBzaXplb2YgKCgqaHRibHB0ciktPmJpdHMpKTsKKworICAvKiBWYWxpZGF0ZSB0aGUgY291bnRzLiAgV2UgZG8gdGhpcyBoZXJlIG1haW5seSBzbyB3ZSBjYW4gY29weSB0aGUgcmlnaHQKKyAgICogbnVtYmVyIG9mIHN5bWJvbHMgZnJvbSB0aGUgdmFsW10gYXJyYXksIHdpdGhvdXQgcmlza2luZyBtYXJjaGluZyBvZmYKKyAgICogdGhlIGVuZCBvZiBtZW1vcnkuICBqY2h1ZmYuYyB3aWxsIGRvIGEgbW9yZSB0aG9yb3VnaCB0ZXN0IGxhdGVyLgorICAgKi8KKyAgbnN5bWJvbHMgPSAwOworICBmb3IgKGxlbiA9IDE7IGxlbiA8PSAxNjsgbGVuKyspCisgICAgbnN5bWJvbHMgKz0gYml0c1tsZW5dOworICBpZiAobnN5bWJvbHMgPCAxIHx8IG5zeW1ib2xzID4gMjU2KQorICAgIGdfZXJyb3IgKCJqcGVndXRpbHMuYzogIGFkZF9odWZmX3RhYmxlIGZhaWxlZCBiYWRseS4gIik7CisKKyAgbWVtY3B5ICgoKmh0YmxwdHIpLT5odWZmdmFsLCB2YWwsIG5zeW1ib2xzICogc2l6ZW9mIChVSU5UOCkpOworfQorCisKKworc3RhdGljIHZvaWQKK3N0ZF9odWZmX3RhYmxlcyAoal9kZWNvbXByZXNzX3B0ciBkaW5mbykKKy8qIFNldCB1cCB0aGUgc3RhbmRhcmQgSHVmZm1hbiB0YWJsZXMgKGNmLiBKUEVHIHN0YW5kYXJkIHNlY3Rpb24gSy4zKSAqLworLyogSU1QT1JUQU5UOiB0aGVzZSBhcmUgb25seSB2YWxpZCBmb3IgOC1iaXQgZGF0YSBwcmVjaXNpb24hICovCit7CisgIHN0YXRpYyBjb25zdCBVSU5UOCBiaXRzX2RjX2x1bWluYW5jZVsxN10gPQorICAgICAgeyAvKiAwLWJhc2UgKi8gMCwgMCwgMSwgNSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworICBzdGF0aWMgY29uc3QgVUlOVDggdmFsX2RjX2x1bWluYW5jZVtdID0KKyAgICAgIHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExIH07CisKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IGJpdHNfZGNfY2hyb21pbmFuY2VbMTddID0KKyAgICAgIHsgLyogMC1iYXNlICovIDAsIDAsIDMsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAgfTsKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IHZhbF9kY19jaHJvbWluYW5jZVtdID0KKyAgICAgIHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExIH07CisKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IGJpdHNfYWNfbHVtaW5hbmNlWzE3XSA9CisgICAgICB7IC8qIDAtYmFzZSAqLyAwLCAwLCAyLCAxLCAzLCAzLCAyLCA0LCAzLCA1LCA1LCA0LCA0LCAwLCAwLCAxLCAweDdkIH07CisgIHN0YXRpYyBjb25zdCBVSU5UOCB2YWxfYWNfbHVtaW5hbmNlW10gPQorICAgICAgeyAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLAorICAgIDB4MjEsIDB4MzEsIDB4NDEsIDB4MDYsIDB4MTMsIDB4NTEsIDB4NjEsIDB4MDcsCisgICAgMHgyMiwgMHg3MSwgMHgxNCwgMHgzMiwgMHg4MSwgMHg5MSwgMHhhMSwgMHgwOCwKKyAgICAweDIzLCAweDQyLCAweGIxLCAweGMxLCAweDE1LCAweDUyLCAweGQxLCAweGYwLAorICAgIDB4MjQsIDB4MzMsIDB4NjIsIDB4NzIsIDB4ODIsIDB4MDksIDB4MGEsIDB4MTYsCisgICAgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwKKyAgICAweDI5LCAweDJhLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LAorICAgIDB4M2EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksCisgICAgMHg0YSwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwKKyAgICAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LAorICAgIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksCisgICAgMHg3YSwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwKKyAgICAweDhhLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LAorICAgIDB4OTksIDB4OWEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsCisgICAgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwKKyAgICAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LAorICAgIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4ZDIsIDB4ZDMsIDB4ZDQsCisgICAgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhlMSwgMHhlMiwKKyAgICAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLAorICAgIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsCisgICAgMHhmOSwgMHhmYQorICB9OworCisgIHN0YXRpYyBjb25zdCBVSU5UOCBiaXRzX2FjX2Nocm9taW5hbmNlWzE3XSA9CisgICAgICB7IC8qIDAtYmFzZSAqLyAwLCAwLCAyLCAxLCAyLCA0LCA0LCAzLCA0LCA3LCA1LCA0LCA0LCAwLCAxLCAyLCAweDc3IH07CisgIHN0YXRpYyBjb25zdCBVSU5UOCB2YWxfYWNfY2hyb21pbmFuY2VbXSA9CisgICAgICB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MTEsIDB4MDQsIDB4MDUsIDB4MjEsCisgICAgMHgzMSwgMHgwNiwgMHgxMiwgMHg0MSwgMHg1MSwgMHgwNywgMHg2MSwgMHg3MSwKKyAgICAweDEzLCAweDIyLCAweDMyLCAweDgxLCAweDA4LCAweDE0LCAweDQyLCAweDkxLAorICAgIDB4YTEsIDB4YjEsIDB4YzEsIDB4MDksIDB4MjMsIDB4MzMsIDB4NTIsIDB4ZjAsCisgICAgMHgxNSwgMHg2MiwgMHg3MiwgMHhkMSwgMHgwYSwgMHgxNiwgMHgyNCwgMHgzNCwKKyAgICAweGUxLCAweDI1LCAweGYxLCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDI2LAorICAgIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsCisgICAgMHgzOSwgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwKKyAgICAweDQ5LCAweDRhLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LAorICAgIDB4NTksIDB4NWEsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsCisgICAgMHg2OSwgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwKKyAgICAweDc5LCAweDdhLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LAorICAgIDB4ODgsIDB4ODksIDB4OGEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsCisgICAgMHg5NywgMHg5OCwgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwKKyAgICAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LAorICAgIDB4YjUsIDB4YjYsIDB4YjcsIDB4YjgsIDB4YjksIDB4YmEsIDB4YzIsIDB4YzMsCisgICAgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgMHhjOCwgMHhjOSwgMHhjYSwgMHhkMiwKKyAgICAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLAorICAgIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIDB4ZTgsIDB4ZTksCisgICAgMHhlYSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwKKyAgICAweGY5LCAweGZhCisgIH07CisKKyAgYWRkX2h1ZmZfdGFibGUgKGRpbmZvLCAmZGluZm8tPmRjX2h1ZmZfdGJsX3B0cnNbMF0sCisgICAgICBiaXRzX2RjX2x1bWluYW5jZSwgdmFsX2RjX2x1bWluYW5jZSk7CisgIGFkZF9odWZmX3RhYmxlIChkaW5mbywgJmRpbmZvLT5hY19odWZmX3RibF9wdHJzWzBdLAorICAgICAgYml0c19hY19sdW1pbmFuY2UsIHZhbF9hY19sdW1pbmFuY2UpOworICBhZGRfaHVmZl90YWJsZSAoZGluZm8sICZkaW5mby0+ZGNfaHVmZl90YmxfcHRyc1sxXSwKKyAgICAgIGJpdHNfZGNfY2hyb21pbmFuY2UsIHZhbF9kY19jaHJvbWluYW5jZSk7CisgIGFkZF9odWZmX3RhYmxlIChkaW5mbywgJmRpbmZvLT5hY19odWZmX3RibF9wdHJzWzFdLAorICAgICAgYml0c19hY19jaHJvbWluYW5jZSwgdmFsX2FjX2Nocm9taW5hbmNlKTsKK30KKworCisKK3N0YXRpYyB2b2lkCitndWFyYW50ZWVfaHVmZl90YWJsZXMgKGpfZGVjb21wcmVzc19wdHIgZGluZm8pCit7CisgIGlmICgoZGluZm8tPmRjX2h1ZmZfdGJsX3B0cnNbMF0gPT0gTlVMTCkgJiYKKyAgICAgIChkaW5mby0+ZGNfaHVmZl90YmxfcHRyc1sxXSA9PSBOVUxMKSAmJgorICAgICAgKGRpbmZvLT5hY19odWZmX3RibF9wdHJzWzBdID09IE5VTEwpICYmCisgICAgICAoZGluZm8tPmFjX2h1ZmZfdGJsX3B0cnNbMV0gPT0gTlVMTCkpIHsKKyAgICBHU1RfREVCVUcgKCJHZW5lcmF0aW5nIHN0YW5kYXJkIEh1ZmZtYW4gdGFibGVzIGZvciB0aGlzIGZyYW1lLiIpOworICAgIHN0ZF9odWZmX3RhYmxlcyAoZGluZm8pOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2pwZWdfZGVjX3NldF9mb3JtYXQgKEdzdFZpZGVvRGVjb2RlciAqIGRlYywgR3N0VmlkZW9Db2RlY1N0YXRlICogc3RhdGUpCit7CisgIEdzdEpwZWdEZWMgKmpwZWcgPSBHU1RfSlBFR19ERUMgKGRlYyk7CisKKyAgaWYgKGpwZWctPmlucHV0X3N0YXRlKQorICAgIGdzdF92aWRlb19jb2RlY19zdGF0ZV91bnJlZiAoanBlZy0+aW5wdXRfc3RhdGUpOworICBqcGVnLT5pbnB1dF9zdGF0ZSA9IGdzdF92aWRlb19jb2RlY19zdGF0ZV9yZWYgKHN0YXRlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKiB5dWsgKi8KK3N0YXRpYyB2b2lkCitocmVzYW1wbGVjcHkxIChndWludDggKiBkZXN0LCBjb25zdCBndWludDggKiBzcmMsIGd1aW50IGxlbikKK3sKKyAgZ2ludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgIC8qIGVxdWl2YWxlbnQgdG86IGRlc3RbaV0gPSBzcmNbaSA8PCAxXSAqLworICAgICpkZXN0ID0gKnNyYzsKKyAgICArK2Rlc3Q7CisgICAgKytzcmM7CisgICAgKytzcmM7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9qcGVnX2RlY19mcmVlX2J1ZmZlcnMgKEdzdEpwZWdEZWMgKiBkZWMpCit7CisgIGdpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgIGdfZnJlZSAoZGVjLT5pZHJfeVtpXSk7CisgICAgZ19mcmVlIChkZWMtPmlkcl91W2ldKTsKKyAgICBnX2ZyZWUgKGRlYy0+aWRyX3ZbaV0pOworICAgIGRlYy0+aWRyX3lbaV0gPSBOVUxMOworICAgIGRlYy0+aWRyX3VbaV0gPSBOVUxMOworICAgIGRlYy0+aWRyX3ZbaV0gPSBOVUxMOworICB9CisKKyAgZGVjLT5pZHJfd2lkdGhfYWxsb2NhdGVkID0gMDsKK30KKworc3RhdGljIGlubGluZSBnYm9vbGVhbgorZ3N0X2pwZWdfZGVjX2Vuc3VyZV9idWZmZXJzIChHc3RKcGVnRGVjICogZGVjLCBndWludCBtYXhyb3dieXRlcykKK3sKKyAgZ2ludCBpOworCisgIGlmIChHX0xJS0VMWSAoZGVjLT5pZHJfd2lkdGhfYWxsb2NhdGVkID09IG1heHJvd2J5dGVzKSkKKyAgICByZXR1cm4gVFJVRTsKKworICAvKiBGSVhNRTogbWF5YmUganVzdCBhbGxvYyBvbmUgb3IgdGhyZWUgYmxvY2tzIGFsdG9nZXRoZXI/ICovCisgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgZGVjLT5pZHJfeVtpXSA9IGdfdHJ5X3JlYWxsb2MgKGRlYy0+aWRyX3lbaV0sIG1heHJvd2J5dGVzKTsKKyAgICBkZWMtPmlkcl91W2ldID0gZ190cnlfcmVhbGxvYyAoZGVjLT5pZHJfdVtpXSwgbWF4cm93Ynl0ZXMpOworICAgIGRlYy0+aWRyX3ZbaV0gPSBnX3RyeV9yZWFsbG9jIChkZWMtPmlkcl92W2ldLCBtYXhyb3dieXRlcyk7CisKKyAgICBpZiAoR19VTkxJS0VMWSAoIWRlYy0+aWRyX3lbaV0gfHwgIWRlYy0+aWRyX3VbaV0gfHwgIWRlYy0+aWRyX3ZbaV0pKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlYywgIm91dCBvZiBtZW1vcnksIGk9JWQsIGJ5dGVzPSV1IiwgaSwgbWF4cm93Ynl0ZXMpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorCisgIGRlYy0+aWRyX3dpZHRoX2FsbG9jYXRlZCA9IG1heHJvd2J5dGVzOworICBHU1RfTE9HX09CSkVDVCAoZGVjLCAiYWxsb2NhdGVkIHRlbXAgbWVtb3J5LCAldSBieXRlcy9yb3ciLCBtYXhyb3dieXRlcyk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdfZGVjX2RlY29kZV9ncmF5c2NhbGUgKEdzdEpwZWdEZWMgKiBkZWMsIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSwKKyAgICBndWludCBmaWVsZCwgZ3VpbnQgbnVtX2ZpZWxkcykKK3sKKyAgZ3VjaGFyICpyb3dzWzE2XTsKKyAgZ3VjaGFyICoqc2NhbmFycmF5WzFdID0geyByb3dzIH07CisgIGdpbnQgaSwgaiwgazsKKyAgZ2ludCBsaW5lczsKKyAgZ3VpbnQ4ICpiYXNlWzFdOworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgcHN0cmlkZSwgcnN0cmlkZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZWMsICJpbmRpcmVjdCBkZWNvZGluZyBvZiBncmF5c2NhbGUiKTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChmcmFtZSkgLyBudW1fZmllbGRzOworCisgIGlmIChHX1VOTElLRUxZICghZ3N0X2pwZWdfZGVjX2Vuc3VyZV9idWZmZXJzIChkZWMsIEdTVF9ST1VORF9VUF8zMiAod2lkdGgpKSkpCisgICAgcmV0dXJuOworCisgIGJhc2VbMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZSwgMCk7CisgIGlmIChmaWVsZCA9PSAyKSB7CisgICAgYmFzZVswXSArPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAwKTsKKyAgfQorCisgIHBzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFIChmcmFtZSwgMCk7CisgIHJzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAwKSAqIG51bV9maWVsZHM7CisKKyAgbWVtY3B5IChyb3dzLCBkZWMtPmlkcl95LCAxNiAqIHNpemVvZiAoZ3BvaW50ZXIpKTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBoZWlnaHQpIHsKKyAgICBsaW5lcyA9IGpwZWdfcmVhZF9yYXdfZGF0YSAoJmRlYy0+Y2luZm8sIHNjYW5hcnJheSwgRENUU0laRSk7CisgICAgaWYgKEdfTElLRUxZIChsaW5lcyA+IDApKSB7CisgICAgICBmb3IgKGogPSAwOyAoaiA8IERDVFNJWkUpICYmIChpIDwgaGVpZ2h0KTsgaisrLCBpKyspIHsKKyAgICAgICAgZ2ludCBwOworCisgICAgICAgIHAgPSAwOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgd2lkdGg7IGsrKykgeworICAgICAgICAgIGJhc2VbMF1bcF0gPSByb3dzW2pdW2tdOworICAgICAgICAgIHAgKz0gcHN0cmlkZTsKKyAgICAgICAgfQorICAgICAgICBiYXNlWzBdICs9IHJzdHJpZGU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoZGVjLCAianBlZ19yZWFkX3Jhd19kYXRhKCkgcmV0dXJuZWQgMCIpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdfZGVjX2RlY29kZV9yZ2IgKEdzdEpwZWdEZWMgKiBkZWMsIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSwKKyAgICBndWludCBmaWVsZCwgZ3VpbnQgbnVtX2ZpZWxkcykKK3sKKyAgZ3VjaGFyICpyX3Jvd3NbMTZdLCAqZ19yb3dzWzE2XSwgKmJfcm93c1sxNl07CisgIGd1Y2hhciAqKnNjYW5hcnJheVszXSA9IHsgcl9yb3dzLCBnX3Jvd3MsIGJfcm93cyB9OworICBnaW50IGksIGosIGs7CisgIGdpbnQgbGluZXM7CisgIGd1aW50OCAqYmFzZVszXTsKKyAgZ3VpbnQgcHN0cmlkZSwgcnN0cmlkZTsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlYywgImluZGlyZWN0IGRlY29kaW5nIG9mIFJHQiIpOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChmcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGZyYW1lKSAvIG51bV9maWVsZHM7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFnc3RfanBlZ19kZWNfZW5zdXJlX2J1ZmZlcnMgKGRlYywgR1NUX1JPVU5EX1VQXzMyICh3aWR0aCkpKSkKKyAgICByZXR1cm47CisKKyAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgIGJhc2VbaV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZSwgaSk7CisgICAgaWYgKGZpZWxkID09IDIpCisgICAgICBiYXNlW2ldICs9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUsIGkpOworICB9CisKKyAgcHN0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BTVFJJREUgKGZyYW1lLCAwKTsKKyAgcnN0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUsIDApICogbnVtX2ZpZWxkczsKKworICBtZW1jcHkgKHJfcm93cywgZGVjLT5pZHJfeSwgMTYgKiBzaXplb2YgKGdwb2ludGVyKSk7CisgIG1lbWNweSAoZ19yb3dzLCBkZWMtPmlkcl91LCAxNiAqIHNpemVvZiAoZ3BvaW50ZXIpKTsKKyAgbWVtY3B5IChiX3Jvd3MsIGRlYy0+aWRyX3YsIDE2ICogc2l6ZW9mIChncG9pbnRlcikpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IGhlaWdodCkgeworICAgIGxpbmVzID0ganBlZ19yZWFkX3Jhd19kYXRhICgmZGVjLT5jaW5mbywgc2NhbmFycmF5LCBEQ1RTSVpFKTsKKyAgICBpZiAoR19MSUtFTFkgKGxpbmVzID4gMCkpIHsKKyAgICAgIGZvciAoaiA9IDA7IChqIDwgRENUU0laRSkgJiYgKGkgPCBoZWlnaHQpOyBqKyssIGkrKykgeworICAgICAgICBnaW50IHA7CisKKyAgICAgICAgcCA9IDA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCB3aWR0aDsgaysrKSB7CisgICAgICAgICAgYmFzZVswXVtwXSA9IHJfcm93c1tqXVtrXTsKKyAgICAgICAgICBiYXNlWzFdW3BdID0gZ19yb3dzW2pdW2tdOworICAgICAgICAgIGJhc2VbMl1bcF0gPSBiX3Jvd3Nbal1ba107CisgICAgICAgICAgcCArPSBwc3RyaWRlOworICAgICAgICB9CisgICAgICAgIGJhc2VbMF0gKz0gcnN0cmlkZTsKKyAgICAgICAgYmFzZVsxXSArPSByc3RyaWRlOworICAgICAgICBiYXNlWzJdICs9IHJzdHJpZGU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoZGVjLCAianBlZ19yZWFkX3Jhd19kYXRhKCkgcmV0dXJuZWQgMCIpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdfZGVjX2RlY29kZV9pbmRpcmVjdCAoR3N0SnBlZ0RlYyAqIGRlYywgR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBnaW50IHJfdiwKKyAgICBnaW50IHJfaCwgZ2ludCBjb21wLCBndWludCBmaWVsZCwgZ3VpbnQgbnVtX2ZpZWxkcykKK3sKKyAgZ3VjaGFyICp5X3Jvd3NbMTZdLCAqdV9yb3dzWzE2XSwgKnZfcm93c1sxNl07CisgIGd1Y2hhciAqKnNjYW5hcnJheVszXSA9IHsgeV9yb3dzLCB1X3Jvd3MsIHZfcm93cyB9OworICBnaW50IGksIGosIGs7CisgIGdpbnQgbGluZXM7CisgIGd1Y2hhciAqYmFzZVszXSwgKmxhc3RbM107CisgIGdpbnQgcm93c2l6ZVszXSwgc3RyaWRlWzNdOworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVjLAorICAgICAgInVuYWR2YW50YWdlb3VzIHdpZHRoIG9yIHJfaCwgdGFraW5nIHNsb3cgcm91dGUgaW52b2x2aW5nIG1lbWNweSIpOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChmcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGZyYW1lKTsKKworICBpZiAoR19VTkxJS0VMWSAoIWdzdF9qcGVnX2RlY19lbnN1cmVfYnVmZmVycyAoZGVjLCBHU1RfUk9VTkRfVVBfMzIgKHdpZHRoKSkpKQorICAgIHJldHVybjsKKworICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgYmFzZVtpXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lLCBpKTsKKyAgICBzdHJpZGVbaV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCBpKSAqIG51bV9maWVsZHM7CisgICAgcm93c2l6ZVtpXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUsIGkpOworICAgIC8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBtYWtlIGpwZWdsaWIgd3JpdGUgYmV5b25kIG91ciBidWZmZXIsCisgICAgICogd2hpY2ggbWlnaHQgaGFwcGVuIGlmIChoZWlnaHQgJSAocl92KkRDVFNJWkUpKSAhPSAwICovCisgICAgbGFzdFtpXSA9IGJhc2VbaV0gKyAoR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChmcmFtZSwgaSkgKgorICAgICAgICAoR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChmcmFtZSwgaSkgLSAxKSk7CisKKyAgICBpZiAoZmllbGQgPT0gMikgeworICAgICAgYmFzZVtpXSArPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCBpKTsKKyAgICB9CisgIH0KKworICBtZW1jcHkgKHlfcm93cywgZGVjLT5pZHJfeSwgMTYgKiBzaXplb2YgKGdwb2ludGVyKSk7CisgIG1lbWNweSAodV9yb3dzLCBkZWMtPmlkcl91LCAxNiAqIHNpemVvZiAoZ3BvaW50ZXIpKTsKKyAgbWVtY3B5ICh2X3Jvd3MsIGRlYy0+aWRyX3YsIDE2ICogc2l6ZW9mIChncG9pbnRlcikpOworCisgIC8qIGZpbGwgY2hyb21hIGNvbXBvbmVudHMgZm9yIGdyYXlzY2FsZSAqLworICBpZiAoY29tcCA9PSAxKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVjLCAiZ3JheXNjYWxlLCBmaWxsaW5nIGNocm9tYSIpOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICBtZW1zZXQgKHVfcm93c1tpXSwgR1NUX1JPVU5EX1VQXzMyICh3aWR0aCksIDB4ODApOworICAgICAgbWVtc2V0ICh2X3Jvd3NbaV0sIEdTVF9ST1VORF9VUF8zMiAod2lkdGgpLCAweDgwKTsKKyAgICB9CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpICs9IHJfdiAqIERDVFNJWkUpIHsKKyAgICBsaW5lcyA9IGpwZWdfcmVhZF9yYXdfZGF0YSAoJmRlYy0+Y2luZm8sIHNjYW5hcnJheSwgcl92ICogRENUU0laRSk7CisgICAgaWYgKEdfTElLRUxZIChsaW5lcyA+IDApKSB7CisgICAgICBmb3IgKGogPSAwLCBrID0gMDsgaiA8IChyX3YgKiBEQ1RTSVpFKTsgaiArPSByX3YsIGsrKykgeworICAgICAgICBpZiAoR19MSUtFTFkgKGJhc2VbMF0gPD0gbGFzdFswXSkpIHsKKyAgICAgICAgICBtZW1jcHkgKGJhc2VbMF0sIHlfcm93c1tqXSwgcm93c2l6ZVswXSk7CisgICAgICAgICAgYmFzZVswXSArPSBzdHJpZGVbMF07CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJfdiA9PSAyKSB7CisgICAgICAgICAgaWYgKEdfTElLRUxZIChiYXNlWzBdIDw9IGxhc3RbMF0pKSB7CisgICAgICAgICAgICBtZW1jcHkgKGJhc2VbMF0sIHlfcm93c1tqICsgMV0sIHJvd3NpemVbMF0pOworICAgICAgICAgICAgYmFzZVswXSArPSBzdHJpZGVbMF07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChHX0xJS0VMWSAoYmFzZVsxXSA8PSBsYXN0WzFdICYmIGJhc2VbMl0gPD0gbGFzdFsyXSkpIHsKKyAgICAgICAgICBpZiAocl9oID09IDIpIHsKKyAgICAgICAgICAgIG1lbWNweSAoYmFzZVsxXSwgdV9yb3dzW2tdLCByb3dzaXplWzFdKTsKKyAgICAgICAgICAgIG1lbWNweSAoYmFzZVsyXSwgdl9yb3dzW2tdLCByb3dzaXplWzJdKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHJfaCA9PSAxKSB7CisgICAgICAgICAgICBocmVzYW1wbGVjcHkxIChiYXNlWzFdLCB1X3Jvd3Nba10sIHJvd3NpemVbMV0pOworICAgICAgICAgICAgaHJlc2FtcGxlY3B5MSAoYmFzZVsyXSwgdl9yb3dzW2tdLCByb3dzaXplWzJdKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogRklYTUU6IGltcGxlbWVudCAoYXQgbGVhc3Qgd2UgYXZvaWQgY3Jhc2hpbmcgYnkgZG9pbmcgbm90aGluZykgKi8KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocl92ID09IDIgfHwgKGsgJiAxKSAhPSAwKSB7CisgICAgICAgICAgYmFzZVsxXSArPSBzdHJpZGVbMV07CisgICAgICAgICAgYmFzZVsyXSArPSBzdHJpZGVbMl07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgR1NUX0lORk9fT0JKRUNUIChkZWMsICJqcGVnX3JlYWRfcmF3X2RhdGEoKSByZXR1cm5lZCAwIik7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfanBlZ19kZWNfZGVjb2RlX2RpcmVjdCAoR3N0SnBlZ0RlYyAqIGRlYywgR3N0VmlkZW9GcmFtZSAqIGZyYW1lLAorICAgIGd1aW50IGZpZWxkLCBndWludCBudW1fZmllbGRzKQoreworICBndWNoYXIgKipsaW5lWzNdOyAgICAgICAgICAgICAvKiB0aGUganBlZyBsaW5lIGJ1ZmZlciAgICAgICAgICovCisgIGd1Y2hhciAqeVs0ICogRENUU0laRV0gPSB7IE5VTEwsIH07ICAgLyogYWxsb2MgZW5vdWdoIGZvciB0aGUgbGluZXMgICAqLworICBndWNoYXIgKnVbNCAqIERDVFNJWkVdID0geyBOVUxMLCB9OyAgIC8qIHJfdiB3aWxsIGJlIDw0ICAgICAgICAgICAgICAgKi8KKyAgZ3VjaGFyICp2WzQgKiBEQ1RTSVpFXSA9IHsgTlVMTCwgfTsKKyAgZ2ludCBpLCBqOworICBnaW50IGxpbmVzLCB2X3NhbXBbM107CisgIGd1Y2hhciAqYmFzZVszXSwgKmxhc3RbM107CisgIGdpbnQgc3RyaWRlWzNdOworICBndWludCBoZWlnaHQ7CisKKyAgbGluZVswXSA9IHk7CisgIGxpbmVbMV0gPSB1OworICBsaW5lWzJdID0gdjsKKworICB2X3NhbXBbMF0gPSBkZWMtPmNpbmZvLmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yOworICB2X3NhbXBbMV0gPSBkZWMtPmNpbmZvLmNvbXBfaW5mb1sxXS52X3NhbXBfZmFjdG9yOworICB2X3NhbXBbMl0gPSBkZWMtPmNpbmZvLmNvbXBfaW5mb1syXS52X3NhbXBfZmFjdG9yOworCisgIGlmIChHX1VOTElLRUxZICh2X3NhbXBbMF0gPiAyIHx8IHZfc2FtcFsxXSA+IDIgfHwgdl9zYW1wWzJdID4gMikpCisgICAgZ290byBmb3JtYXRfbm90X3N1cHBvcnRlZDsKKworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChmcmFtZSk7CisKKyAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgIGJhc2VbaV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZSwgaSk7CisgICAgc3RyaWRlW2ldID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChmcmFtZSwgaSkgKiBudW1fZmllbGRzOworICAgIC8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBtYWtlIGpwZWdsaWIgd3JpdGUgYmV5b25kIG91ciBidWZmZXIsCisgICAgICogd2hpY2ggbWlnaHQgaGFwcGVuIGlmIChoZWlnaHQgJSAocl92KkRDVFNJWkUpKSAhPSAwICovCisgICAgbGFzdFtpXSA9IGJhc2VbaV0gKyAoR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChmcmFtZSwgaSkgKgorICAgICAgICAoR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChmcmFtZSwgaSkgLSAxKSk7CisKKyAgICBpZiAoZmllbGQgPT0gMikgeworICAgICAgYmFzZVtpXSArPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCBpKTsKKyAgICB9CisgIH0KKworICAvKiBsZXQganBlZ2xpYiBkZWNvZGUgZGlyZWN0bHkgaW50byBvdXIgZmluYWwgYnVmZmVyICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlYywgImRlY29kaW5nIGRpcmVjdGx5IGludG8gb3V0cHV0IGJ1ZmZlciIpOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkgKz0gdl9zYW1wWzBdICogRENUU0laRSkgeworICAgIGZvciAoaiA9IDA7IGogPCAodl9zYW1wWzBdICogRENUU0laRSk7ICsraikgeworICAgICAgLyogWSAqLworICAgICAgbGluZVswXVtqXSA9IGJhc2VbMF0gKyAoaSArIGopICogc3RyaWRlWzBdOworICAgICAgaWYgKEdfVU5MSUtFTFkgKGxpbmVbMF1bal0gPiBsYXN0WzBdKSkKKyAgICAgICAgbGluZVswXVtqXSA9IGxhc3RbMF07CisgICAgICAvKiBVICovCisgICAgICBpZiAodl9zYW1wWzFdID09IHZfc2FtcFswXSkgeworICAgICAgICBsaW5lWzFdW2pdID0gYmFzZVsxXSArICgoaSArIGopIC8gMikgKiBzdHJpZGVbMV07CisgICAgICB9IGVsc2UgaWYgKGogPCAodl9zYW1wWzFdICogRENUU0laRSkpIHsKKyAgICAgICAgbGluZVsxXVtqXSA9IGJhc2VbMV0gKyAoKGkgLyAyKSArIGopICogc3RyaWRlWzFdOworICAgICAgfQorICAgICAgaWYgKEdfVU5MSUtFTFkgKGxpbmVbMV1bal0gPiBsYXN0WzFdKSkKKyAgICAgICAgbGluZVsxXVtqXSA9IGxhc3RbMV07CisgICAgICAvKiBWICovCisgICAgICBpZiAodl9zYW1wWzJdID09IHZfc2FtcFswXSkgeworICAgICAgICBsaW5lWzJdW2pdID0gYmFzZVsyXSArICgoaSArIGopIC8gMikgKiBzdHJpZGVbMl07CisgICAgICB9IGVsc2UgaWYgKGogPCAodl9zYW1wWzJdICogRENUU0laRSkpIHsKKyAgICAgICAgbGluZVsyXVtqXSA9IGJhc2VbMl0gKyAoKGkgLyAyKSArIGopICogc3RyaWRlWzJdOworICAgICAgfQorICAgICAgaWYgKEdfVU5MSUtFTFkgKGxpbmVbMl1bal0gPiBsYXN0WzJdKSkKKyAgICAgICAgbGluZVsyXVtqXSA9IGxhc3RbMl07CisgICAgfQorCisgICAgbGluZXMgPSBqcGVnX3JlYWRfcmF3X2RhdGEgKCZkZWMtPmNpbmZvLCBsaW5lLCB2X3NhbXBbMF0gKiBEQ1RTSVpFKTsKKyAgICBpZiAoR19VTkxJS0VMWSAoIWxpbmVzKSkgeworICAgICAgR1NUX0lORk9fT0JKRUNUIChkZWMsICJqcGVnX3JlYWRfcmF3X2RhdGEoKSByZXR1cm5lZCAwIik7CisgICAgfQorICB9CisgIHJldHVybiBHU1RfRkxPV19PSzsKKworZm9ybWF0X25vdF9zdXBwb3J0ZWQ6CisgIHsKKyAgICBnYm9vbGVhbiByZXQgPSBHU1RfRkxPV19PSzsKKworICAgIEdTVF9WSURFT19ERUNPREVSX0VSUk9SIChkZWMsIDEsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoXygiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIikpLAorICAgICAgICAoIlVuc3VwcG9ydGVkIHN1YnNhbXBsaW5nIHNjaGVtYTogdl9zYW1wIGZhY3RvcnM6ICV1ICV1ICV1Iiwgdl9zYW1wWzBdLAorICAgICAgICAgICAgdl9zYW1wWzFdLCB2X3NhbXBbMl0pLCByZXQpOworCisgICAgcmV0dXJuIHJldDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdfZGVjX25lZ290aWF0ZSAoR3N0SnBlZ0RlYyAqIGRlYywgZ2ludCB3aWR0aCwgZ2ludCBoZWlnaHQsIGdpbnQgY2xyc3BjLAorICAgIGdib29sZWFuIGludGVybGFjZWQpCit7CisgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqb3V0c3RhdGU7CisgIEdzdFZpZGVvSW5mbyAqaW5mbzsKKyAgR3N0VmlkZW9Gb3JtYXQgZm9ybWF0OworCisgIHN3aXRjaCAoY2xyc3BjKSB7CisgICAgY2FzZSBKQ1NfUkdCOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9SR0I7CisgICAgICBicmVhazsKKyAgICBjYXNlIEpDU19HUkFZU0NBTEU6CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX0dSQVk4OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfSTQyMDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogQ29tcGFyZSB0byBjdXJyZW50bHkgY29uZmlndXJlZCBvdXRwdXQgc3RhdGUgKi8KKyAgb3V0c3RhdGUgPSBnc3RfdmlkZW9fZGVjb2Rlcl9nZXRfb3V0cHV0X3N0YXRlIChHU1RfVklERU9fREVDT0RFUiAoZGVjKSk7CisgIGlmIChvdXRzdGF0ZSkgeworICAgIGluZm8gPSAmb3V0c3RhdGUtPmluZm87CisKKyAgICBpZiAod2lkdGggPT0gR1NUX1ZJREVPX0lORk9fV0lEVEggKGluZm8pICYmCisgICAgICAgIGhlaWdodCA9PSBHU1RfVklERU9fSU5GT19IRUlHSFQgKGluZm8pICYmCisgICAgICAgIGZvcm1hdCA9PSBHU1RfVklERU9fSU5GT19GT1JNQVQgKGluZm8pKSB7CisgICAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKG91dHN0YXRlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChvdXRzdGF0ZSk7CisgIH0KKworICBvdXRzdGF0ZSA9CisgICAgICBnc3RfdmlkZW9fZGVjb2Rlcl9zZXRfb3V0cHV0X3N0YXRlIChHU1RfVklERU9fREVDT0RFUiAoZGVjKSwgZm9ybWF0LAorICAgICAgd2lkdGgsIGhlaWdodCwgZGVjLT5pbnB1dF9zdGF0ZSk7CisKKyAgc3dpdGNoIChjbHJzcGMpIHsKKyAgICBjYXNlIEpDU19SR0I6CisgICAgY2FzZSBKQ1NfR1JBWVNDQUxFOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG91dHN0YXRlLT5pbmZvLmNvbG9yaW1ldHJ5LnJhbmdlID0gR1NUX1ZJREVPX0NPTE9SX1JBTkdFXzBfMjU1OworICAgICAgb3V0c3RhdGUtPmluZm8uY29sb3JpbWV0cnkubWF0cml4ID0gR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9CVDYwMTsKKyAgICAgIG91dHN0YXRlLT5pbmZvLmNvbG9yaW1ldHJ5LnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX1VOS05PV047CisgICAgICBvdXRzdGF0ZS0+aW5mby5jb2xvcmltZXRyeS5wcmltYXJpZXMgPSBHU1RfVklERU9fQ09MT1JfUFJJTUFSSUVTX1VOS05PV047CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChpbnRlcmxhY2VkKSB7CisgICAgb3V0c3RhdGUtPmluZm8uaW50ZXJsYWNlX21vZGUgPSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfSU5URVJMRUFWRUQ7CisgICAgR1NUX1ZJREVPX0lORk9fRklFTERfT1JERVIgKCZvdXRzdGF0ZS0+aW5mbykgPQorICAgICAgICBHU1RfVklERU9fRklFTERfT1JERVJfVE9QX0ZJRUxEX0ZJUlNUOworICB9CisKKyAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChvdXRzdGF0ZSk7CisKKyAgZ3N0X3ZpZGVvX2RlY29kZXJfbmVnb3RpYXRlIChHU1RfVklERU9fREVDT0RFUiAoZGVjKSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVjLCAibWF4X3Zfc2FtcF9mYWN0b3I9JWQiLCBkZWMtPmNpbmZvLm1heF92X3NhbXBfZmFjdG9yKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVjLCAibWF4X2hfc2FtcF9mYWN0b3I9JWQiLCBkZWMtPmNpbmZvLm1heF9oX3NhbXBfZmFjdG9yKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9qcGVnX2RlY19wcmVwYXJlX2RlY29kZSAoR3N0SnBlZ0RlYyAqIGRlYykKK3sKKyAgR19HTlVDX1VOVVNFRCBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ3VpbnQgcl9oLCByX3YsIGhkcl9vazsKKworICAvKiByZWFkIGhlYWRlciAqLworICBoZHJfb2sgPSBqcGVnX3JlYWRfaGVhZGVyICgmZGVjLT5jaW5mbywgVFJVRSk7CisgIGlmIChHX1VOTElLRUxZIChoZHJfb2sgIT0gSlBFR19IRUFERVJfT0spKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZWMsICJyZWFkaW5nIHRoZSBoZWFkZXIgZmFpbGVkLCAlZCIsIGhkcl9vayk7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAoZGVjLCAibnVtX2NvbXBvbmVudHM9JWQiLCBkZWMtPmNpbmZvLm51bV9jb21wb25lbnRzKTsKKyAgR1NUX0xPR19PQkpFQ1QgKGRlYywgImpwZWdfY29sb3Jfc3BhY2U9JWQiLCBkZWMtPmNpbmZvLmpwZWdfY29sb3Jfc3BhY2UpOworCisgIGlmICghZGVjLT5jaW5mby5udW1fY29tcG9uZW50cyB8fCAhZGVjLT5jaW5mby5jb21wX2luZm8pCisgICAgZ290byBjb21wb25lbnRzX25vdF9zdXBwb3J0ZWQ7CisKKyAgcl9oID0gZGVjLT5jaW5mby5jb21wX2luZm9bMF0uaF9zYW1wX2ZhY3RvcjsKKyAgcl92ID0gZGVjLT5jaW5mby5jb21wX2luZm9bMF0udl9zYW1wX2ZhY3RvcjsKKworICBHU1RfTE9HX09CSkVDVCAoZGVjLCAicl9oID0gJWQsIHJfdiA9ICVkIiwgcl9oLCByX3YpOworCisgIGlmIChkZWMtPmNpbmZvLm51bV9jb21wb25lbnRzID4gMykKKyAgICBnb3RvIGNvbXBvbmVudHNfbm90X3N1cHBvcnRlZDsKKworICAvKiB2ZXJpZnkgY29sb3Igc3BhY2UgZXhwZWN0YXRpb24gdG8gYXZvaWQgZ29pbmcgKmJvb20qIG9yIGJvZ3VzIG91dHB1dCAqLworICBpZiAoZGVjLT5jaW5mby5qcGVnX2NvbG9yX3NwYWNlICE9IEpDU19ZQ2JDciAmJgorICAgICAgZGVjLT5jaW5mby5qcGVnX2NvbG9yX3NwYWNlICE9IEpDU19HUkFZU0NBTEUgJiYKKyAgICAgIGRlYy0+Y2luZm8uanBlZ19jb2xvcl9zcGFjZSAhPSBKQ1NfUkdCKQorICAgIGdvdG8gdW5zdXBwb3J0ZWRfY29sb3JzcGFjZTsKKworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgeworICAgIGdpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBkZWMtPmNpbmZvLm51bV9jb21wb25lbnRzOyArK2kpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChkZWMsICJbJWRdIGhfc2FtcF9mYWN0b3I9JWQsIHZfc2FtcF9mYWN0b3I9JWQsIGNpZD0lZCIsCisgICAgICAgICAgaSwgZGVjLT5jaW5mby5jb21wX2luZm9baV0uaF9zYW1wX2ZhY3RvciwKKyAgICAgICAgICBkZWMtPmNpbmZvLmNvbXBfaW5mb1tpXS52X3NhbXBfZmFjdG9yLAorICAgICAgICAgIGRlYy0+Y2luZm8uY29tcF9pbmZvW2ldLmNvbXBvbmVudF9pZCk7CisgICAgfQorICB9CisjZW5kaWYKKworICAvKiBwcmVwYXJlIGZvciByYXcgb3V0cHV0ICovCisgIGRlYy0+Y2luZm8uZG9fZmFuY3lfdXBzYW1wbGluZyA9IEZBTFNFOworICBkZWMtPmNpbmZvLmRvX2Jsb2NrX3Ntb290aGluZyA9IEZBTFNFOworICBkZWMtPmNpbmZvLm91dF9jb2xvcl9zcGFjZSA9IGRlYy0+Y2luZm8uanBlZ19jb2xvcl9zcGFjZTsKKyAgZGVjLT5jaW5mby5kY3RfbWV0aG9kID0gZGVjLT5pZGN0X21ldGhvZDsKKyAgZGVjLT5jaW5mby5yYXdfZGF0YV9vdXQgPSBUUlVFOworCisgIEdTVF9MT0dfT0JKRUNUIChkZWMsICJzdGFydGluZyBkZWNvbXByZXNzIik7CisgIGd1YXJhbnRlZV9odWZmX3RhYmxlcyAoJmRlYy0+Y2luZm8pOworICBpZiAoIWpwZWdfc3RhcnRfZGVjb21wcmVzcyAoJmRlYy0+Y2luZm8pKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZWMsICJmYWlsZWQgdG8gc3RhcnQgZGVjb21wcmVzc2lvbiBjeWNsZSIpOworICB9CisKKyAgLyogc2FuaXR5IGNoZWNrcyB0byBnZXQgc2FmZSBhbmQgcmVhc29uYWJsZSBvdXRwdXQgKi8KKyAgc3dpdGNoIChkZWMtPmNpbmZvLmpwZWdfY29sb3Jfc3BhY2UpIHsKKyAgICBjYXNlIEpDU19HUkFZU0NBTEU6CisgICAgICBpZiAoZGVjLT5jaW5mby5udW1fY29tcG9uZW50cyAhPSAxKQorICAgICAgICBnb3RvIGludmFsaWRfeXV2cmdiZ3JheXNjYWxlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBKQ1NfUkdCOgorICAgICAgaWYgKGRlYy0+Y2luZm8ubnVtX2NvbXBvbmVudHMgIT0gMyB8fCBkZWMtPmNpbmZvLm1heF92X3NhbXBfZmFjdG9yID4gMSB8fAorICAgICAgICAgIGRlYy0+Y2luZm8ubWF4X2hfc2FtcF9mYWN0b3IgPiAxKQorICAgICAgICBnb3RvIGludmFsaWRfeXV2cmdiZ3JheXNjYWxlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBKQ1NfWUNiQ3I6CisgICAgICBpZiAoZGVjLT5jaW5mby5udW1fY29tcG9uZW50cyAhPSAzIHx8CisgICAgICAgICAgcl92ID4gMiB8fCByX3YgPCBkZWMtPmNpbmZvLmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yIHx8CisgICAgICAgICAgcl92IDwgZGVjLT5jaW5mby5jb21wX2luZm9bMV0udl9zYW1wX2ZhY3RvciB8fAorICAgICAgICAgIHJfaCA8IGRlYy0+Y2luZm8uY29tcF9pbmZvWzBdLmhfc2FtcF9mYWN0b3IgfHwKKyAgICAgICAgICByX2ggPCBkZWMtPmNpbmZvLmNvbXBfaW5mb1sxXS5oX3NhbXBfZmFjdG9yKQorICAgICAgICBnb3RvIGludmFsaWRfeXV2cmdiZ3JheXNjYWxlOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoZGVjLT5jaW5mby5vdXRwdXRfd2lkdGggPCBNSU5fV0lEVEggfHwKKyAgICAgICAgICBkZWMtPmNpbmZvLm91dHB1dF93aWR0aCA+IE1BWF9XSURUSCB8fAorICAgICAgICAgIGRlYy0+Y2luZm8ub3V0cHV0X2hlaWdodCA8IE1JTl9IRUlHSFQgfHwKKyAgICAgICAgICBkZWMtPmNpbmZvLm91dHB1dF9oZWlnaHQgPiBNQVhfSEVJR0hUKSkKKyAgICBnb3RvIHdyb25nX3NpemU7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCisvKiBFUlJPUlMgKi8KK3dyb25nX3NpemU6CisgIHsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBHU1RfVklERU9fREVDT0RFUl9FUlJPUiAoZGVjLCAxLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKF8oIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIpKSwKKyAgICAgICAgKCJQaWN0dXJlIGlzIHRvbyBzbWFsbCBvciB0b28gYmlnICgldXgldSkiLCBkZWMtPmNpbmZvLm91dHB1dF93aWR0aCwKKyAgICAgICAgICAgIGRlYy0+Y2luZm8ub3V0cHV0X2hlaWdodCksIHJldCk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Citjb21wb25lbnRzX25vdF9zdXBwb3J0ZWQ6CisgIHsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBHU1RfVklERU9fREVDT0RFUl9FUlJPUiAoZGVjLCAxLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKF8oIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIpKSwKKyAgICAgICAgKCJudW1iZXIgb2YgY29tcG9uZW50cyBub3Qgc3VwcG9ydGVkOiAlZCAobWF4IDMpIiwKKyAgICAgICAgICAgIGRlYy0+Y2luZm8ubnVtX2NvbXBvbmVudHMpLCByZXQpOworICAgIGpwZWdfYWJvcnRfZGVjb21wcmVzcyAoJmRlYy0+Y2luZm8pOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQordW5zdXBwb3J0ZWRfY29sb3JzcGFjZToKKyAgeworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIEdTVF9WSURFT19ERUNPREVSX0VSUk9SIChkZWMsIDEsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoXygiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIikpLAorICAgICAgICAoIlBpY3R1cmUgaGFzIHVua25vd24gb3IgdW5zdXBwb3J0ZWQgY29sb3Vyc3BhY2UiKSwgcmV0KTsKKyAgICBqcGVnX2Fib3J0X2RlY29tcHJlc3MgKCZkZWMtPmNpbmZvKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2ludmFsaWRfeXV2cmdiZ3JheXNjYWxlOgorICB7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgR1NUX1ZJREVPX0RFQ09ERVJfRVJST1IgKGRlYywgMSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChfKCJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiKSksCisgICAgICAgICgiUGljdHVyZSBpcyBjb3JydXB0IG9yIHVuaGFuZGxlZCBZVVYvUkdCL2dyYXlzY2FsZSBsYXlvdXQiKSwgcmV0KTsKKyAgICBqcGVnX2Fib3J0X2RlY29tcHJlc3MgKCZkZWMtPmNpbmZvKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9qcGVnX2RlY19kZWNvZGUgKEdzdEpwZWdEZWMgKiBkZWMsIEdzdFZpZGVvRnJhbWUgKiB2ZnJhbWUsIGd1aW50IHdpZHRoLAorICAgIGd1aW50IGhlaWdodCwgZ3VpbnQgZmllbGQsIGd1aW50IG51bV9maWVsZHMpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgaWYgKGRlYy0+Y2luZm8uanBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7CisgICAgZ3N0X2pwZWdfZGVjX2RlY29kZV9yZ2IgKGRlYywgdmZyYW1lLCBmaWVsZCwgbnVtX2ZpZWxkcyk7CisgIH0gZWxzZSBpZiAoZGVjLT5jaW5mby5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUpIHsKKyAgICBnc3RfanBlZ19kZWNfZGVjb2RlX2dyYXlzY2FsZSAoZGVjLCB2ZnJhbWUsIGZpZWxkLCBudW1fZmllbGRzKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoZGVjLCAiZGVjb21wcmVzc2luZyAocmVxdWlyZWQgc2NhbmxpbmUgYnVmZmVyIGhlaWdodCA9ICV1KSIsCisgICAgICAgIGRlYy0+Y2luZm8ucmVjX291dGJ1Zl9oZWlnaHQpOworCisgICAgLyogRm9yIHNvbWUgd2lkdGhzIGpwZWdsaWIgcmVxdWlyZXMgbW9yZSBob3Jpem9udGFsIHBhZGRpbmcgdGhhbiBJNDIwIAorICAgICAqIHByb3ZpZGVzLiBJbiB0aG9zZSBjYXNlcyB3ZSBuZWVkIHRvIGRlY29kZSBpbnRvIHNlcGFyYXRlIGJ1ZmZlcnMgYW5kIHRoZW4KKyAgICAgKiBjb3B5IG92ZXIgdGhlIGRhdGEgaW50byBvdXIgZmluYWwgcGljdHVyZSBidWZmZXIsIG90aGVyd2lzZSBqcGVnbGliIG1pZ2h0CisgICAgICogd3JpdGUgb3ZlciB0aGUgZW5kIG9mIGEgbGluZSBpbnRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgbGluZSwKKyAgICAgKiByZXN1bHRpbmcgaW4gYmxvY2t5IGFydGlmYWN0cyBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBwaWN0dXJlLiAqLworICAgIGlmIChHX1VOTElLRUxZICh3aWR0aCAlIChkZWMtPmNpbmZvLm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSkgIT0gMAorICAgICAgICAgICAgfHwgZGVjLT5jaW5mby5jb21wX2luZm9bMF0uaF9zYW1wX2ZhY3RvciAhPSAyCisgICAgICAgICAgICB8fCBkZWMtPmNpbmZvLmNvbXBfaW5mb1sxXS5oX3NhbXBfZmFjdG9yICE9IDEKKyAgICAgICAgICAgIHx8IGRlYy0+Y2luZm8uY29tcF9pbmZvWzJdLmhfc2FtcF9mYWN0b3IgIT0gMSkpIHsKKyAgICAgIEdTVF9DQVRfTE9HX09CSkVDVCAoR1NUX0NBVF9QRVJGT1JNQU5DRSwgZGVjLAorICAgICAgICAgICJpbmRpcmVjdCBkZWNvZGluZyB1c2luZyBleHRyYSBidWZmZXIgY29weSIpOworICAgICAgZ3N0X2pwZWdfZGVjX2RlY29kZV9pbmRpcmVjdCAoZGVjLCB2ZnJhbWUsCisgICAgICAgICAgZGVjLT5jaW5mby5jb21wX2luZm9bMF0udl9zYW1wX2ZhY3RvciwKKyAgICAgICAgICBkZWMtPmNpbmZvLmNvbXBfaW5mb1swXS5oX3NhbXBfZmFjdG9yLCBkZWMtPmNpbmZvLm51bV9jb21wb25lbnRzLAorICAgICAgICAgIGZpZWxkLCBudW1fZmllbGRzKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0ID0gZ3N0X2pwZWdfZGVjX2RlY29kZV9kaXJlY3QgKGRlYywgdmZyYW1lLCBmaWVsZCwgbnVtX2ZpZWxkcyk7CisgICAgfQorICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRlYywgImRlY29tcHJlc3NpbmcgZmluaXNoZWQ6ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworCisgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spKSB7CisgICAganBlZ19hYm9ydF9kZWNvbXByZXNzICgmZGVjLT5jaW5mbyk7CisgIH0gZWxzZSB7CisgICAganBlZ19maW5pc2hfZGVjb21wcmVzcyAoJmRlYy0+Y2luZm8pOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9qcGVnX2RlY19oYW5kbGVfZnJhbWUgKEdzdFZpZGVvRGVjb2RlciAqIGJkZWMsIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RKcGVnRGVjICpkZWMgPSAoR3N0SnBlZ0RlYyAqKSBiZGVjOworICBHc3RWaWRlb0ZyYW1lIHZmcmFtZTsKKyAgZ2ludCBudW1fZmllbGRzOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGZpZWxkcyAoMSBvciAyKSAqLworICBnaW50IG91dHB1dF9oZWlnaHQ7ICAgICAgICAgICAvKiBoZWlnaHQgb2Ygb3V0cHV0IGltYWdlIChvbmUgb3IgdHdvIGZpZWxkcykgKi8KKyAgZ2ludCBoZWlnaHQ7ICAgICAgICAgICAgICAgICAgLyogaGVpZ2h0IG9mIGN1cnJlbnQgZnJhbWUgKHdob2xlIGltYWdlIG9yIGEgZmllbGQpICovCisgIGdpbnQgd2lkdGg7CisgIGd1aW50IGNvZGU7CisgIGdib29sZWFuIG5lZWRfdW5tYXAgPSBUUlVFOworICBHc3RWaWRlb0NvZGVjU3RhdGUgKnN0YXRlID0gTlVMTDsKKyAgZ2Jvb2xlYW4gcmVsZWFzZV9mcmFtZSA9IFRSVUU7CisgIGdib29sZWFuIGhhc19lb2k7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3NpemUgbmJ5dGVzOworCisgIGdzdF9idWZmZXJfbWFwIChmcmFtZS0+aW5wdXRfYnVmZmVyLCAmZGVjLT5jdXJyZW50X2ZyYW1lX21hcCwgR1NUX01BUF9SRUFEKTsKKworICBkYXRhID0gZGVjLT5jdXJyZW50X2ZyYW1lX21hcC5kYXRhOworICBuYnl0ZXMgPSBkZWMtPmN1cnJlbnRfZnJhbWVfbWFwLnNpemU7CisgIGhhc19lb2kgPSAoKGRhdGFbbmJ5dGVzIC0gMl0gIT0gMHhmZikgfHwgKGRhdGFbbmJ5dGVzIC0gMV0gIT0gMHhkOSkpOworCisgIC8qIHNvbWUgY2FtZXJhcyBmYWlsIHRvIHNlbmQgYW4gZW5kLW9mLWltYWdlIG1hcmtlciAoRU9JKSwKKyAgICogYWRkIGl0IGlmIHRoYXQgaXMgdGhlIGNhc2UuICovCisgIGlmICghaGFzX2VvaSkgeworICAgIEdzdE1hcEluZm8gbWFwOworICAgIEdzdEJ1ZmZlciAqZW9pYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgyKTsKKworICAgIC8qIHVubWFwLCB3aWxsIGFkZCBFT0kgYW5kIHJlbWFwIGF0IHRoZSBlbmQgKi8KKyAgICBnc3RfYnVmZmVyX3VubWFwIChmcmFtZS0+aW5wdXRfYnVmZmVyLCAmZGVjLT5jdXJyZW50X2ZyYW1lX21hcCk7CisKKyAgICBnc3RfYnVmZmVyX21hcCAoZW9pYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICBtYXAuZGF0YVswXSA9IDB4ZmY7CisgICAgbWFwLmRhdGFbMV0gPSAweGQ5OworICAgIGdzdF9idWZmZXJfdW5tYXAgKGVvaWJ1ZiwgJm1hcCk7CisKKyAgICAvKiBhcHBlbmQgdG8gaW5wdXQgYnVmZmVyLCBhbmQgcmVtYXAgKi8KKyAgICBmcmFtZS0+aW5wdXRfYnVmZmVyID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKGZyYW1lLT5pbnB1dF9idWZmZXIsIGVvaWJ1Zik7CisKKyAgICBnc3RfYnVmZmVyX21hcCAoZnJhbWUtPmlucHV0X2J1ZmZlciwgJmRlYy0+Y3VycmVudF9mcmFtZV9tYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgR1NUX0RFQlVHICgiZml4dXAgRU9JIG1hcmtlciBhZGRlZCIpOworICB9CisKKyAgZGVjLT5jdXJyZW50X2ZyYW1lID0gZnJhbWU7CisgIGRlYy0+Y2luZm8uc3JjLT5uZXh0X2lucHV0X2J5dGUgPSBkZWMtPmN1cnJlbnRfZnJhbWVfbWFwLmRhdGE7CisgIGRlYy0+Y2luZm8uc3JjLT5ieXRlc19pbl9idWZmZXIgPSBkZWMtPmN1cnJlbnRfZnJhbWVfbWFwLnNpemU7CisKKyAgaWYgKHNldGptcCAoZGVjLT5qZXJyLnNldGptcF9idWZmZXIpKSB7CisgICAgY29kZSA9IGRlYy0+amVyci5wdWIubXNnX2NvZGU7CisKKyAgICBpZiAoY29kZSA9PSBKRVJSX0lOUFVUX0VPRikgeworICAgICAgR1NUX0RFQlVHICgianBlZyBpbnB1dCBFT0YgZXJyb3IsIHdlIHByb2JhYmx5IG5lZWQgbW9yZSBkYXRhIik7CisgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworICAgIH0KKyAgICBnb3RvIGRlY29kZV9lcnJvcjsKKyAgfQorCisgIC8qIHJlYWQgaGVhZGVyIGFuZCBjaGVjayB2YWx1ZXMgKi8KKyAgcmV0ID0gZ3N0X2pwZWdfZGVjX3ByZXBhcmVfZGVjb2RlIChkZWMpOworICBpZiAoR19VTkxJS0VMWSAocmV0ID09IEdTVF9GTE9XX0VSUk9SKSkKKyAgICBnb3RvIGRvbmU7CisKKyAgd2lkdGggPSBkZWMtPmNpbmZvLm91dHB1dF93aWR0aDsKKyAgaGVpZ2h0ID0gZGVjLT5jaW5mby5vdXRwdXRfaGVpZ2h0OworCisgIC8qIGlzIGl0IGludGVybGFjZWQgTUpQRUc/ICh3ZSByZWFsbHkgZG9uJ3Qgd2FudCB0byBzY2FuIHRoZSBqcGVnIGRhdGEKKyAgICogdG8gc2VlIGlmIHRoZXJlIGFyZSB0d28gU09GIG1hcmtlcnMgaW4gdGhlIHBhY2tldCB0byBkZXRlY3QgdGhpcykgKi8KKyAgaWYgKGdzdF92aWRlb19kZWNvZGVyX2dldF9wYWNrZXRpemVkIChiZGVjKSAmJgorICAgICAgZGVjLT5pbnB1dF9zdGF0ZS0+aW5mby5oZWlnaHQgPiBoZWlnaHQgJiYKKyAgICAgIGRlYy0+aW5wdXRfc3RhdGUtPmluZm8uaGVpZ2h0IDw9IChoZWlnaHQgKiAyKQorICAgICAgJiYgZGVjLT5pbnB1dF9zdGF0ZS0+aW5mby53aWR0aCA9PSB3aWR0aCkgeworICAgIEdTVF9MT0dfT0JKRUNUIChkZWMsCisgICAgICAgICJsb29rcyBsaWtlIGFuIGludGVybGFjZWQgaW1hZ2U6ICIKKyAgICAgICAgImlucHV0IHdpZHRoL2hlaWdodCBvZiAlZHglZCB3aXRoIEpQRUcgZnJhbWUgd2lkdGgvaGVpZ2h0IG9mICVkeCVkIiwKKyAgICAgICAgZGVjLT5pbnB1dF9zdGF0ZS0+aW5mby53aWR0aCwgZGVjLT5pbnB1dF9zdGF0ZS0+aW5mby5oZWlnaHQsIHdpZHRoLAorICAgICAgICBoZWlnaHQpOworICAgIG91dHB1dF9oZWlnaHQgPSBkZWMtPmlucHV0X3N0YXRlLT5pbmZvLmhlaWdodDsKKyAgICBoZWlnaHQgPSBkZWMtPmlucHV0X3N0YXRlLT5pbmZvLmhlaWdodCAvIDI7CisgICAgbnVtX2ZpZWxkcyA9IDI7CisgICAgR1NUX0xPR19PQkpFQ1QgKGRlYywgImZpZWxkIGhlaWdodD0lZCIsIGhlaWdodCk7CisgIH0gZWxzZSB7CisgICAgb3V0cHV0X2hlaWdodCA9IGhlaWdodDsKKyAgICBudW1fZmllbGRzID0gMTsKKyAgfQorCisgIGdzdF9qcGVnX2RlY19uZWdvdGlhdGUgKGRlYywgd2lkdGgsIG91dHB1dF9oZWlnaHQsCisgICAgICBkZWMtPmNpbmZvLmpwZWdfY29sb3Jfc3BhY2UsIG51bV9maWVsZHMgPT0gMik7CisKKyAgc3RhdGUgPSBnc3RfdmlkZW9fZGVjb2Rlcl9nZXRfb3V0cHV0X3N0YXRlIChiZGVjKTsKKyAgcmV0ID0gZ3N0X3ZpZGVvX2RlY29kZXJfYWxsb2NhdGVfb3V0cHV0X2ZyYW1lIChiZGVjLCBmcmFtZSk7CisgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spKQorICAgIGdvdG8gYWxsb2NfZmFpbGVkOworCisgIGlmICghZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJnZmcmFtZSwgJnN0YXRlLT5pbmZvLCBmcmFtZS0+b3V0cHV0X2J1ZmZlciwKKyAgICAgICAgICBHU1RfTUFQX1JFQURXUklURSkpCisgICAgZ290byBhbGxvY19mYWlsZWQ7CisKKyAgaWYgKHNldGptcCAoZGVjLT5qZXJyLnNldGptcF9idWZmZXIpKSB7CisgICAgY29kZSA9IGRlYy0+amVyci5wdWIubXNnX2NvZGU7CisgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmdmZyYW1lKTsKKyAgICBnb3RvIGRlY29kZV9lcnJvcjsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChkZWMsICJ3aWR0aCAlZCwgaGVpZ2h0ICVkLCBmaWVsZHMgJWQiLCB3aWR0aCwgb3V0cHV0X2hlaWdodCwKKyAgICAgIG51bV9maWVsZHMpOworCisgIHJldCA9IGdzdF9qcGVnX2RlY19kZWNvZGUgKGRlYywgJnZmcmFtZSwgd2lkdGgsIGhlaWdodCwgMSwgbnVtX2ZpZWxkcyk7CisgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spKSB7CisgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmdmZyYW1lKTsKKyAgICBnb3RvIGRlY29kZV9mYWlsZWQ7CisgIH0KKworICBpZiAoc2V0am1wIChkZWMtPmplcnIuc2V0am1wX2J1ZmZlcikpIHsKKyAgICBjb2RlID0gZGVjLT5qZXJyLnB1Yi5tc2dfY29kZTsKKyAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKCZ2ZnJhbWUpOworICAgIGdvdG8gZGVjb2RlX2Vycm9yOworICB9CisKKyAgLyogZGVjb2RlIHNlY29uZCBmaWVsZCBpZiB0aGVyZSBpcyBvbmUgKi8KKyAgaWYgKG51bV9maWVsZHMgPT0gMikgeworICAgIEdzdFZpZGVvRm9ybWF0IGZpZWxkMl9mb3JtYXQ7CisKKyAgICAvKiBza2lwIGFueSBjaHVuayBvciBwYWRkaW5nIGJ5dGVzIGJlZm9yZSB0aGUgbmV4dCBTT0kgbWFya2VyOyBib3RoIGZpZWxkcworICAgICAqIGFyZSBpbiBvbmUgc2luZ2xlIGJ1ZmZlciBoZXJlLCBzbyBkaXJlY3QgYWNjZXNzIHNob3VsZCBiZSBmaW5lIGhlcmUgKi8KKyAgICB3aGlsZSAoZGVjLT5qc3JjLnB1Yi5ieXRlc19pbl9idWZmZXIgPiAyICYmCisgICAgICAgIEdTVF9SRUFEX1VJTlQxNl9CRSAoZGVjLT5qc3JjLnB1Yi5uZXh0X2lucHV0X2J5dGUpICE9IDB4ZmZkOCkgeworICAgICAgLS1kZWMtPmpzcmMucHViLmJ5dGVzX2luX2J1ZmZlcjsKKyAgICAgICsrZGVjLT5qc3JjLnB1Yi5uZXh0X2lucHV0X2J5dGU7CisgICAgfQorCisgICAgaWYgKGdzdF9qcGVnX2RlY19wcmVwYXJlX2RlY29kZSAoZGVjKSAhPSBHU1RfRkxPV19PSykgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZWMsICJwcm9ibGVtIHJlYWRpbmcganBlZyBoZWFkZXIgb2YgMm5kIGZpZWxkIik7CisgICAgICAvKiBGSVhNRTogcG9zdCBhIHdhcm5pbmcgbWVzc2FnZSBoZXJlPyAqLworICAgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmdmZyYW1lKTsKKyAgICAgIGdvdG8gZGVjb2RlX2ZhaWxlZDsKKyAgICB9CisKKyAgICAvKiBjaGVjayBpZiBmb3JtYXQgaGFzIGNoYW5nZWQgZm9yIHRoZSBzZWNvbmQgZmllbGQgKi8KKyAgICBzd2l0Y2ggKGRlYy0+Y2luZm8uanBlZ19jb2xvcl9zcGFjZSkgeworICAgICAgY2FzZSBKQ1NfUkdCOgorICAgICAgICBmaWVsZDJfZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9SR0I7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBKQ1NfR1JBWVNDQUxFOgorICAgICAgICBmaWVsZDJfZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9HUkFZODsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZDJfZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9JNDIwOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBHU1RfTE9HX09CSkVDVCAoZGVjLAorICAgICAgICAiZ290IGZvciBzZWNvbmQgZmllbGQgb2YgaW50ZXJsYWNlZCBpbWFnZTogIgorICAgICAgICAiaW5wdXQgd2lkdGgvaGVpZ2h0IG9mICVkeCVkIHdpdGggSlBFRyBmcmFtZSB3aWR0aC9oZWlnaHQgb2YgJWR4JWQiLAorICAgICAgICBkZWMtPmlucHV0X3N0YXRlLT5pbmZvLndpZHRoLCBkZWMtPmlucHV0X3N0YXRlLT5pbmZvLmhlaWdodCwKKyAgICAgICAgZGVjLT5jaW5mby5vdXRwdXRfd2lkdGgsIGRlYy0+Y2luZm8ub3V0cHV0X2hlaWdodCk7CisKKyAgICBpZiAoZGVjLT5jaW5mby5vdXRwdXRfd2lkdGggIT0gR1NUX1ZJREVPX0lORk9fV0lEVEggKCZzdGF0ZS0+aW5mbykgfHwKKyAgICAgICAgR1NUX1ZJREVPX0lORk9fSEVJR0hUICgmc3RhdGUtPmluZm8pIDw9IGRlYy0+Y2luZm8ub3V0cHV0X2hlaWdodCB8fAorICAgICAgICBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZzdGF0ZS0+aW5mbykgPiAoZGVjLT5jaW5mby5vdXRwdXRfaGVpZ2h0ICogMikgfHwKKyAgICAgICAgZmllbGQyX2Zvcm1hdCAhPSBHU1RfVklERU9fSU5GT19GT1JNQVQgKCZzdGF0ZS0+aW5mbykpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVjLCAic2Vjb25kIGZpZWxkIGhhcyBkaWZmZXJlbnQgZm9ybWF0IHRoYW4gZmlyc3QiKTsKKyAgICAgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJnZmcmFtZSk7CisgICAgICBnb3RvIGRlY29kZV9mYWlsZWQ7CisgICAgfQorCisgICAgcmV0ID0gZ3N0X2pwZWdfZGVjX2RlY29kZSAoZGVjLCAmdmZyYW1lLCB3aWR0aCwgaGVpZ2h0LCAyLCAyKTsKKyAgICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LKSkgeworICAgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmdmZyYW1lKTsKKyAgICAgIGdvdG8gZGVjb2RlX2ZhaWxlZDsKKyAgICB9CisgIH0KKyAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmdmZyYW1lKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChmcmFtZS0+aW5wdXRfYnVmZmVyLCAmZGVjLT5jdXJyZW50X2ZyYW1lX21hcCk7CisgIHJldCA9IGdzdF92aWRlb19kZWNvZGVyX2ZpbmlzaF9mcmFtZSAoYmRlYywgZnJhbWUpOworICByZWxlYXNlX2ZyYW1lID0gRkFMU0U7CisgIG5lZWRfdW5tYXAgPSBGQUxTRTsKKworZG9uZToKKworZXhpdDoKKworICBpZiAobmVlZF91bm1hcCkKKyAgICBnc3RfYnVmZmVyX3VubWFwIChmcmFtZS0+aW5wdXRfYnVmZmVyLCAmZGVjLT5jdXJyZW50X2ZyYW1lX21hcCk7CisKKyAgaWYgKHJlbGVhc2VfZnJhbWUpCisgICAgZ3N0X3ZpZGVvX2RlY29kZXJfcmVsZWFzZV9mcmFtZSAoYmRlYywgZnJhbWUpOworCisgIGlmIChzdGF0ZSkKKyAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKHN0YXRlKTsKKworICByZXR1cm4gcmV0OworCisgIC8qIHNwZWNpYWwgY2FzZXMgKi8KK25lZWRfbW9yZV9kYXRhOgorICB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGRlYywgIndlIG5lZWQgbW9yZSBkYXRhIik7CisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgZ290byBleGl0OworICB9CisgIC8qIEVSUk9SUyAqLworZGVjb2RlX2Vycm9yOgorICB7CisgICAgZ2NoYXIgZXJyX21zZ1tKTVNHX0xFTkdUSF9NQVhdOworCisgICAgZGVjLT5qZXJyLnB1Yi5mb3JtYXRfbWVzc2FnZSAoKGpfY29tbW9uX3B0cikgKCZkZWMtPmNpbmZvKSwgZXJyX21zZyk7CisKKyAgICBHU1RfVklERU9fREVDT0RFUl9FUlJPUiAoZGVjLCAxLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKF8oIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIpKSwgKCJEZWNvZGUgZXJyb3IgIyV1OiAlcyIsIGNvZGUsCisgICAgICAgICAgICBlcnJfbXNnKSwgcmV0KTsKKworICAgIGdzdF9idWZmZXJfdW5tYXAgKGZyYW1lLT5pbnB1dF9idWZmZXIsICZkZWMtPmN1cnJlbnRfZnJhbWVfbWFwKTsKKyAgICBnc3RfdmlkZW9fZGVjb2Rlcl9kcm9wX2ZyYW1lIChiZGVjLCBmcmFtZSk7CisgICAgcmVsZWFzZV9mcmFtZSA9IEZBTFNFOworICAgIG5lZWRfdW5tYXAgPSBGQUxTRTsKKyAgICBqcGVnX2Fib3J0X2RlY29tcHJlc3MgKCZkZWMtPmNpbmZvKTsKKworICAgIGdvdG8gZG9uZTsKKyAgfQorZGVjb2RlX2ZhaWxlZDoKKyAgeworICAgIC8qIGFscmVhZHkgcG9zdGVkIGFuIGVycm9yIG1lc3NhZ2UgKi8KKyAgICBnb3RvIGRvbmU7CisgIH0KK2FsbG9jX2ZhaWxlZDoKKyAgeworICAgIGNvbnN0IGdjaGFyICpyZWFzb247CisKKyAgICByZWFzb24gPSBnc3RfZmxvd19nZXRfbmFtZSAocmV0KTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlYywgImZhaWxlZCB0byBhbGxvYyBidWZmZXIsIHJlYXNvbiAlcyIsIHJlYXNvbik7CisgICAgLyogUmVzZXQgZm9yIG5leHQgdGltZSAqLworICAgIGpwZWdfYWJvcnRfZGVjb21wcmVzcyAoJmRlYy0+Y2luZm8pOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfRU9TICYmIHJldCAhPSBHU1RfRkxPV19GTFVTSElORyAmJgorICAgICAgICByZXQgIT0gR1NUX0ZMT1dfTk9UX0xJTktFRCkgeworICAgICAgR1NUX1ZJREVPX0RFQ09ERVJfRVJST1IgKGRlYywgMSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgICAgKF8oIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIpKSwKKyAgICAgICAgICAoIkJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCwgcmVhc29uOiAlcyIsIHJlYXNvbiksIHJldCk7CisgICAgICBqcGVnX2Fib3J0X2RlY29tcHJlc3MgKCZkZWMtPmNpbmZvKTsKKyAgICB9CisgICAgZ290byBleGl0OworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2pwZWdfZGVjX2RlY2lkZV9hbGxvY2F0aW9uIChHc3RWaWRlb0RlY29kZXIgKiBiZGVjLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RCdWZmZXJQb29sICpwb29sID0gTlVMTDsKKyAgR3N0U3RydWN0dXJlICpjb25maWc7CisKKyAgaWYgKCFHU1RfVklERU9fREVDT0RFUl9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGVjaWRlX2FsbG9jYXRpb24gKGJkZWMsIHF1ZXJ5KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGdzdF9xdWVyeV9nZXRfbl9hbGxvY2F0aW9uX3Bvb2xzIChxdWVyeSkgPiAwKQorICAgIGdzdF9xdWVyeV9wYXJzZV9udGhfYWxsb2NhdGlvbl9wb29sIChxdWVyeSwgMCwgJnBvb2wsIE5VTEwsIE5VTEwsIE5VTEwpOworCisgIGlmIChwb29sID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGNvbmZpZyA9IGdzdF9idWZmZXJfcG9vbF9nZXRfY29uZmlnIChwb29sKTsKKyAgaWYgKGdzdF9xdWVyeV9maW5kX2FsbG9jYXRpb25fbWV0YSAocXVlcnksIEdTVF9WSURFT19NRVRBX0FQSV9UWVBFLCBOVUxMKSkgeworICAgIGdzdF9idWZmZXJfcG9vbF9jb25maWdfYWRkX29wdGlvbiAoY29uZmlnLAorICAgICAgICBHU1RfQlVGRkVSX1BPT0xfT1BUSU9OX1ZJREVPX01FVEEpOworICB9CisgIGdzdF9idWZmZXJfcG9vbF9zZXRfY29uZmlnIChwb29sLCBjb25maWcpOworICBnc3Rfb2JqZWN0X3VucmVmIChwb29sKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfanBlZ19kZWNfc2lua19ldmVudCAoR3N0VmlkZW9EZWNvZGVyICogYmRlYywgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgY29uc3QgR3N0U2VnbWVudCAqc2VnbWVudDsKKworICBpZiAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSAhPSBHU1RfRVZFTlRfU0VHTUVOVCkKKyAgICBnb3RvIGRvbmU7CisKKyAgZ3N0X2V2ZW50X3BhcnNlX3NlZ21lbnQgKGV2ZW50LCAmc2VnbWVudCk7CisKKyAgaWYgKHNlZ21lbnQtPmZvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUpCisgICAgZ3N0X3ZpZGVvX2RlY29kZXJfc2V0X3BhY2tldGl6ZWQgKGJkZWMsIFRSVUUpOworICBlbHNlCisgICAgZ3N0X3ZpZGVvX2RlY29kZXJfc2V0X3BhY2tldGl6ZWQgKGJkZWMsIEZBTFNFKTsKKworZG9uZToKKyAgcmV0dXJuIEdTVF9WSURFT19ERUNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChiZGVjLCBldmVudCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2pwZWdfZGVjX3N0YXJ0IChHc3RWaWRlb0RlY29kZXIgKiBiZGVjKQoreworICBHc3RKcGVnRGVjICpkZWMgPSAoR3N0SnBlZ0RlYyAqKSBiZGVjOworCisgIGRlYy0+c2F3X2hlYWRlciA9IEZBTFNFOworICBkZWMtPnBhcnNlX2VudHJvcHlfbGVuID0gMDsKKyAgZGVjLT5wYXJzZV9yZXN5bmMgPSBGQUxTRTsKKworICBnc3RfdmlkZW9fZGVjb2Rlcl9zZXRfcGFja2V0aXplZCAoYmRlYywgRkFMU0UpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9qcGVnX2RlY19mbHVzaCAoR3N0VmlkZW9EZWNvZGVyICogYmRlYykKK3sKKyAgR3N0SnBlZ0RlYyAqZGVjID0gKEdzdEpwZWdEZWMgKikgYmRlYzsKKworICBqcGVnX2Fib3J0X2RlY29tcHJlc3MgKCZkZWMtPmNpbmZvKTsKKyAgZGVjLT5wYXJzZV9lbnRyb3B5X2xlbiA9IDA7CisgIGRlYy0+cGFyc2VfcmVzeW5jID0gRkFMU0U7CisgIGRlYy0+c2F3X2hlYWRlciA9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdfZGVjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RKcGVnRGVjICpkZWM7CisKKyAgZGVjID0gR1NUX0pQRUdfREVDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9JRENUX01FVEhPRDoKKyAgICAgIGRlYy0+aWRjdF9tZXRob2QgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyNpZm5kZWYgR1NUX1JFTU9WRV9ERVBSRUNBVEVECisgICAgY2FzZSBQUk9QX01BWF9FUlJPUlM6CisgICAgICBnX2F0b21pY19pbnRfc2V0ICgmZGVjLT5tYXhfZXJyb3JzLCBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9qcGVnX2RlY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0SnBlZ0RlYyAqZGVjOworCisgIGRlYyA9IEdTVF9KUEVHX0RFQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfSURDVF9NRVRIT0Q6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgZGVjLT5pZGN0X21ldGhvZCk7CisgICAgICBicmVhazsKKyNpZm5kZWYgR1NUX1JFTU9WRV9ERVBSRUNBVEVECisgICAgY2FzZSBQUk9QX01BWF9FUlJPUlM6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBnX2F0b21pY19pbnRfZ2V0ICgmZGVjLT5tYXhfZXJyb3JzKSk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfanBlZ19kZWNfc3RvcCAoR3N0VmlkZW9EZWNvZGVyICogYmRlYykKK3sKKyAgR3N0SnBlZ0RlYyAqZGVjID0gKEdzdEpwZWdEZWMgKikgYmRlYzsKKworICBnc3RfanBlZ19kZWNfZnJlZV9idWZmZXJzIChkZWMpOworCisgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvZXh0L2pwZWcvZ3N0anBlZ2RlYy5oIGIvZXh0L2pwZWcvZ3N0anBlZ2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZmEyZmMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvanBlZy9nc3RqcGVnZGVjLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBDb2xsYWJvcmEgTHRkLgorICoJQXV0aG9yIDogRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNvbGxhYm9yYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX0pQRUdfREVDX0hfXworI2RlZmluZSBfX0dTVF9KUEVHX0RFQ19IX18KKworCisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2RlY29kZXIuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisKKy8qIHRoaXMgaXMgYSBoYWNrIGhhY2sgaGFjayB0byBnZXQgYXJvdW5kIGpwZWdsaWIgaGVhZGVyIGJ1Z3MuLi4gKi8KKyNpZmRlZiBIQVZFX1NURExJQl9ICisjIHVuZGVmIEhBVkVfU1RETElCX0gKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8anBlZ2xpYi5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfSlBFR19ERUMgXAorICAoZ3N0X2pwZWdfZGVjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9KUEVHX0RFQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0pQRUdfREVDLEdzdEpwZWdEZWMpKQorI2RlZmluZSBHU1RfSlBFR19ERUNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfSlBFR19ERUMsR3N0SnBlZ0RlY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0pQRUdfREVDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfSlBFR19ERUMpKQorI2RlZmluZSBHU1RfSVNfSlBFR19ERUNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfSlBFR19ERUMpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0SnBlZ0RlYyAgICAgICAgICAgR3N0SnBlZ0RlYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RKcGVnRGVjQ2xhc3MgICAgICBHc3RKcGVnRGVjQ2xhc3M7CisKK3N0cnVjdCBHc3RKcGVnRGVjRXJyb3JNZ3IgeworICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgICAgcHViOyAgIC8qIHB1YmxpYyBmaWVsZHMgKi8KKyAgam1wX2J1ZiAgICAgICAgICAgICAgICAgIHNldGptcF9idWZmZXI7Cit9OworCitzdHJ1Y3QgR3N0SnBlZ0RlY1NvdXJjZU1nciB7CisgIHN0cnVjdCBqcGVnX3NvdXJjZV9tZ3IgICBwdWI7ICAgLyogcHVibGljIGZpZWxkcyAqLworICBHc3RKcGVnRGVjICAgICAgICAgICAgICAqZGVjOworfTsKKworLyogQ2FuJ3QgdXNlIEdzdEJhc2VUcmFuc2Zvcm0sIGJlY2F1c2UgR3N0QmFzZVRyYW5zZm9ybQorICogZG9lc24ndCBoYW5kbGUgdGhlIE4gYnVmZmVycyBpbiwgMSBidWZmZXIgb3V0IGNhc2UsCisgKiBidXQgb25seSB0aGUgMS1pbiAxLW91dCBjYXNlICovCitzdHJ1Y3QgX0dzdEpwZWdEZWMgeworICBHc3RWaWRlb0RlY29kZXIgZGVjb2RlcjsKKworICAvKiBuZWdvdGlhdGVkIHN0YXRlICovCisgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqaW5wdXRfc3RhdGU7CisgIEdzdFZpZGVvQ29kZWNGcmFtZSAqY3VycmVudF9mcmFtZTsKKyAgR3N0TWFwSW5mbyBjdXJyZW50X2ZyYW1lX21hcDsKKworICAvKiBwYXJzZSBzdGF0ZSAqLworICBnYm9vbGVhbiBzYXdfaGVhZGVyOworICBnaW50ICAgICBwYXJzZV9lbnRyb3B5X2xlbjsKKyAgZ2ludCAgICAgcGFyc2VfcmVzeW5jOworCisgIC8qIHByb3BlcnRpZXMgKi8KKyAgZ2ludCAgICAgaWRjdF9tZXRob2Q7CisgIGdpbnQgICAgIG1heF9lcnJvcnM7ICAvKiBBVE9NSUMgKi8KKworICBzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCBjaW5mbzsKKyAgc3RydWN0IEdzdEpwZWdEZWNFcnJvck1nciAgICAgamVycjsKKyAgc3RydWN0IEdzdEpwZWdEZWNTb3VyY2VNZ3IgICAganNyYzsKKworICAvKiBhcnJheXMgZm9yIGluZGlyZWN0IGRlY29kaW5nICovCisgIGdib29sZWFuIGlkcl93aWR0aF9hbGxvY2F0ZWQ7CisgIGd1Y2hhciAqaWRyX3lbMTZdLCppZHJfdVsxNl0sKmlkcl92WzE2XTsKKyAgLyogY3VycmVudCAocGFyc2VkKSBpbWFnZSBzaXplICovCisgIGd1aW50ICAgIHJlbV9pbWdfbGVuOworfTsKKworc3RydWN0IF9Hc3RKcGVnRGVjQ2xhc3MgeworICBHc3RWaWRlb0RlY29kZXJDbGFzcyBkZWNvZGVyX2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2pwZWdfZGVjX2dldF90eXBlKHZvaWQpOworCisKK0dfRU5EX0RFQ0xTCisKKworI2VuZGlmIC8qIF9fR1NUX0pQRUdfREVDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L2pwZWcvZ3N0anBlZ2VuYy5jIGIvZXh0L2pwZWcvZ3N0anBlZ2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNGJlMDYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvanBlZy9nc3RqcGVnZW5jLmMKQEAgLTAsMCArMSw2NTkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBDb2xsYWJvcmEgTHRkLgorICoJQXV0aG9yIDogRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNvbGxhYm9yYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LWpwZWdlbmMKKyAqCisgKiBFbmNvZGVzIGpwZWcgaW1hZ2VzLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB2aWRlb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9NTAgISB2aWRlby94LXJhdywgZnJhbWVyYXRlPScoZnJhY3Rpb24pJzUvMSAhIGpwZWdlbmMgISBhdmltdXggISBmaWxlc2luayBsb2NhdGlvbj1tanBlZy5hdmkKKyAqIF18IGEgcGlwZWxpbmUgdG8gbXV4IDUgSlBFRyBmcmFtZXMgcGVyIHNlY29uZCBpbnRvIGEgMTAgc2VjLiBsb25nIG1vdGlvbiBqcGVnCisgKiBhdmkuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdGpwZWdlbmMuaCIKKyNpbmNsdWRlICJnc3RqcGVnLmgiCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvbWV0YS5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2Jhc2UuaD4KKworLyogZXhwZXJpbWVudGFsICovCisvKiBzZXR0aW5nIHNtb290aGlnIHNlZW1zIHRvIGhhdmUgbm8gZWZmZWN0IGluIGxpYmplcGVnCisjZGVmaW5lIEVOQUJMRV9TTU9PVEhJTkcgMQorKi8KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoanBlZ2VuY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBqcGVnZW5jX2RlYnVnCisKKyNkZWZpbmUgSlBFR19ERUZBVUxUX1FVQUxJVFkgODUKKyNkZWZpbmUgSlBFR19ERUZBVUxUX1NNT09USElORyAwCisjZGVmaW5lIEpQRUdfREVGQVVMVF9JRENUX01FVEhPRAlKRENUX0ZBU1RFU1QKKyNkZWZpbmUgSlBFR19ERUZBVUxUX1NOQVBTSE9UCQlGQUxTRQorCisvKiBKcGVnRW5jIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUVVBTElUWSwKKyAgUFJPUF9TTU9PVEhJTkcsCisgIFBST1BfSURDVF9NRVRIT0QsCisgIFBST1BfU05BUFNIT1QKK307CisKK3N0YXRpYyB2b2lkIGdzdF9qcGVnZW5jX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIHZvaWQgZ3N0X2pwZWdlbmNfcmVzeW5jIChHc3RKcGVnRW5jICoganBlZ2VuYyk7CitzdGF0aWMgdm9pZCBnc3RfanBlZ2VuY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfanBlZ2VuY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfanBlZ2VuY19zdGFydCAoR3N0VmlkZW9FbmNvZGVyICogYmVuYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2pwZWdlbmNfc3RvcCAoR3N0VmlkZW9FbmNvZGVyICogYmVuYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2pwZWdlbmNfc2V0X2Zvcm1hdCAoR3N0VmlkZW9FbmNvZGVyICogZW5jb2RlciwKKyAgICBHc3RWaWRlb0NvZGVjU3RhdGUgKiBzdGF0ZSk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfanBlZ2VuY19oYW5kbGVfZnJhbWUgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIsCisgICAgR3N0VmlkZW9Db2RlY0ZyYW1lICogZnJhbWUpOworc3RhdGljIGdib29sZWFuIGdzdF9qcGVnZW5jX3Byb3Bvc2VfYWxsb2NhdGlvbiAoR3N0VmlkZW9FbmNvZGVyICogZW5jb2RlciwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworLyogc3RhdGljIGd1aW50IGdzdF9qcGVnZW5jX3NpZ25hbHNbTEFTVF9TSUdOQUxdID0geyAwIH07ICovCisKKyNkZWZpbmUgZ3N0X2pwZWdlbmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0SnBlZ0VuYywgZ3N0X2pwZWdlbmMsIEdTVF9UWVBFX1ZJREVPX0VOQ09ERVIpOworCisvKiAqSU5ERU5ULU9GRiogKi8KK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfanBlZ2VuY19zaW5rX3BhZF90ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UKKyAgICAgICAgKCJ7IEk0MjAsIFlWMTIsIFlVWTIsIFVZVlksIFk0MUIsIFk0MkIsIFlWWVUsIFk0NDQsIE5WMjEsICIKKyAgICAgICAgICJOVjEyLCBSR0IsIEJHUiwgUkdCeCwgeFJHQiwgQkdSeCwgeEJHUiwgR1JBWTggfSIpKQorICAgICk7CisvKiAqSU5ERU5ULU9OKiAqLworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X2pwZWdlbmNfc3JjX3BhZF90ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiaW1hZ2UvanBlZywgIgorICAgICAgICAid2lkdGggPSAoaW50KSBbIDE2LCA2NTUzNSBdLCAiCisgICAgICAgICJoZWlnaHQgPSAoaW50KSBbIDE2LCA2NTUzNSBdLCAiCisgICAgICAgICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMC8xLCBNQVggXSwgIgorICAgICAgICAic29mLW1hcmtlciA9IChpbnQpIHsgMCwgMSwgMiwgOSB9IikKKyAgICApOworCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdlbmNfY2xhc3NfaW5pdCAoR3N0SnBlZ0VuY0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworICBHc3RWaWRlb0VuY29kZXJDbGFzcyAqdmVuY19jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIHZlbmNfY2xhc3MgPSAoR3N0VmlkZW9FbmNvZGVyQ2xhc3MgKikga2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfanBlZ2VuY19maW5hbGl6ZTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2pwZWdlbmNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfanBlZ2VuY19nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9RVUFMSVRZLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInF1YWxpdHkiLCAiUXVhbGl0eSIsICJRdWFsaXR5IG9mIGVuY29kaW5nIiwKKyAgICAgICAgICAwLCAxMDAsIEpQRUdfREVGQVVMVF9RVUFMSVRZLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8CisgICAgICAgICAgR1NUX1BBUkFNX01VVEFCTEVfUExBWUlORykpOworCisjaWZkZWYgRU5BQkxFX1NNT09USElORworICAvKiBkaXNhYmxlZCwgc2luY2UgaXQgZG9lc24ndCBzZWVtIHRvIHdvcmsgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TTU9PVEhJTkcsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgic21vb3RoaW5nIiwgIlNtb290aGluZyIsICJTbW9vdGhpbmcgZmFjdG9yIiwKKyAgICAgICAgICAwLCAxMDAsIEpQRUdfREVGQVVMVF9TTU9PVEhJTkcsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisjZW5kaWYKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0lEQ1RfTUVUSE9ELAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJpZGN0LW1ldGhvZCIsICJJRENUIE1ldGhvZCIsCisgICAgICAgICAgIlRoZSBJRENUIGFsZ29yaXRobSB0byB1c2UiLCBHU1RfVFlQRV9JRENUX01FVEhPRCwKKyAgICAgICAgICBKUEVHX0RFRkFVTFRfSURDVF9NRVRIT0QsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RKcGVnRW5jOnNuYXBzaG90OgorICAgKgorICAgKiBTZW5kIEVPUyBhZnRlciBlbmNvZGluZyBhIGZyYW1lLCB1c2VmdWwgZm9yIHNuYXBzaG90cy4KKyAgICoKKyAgICogU2luY2U6IDEuMTQKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU05BUFNIT1QsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInNuYXBzaG90IiwgIlNuYXBzaG90IiwKKyAgICAgICAgICAiU2VuZCBFT1MgYWZ0ZXIgZW5jb2RpbmcgYSBmcmFtZSwgdXNlZnVsIGZvciBzbmFwc2hvdHMiLAorICAgICAgICAgIEpQRUdfREVGQVVMVF9TTkFQU0hPVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X2pwZWdlbmNfc2lua19wYWRfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfanBlZ2VuY19zcmNfcGFkX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiSlBFRyBpbWFnZSBlbmNvZGVyIiwKKyAgICAgICJDb2RlYy9FbmNvZGVyL0ltYWdlIiwgIkVuY29kZSBpbWFnZXMgaW4gSlBFRyBmb3JtYXQiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0B0dmQuYmU+Iik7CisKKyAgdmVuY19jbGFzcy0+c3RhcnQgPSBnc3RfanBlZ2VuY19zdGFydDsKKyAgdmVuY19jbGFzcy0+c3RvcCA9IGdzdF9qcGVnZW5jX3N0b3A7CisgIHZlbmNfY2xhc3MtPnNldF9mb3JtYXQgPSBnc3RfanBlZ2VuY19zZXRfZm9ybWF0OworICB2ZW5jX2NsYXNzLT5oYW5kbGVfZnJhbWUgPSBnc3RfanBlZ2VuY19oYW5kbGVfZnJhbWU7CisgIHZlbmNfY2xhc3MtPnByb3Bvc2VfYWxsb2NhdGlvbiA9IGdzdF9qcGVnZW5jX3Byb3Bvc2VfYWxsb2NhdGlvbjsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoanBlZ2VuY19kZWJ1ZywgImpwZWdlbmMiLCAwLAorICAgICAgIkpQRUcgZW5jb2RpbmcgZWxlbWVudCIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdlbmNfaW5pdF9kZXN0aW5hdGlvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIEdTVF9ERUJVRyAoImdzdF9qcGVnZW5jX2NoYWluOiBpbml0X2Rlc3RpbmF0aW9uIik7Cit9CisKK3N0YXRpYyB2b2lkCitlbnN1cmVfbWVtb3J5IChHc3RKcGVnRW5jICoganBlZ2VuYykKK3sKKyAgR3N0TWVtb3J5ICpuZXdfbWVtb3J5OworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3NpemUgb2xkX3NpemUsIGRlc2lyZWRfc2l6ZSwgbmV3X3NpemU7CisgIGd1aW50OCAqbmV3X2RhdGE7CisgIHN0YXRpYyBHc3RBbGxvY2F0aW9uUGFyYW1zIHBhcmFtcyA9IHsgMCwgMywgMCwgMCwgfTsKKworICBvbGRfc2l6ZSA9IGpwZWdlbmMtPm91dHB1dF9tYXAuc2l6ZTsKKyAgaWYgKG9sZF9zaXplID09IDApCisgICAgZGVzaXJlZF9zaXplID0ganBlZ2VuYy0+YnVmc2l6ZTsKKyAgZWxzZQorICAgIGRlc2lyZWRfc2l6ZSA9IG9sZF9zaXplICogMjsKKworICAvKiBPdXIgb3V0cHV0IG1lbW9yeSB3YXNuJ3QgYmlnIGVub3VnaC4KKyAgICogTWFrZSBhIG5ldyBtZW1vcnkgdGhhdCdzIHR3aWNlIHRoZSBzaXplLCAqLworICBuZXdfbWVtb3J5ID0gZ3N0X2FsbG9jYXRvcl9hbGxvYyAoTlVMTCwgZGVzaXJlZF9zaXplLCAmcGFyYW1zKTsKKyAgZ3N0X21lbW9yeV9tYXAgKG5ld19tZW1vcnksICZtYXAsIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgbmV3X2RhdGEgPSBtYXAuZGF0YTsKKyAgbmV3X3NpemUgPSBtYXAuc2l6ZTsKKworICAvKiBjb3B5IHByZXZpb3VzIGRhdGEgaWYgYW55ICovCisgIGlmIChqcGVnZW5jLT5vdXRwdXRfbWVtKSB7CisgICAgbWVtY3B5IChuZXdfZGF0YSwganBlZ2VuYy0+b3V0cHV0X21hcC5kYXRhLCBvbGRfc2l6ZSk7CisgICAgZ3N0X21lbW9yeV91bm1hcCAoanBlZ2VuYy0+b3V0cHV0X21lbSwgJmpwZWdlbmMtPm91dHB1dF9tYXApOworICAgIGdzdF9tZW1vcnlfdW5yZWYgKGpwZWdlbmMtPm91dHB1dF9tZW0pOworICB9CisKKyAgLyogZHJvcCBpdCBpbnRvIHBsYWNlLCAqLworICBqcGVnZW5jLT5vdXRwdXRfbWVtID0gbmV3X21lbW9yeTsKKyAganBlZ2VuYy0+b3V0cHV0X21hcCA9IG1hcDsKKworICAvKiBhbmQgbGFzdCwgdXBkYXRlIGxpYmpwZWcgb24gd2hlcmUgdG8gd29yay4gKi8KKyAganBlZ2VuYy0+amRlc3QubmV4dF9vdXRwdXRfYnl0ZSA9IG5ld19kYXRhICsgb2xkX3NpemU7CisgIGpwZWdlbmMtPmpkZXN0LmZyZWVfaW5fYnVmZmVyID0gbmV3X3NpemUgLSBvbGRfc2l6ZTsKK30KKworc3RhdGljIGJvb2xlYW4KK2dzdF9qcGVnZW5jX2ZsdXNoX2Rlc3RpbmF0aW9uIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgR3N0SnBlZ0VuYyAqanBlZ2VuYyA9IChHc3RKcGVnRW5jICopIChjaW5mby0+Y2xpZW50X2RhdGEpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGpwZWdlbmMsCisgICAgICAiZ3N0X2pwZWdlbmNfY2hhaW46IGZsdXNoX2Rlc3RpbmF0aW9uOiBidWZmZXIgdG9vIHNtYWxsIik7CisKKyAgZW5zdXJlX21lbW9yeSAoanBlZ2VuYyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfanBlZ2VuY190ZXJtX2Rlc3RpbmF0aW9uIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIEdzdEpwZWdFbmMgKmpwZWdlbmMgPSAoR3N0SnBlZ0VuYyAqKSAoY2luZm8tPmNsaWVudF9kYXRhKTsKKyAgZ3NpemUgbWVtb3J5X3NpemUgPSBqcGVnZW5jLT5vdXRwdXRfbWFwLnNpemUgLSBqcGVnZW5jLT5qZGVzdC5mcmVlX2luX2J1ZmZlcjsKKyAgR3N0Qnl0ZVJlYWRlciByZWFkZXIgPQorICAgICAgR1NUX0JZVEVfUkVBREVSX0lOSVQgKGpwZWdlbmMtPm91dHB1dF9tYXAuZGF0YSwgbWVtb3J5X3NpemUpOworICBndWludDE2IG1hcmtlcjsKKyAgZ2ludCBzb2ZfbWFya2VyID0gLTE7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoanBlZ2VuYywgImdzdF9qcGVnZW5jX2NoYWluOiB0ZXJtX3NvdXJjZSIpOworCisgIC8qIEZpbmQgdGhlIFNPRiBtYXJrZXIgKi8KKyAgd2hpbGUgKGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2JlICgmcmVhZGVyLCAmbWFya2VyKSkgeworICAgIC8qIFNPRiBtYXJrZXIgKi8KKyAgICBpZiAobWFya2VyID4+IDQgPT0gMHgwZmZjKSB7CisgICAgICBzb2ZfbWFya2VyID0gbWFya2VyICYgMHg0OworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgZ3N0X21lbW9yeV91bm1hcCAoanBlZ2VuYy0+b3V0cHV0X21lbSwgJmpwZWdlbmMtPm91dHB1dF9tYXApOworICAvKiBUcmltIHRoZSBidWZmZXIgc2l6ZS4gd2Ugd2lsbCBwdXNoIGl0IGluIHRoZSBjaGFpbiBmdW5jdGlvbiAqLworICBnc3RfbWVtb3J5X3Jlc2l6ZSAoanBlZ2VuYy0+b3V0cHV0X21lbSwgMCwgbWVtb3J5X3NpemUpOworICBqcGVnZW5jLT5vdXRwdXRfbWFwLmRhdGEgPSBOVUxMOworICBqcGVnZW5jLT5vdXRwdXRfbWFwLnNpemUgPSAwOworCisgIGlmIChqcGVnZW5jLT5zb2ZfbWFya2VyICE9IHNvZl9tYXJrZXIgfHwganBlZ2VuYy0+aW5wdXRfY2Fwc19jaGFuZ2VkKSB7CisgICAgR3N0VmlkZW9Db2RlY1N0YXRlICpvdXRwdXQ7CisgICAgb3V0cHV0ID0KKyAgICAgICAgZ3N0X3ZpZGVvX2VuY29kZXJfc2V0X291dHB1dF9zdGF0ZSAoR1NUX1ZJREVPX0VOQ09ERVIgKGpwZWdlbmMpLAorICAgICAgICBnc3RfY2Fwc19uZXdfc2ltcGxlICgiaW1hZ2UvanBlZyIsICJzb2YtbWFya2VyIiwgR19UWVBFX0lOVCwgc29mX21hcmtlciwKKyAgICAgICAgICAgIE5VTEwpLCBqcGVnZW5jLT5pbnB1dF9zdGF0ZSk7CisgICAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChvdXRwdXQpOworICAgIGpwZWdlbmMtPnNvZl9tYXJrZXIgPSBzb2ZfbWFya2VyOworICAgIGpwZWdlbmMtPmlucHV0X2NhcHNfY2hhbmdlZCA9IEZBTFNFOworICB9CisKKyAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgIGdzdF9idWZmZXJfY29weV9pbnRvIChvdXRidWYsIGpwZWdlbmMtPmN1cnJlbnRfZnJhbWUtPmlucHV0X2J1ZmZlciwKKyAgICAgIEdTVF9CVUZGRVJfQ09QWV9NRVRBREFUQSwgMCwgLTEpOworICBnc3RfYnVmZmVyX2FwcGVuZF9tZW1vcnkgKG91dGJ1ZiwganBlZ2VuYy0+b3V0cHV0X21lbSk7CisgIGpwZWdlbmMtPm91dHB1dF9tZW0gPSBOVUxMOworCisgIGpwZWdlbmMtPmN1cnJlbnRfZnJhbWUtPm91dHB1dF9idWZmZXIgPSBvdXRidWY7CisKKyAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmanBlZ2VuYy0+Y3VycmVudF92ZnJhbWUpOworCisgIEdTVF9WSURFT19DT0RFQ19GUkFNRV9TRVRfU1lOQ19QT0lOVCAoanBlZ2VuYy0+Y3VycmVudF9mcmFtZSk7CisKKyAganBlZ2VuYy0+cmVzID0gZ3N0X3ZpZGVvX2VuY29kZXJfZmluaXNoX2ZyYW1lIChHU1RfVklERU9fRU5DT0RFUiAoanBlZ2VuYyksCisgICAgICBqcGVnZW5jLT5jdXJyZW50X2ZyYW1lKTsKKyAganBlZ2VuYy0+Y3VycmVudF9mcmFtZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfanBlZ2VuY19pbml0IChHc3RKcGVnRW5jICoganBlZ2VuYykKK3sKKyAgR1NUX1BBRF9TRVRfQUNDRVBUX1RFTVBMQVRFIChHU1RfVklERU9fRU5DT0RFUl9TSU5LX1BBRCAoanBlZ2VuYykpOworCisgIC8qIHNldHVwIGpwZWdsaWIgKi8KKyAgbWVtc2V0ICgmanBlZ2VuYy0+Y2luZm8sIDAsIHNpemVvZiAoanBlZ2VuYy0+Y2luZm8pKTsKKyAgbWVtc2V0ICgmanBlZ2VuYy0+amVyciwgMCwgc2l6ZW9mIChqcGVnZW5jLT5qZXJyKSk7CisgIGpwZWdlbmMtPmNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yICgmanBlZ2VuYy0+amVycik7CisgIGpwZWdfY3JlYXRlX2NvbXByZXNzICgmanBlZ2VuYy0+Y2luZm8pOworCisgIGpwZWdlbmMtPmpkZXN0LmluaXRfZGVzdGluYXRpb24gPSBnc3RfanBlZ2VuY19pbml0X2Rlc3RpbmF0aW9uOworICBqcGVnZW5jLT5qZGVzdC5lbXB0eV9vdXRwdXRfYnVmZmVyID0gZ3N0X2pwZWdlbmNfZmx1c2hfZGVzdGluYXRpb247CisgIGpwZWdlbmMtPmpkZXN0LnRlcm1fZGVzdGluYXRpb24gPSBnc3RfanBlZ2VuY190ZXJtX2Rlc3RpbmF0aW9uOworICBqcGVnZW5jLT5jaW5mby5kZXN0ID0gJmpwZWdlbmMtPmpkZXN0OworICBqcGVnZW5jLT5jaW5mby5jbGllbnRfZGF0YSA9IGpwZWdlbmM7CisKKyAgLyogaW5pdCBwcm9wZXJ0aWVzICovCisgIGpwZWdlbmMtPnF1YWxpdHkgPSBKUEVHX0RFRkFVTFRfUVVBTElUWTsKKyAganBlZ2VuYy0+c21vb3RoaW5nID0gSlBFR19ERUZBVUxUX1NNT09USElORzsKKyAganBlZ2VuYy0+aWRjdF9tZXRob2QgPSBKUEVHX0RFRkFVTFRfSURDVF9NRVRIT0Q7CisgIGpwZWdlbmMtPnNuYXBzaG90ID0gSlBFR19ERUZBVUxUX1NOQVBTSE9UOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdlbmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEpwZWdFbmMgKmZpbHRlciA9IEdTVF9KUEVHRU5DIChvYmplY3QpOworCisgIGpwZWdfZGVzdHJveV9jb21wcmVzcyAoJmZpbHRlci0+Y2luZm8pOworCisgIGlmIChmaWx0ZXItPmlucHV0X3N0YXRlKQorICAgIGdzdF92aWRlb19jb2RlY19zdGF0ZV91bnJlZiAoZmlsdGVyLT5pbnB1dF9zdGF0ZSk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9qcGVnZW5jX3NldF9mb3JtYXQgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIsIEdzdFZpZGVvQ29kZWNTdGF0ZSAqIHN0YXRlKQoreworICBHc3RKcGVnRW5jICplbmMgPSBHU1RfSlBFR0VOQyAoZW5jb2Rlcik7CisgIGdpbnQgaTsKKyAgR3N0VmlkZW9JbmZvICppbmZvID0gJnN0YXRlLT5pbmZvOworCisgIGlmIChlbmMtPmlucHV0X3N0YXRlKQorICAgIGdzdF92aWRlb19jb2RlY19zdGF0ZV91bnJlZiAoZW5jLT5pbnB1dF9zdGF0ZSk7CisgIGVuYy0+aW5wdXRfc3RhdGUgPSBnc3RfdmlkZW9fY29kZWNfc3RhdGVfcmVmIChzdGF0ZSk7CisKKyAgLyogcHJlcGFyZSBhIGNhY2hlZCBpbWFnZSBkZXNjcmlwdGlvbiAgKi8KKyAgZW5jLT5jaGFubmVscyA9IEdTVF9WSURFT19JTkZPX05fQ09NUE9ORU5UUyAoaW5mbyk7CisKKyAgLyogLi4uIGJ1dCBhbnkgYWxwaGEgaXMgZGlzcmVnYXJkZWQgaW4gZW5jb2RpbmcgKi8KKyAgaWYgKEdTVF9WSURFT19JTkZPX0lTX0dSQVkgKGluZm8pKQorICAgIGVuYy0+Y2hhbm5lbHMgPSAxOworCisgIGVuYy0+aF9tYXhfc2FtcCA9IDA7CisgIGVuYy0+dl9tYXhfc2FtcCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBlbmMtPmNoYW5uZWxzOyArK2kpIHsKKyAgICBlbmMtPmN3aWR0aFtpXSA9IEdTVF9WSURFT19JTkZPX0NPTVBfV0lEVEggKGluZm8sIGkpOworICAgIGVuYy0+Y2hlaWdodFtpXSA9IEdTVF9WSURFT19JTkZPX0NPTVBfSEVJR0hUIChpbmZvLCBpKTsKKyAgICBlbmMtPmluY1tpXSA9IEdTVF9WSURFT19JTkZPX0NPTVBfUFNUUklERSAoaW5mbywgaSk7CisgICAgZW5jLT5oX3NhbXBbaV0gPQorICAgICAgICBHU1RfUk9VTkRfVVBfNCAoR1NUX1ZJREVPX0lORk9fV0lEVEggKGluZm8pKSAvIGVuYy0+Y3dpZHRoW2ldOworICAgIGVuYy0+aF9tYXhfc2FtcCA9IE1BWCAoZW5jLT5oX21heF9zYW1wLCBlbmMtPmhfc2FtcFtpXSk7CisgICAgZW5jLT52X3NhbXBbaV0gPQorICAgICAgICBHU1RfUk9VTkRfVVBfNCAoR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbmZvKSkgLyBlbmMtPmNoZWlnaHRbaV07CisgICAgZW5jLT52X21heF9zYW1wID0gTUFYIChlbmMtPnZfbWF4X3NhbXAsIGVuYy0+dl9zYW1wW2ldKTsKKyAgfQorICAvKiBzYW1wIHNob3VsZCBvbmx5IGJlIDEsIDIgb3IgNCAqLworICBnX2Fzc2VydCAoZW5jLT5oX21heF9zYW1wIDw9IDQpOworICBnX2Fzc2VydCAoZW5jLT52X21heF9zYW1wIDw9IDQpOworCisgIC8qIG5vdyBpbnZlcnQgKi8KKyAgLyogbWF4aW11bSBpcyBpbnZhcmlhbnQsIGFzIG9uZSBvZiB0aGUgY29tcG9uZW50cyBzaG91bGQgaGF2ZSBzYW1wIDEgKi8KKyAgZm9yIChpID0gMDsgaSA8IGVuYy0+Y2hhbm5lbHM7ICsraSkgeworICAgIEdTVF9ERUJVRyAoIiVkICVkIiwgZW5jLT5oX3NhbXBbaV0sIGVuYy0+aF9tYXhfc2FtcCk7CisgICAgZW5jLT5oX3NhbXBbaV0gPSBlbmMtPmhfbWF4X3NhbXAgLyBlbmMtPmhfc2FtcFtpXTsKKyAgICBlbmMtPnZfc2FtcFtpXSA9IGVuYy0+dl9tYXhfc2FtcCAvIGVuYy0+dl9zYW1wW2ldOworICB9CisgIGVuYy0+cGxhbmFyID0gKGVuYy0+aW5jWzBdID09IDEgJiYgZW5jLT5pbmNbMV0gPT0gMSAmJiBlbmMtPmluY1syXSA9PSAxKTsKKworICBlbmMtPmlucHV0X2NhcHNfY2hhbmdlZCA9IFRSVUU7CisgIGdzdF9qcGVnZW5jX3Jlc3luYyAoZW5jKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9qcGVnZW5jX3Jlc3luYyAoR3N0SnBlZ0VuYyAqIGpwZWdlbmMpCit7CisgIEdzdFZpZGVvSW5mbyAqaW5mbzsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnaW50IGksIGo7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoanBlZ2VuYywgInJlc3luYyIpOworCisgIGlmICghanBlZ2VuYy0+aW5wdXRfc3RhdGUpCisgICAgcmV0dXJuOworCisgIGluZm8gPSAmanBlZ2VuYy0+aW5wdXRfc3RhdGUtPmluZm87CisKKyAganBlZ2VuYy0+Y2luZm8uaW1hZ2Vfd2lkdGggPSB3aWR0aCA9IEdTVF9WSURFT19JTkZPX1dJRFRIIChpbmZvKTsKKyAganBlZ2VuYy0+Y2luZm8uaW1hZ2VfaGVpZ2h0ID0gaGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbmZvKTsKKyAganBlZ2VuYy0+Y2luZm8uaW5wdXRfY29tcG9uZW50cyA9IGpwZWdlbmMtPmNoYW5uZWxzOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGpwZWdlbmMsICJ3aWR0aCAlZCwgaGVpZ2h0ICVkIiwgd2lkdGgsIGhlaWdodCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGpwZWdlbmMsICJmb3JtYXQgJWQiLCBHU1RfVklERU9fSU5GT19GT1JNQVQgKGluZm8pKTsKKworICBpZiAoR1NUX1ZJREVPX0lORk9fSVNfUkdCIChpbmZvKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGpwZWdlbmMsICJSR0IiKTsKKyAgICBqcGVnZW5jLT5jaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7CisgIH0gZWxzZSBpZiAoR1NUX1ZJREVPX0lORk9fSVNfR1JBWSAoaW5mbykpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqcGVnZW5jLCAiZ3JheSIpOworICAgIGpwZWdlbmMtPmNpbmZvLmluX2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqcGVnZW5jLCAiWVVWIik7CisgICAganBlZ2VuYy0+Y2luZm8uaW5fY29sb3Jfc3BhY2UgPSBKQ1NfWUNiQ3I7CisgIH0KKworICAvKiBpbnB1dCBidWZmZXIgc2l6ZSBhcyBtYXggb3V0cHV0ICovCisgIGpwZWdlbmMtPmJ1ZnNpemUgPSBHU1RfVklERU9fSU5GT19TSVpFIChpbmZvKTsKKyAganBlZ19zZXRfZGVmYXVsdHMgKCZqcGVnZW5jLT5jaW5mbyk7CisgIGpwZWdlbmMtPmNpbmZvLnJhd19kYXRhX2luID0gVFJVRTsKKyAgLyogZHVoLCBsaWJqcGVnIG1hcHMgUkdCIHRvIFlVViAuLi4gYW5kIGRvbid0IGV4cGVjdCBzb21lIGNvbnZlcnNpb24gKi8KKyAgaWYgKGpwZWdlbmMtPmNpbmZvLmluX2NvbG9yX3NwYWNlID09IEpDU19SR0IpCisgICAganBlZ19zZXRfY29sb3JzcGFjZSAoJmpwZWdlbmMtPmNpbmZvLCBKQ1NfUkdCKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChqcGVnZW5jLCAiaF9tYXhfc2FtcD0lZCwgdl9tYXhfc2FtcD0lZCIsCisgICAgICBqcGVnZW5jLT5oX21heF9zYW1wLCBqcGVnZW5jLT52X21heF9zYW1wKTsKKyAgLyogaW1hZ2UgZGltZW5zaW9uIGluZm8gKi8KKyAgZm9yIChpID0gMDsgaSA8IGpwZWdlbmMtPmNoYW5uZWxzOyBpKyspIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqcGVnZW5jLCAiY29tcCAlaTogaF9zYW1wPSVkLCB2X3NhbXA9JWQiLCBpLAorICAgICAgICBqcGVnZW5jLT5oX3NhbXBbaV0sIGpwZWdlbmMtPnZfc2FtcFtpXSk7CisgICAganBlZ2VuYy0+Y2luZm8uY29tcF9pbmZvW2ldLmhfc2FtcF9mYWN0b3IgPSBqcGVnZW5jLT5oX3NhbXBbaV07CisgICAganBlZ2VuYy0+Y2luZm8uY29tcF9pbmZvW2ldLnZfc2FtcF9mYWN0b3IgPSBqcGVnZW5jLT52X3NhbXBbaV07CisgICAgZ19mcmVlIChqcGVnZW5jLT5saW5lW2ldKTsKKyAgICBqcGVnZW5jLT5saW5lW2ldID0gZ19uZXcgKGd1Y2hhciAqLCBqcGVnZW5jLT52X21heF9zYW1wICogRENUU0laRSk7CisgICAgaWYgKCFqcGVnZW5jLT5wbGFuYXIpIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBqcGVnZW5jLT52X21heF9zYW1wICogRENUU0laRTsgaisrKSB7CisgICAgICAgIGdfZnJlZSAoanBlZ2VuYy0+cm93W2ldW2pdKTsKKyAgICAgICAganBlZ2VuYy0+cm93W2ldW2pdID0gZ19tYWxsb2MgKHdpZHRoKTsKKyAgICAgICAganBlZ2VuYy0+bGluZVtpXVtqXSA9IGpwZWdlbmMtPnJvd1tpXVtqXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBndWFyZCBhZ2FpbnN0IGEgcG90ZW50aWFsIGVycm9yIGluIGdzdF9qcGVnZW5jX3Rlcm1fZGVzdGluYXRpb24KKyAgICAgd2hpY2ggb2NjdXJzIGlmZiBidWZzaXplICUgNCA8IGZyZWVfc3BhY2VfcmVtYWluaW5nICovCisgIGpwZWdlbmMtPmJ1ZnNpemUgPSBHU1RfUk9VTkRfVVBfNCAoanBlZ2VuYy0+YnVmc2l6ZSk7CisKKyAganBlZ19zdXBwcmVzc190YWJsZXMgKCZqcGVnZW5jLT5jaW5mbywgVFJVRSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoanBlZ2VuYywgInJlc3luYyBkb25lIik7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfanBlZ2VuY19oYW5kbGVfZnJhbWUgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIsIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lKQoreworICBHc3RKcGVnRW5jICpqcGVnZW5jOworICBndWludCBoZWlnaHQ7CisgIGd1Y2hhciAqYmFzZVszXSwgKmVuZFszXTsKKyAgZ3VpbnQgc3RyaWRlWzNdOworICBnaW50IGksIGosIGs7CisgIHN0YXRpYyBHc3RBbGxvY2F0aW9uUGFyYW1zIHBhcmFtcyA9IHsgMCwgMCwgMCwgMywgfTsKKworICBqcGVnZW5jID0gR1NUX0pQRUdFTkMgKGVuY29kZXIpOworCisgIEdTVF9MT0dfT0JKRUNUIChqcGVnZW5jLCAiZ290IG5ldyBmcmFtZSIpOworCisgIGlmICghZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJmpwZWdlbmMtPmN1cnJlbnRfdmZyYW1lLAorICAgICAgICAgICZqcGVnZW5jLT5pbnB1dF9zdGF0ZS0+aW5mbywgZnJhbWUtPmlucHV0X2J1ZmZlciwgR1NUX01BUF9SRUFEKSkKKyAgICBnb3RvIGludmFsaWRfZnJhbWU7CisKKyAganBlZ2VuYy0+Y3VycmVudF9mcmFtZSA9IGZyYW1lOworCisgIGhlaWdodCA9IEdTVF9WSURFT19JTkZPX0hFSUdIVCAoJmpwZWdlbmMtPmlucHV0X3N0YXRlLT5pbmZvKTsKKworICBmb3IgKGkgPSAwOyBpIDwganBlZ2VuYy0+Y2hhbm5lbHM7IGkrKykgeworICAgIGJhc2VbaV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBICgmanBlZ2VuYy0+Y3VycmVudF92ZnJhbWUsIGkpOworICAgIHN0cmlkZVtpXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoJmpwZWdlbmMtPmN1cnJlbnRfdmZyYW1lLCBpKTsKKyAgICBlbmRbaV0gPQorICAgICAgICBiYXNlW2ldICsgR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUICgmanBlZ2VuYy0+Y3VycmVudF92ZnJhbWUsCisgICAgICAgIGkpICogc3RyaWRlW2ldOworICB9CisKKyAganBlZ2VuYy0+cmVzID0gR1NUX0ZMT1dfT0s7CisgIGpwZWdlbmMtPm91dHB1dF9tZW0gPSBnc3RfYWxsb2NhdG9yX2FsbG9jIChOVUxMLCBqcGVnZW5jLT5idWZzaXplLCAmcGFyYW1zKTsKKyAgZ3N0X21lbW9yeV9tYXAgKGpwZWdlbmMtPm91dHB1dF9tZW0sICZqcGVnZW5jLT5vdXRwdXRfbWFwLCBHU1RfTUFQX1JFQURXUklURSk7CisKKyAganBlZ2VuYy0+amRlc3QubmV4dF9vdXRwdXRfYnl0ZSA9IGpwZWdlbmMtPm91dHB1dF9tYXAuZGF0YTsKKyAganBlZ2VuYy0+amRlc3QuZnJlZV9pbl9idWZmZXIgPSBqcGVnZW5jLT5vdXRwdXRfbWFwLnNpemU7CisKKyAgLyogcHJlcGFyZSBmb3IgcmF3IGlucHV0ICovCisjaWYgSlBFR19MSUJfVkVSU0lPTiA+PSA3MAorICBqcGVnZW5jLT5jaW5mby5kb19mYW5jeV9kb3duc2FtcGxpbmcgPSBGQUxTRTsKKyNlbmRpZgorCisgIEdTVF9PQkpFQ1RfTE9DSyAoanBlZ2VuYyk7CisgIGpwZWdlbmMtPmNpbmZvLnNtb290aGluZ19mYWN0b3IgPSBqcGVnZW5jLT5zbW9vdGhpbmc7CisgIGpwZWdlbmMtPmNpbmZvLmRjdF9tZXRob2QgPSBqcGVnZW5jLT5pZGN0X21ldGhvZDsKKyAganBlZ19zZXRfcXVhbGl0eSAoJmpwZWdlbmMtPmNpbmZvLCBqcGVnZW5jLT5xdWFsaXR5LCBUUlVFKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGpwZWdlbmMpOworCisgIGpwZWdfc3RhcnRfY29tcHJlc3MgKCZqcGVnZW5jLT5jaW5mbywgVFJVRSk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGpwZWdlbmMsICJjb21wcmVzc2luZyIpOworCisgIGlmIChqcGVnZW5jLT5wbGFuYXIpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpICs9IGpwZWdlbmMtPnZfbWF4X3NhbXAgKiBEQ1RTSVpFKSB7CisgICAgICBmb3IgKGsgPSAwOyBrIDwganBlZ2VuYy0+Y2hhbm5lbHM7IGsrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwganBlZ2VuYy0+dl9zYW1wW2tdICogRENUU0laRTsgaisrKSB7CisgICAgICAgICAganBlZ2VuYy0+bGluZVtrXVtqXSA9IGJhc2Vba107CisgICAgICAgICAgaWYgKGJhc2Vba10gKyBzdHJpZGVba10gPCBlbmRba10pCisgICAgICAgICAgICBiYXNlW2tdICs9IHN0cmlkZVtrXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAganBlZ193cml0ZV9yYXdfZGF0YSAoJmpwZWdlbmMtPmNpbmZvLCBqcGVnZW5jLT5saW5lLAorICAgICAgICAgIGpwZWdlbmMtPnZfbWF4X3NhbXAgKiBEQ1RTSVpFKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSArPSBqcGVnZW5jLT52X21heF9zYW1wICogRENUU0laRSkgeworICAgICAgZm9yIChrID0gMDsgayA8IGpwZWdlbmMtPmNoYW5uZWxzOyBrKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGpwZWdlbmMtPnZfc2FtcFtrXSAqIERDVFNJWkU7IGorKykgeworICAgICAgICAgIGd1Y2hhciAqc3JjLCAqZHN0OworICAgICAgICAgIGdpbnQgbDsKKworICAgICAgICAgIC8qIG91Y2gsIGNvcHkgbGluZSAqLworICAgICAgICAgIHNyYyA9IGJhc2Vba107CisgICAgICAgICAgZHN0ID0ganBlZ2VuYy0+bGluZVtrXVtqXTsKKyAgICAgICAgICBmb3IgKGwgPSBqcGVnZW5jLT5jd2lkdGhba107IGwgPiAwOyBsLS0pIHsKKyAgICAgICAgICAgICpkc3QgPSAqc3JjOworICAgICAgICAgICAgc3JjICs9IGpwZWdlbmMtPmluY1trXTsKKyAgICAgICAgICAgIGRzdCsrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoYmFzZVtrXSArIHN0cmlkZVtrXSA8IGVuZFtrXSkKKyAgICAgICAgICAgIGJhc2Vba10gKz0gc3RyaWRlW2tdOworICAgICAgICB9CisgICAgICB9CisgICAgICBqcGVnX3dyaXRlX3Jhd19kYXRhICgmanBlZ2VuYy0+Y2luZm8sIGpwZWdlbmMtPmxpbmUsCisgICAgICAgICAganBlZ2VuYy0+dl9tYXhfc2FtcCAqIERDVFNJWkUpOworICAgIH0KKyAgfQorCisgIC8qIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCBnc3RfanBlZ2VuY190ZXJtX2Rlc3RpbmF0aW9uIGlzIGNhbGxlZCAqLworICBqcGVnX2ZpbmlzaF9jb21wcmVzcyAoJmpwZWdlbmMtPmNpbmZvKTsKKyAgR1NUX0xPR19PQkpFQ1QgKGpwZWdlbmMsICJjb21wcmVzc2luZyBkb25lIik7CisKKyAgcmV0dXJuIChqcGVnZW5jLT5zbmFwc2hvdCkgPyBHU1RfRkxPV19FT1MgOiBqcGVnZW5jLT5yZXM7CisKK2ludmFsaWRfZnJhbWU6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGpwZWdlbmMsICJpbnZhbGlkIGZyYW1lIHJlY2VpdmVkIik7CisgICAgcmV0dXJuIGdzdF92aWRlb19lbmNvZGVyX2ZpbmlzaF9mcmFtZSAoZW5jb2RlciwgZnJhbWUpOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2pwZWdlbmNfcHJvcG9zZV9hbGxvY2F0aW9uIChHc3RWaWRlb0VuY29kZXIgKiBlbmNvZGVyLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnc3RfcXVlcnlfYWRkX2FsbG9jYXRpb25fbWV0YSAocXVlcnksIEdTVF9WSURFT19NRVRBX0FQSV9UWVBFLCBOVUxMKTsKKworICByZXR1cm4gR1NUX1ZJREVPX0VOQ09ERVJfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnByb3Bvc2VfYWxsb2NhdGlvbiAoZW5jb2RlciwKKyAgICAgIHF1ZXJ5KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9qcGVnZW5jX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RKcGVnRW5jICpqcGVnZW5jID0gR1NUX0pQRUdFTkMgKG9iamVjdCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChqcGVnZW5jKTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUVVBTElUWToKKyAgICAgIGpwZWdlbmMtPnF1YWxpdHkgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworI2lmZGVmIEVOQUJMRV9TTU9PVEhJTkcKKyAgICBjYXNlIFBST1BfU01PT1RISU5HOgorICAgICAganBlZ2VuYy0+c21vb3RoaW5nID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgUFJPUF9JRENUX01FVEhPRDoKKyAgICAgIGpwZWdlbmMtPmlkY3RfbWV0aG9kID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NOQVBTSE9UOgorICAgICAganBlZ2VuYy0+c25hcHNob3QgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGpwZWdlbmMpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdlbmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEpwZWdFbmMgKmpwZWdlbmMgPSBHU1RfSlBFR0VOQyAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGpwZWdlbmMpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9RVUFMSVRZOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwganBlZ2VuYy0+cXVhbGl0eSk7CisgICAgICBicmVhazsKKyNpZmRlZiBFTkFCTEVfU01PT1RISU5HCisgICAgY2FzZSBQUk9QX1NNT09USElORzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGpwZWdlbmMtPnNtb290aGluZyk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgUFJPUF9JRENUX01FVEhPRDoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBqcGVnZW5jLT5pZGN0X21ldGhvZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU05BUFNIT1Q6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwganBlZ2VuYy0+c25hcHNob3QpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorCisgIEdTVF9PQkpFQ1RfVU5MT0NLIChqcGVnZW5jKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfanBlZ2VuY19zdGFydCAoR3N0VmlkZW9FbmNvZGVyICogYmVuYykKK3sKKyAgR3N0SnBlZ0VuYyAqZW5jID0gKEdzdEpwZWdFbmMgKikgYmVuYzsKKworICBlbmMtPmxpbmVbMF0gPSBOVUxMOworICBlbmMtPmxpbmVbMV0gPSBOVUxMOworICBlbmMtPmxpbmVbMl0gPSBOVUxMOworICBlbmMtPnNvZl9tYXJrZXIgPSAtMTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfanBlZ2VuY19zdG9wIChHc3RWaWRlb0VuY29kZXIgKiBiZW5jKQoreworICBHc3RKcGVnRW5jICplbmMgPSAoR3N0SnBlZ0VuYyAqKSBiZW5jOworICBnaW50IGksIGo7CisKKyAgZ19mcmVlIChlbmMtPmxpbmVbMF0pOworICBnX2ZyZWUgKGVuYy0+bGluZVsxXSk7CisgIGdfZnJlZSAoZW5jLT5saW5lWzJdKTsKKyAgZW5jLT5saW5lWzBdID0gTlVMTDsKKyAgZW5jLT5saW5lWzFdID0gTlVMTDsKKyAgZW5jLT5saW5lWzJdID0gTlVMTDsKKyAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCA0ICogRENUU0laRTsgaisrKSB7CisgICAgICBnX2ZyZWUgKGVuYy0+cm93W2ldW2pdKTsKKyAgICAgIGVuYy0+cm93W2ldW2pdID0gTlVMTDsKKyAgICB9CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2V4dC9qcGVnL2dzdGpwZWdlbmMuaCBiL2V4dC9qcGVnL2dzdGpwZWdlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjc1Mjk5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2pwZWcvZ3N0anBlZ2VuYy5oCkBAIC0wLDAgKzEsMTAzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgQ29sbGFib3JhIEx0ZC4KKyAqCUF1dGhvciA6IEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjb2xsYWJvcmEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9KUEVHRU5DX0hfXworI2RlZmluZSBfX0dTVF9KUEVHRU5DX0hfXworCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZW5jb2Rlci5oPgorLyogdGhpcyBpcyBhIGhhY2sgaGFjayBoYWNrIHRvIGdldCBhcm91bmQganBlZ2xpYiBoZWFkZXIgYnVncy4uLiAqLworI2lmZGVmIEhBVkVfU1RETElCX0gKKyMgdW5kZWYgSEFWRV9TVERMSUJfSAorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxqcGVnbGliLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfSlBFR0VOQyBcCisgIChnc3RfanBlZ2VuY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfSlBFR0VOQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0pQRUdFTkMsR3N0SnBlZ0VuYykpCisjZGVmaW5lIEdTVF9KUEVHRU5DX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0pQRUdFTkMsR3N0SnBlZ0VuY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0pQRUdFTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9KUEVHRU5DKSkKKyNkZWZpbmUgR1NUX0lTX0pQRUdFTkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfSlBFR0VOQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RKcGVnRW5jIEdzdEpwZWdFbmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0SnBlZ0VuY0NsYXNzIEdzdEpwZWdFbmNDbGFzczsKKworc3RydWN0IF9Hc3RKcGVnRW5jCit7CisgIEdzdFZpZGVvRW5jb2RlciBlbmNvZGVyOworCisgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqaW5wdXRfc3RhdGU7CisgIEdzdFZpZGVvRnJhbWUgY3VycmVudF92ZnJhbWU7CisgIEdzdFZpZGVvQ29kZWNGcmFtZSAqY3VycmVudF9mcmFtZTsKKyAgR3N0Rmxvd1JldHVybiByZXM7CisKKyAgZ2Jvb2xlYW4gaW5wdXRfY2Fwc19jaGFuZ2VkOworCisgIGd1aW50IGNoYW5uZWxzOworCisgIGdpbnQgaW5jW0dTVF9WSURFT19NQVhfQ09NUE9ORU5UU107CisgIGdpbnQgY3dpZHRoW0dTVF9WSURFT19NQVhfQ09NUE9ORU5UU107CisgIGdpbnQgY2hlaWdodFtHU1RfVklERU9fTUFYX0NPTVBPTkVOVFNdOworICBnaW50IGhfc2FtcFtHU1RfVklERU9fTUFYX0NPTVBPTkVOVFNdOworICBnaW50IHZfc2FtcFtHU1RfVklERU9fTUFYX0NPTVBPTkVOVFNdOworICBnaW50IGhfbWF4X3NhbXA7CisgIGdpbnQgdl9tYXhfc2FtcDsKKyAgZ2Jvb2xlYW4gcGxhbmFyOworICBnaW50IHNvZl9tYXJrZXI7CisgIC8qIHRoZSB2aWRlbyBidWZmZXIgKi8KKyAgZ2ludCBidWZzaXplOworICAvKiB0aGUganBlZyBsaW5lIGJ1ZmZlciAqLworICBndWNoYXIgKipsaW5lWzNdOworICAvKiBpbmRpcmVjdCBlbmNvZGluZyBsaW5lIGJ1ZmZlcnMgKi8KKyAgZ3VjaGFyICpyb3dbM11bNCAqIERDVFNJWkVdOworCisgIHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbzsKKyAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7CisgIHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciBqZGVzdDsKKworICAvKiBwcm9wZXJ0aWVzICovCisgIGdpbnQgcXVhbGl0eTsKKyAgZ2ludCBzbW9vdGhpbmc7CisgIGdpbnQgaWRjdF9tZXRob2Q7CisgIGdib29sZWFuIHNuYXBzaG90OworCisgIEdzdE1lbW9yeSAqb3V0cHV0X21lbTsKKyAgR3N0TWFwSW5mbyBvdXRwdXRfbWFwOworfTsKKworc3RydWN0IF9Hc3RKcGVnRW5jQ2xhc3MKK3sKKyAgR3N0VmlkZW9FbmNvZGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2pwZWdlbmNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX0pQRUdFTkNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvanBlZy9nc3RzbW9rZWRlYy5jIGIvZXh0L2pwZWcvZ3N0c21va2VkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTZkOTU0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2pwZWcvZ3N0c21va2VkZWMuYwpAQCAtMCwwICsxLDMzMiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXNtb2tlZGVjCisgKgorICogRGVjb2RlcyBpbWFnZXMgaW4gc21va2UgZm9ybWF0LgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyojZGVmaW5lIERFQlVHX0VOQUJMRUQqLworI2luY2x1ZGUgImdzdHNtb2tlZGVjLmgiCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHNtb2tlZGVjX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHNtb2tlZGVjX2RlYnVnCisKKy8qIFNtb2tlRGVjIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgTEFTVF9TSUdOQUwKK307CisKK2VudW0KK3sKKyAgUFJPUF8wCit9OworCitzdGF0aWMgdm9pZCBnc3Rfc21va2VkZWNfYmFzZV9pbml0IChncG9pbnRlciBnX2NsYXNzKTsKK3N0YXRpYyB2b2lkIGdzdF9zbW9rZWRlY19jbGFzc19pbml0IChHc3RTbW9rZURlYyAqIGtsYXNzKTsKK3N0YXRpYyB2b2lkIGdzdF9zbW9rZWRlY19pbml0IChHc3RTbW9rZURlYyAqIHNtb2tlZGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9zbW9rZWRlY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3Ntb2tlZGVjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfc21va2VkZWNfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0QnVmZmVyICogYnVmKTsKKworc3RhdGljIEdzdEVsZW1lbnRDbGFzcyAqcGFyZW50X2NsYXNzID0gTlVMTDsKKworLypzdGF0aWMgZ3VpbnQgZ3N0X3Ntb2tlZGVjX3NpZ25hbHNbTEFTVF9TSUdOQUxdID0geyAwIH07ICovCisKK0dUeXBlCitnc3Rfc21va2VkZWNfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBzbW9rZWRlY190eXBlID0gMDsKKworICBpZiAoIXNtb2tlZGVjX3R5cGUpIHsKKyAgICBzdGF0aWMgY29uc3QgR1R5cGVJbmZvIHNtb2tlZGVjX2luZm8gPSB7CisgICAgICBzaXplb2YgKEdzdFNtb2tlRGVjQ2xhc3MpLAorICAgICAgZ3N0X3Ntb2tlZGVjX2Jhc2VfaW5pdCwKKyAgICAgIE5VTEwsCisgICAgICAoR0NsYXNzSW5pdEZ1bmMpIGdzdF9zbW9rZWRlY19jbGFzc19pbml0LAorICAgICAgTlVMTCwKKyAgICAgIE5VTEwsCisgICAgICBzaXplb2YgKEdzdFNtb2tlRGVjKSwKKyAgICAgIDAsCisgICAgICAoR0luc3RhbmNlSW5pdEZ1bmMpIGdzdF9zbW9rZWRlY19pbml0LAorICAgIH07CisKKyAgICBzbW9rZWRlY190eXBlID0KKyAgICAgICAgZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyAoR1NUX1RZUEVfRUxFTUVOVCwgIkdzdFNtb2tlRGVjIiwgJnNtb2tlZGVjX2luZm8sCisgICAgICAgIDApOworICB9CisgIHJldHVybiBzbW9rZWRlY190eXBlOworfQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3Ntb2tlZGVjX3NyY19wYWRfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfWVVWICgiSTQyMCIpKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3Rfc21va2VkZWNfc2lua19wYWRfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1zbW9rZSwgIgorICAgICAgICAid2lkdGggPSAoaW50KSBbIDE2LCA0MDk2IF0sICIKKyAgICAgICAgImhlaWdodCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIiAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSBbIDAvMSwgTUFYIF0iKQorICAgICk7CisKK3N0YXRpYyB2b2lkCitnc3Rfc21va2VkZWNfYmFzZV9pbml0IChncG9pbnRlciBnX2NsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoZ19jbGFzcyk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3Ntb2tlZGVjX3NyY19wYWRfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfc21va2VkZWNfc2lua19wYWRfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiU21va2UgdmlkZW8gZGVjb2RlciIsCisgICAgICAiQ29kZWMvRGVjb2Rlci9WaWRlbyIsICJEZWNvZGUgdmlkZW8gZnJvbSBTbW9rZSBmb3JtYXQiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc21va2VkZWNfY2xhc3NfaW5pdCAoR3N0U21va2VEZWMgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIHBhcmVudF9jbGFzcyA9IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3Ntb2tlZGVjX2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Ntb2tlZGVjX2NoYW5nZV9zdGF0ZSk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHNtb2tlZGVjX2RlYnVnLCAic21va2VkZWMiLCAwLCAiU21va2UgZGVjb2RlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Ntb2tlZGVjX2luaXQgKEdzdFNtb2tlRGVjICogc21va2VkZWMpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNtb2tlZGVjLCAiZ3N0X3Ntb2tlZGVjX2luaXQ6IGluaXRpYWxpemluZyIpOworICAvKiBjcmVhdGUgdGhlIHNpbmsgYW5kIHNyYyBwYWRzICovCisKKyAgc21va2VkZWMtPnNpbmtwYWQgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZnc3Rfc21va2VkZWNfc2lua19wYWRfdGVtcGxhdGUsCisgICAgICAic2luayIpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoc21va2VkZWMtPnNpbmtwYWQsIGdzdF9zbW9rZWRlY19jaGFpbik7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzbW9rZWRlYyksIHNtb2tlZGVjLT5zaW5rcGFkKTsKKworICBzbW9rZWRlYy0+c3JjcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmZ3N0X3Ntb2tlZGVjX3NyY19wYWRfdGVtcGxhdGUsICJzcmMiKTsKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoc21va2VkZWMtPnNyY3BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzbW9rZWRlYyksIHNtb2tlZGVjLT5zcmNwYWQpOworCisgIHNtb2tlY29kZWNfZGVjb2RlX25ldyAoJnNtb2tlZGVjLT5pbmZvKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zbW9rZWRlY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0U21va2VEZWMgKmRlYyA9IEdTVF9TTU9LRURFQyAob2JqZWN0KTsKKworICBzbW9rZWNvZGVjX2luZm9fZnJlZSAoZGVjLT5pbmZvKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfc21va2VkZWNfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RTbW9rZURlYyAqc21va2VkZWM7CisgIGd1aW50OCAqZGF0YSwgKm91dGRhdGE7CisgIGd1bG9uZyBzaXplLCBvdXRzaXplOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgU21va2VDb2RlY0ZsYWdzIGZsYWdzOworICBHc3RDbG9ja1RpbWUgdGltZTsKKyAgZ3VpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ3VpbnQgZnBzX251bSwgZnBzX2Rlbm9tOworICBnaW50IHNtb2tlcmV0OworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBzbW9rZWRlYyA9IEdTVF9TTU9LRURFQyAoZ3N0X3BhZF9nZXRfcGFyZW50IChwYWQpKTsKKworICBkYXRhID0gR1NUX0JVRkZFUl9EQVRBIChidWYpOworICBzaXplID0gR1NUX0JVRkZFUl9TSVpFIChidWYpOworICB0aW1lID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1Zik7CisKKyAgaWYgKHNpemUgPCAxKQorICAgIGdvdG8gdG9vX3NtYWxsOworCisgIEdTVF9MT0dfT0JKRUNUIChzbW9rZWRlYywgImdvdCBidWZmZXIgb2YgJWx1IGJ5dGVzIiwgc2l6ZSk7CisKKyAgLyogaGF2ZSB0aGUgSUQgcGFja2V0LiAqLworICBpZiAoZGF0YVswXSA9PSBTTU9LRUNPREVDX1RZUEVfSUQpIHsKKyAgICBzbW9rZXJldCA9IHNtb2tlY29kZWNfcGFyc2VfaWQgKHNtb2tlZGVjLT5pbmZvLCBkYXRhLCBzaXplKTsKKyAgICBpZiAoc21va2VyZXQgIT0gU01PS0VDT0RFQ19PSykKKyAgICAgIGdvdG8gaGVhZGVyX2Vycm9yOworCisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgZ290byBkb25lOworICB9CisKKyAgLyogbm93IGhhbmRsZSBkYXRhIHBhY2tldHMgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoc21va2VkZWMsICJyZWFkaW5nIGhlYWRlciAlMDhseCIsICooZ3Vsb25nICopIGRhdGEpOworICBzbW9rZWNvZGVjX3BhcnNlX2hlYWRlciAoc21va2VkZWMtPmluZm8sIGRhdGEsIHNpemUsICZmbGFncywgJndpZHRoLCAmaGVpZ2h0LAorICAgICAgJmZwc19udW0sICZmcHNfZGVub20pOworCisgIGlmIChzbW9rZWRlYy0+aGVpZ2h0ICE9IGhlaWdodCB8fCBzbW9rZWRlYy0+d2lkdGggIT0gd2lkdGggfHwKKyAgICAgIHNtb2tlZGVjLT5mcHNfbnVtICE9IGZwc19udW0gfHwgc21va2VkZWMtPmZwc19kZW5vbSAhPSBmcHNfZGVub20pIHsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc21va2VkZWMsICJwYXJhbWV0ZXIgY2hhbmdlOiAlZHglZCBAICVkLyVkZnBzIiwKKyAgICAgICAgd2lkdGgsIGhlaWdodCwgZnBzX251bSwgZnBzX2Rlbm9tKTsKKworICAgIHNtb2tlZGVjLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgc21va2VkZWMtPndpZHRoID0gd2lkdGg7CisKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcmF3LXl1diIsCisgICAgICAgICJmb3JtYXQiLCBHU1RfVFlQRV9GT1VSQ0MsIEdTVF9NQUtFX0ZPVVJDQyAoJ0knLCAnNCcsICcyJywgJzAnKSwKKyAgICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgd2lkdGgsCisgICAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBoZWlnaHQsCisgICAgICAgICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTiwgZnBzX251bSwgZnBzX2Rlbm9tLCBOVUxMKTsKKworICAgIGdzdF9wYWRfc2V0X2NhcHMgKHNtb2tlZGVjLT5zcmNwYWQsIGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgfQorCisgIGlmIChzbW9rZWRlYy0+bmVlZF9rZXlmcmFtZSkgeworICAgIGlmICghKGZsYWdzICYgU01PS0VDT0RFQ19LRVlGUkFNRSkpCisgICAgICBnb3RvIGtleWZyYW1lX3NraXA7CisKKyAgICBzbW9rZWRlYy0+bmVlZF9rZXlmcmFtZSA9IEZBTFNFOworICB9CisKKyAgb3V0c2l6ZSA9IHdpZHRoICogaGVpZ2h0ICsgd2lkdGggKiBoZWlnaHQgLyAyOworICBvdXRidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG91dHNpemUpOworICBvdXRkYXRhID0gR1NUX0JVRkZFUl9EQVRBIChvdXRidWYpOworCisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPQorICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoR1NUX1NFQ09ORCwgZnBzX2Rlbm9tLCBmcHNfbnVtKTsKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZikgPSBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKTsKKyAgZ3N0X2J1ZmZlcl9zZXRfY2FwcyAob3V0YnVmLCBHU1RfUEFEX0NBUFMgKHNtb2tlZGVjLT5zcmNwYWQpKTsKKworICBpZiAodGltZSA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgaWYgKEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpID09IC0xKSB7CisgICAgICB0aW1lID0gc21va2VkZWMtPm5leHRfdGltZTsKKyAgICB9IGVsc2UgeworICAgICAgdGltZSA9IEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpICogR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKTsKKyAgICB9CisgIH0KKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgPSB0aW1lOworICBpZiAodGltZSAhPSAtMSkKKyAgICBzbW9rZWRlYy0+bmV4dF90aW1lID0gdGltZSArIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1Zik7CisgIGVsc2UKKyAgICBzbW9rZWRlYy0+bmV4dF90aW1lID0gLTE7CisKKyAgc21va2VyZXQgPSBzbW9rZWNvZGVjX2RlY29kZSAoc21va2VkZWMtPmluZm8sIGRhdGEsIHNpemUsIG91dGRhdGEpOworICBpZiAoc21va2VyZXQgIT0gU01PS0VDT0RFQ19PSykKKyAgICBnb3RvIGRlY29kZV9lcnJvcjsKKworICBHU1RfREVCVUdfT0JKRUNUIChzbW9rZWRlYywgImdzdF9zbW9rZWRlY19jaGFpbjogc2VuZGluZyBidWZmZXIiKTsKKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChzbW9rZWRlYy0+c3JjcGFkLCBvdXRidWYpOworCitkb25lOgorICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICBnc3Rfb2JqZWN0X3VucmVmIChzbW9rZWRlYyk7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK3Rvb19zbWFsbDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzbW9rZWRlYywgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJJbnB1dCBidWZmZXIgdG9vIHNtYWxsIikpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZG9uZTsKKyAgfQoraGVhZGVyX2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNtb2tlZGVjLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIkNvdWxkIG5vdCBwYXJzZSBzbW9rZSBoZWFkZXIsIHJlYXNvbjogJWQiLCBzbW9rZXJldCkpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZG9uZTsKKyAgfQora2V5ZnJhbWVfc2tpcDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNtb2tlZGVjLCAiZHJvcHBpbmcgYnVmZmVyIHdoaWxlIHdhaXRpbmcgZm9yIGtleWZyYW1lIik7CisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgZ290byBkb25lOworICB9CitkZWNvZGVfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc21va2VkZWMsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiQ291bGQgbm90IGRlY29kZSBzbW9rZSBmcmFtZSwgcmVhc29uOiAlZCIsIHNtb2tlcmV0KSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBkb25lOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3Ntb2tlZGVjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0U21va2VEZWMgKmRlYzsKKworICBkZWMgPSBHU1RfU01PS0VERUMgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICAvKiByZXNldCB0aGUgaW5pdGlhbCB2aWRlbyBzdGF0ZSAqLworICAgICAgZGVjLT5mb3JtYXQgPSAtMTsKKyAgICAgIGRlYy0+d2lkdGggPSAtMTsKKyAgICAgIGRlYy0+aGVpZ2h0ID0gLTE7CisgICAgICBkZWMtPmZwc19udW0gPSAtMTsKKyAgICAgIGRlYy0+ZnBzX2Rlbm9tID0gLTE7CisgICAgICBkZWMtPm5leHRfdGltZSA9IDA7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisgIGlmIChyZXQgIT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKQorICAgIHJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9leHQvanBlZy9nc3RzbW9rZWRlYy5oIGIvZXh0L2pwZWcvZ3N0c21va2VkZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzE5MDc3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2pwZWcvZ3N0c21va2VkZWMuaApAQCAtMCwwICsxLDc1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1NNT0tFREVDX0hfXworI2RlZmluZSBfX0dTVF9TTU9LRURFQ19IX18KKworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgInNtb2tlY29kZWMuaCIKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1NNT0tFREVDIFwKKyAgKGdzdF9zbW9rZWRlY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfU01PS0VERUMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9TTU9LRURFQyxHc3RTbW9rZURlYykpCisjZGVmaW5lIEdTVF9TTU9LRURFQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9TTU9LRURFQyxHc3RTbW9rZURlY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1NNT0tFREVDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfU01PS0VERUMpKQorI2RlZmluZSBHU1RfSVNfU01PS0VERUNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfU01PS0VERUMpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0U21va2VEZWMgR3N0U21va2VEZWM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0U21va2VEZWNDbGFzcyBHc3RTbW9rZURlY0NsYXNzOworCitzdHJ1Y3QgX0dzdFNtb2tlRGVjIHsKKyAgR3N0RWxlbWVudCBlbGVtZW50OworCisgIC8qIHBhZHMgKi8KKyAgR3N0UGFkICpzaW5rcGFkLCpzcmNwYWQ7CisKKyAgLyogdmlkZW8gc3RhdGUgKi8KKyAgZ2ludCBmb3JtYXQ7CisgIGdpbnQgd2lkdGg7CisgIGdpbnQgaGVpZ2h0OworICBnaW50IGZwc19udW07CisgIGdpbnQgZnBzX2Rlbm9tOworICBHc3RDbG9ja1RpbWUgbmV4dF90aW1lOworCisgIFNtb2tlQ29kZWNJbmZvICppbmZvOworCisgIGdpbnQgdGhyZXNob2xkOworICBnaW50IHF1YWxpdHk7CisgIGdpbnQgc21vb3RoaW5nOworCisgIGdib29sZWFuIG5lZWRfa2V5ZnJhbWU7Cit9OworCitzdHJ1Y3QgX0dzdFNtb2tlRGVjQ2xhc3MgeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3Ntb2tlZGVjX2dldF90eXBlKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfU01PS0VERUNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvanBlZy9nc3RzbW9rZWVuYy5jIGIvZXh0L2pwZWcvZ3N0c21va2VlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmIwNjg3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2pwZWcvZ3N0c21va2VlbmMuYwpAQCAtMCwwICsxLDUwOSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1zbW9rZWVuYworICoKKyAqIEVuY29kZXMgaW1hZ2VzIGluIHNtb2tlIGZvcm1hdC4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RzbW9rZWVuYy5oIgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChzbW9rZWVuY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBzbW9rZWVuY19kZWJ1ZworCisKKy8qIFNtb2tlRW5jIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgRlJBTUVfRU5DT0RFRCwKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworI2RlZmluZSBERUZBVUxUX1BST1BfTUlOX1FVQUxJVFkgMTAKKyNkZWZpbmUgREVGQVVMVF9QUk9QX01BWF9RVUFMSVRZIDg1CisjZGVmaW5lIERFRkFVTFRfUFJPUF9USFJFU0hPTEQgMzAwMAorI2RlZmluZSBERUZBVUxUX1BST1BfS0VZRlJBTUUgMjAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTUlOX1FVQUxJVFksCisgIFBST1BfTUFYX1FVQUxJVFksCisgIFBST1BfVEhSRVNIT0xELAorICBQUk9QX0tFWUZSQU1FCisgICAgICAvKiBGSUxMIE1FICovCit9OworCitzdGF0aWMgdm9pZCBnc3Rfc21va2VlbmNfYmFzZV9pbml0IChncG9pbnRlciBnX2NsYXNzKTsKK3N0YXRpYyB2b2lkIGdzdF9zbW9rZWVuY19jbGFzc19pbml0IChHc3RTbW9rZUVuYyAqIGtsYXNzKTsKK3N0YXRpYyB2b2lkIGdzdF9zbW9rZWVuY19pbml0IChHc3RTbW9rZUVuYyAqIHNtb2tlZW5jKTsKK3N0YXRpYyB2b2lkIGdzdF9zbW9rZWVuY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3Ntb2tlZW5jX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfc21va2VlbmNfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0QnVmZmVyICogYnVmKTsKK3N0YXRpYyBHc3RDYXBzICpnc3Rfc21va2VlbmNfZ2V0Y2FwcyAoR3N0UGFkICogcGFkKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc21va2VlbmNfc2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RDYXBzICogY2Fwcyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc21va2VlbmNfcmVzeW5jIChHc3RTbW9rZUVuYyAqIHNtb2tlZW5jKTsKK3N0YXRpYyB2b2lkIGdzdF9zbW9rZWVuY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3Rfc21va2VlbmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0RWxlbWVudENsYXNzICpwYXJlbnRfY2xhc3MgPSBOVUxMOworCitHVHlwZQorZ3N0X3Ntb2tlZW5jX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgc21va2VlbmNfdHlwZSA9IDA7CisKKyAgaWYgKCFzbW9rZWVuY190eXBlKSB7CisgICAgc3RhdGljIGNvbnN0IEdUeXBlSW5mbyBzbW9rZWVuY19pbmZvID0geworICAgICAgc2l6ZW9mIChHc3RTbW9rZUVuY0NsYXNzKSwKKyAgICAgIChHQmFzZUluaXRGdW5jKSBnc3Rfc21va2VlbmNfYmFzZV9pbml0LAorICAgICAgTlVMTCwKKyAgICAgIChHQ2xhc3NJbml0RnVuYykgZ3N0X3Ntb2tlZW5jX2NsYXNzX2luaXQsCisgICAgICBOVUxMLAorICAgICAgTlVMTCwKKyAgICAgIHNpemVvZiAoR3N0U21va2VFbmMpLAorICAgICAgMCwKKyAgICAgIChHSW5zdGFuY2VJbml0RnVuYykgZ3N0X3Ntb2tlZW5jX2luaXQsCisgICAgfTsKKworICAgIHNtb2tlZW5jX3R5cGUgPQorICAgICAgICBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChHU1RfVFlQRV9FTEVNRU5ULCAiR3N0U21va2VFbmMiLCAmc21va2VlbmNfaW5mbywKKyAgICAgICAgMCk7CisgIH0KKyAgcmV0dXJuIHNtb2tlZW5jX3R5cGU7Cit9CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3Rfc21va2VlbmNfc2lua19wYWRfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19ZVVYgKCJJNDIwIikpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9zbW9rZWVuY19zcmNfcGFkX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXNtb2tlLCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIgorICAgICAgICAiaGVpZ2h0ID0gKGludCkgWyAxNiwgNDA5NiBdLCAiICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMC8xLCBNQVggXSIpCisgICAgKTsKKworc3RhdGljIHZvaWQKK2dzdF9zbW9rZWVuY19iYXNlX2luaXQgKGdwb2ludGVyIGdfY2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChnX2NsYXNzKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfc21va2VlbmNfc2lua19wYWRfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfc21va2VlbmNfc3JjX3BhZF90ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJTbW9rZSB2aWRlbyBlbmNvZGVyIiwKKyAgICAgICJDb2RlYy9FbmNvZGVyL1ZpZGVvIiwgIkVuY29kZSBpbWFnZXMgaW50byB0aGUgU21va2UgZm9ybWF0IiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Ntb2tlZW5jX2NsYXNzX2luaXQgKEdzdFNtb2tlRW5jICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBwYXJlbnRfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9zbW9rZWVuY19maW5hbGl6ZTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3Ntb2tlZW5jX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3Ntb2tlZW5jX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01JTl9RVUFMSVRZLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInFtaW4iLCAiUW1pbiIsICJNaW5pbXVtIHF1YWxpdHkiLAorICAgICAgICAgIDAsIDEwMCwgREVGQVVMVF9QUk9QX01JTl9RVUFMSVRZLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01BWF9RVUFMSVRZLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInFtYXgiLCAiUW1heCIsICJNYXhpbXVtIHF1YWxpdHkiLAorICAgICAgICAgIDAsIDEwMCwgREVGQVVMVF9QUk9QX01BWF9RVUFMSVRZLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RIUkVTSE9MRCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ0aHJlc2hvbGQiLCAiVGhyZXNob2xkIiwgIk1vdGlvbiBlc3RpbWF0aW9uIHRocmVzaG9sZCIsCisgICAgICAgICAgMCwgMTAwMDAwMDAwLCBERUZBVUxUX1BST1BfVEhSRVNIT0xELAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0tFWUZSQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImtleWZyYW1lIiwgIktleWZyYW1lIiwKKyAgICAgICAgICAiSW5zZXJ0IGtleWZyYW1lIGV2ZXJ5IE4gZnJhbWVzIiwgMSwgMTAwMDAwLAorICAgICAgICAgIERFRkFVTFRfUFJPUF9LRVlGUkFNRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc21va2VlbmNfY2hhbmdlX3N0YXRlKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoc21va2VlbmNfZGVidWcsICJzbW9rZWVuYyIsIDAsCisgICAgICAiU21va2UgZW5jb2RpbmcgZWxlbWVudCIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Ntb2tlZW5jX2luaXQgKEdzdFNtb2tlRW5jICogc21va2VlbmMpCit7CisgIC8qIGNyZWF0ZSB0aGUgc2luayBhbmQgc3JjIHBhZHMgKi8KKyAgc21va2VlbmMtPnNpbmtwYWQgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZnc3Rfc21va2VlbmNfc2lua19wYWRfdGVtcGxhdGUsCisgICAgICAic2luayIpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoc21va2VlbmMtPnNpbmtwYWQsIGdzdF9zbW9rZWVuY19jaGFpbik7CisgIGdzdF9wYWRfc2V0X2dldGNhcHNfZnVuY3Rpb24gKHNtb2tlZW5jLT5zaW5rcGFkLCBnc3Rfc21va2VlbmNfZ2V0Y2Fwcyk7CisgIGdzdF9wYWRfc2V0X3NldGNhcHNfZnVuY3Rpb24gKHNtb2tlZW5jLT5zaW5rcGFkLCBnc3Rfc21va2VlbmNfc2V0Y2Fwcyk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzbW9rZWVuYyksIHNtb2tlZW5jLT5zaW5rcGFkKTsKKworICBzbW9rZWVuYy0+c3JjcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmZ3N0X3Ntb2tlZW5jX3NyY19wYWRfdGVtcGxhdGUsICJzcmMiKTsKKyAgZ3N0X3BhZF9zZXRfZ2V0Y2Fwc19mdW5jdGlvbiAoc21va2VlbmMtPnNyY3BhZCwgZ3N0X3Ntb2tlZW5jX2dldGNhcHMpOworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChzbW9rZWVuYy0+c3JjcGFkKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKHNtb2tlZW5jKSwgc21va2VlbmMtPnNyY3BhZCk7CisKKyAgc21va2VlbmMtPm1pbl9xdWFsaXR5ID0gREVGQVVMVF9QUk9QX01JTl9RVUFMSVRZOworICBzbW9rZWVuYy0+bWF4X3F1YWxpdHkgPSBERUZBVUxUX1BST1BfTUFYX1FVQUxJVFk7CisgIHNtb2tlZW5jLT50aHJlc2hvbGQgPSBERUZBVUxUX1BST1BfVEhSRVNIT0xEOworICBzbW9rZWVuYy0+a2V5ZnJhbWUgPSBERUZBVUxUX1BST1BfS0VZRlJBTUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc21va2VlbmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFNtb2tlRW5jICplbmMgPSBHU1RfU01PS0VFTkMgKG9iamVjdCk7CisKKyAgaWYgKGVuYy0+aW5mbykKKyAgICBzbW9rZWNvZGVjX2luZm9fZnJlZSAoZW5jLT5pbmZvKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9zbW9rZWVuY19nZXRjYXBzIChHc3RQYWQgKiBwYWQpCit7CisgIEdzdFNtb2tlRW5jICpzbW9rZWVuYyA9IEdTVF9TTU9LRUVOQyAoZ3N0X3BhZF9nZXRfcGFyZW50IChwYWQpKTsKKyAgR3N0UGFkICpvdGhlcnBhZDsKKyAgR3N0Q2FwcyAqcmVzdWx0LCAqY2FwczsKKyAgY29uc3QgR3N0Q2FwcyAqdGNhcHM7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGludCBpOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZSA9IE5VTEw7CisKKyAgLyogd2Ugd2FudCB0byBwcm94eSBwcm9wZXJ0aWVzIGxpa2Ugd2lkdGgsIGhlaWdodCBhbmQgZnJhbWVyYXRlIGZyb20gdGhlCisgICAgIG90aGVyIGVuZCBvZiB0aGUgZWxlbWVudCAqLworICBvdGhlcnBhZCA9IChwYWQgPT0gc21va2VlbmMtPnNyY3BhZCkgPyBzbW9rZWVuYy0+c2lua3BhZCA6IHNtb2tlZW5jLT5zcmNwYWQ7CisKKyAgLyogZ2V0IHRlbXBsYXRlIGNhcHMsIHdlIGFsd2F5cyBuZWVkIHRoaXMgdG8gZml0ZXIgdGhlIHBlZXIgY2FwcyAqLworICB0Y2FwcyA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChvdGhlcnBhZCk7CisKKyAgLyogZ2V0IGFueSBjb25zdHJhaW50cyBvbiB0aGUgcGVlciBwYWQgKi8KKyAgY2FwcyA9IGdzdF9wYWRfcGVlcl9nZXRfY2FwcyAob3RoZXJwYWQpOworCisgIGlmIChjYXBzID09IE5VTEwpCisgICAgY2FwcyA9IGdzdF9jYXBzX2NvcHkgKHRjYXBzKTsKKyAgZWxzZQorICAgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChjYXBzKTsKKworICAvKiBpbnRlcnNlY3Qgd2l0aCB0aGUgdGVtcGxhdGUgKi8KKyAgcmVzdWx0ID0gZ3N0X2NhcHNfaW50ZXJzZWN0IChjYXBzLCB0Y2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBpZiAocGFkID09IHNtb2tlZW5jLT5zcmNwYWQpIHsKKyAgICBuYW1lID0gInZpZGVvL3gtc21va2UiOworICB9IGVsc2UgeworICAgIG5hbWUgPSAidmlkZW8veC1yYXcteXV2IjsKKyAgfQorCisgIC8qIHdlIGNhbiBvbmx5IGNvcHkgd2lkdGgsIGhlaWdodCwgZnJhbWVyYXRlIGZyb20gb25lIHNpZGUgdG8gdGhlIG90aGVyICovCisgIGZvciAoaSA9IDA7IGkgPCBnc3RfY2Fwc19nZXRfc2l6ZSAocmVzdWx0KTsgaSsrKSB7CisgICAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAocmVzdWx0LCBpKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgbmFtZSk7CisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHN0cnVjdHVyZSwgImZvcm1hdCIpOworICAgIC8qIC4uLiBidXQgZm9yIHRoZSBzaW5rIHBhZCwgd2Ugb25seSBkbyBJNDIwIGFueXdheSwgc28gYWRkIHRoYXQgKi8KKyAgICBpZiAocGFkID09IHNtb2tlZW5jLT5zaW5rcGFkKSB7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoc3RydWN0dXJlLCAiZm9ybWF0IiwgR1NUX1RZUEVfRk9VUkNDLAorICAgICAgICAgIEdTVF9TVFJfRk9VUkNDICgiSTQyMCIpLCBOVUxMKTsKKyAgICB9CisgIH0KKworICBnc3Rfb2JqZWN0X3VucmVmIChzbW9rZWVuYyk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc21va2VlbmNfc2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U21va2VFbmMgKnNtb2tlZW5jOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgY29uc3QgR1ZhbHVlICpmcmFtZXJhdGU7CisgIGdib29sZWFuIHJldDsKKyAgR3N0Q2FwcyAqc3JjY2FwczsKKworICBzbW9rZWVuYyA9IEdTVF9TTU9LRUVOQyAoZ3N0X3BhZF9nZXRfcGFyZW50IChwYWQpKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgZnJhbWVyYXRlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImZyYW1lcmF0ZSIpOworICBpZiAoZnJhbWVyYXRlKSB7CisgICAgc21va2VlbmMtPmZwc19udW0gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX251bWVyYXRvciAoZnJhbWVyYXRlKTsKKyAgICBzbW9rZWVuYy0+ZnBzX2Rlbm9tID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9kZW5vbWluYXRvciAoZnJhbWVyYXRlKTsKKyAgfSBlbHNlIHsKKyAgICBzbW9rZWVuYy0+ZnBzX251bSA9IDA7CisgICAgc21va2VlbmMtPmZwc19kZW5vbSA9IDE7CisgIH0KKworICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgIndpZHRoIiwgJnNtb2tlZW5jLT53aWR0aCk7CisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiaGVpZ2h0IiwgJnNtb2tlZW5jLT5oZWlnaHQpOworCisgIGlmICgoc21va2VlbmMtPndpZHRoICYgMHgwZikgIT0gMCB8fCAoc21va2VlbmMtPmhlaWdodCAmIDB4MGYpICE9IDApCisgICAgZ290byB3aWR0aF9vcl9oZWlnaHRfbm90eDE2OworCisgIGlmICghZ3N0X3Ntb2tlZW5jX3Jlc3luYyAoc21va2VlbmMpKQorICAgIGdvdG8gaW5pdF9mYWlsZWQ7CisKKyAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LXNtb2tlIiwKKyAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHNtb2tlZW5jLT53aWR0aCwKKyAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBzbW9rZWVuYy0+aGVpZ2h0LAorICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLCBzbW9rZWVuYy0+ZnBzX251bSwgc21va2VlbmMtPmZwc19kZW5vbSwKKyAgICAgIE5VTEwpOworCisgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKHNtb2tlZW5jLT5zcmNwYWQsIHNyY2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoc21va2VlbmMpOworCisgIHJldHVybiByZXQ7CisKK3dpZHRoX29yX2hlaWdodF9ub3R4MTY6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNtb2tlZW5jLCAid2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIG11bHRpcGxlcyBvZiAxNiIKKyAgICAgICAgIiwgJWR4JWQgbm90IGFsbG93ZWQiLCBzbW9rZWVuYy0+d2lkdGgsIHNtb2tlZW5jLT5oZWlnaHQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNtb2tlZW5jKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2luaXRfZmFpbGVkOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzbW9rZWVuYywgImNvdWxkIG5vdCBpbml0IGRlY29kZXIiKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzbW9rZWVuYyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Ntb2tlZW5jX3Jlc3luYyAoR3N0U21va2VFbmMgKiBzbW9rZWVuYykKK3sKKyAgaW50IHJldDsKKworICBHU1RfREVCVUcgKCJyZXN5bmM6ICVkeCVkQCVkLyVkZnBzIiwgc21va2VlbmMtPndpZHRoLCBzbW9rZWVuYy0+aGVpZ2h0LAorICAgICAgc21va2VlbmMtPmZwc19udW0sIHNtb2tlZW5jLT5mcHNfZGVub20pOworCisgIGlmIChzbW9rZWVuYy0+aW5mbykKKyAgICBzbW9rZWNvZGVjX2luZm9fZnJlZSAoc21va2VlbmMtPmluZm8pOworCisgIHJldCA9IHNtb2tlY29kZWNfZW5jb2RlX25ldyAoJnNtb2tlZW5jLT5pbmZvLCBzbW9rZWVuYy0+d2lkdGgsCisgICAgICBzbW9rZWVuYy0+aGVpZ2h0LCBzbW9rZWVuYy0+ZnBzX251bSwgc21va2VlbmMtPmZwc19kZW5vbSk7CisKKyAgaWYgKHJldCAhPSBTTU9LRUNPREVDX09LKQorICAgIGdvdG8gaW5pdF9mYWlsZWQ7CisKKyAgc21va2Vjb2RlY19zZXRfcXVhbGl0eSAoc21va2VlbmMtPmluZm8sIHNtb2tlZW5jLT5taW5fcXVhbGl0eSwKKyAgICAgIHNtb2tlZW5jLT5tYXhfcXVhbGl0eSk7CisKKyAgR1NUX0RFQlVHICgicmVzeW5jIGRvbmUiKTsKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitpbml0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc21va2VlbmMsICJzbW9rZWNvZGVjX2VuY29kZV9uZXcoKSBmYWlsZWQ6ICVkIiwgcmV0KTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9zbW9rZWVuY19jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFNtb2tlRW5jICpzbW9rZWVuYzsKKyAgZ3VjaGFyICpkYXRhLCAqb3V0ZGF0YTsKKyAgZ3Vsb25nIHNpemU7CisgIGdpbnQgb3V0c2l6ZTsKKyAgZ3VpbnQgZW5jc2l6ZTsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIFNtb2tlQ29kZWNGbGFncyBmbGFnczsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgc21va2VlbmMgPSBHU1RfU01PS0VFTkMgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYWQpKTsKKworICBkYXRhID0gR1NUX0JVRkZFUl9EQVRBIChidWYpOworICBzaXplID0gR1NUX0JVRkZFUl9TSVpFIChidWYpOworCisgIEdTVF9MT0dfT0JKRUNUIChzbW9rZWVuYywgImdvdCBidWZmZXIgb2YgJWx1IGJ5dGVzIiwgc2l6ZSk7CisKKyAgaWYgKHNtb2tlZW5jLT5uZWVkX2hlYWRlcikgeworICAgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMjU2KTsKKyAgICBvdXRkYXRhID0gR1NUX0JVRkZFUl9EQVRBIChvdXRidWYpOworCisgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKTsKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKTsKKworICAgIHNtb2tlY29kZWNfZW5jb2RlX2lkIChzbW9rZWVuYy0+aW5mbywgb3V0ZGF0YSwgJmVuY3NpemUpOworCisgICAgR1NUX0JVRkZFUl9TSVpFIChvdXRidWYpID0gZW5jc2l6ZTsKKyAgICBnc3RfYnVmZmVyX3NldF9jYXBzIChvdXRidWYsIEdTVF9QQURfQ0FQUyAoc21va2VlbmMtPnNyY3BhZCkpOworCisgICAgcmV0ID0gZ3N0X3BhZF9wdXNoIChzbW9rZWVuYy0+c3JjcGFkLCBvdXRidWYpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIGRvbmU7CisKKyAgICBzbW9rZWVuYy0+bmVlZF9oZWFkZXIgPSBGQUxTRTsKKyAgfQorCisgIGVuY3NpemUgPSBvdXRzaXplID0gc21va2VlbmMtPndpZHRoICogc21va2VlbmMtPmhlaWdodCAqIDM7CisgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAob3V0c2l6ZSk7CisgIG91dGRhdGEgPSBHU1RfQlVGRkVSX0RBVEEgKG91dGJ1Zik7CisKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKTsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9CisgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChHU1RfU0VDT05ELCBzbW9rZWVuYy0+ZnBzX2Rlbm9tLAorICAgICAgc21va2VlbmMtPmZwc19udW0pOworICBnc3RfYnVmZmVyX3NldF9jYXBzIChvdXRidWYsIEdTVF9QQURfQ0FQUyAoc21va2VlbmMtPnNyY3BhZCkpOworCisgIGZsYWdzID0gMDsKKyAgaWYgKChzbW9rZWVuYy0+ZnJhbWUgJSBzbW9rZWVuYy0+a2V5ZnJhbWUpID09IDApIHsKKyAgICBmbGFncyB8PSBTTU9LRUNPREVDX0tFWUZSQU1FOworICB9CisgIHNtb2tlY29kZWNfc2V0X3F1YWxpdHkgKHNtb2tlZW5jLT5pbmZvLCBzbW9rZWVuYy0+bWluX3F1YWxpdHksCisgICAgICBzbW9rZWVuYy0+bWF4X3F1YWxpdHkpOworICBzbW9rZWNvZGVjX3NldF90aHJlc2hvbGQgKHNtb2tlZW5jLT5pbmZvLCBzbW9rZWVuYy0+dGhyZXNob2xkKTsKKyAgc21va2Vjb2RlY19lbmNvZGUgKHNtb2tlZW5jLT5pbmZvLCBkYXRhLCBmbGFncywgb3V0ZGF0YSwgJmVuY3NpemUpOworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgIEdTVF9CVUZGRVJfU0laRSAob3V0YnVmKSA9IGVuY3NpemU7CisgIEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpID0gc21va2VlbmMtPmZyYW1lOworICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKG91dGJ1ZikgPSBzbW9rZWVuYy0+ZnJhbWUgKyAxOworCisgIHJldCA9IGdzdF9wYWRfcHVzaCAoc21va2VlbmMtPnNyY3BhZCwgb3V0YnVmKTsKKworICBzbW9rZWVuYy0+ZnJhbWUrKzsKKworZG9uZToKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Ntb2tlZW5jX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTbW9rZUVuYyAqc21va2VlbmM7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1NNT0tFRU5DIChvYmplY3QpKTsKKyAgc21va2VlbmMgPSBHU1RfU01PS0VFTkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01JTl9RVUFMSVRZOgorICAgICAgc21va2VlbmMtPm1pbl9xdWFsaXR5ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX1FVQUxJVFk6CisgICAgICBzbW9rZWVuYy0+bWF4X3F1YWxpdHkgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJFU0hPTEQ6CisgICAgICBzbW9rZWVuYy0+dGhyZXNob2xkID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfS0VZRlJBTUU6CisgICAgICBzbW9rZWVuYy0+a2V5ZnJhbWUgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3Ntb2tlZW5jX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTbW9rZUVuYyAqc21va2VlbmM7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1NNT0tFRU5DIChvYmplY3QpKTsKKyAgc21va2VlbmMgPSBHU1RfU01PS0VFTkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01JTl9RVUFMSVRZOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgc21va2VlbmMtPm1pbl9xdWFsaXR5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfUVVBTElUWToKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHNtb2tlZW5jLT5tYXhfcXVhbGl0eSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSRVNIT0xEOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgc21va2VlbmMtPnRocmVzaG9sZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfS0VZRlJBTUU6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBzbW9rZWVuYy0+a2V5ZnJhbWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9zbW9rZWVuY19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdFNtb2tlRW5jICplbmM7CisKKyAgZW5jID0gR1NUX1NNT0tFRU5DIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgLyogcmVzZXQgdGhlIGluaXRpYWwgdmlkZW8gc3RhdGUgKi8KKyAgICAgIGVuYy0+d2lkdGggPSAwOworICAgICAgZW5jLT5oZWlnaHQgPSAwOworICAgICAgZW5jLT5mcmFtZSA9IDA7CisgICAgICBlbmMtPm5lZWRfaGVhZGVyID0gVFJVRTsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKyAgaWYgKHJldCAhPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpCisgICAgcmV0dXJuIHJldDsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2V4dC9qcGVnL2dzdHNtb2tlZW5jLmggYi9leHQvanBlZy9nc3RzbW9rZWVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxM2IyOGMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvanBlZy9nc3RzbW9rZWVuYy5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfU01PS0VFTkNfSF9fCisjZGVmaW5lIF9fR1NUX1NNT0tFRU5DX0hfXworCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSAic21va2Vjb2RlYy5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfU01PS0VFTkMgXAorICAoZ3N0X3Ntb2tlZW5jX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9TTU9LRUVOQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1NNT0tFRU5DLEdzdFNtb2tlRW5jKSkKKyNkZWZpbmUgR1NUX1NNT0tFRU5DX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1NNT0tFRU5DLEdzdFNtb2tlRW5jQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfU01PS0VFTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9TTU9LRUVOQykpCisjZGVmaW5lIEdTVF9JU19TTU9LRUVOQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9TTU9LRUVOQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RTbW9rZUVuYyBHc3RTbW9rZUVuYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RTbW9rZUVuY0NsYXNzIEdzdFNtb2tlRW5jQ2xhc3M7CisKK3N0cnVjdCBfR3N0U21va2VFbmMgeworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgLyogcGFkcyAqLworICBHc3RQYWQgKnNpbmtwYWQsKnNyY3BhZDsKKworICAvKiB2aWRlbyBzdGF0ZSAqLworICBnaW50IGZvcm1hdDsKKyAgZ2ludCB3aWR0aDsKKyAgZ2ludCBoZWlnaHQ7CisgIGdpbnQgZnJhbWU7CisgIGdpbnQga2V5ZnJhbWU7CisgIGdpbnQgZnBzX251bSwgZnBzX2Rlbm9tOworCisgIFNtb2tlQ29kZWNJbmZvICppbmZvOworCisgIGdpbnQgdGhyZXNob2xkOworICBnaW50IG1pbl9xdWFsaXR5OworICBnaW50IG1heF9xdWFsaXR5OworCisgIGdib29sZWFuIG5lZWRfaGVhZGVyOworfTsKKworc3RydWN0IF9Hc3RTbW9rZUVuY0NsYXNzIHsKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9zbW9rZWVuY19nZXRfdHlwZSh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1NNT0tFRU5DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L2pwZWcvbWVzb24uYnVpbGQgYi9leHQvanBlZy9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzYyOGNiCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2pwZWcvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxOSBAQAoranBlZ19zb3VyY2VzID0gWworICAnZ3N0anBlZy5jJywKKyAgJ2dzdGpwZWdlbmMuYycsCisgICdnc3RqcGVnZGVjLmMnLAorXQorCitqcGVnbGliID0gY2MuZmluZF9saWJyYXJ5KCdqcGVnJywgcmVxdWlyZWQgOiBmYWxzZSkKKworaWYganBlZ2xpYi5mb3VuZCgpCisgIGdzdGpwZWcgPSBsaWJyYXJ5KCdnc3RqcGVnJywKKyAgICBqcGVnX3NvdXJjZXMsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICAgIGxpbmtfYXJncyA6IG5vc2VoX2xpbmtfYXJncywKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luYywgbGlic2luY10sCisgICAgZGVwZW5kZW5jaWVzIDogW2dzdF9kZXAsIGdzdGJhc2VfZGVwLCBnc3R2aWRlb19kZXAsIGpwZWdsaWIsIGxpYm1dLAorICAgIGluc3RhbGwgOiB0cnVlLAorICAgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKyAgKQorZW5kaWYKZGlmZiAtLWdpdCBhL2V4dC9qcGVnL3Ntb2tlY29kZWMuYyBiL2V4dC9qcGVnL3Ntb2tlY29kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTMxNTJkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2pwZWcvc21va2Vjb2RlYy5jCkBAIC0wLDAgKzEsNzA5IEBACisvKiBTbW9rZSBjb2RlYworICogQ29weXJpZ2h0IChDKSA8MjAwND4gV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4gCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworLyogdGhpcyBpcyBhIGhhY2sgaGFjayBoYWNrIHRvIGdldCBhcm91bmQganBlZ2xpYiBoZWFkZXIgYnVncy4uLiAqLworI2lmZGVmIEhBVkVfU1RETElCX0gKKyMgdW5kZWYgSEFWRV9TVERMSUJfSAorI2VuZGlmCisjaW5jbHVkZSA8anBlZ2xpYi5oPgorCisjaW5jbHVkZSAic21va2Vjb2RlYy5oIgorI2luY2x1ZGUgInNtb2tlZm9ybWF0LmgiCisKKyNpbmNsdWRlIDxnc3QvZ3N0aW5mby5oPgorCitzdHJ1Y3QgX1Ntb2tlQ29kZWNJbmZvCit7CisgIHVuc2lnbmVkIGludCB3aWR0aDsKKyAgdW5zaWduZWQgaW50IGhlaWdodDsKKyAgdW5zaWduZWQgaW50IGZwc19udW07CisgIHVuc2lnbmVkIGludCBmcHNfZGVub207CisKKyAgdW5zaWduZWQgaW50IG1pbnF1YWxpdHk7CisgIHVuc2lnbmVkIGludCBtYXhxdWFsaXR5OworICB1bnNpZ25lZCBpbnQgYml0cmF0ZTsKKyAgdW5zaWduZWQgaW50IHRocmVzaG9sZDsKKworICB1bnNpZ25lZCBpbnQgcmVmZGVjOworCisgIHVuc2lnbmVkIGNoYXIgKipsaW5lWzNdOworICB1bnNpZ25lZCBjaGFyICpjb21wYnVmWzNdOworCisgIHN0cnVjdCBqcGVnX2Vycm9yX21nciBqZXJyOworCisgIHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbzsKKyAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyIGpkZXN0OworCisgIHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IGRpbmZvOworICBzdHJ1Y3QganBlZ19zb3VyY2VfbWdyIGpzcmM7CisKKyAgaW50IG5lZWRfa2V5ZnJhbWU7CisgIHVuc2lnbmVkIGNoYXIgKnJlZmVyZW5jZTsKK307CisKK3N0YXRpYyB2b2lkCitzbW9rZWNvZGVjX2luaXRfZGVzdGluYXRpb24gKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworfQorCitzdGF0aWMgYm9vbGVhbgorc21va2Vjb2RlY19mbHVzaF9kZXN0aW5hdGlvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorc21va2Vjb2RlY190ZXJtX2Rlc3RpbmF0aW9uIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKK30KKworc3RhdGljIHZvaWQKK3Ntb2tlY29kZWNfaW5pdF9zb3VyY2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7Cit9CisKK3N0YXRpYyBib29sZWFuCitzbW9rZWNvZGVjX2ZpbGxfaW5wdXRfYnVmZmVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3Ntb2tlY29kZWNfc2tpcF9pbnB1dF9kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBsb25nIG51bV9ieXRlcykKK3sKK30KKworc3RhdGljIGJvb2xlYW4KK3Ntb2tlY29kZWNfcmVzeW5jX3RvX3Jlc3RhcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBkZXNpcmVkKQoreworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3Ntb2tlY29kZWNfdGVybV9zb3VyY2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7Cit9CisKKworaW50CitzbW9rZWNvZGVjX2VuY29kZV9uZXcgKFNtb2tlQ29kZWNJbmZvICoqIGluZm8sCisgICAgY29uc3QgdW5zaWduZWQgaW50IHdpZHRoLAorICAgIGNvbnN0IHVuc2lnbmVkIGludCBoZWlnaHQsCisgICAgY29uc3QgdW5zaWduZWQgaW50IGZwc19udW0sIGNvbnN0IHVuc2lnbmVkIGludCBmcHNfZGVub20pCit7CisgIFNtb2tlQ29kZWNJbmZvICpuZXdpbmZvOworICBpbnQgaSwgajsKKyAgdW5zaWduZWQgY2hhciAqYmFzZVszXTsKKworICBpZiAoIWluZm8pCisgICAgcmV0dXJuIFNNT0tFQ09ERUNfTlVMTFBUUjsKKyAgaWYgKCh3aWR0aCAmIDB4ZikgfHwgKGhlaWdodCAmIDB4ZikpCisgICAgcmV0dXJuIFNNT0tFQ09ERUNfV1JPTkdTSVpFOworCisgIG5ld2luZm8gPSBtYWxsb2MgKHNpemVvZiAoU21va2VDb2RlY0luZm8pKTsKKyAgaWYgKCFuZXdpbmZvKSB7CisgICAgcmV0dXJuIFNNT0tFQ09ERUNfTk9NRU07CisgIH0KKyAgbmV3aW5mby0+d2lkdGggPSB3aWR0aDsKKyAgbmV3aW5mby0+aGVpZ2h0ID0gaGVpZ2h0OworICBuZXdpbmZvLT5mcHNfbnVtID0gZnBzX251bTsKKyAgbmV3aW5mby0+ZnBzX2Rlbm9tID0gZnBzX2Rlbm9tOworCisgIC8qIHNldHVwIGpwZWdsaWIgKi8KKyAgbWVtc2V0ICgmbmV3aW5mby0+Y2luZm8sIDAsIHNpemVvZiAobmV3aW5mby0+Y2luZm8pKTsKKyAgbWVtc2V0ICgmbmV3aW5mby0+amVyciwgMCwgc2l6ZW9mIChuZXdpbmZvLT5qZXJyKSk7CisgIG5ld2luZm8tPmNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yICgmbmV3aW5mby0+amVycik7CisgIGpwZWdfY3JlYXRlX2NvbXByZXNzICgmbmV3aW5mby0+Y2luZm8pOworICBuZXdpbmZvLT5jaW5mby5pbnB1dF9jb21wb25lbnRzID0gMzsKKyAganBlZ19zZXRfZGVmYXVsdHMgKCZuZXdpbmZvLT5jaW5mbyk7CisKKyAgbmV3aW5mby0+Y2luZm8uZGN0X21ldGhvZCA9IEpEQ1RfRkFTVEVTVDsKKworICAvKiBwcmVwYXJlIGZvciByYXcgaW5wdXQgKi8KKyNpZiBKUEVHX0xJQl9WRVJTSU9OID49IDcwCisgIG5ld2luZm8tPmNpbmZvLmRvX2ZhbmN5X2Rvd25zYW1wbGluZyA9IEZBTFNFOworI2VuZGlmCisKKyAgbmV3aW5mby0+Y2luZm8ucmF3X2RhdGFfaW4gPSBUUlVFOworICBuZXdpbmZvLT5jaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19ZQ2JDcjsKKyAgbmV3aW5mby0+Y2luZm8uY29tcF9pbmZvWzBdLmhfc2FtcF9mYWN0b3IgPSAyOworICBuZXdpbmZvLT5jaW5mby5jb21wX2luZm9bMF0udl9zYW1wX2ZhY3RvciA9IDI7CisgIG5ld2luZm8tPmNpbmZvLmNvbXBfaW5mb1sxXS5oX3NhbXBfZmFjdG9yID0gMTsKKyAgbmV3aW5mby0+Y2luZm8uY29tcF9pbmZvWzFdLnZfc2FtcF9mYWN0b3IgPSAxOworICBuZXdpbmZvLT5jaW5mby5jb21wX2luZm9bMl0uaF9zYW1wX2ZhY3RvciA9IDE7CisgIG5ld2luZm8tPmNpbmZvLmNvbXBfaW5mb1syXS52X3NhbXBfZmFjdG9yID0gMTsKKworICBuZXdpbmZvLT5saW5lWzBdID0gbWFsbG9jIChEQ1RTSVpFICogMiAqIHNpemVvZiAoY2hhciAqKSk7CisgIG5ld2luZm8tPmxpbmVbMV0gPSBtYWxsb2MgKERDVFNJWkUgKiBzaXplb2YgKGNoYXIgKikpOworICBuZXdpbmZvLT5saW5lWzJdID0gbWFsbG9jIChEQ1RTSVpFICogc2l6ZW9mIChjaGFyICopKTsKKyAgYmFzZVswXSA9IG5ld2luZm8tPmNvbXBidWZbMF0gPSBtYWxsb2MgKDI1NiAqIDIgKiBEQ1RTSVpFICogMiAqIERDVFNJWkUpOworICBiYXNlWzFdID0gbmV3aW5mby0+Y29tcGJ1ZlsxXSA9IG1hbGxvYyAoMjU2ICogRENUU0laRSAqIERDVFNJWkUpOworICBiYXNlWzJdID0gbmV3aW5mby0+Y29tcGJ1ZlsyXSA9IG1hbGxvYyAoMjU2ICogRENUU0laRSAqIERDVFNJWkUpOworCisgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgMiAqIERDVFNJWkU7IGkgKz0gMiwgaisrKSB7CisgICAgbmV3aW5mby0+bGluZVswXVtpXSA9IGJhc2VbMF07CisgICAgYmFzZVswXSArPSAyICogRENUU0laRSAqIDI1NjsKKyAgICBuZXdpbmZvLT5saW5lWzBdW2kgKyAxXSA9IGJhc2VbMF07CisgICAgYmFzZVswXSArPSAyICogRENUU0laRSAqIDI1NjsKKyAgICBuZXdpbmZvLT5saW5lWzFdW2pdID0gYmFzZVsxXTsKKyAgICBiYXNlWzFdICs9IERDVFNJWkUgKiAyNTY7CisgICAgbmV3aW5mby0+bGluZVsyXVtqXSA9IGJhc2VbMl07CisgICAgYmFzZVsyXSArPSBEQ1RTSVpFICogMjU2OworICB9CisKKyAgbmV3aW5mby0+amRlc3QuaW5pdF9kZXN0aW5hdGlvbiA9IHNtb2tlY29kZWNfaW5pdF9kZXN0aW5hdGlvbjsKKyAgbmV3aW5mby0+amRlc3QuZW1wdHlfb3V0cHV0X2J1ZmZlciA9IHNtb2tlY29kZWNfZmx1c2hfZGVzdGluYXRpb247CisgIG5ld2luZm8tPmpkZXN0LnRlcm1fZGVzdGluYXRpb24gPSBzbW9rZWNvZGVjX3Rlcm1fZGVzdGluYXRpb247CisgIG5ld2luZm8tPmNpbmZvLmRlc3QgPSAmbmV3aW5mby0+amRlc3Q7CisKKyAganBlZ19zdXBwcmVzc190YWJsZXMgKCZuZXdpbmZvLT5jaW5mbywgRkFMU0UpOworCisgIG1lbXNldCAoJm5ld2luZm8tPmRpbmZvLCAwLCBzaXplb2YgKG5ld2luZm8tPmRpbmZvKSk7CisgIG5ld2luZm8tPmRpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yICgmbmV3aW5mby0+amVycik7CisgIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MgKCZuZXdpbmZvLT5kaW5mbyk7CisKKyAgbmV3aW5mby0+anNyYy5pbml0X3NvdXJjZSA9IHNtb2tlY29kZWNfaW5pdF9zb3VyY2U7CisgIG5ld2luZm8tPmpzcmMuZmlsbF9pbnB1dF9idWZmZXIgPSBzbW9rZWNvZGVjX2ZpbGxfaW5wdXRfYnVmZmVyOworICBuZXdpbmZvLT5qc3JjLnNraXBfaW5wdXRfZGF0YSA9IHNtb2tlY29kZWNfc2tpcF9pbnB1dF9kYXRhOworICBuZXdpbmZvLT5qc3JjLnJlc3luY190b19yZXN0YXJ0ID0gc21va2Vjb2RlY19yZXN5bmNfdG9fcmVzdGFydDsKKyAgbmV3aW5mby0+anNyYy50ZXJtX3NvdXJjZSA9IHNtb2tlY29kZWNfdGVybV9zb3VyY2U7CisgIG5ld2luZm8tPmRpbmZvLnNyYyA9ICZuZXdpbmZvLT5qc3JjOworCisgIG5ld2luZm8tPm5lZWRfa2V5ZnJhbWUgPSAxOworICBuZXdpbmZvLT50aHJlc2hvbGQgPSA0MDAwOworICBuZXdpbmZvLT5taW5xdWFsaXR5ID0gMTA7CisgIG5ld2luZm8tPm1heHF1YWxpdHkgPSA4NTsKKyAgbmV3aW5mby0+cmVmZXJlbmNlID0gbWFsbG9jICgzICogKHdpZHRoICogaGVpZ2h0KSAvIDIpOworICBuZXdpbmZvLT5yZWZkZWMgPSAwOworCisgICppbmZvID0gbmV3aW5mbzsKKworICByZXR1cm4gU01PS0VDT0RFQ19PSzsKK30KKworaW50CitzbW9rZWNvZGVjX2RlY29kZV9uZXcgKFNtb2tlQ29kZWNJbmZvICoqIGluZm8pCit7CisgIHJldHVybiBzbW9rZWNvZGVjX2VuY29kZV9uZXcgKGluZm8sIDE2LCAxNiwgMSwgMSk7Cit9CisKK2ludAorc21va2Vjb2RlY19pbmZvX2ZyZWUgKFNtb2tlQ29kZWNJbmZvICogaW5mbykKK3sKKyAgZnJlZSAoaW5mby0+bGluZVswXSk7CisgIGZyZWUgKGluZm8tPmxpbmVbMV0pOworICBmcmVlIChpbmZvLT5saW5lWzJdKTsKKyAgZnJlZSAoaW5mby0+Y29tcGJ1ZlswXSk7CisgIGZyZWUgKGluZm8tPmNvbXBidWZbMV0pOworICBmcmVlIChpbmZvLT5jb21wYnVmWzJdKTsKKyAgZnJlZSAoaW5mby0+cmVmZXJlbmNlKTsKKyAganBlZ19kZXN0cm95X2NvbXByZXNzICgmaW5mby0+Y2luZm8pOworICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcyAoJmluZm8tPmRpbmZvKTsKKyAgZnJlZSAoaW5mbyk7CisKKyAgcmV0dXJuIFNNT0tFQ09ERUNfT0s7Cit9CisKK1Ntb2tlQ29kZWNSZXN1bHQKK3Ntb2tlY29kZWNfc2V0X3F1YWxpdHkgKFNtb2tlQ29kZWNJbmZvICogaW5mbywKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgbWluLCBjb25zdCB1bnNpZ25lZCBpbnQgbWF4KQoreworICBpbmZvLT5taW5xdWFsaXR5ID0gbWluOworICBpbmZvLT5tYXhxdWFsaXR5ID0gbWF4OworCisgIHJldHVybiBTTU9LRUNPREVDX09LOworfQorCitTbW9rZUNvZGVjUmVzdWx0CitzbW9rZWNvZGVjX2dldF9xdWFsaXR5IChTbW9rZUNvZGVjSW5mbyAqIGluZm8sCisgICAgdW5zaWduZWQgaW50ICptaW4sIHVuc2lnbmVkIGludCAqbWF4KQoreworICAqbWluID0gaW5mby0+bWlucXVhbGl0eTsKKyAgKm1heCA9IGluZm8tPm1heHF1YWxpdHk7CisKKyAgcmV0dXJuIFNNT0tFQ09ERUNfT0s7Cit9CisKK1Ntb2tlQ29kZWNSZXN1bHQKK3Ntb2tlY29kZWNfc2V0X3RocmVzaG9sZCAoU21va2VDb2RlY0luZm8gKiBpbmZvLCBjb25zdCB1bnNpZ25lZCBpbnQgdGhyZXNob2xkKQoreworICBpbmZvLT50aHJlc2hvbGQgPSB0aHJlc2hvbGQ7CisKKyAgcmV0dXJuIFNNT0tFQ09ERUNfT0s7Cit9CisKK1Ntb2tlQ29kZWNSZXN1bHQKK3Ntb2tlY29kZWNfZ2V0X3RocmVzaG9sZCAoU21va2VDb2RlY0luZm8gKiBpbmZvLCB1bnNpZ25lZCBpbnQgKnRocmVzaG9sZCkKK3sKKyAgKnRocmVzaG9sZCA9IGluZm8tPnRocmVzaG9sZDsKKworICByZXR1cm4gU01PS0VDT0RFQ19PSzsKK30KKworU21va2VDb2RlY1Jlc3VsdAorc21va2Vjb2RlY19zZXRfYml0cmF0ZSAoU21va2VDb2RlY0luZm8gKiBpbmZvLCBjb25zdCB1bnNpZ25lZCBpbnQgYml0cmF0ZSkKK3sKKyAgaW5mby0+Yml0cmF0ZSA9IGJpdHJhdGU7CisKKyAgcmV0dXJuIFNNT0tFQ09ERUNfT0s7Cit9CisKK1Ntb2tlQ29kZWNSZXN1bHQKK3Ntb2tlY29kZWNfZ2V0X2JpdHJhdGUgKFNtb2tlQ29kZWNJbmZvICogaW5mbywgdW5zaWduZWQgaW50ICpiaXRyYXRlKQoreworICAqYml0cmF0ZSA9IGluZm8tPmJpdHJhdGU7CisKKyAgcmV0dXJuIFNNT0tFQ09ERUNfT0s7Cit9CisKK3N0YXRpYyB2b2lkCitmaW5kX2Jlc3Rfc2l6ZSAoaW50IGJsb2NrcywgdW5zaWduZWQgaW50ICp3aWR0aCwgdW5zaWduZWQgaW50ICpoZWlnaHQpCit7CisgIGludCBzcWNobmc7CisgIGludCB3LCBoOworICBpbnQgYmVzdCwgYmVzdHc7CisgIGludCBmcmVlOworCisgIHNxY2huZyA9IGNlaWwgKHNxcnQgKGJsb2NrcykpOworICB3ID0gc3FjaG5nOworICBoID0gc3FjaG5nOworCisgIEdTVF9ERUJVRyAoImd1ZXNzOiAlZCAlZCIsIHcsIGgpOworCisgIGZyZWUgPSB3ICogaCAtIGJsb2NrczsKKyAgYmVzdCA9IGZyZWU7CisgIGJlc3R3ID0gdzsKKworICB3aGlsZSAodyA8IDI1NikgeworICAgIEdTVF9ERUJVRyAoImN1cnJlbnQ6ICVkICVkIiwgdywgaCk7CisgICAgaWYgKGZyZWUgPCBiZXN0KSB7CisgICAgICBiZXN0ID0gZnJlZTsKKyAgICAgIGJlc3R3ID0gdzsKKyAgICAgIGlmIChmcmVlID09IDApCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBpZiB3ZSBjYW5ub3QgcmVkdWNlIHRoZSBoZWlnaHQsIGluY3JlYXNlIHdpZHRoCisgICAgaWYgKGZyZWUgPCB3KSB7CisgICAgICB3Kys7CisgICAgICBmcmVlICs9IGg7CisgICAgfQorICAgIC8vIHJlZHVjZSBoZWlnaHQgd2hpbGUgcG9zc2libGUKKyAgICB3aGlsZSAoZnJlZSA+PSB3KSB7CisgICAgICBoLS07CisgICAgICBmcmVlIC09IHc7CisgICAgfQorICB9CisgICp3aWR0aCA9IGJlc3R3OworICAqaGVpZ2h0ID0gKGJsb2NrcyArIGJlc3QpIC8gYmVzdHc7Cit9CisKK3N0YXRpYyBpbnQKK2Fic19kaWZmIChjb25zdCB1bnNpZ25lZCBjaGFyICppbjEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluMiwgY29uc3QgaW50IHN0cmlkZSkKK3sKKyAgaW50IHM7CisgIGludCBpLCBqLCBkaWZmOworCisgIHMgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCAyICogRENUU0laRTsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IDIgKiBEQ1RTSVpFOyBqKyspIHsKKyAgICAgIGRpZmYgPSBpbjFbal0gLSBpbjJbal07CisgICAgICBzICs9IGRpZmYgKiBkaWZmOworICAgIH0KKyAgICBpbjEgKz0gc3RyaWRlOworICAgIGluMiArPSBzdHJpZGU7CisgIH0KKyAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyB2b2lkCitwdXQgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZGVzdCwKKyAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzcmNzdHJpZGUsIGludCBkZXN0c3RyaWRlKQoreworICBpbnQgaSwgajsKKworICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgZGVzdFtqXSA9IHNyY1tqXTsKKyAgICB9CisgICAgc3JjICs9IHNyY3N0cmlkZTsKKyAgICBkZXN0ICs9IGRlc3RzdHJpZGU7CisgIH0KK30KKworLyogZW5jb2RpbmcgKi8KK1Ntb2tlQ29kZWNSZXN1bHQKK3Ntb2tlY29kZWNfZW5jb2RlX2lkIChTbW9rZUNvZGVjSW5mbyAqIGluZm8sCisgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBpbnQgKm91dHNpemUpCit7CisgIGludCBpOworCisgICpvdXQrKyA9IFNNT0tFQ09ERUNfVFlQRV9JRDsKKyAgZm9yIChpID0gMDsgaSA8IHN0cmxlbiAoU01PS0VDT0RFQ19JRF9TVFJJTkcpOyBpKyspIHsKKyAgICAqb3V0KysgPSBTTU9LRUNPREVDX0lEX1NUUklOR1tpXTsKKyAgfQorICAqb3V0KysgPSAwOworICAqb3V0KysgPSAxOworICAqb3V0KysgPSAwOworCisgICpvdXRzaXplID0gOTsKKworICByZXR1cm4gU01PS0VDT0RFQ19PSzsKK30KKworU21va2VDb2RlY1Jlc3VsdAorc21va2Vjb2RlY19lbmNvZGUgKFNtb2tlQ29kZWNJbmZvICogaW5mbywKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwKKyAgICBTbW9rZUNvZGVjRmxhZ3MgZmxhZ3MsIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgaW50ICpvdXRzaXplKQoreworICB1bnNpZ25lZCBpbnQgaSwgaiwgczsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqaXA7CisgIHVuc2lnbmVkIGNoYXIgKm9wOworICB1bnNpZ25lZCBpbnQgYmxvY2tzLCBlbmNvZGluZzsKKyAgdW5zaWduZWQgaW50IHNpemU7CisgIHVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0OworICB1bnNpZ25lZCBpbnQgYmxvY2tzX3csIGJsb2Nrc19oOworICB1bnNpZ25lZCBpbnQgdGhyZXNob2xkOworICB1bnNpZ25lZCBpbnQgbWF4OworCisgIGlmIChpbmZvLT5uZWVkX2tleWZyYW1lKSB7CisgICAgZmxhZ3MgfD0gU01PS0VDT0RFQ19LRVlGUkFNRTsKKyAgICBpbmZvLT5uZWVkX2tleWZyYW1lID0gMDsKKyAgfQorCisgIGlmIChmbGFncyAmIFNNT0tFQ09ERUNfS0VZRlJBTUUpCisgICAgdGhyZXNob2xkID0gMDsKKyAgZWxzZQorICAgIHRocmVzaG9sZCA9IGluZm8tPnRocmVzaG9sZDsKKworICBpcCA9IGluOworICBvcCA9IGluZm8tPnJlZmVyZW5jZTsKKworICB3aWR0aCA9IGluZm8tPndpZHRoOworICBoZWlnaHQgPSBpbmZvLT5oZWlnaHQ7CisKKyAgYmxvY2tzX3cgPSB3aWR0aCAvIChEQ1RTSVpFICogMik7CisgIGJsb2Nrc19oID0gaGVpZ2h0IC8gKERDVFNJWkUgKiAyKTsKKworICBtYXggPSBibG9ja3NfdyAqIGJsb2Nrc19oOworCisgIG91dFtJRFhfVFlQRV0gPSBTTU9LRUNPREVDX1RZUEVfREFUQTsKKworI2RlZmluZSBTVE9SRTE2KHZhciwgcG9zLCB4KSBcCisgICB2YXJbcG9zXSAgID0gKHggPj4gOCk7IFwKKyAgIHZhcltwb3MrMV0gPSAoeCAmIDB4ZmYpOworI2RlZmluZSBTVE9SRTMyKHZhciwgcG9zLCB4KSBcCisgICB2YXJbcG9zXSAgID0gKCh4ID4+IDI0KSAmIDB4ZmYpOyBcCisgICB2YXJbcG9zKzFdID0gKCh4ID4+IDE2KSAmIDB4ZmYpOyBcCisgICB2YXJbcG9zKzJdID0gKCh4ID4+IDgpICYgMHhmZik7IFwKKyAgIHZhcltwb3MrM10gPSAgKHggJiAweGZmKTsKKworICAvKiB3cml0ZSBkaW1lbnNpb24gKi8KKyAgU1RPUkUxNiAob3V0LCBJRFhfV0lEVEgsIHdpZHRoKTsKKyAgU1RPUkUxNiAob3V0LCBJRFhfSEVJR0hULCBoZWlnaHQpOworCisgIC8qIHdyaXRlIGZyYW1lcmF0ZSAqLworICBTVE9SRTMyIChvdXQsIElEWF9GUFNfTlVNLCBpbmZvLT5mcHNfbnVtKTsKKyAgU1RPUkUzMiAob3V0LCBJRFhfRlBTX0RFTk9NLCBpbmZvLT5mcHNfZGVub20pOworCisgIGlmICghKGZsYWdzICYgU01PS0VDT0RFQ19LRVlGUkFNRSkpIHsKKyAgICBpbnQgYmxvY2sgPSAwOworCisgICAgYmxvY2tzID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpICs9IDIgKiBEQ1RTSVpFKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGogKz0gMiAqIERDVFNJWkUpIHsKKyAgICAgICAgcyA9IGFic19kaWZmIChpcCwgb3AsIHdpZHRoKTsKKyAgICAgICAgaWYgKHMgPj0gdGhyZXNob2xkKSB7CisgICAgICAgICAgU1RPUkUxNiAob3V0LCBibG9ja3MgKiAyICsgSURYX0JMT0NLUywgYmxvY2spOworICAgICAgICAgIGJsb2NrcysrOworICAgICAgICB9CisKKyAgICAgICAgaXAgKz0gMiAqIERDVFNJWkU7CisgICAgICAgIG9wICs9IDIgKiBEQ1RTSVpFOworICAgICAgICBibG9jaysrOworICAgICAgfQorICAgICAgaXAgKz0gKDIgKiBEQ1RTSVpFIC0gMSkgKiB3aWR0aDsKKyAgICAgIG9wICs9ICgyICogRENUU0laRSAtIDEpICogd2lkdGg7CisgICAgfQorICAgIGlmIChibG9ja3MgPT0gbWF4KSB7CisgICAgICBmbGFncyB8PSBTTU9LRUNPREVDX0tFWUZSQU1FOworICAgICAgYmxvY2tzID0gMDsKKyAgICAgIGVuY29kaW5nID0gbWF4OworICAgIH0gZWxzZSB7CisgICAgICBlbmNvZGluZyA9IGJsb2NrczsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgYmxvY2tzID0gMDsKKyAgICBlbmNvZGluZyA9IG1heDsKKyAgfQorICBTVE9SRTE2IChvdXQsIElEWF9OVU1fQkxPQ0tTLCBibG9ja3MpOworICBvdXRbSURYX0ZMQUdTXSA9IChmbGFncyAmIDB4ZmYpOworCisgIEdTVF9ERUJVRyAoImJsb2NrcyAlZCwgZW5jb2RpbmcgJWQiLCBibG9ja3MsIGVuY29kaW5nKTsKKworICBpbmZvLT5qZGVzdC5uZXh0X291dHB1dF9ieXRlID0gJm91dFtibG9ja3MgKiAyICsgT0ZGU19QSUNUXTsKKyAgaW5mby0+amRlc3QuZnJlZV9pbl9idWZmZXIgPSAoKm91dHNpemUpIC0gT0ZGU19QSUNUOworCisgIGlmIChlbmNvZGluZyA+IDApIHsKKyAgICBpbnQgcXVhbGl0eTsKKworICAgIGlmICghKGZsYWdzICYgU01PS0VDT0RFQ19LRVlGUkFNRSkpCisgICAgICBmaW5kX2Jlc3Rfc2l6ZSAoZW5jb2RpbmcsICZibG9ja3NfdywgJmJsb2Nrc19oKTsKKworICAgIEdTVF9ERUJVRyAoImJlc3Q6ICVkICVkIiwgYmxvY2tzX3csIGJsb2Nrc19oKTsKKworICAgIGluZm8tPmNpbmZvLmltYWdlX3dpZHRoID0gYmxvY2tzX3cgKiBEQ1RTSVpFICogMjsKKyAgICBpbmZvLT5jaW5mby5pbWFnZV9oZWlnaHQgPSBibG9ja3NfaCAqIERDVFNJWkUgKiAyOworCisgICAgaWYgKGZsYWdzICYgU01PS0VDT0RFQ19LRVlGUkFNRSkgeworICAgICAgcXVhbGl0eSA9IChpbmZvLT5tYXhxdWFsaXR5ICogNjApIC8gMTAwOworICAgIH0gZWxzZSB7CisgICAgICBxdWFsaXR5ID0KKyAgICAgICAgICBpbmZvLT5tYXhxdWFsaXR5IC0gKChpbmZvLT5tYXhxdWFsaXR5IC0KKyAgICAgICAgICAgICAgaW5mby0+bWlucXVhbGl0eSkgKiBibG9ja3MpIC8gbWF4OworICAgIH0KKworICAgIEdTVF9ERUJVRyAoInNldCBxICVkICVkICVkIiwgcXVhbGl0eSwgZW5jb2RpbmcsIG1heCk7CisgICAganBlZ19zZXRfcXVhbGl0eSAoJmluZm8tPmNpbmZvLCBxdWFsaXR5LCBUUlVFKTsKKyAgICBHU1RfREVCVUcgKCJzdGFydCIpOworICAgIGpwZWdfc3RhcnRfY29tcHJlc3MgKCZpbmZvLT5jaW5mbywgVFJVRSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZW5jb2Rpbmc7IGkrKykgeworICAgICAgaW50IHBvczsKKyAgICAgIGludCB4LCB5OworCisgICAgICBpZiAoZmxhZ3MgJiBTTU9LRUNPREVDX0tFWUZSQU1FKQorICAgICAgICBwb3MgPSBpOworICAgICAgZWxzZQorICAgICAgICBwb3MgPSAob3V0W2kgKiAyICsgSURYX0JMT0NLU10gPDwgOCkgfCAob3V0W2kgKiAyICsgSURYX0JMT0NLUyArIDFdKTsKKworICAgICAgeCA9IHBvcyAlICh3aWR0aCAvIChEQ1RTSVpFICogMikpOworICAgICAgeSA9IHBvcyAvICh3aWR0aCAvIChEQ1RTSVpFICogMikpOworCisgICAgICBpcCA9IGluICsgKHggKiAoRENUU0laRSAqIDIpKSArICh5ICogKERDVFNJWkUgKiAyKSAqIHdpZHRoKTsKKyAgICAgIG9wID0gaW5mby0+Y29tcGJ1ZlswXSArIChpICUgYmxvY2tzX3cpICogKERDVFNJWkUgKiAyKTsKKyAgICAgIHB1dCAoaXAsIG9wLCAyICogRENUU0laRSwgMiAqIERDVFNJWkUsIHdpZHRoLCAyNTYgKiAoRENUU0laRSAqIDIpKTsKKworICAgICAgaXAgPSBpbiArIHdpZHRoICogaGVpZ2h0ICsgKHggKiBEQ1RTSVpFKSArICh5ICogRENUU0laRSAqIHdpZHRoIC8gMik7CisgICAgICBvcCA9IGluZm8tPmNvbXBidWZbMV0gKyAoaSAlIGJsb2Nrc193KSAqIChEQ1RTSVpFKTsKKyAgICAgIHB1dCAoaXAsIG9wLCBEQ1RTSVpFLCBEQ1RTSVpFLCB3aWR0aCAvIDIsIDI1NiAqIERDVFNJWkUpOworCisgICAgICBpcCA9IGluICsgNSAqICh3aWR0aCAqIGhlaWdodCkgLyA0ICsgKHggKiBEQ1RTSVpFKSArCisgICAgICAgICAgKHkgKiBEQ1RTSVpFICogd2lkdGggLyAyKTsKKyAgICAgIG9wID0gaW5mby0+Y29tcGJ1ZlsyXSArIChpICUgYmxvY2tzX3cpICogKERDVFNJWkUpOworICAgICAgcHV0IChpcCwgb3AsIERDVFNJWkUsIERDVFNJWkUsIHdpZHRoIC8gMiwgMjU2ICogRENUU0laRSk7CisKKyAgICAgIGlmICgoaSAlIGJsb2Nrc193KSA9PSAoYmxvY2tzX3cgLSAxKSB8fCAoaSA9PSBlbmNvZGluZyAtIDEpKSB7CisgICAgICAgIEdTVF9ERUJVRyAoIndyaXRlICVkIiwgcG9zKTsKKyAgICAgICAganBlZ193cml0ZV9yYXdfZGF0YSAoJmluZm8tPmNpbmZvLCBpbmZvLT5saW5lLCAyICogRENUU0laRSk7CisgICAgICB9CisgICAgfQorICAgIEdTVF9ERUJVRyAoImZpbmlzaCIpOworICAgIGpwZWdfZmluaXNoX2NvbXByZXNzICgmaW5mby0+Y2luZm8pOworICB9CisKKyAgc2l6ZSA9ICgoKCgqb3V0c2l6ZSkgLSBPRkZTX1BJQ1QgLSBpbmZvLT5qZGVzdC5mcmVlX2luX2J1ZmZlcikgKyAzKSAmIH4zKTsKKyAgU1RPUkUxNiAob3V0LCBJRFhfU0laRSwgc2l6ZSk7CisKKyAgKm91dHNpemUgPSBzaXplICsgYmxvY2tzICogMiArIE9GRlNfUElDVDsKKyAgR1NUX0RFQlVHICgib3V0c2l6ZSAlZCIsICpvdXRzaXplKTsKKworICAvLyBhbmQgZGVjb2RlIGluIHJlZmVyZW5jZSBmcmFtZSBhZ2FpbgorICBpZiAoaW5mby0+cmVmZGVjKSB7CisgICAgc21va2Vjb2RlY19kZWNvZGUgKGluZm8sIG91dCwgKm91dHNpemUsIGluZm8tPnJlZmVyZW5jZSk7CisgIH0gZWxzZSB7CisgICAgbWVtY3B5IChpbmZvLT5yZWZlcmVuY2UsIGluLCAzICogKHdpZHRoICogaGVpZ2h0KSAvIDIpOworICB9CisKKyAgcmV0dXJuIFNNT0tFQ09ERUNfT0s7Cit9CisKK1Ntb2tlQ29kZWNSZXN1bHQKK3Ntb2tlY29kZWNfcGFyc2VfaWQgKFNtb2tlQ29kZWNJbmZvICogaW5mbywKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgY29uc3QgdW5zaWduZWQgaW50IGluc2l6ZSkKK3sKKyAgaW50IGk7CisKKyAgaWYgKGluc2l6ZSA8IDQgKyBzdHJsZW4gKFNNT0tFQ09ERUNfSURfU1RSSU5HKSkgeworICAgIHJldHVybiBTTU9LRUNPREVDX1dST05HVkVSU0lPTjsKKyAgfQorCisgIGlmICgqaW4rKyAhPSBTTU9LRUNPREVDX1RZUEVfSUQpCisgICAgcmV0dXJuIFNNT0tFQ09ERUNfRVJST1I7CisKKyAgZm9yIChpID0gMDsgaSA8IHN0cmxlbiAoU01PS0VDT0RFQ19JRF9TVFJJTkcpOyBpKyspIHsKKyAgICBpZiAoKmluKysgIT0gU01PS0VDT0RFQ19JRF9TVFJJTkdbaV0pCisgICAgICByZXR1cm4gU01PS0VDT0RFQ19FUlJPUjsKKyAgfQorICBpZiAoKmluKysgIT0gMCB8fCAqaW4rKyAhPSAxIHx8ICppbisrICE9IDApCisgICAgcmV0dXJuIFNNT0tFQ09ERUNfRVJST1I7CisKKyAgcmV0dXJuIFNNT0tFQ09ERUNfT0s7Cit9CisKKyNkZWZpbmUgUkVBRDE2KHZhciwgcG9zLCB4KSBcCisgeCA9IHZhcltwb3NdPDw4IHwgdmFyW3BvcysxXTsKKworI2RlZmluZSBSRUFEMzIodmFyLCBwb3MsIHgpIFwKKyB4ID0gdmFyW3Bvc108PDI0IHwgdmFyW3BvcysxXTw8MTYgfCBcCisgICAgIHZhcltwb3MrMl08PDggfCB2YXJbcG9zKzNdOworCisvKiBkZWNvZGluZyAqLworU21va2VDb2RlY1Jlc3VsdAorc21va2Vjb2RlY19wYXJzZV9oZWFkZXIgKFNtb2tlQ29kZWNJbmZvICogaW5mbywKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgaW5zaXplLAorICAgIFNtb2tlQ29kZWNGbGFncyAqIGZsYWdzLAorICAgIHVuc2lnbmVkIGludCAqd2lkdGgsCisgICAgdW5zaWduZWQgaW50ICpoZWlnaHQsIHVuc2lnbmVkIGludCAqZnBzX251bSwgdW5zaWduZWQgaW50ICpmcHNfZGVub20pCit7CisKKyAgUkVBRDE2IChpbiwgSURYX1dJRFRILCAqd2lkdGgpOworICBSRUFEMTYgKGluLCBJRFhfSEVJR0hULCAqaGVpZ2h0KTsKKyAgKmZsYWdzID0gaW5bSURYX0ZMQUdTXTsKKyAgUkVBRDMyIChpbiwgSURYX0ZQU19OVU0sICpmcHNfbnVtKTsKKyAgUkVBRDMyIChpbiwgSURYX0ZQU19ERU5PTSwgKmZwc19kZW5vbSk7CisKKyAgaWYgKGluZm8tPndpZHRoICE9ICp3aWR0aCB8fAorICAgICAgaW5mby0+aGVpZ2h0ICE9ICpoZWlnaHQgfHwKKyAgICAgIGluZm8tPmZwc19udW0gIT0gKmZwc19udW0gfHwgaW5mby0+ZnBzX2Rlbm9tICE9ICpmcHNfZGVub20pIHsKKyAgICBHU1RfREVCVUcgKCJuZXcgd2lkdGg6ICVkICVkIiwgKndpZHRoLCAqaGVpZ2h0KTsKKworICAgIGluZm8tPnJlZmVyZW5jZSA9IHJlYWxsb2MgKGluZm8tPnJlZmVyZW5jZSwgMyAqICgoKndpZHRoKSAqICgqaGVpZ2h0KSkgLyAyKTsKKyAgICBpbmZvLT53aWR0aCA9ICp3aWR0aDsKKyAgICBpbmZvLT5oZWlnaHQgPSAqaGVpZ2h0OworICAgIGluZm8tPmZwc19udW0gPSAqZnBzX251bTsKKyAgICBpbmZvLT5mcHNfZGVub20gPSAqZnBzX2Rlbm9tOworICB9CisKKyAgcmV0dXJuIFNNT0tFQ09ERUNfT0s7Cit9CisKK1Ntb2tlQ29kZWNSZXN1bHQKK3Ntb2tlY29kZWNfZGVjb2RlIChTbW9rZUNvZGVjSW5mbyAqIGluZm8sCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIGNvbnN0IHVuc2lnbmVkIGludCBpbnNpemUsIHVuc2lnbmVkIGNoYXIgKm91dCkKK3sKKyAgdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQ7CisgIHVuc2lnbmVkIGludCBmcHNfbnVtLCBmcHNfZGVub207CisgIFNtb2tlQ29kZWNGbGFncyBmbGFnczsKKyAgaW50IGksIGo7CisgIGludCBibG9ja3NfdywgYmxvY2tzX2g7CisgIGludCBibG9ja3B0cjsKKyAgaW50IGJsb2NrcywgZGVjb2Rpbmc7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlwOworICB1bnNpZ25lZCBjaGFyICpvcDsKKyAgaW50IHJlczsKKworICBzbW9rZWNvZGVjX3BhcnNlX2hlYWRlciAoaW5mbywgaW4sIGluc2l6ZSwgJmZsYWdzLCAmd2lkdGgsICZoZWlnaHQsCisgICAgICAmZnBzX251bSwgJmZwc19kZW5vbSk7CisKKyAgUkVBRDE2IChpbiwgSURYX05VTV9CTE9DS1MsIGJsb2Nrcyk7CisgIEdTVF9ERUJVRyAoImJsb2NrcyAlZCIsIGJsb2Nrcyk7CisKKyAgaWYgKGZsYWdzICYgU01PS0VDT0RFQ19LRVlGUkFNRSkKKyAgICBkZWNvZGluZyA9IHdpZHRoIC8gKERDVFNJWkUgKiAyKSAqIGhlaWdodCAvIChEQ1RTSVpFICogMik7CisgIGVsc2UKKyAgICBkZWNvZGluZyA9IGJsb2NrczsKKworICBpZiAoZGVjb2RpbmcgPiAwKSB7CisgICAgaW5mby0+anNyYy5uZXh0X2lucHV0X2J5dGUgPSAmaW5bYmxvY2tzICogMiArIE9GRlNfUElDVF07CisgICAgaW5mby0+anNyYy5ieXRlc19pbl9idWZmZXIgPSBpbnNpemUgLSAoYmxvY2tzICogMiArIE9GRlNfUElDVCk7CisKKyAgICBHU1RfREVCVUcgKCJoZWFkZXIgJTAyeCAlZCIsIGluW2Jsb2NrcyAqIDIgKyBPRkZTX1BJQ1RdLCBpbnNpemUpOworICAgIHJlcyA9IGpwZWdfcmVhZF9oZWFkZXIgKCZpbmZvLT5kaW5mbywgVFJVRSk7CisgICAgR1NUX0RFQlVHICgiaGVhZGVyICVkICVkICVkIiwgcmVzLCBpbmZvLT5kaW5mby5pbWFnZV93aWR0aCwKKyAgICAgICAgaW5mby0+ZGluZm8uaW1hZ2VfaGVpZ2h0KTsKKworICAgIGJsb2Nrc193ID0gaW5mby0+ZGluZm8uaW1hZ2Vfd2lkdGggLyAoMiAqIERDVFNJWkUpOworICAgIGJsb2Nrc19oID0gaW5mby0+ZGluZm8uaW1hZ2VfaGVpZ2h0IC8gKDIgKiBEQ1RTSVpFKTsKKworICAgIGluZm8tPmRpbmZvLm91dHB1dF93aWR0aCA9IGluZm8tPmRpbmZvLmltYWdlX3dpZHRoOworICAgIGluZm8tPmRpbmZvLm91dHB1dF9oZWlnaHQgPSBpbmZvLT5kaW5mby5pbWFnZV9oZWlnaHQ7CisKKyAgICBHU1RfREVCVUcgKCJzdGFydCIpOworICAgIGluZm8tPmRpbmZvLmRvX2ZhbmN5X3Vwc2FtcGxpbmcgPSBGQUxTRTsKKyAgICBpbmZvLT5kaW5mby5kb19ibG9ja19zbW9vdGhpbmcgPSBGQUxTRTsKKyAgICBpbmZvLT5kaW5mby5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfWUNiQ3I7CisgICAgaW5mby0+ZGluZm8uZGN0X21ldGhvZCA9IEpEQ1RfSUZBU1Q7CisgICAgaW5mby0+ZGluZm8ucmF3X2RhdGFfb3V0ID0gVFJVRTsKKyAgICBqcGVnX3N0YXJ0X2RlY29tcHJlc3MgKCZpbmZvLT5kaW5mbyk7CisKKyAgICBibG9ja3B0ciA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tzX2g7IGkrKykgeworICAgICAgR1NUX0RFQlVHICgicmVhZCIpOworICAgICAganBlZ19yZWFkX3Jhd19kYXRhICgmaW5mby0+ZGluZm8sIGluZm8tPmxpbmUsIDIgKiBEQ1RTSVpFKTsKKworICAgICAgR1NUX0RFQlVHICgiY29weSAlZCIsIGJsb2Nrc193KTsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBibG9ja3NfdzsgaisrKSB7CisgICAgICAgIGludCBwb3M7CisgICAgICAgIGludCB4LCB5OworCisgICAgICAgIGlmIChmbGFncyAmIFNNT0tFQ09ERUNfS0VZRlJBTUUpCisgICAgICAgICAgcG9zID0gYmxvY2twdHI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBSRUFEMTYgKGluLCBibG9ja3B0ciAqIDIgKyBJRFhfQkxPQ0tTLCBwb3MpOworCisgICAgICAgIHggPSBwb3MgJSAod2lkdGggLyAoRENUU0laRSAqIDIpKTsKKyAgICAgICAgeSA9IHBvcyAvICh3aWR0aCAvIChEQ1RTSVpFICogMikpOworCisgICAgICAgIEdTVF9ERUJVRyAoImJsb2NrICVkICVkICVkIiwgcG9zLCB4LCB5KTsKKworICAgICAgICBpcCA9IGluZm8tPmNvbXBidWZbMF0gKyBqICogKERDVFNJWkUgKiAyKTsKKyAgICAgICAgb3AgPSBpbmZvLT5yZWZlcmVuY2UgKyAoeCAqIChEQ1RTSVpFICogMikpICsKKyAgICAgICAgICAgICh5ICogKERDVFNJWkUgKiAyKSAqIHdpZHRoKTsKKyAgICAgICAgcHV0IChpcCwgb3AsIDIgKiBEQ1RTSVpFLCAyICogRENUU0laRSwgMjU2ICogKERDVFNJWkUgKiAyKSwgd2lkdGgpOworCisgICAgICAgIGlwID0gaW5mby0+Y29tcGJ1ZlsxXSArIGogKiAoRENUU0laRSk7CisgICAgICAgIG9wID0gaW5mby0+cmVmZXJlbmNlICsgd2lkdGggKiBoZWlnaHQgKyAoeCAqIERDVFNJWkUpICsKKyAgICAgICAgICAgICh5ICogRENUU0laRSAqIHdpZHRoIC8gMik7CisgICAgICAgIHB1dCAoaXAsIG9wLCBEQ1RTSVpFLCBEQ1RTSVpFLCAyNTYgKiBEQ1RTSVpFLCB3aWR0aCAvIDIpOworCisgICAgICAgIGlwID0gaW5mby0+Y29tcGJ1ZlsyXSArIGogKiAoRENUU0laRSk7CisgICAgICAgIG9wID0gaW5mby0+cmVmZXJlbmNlICsgNSAqICh3aWR0aCAqIGhlaWdodCkgLyA0ICsgKHggKiBEQ1RTSVpFKSArCisgICAgICAgICAgICAoeSAqIERDVFNJWkUgKiB3aWR0aCAvIDIpOworICAgICAgICBwdXQgKGlwLCBvcCwgRENUU0laRSwgRENUU0laRSwgMjU2ICogRENUU0laRSwgd2lkdGggLyAyKTsKKworICAgICAgICBHU1RfREVCVUcgKCJibG9jayBkb25lICVkICVkICVkIiwgcG9zLCB4LCB5KTsKKyAgICAgICAgYmxvY2twdHIrKzsKKyAgICAgICAgaWYgKGJsb2NrcHRyID49IGRlY29kaW5nKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBHU1RfREVCVUcgKCJmaW5pc2giKTsKKyAgICBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzICgmaW5mby0+ZGluZm8pOworICB9CisKKyAgR1NUX0RFQlVHICgiY29weSIpOworICBpZiAob3V0ICE9IGluZm8tPnJlZmVyZW5jZSkKKyAgICBtZW1jcHkgKG91dCwgaW5mby0+cmVmZXJlbmNlLCAzICogKHdpZHRoICogaGVpZ2h0KSAvIDIpOworICBHU1RfREVCVUcgKCJjb3B5IGRvbmUiKTsKKworICByZXR1cm4gU01PS0VDT0RFQ19PSzsKK30KZGlmZiAtLWdpdCBhL2V4dC9qcGVnL3Ntb2tlY29kZWMuaCBiL2V4dC9qcGVnL3Ntb2tlY29kZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2Q4YTMyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2pwZWcvc21va2Vjb2RlYy5oCkBAIC0wLDAgKzEsMTE5IEBACisvKiBTbW9rZSBDb2RlYworICogQ29weXJpZ2h0IChDKSA8MjAwND4gV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19TTU9LRUNPREVDX0hfXworI2RlZmluZSBfX1NNT0tFQ09ERUNfSF9fCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKK3R5cGVkZWYgc3RydWN0IF9TbW9rZUNvZGVjSW5mbyBTbW9rZUNvZGVjSW5mbzsKKwordHlwZWRlZiBlbnVtIHsKKyAgU01PS0VDT0RFQ19XUk9OR1ZFUlNJT04gICAgICAgPSAtNSwKKyAgU01PS0VDT0RFQ19XUk9OR1NJWkUgICAgICAgICAgPSAtNCwKKyAgU01PS0VDT0RFQ19FUlJPUiAgICAgICAgICAgICAgPSAtMywKKyAgU01PS0VDT0RFQ19OT01FTSAgICAgICAgICAgICAgPSAtMiwKKyAgU01PS0VDT0RFQ19OVUxMUFRSICAgICAgICAgICAgPSAtMSwKKyAgU01PS0VDT0RFQ19PSyAgICAgICAgICAgICAgICAgPSAgMCAKK30gU21va2VDb2RlY1Jlc3VsdDsKKyAgICAgICAgCit0eXBlZGVmIGVudW0geworICBTTU9LRUNPREVDX0tFWUZSQU1FICAgICAgICAgICA9ICgxPDwwKSwKKyAgU01PS0VDT0RFQ19NT1RJT05fVkVDVE9SUyAgICAgPSAoMTw8MSkKK30gU21va2VDb2RlY0ZsYWdzOworICAgICAgICAKKyNkZWZpbmUgU01PS0VDT0RFQ19JRF9TVFJJTkcgInNtb2tlIgorCit0eXBlZGVmIGVudW0geworICBTTU9LRUNPREVDX1RZUEVfSUQgICAgICAgICAgICA9IDB4ODAsCisgIFNNT0tFQ09ERUNfVFlQRV9DT01NRU5UICAgICAgID0gMHg4MSwKKyAgU01PS0VDT0RFQ19UWVBFX0VYVFJBICAgICAgICAgPSAweDgzLAorICBTTU9LRUNPREVDX1RZUEVfREFUQSAgICAgICAgICA9IDB4NDAgCit9IFNtb2tlUGFja2V0VHlwZTsKKworLyogaW5pdCAqLworaW50ICAgICAgICAgICAgICAgICAgICAgc21va2Vjb2RlY19lbmNvZGVfbmV3ICAgKFNtb2tlQ29kZWNJbmZvICoqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgZnBzX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgZnBzX2Rlbm9tKTsKKworaW50ICAgICAgICAgICAgICAgICAgICAgc21va2Vjb2RlY19kZWNvZGVfbmV3ICAgKFNtb2tlQ29kZWNJbmZvICoqaW5mbyk7CisKK2ludCAgICAgICAgICAgICAgICAgICAgIHNtb2tlY29kZWNfaW5mb19mcmVlICAgIChTbW9rZUNvZGVjSW5mbyAqIGluZm8pOworCisvKiBjb25maWcgKi8KK1Ntb2tlQ29kZWNSZXN1bHQgICAgICAgIHNtb2tlY29kZWNfc2V0X3F1YWxpdHkgIChTbW9rZUNvZGVjSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBtYXgpOworU21va2VDb2RlY1Jlc3VsdCAgICAgICAgc21va2Vjb2RlY19nZXRfcXVhbGl0eSAgKFNtb2tlQ29kZWNJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbWF4KTsKKworU21va2VDb2RlY1Jlc3VsdCAgICAgICAgc21va2Vjb2RlY19zZXRfdGhyZXNob2xkIChTbW9rZUNvZGVjSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgdGhyZXNob2xkKTsKK1Ntb2tlQ29kZWNSZXN1bHQgICAgICAgIHNtb2tlY29kZWNfZ2V0X3RocmVzaG9sZCAoU21va2VDb2RlY0luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICp0aHJlc2hvbGQpOworCitTbW9rZUNvZGVjUmVzdWx0ICAgICAgICBzbW9rZWNvZGVjX3NldF9iaXRyYXRlICAoU21va2VDb2RlY0luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGJpdHJhdGUpOworU21va2VDb2RlY1Jlc3VsdCAgICAgICAgc21va2Vjb2RlY19nZXRfYml0cmF0ZSAgKFNtb2tlQ29kZWNJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqYml0cmF0ZSk7CisKKy8qIGVuY29kaW5nICovCitTbW9rZUNvZGVjUmVzdWx0ICAgICAgICBzbW9rZWNvZGVjX2VuY29kZV9pZCAgICAoU21va2VDb2RlY0luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqb3V0c2l6ZSk7CisKK1Ntb2tlQ29kZWNSZXN1bHQgICAgICAgIHNtb2tlY29kZWNfZW5jb2RlICAgICAgIChTbW9rZUNvZGVjSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbW9rZUNvZGVjRmxhZ3MgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqb3V0c2l6ZSk7CisKKy8qIGRlY29kaW5nICovCitTbW9rZUNvZGVjUmVzdWx0ICAgICAgICBzbW9rZWNvZGVjX3BhcnNlX2lkICAgICAoU21va2VDb2RlY0luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGluc2l6ZSk7CisKK1Ntb2tlQ29kZWNSZXN1bHQgICAgICAgIHNtb2tlY29kZWNfcGFyc2VfaGVhZGVyIChTbW9rZUNvZGVjSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgaW5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtb2tlQ29kZWNGbGFncyAqZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICp3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmZwc19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpmcHNfZGVub20pOworCitTbW9rZUNvZGVjUmVzdWx0ICAgICAgICBzbW9rZWNvZGVjX2RlY29kZSAgICAgICAoU21va2VDb2RlY0luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGluc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKyNlbmRpZiAvKiBfX1NNT0tFQ09ERUNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvanBlZy9zbW9rZWZvcm1hdC5oIGIvZXh0L2pwZWcvc21va2Vmb3JtYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWM3NTZkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2pwZWcvc21va2Vmb3JtYXQuaApAQCAtMCwwICsxLDQ2IEBACisvKiBTbW9rZSBDb2RlYworICogQ29weXJpZ2h0IChDKSA8MjAwND4gV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19TTU9LRUZPUk1BVF9IX18KKyNkZWZpbmUgX19TTU9LRUZPUk1BVF9IX18KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNkZWZpbmUgSURYX1RZUEUgICAgICAgIDAKKyNkZWZpbmUgSURYX1dJRFRIICAgICAgIDEKKyNkZWZpbmUgSURYX0hFSUdIVCAgICAgIDMKKyNkZWZpbmUgSURYX0ZQU19OVU0gICAgIDUKKyNkZWZpbmUgSURYX0ZQU19ERU5PTSAgIDkKKyNkZWZpbmUgSURYX0ZMQUdTICAgICAgIDEzCisjZGVmaW5lIElEWF9OVU1fQkxPQ0tTICAxNAorI2RlZmluZSBJRFhfU0laRSAgICAgICAgMTYKKyNkZWZpbmUgSURYX0JMT0NLUyAgICAgIDE4CisjZGVmaW5lIE9GRlNfUElDVCAgICAgICAxOAorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworI2VuZGlmIC8qIF9fU01PS0VGT1JNQVRfSF9fICovCmRpZmYgLS1naXQgYS9leHQvbGFtZS9NYWtlZmlsZS5hbSBiL2V4dC9sYW1lL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MTk4YzgKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbGFtZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEwIEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RsYW1lLmxhCisKK2xpYmdzdGxhbWVfbGFfU09VUkNFUyA9IGdzdGxhbWVtcDNlbmMuYyBwbHVnaW4uYworbGliZ3N0bGFtZV9sYV9DRkxBR1MgPSBcCisgICAgICAgICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpICQoTEFNRV9DRkxBR1MpCitsaWJnc3RsYW1lX2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKExBTUVfTElCUykKK2xpYmdzdGxhbWVfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdGxhbWVtcDNlbmMuaApkaWZmIC0tZ2l0IGEvZXh0L2xhbWUvZ3N0bGFtZW1wM2VuYy5jIGIvZXh0L2xhbWUvZ3N0bGFtZW1wM2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YTYzN2EKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbGFtZS9nc3RsYW1lbXAzZW5jLmMKQEAgLTAsMCArMSw5MzQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDQ+IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1sYW1lbXAzZW5jCisgKiBAc2VlX2Fsc286IGxhbWUsIG1hZCwgdm9yYmlzZW5jCisgKgorICogVGhpcyBlbGVtZW50IGVuY29kZXMgcmF3IGludGVnZXIgYXVkaW8gaW50byBhbiBNUEVHLTEgbGF5ZXIgMyAoTVAzKSBzdHJlYW0uCisgKiBOb3RlIHRoYXQgPHVsaW5rIHVybD0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NUDMiPk1QMzwvdWxpbms+IGlzIG5vdAorICogYSBmcmVlIGZvcm1hdCwgdGhlcmUgYXJlIGxpY2Vuc2luZyBhbmQgcGF0ZW50IGlzc3VlcyB0byB0YWtlIGludG8KKyAqIGNvbnNpZGVyYXRpb24uIFNlZSA8dWxpbmsgdXJsPSJodHRwOi8vd3d3LnZvcmJpcy5jb20vIj5PZ2cvVm9yYmlzPC91bGluaz4KKyAqIGZvciBhIHJveWFsdHkgZnJlZSAoYW5kIG9mdGVuIGhpZ2hlciBxdWFsaXR5KSBhbHRlcm5hdGl2ZS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+T3V0cHV0IHNhbXBsZSByYXRlPC90aXRsZT4KKyAqIElmIG5vIGZpeGVkIG91dHB1dCBzYW1wbGUgcmF0ZSBpcyBuZWdvdGlhdGVkIG9uIHRoZSBlbGVtZW50J3Mgc3JjIHBhZCwKKyAqIHRoZSBlbGVtZW50IHdpbGwgY2hvb3NlIGFuIG9wdGltYWwgc2FtcGxlIHJhdGUgdG8gcmVzYW1wbGUgdG8gaW50ZXJuYWxseS4KKyAqIEZvciBleGFtcGxlLCBhIDE2LWJpdCA0NC4xIEtIeiBtb25vIGF1ZGlvIHN0cmVhbSBlbmNvZGVkIGF0IDQ4IGtiaXQgd2lsbAorICogZ2V0IHJlc2FtcGxlZCB0byAzMiBLSHouICBVc2UgZmlsdGVyIGNhcHMgb24gdGhlIHNyYyBwYWQgdG8gZm9yY2UgYQorICogcGFydGljdWxhciBzYW1wbGUgcmF0ZS4KKyAqIDwvcmVmc2VjdDI+CisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyB3YXZlPXNpbmUgbnVtLWJ1ZmZlcnM9MTAwICEgYXVkaW9jb252ZXJ0ICEgbGFtZW1wM2VuYyAhIGZpbGVzaW5rIGxvY2F0aW9uPXNpbmUubXAzCisgKiBdfCBFbmNvZGUgYSB0ZXN0IHNpbmUgc2lnbmFsIHRvIE1QMy4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBhdXRvYXVkaW9zcmMgISBhdWRpb2NvbnZlcnQgISBsYW1lbXAzZW5jIHRhcmdldD1iaXRyYXRlIGJpdHJhdGU9MTkyICEgZmlsZXNpbmsgbG9jYXRpb249YWxzYXNyYy5tcDMKKyAqIF18IFJlY29yZCBmcm9tIGEgc291bmQgY2FyZCB1c2luZyBBTFNBIGFuZCBlbmNvZGUgdG8gTVAzIHdpdGggYW4gYXZlcmFnZSBiaXRyYXRlIG9mIDE5MmticHMKKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBmaWxlc3JjIGxvY2F0aW9uPW11c2ljLndhdiAhIGRlY29kZWJpbiAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBsYW1lbXAzZW5jIHRhcmdldD1xdWFsaXR5IHF1YWxpdHk9MCAhIGlkM3YybXV4ICEgZmlsZXNpbmsgbG9jYXRpb249bXVzaWMubXAzCisgKiBdfCBUcmFuc2NvZGUgZnJvbSBhIC53YXYgZmlsZSB0byBNUDMgKHRoZSBpZDN2Mm11eCBlbGVtZW50IGlzIG9wdGlvbmFsKSB3aXRoIGJlc3QgVkJSIHF1YWxpdHkKKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBjZGRhOi8vNSAhIGF1ZGlvY29udmVydCAhIGxhbWVtcDNlbmMgdGFyZ2V0PWJpdHJhdGUgY2JyPXRydWUgYml0cmF0ZT0xOTIgISBmaWxlc2luayBsb2NhdGlvbj10cmFjazUubXAzCisgKiBdfCBFbmNvZGUgQXVkaW8gQ0QgdHJhY2sgNSB0byBNUDMgd2l0aCBhIGNvbnN0YW50IGJpdHJhdGUgb2YgMTkya2JwcworICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyBudW0tYnVmZmVycz0xMCAhIGF1ZGlvL3gtcmF3LHJhdGU9NDQxMDAsY2hhbm5lbHM9MSAhIGxhbWVtcDNlbmMgdGFyZ2V0PWJpdHJhdGUgY2JyPXRydWUgYml0cmF0ZT00OCAhIGZpbGVzaW5rIGxvY2F0aW9uPXRlc3QubXAzCisgKiBdfCBFbmNvZGUgdG8gYSBmaXhlZCBzYW1wbGUgcmF0ZQorICogPC9yZWZzZWN0Mj4KKyAqCisgKiBTaW5jZTogMC4xMC4xMgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdzdGxhbWVtcDNlbmMuaCIKKyNpbmNsdWRlIDxnc3QvZ3N0LWkxOG4tcGx1Z2luLmg+CisKKy8qIGxhbWUgPCAzLjk4ICovCisjaWZuZGVmIEhBVkVfTEFNRV9TRVRfVkJSX1FVQUxJVFkKKyNkZWZpbmUgbGFtZV9zZXRfVkJSX3F1YWxpdHkoZmxhZ3MscSkgbGFtZV9zZXRfVkJSX3EoKGZsYWdzKSwoaW50KShxKSkKKyNlbmRpZgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChkZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBkZWJ1ZworCisvKiBlbGVtZW50ZmFjdG9yeSBpbmZvcm1hdGlvbiAqLworCisvKiBMQU1FTVAzRU5DIGNhbiBkbyBNUEVHLTEsIE1QRUctMiwgYW5kIE1QRUctMi41LCBzbyBpdCBoYXMgOSBwb3NzaWJsZQorICogc2FtcGxlIHJhdGVzIGl0IHN1cHBvcnRzICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X2xhbWVtcDNlbmNfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChTMTYpICIsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJyYXRlID0gKGludCkgeyA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAgfSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxOyAiCisgICAgICAgICJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKFMxNikgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSB7IDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDIsICIgImNoYW5uZWwtbWFzayA9IChiaXRtYXNrKSAweDMiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfbGFtZW1wM2VuY19zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL21wZWcsICIKKyAgICAgICAgIm1wZWd2ZXJzaW9uID0gKGludCkgMSwgIgorICAgICAgICAibGF5ZXIgPSAoaW50KSAzLCAiCisgICAgICAgICJyYXRlID0gKGludCkgeyA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAgfSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDIgXSIpCisgICAgKTsKKworLyoqKioqKioqKiogRGVmaW5lIHVzZWZ1bCB0eXBlcyBmb3Igbm9uLXByb2dyYW1tYXRpYyBpbnRlcmZhY2VzICoqKioqKioqKiovCitlbnVtCit7CisgIExBTUVNUDNFTkNfVEFSR0VUX1FVQUxJVFkgPSAwLAorICBMQU1FTVAzRU5DX1RBUkdFVF9CSVRSQVRFCit9OworCisjZGVmaW5lIEdTVF9UWVBFX0xBTUVNUDNFTkNfVEFSR0VUIChnc3RfbGFtZW1wM2VuY190YXJnZXRfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X2xhbWVtcDNlbmNfdGFyZ2V0X2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgbGFtZV90YXJnZXRfdHlwZSA9IDA7CisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIGxhbWVfdGFyZ2V0c1tdID0geworICAgIHtMQU1FTVAzRU5DX1RBUkdFVF9RVUFMSVRZLCAiUXVhbGl0eSIsICJxdWFsaXR5In0sCisgICAge0xBTUVNUDNFTkNfVEFSR0VUX0JJVFJBVEUsICJCaXRyYXRlIiwgImJpdHJhdGUifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0KKyAgfTsKKworICBpZiAoIWxhbWVfdGFyZ2V0X3R5cGUpIHsKKyAgICBsYW1lX3RhcmdldF90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdExhbWVNUDNFbmNUYXJnZXQiLCBsYW1lX3RhcmdldHMpOworICB9CisgIHJldHVybiBsYW1lX3RhcmdldF90eXBlOworfQorCitlbnVtCit7CisgIExBTUVNUDNFTkNfRU5DT0RJTkdfRU5HSU5FX1FVQUxJVFlfRkFTVCA9IDAsCisgIExBTUVNUDNFTkNfRU5DT0RJTkdfRU5HSU5FX1FVQUxJVFlfU1RBTkRBUkQsCisgIExBTUVNUDNFTkNfRU5DT0RJTkdfRU5HSU5FX1FVQUxJVFlfSElHSAorfTsKKworI2RlZmluZSBHU1RfVFlQRV9MQU1FTVAzRU5DX0VOQ09ESU5HX0VOR0lORV9RVUFMSVRZIChnc3RfbGFtZW1wM2VuY19lbmNvZGluZ19lbmdpbmVfcXVhbGl0eV9nZXRfdHlwZSgpKQorc3RhdGljIEdUeXBlCitnc3RfbGFtZW1wM2VuY19lbmNvZGluZ19lbmdpbmVfcXVhbGl0eV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGxhbWVfZW5jb2RpbmdfZW5naW5lX3F1YWxpdHlfdHlwZSA9IDA7CisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIGxhbWVfZW5jb2RpbmdfZW5naW5lX3F1YWxpdHlbXSA9IHsKKyAgICB7MCwgIkZhc3QiLCAiZmFzdCJ9LAorICAgIHsxLCAiU3RhbmRhcmQiLCAic3RhbmRhcmQifSwKKyAgICB7MiwgIkhpZ2giLCAiaGlnaCJ9LAorICAgIHswLCBOVUxMLCBOVUxMfQorICB9OworCisgIGlmICghbGFtZV9lbmNvZGluZ19lbmdpbmVfcXVhbGl0eV90eXBlKSB7CisgICAgbGFtZV9lbmNvZGluZ19lbmdpbmVfcXVhbGl0eV90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdExhbWVNUDNFbmNFbmNvZGluZ0VuZ2luZVF1YWxpdHkiLAorICAgICAgICBsYW1lX2VuY29kaW5nX2VuZ2luZV9xdWFsaXR5KTsKKyAgfQorICByZXR1cm4gbGFtZV9lbmNvZGluZ19lbmdpbmVfcXVhbGl0eV90eXBlOworfQorCisvKioqKioqKioqKiBTdGFuZGFyZCBzdHVmZiBmb3Igc2lnbmFscyBhbmQgYXJndW1lbnRzICoqKioqKioqKiovCisKK2VudW0KK3sKKyAgQVJHXzAsCisgIEFSR19UQVJHRVQsCisgIEFSR19CSVRSQVRFLAorICBBUkdfQ0JSLAorICBBUkdfUVVBTElUWSwKKyAgQVJHX0VOQ09ESU5HX0VOR0lORV9RVUFMSVRZLAorICBBUkdfTU9OTworfTsKKworI2RlZmluZSBERUZBVUxUX1RBUkdFVCBMQU1FTVAzRU5DX1RBUkdFVF9RVUFMSVRZCisjZGVmaW5lIERFRkFVTFRfQklUUkFURSAxMjgKKyNkZWZpbmUgREVGQVVMVF9DQlIgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9RVUFMSVRZIDQKKyNkZWZpbmUgREVGQVVMVF9FTkNPRElOR19FTkdJTkVfUVVBTElUWSBMQU1FTVAzRU5DX0VOQ09ESU5HX0VOR0lORV9RVUFMSVRZX1NUQU5EQVJECisjZGVmaW5lIERFRkFVTFRfTU9OTyBGQUxTRQorCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2xhbWVtcDNlbmNfc3RhcnQgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2xhbWVtcDNlbmNfc3RvcCAoR3N0QXVkaW9FbmNvZGVyICogZW5jKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbGFtZW1wM2VuY19zZXRfZm9ybWF0IChHc3RBdWRpb0VuY29kZXIgKiBlbmMsCisgICAgR3N0QXVkaW9JbmZvICogaW5mbyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfbGFtZW1wM2VuY19oYW5kbGVfZnJhbWUgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYywKKyAgICBHc3RCdWZmZXIgKiBpbl9idWYpOworc3RhdGljIHZvaWQgZ3N0X2xhbWVtcDNlbmNfZmx1c2ggKEdzdEF1ZGlvRW5jb2RlciAqIGVuYyk7CisKK3N0YXRpYyB2b2lkIGdzdF9sYW1lbXAzZW5jX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9sYW1lbXAzZW5jX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbGFtZW1wM2VuY19zZXR1cCAoR3N0TGFtZU1QM0VuYyAqIGxhbWUsIEdzdFRhZ0xpc3QgKiogdGFncyk7CisKKyNkZWZpbmUgZ3N0X2xhbWVtcDNlbmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0TGFtZU1QM0VuYywgZ3N0X2xhbWVtcDNlbmMsIEdTVF9UWVBFX0FVRElPX0VOQ09ERVIpOworCitzdGF0aWMgdm9pZAorZ3N0X2xhbWVtcDNlbmNfcmVsZWFzZV9tZW1vcnkgKEdzdExhbWVNUDNFbmMgKiBsYW1lKQoreworICBpZiAobGFtZS0+bGdmKSB7CisgICAgbGFtZV9jbG9zZSAobGFtZS0+bGdmKTsKKyAgICBsYW1lLT5sZ2YgPSBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbGFtZW1wM2VuY19maW5hbGl6ZSAoR09iamVjdCAqIG9iaikKK3sKKyAgZ3N0X2xhbWVtcDNlbmNfcmVsZWFzZV9tZW1vcnkgKEdTVF9MQU1FTVAzRU5DIChvYmopKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iaik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbGFtZW1wM2VuY19jbGFzc19pbml0IChHc3RMYW1lTVAzRW5jQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEF1ZGlvRW5jb2RlckNsYXNzICpiYXNlX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgYmFzZV9jbGFzcyA9IChHc3RBdWRpb0VuY29kZXJDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfbGFtZW1wM2VuY19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9sYW1lbXAzZW5jX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfbGFtZW1wM2VuY19maW5hbGl6ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfbGFtZW1wM2VuY19zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfbGFtZW1wM2VuY19zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIkwuQS5NLkUuIG1wMyBlbmNvZGVyIiwgIkNvZGVjL0VuY29kZXIvQXVkaW8iLAorICAgICAgIkhpZ2gtcXVhbGl0eSBmcmVlIE1QMyBlbmNvZGVyIiwKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4iKTsKKworICBiYXNlX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbGFtZW1wM2VuY19zdGFydCk7CisgIGJhc2VfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2xhbWVtcDNlbmNfc3RvcCk7CisgIGJhc2VfY2xhc3MtPnNldF9mb3JtYXQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2xhbWVtcDNlbmNfc2V0X2Zvcm1hdCk7CisgIGJhc2VfY2xhc3MtPmhhbmRsZV9mcmFtZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbGFtZW1wM2VuY19oYW5kbGVfZnJhbWUpOworICBiYXNlX2NsYXNzLT5mbHVzaCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbGFtZW1wM2VuY19mbHVzaCk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX1RBUkdFVCwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgidGFyZ2V0IiwgIlRhcmdldCIsCisgICAgICAgICAgIk9wdGltaXplIGZvciBxdWFsaXR5IG9yIGJpdHJhdGUiLCBHU1RfVFlQRV9MQU1FTVAzRU5DX1RBUkdFVCwKKyAgICAgICAgICBERUZBVUxUX1RBUkdFVCwKKyAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBBUkdfQklUUkFURSwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJiaXRyYXRlIiwgIkJpdHJhdGUgKGtiL3MpIiwKKyAgICAgICAgICAiQml0cmF0ZSBpbiBrYml0L3NlYyAoT25seSB2YWxpZCBpZiB0YXJnZXQgaXMgYml0cmF0ZSwgZm9yIENCUiBvbmUgIgorICAgICAgICAgICJvZiA4LCAxNiwgMjQsIDMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgIgorICAgICAgICAgICIyNTYgb3IgMzIwKSIsIDgsIDMyMCwgREVGQVVMVF9CSVRSQVRFLAorICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19DQlIsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImNiciIsICJDQlIiLCAiRW5mb3JjZSBjb25zdGFudCBiaXRyYXRlIGVuY29kaW5nICIKKyAgICAgICAgICAiKE9ubHkgdmFsaWQgaWYgdGFyZ2V0IGlzIGJpdHJhdGUpIiwgREVGQVVMVF9DQlIsCisgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX1FVQUxJVFksCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJxdWFsaXR5IiwgIlF1YWxpdHkiLAorICAgICAgICAgICJWQlIgUXVhbGl0eSBmcm9tIDAgdG8gMTAsIDAgYmVpbmcgdGhlIGJlc3QgIgorICAgICAgICAgICIoT25seSB2YWxpZCBpZiB0YXJnZXQgaXMgcXVhbGl0eSkiLCAwLjAsIDkuOTk5LAorICAgICAgICAgIERFRkFVTFRfUVVBTElUWSwKKyAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLAorICAgICAgQVJHX0VOQ09ESU5HX0VOR0lORV9RVUFMSVRZLCBnX3BhcmFtX3NwZWNfZW51bSAoImVuY29kaW5nLWVuZ2luZS1xdWFsaXR5IiwKKyAgICAgICAgICAiRW5jb2RpbmcgRW5naW5lIFF1YWxpdHkiLCAiUXVhbGl0eS9zcGVlZCBvZiB0aGUgZW5jb2RpbmcgZW5naW5lLCAiCisgICAgICAgICAgInRoaXMgZG9lcyBub3QgYWZmZWN0IHRoZSBiaXRyYXRlISIsCisgICAgICAgICAgR1NUX1RZUEVfTEFNRU1QM0VOQ19FTkNPRElOR19FTkdJTkVfUVVBTElUWSwKKyAgICAgICAgICBERUZBVUxUX0VOQ09ESU5HX0VOR0lORV9RVUFMSVRZLAorICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19NT05PLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJtb25vIiwgIk1vbm8iLCAiRW5mb3JjZSBtb25vIGVuY29kaW5nIiwKKyAgICAgICAgICBERUZBVUxUX01PTk8sCisgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9sYW1lbXAzZW5jX2luaXQgKEdzdExhbWVNUDNFbmMgKiBsYW1lKQoreworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9BVURJT19FTkNPREVSX1NJTktfUEFEIChsYW1lKSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2xhbWVtcDNlbmNfc3RhcnQgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYykKK3sKKyAgR3N0TGFtZU1QM0VuYyAqbGFtZSA9IEdTVF9MQU1FTVAzRU5DIChlbmMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGxhbWUsICJzdGFydCIpOworCisgIGlmICghbGFtZS0+YWRhcHRlcikKKyAgICBsYW1lLT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworICBnc3RfYWRhcHRlcl9jbGVhciAobGFtZS0+YWRhcHRlcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2xhbWVtcDNlbmNfc3RvcCAoR3N0QXVkaW9FbmNvZGVyICogZW5jKQoreworICBHc3RMYW1lTVAzRW5jICpsYW1lID0gR1NUX0xBTUVNUDNFTkMgKGVuYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAobGFtZSwgInN0b3AiKTsKKworICBpZiAobGFtZS0+YWRhcHRlcikgeworICAgIGdfb2JqZWN0X3VucmVmIChsYW1lLT5hZGFwdGVyKTsKKyAgICBsYW1lLT5hZGFwdGVyID0gTlVMTDsKKyAgfQorCisgIGdzdF9sYW1lbXAzZW5jX3JlbGVhc2VfbWVtb3J5IChsYW1lKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2xhbWVtcDNlbmNfc2V0X2Zvcm1hdCAoR3N0QXVkaW9FbmNvZGVyICogZW5jLCBHc3RBdWRpb0luZm8gKiBpbmZvKQoreworICBHc3RMYW1lTVAzRW5jICpsYW1lOworICBnaW50IG91dF9zYW1wbGVyYXRlOworICBnaW50IHZlcnNpb247CisgIEdzdENhcHMgKm90aGVyY2FwczsKKyAgR3N0Q2xvY2tUaW1lIGxhdGVuY3k7CisgIEdzdFRhZ0xpc3QgKnRhZ3MgPSBOVUxMOworCisgIGxhbWUgPSBHU1RfTEFNRU1QM0VOQyAoZW5jKTsKKworICAvKiBwYXJhbWV0ZXJzIGFscmVhZHkgcGFyc2VkIGZvciB1cyAqLworICBsYW1lLT5zYW1wbGVyYXRlID0gR1NUX0FVRElPX0lORk9fUkFURSAoaW5mbyk7CisgIGxhbWUtPm51bV9jaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTIChpbmZvKTsKKworICAvKiBidXQgd2UgbWlnaHQgYmUgYXNrZWQgdG8gcmVjb25maWd1cmUsIHNvIHJlc2V0ICovCisgIGdzdF9sYW1lbXAzZW5jX3JlbGVhc2VfbWVtb3J5IChsYW1lKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChsYW1lLCAic2V0dGluZyB1cCBsYW1lIik7CisgIGlmICghZ3N0X2xhbWVtcDNlbmNfc2V0dXAgKGxhbWUsICZ0YWdzKSkKKyAgICBnb3RvIHNldHVwX2ZhaWxlZDsKKworICBvdXRfc2FtcGxlcmF0ZSA9IGxhbWVfZ2V0X291dF9zYW1wbGVyYXRlIChsYW1lLT5sZ2YpOworICBpZiAob3V0X3NhbXBsZXJhdGUgPT0gMCkKKyAgICBnb3RvIHplcm9fb3V0cHV0X3JhdGU7CisgIGlmIChvdXRfc2FtcGxlcmF0ZSAhPSBsYW1lLT5zYW1wbGVyYXRlKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChsYW1lLAorICAgICAgICAib3V0cHV0IHNhbXBsZXJhdGUgJWQgaXMgZGlmZmVyZW50IGZyb20gaW5jb21pbmcgc2FtcGxlcmF0ZSAlZCIsCisgICAgICAgIG91dF9zYW1wbGVyYXRlLCBsYW1lLT5zYW1wbGVyYXRlKTsKKyAgfQorICBsYW1lLT5vdXRfc2FtcGxlcmF0ZSA9IG91dF9zYW1wbGVyYXRlOworCisgIHZlcnNpb24gPSBsYW1lX2dldF92ZXJzaW9uIChsYW1lLT5sZ2YpOworICBpZiAodmVyc2lvbiA9PSAwKQorICAgIHZlcnNpb24gPSAyOworICBlbHNlIGlmICh2ZXJzaW9uID09IDEpCisgICAgdmVyc2lvbiA9IDE7CisgIGVsc2UgaWYgKHZlcnNpb24gPT0gMikKKyAgICB2ZXJzaW9uID0gMzsKKworICBvdGhlcmNhcHMgPQorICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL21wZWciLAorICAgICAgIm1wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgMSwKKyAgICAgICJtcGVnYXVkaW92ZXJzaW9uIiwgR19UWVBFX0lOVCwgdmVyc2lvbiwKKyAgICAgICJsYXllciIsIEdfVFlQRV9JTlQsIDMsCisgICAgICAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBsYW1lLT5tb25vID8gMSA6IGxhbWUtPm51bV9jaGFubmVscywKKyAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgb3V0X3NhbXBsZXJhdGUsIE5VTEwpOworCisgIC8qIGFuZCB1c2UgdGhlc2UgY2FwcyAqLworICBnc3RfYXVkaW9fZW5jb2Rlcl9zZXRfb3V0cHV0X2Zvcm1hdCAoR1NUX0FVRElPX0VOQ09ERVIgKGVuYyksIG90aGVyY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChvdGhlcmNhcHMpOworCisgIC8qIGJhc2UgY2xhc3MgZmVlZGJhY2s6CisgICAqIC0gd2Ugd2lsbCBoYW5kbGUgYnVmZmVycywganVzdCBoYW5kIHVzIGFsbCBhdmFpbGFibGUKKyAgICogLSByZXBvcnQgbGF0ZW5jeSAqLworICBsYXRlbmN5ID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAobGFtZV9nZXRfZnJhbWVzaXplIChsYW1lLT5sZ2YpLAorICAgICAgR1NUX1NFQ09ORCwgbGFtZS0+c2FtcGxlcmF0ZSk7CisgIGdzdF9hdWRpb19lbmNvZGVyX3NldF9sYXRlbmN5IChlbmMsIGxhdGVuY3ksIGxhdGVuY3kpOworCisgIGlmICh0YWdzKSB7CisgICAgZ3N0X2F1ZGlvX2VuY29kZXJfbWVyZ2VfdGFncyAoZW5jLCB0YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UpOworICAgIGdzdF90YWdfbGlzdF91bnJlZiAodGFncyk7CisgIH0KKworICByZXR1cm4gVFJVRTsKKworemVyb19vdXRwdXRfcmF0ZToKKyAgeworICAgIGlmICh0YWdzKQorICAgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdzKTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAobGFtZSwgTElCUkFSWSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJMQU1FIG1wMyBhdWRpbyBkZWNpZGVkIG9uIGEgemVybyBzYW1wbGUgcmF0ZSIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3NldHVwX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChsYW1lLCBMSUJSQVJZLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIkZhaWxlZCB0byBjb25maWd1cmUgTEFNRSBtcDMgYXVkaW8gZW5jb2Rlci4gQ2hlY2sgeW91ciBlbmNvZGluZyBwYXJhbWV0ZXJzLiIpKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogPHBocC1lbXVsYXRpb24tbW9kZT50aHJlZSB1bmRlcnNjb3JlcyBmb3IgX19fcmF0ZSBpcyByZWFsbHkgcmVhbGx5IHJlYWxseQorICogcHJpdmF0ZSBhcyBvcHBvc2VkIHRvIG9uZSB1bmRlcnNjb3JlPHBocC1lbXVsYXRpb24tbW9kZT4gKi8KKy8qIGNhbGwgdGhpcyBNQUNSTyBvdXRzaWRlIG9mIHRoZSBOVUxMIHN0YXRlIHNvIHRoYXQgd2UgaGF2ZSBhIGhpZ2hlciBjaGFuY2UKKyAqIG9mIGFjdHVhbGx5IGhhdmluZyBhIHBpcGVsaW5lIGFuZCBidXMgdG8gZ2V0IHRoZSBtZXNzYWdlIHRocm91Z2ggKi8KKworI2RlZmluZSBDSEVDS19BTkRfRklYVVBfQklUUkFURShvYmoscGFyYW0scmF0ZSkJCSAJCSAgXAorR19TVE1UX1NUQVJUIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdpbnQgX19fcmF0ZSA9IHJhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ2ludCBtYXhyYXRlID0gMzIwOwkJCQkJCQkgIFwKKyAgZ2ludCBtdWx0aXBsaWVyID0gNjQ7CQkJCQkJCSAgXAorICBpZiAocmF0ZSA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19fcmF0ZSA9IHJhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIGlmIChyYXRlIDw9IDY0KSB7CQkJCSAgICAgICAgICAgICAgICAgIFwKKyAgICBtYXhyYXRlID0gNjQ7IG11bHRpcGxpZXIgPSA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgocmF0ZSAlIDgpICE9IDApIF9fX3JhdGUgPSBHU1RfUk9VTkRfVVBfOCAocmF0ZSk7IAkJICBcCisgIH0gZWxzZSBpZiAocmF0ZSA8PSAxMjgpIHsJCQkJCQkgIFwKKyAgICBtYXhyYXRlID0gMTI4OyBtdWx0aXBsaWVyID0gMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgocmF0ZSAlIDE2KSAhPSAwKSBfX19yYXRlID0gR1NUX1JPVU5EX1VQXzE2IChyYXRlKTsgICAgICAgICAgICAgICBcCisgIH0gZWxzZSBpZiAocmF0ZSA8PSAyNTYpIHsJCQkJCQkgIFwKKyAgICBtYXhyYXRlID0gMjU2OyBtdWx0aXBsaWVyID0gMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgocmF0ZSAlIDMyKSAhPSAwKSBfX19yYXRlID0gR1NUX1JPVU5EX1VQXzMyIChyYXRlKTsgICAgICAgICAgICAgICBcCisgIH0gZWxzZSBpZiAocmF0ZSA8PSAzMjApIHsgCQkJCQkJICBcCisgICAgbWF4cmF0ZSA9IDMyMDsgbXVsdGlwbGllciA9IDY0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKHJhdGUgJSA2NCkgIT0gMCkgX19fcmF0ZSA9IEdTVF9ST1VORF9VUF82NCAocmF0ZSk7ICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChfX19yYXRlICE9IHJhdGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChvYmosIExJQlJBUlksIFNFVFRJTkdTLAkJCSAgXAorICAgICAgKF8oIlRoZSByZXF1ZXN0ZWQgYml0cmF0ZSAlZCBrYml0L3MgZm9yIHByb3BlcnR5ICclcycgIiAgICAgICAgICAgICBcCisgICAgICAgImlzIG5vdCBhbGxvd2VkLiAiICAJCQkJCSAgICAgICAgICBcCisgICAgICAgIlRoZSBiaXRyYXRlIHdhcyBjaGFuZ2VkIHRvICVkIGtiaXQvcy4iKSwgcmF0ZSwJCSAgICAgICAgICBcCisgICAgICAgICBwYXJhbSwgIF9fX3JhdGUpLCAJCQkJCSAgICAgICAgICBcCisgICAgICAgKCJBIGJpdHJhdGUgYmVsb3cgJWQgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgJWQuIiwgCQkgIFwKKyAgICAgICAgICBtYXhyYXRlLCBtdWx0aXBsaWVyKSk7CQkgIAkJCSAgXAorICAgIHJhdGUgPSBfX19yYXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gR19TVE1UX0VORAorCitzdGF0aWMgdm9pZAorZ3N0X2xhbWVtcDNlbmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdExhbWVNUDNFbmMgKmxhbWU7CisKKyAgbGFtZSA9IEdTVF9MQU1FTVAzRU5DIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgQVJHX1RBUkdFVDoKKyAgICAgIGxhbWUtPnRhcmdldCA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0JJVFJBVEU6CisgICAgICBsYW1lLT5iaXRyYXRlID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19DQlI6CisgICAgICBsYW1lLT5jYnIgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19RVUFMSVRZOgorICAgICAgbGFtZS0+cXVhbGl0eSA9IGdfdmFsdWVfZ2V0X2Zsb2F0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19FTkNPRElOR19FTkdJTkVfUVVBTElUWToKKyAgICAgIGxhbWUtPmVuY29kaW5nX2VuZ2luZV9xdWFsaXR5ID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfTU9OTzoKKyAgICAgIGxhbWUtPm1vbm8gPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbGFtZW1wM2VuY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0TGFtZU1QM0VuYyAqbGFtZTsKKworICBsYW1lID0gR1NUX0xBTUVNUDNFTkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBBUkdfVEFSR0VUOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGxhbWUtPnRhcmdldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19CSVRSQVRFOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgbGFtZS0+Yml0cmF0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19DQlI6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgbGFtZS0+Y2JyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX1FVQUxJVFk6CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIGxhbWUtPnF1YWxpdHkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfRU5DT0RJTkdfRU5HSU5FX1FVQUxJVFk6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgbGFtZS0+ZW5jb2RpbmdfZW5naW5lX3F1YWxpdHkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfTU9OTzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBsYW1lLT5tb25vKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogKioqKiBjcmVkaXRzIGdvIHRvIG1wZWdhdWRpb3BhcnNlICoqKiogKi8KKworc3RhdGljIGNvbnN0IGd1aW50IG1wM3R5cGVzX2JpdHJhdGVzWzJdWzNdWzE2XSA9IHsKKyAgeworICAgICAgICB7MCwgMzIsIDY0LCA5NiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDI4OCwgMzIwLCAzNTIsIDM4NCwgNDE2LCA0NDgsfSwKKyAgICAgICAgezAsIDMyLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMCwgMzg0LH0sCisgICAgICAgIHswLCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLH0KKyAgICAgIH0sCisgIHsKKyAgICAgICAgezAsIDMyLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MCwgMTc2LCAxOTIsIDIyNCwgMjU2LH0sCisgICAgICAgIHswLCA4LCAxNiwgMjQsIDMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTQ0LCAxNjAsfSwKKyAgICAgICAgezAsIDgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MCx9CisgICAgICB9LAorfTsKKworc3RhdGljIGNvbnN0IGd1aW50IG1wM3R5cGVzX2ZyZXFzWzNdWzNdID0geyB7NDQxMDAsIDQ4MDAwLCAzMjAwMH0sCit7MjIwNTAsIDI0MDAwLCAxNjAwMH0sCit7MTEwMjUsIDEyMDAwLCA4MDAwfQorfTsKKworc3RhdGljIGlubGluZSBndWludAorbXAzX3R5cGVfZnJhbWVfbGVuZ3RoX2Zyb21faGVhZGVyIChHc3RMYW1lTVAzRW5jICogbGFtZSwgZ3VpbnQzMiBoZWFkZXIsCisgICAgZ3VpbnQgKiBwdXRfdmVyc2lvbiwgZ3VpbnQgKiBwdXRfbGF5ZXIsIGd1aW50ICogcHV0X2NoYW5uZWxzLAorICAgIGd1aW50ICogcHV0X2JpdHJhdGUsIGd1aW50ICogcHV0X3NhbXBsZXJhdGUsIGd1aW50ICogcHV0X21vZGUsCisgICAgZ3VpbnQgKiBwdXRfY3JjKQoreworICBndWludCBsZW5ndGg7CisgIGd1bG9uZyBtb2RlLCBzYW1wbGVyYXRlLCBiaXRyYXRlLCBsYXllciwgY2hhbm5lbHMsIHBhZGRpbmcsIGNyYzsKKyAgZ3Vsb25nIHZlcnNpb247CisgIGdpbnQgbHNmLCBtcGcyNTsKKworICBpZiAoaGVhZGVyICYgKDEgPDwgMjApKSB7CisgICAgbHNmID0gKGhlYWRlciAmICgxIDw8IDE5KSkgPyAwIDogMTsKKyAgICBtcGcyNSA9IDA7CisgIH0gZWxzZSB7CisgICAgbHNmID0gMTsKKyAgICBtcGcyNSA9IDE7CisgIH0KKworICB2ZXJzaW9uID0gMSArIGxzZiArIG1wZzI1OworCisgIGxheWVyID0gNCAtICgoaGVhZGVyID4+IDE3KSAmIDB4Myk7CisKKyAgY3JjID0gKGhlYWRlciA+PiAxNikgJiAweDE7CisKKyAgYml0cmF0ZSA9IChoZWFkZXIgPj4gMTIpICYgMHhGOworICBiaXRyYXRlID0gbXAzdHlwZXNfYml0cmF0ZXNbbHNmXVtsYXllciAtIDFdW2JpdHJhdGVdICogMTAwMDsKKyAgLyogVGhlIGNhbGxlciBoYXMgZW5zdXJlZCB3ZSBoYXZlIGEgdmFsaWQgaGVhZGVyLCBzbyBiaXRyYXRlIGNhbid0IGJlCisgICAgIHplcm8gaGVyZS4gKi8KKyAgZ19hc3NlcnQgKGJpdHJhdGUgIT0gMCk7CisKKyAgc2FtcGxlcmF0ZSA9IChoZWFkZXIgPj4gMTApICYgMHgzOworICBzYW1wbGVyYXRlID0gbXAzdHlwZXNfZnJlcXNbbHNmICsgbXBnMjVdW3NhbXBsZXJhdGVdOworCisgIHBhZGRpbmcgPSAoaGVhZGVyID4+IDkpICYgMHgxOworCisgIG1vZGUgPSAoaGVhZGVyID4+IDYpICYgMHgzOworICBjaGFubmVscyA9IChtb2RlID09IDMpID8gMSA6IDI7CisKKyAgc3dpdGNoIChsYXllcikgeworICAgIGNhc2UgMToKKyAgICAgIGxlbmd0aCA9IDQgKiAoKGJpdHJhdGUgKiAxMikgLyBzYW1wbGVyYXRlICsgcGFkZGluZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBsZW5ndGggPSAoYml0cmF0ZSAqIDE0NCkgLyBzYW1wbGVyYXRlICsgcGFkZGluZzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgY2FzZSAzOgorICAgICAgbGVuZ3RoID0gKGJpdHJhdGUgKiAxNDQpIC8gKHNhbXBsZXJhdGUgPDwgbHNmKSArIHBhZGRpbmc7CisgICAgICBicmVhazsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGxhbWUsICJDYWxjdWxhdGVkIG1wMyBmcmFtZSBsZW5ndGggb2YgJXUgYnl0ZXMiLCBsZW5ndGgpOworICBHU1RfREVCVUdfT0JKRUNUIChsYW1lLCAic2FtcGxlcmF0ZSA9ICVsdSwgYml0cmF0ZSA9ICVsdSwgdmVyc2lvbiA9ICVsdSwgIgorICAgICAgImxheWVyID0gJWx1LCBjaGFubmVscyA9ICVsdSIsIHNhbXBsZXJhdGUsIGJpdHJhdGUsIHZlcnNpb24sCisgICAgICBsYXllciwgY2hhbm5lbHMpOworCisgIGlmIChwdXRfdmVyc2lvbikKKyAgICAqcHV0X3ZlcnNpb24gPSB2ZXJzaW9uOworICBpZiAocHV0X2xheWVyKQorICAgICpwdXRfbGF5ZXIgPSBsYXllcjsKKyAgaWYgKHB1dF9jaGFubmVscykKKyAgICAqcHV0X2NoYW5uZWxzID0gY2hhbm5lbHM7CisgIGlmIChwdXRfYml0cmF0ZSkKKyAgICAqcHV0X2JpdHJhdGUgPSBiaXRyYXRlOworICBpZiAocHV0X3NhbXBsZXJhdGUpCisgICAgKnB1dF9zYW1wbGVyYXRlID0gc2FtcGxlcmF0ZTsKKyAgaWYgKHB1dF9tb2RlKQorICAgICpwdXRfbW9kZSA9IG1vZGU7CisgIGlmIChwdXRfY3JjKQorICAgICpwdXRfY3JjID0gY3JjOworCisgIHJldHVybiBsZW5ndGg7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorbXAzX3N5bmNfY2hlY2sgKEdzdExhbWVNUDNFbmMgKiBsYW1lLCB1bnNpZ25lZCBsb25nIGhlYWQpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGxhbWUsICJjaGVja2luZyBtcDMgaGVhZGVyIDB4JTA4bHgiLCBoZWFkKTsKKyAgLyogaWYgaXQncyBub3QgYSB2YWxpZCBzeW5jICovCisgIGlmICgoaGVhZCAmIDB4ZmZlMDAwMDApICE9IDB4ZmZlMDAwMDApIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGxhbWUsICJpbnZhbGlkIHN5bmMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgLyogaWYgaXQncyBhbiBpbnZhbGlkIE1QRUcgdmVyc2lvbiAqLworICBpZiAoKChoZWFkID4+IDE5KSAmIDMpID09IDB4MSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobGFtZSwgImludmFsaWQgTVBFRyB2ZXJzaW9uOiAweCVseCIsIChoZWFkID4+IDE5KSAmIDMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICAvKiBpZiBpdCdzIGFuIGludmFsaWQgbGF5ZXIgKi8KKyAgaWYgKCEoKGhlYWQgPj4gMTcpICYgMykpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGxhbWUsICJpbnZhbGlkIGxheWVyOiAweCVseCIsIChoZWFkID4+IDE3KSAmIDMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICAvKiBpZiBpdCdzIGFuIGludmFsaWQgYml0cmF0ZSAqLworICBpZiAoKChoZWFkID4+IDEyKSAmIDB4ZikgPT0gMHgwKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChsYW1lLCAiaW52YWxpZCBiaXRyYXRlOiAweCVseC4iCisgICAgICAgICJGcmVlIGZvcm1hdCBmaWxlcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQiLCAoaGVhZCA+PiAxMikgJiAweGYpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoKChoZWFkID4+IDEyKSAmIDB4ZikgPT0gMHhmKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChsYW1lLCAiaW52YWxpZCBiaXRyYXRlOiAweCVseCIsIChoZWFkID4+IDEyKSAmIDB4Zik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIC8qIGlmIGl0J3MgYW4gaW52YWxpZCBzYW1wbGVyYXRlICovCisgIGlmICgoKGhlYWQgPj4gMTApICYgMHgzKSA9PSAweDMpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGxhbWUsICJpbnZhbGlkIHNhbXBsZXJhdGU6IDB4JWx4IiwgKGhlYWQgPj4gMTApICYgMHgzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoKGhlYWQgJiAweDMpID09IDB4MikgeworICAgIC8qIElnbm9yZSB0aGlzIGFzIHRoZXJlIGFyZSBzb21lIGZpbGVzIHdpdGggZW1waGFzaXMgMHgyIHRoYXQgY2FuCisgICAgICogYmUgcGxheWVkIGZpbmUuIFNlZSBCR08gIzUzNzIzNSAqLworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobGFtZSwgImludmFsaWQgZW1waGFzaXM6IDB4JWx4IiwgaGVhZCAmIDB4Myk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyogKioqKiBlbmQgbXBlZ2F1ZGlvcGFyc2UgKioqKiAqLworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2xhbWVtcDNlbmNfZmluaXNoX2ZyYW1lcyAoR3N0TGFtZU1QM0VuYyAqIGxhbWUpCit7CisgIGdpbnQgYXY7CisgIGd1aW50IGhlYWRlcjsKKyAgR3N0Rmxvd1JldHVybiByZXN1bHQgPSBHU1RfRkxPV19PSzsKKworICAvKiBsaW1pdGVkIHBhcnNpbmcsIHdlIGRvbid0IGV4cGVjdCB0byBsb3NlIHN5bmMgaGVyZSAqLworICB3aGlsZSAoKHJlc3VsdCA9PSBHU1RfRkxPV19PSykgJiYKKyAgICAgICgoYXYgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGxhbWUtPmFkYXB0ZXIpKSA+IDQpKSB7CisgICAgZ3VpbnQgcmF0ZSwgdmVyc2lvbiwgbGF5ZXIsIHNpemU7CisgICAgR3N0QnVmZmVyICptcDNfYnVmOworICAgIGNvbnN0IGd1aW50OCAqZGF0YTsKKyAgICBndWludCBzYW1wbGVzX3Blcl9mcmFtZTsKKworICAgIGRhdGEgPSBnc3RfYWRhcHRlcl9tYXAgKGxhbWUtPmFkYXB0ZXIsIDQpOworICAgIGhlYWRlciA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoZGF0YSk7CisgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKGxhbWUtPmFkYXB0ZXIpOworCisgICAgaWYgKCFtcDNfc3luY19jaGVjayAobGFtZSwgaGVhZGVyKSkKKyAgICAgIGdvdG8gaW52YWxpZF9oZWFkZXI7CisKKyAgICBzaXplID0gbXAzX3R5cGVfZnJhbWVfbGVuZ3RoX2Zyb21faGVhZGVyIChsYW1lLCBoZWFkZXIsICZ2ZXJzaW9uLCAmbGF5ZXIsCisgICAgICAgIE5VTEwsIE5VTEwsICZyYXRlLCBOVUxMLCBOVUxMKTsKKworICAgIGlmIChHX1VOTElLRUxZIChsYXllciAhPSAzIHx8IHJhdGUgIT0gbGFtZS0+b3V0X3NhbXBsZXJhdGUpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChsYW1lLAorICAgICAgICAgICJ1bmV4cGVjdGVkIG1wMyBoZWFkZXIgd2l0aCByYXRlICV1LCB2ZXJzaW9uICV1LCBsYXllciAldSIsCisgICAgICAgICAgcmF0ZSwgdmVyc2lvbiwgbGF5ZXIpOworICAgICAgZ290byBpbnZhbGlkX2hlYWRlcjsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSA+IGF2KSB7CisgICAgICAvKiBwcmV0dHkgbGlrZWx5IHRvIG9jY3VyIHdoZW4gbGFtZSBpcyBob2xkaW5nIGJhY2sgb24gdXMgKi8KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChsYW1lLCAiZnJhbWUgc2l6ZSAldSAoPiAlZCkiLCBzaXplLCBhdik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBBY2NvdW50IGZvciB0aGUgaW50ZXJuYWwgcmVzYW1wbGluZywgZmluaXNoIGZyYW1lIHJlYWxseSB3YW50cyB0bworICAgICAqIGtub3cgYWJvdXQgdGhlIG51bWJlciBvZiBpbmNvbWluZyBzYW1wbGVzCisgICAgICovCisgICAgc2FtcGxlc19wZXJfZnJhbWUgPSAodmVyc2lvbiA9PSAxKSA/IDExNTIgOiA1NzY7CisgICAgc2FtcGxlc19wZXJfZnJhbWUgKj0gbGFtZS0+c2FtcGxlcmF0ZTsKKyAgICBzYW1wbGVzX3Blcl9mcmFtZSAvPSBsYW1lLT5vdXRfc2FtcGxlcmF0ZTsKKworICAgIC8qIHNob3VsZCBiZSBvayBub3cgKi8KKyAgICBtcDNfYnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKGxhbWUtPmFkYXB0ZXIsIHNpemUpOworICAgIC8qIG51bWJlciBvZiBzYW1wbGVzIGZvciBNUEVHLTEsIGxheWVyIDMgKi8KKyAgICByZXN1bHQgPSBnc3RfYXVkaW9fZW5jb2Rlcl9maW5pc2hfZnJhbWUgKEdTVF9BVURJT19FTkNPREVSIChsYW1lKSwKKyAgICAgICAgbXAzX2J1Ziwgc2FtcGxlc19wZXJfZnJhbWUpOworICB9CisKK2V4aXQ6CisgIHJldHVybiByZXN1bHQ7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX2hlYWRlcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChsYW1lLCBTVFJFQU0sIEVOQ09ERSwKKyAgICAgICAgKCJpbnZhbGlkIGxhbWUgbXAzIHN5bmMgaGVhZGVyICUwOFgiLCBoZWFkZXIpLCAoTlVMTCkpOworICAgIHJlc3VsdCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZXhpdDsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2xhbWVtcDNlbmNfZmx1c2hfZnVsbCAoR3N0TGFtZU1QM0VuYyAqIGxhbWUsIGdib29sZWFuIHB1c2gpCit7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2ludCBzaXplOworICBHc3RGbG93UmV0dXJuIHJlc3VsdCA9IEdTVF9GTE9XX09LOworICBnaW50IGF2OworCisgIGlmICghbGFtZS0+bGdmKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICBidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDcyMDApOworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgc2l6ZSA9IGxhbWVfZW5jb2RlX2ZsdXNoIChsYW1lLT5sZ2YsIG1hcC5kYXRhLCA3MjAwKTsKKworICBpZiAoc2l6ZSA+IDApIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIGdzdF9idWZmZXJfcmVzaXplIChidWYsIDAsIHNpemUpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGxhbWUsICJjb2xsZWN0aW5nIGZpbmFsICVkIGJ5dGVzIiwgc2l6ZSk7CisgICAgZ3N0X2FkYXB0ZXJfcHVzaCAobGFtZS0+YWRhcHRlciwgYnVmKTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGxhbWUsICJubyBmaW5hbCBwYWNrZXQgKHNpemU9JWQsIHB1c2g9JWQpIiwgc2l6ZSwgcHVzaCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXN1bHQgPSBHU1RfRkxPV19PSzsKKyAgfQorCisgIGlmIChwdXNoKSB7CisgICAgcmVzdWx0ID0gZ3N0X2xhbWVtcDNlbmNfZmluaXNoX2ZyYW1lcyAobGFtZSk7CisgIH0gZWxzZSB7CisgICAgLyogbmV2ZXIgbWluZCAqLworICAgIGdzdF9hZGFwdGVyX2NsZWFyIChsYW1lLT5hZGFwdGVyKTsKKyAgfQorCisgIC8qIGVpdGhlciB3YXksIHdlIGV4cGVjdCBub3RoaW5nIGxlZnQgKi8KKyAgaWYgKChhdiA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAobGFtZS0+YWRhcHRlcikpKSB7CisgICAgLyogc2hvdWxkIHRoaXMgYmUgbW9yZSBmYXRhbCA/PyAqLworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobGFtZSwgInVucGFyc2VkICVkIGJ5dGVzIGxlZnQgYWZ0ZXIgZmx1c2hpbmciLCBhdik7CisgICAgLyogY2xlYW4gdXAgYW55d2F5ICovCisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGxhbWUtPmFkYXB0ZXIpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9sYW1lbXAzZW5jX2ZsdXNoIChHc3RBdWRpb0VuY29kZXIgKiBlbmMpCit7CisgIGdzdF9sYW1lbXAzZW5jX2ZsdXNoX2Z1bGwgKEdTVF9MQU1FTVAzRU5DIChlbmMpLCBGQUxTRSk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbGFtZW1wM2VuY19oYW5kbGVfZnJhbWUgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYywgR3N0QnVmZmVyICogaW5fYnVmKQoreworICBHc3RMYW1lTVAzRW5jICpsYW1lOworICBnaW50IG1wM19idWZmZXJfc2l6ZSwgbXAzX3NpemU7CisgIEdzdEJ1ZmZlciAqbXAzX2J1ZjsKKyAgR3N0Rmxvd1JldHVybiByZXN1bHQ7CisgIGdpbnQgbnVtX3NhbXBsZXM7CisgIEdzdE1hcEluZm8gaW5fbWFwLCBtcDNfbWFwOworCisgIGxhbWUgPSBHU1RfTEFNRU1QM0VOQyAoZW5jKTsKKworICAvKiBzcXVlZXplIHJlbWFpbmluZyBhbmQgcHVzaCAqLworICBpZiAoR19VTkxJS0VMWSAoaW5fYnVmID09IE5VTEwpKQorICAgIHJldHVybiBnc3RfbGFtZW1wM2VuY19mbHVzaF9mdWxsIChsYW1lLCBUUlVFKTsKKworICBnc3RfYnVmZmVyX21hcCAoaW5fYnVmLCAmaW5fbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIG51bV9zYW1wbGVzID0gaW5fbWFwLnNpemUgLyAyOworCisgIC8qIGFsbG9jYXRlIHNwYWNlIGZvciBvdXRwdXQgKi8KKyAgbXAzX2J1ZmZlcl9zaXplID0gMS4yNSAqIG51bV9zYW1wbGVzICsgNzIwMDsKKyAgbXAzX2J1ZiA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCBtcDNfYnVmZmVyX3NpemUsIE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAobXAzX2J1ZiwgJm1wM19tYXAsIEdTVF9NQVBfV1JJVEUpOworCisgIC8qIGxhbWUgc2VlbXMgdG8gYmUgdG9vIHN0dXBpZCB0byBnZXQgbW9ubyBpbnRlcmxlYXZlZCBnb2luZyAqLworICBpZiAobGFtZS0+bnVtX2NoYW5uZWxzID09IDEpIHsKKyAgICBtcDNfc2l6ZSA9IGxhbWVfZW5jb2RlX2J1ZmZlciAobGFtZS0+bGdmLAorICAgICAgICAoc2hvcnQgaW50ICopIGluX21hcC5kYXRhLAorICAgICAgICAoc2hvcnQgaW50ICopIGluX21hcC5kYXRhLCBudW1fc2FtcGxlcywgbXAzX21hcC5kYXRhLCBtcDNfYnVmZmVyX3NpemUpOworICB9IGVsc2UgeworICAgIG1wM19zaXplID0gbGFtZV9lbmNvZGVfYnVmZmVyX2ludGVybGVhdmVkIChsYW1lLT5sZ2YsCisgICAgICAgIChzaG9ydCBpbnQgKikgaW5fbWFwLmRhdGEsCisgICAgICAgIG51bV9zYW1wbGVzIC8gbGFtZS0+bnVtX2NoYW5uZWxzLCBtcDNfbWFwLmRhdGEsIG1wM19idWZmZXJfc2l6ZSk7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5fYnVmLCAmaW5fbWFwKTsKKworICBHU1RfTE9HX09CSkVDVCAobGFtZSwgImVuY29kZWQgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyBvZiBhdWRpbyAiCisgICAgICAidG8gJWQgYnl0ZXMgb2YgbXAzIiwgaW5fbWFwLnNpemUsIG1wM19zaXplKTsKKworICBpZiAoR19MSUtFTFkgKG1wM19zaXplID4gMCkpIHsKKyAgICAvKiB1bmZvcnR1bmF0ZWx5IGxhbWUgZG9lcyBub3QgcHJvdmlkZSBmcmFtZSBkZWxpbmVhdGVkIG91dHB1dCwKKyAgICAgKiBzbyBjb2xsZWN0IG91dHB1dCBhbmQgcGFyc2UgaW50byBmcmFtZXMgLi4uICovCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAobXAzX2J1ZiwgJm1wM19tYXApOworICAgIGdzdF9idWZmZXJfcmVzaXplIChtcDNfYnVmLCAwLCBtcDNfc2l6ZSk7CisgICAgZ3N0X2FkYXB0ZXJfcHVzaCAobGFtZS0+YWRhcHRlciwgbXAzX2J1Zik7CisgICAgcmVzdWx0ID0gZ3N0X2xhbWVtcDNlbmNfZmluaXNoX2ZyYW1lcyAobGFtZSk7CisgIH0gZWxzZSB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAobXAzX2J1ZiwgJm1wM19tYXApOworICAgIGlmIChtcDNfc2l6ZSA8IDApIHsKKyAgICAgIC8qIGVhdCBlcnJvciA/ICovCisgICAgICBnX3dhcm5pbmcgKCJlcnJvciAlZCIsIG1wM19zaXplKTsKKyAgICB9CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAobXAzX2J1Zik7CisgICAgcmVzdWx0ID0gR1NUX0ZMT1dfT0s7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBzZXQgdXAgdGhlIGVuY29kZXIgc3RhdGUgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2xhbWVtcDNlbmNfc2V0dXAgKEdzdExhbWVNUDNFbmMgKiBsYW1lLCBHc3RUYWdMaXN0ICoqIHRhZ3MpCit7CisgIGdib29sZWFuIHJlczsKKworI2RlZmluZSBDSEVDS19FUlJPUihjb21tYW5kKSBHX1NUTVRfU1RBUlQge1wKKyAgaWYgKChjb21tYW5kKSA8IDApIHsgXAorICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGxhbWUsICJzZXR1cCBmYWlsZWQ6ICIgR19TVFJJTkdJRlkgKGNvbW1hbmQpKTsgXAorICAgIGlmICgqdGFncykgeyBcCisgICAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKCp0YWdzKTsgXAorICAgICAgKnRhZ3MgPSBOVUxMOyBcCisgICAgfSBcCisgICAgcmV0dXJuIEZBTFNFOyBcCisgIH0gXAorfUdfU1RNVF9FTkQKKworICBpbnQgcmV0dmFsOworICBHc3RDYXBzICphbGxvd2VkX2NhcHM7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAobGFtZSwgInN0YXJ0aW5nIHNldHVwIik7CisKKyAgbGFtZS0+bGdmID0gbGFtZV9pbml0ICgpOworCisgIGlmIChsYW1lLT5sZ2YgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgKnRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgIC8qIGNvcHkgdGhlIHBhcmFtZXRlcnMgb3ZlciAqLworICBsYW1lX3NldF9pbl9zYW1wbGVyYXRlIChsYW1lLT5sZ2YsIGxhbWUtPnNhbXBsZXJhdGUpOworCisgIC8qIGxldCBsYW1lIGNob29zZSBkZWZhdWx0IHNhbXBsZXJhdGUgdW5sZXNzIG91dGdvaW5nIHNhbXBsZSByYXRlIGlzIGZpeGVkICovCisgIGFsbG93ZWRfY2FwcyA9IGdzdF9wYWRfZ2V0X2FsbG93ZWRfY2FwcyAoR1NUX0FVRElPX0VOQ09ERVJfU1JDX1BBRCAobGFtZSkpOworCisgIGlmIChhbGxvd2VkX2NhcHMgIT0gTlVMTCkgeworICAgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICAgIGdpbnQgc2FtcGxlcmF0ZTsKKworICAgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGFsbG93ZWRfY2FwcywgMCk7CisKKyAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJyYXRlIiwgJnNhbXBsZXJhdGUpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChsYW1lLCAiU2V0dGluZyBzYW1wbGUgcmF0ZSB0byAlZCBhcyBmaXhlZCBpbiBzcmMgY2FwcyIsCisgICAgICAgICAgc2FtcGxlcmF0ZSk7CisgICAgICBsYW1lX3NldF9vdXRfc2FtcGxlcmF0ZSAobGFtZS0+bGdmLCBzYW1wbGVyYXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAobGFtZSwgIkxldHRpbmcgbGFtZSBjaG9vc2Ugc2FtcGxlIHJhdGUiKTsKKyAgICAgIGxhbWVfc2V0X291dF9zYW1wbGVyYXRlIChsYW1lLT5sZ2YsIDApOworICAgIH0KKyAgICBnc3RfY2Fwc191bnJlZiAoYWxsb3dlZF9jYXBzKTsKKyAgICBhbGxvd2VkX2NhcHMgPSBOVUxMOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGxhbWUsICJObyBwZWVyIHlldCwgbGV0dGluZyBsYW1lIGNob29zZSBzYW1wbGUgcmF0ZSIpOworICAgIGxhbWVfc2V0X291dF9zYW1wbGVyYXRlIChsYW1lLT5sZ2YsIDApOworICB9CisKKyAgQ0hFQ0tfRVJST1IgKGxhbWVfc2V0X251bV9jaGFubmVscyAobGFtZS0+bGdmLCBsYW1lLT5udW1fY2hhbm5lbHMpKTsKKyAgQ0hFQ0tfRVJST1IgKGxhbWVfc2V0X2JXcml0ZVZiclRhZyAobGFtZS0+bGdmLCAwKSk7CisKKyAgaWYgKGxhbWUtPnRhcmdldCA9PSBMQU1FTVAzRU5DX1RBUkdFVF9RVUFMSVRZKSB7CisgICAgQ0hFQ0tfRVJST1IgKGxhbWVfc2V0X1ZCUiAobGFtZS0+bGdmLCB2YnJfZGVmYXVsdCkpOworICAgIENIRUNLX0VSUk9SIChsYW1lX3NldF9WQlJfcXVhbGl0eSAobGFtZS0+bGdmLCBsYW1lLT5xdWFsaXR5KSk7CisgIH0gZWxzZSB7CisgICAgaWYgKGxhbWUtPmNicikgeworICAgICAgQ0hFQ0tfQU5EX0ZJWFVQX0JJVFJBVEUgKGxhbWUsICJiaXRyYXRlIiwgbGFtZS0+Yml0cmF0ZSk7CisgICAgICBDSEVDS19FUlJPUiAobGFtZV9zZXRfVkJSIChsYW1lLT5sZ2YsIHZicl9vZmYpKTsKKyAgICAgIENIRUNLX0VSUk9SIChsYW1lX3NldF9icmF0ZSAobGFtZS0+bGdmLCBsYW1lLT5iaXRyYXRlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENIRUNLX0VSUk9SIChsYW1lX3NldF9WQlIgKGxhbWUtPmxnZiwgdmJyX2FicikpOworICAgICAgQ0hFQ0tfRVJST1IgKGxhbWVfc2V0X1ZCUl9tZWFuX2JpdHJhdGVfa2JwcyAobGFtZS0+bGdmLCBsYW1lLT5iaXRyYXRlKSk7CisgICAgfQorICAgIGdzdF90YWdfbGlzdF9hZGQgKCp0YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIEdTVF9UQUdfQklUUkFURSwKKyAgICAgICAgbGFtZS0+Yml0cmF0ZSAqIDEwMDAsIE5VTEwpOworICB9CisKKyAgaWYgKGxhbWUtPmVuY29kaW5nX2VuZ2luZV9xdWFsaXR5ID09IExBTUVNUDNFTkNfRU5DT0RJTkdfRU5HSU5FX1FVQUxJVFlfRkFTVCkKKyAgICBDSEVDS19FUlJPUiAobGFtZV9zZXRfcXVhbGl0eSAobGFtZS0+bGdmLCA3KSk7CisgIGVsc2UgaWYgKGxhbWUtPmVuY29kaW5nX2VuZ2luZV9xdWFsaXR5ID09CisgICAgICBMQU1FTVAzRU5DX0VOQ09ESU5HX0VOR0lORV9RVUFMSVRZX0hJR0gpCisgICAgQ0hFQ0tfRVJST1IgKGxhbWVfc2V0X3F1YWxpdHkgKGxhbWUtPmxnZiwgMikpOworICAvKiBlbHNlIGRlZmF1bHQgKi8KKworICBpZiAobGFtZS0+bW9ubykKKyAgICBDSEVDS19FUlJPUiAobGFtZV9zZXRfbW9kZSAobGFtZS0+bGdmLCBNT05PKSk7CisKKyAgLyogaW5pdGlhbGl6ZSB0aGUgbGFtZSBlbmNvZGVyICovCisgIGlmICgocmV0dmFsID0gbGFtZV9pbml0X3BhcmFtcyAobGFtZS0+bGdmKSkgPj0gMCkgeworICAgIC8qIEZJWE1FOiBpdCB3b3VsZCBiZSBuaWNlIHRvIHByaW50IG91dCB0aGUgbW9kZSBoZXJlICovCisgICAgR1NUX0lORk8KKyAgICAgICAgKCJsYW1lIGVuY29kZXIgc2V0dXAgKHRhcmdldCAlcywgcXVhbGl0eSAlZiwgYml0cmF0ZSAlZCwgJWQgSHosICVkIGNoYW5uZWxzKSIsCisgICAgICAgIChsYW1lLT50YXJnZXQgPT0gTEFNRU1QM0VOQ19UQVJHRVRfUVVBTElUWSkgPyAicXVhbGl0eSIgOiAiYml0cmF0ZSIsCisgICAgICAgIGxhbWUtPnF1YWxpdHksIGxhbWUtPmJpdHJhdGUsIGxhbWUtPnNhbXBsZXJhdGUsIGxhbWUtPm51bV9jaGFubmVscyk7CisgICAgcmVzID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChsYW1lLCAibGFtZV9pbml0X3BhcmFtcyByZXR1cm5lZCAlZCIsIHJldHZhbCk7CisgICAgcmVzID0gRkFMU0U7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChsYW1lLCAiZG9uZSB3aXRoIHNldHVwIik7CisgIHJldHVybiByZXM7CisjdW5kZWYgQ0hFQ0tfRVJST1IKK30KKworZ2Jvb2xlYW4KK2dzdF9sYW1lbXAzZW5jX3JlZ2lzdGVyIChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChkZWJ1ZywgImxhbWVtcDNlbmMiLCAwLCAibGFtZSBtcDMgZW5jb2RlciIpOworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImxhbWVtcDNlbmMiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIEdTVF9UWVBFX0xBTUVNUDNFTkMpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2V4dC9sYW1lL2dzdGxhbWVtcDNlbmMuaCBiL2V4dC9sYW1lL2dzdGxhbWVtcDNlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWRiYzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2xhbWUvZ3N0bGFtZW1wM2VuYy5oCkBAIC0wLDAgKzEsODMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9MQU1FTVAzRU5DX0hfXworI2RlZmluZSBfX0dTVF9MQU1FTVAzRU5DX0hfXworCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZW5jb2Rlci5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjaW5jbHVkZSA8bGFtZS9sYW1lLmg+CisKKyNkZWZpbmUgR1NUX1RZUEVfTEFNRU1QM0VOQyBcCisgIChnc3RfbGFtZW1wM2VuY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfTEFNRU1QM0VOQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0xBTUVNUDNFTkMsR3N0TGFtZU1QM0VuYykpCisjZGVmaW5lIEdTVF9MQU1FTVAzRU5DX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0xBTUVNUDNFTkMsR3N0TGFtZU1QM0VuY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0xBTUVNUDNFTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9MQU1FTVAzRU5DKSkKKyNkZWZpbmUgR1NUX0lTX0xBTUVNUDNFTkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfTEFNRU1QM0VOQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RMYW1lTVAzRW5jIEdzdExhbWVNUDNFbmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0TGFtZU1QM0VuY0NsYXNzIEdzdExhbWVNUDNFbmNDbGFzczsKKworLyoqCisgKiBHc3RMYW1lTVAzRW5jOgorICoKKyAqIE9wYXF1ZSBkYXRhIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IF9Hc3RMYW1lTVAzRW5jIHsKKyAgR3N0QXVkaW9FbmNvZGVyIGVsZW1lbnQ7CisKKyAgLyo8IHByaXZhdGUgPiovCisgIGdpbnQgc2FtcGxlcmF0ZTsKKyAgZ2ludCBvdXRfc2FtcGxlcmF0ZTsKKyAgZ2ludCBudW1fY2hhbm5lbHM7CisKKyAgLyogcHJvcGVydGllcyAqLworICBnaW50IHRhcmdldDsKKyAgZ2ludCBiaXRyYXRlOworICBnYm9vbGVhbiBjYnI7CisgIGdmbG9hdCBxdWFsaXR5OworICBnaW50IGVuY29kaW5nX2VuZ2luZV9xdWFsaXR5OworICBnYm9vbGVhbiBtb25vOworCisgIGxhbWVfZ2xvYmFsX2ZsYWdzICpsZ2Y7CisKKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKK307CisKK3N0cnVjdCBfR3N0TGFtZU1QM0VuY0NsYXNzIHsKKyAgR3N0QXVkaW9FbmNvZGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2xhbWVtcDNlbmNfZ2V0X3R5cGUodm9pZCk7CitnYm9vbGVhbiBnc3RfbGFtZW1wM2VuY19yZWdpc3RlciAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0xBTUVNUDNFTkNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvbGFtZS9tZXNvbi5idWlsZCBiL2V4dC9sYW1lL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZTYxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbGFtZS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDE5IEBACitsYW1lX2RlcCA9IGNjLmZpbmRfbGlicmFyeSgnbXAzbGFtZScsIHJlcXVpcmVkIDogZmFsc2UpCisKK2lmIGxhbWVfZGVwLmZvdW5kKCkgYW5kIGNjLmhhc19oZWFkZXJfc3ltYm9sKCdsYW1lL2xhbWUuaCcsICdsYW1lX2luaXQnKQorICBsYW1lX2V4dHJhX2NfYXJncyA9IFtdCisgIGlmIGNjLmhhc19oZWFkZXJfc3ltYm9sKCdsYW1lL2xhbWUuaCcsICdsYW1lX3NldF9WQlJfcXVhbGl0eScpCisgICAgbGFtZV9leHRyYV9jX2FyZ3MgKz0gWyctREhBVkVfTEFNRV9TRVRfVkJSX1FVQUxJVFknXQorICBlbmRpZgorICBpZiBjYy5oYXNfaGVhZGVyX3N5bWJvbCgnbGFtZS9sYW1lLmgnLCAnTUVESVVNJykKKyAgICBsYW1lX2V4dHJhX2NfYXJncyArPSBbJy1ER1NUTEFNRV9QUkVTRVQnXQorICBlbmRpZgorICBsYW1lID0gbGlicmFyeSgnZ3N0bGFtZScsCisgICAgWydnc3RsYW1lbXAzZW5jLmMnLCAncGx1Z2luLmMnXSwKKyAgICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MgKyBsYW1lX2V4dHJhX2NfYXJncywKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luYywgbGlic2luY10sCisgICAgZGVwZW5kZW5jaWVzIDogW2dzdGF1ZGlvX2RlcCwgbGFtZV9kZXBdLAorICAgIGluc3RhbGwgOiB0cnVlLAorICAgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKyAgKQorZW5kaWYKZGlmZiAtLWdpdCBhL2V4dC9sYW1lL3BsdWdpbi5jIGIvZXh0L2xhbWUvcGx1Z2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhZTIxZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9sYW1lL3BsdWdpbi5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKworI2luY2x1ZGUgImdzdGxhbWVtcDNlbmMuaCIKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworI2lmZGVmIEVOQUJMRV9OTFMKKyAgYmluZHRleHRkb21haW4gKEdFVFRFWFRfUEFDS0FHRSwgTE9DQUxFRElSKTsKKyAgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKEdFVFRFWFRfUEFDS0FHRSwgIlVURi04Iik7CisjZW5kaWYgLyogRU5BQkxFX05MUyAqLworCisgIHJldHVybiBnc3RfbGFtZW1wM2VuY19yZWdpc3RlciAocGx1Z2luKTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGxhbWUsCisgICAgIkVuY29kZSBNUDNzIHdpdGggTEFNRSIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKTsKZGlmZiAtLWdpdCBhL2V4dC9saWJjYWNhL01ha2VmaWxlLmFtIGIvZXh0L2xpYmNhY2EvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzNzFlMwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9saWJjYWNhL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTcgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdGNhY2FzaW5rLmxhCisKK2xpYmdzdGNhY2FzaW5rX2xhX1NPVVJDRVMgPSBnc3RjYWNhc2luay5jCitsaWJnc3RjYWNhc2lua19sYV9DRkxBR1MgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgXAorCSQoR1NUX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQ0ZMQUdTKSBcCisJJChMSUJDQUNBX0NGTEFHUykKK2xpYmdzdGNhY2FzaW5rX2xhX0xJQkFERCA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgXAorCS1sZ3N0dmlkZW8tJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkkKEdTVF9CQVNFX0xJQlMpIFwKKwkkKEdTVF9MSUJTKSBcCisJJChMSUJDQUNBX0xJQlMpCitsaWJnc3RjYWNhc2lua19sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gZ3N0Y2FjYXNpbmsuaApkaWZmIC0tZ2l0IGEvZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYyBiL2V4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBmYjUyYQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmMKQEAgLTAsMCArMSw0MTkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtY2FjYXNpbmsKKyAqIEBzZWVfYWxzbzogI0dzdEFBU2luaworICoKKyAqIERpc3BsYXlzIHZpZGVvIGFzIGNvbG9yIGFzY2lpIGFydC4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogQ0FDQV9HRU9NRVRSWT0xNjB4NjAgQ0FDQV9GT05UPTV4NyBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPXRlc3QuYXZpICEgZGVjb2RlYmluICEgdmlkZW9jb252ZXJ0ICEgY2FjYXNpbmsKKyAqIF18IFRoaXMgcGlwZWxpbmUgcmVuZGVycyBhIHZpZGVvIHRvIGFzY2lpIGFydCBpbnRvIGEgc2VwYXJhdGUgd2luZG93IHVzaW5nIGEKKyAqIHNtYWxsIGZvbnQgYW5kIHNwZWNpZnlpbmcgdGhlIGFzY2lpIHJlc29sdXRpb24uCisgKiB8WworICogQ0FDQV9EUklWRVI9bmN1cnNlcyBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPXRlc3QuYXZpICEgZGVjb2RlYmluICEgdmlkZW9jb252ZXJ0ICEgY2FjYXNpbmsKKyAqIF18IFRoaXMgcGlwZWxpbmUgcmVuZGVycyBhIHZpZGVvIHRvIGFzY2lpIGFydCBpbnRvIHRoZSBjdXJyZW50IHRlcm1pbmFsLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnc3RjYWNhc2luay5oIgorCisKKy8vI2RlZmluZSBHU1RfQ0FDQV9ERUZBVUxUX1JFRF9NQVNLIFJfTUFTS18zMl9SRVZFUlNFX0lOVAorLy8jZGVmaW5lIEdTVF9DQUNBX0RFRkFVTFRfR1JFRU5fTUFTSyBHX01BU0tfMzJfUkVWRVJTRV9JTlQKKy8vI2RlZmluZSBHU1RfQ0FDQV9ERUZBVUxUX0JMVUVfTUFTSyBCX01BU0tfMzJfUkVWRVJTRV9JTlQKKworLyogY2FjYXNpbmsgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICBMQVNUX1NJR05BTAorfTsKKworI2RlZmluZSBHU1RfQ0FDQV9ERUZBVUxUX1NDUkVFTl9XSURUSCA4MAorI2RlZmluZSBHU1RfQ0FDQV9ERUZBVUxUX1NDUkVFTl9IRUlHSFQgMjUKKyNkZWZpbmUgR1NUX0NBQ0FfREVGQVVMVF9ESVRIRVIgQ0FDQV9ESVRIRVJJTkdfTk9ORQorI2RlZmluZSBHU1RfQ0FDQV9ERUZBVUxUX0FOVElBTElBU0lORyBUUlVFCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX1NDUkVFTl9XSURUSCwKKyAgUFJPUF9TQ1JFRU5fSEVJR0hULAorICBQUk9QX0RJVEhFUiwKKyAgUFJPUF9BTlRJQUxJQVNJTkcKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFCisgICAgICAgICgieyBSR0IsIEJHUiwgUkdCeCwgeFJHQiwgQkdSeCwgeEJHUiwgUkdCMTYsIFJHQjE1IH0iKSkKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2NhY2FzaW5rX3NldGNhcHMgKEdzdEJhc2VTaW5rICogcGFkLCBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgdm9pZCBnc3RfY2FjYXNpbmtfZ2V0X3RpbWVzIChHc3RCYXNlU2luayAqIHNpbmssIEdzdEJ1ZmZlciAqIGJ1ZmZlciwKKyAgICBHc3RDbG9ja1RpbWUgKiBzdGFydCwgR3N0Q2xvY2tUaW1lICogZW5kKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9jYWNhc2lua19yZW5kZXIgKEdzdEJhc2VTaW5rICogYmFzZXNpbmssCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKKworc3RhdGljIHZvaWQgZ3N0X2NhY2FzaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9jYWNhc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfY2FjYXNpbmtfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworI2RlZmluZSBnc3RfY2FjYXNpbmtfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0Q0FDQVNpbmssIGdzdF9jYWNhc2luaywgR1NUX1RZUEVfQkFTRV9TSU5LKTsKKworI2RlZmluZSBHU1RfVFlQRV9DQUNBRElUSEVSIChnc3RfY2FjYXNpbmtfZGl0aGVyX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9jYWNhc2lua19kaXRoZXJfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBkaXRoZXJfdHlwZSA9IDA7CisKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgZGl0aGVyX3R5cGVzW10gPSB7CisgICAge0NBQ0FfRElUSEVSSU5HX05PTkUsICJObyBkaXRoZXJpbmciLCAibm9uZSJ9LAorICAgIHtDQUNBX0RJVEhFUklOR19PUkRFUkVEMiwgIk9yZGVyZWQgMngyIEJheWVyIGRpdGhlcmluZyIsICIyeDIifSwKKyAgICB7Q0FDQV9ESVRIRVJJTkdfT1JERVJFRDQsICJPcmRlcmVkIDR4NCBCYXllciBkaXRoZXJpbmciLCAiNHg0In0sCisgICAge0NBQ0FfRElUSEVSSU5HX09SREVSRUQ4LCAiT3JkZXJlZCA4eDggQmF5ZXIgZGl0aGVyaW5nIiwgIjh4OCJ9LAorICAgIHtDQUNBX0RJVEhFUklOR19SQU5ET00sICJSYW5kb20gZGl0aGVyaW5nIiwgInJhbmRvbSJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIWRpdGhlcl90eXBlKSB7CisgICAgZGl0aGVyX3R5cGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0Q0FDQVNpbmtEaXRoZXJpbmciLCBkaXRoZXJfdHlwZXMpOworICB9CisgIHJldHVybiBkaXRoZXJfdHlwZTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9jYWNhc2lua19jbGFzc19pbml0IChHc3RDQUNBU2lua0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RCYXNlU2lua0NsYXNzICpnc3RiYXNlc2lua19jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdGJhc2VzaW5rX2NsYXNzID0gKEdzdEJhc2VTaW5rQ2xhc3MgKikga2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2NhY2FzaW5rX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2NhY2FzaW5rX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1NDUkVFTl9XSURUSCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJzY3JlZW4td2lkdGgiLCAiU2NyZWVuIFdpZHRoIiwKKyAgICAgICAgICAiVGhlIHdpZHRoIG9mIHRoZSBzY3JlZW4iLCAwLCBHX01BWElOVCwgR1NUX0NBQ0FfREVGQVVMVF9TQ1JFRU5fV0lEVEgsCisgICAgICAgICAgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9TQ1JFRU5fSEVJR0hULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInNjcmVlbi1oZWlnaHQiLCAiU2NyZWVuIEhlaWdodCIsCisgICAgICAgICAgIlRoZSBoZWlnaHQgb2YgdGhlIHNjcmVlbiIsIDAsIEdfTUFYSU5ULAorICAgICAgICAgIEdTVF9DQUNBX0RFRkFVTFRfU0NSRUVOX0hFSUdIVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0RJVEhFUiwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgiZGl0aGVyIiwgIkRpdGhlciBUeXBlIiwgIlNldCB0eXBlIG9mIERpdGhlciIsCisgICAgICAgICAgR1NUX1RZUEVfQ0FDQURJVEhFUiwgR1NUX0NBQ0FfREVGQVVMVF9ESVRIRVIsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQU5USUFMSUFTSU5HLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJhbnRpLWFsaWFzaW5nIiwgIkFudGkgQWxpYXNpbmciLAorICAgICAgICAgICJFbmFibGVzIEFudGktQWxpYXNpbmciLCBHU1RfQ0FDQV9ERUZBVUxUX0FOVElBTElBU0lORywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfY2FjYXNpbmtfY2hhbmdlX3N0YXRlOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiQSBjb2xvcmVkIEFTQ0lJIGFydCB2aWRlbyBzaW5rIiwgIlNpbmsvVmlkZW8iLAorICAgICAgIkEgY29sb3JlZCBBU0NJSSBhcnQgdmlkZW9zaW5rIiwgIlplZXNoYW4gQWxpIDx6YWsxNDdAeWFob28uY29tPiIpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworCisgIGdzdGJhc2VzaW5rX2NsYXNzLT5zZXRfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfY2FjYXNpbmtfc2V0Y2Fwcyk7CisgIGdzdGJhc2VzaW5rX2NsYXNzLT5nZXRfdGltZXMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2NhY2FzaW5rX2dldF90aW1lcyk7CisgIGdzdGJhc2VzaW5rX2NsYXNzLT5wcmVyb2xsID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9jYWNhc2lua19yZW5kZXIpOworICBnc3RiYXNlc2lua19jbGFzcy0+cmVuZGVyID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9jYWNhc2lua19yZW5kZXIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2NhY2FzaW5rX2dldF90aW1lcyAoR3N0QmFzZVNpbmsgKiBzaW5rLCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgR3N0Q2xvY2tUaW1lICogc3RhcnQsIEdzdENsb2NrVGltZSAqIGVuZCkKK3sKKyAgKnN0YXJ0ID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcik7CisgICplbmQgPSAqc3RhcnQgKyBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9jYWNhc2lua19zZXRjYXBzIChHc3RCYXNlU2luayAqIGJhc2VzaW5rLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0Q0FDQVNpbmsgKmNhY2FzaW5rOworICBHc3RWaWRlb0luZm8gaW5mbzsKKyAgZ3VpbnQgYnBwLCByZWRfbWFzaywgZ3JlZW5fbWFzaywgYmx1ZV9tYXNrOworCisgIGNhY2FzaW5rID0gR1NUX0NBQ0FTSU5LIChiYXNlc2luayk7CisKKyAgaWYgKCFnc3RfdmlkZW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBjYXBzKSkKKyAgICBnb3RvIGNhcHNfZXJyb3I7CisKKyAgc3dpdGNoIChHU1RfVklERU9fSU5GT19GT1JNQVQgKCZpbmZvKSkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCeDoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeFJHQjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSeDoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeEJHUjoKKyAgICAgIGJwcCA9IDggKiBpbmZvLmZpbmZvLT5waXhlbF9zdHJpZGVbMF07CisgICAgICByZWRfbWFzayA9IDB4ZmYgPDwgKDggKiBpbmZvLmZpbmZvLT5wb2Zmc2V0W0dTVF9WSURFT19DT01QX1JdKTsKKyAgICAgIGdyZWVuX21hc2sgPSAweGZmIDw8ICg4ICogaW5mby5maW5mby0+cG9mZnNldFtHU1RfVklERU9fQ09NUF9HXSk7CisgICAgICBibHVlX21hc2sgPSAweGZmIDw8ICg4ICogaW5mby5maW5mby0+cG9mZnNldFtHU1RfVklERU9fQ09NUF9CXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCMTY6CisgICAgICBicHAgPSAxNjsKKyAgICAgIHJlZF9tYXNrID0gMHhmODAwOworICAgICAgZ3JlZW5fbWFzayA9IDB4MDdlMDsKKyAgICAgIGJsdWVfbWFzayA9IDB4MDAxZjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0IxNToKKyAgICAgIGJwcCA9IDE2OworICAgICAgcmVkX21hc2sgPSAweDdjMDA7CisgICAgICBncmVlbl9tYXNrID0gMHgwM2UwOworICAgICAgYmx1ZV9tYXNrID0gMHgwMDFmOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdvdG8gaW52YWxpZF9mb3JtYXQ7CisgIH0KKworICBpZiAoY2FjYXNpbmstPmJpdG1hcCkgeworICAgIGNhY2FfZnJlZV9iaXRtYXAgKGNhY2FzaW5rLT5iaXRtYXApOworICB9CisgIGNhY2FzaW5rLT5iaXRtYXAgPSBjYWNhX2NyZWF0ZV9iaXRtYXAgKGJwcCwKKyAgICAgIEdTVF9WSURFT19JTkZPX1dJRFRIICgmaW5mbyksCisgICAgICBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZpbmZvKSwKKyAgICAgIEdTVF9ST1VORF9VUF80IChHU1RfVklERU9fSU5GT19XSURUSCAoJmluZm8pICogYnBwIC8gOCksCisgICAgICByZWRfbWFzaywgZ3JlZW5fbWFzaywgYmx1ZV9tYXNrLCAwKTsKKyAgaWYgKCFjYWNhc2luay0+Yml0bWFwKQorICAgIGdvdG8gbm9fYml0bWFwOworCisgIGNhY2FzaW5rLT5pbmZvID0gaW5mbzsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUyAqLworY2Fwc19lcnJvcjoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNhY2FzaW5rLCAiZXJyb3IgcGFyc2luZyBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbnZhbGlkX2Zvcm1hdDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNhY2FzaW5rLCAiaW52YWxpZCBmb3JtYXQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX2JpdG1hcDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNhY2FzaW5rLCAiY291bGQgbm90IGNyZWF0ZSBiaXRtYXAiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9jYWNhc2lua19pbml0IChHc3RDQUNBU2luayAqIGNhY2FzaW5rKQoreworICBjYWNhc2luay0+c2NyZWVuX3dpZHRoID0gR1NUX0NBQ0FfREVGQVVMVF9TQ1JFRU5fV0lEVEg7CisgIGNhY2FzaW5rLT5zY3JlZW5faGVpZ2h0ID0gR1NUX0NBQ0FfREVGQVVMVF9TQ1JFRU5fSEVJR0hUOworCisgIGNhY2FzaW5rLT5kaXRoZXIgPSBHU1RfQ0FDQV9ERUZBVUxUX0RJVEhFUjsKKyAgY2FjYXNpbmstPmFudGlhbGlhc2luZyA9IEdTVF9DQUNBX0RFRkFVTFRfQU5USUFMSUFTSU5HOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2NhY2FzaW5rX3JlbmRlciAoR3N0QmFzZVNpbmsgKiBiYXNlc2luaywgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RDQUNBU2luayAqY2FjYXNpbmsgPSBHU1RfQ0FDQVNJTksgKGJhc2VzaW5rKTsKKyAgR3N0VmlkZW9GcmFtZSBmcmFtZTsKKworICBHU1RfREVCVUcgKCJyZW5kZXIiKTsKKworICBpZiAoIWdzdF92aWRlb19mcmFtZV9tYXAgKCZmcmFtZSwgJmNhY2FzaW5rLT5pbmZvLCBidWZmZXIsIEdTVF9NQVBfUkVBRCkpCisgICAgZ290byBpbnZhbGlkX2ZyYW1lOworCisgIGNhY2FfY2xlYXIgKCk7CisgIGNhY2FfZHJhd19iaXRtYXAgKDAsIDAsIGNhY2FzaW5rLT5zY3JlZW5fd2lkdGggLSAxLAorICAgICAgY2FjYXNpbmstPnNjcmVlbl9oZWlnaHQgLSAxLCBjYWNhc2luay0+Yml0bWFwLAorICAgICAgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKCZmcmFtZSwgMCkpOworICBjYWNhX3JlZnJlc2ggKCk7CisKKyAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmZnJhbWUpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfZnJhbWU6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChjYWNhc2luaywgImludmFsaWQgZnJhbWUgcmVjZWl2ZWQiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9jYWNhc2lua19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0Q0FDQVNpbmsgKmNhY2FzaW5rOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19DQUNBU0lOSyAob2JqZWN0KSk7CisKKyAgY2FjYXNpbmsgPSBHU1RfQ0FDQVNJTksgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RJVEhFUjp7CisgICAgICBjYWNhc2luay0+ZGl0aGVyID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgY2FjYV9zZXRfZGl0aGVyaW5nIChjYWNhc2luay0+ZGl0aGVyICsgQ0FDQV9ESVRIRVJJTkdfTk9ORSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0FOVElBTElBU0lORzp7CisgICAgICBjYWNhc2luay0+YW50aWFsaWFzaW5nID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgaWYgKGNhY2FzaW5rLT5hbnRpYWxpYXNpbmcpIHsKKyAgICAgICAgY2FjYV9zZXRfZmVhdHVyZSAoQ0FDQV9BTlRJQUxJQVNJTkdfTUFYKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNhY2Ffc2V0X2ZlYXR1cmUgKENBQ0FfQU5USUFMSUFTSU5HX01JTik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfY2FjYXNpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdENBQ0FTaW5rICpjYWNhc2luazsKKworICBjYWNhc2luayA9IEdTVF9DQUNBU0lOSyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU0NSRUVOX1dJRFRIOnsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGNhY2FzaW5rLT5zY3JlZW5fd2lkdGgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9TQ1JFRU5fSEVJR0hUOnsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGNhY2FzaW5rLT5zY3JlZW5faGVpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfRElUSEVSOnsKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBjYWNhc2luay0+ZGl0aGVyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfQU5USUFMSUFTSU5HOnsKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBjYWNhc2luay0+YW50aWFsaWFzaW5nKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OnsKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfY2FjYXNpbmtfb3BlbiAoR3N0Q0FDQVNpbmsgKiBjYWNhc2luaykKK3sKKyAgY2FjYXNpbmstPmJpdG1hcCA9IE5VTEw7CisKKyAgaWYgKGNhY2FfaW5pdCAoKSA8IDApCisgICAgZ290byBpbml0X2ZhaWxlZDsKKworICBjYWNhc2luay0+c2NyZWVuX3dpZHRoID0gY2FjYV9nZXRfd2lkdGggKCk7CisgIGNhY2FzaW5rLT5zY3JlZW5faGVpZ2h0ID0gY2FjYV9nZXRfaGVpZ2h0ICgpOworICBjYWNhc2luay0+YW50aWFsaWFzaW5nID0gVFJVRTsKKyAgY2FjYV9zZXRfZmVhdHVyZSAoQ0FDQV9BTlRJQUxJQVNJTkdfTUFYKTsKKyAgY2FjYXNpbmstPmRpdGhlciA9IDA7CisgIGNhY2Ffc2V0X2RpdGhlcmluZyAoQ0FDQV9ESVRIRVJJTkdfTk9ORSk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitpbml0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChjYWNhc2luaywgUkVTT1VSQ0UsIE9QRU5fV1JJVEUsIChOVUxMKSwKKyAgICAgICAgKCJjYWNhX2luaXQoKSBmYWlsZWQiKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfY2FjYXNpbmtfY2xvc2UgKEdzdENBQ0FTaW5rICogY2FjYXNpbmspCit7CisgIGlmIChjYWNhc2luay0+Yml0bWFwKSB7CisgICAgY2FjYV9mcmVlX2JpdG1hcCAoY2FjYXNpbmstPmJpdG1hcCk7CisgICAgY2FjYXNpbmstPmJpdG1hcCA9IE5VTEw7CisgIH0KKyAgY2FjYV9lbmQgKCk7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2NhY2FzaW5rX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgaWYgKCFnc3RfY2FjYXNpbmtfb3BlbiAoR1NUX0NBQ0FTSU5LIChlbGVtZW50KSkpCisgICAgICAgIHJldHVybiBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X2NhY2FzaW5rX2Nsb3NlIChHU1RfQ0FDQVNJTksgKGVsZW1lbnQpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImNhY2FzaW5rIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9DQUNBU0lOSykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgY2FjYXNpbmssCisgICAgIkNvbG9yZWQgQVNDSUkgQXJ0IHZpZGVvIHNpbmsiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuaCBiL2V4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI3YTZhOAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmgKQEAgLTAsMCArMSw3MSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9DQUNBU0lOS19IX18KKyNkZWZpbmUgX19HU1RfQ0FDQVNJTktfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXNpbmsuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworI2luY2x1ZGUgPGNhY2EuaD4KKyNpZmRlZiBDQUNBX0FQSV9WRVJTSU9OXzEKKyMgICBpbmNsdWRlIDxjYWNhMC5oPgorI2VuZGlmCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9DQUNBU0lOSyBcCisgIChnc3RfY2FjYXNpbmtfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0NBQ0FTSU5LKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQ0FDQVNJTkssR3N0Q0FDQVNpbmspKQorI2RlZmluZSBHU1RfQ0FDQVNJTktfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfQ0FDQVNJTkssR3N0Q0FDQVNpbmtDbGFzcykpCisjZGVmaW5lIEdTVF9JU19DQUNBU0lOSyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0NBQ0FTSU5LKSkKKyNkZWZpbmUgR1NUX0lTX0NBQ0FTSU5LX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0NBQ0FTSU5LKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdENBQ0FTaW5rIEdzdENBQ0FTaW5rOwordHlwZWRlZiBzdHJ1Y3QgX0dzdENBQ0FTaW5rQ2xhc3MgR3N0Q0FDQVNpbmtDbGFzczsKKworc3RydWN0IF9Hc3RDQUNBU2luayB7CisgIEdzdEJhc2VTaW5rIHBhcmVudDsKKworICBHc3RWaWRlb0luZm8gaW5mbzsKKyAgZ2ludCBzY3JlZW5fd2lkdGgsIHNjcmVlbl9oZWlnaHQ7CisKKyAgZ3VpbnQgZGl0aGVyOworICBnYm9vbGVhbiBhbnRpYWxpYXNpbmc7CisKKyAgc3RydWN0IGNhY2FfYml0bWFwICpiaXRtYXA7Cit9OworCitzdHJ1Y3QgX0dzdENBQ0FTaW5rQ2xhc3MgeworICBHc3RCYXNlU2lua0NsYXNzIHBhcmVudF9jbGFzczsKKworICAvKiBzaWduYWxzICovCit9OworCitHVHlwZSBnc3RfY2FjYXNpbmtfZ2V0X3R5cGUodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9DQUNBU0lOS19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC9saWJjYWNhL21lc29uLmJ1aWxkIGIvZXh0L2xpYmNhY2EvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZmODcxNAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9saWJjYWNhL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMTEgQEAKK2xpYmNhY2FfZGVwID0gZGVwZW5kZW5jeSgnY2FjYScsIHJlcXVpcmVkIDogZmFsc2UpCisKK2lmIGxpYmNhY2FfZGVwLmZvdW5kKCkKKyAgbGlicmFyeSgnZ3N0Y2FjYXNpbmsnLCAnZ3N0Y2FjYXNpbmsuYycsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICAgIGxpbmtfYXJncyA6IG5vc2VoX2xpbmtfYXJncywKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgICAgZGVwZW5kZW5jaWVzIDogW2dzdHZpZGVvX2RlcCwgZ3N0YmFzZV9kZXAsIGxpYmNhY2FfZGVwXSwKKyAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIpCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L2xpYnBuZy9NYWtlZmlsZS5hbSBiL2V4dC9saWJwbmcvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk4YzhlMwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9saWJwbmcvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw5IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RwbmcubGEKKworbGliZ3N0cG5nX2xhX1NPVVJDRVMgPSBnc3RwbmcuYyBnc3RwbmdlbmMuYyBnc3RwbmdkZWMuYworbGliZ3N0cG5nX2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpICQoTElCUE5HX0NGTEFHUykKK2xpYmdzdHBuZ19sYV9MSUJBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R2aWRlby1AR1NUX0FQSV9WRVJTSU9OQCBcCisJJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKExJQlBOR19MSUJTKQorbGliZ3N0cG5nX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3RwbmdkZWMuaCBnc3RwbmdlbmMuaApkaWZmIC0tZ2l0IGEvZXh0L2xpYnBuZy9nc3RwbmcuYyBiL2V4dC9saWJwbmcvZ3N0cG5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmZjQ3OQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9saWJwbmcvZ3N0cG5nLmMKQEAgLTAsMCArMSw0NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIEZpbHRlcjoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBEb25hbGQgQS4gR3JhZnQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJnc3RwbmdkZWMuaCIKKyNpbmNsdWRlICJnc3RwbmdlbmMuaCIKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJwbmdkZWMiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIEdTVF9UWVBFX1BOR0RFQykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInBuZ2VuYyIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICAgICAgR1NUX1RZUEVfUE5HRU5DKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBwbmcsCisgICAgIlBORyBwbHVnaW4gbGlicmFyeSIsIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsCisgICAgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZXh0L2xpYnBuZy9nc3RwbmcuaCBiL2V4dC9saWJwbmcvZ3N0cG5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNjOGFmYwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9saWJwbmcvZ3N0cG5nLmgKQEAgLTAsMCArMSwyNSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIEZpbHRlcjoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBEb25hbGQgQS4gR3JhZnQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPHBuZy5oPgorCitHVHlwZSBnc3RfcG5nZW5jX2dldF90eXBlICh2b2lkKTsKKworZXh0ZXJuIEdzdFBhZFRlbXBsYXRlICpnc3RfcG5nX3NpbmtfZmFjdG9yeSAoKTsKK2V4dGVybiBHc3RQYWRUZW1wbGF0ZSAqZ3N0X3BuZ19zcmNfZmFjdG9yeSAoKTsKZGlmZiAtLWdpdCBhL2V4dC9saWJwbmcvZ3N0cG5nZGVjLmMgYi9leHQvbGlicG5nL2dzdHBuZ2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MWUzYTkKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbGlicG5nL2dzdHBuZ2RlYy5jCkBAIC0wLDAgKzEsNzA4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgQ29sbGFib3JhIEx0ZC4KKyAqCUF1dGhvciA6IEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjb2xsYWJvcmEuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEzIENvbGxhYm9yYSBMdGQuCisgKglBdXRob3IgOiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCSAgICAgICAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcG5nZGVjCisgKgorICogRGVjb2RlcyBwbmcgaW1hZ2VzLiBJZiB0aGVyZSBpcyBubyBmcmFtZXJhdGUgc2V0IG9uIHNpbmsgY2FwcywgaXQgc2VuZHMgRU9TCisgKiBhZnRlciB0aGUgZmlyc3QgcGljdHVyZS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RwbmdkZWMuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJ5dGVyZWFkZXIuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9tZXRhLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvcG9vbC5oPgorI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocG5nZGVjX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHBuZ2RlY19kZWJ1ZworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3BuZ2RlY19saWJwbmdfaW5pdCAoR3N0UG5nRGVjICogcG5nZGVjKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3BuZ2RlY19jYXBzX2NyZWF0ZV9hbmRfc2V0IChHc3RQbmdEZWMgKiBwbmdkZWMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3BuZ2RlY19zdGFydCAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2Rlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3BuZ2RlY19zdG9wIChHc3RWaWRlb0RlY29kZXIgKiBkZWNvZGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcG5nZGVjX2ZsdXNoIChHc3RWaWRlb0RlY29kZXIgKiBkZWNvZGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcG5nZGVjX3NldF9mb3JtYXQgKEdzdFZpZGVvRGVjb2RlciAqIERlY29kZXIsCisgICAgR3N0VmlkZW9Db2RlY1N0YXRlICogc3RhdGUpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3BuZ2RlY19wYXJzZSAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlciwKKyAgICBHc3RWaWRlb0NvZGVjRnJhbWUgKiBmcmFtZSwgR3N0QWRhcHRlciAqIGFkYXB0ZXIsIGdib29sZWFuIGF0X2Vvcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcG5nZGVjX2hhbmRsZV9mcmFtZSAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlciwKKyAgICBHc3RWaWRlb0NvZGVjRnJhbWUgKiBmcmFtZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3BuZ2RlY19kZWNpZGVfYWxsb2NhdGlvbiAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlciwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcG5nZGVjX3NpbmtfZXZlbnQgKEdzdFZpZGVvRGVjb2RlciAqIGJkZWMsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CisKKyNkZWZpbmUgcGFyZW50X2NsYXNzIGdzdF9wbmdkZWNfcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RQbmdEZWMsIGdzdF9wbmdkZWMsIEdTVF9UWVBFX1ZJREVPX0RFQ09ERVIpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3BuZ2RlY19zcmNfcGFkX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UKKyAgICAgICAgKCJ7IFJHQkEsIFJHQiwgQVJHQjY0LCBHUkFZOCwgR1JBWTE2X0JFIH0iKSkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3BuZ2RlY19zaW5rX3BhZF90ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJpbWFnZS9wbmciKQorICAgICk7CisKK3N0YXRpYyB2b2lkCitnc3RfcG5nZGVjX2NsYXNzX2luaXQgKEdzdFBuZ0RlY0NsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdFZpZGVvRGVjb2RlckNsYXNzICp2ZGVjX2NsYXNzID0gKEdzdFZpZGVvRGVjb2RlckNsYXNzICopIGtsYXNzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9wbmdkZWNfc3JjX3BhZF90ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9wbmdkZWNfc2lua19wYWRfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiUE5HIGltYWdlIGRlY29kZXIiLAorICAgICAgIkNvZGVjL0RlY29kZXIvSW1hZ2UiLCAiRGVjb2RlIGEgcG5nIHZpZGVvIGZyYW1lIHRvIGEgcmF3IGltYWdlIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPiIpOworCisgIHZkZWNfY2xhc3MtPnN0YXJ0ID0gZ3N0X3BuZ2RlY19zdGFydDsKKyAgdmRlY19jbGFzcy0+c3RvcCA9IGdzdF9wbmdkZWNfc3RvcDsKKyAgdmRlY19jbGFzcy0+Zmx1c2ggPSBnc3RfcG5nZGVjX2ZsdXNoOworICB2ZGVjX2NsYXNzLT5zZXRfZm9ybWF0ID0gZ3N0X3BuZ2RlY19zZXRfZm9ybWF0OworICB2ZGVjX2NsYXNzLT5wYXJzZSA9IGdzdF9wbmdkZWNfcGFyc2U7CisgIHZkZWNfY2xhc3MtPmhhbmRsZV9mcmFtZSA9IGdzdF9wbmdkZWNfaGFuZGxlX2ZyYW1lOworICB2ZGVjX2NsYXNzLT5kZWNpZGVfYWxsb2NhdGlvbiA9IGdzdF9wbmdkZWNfZGVjaWRlX2FsbG9jYXRpb247CisgIHZkZWNfY2xhc3MtPnNpbmtfZXZlbnQgPSBnc3RfcG5nZGVjX3NpbmtfZXZlbnQ7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHBuZ2RlY19kZWJ1ZywgInBuZ2RlYyIsIDAsICJQTkcgaW1hZ2UgZGVjb2RlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3BuZ2RlY19pbml0IChHc3RQbmdEZWMgKiBwbmdkZWMpCit7CisgIHBuZ2RlYy0+cG5nID0gTlVMTDsKKyAgcG5nZGVjLT5pbmZvID0gTlVMTDsKKyAgcG5nZGVjLT5lbmRpbmZvID0gTlVMTDsKKworICBwbmdkZWMtPmNvbG9yX3R5cGUgPSAtMTsKKworICBwbmdkZWMtPmltYWdlX3JlYWR5ID0gRkFMU0U7CisgIHBuZ2RlYy0+cmVhZF9kYXRhID0gMDsKKworICBnc3RfdmlkZW9fZGVjb2Rlcl9zZXRfdXNlX2RlZmF1bHRfcGFkX2FjY2VwdGNhcHMgKEdTVF9WSURFT19ERUNPREVSX0NBU1QKKyAgICAgIChwbmdkZWMpLCBUUlVFKTsKKyAgR1NUX1BBRF9TRVRfQUNDRVBUX1RFTVBMQVRFIChHU1RfVklERU9fREVDT0RFUl9TSU5LX1BBRCAocG5nZGVjKSk7Cit9CisKK3N0YXRpYyB2b2lkCit1c2VyX2Vycm9yX2ZuIChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgZXJyb3JfbXNnKQoreworICBHU1RfRVJST1IgKCIlcyIsIGVycm9yX21zZyk7Cit9CisKK3N0YXRpYyB2b2lkCit1c2VyX3dhcm5pbmdfZm4gKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCB3YXJuaW5nX21zZykKK3sKKyAgR1NUX1dBUk5JTkcgKCIlcyIsIHdhcm5pbmdfbXNnKTsKK30KKworc3RhdGljIHZvaWQKK3VzZXJfaW5mb19jYWxsYmFjayAocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm8pCit7CisgIEdzdFBuZ0RlYyAqcG5nZGVjID0gTlVMTDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgR1NUX0xPRyAoImluZm8gcmVhZHkiKTsKKworICBwbmdkZWMgPSBHU1RfUE5HREVDIChwbmdfZ2V0X2lvX3B0ciAocG5nX3B0cikpOworICAvKiBHZW5lcmF0ZSB0aGUgY2FwcyBhbmQgY29uZmlndXJlICovCisgIHJldCA9IGdzdF9wbmdkZWNfY2Fwc19jcmVhdGVfYW5kX3NldCAocG5nZGVjKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgIGdvdG8gYmVhY2g7CisgIH0KKworICAvKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVyICovCisgIHJldCA9CisgICAgICBnc3RfdmlkZW9fZGVjb2Rlcl9hbGxvY2F0ZV9vdXRwdXRfZnJhbWUgKEdTVF9WSURFT19ERUNPREVSIChwbmdkZWMpLAorICAgICAgcG5nZGVjLT5jdXJyZW50X2ZyYW1lKTsKKyAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSykpCisgICAgR1NUX0RFQlVHX09CSkVDVCAocG5nZGVjLCAiZmFpbGVkIHRvIGFjcXVpcmUgYnVmZmVyIik7CisKK2JlYWNoOgorICBwbmdkZWMtPnJldCA9IHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcG5nZGVjX3NldF9mb3JtYXQgKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIsIEdzdFZpZGVvQ29kZWNTdGF0ZSAqIHN0YXRlKQoreworICBHc3RQbmdEZWMgKnBuZ2RlYyA9IChHc3RQbmdEZWMgKikgZGVjb2RlcjsKKworICBpZiAocG5nZGVjLT5pbnB1dF9zdGF0ZSkKKyAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKHBuZ2RlYy0+aW5wdXRfc3RhdGUpOworICBwbmdkZWMtPmlucHV0X3N0YXRlID0gZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3JlZiAoc3RhdGUpOworCisgIC8qIFdlJ2xsIHNldCBmb3JtYXQgbGF0ZXIgb24gKi8KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3VzZXJfZW5kcm93X2NhbGxiYWNrIChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgbmV3X3JvdywKKyAgICBwbmdfdWludF8zMiByb3dfbnVtLCBpbnQgcGFzcykKK3sKKyAgR3N0UG5nRGVjICpwbmdkZWMgPSBOVUxMOworCisgIHBuZ2RlYyA9IEdTVF9QTkdERUMgKHBuZ19nZXRfaW9fcHRyIChwbmdfcHRyKSk7CisKKyAgLyogSWYgYnVmZmVyX291dCBkb2Vzbid0IGV4aXN0LCBpdCBtZWFucyBidWZmZXJfYWxsb2MgZmFpbGVkLCB3aGljaCAKKyAgICogd2lsbCBhbHJlYWR5IGhhdmUgc2V0IHRoZSByZXR1cm4gY29kZSAqLworICBpZiAobmV3X3JvdyAmJiBHU1RfSVNfQlVGRkVSIChwbmdkZWMtPmN1cnJlbnRfZnJhbWUtPm91dHB1dF9idWZmZXIpKSB7CisgICAgR3N0VmlkZW9GcmFtZSBmcmFtZTsKKyAgICBHc3RCdWZmZXIgKmJ1ZmZlciA9IHBuZ2RlYy0+Y3VycmVudF9mcmFtZS0+b3V0cHV0X2J1ZmZlcjsKKyAgICBzaXplX3Qgb2Zmc2V0OworICAgIGd1aW50OCAqZGF0YTsKKworICAgIGlmICghZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJmZyYW1lLCAmcG5nZGVjLT5vdXRwdXRfc3RhdGUtPmluZm8sIGJ1ZmZlciwKKyAgICAgICAgICAgIEdTVF9NQVBfV1JJVEUpKSB7CisgICAgICBwbmdkZWMtPnJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRhdGEgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBICgmZnJhbWUsIDApOworICAgIG9mZnNldCA9IHJvd19udW0gKiBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKCZmcmFtZSwgMCk7CisgICAgR1NUX0xPRyAoImdvdCByb3cgJXUgYXQgcGFzcyAlZCwgY29weWluZyBpbiBidWZmZXIgJXAgYXQgb2Zmc2V0ICUiCisgICAgICAgIEdfR1NJWkVfRk9STUFULCAoZ3VpbnQpIHJvd19udW0sIHBhc3MsCisgICAgICAgIHBuZ2RlYy0+Y3VycmVudF9mcmFtZS0+b3V0cHV0X2J1ZmZlciwgb2Zmc2V0KTsKKyAgICBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3cgKHBuZ2RlYy0+cG5nLCBkYXRhICsgb2Zmc2V0LCBuZXdfcm93KTsKKyAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKCZmcmFtZSk7CisgICAgcG5nZGVjLT5yZXQgPSBHU1RfRkxPV19PSzsKKyAgfSBlbHNlCisgICAgcG5nZGVjLT5yZXQgPSBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK3VzZXJfZW5kX2NhbGxiYWNrIChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mbykKK3sKKyAgR3N0UG5nRGVjICpwbmdkZWMgPSBOVUxMOworCisgIHBuZ2RlYyA9IEdTVF9QTkdERUMgKHBuZ19nZXRfaW9fcHRyIChwbmdfcHRyKSk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBuZ2RlYywgImFuZCB3ZSBhcmUgZG9uZSByZWFkaW5nIHRoaXMgaW1hZ2UiKTsKKworICBpZiAoIXBuZ2RlYy0+Y3VycmVudF9mcmFtZS0+b3V0cHV0X2J1ZmZlcikKKyAgICByZXR1cm47CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAocG5nZGVjLT5jdXJyZW50X2ZyYW1lLT5pbnB1dF9idWZmZXIsCisgICAgICAmcG5nZGVjLT5jdXJyZW50X2ZyYW1lX21hcCk7CisKKyAgcG5nZGVjLT5yZXQgPQorICAgICAgZ3N0X3ZpZGVvX2RlY29kZXJfZmluaXNoX2ZyYW1lIChHU1RfVklERU9fREVDT0RFUiAocG5nZGVjKSwKKyAgICAgIHBuZ2RlYy0+Y3VycmVudF9mcmFtZSk7CisKKyAgcG5nZGVjLT5pbWFnZV9yZWFkeSA9IFRSVUU7Cit9CisKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9wbmdkZWNfY2Fwc19jcmVhdGVfYW5kX3NldCAoR3N0UG5nRGVjICogcG5nZGVjKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBnaW50IGJwYyA9IDAsIGNvbG9yX3R5cGU7CisgIHBuZ191aW50XzMyIHdpZHRoLCBoZWlnaHQ7CisgIEdzdFZpZGVvRm9ybWF0IGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfVU5LTk9XTjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX1BOR0RFQyAocG5nZGVjKSwgR1NUX0ZMT1dfRVJST1IpOworCisgIC8qIEdldCBiaXRzIHBlciBjaGFubmVsICovCisgIGJwYyA9IHBuZ19nZXRfYml0X2RlcHRoIChwbmdkZWMtPnBuZywgcG5nZGVjLT5pbmZvKTsKKworICAvKiBHZXQgQ29sb3IgdHlwZSAqLworICBjb2xvcl90eXBlID0gcG5nX2dldF9jb2xvcl90eXBlIChwbmdkZWMtPnBuZywgcG5nZGVjLT5pbmZvKTsKKworICAvKiBBZGQgYWxwaGEgY2hhbm5lbCBpZiAxNi1iaXQgZGVwdGgsIGJ1dCBub3QgZm9yIEdSQVkgaW1hZ2VzICovCisgIGlmICgoYnBjID4gOCkgJiYgKGNvbG9yX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkpIHsKKyAgICBwbmdfc2V0X2FkZF9hbHBoYSAocG5nZGVjLT5wbmcsIDB4ZmZmZiwgUE5HX0ZJTExFUl9CRUZPUkUpOworICAgIHBuZ19zZXRfc3dhcCAocG5nZGVjLT5wbmcpOworICB9CisjaWYgMAorICAvKiBXZSB1c2VkIHRvIGhhdmUgdGhpcyBIQUNLIHRvIHJldmVyc2UgdGhlIG91dGdvaW5nIGJ5dGVzLCBidXQgdGhlIHByb2JsZW0KKyAgICogdGhhdCBvcmlnaW5hbGx5IHJlcXVpcmVkIHRoZSBoYWNrIHNlZW1zIHRvIGhhdmUgYmVlbiBpbiB2aWRlb2NvbnZlcnQncworICAgKiBSR0JBIGRlc2NyaXB0aW9ucy4gSXQgZG9lc24ndCBzZWVtIG5lZWRlZCBub3cgdGhhdCdzIGZpeGVkLCBidXQgbWlnaHQKKyAgICogc3RpbGwgYmUgbmVlZGVkIG9uIGJpZy1lbmRpYW4gc3lzdGVtcywgSSdtIG5vdCBzdXJlLiBKLlMuIDYvNy8yMDA3ICovCisgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKKyAgICBwbmdfc2V0X2JnciAocG5nZGVjLT5wbmcpOworI2VuZGlmCisKKyAgLyogR3JheSBzY2FsZSB3aXRoIGFscGhhIGNoYW5uZWwgY29udmVydGVkIHRvIFJHQiAqLworICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHBuZ2RlYywKKyAgICAgICAgImNvbnZlcnRpbmcgZ3JheXNjYWxlIHBuZyB3aXRoIGFscGhhIGNoYW5uZWwgdG8gUkdCIik7CisgICAgcG5nX3NldF9ncmF5X3RvX3JnYiAocG5nZGVjLT5wbmcpOworICB9CisKKyAgLyogR3JheSBzY2FsZSBjb252ZXJ0ZWQgdG8gdXBzY2FsZWQgdG8gOCBiaXRzICovCisgIGlmICgoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKSB8fAorICAgICAgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkpIHsKKyAgICBpZiAoYnBjIDwgOCkgeyAgICAgICAgICAgICAgLyogQ29udmVydCB0byA4IGJpdHMgKi8KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChwbmdkZWMsICJjb252ZXJ0aW5nIGdyYXlzY2FsZSBpbWFnZSB0byA4IGJpdHMiKTsKKyNpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNDAwCisgICAgICBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCAocG5nZGVjLT5wbmcpOworI2Vsc2UKKyAgICAgIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCAocG5nZGVjLT5wbmcpOworI2VuZGlmCisgICAgfQorICB9CisKKyAgLyogUGFsZXR0ZSBjb252ZXJ0ZWQgdG8gUkdCICovCisgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocG5nZGVjLCAiY29udmVydGluZyBwYWxldHRlIHBuZyB0byBSR0IiKTsKKyAgICBwbmdfc2V0X3BhbGV0dGVfdG9fcmdiIChwbmdkZWMtPnBuZyk7CisgIH0KKworICBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyAocG5nZGVjLT5wbmcpOworCisgIC8qIFVwZGF0ZSB0aGUgaW5mbyBzdHJ1Y3R1cmUgKi8KKyAgcG5nX3JlYWRfdXBkYXRlX2luZm8gKHBuZ2RlYy0+cG5nLCBwbmdkZWMtPmluZm8pOworCisgIC8qIEdldCBJSERSIGhlYWRlciBhZ2FpbiBhZnRlciB0cmFuc2Zvcm1hdGlvbiBzZXR0aW5ncyAqLworICBwbmdfZ2V0X0lIRFIgKHBuZ2RlYy0+cG5nLCBwbmdkZWMtPmluZm8sICZ3aWR0aCwgJmhlaWdodCwKKyAgICAgICZicGMsICZwbmdkZWMtPmNvbG9yX3R5cGUsIE5VTEwsIE5VTEwsIE5VTEwpOworCisgIEdTVF9MT0dfT0JKRUNUIChwbmdkZWMsICJ0aGlzIGlzIGEgJWR4JWQgUE5HIGltYWdlIiwgKGdpbnQpIHdpZHRoLAorICAgICAgKGdpbnQpIGhlaWdodCk7CisKKyAgc3dpdGNoIChwbmdkZWMtPmNvbG9yX3R5cGUpIHsKKyAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQjoKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChwbmdkZWMsICJ3ZSBoYXZlIG5vIGFscGhhIGNoYW5uZWwsIGRlcHRoIGlzIDI0IGJpdHMiKTsKKyAgICAgIGlmIChicGMgPT0gOCkKKyAgICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9SR0I7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQToKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChwbmdkZWMsCisgICAgICAgICAgIndlIGhhdmUgYW4gYWxwaGEgY2hhbm5lbCwgZGVwdGggaXMgMzIgb3IgNjQgYml0cyIpOworICAgICAgaWYgKGJwYyA9PSA4KQorICAgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX1JHQkE7CisgICAgICBlbHNlIGlmIChicGMgPT0gMTYpCisgICAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfQVJHQjY0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZOgorICAgICAgR1NUX0xPR19PQkpFQ1QgKHBuZ2RlYywKKyAgICAgICAgICAiV2UgaGF2ZSBhbiBncmF5IGltYWdlLCBkZXB0aCBpcyA4IG9yIDE2IChiZSkgYml0cyIpOworICAgICAgaWYgKGJwYyA9PSA4KQorICAgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX0dSQVk4OworICAgICAgZWxzZSBpZiAoYnBjID09IDE2KQorICAgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX0dSQVkxNl9CRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChmb3JtYXQgPT0gR1NUX1ZJREVPX0ZPUk1BVF9VTktOT1dOKSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBuZ2RlYywgU1RSRUFNLCBOT1RfSU1QTEVNRU5URUQsIChOVUxMKSwKKyAgICAgICAgKCJwbmdkZWMgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGNvbG9yIHR5cGUiKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfTk9UX1NVUFBPUlRFRDsKKyAgICBnb3RvIGJlYWNoOworICB9CisKKyAgLyogQ2hlY2sgaWYgb3V0cHV0IHN0YXRlIGNoYW5nZWQgKi8KKyAgaWYgKHBuZ2RlYy0+b3V0cHV0X3N0YXRlKSB7CisgICAgR3N0VmlkZW9JbmZvICppbmZvID0gJnBuZ2RlYy0+b3V0cHV0X3N0YXRlLT5pbmZvOworCisgICAgaWYgKHdpZHRoID09IEdTVF9WSURFT19JTkZPX1dJRFRIIChpbmZvKSAmJgorICAgICAgICBoZWlnaHQgPT0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbmZvKSAmJgorICAgICAgICBHU1RfVklERU9fSU5GT19GT1JNQVQgKGluZm8pID09IGZvcm1hdCkgeworICAgICAgZ290byBiZWFjaDsKKyAgICB9CisgICAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChwbmdkZWMtPm91dHB1dF9zdGF0ZSk7CisgIH0KKyNpZmRlZiBIQVZFX0xJQlBOR18xXzUKKyAgaWYgKChwbmdkZWMtPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikKKyAgICAgICYmICEocG5nZGVjLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfUEFMRVRURSkKKyAgICAgICYmIHBuZ19nZXRfdmFsaWQgKHBuZ2RlYy0+cG5nLCBwbmdkZWMtPmluZm8sIFBOR19JTkZPX2lDQ1ApKSB7CisgICAgcG5nX2NoYXJwIGljY19uYW1lOworICAgIHBuZ19ieXRlcCBpY2NfcHJvZmlsZTsKKyAgICBpbnQgaWNjX2NvbXByZXNzaW9uX3R5cGU7CisgICAgcG5nX3VpbnRfMzIgaWNjX3Byb2ZsZW4gPSAwOworICAgIHBuZ191aW50XzMyIHJldCA9IHBuZ19nZXRfaUNDUCAocG5nZGVjLT5wbmcsIHBuZ2RlYy0+aW5mbywgJmljY19uYW1lLAorICAgICAgICAmaWNjX2NvbXByZXNzaW9uX3R5cGUsICZpY2NfcHJvZmlsZSwgJmljY19wcm9mbGVuKTsKKworICAgIGlmICgocmV0ICYgUE5HX0lORk9faUNDUCkpIHsKKyAgICAgIGdwb2ludGVyIGdzdF9pY2NfcHJvZiA9IGdfbWVtZHVwIChpY2NfcHJvZmlsZSwgaWNjX3Byb2ZsZW4pOworICAgICAgR3N0QnVmZmVyICp0YWdidWZmZXIgPSBOVUxMOworICAgICAgR3N0U2FtcGxlICp0YWdzYW1wbGUgPSBOVUxMOworICAgICAgR3N0VGFnTGlzdCAqdGFnbGlzdCA9IE5VTEw7CisgICAgICBHc3RTdHJ1Y3R1cmUgKmluZm8gPSBOVUxMOworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocG5nZGVjLCAiZXh0cmFjdGVkIElDQyBwcm9maWxlICclcycgbGVuZ3RoPSVpIiwKKyAgICAgICAgICBpY2NfbmFtZSwgKGd1aW50MzIpIGljY19wcm9mbGVuKTsKKworICAgICAgdGFnYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZ3N0X2ljY19wcm9mLCBpY2NfcHJvZmxlbik7CisKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXBwbGljYXRpb24vdm5kLmljY3Byb2ZpbGUiKTsKKyAgICAgIGluZm8gPSBnc3Rfc3RydWN0dXJlX25ld19lbXB0eSAoImFwcGxpY2F0aW9uL3ZuZC5pY2Nwcm9maWxlIik7CisKKyAgICAgIGlmIChpY2NfbmFtZSkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKGluZm8sICJpY2MtbmFtZSIsIEdfVFlQRV9TVFJJTkcsIGljY19uYW1lLCBOVUxMKTsKKworICAgICAgdGFnc2FtcGxlID0gZ3N0X3NhbXBsZV9uZXcgKHRhZ2J1ZmZlciwgY2FwcywgTlVMTCwgaW5mbyk7CisKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHRhZ2J1ZmZlcik7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgICAgIHRhZ2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFnbGlzdCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsIEdTVF9UQUdfQVRUQUNITUVOVCwKKyAgICAgICAgICB0YWdzYW1wbGUsIE5VTEwpOworICAgICAgZ3N0X3NhbXBsZV91bnJlZiAodGFnc2FtcGxlKTsKKworICAgICAgZ3N0X3ZpZGVvX2RlY29kZXJfbWVyZ2VfdGFncyAoR1NUX1ZJREVPX0RFQ09ERVIgKHBuZ2RlYyksIHRhZ2xpc3QsCisgICAgICAgICAgR1NUX1RBR19NRVJHRV9BUFBFTkQpOworICAgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdsaXN0KTsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIHBuZ2RlYy0+b3V0cHV0X3N0YXRlID0KKyAgICAgIGdzdF92aWRlb19kZWNvZGVyX3NldF9vdXRwdXRfc3RhdGUgKEdTVF9WSURFT19ERUNPREVSIChwbmdkZWMpLCBmb3JtYXQsCisgICAgICB3aWR0aCwgaGVpZ2h0LCBwbmdkZWMtPmlucHV0X3N0YXRlKTsKKyAgZ3N0X3ZpZGVvX2RlY29kZXJfbmVnb3RpYXRlIChHU1RfVklERU9fREVDT0RFUiAocG5nZGVjKSk7CisgIEdTVF9ERUJVRyAoIkZpbmFsICVkICVkIiwgR1NUX1ZJREVPX0lORk9fV0lEVEggKCZwbmdkZWMtPm91dHB1dF9zdGF0ZS0+aW5mbyksCisgICAgICBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZwbmdkZWMtPm91dHB1dF9zdGF0ZS0+aW5mbykpOworCitiZWFjaDoKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9wbmdkZWNfaGFuZGxlX2ZyYW1lIChHc3RWaWRlb0RlY29kZXIgKiBkZWNvZGVyLCBHc3RWaWRlb0NvZGVjRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0UG5nRGVjICpwbmdkZWMgPSAoR3N0UG5nRGVjICopIGRlY29kZXI7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBuZ2RlYywgIkdvdCBidWZmZXIsIHNpemU9JXUiLAorICAgICAgKGd1aW50KSBnc3RfYnVmZmVyX2dldF9zaXplIChmcmFtZS0+aW5wdXRfYnVmZmVyKSk7CisKKyAgLyogTGV0IGxpYnBuZyBjb21lIGJhY2sgaGVyZSBvbiBlcnJvciAqLworICBpZiAoc2V0am1wIChwbmdfam1wYnVmIChwbmdkZWMtPnBuZykpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwbmdkZWMsICJlcnJvciBkdXJpbmcgZGVjb2RpbmciKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGJlYWNoOworICB9CisKKyAgcG5nZGVjLT5jdXJyZW50X2ZyYW1lID0gZnJhbWU7CisKKyAgLyogUHJvZ3Jlc3NpdmUgbG9hZGluZyBvZiB0aGUgUE5HIGltYWdlICovCisgIGlmICghZ3N0X2J1ZmZlcl9tYXAgKGZyYW1lLT5pbnB1dF9idWZmZXIsICZwbmdkZWMtPmN1cnJlbnRfZnJhbWVfbWFwLAorICAgICAgICAgIEdTVF9NQVBfUkVBRCkpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBuZ2RlYywgIkZhaWxlZCB0byBtYXAgaW5wdXQgYnVmZmVyIik7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIHBuZ19wcm9jZXNzX2RhdGEgKHBuZ2RlYy0+cG5nLCBwbmdkZWMtPmluZm8sCisgICAgICBwbmdkZWMtPmN1cnJlbnRfZnJhbWVfbWFwLmRhdGEsIHBuZ2RlYy0+Y3VycmVudF9mcmFtZV9tYXAuc2l6ZSk7CisKKyAgaWYgKHBuZ2RlYy0+aW1hZ2VfcmVhZHkpIHsKKyAgICAvKiBSZXNldCBvdXJzZWx2ZXMgZm9yIHRoZSBuZXh0IGZyYW1lICovCisgICAgZ3N0X3BuZ2RlY19mbHVzaCAoZGVjb2Rlcik7CisgICAgR1NUX0xPR19PQkpFQ1QgKHBuZ2RlYywgInNldHRpbmcgdXAgY2FsbGJhY2tzIGZvciBuZXh0IGZyYW1lIik7CisgICAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuIChwbmdkZWMtPnBuZywgcG5nZGVjLAorICAgICAgICB1c2VyX2luZm9fY2FsbGJhY2ssIHVzZXJfZW5kcm93X2NhbGxiYWNrLCB1c2VyX2VuZF9jYWxsYmFjayk7CisgICAgcG5nZGVjLT5pbWFnZV9yZWFkeSA9IEZBTFNFOworICB9IGVsc2UgeworICAgIC8qIEFuIGVycm9yIGhhcHBlbmVkIGFuZCB3ZSBoYXZlIHRvIHVubWFwICovCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAocG5nZGVjLT5jdXJyZW50X2ZyYW1lLT5pbnB1dF9idWZmZXIsCisgICAgICAgICZwbmdkZWMtPmN1cnJlbnRfZnJhbWVfbWFwKTsKKyAgfQorCisgIHJldCA9IHBuZ2RlYy0+cmV0OworYmVhY2g6CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogQmFzZWQgb24gcG5ncGFyc2UgKi8KKyNkZWZpbmUgUE5HX1NJR05BVFVSRSBHX0dVSU5UNjRfQ09OU1RBTlQgKDB4ODk1MDRFNDcwRDBBMUEwQSkKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9wbmdkZWNfcGFyc2UgKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIsIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lLAorICAgIEdzdEFkYXB0ZXIgKiBhZGFwdGVyLCBnYm9vbGVhbiBhdF9lb3MpCit7CisgIGdzaXplIHRvYWRkID0gMDsKKyAgR3N0Qnl0ZVJlYWRlciByZWFkZXI7CisgIGdjb25zdHBvaW50ZXIgZGF0YTsKKyAgZ3VpbnQ2NCBzaWduYXR1cmU7CisgIGdzaXplIHNpemU7CisgIEdzdFBuZ0RlYyAqcG5nZGVjID0gKEdzdFBuZ0RlYyAqKSBkZWNvZGVyOworCisgIEdTVF9WSURFT19DT0RFQ19GUkFNRV9TRVRfU1lOQ19QT0lOVCAoZnJhbWUpOworCisgIC8qIEZJWE1FIDogVGhlIG92ZXJoZWFkIG9mIHVzaW5nIHNjYW5fdWludDMyIGlzIG1hc3NpdmUgKi8KKworICBzaXplID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChhZGFwdGVyKTsKKyAgR1NUX0RFQlVHICgiUGFyc2luZyBQTkcgaW1hZ2UgZGF0YSAoJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcykiLCBzaXplKTsKKworICBpZiAoc2l6ZSA8IDgpCisgICAgZ290byBuZWVkX21vcmVfZGF0YTsKKworICBkYXRhID0gZ3N0X2FkYXB0ZXJfbWFwIChhZGFwdGVyLCBzaXplKTsKKyAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZyZWFkZXIsIGRhdGEsIHNpemUpOworCisgIGlmIChwbmdkZWMtPnJlYWRfZGF0YSA9PSAwKSB7CisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfcGVla191aW50NjRfYmUgKCZyZWFkZXIsICZzaWduYXR1cmUpKQorICAgICAgZ290byBuZWVkX21vcmVfZGF0YTsKKworICAgIGlmIChzaWduYXR1cmUgIT0gUE5HX1NJR05BVFVSRSkgeworICAgICAgZm9yICg7OykgeworICAgICAgICBndWludCBvZmZzZXQ7CisKKyAgICAgICAgb2Zmc2V0ID0gZ3N0X2J5dGVfcmVhZGVyX21hc2tlZF9zY2FuX3VpbnQzMiAoJnJlYWRlciwgMHhmZmZmZmZmZiwKKyAgICAgICAgICAgIDB4ODk1MDRFNDcsIDAsIGdzdF9ieXRlX3JlYWRlcl9nZXRfcmVtYWluaW5nICgmcmVhZGVyKSk7CisKKyAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkgeworICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChhZGFwdGVyLAorICAgICAgICAgICAgICBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3JlbWFpbmluZyAoJnJlYWRlcikgLSA0KTsKKyAgICAgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJnJlYWRlciwgb2Zmc2V0KSkKKyAgICAgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworCisgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3BlZWtfdWludDY0X2JlICgmcmVhZGVyLCAmc2lnbmF0dXJlKSkKKyAgICAgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworCisgICAgICAgIGlmIChzaWduYXR1cmUgPT0gUE5HX1NJR05BVFVSRSkgeworICAgICAgICAgIC8qIFdlJ3JlIHNraXBwaW5nLCBnbyBvdXQsIHdlJ2xsIGJlIGJhY2sgKi8KKyAgICAgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAoYWRhcHRlciwgZ3N0X2J5dGVfcmVhZGVyX2dldF9wb3MgKCZyZWFkZXIpKTsKKyAgICAgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworICAgICAgICB9CisgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZyZWFkZXIsIDQpKQorICAgICAgICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisgICAgICB9CisgICAgfQorICAgIHBuZ2RlYy0+cmVhZF9kYXRhID0gODsKKyAgfQorCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZyZWFkZXIsIHBuZ2RlYy0+cmVhZF9kYXRhKSkKKyAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworCisgIGZvciAoOzspIHsKKyAgICBndWludDMyIGxlbmd0aDsKKyAgICBndWludDMyIGNvZGU7CisKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmcmVhZGVyLCAmbGVuZ3RoKSkKKyAgICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9sZSAoJnJlYWRlciwgJmNvZGUpKQorICAgICAgZ290byBuZWVkX21vcmVfZGF0YTsKKworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZyZWFkZXIsIGxlbmd0aCArIDQpKQorICAgICAgZ290byBuZWVkX21vcmVfZGF0YTsKKworICAgIGlmIChjb2RlID09IEdTVF9NQUtFX0ZPVVJDQyAoJ0knLCAnRScsICdOJywgJ0QnKSkgeworICAgICAgLyogSGF2ZSBjb21wbGV0ZSBmcmFtZSAqLworICAgICAgdG9hZGQgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3BvcyAoJnJlYWRlcik7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZWNvZGVyLCAiSGF2ZSBjb21wbGV0ZSBmcmFtZSBvZiBzaXplICUiIEdfR1NJWkVfRk9STUFULAorICAgICAgICAgIHRvYWRkKTsKKyAgICAgIHBuZ2RlYy0+cmVhZF9kYXRhID0gMDsKKyAgICAgIGdvdG8gaGF2ZV9mdWxsX2ZyYW1lOworICAgIH0gZWxzZQorICAgICAgcG5nZGVjLT5yZWFkX2RhdGEgKz0gbGVuZ3RoICsgMTI7CisgIH0KKworICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworCituZWVkX21vcmVfZGF0YToKKyAgcmV0dXJuIEdTVF9WSURFT19ERUNPREVSX0ZMT1dfTkVFRF9EQVRBOworCitoYXZlX2Z1bGxfZnJhbWU6CisgIGlmICh0b2FkZCkKKyAgICBnc3RfdmlkZW9fZGVjb2Rlcl9hZGRfdG9fZnJhbWUgKGRlY29kZXIsIHRvYWRkKTsKKyAgcmV0dXJuIGdzdF92aWRlb19kZWNvZGVyX2hhdmVfZnJhbWUgKGRlY29kZXIpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wbmdkZWNfZGVjaWRlX2FsbG9jYXRpb24gKEdzdFZpZGVvRGVjb2RlciAqIGJkZWMsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdEJ1ZmZlclBvb2wgKnBvb2wgPSBOVUxMOworICBHc3RTdHJ1Y3R1cmUgKmNvbmZpZzsKKworICBpZiAoIUdTVF9WSURFT19ERUNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kZWNpZGVfYWxsb2NhdGlvbiAoYmRlYywgcXVlcnkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoZ3N0X3F1ZXJ5X2dldF9uX2FsbG9jYXRpb25fcG9vbHMgKHF1ZXJ5KSA+IDApCisgICAgZ3N0X3F1ZXJ5X3BhcnNlX250aF9hbGxvY2F0aW9uX3Bvb2wgKHF1ZXJ5LCAwLCAmcG9vbCwgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgaWYgKHBvb2wgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgY29uZmlnID0gZ3N0X2J1ZmZlcl9wb29sX2dldF9jb25maWcgKHBvb2wpOworICBpZiAoZ3N0X3F1ZXJ5X2ZpbmRfYWxsb2NhdGlvbl9tZXRhIChxdWVyeSwgR1NUX1ZJREVPX01FVEFfQVBJX1RZUEUsIE5VTEwpKSB7CisgICAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19hZGRfb3B0aW9uIChjb25maWcsCisgICAgICAgIEdTVF9CVUZGRVJfUE9PTF9PUFRJT05fVklERU9fTUVUQSk7CisgIH0KKyAgZ3N0X2J1ZmZlcl9wb29sX3NldF9jb25maWcgKHBvb2wsIGNvbmZpZyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBvb2wpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wbmdkZWNfc2lua19ldmVudCAoR3N0VmlkZW9EZWNvZGVyICogYmRlYywgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgY29uc3QgR3N0U2VnbWVudCAqc2VnbWVudDsKKworICBpZiAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSAhPSBHU1RfRVZFTlRfU0VHTUVOVCkKKyAgICBnb3RvIGRvbmU7CisKKyAgZ3N0X2V2ZW50X3BhcnNlX3NlZ21lbnQgKGV2ZW50LCAmc2VnbWVudCk7CisKKyAgaWYgKHNlZ21lbnQtPmZvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUpCisgICAgZ3N0X3ZpZGVvX2RlY29kZXJfc2V0X3BhY2tldGl6ZWQgKGJkZWMsIFRSVUUpOworICBlbHNlCisgICAgZ3N0X3ZpZGVvX2RlY29kZXJfc2V0X3BhY2tldGl6ZWQgKGJkZWMsIEZBTFNFKTsKKworZG9uZToKKyAgcmV0dXJuIEdTVF9WSURFT19ERUNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChiZGVjLCBldmVudCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3BuZ2RlY19saWJwbmdfaW5pdCAoR3N0UG5nRGVjICogcG5nZGVjKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX1BOR0RFQyAocG5nZGVjKSwgRkFMU0UpOworCisgIEdTVF9MT0cgKCJpbml0IGxpYnBuZyBzdHJ1Y3R1cmVzIik7CisKKyAgLyogaW5pdGlhbGl6ZSBwbmcgc3RydWN0IHN0dWZmICovCisgIHBuZ2RlYy0+cG5nID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLAorICAgICAgKHBuZ192b2lkcCkgTlVMTCwgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuKTsKKworICBpZiAocG5nZGVjLT5wbmcgPT0gTlVMTCkKKyAgICBnb3RvIGluaXRfZmFpbGVkOworCisgIHBuZ2RlYy0+aW5mbyA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QgKHBuZ2RlYy0+cG5nKTsKKyAgaWYgKHBuZ2RlYy0+aW5mbyA9PSBOVUxMKQorICAgIGdvdG8gaW5mb19mYWlsZWQ7CisKKyAgcG5nZGVjLT5lbmRpbmZvID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdCAocG5nZGVjLT5wbmcpOworICBpZiAocG5nZGVjLT5lbmRpbmZvID09IE5VTEwpCisgICAgZ290byBlbmRpbmZvX2ZhaWxlZDsKKworICBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4gKHBuZ2RlYy0+cG5nLCBwbmdkZWMsCisgICAgICB1c2VyX2luZm9fY2FsbGJhY2ssIHVzZXJfZW5kcm93X2NhbGxiYWNrLCB1c2VyX2VuZF9jYWxsYmFjayk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitpbml0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwbmdkZWMsIExJQlJBUlksIElOSVQsIChOVUxMKSwKKyAgICAgICAgKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwbmcgc3RydWN0dXJlIikpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQoraW5mb19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocG5nZGVjLCBMSUJSQVJZLCBJTklULCAoTlVMTCksCisgICAgICAgICgiRmFpbGVkIHRvIGluaXRpYWxpemUgaW5mbyBzdHJ1Y3R1cmUiKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitlbmRpbmZvX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwbmdkZWMsIExJQlJBUlksIElOSVQsIChOVUxMKSwKKyAgICAgICAgKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmRpbmZvIHN0cnVjdHVyZSIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3BuZ2RlY19saWJwbmdfY2xlYXIgKEdzdFBuZ0RlYyAqIHBuZ2RlYykKK3sKKyAgcG5nX2luZm9wcCBpbmZvID0gTlVMTCwgZW5kaW5mbyA9IE5VTEw7CisKKyAgR1NUX0xPRyAoImNsZWFuaW5nIHVwIGxpYnBuZyBzdHJ1Y3R1cmVzIik7CisKKyAgaWYgKHBuZ2RlYy0+aW5mbykgeworICAgIGluZm8gPSAmcG5nZGVjLT5pbmZvOworICB9CisKKyAgaWYgKHBuZ2RlYy0+ZW5kaW5mbykgeworICAgIGVuZGluZm8gPSAmcG5nZGVjLT5lbmRpbmZvOworICB9CisKKyAgaWYgKHBuZ2RlYy0+cG5nKSB7CisgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QgKCYocG5nZGVjLT5wbmcpLCBpbmZvLCBlbmRpbmZvKTsKKyAgICBwbmdkZWMtPnBuZyA9IE5VTEw7CisgICAgcG5nZGVjLT5pbmZvID0gTlVMTDsKKyAgICBwbmdkZWMtPmVuZGluZm8gPSBOVUxMOworICB9CisKKyAgcG5nZGVjLT5jb2xvcl90eXBlID0gLTE7CisgIHBuZ2RlYy0+cmVhZF9kYXRhID0gMDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcG5nZGVjX3N0YXJ0IChHc3RWaWRlb0RlY29kZXIgKiBkZWNvZGVyKQoreworICBHc3RQbmdEZWMgKnBuZ2RlYyA9IChHc3RQbmdEZWMgKikgZGVjb2RlcjsKKworICBnc3RfdmlkZW9fZGVjb2Rlcl9zZXRfcGFja2V0aXplZCAoR1NUX1ZJREVPX0RFQ09ERVIgKHBuZ2RlYyksIEZBTFNFKTsKKyAgZ3N0X3BuZ2RlY19saWJwbmdfaW5pdCAocG5nZGVjKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcG5nZGVjX3N0b3AgKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIpCit7CisgIEdzdFBuZ0RlYyAqcG5nZGVjID0gKEdzdFBuZ0RlYyAqKSBkZWNvZGVyOworCisgIGdzdF9wbmdkZWNfbGlicG5nX2NsZWFyIChwbmdkZWMpOworCisgIGlmIChwbmdkZWMtPmlucHV0X3N0YXRlKSB7CisgICAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChwbmdkZWMtPmlucHV0X3N0YXRlKTsKKyAgICBwbmdkZWMtPmlucHV0X3N0YXRlID0gTlVMTDsKKyAgfQorICBpZiAocG5nZGVjLT5vdXRwdXRfc3RhdGUpIHsKKyAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKHBuZ2RlYy0+b3V0cHV0X3N0YXRlKTsKKyAgICBwbmdkZWMtPm91dHB1dF9zdGF0ZSA9IE5VTEw7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyogQ2xlYW4gdXAgdGhlIGxpYnBuZyBzdHJ1Y3R1cmVzICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wbmdkZWNfZmx1c2ggKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIpCit7CisgIGdzdF9wbmdkZWNfbGlicG5nX2NsZWFyICgoR3N0UG5nRGVjICopIGRlY29kZXIpOworICBnc3RfcG5nZGVjX2xpYnBuZ19pbml0ICgoR3N0UG5nRGVjICopIGRlY29kZXIpOworCisgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvZXh0L2xpYnBuZy9nc3RwbmdkZWMuaCBiL2V4dC9saWJwbmcvZ3N0cG5nZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk5NTg1MQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9saWJwbmcvZ3N0cG5nZGVjLmgKQEAgLTAsMCArMSw3MSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSAyMDEyIENvbGxhYm9yYSBMdGQuCisgKglBdXRob3IgOiBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY29sbGFib3JhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfUE5HREVDX0hfXworI2RlZmluZSBfX0dTVF9QTkdERUNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZGVjb2Rlci5oPgorI2luY2x1ZGUgPHBuZy5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUE5HREVDIChnc3RfcG5nZGVjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9QTkdERUMob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUE5HREVDLEdzdFBuZ0RlYykpCisjZGVmaW5lIEdTVF9QTkdERUNfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1BOR0RFQyxHc3RQbmdEZWNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19QTkdERUMob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUE5HREVDKSkKKyNkZWZpbmUgR1NUX0lTX1BOR0RFQ19DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUE5HREVDKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFBuZ0RlYyBHc3RQbmdEZWM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UG5nRGVjQ2xhc3MgR3N0UG5nRGVjQ2xhc3M7CisKK3N0cnVjdCBfR3N0UG5nRGVjCit7CisgIEdzdFZpZGVvRGVjb2RlciBwYXJlbnQ7CisKKyAgR3N0VmlkZW9Db2RlY1N0YXRlICppbnB1dF9zdGF0ZTsKKyAgR3N0VmlkZW9Db2RlY1N0YXRlICpvdXRwdXRfc3RhdGU7CisgIEdzdE1hcEluZm8gY3VycmVudF9mcmFtZV9tYXA7CisgIEdzdFZpZGVvQ29kZWNGcmFtZSAqY3VycmVudF9mcmFtZTsKKworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBwbmdfc3RydWN0cCBwbmc7CisgIHBuZ19pbmZvcCBpbmZvOworICBwbmdfaW5mb3AgZW5kaW5mbzsKKworICBnaW50IGNvbG9yX3R5cGU7CisKKyAgZ2Jvb2xlYW4gaW1hZ2VfcmVhZHk7CisgIGdzaXplIHJlYWRfZGF0YTsKK307CisKK3N0cnVjdCBfR3N0UG5nRGVjQ2xhc3MKK3sKKyAgR3N0VmlkZW9EZWNvZGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3BuZ2RlY19nZXRfdHlwZSh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1BOR0RFQ19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC9saWJwbmcvZ3N0cG5nZW5jLmMgYi9leHQvbGlicG5nL2dzdHBuZ2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MDUwYjEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbGlicG5nL2dzdHBuZ2VuYy5jCkBAIC0wLDAgKzEsNDI2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogRmlsdGVyOgorICogQ29weXJpZ2h0IChDKSAyMDAwIERvbmFsZCBBLiBHcmFmdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBDb2xsYWJvcmEgTHRkLgorICoJQXV0aG9yIDogRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNvbGxhYm9yYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LXBuZ2VuYworICoKKyAqIEVuY29kZXMgcG5nIGltYWdlcy4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb21ldGEuaD4KKyNpbmNsdWRlIDx6bGliLmg+CisKKyNpbmNsdWRlICJnc3RwbmdlbmMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocG5nZW5jX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHBuZ2VuY19kZWJ1ZworCisvKiBGaWx0ZXIgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCisjZGVmaW5lIERFRkFVTFRfU05BUFNIT1QgICAgICAgICAgICAgICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9DT01QUkVTU0lPTl9MRVZFTCAgICAgICA2CisKK2VudW0KK3sKKyAgQVJHXzAsCisgIEFSR19TTkFQU0hPVCwKKyAgQVJHX0NPTVBSRVNTSU9OX0xFVkVMCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgcG5nZW5jX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiaW1hZ2UvcG5nLCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsgMTYsIDEwMDAwMDAgXSwgIgorICAgICAgICAiaGVpZ2h0ID0gKGludCkgWyAxNiwgMTAwMDAwMCBdLCAiICJmcmFtZXJhdGUgPSAiIEdTVF9WSURFT19GUFNfUkFOR0UpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHBuZ2VuY19zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgUkdCQSwgUkdCLCBHUkFZOCwgR1JBWTE2X0JFIH0iKSkKKyAgICApOworCisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3RfcG5nZW5jX3BhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UG5nRW5jLCBnc3RfcG5nZW5jLCBHU1RfVFlQRV9WSURFT19FTkNPREVSKTsKKworc3RhdGljIHZvaWQgZ3N0X3BuZ2VuY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcG5nZW5jX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3BuZ2VuY19oYW5kbGVfZnJhbWUgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIsCisgICAgR3N0VmlkZW9Db2RlY0ZyYW1lICogZnJhbWUpOworc3RhdGljIGdib29sZWFuIGdzdF9wbmdlbmNfc2V0X2Zvcm1hdCAoR3N0VmlkZW9FbmNvZGVyICogZW5jb2RlciwKKyAgICBHc3RWaWRlb0NvZGVjU3RhdGUgKiBzdGF0ZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3BuZ2VuY19wcm9wb3NlX2FsbG9jYXRpb24gKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIsCisgICAgR3N0UXVlcnkgKiBxdWVyeSk7CisKK3N0YXRpYyB2b2lkIGdzdF9wbmdlbmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgdm9pZAordXNlcl9lcnJvcl9mbiAocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21zZykKK3sKKyAgZ193YXJuaW5nICgiJXMiLCBlcnJvcl9tc2cpOworfQorCitzdGF0aWMgdm9pZAordXNlcl93YXJuaW5nX2ZuIChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tc2cpCit7CisgIGdfd2FybmluZyAoIiVzIiwgd2FybmluZ19tc2cpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3BuZ2VuY19jbGFzc19pbml0IChHc3RQbmdFbmNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKyAgR3N0VmlkZW9FbmNvZGVyQ2xhc3MgKnZlbmNfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICB2ZW5jX2NsYXNzID0gKEdzdFZpZGVvRW5jb2RlckNsYXNzICopIGtsYXNzOworCisgIHBhcmVudF9jbGFzcyA9IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9wbmdlbmNfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcG5nZW5jX3NldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBBUkdfU05BUFNIT1QsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInNuYXBzaG90IiwgIlNuYXBzaG90IiwKKyAgICAgICAgICAiU2VuZCBFT1MgYWZ0ZXIgZW5jb2RpbmcgYSBmcmFtZSwgdXNlZnVsIGZvciBzbmFwc2hvdHMiLAorICAgICAgICAgIERFRkFVTFRfU05BUFNIT1QsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIEFSR19DT01QUkVTU0lPTl9MRVZFTCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiY29tcHJlc3Npb24tbGV2ZWwiLCAiY29tcHJlc3Npb24tbGV2ZWwiLAorICAgICAgICAgICJQTkcgY29tcHJlc3Npb24gbGV2ZWwiLAorICAgICAgICAgIFpfTk9fQ09NUFJFU1NJT04sIFpfQkVTVF9DT01QUkVTU0lPTiwKKyAgICAgICAgICBERUZBVUxUX0NPTVBSRVNTSU9OX0xFVkVMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlCisgICAgICAoZWxlbWVudF9jbGFzcywgJnBuZ2VuY19zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUKKyAgICAgIChlbGVtZW50X2NsYXNzLCAmcG5nZW5jX3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJQTkcgaW1hZ2UgZW5jb2RlciIsCisgICAgICAiQ29kZWMvRW5jb2Rlci9JbWFnZSIsCisgICAgICAiRW5jb2RlIGEgdmlkZW8gZnJhbWUgdG8gYSAucG5nIGltYWdlIiwKKyAgICAgICJKZXJlbXkgU0lNT04gPGpzaW1vbjEzQHlhaG9vLmZyPiIpOworCisgIHZlbmNfY2xhc3MtPnNldF9mb3JtYXQgPSBnc3RfcG5nZW5jX3NldF9mb3JtYXQ7CisgIHZlbmNfY2xhc3MtPmhhbmRsZV9mcmFtZSA9IGdzdF9wbmdlbmNfaGFuZGxlX2ZyYW1lOworICB2ZW5jX2NsYXNzLT5wcm9wb3NlX2FsbG9jYXRpb24gPSBnc3RfcG5nZW5jX3Byb3Bvc2VfYWxsb2NhdGlvbjsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcG5nZW5jX2ZpbmFsaXplOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChwbmdlbmNfZGVidWcsICJwbmdlbmMiLCAwLCAiUE5HIGltYWdlIGVuY29kZXIiKTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wbmdlbmNfc2V0X2Zvcm1hdCAoR3N0VmlkZW9FbmNvZGVyICogZW5jb2RlciwgR3N0VmlkZW9Db2RlY1N0YXRlICogc3RhdGUpCit7CisgIEdzdFBuZ0VuYyAqcG5nZW5jOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworICBHc3RWaWRlb0luZm8gKmluZm87CisgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqb3V0cHV0X3N0YXRlOworCisgIHBuZ2VuYyA9IEdTVF9QTkdFTkMgKGVuY29kZXIpOworICBpbmZvID0gJnN0YXRlLT5pbmZvOworCisgIHN3aXRjaCAoR1NUX1ZJREVPX0lORk9fRk9STUFUIChpbmZvKSkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgICAgcG5nZW5jLT5wbmdfY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQkE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCOgorICAgICAgcG5nZW5jLT5wbmdfY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9HUkFZODoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfR1JBWTE2X0JFOgorICAgICAgcG5nZW5jLT5wbmdfY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX0dSQVk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gRkFMU0U7CisgICAgICBnb3RvIGRvbmU7CisgIH0KKworICBzd2l0Y2ggKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoaW5mbykpIHsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfR1JBWTE2X0JFOgorICAgICAgcG5nZW5jLT5kZXB0aCA9IDE2OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgLyogR1NUX1ZJREVPX0ZPUk1BVF9SR0IgYW5kIEdTVF9WSURFT19GT1JNQVRfR1JBWTggKi8KKyAgICAgIHBuZ2VuYy0+ZGVwdGggPSA4OworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAocG5nZW5jLT5pbnB1dF9zdGF0ZSkKKyAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKHBuZ2VuYy0+aW5wdXRfc3RhdGUpOworICBwbmdlbmMtPmlucHV0X3N0YXRlID0gZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3JlZiAoc3RhdGUpOworCisgIG91dHB1dF9zdGF0ZSA9CisgICAgICBnc3RfdmlkZW9fZW5jb2Rlcl9zZXRfb3V0cHV0X3N0YXRlIChlbmNvZGVyLAorICAgICAgZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImltYWdlL3BuZyIpLCBzdGF0ZSk7CisgIGdzdF92aWRlb19jb2RlY19zdGF0ZV91bnJlZiAob3V0cHV0X3N0YXRlKTsKKworZG9uZToKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3BuZ2VuY19pbml0IChHc3RQbmdFbmMgKiBwbmdlbmMpCit7CisgIEdTVF9QQURfU0VUX0FDQ0VQVF9URU1QTEFURSAoR1NUX1ZJREVPX0VOQ09ERVJfU0lOS19QQUQgKHBuZ2VuYykpOworCisgIC8qIGluaXQgc2V0dGluZ3MgKi8KKyAgcG5nZW5jLT5wbmdfc3RydWN0X3B0ciA9IE5VTEw7CisgIHBuZ2VuYy0+cG5nX2luZm9fcHRyID0gTlVMTDsKKworICBwbmdlbmMtPnNuYXBzaG90ID0gREVGQVVMVF9TTkFQU0hPVDsKKyAgcG5nZW5jLT5jb21wcmVzc2lvbl9sZXZlbCA9IERFRkFVTFRfQ09NUFJFU1NJT05fTEVWRUw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcG5nZW5jX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RQbmdFbmMgKnBuZ2VuYyA9IEdTVF9QTkdFTkMgKG9iamVjdCk7CisKKyAgaWYgKHBuZ2VuYy0+aW5wdXRfc3RhdGUpCisgICAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChwbmdlbmMtPmlucHV0X3N0YXRlKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit1c2VyX2ZsdXNoX2RhdGEgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIgR19HTlVDX1VOVVNFRCkKK3sKK30KKworc3RhdGljIHZvaWQKK3VzZXJfd3JpdGVfZGF0YSAocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ191aW50XzMyIGxlbmd0aCkKK3sKKyAgR3N0UG5nRW5jICpwbmdlbmM7CisgIEdzdE1lbW9yeSAqbWVtOworICBHc3RNYXBJbmZvIG1pbmZvOworCisgIHBuZ2VuYyA9IChHc3RQbmdFbmMgKikgcG5nX2dldF9pb19wdHIgKHBuZ19wdHIpOworCisgIG1lbSA9IGdzdF9hbGxvY2F0b3JfYWxsb2MgKE5VTEwsIGxlbmd0aCwgTlVMTCk7CisgIGlmICghbWVtKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocG5nZW5jLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSIpOworICAgIHBuZ19lcnJvciAocG5nX3B0ciwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkiKTsKKworICAgIC8qIG5ldmVyIHJlYWNoZWQgKi8KKyAgICByZXR1cm47CisgIH0KKworICBpZiAoIWdzdF9tZW1vcnlfbWFwIChtZW0sICZtaW5mbywgR1NUX01BUF9XUklURSkpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwbmdlbmMsICJGYWlsZWQgdG8gbWFwIG1lbW9yeSIpOworICAgIGdzdF9tZW1vcnlfdW5yZWYgKG1lbSk7CisKKyAgICBwbmdfZXJyb3IgKHBuZ19wdHIsICJGYWlsZWQgdG8gbWFwIG1lbW9yeSIpOworCisgICAgLyogbmV2ZXIgcmVhY2hlZCAqLworICAgIHJldHVybjsKKyAgfQorCisgIG1lbWNweSAobWluZm8uZGF0YSwgZGF0YSwgbGVuZ3RoKTsKKyAgZ3N0X21lbW9yeV91bm1hcCAobWVtLCAmbWluZm8pOworCisgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAocG5nZW5jLT5idWZmZXJfb3V0LCBtZW0pOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3BuZ2VuY19oYW5kbGVfZnJhbWUgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIsIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lKQoreworICBHc3RQbmdFbmMgKnBuZ2VuYzsKKyAgZ2ludCByb3dfaW5kZXg7CisgIHBuZ19ieXRlICoqcm93X3BvaW50ZXJzOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RWaWRlb0luZm8gKmluZm87CisgIEdzdFZpZGVvRnJhbWUgdmZyYW1lOworCisgIHBuZ2VuYyA9IEdTVF9QTkdFTkMgKGVuY29kZXIpOworICBpbmZvID0gJnBuZ2VuYy0+aW5wdXRfc3RhdGUtPmluZm87CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocG5nZW5jLCAiQkVHSU5OSU5HIik7CisKKyAgLyogaW5pdGlhbGl6ZSBwbmcgc3RydWN0IHN0dWZmICovCisgIHBuZ2VuYy0+cG5nX3N0cnVjdF9wdHIgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLAorICAgICAgKHBuZ192b2lkcCkgTlVMTCwgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuKTsKKyAgaWYgKHBuZ2VuYy0+cG5nX3N0cnVjdF9wdHIgPT0gTlVMTCkKKyAgICBnb3RvIHN0cnVjdF9pbml0X2ZhaWw7CisKKyAgcG5nZW5jLT5wbmdfaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0IChwbmdlbmMtPnBuZ19zdHJ1Y3RfcHRyKTsKKyAgaWYgKCFwbmdlbmMtPnBuZ19pbmZvX3B0cikKKyAgICBnb3RvIHBuZ19pbmZvX2ZhaWw7CisKKyAgLyogbm9uLTAgcmV0dXJuIGlzIGZyb20gYSBsb25nam1wIGluc2lkZSBvZiBsaWJwbmcgKi8KKyAgaWYgKHNldGptcCAocG5nX2ptcGJ1ZiAocG5nZW5jLT5wbmdfc3RydWN0X3B0cikpICE9IDApCisgICAgZ290byBsb25nam1wX2ZhaWw7CisKKyAgcG5nX3NldF9maWx0ZXIgKHBuZ2VuYy0+cG5nX3N0cnVjdF9wdHIsIDAsCisgICAgICBQTkdfRklMVEVSX05PTkUgfCBQTkdfRklMVEVSX1ZBTFVFX05PTkUpOworICBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsIChwbmdlbmMtPnBuZ19zdHJ1Y3RfcHRyLCBwbmdlbmMtPmNvbXByZXNzaW9uX2xldmVsKTsKKworICBwbmdfc2V0X0lIRFIgKHBuZ2VuYy0+cG5nX3N0cnVjdF9wdHIsCisgICAgICBwbmdlbmMtPnBuZ19pbmZvX3B0ciwKKyAgICAgIEdTVF9WSURFT19JTkZPX1dJRFRIIChpbmZvKSwKKyAgICAgIEdTVF9WSURFT19JTkZPX0hFSUdIVCAoaW5mbyksCisgICAgICBwbmdlbmMtPmRlcHRoLAorICAgICAgcG5nZW5jLT5wbmdfY29sb3JfdHlwZSwKKyAgICAgIFBOR19JTlRFUkxBQ0VfTk9ORSwKKyAgICAgIFBOR19DT01QUkVTU0lPTl9UWVBFX0RFRkFVTFQsIFBOR19GSUxURVJfVFlQRV9ERUZBVUxUKTsKKworICBwbmdfc2V0X3dyaXRlX2ZuIChwbmdlbmMtPnBuZ19zdHJ1Y3RfcHRyLCBwbmdlbmMsCisgICAgICAocG5nX3J3X3B0cikgdXNlcl93cml0ZV9kYXRhLCB1c2VyX2ZsdXNoX2RhdGEpOworCisgIGlmICghZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJnZmcmFtZSwgJnBuZ2VuYy0+aW5wdXRfc3RhdGUtPmluZm8sCisgICAgICAgICAgZnJhbWUtPmlucHV0X2J1ZmZlciwgR1NUX01BUF9SRUFEKSkgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwbmdlbmMsIFNUUkVBTSwgRk9STUFULCAoTlVMTCksCisgICAgICAgICgiRmFpbGVkIHRvIG1hcCB2aWRlbyBmcmFtZSwgY2FwcyBwcm9ibGVtPyIpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICByb3dfcG9pbnRlcnMgPSBnX25ldyAocG5nX2J5dGUgKiwgR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbmZvKSk7CisKKyAgZm9yIChyb3dfaW5kZXggPSAwOyByb3dfaW5kZXggPCBHU1RfVklERU9fSU5GT19IRUlHSFQgKGluZm8pOyByb3dfaW5kZXgrKykgeworICAgIHJvd19wb2ludGVyc1tyb3dfaW5kZXhdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoJnZmcmFtZSwgMCkgKworICAgICAgICAocm93X2luZGV4ICogR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFICgmdmZyYW1lLCAwKSk7CisgIH0KKworICAvKiBhbGxvY2F0ZSB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICBwbmdlbmMtPmJ1ZmZlcl9vdXQgPSBnc3RfYnVmZmVyX25ldyAoKTsKKworICBwbmdfd3JpdGVfaW5mbyAocG5nZW5jLT5wbmdfc3RydWN0X3B0ciwgcG5nZW5jLT5wbmdfaW5mb19wdHIpOworICBwbmdfd3JpdGVfaW1hZ2UgKHBuZ2VuYy0+cG5nX3N0cnVjdF9wdHIsIHJvd19wb2ludGVycyk7CisgIHBuZ193cml0ZV9lbmQgKHBuZ2VuYy0+cG5nX3N0cnVjdF9wdHIsIE5VTEwpOworCisgIGdfZnJlZSAocm93X3BvaW50ZXJzKTsKKyAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmdmZyYW1lKTsKKworICBwbmdfZGVzdHJveV9pbmZvX3N0cnVjdCAocG5nZW5jLT5wbmdfc3RydWN0X3B0ciwgJnBuZ2VuYy0+cG5nX2luZm9fcHRyKTsKKyAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0ICgmcG5nZW5jLT5wbmdfc3RydWN0X3B0ciwgKHBuZ19pbmZvcHApIE5VTEwpOworCisgIC8qIFNldCBmaW5hbCBzaXplIGFuZCBzdG9yZSAqLworICBmcmFtZS0+b3V0cHV0X2J1ZmZlciA9IHBuZ2VuYy0+YnVmZmVyX291dDsKKworICBwbmdlbmMtPmJ1ZmZlcl9vdXQgPSBOVUxMOworCisgIGlmICgocmV0ID0gZ3N0X3ZpZGVvX2VuY29kZXJfZmluaXNoX2ZyYW1lIChlbmNvZGVyLCBmcmFtZSkpICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gZG9uZTsKKworICBpZiAocG5nZW5jLT5zbmFwc2hvdCkKKyAgICByZXQgPSBHU1RfRkxPV19FT1M7CisKK2RvbmU6CisgIEdTVF9ERUJVR19PQkpFQ1QgKHBuZ2VuYywgIkVORCwgcmV0OiVkIiwgcmV0KTsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworc3RydWN0X2luaXRfZmFpbDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwbmdlbmMsIExJQlJBUlksIElOSVQsIChOVUxMKSwKKyAgICAgICAgKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwbmcgc3RydWN0dXJlIikpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCitwbmdfaW5mb19mYWlsOgorICB7CisgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0ICgmKHBuZ2VuYy0+cG5nX3N0cnVjdF9wdHIpLCAocG5nX2luZm9wcCkgTlVMTCk7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBuZ2VuYywgTElCUkFSWSwgSU5JVCwgKE5VTEwpLAorICAgICAgICAoIkZhaWxlZCB0byBpbml0aWFsaXplIHRoZSBwbmcgaW5mbyBzdHJ1Y3R1cmUiKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKK2xvbmdqbXBfZmFpbDoKKyAgeworICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCAoJnBuZ2VuYy0+cG5nX3N0cnVjdF9wdHIsICZwbmdlbmMtPnBuZ19pbmZvX3B0cik7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBuZ2VuYywgTElCUkFSWSwgRkFJTEVELCAoTlVMTCksCisgICAgICAgICgicmV0dXJuaW5nIGZyb20gbG9uZ2ptcCIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcG5nZW5jX3Byb3Bvc2VfYWxsb2NhdGlvbiAoR3N0VmlkZW9FbmNvZGVyICogZW5jb2RlciwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgZ3N0X3F1ZXJ5X2FkZF9hbGxvY2F0aW9uX21ldGEgKHF1ZXJ5LCBHU1RfVklERU9fTUVUQV9BUElfVFlQRSwgTlVMTCk7CisKKyAgcmV0dXJuIEdTVF9WSURFT19FTkNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5wcm9wb3NlX2FsbG9jYXRpb24gKGVuY29kZXIsCisgICAgICBxdWVyeSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcG5nZW5jX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RQbmdFbmMgKnBuZ2VuYzsKKworICBwbmdlbmMgPSBHU1RfUE5HRU5DIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgQVJHX1NOQVBTSE9UOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHBuZ2VuYy0+c25hcHNob3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfQ09NUFJFU1NJT05fTEVWRUw6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcG5nZW5jLT5jb21wcmVzc2lvbl9sZXZlbCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9wbmdlbmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFBuZ0VuYyAqcG5nZW5jOworCisgIHBuZ2VuYyA9IEdTVF9QTkdFTkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBBUkdfU05BUFNIT1Q6CisgICAgICBwbmdlbmMtPnNuYXBzaG90ID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfQ09NUFJFU1NJT05fTEVWRUw6CisgICAgICBwbmdlbmMtPmNvbXByZXNzaW9uX2xldmVsID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2xpYnBuZy9nc3RwbmdlbmMuaCBiL2V4dC9saWJwbmcvZ3N0cG5nZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxZDk3YwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9saWJwbmcvZ3N0cG5nZW5jLmgKQEAgLTAsMCArMSw3NSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSAyMDEyIENvbGxhYm9yYSBMdGQuCisgKglBdXRob3IgOiBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY29sbGFib3JhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfUE5HRU5DX0hfXworI2RlZmluZSBfX0dTVF9QTkdFTkNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZW5jb2Rlci5oPgorI2luY2x1ZGUgPHBuZy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworI2RlZmluZSBHU1RfVFlQRV9QTkdFTkMgICAgICAgICAgICAoZ3N0X3BuZ2VuY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUE5HRU5DKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUE5HRU5DLEdzdFBuZ0VuYykpCisjZGVmaW5lIEdTVF9QTkdFTkNfQ0xBU1Moa2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1BOR0VOQyxHc3RQbmdFbmNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19QTkdFTkMob2JqKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9QTkdFTkMpKQorI2RlZmluZSBHU1RfSVNfUE5HRU5DX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9QTkdFTkMpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UG5nRW5jIEdzdFBuZ0VuYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RQbmdFbmNDbGFzcyBHc3RQbmdFbmNDbGFzczsKKworc3RydWN0IF9Hc3RQbmdFbmMKK3sKKyAgR3N0VmlkZW9FbmNvZGVyIHBhcmVudDsKKworICBHc3RWaWRlb0NvZGVjU3RhdGUgKmlucHV0X3N0YXRlOworICBHc3RCdWZmZXIgKmJ1ZmZlcl9vdXQ7CisKKyAgcG5nX3N0cnVjdHAgcG5nX3N0cnVjdF9wdHI7CisgIHBuZ19pbmZvcCBwbmdfaW5mb19wdHI7CisKKyAgZ2ludCBwbmdfY29sb3JfdHlwZTsKKyAgZ2ludCBkZXB0aDsKKyAgZ3VpbnQgY29tcHJlc3Npb25fbGV2ZWw7CisKKyAgZ2Jvb2xlYW4gc25hcHNob3Q7CisgIGdib29sZWFuIG5ld21lZGlhOworfTsKKworc3RydWN0IF9Hc3RQbmdFbmNDbGFzcworeworICBHc3RWaWRlb0VuY29kZXJDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcG5nZW5jX2dldF90eXBlKHZvaWQpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworI2VuZGlmIC8qIF9fR1NUX1BOR0VOQ19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC9saWJwbmcvbWVzb24uYnVpbGQgYi9leHQvbGlicG5nL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMDFlOWYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbGlicG5nL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMTkgQEAKK3BuZ19zb3VyY2VzID0gWworICAnZ3N0cG5nLmMnLAorICAnZ3N0cG5nZW5jLmMnLAorICAnZ3N0cG5nZGVjLmMnLAorXQorCitsaWJwbmdfZGVwID0gZGVwZW5kZW5jeSgnbGlicG5nJywgdmVyc2lvbiA6ICc+PTEuMicsIHJlcXVpcmVkIDogZmFsc2UpCisKK2lmIGxpYnBuZ19kZXAuZm91bmQoKQorICBnc3RwbmcgPSBsaWJyYXJ5KCdnc3RwbmcnLAorICAgIHBuZ19zb3VyY2VzLAorICAgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgICBsaW5rX2FyZ3MgOiBub3NlaF9saW5rX2FyZ3MsCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICAgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgZ3N0dmlkZW9fZGVwLCBsaWJwbmdfZGVwXSwKKyAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCisgICkKK2VuZGlmCmRpZmYgLS1naXQgYS9leHQvbWVzb24uYnVpbGQgYi9leHQvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVlYjM4MgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDI5IEBACitzdWJkaXIoJ2FhbGliJykKK3N1YmRpcignY2Fpcm8nKQorc3ViZGlyKCdmbGFjJykKK3N1YmRpcignZ2RrX3BpeGJ1ZicpCitzdWJkaXIoJ2d0aycpCitzdWJkaXIoJ2phY2snKQorc3ViZGlyKCdqcGVnJykKK3N1YmRpcignbGFtZScpCitzdWJkaXIoJ2xpYmNhY2EnKQorIyBGSVhNRTogZHYgcGx1Z2luIGZhaWxzIHRvIGxpbmsgd2l0aCBtc3ZjLCB3YW50cyBwdGhyZWFkLmxpYgoraWYgY2MuZ2V0X2lkKCkgIT0gJ21zdmMnCisgIHN1YmRpcignZHYnKQorZW5kaWYKK3N1YmRpcignbGlicG5nJykKK3N1YmRpcignbXBnMTIzJykKK3N1YmRpcigncmF3MTM5NCcpCitzdWJkaXIoJ3B1bHNlJykKK3N1YmRpcignc2hvdXQyJykKK3N1YmRpcignc291cCcpCitzdWJkaXIoJ3NwZWV4JykKKyMgRklYTUU6IHRhZ2xpYiBmYWlscyB0byBjb21waWxlIGFuZCBsaW5rIHdpdGggbXN2YworaWYgY2MuZ2V0X2lkKCkgPT0gJ21zdmMnCisgIG1lc3NhZ2UoJ0J1aWxkaW5nIHdpdGggTVNWQywgZGlzYWJsaW5nIHRhZ2xpYiBzdXBwb3J0LiBQYXRjaGVzIHdlbGNvbWUhJykKK2Vsc2UKKyAgc3ViZGlyKCd0YWdsaWInKQorZW5kaWYKK3N1YmRpcigndHdvbGFtZScpCitzdWJkaXIoJ3ZweCcpCitzdWJkaXIoJ3dhdnBhY2snKQpkaWZmIC0tZ2l0IGEvZXh0L21wZzEyMy9NYWtlZmlsZS5hbSBiL2V4dC9tcGcxMjMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1ZjMyNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tcGcxMjMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMSBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0bXBnMTIzLmxhCisKK2xpYmdzdG1wZzEyM19sYV9TT1VSQ0VTID0gZ3N0bXBnMTIzYXVkaW9kZWMuYworbGliZ3N0bXBnMTIzX2xhX0NGTEFHUyA9IC1ER1NUX1VTRV9VTlNUQUJMRV9BUEkgXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKE1QRzEyM19DRkxBR1MpCitsaWJnc3RtcGcxMjNfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tQEdTVF9BUElfVkVSU0lPTkAgXAorCSQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykgJChNUEcxMjNfTElCUykKK2xpYmdzdG1wZzEyM19sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gZ3N0bXBnMTIzYXVkaW9kZWMuaApkaWZmIC0tZ2l0IGEvZXh0L21wZzEyMy9nc3RtcGcxMjNhdWRpb2RlYy5jIGIvZXh0L21wZzEyMy9nc3RtcGcxMjNhdWRpb2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNjc0M2MKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbXBnMTIzL2dzdG1wZzEyM2F1ZGlvZGVjLmMKQEAgLTAsMCArMSw2MzQgQEAKKy8qICBNUDMgZGVjb2RpbmcgcGx1Z2luIGZvciBHU3RyZWFtZXIgdXNpbmcgdGhlIG1wZzEyMyBsaWJyYXJ5CisgKiAgQ29weXJpZ2h0IChDKSAyMDEyIENhcmxvcyBSYWZhZWwgR2lhbmkKKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisvKioKKyAqIFNFQ1RJT046IGVsZW1lbnQtbXBnMTIzYXVkaW9kZWMKKyAqIEBzZWVfYWxzbzogbGFtZW1wM2VuYywgbWFkCisgKgorICogQXVkaW8gZGVjb2RlciBmb3IgTVBFRy0xIGxheWVyIDEvMi8zIGF1ZGlvIGRhdGEuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPW11c2ljLm1wMyAhIG1wZWdhdWRpb3BhcnNlICEgbXBnMTIzYXVkaW9kZWMgISBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgYXV0b2F1ZGlvc2luaworICogXXwgRGVjb2RlIGFuZCBwbGF5IHRoZSBtcDMgZmlsZQorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RtcGcxMjNhdWRpb2RlYy5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKG1wZzEyM19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBtcGcxMjNfZGVidWcKKworLyogT21pdHRlZCBzYW1wbGUgZm9ybWF0cyB0aGF0IG1wZzEyMyBzdXBwb3J0cyAob3IgYXQgbGVhc3QgY2FuIHN1cHBvcnQpOgorICogIC0gOGJpdCBpbnRlZ2VyIHNpZ25lZAorICogIC0gOGJpdCBpbnRlZ2VyIHVuc2lnbmVkCisgKiAgLSBhLWxhdworICogIC0gbXUtbGF3CisgKiAgLSA2NGJpdCBmbG9hdAorICoKKyAqIFRoZSBmaXJzdCBmb3VyIGZvcm1hdHMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIEdzdEF1ZGlvRGVjb2RlciBiYXNlIGNsYXNzLgorICogKFRoZSBpbnRlcm5hbCBnc3RfYXVkaW9fZm9ybWF0X2Zyb21fY2Fwc19zdHJ1Y3R1cmUoKSBjYWxsIGZhaWxzLikKKyAqCisgKiBUaGUgNjRiaXQgZmxvYXQgaXNzdWUgaXMgdHJpY2t5LiBtcGcxMjMgYWN0dWFsbHkgZGVjb2RlcyB0byAicmVhbCIsCisgKiBub3QgbmVjZXNzYXJpbHkgdG8gImZsb2F0Ii4KKyAqCisgKiAicmVhbCIgY2FuIGJlIGZpeGVkIHBvaW50LCAzMmJpdCBmbG9hdCwgNjRiaXQgZmxvYXQuIFRoZXJlIHNlZW1zIHRvIGJlCisgKiBubyB3YXkgaG93IHRvIGZpbmQgb3V0IHdoaWNoIG9uZSBvZiB0aGVtIGlzIGFjdHVhbGx5IHVzZWQuCisgKgorICogSG93ZXZlciwgaW4gYWxsIGtub3duIGluc3RhbGxhdGlvbnMsICJyZWFsIiBlcXVhbHMgMzJiaXQgZmxvYXQsIHNvIHRoYXQncworICogd2hhdCBpcyB1c2VkLiAqLworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3RhdGljX3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8vbXBlZywgIgorICAgICAgICAibXBlZ3ZlcnNpb24gPSAoaW50KSAxLCAiCisgICAgICAgICJsYXllciA9IChpbnQpIFsgMSwgMyBdLCAiCisgICAgICAgICJyYXRlID0gKGludCkgeyA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAgfSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDIgXSwgIiAicGFyc2VkID0gKGJvb2xlYW4pIHRydWUgIikKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21wZzEyM19hdWRpb19kZWNfc3RhcnQgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21wZzEyM19hdWRpb19kZWNfc3RvcCAoR3N0QXVkaW9EZWNvZGVyICogZGVjKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9tcGcxMjNfYXVkaW9fZGVjX3B1c2hfZGVjb2RlZF9ieXRlcyAoR3N0TXBnMTIzQXVkaW9EZWMKKyAgICAqIG1wZzEyM19kZWNvZGVyLCB1bnNpZ25lZCBjaGFyIGNvbnN0ICpkZWNvZGVkX2J5dGVzLAorICAgIHNpemVfdCBjb25zdCBudW1fZGVjb2RlZF9ieXRlcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfbXBnMTIzX2F1ZGlvX2RlY19oYW5kbGVfZnJhbWUgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYywKKyAgICBHc3RCdWZmZXIgKiBpbnB1dF9idWZmZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9tcGcxMjNfYXVkaW9fZGVjX3NldF9mb3JtYXQgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYywKKyAgICBHc3RDYXBzICogaW5wdXRfY2Fwcyk7CitzdGF0aWMgdm9pZCBnc3RfbXBnMTIzX2F1ZGlvX2RlY19mbHVzaCAoR3N0QXVkaW9EZWNvZGVyICogZGVjLCBnYm9vbGVhbiBoYXJkKTsKKworR19ERUZJTkVfVFlQRSAoR3N0TXBnMTIzQXVkaW9EZWMsIGdzdF9tcGcxMjNfYXVkaW9fZGVjLCBHU1RfVFlQRV9BVURJT19ERUNPREVSKTsKKworc3RhdGljIHZvaWQKK2dzdF9tcGcxMjNfYXVkaW9fZGVjX2NsYXNzX2luaXQgKEdzdE1wZzEyM0F1ZGlvRGVjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0QXVkaW9EZWNvZGVyQ2xhc3MgKmJhc2VfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKyAgR3N0UGFkVGVtcGxhdGUgKnNyY190ZW1wbGF0ZSwgKnNpbmtfdGVtcGxhdGU7CisgIGludCBlcnJvcjsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAobXBnMTIzX2RlYnVnLCAibXBnMTIzIiwgMCwgIm1wZzEyMyBtcDMgZGVjb2RlciIpOworCisgIGJhc2VfY2xhc3MgPSBHU1RfQVVESU9fREVDT0RFUl9DTEFTUyAoa2xhc3MpOworICBlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIm1wZzEyMyBtcDMgZGVjb2RlciIsCisgICAgICAiQ29kZWMvRGVjb2Rlci9BdWRpbyIsCisgICAgICAiRGVjb2RlcyBtcDMgc3RyZWFtcyB1c2luZyB0aGUgbXBnMTIzIGxpYnJhcnkiLAorICAgICAgIkNhcmxvcyBSYWZhZWwgR2lhbmkgPGR2QHBzZXVkb3Rlcm1pbmFsLm9yZz4iKTsKKworICAvKiBOb3QgdXNpbmcgc3RhdGljIHBhZCB0ZW1wbGF0ZSBmb3Igc3JjY2Fwcywgc2luY2UgdGhlIGNvbW1hLXNlcGFyYXRlZCBsaXN0CisgICAqIG9mIGZvcm1hdHMgbmVlZHMgdG8gYmUgY3JlYXRlZCBkZXBlbmRpbmcgb24gd2hhdGV2ZXIgbXBnMTIzIHN1cHBvcnRzICovCisgIHsKKyAgICBjb25zdCBpbnQgKmZvcm1hdF9saXN0OworICAgIGNvbnN0IGxvbmcgKnJhdGVzX2xpc3Q7CisgICAgc2l6ZV90IG51bSwgaTsKKyAgICBHU3RyaW5nICpzOworICAgIEdzdENhcHMgKnNyY190ZW1wbGF0ZV9jYXBzOworCisgICAgcyA9IGdfc3RyaW5nX25ldyAoImF1ZGlvL3gtcmF3LCAiKTsKKworICAgIG1wZzEyM19lbmNvZGluZ3MgKCZmb3JtYXRfbGlzdCwgJm51bSk7CisgICAgZ19zdHJpbmdfYXBwZW5kIChzLCAiZm9ybWF0ID0geyAiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKKyAgICAgIHN3aXRjaCAoZm9ybWF0X2xpc3RbaV0pIHsKKyAgICAgICAgY2FzZSBNUEcxMjNfRU5DX1NJR05FRF8xNjoKKyAgICAgICAgICBnX3N0cmluZ19hcHBlbmQgKHMsIChpID4gMCkgPyAiLCAiIDogIiIpOworICAgICAgICAgIGdfc3RyaW5nX2FwcGVuZCAocywgR1NUX0FVRElPX05FIChTMTYpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNUEcxMjNfRU5DX1VOU0lHTkVEXzE2OgorICAgICAgICAgIGdfc3RyaW5nX2FwcGVuZCAocywgKGkgPiAwKSA/ICIsICIgOiAiIik7CisgICAgICAgICAgZ19zdHJpbmdfYXBwZW5kIChzLCBHU1RfQVVESU9fTkUgKFUxNikpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1QRzEyM19FTkNfU0lHTkVEXzI0OgorICAgICAgICAgIGdfc3RyaW5nX2FwcGVuZCAocywgKGkgPiAwKSA/ICIsICIgOiAiIik7CisgICAgICAgICAgZ19zdHJpbmdfYXBwZW5kIChzLCBHU1RfQVVESU9fTkUgKFMyNCkpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1QRzEyM19FTkNfVU5TSUdORURfMjQ6CisgICAgICAgICAgZ19zdHJpbmdfYXBwZW5kIChzLCAoaSA+IDApID8gIiwgIiA6ICIiKTsKKyAgICAgICAgICBnX3N0cmluZ19hcHBlbmQgKHMsIEdTVF9BVURJT19ORSAoVTI0KSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVBHMTIzX0VOQ19TSUdORURfMzI6CisgICAgICAgICAgZ19zdHJpbmdfYXBwZW5kIChzLCAoaSA+IDApID8gIiwgIiA6ICIiKTsKKyAgICAgICAgICBnX3N0cmluZ19hcHBlbmQgKHMsIEdTVF9BVURJT19ORSAoUzMyKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVBHMTIzX0VOQ19VTlNJR05FRF8zMjoKKyAgICAgICAgICBnX3N0cmluZ19hcHBlbmQgKHMsIChpID4gMCkgPyAiLCAiIDogIiIpOworICAgICAgICAgIGdfc3RyaW5nX2FwcGVuZCAocywgR1NUX0FVRElPX05FIChVMzIpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNUEcxMjNfRU5DX0ZMT0FUXzMyOgorICAgICAgICAgIGdfc3RyaW5nX2FwcGVuZCAocywgKGkgPiAwKSA/ICIsICIgOiAiIik7CisgICAgICAgICAgZ19zdHJpbmdfYXBwZW5kIChzLCBHU1RfQVVESU9fTkUgKEYzMikpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEdTVF9ERUJVRyAoIklnbm9yaW5nIG1wZzEyMyBmb3JtYXQgJWQiLCBmb3JtYXRfbGlzdFtpXSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGdfc3RyaW5nX2FwcGVuZCAocywgIiB9LCAiKTsKKworICAgIG1wZzEyM19yYXRlcyAoJnJhdGVzX2xpc3QsICZudW0pOworICAgIGdfc3RyaW5nX2FwcGVuZCAocywgInJhdGUgPSAoaW50KSB7ICIpOworICAgIGZvciAoaSA9IDA7IGkgPCBudW07ICsraSkgeworICAgICAgZ19zdHJpbmdfYXBwZW5kX3ByaW50ZiAocywgIiVzJWx1IiwgKGkgPiAwKSA/ICIsICIgOiAiIiwgcmF0ZXNfbGlzdFtpXSk7CisgICAgfQorICAgIGdfc3RyaW5nX2FwcGVuZCAocywgIn0sICIpOworCisgICAgZ19zdHJpbmdfYXBwZW5kIChzLCAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDIgXSwgIik7CisgICAgZ19zdHJpbmdfYXBwZW5kIChzLCAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQiKTsKKworICAgIHNyY190ZW1wbGF0ZV9jYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKHMtPnN0cik7CisgICAgc3JjX3RlbXBsYXRlID0gZ3N0X3BhZF90ZW1wbGF0ZV9uZXcgKCJzcmMiLCBHU1RfUEFEX1NSQywgR1NUX1BBRF9BTFdBWVMsCisgICAgICAgIHNyY190ZW1wbGF0ZV9jYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoc3JjX3RlbXBsYXRlX2NhcHMpOworCisgICAgZ19zdHJpbmdfZnJlZSAocywgVFJVRSk7CisgIH0KKworICBzaW5rX3RlbXBsYXRlID0gZ3N0X3N0YXRpY19wYWRfdGVtcGxhdGVfZ2V0ICgmc3RhdGljX3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsIHNpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCBzcmNfdGVtcGxhdGUpOworCisgIGJhc2VfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tcGcxMjNfYXVkaW9fZGVjX3N0YXJ0KTsKKyAgYmFzZV9jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbXBnMTIzX2F1ZGlvX2RlY19zdG9wKTsKKyAgYmFzZV9jbGFzcy0+aGFuZGxlX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbXBnMTIzX2F1ZGlvX2RlY19oYW5kbGVfZnJhbWUpOworICBiYXNlX2NsYXNzLT5zZXRfZm9ybWF0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tcGcxMjNfYXVkaW9fZGVjX3NldF9mb3JtYXQpOworICBiYXNlX2NsYXNzLT5mbHVzaCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbXBnMTIzX2F1ZGlvX2RlY19mbHVzaCk7CisKKyAgZXJyb3IgPSBtcGcxMjNfaW5pdCAoKTsKKyAgaWYgKEdfVU5MSUtFTFkgKGVycm9yICE9IE1QRzEyM19PSykpCisgICAgR1NUX0VSUk9SICgiQ291bGQgbm90IGluaXRpYWxpemUgbXBnMTIzIGxpYnJhcnk6ICVzIiwKKyAgICAgICAgbXBnMTIzX3BsYWluX3N0cmVycm9yIChlcnJvcikpOworICBlbHNlCisgICAgR1NUX0lORk8gKCJtcGcxMjMgbGlicmFyeSBpbml0aWFsaXplZCIpOworfQorCisKK3ZvaWQKK2dzdF9tcGcxMjNfYXVkaW9fZGVjX2luaXQgKEdzdE1wZzEyM0F1ZGlvRGVjICogbXBnMTIzX2RlY29kZXIpCit7CisgIG1wZzEyM19kZWNvZGVyLT5oYW5kbGUgPSBOVUxMOworICBnc3RfYXVkaW9fZGVjb2Rlcl9zZXRfbmVlZHNfZm9ybWF0IChHU1RfQVVESU9fREVDT0RFUiAobXBnMTIzX2RlY29kZXIpLCBUUlVFKTsKKyAgZ3N0X2F1ZGlvX2RlY29kZXJfc2V0X3VzZV9kZWZhdWx0X3BhZF9hY2NlcHRjYXBzIChHU1RfQVVESU9fREVDT0RFUl9DQVNUCisgICAgICAobXBnMTIzX2RlY29kZXIpLCBUUlVFKTsKKyAgR1NUX1BBRF9TRVRfQUNDRVBUX1RFTVBMQVRFIChHU1RfQVVESU9fREVDT0RFUl9TSU5LX1BBRCAobXBnMTIzX2RlY29kZXIpKTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tcGcxMjNfYXVkaW9fZGVjX3N0YXJ0IChHc3RBdWRpb0RlY29kZXIgKiBkZWMpCit7CisgIEdzdE1wZzEyM0F1ZGlvRGVjICptcGcxMjNfZGVjb2RlcjsKKyAgaW50IGVycm9yOworCisgIG1wZzEyM19kZWNvZGVyID0gR1NUX01QRzEyM19BVURJT19ERUMgKGRlYyk7CisgIGVycm9yID0gMDsKKworICBtcGcxMjNfZGVjb2Rlci0+aGFuZGxlID0gbXBnMTIzX25ldyAoTlVMTCwgJmVycm9yKTsKKyAgbXBnMTIzX2RlY29kZXItPmhhc19uZXh0X2F1ZGlvaW5mbyA9IEZBTFNFOworICBtcGcxMjNfZGVjb2Rlci0+ZnJhbWVfb2Zmc2V0ID0gMDsKKworICAvKiBJbml0aWFsbHksIHRoZSBtcGcxMjMgaGFuZGxlIGNvbWVzIHdpdGggYSBzZXQgb2YgZGVmYXVsdCBmb3JtYXRzCisgICAqIHN1cHBvcnRlZC4gVGhpcyBjbGVhcnMgdGhpcyBzZXQuICBUaGlzIGlzIG5lY2Vzc2FyeSwgc2luY2Ugb25seSBvbmUKKyAgICogZm9ybWF0IHNoYWxsIGJlIHN1cHBvcnRlZCAoc2VlIHNldF9mb3JtYXQgZm9yIG1vcmUpLiAqLworICBtcGcxMjNfZm9ybWF0X25vbmUgKG1wZzEyM19kZWNvZGVyLT5oYW5kbGUpOworCisgIC8qIEJ1aWx0LWluIG1wZzEyMyBzdXBwb3J0IGZvciBnYXBsZXNzIGRlY29kaW5nIGlzIGRpc2FibGVkIGZvciBub3csCisgICAqIHNpbmNlIGl0IGRvZXMgbm90IHdvcmsgd2VsbCB3aXRoIHNlZWtpbmcgKi8KKyAgbXBnMTIzX3BhcmFtIChtcGcxMjNfZGVjb2Rlci0+aGFuZGxlLCBNUEcxMjNfUkVNT1ZFX0ZMQUdTLCBNUEcxMjNfR0FQTEVTUywgMCk7CisgIC8qIFRlbGxzIG1wZzEyMyB0byB1c2UgYSBzbWFsbCByZWFkLWFoZWFkIGJ1ZmZlciBmb3IgYmV0dGVyIE1QRUcgc3luYzsKKyAgICogZXNzZW50aWFsIGZvciBNUDMgcmFkaW8gc3RyZWFtcyAqLworICBtcGcxMjNfcGFyYW0gKG1wZzEyM19kZWNvZGVyLT5oYW5kbGUsIE1QRzEyM19BRERfRkxBR1MsIE1QRzEyM19TRUVLQlVGRkVSLCAwKTsKKyAgLyogU2V0cyB0aGUgcmVzeW5jIGxpbWl0IHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSAob3RoZXJ3aXNlIG1wZzEyMyBtYXkgZ2l2ZQorICAgKiB1cCBvbiBkZWNvZGluZyBwcmVtYXR1cmVseSwgZXNwZWNpYWxseSB3aXRoIG1wMyB3ZWIgcmFkaW9zKSAqLworICBtcGcxMjNfcGFyYW0gKG1wZzEyM19kZWNvZGVyLT5oYW5kbGUsIE1QRzEyM19SRVNZTkNfTElNSVQsIC0xLCAwKTsKKyNpZiBNUEcxMjNfQVBJX1ZFUlNJT04gPj0gMzYKKyAgLyogVGhlIHByZWNpc2UgQVBJIHZlcnNpb24gd2hlcmUgTVBHMTIzX0FVVE9fUkVTQU1QTEUgYXBwZWFyZWQgaXMKKyAgICogc29tZXdoZXJlIGJldHdlZW4gMjkgYW5kIDM2ICovCisgIC8qIERvbid0IGxldCBtcGcxMjMgcmVzYW1wbGUgb3V0cHV0ICovCisgIG1wZzEyM19wYXJhbSAobXBnMTIzX2RlY29kZXItPmhhbmRsZSwgTVBHMTIzX1JFTU9WRV9GTEFHUywKKyAgICAgIE1QRzEyM19BVVRPX1JFU0FNUExFLCAwKTsKKyNlbmRpZgorICAvKiBEb24ndCBsZXQgbXBnMTIzIHByaW50IG1lc3NhZ2VzIHRvIHN0ZG91dC9zdGRlcnIgKi8KKyAgbXBnMTIzX3BhcmFtIChtcGcxMjNfZGVjb2Rlci0+aGFuZGxlLCBNUEcxMjNfQUREX0ZMQUdTLCBNUEcxMjNfUVVJRVQsIDApOworCisgIC8qIE9wZW4gaW4gZmVlZCBtb2RlICg9IGVuY29kZWQgZGF0YSBpcyBmZWQgbWFudWFsbHkgaW50byB0aGUgaGFuZGxlKS4gKi8KKyAgZXJyb3IgPSBtcGcxMjNfb3Blbl9mZWVkIChtcGcxMjNfZGVjb2Rlci0+aGFuZGxlKTsKKworICBpZiAoR19VTkxJS0VMWSAoZXJyb3IgIT0gTVBHMTIzX09LKSkgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZWMsIExJQlJBUlksIElOSVQsIChOVUxMKSwKKyAgICAgICAgKCIlcyIsIG1wZzEyM19zdHJlcnJvciAobXBnMTIzX2RlY29kZXItPmhhbmRsZSkpKTsKKyAgICBtcGcxMjNfY2xvc2UgKG1wZzEyM19kZWNvZGVyLT5oYW5kbGUpOworICAgIG1wZzEyM19kZWxldGUgKG1wZzEyM19kZWNvZGVyLT5oYW5kbGUpOworICAgIG1wZzEyM19kZWNvZGVyLT5oYW5kbGUgPSBOVUxMOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIEdTVF9JTkZPX09CSkVDVCAoZGVjLCAibXBnMTIzIGRlY29kZXIgc3RhcnRlZCIpOworCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21wZzEyM19hdWRpb19kZWNfc3RvcCAoR3N0QXVkaW9EZWNvZGVyICogZGVjKQoreworICBHc3RNcGcxMjNBdWRpb0RlYyAqbXBnMTIzX2RlY29kZXIgPSBHU1RfTVBHMTIzX0FVRElPX0RFQyAoZGVjKTsKKworICBpZiAoR19MSUtFTFkgKG1wZzEyM19kZWNvZGVyLT5oYW5kbGUgIT0gTlVMTCkpIHsKKyAgICBtcGcxMjNfY2xvc2UgKG1wZzEyM19kZWNvZGVyLT5oYW5kbGUpOworICAgIG1wZzEyM19kZWxldGUgKG1wZzEyM19kZWNvZGVyLT5oYW5kbGUpOworICAgIG1wZzEyM19kZWNvZGVyLT5oYW5kbGUgPSBOVUxMOworICB9CisKKyAgR1NUX0lORk9fT0JKRUNUIChkZWMsICJtcGcxMjMgZGVjb2RlciBzdG9wcGVkIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tcGcxMjNfYXVkaW9fZGVjX3B1c2hfZGVjb2RlZF9ieXRlcyAoR3N0TXBnMTIzQXVkaW9EZWMgKiBtcGcxMjNfZGVjb2RlciwKKyAgICB1bnNpZ25lZCBjaGFyIGNvbnN0ICpkZWNvZGVkX2J5dGVzLCBzaXplX3QgY29uc3QgbnVtX2RlY29kZWRfYnl0ZXMpCit7CisgIEdzdEJ1ZmZlciAqb3V0cHV0X2J1ZmZlcjsKKyAgR3N0QXVkaW9EZWNvZGVyICpkZWM7CisKKyAgb3V0cHV0X2J1ZmZlciA9IE5VTEw7CisgIGRlYyA9IEdTVF9BVURJT19ERUNPREVSIChtcGcxMjNfZGVjb2Rlcik7CisKKyAgaWYgKChudW1fZGVjb2RlZF9ieXRlcyA9PSAwKSB8fCAoZGVjb2RlZF9ieXRlcyA9PSBOVUxMKSkgeworICAgIC8qIFRoaXMgb2NjdXJzIGluIHRoZSBmaXJzdCBmZXcgZnJhbWVzLCB3aGljaCBkbyBub3QgY2FycnkgZGF0YTsgb25jZQorICAgICAqIE1QRzEyM19BVURJT19ERUNfTkVXX0ZPUk1BVCBpcyByZWNlaXZlZCwgdGhlIGVtcHR5IGZyYW1lcyBzdG9wIG9jY3VycmluZyAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wZzEyM19kZWNvZGVyLAorICAgICAgICAiY2Fubm90IGRlY29kZSB5ZXQsIG5lZWQgbW9yZSBkYXRhIC0+IG5vIG91dHB1dCBidWZmZXIgdG8gcHVzaCIpOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorCisgIG91dHB1dF9idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgbnVtX2RlY29kZWRfYnl0ZXMsIE5VTEwpOworCisgIGlmIChvdXRwdXRfYnVmZmVyID09IE5VTEwpIHsKKyAgICAvKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBhZHZhbmNlIHBsYXliYWNrIGluIHRpbWUsCisgICAgICogZXZlbiB3aGVuIG5vdGhpbmcgd2FzIGRlY29kZWQuICovCisgICAgcmV0dXJuIGdzdF9hdWRpb19kZWNvZGVyX2ZpbmlzaF9mcmFtZSAoZGVjLCBOVUxMLCAxKTsKKyAgfSBlbHNlIHsKKyAgICBHc3RNYXBJbmZvIGluZm87CisKKyAgICBpZiAoZ3N0X2J1ZmZlcl9tYXAgKG91dHB1dF9idWZmZXIsICZpbmZvLCBHU1RfTUFQX1dSSVRFKSkgeworICAgICAgbWVtY3B5IChpbmZvLmRhdGEsIGRlY29kZWRfYnl0ZXMsIG51bV9kZWNvZGVkX2J5dGVzKTsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dHB1dF9idWZmZXIsICZpbmZvKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAobXBnMTIzX2RlY29kZXIsICJnc3RfYnVmZmVyX21hcCgpIHJldHVybmVkIE5VTEwiKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dHB1dF9idWZmZXIpOworICAgICAgb3V0cHV0X2J1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGdzdF9hdWRpb19kZWNvZGVyX2ZpbmlzaF9mcmFtZSAoZGVjLCBvdXRwdXRfYnVmZmVyLCAxKTsKKyAgfQorfQorCisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbXBnMTIzX2F1ZGlvX2RlY19oYW5kbGVfZnJhbWUgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYywKKyAgICBHc3RCdWZmZXIgKiBpbnB1dF9idWZmZXIpCit7CisgIEdzdE1wZzEyM0F1ZGlvRGVjICptcGcxMjNfZGVjb2RlcjsKKyAgaW50IGRlY29kZV9lcnJvcjsKKyAgdW5zaWduZWQgY2hhciAqZGVjb2RlZF9ieXRlczsKKyAgc2l6ZV90IG51bV9kZWNvZGVkX2J5dGVzOworICBHc3RGbG93UmV0dXJuIHJldHZhbDsKKworICBtcGcxMjNfZGVjb2RlciA9IEdTVF9NUEcxMjNfQVVESU9fREVDIChkZWMpOworCisgIGdfYXNzZXJ0IChtcGcxMjNfZGVjb2Rlci0+aGFuZGxlICE9IE5VTEwpOworCisgIC8qIFRoZSBhY3R1YWwgZGVjb2RpbmcgKi8KKyAgeworICAgIC8qIGZlZWQgaW5wdXQgZGF0YSAoaWYgdGhlcmUgaXMgYW55KSAqLworICAgIGlmIChHX0xJS0VMWSAoaW5wdXRfYnVmZmVyICE9IE5VTEwpKSB7CisgICAgICBHc3RNYXBJbmZvIGluZm87CisKKyAgICAgIGlmIChnc3RfYnVmZmVyX21hcCAoaW5wdXRfYnVmZmVyLCAmaW5mbywgR1NUX01BUF9SRUFEKSkgeworICAgICAgICBtcGcxMjNfZmVlZCAobXBnMTIzX2RlY29kZXItPmhhbmRsZSwgaW5mby5kYXRhLCBpbmZvLnNpemUpOworICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChpbnB1dF9idWZmZXIsICZpbmZvKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9BVURJT19ERUNPREVSX0VSUk9SIChtcGcxMjNfZGVjb2RlciwgMSwgUkVTT1VSQ0UsIFJFQUQsIChOVUxMKSwKKyAgICAgICAgICAgICgiZ3N0X21lbW9yeV9tYXAoKSBmYWlsZWQiKSwgcmV0dmFsKTsKKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUcnkgdG8gZGVjb2RlIGEgZnJhbWUgKi8KKyAgICBkZWNvZGVkX2J5dGVzID0gTlVMTDsKKyAgICBudW1fZGVjb2RlZF9ieXRlcyA9IDA7CisgICAgZGVjb2RlX2Vycm9yID0gbXBnMTIzX2RlY29kZV9mcmFtZSAobXBnMTIzX2RlY29kZXItPmhhbmRsZSwKKyAgICAgICAgJm1wZzEyM19kZWNvZGVyLT5mcmFtZV9vZmZzZXQsICZkZWNvZGVkX2J5dGVzLCAmbnVtX2RlY29kZWRfYnl0ZXMpOworICB9CisKKyAgcmV0dmFsID0gR1NUX0ZMT1dfT0s7CisKKyAgc3dpdGNoIChkZWNvZGVfZXJyb3IpIHsKKyAgICBjYXNlIE1QRzEyM19ORVdfRk9STUFUOgorICAgICAgLyogQXMgbWVudGlvbmVkIGluIGdzdF9tcGcxMjNfYXVkaW9fZGVjX3NldF9mb3JtYXQoKSwgdGhlIG5leHQgYXVkaW9pbmZvCisgICAgICAgKiBpcyBub3Qgc2V0IGltbWVkaWF0ZWx5OyBpbnN0ZWFkLCB0aGUgY29kZSB3YWl0cyBmb3IgbXBnMTIzIHRvIHRha2UKKyAgICAgICAqIG5vdGUgb2YgdGhlIG5ldyBmb3JtYXQsIGFuZCB0aGVuIHNldHMgdGhlIGF1ZGlvaW5mby4gVGhpcyBmaXhlcyBnbGl0Y2hlcworICAgICAgICogd2l0aCBtcDNzIGNvbnRhaW5pbmcgc2V2ZXJhbCBmb3JtYXQgaGVhZGVycyAoZm9yIGV4YW1wbGUsIGZpcnN0IGhhbGYKKyAgICAgICAqIHVzaW5nIDQ0LjFrSHosIHNlY29uZCBoYWxmIDMyIGtIeikgKi8KKworICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlYywKKyAgICAgICAgICAibXBnMTIzIHJlcG9ydGVkIGEgbmV3IGZvcm1hdCAtPiBzZXR0aW5nIG5leHQgc3JjY2FwcyIpOworCisgICAgICBnc3RfbXBnMTIzX2F1ZGlvX2RlY19wdXNoX2RlY29kZWRfYnl0ZXMgKG1wZzEyM19kZWNvZGVyLCBkZWNvZGVkX2J5dGVzLAorICAgICAgICAgIG51bV9kZWNvZGVkX2J5dGVzKTsKKworICAgICAgLyogSWYgdGhlcmUgaXMgYSBuZXh0IGF1ZGlvaW5mbywgdXNlIGl0LCB0aGVuIHNldCBoYXNfbmV4dF9hdWRpb2luZm8gdG8KKyAgICAgICAqIEZBTFNFLCB0byBtYWtlIHN1cmUgZ3N0X2F1ZGlvX2RlY29kZXJfc2V0X291dHB1dF9mb3JtYXQoKSBpc24ndCBjYWxsZWQKKyAgICAgICAqIGFnYWluIHVudGlsIHNldF9mb3JtYXQgaXMgY2FsbGVkIGJ5IHRoZSBiYXNlIGNsYXNzICovCisgICAgICBpZiAobXBnMTIzX2RlY29kZXItPmhhc19uZXh0X2F1ZGlvaW5mbykgeworICAgICAgICBpZiAoIWdzdF9hdWRpb19kZWNvZGVyX3NldF9vdXRwdXRfZm9ybWF0IChkZWMsCisgICAgICAgICAgICAgICAgJihtcGcxMjNfZGVjb2Rlci0+bmV4dF9hdWRpb2luZm8pKSkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVjLCAiVW5hYmxlIHRvIHNldCBvdXRwdXQgZm9ybWF0Iik7CisgICAgICAgICAgcmV0dmFsID0gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisgICAgICAgIH0KKyAgICAgICAgbXBnMTIzX2RlY29kZXItPmhhc19uZXh0X2F1ZGlvaW5mbyA9IEZBTFNFOworICAgICAgfQorCisgICAgICBicmVhazsKKworICAgIGNhc2UgTVBHMTIzX05FRURfTU9SRToKKyAgICBjYXNlIE1QRzEyM19PSzoKKyAgICAgIHJldHZhbCA9IGdzdF9tcGcxMjNfYXVkaW9fZGVjX3B1c2hfZGVjb2RlZF9ieXRlcyAobXBnMTIzX2RlY29kZXIsCisgICAgICAgICAgZGVjb2RlZF9ieXRlcywgbnVtX2RlY29kZWRfYnl0ZXMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1QRzEyM19ET05FOgorICAgICAgLyogSWYgdGhpcyBoYXBwZW5zLCB0aGVuIHRoZSB1cHN0cmVhbSBwYXJzZXIgc29tZWhvdyBtaXNzZWQgdGhlIGVuZGluZworICAgICAgICogb2YgdGhlIGJpdHN0cmVhbSAqLworICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlYywgIm1wZzEyMyBpcyBkb25lIGRlY29kaW5nIik7CisgICAgICBnc3RfbXBnMTIzX2F1ZGlvX2RlY19wdXNoX2RlY29kZWRfYnl0ZXMgKG1wZzEyM19kZWNvZGVyLCBkZWNvZGVkX2J5dGVzLAorICAgICAgICAgIG51bV9kZWNvZGVkX2J5dGVzKTsKKyAgICAgIHJldHZhbCA9IEdTVF9GTE9XX0VPUzsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICB7CisgICAgICAvKiBBbnl0aGluZyBlbHNlIGlzIGNvbnNpZGVyZWQgYW4gZXJyb3IgKi8KKyAgICAgIGludCBlcnJjb2RlOworICAgICAgcmV0dmFsID0gR1NUX0ZMT1dfRVJST1I7ICAvKiB1c2UgZXJyb3IgYnkgZGVmYXVsdCAqLworICAgICAgc3dpdGNoIChkZWNvZGVfZXJyb3IpIHsKKyAgICAgICAgY2FzZSBNUEcxMjNfRVJSOgorICAgICAgICAgIGVycmNvZGUgPSBtcGcxMjNfZXJyY29kZSAobXBnMTIzX2RlY29kZXItPmhhbmRsZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZXJyY29kZSA9IGRlY29kZV9lcnJvcjsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoZXJyY29kZSkgeworICAgICAgICBjYXNlIE1QRzEyM19CQURfT1VURk9STUFUOnsKKyAgICAgICAgICBHc3RDYXBzICppbnB1dF9jYXBzID0KKyAgICAgICAgICAgICAgZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChHU1RfQVVESU9fREVDT0RFUl9TSU5LX1BBRCAoZGVjKSk7CisgICAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlYywgU1RSRUFNLCBGT1JNQVQsIChOVUxMKSwKKyAgICAgICAgICAgICAgKCJPdXRwdXQgc2FtcGxlIGZvcm1hdCBjb3VsZCBub3QgYmUgdXNlZCB3aGVuIHRyeWluZyB0byBkZWNvZGUgZnJhbWUuICIKKyAgICAgICAgICAgICAgICAgICJUaGlzIGlzIHR5cGljYWxseSBjYXVzZWQgd2hlbiB0aGUgaW5wdXQgY2FwcyAob2Z0ZW4gdGhlIHNhbXBsZSAiCisgICAgICAgICAgICAgICAgICAicmF0ZSkgZG8gbm90IG1hdGNoIHRoZSBhY3R1YWwgZm9ybWF0IG9mIHRoZSBhdWRpbyBkYXRhLiAiCisgICAgICAgICAgICAgICAgICAiSW5wdXQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGlucHV0X2NhcHMpCisgICAgICAgICAgICAgICk7CisgICAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKGlucHV0X2NhcHMpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6eworICAgICAgICAgIGNoYXIgY29uc3QgKmVycm1zZyA9IG1wZzEyM19wbGFpbl9zdHJlcnJvciAoZXJyY29kZSk7CisgICAgICAgICAgLyogR1NUX0FVRElPX0RFQ09ERVJfRVJST1Igc2V0cyBhIG5ldyByZXR1cm4gdmFsdWUgYWNjb3JkaW5nIHRvCisgICAgICAgICAgICogaXRzIGVzdGltYXRpb25zICovCisgICAgICAgICAgR1NUX0FVRElPX0RFQ09ERVJfRVJST1IgKG1wZzEyM19kZWNvZGVyLCAxLCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLAorICAgICAgICAgICAgICAoIm1wZzEyMyBkZWNvZGluZyBlcnJvcjogJXMiLCBlcnJtc2cpLCByZXR2YWwpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tcGcxMjNfYXVkaW9fZGVjX3NldF9mb3JtYXQgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYywgR3N0Q2FwcyAqIGlucHV0X2NhcHMpCit7CisgIC8qICJlbmNvZGluZyIgaXMgdGhlIHNhbXBsZSBmb3JtYXQgc3BlY2lmaWVyIGZvciBtcGcxMjMgKi8KKyAgaW50IGVuY29kaW5nOworICBpbnQgc2FtcGxlX3JhdGUsIG51bV9jaGFubmVsczsKKyAgR3N0QXVkaW9Gb3JtYXQgZm9ybWF0OworICBHc3RNcGcxMjNBdWRpb0RlYyAqbXBnMTIzX2RlY29kZXI7CisgIGdib29sZWFuIHJldHZhbCA9IEZBTFNFOworCisgIG1wZzEyM19kZWNvZGVyID0gR1NUX01QRzEyM19BVURJT19ERUMgKGRlYyk7CisKKyAgZ19hc3NlcnQgKG1wZzEyM19kZWNvZGVyLT5oYW5kbGUgIT0gTlVMTCk7CisKKyAgbXBnMTIzX2RlY29kZXItPmhhc19uZXh0X2F1ZGlvaW5mbyA9IEZBTFNFOworCisgIC8qIEdldCBzYW1wbGUgcmF0ZSBhbmQgbnVtYmVyIG9mIGNoYW5uZWxzIGZyb20gaW5wdXRfY2FwcyAqLworICB7CisgICAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgICAgZ2Jvb2xlYW4gZXJyID0gRkFMU0U7CisKKyAgICAvKiBPbmx5IHRoZSBmaXJzdCBzdHJ1Y3R1cmUgaXMgdXNlZCAobXVsdGlwbGUKKyAgICAgKiBpbnB1dCBjYXBzIHN0cnVjdHVyZXMgZG9uJ3QgbWFrZSBzZW5zZSAqLworICAgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGlucHV0X2NhcHMsIDApOworCisgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgInJhdGUiLCAmc2FtcGxlX3JhdGUpKSB7CisgICAgICBlcnIgPSBUUlVFOworICAgICAgR1NUX0VSUk9SX09CSkVDVCAoZGVjLCAiSW5wdXQgY2FwcyBkbyBub3QgaGF2ZSBhIHJhdGUgdmFsdWUiKTsKKyAgICB9CisgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNoYW5uZWxzIiwgJm51bV9jaGFubmVscykpIHsKKyAgICAgIGVyciA9IFRSVUU7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChkZWMsICJJbnB1dCBjYXBzIGRvIG5vdCBoYXZlIGEgY2hhbm5lbCB2YWx1ZSIpOworICAgIH0KKworICAgIGlmIChHX1VOTElLRUxZIChlcnIpKQorICAgICAgZ290byBkb25lOworICB9CisKKyAgLyogR2V0IHNhbXBsZSBmb3JtYXQgZnJvbSB0aGUgYWxsb3dlZCBzcmMgY2FwcyAqLworICB7CisgICAgR3N0Q2FwcyAqYWxsb3dlZF9zcmNjYXBzID0KKyAgICAgICAgZ3N0X3BhZF9nZXRfYWxsb3dlZF9jYXBzIChHU1RfQVVESU9fREVDT0RFUl9TUkNfUEFEIChkZWMpKTsKKworICAgIGlmIChhbGxvd2VkX3NyY2NhcHMgPT0gTlVMTCkgeworICAgICAgLyogc3JjcGFkIGlzIG5vdCBsaW5rZWQgKHlldCksIHNvIG5vIHBlZXIgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlOworICAgICAgICoganVzdCB1c2UgdGhlIGRlZmF1bHQgc2FtcGxlIGZvcm1hdCAoMTYgYml0IHNpZ25lZCBpbnRlZ2VyKSAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXBnMTIzX2RlY29kZXIsCisgICAgICAgICAgInNyY3BhZCBpcyBub3QgbGlua2VkICh5ZXQpIC0+IHVzaW5nIFMxNiBzYW1wbGUgZm9ybWF0Iik7CisgICAgICBmb3JtYXQgPSBHU1RfQVVESU9fRk9STUFUX1MxNjsKKyAgICAgIGVuY29kaW5nID0gTVBHMTIzX0VOQ19TSUdORURfMTY7CisgICAgfSBlbHNlIGlmIChnc3RfY2Fwc19pc19lbXB0eSAoYWxsb3dlZF9zcmNjYXBzKSkgeworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGFsbG93ZWRfc3JjY2Fwcyk7CisgICAgICBnb3RvIGRvbmU7CisgICAgfSBlbHNlIHsKKyAgICAgIGdjaGFyIGNvbnN0ICpmb3JtYXRfc3RyOworICAgICAgR1ZhbHVlIGNvbnN0ICpmb3JtYXRfdmFsdWU7CisKKyAgICAgIC8qIExvb2sgYXQgdGhlIHNhbXBsZSBmb3JtYXQgdmFsdWVzIGZyb20gdGhlIGZpcnN0IHN0cnVjdHVyZSAqLworICAgICAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChhbGxvd2VkX3NyY2NhcHMsIDApOworICAgICAgZm9ybWF0X3ZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImZvcm1hdCIpOworCisgICAgICBpZiAoZm9ybWF0X3ZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKGFsbG93ZWRfc3JjY2Fwcyk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0gZWxzZSBpZiAoR1NUX1ZBTFVFX0hPTERTX0xJU1QgKGZvcm1hdF92YWx1ZSkpIHsKKyAgICAgICAgLyogaWYgdmFsdWUgaXMgYSBmb3JtYXQgbGlzdCwgcGljayB0aGUgZmlyc3QgZW50cnkgKi8KKyAgICAgICAgR1ZhbHVlIGNvbnN0ICpmbXRfbGlzdF92YWx1ZSA9CisgICAgICAgICAgICBnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUgKGZvcm1hdF92YWx1ZSwgMCk7CisgICAgICAgIGZvcm1hdF9zdHIgPSBnX3ZhbHVlX2dldF9zdHJpbmcgKGZtdF9saXN0X3ZhbHVlKTsKKyAgICAgIH0gZWxzZSBpZiAoR19WQUxVRV9IT0xEU19TVFJJTkcgKGZvcm1hdF92YWx1ZSkpIHsKKyAgICAgICAgLyogaWYgdmFsdWUgaXMgYSBzdHJpbmcsIHVzZSBpdCBkaXJlY3RseSAqLworICAgICAgICBmb3JtYXRfc3RyID0gZ192YWx1ZV9nZXRfc3RyaW5nIChmb3JtYXRfdmFsdWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAobXBnMTIzX2RlY29kZXIsICJ1bmV4cGVjdGVkIHR5cGUgZm9yICdmb3JtYXQnIGZpZWxkICIKKyAgICAgICAgICAgICJpbiBjYXBzIHN0cnVjdHVyZSAlIiBHU1RfUFRSX0ZPUk1BVCwgc3RydWN0dXJlKTsKKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKGFsbG93ZWRfc3JjY2Fwcyk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKworICAgICAgLyogZ2V0IHRoZSBmb3JtYXQgdmFsdWUgZnJvbSB0aGUgc3RyaW5nICovCisgICAgICBmb3JtYXQgPSBnc3RfYXVkaW9fZm9ybWF0X2Zyb21fc3RyaW5nIChmb3JtYXRfc3RyKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChhbGxvd2VkX3NyY2NhcHMpOworCisgICAgICBnX2Fzc2VydCAoZm9ybWF0ICE9IEdTVF9BVURJT19GT1JNQVRfVU5LTk9XTik7CisKKyAgICAgIC8qIGNvbnZlcnQgZm9ybWF0IHRvIG1wZzEyMyBlbmNvZGluZyAqLworICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MxNjoKKyAgICAgICAgICBlbmNvZGluZyA9IE1QRzEyM19FTkNfU0lHTkVEXzE2OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzI0OgorICAgICAgICAgIGVuY29kaW5nID0gTVBHMTIzX0VOQ19TSUdORURfMjQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMzI6CisgICAgICAgICAgZW5jb2RpbmcgPSBNUEcxMjNfRU5DX1NJR05FRF8zMjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1UxNjoKKyAgICAgICAgICBlbmNvZGluZyA9IE1QRzEyM19FTkNfVU5TSUdORURfMTY7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9VMjQ6CisgICAgICAgICAgZW5jb2RpbmcgPSBNUEcxMjNfRU5DX1VOU0lHTkVEXzI0OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfVTMyOgorICAgICAgICAgIGVuY29kaW5nID0gTVBHMTIzX0VOQ19VTlNJR05FRF8zMjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX0YzMjoKKyAgICAgICAgICBlbmNvZGluZyA9IE1QRzEyM19FTkNfRkxPQVRfMzI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICAgICAgZ290byBkb25lOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFNhbXBsZSByYXRlLCBudW1iZXIgb2YgY2hhbm5lbHMsIGFuZCBzYW1wbGUgZm9ybWF0IGFyZSBrbm93biBhdCB0aGlzIHBvaW50LgorICAgKiBTZXQgdGhlIGF1ZGlvaW5mbyBzdHJ1Y3R1cmUncyB2YWx1ZXMgYW5kIHRoZSBtcGcxMjMgZm9ybWF0LiAqLworICB7CisgICAgaW50IGVycjsKKworICAgIC8qIGNsZWFyIGFsbCBleGlzdGluZyBmb3JtYXQgc2V0dGluZ3MgZnJvbSB0aGUgbXBnMTIzIGluc3RhbmNlICovCisgICAgbXBnMTIzX2Zvcm1hdF9ub25lIChtcGcxMjNfZGVjb2Rlci0+aGFuZGxlKTsKKyAgICAvKiBzZXQgdGhlIGNob3NlbiBmb3JtYXQgKi8KKyAgICBlcnIgPQorICAgICAgICBtcGcxMjNfZm9ybWF0IChtcGcxMjNfZGVjb2Rlci0+aGFuZGxlLCBzYW1wbGVfcmF0ZSwgbnVtX2NoYW5uZWxzLAorICAgICAgICBlbmNvZGluZyk7CisKKyAgICBpZiAoZXJyICE9IE1QRzEyM19PSykgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZWMsCisgICAgICAgICAgIm1wZzEyM19mb3JtYXQoKSBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICBtcGcxMjNfc3RyZXJyb3IgKG1wZzEyM19kZWNvZGVyLT5oYW5kbGUpKTsKKyAgICB9IGVsc2UgeworICAgICAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoJihtcGcxMjNfZGVjb2Rlci0+bmV4dF9hdWRpb2luZm8pKTsKKyAgICAgIGdzdF9hdWRpb19pbmZvX3NldF9mb3JtYXQgKCYobXBnMTIzX2RlY29kZXItPm5leHRfYXVkaW9pbmZvKSwgZm9ybWF0LAorICAgICAgICAgIHNhbXBsZV9yYXRlLCBudW1fY2hhbm5lbHMsIE5VTEwpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlYywgIlRoZSBuZXh0IGF1ZGlvIGZvcm1hdCBpczogJXMsICV1IEh6LCAldSBjaGFubmVscyIsCisgICAgICAgICAgZ3N0X2F1ZGlvX2Zvcm1hdF90b19zdHJpbmcgKGZvcm1hdCksIHNhbXBsZV9yYXRlLCBudW1fY2hhbm5lbHMpOworICAgICAgbXBnMTIzX2RlY29kZXItPmhhc19uZXh0X2F1ZGlvaW5mbyA9IFRSVUU7CisKKyAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgfQorICB9CisKK2RvbmU6CisgIHJldHVybiByZXR2YWw7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9tcGcxMjNfYXVkaW9fZGVjX2ZsdXNoIChHc3RBdWRpb0RlY29kZXIgKiBkZWMsIGdib29sZWFuIGhhcmQpCit7CisgIGludCBlcnJvcjsKKyAgR3N0TXBnMTIzQXVkaW9EZWMgKm1wZzEyM19kZWNvZGVyOworCisgIEdTVF9MT0dfT0JKRUNUIChkZWMsICJGbHVzaGluZyBkZWNvZGVyIik7CisKKyAgbXBnMTIzX2RlY29kZXIgPSBHU1RfTVBHMTIzX0FVRElPX0RFQyAoZGVjKTsKKworICBnX2Fzc2VydCAobXBnMTIzX2RlY29kZXItPmhhbmRsZSAhPSBOVUxMKTsKKworICAvKiBGbHVzaCBieSByZW9wZW5pbmcgdGhlIGZlZWQgKi8KKyAgbXBnMTIzX2Nsb3NlIChtcGcxMjNfZGVjb2Rlci0+aGFuZGxlKTsKKyAgZXJyb3IgPSBtcGcxMjNfb3Blbl9mZWVkIChtcGcxMjNfZGVjb2Rlci0+aGFuZGxlKTsKKworICBpZiAoR19VTkxJS0VMWSAoZXJyb3IgIT0gTVBHMTIzX09LKSkgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZWMsIExJQlJBUlksIElOSVQsIChOVUxMKSwKKyAgICAgICAgKCJFcnJvciB3aGlsZSByZW9wZW5pbmcgbXBnMTIzIGZlZWQ6ICVzIiwKKyAgICAgICAgICAgIG1wZzEyM19wbGFpbl9zdHJlcnJvciAoZXJyb3IpKSk7CisgICAgbXBnMTIzX2Nsb3NlIChtcGcxMjNfZGVjb2Rlci0+aGFuZGxlKTsKKyAgICBtcGcxMjNfZGVsZXRlIChtcGcxMjNfZGVjb2Rlci0+aGFuZGxlKTsKKyAgICBtcGcxMjNfZGVjb2Rlci0+aGFuZGxlID0gTlVMTDsKKyAgfQorCisgIGlmIChoYXJkKQorICAgIG1wZzEyM19kZWNvZGVyLT5oYXNfbmV4dF9hdWRpb2luZm8gPSBGQUxTRTsKKworICAvKiBvcGVuaW5nL2Nsb3NpbmcgZmVlZHMgZG8gbm90IGFmZmVjdCB0aGUgZm9ybWF0IGRlZmluZWQgYnkgdGhlCisgICAqIG1wZzEyM19mb3JtYXQoKSBjYWxsIHRoYXQgd2FzIG1hZGUgaW4gZ3N0X21wZzEyM19hdWRpb19kZWNfc2V0X2Zvcm1hdCgpLAorICAgKiBhbmQgc2luY2UgdGhlIHVwL2Rvd25zdHJlYW0gY2FwcyBhcmUgbm90IGV4cGVjdGVkIHRvIGNoYW5nZSBoZXJlLCBubworICAgKiBtcGcxMjNfZm9ybWF0KCkgY2FsbHMgYXJlIGRvbmUgKi8KK30KKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIm1wZzEyM2F1ZGlvZGVjIiwKKyAgICAgIEdTVF9SQU5LX01BUkdJTkFMLCBnc3RfbXBnMTIzX2F1ZGlvX2RlY19nZXRfdHlwZSAoKSk7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBtcGcxMjMsICJtcDMgZGVjb2RpbmcgYmFzZWQgb24gdGhlIG1wZzEyMyBsaWJyYXJ5IiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgIkxHUEwiLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9leHQvbXBnMTIzL2dzdG1wZzEyM2F1ZGlvZGVjLmggYi9leHQvbXBnMTIzL2dzdG1wZzEyM2F1ZGlvZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2NWM0MQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tcGcxMjMvZ3N0bXBnMTIzYXVkaW9kZWMuaApAQCAtMCwwICsxLDc0IEBACisvKiAgTVAzIGRlY29kaW5nIHBsdWdpbiBmb3IgR1N0cmVhbWVyIHVzaW5nIHRoZSBtcGcxMjMgbGlicmFyeQorICogIENvcHlyaWdodCAoQykgMjAxMiBDYXJsb3MgUmFmYWVsIEdpYW5pCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBfX0dTVF9NUEcxMjNfQVVESU9fREVDX0hfXworI2RlZmluZSBfX0dTVF9NUEcxMjNfQVVESU9fREVDX0hfXworCisvKiBUaGlzIGlzIHdoYXQgdGhlIHZpc3VhbCBzdHVkaW8gYnVpbGQgaW4gbXBnMTIzIGRvZXMgYmVmb3JlIGluY2x1ZGluZyB0aGUKKyAqIG9yaWdpbmFsIGhlYWRlciBmaWxlLiBXaXRob3V0IHRoaXMgd2UgZ2V0IHN5bnRheCBlcnJvcnMgaW4gdGhlCisgKiByZXBsYWNlX3JlYWRlciBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgYmVjYXVzZSBpdCBkb2Vzbid0IGtub3cgc3NpemVfdCBldGMuCisgKiBJdCBkb2Vzbid0IHJlYWx5IG1hdHRlciBmb3IgdXMgaWYgdGhlIHNzaXplX3QgdHlwZWRlZiBoZXJlIGlzIGNvcnJlY3QuICovCisjaWZkZWYgX01TQ19WRVIKKyNpbmNsdWRlIDx0Y2hhci5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgordHlwZWRlZiBsb25nIHNzaXplX3Q7CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9kZWNvZGVyLmg+CisjaW5jbHVkZSA8bXBnMTIzLmg+CisKKworR19CRUdJTl9ERUNMUworCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RNcGcxMjNBdWRpb0RlYyBHc3RNcGcxMjNBdWRpb0RlYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RNcGcxMjNBdWRpb0RlY0NsYXNzIEdzdE1wZzEyM0F1ZGlvRGVjQ2xhc3M7CisKKworI2RlZmluZSBHU1RfVFlQRV9NUEcxMjNfQVVESU9fREVDICAgICAgICAgICAgIChnc3RfbXBnMTIzX2F1ZGlvX2RlY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfTVBHMTIzX0FVRElPX0RFQyhvYmopICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSwgR1NUX1RZUEVfTVBHMTIzX0FVRElPX0RFQyxHc3RNcGcxMjNBdWRpb0RlYykpCisjZGVmaW5lIEdTVF9NUEcxMjNfQVVESU9fREVDX0NMQVNTKGtsYXNzKSAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksIEdTVF9UWVBFX01QRzEyM19BVURJT19ERUMsR3N0TXBnMTIzQXVkaW9EZWNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19NUEcxMjNfQVVESU9fREVDKG9iaikgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLCBHU1RfVFlQRV9NUEcxMjNfQVVESU9fREVDKSkKKyNkZWZpbmUgR1NUX0lTX01QRzEyM19BVURJT19ERUNfQ0xBU1Moa2xhc3MpICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSwgR1NUX1RZUEVfTVBHMTIzX0FVRElPX0RFQykpCisKK3N0cnVjdCBfR3N0TXBnMTIzQXVkaW9EZWMKK3sKKyAgR3N0QXVkaW9EZWNvZGVyIHBhcmVudDsKKworICBtcGcxMjNfaGFuZGxlICpoYW5kbGU7CisKKyAgR3N0QXVkaW9JbmZvIG5leHRfYXVkaW9pbmZvOworICBnYm9vbGVhbiBoYXNfbmV4dF9hdWRpb2luZm87CisKKyAgb2ZmX3QgZnJhbWVfb2Zmc2V0OworfTsKKworCitzdHJ1Y3QgX0dzdE1wZzEyM0F1ZGlvRGVjQ2xhc3MKK3sKKyAgR3N0QXVkaW9EZWNvZGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR19HTlVDX0lOVEVSTkFMIEdUeXBlIGdzdF9tcGcxMjNfYXVkaW9fZGVjX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHQvbXBnMTIzL21lc29uLmJ1aWxkIGIvZXh0L21wZzEyMy9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODkxZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L21wZzEyMy9tZXNvbi5idWlsZApAQCAtMCwwICsxLDEyIEBACittcGcxMjNfZGVwID0gZGVwZW5kZW5jeSgnbGlibXBnMTIzJywgdmVyc2lvbiA6ICc+PSAxLjMnLCByZXF1aXJlZCA6IGZhbHNlKQorCitpZiBtcGcxMjNfZGVwLmZvdW5kKCkKKyAgZ3N0bXBnMTIzID0gbGlicmFyeSgnZ3N0bXBnMTIzJywKKyAgICAnZ3N0bXBnMTIzYXVkaW9kZWMuYycsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgICBkZXBlbmRlbmNpZXMgOiBbZ3N0YXVkaW9fZGVwLCBtcGcxMjNfZGVwXSwKKyAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCisgICkKK2VuZGlmCmRpZmYgLS1naXQgYS9leHQvcHVsc2UvTWFrZWZpbGUuYW0gYi9leHQvcHVsc2UvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBlMDAwMgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9wdWxzZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDIxIEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RwdWxzZWF1ZGlvLmxhCisKK2xpYmdzdHB1bHNlYXVkaW9fbGFfU09VUkNFUyA9IFwKKwlwbHVnaW4uYyBcCisJcHVsc2VzaW5rLmMgXAorCXB1bHNlc3JjLmMgXAorCXB1bHNlZGV2aWNlcHJvdmlkZXIuYyBcCisJcHVsc2V1dGlsLmMKKworbGliZ3N0cHVsc2VhdWRpb19sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKFBVTFNFX0NGTEFHUykKK2xpYmdzdHB1bHNlYXVkaW9fbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pIFwKKwktbGdzdHBidXRpbHMtJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoUFVMU0VfTElCUykKK2xpYmdzdHB1bHNlYXVkaW9fbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IFwKKwlwdWxzZXNpbmsuaCBcCisJcHVsc2VzcmMuaCBcCisJcHVsc2VkZXZpY2Vwcm92aWRlci5oIFwKKwlwdWxzZXV0aWwuaAorCmRpZmYgLS1naXQgYS9leHQvcHVsc2UvbWVzb24uYnVpbGQgYi9leHQvcHVsc2UvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY4NWY5MQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9wdWxzZS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDIwIEBACitwdWxzZV9zb3VyY2VzID0gWworICAncGx1Z2luLmMnLAorICAncHVsc2VzaW5rLmMnLAorICAncHVsc2VzcmMuYycsCisgICdwdWxzZWRldmljZXByb3ZpZGVyLmMnLAorICAncHVsc2V1dGlsLmMnLAorXQorCitsaWJwdWxzZV9kZXAgPSBkZXBlbmRlbmN5KCdsaWJwdWxzZScsIHZlcnNpb24gOiAnPj0yLjAnLCByZXF1aXJlZCA6IGZhbHNlKQorCitpZiBsaWJwdWxzZV9kZXAuZm91bmQoKQorICBnc3RwdWxzZSA9IGxpYnJhcnkoJ2dzdHB1bHNlYXVkaW8nLAorICAgIHB1bHNlX3NvdXJjZXMsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgICBkZXBlbmRlbmNpZXMgOiBbZ3N0X2RlcCwgZ3N0YmFzZV9kZXAsIGdzdGF1ZGlvX2RlcCwgZ3N0cGJ1dGlsc19kZXAsIGxpYnB1bHNlX2RlcF0sCisgICAgaW5zdGFsbCA6IHRydWUsCisgICAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorICApCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L3B1bHNlL3BsdWdpbi5jIGIvZXh0L3B1bHNlL3BsdWdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYzhmZTUKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcHVsc2UvcGx1Z2luLmMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqICBHU3RyZWFtZXIgcHVsc2VhdWRpbyBwbHVnaW4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA0LTIwMDggTGVubmFydCBQb2V0dGVyaW5nCisgKgorICogIGdzdC1wdWxzZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICogIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIGdzdC1wdWxzZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggZ3N0LXB1bHNlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEKKyAqICBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC1pMThuLXBsdWdpbi5oPgorCisjaW5jbHVkZSAicHVsc2VzaW5rLmgiCisjaW5jbHVkZSAicHVsc2VzcmMuaCIKKyNpbmNsdWRlICJwdWxzZWRldmljZXByb3ZpZGVyLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWSAocHVsc2VfZGVidWcpOworCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisjaWZkZWYgRU5BQkxFX05MUworICBHU1RfREVCVUcgKCJiaW5kaW5nIHRleHQgZG9tYWluICVzIHRvIGxvY2FsZSBkaXIgJXMiLCBHRVRURVhUX1BBQ0tBR0UsCisgICAgICBMT0NBTEVESVIpOworICBiaW5kdGV4dGRvbWFpbiAoR0VUVEVYVF9QQUNLQUdFLCBMT0NBTEVESVIpOworICBiaW5kX3RleHRkb21haW5fY29kZXNldCAoR0VUVEVYVF9QQUNLQUdFLCAiVVRGLTgiKTsKKyNlbmRpZgorCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInB1bHNlc2luayIsIEdTVF9SQU5LX1BSSU1BUlkgKyAxMCwKKyAgICAgICAgICBHU1RfVFlQRV9QVUxTRVNJTkspKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJwdWxzZXNyYyIsIEdTVF9SQU5LX1BSSU1BUlkgKyAxMCwKKyAgICAgICAgICBHU1RfVFlQRV9QVUxTRVNSQykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X2RldmljZV9wcm92aWRlcl9yZWdpc3RlciAocGx1Z2luLCAicHVsc2VkZXZpY2Vwcm92aWRlciIsCisgICAgICAgICAgR1NUX1JBTktfUFJJTUFSWSwgR1NUX1RZUEVfUFVMU0VfREVWSUNFX1BST1ZJREVSKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHB1bHNlX2RlYnVnLCAicHVsc2UiLCAwLCAiUHVsc2VBdWRpbyBlbGVtZW50cyIpOworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHB1bHNlYXVkaW8sCisgICAgIlB1bHNlQXVkaW8gcGx1Z2luIGxpYnJhcnkiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2V4dC9wdWxzZS9wdWxzZWRldmljZXByb3ZpZGVyLmMgYi9leHQvcHVsc2UvcHVsc2VkZXZpY2Vwcm92aWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOTY0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcHVsc2UvcHVsc2VkZXZpY2Vwcm92aWRlci5jCkBAIC0wLDAgKzEsNjkwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMiBPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisgKgorICogcHVsc2VkZXZpY2Vwcm92aWRlci5jOiBwdWxzZWF1ZGlvIGRldmljZSBwcm9iaW5nIGFuZCBtb25pdG9yaW5nCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAicHVsc2VkZXZpY2Vwcm92aWRlci5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJwdWxzZXNyYy5oIgorI2luY2x1ZGUgInB1bHNlc2luay5oIgorI2luY2x1ZGUgInB1bHNldXRpbC5oIgorCisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKHB1bHNlX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHB1bHNlX2RlYnVnCisKKworc3RhdGljIEdzdERldmljZSAqZ3N0X3B1bHNlX2RldmljZV9uZXcgKGd1aW50IGlkLAorICAgIGNvbnN0IGdjaGFyICogZGV2aWNlX25hbWUsIEdzdENhcHMgKiBjYXBzLCBjb25zdCBnY2hhciAqIGludGVybmFsX25hbWUsCisgICAgR3N0UHVsc2VEZXZpY2VUeXBlIHR5cGUsIEdzdFN0cnVjdHVyZSAqIHByb3BlcnRpZXMpOworCitHX0RFRklORV9UWVBFIChHc3RQdWxzZURldmljZVByb3ZpZGVyLCBnc3RfcHVsc2VfZGV2aWNlX3Byb3ZpZGVyLAorICAgIEdTVF9UWVBFX0RFVklDRV9QUk9WSURFUik7CisKK3N0YXRpYyB2b2lkIGdzdF9wdWxzZV9kZXZpY2VfcHJvdmlkZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X3B1bHNlX2RldmljZV9wcm92aWRlcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcHVsc2VfZGV2aWNlX3Byb3ZpZGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworCitzdGF0aWMgR0xpc3QgKmdzdF9wdWxzZV9kZXZpY2VfcHJvdmlkZXJfcHJvYmUgKEdzdERldmljZVByb3ZpZGVyICogcHJvdmlkZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9wdWxzZV9kZXZpY2VfcHJvdmlkZXJfc3RhcnQgKEdzdERldmljZVByb3ZpZGVyICogcHJvdmlkZXIpOworc3RhdGljIHZvaWQgZ3N0X3B1bHNlX2RldmljZV9wcm92aWRlcl9zdG9wIChHc3REZXZpY2VQcm92aWRlciAqIHByb3ZpZGVyKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfU0VSVkVSLAorICBQUk9QX0NMSUVOVF9OQU1FLAorICBQUk9QX0xBU1QKK307CisKKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZV9kZXZpY2VfcHJvdmlkZXJfY2xhc3NfaW5pdCAoR3N0UHVsc2VEZXZpY2VQcm92aWRlckNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIEdzdERldmljZVByb3ZpZGVyQ2xhc3MgKmRtX2NsYXNzID0gR1NUX0RFVklDRV9QUk9WSURFUl9DTEFTUyAoa2xhc3MpOworICBnY2hhciAqY2xpZW50X25hbWU7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3B1bHNlX2RldmljZV9wcm92aWRlcl9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9wdWxzZV9kZXZpY2VfcHJvdmlkZXJfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9wdWxzZV9kZXZpY2VfcHJvdmlkZXJfZmluYWxpemU7CisKKyAgZG1fY2xhc3MtPnByb2JlID0gZ3N0X3B1bHNlX2RldmljZV9wcm92aWRlcl9wcm9iZTsKKyAgZG1fY2xhc3MtPnN0YXJ0ID0gZ3N0X3B1bHNlX2RldmljZV9wcm92aWRlcl9zdGFydDsKKyAgZG1fY2xhc3MtPnN0b3AgPSBnc3RfcHVsc2VfZGV2aWNlX3Byb3ZpZGVyX3N0b3A7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfU0VSVkVSLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInNlcnZlciIsICJTZXJ2ZXIiLAorICAgICAgICAgICJUaGUgUHVsc2VBdWRpbyBzZXJ2ZXIgdG8gY29ubmVjdCB0byIsIE5VTEwsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgY2xpZW50X25hbWUgPSBnc3RfcHVsc2VfY2xpZW50X25hbWUgKCk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX0NMSUVOVF9OQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImNsaWVudC1uYW1lIiwgIkNsaWVudCBOYW1lIiwKKyAgICAgICAgICAiVGhlIFB1bHNlQXVkaW8gY2xpZW50X25hbWVfdG9fdXNlIiwgY2xpZW50X25hbWUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwKKyAgICAgICAgICBHU1RfUEFSQU1fTVVUQUJMRV9SRUFEWSkpOworICBnX2ZyZWUgKGNsaWVudF9uYW1lKTsKKworICBnc3RfZGV2aWNlX3Byb3ZpZGVyX2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGRtX2NsYXNzLAorICAgICAgIlB1bHNlQXVkaW8gRGV2aWNlIFByb3ZpZGVyIiwgIlNpbmsvU291cmNlL0F1ZGlvIiwKKyAgICAgICJMaXN0IGFuZCBwcm92aWRlciBQdWxzZUF1ZGlvIHNvdXJjZSBhbmQgc2luayBkZXZpY2VzIiwKKyAgICAgICJPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VfZGV2aWNlX3Byb3ZpZGVyX2luaXQgKEdzdFB1bHNlRGV2aWNlUHJvdmlkZXIgKiBzZWxmKQoreworICBzZWxmLT5jbGllbnRfbmFtZSA9IGdzdF9wdWxzZV9jbGllbnRfbmFtZSAoKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZV9kZXZpY2VfcHJvdmlkZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFB1bHNlRGV2aWNlUHJvdmlkZXIgKnNlbGYgPSBHU1RfUFVMU0VfREVWSUNFX1BST1ZJREVSIChvYmplY3QpOworCisgIGdfZnJlZSAoc2VsZi0+Y2xpZW50X25hbWUpOworICBnX2ZyZWUgKHNlbGYtPnNlcnZlcik7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKGdzdF9wdWxzZV9kZXZpY2VfcHJvdmlkZXJfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZV9kZXZpY2VfcHJvdmlkZXJfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFB1bHNlRGV2aWNlUHJvdmlkZXIgKnNlbGYgPSBHU1RfUFVMU0VfREVWSUNFX1BST1ZJREVSIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TRVJWRVI6CisgICAgICBnX2ZyZWUgKHNlbGYtPnNlcnZlcik7CisgICAgICBzZWxmLT5zZXJ2ZXIgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTElFTlRfTkFNRToKKyAgICAgIGdfZnJlZSAoc2VsZi0+Y2xpZW50X25hbWUpOworICAgICAgaWYgKCFnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICAgICAiRW1wdHkgUHVsc2VBdWRpbyBjbGllbnQgbmFtZSBub3QgYWxsb3dlZC4gIgorICAgICAgICAgICAgIlJlc2V0dGluZyB0byBkZWZhdWx0IHZhbHVlIik7CisgICAgICAgIHNlbGYtPmNsaWVudF9uYW1lID0gZ3N0X3B1bHNlX2NsaWVudF9uYW1lICgpOworICAgICAgfSBlbHNlCisgICAgICAgIHNlbGYtPmNsaWVudF9uYW1lID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VfZGV2aWNlX3Byb3ZpZGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RQdWxzZURldmljZVByb3ZpZGVyICpzZWxmID0gR1NUX1BVTFNFX0RFVklDRV9QUk9WSURFUiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU0VSVkVSOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc2VsZi0+c2VydmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTElFTlRfTkFNRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNlbGYtPmNsaWVudF9uYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NvbnRleHRfc3RhdGVfY2IgKHBhX2NvbnRleHQgKiBjLCB2b2lkICp1c2VyZGF0YSkKK3sKKyAgR3N0UHVsc2VEZXZpY2VQcm92aWRlciAqc2VsZiA9IHVzZXJkYXRhOworCisgIHN3aXRjaCAocGFfY29udGV4dF9nZXRfc3RhdGUgKGMpKSB7CisgICAgY2FzZSBQQV9DT05URVhUX1JFQURZOgorICAgIGNhc2UgUEFfQ09OVEVYVF9URVJNSU5BVEVEOgorICAgIGNhc2UgUEFfQ09OVEVYVF9GQUlMRUQ6CisgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwgKHNlbGYtPm1haW5sb29wLCAwKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBQQV9DT05URVhUX1VOQ09OTkVDVEVEOgorICAgIGNhc2UgUEFfQ09OVEVYVF9DT05ORUNUSU5HOgorICAgIGNhc2UgUEFfQ09OVEVYVF9BVVRIT1JJWklORzoKKyAgICBjYXNlIFBBX0NPTlRFWFRfU0VUVElOR19OQU1FOgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdERldmljZSAqCituZXdfc291cmNlIChjb25zdCBwYV9zb3VyY2VfaW5mbyAqIGluZm8pCit7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdFN0cnVjdHVyZSAqcHJvcHM7CisgIGd1aW50IGk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKworICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+bl9mb3JtYXRzOyBpKyspCisgICAgZ3N0X2NhcHNfYXBwZW5kIChjYXBzLCBnc3RfcHVsc2VfZm9ybWF0X2luZm9fdG9fY2FwcyAoaW5mby0+Zm9ybWF0c1tpXSkpOworCisgIHByb3BzID0gZ3N0X3B1bHNlX21ha2Vfc3RydWN0dXJlIChpbmZvLT5wcm9wbGlzdCk7CisKKyAgcmV0dXJuIGdzdF9wdWxzZV9kZXZpY2VfbmV3IChpbmZvLT5pbmRleCwgaW5mby0+ZGVzY3JpcHRpb24sCisgICAgICBjYXBzLCBpbmZvLT5uYW1lLCBHU1RfUFVMU0VfREVWSUNFX1RZUEVfU09VUkNFLCBwcm9wcyk7Cit9CisKK3N0YXRpYyBHc3REZXZpY2UgKgorbmV3X3NpbmsgKGNvbnN0IHBhX3NpbmtfaW5mbyAqIGluZm8pCit7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdFN0cnVjdHVyZSAqcHJvcHM7CisgIGd1aW50IGk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKworICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+bl9mb3JtYXRzOyBpKyspCisgICAgZ3N0X2NhcHNfYXBwZW5kIChjYXBzLCBnc3RfcHVsc2VfZm9ybWF0X2luZm9fdG9fY2FwcyAoaW5mby0+Zm9ybWF0c1tpXSkpOworCisgIHByb3BzID0gZ3N0X3B1bHNlX21ha2Vfc3RydWN0dXJlIChpbmZvLT5wcm9wbGlzdCk7CisKKyAgcmV0dXJuIGdzdF9wdWxzZV9kZXZpY2VfbmV3IChpbmZvLT5pbmRleCwgaW5mby0+ZGVzY3JpcHRpb24sCisgICAgICBjYXBzLCBpbmZvLT5uYW1lLCBHU1RfUFVMU0VfREVWSUNFX1RZUEVfU0lOSywgcHJvcHMpOworfQorCitzdGF0aWMgdm9pZAorZ2V0X3NvdXJjZV9pbmZvX2NiIChwYV9jb250ZXh0ICogY29udGV4dCwKKyAgICBjb25zdCBwYV9zb3VyY2VfaW5mbyAqIGluZm8sIGludCBlb2wsIHZvaWQgKnVzZXJkYXRhKQoreworICBHc3RQdWxzZURldmljZVByb3ZpZGVyICpzZWxmID0gdXNlcmRhdGE7CisgIEdzdERldmljZSAqZGV2OworCisgIGlmIChlb2wpIHsKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwgKHNlbGYtPm1haW5sb29wLCAwKTsKKyAgICByZXR1cm47CisgIH0KKworICBkZXYgPSBuZXdfc291cmNlIChpbmZvKTsKKworICBpZiAoZGV2KQorICAgIGdzdF9kZXZpY2VfcHJvdmlkZXJfZGV2aWNlX2FkZCAoR1NUX0RFVklDRV9QUk9WSURFUiAoc2VsZiksIGRldik7Cit9CisKK3N0YXRpYyB2b2lkCitnZXRfc2lua19pbmZvX2NiIChwYV9jb250ZXh0ICogY29udGV4dCwKKyAgICBjb25zdCBwYV9zaW5rX2luZm8gKiBpbmZvLCBpbnQgZW9sLCB2b2lkICp1c2VyZGF0YSkKK3sKKyAgR3N0UHVsc2VEZXZpY2VQcm92aWRlciAqc2VsZiA9IHVzZXJkYXRhOworICBHc3REZXZpY2UgKmRldjsKKworICBpZiAoZW9sKSB7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsIChzZWxmLT5tYWlubG9vcCwgMCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZGV2ID0gbmV3X3NpbmsgKGluZm8pOworCisgIGlmIChkZXYpCisgICAgZ3N0X2RldmljZV9wcm92aWRlcl9kZXZpY2VfYWRkIChHU1RfREVWSUNFX1BST1ZJREVSIChzZWxmKSwgZGV2KTsKK30KKworc3RhdGljIHZvaWQKK2NvbnRleHRfc3Vic2NyaWJlX2NiIChwYV9jb250ZXh0ICogY29udGV4dCwgcGFfc3Vic2NyaXB0aW9uX2V2ZW50X3R5cGVfdCB0eXBlLAorICAgIHVpbnQzMl90IGlkeCwgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlRGV2aWNlUHJvdmlkZXIgKnNlbGYgPSB1c2VyZGF0YTsKKyAgR3N0RGV2aWNlUHJvdmlkZXIgKnByb3ZpZGVyID0gdXNlcmRhdGE7CisgIHBhX3N1YnNjcmlwdGlvbl9ldmVudF90eXBlX3QgZmFjaWxpdHkgPQorICAgICAgdHlwZSAmIFBBX1NVQlNDUklQVElPTl9FVkVOVF9GQUNJTElUWV9NQVNLOworICBwYV9zdWJzY3JpcHRpb25fZXZlbnRfdHlwZV90IGV2ZW50X3R5cGUgPQorICAgICAgdHlwZSAmIFBBX1NVQlNDUklQVElPTl9FVkVOVF9UWVBFX01BU0s7CisKKyAgaWYgKGZhY2lsaXR5ICE9IFBBX1NVQlNDUklQVElPTl9FVkVOVF9TT1VSQ0UgJiYKKyAgICAgIGZhY2lsaXR5ICE9IFBBX1NVQlNDUklQVElPTl9FVkVOVF9TSU5LKQorICAgIHJldHVybjsKKworICBpZiAoZXZlbnRfdHlwZSA9PSBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfTkVXKSB7CisgICAgLyogTWljcm9waG9uZSBpbiB0aGUgc291cmNlIG91dHB1dCBoYXMgY2hhbmdlZCAqLworCisgICAgaWYgKGZhY2lsaXR5ID09IFBBX1NVQlNDUklQVElPTl9FVkVOVF9TT1VSQ0UpCisgICAgICBwYV9jb250ZXh0X2dldF9zb3VyY2VfaW5mb19ieV9pbmRleCAoY29udGV4dCwgaWR4LCBnZXRfc291cmNlX2luZm9fY2IsCisgICAgICAgICAgc2VsZik7CisgICAgZWxzZSBpZiAoZmFjaWxpdHkgPT0gUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NJTkspCisgICAgICBwYV9jb250ZXh0X2dldF9zaW5rX2luZm9fYnlfaW5kZXggKGNvbnRleHQsIGlkeCwgZ2V0X3NpbmtfaW5mb19jYiwgc2VsZik7CisgIH0gZWxzZSBpZiAoZXZlbnRfdHlwZSA9PSBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfUkVNT1ZFKSB7CisgICAgR3N0UHVsc2VEZXZpY2UgKmRldiA9IE5VTEw7CisgICAgR0xpc3QgKml0ZW07CisKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKHNlbGYpOworICAgIGZvciAoaXRlbSA9IHByb3ZpZGVyLT5kZXZpY2VzOyBpdGVtOyBpdGVtID0gaXRlbS0+bmV4dCkgeworICAgICAgZGV2ID0gaXRlbS0+ZGF0YTsKKworICAgICAgaWYgKCgoZmFjaWxpdHkgPT0gUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NPVVJDRSAmJgorICAgICAgICAgICAgICAgICAgZGV2LT50eXBlID09IEdTVF9QVUxTRV9ERVZJQ0VfVFlQRV9TT1VSQ0UpIHx8CisgICAgICAgICAgICAgIChmYWNpbGl0eSA9PSBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU0lOSyAmJgorICAgICAgICAgICAgICAgICAgZGV2LT50eXBlID09IEdTVF9QVUxTRV9ERVZJQ0VfVFlQRV9TSU5LKSkgJiYKKyAgICAgICAgICBkZXYtPmRldmljZV9pbmRleCA9PSBpZHgpIHsKKyAgICAgICAgZ3N0X29iamVjdF9yZWYgKGRldik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGV2ID0gTlVMTDsKKyAgICB9CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNlbGYpOworCisgICAgaWYgKGRldikgeworICAgICAgZ3N0X2RldmljZV9wcm92aWRlcl9kZXZpY2VfcmVtb3ZlIChHU1RfREVWSUNFX1BST1ZJREVSIChzZWxmKSwKKyAgICAgICAgICBHU1RfREVWSUNFIChkZXYpKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKGRldik7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitnZXRfc291cmNlX2luZm9fbGlzdF9jYiAocGFfY29udGV4dCAqIGNvbnRleHQsIGNvbnN0IHBhX3NvdXJjZV9pbmZvICogaW5mbywKKyAgICBpbnQgZW9sLCB2b2lkICp1c2VyZGF0YSkKK3sKKyAgR0xpc3QgKipkZXZpY2VzID0gdXNlcmRhdGE7CisKKyAgaWYgKGVvbCkKKyAgICByZXR1cm47CisKKyAgKmRldmljZXMgPSBnX2xpc3RfcHJlcGVuZCAoKmRldmljZXMsIGdzdF9vYmplY3RfcmVmX3NpbmsgKG5ld19zb3VyY2UgKGluZm8pKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnZXRfc2lua19pbmZvX2xpc3RfY2IgKHBhX2NvbnRleHQgKiBjb250ZXh0LCBjb25zdCBwYV9zaW5rX2luZm8gKiBpbmZvLAorICAgIGludCBlb2wsIHZvaWQgKnVzZXJkYXRhKQoreworICBHTGlzdCAqKmRldmljZXMgPSB1c2VyZGF0YTsKKworICBpZiAoZW9sKQorICAgIHJldHVybjsKKworICAqZGV2aWNlcyA9IGdfbGlzdF9wcmVwZW5kICgqZGV2aWNlcywgZ3N0X29iamVjdF9yZWZfc2luayAobmV3X3NpbmsgKGluZm8pKSk7Cit9CisKK3N0YXRpYyBHTGlzdCAqCitnc3RfcHVsc2VfZGV2aWNlX3Byb3ZpZGVyX3Byb2JlIChHc3REZXZpY2VQcm92aWRlciAqIHByb3ZpZGVyKQoreworICBHc3RQdWxzZURldmljZVByb3ZpZGVyICpzZWxmID0gR1NUX1BVTFNFX0RFVklDRV9QUk9WSURFUiAocHJvdmlkZXIpOworICBHTGlzdCAqZGV2aWNlcyA9IE5VTEw7CisgIHBhX21haW5sb29wICptID0gTlVMTDsKKyAgcGFfY29udGV4dCAqYyA9IE5VTEw7CisgIHBhX29wZXJhdGlvbiAqbzsKKworICBpZiAoIShtID0gcGFfbWFpbmxvb3BfbmV3ICgpKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIShjID0gcGFfY29udGV4dF9uZXcgKHBhX21haW5sb29wX2dldF9hcGkgKG0pLCBzZWxmLT5jbGllbnRfbmFtZSkpKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoc2VsZiwgIkZhaWxlZCB0byBjcmVhdGUgY29udGV4dCIpOworICAgIGdvdG8gZmFpbGVkOworICB9CisKKyAgaWYgKHBhX2NvbnRleHRfY29ubmVjdCAoYywgc2VsZi0+c2VydmVyLCAwLCBOVUxMKSA8IDApIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiRmFpbGVkIHRvIGNvbm5lY3Q6ICVzIiwKKyAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHNlbGYtPmNvbnRleHQpKSk7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKworICBmb3IgKDs7KSB7CisgICAgcGFfY29udGV4dF9zdGF0ZV90IHN0YXRlOworCisgICAgc3RhdGUgPSBwYV9jb250ZXh0X2dldF9zdGF0ZSAoYyk7CisKKyAgICBpZiAoIVBBX0NPTlRFWFRfSVNfR09PRCAoc3RhdGUpKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2VsZiwgUkVTT1VSQ0UsIEZBSUxFRCwgKCJGYWlsZWQgdG8gY29ubmVjdDogJXMiLAorICAgICAgICAgICAgICBwYV9zdHJlcnJvciAocGFfY29udGV4dF9lcnJubyAoYykpKSwgKE5VTEwpKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICAgIGlmIChzdGF0ZSA9PSBQQV9DT05URVhUX1JFQURZKQorICAgICAgYnJlYWs7CisKKyAgICAvKiBXYWl0IHVudGlsIHRoZSBjb250ZXh0IGlzIHJlYWR5ICovCisgICAgaWYgKHBhX21haW5sb29wX2l0ZXJhdGUgKG0sIFRSVUUsIE5VTEwpIDwgMCkKKyAgICAgIGdvdG8gZmFpbGVkOworCisgIH0KKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImNvbm5lY3RlZCIpOworCisgIG8gPSBwYV9jb250ZXh0X2dldF9zaW5rX2luZm9fbGlzdCAoYywgZ2V0X3NpbmtfaW5mb19saXN0X2NiLCAmZGV2aWNlcyk7CisgIHdoaWxlIChwYV9vcGVyYXRpb25fZ2V0X3N0YXRlIChvKSA9PSBQQV9PUEVSQVRJT05fUlVOTklORyAmJgorICAgICAgcGFfb3BlcmF0aW9uX2dldF9zdGF0ZSAobykgPT0gUEFfT1BFUkFUSU9OX1JVTk5JTkcpIHsKKyAgICBpZiAocGFfbWFpbmxvb3BfaXRlcmF0ZSAobSwgVFJVRSwgTlVMTCkgPCAwKQorICAgICAgYnJlYWs7CisgIH0KKyAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKworICBvID0gcGFfY29udGV4dF9nZXRfc291cmNlX2luZm9fbGlzdCAoYywgZ2V0X3NvdXJjZV9pbmZvX2xpc3RfY2IsICZkZXZpY2VzKTsKKyAgd2hpbGUgKHBhX29wZXJhdGlvbl9nZXRfc3RhdGUgKG8pID09IFBBX09QRVJBVElPTl9SVU5OSU5HICYmCisgICAgICBwYV9vcGVyYXRpb25fZ2V0X3N0YXRlIChvKSA9PSBQQV9PUEVSQVRJT05fUlVOTklORykgeworICAgIGlmIChwYV9tYWlubG9vcF9pdGVyYXRlIChtLCBUUlVFLCBOVUxMKSA8IDApCisgICAgICBicmVhazsKKyAgfQorICBwYV9vcGVyYXRpb25fdW5yZWYgKG8pOworCisgIHBhX2NvbnRleHRfZGlzY29ubmVjdCAoYyk7CisgIHBhX21haW5sb29wX2ZyZWUgKG0pOworCisgIHJldHVybiBkZXZpY2VzOworCitmYWlsZWQ6CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3B1bHNlX2RldmljZV9wcm92aWRlcl9zdGFydCAoR3N0RGV2aWNlUHJvdmlkZXIgKiBwcm92aWRlcikKK3sKKyAgR3N0UHVsc2VEZXZpY2VQcm92aWRlciAqc2VsZiA9IEdTVF9QVUxTRV9ERVZJQ0VfUFJPVklERVIgKHByb3ZpZGVyKTsKKyAgcGFfb3BlcmF0aW9uICppbml0aWFsX29wZXJhdGlvbjsKKworICBpZiAoIShzZWxmLT5tYWlubG9vcCA9IHBhX3RocmVhZGVkX21haW5sb29wX25ldyAoKSkpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiQ291bGQgbm90IGNyZWF0ZSBwdWxzZWF1ZGlvIG1haW5sb29wIik7CisgICAgZ290byBtYWlubG9vcF9mYWlsZWQ7CisgIH0KKyAgaWYgKHBhX3RocmVhZGVkX21haW5sb29wX3N0YXJ0IChzZWxmLT5tYWlubG9vcCkgPCAwKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoc2VsZiwgIkNvdWxkIG5vdCBzdGFydCBwdWxzZWF1ZGlvIG1haW5sb29wIik7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfZnJlZSAoc2VsZi0+bWFpbmxvb3ApOworICAgIHNlbGYtPm1haW5sb29wID0gTlVMTDsKKyAgICBnb3RvIG1haW5sb29wX2ZhaWxlZDsKKyAgfQorCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKHNlbGYtPm1haW5sb29wKTsKKworICBpZiAoIShzZWxmLT5jb250ZXh0ID0KKyAgICAgICAgICBwYV9jb250ZXh0X25ldyAocGFfdGhyZWFkZWRfbWFpbmxvb3BfZ2V0X2FwaSAoc2VsZi0+bWFpbmxvb3ApLAorICAgICAgICAgICAgICBzZWxmLT5jbGllbnRfbmFtZSkpKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoc2VsZiwgIkZhaWxlZCB0byBjcmVhdGUgY29udGV4dCIpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9CisKKyAgcGFfY29udGV4dF9zZXRfc3RhdGVfY2FsbGJhY2sgKHNlbGYtPmNvbnRleHQsIGNvbnRleHRfc3RhdGVfY2IsIHNlbGYpOworICBwYV9jb250ZXh0X3NldF9zdWJzY3JpYmVfY2FsbGJhY2sgKHNlbGYtPmNvbnRleHQsIGNvbnRleHRfc3Vic2NyaWJlX2NiLCBzZWxmKTsKKworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJjb25uZWN0IHRvIHNlcnZlciAlcyIsIEdTVF9TVFJfTlVMTCAoc2VsZi0+c2VydmVyKSk7CisKKyAgaWYgKHBhX2NvbnRleHRfY29ubmVjdCAoc2VsZi0+Y29udGV4dCwgc2VsZi0+c2VydmVyLCAwLCBOVUxMKSA8IDApIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiRmFpbGVkIHRvIGNvbm5lY3Q6ICVzIiwKKyAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHNlbGYtPmNvbnRleHQpKSk7CisgICAgZ290byB1bmxvY2tfYW5kX2ZhaWw7CisgIH0KKworICBmb3IgKDs7KSB7CisgICAgcGFfY29udGV4dF9zdGF0ZV90IHN0YXRlOworCisgICAgc3RhdGUgPSBwYV9jb250ZXh0X2dldF9zdGF0ZSAoc2VsZi0+Y29udGV4dCk7CisKKyAgICBpZiAoIVBBX0NPTlRFWFRfSVNfR09PRCAoc3RhdGUpKSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiRmFpbGVkIHRvIGNvbm5lY3Q6ICVzIiwKKyAgICAgICAgICBwYV9zdHJlcnJvciAocGFfY29udGV4dF9lcnJubyAoc2VsZi0+Y29udGV4dCkpKTsKKyAgICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICAgIH0KKworICAgIGlmIChzdGF0ZSA9PSBQQV9DT05URVhUX1JFQURZKQorICAgICAgYnJlYWs7CisKKyAgICAvKiBXYWl0IHVudGlsIHRoZSBjb250ZXh0IGlzIHJlYWR5ICovCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAoc2VsZi0+bWFpbmxvb3ApOworICB9CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJjb25uZWN0ZWQiKTsKKworICBwYV9jb250ZXh0X3N1YnNjcmliZSAoc2VsZi0+Y29udGV4dCwKKyAgICAgIFBBX1NVQlNDUklQVElPTl9NQVNLX1NPVVJDRSB8IFBBX1NVQlNDUklQVElPTl9NQVNLX1NJTkssIE5VTEwsIE5VTEwpOworCisgIGluaXRpYWxfb3BlcmF0aW9uID0gcGFfY29udGV4dF9nZXRfc291cmNlX2luZm9fbGlzdCAoc2VsZi0+Y29udGV4dCwKKyAgICAgIGdldF9zb3VyY2VfaW5mb19jYiwgc2VsZik7CisgIHdoaWxlIChwYV9vcGVyYXRpb25fZ2V0X3N0YXRlIChpbml0aWFsX29wZXJhdGlvbikgPT0gUEFfT1BFUkFUSU9OX1JVTk5JTkcpIHsKKyAgICBpZiAoIVBBX0NPTlRFWFRfSVNfR09PRCAocGFfY29udGV4dF9nZXRfc3RhdGUgKChzZWxmLT5jb250ZXh0KSkpKQorICAgICAgZ290byBjYW5jZWxfYW5kX2ZhaWw7CisKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0IChzZWxmLT5tYWlubG9vcCk7CisgIH0KKyAgcGFfb3BlcmF0aW9uX3VucmVmIChpbml0aWFsX29wZXJhdGlvbik7CisKKyAgaW5pdGlhbF9vcGVyYXRpb24gPSBwYV9jb250ZXh0X2dldF9zaW5rX2luZm9fbGlzdCAoc2VsZi0+Y29udGV4dCwKKyAgICAgIGdldF9zaW5rX2luZm9fY2IsIHNlbGYpOworICBpZiAoIWluaXRpYWxfb3BlcmF0aW9uKQorICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB3aGlsZSAocGFfb3BlcmF0aW9uX2dldF9zdGF0ZSAoaW5pdGlhbF9vcGVyYXRpb24pID09IFBBX09QRVJBVElPTl9SVU5OSU5HKSB7CisgICAgaWYgKCFQQV9DT05URVhUX0lTX0dPT0QgKHBhX2NvbnRleHRfZ2V0X3N0YXRlICgoc2VsZi0+Y29udGV4dCkpKSkKKyAgICAgIGdvdG8gY2FuY2VsX2FuZF9mYWlsOworCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAoc2VsZi0+bWFpbmxvb3ApOworICB9CisgIHBhX29wZXJhdGlvbl91bnJlZiAoaW5pdGlhbF9vcGVyYXRpb24pOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAoc2VsZi0+bWFpbmxvb3ApOworCisgIHJldHVybiBUUlVFOworCit1bmxvY2tfYW5kX2ZhaWw6CisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAoc2VsZi0+bWFpbmxvb3ApOworICBnc3RfcHVsc2VfZGV2aWNlX3Byb3ZpZGVyX3N0b3AgKHByb3ZpZGVyKTsKKyAgcmV0dXJuIEZBTFNFOworCittYWlubG9vcF9mYWlsZWQ6CisgIHJldHVybiBGQUxTRTsKKworY2FuY2VsX2FuZF9mYWlsOgorICBwYV9vcGVyYXRpb25fY2FuY2VsIChpbml0aWFsX29wZXJhdGlvbik7CisgIHBhX29wZXJhdGlvbl91bnJlZiAoaW5pdGlhbF9vcGVyYXRpb24pOworICBnb3RvIHVubG9ja19hbmRfZmFpbDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZV9kZXZpY2VfcHJvdmlkZXJfc3RvcCAoR3N0RGV2aWNlUHJvdmlkZXIgKiBwcm92aWRlcikKK3sKKyAgR3N0UHVsc2VEZXZpY2VQcm92aWRlciAqc2VsZiA9IEdTVF9QVUxTRV9ERVZJQ0VfUFJPVklERVIgKHByb3ZpZGVyKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF9zdG9wIChzZWxmLT5tYWlubG9vcCk7CisKKyAgaWYgKHNlbGYtPmNvbnRleHQpIHsKKyAgICBwYV9jb250ZXh0X2Rpc2Nvbm5lY3QgKHNlbGYtPmNvbnRleHQpOworCisgICAgLyogTWFrZSBzdXJlIHdlIGRvbid0IGdldCBhbnkgZnVydGhlciBjYWxsYmFja3MgKi8KKyAgICBwYV9jb250ZXh0X3NldF9zdGF0ZV9jYWxsYmFjayAoc2VsZi0+Y29udGV4dCwgTlVMTCwgTlVMTCk7CisgICAgcGFfY29udGV4dF9zZXRfc3Vic2NyaWJlX2NhbGxiYWNrIChzZWxmLT5jb250ZXh0LCBOVUxMLCBOVUxMKTsKKworICAgIHBhX2NvbnRleHRfdW5yZWYgKHNlbGYtPmNvbnRleHQpOworICAgIHNlbGYtPmNvbnRleHQgPSBOVUxMOworICB9CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfZnJlZSAoc2VsZi0+bWFpbmxvb3ApOworICBzZWxmLT5tYWlubG9vcCA9IE5VTEw7Cit9CisKK2VudW0KK3sKKyAgUFJPUF9JTlRFUk5BTF9OQU1FID0gMSwKK307CisKK0dfREVGSU5FX1RZUEUgKEdzdFB1bHNlRGV2aWNlLCBnc3RfcHVsc2VfZGV2aWNlLCBHU1RfVFlQRV9ERVZJQ0UpOworCitzdGF0aWMgdm9pZCBnc3RfcHVsc2VfZGV2aWNlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9wdWxzZV9kZXZpY2Vfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3B1bHNlX2RldmljZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgR3N0RWxlbWVudCAqZ3N0X3B1bHNlX2RldmljZV9jcmVhdGVfZWxlbWVudCAoR3N0RGV2aWNlICogZGV2aWNlLAorICAgIGNvbnN0IGdjaGFyICogbmFtZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3B1bHNlX2RldmljZV9yZWNvbmZpZ3VyZV9lbGVtZW50IChHc3REZXZpY2UgKiBkZXZpY2UsCisgICAgR3N0RWxlbWVudCAqIGVsZW1lbnQpOworCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlX2RldmljZV9jbGFzc19pbml0IChHc3RQdWxzZURldmljZUNsYXNzICoga2xhc3MpCit7CisgIEdzdERldmljZUNsYXNzICpkZXZfY2xhc3MgPSBHU1RfREVWSUNFX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBkZXZfY2xhc3MtPmNyZWF0ZV9lbGVtZW50ID0gZ3N0X3B1bHNlX2RldmljZV9jcmVhdGVfZWxlbWVudDsKKyAgZGV2X2NsYXNzLT5yZWNvbmZpZ3VyZV9lbGVtZW50ID0gZ3N0X3B1bHNlX2RldmljZV9yZWNvbmZpZ3VyZV9lbGVtZW50OworCisgIG9iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3B1bHNlX2RldmljZV9nZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3B1bHNlX2RldmljZV9zZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcHVsc2VfZGV2aWNlX2ZpbmFsaXplOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKG9iamVjdF9jbGFzcywgUFJPUF9JTlRFUk5BTF9OQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImludGVybmFsLW5hbWUiLCAiSW50ZXJuYWwgUHVsc2VBdWRpbyBkZXZpY2UgbmFtZSIsCisgICAgICAgICAgIlRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBQdWxzZUF1ZGlvIGRldmljZSIsICIiLAorICAgICAgICAgIEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZV9kZXZpY2VfaW5pdCAoR3N0UHVsc2VEZXZpY2UgKiBkZXZpY2UpCit7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VfZGV2aWNlX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RQdWxzZURldmljZSAqZGV2aWNlID0gR1NUX1BVTFNFX0RFVklDRSAob2JqZWN0KTsKKworICBnX2ZyZWUgKGRldmljZS0+aW50ZXJuYWxfbmFtZSk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKGdzdF9wdWxzZV9kZXZpY2VfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK2dzdF9wdWxzZV9kZXZpY2VfY3JlYXRlX2VsZW1lbnQgKEdzdERldmljZSAqIGRldmljZSwgY29uc3QgZ2NoYXIgKiBuYW1lKQoreworICBHc3RQdWxzZURldmljZSAqcHVsc2VfZGV2ID0gR1NUX1BVTFNFX0RFVklDRSAoZGV2aWNlKTsKKyAgR3N0RWxlbWVudCAqZWxlbTsKKworICBlbGVtID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlIChwdWxzZV9kZXYtPmVsZW1lbnQsIG5hbWUpOworICBnX29iamVjdF9zZXQgKGVsZW0sICJkZXZpY2UiLCBwdWxzZV9kZXYtPmludGVybmFsX25hbWUsIE5VTEwpOworCisgIHJldHVybiBlbGVtOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wdWxzZV9kZXZpY2VfcmVjb25maWd1cmVfZWxlbWVudCAoR3N0RGV2aWNlICogZGV2aWNlLCBHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgR3N0UHVsc2VEZXZpY2UgKnB1bHNlX2RldiA9IEdTVF9QVUxTRV9ERVZJQ0UgKGRldmljZSk7CisKKyAgaWYgKCFzdHJjbXAgKHB1bHNlX2Rldi0+ZWxlbWVudCwgInB1bHNlc3JjIikpIHsKKyAgICBpZiAoIUdTVF9JU19QVUxTRVNSQyAoZWxlbWVudCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAocHVsc2VfZGV2LT5lbGVtZW50LCAicHVsc2VzaW5rIikpIHsKKyAgICBpZiAoIUdTVF9JU19QVUxTRVNJTksgKGVsZW1lbnQpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9IGVsc2UgeworICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICB9CisKKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAiZGV2aWNlIiwgcHVsc2VfZGV2LT5pbnRlcm5hbF9uYW1lLCBOVUxMKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogVGFrZXMgb3duZXJzaGlwIG9mIEBjYXBzIGFuZCBAcHJvcHMgKi8KK3N0YXRpYyBHc3REZXZpY2UgKgorZ3N0X3B1bHNlX2RldmljZV9uZXcgKGd1aW50IGRldmljZV9pbmRleCwgY29uc3QgZ2NoYXIgKiBkZXZpY2VfbmFtZSwKKyAgICBHc3RDYXBzICogY2FwcywgY29uc3QgZ2NoYXIgKiBpbnRlcm5hbF9uYW1lLCBHc3RQdWxzZURldmljZVR5cGUgdHlwZSwKKyAgICBHc3RTdHJ1Y3R1cmUgKiBwcm9wcykKK3sKKyAgR3N0UHVsc2VEZXZpY2UgKmdzdGRldjsKKyAgY29uc3QgZ2NoYXIgKmVsZW1lbnQgPSBOVUxMOworICBjb25zdCBnY2hhciAqa2xhc3MgPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChkZXZpY2VfbmFtZSwgTlVMTCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChpbnRlcm5hbF9uYW1lLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNhcHMsIE5VTEwpOworCisKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBHU1RfUFVMU0VfREVWSUNFX1RZUEVfU09VUkNFOgorICAgICAgZWxlbWVudCA9ICJwdWxzZXNyYyI7CisgICAgICBrbGFzcyA9ICJBdWRpby9Tb3VyY2UiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUFVMU0VfREVWSUNFX1RZUEVfU0lOSzoKKyAgICAgIGVsZW1lbnQgPSAicHVsc2VzaW5rIjsKKyAgICAgIGtsYXNzID0gIkF1ZGlvL1NpbmsiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgYnJlYWs7CisgIH0KKworCisgIGdzdGRldiA9IGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfUFVMU0VfREVWSUNFLAorICAgICAgImRpc3BsYXktbmFtZSIsIGRldmljZV9uYW1lLCAiY2FwcyIsIGNhcHMsICJkZXZpY2UtY2xhc3MiLCBrbGFzcywKKyAgICAgICJpbnRlcm5hbC1uYW1lIiwgaW50ZXJuYWxfbmFtZSwgInByb3BlcnRpZXMiLCBwcm9wcywgTlVMTCk7CisKKyAgZ3N0ZGV2LT50eXBlID0gdHlwZTsKKyAgZ3N0ZGV2LT5kZXZpY2VfaW5kZXggPSBkZXZpY2VfaW5kZXg7CisgIGdzdGRldi0+ZWxlbWVudCA9IGVsZW1lbnQ7CisKKyAgZ3N0X3N0cnVjdHVyZV9mcmVlIChwcm9wcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICByZXR1cm4gR1NUX0RFVklDRSAoZ3N0ZGV2KTsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlX2RldmljZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UHVsc2VEZXZpY2UgKmRldmljZTsKKworICBkZXZpY2UgPSBHU1RfUFVMU0VfREVWSUNFX0NBU1QgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0lOVEVSTkFMX05BTUU6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBkZXZpY2UtPmludGVybmFsX25hbWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VfZGV2aWNlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RQdWxzZURldmljZSAqZGV2aWNlOworCisgIGRldmljZSA9IEdTVF9QVUxTRV9ERVZJQ0VfQ0FTVCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfSU5URVJOQUxfTkFNRToKKyAgICAgIGRldmljZS0+aW50ZXJuYWxfbmFtZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L3B1bHNlL3B1bHNlZGV2aWNlcHJvdmlkZXIuaCBiL2V4dC9wdWxzZS9wdWxzZWRldmljZXByb3ZpZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg5MmFkNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9wdWxzZS9wdWxzZWRldmljZXByb3ZpZGVyLmgKQEAgLTAsMCArMSw5OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorICoKKyAqIHB1bHNlZGV2aWNlcHJvdmlkZXIuaDogRGV2aWNlIHByb2JpbmcgYW5kIG1vbml0b3JpbmcKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfUFVMU0VfREVWSUNFX1BST1ZJREVSX0hfXworI2RlZmluZSBfX0dTVF9QVUxTRV9ERVZJQ0VfUFJPVklERVJfSF9fCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHB1bHNlL3B1bHNlYXVkaW8uaD4KKyNpbmNsdWRlIDxwdWxzZS90aHJlYWQtbWFpbmxvb3AuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0UHVsc2VEZXZpY2VQcm92aWRlciBHc3RQdWxzZURldmljZVByb3ZpZGVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFB1bHNlRGV2aWNlUHJvdmlkZXJDbGFzcyBHc3RQdWxzZURldmljZVByb3ZpZGVyQ2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfUFVMU0VfREVWSUNFX1BST1ZJREVSICAgICAgICAgICAgICAgICAoZ3N0X3B1bHNlX2RldmljZV9wcm92aWRlcl9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfSVNfUFVMU0VfREVWSUNFX1BST1ZJREVSKG9iaikgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX1BVTFNFX0RFVklDRV9QUk9WSURFUikpCisjZGVmaW5lIEdTVF9JU19QVUxTRV9ERVZJQ0VfUFJPVklERVJfQ0xBU1Moa2xhc3MpICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9QVUxTRV9ERVZJQ0VfUFJPVklERVIpKQorI2RlZmluZSBHU1RfUFVMU0VfREVWSUNFX1BST1ZJREVSX0dFVF9DTEFTUyhvYmopICAgICAgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfUFVMU0VfREVWSUNFX1BST1ZJREVSLCBHc3RQdWxzZURldmljZVByb3ZpZGVyQ2xhc3MpKQorI2RlZmluZSBHU1RfUFVMU0VfREVWSUNFX1BST1ZJREVSKG9iaikgICAgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX1BVTFNFX0RFVklDRV9QUk9WSURFUiwgR3N0UHVsc2VEZXZpY2VQcm92aWRlcikpCisjZGVmaW5lIEdTVF9QVUxTRV9ERVZJQ0VfUFJPVklERVJfQ0xBU1Moa2xhc3MpICAgICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9ERVZJQ0VfUFJPVklERVIsIEdzdFB1bHNlRGV2aWNlUHJvdmlkZXJDbGFzcykpCisjZGVmaW5lIEdTVF9QVUxTRV9ERVZJQ0VfUFJPVklERVJfQ0FTVChvYmopICAgICAgICAgICAgKChHc3RQdWxzZURldmljZVByb3ZpZGVyICopKG9iaikpCisKK3N0cnVjdCBfR3N0UHVsc2VEZXZpY2VQcm92aWRlciB7CisgIEdzdERldmljZVByb3ZpZGVyICAgICAgICAgcGFyZW50OworCisgIGdjaGFyICpzZXJ2ZXI7CisgIGdjaGFyICpjbGllbnRfbmFtZTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcCAqbWFpbmxvb3A7CisgIHBhX2NvbnRleHQgKmNvbnRleHQ7Cit9OworCit0eXBlZGVmIGVudW0geworICBHU1RfUFVMU0VfREVWSUNFX1RZUEVfU09VUkNFLAorICBHU1RfUFVMU0VfREVWSUNFX1RZUEVfU0lOSworfSBHc3RQdWxzZURldmljZVR5cGU7CisKK3N0cnVjdCBfR3N0UHVsc2VEZXZpY2VQcm92aWRlckNsYXNzIHsKKyAgR3N0RGV2aWNlUHJvdmlkZXJDbGFzcyAgICBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSAgICAgICAgZ3N0X3B1bHNlX2RldmljZV9wcm92aWRlcl9nZXRfdHlwZSAodm9pZCk7CisKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFB1bHNlRGV2aWNlIEdzdFB1bHNlRGV2aWNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFB1bHNlRGV2aWNlQ2xhc3MgR3N0UHVsc2VEZXZpY2VDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9QVUxTRV9ERVZJQ0UgICAgICAgICAgICAgICAgIChnc3RfcHVsc2VfZGV2aWNlX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9JU19QVUxTRV9ERVZJQ0Uob2JqKSAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfUFVMU0VfREVWSUNFKSkKKyNkZWZpbmUgR1NUX0lTX1BVTFNFX0RFVklDRV9DTEFTUyhrbGFzcykgICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX1BVTFNFX0RFVklDRSkpCisjZGVmaW5lIEdTVF9QVUxTRV9ERVZJQ0VfR0VUX0NMQVNTKG9iaikgICAgICAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9QVUxTRV9ERVZJQ0UsIEdzdFB1bHNlRGV2aWNlQ2xhc3MpKQorI2RlZmluZSBHU1RfUFVMU0VfREVWSUNFKG9iaikgICAgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX1BVTFNFX0RFVklDRSwgR3N0UHVsc2VEZXZpY2UpKQorI2RlZmluZSBHU1RfUFVMU0VfREVWSUNFX0NMQVNTKGtsYXNzKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfREVWSUNFLCBHc3RQdWxzZURldmljZUNsYXNzKSkKKyNkZWZpbmUgR1NUX1BVTFNFX0RFVklDRV9DQVNUKG9iaikgICAgICAgICAgICAoKEdzdFB1bHNlRGV2aWNlICopKG9iaikpCisKK3N0cnVjdCBfR3N0UHVsc2VEZXZpY2UgeworICBHc3REZXZpY2UgICAgICAgICBwYXJlbnQ7CisKKyAgR3N0UHVsc2VEZXZpY2VUeXBlIHR5cGU7CisgIGd1aW50ICAgICAgICAgICAgIGRldmljZV9pbmRleDsKKyAgZ2NoYXIgICAgICAgICAgICAqaW50ZXJuYWxfbmFtZTsKKyAgY29uc3QgZ2NoYXIgICAgICAqZWxlbWVudDsKK307CisKK3N0cnVjdCBfR3N0UHVsc2VEZXZpY2VDbGFzcyB7CisgIEdzdERldmljZUNsYXNzICAgIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlICAgICAgICBnc3RfcHVsc2VfZGV2aWNlX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1BVTFNFX0RFVklDRV9QUk9WSURFUl9IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC9wdWxzZS9wdWxzZXNpbmsuYyBiL2V4dC9wdWxzZS9wdWxzZXNpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjFjNGE2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3B1bHNlL3B1bHNlc2luay5jCkBAIC0wLDAgKzEsMzMwNyBAQAorLyotKi0gTW9kZTogQzsgYy1iYXNpYy1vZmZzZXQ6IDIgLSotKi8KKworLyogIEdTdHJlYW1lciBwdWxzZWF1ZGlvIHBsdWdpbgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwOCBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAqICAgICAgICAgICAgKGMpIDIwMDkgICAgICBXaW0gVGF5bWFucworICoKKyAqICBnc3QtcHVsc2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUKKyAqICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBnc3QtcHVsc2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIGdzdC1wdWxzZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxCisgKiAgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXB1bHNlc2luaworICogQHNlZV9hbHNvOiBwdWxzZXNyYworICoKKyAqIFRoaXMgZWxlbWVudCBvdXRwdXRzIGF1ZGlvIHRvIGEKKyAqIDx1bGluayBocmVmPSJodHRwOi8vd3d3LnB1bHNlYXVkaW8ub3JnIj5QdWxzZUF1ZGlvIHNvdW5kIHNlcnZlcjwvdWxpbms+LgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgZmlsZXNyYyBsb2NhdGlvbj1zaW5lLm9nZyAhIG9nZ2RlbXV4ICEgdm9yYmlzZGVjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIHB1bHNlc2luaworICogXXwgUGxheSBhbiBPZ2cvVm9yYmlzIGZpbGUuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgYXVkaW90ZXN0c3JjICEgYXVkaW9jb252ZXJ0ICEgdm9sdW1lIHZvbHVtZT0wLjQgISBwdWxzZXNpbmsKKyAqIF18IFBsYXkgYSA0NDBIeiBzaW5lIHdhdmUuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgYXVkaW90ZXN0c3JjICEgcHVsc2VzaW5rIHN0cmVhbS1wcm9wZXJ0aWVzPSJwcm9wcyxtZWRpYS50aXRsZT10ZXN0IgorICogXXwgUGxheSBhIHNpbmUgd2F2ZSBhbmQgc2V0IGEgc3RyZWFtIHByb3BlcnR5LiBUaGUgcHJvcGVydHkgY2FuIGJlIGNoZWNrZWQKKyAqIHdpdGggInBhY3RsIGxpc3QiLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXNpbmsuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0dGFnbGlzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKworI2luY2x1ZGUgPGdzdC9wYnV0aWxzL3BidXRpbHMuaD4gICAgICAgIC8qIG9ubHkgdXNlZCBmb3IgR1NUX1BMVUdJTlNfQkFTRV9WRVJTSU9OXyogKi8KKworI2luY2x1ZGUgPGdzdC9nbGliLWNvbXBhdC1wcml2YXRlLmg+CisKKyNpbmNsdWRlICJwdWxzZXNpbmsuaCIKKyNpbmNsdWRlICJwdWxzZXV0aWwuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX0VYVEVSTiAocHVsc2VfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgcHVsc2VfZGVidWcKKworI2RlZmluZSBERUZBVUxUX1NFUlZFUiAgICAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfREVWSUNFICAgICAgICAgIE5VTEwKKyNkZWZpbmUgREVGQVVMVF9DVVJSRU5UX0RFVklDRSAgTlVMTAorI2RlZmluZSBERUZBVUxUX0RFVklDRV9OQU1FICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfVk9MVU1FICAgICAgICAgIDEuMAorI2RlZmluZSBERUZBVUxUX01VVEUgICAgICAgICAgICBGQUxTRQorI2RlZmluZSBNQVhfVk9MVU1FICAgICAgICAgICAgICAxMC4wCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX1NFUlZFUiwKKyAgUFJPUF9ERVZJQ0UsCisgIFBST1BfQ1VSUkVOVF9ERVZJQ0UsCisgIFBST1BfREVWSUNFX05BTUUsCisgIFBST1BfVk9MVU1FLAorICBQUk9QX01VVEUsCisgIFBST1BfQ0xJRU5UX05BTUUsCisgIFBST1BfU1RSRUFNX1BST1BFUlRJRVMsCisgIFBST1BfTEFTVAorfTsKKworI2RlZmluZSBHU1RfVFlQRV9QVUxTRVJJTkdfQlVGRkVSICAgICAgICBcCisgICAgICAgIChnc3RfcHVsc2VyaW5nYnVmZmVyX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9QVUxTRVJJTkdfQlVGRkVSKG9iaikgICAgICAgIFwKKyAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1BVTFNFUklOR19CVUZGRVIsR3N0UHVsc2VSaW5nQnVmZmVyKSkKKyNkZWZpbmUgR1NUX1BVTFNFUklOR19CVUZGRVJfQ0xBU1Moa2xhc3MpIFwKKyAgICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUFVMU0VSSU5HX0JVRkZFUixHc3RQdWxzZVJpbmdCdWZmZXJDbGFzcykpCisjZGVmaW5lIEdTVF9QVUxTRVJJTkdfQlVGRkVSX0dFVF9DTEFTUyhvYmopIFwKKyAgICAgICAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9QVUxTRVJJTkdfQlVGRkVSLCBHc3RQdWxzZVJpbmdCdWZmZXJDbGFzcykpCisjZGVmaW5lIEdTVF9QVUxTRVJJTkdfQlVGRkVSX0NBU1Qob2JqKSAgICAgICAgXAorICAgICAgICAoKEdzdFB1bHNlUmluZ0J1ZmZlciAqKW9iaikKKyNkZWZpbmUgR1NUX0lTX1BVTFNFUklOR19CVUZGRVIob2JqKSAgICAgXAorICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUFVMU0VSSU5HX0JVRkZFUikpCisjZGVmaW5lIEdTVF9JU19QVUxTRVJJTkdfQlVGRkVSX0NMQVNTKGtsYXNzKVwKKyAgICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUFVMU0VSSU5HX0JVRkZFUikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RQdWxzZVJpbmdCdWZmZXIgR3N0UHVsc2VSaW5nQnVmZmVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFB1bHNlUmluZ0J1ZmZlckNsYXNzIEdzdFB1bHNlUmluZ0J1ZmZlckNsYXNzOworCit0eXBlZGVmIHN0cnVjdCBfR3N0UHVsc2VDb250ZXh0IEdzdFB1bHNlQ29udGV4dDsKKworLyogQSBub3RlIG9uIHRocmVhZGluZy4KKyAqCisgKiBXZSB1c2UgYSBwYV90aHJlYWRlZF9tYWlubG9vcCB0byBpbnRlcmFjdCB3aXRoIHRoZSBQdWxzZUF1ZGlvIHNlcnZlci4gVGhpcworICogc3RhcnRzIHVwIGEgc2VwYXJhdGUgdGhyZWFkIHRoYXQgcnVucyBhIG1haW5sb29wIHRvIGNhcnJ5IGJhY2sgZXZlbnRzLAorICogbWVzc2FnZXMgYW5kIHRpbWluZyB1cGRhdGVzIGZyb20gdGhlIFB1bHNlQXVkaW8gc2VydmVyLgorICoKKyAqIEluIG1vc3QgY2FzZXMsIHRoZSBQdWxzZUF1ZGlvIEFQSSB3ZSB1c2UgY29tbXVuaWNhdGVzIHdpdGggdGhlIHNlcnZlciBhbmQKKyAqIHByb2Nlc3NlcyByZXBsaWVzIGFzeW5jaHJvbm91c2x5LiBPcGVyYXRpb25zIG9uIFBBIG9iamVjdHMgdGhhdCByZXN1bHQgaW4KKyAqIHN1Y2ggY29tbXVuaWNhdGlvbiBhcmUgcHJvdGVjdGVkIHdpdGggYSBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKCkgYW5kCisgKiBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2soKS4gVGhlc2UgZ3VhcmFudGVlIG11dHVhbCBleGNsdXNpb24gd2l0aCB0aGUKKyAqIG1haW5sb29wIHRocmVhZCAtLSB3aGVuIGFuIGl0ZXJhdGlvbiBvZiB0aGUgbWFpbmxvb3AgdGhyZWFkIGJlZ2lucywgaXQgZmlyc3QKKyAqIHRyaWVzIHRvIGFjcXVpcmUgdGhpcyBsb2NrLCBhbmQgY2Fubm90IGRvIHNvIGlmIG91ciBjb2RlIGFsc28gaG9sZHMgdGhhdAorICogbG9jay4KKyAqCisgKiBXaGVuIHdlIG5lZWQgdG8gY29tcGxldGUgYW4gb3BlcmF0aW9uIHN5bmNocm9ub3VzbHksIHdlIHVzZQorICogcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCgpIGFuZCBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwoKS4gVGhlc2Ugd29yaworICogbXVjaCBhcyBwdGhyZWFkIGNvbmRpdGlvbmFscyBkby4gcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCgpIGlzIGNhbGxlZCB3aXRoCisgKiB0aGUgbWFpbmxvb3AgbG9jayBoZWxkLiBJdCByZWxlYXNlcyB0aGUgbG9jayAodGhlcmVieSBhbGxvd2luZyB0aGUgbWFpbmxvb3AKKyAqIHRvIGV4ZWN1dGUpLCBhbmQgd2FpdHMgdGlsbCBvbmUgb2Ygb3VyIGNhbGxiYWNrcyB0byBiZSBleGVjdXRlZCBieSB0aGUKKyAqIG1haW5sb29wIHRocmVhZCBjYWxscyBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwoKS4gQXQgdGhlIGVuZCBvZiB0aGUKKyAqIG1haW5sb29wIGl0ZXJhdGlvbiwgdGhlIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQoKSB3aWxsIHJlYWNxdWlyZSB0aGUKKyAqIG1haW5sb29wIGxvY2sgYW5kIHJldHVybiBjb250cm9sIHRvIHRoZSBjYWxsZXIuCisgKi8KKworLyogU3RvcmUgdGhlIFBBIGNvbnRleHRzIGluIGEgaGFzaCB0YWJsZSB0byBhbGxvdyBlYXN5IHNoYXJpbmcgYW1vbmcKKyAqIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2luay4gS2V5cyBhcmUgJGNvbnRleHRfbmFtZUAkc2VydmVyX25hbWUKKyAqIChzdHJpbmdzKSBhbmQgdmFsdWVzIHNob3VsZCBiZSBHc3RQdWxzZUNvbnRleHQgcG9pbnRlcnMuCisgKi8KK3N0cnVjdCBfR3N0UHVsc2VDb250ZXh0Cit7CisgIHBhX2NvbnRleHQgKmNvbnRleHQ7CisgIEdTTGlzdCAqcmluZ19idWZmZXJzOworfTsKKworc3RhdGljIEdIYXNoVGFibGUgKmdzdF9wdWxzZV9zaGFyZWRfY29udGV4dHMgPSBOVUxMOworCisvKiB1c2Ugb25lIHN0YXRpYyBtYWluLWxvb3AgZm9yIGFsbCBpbnN0YW5jZXMKKyAqIHRoaXMgaXMgbmVlZGVkIHRvIG1ha2UgdGhlIGNvbnRleHQgc2hhcmluZyB3b3JrIGFzIHRoZSBjb250ZXh0cyBhcmUKKyAqIHJlbGVhc2VkIHdoZW4gcmVsZWFzaW5nIHRoZWlyIHBhcmVudCBtYWluLWxvb3AKKyAqLworc3RhdGljIHBhX3RocmVhZGVkX21haW5sb29wICptYWlubG9vcCA9IE5VTEw7CitzdGF0aWMgZ3VpbnQgbWFpbmxvb3BfcmVmX2N0ID0gMDsKKworLyogbG9jayBmb3IgYWNjZXNzIHRvIHNoYXJlZCByZXNvdXJjZXMgKi8KK3N0YXRpYyBHTXV0ZXggcGFfc2hhcmVkX3Jlc291cmNlX211dGV4OworCisvKiBXZSBrZWVwIGEgY3VzdG9tIHJpbmdidWZmZXIgdGhhdCBpcyBiYWNrZWQgdXAgYnkgZGF0YSBhbGxvY2F0ZWQgYnkKKyAqIHB1bHNlYXVkaW8uIFdlIG11c3QgYWxzbyBvdmVyaWRlIHRoZSBjb21taXQgZnVuY3Rpb24gdG8gd3JpdGUgaW50bworICogcHVsc2VhdWRpbyBtZW1vcnkgaW5zdGVhZC4gKi8KK3N0cnVjdCBfR3N0UHVsc2VSaW5nQnVmZmVyCit7CisgIEdzdEF1ZGlvUmluZ0J1ZmZlciBvYmplY3Q7CisKKyAgZ2NoYXIgKmNvbnRleHRfbmFtZTsKKyAgZ2NoYXIgKnN0cmVhbV9uYW1lOworCisgIHBhX2NvbnRleHQgKmNvbnRleHQ7CisgIHBhX3N0cmVhbSAqc3RyZWFtOworICBwYV9zdHJlYW0gKnByb2JlX3N0cmVhbTsKKworICBwYV9mb3JtYXRfaW5mbyAqZm9ybWF0OworICBndWludCBjaGFubmVsczsKKyAgZ2Jvb2xlYW4gaXNfcGNtOworCisgIHZvaWQgKm1fZGF0YTsKKyAgc2l6ZV90IG1fdG93cml0ZTsKKyAgc2l6ZV90IG1fd3JpdGFibGU7CisgIGdpbnQ2NCBtX29mZnNldDsKKyAgZ2ludDY0IG1fbGFzdG9mZnNldDsKKworICBnYm9vbGVhbiBjb3JrZWQ6MTsKKyAgZ2Jvb2xlYW4gaW5fY29tbWl0OjE7CisgIGdib29sZWFuIHBhdXNlZDoxOworfTsKK3N0cnVjdCBfR3N0UHVsc2VSaW5nQnVmZmVyQ2xhc3MKK3sKKyAgR3N0QXVkaW9SaW5nQnVmZmVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworc3RhdGljIEdUeXBlIGdzdF9wdWxzZXJpbmdidWZmZXJfZ2V0X3R5cGUgKHZvaWQpOworc3RhdGljIHZvaWQgZ3N0X3B1bHNlcmluZ2J1ZmZlcl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBHc3RBdWRpb1JpbmdCdWZmZXJDbGFzcyAqcmluZ19wYXJlbnRfY2xhc3MgPSBOVUxMOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3B1bHNlcmluZ2J1ZmZlcl9vcGVuX2RldmljZSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcHVsc2VyaW5nYnVmZmVyX2Nsb3NlX2RldmljZSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcHVsc2VyaW5nYnVmZmVyX2FjcXVpcmUgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZiwKKyAgICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3B1bHNlcmluZ2J1ZmZlcl9yZWxlYXNlIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpOworc3RhdGljIGdib29sZWFuIGdzdF9wdWxzZXJpbmdidWZmZXJfc3RhcnQgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3B1bHNlcmluZ2J1ZmZlcl9wYXVzZSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcHVsc2VyaW5nYnVmZmVyX3N0b3AgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1Zik7CitzdGF0aWMgdm9pZCBnc3RfcHVsc2VyaW5nYnVmZmVyX2NsZWFyIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpOworc3RhdGljIGd1aW50IGdzdF9wdWxzZXJpbmdidWZmZXJfY29tbWl0IChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYsCisgICAgZ3VpbnQ2NCAqIHNhbXBsZSwgZ3VjaGFyICogZGF0YSwgZ2ludCBpbl9zYW1wbGVzLCBnaW50IG91dF9zYW1wbGVzLAorICAgIGdpbnQgKiBhY2N1bSk7CisKK0dfREVGSU5FX1RZUEUgKEdzdFB1bHNlUmluZ0J1ZmZlciwgZ3N0X3B1bHNlcmluZ2J1ZmZlciwKKyAgICBHU1RfVFlQRV9BVURJT19SSU5HX0JVRkZFUik7CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VzaW5rX2luaXRfY29udGV4dHMgKHZvaWQpCit7CisgIGdfbXV0ZXhfaW5pdCAoJnBhX3NoYXJlZF9yZXNvdXJjZV9tdXRleCk7CisgIGdzdF9wdWxzZV9zaGFyZWRfY29udGV4dHMgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfc3RyX2hhc2gsIGdfc3RyX2VxdWFsLAorICAgICAgZ19mcmVlLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXJpbmdidWZmZXJfY2xhc3NfaW5pdCAoR3N0UHVsc2VSaW5nQnVmZmVyQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RBdWRpb1JpbmdCdWZmZXJDbGFzcyAqZ3N0cmluZ2J1ZmZlcl9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcyA9IChHc3RBdWRpb1JpbmdCdWZmZXJDbGFzcyAqKSBrbGFzczsKKworICByaW5nX3BhcmVudF9jbGFzcyA9IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3B1bHNlcmluZ2J1ZmZlcl9maW5hbGl6ZTsKKworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5vcGVuX2RldmljZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3B1bHNlcmluZ2J1ZmZlcl9vcGVuX2RldmljZSk7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPmNsb3NlX2RldmljZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3B1bHNlcmluZ2J1ZmZlcl9jbG9zZV9kZXZpY2UpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5hY3F1aXJlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VyaW5nYnVmZmVyX2FjcXVpcmUpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5yZWxlYXNlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VyaW5nYnVmZmVyX3JlbGVhc2UpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VyaW5nYnVmZmVyX3N0YXJ0KTsKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcy0+cGF1c2UgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3B1bHNlcmluZ2J1ZmZlcl9wYXVzZSk7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPnJlc3VtZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VyaW5nYnVmZmVyX3N0YXJ0KTsKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VyaW5nYnVmZmVyX3N0b3ApOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5jbGVhcl9hbGwgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wdWxzZXJpbmdidWZmZXJfY2xlYXIpOworCisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPmNvbW1pdCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VyaW5nYnVmZmVyX2NvbW1pdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VyaW5nYnVmZmVyX2luaXQgKEdzdFB1bHNlUmluZ0J1ZmZlciAqIHBidWYpCit7CisgIHBidWYtPnN0cmVhbV9uYW1lID0gTlVMTDsKKyAgcGJ1Zi0+Y29udGV4dCA9IE5VTEw7CisgIHBidWYtPnN0cmVhbSA9IE5VTEw7CisgIHBidWYtPnByb2JlX3N0cmVhbSA9IE5VTEw7CisKKyAgcGJ1Zi0+Zm9ybWF0ID0gTlVMTDsKKyAgcGJ1Zi0+Y2hhbm5lbHMgPSAwOworICBwYnVmLT5pc19wY20gPSBGQUxTRTsKKworICBwYnVmLT5tX2RhdGEgPSBOVUxMOworICBwYnVmLT5tX3Rvd3JpdGUgPSAwOworICBwYnVmLT5tX3dyaXRhYmxlID0gMDsKKyAgcGJ1Zi0+bV9vZmZzZXQgPSAwOworICBwYnVmLT5tX2xhc3RvZmZzZXQgPSAwOworCisgIHBidWYtPmNvcmtlZCA9IFRSVUU7CisgIHBidWYtPmluX2NvbW1pdCA9IEZBTFNFOworICBwYnVmLT5wYXVzZWQgPSBGQUxTRTsKK30KKworLyogQ2FsbCB3aXRoIG1haW5sb29wIGxvY2sgaGVsZCBpZiB3YWl0ID09IFRSVUUpICovCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlX2Rlc3Ryb3lfc3RyZWFtIChwYV9zdHJlYW0gKiBzdHJlYW0sIGdib29sZWFuIHdhaXQpCit7CisgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYW55IGZ1cnRoZXIgY2FsbGJhY2tzICovCisgIHBhX3N0cmVhbV9zZXRfd3JpdGVfY2FsbGJhY2sgKHN0cmVhbSwgTlVMTCwgTlVMTCk7CisgIHBhX3N0cmVhbV9zZXRfdW5kZXJmbG93X2NhbGxiYWNrIChzdHJlYW0sIE5VTEwsIE5VTEwpOworICBwYV9zdHJlYW1fc2V0X292ZXJmbG93X2NhbGxiYWNrIChzdHJlYW0sIE5VTEwsIE5VTEwpOworCisgIHBhX3N0cmVhbV9kaXNjb25uZWN0IChzdHJlYW0pOworCisgIGlmICh3YWl0KQorICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQgKG1haW5sb29wKTsKKworICBwYV9zdHJlYW1fc2V0X3N0YXRlX2NhbGxiYWNrIChzdHJlYW0sIE5VTEwsIE5VTEwpOworICBwYV9zdHJlYW1fdW5yZWYgKHN0cmVhbSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VyaW5nX2Rlc3Ryb3lfc3RyZWFtIChHc3RQdWxzZVJpbmdCdWZmZXIgKiBwYnVmKQoreworICBpZiAocGJ1Zi0+cHJvYmVfc3RyZWFtKSB7CisgICAgZ3N0X3B1bHNlX2Rlc3Ryb3lfc3RyZWFtIChwYnVmLT5wcm9iZV9zdHJlYW0sIEZBTFNFKTsKKyAgICBwYnVmLT5wcm9iZV9zdHJlYW0gPSBOVUxMOworICB9CisKKyAgaWYgKHBidWYtPnN0cmVhbSkgeworCisgICAgaWYgKHBidWYtPm1fZGF0YSkgeworICAgICAgLyogZHJvcCBzaG0gbWVtb3J5IGJ1ZmZlciAqLworICAgICAgcGFfc3RyZWFtX2NhbmNlbF93cml0ZSAocGJ1Zi0+c3RyZWFtKTsKKworICAgICAgLyogcmVzZXQgaW50ZXJuYWwgdmFyaWFibGVzICovCisgICAgICBwYnVmLT5tX2RhdGEgPSBOVUxMOworICAgICAgcGJ1Zi0+bV90b3dyaXRlID0gMDsKKyAgICAgIHBidWYtPm1fd3JpdGFibGUgPSAwOworICAgICAgcGJ1Zi0+bV9vZmZzZXQgPSAwOworICAgICAgcGJ1Zi0+bV9sYXN0b2Zmc2V0ID0gMDsKKyAgICB9CisgICAgaWYgKHBidWYtPmZvcm1hdCkgeworICAgICAgcGFfZm9ybWF0X2luZm9fZnJlZSAocGJ1Zi0+Zm9ybWF0KTsKKyAgICAgIHBidWYtPmZvcm1hdCA9IE5VTEw7CisgICAgICBwYnVmLT5jaGFubmVscyA9IDA7CisgICAgICBwYnVmLT5pc19wY20gPSBGQUxTRTsKKyAgICB9CisKKyAgICBwYV9zdHJlYW1fZGlzY29ubmVjdCAocGJ1Zi0+c3RyZWFtKTsKKworICAgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYW55IGZ1cnRoZXIgY2FsbGJhY2tzICovCisgICAgcGFfc3RyZWFtX3NldF9zdGF0ZV9jYWxsYmFjayAocGJ1Zi0+c3RyZWFtLCBOVUxMLCBOVUxMKTsKKyAgICBwYV9zdHJlYW1fc2V0X3dyaXRlX2NhbGxiYWNrIChwYnVmLT5zdHJlYW0sIE5VTEwsIE5VTEwpOworICAgIHBhX3N0cmVhbV9zZXRfdW5kZXJmbG93X2NhbGxiYWNrIChwYnVmLT5zdHJlYW0sIE5VTEwsIE5VTEwpOworICAgIHBhX3N0cmVhbV9zZXRfb3ZlcmZsb3dfY2FsbGJhY2sgKHBidWYtPnN0cmVhbSwgTlVMTCwgTlVMTCk7CisKKyAgICBwYV9zdHJlYW1fdW5yZWYgKHBidWYtPnN0cmVhbSk7CisgICAgcGJ1Zi0+c3RyZWFtID0gTlVMTDsKKyAgfQorCisgIGdfZnJlZSAocGJ1Zi0+c3RyZWFtX25hbWUpOworICBwYnVmLT5zdHJlYW1fbmFtZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VyaW5nX2Rlc3Ryb3lfY29udGV4dCAoR3N0UHVsc2VSaW5nQnVmZmVyICogcGJ1ZikKK3sKKyAgZ19tdXRleF9sb2NrICgmcGFfc2hhcmVkX3Jlc291cmNlX211dGV4KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYnVmLCAiZGVzdHJveWluZyByaW5nYnVmZmVyICVwIiwgcGJ1Zik7CisKKyAgZ3N0X3B1bHNlcmluZ19kZXN0cm95X3N0cmVhbSAocGJ1Zik7CisKKyAgaWYgKHBidWYtPmNvbnRleHQpIHsKKyAgICBwYV9jb250ZXh0X3VucmVmIChwYnVmLT5jb250ZXh0KTsKKyAgICBwYnVmLT5jb250ZXh0ID0gTlVMTDsKKyAgfQorCisgIGlmIChwYnVmLT5jb250ZXh0X25hbWUpIHsKKyAgICBHc3RQdWxzZUNvbnRleHQgKnBjdHg7CisKKyAgICBwY3R4ID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAoZ3N0X3B1bHNlX3NoYXJlZF9jb250ZXh0cywgcGJ1Zi0+Y29udGV4dF9uYW1lKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBidWYsICJyZWxlYXNpbmcgY29udGV4dCB3aXRoIG5hbWUgJXMsIHBidWY9JXAsIHBjdHg9JXAiLAorICAgICAgICBwYnVmLT5jb250ZXh0X25hbWUsIHBidWYsIHBjdHgpOworCisgICAgaWYgKHBjdHgpIHsKKyAgICAgIHBjdHgtPnJpbmdfYnVmZmVycyA9IGdfc2xpc3RfcmVtb3ZlIChwY3R4LT5yaW5nX2J1ZmZlcnMsIHBidWYpOworICAgICAgaWYgKHBjdHgtPnJpbmdfYnVmZmVycyA9PSBOVUxMKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBidWYsCisgICAgICAgICAgICAiZGVzdHJveWluZyBmaW5hbCBjb250ZXh0IHdpdGggbmFtZSAlcywgcGJ1Zj0lcCwgcGN0eD0lcCIsCisgICAgICAgICAgICBwYnVmLT5jb250ZXh0X25hbWUsIHBidWYsIHBjdHgpOworCisgICAgICAgIHBhX2NvbnRleHRfZGlzY29ubmVjdCAocGN0eC0+Y29udGV4dCk7CisKKyAgICAgICAgLyogTWFrZSBzdXJlIHdlIGRvbid0IGdldCBhbnkgZnVydGhlciBjYWxsYmFja3MgKi8KKyAgICAgICAgcGFfY29udGV4dF9zZXRfc3RhdGVfY2FsbGJhY2sgKHBjdHgtPmNvbnRleHQsIE5VTEwsIE5VTEwpOworICAgICAgICBwYV9jb250ZXh0X3NldF9zdWJzY3JpYmVfY2FsbGJhY2sgKHBjdHgtPmNvbnRleHQsIE5VTEwsIE5VTEwpOworCisgICAgICAgIGdfaGFzaF90YWJsZV9yZW1vdmUgKGdzdF9wdWxzZV9zaGFyZWRfY29udGV4dHMsIHBidWYtPmNvbnRleHRfbmFtZSk7CisKKyAgICAgICAgcGFfY29udGV4dF91bnJlZiAocGN0eC0+Y29udGV4dCk7CisgICAgICAgIGdfc2xpY2VfZnJlZSAoR3N0UHVsc2VDb250ZXh0LCBwY3R4KTsKKyAgICAgIH0KKyAgICB9CisgICAgZ19mcmVlIChwYnVmLT5jb250ZXh0X25hbWUpOworICAgIHBidWYtPmNvbnRleHRfbmFtZSA9IE5VTEw7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZwYV9zaGFyZWRfcmVzb3VyY2VfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlcmluZ2J1ZmZlcl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpyaW5nYnVmZmVyOworCisgIHJpbmdidWZmZXIgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUIChvYmplY3QpOworCisgIGdzdF9wdWxzZXJpbmdfZGVzdHJveV9jb250ZXh0IChyaW5nYnVmZmVyKTsKKyAgR19PQkpFQ1RfQ0xBU1MgKHJpbmdfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKKworI2RlZmluZSBDT05URVhUX09LKGMpICgoYykgJiYgUEFfQ09OVEVYVF9JU19HT09EIChwYV9jb250ZXh0X2dldF9zdGF0ZSAoKGMpKSkpCisjZGVmaW5lIFNUUkVBTV9PSyhzKSAoKHMpICYmIFBBX1NUUkVBTV9JU19HT09EIChwYV9zdHJlYW1fZ2V0X3N0YXRlICgocykpKSkKKworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VyaW5nX2lzX2RlYWQgKEdzdFB1bHNlU2luayAqIHBzaW5rLCBHc3RQdWxzZVJpbmdCdWZmZXIgKiBwYnVmLAorICAgIGdib29sZWFuIGNoZWNrX3N0cmVhbSkKK3sKKyAgaWYgKCFDT05URVhUX09LIChwYnVmLT5jb250ZXh0KSkKKyAgICBnb3RvIGVycm9yOworCisgIGlmIChjaGVja19zdHJlYW0gJiYgIVNUUkVBTV9PSyAocGJ1Zi0+c3RyZWFtKSkKKyAgICBnb3RvIGVycm9yOworCisgIHJldHVybiBGQUxTRTsKKworZXJyb3I6CisgIHsKKyAgICBjb25zdCBnY2hhciAqZXJyX3N0ciA9CisgICAgICAgIHBidWYtPmNvbnRleHQgPyBwYV9zdHJlcnJvciAocGFfY29udGV4dF9lcnJubyAocGJ1Zi0+Y29udGV4dCkpIDogTlVMTDsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHNpbmssIFJFU09VUkNFLCBGQUlMRUQsICgiRGlzY29ubmVjdGVkOiAlcyIsCisgICAgICAgICAgICBlcnJfc3RyKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlcmluZ19jb250ZXh0X3N0YXRlX2NiIChwYV9jb250ZXh0ICogYywgdm9pZCAqdXNlcmRhdGEpCit7CisgIHBhX2NvbnRleHRfc3RhdGVfdCBzdGF0ZTsKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3AgKm1haW5sb29wID0gKHBhX3RocmVhZGVkX21haW5sb29wICopIHVzZXJkYXRhOworCisgIHN0YXRlID0gcGFfY29udGV4dF9nZXRfc3RhdGUgKGMpOworCisgIEdTVF9MT0cgKCJnb3QgbmV3IGNvbnRleHQgc3RhdGUgJWQiLCBzdGF0ZSk7CisKKyAgc3dpdGNoIChzdGF0ZSkgeworICAgIGNhc2UgUEFfQ09OVEVYVF9SRUFEWToKKyAgICBjYXNlIFBBX0NPTlRFWFRfVEVSTUlOQVRFRDoKKyAgICBjYXNlIFBBX0NPTlRFWFRfRkFJTEVEOgorICAgICAgR1NUX0xPRyAoInNpZ25hbGluZyIpOworICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsIChtYWlubG9vcCwgMCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUEFfQ09OVEVYVF9VTkNPTk5FQ1RFRDoKKyAgICBjYXNlIFBBX0NPTlRFWFRfQ09OTkVDVElORzoKKyAgICBjYXNlIFBBX0NPTlRFWFRfQVVUSE9SSVpJTkc6CisgICAgY2FzZSBQQV9DT05URVhUX1NFVFRJTkdfTkFNRToKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VyaW5nX2NvbnRleHRfc3Vic2NyaWJlX2NiIChwYV9jb250ZXh0ICogYywKKyAgICBwYV9zdWJzY3JpcHRpb25fZXZlbnRfdHlwZV90IHQsIHVpbnQzMl90IGlkeCwgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisgIEdzdFB1bHNlQ29udGV4dCAqcGN0eCA9IChHc3RQdWxzZUNvbnRleHQgKikgdXNlcmRhdGE7CisgIEdTTGlzdCAqd2FsazsKKworICBpZiAodCAhPSAoUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NJTktfSU5QVVQgfCBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfQ0hBTkdFKSAmJgorICAgICAgdCAhPSAoUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NJTktfSU5QVVQgfCBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfTkVXKSkKKyAgICByZXR1cm47CisKKyAgZm9yICh3YWxrID0gcGN0eC0+cmluZ19idWZmZXJzOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZiA9IChHc3RQdWxzZVJpbmdCdWZmZXIgKikgd2Fsay0+ZGF0YTsKKyAgICBwc2luayA9IEdTVF9QVUxTRVNJTktfQ0FTVCAoR1NUX09CSkVDVF9QQVJFTlQgKHBidWYpKTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgInR5cGUgJTA0eCwgaWR4ICV1IiwgdCwgaWR4KTsKKworICAgIGlmICghcGJ1Zi0+c3RyZWFtKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoaWR4ICE9IHBhX3N0cmVhbV9nZXRfaW5kZXggKHBidWYtPnN0cmVhbSkpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChwc2luay0+ZGV2aWNlICYmIHBidWYtPmlzX3BjbSAmJgorICAgICAgICAhZ19zdHJfZXF1YWwgKHBzaW5rLT5kZXZpY2UsCisgICAgICAgICAgICBwYV9zdHJlYW1fZ2V0X2RldmljZV9uYW1lIChwYnVmLT5zdHJlYW0pKSkgeworICAgICAgLyogVW5kZXJseWluZyBzaW5rIGNoYW5nZWQuIEFuZCB0aGlzIGlzIG5vdCBhIHBhc3N0aHJvdWdoIHN0cmVhbS4gTGV0J3MKKyAgICAgICAqIHNlZSBpZiBzb21lb25lIHVwc3RyZWFtIHdhbnRzIHRvIHRyeSB0byByZW5lZ290aWF0ZS4gKi8KKyAgICAgIEdzdEV2ZW50ICpyZW5lZ287CisKKyAgICAgIGdfZnJlZSAocHNpbmstPmRldmljZSk7CisgICAgICBwc2luay0+ZGV2aWNlID0gZ19zdHJkdXAgKHBhX3N0cmVhbV9nZXRfZGV2aWNlX25hbWUgKHBidWYtPnN0cmVhbSkpOworCisgICAgICBHU1RfSU5GT19PQkpFQ1QgKHBzaW5rLCAiZW1pdHRpbmcgc2luay1jaGFuZ2VkIik7CisKKyAgICAgIC8qIEZJWE1FOiBzZW5kIHJlY29uZmlndXJlIGV2ZW50IGluc3RlYWQgYW5kIGxldCBkZWNvZGViaW4vcGxheWJpbgorICAgICAgICogaGFuZGxlIHRoYXQuIEFsc28gdGFrZSBjYXJlIG9mIGFjMyBhbGlnbm1lbnQuIFNlZSAicHVsc2UtZm9ybWF0LWxvc3QiICovCisgICAgICByZW5lZ28gPSBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ld19lbXB0eSAoInB1bHNlLXNpbmstY2hhbmdlZCIpKTsKKworICAgICAgaWYgKCFnc3RfcGFkX3B1c2hfZXZlbnQgKEdTVF9CQVNFX1NJTksgKHBzaW5rKS0+c2lua3BhZCwgcmVuZWdvKSkKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJFbWl0dGVkIHNpbmstY2hhbmdlZCAtIG5vYm9keSB3YXMgbGlzdGVuaW5nIik7CisgICAgfQorCisgICAgLyogQWN0dWFsbHkgdGhpcyBldmVudCBpcyBhbHNvIHRyaWdnZXJlZCB3aGVuIG90aGVyIHByb3BlcnRpZXMgb2YKKyAgICAgKiB0aGUgc3RyZWFtIGNoYW5nZSB0aGF0IGFyZSB1bnJlbGF0ZWQgdG8gdGhlIHZvbHVtZS4gSG93ZXZlciBpdCBpcworICAgICAqIHByb2JhYmx5IGNoZWFwZXIgdG8gc2lnbmFsIHRoZSBjaGFuZ2UgaGVyZSBhbmQgY2hlY2sgZm9yIHRoZQorICAgICAqIHZvbHVtZSB3aGVuIHRoZSBHT2JqZWN0IHByb3BlcnR5IGlzIHJlYWQgaW5zdGVhZCBvZiBxdWVyeWluZyBpdCBhbHdheXMuICovCisKKyAgICAvKiBpbmZvcm0gc3RyZWFtaW5nIHRocmVhZCB0byBub3RpZnkgKi8KKyAgICBnX2F0b21pY19pbnRfY29tcGFyZV9hbmRfZXhjaGFuZ2UgKCZwc2luay0+bm90aWZ5LCAwLCAxKTsKKyAgfQorfQorCisvKiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBkZXZpY2Ugc2hvdWxkIGJlIG9wZW5lZC4gSW4gdGhpcyBjYXNlIHdlIHdpbGwgY29ubmVjdAorICogdG8gdGhlIHNlcnZlci4gV2Ugc2hvdWxkIG5vdCB0cnkgdG8gb3BlbiBhbnkgc3RyZWFtcyBpbiB0aGlzIHN0YXRlLiAqLworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VyaW5nYnVmZmVyX29wZW5fZGV2aWNlIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKyAgR3N0UHVsc2VDb250ZXh0ICpwY3R4OworICBwYV9tYWlubG9vcF9hcGkgKmFwaTsKKyAgZ2Jvb2xlYW4gbmVlZF91bmxvY2tfc2hhcmVkOworCisgIHBzaW5rID0gR1NUX1BVTFNFU0lOS19DQVNUIChHU1RfT0JKRUNUX1BBUkVOVCAoYnVmKSk7CisgIHBidWYgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUIChidWYpOworCisgIGdfYXNzZXJ0ICghcGJ1Zi0+c3RyZWFtKTsKKyAgZ19hc3NlcnQgKHBzaW5rLT5jbGllbnRfbmFtZSk7CisKKyAgaWYgKHBzaW5rLT5zZXJ2ZXIpCisgICAgcGJ1Zi0+Y29udGV4dF9uYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiJXNAJXMiLCBwc2luay0+Y2xpZW50X25hbWUsCisgICAgICAgIHBzaW5rLT5zZXJ2ZXIpOworICBlbHNlCisgICAgcGJ1Zi0+Y29udGV4dF9uYW1lID0gZ19zdHJkdXAgKHBzaW5rLT5jbGllbnRfbmFtZSk7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAobWFpbmxvb3ApOworCisgIGdfbXV0ZXhfbG9jayAoJnBhX3NoYXJlZF9yZXNvdXJjZV9tdXRleCk7CisgIG5lZWRfdW5sb2NrX3NoYXJlZCA9IFRSVUU7CisKKyAgcGN0eCA9IGdfaGFzaF90YWJsZV9sb29rdXAgKGdzdF9wdWxzZV9zaGFyZWRfY29udGV4dHMsIHBidWYtPmNvbnRleHRfbmFtZSk7CisgIGlmIChwY3R4ID09IE5VTEwpIHsKKyAgICBwY3R4ID0gZ19zbGljZV9uZXcwIChHc3RQdWxzZUNvbnRleHQpOworCisgICAgLyogZ2V0IHRoZSBtYWlubG9vcCBhcGkgYW5kIGNyZWF0ZSBhIGNvbnRleHQgKi8KKyAgICBHU1RfSU5GT19PQkpFQ1QgKHBzaW5rLCAibmV3IGNvbnRleHQgd2l0aCBuYW1lICVzLCBwYnVmPSVwLCBwY3R4PSVwIiwKKyAgICAgICAgcGJ1Zi0+Y29udGV4dF9uYW1lLCBwYnVmLCBwY3R4KTsKKyAgICBhcGkgPSBwYV90aHJlYWRlZF9tYWlubG9vcF9nZXRfYXBpIChtYWlubG9vcCk7CisgICAgaWYgKCEocGN0eC0+Y29udGV4dCA9IHBhX2NvbnRleHRfbmV3IChhcGksIHBidWYtPmNvbnRleHRfbmFtZSkpKQorICAgICAgZ290byBjcmVhdGVfZmFpbGVkOworCisgICAgcGN0eC0+cmluZ19idWZmZXJzID0gZ19zbGlzdF9wcmVwZW5kIChwY3R4LT5yaW5nX2J1ZmZlcnMsIHBidWYpOworICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGdzdF9wdWxzZV9zaGFyZWRfY29udGV4dHMsCisgICAgICAgIGdfc3RyZHVwIChwYnVmLT5jb250ZXh0X25hbWUpLCAoZ3BvaW50ZXIpIHBjdHgpOworICAgIC8qIHJlZ2lzdGVyIHNvbWUgZXNzZW50aWFsIGNhbGxiYWNrcyAqLworICAgIHBhX2NvbnRleHRfc2V0X3N0YXRlX2NhbGxiYWNrIChwY3R4LT5jb250ZXh0LAorICAgICAgICBnc3RfcHVsc2VyaW5nX2NvbnRleHRfc3RhdGVfY2IsIG1haW5sb29wKTsKKyAgICBwYV9jb250ZXh0X3NldF9zdWJzY3JpYmVfY2FsbGJhY2sgKHBjdHgtPmNvbnRleHQsCisgICAgICAgIGdzdF9wdWxzZXJpbmdfY29udGV4dF9zdWJzY3JpYmVfY2IsIHBjdHgpOworCisgICAgLyogdHJ5IHRvIGNvbm5lY3QgdG8gdGhlIHNlcnZlciBhbmQgd2FpdCBmb3IgY29tcGxldGlvbiwgd2UgZG9uJ3Qgd2FudCB0bworICAgICAqIGF1dG9zcGF3biBhIGRlYW1vbiAqLworICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgImNvbm5lY3QgdG8gc2VydmVyICVzIiwKKyAgICAgICAgR1NUX1NUUl9OVUxMIChwc2luay0+c2VydmVyKSk7CisgICAgaWYgKHBhX2NvbnRleHRfY29ubmVjdCAocGN0eC0+Y29udGV4dCwgcHNpbmstPnNlcnZlciwKKyAgICAgICAgICAgIFBBX0NPTlRFWFRfTk9BVVRPU1BBV04sIE5VTEwpIDwgMCkKKyAgICAgIGdvdG8gY29ubmVjdF9mYWlsZWQ7CisgIH0gZWxzZSB7CisgICAgR1NUX0lORk9fT0JKRUNUIChwc2luaywKKyAgICAgICAgInJldXNpbmcgc2hhcmVkIGNvbnRleHQgd2l0aCBuYW1lICVzLCBwYnVmPSVwLCBwY3R4PSVwIiwKKyAgICAgICAgcGJ1Zi0+Y29udGV4dF9uYW1lLCBwYnVmLCBwY3R4KTsKKyAgICBwY3R4LT5yaW5nX2J1ZmZlcnMgPSBnX3NsaXN0X3ByZXBlbmQgKHBjdHgtPnJpbmdfYnVmZmVycywgcGJ1Zik7CisgIH0KKworICBnX211dGV4X3VubG9jayAoJnBhX3NoYXJlZF9yZXNvdXJjZV9tdXRleCk7CisgIG5lZWRfdW5sb2NrX3NoYXJlZCA9IEZBTFNFOworCisgIC8qIGNvbnRleHQgY3JlYXRlZCBvciBzaGFyZWQgb2theSAqLworICBwYnVmLT5jb250ZXh0ID0gcGFfY29udGV4dF9yZWYgKHBjdHgtPmNvbnRleHQpOworCisgIGZvciAoOzspIHsKKyAgICBwYV9jb250ZXh0X3N0YXRlX3Qgc3RhdGU7CisKKyAgICBzdGF0ZSA9IHBhX2NvbnRleHRfZ2V0X3N0YXRlIChwYnVmLT5jb250ZXh0KTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgImNvbnRleHQgc3RhdGUgaXMgbm93ICVkIiwgc3RhdGUpOworCisgICAgaWYgKCFQQV9DT05URVhUX0lTX0dPT0QgKHN0YXRlKSkKKyAgICAgIGdvdG8gY29ubmVjdF9mYWlsZWQ7CisKKyAgICBpZiAoc3RhdGUgPT0gUEFfQ09OVEVYVF9SRUFEWSkKKyAgICAgIGJyZWFrOworCisgICAgLyogV2FpdCB1bnRpbCB0aGUgY29udGV4dCBpcyByZWFkeSAqLworICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgIndhaXRpbmcuLiIpOworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQgKG1haW5sb29wKTsKKyAgfQorCisgIGlmIChwYV9jb250ZXh0X2dldF9zZXJ2ZXJfcHJvdG9jb2xfdmVyc2lvbiAocGJ1Zi0+Y29udGV4dCkgPCAyMikgeworICAgIC8qIFdlIG5lZWQgUHVsc2VBdWRpbyA+PSAxLjAgb24gdGhlIHNlcnZlciBzaWRlIGZvciB0aGUgZXh0ZW5kZWQgQVBJICovCisgICAgZ290byBiYWRfc2VydmVyX3ZlcnNpb247CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocHNpbmssICJvcGVuZWQgdGhlIGRldmljZSIpOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAobWFpbmxvb3ApOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLwordW5sb2NrX2FuZF9mYWlsOgorICB7CisgICAgaWYgKG5lZWRfdW5sb2NrX3NoYXJlZCkKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmcGFfc2hhcmVkX3Jlc291cmNlX211dGV4KTsKKyAgICBnc3RfcHVsc2VyaW5nX2Rlc3Ryb3lfY29udGV4dCAocGJ1Zik7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChtYWlubG9vcCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitjcmVhdGVfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBzaW5rLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoIkZhaWxlZCB0byBjcmVhdGUgY29udGV4dCIpLCAoTlVMTCkpOworICAgIGdfc2xpY2VfZnJlZSAoR3N0UHVsc2VDb250ZXh0LCBwY3R4KTsKKyAgICBnb3RvIHVubG9ja19hbmRfZmFpbDsKKyAgfQorY29ubmVjdF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHNpbmssIFJFU09VUkNFLCBGQUlMRUQsICgiRmFpbGVkIHRvIGNvbm5lY3Q6ICVzIiwKKyAgICAgICAgICAgIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwY3R4LT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9CitiYWRfc2VydmVyX3ZlcnNpb246CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHNpbmssIFJFU09VUkNFLCBGQUlMRUQsICgiUHVsc2VBdWRpbyBzZXJ2ZXIgdmVyc2lvbiAiCisgICAgICAgICAgICAiaXMgdG9vIG9sZC4iKSwgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9ja19hbmRfZmFpbDsKKyAgfQorfQorCisvKiBjbG9zZSB0aGUgZGV2aWNlICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wdWxzZXJpbmdidWZmZXJfY2xvc2VfZGV2aWNlIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKworICBwYnVmID0gR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAoYnVmKTsKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChidWYpKTsKKworICBHU1RfTE9HX09CSkVDVCAocHNpbmssICJjbG9zaW5nIGRldmljZSIpOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKG1haW5sb29wKTsKKyAgZ3N0X3B1bHNlcmluZ19kZXN0cm95X2NvbnRleHQgKHBidWYpOworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKworICBHU1RfTE9HX09CSkVDVCAocHNpbmssICJjbG9zZWQgZGV2aWNlIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VyaW5nX3N0cmVhbV9zdGF0ZV9jYiAocGFfc3RyZWFtICogcywgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKyAgcGFfc3RyZWFtX3N0YXRlX3Qgc3RhdGU7CisKKyAgcGJ1ZiA9IEdTVF9QVUxTRVJJTkdfQlVGRkVSX0NBU1QgKHVzZXJkYXRhKTsKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisKKyAgc3RhdGUgPSBwYV9zdHJlYW1fZ2V0X3N0YXRlIChzKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLCAiZ290IG5ldyBzdHJlYW0gc3RhdGUgJWQiLCBzdGF0ZSk7CisKKyAgc3dpdGNoIChzdGF0ZSkgeworICAgIGNhc2UgUEFfU1RSRUFNX1JFQURZOgorICAgIGNhc2UgUEFfU1RSRUFNX0ZBSUxFRDoKKyAgICBjYXNlIFBBX1NUUkVBTV9URVJNSU5BVEVEOgorICAgICAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLCAic2lnbmFsaW5nIik7CisgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwgKG1haW5sb29wLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUEFfU1RSRUFNX1VOQ09OTkVDVEVEOgorICAgIGNhc2UgUEFfU1RSRUFNX0NSRUFUSU5HOgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXJpbmdfc3RyZWFtX3JlcXVlc3RfY2IgKHBhX3N0cmVhbSAqIHMsIHNpemVfdCBsZW5ndGgsIHZvaWQgKnVzZXJkYXRhKQoreworICBHc3RQdWxzZVNpbmsgKnBzaW5rOworICBHc3RBdWRpb1JpbmdCdWZmZXIgKnJidWY7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKworICByYnVmID0gR1NUX0FVRElPX1JJTkdfQlVGRkVSX0NBU1QgKHVzZXJkYXRhKTsKKyAgcGJ1ZiA9IEdTVF9QVUxTRVJJTkdfQlVGRkVSX0NBU1QgKHVzZXJkYXRhKTsKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLCAiZ290IHJlcXVlc3QgZm9yIGxlbmd0aCAlIiBHX0dTSVpFX0ZPUk1BVCwgbGVuZ3RoKTsKKworICBpZiAocGJ1Zi0+aW5fY29tbWl0ICYmIChsZW5ndGggPj0gcmJ1Zi0+c3BlYy5zZWdzaXplKSkgeworICAgIC8qIG9ubHkgc2lnbmFsIHdoZW4gd2UgYXJlIHdhaXRpbmcgaW4gdGhlIGNvbW1pdCB0aHJlYWQKKyAgICAgKiBhbmQgZ290IHJlcXVlc3QgZm9yIGF0bGVhc3QgYSBzZWdtZW50ICovCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsIChtYWlubG9vcCwgMCk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXJpbmdfc3RyZWFtX3VuZGVyZmxvd19jYiAocGFfc3RyZWFtICogcywgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKworICBwYnVmID0gR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAodXNlcmRhdGEpOworICBwc2luayA9IEdTVF9QVUxTRVNJTktfQ0FTVCAoR1NUX09CSkVDVF9QQVJFTlQgKHBidWYpKTsKKworICBHU1RfV0FSTklOR19PQkpFQ1QgKHBzaW5rLCAiR290IHVuZGVyZmxvdyIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlcmluZ19zdHJlYW1fb3ZlcmZsb3dfY2IgKHBhX3N0cmVhbSAqIHMsIHZvaWQgKnVzZXJkYXRhKQoreworICBHc3RQdWxzZVNpbmsgKnBzaW5rOworICBHc3RQdWxzZVJpbmdCdWZmZXIgKnBidWY7CisKKyAgcGJ1ZiA9IEdTVF9QVUxTRVJJTkdfQlVGRkVSX0NBU1QgKHVzZXJkYXRhKTsKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisKKyAgR1NUX1dBUk5JTkdfT0JKRUNUIChwc2luaywgIkdvdCBvdmVyZmxvdyIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlcmluZ19zdHJlYW1fbGF0ZW5jeV9jYiAocGFfc3RyZWFtICogcywgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKyAgR3N0QXVkaW9SaW5nQnVmZmVyICpyaW5nYnVmOworICBjb25zdCBwYV90aW1pbmdfaW5mbyAqaW5mbzsKKyAgcGFfdXNlY190IHNpbmtfdXNlYzsKKworICBpbmZvID0gcGFfc3RyZWFtX2dldF90aW1pbmdfaW5mbyAocyk7CisKKyAgcGJ1ZiA9IEdTVF9QVUxTRVJJTkdfQlVGRkVSX0NBU1QgKHVzZXJkYXRhKTsKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisgIHJpbmdidWYgPSBHU1RfQVVESU9fUklOR19CVUZGRVIgKHBidWYpOworCisgIGlmICghaW5mbykgeworICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgImxhdGVuY3kgdXBkYXRlIChpbmZvcm1hdGlvbiB1bmtub3duKSIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmICghaW5mby0+cmVhZF9pbmRleF9jb3JydXB0KSB7CisgICAgLyogVXBkYXRlIHNlZ2RvbmUgYmFzZWQgb24gdGhlIHJlYWQgaW5kZXguIHNlZ2RvbmUgaXMgb2Ygc2VnbWVudAorICAgICAqIGdyYW51bGFyaXR5LCB3aGlsZSB0aGUgcmVhZCBpbmRleCBpcyBhdCBieXRlIGdyYW51bGFyaXR5LiBXZSB0YWtlIHRoZQorICAgICAqIGNlaWxpbmcgd2hpbGUgY29udmVydGluZyB0aGUgbGF0dGVyIHRvIHRoZSBmb3JtZXIgc2luY2UgaXQgaXMgbW9yZQorICAgICAqIGNvbnNlcnZhdGl2ZSB0byByZXBvcnQgdGhhdCB3ZSd2ZSByZWFkIG1vcmUgdGhhbiB3ZSBoYXZlIHRoYW4gdG8gcmVwb3J0CisgICAgICogbGVzcy4gT25lIGNvbmNlcm4gaGVyZSBpcyB0aGF0IGxhdGVuY3kgdXBkYXRlcyBoYXBwZW4gZXZlcnkgMTAwbXMsIHdoaWNoCisgICAgICogbWVhbnMgc2VnZG9uZSBpcyBub3QgdXBkYXRlZCB2ZXJ5IG9mdGVuLCBidXQgaW5jcmVhc2luZyB0aGUgdXBkYXRlCisgICAgICogZnJlcXVlbmN5IHdvdWxkIG1lYW4gbW9yZSBjb21tdW5pY2F0aW9uIG92ZXJoZWFkLiAqLworICAgIGdfYXRvbWljX2ludF9zZXQgKCZyaW5nYnVmLT5zZWdkb25lLAorICAgICAgICAoaW50KSBnc3RfdXRpbF91aW50NjRfc2NhbGVfY2VpbCAoaW5mby0+cmVhZF9pbmRleCwgMSwKKyAgICAgICAgICAgIHJpbmdidWYtPnNwZWMuc2Vnc2l6ZSkpOworICB9CisKKyAgc2lua191c2VjID0gaW5mby0+Y29uZmlndXJlZF9zaW5rX3VzZWM7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLAorICAgICAgImxhdGVuY3lfdXBkYXRlLCAlIiBHX0dVSU5UNjRfRk9STUFUICIsICVkOiUiIEdfR0lOVDY0X0ZPUk1BVCAiLCAlZDolIgorICAgICAgR19HVUlOVDY0X0ZPUk1BVCAiLCAlIiBHX0dVSU5UNjRfRk9STUFUICIsICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBHU1RfVElNRVZBTF9UT19USU1FIChpbmZvLT50aW1lc3RhbXApLCBpbmZvLT53cml0ZV9pbmRleF9jb3JydXB0LAorICAgICAgaW5mby0+d3JpdGVfaW5kZXgsIGluZm8tPnJlYWRfaW5kZXhfY29ycnVwdCwgaW5mby0+cmVhZF9pbmRleCwKKyAgICAgIGluZm8tPnNpbmtfdXNlYywgc2lua191c2VjKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXJpbmdfc3RyZWFtX3N1c3BlbmRlZF9jYiAocGFfc3RyZWFtICogcCwgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKworICBwYnVmID0gR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAodXNlcmRhdGEpOworICBwc2luayA9IEdTVF9QVUxTRVNJTktfQ0FTVCAoR1NUX09CSkVDVF9QQVJFTlQgKHBidWYpKTsKKworICBpZiAocGFfc3RyZWFtX2lzX3N1c3BlbmRlZCAocCkpCisgICAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJzdHJlYW0gc3VzcGVuZGVkIik7CisgIGVsc2UKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgInN0cmVhbSByZXN1bWVkIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VyaW5nX3N0cmVhbV9zdGFydGVkX2NiIChwYV9zdHJlYW0gKiBwLCB2b2lkICp1c2VyZGF0YSkKK3sKKyAgR3N0UHVsc2VTaW5rICpwc2luazsKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmOworCisgIHBidWYgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUICh1c2VyZGF0YSk7CisgIHBzaW5rID0gR1NUX1BVTFNFU0lOS19DQVNUIChHU1RfT0JKRUNUX1BBUkVOVCAocGJ1ZikpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAic3RyZWFtIHN0YXJ0ZWQiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXJpbmdfc3RyZWFtX2V2ZW50X2NiIChwYV9zdHJlYW0gKiBwLCBjb25zdCBjaGFyICpuYW1lLAorICAgIHBhX3Byb3BsaXN0ICogcGwsIHZvaWQgKnVzZXJkYXRhKQoreworICBHc3RQdWxzZVNpbmsgKnBzaW5rOworICBHc3RQdWxzZVJpbmdCdWZmZXIgKnBidWY7CisKKyAgcGJ1ZiA9IEdTVF9QVUxTRVJJTkdfQlVGRkVSX0NBU1QgKHVzZXJkYXRhKTsKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisKKyAgaWYgKCFzdHJjbXAgKG5hbWUsIFBBX1NUUkVBTV9FVkVOVF9SRVFVRVNUX0NPUkspKSB7CisgICAgLyogdGhlIHN0cmVhbSB3YW50cyB0byBQQVVTRSwgcG9zdCBhIG1lc3NhZ2UgZm9yIHRoZSBhcHBsaWNhdGlvbi4gKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgImdvdCByZXF1ZXN0IGZvciBDT1JLIik7CisgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChwc2luayksCisgICAgICAgIGdzdF9tZXNzYWdlX25ld19yZXF1ZXN0X3N0YXRlIChHU1RfT0JKRUNUX0NBU1QgKHBzaW5rKSwKKyAgICAgICAgICAgIEdTVF9TVEFURV9QQVVTRUQpKTsKKworICB9IGVsc2UgaWYgKCFzdHJjbXAgKG5hbWUsIFBBX1NUUkVBTV9FVkVOVF9SRVFVRVNUX1VOQ09SSykpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgImdvdCByZXF1ZXN0IGZvciBVTkNPUksiKTsKKyAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHBzaW5rKSwKKyAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X3JlcXVlc3Rfc3RhdGUgKEdTVF9PQkpFQ1RfQ0FTVCAocHNpbmspLAorICAgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChuYW1lLCBQQV9TVFJFQU1fRVZFTlRfRk9STUFUX0xPU1QpKSB7CisgICAgR3N0RXZlbnQgKnJlbmVnbzsKKworICAgIGlmIChnX2F0b21pY19pbnRfZ2V0ICgmcHNpbmstPmZvcm1hdF9sb3N0KSkgeworICAgICAgLyogRHVwbGljYXRlIGV2ZW50IGJlZm9yZSB3ZSdyZSBkb25lIHJlY29uZmlndXJpbmcsIGRpc2NhcmQgKi8KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgImdvdCBGT1JNQVQgTE9TVCIpOworICAgIGdfYXRvbWljX2ludF9zZXQgKCZwc2luay0+Zm9ybWF0X2xvc3QsIDEpOworICAgIHBzaW5rLT5mb3JtYXRfbG9zdF90aW1lID0gZ19hc2NpaV9zdHJ0b3VsbCAocGFfcHJvcGxpc3RfZ2V0cyAocGwsCisgICAgICAgICAgICAic3RyZWFtLXRpbWUiKSwgTlVMTCwgMCkgKiAxMDAwOworCisgICAgZ19mcmVlIChwc2luay0+ZGV2aWNlKTsKKyAgICBwc2luay0+ZGV2aWNlID0gZ19zdHJkdXAgKHBhX3Byb3BsaXN0X2dldHMgKHBsLCAiZGV2aWNlIikpOworCisgICAgLyogRklYTUU6IHNlbmQgcmVjb25maWd1cmUgZXZlbnQgaW5zdGVhZCBhbmQgbGV0IGRlY29kZWJpbi9wbGF5YmluCisgICAgICogaGFuZGxlIHRoYXQuIEFsc28gdGFrZSBjYXJlIG9mIGFjMyBhbGlnbm1lbnQgKi8KKyAgICByZW5lZ28gPSBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXdfZW1wdHkgKCJwdWxzZS1mb3JtYXQtbG9zdCIpKTsKKworI2lmIDAKKyAgICBpZiAoZ19zdHJfZXF1YWwgKGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHN0KSwgImF1ZGlvL3gtZWFjMyIpKSB7CisgICAgICBHc3RTdHJ1Y3R1cmUgKmV2ZW50X3N0ID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJhYzNwYXJzZS1zZXQtYWxpZ25tZW50IiwKKyAgICAgICAgICAiYWxpZ25tZW50IiwgR19UWVBFX1NUUklORywgcGJpbi0+ZGJpbiA/ICJmcmFtZSIgOiAiaWVjNjE5MzciLCBOVUxMKTsKKworICAgICAgaWYgKCFnc3RfcGFkX3B1c2hfZXZlbnQgKHBiaW4tPnNpbmtwYWQsCisgICAgICAgICAgICAgIGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNLCBldmVudF9zdCkpKQorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBiaW4tPnNpbmtwYWQsICJDb3VsZCBub3QgdXBkYXRlIGFsaWdubWVudCIpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCFnc3RfcGFkX3B1c2hfZXZlbnQgKEdTVF9CQVNFX1NJTksgKHBzaW5rKS0+c2lua3BhZCwgcmVuZWdvKSkgeworICAgICAgLyogTm9ib2R5IGhhbmRsZWQgdGhlIGZvcm1hdCBjaGFuZ2UgLSBlbWl0IGFuIGVycm9yICovCisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHNpbmssIFNUUkVBTSwgRk9STUFULCAoIlNpbmsgZm9ybWF0IGNoYW5nZWQiKSwKKyAgICAgICAgICAoIlNpbmsgZm9ybWF0IGNoYW5nZWQiKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAiZ290IHVua25vd24gZXZlbnQgJXMiLCBuYW1lKTsKKyAgfQorfQorCisvKiBDYWxsZWQgd2l0aCB0aGUgbWFpbmxvb3AgbG9ja2VkICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wdWxzZXJpbmdfd2FpdF9mb3Jfc3RyZWFtX3JlYWR5IChHc3RQdWxzZVNpbmsgKiBwc2luaywgcGFfc3RyZWFtICogc3RyZWFtKQoreworICBwYV9zdHJlYW1fc3RhdGVfdCBzdGF0ZTsKKworICBmb3IgKDs7KSB7CisgICAgc3RhdGUgPSBwYV9zdHJlYW1fZ2V0X3N0YXRlIChzdHJlYW0pOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLCAic3RyZWFtIHN0YXRlIGlzIG5vdyAlZCIsIHN0YXRlKTsKKworICAgIGlmICghUEFfU1RSRUFNX0lTX0dPT0QgKHN0YXRlKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmIChzdGF0ZSA9PSBQQV9TVFJFQU1fUkVBRFkpCisgICAgICByZXR1cm4gVFJVRTsKKworICAgIC8qIFdhaXQgdW50aWwgdGhlIHN0cmVhbSBpcyByZWFkeSAqLworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQgKG1haW5sb29wKTsKKyAgfQorfQorCisKKy8qIFRoaXMgbWV0aG9kIHNob3VsZCBjcmVhdGUgYSBuZXcgc3RyZWFtIG9mIHRoZSBnaXZlbiBAc3BlYy4gTm8gcGxheWJhY2sgc2hvdWxkCisgKiBzdGFydCB5ZXQgc28gd2Ugc3RhcnQgaW4gdGhlIGNvcmtlZCBzdGF0ZS4gKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3B1bHNlcmluZ2J1ZmZlcl9hY3F1aXJlIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYsCisgICAgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKyAgcGFfYnVmZmVyX2F0dHIgd2FudGVkOworICBjb25zdCBwYV9idWZmZXJfYXR0ciAqYWN0dWFsOworICBwYV9jaGFubmVsX21hcCBjaGFubmVsX21hcDsKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKyAgcGFfY3ZvbHVtZSB2OworICBwYV9jdm9sdW1lICpwdiA9IE5VTEw7CisgIHBhX3N0cmVhbV9mbGFnc190IGZsYWdzOworICBjb25zdCBnY2hhciAqbmFtZTsKKyAgR3N0QXVkaW9DbG9jayAqY2xvY2s7CisgIHBhX2Zvcm1hdF9pbmZvICpmb3JtYXRzWzFdOworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgZ2NoYXIgcHJpbnRfYnVmW1BBX0ZPUk1BVF9JTkZPX1NOUFJJTlRfTUFYXTsKKyNlbmRpZgorCisgIHBzaW5rID0gR1NUX1BVTFNFU0lOS19DQVNUIChHU1RfT0JKRUNUX1BBUkVOVCAoYnVmKSk7CisgIHBidWYgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUIChidWYpOworCisgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgImNyZWF0aW5nIHNhbXBsZSBzcGVjIik7CisgIC8qIGNvbnZlcnQgdGhlIGdzdHJlYW1lciBzYW1wbGUgc3BlYyB0byB0aGUgcHVsc2VhdWRpbyBmb3JtYXQgKi8KKyAgaWYgKCFnc3RfcHVsc2VfZmlsbF9mb3JtYXRfaW5mbyAoc3BlYywgJnBidWYtPmZvcm1hdCwgJnBidWYtPmNoYW5uZWxzKSkKKyAgICBnb3RvIGludmFsaWRfc3BlYzsKKyAgcGJ1Zi0+aXNfcGNtID0gcGFfZm9ybWF0X2luZm9faXNfcGNtIChwYnVmLT5mb3JtYXQpOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKG1haW5sb29wKTsKKworICAvKiB3ZSBuZWVkIGEgY29udGV4dCBhbmQgYSBubyBzdHJlYW0gKi8KKyAgZ19hc3NlcnQgKHBidWYtPmNvbnRleHQpOworICBnX2Fzc2VydCAoIXBidWYtPnN0cmVhbSk7CisKKyAgLyogaWYgd2UgaGF2ZSBhIHByb2JlLCBkaXNjb25uZWN0IGl0IGZpcnN0IHNvIHRoYXQgaWYgd2UncmUgY3JlYXRpbmcgYQorICAgKiBjb21wcmVzc2VkIHN0cmVhbSwgaXQgZG9lc24ndCBnZXQgYmxvY2tlZCBieSBhIFBDTSBzdHJlYW0gKi8KKyAgaWYgKHBidWYtPnByb2JlX3N0cmVhbSkgeworICAgIGdzdF9wdWxzZV9kZXN0cm95X3N0cmVhbSAocGJ1Zi0+cHJvYmVfc3RyZWFtLCBUUlVFKTsKKyAgICBwYnVmLT5wcm9iZV9zdHJlYW0gPSBOVUxMOworICB9CisKKyAgLyogZW5hYmxlIGV2ZW50IG5vdGlmaWNhdGlvbnMgKi8KKyAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLCAic3Vic2NyaWJpbmcgdG8gY29udGV4dCBldmVudHMiKTsKKyAgaWYgKCEobyA9IHBhX2NvbnRleHRfc3Vic2NyaWJlIChwYnVmLT5jb250ZXh0LAorICAgICAgICAgICAgICBQQV9TVUJTQ1JJUFRJT05fTUFTS19TSU5LX0lOUFVULCBOVUxMLCBOVUxMKSkpCisgICAgZ290byBzdWJzY3JpYmVfZmFpbGVkOworCisgIHBhX29wZXJhdGlvbl91bnJlZiAobyk7CisKKyAgLyogaW5pdGlhbGl6ZSB0aGUgY2hhbm5lbCBtYXAgKi8KKyAgaWYgKHBidWYtPmlzX3BjbSAmJiBnc3RfcHVsc2VfZ3N0X3RvX2NoYW5uZWxfbWFwICgmY2hhbm5lbF9tYXAsIHNwZWMpKQorICAgIHBhX2Zvcm1hdF9pbmZvX3NldF9jaGFubmVsX21hcCAocGJ1Zi0+Zm9ybWF0LCAmY2hhbm5lbF9tYXApOworCisgIC8qIGZpbmQgYSBnb29kIG5hbWUgZm9yIHRoZSBzdHJlYW0gKi8KKyAgaWYgKHBzaW5rLT5zdHJlYW1fbmFtZSkKKyAgICBuYW1lID0gcHNpbmstPnN0cmVhbV9uYW1lOworICBlbHNlCisgICAgbmFtZSA9ICJQbGF5YmFjayBTdHJlYW0iOworCisgIC8qIGNyZWF0ZSBhIHN0cmVhbSAqLworICBmb3JtYXRzWzBdID0gcGJ1Zi0+Zm9ybWF0OworICBpZiAoIShwYnVmLT5zdHJlYW0gPSBwYV9zdHJlYW1fbmV3X2V4dGVuZGVkIChwYnVmLT5jb250ZXh0LCBuYW1lLCBmb3JtYXRzLCAxLAorICAgICAgICAgICAgICBwc2luay0+cHJvcGxpc3QpKSkKKyAgICBnb3RvIHN0cmVhbV9mYWlsZWQ7CisKKyAgLyogaW5zdGFsbCBlc3NlbnRpYWwgY2FsbGJhY2tzICovCisgIHBhX3N0cmVhbV9zZXRfc3RhdGVfY2FsbGJhY2sgKHBidWYtPnN0cmVhbSwKKyAgICAgIGdzdF9wdWxzZXJpbmdfc3RyZWFtX3N0YXRlX2NiLCBwYnVmKTsKKyAgcGFfc3RyZWFtX3NldF93cml0ZV9jYWxsYmFjayAocGJ1Zi0+c3RyZWFtLAorICAgICAgZ3N0X3B1bHNlcmluZ19zdHJlYW1fcmVxdWVzdF9jYiwgcGJ1Zik7CisgIHBhX3N0cmVhbV9zZXRfdW5kZXJmbG93X2NhbGxiYWNrIChwYnVmLT5zdHJlYW0sCisgICAgICBnc3RfcHVsc2VyaW5nX3N0cmVhbV91bmRlcmZsb3dfY2IsIHBidWYpOworICBwYV9zdHJlYW1fc2V0X292ZXJmbG93X2NhbGxiYWNrIChwYnVmLT5zdHJlYW0sCisgICAgICBnc3RfcHVsc2VyaW5nX3N0cmVhbV9vdmVyZmxvd19jYiwgcGJ1Zik7CisgIHBhX3N0cmVhbV9zZXRfbGF0ZW5jeV91cGRhdGVfY2FsbGJhY2sgKHBidWYtPnN0cmVhbSwKKyAgICAgIGdzdF9wdWxzZXJpbmdfc3RyZWFtX2xhdGVuY3lfY2IsIHBidWYpOworICBwYV9zdHJlYW1fc2V0X3N1c3BlbmRlZF9jYWxsYmFjayAocGJ1Zi0+c3RyZWFtLAorICAgICAgZ3N0X3B1bHNlcmluZ19zdHJlYW1fc3VzcGVuZGVkX2NiLCBwYnVmKTsKKyAgcGFfc3RyZWFtX3NldF9zdGFydGVkX2NhbGxiYWNrIChwYnVmLT5zdHJlYW0sCisgICAgICBnc3RfcHVsc2VyaW5nX3N0cmVhbV9zdGFydGVkX2NiLCBwYnVmKTsKKyAgcGFfc3RyZWFtX3NldF9ldmVudF9jYWxsYmFjayAocGJ1Zi0+c3RyZWFtLAorICAgICAgZ3N0X3B1bHNlcmluZ19zdHJlYW1fZXZlbnRfY2IsIHBidWYpOworCisgIC8qIGJ1ZmZlcmluZyByZXF1aXJlbWVudHMuIFdoZW4gc2V0dGluZyBwcmVidWYgdG8gMCwgdGhlIHN0cmVhbSB3aWxsIG5vdCBwYXVzZQorICAgKiB3aGVuIHdlIGNhdXNlIGFuIHVuZGVycnVuLCB3aGljaCBjYXVzZXMgdGltZSB0byBjb250aW51ZS4gKi8KKyAgbWVtc2V0ICgmd2FudGVkLCAwLCBzaXplb2YgKHdhbnRlZCkpOworICB3YW50ZWQudGxlbmd0aCA9IHNwZWMtPnNlZ3RvdGFsICogc3BlYy0+c2Vnc2l6ZTsKKyAgd2FudGVkLm1heGxlbmd0aCA9IC0xOworICB3YW50ZWQucHJlYnVmID0gMDsKKyAgd2FudGVkLm1pbnJlcSA9IHNwZWMtPnNlZ3NpemU7CisKKyAgR1NUX0lORk9fT0JKRUNUIChwc2luaywgInRsZW5ndGg6ICAgJWQiLCB3YW50ZWQudGxlbmd0aCk7CisgIEdTVF9JTkZPX09CSkVDVCAocHNpbmssICJtYXhsZW5ndGg6ICVkIiwgd2FudGVkLm1heGxlbmd0aCk7CisgIEdTVF9JTkZPX09CSkVDVCAocHNpbmssICJwcmVidWY6ICAgICVkIiwgd2FudGVkLnByZWJ1Zik7CisgIEdTVF9JTkZPX09CSkVDVCAocHNpbmssICJtaW5yZXE6ICAgICVkIiwgd2FudGVkLm1pbnJlcSk7CisKKyAgLyogY29uZmlndXJlIHZvbHVtZSB3aGVuIHdlIGNoYW5nZWQgaXQsIGVsc2Ugd2UgbGVhdmUgdGhlIGRlZmF1bHQgKi8KKyAgaWYgKHBzaW5rLT52b2x1bWVfc2V0KSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLCAiaGF2ZSB2b2x1bWUgb2YgJWYiLCBwc2luay0+dm9sdW1lKTsKKyAgICBwdiA9ICZ2OworICAgIGlmIChwYnVmLT5pc19wY20pCisgICAgICBnc3RfcHVsc2VfY3ZvbHVtZV9mcm9tX2xpbmVhciAocHYsIHBidWYtPmNoYW5uZWxzLCBwc2luay0+dm9sdW1lKTsKKyAgICBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAicGFzc3Rocm91Z2ggc3RyZWFtLCBub3Qgc2V0dGluZyB2b2x1bWUiKTsKKyAgICAgIHB2ID0gTlVMTDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcHYgPSBOVUxMOworICB9CisKKyAgLyogY29uc3RydWN0IHRoZSBmbGFncyAqLworICBmbGFncyA9IFBBX1NUUkVBTV9JTlRFUlBPTEFURV9USU1JTkcgfCBQQV9TVFJFQU1fQVVUT19USU1JTkdfVVBEQVRFIHwKKyAgICAgIFBBX1NUUkVBTV9BREpVU1RfTEFURU5DWSB8IFBBX1NUUkVBTV9TVEFSVF9DT1JLRUQ7CisKKyAgaWYgKHBzaW5rLT5tdXRlX3NldCkgeworICAgIGlmIChwc2luay0+bXV0ZSkKKyAgICAgIGZsYWdzIHw9IFBBX1NUUkVBTV9TVEFSVF9NVVRFRDsKKyAgICBlbHNlCisgICAgICBmbGFncyB8PSBQQV9TVFJFQU1fU1RBUlRfVU5NVVRFRDsKKyAgfQorCisgIC8qIHdlIGFsd2F5cyBzdGFydCBjb3JrZWQgKHNlZSBmbGFncyBhYm92ZSkgKi8KKyAgcGJ1Zi0+Y29ya2VkID0gVFJVRTsKKworICAvKiB0cnkgdG8gY29ubmVjdCBub3cgKi8KKyAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLCAiY29ubmVjdCBmb3IgcGxheWJhY2sgdG8gZGV2aWNlICVzIiwKKyAgICAgIEdTVF9TVFJfTlVMTCAocHNpbmstPmRldmljZSkpOworICBpZiAocGFfc3RyZWFtX2Nvbm5lY3RfcGxheWJhY2sgKHBidWYtPnN0cmVhbSwgcHNpbmstPmRldmljZSwKKyAgICAgICAgICAmd2FudGVkLCBmbGFncywgcHYsIE5VTEwpIDwgMCkKKyAgICBnb3RvIGNvbm5lY3RfZmFpbGVkOworCisgIC8qIG91ciBjbG9jayB3aWxsIG5vdyBzdGFydCBmcm9tIDAgYWdhaW4gKi8KKyAgY2xvY2sgPSBHU1RfQVVESU9fQ0xPQ0sgKEdTVF9BVURJT19CQVNFX1NJTksgKHBzaW5rKS0+cHJvdmlkZWRfY2xvY2spOworICBnc3RfYXVkaW9fY2xvY2tfcmVzZXQgKGNsb2NrLCAwKTsKKworICBpZiAoIWdzdF9wdWxzZXJpbmdfd2FpdF9mb3Jfc3RyZWFtX3JlYWR5IChwc2luaywgcGJ1Zi0+c3RyZWFtKSkKKyAgICBnb3RvIGNvbm5lY3RfZmFpbGVkOworCisgIGdfZnJlZSAocHNpbmstPmRldmljZSk7CisgIHBzaW5rLT5kZXZpY2UgPSBnX3N0cmR1cCAocGFfc3RyZWFtX2dldF9kZXZpY2VfbmFtZSAocGJ1Zi0+c3RyZWFtKSk7CisKKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgIHBhX2Zvcm1hdF9pbmZvX3NucHJpbnQgKHByaW50X2J1Ziwgc2l6ZW9mIChwcmludF9idWYpLAorICAgICAgcGFfc3RyZWFtX2dldF9mb3JtYXRfaW5mbyAocGJ1Zi0+c3RyZWFtKSk7CisgIEdTVF9JTkZPX09CSkVDVCAocHNpbmssICJuZWdvdGlhdGVkIHRvOiAlcyIsIHByaW50X2J1Zik7CisjZW5kaWYKKworICAvKiBBZnRlciB3ZSBwYXNzZWQgdGhlIHZvbHVtZSBvZmYgb2YgdG8gUEEgd2UgbmV2ZXIgd2FudCB0byBzZXQgaXQKKyAgICAgYWdhaW4sIHNpbmNlIGl0IGlzIFBBJ3Mgam9iIHRvIHNhdmUvcmVzdG9yZSB2b2x1bWVzLiAgKi8KKyAgcHNpbmstPnZvbHVtZV9zZXQgPSBwc2luay0+bXV0ZV9zZXQgPSBGQUxTRTsKKworICBHU1RfTE9HX09CSkVDVCAocHNpbmssICJzdHJlYW0gaXMgYWNxdWlyZWQgbm93Iik7CisKKyAgLyogZ2V0IHRoZSBhY3R1YWwgYnVmZmVyaW5nIHByb3BlcnRpZXMgbm93ICovCisgIGFjdHVhbCA9IHBhX3N0cmVhbV9nZXRfYnVmZmVyX2F0dHIgKHBidWYtPnN0cmVhbSk7CisKKyAgR1NUX0lORk9fT0JKRUNUIChwc2luaywgInRsZW5ndGg6ICAgJWQgKHdhbnRlZDogJWQpIiwgYWN0dWFsLT50bGVuZ3RoLAorICAgICAgd2FudGVkLnRsZW5ndGgpOworICBHU1RfSU5GT19PQkpFQ1QgKHBzaW5rLCAibWF4bGVuZ3RoOiAlZCIsIGFjdHVhbC0+bWF4bGVuZ3RoKTsKKyAgR1NUX0lORk9fT0JKRUNUIChwc2luaywgInByZWJ1ZjogICAgJWQiLCBhY3R1YWwtPnByZWJ1Zik7CisgIEdTVF9JTkZPX09CSkVDVCAocHNpbmssICJtaW5yZXE6ICAgICVkICh3YW50ZWQgJWQpIiwgYWN0dWFsLT5taW5yZXEsCisgICAgICB3YW50ZWQubWlucmVxKTsKKworICBzcGVjLT5zZWdzaXplID0gYWN0dWFsLT5taW5yZXE7CisgIHNwZWMtPnNlZ3RvdGFsID0gYWN0dWFsLT50bGVuZ3RoIC8gc3BlYy0+c2Vnc2l6ZTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK3VubG9ja19hbmRfZmFpbDoKKyAgeworICAgIGdzdF9wdWxzZXJpbmdfZGVzdHJveV9zdHJlYW0gKHBidWYpOworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAobWFpbmxvb3ApOworCisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbnZhbGlkX3NwZWM6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHNpbmssIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKCJJbnZhbGlkIHNhbXBsZSBzcGVjaWZpY2F0aW9uLiIpLCAoTlVMTCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorc3Vic2NyaWJlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwc2luaywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV9jb250ZXh0X3N1YnNjcmliZSgpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHBidWYtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byB1bmxvY2tfYW5kX2ZhaWw7CisgIH0KK3N0cmVhbV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHNpbmssIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgiRmFpbGVkIHRvIGNyZWF0ZSBzdHJlYW06ICVzIiwKKyAgICAgICAgICAgIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwYnVmLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9Citjb25uZWN0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwc2luaywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJGYWlsZWQgdG8gY29ubmVjdCBzdHJlYW06ICVzIiwKKyAgICAgICAgICAgIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwYnVmLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9Cit9CisKKy8qIGZyZWUgdGhlIHN0cmVhbSB0aGF0IHdlIGFjcXVpcmVkIGJlZm9yZSAqLworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VyaW5nYnVmZmVyX3JlbGVhc2UgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmOworCisgIHBidWYgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUIChidWYpOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKG1haW5sb29wKTsKKyAgZ3N0X3B1bHNlcmluZ19kZXN0cm95X3N0cmVhbSAocGJ1Zik7CisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAobWFpbmxvb3ApOworCisgIHsKKyAgICBHc3RQdWxzZVNpbmsgKnBzaW5rOworCisgICAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisgICAgZ19hdG9taWNfaW50X3NldCAoJnBzaW5rLT5mb3JtYXRfbG9zdCwgRkFMU0UpOworICAgIHBzaW5rLT5mb3JtYXRfbG9zdF90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlcmluZ19zdWNjZXNzX2NiIChwYV9zdHJlYW0gKiBzLCBpbnQgc3VjY2Vzcywgdm9pZCAqdXNlcmRhdGEpCit7CisgIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbCAobWFpbmxvb3AsIDApOworfQorCisvKiB1cGRhdGUgdGhlIGNvcmtlZCBzdGF0ZSBvZiBhIHN0cmVhbSwgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbWFpbmxvb3AKKyAqIGxvY2sgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3B1bHNlcmluZ19zZXRfY29ya2VkIChHc3RQdWxzZVJpbmdCdWZmZXIgKiBwYnVmLCBnYm9vbGVhbiBjb3JrZWQsCisgICAgZ2Jvb2xlYW4gd2FpdCkKK3sKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKyAgR3N0UHVsc2VTaW5rICpwc2luazsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisKKyAgaWYgKGdfYXRvbWljX2ludF9nZXQgKCZwc2luay0+Zm9ybWF0X2xvc3QpKSB7CisgICAgLyogU2luayBmb3JtYXQgY2hhbmdlZCwgc3RyZWFtJ3MgZ29uZSBzbyBmYWtlIGJlaW5nIHBhdXNlZCAqLworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJzZXR0aW5nIGNvcmtlZCBzdGF0ZSB0byAlZCIsIGNvcmtlZCk7CisgIGlmIChwYnVmLT5jb3JrZWQgIT0gY29ya2VkKSB7CisgICAgaWYgKCEobyA9IHBhX3N0cmVhbV9jb3JrIChwYnVmLT5zdHJlYW0sIGNvcmtlZCwKKyAgICAgICAgICAgICAgICBnc3RfcHVsc2VyaW5nX3N1Y2Nlc3NfY2IsIHBidWYpKSkKKyAgICAgIGdvdG8gY29ya19mYWlsZWQ7CisKKyAgICB3aGlsZSAod2FpdCAmJiBwYV9vcGVyYXRpb25fZ2V0X3N0YXRlIChvKSA9PSBQQV9PUEVSQVRJT05fUlVOTklORykgeworICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAobWFpbmxvb3ApOworICAgICAgaWYgKGdzdF9wdWxzZXJpbmdfaXNfZGVhZCAocHNpbmssIHBidWYsIFRSVUUpKQorICAgICAgICBnb3RvIHNlcnZlcl9kZWFkOworICAgIH0KKyAgICBwYnVmLT5jb3JrZWQgPSBjb3JrZWQ7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJza2lwcGluZywgYWxyZWFkeSBpbiByZXF1ZXN0ZWQgc3RhdGUiKTsKKyAgfQorICByZXMgPSBUUlVFOworCitjbGVhbnVwOgorICBpZiAobykKKyAgICBwYV9vcGVyYXRpb25fdW5yZWYgKG8pOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitzZXJ2ZXJfZGVhZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAidGhlIHNlcnZlciBpcyBkZWFkIik7CisgICAgZ290byBjbGVhbnVwOworICB9Citjb3JrX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwc2luaywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV9zdHJlYW1fY29yaygpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHBidWYtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byBjbGVhbnVwOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VyaW5nYnVmZmVyX2NsZWFyIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKworICBwYnVmID0gR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAoYnVmKTsKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAobWFpbmxvb3ApOworICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgImNsZWFyaW5nIik7CisgIGlmIChwYnVmLT5zdHJlYW0pIHsKKyAgICAvKiBkb24ndCB3YWl0IGZvciB0aGUgZmx1c2ggdG8gY29tcGxldGUgKi8KKyAgICBpZiAoKG8gPSBwYV9zdHJlYW1fZmx1c2ggKHBidWYtPnN0cmVhbSwgTlVMTCwgcGJ1ZikpKQorICAgICAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKyAgfQorICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKK30KKworI2lmIDAKKy8qIGNhbGxlZCBmcm9tIHB1bHNlIHRocmVhZCB3aXRoIHRoZSBtYWlubG9vcCBsb2NrICovCitzdGF0aWMgdm9pZAorbWFpbmxvb3BfZW50ZXJfZGVmZXJfY2IgKHBhX21haW5sb29wX2FwaSAqIGFwaSwgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU2luayAqcHVsc2VzaW5rID0gR1NUX1BVTFNFU0lOSyAodXNlcmRhdGEpOworICBHc3RNZXNzYWdlICptZXNzYWdlOworICBHVmFsdWUgdmFsID0geyAwIH07CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocHVsc2VzaW5rLCAicG9zdGluZyBFTlRFUiBzdHJlYW0gc3RhdHVzIik7CisgIG1lc3NhZ2UgPSBnc3RfbWVzc2FnZV9uZXdfc3RyZWFtX3N0YXR1cyAoR1NUX09CSkVDVCAocHVsc2VzaW5rKSwKKyAgICAgIEdTVF9TVFJFQU1fU1RBVFVTX1RZUEVfRU5URVIsIEdTVF9FTEVNRU5UIChwdWxzZXNpbmspKTsKKyAgZ192YWx1ZV9pbml0ICgmdmFsLCBHU1RfVFlQRV9HX1RIUkVBRCk7CisgIGdfdmFsdWVfc2V0X2JveGVkICgmdmFsLCBnX3RocmVhZF9zZWxmICgpKTsKKyAgZ3N0X21lc3NhZ2Vfc2V0X3N0cmVhbV9zdGF0dXNfb2JqZWN0IChtZXNzYWdlLCAmdmFsKTsKKyAgZ192YWx1ZV91bnNldCAoJnZhbCk7CisKKyAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVCAocHVsc2VzaW5rKSwgbWVzc2FnZSk7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAocHVsc2VzaW5rLT5kZWZlcl9wZW5kaW5nKTsKKyAgcHVsc2VzaW5rLT5kZWZlcl9wZW5kaW5nLS07CisgIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbCAobWFpbmxvb3AsIDApOworfQorI2VuZGlmCisKKy8qIHN0YXJ0L3Jlc3VtZSBwbGF5YmFjayBBU0FQLCB3ZSBkb24ndCB1bmNvcmsgaGVyZSBidXQgaW4gdGhlIGNvbW1pdCBtZXRob2QgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3B1bHNlcmluZ2J1ZmZlcl9zdGFydCAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RQdWxzZVNpbmsgKnBzaW5rOworICBHc3RQdWxzZVJpbmdCdWZmZXIgKnBidWY7CisKKyAgcGJ1ZiA9IEdTVF9QVUxTRVJJTkdfQlVGRkVSX0NBU1QgKGJ1Zik7CisgIHBzaW5rID0gR1NUX1BVTFNFU0lOS19DQVNUIChHU1RfT0JKRUNUX1BBUkVOVCAocGJ1ZikpOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKG1haW5sb29wKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgInN0YXJ0aW5nIik7CisgIHBidWYtPnBhdXNlZCA9IEZBTFNFOworCisgIC8qIEVPUyBuZWVkcyBydW5uaW5nIGNsb2NrICovCisgIGlmIChHU1RfQkFTRV9TSU5LX0NBU1QgKHBzaW5rKS0+ZW9zIHx8CisgICAgICBnX2F0b21pY19pbnRfZ2V0ICgmR1NUX0FVRElPX0JBU0VfU0lOSyAocHNpbmspLT5lb3NfcmVuZGVyaW5nKSkKKyAgICBnc3RfcHVsc2VyaW5nX3NldF9jb3JrZWQgKHBidWYsIEZBTFNFLCBGQUxTRSk7CisKKyNpZiAwCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAic2NoZWR1bGluZyBzdHJlYW0gc3RhdHVzIik7CisgIHBzaW5rLT5kZWZlcl9wZW5kaW5nKys7CisgIHBhX21haW5sb29wX2FwaV9vbmNlIChwYV90aHJlYWRlZF9tYWlubG9vcF9nZXRfYXBpIChtYWlubG9vcCksCisgICAgICBtYWlubG9vcF9lbnRlcl9kZWZlcl9jYiwgcHNpbmspOworCisgIC8qIFdhaXQgZm9yIHRoZSBzdHJlYW0gc3RhdHVzIG1lc3NhZ2UgdG8gYmUgcG9zdGVkLiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUKKyAgICogc3luY2hyb25vdXNseSBiZWNhdXNlIHRoZSBjYWxsYmFjayB3aWxsIHRha2UgdGhlIG1haW5sb29wIGxvY2sKKyAgICogKGltcGxpY2l0bHkpIGFuZCB0aGVuIHRha2UgdGhlIEdTVF9PQkpFQ1RfTE9DSy4gRXZlcnl3aGVyZSBlbHNlLCB3ZSB0YWtlCisgICAqIHRoZSBsb2NrcyBpbiB0aGUgcmV2ZXJzZSBvcmRlciwgc28gbm90IGRvaW5nIHRoaXMgc3luY2hyb25vdXNseSBjb3VsZAorICAgKiBjYXVzZSBhIGRlYWRsb2NrLiAqLworICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgIndhaXRpbmcgZm9yIHN0cmVhbSBzdGF0dXMgKEVOVEVSKSB0byBiZSBwb3N0ZWQiKTsKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAobWFpbmxvb3ApOworI2VuZGlmCisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChtYWlubG9vcCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIHBhdXNlL3N0b3AgcGxheWJhY2sgQVNBUCAqLworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VyaW5nYnVmZmVyX3BhdXNlIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHBidWYgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUIChidWYpOworICBwc2luayA9IEdTVF9QVUxTRVNJTktfQ0FTVCAoR1NUX09CSkVDVF9QQVJFTlQgKHBidWYpKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChtYWlubG9vcCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAicGF1c2luZyBhbmQgY29ya2luZyIpOworICAvKiBtYWtlIHN1cmUgdGhlIGNvbW1pdCBtZXRob2Qgc3RvcHMgd3JpdGluZyAqLworICBwYnVmLT5wYXVzZWQgPSBUUlVFOworICByZXMgPSBnc3RfcHVsc2VyaW5nX3NldF9jb3JrZWQgKHBidWYsIFRSVUUsIFRSVUUpOworICBpZiAocGJ1Zi0+aW5fY29tbWl0KSB7CisgICAgLyogd2UgYXJlIHdhaXRpbmcgaW4gYSBjb21taXQsIHNpZ25hbCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAic2lnbmFsIGNvbW1pdCIpOworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbCAobWFpbmxvb3AsIDApOworICB9CisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAobWFpbmxvb3ApOworCisgIHJldHVybiByZXM7Cit9CisKKyNpZiAwCisvKiBjYWxsZWQgZnJvbSBwdWxzZSB0aHJlYWQgd2l0aCB0aGUgbWFpbmxvb3AgbG9jayAqLworc3RhdGljIHZvaWQKK21haW5sb29wX2xlYXZlX2RlZmVyX2NiIChwYV9tYWlubG9vcF9hcGkgKiBhcGksIHZvaWQgKnVzZXJkYXRhKQoreworICBHc3RQdWxzZVNpbmsgKnB1bHNlc2luayA9IEdTVF9QVUxTRVNJTksgKHVzZXJkYXRhKTsKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKyAgR1ZhbHVlIHZhbCA9IHsgMCB9OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHB1bHNlc2luaywgInBvc3RpbmcgTEVBVkUgc3RyZWFtIHN0YXR1cyIpOworICBtZXNzYWdlID0gZ3N0X21lc3NhZ2VfbmV3X3N0cmVhbV9zdGF0dXMgKEdTVF9PQkpFQ1QgKHB1bHNlc2luayksCisgICAgICBHU1RfU1RSRUFNX1NUQVRVU19UWVBFX0xFQVZFLCBHU1RfRUxFTUVOVCAocHVsc2VzaW5rKSk7CisgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR1NUX1RZUEVfR19USFJFQUQpOworICBnX3ZhbHVlX3NldF9ib3hlZCAoJnZhbCwgZ190aHJlYWRfc2VsZiAoKSk7CisgIGdzdF9tZXNzYWdlX3NldF9zdHJlYW1fc3RhdHVzX29iamVjdCAobWVzc2FnZSwgJnZhbCk7CisgIGdfdmFsdWVfdW5zZXQgKCZ2YWwpOworCisgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKHB1bHNlc2luayksIG1lc3NhZ2UpOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKHB1bHNlc2luay0+ZGVmZXJfcGVuZGluZyk7CisgIHB1bHNlc2luay0+ZGVmZXJfcGVuZGluZy0tOworICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwgKG1haW5sb29wLCAwKTsKK30KKyNlbmRpZgorCisvKiBzdG9wIHBsYXliYWNrLCB3ZSBmbHVzaCBldmVyeXRoaW5nLiAqLworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VyaW5nYnVmZmVyX3N0b3AgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0UHVsc2VTaW5rICpwc2luazsKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmOworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKworICBwYnVmID0gR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAoYnVmKTsKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAobWFpbmxvb3ApOworCisgIHBidWYtPnBhdXNlZCA9IFRSVUU7CisgIHJlcyA9IGdzdF9wdWxzZXJpbmdfc2V0X2NvcmtlZCAocGJ1ZiwgVFJVRSwgVFJVRSk7CisKKyAgLyogSW5mb3JtIGFueW9uZSB3YWl0aW5nIGluIF9jb21taXQoKSBjYWxsIHRoYXQgaXQgc2hhbGwgd2FrZXVwICovCisgIGlmIChwYnVmLT5pbl9jb21taXQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgInNpZ25hbCBjb21taXQgdGhyZWFkIik7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsIChtYWlubG9vcCwgMCk7CisgIH0KKyAgaWYgKGdfYXRvbWljX2ludF9nZXQgKCZwc2luay0+Zm9ybWF0X2xvc3QpKSB7CisgICAgLyogRG9uJ3QgdHJ5IHRvIGZsdXNoLCB0aGUgc3RyZWFtJ3MgcHJvYmFibHkgZ29uZSBieSBub3cgKi8KKyAgICByZXMgPSBUUlVFOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorCisgIC8qIHRoZW4gdHJ5IHRvIGZsdXNoLCBpdCdzIG5vdCBmYXRhbCB3aGVuIHRoaXMgZmFpbHMgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJmbHVzaGluZyIpOworICBpZiAoKG8gPSBwYV9zdHJlYW1fZmx1c2ggKHBidWYtPnN0cmVhbSwgZ3N0X3B1bHNlcmluZ19zdWNjZXNzX2NiLCBwYnVmKSkpIHsKKyAgICB3aGlsZSAocGFfb3BlcmF0aW9uX2dldF9zdGF0ZSAobykgPT0gUEFfT1BFUkFUSU9OX1JVTk5JTkcpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAid2FpdCBmb3IgY29tcGxldGlvbiIpOworICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAobWFpbmxvb3ApOworICAgICAgaWYgKGdzdF9wdWxzZXJpbmdfaXNfZGVhZCAocHNpbmssIHBidWYsIFRSVUUpKQorICAgICAgICBnb3RvIHNlcnZlcl9kZWFkOworICAgIH0KKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgImZsdXNoIGNvbXBsZXRlZCIpOworICB9CisgIHJlcyA9IFRSVUU7CisKK2NsZWFudXA6CisgIGlmIChvKSB7CisgICAgcGFfb3BlcmF0aW9uX2NhbmNlbCAobyk7CisgICAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKyAgfQorI2lmIDAKKyAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJzY2hlZHVsaW5nIHN0cmVhbSBzdGF0dXMiKTsKKyAgcHNpbmstPmRlZmVyX3BlbmRpbmcrKzsKKyAgcGFfbWFpbmxvb3BfYXBpX29uY2UgKHBhX3RocmVhZGVkX21haW5sb29wX2dldF9hcGkgKG1haW5sb29wKSwKKyAgICAgIG1haW5sb29wX2xlYXZlX2RlZmVyX2NiLCBwc2luayk7CisKKyAgLyogV2FpdCBmb3IgdGhlIHN0cmVhbSBzdGF0dXMgbWVzc2FnZSB0byBiZSBwb3N0ZWQuIFRoaXMgbmVlZHMgdG8gYmUgZG9uZQorICAgKiBzeW5jaHJvbm91c2x5IGJlY2F1c2UgdGhlIGNhbGxiYWNrIHdpbGwgdGFrZSB0aGUgbWFpbmxvb3AgbG9jaworICAgKiAoaW1wbGljaXRseSkgYW5kIHRoZW4gdGFrZSB0aGUgR1NUX09CSkVDVF9MT0NLLiBFdmVyeXdoZXJlIGVsc2UsIHdlIHRha2UKKyAgICogdGhlIGxvY2tzIGluIHRoZSByZXZlcnNlIG9yZGVyLCBzbyBub3QgZG9pbmcgdGhpcyBzeW5jaHJvbm91c2x5IGNvdWxkCisgICAqIGNhdXNlIGEgZGVhZGxvY2suICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAid2FpdGluZyBmb3Igc3RyZWFtIHN0YXR1cyAoTEVBVkUpIHRvIGJlIHBvc3RlZCIpOworICBwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0IChtYWlubG9vcCk7CisjZW5kaWYKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworc2VydmVyX2RlYWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgInRoZSBzZXJ2ZXIgaXMgZGVhZCIpOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorfQorCisvKiBpbl9zYW1wbGVzID49IG91dF9zYW1wbGVzLCByYXRlID4gMS4wICovCisjZGVmaW5lIEZXRF9VUF9TQU1QTEVTKHMsc2UsZCxkZSkgICAgICAgICAgICAgICBcCitHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGd1aW50OCAqc2IgPSBzLCAqZGIgPSBkOyAgICAgICAgICAgICAgICAgICAgICBcCisgIHdoaWxlIChzIDw9IHNlICYmIGQgPCBkZSkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgbWVtY3B5IChkLCBzLCBicGYpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcyArPSBicGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKmFjY3VtICs9IG91dHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCgqYWNjdW0gPDwgMSkgPj0gaW5yKSB7ICAgICAgICAgICAgICAgICBcCisgICAgICAqYWNjdW0gLT0gaW5yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBkICs9IGJwZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGluX3NhbXBsZXMgLT0gKHMgLSBzYikvYnBmOyAgICAgICAgICAgICAgICAgICBcCisgIG91dF9zYW1wbGVzIC09IChkIC0gZGIpL2JwZjsgICAgICAgICAgICAgICAgICBcCisgIEdTVF9ERUJVRyAoImZ3ZF91cCBlbmQgJWQvJWQiLCphY2N1bSwqdG9wcm9jZXNzKTsgICAgIFwKK30gR19TVE1UX0VORAorCisvKiBvdXRfc2FtcGxlcyA+IGluX3NhbXBsZXMsIGZvciByYXRlcyBzbWFsbGVyIHRoYW4gMS4wICovCisjZGVmaW5lIEZXRF9ET1dOX1NBTVBMRVMocyxzZSxkLGRlKSAgICAgICAgICAgICBcCitHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGd1aW50OCAqc2IgPSBzLCAqZGIgPSBkOyAgICAgICAgICAgICAgICAgICAgICBcCisgIHdoaWxlIChzIDw9IHNlICYmIGQgPCBkZSkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgbWVtY3B5IChkLCBzLCBicGYpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZCArPSBicGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKmFjY3VtICs9IGlucjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCgqYWNjdW0gPDwgMSkgPj0gb3V0cikgeyAgICAgICAgICAgICAgICBcCisgICAgICAqYWNjdW0gLT0gb3V0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzICs9IGJwZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGluX3NhbXBsZXMgLT0gKHMgLSBzYikvYnBmOyAgICAgICAgICAgICAgICAgICBcCisgIG91dF9zYW1wbGVzIC09IChkIC0gZGIpL2JwZjsgICAgICAgICAgICAgICAgICBcCisgIEdTVF9ERUJVRyAoImZ3ZF9kb3duIGVuZCAlZC8lZCIsKmFjY3VtLCp0b3Byb2Nlc3MpOyAgIFwKK30gR19TVE1UX0VORAorCisjZGVmaW5lIFJFVl9VUF9TQU1QTEVTKHMsc2UsZCxkZSkgICAgICAgICAgICAgICBcCitHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGd1aW50OCAqc2IgPSBzZSwgKmRiID0gZDsgICAgICAgICAgICAgICAgICAgICBcCisgIHdoaWxlIChzIDw9IHNlICYmIGQgPCBkZSkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgbWVtY3B5IChkLCBzZSwgYnBmKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2UgLT0gYnBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKmFjY3VtICs9IG91dHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKGQgPCBkZSAmJiAoKmFjY3VtIDw8IDEpID49IGlucikgeyAgICBcCisgICAgICAqYWNjdW0gLT0gaW5yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBkICs9IGJwZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGluX3NhbXBsZXMgLT0gKHNiIC0gc2UpL2JwZjsgICAgICAgICAgICAgICAgICBcCisgIG91dF9zYW1wbGVzIC09IChkIC0gZGIpL2JwZjsgICAgICAgICAgICAgICAgICBcCisgIEdTVF9ERUJVRyAoInJldl91cCBlbmQgJWQvJWQiLCphY2N1bSwqdG9wcm9jZXNzKTsgICAgIFwKK30gR19TVE1UX0VORAorCisjZGVmaW5lIFJFVl9ET1dOX1NBTVBMRVMocyxzZSxkLGRlKSAgICAgICAgICAgICBcCitHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGd1aW50OCAqc2IgPSBzZSwgKmRiID0gZDsgICAgICAgICAgICAgICAgICAgICBcCisgIHdoaWxlIChzIDw9IHNlICYmIGQgPCBkZSkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgbWVtY3B5IChkLCBzZSwgYnBmKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZCArPSBicGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKmFjY3VtICs9IGlucjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKHMgPD0gc2UgJiYgKCphY2N1bSA8PCAxKSA+PSBvdXRyKSB7ICBcCisgICAgICAqYWNjdW0gLT0gb3V0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzZSAtPSBicGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGluX3NhbXBsZXMgLT0gKHNiIC0gc2UpL2JwZjsgICAgICAgICAgICAgICAgICBcCisgIG91dF9zYW1wbGVzIC09IChkIC0gZGIpL2JwZjsgICAgICAgICAgICAgICAgICBcCisgIEdTVF9ERUJVRyAoInJldl9kb3duIGVuZCAlZC8lZCIsKmFjY3VtLCp0b3Byb2Nlc3MpOyAgIFwKK30gR19TVE1UX0VORAorCisvKiBvdXIgY3VzdG9tIGNvbW1pdCBmdW5jdGlvbiBiZWNhdXNlIHdlIHdyaXRlIGludG8gdGhlIGJ1ZmZlciBvZiBwdWxzZWF1ZGlvCisgKiBpbnN0ZWFkIG9mIGtlZXBpbmcgb3VyIG93biBidWZmZXIgKi8KK3N0YXRpYyBndWludAorZ3N0X3B1bHNlcmluZ2J1ZmZlcl9jb21taXQgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZiwgZ3VpbnQ2NCAqIHNhbXBsZSwKKyAgICBndWNoYXIgKiBkYXRhLCBnaW50IGluX3NhbXBsZXMsIGdpbnQgb3V0X3NhbXBsZXMsIGdpbnQgKiBhY2N1bSkKK3sKKyAgR3N0UHVsc2VTaW5rICpwc2luazsKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmOworICBndWludCByZXN1bHQ7CisgIGd1aW50OCAqZGF0YV9lbmQ7CisgIGdib29sZWFuIHJldmVyc2U7CisgIGdpbnQgKnRvcHJvY2VzczsKKyAgZ2ludCBpbnIsIG91dHIsIGJwZjsKKyAgZ2ludDY0IG9mZnNldDsKKyAgZ3VpbnQgYnVmc2l6ZTsKKworICBwYnVmID0gR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAoYnVmKTsKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisKKyAgLyogRklYTUUgcG9zdCBtZXNzYWdlIHJhdGhlciB0aGFuIHVzaW5nIGEgc2lnbmFsIChhcyBtaXhlciBpbnRlcmZhY2UpICovCisgIGlmIChnX2F0b21pY19pbnRfY29tcGFyZV9hbmRfZXhjaGFuZ2UgKCZwc2luay0+bm90aWZ5LCAxLCAwKSkgeworICAgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKHBzaW5rKSwgInZvbHVtZSIpOworICAgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKHBzaW5rKSwgIm11dGUiKTsKKyAgICBnX29iamVjdF9ub3RpZnkgKEdfT0JKRUNUIChwc2luayksICJjdXJyZW50LWRldmljZSIpOworICB9CisKKyAgLyogbWFrZSBzdXJlIHRoZSByaW5nYnVmZmVyIGlzIHN0YXJ0ZWQgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKGdfYXRvbWljX2ludF9nZXQgKCZidWYtPnN0YXRlKSAhPQorICAgICAgICAgIEdTVF9BVURJT19SSU5HX0JVRkZFUl9TVEFURV9TVEFSVEVEKSkgeworICAgIC8qIHNlZSBpZiB3ZSBhcmUgYWxsb3dlZCB0byBzdGFydCBpdCAqLworICAgIGlmIChHX1VOTElLRUxZIChnX2F0b21pY19pbnRfZ2V0ICgmYnVmLT5tYXlfc3RhcnQpID09IEZBTFNFKSkKKyAgICAgIGdvdG8gbm9fc3RhcnQ7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChidWYsICJzdGFydCEiKTsKKyAgICBpZiAoIWdzdF9hdWRpb19yaW5nX2J1ZmZlcl9zdGFydCAoYnVmKSkKKyAgICAgIGdvdG8gc3RhcnRfZmFpbGVkOworICB9CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAobWFpbmxvb3ApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAiZW50ZXJpbmcgY29tbWl0Iik7CisgIHBidWYtPmluX2NvbW1pdCA9IFRSVUU7CisKKyAgYnBmID0gR1NUX0FVRElPX0lORk9fQlBGICgmYnVmLT5zcGVjLmluZm8pOworICBidWZzaXplID0gYnVmLT5zcGVjLnNlZ3NpemUgKiBidWYtPnNwZWMuc2VndG90YWw7CisKKyAgLyogb3VyIHRveSByZXNhbXBsZXIgZm9yIHRyaWNrIG1vZGVzICovCisgIHJldmVyc2UgPSBvdXRfc2FtcGxlcyA8IDA7CisgIG91dF9zYW1wbGVzID0gQUJTIChvdXRfc2FtcGxlcyk7CisKKyAgaWYgKGluX3NhbXBsZXMgPj0gb3V0X3NhbXBsZXMpCisgICAgdG9wcm9jZXNzID0gJmluX3NhbXBsZXM7CisgIGVsc2UKKyAgICB0b3Byb2Nlc3MgPSAmb3V0X3NhbXBsZXM7CisKKyAgaW5yID0gaW5fc2FtcGxlcyAtIDE7CisgIG91dHIgPSBvdXRfc2FtcGxlcyAtIDE7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJpbiAlZCwgb3V0ICVkIiwgaW5yLCBvdXRyKTsKKworICAvKiBkYXRhX2VuZCBwb2ludHMgdG8gdGhlIGxhc3Qgc2FtcGxlIHdlIGhhdmUgdG8gd3JpdGUsIG5vdCBwYXN0IGl0LiBUaGlzIGlzCisgICAqIG5lZWRlZCB0byBwcm9wZXJseSBoYW5kbGUgcmV2ZXJzZSBwbGF5YmFjazogaXQgcG9pbnRzIHRvIHRoZSBsYXN0IHNhbXBsZS4gKi8KKyAgZGF0YV9lbmQgPSBkYXRhICsgKGJwZiAqIGlucik7CisKKyAgaWYgKGdfYXRvbWljX2ludF9nZXQgKCZwc2luay0+Zm9ybWF0X2xvc3QpKSB7CisgICAgLyogU2luayBmb3JtYXQgY2hhbmdlZCwgZHJvcCB0aGUgZGF0YSBhbmQgaG9wZSB1cHN0cmVhbSByZW5lZ290aWF0ZXMgKi8KKyAgICBnb3RvIGZha2VfZG9uZTsKKyAgfQorCisgIGlmIChwYnVmLT5wYXVzZWQpCisgICAgZ290byB3YXNfcGF1c2VkOworCisgIC8qIG9mZnNldCBpcyBpbiBieXRlcyAqLworICBvZmZzZXQgPSAqc2FtcGxlICogYnBmOworCisgIHdoaWxlICgqdG9wcm9jZXNzID4gMCkgeworICAgIHNpemVfdCBhdmFpbDsKKyAgICBndWludCB0b3dyaXRlOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLAorICAgICAgICAibmVlZCB0byB3cml0ZSAlZCBzYW1wbGVzIGF0IG9mZnNldCAlIiBHX0dJTlQ2NF9GT1JNQVQsICp0b3Byb2Nlc3MsCisgICAgICAgIG9mZnNldCk7CisKKyAgICBpZiAob2Zmc2V0ICE9IHBidWYtPm1fbGFzdG9mZnNldCkKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgImRpc2NvbnRpbnVpdHksIG9mZnNldCBpcyAlIiBHX0dJTlQ2NF9GT1JNQVQgIiwgIgorICAgICAgICAgICJsYXN0IG9mZnNldCB3YXMgJSIgR19HSU5UNjRfRk9STUFULCBvZmZzZXQsIHBidWYtPm1fbGFzdG9mZnNldCk7CisKKyAgICB0b3dyaXRlID0gb3V0X3NhbXBsZXMgKiBicGY7CisKKyAgICAvKiBXYWl0IGZvciBhdCBsZWFzdCBzZWdzaXplIGJ5dGVzIHRvIGJlY29tZSBhdmFpbGFibGUgKi8KKyAgICBpZiAodG93cml0ZSA+IGJ1Zi0+c3BlYy5zZWdzaXplKQorICAgICAgdG93cml0ZSA9IGJ1Zi0+c3BlYy5zZWdzaXplOworCisgICAgaWYgKChwYnVmLT5tX3dyaXRhYmxlIDwgdG93cml0ZSkgfHwgKG9mZnNldCAhPSBwYnVmLT5tX2xhc3RvZmZzZXQpKSB7CisgICAgICAvKiBpZiBubyByb29tIGxlZnQgb3IgZGlzY29udGludWl0eSBpbiBvZmZzZXQsCisgICAgICAgICB3ZSBuZWVkIHRvIGZsdXNoIGRhdGEgYW5kIGdldCBhIG5ldyBidWZmZXIgKi8KKworICAgICAgLyogZmx1c2ggdGhlIGJ1ZmZlciBpZiBwb3NzaWJsZSAqLworICAgICAgaWYgKChwYnVmLT5tX2RhdGEgIT0gTlVMTCkgJiYgKHBidWYtPm1fdG93cml0ZSA+IDApKSB7CisKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLAorICAgICAgICAgICAgImZsdXNoaW5nICV1IHNhbXBsZXMgYXQgb2Zmc2V0ICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgIChndWludCkgcGJ1Zi0+bV90b3dyaXRlIC8gYnBmLCBwYnVmLT5tX29mZnNldCk7CisKKyAgICAgICAgaWYgKHBhX3N0cmVhbV93cml0ZSAocGJ1Zi0+c3RyZWFtLCAodWludDhfdCAqKSBwYnVmLT5tX2RhdGEsCisgICAgICAgICAgICAgICAgcGJ1Zi0+bV90b3dyaXRlLCBOVUxMLCBwYnVmLT5tX29mZnNldCwgUEFfU0VFS19BQlNPTFVURSkgPCAwKSB7CisgICAgICAgICAgZ290byB3cml0ZV9mYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHBidWYtPm1fdG93cml0ZSA9IDA7CisgICAgICBwYnVmLT5tX29mZnNldCA9IG9mZnNldDsgIC8qIGtlZXAgdHJhY2sgb2YgY3VycmVudCBvZmZzZXQgKi8KKworICAgICAgLyogZ2V0IGEgYnVmZmVyIHRvIHdyaXRlIGluIGZvciBub3cgb24gKi8KKyAgICAgIGZvciAoOzspIHsKKyAgICAgICAgcGJ1Zi0+bV93cml0YWJsZSA9IHBhX3N0cmVhbV93cml0YWJsZV9zaXplIChwYnVmLT5zdHJlYW0pOworCisgICAgICAgIGlmIChnX2F0b21pY19pbnRfZ2V0ICgmcHNpbmstPmZvcm1hdF9sb3N0KSkgeworICAgICAgICAgIC8qIFNpbmsgZm9ybWF0IGNoYW5nZWQsIGdpdmUgdXAgYW5kIGhvcGUgdXBzdHJlYW0gcmVuZWdvdGlhdGVzICovCisgICAgICAgICAgZ290byBmYWtlX2RvbmU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGJ1Zi0+bV93cml0YWJsZSA9PSAoc2l6ZV90KSAtIDEpCisgICAgICAgICAgZ290byB3cml0YWJsZV9zaXplX2ZhaWxlZDsKKworICAgICAgICBwYnVmLT5tX3dyaXRhYmxlIC89IGJwZjsKKyAgICAgICAgcGJ1Zi0+bV93cml0YWJsZSAqPSBicGY7ICAgICAgICAvKiBoYW5kbGUgb25seSBjb21wbGV0ZSBzYW1wbGVzICovCisKKyAgICAgICAgaWYgKHBidWYtPm1fd3JpdGFibGUgPj0gdG93cml0ZSkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBzZWUgaWYgd2UgbmVlZCB0byB1bmNvcmsgYmVjYXVzZSB3ZSBoYXZlIG5vIGZyZWUgc3BhY2UgKi8KKyAgICAgICAgaWYgKHBidWYtPmNvcmtlZCkgeworICAgICAgICAgIGlmICghZ3N0X3B1bHNlcmluZ19zZXRfY29ya2VkIChwYnVmLCBGQUxTRSwgRkFMU0UpKQorICAgICAgICAgICAgZ290byB1bmNvcmtfZmFpbGVkOworICAgICAgICB9CisKKyAgICAgICAgLyogd2UgY2FuJ3Qgd3JpdGUgc2Vnc2l6ZSBieXRlcywgd2FpdCBhIGJpdCAqLworICAgICAgICBHU1RfTE9HX09CSkVDVCAocHNpbmssICJ3YWl0aW5nIGZvciBmcmVlIHNwYWNlIik7CisgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQgKG1haW5sb29wKTsKKworICAgICAgICBpZiAocGJ1Zi0+cGF1c2VkKQorICAgICAgICAgIGdvdG8gd2FzX3BhdXNlZDsKKyAgICAgIH0KKworICAgICAgLyogUmVjYWxjdWxhdGUgd2hhdCB3ZSBjYW4gd3JpdGUgaW4gdGhlIG5leHQgY2h1bmsgKi8KKyAgICAgIHRvd3JpdGUgPSBvdXRfc2FtcGxlcyAqIGJwZjsKKyAgICAgIGlmIChwYnVmLT5tX3dyaXRhYmxlID4gdG93cml0ZSkKKyAgICAgICAgcGJ1Zi0+bV93cml0YWJsZSA9IHRvd3JpdGU7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgInJlcXVlc3RpbmcgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyBvZiAiCisgICAgICAgICAgInNoYXJlZCBtZW1vcnkiLCBwYnVmLT5tX3dyaXRhYmxlKTsKKworICAgICAgaWYgKHBhX3N0cmVhbV9iZWdpbl93cml0ZSAocGJ1Zi0+c3RyZWFtLCAmcGJ1Zi0+bV9kYXRhLAorICAgICAgICAgICAgICAmcGJ1Zi0+bV93cml0YWJsZSkgPCAwKSB7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgInBhX3N0cmVhbV9iZWdpbl93cml0ZSgpIGZhaWxlZCIpOworICAgICAgICBnb3RvIHdyaXRhYmxlX3NpemVfZmFpbGVkOworICAgICAgfQorCisgICAgICBHU1RfTE9HX09CSkVDVCAocHNpbmssICJnb3QgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyBvZiBzaGFyZWQgbWVtb3J5IiwKKyAgICAgICAgICBwYnVmLT5tX3dyaXRhYmxlKTsKKworICAgIH0KKworICAgIGlmICh0b3dyaXRlID4gcGJ1Zi0+bV93cml0YWJsZSkKKyAgICAgIHRvd3JpdGUgPSBwYnVmLT5tX3dyaXRhYmxlOworICAgIGF2YWlsID0gdG93cml0ZSAvIGJwZjsKKworICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgIndyaXRpbmcgJXUgc2FtcGxlcyBhdCBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgKGd1aW50KSBhdmFpbCwgb2Zmc2V0KTsKKworICAgIC8qIE5vIHRyaWNrIG1vZGVzIGZvciBwYXNzdGhyb3VnaCBzdHJlYW1zICovCisgICAgaWYgKEdfVU5MSUtFTFkgKCFwYnVmLT5pc19wY20gJiYgKGluciAhPSBvdXRyIHx8IHJldmVyc2UpKSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwc2luaywgIlBhc3N0aHJvdWdoIHN0cmVhbSBjYW4ndCBydW4gaW4gdHJpY2sgbW9kZSIpOworICAgICAgZ290byB1bmxvY2tfYW5kX2ZhaWw7CisgICAgfQorCisgICAgaWYgKEdfTElLRUxZIChpbnIgPT0gb3V0ciAmJiAhcmV2ZXJzZSkpIHsKKyAgICAgIC8qIG5vIHJhdGUgY29udmVyc2lvbiwgc2ltcGx5IHdyaXRlIG91dCB0aGUgc2FtcGxlcyAqLworICAgICAgLyogY29weSB0aGUgZGF0YSBpbnRvIGludGVybmFsIGJ1ZmZlciAqLworCisgICAgICBtZW1jcHkgKChndWludDggKikgcGJ1Zi0+bV9kYXRhICsgcGJ1Zi0+bV90b3dyaXRlLCBkYXRhLCB0b3dyaXRlKTsKKyAgICAgIHBidWYtPm1fdG93cml0ZSArPSB0b3dyaXRlOworICAgICAgcGJ1Zi0+bV93cml0YWJsZSAtPSB0b3dyaXRlOworCisgICAgICBkYXRhICs9IHRvd3JpdGU7CisgICAgICBpbl9zYW1wbGVzIC09IGF2YWlsOworICAgICAgb3V0X3NhbXBsZXMgLT0gYXZhaWw7CisgICAgfSBlbHNlIHsKKyAgICAgIGd1aW50OCAqZGVzdCwgKmQsICpkX2VuZDsKKworICAgICAgLyogd3JpdGUgaW50byB0aGUgUHVsc2VBdWRpbyBzaG0gYnVmZmVyICovCisgICAgICBkZXN0ID0gZCA9IChndWludDggKikgcGJ1Zi0+bV9kYXRhICsgcGJ1Zi0+bV90b3dyaXRlOworICAgICAgZF9lbmQgPSBkICsgdG93cml0ZTsKKworICAgICAgaWYgKCFyZXZlcnNlKSB7CisgICAgICAgIGlmIChpbnIgPj0gb3V0cikKKyAgICAgICAgICAvKiBmb3J3YXJkIHNwZWVkIHVwICovCisgICAgICAgICAgRldEX1VQX1NBTVBMRVMgKGRhdGEsIGRhdGFfZW5kLCBkLCBkX2VuZCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAvKiBmb3J3YXJkIHNsb3cgZG93biAqLworICAgICAgICAgIEZXRF9ET1dOX1NBTVBMRVMgKGRhdGEsIGRhdGFfZW5kLCBkLCBkX2VuZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoaW5yID49IG91dHIpCisgICAgICAgICAgLyogcmV2ZXJzZSBzcGVlZCB1cCAqLworICAgICAgICAgIFJFVl9VUF9TQU1QTEVTIChkYXRhLCBkYXRhX2VuZCwgZCwgZF9lbmQpOworICAgICAgICBlbHNlCisgICAgICAgICAgLyogcmV2ZXJzZSBzbG93IGRvd24gKi8KKyAgICAgICAgICBSRVZfRE9XTl9TQU1QTEVTIChkYXRhLCBkYXRhX2VuZCwgZCwgZF9lbmQpOworICAgICAgfQorICAgICAgLyogc2VlIHdoYXQgd2UgaGF2ZSBsZWZ0IHRvIHdyaXRlICovCisgICAgICB0b3dyaXRlID0gKGQgLSBkZXN0KTsKKyAgICAgIHBidWYtPm1fdG93cml0ZSArPSB0b3dyaXRlOworICAgICAgcGJ1Zi0+bV93cml0YWJsZSAtPSB0b3dyaXRlOworCisgICAgICBhdmFpbCA9IHRvd3JpdGUgLyBicGY7CisgICAgfQorCisgICAgLyogZmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCdzIGZ1bGwgKi8KKyAgICBpZiAoKHBidWYtPm1fZGF0YSAhPSBOVUxMKSAmJiAocGJ1Zi0+bV90b3dyaXRlID4gMCkKKyAgICAgICAgJiYgKHBidWYtPm1fd3JpdGFibGUgPT0gMCkpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgImZsdXNoaW5nICV1IHNhbXBsZXMgYXQgb2Zmc2V0ICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAoZ3VpbnQpIHBidWYtPm1fdG93cml0ZSAvIGJwZiwgcGJ1Zi0+bV9vZmZzZXQpOworCisgICAgICBpZiAocGFfc3RyZWFtX3dyaXRlIChwYnVmLT5zdHJlYW0sICh1aW50OF90ICopIHBidWYtPm1fZGF0YSwKKyAgICAgICAgICAgICAgcGJ1Zi0+bV90b3dyaXRlLCBOVUxMLCBwYnVmLT5tX29mZnNldCwgUEFfU0VFS19BQlNPTFVURSkgPCAwKSB7CisgICAgICAgIGdvdG8gd3JpdGVfZmFpbGVkOworICAgICAgfQorICAgICAgcGJ1Zi0+bV90b3dyaXRlID0gMDsKKyAgICAgIHBidWYtPm1fb2Zmc2V0ID0gb2Zmc2V0ICsgdG93cml0ZTsgICAgICAgIC8qIGtlZXAgdHJhY2sgb2YgY3VycmVudCBvZmZzZXQgKi8KKyAgICB9CisKKyAgICAqc2FtcGxlICs9IGF2YWlsOworICAgIG9mZnNldCArPSBhdmFpbCAqIGJwZjsKKyAgICBwYnVmLT5tX2xhc3RvZmZzZXQgPSBvZmZzZXQ7CisKKyAgICAvKiBjaGVjayBpZiB3ZSBuZWVkIHRvIHVuY29yayBhZnRlciB3cml0aW5nIHRoZSBzYW1wbGVzICovCisgICAgaWYgKHBidWYtPmNvcmtlZCkgeworICAgICAgY29uc3QgcGFfdGltaW5nX2luZm8gKmluZm87CisKKyAgICAgIGlmICgoaW5mbyA9IHBhX3N0cmVhbV9nZXRfdGltaW5nX2luZm8gKHBidWYtPnN0cmVhbSkpKSB7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywKKyAgICAgICAgICAgICJyZWFkX2luZGV4IGF0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgb2Zmc2V0ICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgIGluZm8tPnJlYWRfaW5kZXgsIG9mZnNldCk7CisKKyAgICAgICAgLyogd2UgdW5jb3JrIHdoZW4gdGhlIHJlYWRfaW5kZXggaXMgdG9vIGZhciBiZWhpbmQgdGhlIG9mZnNldCB3ZSBuZWVkCisgICAgICAgICAqIHRvIHdyaXRlIHRvLiAqLworICAgICAgICBpZiAoaW5mby0+cmVhZF9pbmRleCArIGJ1ZnNpemUgPD0gb2Zmc2V0KSB7CisgICAgICAgICAgaWYgKCFnc3RfcHVsc2VyaW5nX3NldF9jb3JrZWQgKHBidWYsIEZBTFNFLCBGQUxTRSkpCisgICAgICAgICAgICBnb3RvIHVuY29ya19mYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgIm5vIHRpbWluZyBpbmZvIGF2YWlsYWJsZSB5ZXQiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworZmFrZV9kb25lOgorICAvKiB3ZSBjb25zdW1lZCBhbGwgc2FtcGxlcyBoZXJlICovCisgIGRhdGEgPSBkYXRhX2VuZCArIGJwZjsKKworICBwYnVmLT5pbl9jb21taXQgPSBGQUxTRTsKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChtYWlubG9vcCk7CisKK2RvbmU6CisgIHJlc3VsdCA9IGluciAtICgoZGF0YV9lbmQgLSBkYXRhKSAvIGJwZik7CisgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgIndyb3RlICVkIHNhbXBsZXMiLCByZXN1bHQpOworCisgIHJldHVybiByZXN1bHQ7CisKKyAgLyogRVJST1JTICovCit1bmxvY2tfYW5kX2ZhaWw6CisgIHsKKyAgICBwYnVmLT5pbl9jb21taXQgPSBGQUxTRTsKKyAgICBHU1RfTE9HX09CSkVDVCAocHNpbmssICJ3ZSBhcmUgcmVzZXQiKTsKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK25vX3N0YXJ0OgorICB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLCAid2UgY2FuIG5vdCBzdGFydCIpOworICAgIHJldHVybiAwOworICB9CitzdGFydF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocHNpbmssICJmYWlsZWQgdG8gc3RhcnQgdGhlIHJpbmdidWZmZXIiKTsKKyAgICByZXR1cm4gMDsKKyAgfQordW5jb3JrX2ZhaWxlZDoKKyAgeworICAgIHBidWYtPmluX2NvbW1pdCA9IEZBTFNFOworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBzaW5rLCAidW5jb3JrIGZhaWxlZCIpOworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAobWFpbmxvb3ApOworICAgIGdvdG8gZG9uZTsKKyAgfQord2FzX3BhdXNlZDoKKyAgeworICAgIHBidWYtPmluX2NvbW1pdCA9IEZBTFNFOworICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgIndlIGFyZSBwYXVzZWQiKTsKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK3dyaXRhYmxlX3NpemVfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBzaW5rLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoInBhX3N0cmVhbV93cml0YWJsZV9zaXplKCkgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICBwYV9zdHJlcnJvciAocGFfY29udGV4dF9lcnJubyAocGJ1Zi0+Y29udGV4dCkpKSwgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9ja19hbmRfZmFpbDsKKyAgfQord3JpdGVfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBzaW5rLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoInBhX3N0cmVhbV93cml0ZSgpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHBidWYtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byB1bmxvY2tfYW5kX2ZhaWw7CisgIH0KK30KKworLyogd3JpdGUgcGVuZGluZyBsb2NhbCBzYW1wbGVzLCBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBtYWlubG9vcCBsb2NrICovCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlcmluZ19mbHVzaCAoR3N0UHVsc2VSaW5nQnVmZmVyICogcGJ1ZikKK3sKKyAgR3N0UHVsc2VTaW5rICpwc2luazsKKworICBwc2luayA9IEdTVF9QVUxTRVNJTktfQ0FTVCAoR1NUX09CSkVDVF9QQVJFTlQgKHBidWYpKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJlbnRlcmluZyBmbHVzaCIpOworCisgIC8qIGZsdXNoIHRoZSBidWZmZXIgaWYgcG9zc2libGUgKi8KKyAgaWYgKHBidWYtPnN0cmVhbSAmJiAocGJ1Zi0+bV9kYXRhICE9IE5VTEwpICYmIChwYnVmLT5tX3Rvd3JpdGUgPiAwKSkgeworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgICBnaW50IGJwZjsKKworICAgIGJwZiA9IChHU1RfQVVESU9fUklOR19CVUZGRVJfQ0FTVCAocGJ1ZikpLT5zcGVjLmluZm8uYnBmOworICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywKKyAgICAgICAgImZsdXNoaW5nICV1IHNhbXBsZXMgYXQgb2Zmc2V0ICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICAgKGd1aW50KSBwYnVmLT5tX3Rvd3JpdGUgLyBicGYsIHBidWYtPm1fb2Zmc2V0KTsKKyNlbmRpZgorCisgICAgaWYgKHBhX3N0cmVhbV93cml0ZSAocGJ1Zi0+c3RyZWFtLCAodWludDhfdCAqKSBwYnVmLT5tX2RhdGEsCisgICAgICAgICAgICBwYnVmLT5tX3Rvd3JpdGUsIE5VTEwsIHBidWYtPm1fb2Zmc2V0LCBQQV9TRUVLX0FCU09MVVRFKSA8IDApIHsKKyAgICAgIGdvdG8gd3JpdGVfZmFpbGVkOworICAgIH0KKworICAgIHBidWYtPm1fdG93cml0ZSA9IDA7CisgICAgcGJ1Zi0+bV9vZmZzZXQgKz0gcGJ1Zi0+bV90b3dyaXRlOyAgLyoga2VlcCB0cmFjayBvZiBjdXJyZW50IG9mZnNldCAqLworICB9CisKK2RvbmU6CisgIHJldHVybjsKKworICAvKiBFUlJPUlMgKi8KK3dyaXRlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwc2luaywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV9zdHJlYW1fd3JpdGUoKSBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwYnVmLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gZG9uZTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBnc3RfcHVsc2VzaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9wdWxzZXNpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3B1bHNlc2lua19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcHVsc2VzaW5rX2V2ZW50IChHc3RCYXNlU2luayAqIHNpbmssIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9wdWxzZXNpbmtfcXVlcnkgKEdzdEJhc2VTaW5rICogc2luaywgR3N0UXVlcnkgKiBxdWVyeSk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcHVsc2VzaW5rX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBwYWRfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFBVTFNFX1NJTktfVEVNUExBVEVfQ0FQUykpOworCisjZGVmaW5lIGdzdF9wdWxzZXNpbmtfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdFB1bHNlU2luaywgZ3N0X3B1bHNlc2luaywgR1NUX1RZUEVfQVVESU9fQkFTRV9TSU5LLAorICAgIGdzdF9wdWxzZXNpbmtfaW5pdF9jb250ZXh0cyAoKTsKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1NUUkVBTV9WT0xVTUUsIE5VTEwpCisgICAgKTsKKworc3RhdGljIEdzdEF1ZGlvUmluZ0J1ZmZlciAqCitnc3RfcHVsc2VzaW5rX2NyZWF0ZV9yaW5nYnVmZmVyIChHc3RBdWRpb0Jhc2VTaW5rICogc2luaykKK3sKKyAgR3N0QXVkaW9SaW5nQnVmZmVyICpidWZmZXI7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgImNyZWF0aW5nIHJpbmdidWZmZXIiKTsKKyAgYnVmZmVyID0gZ19vYmplY3RfbmV3IChHU1RfVFlQRV9QVUxTRVJJTkdfQlVGRkVSLCBOVUxMKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgImNyZWF0ZWQgcmluZ2J1ZmZlciBAJXAiLCBidWZmZXIpOworCisgIHJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3B1bHNlc2lua19wYXlsb2FkIChHc3RBdWRpb0Jhc2VTaW5rICogc2luaywgR3N0QnVmZmVyICogYnVmKQoreworICBzd2l0Y2ggKHNpbmstPnJpbmdidWZmZXItPnNwZWMudHlwZSkgeworICAgIGNhc2UgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX0FDMzoKKyAgICBjYXNlIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9FQUMzOgorICAgIGNhc2UgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX0RUUzoKKyAgICBjYXNlIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9NUEVHOgorICAgIGNhc2UgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX01QRUcyX0FBQzoKKyAgICBjYXNlIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9NUEVHNF9BQUM6CisgICAgeworICAgICAgLyogRklYTUU6IGFsbG9jIG1lbW9yeSBmcm9tIFBBIGlmIHBvc3NpYmxlICovCisgICAgICBnaW50IGZyYW1lc2l6ZSA9IGdzdF9hdWRpb19pZWM2MTkzN19mcmFtZV9zaXplICgmc2luay0+cmluZ2J1ZmZlci0+c3BlYyk7CisgICAgICBHc3RCdWZmZXIgKm91dDsKKyAgICAgIEdzdE1hcEluZm8gaW5tYXAsIG91dG1hcDsKKyAgICAgIGdib29sZWFuIHJlczsKKworICAgICAgaWYgKGZyYW1lc2l6ZSA8PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgb3V0ID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChmcmFtZXNpemUpOworCisgICAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmaW5tYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICBnc3RfYnVmZmVyX21hcCAob3V0LCAmb3V0bWFwLCBHU1RfTUFQX1dSSVRFKTsKKworICAgICAgcmVzID0gZ3N0X2F1ZGlvX2llYzYxOTM3X3BheWxvYWQgKGlubWFwLmRhdGEsIGlubWFwLnNpemUsCisgICAgICAgICAgb3V0bWFwLmRhdGEsIG91dG1hcC5zaXplLCAmc2luay0+cmluZ2J1ZmZlci0+c3BlYywgR19CSUdfRU5ESUFOKTsKKworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmaW5tYXApOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0LCAmb3V0bWFwKTsKKworICAgICAgaWYgKCFyZXMpIHsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgICAgIGdzdF9idWZmZXJfY29weV9pbnRvIChvdXQsIGJ1ZiwgR1NUX0JVRkZFUl9DT1BZX01FVEFEQVRBLCAwLCAtMSk7CisgICAgICByZXR1cm4gb3V0OworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZ3N0X2J1ZmZlcl9yZWYgKGJ1Zik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNpbmtfY2xhc3NfaW5pdCAoR3N0UHVsc2VTaW5rQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0QmFzZVNpbmtDbGFzcyAqZ3N0YmFzZXNpbmtfY2xhc3MgPSBHU1RfQkFTRV9TSU5LX0NMQVNTIChrbGFzcyk7CisgIEdzdEJhc2VTaW5rQ2xhc3MgKmJjOworICBHc3RBdWRpb0Jhc2VTaW5rQ2xhc3MgKmdzdGF1ZGlvc2lua19jbGFzcyA9IEdTVF9BVURJT19CQVNFX1NJTktfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgZ2NoYXIgKmNsaWVudG5hbWU7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcHVsc2VzaW5rX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcHVsc2VzaW5rX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3B1bHNlc2lua19nZXRfcHJvcGVydHk7CisKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPmV2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wdWxzZXNpbmtfZXZlbnQpOworICBnc3RiYXNlc2lua19jbGFzcy0+cXVlcnkgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3B1bHNlc2lua19xdWVyeSk7CisKKyAgLyogcmVzdG9yZSB0aGUgb3JpZ2luYWwgYmFzZXNpbmsgcHVsbCBtZXRob2RzICovCisgIGJjID0gZ190eXBlX2NsYXNzX3BlZWsgKEdTVF9UWVBFX0JBU0VfU0lOSyk7CisgIGdzdGJhc2VzaW5rX2NsYXNzLT5hY3RpdmF0ZV9wdWxsID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGJjLT5hY3RpdmF0ZV9wdWxsKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wdWxzZXNpbmtfY2hhbmdlX3N0YXRlKTsKKworICBnc3RhdWRpb3NpbmtfY2xhc3MtPmNyZWF0ZV9yaW5nYnVmZmVyID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VzaW5rX2NyZWF0ZV9yaW5nYnVmZmVyKTsKKyAgZ3N0YXVkaW9zaW5rX2NsYXNzLT5wYXlsb2FkID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wdWxzZXNpbmtfcGF5bG9hZCk7CisKKyAgLyogT3ZlcndyaXRlIEdPYmplY3QgZmllbGRzICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1NFUlZFUiwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJzZXJ2ZXIiLCAiU2VydmVyIiwKKyAgICAgICAgICAiVGhlIFB1bHNlQXVkaW8gc2VydmVyIHRvIGNvbm5lY3QgdG8iLCBERUZBVUxUX1NFUlZFUiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RFVklDRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJkZXZpY2UiLCAiRGV2aWNlIiwKKyAgICAgICAgICAiVGhlIFB1bHNlQXVkaW8gc2luayBkZXZpY2UgdG8gY29ubmVjdCB0byIsIERFRkFVTFRfREVWSUNFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ1VSUkVOVF9ERVZJQ0UsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiY3VycmVudC1kZXZpY2UiLCAiQ3VycmVudCBEZXZpY2UiLAorICAgICAgICAgICJUaGUgY3VycmVudCBQdWxzZUF1ZGlvIHNpbmsgZGV2aWNlIiwgREVGQVVMVF9DVVJSRU5UX0RFVklDRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX0RFVklDRV9OQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImRldmljZS1uYW1lIiwgIkRldmljZSBuYW1lIiwKKyAgICAgICAgICAiSHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgc291bmQgZGV2aWNlIiwgREVGQVVMVF9ERVZJQ0VfTkFNRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1ZPTFVNRSwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJ2b2x1bWUiLCAiVm9sdW1lIiwKKyAgICAgICAgICAiTGluZWFyIHZvbHVtZSBvZiB0aGlzIHN0cmVhbSwgMS4wPTEwMCUiLCAwLjAsIE1BWF9WT0xVTUUsCisgICAgICAgICAgREVGQVVMVF9WT0xVTUUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9NVVRFLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJtdXRlIiwgIk11dGUiLAorICAgICAgICAgICJNdXRlIHN0YXRlIG9mIHRoaXMgc3RyZWFtIiwgREVGQVVMVF9NVVRFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RQdWxzZVNpbms6Y2xpZW50LW5hbWU6CisgICAqCisgICAqIFRoZSBQdWxzZUF1ZGlvIGNsaWVudCBuYW1lIHRvIHVzZS4KKyAgICovCisgIGNsaWVudG5hbWUgPSBnc3RfcHVsc2VfY2xpZW50X25hbWUgKCk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX0NMSUVOVF9OQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImNsaWVudC1uYW1lIiwgIkNsaWVudCBOYW1lIiwKKyAgICAgICAgICAiVGhlIFB1bHNlQXVkaW8gY2xpZW50IG5hbWUgdG8gdXNlIiwgY2xpZW50bmFtZSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfAorICAgICAgICAgIEdTVF9QQVJBTV9NVVRBQkxFX1JFQURZKSk7CisgIGdfZnJlZSAoY2xpZW50bmFtZSk7CisKKyAgLyoqCisgICAqIEdzdFB1bHNlU2luazpzdHJlYW0tcHJvcGVydGllczoKKyAgICoKKyAgICogTGlzdCBvZiBwdWxzZWF1ZGlvIHN0cmVhbSBwcm9wZXJ0aWVzLiBBIGxpc3Qgb2YgZGVmaW5lZCBwcm9wZXJ0aWVzIGNhbiBiZQorICAgKiBmb3VuZCBpbiB0aGUgPHVsaW5rIHVybD0iaHR0cDovLzBwb2ludGVyLmRlL2xlbm5hcnQvcHJvamVjdHMvcHVsc2VhdWRpby9kb3h5Z2VuL3Byb3BsaXN0XzhoLmh0bWwiPnB1bHNlYXVkaW8gYXBpIGRvY3M8L3VsaW5rPi4KKyAgICoKKyAgICogQmVsb3cgaXMgYW4gZXhhbXBsZSBmb3IgcmVnaXN0ZXJpbmcgYXMgYSBtdXNpYyBhcHBsaWNhdGlvbiB0byBwdWxzZWF1ZGlvLgorICAgKiB8WworICAgKiBHc3RTdHJ1Y3R1cmUgKnByb3BzOworICAgKgorICAgKiBwcm9wcyA9IGdzdF9zdHJ1Y3R1cmVfZnJvbV9zdHJpbmcgKCJwcm9wcyxtZWRpYS5yb2xlPW11c2ljIiwgTlVMTCk7CisgICAqIGdfb2JqZWN0X3NldCAocHVsc2UsICJzdHJlYW0tcHJvcGVydGllcyIsIHByb3BzLCBOVUxMKTsKKyAgICogZ3N0X3N0cnVjdHVyZV9mcmVlCisgICAqIF18CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9TVFJFQU1fUFJPUEVSVElFUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoInN0cmVhbS1wcm9wZXJ0aWVzIiwgInN0cmVhbSBwcm9wZXJ0aWVzIiwKKyAgICAgICAgICAibGlzdCBvZiBwdWxzZWF1ZGlvIHN0cmVhbSBwcm9wZXJ0aWVzIiwKKyAgICAgICAgICBHU1RfVFlQRV9TVFJVQ1RVUkUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUHVsc2VBdWRpbyBBdWRpbyBTaW5rIiwKKyAgICAgICJTaW5rL0F1ZGlvIiwgIlBsYXlzIGF1ZGlvIHRvIGEgUHVsc2VBdWRpbyBzZXJ2ZXIiLCAiTGVubmFydCBQb2V0dGVyaW5nIik7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmcGFkX3RlbXBsYXRlKTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfZGV2aWNlX2luZm8gKEdzdFB1bHNlRGV2aWNlSW5mbyAqIGRldmljZV9pbmZvKQoreworICBHTGlzdCAqbDsKKworICBnX2ZyZWUgKGRldmljZV9pbmZvLT5kZXNjcmlwdGlvbik7CisKKyAgZm9yIChsID0gZ19saXN0X2ZpcnN0IChkZXZpY2VfaW5mby0+Zm9ybWF0cyk7IGw7IGwgPSBnX2xpc3RfbmV4dCAobCkpCisgICAgcGFfZm9ybWF0X2luZm9fZnJlZSAoKHBhX2Zvcm1hdF9pbmZvICopIGwtPmRhdGEpOworCisgIGdfbGlzdF9mcmVlIChkZXZpY2VfaW5mby0+Zm9ybWF0cyk7Cit9CisKKy8qIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBvZiB0aGUgc2luayByaW5nYnVmZmVyLiBUaGUgdGltaW5nX2luZm8gaXMgdXBkYXRlZAorICogb24gZXZlcnkgZGF0YSB3cml0ZS9mbHVzaCBhbmQgZXZlcnkgMTAwbXMgKFBBX1NUUkVBTV9BVVRPX1RJTUlOR19VUERBVEUpLgorICovCitzdGF0aWMgR3N0Q2xvY2tUaW1lCitnc3RfcHVsc2VzaW5rX2dldF90aW1lIChHc3RDbG9jayAqIGNsb2NrLCBHc3RBdWRpb0Jhc2VTaW5rICogc2luaykKK3sKKyAgR3N0UHVsc2VTaW5rICpwc2luazsKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmOworICBwYV91c2VjX3QgdGltZTsKKworICBpZiAoIXNpbmstPnJpbmdidWZmZXIgfHwgIXNpbmstPnJpbmdidWZmZXItPmFjcXVpcmVkKQorICAgIHJldHVybiBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIHBidWYgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUIChzaW5rLT5yaW5nYnVmZmVyKTsKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisKKyAgaWYgKGdfYXRvbWljX2ludF9nZXQgKCZwc2luay0+Zm9ybWF0X2xvc3QpKSB7CisgICAgLyogU3RyZWFtIHdhcyBsb3N0IGluIGEgZm9ybWF0IGNoYW5nZSwgaXQnbGwgZ2V0IHNldCB1cCBhZ2FpbiBvbmNlCisgICAgICogdXBzdHJlYW0gcmVuZWdvdGlhdGVzICovCisgICAgcmV0dXJuIHBzaW5rLT5mb3JtYXRfbG9zdF90aW1lOworICB9CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAobWFpbmxvb3ApOworICBpZiAoZ3N0X3B1bHNlcmluZ19pc19kZWFkIChwc2luaywgcGJ1ZiwgVFJVRSkpCisgICAgZ290byBzZXJ2ZXJfZGVhZDsKKworICAvKiBpZiB3ZSBkb24ndCBoYXZlIGVub3VnaCBkYXRhIHRvIGdldCBhIHRpbWVzdGFtcCwganVzdCByZXR1cm4gTk9ORSwgd2hpY2gKKyAgICogd2lsbCByZXR1cm4gdGhlIGxhc3QgcmVwb3J0ZWQgdGltZSAqLworICBpZiAocGFfc3RyZWFtX2dldF90aW1lIChwYnVmLT5zdHJlYW0sICZ0aW1lKSA8IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgImNvdWxkIG5vdCBnZXQgdGltZSIpOworICAgIHRpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICB9IGVsc2UKKyAgICB0aW1lICo9IDEwMDA7CisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAobWFpbmxvb3ApOworCisgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgImN1cnJlbnQgdGltZSBpcyAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTICh0aW1lKSk7CisKKyAgcmV0dXJuIHRpbWU7CisKKyAgLyogRVJST1JTICovCitzZXJ2ZXJfZGVhZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAidGhlIHNlcnZlciBpcyBkZWFkIik7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChtYWlubG9vcCk7CisKKyAgICByZXR1cm4gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc2lua19zaW5rX2luZm9fY2IgKHBhX2NvbnRleHQgKiBjLCBjb25zdCBwYV9zaW5rX2luZm8gKiBpLCBpbnQgZW9sLAorICAgIHZvaWQgKnVzZXJkYXRhKQoreworICBHc3RQdWxzZURldmljZUluZm8gKmRldmljZV9pbmZvID0gKEdzdFB1bHNlRGV2aWNlSW5mbyAqKSB1c2VyZGF0YTsKKyAgZ3VpbnQ4IGo7CisKKyAgaWYgKCFpKQorICAgIGdvdG8gZG9uZTsKKworICBkZXZpY2VfaW5mby0+ZGVzY3JpcHRpb24gPSBnX3N0cmR1cCAoaS0+ZGVzY3JpcHRpb24pOworCisgIGRldmljZV9pbmZvLT5mb3JtYXRzID0gTlVMTDsKKyAgZm9yIChqID0gMDsgaiA8IGktPm5fZm9ybWF0czsgaisrKQorICAgIGRldmljZV9pbmZvLT5mb3JtYXRzID0gZ19saXN0X3ByZXBlbmQgKGRldmljZV9pbmZvLT5mb3JtYXRzLAorICAgICAgICBwYV9mb3JtYXRfaW5mb19jb3B5IChpLT5mb3JtYXRzW2pdKSk7CisKK2RvbmU6CisgIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbCAobWFpbmxvb3AsIDApOworfQorCisvKiBDYWxsIHdpdGggbWFpbmxvb3AgbG9jayBoZWxkICovCitzdGF0aWMgcGFfc3RyZWFtICoKK2dzdF9wdWxzZXNpbmtfY3JlYXRlX3Byb2JlX3N0cmVhbSAoR3N0UHVsc2VTaW5rICogcHNpbmssCisgICAgR3N0UHVsc2VSaW5nQnVmZmVyICogcGJ1ZiwgcGFfZm9ybWF0X2luZm8gKiBmb3JtYXQpCit7CisgIHBhX2Zvcm1hdF9pbmZvICpmb3JtYXRzWzFdID0geyBmb3JtYXQgfTsKKyAgcGFfc3RyZWFtICpzdHJlYW07CisgIHBhX3N0cmVhbV9mbGFnc190IGZsYWdzOworCisgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgIkNyZWF0aW5nIHByb2JlIHN0cmVhbSIpOworCisgIGlmICghKHN0cmVhbSA9IHBhX3N0cmVhbV9uZXdfZXh0ZW5kZWQgKHBidWYtPmNvbnRleHQsICJwdWxzZXNpbmsgcHJvYmUiLAorICAgICAgICAgICAgICBmb3JtYXRzLCAxLCBwc2luay0+cHJvcGxpc3QpKSkKKyAgICBnb3RvIGVycm9yOworCisgIC8qIGNvbnN0cnVjdCB0aGUgZmxhZ3MgKi8KKyAgZmxhZ3MgPSBQQV9TVFJFQU1fSU5URVJQT0xBVEVfVElNSU5HIHwgUEFfU1RSRUFNX0FVVE9fVElNSU5HX1VQREFURSB8CisgICAgICBQQV9TVFJFQU1fQURKVVNUX0xBVEVOQ1kgfCBQQV9TVFJFQU1fU1RBUlRfQ09SS0VEOworCisgIHBhX3N0cmVhbV9zZXRfc3RhdGVfY2FsbGJhY2sgKHN0cmVhbSwgZ3N0X3B1bHNlcmluZ19zdHJlYW1fc3RhdGVfY2IsIHBidWYpOworCisgIGlmIChwYV9zdHJlYW1fY29ubmVjdF9wbGF5YmFjayAoc3RyZWFtLCBwc2luay0+ZGV2aWNlLCBOVUxMLCBmbGFncywgTlVMTCwKKyAgICAgICAgICBOVUxMKSA8IDApCisgICAgZ290byBlcnJvcjsKKworICBpZiAoIWdzdF9wdWxzZXJpbmdfd2FpdF9mb3Jfc3RyZWFtX3JlYWR5IChwc2luaywgc3RyZWFtKSkKKyAgICBnb3RvIGVycm9yOworCisgIHJldHVybiBzdHJlYW07CisKK2Vycm9yOgorICBpZiAoc3RyZWFtKQorICAgIHBhX3N0cmVhbV91bnJlZiAoc3RyZWFtKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9wdWxzZXNpbmtfcXVlcnlfZ2V0Y2FwcyAoR3N0UHVsc2VTaW5rICogcHNpbmssIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZiA9IE5VTEw7CisgIEdzdFB1bHNlRGV2aWNlSW5mbyBkZXZpY2VfaW5mbyA9IHsgTlVMTCwgTlVMTCB9OworICBHc3RDYXBzICpyZXQgPSBOVUxMOworICBHTGlzdCAqaTsKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKyAgcGFfc3RyZWFtICpzdHJlYW07CisKKyAgR1NUX09CSkVDVF9MT0NLIChwc2luayk7CisgIHBidWYgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUIChHU1RfQVVESU9fQkFTRV9TSU5LIChwc2luayktPnJpbmdidWZmZXIpOworICBpZiAocGJ1ZiAhPSBOVUxMKQorICAgIGdzdF9vYmplY3RfcmVmIChwYnVmKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHBzaW5rKTsKKworICBpZiAoIXBidWYpIHsKKyAgICByZXQgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX0FVRElPX0JBU0VfU0lOS19QQUQgKHBzaW5rKSk7CisgICAgZ290byBvdXQ7CisgIH0KKworICBHU1RfT0JKRUNUX0xPQ0sgKHBidWYpOworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChtYWlubG9vcCk7CisKKyAgaWYgKCFwYnVmLT5jb250ZXh0KSB7CisgICAgcmV0ID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9BVURJT19CQVNFX1NJTktfUEFEIChwc2luaykpOworICAgIGdvdG8gdW5sb2NrOworICB9CisKKyAgcmV0ID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIGlmIChwYnVmLT5zdHJlYW0pIHsKKyAgICAvKiBXZSdyZSBpbiBQQVVTRUQgb3IgaGlnaGVyICovCisgICAgc3RyZWFtID0gcGJ1Zi0+c3RyZWFtOworCisgIH0gZWxzZSBpZiAocGJ1Zi0+cHJvYmVfc3RyZWFtKSB7CisgICAgLyogV2UncmUgbm90IHBhdXNlZCwgYnV0IGhhdmUgYSBjYWNoZWQgcHJvYmUgc3RyZWFtICovCisgICAgc3RyZWFtID0gcGJ1Zi0+cHJvYmVfc3RyZWFtOworCisgIH0gZWxzZSB7CisgICAgLyogV2UncmUgbm90IHlldCBpbiBQQVVTRUQgYW5kIHN0aWxsIG5lZWQgdG8gY3JlYXRlIGEgcHJvYmUgc3RyZWFtLgorICAgICAqCisgICAgICogRklYTUU6IFBBIGRvZXNuJ3QgYWNjZXB0ICJhbnkiIGZvcm1hdC4gV2UgZml4IHNvbWV0aGluZyByZWFzb25hYmxlIHNpbmNlCisgICAgICogdGhpcyBpcyBtZXJlbHkgYSBwcm9iZS4gVGhpcyBzaG91bGQgZXZlbnR1YWxseSBiZSBmaXhlZCBpbiBQQSBhbmQKKyAgICAgKiBoYXJkLWNvZGluZyB0aGUgZm9ybWF0IHNob3VsZCBiZSBkcm9wcGVkLiAqLworICAgIHBhX2Zvcm1hdF9pbmZvICpmb3JtYXQgPSBwYV9mb3JtYXRfaW5mb19uZXcgKCk7CisgICAgZm9ybWF0LT5lbmNvZGluZyA9IFBBX0VOQ09ESU5HX1BDTTsKKyAgICBwYV9mb3JtYXRfaW5mb19zZXRfc2FtcGxlX2Zvcm1hdCAoZm9ybWF0LCBQQV9TQU1QTEVfUzE2TEUpOworICAgIHBhX2Zvcm1hdF9pbmZvX3NldF9yYXRlIChmb3JtYXQsIEdTVF9BVURJT19ERUZfUkFURSk7CisgICAgcGFfZm9ybWF0X2luZm9fc2V0X2NoYW5uZWxzIChmb3JtYXQsIEdTVF9BVURJT19ERUZfQ0hBTk5FTFMpOworCisgICAgcGJ1Zi0+cHJvYmVfc3RyZWFtID0gZ3N0X3B1bHNlc2lua19jcmVhdGVfcHJvYmVfc3RyZWFtIChwc2luaywgcGJ1ZiwKKyAgICAgICAgZm9ybWF0KTsKKworICAgIHBhX2Zvcm1hdF9pbmZvX2ZyZWUgKGZvcm1hdCk7CisKKyAgICBpZiAoIXBidWYtPnByb2JlX3N0cmVhbSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwc2luaywgIkNvdWxkIG5vdCBjcmVhdGUgcHJvYmUgc3RyZWFtIik7CisgICAgICBnb3RvIHVubG9jazsKKyAgICB9CisKKyAgICBzdHJlYW0gPSBwYnVmLT5wcm9iZV9zdHJlYW07CisgIH0KKworICBpZiAoIShvID0gcGFfY29udGV4dF9nZXRfc2lua19pbmZvX2J5X25hbWUgKHBidWYtPmNvbnRleHQsCisgICAgICAgICAgICAgIHBhX3N0cmVhbV9nZXRfZGV2aWNlX25hbWUgKHN0cmVhbSksIGdzdF9wdWxzZXNpbmtfc2lua19pbmZvX2NiLAorICAgICAgICAgICAgICAmZGV2aWNlX2luZm8pKSkKKyAgICBnb3RvIGluZm9fZmFpbGVkOworCisgIHdoaWxlIChwYV9vcGVyYXRpb25fZ2V0X3N0YXRlIChvKSA9PSBQQV9PUEVSQVRJT05fUlVOTklORykgeworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQgKG1haW5sb29wKTsKKyAgICBpZiAoZ3N0X3B1bHNlcmluZ19pc19kZWFkIChwc2luaywgcGJ1ZiwgRkFMU0UpKQorICAgICAgZ290byB1bmxvY2s7CisgIH0KKworICBmb3IgKGkgPSBnX2xpc3RfZmlyc3QgKGRldmljZV9pbmZvLmZvcm1hdHMpOyBpOyBpID0gZ19saXN0X25leHQgKGkpKSB7CisgICAgZ3N0X2NhcHNfYXBwZW5kIChyZXQsCisgICAgICAgIGdzdF9wdWxzZV9mb3JtYXRfaW5mb190b19jYXBzICgocGFfZm9ybWF0X2luZm8gKikgaS0+ZGF0YSkpOworICB9CisKK3VubG9jazoKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChtYWlubG9vcCk7CisgIC8qIEZJWE1FOiB0aGlzIGNvdWxkIGJlIGZyZWVkIGFmdGVyIGRldmljZV9uYW1lIGlzIGdvdCAqLworICBHU1RfT0JKRUNUX1VOTE9DSyAocGJ1Zik7CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKnRtcCA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHJldCwKKyAgICAgICAgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmV0KTsKKyAgICByZXQgPSB0bXA7CisgIH0KKworb3V0OgorICBmcmVlX2RldmljZV9pbmZvICgmZGV2aWNlX2luZm8pOworCisgIGlmIChvKQorICAgIHBhX29wZXJhdGlvbl91bnJlZiAobyk7CisKKyAgaWYgKHBidWYpCisgICAgZ3N0X29iamVjdF91bnJlZiAocGJ1Zik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJjYXBzICUiIEdTVF9QVFJfRk9STUFULCByZXQpOworCisgIHJldHVybiByZXQ7CisKK2luZm9fZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBzaW5rLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoInBhX2NvbnRleHRfZ2V0X3NpbmtfaW5wdXRfaW5mbygpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHBidWYtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byB1bmxvY2s7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VzaW5rX3F1ZXJ5X2FjY2VwdGNhcHMgKEdzdFB1bHNlU2luayAqIHBzaW5rLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmID0gTlVMTDsKKyAgR3N0UHVsc2VEZXZpY2VJbmZvIGRldmljZV9pbmZvID0geyBOVUxMLCBOVUxMIH07CisgIEdzdENhcHMgKnBhZF9jYXBzOworICBHc3RTdHJ1Y3R1cmUgKnN0OworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjIHNwZWMgPSB7IDAgfTsKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKyAgcGFfY2hhbm5lbF9tYXAgY2hhbm5lbF9tYXA7CisgIHBhX2Zvcm1hdF9pbmZvICpmb3JtYXQgPSBOVUxMOworICBndWludCBjaGFubmVsczsKKworICBwYWRfY2FwcyA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChHU1RfQkFTRV9TSU5LX1BBRCAocHNpbmspKTsKKyAgcmV0ID0gZ3N0X2NhcHNfaXNfc3Vic2V0IChjYXBzLCBwYWRfY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChwYWRfY2Fwcyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJjYXBzICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICAvKiBUZW1wbGF0ZSBjYXBzIGRpZG4ndCBtYXRjaCAqLworICBpZiAoIXJldCkKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogSWYgd2UndmUgbm90IGdvdCBmaXhlZCBjYXBzLCBjcmVhdGluZyBhIHN0cmVhbSBtaWdodCBmYWlsLCBzbyBsZXQncyBqdXN0CisgICAqIHJldHVybiBmcm9tIGhlcmUgd2l0aCBkZWZhdWx0IGFjY2VwdGNhcHMgYmVoYXZpb3VyICovCisgIGlmICghZ3N0X2NhcHNfaXNfZml4ZWQgKGNhcHMpKQorICAgIGdvdG8gZG9uZTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHBzaW5rKTsKKyAgcGJ1ZiA9IEdTVF9QVUxTRVJJTkdfQlVGRkVSX0NBU1QgKEdTVF9BVURJT19CQVNFX1NJTksgKHBzaW5rKS0+cmluZ2J1ZmZlcik7CisgIGlmIChwYnVmICE9IE5VTEwpCisgICAgZ3N0X29iamVjdF9yZWYgKHBidWYpOworICBHU1RfT0JKRUNUX1VOTE9DSyAocHNpbmspOworCisgIC8qIFdlJ3JlIHN0aWxsIGluIE5VTEwgc3RhdGUgKi8KKyAgaWYgKHBidWYgPT0gTlVMTCkKKyAgICBnb3RvIGRvbmU7CisKKyAgR1NUX09CSkVDVF9MT0NLIChwYnVmKTsKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAobWFpbmxvb3ApOworCisgIGlmIChwYnVmLT5jb250ZXh0ID09IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgcmV0ID0gRkFMU0U7CisKKyAgc3BlYy5sYXRlbmN5X3RpbWUgPSBHU1RfQVVESU9fQkFTRV9TSU5LIChwc2luayktPmxhdGVuY3lfdGltZTsKKyAgaWYgKCFnc3RfYXVkaW9fcmluZ19idWZmZXJfcGFyc2VfY2FwcyAoJnNwZWMsIGNhcHMpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghZ3N0X3B1bHNlX2ZpbGxfZm9ybWF0X2luZm8gKCZzcGVjLCAmZm9ybWF0LCAmY2hhbm5lbHMpKQorICAgIGdvdG8gb3V0OworCisgIC8qIE1ha2Ugc3VyZSBpbnB1dCBpcyBmcmFtZWQgKG9uZSBmcmFtZSBwZXIgYnVmZmVyKSBhbmQgY2FuIGJlIHBheWxvYWRlZCAqLworICBpZiAoIXBhX2Zvcm1hdF9pbmZvX2lzX3BjbSAoZm9ybWF0KSkgeworICAgIGdib29sZWFuIGZyYW1lZCA9IEZBTFNFLCBwYXJzZWQgPSBGQUxTRTsKKyAgICBzdCA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgICAgZ3N0X3N0cnVjdHVyZV9nZXRfYm9vbGVhbiAoc3QsICJmcmFtZWQiLCAmZnJhbWVkKTsKKyAgICBnc3Rfc3RydWN0dXJlX2dldF9ib29sZWFuIChzdCwgInBhcnNlZCIsICZwYXJzZWQpOworICAgIGlmICgoIWZyYW1lZCAmJiAhcGFyc2VkKSB8fCBnc3RfYXVkaW9faWVjNjE5MzdfZnJhbWVfc2l6ZSAoJnNwZWMpIDw9IDApCisgICAgICBnb3RvIG91dDsKKyAgfQorCisgIC8qIGluaXRpYWxpemUgdGhlIGNoYW5uZWwgbWFwICovCisgIGlmIChwYV9mb3JtYXRfaW5mb19pc19wY20gKGZvcm1hdCkgJiYKKyAgICAgIGdzdF9wdWxzZV9nc3RfdG9fY2hhbm5lbF9tYXAgKCZjaGFubmVsX21hcCwgJnNwZWMpKQorICAgIHBhX2Zvcm1hdF9pbmZvX3NldF9jaGFubmVsX21hcCAoZm9ybWF0LCAmY2hhbm5lbF9tYXApOworCisgIGlmIChwYnVmLT5zdHJlYW0gfHwgcGJ1Zi0+cHJvYmVfc3RyZWFtKSB7CisgICAgLyogV2UncmUgYWxyZWFkeSBpbiBQQVVTRUQgb3IgYWJvdmUsIHNvIGp1c3QgcmV1c2UgdGhpcyBzdHJlYW0gdG8gcXVlcnkKKyAgICAgKiBzaW5rIGZvcm1hdHMgYW5kIHVzZSB0aG9zZS4gKi8KKyAgICBHTGlzdCAqaTsKKyAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSA9IHBhX3N0cmVhbV9nZXRfZGV2aWNlX25hbWUgKHBidWYtPnN0cmVhbSA/CisgICAgICAgIHBidWYtPnN0cmVhbSA6IHBidWYtPnByb2JlX3N0cmVhbSk7CisKKyAgICBpZiAoIShvID0gcGFfY29udGV4dF9nZXRfc2lua19pbmZvX2J5X25hbWUgKHBidWYtPmNvbnRleHQsIGRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgIGdzdF9wdWxzZXNpbmtfc2lua19pbmZvX2NiLCAmZGV2aWNlX2luZm8pKSkKKyAgICAgIGdvdG8gaW5mb19mYWlsZWQ7CisKKyAgICB3aGlsZSAocGFfb3BlcmF0aW9uX2dldF9zdGF0ZSAobykgPT0gUEFfT1BFUkFUSU9OX1JVTk5JTkcpIHsKKyAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQgKG1haW5sb29wKTsKKyAgICAgIGlmIChnc3RfcHVsc2VyaW5nX2lzX2RlYWQgKHBzaW5rLCBwYnVmLCBGQUxTRSkpCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGZvciAoaSA9IGdfbGlzdF9maXJzdCAoZGV2aWNlX2luZm8uZm9ybWF0cyk7IGk7IGkgPSBnX2xpc3RfbmV4dCAoaSkpIHsKKyAgICAgIGlmIChwYV9mb3JtYXRfaW5mb19pc19jb21wYXRpYmxlICgocGFfZm9ybWF0X2luZm8gKikgaS0+ZGF0YSwgZm9ybWF0KSkgeworICAgICAgICByZXQgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogV2UncmUgaW4gUkVBRFksIGxldCdzIGNvbm5lY3QgYSBzdHJlYW0gdG8gc2VlIGlmIHRoZSBmb3JtYXQgaXMKKyAgICAgKiBhY2NlcHRlZCBieSB3aGF0ZXZlciBzaW5rIHdlJ3JlIHJvdXRlZCB0byAqLworICAgIHBidWYtPnByb2JlX3N0cmVhbSA9IGdzdF9wdWxzZXNpbmtfY3JlYXRlX3Byb2JlX3N0cmVhbSAocHNpbmssIHBidWYsCisgICAgICAgIGZvcm1hdCk7CisgICAgaWYgKHBidWYtPnByb2JlX3N0cmVhbSkKKyAgICAgIHJldCA9IFRSVUU7CisgIH0KKworb3V0OgorICBpZiAoZm9ybWF0KQorICAgIHBhX2Zvcm1hdF9pbmZvX2ZyZWUgKGZvcm1hdCk7CisKKyAgZnJlZV9kZXZpY2VfaW5mbyAoJmRldmljZV9pbmZvKTsKKworICBpZiAobykKKyAgICBwYV9vcGVyYXRpb25fdW5yZWYgKG8pOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAobWFpbmxvb3ApOworICBHU1RfT0JKRUNUX1VOTE9DSyAocGJ1Zik7CisKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNwZWMuY2FwcywgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBidWYpOworCitkb25lOgorCisgIHJldHVybiByZXQ7CisKK2luZm9fZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBzaW5rLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoInBhX2NvbnRleHRfZ2V0X3NpbmtfaW5wdXRfaW5mbygpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHBidWYtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byBvdXQ7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNpbmtfaW5pdCAoR3N0UHVsc2VTaW5rICogcHVsc2VzaW5rKQoreworICBwdWxzZXNpbmstPnNlcnZlciA9IE5VTEw7CisgIHB1bHNlc2luay0+ZGV2aWNlID0gTlVMTDsKKyAgcHVsc2VzaW5rLT5kZXZpY2VfaW5mby5kZXNjcmlwdGlvbiA9IE5VTEw7CisgIHB1bHNlc2luay0+Y2xpZW50X25hbWUgPSBnc3RfcHVsc2VfY2xpZW50X25hbWUgKCk7CisKKyAgcHVsc2VzaW5rLT5kZXZpY2VfaW5mby5mb3JtYXRzID0gTlVMTDsKKworICBwdWxzZXNpbmstPnZvbHVtZSA9IERFRkFVTFRfVk9MVU1FOworICBwdWxzZXNpbmstPnZvbHVtZV9zZXQgPSBGQUxTRTsKKworICBwdWxzZXNpbmstPm11dGUgPSBERUZBVUxUX01VVEU7CisgIHB1bHNlc2luay0+bXV0ZV9zZXQgPSBGQUxTRTsKKworICBwdWxzZXNpbmstPm5vdGlmeSA9IDA7CisKKyAgZ19hdG9taWNfaW50X3NldCAoJnB1bHNlc2luay0+Zm9ybWF0X2xvc3QsIEZBTFNFKTsKKyAgcHVsc2VzaW5rLT5mb3JtYXRfbG9zdF90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBwdWxzZXNpbmstPnByb3BlcnRpZXMgPSBOVUxMOworICBwdWxzZXNpbmstPnByb3BsaXN0ID0gTlVMTDsKKworICAvKiBvdmVycmlkZSB3aXRoIGEgY3VzdG9tIGNsb2NrICovCisgIGlmIChHU1RfQVVESU9fQkFTRV9TSU5LIChwdWxzZXNpbmspLT5wcm92aWRlZF9jbG9jaykKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChHU1RfQVVESU9fQkFTRV9TSU5LIChwdWxzZXNpbmspLT5wcm92aWRlZF9jbG9jayk7CisKKyAgR1NUX0FVRElPX0JBU0VfU0lOSyAocHVsc2VzaW5rKS0+cHJvdmlkZWRfY2xvY2sgPQorICAgICAgZ3N0X2F1ZGlvX2Nsb2NrX25ldyAoIkdzdFB1bHNlU2lua0Nsb2NrIiwKKyAgICAgIChHc3RBdWRpb0Nsb2NrR2V0VGltZUZ1bmMpIGdzdF9wdWxzZXNpbmtfZ2V0X3RpbWUsIHB1bHNlc2luaywgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VzaW5rX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RQdWxzZVNpbmsgKnB1bHNlc2luayA9IEdTVF9QVUxTRVNJTktfQ0FTVCAob2JqZWN0KTsKKworICBnX2ZyZWUgKHB1bHNlc2luay0+c2VydmVyKTsKKyAgZ19mcmVlIChwdWxzZXNpbmstPmRldmljZSk7CisgIGdfZnJlZSAocHVsc2VzaW5rLT5jbGllbnRfbmFtZSk7CisgIGdfZnJlZSAocHVsc2VzaW5rLT5jdXJyZW50X3NpbmtfbmFtZSk7CisKKyAgZnJlZV9kZXZpY2VfaW5mbyAoJnB1bHNlc2luay0+ZGV2aWNlX2luZm8pOworCisgIGlmIChwdWxzZXNpbmstPnByb3BlcnRpZXMpCisgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChwdWxzZXNpbmstPnByb3BlcnRpZXMpOworICBpZiAocHVsc2VzaW5rLT5wcm9wbGlzdCkKKyAgICBwYV9wcm9wbGlzdF9mcmVlIChwdWxzZXNpbmstPnByb3BsaXN0KTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VzaW5rX3NldF92b2x1bWUgKEdzdFB1bHNlU2luayAqIHBzaW5rLCBnZG91YmxlIHZvbHVtZSkKK3sKKyAgcGFfY3ZvbHVtZSB2OworICBwYV9vcGVyYXRpb24gKm8gPSBOVUxMOworICBHc3RQdWxzZVJpbmdCdWZmZXIgKnBidWY7CisgIHVpbnQzMl90IGlkeDsKKworICBpZiAoIW1haW5sb29wKQorICAgIGdvdG8gbm9fbWFpbmxvb3A7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAobWFpbmxvb3ApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAic2V0dGluZyB2b2x1bWUgdG8gJWYiLCB2b2x1bWUpOworCisgIHBidWYgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUIChHU1RfQVVESU9fQkFTRV9TSU5LIChwc2luayktPnJpbmdidWZmZXIpOworICBpZiAocGJ1ZiA9PSBOVUxMIHx8IHBidWYtPnN0cmVhbSA9PSBOVUxMKQorICAgIGdvdG8gbm9fYnVmZmVyOworCisgIGlmICgoaWR4ID0gcGFfc3RyZWFtX2dldF9pbmRleCAocGJ1Zi0+c3RyZWFtKSkgPT0gUEFfSU5WQUxJRF9JTkRFWCkKKyAgICBnb3RvIG5vX2luZGV4OworCisgIGlmIChwYnVmLT5pc19wY20pCisgICAgZ3N0X3B1bHNlX2N2b2x1bWVfZnJvbV9saW5lYXIgKCZ2LCBwYnVmLT5jaGFubmVscywgdm9sdW1lKTsKKyAgZWxzZQorICAgIC8qIEZJWE1FOiB0aGlzIHdpbGwgZXZlbnR1YWxseSBiZSBzdXBlcmNlZGVkIGJ5IGNoZWNrcyB0byBzZWUgaWYgdGhlIHZvbHVtZQorICAgICAqIGlzIHJlYWRhYmxlL3dyaXRhYmxlICovCisgICAgZ290byB1bmxvY2s7CisKKyAgaWYgKCEobyA9IHBhX2NvbnRleHRfc2V0X3NpbmtfaW5wdXRfdm9sdW1lIChwYnVmLT5jb250ZXh0LCBpZHgsCisgICAgICAgICAgICAgICZ2LCBOVUxMLCBOVUxMKSkpCisgICAgZ290byB2b2x1bWVfZmFpbGVkOworCisgIC8qIFdlIGRvbid0IHJlYWxseSBjYXJlIGFib3V0IHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsICovCit1bmxvY2s6CisKKyAgaWYgKG8pCisgICAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKworICByZXR1cm47CisKKyAgLyogRVJST1JTICovCitub19tYWlubG9vcDoKKyAgeworICAgIHBzaW5rLT52b2x1bWUgPSB2b2x1bWU7CisgICAgcHNpbmstPnZvbHVtZV9zZXQgPSBUUlVFOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJ3ZSBoYXZlIG5vIG1haW5sb29wIik7CisgICAgcmV0dXJuOworICB9Citub19idWZmZXI6CisgIHsKKyAgICBwc2luay0+dm9sdW1lID0gdm9sdW1lOworICAgIHBzaW5rLT52b2x1bWVfc2V0ID0gVFJVRTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAid2UgaGF2ZSBubyByaW5nYnVmZmVyIik7CisgICAgZ290byB1bmxvY2s7CisgIH0KK25vX2luZGV4OgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJ3ZSBkb24ndCBoYXZlIGEgc3RyZWFtIGluZGV4Iik7CisgICAgZ290byB1bmxvY2s7CisgIH0KK3ZvbHVtZV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHNpbmssIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgicGFfc3RyZWFtX3NldF9zaW5rX2lucHV0X3ZvbHVtZSgpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHBidWYtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byB1bmxvY2s7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNpbmtfc2V0X211dGUgKEdzdFB1bHNlU2luayAqIHBzaW5rLCBnYm9vbGVhbiBtdXRlKQoreworICBwYV9vcGVyYXRpb24gKm8gPSBOVUxMOworICBHc3RQdWxzZVJpbmdCdWZmZXIgKnBidWY7CisgIHVpbnQzMl90IGlkeDsKKworICBpZiAoIW1haW5sb29wKQorICAgIGdvdG8gbm9fbWFpbmxvb3A7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAobWFpbmxvb3ApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAic2V0dGluZyBtdXRlIHN0YXRlIHRvICVkIiwgbXV0ZSk7CisKKyAgcGJ1ZiA9IEdTVF9QVUxTRVJJTkdfQlVGRkVSX0NBU1QgKEdTVF9BVURJT19CQVNFX1NJTksgKHBzaW5rKS0+cmluZ2J1ZmZlcik7CisgIGlmIChwYnVmID09IE5VTEwgfHwgcGJ1Zi0+c3RyZWFtID09IE5VTEwpCisgICAgZ290byBub19idWZmZXI7CisKKyAgaWYgKChpZHggPSBwYV9zdHJlYW1fZ2V0X2luZGV4IChwYnVmLT5zdHJlYW0pKSA9PSBQQV9JTlZBTElEX0lOREVYKQorICAgIGdvdG8gbm9faW5kZXg7CisKKyAgaWYgKCEobyA9IHBhX2NvbnRleHRfc2V0X3NpbmtfaW5wdXRfbXV0ZSAocGJ1Zi0+Y29udGV4dCwgaWR4LAorICAgICAgICAgICAgICBtdXRlLCBOVUxMLCBOVUxMKSkpCisgICAgZ290byBtdXRlX2ZhaWxlZDsKKworICAvKiBXZSBkb24ndCByZWFsbHkgY2FyZSBhYm91dCB0aGUgcmVzdWx0IG9mIHRoaXMgY2FsbCAqLwordW5sb2NrOgorCisgIGlmIChvKQorICAgIHBhX29wZXJhdGlvbl91bnJlZiAobyk7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChtYWlubG9vcCk7CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworbm9fbWFpbmxvb3A6CisgIHsKKyAgICBwc2luay0+bXV0ZSA9IG11dGU7CisgICAgcHNpbmstPm11dGVfc2V0ID0gVFJVRTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAid2UgaGF2ZSBubyBtYWlubG9vcCIpOworICAgIHJldHVybjsKKyAgfQorbm9fYnVmZmVyOgorICB7CisgICAgcHNpbmstPm11dGUgPSBtdXRlOworICAgIHBzaW5rLT5tdXRlX3NldCA9IFRSVUU7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgIndlIGhhdmUgbm8gcmluZ2J1ZmZlciIpOworICAgIGdvdG8gdW5sb2NrOworICB9Citub19pbmRleDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAid2UgZG9uJ3QgaGF2ZSBhIHN0cmVhbSBpbmRleCIpOworICAgIGdvdG8gdW5sb2NrOworICB9CittdXRlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwc2luaywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV9zdHJlYW1fc2V0X3NpbmtfaW5wdXRfbXV0ZSgpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHBidWYtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byB1bmxvY2s7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNpbmtfc2lua19pbnB1dF9pbmZvX2NiIChwYV9jb250ZXh0ICogYywgY29uc3QgcGFfc2lua19pbnB1dF9pbmZvICogaSwKKyAgICBpbnQgZW9sLCB2b2lkICp1c2VyZGF0YSkKK3sKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmOworICBHc3RQdWxzZVNpbmsgKnBzaW5rOworCisgIHBidWYgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUICh1c2VyZGF0YSk7CisgIHBzaW5rID0gR1NUX1BVTFNFU0lOS19DQVNUIChHU1RfT0JKRUNUX1BBUkVOVCAocGJ1ZikpOworCisgIGlmICghaSkKKyAgICBnb3RvIGRvbmU7CisKKyAgaWYgKCFwYnVmLT5zdHJlYW0pCisgICAgZ290byBkb25lOworCisgIC8qIElmIHRoZSBpbmRleCBkb2Vzbid0IG1hdGNoIG91ciBjdXJyZW50IHN0cmVhbSwKKyAgICogaXQgaW1wbGllcyB3ZSBqdXN0IHJlY3JlYXRlZCB0aGUgc3RyZWFtIChjYXBzIGNoYW5nZSkKKyAgICovCisgIGlmIChpLT5pbmRleCA9PSBwYV9zdHJlYW1fZ2V0X2luZGV4IChwYnVmLT5zdHJlYW0pKSB7CisgICAgcHNpbmstPnZvbHVtZSA9IHBhX3N3X3ZvbHVtZV90b19saW5lYXIgKHBhX2N2b2x1bWVfbWF4ICgmaS0+dm9sdW1lKSk7CisgICAgcHNpbmstPm11dGUgPSBpLT5tdXRlOworICAgIHBzaW5rLT5jdXJyZW50X3NpbmtfaWR4ID0gaS0+c2luazsKKworICAgIGlmIChwc2luay0+dm9sdW1lID4gTUFYX1ZPTFVNRSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwc2luaywgIkNsaXBwZWQgdm9sdW1lIGZyb20gJWYgdG8gJWYiLCBwc2luay0+dm9sdW1lLAorICAgICAgICAgIE1BWF9WT0xVTUUpOworICAgICAgcHNpbmstPnZvbHVtZSA9IE1BWF9WT0xVTUU7CisgICAgfQorICB9CisKK2RvbmU6CisgIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbCAobWFpbmxvb3AsIDApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc2lua19nZXRfc2lua19pbnB1dF9pbmZvIChHc3RQdWxzZVNpbmsgKiBwc2luaywgZ2RvdWJsZSAqIHZvbHVtZSwKKyAgICBnYm9vbGVhbiAqIG11dGUpCit7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKyAgdWludDMyX3QgaWR4OworCisgIGlmICghbWFpbmxvb3ApCisgICAgZ290byBub19tYWlubG9vcDsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChtYWlubG9vcCk7CisKKyAgcGJ1ZiA9IEdTVF9QVUxTRVJJTkdfQlVGRkVSX0NBU1QgKEdTVF9BVURJT19CQVNFX1NJTksgKHBzaW5rKS0+cmluZ2J1ZmZlcik7CisgIGlmIChwYnVmID09IE5VTEwgfHwgcGJ1Zi0+c3RyZWFtID09IE5VTEwpCisgICAgZ290byBub19idWZmZXI7CisKKyAgaWYgKChpZHggPSBwYV9zdHJlYW1fZ2V0X2luZGV4IChwYnVmLT5zdHJlYW0pKSA9PSBQQV9JTlZBTElEX0lOREVYKQorICAgIGdvdG8gbm9faW5kZXg7CisKKyAgaWYgKCEobyA9IHBhX2NvbnRleHRfZ2V0X3NpbmtfaW5wdXRfaW5mbyAocGJ1Zi0+Y29udGV4dCwgaWR4LAorICAgICAgICAgICAgICBnc3RfcHVsc2VzaW5rX3NpbmtfaW5wdXRfaW5mb19jYiwgcGJ1ZikpKQorICAgIGdvdG8gaW5mb19mYWlsZWQ7CisKKyAgd2hpbGUgKHBhX29wZXJhdGlvbl9nZXRfc3RhdGUgKG8pID09IFBBX09QRVJBVElPTl9SVU5OSU5HKSB7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAobWFpbmxvb3ApOworICAgIGlmIChnc3RfcHVsc2VyaW5nX2lzX2RlYWQgKHBzaW5rLCBwYnVmLCBUUlVFKSkKKyAgICAgIGdvdG8gdW5sb2NrOworICB9CisKK3VubG9jazoKKyAgaWYgKHZvbHVtZSkKKyAgICAqdm9sdW1lID0gcHNpbmstPnZvbHVtZTsKKyAgaWYgKG11dGUpCisgICAgKm11dGUgPSBwc2luay0+bXV0ZTsKKworICBpZiAobykKKyAgICBwYV9vcGVyYXRpb25fdW5yZWYgKG8pOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAobWFpbmxvb3ApOworCisgIHJldHVybjsKKworICAvKiBFUlJPUlMgKi8KK25vX21haW5sb29wOgorICB7CisgICAgaWYgKHZvbHVtZSkKKyAgICAgICp2b2x1bWUgPSBwc2luay0+dm9sdW1lOworICAgIGlmIChtdXRlKQorICAgICAgKm11dGUgPSBwc2luay0+bXV0ZTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAid2UgaGF2ZSBubyBtYWlubG9vcCIpOworICAgIHJldHVybjsKKyAgfQorbm9fYnVmZmVyOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJ3ZSBoYXZlIG5vIHJpbmdidWZmZXIiKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQorbm9faW5kZXg6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgIndlIGRvbid0IGhhdmUgYSBzdHJlYW0gaW5kZXgiKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQoraW5mb19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHNpbmssIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgicGFfY29udGV4dF9nZXRfc2lua19pbnB1dF9pbmZvKCkgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICBwYV9zdHJlcnJvciAocGFfY29udGV4dF9lcnJubyAocGJ1Zi0+Y29udGV4dCkpKSwgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc2lua19jdXJyZW50X3NpbmtfaW5mb19jYiAocGFfY29udGV4dCAqIGMsIGNvbnN0IHBhX3NpbmtfaW5mbyAqIGksCisgICAgaW50IGVvbCwgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKHVzZXJkYXRhKTsKKworICBpZiAoIWkpCisgICAgZ290byBkb25lOworCisgIC8qIElmIHRoZSBpbmRleCBkb2Vzbid0IG1hdGNoIG91ciBjdXJyZW50IHN0cmVhbSwKKyAgICogaXQgaW1wbGllcyB3ZSBqdXN0IHJlY3JlYXRlZCB0aGUgc3RyZWFtIChjYXBzIGNoYW5nZSkKKyAgICovCisgIGlmIChpLT5pbmRleCA9PSBwc2luay0+Y3VycmVudF9zaW5rX2lkeCkgeworICAgIGdfZnJlZSAocHNpbmstPmN1cnJlbnRfc2lua19uYW1lKTsKKyAgICBwc2luay0+Y3VycmVudF9zaW5rX25hbWUgPSBnX3N0cmR1cCAoaS0+bmFtZSk7CisgIH0KKworZG9uZToKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsIChtYWlubG9vcCwgMCk7Cit9CisKK3N0YXRpYyBnY2hhciAqCitnc3RfcHVsc2VzaW5rX2dldF9jdXJyZW50X2RldmljZSAoR3N0UHVsc2VTaW5rICogcHVsc2VzaW5rKQoreworICBwYV9vcGVyYXRpb24gKm8gPSBOVUxMOworICBHc3RQdWxzZVJpbmdCdWZmZXIgKnBidWY7CisgIGdjaGFyICpjdXJyZW50X3Npbms7CisKKyAgaWYgKCFtYWlubG9vcCkKKyAgICBnb3RvIG5vX21haW5sb29wOworCisgIHBidWYgPQorICAgICAgR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAoR1NUX0FVRElPX0JBU0VfU0lOSyAocHVsc2VzaW5rKS0+cmluZ2J1ZmZlcik7CisgIGlmIChwYnVmID09IE5VTEwgfHwgcGJ1Zi0+c3RyZWFtID09IE5VTEwpCisgICAgZ290byBub19idWZmZXI7CisKKyAgZ3N0X3B1bHNlc2lua19nZXRfc2lua19pbnB1dF9pbmZvIChwdWxzZXNpbmssIE5VTEwsIE5VTEwpOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKG1haW5sb29wKTsKKworICBpZiAoIShvID0gcGFfY29udGV4dF9nZXRfc2lua19pbmZvX2J5X2luZGV4IChwYnVmLT5jb250ZXh0LAorICAgICAgICAgICAgICBwdWxzZXNpbmstPmN1cnJlbnRfc2lua19pZHgsIGdzdF9wdWxzZXNpbmtfY3VycmVudF9zaW5rX2luZm9fY2IsCisgICAgICAgICAgICAgIHB1bHNlc2luaykpKQorICAgIGdvdG8gaW5mb19mYWlsZWQ7CisKKyAgd2hpbGUgKHBhX29wZXJhdGlvbl9nZXRfc3RhdGUgKG8pID09IFBBX09QRVJBVElPTl9SVU5OSU5HKSB7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAobWFpbmxvb3ApOworICAgIGlmIChnc3RfcHVsc2VyaW5nX2lzX2RlYWQgKHB1bHNlc2luaywgcGJ1ZiwgVFJVRSkpCisgICAgICBnb3RvIHVubG9jazsKKyAgfQorCit1bmxvY2s6CisKKyAgY3VycmVudF9zaW5rID0gZ19zdHJkdXAgKHB1bHNlc2luay0+Y3VycmVudF9zaW5rX25hbWUpOworCisgIGlmIChvKQorICAgIHBhX29wZXJhdGlvbl91bnJlZiAobyk7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChtYWlubG9vcCk7CisKKyAgcmV0dXJuIGN1cnJlbnRfc2luazsKKworICAvKiBFUlJPUlMgKi8KK25vX21haW5sb29wOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHVsc2VzaW5rLCAid2UgaGF2ZSBubyBtYWlubG9vcCIpOworICAgIHJldHVybiBOVUxMOworICB9Citub19idWZmZXI6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNpbmssICJ3ZSBoYXZlIG5vIHJpbmdidWZmZXIiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQoraW5mb19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHVsc2VzaW5rLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoInBhX2NvbnRleHRfZ2V0X3NpbmtfaW5wdXRfaW5mbygpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHBidWYtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byB1bmxvY2s7CisgIH0KK30KKworc3RhdGljIGdjaGFyICoKK2dzdF9wdWxzZXNpbmtfZGV2aWNlX2Rlc2NyaXB0aW9uIChHc3RQdWxzZVNpbmsgKiBwc2luaykKK3sKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmOworICBwYV9vcGVyYXRpb24gKm8gPSBOVUxMOworICBnY2hhciAqdDsKKworICBpZiAoIW1haW5sb29wKQorICAgIGdvdG8gbm9fbWFpbmxvb3A7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAobWFpbmxvb3ApOworICBwYnVmID0gR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAoR1NUX0FVRElPX0JBU0VfU0lOSyAocHNpbmspLT5yaW5nYnVmZmVyKTsKKyAgaWYgKHBidWYgPT0gTlVMTCkKKyAgICBnb3RvIG5vX2J1ZmZlcjsKKworICBmcmVlX2RldmljZV9pbmZvICgmcHNpbmstPmRldmljZV9pbmZvKTsKKyAgaWYgKCEobyA9IHBhX2NvbnRleHRfZ2V0X3NpbmtfaW5mb19ieV9uYW1lIChwYnVmLT5jb250ZXh0LAorICAgICAgICAgICAgICBwc2luay0+ZGV2aWNlLCBnc3RfcHVsc2VzaW5rX3NpbmtfaW5mb19jYiwgJnBzaW5rLT5kZXZpY2VfaW5mbykpKQorICAgIGdvdG8gaW5mb19mYWlsZWQ7CisKKyAgd2hpbGUgKHBhX29wZXJhdGlvbl9nZXRfc3RhdGUgKG8pID09IFBBX09QRVJBVElPTl9SVU5OSU5HKSB7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAobWFpbmxvb3ApOworICAgIGlmIChnc3RfcHVsc2VyaW5nX2lzX2RlYWQgKHBzaW5rLCBwYnVmLCBGQUxTRSkpCisgICAgICBnb3RvIHVubG9jazsKKyAgfQorCit1bmxvY2s6CisgIGlmIChvKQorICAgIHBhX29wZXJhdGlvbl91bnJlZiAobyk7CisKKyAgdCA9IGdfc3RyZHVwIChwc2luay0+ZGV2aWNlX2luZm8uZGVzY3JpcHRpb24pOworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKworICByZXR1cm4gdDsKKworICAvKiBFUlJPUlMgKi8KK25vX21haW5sb29wOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJ3ZSBoYXZlIG5vIG1haW5sb29wIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK25vX2J1ZmZlcjoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAid2UgaGF2ZSBubyByaW5nYnVmZmVyIik7CisgICAgZ290byB1bmxvY2s7CisgIH0KK2luZm9fZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBzaW5rLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoInBhX2NvbnRleHRfZ2V0X3NpbmtfaW5mb19ieV9pbmRleCgpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHBidWYtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byB1bmxvY2s7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNpbmtfc2V0X3N0cmVhbV9kZXZpY2UgKEdzdFB1bHNlU2luayAqIHBzaW5rLCBjb25zdCBnY2hhciAqIGRldmljZSkKK3sKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmOworICB1aW50MzJfdCBpZHg7CisKKyAgaWYgKCFtYWlubG9vcCkKKyAgICBnb3RvIG5vX21haW5sb29wOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKG1haW5sb29wKTsKKworICBwYnVmID0gR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAoR1NUX0FVRElPX0JBU0VfU0lOSyAocHNpbmspLT5yaW5nYnVmZmVyKTsKKyAgaWYgKHBidWYgPT0gTlVMTCB8fCBwYnVmLT5zdHJlYW0gPT0gTlVMTCkKKyAgICBnb3RvIG5vX2J1ZmZlcjsKKworICBpZiAoKGlkeCA9IHBhX3N0cmVhbV9nZXRfaW5kZXggKHBidWYtPnN0cmVhbSkpID09IFBBX0lOVkFMSURfSU5ERVgpCisgICAgZ290byBub19pbmRleDsKKworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAic2V0dGluZyBzdHJlYW0gZGV2aWNlIHRvICVzIiwgZGV2aWNlKTsKKworICBpZiAoIShvID0gcGFfY29udGV4dF9tb3ZlX3NpbmtfaW5wdXRfYnlfbmFtZSAocGJ1Zi0+Y29udGV4dCwgaWR4LCBkZXZpY2UsCisgICAgICAgICAgICAgIE5VTEwsIE5VTEwpKSkKKyAgICBnb3RvIG1vdmVfZmFpbGVkOworCit1bmxvY2s6CisKKyAgaWYgKG8pCisgICAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKworICByZXR1cm47CisKKyAgLyogRVJST1JTICovCitub19tYWlubG9vcDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAid2UgaGF2ZSBubyBtYWlubG9vcCIpOworICAgIHJldHVybjsKKyAgfQorbm9fYnVmZmVyOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJ3ZSBoYXZlIG5vIHJpbmdidWZmZXIiKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQorbm9faW5kZXg6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgIndlIGRvbid0IGhhdmUgYSBzdHJlYW0gaW5kZXgiKTsKKyAgICByZXR1cm47CisgIH0KK21vdmVfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBzaW5rLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoInBhX2NvbnRleHRfbW92ZV9zaW5rX2lucHV0X2J5X25hbWUoJXMpIGZhaWxlZDogJXMiLCBkZXZpY2UsCisgICAgICAgICAgICBwYV9zdHJlcnJvciAocGFfY29udGV4dF9lcnJubyAocGJ1Zi0+Y29udGV4dCkpKSwgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VzaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RQdWxzZVNpbmsgKnB1bHNlc2luayA9IEdTVF9QVUxTRVNJTktfQ0FTVCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU0VSVkVSOgorICAgICAgZ19mcmVlIChwdWxzZXNpbmstPnNlcnZlcik7CisgICAgICBwdWxzZXNpbmstPnNlcnZlciA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RFVklDRToKKyAgICAgIGdfZnJlZSAocHVsc2VzaW5rLT5kZXZpY2UpOworICAgICAgcHVsc2VzaW5rLT5kZXZpY2UgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGdzdF9wdWxzZXNpbmtfc2V0X3N0cmVhbV9kZXZpY2UgKHB1bHNlc2luaywgcHVsc2VzaW5rLT5kZXZpY2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1ZPTFVNRToKKyAgICAgIGdzdF9wdWxzZXNpbmtfc2V0X3ZvbHVtZSAocHVsc2VzaW5rLCBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTVVURToKKyAgICAgIGdzdF9wdWxzZXNpbmtfc2V0X211dGUgKHB1bHNlc2luaywgZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTElFTlRfTkFNRToKKyAgICAgIGdfZnJlZSAocHVsc2VzaW5rLT5jbGllbnRfbmFtZSk7CisgICAgICBpZiAoIWdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocHVsc2VzaW5rLAorICAgICAgICAgICAgIkVtcHR5IFB1bHNlQXVkaW8gY2xpZW50IG5hbWUgbm90IGFsbG93ZWQuIFJlc2V0dGluZyB0byBkZWZhdWx0IHZhbHVlIik7CisgICAgICAgIHB1bHNlc2luay0+Y2xpZW50X25hbWUgPSBnc3RfcHVsc2VfY2xpZW50X25hbWUgKCk7CisgICAgICB9IGVsc2UKKyAgICAgICAgcHVsc2VzaW5rLT5jbGllbnRfbmFtZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NUUkVBTV9QUk9QRVJUSUVTOgorICAgICAgaWYgKHB1bHNlc2luay0+cHJvcGVydGllcykKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChwdWxzZXNpbmstPnByb3BlcnRpZXMpOworICAgICAgcHVsc2VzaW5rLT5wcm9wZXJ0aWVzID0KKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX2NvcHkgKGdzdF92YWx1ZV9nZXRfc3RydWN0dXJlICh2YWx1ZSkpOworICAgICAgaWYgKHB1bHNlc2luay0+cHJvcGxpc3QpCisgICAgICAgIHBhX3Byb3BsaXN0X2ZyZWUgKHB1bHNlc2luay0+cHJvcGxpc3QpOworICAgICAgcHVsc2VzaW5rLT5wcm9wbGlzdCA9IGdzdF9wdWxzZV9tYWtlX3Byb3BsaXN0IChwdWxzZXNpbmstPnByb3BlcnRpZXMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKworICBHc3RQdWxzZVNpbmsgKnB1bHNlc2luayA9IEdTVF9QVUxTRVNJTktfQ0FTVCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU0VSVkVSOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgcHVsc2VzaW5rLT5zZXJ2ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RFVklDRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHB1bHNlc2luay0+ZGV2aWNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DVVJSRU5UX0RFVklDRToKKyAgICB7CisgICAgICBnY2hhciAqY3VycmVudF9kZXZpY2UgPSBnc3RfcHVsc2VzaW5rX2dldF9jdXJyZW50X2RldmljZSAocHVsc2VzaW5rKTsKKyAgICAgIGlmIChjdXJyZW50X2RldmljZSkKKyAgICAgICAgZ192YWx1ZV90YWtlX3N0cmluZyAodmFsdWUsIGN1cnJlbnRfZGV2aWNlKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgIiIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9ERVZJQ0VfTkFNRToKKyAgICAgIGdfdmFsdWVfdGFrZV9zdHJpbmcgKHZhbHVlLCBnc3RfcHVsc2VzaW5rX2RldmljZV9kZXNjcmlwdGlvbiAocHVsc2VzaW5rKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVk9MVU1FOgorICAgIHsKKyAgICAgIGdkb3VibGUgdm9sdW1lOworCisgICAgICBnc3RfcHVsc2VzaW5rX2dldF9zaW5rX2lucHV0X2luZm8gKHB1bHNlc2luaywgJnZvbHVtZSwgTlVMTCk7CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCB2b2x1bWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9NVVRFOgorICAgIHsKKyAgICAgIGdib29sZWFuIG11dGU7CisKKyAgICAgIGdzdF9wdWxzZXNpbmtfZ2V0X3NpbmtfaW5wdXRfaW5mbyAocHVsc2VzaW5rLCBOVUxMLCAmbXV0ZSk7CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgbXV0ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0NMSUVOVF9OQU1FOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgcHVsc2VzaW5rLT5jbGllbnRfbmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1RSRUFNX1BST1BFUlRJRVM6CisgICAgICBnc3RfdmFsdWVfc2V0X3N0cnVjdHVyZSAodmFsdWUsIHB1bHNlc2luay0+cHJvcGVydGllcyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VzaW5rX2NoYW5nZV90aXRsZSAoR3N0UHVsc2VTaW5rICogcHNpbmssIGNvbnN0IGdjaGFyICogdCkKK3sKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKG1haW5sb29wKTsKKworICBwYnVmID0gR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAoR1NUX0FVRElPX0JBU0VfU0lOSyAocHNpbmspLT5yaW5nYnVmZmVyKTsKKworICBpZiAocGJ1ZiA9PSBOVUxMIHx8IHBidWYtPnN0cmVhbSA9PSBOVUxMKQorICAgIGdvdG8gbm9fYnVmZmVyOworCisgIGdfZnJlZSAocGJ1Zi0+c3RyZWFtX25hbWUpOworICBwYnVmLT5zdHJlYW1fbmFtZSA9IGdfc3RyZHVwICh0KTsKKworICBpZiAoIShvID0gcGFfc3RyZWFtX3NldF9uYW1lIChwYnVmLT5zdHJlYW0sIHBidWYtPnN0cmVhbV9uYW1lLCBOVUxMLCBOVUxMKSkpCisgICAgZ290byBuYW1lX2ZhaWxlZDsKKworICAvKiBXZSdyZSBub3QgaW50ZXJlc3RlZCBpZiB0aGlzIG9wZXJhdGlvbiBmYWlsZWQgb3Igbm90ICovCit1bmxvY2s6CisKKyAgaWYgKG8pCisgICAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChtYWlubG9vcCk7CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworbm9fYnVmZmVyOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJ3ZSBoYXZlIG5vIHJpbmdidWZmZXIiKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQorbmFtZV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHNpbmssIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgicGFfc3RyZWFtX3NldF9uYW1lKCkgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICBwYV9zdHJlcnJvciAocGFfY29udGV4dF9lcnJubyAocGJ1Zi0+Y29udGV4dCkpKSwgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc2lua19jaGFuZ2VfcHJvcHMgKEdzdFB1bHNlU2luayAqIHBzaW5rLCBHc3RUYWdMaXN0ICogbCkKK3sKKyAgc3RhdGljIGNvbnN0IGdjaGFyICpjb25zdCBtYXBbXSA9IHsKKyAgICBHU1RfVEFHX1RJVExFLCBQQV9QUk9QX01FRElBX1RJVExFLAorCisgICAgLyogbWlnaHQgZ2V0IG92ZXJyaWRlbiBpbiB0aGUgbmV4dCBpdGVyYXRpb24gYnkgR1NUX1RBR19BUlRJU1QgKi8KKyAgICBHU1RfVEFHX1BFUkZPUk1FUiwgUEFfUFJPUF9NRURJQV9BUlRJU1QsCisKKyAgICBHU1RfVEFHX0FSVElTVCwgUEFfUFJPUF9NRURJQV9BUlRJU1QsCisgICAgR1NUX1RBR19MQU5HVUFHRV9DT0RFLCBQQV9QUk9QX01FRElBX0xBTkdVQUdFLAorICAgIEdTVF9UQUdfTE9DQVRJT04sIFBBX1BST1BfTUVESUFfRklMRU5BTUUsCisgICAgLyogV2UgbWlnaHQgYWRkIG1vcmUgaGVyZSBsYXRlciBvbiAuLi4gKi8KKyAgICBOVUxMCisgIH07CisgIHBhX3Byb3BsaXN0ICpwbCA9IE5VTEw7CisgIGNvbnN0IGdjaGFyICpjb25zdCAqdDsKKyAgZ2Jvb2xlYW4gZW1wdHkgPSBUUlVFOworICBwYV9vcGVyYXRpb24gKm8gPSBOVUxMOworICBHc3RQdWxzZVJpbmdCdWZmZXIgKnBidWY7CisKKyAgcGwgPSBwYV9wcm9wbGlzdF9uZXcgKCk7CisKKyAgZm9yICh0ID0gbWFwOyAqdDsgdCArPSAyKSB7CisgICAgZ2NoYXIgKm4gPSBOVUxMOworCisgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nIChsLCAqdCwgJm4pKSB7CisKKyAgICAgIGlmIChuICYmICpuKSB7CisgICAgICAgIHBhX3Byb3BsaXN0X3NldHMgKHBsLCAqKHQgKyAxKSwgbik7CisgICAgICAgIGVtcHR5ID0gRkFMU0U7CisgICAgICB9CisKKyAgICAgIGdfZnJlZSAobik7CisgICAgfQorICB9CisgIGlmIChlbXB0eSkKKyAgICBnb3RvIGZpbmlzaDsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChtYWlubG9vcCk7CisgIHBidWYgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUIChHU1RfQVVESU9fQkFTRV9TSU5LIChwc2luayktPnJpbmdidWZmZXIpOworICBpZiAocGJ1ZiA9PSBOVUxMIHx8IHBidWYtPnN0cmVhbSA9PSBOVUxMKQorICAgIGdvdG8gbm9fYnVmZmVyOworCisgIC8qIFdlJ3JlIG5vdCBpbnRlcmVzdGVkIGlmIHRoaXMgb3BlcmF0aW9uIGZhaWxlZCBvciBub3QgKi8KKyAgaWYgKCEobyA9IHBhX3N0cmVhbV9wcm9wbGlzdF91cGRhdGUgKHBidWYtPnN0cmVhbSwgUEFfVVBEQVRFX1JFUExBQ0UsCisgICAgICAgICAgICAgIHBsLCBOVUxMLCBOVUxMKSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgInBhX3N0cmVhbV9wcm9wbGlzdF91cGRhdGUoKSBmYWlsZWQiKTsKKyAgfQorCit1bmxvY2s6CisKKyAgaWYgKG8pCisgICAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKworZmluaXNoOgorCisgIGlmIChwbCkKKyAgICBwYV9wcm9wbGlzdF9mcmVlIChwbCk7CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworbm9fYnVmZmVyOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJ3ZSBoYXZlIG5vIHJpbmdidWZmZXIiKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc2lua19mbHVzaF9yaW5nYnVmZmVyIChHc3RQdWxzZVNpbmsgKiBwc2luaykKK3sKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKG1haW5sb29wKTsKKworICBwYnVmID0gR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAoR1NUX0FVRElPX0JBU0VfU0lOSyAocHNpbmspLT5yaW5nYnVmZmVyKTsKKworICBpZiAocGJ1ZiA9PSBOVUxMIHx8IHBidWYtPnN0cmVhbSA9PSBOVUxMKQorICAgIGdvdG8gbm9fYnVmZmVyOworCisgIGdzdF9wdWxzZXJpbmdfZmx1c2ggKHBidWYpOworCisgIC8qIFVuY29yayBpZiB3ZSBoYXZlbid0IGFscmVhZHkgKGhhcHBlbnMgd2hlbiB3YWl0aW5nIHRvIGdldCBlbm91Z2ggZGF0YQorICAgKiB0byBzZW5kIG91dCB0aGUgZmlyc3QgdGltZSkgKi8KKyAgaWYgKHBidWYtPmNvcmtlZCkKKyAgICBnc3RfcHVsc2VyaW5nX3NldF9jb3JrZWQgKHBidWYsIEZBTFNFLCBGQUxTRSk7CisKKyAgLyogV2UncmUgbm90IGludGVyZXN0ZWQgaWYgdGhpcyBvcGVyYXRpb24gZmFpbGVkIG9yIG5vdCAqLwordW5sb2NrOgorICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKworICByZXR1cm47CisKKyAgLyogRVJST1JTICovCitub19idWZmZXI6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgIndlIGhhdmUgbm8gcmluZ2J1ZmZlciIpOworICAgIGdvdG8gdW5sb2NrOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3B1bHNlc2lua19ldmVudCAoR3N0QmFzZVNpbmsgKiBzaW5rLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RQdWxzZVNpbmsgKnB1bHNlc2luayA9IEdTVF9QVUxTRVNJTktfQ0FTVCAoc2luayk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfVEFHOnsKKyAgICAgIGdjaGFyICp0aXRsZSA9IE5VTEwsICphcnRpc3QgPSBOVUxMLCAqbG9jYXRpb24gPSBOVUxMLCAqZGVzY3JpcHRpb24gPQorICAgICAgICAgIE5VTEwsICp0ID0gTlVMTCwgKmJ1ZiA9IE5VTEw7CisgICAgICBHc3RUYWdMaXN0ICpsOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfdGFnIChldmVudCwgJmwpOworCisgICAgICBnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZyAobCwgR1NUX1RBR19USVRMRSwgJnRpdGxlKTsKKyAgICAgIGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nIChsLCBHU1RfVEFHX0FSVElTVCwgJmFydGlzdCk7CisgICAgICBnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZyAobCwgR1NUX1RBR19MT0NBVElPTiwgJmxvY2F0aW9uKTsKKyAgICAgIGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nIChsLCBHU1RfVEFHX0RFU0NSSVBUSU9OLCAmZGVzY3JpcHRpb24pOworCisgICAgICBpZiAoIWFydGlzdCkKKyAgICAgICAgZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKGwsIEdTVF9UQUdfUEVSRk9STUVSLCAmYXJ0aXN0KTsKKworICAgICAgaWYgKHRpdGxlICYmIGFydGlzdCkKKyAgICAgICAgLyogVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnICovCisgICAgICAgIHQgPSBidWYgPSBnX3N0cmR1cF9wcmludGYgKF8oIiclcycgYnkgJyVzJyIpLCBnX3N0cnN0cmlwICh0aXRsZSksCisgICAgICAgICAgICBnX3N0cnN0cmlwIChhcnRpc3QpKTsKKyAgICAgIGVsc2UgaWYgKHRpdGxlKQorICAgICAgICB0ID0gZ19zdHJzdHJpcCAodGl0bGUpOworICAgICAgZWxzZSBpZiAoZGVzY3JpcHRpb24pCisgICAgICAgIHQgPSBnX3N0cnN0cmlwIChkZXNjcmlwdGlvbik7CisgICAgICBlbHNlIGlmIChsb2NhdGlvbikKKyAgICAgICAgdCA9IGdfc3Ryc3RyaXAgKGxvY2F0aW9uKTsKKworICAgICAgaWYgKHQpCisgICAgICAgIGdzdF9wdWxzZXNpbmtfY2hhbmdlX3RpdGxlIChwdWxzZXNpbmssIHQpOworCisgICAgICBnX2ZyZWUgKHRpdGxlKTsKKyAgICAgIGdfZnJlZSAoYXJ0aXN0KTsKKyAgICAgIGdfZnJlZSAobG9jYXRpb24pOworICAgICAgZ19mcmVlIChkZXNjcmlwdGlvbik7CisgICAgICBnX2ZyZWUgKGJ1Zik7CisKKyAgICAgIGdzdF9wdWxzZXNpbmtfY2hhbmdlX3Byb3BzIChwdWxzZXNpbmssIGwpOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfR0FQOnsKKyAgICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIGR1cmF0aW9uOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfZ2FwIChldmVudCwgJnRpbWVzdGFtcCwgJmR1cmF0aW9uKTsKKyAgICAgIGlmIChkdXJhdGlvbiA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgICAgICBnc3RfcHVsc2VzaW5rX2ZsdXNoX3JpbmdidWZmZXIgKHB1bHNlc2luayk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRU9TOgorICAgICAgZ3N0X3B1bHNlc2lua19mbHVzaF9yaW5nYnVmZmVyIChwdWxzZXNpbmspOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIDsKKyAgfQorCisgIHJldHVybiBHU1RfQkFTRV9TSU5LX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5ldmVudCAoc2luaywgZXZlbnQpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wdWxzZXNpbmtfcXVlcnkgKEdzdEJhc2VTaW5rICogc2luaywgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0UHVsc2VTaW5rICpwdWxzZXNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKHNpbmspOworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKmNhcHMsICpmaWx0ZXI7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9jYXBzIChxdWVyeSwgJmZpbHRlcik7CisgICAgICBjYXBzID0gZ3N0X3B1bHNlc2lua19xdWVyeV9nZXRjYXBzIChwdWxzZXNpbmssIGZpbHRlcik7CisKKyAgICAgIGlmIChjYXBzKSB7CisgICAgICAgIGdzdF9xdWVyeV9zZXRfY2Fwc19yZXN1bHQgKHF1ZXJ5LCBjYXBzKTsKKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgICAgICByZXQgPSBUUlVFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX0FDQ0VQVF9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9hY2NlcHRfY2FwcyAocXVlcnksICZjYXBzKTsKKyAgICAgIHJldCA9IGdzdF9wdWxzZXNpbmtfcXVlcnlfYWNjZXB0Y2FwcyAocHVsc2VzaW5rLCBjYXBzKTsKKyAgICAgIGdzdF9xdWVyeV9zZXRfYWNjZXB0X2NhcHNfcmVzdWx0IChxdWVyeSwgcmV0KTsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IEdTVF9CQVNFX1NJTktfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnF1ZXJ5IChzaW5rLCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc2lua19yZWxlYXNlX21haW5sb29wIChHc3RQdWxzZVNpbmsgKiBwc2luaykKK3sKKyAgaWYgKCFtYWlubG9vcCkKKyAgICByZXR1cm47CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAobWFpbmxvb3ApOworICB3aGlsZSAocHNpbmstPmRlZmVyX3BlbmRpbmcpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgIndhaXRpbmcgZm9yIHN0cmVhbSBzdGF0dXMgbWVzc2FnZSBlbWlzc2lvbiIpOworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQgKG1haW5sb29wKTsKKyAgfQorICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKworICBnX211dGV4X2xvY2sgKCZwYV9zaGFyZWRfcmVzb3VyY2VfbXV0ZXgpOworICBtYWlubG9vcF9yZWZfY3QtLTsKKyAgaWYgKCFtYWlubG9vcF9yZWZfY3QpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHBzaW5rLCAidGVybWluYXRpbmcgcGEgbWFpbiBsb29wIHRocmVhZCIpOworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3N0b3AgKG1haW5sb29wKTsKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9mcmVlIChtYWlubG9vcCk7CisgICAgbWFpbmxvb3AgPSBOVUxMOworICB9CisgIGdfbXV0ZXhfdW5sb2NrICgmcGFfc2hhcmVkX3Jlc291cmNlX211dGV4KTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcHVsc2VzaW5rX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFB1bHNlU2luayAqcHVsc2VzaW5rID0gR1NUX1BVTFNFU0lOSyAoZWxlbWVudCk7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnBhX3NoYXJlZF9yZXNvdXJjZV9tdXRleCk7CisgICAgICBpZiAoIW1haW5sb29wX3JlZl9jdCkgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKGVsZW1lbnQsICJuZXcgcGEgbWFpbiBsb29wIHRocmVhZCIpOworICAgICAgICBpZiAoIShtYWlubG9vcCA9IHBhX3RocmVhZGVkX21haW5sb29wX25ldyAoKSkpCisgICAgICAgICAgZ290byBtYWlubG9vcF9mYWlsZWQ7CisgICAgICAgIGlmIChwYV90aHJlYWRlZF9tYWlubG9vcF9zdGFydCAobWFpbmxvb3ApIDwgMCkgeworICAgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX2ZyZWUgKG1haW5sb29wKTsKKyAgICAgICAgICBnb3RvIG1haW5sb29wX3N0YXJ0X2ZhaWxlZDsKKyAgICAgICAgfQorICAgICAgICBtYWlubG9vcF9yZWZfY3QgPSAxOworICAgICAgICBnX211dGV4X3VubG9jayAoJnBhX3NoYXJlZF9yZXNvdXJjZV9tdXRleCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKGVsZW1lbnQsICJyZXVzaW5nIHBhIG1haW4gbG9vcCB0aHJlYWQiKTsKKyAgICAgICAgbWFpbmxvb3BfcmVmX2N0Kys7CisgICAgICAgIGdfbXV0ZXhfdW5sb2NrICgmcGFfc2hhcmVkX3Jlc291cmNlX211dGV4KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKGVsZW1lbnQsCisgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2Nsb2NrX3Byb3ZpZGUgKEdTVF9PQkpFQ1RfQ0FTVCAoZWxlbWVudCksCisgICAgICAgICAgICAgIEdTVF9BVURJT19CQVNFX1NJTksgKHB1bHNlc2luayktPnByb3ZpZGVkX2Nsb2NrLCBUUlVFKSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkKKyAgICBnb3RvIHN0YXRlX2ZhaWx1cmU7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIC8qIGZvcm1hdF9sb3N0IGlzIHJlc2V0IGluIHJlbGVhc2UoKSBpbiBhdWRpb2Jhc2VzaW5rICovCisgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKGVsZW1lbnQsCisgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2Nsb2NrX2xvc3QgKEdTVF9PQkpFQ1RfQ0FTVCAoZWxlbWVudCksCisgICAgICAgICAgICAgIEdTVF9BVURJT19CQVNFX1NJTksgKHB1bHNlc2luayktPnByb3ZpZGVkX2Nsb2NrKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGdzdF9wdWxzZXNpbmtfcmVsZWFzZV9tYWlubG9vcCAocHVsc2VzaW5rKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCittYWlubG9vcF9mYWlsZWQ6CisgIHsKKyAgICBnX211dGV4X3VubG9jayAoJnBhX3NoYXJlZF9yZXNvdXJjZV9tdXRleCk7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHB1bHNlc2luaywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV90aHJlYWRlZF9tYWlubG9vcF9uZXcoKSBmYWlsZWQiKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICB9CittYWlubG9vcF9zdGFydF9mYWlsZWQ6CisgIHsKKyAgICBnX211dGV4X3VubG9jayAoJnBhX3NoYXJlZF9yZXNvdXJjZV9tdXRleCk7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHB1bHNlc2luaywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV90aHJlYWRlZF9tYWlubG9vcF9zdGFydCgpIGZhaWxlZCIpLCAoTlVMTCkpOworICAgIHJldHVybiBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisgIH0KK3N0YXRlX2ZhaWx1cmU6CisgIHsKKyAgICBpZiAodHJhbnNpdGlvbiA9PSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFkpIHsKKyAgICAgIC8qIENsZWFyIHRoZSBQQSBtYWlubG9vcCBpZiBhdWRpb2Jhc2VzaW5rIGZhaWxlZCB0byBvcGVuIHRoZSByaW5nX2J1ZmZlciAqLworICAgICAgZ19hc3NlcnQgKG1haW5sb29wKTsKKyAgICAgIGdzdF9wdWxzZXNpbmtfcmVsZWFzZV9tYWlubG9vcCAocHVsc2VzaW5rKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L3B1bHNlL3B1bHNlc2luay5oIGIvZXh0L3B1bHNlL3B1bHNlc2luay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlM2I5MzIKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcHVsc2UvcHVsc2VzaW5rLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qLSotIE1vZGU6IEM7IGMtYmFzaWMtb2Zmc2V0OiAyIC0qLSovCisKKy8qCisgKiAgR1N0cmVhbWVyIHB1bHNlYXVkaW8gcGx1Z2luCisgKgorICogIENvcHlyaWdodCAoYykgMjAwNC0yMDA4IExlbm5hcnQgUG9ldHRlcmluZworICoKKyAqICBnc3QtcHVsc2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUKKyAqICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBnc3QtcHVsc2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIGdzdC1wdWxzZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxCisgKiAgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUFVMU0VTSU5LX0hfXworI2RlZmluZSBfX0dTVF9QVUxTRVNJTktfSF9fCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9zaW5rLmg+CisKKyNpbmNsdWRlIDxwdWxzZS9wdWxzZWF1ZGlvLmg+CisjaW5jbHVkZSA8cHVsc2UvdGhyZWFkLW1haW5sb29wLmg+CisKKyNpbmNsdWRlICJwdWxzZXV0aWwuaCIKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1BVTFNFU0lOSyBcCisgIChnc3RfcHVsc2VzaW5rX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9QVUxTRVNJTksob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9QVUxTRVNJTkssR3N0UHVsc2VTaW5rKSkKKyNkZWZpbmUgR1NUX1BVTFNFU0lOS19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9QVUxTRVNJTkssR3N0UHVsc2VTaW5rQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUFVMU0VTSU5LKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUFVMU0VTSU5LKSkKKyNkZWZpbmUgR1NUX0lTX1BVTFNFU0lOS19DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUFVMU0VTSU5LKSkKKyNkZWZpbmUgR1NUX1BVTFNFU0lOS19DQVNUKG9iaikgXAorICAoKEdzdFB1bHNlU2luayAqKShvYmopKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UHVsc2VTaW5rIEdzdFB1bHNlU2luazsKK3R5cGVkZWYgc3RydWN0IF9Hc3RQdWxzZVNpbmtDbGFzcyBHc3RQdWxzZVNpbmtDbGFzczsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFB1bHNlRGV2aWNlSW5mbyB7CisgIGdjaGFyICpkZXNjcmlwdGlvbjsKKyAgR0xpc3QgKmZvcm1hdHM7Cit9IEdzdFB1bHNlRGV2aWNlSW5mbzsKKworc3RydWN0IF9Hc3RQdWxzZVNpbmsKK3sKKyAgR3N0QXVkaW9CYXNlU2luayBzaW5rOworCisgIGdjaGFyICpzZXJ2ZXIsICpkZXZpY2UsICpzdHJlYW1fbmFtZSwgKmNsaWVudF9uYW1lOworICBHc3RQdWxzZURldmljZUluZm8gZGV2aWNlX2luZm87CisKKyAgZ2RvdWJsZSB2b2x1bWU7CisgIGdib29sZWFuIHZvbHVtZV9zZXQ6MTsKKyAgZ2Jvb2xlYW4gbXV0ZToxOworICBnYm9vbGVhbiBtdXRlX3NldDoxOworICBndWludDMyIGN1cnJlbnRfc2lua19pZHg7CisgIGdjaGFyICpjdXJyZW50X3NpbmtfbmFtZTsKKworICBndWludCBkZWZlcl9wZW5kaW5nOworCisgIGdpbnQgbm90aWZ5OyAvKiBhdG9taWMgKi8KKworICBjb25zdCBnY2hhciAqcGFfdmVyc2lvbjsKKworICBHc3RTdHJ1Y3R1cmUgKnByb3BlcnRpZXM7CisgIHBhX3Byb3BsaXN0ICpwcm9wbGlzdDsKKworICB2b2xhdGlsZSBnaW50IGZvcm1hdF9sb3N0OworICBHc3RDbG9ja1RpbWUgZm9ybWF0X2xvc3RfdGltZTsKK307CisKK3N0cnVjdCBfR3N0UHVsc2VTaW5rQ2xhc3MKK3sKKyAgR3N0QXVkaW9CYXNlU2lua0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9wdWxzZXNpbmtfZ2V0X3R5cGUgKHZvaWQpOworCisjZGVmaW5lIFBVTFNFX1NJTktfVEVNUExBVEVfQ0FQUyBcCisgIF9QVUxTRV9DQVBTX1BDTSBcCisgIF9QVUxTRV9DQVBTX0FDMyBcCisgIF9QVUxTRV9DQVBTX0VBQzMgXAorICBfUFVMU0VfQ0FQU19EVFMgXAorICBfUFVMU0VfQ0FQU19NUDMgXAorICBfUFVMU0VfQ0FQU19BQUMKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1BVTFNFU0lOS19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC9wdWxzZS9wdWxzZXNyYy5jIGIvZXh0L3B1bHNlL3B1bHNlc3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FmNzRlZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9wdWxzZS9wdWxzZXNyYy5jCkBAIC0wLDAgKzEsMTg4NCBAQAorLyoKKyAqICBHU3RyZWFtZXIgcHVsc2VhdWRpbyBwbHVnaW4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA0LTIwMDggTGVubmFydCBQb2V0dGVyaW5nCisgKgorICogIGdzdC1wdWxzZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICogIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIGdzdC1wdWxzZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggZ3N0LXB1bHNlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEKKyAqICBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcHVsc2VzcmMKKyAqIEBzZWVfYWxzbzogcHVsc2VzaW5rCisgKgorICogVGhpcyBlbGVtZW50IGNhcHR1cmVzIGF1ZGlvIGZyb20gYQorICogPHVsaW5rIGhyZWY9Imh0dHA6Ly93d3cucHVsc2VhdWRpby5vcmciPlB1bHNlQXVkaW8gc291bmQgc2VydmVyPC91bGluaz4uCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBwdWxzZXNyYyAhIGF1ZGlvY29udmVydCAhIHZvcmJpc2VuYyAhIG9nZ211eCAhIGZpbGVzaW5rIGxvY2F0aW9uPWFsc2FzcmMub2dnCisgKiBdfCBSZWNvcmQgZnJvbSBhIHNvdW5kIGNhcmQgdXNpbmcgcHVsc2VhdWRpbyBhbmQgZW5jb2RlIHRvIE9nZy9Wb3JiaXMuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNlc3JjLmg+CisjaW5jbHVkZSA8Z3N0L2dzdHRhZ2xpc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgInB1bHNlc3JjLmgiCisjaW5jbHVkZSAicHVsc2V1dGlsLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKHB1bHNlX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHB1bHNlX2RlYnVnCisKKyNkZWZpbmUgREVGQVVMVF9TRVJWRVIgICAgICAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfREVWSUNFICAgICAgICAgICAgTlVMTAorI2RlZmluZSBERUZBVUxUX0NVUlJFTlRfREVWSUNFICAgIE5VTEwKKyNkZWZpbmUgREVGQVVMVF9ERVZJQ0VfTkFNRSAgICAgICBOVUxMCisKKyNkZWZpbmUgREVGQVVMVF9WT0xVTUUgICAgICAgICAgMS4wCisjZGVmaW5lIERFRkFVTFRfTVVURSAgICAgICAgICAgIEZBTFNFCisjZGVmaW5lIE1BWF9WT0xVTUUgICAgICAgICAgICAgIDEwLjAKKworLyogU2VlIHRoZSBwdWxzZXNpbmsgY29kZSBmb3Igbm90ZXMgb24gaG93IHdlIGludGVyYWN0IHdpdGggdGhlIFBBIG1haW5sb29wCisgKiB0aHJlYWQuICovCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX1NFUlZFUiwKKyAgUFJPUF9ERVZJQ0UsCisgIFBST1BfREVWSUNFX05BTUUsCisgIFBST1BfQ1VSUkVOVF9ERVZJQ0UsCisgIFBST1BfQ0xJRU5UX05BTUUsCisgIFBST1BfU1RSRUFNX1BST1BFUlRJRVMsCisgIFBST1BfU09VUkNFX09VVFBVVF9JTkRFWCwKKyAgUFJPUF9WT0xVTUUsCisgIFBST1BfTVVURSwKKyAgUFJPUF9MQVNUCit9OworCitzdGF0aWMgdm9pZCBnc3RfcHVsc2VzcmNfZGVzdHJveV9zdHJlYW0gKEdzdFB1bHNlU3JjICogcHVsc2VzcmMpOworc3RhdGljIHZvaWQgZ3N0X3B1bHNlc3JjX2Rlc3Ryb3lfY29udGV4dCAoR3N0UHVsc2VTcmMgKiBwdWxzZXNyYyk7CisKK3N0YXRpYyB2b2lkIGdzdF9wdWxzZXNyY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcHVsc2VzcmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3B1bHNlc3JjX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9wdWxzZXNyY19zZXRfY29ya2VkIChHc3RQdWxzZVNyYyAqIHBzcmMsIGdib29sZWFuIGNvcmtlZCwKKyAgICBnYm9vbGVhbiB3YWl0KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcHVsc2VzcmNfb3BlbiAoR3N0QXVkaW9TcmMgKiBhc3JjKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9wdWxzZXNyY19jbG9zZSAoR3N0QXVkaW9TcmMgKiBhc3JjKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9wdWxzZXNyY19wcmVwYXJlIChHc3RBdWRpb1NyYyAqIGFzcmMsCisgICAgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3B1bHNlc3JjX3VucHJlcGFyZSAoR3N0QXVkaW9TcmMgKiBhc3JjKTsKKworc3RhdGljIGd1aW50IGdzdF9wdWxzZXNyY19yZWFkIChHc3RBdWRpb1NyYyAqIGFzcmMsIGdwb2ludGVyIGRhdGEsCisgICAgZ3VpbnQgbGVuZ3RoLCBHc3RDbG9ja1RpbWUgKiB0aW1lc3RhbXApOworc3RhdGljIGd1aW50IGdzdF9wdWxzZXNyY19kZWxheSAoR3N0QXVkaW9TcmMgKiBhc3JjKTsKKworc3RhdGljIHZvaWQgZ3N0X3B1bHNlc3JjX3Jlc2V0IChHc3RBdWRpb1NyYyAqIHNyYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcHVsc2VzcmNfbmVnb3RpYXRlIChHc3RCYXNlU3JjICogYmFzZXNyYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3B1bHNlc3JjX2V2ZW50IChHc3RCYXNlU3JjICogYmFzZXNyYywgR3N0RXZlbnQgKiBldmVudCk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcHVsc2VzcmNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIEdzdENsb2NrVGltZSBnc3RfcHVsc2VzcmNfZ2V0X3RpbWUgKEdzdENsb2NrICogY2xvY2ssIEdzdFB1bHNlU3JjICogc3JjKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHBhZF90ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKF9QVUxTRV9DQVBTX1BDTSkKKyAgICApOworCisjZGVmaW5lIGdzdF9wdWxzZXNyY19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoR3N0UHVsc2VTcmMsIGdzdF9wdWxzZXNyYywgR1NUX1RZUEVfQVVESU9fU1JDLAorICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfU1RSRUFNX1ZPTFVNRSwgTlVMTCkpOworCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc3JjX2NsYXNzX2luaXQgKEdzdFB1bHNlU3JjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0QXVkaW9TcmNDbGFzcyAqZ3N0YXVkaW9zcmNfY2xhc3MgPSBHU1RfQVVESU9fU1JDX0NMQVNTIChrbGFzcyk7CisgIEdzdEJhc2VTcmNDbGFzcyAqZ3N0YmFzZXNyY19jbGFzcyA9IEdTVF9CQVNFX1NSQ19DTEFTUyAoa2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBnY2hhciAqY2xpZW50bmFtZTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9wdWxzZXNyY19maW5hbGl6ZTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3B1bHNlc3JjX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3B1bHNlc3JjX2dldF9wcm9wZXJ0eTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wdWxzZXNyY19jaGFuZ2Vfc3RhdGUpOworCisgIGdzdGJhc2VzcmNfY2xhc3MtPmV2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wdWxzZXNyY19ldmVudCk7CisgIGdzdGJhc2VzcmNfY2xhc3MtPm5lZ290aWF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VzcmNfbmVnb3RpYXRlKTsKKworICBnc3RhdWRpb3NyY19jbGFzcy0+b3BlbiA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VzcmNfb3Blbik7CisgIGdzdGF1ZGlvc3JjX2NsYXNzLT5jbG9zZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VzcmNfY2xvc2UpOworICBnc3RhdWRpb3NyY19jbGFzcy0+cHJlcGFyZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VzcmNfcHJlcGFyZSk7CisgIGdzdGF1ZGlvc3JjX2NsYXNzLT51bnByZXBhcmUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3B1bHNlc3JjX3VucHJlcGFyZSk7CisgIGdzdGF1ZGlvc3JjX2NsYXNzLT5yZWFkID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wdWxzZXNyY19yZWFkKTsKKyAgZ3N0YXVkaW9zcmNfY2xhc3MtPmRlbGF5ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wdWxzZXNyY19kZWxheSk7CisgIGdzdGF1ZGlvc3JjX2NsYXNzLT5yZXNldCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VzcmNfcmVzZXQpOworCisgIC8qIE92ZXJ3cml0ZSBHT2JqZWN0IGZpZWxkcyAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9TRVJWRVIsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgic2VydmVyIiwgIlNlcnZlciIsCisgICAgICAgICAgIlRoZSBQdWxzZUF1ZGlvIHNlcnZlciB0byBjb25uZWN0IHRvIiwgREVGQVVMVF9TRVJWRVIsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ERVZJQ0UsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZGV2aWNlIiwgIkRldmljZSIsCisgICAgICAgICAgIlRoZSBQdWxzZUF1ZGlvIHNvdXJjZSBkZXZpY2UgdG8gY29ubmVjdCB0byIsIERFRkFVTFRfREVWSUNFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ1VSUkVOVF9ERVZJQ0UsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiY3VycmVudC1kZXZpY2UiLCAiQ3VycmVudCBEZXZpY2UiLAorICAgICAgICAgICJUaGUgY3VycmVudCBQdWxzZUF1ZGlvIHNvdXJjZSBkZXZpY2UiLCBERUZBVUxUX0NVUlJFTlRfREVWSUNFLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfREVWSUNFX05BTUUsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZGV2aWNlLW5hbWUiLCAiRGV2aWNlIG5hbWUiLAorICAgICAgICAgICJIdW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBzb3VuZCBkZXZpY2UiLCBERUZBVUxUX0RFVklDRV9OQU1FLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgY2xpZW50bmFtZSA9IGdzdF9wdWxzZV9jbGllbnRfbmFtZSAoKTsKKyAgLyoqCisgICAqIEdzdFB1bHNlU3JjOmNsaWVudC1uYW1lCisgICAqCisgICAqIFRoZSBQdWxzZUF1ZGlvIGNsaWVudCBuYW1lIHRvIHVzZS4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX0NMSUVOVF9OQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImNsaWVudC1uYW1lIiwgIkNsaWVudCBOYW1lIiwKKyAgICAgICAgICAiVGhlIFB1bHNlQXVkaW8gY2xpZW50X25hbWVfdG9fdXNlIiwgY2xpZW50bmFtZSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfAorICAgICAgICAgIEdTVF9QQVJBTV9NVVRBQkxFX1JFQURZKSk7CisgIGdfZnJlZSAoY2xpZW50bmFtZSk7CisKKyAgLyoqCisgICAqIEdzdFB1bHNlU3JjOnN0cmVhbS1wcm9wZXJ0aWVzOgorICAgKgorICAgKiBMaXN0IG9mIHB1bHNlYXVkaW8gc3RyZWFtIHByb3BlcnRpZXMuIEEgbGlzdCBvZiBkZWZpbmVkIHByb3BlcnRpZXMgY2FuIGJlCisgICAqIGZvdW5kIGluIHRoZSA8dWxpbmsgaHJlZj0iaHR0cDovLzBwb2ludGVyLmRlL2xlbm5hcnQvcHJvamVjdHMvcHVsc2VhdWRpby9kb3h5Z2VuL3Byb3BsaXN0XzhoLmh0bWwiPnB1bHNlYXVkaW8gYXBpIGRvY3M8L3VsaW5rPi4KKyAgICoKKyAgICogQmVsb3cgaXMgYW4gZXhhbXBsZSBmb3IgcmVnaXN0ZXJpbmcgYXMgYSBtdXNpYyBhcHBsaWNhdGlvbiB0byBwdWxzZWF1ZGlvLgorICAgKiB8WworICAgKiBHc3RTdHJ1Y3R1cmUgKnByb3BzOworICAgKgorICAgKiBwcm9wcyA9IGdzdF9zdHJ1Y3R1cmVfZnJvbV9zdHJpbmcgKCJwcm9wcyxtZWRpYS5yb2xlPW11c2ljIiwgTlVMTCk7CisgICAqIGdfb2JqZWN0X3NldCAocHVsc2UsICJzdHJlYW0tcHJvcGVydGllcyIsIHByb3BzLCBOVUxMKTsKKyAgICogZ3N0X3N0cnVjdHVyZV9mcmVlIChwcm9wcyk7CisgICAqIF18CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9TVFJFQU1fUFJPUEVSVElFUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoInN0cmVhbS1wcm9wZXJ0aWVzIiwgInN0cmVhbSBwcm9wZXJ0aWVzIiwKKyAgICAgICAgICAibGlzdCBvZiBwdWxzZWF1ZGlvIHN0cmVhbSBwcm9wZXJ0aWVzIiwKKyAgICAgICAgICBHU1RfVFlQRV9TVFJVQ1RVUkUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0UHVsc2VTcmM6c291cmNlLW91dHB1dC1pbmRleDoKKyAgICoKKyAgICogVGhlIGluZGV4IG9mIHRoZSBQdWxzZUF1ZGlvIHNvdXJjZSBvdXRwdXQgY29ycmVzcG9uZGluZyB0byB0aGlzIGVsZW1lbnQuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9TT1VSQ0VfT1VUUFVUX0lOREVYLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJzb3VyY2Utb3V0cHV0LWluZGV4IiwgInNvdXJjZSBvdXRwdXQgaW5kZXgiLAorICAgICAgICAgICJUaGUgaW5kZXggb2YgdGhlIFB1bHNlQXVkaW8gc291cmNlIG91dHB1dCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgIgorICAgICAgICAgICJyZWNvcmQgc3RyZWFtIiwgMCwgR19NQVhVSU5ULCBQQV9JTlZBTElEX0lOREVYLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJQdWxzZUF1ZGlvIEF1ZGlvIFNvdXJjZSIsCisgICAgICAiU291cmNlL0F1ZGlvIiwKKyAgICAgICJDYXB0dXJlcyBhdWRpbyBmcm9tIGEgUHVsc2VBdWRpbyBzZXJ2ZXIiLCAiTGVubmFydCBQb2V0dGVyaW5nIik7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmcGFkX3RlbXBsYXRlKTsKKworICAvKioKKyAgICogR3N0UHVsc2VTcmM6dm9sdW1lOgorICAgKgorICAgKiBUaGUgdm9sdW1lIG9mIHRoZSByZWNvcmQgc3RyZWFtLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfVk9MVU1FLCBnX3BhcmFtX3NwZWNfZG91YmxlICgidm9sdW1lIiwgIlZvbHVtZSIsCisgICAgICAgICAgIkxpbmVhciB2b2x1bWUgb2YgdGhpcyBzdHJlYW0sIDEuMD0xMDAlIiwKKyAgICAgICAgICAwLjAsIE1BWF9WT0xVTUUsIERFRkFVTFRfVk9MVU1FLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RQdWxzZVNyYzptdXRlOgorICAgKgorICAgKiBXaGV0aGVyIHRoZSBzdHJlYW0gaXMgbXV0ZWQgb3Igbm90LgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfTVVURSwgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJtdXRlIiwgIk11dGUiLAorICAgICAgICAgICJNdXRlIHN0YXRlIG9mIHRoaXMgc3RyZWFtIiwKKyAgICAgICAgICBERUZBVUxUX01VVEUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc3JjX2luaXQgKEdzdFB1bHNlU3JjICogcHVsc2VzcmMpCit7CisgIHB1bHNlc3JjLT5zZXJ2ZXIgPSBOVUxMOworICBwdWxzZXNyYy0+ZGV2aWNlID0gTlVMTDsKKyAgcHVsc2VzcmMtPmNsaWVudF9uYW1lID0gZ3N0X3B1bHNlX2NsaWVudF9uYW1lICgpOworICBwdWxzZXNyYy0+ZGV2aWNlX2Rlc2NyaXB0aW9uID0gTlVMTDsKKworICBwdWxzZXNyYy0+Y29udGV4dCA9IE5VTEw7CisgIHB1bHNlc3JjLT5zdHJlYW0gPSBOVUxMOworICBwdWxzZXNyYy0+c3RyZWFtX2Nvbm5lY3RlZCA9IEZBTFNFOworICBwdWxzZXNyYy0+c291cmNlX291dHB1dF9pZHggPSBQQV9JTlZBTElEX0lOREVYOworCisgIHB1bHNlc3JjLT5yZWFkX2J1ZmZlciA9IE5VTEw7CisgIHB1bHNlc3JjLT5yZWFkX2J1ZmZlcl9sZW5ndGggPSAwOworCisgIHBhX3NhbXBsZV9zcGVjX2luaXQgKCZwdWxzZXNyYy0+c2FtcGxlX3NwZWMpOworCisgIHB1bHNlc3JjLT5vcGVyYXRpb25fc3VjY2VzcyA9IEZBTFNFOworICBwdWxzZXNyYy0+cGF1c2VkID0gVFJVRTsKKyAgcHVsc2VzcmMtPmluX3JlYWQgPSBGQUxTRTsKKworICBwdWxzZXNyYy0+dm9sdW1lID0gREVGQVVMVF9WT0xVTUU7CisgIHB1bHNlc3JjLT52b2x1bWVfc2V0ID0gRkFMU0U7CisKKyAgcHVsc2VzcmMtPm11dGUgPSBERUZBVUxUX01VVEU7CisgIHB1bHNlc3JjLT5tdXRlX3NldCA9IEZBTFNFOworCisgIHB1bHNlc3JjLT5ub3RpZnkgPSAwOworCisgIHB1bHNlc3JjLT5wcm9wZXJ0aWVzID0gTlVMTDsKKyAgcHVsc2VzcmMtPnByb3BsaXN0ID0gTlVMTDsKKworICAvKiB0aGlzIHNob3VsZCBiZSB0aGUgZGVmYXVsdCBidXQgaXQgaXNuJ3QgeWV0ICovCisgIGdzdF9hdWRpb19iYXNlX3NyY19zZXRfc2xhdmVfbWV0aG9kIChHU1RfQVVESU9fQkFTRV9TUkMgKHB1bHNlc3JjKSwKKyAgICAgIEdTVF9BVURJT19CQVNFX1NSQ19TTEFWRV9TS0VXKTsKKworICAvKiBvdmVycmlkZSB3aXRoIGEgY3VzdG9tIGNsb2NrICovCisgIGlmIChHU1RfQVVESU9fQkFTRV9TUkMgKHB1bHNlc3JjKS0+Y2xvY2spCisgICAgZ3N0X29iamVjdF91bnJlZiAoR1NUX0FVRElPX0JBU0VfU1JDIChwdWxzZXNyYyktPmNsb2NrKTsKKworICBHU1RfQVVESU9fQkFTRV9TUkMgKHB1bHNlc3JjKS0+Y2xvY2sgPQorICAgICAgZ3N0X2F1ZGlvX2Nsb2NrX25ldyAoIkdzdFB1bHNlU3JjQ2xvY2siLAorICAgICAgKEdzdEF1ZGlvQ2xvY2tHZXRUaW1lRnVuYykgZ3N0X3B1bHNlc3JjX2dldF90aW1lLCBwdWxzZXNyYywgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VzcmNfZGVzdHJveV9zdHJlYW0gKEdzdFB1bHNlU3JjICogcHVsc2VzcmMpCit7CisgIGlmIChwdWxzZXNyYy0+c3RyZWFtKSB7CisgICAgcGFfc3RyZWFtX2Rpc2Nvbm5lY3QgKHB1bHNlc3JjLT5zdHJlYW0pOworICAgIHBhX3N0cmVhbV91bnJlZiAocHVsc2VzcmMtPnN0cmVhbSk7CisgICAgcHVsc2VzcmMtPnN0cmVhbSA9IE5VTEw7CisgICAgcHVsc2VzcmMtPnN0cmVhbV9jb25uZWN0ZWQgPSBGQUxTRTsKKyAgICBwdWxzZXNyYy0+c291cmNlX291dHB1dF9pZHggPSBQQV9JTlZBTElEX0lOREVYOworICAgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKHB1bHNlc3JjKSwgInNvdXJjZS1vdXRwdXQtaW5kZXgiKTsKKyAgfQorCisgIGdfZnJlZSAocHVsc2VzcmMtPmRldmljZV9kZXNjcmlwdGlvbik7CisgIHB1bHNlc3JjLT5kZXZpY2VfZGVzY3JpcHRpb24gPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc3JjX2Rlc3Ryb3lfY29udGV4dCAoR3N0UHVsc2VTcmMgKiBwdWxzZXNyYykKK3sKKworICBnc3RfcHVsc2VzcmNfZGVzdHJveV9zdHJlYW0gKHB1bHNlc3JjKTsKKworICBpZiAocHVsc2VzcmMtPmNvbnRleHQpIHsKKyAgICBwYV9jb250ZXh0X2Rpc2Nvbm5lY3QgKHB1bHNlc3JjLT5jb250ZXh0KTsKKworICAgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYW55IGZ1cnRoZXIgY2FsbGJhY2tzICovCisgICAgcGFfY29udGV4dF9zZXRfc3RhdGVfY2FsbGJhY2sgKHB1bHNlc3JjLT5jb250ZXh0LCBOVUxMLCBOVUxMKTsKKyAgICBwYV9jb250ZXh0X3NldF9zdWJzY3JpYmVfY2FsbGJhY2sgKHB1bHNlc3JjLT5jb250ZXh0LCBOVUxMLCBOVUxMKTsKKworICAgIHBhX2NvbnRleHRfdW5yZWYgKHB1bHNlc3JjLT5jb250ZXh0KTsKKworICAgIHB1bHNlc3JjLT5jb250ZXh0ID0gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc3JjX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RQdWxzZVNyYyAqcHVsc2VzcmMgPSBHU1RfUFVMU0VTUkNfQ0FTVCAob2JqZWN0KTsKKworICBnX2ZyZWUgKHB1bHNlc3JjLT5zZXJ2ZXIpOworICBnX2ZyZWUgKHB1bHNlc3JjLT5kZXZpY2UpOworICBnX2ZyZWUgKHB1bHNlc3JjLT5jbGllbnRfbmFtZSk7CisgIGdfZnJlZSAocHVsc2VzcmMtPmN1cnJlbnRfc291cmNlX25hbWUpOworCisgIGlmIChwdWxzZXNyYy0+cHJvcGVydGllcykKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHB1bHNlc3JjLT5wcm9wZXJ0aWVzKTsKKyAgaWYgKHB1bHNlc3JjLT5wcm9wbGlzdCkKKyAgICBwYV9wcm9wbGlzdF9mcmVlIChwdWxzZXNyYy0+cHJvcGxpc3QpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworI2RlZmluZSBDT05URVhUX09LKGMpICgoYykgJiYgUEFfQ09OVEVYVF9JU19HT09EIChwYV9jb250ZXh0X2dldF9zdGF0ZSAoKGMpKSkpCisjZGVmaW5lIFNUUkVBTV9PSyhzKSAoKHMpICYmIFBBX1NUUkVBTV9JU19HT09EIChwYV9zdHJlYW1fZ2V0X3N0YXRlICgocykpKSkKKworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VzcmNfaXNfZGVhZCAoR3N0UHVsc2VTcmMgKiBwdWxzZXNyYywgZ2Jvb2xlYW4gY2hlY2tfc3RyZWFtKQoreworICBpZiAoIXB1bHNlc3JjLT5zdHJlYW1fY29ubmVjdGVkKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghQ09OVEVYVF9PSyAocHVsc2VzcmMtPmNvbnRleHQpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKGNoZWNrX3N0cmVhbSAmJiAhU1RSRUFNX09LIChwdWxzZXNyYy0+c3RyZWFtKSkKKyAgICBnb3RvIGVycm9yOworCisgIHJldHVybiBGQUxTRTsKKworZXJyb3I6CisgIHsKKyAgICBjb25zdCBnY2hhciAqZXJyX3N0ciA9IHB1bHNlc3JjLT5jb250ZXh0ID8KKyAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHB1bHNlc3JjLT5jb250ZXh0KSkgOiBOVUxMOworICAgIEdTVF9FTEVNRU5UX0VSUk9SICgocHVsc2VzcmMpLCBSRVNPVVJDRSwgRkFJTEVELCAoIkRpc2Nvbm5lY3RlZDogJXMiLAorICAgICAgICAgICAgZXJyX3N0ciksIChOVUxMKSk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNyY19zb3VyY2VfaW5mb19jYiAocGFfY29udGV4dCAqIGMsIGNvbnN0IHBhX3NvdXJjZV9pbmZvICogaSwgaW50IGVvbCwKKyAgICB2b2lkICp1c2VyZGF0YSkKK3sKKyAgR3N0UHVsc2VTcmMgKnB1bHNlc3JjID0gR1NUX1BVTFNFU1JDX0NBU1QgKHVzZXJkYXRhKTsKKworICBpZiAoIWkpCisgICAgZ290byBkb25lOworCisgIGdfZnJlZSAocHVsc2VzcmMtPmRldmljZV9kZXNjcmlwdGlvbik7CisgIHB1bHNlc3JjLT5kZXZpY2VfZGVzY3JpcHRpb24gPSBnX3N0cmR1cCAoaS0+ZGVzY3JpcHRpb24pOworCitkb25lOgorICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwgKHB1bHNlc3JjLT5tYWlubG9vcCwgMCk7Cit9CisKK3N0YXRpYyBnY2hhciAqCitnc3RfcHVsc2VzcmNfZGV2aWNlX2Rlc2NyaXB0aW9uIChHc3RQdWxzZVNyYyAqIHB1bHNlc3JjKQoreworICBwYV9vcGVyYXRpb24gKm8gPSBOVUxMOworICBnY2hhciAqdDsKKworICBpZiAoIXB1bHNlc3JjLT5tYWlubG9vcCkKKyAgICBnb3RvIG5vX21haW5sb29wOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKHB1bHNlc3JjLT5tYWlubG9vcCk7CisKKyAgaWYgKCEobyA9IHBhX2NvbnRleHRfZ2V0X3NvdXJjZV9pbmZvX2J5X25hbWUgKHB1bHNlc3JjLT5jb250ZXh0LAorICAgICAgICAgICAgICBwdWxzZXNyYy0+ZGV2aWNlLCBnc3RfcHVsc2VzcmNfc291cmNlX2luZm9fY2IsIHB1bHNlc3JjKSkpIHsKKworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwdWxzZXNyYywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV9zdHJlYW1fZ2V0X3NvdXJjZV9pbmZvKCkgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICBwYV9zdHJlcnJvciAocGFfY29udGV4dF9lcnJubyAocHVsc2VzcmMtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byB1bmxvY2s7CisgIH0KKworICB3aGlsZSAocGFfb3BlcmF0aW9uX2dldF9zdGF0ZSAobykgPT0gUEFfT1BFUkFUSU9OX1JVTk5JTkcpIHsKKworICAgIGlmIChnc3RfcHVsc2VzcmNfaXNfZGVhZCAocHVsc2VzcmMsIEZBTFNFKSkKKyAgICAgIGdvdG8gdW5sb2NrOworCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAocHVsc2VzcmMtPm1haW5sb29wKTsKKyAgfQorCit1bmxvY2s6CisKKyAgaWYgKG8pCisgICAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKworICB0ID0gZ19zdHJkdXAgKHB1bHNlc3JjLT5kZXZpY2VfZGVzY3JpcHRpb24pOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKworICByZXR1cm4gdDsKKworbm9fbWFpbmxvb3A6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgImhhdmUgbm8gbWFpbmxvb3AiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc3JjX3NvdXJjZV9vdXRwdXRfaW5mb19jYiAocGFfY29udGV4dCAqIGMsCisgICAgY29uc3QgcGFfc291cmNlX291dHB1dF9pbmZvICogaSwgaW50IGVvbCwgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU3JjICpwc3JjOworCisgIHBzcmMgPSBHU1RfUFVMU0VTUkNfQ0FTVCAodXNlcmRhdGEpOworCisgIGlmICghaSkKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogSWYgdGhlIGluZGV4IGRvZXNuJ3QgbWF0Y2ggb3VyIGN1cnJlbnQgc3RyZWFtLAorICAgKiBpdCBpbXBsaWVzIHdlIGp1c3QgcmVjcmVhdGVkIHRoZSBzdHJlYW0gKGNhcHMgY2hhbmdlKQorICAgKi8KKyAgaWYgKGktPmluZGV4ID09IHBzcmMtPnNvdXJjZV9vdXRwdXRfaWR4KSB7CisgICAgcHNyYy0+dm9sdW1lID0gcGFfc3dfdm9sdW1lX3RvX2xpbmVhciAocGFfY3ZvbHVtZV9tYXggKCZpLT52b2x1bWUpKTsKKyAgICBwc3JjLT5tdXRlID0gaS0+bXV0ZTsKKyAgICBwc3JjLT5jdXJyZW50X3NvdXJjZV9pZHggPSBpLT5zb3VyY2U7CisKKyAgICBpZiAoR19VTkxJS0VMWSAocHNyYy0+dm9sdW1lID4gTUFYX1ZPTFVNRSkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocHNyYywgIkNsaXBwZWQgdm9sdW1lIGZyb20gJWYgdG8gJWYiLAorICAgICAgICAgIHBzcmMtPnZvbHVtZSwgTUFYX1ZPTFVNRSk7CisgICAgICBwc3JjLT52b2x1bWUgPSBNQVhfVk9MVU1FOworICAgIH0KKyAgfQorCitkb25lOgorICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwgKHBzcmMtPm1haW5sb29wLCAwKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNyY19nZXRfc291cmNlX291dHB1dF9pbmZvIChHc3RQdWxzZVNyYyAqIHB1bHNlc3JjLCBnZG91YmxlICogdm9sdW1lLAorICAgIGdib29sZWFuICogbXV0ZSkKK3sKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKworICBpZiAoIXB1bHNlc3JjLT5tYWlubG9vcCkKKyAgICBnb3RvIG5vX21haW5sb29wOworCisgIGlmIChwdWxzZXNyYy0+c291cmNlX291dHB1dF9pZHggPT0gUEFfSU5WQUxJRF9JTkRFWCkKKyAgICBnb3RvIG5vX2luZGV4OworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKHB1bHNlc3JjLT5tYWlubG9vcCk7CisKKyAgaWYgKCEobyA9IHBhX2NvbnRleHRfZ2V0X3NvdXJjZV9vdXRwdXRfaW5mbyAocHVsc2VzcmMtPmNvbnRleHQsCisgICAgICAgICAgICAgIHB1bHNlc3JjLT5zb3VyY2Vfb3V0cHV0X2lkeCwgZ3N0X3B1bHNlc3JjX3NvdXJjZV9vdXRwdXRfaW5mb19jYiwKKyAgICAgICAgICAgICAgcHVsc2VzcmMpKSkKKyAgICBnb3RvIGluZm9fZmFpbGVkOworCisgIHdoaWxlIChwYV9vcGVyYXRpb25fZ2V0X3N0YXRlIChvKSA9PSBQQV9PUEVSQVRJT05fUlVOTklORykgeworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQgKHB1bHNlc3JjLT5tYWlubG9vcCk7CisgICAgaWYgKGdzdF9wdWxzZXNyY19pc19kZWFkIChwdWxzZXNyYywgVFJVRSkpCisgICAgICBnb3RvIHVubG9jazsKKyAgfQorCit1bmxvY2s6CisKKyAgaWYgKHZvbHVtZSkKKyAgICAqdm9sdW1lID0gcHVsc2VzcmMtPnZvbHVtZTsKKyAgaWYgKG11dGUpCisgICAgKm11dGUgPSBwdWxzZXNyYy0+bXV0ZTsKKworICBpZiAobykKKyAgICBwYV9vcGVyYXRpb25fdW5yZWYgKG8pOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKworICByZXR1cm47CisKKyAgLyogRVJST1JTICovCitub19tYWlubG9vcDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHB1bHNlc3JjLCAid2UgaGF2ZSBubyBtYWlubG9vcCIpOworICAgIGlmICh2b2x1bWUpCisgICAgICAqdm9sdW1lID0gcHVsc2VzcmMtPnZvbHVtZTsKKyAgICBpZiAobXV0ZSkKKyAgICAgICptdXRlID0gcHVsc2VzcmMtPm11dGU7CisgICAgcmV0dXJuOworICB9Citub19pbmRleDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHB1bHNlc3JjLCAid2UgZG9uJ3QgaGF2ZSBhIHN0cmVhbSBpbmRleCIpOworICAgIGlmICh2b2x1bWUpCisgICAgICAqdm9sdW1lID0gcHVsc2VzcmMtPnZvbHVtZTsKKyAgICBpZiAobXV0ZSkKKyAgICAgICptdXRlID0gcHVsc2VzcmMtPm11dGU7CisgICAgcmV0dXJuOworICB9CitpbmZvX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwdWxzZXNyYywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV9jb250ZXh0X2dldF9zb3VyY2Vfb3V0cHV0X2luZm8oKSBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwdWxzZXNyYy0+Y29udGV4dCkpKSwgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc3JjX2N1cnJlbnRfc291cmNlX2luZm9fY2IgKHBhX2NvbnRleHQgKiBjLCBjb25zdCBwYV9zb3VyY2VfaW5mbyAqIGksCisgICAgaW50IGVvbCwgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU3JjICpwc3JjOworCisgIHBzcmMgPSBHU1RfUFVMU0VTUkNfQ0FTVCAodXNlcmRhdGEpOworCisgIGlmICghaSkKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogSWYgdGhlIGluZGV4IGRvZXNuJ3QgbWF0Y2ggb3VyIGN1cnJlbnQgc3RyZWFtLAorICAgKiBpdCBpbXBsaWVzIHdlIGp1c3QgcmVjcmVhdGVkIHRoZSBzdHJlYW0gKGNhcHMgY2hhbmdlKQorICAgKi8KKyAgaWYgKGktPmluZGV4ID09IHBzcmMtPmN1cnJlbnRfc291cmNlX2lkeCkgeworICAgIGdfZnJlZSAocHNyYy0+Y3VycmVudF9zb3VyY2VfbmFtZSk7CisgICAgcHNyYy0+Y3VycmVudF9zb3VyY2VfbmFtZSA9IGdfc3RyZHVwIChpLT5uYW1lKTsKKyAgfQorCitkb25lOgorICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwgKHBzcmMtPm1haW5sb29wLCAwKTsKK30KKworc3RhdGljIGdjaGFyICoKK2dzdF9wdWxzZXNyY19nZXRfY3VycmVudF9kZXZpY2UgKEdzdFB1bHNlU3JjICogcHVsc2VzcmMpCit7CisgIHBhX29wZXJhdGlvbiAqbyA9IE5VTEw7CisgIGdjaGFyICpjdXJyZW50X3NyYzsKKworICBpZiAoIXB1bHNlc3JjLT5tYWlubG9vcCkKKyAgICBnb3RvIG5vX21haW5sb29wOworCisgIGlmIChwdWxzZXNyYy0+c291cmNlX291dHB1dF9pZHggPT0gUEFfSU5WQUxJRF9JTkRFWCkKKyAgICBnb3RvIG5vX2luZGV4OworCisgIGdzdF9wdWxzZXNyY19nZXRfc291cmNlX291dHB1dF9pbmZvIChwdWxzZXNyYywgTlVMTCwgTlVMTCk7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKworCisgIGlmICghKG8gPSBwYV9jb250ZXh0X2dldF9zb3VyY2VfaW5mb19ieV9pbmRleCAocHVsc2VzcmMtPmNvbnRleHQsCisgICAgICAgICAgICAgIHB1bHNlc3JjLT5jdXJyZW50X3NvdXJjZV9pZHgsIGdzdF9wdWxzZXNyY19jdXJyZW50X3NvdXJjZV9pbmZvX2NiLAorICAgICAgICAgICAgICBwdWxzZXNyYykpKQorICAgIGdvdG8gaW5mb19mYWlsZWQ7CisKKyAgd2hpbGUgKHBhX29wZXJhdGlvbl9nZXRfc3RhdGUgKG8pID09IFBBX09QRVJBVElPTl9SVU5OSU5HKSB7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAocHVsc2VzcmMtPm1haW5sb29wKTsKKyAgICBpZiAoZ3N0X3B1bHNlc3JjX2lzX2RlYWQgKHB1bHNlc3JjLCBUUlVFKSkKKyAgICAgIGdvdG8gdW5sb2NrOworICB9CisKK3VubG9jazoKKworICBjdXJyZW50X3NyYyA9IGdfc3RyZHVwIChwdWxzZXNyYy0+Y3VycmVudF9zb3VyY2VfbmFtZSk7CisKKyAgaWYgKG8pCisgICAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKHB1bHNlc3JjLT5tYWlubG9vcCk7CisKKyAgcmV0dXJuIGN1cnJlbnRfc3JjOworCisgIC8qIEVSUk9SUyAqLworbm9fbWFpbmxvb3A6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgIndlIGhhdmUgbm8gbWFpbmxvb3AiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorbm9faW5kZXg6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgIndlIGRvbid0IGhhdmUgYSBzdHJlYW0gaW5kZXgiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQoraW5mb19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHVsc2VzcmMsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgicGFfY29udGV4dF9nZXRfc291cmNlX291dHB1dF9pbmZvKCkgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICBwYV9zdHJlcnJvciAocGFfY29udGV4dF9lcnJubyAocHVsc2VzcmMtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byB1bmxvY2s7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNyY19zZXRfc3RyZWFtX3ZvbHVtZSAoR3N0UHVsc2VTcmMgKiBwdWxzZXNyYywgZ2RvdWJsZSB2b2x1bWUpCit7CisgIHBhX2N2b2x1bWUgdjsKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKworICBpZiAoIXB1bHNlc3JjLT5tYWlubG9vcCkKKyAgICBnb3RvIG5vX21haW5sb29wOworCisgIGlmICghcHVsc2VzcmMtPnNvdXJjZV9vdXRwdXRfaWR4KQorICAgIGdvdG8gbm9faW5kZXg7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgInNldHRpbmcgdm9sdW1lIHRvICVmIiwgdm9sdW1lKTsKKworICBnc3RfcHVsc2VfY3ZvbHVtZV9mcm9tX2xpbmVhciAoJnYsIHB1bHNlc3JjLT5zYW1wbGVfc3BlYy5jaGFubmVscywgdm9sdW1lKTsKKworICBpZiAoIShvID0gcGFfY29udGV4dF9zZXRfc291cmNlX291dHB1dF92b2x1bWUgKHB1bHNlc3JjLT5jb250ZXh0LAorICAgICAgICAgICAgICBwdWxzZXNyYy0+c291cmNlX291dHB1dF9pZHgsICZ2LCBOVUxMLCBOVUxMKSkpCisgICAgZ290byB2b2x1bWVfZmFpbGVkOworCisgIC8qIFdlIGRvbid0IHJlYWxseSBjYXJlIGFib3V0IHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsICovCit1bmxvY2s6CisKKyAgaWYgKG8pCisgICAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKHB1bHNlc3JjLT5tYWlubG9vcCk7CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworbm9fbWFpbmxvb3A6CisgIHsKKyAgICBwdWxzZXNyYy0+dm9sdW1lID0gdm9sdW1lOworICAgIHB1bHNlc3JjLT52b2x1bWVfc2V0ID0gVFJVRTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgIndlIGhhdmUgbm8gbWFpbmxvb3AiKTsKKyAgICByZXR1cm47CisgIH0KK25vX2luZGV4OgorICB7CisgICAgcHVsc2VzcmMtPnZvbHVtZSA9IHZvbHVtZTsKKyAgICBwdWxzZXNyYy0+dm9sdW1lX3NldCA9IFRSVUU7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHVsc2VzcmMsICJ3ZSBkb24ndCBoYXZlIGEgc3RyZWFtIGluZGV4Iik7CisgICAgcmV0dXJuOworICB9Cit2b2x1bWVfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHB1bHNlc3JjLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoInBhX3N0cmVhbV9zZXRfc291cmNlX291dHB1dF92b2x1bWUoKSBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwdWxzZXNyYy0+Y29udGV4dCkpKSwgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc3JjX3NldF9zdHJlYW1fbXV0ZSAoR3N0UHVsc2VTcmMgKiBwdWxzZXNyYywgZ2Jvb2xlYW4gbXV0ZSkKK3sKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKworICBpZiAoIXB1bHNlc3JjLT5tYWlubG9vcCkKKyAgICBnb3RvIG5vX21haW5sb29wOworCisgIGlmICghcHVsc2VzcmMtPnNvdXJjZV9vdXRwdXRfaWR4KQorICAgIGdvdG8gbm9faW5kZXg7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgInNldHRpbmcgbXV0ZSBzdGF0ZSB0byAlZCIsIG11dGUpOworCisgIGlmICghKG8gPSBwYV9jb250ZXh0X3NldF9zb3VyY2Vfb3V0cHV0X211dGUgKHB1bHNlc3JjLT5jb250ZXh0LAorICAgICAgICAgICAgICBwdWxzZXNyYy0+c291cmNlX291dHB1dF9pZHgsIG11dGUsIE5VTEwsIE5VTEwpKSkKKyAgICBnb3RvIG11dGVfZmFpbGVkOworCisgIC8qIFdlIGRvbid0IHJlYWxseSBjYXJlIGFib3V0IHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsICovCit1bmxvY2s6CisKKyAgaWYgKG8pCisgICAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKHB1bHNlc3JjLT5tYWlubG9vcCk7CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworbm9fbWFpbmxvb3A6CisgIHsKKyAgICBwdWxzZXNyYy0+bXV0ZSA9IG11dGU7CisgICAgcHVsc2VzcmMtPm11dGVfc2V0ID0gVFJVRTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgIndlIGhhdmUgbm8gbWFpbmxvb3AiKTsKKyAgICByZXR1cm47CisgIH0KK25vX2luZGV4OgorICB7CisgICAgcHVsc2VzcmMtPm11dGUgPSBtdXRlOworICAgIHB1bHNlc3JjLT5tdXRlX3NldCA9IFRSVUU7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHVsc2VzcmMsICJ3ZSBkb24ndCBoYXZlIGEgc3RyZWFtIGluZGV4Iik7CisgICAgcmV0dXJuOworICB9CittdXRlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwdWxzZXNyYywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV9zdHJlYW1fc2V0X3NvdXJjZV9vdXRwdXRfbXV0ZSgpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHB1bHNlc3JjLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gdW5sb2NrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VzcmNfc2V0X3N0cmVhbV9kZXZpY2UgKEdzdFB1bHNlU3JjICogcHVsc2VzcmMsIGNvbnN0IGdjaGFyICogZGV2aWNlKQoreworICBwYV9vcGVyYXRpb24gKm8gPSBOVUxMOworCisgIGlmICghcHVsc2VzcmMtPm1haW5sb29wKQorICAgIGdvdG8gbm9fbWFpbmxvb3A7CisKKyAgaWYgKCFwdWxzZXNyYy0+c291cmNlX291dHB1dF9pZHgpCisgICAgZ290byBub19pbmRleDsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHB1bHNlc3JjLCAic2V0dGluZyBzdHJlYW0gZGV2aWNlIHRvICVzIiwgZGV2aWNlKTsKKworICBpZiAoIShvID0gcGFfY29udGV4dF9tb3ZlX3NvdXJjZV9vdXRwdXRfYnlfbmFtZSAocHVsc2VzcmMtPmNvbnRleHQsCisgICAgICAgICAgICAgIHB1bHNlc3JjLT5zb3VyY2Vfb3V0cHV0X2lkeCwgZGV2aWNlLCBOVUxMLCBOVUxMKSkpCisgICAgZ290byBtb3ZlX2ZhaWxlZDsKKwordW5sb2NrOgorCisgIGlmIChvKQorICAgIHBhX29wZXJhdGlvbl91bnJlZiAobyk7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworCisgIHJldHVybjsKKworICAvKiBFUlJPUlMgKi8KK25vX21haW5sb29wOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHVsc2VzcmMsICJ3ZSBoYXZlIG5vIG1haW5sb29wIik7CisgICAgcmV0dXJuOworICB9Citub19pbmRleDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHB1bHNlc3JjLCAid2UgZG9uJ3QgaGF2ZSBhIHN0cmVhbSBpbmRleCIpOworICAgIHJldHVybjsKKyAgfQorbW92ZV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHVsc2VzcmMsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgicGFfY29udGV4dF9tb3ZlX3NvdXJjZV9vdXRwdXRfYnlfbmFtZSglcykgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICBkZXZpY2UsIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwdWxzZXNyYy0+Y29udGV4dCkpKSwKKyAgICAgICAgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworCisgIEdzdFB1bHNlU3JjICpwdWxzZXNyYyA9IEdTVF9QVUxTRVNSQ19DQVNUIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TRVJWRVI6CisgICAgICBnX2ZyZWUgKHB1bHNlc3JjLT5zZXJ2ZXIpOworICAgICAgcHVsc2VzcmMtPnNlcnZlciA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RFVklDRToKKyAgICAgIGdfZnJlZSAocHVsc2VzcmMtPmRldmljZSk7CisgICAgICBwdWxzZXNyYy0+ZGV2aWNlID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBnc3RfcHVsc2VzcmNfc2V0X3N0cmVhbV9kZXZpY2UgKHB1bHNlc3JjLCBwdWxzZXNyYy0+ZGV2aWNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTElFTlRfTkFNRToKKyAgICAgIGdfZnJlZSAocHVsc2VzcmMtPmNsaWVudF9uYW1lKTsKKyAgICAgIGlmICghZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSkpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwdWxzZXNyYywKKyAgICAgICAgICAgICJFbXB0eSBQdWxzZUF1ZGlvIGNsaWVudCBuYW1lIG5vdCBhbGxvd2VkLiBSZXNldHRpbmcgdG8gZGVmYXVsdCB2YWx1ZSIpOworICAgICAgICBwdWxzZXNyYy0+Y2xpZW50X25hbWUgPSBnc3RfcHVsc2VfY2xpZW50X25hbWUgKCk7CisgICAgICB9IGVsc2UKKyAgICAgICAgcHVsc2VzcmMtPmNsaWVudF9uYW1lID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1RSRUFNX1BST1BFUlRJRVM6CisgICAgICBpZiAocHVsc2VzcmMtPnByb3BlcnRpZXMpCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocHVsc2VzcmMtPnByb3BlcnRpZXMpOworICAgICAgcHVsc2VzcmMtPnByb3BlcnRpZXMgPQorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfY29weSAoZ3N0X3ZhbHVlX2dldF9zdHJ1Y3R1cmUgKHZhbHVlKSk7CisgICAgICBpZiAocHVsc2VzcmMtPnByb3BsaXN0KQorICAgICAgICBwYV9wcm9wbGlzdF9mcmVlIChwdWxzZXNyYy0+cHJvcGxpc3QpOworICAgICAgcHVsc2VzcmMtPnByb3BsaXN0ID0gZ3N0X3B1bHNlX21ha2VfcHJvcGxpc3QgKHB1bHNlc3JjLT5wcm9wZXJ0aWVzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9WT0xVTUU6CisgICAgICBnc3RfcHVsc2VzcmNfc2V0X3N0cmVhbV92b2x1bWUgKHB1bHNlc3JjLCBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTVVURToKKyAgICAgIGdzdF9wdWxzZXNyY19zZXRfc3RyZWFtX211dGUgKHB1bHNlc3JjLCBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworCisgIEdzdFB1bHNlU3JjICpwdWxzZXNyYyA9IEdTVF9QVUxTRVNSQ19DQVNUIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TRVJWRVI6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBwdWxzZXNyYy0+c2VydmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ERVZJQ0U6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBwdWxzZXNyYy0+ZGV2aWNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DVVJSRU5UX0RFVklDRToKKyAgICB7CisgICAgICBnY2hhciAqY3VycmVudF9kZXZpY2UgPSBnc3RfcHVsc2VzcmNfZ2V0X2N1cnJlbnRfZGV2aWNlIChwdWxzZXNyYyk7CisgICAgICBpZiAoY3VycmVudF9kZXZpY2UpCisgICAgICAgIGdfdmFsdWVfdGFrZV9zdHJpbmcgKHZhbHVlLCBjdXJyZW50X2RldmljZSk7CisgICAgICBlbHNlCisgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsICIiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfREVWSUNFX05BTUU6CisgICAgICBnX3ZhbHVlX3Rha2Vfc3RyaW5nICh2YWx1ZSwgZ3N0X3B1bHNlc3JjX2RldmljZV9kZXNjcmlwdGlvbiAocHVsc2VzcmMpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTElFTlRfTkFNRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHB1bHNlc3JjLT5jbGllbnRfbmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1RSRUFNX1BST1BFUlRJRVM6CisgICAgICBnc3RfdmFsdWVfc2V0X3N0cnVjdHVyZSAodmFsdWUsIHB1bHNlc3JjLT5wcm9wZXJ0aWVzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TT1VSQ0VfT1VUUFVUX0lOREVYOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHB1bHNlc3JjLT5zb3VyY2Vfb3V0cHV0X2lkeCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVk9MVU1FOgorICAgIHsKKyAgICAgIGdkb3VibGUgdm9sdW1lOworICAgICAgZ3N0X3B1bHNlc3JjX2dldF9zb3VyY2Vfb3V0cHV0X2luZm8gKHB1bHNlc3JjLCAmdm9sdW1lLCBOVUxMKTsKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIHZvbHVtZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX01VVEU6CisgICAgeworICAgICAgZ2Jvb2xlYW4gbXV0ZTsKKyAgICAgIGdzdF9wdWxzZXNyY19nZXRfc291cmNlX291dHB1dF9pbmZvIChwdWxzZXNyYywgTlVMTCwgJm11dGUpOworICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIG11dGUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNyY19jb250ZXh0X3N0YXRlX2NiIChwYV9jb250ZXh0ICogYywgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU3JjICpwdWxzZXNyYyA9IEdTVF9QVUxTRVNSQ19DQVNUICh1c2VyZGF0YSk7CisKKyAgc3dpdGNoIChwYV9jb250ZXh0X2dldF9zdGF0ZSAoYykpIHsKKyAgICBjYXNlIFBBX0NPTlRFWFRfUkVBRFk6CisgICAgY2FzZSBQQV9DT05URVhUX1RFUk1JTkFURUQ6CisgICAgY2FzZSBQQV9DT05URVhUX0ZBSUxFRDoKKyAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbCAocHVsc2VzcmMtPm1haW5sb29wLCAwKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBQQV9DT05URVhUX1VOQ09OTkVDVEVEOgorICAgIGNhc2UgUEFfQ09OVEVYVF9DT05ORUNUSU5HOgorICAgIGNhc2UgUEFfQ09OVEVYVF9BVVRIT1JJWklORzoKKyAgICBjYXNlIFBBX0NPTlRFWFRfU0VUVElOR19OQU1FOgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNyY19zdHJlYW1fc3RhdGVfY2IgKHBhX3N0cmVhbSAqIHMsIHZvaWQgKnVzZXJkYXRhKQoreworICBHc3RQdWxzZVNyYyAqcHVsc2VzcmMgPSBHU1RfUFVMU0VTUkNfQ0FTVCAodXNlcmRhdGEpOworCisgIHN3aXRjaCAocGFfc3RyZWFtX2dldF9zdGF0ZSAocykpIHsKKworICAgIGNhc2UgUEFfU1RSRUFNX1JFQURZOgorICAgIGNhc2UgUEFfU1RSRUFNX0ZBSUxFRDoKKyAgICBjYXNlIFBBX1NUUkVBTV9URVJNSU5BVEVEOgorICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsIChwdWxzZXNyYy0+bWFpbmxvb3AsIDApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBBX1NUUkVBTV9VTkNPTk5FQ1RFRDoKKyAgICBjYXNlIFBBX1NUUkVBTV9DUkVBVElORzoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VzcmNfc3RyZWFtX3JlcXVlc3RfY2IgKHBhX3N0cmVhbSAqIHMsIHNpemVfdCBsZW5ndGgsIHZvaWQgKnVzZXJkYXRhKQoreworICBHc3RQdWxzZVNyYyAqcHVsc2VzcmMgPSBHU1RfUFVMU0VTUkNfQ0FTVCAodXNlcmRhdGEpOworCisgIEdTVF9MT0dfT0JKRUNUIChwdWxzZXNyYywgImdvdCByZXF1ZXN0IGZvciBsZW5ndGggJSIgR19HU0laRV9GT1JNQVQsIGxlbmd0aCk7CisKKyAgaWYgKHB1bHNlc3JjLT5pbl9yZWFkKSB7CisgICAgLyogb25seSBzaWduYWwgd2hlbiByZWFkaW5nICovCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsIChwdWxzZXNyYy0+bWFpbmxvb3AsIDApOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VzcmNfc3RyZWFtX2xhdGVuY3lfdXBkYXRlX2NiIChwYV9zdHJlYW0gKiBzLCB2b2lkICp1c2VyZGF0YSkKK3sKKyAgY29uc3QgcGFfdGltaW5nX2luZm8gKmluZm87CisgIHBhX3VzZWNfdCBzb3VyY2VfdXNlYzsKKworICBpbmZvID0gcGFfc3RyZWFtX2dldF90aW1pbmdfaW5mbyAocyk7CisKKyAgaWYgKCFpbmZvKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKEdTVF9QVUxTRVNSQ19DQVNUICh1c2VyZGF0YSksCisgICAgICAgICJsYXRlbmN5IHVwZGF0ZSAoaW5mb3JtYXRpb24gdW5rbm93bikiKTsKKyAgICByZXR1cm47CisgIH0KKyAgc291cmNlX3VzZWMgPSBpbmZvLT5jb25maWd1cmVkX3NvdXJjZV91c2VjOworCisgIEdTVF9MT0dfT0JKRUNUIChHU1RfUFVMU0VTUkNfQ0FTVCAodXNlcmRhdGEpLAorICAgICAgImxhdGVuY3lfdXBkYXRlLCAlIiBHX0dVSU5UNjRfRk9STUFUICIsICVkOiUiIEdfR0lOVDY0X0ZPUk1BVCAiLCAlZDolIgorICAgICAgR19HVUlOVDY0X0ZPUk1BVCAiLCAlIiBHX0dVSU5UNjRfRk9STUFUICIsICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBHU1RfVElNRVZBTF9UT19USU1FIChpbmZvLT50aW1lc3RhbXApLCBpbmZvLT53cml0ZV9pbmRleF9jb3JydXB0LAorICAgICAgaW5mby0+d3JpdGVfaW5kZXgsIGluZm8tPnJlYWRfaW5kZXhfY29ycnVwdCwgaW5mby0+cmVhZF9pbmRleCwKKyAgICAgIGluZm8tPnNvdXJjZV91c2VjLCBzb3VyY2VfdXNlYyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VzcmNfc3RyZWFtX3VuZGVyZmxvd19jYiAocGFfc3RyZWFtICogcywgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdTVF9XQVJOSU5HX09CSkVDVCAoR1NUX1BVTFNFU1JDX0NBU1QgKHVzZXJkYXRhKSwgIkdvdCB1bmRlcmZsb3ciKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNyY19zdHJlYW1fb3ZlcmZsb3dfY2IgKHBhX3N0cmVhbSAqIHMsIHZvaWQgKnVzZXJkYXRhKQoreworICBHU1RfV0FSTklOR19PQkpFQ1QgKEdTVF9QVUxTRVNSQ19DQVNUICh1c2VyZGF0YSksICJHb3Qgb3ZlcmZsb3ciKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNyY19jb250ZXh0X3N1YnNjcmliZV9jYiAocGFfY29udGV4dCAqIGMsCisgICAgcGFfc3Vic2NyaXB0aW9uX2V2ZW50X3R5cGVfdCB0LCB1aW50MzJfdCBpZHgsIHZvaWQgKnVzZXJkYXRhKQoreworICBHc3RQdWxzZVNyYyAqcHNyYyA9IEdTVF9QVUxTRVNSQyAodXNlcmRhdGEpOworCisgIGlmICh0ICE9IChQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU09VUkNFX09VVFBVVCB8IFBBX1NVQlNDUklQVElPTl9FVkVOVF9DSEFOR0UpCisgICAgICAmJiB0ICE9IChQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU09VUkNFX09VVFBVVCB8IFBBX1NVQlNDUklQVElPTl9FVkVOVF9ORVcpKQorICAgIHJldHVybjsKKworICBpZiAoaWR4ICE9IHBzcmMtPnNvdXJjZV9vdXRwdXRfaWR4KQorICAgIHJldHVybjsKKworICAvKiBBY3R1YWxseSB0aGlzIGV2ZW50IGlzIGFsc28gdHJpZ2dlcmVkIHdoZW4gb3RoZXIgcHJvcGVydGllcyBvZiB0aGUgc3RyZWFtCisgICAqIGNoYW5nZSB0aGF0IGFyZSB1bnJlbGF0ZWQgdG8gdGhlIHZvbHVtZS4gSG93ZXZlciBpdCBpcyBwcm9iYWJseSBjaGVhcGVyIHRvCisgICAqIHNpZ25hbCB0aGUgY2hhbmdlIGhlcmUgYW5kIGNoZWNrIGZvciB0aGUgdm9sdW1lIHdoZW4gdGhlIEdPYmplY3QgcHJvcGVydHkKKyAgICogaXMgcmVhZCBpbnN0ZWFkIG9mIHF1ZXJ5aW5nIGl0IGFsd2F5cy4gKi8KKworICAvKiBpbmZvcm0gc3RyZWFtaW5nIHRocmVhZCB0byBub3RpZnkgKi8KKyAgZ19hdG9taWNfaW50X2NvbXBhcmVfYW5kX2V4Y2hhbmdlICgmcHNyYy0+bm90aWZ5LCAwLCAxKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VzcmNfb3BlbiAoR3N0QXVkaW9TcmMgKiBhc3JjKQoreworICBHc3RQdWxzZVNyYyAqcHVsc2VzcmMgPSBHU1RfUFVMU0VTUkNfQ0FTVCAoYXNyYyk7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKworICBnX2Fzc2VydCAoIXB1bHNlc3JjLT5jb250ZXh0KTsKKyAgZ19hc3NlcnQgKCFwdWxzZXNyYy0+c3RyZWFtKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgIm9wZW5pbmcgZGV2aWNlIik7CisKKyAgaWYgKCEocHVsc2VzcmMtPmNvbnRleHQgPQorICAgICAgICAgIHBhX2NvbnRleHRfbmV3IChwYV90aHJlYWRlZF9tYWlubG9vcF9nZXRfYXBpIChwdWxzZXNyYy0+bWFpbmxvb3ApLAorICAgICAgICAgICAgICBwdWxzZXNyYy0+Y2xpZW50X25hbWUpKSkgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwdWxzZXNyYywgUkVTT1VSQ0UsIEZBSUxFRCwgKCJGYWlsZWQgdG8gY3JlYXRlIGNvbnRleHQiKSwKKyAgICAgICAgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9ja19hbmRfZmFpbDsKKyAgfQorCisgIHBhX2NvbnRleHRfc2V0X3N0YXRlX2NhbGxiYWNrIChwdWxzZXNyYy0+Y29udGV4dCwKKyAgICAgIGdzdF9wdWxzZXNyY19jb250ZXh0X3N0YXRlX2NiLCBwdWxzZXNyYyk7CisgIHBhX2NvbnRleHRfc2V0X3N1YnNjcmliZV9jYWxsYmFjayAocHVsc2VzcmMtPmNvbnRleHQsCisgICAgICBnc3RfcHVsc2VzcmNfY29udGV4dF9zdWJzY3JpYmVfY2IsIHB1bHNlc3JjKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgImNvbm5lY3QgdG8gc2VydmVyICVzIiwKKyAgICAgIEdTVF9TVFJfTlVMTCAocHVsc2VzcmMtPnNlcnZlcikpOworCisgIGlmIChwYV9jb250ZXh0X2Nvbm5lY3QgKHB1bHNlc3JjLT5jb250ZXh0LCBwdWxzZXNyYy0+c2VydmVyLCAwLCBOVUxMKSA8IDApIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHVsc2VzcmMsIFJFU09VUkNFLCBGQUlMRUQsICgiRmFpbGVkIHRvIGNvbm5lY3Q6ICVzIiwKKyAgICAgICAgICAgIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwdWxzZXNyYy0+Y29udGV4dCkpKSwgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9ja19hbmRfZmFpbDsKKyAgfQorCisgIGZvciAoOzspIHsKKyAgICBwYV9jb250ZXh0X3N0YXRlX3Qgc3RhdGU7CisKKyAgICBzdGF0ZSA9IHBhX2NvbnRleHRfZ2V0X3N0YXRlIChwdWxzZXNyYy0+Y29udGV4dCk7CisKKyAgICBpZiAoIVBBX0NPTlRFWFRfSVNfR09PRCAoc3RhdGUpKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHVsc2VzcmMsIFJFU09VUkNFLCBGQUlMRUQsICgiRmFpbGVkIHRvIGNvbm5lY3Q6ICVzIiwKKyAgICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHB1bHNlc3JjLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgICAgZ290byB1bmxvY2tfYW5kX2ZhaWw7CisgICAgfQorCisgICAgaWYgKHN0YXRlID09IFBBX0NPTlRFWFRfUkVBRFkpCisgICAgICBicmVhazsKKworICAgIC8qIFdhaXQgdW50aWwgdGhlIGNvbnRleHQgaXMgcmVhZHkgKi8KKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0IChwdWxzZXNyYy0+bWFpbmxvb3ApOworICB9CisgIEdTVF9ERUJVR19PQkpFQ1QgKHB1bHNlc3JjLCAiY29ubmVjdGVkIik7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLwordW5sb2NrX2FuZF9mYWlsOgorICB7CisgICAgZ3N0X3B1bHNlc3JjX2Rlc3Ryb3lfY29udGV4dCAocHVsc2VzcmMpOworCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworCisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3B1bHNlc3JjX2Nsb3NlIChHc3RBdWRpb1NyYyAqIGFzcmMpCit7CisgIEdzdFB1bHNlU3JjICpwdWxzZXNyYyA9IEdTVF9QVUxTRVNSQ19DQVNUIChhc3JjKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworICBnc3RfcHVsc2VzcmNfZGVzdHJveV9jb250ZXh0IChwdWxzZXNyYyk7CisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VzcmNfdW5wcmVwYXJlIChHc3RBdWRpb1NyYyAqIGFzcmMpCit7CisgIEdzdFB1bHNlU3JjICpwdWxzZXNyYyA9IEdTVF9QVUxTRVNSQ19DQVNUIChhc3JjKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworICBnc3RfcHVsc2VzcmNfZGVzdHJveV9zdHJlYW0gKHB1bHNlc3JjKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKHB1bHNlc3JjLT5tYWlubG9vcCk7CisKKyAgcHVsc2VzcmMtPnJlYWRfYnVmZmVyID0gTlVMTDsKKyAgcHVsc2VzcmMtPnJlYWRfYnVmZmVyX2xlbmd0aCA9IDA7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBndWludAorZ3N0X3B1bHNlc3JjX3JlYWQgKEdzdEF1ZGlvU3JjICogYXNyYywgZ3BvaW50ZXIgZGF0YSwgZ3VpbnQgbGVuZ3RoLAorICAgIEdzdENsb2NrVGltZSAqIHRpbWVzdGFtcCkKK3sKKyAgR3N0UHVsc2VTcmMgKnB1bHNlc3JjID0gR1NUX1BVTFNFU1JDX0NBU1QgKGFzcmMpOworICBzaXplX3Qgc3VtID0gMDsKKworICBpZiAoZ19hdG9taWNfaW50X2NvbXBhcmVfYW5kX2V4Y2hhbmdlICgmcHVsc2VzcmMtPm5vdGlmeSwgMSwgMCkpIHsKKyAgICBnX29iamVjdF9ub3RpZnkgKEdfT0JKRUNUIChwdWxzZXNyYyksICJ2b2x1bWUiKTsKKyAgICBnX29iamVjdF9ub3RpZnkgKEdfT0JKRUNUIChwdWxzZXNyYyksICJtdXRlIik7CisgICAgZ19vYmplY3Rfbm90aWZ5IChHX09CSkVDVCAocHVsc2VzcmMpLCAiY3VycmVudC1kZXZpY2UiKTsKKyAgfQorCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKHB1bHNlc3JjLT5tYWlubG9vcCk7CisgIHB1bHNlc3JjLT5pbl9yZWFkID0gVFJVRTsKKworICBpZiAoIXB1bHNlc3JjLT5zdHJlYW1fY29ubmVjdGVkKQorICAgIGdvdG8gbm90X2Nvbm5lY3RlZDsKKworICBpZiAocHVsc2VzcmMtPnBhdXNlZCkKKyAgICBnb3RvIHdhc19wYXVzZWQ7CisKKyAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICBzaXplX3QgbDsKKworICAgIEdTVF9MT0dfT0JKRUNUIChwdWxzZXNyYywgInJlYWRpbmcgJXUgYnl0ZXMiLCBsZW5ndGgpOworCisgICAgLypjaGVjayBpZiB3ZSBoYXZlIGEgbGVmdG92ZXIgYnVmZmVyICovCisgICAgaWYgKCFwdWxzZXNyYy0+cmVhZF9idWZmZXIpIHsKKyAgICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKGdzdF9wdWxzZXNyY19pc19kZWFkIChwdWxzZXNyYywgVFJVRSkpCisgICAgICAgICAgZ290byB1bmxvY2tfYW5kX2ZhaWw7CisKKyAgICAgICAgLyogcmVhZCBhbGwgYXZhaWxhYmxlIGRhdGEsIHdlIGtlZXAgYSBwb2ludGVyIHRvIHRoZSBkYXRhIGFuZCB0aGUgbGVuZ3RoCisgICAgICAgICAqIGFuZCB0YWtlIGZyb20gaXQgd2hhdCB3ZSBuZWVkLiAqLworICAgICAgICBpZiAocGFfc3RyZWFtX3BlZWsgKHB1bHNlc3JjLT5zdHJlYW0sICZwdWxzZXNyYy0+cmVhZF9idWZmZXIsCisgICAgICAgICAgICAgICAgJnB1bHNlc3JjLT5yZWFkX2J1ZmZlcl9sZW5ndGgpIDwgMCkKKyAgICAgICAgICBnb3RvIHBlZWtfZmFpbGVkOworCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwdWxzZXNyYywgImhhdmUgZGF0YSBvZiAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIiwKKyAgICAgICAgICAgIHB1bHNlc3JjLT5yZWFkX2J1ZmZlcl9sZW5ndGgpOworCisgICAgICAgIC8qIGlmIHdlIGhhdmUgZGF0YSwgcHJvY2VzcyBpZiAqLworICAgICAgICBpZiAocHVsc2VzcmMtPnJlYWRfYnVmZmVyICYmIHB1bHNlc3JjLT5yZWFkX2J1ZmZlcl9sZW5ndGgpCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogbm93IHdhaXQgZm9yIG1vcmUgZGF0YSB0byBiZWNvbWUgYXZhaWxhYmxlICovCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwdWxzZXNyYywgIndhaXRpbmcgZm9yIGRhdGEiKTsKKyAgICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAocHVsc2VzcmMtPm1haW5sb29wKTsKKworICAgICAgICBpZiAocHVsc2VzcmMtPnBhdXNlZCkKKyAgICAgICAgICBnb3RvIHdhc19wYXVzZWQ7CisgICAgICB9CisgICAgfQorCisgICAgbCA9IHB1bHNlc3JjLT5yZWFkX2J1ZmZlcl9sZW5ndGggPgorICAgICAgICBsZW5ndGggPyBsZW5ndGggOiBwdWxzZXNyYy0+cmVhZF9idWZmZXJfbGVuZ3RoOworCisgICAgbWVtY3B5IChkYXRhLCBwdWxzZXNyYy0+cmVhZF9idWZmZXIsIGwpOworCisgICAgcHVsc2VzcmMtPnJlYWRfYnVmZmVyID0gKGNvbnN0IGd1aW50OCAqKSBwdWxzZXNyYy0+cmVhZF9idWZmZXIgKyBsOworICAgIHB1bHNlc3JjLT5yZWFkX2J1ZmZlcl9sZW5ndGggLT0gbDsKKworICAgIGRhdGEgPSAoZ3VpbnQ4ICopIGRhdGEgKyBsOworICAgIGxlbmd0aCAtPSBsOworICAgIHN1bSArPSBsOworCisgICAgaWYgKHB1bHNlc3JjLT5yZWFkX2J1ZmZlcl9sZW5ndGggPD0gMCkgeworICAgICAgLyogd2UgY29waWVkIGFsbCBvZiB0aGUgZGF0YSwgZHJvcCBpdCBub3cgKi8KKyAgICAgIGlmIChwYV9zdHJlYW1fZHJvcCAocHVsc2VzcmMtPnN0cmVhbSkgPCAwKQorICAgICAgICBnb3RvIGRyb3BfZmFpbGVkOworCisgICAgICAvKiByZXNldCBwb2ludGVyIHRvIGRhdGEgKi8KKyAgICAgIHB1bHNlc3JjLT5yZWFkX2J1ZmZlciA9IE5VTEw7CisgICAgICBwdWxzZXNyYy0+cmVhZF9idWZmZXJfbGVuZ3RoID0gMDsKKyAgICB9CisgIH0KKworICBwdWxzZXNyYy0+aW5fcmVhZCA9IEZBTFNFOworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKHB1bHNlc3JjLT5tYWlubG9vcCk7CisKKyAgcmV0dXJuIHN1bTsKKworICAvKiBFUlJPUlMgKi8KK25vdF9jb25uZWN0ZWQ6CisgIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocHVsc2VzcmMsICJ3ZSBhcmUgbm90IGNvbm5lY3RlZCIpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9Cit3YXNfcGF1c2VkOgorICB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHB1bHNlc3JjLCAid2UgYXJlIHBhdXNlZCIpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9CitwZWVrX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwdWxzZXNyYywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV9zdHJlYW1fcGVlaygpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHB1bHNlc3JjLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9Citkcm9wX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwdWxzZXNyYywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV9zdHJlYW1fZHJvcCgpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHB1bHNlc3JjLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9Cit1bmxvY2tfYW5kX2ZhaWw6CisgIHsKKyAgICBwdWxzZXNyYy0+aW5fcmVhZCA9IEZBTFNFOworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKworICAgIHJldHVybiAoZ3VpbnQpIC0gMTsKKyAgfQorfQorCisvKiByZXR1cm4gdGhlIGRlbGF5IGluIHNhbXBsZXMgKi8KK3N0YXRpYyBndWludAorZ3N0X3B1bHNlc3JjX2RlbGF5IChHc3RBdWRpb1NyYyAqIGFzcmMpCit7CisgIEdzdFB1bHNlU3JjICpwdWxzZXNyYyA9IEdTVF9QVUxTRVNSQ19DQVNUIChhc3JjKTsKKyAgcGFfdXNlY190IHQ7CisgIGludCBuZWdhdGl2ZSwgcmVzOworICBndWludCByZXN1bHQ7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKyAgaWYgKGdzdF9wdWxzZXNyY19pc19kZWFkIChwdWxzZXNyYywgVFJVRSkpCisgICAgZ290byBzZXJ2ZXJfZGVhZDsKKworICAvKiBnZXQgdGhlIGxhdGVuY3ksIHRoaXMgY2FuIGZhaWwgd2hlbiB3ZSBkb24ndCBoYXZlIGEgbGF0ZW5jeSB1cGRhdGUgeWV0LgorICAgKiBXZSBkb24ndCB3YW50IHRvIHdhaXQgZm9yIGxhdGVuY3kgdXBkYXRlcyBoZXJlIGJ1dCB3ZSBqdXN0IHJldHVybiAwLiAqLworICByZXMgPSBwYV9zdHJlYW1fZ2V0X2xhdGVuY3kgKHB1bHNlc3JjLT5zdHJlYW0sICZ0LCAmbmVnYXRpdmUpOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKworICBpZiAocmVzIDwgMCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHB1bHNlc3JjLCAiY291bGQgbm90IGdldCBsYXRlbmN5Iik7CisgICAgcmVzdWx0ID0gMDsKKyAgfSBlbHNlIHsKKyAgICBpZiAobmVnYXRpdmUpCisgICAgICByZXN1bHQgPSAwOworICAgIGVsc2UKKyAgICAgIHJlc3VsdCA9IChndWludCkgKCh0ICogcHVsc2VzcmMtPnNhbXBsZV9zcGVjLnJhdGUpIC8gMTAwMDAwMExMKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworCisgIC8qIEVSUk9SUyAqLworc2VydmVyX2RlYWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgInRoZSBzZXJ2ZXIgaXMgZGVhZCIpOworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wdWxzZXNyY19jcmVhdGVfc3RyZWFtIChHc3RQdWxzZVNyYyAqIHB1bHNlc3JjLCBHc3RDYXBzICoqIGNhcHMsCisgICAgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHJzcGVjKQoreworICBwYV9jaGFubmVsX21hcCBjaGFubmVsX21hcDsKKyAgY29uc3QgcGFfY2hhbm5lbF9tYXAgKm07CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgZ2Jvb2xlYW4gbmVlZF9jaGFubmVsX2xheW91dCA9IEZBTFNFOworICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjIG5ld19zcGVjLCAqc3BlYyA9IE5VTEw7CisgIGNvbnN0IGdjaGFyICpuYW1lOworICBpbnQgaTsKKworICAvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBzdHJlYW0gKHJlbmVnb3RpYXRpb24pLCBmcmVlIGl0IGZpcnN0ICovCisgIGlmIChwdWxzZXNyYy0+c3RyZWFtKQorICAgIGdzdF9wdWxzZXNyY19kZXN0cm95X3N0cmVhbSAocHVsc2VzcmMpOworCisgIGlmIChyc3BlYykgeworICAgIC8qIFBvc3QtbmVnb3RpYXRpb24sIHdlIGFscmVhZHkgaGF2ZSBhIHJpbmdidWZmZXIgc3BlYywgc28gd2UganVzdCBuZWVkIHRvCisgICAgICogdXNlIGl0IHRvIGNyZWF0ZSBhIHN0cmVhbS4gKi8KKyAgICBzcGVjID0gcnNwZWM7CisKKyAgICAvKiBBdCB0aGlzIHBvaW50LCB3ZSBleHBlY3QgdGhlIGNoYW5uZWwtbWFzayB0byBiZSBzZXQgaW4gY2Fwcywgc28gd2UganVzdAorICAgICAqIHVzZSB0aGF0ICovCisgICAgaWYgKCFnc3RfcHVsc2VfZ3N0X3RvX2NoYW5uZWxfbWFwICgmY2hhbm5lbF9tYXAsIHNwZWMpKQorICAgICAgZ290byBpbnZhbGlkX3NwZWM7CisKKyAgfSBlbHNlIGlmIChjYXBzKSB7CisgICAgLyogQXQgbmVnb3RpYXRpb24gdGltZSwgd2UgZ2V0IGEgZml4ZWQgY2FwcyBhbmQgdXNlIGl0IHRvIHNldCB1cCBhIHN0cmVhbSAqLworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlICgqY2FwcywgMCk7CisgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzLCAiY2hhbm5lbHMiLCAmbmV3X3NwZWMuaW5mby5jaGFubmVscyk7CisgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgImNoYW5uZWwtbWFzayIpKSB7CisgICAgICBpZiAobmV3X3NwZWMuaW5mby5jaGFubmVscyA9PSAxKSB7CisgICAgICAgIHBhX2NoYW5uZWxfbWFwX2luaXRfbW9ubyAoJmNoYW5uZWxfbWFwKTsKKyAgICAgIH0gZWxzZSBpZiAobmV3X3NwZWMuaW5mby5jaGFubmVscyA9PSAyKSB7CisgICAgICAgIHBhX2NoYW5uZWxfbWFwX2luaXRfc3RlcmVvICgmY2hhbm5lbF9tYXApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmVlZF9jaGFubmVsX2xheW91dCA9IFRSVUU7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiY2hhbm5lbC1tYXNrIiwgR1NUX1RZUEVfQklUTUFTSywKKyAgICAgICAgICAgIEdfR1VJTlQ2NF9DT05TVEFOVCAoMCksIE5VTEwpOworICAgICAgfQorICAgIH0KKworICAgIG1lbXNldCAoJm5ld19zcGVjLCAwLCBzaXplb2YgKEdzdEF1ZGlvUmluZ0J1ZmZlclNwZWMpKTsKKyAgICBuZXdfc3BlYy5sYXRlbmN5X3RpbWUgPSBHU1RfU0VDT05EOworICAgIGlmICghZ3N0X2F1ZGlvX3JpbmdfYnVmZmVyX3BhcnNlX2NhcHMgKCZuZXdfc3BlYywgKmNhcHMpKQorICAgICAgZ290byBpbnZhbGlkX2NhcHM7CisKKyAgICAvKiBLZWVwIHRoZSByZWZjb3VudCBvZiB0aGUgY2FwcyBhdCAxIHRvIG1ha2UgdGhlbSB3cml0YWJsZSAqLworICAgIGdzdF9jYXBzX3VucmVmIChuZXdfc3BlYy5jYXBzKTsKKworICAgIGlmICghbmVlZF9jaGFubmVsX2xheW91dAorICAgICAgICAmJiAhZ3N0X3B1bHNlX2dzdF90b19jaGFubmVsX21hcCAoJmNoYW5uZWxfbWFwLCAmbmV3X3NwZWMpKSB7CisgICAgICBuZWVkX2NoYW5uZWxfbGF5b3V0ID0gVFJVRTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiY2hhbm5lbC1tYXNrIiwgR1NUX1RZUEVfQklUTUFTSywKKyAgICAgICAgICBHX0dVSU5UNjRfQ09OU1RBTlQgKDApLCBOVUxMKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBHX05fRUxFTUVOVFMgKG5ld19zcGVjLmluZm8ucG9zaXRpb24pOyBpKyspCisgICAgICAgIG5ld19zcGVjLmluZm8ucG9zaXRpb25baV0gPSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9JTlZBTElEOworICAgIH0KKworICAgIHNwZWMgPSAmbmV3X3NwZWM7CisgIH0gZWxzZSB7CisgICAgLyogIXJzcGVjICYmICFjYXBzICovCisgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgIH0KKworICBpZiAoIWdzdF9wdWxzZV9maWxsX3NhbXBsZV9zcGVjIChzcGVjLCAmcHVsc2VzcmMtPnNhbXBsZV9zcGVjKSkKKyAgICBnb3RvIGludmFsaWRfc3BlYzsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworCisgIGlmICghcHVsc2VzcmMtPmNvbnRleHQpCisgICAgZ290byBiYWRfY29udGV4dDsKKworICBuYW1lID0gIlJlY29yZCBTdHJlYW0iOworICBpZiAocHVsc2VzcmMtPnByb3BsaXN0KSB7CisgICAgaWYgKCEocHVsc2VzcmMtPnN0cmVhbSA9IHBhX3N0cmVhbV9uZXdfd2l0aF9wcm9wbGlzdCAocHVsc2VzcmMtPmNvbnRleHQsCisgICAgICAgICAgICAgICAgbmFtZSwgJnB1bHNlc3JjLT5zYW1wbGVfc3BlYywKKyAgICAgICAgICAgICAgICAobmVlZF9jaGFubmVsX2xheW91dCkgPyBOVUxMIDogJmNoYW5uZWxfbWFwLAorICAgICAgICAgICAgICAgIHB1bHNlc3JjLT5wcm9wbGlzdCkpKQorICAgICAgZ290byBjcmVhdGVfZmFpbGVkOworCisgIH0gZWxzZSBpZiAoIShwdWxzZXNyYy0+c3RyZWFtID0gcGFfc3RyZWFtX25ldyAocHVsc2VzcmMtPmNvbnRleHQsCisgICAgICAgICAgICAgIG5hbWUsICZwdWxzZXNyYy0+c2FtcGxlX3NwZWMsCisgICAgICAgICAgICAgIChuZWVkX2NoYW5uZWxfbGF5b3V0KSA/IE5VTEwgOiAmY2hhbm5lbF9tYXApKSkKKyAgICBnb3RvIGNyZWF0ZV9mYWlsZWQ7CisKKyAgaWYgKGNhcHMpIHsKKyAgICBtID0gcGFfc3RyZWFtX2dldF9jaGFubmVsX21hcCAocHVsc2VzcmMtPnN0cmVhbSk7CisgICAgZ3N0X3B1bHNlX2NoYW5uZWxfbWFwX3RvX2dzdCAobSwgJm5ld19zcGVjKTsKKyAgICBnc3RfYXVkaW9fY2hhbm5lbF9wb3NpdGlvbnNfdG9fdmFsaWRfb3JkZXIgKG5ld19zcGVjLmluZm8ucG9zaXRpb24sCisgICAgICAgIG5ld19zcGVjLmluZm8uY2hhbm5lbHMpOworICAgIGdzdF9jYXBzX3VucmVmICgqY2Fwcyk7CisgICAgKmNhcHMgPSBnc3RfYXVkaW9faW5mb190b19jYXBzICgmbmV3X3NwZWMuaW5mbyk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgIkNhcHMgYXJlICUiIEdTVF9QVFJfRk9STUFULCAqY2Fwcyk7CisgIH0KKworCisgIHBhX3N0cmVhbV9zZXRfc3RhdGVfY2FsbGJhY2sgKHB1bHNlc3JjLT5zdHJlYW0sIGdzdF9wdWxzZXNyY19zdHJlYW1fc3RhdGVfY2IsCisgICAgICBwdWxzZXNyYyk7CisgIHBhX3N0cmVhbV9zZXRfcmVhZF9jYWxsYmFjayAocHVsc2VzcmMtPnN0cmVhbSwgZ3N0X3B1bHNlc3JjX3N0cmVhbV9yZXF1ZXN0X2NiLAorICAgICAgcHVsc2VzcmMpOworICBwYV9zdHJlYW1fc2V0X3VuZGVyZmxvd19jYWxsYmFjayAocHVsc2VzcmMtPnN0cmVhbSwKKyAgICAgIGdzdF9wdWxzZXNyY19zdHJlYW1fdW5kZXJmbG93X2NiLCBwdWxzZXNyYyk7CisgIHBhX3N0cmVhbV9zZXRfb3ZlcmZsb3dfY2FsbGJhY2sgKHB1bHNlc3JjLT5zdHJlYW0sCisgICAgICBnc3RfcHVsc2VzcmNfc3RyZWFtX292ZXJmbG93X2NiLCBwdWxzZXNyYyk7CisgIHBhX3N0cmVhbV9zZXRfbGF0ZW5jeV91cGRhdGVfY2FsbGJhY2sgKHB1bHNlc3JjLT5zdHJlYW0sCisgICAgICBnc3RfcHVsc2VzcmNfc3RyZWFtX2xhdGVuY3lfdXBkYXRlX2NiLCBwdWxzZXNyYyk7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworaW52YWxpZF9jYXBzOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHB1bHNlc3JjLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgICgiQ2FuJ3QgcGFyc2UgY2Fwcy4iKSwgKE5VTEwpKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KK2ludmFsaWRfc3BlYzoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwdWxzZXNyYywgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoIkludmFsaWQgc2FtcGxlIHNwZWNpZmljYXRpb24uIiksIChOVUxMKSk7CisgICAgZ290byBmYWlsOworICB9CitiYWRfY29udGV4dDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwdWxzZXNyYywgUkVTT1VSQ0UsIEZBSUxFRCwgKCJCYWQgY29udGV4dCIpLCAoTlVMTCkpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9CitjcmVhdGVfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHB1bHNlc3JjLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoIkZhaWxlZCB0byBjcmVhdGUgc3RyZWFtOiAlcyIsCisgICAgICAgICAgICBwYV9zdHJlcnJvciAocGFfY29udGV4dF9lcnJubyAocHVsc2VzcmMtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byB1bmxvY2tfYW5kX2ZhaWw7CisgIH0KK3VubG9ja19hbmRfZmFpbDoKKyAgeworICAgIGdzdF9wdWxzZXNyY19kZXN0cm95X3N0cmVhbSAocHVsc2VzcmMpOworCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworCisgIGZhaWw6CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3B1bHNlc3JjX2V2ZW50IChHc3RCYXNlU3JjICogYmFzZXNyYywgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXNyYywgImhhbmRsZSBldmVudCAlIiBHU1RfUFRSX0ZPUk1BVCwgZXZlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1JFQ09ORklHVVJFOgorICAgICAgZ3N0X3BhZF9jaGVja19yZWNvbmZpZ3VyZSAoR1NUX0JBU0VfU1JDX1BBRCAoYmFzZXNyYykpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBHU1RfQkFTRV9TUkNfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmV2ZW50IChiYXNlc3JjLCBldmVudCk7Cit9CisKKy8qIFRoaXMgaXMgZXNzZW50aWFsbHkgZ3N0X2Jhc2Vfc3JjX25lZ290aWF0ZV9kZWZhdWx0KCkgYnV0IHRoZSBjYXBzCisgKiBhcmUgZ3VhcmFudGVlZCB0byBoYXZlIGEgY2hhbm5lbCBsYXlvdXQgZm9yID4gMiBjaGFubmVscworICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wdWxzZXNyY19uZWdvdGlhdGUgKEdzdEJhc2VTcmMgKiBiYXNlc3JjKQoreworICBHc3RQdWxzZVNyYyAqcHVsc2VzcmMgPSBHU1RfUFVMU0VTUkNfQ0FTVCAoYmFzZXNyYyk7CisgIEdzdENhcHMgKnRoaXNjYXBzOworICBHc3RDYXBzICpjYXBzID0gTlVMTDsKKyAgR3N0Q2FwcyAqcGVlcmNhcHMgPSBOVUxMOworICBnYm9vbGVhbiByZXN1bHQgPSBGQUxTRTsKKworICAvKiBmaXJzdCBzZWUgd2hhdCBpcyBwb3NzaWJsZSBvbiBvdXIgc291cmNlIHBhZCAqLworICB0aGlzY2FwcyA9IGdzdF9wYWRfcXVlcnlfY2FwcyAoR1NUX0JBU0VfU1JDX1BBRCAoYmFzZXNyYyksIE5VTEwpOworICBHU1RfREVCVUdfT0JKRUNUIChiYXNlc3JjLCAiY2FwcyBvZiBzcmM6ICUiIEdTVF9QVFJfRk9STUFULCB0aGlzY2Fwcyk7CisgIC8qIG5vdGhpbmcgb3IgYW55dGhpbmcgaXMgYWxsb3dlZCwgd2UncmUgZG9uZSAqLworICBpZiAodGhpc2NhcHMgPT0gTlVMTCB8fCBnc3RfY2Fwc19pc19hbnkgKHRoaXNjYXBzKSkKKyAgICBnb3RvIG5vX25lZ29fbmVlZGVkOworCisgIC8qIGdldCB0aGUgcGVlciBjYXBzICovCisgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9CQVNFX1NSQ19QQUQgKGJhc2VzcmMpLCBOVUxMKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXNyYywgImNhcHMgb2YgcGVlcjogJSIgR1NUX1BUUl9GT1JNQVQsIHBlZXJjYXBzKTsKKyAgaWYgKHBlZXJjYXBzKSB7CisgICAgLyogZ2V0IGludGVyc2VjdGlvbiAqLworICAgIGNhcHMgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHRoaXNjYXBzLCBwZWVyY2Fwcyk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXNyYywgImludGVyc2VjdDogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmICh0aGlzY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBubyBwZWVyLCB3b3JrIHdpdGggb3VyIG93biBjYXBzIHRoZW4gKi8KKyAgICBjYXBzID0gdGhpc2NhcHM7CisgIH0KKyAgaWYgKGNhcHMpIHsKKyAgICAvKiB0YWtlIGZpcnN0IChhbmQgYmVzdCwgc2luY2UgdGhleSBhcmUgc29ydGVkKSBwb3NzaWJpbGl0eSAqLworICAgIGNhcHMgPSBnc3RfY2Fwc190cnVuY2F0ZSAoY2Fwcyk7CisKKyAgICAvKiBub3cgZml4YXRlICovCisgICAgaWYgKCFnc3RfY2Fwc19pc19lbXB0eSAoY2FwcykpIHsKKyAgICAgIGNhcHMgPSBHU1RfQkFTRV9TUkNfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpeGF0ZSAoYmFzZXNyYywgY2Fwcyk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChiYXNlc3JjLCAiZml4YXRlZCB0bzogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgICAgICBpZiAoZ3N0X2NhcHNfaXNfYW55IChjYXBzKSkgeworICAgICAgICAvKiBobW0sIHN0aWxsIGFueXRoaW5nLCBzbyBlbGVtZW50IGNhbiBkbyBhbnl0aGluZyBhbmQKKyAgICAgICAgICogbmVnbyBpcyBub3QgbmVlZGVkICovCisgICAgICAgIHJlc3VsdCA9IFRSVUU7CisgICAgICB9IGVsc2UgaWYgKGdzdF9jYXBzX2lzX2ZpeGVkIChjYXBzKSkgeworICAgICAgICAvKiB5YXksIGZpeGVkIGNhcHMsIHVzZSB0aG9zZSB0aGVuICovCisgICAgICAgIHJlc3VsdCA9IGdzdF9wdWxzZXNyY19jcmVhdGVfc3RyZWFtIChwdWxzZXNyYywgJmNhcHMsIE5VTEwpOworICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgIHJlc3VsdCA9IGdzdF9iYXNlX3NyY19zZXRfY2FwcyAoYmFzZXNyYywgY2Fwcyk7CisgICAgICB9CisgICAgfQorICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworCitub19uZWdvX25lZWRlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VzcmMsICJubyBuZWdvdGlhdGlvbiBuZWVkZWQiKTsKKyAgICBpZiAodGhpc2NhcHMpCisgICAgICBnc3RfY2Fwc191bnJlZiAodGhpc2NhcHMpOworICAgIHJldHVybiBUUlVFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3B1bHNlc3JjX3ByZXBhcmUgKEdzdEF1ZGlvU3JjICogYXNyYywgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpCit7CisgIHBhX2J1ZmZlcl9hdHRyIHdhbnRlZDsKKyAgY29uc3QgcGFfYnVmZmVyX2F0dHIgKmFjdHVhbDsKKyAgR3N0UHVsc2VTcmMgKnB1bHNlc3JjID0gR1NUX1BVTFNFU1JDX0NBU1QgKGFzcmMpOworICBwYV9zdHJlYW1fZmxhZ3NfdCBmbGFnczsKKyAgcGFfb3BlcmF0aW9uICpvOworICBHc3RBdWRpb0Nsb2NrICpjbG9jazsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworCisgIGlmICghcHVsc2VzcmMtPnN0cmVhbSkKKyAgICBnc3RfcHVsc2VzcmNfY3JlYXRlX3N0cmVhbSAocHVsc2VzcmMsIE5VTEwsIHNwZWMpOworCisgIHsKKyAgICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjIHMgPSAqc3BlYzsKKyAgICBjb25zdCBwYV9jaGFubmVsX21hcCAqbTsKKworICAgIG0gPSBwYV9zdHJlYW1fZ2V0X2NoYW5uZWxfbWFwIChwdWxzZXNyYy0+c3RyZWFtKTsKKyAgICBnc3RfcHVsc2VfY2hhbm5lbF9tYXBfdG9fZ3N0IChtLCAmcyk7CisgICAgZ3N0X2F1ZGlvX3JpbmdfYnVmZmVyX3NldF9jaGFubmVsX3Bvc2l0aW9ucyAoR1NUX0FVRElPX0JBU0VfU1JDCisgICAgICAgIChwdWxzZXNyYyktPnJpbmdidWZmZXIsIHMuaW5mby5wb3NpdGlvbik7CisgIH0KKworICAvKiBlbmFibGUgZXZlbnQgbm90aWZpY2F0aW9ucyAqLworICBHU1RfTE9HX09CSkVDVCAocHVsc2VzcmMsICJzdWJzY3JpYmluZyB0byBjb250ZXh0IGV2ZW50cyIpOworICBpZiAoIShvID0gcGFfY29udGV4dF9zdWJzY3JpYmUgKHB1bHNlc3JjLT5jb250ZXh0LAorICAgICAgICAgICAgICBQQV9TVUJTQ1JJUFRJT05fTUFTS19TT1VSQ0VfT1VUUFVULCBOVUxMLCBOVUxMKSkpIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHVsc2VzcmMsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgicGFfY29udGV4dF9zdWJzY3JpYmUoKSBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwdWxzZXNyYy0+Y29udGV4dCkpKSwgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9ja19hbmRfZmFpbDsKKyAgfQorCisgIHBhX29wZXJhdGlvbl91bnJlZiAobyk7CisKKyAgLyogVGhlcmUncyBhIGJpdCBvZiBhIGRpc2Nvbm5lY3QgaGVyZSBiZXR3ZWVuIHRoZSBhdWRpbyByaW5nYnVmZmVyIGFuZCB3aGF0CisgICAqIFB1bHNlQXVkaW8gcHJvdmlkZXMuIFRoZSBhdWRpbyByaW5nYnVmZmVyIHByb3ZpZGUgYSB0b3RhbCBvZiBidWZmZXJfdGltZQorICAgKiB3b3J0aCBvZiBidWZmZXJpbmcsIGRpdmlkZWQgaW50byBzZWdtZW50cyBvZiBsYXRlbmN5X3RpbWUgc2l6ZS4gV2UncmUKKyAgICogYXNraW5nIFB1bHNlQXVkaW8gdG8gcHJvdmlkZSBhIHRvdGFsIGxhdGVuY3kgb2YgbGF0ZW5jeV90aW1lLCB3aGljaCwgd2l0aAorICAgKiBQQV9TVFJFQU1fQURKVVNUX0xBVEVOQ1ksIGVmZmVjdGl2ZWx5IHNldHMgaXRzZWxmIHVwIGFzIGEgcmluZ2J1ZmZlciB3aXRoCisgICAqIG9uZSBzZWdtZW50IGJlaW5nIHRoZSBoYXJkd2FyZSBidWZmZXIsIGFuZCB0aGUgb3RoZXIgdGhlIHNvZnR3YXJlIGJ1ZmZlci4KKyAgICogVGhpcyBzZWdtZW50IHNpemUgaXMgcmV0dXJuZWQgYXMgdGhlIGZyYWdzaXplLgorICAgKgorICAgKiBTaW5jZSB0aGUgdHdvIGNvbmNlcHRzIGRvbid0IG1hcCB2ZXJ5IHdlbGwsIHdoYXQgd2UgZG8gaXMga2VlcCBzZWdzaXplIGFzCisgICAqIGl0IGlzICh1bmxlc3MgZnJhZ3NpemUgaXMgZXZlbiBsYXJnZXIsIGluIHdoaWNoIGNhc2Ugd2UgdXNlIHRoYXQpLiBXZSdsbAorICAgKiBnZXQgZGF0YSBmcm9tIFB1bHNlQXVkaW8gaW4gc21hbGxlciBjaHVua3MgdGhhbiB3ZSB3YW50IHRvIHBhc3Mgb24gYXMgYW4KKyAgICogZWxlbWVudCwgYW5kIHdlIGNvYWxlc2NlIHRob3NlIGNodW5rcyBpbiB0aGUgcmluZ2J1ZmZlciBtZW1vcnkgYW5kIHBhc3MgaXQKKyAgICogb24gaW4gdGhlIGV4cGVjdGVkIGNodW5rIHNpemUuICovCisgIHdhbnRlZC5tYXhsZW5ndGggPSBzcGVjLT5zZWdzaXplICogc3BlYy0+c2VndG90YWw7CisgIHdhbnRlZC50bGVuZ3RoID0gLTE7CisgIHdhbnRlZC5wcmVidWYgPSAwOworICB3YW50ZWQubWlucmVxID0gLTE7CisgIHdhbnRlZC5mcmFnc2l6ZSA9IHNwZWMtPnNlZ3NpemU7CisKKyAgR1NUX0lORk9fT0JKRUNUIChwdWxzZXNyYywgIm1heGxlbmd0aDogJWQiLCB3YW50ZWQubWF4bGVuZ3RoKTsKKyAgR1NUX0lORk9fT0JKRUNUIChwdWxzZXNyYywgInRsZW5ndGg6ICAgJWQiLCB3YW50ZWQudGxlbmd0aCk7CisgIEdTVF9JTkZPX09CSkVDVCAocHVsc2VzcmMsICJwcmVidWY6ICAgICVkIiwgd2FudGVkLnByZWJ1Zik7CisgIEdTVF9JTkZPX09CSkVDVCAocHVsc2VzcmMsICJtaW5yZXE6ICAgICVkIiwgd2FudGVkLm1pbnJlcSk7CisgIEdTVF9JTkZPX09CSkVDVCAocHVsc2VzcmMsICJmcmFnc2l6ZTogICVkIiwgd2FudGVkLmZyYWdzaXplKTsKKworICBmbGFncyA9IFBBX1NUUkVBTV9JTlRFUlBPTEFURV9USU1JTkcgfCBQQV9TVFJFQU1fQVVUT19USU1JTkdfVVBEQVRFIHwKKyAgICAgIFBBX1NUUkVBTV9OT1RfTU9OT1RPTklDIHwgUEFfU1RSRUFNX0FESlVTVF9MQVRFTkNZIHwKKyAgICAgIFBBX1NUUkVBTV9TVEFSVF9DT1JLRUQ7CisKKyAgaWYgKHBhX3N0cmVhbV9jb25uZWN0X3JlY29yZCAocHVsc2VzcmMtPnN0cmVhbSwgcHVsc2VzcmMtPmRldmljZSwgJndhbnRlZCwKKyAgICAgICAgICBmbGFncykgPCAwKSB7CisgICAgZ290byBjb25uZWN0X2ZhaWxlZDsKKyAgfQorCisgIC8qIG91ciBjbG9jayB3aWxsIG5vdyBzdGFydCBmcm9tIDAgYWdhaW4gKi8KKyAgY2xvY2sgPSBHU1RfQVVESU9fQ0xPQ0sgKEdTVF9BVURJT19CQVNFX1NSQyAocHVsc2VzcmMpLT5jbG9jayk7CisgIGdzdF9hdWRpb19jbG9ja19yZXNldCAoY2xvY2ssIDApOworCisgIHB1bHNlc3JjLT5jb3JrZWQgPSBUUlVFOworCisgIGZvciAoOzspIHsKKyAgICBwYV9zdHJlYW1fc3RhdGVfdCBzdGF0ZTsKKworICAgIHN0YXRlID0gcGFfc3RyZWFtX2dldF9zdGF0ZSAocHVsc2VzcmMtPnN0cmVhbSk7CisKKyAgICBpZiAoIVBBX1NUUkVBTV9JU19HT09EIChzdGF0ZSkpCisgICAgICBnb3RvIHN0cmVhbV9pc19iYWQ7CisKKyAgICBpZiAoc3RhdGUgPT0gUEFfU1RSRUFNX1JFQURZKQorICAgICAgYnJlYWs7CisKKyAgICAvKiBXYWl0IHVudGlsIHRoZSBzdHJlYW0gaXMgcmVhZHkgKi8KKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0IChwdWxzZXNyYy0+bWFpbmxvb3ApOworICB9CisgIHB1bHNlc3JjLT5zdHJlYW1fY29ubmVjdGVkID0gVFJVRTsKKworICAvKiBzdG9yZSB0aGUgc291cmNlIG91dHB1dCBpbmRleCBzbyBpdCBjYW4gYmUgYWNjZXNzZWQgdmlhIGEgcHJvcGVydHkgKi8KKyAgcHVsc2VzcmMtPnNvdXJjZV9vdXRwdXRfaWR4ID0gcGFfc3RyZWFtX2dldF9pbmRleCAocHVsc2VzcmMtPnN0cmVhbSk7CisgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKHB1bHNlc3JjKSwgInNvdXJjZS1vdXRwdXQtaW5kZXgiKTsKKworICAvKiBBbHRob3VnaCBzb3VyY2Ugb3V0cHV0IHN0cmVhbSBtdXRpbmcgaXMgc3VwcG9ydGVkLCB0aGVyZSBpcyBhIGJ1ZyBpbgorICAgKiBQdWxzZUF1ZGlvIHRoYXQgZG9lc24ndCBhbGxvdyB1cyB0byBkbyB0aGlzIGF0IHN0YXJ0dXAsIHNvIHdlIG11dGUKKyAgICogbWFudWFsbHkgcG9zdC1jb25uZWN0LiBUaGlzIHNob3VsZCBiZSBtb3ZlZCBiYWNrIHByZS1jb25uZWN0IG9uY2UgdGhpbmdzCisgICAqIGFyZSBmaXhlZCBvbiB0aGUgUHVsc2VBdWRpbyBzaWRlLiAqLworICBpZiAocHVsc2VzcmMtPm11dGVfc2V0ICYmIHB1bHNlc3JjLT5tdXRlKSB7CisgICAgZ3N0X3B1bHNlc3JjX3NldF9zdHJlYW1fbXV0ZSAocHVsc2VzcmMsIHB1bHNlc3JjLT5tdXRlKTsKKyAgICBwdWxzZXNyYy0+bXV0ZV9zZXQgPSBGQUxTRTsKKyAgfQorCisgIGlmIChwdWxzZXNyYy0+dm9sdW1lX3NldCkgeworICAgIGdzdF9wdWxzZXNyY19zZXRfc3RyZWFtX3ZvbHVtZSAocHVsc2VzcmMsIHB1bHNlc3JjLT52b2x1bWUpOworICAgIHB1bHNlc3JjLT52b2x1bWVfc2V0ID0gRkFMU0U7CisgIH0KKworICAvKiBnZXQgdGhlIGFjdHVhbCBidWZmZXJpbmcgcHJvcGVydGllcyBub3cgKi8KKyAgYWN0dWFsID0gcGFfc3RyZWFtX2dldF9idWZmZXJfYXR0ciAocHVsc2VzcmMtPnN0cmVhbSk7CisKKyAgR1NUX0lORk9fT0JKRUNUIChwdWxzZXNyYywgIm1heGxlbmd0aDogJWQiLCBhY3R1YWwtPm1heGxlbmd0aCk7CisgIEdTVF9JTkZPX09CSkVDVCAocHVsc2VzcmMsICJ0bGVuZ3RoOiAgICVkICh3YW50ZWQ6ICVkKSIsCisgICAgICBhY3R1YWwtPnRsZW5ndGgsIHdhbnRlZC50bGVuZ3RoKTsKKyAgR1NUX0lORk9fT0JKRUNUIChwdWxzZXNyYywgInByZWJ1ZjogICAgJWQiLCBhY3R1YWwtPnByZWJ1Zik7CisgIEdTVF9JTkZPX09CSkVDVCAocHVsc2VzcmMsICJtaW5yZXE6ICAgICVkICh3YW50ZWQgJWQpIiwgYWN0dWFsLT5taW5yZXEsCisgICAgICB3YW50ZWQubWlucmVxKTsKKyAgR1NUX0lORk9fT0JKRUNUIChwdWxzZXNyYywgImZyYWdzaXplOiAgJWQgKHdhbnRlZCAlZCkiLAorICAgICAgYWN0dWFsLT5mcmFnc2l6ZSwgd2FudGVkLmZyYWdzaXplKTsKKworICBpZiAoYWN0dWFsLT5mcmFnc2l6ZSA+PSBzcGVjLT5zZWdzaXplKSB7CisgICAgc3BlYy0+c2Vnc2l6ZSA9IGFjdHVhbC0+ZnJhZ3NpemU7CisgIH0gZWxzZSB7CisgICAgLyogZnJhZ3NpemUgaXMgc21hbGxlciB0aGFuIHdoYXQgd2Ugd2FudGVkLCBzbyBsZXQgdGhlIHJlYWQgZnVuY3Rpb24KKyAgICAgKiBjb2FsZXNjZSB0aGUgc21hbGxlciBjaHVua3MgYXMgdGhleSBjb21lIGluICovCisgIH0KKworICAvKiBGaXggdXAgdGhlIHRvdGFsIHJpbmdidWZmZXIgc2l6ZSBiYXNlZCBvbiB3aGF0IHdlIGFjdHVhbGx5IGdvdCAqLworICBzcGVjLT5zZWd0b3RhbCA9IGFjdHVhbC0+bWF4bGVuZ3RoIC8gc3BlYy0+c2Vnc2l6ZTsKKyAgLyogRG9uJ3QgYnVmZmVyIGxlc3MgdGhhbiAyIHNlZ21lbnRzIGFzIHRoZSByaW5nYnVmZmVyIGNhbid0IGRlYWwgd2l0aCBpdCAqLworICBpZiAoc3BlYy0+c2VndG90YWwgPCAyKQorICAgIHNwZWMtPnNlZ3RvdGFsID0gMjsKKworICBpZiAoIXB1bHNlc3JjLT5wYXVzZWQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgInVuY29ya2luZyBiZWNhdXNlIHdlIGFyZSBwbGF5aW5nIik7CisgICAgZ3N0X3B1bHNlc3JjX3NldF9jb3JrZWQgKHB1bHNlc3JjLCBGQUxTRSwgRkFMU0UpOworICB9CisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2Nvbm5lY3RfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHB1bHNlc3JjLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoIkZhaWxlZCB0byBjb25uZWN0IHN0cmVhbTogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHB1bHNlc3JjLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9CitzdHJlYW1faXNfYmFkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHB1bHNlc3JjLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoIkZhaWxlZCB0byBjb25uZWN0IHN0cmVhbTogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHB1bHNlc3JjLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9Cit1bmxvY2tfYW5kX2ZhaWw6CisgIHsKKyAgICBnc3RfcHVsc2VzcmNfZGVzdHJveV9zdHJlYW0gKHB1bHNlc3JjKTsKKworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNyY19zdWNjZXNzX2NiIChwYV9zdHJlYW0gKiBzLCBpbnQgc3VjY2Vzcywgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU3JjICpwdWxzZXNyYyA9IEdTVF9QVUxTRVNSQ19DQVNUICh1c2VyZGF0YSk7CisKKyAgcHVsc2VzcmMtPm9wZXJhdGlvbl9zdWNjZXNzID0gISAhc3VjY2VzczsKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsIChwdWxzZXNyYy0+bWFpbmxvb3AsIDApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc3JjX3Jlc2V0IChHc3RBdWRpb1NyYyAqIGFzcmMpCit7CisgIEdzdFB1bHNlU3JjICpwdWxzZXNyYyA9IEdTVF9QVUxTRVNSQ19DQVNUIChhc3JjKTsKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgInJlc2V0Iik7CisKKyAgaWYgKGdzdF9wdWxzZXNyY19pc19kZWFkIChwdWxzZXNyYywgVFJVRSkpCisgICAgZ290byB1bmxvY2tfYW5kX2ZhaWw7CisKKyAgaWYgKCEobyA9CisgICAgICAgICAgcGFfc3RyZWFtX2ZsdXNoIChwdWxzZXNyYy0+c3RyZWFtLCBnc3RfcHVsc2VzcmNfc3VjY2Vzc19jYiwKKyAgICAgICAgICAgICAgcHVsc2VzcmMpKSkgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwdWxzZXNyYywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV9zdHJlYW1fZmx1c2goKSBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwdWxzZXNyYy0+Y29udGV4dCkpKSwgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9ja19hbmRfZmFpbDsKKyAgfQorCisgIHB1bHNlc3JjLT5wYXVzZWQgPSBUUlVFOworICAvKiBJbmZvcm0gYW55b25lIHdhaXRpbmcgaW4gX3dyaXRlKCkgY2FsbCB0aGF0IGl0IHNoYWxsIHdha2V1cCAqLworICBpZiAocHVsc2VzcmMtPmluX3JlYWQpIHsKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwgKHB1bHNlc3JjLT5tYWlubG9vcCwgMCk7CisgIH0KKworICBwdWxzZXNyYy0+b3BlcmF0aW9uX3N1Y2Nlc3MgPSBGQUxTRTsKKyAgd2hpbGUgKHBhX29wZXJhdGlvbl9nZXRfc3RhdGUgKG8pID09IFBBX09QRVJBVElPTl9SVU5OSU5HKSB7CisKKyAgICBpZiAoZ3N0X3B1bHNlc3JjX2lzX2RlYWQgKHB1bHNlc3JjLCBUUlVFKSkKKyAgICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAocHVsc2VzcmMtPm1haW5sb29wKTsKKyAgfQorCisgIGlmICghcHVsc2VzcmMtPm9wZXJhdGlvbl9zdWNjZXNzKSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHB1bHNlc3JjLCBSRVNPVVJDRSwgRkFJTEVELCAoIkZsdXNoIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHB1bHNlc3JjLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9CisKK3VubG9ja19hbmRfZmFpbDoKKworICBpZiAobykgeworICAgIHBhX29wZXJhdGlvbl9jYW5jZWwgKG8pOworICAgIHBhX29wZXJhdGlvbl91bnJlZiAobyk7CisgIH0KKworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKHB1bHNlc3JjLT5tYWlubG9vcCk7Cit9CisKKy8qIHVwZGF0ZSB0aGUgY29ya2VkIHN0YXRlIG9mIGEgc3RyZWFtLCBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBtYWlubG9vcAorICogbG9jayAqLworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VzcmNfc2V0X2NvcmtlZCAoR3N0UHVsc2VTcmMgKiBwc3JjLCBnYm9vbGVhbiBjb3JrZWQsIGdib29sZWFuIHdhaXQpCit7CisgIHBhX29wZXJhdGlvbiAqbyA9IE5VTEw7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBzcmMsICJzZXR0aW5nIGNvcmtlZCBzdGF0ZSB0byAlZCIsIGNvcmtlZCk7CisgIGlmICghcHNyYy0+c3RyZWFtX2Nvbm5lY3RlZCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAocHNyYy0+Y29ya2VkICE9IGNvcmtlZCkgeworICAgIGlmICghKG8gPSBwYV9zdHJlYW1fY29yayAocHNyYy0+c3RyZWFtLCBjb3JrZWQsCisgICAgICAgICAgICAgICAgZ3N0X3B1bHNlc3JjX3N1Y2Nlc3NfY2IsIHBzcmMpKSkKKyAgICAgIGdvdG8gY29ya19mYWlsZWQ7CisKKyAgICB3aGlsZSAod2FpdCAmJiBwYV9vcGVyYXRpb25fZ2V0X3N0YXRlIChvKSA9PSBQQV9PUEVSQVRJT05fUlVOTklORykgeworICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAocHNyYy0+bWFpbmxvb3ApOworICAgICAgaWYgKGdzdF9wdWxzZXNyY19pc19kZWFkIChwc3JjLCBUUlVFKSkKKyAgICAgICAgZ290byBzZXJ2ZXJfZGVhZDsKKyAgICB9CisgICAgcHNyYy0+Y29ya2VkID0gY29ya2VkOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzcmMsICJza2lwcGluZywgYWxyZWFkeSBpbiByZXF1ZXN0ZWQgc3RhdGUiKTsKKyAgfQorICByZXMgPSBUUlVFOworCitjbGVhbnVwOgorICBpZiAobykKKyAgICBwYV9vcGVyYXRpb25fdW5yZWYgKG8pOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitzZXJ2ZXJfZGVhZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzcmMsICJ0aGUgc2VydmVyIGlzIGRlYWQiKTsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KK2NvcmtfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBzcmMsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgicGFfc3RyZWFtX2NvcmsoKSBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwc3JjLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorfQorCisvKiBzdGFydC9yZXN1bWUgcGxheWJhY2sgQVNBUCAqLworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VzcmNfcGxheSAoR3N0UHVsc2VTcmMgKiBwc3JjKQoreworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChwc3JjLT5tYWlubG9vcCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHBzcmMsICJwbGF5aW5nIik7CisgIHBzcmMtPnBhdXNlZCA9IEZBTFNFOworICBnc3RfcHVsc2VzcmNfc2V0X2NvcmtlZCAocHNyYywgRkFMU0UsIEZBTFNFKTsKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChwc3JjLT5tYWlubG9vcCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIHBhdXNlL3N0b3AgcGxheWJhY2sgQVNBUCAqLworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VzcmNfcGF1c2UgKEdzdFB1bHNlU3JjICogcHNyYykKK3sKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAocHNyYy0+bWFpbmxvb3ApOworICBHU1RfREVCVUdfT0JKRUNUIChwc3JjLCAicGF1c2luZyIpOworICAvKiBtYWtlIHN1cmUgdGhlIGNvbW1pdCBtZXRob2Qgc3RvcHMgd3JpdGluZyAqLworICBwc3JjLT5wYXVzZWQgPSBUUlVFOworICBpZiAocHNyYy0+aW5fcmVhZCkgeworICAgIC8qIHdlIGFyZSB3YWl0aW5nIGluIGEgcmVhZCwgc2lnbmFsICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAocHNyYywgInNpZ25hbCByZWFkIik7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsIChwc3JjLT5tYWlubG9vcCwgMCk7CisgIH0KKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChwc3JjLT5tYWlubG9vcCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3B1bHNlc3JjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0UHVsc2VTcmMgKnRoaXMgPSBHU1RfUFVMU0VTUkNfQ0FTVCAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBpZiAoISh0aGlzLT5tYWlubG9vcCA9IHBhX3RocmVhZGVkX21haW5sb29wX25ldyAoKSkpCisgICAgICAgIGdvdG8gbWFpbmxvb3BfZmFpbGVkOworICAgICAgaWYgKHBhX3RocmVhZGVkX21haW5sb29wX3N0YXJ0ICh0aGlzLT5tYWlubG9vcCkgPCAwKSB7CisgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX2ZyZWUgKHRoaXMtPm1haW5sb29wKTsKKyAgICAgICAgdGhpcy0+bWFpbmxvb3AgPSBOVUxMOworICAgICAgICBnb3RvIG1haW5sb29wX3N0YXJ0X2ZhaWxlZDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKGVsZW1lbnQsCisgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2Nsb2NrX3Byb3ZpZGUgKEdTVF9PQkpFQ1RfQ0FTVCAoZWxlbWVudCksCisgICAgICAgICAgICAgIEdTVF9BVURJT19CQVNFX1NSQyAodGhpcyktPmNsb2NrLCBUUlVFKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1BMQVlJTkc6CisgICAgICAvKiB1bmNvcmsgYW5kIHN0YXJ0IHJlY29yZGluZyAqLworICAgICAgZ3N0X3B1bHNlc3JjX3BsYXkgKHRoaXMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgLyogc3RvcCByZWNvcmRpbmcgQVNBUCBieSBjb3JraW5nICovCisgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrICh0aGlzLT5tYWlubG9vcCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUICh0aGlzLCAiY29ya2luZyIpOworICAgICAgZ3N0X3B1bHNlc3JjX3NldF9jb3JrZWQgKHRoaXMsIFRSVUUsIEZBTFNFKTsKKyAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAodGhpcy0+bWFpbmxvb3ApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgLyogbm93IG1ha2Ugc3VyZSB3ZSBnZXQgb3V0IG9mIHRoZSBfcmVhZCBtZXRob2QgKi8KKyAgICAgIGdzdF9wdWxzZXNyY19wYXVzZSAodGhpcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGlmICh0aGlzLT5tYWlubG9vcCkKKyAgICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc3RvcCAodGhpcy0+bWFpbmxvb3ApOworCisgICAgICBnc3RfcHVsc2VzcmNfZGVzdHJveV9jb250ZXh0ICh0aGlzKTsKKworICAgICAgaWYgKHRoaXMtPm1haW5sb29wKSB7CisgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX2ZyZWUgKHRoaXMtPm1haW5sb29wKTsKKyAgICAgICAgdGhpcy0+bWFpbmxvb3AgPSBOVUxMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIC8qIGZvcm1hdF9sb3N0IGlzIHJlc2V0IGluIHJlbGVhc2UoKSBpbiBiYXNlYXVkaW9zaW5rICovCisgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKGVsZW1lbnQsCisgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2Nsb2NrX2xvc3QgKEdTVF9PQkpFQ1RfQ0FTVCAoZWxlbWVudCksCisgICAgICAgICAgICAgIEdTVF9BVURJT19CQVNFX1NSQyAodGhpcyktPmNsb2NrKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworbWFpbmxvb3BfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHRoaXMsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgicGFfdGhyZWFkZWRfbWFpbmxvb3BfbmV3KCkgZmFpbGVkIiksIChOVUxMKSk7CisgICAgcmV0dXJuIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRTsKKyAgfQorbWFpbmxvb3Bfc3RhcnRfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHRoaXMsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgicGFfdGhyZWFkZWRfbWFpbmxvb3Bfc3RhcnQoKSBmYWlsZWQiKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICB9Cit9CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2dzdF9wdWxzZXNyY19nZXRfdGltZSAoR3N0Q2xvY2sgKiBjbG9jaywgR3N0UHVsc2VTcmMgKiBzcmMpCit7CisgIHBhX3VzZWNfdCB0aW1lID0gMDsKKworICBpZiAoc3JjLT5tYWlubG9vcCA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKHNyYy0+bWFpbmxvb3ApOworICBpZiAoIXNyYy0+c3RyZWFtKQorICAgIGdvdG8gdW5sb2NrX2FuZF9vdXQ7CisKKyAgaWYgKGdzdF9wdWxzZXNyY19pc19kZWFkIChzcmMsIFRSVUUpKQorICAgIGdvdG8gdW5sb2NrX2FuZF9vdXQ7CisKKyAgaWYgKHBhX3N0cmVhbV9nZXRfdGltZSAoc3JjLT5zdHJlYW0sICZ0aW1lKSA8IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb3VsZCBub3QgZ2V0IHRpbWUiKTsKKyAgICB0aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgfSBlbHNlIHsKKyAgICB0aW1lICo9IDEwMDA7CisgIH0KKworCit1bmxvY2tfYW5kX291dDoKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChzcmMtPm1haW5sb29wKTsKKworb3V0OgorICByZXR1cm4gdGltZTsKK30KZGlmZiAtLWdpdCBhL2V4dC9wdWxzZS9wdWxzZXNyYy5oIGIvZXh0L3B1bHNlL3B1bHNlc3JjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhN2Q5NwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9wdWxzZS9wdWxzZXNyYy5oCkBAIC0wLDAgKzEsOTggQEAKKy8qLSotIE1vZGU6IEM7IGMtYmFzaWMtb2Zmc2V0OiAyIC0qLSovCisKKy8qCisgKiAgR1N0cmVhbWVyIHB1bHNlYXVkaW8gcGx1Z2luCisgKgorICogIENvcHlyaWdodCAoYykgMjAwNC0yMDA4IExlbm5hcnQgUG9ldHRlcmluZworICoKKyAqICBnc3QtcHVsc2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUKKyAqICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBnc3QtcHVsc2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIGdzdC1wdWxzZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxCisgKiAgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUFVMU0VTUkNfSF9fCisjZGVmaW5lIF9fR1NUX1BVTFNFU1JDX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb3NyYy5oPgorCisjaW5jbHVkZSA8cHVsc2UvcHVsc2VhdWRpby5oPgorI2luY2x1ZGUgPHB1bHNlL3RocmVhZC1tYWlubG9vcC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUFVMU0VTUkMgXAorICAoZ3N0X3B1bHNlc3JjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9QVUxTRVNSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1BVTFNFU1JDLEdzdFB1bHNlU3JjKSkKKyNkZWZpbmUgR1NUX1BVTFNFU1JDX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1BVTFNFU1JDLEdzdFB1bHNlU3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUFVMU0VTUkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9QVUxTRVNSQykpCisjZGVmaW5lIEdTVF9JU19QVUxTRVNSQ19DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUFVMU0VTUkMpKQorI2RlZmluZSBHU1RfUFVMU0VTUkNfQ0FTVChvYmopIFwKKyAgKChHc3RQdWxzZVNyYyAqKShvYmopKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UHVsc2VTcmMgR3N0UHVsc2VTcmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UHVsc2VTcmNDbGFzcyBHc3RQdWxzZVNyY0NsYXNzOworCitzdHJ1Y3QgX0dzdFB1bHNlU3JjCit7CisgIEdzdEF1ZGlvU3JjIHNyYzsKKworICBnY2hhciAqc2VydmVyLCAqZGV2aWNlLCAqY2xpZW50X25hbWU7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3AgKm1haW5sb29wOworCisgIHBhX2NvbnRleHQgKmNvbnRleHQ7CisgIHBhX3N0cmVhbSAqc3RyZWFtOworICBndWludDMyIHNvdXJjZV9vdXRwdXRfaWR4OworCisgIHBhX3NhbXBsZV9zcGVjIHNhbXBsZV9zcGVjOworCisgIGNvbnN0IHZvaWQgKnJlYWRfYnVmZmVyOworICBzaXplX3QgcmVhZF9idWZmZXJfbGVuZ3RoOworCisgIGdjaGFyICpkZXZpY2VfZGVzY3JpcHRpb247CisKKyAgZ2RvdWJsZSB2b2x1bWU7CisgIGdib29sZWFuIHZvbHVtZV9zZXQ6MTsKKyAgZ2Jvb2xlYW4gbXV0ZToxOworICBnYm9vbGVhbiBtdXRlX3NldDoxOworICBndWludDMyIGN1cnJlbnRfc291cmNlX2lkeDsKKyAgZ2NoYXIgKmN1cnJlbnRfc291cmNlX25hbWU7CisKKyAgZ2ludCBub3RpZnk7IC8qIGF0b21pYyAqLworCisgIGdib29sZWFuIGNvcmtlZDoxOworICBnYm9vbGVhbiBzdHJlYW1fY29ubmVjdGVkOjE7CisgIGdib29sZWFuIG9wZXJhdGlvbl9zdWNjZXNzOjE7CisgIGdib29sZWFuIHBhdXNlZDoxOworICBnYm9vbGVhbiBpbl9yZWFkOjE7CisKKyAgR3N0U3RydWN0dXJlICpwcm9wZXJ0aWVzOworICBwYV9wcm9wbGlzdCAqcHJvcGxpc3Q7Cit9OworCitzdHJ1Y3QgX0dzdFB1bHNlU3JjQ2xhc3MKK3sKKyAgR3N0QXVkaW9TcmNDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcHVsc2VzcmNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUFVMU0VTUkNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvcHVsc2UvcHVsc2V1dGlsLmMgYi9leHQvcHVsc2UvcHVsc2V1dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNhYTRiNgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9wdWxzZS9wdWxzZXV0aWwuYwpAQCAtMCwwICsxLDUwOSBAQAorLyoKKyAqICBHU3RyZWFtZXIgcHVsc2VhdWRpbyBwbHVnaW4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA0LTIwMDggTGVubmFydCBQb2V0dGVyaW5nCisgKgorICogIGdzdC1wdWxzZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICogIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIGdzdC1wdWxzZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggZ3N0LXB1bHNlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEKKyAqICBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJwdWxzZXV0aWwuaCIKKworI2lmZGVmIEhBVkVfVU5JU1REX0gKKyMgaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAgICAgICAgLyogZ2V0cGlkIG9uIFVOSVggKi8KKyNlbmRpZgorI2lmZGVmIEhBVkVfUFJPQ0VTU19ICisjIGluY2x1ZGUgPHByb2Nlc3MuaD4gICAgICAgICAgIC8qIGdldHBpZCBvbiB3aW4zMiAqLworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QKK3sKKyAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gZ3N0X3BvczsKKyAgcGFfY2hhbm5lbF9wb3NpdGlvbl90IHBhX3BvczsKK30gZ3N0X3BhX3Bvc190YWJsZVtdID0geworICB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX01PTk8sIFBBX0NIQU5ORUxfUE9TSVRJT05fTU9OT30sIHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwgUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUfSwgeworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwgUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVH0sIHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9DRU5URVIsIFBBX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9DRU5URVJ9LCB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCwgUEFfQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0xFRlR9LCB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfUklHSFQsIFBBX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVH0sIHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMSwgUEFfQ0hBTk5FTF9QT1NJVElPTl9MRkV9LCB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwgUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVJ9LCB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlRfT0ZfQ0VOVEVSLAorICAgICAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlRfT0ZfQ0VOVEVSfSwgeworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVF9PRl9DRU5URVIsCisgICAgICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFRfT0ZfQ0VOVEVSfSwgeworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQsIFBBX0NIQU5ORUxfUE9TSVRJT05fU0lERV9MRUZUfSwgeworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX1JJR0hULCBQQV9DSEFOTkVMX1BPU0lUSU9OX1NJREVfUklHSFR9LCB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9DRU5URVIsIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX0NFTlRFUn0sIHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX0xFRlQsCisgICAgICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX0xFRlR9LCB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9SSUdIVCwKKyAgICAgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfRlJPTlRfUklHSFR9LCB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9DRU5URVIsCisgICAgICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX0NFTlRFUn0sIHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX1JFQVJfTEVGVCwgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9MRUZUfSwgeworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9SSUdIVCwKKyAgICAgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9SSUdIVH0sIHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX1JFQVJfQ0VOVEVSLAorICAgICAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX0NFTlRFUn0sIHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTk9ORSwgUEFfQ0hBTk5FTF9QT1NJVElPTl9JTlZBTElEfQorfTsKKworc3RhdGljIGdib29sZWFuCitnc3RhdWRpb2Zvcm1hdF90b19wYXNhbXBsZWZvcm1hdCAoR3N0QXVkaW9Gb3JtYXQgZm9ybWF0LAorICAgIHBhX3NhbXBsZV9mb3JtYXRfdCAqIHNmKQoreworICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9VODoKKyAgICAgICpzZiA9IFBBX1NBTVBMRV9VODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMTZMRToKKyAgICAgICpzZiA9IFBBX1NBTVBMRV9TMTZMRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMTZCRToKKyAgICAgICpzZiA9IFBBX1NBTVBMRV9TMTZCRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GMzJMRToKKyAgICAgICpzZiA9IFBBX1NBTVBMRV9GTE9BVDMyTEU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfRjMyQkU6CisgICAgICAqc2YgPSBQQV9TQU1QTEVfRkxPQVQzMkJFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MzMkxFOgorICAgICAgKnNmID0gUEFfU0FNUExFX1MzMkxFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MzMkJFOgorICAgICAgKnNmID0gUEFfU0FNUExFX1MzMkJFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MyNExFOgorICAgICAgKnNmID0gUEFfU0FNUExFX1MyNExFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MyNEJFOgorICAgICAgKnNmID0gUEFfU0FNUExFX1MyNEJFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MyNF8zMkxFOgorICAgICAgKnNmID0gUEFfU0FNUExFX1MyNF8zMkxFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MyNF8zMkJFOgorICAgICAgKnNmID0gUEFfU0FNUExFX1MyNF8zMkJFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK2dzdF9wdWxzZV9maWxsX3NhbXBsZV9zcGVjIChHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYywgcGFfc2FtcGxlX3NwZWMgKiBzcykKK3sKKyAgaWYgKHNwZWMtPnR5cGUgPT0gR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX1JBVykgeworICAgIGlmICghZ3N0YXVkaW9mb3JtYXRfdG9fcGFzYW1wbGVmb3JtYXQgKEdTVF9BVURJT19JTkZPX0ZPUk1BVCAoJnNwZWMtPmluZm8pLAorICAgICAgICAgICAgJnNzLT5mb3JtYXQpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9IGVsc2UgaWYgKHNwZWMtPnR5cGUgPT0gR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX01VX0xBVykgeworICAgIHNzLT5mb3JtYXQgPSBQQV9TQU1QTEVfVUxBVzsKKyAgfSBlbHNlIGlmIChzcGVjLT50eXBlID09IEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9BX0xBVykgeworICAgIHNzLT5mb3JtYXQgPSBQQV9TQU1QTEVfQUxBVzsKKyAgfSBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworCisgIHNzLT5jaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTICgmc3BlYy0+aW5mbyk7CisgIHNzLT5yYXRlID0gR1NUX0FVRElPX0lORk9fUkFURSAoJnNwZWMtPmluZm8pOworCisgIGlmICghcGFfc2FtcGxlX3NwZWNfdmFsaWQgKHNzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitnc3RfcHVsc2VfZmlsbF9mb3JtYXRfaW5mbyAoR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMsIHBhX2Zvcm1hdF9pbmZvICoqIGYsCisgICAgZ3VpbnQgKiBjaGFubmVscykKK3sKKyAgcGFfZm9ybWF0X2luZm8gKmZvcm1hdDsKKyAgcGFfc2FtcGxlX2Zvcm1hdF90IHNmID0gUEFfU0FNUExFX0lOVkFMSUQ7CisgIEdzdEF1ZGlvSW5mbyAqYWluZm8gPSAmc3BlYy0+aW5mbzsKKworICBmb3JtYXQgPSBwYV9mb3JtYXRfaW5mb19uZXcgKCk7CisKKyAgaWYgKHNwZWMtPnR5cGUgPT0gR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX01VX0xBVykgeworICAgIGZvcm1hdC0+ZW5jb2RpbmcgPSBQQV9FTkNPRElOR19QQ007CisgICAgc2YgPSBQQV9TQU1QTEVfVUxBVzsKKyAgfSBlbHNlIGlmIChzcGVjLT50eXBlID09IEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9BX0xBVykgeworICAgIGZvcm1hdC0+ZW5jb2RpbmcgPSBQQV9FTkNPRElOR19QQ007CisgICAgc2YgPSBQQV9TQU1QTEVfQUxBVzsKKyAgfSBlbHNlIGlmIChzcGVjLT50eXBlID09IEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9SQVcpIHsKKyAgICBmb3JtYXQtPmVuY29kaW5nID0gUEFfRU5DT0RJTkdfUENNOworICAgIGlmICghZ3N0YXVkaW9mb3JtYXRfdG9fcGFzYW1wbGVmb3JtYXQgKEdTVF9BVURJT19JTkZPX0ZPUk1BVCAoYWluZm8pLCAmc2YpKQorICAgICAgZ290byBmYWlsOworICB9IGVsc2UgaWYgKHNwZWMtPnR5cGUgPT0gR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX0FDMykgeworICAgIGZvcm1hdC0+ZW5jb2RpbmcgPSBQQV9FTkNPRElOR19BQzNfSUVDNjE5Mzc7CisgIH0gZWxzZSBpZiAoc3BlYy0+dHlwZSA9PSBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfRUFDMykgeworICAgIGZvcm1hdC0+ZW5jb2RpbmcgPSBQQV9FTkNPRElOR19FQUMzX0lFQzYxOTM3OworICB9IGVsc2UgaWYgKHNwZWMtPnR5cGUgPT0gR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX0RUUykgeworICAgIGZvcm1hdC0+ZW5jb2RpbmcgPSBQQV9FTkNPRElOR19EVFNfSUVDNjE5Mzc7CisgIH0gZWxzZSBpZiAoc3BlYy0+dHlwZSA9PSBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfTVBFRykgeworICAgIGZvcm1hdC0+ZW5jb2RpbmcgPSBQQV9FTkNPRElOR19NUEVHX0lFQzYxOTM3OworI2lmIFBBX0NIRUNLX1ZFUlNJT04oMyw5OSwwKQorICB9IGVsc2UgaWYgKHNwZWMtPnR5cGUgPT0gR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX01QRUcyX0FBQykgeworICAgIGZvcm1hdC0+ZW5jb2RpbmcgPSBQQV9FTkNPRElOR19NUEVHMl9BQUNfSUVDNjE5Mzc7CisgIH0gZWxzZSBpZiAoc3BlYy0+dHlwZSA9PSBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfTVBFRzRfQUFDKSB7CisgICAgLyogSEFDSy4gdHJlYXQgTVBFRzQgQUFDIGFzIE1QRUcyIEFBQyBmb3IgdGhlIG1vbWVudCAqLworICAgIGZvcm1hdC0+ZW5jb2RpbmcgPSBQQV9FTkNPRElOR19NUEVHMl9BQUNfSUVDNjE5Mzc7CisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICBnb3RvIGZhaWw7CisgIH0KKworICBpZiAoZm9ybWF0LT5lbmNvZGluZyA9PSBQQV9FTkNPRElOR19QQ00pIHsKKyAgICBwYV9mb3JtYXRfaW5mb19zZXRfc2FtcGxlX2Zvcm1hdCAoZm9ybWF0LCBzZik7CisgICAgcGFfZm9ybWF0X2luZm9fc2V0X2NoYW5uZWxzIChmb3JtYXQsIEdTVF9BVURJT19JTkZPX0NIQU5ORUxTIChhaW5mbykpOworICB9CisKKyAgcGFfZm9ybWF0X2luZm9fc2V0X3JhdGUgKGZvcm1hdCwgR1NUX0FVRElPX0lORk9fUkFURSAoYWluZm8pKTsKKworICBpZiAoIXBhX2Zvcm1hdF9pbmZvX3ZhbGlkIChmb3JtYXQpKQorICAgIGdvdG8gZmFpbDsKKworICAqZiA9IGZvcm1hdDsKKyAgKmNoYW5uZWxzID0gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKGFpbmZvKTsKKworICByZXR1cm4gVFJVRTsKKworZmFpbDoKKyAgaWYgKGZvcm1hdCkKKyAgICBwYV9mb3JtYXRfaW5mb19mcmVlIChmb3JtYXQpOworICByZXR1cm4gRkFMU0U7Cit9CisKK2NvbnN0IGNoYXIgKgorZ3N0X3B1bHNlX3NhbXBsZV9mb3JtYXRfdG9fY2Fwc19mb3JtYXQgKHBhX3NhbXBsZV9mb3JtYXRfdCBzZikKK3sKKyAgc3dpdGNoIChzZikgeworICAgIGNhc2UgUEFfU0FNUExFX1U4OgorICAgICAgcmV0dXJuICJVOCI7CisKKyAgICBjYXNlIFBBX1NBTVBMRV9TMTZMRToKKyAgICAgIHJldHVybiAiUzE2TEUiOworCisgICAgY2FzZSBQQV9TQU1QTEVfUzE2QkU6CisgICAgICByZXR1cm4gIlMxNkJFIjsKKworICAgIGNhc2UgUEFfU0FNUExFX0ZMT0FUMzJMRToKKyAgICAgIHJldHVybiAiRjMyTEUiOworCisgICAgY2FzZSBQQV9TQU1QTEVfRkxPQVQzMkJFOgorICAgICAgcmV0dXJuICJGMzJCRSI7CisKKyAgICBjYXNlIFBBX1NBTVBMRV9TMzJMRToKKyAgICAgIHJldHVybiAiUzMyTEUiOworCisgICAgY2FzZSBQQV9TQU1QTEVfUzMyQkU6CisgICAgICByZXR1cm4gIlMzMkJFIjsKKworICAgIGNhc2UgUEFfU0FNUExFX1MyNExFOgorICAgICAgcmV0dXJuICJTMjRMRSI7CisKKyAgICBjYXNlIFBBX1NBTVBMRV9TMjRCRToKKyAgICAgIHJldHVybiAiUzI0QkUiOworCisgICAgY2FzZSBQQV9TQU1QTEVfUzI0XzMyTEU6CisgICAgICByZXR1cm4gIlMyNF8zMkxFIjsKKworICAgIGNhc2UgUEFfU0FNUExFX1MyNF8zMkJFOgorICAgICAgcmV0dXJuICJTMjRfMzJCRSI7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworLyogUEFUSF9NQVggaXMgbm90IGRlZmluZWQgZXZlcnl3aGVyZSwgZS5nLiBvbiBHTlUgSHVyZCAqLworI2lmbmRlZiBQQVRIX01BWAorI2RlZmluZSBQQVRIX01BWCA0MDk2CisjZW5kaWYKKworZ2NoYXIgKgorZ3N0X3B1bHNlX2NsaWVudF9uYW1lICh2b2lkKQoreworICBnY2hhciBidWZbUEFUSF9NQVhdOworCisgIGNvbnN0IGNoYXIgKmM7CisKKyAgaWYgKChjID0gZ19nZXRfYXBwbGljYXRpb25fbmFtZSAoKSkpCisgICAgcmV0dXJuIGdfc3RyZHVwIChjKTsKKyAgZWxzZSBpZiAocGFfZ2V0X2JpbmFyeV9uYW1lIChidWYsIHNpemVvZiAoYnVmKSkpCisgICAgcmV0dXJuIGdfc3RyZHVwIChidWYpOworICBlbHNlCisgICAgcmV0dXJuIGdfc3RyZHVwX3ByaW50ZiAoIkdTdHJlYW1lci1waWQtJWx1IiwgKGd1bG9uZykgZ2V0cGlkICgpKTsKK30KKworcGFfY2hhbm5lbF9tYXAgKgorZ3N0X3B1bHNlX2dzdF90b19jaGFubmVsX21hcCAocGFfY2hhbm5lbF9tYXAgKiBtYXAsCisgICAgY29uc3QgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpCit7CisgIGdpbnQgaSwgajsKKyAgZ2ludCBjaGFubmVsczsKKyAgY29uc3QgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gKnBvczsKKworICBwYV9jaGFubmVsX21hcF9pbml0IChtYXApOworCisgIGNoYW5uZWxzID0gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKCZzcGVjLT5pbmZvKTsKKyAgcG9zID0gc3BlYy0+aW5mby5wb3NpdGlvbjsKKworICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBHX05fRUxFTUVOVFMgKGdzdF9wYV9wb3NfdGFibGUpOyBpKyspIHsKKyAgICAgIGlmIChwb3Nbal0gPT0gZ3N0X3BhX3Bvc190YWJsZVtpXS5nc3RfcG9zKSB7CisgICAgICAgIG1hcC0+bWFwW2pdID0gZ3N0X3BhX3Bvc190YWJsZVtpXS5wYV9wb3M7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA9PSBHX05fRUxFTUVOVFMgKGdzdF9wYV9wb3NfdGFibGUpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAoaiAhPSBzcGVjLT5pbmZvLmNoYW5uZWxzKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBtYXAtPmNoYW5uZWxzID0gc3BlYy0+aW5mby5jaGFubmVsczsKKworICBpZiAoIXBhX2NoYW5uZWxfbWFwX3ZhbGlkIChtYXApKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gbWFwOworfQorCitHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICoKK2dzdF9wdWxzZV9jaGFubmVsX21hcF90b19nc3QgKGNvbnN0IHBhX2NoYW5uZWxfbWFwICogbWFwLAorICAgIEdzdEF1ZGlvUmluZ0J1ZmZlclNwZWMgKiBzcGVjKQoreworICBnaW50IGksIGo7CisgIGdib29sZWFuIGludmFsaWQgPSBGQUxTRTsKKyAgZ2ludCBjaGFubmVsczsKKyAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gKnBvczsKKworICBjaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTICgmc3BlYy0+aW5mbyk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1hcC0+Y2hhbm5lbHMgPT0gY2hhbm5lbHMsIE5VTEwpOworCisgIHBvcyA9IHNwZWMtPmluZm8ucG9zaXRpb247CisKKyAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspIHsKKyAgICBmb3IgKGkgPSAwOyBqIDwgY2hhbm5lbHMgJiYgaSA8IEdfTl9FTEVNRU5UUyAoZ3N0X3BhX3Bvc190YWJsZSk7IGkrKykgeworICAgICAgaWYgKG1hcC0+bWFwW2pdID09IGdzdF9wYV9wb3NfdGFibGVbaV0ucGFfcG9zKSB7CisgICAgICAgIHBvc1tqXSA9IGdzdF9wYV9wb3NfdGFibGVbaV0uZ3N0X3BvczsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmIChpID09IEdfTl9FTEVNRU5UUyAoZ3N0X3BhX3Bvc190YWJsZSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmICghaW52YWxpZAorICAgICAgJiYgIWdzdF9hdWRpb19jaGVja192YWxpZF9jaGFubmVsX3Bvc2l0aW9ucyAocG9zLCBjaGFubmVscywgRkFMU0UpKQorICAgIGludmFsaWQgPSBUUlVFOworCisgIGlmIChpbnZhbGlkKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspCisgICAgICBwb3NbaV0gPSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FOworICB9IGVsc2UgeworICAgIGlmIChwb3NbMF0gIT0gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTk9ORSkKKyAgICAgIHNwZWMtPmluZm8uZmxhZ3MgJj0gfkdTVF9BVURJT19GTEFHX1VOUE9TSVRJT05FRDsKKyAgfQorCisgIHJldHVybiBzcGVjOworfQorCit2b2lkCitnc3RfcHVsc2VfY3ZvbHVtZV9mcm9tX2xpbmVhciAocGFfY3ZvbHVtZSAqIHYsIHVuc2lnbmVkIGNoYW5uZWxzLAorICAgIGdkb3VibGUgdm9sdW1lKQoreworICBwYV9jdm9sdW1lX3NldCAodiwgY2hhbm5lbHMsIHBhX3N3X3ZvbHVtZV9mcm9tX2xpbmVhciAodm9sdW1lKSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorbWFrZV9wcm9wbGlzdF9pdGVtIChHUXVhcmsgZmllbGRfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIHBhX3Byb3BsaXN0ICpwID0gKHBhX3Byb3BsaXN0ICopIHVzZXJfZGF0YTsKKyAgZ2NoYXIgKnByb3BfaWQgPSAoZ2NoYXIgKikgZ19xdWFya190b19zdHJpbmcgKGZpZWxkX2lkKTsKKworICAvKiBodHRwOi8vMHBvaW50ZXIuZGUvbGVubmFydC9wcm9qZWN0cy9wdWxzZWF1ZGlvL2RveHlnZW4vcHJvcGxpc3RfOGguaHRtbCAqLworCisgIC8qIG1hdGNoIHByb3AgaWQgKi8KKworICAvKiBjaGVjayB0eXBlICovCisgIHN3aXRjaCAoR19WQUxVRV9UWVBFICh2YWx1ZSkpIHsKKyAgICBjYXNlIEdfVFlQRV9TVFJJTkc6CisgICAgICBwYV9wcm9wbGlzdF9zZXRzIChwLCBwcm9wX2lkLCBnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX1dBUk5JTkcgKCJ1bm1hcHBlZCBwcm9wZXJ0eSB0eXBlICVzIiwgR19WQUxVRV9UWVBFX05BTUUgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitwYV9wcm9wbGlzdCAqCitnc3RfcHVsc2VfbWFrZV9wcm9wbGlzdCAoY29uc3QgR3N0U3RydWN0dXJlICogcHJvcGVydGllcykKK3sKKyAgcGFfcHJvcGxpc3QgKnByb3BsaXN0ID0gcGFfcHJvcGxpc3RfbmV3ICgpOworCisgIC8qIGl0ZXJhdGUgdGhlIHN0cnVjdHVyZSBhbmQgZmlsbCB0aGUgcHJvcGxpc3QgKi8KKyAgZ3N0X3N0cnVjdHVyZV9mb3JlYWNoIChwcm9wZXJ0aWVzLCBtYWtlX3Byb3BsaXN0X2l0ZW0sIHByb3BsaXN0KTsKKyAgcmV0dXJuIHByb3BsaXN0OworfQorCitHc3RTdHJ1Y3R1cmUgKgorZ3N0X3B1bHNlX21ha2Vfc3RydWN0dXJlIChwYV9wcm9wbGlzdCAqIHByb3BlcnRpZXMpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RyOworICB2b2lkICpzdGF0ZSA9IE5VTEw7CisKKyAgc3RyID0gZ3N0X3N0cnVjdHVyZV9uZXdfZW1wdHkgKCJwdWxzZS1wcm9wbGlzdCIpOworCisgIHdoaWxlIChUUlVFKSB7CisgICAgY29uc3QgY2hhciAqa2V5LCAqdmFsOworCisgICAga2V5ID0gcGFfcHJvcGxpc3RfaXRlcmF0ZSAocHJvcGVydGllcywgJnN0YXRlKTsKKyAgICBpZiAoa2V5ID09IE5VTEwpCisgICAgICBicmVhazsKKworICAgIHZhbCA9IHBhX3Byb3BsaXN0X2dldHMgKHByb3BlcnRpZXMsIGtleSk7CisKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAoc3RyLCBrZXksIEdfVFlQRV9TVFJJTkcsIHZhbCwgTlVMTCk7CisgIH0KKyAgcmV0dXJuIHN0cjsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VfZm9ybWF0X2luZm9faW50X3Byb3BfdG9fdmFsdWUgKHBhX2Zvcm1hdF9pbmZvICogZm9ybWF0LAorICAgIGNvbnN0IGNoYXIgKmtleSwgR1ZhbHVlICogdmFsdWUpCit7CisgIEdWYWx1ZSB2ID0geyAwLCB9OworICBpbnQgaTsKKyAgaW50ICphLCBuOworICBpbnQgbWluLCBtYXg7CisKKyAgaWYgKHBhX2Zvcm1hdF9pbmZvX2dldF9wcm9wX2ludCAoZm9ybWF0LCBrZXksICZpKSA9PSAwKSB7CisgICAgZ192YWx1ZV9pbml0ICh2YWx1ZSwgR19UWVBFX0lOVCk7CisgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgaSk7CisKKyAgfSBlbHNlIGlmIChwYV9mb3JtYXRfaW5mb19nZXRfcHJvcF9pbnRfYXJyYXkgKGZvcm1hdCwga2V5LCAmYSwgJm4pID09IDApIHsKKyAgICBnX3ZhbHVlX2luaXQgKHZhbHVlLCBHU1RfVFlQRV9MSVNUKTsKKyAgICBnX3ZhbHVlX2luaXQgKCZ2LCBHX1RZUEVfSU5UKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAoJnYsIGFbaV0pOworICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICh2YWx1ZSwgJnYpOworICAgIH0KKworICAgIHBhX3hmcmVlIChhKTsKKworICB9IGVsc2UgaWYgKHBhX2Zvcm1hdF9pbmZvX2dldF9wcm9wX2ludF9yYW5nZSAoZm9ybWF0LCBrZXksICZtaW4sICZtYXgpID09IDApIHsKKyAgICBnX3ZhbHVlX2luaXQgKHZhbHVlLCBHU1RfVFlQRV9JTlRfUkFOR0UpOworICAgIGdzdF92YWx1ZV9zZXRfaW50X3JhbmdlICh2YWx1ZSwgbWluLCBtYXgpOworCisgIH0gZWxzZSB7CisgICAgLyogUHJvcGVydHkgbm90IGF2YWlsYWJsZSBvciBpcyBub3QgYW4gaW50IHR5cGUgKi8KKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworR3N0Q2FwcyAqCitnc3RfcHVsc2VfZm9ybWF0X2luZm9fdG9fY2FwcyAocGFfZm9ybWF0X2luZm8gKiBmb3JtYXQpCit7CisgIEdzdENhcHMgKnJldCA9IE5VTEw7CisgIEdWYWx1ZSB2ID0geyAwLCB9OworICBwYV9zYW1wbGVfc3BlYyBzczsKKworICBzd2l0Y2ggKGZvcm1hdC0+ZW5jb2RpbmcpIHsKKyAgICBjYXNlIFBBX0VOQ09ESU5HX1BDTTp7CisgICAgICBjaGFyICp0bXAgPSBOVUxMOworCisgICAgICBwYV9mb3JtYXRfaW5mb190b19zYW1wbGVfc3BlYyAoZm9ybWF0LCAmc3MsIE5VTEwpOworCisgICAgICBpZiAocGFfZm9ybWF0X2luZm9fZ2V0X3Byb3Bfc3RyaW5nIChmb3JtYXQsCisgICAgICAgICAgICAgIFBBX1BST1BfRk9STUFUX1NBTVBMRV9GT1JNQVQsICZ0bXApKSB7CisgICAgICAgIC8qIE5vIHNwZWNpZmljIHNhbXBsZSBmb3JtYXQgbWVhbnMgYW55IHNhbXBsZSBmb3JtYXQgKi8KKyAgICAgICAgcmV0ID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKF9QVUxTRV9DQVBTX1BDTSk7CisgICAgICAgIGdvdG8gb3V0OworCisgICAgICB9IGVsc2UgaWYgKHNzLmZvcm1hdCA9PSBQQV9TQU1QTEVfQUxBVykgeworICAgICAgICByZXQgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoX1BVTFNFX0NBUFNfQUxBVyk7CisKKyAgICAgIH0gZWxzZSBpZiAoc3MuZm9ybWF0ID09IFBBX1NBTVBMRV9VTEFXKSB7CisgICAgICAgIHJldCA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChfUFVMU0VfQ0FQU19NVUxBVyk7CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIExpbmVhciBQQ00gZm9ybWF0ICovCisgICAgICAgIGNvbnN0IGNoYXIgKnNmb3JtYXQgPQorICAgICAgICAgICAgZ3N0X3B1bHNlX3NhbXBsZV9mb3JtYXRfdG9fY2Fwc19mb3JtYXQgKHNzLmZvcm1hdCk7CisKKyAgICAgICAgcmV0ID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKF9QVUxTRV9DQVBTX0xJTkVBUik7CisKKyAgICAgICAgaWYgKHNmb3JtYXQpCisgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAocmV0LCAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgTlVMTCk7CisgICAgICB9CisKKyAgICAgIHBhX3hmcmVlICh0bXApOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBQQV9FTkNPRElOR19BQzNfSUVDNjE5Mzc6CisgICAgICByZXQgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoX1BVTFNFX0NBUFNfQUMzKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBQQV9FTkNPRElOR19FQUMzX0lFQzYxOTM3OgorICAgICAgcmV0ID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKF9QVUxTRV9DQVBTX0VBQzMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBBX0VOQ09ESU5HX0RUU19JRUM2MTkzNzoKKyAgICAgIHJldCA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChfUFVMU0VfQ0FQU19EVFMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBBX0VOQ09ESU5HX01QRUdfSUVDNjE5Mzc6CisgICAgICByZXQgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoX1BVTFNFX0NBUFNfTVAzKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9XQVJOSU5HICgiRm91bmQgYSBQQSBmb3JtYXQgdGhhdCB3ZSBkb24ndCBzdXBwb3J0IHlldCIpOworICAgICAgZ290byBvdXQ7CisgIH0KKworICBpZiAoZ3N0X3B1bHNlX2Zvcm1hdF9pbmZvX2ludF9wcm9wX3RvX3ZhbHVlIChmb3JtYXQsIFBBX1BST1BfRk9STUFUX1JBVEUsICZ2KSkKKyAgICBnc3RfY2Fwc19zZXRfdmFsdWUgKHJldCwgInJhdGUiLCAmdik7CisKKyAgZ192YWx1ZV91bnNldCAoJnYpOworCisgIGlmIChnc3RfcHVsc2VfZm9ybWF0X2luZm9faW50X3Byb3BfdG9fdmFsdWUgKGZvcm1hdCwgUEFfUFJPUF9GT1JNQVRfQ0hBTk5FTFMsCisgICAgICAgICAgJnYpKQorICAgIGdzdF9jYXBzX3NldF92YWx1ZSAocmV0LCAiY2hhbm5lbHMiLCAmdik7CisKK291dDoKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2V4dC9wdWxzZS9wdWxzZXV0aWwuaCBiL2V4dC9wdWxzZS9wdWxzZXV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjExNDI0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3B1bHNlL3B1bHNldXRpbC5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiAgR1N0cmVhbWVyIHB1bHNlYXVkaW8gcGx1Z2luCisgKgorICogIENvcHlyaWdodCAoYykgMjAwNC0yMDA4IExlbm5hcnQgUG9ldHRlcmluZworICoKKyAqICBnc3QtcHVsc2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUKKyAqICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBnc3QtcHVsc2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIGdzdC1wdWxzZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxCisgKiAgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUFVMU0VVVElMX0hfXworI2RlZmluZSBfX0dTVF9QVUxTRVVUSUxfSF9fCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxwdWxzZS9wdWxzZWF1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvcmluZ2J1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb3NpbmsuaD4KKworCisjaWYgKEdfQllURV9PUkRFUiA9PSBHX0xJVFRMRV9FTkRJQU4pCisjIGRlZmluZSBfUFVMU0VfRk9STUFUUyAgICJ7IFMxNkxFLCBTMTZCRSwgRjMyTEUsIEYzMkJFLCBTMzJMRSwgUzMyQkUsICIgXAorICAgICAgICAgICAgICAgICAgICAgIlMyNExFLCBTMjRCRSwgUzI0XzMyTEUsIFMyNF8zMkJFLCBVOCB9IgorI2Vsc2UKKyMgZGVmaW5lIF9QVUxTRV9GT1JNQVRTICAgInsgUzE2QkUsIFMxNkxFLCBGMzJCRSwgRjMyTEUsIFMzMkJFLCBTMzJMRSwgIiBcCisgICAgICAgICAgICAgICAgICAgICAiUzI0QkUsIFMyNExFLCBTMjRfMzJCRSwgUzI0XzMyTEUsIFU4IH0iCisjZW5kaWYKKworI2RlZmluZSBfUFVMU0VfQ0FQU19MSU5FQVIgXAorICAgICJhdWRpby94LXJhdywgIiBcCisgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBfUFVMU0VfRk9STUFUUyAiLCAiIFwKKyAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiBcCisgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIgXAorICAgICAgImNoYW5uZWxzID0gKGludCkgWyAxLCAzMiBdOyAiCisjZGVmaW5lIF9QVUxTRV9DQVBTX0FMQVcgXAorICAgICJhdWRpby94LWFsYXcsICIgXAorICAgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWF0sICIgXAorICAgICAgImNoYW5uZWxzID0gKGludCkgWyAxLCAzMiBdOyAiCisjZGVmaW5lIF9QVUxTRV9DQVBTX01VTEFXIFwKKyAgICAiYXVkaW8veC1tdWxhdywgIiBcCisgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYXSwgIiBcCisgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDMyIF07ICIKKworI2RlZmluZSBfUFVMU0VfQ0FQU19BQzMgImF1ZGlvL3gtYWMzLCBmcmFtZWQgPSAoYm9vbGVhbikgdHJ1ZTsgIgorI2RlZmluZSBfUFVMU0VfQ0FQU19FQUMzICJhdWRpby94LWVhYzMsIGZyYW1lZCA9IChib29sZWFuKSB0cnVlOyAiCisjZGVmaW5lIF9QVUxTRV9DQVBTX0RUUyAiYXVkaW8veC1kdHMsIGZyYW1lZCA9IChib29sZWFuKSB0cnVlLCAiIFwKKyAgICAiYmxvY2stc2l6ZSA9IChpbnQpIHsgNTEyLCAxMDI0LCAyMDQ4IH07ICIKKyNkZWZpbmUgX1BVTFNFX0NBUFNfTVAzICJhdWRpby9tcGVnLCBtcGVndmVyc2lvbiA9IChpbnQpIDEsICIgXAorICAgICJtcGVnYXVkaW92ZXJzaW9uID0gKGludCkgWyAxLCAzIF0sIHBhcnNlZCA9IChib29sZWFuKSB0cnVlOyIKKyNkZWZpbmUgX1BVTFNFX0NBUFNfQUFDICJhdWRpby9tcGVnLCBtcGVndmVyc2lvbiA9IChpbnQpIHsgMiwgNCB9LCAiIFwKKyAgICAiZnJhbWVkID0gKGJvb2xlYW4pIHRydWUsIHN0cmVhbS1mb3JtYXQgPSAoc3RyaW5nKSBhZHRzOyIKKworI2RlZmluZSBfUFVMU0VfQ0FQU19QQ00gXAorICBfUFVMU0VfQ0FQU19MSU5FQVIgXAorICBfUFVMU0VfQ0FQU19BTEFXIFwKKyAgX1BVTFNFX0NBUFNfTVVMQVcKKworCitnYm9vbGVhbiBnc3RfcHVsc2VfZmlsbF9zYW1wbGVfc3BlYyAoR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMsCisgICAgcGFfc2FtcGxlX3NwZWMgKiBzcyk7CitnYm9vbGVhbiBnc3RfcHVsc2VfZmlsbF9mb3JtYXRfaW5mbyAoR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMsCisgICAgcGFfZm9ybWF0X2luZm8gKiogZiwgZ3VpbnQgKiBjaGFubmVscyk7Citjb25zdCBjaGFyICogZ3N0X3B1bHNlX3NhbXBsZV9mb3JtYXRfdG9fY2Fwc19mb3JtYXQgKHBhX3NhbXBsZV9mb3JtYXRfdCBzZik7CisKK2djaGFyICpnc3RfcHVsc2VfY2xpZW50X25hbWUgKHZvaWQpOworCitwYV9jaGFubmVsX21hcCAqZ3N0X3B1bHNlX2dzdF90b19jaGFubmVsX21hcCAocGFfY2hhbm5lbF9tYXAgKiBtYXAsCisgICAgY29uc3QgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpOworCitHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICpnc3RfcHVsc2VfY2hhbm5lbF9tYXBfdG9fZ3N0IChjb25zdCBwYV9jaGFubmVsX21hcCAqIG1hcCwKKyAgICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYyk7CisKK3ZvaWQgZ3N0X3B1bHNlX2N2b2x1bWVfZnJvbV9saW5lYXIgKHBhX2N2b2x1bWUgKnYsIHVuc2lnbmVkIGNoYW5uZWxzLCBnZG91YmxlIHZvbHVtZSk7CisKK3BhX3Byb3BsaXN0ICpnc3RfcHVsc2VfbWFrZV9wcm9wbGlzdCAoY29uc3QgR3N0U3RydWN0dXJlICpwcm9wZXJ0aWVzKTsKK0dzdFN0cnVjdHVyZSAqZ3N0X3B1bHNlX21ha2Vfc3RydWN0dXJlIChwYV9wcm9wbGlzdCAqcHJvcGVydGllcyk7CisKK0dzdENhcHMgKiBnc3RfcHVsc2VfZm9ybWF0X2luZm9fdG9fY2FwcyAocGFfZm9ybWF0X2luZm8gKiBmb3JtYXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4dC9yYXcxMzk0Ly5naXRpZ25vcmUgYi9leHQvcmF3MTM5NC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YjUxODYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcmF3MTM5NC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKK2xpYmdzdDEzOTRfbGEtZ3N0ZHYxMzk0c3JjLmxvVApkaWZmIC0tZ2l0IGEvZXh0L3JhdzEzOTQvTWFrZWZpbGUuYW0gYi9leHQvcmF3MTM5NC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWI2YTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3JhdzEzOTQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyOCBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0MTM5NC5sYQorCitpZiBVU0VfTElCSUVDNjE4ODMKK2hkdnNvdXJjZSA9IGdzdGhkdjEzOTRzcmMuYworaGR2aGVhZGVycyA9IGdzdGhkdjEzOTRzcmMuaAorZWxzZQoraGR2c291cmNlID0gCitoZHZoZWFkZXJzID0gCitlbmRpZgorCitsaWJnc3QxMzk0X2xhX1NPVVJDRVMgPSBcCisJZ3N0MTM5NC5jIGdzdDEzOTRwcm9iZS5jIGdzdGR2MTM5NHNyYy5jICQoaGR2c291cmNlKSBcCisJZ3N0MTM5NGNsb2NrLmMKK2xpYmdzdDEzOTRfbGFfQ0ZMQUdTID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9CQVNFX0NGTEFHUykgXAorCSQoR1NUX0NGTEFHUykgXAorCSQoRFYxMzk0X0NGTEFHUykKK2xpYmdzdDEzOTRfbGFfTElCQUREID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSBcCisJJChHU1RfQkFTRV9MSUJTKSBcCisJJChHU1RfTElCUykgXAorCSQoRFYxMzk0X0xJQlMpCitsaWJnc3QxMzk0X2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3RkdjEzOTRzcmMuaCBnc3QxMzk0cHJvYmUuaCAkKGhkdmhlYWRlcnMpIFwKKwlnc3QxMzk0Y2xvY2suaAorCmRpZmYgLS1naXQgYS9leHQvcmF3MTM5NC9nc3QxMzk0LmMgYi9leHQvcmF3MTM5NC9nc3QxMzk0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdhOWU5MwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9yYXcxMzk0L2dzdDEzOTQuYwpAQCAtMCwwICsxLDUxIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisKKyNpbmNsdWRlICJnc3RkdjEzOTRzcmMuaCIKKyNpZmRlZiBIQVZFX0xJQklFQzYxODgzCisjaW5jbHVkZSAiZ3N0aGR2MTM5NHNyYy5oIgorI2VuZGlmCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiZHYxMzk0c3JjIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9EVjEzOTRTUkMpKQorICAgIHJldHVybiBGQUxTRTsKKyNpZmRlZiBIQVZFX0xJQklFQzYxODgzCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImhkdjEzOTRzcmMiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX0hEVjEzOTRTUkMpKQorICAgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgMTM5NCwKKyAgICAiU291cmNlIGZvciB2aWRlbyBkYXRhIHZpYSBJRUVFMTM5NCBpbnRlcmZhY2UiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9leHQvcmF3MTM5NC9nc3QxMzk0Y2xvY2suYyBiL2V4dC9yYXcxMzk0L2dzdDEzOTRjbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMzQxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcmF3MTM5NC9nc3QxMzk0Y2xvY2suYwpAQCAtMCwwICsxLDE1OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICAgICAgIDIwMDAgV2ltIFRheW1hbnMgPHd0YXlAY2hlbGxvLmJlPgorICogQ29weXJpZ2h0IChDKSAyMDA5ICAgICAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogZ3N0MTM5NGNsb2NrLmM6IENsb2NrIGZvciB1c2UgYnkgSUVFRSAxMzk0IHBsdWdpbnMKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3QxMzk0Y2xvY2suaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0XzEzOTRfY2xvY2tfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0XzEzOTRfY2xvY2tfZGVidWcKKworc3RhdGljIHZvaWQgZ3N0XzEzOTRfY2xvY2tfY2xhc3NfaW5pdCAoR3N0MTM5NENsb2NrQ2xhc3MgKiBrbGFzcyk7CitzdGF0aWMgdm9pZCBnc3RfMTM5NF9jbG9ja19pbml0IChHc3QxMzk0Q2xvY2sgKiBjbG9jayk7CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUgZ3N0XzEzOTRfY2xvY2tfZ2V0X2ludGVybmFsX3RpbWUgKEdzdENsb2NrICogY2xvY2spOworCitzdGF0aWMgR3N0U3lzdGVtQ2xvY2tDbGFzcyAqcGFyZW50X2NsYXNzID0gTlVMTDsKKworLyogc3RhdGljIGd1aW50IGdzdF8xMzk0X2Nsb2NrX3NpZ25hbHNbTEFTVF9TSUdOQUxdID0geyAwIH07ICovCisKK0dUeXBlCitnc3RfMTM5NF9jbG9ja19nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGNsb2NrX3R5cGUgPSAwOworCisgIGlmICghY2xvY2tfdHlwZSkgeworICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gY2xvY2tfaW5mbyA9IHsKKyAgICAgIHNpemVvZiAoR3N0MTM5NENsb2NrQ2xhc3MpLAorICAgICAgTlVMTCwKKyAgICAgIE5VTEwsCisgICAgICAoR0NsYXNzSW5pdEZ1bmMpIGdzdF8xMzk0X2Nsb2NrX2NsYXNzX2luaXQsCisgICAgICBOVUxMLAorICAgICAgTlVMTCwKKyAgICAgIHNpemVvZiAoR3N0MTM5NENsb2NrKSwKKyAgICAgIDQsCisgICAgICAoR0luc3RhbmNlSW5pdEZ1bmMpIGdzdF8xMzk0X2Nsb2NrX2luaXQsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIGNsb2NrX3R5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChHU1RfVFlQRV9TWVNURU1fQ0xPQ0ssICJHc3QxMzk0Q2xvY2siLAorICAgICAgICAmY2xvY2tfaW5mbywgMCk7CisgIH0KKyAgcmV0dXJuIGNsb2NrX3R5cGU7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF8xMzk0X2Nsb2NrX2NsYXNzX2luaXQgKEdzdDEzOTRDbG9ja0NsYXNzICoga2xhc3MpCit7CisgIEdzdENsb2NrQ2xhc3MgKmdzdGNsb2NrX2NsYXNzOworCisgIGdzdGNsb2NrX2NsYXNzID0gKEdzdENsb2NrQ2xhc3MgKikga2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ3N0Y2xvY2tfY2xhc3MtPmdldF9pbnRlcm5hbF90aW1lID0gZ3N0XzEzOTRfY2xvY2tfZ2V0X2ludGVybmFsX3RpbWU7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF8xMzk0X2Nsb2NrX2RlYnVnLCAiMTM5NGNsb2NrIiwgMCwgIjEzOTRjbG9jayIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0XzEzOTRfY2xvY2tfaW5pdCAoR3N0MTM5NENsb2NrICogY2xvY2spCit7CisgIEdTVF9PQkpFQ1RfRkxBR19TRVQgKGNsb2NrLCBHU1RfQ0xPQ0tfRkxBR19DQU5fU0VUX01BU1RFUik7Cit9CisKKy8qKgorICogZ3N0XzEzOTRfY2xvY2tfbmV3OgorICogQG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBjbG9jaworICoKKyAqIENyZWF0ZSBhIG5ldyAjR3N0MTM5NENsb2NrIGluc3RhbmNlLgorICoKKyAqIFJldHVybnM6IGEgbmV3ICNHc3QxMzk0Q2xvY2sKKyAqLworR3N0MTM5NENsb2NrICoKK2dzdF8xMzk0X2Nsb2NrX25ldyAoY29uc3QgZ2NoYXIgKiBuYW1lKQoreworICBHc3QxMzk0Q2xvY2sgKl8xMzk0Y2xvY2sgPQorICAgICAgR1NUXzEzOTRfQ0xPQ0sgKGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfMTM5NF9DTE9DSywgIm5hbWUiLCBuYW1lLAorICAgICAgICAgICJjbG9jay10eXBlIiwgR1NUX0NMT0NLX1RZUEVfT1RIRVIsIE5VTEwpKTsKKworICAvKiBDbGVhciBmbG9hdGluZyBmbGFnICovCisgIGdzdF9vYmplY3RfcmVmX3NpbmsgKF8xMzk0Y2xvY2spOworCisgIHJldHVybiBfMTM5NGNsb2NrOworfQorCitzdGF0aWMgR3N0Q2xvY2tUaW1lCitnc3RfMTM5NF9jbG9ja19nZXRfaW50ZXJuYWxfdGltZSAoR3N0Q2xvY2sgKiBjbG9jaykKK3sKKyAgR3N0MTM5NENsb2NrICpfMTM5NGNsb2NrOworICBHc3RDbG9ja1RpbWUgcmVzdWx0OworICBndWludDMyIGN5Y2xlX3RpbWVyOworICBndWludDY0IGxvY2FsX3RpbWU7CisKKyAgXzEzOTRjbG9jayA9IEdTVF8xMzk0X0NMT0NLX0NBU1QgKGNsb2NrKTsKKworICBpZiAoXzEzOTRjbG9jay0+aGFuZGxlICE9IE5VTEwpIHsKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKGNsb2NrKTsKKyAgICByYXcxMzk0X3JlYWRfY3ljbGVfdGltZXIgKF8xMzk0Y2xvY2stPmhhbmRsZSwgJmN5Y2xlX3RpbWVyLCAmbG9jYWxfdGltZSk7CisKKyAgICBpZiAoY3ljbGVfdGltZXIgPCBfMTM5NGNsb2NrLT5jeWNsZV90aW1lcl9sbykgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKGNsb2NrLCAib3ZlcmZsb3cgJXUgdG8gJXUiLAorICAgICAgICAgIF8xMzk0Y2xvY2stPmN5Y2xlX3RpbWVyX2xvLCBjeWNsZV90aW1lcik7CisKKyAgICAgIF8xMzk0Y2xvY2stPmN5Y2xlX3RpbWVyX2hpKys7CisgICAgfQorICAgIF8xMzk0Y2xvY2stPmN5Y2xlX3RpbWVyX2xvID0gY3ljbGVfdGltZXI7CisKKyAgICAvKiBnZXQgdGhlIHNlY29uZHMgZnJvbSB0aGUgY3ljbGVTZWNvbmRzIGNvdW50ZXIgKi8KKyAgICByZXN1bHQgPSAoKCgoKGd1aW50NjQpIF8xMzk0Y2xvY2stPmN5Y2xlX3RpbWVyX2hpKSA8PCAzMikgfAorICAgICAgICAgICAgY3ljbGVfdGltZXIpID4+IDI1KSAqIEdTVF9TRUNPTkQ7CisgICAgLyogYWRkIHRoZSBtaWNyb3NlY29uZHMgZnJvbSB0aGUgY3ljbGVDb3VudCBjb3VudGVyICovCisgICAgcmVzdWx0ICs9ICgoKGN5Y2xlX3RpbWVyID4+IDEyKSAmIDB4MWZmZikgKiAxMjUpICogR1NUX1VTRUNPTkQ7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoY2xvY2ssICJyZXN1bHQgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChyZXN1bHQpKTsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAoY2xvY2spOworICB9IGVsc2UgeworICAgIHJlc3VsdCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkCitnc3RfMTM5NF9jbG9ja19zZXRfaGFuZGxlIChHc3QxMzk0Q2xvY2sgKiBjbG9jaywgcmF3MTM5NGhhbmRsZV90IGhhbmRsZSkKK3sKKyAgY2xvY2stPmhhbmRsZSA9IGhhbmRsZTsKKyAgY2xvY2stPmN5Y2xlX3RpbWVyX2xvID0gMDsKKyAgY2xvY2stPmN5Y2xlX3RpbWVyX2hpID0gMDsKK30KKwordm9pZAorZ3N0XzEzOTRfY2xvY2tfdW5zZXRfaGFuZGxlIChHc3QxMzk0Q2xvY2sgKiBjbG9jaykKK3sKKyAgY2xvY2stPmhhbmRsZSA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9leHQvcmF3MTM5NC9nc3QxMzk0Y2xvY2suaCBiL2V4dC9yYXcxMzk0L2dzdDEzOTRjbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMTI1MWUKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcmF3MTM5NC9nc3QxMzk0Y2xvY2suaApAQCAtMCwwICsxLDc3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwNSBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA5ICAgICAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogZ3N0MTM5NGNsb2NrLmg6IENsb2NrIGZvciB1c2UgYnkgdGhlIElFRUUgMTM5NAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfMTM5NF9DTE9DS19IX18KKyNkZWZpbmUgX19HU1RfMTM5NF9DTE9DS19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0c3lzdGVtY2xvY2suaD4KKworI2luY2x1ZGUgPGxpYnJhdzEzOTQvcmF3MTM5NC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfMTM5NF9DTE9DSyBcCisgIChnc3RfMTM5NF9jbG9ja19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfMTM5NF9DTE9DSyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFXzEzOTRfQ0xPQ0ssR3N0MTM5NENsb2NrKSkKKyNkZWZpbmUgR1NUXzEzOTRfQ0xPQ0tfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfMTM5NF9DTE9DSyxHc3QxMzk0Q2xvY2tDbGFzcykpCisjZGVmaW5lIEdTVF9JU18xMzk0X0NMT0NLKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfMTM5NF9DTE9DSykpCisjZGVmaW5lIEdTVF9JU18xMzk0X0NMT0NLX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFXzEzOTRfQ0xPQ0spKQorI2RlZmluZSBHU1RfMTM5NF9DTE9DS19DQVNUKG9iaikgXAorICAoKEdzdDEzOTRDbG9jayopKG9iaikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3QxMzk0Q2xvY2sgR3N0MTM5NENsb2NrOwordHlwZWRlZiBzdHJ1Y3QgX0dzdDEzOTRDbG9ja0NsYXNzIEdzdDEzOTRDbG9ja0NsYXNzOworCisvKioKKyAqIEdzdDEzOTRDbG9jazoKKyAqIEBjbG9jazogcGFyZW50ICNHc3RTeXN0ZW1DbG9jaworICoKKyAqIE9wYXF1ZSAjR3N0MTM5NENsb2NrLgorICovCitzdHJ1Y3QgX0dzdDEzOTRDbG9jayB7CisgIEdzdFN5c3RlbUNsb2NrIGNsb2NrOworCisgIHJhdzEzOTRoYW5kbGVfdCBoYW5kbGU7CisKKyAgZ3VpbnQzMiBjeWNsZV90aW1lcl9sbzsKKyAgZ3VpbnQzMiBjeWNsZV90aW1lcl9oaTsKK307CisKK3N0cnVjdCBfR3N0MTM5NENsb2NrQ2xhc3MgeworICBHc3RTeXN0ZW1DbG9ja0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlICAgICAgICAgICBnc3RfMTM5NF9jbG9ja19nZXRfdHlwZSAgICAgICAgKHZvaWQpOworR3N0MTM5NENsb2NrKiAgIGdzdF8xMzk0X2Nsb2NrX25ldyAgICAgICAgICAgICAoY29uc3QgZ2NoYXIgKm5hbWUpOwordm9pZCAgICAgICAgICAgIGdzdF8xMzk0X2Nsb2NrX3NldF9oYW5kbGUgICAgICAoR3N0MTM5NENsb2NrICpjbG9jaywKKyAgICByYXcxMzk0aGFuZGxlX3QgaGFuZGxlKTsKK3ZvaWQgICAgICAgICAgICBnc3RfMTM5NF9jbG9ja191bnNldF9oYW5kbGUgICAgICAoR3N0MTM5NENsb2NrICpjbG9jayk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF8xMzk0X0NMT0NLX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L3JhdzEzOTQvZ3N0MTM5NHByb2JlLmMgYi9leHQvcmF3MTM5NC9nc3QxMzk0cHJvYmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDExYTAxCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3JhdzEzOTQvZ3N0MTM5NHByb2JlLmMKQEAgLTAsMCArMSwxNDMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA3IEp1bGllbiBQdXlkdCA8anB1eWR0QGZyZWUuZnI+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpYmF2YzEzOTQvYXZjMTM5NC5oPgorI2luY2x1ZGUgPGxpYmF2YzEzOTQvYXZjMTM5NF92Y3IuaD4KKyNpbmNsdWRlIDxsaWJhdmMxMzk0L3JvbTEzOTQuaD4KKyNpbmNsdWRlIDxsaWJyYXcxMzk0L3JhdzEzOTQuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImdzdDEzOTRwcm9iZS5oIgorCisjaWYgMAorCitzdGF0aWMgR1ZhbHVlQXJyYXkgKgorZ3N0XzEzOTRfZ2V0X2d1aWRfYXJyYXkgKHZvaWQpCit7CisgIEdWYWx1ZUFycmF5ICpyZXN1bHQgPSBOVUxMOworICByYXcxMzk0aGFuZGxlX3QgaGFuZGxlID0gTlVMTDsKKyAgaW50IG51bV9wb3J0cyA9IDA7CisgIGludCBwb3J0ID0gMDsKKyAgaW50IG51bV9ub2RlcyA9IDA7CisgIGludCBub2RlID0gMDsKKyAgcm9tMTM5NF9kaXJlY3RvcnkgZGlyZWN0b3J5OworICBHVmFsdWUgdmFsdWUgPSB7IDAsIH07CisKKyAgaGFuZGxlID0gcmF3MTM5NF9uZXdfaGFuZGxlICgpOworCisgIGlmIChoYW5kbGUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBudW1fcG9ydHMgPSByYXcxMzk0X2dldF9wb3J0X2luZm8gKGhhbmRsZSwgTlVMTCwgMCk7CisgIGZvciAocG9ydCA9IDA7IHBvcnQgPCBudW1fcG9ydHM7IHBvcnQrKykgeworICAgIGlmIChyYXcxMzk0X3NldF9wb3J0IChoYW5kbGUsIHBvcnQpID49IDApIHsKKyAgICAgIG51bV9ub2RlcyA9IHJhdzEzOTRfZ2V0X25vZGVjb3VudCAoaGFuZGxlKTsKKyAgICAgIGZvciAobm9kZSA9IDA7IG5vZGUgPCBudW1fbm9kZXM7IG5vZGUrKykgeworICAgICAgICByb20xMzk0X2dldF9kaXJlY3RvcnkgKGhhbmRsZSwgbm9kZSwgJmRpcmVjdG9yeSk7CisgICAgICAgIGlmIChyb20xMzk0X2dldF9ub2RlX3R5cGUgKCZkaXJlY3RvcnkpID09IFJPTTEzOTRfTk9ERV9UWVBFX0FWQyAmJgorICAgICAgICAgICAgYXZjMTM5NF9jaGVja19zdWJ1bml0X3R5cGUgKGhhbmRsZSwgbm9kZSwKKyAgICAgICAgICAgICAgICBBVkMxMzk0X1NVQlVOSVRfVFlQRV9WQ1IpKSB7CisgICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgcmVzdWx0ID0gZ192YWx1ZV9hcnJheV9uZXcgKDMpOyAgICAgLyogbG9va3MgbGlrZSBhIHNlbnNpYmxlIGRlZmF1bHQgKi8KKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZ2YWx1ZSwgR19UWVBFX1VJTlQ2NCk7CisgICAgICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICgmdmFsdWUsIHJvbTEzOTRfZ2V0X2d1aWQgKGhhbmRsZSwgbm9kZSkpOworICAgICAgICAgIGdfdmFsdWVfYXJyYXlfYXBwZW5kIChyZXN1bHQsICZ2YWx1ZSk7CisgICAgICAgICAgZ192YWx1ZV91bnNldCAoJnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBjb25zdCBHTGlzdCAqCitnc3RfMTM5NF9wcm9wZXJ0eV9wcm9iZV9nZXRfcHJvcGVydGllcyAoR3N0UHJvcGVydHlQcm9iZSAqIHByb2JlKQoreworICBzdGF0aWMgR0xpc3QgKnJlc3VsdCA9IE5VTEw7CisgIEdPYmplY3RDbGFzcyAqa2xhc3MgPSBOVUxMOworICBHUGFyYW1TcGVjICpzcGVjID0gTlVMTDsKKworICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICBrbGFzcyA9IEdfT0JKRUNUX0dFVF9DTEFTUyAocHJvYmUpOworICAgIHNwZWMgPSBnX29iamVjdF9jbGFzc19maW5kX3Byb3BlcnR5IChrbGFzcywgImd1aWQiKTsKKyAgICByZXN1bHQgPSBnX2xpc3RfYXBwZW5kIChyZXN1bHQsIHNwZWMpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2dzdF8xMzk0X3Byb3BlcnR5X3Byb2JlX3Byb2JlX3Byb3BlcnR5IChHc3RQcm9wZXJ0eVByb2JlICogcHJvYmUsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBpZiAoIWdfc3RyX2VxdWFsIChwc3BlYy0+bmFtZSwgImd1aWQiKSkKKyAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKHByb2JlLCBwcm9wX2lkLCBwc3BlYyk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0XzEzOTRfcHJvcGVydHlfcHJvYmVfbmVlZHNfcHJvYmUgKEdzdFByb3BlcnR5UHJvYmUgKiBwcm9iZSwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR1ZhbHVlQXJyYXkgKgorZ3N0XzEzOTRfcHJvcGVydHlfcHJvYmVfZ2V0X3ZhbHVlcyAoR3N0UHJvcGVydHlQcm9iZSAqIHByb2JlLCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR1ZhbHVlQXJyYXkgKnJlc3VsdCA9IE5VTEw7CisKKyAgaWYgKCFnX3N0cl9lcXVhbCAocHNwZWMtPm5hbWUsICJndWlkIikpIHsKKyAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKHByb2JlLCBwcm9wX2lkLCBwc3BlYyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXN1bHQgPSBnc3RfMTM5NF9nZXRfZ3VpZF9hcnJheSAoKTsKKworICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgR1NUX0xPR19PQkpFQ1QgKHByb2JlLCAiTm8gZ3VpZCBmb3VuZCIpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfMTM5NF9wcm9wZXJ0eV9wcm9iZV9pbnRlcmZhY2VfaW5pdCAoR3N0UHJvcGVydHlQcm9iZUludGVyZmFjZSAqIGlmYWNlKQoreworICBpZmFjZS0+Z2V0X3Byb3BlcnRpZXMgPSBnc3RfMTM5NF9wcm9wZXJ0eV9wcm9iZV9nZXRfcHJvcGVydGllczsKKyAgaWZhY2UtPnByb2JlX3Byb3BlcnR5ID0gZ3N0XzEzOTRfcHJvcGVydHlfcHJvYmVfcHJvYmVfcHJvcGVydHk7CisgIGlmYWNlLT5uZWVkc19wcm9iZSA9IGdzdF8xMzk0X3Byb3BlcnR5X3Byb2JlX25lZWRzX3Byb2JlOworICBpZmFjZS0+Z2V0X3ZhbHVlcyA9IGdzdF8xMzk0X3Byb3BlcnR5X3Byb2JlX2dldF92YWx1ZXM7Cit9CisKK3ZvaWQKK2dzdF8xMzk0X3R5cGVfYWRkX3Byb3BlcnR5X3Byb2JlX2ludGVyZmFjZSAoR1R5cGUgdHlwZSkKK3sKKyAgc3RhdGljIGNvbnN0IEdJbnRlcmZhY2VJbmZvIHByb2JlX2lmYWNlX2luZm8gPSB7CisgICAgKEdJbnRlcmZhY2VJbml0RnVuYykgZ3N0XzEzOTRfcHJvcGVydHlfcHJvYmVfaW50ZXJmYWNlX2luaXQsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICB9OworCisgIGdfdHlwZV9hZGRfaW50ZXJmYWNlX3N0YXRpYyAodHlwZSwgR1NUX1RZUEVfUFJPUEVSVFlfUFJPQkUsCisgICAgICAmcHJvYmVfaWZhY2VfaW5mbyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L3JhdzEzOTQvZ3N0MTM5NHByb2JlLmggYi9leHQvcmF3MTM5NC9nc3QxMzk0cHJvYmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGEzMjMyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3JhdzEzOTQvZ3N0MTM5NHByb2JlLmgKQEAgLTAsMCArMSwzNCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgSnVsaWVuIFB1eWR0IDxqcHV5ZHRAZnJlZS5mcj4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIEdTVF8xMzk0X1BST0JFX0gKKyNkZWZpbmUgR1NUXzEzOTRfUFJPQkVfSAorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNpZiAwCit2b2lkIGdzdF8xMzk0X3R5cGVfYWRkX3Byb3BlcnR5X3Byb2JlX2ludGVyZmFjZSAoR1R5cGUgdHlwZSk7CisjZW5kaWYKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUXzEzOTRfUFJPQkVfSCAqLworCmRpZmYgLS1naXQgYS9leHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYyBiL2V4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZTFhZjEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYwpAQCAtMCwwICsxLDExMTIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgPDIwMDA+IERhbmllbCBGaXNjaGVyIDxkYW5AZjNjLmNvbT4KKyAqICAgICAgICAgICAgICAgPDIwMDQ+IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKiAgICAgICAgICAgICAgIDwyMDA2PiBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtZHYxMzk0c3JjCisgKgorICogUmVhZCBEViAoZGlnaXRhbCB2aWRlbykgZGF0YSBmcm9tIGZpcmV3aXJlIHBvcnQuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGR2MTM5NHNyYyAhIHF1ZXVlICEgZHZkZW11eCBuYW1lPWQgISBxdWV1ZSAhIGR2ZGVjICEgeHZpbWFnZXNpbmsgZC4gISBxdWV1ZSAhIGFsc2FzaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIGNhcHR1cmVzIGZyb20gdGhlIGZpcmV3aXJlIHBvcnQgYW5kIGRpc3BsYXlzIGl0IChtaWdodCBuZWVkCisgKiBmb3JtYXQgY29udmVydGVycyBmb3IgYXVkaW8vdmlkZW8pLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8bGliYXZjMTM5NC9hdmMxMzk0Lmg+CisjaW5jbHVkZSA8bGliYXZjMTM5NC9hdmMxMzk0X3Zjci5oPgorI2luY2x1ZGUgPGxpYmF2YzEzOTQvcm9tMTM5NC5oPgorI2luY2x1ZGUgPGxpYnJhdzEzOTQvcmF3MTM5NC5oPgorI2lmZGVmIEhBVkVfTElCSUVDNjE4ODMKKyNpbmNsdWRlIDxsaWJpZWM2MTg4My9pZWM2MTg4My5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJnc3RkdjEzOTRzcmMuaCIKKyNpbmNsdWRlICJnc3QxMzk0cHJvYmUuaCIKKyNpbmNsdWRlICJnc3QxMzk0Y2xvY2suaCIKKworCisjZGVmaW5lIENPTlRST0xfU1RPUCAgICAgICAgICAgICdTJyAgICAgLyogc3RvcCB0aGUgc2VsZWN0IGNhbGwgKi8KKyNkZWZpbmUgQ09OVFJPTF9TT0NLRVRTKHNyYykgICBzcmMtPmNvbnRyb2xfc29jaworI2RlZmluZSBXUklURV9TT0NLRVQoc3JjKSAgICAgIHNyYy0+Y29udHJvbF9zb2NrWzFdCisjZGVmaW5lIFJFQURfU09DS0VUKHNyYykgICAgICAgc3JjLT5jb250cm9sX3NvY2tbMF0KKworI2RlZmluZSBTRU5EX0NPTU1BTkQoc3JjLCBjb21tYW5kKSAgICAgICAgICBcCitHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IEdfR05VQ19VTlVTRUQgX3JlczsgdW5zaWduZWQgY2hhciBjOyBjID0gY29tbWFuZDsgICBcCisgIF9yZXMgPSB3cml0ZSAoV1JJVEVfU09DS0VUKHNyYyksICZjLCAxKTsgIFwKK30gR19TVE1UX0VORAorCisjZGVmaW5lIFJFQURfQ09NTUFORChzcmMsIGNvbW1hbmQsIHJlcykgICAgICAgIFwKK0dfU1RNVF9TVEFSVCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXMgPSByZWFkKFJFQURfU09DS0VUKHNyYyksICZjb21tYW5kLCAxKTsgICBcCit9IEdfU1RNVF9FTkQKKworCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChkdjEzOTRzcmNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKGR2MTM5NHNyY19kZWJ1ZykKKworI2RlZmluZSBQQUxfRlJBTUVTSVpFIDE0NDAwMAorI2RlZmluZSBQQUxfRlJBTUVSQVRFIDI1CisKKyNkZWZpbmUgTlRTQ19GUkFNRVNJWkUgMTIwMDAwCisjZGVmaW5lIE5UU0NfRlJBTUVSQVRFIDMwCisKK2VudW0KK3sKKyAgU0lHTkFMX0ZSQU1FX0RST1BQRUQsCisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKKyNkZWZpbmUgREVGQVVMVF9QT1JUICAgIC0xCisjZGVmaW5lIERFRkFVTFRfQ0hBTk5FTCAgIDYzCisjZGVmaW5lIERFRkFVTFRfQ09OU0VDVVRJVkUgMQorI2RlZmluZSBERUZBVUxUX1NLSVAgICAgMAorI2RlZmluZSBERUZBVUxUX0RST1BfSU5DT01QTEVURSBUUlVFCisjZGVmaW5lIERFRkFVTFRfVVNFX0FWQyAgIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9HVUlEICAgIDAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUE9SVCwKKyAgUFJPUF9DSEFOTkVMLAorICBQUk9QX0NPTlNFQ1VUSVZFLAorICBQUk9QX1NLSVAsCisgIFBST1BfRFJPUF9JTkNPTVBMRVRFLAorICBQUk9QX1VTRV9BVkMsCisgIFBST1BfR1VJRCwKKyAgUFJPUF9ERVZJQ0VfTkFNRQorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtZHYsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgTlRTQywgUEFMIH0sICIgInN5c3RlbXN0cmVhbSA9IChib29sZWFuKSB0cnVlIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfZHYxMzk0c3JjX3VyaV9oYW5kbGVyX2luaXQgKGdwb2ludGVyIGdfaWZhY2UsCisgICAgZ3BvaW50ZXIgaWZhY2VfZGF0YSk7CisKK3N0YXRpYyB2b2lkIGdzdF9kdjEzOTRzcmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2R2MTM5NHNyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfZHYxMzk0c3JjX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0Q2xvY2sgKmdzdF9kdjEzOTRzcmNfcHJvdmlkZV9jbG9jayAoR3N0RWxlbWVudCAqIGVsZW1lbnQpOworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9kdjEzOTRfc3JjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZHYxMzk0c3JjX3N0YXJ0IChHc3RCYXNlU3JjICogYnNyYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2R2MTM5NHNyY19zdG9wIChHc3RCYXNlU3JjICogYnNyYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2R2MTM5NHNyY191bmxvY2sgKEdzdEJhc2VTcmMgKiBic3JjKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2R2MTM5NHNyY19jcmVhdGUgKEdzdFB1c2hTcmMgKiBwc3JjLCBHc3RCdWZmZXIgKiogYnVmKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9kdjEzOTRzcmNfcXVlcnkgKEdzdEJhc2VTcmMgKiBzcmMsIEdzdFF1ZXJ5ICogcXVlcnkpOworc3RhdGljIHZvaWQgZ3N0X2R2MTM5NHNyY191cGRhdGVfZGV2aWNlX25hbWUgKEdzdERWMTM5NFNyYyAqIHNyYyk7CisKKyNkZWZpbmUgZ3N0X2R2MTM5NHNyY19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoR3N0RFYxMzk0U3JjLCBnc3RfZHYxMzk0c3JjLCBHU1RfVFlQRV9QVVNIX1NSQywKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1VSSV9IQU5ETEVSLAorICAgICAgICBnc3RfZHYxMzk0c3JjX3VyaV9oYW5kbGVyX2luaXQpKTsKKworc3RhdGljIGd1aW50IGdzdF9kdjEzOTRzcmNfc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAgfTsKKworc3RhdGljIHZvaWQKK2dzdF9kdjEzOTRzcmNfY2xhc3NfaW5pdCAoR3N0RFYxMzk0U3JjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEJhc2VTcmNDbGFzcyAqZ3N0YmFzZXNyY19jbGFzczsKKyAgR3N0UHVzaFNyY0NsYXNzICpnc3RwdXNoc3JjX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YmFzZXNyY19jbGFzcyA9IChHc3RCYXNlU3JjQ2xhc3MgKikga2xhc3M7CisgIGdzdHB1c2hzcmNfY2xhc3MgPSAoR3N0UHVzaFNyY0NsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9kdjEzOTRzcmNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfZHYxMzk0c3JjX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF9kdjEzOTRzcmNfZGlzcG9zZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5wcm92aWRlX2Nsb2NrID0gZ3N0X2R2MTM5NHNyY19wcm92aWRlX2Nsb2NrOworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfZHYxMzk0X3NyY19jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0X2R2MTM5NHNyY19zaWduYWxzW1NJR05BTF9GUkFNRV9EUk9QUEVEXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJmcmFtZS1kcm9wcGVkIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdERWMTM5NFNyY0NsYXNzLCBmcmFtZV9kcm9wcGVkKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19WT0lELCBHX1RZUEVfTk9ORSwgMCk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9QT1JULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInBvcnQiLCAiUG9ydCIsICJQb3J0IG51bWJlciAoLTEgYXV0b21hdGljKSIsCisgICAgICAgICAgLTEsIDE2LCBERUZBVUxUX1BPUlQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0NIQU5ORUwsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiY2hhbm5lbCIsICJDaGFubmVsIiwgIkNoYW5uZWwgbnVtYmVyIGZvciBsaXN0ZW5pbmciLAorICAgICAgICAgIDAsIDY0LCBERUZBVUxUX0NIQU5ORUwsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0NPTlNFQ1VUSVZFLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImNvbnNlY3V0aXZlIiwgImNvbnNlY3V0aXZlIGZyYW1lcyIsCisgICAgICAgICAgInNlbmQgbiBjb25zZWN1dGl2ZSBmcmFtZXMgYWZ0ZXIgc2tpcHBpbmciLCAxLCBHX01BWElOVCwKKyAgICAgICAgICBERUZBVUxUX0NPTlNFQ1VUSVZFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9TS0lQLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInNraXAiLCAic2tpcCBmcmFtZXMiLCAic2tpcCBuIGZyYW1lcyIsCisgICAgICAgICAgMCwgR19NQVhJTlQsIERFRkFVTFRfU0tJUCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9EUk9QX0lOQ09NUExFVEUsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImRyb3AtaW5jb21wbGV0ZSIsICJkcm9wIGluY29tcGxldGUiLAorICAgICAgICAgICJkcm9wIGluY29tcGxldGUgZnJhbWVzIiwgREVGQVVMVF9EUk9QX0lOQ09NUExFVEUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfVVNFX0FWQywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgidXNlLWF2YyIsICJVc2UgQVYvQyIsICJVc2UgQVYvQyBWVFIgY29udHJvbCIsCisgICAgICAgICAgREVGQVVMVF9VU0VfQVZDLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9HVUlELAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoImd1aWQiLCAiR1VJRCIsCisgICAgICAgICAgInNlbGVjdCBvbmUgb2YgbXVsdGlwbGUgRFYgZGV2aWNlcyBieSBpdHMgR1VJRC4gdXNlIGEgaGV4YWRlY2ltYWwgIgorICAgICAgICAgICJsaWtlIDB4aGhoaGhoaGhoaGhoaGhoaC4gKDAgPSBubyBndWlkKSIsIDAsIEdfTUFYVUlOVDY0LAorICAgICAgICAgIERFRkFVTFRfR1VJRCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3REVjEzOTRTcmM6ZGV2aWNlLW5hbWU6CisgICAqCisgICAqIERlc2NyaXB0aXZlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBvcGVuZWQgZGV2aWNlCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0RFVklDRV9OQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImRldmljZS1uYW1lIiwgImRldmljZSBuYW1lIiwKKyAgICAgICAgICAidXNlci1mcmllbmRseSBuYW1lIG9mIHRoZSBkZXZpY2UiLCAiRGVmYXVsdCIsCisgICAgICAgICAgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RiYXNlc3JjX2NsYXNzLT5uZWdvdGlhdGUgPSBOVUxMOworICBnc3RiYXNlc3JjX2NsYXNzLT5zdGFydCA9IGdzdF9kdjEzOTRzcmNfc3RhcnQ7CisgIGdzdGJhc2VzcmNfY2xhc3MtPnN0b3AgPSBnc3RfZHYxMzk0c3JjX3N0b3A7CisgIGdzdGJhc2VzcmNfY2xhc3MtPnVubG9jayA9IGdzdF9kdjEzOTRzcmNfdW5sb2NrOworICBnc3RiYXNlc3JjX2NsYXNzLT5xdWVyeSA9IGdzdF9kdjEzOTRzcmNfcXVlcnk7CisKKyAgZ3N0cHVzaHNyY19jbGFzcy0+Y3JlYXRlID0gZ3N0X2R2MTM5NHNyY19jcmVhdGU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfZmFjdG9yeSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJGaXJld2lyZSAoMTM5NCkgRFYgdmlkZW8gc291cmNlIiwgIlNvdXJjZS9WaWRlbyIsCisgICAgICAiU291cmNlIGZvciBEViB2aWRlbyBkYXRhIGZyb20gZmlyZXdpcmUgcG9ydCIsCisgICAgICAiRXJpayBXYWx0aGluc2VuIDxvbWVnYUB0ZW1wbGUtYmFwdGlzdC5jb20+LCAiCisgICAgICAiRGFuaWVsIEZpc2NoZXIgPGRhbkBmM2MuY29tPiwgIiAiV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4sICIKKyAgICAgICJaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZHYxMzk0c3JjX2RlYnVnLCAiZHYxMzk0c3JjIiwgMCwKKyAgICAgICJEViBmaXJld2lyZSBzb3VyY2UiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kdjEzOTRzcmNfaW5pdCAoR3N0RFYxMzk0U3JjICogZHYxMzk0c3JjKQoreworICBHc3RQYWQgKnNyY3BhZCA9IEdTVF9CQVNFX1NSQ19QQUQgKGR2MTM5NHNyYyk7CisKKyAgZ3N0X2Jhc2Vfc3JjX3NldF9saXZlIChHU1RfQkFTRV9TUkMgKGR2MTM5NHNyYyksIFRSVUUpOworICBnc3RfYmFzZV9zcmNfc2V0X2Zvcm1hdCAoR1NUX0JBU0VfU1JDIChkdjEzOTRzcmMpLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfYmFzZV9zcmNfc2V0X2RvX3RpbWVzdGFtcCAoR1NUX0JBU0VfU1JDIChkdjEzOTRzcmMpLCBUUlVFKTsKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoc3JjcGFkKTsKKworICBkdjEzOTRzcmMtPnBvcnQgPSBERUZBVUxUX1BPUlQ7CisgIGR2MTM5NHNyYy0+Y2hhbm5lbCA9IERFRkFVTFRfQ0hBTk5FTDsKKworICBkdjEzOTRzcmMtPmNvbnNlY3V0aXZlID0gREVGQVVMVF9DT05TRUNVVElWRTsKKyAgZHYxMzk0c3JjLT5za2lwID0gREVGQVVMVF9TS0lQOworICBkdjEzOTRzcmMtPmRyb3BfaW5jb21wbGV0ZSA9IERFRkFVTFRfRFJPUF9JTkNPTVBMRVRFOworICBkdjEzOTRzcmMtPnVzZV9hdmMgPSBERUZBVUxUX1VTRV9BVkM7CisgIGR2MTM5NHNyYy0+Z3VpZCA9IERFRkFVTFRfR1VJRDsKKyAgZHYxMzk0c3JjLT51cmkgPSBnX3N0cmR1cF9wcmludGYgKCJkdjovLyVkIiwgZHYxMzk0c3JjLT5wb3J0KTsKKyAgZHYxMzk0c3JjLT5kZXZpY2VfbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoIkRlZmF1bHQiKTsKKworICBSRUFEX1NPQ0tFVCAoZHYxMzk0c3JjKSA9IC0xOworICBXUklURV9TT0NLRVQgKGR2MTM5NHNyYykgPSAtMTsKKworICAvKiBpbml0aWFsaXplZCB3aGVuIGZpcnN0IGhlYWRlciByZWNlaXZlZCAqLworICBkdjEzOTRzcmMtPmZyYW1lX3NpemUgPSAwOworCisgIGR2MTM5NHNyYy0+YnVmID0gTlVMTDsKKyAgZHYxMzk0c3JjLT5mcmFtZSA9IE5VTEw7CisgIGR2MTM5NHNyYy0+ZnJhbWVfc2VxdWVuY2UgPSAwOworCisgIGR2MTM5NHNyYy0+cHJvdmlkZWRfY2xvY2sgPSBnc3RfMTM5NF9jbG9ja19uZXcgKCJkdjEzOTRjbG9jayIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2R2MTM5NHNyY19kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3REVjEzOTRTcmMgKnNyYyA9IEdTVF9EVjEzOTRTUkMgKG9iamVjdCk7CisKKyAgaWYgKHNyYy0+cHJvdmlkZWRfY2xvY2spIHsKKyAgICBnX29iamVjdF91bnJlZiAoc3JjLT5wcm92aWRlZF9jbG9jayk7CisgIH0KKworICBnX2ZyZWUgKHNyYy0+dXJpKTsKKyAgc3JjLT51cmkgPSBOVUxMOworCisgIGdfZnJlZSAoc3JjLT5kZXZpY2VfbmFtZSk7CisgIHNyYy0+ZGV2aWNlX25hbWUgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2R2MTM5NHNyY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0RFYxMzk0U3JjICpmaWx0ZXIgPSBHU1RfRFYxMzk0U1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QT1JUOgorICAgICAgZmlsdGVyLT5wb3J0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBnX2ZyZWUgKGZpbHRlci0+dXJpKTsKKyAgICAgIGZpbHRlci0+dXJpID0gZ19zdHJkdXBfcHJpbnRmICgiZHY6Ly8lZCIsIGZpbHRlci0+cG9ydCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0hBTk5FTDoKKyAgICAgIGZpbHRlci0+Y2hhbm5lbCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NLSVA6CisgICAgICBmaWx0ZXItPnNraXAgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT05TRUNVVElWRToKKyAgICAgIGZpbHRlci0+Y29uc2VjdXRpdmUgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9EUk9QX0lOQ09NUExFVEU6CisgICAgICBmaWx0ZXItPmRyb3BfaW5jb21wbGV0ZSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VfQVZDOgorICAgICAgZmlsdGVyLT51c2VfYXZjID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0dVSUQ6CisgICAgICBmaWx0ZXItPmd1aWQgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIGdzdF9kdjEzOTRzcmNfdXBkYXRlX2RldmljZV9uYW1lIChmaWx0ZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZHYxMzk0c3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3REVjEzOTRTcmMgKmZpbHRlciA9IEdTVF9EVjEzOTRTUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BPUlQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBmaWx0ZXItPnBvcnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NIQU5ORUw6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBmaWx0ZXItPmNoYW5uZWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NLSVA6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBmaWx0ZXItPnNraXApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NPTlNFQ1VUSVZFOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZmlsdGVyLT5jb25zZWN1dGl2ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRFJPUF9JTkNPTVBMRVRFOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIGZpbHRlci0+ZHJvcF9pbmNvbXBsZXRlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VfQVZDOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIGZpbHRlci0+dXNlX2F2Yyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfR1VJRDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIGZpbHRlci0+Z3VpZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfREVWSUNFX05BTUU6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBmaWx0ZXItPmRldmljZV9uYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdENsb2NrICoKK2dzdF9kdjEzOTRzcmNfcHJvdmlkZV9jbG9jayAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdERWMTM5NFNyYyAqZHYxMzk0c3JjID0gR1NUX0RWMTM5NFNSQyAoZWxlbWVudCk7CisKKyAgcmV0dXJuIEdTVF9DTE9DS19DQVNUIChnc3Rfb2JqZWN0X3JlZiAoZHYxMzk0c3JjLT5wcm92aWRlZF9jbG9jaykpOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9kdjEzOTRfc3JjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUzsKKyAgR3N0RFYxMzk0U3JjICpzcmMgPSBHU1RfRFYxMzk0U1JDIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUExBWUlOR19UT19QQVVTRUQ6CisgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKGVsZW1lbnQsCisgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2Nsb2NrX2xvc3QgKEdTVF9PQkpFQ1RfQ0FTVCAoZWxlbWVudCksCisgICAgICAgICAgICAgIEdTVF9DTE9DS19DQVNUIChzcmMtPnByb3ZpZGVkX2Nsb2NrKSkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisgIGlmIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKQorICAgIHJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19QTEFZSU5HOgorICAgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChlbGVtZW50LAorICAgICAgICAgIGdzdF9tZXNzYWdlX25ld19jbG9ja19wcm92aWRlIChHU1RfT0JKRUNUX0NBU1QgKGVsZW1lbnQpLAorICAgICAgICAgICAgICBHU1RfQ0xPQ0tfQ0FTVCAoc3JjLT5wcm92aWRlZF9jbG9jayksIFRSVUUpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBIQVZFX0xJQklFQzYxODgzCitzdGF0aWMgR3N0RFYxMzk0U3JjICoKK2dzdF9kdjEzOTRzcmNfZnJvbV9yYXcxMzk0aGFuZGxlIChyYXcxMzk0aGFuZGxlX3QgaGFuZGxlKQoreworICBpZWM2MTg4M19kdl90IGR2ID0gKGllYzYxODgzX2R2X3QpIHJhdzEzOTRfZ2V0X3VzZXJkYXRhIChoYW5kbGUpOworICBpZWM2MTg4M19kdl9mYl90IGR2X2ZiID0KKyAgICAgIChpZWM2MTg4M19kdl9mYl90KSBpZWM2MTg4M19kdl9nZXRfY2FsbGJhY2tfZGF0YSAoZHYpOworICByZXR1cm4gR1NUX0RWMTM5NFNSQyAoaWVjNjE4ODNfZHZfZmJfZ2V0X2NhbGxiYWNrX2RhdGEgKGR2X2ZiKSk7Cit9CisjZWxzZSAvKiBIQVZFX0xJQklFQzYxODgzICovCitzdGF0aWMgR3N0RFYxMzk0U3JjICoKK2dzdF9kdjEzOTRzcmNfZnJvbV9yYXcxMzk0aGFuZGxlIChyYXcxMzk0aGFuZGxlX3QgaGFuZGxlKQoreworICByZXR1cm4gR1NUX0RWMTM5NFNSQyAocmF3MTM5NF9nZXRfdXNlcmRhdGEgKGhhbmRsZSkpOworfQorI2VuZGlmIC8qIEhBVkVfTElCSUVDNjE4ODMgKi8KKworI2lmZGVmIEhBVkVfTElCSUVDNjE4ODMKK3N0YXRpYyBpbnQKK2dzdF9kdjEzOTRzcmNfaWVjNjE4ODNfcmVjZWl2ZSAodW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbiwKKyAgICBpbnQgY29tcGxldGUsIHZvaWQgKmNiZGF0YSkKK3sKKyAgR3N0RFYxMzk0U3JjICpkdjEzOTRzcmMgPSBHU1RfRFYxMzk0U1JDIChjYmRhdGEpOworCisgIGlmIChHX1VOTElLRUxZICghZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChHU1RfQkFTRV9TUkNfUEFEIChkdjEzOTRzcmMpKSkpIHsKKyAgICBHc3RDYXBzICpjYXBzOworICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBkYXRhOworCisgICAgLy8gZmlndXJlIGZvcm1hdCAoTlRTQy9QQUwpCisgICAgaWYgKHBbM10gJiAweDgwKSB7CisgICAgICAvLyBQQUwKKyAgICAgIGR2MTM5NHNyYy0+ZnJhbWVfc2l6ZSA9IFBBTF9GUkFNRVNJWkU7CisgICAgICBkdjEzOTRzcmMtPmZyYW1lX3JhdGUgPSBQQUxfRlJBTUVSQVRFOworICAgICAgR1NUX0RFQlVHICgiUEFMIGRhdGEiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1kdiIsCisgICAgICAgICAgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJQQUwiLAorICAgICAgICAgICJzeXN0ZW1zdHJlYW0iLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5UU0MgKHVudGVzdGVkKQorICAgICAgZHYxMzk0c3JjLT5mcmFtZV9zaXplID0gTlRTQ19GUkFNRVNJWkU7CisgICAgICBkdjEzOTRzcmMtPmZyYW1lX3JhdGUgPSBOVFNDX0ZSQU1FUkFURTsKKyAgICAgIEdTVF9ERUJVRworICAgICAgICAgICgiTlRTQyBkYXRhIFt1bnRlc3RlZF0gLSBwbGVhc2UgcmVwb3J0IHN1Y2Nlc3MvZmFpbHVyZSB0byA8ZGFuQGYzYy5jb20+Iik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtZHYiLAorICAgICAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiTlRTQyIsCisgICAgICAgICAgInN5c3RlbXN0cmVhbSIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKyAgICB9CisgICAgZ3N0X3BhZF9zZXRfY2FwcyAoR1NUX0JBU0VfU1JDX1BBRCAoZHYxMzk0c3JjKSwgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICB9CisKKyAgZHYxMzk0c3JjLT5mcmFtZSA9IE5VTEw7CisgIGlmIChHX0xJS0VMWSAoKGR2MTM5NHNyYy0+ZnJhbWVfc2VxdWVuY2UgKyAxKSAlIChkdjEzOTRzcmMtPnNraXAgKworICAgICAgICAgICAgICBkdjEzOTRzcmMtPmNvbnNlY3V0aXZlKSA8IGR2MTM5NHNyYy0+Y29uc2VjdXRpdmUpKSB7CisgICAgaWYgKGNvbXBsZXRlICYmIGxlbiA9PSBkdjEzOTRzcmMtPmZyYW1lX3NpemUpIHsKKyAgICAgIEdzdEJ1ZmZlciAqYnVmOworCisgICAgICBidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGR2MTM5NHNyYy0+ZnJhbWVfc2l6ZSk7CisKKyAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpID0gZHYxMzk0c3JjLT5mcmFtZV9zZXF1ZW5jZTsKKyAgICAgIGdzdF9idWZmZXJfZmlsbCAoYnVmLCAwLCBkYXRhLCBsZW4pOworICAgICAgZHYxMzk0c3JjLT5idWYgPSBidWY7CisgICAgfQorICB9CisgIGR2MTM5NHNyYy0+ZnJhbWVfc2VxdWVuY2UrKzsKKyAgcmV0dXJuIDA7Cit9CisKKyNlbHNlCitzdGF0aWMgaW50Citnc3RfZHYxMzk0c3JjX2lzb19yZWNlaXZlIChyYXcxMzk0aGFuZGxlX3QgaGFuZGxlLCBpbnQgY2hhbm5lbCwgc2l6ZV90IGxlbiwKKyAgICBxdWFkbGV0X3QgKiBkYXRhKQoreworICBHc3REVjEzOTRTcmMgKmR2MTM5NHNyYyA9IGdzdF9kdjEzOTRzcmNfZnJvbV9yYXcxMzk0aGFuZGxlIChoYW5kbGUpOworCisgIGlmIChsZW4gPiAxNikgeworICAgIC8qCisgICAgICAgdGhlIGZvbGxvd2luZyBjb2RlIHRha2VuIGZyb20ga2luby0wLjUxIChEYW4gRGVubmVkeS9DaGFybGVzIFlhdGVzKQorICAgICAgIEtpbmRseSByZWxpY2Vuc2VkIHVuZGVyIHRoZSBMR1BMLiBTZWUgdGhlIGNvbW1pdCBsb2cgZm9yIHZlcnNpb24gMS42IG9mCisgICAgICAgdGhpcyBmaWxlIGluIENWUy4KKyAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKikgJmRhdGFbM107CisKKyAgICBpbnQgc2VjdGlvbl90eXBlID0gcFswXSA+PiA1OyAgICAgICAvKiBzZWN0aW9uIHR5cGUgaXMgaW4gYml0cyA1IC0gNyAqLworICAgIGludCBkaWZfc2VxdWVuY2UgPSBwWzFdID4+IDQ7ICAgICAgIC8qIGRpZiBzZXF1ZW5jZSBudW1iZXIgaXMgaW4gYml0cyA0IC0gNyAqLworICAgIGludCBkaWZfYmxvY2sgPSBwWzJdOworCisgICAgLyogaWYgd2UgYXJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBmcmFtZSwgCisgICAgICAgd2Ugc2V0IGJ1Zj1mcmFtZSwgYW5kIGFsbG9jIGEgbmV3IGJ1ZmZlciBmb3IgZnJhbWUKKyAgICAgKi8KKyAgICBpZiAoc2VjdGlvbl90eXBlID09IDAgJiYgZGlmX3NlcXVlbmNlID09IDApIHsgICAgICAgLy8gZGlmIGhlYWRlcgorICAgICAgaWYgKCFHU1RfUEFEX0NBUFMgKEdTVF9CQVNFX1NSQ19QQUQgKGR2MTM5NHNyYykpKSB7CisgICAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgICAgLy8gZmlndXJlIGZvcm1hdCAoTlRTQy9QQUwpCisgICAgICAgIGlmIChwWzNdICYgMHg4MCkgeworICAgICAgICAgIC8vIFBBTAorICAgICAgICAgIGR2MTM5NHNyYy0+ZnJhbWVfc2l6ZSA9IFBBTF9GUkFNRVNJWkU7CisgICAgICAgICAgZHYxMzk0c3JjLT5mcmFtZV9yYXRlID0gUEFMX0ZSQU1FUkFURTsKKyAgICAgICAgICBHU1RfREVCVUcgKCJQQUwgZGF0YSIpOworICAgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1kdiIsCisgICAgICAgICAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiUEFMIiwKKyAgICAgICAgICAgICAgInN5c3RlbXN0cmVhbSIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBOVFNDICh1bnRlc3RlZCkKKyAgICAgICAgICBkdjEzOTRzcmMtPmZyYW1lX3NpemUgPSBOVFNDX0ZSQU1FU0laRTsKKyAgICAgICAgICBkdjEzOTRzcmMtPmZyYW1lX3JhdGUgPSBOVFNDX0ZSQU1FUkFURTsKKyAgICAgICAgICBHU1RfREVCVUcKKyAgICAgICAgICAgICAgKCJOVFNDIGRhdGEgW3VudGVzdGVkXSAtIHBsZWFzZSByZXBvcnQgc3VjY2Vzcy9mYWlsdXJlIHRvIDxkYW5AZjNjLmNvbT4iKTsKKyAgICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtZHYiLAorICAgICAgICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIk5UU0MiLAorICAgICAgICAgICAgICAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICAgICAgICB9CisgICAgICAgIGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9CQVNFX1NSQ19QQUQgKGR2MTM5NHNyYyksIGNhcHMpOworICAgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICB9CisgICAgICAvLyBkcm9wIGxhc3QgZnJhbWUgd2hlbiBub3QgY29tcGxldGUKKyAgICAgIGlmICghZHYxMzk0c3JjLT5kcm9wX2luY29tcGxldGUKKyAgICAgICAgICB8fCBkdjEzOTRzcmMtPmJ5dGVzX2luX2ZyYW1lID09IGR2MTM5NHNyYy0+ZnJhbWVfc2l6ZSkgeworICAgICAgICBkdjEzOTRzcmMtPmJ1ZiA9IGR2MTM5NHNyYy0+ZnJhbWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKEdTVF9FTEVNRU5UIChkdjEzOTRzcmMpLCAiaW5jb21wbGV0ZSBmcmFtZSBkcm9wcGVkIik7CisgICAgICAgIGdfc2lnbmFsX2VtaXQgKEdfT0JKRUNUIChkdjEzOTRzcmMpLAorICAgICAgICAgICAgZ3N0X2R2MTM5NHNyY19zaWduYWxzW1NJR05BTF9GUkFNRV9EUk9QUEVEXSwgMCk7CisgICAgICAgIGlmIChkdjEzOTRzcmMtPmZyYW1lKSB7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoZHYxMzk0c3JjLT5mcmFtZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICgoZHYxMzk0c3JjLT5mcmFtZV9zZXF1ZW5jZSArIDEpICUgKGR2MTM5NHNyYy0+c2tpcCArCisgICAgICAgICAgICAgIGR2MTM5NHNyYy0+Y29uc2VjdXRpdmUpIDwgZHYxMzk0c3JjLT5jb25zZWN1dGl2ZSkgeworICAgICAgICBHc3RCdWZmZXIgKmJ1ZjsKKyAgICAgICAgZ2ludDY0IGk2NDsKKworICAgICAgICBidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGR2MTM5NHNyYy0+ZnJhbWVfc2l6ZSk7CisKKyAgICAgICAgLyogZmlsbCBpbiBvZmZzZXQsIGR1cmF0aW9uLCB0aW1lc3RhbXAgKi8KKyAgICAgICAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikgPSBkdjEzOTRzcmMtPmZyYW1lX3NlcXVlbmNlOworICAgICAgICBkdjEzOTRzcmMtPmZyYW1lID0gYnVmOworICAgICAgfQorICAgICAgZHYxMzk0c3JjLT5mcmFtZV9zZXF1ZW5jZSsrOworICAgICAgZHYxMzk0c3JjLT5ieXRlc19pbl9mcmFtZSA9IDA7CisgICAgfQorCisgICAgaWYgKGR2MTM5NHNyYy0+ZnJhbWUgIT0gTlVMTCkgeworICAgICAgZ3VpbnQ4ICpkYXRhID0gR1NUX0JVRkZFUl9EQVRBIChkdjEzOTRzcmMtPmZyYW1lKTsKKworICAgICAgc3dpdGNoIChzZWN0aW9uX3R5cGUpIHsKKyAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAvKiAxIEhlYWRlciBibG9jayAqLworICAgICAgICAgIC8qIHBbM10gfD0gMHg4MDsgLy8gaGFjayB0byBmb3JjZSBQQUwgZGF0YSAqLworICAgICAgICAgIG1lbWNweSAoZGF0YSArIGRpZl9zZXF1ZW5jZSAqIDE1MCAqIDgwLCBwLCA0ODApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgLyogMiBTdWJjb2RlIGJsb2NrcyAqLworICAgICAgICAgIG1lbWNweSAoZGF0YSArIGRpZl9zZXF1ZW5jZSAqIDE1MCAqIDgwICsgKDEgKyBkaWZfYmxvY2spICogODAsIHAsCisgICAgICAgICAgICAgIDQ4MCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAvKiAzIFZBVVggYmxvY2tzICovCisgICAgICAgICAgbWVtY3B5IChkYXRhICsgZGlmX3NlcXVlbmNlICogMTUwICogODAgKyAoMyArIGRpZl9ibG9jaykgKiA4MCwgcCwKKyAgICAgICAgICAgICAgNDgwKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgIC8qIDkgQXVkaW8gYmxvY2tzIGludGVybGVhdmVkIHdpdGggdmlkZW8gKi8KKyAgICAgICAgICBtZW1jcHkgKGRhdGEgKyBkaWZfc2VxdWVuY2UgKiAxNTAgKiA4MCArICg2ICsgZGlmX2Jsb2NrICogMTYpICogODAsIHAsCisgICAgICAgICAgICAgIDQ4MCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA0OiAgICAgICAgICAgICAgICAvKiAxMzUgVmlkZW8gYmxvY2tzIGludGVybGVhdmVkIHdpdGggYXVkaW8gKi8KKyAgICAgICAgICBtZW1jcHkgKGRhdGEgKyBkaWZfc2VxdWVuY2UgKiAxNTAgKiA4MCArICg3ICsgKGRpZl9ibG9jayAvIDE1KSArCisgICAgICAgICAgICAgICAgICBkaWZfYmxvY2spICogODAsIHAsIDQ4MCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAvKiB3ZSBjYW4ndCBoYW5kbGUgYW55IG90aGVyIGRhdGEgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGR2MTM5NHNyYy0+Ynl0ZXNfaW5fZnJhbWUgKz0gNDgwOworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorI2VuZGlmCisvKgorICogV2hlbiBhbiBpZWVlMTM5NCBidXMgcmVzZXQgaGFwcGVucywgdXN1YWxseSBhIGRldmljZSBoYXMgYmVlbiByZW1vdmVkCisgKiBvciBhZGRlZC4gIFdlIHNlbmQgYSBtZXNzYWdlIG9uIHRoZSBtZXNzYWdlIGJ1cyB3aXRoIHRoZSBub2RlIGNvdW50IAorICogYW5kIHdoZXRoZXIgdGhlIGNhcHR1cmUgZGV2aWNlIHVzZWQgaW4gdGhpcyBlbGVtZW50IGNvbm5lY3RlZCwgZGlzY29ubmVjdGVkIAorICogb3Igd2FzIHVuY2hhbmdlZAorICogTWVzc2FnZSBzdHJ1Y3R1cmU6CisgKiBub2RlY291bnQgLSBpbnRlZ2VyIHdpdGggbnVtYmVyIG9mIG5vZGVzIG9uIGJ1cworICogY3VycmVudC1kZXZpY2UtY2hhbmdlIC0gaW50ZWdlciAoMSBpZiBkZXZpY2UgY29ubmVjdGVkLCAwIGlmIG5vIGNoYW5nZSB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBkZXZpY2Ugc3RhdHVzLCAtMSBpZiBkZXZpY2UgZGlzY29ubmVjdGVkKQorICovCitzdGF0aWMgaW50Citnc3RfZHYxMzk0c3JjX2J1c19yZXNldCAocmF3MTM5NGhhbmRsZV90IGhhbmRsZSwgdW5zaWduZWQgaW50IGdlbmVyYXRpb24pCit7CisgIEdzdERWMTM5NFNyYyAqc3JjOworICBnaW50IG5vZGVjb3VudDsKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGdpbnQgY3VycmVudF9kZXZpY2VfY2hhbmdlOworICBnaW50IGk7CisKKyAgc3JjID0gZ3N0X2R2MTM5NHNyY19mcm9tX3JhdzEzOTRoYW5kbGUgKGhhbmRsZSk7CisKKyAgR1NUX0lORk9fT0JKRUNUIChzcmMsICJoYXZlIGJ1cyByZXNldCIpOworCisgIC8qIHVwZGF0ZSBnZW5lcmF0aW9uIC0gdG9sZCB0byBkbyBzbyBieSBkb2NzICovCisgIHJhdzEzOTRfdXBkYXRlX2dlbmVyYXRpb24gKGhhbmRsZSwgZ2VuZXJhdGlvbik7CisgIG5vZGVjb3VudCA9IHJhdzEzOTRfZ2V0X25vZGVjb3VudCAoaGFuZGxlKTsKKyAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBwb3J0aW5mbyAqLworCisgIC8qIGN1cnJlbnRfZGV2aWNlX2NoYW5nZSBpcyAtMSBpZiBjYW1lcmEgZGlzY29ubmVjdGVkLCAwIGlmIG90aGVyIGRldmljZQorICAgKiBjb25uZWN0ZWQgb3IgMSBpZiBjYW1lcmEgaGFzIG5vdyBjb25uZWN0ZWQgKi8KKyAgY3VycmVudF9kZXZpY2VfY2hhbmdlID0gLTE7CisgIGZvciAoaSA9IDA7IGkgPCBub2RlY291bnQ7IGkrKykgeworICAgIGlmIChzcmMtPmd1aWQgPT0gcm9tMTM5NF9nZXRfZ3VpZCAoaGFuZGxlLCBpKSkgeworICAgICAgLyogQ2FtZXJhIGlzIHdpdGggdXMgKi8KKyAgICAgIEdTVF9ERUJVRyAoIkNhbWVyYSBpcyB3aXRoIHVzIik7CisgICAgICBpZiAoIXNyYy0+Y29ubmVjdGVkKSB7CisgICAgICAgIGN1cnJlbnRfZGV2aWNlX2NoYW5nZSA9IDE7CisgICAgICAgIHNyYy0+Y29ubmVjdGVkID0gVFJVRTsKKyAgICAgIH0gZWxzZQorICAgICAgICBjdXJyZW50X2RldmljZV9jaGFuZ2UgPSAwOworICAgIH0KKyAgfQorICBpZiAoc3JjLT5jb25uZWN0ZWQgJiYgY3VycmVudF9kZXZpY2VfY2hhbmdlID09IC0xKSB7CisgICAgR1NUX0RFQlVHICgiQ2FtZXJhIGhhcyBkaXNjb25uZWN0ZWQiKTsKKyAgICBzcmMtPmNvbm5lY3RlZCA9IEZBTFNFOworICB9IGVsc2UgaWYgKCFzcmMtPmNvbm5lY3RlZCAmJiBjdXJyZW50X2RldmljZV9jaGFuZ2UgPT0gLTEpIHsKKyAgICBHU1RfREVCVUcgKCJDYW1lcmEgaXMgc3RpbGwgbm90IHdpdGggdXMiKTsKKyAgICBjdXJyZW50X2RldmljZV9jaGFuZ2UgPSAwOworICB9CisKKyAgc3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJpZWVlMTM5NC1idXMtcmVzZXQiLCAibm9kZWNvdW50IiwgR19UWVBFX0lOVCwKKyAgICAgIG5vZGVjb3VudCwgImN1cnJlbnQtZGV2aWNlLWNoYW5nZSIsIEdfVFlQRV9JTlQsIGN1cnJlbnRfZGV2aWNlX2NoYW5nZSwKKyAgICAgIE5VTEwpOworICBtZXNzYWdlID0gZ3N0X21lc3NhZ2VfbmV3X2VsZW1lbnQgKEdTVF9PQkpFQ1QgKHNyYyksIHN0cnVjdHVyZSk7CisgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKHNyYyksIG1lc3NhZ2UpOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2R2MTM5NHNyY19jcmVhdGUgKEdzdFB1c2hTcmMgKiBwc3JjLCBHc3RCdWZmZXIgKiogYnVmKQoreworICBHc3REVjEzOTRTcmMgKmR2MTM5NHNyYyA9IEdTVF9EVjEzOTRTUkMgKHBzcmMpOworICBzdHJ1Y3QgcG9sbGZkIHBvbGxmZHNbMl07CisKKyAgcG9sbGZkc1swXS5mZCA9IHJhdzEzOTRfZ2V0X2ZkIChkdjEzOTRzcmMtPmhhbmRsZSk7CisgIHBvbGxmZHNbMF0uZXZlbnRzID0gUE9MTElOIHwgUE9MTEVSUiB8IFBPTExIVVAgfCBQT0xMUFJJOworICBwb2xsZmRzWzFdLmZkID0gUkVBRF9TT0NLRVQgKGR2MTM5NHNyYyk7CisgIHBvbGxmZHNbMV0uZXZlbnRzID0gUE9MTElOIHwgUE9MTEVSUiB8IFBPTExIVVAgfCBQT0xMUFJJOworCisgIGlmIChHX1VOTElLRUxZIChkdjEzOTRzcmMtPmJ1ZikpIHsKKyAgICAvKiBtYXliZSB3ZSBoYWQgYW4gZXJyb3IgYmVmb3JlLCBhbmQgdGhlcmUncyBhIHN0YWxlIGJ1ZmZlcj8gKi8KKyAgICBnc3RfYnVmZmVyX3VucmVmIChkdjEzOTRzcmMtPmJ1Zik7CisgICAgZHYxMzk0c3JjLT5idWYgPSBOVUxMOworICB9CisKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBpbnQgcmVzID0gcG9sbCAocG9sbGZkcywgMiwgLTEpOworCisgICAgaWYgKEdfVU5MSUtFTFkgKHJlcyA8IDApKSB7CisgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVJTlRSKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGVsc2UKKyAgICAgICAgZ290byBlcnJvcl93aGlsZV9wb2xsaW5nOworICAgIH0KKworICAgIGlmIChHX1VOTElLRUxZIChwb2xsZmRzWzFdLnJldmVudHMpKSB7CisgICAgICBjaGFyIGNvbW1hbmQ7CisKKyAgICAgIGlmIChwb2xsZmRzWzFdLnJldmVudHMgJiBQT0xMSU4pCisgICAgICAgIFJFQURfQ09NTUFORCAoZHYxMzk0c3JjLCBjb21tYW5kLCByZXMpOworCisgICAgICBnb3RvIHRvbGRfdG9fc3RvcDsKKyAgICB9IGVsc2UgaWYgKEdfTElLRUxZIChwb2xsZmRzWzBdLnJldmVudHMgJiBQT0xMSU4pKSB7CisgICAgICAvKiBzaG91bGRuJ3QgYmxvY2sgaW4gdGhlb3J5ICovCisgICAgICByYXcxMzk0X2xvb3BfaXRlcmF0ZSAoZHYxMzk0c3JjLT5oYW5kbGUpOworCisgICAgICBpZiAoZHYxMzk0c3JjLT5idWYpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGdfYXNzZXJ0IChkdjEzOTRzcmMtPmJ1Zik7CisKKyAgKmJ1ZiA9IGR2MTM5NHNyYy0+YnVmOworICBkdjEzOTRzcmMtPmJ1ZiA9IE5VTEw7CisgIHJldHVybiBHU1RfRkxPV19PSzsKKworZXJyb3Jfd2hpbGVfcG9sbGluZzoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkdjEzOTRzcmMsIFJFU09VUkNFLCBSRUFELCAoTlVMTCksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisgIH0KK3RvbGRfdG9fc3RvcDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR2MTM5NHNyYywgInRvbGQgdG8gc3RvcCwgc2h1dHRpbmcgZG93biIpOworICAgIHJldHVybiBHU1RfRkxPV19GTFVTSElORzsKKyAgfQorfQorCitzdGF0aWMgaW50Citnc3RfZHYxMzk0c3JjX2Rpc2NvdmVyX2F2Y19ub2RlIChHc3REVjEzOTRTcmMgKiBzcmMpCit7CisgIGludCBub2RlID0gLTE7CisgIGludCBpLCBqID0gMDsKKyAgaW50IG0gPSBzcmMtPm51bV9wb3J0czsKKworICBpZiAoc3JjLT5wb3J0ID49IDApIHsKKyAgICAvKiBzZWFyY2ggb24gZXhwbGljaXQgcG9ydCAqLworICAgIGogPSBzcmMtPnBvcnQ7CisgICAgbSA9IGogKyAxOworICB9CisKKyAgLyogbG9vcCBvdmVyIGFsbCBvdXIgcG9ydHMgKi8KKyAgZm9yICg7IGogPCBtICYmIG5vZGUgPT0gLTE7IGorKykgeworICAgIHJhdzEzOTRoYW5kbGVfdCBoYW5kbGU7CisgICAgc3RydWN0IHJhdzEzOTRfcG9ydGluZm8gcGluZlsxNl07CisKKyAgICAvKiBvcGVuIHRoZSBwb3J0ICovCisgICAgaGFuZGxlID0gcmF3MTM5NF9uZXdfaGFuZGxlICgpOworICAgIGlmICghaGFuZGxlKSB7CisgICAgICBHU1RfV0FSTklORyAoInJhdzEzOTQgLSBmYWlsZWQgdG8gZ2V0IGhhbmRsZTogJXMuXG4iLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAocmF3MTM5NF9nZXRfcG9ydF9pbmZvIChoYW5kbGUsIHBpbmYsIDE2KSA8IDApIHsKKyAgICAgIEdTVF9XQVJOSU5HICgicmF3MTM5NCAtIGZhaWxlZCB0byBnZXQgcG9ydCBpbmZvOiAlcy5cbiIsCisgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBnb3RvIG5leHQ7CisgICAgfQorCisgICAgLyogdGVsbCByYXcxMzk0IHdoaWNoIGhvc3QgYWRhcHRlciB0byB1c2UgKi8KKyAgICBpZiAocmF3MTM5NF9zZXRfcG9ydCAoaGFuZGxlLCBqKSA8IDApIHsKKyAgICAgIEdTVF9XQVJOSU5HICgicmF3MTM5NCAtIGZhaWxlZCB0byBzZXQgc2V0IHBvcnQ6ICVzLlxuIiwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBnb3RvIG5leHQ7CisgICAgfQorCisgICAgLyogbm93IGxvb3Agb3ZlciBhbGwgdGhlIG5vZGVzICovCisgICAgZm9yIChpID0gMDsgaSA8IHJhdzEzOTRfZ2V0X25vZGVjb3VudCAoaGFuZGxlKTsgaSsrKSB7CisgICAgICAvKiBhcmUgd2UgbG9va2luZyBmb3IgYW4gZXhwbGljaXQgR1VJRCA/ICovCisgICAgICBpZiAoc3JjLT5ndWlkICE9IDApIHsKKyAgICAgICAgaWYgKHNyYy0+Z3VpZCA9PSByb20xMzk0X2dldF9ndWlkIChoYW5kbGUsIGkpKSB7CisgICAgICAgICAgbm9kZSA9IGk7CisgICAgICAgICAgc3JjLT5wb3J0ID0gajsKKyAgICAgICAgICBnX2ZyZWUgKHNyYy0+dXJpKTsKKyAgICAgICAgICBzcmMtPnVyaSA9IGdfc3RyZHVwX3ByaW50ZiAoImR2Oi8vJWQiLCBzcmMtPnBvcnQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByb20xMzk0X2RpcmVjdG9yeSByb21fZGlyOworCisgICAgICAgIC8qIHNlbGVjdCBmaXJzdCBBVi9DIFRhcGUgUmVjb3JkZXIgUGxheWVyIG5vZGUgKi8KKyAgICAgICAgaWYgKHJvbTEzOTRfZ2V0X2RpcmVjdG9yeSAoaGFuZGxlLCBpLCAmcm9tX2RpcikgPCAwKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkcgKCJlcnJvciByZWFkaW5nIGNvbmZpZyByb20gZGlyZWN0b3J5IGZvciBub2RlICVkXG4iLCBpKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHJvbTEzOTRfZ2V0X25vZGVfdHlwZSAoJnJvbV9kaXIpID09IFJPTTEzOTRfTk9ERV9UWVBFX0FWQykgJiYKKyAgICAgICAgICAgIGF2YzEzOTRfY2hlY2tfc3VidW5pdF90eXBlIChoYW5kbGUsIGksIEFWQzEzOTRfU1VCVU5JVF9UWVBFX1ZDUikpIHsKKyAgICAgICAgICBub2RlID0gaTsKKyAgICAgICAgICBzcmMtPnBvcnQgPSBqOworICAgICAgICAgIHNyYy0+Z3VpZCA9IHJvbTEzOTRfZ2V0X2d1aWQgKGhhbmRsZSwgaSk7CisgICAgICAgICAgZ19mcmVlIChzcmMtPnVyaSk7CisgICAgICAgICAgc3JjLT51cmkgPSBnX3N0cmR1cF9wcmludGYgKCJkdjovLyVkIiwgc3JjLT5wb3J0KTsKKyAgICAgICAgICBnX2ZyZWUgKHNyYy0+ZGV2aWNlX25hbWUpOworICAgICAgICAgIHNyYy0+ZGV2aWNlX25hbWUgPSBnX3N0cmR1cCAocm9tX2Rpci5sYWJlbCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcm9tMTM5NF9mcmVlX2RpcmVjdG9yeSAoJnJvbV9kaXIpOworICAgICAgfQorICAgIH0KKyAgbmV4dDoKKyAgICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChoYW5kbGUpOworICB9CisgIHJldHVybiBub2RlOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdjEzOTRzcmNfc3RhcnQgKEdzdEJhc2VTcmMgKiBic3JjKQoreworICBHc3REVjEzOTRTcmMgKnNyYyA9IEdTVF9EVjEzOTRTUkMgKGJzcmMpOworICBpbnQgY29udHJvbF9zb2NrWzJdOworCisgIHNyYy0+Y29ubmVjdGVkID0gRkFMU0U7CisKKyAgaWYgKHNvY2tldHBhaXIgKFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBjb250cm9sX3NvY2spIDwgMCkKKyAgICBnb3RvIHNvY2tldF9wYWlyOworCisgIFJFQURfU09DS0VUIChzcmMpID0gY29udHJvbF9zb2NrWzBdOworICBXUklURV9TT0NLRVQgKHNyYykgPSBjb250cm9sX3NvY2tbMV07CisKKyAgaWYgKGZjbnRsIChSRUFEX1NPQ0tFVCAoc3JjKSwgRl9TRVRGTCwgT19OT05CTE9DSykgPCAwKQorICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNyYywgImZhaWxlZCB0byBtYWtlIHJlYWQgc29ja2V0IG5vbi1ibG9ja2luZzogJXMiLAorICAgICAgICBnX3N0cmVycm9yIChlcnJubykpOworICBpZiAoZmNudGwgKFdSSVRFX1NPQ0tFVCAoc3JjKSwgRl9TRVRGTCwgT19OT05CTE9DSykgPCAwKQorICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNyYywgImZhaWxlZCB0byBtYWtlIHdyaXRlIHNvY2tldCBub24tYmxvY2tpbmc6ICVzIiwKKyAgICAgICAgZ19zdHJlcnJvciAoZXJybm8pKTsKKworICBzcmMtPmhhbmRsZSA9IHJhdzEzOTRfbmV3X2hhbmRsZSAoKTsKKworICBpZiAoIXNyYy0+aGFuZGxlKSB7CisgICAgaWYgKGVycm5vID09IEVBQ0NFUykKKyAgICAgIGdvdG8gcGVybWlzc2lvbl9kZW5pZWQ7CisgICAgZWxzZSBpZiAoZXJybm8gPT0gRU5PRU5UKQorICAgICAgZ290byBub3RfZm91bmQ7CisgICAgZWxzZQorICAgICAgZ290byBub19oYW5kbGU7CisgIH0KKworICBzcmMtPm51bV9wb3J0cyA9IHJhdzEzOTRfZ2V0X3BvcnRfaW5mbyAoc3JjLT5oYW5kbGUsIHNyYy0+cGluZm8sIDE2KTsKKworICBpZiAoc3JjLT5udW1fcG9ydHMgPT0gMCkKKyAgICBnb3RvIG5vX3BvcnRzOworCisgIGlmIChzcmMtPnVzZV9hdmMgfHwgc3JjLT5wb3J0ID09IC0xKQorICAgIHNyYy0+YXZjX25vZGUgPSBnc3RfZHYxMzk0c3JjX2Rpc2NvdmVyX2F2Y19ub2RlIChzcmMpOworCisgIC8qIGxldHMgZGVzdHJveSBoYW5kbGUgYW5kIGNyZWF0ZSBvbmUgb24gcG9ydAorICAgICB0aGlzIGlzIG1vcmUgcmVsaWFibGUgdGhhbiBzZXR0aW5nIHBvcnQgb24KKyAgICAgdGhlIGV4aXN0aW5nIGhhbmRsZSAqLworICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChzcmMtPmhhbmRsZSk7CisgIHNyYy0+aGFuZGxlID0gcmF3MTM5NF9uZXdfaGFuZGxlX29uX3BvcnQgKHNyYy0+cG9ydCk7CisgIGlmICghc3JjLT5oYW5kbGUpCisgICAgZ290byBjYW5ub3Rfc2V0X3BvcnQ7CisKKyAgcmF3MTM5NF9zZXRfdXNlcmRhdGEgKHNyYy0+aGFuZGxlLCBzcmMpOworICByYXcxMzk0X3NldF9idXNfcmVzZXRfaGFuZGxlciAoc3JjLT5oYW5kbGUsIGdzdF9kdjEzOTRzcmNfYnVzX3Jlc2V0KTsKKworI2lmZGVmIEhBVkVfTElCSUVDNjE4ODMKKyAgaWYgKChzcmMtPmllYzYxODgzZHYgPQorICAgICAgICAgIGllYzYxODgzX2R2X2ZiX2luaXQgKHNyYy0+aGFuZGxlLAorICAgICAgICAgICAgICBnc3RfZHYxMzk0c3JjX2llYzYxODgzX3JlY2VpdmUsIHNyYykpID09IE5VTEwpCisgICAgZ290byBjYW5ub3RfaW5pdGlhbGlzZV9kdjsKKworI2Vsc2UKKyAgcmF3MTM5NF9zZXRfaXNvX2hhbmRsZXIgKHNyYy0+aGFuZGxlLCBzcmMtPmNoYW5uZWwsCisgICAgICBnc3RfZHYxMzk0c3JjX2lzb19yZWNlaXZlKTsKKyNlbmRpZgorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInN1Y2Nlc3NmdWxseSBvcGVuZWQgdXAgMTM5NCBjb25uZWN0aW9uIik7CisgIHNyYy0+Y29ubmVjdGVkID0gVFJVRTsKKworI2lmZGVmIEhBVkVfTElCSUVDNjE4ODMKKyAgaWYgKGllYzYxODgzX2R2X2ZiX3N0YXJ0IChzcmMtPmllYzYxODgzZHYsIHNyYy0+Y2hhbm5lbCkgIT0gMCkKKyAgICBnb3RvIGNhbm5vdF9zdGFydDsKKyNlbHNlCisgIGlmIChyYXcxMzk0X3N0YXJ0X2lzb19yY3YgKHNyYy0+aGFuZGxlLCBzcmMtPmNoYW5uZWwpIDwgMCkKKyAgICBnb3RvIGNhbm5vdF9zdGFydDsKKyNlbmRpZgorCisgIGlmIChzcmMtPnVzZV9hdmMpIHsKKyAgICByYXcxMzk0aGFuZGxlX3QgYXZjX2hhbmRsZSA9IHJhdzEzOTRfbmV3X2hhbmRsZV9vbl9wb3J0IChzcmMtPnBvcnQpOworCisgICAgLyogc3RhcnQgdGhlIFZDUiAqLworICAgIGlmIChhdmNfaGFuZGxlKSB7CisgICAgICBpZiAoIWF2YzEzOTRfdmNyX2lzX3JlY29yZGluZyAoYXZjX2hhbmRsZSwgc3JjLT5hdmNfbm9kZSkKKyAgICAgICAgICAmJiBhdmMxMzk0X3Zjcl9pc19wbGF5aW5nIChhdmNfaGFuZGxlLCBzcmMtPmF2Y19ub2RlKQorICAgICAgICAgICE9IEFWQzEzOTRfVkNSX09QRVJBTkRfUExBWV9GT1JXQVJEKQorICAgICAgICBhdmMxMzk0X3Zjcl9wbGF5IChhdmNfaGFuZGxlLCBzcmMtPmF2Y19ub2RlKTsKKyAgICAgIHJhdzEzOTRfZGVzdHJveV9oYW5kbGUgKGF2Y19oYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgIlN0YXJ0aW5nIFZDUiB2aWEgYXZjMTM5NCBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICBnX3N0cmVycm9yIChlcnJubykpOworICAgIH0KKyAgfQorCisgIGdzdF8xMzk0X2Nsb2NrX3NldF9oYW5kbGUgKHNyYy0+cHJvdmlkZWRfY2xvY2ssIHNyYy0+aGFuZGxlKTsKKworICByZXR1cm4gVFJVRTsKKworc29ja2V0X3BhaXI6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgT1BFTl9SRUFEX1dSSVRFLCAoTlVMTCksCisgICAgICAgIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorcGVybWlzc2lvbl9kZW5pZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgT1BFTl9SRUFELCAoTlVMTCksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm90X2ZvdW5kOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIE5PVF9GT1VORCwgKE5VTEwpLCBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX2hhbmRsZToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBPUEVOX1JFQUQsIChOVUxMKSwKKyAgICAgICAgKCJjYW4ndCBnZXQgcmF3MTM5NCBoYW5kbGUgKCVzKSIsIGdfc3RyZXJyb3IgKGVycm5vKSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fcG9ydHM6CisgIHsKKyAgICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChzcmMtPmhhbmRsZSk7CisgICAgc3JjLT5oYW5kbGUgPSBOVUxMOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBOT1RfRk9VTkQsIChOVUxMKSwKKyAgICAgICAgKCJubyBwb3J0cyBhdmFpbGFibGUgZm9yIHJhdzEzOTQiKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitjYW5ub3Rfc2V0X3BvcnQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJjYW4ndCBzZXQgMTM5NCBwb3J0ICVkIiwgc3JjLT5wb3J0KSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitjYW5ub3Rfc3RhcnQ6CisgIHsKKyAgICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChzcmMtPmhhbmRsZSk7CisgICAgc3JjLT5oYW5kbGUgPSBOVUxMOworI2lmZGVmIEhBVkVfTElCSUVDNjE4ODMKKyAgICBpZWM2MTg4M19kdl9mYl9jbG9zZSAoc3JjLT5pZWM2MTg4M2R2KTsKKyAgICBzcmMtPmllYzYxODgzZHYgPSBOVUxMOworI2VuZGlmCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIFJFQUQsIChOVUxMKSwKKyAgICAgICAgKCJjYW4ndCBzdGFydCAxMzk0IGlzbyByZWNlaXZlIikpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorI2lmZGVmIEhBVkVfTElCSUVDNjE4ODMKK2Nhbm5vdF9pbml0aWFsaXNlX2R2OgorICB7CisgICAgcmF3MTM5NF9kZXN0cm95X2hhbmRsZSAoc3JjLT5oYW5kbGUpOworICAgIHNyYy0+aGFuZGxlID0gTlVMTDsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgUkVBRCwgKE5VTEwpLAorICAgICAgICAoImNhbid0IGluaXRpYWxpc2UgaWVjNjE4ODMgZHYiKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisjZW5kaWYKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZHYxMzk0c3JjX3N0b3AgKEdzdEJhc2VTcmMgKiBic3JjKQoreworICBHc3REVjEzOTRTcmMgKnNyYyA9IEdTVF9EVjEzOTRTUkMgKGJzcmMpOworCisgIGNsb3NlIChSRUFEX1NPQ0tFVCAoc3JjKSk7CisgIGNsb3NlIChXUklURV9TT0NLRVQgKHNyYykpOworICBSRUFEX1NPQ0tFVCAoc3JjKSA9IC0xOworICBXUklURV9TT0NLRVQgKHNyYykgPSAtMTsKKyNpZmRlZiBIQVZFX0xJQklFQzYxODgzCisgIGllYzYxODgzX2R2X2ZiX2Nsb3NlIChzcmMtPmllYzYxODgzZHYpOworI2Vsc2UKKyAgcmF3MTM5NF9zdG9wX2lzb19yY3YgKHNyYy0+aGFuZGxlLCBzcmMtPmNoYW5uZWwpOworI2VuZGlmCisKKyAgaWYgKHNyYy0+dXNlX2F2YykgeworICAgIHJhdzEzOTRoYW5kbGVfdCBhdmNfaGFuZGxlID0gcmF3MTM5NF9uZXdfaGFuZGxlX29uX3BvcnQgKHNyYy0+cG9ydCk7CisKKyAgICAvKiBwYXVzZSBhbmQgc3RvcCB0aGUgVkNSICovCisgICAgaWYgKGF2Y19oYW5kbGUpIHsKKyAgICAgIGlmICghYXZjMTM5NF92Y3JfaXNfcmVjb3JkaW5nIChhdmNfaGFuZGxlLCBzcmMtPmF2Y19ub2RlKQorICAgICAgICAgICYmIChhdmMxMzk0X3Zjcl9pc19wbGF5aW5nIChhdmNfaGFuZGxlLCBzcmMtPmF2Y19ub2RlKQorICAgICAgICAgICAgICAhPSBBVkMxMzk0X1ZDUl9PUEVSQU5EX1BMQVlfRk9SV0FSRF9QQVVTRSkpCisgICAgICAgIGF2YzEzOTRfdmNyX3BhdXNlIChhdmNfaGFuZGxlLCBzcmMtPmF2Y19ub2RlKTsKKyAgICAgIGF2YzEzOTRfdmNyX3N0b3AgKGF2Y19oYW5kbGUsIHNyYy0+YXZjX25vZGUpOworICAgICAgcmF3MTM5NF9kZXN0cm95X2hhbmRsZSAoYXZjX2hhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiU3RhcnRpbmcgVkNSIHZpYSBhdmMxMzk0IGZhaWxlZDogJXMiLAorICAgICAgICAgIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgfQorICB9CisKKyAgZ3N0XzEzOTRfY2xvY2tfdW5zZXRfaGFuZGxlIChzcmMtPnByb3ZpZGVkX2Nsb2NrKTsKKworICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChzcmMtPmhhbmRsZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2R2MTM5NHNyY191bmxvY2sgKEdzdEJhc2VTcmMgKiBic3JjKQoreworICBHc3REVjEzOTRTcmMgKnNyYyA9IEdTVF9EVjEzOTRTUkMgKGJzcmMpOworCisgIFNFTkRfQ09NTUFORCAoc3JjLCBDT05UUk9MX1NUT1ApOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdjEzOTRzcmNfcXVlcnkgKEdzdEJhc2VTcmMgKiBiYXNlc3JjLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9MQVRFTkNZOgorICAgIHsKKyAgICAgIGdzdF9xdWVyeV9zZXRfbGF0ZW5jeSAocXVlcnksIFRSVUUsIEdTVF9TRUNPTkQgLyAyNSwgR1NUX1NFQ09ORCAvIDI1KTsKKyAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ290byBub3Rfc3VwcG9ydGVkOworICB9CisKKyAgcmV0dXJuIFRSVUU7CisKK25vdF9zdXBwb3J0ZWQ6CisgIHJldHVybiBHU1RfQkFTRV9TUkNfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnF1ZXJ5IChiYXNlc3JjLCBxdWVyeSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZHYxMzk0c3JjX3VwZGF0ZV9kZXZpY2VfbmFtZSAoR3N0RFYxMzk0U3JjICogc3JjKQoreworICByYXcxMzk0aGFuZGxlX3QgaGFuZGxlOworICBnaW50IHBvcnRjb3VudCwgcG9ydCwgbm9kZWNvdW50LCBub2RlOworICByb20xMzk0X2RpcmVjdG9yeSBkaXJlY3Rvcnk7CisKKyAgZ19mcmVlIChzcmMtPmRldmljZV9uYW1lKTsKKyAgc3JjLT5kZXZpY2VfbmFtZSA9IE5VTEw7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgInVwZGF0aW5nIGRldmljZSBuYW1lIGZvciBjdXJyZW50IEdVSUQiKTsKKworICBoYW5kbGUgPSByYXcxMzk0X25ld19oYW5kbGUgKCk7CisKKyAgaWYgKGhhbmRsZSA9PSBOVUxMKQorICAgIGdvdG8gZ2V0aGFuZGxlX2ZhaWxlZDsKKworICBwb3J0Y291bnQgPSByYXcxMzk0X2dldF9wb3J0X2luZm8gKGhhbmRsZSwgTlVMTCwgMCk7CisgIGZvciAocG9ydCA9IDA7IHBvcnQgPCBwb3J0Y291bnQ7IHBvcnQrKykgeworICAgIGlmIChyYXcxMzk0X3NldF9wb3J0IChoYW5kbGUsIHBvcnQpID49IDApIHsKKyAgICAgIG5vZGVjb3VudCA9IHJhdzEzOTRfZ2V0X25vZGVjb3VudCAoaGFuZGxlKTsKKyAgICAgIGZvciAobm9kZSA9IDA7IG5vZGUgPCBub2RlY291bnQ7IG5vZGUrKykgeworICAgICAgICBpZiAoc3JjLT5ndWlkID09IHJvbTEzOTRfZ2V0X2d1aWQgKGhhbmRsZSwgbm9kZSkpIHsKKyAgICAgICAgICBpZiAocm9tMTM5NF9nZXRfZGlyZWN0b3J5IChoYW5kbGUsIG5vZGUsICZkaXJlY3RvcnkpID49IDApIHsKKyAgICAgICAgICAgIGdfZnJlZSAoc3JjLT5kZXZpY2VfbmFtZSk7CisgICAgICAgICAgICBzcmMtPmRldmljZV9uYW1lID0gZ19zdHJkdXAgKGRpcmVjdG9yeS5sYWJlbCk7CisgICAgICAgICAgICByb20xMzk0X2ZyZWVfZGlyZWN0b3J5ICgmZGlyZWN0b3J5KTsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR1NUX1dBUk5JTkcgKCJlcnJvciByZWFkaW5nIHJvbSBkaXJlY3RvcnkgZm9yIG5vZGUgJWQiLCBub2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzcmMtPmRldmljZV9uYW1lID0gZ19zdHJkdXAgKCJVbmtub3duIik7ICAgICAgLyogRklYTUU6IHRyYW5zbGF0ZT8gKi8KKworZG9uZToKKworICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChoYW5kbGUpOworICByZXR1cm47CisKKy8qIEVSUk9SUyAqLworZ2V0aGFuZGxlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HICgiZmFpbGVkIHRvIGdldCByYXcxMzk0IGhhbmRsZTogJXMiLCBnX3N0cmVycm9yIChlcnJubykpOworICAgIHNyYy0+ZGV2aWNlX25hbWUgPSBnX3N0cmR1cCAoIlVua25vd24iKTsgICAgLyogRklYTUU6IHRyYW5zbGF0ZT8gKi8KKyAgICByZXR1cm47CisgIH0KK30KKworLyoqKiBHU1RVUklIQU5ETEVSIElOVEVSRkFDRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgR3N0VVJJVHlwZQorZ3N0X2R2MTM5NHNyY191cmlfZ2V0X3R5cGUgKEdUeXBlIHR5cGUpCit7CisgIHJldHVybiBHU1RfVVJJX1NSQzsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyICpjb25zdCAqCitnc3RfZHYxMzk0c3JjX3VyaV9nZXRfcHJvdG9jb2xzIChHVHlwZSB0eXBlKQoreworICBzdGF0aWMgY29uc3QgZ2NoYXIgKnByb3RvY29sc1tdID0geyAoY2hhciAqKSAiZHYiLCBOVUxMIH07CisKKyAgcmV0dXJuIHByb3RvY29sczsKK30KKworc3RhdGljIGdjaGFyICoKK2dzdF9kdjEzOTRzcmNfdXJpX2dldF91cmkgKEdzdFVSSUhhbmRsZXIgKiBoYW5kbGVyKQoreworICBHc3REVjEzOTRTcmMgKmdzdF9kdjEzOTRzcmMgPSBHU1RfRFYxMzk0U1JDIChoYW5kbGVyKTsKKworICByZXR1cm4gZ3N0X2R2MTM5NHNyYy0+dXJpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdjEzOTRzcmNfdXJpX3NldF91cmkgKEdzdFVSSUhhbmRsZXIgKiBoYW5kbGVyLCBjb25zdCBnY2hhciAqIHVyaSwKKyAgICBHRXJyb3IgKiogZXJyb3IpCit7CisgIGdjaGFyICpwcm90b2NvbCwgKmxvY2F0aW9uOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworICBHc3REVjEzOTRTcmMgKmdzdF9kdjEzOTRzcmMgPSBHU1RfRFYxMzk0U1JDIChoYW5kbGVyKTsKKworICBwcm90b2NvbCA9IGdzdF91cmlfZ2V0X3Byb3RvY29sICh1cmkpOworICBpZiAoc3RyY21wIChwcm90b2NvbCwgImR2IikgIT0gMCkgeworICAgIGdfZnJlZSAocHJvdG9jb2wpOworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgR1NUX1VSSV9FUlJPUiwgR1NUX1VSSV9FUlJPUl9CQURfVVJJLCAiSW52YWxpZCBEViBVUkkiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZ19mcmVlIChwcm90b2NvbCk7CisKKyAgbG9jYXRpb24gPSBnc3RfdXJpX2dldF9sb2NhdGlvbiAodXJpKTsKKyAgaWYgKGxvY2F0aW9uICYmICpsb2NhdGlvbiAhPSAnXDAnKQorICAgIGdzdF9kdjEzOTRzcmMtPnBvcnQgPSBzdHJ0b2wgKGxvY2F0aW9uLCBOVUxMLCAxMCk7CisgIGVsc2UKKyAgICBnc3RfZHYxMzk0c3JjLT5wb3J0ID0gREVGQVVMVF9QT1JUOworICBnX2ZyZWUgKGxvY2F0aW9uKTsKKyAgZ19mcmVlIChnc3RfZHYxMzk0c3JjLT51cmkpOworICBnc3RfZHYxMzk0c3JjLT51cmkgPSBnX3N0cmR1cF9wcmludGYgKCJkdjovLyVkIiwgZ3N0X2R2MTM5NHNyYy0+cG9ydCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kdjEzOTRzcmNfdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwgZ3BvaW50ZXIgaWZhY2VfZGF0YSkKK3sKKyAgR3N0VVJJSGFuZGxlckludGVyZmFjZSAqaWZhY2UgPSAoR3N0VVJJSGFuZGxlckludGVyZmFjZSAqKSBnX2lmYWNlOworCisgIGlmYWNlLT5nZXRfdHlwZSA9IGdzdF9kdjEzOTRzcmNfdXJpX2dldF90eXBlOworICBpZmFjZS0+Z2V0X3Byb3RvY29scyA9IGdzdF9kdjEzOTRzcmNfdXJpX2dldF9wcm90b2NvbHM7CisgIGlmYWNlLT5nZXRfdXJpID0gZ3N0X2R2MTM5NHNyY191cmlfZ2V0X3VyaTsKKyAgaWZhY2UtPnNldF91cmkgPSBnc3RfZHYxMzk0c3JjX3VyaV9zZXRfdXJpOworfQpkaWZmIC0tZ2l0IGEvZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmggYi9leHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmYzMzA4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfR1NUMTM5NF9IX18KKyNkZWZpbmUgX19HU1RfR1NUMTM5NF9IX18KKworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdHB1c2hzcmMuaD4KKyNpbmNsdWRlICJnc3QxMzk0Y2xvY2suaCIKKworI2luY2x1ZGUgPGxpYnJhdzEzOTQvcmF3MTM5NC5oPgorI2lmZGVmIEhBVkVfTElCSUVDNjE4ODMKKyNpbmNsdWRlIDxsaWJpZWM2MTg4My9pZWM2MTg4My5oPgorI2VuZGlmCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9EVjEzOTRTUkMgXAorICAoZ3N0X2R2MTM5NHNyY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfRFYxMzk0U1JDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfRFYxMzk0U1JDLEdzdERWMTM5NFNyYykpCisjZGVmaW5lIEdTVF9EVjEzOTRTUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfRFYxMzk0U1JDLEdzdERWMTM5NFNyY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0RWMTM5NFNSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0RWMTM5NFNSQykpCisjZGVmaW5lIEdTVF9JU19EVjEzOTRTUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfRFYxMzk0U1JDKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdERWMTM5NFNyYyBHc3REVjEzOTRTcmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0RFYxMzk0U3JjQ2xhc3MgR3N0RFYxMzk0U3JjQ2xhc3M7CisKK3N0cnVjdCBfR3N0RFYxMzk0U3JjIHsKKyAgR3N0UHVzaFNyYyBlbGVtZW50OworCisgIC8vIGNvbnNlY3V0aXZlPTIsIHNraXA9NCB3aWxsIHNraXAgNCBmcmFtZXMsIHRoZW4gbGV0IDIgY29uc2VjdXRpdmUgb25lcyB0aHJ1CisgIGdpbnQgY29uc2VjdXRpdmU7CisgIGdpbnQgc2tpcDsKKyAgZ2Jvb2xlYW4gZHJvcF9pbmNvbXBsZXRlOworCisgIGdpbnQgbnVtX3BvcnRzOworICBnaW50IHBvcnQ7CisgIGdpbnQgY2hhbm5lbDsKKyAgb2N0bGV0X3QgZ3VpZDsKKyAgZ2ludCBhdmNfbm9kZTsKKyAgZ2Jvb2xlYW4gdXNlX2F2YzsKKworICBzdHJ1Y3QgcmF3MTM5NF9wb3J0aW5mbyBwaW5mb1sxNl07CisgIHJhdzEzOTRoYW5kbGVfdCBoYW5kbGU7CisKKyAgR3N0QnVmZmVyICpidWY7CisgIAorICBHc3RCdWZmZXIgKmZyYW1lOworICBndWludCBmcmFtZV9zaXplOworICBndWludCBmcmFtZV9yYXRlOworICBndWludCBieXRlc19pbl9mcmFtZTsKKyAgZ3VpbnQgZnJhbWVfc2VxdWVuY2U7CisKKyAgaW50IGNvbnRyb2xfc29ja1syXTsKKworICBnY2hhciAqdXJpOworCisgIGdjaGFyICpkZXZpY2VfbmFtZTsKKworICBnYm9vbGVhbiBjb25uZWN0ZWQ7CisgICNpZmRlZiBIQVZFX0xJQklFQzYxODgzCisgIGllYzYxODgzX2R2X2ZiX3QgaWVjNjE4ODNkdjsKKyAgI2VuZGlmCisKKyAgR3N0MTM5NENsb2NrICpwcm92aWRlZF9jbG9jazsKK307CisKK3N0cnVjdCBfR3N0RFYxMzk0U3JjQ2xhc3MgeworICBHc3RQdXNoU3JjQ2xhc3MgcGFyZW50X2NsYXNzOworCisgIC8qIHNpZ25hbCAqLworICB2b2lkICgqZnJhbWVfZHJvcHBlZCkgIChHc3RFbGVtZW50ICplbGVtKTsKK307CisKK0dUeXBlIGdzdF9kdjEzOTRzcmNfZ2V0X3R5cGUodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9HU1QxMzk0X0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5jIGIvZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0Y2ViNGYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmMKQEAgLTAsMCArMSw4NDEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOD4gRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtaGR2MTM5NHNyYworICoKKyAqIFJlYWQgTVBFRy1UUyBkYXRhIGZyb20gZmlyZXdpcmUgcG9ydC4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgaGR2MTM5NHNyYyAhIHF1ZXVlICEgZGVjb2RlYmluIG5hbWU9ZCAhIHF1ZXVlICEgeHZpbWFnZXNpbmsgZC4gISBxdWV1ZSAhIGFsc2FzaW5rCisgKiBdfCBjYXB0dXJlcyBmcm9tIHRoZSBmaXJld2lyZSBwb3J0IGFuZCBwbGF5cyB0aGUgc3RyZWFtcy4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBoZHYxMzk0c3JjICEgcXVldWUgISBmaWxlc2luayBsb2NhdGlvbj1teWR1bXAudHMKKyAqIF18IGNhcHR1cmUgdG8gYSBkaXNrIGZpbGUKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGxpYmF2YzEzOTQvYXZjMTM5NC5oPgorI2luY2x1ZGUgPGxpYmF2YzEzOTQvYXZjMTM5NF92Y3IuaD4KKyNpbmNsdWRlIDxsaWJhdmMxMzk0L3JvbTEzOTQuaD4KKyNpbmNsdWRlIDxsaWJyYXcxMzk0L3JhdzEzOTQuaD4KKyNpbmNsdWRlIDxsaWJpZWM2MTg4My9pZWM2MTg4My5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisjaW5jbHVkZSAiZ3N0aGR2MTM5NHNyYy5oIgorI2luY2x1ZGUgImdzdDEzOTRwcm9iZS5oIgorCisKKyNkZWZpbmUgQ09OVFJPTF9TVE9QICAgICAgICAgICAgJ1MnICAgICAvKiBzdG9wIHRoZSBzZWxlY3QgY2FsbCAqLworI2RlZmluZSBDT05UUk9MX1NPQ0tFVFMoc3JjKSAgIHNyYy0+Y29udHJvbF9zb2NrCisjZGVmaW5lIFdSSVRFX1NPQ0tFVChzcmMpICAgICAgc3JjLT5jb250cm9sX3NvY2tbMV0KKyNkZWZpbmUgUkVBRF9TT0NLRVQoc3JjKSAgICAgICBzcmMtPmNvbnRyb2xfc29ja1swXQorCisjZGVmaW5lIFNFTkRfQ09NTUFORChzcmMsIGNvbW1hbmQpICAgICAgICAgIFwKK0dfU1RNVF9TVEFSVCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgR19HTlVDX1VOVVNFRCBfcmVzOyB1bnNpZ25lZCBjaGFyIGM7IGMgPSBjb21tYW5kOyAgIFwKKyAgX3JlcyA9IHdyaXRlIChXUklURV9TT0NLRVQoc3JjKSwgJmMsIDEpOyAgXAorfSBHX1NUTVRfRU5ECisKKyNkZWZpbmUgUkVBRF9DT01NQU5EKHNyYywgY29tbWFuZCwgcmVzKSAgICAgICAgXAorR19TVE1UX1NUQVJUIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJlcyA9IHJlYWQoUkVBRF9TT0NLRVQoc3JjKSwgJmNvbW1hbmQsIDEpOyAgIFwKK30gR19TVE1UX0VORAorCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGhkdjEzOTRzcmNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKGhkdjEzOTRzcmNfZGVidWcpCisKKyNkZWZpbmUgREVGQVVMVF9QT1JUICAgIC0xCisjZGVmaW5lIERFRkFVTFRfQ0hBTk5FTCAgIDYzCisjZGVmaW5lIERFRkFVTFRfVVNFX0FWQyAgIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9HVUlEICAgIDAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUE9SVCwKKyAgUFJPUF9DSEFOTkVMLAorICBQUk9QX1VTRV9BVkMsCisgIFBST1BfR1VJRCwKKyAgUFJPUF9ERVZJQ0VfTkFNRQorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUworICAgICgidmlkZW8vbXBlZ3RzLHN5c3RlbXN0cmVhbT0oYm9vbGVhbil0cnVlLHBhY2tldHNpemU9KGludCkxODgiKQorICAgICk7CisKK3N0YXRpYyB2b2lkIGdzdF9oZHYxMzk0c3JjX3VyaV9oYW5kbGVyX2luaXQgKGdwb2ludGVyIGdfaWZhY2UsCisgICAgZ3BvaW50ZXIgaWZhY2VfZGF0YSk7CisKK3N0YXRpYyB2b2lkIGdzdF9oZHYxMzk0c3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9oZHYxMzk0c3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9oZHYxMzk0c3JjX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2hkdjEzOTRzcmNfc3RhcnQgKEdzdEJhc2VTcmMgKiBic3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfaGR2MTM5NHNyY19zdG9wIChHc3RCYXNlU3JjICogYnNyYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2hkdjEzOTRzcmNfdW5sb2NrIChHc3RCYXNlU3JjICogYnNyYyk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9oZHYxMzk0c3JjX2NyZWF0ZSAoR3N0UHVzaFNyYyAqIHBzcmMsCisgICAgR3N0QnVmZmVyICoqIGJ1Zik7CisKK3N0YXRpYyB2b2lkIGdzdF9oZHYxMzk0c3JjX3VwZGF0ZV9kZXZpY2VfbmFtZSAoR3N0SERWMTM5NFNyYyAqIHNyYyk7CisKKyNkZWZpbmUgZ3N0X2hkdjEzOTRzcmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdEhEVjEzOTRTcmMsIGdzdF9oZHYxMzk0c3JjLCBHU1RfVFlQRV9QVVNIX1NSQywKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1VSSV9IQU5ETEVSLAorICAgICAgICBnc3RfaGR2MTM5NHNyY191cmlfaGFuZGxlcl9pbml0KSk7CisKK3N0YXRpYyB2b2lkCitnc3RfaGR2MTM5NHNyY19jbGFzc19pbml0IChHc3RIRFYxMzk0U3JjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEJhc2VTcmNDbGFzcyAqZ3N0YmFzZXNyY19jbGFzczsKKyAgR3N0UHVzaFNyY0NsYXNzICpnc3RwdXNoc3JjX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YmFzZXNyY19jbGFzcyA9IChHc3RCYXNlU3JjQ2xhc3MgKikga2xhc3M7CisgIGdzdHB1c2hzcmNfY2xhc3MgPSAoR3N0UHVzaFNyY0NsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9oZHYxMzk0c3JjX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2hkdjEzOTRzcmNfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X2hkdjEzOTRzcmNfZGlzcG9zZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1BPUlQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicG9ydCIsICJQb3J0IiwgIlBvcnQgbnVtYmVyICgtMSBhdXRvbWF0aWMpIiwKKyAgICAgICAgICAtMSwgMTYsIERFRkFVTFRfUE9SVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQ0hBTk5FTCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJjaGFubmVsIiwgIkNoYW5uZWwiLCAiQ2hhbm5lbCBudW1iZXIgZm9yIGxpc3RlbmluZyIsCisgICAgICAgICAgMCwgNjQsIERFRkFVTFRfQ0hBTk5FTCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfVVNFX0FWQywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgidXNlLWF2YyIsICJVc2UgQVYvQyIsICJVc2UgQVYvQyBWVFIgY29udHJvbCIsCisgICAgICAgICAgREVGQVVMVF9VU0VfQVZDLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9HVUlELAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoImd1aWQiLCAiR1VJRCIsCisgICAgICAgICAgInNlbGVjdCBvbmUgb2YgbXVsdGlwbGUgRFYgZGV2aWNlcyBieSBpdHMgR1VJRC4gdXNlIGEgaGV4YWRlY2ltYWwgIgorICAgICAgICAgICJsaWtlIDB4aGhoaGhoaGhoaGhoaGhoaC4gKDAgPSBubyBndWlkKSIsIDAsIEdfTUFYVUlOVDY0LAorICAgICAgICAgIERFRkFVTFRfR1VJRCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RIRFYxMzk0U3JjOmRldmljZS1uYW1lOgorICAgKgorICAgKiBEZXNjcmlwdGl2ZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgb3BlbmVkIGRldmljZQorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9ERVZJQ0VfTkFNRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJkZXZpY2UtbmFtZSIsICJkZXZpY2UgbmFtZSIsCisgICAgICAgICAgInVzZXItZnJpZW5kbHkgbmFtZSBvZiB0aGUgZGV2aWNlIiwgIkRlZmF1bHQiLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0YmFzZXNyY19jbGFzcy0+bmVnb3RpYXRlID0gTlVMTDsKKyAgZ3N0YmFzZXNyY19jbGFzcy0+c3RhcnQgPSBnc3RfaGR2MTM5NHNyY19zdGFydDsKKyAgZ3N0YmFzZXNyY19jbGFzcy0+c3RvcCA9IGdzdF9oZHYxMzk0c3JjX3N0b3A7CisgIGdzdGJhc2VzcmNfY2xhc3MtPnVubG9jayA9IGdzdF9oZHYxMzk0c3JjX3VubG9jazsKKworICBnc3RwdXNoc3JjX2NsYXNzLT5jcmVhdGUgPSBnc3RfaGR2MTM5NHNyY19jcmVhdGU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfZmFjdG9yeSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJGaXJld2lyZSAoMTM5NCkgSERWIHZpZGVvIHNvdXJjZSIsICJTb3VyY2UvVmlkZW8iLAorICAgICAgIlNvdXJjZSBmb3IgTVBFRy1UUyB2aWRlbyBkYXRhIGZyb20gZmlyZXdpcmUgcG9ydCIsCisgICAgICAiRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoaGR2MTM5NHNyY19kZWJ1ZywgImhkdjEzOTRzcmMiLCAwLAorICAgICAgIk1QRUctVFMgZmlyZXdpcmUgc291cmNlIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaGR2MTM5NHNyY19pbml0IChHc3RIRFYxMzk0U3JjICogZHYxMzk0c3JjKQoreworICBHc3RQYWQgKnNyY3BhZCA9IEdTVF9CQVNFX1NSQ19QQUQgKGR2MTM5NHNyYyk7CisKKyAgZ3N0X2Jhc2Vfc3JjX3NldF9saXZlIChHU1RfQkFTRV9TUkMgKGR2MTM5NHNyYyksIFRSVUUpOworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChzcmNwYWQpOworCisgIGR2MTM5NHNyYy0+cG9ydCA9IERFRkFVTFRfUE9SVDsKKyAgZHYxMzk0c3JjLT5jaGFubmVsID0gREVGQVVMVF9DSEFOTkVMOworCisgIGR2MTM5NHNyYy0+dXNlX2F2YyA9IERFRkFVTFRfVVNFX0FWQzsKKyAgZHYxMzk0c3JjLT5ndWlkID0gREVGQVVMVF9HVUlEOworICBkdjEzOTRzcmMtPnVyaSA9IGdfc3RyZHVwX3ByaW50ZiAoImhkdjovLyVkIiwgZHYxMzk0c3JjLT5wb3J0KTsKKyAgZHYxMzk0c3JjLT5kZXZpY2VfbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoIkRlZmF1bHQiKTsKKworICBSRUFEX1NPQ0tFVCAoZHYxMzk0c3JjKSA9IC0xOworICBXUklURV9TT0NLRVQgKGR2MTM5NHNyYykgPSAtMTsKKworICBkdjEzOTRzcmMtPmZyYW1lX3NlcXVlbmNlID0gMDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9oZHYxMzk0c3JjX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEhEVjEzOTRTcmMgKnNyYyA9IEdTVF9IRFYxMzk0U1JDIChvYmplY3QpOworCisgIGdfZnJlZSAoc3JjLT51cmkpOworICBzcmMtPnVyaSA9IE5VTEw7CisKKyAgZ19mcmVlIChzcmMtPmRldmljZV9uYW1lKTsKKyAgc3JjLT5kZXZpY2VfbmFtZSA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaGR2MTM5NHNyY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0SERWMTM5NFNyYyAqZmlsdGVyID0gR1NUX0hEVjEzOTRTUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BPUlQ6CisgICAgICBmaWx0ZXItPnBvcnQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGdfZnJlZSAoZmlsdGVyLT51cmkpOworICAgICAgZmlsdGVyLT51cmkgPSBnX3N0cmR1cF9wcmludGYgKCJoZHY6Ly8lZCIsIGZpbHRlci0+cG9ydCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0hBTk5FTDoKKyAgICAgIGZpbHRlci0+Y2hhbm5lbCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VTRV9BVkM6CisgICAgICBmaWx0ZXItPnVzZV9hdmMgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfR1VJRDoKKyAgICAgIGZpbHRlci0+Z3VpZCA9IGdfdmFsdWVfZ2V0X3VpbnQ2NCAodmFsdWUpOworICAgICAgZ3N0X2hkdjEzOTRzcmNfdXBkYXRlX2RldmljZV9uYW1lIChmaWx0ZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaGR2MTM5NHNyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0SERWMTM5NFNyYyAqZmlsdGVyID0gR1NUX0hEVjEzOTRTUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BPUlQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBmaWx0ZXItPnBvcnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NIQU5ORUw6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBmaWx0ZXItPmNoYW5uZWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VTRV9BVkM6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZmlsdGVyLT51c2VfYXZjKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9HVUlEOgorICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgZmlsdGVyLT5ndWlkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ERVZJQ0VfTkFNRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIGZpbHRlci0+ZGV2aWNlX25hbWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgR3N0SERWMTM5NFNyYyAqCitnc3RfaGR2MTM5NHNyY19mcm9tX3JhdzEzOTRoYW5kbGUgKHJhdzEzOTRoYW5kbGVfdCBoYW5kbGUpCit7CisgIGllYzYxODgzX21wZWcyX3QgbXBlZzIgPSAoaWVjNjE4ODNfbXBlZzJfdCkgcmF3MTM5NF9nZXRfdXNlcmRhdGEgKGhhbmRsZSk7CisgIHJldHVybiBHU1RfSERWMTM5NFNSQyAoaWVjNjE4ODNfbXBlZzJfZ2V0X2NhbGxiYWNrX2RhdGEgKG1wZWcyKSk7Cit9CisKKy8qIFdpdGhpbiBvbmUgbG9vcCBpdGVyYXRpb24gKHdoaWNoIG1heSBjYWxsIF9yZWNlaXZlKCkgbWFueSB0aW1lcyksIGl0IHNlZW1zCisgKiBhcyB0aG91Z2ggJypkYXRhJyB3aWxsIGFsd2F5cyBiZSBkaWZmZXJlbnQuCisgKgorICogV2UgY2FuIHRoZXJlZm9yZSBhc3N1bWUgdGhhdCBhbnkgJypkYXRhJyBnaXZlbiB0byB1cyB3aWxsIHN0YXkgYWxsb2NhdGVkIHVudGlsCisgKiB0aGUgbmV4dCBsb29wIGl0ZXJhdGlvbi4KKyAqLworCitzdGF0aWMgaW50Citnc3RfaGR2MTM5NHNyY19pZWM2MTg4M19yZWNlaXZlICh1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuLAorICAgIHVuc2lnbmVkIGludCBkcm9wcGVkLCB2b2lkICpjYmRhdGEpCit7CisgIEdzdEhEVjEzOTRTcmMgKmR2MTM5NHNyYyA9IEdTVF9IRFYxMzk0U1JDIChjYmRhdGEpOworCisgIEdTVF9MT0cgKCJkYXRhOiVwLCBsZW46JWQsIGRyb3BwZWQ6JWQiLCBkYXRhLCBsZW4sIGRyb3BwZWQpOworCisgIC8qIGVycm9yIG91dCBpZiB3ZSBkb24ndCBoYXZlIGVub3VnaCByb29tICEgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKGR2MTM5NHNyYy0+b3V0b2Zmc2V0ID4gKDIwNDggKiAxODggLSBsZW4pKSkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKEdfTElLRUxZIChsZW4gPT0gSUVDNjE4ODNfTVBFRzJfVFNQX1NJWkUpKSB7CisgICAgbWVtY3B5ICgoZ3VpbnQ4ICopIGR2MTM5NHNyYy0+b3V0ZGF0YSArIGR2MTM5NHNyYy0+b3V0b2Zmc2V0LCBkYXRhLCBsZW4pOworICAgIGR2MTM5NHNyYy0+b3V0b2Zmc2V0ICs9IGxlbjsKKyAgfQorICBkdjEzOTRzcmMtPmZyYW1lX3NlcXVlbmNlKys7CisgIHJldHVybiAwOworfQorCisvKgorICogV2hlbiBhbiBpZWVlMTM5NCBidXMgcmVzZXQgaGFwcGVucywgdXN1YWxseSBhIGRldmljZSBoYXMgYmVlbiByZW1vdmVkCisgKiBvciBhZGRlZC4gIFdlIHNlbmQgYSBtZXNzYWdlIG9uIHRoZSBtZXNzYWdlIGJ1cyB3aXRoIHRoZSBub2RlIGNvdW50IAorICogYW5kIHdoZXRoZXIgdGhlIGNhcHR1cmUgZGV2aWNlIHVzZWQgaW4gdGhpcyBlbGVtZW50IGNvbm5lY3RlZCwgZGlzY29ubmVjdGVkIAorICogb3Igd2FzIHVuY2hhbmdlZAorICogTWVzc2FnZSBzdHJ1Y3R1cmU6CisgKiBub2RlY291bnQgLSBpbnRlZ2VyIHdpdGggbnVtYmVyIG9mIG5vZGVzIG9uIGJ1cworICogY3VycmVudC1kZXZpY2UtY2hhbmdlIC0gaW50ZWdlciAoMSBpZiBkZXZpY2UgY29ubmVjdGVkLCAwIGlmIG5vIGNoYW5nZSB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBkZXZpY2Ugc3RhdHVzLCAtMSBpZiBkZXZpY2UgZGlzY29ubmVjdGVkKQorICovCitzdGF0aWMgaW50Citnc3RfaGR2MTM5NHNyY19idXNfcmVzZXQgKHJhdzEzOTRoYW5kbGVfdCBoYW5kbGUsIHVuc2lnbmVkIGludCBnZW5lcmF0aW9uKQoreworICBHc3RIRFYxMzk0U3JjICpzcmM7CisgIGdpbnQgbm9kZWNvdW50OworICBHc3RNZXNzYWdlICptZXNzYWdlOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2ludCBjdXJyZW50X2RldmljZV9jaGFuZ2U7CisgIGdpbnQgaTsKKworICBzcmMgPSBnc3RfaGR2MTM5NHNyY19mcm9tX3JhdzEzOTRoYW5kbGUgKGhhbmRsZSk7CisKKyAgR1NUX0lORk9fT0JKRUNUIChzcmMsICJoYXZlIGJ1cyByZXNldCIpOworCisgIC8qIHVwZGF0ZSBnZW5lcmF0aW9uIC0gdG9sZCB0byBkbyBzbyBieSBkb2NzICovCisgIHJhdzEzOTRfdXBkYXRlX2dlbmVyYXRpb24gKGhhbmRsZSwgZ2VuZXJhdGlvbik7CisgIG5vZGVjb3VudCA9IHJhdzEzOTRfZ2V0X25vZGVjb3VudCAoaGFuZGxlKTsKKyAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBwb3J0aW5mbyAqLworCisgIC8qIGN1cnJlbnRfZGV2aWNlX2NoYW5nZSBpcyAtMSBpZiBjYW1lcmEgZGlzY29ubmVjdGVkLCAwIGlmIG90aGVyIGRldmljZQorICAgKiBjb25uZWN0ZWQgb3IgMSBpZiBjYW1lcmEgaGFzIG5vdyBjb25uZWN0ZWQgKi8KKyAgY3VycmVudF9kZXZpY2VfY2hhbmdlID0gLTE7CisgIGZvciAoaSA9IDA7IGkgPCBub2RlY291bnQ7IGkrKykgeworICAgIGlmIChzcmMtPmd1aWQgPT0gcm9tMTM5NF9nZXRfZ3VpZCAoaGFuZGxlLCBpKSkgeworICAgICAgLyogQ2FtZXJhIGlzIHdpdGggdXMgKi8KKyAgICAgIEdTVF9ERUJVRyAoIkNhbWVyYSBpcyB3aXRoIHVzIik7CisgICAgICBpZiAoIXNyYy0+Y29ubmVjdGVkKSB7CisgICAgICAgIGN1cnJlbnRfZGV2aWNlX2NoYW5nZSA9IDE7CisgICAgICAgIHNyYy0+Y29ubmVjdGVkID0gVFJVRTsKKyAgICAgIH0gZWxzZQorICAgICAgICBjdXJyZW50X2RldmljZV9jaGFuZ2UgPSAwOworICAgIH0KKyAgfQorICBpZiAoc3JjLT5jb25uZWN0ZWQgJiYgY3VycmVudF9kZXZpY2VfY2hhbmdlID09IC0xKSB7CisgICAgR1NUX0RFQlVHICgiQ2FtZXJhIGhhcyBkaXNjb25uZWN0ZWQiKTsKKyAgICBzcmMtPmNvbm5lY3RlZCA9IEZBTFNFOworICB9IGVsc2UgaWYgKCFzcmMtPmNvbm5lY3RlZCAmJiBjdXJyZW50X2RldmljZV9jaGFuZ2UgPT0gLTEpIHsKKyAgICBHU1RfREVCVUcgKCJDYW1lcmEgaXMgc3RpbGwgbm90IHdpdGggdXMiKTsKKyAgICBjdXJyZW50X2RldmljZV9jaGFuZ2UgPSAwOworICB9CisKKyAgc3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJpZWVlMTM5NC1idXMtcmVzZXQiLCAibm9kZWNvdW50IiwgR19UWVBFX0lOVCwKKyAgICAgIG5vZGVjb3VudCwgImN1cnJlbnQtZGV2aWNlLWNoYW5nZSIsIEdfVFlQRV9JTlQsIGN1cnJlbnRfZGV2aWNlX2NoYW5nZSwKKyAgICAgIE5VTEwpOworICBtZXNzYWdlID0gZ3N0X21lc3NhZ2VfbmV3X2VsZW1lbnQgKEdTVF9PQkpFQ1QgKHNyYyksIHN0cnVjdHVyZSk7CisgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKHNyYyksIG1lc3NhZ2UpOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2hkdjEzOTRzcmNfY3JlYXRlIChHc3RQdXNoU3JjICogcHNyYywgR3N0QnVmZmVyICoqIGJ1ZikKK3sKKyAgR3N0SERWMTM5NFNyYyAqZHYxMzk0c3JjID0gR1NUX0hEVjEzOTRTUkMgKHBzcmMpOworICBzdHJ1Y3QgcG9sbGZkIHBvbGxmZHNbMl07CisKKyAgcG9sbGZkc1swXS5mZCA9IHJhdzEzOTRfZ2V0X2ZkIChkdjEzOTRzcmMtPmhhbmRsZSk7CisgIHBvbGxmZHNbMF0uZXZlbnRzID0gUE9MTElOIHwgUE9MTEVSUiB8IFBPTExIVVAgfCBQT0xMUFJJOworICBwb2xsZmRzWzFdLmZkID0gUkVBRF9TT0NLRVQgKGR2MTM5NHNyYyk7CisgIHBvbGxmZHNbMV0uZXZlbnRzID0gUE9MTElOIHwgUE9MTEVSUiB8IFBPTExIVVAgfCBQT0xMUFJJOworCisgIC8qIGFsbG9jYXRlIGEgMjA0OCBzYW1wbGVzIGJ1ZmZlciAqLworICBkdjEzOTRzcmMtPm91dGRhdGEgPSBnX21hbGxvYyAoMjA0OCAqIDE4OCk7CisgIGR2MTM5NHNyYy0+b3V0b2Zmc2V0ID0gMDsKKworICBHU1RfREVCVUcgKCJDcmVhdGUuLi4iKTsKKworICB3aGlsZSAoVFJVRSkgeworICAgIGludCByZXMgPSBwb2xsIChwb2xsZmRzLCAyLCAtMSk7CisKKyAgICBHU1RfTE9HICgicmVzOiVkIiwgcmVzKTsKKworICAgIGlmIChHX1VOTElLRUxZIChyZXMgPCAwKSkgeworICAgICAgaWYgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFSU5UUikKKyAgICAgICAgY29udGludWU7CisgICAgICBlbHNlCisgICAgICAgIGdvdG8gZXJyb3Jfd2hpbGVfcG9sbGluZzsKKyAgICB9CisKKyAgICBpZiAoR19VTkxJS0VMWSAocG9sbGZkc1sxXS5yZXZlbnRzKSkgeworICAgICAgY2hhciBjb21tYW5kOworCisgICAgICBpZiAocG9sbGZkc1sxXS5yZXZlbnRzICYgUE9MTElOKQorICAgICAgICBSRUFEX0NPTU1BTkQgKGR2MTM5NHNyYywgY29tbWFuZCwgcmVzKTsKKworICAgICAgZ290byB0b2xkX3RvX3N0b3A7CisgICAgfSBlbHNlIGlmIChHX0xJS0VMWSAocG9sbGZkc1swXS5yZXZlbnRzICYgUE9MTElOKSkgeworICAgICAgaW50IHB0OworCisgICAgICBwdCA9IGR2MTM5NHNyYy0+ZnJhbWVfc2VxdWVuY2U7CisgICAgICAvKiBzaG91bGRuJ3QgYmxvY2sgaW4gdGhlb3J5ICovCisgICAgICBHU1RfTE9HICgiSXRlcmF0aW5nICEgKCVkKSIsIGR2MTM5NHNyYy0+ZnJhbWVfc2VxdWVuY2UpOworICAgICAgcmF3MTM5NF9sb29wX2l0ZXJhdGUgKGR2MTM5NHNyYy0+aGFuZGxlKTsKKyAgICAgIEdTVF9MT0cgKCJBZnRlciBpdGVyYXRpb24gOiAlZCAoZGlmZjolZCkiLAorICAgICAgICAgIGR2MTM5NHNyYy0+ZnJhbWVfc2VxdWVuY2UsIGR2MTM5NHNyYy0+ZnJhbWVfc2VxdWVuY2UgLSBwdCk7CisgICAgICBpZiAoZHYxMzk0c3JjLT5vdXRvZmZzZXQpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGdfYXNzZXJ0IChkdjEzOTRzcmMtPm91dG9mZnNldCk7CisKKyAgR1NUX0xPRyAoIldlIGhhdmUgc29tZSBmcmFtZXMgKCV1IGJ5dGVzKSIsIChndWludCkgZHYxMzk0c3JjLT5vdXRvZmZzZXQpOworCisgIC8qIENyZWF0ZSB0aGUgYnVmZmVyICovCisgICpidWYgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChkdjEzOTRzcmMtPm91dGRhdGEsIGR2MTM5NHNyYy0+b3V0b2Zmc2V0KTsKKyAgZHYxMzk0c3JjLT5vdXRkYXRhID0gTlVMTDsKKyAgZHYxMzk0c3JjLT5vdXRvZmZzZXQgPSAwOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworZXJyb3Jfd2hpbGVfcG9sbGluZzoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkdjEzOTRzcmMsIFJFU09VUkNFLCBSRUFELCAoTlVMTCksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisgIH0KK3RvbGRfdG9fc3RvcDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR2MTM5NHNyYywgInRvbGQgdG8gc3RvcCwgc2h1dHRpbmcgZG93biIpOworICAgIHJldHVybiBHU1RfRkxPV19GTFVTSElORzsKKyAgfQorfQorCitzdGF0aWMgaW50Citnc3RfaGR2MTM5NHNyY19kaXNjb3Zlcl9hdmNfbm9kZSAoR3N0SERWMTM5NFNyYyAqIHNyYykKK3sKKyAgaW50IG5vZGUgPSAtMTsKKyAgaW50IGksIGogPSAwOworICBpbnQgbSA9IHNyYy0+bnVtX3BvcnRzOworCisgIGlmIChzcmMtPnBvcnQgPj0gMCkgeworICAgIC8qIHNlYXJjaCBvbiBleHBsaWNpdCBwb3J0ICovCisgICAgaiA9IHNyYy0+cG9ydDsKKyAgICBtID0gaiArIDE7CisgIH0KKworICAvKiBsb29wIG92ZXIgYWxsIG91ciBwb3J0cyAqLworICBmb3IgKDsgaiA8IG0gJiYgbm9kZSA9PSAtMTsgaisrKSB7CisgICAgcmF3MTM5NGhhbmRsZV90IGhhbmRsZTsKKyAgICBzdHJ1Y3QgcmF3MTM5NF9wb3J0aW5mbyBwaW5mWzE2XTsKKworICAgIC8qIG9wZW4gdGhlIHBvcnQgKi8KKyAgICBoYW5kbGUgPSByYXcxMzk0X25ld19oYW5kbGUgKCk7CisgICAgaWYgKCFoYW5kbGUpIHsKKyAgICAgIEdTVF9XQVJOSU5HICgicmF3MTM5NCAtIGZhaWxlZCB0byBnZXQgaGFuZGxlOiAlcy5cbiIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChyYXcxMzk0X2dldF9wb3J0X2luZm8gKGhhbmRsZSwgcGluZiwgMTYpIDwgMCkgeworICAgICAgR1NUX1dBUk5JTkcgKCJyYXcxMzk0IC0gZmFpbGVkIHRvIGdldCBwb3J0IGluZm86ICVzLlxuIiwKKyAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGdvdG8gbmV4dDsKKyAgICB9CisKKyAgICAvKiB0ZWxsIHJhdzEzOTQgd2hpY2ggaG9zdCBhZGFwdGVyIHRvIHVzZSAqLworICAgIGlmIChyYXcxMzk0X3NldF9wb3J0IChoYW5kbGUsIGopIDwgMCkgeworICAgICAgR1NUX1dBUk5JTkcgKCJyYXcxMzk0IC0gZmFpbGVkIHRvIHNldCBzZXQgcG9ydDogJXMuXG4iLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGdvdG8gbmV4dDsKKyAgICB9CisKKyAgICAvKiBub3cgbG9vcCBvdmVyIGFsbCB0aGUgbm9kZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcmF3MTM5NF9nZXRfbm9kZWNvdW50IChoYW5kbGUpOyBpKyspIHsKKyAgICAgIC8qIGFyZSB3ZSBsb29raW5nIGZvciBhbiBleHBsaWNpdCBHVUlEID8gKi8KKyAgICAgIGlmIChzcmMtPmd1aWQgIT0gMCkgeworICAgICAgICBpZiAoc3JjLT5ndWlkID09IHJvbTEzOTRfZ2V0X2d1aWQgKGhhbmRsZSwgaSkpIHsKKyAgICAgICAgICBub2RlID0gaTsKKyAgICAgICAgICBzcmMtPnBvcnQgPSBqOworICAgICAgICAgIGdfZnJlZSAoc3JjLT51cmkpOworICAgICAgICAgIHNyYy0+dXJpID0gZ19zdHJkdXBfcHJpbnRmICgiZHY6Ly8lZCIsIHNyYy0+cG9ydCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJvbTEzOTRfZGlyZWN0b3J5IHJvbV9kaXI7CisKKyAgICAgICAgLyogc2VsZWN0IGZpcnN0IEFWL0MgVGFwZSBSZWNvcmRlciBQbGF5ZXIgbm9kZSAqLworICAgICAgICBpZiAocm9tMTM5NF9nZXRfZGlyZWN0b3J5IChoYW5kbGUsIGksICZyb21fZGlyKSA8IDApIHsKKyAgICAgICAgICBHU1RfV0FSTklORyAoImVycm9yIHJlYWRpbmcgY29uZmlnIHJvbSBkaXJlY3RvcnkgZm9yIG5vZGUgJWRcbiIsIGkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgocm9tMTM5NF9nZXRfbm9kZV90eXBlICgmcm9tX2RpcikgPT0gUk9NMTM5NF9OT0RFX1RZUEVfQVZDKSAmJgorICAgICAgICAgICAgYXZjMTM5NF9jaGVja19zdWJ1bml0X3R5cGUgKGhhbmRsZSwgaSwgQVZDMTM5NF9TVUJVTklUX1RZUEVfVkNSKSkgeworICAgICAgICAgIG5vZGUgPSBpOworICAgICAgICAgIHNyYy0+cG9ydCA9IGo7CisgICAgICAgICAgc3JjLT5ndWlkID0gcm9tMTM5NF9nZXRfZ3VpZCAoaGFuZGxlLCBpKTsKKyAgICAgICAgICBnX2ZyZWUgKHNyYy0+dXJpKTsKKyAgICAgICAgICBzcmMtPnVyaSA9IGdfc3RyZHVwX3ByaW50ZiAoImR2Oi8vJWQiLCBzcmMtPnBvcnQpOworICAgICAgICAgIGdfZnJlZSAoc3JjLT5kZXZpY2VfbmFtZSk7CisgICAgICAgICAgc3JjLT5kZXZpY2VfbmFtZSA9IGdfc3RyZHVwIChyb21fZGlyLmxhYmVsKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByb20xMzk0X2ZyZWVfZGlyZWN0b3J5ICgmcm9tX2Rpcik7CisgICAgICB9CisgICAgfQorICBuZXh0OgorICAgIHJhdzEzOTRfZGVzdHJveV9oYW5kbGUgKGhhbmRsZSk7CisgIH0KKyAgcmV0dXJuIG5vZGU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2hkdjEzOTRzcmNfc3RhcnQgKEdzdEJhc2VTcmMgKiBic3JjKQoreworICBHc3RIRFYxMzk0U3JjICpzcmMgPSBHU1RfSERWMTM5NFNSQyAoYnNyYyk7CisgIGludCBjb250cm9sX3NvY2tbMl07CisKKyAgc3JjLT5jb25uZWN0ZWQgPSBGQUxTRTsKKworICBpZiAoc29ja2V0cGFpciAoUEZfVU5JWCwgU09DS19TVFJFQU0sIDAsIGNvbnRyb2xfc29jaykgPCAwKQorICAgIGdvdG8gc29ja2V0X3BhaXI7CisKKyAgUkVBRF9TT0NLRVQgKHNyYykgPSBjb250cm9sX3NvY2tbMF07CisgIFdSSVRFX1NPQ0tFVCAoc3JjKSA9IGNvbnRyb2xfc29ja1sxXTsKKworICBpZiAoZmNudGwgKFJFQURfU09DS0VUIChzcmMpLCBGX1NFVEZMLCBPX05PTkJMT0NLKSA8IDApCisgICAgR1NUX0VSUk9SX09CSkVDVCAoc3JjLCAiZmFpbGVkIHRvIG1ha2UgcmVhZCBzb2NrZXQgbm9uLWJsb2NraW5nOiAlcyIsCisgICAgICAgIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgIGlmIChmY250bCAoV1JJVEVfU09DS0VUIChzcmMpLCBGX1NFVEZMLCBPX05PTkJMT0NLKSA8IDApCisgICAgR1NUX0VSUk9SX09CSkVDVCAoc3JjLCAiZmFpbGVkIHRvIG1ha2Ugd3JpdGUgc29ja2V0IG5vbi1ibG9ja2luZzogJXMiLAorICAgICAgICBnX3N0cmVycm9yIChlcnJubykpOworCisgIHNyYy0+aGFuZGxlID0gcmF3MTM5NF9uZXdfaGFuZGxlICgpOworCisgIGlmICghc3JjLT5oYW5kbGUpIHsKKyAgICBpZiAoZXJybm8gPT0gRUFDQ0VTKQorICAgICAgZ290byBwZXJtaXNzaW9uX2RlbmllZDsKKyAgICBlbHNlIGlmIChlcnJubyA9PSBFTk9FTlQpCisgICAgICBnb3RvIG5vdF9mb3VuZDsKKyAgICBlbHNlCisgICAgICBnb3RvIG5vX2hhbmRsZTsKKyAgfQorCisgIHNyYy0+bnVtX3BvcnRzID0gcmF3MTM5NF9nZXRfcG9ydF9pbmZvIChzcmMtPmhhbmRsZSwgc3JjLT5waW5mbywgMTYpOworCisgIGlmIChzcmMtPm51bV9wb3J0cyA9PSAwKQorICAgIGdvdG8gbm9fcG9ydHM7CisKKyAgaWYgKHNyYy0+dXNlX2F2YyB8fCBzcmMtPnBvcnQgPT0gLTEpCisgICAgc3JjLT5hdmNfbm9kZSA9IGdzdF9oZHYxMzk0c3JjX2Rpc2NvdmVyX2F2Y19ub2RlIChzcmMpOworCisgIC8qIGxldHMgZGVzdHJveSBoYW5kbGUgYW5kIGNyZWF0ZSBvbmUgb24gcG9ydAorICAgICB0aGlzIGlzIG1vcmUgcmVsaWFibGUgdGhhbiBzZXR0aW5nIHBvcnQgb24KKyAgICAgdGhlIGV4aXN0aW5nIGhhbmRsZSAqLworICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChzcmMtPmhhbmRsZSk7CisgIHNyYy0+aGFuZGxlID0gcmF3MTM5NF9uZXdfaGFuZGxlX29uX3BvcnQgKHNyYy0+cG9ydCk7CisgIGlmICghc3JjLT5oYW5kbGUpCisgICAgZ290byBjYW5ub3Rfc2V0X3BvcnQ7CisKKyAgcmF3MTM5NF9zZXRfdXNlcmRhdGEgKHNyYy0+aGFuZGxlLCBzcmMpOworICByYXcxMzk0X3NldF9idXNfcmVzZXRfaGFuZGxlciAoc3JjLT5oYW5kbGUsIGdzdF9oZHYxMzk0c3JjX2J1c19yZXNldCk7CisKKyAgeworICAgIG5vZGVpZF90IG1fbm9kZSA9IChzcmMtPmF2Y19ub2RlIHwgMHhmZmMwKTsKKyAgICBpbnQgbV9jaGFubmVsID0gLTE7CisgICAgaW50IG1fYmFuZHdpZHRoID0gMDsKKyAgICBpbnQgbV9vdXRwdXRQb3J0ID0gLTE7CisgICAgaW50IG1faW5wdXRQb3J0ID0gLTE7CisKKyAgICBtX2NoYW5uZWwgPSBpZWM2MTg4M19jbXBfY29ubmVjdCAoc3JjLT5oYW5kbGUsIG1fbm9kZSwgJm1fb3V0cHV0UG9ydCwKKyAgICAgICAgcmF3MTM5NF9nZXRfbG9jYWxfaWQgKHNyYy0+aGFuZGxlKSwgJm1faW5wdXRQb3J0LCAmbV9iYW5kd2lkdGgpOworCisgICAgaWYgKG1fY2hhbm5lbCA+PSAwKSB7CisgICAgICBzcmMtPmNoYW5uZWwgPSBtX2NoYW5uZWw7CisgICAgfQorICB9CisKKworICBpZiAoKHNyYy0+aWVjNjE4ODNtcGVnMiA9CisgICAgICAgICAgaWVjNjE4ODNfbXBlZzJfcmVjdl9pbml0IChzcmMtPmhhbmRsZSwKKyAgICAgICAgICAgICAgZ3N0X2hkdjEzOTRzcmNfaWVjNjE4ODNfcmVjZWl2ZSwgc3JjKSkgPT0gTlVMTCkKKyAgICBnb3RvIGNhbm5vdF9pbml0aWFsaXNlX2R2OworCisjaWYgMAorICByYXcxMzk0X3NldF9pc29faGFuZGxlciAoc3JjLT5oYW5kbGUsIHNyYy0+Y2hhbm5lbCwKKyAgICAgIGdzdF9oZHYxMzk0c3JjX2lzb19yZWNlaXZlKTsKKyNlbmRpZgorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInN1Y2Nlc3NmdWxseSBvcGVuZWQgdXAgMTM5NCBjb25uZWN0aW9uIik7CisgIHNyYy0+Y29ubmVjdGVkID0gVFJVRTsKKworICBpZiAoaWVjNjE4ODNfbXBlZzJfcmVjdl9zdGFydCAoc3JjLT5pZWM2MTg4M21wZWcyLCBzcmMtPmNoYW5uZWwpICE9IDApCisgICAgZ290byBjYW5ub3Rfc3RhcnQ7CisjaWYgMAorICBpZiAocmF3MTM5NF9zdGFydF9pc29fcmN2IChzcmMtPmhhbmRsZSwgc3JjLT5jaGFubmVsKSA8IDApCisgICAgZ290byBjYW5ub3Rfc3RhcnQ7CisjZW5kaWYKKworICBpZiAoc3JjLT51c2VfYXZjKSB7CisgICAgcmF3MTM5NGhhbmRsZV90IGF2Y19oYW5kbGUgPSByYXcxMzk0X25ld19oYW5kbGVfb25fcG9ydCAoc3JjLT5wb3J0KTsKKworICAgIEdTVF9MT0cgKCJXZSBoYXZlIGFuIGF2Y19oYW5kbGUiKTsKKworICAgIC8qIHN0YXJ0IHRoZSBWQ1IgKi8KKyAgICBpZiAoYXZjX2hhbmRsZSkgeworICAgICAgaWYgKCFhdmMxMzk0X3Zjcl9pc19yZWNvcmRpbmcgKGF2Y19oYW5kbGUsIHNyYy0+YXZjX25vZGUpCisgICAgICAgICAgJiYgYXZjMTM5NF92Y3JfaXNfcGxheWluZyAoYXZjX2hhbmRsZSwgc3JjLT5hdmNfbm9kZSkKKyAgICAgICAgICAhPSBBVkMxMzk0X1ZDUl9PUEVSQU5EX1BMQVlfRk9SV0FSRCkgeworICAgICAgICBHU1RfTE9HICgiQ2FsbGluZyBhdmMxMzk0X3Zjcl9wbGF5KCkiKTsKKyAgICAgICAgYXZjMTM5NF92Y3JfcGxheSAoYXZjX2hhbmRsZSwgc3JjLT5hdmNfbm9kZSk7CisgICAgICB9CisgICAgICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChhdmNfaGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJTdGFydGluZyBWQ1IgdmlhIGF2YzEzOTQgZmFpbGVkOiAlcyIsCisgICAgICAgICAgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gVFJVRTsKKworc29ja2V0X3BhaXI6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgT1BFTl9SRUFEX1dSSVRFLCAoTlVMTCksCisgICAgICAgIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorcGVybWlzc2lvbl9kZW5pZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgT1BFTl9SRUFELCAoTlVMTCksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm90X2ZvdW5kOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIE5PVF9GT1VORCwgKE5VTEwpLCBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX2hhbmRsZToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBPUEVOX1JFQUQsIChOVUxMKSwKKyAgICAgICAgKCJjYW4ndCBnZXQgcmF3MTM5NCBoYW5kbGUgKCVzKSIsIGdfc3RyZXJyb3IgKGVycm5vKSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fcG9ydHM6CisgIHsKKyAgICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChzcmMtPmhhbmRsZSk7CisgICAgc3JjLT5oYW5kbGUgPSBOVUxMOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBOT1RfRk9VTkQsIChOVUxMKSwKKyAgICAgICAgKCJubyBwb3J0cyBhdmFpbGFibGUgZm9yIHJhdzEzOTQiKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitjYW5ub3Rfc2V0X3BvcnQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJjYW4ndCBzZXQgMTM5NCBwb3J0ICVkIiwgc3JjLT5wb3J0KSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitjYW5ub3Rfc3RhcnQ6CisgIHsKKyAgICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChzcmMtPmhhbmRsZSk7CisgICAgc3JjLT5oYW5kbGUgPSBOVUxMOworICAgIGllYzYxODgzX21wZWcyX2Nsb3NlIChzcmMtPmllYzYxODgzbXBlZzIpOworICAgIHNyYy0+aWVjNjE4ODNtcGVnMiA9IE5VTEw7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIFJFQUQsIChOVUxMKSwKKyAgICAgICAgKCJjYW4ndCBzdGFydCAxMzk0IGlzbyByZWNlaXZlIikpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorY2Fubm90X2luaXRpYWxpc2VfZHY6CisgIHsKKyAgICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChzcmMtPmhhbmRsZSk7CisgICAgc3JjLT5oYW5kbGUgPSBOVUxMOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBSRUFELCAoTlVMTCksCisgICAgICAgICgiY2FuJ3QgaW5pdGlhbGlzZSBpZWM2MTg4MyBoZHYiKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2hkdjEzOTRzcmNfc3RvcCAoR3N0QmFzZVNyYyAqIGJzcmMpCit7CisgIEdzdEhEVjEzOTRTcmMgKnNyYyA9IEdTVF9IRFYxMzk0U1JDIChic3JjKTsKKworICBjbG9zZSAoUkVBRF9TT0NLRVQgKHNyYykpOworICBjbG9zZSAoV1JJVEVfU09DS0VUIChzcmMpKTsKKyAgUkVBRF9TT0NLRVQgKHNyYykgPSAtMTsKKyAgV1JJVEVfU09DS0VUIChzcmMpID0gLTE7CisKKyAgaWVjNjE4ODNfbXBlZzJfY2xvc2UgKHNyYy0+aWVjNjE4ODNtcGVnMik7CisjaWYgMAorICByYXcxMzk0X3N0b3BfaXNvX3JjdiAoc3JjLT5oYW5kbGUsIHNyYy0+Y2hhbm5lbCk7CisjZW5kaWYKKworICBpZiAoc3JjLT51c2VfYXZjKSB7CisgICAgcmF3MTM5NGhhbmRsZV90IGF2Y19oYW5kbGUgPSByYXcxMzk0X25ld19oYW5kbGVfb25fcG9ydCAoc3JjLT5wb3J0KTsKKworICAgIC8qIHBhdXNlIGFuZCBzdG9wIHRoZSBWQ1IgKi8KKyAgICBpZiAoYXZjX2hhbmRsZSkgeworICAgICAgaWYgKCFhdmMxMzk0X3Zjcl9pc19yZWNvcmRpbmcgKGF2Y19oYW5kbGUsIHNyYy0+YXZjX25vZGUpCisgICAgICAgICAgJiYgKGF2YzEzOTRfdmNyX2lzX3BsYXlpbmcgKGF2Y19oYW5kbGUsIHNyYy0+YXZjX25vZGUpCisgICAgICAgICAgICAgICE9IEFWQzEzOTRfVkNSX09QRVJBTkRfUExBWV9GT1JXQVJEX1BBVVNFKSkKKyAgICAgICAgYXZjMTM5NF92Y3JfcGF1c2UgKGF2Y19oYW5kbGUsIHNyYy0+YXZjX25vZGUpOworICAgICAgYXZjMTM5NF92Y3Jfc3RvcCAoYXZjX2hhbmRsZSwgc3JjLT5hdmNfbm9kZSk7CisgICAgICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChhdmNfaGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJTdGFydGluZyBWQ1IgdmlhIGF2YzEzOTQgZmFpbGVkOiAlcyIsCisgICAgICAgICAgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICB9CisgIH0KKworICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChzcmMtPmhhbmRsZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2hkdjEzOTRzcmNfdW5sb2NrIChHc3RCYXNlU3JjICogYnNyYykKK3sKKyAgR3N0SERWMTM5NFNyYyAqc3JjID0gR1NUX0hEVjEzOTRTUkMgKGJzcmMpOworCisgIFNFTkRfQ09NTUFORCAoc3JjLCBDT05UUk9MX1NUT1ApOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2hkdjEzOTRzcmNfdXBkYXRlX2RldmljZV9uYW1lIChHc3RIRFYxMzk0U3JjICogc3JjKQoreworICByYXcxMzk0aGFuZGxlX3QgaGFuZGxlOworICBnaW50IHBvcnRjb3VudCwgcG9ydCwgbm9kZWNvdW50LCBub2RlOworICByb20xMzk0X2RpcmVjdG9yeSBkaXJlY3Rvcnk7CisKKyAgZ19mcmVlIChzcmMtPmRldmljZV9uYW1lKTsKKyAgc3JjLT5kZXZpY2VfbmFtZSA9IE5VTEw7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgInVwZGF0aW5nIGRldmljZSBuYW1lIGZvciBjdXJyZW50IEdVSUQiKTsKKworICBoYW5kbGUgPSByYXcxMzk0X25ld19oYW5kbGUgKCk7CisKKyAgaWYgKGhhbmRsZSA9PSBOVUxMKQorICAgIGdvdG8gZ2V0aGFuZGxlX2ZhaWxlZDsKKworICBwb3J0Y291bnQgPSByYXcxMzk0X2dldF9wb3J0X2luZm8gKGhhbmRsZSwgTlVMTCwgMCk7CisgIGZvciAocG9ydCA9IDA7IHBvcnQgPCBwb3J0Y291bnQ7IHBvcnQrKykgeworICAgIGlmIChyYXcxMzk0X3NldF9wb3J0IChoYW5kbGUsIHBvcnQpID49IDApIHsKKyAgICAgIG5vZGVjb3VudCA9IHJhdzEzOTRfZ2V0X25vZGVjb3VudCAoaGFuZGxlKTsKKyAgICAgIGZvciAobm9kZSA9IDA7IG5vZGUgPCBub2RlY291bnQ7IG5vZGUrKykgeworICAgICAgICBpZiAoc3JjLT5ndWlkID09IHJvbTEzOTRfZ2V0X2d1aWQgKGhhbmRsZSwgbm9kZSkpIHsKKyAgICAgICAgICBpZiAocm9tMTM5NF9nZXRfZGlyZWN0b3J5IChoYW5kbGUsIG5vZGUsICZkaXJlY3RvcnkpID49IDApIHsKKyAgICAgICAgICAgIGdfZnJlZSAoc3JjLT5kZXZpY2VfbmFtZSk7CisgICAgICAgICAgICBzcmMtPmRldmljZV9uYW1lID0gZ19zdHJkdXAgKGRpcmVjdG9yeS5sYWJlbCk7CisgICAgICAgICAgICByb20xMzk0X2ZyZWVfZGlyZWN0b3J5ICgmZGlyZWN0b3J5KTsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR1NUX1dBUk5JTkcgKCJlcnJvciByZWFkaW5nIHJvbSBkaXJlY3RvcnkgZm9yIG5vZGUgJWQiLCBub2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzcmMtPmRldmljZV9uYW1lID0gZ19zdHJkdXAgKCJVbmtub3duIik7ICAgICAgLyogRklYTUU6IHRyYW5zbGF0ZT8gKi8KKworZG9uZToKKworICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChoYW5kbGUpOworICByZXR1cm47CisKKy8qIEVSUk9SUyAqLworZ2V0aGFuZGxlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HICgiZmFpbGVkIHRvIGdldCByYXcxMzk0IGhhbmRsZTogJXMiLCBnX3N0cmVycm9yIChlcnJubykpOworICAgIHNyYy0+ZGV2aWNlX25hbWUgPSBnX3N0cmR1cCAoIlVua25vd24iKTsgICAgLyogRklYTUU6IHRyYW5zbGF0ZT8gKi8KKyAgICByZXR1cm47CisgIH0KK30KKworLyoqKiBHU1RVUklIQU5ETEVSIElOVEVSRkFDRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgR3N0VVJJVHlwZQorZ3N0X2hkdjEzOTRzcmNfdXJpX2dldF90eXBlIChHVHlwZSB0eXBlKQoreworICByZXR1cm4gR1NUX1VSSV9TUkM7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqY29uc3QgKgorZ3N0X2hkdjEzOTRzcmNfdXJpX2dldF9wcm90b2NvbHMgKEdUeXBlIHR5cGUpCit7CisgIHN0YXRpYyBjb25zdCBnY2hhciAqcHJvdG9jb2xzW10gPSB7IChjaGFyICopICJoZHYiLCBOVUxMIH07CisKKyAgcmV0dXJuIHByb3RvY29sczsKK30KKworc3RhdGljIGdjaGFyICoKK2dzdF9oZHYxMzk0c3JjX3VyaV9nZXRfdXJpIChHc3RVUklIYW5kbGVyICogaGFuZGxlcikKK3sKKyAgR3N0SERWMTM5NFNyYyAqZ3N0X2hkdjEzOTRzcmMgPSBHU1RfSERWMTM5NFNSQyAoaGFuZGxlcik7CisKKyAgcmV0dXJuIGdzdF9oZHYxMzk0c3JjLT51cmk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2hkdjEzOTRzcmNfdXJpX3NldF91cmkgKEdzdFVSSUhhbmRsZXIgKiBoYW5kbGVyLCBjb25zdCBnY2hhciAqIHVyaSwKKyAgICBHRXJyb3IgKiogZXJyb3IpCit7CisgIGdjaGFyICpwcm90b2NvbCwgKmxvY2F0aW9uOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworICBHc3RIRFYxMzk0U3JjICpnc3RfaGR2MTM5NHNyYyA9IEdTVF9IRFYxMzk0U1JDIChoYW5kbGVyKTsKKworICBwcm90b2NvbCA9IGdzdF91cmlfZ2V0X3Byb3RvY29sICh1cmkpOworICBpZiAoc3RyY21wIChwcm90b2NvbCwgImhkdiIpICE9IDApIHsKKyAgICBnX2ZyZWUgKHByb3RvY29sKTsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIEdTVF9VUklfRVJST1IsIEdTVF9VUklfRVJST1JfQkFEX1VSSSwKKyAgICAgICAgIkludmFsaWQgSERWIFVSSSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBnX2ZyZWUgKHByb3RvY29sKTsKKworICBsb2NhdGlvbiA9IGdzdF91cmlfZ2V0X2xvY2F0aW9uICh1cmkpOworICBpZiAobG9jYXRpb24gJiYgKmxvY2F0aW9uICE9ICdcMCcpCisgICAgZ3N0X2hkdjEzOTRzcmMtPnBvcnQgPSBzdHJ0b2wgKGxvY2F0aW9uLCBOVUxMLCAxMCk7CisgIGVsc2UKKyAgICBnc3RfaGR2MTM5NHNyYy0+cG9ydCA9IERFRkFVTFRfUE9SVDsKKyAgZ19mcmVlIChsb2NhdGlvbik7CisgIGdfZnJlZSAoZ3N0X2hkdjEzOTRzcmMtPnVyaSk7CisgIGdzdF9oZHYxMzk0c3JjLT51cmkgPSBnX3N0cmR1cF9wcmludGYgKCJoZHY6Ly8lZCIsIGdzdF9oZHYxMzk0c3JjLT5wb3J0KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X2hkdjEzOTRzcmNfdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwgZ3BvaW50ZXIgaWZhY2VfZGF0YSkKK3sKKyAgR3N0VVJJSGFuZGxlckludGVyZmFjZSAqaWZhY2UgPSAoR3N0VVJJSGFuZGxlckludGVyZmFjZSAqKSBnX2lmYWNlOworCisgIGlmYWNlLT5nZXRfdHlwZSA9IGdzdF9oZHYxMzk0c3JjX3VyaV9nZXRfdHlwZTsKKyAgaWZhY2UtPmdldF9wcm90b2NvbHMgPSBnc3RfaGR2MTM5NHNyY191cmlfZ2V0X3Byb3RvY29sczsKKyAgaWZhY2UtPmdldF91cmkgPSBnc3RfaGR2MTM5NHNyY191cmlfZ2V0X3VyaTsKKyAgaWZhY2UtPnNldF91cmkgPSBnc3RfaGR2MTM5NHNyY191cmlfc2V0X3VyaTsKK30KZGlmZiAtLWdpdCBhL2V4dC9yYXcxMzk0L2dzdGhkdjEzOTRzcmMuaCBiL2V4dC9yYXcxMzk0L2dzdGhkdjEzOTRzcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWU4NjNjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5oCkBAIC0wLDAgKzEsODUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOD4gRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfR1NUSERWMTM5NF9IX18KKyNkZWZpbmUgX19HU1RfR1NUSERWMTM5NF9IX18KKworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdHB1c2hzcmMuaD4KKworI2luY2x1ZGUgPGxpYnJhdzEzOTQvcmF3MTM5NC5oPgorI2lmZGVmIEhBVkVfTElCSUVDNjE4ODMKKyNpbmNsdWRlIDxsaWJpZWM2MTg4My9pZWM2MTg4My5oPgorI2VuZGlmCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9IRFYxMzk0U1JDIFwKKyAgKGdzdF9oZHYxMzk0c3JjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9IRFYxMzk0U1JDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfSERWMTM5NFNSQyxHc3RIRFYxMzk0U3JjKSkKKyNkZWZpbmUgR1NUX0hEVjEzOTRTUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfSERWMTM5NFNSQyxHc3RIRFYxMzk0U3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfSERWMTM5NFNSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0hEVjEzOTRTUkMpKQorI2RlZmluZSBHU1RfSVNfSERWMTM5NFNSQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9IRFYxMzk0U1JDKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEhEVjEzOTRTcmMgR3N0SERWMTM5NFNyYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RIRFYxMzk0U3JjQ2xhc3MgR3N0SERWMTM5NFNyY0NsYXNzOworCitzdHJ1Y3QgX0dzdEhEVjEzOTRTcmMgeworICBHc3RQdXNoU3JjIGVsZW1lbnQ7CisKKyAgZ2ludCBudW1fcG9ydHM7CisgIGdpbnQgcG9ydDsKKyAgZ2ludCBjaGFubmVsOworICBvY3RsZXRfdCBndWlkOworICBnaW50IGF2Y19ub2RlOworICBnYm9vbGVhbiB1c2VfYXZjOworCisgIHN0cnVjdCByYXcxMzk0X3BvcnRpbmZvIHBpbmZvWzE2XTsKKyAgcmF3MTM5NGhhbmRsZV90IGhhbmRsZTsKKworICBncG9pbnRlciBvdXRkYXRhOworICBnc2l6ZSBvdXRvZmZzZXQ7CisgIGd1aW50IGZyYW1lX3NpemU7CisgIGd1aW50IGZyYW1lX3NlcXVlbmNlOworCisgIGludCBjb250cm9sX3NvY2tbMl07CisKKyAgZ2NoYXIgKnVyaTsKKworICBnY2hhciAqZGV2aWNlX25hbWU7CisKKyAgZ2Jvb2xlYW4gY29ubmVjdGVkOworICBpZWM2MTg4M19tcGVnMl90IGllYzYxODgzbXBlZzI7Cit9OworCitzdHJ1Y3QgX0dzdEhEVjEzOTRTcmNDbGFzcyB7CisgIEdzdFB1c2hTcmNDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfaGR2MTM5NHNyY19nZXRfdHlwZSh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0dTVDEzOTRfSF9fICovCmRpZmYgLS1naXQgYS9leHQvcmF3MTM5NC9tZXNvbi5idWlsZCBiL2V4dC9yYXcxMzk0L21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YTZhNWEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcmF3MTM5NC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDIyIEBACityYXcxMzk0X2RlcCA9IGRlcGVuZGVuY3koJ2xpYnJhdzEzOTQnLCB2ZXJzaW9uOiAnPj0gMi4wLjAnLCByZXF1aXJlZDogZmFsc2UpCithdmMxMzk0X2RlcCA9IGRlcGVuZGVuY3koJ2xpYmF2YzEzOTQnLCB2ZXJzaW9uOiAnPj0gMC41LjQnLCByZXF1aXJlZDogZmFsc2UpCitpZWM2MTg4M19kZXAgPSBkZXBlbmRlbmN5KCdsaWJpZWM2MTg4MycsIHZlcnNpb246ICc+PSAxLjAuMCcsIHJlcXVpcmVkOiBmYWxzZSkKKworaGF2ZV8xMzk0ID0gZmFsc2UKK2lmIHJhdzEzOTRfZGVwLmZvdW5kKCkgYW5kIGllYzYxODgzX2RlcC5mb3VuZCgpIGFuZCBhdmMxMzk0X2RlcC5mb3VuZCgpCisgIGlmIGNjLmhhc19mdW5jdGlvbignYXZjMTM5NF9zZW5kX2NvbW1hbmQnLCBkZXBlbmRlbmNpZXM6IGF2YzEzOTRfZGVwKQorICAgIGlmIGNjLmhhc19mdW5jdGlvbigncm9tMTM5NF9mcmVlX2RpcmVjdG9yeScsIGRlcGVuZGVuY2llczogYXZjMTM5NF9kZXApCisgICAgICBoYXZlXzEzOTQgPSB0cnVlCisgICAgZW5kaWYKKyAgZW5kaWYKK2VuZGlmCisKK2lmIGhhdmVfMTM5NAorICBsaWJyYXJ5KCdnc3QxMzk0JywKKyAgICAnZ3N0MTM5NC5jJywgJ2dzdDEzOTRwcm9iZS5jJywgJ2dzdGR2MTM5NHNyYy5jJywgJ2dzdGhkdjEzOTRzcmMuYycsICdnc3QxMzk0Y2xvY2suYycsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzICsgWyctREhBVkVfTElCSUVDNjE4ODMnXSwKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luYywgbGlic2luY10sCisgICAgZGVwZW5kZW5jaWVzIDogW2dzdHZpZGVvX2RlcCwgZ3N0YmFzZV9kZXAsIHJhdzEzOTRfZGVwLCBhdmMxMzk0X2RlcCwgaWVjNjE4ODNfZGVwXSwKKyAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIpCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L3Nob3V0Mi9NYWtlZmlsZS5hbSBiL2V4dC9zaG91dDIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc3MDVmYgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zaG91dDIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RzaG91dDIubGEKKworbGliZ3N0c2hvdXQyX2xhX1NPVVJDRVMgPSBnc3RzaG91dDIuYyAKK2xpYmdzdHNob3V0Ml9sYV9DRkxBR1MgPSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKFNIT1VUMl9DRkxBR1MpCitsaWJnc3RzaG91dDJfbGFfTElCQUREID0gJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKFNIT1VUMl9MSUJTKQorbGliZ3N0c2hvdXQyX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3RzaG91dDIuaApkaWZmIC0tZ2l0IGEvZXh0L3Nob3V0Mi9nc3RzaG91dDIuYyBiL2V4dC9zaG91dDIvZ3N0c2hvdXQyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzZjY1MgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zaG91dDIvZ3N0c2hvdXQyLmMKQEAgLTAsMCArMSw5NDggQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDEyPiBSYWxwaCBHaWxlcyA8Z2lsZXNAbW96aWxsYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtc2hvdXQyc2VuZAorICoKKyAqIHNob3V0MnNlbmQgcHVzaGVzIGEgbWVkaWEgc3RyZWFtIHRvIGFuIEljZWNhc3Qgc2VydmVyCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHVyaWRlY29kZWJpbiB1cmk9ZmlsZTovLy9wYXRoL3RvL2F1ZGlvZmlsZSAhIGF1ZGlvY29udmVydCAhIHZvcmJpc2VuYyAhIG9nZ211eCAhIHNob3V0MnNlbmQgbW91bnQ9L3N0cmVhbS5vZ2cgcG9ydD04MDAwIHVzZXJuYW1lPXNvdXJjZSBwYXNzd29yZD1zb21lcGFzc3dvcmQgaXA9c2VydmVyX0lQX2FkZHJlc3Nfb3JfaG9zdG5hbWUKKyAqIF18IFRoaXMgcGlwZWxpbmUgZGVtdXhlcywgZGVjb2RlcywgcmUtZW5jb2RlcyBhbmQgcmUtbXV4ZXMgYW4gYXVkaW8KKyAqIG1lZGlhIGZpbGUgaW50byBvZ2d2b3JiaXMgYW5kIHNlbmRzIHRoZSByZXN1bHRpbmcgc3RyZWFtIHRvIGFuIEljZWNhc3QKKyAqIHNlcnZlci4gUHJvcGVydGllcyBtb3VudCwgcG9ydCwgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGFyZSBhbGwgc2VydmVyLWNvbmZpZworICogZGVwZW5kZW50LgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RzaG91dDIuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdC9nc3QtaTE4bi1wbHVnaW4uaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoc2hvdXQyX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHNob3V0Ml9kZWJ1ZworCisKK2VudW0KK3sKKyAgU0lHTkFMX0NPTk5FQ1RJT05fUFJPQkxFTSwgICAgLyogRklYTUUgMi4wOiByZW1vdmUgdGhpcyAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBBUkdfMCwKKyAgQVJHX0lQLCAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIElQIGFkZHJlc3Mgb3IgaG9zdG5hbWUgb2YgdGhlIHNlcnZlciAqLworICBBUkdfUE9SVCwgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgZW5jb2RlciBwb3J0IG51bWJlciBvbiB0aGUgc2VydmVyICovCisgIEFSR19QQVNTV09SRCwgICAgICAgICAgICAgICAgIC8qIHRoZSBlbmNvZGVyIHBhc3N3b3JkIG9uIHRoZSBzZXJ2ZXIgKi8KKyAgQVJHX1VTRVJOQU1FLCAgICAgICAgICAgICAgICAgLyogdGhlIGVuY29kZXIgdXNlcm5hbWUgb24gdGhlIHNlcnZlciAqLworICBBUkdfUFVCTElDLCAgICAgICAgICAgICAgICAgICAvKiBpcyB0aGlzIHN0cmVhbSBwdWJsaWM/ICovCisgIEFSR19TVFJFQU1OQU1FLCAgICAgICAgICAgICAgIC8qIE5hbWUgb2YgdGhlIHN0cmVhbSAqLworICBBUkdfREVTQ1JJUFRJT04sICAgICAgICAgICAgICAvKiBEZXNjcmlwdGlvbiBvZiB0aGUgc3RyZWFtICovCisgIEFSR19HRU5SRSwgICAgICAgICAgICAgICAgICAgIC8qIEdlbnJlIG9mIHRoZSBzdHJlYW0gKi8KKworICBBUkdfUFJPVE9DT0wsICAgICAgICAgICAgICAgICAvKiBQcm90b2NvbCB0byBjb25uZWN0IHdpdGggKi8KKworICBBUkdfTU9VTlQsICAgICAgICAgICAgICAgICAgICAvKiBtb3VudHBvaW50IG9mIHN0cmVhbSAoaWNlY2FzdCBvbmx5KSAqLworICBBUkdfVVJMLCAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgc3RyZWFtJ3MgaG9tZXBhZ2UgVVJMICovCisKKyAgQVJHX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgLyogVGhlIG1heCBhbW91bnQgb2YgdGltZSB0byB3YWl0IGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrIGFjdGl2aXR5ICovCit9OworCisjZGVmaW5lIERFRkFVTFRfSVAgICAgICAgICAgICIxMjcuMC4wLjEiCisjZGVmaW5lIERFRkFVTFRfUE9SVCAgICAgICAgIDgwMDAKKyNkZWZpbmUgREVGQVVMVF9QQVNTV09SRCAgICAgImhhY2ttZSIKKyNkZWZpbmUgREVGQVVMVF9VU0VSTkFNRSAgICAgInNvdXJjZSIKKyNkZWZpbmUgREVGQVVMVF9QVUJMSUMgICAgIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfU1RSRUFNTkFNRSAgICIiCisjZGVmaW5lIERFRkFVTFRfREVTQ1JJUFRJT04gICIiCisjZGVmaW5lIERFRkFVTFRfR0VOUkUgICAgICAgICIiCisjZGVmaW5lIERFRkFVTFRfTU9VTlQgICAgICAgICIiCisjZGVmaW5lIERFRkFVTFRfVVJMICAgICAgICAgICIiCisjZGVmaW5lIERFRkFVTFRfUFJPVE9DT0wgICAgIFNIT1VUMlNFTkRfUFJPVE9DT0xfSFRUUAorI2RlZmluZSBERUZBVUxUX1RJTUVPVVQgICAgICAxMDAwMAorCisjaWZkZWYgU0hPVVRfRk9STUFUX1dFQk0KKyNkZWZpbmUgV0VCTV9DQVBTICI7IHZpZGVvL3dlYm07IGF1ZGlvL3dlYm0iCisjZWxzZQorI2RlZmluZSBXRUJNX0NBUFMgIiIKKyNlbmRpZgorc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi9vZ2c7IGF1ZGlvL29nZzsgdmlkZW8vb2dnOyAiCisgICAgICAgICJhdWRpby9tcGVnLCBtcGVndmVyc2lvbiA9IChpbnQpIDEsIGxheWVyID0gKGludCkgWyAxLCAzIF0iIFdFQk1fQ0FQUykpOworCitzdGF0aWMgdm9pZCBnc3Rfc2hvdXQyc2VuZF9maW5hbGl6ZSAoR3N0U2hvdXQyc2VuZCAqIHNob3V0MnNlbmQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3Nob3V0MnNlbmRfZXZlbnQgKEdzdEJhc2VTaW5rICogc2luaywgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3Nob3V0MnNlbmRfdW5sb2NrIChHc3RCYXNlU2luayAqIGJhc2VzaW5rKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc2hvdXQyc2VuZF91bmxvY2tfc3RvcCAoR3N0QmFzZVNpbmsgKiBiYXNlc2luayk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfc2hvdXQyc2VuZF9yZW5kZXIgKEdzdEJhc2VTaW5rICogc2luaywKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9zaG91dDJzZW5kX3N0YXJ0IChHc3RCYXNlU2luayAqIGJhc2VzaW5rKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc2hvdXQyc2VuZF9zdG9wIChHc3RCYXNlU2luayAqIGJhc2VzaW5rKTsKKworc3RhdGljIHZvaWQgZ3N0X3Nob3V0MnNlbmRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3Nob3V0MnNlbmRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3Nob3V0MnNlbmRfc2V0Y2FwcyAoR3N0QmFzZVNpbmsgKiBiYXNlc2luaywgR3N0Q2FwcyAqIGNhcHMpOworCitzdGF0aWMgZ3VpbnQgZ3N0X3Nob3V0MnNlbmRfc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAgfTsKKworI2RlZmluZSBHU1RfVFlQRV9TSE9VVF9QUk9UT0NPTCAoZ3N0X3Nob3V0MnNlbmRfcHJvdG9jb2xfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X3Nob3V0MnNlbmRfcHJvdG9jb2xfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBzaG91dDJzZW5kX3Byb3RvY29sX3R5cGUgPSAwOworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSBzaG91dDJzZW5kX3Byb3RvY29sW10gPSB7CisgICAge1NIT1VUMlNFTkRfUFJPVE9DT0xfWEFVRElPQ0FTVCwKKyAgICAgICAgIlhhdWRpb2Nhc3QgUHJvdG9jb2wgKGljZWNhc3QgMS4zLngpIiwgInhhdWRpb2Nhc3QifSwKKyAgICB7U0hPVVQyU0VORF9QUk9UT0NPTF9JQ1ksICJJY3kgUHJvdG9jb2wgKFNob3V0Q2FzdCkiLCAiaWN5In0sCisgICAge1NIT1VUMlNFTkRfUFJPVE9DT0xfSFRUUCwgIkh0dHAgUHJvdG9jb2wgKGljZWNhc3QgMi54KSIsICJodHRwIn0sCisgICAgezAsIE5VTEwsIE5VTEx9LAorICB9OworCisgIGlmICghc2hvdXQyc2VuZF9wcm90b2NvbF90eXBlKSB7CisgICAgc2hvdXQyc2VuZF9wcm90b2NvbF90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFNob3V0MlNlbmRQcm90b2NvbCIsIHNob3V0MnNlbmRfcHJvdG9jb2wpOworICB9CisKKworICByZXR1cm4gc2hvdXQyc2VuZF9wcm90b2NvbF90eXBlOworfQorCisjZGVmaW5lIGdzdF9zaG91dDJzZW5kX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RTaG91dDJzZW5kLCBnc3Rfc2hvdXQyc2VuZCwgR1NUX1RZUEVfQkFTRV9TSU5LLAorICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfVEFHX1NFVFRFUiwgTlVMTCkpOworCitzdGF0aWMgdm9pZAorZ3N0X3Nob3V0MnNlbmRfY2xhc3NfaW5pdCAoR3N0U2hvdXQyc2VuZENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RCYXNlU2lua0NsYXNzICpnc3RiYXNlc2lua19jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdGJhc2VzaW5rX2NsYXNzID0gKEdzdEJhc2VTaW5rQ2xhc3MgKikga2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3Nob3V0MnNlbmRfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfc2hvdXQyc2VuZF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gKEdPYmplY3RGaW5hbGl6ZUZ1bmMpIGdzdF9zaG91dDJzZW5kX2ZpbmFsaXplOworCisgIC8qIEZJWE1FOiAyLjAgU2hvdWxkIHByb2JhYmx5IGNoYW5nZSB0aGlzIHByb3AgbmFtZSB0byAic2VydmVyIiAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBBUkdfSVAsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiaXAiLCAiaXAiLCAiSVAgYWRkcmVzcyBvciBob3N0bmFtZSIsIERFRkFVTFRfSVAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19QT1JULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInBvcnQiLCAicG9ydCIsICJwb3J0IiwgMSwgR19NQVhVU0hPUlQsIERFRkFVTFRfUE9SVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBBUkdfUEFTU1dPUkQsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgicGFzc3dvcmQiLCAicGFzc3dvcmQiLCAicGFzc3dvcmQiLCBERUZBVUxUX1BBU1NXT1JELAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19VU0VSTkFNRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJ1c2VybmFtZSIsICJ1c2VybmFtZSIsICJ1c2VybmFtZSIsIERFRkFVTFRfVVNFUk5BTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyogbWV0YWRhdGEgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX1BVQkxJQywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgicHVibGljIiwgInB1YmxpYyIsCisgICAgICAgICAgIklmIHRoZSBzdHJlYW0gc2hvdWxkIGJlIGxpc3RlZCBvbiB0aGUgc2VydmVyJ3Mgc3RyZWFtIGRpcmVjdG9yeSIsCisgICAgICAgICAgREVGQVVMVF9QVUJMSUMsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19TVFJFQU1OQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInN0cmVhbW5hbWUiLCAic3RyZWFtbmFtZSIsICJuYW1lIG9mIHRoZSBzdHJlYW0iLAorICAgICAgICAgIERFRkFVTFRfU1RSRUFNTkFNRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX0RFU0NSSVBUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImRlc2NyaXB0aW9uIiwgImRlc2NyaXB0aW9uIiwgImRlc2NyaXB0aW9uIiwKKyAgICAgICAgICBERUZBVUxUX0RFU0NSSVBUSU9OLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBBUkdfR0VOUkUsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZ2VucmUiLCAiZ2VucmUiLCAiZ2VucmUiLCBERUZBVUxUX0dFTlJFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19QUk9UT0NPTCwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgicHJvdG9jb2wiLCAicHJvdG9jb2wiLCAiQ29ubmVjdGlvbiBQcm90b2NvbCB0byB1c2UiLAorICAgICAgICAgIEdTVF9UWVBFX1NIT1VUX1BST1RPQ09MLCBERUZBVUxUX1BST1RPQ09MLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisKKyAgLyogaWNlY2FzdCBvbmx5ICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19NT1VOVCwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJtb3VudCIsICJtb3VudCIsICJtb3VudCIsIERFRkFVTFRfTU9VTlQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX1VSTCwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJ1cmwiLCAidXJsIiwgInRoZSBzdHJlYW0ncyBob21lcGFnZSBVUkwiLAorICAgICAgICAgIERFRkFVTFRfVVJMLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBBUkdfVElNRU9VVCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgidGltZW91dCIsICJ0aW1lb3V0IiwKKyAgICAgICAgICAiTWF4IGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgZm9yIG5ldHdvcmsgYWN0aXZpdHksIGluIG1pbGxpc2Vjb25kcyIsCisgICAgICAgICAgMSwgR19NQVhVSU5ULCBERUZBVUxUX1RJTUVPVVQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyogc2lnbmFscyAqLworICBnc3Rfc2hvdXQyc2VuZF9zaWduYWxzW1NJR05BTF9DT05ORUNUSU9OX1BST0JMRU1dID0KKyAgICAgIGdfc2lnbmFsX25ldyAoImNvbm5lY3Rpb24tcHJvYmxlbSIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fQ0xFQU5VUCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RTaG91dDJzZW5kQ2xhc3MsCisgICAgICAgICAgY29ubmVjdGlvbl9wcm9ibGVtKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX0lOVCwKKyAgICAgIEdfVFlQRV9OT05FLCAxLCBHX1RZUEVfSU5UKTsKKworICBnc3RiYXNlc2lua19jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Nob3V0MnNlbmRfc3RhcnQpOworICBnc3RiYXNlc2lua19jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2hvdXQyc2VuZF9zdG9wKTsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnVubG9jayA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2hvdXQyc2VuZF91bmxvY2spOworICBnc3RiYXNlc2lua19jbGFzcy0+dW5sb2NrX3N0b3AgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zaG91dDJzZW5kX3VubG9ja19zdG9wKTsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnJlbmRlciA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2hvdXQyc2VuZF9yZW5kZXIpOworICBnc3RiYXNlc2lua19jbGFzcy0+ZXZlbnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Nob3V0MnNlbmRfZXZlbnQpOworICBnc3RiYXNlc2lua19jbGFzcy0+c2V0X2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Nob3V0MnNlbmRfc2V0Y2Fwcyk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIkljZWNhc3QgbmV0d29yayBzaW5rIiwKKyAgICAgICJTaW5rL05ldHdvcmsiLCAiU2VuZHMgZGF0YSB0byBhbiBpY2VjYXN0IHNlcnZlciIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNoZWxsby5iZT4sICIKKyAgICAgICJQZWRybyBDb3J0ZS1SZWFsIDx0eXBvQG5ldGNhYm8ucHQ+LCAiCisgICAgICAiWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHNob3V0Ml9kZWJ1ZywgInNob3V0MiIsIDAsICJzaG91dDJzZW5kIGVsZW1lbnQiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zaG91dDJzZW5kX2luaXQgKEdzdFNob3V0MnNlbmQgKiBzaG91dDJzZW5kKQoreworICBnc3RfYmFzZV9zaW5rX3NldF9zeW5jIChHU1RfQkFTRV9TSU5LIChzaG91dDJzZW5kKSwgRkFMU0UpOworCisgIHNob3V0MnNlbmQtPnRpbWVyID0gZ3N0X3BvbGxfbmV3IChUUlVFKTsKKworICBzaG91dDJzZW5kLT5pcCA9IGdfc3RyZHVwIChERUZBVUxUX0lQKTsKKyAgc2hvdXQyc2VuZC0+cG9ydCA9IERFRkFVTFRfUE9SVDsKKyAgc2hvdXQyc2VuZC0+cGFzc3dvcmQgPSBnX3N0cmR1cCAoREVGQVVMVF9QQVNTV09SRCk7CisgIHNob3V0MnNlbmQtPnVzZXJuYW1lID0gZ19zdHJkdXAgKERFRkFVTFRfVVNFUk5BTUUpOworICBzaG91dDJzZW5kLT5zdHJlYW1uYW1lID0gZ19zdHJkdXAgKERFRkFVTFRfU1RSRUFNTkFNRSk7CisgIHNob3V0MnNlbmQtPmRlc2NyaXB0aW9uID0gZ19zdHJkdXAgKERFRkFVTFRfREVTQ1JJUFRJT04pOworICBzaG91dDJzZW5kLT5nZW5yZSA9IGdfc3RyZHVwIChERUZBVUxUX0dFTlJFKTsKKyAgc2hvdXQyc2VuZC0+bW91bnQgPSBnX3N0cmR1cCAoREVGQVVMVF9NT1VOVCk7CisgIHNob3V0MnNlbmQtPnVybCA9IGdfc3RyZHVwIChERUZBVUxUX1VSTCk7CisgIHNob3V0MnNlbmQtPnByb3RvY29sID0gREVGQVVMVF9QUk9UT0NPTDsKKyAgc2hvdXQyc2VuZC0+aXNwdWJsaWMgPSBERUZBVUxUX1BVQkxJQzsKKyAgc2hvdXQyc2VuZC0+dGltZW91dCA9IERFRkFVTFRfVElNRU9VVDsKKworICBzaG91dDJzZW5kLT5mb3JtYXQgPSAtMTsKKyAgc2hvdXQyc2VuZC0+dGFncyA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIHNob3V0MnNlbmQtPmNvbm4gPSBOVUxMOworICBzaG91dDJzZW5kLT5jb25uZWN0ZWQgPSBGQUxTRTsKKyAgc2hvdXQyc2VuZC0+c29uZ21ldGFkYXRhID0gTlVMTDsKKyAgc2hvdXQyc2VuZC0+c29uZ2FydGlzdCA9IE5VTEw7CisgIHNob3V0MnNlbmQtPnNvbmd0aXRsZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc2hvdXQyc2VuZF9maW5hbGl6ZSAoR3N0U2hvdXQyc2VuZCAqIHNob3V0MnNlbmQpCit7CisgIGdfZnJlZSAoc2hvdXQyc2VuZC0+aXApOworICBnX2ZyZWUgKHNob3V0MnNlbmQtPnBhc3N3b3JkKTsKKyAgZ19mcmVlIChzaG91dDJzZW5kLT51c2VybmFtZSk7CisgIGdfZnJlZSAoc2hvdXQyc2VuZC0+c3RyZWFtbmFtZSk7CisgIGdfZnJlZSAoc2hvdXQyc2VuZC0+ZGVzY3JpcHRpb24pOworICBnX2ZyZWUgKHNob3V0MnNlbmQtPmdlbnJlKTsKKyAgZ19mcmVlIChzaG91dDJzZW5kLT5tb3VudCk7CisgIGdfZnJlZSAoc2hvdXQyc2VuZC0+dXJsKTsKKworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHNob3V0MnNlbmQtPnRhZ3MpOworCisgIGdzdF9wb2xsX2ZyZWUgKHNob3V0MnNlbmQtPnRpbWVyKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKChHT2JqZWN0ICopIChzaG91dDJzZW5kKSk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfc2hvdXRfbWV0YWRhdGEgKGNvbnN0IEdzdFRhZ0xpc3QgKiBsaXN0LCBjb25zdCBnY2hhciAqIHRhZywKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFNob3V0MnNlbmQgKnNob3V0MnNlbmQgPSAoR3N0U2hvdXQyc2VuZCAqKSB1c2VyX2RhdGE7CisgIGNoYXIgKipzaG91dF9tZXRhZGF0YSA9ICYoc2hvdXQyc2VuZC0+c29uZ21ldGFkYXRhKTsKKyAgY2hhciAqKnNvbmdfYXJ0aXN0ID0gJihzaG91dDJzZW5kLT5zb25nYXJ0aXN0KTsKKyAgY2hhciAqKnNvbmdfdGl0bGUgPSAmKHNob3V0MnNlbmQtPnNvbmd0aXRsZSk7CisKKyAgZ2NoYXIgKnZhbHVlOworCisgIEdTVF9ERUJVRyAoInRhZzogJXMgYmVpbmcgYWRkZWQiLCB0YWcpOworICBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfQVJUSVNUKSA9PSAwKSB7CisgICAgaWYgKGdzdF90YWdfZ2V0X3R5cGUgKHRhZykgPT0gR19UWVBFX1NUUklORykgeworICAgICAgaWYgKCFnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZyAobGlzdCwgdGFnLCAmdmFsdWUpKSB7CisgICAgICAgIEdTVF9ERUJVRyAoIkVycm9yIHJlYWRpbmcgXCIlc1wiIHRhZyB2YWx1ZSIsIHRhZyk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKCpzb25nX2FydGlzdCAhPSBOVUxMKQorICAgICAgICBnX2ZyZWUgKCpzb25nX2FydGlzdCk7CisKKyAgICAgICpzb25nX2FydGlzdCA9IGdfc3RyZHVwICh2YWx1ZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHN0cmNtcCAodGFnLCBHU1RfVEFHX1RJVExFKSA9PSAwKSB7CisgICAgaWYgKGdzdF90YWdfZ2V0X3R5cGUgKHRhZykgPT0gR19UWVBFX1NUUklORykgeworICAgICAgaWYgKCFnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZyAobGlzdCwgdGFnLCAmdmFsdWUpKSB7CisgICAgICAgIEdTVF9ERUJVRyAoIkVycm9yIHJlYWRpbmcgXCIlc1wiIHRhZyB2YWx1ZSIsIHRhZyk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKCpzb25nX3RpdGxlICE9IE5VTEwpCisgICAgICAgIGdfZnJlZSAoKnNvbmdfdGl0bGUpOworCisgICAgICAqc29uZ190aXRsZSA9IGdfc3RyZHVwICh2YWx1ZSk7CisgICAgfQorICB9CisKKyAgaWYgKCpzaG91dF9tZXRhZGF0YSAhPSBOVUxMKQorICAgIGdfZnJlZSAoKnNob3V0X21ldGFkYXRhKTsKKworCisgIGlmICgqc29uZ190aXRsZSAmJiAqc29uZ19hcnRpc3QpIHsKKyAgICAqc2hvdXRfbWV0YWRhdGEgPSBnX3N0cmR1cF9wcmludGYgKCIlcyAtICVzIiwgKnNvbmdfYXJ0aXN0LCAqc29uZ190aXRsZSk7CisgIH0gZWxzZSBpZiAoKnNvbmdfdGl0bGUgJiYgKnNvbmdfYXJ0aXN0ID09IE5VTEwpIHsKKyAgICAqc2hvdXRfbWV0YWRhdGEgPSBnX3N0cmR1cF9wcmludGYgKCJVbmtub3duIC0gJXMiLCAqc29uZ190aXRsZSk7CisgIH0gZWxzZSBpZiAoKnNvbmdfdGl0bGUgPT0gTlVMTCAmJiAqc29uZ19hcnRpc3QpIHsKKyAgICAqc2hvdXRfbWV0YWRhdGEgPSBnX3N0cmR1cF9wcmludGYgKCIlcyAtIFVua25vd24iLCAqc29uZ19hcnRpc3QpOworICB9IGVsc2UgeworICAgICpzaG91dF9tZXRhZGF0YSA9IGdfc3RyZHVwX3ByaW50ZiAoIlVua25vd24gLSBVbmtub3duIik7CisgIH0KKworICBHU1RfTE9HICgic2hvdXQgbWV0YWRhdGEgaXMgbm93OiAlcyIsICpzaG91dF9tZXRhZGF0YSk7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAorZ3N0X3Nob3V0MnNlbmRfc2V0X21ldGFkYXRhIChHc3RTaG91dDJzZW5kICogc2hvdXQyc2VuZCkKK3sKKyAgY29uc3QgR3N0VGFnTGlzdCAqdXNlcl90YWdzOworICBHc3RUYWdMaXN0ICpjb3B5OworICBjaGFyICp0ZW1wbWV0YWRhdGE7CisgIHNob3V0X21ldGFkYXRhX3QgKnBtZXRhZGF0YTsKKworICBnX3JldHVybl9pZl9mYWlsIChzaG91dDJzZW5kICE9IE5VTEwpOworICB1c2VyX3RhZ3MgPSBnc3RfdGFnX3NldHRlcl9nZXRfdGFnX2xpc3QgKEdTVF9UQUdfU0VUVEVSIChzaG91dDJzZW5kKSk7CisgIGlmICgoc2hvdXQyc2VuZC0+dGFncyA9PSBOVUxMKSAmJiAodXNlcl90YWdzID09IE5VTEwpKSB7CisgICAgcmV0dXJuOworICB9CisgIGNvcHkgPSBnc3RfdGFnX2xpc3RfbWVyZ2UgKHVzZXJfdGFncywgc2hvdXQyc2VuZC0+dGFncywKKyAgICAgIGdzdF90YWdfc2V0dGVyX2dldF90YWdfbWVyZ2VfbW9kZSAoR1NUX1RBR19TRVRURVIgKHNob3V0MnNlbmQpKSk7CisgIC8qIGxldHMgZ2V0IHRoZSBhcnRpc3QgYW5kIHNvbmcgdGFncyAqLworICB0ZW1wbWV0YWRhdGEgPSBOVUxMOworICBnc3RfdGFnX2xpc3RfZm9yZWFjaCAoKEdzdFRhZ0xpc3QgKikgY29weSwgc2V0X3Nob3V0X21ldGFkYXRhLAorICAgICAgKGdwb2ludGVyKSAmIHRlbXBtZXRhZGF0YSk7CisgIGlmICh0ZW1wbWV0YWRhdGEpIHsKKyAgICBwbWV0YWRhdGEgPSBzaG91dF9tZXRhZGF0YV9uZXcgKCk7CisgICAgc2hvdXRfbWV0YWRhdGFfYWRkIChwbWV0YWRhdGEsICJzb25nIiwgdGVtcG1ldGFkYXRhKTsKKyAgICBzaG91dF9zZXRfbWV0YWRhdGEgKHNob3V0MnNlbmQtPmNvbm4sIHBtZXRhZGF0YSk7CisgICAgc2hvdXRfbWV0YWRhdGFfZnJlZSAocG1ldGFkYXRhKTsKKyAgfQorCisgIGdzdF90YWdfbGlzdF91bnJlZiAoY29weSk7Cit9CisjZW5kaWYKKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zaG91dDJzZW5kX2V2ZW50IChHc3RCYXNlU2luayAqIHNpbmssIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFNob3V0MnNlbmQgKnNob3V0MnNlbmQ7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgc2hvdXQyc2VuZCA9IEdTVF9TSE9VVDJTRU5EIChzaW5rKTsKKworICBHU1RfTE9HX09CSkVDVCAoc2hvdXQyc2VuZCwgImdvdCAlcyBldmVudCIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfVEFHOnsKKyAgICAgIC8qIHZvcmJpcyBhdWRpbyBkb2Vzbid0IG5lZWQgbWV0YWRhdGEgc2V0dGluZyBvbiB0aGUgaWNlY2FzdCBsZXZlbCwgb25seSBtcDMgKi8KKyAgICAgIGlmIChzaG91dDJzZW5kLT50YWdzICYmIHNob3V0MnNlbmQtPmZvcm1hdCA9PSBTSE9VVF9GT1JNQVRfTVAzKSB7CisgICAgICAgIEdzdFRhZ0xpc3QgKmxpc3Q7CisKKyAgICAgICAgZ3N0X2V2ZW50X3BhcnNlX3RhZyAoZXZlbnQsICZsaXN0KTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2hvdXQyc2VuZCwgInRhZ3M9JSIgR1NUX1BUUl9GT1JNQVQsIGxpc3QpOworICAgICAgICBnc3RfdGFnX2xpc3RfaW5zZXJ0IChzaG91dDJzZW5kLT50YWdzLAorICAgICAgICAgICAgbGlzdCwKKyAgICAgICAgICAgIGdzdF90YWdfc2V0dGVyX2dldF90YWdfbWVyZ2VfbW9kZSAoR1NUX1RBR19TRVRURVIgKHNob3V0MnNlbmQpKSk7CisgICAgICAgIC8qIGxldHMgZ2V0IHRoZSBhcnRpc3QgYW5kIHNvbmcgdGFncyAqLworICAgICAgICBnc3RfdGFnX2xpc3RfZm9yZWFjaCAoKEdzdFRhZ0xpc3QgKikgbGlzdCwKKyAgICAgICAgICAgIHNldF9zaG91dF9tZXRhZGF0YSwgc2hvdXQyc2VuZCk7CisgICAgICAgIGlmIChzaG91dDJzZW5kLT5zb25nbWV0YWRhdGEgJiYgc2hvdXQyc2VuZC0+Y29ubmVjdGVkKSB7CisgICAgICAgICAgc2hvdXRfbWV0YWRhdGFfdCAqcG1ldGFkYXRhOworCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2hvdXQyc2VuZCwgIm1ldGFkYXRhIG5vdzogJXMiLAorICAgICAgICAgICAgICBzaG91dDJzZW5kLT5zb25nbWV0YWRhdGEpOworCisgICAgICAgICAgcG1ldGFkYXRhID0gc2hvdXRfbWV0YWRhdGFfbmV3ICgpOworICAgICAgICAgIHNob3V0X21ldGFkYXRhX2FkZCAocG1ldGFkYXRhLCAic29uZyIsIHNob3V0MnNlbmQtPnNvbmdtZXRhZGF0YSk7CisgICAgICAgICAgc2hvdXRfc2V0X21ldGFkYXRhIChzaG91dDJzZW5kLT5jb25uLCBwbWV0YWRhdGEpOworICAgICAgICAgIHNob3V0X21ldGFkYXRhX2ZyZWUgKHBtZXRhZGF0YSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OnsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzaG91dDJzZW5kLCAibGV0IGJhc2UgY2xhc3MgaGFuZGxlIGV2ZW50Iik7CisgICAgICBpZiAoR1NUX0JBU0VfU0lOS19DTEFTUyAocGFyZW50X2NsYXNzKS0+ZXZlbnQpIHsKKyAgICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfcmVmIChldmVudCk7CisgICAgICAgIHJldCA9IEdTVF9CQVNFX1NJTktfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmV2ZW50IChzaW5rLCBldmVudCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zaG91dDJzZW5kX3N0YXJ0IChHc3RCYXNlU2luayAqIGJhc2VzaW5rKQoreworICBHc3RTaG91dDJzZW5kICpzaW5rID0gR1NUX1NIT1VUMlNFTkQgKGJhc2VzaW5rKTsKKyAgY29uc3QgZ2NoYXIgKmN1cl9wcm9wOworICBnc2hvcnQgcHJvdG8gPSAzOworICBnY2hhciAqdmVyc2lvbl9zdHJpbmc7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgInN0YXJ0aW5nIik7CisKKyAgc2luay0+Y29ubiA9IHNob3V0X25ldyAoKTsKKworICBzd2l0Y2ggKHNpbmstPnByb3RvY29sKSB7CisgICAgY2FzZSBTSE9VVDJTRU5EX1BST1RPQ09MX1hBVURJT0NBU1Q6CisgICAgICBwcm90byA9IFNIT1VUX1BST1RPQ09MX1hBVURJT0NBU1Q7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNIT1VUMlNFTkRfUFJPVE9DT0xfSUNZOgorICAgICAgcHJvdG8gPSBTSE9VVF9QUk9UT0NPTF9JQ1k7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNIT1VUMlNFTkRfUFJPVE9DT0xfSFRUUDoKKyAgICAgIHByb3RvID0gU0hPVVRfUFJPVE9DT0xfSFRUUDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgY3VyX3Byb3AgPSAicHJvdG9jb2wiOworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2V0dGluZyBwcm90b2NvbDogJWQiLCBzaW5rLT5wcm90b2NvbCk7CisgIGlmIChzaG91dF9zZXRfcHJvdG9jb2wgKHNpbmstPmNvbm4sIHByb3RvKSAhPSBTSE9VVEVSUl9TVUNDRVNTKQorICAgIGdvdG8gc2V0X2ZhaWxlZDsKKworICBjdXJfcHJvcCA9ICJpcCI7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJzZXR0aW5nIElQL2hvc3RuYW1lOiAlcyIsIHNpbmstPmlwKTsKKyAgaWYgKHNob3V0X3NldF9ob3N0IChzaW5rLT5jb25uLCBzaW5rLT5pcCkgIT0gU0hPVVRFUlJfU1VDQ0VTUykKKyAgICBnb3RvIHNldF9mYWlsZWQ7CisKKyAgY3VyX3Byb3AgPSAicG9ydCI7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJzZXR0aW5nIHBvcnQ6ICV1Iiwgc2luay0+cG9ydCk7CisgIGlmIChzaG91dF9zZXRfcG9ydCAoc2luay0+Y29ubiwgc2luay0+cG9ydCkgIT0gU0hPVVRFUlJfU1VDQ0VTUykKKyAgICBnb3RvIHNldF9mYWlsZWQ7CisKKyAgY3VyX3Byb3AgPSAicGFzc3dvcmQiOworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2V0dGluZyBwYXNzd29yZDogJXMiLCBzaW5rLT5wYXNzd29yZCk7CisgIGlmIChzaG91dF9zZXRfcGFzc3dvcmQgKHNpbmstPmNvbm4sIHNpbmstPnBhc3N3b3JkKSAhPSBTSE9VVEVSUl9TVUNDRVNTKQorICAgIGdvdG8gc2V0X2ZhaWxlZDsKKworICBjdXJfcHJvcCA9ICJwdWJsaWMiOworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2V0dGluZyAlczogJXUiLCBjdXJfcHJvcCwgc2luay0+aXNwdWJsaWMpOworICBpZiAoc2hvdXRfc2V0X3B1YmxpYyAoc2luay0+Y29ubiwKKyAgICAgICAgICAoc2luay0+aXNwdWJsaWMgPyAxIDogMCkpICE9IFNIT1VURVJSX1NVQ0NFU1MpCisgICAgZ290byBzZXRfZmFpbGVkOworCisgIGN1cl9wcm9wID0gInN0cmVhbW5hbWUiOworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2V0dGluZyAlczogJXMiLCBjdXJfcHJvcCwgc2luay0+c3RyZWFtbmFtZSk7CisgIGlmIChzaG91dF9zZXRfbmFtZSAoc2luay0+Y29ubiwgc2luay0+c3RyZWFtbmFtZSkgIT0gU0hPVVRFUlJfU1VDQ0VTUykKKyAgICBnb3RvIHNldF9mYWlsZWQ7CisKKyAgY3VyX3Byb3AgPSAiZGVzY3JpcHRpb24iOworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2V0dGluZyAlczogJXMiLCBjdXJfcHJvcCwgc2luay0+ZGVzY3JpcHRpb24pOworICBpZiAoc2hvdXRfc2V0X2Rlc2NyaXB0aW9uIChzaW5rLT5jb25uLCBzaW5rLT5kZXNjcmlwdGlvbikgIT0gU0hPVVRFUlJfU1VDQ0VTUykKKyAgICBnb3RvIHNldF9mYWlsZWQ7CisKKyAgY3VyX3Byb3AgPSAiZ2VucmUiOworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2V0dGluZyAlczogJXMiLCBjdXJfcHJvcCwgc2luay0+Z2VucmUpOworICBpZiAoc2hvdXRfc2V0X2dlbnJlIChzaW5rLT5jb25uLCBzaW5rLT5nZW5yZSkgIT0gU0hPVVRFUlJfU1VDQ0VTUykKKyAgICBnb3RvIHNldF9mYWlsZWQ7CisKKyAgY3VyX3Byb3AgPSAibW91bnQiOworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2V0dGluZyAlczogJXMiLCBjdXJfcHJvcCwgc2luay0+bW91bnQpOworICBpZiAoc2hvdXRfc2V0X21vdW50IChzaW5rLT5jb25uLCBzaW5rLT5tb3VudCkgIT0gU0hPVVRFUlJfU1VDQ0VTUykKKyAgICBnb3RvIHNldF9mYWlsZWQ7CisKKyAgY3VyX3Byb3AgPSAidXNlcm5hbWUiOworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2V0dGluZyAlczogJXMiLCBjdXJfcHJvcCwgc2luay0+dXNlcm5hbWUpOworICBpZiAoc2hvdXRfc2V0X3VzZXIgKHNpbmstPmNvbm4sIHNpbmstPnVzZXJuYW1lKSAhPSBTSE9VVEVSUl9TVUNDRVNTKQorICAgIGdvdG8gc2V0X2ZhaWxlZDsKKworICB2ZXJzaW9uX3N0cmluZyA9IGdzdF92ZXJzaW9uX3N0cmluZyAoKTsKKyAgY3VyX3Byb3AgPSAiYWdlbnQiOworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2V0dGluZyAlczogJXMiLCBjdXJfcHJvcCwgdmVyc2lvbl9zdHJpbmcpOworICBpZiAoc2hvdXRfc2V0X2FnZW50IChzaW5rLT5jb25uLCB2ZXJzaW9uX3N0cmluZykgIT0gU0hPVVRFUlJfU1VDQ0VTUykgeworICAgIGdfZnJlZSAodmVyc2lvbl9zdHJpbmcpOworICAgIGdvdG8gc2V0X2ZhaWxlZDsKKyAgfQorCisgIGdfZnJlZSAodmVyc2lvbl9zdHJpbmcpOworICByZXR1cm4gVFJVRTsKKworLyogRVJST1IgKi8KK3NldF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2luaywgTElCUkFSWSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJFcnJvciBzZXR0aW5nICVzOiAlcyIsIGN1cl9wcm9wLCBzaG91dF9nZXRfZXJyb3IgKHNpbmstPmNvbm4pKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfc2hvdXQyc2VuZF9jb25uZWN0IChHc3RTaG91dDJzZW5kICogc2luaykKK3sKKyAgR3N0Rmxvd1JldHVybiBmcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGdpbnQgcmV0OworICBHc3RDbG9ja1RpbWUgc3RhcnRfdHM7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgIkNvbm5lY3Rpb24gZm9ybWF0IGlzOiAlZCIsIHNpbmstPmZvcm1hdCk7CisKKyAgaWYgKHNpbmstPmZvcm1hdCA9PSAtMSkKKyAgICBnb3RvIG5vX2NhcHM7CisKKyAgaWYgKHNob3V0X3NldF9ub25ibG9ja2luZyAoc2luay0+Y29ubiwgMSkgIT0gU0hPVVRFUlJfU1VDQ0VTUykKKyAgICBnb3RvIGNvdWxkX25vdF9zZXRfbm9uYmxvY2tpbmc7CisKKyAgaWYgKHNob3V0X3NldF9mb3JtYXQgKHNpbmstPmNvbm4sIHNpbmstPmZvcm1hdCkgIT0gU0hPVVRFUlJfU1VDQ0VTUykKKyAgICBnb3RvIGNvdWxkX25vdF9zZXRfZm9ybWF0OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJjb25uZWN0aW5nIik7CisKKyAgc3RhcnRfdHMgPSBnc3RfdXRpbF9nZXRfdGltZXN0YW1wICgpOworICByZXQgPSBzaG91dF9vcGVuIChzaW5rLT5jb25uKTsKKworICAvKiB3YWl0IGZvciBjb25uZWN0aW9uIG9yIHRpbWVvdXQgKi8KKyAgd2hpbGUgKHJldCA9PSBTSE9VVEVSUl9CVVNZKSB7CisgICAgaWYgKGdzdF91dGlsX2dldF90aW1lc3RhbXAgKCkgLSBzdGFydF90cyA+IHNpbmstPnRpbWVvdXQgKiBHU1RfTVNFQ09ORCkgeworICAgICAgZ290byBjb25uZWN0aW9uX3RpbWVvdXQ7CisgICAgfQorICAgIGlmIChnc3RfcG9sbF93YWl0IChzaW5rLT50aW1lciwgMTAgKiBHU1RfTVNFQ09ORCkgPT0gLTEpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzaW5rLCAidW5sb2NrZWQiKTsKKworICAgICAgZnJldCA9IGdzdF9iYXNlX3Npbmtfd2FpdF9wcmVyb2xsIChHU1RfQkFTRV9TSU5LIChzaW5rKSk7CisgICAgICBpZiAoZnJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICByZXQgPSBzaG91dF9nZXRfY29ubmVjdGVkIChzaW5rLT5jb25uKTsKKyAgfQorCisgIGlmIChyZXQgIT0gU0hPVVRFUlJfQ09OTkVDVEVEICYmIHJldCAhPSBTSE9VVEVSUl9TVUNDRVNTKQorICAgIGdvdG8gY291bGRfbm90X2Nvbm5lY3Q7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgImNvbm5lY3RlZCB0byBzZXJ2ZXIiKTsKKyAgc2luay0+Y29ubmVjdGVkID0gVFJVRTsKKworICAvKiBpbml0aWFsaXplIHNlbmRpbmcgcmF0ZSBtb25pdG9yaW5nICovCisgIHNpbmstPnByZXZfcXVldWVsZW4gPSAwOworICBzaW5rLT5kYXRhX3NlbnQgPSAwOworICBzaW5rLT5zdGFsbGVkID0gVFJVRTsKKyAgc2luay0+ZGF0YXNlbnRfcmVzZXRfdHMgPSBzaW5rLT5zdGFsbGVkX3RzID0gZ3N0X3V0aWxfZ2V0X3RpbWVzdGFtcCAoKTsKKworICAvKiBsZXQncyBzZXQgbWV0YWRhdGEgKi8KKyAgaWYgKHNpbmstPnNvbmdtZXRhZGF0YSkgeworICAgIHNob3V0X21ldGFkYXRhX3QgKnBtZXRhZGF0YTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJzaG91dCBtZXRhZGF0YSBub3c6ICVzIiwgc2luay0+c29uZ21ldGFkYXRhKTsKKyAgICBwbWV0YWRhdGEgPSBzaG91dF9tZXRhZGF0YV9uZXcgKCk7CisgICAgc2hvdXRfbWV0YWRhdGFfYWRkIChwbWV0YWRhdGEsICJzb25nIiwgc2luay0+c29uZ21ldGFkYXRhKTsKKyAgICBzaG91dF9zZXRfbWV0YWRhdGEgKHNpbmstPmNvbm4sIHBtZXRhZGF0YSk7CisgICAgc2hvdXRfbWV0YWRhdGFfZnJlZSAocG1ldGFkYXRhKTsKKyAgfQorCitkb25lOgorICByZXR1cm4gZnJldDsKKworLyogRVJST1JTICovCitub19jYXBzOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNpbmssIENPUkUsIE5FR09USUFUSU9OLCAoTlVMTCksCisgICAgICAgICgiTm8gaW5wdXQgY2FwcyByZWNlaXZlZC4iKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICB9CisKK2NvdWxkX25vdF9zZXRfbm9uYmxvY2tpbmc6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2luaywgTElCUkFSWSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJFcnJvciBjb25maWd1cmluZyBsaWJzaG91dCB0byB1c2Ugbm9uLWJsb2NraW5nIGkvbzogJXMiLAorICAgICAgICAgICAgc2hvdXRfZ2V0X2Vycm9yIChzaW5rLT5jb25uKSkpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCitjb3VsZF9ub3Rfc2V0X2Zvcm1hdDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBMSUJSQVJZLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAoIkVycm9yIHNldHRpbmcgY29ubmVjdGlvbiBmb3JtYXQ6ICVzIiwgc2hvdXRfZ2V0X2Vycm9yIChzaW5rLT5jb25uKSkpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCitjb3VsZF9ub3RfY29ubmVjdDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBSRVNPVVJDRSwgT1BFTl9XUklURSwKKyAgICAgICAgKF8oIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIpKSwKKyAgICAgICAgKCJzaG91dF9vcGVuKCkgZmFpbGVkOiBlcnI9JXMiLCBzaG91dF9nZXRfZXJyb3IgKHNpbmstPmNvbm4pKSk7CisgICAgZ19zaWduYWxfZW1pdCAoc2luaywgZ3N0X3Nob3V0MnNlbmRfc2lnbmFsc1tTSUdOQUxfQ09OTkVDVElPTl9QUk9CTEVNXSwgMCwKKyAgICAgICAgc2hvdXRfZ2V0X2Vycm5vIChzaW5rLT5jb25uKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKK2Nvbm5lY3Rpb25fdGltZW91dDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBSRVNPVVJDRSwgT1BFTl9XUklURSwKKyAgICAgICAgKF8oIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIpKSwgKCJjb25uZWN0aW9uIHRpbWVkIG91dCIpKTsKKyAgICBnX3NpZ25hbF9lbWl0IChzaW5rLCBnc3Rfc2hvdXQyc2VuZF9zaWduYWxzW1NJR05BTF9DT05ORUNUSU9OX1BST0JMRU1dLCAwLAorICAgICAgICBzaG91dF9nZXRfZXJybm8gKHNpbmstPmNvbm4pKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2hvdXQyc2VuZF9zdG9wIChHc3RCYXNlU2luayAqIGJhc2VzaW5rKQoreworICBHc3RTaG91dDJzZW5kICpzaW5rID0gR1NUX1NIT1VUMlNFTkQgKGJhc2VzaW5rKTsKKworICBpZiAoc2luay0+Y29ubikgeworICAgIGlmIChzaW5rLT5jb25uZWN0ZWQpCisgICAgICBzaG91dF9jbG9zZSAoc2luay0+Y29ubik7CisgICAgc2hvdXRfZnJlZSAoc2luay0+Y29ubik7CisgICAgc2luay0+Y29ubiA9IE5VTEw7CisgIH0KKworICBpZiAoc2luay0+c29uZ21ldGFkYXRhKSB7CisgICAgZ19mcmVlIChzaW5rLT5zb25nbWV0YWRhdGEpOworICAgIHNpbmstPnNvbmdtZXRhZGF0YSA9IE5VTEw7CisgIH0KKworICBzaW5rLT5jb25uZWN0ZWQgPSBGQUxTRTsKKyAgc2luay0+Zm9ybWF0ID0gLTE7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Nob3V0MnNlbmRfdW5sb2NrIChHc3RCYXNlU2luayAqIGJhc2VzaW5rKQoreworICBHc3RTaG91dDJzZW5kICpzaW5rOworCisgIHNpbmsgPSBHU1RfU0hPVVQyU0VORCAoYmFzZXNpbmspOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VzaW5rLCAidW5sb2NrIik7CisgIGdzdF9wb2xsX3NldF9mbHVzaGluZyAoc2luay0+dGltZXIsIFRSVUUpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zaG91dDJzZW5kX3VubG9ja19zdG9wIChHc3RCYXNlU2luayAqIGJhc2VzaW5rKQoreworICBHc3RTaG91dDJzZW5kICpzaW5rOworCisgIHNpbmsgPSBHU1RfU0hPVVQyU0VORCAoYmFzZXNpbmspOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VzaW5rLCAidW5sb2NrX3N0b3AiKTsKKyAgZ3N0X3BvbGxfc2V0X2ZsdXNoaW5nIChzaW5rLT50aW1lciwgRkFMU0UpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3Nob3V0MnNlbmRfcmVuZGVyIChHc3RCYXNlU2luayAqIGJhc2VzaW5rLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFNob3V0MnNlbmQgKnNpbms7CisgIGdsb25nIHJldDsKKyAgZ2ludCBkZWxheTsKKyAgR3N0Rmxvd1JldHVybiBmcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdE1hcEluZm8gbWFwOworICBHc3RDbG9ja1RpbWUgbm93OworICBzc2l6ZV90IHF1ZXVlbGVuOworCisgIHNpbmsgPSBHU1RfU0hPVVQyU0VORCAoYmFzZXNpbmspOworCisgIC8qIHdlIGNvbm5lY3QgaGVyZSBiZWNhdXNlIHdlIG5lZWQgdG8ga25vdyB0aGUgZm9ybWF0IGJlZm9yZSB3ZSBjYW4gc2V0IHVwCisgICAqIHRoZSBjb25uZWN0aW9uLCB3aGljaCB3ZSBkb24ndCBrbm93IHlldCBpbiBfc3RhcnQoKSwgYW5kIGFsc28gYmVjYXVzZSB3ZQorICAgKiBkb24ndCB3YW50IHRvIGJsb2NrIHRoZSBhcHBsaWNhdGlvbiB0aHJlYWQgKi8KKyAgaWYgKCFzaW5rLT5jb25uZWN0ZWQpIHsKKyAgICBmcmV0ID0gZ3N0X3Nob3V0MnNlbmRfY29ubmVjdCAoc2luayk7CisgICAgaWYgKGZyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIGRvbmU7CisgIH0KKworICBkZWxheSA9IHNob3V0X2RlbGF5IChzaW5rLT5jb25uKTsKKworICBpZiAoZGVsYXkgPiAwKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNpbmssICJ3YWl0aW5nICVkIG1zZWMiLCBkZWxheSk7CisgICAgaWYgKGdzdF9wb2xsX3dhaXQgKHNpbmstPnRpbWVyLCBHU1RfTVNFQ09ORCAqIGRlbGF5KSA9PSAtMSkgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNpbmssICJ1bmxvY2tlZCIpOworCisgICAgICBmcmV0ID0gZ3N0X2Jhc2Vfc2lua193YWl0X3ByZXJvbGwgKGJhc2VzaW5rKTsKKyAgICAgIGlmIChmcmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9MT0dfT0JKRUNUIChzaW5rLCAid2UncmUgJWQgbXNlYyBsYXRlIiwgLWRlbGF5KTsKKyAgfQorCisgIC8qIGFjY3VtdWxhdGUgaG93IG11Y2ggZGF0YSBoYXZlIGFjdHVhbGx5IGJlZW4gc2VudAorICAgKiB0byB0aGUgbmV0d29yayBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIHNob3V0X3NlbmQoKSAqLworICBxdWV1ZWxlbiA9IHNob3V0X3F1ZXVlbGVuIChzaW5rLT5jb25uKTsKKyAgaWYgKHNpbmstPnByZXZfcXVldWVsZW4gPiAwKQorICAgIHNpbmstPmRhdGFfc2VudCArPSBzaW5rLT5wcmV2X3F1ZXVlbGVuIC0gcXVldWVsZW47CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICAvKiBhZGQgbWFwLnNpemUgaW5zdGVhZCBvZiByZS1yZWFkaW5nIHRoZSBxdWV1ZSBsZW5ndGggYmVjYXVzZQorICAgKiB0aGUgZGF0YSBtYXkgYWN0dWFsbHkgYmUgc2VudCBpbW1lZGlhdGVseSAqLworICBzaW5rLT5wcmV2X3F1ZXVlbGVuID0gcXVldWVsZW4gKyBtYXAuc2l6ZTsKKworICBHU1RfTE9HX09CSkVDVCAoc2luaywgInNlbmRpbmcgJXUgYnl0ZXMgb2YgZGF0YSwgcXVldWUgbGVuZ3RoIG5vdyBpcyAlIgorICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgKGd1aW50KSBtYXAuc2l6ZSwgc2luay0+cHJldl9xdWV1ZWxlbik7CisKKyAgcmV0ID0gc2hvdXRfc2VuZCAoc2luay0+Y29ubiwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICBpZiAocmV0ICE9IFNIT1VURVJSX1NVQ0NFU1MpCisgICAgZ290byBzZW5kX2Vycm9yOworCisgIG5vdyA9IGdzdF91dGlsX2dldF90aW1lc3RhbXAgKCk7CisgIGlmIChub3cgLSBzaW5rLT5kYXRhc2VudF9yZXNldF90cyA+PSA1MDAgKiBHU1RfTVNFQ09ORCkgeworICAgIGd1aW50NjQgc2VuZF9yYXRlOworCisgICAgc2VuZF9yYXRlID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzaW5rLT5kYXRhX3NlbnQsIEdTVF9TRUNPTkQsCisgICAgICAgIG5vdyAtIHNpbmstPmRhdGFzZW50X3Jlc2V0X3RzKTsKKworICAgIGlmIChzZW5kX3JhdGUgPT0gMCAmJiAhc2luay0+c3RhbGxlZCkgeworICAgICAgc2luay0+c3RhbGxlZCA9IFRSVUU7CisgICAgICBzaW5rLT5zdGFsbGVkX3RzID0gbm93OworICAgIH0gZWxzZSBpZiAoc2VuZF9yYXRlID4gMCAmJiBzaW5rLT5zdGFsbGVkKSB7CisgICAgICBzaW5rLT5zdGFsbGVkID0gRkFMU0U7CisgICAgfQorCisgICAgc2luay0+ZGF0YV9zZW50ID0gMDsKKyAgICBzaW5rLT5kYXRhc2VudF9yZXNldF90cyA9IG5vdzsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJzZW5kaW5nIHJhdGUgaXMgJSIgR19HVUlOVDY0X0ZPUk1BVCAiIGJwcywgIgorICAgICAgICAic3RhbGxlZCAlZCwgc3RhbGxlZF90cyAlIiBHU1RfVElNRV9GT1JNQVQsIHNlbmRfcmF0ZSwgc2luay0+c3RhbGxlZCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoc2luay0+c3RhbGxlZF90cykpOworCisgICAgaWYgKHNpbmstPnN0YWxsZWQgJiYgbm93IC0gc2luay0+c3RhbGxlZF90cyA+PSBzaW5rLT50aW1lb3V0ICogR1NUX01TRUNPTkQpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc2luaywgIm5ldHdvcmsgc2VuZCBxdWV1ZSBpcyBzdGFsbGVkIGZvciB0b28gbG9uZyIpOworICAgICAgZ290byBuZXR3b3JrX2Vycm9yOworICAgIH0KKyAgfQorCitkb25lOgorCisgIHJldHVybiBmcmV0OworCisvKiBFUlJPUlMgKi8KK3NlbmRfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2luaywgUkVTT1VSQ0UsIFdSSVRFLCAoTlVMTCksCisgICAgICAgICgic2hvdXRfc2VuZCgpIGZhaWxlZDogJXMiLCBzaG91dF9nZXRfZXJyb3IgKHNpbmstPmNvbm4pKSk7CisgICAgZ19zaWduYWxfZW1pdCAoc2luaywgZ3N0X3Nob3V0MnNlbmRfc2lnbmFsc1tTSUdOQUxfQ09OTkVDVElPTl9QUk9CTEVNXSwgMCwKKyAgICAgICAgc2hvdXRfZ2V0X2Vycm5vIChzaW5rLT5jb25uKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKK25ldHdvcmtfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2luaywgUkVTT1VSQ0UsIFdSSVRFLCAoTlVMTCksCisgICAgICAgICgibmV0d29yayB0aW1lb3V0IHJlYWNoZWQiKSk7CisgICAgZ19zaWduYWxfZW1pdCAoc2luaywgZ3N0X3Nob3V0MnNlbmRfc2lnbmFsc1tTSUdOQUxfQ09OTkVDVElPTl9QUk9CTEVNXSwgMCwKKyAgICAgICAgU0hPVVRFUlJfQlVTWSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc2hvdXQyc2VuZF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0U2hvdXQyc2VuZCAqc2hvdXQyc2VuZDsKKworICBzaG91dDJzZW5kID0gR1NUX1NIT1VUMlNFTkQgKG9iamVjdCk7CisgIHN3aXRjaCAocHJvcF9pZCkgeworCisgICAgY2FzZSBBUkdfSVA6CisgICAgICBnX2ZyZWUgKHNob3V0MnNlbmQtPmlwKTsKKyAgICAgIHNob3V0MnNlbmQtPmlwID0gZ19zdHJkdXAgKGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX1BPUlQ6CisgICAgICBzaG91dDJzZW5kLT5wb3J0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19QQVNTV09SRDoKKyAgICAgIGdfZnJlZSAoc2hvdXQyc2VuZC0+cGFzc3dvcmQpOworICAgICAgc2hvdXQyc2VuZC0+cGFzc3dvcmQgPSBnX3N0cmR1cCAoZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfVVNFUk5BTUU6CisgICAgICBnX2ZyZWUgKHNob3V0MnNlbmQtPnVzZXJuYW1lKTsKKyAgICAgIHNob3V0MnNlbmQtPnVzZXJuYW1lID0gZ19zdHJkdXAgKGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX1BVQkxJQzoKKyAgICAgIHNob3V0MnNlbmQtPmlzcHVibGljID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfU1RSRUFNTkFNRTogICAgICAgLyogTmFtZSBvZiB0aGUgc3RyZWFtICovCisgICAgICBnX2ZyZWUgKHNob3V0MnNlbmQtPnN0cmVhbW5hbWUpOworICAgICAgc2hvdXQyc2VuZC0+c3RyZWFtbmFtZSA9IGdfc3RyZHVwIChnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19ERVNDUklQVElPTjogICAgICAvKiBEZXNjcmlwdGlvbiBvZiB0aGUgc3RyZWFtICovCisgICAgICBnX2ZyZWUgKHNob3V0MnNlbmQtPmRlc2NyaXB0aW9uKTsKKyAgICAgIHNob3V0MnNlbmQtPmRlc2NyaXB0aW9uID0gZ19zdHJkdXAgKGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0dFTlJFOiAgICAgICAgICAgIC8qIEdlbnJlIG9mIHRoZSBzdHJlYW0gKi8KKyAgICAgIGdfZnJlZSAoc2hvdXQyc2VuZC0+Z2VucmUpOworICAgICAgc2hvdXQyc2VuZC0+Z2VucmUgPSBnX3N0cmR1cCAoZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfUFJPVE9DT0w6ICAgICAgICAgLyogcHJvdG9jb2wgdG8gY29ubmVjdCB3aXRoICovCisgICAgICBzaG91dDJzZW5kLT5wcm90b2NvbCA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX01PVU5UOiAgICAgICAgICAgIC8qIG1vdW50cG9pbnQgb2Ygc3RyZWFtIChpY2VjYXN0IG9ubHkpICovCisgICAgICBnX2ZyZWUgKHNob3V0MnNlbmQtPm1vdW50KTsKKyAgICAgIHNob3V0MnNlbmQtPm1vdW50ID0gZ19zdHJkdXAgKGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX1VSTDogICAgICAgICAgICAgIC8qIHRoZSBzdHJlYW0ncyBob21lcGFnZSBVUkwgKi8KKyAgICAgIGdfZnJlZSAoc2hvdXQyc2VuZC0+dXJsKTsKKyAgICAgIHNob3V0MnNlbmQtPnVybCA9IGdfc3RyZHVwIChnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19USU1FT1VUOgorICAgICAgc2hvdXQyc2VuZC0+dGltZW91dCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9zaG91dDJzZW5kX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTaG91dDJzZW5kICpzaG91dDJzZW5kOworCisgIHNob3V0MnNlbmQgPSBHU1RfU0hPVVQyU0VORCAob2JqZWN0KTsKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisKKyAgICBjYXNlIEFSR19JUDoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNob3V0MnNlbmQtPmlwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX1BPUlQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBzaG91dDJzZW5kLT5wb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX1BBU1NXT1JEOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc2hvdXQyc2VuZC0+cGFzc3dvcmQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfVVNFUk5BTUU6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzaG91dDJzZW5kLT51c2VybmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19QVUJMSUM6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgc2hvdXQyc2VuZC0+aXNwdWJsaWMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfU1RSRUFNTkFNRTogICAgICAgLyogTmFtZSBvZiB0aGUgc3RyZWFtICovCisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzaG91dDJzZW5kLT5zdHJlYW1uYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0RFU0NSSVBUSU9OOiAgICAgIC8qIERlc2NyaXB0aW9uIG9mIHRoZSBzdHJlYW0gKi8KKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNob3V0MnNlbmQtPmRlc2NyaXB0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0dFTlJFOiAgICAgICAgICAgIC8qIEdlbnJlIG9mIHRoZSBzdHJlYW0gKi8KKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNob3V0MnNlbmQtPmdlbnJlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX1BST1RPQ09MOiAgICAgICAgIC8qIHByb3RvY29sIHRvIGNvbm5lY3Qgd2l0aCAqLworICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHNob3V0MnNlbmQtPnByb3RvY29sKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX01PVU5UOiAgICAgICAgICAgIC8qIG1vdW50cG9pbnQgb2Ygc3RyZWFtIChpY2VjYXN0IG9ubHkpICovCisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzaG91dDJzZW5kLT5tb3VudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19VUkw6ICAgICAgICAgICAgICAvKiB0aGUgc3RyZWFtJ3MgaG9tZXBhZ2UgVVJMICovCisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzaG91dDJzZW5kLT51cmwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfVElNRU9VVDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzaG91dDJzZW5kLT50aW1lb3V0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2hvdXQyc2VuZF9zZXRjYXBzIChHc3RCYXNlU2luayAqIGJhc2VzaW5rLCBHc3RDYXBzICogY2FwcykKK3sKKyAgY29uc3QgZ2NoYXIgKm1pbWV0eXBlOworICBHc3RTaG91dDJzZW5kICpzaG91dDJzZW5kOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIHNob3V0MnNlbmQgPSBHU1RfU0hPVVQyU0VORCAoYmFzZXNpbmspOworCisgIG1pbWV0eXBlID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCkpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNob3V0MnNlbmQsICJtaW1ldHlwZSBvZiBjYXBzIGdpdmVuIGlzOiAlcyIsIG1pbWV0eXBlKTsKKworICBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJhdWRpby9tcGVnIikpIHsKKyAgICBzaG91dDJzZW5kLT5mb3JtYXQgPSBTSE9VVF9GT1JNQVRfTVAzOworICB9IGVsc2UgaWYgKGdfc3RyX2hhc19zdWZmaXggKG1pbWV0eXBlLCAiL29nZyIpKSB7CisgICAgc2hvdXQyc2VuZC0+Zm9ybWF0ID0gU0hPVVRfRk9STUFUX09HRzsKKyNpZmRlZiBTSE9VVF9GT1JNQVRfV0VCTQorICB9IGVsc2UgaWYgKGdfc3RyX2hhc19zdWZmaXggKG1pbWV0eXBlLCAiL3dlYm0iKSkgeworICAgIHNob3V0MnNlbmQtPmZvcm1hdCA9IFNIT1VUX0ZPUk1BVF9XRUJNOworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgcmV0ID0gRkFMU0U7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisjaWZkZWYgRU5BQkxFX05MUworICBiaW5kdGV4dGRvbWFpbiAoR0VUVEVYVF9QQUNLQUdFLCBMT0NBTEVESVIpOworICBiaW5kX3RleHRkb21haW5fY29kZXNldCAoR0VUVEVYVF9QQUNLQUdFLCAiVVRGLTgiKTsKKyNlbmRpZiAvKiBFTkFCTEVfTkxTICovCisKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJzaG91dDJzZW5kIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgIEdTVF9UWVBFX1NIT1VUMlNFTkQpOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgc2hvdXQyLAorICAgICJTZW5kcyBkYXRhIHRvIGFuIGljZWNhc3Qgc2VydmVyIHVzaW5nIGxpYnNob3V0MiIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sIEdTVF9MSUNFTlNFLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9leHQvc2hvdXQyL2dzdHNob3V0Mi5oIGIvZXh0L3Nob3V0Mi9nc3RzaG91dDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDg3MTY2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3Nob3V0Mi9nc3RzaG91dDIuaApAQCAtMCwwICsxLDEwNCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9TSE9VVDJTRU5EX0hfXworI2RlZmluZSBfX0dTVF9TSE9VVDJTRU5EX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2VzaW5rLmg+CisjaW5jbHVkZSA8c2hvdXQvc2hvdXQuaD4KKworR19CRUdJTl9ERUNMUworCisgIC8qIFByb3RvY29sIHR5cGUgZW51bSAqLwordHlwZWRlZiBlbnVtIHsKKyAgU0hPVVQyU0VORF9QUk9UT0NPTF9YQVVESU9DQVNUID0gMSwKKyAgU0hPVVQyU0VORF9QUk9UT0NPTF9JQ1ksCisgIFNIT1VUMlNFTkRfUFJPVE9DT0xfSFRUUAorfSBHc3RTaG91dDJTZW5kUHJvdG9jb2w7CisKKworLyogRGVmaW5pdGlvbiBvZiBzdHJ1Y3R1cmUgc3RvcmluZyBkYXRhIGZvciB0aGlzIGVsZW1lbnQuICovCit0eXBlZGVmIHN0cnVjdCBfR3N0U2hvdXQyc2VuZCBHc3RTaG91dDJzZW5kOworc3RydWN0IF9Hc3RTaG91dDJzZW5kIHsKKyAgR3N0QmFzZVNpbmsgcGFyZW50OworCisgIEdzdFNob3V0MlNlbmRQcm90b2NvbCBwcm90b2NvbDsKKworICBHc3RQb2xsICp0aW1lcjsKKworICBzaG91dF90ICpjb25uOworCisgIGd1aW50NjQgcHJldl9xdWV1ZWxlbjsKKyAgZ3VpbnQ2NCBkYXRhX3NlbnQ7CisgIEdzdENsb2NrVGltZSBkYXRhc2VudF9yZXNldF90czsKKyAgZ2Jvb2xlYW4gc3RhbGxlZDsKKyAgR3N0Q2xvY2tUaW1lIHN0YWxsZWRfdHM7CisKKyAgZ2NoYXIgKmlwOworICBndWludCBwb3J0OworICBnY2hhciAqcGFzc3dvcmQ7CisgIGdjaGFyICp1c2VybmFtZTsKKyAgZ2NoYXIgKnN0cmVhbW5hbWU7CisgIGdjaGFyICpkZXNjcmlwdGlvbjsKKyAgZ2NoYXIgKmdlbnJlOworICBnY2hhciAqbW91bnQ7CisgIGdjaGFyICp1cmw7CisgIGdib29sZWFuIGNvbm5lY3RlZDsKKyAgZ2Jvb2xlYW4gaXNwdWJsaWM7CisgIGdjaGFyICpzb25nbWV0YWRhdGE7CisgIGdjaGFyICpzb25nYXJ0aXN0OworICBnY2hhciAqc29uZ3RpdGxlOworICBnaW50ICBmb3JtYXQ7CisgIGd1aW50IHRpbWVvdXQ7CisKKyAgR3N0VGFnTGlzdCogdGFnczsKK307CisKKworCisvKiBTdGFuZGFyZCBkZWZpbml0aW9uIGRlZmluaW5nIGEgY2xhc3MgZm9yIHRoaXMgZWxlbWVudC4gKi8KK3R5cGVkZWYgc3RydWN0IF9Hc3RTaG91dDJzZW5kQ2xhc3MgR3N0U2hvdXQyc2VuZENsYXNzOworc3RydWN0IF9Hc3RTaG91dDJzZW5kQ2xhc3MgeworICBHc3RCYXNlU2lua0NsYXNzIHBhcmVudF9jbGFzczsKKworICAvKiBzaWduYWwgY2FsbGJhY2tzICovCisgIHZvaWQgKCpjb25uZWN0aW9uX3Byb2JsZW0pIChHc3RFbGVtZW50ICplbGVtZW50LGd1aW50IGVycm5vKTsKK307CisKKy8qIFN0YW5kYXJkIG1hY3JvcyBmb3IgZGVmaW5pbmcgdHlwZXMgZm9yIHRoaXMgZWxlbWVudC4gICovCisjZGVmaW5lIEdTVF9UWVBFX1NIT1VUMlNFTkQgXAorICAoZ3N0X3Nob3V0MnNlbmRfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1NIT1VUMlNFTkQob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9TSE9VVDJTRU5ELEdzdFNob3V0MnNlbmQpKQorI2RlZmluZSBHU1RfU0hPVVQyU0VORF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9TSE9VVDJTRU5ELEdzdFNob3V0MnNlbmRDbGFzcykpCisjZGVmaW5lIEdTVF9JU19TSE9VVDJTRU5EKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfU0hPVVQyU0VORCkpCisjZGVmaW5lIEdTVF9JU19TSE9VVDJTRU5EX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1NIT1VUMlNFTkQpKQorCisvKiBTdGFuZGFyZCBmdW5jdGlvbiByZXR1cm5pbmcgdHlwZSBpbmZvcm1hdGlvbi4gKi8KK0dUeXBlIGdzdF9zaG91dDJzZW5kX2dldF90eXBlKHZvaWQpOworCisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9TSE9VVDJTRU5EX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L3Nob3V0Mi9tZXNvbi5idWlsZCBiL2V4dC9zaG91dDIvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3Nzk1OAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zaG91dDIvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxNCBAQAorc2hvdXQyX3NvdXJjZXMgPSBbJ2dzdHNob3V0Mi5jJ10KKworc2hvdXQyX2RlcCA9IGRlcGVuZGVuY3koJ3Nob3V0JywgdmVyc2lvbiA6ICc+PSAyLjAnLCByZXF1aXJlZCA6IGZhbHNlKQorCitpZiBzaG91dDJfZGVwLmZvdW5kKCkKKyAgZ3N0c2hvdXQyID0gbGlicmFyeSgnZ3N0c2hvdXQyJywKKyAgICBzaG91dDJfc291cmNlcywKKyAgICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICAgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgc2hvdXQyX2RlcF0sCisgICAgaW5zdGFsbCA6IHRydWUsCisgICAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorICApCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L3NvdXAvTWFrZWZpbGUuYW0gYi9leHQvc291cC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzUxNTk0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NvdXAvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMiBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0c291cC5sYQorCitsaWJnc3Rzb3VwX2xhX1NPVVJDRVMgPSBnc3Rzb3VwaHR0cHNyYy5jIGdzdHNvdXBodHRwY2xpZW50c2luay5jIGdzdHNvdXB1dGlscy5jIGdzdHNvdXAuYworCitsaWJnc3Rzb3VwX2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQ0ZMQUdTKSAkKFNPVVBfQ0ZMQUdTKSBcCisJLURTT1VQX1ZFUlNJT05fTUlOX1JFUVVJUkVEPVNPVVBfVkVSU0lPTl8yXzQ4IFwKKwktRFNPVVBfVkVSU0lPTl9NQVhfQUxMT1dFRD1TT1VQX0RFUFJFQ0FURURfSU5fMl80OAorbGliZ3N0c291cF9sYV9MSUJBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R0YWctQEdTVF9BUElfVkVSU0lPTkAgJChHU1RfQkFTRV9MSUJTKSAkKFNPVVBfTElCUykKK2xpYmdzdHNvdXBfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdHNvdXBodHRwc3JjLmggZ3N0c291cGh0dHBjbGllbnRzaW5rLmggZ3N0c291cHV0aWxzLmgKZGlmZiAtLWdpdCBhL2V4dC9zb3VwL2dzdHNvdXAuYyBiL2V4dC9zb3VwL2dzdHNvdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmU0OTFkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NvdXAvZ3N0c291cC5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKworI2luY2x1ZGUgImdzdHNvdXBodHRwc3JjLmgiCisjaW5jbHVkZSAiZ3N0c291cGh0dHBjbGllbnRzaW5rLmgiCisjaW5jbHVkZSAiZ3N0c291cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWSAoc291cF91dGlsc19kZWJ1Zyk7CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyNpZmRlZiBFTkFCTEVfTkxTCisgIEdTVF9ERUJVRyAoImJpbmRpbmcgdGV4dCBkb21haW4gJXMgdG8gbG9jYWxlIGRpciAlcyIsIEdFVFRFWFRfUEFDS0FHRSwKKyAgICAgIExPQ0FMRURJUik7CisgIGJpbmR0ZXh0ZG9tYWluIChHRVRURVhUX1BBQ0tBR0UsIExPQ0FMRURJUik7CisgIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChHRVRURVhUX1BBQ0tBR0UsICJVVEYtOCIpOworI2VuZGlmCisKKyAgLyogc2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NzQ4ODUgKi8KKyAgZ190eXBlX2Vuc3VyZSAoR19UWVBFX1NPQ0tFVCk7CisgIGdfdHlwZV9lbnN1cmUgKEdfVFlQRV9TT0NLRVRfQUREUkVTUyk7CisgIGdfdHlwZV9lbnN1cmUgKEdfVFlQRV9TT0NLRVRfU0VSVklDRSk7CisgIGdfdHlwZV9lbnN1cmUgKEdfVFlQRV9TT0NLRVRfRkFNSUxZKTsKKyAgZ190eXBlX2Vuc3VyZSAoR19UWVBFX1NPQ0tFVF9DTElFTlQpOworICBnX3R5cGVfZW5zdXJlIChHX1RZUEVfUkVTT0xWRVIpOworICBnX3R5cGVfZW5zdXJlIChHX1RZUEVfUFJPWFlfUkVTT0xWRVIpOworICBnX3R5cGVfZW5zdXJlIChHX1RZUEVfUFJPWFlfQUREUkVTUyk7CisgIGdfdHlwZV9lbnN1cmUgKEdfVFlQRV9UTFNfQ0VSVElGSUNBVEUpOworICBnX3R5cGVfZW5zdXJlIChHX1RZUEVfVExTX0NPTk5FQ1RJT04pOworICBnX3R5cGVfZW5zdXJlIChHX1RZUEVfVExTX0RBVEFCQVNFKTsKKyAgZ190eXBlX2Vuc3VyZSAoR19UWVBFX1RMU19JTlRFUkFDVElPTik7CisKKyAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInNvdXBodHRwc3JjIiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgIEdTVF9UWVBFX1NPVVBfSFRUUF9TUkMpOworICBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAic291cGh0dHBjbGllbnRzaW5rIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgIEdTVF9UWVBFX1NPVVBfSFRUUF9DTElFTlRfU0lOSyk7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChzb3VwX3V0aWxzX2RlYnVnLCAic291cHV0aWxzIiwgMCwgIlNvdXAgdXRpbHMiKTsKKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHNvdXAsCisgICAgImxpYnNvdXAgSFRUUCBjbGllbnQgc3JjL3NpbmsiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmMgYi9leHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODEyNDg4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmMKQEAgLTAsMCArMSw5MjEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDExIERhdmlkIFNjaGxlZWYgPGRzQGVudHJvcHl3YXZlLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIFN1aXRlIDUwMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMzNSwgVVNBLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1nc3Rzb3VwaHR0cGNsaWVudHNpbmsKKyAqCisgKiBUaGUgc291cGh0dHBjbGllbnRzaW5rIGVsZW1lbnQgc2VuZHMgcGlwZWxpbmUgZGF0YSB0byBhbiBIVFRQIHNlcnZlcgorICogdXNpbmcgSFRUUCBQVVQgY29tbWFuZHMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz0zMDAgISB0aGVvcmFlbmMgISBvZ2dtdXggIQorICogICBzb3VwaHR0cGNsaWVudHNpbmsgbG9jYXRpb249aHR0cDovL3NlcnZlci9maWxlbmFtZS5vZ3YKKyAqIF18CisgKiAKKyAqIFRoaXMgZXhhbXBsZSBlbmNvZGVzIDEwIHNlY29uZHMgb2YgdmlkZW8gYW5kIHNlbmRzIGl0IHRvIHRoZSBIVFRQCisgKiBzZXJ2ZXIgInNlcnZlciIgdXNpbmcgSFRUUCBQVVQgY29tbWFuZHMuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNlc2luay5oPgorI2luY2x1ZGUgImdzdHNvdXBodHRwY2xpZW50c2luay5oIgorI2luY2x1ZGUgImdzdHNvdXB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChzb3VwaHR0cGNsaWVudHNpbmtfZGJnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHNvdXBodHRwY2xpZW50c2lua19kYmcKKworLyogcHJvdG90eXBlcyAqLworCisKK3N0YXRpYyB2b2lkIGdzdF9zb3VwX2h0dHBfY2xpZW50X3Npbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BlcnR5X2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BlcnR5X2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgdm9pZCBnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9zb3VwX2h0dHBfY2xpZW50X3Npbmtfc2V0X2NhcHMgKEdzdEJhc2VTaW5rICogc2luaywKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgdm9pZCBnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX2dldF90aW1lcyAoR3N0QmFzZVNpbmsgKiBzaW5rLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlciwgR3N0Q2xvY2tUaW1lICogc3RhcnQsIEdzdENsb2NrVGltZSAqIGVuZCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19zdGFydCAoR3N0QmFzZVNpbmsgKiBzaW5rKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX3N0b3AgKEdzdEJhc2VTaW5rICogc2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua191bmxvY2sgKEdzdEJhc2VTaW5rICogc2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19ldmVudCAoR3N0QmFzZVNpbmsgKiBzaW5rLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19wcmVyb2xsIChHc3RCYXNlU2luayAqIHNpbmssCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfcmVuZGVyIChHc3RCYXNlU2luayAqIHNpbmssCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKKworc3RhdGljIHZvaWQgZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19yZXNldCAoR3N0U291cEh0dHBDbGllbnRTaW5rICoKKyAgICBzb3VwaHR0cHNpbmspOworc3RhdGljIHZvaWQgYXV0aGVudGljYXRlIChTb3VwU2Vzc2lvbiAqIHNlc3Npb24sIFNvdXBNZXNzYWdlICogbXNnLAorICAgIFNvdXBBdXRoICogYXV0aCwgZ2Jvb2xlYW4gcmV0cnlpbmcsIGdwb2ludGVyIHVzZXJfZGF0YSk7CitzdGF0aWMgdm9pZCBjYWxsYmFjayAoU291cFNlc3Npb24gKiBzZXNzaW9uLCBTb3VwTWVzc2FnZSAqIG1zZywKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpOworc3RhdGljIGdib29sZWFuIGdzdF9zb3VwX2h0dHBfY2xpZW50X3Npbmtfc2V0X3Byb3h5IChHc3RTb3VwSHR0cENsaWVudFNpbmsgKgorICAgIHNvdXBodHRwc2luaywgY29uc3QgZ2NoYXIgKiB1cmkpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MT0NBVElPTiwKKyAgUFJPUF9VU0VSX0FHRU5ULAorICBQUk9QX0FVVE9NQVRJQ19SRURJUkVDVCwKKyAgUFJPUF9QUk9YWSwKKyAgUFJPUF9VU0VSX0lELAorICBQUk9QX1VTRVJfUFcsCisgIFBST1BfUFJPWFlfSUQsCisgIFBST1BfUFJPWFlfUFcsCisgIFBST1BfQ09PS0lFUywKKyAgUFJPUF9TRVNTSU9OLAorICBQUk9QX1NPVVBfTE9HX0xFVkVMLAorICBQUk9QX1JFVFJZX0RFTEFZLAorICBQUk9QX1JFVFJJRVMKK307CisKKyNkZWZpbmUgREVGQVVMVF9VU0VSX0FHRU5UICAgICAgICAgICAiR1N0cmVhbWVyIHNvdXBodHRwY2xpZW50c2luayAiCisjZGVmaW5lIERFRkFVTFRfU09VUF9MT0dfTEVWRUwgICAgICAgU09VUF9MT0dHRVJfTE9HX05PTkUKKworLyogcGFkIHRlbXBsYXRlcyAqLworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCisKKy8qIGNsYXNzIGluaXRpYWxpemF0aW9uICovCisKKyNkZWZpbmUgZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RTb3VwSHR0cENsaWVudFNpbmssIGdzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmssCisgICAgR1NUX1RZUEVfQkFTRV9TSU5LKTsKKworc3RhdGljIHZvaWQKK2dzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfY2xhc3NfaW5pdCAoR3N0U291cEh0dHBDbGllbnRTaW5rQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0QmFzZVNpbmtDbGFzcyAqYmFzZV9zaW5rX2NsYXNzID0gR1NUX0JBU0VfU0lOS19DTEFTUyAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9zb3VwX2h0dHBfY2xpZW50X3Npbmtfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfZGlzcG9zZTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX2ZpbmFsaXplOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX0xPQ0FUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImxvY2F0aW9uIiwgIkxvY2F0aW9uIiwKKyAgICAgICAgICAiVVJJIHRvIHNlbmQgdG8iLCAiIiwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1VTRVJfQUdFTlQsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgidXNlci1hZ2VudCIsICJVc2VyLUFnZW50IiwKKyAgICAgICAgICAiVmFsdWUgb2YgdGhlIFVzZXItQWdlbnQgSFRUUCByZXF1ZXN0IGhlYWRlciBmaWVsZCIsCisgICAgICAgICAgREVGQVVMVF9VU0VSX0FHRU5ULCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfQVVUT01BVElDX1JFRElSRUNULAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJhdXRvbWF0aWMtcmVkaXJlY3QiLCAiYXV0b21hdGljLXJlZGlyZWN0IiwKKyAgICAgICAgICAiQXV0b21hdGljYWxseSBmb2xsb3cgSFRUUCByZWRpcmVjdHMgKEhUVFAgU3RhdHVzIENvZGUgM3h4KSIsCisgICAgICAgICAgVFJVRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1BST1hZLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInByb3h5IiwgIlByb3h5IiwKKyAgICAgICAgICAiSFRUUCBwcm94eSBzZXJ2ZXIgVVJJIiwgIiIsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1VTRVJfSUQsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgidXNlci1pZCIsICJ1c2VyLWlkIiwKKyAgICAgICAgICAidXNlciBpZCBmb3IgYXV0aGVudGljYXRpb24iLCAiIiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9VU0VSX1BXLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInVzZXItcHciLCAidXNlci1wdyIsCisgICAgICAgICAgInVzZXIgcGFzc3dvcmQgZm9yIGF1dGhlbnRpY2F0aW9uIiwgIiIsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUFJPWFlfSUQsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgicHJveHktaWQiLCAicHJveHktaWQiLAorICAgICAgICAgICJ1c2VyIGlkIGZvciBwcm94eSBhdXRoZW50aWNhdGlvbiIsICIiLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BST1hZX1BXLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInByb3h5LXB3IiwgInByb3h5LXB3IiwKKyAgICAgICAgICAidXNlciBwYXNzd29yZCBmb3IgcHJveHkgYXV0aGVudGljYXRpb24iLCAiIiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TRVNTSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoInNlc3Npb24iLCAic2Vzc2lvbiIsCisgICAgICAgICAgIlNvdXBTZXNzaW9uIG9iamVjdCB0byB1c2UgZm9yIGNvbW11bmljYXRpb24iLAorICAgICAgICAgIFNPVVBfVFlQRV9TRVNTSU9OLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DT09LSUVTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgiY29va2llcyIsICJDb29raWVzIiwgIkhUVFAgcmVxdWVzdCBjb29raWVzIiwKKyAgICAgICAgICBHX1RZUEVfU1RSViwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkVUUllfREVMQVksCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicmV0cnktZGVsYXkiLCAiUmV0cnkgRGVsYXkiLAorICAgICAgICAgICJEZWxheSBpbiBzZWNvbmRzIGJldHdlZW4gcmV0cmllcyBhZnRlciBhIGZhaWx1cmUiLCAxLCBHX01BWElOVCwgNSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SRVRSSUVTLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInJldHJpZXMiLCAiUmV0cmllcyIsCisgICAgICAgICAgIk1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMsIHplcm8gdG8gZGlzYWJsZSwgLTEgdG8gcmV0cnkgZm9yZXZlciIsCisgICAgICAgICAgLTEsIEdfTUFYSU5ULCAwLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAvKioKKyAgICogR3N0U291cEh0dHBDbGllbnRTaW5rOjpodHRwLWxvZy1sZXZlbDoKKyAgICoKKyAgICogSWYgc2V0IGFuZCA+IDAsIGNhcHR1cmVzIGFuZCBkdW1wcyBIVFRQIHNlc3Npb24gZGF0YSBhcworICAgKiBsb2cgbWVzc2FnZXMgaWYgbG9nIGxldmVsID49IEdTVF9MRVZFTF9UUkFDRQorICAgKgorICAgKiBTaW5jZTogMS40CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NPVVBfTE9HX0xFVkVMLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJodHRwLWxvZy1sZXZlbCIsICJIVFRQIGxvZyBsZXZlbCIsCisgICAgICAgICAgIlNldCBsb2cgbGV2ZWwgZm9yIHNvdXAncyBIVFRQIHNlc3Npb24gbG9nIiwKKyAgICAgICAgICBTT1VQX1RZUEVfTE9HR0VSX0xPR19MRVZFTCwgREVGQVVMVF9TT1VQX0xPR19MRVZFTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJIVFRQIGNsaWVudCBzaW5rIiwKKyAgICAgICJHZW5lcmljIiwgIlNlbmRzIHN0cmVhbXMgdG8gSFRUUCBzZXJ2ZXIgdmlhIFBVVCIsCisgICAgICAiRGF2aWQgU2NobGVlZiA8ZHNAZW50cm9weXdhdmUuY29tPiIpOworCisgIGJhc2Vfc2lua19jbGFzcy0+c2V0X2NhcHMgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zb3VwX2h0dHBfY2xpZW50X3Npbmtfc2V0X2NhcHMpOworICBpZiAoMCkKKyAgICBiYXNlX3NpbmtfY2xhc3MtPmdldF90aW1lcyA9CisgICAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX2dldF90aW1lcyk7CisgIGJhc2Vfc2lua19jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19zdGFydCk7CisgIGJhc2Vfc2lua19jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX3N0b3ApOworICBiYXNlX3NpbmtfY2xhc3MtPnVubG9jayA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua191bmxvY2spOworICBiYXNlX3NpbmtfY2xhc3MtPmV2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfZXZlbnQpOworICBpZiAoMCkKKyAgICBiYXNlX3NpbmtfY2xhc3MtPnByZXJvbGwgPQorICAgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19wcmVyb2xsKTsKKyAgYmFzZV9zaW5rX2NsYXNzLT5yZW5kZXIgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfcmVuZGVyKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoc291cGh0dHBjbGllbnRzaW5rX2RiZywgInNvdXBodHRwY2xpZW50c2luayIsIDAsCisgICAgICAic291cGh0dHBjbGllbnRzaW5rIGVsZW1lbnQiKTsKKworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19pbml0IChHc3RTb3VwSHR0cENsaWVudFNpbmsgKiBzb3VwaHR0cHNpbmspCit7CisgIGNvbnN0IGNoYXIgKnByb3h5OworCisgIGdfbXV0ZXhfaW5pdCAoJnNvdXBodHRwc2luay0+bXV0ZXgpOworICBnX2NvbmRfaW5pdCAoJnNvdXBodHRwc2luay0+Y29uZCk7CisKKyAgc291cGh0dHBzaW5rLT5sb2NhdGlvbiA9IE5VTEw7CisgIHNvdXBodHRwc2luay0+YXV0b21hdGljX3JlZGlyZWN0ID0gVFJVRTsKKyAgc291cGh0dHBzaW5rLT51c2VyX2FnZW50ID0gZ19zdHJkdXAgKERFRkFVTFRfVVNFUl9BR0VOVCk7CisgIHNvdXBodHRwc2luay0+dXNlcl9pZCA9IE5VTEw7CisgIHNvdXBodHRwc2luay0+dXNlcl9wdyA9IE5VTEw7CisgIHNvdXBodHRwc2luay0+cHJveHlfaWQgPSBOVUxMOworICBzb3VwaHR0cHNpbmstPnByb3h5X3B3ID0gTlVMTDsKKyAgc291cGh0dHBzaW5rLT5wcm9wX3Nlc3Npb24gPSBOVUxMOworICBzb3VwaHR0cHNpbmstPnRpbWVvdXQgPSAxOworICBzb3VwaHR0cHNpbmstPmxvZ19sZXZlbCA9IERFRkFVTFRfU09VUF9MT0dfTEVWRUw7CisgIHNvdXBodHRwc2luay0+cmV0cnlfZGVsYXkgPSA1OworICBzb3VwaHR0cHNpbmstPnJldHJpZXMgPSAwOworICBwcm94eSA9IGdfZ2V0ZW52ICgiaHR0cF9wcm94eSIpOworICBpZiAocHJveHkgJiYgIWdzdF9zb3VwX2h0dHBfY2xpZW50X3Npbmtfc2V0X3Byb3h5IChzb3VwaHR0cHNpbmssIHByb3h5KSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc291cGh0dHBzaW5rLAorICAgICAgICAiVGhlIHByb3h5IGluIHRoZSBodHRwX3Byb3h5IGVudiB2YXIgKFwiJXNcIikgY2Fubm90IGJlIHBhcnNlZC4iLAorICAgICAgICBwcm94eSk7CisgIH0KKworICBnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX3Jlc2V0IChzb3VwaHR0cHNpbmspOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19yZXNldCAoR3N0U291cEh0dHBDbGllbnRTaW5rICogc291cGh0dHBzaW5rKQoreworICBnX2xpc3RfZnJlZV9mdWxsIChzb3VwaHR0cHNpbmstPnF1ZXVlZF9idWZmZXJzLAorICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnc3RfYnVmZmVyX3VucmVmKTsKKyAgc291cGh0dHBzaW5rLT5xdWV1ZWRfYnVmZmVycyA9IE5VTEw7CisgIGdfZnJlZSAoc291cGh0dHBzaW5rLT5yZWFzb25fcGhyYXNlKTsKKyAgc291cGh0dHBzaW5rLT5yZWFzb25fcGhyYXNlID0gTlVMTDsKKyAgc291cGh0dHBzaW5rLT5zdGF0dXNfY29kZSA9IDA7CisgIHNvdXBodHRwc2luay0+b2Zmc2V0ID0gMDsKKyAgc291cGh0dHBzaW5rLT5mYWlsdXJlcyA9IDA7CisKKyAgZ19saXN0X2ZyZWVfZnVsbCAoc291cGh0dHBzaW5rLT5zdHJlYW1oZWFkZXJfYnVmZmVycywKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgIHNvdXBodHRwc2luay0+c3RyZWFtaGVhZGVyX2J1ZmZlcnMgPSBOVUxMOworICBnX2xpc3RfZnJlZV9mdWxsIChzb3VwaHR0cHNpbmstPnNlbnRfYnVmZmVycywKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgIHNvdXBodHRwc2luay0+c2VudF9idWZmZXJzID0gTlVMTDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX3NldF9wcm94eSAoR3N0U291cEh0dHBDbGllbnRTaW5rICogc291cGh0dHBzaW5rLAorICAgIGNvbnN0IGdjaGFyICogdXJpKQoreworICBpZiAoc291cGh0dHBzaW5rLT5wcm94eSkgeworICAgIHNvdXBfdXJpX2ZyZWUgKHNvdXBodHRwc2luay0+cHJveHkpOworICAgIHNvdXBodHRwc2luay0+cHJveHkgPSBOVUxMOworICB9CisgIGlmIChnX3N0cl9oYXNfcHJlZml4ICh1cmksICJodHRwOi8vIikpIHsKKyAgICBzb3VwaHR0cHNpbmstPnByb3h5ID0gc291cF91cmlfbmV3ICh1cmkpOworICB9IGVsc2UgeworICAgIGdjaGFyICpuZXdfdXJpID0gZ19zdHJjb25jYXQgKCJodHRwOi8vIiwgdXJpLCBOVUxMKTsKKworICAgIHNvdXBodHRwc2luay0+cHJveHkgPSBzb3VwX3VyaV9uZXcgKG5ld191cmkpOworICAgIGdfZnJlZSAobmV3X3VyaSk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFNvdXBIdHRwQ2xpZW50U2luayAqc291cGh0dHBzaW5rID0gR1NUX1NPVVBfSFRUUF9DTElFTlRfU0lOSyAob2JqZWN0KTsKKworICBnX211dGV4X2xvY2sgKCZzb3VwaHR0cHNpbmstPm11dGV4KTsKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkgeworICAgIGNhc2UgUFJPUF9TRVNTSU9OOgorICAgICAgaWYgKHNvdXBodHRwc2luay0+cHJvcF9zZXNzaW9uKSB7CisgICAgICAgIGdfb2JqZWN0X3VucmVmIChzb3VwaHR0cHNpbmstPnByb3Bfc2Vzc2lvbik7CisgICAgICB9CisgICAgICBzb3VwaHR0cHNpbmstPnByb3Bfc2Vzc2lvbiA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0xPQ0FUSU9OOgorICAgICAgZ19mcmVlIChzb3VwaHR0cHNpbmstPmxvY2F0aW9uKTsKKyAgICAgIHNvdXBodHRwc2luay0+bG9jYXRpb24gPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIHNvdXBodHRwc2luay0+b2Zmc2V0ID0gMDsKKyAgICAgIGlmICgoc291cGh0dHBzaW5rLT5sb2NhdGlvbiA9PSBOVUxMKQorICAgICAgICAgIHx8ICFnc3RfdXJpX2lzX3ZhbGlkIChzb3VwaHR0cHNpbmstPmxvY2F0aW9uKSkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNvdXBodHRwc2luaywKKyAgICAgICAgICAgICJUaGUgbG9jYXRpb24gKFwiJXNcIikgc2V0LCBpcyBub3QgYSB2YWxpZCB1cmkuIiwKKyAgICAgICAgICAgIHNvdXBodHRwc2luay0+bG9jYXRpb24pOworICAgICAgICBnX2ZyZWUgKHNvdXBodHRwc2luay0+bG9jYXRpb24pOworICAgICAgICBzb3VwaHR0cHNpbmstPmxvY2F0aW9uID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VSX0FHRU5UOgorICAgICAgZ19mcmVlIChzb3VwaHR0cHNpbmstPnVzZXJfYWdlbnQpOworICAgICAgc291cGh0dHBzaW5rLT51c2VyX2FnZW50ID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQVVUT01BVElDX1JFRElSRUNUOgorICAgICAgc291cGh0dHBzaW5rLT5hdXRvbWF0aWNfcmVkaXJlY3QgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFUl9JRDoKKyAgICAgIGdfZnJlZSAoc291cGh0dHBzaW5rLT51c2VyX2lkKTsKKyAgICAgIHNvdXBodHRwc2luay0+dXNlcl9pZCA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VTRVJfUFc6CisgICAgICBnX2ZyZWUgKHNvdXBodHRwc2luay0+dXNlcl9wdyk7CisgICAgICBzb3VwaHR0cHNpbmstPnVzZXJfcHcgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9YWV9JRDoKKyAgICAgIGdfZnJlZSAoc291cGh0dHBzaW5rLT5wcm94eV9pZCk7CisgICAgICBzb3VwaHR0cHNpbmstPnByb3h5X2lkID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUFJPWFlfUFc6CisgICAgICBnX2ZyZWUgKHNvdXBodHRwc2luay0+cHJveHlfcHcpOworICAgICAgc291cGh0dHBzaW5rLT5wcm94eV9wdyA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BST1hZOgorICAgIHsKKyAgICAgIGNvbnN0IGdjaGFyICpwcm94eTsKKworICAgICAgcHJveHkgPSBnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKTsKKworICAgICAgaWYgKHByb3h5ID09IE5VTEwpIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJwcm94eSBwcm9wZXJ0eSBjYW5ub3QgYmUgTlVMTCIpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisgICAgICBpZiAoIWdzdF9zb3VwX2h0dHBfY2xpZW50X3Npbmtfc2V0X3Byb3h5IChzb3VwaHR0cHNpbmssIHByb3h5KSkgeworICAgICAgICBHU1RfV0FSTklORyAoImJhZGx5IGZvcm1hdHRlZCBwcm94eSBVUkkiKTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9DT09LSUVTOgorICAgICAgZ19zdHJmcmVldiAoc291cGh0dHBzaW5rLT5jb29raWVzKTsKKyAgICAgIHNvdXBodHRwc2luay0+Y29va2llcyA9IGdfc3RyZHVwdiAoZ192YWx1ZV9nZXRfYm94ZWQgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU09VUF9MT0dfTEVWRUw6CisgICAgICBzb3VwaHR0cHNpbmstPmxvZ19sZXZlbCA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRVRSWV9ERUxBWToKKyAgICAgIHNvdXBodHRwc2luay0+cmV0cnlfZGVsYXkgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRVRSSUVTOgorICAgICAgc291cGh0dHBzaW5rLT5yZXRyaWVzID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorZG9uZToKKyAgZ19tdXRleF91bmxvY2sgKCZzb3VwaHR0cHNpbmstPm11dGV4KTsKK30KKwordm9pZAorZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFNvdXBIdHRwQ2xpZW50U2luayAqc291cGh0dHBzaW5rID0gR1NUX1NPVVBfSFRUUF9DTElFTlRfU0lOSyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKSB7CisgICAgY2FzZSBQUk9QX1NFU1NJT046CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBzb3VwaHR0cHNpbmstPnByb3Bfc2Vzc2lvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTE9DQVRJT046CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzb3VwaHR0cHNpbmstPmxvY2F0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9BVVRPTUFUSUNfUkVESVJFQ1Q6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgc291cGh0dHBzaW5rLT5hdXRvbWF0aWNfcmVkaXJlY3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VTRVJfQUdFTlQ6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzb3VwaHR0cHNpbmstPnVzZXJfYWdlbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VTRVJfSUQ6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzb3VwaHR0cHNpbmstPnVzZXJfaWQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VTRVJfUFc6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzb3VwaHR0cHNpbmstPnVzZXJfcHcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BST1hZX0lEOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc291cGh0dHBzaW5rLT5wcm94eV9pZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUFJPWFlfUFc6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzb3VwaHR0cHNpbmstPnByb3h5X3B3KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9YWToKKyAgICAgIGlmIChzb3VwaHR0cHNpbmstPnByb3h5ID09IE5VTEwpCisgICAgICAgIGdfdmFsdWVfc2V0X3N0YXRpY19zdHJpbmcgKHZhbHVlLCAiIik7CisgICAgICBlbHNlIHsKKyAgICAgICAgY2hhciAqcHJveHkgPSBzb3VwX3VyaV90b19zdHJpbmcgKHNvdXBodHRwc2luay0+cHJveHksIEZBTFNFKTsKKworICAgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBwcm94eSk7CisgICAgICAgIGdfZnJlZSAocHJveHkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NPT0tJRVM6CisgICAgICBnX3ZhbHVlX3NldF9ib3hlZCAodmFsdWUsIGdfc3RyZHVwdiAoc291cGh0dHBzaW5rLT5jb29raWVzKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU09VUF9MT0dfTEVWRUw6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgc291cGh0dHBzaW5rLT5sb2dfbGV2ZWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JFVFJZX0RFTEFZOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgc291cGh0dHBzaW5rLT5yZXRyeV9kZWxheSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVUUklFUzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHNvdXBodHRwc2luay0+cmV0cmllcyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkCitnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFNvdXBIdHRwQ2xpZW50U2luayAqc291cGh0dHBzaW5rID0gR1NUX1NPVVBfSFRUUF9DTElFTlRfU0lOSyAob2JqZWN0KTsKKworICAvKiBjbGVhbiB1cCBhcyBwb3NzaWJsZS4gIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgKi8KKyAgaWYgKHNvdXBodHRwc2luay0+cHJvcF9zZXNzaW9uKQorICAgIGdfb2JqZWN0X3VucmVmIChzb3VwaHR0cHNpbmstPnByb3Bfc2Vzc2lvbik7CisgIHNvdXBodHRwc2luay0+cHJvcF9zZXNzaW9uID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKwordm9pZAorZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0U291cEh0dHBDbGllbnRTaW5rICpzb3VwaHR0cHNpbmsgPSBHU1RfU09VUF9IVFRQX0NMSUVOVF9TSU5LIChvYmplY3QpOworCisgIC8qIGNsZWFuIHVwIG9iamVjdCBoZXJlICovCisKKyAgZ19mcmVlIChzb3VwaHR0cHNpbmstPnVzZXJfYWdlbnQpOworICBnX2ZyZWUgKHNvdXBodHRwc2luay0+dXNlcl9pZCk7CisgIGdfZnJlZSAoc291cGh0dHBzaW5rLT51c2VyX3B3KTsKKyAgZ19mcmVlIChzb3VwaHR0cHNpbmstPnByb3h5X2lkKTsKKyAgZ19mcmVlIChzb3VwaHR0cHNpbmstPnByb3h5X3B3KTsKKyAgaWYgKHNvdXBodHRwc2luay0+cHJveHkpCisgICAgc291cF91cmlfZnJlZSAoc291cGh0dHBzaW5rLT5wcm94eSk7CisgIGdfZnJlZSAoc291cGh0dHBzaW5rLT5sb2NhdGlvbik7CisgIGdfc3RyZnJlZXYgKHNvdXBodHRwc2luay0+Y29va2llcyk7CisKKyAgZ19jb25kX2NsZWFyICgmc291cGh0dHBzaW5rLT5jb25kKTsKKyAgZ19tdXRleF9jbGVhciAoJnNvdXBodHRwc2luay0+bXV0ZXgpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19zZXRfY2FwcyAoR3N0QmFzZVNpbmsgKiBzaW5rLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U291cEh0dHBDbGllbnRTaW5rICpzb3VwaHR0cHNpbmsgPSBHU1RfU09VUF9IVFRQX0NMSUVOVF9TSU5LIChzaW5rKTsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGNvbnN0IEdWYWx1ZSAqdmFsdWVfYXJyYXk7CisgIGludCBpLCBuOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNvdXBodHRwc2luaywgIm5ldyBzdHJlYW0gaGVhZGVycyBzZXQiKTsKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIHZhbHVlX2FycmF5ID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgInN0cmVhbWhlYWRlciIpOworICBpZiAodmFsdWVfYXJyYXkpIHsKKyAgICBnX2xpc3RfZnJlZV9mdWxsIChzb3VwaHR0cHNpbmstPnN0cmVhbWhlYWRlcl9idWZmZXJzLAorICAgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9idWZmZXJfdW5yZWYpOworICAgIHNvdXBodHRwc2luay0+c3RyZWFtaGVhZGVyX2J1ZmZlcnMgPSBOVUxMOworCisgICAgbiA9IGdzdF92YWx1ZV9hcnJheV9nZXRfc2l6ZSAodmFsdWVfYXJyYXkpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWU7CisgICAgICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgICAgIHZhbHVlID0gZ3N0X3ZhbHVlX2FycmF5X2dldF92YWx1ZSAodmFsdWVfYXJyYXksIGkpOworICAgICAgYnVmZmVyID0gR1NUX0JVRkZFUiAoZ3N0X3ZhbHVlX2dldF9idWZmZXIgKHZhbHVlKSk7CisgICAgICBzb3VwaHR0cHNpbmstPnN0cmVhbWhlYWRlcl9idWZmZXJzID0KKyAgICAgICAgICBnX2xpc3RfYXBwZW5kIChzb3VwaHR0cHNpbmstPnN0cmVhbWhlYWRlcl9idWZmZXJzLAorICAgICAgICAgIGdzdF9idWZmZXJfcmVmIChidWZmZXIpKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfZ2V0X3RpbWVzIChHc3RCYXNlU2luayAqIHNpbmssIEdzdEJ1ZmZlciAqIGJ1ZmZlciwKKyAgICBHc3RDbG9ja1RpbWUgKiBzdGFydCwgR3N0Q2xvY2tUaW1lICogZW5kKQoreworCit9CisKK3N0YXRpYyBnYm9vbGVhbgordGhyZWFkX3JlYWR5X2lkbGVfY2IgKGdwb2ludGVyIGRhdGEpCit7CisgIEdzdFNvdXBIdHRwQ2xpZW50U2luayAqc291cGh0dHBzaW5rID0gR1NUX1NPVVBfSFRUUF9DTElFTlRfU0lOSyAoZGF0YSk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNvdXBodHRwc2luaywgInRocmVhZCByZWFkeSIpOworCisgIGdfbXV0ZXhfbG9jayAoJnNvdXBodHRwc2luay0+bXV0ZXgpOworICBnX2NvbmRfc2lnbmFsICgmc291cGh0dHBzaW5rLT5jb25kKTsKKyAgZ19tdXRleF91bmxvY2sgKCZzb3VwaHR0cHNpbmstPm11dGV4KTsKKworICByZXR1cm4gRkFMU0U7ICAgICAgICAgICAgICAgICAvKiBvbmx5IHJ1biBvbmNlICovCit9CisKK3N0YXRpYyBncG9pbnRlcgordGhyZWFkX2Z1bmMgKGdwb2ludGVyIHB0cikKK3sKKyAgR3N0U291cEh0dHBDbGllbnRTaW5rICpzb3VwaHR0cHNpbmsgPSBHU1RfU09VUF9IVFRQX0NMSUVOVF9TSU5LIChwdHIpOworCisgIEdTVF9ERUJVRyAoInRocmVhZCBzdGFydCIpOworCisgIGdfbWFpbl9sb29wX3J1biAoc291cGh0dHBzaW5rLT5sb29wKTsKKworICBHU1RfREVCVUcgKCJ0aHJlYWQgcXVpdCIpOworCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zb3VwX2h0dHBfY2xpZW50X3Npbmtfc3RhcnQgKEdzdEJhc2VTaW5rICogc2luaykKK3sKKyAgR3N0U291cEh0dHBDbGllbnRTaW5rICpzb3VwaHR0cHNpbmsgPSBHU1RfU09VUF9IVFRQX0NMSUVOVF9TSU5LIChzaW5rKTsKKworICBpZiAoc291cGh0dHBzaW5rLT5wcm9wX3Nlc3Npb24pIHsKKyAgICBzb3VwaHR0cHNpbmstPnNlc3Npb24gPSBzb3VwaHR0cHNpbmstPnByb3Bfc2Vzc2lvbjsKKyAgfSBlbHNlIHsKKyAgICBHU291cmNlICpzb3VyY2U7CisgICAgR0Vycm9yICplcnJvciA9IE5VTEw7CisKKyAgICBzb3VwaHR0cHNpbmstPmNvbnRleHQgPSBnX21haW5fY29udGV4dF9uZXcgKCk7CisKKyAgICAvKiBzZXQgdXAgaWRsZSBzb3VyY2UgdG8gc2lnbmFsIHdoZW4gdGhlIG1haW4gbG9vcCBpcyBydW5uaW5nIGFuZAorICAgICAqIGl0J3Mgc2FmZSBmb3IgOjpzdG9wKCkgdG8gY2FsbCBnX21haW5fbG9vcF9xdWl0KCkgKi8KKyAgICBzb3VyY2UgPSBnX2lkbGVfc291cmNlX25ldyAoKTsKKyAgICBnX3NvdXJjZV9zZXRfY2FsbGJhY2sgKHNvdXJjZSwgdGhyZWFkX3JlYWR5X2lkbGVfY2IsIHNpbmssIE5VTEwpOworICAgIGdfc291cmNlX2F0dGFjaCAoc291cmNlLCBzb3VwaHR0cHNpbmstPmNvbnRleHQpOworICAgIGdfc291cmNlX3VucmVmIChzb3VyY2UpOworCisgICAgc291cGh0dHBzaW5rLT5sb29wID0gZ19tYWluX2xvb3BfbmV3IChzb3VwaHR0cHNpbmstPmNvbnRleHQsIFRSVUUpOworCisgICAgZ19tdXRleF9sb2NrICgmc291cGh0dHBzaW5rLT5tdXRleCk7CisKKyAgICBzb3VwaHR0cHNpbmstPnRocmVhZCA9IGdfdGhyZWFkX3RyeV9uZXcgKCJzb3VwaHR0cGNsaWVudHNpbmstdGhyZWFkIiwKKyAgICAgICAgdGhyZWFkX2Z1bmMsIHNvdXBodHRwc2luaywgJmVycm9yKTsKKworICAgIGlmIChlcnJvciAhPSBOVUxMKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzb3VwaHR0cHNpbmssICJmYWlsZWQgdG8gc3RhcnQgdGhyZWFkLCAlcyIsCisgICAgICAgICAgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICBnX211dGV4X3VubG9jayAoJnNvdXBodHRwc2luay0+bXV0ZXgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIEdTVF9MT0dfT0JKRUNUIChzb3VwaHR0cHNpbmssICJ3YWl0aW5nIGZvciBtYWluIGxvb3AgdGhyZWFkIHRvIHN0YXJ0IHVwIik7CisgICAgZ19jb25kX3dhaXQgKCZzb3VwaHR0cHNpbmstPmNvbmQsICZzb3VwaHR0cHNpbmstPm11dGV4KTsKKyAgICBnX211dGV4X3VubG9jayAoJnNvdXBodHRwc2luay0+bXV0ZXgpOworICAgIEdTVF9MT0dfT0JKRUNUIChzb3VwaHR0cHNpbmssICJtYWluIGxvb3AgdGhyZWFkIHJ1bm5pbmciKTsKKworICAgIGlmIChzb3VwaHR0cHNpbmstPnByb3h5ID09IE5VTEwpIHsKKyAgICAgIHNvdXBodHRwc2luay0+c2Vzc2lvbiA9CisgICAgICAgICAgc291cF9zZXNzaW9uX2FzeW5jX25ld193aXRoX29wdGlvbnMgKFNPVVBfU0VTU0lPTl9BU1lOQ19DT05URVhULAorICAgICAgICAgIHNvdXBodHRwc2luay0+Y29udGV4dCwgU09VUF9TRVNTSU9OX1VTRVJfQUdFTlQsCisgICAgICAgICAgc291cGh0dHBzaW5rLT51c2VyX2FnZW50LCBTT1VQX1NFU1NJT05fVElNRU9VVCwgc291cGh0dHBzaW5rLT50aW1lb3V0LAorICAgICAgICAgIFNPVVBfU0VTU0lPTl9BRERfRkVBVFVSRV9CWV9UWVBFLCBTT1VQX1RZUEVfUFJPWFlfUkVTT0xWRVJfREVGQVVMVCwKKyAgICAgICAgICBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgc291cGh0dHBzaW5rLT5zZXNzaW9uID0KKyAgICAgICAgICBzb3VwX3Nlc3Npb25fYXN5bmNfbmV3X3dpdGhfb3B0aW9ucyAoU09VUF9TRVNTSU9OX0FTWU5DX0NPTlRFWFQsCisgICAgICAgICAgc291cGh0dHBzaW5rLT5jb250ZXh0LCBTT1VQX1NFU1NJT05fVVNFUl9BR0VOVCwKKyAgICAgICAgICBzb3VwaHR0cHNpbmstPnVzZXJfYWdlbnQsIFNPVVBfU0VTU0lPTl9USU1FT1VULCBzb3VwaHR0cHNpbmstPnRpbWVvdXQsCisgICAgICAgICAgU09VUF9TRVNTSU9OX1BST1hZX1VSSSwgc291cGh0dHBzaW5rLT5wcm94eSwgTlVMTCk7CisgICAgfQorCisgICAgZ19zaWduYWxfY29ubmVjdCAoc291cGh0dHBzaW5rLT5zZXNzaW9uLCAiYXV0aGVudGljYXRlIiwKKyAgICAgICAgR19DQUxMQkFDSyAoYXV0aGVudGljYXRlKSwgc291cGh0dHBzaW5rKTsKKyAgfQorCisgIC8qIFNldCB1cCBsb2dnaW5nICovCisgIGdzdF9zb3VwX3V0aWxfbG9nX3NldHVwIChzb3VwaHR0cHNpbmstPnNlc3Npb24sIHNvdXBodHRwc2luay0+bG9nX2xldmVsLAorICAgICAgR1NUX0VMRU1FTlQgKHNvdXBodHRwc2luaykpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zb3VwX2h0dHBfY2xpZW50X3Npbmtfc3RvcCAoR3N0QmFzZVNpbmsgKiBzaW5rKQoreworICBHc3RTb3VwSHR0cENsaWVudFNpbmsgKnNvdXBodHRwc2luayA9IEdTVF9TT1VQX0hUVFBfQ0xJRU5UX1NJTksgKHNpbmspOworCisgIEdTVF9ERUJVRyAoInN0b3AiKTsKKworICBpZiAoc291cGh0dHBzaW5rLT5wcm9wX3Nlc3Npb24gPT0gTlVMTCkgeworICAgIHNvdXBfc2Vzc2lvbl9hYm9ydCAoc291cGh0dHBzaW5rLT5zZXNzaW9uKTsKKyAgICBnX29iamVjdF91bnJlZiAoc291cGh0dHBzaW5rLT5zZXNzaW9uKTsKKyAgfQorCisgIGdfbXV0ZXhfbG9jayAoJnNvdXBodHRwc2luay0+bXV0ZXgpOworICBpZiAoc291cGh0dHBzaW5rLT50aW1lcikgeworICAgIGdfc291cmNlX2Rlc3Ryb3kgKHNvdXBodHRwc2luay0+dGltZXIpOworICAgIGdfc291cmNlX3VucmVmIChzb3VwaHR0cHNpbmstPnRpbWVyKTsKKyAgICBzb3VwaHR0cHNpbmstPnRpbWVyID0gTlVMTDsKKyAgfQorICBnX211dGV4X3VubG9jayAoJnNvdXBodHRwc2luay0+bXV0ZXgpOworCisgIGlmIChzb3VwaHR0cHNpbmstPmxvb3ApIHsKKyAgICBnX21haW5fbG9vcF9xdWl0IChzb3VwaHR0cHNpbmstPmxvb3ApOworICAgIGdfbXV0ZXhfbG9jayAoJnNvdXBodHRwc2luay0+bXV0ZXgpOworICAgIGdfY29uZF9zaWduYWwgKCZzb3VwaHR0cHNpbmstPmNvbmQpOworICAgIGdfbXV0ZXhfdW5sb2NrICgmc291cGh0dHBzaW5rLT5tdXRleCk7CisgICAgZ190aHJlYWRfam9pbiAoc291cGh0dHBzaW5rLT50aHJlYWQpOworICAgIGdfbWFpbl9sb29wX3VucmVmIChzb3VwaHR0cHNpbmstPmxvb3ApOworICAgIHNvdXBodHRwc2luay0+bG9vcCA9IE5VTEw7CisgIH0KKyAgaWYgKHNvdXBodHRwc2luay0+Y29udGV4dCkgeworICAgIGdfbWFpbl9jb250ZXh0X3VucmVmIChzb3VwaHR0cHNpbmstPmNvbnRleHQpOworICAgIHNvdXBodHRwc2luay0+Y29udGV4dCA9IE5VTEw7CisgIH0KKworICBnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX3Jlc2V0IChzb3VwaHR0cHNpbmspOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfdW5sb2NrIChHc3RCYXNlU2luayAqIHNpbmspCit7CisgIEdTVF9ERUJVRyAoInVubG9jayIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfZXZlbnQgKEdzdEJhc2VTaW5rICogc2luaywgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0U291cEh0dHBDbGllbnRTaW5rICpzb3VwaHR0cHNpbmsgPSBHU1RfU09VUF9IVFRQX0NMSUVOVF9TSU5LIChzaW5rKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzb3VwaHR0cHNpbmssICJldmVudCIpOworCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID09IEdTVF9FVkVOVF9FT1MpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzb3VwaHR0cHNpbmssICJnb3QgZW9zIik7CisgICAgZ19tdXRleF9sb2NrICgmc291cGh0dHBzaW5rLT5tdXRleCk7CisgICAgd2hpbGUgKHNvdXBodHRwc2luay0+bWVzc2FnZSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc291cGh0dHBzaW5rLCAid2FpdGluZyIpOworICAgICAgZ19jb25kX3dhaXQgKCZzb3VwaHR0cHNpbmstPmNvbmQsICZzb3VwaHR0cHNpbmstPm11dGV4KTsKKyAgICB9CisgICAgZ19tdXRleF91bmxvY2sgKCZzb3VwaHR0cHNpbmstPm11dGV4KTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzb3VwaHR0cHNpbmssICJmaW5pc2hlZCBlb3MiKTsKKyAgfQorCisgIHJldHVybiBHU1RfQkFTRV9TSU5LX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5ldmVudCAoc2luaywgZXZlbnQpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19wcmVyb2xsIChHc3RCYXNlU2luayAqIHNpbmssIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR1NUX0RFQlVHICgicHJlcm9sbCIpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfbWVzc2FnZV9sb2NrZWQgKEdzdFNvdXBIdHRwQ2xpZW50U2luayAqIHNvdXBodHRwc2luaykKK3sKKyAgR0xpc3QgKmc7CisgIGd1aW50NjQgbjsKKworICBpZiAoc291cGh0dHBzaW5rLT5xdWV1ZWRfYnVmZmVycyA9PSBOVUxMIHx8IHNvdXBodHRwc2luay0+bWVzc2FnZSkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8qIElmIHRoZSBVUkkgd2VudCBhd2F5LCBkcm9wIGFsbCB0aGVzZSBidWZmZXJzICovCisgIGlmIChzb3VwaHR0cHNpbmstPmxvY2F0aW9uID09IE5VTEwpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzb3VwaHR0cHNpbmssICJVUkkgd2VudCBhd2F5LCBkcm9wcGluZyBxdWV1ZWQgYnVmZmVycyIpOworICAgIGdfbGlzdF9mcmVlX2Z1bGwgKHNvdXBodHRwc2luay0+cXVldWVkX2J1ZmZlcnMsCisgICAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgICAgc291cGh0dHBzaW5rLT5xdWV1ZWRfYnVmZmVycyA9IE5VTEw7CisgICAgcmV0dXJuOworICB9CisKKyAgc291cGh0dHBzaW5rLT5tZXNzYWdlID0gc291cF9tZXNzYWdlX25ldyAoIlBVVCIsIHNvdXBodHRwc2luay0+bG9jYXRpb24pOworICBpZiAoc291cGh0dHBzaW5rLT5tZXNzYWdlID09IE5VTEwpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNvdXBodHRwc2luaywKKyAgICAgICAgIlVSSSBjb3VsZCBub3QgYmUgcGFyc2VkIHdoaWxlIGNyZWF0aW5nIG1lc3NhZ2UuIik7CisgICAgZ19saXN0X2ZyZWVfZnVsbCAoc291cGh0dHBzaW5rLT5xdWV1ZWRfYnVmZmVycywKKyAgICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnc3RfYnVmZmVyX3VucmVmKTsKKyAgICBzb3VwaHR0cHNpbmstPnF1ZXVlZF9idWZmZXJzID0gTlVMTDsKKyAgICByZXR1cm47CisgIH0KKworICBzb3VwX21lc3NhZ2Vfc2V0X2ZsYWdzIChzb3VwaHR0cHNpbmstPm1lc3NhZ2UsCisgICAgICAoc291cGh0dHBzaW5rLT5hdXRvbWF0aWNfcmVkaXJlY3QgPyAwIDogU09VUF9NRVNTQUdFX05PX1JFRElSRUNUKSk7CisKKyAgaWYgKHNvdXBodHRwc2luay0+Y29va2llcykgeworICAgIGdjaGFyICoqY29va2llOworCisgICAgZm9yIChjb29raWUgPSBzb3VwaHR0cHNpbmstPmNvb2tpZXM7ICpjb29raWUgIT0gTlVMTDsgY29va2llKyspIHsKKyAgICAgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2FwcGVuZCAoc291cGh0dHBzaW5rLT5tZXNzYWdlLT5yZXF1ZXN0X2hlYWRlcnMsCisgICAgICAgICAgIkNvb2tpZSIsICpjb29raWUpOworICAgIH0KKyAgfQorCisgIG4gPSAwOworICBpZiAoc291cGh0dHBzaW5rLT5vZmZzZXQgPT0gMCkgeworICAgIGZvciAoZyA9IHNvdXBodHRwc2luay0+c3RyZWFtaGVhZGVyX2J1ZmZlcnM7IGc7IGcgPSBnX2xpc3RfbmV4dCAoZykpIHsKKyAgICAgIEdzdEJ1ZmZlciAqYnVmZmVyID0gZy0+ZGF0YTsKKyAgICAgIEdzdE1hcEluZm8gbWFwOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzb3VwaHR0cHNpbmssICJxdWV1ZWluZyBzdHJlYW0gaGVhZGVycyIpOworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgIC8qIFN0cmVhbSBoZWFkZXJzIGFyZSB1cGRhdGVkIHdoZW5ldmVyIDo6c2V0X2NhcHMgaXMgY2FsbGVkLCBzbyB0aGVyZSdzCisgICAgICAgKiBubyBndWFyYW50ZWVzIGFib3V0IHRoZWlyIGxpZmV0aW1lIGFuZCB3ZSBhc2sgbGlic291cCB0byBjb3B5IHRoZW0gCisgICAgICAgKiBpbnRvIHRoZSBtZXNzYWdlIGJvZHkgd2l0aCBTT1VQX01FTU9SWV9DT1BZLiAqLworICAgICAgc291cF9tZXNzYWdlX2JvZHlfYXBwZW5kIChzb3VwaHR0cHNpbmstPm1lc3NhZ2UtPnJlcXVlc3RfYm9keSwKKyAgICAgICAgICBTT1VQX01FTU9SWV9DT1BZLCBtYXAuZGF0YSwgbWFwLnNpemUpOworICAgICAgbiArPSBtYXAuc2l6ZTsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgfQorICB9CisKKyAgZm9yIChnID0gc291cGh0dHBzaW5rLT5xdWV1ZWRfYnVmZmVyczsgZzsgZyA9IGdfbGlzdF9uZXh0IChnKSkgeworICAgIEdzdEJ1ZmZlciAqYnVmZmVyID0gZy0+ZGF0YTsKKyAgICBpZiAoIUdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0hFQURFUikpIHsKKyAgICAgIEdzdE1hcEluZm8gbWFwOworCisgICAgICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgLyogUXVldWVkIGJ1ZmZlcnMgYXJlIG9ubHkgZnJlZWQgaW4gdGhlIG5leHQgaXRlcmF0aW9uIG9mIHRoZSBtYWlubG9vcAorICAgICAgICogYWZ0ZXIgdGhlIG1lc3NhZ2UgYm9keSBoYXMgYmVlbiB3cml0dGVuIG91dCwgc28gd2UgZG9uJ3QgbmVlZCBsaWJzb3VwCisgICAgICAgKiB0byBjb3B5IHRob3NlIHdoaWxlIGFwcGVuZGluZyB0byB0aGUgYm9keS4gSG93ZXZlciwgaWYgdGhlIGJ1ZmZlciBpcworICAgICAgICogdXNlZCBlbHNld2hlcmUsIGl0IHNob3VsZCBiZSBjb3BpZWQuIEhlbmNlLCBTT1VQX01FTU9SWV9URU1QT1JBUlkuICovCisgICAgICBzb3VwX21lc3NhZ2VfYm9keV9hcHBlbmQgKHNvdXBodHRwc2luay0+bWVzc2FnZS0+cmVxdWVzdF9ib2R5LAorICAgICAgICAgIFNPVVBfTUVNT1JZX1RFTVBPUkFSWSwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICAgIG4gKz0gbWFwLnNpemU7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgIH0KKyAgfQorCisgIGlmIChzb3VwaHR0cHNpbmstPm9mZnNldCAhPSAwKSB7CisgICAgY2hhciAqczsKKyAgICBzID0gZ19zdHJkdXBfcHJpbnRmICgiYnl0ZXMgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLSUiIEdfR1VJTlQ2NF9GT1JNQVQgIi8qIiwKKyAgICAgICAgc291cGh0dHBzaW5rLT5vZmZzZXQsIHNvdXBodHRwc2luay0+b2Zmc2V0ICsgbiAtIDEpOworICAgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2FwcGVuZCAoc291cGh0dHBzaW5rLT5tZXNzYWdlLT5yZXF1ZXN0X2hlYWRlcnMsCisgICAgICAgICJDb250ZW50LVJhbmdlIiwgcyk7CisgICAgZ19mcmVlIChzKTsKKyAgfQorCisgIGlmIChuID09IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzb3VwaHR0cHNpbmssCisgICAgICAgICJ0b3RhbCBzaXplIG9mIGJ1ZmZlcnMgcXVldWVkIGlzIDAsIGZyZWVpbmcgZXZlcnl0aGluZyIpOworICAgIGdfbGlzdF9mcmVlX2Z1bGwgKHNvdXBodHRwc2luay0+cXVldWVkX2J1ZmZlcnMsCisgICAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgICAgc291cGh0dHBzaW5rLT5xdWV1ZWRfYnVmZmVycyA9IE5VTEw7CisgICAgZ19vYmplY3RfdW5yZWYgKHNvdXBodHRwc2luay0+bWVzc2FnZSk7CisgICAgc291cGh0dHBzaW5rLT5tZXNzYWdlID0gTlVMTDsKKyAgICByZXR1cm47CisgIH0KKworICBzb3VwaHR0cHNpbmstPnNlbnRfYnVmZmVycyA9IHNvdXBodHRwc2luay0+cXVldWVkX2J1ZmZlcnM7CisgIHNvdXBodHRwc2luay0+cXVldWVkX2J1ZmZlcnMgPSBOVUxMOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNvdXBodHRwc2luaywKKyAgICAgICJxdWV1ZSBtZXNzYWdlICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgc291cGh0dHBzaW5rLT5vZmZzZXQsIG4pOworICBzb3VwX3Nlc3Npb25fcXVldWVfbWVzc2FnZSAoc291cGh0dHBzaW5rLT5zZXNzaW9uLCBzb3VwaHR0cHNpbmstPm1lc3NhZ2UsCisgICAgICBjYWxsYmFjaywgc291cGh0dHBzaW5rKTsKKworICBzb3VwaHR0cHNpbmstPm9mZnNldCArPSBuOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3NlbmRfbWVzc2FnZSAoR3N0U291cEh0dHBDbGllbnRTaW5rICogc291cGh0dHBzaW5rKQoreworICBnX211dGV4X2xvY2sgKCZzb3VwaHR0cHNpbmstPm11dGV4KTsKKyAgc2VuZF9tZXNzYWdlX2xvY2tlZCAoc291cGh0dHBzaW5rKTsKKyAgaWYgKHNvdXBodHRwc2luay0+dGltZXIpIHsKKyAgICBnX3NvdXJjZV9kZXN0cm95IChzb3VwaHR0cHNpbmstPnRpbWVyKTsKKyAgICBnX3NvdXJjZV91bnJlZiAoc291cGh0dHBzaW5rLT50aW1lcik7CisgICAgc291cGh0dHBzaW5rLT50aW1lciA9IE5VTEw7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZzb3VwaHR0cHNpbmstPm11dGV4KTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitjYWxsYmFjayAoU291cFNlc3Npb24gKiBzZXNzaW9uLCBTb3VwTWVzc2FnZSAqIG1zZywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RTb3VwSHR0cENsaWVudFNpbmsgKnNvdXBodHRwc2luayA9IEdTVF9TT1VQX0hUVFBfQ0xJRU5UX1NJTksgKHVzZXJfZGF0YSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc291cGh0dHBzaW5rLCAiY2FsbGJhY2sgc3RhdHVzPSVkICVzIiwKKyAgICAgIG1zZy0+c3RhdHVzX2NvZGUsIG1zZy0+cmVhc29uX3BocmFzZSk7CisKKyAgZ19tdXRleF9sb2NrICgmc291cGh0dHBzaW5rLT5tdXRleCk7CisgIGdfY29uZF9zaWduYWwgKCZzb3VwaHR0cHNpbmstPmNvbmQpOworICBzb3VwaHR0cHNpbmstPm1lc3NhZ2UgPSBOVUxMOworCisgIGlmICghU09VUF9TVEFUVVNfSVNfU1VDQ0VTU0ZVTCAobXNnLT5zdGF0dXNfY29kZSkpIHsKKyAgICBzb3VwaHR0cHNpbmstPmZhaWx1cmVzKys7CisgICAgaWYgKHNvdXBodHRwc2luay0+cmV0cmllcyAmJgorICAgICAgICAoc291cGh0dHBzaW5rLT5yZXRyaWVzIDwgMCB8fAorICAgICAgICAgICAgc291cGh0dHBzaW5rLT5yZXRyaWVzID49IHNvdXBodHRwc2luay0+ZmFpbHVyZXMpKSB7CisgICAgICBndWludDY0IHJldHJ5X2RlbGF5OworICAgICAgY29uc3QgY2hhciAqcmV0cnlfYWZ0ZXIgPQorICAgICAgICAgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2dldF9vbmUgKG1zZy0+cmVzcG9uc2VfaGVhZGVycywKKyAgICAgICAgICAiUmV0cnktQWZ0ZXIiKTsKKyAgICAgIGlmIChyZXRyeV9hZnRlcikgeworICAgICAgICBnY2hhciAqZW5kID0gTlVMTDsKKyAgICAgICAgcmV0cnlfZGVsYXkgPSBnX2FzY2lpX3N0cnRvdWxsIChyZXRyeV9hZnRlciwgJmVuZCwgMTApOworICAgICAgICBpZiAoZW5kIHx8IGVycm5vKSB7CisgICAgICAgICAgcmV0cnlfZGVsYXkgPSBzb3VwaHR0cHNpbmstPnJldHJ5X2RlbGF5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHJ5X2RlbGF5ID0gTUFYIChyZXRyeV9kZWxheSwgc291cGh0dHBzaW5rLT5yZXRyeV9kZWxheSk7CisgICAgICAgIH0KKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzb3VwaHR0cHNpbmssICJDb3VsZCBub3Qgd3JpdGUgdG8gSFRUUCBVUkk6ICIKKyAgICAgICAgICAgICJzdGF0dXM6ICVkICVzIChyZXRyeWluZyBQVVQgYWZ0ZXIgJSIgR19HSU5UNjRfRk9STUFUCisgICAgICAgICAgICAiIHNlY29uZHMgd2l0aCBSZXRyeS1BZnRlcjogJXMpIiwgbXNnLT5zdGF0dXNfY29kZSwKKyAgICAgICAgICAgIG1zZy0+cmVhc29uX3BocmFzZSwgcmV0cnlfZGVsYXksIHJldHJ5X2FmdGVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHJ5X2RlbGF5ID0gc291cGh0dHBzaW5rLT5yZXRyeV9kZWxheTsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzb3VwaHR0cHNpbmssICJDb3VsZCBub3Qgd3JpdGUgdG8gSFRUUCBVUkk6ICIKKyAgICAgICAgICAgICJzdGF0dXM6ICVkICVzIChyZXRyeWluZyBQVVQgYWZ0ZXIgJSIgR19HSU5UNjRfRk9STUFUCisgICAgICAgICAgICAiIHNlY29uZHMpIiwgbXNnLT5zdGF0dXNfY29kZSwgbXNnLT5yZWFzb25fcGhyYXNlLCByZXRyeV9kZWxheSk7CisgICAgICB9CisgICAgICBzb3VwaHR0cHNpbmstPnRpbWVyID0gZ190aW1lb3V0X3NvdXJjZV9uZXdfc2Vjb25kcyAocmV0cnlfZGVsYXkpOworICAgICAgZ19zb3VyY2Vfc2V0X2NhbGxiYWNrIChzb3VwaHR0cHNpbmstPnRpbWVyLCAoR1NvdXJjZUZ1bmMpIChzZW5kX21lc3NhZ2UpLAorICAgICAgICAgIHNvdXBodHRwc2luaywgTlVMTCk7CisgICAgICBnX3NvdXJjZV9hdHRhY2ggKHNvdXBodHRwc2luay0+dGltZXIsIHNvdXBodHRwc2luay0+Y29udGV4dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNvdXBodHRwc2luay0+c3RhdHVzX2NvZGUgPSBtc2ctPnN0YXR1c19jb2RlOworICAgICAgc291cGh0dHBzaW5rLT5yZWFzb25fcGhyYXNlID0gZ19zdHJkdXAgKG1zZy0+cmVhc29uX3BocmFzZSk7CisgICAgfQorICAgIGdfbXV0ZXhfdW5sb2NrICgmc291cGh0dHBzaW5rLT5tdXRleCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZ19saXN0X2ZyZWVfZnVsbCAoc291cGh0dHBzaW5rLT5zZW50X2J1ZmZlcnMsCisgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9idWZmZXJfdW5yZWYpOworICBzb3VwaHR0cHNpbmstPnNlbnRfYnVmZmVycyA9IE5VTEw7CisgIHNvdXBodHRwc2luay0+ZmFpbHVyZXMgPSAwOworCisgIHNlbmRfbWVzc2FnZV9sb2NrZWQgKHNvdXBodHRwc2luayk7CisgIGdfbXV0ZXhfdW5sb2NrICgmc291cGh0dHBzaW5rLT5tdXRleCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX3JlbmRlciAoR3N0QmFzZVNpbmsgKiBzaW5rLCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFNvdXBIdHRwQ2xpZW50U2luayAqc291cGh0dHBzaW5rID0gR1NUX1NPVVBfSFRUUF9DTElFTlRfU0lOSyAoc2luayk7CisgIEdTb3VyY2UgKnNvdXJjZTsKKyAgZ2Jvb2xlYW4gd2FrZTsKKworICBpZiAoc291cGh0dHBzaW5rLT5zdGF0dXNfY29kZSAhPSAwKSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNvdXBodHRwc2luaywgUkVTT1VSQ0UsIFdSSVRFLAorICAgICAgICAoIkNvdWxkIG5vdCB3cml0ZSB0byBIVFRQIFVSSSIpLAorICAgICAgICAoInN0YXR1czogJWQgJXMiLCBzb3VwaHR0cHNpbmstPnN0YXR1c19jb2RlLAorICAgICAgICAgICAgc291cGh0dHBzaW5rLT5yZWFzb25fcGhyYXNlKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgZ19tdXRleF9sb2NrICgmc291cGh0dHBzaW5rLT5tdXRleCk7CisgIGlmIChzb3VwaHR0cHNpbmstPmxvY2F0aW9uICE9IE5VTEwpIHsKKyAgICB3YWtlID0gKHNvdXBodHRwc2luay0+cXVldWVkX2J1ZmZlcnMgPT0gTlVMTCk7CisgICAgc291cGh0dHBzaW5rLT5xdWV1ZWRfYnVmZmVycyA9CisgICAgICAgIGdfbGlzdF9hcHBlbmQgKHNvdXBodHRwc2luay0+cXVldWVkX2J1ZmZlcnMsIGdzdF9idWZmZXJfcmVmIChidWZmZXIpKTsKKworICAgIGlmICh3YWtlKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzb3VwaHR0cHNpbmssICJzZXR0aW5nIGNhbGxiYWNrIGZvciBuZXcgYnVmZmVycyIpOworICAgICAgc291cmNlID0gZ19pZGxlX3NvdXJjZV9uZXcgKCk7CisgICAgICBnX3NvdXJjZV9zZXRfY2FsbGJhY2sgKHNvdXJjZSwgKEdTb3VyY2VGdW5jKSAoc2VuZF9tZXNzYWdlKSwKKyAgICAgICAgICBzb3VwaHR0cHNpbmssIE5VTEwpOworICAgICAgZ19zb3VyY2VfYXR0YWNoIChzb3VyY2UsIHNvdXBodHRwc2luay0+Y29udGV4dCk7CisgICAgICBnX3NvdXJjZV91bnJlZiAoc291cmNlKTsKKyAgICB9CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZzb3VwaHR0cHNpbmstPm11dGV4KTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyB2b2lkCithdXRoZW50aWNhdGUgKFNvdXBTZXNzaW9uICogc2Vzc2lvbiwgU291cE1lc3NhZ2UgKiBtc2csCisgICAgU291cEF1dGggKiBhdXRoLCBnYm9vbGVhbiByZXRyeWluZywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RTb3VwSHR0cENsaWVudFNpbmsgKnNvdXBodHRwc2luayA9IEdTVF9TT1VQX0hUVFBfQ0xJRU5UX1NJTksgKHVzZXJfZGF0YSk7CisKKyAgaWYgKCFyZXRyeWluZykgeworICAgIC8qIEZpcnN0IHRpbWUgYXV0aGVudGljYXRpb24gb25seSwgaWYgd2UgZmFpbCBhbmQgYXJlIGNhbGxlZCBhZ2FpbiB3aXRoIHJldHJ5IHRydWUgZmFsbCB0aHJvdWdoICovCisgICAgaWYgKG1zZy0+c3RhdHVzX2NvZGUgPT0gU09VUF9TVEFUVVNfVU5BVVRIT1JJWkVEKSB7CisgICAgICBpZiAoc291cGh0dHBzaW5rLT51c2VyX2lkICYmIHNvdXBodHRwc2luay0+dXNlcl9wdykKKyAgICAgICAgc291cF9hdXRoX2F1dGhlbnRpY2F0ZSAoYXV0aCwgc291cGh0dHBzaW5rLT51c2VyX2lkLAorICAgICAgICAgICAgc291cGh0dHBzaW5rLT51c2VyX3B3KTsKKyAgICB9IGVsc2UgaWYgKG1zZy0+c3RhdHVzX2NvZGUgPT0gU09VUF9TVEFUVVNfUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQpIHsKKyAgICAgIGlmIChzb3VwaHR0cHNpbmstPnByb3h5X2lkICYmIHNvdXBodHRwc2luay0+cHJveHlfcHcpCisgICAgICAgIHNvdXBfYXV0aF9hdXRoZW50aWNhdGUgKGF1dGgsIHNvdXBodHRwc2luay0+cHJveHlfaWQsCisgICAgICAgICAgICBzb3VwaHR0cHNpbmstPnByb3h5X3B3KTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5oIGIvZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljNDUwMAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5oCkBAIC0wLDAgKzEsODUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDExIERhdmlkIFNjaGxlZWYgPGRzQGVudHJvcHl3YXZlLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9HU1RfU09VUF9IVFRQX0NMSUVOVF9TSU5LX0hfCisjZGVmaW5lIF9HU1RfU09VUF9IVFRQX0NMSUVOVF9TSU5LX0hfCisKKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNlc2luay5oPgorI2luY2x1ZGUgPGxpYnNvdXAvc291cC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfU09VUF9IVFRQX0NMSUVOVF9TSU5LICAgICAgICAgICAoZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfU09VUF9IVFRQX0NMSUVOVF9TSU5LKG9iaikgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9TT1VQX0hUVFBfQ0xJRU5UX1NJTkssR3N0U291cEh0dHBDbGllbnRTaW5rKSkKKyNkZWZpbmUgR1NUX1NPVVBfSFRUUF9DTElFTlRfU0lOS19DTEFTUyhrbGFzcykgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9TT1VQX0hUVFBfQ0xJRU5UX1NJTkssR3N0U291cEh0dHBDbGllbnRTaW5rQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfU09VUF9IVFRQX0NMSUVOVF9TSU5LKG9iaikgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9TT1VQX0hUVFBfQ0xJRU5UX1NJTkspKQorI2RlZmluZSBHU1RfSVNfU09VUF9IVFRQX0NMSUVOVF9TSU5LX0NMQVNTKG9iaikgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1NPVVBfSFRUUF9DTElFTlRfU0lOSykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RTb3VwSHR0cENsaWVudFNpbmsgR3N0U291cEh0dHBDbGllbnRTaW5rOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFNvdXBIdHRwQ2xpZW50U2lua0NsYXNzIEdzdFNvdXBIdHRwQ2xpZW50U2lua0NsYXNzOworCitzdHJ1Y3QgX0dzdFNvdXBIdHRwQ2xpZW50U2luaworeworICBHc3RCYXNlU2luayBiYXNlX3NvdXBodHRwc2luazsKKworICBHTXV0ZXggbXV0ZXg7CisgIEdDb25kIGNvbmQ7CisgIEdNYWluQ29udGV4dCAqY29udGV4dDsKKyAgR01haW5Mb29wICpsb29wOworICBHVGhyZWFkICp0aHJlYWQ7CisgIEdTb3VyY2UgKnRpbWVyOworICBTb3VwTWVzc2FnZSAqbWVzc2FnZTsKKyAgU291cFNlc3Npb24gKnNlc3Npb247CisgIEdMaXN0ICpxdWV1ZWRfYnVmZmVyczsKKyAgR0xpc3QgKnNlbnRfYnVmZmVyczsKKyAgR0xpc3QgKnN0cmVhbWhlYWRlcl9idWZmZXJzOworCisgIGludCBzdGF0dXNfY29kZTsKKyAgY2hhciAqcmVhc29uX3BocmFzZTsKKworICBndWludDY0IG9mZnNldDsKKyAgaW50IHRpbWVvdXQ7CisgIGdpbnQgZmFpbHVyZXM7CisKKyAgLyogcHJvcGVydGllcyAqLworICBTb3VwU2Vzc2lvbiAqcHJvcF9zZXNzaW9uOworICBjaGFyICpsb2NhdGlvbjsKKyAgY2hhciAqdXNlcl9pZDsKKyAgY2hhciAqdXNlcl9wdzsKKyAgU291cFVSSSAqcHJveHk7CisgIGNoYXIgKnByb3h5X2lkOworICBjaGFyICpwcm94eV9wdzsKKyAgY2hhciAqdXNlcl9hZ2VudDsKKyAgZ2Jvb2xlYW4gYXV0b21hdGljX3JlZGlyZWN0OworICBnY2hhciAqKmNvb2tpZXM7CisgIFNvdXBMb2dnZXJMb2dMZXZlbCBsb2dfbGV2ZWw7CisgIGdpbnQgcmV0cnlfZGVsYXk7CisgIGdpbnQgcmV0cmllczsKK307CisKK3N0cnVjdCBfR3N0U291cEh0dHBDbGllbnRTaW5rQ2xhc3MKK3sKKyAgR3N0QmFzZVNpbmtDbGFzcyBiYXNlX3NvdXBodHRwc2lua19jbGFzczsKK307CisKK0dUeXBlIGdzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmMgYi9leHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NjQyZTMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jCkBAIC0wLDAgKzEsMjE3OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBXb3V0ZXIgQ2xvZXRlbnMgPHdvdXRlckBtaW5kLmJlPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtc291cGh0dHBzcmMKKyAqCisgKiBUaGlzIHBsdWdpbiByZWFkcyBkYXRhIGZyb20gYSByZW1vdGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IGEgVVJJLgorICogU3VwcG9ydGVkIHByb3RvY29scyBhcmUgJ2h0dHAnLCAnaHR0cHMnLgorICoKKyAqIEFuIEhUVFAgcHJveHkgbXVzdCBiZSBzcGVjaWZpZWQgYnkgaXRzIFVSTC4KKyAqIElmIHRoZSAiaHR0cF9wcm94eSIgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LCBpdHMgdmFsdWUgaXMgdXNlZC4KKyAqIElmIGJ1aWx0IHdpdGggbGlic291cCdzIEdOT01FIGludGVncmF0aW9uIGZlYXR1cmVzLCB0aGUgR05PTUUgcHJveHkKKyAqIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSB1c2VkLCBvciBmYWlsaW5nIHRoYXQsIHByb3h5IGF1dG9kZXRlY3Rpb24uCisgKiBUaGUgI0dzdFNvdXBIVFRQU3JjOnByb3h5IHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0LgorICoKKyAqIEluIGNhc2UgdGhlICNHc3RTb3VwSFRUUFNyYzppcmFkaW8tbW9kZSBwcm9wZXJ0eSBpcyBzZXQgYW5kIHRoZSBsb2NhdGlvbiBpcworICogYW4gSFRUUCByZXNvdXJjZSwgc291cGh0dHBzcmMgd2lsbCBzZW5kIHNwZWNpYWwgSWNlY2FzdCBIVFRQIGhlYWRlcnMgdG8gdGhlCisgKiBzZXJ2ZXIgdG8gcmVxdWVzdCBhZGRpdGlvbmFsIEljZWNhc3QgbWV0YS1pbmZvcm1hdGlvbi4KKyAqIElmIHRoZSBzZXJ2ZXIgaXMgbm90IGFuIEljZWNhc3Qgc2VydmVyLCBpdCB3aWxsIGJlaGF2ZSBhcyBpZiB0aGUKKyAqICNHc3RTb3VwSFRUUFNyYzppcmFkaW8tbW9kZSBwcm9wZXJ0eSB3ZXJlIG5vdCBzZXQuIElmIGl0IGlzLCBzb3VwaHR0cHNyYyB3aWxsCisgKiBvdXRwdXQgZGF0YSB3aXRoIGEgbWVkaWEgdHlwZSBvZiBhcHBsaWNhdGlvbi94LWljeSwgaW4gd2hpY2ggY2FzZSB5b3Ugd2lsbAorICogbmVlZCB0byB1c2UgdGhlICNJQ1lEZW11eCBlbGVtZW50IGFzIGZvbGxvdy11cCBlbGVtZW50IHRvIGV4dHJhY3QgdGhlIEljZWNhc3QKKyAqIG1ldGFkYXRhIGFuZCB0byBkZXRlcm1pbmUgdGhlIHVuZGVybHlpbmcgbWVkaWEgdHlwZS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgc291cGh0dHBzcmMgbG9jYXRpb249aHR0cHM6Ly9zb21lLnNlcnZlci5vcmcvaW5kZXguaHRtbAorICogICAgICEgZmlsZXNpbmsgbG9jYXRpb249L2hvbWUvam9lL3NlcnZlci5odG1sCisgKiBdfCBUaGUgYWJvdmUgcGlwZWxpbmUgcmVhZHMgYSB3ZWIgcGFnZSBmcm9tIGEgc2VydmVyIHVzaW5nIHRoZSBIVFRQUyBwcm90b2NvbAorICogYW5kIHdyaXRlcyBpdCB0byBhIGxvY2FsIGZpbGUuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgc291cGh0dHBzcmMgdXNlci1hZ2VudD0iRm9vUGxheWVyIDAuOTkgYmV0YSIKKyAqICAgICBhdXRvbWF0aWMtcmVkaXJlY3Q9ZmFsc2UgcHJveHk9aHR0cDovL3Byb3h5LmludHJhbmV0LmxvY2FsOjgwODAKKyAqICAgICBsb2NhdGlvbj1odHRwOi8vbXVzaWMuZm9vYmFyLmNvbS9kZW1vLm1wMyAhIG1wZ2F1ZGlvcGFyc2UKKyAqICAgICAhIG1wZzEyM2F1ZGlvZGVjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIGF1dG9hdWRpb3NpbmsKKyAqIF18IFRoZSBhYm92ZSBwaXBlbGluZSB3aWxsIHJlYWQgYW5kIGRlY29kZSBhbmQgcGxheSBhbiBtcDMgZmlsZSBmcm9tIGEKKyAqIHdlYiBzZXJ2ZXIgdXNpbmcgdGhlIEhUVFAgcHJvdG9jb2wuIElmIHRoZSBzZXJ2ZXIgc2VuZHMgcmVkaXJlY3RzLAorICogdGhlIHJlcXVlc3QgZmFpbHMgaW5zdGVhZCBvZiBmb2xsb3dpbmcgdGhlIHJlZGlyZWN0LiBUaGUgc3BlY2lmaWVkCisgKiBIVFRQIHByb3h5IHNlcnZlciBpcyB1c2VkLiBUaGUgVXNlci1BZ2VudCBIVFRQIHJlcXVlc3QgaGVhZGVyCisgKiBpcyBzZXQgdG8gYSBjdXN0b20gc3RyaW5nIGluc3RlYWQgb2YgIkdTdHJlYW1lciBzb3VwaHR0cHNyYy4iCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgc291cGh0dHBzcmMgbG9jYXRpb249aHR0cDovLzEwLjExLjEyLjEzL21qcGVnCisgKiAgICAgZG8tdGltZXN0YW1wPXRydWUgISBtdWx0aXBhcnRkZW11eAorICogICAgICEgaW1hZ2UvanBlZyx3aWR0aD02NDAsaGVpZ2h0PTQ4MCAhIG1hdHJvc2thbXV4CisgKiAgICAgISBmaWxlc2luayBsb2NhdGlvbj1tanBlZy5ta3YKKyAqIF18IFRoZSBhYm92ZSBwaXBlbGluZSByZWFkcyBhIG1vdGlvbiBKUEVHIHN0cmVhbSBmcm9tIGFuIElQIGNhbWVyYQorICogdXNpbmcgdGhlIEhUVFAgcHJvdG9jb2wsIGVuY29kZWQgYXMgbWltZS9tdWx0aXBhcnQgaW1hZ2UvanBlZworICogcGFydHMsIGFuZCB3cml0ZXMgYSBNYXRyb3NrYSBtb3Rpb24gSlBFRyBmaWxlLiBUaGUgd2lkdGggYW5kCisgKiBoZWlnaHQgcHJvcGVydGllcyBhcmUgc2V0IGluIHRoZSBjYXBzIHRvIHByb3ZpZGUgdGhlIE1hdHJvc2thCisgKiBtdWx0aXBsZXhlciB3aXRoIHRoZSBpbmZvcm1hdGlvbiB0byBzZXQgdGhpcyBpbiB0aGUgaGVhZGVyLgorICogVGltZXN0YW1wcyBhcmUgc2V0IG9uIHRoZSBidWZmZXJzIGFzIHRoZXkgYXJyaXZlIGZyb20gdGhlIGNhbWVyYS4KKyAqIFRoZXNlIGFyZSB1c2VkIGJ5IHRoZSBtaW1lL211bHRpcGFydCBkZW11bHRpcGxleGVyIHRvIGVtaXQgdGltZXN0YW1wcworICogb24gdGhlIEpQRUctZW5jb2RlZCB2aWRlbyBmcmFtZSBidWZmZXJzLiBUaGlzIGFsbG93cyB0aGUgTWF0cm9za2EKKyAqIG11bHRpcGxleGVyIHRvIHRpbWVzdGFtcCB0aGUgZnJhbWVzIGluIHRoZSByZXN1bHRpbmcgZmlsZS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPiAgICAgICAgICAgICAvKiBhdG9pKCkgKi8KKyNlbmRpZgorI2luY2x1ZGUgPGdzdC9nc3RlbGVtZW50Lmg+CisjaW5jbHVkZSA8Z3N0L2dzdC1pMThuLXBsdWdpbi5oPgorI2luY2x1ZGUgPGxpYnNvdXAvc291cC5oPgorI2luY2x1ZGUgImdzdHNvdXBodHRwc3JjLmgiCisjaW5jbHVkZSAiZ3N0c291cHV0aWxzLmgiCisKKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChzb3VwaHR0cHNyY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBzb3VwaHR0cHNyY19kZWJ1ZworCisjZGVmaW5lIEdTVF9TT1VQX1NFU1NJT05fQ09OVEVYVCAiZ3N0LnNvdXAuc2Vzc2lvbiIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MT0NBVElPTiwKKyAgUFJPUF9JU19MSVZFLAorICBQUk9QX1VTRVJfQUdFTlQsCisgIFBST1BfQVVUT01BVElDX1JFRElSRUNULAorICBQUk9QX1BST1hZLAorICBQUk9QX1VTRVJfSUQsCisgIFBST1BfVVNFUl9QVywKKyAgUFJPUF9QUk9YWV9JRCwKKyAgUFJPUF9QUk9YWV9QVywKKyAgUFJPUF9DT09LSUVTLAorICBQUk9QX0lSQURJT19NT0RFLAorICBQUk9QX1RJTUVPVVQsCisgIFBST1BfRVhUUkFfSEVBREVSUywKKyAgUFJPUF9TT1VQX0xPR19MRVZFTCwKKyAgUFJPUF9DT01QUkVTUywKKyAgUFJPUF9LRUVQX0FMSVZFLAorICBQUk9QX1NTTF9TVFJJQ1QsCisgIFBST1BfU1NMX0NBX0ZJTEUsCisgIFBST1BfU1NMX1VTRV9TWVNURU1fQ0FfRklMRSwKKyAgUFJPUF9UTFNfREFUQUJBU0UsCisgIFBST1BfUkVUUklFUywKKyAgUFJPUF9NRVRIT0QsCisgIFBST1BfVExTX0lOVEVSQUNUSU9OLAorfTsKKworI2RlZmluZSBERUZBVUxUX1VTRVJfQUdFTlQgICAgICAgICAgICJHU3RyZWFtZXIgc291cGh0dHBzcmMgIiBQQUNLQUdFX1ZFUlNJT04gIiAiCisjZGVmaW5lIERFRkFVTFRfSVJBRElPX01PREUgICAgICAgICAgVFJVRQorI2RlZmluZSBERUZBVUxUX1NPVVBfTE9HX0xFVkVMICAgICAgIFNPVVBfTE9HR0VSX0xPR19IRUFERVJTCisjZGVmaW5lIERFRkFVTFRfQ09NUFJFU1MgICAgICAgICAgICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9LRUVQX0FMSVZFICAgICAgICAgICBUUlVFCisjZGVmaW5lIERFRkFVTFRfU1NMX1NUUklDVCAgICAgICAgICAgVFJVRQorI2RlZmluZSBERUZBVUxUX1NTTF9DQV9GSUxFICAgICAgICAgIE5VTEwKKyNkZWZpbmUgREVGQVVMVF9TU0xfVVNFX1NZU1RFTV9DQV9GSUxFIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9UTFNfREFUQUJBU0UgICAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfVExTX0lOVEVSQUNUSU9OICAgICAgTlVMTAorI2RlZmluZSBERUZBVUxUX1RJTUVPVVQgICAgICAgICAgICAgIDE1CisjZGVmaW5lIERFRkFVTFRfUkVUUklFUyAgICAgICAgICAgICAgMworI2RlZmluZSBERUZBVUxUX1NPVVBfTUVUSE9EICAgICAgICAgIE5VTEwKKworI2RlZmluZSBHUk9XX0JMT0NLU0laRV9MSU1JVCAxCisjZGVmaW5lIEdST1dfQkxPQ0tTSVpFX0NPVU5UIDEKKyNkZWZpbmUgR1JPV19CTE9DS1NJWkVfRkFDVE9SIDIKKyNkZWZpbmUgUkVEVUNFX0JMT0NLU0laRV9MSU1JVCAwLjIwCisjZGVmaW5lIFJFRFVDRV9CTE9DS1NJWkVfQ09VTlQgMgorI2RlZmluZSBSRURVQ0VfQkxPQ0tTSVpFX0ZBQ1RPUiAwLjUKKworc3RhdGljIHZvaWQgZ3N0X3NvdXBfaHR0cF9zcmNfdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwKKyAgICBncG9pbnRlciBpZmFjZV9kYXRhKTsKK3N0YXRpYyB2b2lkIGdzdF9zb3VwX2h0dHBfc3JjX2ZpbmFsaXplIChHT2JqZWN0ICogZ29iamVjdCk7CitzdGF0aWMgdm9pZCBnc3Rfc291cF9odHRwX3NyY19kaXNwb3NlIChHT2JqZWN0ICogZ29iamVjdCk7CisKK3N0YXRpYyB2b2lkIGdzdF9zb3VwX2h0dHBfc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9zb3VwX2h0dHBfc3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9zb3VwX2h0dHBfc3JjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CitzdGF0aWMgdm9pZCBnc3Rfc291cF9odHRwX3NyY19zZXRfY29udGV4dCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0Q29udGV4dCAqIGNvbnRleHQpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3NvdXBfaHR0cF9zcmNfY3JlYXRlIChHc3RQdXNoU3JjICogcHNyYywKKyAgICBHc3RCdWZmZXIgKiogb3V0YnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc291cF9odHRwX3NyY19zdGFydCAoR3N0QmFzZVNyYyAqIGJzcmMpOworc3RhdGljIGdib29sZWFuIGdzdF9zb3VwX2h0dHBfc3JjX3N0b3AgKEdzdEJhc2VTcmMgKiBic3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc291cF9odHRwX3NyY19nZXRfc2l6ZSAoR3N0QmFzZVNyYyAqIGJzcmMsIGd1aW50NjQgKiBzaXplKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc291cF9odHRwX3NyY19pc19zZWVrYWJsZSAoR3N0QmFzZVNyYyAqIGJzcmMpOworc3RhdGljIGdib29sZWFuIGdzdF9zb3VwX2h0dHBfc3JjX2RvX3NlZWsgKEdzdEJhc2VTcmMgKiBic3JjLAorICAgIEdzdFNlZ21lbnQgKiBzZWdtZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc291cF9odHRwX3NyY19xdWVyeSAoR3N0QmFzZVNyYyAqIGJzcmMsIEdzdFF1ZXJ5ICogcXVlcnkpOworc3RhdGljIGdib29sZWFuIGdzdF9zb3VwX2h0dHBfc3JjX3VubG9jayAoR3N0QmFzZVNyYyAqIGJzcmMpOworc3RhdGljIGdib29sZWFuIGdzdF9zb3VwX2h0dHBfc3JjX3VubG9ja19zdG9wIChHc3RCYXNlU3JjICogYnNyYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NvdXBfaHR0cF9zcmNfc2V0X2xvY2F0aW9uIChHc3RTb3VwSFRUUFNyYyAqIHNyYywKKyAgICBjb25zdCBnY2hhciAqIHVyaSwgR0Vycm9yICoqIGVycm9yKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc291cF9odHRwX3NyY19zZXRfcHJveHkgKEdzdFNvdXBIVFRQU3JjICogc3JjLAorICAgIGNvbnN0IGdjaGFyICogdXJpKTsKK3N0YXRpYyBjaGFyICpnc3Rfc291cF9odHRwX3NyY191bmljb2RpZnkgKGNvbnN0IGNoYXIgKnN0cik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NvdXBfaHR0cF9zcmNfYnVpbGRfbWVzc2FnZSAoR3N0U291cEhUVFBTcmMgKiBzcmMsCisgICAgY29uc3QgZ2NoYXIgKiBtZXRob2QpOworc3RhdGljIHZvaWQgZ3N0X3NvdXBfaHR0cF9zcmNfY2FuY2VsX21lc3NhZ2UgKEdzdFNvdXBIVFRQU3JjICogc3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc291cF9odHRwX3NyY19hZGRfcmFuZ2VfaGVhZGVyIChHc3RTb3VwSFRUUFNyYyAqIHNyYywKKyAgICBndWludDY0IG9mZnNldCwgZ3VpbnQ2NCBzdG9wX29mZnNldCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NvdXBfaHR0cF9zcmNfc2Vzc2lvbl9vcGVuIChHc3RTb3VwSFRUUFNyYyAqIHNyYyk7CitzdGF0aWMgdm9pZCBnc3Rfc291cF9odHRwX3NyY19zZXNzaW9uX2Nsb3NlIChHc3RTb3VwSFRUUFNyYyAqIHNyYyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfc291cF9odHRwX3NyY19wYXJzZV9zdGF0dXMgKFNvdXBNZXNzYWdlICogbXNnLAorICAgIEdzdFNvdXBIVFRQU3JjICogc3JjKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9zb3VwX2h0dHBfc3JjX2dvdF9oZWFkZXJzIChHc3RTb3VwSFRUUFNyYyAqIHNyYywKKyAgICBTb3VwTWVzc2FnZSAqIG1zZyk7CitzdGF0aWMgdm9pZCBnc3Rfc291cF9odHRwX3NyY19hdXRoZW50aWNhdGVfY2IgKFNvdXBTZXNzaW9uICogc2Vzc2lvbiwKKyAgICBTb3VwTWVzc2FnZSAqIG1zZywgU291cEF1dGggKiBhdXRoLCBnYm9vbGVhbiByZXRyeWluZywKKyAgICBHc3RTb3VwSFRUUFNyYyAqIHNyYyk7CisKKyNkZWZpbmUgZ3N0X3NvdXBfaHR0cF9zcmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdFNvdXBIVFRQU3JjLCBnc3Rfc291cF9odHRwX3NyYywgR1NUX1RZUEVfUFVTSF9TUkMsCisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9VUklfSEFORExFUiwKKyAgICAgICAgZ3N0X3NvdXBfaHR0cF9zcmNfdXJpX2hhbmRsZXJfaW5pdCkpOworCitzdGF0aWMgdm9pZAorZ3N0X3NvdXBfaHR0cF9zcmNfY2xhc3NfaW5pdCAoR3N0U291cEhUVFBTcmNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0QmFzZVNyY0NsYXNzICpnc3RiYXNlc3JjX2NsYXNzOworICBHc3RQdXNoU3JjQ2xhc3MgKmdzdHB1c2hzcmNfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RiYXNlc3JjX2NsYXNzID0gKEdzdEJhc2VTcmNDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cHVzaHNyY19jbGFzcyA9IChHc3RQdXNoU3JjQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3NvdXBfaHR0cF9zcmNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfc291cF9odHRwX3NyY19nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3NvdXBfaHR0cF9zcmNfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3Rfc291cF9odHRwX3NyY19kaXNwb3NlOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX0xPQ0FUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImxvY2F0aW9uIiwgIkxvY2F0aW9uIiwKKyAgICAgICAgICAiTG9jYXRpb24gdG8gcmVhZCBmcm9tIiwgIiIsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1VTRVJfQUdFTlQsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgidXNlci1hZ2VudCIsICJVc2VyLUFnZW50IiwKKyAgICAgICAgICAiVmFsdWUgb2YgdGhlIFVzZXItQWdlbnQgSFRUUCByZXF1ZXN0IGhlYWRlciBmaWVsZCIsCisgICAgICAgICAgREVGQVVMVF9VU0VSX0FHRU5ULCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfQVVUT01BVElDX1JFRElSRUNULAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJhdXRvbWF0aWMtcmVkaXJlY3QiLCAiYXV0b21hdGljLXJlZGlyZWN0IiwKKyAgICAgICAgICAiQXV0b21hdGljYWxseSBmb2xsb3cgSFRUUCByZWRpcmVjdHMgKEhUVFAgU3RhdHVzIENvZGUgM3h4KSIsCisgICAgICAgICAgVFJVRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1BST1hZLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInByb3h5IiwgIlByb3h5IiwKKyAgICAgICAgICAiSFRUUCBwcm94eSBzZXJ2ZXIgVVJJIiwgIiIsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1VTRVJfSUQsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgidXNlci1pZCIsICJ1c2VyLWlkIiwKKyAgICAgICAgICAiSFRUUCBsb2NhdGlvbiBVUkkgdXNlciBpZCBmb3IgYXV0aGVudGljYXRpb24iLCAiIiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9VU0VSX1BXLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInVzZXItcHciLCAidXNlci1wdyIsCisgICAgICAgICAgIkhUVFAgbG9jYXRpb24gVVJJIHVzZXIgcGFzc3dvcmQgZm9yIGF1dGhlbnRpY2F0aW9uIiwgIiIsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUFJPWFlfSUQsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgicHJveHktaWQiLCAicHJveHktaWQiLAorICAgICAgICAgICJIVFRQIHByb3h5IFVSSSB1c2VyIGlkIGZvciBhdXRoZW50aWNhdGlvbiIsICIiLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BST1hZX1BXLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInByb3h5LXB3IiwgInByb3h5LXB3IiwKKyAgICAgICAgICAiSFRUUCBwcm94eSBVUkkgdXNlciBwYXNzd29yZCBmb3IgYXV0aGVudGljYXRpb24iLCAiIiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DT09LSUVTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgiY29va2llcyIsICJDb29raWVzIiwgIkhUVFAgcmVxdWVzdCBjb29raWVzIiwKKyAgICAgICAgICBHX1RZUEVfU1RSViwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSVNfTElWRSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiaXMtbGl2ZSIsICJpcy1saXZlIiwgIkFjdCBsaWtlIGEgbGl2ZSBzb3VyY2UiLAorICAgICAgICAgIEZBTFNFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USU1FT1VULAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJ0aW1lb3V0IiwgInRpbWVvdXQiLAorICAgICAgICAgICJWYWx1ZSBpbiBzZWNvbmRzIHRvIHRpbWVvdXQgYSBibG9ja2luZyBJL08gKDAgPSBObyB0aW1lb3V0KS4iLCAwLAorICAgICAgICAgIDM2MDAsIERFRkFVTFRfVElNRU9VVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRVhUUkFfSEVBREVSUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoImV4dHJhLWhlYWRlcnMiLCAiRXh0cmEgSGVhZGVycyIsCisgICAgICAgICAgIkV4dHJhIGhlYWRlcnMgdG8gYXBwZW5kIHRvIHRoZSBIVFRQIHJlcXVlc3QiLAorICAgICAgICAgIEdTVF9UWVBFX1NUUlVDVFVSRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSVJBRElPX01PREUsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImlyYWRpby1tb2RlIiwgImlyYWRpby1tb2RlIiwKKyAgICAgICAgICAiRW5hYmxlIGludGVybmV0IHJhZGlvIG1vZGUgKGFzayBzZXJ2ZXIgdG8gc2VuZCBzaG91dGNhc3QvaWNlY2FzdCAiCisgICAgICAgICAgIm1ldGFkYXRhIGludGVybGVhdmVkIHdpdGggdGhlIGFjdHVhbCBzdHJlYW0gZGF0YSkiLAorICAgICAgICAgIERFRkFVTFRfSVJBRElPX01PREUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgLyoqCisgICAqIEdzdFNvdXBIVFRQU3JjOjpodHRwLWxvZy1sZXZlbDoKKyAgICoKKyAgICogSWYgc2V0IGFuZCA+IDAsIGNhcHR1cmVzIGFuZCBkdW1wcyBIVFRQIHNlc3Npb24gZGF0YSBhcworICAgKiBsb2cgbWVzc2FnZXMgaWYgbG9nIGxldmVsID49IEdTVF9MRVZFTF9UUkFDRQorICAgKgorICAgKiBTaW5jZTogMS40CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NPVVBfTE9HX0xFVkVMLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJodHRwLWxvZy1sZXZlbCIsICJIVFRQIGxvZyBsZXZlbCIsCisgICAgICAgICAgIlNldCBsb2cgbGV2ZWwgZm9yIHNvdXAncyBIVFRQIHNlc3Npb24gbG9nIiwKKyAgICAgICAgICBTT1VQX1RZUEVfTE9HR0VSX0xPR19MRVZFTCwgREVGQVVMVF9TT1VQX0xPR19MRVZFTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworIC8qKgorICAgKiBHc3RTb3VwSFRUUFNyYzo6Y29tcHJlc3M6CisgICAqCisgICAqIElmIHNldCB0byAlVFJVRSwgc291cGh0dHBzcmMgd2lsbCBhdXRvbWF0aWNhbGx5IGhhbmRsZSBnemlwCisgICAqIGFuZCBkZWZsYXRlIENvbnRlbnQtRW5jb2RpbmdzLiBUaGlzIGRvZXMgbm90IG1ha2UgbXVjaCBkaWZmZXJlbmNlCisgICAqIGFuZCBjYXVzZXMgbW9yZSBsb2FkIGZvciBub3JtYWwgbWVkaWEgZmlsZXMsIGJ1dCBtYWtlcyBhIHJlYWwKKyAgICogZGlmZmVyZW5jZSBpbiBzaXplIGZvciBwbGFpbnRleHQgZmlsZXMuCisgICAqCisgICAqIFNpbmNlOiAxLjQKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ09NUFJFU1MsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImNvbXByZXNzIiwgIkNvbXByZXNzIiwKKyAgICAgICAgICAiQWxsb3cgY29tcHJlc3NlZCBjb250ZW50IGVuY29kaW5ncyIsCisgICAgICAgICAgREVGQVVMVF9DT01QUkVTUywgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAvKioKKyAgICogR3N0U291cEhUVFBTcmM6OmtlZXAtYWxpdmU6CisgICAqCisgICAqIElmIHNldCB0byAlVFJVRSwgc291cGh0dHBzcmMgd2lsbCBrZWVwIGFsaXZlIGNvbm5lY3Rpb25zIHdoZW4gYmVpbmcKKyAgICogc2V0IHRvIFJFQURZIHN0YXRlIGFuZCBvbmx5IHdpbGwgY2xvc2UgY29ubmVjdGlvbnMgd2hlbiBjb25uZWN0aW5nCisgICAqIHRvIGEgZGlmZmVyZW50IHNlcnZlciBvciB3aGVuIGdvaW5nIHRvIE5VTEwgc3RhdGUuLgorICAgKgorICAgKiBTaW5jZTogMS40CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0tFRVBfQUxJVkUsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImtlZXAtYWxpdmUiLCAia2VlcC1hbGl2ZSIsCisgICAgICAgICAgIlVzZSBIVFRQIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMiLCBERUZBVUxUX0tFRVBfQUxJVkUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAvKioKKyAgICogR3N0U291cEhUVFBTcmM6OnNzbC1zdHJpY3Q6CisgICAqCisgICAqIElmIHNldCB0byAlVFJVRSwgc291cGh0dHBzcmMgd2lsbCByZWplY3QgYWxsIFNTTCBjZXJ0aWZpY2F0ZXMgdGhhdAorICAgKiBhcmUgY29uc2lkZXJlZCBpbnZhbGlkLgorICAgKgorICAgKiBTaW5jZTogMS40CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NTTF9TVFJJQ1QsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInNzbC1zdHJpY3QiLCAiU1NMIFN0cmljdCIsCisgICAgICAgICAgIlN0cmljdCBTU0wgY2VydGlmaWNhdGUgY2hlY2tpbmciLCBERUZBVUxUX1NTTF9TVFJJQ1QsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAvKioKKyAgICogR3N0U291cEhUVFBTcmM6OnNzbC1jYS1maWxlOgorICAgKgorICAgKiBBIFNTTCBhbmNob3IgQ0EgZmlsZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBjaGVja2luZyBjZXJ0aWZpY2F0ZXMKKyAgICogaW5zdGVhZCBvZiB0aGUgc3lzdGVtIENBIGZpbGUuCisgICAqCisgICAqIElmIHRoaXMgcHJvcGVydHkgaXMgbm9uLSVOVUxMLCAjR3N0U291cEhUVFBTcmM6OnNzbC11c2Utc3lzdGVtLWNhLWZpbGUKKyAgICogdmFsdWUgd2lsbCBiZSBpZ25vcmVkLgorICAgKgorICAgKiBEZXByZWNhdGVkOiBVc2UgI0dzdFNvdXBIVFRQU3JjOjp0bHMtZGF0YWJhc2UgcHJvcGVydHkgaW5zdGVhZC4KKyAgICogU2luY2U6IDEuNAorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TU0xfQ0FfRklMRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJzc2wtY2EtZmlsZSIsICJTU0wgQ0EgRmlsZSIsCisgICAgICAgICAgIkxvY2F0aW9uIG9mIGEgU1NMIGFuY2hvciBDQSBmaWxlIHRvIHVzZSIsIERFRkFVTFRfU1NMX0NBX0ZJTEUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAvKioKKyAgICogR3N0U291cEhUVFBTcmM6OnNzbC11c2Utc3lzdGVtLWNhLWZpbGU6CisgICAqCisgICAqIElmIHNldCB0byAlVFJVRSwgc291cGh0dHBzcmMgd2lsbCB1c2UgdGhlIHN5c3RlbSdzIENBIGZpbGUgZm9yCisgICAqIGNoZWNraW5nIGNlcnRpZmljYXRlcywgdW5sZXNzICNHc3RTb3VwSFRUUFNyYzo6c3NsLWNhLWZpbGUgb3IKKyAgICogI0dzdFNvdXBIVFRQU3JjOjp0bHMtZGF0YWJhc2UgYXJlIG5vbi0lTlVMTC4KKyAgICoKKyAgICogU2luY2U6IDEuNAorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TU0xfVVNFX1NZU1RFTV9DQV9GSUxFLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJzc2wtdXNlLXN5c3RlbS1jYS1maWxlIiwgIlVzZSBTeXN0ZW0gQ0EgRmlsZSIsCisgICAgICAgICAgIlVzZSBzeXN0ZW0gQ0EgZmlsZSIsIERFRkFVTFRfU1NMX1VTRV9TWVNURU1fQ0FfRklMRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0U291cEhUVFBTcmM6OnRscy1kYXRhYmFzZToKKyAgICoKKyAgICogVExTIGRhdGFiYXNlIHdpdGggYW5jaG9yIGNlcnRpZmljYXRlIGF1dGhvcml0aWVzIHVzZWQgdG8gdmFsaWRhdGUKKyAgICogdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZS4KKyAgICoKKyAgICogSWYgdGhpcyBwcm9wZXJ0eSBpcyBub24tJU5VTEwsICNHc3RTb3VwSFRUUFNyYzo6c3NsLXVzZS1zeXN0ZW0tY2EtZmlsZQorICAgKiBhbmQgI0dzdFNvdXBIVFRQU3JjOjpzc2wtY2EtZmlsZSB2YWx1ZXMgd2lsbCBiZSBpZ25vcmVkLgorICAgKgorICAgKiBTaW5jZTogMS42CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RMU19EQVRBQkFTRSwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJ0bHMtZGF0YWJhc2UiLCAiVExTIGRhdGFiYXNlIiwKKyAgICAgICAgICAiVExTIGRhdGFiYXNlIHdpdGggYW5jaG9yIGNlcnRpZmljYXRlIGF1dGhvcml0aWVzIHVzZWQgdG8gdmFsaWRhdGUgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgR19UWVBFX1RMU19EQVRBQkFTRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFNvdXBIVFRQU3JjOjp0bHMtaW50ZXJhY3Rpb246CisgICAqCisgICAqIEEgI0dUbHNJbnRlcmFjdGlvbiBvYmplY3QgdG8gYmUgdXNlZCB3aGVuIHRoZSBjb25uZWN0aW9uIG9yIGNlcnRpZmljYXRlCisgICAqIGRhdGFiYXNlIG5lZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgdXNlci4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gcHJvbXB0IHRoZQorICAgKiB1c2VyIGZvciBwYXNzd29yZHMgb3IgY2VydGlmaWNhdGUgd2hlcmUgbmVjZXNzYXJ5LgorICAgKgorICAgKiBTaW5jZTogMS44CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RMU19JTlRFUkFDVElPTiwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJ0bHMtaW50ZXJhY3Rpb24iLCAiVExTIGludGVyYWN0aW9uIiwKKyAgICAgICAgICAiQSBHVGxzSW50ZXJhY3Rpb24gb2JqZWN0IHRvIGJlIHVzZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBvciBjZXJ0aWZpY2F0ZSBkYXRhYmFzZSBuZWVkIHRvIGludGVyYWN0IHdpdGggdGhlIHVzZXIuIiwKKyAgICAgICAgICBHX1RZUEVfVExTX0lOVEVSQUNUSU9OLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworIC8qKgorICAgKiBHc3RTb3VwSFRUUFNyYzo6cmV0cmllczoKKyAgICoKKyAgICogTWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyB1bnRpbCBnaXZpbmcgdXAuCisgICAqCisgICAqIFNpbmNlOiAxLjQKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkVUUklFUywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJyZXRyaWVzIiwgIlJldHJpZXMiLAorICAgICAgICAgICJNYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIHVudGlsIGdpdmluZyB1cCAoLTE9aW5maW5pdGUpIiwgLTEsCisgICAgICAgICAgR19NQVhJTlQsIERFRkFVTFRfUkVUUklFUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworIC8qKgorICAgKiBHc3RTb3VwSFRUUFNyYzo6bWV0aG9kCisgICAqCisgICAqIFRoZSBIVFRQIG1ldGhvZCB0byB1c2Ugd2hlbiBtYWtpbmcgYSByZXF1ZXN0CisgICAqCisgICAqIFNpbmNlOiAxLjYKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUVUSE9ELAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoIm1ldGhvZCIsICJIVFRQIG1ldGhvZCIsCisgICAgICAgICAgIlRoZSBIVFRQIG1ldGhvZCB0byB1c2UgKEdFVCwgSEVBRCwgT1BUSU9OUywgZXRjKSIsCisgICAgICAgICAgREVGQVVMVF9TT1VQX01FVEhPRCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmN0ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkhUVFAgY2xpZW50IHNvdXJjZSIsCisgICAgICAiU291cmNlL05ldHdvcmsiLAorICAgICAgIlJlY2VpdmUgZGF0YSBhcyBhIGNsaWVudCBvdmVyIHRoZSBuZXR3b3JrIHZpYSBIVFRQIHVzaW5nIFNPVVAiLAorICAgICAgIldvdXRlciBDbG9ldGVucyA8d291dGVyQG1pbmQuYmU+Iik7CisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NvdXBfaHR0cF9zcmNfY2hhbmdlX3N0YXRlKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+c2V0X2NvbnRleHQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zb3VwX2h0dHBfc3JjX3NldF9jb250ZXh0KTsKKworICBnc3RiYXNlc3JjX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc291cF9odHRwX3NyY19zdGFydCk7CisgIGdzdGJhc2VzcmNfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NvdXBfaHR0cF9zcmNfc3RvcCk7CisgIGdzdGJhc2VzcmNfY2xhc3MtPnVubG9jayA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc291cF9odHRwX3NyY191bmxvY2spOworICBnc3RiYXNlc3JjX2NsYXNzLT51bmxvY2tfc3RvcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NvdXBfaHR0cF9zcmNfdW5sb2NrX3N0b3ApOworICBnc3RiYXNlc3JjX2NsYXNzLT5nZXRfc2l6ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc291cF9odHRwX3NyY19nZXRfc2l6ZSk7CisgIGdzdGJhc2VzcmNfY2xhc3MtPmlzX3NlZWthYmxlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc291cF9odHRwX3NyY19pc19zZWVrYWJsZSk7CisgIGdzdGJhc2VzcmNfY2xhc3MtPmRvX3NlZWsgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NvdXBfaHR0cF9zcmNfZG9fc2Vlayk7CisgIGdzdGJhc2VzcmNfY2xhc3MtPnF1ZXJ5ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zb3VwX2h0dHBfc3JjX3F1ZXJ5KTsKKworICBnc3RwdXNoc3JjX2NsYXNzLT5jcmVhdGUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NvdXBfaHR0cF9zcmNfY3JlYXRlKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoc291cGh0dHBzcmNfZGVidWcsICJzb3VwaHR0cHNyYyIsIDAsCisgICAgICAiU09VUCBIVFRQIHNyYyIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NvdXBfaHR0cF9zcmNfcmVzZXQgKEdzdFNvdXBIVFRQU3JjICogc3JjKQoreworICBzcmMtPnJldHJ5X2NvdW50ID0gMDsKKyAgc3JjLT5oYXZlX3NpemUgPSBGQUxTRTsKKyAgc3JjLT5nb3RfaGVhZGVycyA9IEZBTFNFOworICBzcmMtPnNlZWthYmxlID0gRkFMU0U7CisgIHNyYy0+cmVhZF9wb3NpdGlvbiA9IDA7CisgIHNyYy0+cmVxdWVzdF9wb3NpdGlvbiA9IDA7CisgIHNyYy0+c3RvcF9wb3NpdGlvbiA9IC0xOworICBzcmMtPmNvbnRlbnRfc2l6ZSA9IDA7CisgIHNyYy0+aGF2ZV9ib2R5ID0gRkFMU0U7CisKKyAgc3JjLT5yZWR1Y2VfYmxvY2tzaXplX2NvdW50ID0gMDsKKyAgc3JjLT5pbmNyZWFzZV9ibG9ja3NpemVfY291bnQgPSAwOworCisgIGdfY2FuY2VsbGFibGVfcmVzZXQgKHNyYy0+Y2FuY2VsbGFibGUpOworICBpZiAoc3JjLT5pbnB1dF9zdHJlYW0pIHsKKyAgICBnX29iamVjdF91bnJlZiAoc3JjLT5pbnB1dF9zdHJlYW0pOworICAgIHNyYy0+aW5wdXRfc3RyZWFtID0gTlVMTDsKKyAgfQorCisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzcmMtPnNyY19jYXBzLCBOVUxMKTsKKyAgZ19mcmVlIChzcmMtPmlyYWRpb19uYW1lKTsKKyAgc3JjLT5pcmFkaW9fbmFtZSA9IE5VTEw7CisgIGdfZnJlZSAoc3JjLT5pcmFkaW9fZ2VucmUpOworICBzcmMtPmlyYWRpb19nZW5yZSA9IE5VTEw7CisgIGdfZnJlZSAoc3JjLT5pcmFkaW9fdXJsKTsKKyAgc3JjLT5pcmFkaW9fdXJsID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zb3VwX2h0dHBfc3JjX2luaXQgKEdzdFNvdXBIVFRQU3JjICogc3JjKQoreworICBjb25zdCBnY2hhciAqcHJveHk7CisKKyAgZ19tdXRleF9pbml0ICgmc3JjLT5tdXRleCk7CisgIGdfY29uZF9pbml0ICgmc3JjLT5oYXZlX2hlYWRlcnNfY29uZCk7CisgIHNyYy0+Y2FuY2VsbGFibGUgPSBnX2NhbmNlbGxhYmxlX25ldyAoKTsKKyAgc3JjLT5sb2NhdGlvbiA9IE5VTEw7CisgIHNyYy0+cmVkaXJlY3Rpb25fdXJpID0gTlVMTDsKKyAgc3JjLT5hdXRvbWF0aWNfcmVkaXJlY3QgPSBUUlVFOworICBzcmMtPnVzZXJfYWdlbnQgPSBnX3N0cmR1cCAoREVGQVVMVF9VU0VSX0FHRU5UKTsKKyAgc3JjLT51c2VyX2lkID0gTlVMTDsKKyAgc3JjLT51c2VyX3B3ID0gTlVMTDsKKyAgc3JjLT5wcm94eV9pZCA9IE5VTEw7CisgIHNyYy0+cHJveHlfcHcgPSBOVUxMOworICBzcmMtPmNvb2tpZXMgPSBOVUxMOworICBzcmMtPmlyYWRpb19tb2RlID0gREVGQVVMVF9JUkFESU9fTU9ERTsKKyAgc3JjLT5zZXNzaW9uID0gTlVMTDsKKyAgc3JjLT5leHRlcm5hbF9zZXNzaW9uID0gTlVMTDsKKyAgc3JjLT5mb3JjZWRfZXh0ZXJuYWxfc2Vzc2lvbiA9IEZBTFNFOworICBzcmMtPm1zZyA9IE5VTEw7CisgIHNyYy0+dGltZW91dCA9IERFRkFVTFRfVElNRU9VVDsKKyAgc3JjLT5sb2dfbGV2ZWwgPSBERUZBVUxUX1NPVVBfTE9HX0xFVkVMOworICBzcmMtPmNvbXByZXNzID0gREVGQVVMVF9DT01QUkVTUzsKKyAgc3JjLT5rZWVwX2FsaXZlID0gREVGQVVMVF9LRUVQX0FMSVZFOworICBzcmMtPnNzbF9zdHJpY3QgPSBERUZBVUxUX1NTTF9TVFJJQ1Q7CisgIHNyYy0+c3NsX3VzZV9zeXN0ZW1fY2FfZmlsZSA9IERFRkFVTFRfU1NMX1VTRV9TWVNURU1fQ0FfRklMRTsKKyAgc3JjLT50bHNfZGF0YWJhc2UgPSBERUZBVUxUX1RMU19EQVRBQkFTRTsKKyAgc3JjLT50bHNfaW50ZXJhY3Rpb24gPSBERUZBVUxUX1RMU19JTlRFUkFDVElPTjsKKyAgc3JjLT5tYXhfcmV0cmllcyA9IERFRkFVTFRfUkVUUklFUzsKKyAgc3JjLT5tZXRob2QgPSBERUZBVUxUX1NPVVBfTUVUSE9EOworICBzcmMtPm1pbmltdW1fYmxvY2tzaXplID0gZ3N0X2Jhc2Vfc3JjX2dldF9ibG9ja3NpemUgKEdTVF9CQVNFX1NSQ19DQVNUIChzcmMpKTsKKyAgcHJveHkgPSBnX2dldGVudiAoImh0dHBfcHJveHkiKTsKKyAgaWYgKCFnc3Rfc291cF9odHRwX3NyY19zZXRfcHJveHkgKHNyYywgcHJveHkpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsCisgICAgICAgICJUaGUgcHJveHkgaW4gdGhlIGh0dHBfcHJveHkgZW52IHZhciAoXCIlc1wiKSBjYW5ub3QgYmUgcGFyc2VkLiIsCisgICAgICAgIHByb3h5KTsKKyAgfQorCisgIGdzdF9iYXNlX3NyY19zZXRfYXV0b21hdGljX2VvcyAoR1NUX0JBU0VfU1JDIChzcmMpLCBGQUxTRSk7CisKKyAgZ3N0X3NvdXBfaHR0cF9zcmNfcmVzZXQgKHNyYyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc291cF9odHRwX3NyY19kaXNwb3NlIChHT2JqZWN0ICogZ29iamVjdCkKK3sKKyAgR3N0U291cEhUVFBTcmMgKnNyYyA9IEdTVF9TT1VQX0hUVFBfU1JDIChnb2JqZWN0KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJkaXNwb3NlIik7CisKKyAgZ3N0X3NvdXBfaHR0cF9zcmNfc2Vzc2lvbl9jbG9zZSAoc3JjKTsKKworICBpZiAoc3JjLT5leHRlcm5hbF9zZXNzaW9uKSB7CisgICAgZ19vYmplY3RfdW5yZWYgKHNyYy0+ZXh0ZXJuYWxfc2Vzc2lvbik7CisgICAgc3JjLT5leHRlcm5hbF9zZXNzaW9uID0gTlVMTDsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChnb2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zb3VwX2h0dHBfc3JjX2ZpbmFsaXplIChHT2JqZWN0ICogZ29iamVjdCkKK3sKKyAgR3N0U291cEhUVFBTcmMgKnNyYyA9IEdTVF9TT1VQX0hUVFBfU1JDIChnb2JqZWN0KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJmaW5hbGl6ZSIpOworCisgIGdfbXV0ZXhfY2xlYXIgKCZzcmMtPm11dGV4KTsKKyAgZ19jb25kX2NsZWFyICgmc3JjLT5oYXZlX2hlYWRlcnNfY29uZCk7CisgIGdfb2JqZWN0X3VucmVmIChzcmMtPmNhbmNlbGxhYmxlKTsKKyAgZ19mcmVlIChzcmMtPmxvY2F0aW9uKTsKKyAgZ19mcmVlIChzcmMtPnJlZGlyZWN0aW9uX3VyaSk7CisgIGdfZnJlZSAoc3JjLT51c2VyX2FnZW50KTsKKyAgaWYgKHNyYy0+cHJveHkgIT0gTlVMTCkgeworICAgIHNvdXBfdXJpX2ZyZWUgKHNyYy0+cHJveHkpOworICB9CisgIGdfZnJlZSAoc3JjLT51c2VyX2lkKTsKKyAgZ19mcmVlIChzcmMtPnVzZXJfcHcpOworICBnX2ZyZWUgKHNyYy0+cHJveHlfaWQpOworICBnX2ZyZWUgKHNyYy0+cHJveHlfcHcpOworICBnX3N0cmZyZWV2IChzcmMtPmNvb2tpZXMpOworCisgIGlmIChzcmMtPmV4dHJhX2hlYWRlcnMpIHsKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHNyYy0+ZXh0cmFfaGVhZGVycyk7CisgICAgc3JjLT5leHRyYV9oZWFkZXJzID0gTlVMTDsKKyAgfQorCisgIGdfZnJlZSAoc3JjLT5zc2xfY2FfZmlsZSk7CisKKyAgaWYgKHNyYy0+dGxzX2RhdGFiYXNlKQorICAgIGdfb2JqZWN0X3VucmVmIChzcmMtPnRsc19kYXRhYmFzZSk7CisgIGdfZnJlZSAoc3JjLT5tZXRob2QpOworCisgIGlmIChzcmMtPnRsc19pbnRlcmFjdGlvbikKKyAgICBnX29iamVjdF91bnJlZiAoc3JjLT50bHNfaW50ZXJhY3Rpb24pOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAoZ29iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc291cF9odHRwX3NyY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0U291cEhUVFBTcmMgKnNyYyA9IEdTVF9TT1VQX0hUVFBfU1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MT0NBVElPTjoKKyAgICB7CisgICAgICBjb25zdCBnY2hhciAqbG9jYXRpb247CisKKyAgICAgIGxvY2F0aW9uID0gZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSk7CisKKyAgICAgIGlmIChsb2NhdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIEdTVF9XQVJOSU5HICgibG9jYXRpb24gcHJvcGVydHkgY2Fubm90IGJlIE5VTEwiKTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorICAgICAgaWYgKCFnc3Rfc291cF9odHRwX3NyY19zZXRfbG9jYXRpb24gKHNyYywgbG9jYXRpb24sIE5VTEwpKSB7CisgICAgICAgIEdTVF9XQVJOSU5HICgiYmFkbHkgZm9ybWF0dGVkIGxvY2F0aW9uIik7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfVVNFUl9BR0VOVDoKKyAgICAgIGdfZnJlZSAoc3JjLT51c2VyX2FnZW50KTsKKyAgICAgIHNyYy0+dXNlcl9hZ2VudCA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0lSQURJT19NT0RFOgorICAgICAgc3JjLT5pcmFkaW9fbW9kZSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9BVVRPTUFUSUNfUkVESVJFQ1Q6CisgICAgICBzcmMtPmF1dG9tYXRpY19yZWRpcmVjdCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9YWToKKyAgICB7CisgICAgICBjb25zdCBnY2hhciAqcHJveHk7CisKKyAgICAgIHByb3h5ID0gZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSk7CisgICAgICBpZiAoIWdzdF9zb3VwX2h0dHBfc3JjX3NldF9wcm94eSAoc3JjLCBwcm94eSkpIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJiYWRseSBmb3JtYXR0ZWQgcHJveHkgVVJJIik7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfQ09PS0lFUzoKKyAgICAgIGdfc3RyZnJlZXYgKHNyYy0+Y29va2llcyk7CisgICAgICBzcmMtPmNvb2tpZXMgPSBnX3N0cmR1cHYgKGdfdmFsdWVfZ2V0X2JveGVkICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0lTX0xJVkU6CisgICAgICBnc3RfYmFzZV9zcmNfc2V0X2xpdmUgKEdTVF9CQVNFX1NSQyAoc3JjKSwgZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VSX0lEOgorICAgICAgZ19mcmVlIChzcmMtPnVzZXJfaWQpOworICAgICAgc3JjLT51c2VyX2lkID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFUl9QVzoKKyAgICAgIGdfZnJlZSAoc3JjLT51c2VyX3B3KTsKKyAgICAgIHNyYy0+dXNlcl9wdyA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BST1hZX0lEOgorICAgICAgZ19mcmVlIChzcmMtPnByb3h5X2lkKTsKKyAgICAgIHNyYy0+cHJveHlfaWQgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9YWV9QVzoKKyAgICAgIGdfZnJlZSAoc3JjLT5wcm94eV9wdyk7CisgICAgICBzcmMtPnByb3h5X3B3ID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVElNRU9VVDoKKyAgICAgIHNyYy0+dGltZW91dCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9FWFRSQV9IRUFERVJTOnsKKyAgICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqcyA9IGdzdF92YWx1ZV9nZXRfc3RydWN0dXJlICh2YWx1ZSk7CisKKyAgICAgIGlmIChzcmMtPmV4dHJhX2hlYWRlcnMpCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoc3JjLT5leHRyYV9oZWFkZXJzKTsKKworICAgICAgc3JjLT5leHRyYV9oZWFkZXJzID0gcyA/IGdzdF9zdHJ1Y3R1cmVfY29weSAocykgOiBOVUxMOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9TT1VQX0xPR19MRVZFTDoKKyAgICAgIHNyYy0+bG9nX2xldmVsID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NPTVBSRVNTOgorICAgICAgc3JjLT5jb21wcmVzcyA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9LRUVQX0FMSVZFOgorICAgICAgc3JjLT5rZWVwX2FsaXZlID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NTTF9TVFJJQ1Q6CisgICAgICBzcmMtPnNzbF9zdHJpY3QgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1NMX0NBX0ZJTEU6CisgICAgICBnX2ZyZWUgKHNyYy0+c3NsX2NhX2ZpbGUpOworICAgICAgc3JjLT5zc2xfY2FfZmlsZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NTTF9VU0VfU1lTVEVNX0NBX0ZJTEU6CisgICAgICBzcmMtPnNzbF91c2Vfc3lzdGVtX2NhX2ZpbGUgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVExTX0RBVEFCQVNFOgorICAgICAgZ19jbGVhcl9vYmplY3QgKCZzcmMtPnRsc19kYXRhYmFzZSk7CisgICAgICBzcmMtPnRsc19kYXRhYmFzZSA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RMU19JTlRFUkFDVElPTjoKKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmc3JjLT50bHNfaW50ZXJhY3Rpb24pOworICAgICAgc3JjLT50bHNfaW50ZXJhY3Rpb24gPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRVRSSUVTOgorICAgICAgc3JjLT5tYXhfcmV0cmllcyA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01FVEhPRDoKKyAgICAgIGdfZnJlZSAoc3JjLT5tZXRob2QpOworICAgICAgc3JjLT5tZXRob2QgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK2RvbmU6CisgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zb3VwX2h0dHBfc3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTb3VwSFRUUFNyYyAqc3JjID0gR1NUX1NPVVBfSFRUUF9TUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xPQ0FUSU9OOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc3JjLT5sb2NhdGlvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFUl9BR0VOVDoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNyYy0+dXNlcl9hZ2VudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQVVUT01BVElDX1JFRElSRUNUOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNyYy0+YXV0b21hdGljX3JlZGlyZWN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9YWToKKyAgICAgIGlmIChzcmMtPnByb3h5ID09IE5VTEwpCisgICAgICAgIGdfdmFsdWVfc2V0X3N0YXRpY19zdHJpbmcgKHZhbHVlLCAiIik7CisgICAgICBlbHNlIHsKKyAgICAgICAgY2hhciAqcHJveHkgPSBzb3VwX3VyaV90b19zdHJpbmcgKHNyYy0+cHJveHksIEZBTFNFKTsKKworICAgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBwcm94eSk7CisgICAgICAgIGdfZnJlZSAocHJveHkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NPT0tJRVM6CisgICAgICBnX3ZhbHVlX3NldF9ib3hlZCAodmFsdWUsIGdfc3RyZHVwdiAoc3JjLT5jb29raWVzKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSVNfTElWRToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBnc3RfYmFzZV9zcmNfaXNfbGl2ZSAoR1NUX0JBU0VfU1JDIChzcmMpKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSVJBRElPX01PREU6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgc3JjLT5pcmFkaW9fbW9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFUl9JRDoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNyYy0+dXNlcl9pZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFUl9QVzoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNyYy0+dXNlcl9wdyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUFJPWFlfSUQ6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzcmMtPnByb3h5X2lkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9YWV9QVzoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNyYy0+cHJveHlfcHcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RJTUVPVVQ6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc3JjLT50aW1lb3V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9FWFRSQV9IRUFERVJTOgorICAgICAgZ3N0X3ZhbHVlX3NldF9zdHJ1Y3R1cmUgKHZhbHVlLCBzcmMtPmV4dHJhX2hlYWRlcnMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NPVVBfTE9HX0xFVkVMOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHNyYy0+bG9nX2xldmVsKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT01QUkVTUzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBzcmMtPmNvbXByZXNzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9LRUVQX0FMSVZFOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNyYy0+a2VlcF9hbGl2ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1NMX1NUUklDVDoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBzcmMtPnNzbF9zdHJpY3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NTTF9DQV9GSUxFOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc3JjLT5zc2xfY2FfZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1NMX1VTRV9TWVNURU1fQ0FfRklMRToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBzcmMtPnNzbF91c2Vfc3lzdGVtX2NhX2ZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RMU19EQVRBQkFTRToKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNyYy0+dGxzX2RhdGFiYXNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UTFNfSU5URVJBQ1RJT046CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBzcmMtPnRsc19pbnRlcmFjdGlvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVUUklFUzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHNyYy0+bWF4X3JldHJpZXMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01FVEhPRDoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNyYy0+bWV0aG9kKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdjaGFyICoKK2dzdF9zb3VwX2h0dHBfc3JjX3VuaWNvZGlmeSAoY29uc3QgZ2NoYXIgKiBzdHIpCit7CisgIGNvbnN0IGdjaGFyICplbnZfdmFyc1tdID0geyAiR1NUX0lDWV9UQUdfRU5DT0RJTkciLAorICAgICJHU1RfVEFHX0VOQ09ESU5HIiwgTlVMTAorICB9OworCisgIHJldHVybiBnc3RfdGFnX2ZyZWVmb3JtX3N0cmluZ190b191dGY4IChzdHIsIC0xLCBlbnZfdmFycyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc291cF9odHRwX3NyY19jYW5jZWxfbWVzc2FnZSAoR3N0U291cEhUVFBTcmMgKiBzcmMpCit7CisgIGdfY2FuY2VsbGFibGVfY2FuY2VsIChzcmMtPmNhbmNlbGxhYmxlKTsKKyAgZ19jb25kX3NpZ25hbCAoJnNyYy0+aGF2ZV9oZWFkZXJzX2NvbmQpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zb3VwX2h0dHBfc3JjX2FkZF9yYW5nZV9oZWFkZXIgKEdzdFNvdXBIVFRQU3JjICogc3JjLCBndWludDY0IG9mZnNldCwKKyAgICBndWludDY0IHN0b3Bfb2Zmc2V0KQoreworICBnY2hhciBidWZbNjRdOworICBnaW50IHJjOworCisgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX3JlbW92ZSAoc3JjLT5tc2ctPnJlcXVlc3RfaGVhZGVycywgIlJhbmdlIik7CisgIGlmIChvZmZzZXQgfHwgc3RvcF9vZmZzZXQgIT0gLTEpIHsKKyAgICBpZiAoc3RvcF9vZmZzZXQgIT0gLTEpIHsKKyAgICAgIGdfYXNzZXJ0IChvZmZzZXQgIT0gc3RvcF9vZmZzZXQpOworCisgICAgICByYyA9IGdfc25wcmludGYgKGJ1Ziwgc2l6ZW9mIChidWYpLCAiYnl0ZXM9JSIgR19HVUlOVDY0X0ZPUk1BVCAiLSUiCisgICAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgb2Zmc2V0LCAoc3RvcF9vZmZzZXQgPiAwKSA/IHN0b3Bfb2Zmc2V0IC0gMSA6CisgICAgICAgICAgc3RvcF9vZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICByYyA9IGdfc25wcmludGYgKGJ1Ziwgc2l6ZW9mIChidWYpLCAiYnl0ZXM9JSIgR19HVUlOVDY0X0ZPUk1BVCAiLSIsCisgICAgICAgICAgb2Zmc2V0KTsKKyAgICB9CisgICAgaWYgKHJjID4gc2l6ZW9mIChidWYpIHx8IHJjIDwgMCkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBzb3VwX21lc3NhZ2VfaGVhZGVyc19hcHBlbmQgKHNyYy0+bXNnLT5yZXF1ZXN0X2hlYWRlcnMsICJSYW5nZSIsIGJ1Zik7CisgIH0KKyAgc3JjLT5yZWFkX3Bvc2l0aW9uID0gb2Zmc2V0OworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitfYXBwZW5kX2V4dHJhX2hlYWRlciAoR1F1YXJrIGZpZWxkX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RTb3VwSFRUUFNyYyAqc3JjID0gR1NUX1NPVVBfSFRUUF9TUkMgKHVzZXJfZGF0YSk7CisgIGNvbnN0IGdjaGFyICpmaWVsZF9uYW1lID0gZ19xdWFya190b19zdHJpbmcgKGZpZWxkX2lkKTsKKyAgZ2NoYXIgKmZpZWxkX2NvbnRlbnQgPSBOVUxMOworCisgIGlmIChHX1ZBTFVFX1RZUEUgKHZhbHVlKSA9PSBHX1RZUEVfU1RSSU5HKSB7CisgICAgZmllbGRfY29udGVudCA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICB9IGVsc2UgeworICAgIEdWYWx1ZSBkZXN0ID0geyAwLCB9OworCisgICAgZ192YWx1ZV9pbml0ICgmZGVzdCwgR19UWVBFX1NUUklORyk7CisgICAgaWYgKGdfdmFsdWVfdHJhbnNmb3JtICh2YWx1ZSwgJmRlc3QpKSB7CisgICAgICBmaWVsZF9jb250ZW50ID0gZ192YWx1ZV9kdXBfc3RyaW5nICgmZGVzdCk7CisgICAgfQorICB9CisKKyAgaWYgKGZpZWxkX2NvbnRlbnQgPT0gTlVMTCkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNyYywgImV4dHJhLWhlYWRlcnMgZmllbGQgJyVzJyBjb250YWlucyBubyB2YWx1ZSAiCisgICAgICAgICJvciBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmciLCBmaWVsZF9uYW1lKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJBcHBlbmRpbmcgZXh0cmEgaGVhZGVyOiBcIiVzOiAlc1wiIiwgZmllbGRfbmFtZSwKKyAgICAgIGZpZWxkX2NvbnRlbnQpOworICBzb3VwX21lc3NhZ2VfaGVhZGVyc19hcHBlbmQgKHNyYy0+bXNnLT5yZXF1ZXN0X2hlYWRlcnMsIGZpZWxkX25hbWUsCisgICAgICBmaWVsZF9jb250ZW50KTsKKworICBnX2ZyZWUgKGZpZWxkX2NvbnRlbnQpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK19hcHBlbmRfZXh0cmFfaGVhZGVycyAoR1F1YXJrIGZpZWxkX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGlmIChHX1ZBTFVFX1RZUEUgKHZhbHVlKSA9PSBHU1RfVFlQRV9BUlJBWSkgeworICAgIGd1aW50IG4gPSBnc3RfdmFsdWVfYXJyYXlfZ2V0X3NpemUgKHZhbHVlKTsKKyAgICBndWludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgY29uc3QgR1ZhbHVlICp2ID0gZ3N0X3ZhbHVlX2FycmF5X2dldF92YWx1ZSAodmFsdWUsIGkpOworCisgICAgICBpZiAoIV9hcHBlbmRfZXh0cmFfaGVhZGVyIChmaWVsZF9pZCwgdiwgdXNlcl9kYXRhKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfSBlbHNlIGlmIChHX1ZBTFVFX1RZUEUgKHZhbHVlKSA9PSBHU1RfVFlQRV9MSVNUKSB7CisgICAgZ3VpbnQgbiA9IGdzdF92YWx1ZV9saXN0X2dldF9zaXplICh2YWx1ZSk7CisgICAgZ3VpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIGNvbnN0IEdWYWx1ZSAqdiA9IGdzdF92YWx1ZV9saXN0X2dldF92YWx1ZSAodmFsdWUsIGkpOworCisgICAgICBpZiAoIV9hcHBlbmRfZXh0cmFfaGVhZGVyIChmaWVsZF9pZCwgdiwgdXNlcl9kYXRhKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gX2FwcGVuZF9leHRyYV9oZWFkZXIgKGZpZWxkX2lkLCB2YWx1ZSwgdXNlcl9kYXRhKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NvdXBfaHR0cF9zcmNfYWRkX2V4dHJhX2hlYWRlcnMgKEdzdFNvdXBIVFRQU3JjICogc3JjKQoreworICBpZiAoIXNyYy0+ZXh0cmFfaGVhZGVycykKKyAgICByZXR1cm4gVFJVRTsKKworICByZXR1cm4gZ3N0X3N0cnVjdHVyZV9mb3JlYWNoIChzcmMtPmV4dHJhX2hlYWRlcnMsIF9hcHBlbmRfZXh0cmFfaGVhZGVycywgc3JjKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc291cF9odHRwX3NyY19zZXNzaW9uX29wZW4gKEdzdFNvdXBIVFRQU3JjICogc3JjKQoreworICBpZiAoc3JjLT5zZXNzaW9uKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiU2Vzc2lvbiBpcyBhbHJlYWR5IG9wZW4iKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGlmICghc3JjLT5sb2NhdGlvbikgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBPUEVOX1JFQUQsIChfKCJObyBVUkwgc2V0LiIpKSwKKyAgICAgICAgKCJNaXNzaW5nIGxvY2F0aW9uIHByb3BlcnR5IikpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmICghc3JjLT5zZXNzaW9uKSB7CisgICAgR3N0UXVlcnkgKnF1ZXJ5OworICAgIGdib29sZWFuIGNhbl9zaGFyZSA9IChzcmMtPnRpbWVvdXQgPT0gREVGQVVMVF9USU1FT1VUKQorICAgICAgICAmJiAoc3JjLT5zc2xfc3RyaWN0ID09IERFRkFVTFRfU1NMX1NUUklDVCkKKyAgICAgICAgJiYgKHNyYy0+dGxzX2ludGVyYWN0aW9uID09IE5VTEwpICYmIChzcmMtPnByb3h5ID09IE5VTEwpCisgICAgICAgICYmIChzcmMtPnRsc19kYXRhYmFzZSA9PSBERUZBVUxUX1RMU19EQVRBQkFTRSkKKyAgICAgICAgJiYgKHNyYy0+c3NsX2NhX2ZpbGUgPT0gREVGQVVMVF9TU0xfQ0FfRklMRSkKKyAgICAgICAgJiYgKHNyYy0+c3NsX3VzZV9zeXN0ZW1fY2FfZmlsZSA9PSBERUZBVUxUX1NTTF9VU0VfU1lTVEVNX0NBX0ZJTEUpOworCisgICAgcXVlcnkgPSBnc3RfcXVlcnlfbmV3X2NvbnRleHQgKEdTVF9TT1VQX1NFU1NJT05fQ09OVEVYVCk7CisgICAgaWYgKGdzdF9wYWRfcGVlcl9xdWVyeSAoR1NUX0JBU0VfU1JDX1BBRCAoc3JjKSwgcXVlcnkpKSB7CisgICAgICBHc3RDb250ZXh0ICpjb250ZXh0OworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY29udGV4dCAocXVlcnksICZjb250ZXh0KTsKKyAgICAgIGdzdF9lbGVtZW50X3NldF9jb250ZXh0IChHU1RfRUxFTUVOVF9DQVNUIChzcmMpLCBjb250ZXh0KTsKKyAgICB9IGVsc2UgeworICAgICAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKworICAgICAgbWVzc2FnZSA9CisgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X25lZWRfY29udGV4dCAoR1NUX09CSkVDVF9DQVNUIChzcmMpLAorICAgICAgICAgIEdTVF9TT1VQX1NFU1NJT05fQ09OVEVYVCk7CisgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHNyYyksIG1lc3NhZ2UpOworICAgIH0KKyAgICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKworICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3JjKTsKKyAgICBpZiAoc3JjLT5leHRlcm5hbF9zZXNzaW9uICYmIChjYW5fc2hhcmUgfHwgc3JjLT5mb3JjZWRfZXh0ZXJuYWxfc2Vzc2lvbikpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIlVzaW5nIGV4dGVybmFsIHNlc3Npb24gJXAiLAorICAgICAgICAgIHNyYy0+ZXh0ZXJuYWxfc2Vzc2lvbik7CisgICAgICBzcmMtPnNlc3Npb24gPSBnX29iamVjdF9yZWYgKHNyYy0+ZXh0ZXJuYWxfc2Vzc2lvbik7CisgICAgICBzcmMtPnNlc3Npb25faXNfc2hhcmVkID0gVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiQ3JlYXRpbmcgc2Vzc2lvbiAoY2FuIHNoYXJlICVkKSIsIGNhbl9zaGFyZSk7CisKKyAgICAgIC8qIFdlIGV4cGxpY2l0bHkgc2V0IFVzZXItQWdlbnQgdG8gTlVMTCBoZXJlIGFuZCBvdmVyd3JpdGUgaXQgcGVyIG1lc3NhZ2UKKyAgICAgICAqIHRvIGJlIGFibGUgdG8gaGF2ZSB0aGUgc2FtZSBzZXNzaW9uIHdpdGggZGlmZmVyZW50IFVzZXItQWdlbnRzIHBlcgorICAgICAgICogc291cmNlICovCisgICAgICBpZiAoc3JjLT5wcm94eSA9PSBOVUxMKSB7CisgICAgICAgIHNyYy0+c2Vzc2lvbiA9CisgICAgICAgICAgICBzb3VwX3Nlc3Npb25fbmV3X3dpdGhfb3B0aW9ucyAoU09VUF9TRVNTSU9OX1VTRVJfQUdFTlQsCisgICAgICAgICAgICBOVUxMLCBTT1VQX1NFU1NJT05fVElNRU9VVCwgc3JjLT50aW1lb3V0LAorICAgICAgICAgICAgU09VUF9TRVNTSU9OX1NTTF9TVFJJQ1QsIHNyYy0+c3NsX3N0cmljdCwKKyAgICAgICAgICAgIFNPVVBfU0VTU0lPTl9UTFNfSU5URVJBQ1RJT04sIHNyYy0+dGxzX2ludGVyYWN0aW9uLCBOVUxMKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyYy0+c2Vzc2lvbiA9CisgICAgICAgICAgICBzb3VwX3Nlc3Npb25fbmV3X3dpdGhfb3B0aW9ucyAoU09VUF9TRVNTSU9OX1BST1hZX1VSSSwgc3JjLT5wcm94eSwKKyAgICAgICAgICAgIFNPVVBfU0VTU0lPTl9USU1FT1VULCBzcmMtPnRpbWVvdXQsCisgICAgICAgICAgICBTT1VQX1NFU1NJT05fU1NMX1NUUklDVCwgc3JjLT5zc2xfc3RyaWN0LAorICAgICAgICAgICAgU09VUF9TRVNTSU9OX1VTRVJfQUdFTlQsIE5VTEwsCisgICAgICAgICAgICBTT1VQX1NFU1NJT05fVExTX0lOVEVSQUNUSU9OLCBzcmMtPnRsc19pbnRlcmFjdGlvbiwgTlVMTCk7CisgICAgICB9CisKKyAgICAgIGlmIChzcmMtPnNlc3Npb24pIHsKKyAgICAgICAgZ3N0X3NvdXBfdXRpbF9sb2dfc2V0dXAgKHNyYy0+c2Vzc2lvbiwgc3JjLT5sb2dfbGV2ZWwsCisgICAgICAgICAgICBHU1RfRUxFTUVOVCAoc3JjKSk7CisgICAgICAgIHNvdXBfc2Vzc2lvbl9hZGRfZmVhdHVyZV9ieV90eXBlIChzcmMtPnNlc3Npb24sCisgICAgICAgICAgICBTT1VQX1RZUEVfQ09OVEVOVF9ERUNPREVSKTsKKyAgICAgICAgc291cF9zZXNzaW9uX2FkZF9mZWF0dXJlX2J5X3R5cGUgKHNyYy0+c2Vzc2lvbiwgU09VUF9UWVBFX0NPT0tJRV9KQVIpOworCisgICAgICAgIGlmIChjYW5fc2hhcmUpIHsKKyAgICAgICAgICBHc3RDb250ZXh0ICpjb250ZXh0OworICAgICAgICAgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisgICAgICAgICAgR3N0U3RydWN0dXJlICpzOworCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiU2hhcmluZyBzZXNzaW9uICVwIiwgc3JjLT5zZXNzaW9uKTsKKyAgICAgICAgICBzcmMtPnNlc3Npb25faXNfc2hhcmVkID0gVFJVRTsKKworICAgICAgICAgIC8qIFVuc2V0IHRoZSBsaW1pdCB0aGUgbnVtYmVyIG9mIG1heGltdW0gYWxsb3dlZCBjb25uZWN0aW9uICovCisgICAgICAgICAgZ19vYmplY3Rfc2V0IChzcmMtPnNlc3Npb24sIFNPVVBfU0VTU0lPTl9NQVhfQ09OTlMsIEdfTUFYSU5ULAorICAgICAgICAgICAgICBTT1VQX1NFU1NJT05fTUFYX0NPTk5TX1BFUl9IT1NULCBHX01BWElOVCwgTlVMTCk7CisKKyAgICAgICAgICBjb250ZXh0ID0gZ3N0X2NvbnRleHRfbmV3IChHU1RfU09VUF9TRVNTSU9OX0NPTlRFWFQsIFRSVUUpOworICAgICAgICAgIHMgPSBnc3RfY29udGV4dF93cml0YWJsZV9zdHJ1Y3R1cmUgKGNvbnRleHQpOworICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAic2Vzc2lvbiIsIFNPVVBfVFlQRV9TRVNTSU9OLCBzcmMtPnNlc3Npb24sCisgICAgICAgICAgICAgICJmb3JjZSIsIEdfVFlQRV9CT09MRUFOLCBGQUxTRSwgTlVMTCk7CisKKyAgICAgICAgICBnc3Rfb2JqZWN0X3JlZiAoc3JjLT5zZXNzaW9uKTsKKyAgICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc3JjKTsKKyAgICAgICAgICBnc3RfZWxlbWVudF9zZXRfY29udGV4dCAoR1NUX0VMRU1FTlRfQ0FTVCAoc3JjKSwgY29udGV4dCk7CisgICAgICAgICAgbWVzc2FnZSA9CisgICAgICAgICAgICAgIGdzdF9tZXNzYWdlX25ld19oYXZlX2NvbnRleHQgKEdTVF9PQkpFQ1RfQ0FTVCAoc3JjKSwgY29udGV4dCk7CisgICAgICAgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChzcmMpLCBtZXNzYWdlKTsKKyAgICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNyYyk7CisgICAgICAgICAgZ3N0X29iamVjdF91bnJlZiAoc3JjLT5zZXNzaW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzcmMtPnNlc3Npb25faXNfc2hhcmVkID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXNyYy0+c2Vzc2lvbikgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgTElCUkFSWSwgSU5JVCwKKyAgICAgICAgICAoTlVMTCksICgiRmFpbGVkIHRvIGNyZWF0ZSBzZXNzaW9uIikpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgZ19zaWduYWxfY29ubmVjdCAoc3JjLT5zZXNzaW9uLCAiYXV0aGVudGljYXRlIiwKKyAgICAgICAgR19DQUxMQkFDSyAoZ3N0X3NvdXBfaHR0cF9zcmNfYXV0aGVudGljYXRlX2NiKSwgc3JjKTsKKworICAgIGlmICghc3JjLT5zZXNzaW9uX2lzX3NoYXJlZCkgeworICAgICAgaWYgKHNyYy0+dGxzX2RhdGFiYXNlKQorICAgICAgICBnX29iamVjdF9zZXQgKHNyYy0+c2Vzc2lvbiwgInRscy1kYXRhYmFzZSIsIHNyYy0+dGxzX2RhdGFiYXNlLCBOVUxMKTsKKyAgICAgIGVsc2UgaWYgKHNyYy0+c3NsX2NhX2ZpbGUpCisgICAgICAgIGdfb2JqZWN0X3NldCAoc3JjLT5zZXNzaW9uLCAic3NsLWNhLWZpbGUiLCBzcmMtPnNzbF9jYV9maWxlLCBOVUxMKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZ19vYmplY3Rfc2V0IChzcmMtPnNlc3Npb24sICJzc2wtdXNlLXN5c3RlbS1jYS1maWxlIiwKKyAgICAgICAgICAgIHNyYy0+c3NsX3VzZV9zeXN0ZW1fY2FfZmlsZSwgTlVMTCk7CisgICAgfQorICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcmMpOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIlJlLXVzaW5nIHNlc3Npb24iKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NvdXBfaHR0cF9zcmNfc2Vzc2lvbl9jbG9zZSAoR3N0U291cEhUVFBTcmMgKiBzcmMpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIkNsb3Npbmcgc2Vzc2lvbiIpOworCisgIGdfbXV0ZXhfbG9jayAoJnNyYy0+bXV0ZXgpOworICBpZiAoc3JjLT5tc2cpIHsKKyAgICBzb3VwX3Nlc3Npb25fY2FuY2VsX21lc3NhZ2UgKHNyYy0+c2Vzc2lvbiwgc3JjLT5tc2csIFNPVVBfU1RBVFVTX0NBTkNFTExFRCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHNyYy0+bXNnKTsKKyAgICBzcmMtPm1zZyA9IE5VTEw7CisgIH0KKworICBpZiAoc3JjLT5zZXNzaW9uKSB7CisgICAgaWYgKCFzcmMtPnNlc3Npb25faXNfc2hhcmVkKQorICAgICAgc291cF9zZXNzaW9uX2Fib3J0IChzcmMtPnNlc3Npb24pOworICAgIGdfc2lnbmFsX2hhbmRsZXJzX2Rpc2Nvbm5lY3RfYnlfZnVuYyAoc3JjLT5zZXNzaW9uLAorICAgICAgICBHX0NBTExCQUNLIChnc3Rfc291cF9odHRwX3NyY19hdXRoZW50aWNhdGVfY2IpLCBzcmMpOworICAgIGdfb2JqZWN0X3VucmVmIChzcmMtPnNlc3Npb24pOworICAgIHNyYy0+c2Vzc2lvbiA9IE5VTEw7CisgIH0KKworICBnX211dGV4X3VubG9jayAoJnNyYy0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NvdXBfaHR0cF9zcmNfYXV0aGVudGljYXRlX2NiIChTb3VwU2Vzc2lvbiAqIHNlc3Npb24sIFNvdXBNZXNzYWdlICogbXNnLAorICAgIFNvdXBBdXRoICogYXV0aCwgZ2Jvb2xlYW4gcmV0cnlpbmcsIEdzdFNvdXBIVFRQU3JjICogc3JjKQoreworICAvKiBNaWdodCBiZSBmcm9tIGFub3RoZXIgdXNlciBvZiB0aGUgc2hhcmVkIHNlc3Npb24gKi8KKyAgaWYgKCFHU1RfSVNfU09VUF9IVFRQX1NSQyAoc3JjKSB8fCBtc2cgIT0gc3JjLT5tc2cpCisgICAgcmV0dXJuOworCisgIGlmICghcmV0cnlpbmcpIHsKKyAgICAvKiBGaXJzdCB0aW1lIGF1dGhlbnRpY2F0aW9uIG9ubHksIGlmIHdlIGZhaWwgYW5kIGFyZSBjYWxsZWQgYWdhaW4gd2l0aCByZXRyeSB0cnVlIGZhbGwgdGhyb3VnaCAqLworICAgIGlmIChtc2ctPnN0YXR1c19jb2RlID09IFNPVVBfU1RBVFVTX1VOQVVUSE9SSVpFRCkgeworICAgICAgaWYgKHNyYy0+dXNlcl9pZCAmJiBzcmMtPnVzZXJfcHcpCisgICAgICAgIHNvdXBfYXV0aF9hdXRoZW50aWNhdGUgKGF1dGgsIHNyYy0+dXNlcl9pZCwgc3JjLT51c2VyX3B3KTsKKyAgICB9IGVsc2UgaWYgKG1zZy0+c3RhdHVzX2NvZGUgPT0gU09VUF9TVEFUVVNfUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQpIHsKKyAgICAgIGlmIChzcmMtPnByb3h5X2lkICYmIHNyYy0+cHJveHlfcHcpCisgICAgICAgIHNvdXBfYXV0aF9hdXRoZW50aWNhdGUgKGF1dGgsIHNyYy0+cHJveHlfaWQsIHNyYy0+cHJveHlfcHcpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAoraW5zZXJ0X2h0dHBfaGVhZGVyIChjb25zdCBnY2hhciAqIG5hbWUsIGNvbnN0IGdjaGFyICogdmFsdWUsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0U3RydWN0dXJlICpoZWFkZXJzID0gdXNlcl9kYXRhOworICBjb25zdCBHVmFsdWUgKmd2OworCisgIGlmICghZ191dGY4X3ZhbGlkYXRlIChuYW1lLCAtMSwgTlVMTCkgfHwgIWdfdXRmOF92YWxpZGF0ZSAodmFsdWUsIC0xLCBOVUxMKSkKKyAgICByZXR1cm47CisKKyAgZ3YgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoaGVhZGVycywgbmFtZSk7CisgIGlmIChndiAmJiBHU1RfVkFMVUVfSE9MRFNfQVJSQVkgKGd2KSkgeworICAgIEdWYWx1ZSB2ID0gR19WQUxVRV9JTklUOworCisgICAgZ192YWx1ZV9pbml0ICgmdiwgR19UWVBFX1NUUklORyk7CisgICAgZ192YWx1ZV9zZXRfc3RyaW5nICgmdiwgdmFsdWUpOworICAgIGdzdF92YWx1ZV9hcnJheV9hcHBlbmRfdmFsdWUgKChHVmFsdWUgKikgZ3YsICZ2KTsKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmdik7CisgIH0gZWxzZSBpZiAoZ3YgJiYgR19WQUxVRV9IT0xEU19TVFJJTkcgKGd2KSkgeworICAgIEdWYWx1ZSBhcnIgPSBHX1ZBTFVFX0lOSVQ7CisgICAgR1ZhbHVlIHYgPSBHX1ZBTFVFX0lOSVQ7CisgICAgY29uc3QgZ2NoYXIgKm9sZF92YWx1ZSA9IGdfdmFsdWVfZ2V0X3N0cmluZyAoZ3YpOworCisgICAgZ192YWx1ZV9pbml0ICgmYXJyLCBHU1RfVFlQRV9BUlJBWSk7CisgICAgZ192YWx1ZV9pbml0ICgmdiwgR19UWVBFX1NUUklORyk7CisgICAgZ192YWx1ZV9zZXRfc3RyaW5nICgmdiwgb2xkX3ZhbHVlKTsKKyAgICBnc3RfdmFsdWVfYXJyYXlfYXBwZW5kX3ZhbHVlICgmYXJyLCAmdik7CisgICAgZ192YWx1ZV9zZXRfc3RyaW5nICgmdiwgdmFsdWUpOworICAgIGdzdF92YWx1ZV9hcnJheV9hcHBlbmRfdmFsdWUgKCZhcnIsICZ2KTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChoZWFkZXJzLCBuYW1lLCAmYXJyKTsKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmdik7CisgICAgZ192YWx1ZV91bnNldCAoJmFycik7CisgIH0gZWxzZSB7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKGhlYWRlcnMsIG5hbWUsIEdfVFlQRV9TVFJJTkcsIHZhbHVlLCBOVUxMKTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NvdXBfaHR0cF9zcmNfZ290X2hlYWRlcnMgKEdzdFNvdXBIVFRQU3JjICogc3JjLCBTb3VwTWVzc2FnZSAqIG1zZykKK3sKKyAgY29uc3QgY2hhciAqdmFsdWU7CisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OworICBHc3RCYXNlU3JjICpiYXNlc3JjOworICBndWludDY0IG5ld3NpemU7CisgIEdIYXNoVGFibGUgKnBhcmFtcyA9IE5VTEw7CisgIEdzdEV2ZW50ICpodHRwX2hlYWRlcnNfZXZlbnQ7CisgIEdzdFN0cnVjdHVyZSAqaHR0cF9oZWFkZXJzLCAqaGVhZGVyczsKKyAgY29uc3QgZ2NoYXIgKmFjY2VwdF9yYW5nZXM7CisKKyAgR1NUX0lORk9fT0JKRUNUIChzcmMsICJnb3QgaGVhZGVycyIpOworCisgIGlmIChtc2ctPnN0YXR1c19jb2RlID09IFNPVVBfU1RBVFVTX1BST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEICYmCisgICAgICBzcmMtPnByb3h5X2lkICYmIHNyYy0+cHJveHlfcHcpIHsKKyAgICAvKiB3YWl0IGZvciBhdXRoZW50aWNhdGUgY2FsbGJhY2sgKi8KKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KKworICBodHRwX2hlYWRlcnMgPSBnc3Rfc3RydWN0dXJlX25ld19lbXB0eSAoImh0dHAtaGVhZGVycyIpOworICBnc3Rfc3RydWN0dXJlX3NldCAoaHR0cF9oZWFkZXJzLCAidXJpIiwgR19UWVBFX1NUUklORywgc3JjLT5sb2NhdGlvbiwKKyAgICAgICJodHRwLXN0YXR1cy1jb2RlIiwgR19UWVBFX1VJTlQsIG1zZy0+c3RhdHVzX2NvZGUsIE5VTEwpOworICBpZiAoc3JjLT5yZWRpcmVjdGlvbl91cmkpCisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKGh0dHBfaGVhZGVycywgInJlZGlyZWN0aW9uLXVyaSIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgIHNyYy0+cmVkaXJlY3Rpb25fdXJpLCBOVUxMKTsKKyAgaGVhZGVycyA9IGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5ICgicmVxdWVzdC1oZWFkZXJzIik7CisgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2ZvcmVhY2ggKG1zZy0+cmVxdWVzdF9oZWFkZXJzLCBpbnNlcnRfaHR0cF9oZWFkZXIsCisgICAgICBoZWFkZXJzKTsKKyAgZ3N0X3N0cnVjdHVyZV9zZXQgKGh0dHBfaGVhZGVycywgInJlcXVlc3QtaGVhZGVycyIsIEdTVF9UWVBFX1NUUlVDVFVSRSwKKyAgICAgIGhlYWRlcnMsIE5VTEwpOworICBnc3Rfc3RydWN0dXJlX2ZyZWUgKGhlYWRlcnMpOworICBoZWFkZXJzID0gZ3N0X3N0cnVjdHVyZV9uZXdfZW1wdHkgKCJyZXNwb25zZS1oZWFkZXJzIik7CisgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2ZvcmVhY2ggKG1zZy0+cmVzcG9uc2VfaGVhZGVycywgaW5zZXJ0X2h0dHBfaGVhZGVyLAorICAgICAgaGVhZGVycyk7CisgIGdzdF9zdHJ1Y3R1cmVfc2V0IChodHRwX2hlYWRlcnMsICJyZXNwb25zZS1oZWFkZXJzIiwgR1NUX1RZUEVfU1RSVUNUVVJFLAorICAgICAgaGVhZGVycywgTlVMTCk7CisgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoaGVhZGVycyk7CisKKyAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChzcmMpLAorICAgICAgZ3N0X21lc3NhZ2VfbmV3X2VsZW1lbnQgKEdTVF9PQkpFQ1RfQ0FTVCAoc3JjKSwKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX2NvcHkgKGh0dHBfaGVhZGVycykpKTsKKworICBpZiAobXNnLT5zdGF0dXNfY29kZSA9PSBTT1VQX1NUQVRVU19VTkFVVEhPUklaRUQpIHsKKyAgICAvKiBmb3JjZSBhbiBlcnJvciAqLworICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoaHR0cF9oZWFkZXJzKTsKKyAgICByZXR1cm4gZ3N0X3NvdXBfaHR0cF9zcmNfcGFyc2Vfc3RhdHVzIChtc2csIHNyYyk7CisgIH0KKworICBzcmMtPmdvdF9oZWFkZXJzID0gVFJVRTsKKyAgZ19jb25kX2Jyb2FkY2FzdCAoJnNyYy0+aGF2ZV9oZWFkZXJzX2NvbmQpOworCisgIGh0dHBfaGVhZGVyc19ldmVudCA9CisgICAgICBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9ET1dOU1RSRUFNX1NUSUNLWSwgaHR0cF9oZWFkZXJzKTsKKyAgZ3N0X2V2ZW50X3JlcGxhY2UgKCZzcmMtPmh0dHBfaGVhZGVyc19ldmVudCwgaHR0cF9oZWFkZXJzX2V2ZW50KTsKKyAgZ3N0X2V2ZW50X3VucmVmIChodHRwX2hlYWRlcnNfZXZlbnQpOworCisgIC8qIFBhcnNlIENvbnRlbnQtTGVuZ3RoLiAqLworICBpZiAoc291cF9tZXNzYWdlX2hlYWRlcnNfZ2V0X2VuY29kaW5nIChtc2ctPnJlc3BvbnNlX2hlYWRlcnMpID09CisgICAgICBTT1VQX0VOQ09ESU5HX0NPTlRFTlRfTEVOR1RIKSB7CisgICAgbmV3c2l6ZSA9IHNyYy0+cmVxdWVzdF9wb3NpdGlvbiArCisgICAgICAgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2dldF9jb250ZW50X2xlbmd0aCAobXNnLT5yZXNwb25zZV9oZWFkZXJzKTsKKyAgICBpZiAoIXNyYy0+aGF2ZV9zaXplIHx8IChzcmMtPmNvbnRlbnRfc2l6ZSAhPSBuZXdzaXplKSkgeworICAgICAgc3JjLT5jb250ZW50X3NpemUgPSBuZXdzaXplOworICAgICAgc3JjLT5oYXZlX3NpemUgPSBUUlVFOworICAgICAgc3JjLT5zZWVrYWJsZSA9IFRSVUU7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzaXplID0gJSIgR19HVUlOVDY0X0ZPUk1BVCwgc3JjLT5jb250ZW50X3NpemUpOworCisgICAgICBiYXNlc3JjID0gR1NUX0JBU0VfU1JDX0NBU1QgKHNyYyk7CisgICAgICBiYXNlc3JjLT5zZWdtZW50LmR1cmF0aW9uID0gc3JjLT5jb250ZW50X3NpemU7CisgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UIChzcmMpLAorICAgICAgICAgIGdzdF9tZXNzYWdlX25ld19kdXJhdGlvbl9jaGFuZ2VkIChHU1RfT0JKRUNUIChzcmMpKSk7CisgICAgfQorICB9CisKKyAgLyogSWYgdGhlIHNlcnZlciByZXBvcnRzIEFjY2VwdC1SYW5nZXM6IG5vbmUgd2UgZG9uJ3QgaGF2ZSB0byB0cnkKKyAgICogZG9pbmcgcmFuZ2UgcmVxdWVzdHMgYXQgYWxsCisgICAqLworICBpZiAoKGFjY2VwdF9yYW5nZXMgPQorICAgICAgICAgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2dldF9vbmUgKG1zZy0+cmVzcG9uc2VfaGVhZGVycywKKyAgICAgICAgICAgICAgIkFjY2VwdC1SYW5nZXMiKSkpIHsKKyAgICBpZiAoZ19hc2NpaV9zdHJjYXNlY21wIChhY2NlcHRfcmFuZ2VzLCAibm9uZSIpID09IDApCisgICAgICBzcmMtPnNlZWthYmxlID0gRkFMU0U7CisgIH0KKworICAvKiBJY2VjYXN0IHN0dWZmICovCisgIHRhZ19saXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKworICBpZiAoKHZhbHVlID0KKyAgICAgICAgICBzb3VwX21lc3NhZ2VfaGVhZGVyc19nZXRfb25lIChtc2ctPnJlc3BvbnNlX2hlYWRlcnMsCisgICAgICAgICAgICAgICJpY3ktbWV0YWludCIpKSAhPSBOVUxMKSB7CisgICAgZ2ludCBpY3lfbWV0YWludDsKKworICAgIGlmIChnX3V0ZjhfdmFsaWRhdGUgKHZhbHVlLCAtMSwgTlVMTCkpIHsKKyAgICAgIGljeV9tZXRhaW50ID0gYXRvaSAodmFsdWUpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJpY3ktbWV0YWludDogJXMgKHBhcnNlZDogJWQpIiwgdmFsdWUsCisgICAgICAgICAgaWN5X21ldGFpbnQpOworICAgICAgaWYgKGljeV9tZXRhaW50ID4gMCkgeworICAgICAgICBpZiAoc3JjLT5zcmNfY2FwcykKKyAgICAgICAgICBnc3RfY2Fwc191bnJlZiAoc3JjLT5zcmNfY2Fwcyk7CisKKyAgICAgICAgc3JjLT5zcmNfY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhcHBsaWNhdGlvbi94LWljeSIsCisgICAgICAgICAgICAibWV0YWRhdGEtaW50ZXJ2YWwiLCBHX1RZUEVfSU5ULCBpY3lfbWV0YWludCwgTlVMTCk7CisKKyAgICAgICAgZ3N0X2Jhc2Vfc3JjX3NldF9jYXBzIChHU1RfQkFTRV9TUkMgKHNyYyksIHNyYy0+c3JjX2NhcHMpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoKHZhbHVlID0KKyAgICAgICAgICBzb3VwX21lc3NhZ2VfaGVhZGVyc19nZXRfY29udGVudF90eXBlIChtc2ctPnJlc3BvbnNlX2hlYWRlcnMsCisgICAgICAgICAgICAgICZwYXJhbXMpKSAhPSBOVUxMKSB7CisgICAgaWYgKCFnX3V0ZjhfdmFsaWRhdGUgKHZhbHVlLCAtMSwgTlVMTCkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiQ29udGVudC1UeXBlIGlzIGludmFsaWQgVVRGLTgiKTsKKyAgICB9IGVsc2UgaWYgKGdfYXNjaWlfc3RyY2FzZWNtcCAodmFsdWUsICJhdWRpby9MMTYiKSA9PSAwKSB7CisgICAgICBnaW50IGNoYW5uZWxzID0gMjsKKyAgICAgIGdpbnQgcmF0ZSA9IDQ0MTAwOworICAgICAgY2hhciAqcGFyYW07CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIkNvbnRlbnQtVHlwZTogJXMiLCB2YWx1ZSk7CisKKyAgICAgIGlmIChzcmMtPnNyY19jYXBzKSB7CisgICAgICAgIGdzdF9jYXBzX3VucmVmIChzcmMtPnNyY19jYXBzKTsKKyAgICAgICAgc3JjLT5zcmNfY2FwcyA9IE5VTEw7CisgICAgICB9CisKKyAgICAgIHBhcmFtID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAocGFyYW1zLCAiY2hhbm5lbHMiKTsKKyAgICAgIGlmIChwYXJhbSAhPSBOVUxMKSB7CisgICAgICAgIGd1aW50NjQgdmFsID0gZ19hc2NpaV9zdHJ0b3VsbCAocGFyYW0sIE5VTEwsIDEwKTsKKyAgICAgICAgaWYgKHZhbCA8IDY0KQorICAgICAgICAgIGNoYW5uZWxzID0gdmFsOworICAgICAgICBlbHNlCisgICAgICAgICAgY2hhbm5lbHMgPSAwOworICAgICAgfQorCisgICAgICBwYXJhbSA9IGdfaGFzaF90YWJsZV9sb29rdXAgKHBhcmFtcywgInJhdGUiKTsKKyAgICAgIGlmIChwYXJhbSAhPSBOVUxMKSB7CisgICAgICAgIGd1aW50NjQgdmFsID0gZ19hc2NpaV9zdHJ0b3VsbCAocGFyYW0sIE5VTEwsIDEwKTsKKyAgICAgICAgaWYgKHZhbCA8IEdfTUFYSU5UKQorICAgICAgICAgIHJhdGUgPSB2YWw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByYXRlID0gMDsKKyAgICAgIH0KKworICAgICAgaWYgKHJhdGUgPiAwICYmIGNoYW5uZWxzID4gMCkgeworICAgICAgICBzcmMtPnNyY19jYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtdW5hbGlnbmVkLXJhdyIsCisgICAgICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIlMxNkJFIiwKKyAgICAgICAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCAiaW50ZXJsZWF2ZWQiLAorICAgICAgICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgY2hhbm5lbHMsICJyYXRlIiwgR19UWVBFX0lOVCwgcmF0ZSwgTlVMTCk7CisKKyAgICAgICAgZ3N0X2Jhc2Vfc3JjX3NldF9jYXBzIChHU1RfQkFTRV9TUkMgKHNyYyksIHNyYy0+c3JjX2NhcHMpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJDb250ZW50LVR5cGU6ICVzIiwgdmFsdWUpOworCisgICAgICAvKiBTZXQgdGhlIENvbnRlbnQtVHlwZSBmaWVsZCBvbiB0aGUgY2FwcyAqLworICAgICAgaWYgKHNyYy0+c3JjX2NhcHMpIHsKKyAgICAgICAgc3JjLT5zcmNfY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKHNyYy0+c3JjX2NhcHMpOworICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChzcmMtPnNyY19jYXBzLCAiY29udGVudC10eXBlIiwgR19UWVBFX1NUUklORywKKyAgICAgICAgICAgIHZhbHVlLCBOVUxMKTsKKyAgICAgICAgZ3N0X2Jhc2Vfc3JjX3NldF9jYXBzIChHU1RfQkFTRV9TUkMgKHNyYyksIHNyYy0+c3JjX2NhcHMpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChwYXJhbXMgIT0gTlVMTCkKKyAgICBnX2hhc2hfdGFibGVfZGVzdHJveSAocGFyYW1zKTsKKworICBpZiAoKHZhbHVlID0KKyAgICAgICAgICBzb3VwX21lc3NhZ2VfaGVhZGVyc19nZXRfb25lIChtc2ctPnJlc3BvbnNlX2hlYWRlcnMsCisgICAgICAgICAgICAgICJpY3ktbmFtZSIpKSAhPSBOVUxMKSB7CisgICAgaWYgKGdfdXRmOF92YWxpZGF0ZSAodmFsdWUsIC0xLCBOVUxMKSkgeworICAgICAgZ19mcmVlIChzcmMtPmlyYWRpb19uYW1lKTsKKyAgICAgIHNyYy0+aXJhZGlvX25hbWUgPSBnc3Rfc291cF9odHRwX3NyY191bmljb2RpZnkgKHZhbHVlKTsKKyAgICAgIGlmIChzcmMtPmlyYWRpb19uYW1lKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ19saXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIEdTVF9UQUdfT1JHQU5JWkFUSU9OLAorICAgICAgICAgICAgc3JjLT5pcmFkaW9fbmFtZSwgTlVMTCk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmICgodmFsdWUgPQorICAgICAgICAgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2dldF9vbmUgKG1zZy0+cmVzcG9uc2VfaGVhZGVycywKKyAgICAgICAgICAgICAgImljeS1nZW5yZSIpKSAhPSBOVUxMKSB7CisgICAgaWYgKGdfdXRmOF92YWxpZGF0ZSAodmFsdWUsIC0xLCBOVUxMKSkgeworICAgICAgZ19mcmVlIChzcmMtPmlyYWRpb19nZW5yZSk7CisgICAgICBzcmMtPmlyYWRpb19nZW5yZSA9IGdzdF9zb3VwX2h0dHBfc3JjX3VuaWNvZGlmeSAodmFsdWUpOworICAgICAgaWYgKHNyYy0+aXJhZGlvX2dlbnJlKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ19saXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIEdTVF9UQUdfR0VOUkUsCisgICAgICAgICAgICBzcmMtPmlyYWRpb19nZW5yZSwgTlVMTCk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmICgodmFsdWUgPSBzb3VwX21lc3NhZ2VfaGVhZGVyc19nZXRfb25lIChtc2ctPnJlc3BvbnNlX2hlYWRlcnMsICJpY3ktdXJsIikpCisgICAgICAhPSBOVUxMKSB7CisgICAgaWYgKGdfdXRmOF92YWxpZGF0ZSAodmFsdWUsIC0xLCBOVUxMKSkgeworICAgICAgZ19mcmVlIChzcmMtPmlyYWRpb191cmwpOworICAgICAgc3JjLT5pcmFkaW9fdXJsID0gZ3N0X3NvdXBfaHR0cF9zcmNfdW5pY29kaWZ5ICh2YWx1ZSk7CisgICAgICBpZiAoc3JjLT5pcmFkaW9fdXJsKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ19saXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIEdTVF9UQUdfTE9DQVRJT04sCisgICAgICAgICAgICBzcmMtPmlyYWRpb191cmwsIE5VTEwpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoIWdzdF90YWdfbGlzdF9pc19lbXB0eSAodGFnX2xpc3QpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLAorICAgICAgICAiY2FsbGluZyBnc3RfZWxlbWVudF9mb3VuZF90YWdzIHdpdGggJSIgR1NUX1BUUl9GT1JNQVQsIHRhZ19saXN0KTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKEdTVF9CQVNFX1NSQ19QQUQgKHNyYyksIGdzdF9ldmVudF9uZXdfdGFnICh0YWdfbGlzdCkpOworICB9IGVsc2UgeworICAgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworICB9CisKKyAgLyogSGFuZGxlIEhUVFAgZXJyb3JzLiAqLworICByZXR1cm4gZ3N0X3NvdXBfaHR0cF9zcmNfcGFyc2Vfc3RhdHVzIChtc2csIHNyYyk7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3NvdXBfaHR0cF9zcmNfYWxsb2NfYnVmZmVyIChHc3RTb3VwSFRUUFNyYyAqIHNyYykKK3sKKyAgR3N0QmFzZVNyYyAqYmFzZXNyYyA9IEdTVF9CQVNFX1NSQ19DQVNUIChzcmMpOworICBHc3RGbG93UmV0dXJuIHJjOworICBHc3RCdWZmZXIgKmdzdGJ1ZjsKKworICByYyA9IEdTVF9CQVNFX1NSQ19DTEFTUyAocGFyZW50X2NsYXNzKS0+YWxsb2MgKGJhc2VzcmMsIC0xLAorICAgICAgYmFzZXNyYy0+YmxvY2tzaXplLCAmZ3N0YnVmKTsKKyAgaWYgKEdfVU5MSUtFTFkgKHJjICE9IEdTVF9GTE9XX09LKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIGdzdGJ1ZjsKK30KKworI2RlZmluZSBTT1VQX0hUVFBfU1JDX0VSUk9SKHNyYyxzb3VwX21zZyxjYXQsY29kZSxlcnJvcl9tZXNzYWdlKSAgICAgXAorICBkbyB7IFwKKyAgICBHU1RfRUxFTUVOVF9FUlJPUl9XSVRIX0RFVEFJTFMgKChzcmMpLCBjYXQsIGNvZGUsICgiJXMiLCBlcnJvcl9tZXNzYWdlKSwgXAorICAgICAgICAoIiVzICglZCksIFVSTDogJXMsIFJlZGlyZWN0IHRvOiAlcyIsIChzb3VwX21zZyktPnJlYXNvbl9waHJhc2UsIFwKKyAgICAgICAgICAgIChzb3VwX21zZyktPnN0YXR1c19jb2RlLCAoc3JjKS0+bG9jYXRpb24sIEdTVF9TVFJfTlVMTCAoKHNyYyktPnJlZGlyZWN0aW9uX3VyaSkpLCBcCisgICAgICAgICAgICAoImh0dHAtc3RhdHVzLWNvZGUiLCBHX1RZUEVfVUlOVCwgKHNvdXBfbXNnKS0+c3RhdHVzX2NvZGUsIFwKKyAgICAgICAgICAgICAiaHR0cC1yZWRpcmVjdC11cmkiLCBHX1RZUEVfU1RSSU5HLCBHU1RfU1RSX05VTEwgKChzcmMpLT5yZWRpcmVjdGlvbl91cmkpLCBOVUxMKSk7IFwKKyAgfSB3aGlsZSgwKQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NvdXBfaHR0cF9zcmNfcGFyc2Vfc3RhdHVzIChTb3VwTWVzc2FnZSAqIG1zZywgR3N0U291cEhUVFBTcmMgKiBzcmMpCit7CisgIGlmIChtc2ctPm1ldGhvZCA9PSBTT1VQX01FVEhPRF9IRUFEKSB7CisgICAgaWYgKCFTT1VQX1NUQVRVU19JU19TVUNDRVNTRlVMIChtc2ctPnN0YXR1c19jb2RlKSkKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIklnbm9yaW5nIGVycm9yICVkIGR1cmluZyBIRUFEIHJlcXVlc3QiLAorICAgICAgICAgIG1zZy0+c3RhdHVzX2NvZGUpOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorCisgIGlmIChTT1VQX1NUQVRVU19JU19UUkFOU1BPUlRfRVJST1IgKG1zZy0+c3RhdHVzX2NvZGUpKSB7CisgICAgc3dpdGNoIChtc2ctPnN0YXR1c19jb2RlKSB7CisgICAgICBjYXNlIFNPVVBfU1RBVFVTX0NBTlRfUkVTT0xWRToKKyAgICAgIGNhc2UgU09VUF9TVEFUVVNfQ0FOVF9SRVNPTFZFX1BST1hZOgorICAgICAgICBTT1VQX0hUVFBfU1JDX0VSUk9SIChzcmMsIG1zZywgUkVTT1VSQ0UsIE5PVF9GT1VORCwKKyAgICAgICAgICAgIF8oIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIpKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICAgICAgY2FzZSBTT1VQX1NUQVRVU19DQU5UX0NPTk5FQ1Q6CisgICAgICBjYXNlIFNPVVBfU1RBVFVTX0NBTlRfQ09OTkVDVF9QUk9YWToKKyAgICAgICAgU09VUF9IVFRQX1NSQ19FUlJPUiAoc3JjLCBtc2csIFJFU09VUkNFLCBPUEVOX1JFQUQsCisgICAgICAgICAgICBfKCJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIpKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICAgICAgY2FzZSBTT1VQX1NUQVRVU19TU0xfRkFJTEVEOgorICAgICAgICBTT1VQX0hUVFBfU1JDX0VSUk9SIChzcmMsIG1zZywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwKKyAgICAgICAgICAgIF8oIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iKSk7CisgICAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgICAgIGNhc2UgU09VUF9TVEFUVVNfSU9fRVJST1I6CisgICAgICAgIGlmIChzcmMtPm1heF9yZXRyaWVzID09IC0xIHx8IHNyYy0+cmV0cnlfY291bnQgPCBzcmMtPm1heF9yZXRyaWVzKQorICAgICAgICAgIHJldHVybiBHU1RfRkxPV19DVVNUT01fRVJST1I7CisgICAgICAgIFNPVVBfSFRUUF9TUkNfRVJST1IgKHNyYywgbXNnLCBSRVNPVVJDRSwgUkVBRCwKKyAgICAgICAgICAgIF8oIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gIgorICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkbHkuIikpOworICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgICBjYXNlIFNPVVBfU1RBVFVTX01BTEZPUk1FRDoKKyAgICAgICAgU09VUF9IVFRQX1NSQ19FUlJPUiAoc3JjLCBtc2csIFJFU09VUkNFLCBSRUFELAorICAgICAgICAgICAgXygiU2VydmVyIHNlbnQgYmFkIGRhdGEuIikpOworICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgICBjYXNlIFNPVVBfU1RBVFVTX0NBTkNFTExFRDoKKyAgICAgICAgLyogTm8gZXJyb3IgbWVzc2FnZSB3aGVuIGludGVycnVwdGVkIGJ5IHByb2dyYW0uICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KKworICBpZiAoU09VUF9TVEFUVVNfSVNfQ0xJRU5UX0VSUk9SIChtc2ctPnN0YXR1c19jb2RlKSB8fAorICAgICAgU09VUF9TVEFUVVNfSVNfUkVESVJFQ1RJT04gKG1zZy0+c3RhdHVzX2NvZGUpIHx8CisgICAgICBTT1VQX1NUQVRVU19JU19TRVJWRVJfRVJST1IgKG1zZy0+c3RhdHVzX2NvZGUpKSB7CisgICAgY29uc3QgZ2NoYXIgKnJlYXNvbl9waHJhc2U7CisKKyAgICByZWFzb25fcGhyYXNlID0gbXNnLT5yZWFzb25fcGhyYXNlOworICAgIGlmIChyZWFzb25fcGhyYXNlICYmICFnX3V0ZjhfdmFsaWRhdGUgKHJlYXNvbl9waHJhc2UsIC0xLCBOVUxMKSkgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAoc3JjLCAiSW52YWxpZCBVVEYtOCBpbiByZWFzb24iKTsKKyAgICAgIHJlYXNvbl9waHJhc2UgPSAiKGludmFsaWQpIjsKKyAgICB9CisKKyAgICAvKiBSZXBvcnQgSFRUUCBlcnJvci4gKi8KKworICAgIC8qIHdoZW4gY29udGVudF9zaXplIGlzIHVua25vd24gYW5kIHdlIGhhdmUganVzdCBmaW5pc2hlZCByZWNlaXZpbmcKKyAgICAgKiBhIGJvZHkgbWVzc2FnZSwgcmVxdWVzdHMgdGhhdCBnbyBiZXlvbmQgdGhlIGNvbnRlbnQgbGltaXRzIHdpbGwgcmVzdWx0CisgICAgICogaW4gYW4gZXJyb3IuIEhlcmUgd2UgY29udmVydCB0aG9zZSB0byBFT1MgKi8KKyAgICBpZiAobXNnLT5zdGF0dXNfY29kZSA9PSBTT1VQX1NUQVRVU19SRVFVRVNURURfUkFOR0VfTk9UX1NBVElTRklBQkxFICYmCisgICAgICAgIHNyYy0+aGF2ZV9ib2R5ICYmICFzcmMtPmhhdmVfc2l6ZSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiUmVxdWVzdGVkIHJhbmdlIG91dCBvZiBsaW1pdHMgYW5kIHJlY2VpdmVkIGZ1bGwgIgorICAgICAgICAgICJib2R5LCByZXR1cm5pbmcgRU9TIik7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfRU9TOworICAgIH0KKworICAgIC8qIEZJWE1FOiByZWFzb25fcGhyYXNlIGlzIG5vdCB0cmFuc2xhdGVkIGFuZCBub3Qgc3VpdGFibGUgZm9yIHVzZXIKKyAgICAgKiBlcnJvciBkaWFsb2cgYWNjb3JkaW5nIHRvIGxpYnNvdXAgZG9jdW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBpZiAobXNnLT5zdGF0dXNfY29kZSA9PSBTT1VQX1NUQVRVU19OT1RfRk9VTkQpIHsKKyAgICAgIFNPVVBfSFRUUF9TUkNfRVJST1IgKHNyYywgbXNnLCBSRVNPVVJDRSwgTk9UX0ZPVU5ELCAocmVhc29uX3BocmFzZSkpOworICAgIH0gZWxzZSBpZiAobXNnLT5zdGF0dXNfY29kZSA9PSBTT1VQX1NUQVRVU19VTkFVVEhPUklaRUQKKyAgICAgICAgfHwgbXNnLT5zdGF0dXNfY29kZSA9PSBTT1VQX1NUQVRVU19QQVlNRU5UX1JFUVVJUkVECisgICAgICAgIHx8IG1zZy0+c3RhdHVzX2NvZGUgPT0gU09VUF9TVEFUVVNfRk9SQklEREVOCisgICAgICAgIHx8IG1zZy0+c3RhdHVzX2NvZGUgPT0gU09VUF9TVEFUVVNfUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQpIHsKKyAgICAgIFNPVVBfSFRUUF9TUkNfRVJST1IgKHNyYywgbXNnLCBSRVNPVVJDRSwgTk9UX0FVVEhPUklaRUQsIChyZWFzb25fcGhyYXNlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFNPVVBfSFRUUF9TUkNfRVJST1IgKHNyYywgbXNnLCBSRVNPVVJDRSwgT1BFTl9SRUFELCAocmVhc29uX3BocmFzZSkpOworICAgIH0KKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc291cF9odHRwX3NyY19yZXN0YXJ0ZWRfY2IgKFNvdXBNZXNzYWdlICogbXNnLCBHc3RTb3VwSFRUUFNyYyAqIHNyYykKK3sKKyAgaWYgKHNvdXBfc2Vzc2lvbl93b3VsZF9yZWRpcmVjdCAoc3JjLT5zZXNzaW9uLCBtc2cpKSB7CisgICAgc3JjLT5yZWRpcmVjdGlvbl91cmkgPQorICAgICAgICBzb3VwX3VyaV90b19zdHJpbmcgKHNvdXBfbWVzc2FnZV9nZXRfdXJpIChtc2cpLCBGQUxTRSk7CisgICAgc3JjLT5yZWRpcmVjdGlvbl9wZXJtYW5lbnQgPQorICAgICAgICAobXNnLT5zdGF0dXNfY29kZSA9PSBTT1VQX1NUQVRVU19NT1ZFRF9QRVJNQU5FTlRMWSk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiJXUgcmVkaXJlY3QgdG8gXCIlc1wiIChwZXJtYW5lbnQgJWQpIiwKKyAgICAgICAgbXNnLT5zdGF0dXNfY29kZSwgc3JjLT5yZWRpcmVjdGlvbl91cmksIHNyYy0+cmVkaXJlY3Rpb25fcGVybWFuZW50KTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zb3VwX2h0dHBfc3JjX2J1aWxkX21lc3NhZ2UgKEdzdFNvdXBIVFRQU3JjICogc3JjLCBjb25zdCBnY2hhciAqIG1ldGhvZCkKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNyYy0+bXNnID09IE5VTEwsIEZBTFNFKTsKKworICBzcmMtPm1zZyA9IHNvdXBfbWVzc2FnZV9uZXcgKG1ldGhvZCwgc3JjLT5sb2NhdGlvbik7CisgIGlmICghc3JjLT5tc2cpIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgT1BFTl9SRUFELAorICAgICAgICAoIkVycm9yIHBhcnNpbmcgVVJMLiIpLCAoIlVSTDogJXMiLCBzcmMtPmxvY2F0aW9uKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogRHVwbGljYXRpbmcgdGhlIGRlZmF1bHRzIG9mIGxpYnNvdXAgaGVyZS4gV2UgZG9uJ3Qgd2FudCB0byBzZXQgYQorICAgKiBVc2VyLUFnZW50IGluIHRoZSBzZXNzaW9uIGFzIGVhY2ggc291cmNlIG1pZ2h0IGhhdmUgaXRzIG93biBVc2VyLUFnZW50CisgICAqIHNldCAqLworICBpZiAoIXNyYy0+dXNlcl9hZ2VudCB8fCAhKnNyYy0+dXNlcl9hZ2VudCkgeworICAgIGdjaGFyICp1c2VyX2FnZW50ID0KKyAgICAgICAgZ19zdHJkdXBfcHJpbnRmICgibGlic291cC8ldS4ldS4ldSIsIHNvdXBfZ2V0X21ham9yX3ZlcnNpb24gKCksCisgICAgICAgIHNvdXBfZ2V0X21pbm9yX3ZlcnNpb24gKCksIHNvdXBfZ2V0X21pY3JvX3ZlcnNpb24gKCkpOworICAgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2FwcGVuZCAoc3JjLT5tc2ctPnJlcXVlc3RfaGVhZGVycywgIlVzZXItQWdlbnQiLAorICAgICAgICB1c2VyX2FnZW50KTsKKyAgICBnX2ZyZWUgKHVzZXJfYWdlbnQpOworICB9IGVsc2UgaWYgKGdfc3RyX2hhc19zdWZmaXggKHNyYy0+dXNlcl9hZ2VudCwgIiAiKSkgeworICAgIGdjaGFyICp1c2VyX2FnZW50ID0gZ19zdHJkdXBfcHJpbnRmICgiJXNsaWJzb3VwLyV1LiV1LiV1Iiwgc3JjLT51c2VyX2FnZW50LAorICAgICAgICBzb3VwX2dldF9tYWpvcl92ZXJzaW9uICgpLAorICAgICAgICBzb3VwX2dldF9taW5vcl92ZXJzaW9uICgpLCBzb3VwX2dldF9taWNyb192ZXJzaW9uICgpKTsKKyAgICBzb3VwX21lc3NhZ2VfaGVhZGVyc19hcHBlbmQgKHNyYy0+bXNnLT5yZXF1ZXN0X2hlYWRlcnMsICJVc2VyLUFnZW50IiwKKyAgICAgICAgdXNlcl9hZ2VudCk7CisgICAgZ19mcmVlICh1c2VyX2FnZW50KTsKKyAgfSBlbHNlIHsKKyAgICBzb3VwX21lc3NhZ2VfaGVhZGVyc19hcHBlbmQgKHNyYy0+bXNnLT5yZXF1ZXN0X2hlYWRlcnMsICJVc2VyLUFnZW50IiwKKyAgICAgICAgc3JjLT51c2VyX2FnZW50KTsKKyAgfQorCisgIGlmICghc3JjLT5rZWVwX2FsaXZlKSB7CisgICAgc291cF9tZXNzYWdlX2hlYWRlcnNfYXBwZW5kIChzcmMtPm1zZy0+cmVxdWVzdF9oZWFkZXJzLCAiQ29ubmVjdGlvbiIsCisgICAgICAgICJjbG9zZSIpOworICB9CisgIGlmIChzcmMtPmlyYWRpb19tb2RlKSB7CisgICAgc291cF9tZXNzYWdlX2hlYWRlcnNfYXBwZW5kIChzcmMtPm1zZy0+cmVxdWVzdF9oZWFkZXJzLCAiaWN5LW1ldGFkYXRhIiwKKyAgICAgICAgIjEiKTsKKyAgfQorICBpZiAoc3JjLT5jb29raWVzKSB7CisgICAgZ2NoYXIgKipjb29raWU7CisKKyAgICBmb3IgKGNvb2tpZSA9IHNyYy0+Y29va2llczsgKmNvb2tpZSAhPSBOVUxMOyBjb29raWUrKykgeworICAgICAgc291cF9tZXNzYWdlX2hlYWRlcnNfYXBwZW5kIChzcmMtPm1zZy0+cmVxdWVzdF9oZWFkZXJzLCAiQ29va2llIiwKKyAgICAgICAgICAqY29va2llKTsKKyAgICB9CisgIH0KKworICBpZiAoIXNyYy0+Y29tcHJlc3MpCisgICAgc291cF9tZXNzYWdlX2Rpc2FibGVfZmVhdHVyZSAoc3JjLT5tc2csIFNPVVBfVFlQRV9DT05URU5UX0RFQ09ERVIpOworCisgIHNvdXBfbWVzc2FnZV9zZXRfZmxhZ3MgKHNyYy0+bXNnLCBTT1VQX01FU1NBR0VfT1ZFUldSSVRFX0NIVU5LUyB8CisgICAgICAoc3JjLT5hdXRvbWF0aWNfcmVkaXJlY3QgPyAwIDogU09VUF9NRVNTQUdFX05PX1JFRElSRUNUKSk7CisKKyAgaWYgKHNyYy0+YXV0b21hdGljX3JlZGlyZWN0KSB7CisgICAgZ19zaWduYWxfY29ubmVjdCAoc3JjLT5tc2csICJyZXN0YXJ0ZWQiLAorICAgICAgICBHX0NBTExCQUNLIChnc3Rfc291cF9odHRwX3NyY19yZXN0YXJ0ZWRfY2IpLCBzcmMpOworICB9CisKKyAgZ3N0X3NvdXBfaHR0cF9zcmNfYWRkX3JhbmdlX2hlYWRlciAoc3JjLCBzcmMtPnJlcXVlc3RfcG9zaXRpb24sCisgICAgICBzcmMtPnN0b3BfcG9zaXRpb24pOworCisgIGdzdF9zb3VwX2h0dHBfc3JjX2FkZF9leHRyYV9oZWFkZXJzIChzcmMpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NvdXBfaHR0cF9zcmNfc2VuZF9tZXNzYWdlIChHc3RTb3VwSFRUUFNyYyAqIHNyYykKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzcmMtPm1zZyAhPSBOVUxMLCBHU1RfRkxPV19FUlJPUik7CisKKyAgc3JjLT5pbnB1dF9zdHJlYW0gPQorICAgICAgc291cF9zZXNzaW9uX3NlbmQgKHNyYy0+c2Vzc2lvbiwgc3JjLT5tc2csIHNyYy0+Y2FuY2VsbGFibGUsICZlcnJvcik7CisKKyAgaWYgKGdfY2FuY2VsbGFibGVfaXNfY2FuY2VsbGVkIChzcmMtPmNhbmNlbGxhYmxlKSkgeworICAgIHJldCA9IEdTVF9GTE9XX0ZMVVNISU5HOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIHJldCA9IGdzdF9zb3VwX2h0dHBfc3JjX2dvdF9oZWFkZXJzIChzcmMsIHNyYy0+bXNnKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGlmICghc3JjLT5pbnB1dF9zdHJlYW0pIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJEaWRuJ3QgZ2V0IGFuIGlucHV0IHN0cmVhbTogJXMiLCBlcnJvci0+bWVzc2FnZSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBkb25lOworICB9CisKKyAgaWYgKFNPVVBfU1RBVFVTX0lTX1NVQ0NFU1NGVUwgKHNyYy0+bXNnLT5zdGF0dXNfY29kZSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJTdWNjZXNzZnVsbHkgZ290IGEgcmVwbHkiKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBGSVhNRSAtIGJlIG1vcmUgaGVscGZ1bCB0byBwZW9wbGUgZGVidWdnaW5nICovCisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgIH0KKworZG9uZToKKyAgaWYgKGVycm9yKQorICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NvdXBfaHR0cF9zcmNfZG9fcmVxdWVzdCAoR3N0U291cEhUVFBTcmMgKiBzcmMsIGNvbnN0IGdjaGFyICogbWV0aG9kKQoreworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBpZiAoc3JjLT5tYXhfcmV0cmllcyAhPSAtMSAmJiBzcmMtPnJldHJ5X2NvdW50ID4gc3JjLT5tYXhfcmV0cmllcykgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIk1heCByZXRyaWVzIHJlYWNoZWQiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KKworICBzcmMtPnJldHJ5X2NvdW50Kys7CisgIC8qIEVPUyBpbW1lZGlhdGVseSBpZiB3ZSBoYXZlIGFuIGVtcHR5IHNlZ21lbnQgKi8KKyAgaWYgKHNyYy0+cmVxdWVzdF9wb3NpdGlvbiA9PSBzcmMtPnN0b3BfcG9zaXRpb24pCisgICAgcmV0dXJuIEdTVF9GTE9XX0VPUzsKKworICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiUnVubmluZyByZXF1ZXN0IGZvciBtZXRob2Q6ICVzIiwgbWV0aG9kKTsKKworICAvKiBVcGRhdGUgdGhlIHBvc2l0aW9uIGlmIHdlIGFyZSByZXRyeWluZyAqLworICBpZiAoc3JjLT5tc2cgJiYgc3JjLT5yZXF1ZXN0X3Bvc2l0aW9uID4gMCkgeworICAgIGdzdF9zb3VwX2h0dHBfc3JjX2FkZF9yYW5nZV9oZWFkZXIgKHNyYywgc3JjLT5yZXF1ZXN0X3Bvc2l0aW9uLAorICAgICAgICBzcmMtPnN0b3BfcG9zaXRpb24pOworICB9IGVsc2UgaWYgKHNyYy0+bXNnICYmIHNyYy0+cmVxdWVzdF9wb3NpdGlvbiA9PSAwKQorICAgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX3JlbW92ZSAoc3JjLT5tc2ctPnJlcXVlc3RfaGVhZGVycywgIlJhbmdlIik7CisKKyAgLyogYWRkX3JhbmdlX2hlYWRlcigpIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2Ygc2V0dGluZyByZWFkX3Bvc2l0aW9uIHRvCisgICAqIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24uIFRoaXMgKm5lZWRzKiB0byBiZSBzZXQgcmVnYXJkbGVzcyBvZiBoYXZpbmcKKyAgICogYSBtZXNzYWdlIG9yIG5vdC4gRmFpbHVyZSB0byBkbyBzbyB3b3VsZCByZXN1bHQgaW4gY2FsY3VsYXRpb24gYmVpbmcKKyAgICogZG9uZSB3aXRoIHN0YWxlL3dyb25nIHJlYWQgcG9zaXRpb24gKi8KKyAgc3JjLT5yZWFkX3Bvc2l0aW9uID0gc3JjLT5yZXF1ZXN0X3Bvc2l0aW9uOworCisgIGlmICghc3JjLT5tc2cpIHsKKyAgICBpZiAoIWdzdF9zb3VwX2h0dHBfc3JjX2J1aWxkX21lc3NhZ2UgKHNyYywgbWV0aG9kKSkgeworICAgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICAgIH0KKyAgfQorCisgIGlmIChnX2NhbmNlbGxhYmxlX2lzX2NhbmNlbGxlZCAoc3JjLT5jYW5jZWxsYWJsZSkpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHNyYywgImludGVycnVwdGVkIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICB9CisKKyAgcmV0ID0gZ3N0X3NvdXBfaHR0cF9zcmNfc2VuZF9tZXNzYWdlIChzcmMpOworCisgIC8qIENoZWNrIGlmIFJhbmdlIGhlYWRlciB3YXMgcmVzcGVjdGVkLiAqLworICBpZiAocmV0ID09IEdTVF9GTE9XX09LICYmIHNyYy0+cmVxdWVzdF9wb3NpdGlvbiA+IDAgJiYKKyAgICAgIHNyYy0+bXNnLT5zdGF0dXNfY29kZSAhPSBTT1VQX1NUQVRVU19QQVJUSUFMX0NPTlRFTlQpIHsKKyAgICBzcmMtPnNlZWthYmxlID0gRkFMU0U7CisgICAgR1NUX0VMRU1FTlRfRVJST1JfV0lUSF9ERVRBSUxTIChzcmMsIFJFU09VUkNFLCBTRUVLLAorICAgICAgICAoXygiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iKSksCisgICAgICAgICgiU2VydmVyIGRvZXMgbm90IGFjY2VwdCBSYW5nZSBIVFRQIGhlYWRlciwgVVJMOiAlcywgUmVkaXJlY3QgdG86ICVzIiwKKyAgICAgICAgICAgIHNyYy0+bG9jYXRpb24sIEdTVF9TVFJfTlVMTCAoc3JjLT5yZWRpcmVjdGlvbl91cmkpKSwKKyAgICAgICAgKCJodHRwLXN0YXR1cy1jb2RlIiwgR19UWVBFX1VJTlQsIHNyYy0+bXNnLT5zdGF0dXNfY29kZSwKKyAgICAgICAgICAgICJodHRwLXJlZGlyZWN0aW9uLXVyaSIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICBHU1RfU1RSX05VTEwgKHNyYy0+cmVkaXJlY3Rpb25fdXJpKSwgTlVMTCkpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZSBieXRlc19yZWFkIGlzIGFib3ZlIGEgY2VydGFpbiB0aHJlc2hvbGQgb2YgdGhlIGJsb2Nrc2l6ZSwgaWYKKyAqIHRoYXQgaGFwcGVucyBhIGZldyB0aW1lcyBpbiBhIHJvdywgaW5jcmVhc2UgdGhlIGJsb2Nrc2l6ZTsgRG8gdGhlIHNhbWUgaW4KKyAqIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24gdG8gcmVkdWNlIHRoZSBibG9ja3NpemUuCisgKi8KK3N0YXRpYyB2b2lkCitnc3Rfc291cF9odHRwX3NyY19jaGVja191cGRhdGVfYmxvY2tzaXplIChHc3RTb3VwSFRUUFNyYyAqIHNyYywKKyAgICBnaW50NjQgYnl0ZXNfcmVhZCkKK3sKKyAgZ3VpbnQgYmxvY2tzaXplID0gZ3N0X2Jhc2Vfc3JjX2dldF9ibG9ja3NpemUgKEdTVF9CQVNFX1NSQ19DQVNUIChzcmMpKTsKKworICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiQ2hlY2tpbmcgdG8gdXBkYXRlIGJsb2Nrc2l6ZS4gUmVhZDolIiBHX0dJTlQ2NF9GT1JNQVQKKyAgICAgICIgYmxvY2tzaXplOiV1IiwgYnl0ZXNfcmVhZCwgYmxvY2tzaXplKTsKKworICBpZiAoYnl0ZXNfcmVhZCA+PSBibG9ja3NpemUgKiBHUk9XX0JMT0NLU0laRV9MSU1JVCkgeworICAgIHNyYy0+cmVkdWNlX2Jsb2Nrc2l6ZV9jb3VudCA9IDA7CisgICAgc3JjLT5pbmNyZWFzZV9ibG9ja3NpemVfY291bnQrKzsKKworICAgIGlmIChzcmMtPmluY3JlYXNlX2Jsb2Nrc2l6ZV9jb3VudCA+PSBHUk9XX0JMT0NLU0laRV9DT1VOVCkgeworICAgICAgYmxvY2tzaXplICo9IEdST1dfQkxPQ0tTSVpFX0ZBQ1RPUjsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIkluY3JlYXNlZCBibG9ja3NpemUgdG8gJXUiLCBibG9ja3NpemUpOworICAgICAgZ3N0X2Jhc2Vfc3JjX3NldF9ibG9ja3NpemUgKEdTVF9CQVNFX1NSQ19DQVNUIChzcmMpLCBibG9ja3NpemUpOworICAgICAgc3JjLT5pbmNyZWFzZV9ibG9ja3NpemVfY291bnQgPSAwOworICAgIH0KKyAgfSBlbHNlIGlmIChieXRlc19yZWFkIDwgYmxvY2tzaXplICogUkVEVUNFX0JMT0NLU0laRV9MSU1JVCkgeworICAgIHNyYy0+cmVkdWNlX2Jsb2Nrc2l6ZV9jb3VudCsrOworICAgIHNyYy0+aW5jcmVhc2VfYmxvY2tzaXplX2NvdW50ID0gMDsKKworICAgIGlmIChzcmMtPnJlZHVjZV9ibG9ja3NpemVfY291bnQgPj0gUkVEVUNFX0JMT0NLU0laRV9DT1VOVCkgeworICAgICAgYmxvY2tzaXplICo9IFJFRFVDRV9CTE9DS1NJWkVfRkFDVE9SOworICAgICAgYmxvY2tzaXplID0gTUFYIChibG9ja3NpemUsIHNyYy0+bWluaW11bV9ibG9ja3NpemUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiRGVjcmVhc2VkIGJsb2Nrc2l6ZSB0byAldSIsIGJsb2Nrc2l6ZSk7CisgICAgICBnc3RfYmFzZV9zcmNfc2V0X2Jsb2Nrc2l6ZSAoR1NUX0JBU0VfU1JDX0NBU1QgKHNyYyksIGJsb2Nrc2l6ZSk7CisgICAgICBzcmMtPnJlZHVjZV9ibG9ja3NpemVfY291bnQgPSAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzcmMtPnJlZHVjZV9ibG9ja3NpemVfY291bnQgPSBzcmMtPmluY3JlYXNlX2Jsb2Nrc2l6ZV9jb3VudCA9IDA7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9zb3VwX2h0dHBfc3JjX3VwZGF0ZV9wb3NpdGlvbiAoR3N0U291cEhUVFBTcmMgKiBzcmMsIGdpbnQ2NCBieXRlc19yZWFkKQoreworICBHc3RCYXNlU3JjICpiYXNlc3JjID0gR1NUX0JBU0VfU1JDX0NBU1QgKHNyYyk7CisgIGd1aW50NjQgbmV3X3Bvc2l0aW9uOworCisgIG5ld19wb3NpdGlvbiA9IHNyYy0+cmVhZF9wb3NpdGlvbiArIGJ5dGVzX3JlYWQ7CisgIGlmIChHX0xJS0VMWSAoc3JjLT5yZXF1ZXN0X3Bvc2l0aW9uID09IHNyYy0+cmVhZF9wb3NpdGlvbikpCisgICAgc3JjLT5yZXF1ZXN0X3Bvc2l0aW9uID0gbmV3X3Bvc2l0aW9uOworICBzcmMtPnJlYWRfcG9zaXRpb24gPSBuZXdfcG9zaXRpb247CisKKyAgaWYgKHNyYy0+aGF2ZV9zaXplKSB7CisgICAgaWYgKG5ld19wb3NpdGlvbiA+IHNyYy0+Y29udGVudF9zaXplKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJHb3QgcG9zaXRpb24gcHJldmlvdXMgZXN0aW1hdGVkIGNvbnRlbnQgc2l6ZSAiCisgICAgICAgICAgIiglIiBHX0dJTlQ2NF9GT1JNQVQgIiA+ICUiIEdfR0lOVDY0X0ZPUk1BVCAiKSIsIG5ld19wb3NpdGlvbiwKKyAgICAgICAgICBzcmMtPmNvbnRlbnRfc2l6ZSk7CisgICAgICBzcmMtPmNvbnRlbnRfc2l6ZSA9IG5ld19wb3NpdGlvbjsKKyAgICAgIGJhc2VzcmMtPnNlZ21lbnQuZHVyYXRpb24gPSBzcmMtPmNvbnRlbnRfc2l6ZTsKKyAgICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKHNyYyksCisgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2R1cmF0aW9uX2NoYW5nZWQgKEdTVF9PQkpFQ1QgKHNyYykpKTsKKyAgICB9IGVsc2UgaWYgKG5ld19wb3NpdGlvbiA9PSBzcmMtPmNvbnRlbnRfc2l6ZSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiV2UncmUgRU9TIG5vdyIpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NvdXBfaHR0cF9zcmNfcmVhZF9idWZmZXIgKEdzdFNvdXBIVFRQU3JjICogc3JjLCBHc3RCdWZmZXIgKiogb3V0YnVmKQoreworICBnc3NpemUgcmVhZF9ieXRlczsKKyAgR3N0TWFwSW5mbyBtYXBpbmZvOworICBHc3RCYXNlU3JjICpic3JjOworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBic3JjID0gR1NUX0JBU0VfU1JDX0NBU1QgKHNyYyk7CisKKyAgKm91dGJ1ZiA9IGdzdF9zb3VwX2h0dHBfc3JjX2FsbG9jX2J1ZmZlciAoc3JjKTsKKyAgaWYgKCEqb3V0YnVmKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAoKm91dGJ1ZiwgJm1hcGluZm8sIEdTVF9NQVBfV1JJVEUpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJGYWlsZWQgdG8gbWFwIGJ1ZmZlciIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIHJlYWRfYnl0ZXMgPQorICAgICAgZ19pbnB1dF9zdHJlYW1fcmVhZCAoc3JjLT5pbnB1dF9zdHJlYW0sIG1hcGluZm8uZGF0YSwgbWFwaW5mby5zaXplLAorICAgICAgc3JjLT5jYW5jZWxsYWJsZSwgTlVMTCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIlJlYWQgJSIgR19HU1NJWkVfRk9STUFUICIgYnl0ZXMgZnJvbSBodHRwIGlucHV0IiwKKyAgICAgIHJlYWRfYnl0ZXMpOworCisgIGdfbXV0ZXhfbG9jayAoJnNyYy0+bXV0ZXgpOworICBpZiAoZ19jYW5jZWxsYWJsZV9pc19jYW5jZWxsZWQgKHNyYy0+Y2FuY2VsbGFibGUpKSB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoKm91dGJ1ZiwgJm1hcGluZm8pOworICAgIGdzdF9idWZmZXJfdW5yZWYgKCpvdXRidWYpOworICAgIGdfbXV0ZXhfdW5sb2NrICgmc3JjLT5tdXRleCk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICB9CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoKm91dGJ1ZiwgJm1hcGluZm8pOworICBpZiAocmVhZF9ieXRlcyA+IDApIHsKKyAgICBnc3RfYnVmZmVyX3NldF9zaXplICgqb3V0YnVmLCByZWFkX2J5dGVzKTsKKyAgICBHU1RfQlVGRkVSX09GRlNFVCAoKm91dGJ1ZikgPSBic3JjLT5zZWdtZW50LnBvc2l0aW9uOworICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgIGdzdF9zb3VwX2h0dHBfc3JjX3VwZGF0ZV9wb3NpdGlvbiAoc3JjLCByZWFkX2J5dGVzKTsKKworICAgIC8qIEdvdCBzb21lIGRhdGEsIHJlc2V0IHJldHJ5IGNvdW50ZXIgKi8KKyAgICBzcmMtPnJldHJ5X2NvdW50ID0gMDsKKworICAgIGdzdF9zb3VwX2h0dHBfc3JjX2NoZWNrX3VwZGF0ZV9ibG9ja3NpemUgKHNyYywgcmVhZF9ieXRlcyk7CisKKyAgICAvKiBJZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIGEgcmFuZ2UgcmVxdWVzdCwgcmVhZCBhZ2FpbiB0byBsZXQgbGlic291cAorICAgICAqIGZpbmFsaXplIHRoZSByZXF1ZXN0LiBUaGlzIGFsbG93cyB0byByZXVzZSB0aGUgY29ubmVjdGlvbiBhZ2FpbiBsYXRlciwKKyAgICAgKiBvdGhlcndpc2Ugd2Ugd291bGQgaGF2ZSB0byBjYW5jZWwgdGhlIG1lc3NhZ2UgYW5kIGNsb3NlIHRoZSBjb25uZWN0aW9uCisgICAgICovCisgICAgaWYgKGJzcmMtPnNlZ21lbnQuc3RvcCAhPSAtMQorICAgICAgICAmJiBic3JjLT5zZWdtZW50LnBvc2l0aW9uICsgcmVhZF9ieXRlcyA+PSBic3JjLT5zZWdtZW50LnN0b3ApIHsKKyAgICAgIGd1aW50OCB0bXBbMTI4XTsKKworICAgICAgZ19vYmplY3RfdW5yZWYgKHNyYy0+bXNnKTsKKyAgICAgIHNyYy0+bXNnID0gTlVMTDsKKyAgICAgIHNyYy0+aGF2ZV9ib2R5ID0gVFJVRTsKKworICAgICAgLyogVGhpcyBzaG91bGQgcmV0dXJuIGltbWVkaWF0ZWx5IGFzIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIHJhbmdlICovCisgICAgICByZWFkX2J5dGVzID0KKyAgICAgICAgICBnX2lucHV0X3N0cmVhbV9yZWFkIChzcmMtPmlucHV0X3N0cmVhbSwgdG1wLCBzaXplb2YgKHRtcCksCisgICAgICAgICAgc3JjLT5jYW5jZWxsYWJsZSwgTlVMTCk7CisgICAgICBpZiAocmVhZF9ieXRlcyA+IDApCisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNyYywKKyAgICAgICAgICAgICJSZWFkICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMgYWZ0ZXIgZW5kIG9mIHJhbmdlIiwgcmVhZF9ieXRlcyk7CisgICAgfQorICB9IGVsc2UgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKCpvdXRidWYpOworICAgIGlmIChyZWFkX2J5dGVzIDwgMCB8fAorICAgICAgICAoc3JjLT5oYXZlX3NpemUgJiYgc3JjLT5yZWFkX3Bvc2l0aW9uIDwgc3JjLT5jb250ZW50X3NpemUpKSB7CisgICAgICAvKiBNYXliZSB0aGUgc2VydmVyIGRpc2Nvbm5lY3RlZCwgcmV0cnkgKi8KKyAgICAgIHJldCA9IEdTVF9GTE9XX0NVU1RPTV9FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgZ19vYmplY3RfdW5yZWYgKHNyYy0+bXNnKTsKKyAgICAgIHNyYy0+bXNnID0gTlVMTDsKKyAgICAgIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgICAgIHNyYy0+aGF2ZV9ib2R5ID0gVFJVRTsKKyAgICB9CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZzcmMtPm11dGV4KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NvdXBfaHR0cF9zcmNfY3JlYXRlIChHc3RQdXNoU3JjICogcHNyYywgR3N0QnVmZmVyICoqIG91dGJ1ZikKK3sKKyAgR3N0U291cEhUVFBTcmMgKnNyYzsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0RXZlbnQgKmh0dHBfaGVhZGVyc19ldmVudCA9IE5VTEw7CisKKyAgc3JjID0gR1NUX1NPVVBfSFRUUF9TUkMgKHBzcmMpOworCityZXRyeToKKyAgZ19tdXRleF9sb2NrICgmc3JjLT5tdXRleCk7CisKKyAgLyogQ2hlY2sgZm9yIHBlbmRpbmcgcG9zaXRpb24gY2hhbmdlICovCisgIGlmIChzcmMtPnJlcXVlc3RfcG9zaXRpb24gIT0gc3JjLT5yZWFkX3Bvc2l0aW9uKSB7CisgICAgaWYgKHNyYy0+aW5wdXRfc3RyZWFtKSB7CisgICAgICBnX2lucHV0X3N0cmVhbV9jbG9zZSAoc3JjLT5pbnB1dF9zdHJlYW0sIHNyYy0+Y2FuY2VsbGFibGUsIE5VTEwpOworICAgICAgZ19vYmplY3RfdW5yZWYgKHNyYy0+aW5wdXRfc3RyZWFtKTsKKyAgICAgIHNyYy0+aW5wdXRfc3RyZWFtID0gTlVMTDsKKyAgICB9CisgIH0KKworICBpZiAoZ19jYW5jZWxsYWJsZV9pc19jYW5jZWxsZWQgKHNyYy0+Y2FuY2VsbGFibGUpKSB7CisgICAgcmV0ID0gR1NUX0ZMT1dfRkxVU0hJTkc7CisgICAgZ19tdXRleF91bmxvY2sgKCZzcmMtPm11dGV4KTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICAvKiBJZiB3ZSBoYXZlIG5vIG9wZW4gY29ubmVjdGlvbiB0byB0aGUgc2VydmVyLCBzdGFydCBvbmUgKi8KKyAgaWYgKCFzcmMtPmlucHV0X3N0cmVhbSkgeworICAgICpvdXRidWYgPSBOVUxMOworICAgIHJldCA9CisgICAgICAgIGdzdF9zb3VwX2h0dHBfc3JjX2RvX3JlcXVlc3QgKHNyYywKKyAgICAgICAgc3JjLT5tZXRob2QgPyBzcmMtPm1ldGhvZCA6IFNPVVBfTUVUSE9EX0dFVCk7CisgICAgaHR0cF9oZWFkZXJzX2V2ZW50ID0gc3JjLT5odHRwX2hlYWRlcnNfZXZlbnQ7CisgICAgc3JjLT5odHRwX2hlYWRlcnNfZXZlbnQgPSBOVUxMOworICB9CisgIGdfbXV0ZXhfdW5sb2NrICgmc3JjLT5tdXRleCk7CisKKyAgaWYgKHJldCA9PSBHU1RfRkxPV19PSyB8fCByZXQgPT0gR1NUX0ZMT1dfQ1VTVE9NX0VSUk9SKSB7CisgICAgaWYgKGh0dHBfaGVhZGVyc19ldmVudCkgeworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChHU1RfQkFTRV9TUkNfUEFEIChzcmMpLCBodHRwX2hlYWRlcnNfZXZlbnQpOworICAgICAgaHR0cF9oZWFkZXJzX2V2ZW50ID0gTlVMTDsKKyAgICB9CisgIH0KKworICBpZiAocmV0ID09IEdTVF9GTE9XX09LKQorICAgIHJldCA9IGdzdF9zb3VwX2h0dHBfc3JjX3JlYWRfYnVmZmVyIChzcmMsIG91dGJ1Zik7CisKK2RvbmU6CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIlJldHVybmluZyAlZCAlcyIsIHJldCwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgaWYgKGh0dHBfaGVhZGVyc19ldmVudCkKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoaHR0cF9oZWFkZXJzX2V2ZW50KTsKKworICAgIGdfbXV0ZXhfbG9jayAoJnNyYy0+bXV0ZXgpOworICAgIGlmIChzcmMtPmlucHV0X3N0cmVhbSkgeworICAgICAgZ19vYmplY3RfdW5yZWYgKHNyYy0+aW5wdXRfc3RyZWFtKTsKKyAgICAgIHNyYy0+aW5wdXRfc3RyZWFtID0gTlVMTDsKKyAgICB9CisgICAgZ19tdXRleF91bmxvY2sgKCZzcmMtPm11dGV4KTsKKyAgICBpZiAocmV0ID09IEdTVF9GTE9XX0NVU1RPTV9FUlJPUikgeworICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICBnb3RvIHJldHJ5OworICAgIH0KKyAgfQorCisgIGlmIChyZXQgPT0gR1NUX0ZMT1dfRkxVU0hJTkcpIHsKKyAgICBnX211dGV4X2xvY2sgKCZzcmMtPm11dGV4KTsKKyAgICBzcmMtPnJldHJ5X2NvdW50ID0gMDsKKyAgICBnX211dGV4X3VubG9jayAoJnNyYy0+bXV0ZXgpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc291cF9odHRwX3NyY19zdGFydCAoR3N0QmFzZVNyYyAqIGJzcmMpCit7CisgIEdzdFNvdXBIVFRQU3JjICpzcmMgPSBHU1RfU09VUF9IVFRQX1NSQyAoYnNyYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic3RhcnQoXCIlc1wiKSIsIHNyYy0+bG9jYXRpb24pOworCisgIHJldHVybiBnc3Rfc291cF9odHRwX3NyY19zZXNzaW9uX29wZW4gKHNyYyk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NvdXBfaHR0cF9zcmNfc3RvcCAoR3N0QmFzZVNyYyAqIGJzcmMpCit7CisgIEdzdFNvdXBIVFRQU3JjICpzcmM7CisKKyAgc3JjID0gR1NUX1NPVVBfSFRUUF9TUkMgKGJzcmMpOworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzdG9wKCkiKTsKKyAgaWYgKHNyYy0+a2VlcF9hbGl2ZSAmJiAhc3JjLT5tc2cgJiYgIXNyYy0+c2Vzc2lvbl9pc19zaGFyZWQpCisgICAgZ3N0X3NvdXBfaHR0cF9zcmNfY2FuY2VsX21lc3NhZ2UgKHNyYyk7CisgIGVsc2UKKyAgICBnc3Rfc291cF9odHRwX3NyY19zZXNzaW9uX2Nsb3NlIChzcmMpOworCisgIGdzdF9zb3VwX2h0dHBfc3JjX3Jlc2V0IChzcmMpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3Rfc291cF9odHRwX3NyY19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdFNvdXBIVFRQU3JjICpzcmM7CisKKyAgc3JjID0gR1NUX1NPVVBfSFRUUF9TUkMgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgZ3N0X3NvdXBfaHR0cF9zcmNfc2Vzc2lvbl9jbG9zZSAoc3JjKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc291cF9odHRwX3NyY19zZXRfY29udGV4dCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdENvbnRleHQgKiBjb250ZXh0KQoreworICBHc3RTb3VwSFRUUFNyYyAqc3JjID0gR1NUX1NPVVBfSFRUUF9TUkMgKGVsZW1lbnQpOworCisgIGlmIChnX3N0cmNtcDAgKGdzdF9jb250ZXh0X2dldF9jb250ZXh0X3R5cGUgKGNvbnRleHQpLAorICAgICAgICAgIEdTVF9TT1VQX1NFU1NJT05fQ09OVEVYVCkgPT0gMCkgeworICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jb250ZXh0X2dldF9zdHJ1Y3R1cmUgKGNvbnRleHQpOworCisgICAgR1NUX09CSkVDVF9MT0NLIChzcmMpOworICAgIGlmIChzcmMtPmV4dGVybmFsX3Nlc3Npb24pCisgICAgICBnX29iamVjdF91bnJlZiAoc3JjLT5leHRlcm5hbF9zZXNzaW9uKTsKKyAgICBzcmMtPmV4dGVybmFsX3Nlc3Npb24gPSBOVUxMOworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0IChzLCAic2Vzc2lvbiIsIFNPVVBfVFlQRV9TRVNTSU9OLCAmc3JjLT5leHRlcm5hbF9zZXNzaW9uLAorICAgICAgICBOVUxMKTsKKyAgICBzcmMtPmZvcmNlZF9leHRlcm5hbF9zZXNzaW9uID0gRkFMU0U7CisgICAgZ3N0X3N0cnVjdHVyZV9nZXQgKHMsICJmb3JjZSIsIEdfVFlQRV9CT09MRUFOLAorICAgICAgICAmc3JjLT5mb3JjZWRfZXh0ZXJuYWxfc2Vzc2lvbiwgTlVMTCk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJTZXR0aW5nIGV4dGVybmFsIHNlc3Npb24gJXAgKGZvcmNlOiAlZCkiLAorICAgICAgICBzcmMtPmV4dGVybmFsX3Nlc3Npb24sIHNyYy0+Zm9yY2VkX2V4dGVybmFsX3Nlc3Npb24pOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcmMpOworICB9CisKKyAgR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNldF9jb250ZXh0IChlbGVtZW50LCBjb250ZXh0KTsKK30KKworLyogSW50ZXJydXB0IGEgYmxvY2tpbmcgcmVxdWVzdC4gKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NvdXBfaHR0cF9zcmNfdW5sb2NrIChHc3RCYXNlU3JjICogYnNyYykKK3sKKyAgR3N0U291cEhUVFBTcmMgKnNyYzsKKworICBzcmMgPSBHU1RfU09VUF9IVFRQX1NSQyAoYnNyYyk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInVubG9jaygpIik7CisKKyAgZ3N0X3NvdXBfaHR0cF9zcmNfY2FuY2VsX21lc3NhZ2UgKHNyYyk7CisgIHJldHVybiBUUlVFOworfQorCisvKiBJbnRlcnJ1cHQgaW50ZXJydXB0LiAqLworc3RhdGljIGdib29sZWFuCitnc3Rfc291cF9odHRwX3NyY191bmxvY2tfc3RvcCAoR3N0QmFzZVNyYyAqIGJzcmMpCit7CisgIEdzdFNvdXBIVFRQU3JjICpzcmM7CisKKyAgc3JjID0gR1NUX1NPVVBfSFRUUF9TUkMgKGJzcmMpOworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJ1bmxvY2tfc3RvcCgpIik7CisKKyAgZ19jYW5jZWxsYWJsZV9yZXNldCAoc3JjLT5jYW5jZWxsYWJsZSk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zb3VwX2h0dHBfc3JjX2dldF9zaXplIChHc3RCYXNlU3JjICogYnNyYywgZ3VpbnQ2NCAqIHNpemUpCit7CisgIEdzdFNvdXBIVFRQU3JjICpzcmM7CisKKyAgc3JjID0gR1NUX1NPVVBfSFRUUF9TUkMgKGJzcmMpOworCisgIGlmIChzcmMtPmhhdmVfc2l6ZSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImdldF9zaXplKCkgPSAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICBzcmMtPmNvbnRlbnRfc2l6ZSk7CisgICAgKnNpemUgPSBzcmMtPmNvbnRlbnRfc2l6ZTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJnZXRfc2l6ZSgpID0gRkFMU0UiKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NvdXBfaHR0cF9zcmNfY2hlY2tfc2Vla2FibGUgKEdzdFNvdXBIVFRQU3JjICogc3JjKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworCisgIC8qIFNwZWNpYWwgY2FzZSB0byBjaGVjayBpZiB0aGUgc2VydmVyIGFsbG93cyByYW5nZSByZXF1ZXN0cworICAgKiBiZWZvcmUgcmVhbGx5IHN0YXJ0aW5nIHRvIGdldCBkYXRhIGluIHRoZSBidWZmZXIgY3JlYXRpb24KKyAgICogbG9vcHMuCisgICAqLworICBpZiAoIXNyYy0+Z290X2hlYWRlcnMgJiYgR1NUX1NUQVRFIChzcmMpID49IEdTVF9TVEFURV9QQVVTRUQpIHsKKyAgICBnX211dGV4X2xvY2sgKCZzcmMtPm11dGV4KTsKKyAgICB3aGlsZSAoIXNyYy0+Z290X2hlYWRlcnMgJiYgIWdfY2FuY2VsbGFibGVfaXNfY2FuY2VsbGVkIChzcmMtPmNhbmNlbGxhYmxlKQorICAgICAgICAmJiByZXQgPT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgIGlmICgoc3JjLT5tc2cgJiYgc3JjLT5tc2ctPm1ldGhvZCAhPSBTT1VQX01FVEhPRF9IRUFEKSkgeworICAgICAgICAvKiB3YWl0IGZvciB0aGUgY3VycmVudCByZXF1ZXN0IHRvIGZpbmlzaCAqLworICAgICAgICBnX2NvbmRfd2FpdCAoJnNyYy0+aGF2ZV9oZWFkZXJzX2NvbmQsICZzcmMtPm11dGV4KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChnc3Rfc291cF9odHRwX3NyY19zZXNzaW9uX29wZW4gKHNyYykpIHsKKyAgICAgICAgICByZXQgPSBnc3Rfc291cF9odHRwX3NyY19kb19yZXF1ZXN0IChzcmMsIFNPVVBfTUVUSE9EX0hFQUQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGdfbXV0ZXhfdW5sb2NrICgmc3JjLT5tdXRleCk7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc291cF9odHRwX3NyY19pc19zZWVrYWJsZSAoR3N0QmFzZVNyYyAqIGJzcmMpCit7CisgIEdzdFNvdXBIVFRQU3JjICpzcmMgPSBHU1RfU09VUF9IVFRQX1NSQyAoYnNyYyk7CisKKyAgZ3N0X3NvdXBfaHR0cF9zcmNfY2hlY2tfc2Vla2FibGUgKHNyYyk7CisKKyAgcmV0dXJuIHNyYy0+c2Vla2FibGU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NvdXBfaHR0cF9zcmNfZG9fc2VlayAoR3N0QmFzZVNyYyAqIGJzcmMsIEdzdFNlZ21lbnQgKiBzZWdtZW50KQoreworICBHc3RTb3VwSFRUUFNyYyAqc3JjID0gR1NUX1NPVVBfSFRUUF9TUkMgKGJzcmMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImRvX3NlZWsoJSIgR19HVUlOVDY0X0ZPUk1BVCAiLSUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICIpIiwgc2VnbWVudC0+c3RhcnQsIHNlZ21lbnQtPnN0b3ApOworICBpZiAoc3JjLT5yZWFkX3Bvc2l0aW9uID09IHNlZ21lbnQtPnN0YXJ0ICYmCisgICAgICBzcmMtPnJlcXVlc3RfcG9zaXRpb24gPT0gc3JjLT5yZWFkX3Bvc2l0aW9uICYmCisgICAgICBzcmMtPnN0b3BfcG9zaXRpb24gPT0gc2VnbWVudC0+c3RvcCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywKKyAgICAgICAgIlNlZWsgdG8gY3VycmVudCByZWFkL2VuZCBwb3NpdGlvbiBhbmQgbm8gc2VlayBwZW5kaW5nIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBnc3Rfc291cF9odHRwX3NyY19jaGVja19zZWVrYWJsZSAoc3JjKTsKKworICAvKiBJZiB3ZSBoYXZlIG5vIGhlYWRlcnMgd2UgZG9uJ3Qga25vdyB5ZXQgaWYgaXQgaXMgc2Vla2FibGUgb3Igbm90LgorICAgKiBTdG9yZSB0aGUgc3RhcnQgcG9zaXRpb24gYW5kIGVycm9yIG91dCBsYXRlciBpZiBpdCBpc24ndCAqLworICBpZiAoc3JjLT5nb3RfaGVhZGVycyAmJiAhc3JjLT5zZWVrYWJsZSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiTm90IHNlZWthYmxlIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKHNlZ21lbnQtPnJhdGUgPCAwLjAgfHwgc2VnbWVudC0+Zm9ybWF0ICE9IEdTVF9GT1JNQVRfQllURVMpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgIkludmFsaWQgc2VlayBzZWdtZW50Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKHNyYy0+aGF2ZV9zaXplICYmIHNlZ21lbnQtPnN0YXJ0ID49IHNyYy0+Y29udGVudF9zaXplKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsCisgICAgICAgICJQb3RlbnRpYWxseSBzZWVraW5nIGJlaGluZCBlbmQgb2YgZmlsZSwgbWlnaHQgRU9TIGltbWVkaWF0ZWx5Iik7CisgIH0KKworICAvKiBXYWl0IGZvciBjcmVhdGUoKSB0byBoYW5kbGUgdGhlIGp1bXAgaW4gb2Zmc2V0LiAqLworICBzcmMtPnJlcXVlc3RfcG9zaXRpb24gPSBzZWdtZW50LT5zdGFydDsKKyAgc3JjLT5zdG9wX3Bvc2l0aW9uID0gc2VnbWVudC0+c3RvcDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc291cF9odHRwX3NyY19xdWVyeSAoR3N0QmFzZVNyYyAqIGJzcmMsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdFNvdXBIVFRQU3JjICpzcmMgPSBHU1RfU09VUF9IVFRQX1NSQyAoYnNyYyk7CisgIGdib29sZWFuIHJldDsKKyAgR3N0U2NoZWR1bGluZ0ZsYWdzIGZsYWdzOworICBnaW50IG1pbnNpemUsIG1heHNpemUsIGFsaWduOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX1VSSToKKyAgICAgIGdzdF9xdWVyeV9zZXRfdXJpIChxdWVyeSwgc3JjLT5sb2NhdGlvbik7CisgICAgICBpZiAoc3JjLT5yZWRpcmVjdGlvbl91cmkgIT0gTlVMTCkgeworICAgICAgICBnc3RfcXVlcnlfc2V0X3VyaV9yZWRpcmVjdGlvbiAocXVlcnksIHNyYy0+cmVkaXJlY3Rpb25fdXJpKTsKKyAgICAgICAgZ3N0X3F1ZXJ5X3NldF91cmlfcmVkaXJlY3Rpb25fcGVybWFuZW50IChxdWVyeSwKKyAgICAgICAgICAgIHNyYy0+cmVkaXJlY3Rpb25fcGVybWFuZW50KTsKKyAgICAgIH0KKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmICghcmV0KQorICAgIHJldCA9IEdTVF9CQVNFX1NSQ19DTEFTUyAocGFyZW50X2NsYXNzKS0+cXVlcnkgKGJzcmMsIHF1ZXJ5KTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9TQ0hFRFVMSU5HOgorICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3NjaGVkdWxpbmcgKHF1ZXJ5LCAmZmxhZ3MsICZtaW5zaXplLCAmbWF4c2l6ZSwgJmFsaWduKTsKKyAgICAgIGZsYWdzIHw9IEdTVF9TQ0hFRFVMSU5HX0ZMQUdfQkFORFdJRFRIX0xJTUlURUQ7CisgICAgICBnc3RfcXVlcnlfc2V0X3NjaGVkdWxpbmcgKHF1ZXJ5LCBmbGFncywgbWluc2l6ZSwgbWF4c2l6ZSwgYWxpZ24pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc291cF9odHRwX3NyY19zZXRfbG9jYXRpb24gKEdzdFNvdXBIVFRQU3JjICogc3JjLCBjb25zdCBnY2hhciAqIHVyaSwKKyAgICBHRXJyb3IgKiogZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmFsdF9zY2hlbWVzW10gPSB7ICJpY3k6Ly8iLCAiaWN5eDovLyIgfTsKKyAgZ3VpbnQgaTsKKworICBpZiAoc3JjLT5sb2NhdGlvbikgeworICAgIGdfZnJlZSAoc3JjLT5sb2NhdGlvbik7CisgICAgc3JjLT5sb2NhdGlvbiA9IE5VTEw7CisgIH0KKworICBpZiAodXJpID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGZvciAoaSA9IDA7IGkgPCBHX05fRUxFTUVOVFMgKGFsdF9zY2hlbWVzKTsgaSsrKSB7CisgICAgaWYgKGdfc3RyX2hhc19wcmVmaXggKHVyaSwgYWx0X3NjaGVtZXNbaV0pKSB7CisgICAgICBzcmMtPmxvY2F0aW9uID0KKyAgICAgICAgICBnX3N0cmR1cF9wcmludGYgKCJodHRwOi8vJXMiLCB1cmkgKyBzdHJsZW4gKGFsdF9zY2hlbWVzW2ldKSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKworICBpZiAoc3JjLT5yZWRpcmVjdGlvbl91cmkpIHsKKyAgICBnX2ZyZWUgKHNyYy0+cmVkaXJlY3Rpb25fdXJpKTsKKyAgICBzcmMtPnJlZGlyZWN0aW9uX3VyaSA9IE5VTEw7CisgIH0KKworICBzcmMtPmxvY2F0aW9uID0gZ19zdHJkdXAgKHVyaSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NvdXBfaHR0cF9zcmNfc2V0X3Byb3h5IChHc3RTb3VwSFRUUFNyYyAqIHNyYywgY29uc3QgZ2NoYXIgKiB1cmkpCit7CisgIGlmIChzcmMtPnByb3h5KSB7CisgICAgc291cF91cmlfZnJlZSAoc3JjLT5wcm94eSk7CisgICAgc3JjLT5wcm94eSA9IE5VTEw7CisgIH0KKworICBpZiAodXJpID09IE5VTEwgfHwgKnVyaSA9PSAnXDAnKQorICAgIHJldHVybiBUUlVFOworCisgIGlmIChnX3N0cnN0cl9sZW4gKHVyaSwgLTEsICI6Ly8iKSkgeworICAgIHNyYy0+cHJveHkgPSBzb3VwX3VyaV9uZXcgKHVyaSk7CisgIH0gZWxzZSB7CisgICAgZ2NoYXIgKm5ld191cmkgPSBnX3N0cmNvbmNhdCAoImh0dHA6Ly8iLCB1cmksIE5VTEwpOworCisgICAgc3JjLT5wcm94eSA9IHNvdXBfdXJpX25ldyAobmV3X3VyaSk7CisgICAgZ19mcmVlIChuZXdfdXJpKTsKKyAgfQorCisgIHJldHVybiAoc3JjLT5wcm94eSAhPSBOVUxMKTsKK30KKworc3RhdGljIGd1aW50Citnc3Rfc291cF9odHRwX3NyY191cmlfZ2V0X3R5cGUgKEdUeXBlIHR5cGUpCit7CisgIHJldHVybiBHU1RfVVJJX1NSQzsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyICpjb25zdCAqCitnc3Rfc291cF9odHRwX3NyY191cmlfZ2V0X3Byb3RvY29scyAoR1R5cGUgdHlwZSkKK3sKKyAgc3RhdGljIGNvbnN0IGdjaGFyICpwcm90b2NvbHNbXSA9IHsgImh0dHAiLCAiaHR0cHMiLCAiaWN5IiwgImljeXgiLCBOVUxMIH07CisKKyAgcmV0dXJuIHByb3RvY29sczsKK30KKworc3RhdGljIGdjaGFyICoKK2dzdF9zb3VwX2h0dHBfc3JjX3VyaV9nZXRfdXJpIChHc3RVUklIYW5kbGVyICogaGFuZGxlcikKK3sKKyAgR3N0U291cEhUVFBTcmMgKnNyYyA9IEdTVF9TT1VQX0hUVFBfU1JDIChoYW5kbGVyKTsKKworICAvKiBGSVhNRTogbWFrZSB0aHJlYWQtc2FmZSAqLworICByZXR1cm4gZ19zdHJkdXAgKHNyYy0+bG9jYXRpb24pOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zb3VwX2h0dHBfc3JjX3VyaV9zZXRfdXJpIChHc3RVUklIYW5kbGVyICogaGFuZGxlciwgY29uc3QgZ2NoYXIgKiB1cmksCisgICAgR0Vycm9yICoqIGVycm9yKQoreworICBHc3RTb3VwSFRUUFNyYyAqc3JjID0gR1NUX1NPVVBfSFRUUF9TUkMgKGhhbmRsZXIpOworCisgIHJldHVybiBnc3Rfc291cF9odHRwX3NyY19zZXRfbG9jYXRpb24gKHNyYywgdXJpLCBlcnJvcik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc291cF9odHRwX3NyY191cmlfaGFuZGxlcl9pbml0IChncG9pbnRlciBnX2lmYWNlLCBncG9pbnRlciBpZmFjZV9kYXRhKQoreworICBHc3RVUklIYW5kbGVySW50ZXJmYWNlICppZmFjZSA9IChHc3RVUklIYW5kbGVySW50ZXJmYWNlICopIGdfaWZhY2U7CisKKyAgaWZhY2UtPmdldF90eXBlID0gZ3N0X3NvdXBfaHR0cF9zcmNfdXJpX2dldF90eXBlOworICBpZmFjZS0+Z2V0X3Byb3RvY29scyA9IGdzdF9zb3VwX2h0dHBfc3JjX3VyaV9nZXRfcHJvdG9jb2xzOworICBpZmFjZS0+Z2V0X3VyaSA9IGdzdF9zb3VwX2h0dHBfc3JjX3VyaV9nZXRfdXJpOworICBpZmFjZS0+c2V0X3VyaSA9IGdzdF9zb3VwX2h0dHBfc3JjX3VyaV9zZXRfdXJpOworfQpkaWZmIC0tZ2l0IGEvZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuaCBiL2V4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4NTFkZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSAKKyAqLworCisjaWZuZGVmIF9fR1NUX1NPVVBfSFRUUF9TUkNfSF9fCisjZGVmaW5lIF9fR1NUX1NPVVBfSFRUUF9TUkNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0cHVzaHNyYy5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKworR19CRUdJTl9ERUNMUworCisjaW5jbHVkZSA8bGlic291cC9zb3VwLmg+CisKKyNkZWZpbmUgR1NUX1RZUEVfU09VUF9IVFRQX1NSQyBcCisgIChnc3Rfc291cF9odHRwX3NyY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfU09VUF9IVFRQX1NSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1NPVVBfSFRUUF9TUkMsR3N0U291cEhUVFBTcmMpKQorI2RlZmluZSBHU1RfU09VUF9IVFRQX1NSQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSwgXAorICAgICAgR1NUX1RZUEVfU09VUF9IVFRQX1NSQyxHc3RTb3VwSFRUUFNyY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1NPVVBfSFRUUF9TUkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9TT1VQX0hUVFBfU1JDKSkKKyNkZWZpbmUgR1NUX0lTX1NPVVBfSFRUUF9TUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfU09VUF9IVFRQX1NSQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RTb3VwSFRUUFNyYyBHc3RTb3VwSFRUUFNyYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RTb3VwSFRUUFNyY0NsYXNzIEdzdFNvdXBIVFRQU3JjQ2xhc3M7CisKK3R5cGVkZWYgZW51bSB7CisgIEdTVF9TT1VQX0hUVFBfU1JDX1NFU1NJT05fSU9fU1RBVFVTX0lETEUsCisgIEdTVF9TT1VQX0hUVFBfU1JDX1NFU1NJT05fSU9fU1RBVFVTX1FVRVVFRCwKKyAgR1NUX1NPVVBfSFRUUF9TUkNfU0VTU0lPTl9JT19TVEFUVVNfUlVOTklORywKKyAgR1NUX1NPVVBfSFRUUF9TUkNfU0VTU0lPTl9JT19TVEFUVVNfQ0FOQ0VMTEVELAorfSBHc3RTb3VwSFRUUFNyY1Nlc3Npb25JT1N0YXR1czsKKworc3RydWN0IF9Hc3RTb3VwSFRUUFNyYyB7CisgIEdzdFB1c2hTcmMgZWxlbWVudDsKKworICBnY2hhciAqbG9jYXRpb247ICAgICAgICAgICAgIC8qIEZ1bGwgVVJJLiAqLworICBnY2hhciAqcmVkaXJlY3Rpb25fdXJpOyAgICAgIC8qIEZ1bGwgVVJJIGFmdGVyIHJlZGlyZWN0aW9ucy4gKi8KKyAgZ2Jvb2xlYW4gcmVkaXJlY3Rpb25fcGVybWFuZW50OyAvKiBQZXJtYW5lbnQgb3IgdGVtcG9yYXJ5IHJlZGlyZWN0PyAqLworICBnY2hhciAqdXNlcl9hZ2VudDsgICAgICAgICAgIC8qIFVzZXItQWdlbnQgSFRUUCBoZWFkZXIuICovCisgIGdib29sZWFuIGF1dG9tYXRpY19yZWRpcmVjdDsgLyogRm9sbG93IHJlZGlyZWN0cy4gKi8KKyAgU291cFVSSSAqcHJveHk7ICAgICAgICAgICAgICAvKiBIVFRQIHByb3h5IFVSSS4gKi8KKyAgZ2NoYXIgKnVzZXJfaWQ7ICAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiB1c2VyIGlkIGZvciBsb2NhdGlvbiBVUkkuICovCisgIGdjaGFyICp1c2VyX3B3OyAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gdXNlciBwYXNzd29yZCBmb3IgbG9jYXRpb24gVVJJLiAqLworICBnY2hhciAqcHJveHlfaWQ7ICAgICAgICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIHVzZXIgaWQgZm9yIHByb3h5IFVSSS4gKi8KKyAgZ2NoYXIgKnByb3h5X3B3OyAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiB1c2VyIHBhc3N3b3JkIGZvciBwcm94eSBVUkkuICovCisgIGdjaGFyICoqY29va2llczsgICAgICAgICAgICAgLyogSFRUUCByZXF1ZXN0IGNvb2tpZXMuICovCisgIFNvdXBTZXNzaW9uICpzZXNzaW9uOyAgICAgICAgLyogQXN5bmMgY29udGV4dC4gKi8KKyAgZ2Jvb2xlYW4gc2Vzc2lvbl9pc19zaGFyZWQ7CisgIFNvdXBTZXNzaW9uICpleHRlcm5hbF9zZXNzaW9uOyAvKiBTaGFyZWQgdmlhIEdzdENvbnRleHQgKi8KKyAgZ2Jvb2xlYW4gZm9yY2VkX2V4dGVybmFsX3Nlc3Npb247IC8qIElmIHNlc3Npb24gd2FzIGV4cGxpY2l0bHkgc2V0IGZyb20gYXBwbGljYXRpb24gKi8KKyAgU291cE1lc3NhZ2UgKm1zZzsgICAgICAgICAgICAvKiBSZXF1ZXN0IG1lc3NhZ2UuICovCisgIGdpbnQgcmV0cnlfY291bnQ7ICAgICAgICAgICAgLyogTnVtYmVyIG9mIHJldHJpZXMgc2luY2Ugd2UgcmVjZWl2ZWQgZGF0YSAqLworICBnaW50IG1heF9yZXRyaWVzOyAgICAgICAgICAgIC8qIE1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgKi8KKyAgZ2NoYXIgKm1ldGhvZDsgICAgICAgICAgICAgICAvKiBIVFRQIG1ldGhvZCAqLworCisgIGdib29sZWFuIGdvdF9oZWFkZXJzOyAgICAgICAgLyogQWxyZWFkeSByZWNlaXZlZCBoZWFkZXJzIGZyb20gdGhlIHNlcnZlciAqLworICBnYm9vbGVhbiBoYXZlX3NpemU7ICAgICAgICAgIC8qIFJlY2VpdmVkIGFuZCBwYXJzZWQgQ29udGVudC1MZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIuICovCisgIGd1aW50NjQgY29udGVudF9zaXplOyAgICAgICAgLyogVmFsdWUgb2YgQ29udGVudC1MZW5ndGggaGVhZGVyLiAqLworICBndWludDY0IHJlYWRfcG9zaXRpb247ICAgICAgIC8qIEN1cnJlbnQgcG9zaXRpb24uICovCisgIGdib29sZWFuIHNlZWthYmxlOyAgICAgICAgICAgLyogRkFMU0UgaWYgdGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFuZ2UuICovCisgIGd1aW50NjQgcmVxdWVzdF9wb3NpdGlvbjsgICAgLyogU2VlayB0byB0aGlzIHBvc2l0aW9uLiAqLworICBndWludDY0IHN0b3BfcG9zaXRpb247ICAgICAgIC8qIFN0b3AgYXQgdGhpcyBwb3NpdGlvbi4gKi8KKyAgZ2Jvb2xlYW4gaGF2ZV9ib2R5OyAgICAgICAgICAvKiBJbmRpY2F0ZXMgaWYgaXQgaGFzIGp1c3QgYmVlbiBzaWduYWxlZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBlbmQgb2YgdGhlIG1lc3NhZ2UgYm9keS4gVGhpcyBpcyB1c2VkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZGVjaWRlIGlmIGFuIG91dCBvZiByYW5nZSByZXF1ZXN0IHNob3VsZCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGhhbmRsZWQgYXMgYW4gZXJyb3Igb3IgRU9TIHdoZW4gdGhlIGNvbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplIGlzIHVua25vd24gKi8KKyAgZ2Jvb2xlYW4ga2VlcF9hbGl2ZTsgICAgICAgICAvKiBVc2Uga2VlcC1hbGl2ZSBzZXNzaW9ucyAqLworICBnYm9vbGVhbiBzc2xfc3RyaWN0OworICBnY2hhciAqc3NsX2NhX2ZpbGU7CisgIGdib29sZWFuIHNzbF91c2Vfc3lzdGVtX2NhX2ZpbGU7CisgIEdUbHNEYXRhYmFzZSAqdGxzX2RhdGFiYXNlOworICBHVGxzSW50ZXJhY3Rpb24gKnRsc19pbnRlcmFjdGlvbjsKKworICBHQ2FuY2VsbGFibGUgKmNhbmNlbGxhYmxlOworICBHSW5wdXRTdHJlYW0gKmlucHV0X3N0cmVhbTsKKworICBnaW50IHJlZHVjZV9ibG9ja3NpemVfY291bnQ7CisgIGdpbnQgaW5jcmVhc2VfYmxvY2tzaXplX2NvdW50OworICBndWludCBtaW5pbXVtX2Jsb2Nrc2l6ZTsKKworICAvKiBTaG91dGNhc3QvaWNlY2FzdCBtZXRhZGF0YSBleHRyYWN0aW9uIGhhbmRsaW5nLiAqLworICBnYm9vbGVhbiBpcmFkaW9fbW9kZTsKKyAgR3N0Q2FwcyAqc3JjX2NhcHM7CisgIGdjaGFyICppcmFkaW9fbmFtZTsKKyAgZ2NoYXIgKmlyYWRpb19nZW5yZTsKKyAgZ2NoYXIgKmlyYWRpb191cmw7CisKKyAgR3N0U3RydWN0dXJlICpleHRyYV9oZWFkZXJzOworCisgIFNvdXBMb2dnZXJMb2dMZXZlbCBsb2dfbGV2ZWw7LyogU291cCBIVFRQIHNlc3Npb24gbG9nZ2VyIGxldmVsICovCisKKyAgZ2Jvb2xlYW4gY29tcHJlc3M7CisKKyAgZ3VpbnQgdGltZW91dDsKKworICBHTXV0ZXggbXV0ZXg7CisgIEdDb25kIGhhdmVfaGVhZGVyc19jb25kOworCisgIEdzdEV2ZW50ICpodHRwX2hlYWRlcnNfZXZlbnQ7Cit9OworCitzdHJ1Y3QgX0dzdFNvdXBIVFRQU3JjQ2xhc3MgeworICBHc3RQdXNoU3JjQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3NvdXBfaHR0cF9zcmNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfU09VUF9IVFRQX1NSQ19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZXh0L3NvdXAvZ3N0c291cHV0aWxzLmMgYi9leHQvc291cC9nc3Rzb3VwdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmMxZWYxCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NvdXAvZ3N0c291cHV0aWxzLmMKQEAgLTAsMCArMSw5NyBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFNhbXN1bmcgRWxlY3Ryb25pY3MuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgICAgQEF1dGhvcjogUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8ci52ZXJkZWpvQHNpc2Euc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqLworCisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGxpYnNvdXAvc291cC5oPgorI2luY2x1ZGUgImdzdHNvdXB1dGlscy5oIgorCisvKioKKyAqIFNvdXAgbG9nZ2VyIGZ1bmNzCisgKi8KKworR1NUX0RFQlVHX0NBVEVHT1JZX0VYVEVSTiAoc291cF91dGlsc19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBzb3VwX3V0aWxzX2RlYnVnCisKK3N0YXRpYyBpbmxpbmUgZ2NoYXIKK2dzdF9zb3VwX3V0aWxfbG9nX21ha2VfbGV2ZWxfdGFnIChTb3VwTG9nZ2VyTG9nTGV2ZWwgbGV2ZWwpCit7CisgIGdjaGFyIGM7CisKKyAgaWYgKEdfVU5MSUtFTFkgKChnaW50KSBsZXZlbCA+IDkpKQorICAgIHJldHVybiAnPyc7CisKKyAgc3dpdGNoIChsZXZlbCkgeworICAgIGNhc2UgU09VUF9MT0dHRVJfTE9HX01JTklNQUw6CisgICAgICBjID0gJ00nOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT1VQX0xPR0dFUl9MT0dfSEVBREVSUzoKKyAgICAgIGMgPSAnSCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPVVBfTE9HR0VSX0xPR19CT0RZOgorICAgICAgYyA9ICdCJzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiBVbmtub3duIGxldmVsLiBJZiB0aGlzIGlzIGhpdCBsaWJzb3VwIGxpa2VseSBhZGRlZCBhIG5ldworICAgICAgICogbG9nIGxldmVsIHRvIFNvdXBMb2dnZXJMb2dMZXZlbCBhbmQgaXQgc2hvdWxkIGJlIGFkZGVkCisgICAgICAgKiBhcyBhIGNhc2UgKi8KKyAgICAgIGMgPSBsZXZlbCArICcwJzsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBjOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NvdXBfdXRpbF9sb2dfcHJpbnRlcl9jYiAoU291cExvZ2dlciBHX0dOVUNfVU5VU0VEICogbG9nZ2VyLAorICAgIFNvdXBMb2dnZXJMb2dMZXZlbCBsZXZlbCwgY2hhciBkaXJlY3Rpb24sIGNvbnN0IGNoYXIgKmRhdGEsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBnY2hhciBjOworICBjID0gZ3N0X3NvdXBfdXRpbF9sb2dfbWFrZV9sZXZlbF90YWcgKGxldmVsKTsKKyAgR1NUX1RSQUNFX09CSkVDVCAoR1NUX0VMRU1FTlQgKHVzZXJfZGF0YSksICJIVFRQX1NFU1NJT04oJWMpOiAlYyAlcyIsIGMsCisgICAgICBkaXJlY3Rpb24sIGRhdGEpOworfQorCit2b2lkCitnc3Rfc291cF91dGlsX2xvZ19zZXR1cCAoU291cFNlc3Npb24gKiBzZXNzaW9uLCBTb3VwTG9nZ2VyTG9nTGV2ZWwgbGV2ZWwsCisgICAgR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIFNvdXBMb2dnZXIgKmxvZ2dlcjsKKworICBpZiAoIWxldmVsKSB7CisgICAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiTm90IGF0dGFjaGluZyBhIGxvZ2dlciB3aXRoIGxldmVsIDAiKTsKKyAgICByZXR1cm47CisgIH0KKworICBnX2Fzc2VydCAoc2Vzc2lvbiAmJiBlbGVtZW50KTsKKworICBpZiAoZ3N0X2RlYnVnX2NhdGVnb3J5X2dldF90aHJlc2hvbGQgKEdTVF9DQVRfREVGQVVMVCkKKyAgICAgIDwgR1NUX0xFVkVMX1RSQUNFKSB7CisgICAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiTm90IHNldHRpbmcgdXAgSFRUUCBzZXNzaW9uIGxvZ2dlci4gIgorICAgICAgICAiTmVlZCBhdCBsZWFzdCBHU1RfTEVWRUxfVFJBQ0UiKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBDcmVhdGUgYSBuZXcgbG9nZ2VyIGFuZCBzZXQgYm9keV9zaXplX2xpbWl0IHRvIC0xIChubyBsaW1pdCkgKi8KKyAgbG9nZ2VyID0gc291cF9sb2dnZXJfbmV3IChsZXZlbCwgLTEpOworICBzb3VwX2xvZ2dlcl9zZXRfcHJpbnRlciAobG9nZ2VyLCBnc3Rfc291cF91dGlsX2xvZ19wcmludGVyX2NiLAorICAgICAgZ3N0X29iamVjdF9yZWYgKGVsZW1lbnQpLCAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9vYmplY3RfdW5yZWYpOworCisgIC8qIEF0dGFjaCBsb2dnZXIgdG8gc2Vzc2lvbiAqLworICBzb3VwX3Nlc3Npb25fYWRkX2ZlYXR1cmUgKHNlc3Npb24sIFNPVVBfU0VTU0lPTl9GRUFUVVJFIChsb2dnZXIpKTsKKyAgZ19vYmplY3RfdW5yZWYgKGxvZ2dlcik7Cit9CmRpZmYgLS1naXQgYS9leHQvc291cC9nc3Rzb3VwdXRpbHMuaCBiL2V4dC9zb3VwL2dzdHNvdXB1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MzUyNWQKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc291cC9nc3Rzb3VwdXRpbHMuaApAQCAtMCwwICsxLDMxIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgU2Ftc3VuZyBFbGVjdHJvbmljcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgICBAQXV0aG9yOiBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyLnZlcmRlam9Ac2lzYS5zYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICovCisKKyNpZm5kZWYgX19HU1RfU09VUF9VVElMU19IX18KKyNkZWZpbmUgX19HU1RfU09VUF9VVElMU19IX18KKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8bGlic291cC9zb3VwLmg+CisKK0dfQkVHSU5fREVDTFMKKwordm9pZCBnc3Rfc291cF91dGlsX2xvZ19zZXR1cCAoU291cFNlc3Npb24gKiBzZXNzaW9uLCBTb3VwTG9nZ2VyTG9nTGV2ZWwgbGV2ZWwsCisgICAgR3N0RWxlbWVudCAqIGVsZW1lbnQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4dC9zb3VwL21lc29uLmJ1aWxkIGIvZXh0L3NvdXAvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkNzEyOQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zb3VwL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMjUgQEAKK3NvdXBfc291cmNlcyA9IFsKKyAgJ2dzdHNvdXBodHRwc3JjLmMnLAorICAnZ3N0c291cGh0dHBjbGllbnRzaW5rLmMnLAorICAnZ3N0c291cHV0aWxzLmMnLAorICAnZ3N0c291cC5jJywKK10KKworc291cF9hcmdzID0gWworICAnLURTT1VQX1ZFUlNJT05fTUlOX1JFUVVJUkVEPVNPVVBfVkVSU0lPTl8yXzQ4JywKKyAgJy1EU09VUF9WRVJTSU9OX01BWF9BTExPV0VEPVNPVVBfREVQUkVDQVRFRF9JTl8yXzQ4JywKK10KKworbGlic291cF9kZXAgPSBkZXBlbmRlbmN5KCdsaWJzb3VwLTIuNCcsIHZlcnNpb24gOiAnPj0yLjQ4JywgcmVxdWlyZWQgOiBmYWxzZSkKKworaWYgbGlic291cF9kZXAuZm91bmQoKQorICBnc3Rzb3VwaHR0cHNyYyA9IGxpYnJhcnkoJ2dzdHNvdXAnLAorICAgIHNvdXBfc291cmNlcywKKyAgICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MgKyBzb3VwX2FyZ3MsCisgICAgbGlua19hcmdzIDogbm9zZWhfbGlua19hcmdzLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgICBkZXBlbmRlbmNpZXMgOiBbZ3N0X2RlcCwgZ3N0YmFzZV9kZXAsIGdzdHRhZ19kZXAsIGxpYnNvdXBfZGVwXSwKKyAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCisgICkKK2VuZGlmCmRpZmYgLS1naXQgYS9leHQvc3BlZXgvTWFrZWZpbGUuYW0gYi9leHQvc3BlZXgvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMwZjU5NAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcGVleC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE3IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RzcGVleC5sYQorCitsaWJnc3RzcGVleF9sYV9TT1VSQ0VTID0gZ3N0c3BlZXguYyBnc3RzcGVleGRlYy5jIGdzdHNwZWV4ZW5jLmMKK2xpYmdzdHNwZWV4X2xhX0NGTEFHUyA9IC1ER1NUX1VTRV9VTlNUQUJMRV9BUEkgXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9CQVNFX0NGTEFHUykgXAorCSQoR1NUX0NGTEFHUykgXAorCSQoU1BFRVhfQ0ZMQUdTKQorbGliZ3N0c3BlZXhfbGFfTElCQUREID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSBcCisJLWxnc3R0YWctJChHU1RfQVBJX1ZFUlNJT04pIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkkKEdTVF9CQVNFX0xJQlMpIFwKKwkkKEdTVF9MSUJTKSBcCisJJChTUEVFWF9MSUJTKQorbGliZ3N0c3BlZXhfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKSAkKExJQk0pCisKK25vaW5zdF9IRUFERVJTID0gZ3N0c3BlZXhlbmMuaCBnc3RzcGVleGRlYy5oIApkaWZmIC0tZ2l0IGEvZXh0L3NwZWV4L2dzdHNwZWV4LmMgYi9leHQvc3BlZXgvZ3N0c3BlZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Njg4Y2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NwZWV4L2dzdHNwZWV4LmMKQEAgLTAsMCArMSw0OSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RzcGVleGRlYy5oIgorI2luY2x1ZGUgImdzdHNwZWV4ZW5jLmgiCisKKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAic3BlZXhlbmMiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIEdTVF9UWVBFX1NQRUVYX0VOQykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInNwZWV4ZGVjIiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgICAgICBHU1RfVFlQRV9TUEVFWF9ERUMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBnc3RfdGFnX3JlZ2lzdGVyX211c2ljYnJhaW56X3RhZ3MgKCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBzcGVleCwKKyAgICAiU3BlZXggcGx1Z2luIGxpYnJhcnkiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2V4dC9zcGVleC9nc3RzcGVleGRlYy5jIGIvZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MxMjNjZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcGVleC9nc3RzcGVleGRlYy5jCkBAIC0wLDAgKzEsNTc0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtc3BlZXhkZWMKKyAqIEBzZWVfYWxzbzogc3BlZXhlbmMsIG9nZ2RlbXV4CisgKgorICogVGhpcyBlbGVtZW50IGRlY29kZXMgYSBTcGVleCBzdHJlYW0gdG8gcmF3IGludGVnZXIgYXVkaW8uCisgKiA8dWxpbmsgdXJsPSJodHRwOi8vd3d3LnNwZWV4Lm9yZy8iPlNwZWV4PC91bGluaz4gaXMgYSByb3lhbHR5LWZyZWUKKyAqIGF1ZGlvIGNvZGVjIG1haW50YWluZWQgYnkgdGhlIDx1bGluayB1cmw9Imh0dHA6Ly93d3cueGlwaC5vcmcvIj5YaXBoLm9yZworICogRm91bmRhdGlvbjwvdWxpbms+LgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgZmlsZXNyYyBsb2NhdGlvbj1zcGVleC5vZ2cgISBvZ2dkZW11eCAhIHNwZWV4ZGVjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIGFsc2FzaW5rCisgKiBdfCBEZWNvZGUgYW4gT2dnL1NwZWV4IGZpbGUuIFRvIGNyZWF0ZSBhbiBPZ2cvU3BlZXggZmlsZSByZWZlciB0byB0aGUKKyAqIGRvY3VtZW50YXRpb24gb2Ygc3BlZXhlbmMuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0c3BlZXhkZWMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChzcGVleGRlY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBzcGVleGRlY19kZWJ1ZworCisjZGVmaW5lIERFRkFVTFRfRU5IICAgVFJVRQorCitlbnVtCit7CisgIEFSR18wLAorICBBUkdfRU5ICit9OworCisjZGVmaW5lIEZPUk1BVF9TVFIgR1NUX0FVRElPX05FKFMxNikKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNwZWV4X2RlY19zcmNfZmFjdG9yeSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgRk9STUFUX1NUUiAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgNjAwMCwgNDgwMDAgXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDIgXSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNwZWV4X2RlY19zaW5rX2ZhY3RvcnkgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1zcGVleCIpCisgICAgKTsKKworI2RlZmluZSBnc3Rfc3BlZXhfZGVjX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFNwZWV4RGVjLCBnc3Rfc3BlZXhfZGVjLCBHU1RfVFlQRV9BVURJT19ERUNPREVSKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9zcGVleF9kZWNfc3RhcnQgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NwZWV4X2RlY19zdG9wIChHc3RBdWRpb0RlY29kZXIgKiBkZWMpOworc3RhdGljIGdib29sZWFuIGdzdF9zcGVleF9kZWNfc2V0X2Zvcm1hdCAoR3N0QXVkaW9EZWNvZGVyICogYmRlYywKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfc3BlZXhfZGVjX2hhbmRsZV9mcmFtZSAoR3N0QXVkaW9EZWNvZGVyICogZGVjLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKK3N0YXRpYyB2b2lkIGdzdF9zcGVleF9kZWNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3NwZWV4X2RlY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BlZXhfZGVjX2NsYXNzX2luaXQgKEdzdFNwZWV4RGVjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEF1ZGlvRGVjb2RlckNsYXNzICpiYXNlX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgYmFzZV9jbGFzcyA9IChHc3RBdWRpb0RlY29kZXJDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3Rfc3BlZXhfZGVjX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3NwZWV4X2RlY19nZXRfcHJvcGVydHk7CisKKyAgYmFzZV9jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NwZWV4X2RlY19zdGFydCk7CisgIGJhc2VfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NwZWV4X2RlY19zdG9wKTsKKyAgYmFzZV9jbGFzcy0+c2V0X2Zvcm1hdCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3BlZXhfZGVjX3NldF9mb3JtYXQpOworICBiYXNlX2NsYXNzLT5oYW5kbGVfZnJhbWUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NwZWV4X2RlY19oYW5kbGVfZnJhbWUpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19FTkgsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImVuaCIsICJFbmgiLCAiRW5hYmxlIHBlcmNlcHR1YWwgZW5oYW5jZW1lbnQiLAorICAgICAgICAgIERFRkFVTFRfRU5ILCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZzcGVleF9kZWNfc3JjX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZzcGVleF9kZWNfc2lua19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJTcGVleCBhdWRpbyBkZWNvZGVyIiwgIkNvZGVjL0RlY29kZXIvQXVkaW8iLAorICAgICAgImRlY29kZSBzcGVleCBzdHJlYW1zIHRvIGF1ZGlvIiwgIldpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHNwZWV4ZGVjX2RlYnVnLCAic3BlZXhkZWMiLCAwLAorICAgICAgInNwZWV4IGRlY29kaW5nIGVsZW1lbnQiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGVleF9kZWNfcmVzZXQgKEdzdFNwZWV4RGVjICogZGVjKQoreworICBkZWMtPnBhY2tldG5vID0gMDsKKyAgZGVjLT5mcmFtZV9zaXplID0gMDsKKyAgZGVjLT5mcmFtZV9kdXJhdGlvbiA9IDA7CisgIGRlYy0+bW9kZSA9IE5VTEw7CisgIGZyZWUgKGRlYy0+aGVhZGVyKTsKKyAgZGVjLT5oZWFkZXIgPSBOVUxMOworICBzcGVleF9iaXRzX2Rlc3Ryb3kgKCZkZWMtPmJpdHMpOworICBzcGVleF9iaXRzX3NldF9iaXRfYnVmZmVyICgmZGVjLT5iaXRzLCBOVUxMLCAwKTsKKworICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZkZWMtPnN0cmVhbWhlYWRlciwgTlVMTCk7CisgIGdzdF9idWZmZXJfcmVwbGFjZSAoJmRlYy0+dm9yYmlzY29tbWVudCwgTlVMTCk7CisKKyAgaWYgKGRlYy0+c3RlcmVvKSB7CisgICAgc3BlZXhfc3RlcmVvX3N0YXRlX2Rlc3Ryb3kgKGRlYy0+c3RlcmVvKTsKKyAgICBkZWMtPnN0ZXJlbyA9IE5VTEw7CisgIH0KKworICBpZiAoZGVjLT5zdGF0ZSkgeworICAgIHNwZWV4X2RlY29kZXJfZGVzdHJveSAoZGVjLT5zdGF0ZSk7CisgICAgZGVjLT5zdGF0ZSA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGVleF9kZWNfaW5pdCAoR3N0U3BlZXhEZWMgKiBkZWMpCit7CisgIGdzdF9hdWRpb19kZWNvZGVyX3NldF9uZWVkc19mb3JtYXQgKEdTVF9BVURJT19ERUNPREVSIChkZWMpLCBUUlVFKTsKKyAgZ3N0X2F1ZGlvX2RlY29kZXJfc2V0X3VzZV9kZWZhdWx0X3BhZF9hY2NlcHRjYXBzIChHU1RfQVVESU9fREVDT0RFUl9DQVNUCisgICAgICAoZGVjKSwgVFJVRSk7CisgIEdTVF9QQURfU0VUX0FDQ0VQVF9URU1QTEFURSAoR1NUX0FVRElPX0RFQ09ERVJfU0lOS19QQUQgKGRlYykpOworCisgIGRlYy0+ZW5oID0gREVGQVVMVF9FTkg7CisKKyAgZ3N0X3NwZWV4X2RlY19yZXNldCAoZGVjKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BlZXhfZGVjX3N0YXJ0IChHc3RBdWRpb0RlY29kZXIgKiBkZWMpCit7CisgIEdzdFNwZWV4RGVjICpzZCA9IEdTVF9TUEVFWF9ERUMgKGRlYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVjLCAic3RhcnQiKTsKKyAgZ3N0X3NwZWV4X2RlY19yZXNldCAoc2QpOworCisgIC8qIHdlIGtub3cgYWJvdXQgY29uY2VhbG1lbnQgKi8KKyAgZ3N0X2F1ZGlvX2RlY29kZXJfc2V0X3BsY19hd2FyZSAoZGVjLCBUUlVFKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BlZXhfZGVjX3N0b3AgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYykKK3sKKyAgR3N0U3BlZXhEZWMgKnNkID0gR1NUX1NQRUVYX0RFQyAoZGVjKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZWMsICJzdG9wIik7CisgIGdzdF9zcGVleF9kZWNfcmVzZXQgKHNkKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9zcGVleF9kZWNfcGFyc2VfaGVhZGVyIChHc3RTcGVleERlYyAqIGRlYywgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RNYXBJbmZvIG1hcDsKKyAgR3N0QXVkaW9JbmZvIGluZm87CisgIHN0YXRpYyBjb25zdCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBjaGFuX3Bvc1syXVsyXSA9IHsKKyAgICB7R1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTU9OT30sCisgICAge0dTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUfQorICB9OworCisgIC8qIGdldCB0aGUgaGVhZGVyICovCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRlYy0+aGVhZGVyID0gc3BlZXhfcGFja2V0X3RvX2hlYWRlciAoKGdjaGFyICopIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgaWYgKCFkZWMtPmhlYWRlcikKKyAgICBnb3RvIG5vX2hlYWRlcjsKKworICBpZiAoZGVjLT5oZWFkZXItPm1vZGUgPj0gU1BFRVhfTkJfTU9ERVMgfHwgZGVjLT5oZWFkZXItPm1vZGUgPCAwKQorICAgIGdvdG8gbW9kZV90b29fb2xkOworCisgIGRlYy0+bW9kZSA9IHNwZWV4X2xpYl9nZXRfbW9kZSAoZGVjLT5oZWFkZXItPm1vZGUpOworCisgIC8qIGluaXRpYWxpemUgdGhlIGRlY29kZXIgKi8KKyAgZGVjLT5zdGF0ZSA9IHNwZWV4X2RlY29kZXJfaW5pdCAoZGVjLT5tb2RlKTsKKyAgaWYgKCFkZWMtPnN0YXRlKQorICAgIGdvdG8gaW5pdF9mYWlsZWQ7CisKKyAgc3BlZXhfZGVjb2Rlcl9jdGwgKGRlYy0+c3RhdGUsIFNQRUVYX1NFVF9FTkgsICZkZWMtPmVuaCk7CisgIHNwZWV4X2RlY29kZXJfY3RsIChkZWMtPnN0YXRlLCBTUEVFWF9HRVRfRlJBTUVfU0laRSwgJmRlYy0+ZnJhbWVfc2l6ZSk7CisKKyAgaWYgKGRlYy0+aGVhZGVyLT5uYl9jaGFubmVscyAhPSAxKSB7CisgICAgZGVjLT5zdGVyZW8gPSBzcGVleF9zdGVyZW9fc3RhdGVfaW5pdCAoKTsKKyAgICBkZWMtPmNhbGxiYWNrLmNhbGxiYWNrX2lkID0gU1BFRVhfSU5CQU5EX1NURVJFTzsKKyAgICBkZWMtPmNhbGxiYWNrLmZ1bmMgPSBzcGVleF9zdGRfc3RlcmVvX3JlcXVlc3RfaGFuZGxlcjsKKyAgICBkZWMtPmNhbGxiYWNrLmRhdGEgPSBkZWMtPnN0ZXJlbzsKKyAgICBzcGVleF9kZWNvZGVyX2N0bCAoZGVjLT5zdGF0ZSwgU1BFRVhfU0VUX0hBTkRMRVIsICZkZWMtPmNhbGxiYWNrKTsKKyAgfQorCisgIHNwZWV4X2RlY29kZXJfY3RsIChkZWMtPnN0YXRlLCBTUEVFWF9TRVRfU0FNUExJTkdfUkFURSwgJmRlYy0+aGVhZGVyLT5yYXRlKTsKKworICBkZWMtPmZyYW1lX2R1cmF0aW9uID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoZGVjLT5mcmFtZV9zaXplLAorICAgICAgR1NUX1NFQ09ORCwgZGVjLT5oZWFkZXItPnJhdGUpOworCisgIHNwZWV4X2JpdHNfaW5pdCAoJmRlYy0+Yml0cyk7CisKKyAgLyogc2V0IGNhcHMgKi8KKyAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoJmluZm8pOworICBnc3RfYXVkaW9faW5mb19zZXRfZm9ybWF0ICgmaW5mbywKKyAgICAgIEdTVF9BVURJT19GT1JNQVRfUzE2LAorICAgICAgZGVjLT5oZWFkZXItPnJhdGUsCisgICAgICBkZWMtPmhlYWRlci0+bmJfY2hhbm5lbHMsIGNoYW5fcG9zW2RlYy0+aGVhZGVyLT5uYl9jaGFubmVscyAtIDFdKTsKKworICBpZiAoIWdzdF9hdWRpb19kZWNvZGVyX3NldF9vdXRwdXRfZm9ybWF0IChHU1RfQVVESU9fREVDT0RFUiAoZGVjKSwgJmluZm8pKQorICAgIGdvdG8gbmVnb19mYWlsZWQ7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIC8qIEVSUk9SUyAqLworbm9faGVhZGVyOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKEdTVF9FTEVNRU5UIChkZWMpLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoImNvdWxkbid0IHJlYWQgaGVhZGVyIikpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorbW9kZV90b29fb2xkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKEdTVF9FTEVNRU5UIChkZWMpLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLAorICAgICAgICAoIk1vZGUgbnVtYmVyICVkIGRvZXMgbm90ICh5ZXQvYW55IGxvbmdlcikgZXhpc3QgaW4gdGhpcyB2ZXJzaW9uIiwKKyAgICAgICAgICAgIGRlYy0+aGVhZGVyLT5tb2RlKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Citpbml0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChHU1RfRUxFTUVOVCAoZGVjKSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJjb3VsZG4ndCBpbml0aWFsaXplIGRlY29kZXIiKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CituZWdvX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChHU1RfRUxFTUVOVCAoZGVjKSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJjb3VsZG4ndCBuZWdvdGlhdGUgZm9ybWF0IikpOworICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NwZWV4X2RlY19wYXJzZV9jb21tZW50cyAoR3N0U3BlZXhEZWMgKiBkZWMsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0VGFnTGlzdCAqbGlzdDsKKyAgZ2NoYXIgKnZlciwgKmVuY29kZXIgPSBOVUxMOworCisgIGxpc3QgPSBnc3RfdGFnX2xpc3RfZnJvbV92b3JiaXNjb21tZW50X2J1ZmZlciAoYnVmLCBOVUxMLCAwLCAmZW5jb2Rlcik7CisKKyAgaWYgKCFsaXN0KSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZWMsICJjb3VsZG4ndCBkZWNvZGUgY29tbWVudHMiKTsKKyAgICBsaXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgfQorCisgIGlmIChlbmNvZGVyKSB7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAobGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICBHU1RfVEFHX0VOQ09ERVIsIGVuY29kZXIsIE5VTEwpOworICB9CisKKyAgZ3N0X3RhZ19saXN0X2FkZCAobGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgR1NUX1RBR19BVURJT19DT0RFQywgIlNwZWV4IiwgTlVMTCk7CisKKyAgdmVyID0gZ19zdHJuZHVwIChkZWMtPmhlYWRlci0+c3BlZXhfdmVyc2lvbiwgU1BFRVhfSEVBREVSX1ZFUlNJT05fTEVOR1RIKTsKKyAgZ19zdHJzdHJpcCAodmVyKTsKKworICBpZiAodmVyICE9IE5VTEwgJiYgKnZlciAhPSAnXDAnKSB7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAobGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICBHU1RfVEFHX0VOQ09ERVJfVkVSU0lPTiwgdmVyLCBOVUxMKTsKKyAgfQorCisgIGlmIChkZWMtPmhlYWRlci0+Yml0cmF0ZSA+IDApIHsKKyAgICBnc3RfdGFnX2xpc3RfYWRkIChsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgIEdTVF9UQUdfQklUUkFURSwgKGd1aW50KSBkZWMtPmhlYWRlci0+Yml0cmF0ZSwgTlVMTCk7CisgIH0KKworICBHU1RfSU5GT19PQkpFQ1QgKGRlYywgInRhZ3M6ICUiIEdTVF9QVFJfRk9STUFULCBsaXN0KTsKKworICBnc3RfYXVkaW9fZGVjb2Rlcl9tZXJnZV90YWdzIChHU1RfQVVESU9fREVDT0RFUiAoZGVjKSwgbGlzdCwKKyAgICAgIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAobGlzdCk7CisKKyAgZ19mcmVlIChlbmNvZGVyKTsKKyAgZ19mcmVlICh2ZXIpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BlZXhfZGVjX3NldF9mb3JtYXQgKEdzdEF1ZGlvRGVjb2RlciAqIGJkZWMsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTcGVleERlYyAqZGVjID0gR1NUX1NQRUVYX0RFQyAoYmRlYyk7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgY29uc3QgR1ZhbHVlICpzdHJlYW1oZWFkZXI7CisKKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBpZiAoKHN0cmVhbWhlYWRlciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAic3RyZWFtaGVhZGVyIikpICYmCisgICAgICBHX1ZBTFVFX0hPTERTIChzdHJlYW1oZWFkZXIsIEdTVF9UWVBFX0FSUkFZKSAmJgorICAgICAgZ3N0X3ZhbHVlX2FycmF5X2dldF9zaXplIChzdHJlYW1oZWFkZXIpID49IDIpIHsKKyAgICBjb25zdCBHVmFsdWUgKmhlYWRlciwgKnZvcmJpc2NvbW1lbnQ7CisgICAgR3N0QnVmZmVyICpidWY7CisgICAgR3N0Rmxvd1JldHVybiByZXMgPSBHU1RfRkxPV19PSzsKKworICAgIGhlYWRlciA9IGdzdF92YWx1ZV9hcnJheV9nZXRfdmFsdWUgKHN0cmVhbWhlYWRlciwgMCk7CisgICAgaWYgKGhlYWRlciAmJiBHX1ZBTFVFX0hPTERTIChoZWFkZXIsIEdTVF9UWVBFX0JVRkZFUikpIHsKKyAgICAgIGJ1ZiA9IGdzdF92YWx1ZV9nZXRfYnVmZmVyIChoZWFkZXIpOworICAgICAgcmVzID0gZ3N0X3NwZWV4X2RlY19wYXJzZV9oZWFkZXIgKGRlYywgYnVmKTsKKyAgICAgIGlmIChyZXMgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIGdzdF9idWZmZXJfcmVwbGFjZSAoJmRlYy0+c3RyZWFtaGVhZGVyLCBidWYpOworICAgIH0KKworICAgIHZvcmJpc2NvbW1lbnQgPSBnc3RfdmFsdWVfYXJyYXlfZ2V0X3ZhbHVlIChzdHJlYW1oZWFkZXIsIDEpOworICAgIGlmICh2b3JiaXNjb21tZW50ICYmIEdfVkFMVUVfSE9MRFMgKHZvcmJpc2NvbW1lbnQsIEdTVF9UWVBFX0JVRkZFUikpIHsKKyAgICAgIGJ1ZiA9IGdzdF92YWx1ZV9nZXRfYnVmZmVyICh2b3JiaXNjb21tZW50KTsKKyAgICAgIHJlcyA9IGdzdF9zcGVleF9kZWNfcGFyc2VfY29tbWVudHMgKGRlYywgYnVmKTsKKyAgICAgIGlmIChyZXMgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIGdzdF9idWZmZXJfcmVwbGFjZSAoJmRlYy0+dm9yYmlzY29tbWVudCwgYnVmKTsKKyAgICB9CisgIH0KKworZG9uZToKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9zcGVleF9kZWNfcGFyc2VfZGF0YSAoR3N0U3BlZXhEZWMgKiBkZWMsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXMgPSBHU1RfRkxPV19PSzsKKyAgZ2ludCBpLCBmcHA7CisgIFNwZWV4Qml0cyAqYml0czsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgaWYgKCFkZWMtPmZyYW1lX2R1cmF0aW9uKQorICAgIGdvdG8gbm90X25lZ290aWF0ZWQ7CisKKyAgaWYgKEdfTElLRUxZIChnc3RfYnVmZmVyX2dldF9zaXplIChidWYpKSkgeworICAgIC8qIHNlbmQgZGF0YSB0byB0aGUgYml0c3RyZWFtICovCisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBzcGVleF9iaXRzX3JlYWRfZnJvbSAoJmRlYy0+Yml0cywgKGdjaGFyICopIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICAgIGZwcCA9IGRlYy0+aGVhZGVyLT5mcmFtZXNfcGVyX3BhY2tldDsKKyAgICBiaXRzID0gJmRlYy0+Yml0czsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlYywgInJlY2VpdmVkIGJ1ZmZlciBvZiBzaXplICUiIEdfR1NJWkVfRk9STUFUCisgICAgICAgICIsIGZwcCAlZCwgJWQgYml0cyIsIG1hcC5zaXplLCBmcHAsIHNwZWV4X2JpdHNfcmVtYWluaW5nIChiaXRzKSk7CisgIH0gZWxzZSB7CisgICAgLyogRklYTUUgPyBhY3R1YWxseSBjb25zaWRlciBob3cgbXVjaCBjb25jZWFsbWVudCBpcyBuZWVkZWQgKi8KKyAgICAvKiBjb25jZWFsbWVudCBkYXRhLCBwYXNzIE5VTEwgYXMgdGhlIGJpdHMgcGFyYW1ldGVycyAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlYywgImNyZWF0aW5nIGNvbmNlYWxtZW50IGRhdGEiKTsKKyAgICBmcHAgPSBkZWMtPmhlYWRlci0+ZnJhbWVzX3Blcl9wYWNrZXQ7CisgICAgYml0cyA9IE5VTEw7CisgIH0KKworICAvKiBub3cgZGVjb2RlIGVhY2ggZnJhbWUsIGNhdGVyaW5nIGZvciB1bmtub3duIG51bWJlciBvZiB0aGVtIChlLmcuIHJ0cCkgKi8KKyAgZm9yIChpID0gMDsgaSA8IGZwcDsgaSsrKSB7CisgICAgR3N0QnVmZmVyICpvdXRidWY7CisgICAgZ2Jvb2xlYW4gY29ycnVwdGVkID0gRkFMU0U7CisgICAgZ2ludCByZXQ7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoZGVjLCAiZGVjb2RpbmcgZnJhbWUgJWQvJWQsICVkIGJpdHMgcmVtYWluaW5nIiwgaSwgZnBwLAorICAgICAgICBiaXRzID8gc3BlZXhfYml0c19yZW1haW5pbmcgKGJpdHMpIDogLTEpOworI2lmIDAKKyAgICByZXMgPQorICAgICAgICBnc3RfcGFkX2FsbG9jX2J1ZmZlcl9hbmRfc2V0X2NhcHMgKEdTVF9BVURJT19ERUNPREVSX1NSQ19QQUQgKGRlYyksCisgICAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUX05PTkUsIGRlYy0+ZnJhbWVfc2l6ZSAqIGRlYy0+aGVhZGVyLT5uYl9jaGFubmVscyAqIDIsCisgICAgICAgIEdTVF9QQURfQ0FQUyAoR1NUX0FVRElPX0RFQ09ERVJfU1JDX1BBRCAoZGVjKSksICZvdXRidWYpOworCisgICAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVjLCAiYnVmIGFsbG9jIGZsb3c6ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJlcykpOworICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisjZW5kaWYKKyAgICAvKiBGSVhNRSwgd2UgY2FuIHVzZSBhIGJ1ZmZlcnBvb2wgYmVjYXVzZSB3ZSBoYXZlIGZpeGVkIHNpemUgYnVmZmVycy4gV2UKKyAgICAgKiBjb3VsZCBhbHNvIHVzZSBhbiBhbGxvY2F0b3IgKi8KKyAgICBvdXRidWYgPQorICAgICAgICBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwKKyAgICAgICAgZGVjLT5mcmFtZV9zaXplICogZGVjLT5oZWFkZXItPm5iX2NoYW5uZWxzICogMiwgTlVMTCk7CisKKyAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICByZXQgPSBzcGVleF9kZWNvZGVfaW50IChkZWMtPnN0YXRlLCBiaXRzLCAoc3B4X2ludDE2X3QgKikgbWFwLmRhdGEpOworCisgICAgaWYgKHJldCA9PSAtMSkgeworICAgICAgLyogdWg/IGVuZCBvZiBzdHJlYW0gKi8KKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVjLCAiVW5leHBlY3RlZCBlbmQgb2Ygc3RyZWFtIGZvdW5kIik7CisgICAgICBjb3JydXB0ZWQgPSBUUlVFOworICAgIH0gZWxzZSBpZiAocmV0ID09IC0yKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlYywgIkRlY29kaW5nIGVycm9yOiBjb3JydXB0ZWQgc3RyZWFtPyIpOworICAgICAgY29ycnVwdGVkID0gVFJVRTsKKyAgICB9CisKKyAgICBpZiAoYml0cyAmJiBzcGVleF9iaXRzX3JlbWFpbmluZyAoYml0cykgPCAwKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlYywgIkRlY29kaW5nIG92ZXJmbG93OiBjb3JydXB0ZWQgc3RyZWFtPyIpOworICAgICAgY29ycnVwdGVkID0gVFJVRTsKKyAgICB9CisgICAgaWYgKGRlYy0+aGVhZGVyLT5uYl9jaGFubmVscyA9PSAyKQorICAgICAgc3BlZXhfZGVjb2RlX3N0ZXJlb19pbnQgKChzcHhfaW50MTZfdCAqKSBtYXAuZGF0YSwgZGVjLT5mcmFtZV9zaXplLAorICAgICAgICAgIGRlYy0+c3RlcmVvKTsKKworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm1hcCk7CisKKyAgICBpZiAoIWNvcnJ1cHRlZCkgeworICAgICAgcmVzID0gZ3N0X2F1ZGlvX2RlY29kZXJfZmluaXNoX2ZyYW1lIChHU1RfQVVESU9fREVDT0RFUiAoZGVjKSwgb3V0YnVmLCAxKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzID0gZ3N0X2F1ZGlvX2RlY29kZXJfZmluaXNoX2ZyYW1lIChHU1RfQVVESU9fREVDT0RFUiAoZGVjKSwgTlVMTCwgMSk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWYpOworICAgIH0KKworICAgIGlmIChyZXMgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlYywgImZsb3c6ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJlcykpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK25vdF9uZWdvdGlhdGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlYywgQ09SRSwgTkVHT1RJQVRJT04sIChOVUxMKSwKKyAgICAgICAgKCJkZWNvZGVyIG5vdCBpbml0aWFsaXplZCIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCittZW1jbXBfYnVmZmVycyAoR3N0QnVmZmVyICogYnVmMSwgR3N0QnVmZmVyICogYnVmMikKK3sKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdzaXplIHNpemUxLCBzaXplMjsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHNpemUxID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmMSk7CisgIHNpemUyID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmMik7CisKKyAgaWYgKHNpemUxICE9IHNpemUyKQorICAgIHJldHVybiBGQUxTRTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmMSwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gZ3N0X2J1ZmZlcl9tZW1jbXAgKGJ1ZjIsIDAsIG1hcC5kYXRhLCBtYXAuc2l6ZSkgPT0gMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmMSwgJm1hcCk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9zcGVleF9kZWNfaGFuZGxlX2ZyYW1lIChHc3RBdWRpb0RlY29kZXIgKiBiZGVjLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzOworICBHc3RTcGVleERlYyAqZGVjOworCisgIC8qIG5vIGZhbmN5IGRyYWluaW5nICovCisgIGlmIChHX1VOTElLRUxZICghYnVmKSkKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgZGVjID0gR1NUX1NQRUVYX0RFQyAoYmRlYyk7CisKKyAgLyogSWYgd2UgaGF2ZSB0aGUgc3RyZWFtaGVhZGVyIGFuZCB2b3JiaXNjb21tZW50IGZyb20gdGhlIGNhcHMgYWxyZWFkeQorICAgKiBpZ25vcmUgdGhlbSBoZXJlICovCisgIGlmIChkZWMtPnN0cmVhbWhlYWRlciAmJiBkZWMtPnZvcmJpc2NvbW1lbnQpIHsKKyAgICBpZiAobWVtY21wX2J1ZmZlcnMgKGRlYy0+c3RyZWFtaGVhZGVyLCBidWYpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZWMsICJmb3VuZCBzdHJlYW1oZWFkZXIiKTsKKyAgICAgIGdzdF9hdWRpb19kZWNvZGVyX2ZpbmlzaF9mcmFtZSAoYmRlYywgTlVMTCwgMSk7CisgICAgICByZXMgPSBHU1RfRkxPV19PSzsKKyAgICB9IGVsc2UgaWYgKG1lbWNtcF9idWZmZXJzIChkZWMtPnZvcmJpc2NvbW1lbnQsIGJ1ZikpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlYywgImZvdW5kIHZvcmJpc2NvbW1lbnRzIik7CisgICAgICBnc3RfYXVkaW9fZGVjb2Rlcl9maW5pc2hfZnJhbWUgKGJkZWMsIE5VTEwsIDEpOworICAgICAgcmVzID0gR1NUX0ZMT1dfT0s7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlcyA9IGdzdF9zcGVleF9kZWNfcGFyc2VfZGF0YSAoZGVjLCBidWYpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBPdGhlcndpc2UgZmFsbCBiYWNrIHRvIHBhY2tldCBjb3VudGluZyBhbmQgYXNzdW1lIHRoYXQgdGhlCisgICAgICogZmlyc3QgdHdvIHBhY2tldHMgYXJlIHRoZSBoZWFkZXJzLiAqLworICAgIHN3aXRjaCAoZGVjLT5wYWNrZXRubykgeworICAgICAgY2FzZSAwOgorICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZWMsICJjb3VudGVkIHN0cmVhbWhlYWRlciIpOworICAgICAgICByZXMgPSBnc3Rfc3BlZXhfZGVjX3BhcnNlX2hlYWRlciAoZGVjLCBidWYpOworICAgICAgICBnc3RfYXVkaW9fZGVjb2Rlcl9maW5pc2hfZnJhbWUgKGJkZWMsIE5VTEwsIDEpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVjLCAiY291bnRlZCB2b3JiaXNjb21tZW50cyIpOworICAgICAgICByZXMgPSBnc3Rfc3BlZXhfZGVjX3BhcnNlX2NvbW1lbnRzIChkZWMsIGJ1Zik7CisgICAgICAgIGdzdF9hdWRpb19kZWNvZGVyX2ZpbmlzaF9mcmFtZSAoYmRlYywgTlVMTCwgMSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgIHsKKyAgICAgICAgcmVzID0gZ3N0X3NwZWV4X2RlY19wYXJzZV9kYXRhIChkZWMsIGJ1Zik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGRlYy0+cGFja2V0bm8rKzsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwZWV4X2RlY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0U3BlZXhEZWMgKnNwZWV4ZGVjOworCisgIHNwZWV4ZGVjID0gR1NUX1NQRUVYX0RFQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIEFSR19FTkg6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgc3BlZXhkZWMtPmVuaCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BlZXhfZGVjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTcGVleERlYyAqc3BlZXhkZWM7CisKKyAgc3BlZXhkZWMgPSBHU1RfU1BFRVhfREVDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgQVJHX0VOSDoKKyAgICAgIHNwZWV4ZGVjLT5lbmggPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9leHQvc3BlZXgvZ3N0c3BlZXhkZWMuaCBiL2V4dC9zcGVleC9nc3RzcGVleGRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMWUxNzEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc3BlZXgvZ3N0c3BlZXhkZWMuaApAQCAtMCwwICsxLDc2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1NQRUVYX0RFQ19IX18KKyNkZWZpbmUgX19HU1RfU1BFRVhfREVDX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb2RlY29kZXIuaD4KKworI2luY2x1ZGUgPHNwZWV4L3NwZWV4Lmg+CisjaW5jbHVkZSA8c3BlZXgvc3BlZXhfY2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8c3BlZXgvc3BlZXhfaGVhZGVyLmg+CisjaW5jbHVkZSA8c3BlZXgvc3BlZXhfc3RlcmVvLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9TUEVFWF9ERUMgXAorICAoZ3N0X3NwZWV4X2RlY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfU1BFRVhfREVDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfU1BFRVhfREVDLEdzdFNwZWV4RGVjKSkKKyNkZWZpbmUgR1NUX1NQRUVYX0RFQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9TUEVFWF9ERUMsR3N0U3BlZXhEZWNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19TUEVFWF9ERUMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9TUEVFWF9ERUMpKQorI2RlZmluZSBHU1RfSVNfU1BFRVhfREVDX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1NQRUVYX0RFQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RTcGVleERlYyBHc3RTcGVleERlYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RTcGVleERlY0NsYXNzIEdzdFNwZWV4RGVjQ2xhc3M7CisKK3N0cnVjdCBfR3N0U3BlZXhEZWMgeworICBHc3RBdWRpb0RlY29kZXIgICBlbGVtZW50OworCisgIHZvaWQgICAgICAgICAgICAgICAgICAqc3RhdGU7CisgIFNwZWV4U3RlcmVvU3RhdGUgICAgICAqc3RlcmVvOworICBjb25zdCBTcGVleE1vZGUgICAgICAgKm1vZGU7CisgIFNwZWV4SGVhZGVyICAgICAgICAgICAqaGVhZGVyOworICBTcGVleENhbGxiYWNrICAgICAgICAgY2FsbGJhY2s7CisgIFNwZWV4Qml0cyAgICAgICAgICAgICBiaXRzOworCisgIGdib29sZWFuICAgICAgICAgICAgICBlbmg7CisKKyAgZ2ludCAgICAgICAgICAgICAgICAgIGZyYW1lX3NpemU7CisgIEdzdENsb2NrVGltZSAgICAgICAgICBmcmFtZV9kdXJhdGlvbjsKKyAgZ3VpbnQ2NCAgICAgICAgICAgICAgIHBhY2tldG5vOworCisgIEdzdEJ1ZmZlciAgICAgICAgICAgICAqc3RyZWFtaGVhZGVyOworICBHc3RCdWZmZXIgICAgICAgICAgICAgKnZvcmJpc2NvbW1lbnQ7Cit9OworCitzdHJ1Y3QgX0dzdFNwZWV4RGVjQ2xhc3MgeworICBHc3RBdWRpb0RlY29kZXJDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3Rfc3BlZXhfZGVjX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1NQRUVYX0RFQ19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC9zcGVleC9nc3RzcGVleGVuYy5jIGIvZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI2NmFmNgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcGVleC9nc3RzcGVleGVuYy5jCkBAIC0wLDAgKzEsODQ0IEBACisvKiBHU3RyZWFtZXIgU3BlZXggRW5jb2RlcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1zcGVleGVuYworICogQHNlZV9hbHNvOiBzcGVleGRlYywgb2dnbXV4CisgKgorICogVGhpcyBlbGVtZW50IGVuY29kZXMgYXVkaW8gYXMgYSBTcGVleCBzdHJlYW0uCisgKiA8dWxpbmsgdXJsPSJodHRwOi8vd3d3LnNwZWV4Lm9yZy8iPlNwZWV4PC91bGluaz4gaXMgYSByb3lhbHR5LWZyZWUKKyAqIGF1ZGlvIGNvZGVjIG1haW50YWluZWQgYnkgdGhlIDx1bGluayB1cmw9Imh0dHA6Ly93d3cueGlwaC5vcmcvIj5YaXBoLm9yZworICogRm91bmRhdGlvbjwvdWxpbms+LgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgYXVkaW90ZXN0c3JjIG51bS1idWZmZXJzPTEwMCAhIHNwZWV4ZW5jICEgb2dnbXV4ICEgZmlsZXNpbmsgbG9jYXRpb249YmVlcC5vZ2cKKyAqIF18IEVuY29kZSBhbiBPZ2cvU3BlZXggZmlsZS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3BlZXgvc3BlZXguaD4KKyNpbmNsdWRlIDxzcGVleC9zcGVleF9zdGVyZW8uaD4KKworI2luY2x1ZGUgPGdzdC9nc3R0YWdzZXR0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgImdzdHNwZWV4ZW5jLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHNwZWV4ZW5jX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHNwZWV4ZW5jX2RlYnVnCisKKyNkZWZpbmUgRk9STUFUX1NUUiBHU1RfQVVESU9fTkUoUzE2KQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgRk9STUFUX1NUUiAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgNjAwMCwgNDgwMDAgXSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxOyAiCisgICAgICAgICJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBGT1JNQVRfU1RSICIsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyA2MDAwLCA0ODAwMCBdLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDIsICIgImNoYW5uZWwtbWFzayA9IChiaXRtYXNrKSAweDMiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXNwZWV4LCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyA2MDAwLCA0ODAwMCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgMl0iKQorICAgICk7CisKKyNkZWZpbmUgREVGQVVMVF9RVUFMSVRZICAgICAgICAgOC4wCisjZGVmaW5lIERFRkFVTFRfQklUUkFURSAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9NT0RFICAgICAgICAgICAgR1NUX1NQRUVYX0VOQ19NT0RFX0FVVE8KKyNkZWZpbmUgREVGQVVMVF9WQlIgICAgICAgICAgICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9BQlIgICAgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1ZBRCAgICAgICAgICAgICBGQUxTRQorI2RlZmluZSBERUZBVUxUX0RUWCAgICAgICAgICAgICBGQUxTRQorI2RlZmluZSBERUZBVUxUX0NPTVBMRVhJVFkgICAgICAzCisjZGVmaW5lIERFRkFVTFRfTkZSQU1FUyAgICAgICAgIDEKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUVVBTElUWSwKKyAgUFJPUF9CSVRSQVRFLAorICBQUk9QX01PREUsCisgIFBST1BfVkJSLAorICBQUk9QX0FCUiwKKyAgUFJPUF9WQUQsCisgIFBST1BfRFRYLAorICBQUk9QX0NPTVBMRVhJVFksCisgIFBST1BfTkZSQU1FUywKKyAgUFJPUF9MQVNUX01FU1NBR0UKK307CisKKyNkZWZpbmUgR1NUX1RZUEVfU1BFRVhfRU5DX01PREUgKGdzdF9zcGVleF9lbmNfbW9kZV9nZXRfdHlwZSgpKQorc3RhdGljIEdUeXBlCitnc3Rfc3BlZXhfZW5jX21vZGVfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBzcGVleF9lbmNfbW9kZV90eXBlID0gMDsKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgc3BlZXhfZW5jX21vZGVzW10gPSB7CisgICAge0dTVF9TUEVFWF9FTkNfTU9ERV9BVVRPLCAiQXV0byIsICJhdXRvIn0sCisgICAge0dTVF9TUEVFWF9FTkNfTU9ERV9VV0IsICJVbHRyYSBXaWRlIEJhbmQiLCAidXdiIn0sCisgICAge0dTVF9TUEVFWF9FTkNfTU9ERV9XQiwgIldpZGUgQmFuZCIsICJ3YiJ9LAorICAgIHtHU1RfU1BFRVhfRU5DX01PREVfTkIsICJOYXJyb3cgQmFuZCIsICJuYiJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKyAgaWYgKEdfVU5MSUtFTFkgKHNwZWV4X2VuY19tb2RlX3R5cGUgPT0gMCkpIHsKKyAgICBzcGVleF9lbmNfbW9kZV90eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFNwZWV4RW5jTW9kZSIsCisgICAgICAgIHNwZWV4X2VuY19tb2Rlcyk7CisgIH0KKyAgcmV0dXJuIHNwZWV4X2VuY19tb2RlX3R5cGU7Cit9CisKK3N0YXRpYyB2b2lkIGdzdF9zcGVleF9lbmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NwZWV4X2VuY19zZXR1cCAoR3N0U3BlZXhFbmMgKiBlbmMpOworCitzdGF0aWMgdm9pZCBnc3Rfc3BlZXhfZW5jX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9zcGVleF9lbmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfc3BlZXhfZW5jX2VuY29kZSAoR3N0U3BlZXhFbmMgKiBlbmMsIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc3BlZXhfZW5jX3N0YXJ0IChHc3RBdWRpb0VuY29kZXIgKiBlbmMpOworc3RhdGljIGdib29sZWFuIGdzdF9zcGVleF9lbmNfc3RvcCAoR3N0QXVkaW9FbmNvZGVyICogZW5jKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc3BlZXhfZW5jX3NldF9mb3JtYXQgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYywKKyAgICBHc3RBdWRpb0luZm8gKiBpbmZvKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9zcGVleF9lbmNfaGFuZGxlX2ZyYW1lIChHc3RBdWRpb0VuY29kZXIgKiBlbmMsCisgICAgR3N0QnVmZmVyICogaW5fYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc3BlZXhfZW5jX3NpbmtfZXZlbnQgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYywKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworI2RlZmluZSBnc3Rfc3BlZXhfZW5jX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RTcGVleEVuYywgZ3N0X3NwZWV4X2VuYywgR1NUX1RZUEVfQVVESU9fRU5DT0RFUiwKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1RBR19TRVRURVIsIE5VTEwpOworICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfUFJFU0VULCBOVUxMKSk7CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BlZXhfZW5jX2NsYXNzX2luaXQgKEdzdFNwZWV4RW5jQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEF1ZGlvRW5jb2RlckNsYXNzICpiYXNlX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgYmFzZV9jbGFzcyA9IChHc3RBdWRpb0VuY29kZXJDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9zcGVleF9lbmNfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9zcGVleF9lbmNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfc3BlZXhfZW5jX2dldF9wcm9wZXJ0eTsKKworICBiYXNlX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3BlZXhfZW5jX3N0YXJ0KTsKKyAgYmFzZV9jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3BlZXhfZW5jX3N0b3ApOworICBiYXNlX2NsYXNzLT5zZXRfZm9ybWF0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zcGVleF9lbmNfc2V0X2Zvcm1hdCk7CisgIGJhc2VfY2xhc3MtPmhhbmRsZV9mcmFtZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3BlZXhfZW5jX2hhbmRsZV9mcmFtZSk7CisgIGJhc2VfY2xhc3MtPnNpbmtfZXZlbnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NwZWV4X2VuY19zaW5rX2V2ZW50KTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1FVQUxJVFksCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJxdWFsaXR5IiwgIlF1YWxpdHkiLCAiRW5jb2RpbmcgcXVhbGl0eSIsCisgICAgICAgICAgMC4wLCAxMC4wLCBERUZBVUxUX1FVQUxJVFksCisgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9CSVRSQVRFLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImJpdHJhdGUiLCAiRW5jb2RpbmcgQml0LXJhdGUiLAorICAgICAgICAgICJTcGVjaWZ5IGFuIGVuY29kaW5nIGJpdC1yYXRlIChpbiBicHMpLiAoMCA9IGF1dG9tYXRpYykiLAorICAgICAgICAgIDAsIEdfTUFYSU5ULCBERUZBVUxUX0JJVFJBVEUsCisgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJtb2RlIiwgIk1vZGUiLCAiVGhlIGVuY29kaW5nIG1vZGUiLAorICAgICAgICAgIEdTVF9UWVBFX1NQRUVYX0VOQ19NT0RFLCBHU1RfU1BFRVhfRU5DX01PREVfQVVUTywKKyAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1ZCUiwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgidmJyIiwgIlZCUiIsCisgICAgICAgICAgIkVuYWJsZSB2YXJpYWJsZSBiaXQtcmF0ZSIsIERFRkFVTFRfVkJSLAorICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQUJSLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImFiciIsICJBQlIiLAorICAgICAgICAgICJFbmFibGUgYXZlcmFnZSBiaXQtcmF0ZSAoMCA9IGRpc2FibGVkKSIsCisgICAgICAgICAgMCwgR19NQVhJTlQsIERFRkFVTFRfQUJSLAorICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfVkFELAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJ2YWQiLCAiVkFEIiwKKyAgICAgICAgICAiRW5hYmxlIHZvaWNlIGFjdGl2aXR5IGRldGVjdGlvbiIsIERFRkFVTFRfVkFELAorICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfRFRYLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJkdHgiLCAiRFRYIiwKKyAgICAgICAgICAiRW5hYmxlIGRpc2NvbnRpbnVvdXMgdHJhbnNtaXNzaW9uIiwgREVGQVVMVF9EVFgsCisgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9DT01QTEVYSVRZLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImNvbXBsZXhpdHkiLCAiQ29tcGxleGl0eSIsCisgICAgICAgICAgIlNldCBlbmNvZGluZyBjb21wbGV4aXR5IiwKKyAgICAgICAgICAwLCBHX01BWElOVCwgREVGQVVMVF9DT01QTEVYSVRZLAorICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfTkZSQU1FUywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJuZnJhbWVzIiwgIk5GcmFtZXMiLAorICAgICAgICAgICJOdW1iZXIgb2YgZnJhbWVzIHBlciBidWZmZXIiLAorICAgICAgICAgIDAsIEdfTUFYSU5ULCBERUZBVUxUX05GUkFNRVMsCisgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9MQVNUX01FU1NBR0UsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgibGFzdC1tZXNzYWdlIiwgImxhc3QtbWVzc2FnZSIsCisgICAgICAgICAgIlRoZSBsYXN0IHN0YXR1cyBtZXNzYWdlIiwgTlVMTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc3JjX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiU3BlZXggYXVkaW8gZW5jb2RlciIsICJDb2RlYy9FbmNvZGVyL0F1ZGlvIiwKKyAgICAgICJFbmNvZGVzIGF1ZGlvIGluIFNwZWV4IGZvcm1hdCIsICJXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPiIpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChzcGVleGVuY19kZWJ1ZywgInNwZWV4ZW5jIiwgMCwgIlNwZWV4IGVuY29kZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGVleF9lbmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFNwZWV4RW5jICplbmM7CisKKyAgZW5jID0gR1NUX1NQRUVYX0VOQyAob2JqZWN0KTsKKworICBnX2ZyZWUgKGVuYy0+bGFzdF9tZXNzYWdlKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BlZXhfZW5jX2luaXQgKEdzdFNwZWV4RW5jICogZW5jKQoreworICBHc3RBdWRpb0VuY29kZXIgKmJlbmMgPSBHU1RfQVVESU9fRU5DT0RFUiAoZW5jKTsKKworICAvKiBhcnJhbmdlIGdyYW51bGVwb3MgbWFya2luZyAoYW5kIHJlcXVpcmVkIHBlcmZlY3QgdHMpICovCisgIGdzdF9hdWRpb19lbmNvZGVyX3NldF9tYXJrX2dyYW51bGUgKGJlbmMsIFRSVUUpOworICBnc3RfYXVkaW9fZW5jb2Rlcl9zZXRfcGVyZmVjdF90aW1lc3RhbXAgKGJlbmMsIFRSVUUpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9BVURJT19FTkNPREVSX1NJTktfUEFEIChlbmMpKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BlZXhfZW5jX3N0YXJ0IChHc3RBdWRpb0VuY29kZXIgKiBiZW5jKQoreworICBHc3RTcGVleEVuYyAqZW5jID0gR1NUX1NQRUVYX0VOQyAoYmVuYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZW5jLCAic3RhcnQiKTsKKyAgc3BlZXhfYml0c19pbml0ICgmZW5jLT5iaXRzKTsKKyAgZW5jLT50YWdzID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZW5jLT5oZWFkZXJfc2VudCA9IEZBTFNFOworICBlbmMtPmVuY29kZWRfc2FtcGxlcyA9IDA7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NwZWV4X2VuY19zdG9wIChHc3RBdWRpb0VuY29kZXIgKiBiZW5jKQoreworICBHc3RTcGVleEVuYyAqZW5jID0gR1NUX1NQRUVYX0VOQyAoYmVuYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZW5jLCAic3RvcCIpOworICBlbmMtPmhlYWRlcl9zZW50ID0gRkFMU0U7CisgIGlmIChlbmMtPnN0YXRlKSB7CisgICAgc3BlZXhfZW5jb2Rlcl9kZXN0cm95IChlbmMtPnN0YXRlKTsKKyAgICBlbmMtPnN0YXRlID0gTlVMTDsKKyAgfQorICBzcGVleF9iaXRzX2Rlc3Ryb3kgKCZlbmMtPmJpdHMpOworICBzcGVleF9iaXRzX3NldF9iaXRfYnVmZmVyICgmZW5jLT5iaXRzLCBOVUxMLCAwKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmIChlbmMtPnRhZ3MpOworICBlbmMtPnRhZ3MgPSBOVUxMOworCisgIGdzdF90YWdfc2V0dGVyX3Jlc2V0X3RhZ3MgKEdTVF9UQUdfU0VUVEVSIChlbmMpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdpbnQ2NAorZ3N0X3NwZWV4X2VuY19nZXRfbGF0ZW5jeSAoR3N0U3BlZXhFbmMgKiBlbmMpCit7CisgIC8qIFNlZSB0aGUgU3BlZXggbWFudWFsIHNlY3Rpb24gIkxhdGVuY3kgYW5kIGFsZ29yaXRobWljIGRlbGF5IiAqLworICBpZiAoZW5jLT5yYXRlID09IDgwMDApCisgICAgcmV0dXJuIDMwICogR1NUX01TRUNPTkQ7CisgIGVsc2UKKyAgICByZXR1cm4gMzQgKiBHU1RfTVNFQ09ORDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BlZXhfZW5jX3NldF9mb3JtYXQgKEdzdEF1ZGlvRW5jb2RlciAqIGJlbmMsIEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIEdzdFNwZWV4RW5jICplbmM7CisKKyAgZW5jID0gR1NUX1NQRUVYX0VOQyAoYmVuYyk7CisKKyAgZW5jLT5jaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTIChpbmZvKTsKKyAgZW5jLT5yYXRlID0gR1NUX0FVRElPX0lORk9fUkFURSAoaW5mbyk7CisKKyAgLyogaGFuZGxlIHJlY29uZmlndXJlICovCisgIGlmIChlbmMtPnN0YXRlKSB7CisgICAgc3BlZXhfZW5jb2Rlcl9kZXN0cm95IChlbmMtPnN0YXRlKTsKKyAgICBlbmMtPnN0YXRlID0gTlVMTDsKKyAgfQorCisgIGlmICghZ3N0X3NwZWV4X2VuY19zZXR1cCAoZW5jKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogZmVlZGJhY2sgdG8gYmFzZSBjbGFzcyAqLworICBnc3RfYXVkaW9fZW5jb2Rlcl9zZXRfbGF0ZW5jeSAoYmVuYywKKyAgICAgIGdzdF9zcGVleF9lbmNfZ2V0X2xhdGVuY3kgKGVuYyksIGdzdF9zcGVleF9lbmNfZ2V0X2xhdGVuY3kgKGVuYykpOworICBnc3RfYXVkaW9fZW5jb2Rlcl9zZXRfbG9va2FoZWFkIChiZW5jLCBlbmMtPmxvb2thaGVhZCk7CisKKyAgaWYgKGVuYy0+bmZyYW1lcyA9PSAwKSB7CisgICAgLyogYXMgbWFueSBmcmFtZXMgYXMgYXZhaWxhYmxlIGlucHV0IGFsbG93cyAqLworICAgIGdzdF9hdWRpb19lbmNvZGVyX3NldF9mcmFtZV9zYW1wbGVzX21pbiAoYmVuYywgZW5jLT5mcmFtZV9zaXplKTsKKyAgICBnc3RfYXVkaW9fZW5jb2Rlcl9zZXRfZnJhbWVfc2FtcGxlc19tYXggKGJlbmMsIGVuYy0+ZnJhbWVfc2l6ZSk7CisgICAgZ3N0X2F1ZGlvX2VuY29kZXJfc2V0X2ZyYW1lX21heCAoYmVuYywgMCk7CisgIH0gZWxzZSB7CisgICAgLyogZXhhY3RseSBhcyBtYW55IGZyYW1lcyBhcyBjb25maWd1cmVkICovCisgICAgZ3N0X2F1ZGlvX2VuY29kZXJfc2V0X2ZyYW1lX3NhbXBsZXNfbWluIChiZW5jLAorICAgICAgICBlbmMtPmZyYW1lX3NpemUgKiBlbmMtPm5mcmFtZXMpOworICAgIGdzdF9hdWRpb19lbmNvZGVyX3NldF9mcmFtZV9zYW1wbGVzX21heCAoYmVuYywKKyAgICAgICAgZW5jLT5mcmFtZV9zaXplICogZW5jLT5uZnJhbWVzKTsKKyAgICBnc3RfYXVkaW9fZW5jb2Rlcl9zZXRfZnJhbWVfbWF4IChiZW5jLCAxKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9zcGVleF9lbmNfY3JlYXRlX21ldGFkYXRhX2J1ZmZlciAoR3N0U3BlZXhFbmMgKiBlbmMpCit7CisgIGNvbnN0IEdzdFRhZ0xpc3QgKnVzZXJfdGFnczsKKyAgR3N0VGFnTGlzdCAqbWVyZ2VkX3RhZ3M7CisgIEdzdEJ1ZmZlciAqY29tbWVudHMgPSBOVUxMOworCisgIHVzZXJfdGFncyA9IGdzdF90YWdfc2V0dGVyX2dldF90YWdfbGlzdCAoR1NUX1RBR19TRVRURVIgKGVuYykpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgInVwc3RyZWFtIHRhZ3MgPSAlIiBHU1RfUFRSX0ZPUk1BVCwgZW5jLT50YWdzKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoZW5jLCAidXNlci1zZXQgdGFncyA9ICUiIEdTVF9QVFJfRk9STUFULCB1c2VyX3RhZ3MpOworCisgIC8qIGdzdF90YWdfbGlzdF9tZXJnZSgpIHdpbGwgaGFuZGxlIE5VTEwgZm9yIGVpdGhlciBvciBib3RoIGxpc3RzIGZpbmUgKi8KKyAgbWVyZ2VkX3RhZ3MgPSBnc3RfdGFnX2xpc3RfbWVyZ2UgKHVzZXJfdGFncywgZW5jLT50YWdzLAorICAgICAgZ3N0X3RhZ19zZXR0ZXJfZ2V0X3RhZ19tZXJnZV9tb2RlIChHU1RfVEFHX1NFVFRFUiAoZW5jKSkpOworCisgIGlmIChtZXJnZWRfdGFncyA9PSBOVUxMKQorICAgIG1lcmdlZF90YWdzID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJtZXJnZWQgICB0YWdzID0gJSIgR1NUX1BUUl9GT1JNQVQsIG1lcmdlZF90YWdzKTsKKyAgY29tbWVudHMgPSBnc3RfdGFnX2xpc3RfdG9fdm9yYmlzY29tbWVudF9idWZmZXIgKG1lcmdlZF90YWdzLCBOVUxMLAorICAgICAgMCwgIkVuY29kZWQgd2l0aCBHU3RyZWFtZXIgU3BlZXhlbmMiKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmIChtZXJnZWRfdGFncyk7CisKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKGNvbW1lbnRzKSA9IDA7CisgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoY29tbWVudHMpID0gMDsKKworICByZXR1cm4gY29tbWVudHM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BlZXhfZW5jX3NldF9sYXN0X21zZyAoR3N0U3BlZXhFbmMgKiBlbmMsIGNvbnN0IGdjaGFyICogbXNnKQoreworICBnX2ZyZWUgKGVuYy0+bGFzdF9tZXNzYWdlKTsKKyAgZW5jLT5sYXN0X21lc3NhZ2UgPSBnX3N0cmR1cCAobXNnKTsKKyAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbmMsICIlcyIsIG1zZyk7CisgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKGVuYyksICJsYXN0LW1lc3NhZ2UiKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BlZXhfZW5jX3NldHVwIChHc3RTcGVleEVuYyAqIGVuYykKK3sKKyAgc3dpdGNoIChlbmMtPm1vZGUpIHsKKyAgICBjYXNlIEdTVF9TUEVFWF9FTkNfTU9ERV9VV0I6CisgICAgICBHU1RfTE9HX09CSkVDVCAoZW5jLCAiY29uZmlndXJpbmcgZm9yIHJlcXVlc3RlZCBVV0IgbW9kZSIpOworICAgICAgZW5jLT5zcGVleF9tb2RlID0gc3BlZXhfbGliX2dldF9tb2RlIChTUEVFWF9NT0RFSURfVVdCKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NQRUVYX0VOQ19NT0RFX1dCOgorICAgICAgR1NUX0xPR19PQkpFQ1QgKGVuYywgImNvbmZpZ3VyaW5nIGZvciByZXF1ZXN0ZWQgV0IgbW9kZSIpOworICAgICAgZW5jLT5zcGVleF9tb2RlID0gc3BlZXhfbGliX2dldF9tb2RlIChTUEVFWF9NT0RFSURfV0IpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1BFRVhfRU5DX01PREVfTkI6CisgICAgICBHU1RfTE9HX09CSkVDVCAoZW5jLCAiY29uZmlndXJpbmcgZm9yIHJlcXVlc3RlZCBOQiBtb2RlIik7CisgICAgICBlbmMtPnNwZWV4X21vZGUgPSBzcGVleF9saWJfZ2V0X21vZGUgKFNQRUVYX01PREVJRF9OQik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TUEVFWF9FTkNfTU9ERV9BVVRPOgorICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICBHU1RfTE9HX09CSkVDVCAoZW5jLCAiZmluZGluZyBiZXN0IG1vZGUiKTsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoZW5jLT5yYXRlID4gMjUwMDApIHsKKyAgICBpZiAoZW5jLT5tb2RlID09IEdTVF9TUEVFWF9FTkNfTU9ERV9BVVRPKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZW5jLCAic2VsZWN0ZWQgVVdCIG1vZGUgZm9yIHNhbXBsZXJhdGUgJWQiLCBlbmMtPnJhdGUpOworICAgICAgZW5jLT5zcGVleF9tb2RlID0gc3BlZXhfbGliX2dldF9tb2RlIChTUEVFWF9NT0RFSURfVVdCKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGVuYy0+c3BlZXhfbW9kZSAhPSBzcGVleF9saWJfZ2V0X21vZGUgKFNQRUVYX01PREVJRF9VV0IpKSB7CisgICAgICAgIGdzdF9zcGVleF9lbmNfc2V0X2xhc3RfbXNnIChlbmMsCisgICAgICAgICAgICAiV2FybmluZzogc3VnZ2VzdCB0byB1c2UgdWx0cmEgd2lkZSBiYW5kIG1vZGUgZm9yIHRoaXMgcmF0ZSIpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmIChlbmMtPnJhdGUgPiAxMjUwMCkgeworICAgIGlmIChlbmMtPm1vZGUgPT0gR1NUX1NQRUVYX0VOQ19NT0RFX0FVVE8pIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChlbmMsICJzZWxlY3RlZCBXQiBtb2RlIGZvciBzYW1wbGVyYXRlICVkIiwgZW5jLT5yYXRlKTsKKyAgICAgIGVuYy0+c3BlZXhfbW9kZSA9IHNwZWV4X2xpYl9nZXRfbW9kZSAoU1BFRVhfTU9ERUlEX1dCKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGVuYy0+c3BlZXhfbW9kZSAhPSBzcGVleF9saWJfZ2V0X21vZGUgKFNQRUVYX01PREVJRF9XQikpIHsKKyAgICAgICAgZ3N0X3NwZWV4X2VuY19zZXRfbGFzdF9tc2cgKGVuYywKKyAgICAgICAgICAgICJXYXJuaW5nOiBzdWdnZXN0IHRvIHVzZSB3aWRlIGJhbmQgbW9kZSBmb3IgdGhpcyByYXRlIik7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChlbmMtPm1vZGUgPT0gR1NUX1NQRUVYX0VOQ19NT0RFX0FVVE8pIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChlbmMsICJzZWxlY3RlZCBOQiBtb2RlIGZvciBzYW1wbGVyYXRlICVkIiwgZW5jLT5yYXRlKTsKKyAgICAgIGVuYy0+c3BlZXhfbW9kZSA9IHNwZWV4X2xpYl9nZXRfbW9kZSAoU1BFRVhfTU9ERUlEX05CKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGVuYy0+c3BlZXhfbW9kZSAhPSBzcGVleF9saWJfZ2V0X21vZGUgKFNQRUVYX01PREVJRF9OQikpIHsKKyAgICAgICAgZ3N0X3NwZWV4X2VuY19zZXRfbGFzdF9tc2cgKGVuYywKKyAgICAgICAgICAgICJXYXJuaW5nOiBzdWdnZXN0IHRvIHVzZSBuYXJyb3cgYmFuZCBtb2RlIGZvciB0aGlzIHJhdGUiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoZW5jLT5yYXRlICE9IDgwMDAgJiYgZW5jLT5yYXRlICE9IDE2MDAwICYmIGVuYy0+cmF0ZSAhPSAzMjAwMCkgeworICAgIGdzdF9zcGVleF9lbmNfc2V0X2xhc3RfbXNnIChlbmMsCisgICAgICAgICJXYXJuaW5nOiBzcGVleCBpcyBvcHRpbWl6ZWQgZm9yIDgsIDE2IGFuZCAzMiBLSHoiKTsKKyAgfQorCisgIHNwZWV4X2luaXRfaGVhZGVyICgmZW5jLT5oZWFkZXIsIGVuYy0+cmF0ZSwgMSwgZW5jLT5zcGVleF9tb2RlKTsKKyAgZW5jLT5oZWFkZXIuZnJhbWVzX3Blcl9wYWNrZXQgPSBlbmMtPm5mcmFtZXM7CisgIGVuYy0+aGVhZGVyLnZiciA9IGVuYy0+dmJyOworICBlbmMtPmhlYWRlci5uYl9jaGFubmVscyA9IGVuYy0+Y2hhbm5lbHM7CisKKyAgLypJbml0aWFsaXplIFNwZWV4IGVuY29kZXIgKi8KKyAgZW5jLT5zdGF0ZSA9IHNwZWV4X2VuY29kZXJfaW5pdCAoZW5jLT5zcGVleF9tb2RlKTsKKworICBzcGVleF9lbmNvZGVyX2N0bCAoZW5jLT5zdGF0ZSwgU1BFRVhfR0VUX0ZSQU1FX1NJWkUsICZlbmMtPmZyYW1lX3NpemUpOworICBzcGVleF9lbmNvZGVyX2N0bCAoZW5jLT5zdGF0ZSwgU1BFRVhfU0VUX0NPTVBMRVhJVFksICZlbmMtPmNvbXBsZXhpdHkpOworICBzcGVleF9lbmNvZGVyX2N0bCAoZW5jLT5zdGF0ZSwgU1BFRVhfU0VUX1NBTVBMSU5HX1JBVEUsICZlbmMtPnJhdGUpOworCisgIGlmIChlbmMtPnZicikKKyAgICBzcGVleF9lbmNvZGVyX2N0bCAoZW5jLT5zdGF0ZSwgU1BFRVhfU0VUX1ZCUl9RVUFMSVRZLCAmZW5jLT5xdWFsaXR5KTsKKyAgZWxzZSB7CisgICAgZ2ludCB0bXAgPSBmbG9vciAoZW5jLT5xdWFsaXR5KTsKKworICAgIHNwZWV4X2VuY29kZXJfY3RsIChlbmMtPnN0YXRlLCBTUEVFWF9TRVRfUVVBTElUWSwgJnRtcCk7CisgIH0KKyAgaWYgKGVuYy0+Yml0cmF0ZSkgeworICAgIGlmIChlbmMtPnF1YWxpdHkgPj0gMC4wICYmIGVuYy0+dmJyKSB7CisgICAgICBnc3Rfc3BlZXhfZW5jX3NldF9sYXN0X21zZyAoZW5jLAorICAgICAgICAgICJXYXJuaW5nOiBiaXRyYXRlIG9wdGlvbiBpcyBvdmVycmlkaW5nIHF1YWxpdHkiKTsKKyAgICB9CisgICAgc3BlZXhfZW5jb2Rlcl9jdGwgKGVuYy0+c3RhdGUsIFNQRUVYX1NFVF9CSVRSQVRFLCAmZW5jLT5iaXRyYXRlKTsKKyAgfQorICBpZiAoZW5jLT52YnIpIHsKKyAgICBnaW50IHRtcCA9IDE7CisKKyAgICBzcGVleF9lbmNvZGVyX2N0bCAoZW5jLT5zdGF0ZSwgU1BFRVhfU0VUX1ZCUiwgJnRtcCk7CisgIH0gZWxzZSBpZiAoZW5jLT52YWQpIHsKKyAgICBnaW50IHRtcCA9IDE7CisKKyAgICBzcGVleF9lbmNvZGVyX2N0bCAoZW5jLT5zdGF0ZSwgU1BFRVhfU0VUX1ZBRCwgJnRtcCk7CisgIH0KKworICBpZiAoZW5jLT5kdHgpIHsKKyAgICBnaW50IHRtcCA9IDE7CisKKyAgICBzcGVleF9lbmNvZGVyX2N0bCAoZW5jLT5zdGF0ZSwgU1BFRVhfU0VUX0RUWCwgJnRtcCk7CisgIH0KKworICBpZiAoZW5jLT5kdHggJiYgIShlbmMtPnZiciB8fCBlbmMtPmFiciB8fCBlbmMtPnZhZCkpIHsKKyAgICBnc3Rfc3BlZXhfZW5jX3NldF9sYXN0X21zZyAoZW5jLAorICAgICAgICAiV2FybmluZzogZHR4IGlzIHVzZWxlc3Mgd2l0aG91dCB2YWQsIHZiciBvciBhYnIiKTsKKyAgfSBlbHNlIGlmICgoZW5jLT52YnIgfHwgZW5jLT5hYnIpICYmIChlbmMtPnZhZCkpIHsKKyAgICBnc3Rfc3BlZXhfZW5jX3NldF9sYXN0X21zZyAoZW5jLAorICAgICAgICAiV2FybmluZzogdmFkIGlzIGFscmVhZHkgaW1wbGllZCBieSB2YnIgb3IgYWJyIik7CisgIH0KKworICBpZiAoZW5jLT5hYnIpIHsKKyAgICBzcGVleF9lbmNvZGVyX2N0bCAoZW5jLT5zdGF0ZSwgU1BFRVhfU0VUX0FCUiwgJmVuYy0+YWJyKTsKKyAgfQorCisgIHNwZWV4X2VuY29kZXJfY3RsIChlbmMtPnN0YXRlLCBTUEVFWF9HRVRfTE9PS0FIRUFELCAmZW5jLT5sb29rYWhlYWQpOworCisgIEdTVF9MT0dfT0JKRUNUIChlbmMsICJ3ZSBoYXZlIGZyYW1lIHNpemUgJWQsIGxvb2thaGVhZCAlZCIsIGVuYy0+ZnJhbWVfc2l6ZSwKKyAgICAgIGVuYy0+bG9va2FoZWFkKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BlZXhfZW5jX3NpbmtfZXZlbnQgKEdzdEF1ZGlvRW5jb2RlciAqIGJlbmMsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFNwZWV4RW5jICplbmM7CisKKyAgZW5jID0gR1NUX1NQRUVYX0VOQyAoYmVuYyk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfVEFHOgorICAgIHsKKyAgICAgIGlmIChlbmMtPnRhZ3MpIHsKKyAgICAgICAgR3N0VGFnTGlzdCAqbGlzdDsKKworICAgICAgICBnc3RfZXZlbnRfcGFyc2VfdGFnIChldmVudCwgJmxpc3QpOworICAgICAgICBnc3RfdGFnX2xpc3RfaW5zZXJ0IChlbmMtPnRhZ3MsIGxpc3QsCisgICAgICAgICAgICBnc3RfdGFnX3NldHRlcl9nZXRfdGFnX21lcmdlX21vZGUgKEdTVF9UQUdfU0VUVEVSIChlbmMpKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgICAgZW5jLT5lbmNvZGVkX3NhbXBsZXMgPSAwOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogd2Ugb25seSBwZWVrZWQsIGxldCBiYXNlIGNsYXNzIGhhbmRsZSBpdCAqLworICByZXR1cm4gR1NUX0FVRElPX0VOQ09ERVJfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNpbmtfZXZlbnQgKGJlbmMsIGV2ZW50KTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9zcGVleF9lbmNfZW5jb2RlIChHc3RTcGVleEVuYyAqIGVuYywgR3N0QnVmZmVyICogYnVmKQoreworICBnaW50IGZyYW1lX3NpemUgPSBlbmMtPmZyYW1lX3NpemU7CisgIGdpbnQgYnl0ZXMgPSBmcmFtZV9zaXplICogMiAqIGVuYy0+Y2hhbm5lbHMsIHNhbXBsZXM7CisgIGdpbnQgb3V0c2l6ZSwgd3JpdHRlbiwgZHR4X3JldCA9IDA7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKmRhdGEsICpkYXRhMCA9IE5VTEwsICpiZGF0YTsKKyAgZ3NpemUgYnNpemUsIHNpemU7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RTZWdtZW50ICpzZWdtZW50OworICBHc3RDbG9ja1RpbWUgZHVyYXRpb247CisKKyAgaWYgKEdfTElLRUxZIChidWYpKSB7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBiZGF0YSA9IG1hcC5kYXRhOworICAgIGJzaXplID0gbWFwLnNpemU7CisKKyAgICBpZiAoR19VTkxJS0VMWSAoYnNpemUgJSBieXRlcykpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgImRyYWluaW5nOyBhZGRpbmcgc2lsZW5jZSBzYW1wbGVzIik7CisKKyAgICAgIC8qIElmIGVuY29kaW5nIHBhcnQgb2YgYSBmcmFtZSwgYW5kIHdlIGhhdmUgbm8gc2V0IHN0b3AgdGltZSBvbgorICAgICAgICogdGhlIG91dHB1dCBzZWdtZW50LCB3ZSB1cGRhdGUgdGhlIHNlZ21lbnQgc3RvcCB0aW1lIHRvIHJlZmxlY3QKKyAgICAgICAqIHRoZSBsYXN0IHNhbXBsZS4gVGhpcyB3aWxsIGxldCBvZ2dtdXggc2V0IHRoZSBsYXN0IHBhZ2UncworICAgICAgICogZ3JhbnBvcyB0byB0ZWxsIGEgZGVjb2RlciB0aGUgZHVtbXkgc2FtcGxlcyBzaG91bGQgYmUgY2xpcHBlZC4KKyAgICAgICAqLworICAgICAgc2VnbWVudCA9ICZHU1RfQVVESU9fRU5DT0RFUl9PVVRQVVRfU0VHTUVOVCAoZW5jKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgImV4aXN0aW5nIG91dHB1dCBzZWdtZW50ICUiIEdTVF9TRUdNRU5UX0ZPUk1BVCwKKyAgICAgICAgICBzZWdtZW50KTsKKyAgICAgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHNlZ21lbnQtPnN0b3ApKSB7CisgICAgICAgIGludCBpbnB1dF9zYW1wbGVzID0gYnNpemUgLyAoZW5jLT5jaGFubmVscyAqIDIpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChlbmMsCisgICAgICAgICAgICAiTm8gc3RvcCB0aW1lIGFuZCBwYXJ0aWFsIGZyYW1lLCB1cGRhdGluZyBzZWdtZW50Iik7CisgICAgICAgIGR1cmF0aW9uID0KKyAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoZW5jLT5lbmNvZGVkX3NhbXBsZXMgKyBpbnB1dF9zYW1wbGVzLAorICAgICAgICAgICAgR1NUX1NFQ09ORCwgZW5jLT5yYXRlKTsKKyAgICAgICAgc2VnbWVudC0+c3RvcCA9IHNlZ21lbnQtPnN0YXJ0ICsgZHVyYXRpb247CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgIm5ldyBvdXRwdXQgc2VnbWVudCAlIiBHU1RfU0VHTUVOVF9GT1JNQVQsCisgICAgICAgICAgICBzZWdtZW50KTsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChHU1RfQVVESU9fRU5DT0RFUl9TUkNfUEFEIChlbmMpLAorICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19zZWdtZW50IChzZWdtZW50KSk7CisgICAgICB9CisKKyAgICAgIHNpemUgPSAoKGJzaXplIC8gYnl0ZXMpICsgMSkgKiBieXRlczsKKyAgICAgIGRhdGEwID0gZGF0YSA9IGdfbWFsbG9jMCAoc2l6ZSk7CisgICAgICBtZW1jcHkgKGRhdGEsIGJkYXRhLCBic2l6ZSk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgICAgYmRhdGEgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICBkYXRhID0gYmRhdGE7CisgICAgICBzaXplID0gYnNpemU7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgIm5vdGhpbmcgdG8gZHJhaW4iKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBzYW1wbGVzID0gc2l6ZSAvICgyICogZW5jLT5jaGFubmVscyk7CisgIHNwZWV4X2JpdHNfcmVzZXQgKCZlbmMtPmJpdHMpOworCisgIC8qIEZJWE1FIHdoYXQgYWJvdXQgZHJvcHBlZCBzYW1wbGVzIGlmIERUUyBlbmFibGVkID8/ICovCisKKyAgd2hpbGUgKHNpemUpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJlbmNvZGluZyAlZCBzYW1wbGVzICglZCBieXRlcykiLCBmcmFtZV9zaXplLCBieXRlcyk7CisKKyAgICBpZiAoZW5jLT5jaGFubmVscyA9PSAyKSB7CisgICAgICBzcGVleF9lbmNvZGVfc3RlcmVvX2ludCAoKGdpbnQxNiAqKSBkYXRhLCBmcmFtZV9zaXplLCAmZW5jLT5iaXRzKTsKKyAgICB9CisgICAgZHR4X3JldCArPSBzcGVleF9lbmNvZGVfaW50IChlbmMtPnN0YXRlLCAoZ2ludDE2ICopIGRhdGEsICZlbmMtPmJpdHMpOworCisgICAgZGF0YSArPSBieXRlczsKKyAgICBzaXplIC09IGJ5dGVzOworICB9CisKKyAgc3BlZXhfYml0c19pbnNlcnRfdGVybWluYXRvciAoJmVuYy0+Yml0cyk7CisgIG91dHNpemUgPSBzcGVleF9iaXRzX25ieXRlcyAoJmVuYy0+Yml0cyk7CisKKyAgaWYgKGJkYXRhKQorICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyNpZiAwCisgIHJldCA9IGdzdF9wYWRfYWxsb2NfYnVmZmVyX2FuZF9zZXRfY2FwcyAoR1NUX0FVRElPX0VOQ09ERVJfU1JDX1BBRCAoZW5jKSwKKyAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUX05PTkUsIG91dHNpemUsCisgICAgICBHU1RfUEFEX0NBUFMgKEdTVF9BVURJT19FTkNPREVSX1NSQ19QQUQgKGVuYykpLCAmb3V0YnVmKTsKKworICBpZiAoKEdTVF9GTE9XX09LICE9IHJldCkpCisgICAgZ290byBkb25lOworI2VuZGlmCisgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCBvdXRzaXplLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisKKyAgd3JpdHRlbiA9IHNwZWV4X2JpdHNfd3JpdGUgKCZlbmMtPmJpdHMsIChnY2hhciAqKSBtYXAuZGF0YSwgb3V0c2l6ZSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHdyaXR0ZW4gPCBvdXRzaXplKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGVuYywgInNob3J0IHdyaXRlOiAlZCA8ICVkIGJ5dGVzIiwgd3JpdHRlbiwgb3V0c2l6ZSk7CisgIH0gZWxzZSBpZiAoR19VTkxJS0VMWSAod3JpdHRlbiA+IG91dHNpemUpKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZW5jLCAib3ZlcnJ1bjogJWQgPiAlZCBieXRlcyIsIHdyaXR0ZW4sIG91dHNpemUpOworICAgIHdyaXR0ZW4gPSBvdXRzaXplOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfcmVzaXplIChvdXRidWYsIDAsIHdyaXR0ZW4pOworCisgIGlmICghZHR4X3JldCkKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19HQVApOworCisgIHJldCA9IGdzdF9hdWRpb19lbmNvZGVyX2ZpbmlzaF9mcmFtZSAoR1NUX0FVRElPX0VOQ09ERVIgKGVuYyksCisgICAgICBvdXRidWYsIHNhbXBsZXMpOworICBlbmMtPmVuY29kZWRfc2FtcGxlcyArPSBmcmFtZV9zaXplOworCitkb25lOgorICBnX2ZyZWUgKGRhdGEwKTsKKyAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIChyZWFsbHkgcmVhbGx5KSBGSVhNRTogbW92ZSBpbnRvIGNvcmUgKGRpeGl0IHRwbSkKKyAqLworLyoKKyAqIF9nc3RfY2Fwc19zZXRfYnVmZmVyX2FycmF5OgorICogQGNhcHM6ICh0cmFuc2ZlciBmdWxsKTogYSAjR3N0Q2FwcworICogQGZpZWxkOiBmaWVsZCBpbiBjYXBzIHRvIHNldAorICogQGJ1ZjogaGVhZGVyIGJ1ZmZlcnMKKyAqCisgKiBBZGRzIGdpdmVuIGJ1ZmZlcnMgdG8gYW4gYXJyYXkgb2YgYnVmZmVycyBzZXQgYXMgdGhlIGdpdmVuIEBmaWVsZAorICogb24gdGhlIGdpdmVuIEBjYXBzLiAgTGlzdCBvZiBidWZmZXIgYXJndW1lbnRzIG11c3QgYmUgTlVMTC10ZXJtaW5hdGVkLgorICoKKyAqIFJldHVybnM6ICh0cmFuc2ZlciBmdWxsKTogaW5wdXQgY2FwcyB3aXRoIGEgc3RyZWFtaGVhZGVyIGZpZWxkIGFkZGVkLCBvciBOVUxMCisgKiAgICAgaWYgc29tZSBlcnJvciBvY2N1cnJlZAorICovCitzdGF0aWMgR3N0Q2FwcyAqCitfZ3N0X2NhcHNfc2V0X2J1ZmZlcl9hcnJheSAoR3N0Q2FwcyAqIGNhcHMsIGNvbnN0IGdjaGFyICogZmllbGQsCisgICAgR3N0QnVmZmVyICogYnVmLCAuLi4pCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlID0gTlVMTDsKKyAgdmFfbGlzdCB2YTsKKyAgR1ZhbHVlIGFycmF5ID0geyAwIH07CisgIEdWYWx1ZSB2YWx1ZSA9IHsgMCB9OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChjYXBzICE9IE5VTEwsIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ3N0X2NhcHNfaXNfZml4ZWQgKGNhcHMpLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGZpZWxkICE9IE5VTEwsIE5VTEwpOworCisgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChjYXBzKTsKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgZ192YWx1ZV9pbml0ICgmYXJyYXksIEdTVF9UWVBFX0FSUkFZKTsKKworICB2YV9zdGFydCAodmEsIGJ1Zik7CisgIC8qIHB1dCBidWZmZXJzIGluIGEgZml4ZWQgbGlzdCAqLworICB3aGlsZSAoYnVmKSB7CisgICAgZ19hc3NlcnQgKGdzdF9idWZmZXJfaXNfd3JpdGFibGUgKGJ1ZikpOworCisgICAgLyogbWFyayBidWZmZXIgKi8KKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19IRUFERVIpOworCisgICAgZ192YWx1ZV9pbml0ICgmdmFsdWUsIEdTVF9UWVBFX0JVRkZFUik7CisgICAgYnVmID0gZ3N0X2J1ZmZlcl9jb3B5IChidWYpOworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0hFQURFUik7CisgICAgZ3N0X3ZhbHVlX3NldF9idWZmZXIgKCZ2YWx1ZSwgYnVmKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIGdzdF92YWx1ZV9hcnJheV9hcHBlbmRfdmFsdWUgKCZhcnJheSwgJnZhbHVlKTsKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmdmFsdWUpOworCisgICAgYnVmID0gdmFfYXJnICh2YSwgR3N0QnVmZmVyICopOworICB9CisgIHZhX2VuZCAodmEpOworCisgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChzdHJ1Y3R1cmUsIGZpZWxkLCAmYXJyYXkpOworICBnX3ZhbHVlX3Vuc2V0ICgmYXJyYXkpOworCisgIHJldHVybiBjYXBzOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NwZWV4X2VuY19oYW5kbGVfZnJhbWUgKEdzdEF1ZGlvRW5jb2RlciAqIGJlbmMsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0U3BlZXhFbmMgKmVuYzsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKworICBlbmMgPSBHU1RfU1BFRVhfRU5DIChiZW5jKTsKKworICBpZiAoIWVuYy0+aGVhZGVyX3NlbnQpIHsKKyAgICAvKiBTcGVleCBzdHJlYW1zIGJlZ2luIHdpdGggdHdvIGhlYWRlcnM7IHRoZSBpbml0aWFsIGhlYWRlciAod2l0aAorICAgICAgIG1vc3Qgb2YgdGhlIGNvZGVjIHNldHVwIHBhcmFtZXRlcnMpIHdoaWNoIGlzIG1hbmRhdGVkIGJ5IHRoZSBPZ2cKKyAgICAgICBiaXRzdHJlYW0gc3BlYy4gIFRoZSBzZWNvbmQgaGVhZGVyIGhvbGRzIGFueSBjb21tZW50IGZpZWxkcy4KKyAgICAgICBXZSBtZXJlbHkgbmVlZCB0byBtYWtlIHRoZSBoZWFkZXJzLCB0aGVuIHBhc3MgdGhlbSB0byBsaWJzcGVleCAKKyAgICAgICBvbmUgYXQgYSB0aW1lOyBsaWJzcGVleCBoYW5kbGVzIHRoZSBhZGRpdGlvbmFsIE9nZyBiaXRzdHJlYW0gCisgICAgICAgY29uc3RyYWludHMgKi8KKyAgICBHc3RCdWZmZXIgKmJ1ZjEsICpidWYyOworICAgIEdzdENhcHMgKmNhcHM7CisgICAgZ3VjaGFyICpkYXRhOworICAgIGdpbnQgZGF0YV9sZW47CisgICAgR0xpc3QgKmhlYWRlcnM7CisKKyAgICAvKiBjcmVhdGUgaGVhZGVyIGJ1ZmZlciAqLworICAgIGRhdGEgPSAoZ3VpbnQ4ICopIHNwZWV4X2hlYWRlcl90b19wYWNrZXQgKCZlbmMtPmhlYWRlciwgJmRhdGFfbGVuKTsKKyAgICBidWYxID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZGF0YSwgZGF0YV9sZW4pOworICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmMSkgPSAwOworICAgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWYxKSA9IDA7CisKKyAgICAvKiBjcmVhdGUgY29tbWVudCBidWZmZXIgKi8KKyAgICBidWYyID0gZ3N0X3NwZWV4X2VuY19jcmVhdGVfbWV0YWRhdGFfYnVmZmVyIChlbmMpOworCisgICAgLyogbWFyayBhbmQgcHV0IG9uIGNhcHMgKi8KKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtc3BlZXgiLCAicmF0ZSIsIEdfVFlQRV9JTlQsIGVuYy0+cmF0ZSwKKyAgICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgZW5jLT5jaGFubmVscywgTlVMTCk7CisgICAgY2FwcyA9IF9nc3RfY2Fwc19zZXRfYnVmZmVyX2FycmF5IChjYXBzLCAic3RyZWFtaGVhZGVyIiwgYnVmMSwgYnVmMiwgTlVMTCk7CisKKyAgICAvKiBuZWdvdGlhdGUgd2l0aCB0aGVzZSBjYXBzICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZW5jLCAiaGVyZSBhcmUgdGhlIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICAgIGdzdF9hdWRpb19lbmNvZGVyX3NldF9vdXRwdXRfZm9ybWF0IChHU1RfQVVESU9fRU5DT0RFUiAoZW5jKSwgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgLyogcHVzaCBvdXQgYnVmZmVycyAqLworICAgIC8qIHN0b3JlIGJ1ZmZlcnMgZm9yIGxhdGVyIHByZV9wdXNoIHNlbmRpbmcgKi8KKyAgICBoZWFkZXJzID0gTlVMTDsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJzdG9yaW5nIGhlYWRlciBidWZmZXJzIik7CisgICAgaGVhZGVycyA9IGdfbGlzdF9wcmVwZW5kIChoZWFkZXJzLCBidWYyKTsKKyAgICBoZWFkZXJzID0gZ19saXN0X3ByZXBlbmQgKGhlYWRlcnMsIGJ1ZjEpOworICAgIGdzdF9hdWRpb19lbmNvZGVyX3NldF9oZWFkZXJzIChiZW5jLCBoZWFkZXJzKTsKKworICAgIGVuYy0+aGVhZGVyX3NlbnQgPSBUUlVFOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZW5jLCAicmVjZWl2ZWQgYnVmZmVyICVwIG9mICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMiLCBidWYsCisgICAgICBidWYgPyBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpIDogMCk7CisKKyAgcmV0ID0gZ3N0X3NwZWV4X2VuY19lbmNvZGUgKGVuYywgYnVmKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwZWV4X2VuY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0U3BlZXhFbmMgKmVuYzsKKworICBlbmMgPSBHU1RfU1BFRVhfRU5DIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9RVUFMSVRZOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBlbmMtPnF1YWxpdHkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JJVFJBVEU6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBlbmMtPmJpdHJhdGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01PREU6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgZW5jLT5tb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9WQlI6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZW5jLT52YnIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FCUjoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGVuYy0+YWJyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9WQUQ6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZW5jLT52YWQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RUWDoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBlbmMtPmR0eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ09NUExFWElUWToKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGVuYy0+Y29tcGxleGl0eSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTkZSQU1FUzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGVuYy0+bmZyYW1lcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTEFTVF9NRVNTQUdFOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgZW5jLT5sYXN0X21lc3NhZ2UpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwZWV4X2VuY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0U3BlZXhFbmMgKmVuYzsKKworICBlbmMgPSBHU1RfU1BFRVhfRU5DIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9RVUFMSVRZOgorICAgICAgZW5jLT5xdWFsaXR5ID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CSVRSQVRFOgorICAgICAgZW5jLT5iaXRyYXRlID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTU9ERToKKyAgICAgIGVuYy0+bW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9WQlI6CisgICAgICBlbmMtPnZiciA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9BQlI6CisgICAgICBlbmMtPmFiciA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1ZBRDoKKyAgICAgIGVuYy0+dmFkID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RUWDoKKyAgICAgIGVuYy0+ZHR4ID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NPTVBMRVhJVFk6CisgICAgICBlbmMtPmNvbXBsZXhpdHkgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ORlJBTUVTOgorICAgICAgZW5jLT5uZnJhbWVzID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9leHQvc3BlZXgvZ3N0c3BlZXhlbmMuaCBiL2V4dC9zcGVleC9nc3RzcGVleGVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZmNjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc3BlZXgvZ3N0c3BlZXhlbmMuaApAQCAtMCwwICsxLDk4IEBACisvKiBHU3RyZWFtZXIgU3BlZXggRW5jb2RlcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfU1BFRVhfRU5DX0hfXworI2RlZmluZSBfX0dTVF9TUEVFWF9FTkNfSF9fCisKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9lbmNvZGVyLmg+CisKKyNpbmNsdWRlIDxzcGVleC9zcGVleC5oPgorI2luY2x1ZGUgPHNwZWV4L3NwZWV4X2hlYWRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfU1BFRVhfRU5DIFwKKyAgKGdzdF9zcGVleF9lbmNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1NQRUVYX0VOQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1NQRUVYX0VOQyxHc3RTcGVleEVuYykpCisjZGVmaW5lIEdTVF9TUEVFWF9FTkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfU1BFRVhfRU5DLEdzdFNwZWV4RW5jQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfU1BFRVhfRU5DKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfU1BFRVhfRU5DKSkKKyNkZWZpbmUgR1NUX0lTX1NQRUVYX0VOQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9TUEVFWF9FTkMpKQorCit0eXBlZGVmIGVudW0KK3sKKyAgR1NUX1NQRUVYX0VOQ19NT0RFX0FVVE8sCisgIEdTVF9TUEVFWF9FTkNfTU9ERV9VV0IsCisgIEdTVF9TUEVFWF9FTkNfTU9ERV9XQiwKKyAgR1NUX1NQRUVYX0VOQ19NT0RFX05CCit9IEdzdFNwZWV4TW9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFNwZWV4RW5jIEdzdFNwZWV4RW5jOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFNwZWV4RW5jQ2xhc3MgR3N0U3BlZXhFbmNDbGFzczsKKworc3RydWN0IF9Hc3RTcGVleEVuYyB7CisgIEdzdEF1ZGlvRW5jb2RlciAgIGVsZW1lbnQ7CisKKyAgU3BlZXhCaXRzICAgICAgICAgICAgIGJpdHM7CisgIFNwZWV4SGVhZGVyICAgICAgICAgICBoZWFkZXI7CisgIGNvbnN0IFNwZWV4TW9kZSAgICAgICAqc3BlZXhfbW9kZTsKKyAgdm9pZCAgICAgICAgICAgICAgICAgICpzdGF0ZTsKKworICAvKiBwcm9wZXJ0aWVzICovCisgIEdzdFNwZWV4TW9kZSAgICAgICAgICBtb2RlOworICBnZmxvYXQgICAgICAgICAgICAgICAgcXVhbGl0eTsKKyAgZ2ludCAgICAgICAgICAgICAgICAgIGJpdHJhdGU7CisgIGdib29sZWFuICAgICAgICAgICAgICB2YnI7CisgIGdpbnQgICAgICAgICAgICAgICAgICBhYnI7CisgIGdib29sZWFuICAgICAgICAgICAgICB2YWQ7CisgIGdib29sZWFuICAgICAgICAgICAgICBkdHg7CisgIGdpbnQgICAgICAgICAgICAgICAgICBjb21wbGV4aXR5OworICBnaW50ICAgICAgICAgICAgICAgICAgbmZyYW1lczsKKyAgZ2NoYXIgICAgICAgICAgICAgICAgICpsYXN0X21lc3NhZ2U7CisKKyAgZ2ludCAgICAgICAgICAgICAgICAgIGNoYW5uZWxzOworICBnaW50ICAgICAgICAgICAgICAgICAgcmF0ZTsKKworICBnYm9vbGVhbiAgICAgICAgICAgICAgaGVhZGVyX3NlbnQ7CisgIGd1aW50NjQgICAgICAgICAgICAgICBlbmNvZGVkX3NhbXBsZXM7CisKKyAgR3N0VGFnTGlzdCAgICAgICAgICAgICp0YWdzOworCisgIGdpbnQgICAgICAgICAgICAgICAgICBmcmFtZV9zaXplOworICBnaW50ICAgICAgICAgICAgICAgICAgbG9va2FoZWFkOworCisgIGd1aW50OCAgICAgICAgICAgICAgICAqY29tbWVudHM7CisgIGdpbnQgICAgICAgICAgICAgICAgICBjb21tZW50X2xlbjsKK307CisKK3N0cnVjdCBfR3N0U3BlZXhFbmNDbGFzcyB7CisgIEdzdEF1ZGlvRW5jb2RlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9zcGVleF9lbmNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfU1BFRVhFTkNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvc3BlZXgvbWVzb24uYnVpbGQgYi9leHQvc3BlZXgvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY4MmYwOAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcGVleC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDE5IEBACitzcGVleF9zb3VyY2VzID0gWworICAnZ3N0c3BlZXguYycsCisgICdnc3RzcGVleGRlYy5jJywKKyAgJ2dzdHNwZWV4ZW5jLmMnLAorXQorCitzcGVleF9kZXAgPSBkZXBlbmRlbmN5KCdzcGVleCcsIHZlcnNpb24gOiAnPj0xLjEuNicsIHJlcXVpcmVkIDogZmFsc2UpCisKK2lmIHNwZWV4X2RlcC5mb3VuZCgpCisgIGdzdHNwZWV4ID0gbGlicmFyeSgnZ3N0c3BlZXgnLAorICAgIHNwZWV4X3NvdXJjZXMsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzICsgWyctREdTVF9VU0VfVU5TVEFCTEVfQVBJJ10sCisgICAgbGlua19hcmdzIDogbm9zZWhfbGlua19hcmdzLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgICBkZXBlbmRlbmNpZXMgOiBbZ3N0YmFzZV9kZXAsIGdzdHRhZ19kZXAsIGdzdGF1ZGlvX2RlcCwgc3BlZXhfZGVwLCBsaWJtXSwKKyAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCisgICkKK2VuZGlmCmRpZmYgLS1naXQgYS9leHQvdGFnbGliLy5naXRpZ25vcmUgYi9leHQvdGFnbGliLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY4Mjk4MgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC90YWdsaWIvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACitnc3R0YWdsaWJtdXgubG9UCmRpZmYgLS1naXQgYS9leHQvdGFnbGliL01ha2VmaWxlLmFtIGIvZXh0L3RhZ2xpYi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTViMzQyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3RhZ2xpYi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE4IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3R0YWdsaWIubGEKKworbGliZ3N0dGFnbGliX2xhX1NPVVJDRVMgPSBnc3R0YWdsaWJwbHVnaW4uYyBnc3RpZDN2Mm11eC5jYyBnc3RhcGV2Mm11eC5jYworbGliZ3N0dGFnbGliX2xhX0NGTEFHUyA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQ0ZMQUdTKSBcCisJJChUQUdMSUJfQ0ZMQUdTKQorbGliZ3N0dGFnbGliX2xhX0NYWEZMQUdTID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9DWFhGTEFHUykgXAorCSQoVEFHTElCX0NYWEZMQUdTKQorbGliZ3N0dGFnbGliX2xhX0xJQkFERCA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R0YWctJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkkKEdTVF9MSUJTKSBcCisJJChUQUdMSUJfTElCUykKK2xpYmdzdHRhZ2xpYl9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gZ3N0aWQzdjJtdXguaCBnc3RhcGV2Mm11eC5oCmRpZmYgLS1naXQgYS9leHQvdGFnbGliL2dzdGFwZXYybXV4LmNjIGIvZXh0L3RhZ2xpYi9nc3RhcGV2Mm11eC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjU5ZGFmCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3RhZ2xpYi9nc3RhcGV2Mm11eC5jYwpAQCAtMCwwICsxLDQwOCBAQAorLyogR1N0cmVhbWVyIHRhZ2xpYi1iYXNlZCBBUEV2MiBtdXhlcgorICogQ29weXJpZ2h0IChDKSAyMDA2IENocmlzdG9waGUgRmVyZ2VhdSA8dGV1ZkBnbm9tZS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXBldjJtdXgKKyAqIEBzZWVfYWxzbzogI0dzdFRhZ1NldHRlcgorICoKKyAqIFRoaXMgZWxlbWVudCBhZGRzIEFQRXYyIHRhZ3MgdG8gdGhlIGJlZ2lubmluZyBvZiBhIHN0cmVhbSB1c2luZyB0aGUgdGFnbGliCisgKiBsaWJyYXJ5LgorICoKKyAqIEFwcGxpY2F0aW9ucyBjYW4gc2V0IHRoZSB0YWdzIHRvIHdyaXRlIHVzaW5nIHRoZSAjR3N0VGFnU2V0dGVyIGludGVyZmFjZS4KKyAqIFRhZ3Mgc2VudCBieSB1cHN0cmVhbSBlbGVtZW50cyB3aWxsIGJlIHBpY2tlZCB1cCBhdXRvbWF0aWNhbGx5IChhbmQgbWVyZ2VkCisgKiBhY2NvcmRpbmcgdG8gdGhlIG1lcmdlIG1vZGUgc2V0IHZpYSB0aGUgdGFnIHNldHRlciBpbnRlcmZhY2UpLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgZmlsZXNyYyBsb2NhdGlvbj1mb28ub2dnICEgZGVjb2RlYmluICEgYXVkaW9jb252ZXJ0ICEgbGFtZSAhIGFwZXYybXV4ICEgZmlsZXNpbmsgbG9jYXRpb249Zm9vLm1wMworICogXXwgQSBwaXBlbGluZSB0aGF0IHRyYW5zY29kZXMgYSBmaWxlIGZyb20gT2dnL1ZvcmJpcyB0byBtcDMgZm9ybWF0IHdpdGggYW4KKyAqIEFQRXYyIHRoYXQgY29udGFpbnMgdGhlIHNhbWUgYXMgdGhlIHRoZSBPZ2cvVm9yYmlzIGZpbGUuIE1ha2Ugc3VyZSB0aGUKKyAqIE9nZy9Wb3JiaXMgZmlsZSBhY3R1YWxseSBoYXMgY29tbWVudHMgdG8gcHJlc2VydmUuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLW0gZmlsZXNyYyBsb2NhdGlvbj1mb28ubXAzICEgYXBlZGVtdXggISBmYWtlc2luayBzaWxlbnQ9VFJVRSAyJmd0OyAvZGV2L251bGwgfCBncmVwIHRhZ2xpc3QKKyAqIF18IFZlcmlmeSB0aGF0IHRhZ3MgaGF2ZSBiZWVuIHdyaXR0ZW4uCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImdzdGFwZXYybXV4LmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGFwZXRhZy5oPgorI2luY2x1ZGUgPGdzdC90YWcvdGFnLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBUYWdMaWI7CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9hcGV2Ml9tdXhfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X2FwZXYyX211eF9kZWJ1ZworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtYXBldGFnIikpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoIkFOWSIpKTsKKworR19ERUZJTkVfVFlQRSAoR3N0QXBldjJNdXgsIGdzdF9hcGV2Ml9tdXgsIEdTVF9UWVBFX1RBR19NVVgpOworCitzdGF0aWMgR3N0QnVmZmVyICpnc3RfYXBldjJfbXV4X3JlbmRlcl9zdGFydF90YWcgKEdzdFRhZ011eCAqIG11eCwKKyAgICBjb25zdCBHc3RUYWdMaXN0ICogdGFnbGlzdCk7CitzdGF0aWMgR3N0QnVmZmVyICpnc3RfYXBldjJfbXV4X3JlbmRlcl9lbmRfdGFnIChHc3RUYWdNdXggKiBtdXgsCisgICAgY29uc3QgR3N0VGFnTGlzdCAqIHRhZ2xpc3QpOworCitzdGF0aWMgdm9pZAorZ3N0X2FwZXYyX211eF9jbGFzc19pbml0IChHc3RBcGV2Mk11eENsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisKKyAgR1NUX1RBR19NVVhfQ0xBU1MgKGtsYXNzKS0+cmVuZGVyX3N0YXJ0X3RhZyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FwZXYyX211eF9yZW5kZXJfc3RhcnRfdGFnKTsKKyAgR1NUX1RBR19NVVhfQ0xBU1MgKGtsYXNzKS0+cmVuZGVyX2VuZF90YWcgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hcGV2Ml9tdXhfcmVuZGVyX2VuZF90YWcpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIlRhZ0xpYi1iYXNlZCBBUEV2MiBNdXhlciIsICJGb3JtYXR0ZXIvTWV0YWRhdGEiLAorICAgICAgIkFkZHMgYW4gQVBFdjIgaGVhZGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgZmlsZXMgdXNpbmcgdGFnbGliIiwKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9hcGV2Ml9tdXhfZGVidWcsICJhcGV2Mm11eCIsIDAsCisgICAgICAidGFnbGliLWJhc2VkIEFQRXYyIHRhZyBtdXhlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2FwZXYyX211eF9pbml0IChHc3RBcGV2Mk11eCAqIGFwZXYybXV4KQoreworICAvKiBub3RoaW5nIHRvIGRvICovCit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FwZXYyX211eF9oYXZlX3dhdnBhY2sgKEdzdEFwZXYyTXV4ICogYXBldjJtdXgpCit7CisgIGNvbnN0IEdzdFN0cnVjdHVyZSAqczsKKyAgZ2Jvb2xlYW4gcmV0OworICBHc3RDYXBzICpjYXBzOworICBHc3RQYWQgKnNpbms7CisKKyAgc2luayA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChhcGV2Mm11eCksICJzaW5rIik7CisgIGNhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHNpbmspOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rKTsKKworICBpZiAoY2FwcyA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIHJldCA9IGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJhdWRpby94LXdhdnBhY2siKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIEdTVF9MT0dfT0JKRUNUIChhcGV2Mm11eCwgImdvdCB3YXZwYWNrIGlucHV0OiAlcyIsIHJldCA/ICJ5ZXMiIDogIm5vIik7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCithZGRfb25lX3RhZyAoY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsIGNvbnN0IGdjaGFyICogdGFnLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEFQRTo6VGFnICogYXBldjJ0YWcgPSAoQVBFOjpUYWcgKikgdXNlcl9kYXRhOworICBnYm9vbGVhbiByZXN1bHQ7CisKKyAgLyogRklYTUU6IGlmIHRoZXJlIGFyZSBzZXZlcmFsIHZhbHVlcyBzZXQgZm9yIHRoZSBzYW1lIHRhZywgdGhpcyB3b24ndAorICAgKiB3b3JrLCBvbmx5IHRoZSBmaXJzdCB2YWx1ZSB3aWxsIGJlIHRha2VuIGludG8gYWNjb3VudAorICAgKi8KKyAgaWYgKHN0cmNtcCAodGFnLCBHU1RfVEFHX1RJVExFKSA9PSAwKSB7CisgICAgY29uc3QgY2hhciAqdGl0bGU7CisKKyAgICByZXN1bHQgPSBnc3RfdGFnX2xpc3RfcGVla19zdHJpbmdfaW5kZXggKGxpc3QsIHRhZywgMCwgJnRpdGxlKTsKKyAgICBpZiAocmVzdWx0ICE9IEZBTFNFKSB7CisgICAgICBHU1RfREVCVUcgKCJTZXR0aW5nIHRpdGxlIHRvICVzIiwgdGl0bGUpOworICAgICAgYXBldjJ0YWctPnNldFRpdGxlIChTdHJpbmcgKHRpdGxlLCBTdHJpbmc6OlVURjgpKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfQUxCVU0pID09IDApIHsKKyAgICBjb25zdCBjaGFyICphbGJ1bTsKKworICAgIHJlc3VsdCA9IGdzdF90YWdfbGlzdF9wZWVrX3N0cmluZ19pbmRleCAobGlzdCwgdGFnLCAwLCAmYWxidW0pOworICAgIGlmIChyZXN1bHQgIT0gRkFMU0UpIHsKKyAgICAgIEdTVF9ERUJVRyAoIlNldHRpbmcgYWxidW0gdG8gJXMiLCBhbGJ1bSk7CisgICAgICBhcGV2MnRhZy0+c2V0QWxidW0gKFN0cmluZyAoYWxidW0sIFN0cmluZzo6VVRGOCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJjbXAgKHRhZywgR1NUX1RBR19BUlRJU1QpID09IDApIHsKKyAgICBjb25zdCBjaGFyICphcnRpc3Q7CisKKyAgICByZXN1bHQgPSBnc3RfdGFnX2xpc3RfcGVla19zdHJpbmdfaW5kZXggKGxpc3QsIHRhZywgMCwgJmFydGlzdCk7CisgICAgaWYgKHJlc3VsdCAhPSBGQUxTRSkgeworICAgICAgR1NUX0RFQlVHICgiU2V0dGluZyBhcnRpc3QgdG8gJXMiLCBhcnRpc3QpOworICAgICAgYXBldjJ0YWctPnNldEFydGlzdCAoU3RyaW5nIChhcnRpc3QsIFN0cmluZzo6VVRGOCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJjbXAgKHRhZywgR1NUX1RBR19DT01QT1NFUikgPT0gMCkgeworICAgIGNvbnN0IGNoYXIgKmNvbXBvc2VyOworCisgICAgcmVzdWx0ID0gZ3N0X3RhZ19saXN0X3BlZWtfc3RyaW5nX2luZGV4IChsaXN0LCB0YWcsIDAsICZjb21wb3Nlcik7CisgICAgaWYgKHJlc3VsdCAhPSBGQUxTRSkgeworICAgICAgR1NUX0RFQlVHICgiU2V0dGluZyBjb21wb3NlciB0byAlcyIsIGNvbXBvc2VyKTsKKyAgICAgIGFwZXYydGFnLT5hZGRWYWx1ZSAoU3RyaW5nICgiQ09NUE9TRVIiLCBTdHJpbmc6OlVURjgpLAorICAgICAgICAgIFN0cmluZyAoY29tcG9zZXIsIFN0cmluZzo6VVRGOCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJjbXAgKHRhZywgR1NUX1RBR19HRU5SRSkgPT0gMCkgeworICAgIGNvbnN0IGNoYXIgKmdlbnJlOworCisgICAgcmVzdWx0ID0gZ3N0X3RhZ19saXN0X3BlZWtfc3RyaW5nX2luZGV4IChsaXN0LCB0YWcsIDAsICZnZW5yZSk7CisgICAgaWYgKHJlc3VsdCAhPSBGQUxTRSkgeworICAgICAgR1NUX0RFQlVHICgiU2V0dGluZyBnZW5yZSB0byAlcyIsIGdlbnJlKTsKKyAgICAgIGFwZXYydGFnLT5zZXRHZW5yZSAoU3RyaW5nIChnZW5yZSwgU3RyaW5nOjpVVEY4KSk7CisgICAgfQorICB9IGVsc2UgaWYgKHN0cmNtcCAodGFnLCBHU1RfVEFHX0NPTU1FTlQpID09IDApIHsKKyAgICBjb25zdCBjaGFyICpjb21tZW50OworCisgICAgcmVzdWx0ID0gZ3N0X3RhZ19saXN0X3BlZWtfc3RyaW5nX2luZGV4IChsaXN0LCB0YWcsIDAsICZjb21tZW50KTsKKyAgICBpZiAocmVzdWx0ICE9IEZBTFNFKSB7CisgICAgICBHU1RfREVCVUcgKCJTZXR0aW5nIGNvbW1lbnQgdG8gJXMiLCBjb21tZW50KTsKKyAgICAgIGFwZXYydGFnLT5zZXRDb21tZW50IChTdHJpbmcgKGNvbW1lbnQsIFN0cmluZzo6VVRGOCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJjbXAgKHRhZywgR1NUX1RBR19EQVRFKSA9PSAwKSB7CisgICAgR0RhdGUgKmRhdGU7CisKKyAgICByZXN1bHQgPSBnc3RfdGFnX2xpc3RfZ2V0X2RhdGVfaW5kZXggKGxpc3QsIHRhZywgMCwgJmRhdGUpOworICAgIGlmIChyZXN1bHQgIT0gRkFMU0UpIHsKKyAgICAgIEdEYXRlWWVhciB5ZWFyOworCisgICAgICB5ZWFyID0gZ19kYXRlX2dldF95ZWFyIChkYXRlKTsKKyAgICAgIEdTVF9ERUJVRyAoIlNldHRpbmcgdHJhY2sgeWVhciB0byAlZCIsIHllYXIpOworICAgICAgYXBldjJ0YWctPnNldFllYXIgKHllYXIpOworICAgICAgZ19kYXRlX2ZyZWUgKGRhdGUpOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJjbXAgKHRhZywgR1NUX1RBR19UUkFDS19OVU1CRVIpID09IDApIHsKKyAgICBndWludCB0cmFja19udW1iZXI7CisKKyAgICByZXN1bHQgPSBnc3RfdGFnX2xpc3RfZ2V0X3VpbnRfaW5kZXggKGxpc3QsIHRhZywgMCwgJnRyYWNrX251bWJlcik7CisgICAgaWYgKHJlc3VsdCAhPSBGQUxTRSkgeworICAgICAgZ3VpbnQgdG90YWxfdHJhY2tzOworCisgICAgICByZXN1bHQgPSBnc3RfdGFnX2xpc3RfZ2V0X3VpbnRfaW5kZXggKGxpc3QsIEdTVF9UQUdfVFJBQ0tfQ09VTlQsCisgICAgICAgICAgMCwgJnRvdGFsX3RyYWNrcyk7CisgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgIGdjaGFyICp0YWdfc3RyOworCisgICAgICAgIHRhZ19zdHIgPSBnX3N0cmR1cF9wcmludGYgKCIlZC8lZCIsIHRyYWNrX251bWJlciwgdG90YWxfdHJhY2tzKTsKKyAgICAgICAgR1NUX0RFQlVHICgiU2V0dGluZyB0cmFjayBudW1iZXIgdG8gJXMiLCB0YWdfc3RyKTsKKyAgICAgICAgYXBldjJ0YWctPmFkZFZhbHVlIChTdHJpbmcgKCJUUkFDSyIsIFN0cmluZzo6VVRGOCksCisgICAgICAgICAgICBTdHJpbmcgKHRhZ19zdHIsIFN0cmluZzo6VVRGOCksIHRydWUpOworICAgICAgICBnX2ZyZWUgKHRhZ19zdHIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHICgiU2V0dGluZyB0cmFjayBudW1iZXIgdG8gJWQiLCB0cmFja19udW1iZXIpOworICAgICAgICBhcGV2MnRhZy0+c2V0VHJhY2sgKHRyYWNrX251bWJlcik7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKHN0cmNtcCAodGFnLCBHU1RfVEFHX1RSQUNLX0NPVU5UKSA9PSAwKSB7CisgICAgZ3VpbnQgbjsKKworICAgIGlmIChnc3RfdGFnX2xpc3RfZ2V0X3VpbnRfaW5kZXggKGxpc3QsIEdTVF9UQUdfVFJBQ0tfTlVNQkVSLCAwLCAmbikpIHsKKyAgICAgIEdTVF9ERUJVRyAoInRyYWNrLWNvdW50IGhhbmRsZWQgd2l0aCB0cmFjay1udW1iZXIsIHNraXBwaW5nIik7CisgICAgfSBlbHNlIGlmIChnc3RfdGFnX2xpc3RfZ2V0X3VpbnRfaW5kZXggKGxpc3QsIEdTVF9UQUdfVFJBQ0tfQ09VTlQsIDAsICZuKSkgeworICAgICAgZ2NoYXIgKnRhZ19zdHI7CisKKyAgICAgIHRhZ19zdHIgPSBnX3N0cmR1cF9wcmludGYgKCIwLyVkIiwgbik7CisgICAgICBHU1RfREVCVUcgKCJTZXR0aW5nIHRyYWNrIG51bWJlciB0byAlcyIsIHRhZ19zdHIpOworICAgICAgYXBldjJ0YWctPmFkZFZhbHVlIChTdHJpbmcgKCJUUkFDSyIsIFN0cmluZzo6VVRGOCksCisgICAgICAgICAgU3RyaW5nICh0YWdfc3RyLCBTdHJpbmc6OlVURjgpLCB0cnVlKTsKKyAgICAgIGdfZnJlZSAodGFnX3N0cik7CisgICAgfQorI2lmIDAKKyAgfSBlbHNlIGlmIChzdHJjbXAgKHRhZywgR1NUX1RBR19BTEJVTV9WT0xVTUVfTlVNQkVSKSA9PSAwKSB7CisgICAgZ3VpbnQgdm9sdW1lX251bWJlcjsKKworICAgIHJlc3VsdCA9IGdzdF90YWdfbGlzdF9nZXRfdWludF9pbmRleCAobGlzdCwgdGFnLCAwLCAmdm9sdW1lX251bWJlcik7CisKKyAgICBpZiAocmVzdWx0ICE9IEZBTFNFKSB7CisgICAgICBndWludCB2b2x1bWVfY291bnQ7CisgICAgICBnY2hhciAqdGFnX3N0cjsKKworICAgICAgcmVzdWx0ID0gZ3N0X3RhZ19saXN0X2dldF91aW50X2luZGV4IChsaXN0LCBHU1RfVEFHX0FMQlVNX1ZPTFVNRV9DT1VOVCwKKyAgICAgICAgICAwLCAmdm9sdW1lX2NvdW50KTsKKworICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICB0YWdfc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiQ0QgJWQvJWQiLCB2b2x1bWVfbnVtYmVyLCB2b2x1bWVfY291bnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGFnX3N0ciA9IGdfc3RyZHVwX3ByaW50ZiAoIkNEICVkIiwgdm9sdW1lX251bWJlcik7CisgICAgICB9CisKKyAgICAgIEdTVF9ERUJVRyAoIlNldHRpbmcgYWxidW0gbnVtYmVyIHRvICVzIiwgdGFnX3N0cik7CisKKyAgICAgIGFwZXYydGFnLT5hZGRWYWx1ZSAoU3RyaW5nICgiTUVESUEiLCBTdHJpbmc6OlVURjgpLAorICAgICAgICAgIFN0cmluZyAodGFnX3N0ciwgU3RyaW5nOjpVVEY4KSwgdHJ1ZSk7CisgICAgICBnX2ZyZWUgKHRhZ19zdHIpOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJjbXAgKHRhZywgR1NUX1RBR19BTEJVTV9WT0xVTUVfQ09VTlQpID09IDApIHsKKyAgICBndWludCBuOworCisgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfdWludF9pbmRleCAobGlzdCwgR1NUX1RBR19BTEJVTV9WT0xVTUVfTlVNQkVSLCAwLCAmbikpIHsKKyAgICAgIEdTVF9ERUJVRyAoInZvbHVtZS1jb3VudCBoYW5kbGVkIHdpdGggdm9sdW1lLW51bWJlciwgc2tpcHBpbmciKTsKKyAgICB9IGVsc2UgaWYgKGdzdF90YWdfbGlzdF9nZXRfdWludF9pbmRleCAobGlzdCwgR1NUX1RBR19BTEJVTV9WT0xVTUVfQ09VTlQsCisgICAgICAgICAgICAwLCAmbikpIHsKKyAgICAgIGdjaGFyICp0YWdfc3RyOworCisgICAgICB0YWdfc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiQ0QgMC8ldSIsIG4pOworICAgICAgR1NUX0RFQlVHICgiU2V0dGluZyBhbGJ1bSB2b2x1bWUgbnVtYmVyL2NvdW50IHRvICVzIiwgdGFnX3N0cik7CisKKyAgICAgIGFwZXYydGFnLT5hZGRWYWx1ZSAoU3RyaW5nICgiTUVESUEiLCBTdHJpbmc6OlVURjgpLAorICAgICAgICAgIFN0cmluZyAodGFnX3N0ciwgU3RyaW5nOjpVVEY4KSwgdHJ1ZSk7CisgICAgICBnX2ZyZWUgKHRhZ19zdHIpOworICAgIH0KKyNlbmRpZgorICB9IGVsc2UgaWYgKHN0cmNtcCAodGFnLCBHU1RfVEFHX0NPUFlSSUdIVCkgPT0gMCkgeworICAgIGNvbnN0IGdjaGFyICpjb3B5cmlnaHQ7CisKKyAgICByZXN1bHQgPSBnc3RfdGFnX2xpc3RfcGVla19zdHJpbmdfaW5kZXggKGxpc3QsIHRhZywgMCwgJmNvcHlyaWdodCk7CisKKyAgICBpZiAocmVzdWx0ICE9IEZBTFNFKSB7CisgICAgICBHU1RfREVCVUcgKCJTZXR0aW5nIGNvcHlyaWdodCB0byAlcyIsIGNvcHlyaWdodCk7CisgICAgICBhcGV2MnRhZy0+YWRkVmFsdWUgKFN0cmluZyAoIkNPUFlSSUdIVCIsIFN0cmluZzo6VVRGOCksCisgICAgICAgICAgU3RyaW5nIChjb3B5cmlnaHQsIFN0cmluZzo6VVRGOCksIHRydWUpOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJjbXAgKHRhZywgR1NUX1RBR19MT0NBVElPTikgPT0gMCkgeworICAgIGNvbnN0IGdjaGFyICpsb2NhdGlvbjsKKworICAgIHJlc3VsdCA9IGdzdF90YWdfbGlzdF9wZWVrX3N0cmluZ19pbmRleCAobGlzdCwgdGFnLCAwLCAmbG9jYXRpb24pOworCisgICAgaWYgKHJlc3VsdCAhPSBGQUxTRSkgeworICAgICAgR1NUX0RFQlVHICgiU2V0dGluZyBsb2NhdGlvbiB0byAlcyIsIGxvY2F0aW9uKTsKKyAgICAgIGFwZXYydGFnLT5hZGRWYWx1ZSAoU3RyaW5nICgiRklMRSIsIFN0cmluZzo6VVRGOCksCisgICAgICAgICAgU3RyaW5nIChsb2NhdGlvbiwgU3RyaW5nOjpVVEY4KSwgdHJ1ZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHN0cmNtcCAodGFnLCBHU1RfVEFHX0lTUkMpID09IDApIHsKKyAgICBjb25zdCBnY2hhciAqaXNyYzsKKworICAgIHJlc3VsdCA9IGdzdF90YWdfbGlzdF9wZWVrX3N0cmluZ19pbmRleCAobGlzdCwgdGFnLCAwLCAmaXNyYyk7CisKKyAgICBpZiAocmVzdWx0ICE9IEZBTFNFKSB7CisgICAgICBHU1RfREVCVUcgKCJTZXR0aW5nIElTUkMgdG8gJXMiLCBpc3JjKTsKKyAgICAgIGFwZXYydGFnLT5hZGRWYWx1ZSAoU3RyaW5nICgiSVNSQyIsIFN0cmluZzo6VVRGOCksCisgICAgICAgICAgU3RyaW5nIChpc3JjLCBTdHJpbmc6OlVURjgpLCB0cnVlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfVFJBQ0tfR0FJTikgPT0gMCkgeworICAgIGdkb3VibGUgdmFsdWU7CisKKyAgICByZXN1bHQgPSBnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZV9pbmRleCAobGlzdCwgdGFnLCAwLCAmdmFsdWUpOworCisgICAgaWYgKHJlc3VsdCAhPSBGQUxTRSkgeworICAgICAgZ2NoYXIgKnRyYWNrX2dhaW4gPSAoZ2NoYXIgKikgZ19tYWxsb2MwIChHX0FTQ0lJX0RUT1NUUl9CVUZfU0laRSk7CisKKyAgICAgIHRyYWNrX2dhaW4gPSBnX2FzY2lpX2R0b3N0ciAodHJhY2tfZ2FpbiwgR19BU0NJSV9EVE9TVFJfQlVGX1NJWkUsIHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVRyAoIlNldHRpbmcgdHJhY2sgZ2FpbiB0byAlcyIsIHRyYWNrX2dhaW4pOworICAgICAgYXBldjJ0YWctPmFkZFZhbHVlIChTdHJpbmcgKCJSRVBMQVlHQUlOX1RSQUNLX0dBSU4iLAorICAgICAgICAgICAgICBTdHJpbmc6OlVURjgpLCBTdHJpbmcgKHRyYWNrX2dhaW4sIFN0cmluZzo6VVRGOCksIHRydWUpOworICAgICAgZ19mcmVlICh0cmFja19nYWluKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfVFJBQ0tfUEVBSykgPT0gMCkgeworICAgIGdkb3VibGUgdmFsdWU7CisKKyAgICByZXN1bHQgPSBnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZV9pbmRleCAobGlzdCwgdGFnLCAwLCAmdmFsdWUpOworCisgICAgaWYgKHJlc3VsdCAhPSBGQUxTRSkgeworICAgICAgZ2NoYXIgKnRyYWNrX3BlYWsgPSAoZ2NoYXIgKikgZ19tYWxsb2MwIChHX0FTQ0lJX0RUT1NUUl9CVUZfU0laRSk7CisKKyAgICAgIHRyYWNrX3BlYWsgPSBnX2FzY2lpX2R0b3N0ciAodHJhY2tfcGVhaywgR19BU0NJSV9EVE9TVFJfQlVGX1NJWkUsIHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVRyAoIlNldHRpbmcgdHJhY2sgcGVhayB0byAlcyIsIHRyYWNrX3BlYWspOworICAgICAgYXBldjJ0YWctPmFkZFZhbHVlIChTdHJpbmcgKCJSRVBMQVlHQUlOX1RSQUNLX1BFQUsiLAorICAgICAgICAgICAgICBTdHJpbmc6OlVURjgpLCBTdHJpbmcgKHRyYWNrX3BlYWssIFN0cmluZzo6VVRGOCksIHRydWUpOworICAgICAgZ19mcmVlICh0cmFja19wZWFrKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfQUxCVU1fR0FJTikgPT0gMCkgeworICAgIGdkb3VibGUgdmFsdWU7CisKKyAgICByZXN1bHQgPSBnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZV9pbmRleCAobGlzdCwgdGFnLCAwLCAmdmFsdWUpOworCisgICAgaWYgKHJlc3VsdCAhPSBGQUxTRSkgeworICAgICAgZ2NoYXIgKmFsYnVtX2dhaW4gPSAoZ2NoYXIgKikgZ19tYWxsb2MwIChHX0FTQ0lJX0RUT1NUUl9CVUZfU0laRSk7CisKKyAgICAgIGFsYnVtX2dhaW4gPSBnX2FzY2lpX2R0b3N0ciAoYWxidW1fZ2FpbiwgR19BU0NJSV9EVE9TVFJfQlVGX1NJWkUsIHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVRyAoIlNldHRpbmcgYWxidW0gZ2FpbiB0byAlcyIsIGFsYnVtX2dhaW4pOworICAgICAgYXBldjJ0YWctPmFkZFZhbHVlIChTdHJpbmcgKCJSRVBMQVlHQUlOX0FMQlVNX0dBSU4iLAorICAgICAgICAgICAgICBTdHJpbmc6OlVURjgpLCBTdHJpbmcgKGFsYnVtX2dhaW4sIFN0cmluZzo6VVRGOCksIHRydWUpOworICAgICAgZ19mcmVlIChhbGJ1bV9nYWluKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfQUxCVU1fUEVBSykgPT0gMCkgeworICAgIGdkb3VibGUgdmFsdWU7CisKKyAgICByZXN1bHQgPSBnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZV9pbmRleCAobGlzdCwgdGFnLCAwLCAmdmFsdWUpOworCisgICAgaWYgKHJlc3VsdCAhPSBGQUxTRSkgeworICAgICAgZ2NoYXIgKmFsYnVtX3BlYWsgPSAoZ2NoYXIgKikgZ19tYWxsb2MwIChHX0FTQ0lJX0RUT1NUUl9CVUZfU0laRSk7CisKKyAgICAgIGFsYnVtX3BlYWsgPSBnX2FzY2lpX2R0b3N0ciAoYWxidW1fcGVhaywgR19BU0NJSV9EVE9TVFJfQlVGX1NJWkUsIHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVRyAoIlNldHRpbmcgYWxidW0gcGVhayB0byAlcyIsIGFsYnVtX3BlYWspOworICAgICAgYXBldjJ0YWctPmFkZFZhbHVlIChTdHJpbmcgKCJSRVBMQVlHQUlOX0FMQlVNX1BFQUsiLAorICAgICAgICAgICAgICBTdHJpbmc6OlVURjgpLCBTdHJpbmcgKGFsYnVtX3BlYWssIFN0cmluZzo6VVRGOCksIHRydWUpOworICAgICAgZ19mcmVlIChhbGJ1bV9wZWFrKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkcgKCJVbnN1cHBvcnRlZCB0YWc6ICVzIiwgdGFnKTsKKyAgfQorfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9hcGV2Ml9tdXhfcmVuZGVyX3RhZyAoR3N0VGFnTXV4ICogbXV4LCBjb25zdCBHc3RUYWdMaXN0ICogdGFnbGlzdCkKK3sKKyAgQVBFOjpUYWcgYXBldjJ0YWc7CisgIEJ5dGVWZWN0b3IgcmVuZGVyZWRfdGFnOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgZ3VpbnQgdGFnX3NpemU7CisKKyAgLyogUmVuZGVyIHRoZSB0YWcgKi8KKyAgZ3N0X3RhZ19saXN0X2ZvcmVhY2ggKHRhZ2xpc3QsIGFkZF9vbmVfdGFnLCAmYXBldjJ0YWcpOworCisgIHJlbmRlcmVkX3RhZyA9IGFwZXYydGFnLnJlbmRlciAoKTsKKyAgdGFnX3NpemUgPSByZW5kZXJlZF90YWcuc2l6ZSAoKTsKKworICBHU1RfTE9HX09CSkVDVCAobXV4LCAidGFnIHNpemUgPSAlZCBieXRlcyIsIHRhZ19zaXplKTsKKworICAvKiBDcmVhdGUgYnVmZmVyIHdpdGggdGFnICovCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAodGFnX3NpemUpOworICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgcmVuZGVyZWRfdGFnLmRhdGEgKCksIHRhZ19zaXplKTsKKworICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9hcGV2Ml9tdXhfcmVuZGVyX3N0YXJ0X3RhZyAoR3N0VGFnTXV4ICogbXV4LCBjb25zdCBHc3RUYWdMaXN0ICogdGFnbGlzdCkKK3sKKyAgaWYgKGdzdF9hcGV2Ml9tdXhfaGF2ZV93YXZwYWNrIChHU1RfQVBFVjJfTVVYIChtdXgpKSkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gZ3N0X2FwZXYyX211eF9yZW5kZXJfdGFnIChtdXgsIHRhZ2xpc3QpOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9hcGV2Ml9tdXhfcmVuZGVyX2VuZF90YWcgKEdzdFRhZ011eCAqIG11eCwgY29uc3QgR3N0VGFnTGlzdCAqIHRhZ2xpc3QpCit7CisgIGlmIChnc3RfYXBldjJfbXV4X2hhdmVfd2F2cGFjayAoR1NUX0FQRVYyX01VWCAobXV4KSkpCisgICAgcmV0dXJuIGdzdF9hcGV2Ml9tdXhfcmVuZGVyX3RhZyAobXV4LCB0YWdsaXN0KTsKKworICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2V4dC90YWdsaWIvZ3N0YXBldjJtdXguaCBiL2V4dC90YWdsaWIvZ3N0YXBldjJtdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWNlYjU3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3RhZ2xpYi9nc3RhcGV2Mm11eC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIEdTdHJlYW1lciB0YWdsaWItYmFzZWQgQVBFdjIgbXV4ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBDaHJpc3RvcGhlIEZlcmdlYXUgPHRldWZAZ25vbWUub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgR1NUX0FQRVYyX01VWF9ICisjZGVmaW5lIEdTVF9BUEVWMl9NVVhfSAorCisjaW5jbHVkZSA8Z3N0L3RhZy9nc3R0YWdtdXguaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0QXBldjJNdXggR3N0QXBldjJNdXg7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXBldjJNdXhDbGFzcyBHc3RBcGV2Mk11eENsYXNzOworCitzdHJ1Y3QgX0dzdEFwZXYyTXV4IHsKKyAgR3N0VGFnTXV4ICB0YWdtdXg7Cit9OworCitzdHJ1Y3QgX0dzdEFwZXYyTXV4Q2xhc3MgeworICBHc3RUYWdNdXhDbGFzcyAgdGFnbXV4X2NsYXNzOworfTsKKworI2RlZmluZSBHU1RfVFlQRV9BUEVWMl9NVVggXAorICAoZ3N0X2FwZXYyX211eF9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVBFVjJfTVVYKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVBFVjJfTVVYLEdzdEFwZXYyTXV4KSkKKyNkZWZpbmUgR1NUX0FQRVYyX01VWF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9BUEVWMl9NVVgsR3N0QXBldjJNdXhDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BUEVWMl9NVVgob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9BUEVWMl9NVVgpKQorI2RlZmluZSBHU1RfSVNfQVBFVjJfTVVYX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0FQRVYyX01VWCkpCisKK0dUeXBlIGdzdF9hcGV2Ml9tdXhfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogR1NUX0FQRVYyX01VWF9IICovCmRpZmYgLS1naXQgYS9leHQvdGFnbGliL2dzdGlkM3YybXV4LmNjIGIvZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWM5MTE2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYwpAQCAtMCwwICsxLDgwNCBAQAorLyogR1N0cmVhbWVyIHRhZ2xpYi1iYXNlZCBJRDN2MiBtdXhlcgorICogQ29weXJpZ2h0IChDKSAyMDA2IENocmlzdG9waGUgRmVyZ2VhdSA8dGV1ZkBnbm9tZS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1pZDN2Mm11eAorICogQHNlZV9hbHNvOiAjR3N0SUQzRGVtdXgsICNHc3RUYWdTZXR0ZXIKKyAqCisgKiBUaGlzIGVsZW1lbnQgYWRkcyBJRDN2MiB0YWdzIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJlYW0gdXNpbmcgdGhlIHRhZ2xpYgorICogbGlicmFyeS4gTW9yZSBwcmVjaXNlbHksIHRoZSB0YWdzIHdyaXR0ZW4gYXJlIElEMyB2ZXJzaW9uIDIuNC4wIHRhZ3MgKHdoaWNoCisgKiBtZWFucyBpbiBwcmFjdGljZSB0aGF0IHNvbWUgaGFyZHdhcmUgcGxheWVycyBvciBvdXRkYXRlZCBwcm9ncmFtcyBtaWdodCBub3QKKyAqIGJlIGFibGUgdG8gcmVhZCB0aGVtIHByb3Blcmx5KS4KKyAqCisgKiBBcHBsaWNhdGlvbnMgY2FuIHNldCB0aGUgdGFncyB0byB3cml0ZSB1c2luZyB0aGUgI0dzdFRhZ1NldHRlciBpbnRlcmZhY2UuCisgKiBUYWdzIHNlbnQgYnkgdXBzdHJlYW0gZWxlbWVudHMgd2lsbCBiZSBwaWNrZWQgdXAgYXV0b21hdGljYWxseSAoYW5kIG1lcmdlZAorICogYWNjb3JkaW5nIHRvIHRoZSBtZXJnZSBtb2RlIHNldCB2aWEgdGhlIHRhZyBzZXR0ZXIgaW50ZXJmYWNlKS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGZpbGVzcmMgbG9jYXRpb249Zm9vLm9nZyAhIGRlY29kZWJpbiAhIGF1ZGlvY29udmVydCAhIGxhbWUgISBpZDN2Mm11eCAhIGZpbGVzaW5rIGxvY2F0aW9uPWZvby5tcDMKKyAqIF18IEEgcGlwZWxpbmUgdGhhdCB0cmFuc2NvZGVzIGEgZmlsZSBmcm9tIE9nZy9Wb3JiaXMgdG8gbXAzIGZvcm1hdCB3aXRoIGFuCisgKiBJRDN2MiB0aGF0IGNvbnRhaW5zIHRoZSBzYW1lIGFzIHRoZSB0aGUgT2dnL1ZvcmJpcyBmaWxlLiBNYWtlIHN1cmUgdGhlCisgKiBPZ2cvVm9yYmlzIGZpbGUgYWN0dWFsbHkgaGFzIGNvbW1lbnRzIHRvIHByZXNlcnZlLgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC1tIGZpbGVzcmMgbG9jYXRpb249Zm9vLm1wMyAhIGlkM2RlbXV4ICEgZmFrZXNpbmsgc2lsZW50PVRSVUUgMiZndDsgL2Rldi9udWxsIHwgZ3JlcCB0YWdsaXN0CisgKiBdfCBWZXJpZnkgdGhhdCB0YWdzIGhhdmUgYmVlbiB3cml0dGVuLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RpZDN2Mm11eC5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDx0ZXh0aWRlbnRpZmljYXRpb25mcmFtZS5oPgorI2luY2x1ZGUgPHVuaXF1ZWZpbGVpZGVudGlmaWVyZnJhbWUuaD4KKyNpbmNsdWRlIDxhdHRhY2hlZHBpY3R1cmVmcmFtZS5oPgorI2luY2x1ZGUgPHJlbGF0aXZldm9sdW1lZnJhbWUuaD4KKyNpbmNsdWRlIDxjb21tZW50c2ZyYW1lLmg+CisjaW5jbHVkZSA8dW5rbm93bmZyYW1lLmg+CisjaW5jbHVkZSA8aWQzdjJzeW5jaGRhdGEuaD4KKyNpbmNsdWRlIDxpZDN2MnRhZy5oPgorI2luY2x1ZGUgPGdzdC90YWcvdGFnLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBUYWdMaWI7CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9pZDN2Ml9tdXhfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X2lkM3YyX211eF9kZWJ1ZworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtaWQzIikpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoIkFOWSIpKTsKKworR19ERUZJTkVfVFlQRSAoR3N0SWQzdjJNdXgsIGdzdF9pZDN2Ml9tdXgsIEdTVF9UWVBFX1RBR19NVVgpOworCitzdGF0aWMgR3N0QnVmZmVyICpnc3RfaWQzdjJfbXV4X3JlbmRlcl90YWcgKEdzdFRhZ011eCAqIG11eCwKKyAgICBjb25zdCBHc3RUYWdMaXN0ICogdGFnbGlzdCk7CitzdGF0aWMgR3N0QnVmZmVyICpnc3RfaWQzdjJfbXV4X3JlbmRlcl9lbmRfdGFnIChHc3RUYWdNdXggKiBtdXgsCisgICAgY29uc3QgR3N0VGFnTGlzdCAqIHRhZ2xpc3QpOworCitzdGF0aWMgdm9pZAorZ3N0X2lkM3YyX211eF9jbGFzc19pbml0IChHc3RJZDN2Mk11eENsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisKKyAgR1NUX1RBR19NVVhfQ0xBU1MgKGtsYXNzKS0+cmVuZGVyX3N0YXJ0X3RhZyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2lkM3YyX211eF9yZW5kZXJfdGFnKTsKKyAgR1NUX1RBR19NVVhfQ0xBU1MgKGtsYXNzKS0+cmVuZGVyX2VuZF90YWcgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9pZDN2Ml9tdXhfcmVuZGVyX2VuZF90YWcpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIlRhZ0xpYi1iYXNlZCBJRDN2MiBNdXhlciIsICJGb3JtYXR0ZXIvTWV0YWRhdGEiLAorICAgICAgIkFkZHMgYW4gSUQzdjIgaGVhZGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgTVAzIGZpbGVzIHVzaW5nIHRhZ2xpYiIsCisgICAgICAiQ2hyaXN0b3BoZSBGZXJnZWF1IDx0ZXVmQGdub21lLm9yZz4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X2lkM3YyX211eF9kZWJ1ZywgImlkM3YybXV4IiwgMCwKKyAgICAgICJ0YWdsaWItYmFzZWQgSUQzdjIgdGFnIG11eGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaWQzdjJfbXV4X2luaXQgKEdzdElkM3YyTXV4ICogaWQzdjJtdXgpCit7CisgIC8qIG5vdGhpbmcgdG8gZG8gKi8KK30KKworI2lmIDAKK3N0YXRpYyB2b2lkCithZGRfb25lX3R4eHhfdGFnIChJRDN2Mjo6VGFnICogaWQzdjJ0YWcsIGNvbnN0IGdjaGFyICoga2V5LCBjb25zdCBnY2hhciAqIHZhbCkKK3sKKyAgSUQzdjI6OlVzZXJUZXh0SWRlbnRpZmljYXRpb25GcmFtZSAqIGZyYW1lOworCisgIGlmICh2YWwgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgR1NUX0RFQlVHICgiU2V0dGluZyAlcyB0byAlcyIsIGtleSwgdmFsKTsKKyAgZnJhbWUgPSBuZXcgSUQzdjI6OlVzZXJUZXh0SWRlbnRpZmljYXRpb25GcmFtZSAoU3RyaW5nOjpVVEY4KTsKKyAgaWQzdjJ0YWctPmFkZEZyYW1lIChmcmFtZSk7CisgIGZyYW1lLT5zZXREZXNjcmlwdGlvbiAoa2V5KTsKKyAgZnJhbWUtPnNldFRleHQgKHZhbCk7Cit9CisjZW5kaWYKKwordHlwZWRlZiB2b2lkICgqR3N0SWQzdjJNdXhBZGRUYWdGdW5jKSAoSUQzdjI6OlRhZyAqIGlkM3YydGFnLAorICAgIGNvbnN0IEdzdFRhZ0xpc3QgKiBsaXN0LAorICAgIGNvbnN0IGdjaGFyICogdGFnLCBndWludCBudW1fdGFncywgY29uc3QgZ2NoYXIgKiBkYXRhKTsKKworc3RhdGljIHZvaWQKK2FkZF9lbmNvZGVyX3RhZyAoSUQzdjI6OlRhZyAqIGlkM3YydGFnLCBjb25zdCBHc3RUYWdMaXN0ICogbGlzdCwKKyAgICBjb25zdCBnY2hhciAqIHRhZywgZ3VpbnQgbnVtX3RhZ3MsIGNvbnN0IGdjaGFyICogdW51c2VkKQoreworICBUYWdMaWI6OlN0cmluZ0xpc3Qgc3RyaW5nX2xpc3Q7CisgIGd1aW50IG47CisKKyAgLyogRU5DT0RFUl9WRVJTSU9OIGlzIGVpdGhlciBoYW5kbGVkIHdpdGggdGhlIEVOQ09ERVIgdGFnIG9yIG5vdCBhdCBhbGwgKi8KKyAgaWYgKHN0cmNtcCAodGFnLCBHU1RfVEFHX0VOQ09ERVJfVkVSU0lPTikgPT0gMCkKKyAgICByZXR1cm47CisKKyAgZm9yIChuID0gMDsgbiA8IG51bV90YWdzOyArK24pIHsKKyAgICBnY2hhciAqZW5jb2RlciA9IE5VTEw7CisKKyAgICBpZiAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmdfaW5kZXggKGxpc3QsIHRhZywgbiwgJmVuY29kZXIpICYmIGVuY29kZXIpIHsKKyAgICAgIGd1aW50IGVuY29kZXJfdmVyc2lvbjsKKyAgICAgIGdjaGFyICpzOworCisgICAgICBpZiAoZ3N0X3RhZ19saXN0X2dldF91aW50X2luZGV4IChsaXN0LCBHU1RfVEFHX0VOQ09ERVJfVkVSU0lPTiwgbiwKKyAgICAgICAgICAgICAgJmVuY29kZXJfdmVyc2lvbikgJiYgZW5jb2Rlcl92ZXJzaW9uID4gMCkgeworICAgICAgICBzID0gZ19zdHJkdXBfcHJpbnRmICgiJXMgJXUiLCBlbmNvZGVyLCBlbmNvZGVyX3ZlcnNpb24pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcyA9IGdfc3RyZHVwIChlbmNvZGVyKTsKKyAgICAgIH0KKworICAgICAgR1NUX0xPRyAoImVuY29kZXJbJXVdID0gJyVzJyIsIG4sIHMpOworICAgICAgc3RyaW5nX2xpc3QuYXBwZW5kIChTdHJpbmcgKHMsIFN0cmluZzo6VVRGOCkpOworICAgICAgZ19mcmVlIChzKTsKKyAgICAgIGdfZnJlZSAoZW5jb2Rlcik7CisgICAgfQorICB9CisKKyAgaWYgKCFzdHJpbmdfbGlzdC5pc0VtcHR5ICgpKSB7CisgICAgSUQzdjI6OlRleHRJZGVudGlmaWNhdGlvbkZyYW1lICogZjsKKworICAgIGYgPSBuZXcgSUQzdjI6OlRleHRJZGVudGlmaWNhdGlvbkZyYW1lICgiVFNTRSIsIFN0cmluZzo6VVRGOCk7CisgICAgaWQzdjJ0YWctPmFkZEZyYW1lIChmKTsKKyAgICBmLT5zZXRUZXh0IChzdHJpbmdfbGlzdCk7CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkcgKCJFbXB0eSBsaXN0IGZvciB0YWcgJXMsIHNraXBwaW5nIiwgdGFnKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorYWRkX2RhdGVfdGFnIChJRDN2Mjo6VGFnICogaWQzdjJ0YWcsIGNvbnN0IEdzdFRhZ0xpc3QgKiBsaXN0LAorICAgIGNvbnN0IGdjaGFyICogdGFnLCBndWludCBudW1fdGFncywgY29uc3QgZ2NoYXIgKiB1bnVzZWQpCit7CisgIFRhZ0xpYjo6U3RyaW5nTGlzdCBzdHJpbmdfbGlzdDsKKyAgZ3VpbnQgbjsKKworICBHU1RfTE9HICgiQWRkaW5nIGRhdGUgZnJhbWUiKTsKKworICBmb3IgKG4gPSAwOyBuIDwgbnVtX3RhZ3M7ICsrbikgeworICAgIEdEYXRlICpkYXRlID0gTlVMTDsKKworICAgIGlmIChnc3RfdGFnX2xpc3RfZ2V0X2RhdGVfaW5kZXggKGxpc3QsIHRhZywgbiwgJmRhdGUpICYmIGRhdGUgIT0gTlVMTCkgeworICAgICAgR0RhdGVZZWFyIHllYXI7CisgICAgICBnY2hhciAqczsKKworICAgICAgeWVhciA9IGdfZGF0ZV9nZXRfeWVhciAoZGF0ZSk7CisgICAgICBpZiAoeWVhciA+IDUwMCAmJiB5ZWFyIDwgMjEwMCkgeworICAgICAgICBzID0gZ19zdHJkdXBfcHJpbnRmICgiJXUiLCB5ZWFyKTsKKyAgICAgICAgR1NUX0xPRyAoIiVzWyV1XSA9ICclcyciLCB0YWcsIG4sIHMpOworICAgICAgICBzdHJpbmdfbGlzdC5hcHBlbmQgKFN0cmluZyAocywgU3RyaW5nOjpVVEY4KSk7CisgICAgICAgIGdfZnJlZSAocyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfV0FSTklORyAoImludmFsaWQgeWVhciAldSwgc2tpcHBpbmciLCB5ZWFyKTsKKyAgICAgIH0KKworICAgICAgZ19kYXRlX2ZyZWUgKGRhdGUpOworICAgIH0KKyAgfQorCisgIGlmICghc3RyaW5nX2xpc3QuaXNFbXB0eSAoKSkgeworICAgIElEM3YyOjpUZXh0SWRlbnRpZmljYXRpb25GcmFtZSAqIGY7CisKKyAgICBmID0gbmV3IElEM3YyOjpUZXh0SWRlbnRpZmljYXRpb25GcmFtZSAoIlREUkMiLCBTdHJpbmc6OlVURjgpOworICAgIGlkM3YydGFnLT5hZGRGcmFtZSAoZik7CisgICAgZi0+c2V0VGV4dCAoc3RyaW5nX2xpc3QpOworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HICgiRW1wdHkgbGlzdCBmb3IgdGFnICVzLCBza2lwcGluZyIsIHRhZyk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2FkZF9jb3VudF9vcl9udW1fdGFnIChJRDN2Mjo6VGFnICogaWQzdjJ0YWcsIGNvbnN0IEdzdFRhZ0xpc3QgKiBsaXN0LAorICAgIGNvbnN0IGdjaGFyICogdGFnLCBndWludCBudW1fdGFncywgY29uc3QgZ2NoYXIgKiBmcmFtZV9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IHN0cnVjdAorICB7CisgICAgY29uc3QgZ2NoYXIgKmdzdF90YWc7CisgICAgY29uc3QgZ2NoYXIgKmNvcnJfY291bnQ7ICAgIC8qIGNvcnJlc3BvbmRpbmcgQ09VTlQgdGFnIChpZiBudW1iZXIpICovCisgICAgY29uc3QgZ2NoYXIgKmNvcnJfbnVtOyAgICAgIC8qIGNvcnJlc3BvbmRpbmcgTlVNQkVSIHRhZyAoaWYgY291bnQpICovCisgIH0gY29ycltdID0geworICAgIHsKKyAgICBHU1RfVEFHX1RSQUNLX05VTUJFUiwgR1NUX1RBR19UUkFDS19DT1VOVCwgTlVMTH0sIHsKKyAgICBHU1RfVEFHX1RSQUNLX0NPVU5ULCBOVUxMLCBHU1RfVEFHX1RSQUNLX05VTUJFUn0sIHsKKyAgICBHU1RfVEFHX0FMQlVNX1ZPTFVNRV9OVU1CRVIsIEdTVF9UQUdfQUxCVU1fVk9MVU1FX0NPVU5ULCBOVUxMfSwgeworICAgIEdTVF9UQUdfQUxCVU1fVk9MVU1FX0NPVU5ULCBOVUxMLCBHU1RfVEFHX0FMQlVNX1ZPTFVNRV9OVU1CRVJ9CisgIH07CisgIGd1aW50IGlkeDsKKworICBmb3IgKGlkeCA9IDA7IGlkeCA8IEdfTl9FTEVNRU5UUyAoY29ycik7ICsraWR4KSB7CisgICAgaWYgKHN0cmNtcCAoY29ycltpZHhdLmdzdF90YWcsIHRhZykgPT0gMCkKKyAgICAgIGJyZWFrOworICB9CisKKyAgZ19hc3NlcnQgKGlkeCA8IEdfTl9FTEVNRU5UUyAoY29ycikpOworICBnX2Fzc2VydCAoZnJhbWVfaWQgJiYgc3RybGVuIChmcmFtZV9pZCkgPT0gNCk7CisKKyAgaWYgKGNvcnJbaWR4XS5jb3JyX251bSA9PSBOVUxMKSB7CisgICAgZ3VpbnQgbnVtYmVyOworCisgICAgLyogbnVtYmVyIHRhZyAqLworICAgIGlmIChnc3RfdGFnX2xpc3RfZ2V0X3VpbnRfaW5kZXggKGxpc3QsIHRhZywgMCwgJm51bWJlcikpIHsKKyAgICAgIElEM3YyOjpUZXh0SWRlbnRpZmljYXRpb25GcmFtZSAqIGZyYW1lOworICAgICAgZ2NoYXIgKnRhZ19zdHI7CisgICAgICBndWludCBjb3VudDsKKworICAgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfdWludF9pbmRleCAobGlzdCwgY29ycltpZHhdLmNvcnJfY291bnQsIDAsICZjb3VudCkpCisgICAgICAgIHRhZ19zdHIgPSBnX3N0cmR1cF9wcmludGYgKCIldS8ldSIsIG51bWJlciwgY291bnQpOworICAgICAgZWxzZQorICAgICAgICB0YWdfc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiJXUiLCBudW1iZXIpOworCisgICAgICBHU1RfREVCVUcgKCJTZXR0aW5nICVzIHRvICVzIChmcmFtZV9pZCA9ICVzKSIsIHRhZywgdGFnX3N0ciwgZnJhbWVfaWQpOworICAgICAgZnJhbWUgPSBuZXcgSUQzdjI6OlRleHRJZGVudGlmaWNhdGlvbkZyYW1lIChmcmFtZV9pZCwgU3RyaW5nOjpVVEY4KTsKKyAgICAgIGlkM3YydGFnLT5hZGRGcmFtZSAoZnJhbWUpOworICAgICAgZnJhbWUtPnNldFRleHQgKHRhZ19zdHIpOworICAgICAgZ19mcmVlICh0YWdfc3RyKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoY29ycltpZHhdLmNvcnJfY291bnQgPT0gTlVMTCkgeworICAgIGd1aW50IGNvdW50OworCisgICAgLyogY291bnQgdGFnICovCisgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfdWludF9pbmRleCAobGlzdCwgY29ycltpZHhdLmNvcnJfbnVtLCAwLCAmY291bnQpKSB7CisgICAgICBHU1RfREVCVUcgKCIlcyBoYW5kbGVkIHdpdGggJXMsIHNraXBwaW5nIiwgdGFnLCBjb3JyW2lkeF0uY29ycl9udW0pOworICAgIH0gZWxzZSBpZiAoZ3N0X3RhZ19saXN0X2dldF91aW50X2luZGV4IChsaXN0LCB0YWcsIDAsICZjb3VudCkpIHsKKyAgICAgIElEM3YyOjpUZXh0SWRlbnRpZmljYXRpb25GcmFtZSAqIGZyYW1lOworICAgICAgZ2NoYXIgKnRhZ19zdHI7CisKKyAgICAgIHRhZ19zdHIgPSBnX3N0cmR1cF9wcmludGYgKCIwLyV1IiwgY291bnQpOworICAgICAgR1NUX0RFQlVHICgiU2V0dGluZyAlcyB0byAlcyAoZnJhbWVfaWQgPSAlcykiLCB0YWcsIHRhZ19zdHIsIGZyYW1lX2lkKTsKKyAgICAgIGZyYW1lID0gbmV3IElEM3YyOjpUZXh0SWRlbnRpZmljYXRpb25GcmFtZSAoZnJhbWVfaWQsIFN0cmluZzo6VVRGOCk7CisgICAgICBpZDN2MnRhZy0+YWRkRnJhbWUgKGZyYW1lKTsKKyAgICAgIGZyYW1lLT5zZXRUZXh0ICh0YWdfc3RyKTsKKyAgICAgIGdfZnJlZSAodGFnX3N0cik7CisgICAgfQorICB9CisKKyAgaWYgKG51bV90YWdzID4gMSkgeworICAgIEdTVF9XQVJOSU5HICgibW9yZSB0aGFuIG9uZSAlcywgY2FuIG9ubHkgaGFuZGxlIG9uZSIsIHRhZyk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2FkZF91bmlxdWVfZmlsZV9pZF90YWcgKElEM3YyOjpUYWcgKiBpZDN2MnRhZywgY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsCisgICAgY29uc3QgZ2NoYXIgKiB0YWcsIGd1aW50IG51bV90YWdzLCBjb25zdCBnY2hhciAqIHVudXNlZCkKK3sKKyAgY29uc3QgZ2NoYXIgKm9yaWdpbiA9ICJodHRwOi8vbXVzaWNicmFpbnoub3JnIjsKKyAgZ2NoYXIgKmlkX3N0ciA9IE5VTEw7CisKKyAgaWYgKGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nX2luZGV4IChsaXN0LCB0YWcsIDAsICZpZF9zdHIpICYmIGlkX3N0cikgeworICAgIElEM3YyOjpVbmlxdWVGaWxlSWRlbnRpZmllckZyYW1lICogZnJhbWU7CisKKyAgICBHU1RfTE9HICgiQWRkaW5nICVzICglcyk6ICVzIiwgdGFnLCBvcmlnaW4sIGlkX3N0cik7CisgICAgZnJhbWUgPSBuZXcgSUQzdjI6OlVuaXF1ZUZpbGVJZGVudGlmaWVyRnJhbWUgKG9yaWdpbiwgaWRfc3RyKTsKKyAgICBpZDN2MnRhZy0+YWRkRnJhbWUgKGZyYW1lKTsKKyAgICBnX2ZyZWUgKGlkX3N0cik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2FkZF9tdXNpY2JyYWluel90YWcgKElEM3YyOjpUYWcgKiBpZDN2MnRhZywgY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsCisgICAgY29uc3QgZ2NoYXIgKiB0YWcsIGd1aW50IG51bV90YWdzLCBjb25zdCBnY2hhciAqIGRhdGEpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QKKyAgeworICAgIGNvbnN0IGdjaGFyIGdzdF90YWdbMjhdOworICAgIGNvbnN0IGdjaGFyIHNwZWNfaWRbMjhdOworICAgIGNvbnN0IGdjaGFyIHJlYWx3b3JsZF9pZFsyOF07CisgIH0gbWJfaWRzW10gPSB7CisgICAgeworICAgIEdTVF9UQUdfTVVTSUNCUkFJTlpfQVJUSVNUSUQsICJNdXNpY0JyYWlueiBBcnRpc3QgSWQiLAorICAgICAgICAgICJtdXNpY2JyYWluel9hcnRpc3RpZCJ9LCB7CisgICAgR1NUX1RBR19NVVNJQ0JSQUlOWl9BTEJVTUlELCAiTXVzaWNCcmFpbnogQWxidW0gSWQiLCAibXVzaWNicmFpbnpfYWxidW1pZCJ9LCB7CisgICAgR1NUX1RBR19NVVNJQ0JSQUlOWl9BTEJVTUFSVElTVElELCAiTXVzaWNCcmFpbnogQWxidW0gQXJ0aXN0IElkIiwKKyAgICAgICAgICAibXVzaWNicmFpbnpfYWxidW1hcnRpc3RpZCJ9LCB7CisgICAgR1NUX1RBR19NVVNJQ0JSQUlOWl9UUk1JRCwgIk11c2ljQnJhaW56IFRSTSBJZCIsICJtdXNpY2JyYWluel90cm1pZCJ9LCB7CisgICAgR1NUX1RBR19DRERBX01VU0lDQlJBSU5aX0RJU0NJRCwgIk11c2ljQnJhaW56IERpc2NJRCIsCisgICAgICAgICAgIm11c2ljYnJhaW56X2Rpc2NpZCJ9LCB7CisgICAgICAvKiB0aGUgZm9sbG93aW5nIG9uZSBpcyBtb3JlIG9yIGxlc3MgbWFkZSB1cCwgdGhlcmUgc2VlbXMgdG8gYmUgbGl0dGxlCisgICAgICAgKiBldmlkZW5jZSB0aGF0IGFueSBwb3B1bGFyIGFwcGxpY2F0aW9uIGlzIGFjdHVhbGx5IHB1dHRpbmcgdGhpcyBpbmZvCisgICAgICAgKiBpbnRvIFRYWFggZnJhbWVzOyB0aGUgZmlyc3Qgb25lIGNvbWVzIGZyb20gYSBtdXNpY2JyYWlueiB3aWtpICdwcm9wb3NlZAorICAgICAgICogdGFncycgcGFnZSwgdGhlIHNlY29uZCBvbmUgaXMgYW5hbG9ndWUgdG8gdGhlIHZvcmJpcy9hcGUvZmxhYyB0YWcuICovCisgICAgR1NUX1RBR19DRERBX0NEREJfRElTQ0lELCAiQ0REQiBEaXNjSUQiLCAiZGlzY2lkIn0KKyAgfTsKKyAgZ3VpbnQgaSwgaWR4OworCisgIGlkeCA9IChndWludDgpIGRhdGFbMF07CisgIGdfYXNzZXJ0IChpZHggPCBHX05fRUxFTUVOVFMgKG1iX2lkcykpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fdGFnczsgKytpKSB7CisgICAgSUQzdjI6OlVzZXJUZXh0SWRlbnRpZmljYXRpb25GcmFtZSAqIGZyYW1lOworICAgIGdjaGFyICppZF9zdHI7CisKKyAgICBpZiAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmdfaW5kZXggKGxpc3QsIHRhZywgMCwgJmlkX3N0cikgJiYgaWRfc3RyKSB7CisgICAgICBHU1RfREVCVUcgKCJTZXR0aW5nICclcycgdG8gJyVzJyIsIG1iX2lkc1tpZHhdLnNwZWNfaWQsIGlkX3N0cik7CisKKyAgICAgIC8qIGFkZCB0d28gZnJhbWVzLCBvbmUgd2l0aCB0aGUgSUQgdGhlIG11c2ljYnJhaW56Lm9yZyBzcGVjIG1lbnRpb25zCisgICAgICAgKiBhbmQgb25lIHdpdGggdGhlIElEIHRoYXQgYXBwbGljYXRpb25zIHVzZSBpbiB0aGUgcmVhbCB3b3JsZCAqLworICAgICAgZnJhbWUgPSBuZXcgSUQzdjI6OlVzZXJUZXh0SWRlbnRpZmljYXRpb25GcmFtZSAoU3RyaW5nOjpMYXRpbjEpOworICAgICAgaWQzdjJ0YWctPmFkZEZyYW1lIChmcmFtZSk7CisgICAgICBmcmFtZS0+c2V0RGVzY3JpcHRpb24gKG1iX2lkc1tpZHhdLnNwZWNfaWQpOworICAgICAgZnJhbWUtPnNldFRleHQgKGlkX3N0cik7CisKKyAgICAgIGZyYW1lID0gbmV3IElEM3YyOjpVc2VyVGV4dElkZW50aWZpY2F0aW9uRnJhbWUgKFN0cmluZzo6TGF0aW4xKTsKKyAgICAgIGlkM3YydGFnLT5hZGRGcmFtZSAoZnJhbWUpOworICAgICAgZnJhbWUtPnNldERlc2NyaXB0aW9uIChtYl9pZHNbaWR4XS5yZWFsd29ybGRfaWQpOworICAgICAgZnJhbWUtPnNldFRleHQgKGlkX3N0cik7CisKKyAgICAgIGdfZnJlZSAoaWRfc3RyKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2FkZF9pZDN2MmZyYW1lX3RhZyAoSUQzdjI6OlRhZyAqIGlkM3YydGFnLCBjb25zdCBHc3RUYWdMaXN0ICogbGlzdCwKKyAgICBjb25zdCBnY2hhciAqIHRhZywgZ3VpbnQgbnVtX3RhZ3MsIGNvbnN0IGdjaGFyICogZnJhbWVfaWQpCit7CisgIElEM3YyOjpGcmFtZUZhY3RvcnkgKiBmYWN0b3J5ID0gSUQzdjI6OkZyYW1lRmFjdG9yeTo6aW5zdGFuY2UgKCk7CisgIGd1aW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV90YWdzOyArK2kpIHsKKyAgICBJRDN2Mjo6RnJhbWUgKiBmcmFtZTsKKyAgICBjb25zdCBHVmFsdWUgKnZhbDsKKyAgICBHc3RCdWZmZXIgKmJ1ZjsKKyAgICBHc3RTYW1wbGUgKnNhbXBsZTsKKworICAgIHZhbCA9IGdzdF90YWdfbGlzdF9nZXRfdmFsdWVfaW5kZXggKGxpc3QsIHRhZywgaSk7CisgICAgc2FtcGxlID0gKEdzdFNhbXBsZSAqKSBnX3ZhbHVlX2dldF9ib3hlZCAodmFsKTsKKworICAgIGlmIChzYW1wbGUgJiYgKGJ1ZiA9IGdzdF9zYW1wbGVfZ2V0X2J1ZmZlciAoc2FtcGxlKSkgJiYKKyAgICAgICAgZ3N0X3NhbXBsZV9nZXRfY2FwcyAoc2FtcGxlKSkgeworICAgICAgR3N0U3RydWN0dXJlICpzOworICAgICAgZ2ludCB2ZXJzaW9uID0gMDsKKworICAgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGdzdF9zYW1wbGVfZ2V0X2NhcHMgKHNhbXBsZSksIDApOworICAgICAgaWYgKHMgJiYgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzLCAidmVyc2lvbiIsICZ2ZXJzaW9uKSAmJiB2ZXJzaW9uID4gMCkgeworICAgICAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgICAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgICBHU1RfREVCVUcgKCJJbmplY3RpbmcgSUQzdjIuJXUgZnJhbWUgJXUvJXUgb2YgbGVuZ3RoICUiIEdfR1NJWkVfRk9STUFUICIgYW5kIHR5cGUgJSIKKyAgICAgICAgICAgIEdTVF9QVFJfRk9STUFULCB2ZXJzaW9uLCBpLCBudW1fdGFncywgbWFwLnNpemUsIHMpOworCisgICAgICAgIGZyYW1lID0gZmFjdG9yeS0+Y3JlYXRlRnJhbWUgKEJ5dGVWZWN0b3IgKChjb25zdCBjaGFyICopIG1hcC5kYXRhLAorICAgICAgICAgICAgICAgIG1hcC5zaXplKSwgKFRhZ0xpYjo6dWludCkgdmVyc2lvbik7CisgICAgICAgIGlmIChmcmFtZSkKKyAgICAgICAgICBpZDN2MnRhZy0+YWRkRnJhbWUgKGZyYW1lKTsKKworICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorYWRkX2ltYWdlX3RhZyAoSUQzdjI6OlRhZyAqIGlkM3YydGFnLCBjb25zdCBHc3RUYWdMaXN0ICogbGlzdCwKKyAgICBjb25zdCBnY2hhciAqIHRhZywgZ3VpbnQgbnVtX3RhZ3MsIGNvbnN0IGdjaGFyICogdW51c2VkKQoreworICBndWludCBuOworCisgIGZvciAobiA9IDA7IG4gPCBudW1fdGFnczsgKytuKSB7CisgICAgY29uc3QgR1ZhbHVlICp2YWw7CisgICAgR3N0U2FtcGxlICpzYW1wbGU7CisgICAgR3N0QnVmZmVyICppbWFnZTsKKworICAgIEdTVF9ERUJVRyAoImltYWdlICV1LyV1IiwgbiArIDEsIG51bV90YWdzKTsKKworICAgIHZhbCA9IGdzdF90YWdfbGlzdF9nZXRfdmFsdWVfaW5kZXggKGxpc3QsIHRhZywgbik7CisgICAgc2FtcGxlID0gKEdzdFNhbXBsZSAqKSBnX3ZhbHVlX2dldF9ib3hlZCAodmFsKTsKKworICAgIGlmIChHU1RfSVNfU0FNUExFIChzYW1wbGUpICYmIChpbWFnZSA9IGdzdF9zYW1wbGVfZ2V0X2J1ZmZlciAoc2FtcGxlKSkgJiYKKyAgICAgICAgR1NUX0lTX0JVRkZFUiAoaW1hZ2UpICYmIGdzdF9idWZmZXJfZ2V0X3NpemUgKGltYWdlKSA+IDAgJiYKKyAgICAgICAgZ3N0X3NhbXBsZV9nZXRfY2FwcyAoc2FtcGxlKSAhPSBOVUxMICYmCisgICAgICAgICFnc3RfY2Fwc19pc19lbXB0eSAoZ3N0X3NhbXBsZV9nZXRfY2FwcyAoc2FtcGxlKSkpIHsKKyAgICAgIGNvbnN0IGdjaGFyICptaW1lX3R5cGU7CisgICAgICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChnc3Rfc2FtcGxlX2dldF9jYXBzIChzYW1wbGUpLCAwKTsKKyAgICAgIG1pbWVfdHlwZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHMpOworICAgICAgaWYgKG1pbWVfdHlwZSAhPSBOVUxMKSB7CisgICAgICAgIElEM3YyOjpBdHRhY2hlZFBpY3R1cmVGcmFtZSAqIGZyYW1lOworICAgICAgICBjb25zdCBnY2hhciAqZGVzYyA9IE5VTEw7CisgICAgICAgIEdzdE1hcEluZm8gbWFwOworICAgICAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKmluZm9fc3RydWN0OworCisgICAgICAgIGluZm9fc3RydWN0ID0gZ3N0X3NhbXBsZV9nZXRfaW5mbyAoc2FtcGxlKTsKKyAgICAgICAgaWYgKCFpbmZvX3N0cnVjdAorICAgICAgICAgICAgfHwgIWdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKGluZm9fc3RydWN0LCAiR3N0VGFnSW1hZ2VJbmZvIikpCisgICAgICAgICAgaW5mb19zdHJ1Y3QgPSBOVUxMOworCisgICAgICAgIGlmIChzdHJjbXAgKG1pbWVfdHlwZSwgInRleHQvdXJpLWxpc3QiKSA9PSAwKQorICAgICAgICAgIG1pbWVfdHlwZSA9ICItLT4iOworCisgICAgICAgIGZyYW1lID0gbmV3IElEM3YyOjpBdHRhY2hlZFBpY3R1cmVGcmFtZSAoKTsKKworICAgICAgICBnc3RfYnVmZmVyX21hcCAoaW1hZ2UsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgICAgICAgR1NUX0RFQlVHICgiQXR0YWNoaW5nIHBpY3R1cmUgb2YgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyBhbmQgbWltZSB0eXBlICVzIiwKKyAgICAgICAgICAgIG1hcC5zaXplLCBtaW1lX3R5cGUpOworCisgICAgICAgIGlkM3YydGFnLT5hZGRGcmFtZSAoZnJhbWUpOworICAgICAgICBmcmFtZS0+c2V0UGljdHVyZSAoQnl0ZVZlY3RvciAoKGNvbnN0IGNoYXIgKikgbWFwLmRhdGEsIG1hcC5zaXplKSk7CisgICAgICAgIGZyYW1lLT5zZXRUZXh0RW5jb2RpbmcgKFN0cmluZzo6VVRGOCk7CisgICAgICAgIGZyYW1lLT5zZXRNaW1lVHlwZSAobWltZV90eXBlKTsKKworICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChpbWFnZSwgJm1hcCk7CisKKyAgICAgICAgaWYgKGluZm9fc3RydWN0KQorICAgICAgICAgIGRlc2MgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKGluZm9fc3RydWN0LCAiaW1hZ2UtZGVzY3JpcHRpb24iKTsKKworICAgICAgICBmcmFtZS0+c2V0RGVzY3JpcHRpb24gKChkZXNjKSA/IGRlc2MgOiAiIik7CisKKyAgICAgICAgaWYgKHN0cmNtcCAodGFnLCBHU1RfVEFHX1BSRVZJRVdfSU1BR0UpID09IDApIHsKKyAgICAgICAgICBmcmFtZS0+c2V0VHlwZSAoSUQzdjI6OkF0dGFjaGVkUGljdHVyZUZyYW1lOjpGaWxlSWNvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW50IGltYWdlX3R5cGUgPSBJRDN2Mjo6QXR0YWNoZWRQaWN0dXJlRnJhbWU6Ok90aGVyOworCisgICAgICAgICAgaWYgKGluZm9fc3RydWN0KSB7CisgICAgICAgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXQgKGluZm9fc3RydWN0LCAiaW1hZ2UtdHlwZSIsCisgICAgICAgICAgICAgICAgICAgIEdTVF9UWVBFX1RBR19JTUFHRV9UWVBFLCAmaW1hZ2VfdHlwZSwgTlVMTCkpIHsKKyAgICAgICAgICAgICAgaWYgKGltYWdlX3R5cGUgPiAwICYmIGltYWdlX3R5cGUgPD0gMTgpIHsKKyAgICAgICAgICAgICAgICBpbWFnZV90eXBlICs9IDI7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW1hZ2VfdHlwZSA9IElEM3YyOjpBdHRhY2hlZFBpY3R1cmVGcmFtZTo6T3RoZXI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBmcmFtZS0+c2V0VHlwZSAoKFRhZ0xpYjo6SUQzdjI6OkF0dGFjaGVkUGljdHVyZUZyYW1lOjpUeXBlKSBpbWFnZV90eXBlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklORyAoIk5VTEwgaW1hZ2Ugb3Igbm8gY2FwcyBvbiBpbWFnZSBzYW1wbGUgKCVwLCBjYXBzPSUiCisgICAgICAgICAgR1NUX1BUUl9GT1JNQVQgIikiLCBzYW1wbGUsCisgICAgICAgICAgKHNhbXBsZSkgPyBnc3Rfc2FtcGxlX2dldF9jYXBzIChzYW1wbGUpIDogTlVMTCk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCithZGRfY29tbWVudF90YWcgKElEM3YyOjpUYWcgKiBpZDN2MnRhZywgY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsCisgICAgY29uc3QgZ2NoYXIgKiB0YWcsIGd1aW50IG51bV90YWdzLCBjb25zdCBnY2hhciAqIHVudXNlZCkKK3sKKyAgVGFnTGliOjpTdHJpbmdMaXN0IHN0cmluZ19saXN0OworICBndWludCBuOworCisgIEdTVF9MT0cgKCJBZGRpbmcgY29tbWVudCBmcmFtZXMiKTsKKyAgZm9yIChuID0gMDsgbiA8IG51bV90YWdzOyArK24pIHsKKyAgICBnY2hhciAqcyA9IE5VTEw7CisKKyAgICBpZiAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmdfaW5kZXggKGxpc3QsIHRhZywgbiwgJnMpICYmIHMgIT0gTlVMTCkgeworICAgICAgSUQzdjI6OkNvbW1lbnRzRnJhbWUgKiBmOworICAgICAgZ2NoYXIgKmRlc2MgPSBOVUxMLCAqdmFsID0gTlVMTCwgKmxhbmcgPSBOVUxMOworCisgICAgICBmID0gbmV3IElEM3YyOjpDb21tZW50c0ZyYW1lIChTdHJpbmc6OlVURjgpOworCisgICAgICBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfQ09NTUVOVCkgPT0gMCB8fAorICAgICAgICAgICFnc3RfdGFnX3BhcnNlX2V4dGVuZGVkX2NvbW1lbnQgKHMsICZkZXNjLCAmbGFuZywgJnZhbCwgVFJVRSkpIHsKKyAgICAgICAgLyogY3JlYXRlIGR1bW15IGRlc2NyaXB0aW9uIHRvIGFsbG93IGZvciBtdWx0aXBsZSBjb21tZW50IGZyYW1lcworICAgICAgICAgKiAodGFnbGliIHdpbGwgZHJvcCBjb21tZW50IGZyYW1lcyBpZiBkZXNjcmlwdGlvbnMgYXJlIG5vdCB1bmlxdWUpICovCisgICAgICAgIGRlc2MgPSBnX3N0cmR1cF9wcmludGYgKCJjJXUiLCBuKTsKKyAgICAgICAgdmFsID0gZ19zdHJkdXAgKHMpOworICAgICAgfQorCisgICAgICBHU1RfTE9HICgiJXNbJXVdID0gJyVzJyAoJXN8JXN8JXMpIiwgdGFnLCBuLCBzLCBHU1RfU1RSX05VTEwgKGRlc2MpLAorICAgICAgICAgIEdTVF9TVFJfTlVMTCAobGFuZyksIEdTVF9TVFJfTlVMTCAodmFsKSk7CisKKyAgICAgIGYtPnNldERlc2NyaXB0aW9uIChkZXNjKTsKKyAgICAgIGYtPnNldFRleHQgKHZhbCk7CisgICAgICBpZiAobGFuZykgeworICAgICAgICBmLT5zZXRMYW5ndWFnZSAobGFuZyk7CisgICAgICB9CisKKyAgICAgIGdfZnJlZSAobGFuZyk7CisgICAgICBnX2ZyZWUgKGRlc2MpOworICAgICAgZ19mcmVlICh2YWwpOworCisgICAgICBpZDN2MnRhZy0+YWRkRnJhbWUgKGYpOworICAgIH0KKyAgICBnX2ZyZWUgKHMpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCithZGRfdGV4dF90YWcgKElEM3YyOjpUYWcgKiBpZDN2MnRhZywgY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsCisgICAgY29uc3QgZ2NoYXIgKiB0YWcsIGd1aW50IG51bV90YWdzLCBjb25zdCBnY2hhciAqIGZyYW1lX2lkKQoreworICBJRDN2Mjo6VGV4dElkZW50aWZpY2F0aW9uRnJhbWUgKiBmOworICBUYWdMaWI6OlN0cmluZ0xpc3Qgc3RyaW5nX2xpc3Q7CisgIGd1aW50IG47CisKKyAgR1NUX0xPRyAoIkFkZGluZyAnJXMnIGZyYW1lIiwgZnJhbWVfaWQpOworICBmb3IgKG4gPSAwOyBuIDwgbnVtX3RhZ3M7ICsrbikgeworICAgIGdjaGFyICpzID0gTlVMTDsKKworICAgIGlmIChnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZ19pbmRleCAobGlzdCwgdGFnLCBuLCAmcykgJiYgcyAhPSBOVUxMKSB7CisgICAgICBHU1RfTE9HICgiJXM6ICVzWyV1XSA9ICclcyciLCBmcmFtZV9pZCwgdGFnLCBuLCBzKTsKKyAgICAgIHN0cmluZ19saXN0LmFwcGVuZCAoU3RyaW5nIChzLCBTdHJpbmc6OlVURjgpKTsKKyAgICAgIGdfZnJlZSAocyk7CisgICAgfQorICB9CisKKyAgaWYgKCFzdHJpbmdfbGlzdC5pc0VtcHR5ICgpKSB7CisgICAgZiA9IG5ldyBJRDN2Mjo6VGV4dElkZW50aWZpY2F0aW9uRnJhbWUgKGZyYW1lX2lkLCBTdHJpbmc6OlVURjgpOworICAgIGlkM3YydGFnLT5hZGRGcmFtZSAoZik7CisgICAgZi0+c2V0VGV4dCAoc3RyaW5nX2xpc3QpOworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HICgiRW1wdHkgbGlzdCBmb3IgdGFnICVzLCBza2lwcGluZyIsIHRhZyk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2FkZF91cmlfdGFnIChJRDN2Mjo6VGFnICogaWQzdjJ0YWcsIGNvbnN0IEdzdFRhZ0xpc3QgKiBsaXN0LAorICAgIGNvbnN0IGdjaGFyICogdGFnLCBndWludCBudW1fdGFncywgY29uc3QgZ2NoYXIgKiBmcmFtZV9pZCkKK3sKKyAgZ2NoYXIgKnVybCA9IE5VTEw7CisKKyAgZ19hc3NlcnQgKGZyYW1lX2lkICE9IE5VTEwpOworCisgIC8qIFVSSSB0YWdzIGFyZSBsaW1pdGVkIHRvIG9uZSBvZiBlYWNoIHBlciB0YWdsaXN0ICovCisgIGlmIChnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZ19pbmRleCAobGlzdCwgdGFnLCAwLCAmdXJsKSAmJiB1cmwgIT0gTlVMTCkgeworICAgIGd1aW50IHVybF9sZW47CisKKyAgICB1cmxfbGVuID0gc3RybGVuICh1cmwpOworICAgIGlmICh1cmxfbGVuID4gMCAmJiBnc3RfdXJpX2lzX3ZhbGlkICh1cmwpKSB7CisgICAgICBJRDN2Mjo6RnJhbWVGYWN0b3J5ICogZmFjdG9yeSA9IElEM3YyOjpGcmFtZUZhY3Rvcnk6Omluc3RhbmNlICgpOworICAgICAgSUQzdjI6OkZyYW1lICogZnJhbWU7CisgICAgICBjaGFyICpkYXRhOworCisgICAgICBkYXRhID0gZ19uZXcwIChjaGFyLCAxMCArIHVybF9sZW4pOworCisgICAgICBtZW1jcHkgKGRhdGEsIGZyYW1lX2lkLCA0KTsKKyAgICAgIG1lbWNweSAoZGF0YSArIDQsIElEM3YyOjpTeW5jaERhdGE6OmZyb21VSW50ICh1cmxfbGVuKS5kYXRhICgpLCA0KTsKKyAgICAgIG1lbWNweSAoZGF0YSArIDEwLCB1cmwsIHVybF9sZW4pOworICAgICAgQnl0ZVZlY3RvciBieXRlcyAoZGF0YSwgMTAgKyB1cmxfbGVuKTsKKworICAgICAgZ19mcmVlIChkYXRhKTsKKworICAgICAgZnJhbWUgPSBmYWN0b3J5LT5jcmVhdGVGcmFtZSAoYnl0ZXMsIChUYWdMaWI6OnVpbnQpIDQpOworICAgICAgaWYgKGZyYW1lKSB7CisgICAgICAgIGlkM3YydGFnLT5hZGRGcmFtZSAoZnJhbWUpOworCisgICAgICAgIEdTVF9MT0cgKCIlczogJXMgPSAnJXMnIiwgZnJhbWVfaWQsIHRhZywgdXJsKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkcgKCJUYWcgJXMgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIFVSSSAoJXMpIiwgdGFnLCB1cmwpOworICAgIH0KKworICAgIGdfZnJlZSAodXJsKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorYWRkX3JlbGF0aXZlX3ZvbHVtZV90YWcgKElEM3YyOjpUYWcgKiBpZDN2MnRhZywgY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsCisgICAgY29uc3QgZ2NoYXIgKiB0YWcsIGd1aW50IG51bV90YWdzLCBjb25zdCBnY2hhciAqIGZyYW1lX2lkKQoreworICBjb25zdCBjaGFyICpnYWluX3RhZ19uYW1lOworICBjb25zdCBjaGFyICpwZWFrX3RhZ19uYW1lOworICBnZG91YmxlIHBlYWtfdmFsOworICBnZG91YmxlIGdhaW5fdmFsOworICBJRDN2Mjo6UmVsYXRpdmVWb2x1bWVGcmFtZSAqIGZyYW1lOworCisgIGZyYW1lID0gbmV3IElEM3YyOjpSZWxhdGl2ZVZvbHVtZUZyYW1lICgpOworCisgIC8qIGZpZ3VyZSBvdXQgdGFnIG5hbWVzIGFuZCB0aGUgaWRlbnRpZmljYXRpb24gc3RyaW5nIHRvIHVzZSAqLworICBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfVFJBQ0tfUEVBSykgPT0gMCB8fAorICAgICAgc3RyY21wICh0YWcsIEdTVF9UQUdfVFJBQ0tfR0FJTikgPT0gMCkgeworICAgIGdhaW5fdGFnX25hbWUgPSBHU1RfVEFHX1RSQUNLX0dBSU47CisgICAgcGVha190YWdfbmFtZSA9IEdTVF9UQUdfVFJBQ0tfUEVBSzsKKyAgICBmcmFtZS0+c2V0SWRlbnRpZmljYXRpb24gKCJ0cmFjayIpOworICAgIEdTVF9ERUJVRyAoImFkZGluZyB0cmFjayByZWxhdGl2ZS12b2x1bWUgZnJhbWUiKTsKKyAgfSBlbHNlIHsKKyAgICBnYWluX3RhZ19uYW1lID0gR1NUX1RBR19BTEJVTV9HQUlOOworICAgIHBlYWtfdGFnX25hbWUgPSBHU1RfVEFHX0FMQlVNX1BFQUs7CisgICAgZnJhbWUtPnNldElkZW50aWZpY2F0aW9uICgiYWxidW0iKTsKKyAgICBHU1RfREVCVUcgKCJhZGRpbmcgYWxidW0gcmVsYXRpdmUtdm9sdW1lIGZyYW1lIik7CisgIH0KKworICAvKiBmaW5kIHRoZSB2YWx1ZSBmb3IgdGhlIHBhaXJlZCB0YWcgKGdhaW4sIGlmIHRoaXMgaXMgcGVhaywgYW5kCisgICAqIHZpY2UgdmVyc2EpLiAgaWYgYm90aCB0YWdzIGV4aXN0LCBvbmx5IHdyaXRlIHRoZSBmcmFtZSB3aGVuCisgICAqIHdlJ3JlIHByb2Nlc3NpbmcgdGhlIHBlYWsgdGFnLgorICAgKi8KKyAgaWYgKHN0cmNtcCAodGFnLCBHU1RfVEFHX1RSQUNLX1BFQUspID09IDAgfHwKKyAgICAgIHN0cmNtcCAodGFnLCBHU1RfVEFHX0FMQlVNX1BFQUspID09IDApIHsKKyAgICBJRDN2Mjo6UmVsYXRpdmVWb2x1bWVGcmFtZTo6UGVha1ZvbHVtZSBlbmNvZGVkX3BlYWs7CisgICAgc2hvcnQgcGVha19pbnQ7CisKKyAgICBnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZSAobGlzdCwgdGFnLCAmcGVha192YWwpOworCisgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfdGFnX3NpemUgKGxpc3QsIGdhaW5fdGFnX25hbWUpID4gMCkgeworICAgICAgZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKGxpc3QsIGdhaW5fdGFnX25hbWUsICZnYWluX3ZhbCk7CisgICAgICBHU1RfREVCVUcgKCJzZXR0aW5nIHZvbHVtZSBhZGp1c3RtZW50ICVnIiwgZ2Fpbl92YWwpOworICAgICAgZnJhbWUtPnNldFZvbHVtZUFkanVzdG1lbnQgKGdhaW5fdmFsKTsKKyAgICB9CisKKyAgICAvKiBjb3B5aW5nIG11dGFnZW46IGFsd2F5cyB3cml0ZSBhcyAxNiBiaXRzIGZvciBzYW5pdHkuICovCisgICAgcGVha19pbnQgPSAoc2hvcnQpKHBlYWtfdmFsICogR19NQVhTSE9SVCk7CisgICAgZW5jb2RlZF9wZWFrLmJpdHNSZXByZXNlbnRpbmdQZWFrID0gMTY7CisgICAgZW5jb2RlZF9wZWFrLnBlYWtWb2x1bWUgPSBCeXRlVmVjdG9yOjpmcm9tU2hvcnQocGVha19pbnQsIHRydWUpOworICAgIEdTVF9ERUJVRyAoInNldHRpbmcgcGVhayB2YWx1ZSAlZyIsIHBlYWtfdmFsKTsKKyAgICBmcmFtZS0+c2V0UGVha1ZvbHVtZShlbmNvZGVkX3BlYWspOworCisgIH0gZWxzZSB7CisgICAgZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKGxpc3QsIHRhZywgJmdhaW5fdmFsKTsKKyAgICBHU1RfREVCVUcgKCJzZXR0aW5nIHZvbHVtZSBhZGp1c3RtZW50ICVnIiwgZ2Fpbl92YWwpOworICAgIGZyYW1lLT5zZXRWb2x1bWVBZGp1c3RtZW50IChnYWluX3ZhbCk7CisKKyAgICBpZiAoZ3N0X3RhZ19saXN0X2dldF90YWdfc2l6ZSAobGlzdCwgcGVha190YWdfbmFtZSkgIT0gMCkgeworICAgICAgR1NUX0RFQlVHICgiYm90aCBnYWluIGFuZCBwZWFrIHRhZ3MgZXhpc3QsIG5vdCBhZGRpbmcgZnJhbWUgdGhpcyB0aW1lIGFyb3VuZCIpOworICAgICAgZGVsZXRlIGZyYW1lOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIGlkM3YydGFnLT5hZGRGcmFtZSAoZnJhbWUpOworfQorCitzdGF0aWMgdm9pZAorYWRkX2JwbV90YWcgKElEM3YyOjpUYWcgKiBpZDN2MnRhZywgY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsCisgICAgY29uc3QgZ2NoYXIgKiB0YWcsIGd1aW50IG51bV90YWdzLCBjb25zdCBnY2hhciAqIGZyYW1lX2lkKQoreworICBnZG91YmxlIGJwbTsKKworICBpZiAoZ3N0X3RhZ19saXN0X2dldF9kb3VibGVfaW5kZXggKGxpc3QsIHRhZywgMCwgJmJwbSkpIHsKKyAgICBJRDN2Mjo6VGV4dElkZW50aWZpY2F0aW9uRnJhbWUgKiBmcmFtZTsKKyAgICBnY2hhciAqdGFnX3N0cjsKKworICAgIHRhZ19zdHIgPSBnX3N0cmR1cF9wcmludGYgKCIldSIsIChndWludClicG0pOworCisgICAgR1NUX0RFQlVHICgiU2V0dGluZyAlcyB0byAlcyIsIHRhZywgdGFnX3N0cik7CisgICAgZnJhbWUgPSBuZXcgSUQzdjI6OlRleHRJZGVudGlmaWNhdGlvbkZyYW1lICgiVEJQTSIsIFN0cmluZzo6VVRGOCk7CisgICAgaWQzdjJ0YWctPmFkZEZyYW1lIChmcmFtZSk7CisgICAgZnJhbWUtPnNldFRleHQgKHRhZ19zdHIpOworICAgIGdfZnJlZSAodGFnX3N0cik7CisgIH0KK30KKworLyogaWQzZGVtdXggcHJvZHVjZXMgdGhlc2UgZm9yIGZyYW1lcyBpdCBjYW5ub3QgcGFyc2UgKi8KKyNkZWZpbmUgR1NUX0lEM19ERU1VWF9UQUdfSUQzVjJfRlJBTUUgInByaXZhdGUtaWQzdjItZnJhbWUiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QKK3sKKyAgY29uc3QgZ2NoYXIgKmdzdF90YWc7CisgIGNvbnN0IEdzdElkM3YyTXV4QWRkVGFnRnVuYyBmdW5jOworICBjb25zdCBnY2hhciBkYXRhWzVdOworfSBhZGRfZnVuY3NbXSA9IHsKKyAgeworICBHU1RfVEFHX0FSVElTVCwgYWRkX3RleHRfdGFnLCAiVFBFMSJ9LCB7CisgIEdTVF9UQUdfQUxCVU1fQVJUSVNULCBhZGRfdGV4dF90YWcsICJUUEUyIn0sIHsKKyAgR1NUX1RBR19USVRMRSwgYWRkX3RleHRfdGFnLCAiVElUMiJ9LCB7CisgIEdTVF9UQUdfQUxCVU0sIGFkZF90ZXh0X3RhZywgIlRBTEIifSwgeworICBHU1RfVEFHX0NPUFlSSUdIVCwgYWRkX3RleHRfdGFnLCAiVENPUCJ9LCB7CisgIEdTVF9UQUdfQ09NUE9TRVIsIGFkZF90ZXh0X3RhZywgIlRDT00ifSwgeworICBHU1RfVEFHX0dFTlJFLCBhZGRfdGV4dF90YWcsICJUQ09OIn0sIHsKKyAgR1NUX1RBR19DT01NRU5ULCBhZGRfY29tbWVudF90YWcsICIifSwgeworICBHU1RfVEFHX0VYVEVOREVEX0NPTU1FTlQsIGFkZF9jb21tZW50X3RhZywgIiJ9LCB7CisgIEdTVF9UQUdfREFURSwgYWRkX2RhdGVfdGFnLCAiIn0sIHsKKyAgR1NUX1RBR19JTUFHRSwgYWRkX2ltYWdlX3RhZywgIiJ9LCB7CisgIEdTVF9UQUdfUFJFVklFV19JTUFHRSwgYWRkX2ltYWdlX3RhZywgIiJ9LCB7CisgIEdTVF9JRDNfREVNVVhfVEFHX0lEM1YyX0ZSQU1FLCBhZGRfaWQzdjJmcmFtZV90YWcsICIifSwgeworICBHU1RfVEFHX01VU0lDQlJBSU5aX0FSVElTVElELCBhZGRfbXVzaWNicmFpbnpfdGFnLCAiXDAwMCJ9LCB7CisgIEdTVF9UQUdfTVVTSUNCUkFJTlpfQUxCVU1JRCwgYWRkX211c2ljYnJhaW56X3RhZywgIlwwMDEifSwgeworICBHU1RfVEFHX01VU0lDQlJBSU5aX0FMQlVNQVJUSVNUSUQsIGFkZF9tdXNpY2JyYWluel90YWcsICJcMDAyIn0sIHsKKyAgR1NUX1RBR19NVVNJQ0JSQUlOWl9UUk1JRCwgYWRkX211c2ljYnJhaW56X3RhZywgIlwwMDMifSwgeworICBHU1RfVEFHX0NEREFfTVVTSUNCUkFJTlpfRElTQ0lELCBhZGRfbXVzaWNicmFpbnpfdGFnLCAiXDAwNCJ9LCB7CisgIEdTVF9UQUdfQ0REQV9DRERCX0RJU0NJRCwgYWRkX211c2ljYnJhaW56X3RhZywgIlwwMDUifSwgeworICBHU1RfVEFHX01VU0lDQlJBSU5aX1RSQUNLSUQsIGFkZF91bmlxdWVfZmlsZV9pZF90YWcsICIifSwgeworICBHU1RfVEFHX0FSVElTVF9TT1JUTkFNRSwgYWRkX3RleHRfdGFnLCAiVFNPUCJ9LCB7CisgIEdTVF9UQUdfQUxCVU1fU09SVE5BTUUsIGFkZF90ZXh0X3RhZywgIlRTT0EifSwgeworICBHU1RfVEFHX1RJVExFX1NPUlROQU1FLCBhZGRfdGV4dF90YWcsICJUU09UIn0sIHsKKyAgR1NUX1RBR19UUkFDS19OVU1CRVIsIGFkZF9jb3VudF9vcl9udW1fdGFnLCAiVFJDSyJ9LCB7CisgIEdTVF9UQUdfVFJBQ0tfQ09VTlQsIGFkZF9jb3VudF9vcl9udW1fdGFnLCAiVFJDSyJ9LCB7CisgIEdTVF9UQUdfQUxCVU1fVk9MVU1FX05VTUJFUiwgYWRkX2NvdW50X29yX251bV90YWcsICJUUE9TIn0sIHsKKyAgR1NUX1RBR19BTEJVTV9WT0xVTUVfQ09VTlQsIGFkZF9jb3VudF9vcl9udW1fdGFnLCAiVFBPUyJ9LCB7CisgIEdTVF9UQUdfRU5DT0RFUiwgYWRkX2VuY29kZXJfdGFnLCAiIn0sIHsKKyAgR1NUX1RBR19FTkNPREVSX1ZFUlNJT04sIGFkZF9lbmNvZGVyX3RhZywgIiJ9LCB7CisgIEdTVF9UQUdfQ09QWVJJR0hUX1VSSSwgYWRkX3VyaV90YWcsICJXQ09QIn0sIHsKKyAgR1NUX1RBR19MSUNFTlNFX1VSSSwgYWRkX3VyaV90YWcsICJXQ09QIn0sIHsKKyAgR1NUX1RBR19UUkFDS19QRUFLLCBhZGRfcmVsYXRpdmVfdm9sdW1lX3RhZywgIiJ9LCB7CisgIEdTVF9UQUdfVFJBQ0tfR0FJTiwgYWRkX3JlbGF0aXZlX3ZvbHVtZV90YWcsICIifSwgeworICBHU1RfVEFHX0FMQlVNX1BFQUssIGFkZF9yZWxhdGl2ZV92b2x1bWVfdGFnLCAiIn0sIHsKKyAgR1NUX1RBR19BTEJVTV9HQUlOLCBhZGRfcmVsYXRpdmVfdm9sdW1lX3RhZywgIiJ9LCB7CisgIEdTVF9UQUdfQkVBVFNfUEVSX01JTlVURSwgYWRkX2JwbV90YWcsICIifQorfTsKKworCitzdGF0aWMgdm9pZAorZm9yZWFjaF9hZGRfdGFnIChjb25zdCBHc3RUYWdMaXN0ICogbGlzdCwgY29uc3QgZ2NoYXIgKiB0YWcsIGdwb2ludGVyIHVzZXJkYXRhKQoreworICBJRDN2Mjo6VGFnICogaWQzdjJ0YWcgPSAoSUQzdjI6OlRhZyAqKSB1c2VyZGF0YTsKKyAgVGFnTGliOjpTdHJpbmdMaXN0IHN0cmluZ19saXN0OworICBndWludCBudW1fdGFncywgaTsKKworICBudW1fdGFncyA9IGdzdF90YWdfbGlzdF9nZXRfdGFnX3NpemUgKGxpc3QsIHRhZyk7CisKKyAgR1NUX0xPRyAoIlByb2Nlc3NpbmcgdGFnICVzIChudW09JXUpIiwgdGFnLCBudW1fdGFncyk7CisKKyAgaWYgKG51bV90YWdzID4gMSAmJiBnc3RfdGFnX2lzX2ZpeGVkICh0YWcpKSB7CisgICAgR1NUX1dBUk5JTkcgKCJNdWx0aXBsZSBvY2N1cmVuY2VzIG9mIGZpeGVkIHRhZyAnJXMnLCBpZ25vcmluZyBzb21lIiwgdGFnKTsKKyAgICBudW1fdGFncyA9IDE7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTIChhZGRfZnVuY3MpOyArK2kpIHsKKyAgICBpZiAoc3RyY21wIChhZGRfZnVuY3NbaV0uZ3N0X3RhZywgdGFnKSA9PSAwKSB7CisgICAgICBhZGRfZnVuY3NbaV0uZnVuYyAoaWQzdjJ0YWcsIGxpc3QsIHRhZywgbnVtX3RhZ3MsIGFkZF9mdW5jc1tpXS5kYXRhKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChpID09IEdfTl9FTEVNRU5UUyAoYWRkX2Z1bmNzKSkgeworICAgIEdTVF9XQVJOSU5HICgiVW5zdXBwb3J0ZWQgdGFnICclcycgLSBub3Qgd3JpdHRlbiIsIHRhZyk7CisgIH0KK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfaWQzdjJfbXV4X3JlbmRlcl90YWcgKEdzdFRhZ011eCAqIG11eCwgY29uc3QgR3N0VGFnTGlzdCAqIHRhZ2xpc3QpCit7CisgIElEM3YyOjpUYWcgaWQzdjJ0YWc7CisgIEJ5dGVWZWN0b3IgcmVuZGVyZWRfdGFnOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgZ3VpbnQgdGFnX3NpemU7CisKKyAgLyogd3JpdGUgYWxsIHN0cmluZ3MgYXMgVVRGLTggYnkgZGVmYXVsdCAqLworICBUYWdMaWI6OklEM3YyOjpGcmFtZUZhY3Rvcnk6Omluc3RhbmNlICgpLT4KKyAgICAgIHNldERlZmF1bHRUZXh0RW5jb2RpbmcgKFRhZ0xpYjo6U3RyaW5nOjpVVEY4KTsKKworICAvKiBSZW5kZXIgdGhlIHRhZyAqLworICBnc3RfdGFnX2xpc3RfZm9yZWFjaCAodGFnbGlzdCwgZm9yZWFjaF9hZGRfdGFnLCAmaWQzdjJ0YWcpOworCisjaWYgMAorICAvKiBEbyB3ZSB3YW50IHRvIGFkZCBvdXIgb3duIHNpZ25hdHVyZSB0byB0aGUgdGFnIHNvbWV3aGVyZT8gKi8KKyAgeworICAgIGdjaGFyICp0YWdfcHJvZHVjZXJfc3RyOworCisgICAgdGFnX3Byb2R1Y2VyX3N0ciA9IGdfc3RyZHVwX3ByaW50ZiAoIihHU3RyZWFtZXIgaWQzdjJtdXggJXMsIHVzaW5nICIKKyAgICAgICAgInRhZ2xpYiAldS4ldSkiLCBWRVJTSU9OLCBUQUdMSUJfTUFKT1JfVkVSU0lPTiwgVEFHTElCX01JTk9SX1ZFUlNJT04pOworICAgIGFkZF9vbmVfdHh4eF90YWcgKGlkM3YydGFnLCAidGFnX2VuY29kZXIiLCB0YWdfcHJvZHVjZXJfc3RyKTsKKyAgICBnX2ZyZWUgKHRhZ19wcm9kdWNlcl9zdHIpOworICB9CisjZW5kaWYKKworICByZW5kZXJlZF90YWcgPSBpZDN2MnRhZy5yZW5kZXIgKCk7CisgIHRhZ19zaXplID0gcmVuZGVyZWRfdGFnLnNpemUgKCk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKG11eCwgInRhZyBzaXplID0gJWQgYnl0ZXMiLCB0YWdfc2l6ZSk7CisKKyAgLyogQ3JlYXRlIGJ1ZmZlciB3aXRoIHRhZyAqLworICBidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHRhZ19zaXplKTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsIHJlbmRlcmVkX3RhZy5kYXRhICgpLCB0YWdfc2l6ZSk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfaWQzdjJfbXV4X3JlbmRlcl9lbmRfdGFnIChHc3RUYWdNdXggKiBtdXgsIGNvbnN0IEdzdFRhZ0xpc3QgKiB0YWdsaXN0KQoreworICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2V4dC90YWdsaWIvZ3N0aWQzdjJtdXguaCBiL2V4dC90YWdsaWIvZ3N0aWQzdjJtdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmM3NDhmCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qIEdTdHJlYW1lciB0YWdsaWItYmFzZWQgSUQzdjIgbXV4ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBDaHJpc3RvcGhlIEZlcmdlYXUgPHRldWZAZ25vbWUub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBHU1RfSUQzVjJfTVVYX0gKKyNkZWZpbmUgR1NUX0lEM1YyX01VWF9ICisKKyNpbmNsdWRlIDxnc3QvdGFnL2dzdHRhZ211eC5oPgorCitHX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RJZDN2Mk11eCBHc3RJZDN2Mk11eDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RJZDN2Mk11eENsYXNzIEdzdElkM3YyTXV4Q2xhc3M7CisKK3N0cnVjdCBfR3N0SWQzdjJNdXggeworICBHc3RUYWdNdXggIHRhZ211eDsKK307CisKK3N0cnVjdCBfR3N0SWQzdjJNdXhDbGFzcyB7CisgIEdzdFRhZ011eENsYXNzICB0YWdtdXhfY2xhc3M7Cit9OworCisjZGVmaW5lIEdTVF9UWVBFX0lEM1YyX01VWCBcCisgIChnc3RfaWQzdjJfbXV4X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9JRDNWMl9NVVgob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9JRDNWMl9NVVgsR3N0SWQzdjJNdXgpKQorI2RlZmluZSBHU1RfSUQzVjJfTVVYX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0lEM1YyX01VWCxHc3RJZDN2Mk11eENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0lEM1YyX01VWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0lEM1YyX01VWCkpCisjZGVmaW5lIEdTVF9JU19JRDNWMl9NVVhfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfSUQzVjJfTVVYKSkKKworR1R5cGUgZ3N0X2lkM3YyX211eF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBHU1RfSUQzVjJfTVVYX0ggKi8KZGlmZiAtLWdpdCBhL2V4dC90YWdsaWIvZ3N0dGFnbGlicGx1Z2luLmMgYi9leHQvdGFnbGliL2dzdHRhZ2xpYnBsdWdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZTZiZjYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvdGFnbGliL2dzdHRhZ2xpYnBsdWdpbi5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qIEdTdHJlYW1lciB0YWdsaWItYmFzZWQgbXV4ZXIgYmFzZSBjbGFzcworICogQ29weXJpZ2h0IChDKSAyMDA2IENocmlzdG9waGUgRmVyZ2VhdSAgPHRldWZAZ25vbWUub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RhcGV2Mm11eC5oIgorI2luY2x1ZGUgImdzdGlkM3YybXV4LmgiCisKKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImlkM3YybXV4IiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9JRDNWMl9NVVgpIHx8CisgICAgICAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImFwZXYybXV4IiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9BUEVWMl9NVVgpKQorICAgIHJldHVybiBGQUxTRTsKKworICBnc3RfdGFnX3JlZ2lzdGVyX211c2ljYnJhaW56X3RhZ3MgKCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICB0YWdsaWIsCisgICAgIlRhZyB3cml0aW5nIHBsdWctaW4gYmFzZWQgb24gdGFnbGliIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgIkxHUEwiLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pOwpkaWZmIC0tZ2l0IGEvZXh0L3RhZ2xpYi9tZXNvbi5idWlsZCBiL2V4dC90YWdsaWIvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxZjliNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC90YWdsaWIvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwyOCBAQAordGFnbGliX3NvdXJjZXMgPSBbCisgICdnc3RhcGV2Mm11eC5jYycsCisgICdnc3RpZDN2Mm11eC5jYycsCisgICdnc3R0YWdsaWJwbHVnaW4uYycsCitdCisKK3RhZ2xpYl9kZXAgPSBkZXBlbmRlbmN5KCd0YWdsaWInLCB2ZXJzaW9uIDogJz49IDEuNScsIHJlcXVpcmVkIDogZmFsc2UpCisKK2lmIHRhZ2xpYl9kZXAuZm91bmQoKSBhbmQgYWRkX2xhbmd1YWdlcygnY3BwJywgcmVxdWlyZWQgOiBmYWxzZSkKKyAgZXh0cmFfYXJncyA9IFtdCisgIGN4eCA9IG1lc29uLmdldF9jb21waWxlcignY3BwJykKKyAgaWYgY3h4Lmhhc19hcmd1bWVudCgnLWZ2aXNpYmlsaXR5PWhpZGRlbicpCisgICAgZXh0cmFfYXJncyArPSBbJy1mdmlzaWJpbGl0eT1oaWRkZW4nXQorICBlbmRpZgorICBpZiBjeHguaGFzX2FyZ3VtZW50KCctZm5vLXN0cmljdC1hbGlhc2luZycpCisgICAgZXh0cmFfYXJncyArPSBbJy1mbm8tc3RyaWN0LWFsaWFzaW5nJ10KKyAgZW5kaWYKKworICBnc3R0YWdsaWIgPSBsaWJyYXJ5KCdnc3R0YWdsaWInLAorICAgIHRhZ2xpYl9zb3VyY2VzLAorICAgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncyArIFsnLURHU1RfVVNFX1VOU1RBQkxFX0FQSSddLAorICAgIGNwcF9hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzICsgWyctREdTVF9VU0VfVU5TVEFCTEVfQVBJJ10gKyBleHRyYV9hcmdzLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgICBkZXBlbmRlbmNpZXMgOiBbZ3N0dGFnX2RlcCwgdGFnbGliX2RlcF0sCisgICAgaW5zdGFsbCA6IHRydWUsCisgICAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorICApCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L3R3b2xhbWUvTWFrZWZpbGUuYW0gYi9leHQvdHdvbGFtZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjJlZTIwCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3R3b2xhbWUvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMSBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0dHdvbGFtZS5sYQorCitsaWJnc3R0d29sYW1lX2xhX1NPVVJDRVMgPSBnc3R0d29sYW1lbXAyZW5jLmMKK2xpYmdzdHR3b2xhbWVfbGFfQ0ZMQUdTID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykgJChUV09MQU1FX0NGTEFHUykKK2xpYmdzdHR3b2xhbWVfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIFwKKwktbGdzdGF1ZGlvLUBHU1RfQVBJX1ZFUlNJT05AIC1sZ3N0cGJ1dGlscy1AR1NUX0FQSV9WRVJTSU9OQCBcCisJJChHU1RfTElCUykgJChUV09MQU1FX0xJQlMpCitsaWJnc3R0d29sYW1lX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3R0d29sYW1lbXAyZW5jLmgKZGlmZiAtLWdpdCBhL2V4dC90d29sYW1lL2dzdHR3b2xhbWVtcDJlbmMuYyBiL2V4dC90d29sYW1lL2dzdHR3b2xhbWVtcDJlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWJlYzZiCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3R3b2xhbWUvZ3N0dHdvbGFtZW1wMmVuYy5jCkBAIC0wLDAgKzEsODkzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA0PiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorICogQ29weXJpZ2h0IChDKSA8MjAwOD4gU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIEJhc2VkIG9uIHRoZSBsYW1lIGVsZW1lbnQuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtdHdvbGFtZQorICogQHNlZV9hbHNvOiBtYWQsIGxhbWUKKyAqCisgKiBUaGlzIGVsZW1lbnQgZW5jb2RlcyByYXcgaW50ZWdlciBhdWRpbyBpbnRvIGFuIE1QRUctMSBsYXllciAyIChNUDIpIHN0cmVhbS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyB3YXZlPXNpbmUgbnVtLWJ1ZmZlcnM9MTAwICEgYXVkaW9jb252ZXJ0ICEgdHdvbGFtZSAhIGZpbGVzaW5rIGxvY2F0aW9uPXNpbmUubXAyCisgKiBdfCBFbmNvZGUgYSB0ZXN0IHNpbmUgc2lnbmFsIHRvIE1QMi4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBhbHNhc3JjICEgYXVkaW9jb252ZXJ0ICEgdHdvbGFtZSBiaXRyYXRlPTE5MiAhIGZpbGVzaW5rIGxvY2F0aW9uPWFsc2FzcmMubXAyCisgKiBdfCBSZWNvcmQgZnJvbSBhIHNvdW5kIGNhcmQgdXNpbmcgQUxTQSBhbmQgZW5jb2RlIHRvIE1QMgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGZpbGVzcmMgbG9jYXRpb249bXVzaWMud2F2ICEgZGVjb2RlYmluICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIHR3b2xhbWUgYml0cmF0ZT0xOTIgISBpZDN2Mm11eCAhIGZpbGVzaW5rIGxvY2F0aW9uPW11c2ljLm1wMgorICogXXwgVHJhbnNjb2RlIGZyb20gYSAud2F2IGZpbGUgdG8gTVAyICh0aGUgaWQzdjJtdXggZWxlbWVudCBpcyBvcHRpb25hbCkKKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBjZGRhOi8vNSAhIGF1ZGlvY29udmVydCAhIHR3b2xhbWUgYml0cmF0ZT0xOTIgISBmaWxlc2luayBsb2NhdGlvbj10cmFjazUubXAyCisgKiBdfCBFbmNvZGUgQXVkaW8gQ0QgdHJhY2sgNSB0byBNUDIKKyAqIDwvcmVmc2VjdDI+CisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInN0cmluZy5oIgorI2luY2x1ZGUgImdzdHR3b2xhbWVtcDJlbmMuaCIKKyNpbmNsdWRlICJnc3QvZ3N0LWkxOG4tcGx1Z2luLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGRlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGRlYnVnCisKKy8qIFR3b0xBTUUgY2FuIGRvIE1QRUctMSwgTVBFRy0yIHNvIGl0IGhhcyA2IHBvc3NpYmxlCisgKiBzYW1wbGUgcmF0ZXMgaXQgc3VwcG9ydHMgKi8KK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfdHdvX2xhbWVfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgIiBHU1RfQVVESU9fTkUgKEYzMikgIiwgIiBHU1RfQVVESU9fTkUgKFMxNikgIiB9LCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIHsgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDE7ICIKKyAgICAgICAgImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSB7ICIgR1NUX0FVRElPX05FIChGMzIpICIsICIgR1NUX0FVRElPX05FIChTMTYpICIgfSwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSB7IDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAgfSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAyLCIgImNoYW5uZWwtbWFzayA9IChiaXRtYXNrKSAweDMiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfdHdvX2xhbWVfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby9tcGVnLCAiCisgICAgICAgICJtcGVndmVyc2lvbiA9IChpbnQpIDEsICIKKyAgICAgICAgImxheWVyID0gKGludCkgMiwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIHsgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdIikKKyAgICApOworCitzdGF0aWMgc3RydWN0Cit7CisgIGdpbnQgbW9kZTsKKyAgZ2ludCBwc3ltb2RlbDsKKyAgZ2ludCBiaXRyYXRlOworICBnaW50IHBhZGRpbmc7CisgIGdib29sZWFuIGVuZXJneV9sZXZlbF9leHRlbnNpb247CisgIGdpbnQgZW1waGFzaXM7CisgIGdib29sZWFuIGVycm9yX3Byb3RlY3Rpb247CisgIGdib29sZWFuIGNvcHlyaWdodDsKKyAgZ2Jvb2xlYW4gb3JpZ2luYWw7CisgIGdib29sZWFuIHZicjsKKyAgZ2Zsb2F0IHZicl9sZXZlbDsKKyAgZ2Zsb2F0IGF0aF9sZXZlbDsKKyAgZ2ludCB2YnJfbWF4X2JpdHJhdGU7CisgIGdib29sZWFuIHF1aWNrX21vZGU7CisgIGdpbnQgcXVpY2tfbW9kZV9jb3VudDsKK30gZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3M7CisKKy8qKioqKioqKioqIERlZmluZSB1c2VmdWwgdHlwZXMgZm9yIG5vbi1wcm9ncmFtbWF0aWMgaW50ZXJmYWNlcyAqKioqKioqKioqLworI2RlZmluZSBHU1RfVFlQRV9UV09fTEFNRV9NT0RFIChnc3RfdHdvX2xhbWVfbW9kZV9nZXRfdHlwZSgpKQorc3RhdGljIEdUeXBlCitnc3RfdHdvX2xhbWVfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIHR3b19sYW1lX21vZGVfdHlwZSA9IDA7CisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIHR3b19sYW1lX21vZGVzW10gPSB7CisgICAge1RXT0xBTUVfQVVUT19NT0RFLCAiQXV0byIsICJhdXRvIn0sCisgICAge1RXT0xBTUVfU1RFUkVPLCAiU3RlcmVvIiwgInN0ZXJlbyJ9LAorICAgIHtUV09MQU1FX0pPSU5UX1NURVJFTywgIkpvaW50IFN0ZXJlbyIsICJqb2ludCJ9LAorICAgIHtUV09MQU1FX0RVQUxfQ0hBTk5FTCwgIkR1YWwgQ2hhbm5lbCIsICJkdWFsIn0sCisgICAge1RXT0xBTUVfTU9OTywgIk1vbm8iLCAibW9ubyJ9LAorICAgIHswLCBOVUxMLCBOVUxMfQorICB9OworCisgIGlmICghdHdvX2xhbWVfbW9kZV90eXBlKSB7CisgICAgdHdvX2xhbWVfbW9kZV90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFR3b0xhbWVNb2RlIiwgdHdvX2xhbWVfbW9kZXMpOworICB9CisgIHJldHVybiB0d29fbGFtZV9tb2RlX3R5cGU7Cit9CisKKyNkZWZpbmUgR1NUX1RZUEVfVFdPX0xBTUVfUEFERElORyAoZ3N0X3R3b19sYW1lX3BhZGRpbmdfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X3R3b19sYW1lX3BhZGRpbmdfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSB0d29fbGFtZV9wYWRkaW5nX3R5cGUgPSAwOworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSB0d29fbGFtZV9wYWRkaW5nW10gPSB7CisgICAge1RXT0xBTUVfUEFEX05PLCAiTm8gUGFkZGluZyIsICJuZXZlciJ9LAorICAgIHtUV09MQU1FX1BBRF9BTEwsICJBbHdheXMgUGFkIiwgImFsd2F5cyJ9LAorICAgIHswLCBOVUxMLCBOVUxMfQorICB9OworCisgIGlmICghdHdvX2xhbWVfcGFkZGluZ190eXBlKSB7CisgICAgdHdvX2xhbWVfcGFkZGluZ190eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFR3b0xhbWVQYWRkaW5nIiwgdHdvX2xhbWVfcGFkZGluZyk7CisgIH0KKyAgcmV0dXJuIHR3b19sYW1lX3BhZGRpbmdfdHlwZTsKK30KKworI2RlZmluZSBHU1RfVFlQRV9UV09fTEFNRV9FTVBIQVNJUyAoZ3N0X3R3b19sYW1lX2VtcGhhc2lzX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF90d29fbGFtZV9lbXBoYXNpc19nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIHR3b19sYW1lX2VtcGhhc2lzX3R5cGUgPSAwOworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSB0d29fbGFtZV9lbXBoYXNpc1tdID0geworICAgIHtUV09MQU1FX0VNUEhBU0lTX04sICJObyBlbXBoYXNpcyIsICJub25lIn0sCisgICAge1RXT0xBTUVfRU1QSEFTSVNfNSwgIjUwLzE1IG1zIiwgIjUifSwKKyAgICB7VFdPTEFNRV9FTVBIQVNJU19DLCAiQ0NJVCBKLjE3IiwgImNjaXQifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0KKyAgfTsKKworICBpZiAoIXR3b19sYW1lX2VtcGhhc2lzX3R5cGUpIHsKKyAgICB0d29fbGFtZV9lbXBoYXNpc190eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFR3b0xhbWVFbXBoYXNpcyIsIHR3b19sYW1lX2VtcGhhc2lzKTsKKyAgfQorCisgIHJldHVybiB0d29fbGFtZV9lbXBoYXNpc190eXBlOworfQorCisvKioqKioqKioqKiBTdGFuZGFyZCBzdHVmZiBmb3Igc2lnbmFscyBhbmQgYXJndW1lbnRzICoqKioqKioqKiovCisKK2VudW0KK3sKKyAgQVJHXzAsCisgIEFSR19NT0RFLAorICBBUkdfUFNZTU9ERUwsCisgIEFSR19CSVRSQVRFLAorICBBUkdfUEFERElORywKKyAgQVJHX0VORVJHWV9MRVZFTF9FWFRFTlNJT04sCisgIEFSR19FTVBIQVNJUywKKyAgQVJHX0VSUk9SX1BST1RFQ1RJT04sCisgIEFSR19DT1BZUklHSFQsCisgIEFSR19PUklHSU5BTCwKKyAgQVJHX1ZCUiwKKyAgQVJHX1ZCUl9MRVZFTCwKKyAgQVJHX0FUSF9MRVZFTCwKKyAgQVJHX1ZCUl9NQVhfQklUUkFURSwKKyAgQVJHX1FVSUNLX01PREUsCisgIEFSR19RVUlDS19NT0RFX0NPVU5UCit9OworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3R3b19sYW1lX3N0YXJ0IChHc3RBdWRpb0VuY29kZXIgKiBlbmMpOworc3RhdGljIGdib29sZWFuIGdzdF90d29fbGFtZV9zdG9wIChHc3RBdWRpb0VuY29kZXIgKiBlbmMpOworc3RhdGljIGdib29sZWFuIGdzdF90d29fbGFtZV9zZXRfZm9ybWF0IChHc3RBdWRpb0VuY29kZXIgKiBlbmMsCisgICAgR3N0QXVkaW9JbmZvICogaW5mbyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfdHdvX2xhbWVfaGFuZGxlX2ZyYW1lIChHc3RBdWRpb0VuY29kZXIgKiBlbmMsCisgICAgR3N0QnVmZmVyICogaW5fYnVmKTsKK3N0YXRpYyB2b2lkIGdzdF90d29fbGFtZV9mbHVzaCAoR3N0QXVkaW9FbmNvZGVyICogZW5jKTsKKworc3RhdGljIHZvaWQgZ3N0X3R3b19sYW1lX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF90d29fbGFtZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3R3b19sYW1lX3NldHVwIChHc3RUd29MYW1lICogdHdvbGFtZSk7CisKK0dfREVGSU5FX1RZUEUgKEdzdFR3b0xhbWUsIGdzdF90d29fbGFtZSwgR1NUX1RZUEVfQVVESU9fRU5DT0RFUik7CisKK3N0YXRpYyB2b2lkCitnc3RfdHdvX2xhbWVfcmVsZWFzZV9tZW1vcnkgKEdzdFR3b0xhbWUgKiB0d29sYW1lKQoreworICBpZiAodHdvbGFtZS0+Z2xvcHRzKSB7CisgICAgdHdvbGFtZV9jbG9zZSAoJnR3b2xhbWUtPmdsb3B0cyk7CisgICAgdHdvbGFtZS0+Z2xvcHRzID0gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3R3b19sYW1lX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqKQoreworICBnc3RfdHdvX2xhbWVfcmVsZWFzZV9tZW1vcnkgKEdTVF9UV09fTEFNRSAob2JqKSk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKGdzdF90d29fbGFtZV9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF90d29fbGFtZV9jbGFzc19pbml0IChHc3RUd29MYW1lQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RBdWRpb0VuY29kZXJDbGFzcyAqZ3N0YmFzZV9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YmFzZV9jbGFzcyA9IChHc3RBdWRpb0VuY29kZXJDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdHdvX2xhbWVfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfdHdvX2xhbWVfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF90d29fbGFtZV9maW5hbGl6ZTsKKworICBnc3RiYXNlX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdHdvX2xhbWVfc3RhcnQpOworICBnc3RiYXNlX2NsYXNzLT5zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF90d29fbGFtZV9zdG9wKTsKKyAgZ3N0YmFzZV9jbGFzcy0+c2V0X2Zvcm1hdCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdHdvX2xhbWVfc2V0X2Zvcm1hdCk7CisgIGdzdGJhc2VfY2xhc3MtPmhhbmRsZV9mcmFtZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdHdvX2xhbWVfaGFuZGxlX2ZyYW1lKTsKKyAgZ3N0YmFzZV9jbGFzcy0+Zmx1c2ggPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3R3b19sYW1lX2ZsdXNoKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBBUkdfTU9ERSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgibW9kZSIsICJNb2RlIiwgIkVuY29kaW5nIG1vZGUiLAorICAgICAgICAgIEdTVF9UWVBFX1RXT19MQU1FX01PREUsIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLm1vZGUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX1BTWU1PREVMLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInBzeW1vZGVsIiwgIlBzeWNob2Fjb3VzdGljIE1vZGVsIiwKKyAgICAgICAgICAiUHN5Y2hvYWNvdXN0aWMgbW9kZWwgdXNlZCB0byBlbmNvZGUgdGhlIGF1ZGlvIiwKKyAgICAgICAgICAtMSwgNCwgZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MucHN5bW9kZWwsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX0JJVFJBVEUsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiYml0cmF0ZSIsICJCaXRyYXRlIChrYi9zKSIsCisgICAgICAgICAgIkJpdHJhdGUgaW4ga2JpdC9zZWMgKDgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsICIKKyAgICAgICAgICAiMTEyLCAxMjgsIDE0NCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAsIDM4NCkiLAorICAgICAgICAgIDgsIDM4NCwgZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MuYml0cmF0ZSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBBUkdfUEFERElORywKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgicGFkZGluZyIsICJQYWRkaW5nIiwgIlBhZGRpbmcgdHlwZSIsCisgICAgICAgICAgR1NUX1RZUEVfVFdPX0xBTUVfUEFERElORywgZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MucGFkZGluZywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLAorICAgICAgQVJHX0VORVJHWV9MRVZFTF9FWFRFTlNJT04sCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImVuZXJneS1sZXZlbC1leHRlbnNpb24iLCAiRW5lcmd5IExldmVsIEV4dGVuc2lvbiIsCisgICAgICAgICAgIldyaXRlIHBlYWsgUENNIGxldmVsIHRvIGVhY2ggZnJhbWUiLAorICAgICAgICAgIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLmVuZXJneV9sZXZlbF9leHRlbnNpb24sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX0VNUEhBU0lTLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJlbXBoYXNpcyIsICJFbXBoYXNpcyIsCisgICAgICAgICAgIlByZS1lbXBoYXNpcyB0byBhcHBseSB0byB0aGUgZGVjb2RlZCBhdWRpbyIsCisgICAgICAgICAgR1NUX1RZUEVfVFdPX0xBTUVfRU1QSEFTSVMsIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLmVtcGhhc2lzLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19FUlJPUl9QUk9URUNUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJlcnJvci1wcm90ZWN0aW9uIiwgIkVycm9yIHByb3RlY3Rpb24iLAorICAgICAgICAgICJBZGRzIGNoZWNrc3VtIHRvIGV2ZXJ5IGZyYW1lIiwKKyAgICAgICAgICBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy5lcnJvcl9wcm90ZWN0aW9uLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19DT1BZUklHSFQsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImNvcHlyaWdodCIsICJDb3B5cmlnaHQiLCAiTWFyayBhcyBjb3B5cmlnaHQiLAorICAgICAgICAgIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLmNvcHlyaWdodCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBBUkdfT1JJR0lOQUwsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoIm9yaWdpbmFsIiwgIk9yaWdpbmFsIiwgIk1hcmsgYXMgb3JpZ2luYWwiLAorICAgICAgICAgIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLm9yaWdpbmFsLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19WQlIsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInZiciIsICJWQlIiLCAiRW5hYmxlIHZhcmlhYmxlIGJpdHJhdGUgbW9kZSIsCisgICAgICAgICAgZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MudmJyLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19WQlJfTEVWRUwsCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJ2YnItbGV2ZWwiLCAiVkJSIExldmVsIiwgIlZCUiBMZXZlbCIsCisgICAgICAgICAgLTEwLjAsIDEwLjAsIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLnZicl9sZXZlbCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBBUkdfQVRIX0xFVkVMLAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgiYXRoLWxldmVsIiwgIkFUSCBMZXZlbCIsICJBVEggTGV2ZWwgaW4gZEIiLAorICAgICAgICAgIC1HX01BWEZMT0FULCBHX01BWEZMT0FULCBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy5hdGhfbGV2ZWwsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX1ZCUl9NQVhfQklUUkFURSwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ2YnItbWF4LWJpdHJhdGUiLCAiVkJSIG1heCBiaXRyYXRlIiwKKyAgICAgICAgICAiU3BlY2lmeSBtYXhpbXVtIFZCUiBiaXRyYXRlICgwPW9mZiwgOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgIgorICAgICAgICAgICIxMTIsIDEyOCwgMTQ0LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMCwgMzg0KSIsCisgICAgICAgICAgMCwgMzg0LCBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy52YnJfbWF4X2JpdHJhdGUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX1FVSUNLX01PREUsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInF1aWNrLW1vZGUiLCAiUXVpY2sgbW9kZSIsCisgICAgICAgICAgIkNhbGN1bGF0ZSBQc3ltb2RlbCBldmVyeSBmcmFtZXMiLAorICAgICAgICAgIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLnF1aWNrX21vZGUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX1FVSUNLX01PREVfQ09VTlQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicXVpY2stbW9kZS1jb3VudCIsICJRdWljayBtb2RlIGNvdW50IiwKKyAgICAgICAgICAiQ2FsY3VsYXRlIFBzeW1vZGVsIGV2ZXJ5IG4gZnJhbWVzIiwKKyAgICAgICAgICAwLCBHX01BWElOVCwgZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MucXVpY2tfbW9kZV9jb3VudCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKSwKKyAgICAgICZnc3RfdHdvX2xhbWVfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyksCisgICAgICAmZ3N0X3R3b19sYW1lX3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyksCisgICAgICAiVHdvTEFNRSBtcDIgZW5jb2RlciIsICJDb2RlYy9FbmNvZGVyL0F1ZGlvIiwKKyAgICAgICJIaWdoLXF1YWxpdHkgZnJlZSBNUDIgZW5jb2RlciIsCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+Iik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3R3b19sYW1lX3NldF9mb3JtYXQgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYywgR3N0QXVkaW9JbmZvICogaW5mbykKK3sKKyAgR3N0VHdvTGFtZSAqdHdvbGFtZTsKKyAgZ2ludCBvdXRfc2FtcGxlcmF0ZTsKKyAgZ2ludCB2ZXJzaW9uOworICBHc3RDYXBzICpvdGhlcmNhcHM7CisKKyAgdHdvbGFtZSA9IEdTVF9UV09fTEFNRSAoZW5jKTsKKworICAvKiBwYXJhbWV0ZXJzIGFscmVhZHkgcGFyc2VkIGZvciB1cyAqLworICB0d29sYW1lLT5zYW1wbGVyYXRlID0gR1NUX0FVRElPX0lORk9fUkFURSAoaW5mbyk7CisgIHR3b2xhbWUtPm51bV9jaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTIChpbmZvKTsKKyAgdHdvbGFtZS0+ZmxvYXRfaW5wdXQgPSAhR1NUX0FVRElPX0lORk9fSVNfSU5URUdFUiAoaW5mbyk7CisKKyAgLyogYnV0IHdlIG1pZ2h0IGJlIGFza2VkIHRvIHJlY29uZmlndXJlLCBzbyByZXNldCAqLworICBnc3RfdHdvX2xhbWVfcmVsZWFzZV9tZW1vcnkgKHR3b2xhbWUpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHR3b2xhbWUsICJzZXR0aW5nIHVwIHR3b2xhbWUiKTsKKyAgaWYgKCFnc3RfdHdvX2xhbWVfc2V0dXAgKHR3b2xhbWUpKQorICAgIGdvdG8gc2V0dXBfZmFpbGVkOworCisgIG91dF9zYW1wbGVyYXRlID0gdHdvbGFtZV9nZXRfb3V0X3NhbXBsZXJhdGUgKHR3b2xhbWUtPmdsb3B0cyk7CisgIGlmIChvdXRfc2FtcGxlcmF0ZSA9PSAwKQorICAgIGdvdG8gemVyb19vdXRwdXRfcmF0ZTsKKworICBpZiAob3V0X3NhbXBsZXJhdGUgIT0gdHdvbGFtZS0+c2FtcGxlcmF0ZSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodHdvbGFtZSwKKyAgICAgICAgIm91dHB1dCBzYW1wbGVyYXRlICVkIGlzIGRpZmZlcmVudCBmcm9tIGluY29taW5nIHNhbXBsZXJhdGUgJWQiLAorICAgICAgICBvdXRfc2FtcGxlcmF0ZSwgdHdvbGFtZS0+c2FtcGxlcmF0ZSk7CisgIH0KKworICB2ZXJzaW9uID0gdHdvbGFtZV9nZXRfdmVyc2lvbiAodHdvbGFtZS0+Z2xvcHRzKTsKKyAgaWYgKHZlcnNpb24gPT0gVFdPTEFNRV9NUEVHMikKKyAgICB2ZXJzaW9uID0gMjsKKyAgZWxzZQorICAgIHZlcnNpb24gPSAxOworCisgIG90aGVyY2FwcyA9CisgICAgICBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8vbXBlZyIsCisgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAxLAorICAgICAgIm1wZWdhdWRpb3ZlcnNpb24iLCBHX1RZUEVfSU5ULCB2ZXJzaW9uLAorICAgICAgImxheWVyIiwgR19UWVBFX0lOVCwgMiwKKyAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsCisgICAgICB0d29sYW1lLT5tb2RlID09IFRXT0xBTUVfTU9OTyA/IDEgOiB0d29sYW1lLT5udW1fY2hhbm5lbHMsICJyYXRlIiwKKyAgICAgIEdfVFlQRV9JTlQsIG91dF9zYW1wbGVyYXRlLCBOVUxMKTsKKworICAvKiBhbmQgdXNlIHRoZXNlIGNhcHMgKi8KKyAgZ3N0X2F1ZGlvX2VuY29kZXJfc2V0X291dHB1dF9mb3JtYXQgKEdTVF9BVURJT19FTkNPREVSICh0d29sYW1lKSwgb3RoZXJjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKG90aGVyY2Fwcyk7CisKKyAgLyogcmVwb3J0IG5lZWRzIHRvIGJhc2UgY2xhc3M6CisgICAqIGhhbmQgb25lIGZyYW1lIGF0IGEgdGltZSwgaWYgd2UgYXJlIHByZXR0eSBzdXJlIHdoYXQgYSBmcmFtZSBpcyAqLworICBpZiAob3V0X3NhbXBsZXJhdGUgPT0gdHdvbGFtZS0+c2FtcGxlcmF0ZSkgeworICAgIGdzdF9hdWRpb19lbmNvZGVyX3NldF9mcmFtZV9zYW1wbGVzX21pbiAoZW5jLCAxMTUyKTsKKyAgICBnc3RfYXVkaW9fZW5jb2Rlcl9zZXRfZnJhbWVfc2FtcGxlc19tYXggKGVuYywgMTE1Mik7CisgICAgZ3N0X2F1ZGlvX2VuY29kZXJfc2V0X2ZyYW1lX21heCAoZW5jLCAxKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworCit6ZXJvX291dHB1dF9yYXRlOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHR3b2xhbWUsIExJQlJBUlksIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgiVHdvTEFNRSBkZWNpZGVkIG9uIGEgemVybyBzYW1wbGUgcmF0ZSIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3NldHVwX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh0d29sYW1lLCBMSUJSQVJZLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIkZhaWxlZCB0byBjb25maWd1cmUgVHdvTEFNRSBlbmNvZGVyLiBDaGVjayB5b3VyIGVuY29kaW5nIHBhcmFtZXRlcnMuIikpLCAoTlVMTCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3R3b19sYW1lX2luaXQgKEdzdFR3b0xhbWUgKiB0d29sYW1lKQoreworICBHU1RfREVCVUdfT0JKRUNUICh0d29sYW1lLCAic3RhcnRpbmcgaW5pdGlhbGl6YXRpb24iKTsKKworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9BVURJT19FTkNPREVSX1NJTktfUEFEICh0d29sYW1lKSk7CisKKyAgdHdvbGFtZS0+bW9kZSA9IGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLm1vZGU7CisgIHR3b2xhbWUtPnBzeW1vZGVsID0gZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MucHN5bW9kZWw7CisgIHR3b2xhbWUtPmJpdHJhdGUgPSBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy5iaXRyYXRlOworICB0d29sYW1lLT5wYWRkaW5nID0gZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MucGFkZGluZzsKKyAgdHdvbGFtZS0+ZW5lcmd5X2xldmVsX2V4dGVuc2lvbiA9CisgICAgICBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy5lbmVyZ3lfbGV2ZWxfZXh0ZW5zaW9uOworICB0d29sYW1lLT5lbXBoYXNpcyA9IGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLmVtcGhhc2lzOworICB0d29sYW1lLT5lcnJvcl9wcm90ZWN0aW9uID0gZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MuZXJyb3JfcHJvdGVjdGlvbjsKKyAgdHdvbGFtZS0+Y29weXJpZ2h0ID0gZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MuY29weXJpZ2h0OworICB0d29sYW1lLT5vcmlnaW5hbCA9IGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLm9yaWdpbmFsOworICB0d29sYW1lLT52YnIgPSBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy52YnI7CisgIHR3b2xhbWUtPnZicl9sZXZlbCA9IGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLnZicl9sZXZlbDsKKyAgdHdvbGFtZS0+YXRoX2xldmVsID0gZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MuYXRoX2xldmVsOworICB0d29sYW1lLT52YnJfbWF4X2JpdHJhdGUgPSBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy52YnJfbWF4X2JpdHJhdGU7CisgIHR3b2xhbWUtPnF1aWNrX21vZGUgPSBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy5xdWlja19tb2RlOworICB0d29sYW1lLT5xdWlja19tb2RlX2NvdW50ID0gZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MucXVpY2tfbW9kZV9jb3VudDsKKworICBHU1RfREVCVUdfT0JKRUNUICh0d29sYW1lLCAiZG9uZSBpbml0aWFsaXppbmciKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdHdvX2xhbWVfc3RhcnQgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYykKK3sKKyAgR3N0VHdvTGFtZSAqdHdvbGFtZSA9IEdTVF9UV09fTEFNRSAoZW5jKTsKKworICBHU1RfREVCVUdfT0JKRUNUICh0d29sYW1lLCAic3RhcnQiKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3R3b19sYW1lX3N0b3AgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYykKK3sKKyAgR3N0VHdvTGFtZSAqdHdvbGFtZSA9IEdTVF9UV09fTEFNRSAoZW5jKTsKKworICBHU1RfREVCVUdfT0JKRUNUICh0d29sYW1lLCAic3RvcCIpOworCisgIGdzdF90d29fbGFtZV9yZWxlYXNlX21lbW9yeSAodHdvbGFtZSk7CisgIHJldHVybiBUUlVFOworfQorCisvKiA8cGhwLWVtdWxhdGlvbi1tb2RlPnRocmVlIHVuZGVyc2NvcmVzIGZvciBfX19yYXRlIGlzIHJlYWxseSByZWFsbHkgcmVhbGx5CisgKiBwcml2YXRlIGFzIG9wcG9zZWQgdG8gb25lIHVuZGVyc2NvcmU8cGhwLWVtdWxhdGlvbi1tb2RlPiAqLworLyogY2FsbCB0aGlzIE1BQ1JPIG91dHNpZGUgb2YgdGhlIE5VTEwgc3RhdGUgc28gdGhhdCB3ZSBoYXZlIGEgaGlnaGVyIGNoYW5jZQorICogb2YgYWN0dWFsbHkgaGF2aW5nIGEgcGlwZWxpbmUgYW5kIGJ1cyB0byBnZXQgdGhlIG1lc3NhZ2UgdGhyb3VnaCAqLworCisjZGVmaW5lIENIRUNLX0FORF9GSVhVUF9CSVRSQVRFKG9iaixwYXJhbSxyYXRlKSAgICAgICAgIAkJICBcCitHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ2ludCBfX19yYXRlID0gcmF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnaW50IG1heHJhdGUgPSAzMjA7CQkJCQkJCSAgXAorICBnaW50IG11bHRpcGxpZXIgPSA2NDsJCQkJCQkJICBcCisgIGlmIChyYXRlIDw9IDY0KSB7CQkJCQkJCSAgXAorICAgIG1heHJhdGUgPSA2NDsgbXVsdGlwbGllciA9IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChyYXRlICUgOCkgIT0gMCkgX19fcmF0ZSA9IEdTVF9ST1VORF9VUF84IChyYXRlKTsgCQkgIFwKKyAgfSBlbHNlIGlmIChyYXRlIDw9IDE0NCkgewkJCQkJCSAgXAorICAgIG1heHJhdGUgPSAxNDQ7IG11bHRpcGxpZXIgPSAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChyYXRlICUgMTYpICE9IDApIF9fX3JhdGUgPSBHU1RfUk9VTkRfVVBfMTYgKHJhdGUpOyAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIGlmIChyYXRlIDw9IDI1NikgewkJCQkJCSAgXAorICAgIG1heHJhdGUgPSAyNTY7IG11bHRpcGxpZXIgPSAzMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChyYXRlICUgMzIpICE9IDApIF9fX3JhdGUgPSBHU1RfUk9VTkRfVVBfMzIgKHJhdGUpOyAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIGlmIChyYXRlIDw9IDM4NCkgeyAJCQkJCQkgIFwKKyAgICBtYXhyYXRlID0gMzg0OyBtdWx0aXBsaWVyID0gNjQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgocmF0ZSAlIDY0KSAhPSAwKSBfX19yYXRlID0gR1NUX1JPVU5EX1VQXzY0IChyYXRlKTsgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKF9fX3JhdGUgIT0gcmF0ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKG9iaiwgTElCUkFSWSwgU0VUVElOR1MsCQkJICBcCisgICAgICAgIChfKCJUaGUgcmVxdWVzdGVkIGJpdHJhdGUgJWQga2JpdC9zIGZvciBwcm9wZXJ0eSAnJXMnICIgICAgICAgICAgIFwKKyAgICAgICAgICAgImlzIG5vdCBhbGxvd2VkLiAiICAJCQkJCSAgICAgICAgICBcCisgICAgICAgICAgICJUaGUgYml0cmF0ZSB3YXMgY2hhbmdlZCB0byAlZCBrYml0L3MuIiksIHJhdGUsCQkgIFwKKyAgICAgICAgIHBhcmFtLCAgX19fcmF0ZSksIAkJCQkJICAgICAgICAgIFwKKyAgICAgICAgKCJBIGJpdHJhdGUgYmVsb3cgJWQgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgJWQuIiwgCQkgIFwKKyAgICAgICAgICAgIG1heHJhdGUsIG11bHRpcGxpZXIpKTsJCSAgCQkJICBcCisgICAgcmF0ZSA9IF9fX3JhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSBHX1NUTVRfRU5ECisKK3N0YXRpYyB2b2lkCitnc3RfdHdvX2xhbWVfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFR3b0xhbWUgKnR3b2xhbWUgPSBHU1RfVFdPX0xBTUUgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBBUkdfTU9ERToKKyAgICAgIHR3b2xhbWUtPm1vZGUgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19QU1lNT0RFTDoKKyAgICAgIHR3b2xhbWUtPnBzeW1vZGVsID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19CSVRSQVRFOgorICAgICAgdHdvbGFtZS0+Yml0cmF0ZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfUEFERElORzoKKyAgICAgIHR3b2xhbWUtPnBhZGRpbmcgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19FTkVSR1lfTEVWRUxfRVhURU5TSU9OOgorICAgICAgdHdvbGFtZS0+ZW5lcmd5X2xldmVsX2V4dGVuc2lvbiA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0VNUEhBU0lTOgorICAgICAgdHdvbGFtZS0+ZW1waGFzaXMgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19FUlJPUl9QUk9URUNUSU9OOgorICAgICAgdHdvbGFtZS0+ZXJyb3JfcHJvdGVjdGlvbiA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0NPUFlSSUdIVDoKKyAgICAgIHR3b2xhbWUtPmNvcHlyaWdodCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX09SSUdJTkFMOgorICAgICAgdHdvbGFtZS0+b3JpZ2luYWwgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19WQlI6CisgICAgICB0d29sYW1lLT52YnIgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19WQlJfTEVWRUw6CisgICAgICB0d29sYW1lLT52YnJfbGV2ZWwgPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfQVRIX0xFVkVMOgorICAgICAgdHdvbGFtZS0+YXRoX2xldmVsID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX1ZCUl9NQVhfQklUUkFURToKKyAgICAgIHR3b2xhbWUtPnZicl9tYXhfYml0cmF0ZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfUVVJQ0tfTU9ERToKKyAgICAgIHR3b2xhbWUtPnF1aWNrX21vZGUgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19RVUlDS19NT0RFX0NPVU5UOgorICAgICAgdHdvbGFtZS0+cXVpY2tfbW9kZV9jb3VudCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3R3b19sYW1lX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RUd29MYW1lICp0d29sYW1lID0gR1NUX1RXT19MQU1FIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgQVJHX01PREU6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgdHdvbGFtZS0+bW9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19QU1lNT0RFTDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHR3b2xhbWUtPnBzeW1vZGVsKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0JJVFJBVEU6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB0d29sYW1lLT5iaXRyYXRlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX1BBRERJTkc6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgdHdvbGFtZS0+cGFkZGluZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19FTkVSR1lfTEVWRUxfRVhURU5TSU9OOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHR3b2xhbWUtPmVuZXJneV9sZXZlbF9leHRlbnNpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfRU1QSEFTSVM6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgdHdvbGFtZS0+ZW1waGFzaXMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfRVJST1JfUFJPVEVDVElPTjoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCB0d29sYW1lLT5lcnJvcl9wcm90ZWN0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0NPUFlSSUdIVDoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCB0d29sYW1lLT5jb3B5cmlnaHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfT1JJR0lOQUw6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgdHdvbGFtZS0+b3JpZ2luYWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfVkJSOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHR3b2xhbWUtPnZicik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19WQlJfTEVWRUw6CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIHR3b2xhbWUtPnZicl9sZXZlbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19BVEhfTEVWRUw6CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIHR3b2xhbWUtPmF0aF9sZXZlbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19WQlJfTUFYX0JJVFJBVEU6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB0d29sYW1lLT52YnJfbWF4X2JpdHJhdGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfUVVJQ0tfTU9ERToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCB0d29sYW1lLT5xdWlja19tb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX1FVSUNLX01PREVfQ09VTlQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB0d29sYW1lLT5xdWlja19tb2RlX2NvdW50KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF90d29fbGFtZV9mbHVzaF9mdWxsIChHc3RUd29MYW1lICogbGFtZSwgZ2Jvb2xlYW4gcHVzaCkKK3sKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdE1hcEluZm8gbWFwOworICBnaW50IHNpemU7CisgIEdzdEZsb3dSZXR1cm4gcmVzdWx0ID0gR1NUX0ZMT1dfT0s7CisKKyAgaWYgKCFsYW1lLT5nbG9wdHMpCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTYzODQpOworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgc2l6ZSA9IHR3b2xhbWVfZW5jb2RlX2ZsdXNoIChsYW1lLT5nbG9wdHMsIG1hcC5kYXRhLCAxNjM4NCk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgaWYgKHNpemUgPiAwICYmIHB1c2gpIHsKKyAgICBnc3RfYnVmZmVyX3NldF9zaXplIChidWYsIHNpemUpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGxhbWUsICJwdXNoaW5nIGZpbmFsIHBhY2tldCBvZiAldSBieXRlcyIsIHNpemUpOworICAgIHJlc3VsdCA9IGdzdF9hdWRpb19lbmNvZGVyX2ZpbmlzaF9mcmFtZSAoR1NUX0FVRElPX0VOQ09ERVIgKGxhbWUpLCBidWYsIC0xKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChsYW1lLCAibm8gZmluYWwgcGFja2V0IChzaXplPSVkLCBwdXNoPSVkKSIsIHNpemUsIHB1c2gpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmVzdWx0ID0gR1NUX0ZMT1dfT0s7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2dzdF90d29fbGFtZV9mbHVzaCAoR3N0QXVkaW9FbmNvZGVyICogZW5jKQoreworICBnc3RfdHdvX2xhbWVfZmx1c2hfZnVsbCAoR1NUX1RXT19MQU1FIChlbmMpLCBGQUxTRSk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdHdvX2xhbWVfaGFuZGxlX2ZyYW1lIChHc3RBdWRpb0VuY29kZXIgKiBlbmMsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0VHdvTGFtZSAqdHdvbGFtZTsKKyAgZ2ludCBtcDNfYnVmZmVyX3NpemUsIG1wM19zaXplOworICBHc3RCdWZmZXIgKm1wM19idWY7CisgIEdzdEZsb3dSZXR1cm4gcmVzdWx0OworICBnaW50IG51bV9zYW1wbGVzOworICBHc3RNYXBJbmZvIG1hcCwgbXAzX21hcDsKKworICB0d29sYW1lID0gR1NUX1RXT19MQU1FIChlbmMpOworCisgIC8qIHNxdWVlemUgcmVtYWluaW5nIGFuZCBwdXNoICovCisgIGlmIChHX1VOTElLRUxZIChidWYgPT0gTlVMTCkpCisgICAgcmV0dXJuIGdzdF90d29fbGFtZV9mbHVzaF9mdWxsICh0d29sYW1lLCBUUlVFKTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIGlmICh0d29sYW1lLT5mbG9hdF9pbnB1dCkKKyAgICBudW1fc2FtcGxlcyA9IG1hcC5zaXplIC8gNDsKKyAgZWxzZQorICAgIG51bV9zYW1wbGVzID0gbWFwLnNpemUgLyAyOworCisgIC8qIGFsbG9jYXRlIHNwYWNlIGZvciBvdXRwdXQgKi8KKyAgbXAzX2J1ZmZlcl9zaXplID0gMS4yNSAqIG51bV9zYW1wbGVzICsgMTYzODQ7CisgIG1wM19idWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG1wM19idWZmZXJfc2l6ZSk7CisgIGdzdF9idWZmZXJfbWFwIChtcDNfYnVmLCAmbXAzX21hcCwgR1NUX01BUF9XUklURSk7CisKKyAgaWYgKHR3b2xhbWUtPm51bV9jaGFubmVscyA9PSAxKSB7CisgICAgaWYgKHR3b2xhbWUtPmZsb2F0X2lucHV0KQorICAgICAgbXAzX3NpemUgPSB0d29sYW1lX2VuY29kZV9idWZmZXJfZmxvYXQzMiAodHdvbGFtZS0+Z2xvcHRzLAorICAgICAgICAgIChmbG9hdCAqKSBtYXAuZGF0YSwKKyAgICAgICAgICAoZmxvYXQgKikgbWFwLmRhdGEsIG51bV9zYW1wbGVzLCBtcDNfbWFwLmRhdGEsIG1wM19idWZmZXJfc2l6ZSk7CisgICAgZWxzZQorICAgICAgbXAzX3NpemUgPSB0d29sYW1lX2VuY29kZV9idWZmZXIgKHR3b2xhbWUtPmdsb3B0cywKKyAgICAgICAgICAoc2hvcnQgaW50ICopIG1hcC5kYXRhLAorICAgICAgICAgIChzaG9ydCBpbnQgKikgbWFwLmRhdGEsIG51bV9zYW1wbGVzLCBtcDNfbWFwLmRhdGEsIG1wM19idWZmZXJfc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgaWYgKHR3b2xhbWUtPmZsb2F0X2lucHV0KQorICAgICAgbXAzX3NpemUgPSB0d29sYW1lX2VuY29kZV9idWZmZXJfZmxvYXQzMl9pbnRlcmxlYXZlZCAodHdvbGFtZS0+Z2xvcHRzLAorICAgICAgICAgIChmbG9hdCAqKSBtYXAuZGF0YSwKKyAgICAgICAgICBudW1fc2FtcGxlcyAvIHR3b2xhbWUtPm51bV9jaGFubmVscywgbXAzX21hcC5kYXRhLCBtcDNfYnVmZmVyX3NpemUpOworICAgIGVsc2UKKyAgICAgIG1wM19zaXplID0gdHdvbGFtZV9lbmNvZGVfYnVmZmVyX2ludGVybGVhdmVkICh0d29sYW1lLT5nbG9wdHMsCisgICAgICAgICAgKHNob3J0IGludCAqKSBtYXAuZGF0YSwKKyAgICAgICAgICBudW1fc2FtcGxlcyAvIHR3b2xhbWUtPm51bV9jaGFubmVscywgbXAzX21hcC5kYXRhLCBtcDNfYnVmZmVyX3NpemUpOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHR3b2xhbWUsICJlbmNvZGVkICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMgb2YgYXVkaW8gIgorICAgICAgInRvICVkIGJ5dGVzIG9mIG1wMyIsIG1hcC5zaXplLCBtcDNfc2l6ZSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAobXAzX2J1ZiwgJm1wM19tYXApOworCisgIGlmIChtcDNfc2l6ZSA+IDApIHsKKyAgICBnc3RfYnVmZmVyX3NldF9zaXplIChtcDNfYnVmLCBtcDNfc2l6ZSk7CisgICAgcmVzdWx0ID0gZ3N0X2F1ZGlvX2VuY29kZXJfZmluaXNoX2ZyYW1lIChlbmMsIG1wM19idWYsIC0xKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAobXAzX3NpemUgPCAwKSB7CisgICAgICAvKiBlYXQgZXJyb3IgPyAqLworICAgICAgZ193YXJuaW5nICgiZXJyb3IgJWQiLCBtcDNfc2l6ZSk7CisgICAgfQorICAgIGdzdF9idWZmZXJfdW5yZWYgKG1wM19idWYpOworICAgIHJlc3VsdCA9IEdTVF9GTE9XX09LOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogc2V0IHVwIHRoZSBlbmNvZGVyIHN0YXRlICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF90d29fbGFtZV9zZXR1cCAoR3N0VHdvTGFtZSAqIHR3b2xhbWUpCit7CisKKyNkZWZpbmUgQ0hFQ0tfRVJST1IoY29tbWFuZCkgR19TVE1UX1NUQVJUIHtcCisgIGlmICgoY29tbWFuZCkgPCAwKSB7IFwKKyAgICBHU1RfRVJST1JfT0JKRUNUICh0d29sYW1lLCAic2V0dXAgZmFpbGVkOiAiIEdfU1RSSU5HSUZZIChjb21tYW5kKSk7IFwKKyAgICByZXR1cm4gRkFMU0U7IFwKKyAgfSBcCit9R19TVE1UX0VORAorCisgIGludCByZXR2YWw7CisgIEdzdENhcHMgKmFsbG93ZWRfY2FwczsKKworICBHU1RfREVCVUdfT0JKRUNUICh0d29sYW1lLCAic3RhcnRpbmcgc2V0dXAiKTsKKworICAvKiBjaGVjayBpZiB3ZSdyZSBhbHJlYWR5IHNldHVwOyBpZiB3ZSBhcmUsIHdlIG1pZ2h0IHdhbnQgdG8gY2hlY2sKKyAgICogaWYgdGhpcyBpbml0aWFsaXphdGlvbiBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHByZXZpb3VzIG9uZSAqLworICAvKiBGSVhNRTogZG8gdGhpcyAqLworICBpZiAodHdvbGFtZS0+c2V0dXApIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHR3b2xhbWUsICJhbHJlYWR5IHNldHVwIik7CisgICAgdHdvbGFtZS0+c2V0dXAgPSBGQUxTRTsKKyAgfQorCisgIHR3b2xhbWUtPmdsb3B0cyA9IHR3b2xhbWVfaW5pdCAoKTsKKworICBpZiAodHdvbGFtZS0+Z2xvcHRzID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIGNvcHkgdGhlIHBhcmFtZXRlcnMgb3ZlciAqLworICB0d29sYW1lX3NldF9pbl9zYW1wbGVyYXRlICh0d29sYW1lLT5nbG9wdHMsIHR3b2xhbWUtPnNhbXBsZXJhdGUpOworCisgIC8qIGxldCB0d29sYW1lIGNob29zZSBkZWZhdWx0IHNhbXBsZXJhdGUgdW5sZXNzIG91dGdvaW5nIHNhbXBsZSByYXRlIGlzIGZpeGVkICovCisgIGFsbG93ZWRfY2FwcyA9IGdzdF9wYWRfZ2V0X2FsbG93ZWRfY2FwcyAoR1NUX0FVRElPX0VOQ09ERVJfU1JDX1BBRCAodHdvbGFtZSkpOworCisgIGlmIChhbGxvd2VkX2NhcHMgIT0gTlVMTCkgeworICAgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICAgIGdpbnQgc2FtcGxlcmF0ZTsKKworICAgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGFsbG93ZWRfY2FwcywgMCk7CisKKyAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJyYXRlIiwgJnNhbXBsZXJhdGUpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUICh0d29sYW1lLAorICAgICAgICAgICJTZXR0aW5nIHNhbXBsZSByYXRlIHRvICVkIGFzIGZpeGVkIGluIHNyYyBjYXBzIiwgc2FtcGxlcmF0ZSk7CisgICAgICB0d29sYW1lX3NldF9vdXRfc2FtcGxlcmF0ZSAodHdvbGFtZS0+Z2xvcHRzLCBzYW1wbGVyYXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAodHdvbGFtZSwgIkxldHRpbmcgdHdvbGFtZSBjaG9vc2Ugc2FtcGxlIHJhdGUiKTsKKyAgICAgIHR3b2xhbWVfc2V0X291dF9zYW1wbGVyYXRlICh0d29sYW1lLT5nbG9wdHMsIDApOworICAgIH0KKyAgICBnc3RfY2Fwc191bnJlZiAoYWxsb3dlZF9jYXBzKTsKKyAgICBhbGxvd2VkX2NhcHMgPSBOVUxMOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHR3b2xhbWUsCisgICAgICAgICJObyBwZWVyIHlldCwgbGV0dGluZyB0d29sYW1lIGNob29zZSBzYW1wbGUgcmF0ZSIpOworICAgIHR3b2xhbWVfc2V0X291dF9zYW1wbGVyYXRlICh0d29sYW1lLT5nbG9wdHMsIDApOworICB9CisKKyAgLyogZm9yY2UgbW9ubyBlbmNvZGluZyBpZiB3ZSBvbmx5IGhhdmUgb25lIGNoYW5uZWwgKi8KKyAgaWYgKHR3b2xhbWUtPm51bV9jaGFubmVscyA9PSAxKQorICAgIHR3b2xhbWUtPm1vZGUgPSAzOworCisgIC8qIEZpeCBiaXRyYXRlcyBhbmQgTVBFRyB2ZXJzaW9uICovCisKKyAgQ0hFQ0tfRVJST1IgKHR3b2xhbWVfc2V0X251bV9jaGFubmVscyAodHdvbGFtZS0+Z2xvcHRzLAorICAgICAgICAgIHR3b2xhbWUtPm51bV9jaGFubmVscykpOworCisgIENIRUNLX0VSUk9SICh0d29sYW1lX3NldF9tb2RlICh0d29sYW1lLT5nbG9wdHMsIHR3b2xhbWUtPm1vZGUpKTsKKyAgQ0hFQ0tfRVJST1IgKHR3b2xhbWVfc2V0X3BzeW1vZGVsICh0d29sYW1lLT5nbG9wdHMsIHR3b2xhbWUtPnBzeW1vZGVsKSk7CisgIENIRUNLX0FORF9GSVhVUF9CSVRSQVRFICh0d29sYW1lLCAiYml0cmF0ZSIsIHR3b2xhbWUtPmJpdHJhdGUpOworICBDSEVDS19FUlJPUiAodHdvbGFtZV9zZXRfYml0cmF0ZSAodHdvbGFtZS0+Z2xvcHRzLCB0d29sYW1lLT5iaXRyYXRlKSk7CisgIENIRUNLX0VSUk9SICh0d29sYW1lX3NldF9wYWRkaW5nICh0d29sYW1lLT5nbG9wdHMsIHR3b2xhbWUtPnBhZGRpbmcpKTsKKyAgQ0hFQ0tfRVJST1IgKHR3b2xhbWVfc2V0X2VuZXJneV9sZXZlbHMgKHR3b2xhbWUtPmdsb3B0cywKKyAgICAgICAgICB0d29sYW1lLT5lbmVyZ3lfbGV2ZWxfZXh0ZW5zaW9uKSk7CisgIENIRUNLX0VSUk9SICh0d29sYW1lX3NldF9lbXBoYXNpcyAodHdvbGFtZS0+Z2xvcHRzLCB0d29sYW1lLT5lbXBoYXNpcykpOworICBDSEVDS19FUlJPUiAodHdvbGFtZV9zZXRfZXJyb3JfcHJvdGVjdGlvbiAodHdvbGFtZS0+Z2xvcHRzLAorICAgICAgICAgIHR3b2xhbWUtPmVycm9yX3Byb3RlY3Rpb24pKTsKKyAgQ0hFQ0tfRVJST1IgKHR3b2xhbWVfc2V0X2NvcHlyaWdodCAodHdvbGFtZS0+Z2xvcHRzLCB0d29sYW1lLT5jb3B5cmlnaHQpKTsKKyAgQ0hFQ0tfRVJST1IgKHR3b2xhbWVfc2V0X29yaWdpbmFsICh0d29sYW1lLT5nbG9wdHMsIHR3b2xhbWUtPm9yaWdpbmFsKSk7CisgIENIRUNLX0VSUk9SICh0d29sYW1lX3NldF9WQlIgKHR3b2xhbWUtPmdsb3B0cywgdHdvbGFtZS0+dmJyKSk7CisgIENIRUNLX0VSUk9SICh0d29sYW1lX3NldF9WQlJfbGV2ZWwgKHR3b2xhbWUtPmdsb3B0cywgdHdvbGFtZS0+dmJyX2xldmVsKSk7CisgIENIRUNLX0VSUk9SICh0d29sYW1lX3NldF9BVEhfbGV2ZWwgKHR3b2xhbWUtPmdsb3B0cywgdHdvbGFtZS0+YXRoX2xldmVsKSk7CisgIENIRUNLX0FORF9GSVhVUF9CSVRSQVRFICh0d29sYW1lLCAidmJyLW1heC1iaXRyYXRlIiwKKyAgICAgIHR3b2xhbWUtPnZicl9tYXhfYml0cmF0ZSk7CisgIENIRUNLX0VSUk9SICh0d29sYW1lX3NldF9WQlJfbWF4X2JpdHJhdGVfa2JwcyAodHdvbGFtZS0+Z2xvcHRzLAorICAgICAgICAgIHR3b2xhbWUtPnZicl9tYXhfYml0cmF0ZSkpOworICBDSEVDS19FUlJPUiAodHdvbGFtZV9zZXRfcXVpY2tfbW9kZSAodHdvbGFtZS0+Z2xvcHRzLCB0d29sYW1lLT5xdWlja19tb2RlKSk7CisgIENIRUNLX0VSUk9SICh0d29sYW1lX3NldF9xdWlja19jb3VudCAodHdvbGFtZS0+Z2xvcHRzLAorICAgICAgICAgIHR3b2xhbWUtPnF1aWNrX21vZGVfY291bnQpKTsKKworICAvKiBpbml0aWFsaXplIHRoZSB0d29sYW1lIGVuY29kZXIgKi8KKyAgaWYgKChyZXR2YWwgPSB0d29sYW1lX2luaXRfcGFyYW1zICh0d29sYW1lLT5nbG9wdHMpKSA+PSAwKSB7CisgICAgdHdvbGFtZS0+c2V0dXAgPSBUUlVFOworICAgIC8qIEZJWE1FOiBpdCB3b3VsZCBiZSBuaWNlIHRvIHByaW50IG91dCB0aGUgbW9kZSBoZXJlICovCisgICAgR1NUX0lORk8gKCJ0d29sYW1lIGVuY29kZXIgc2V0dXAgKCVkIGtiaXQvcywgJWQgSHosICVkIGNoYW5uZWxzKSIsCisgICAgICAgIHR3b2xhbWUtPmJpdHJhdGUsIHR3b2xhbWUtPnNhbXBsZXJhdGUsIHR3b2xhbWUtPm51bV9jaGFubmVscyk7CisgIH0gZWxzZSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAodHdvbGFtZSwgInR3b2xhbWVfaW5pdF9wYXJhbXMgcmV0dXJuZWQgJWQiLCByZXR2YWwpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodHdvbGFtZSwgImRvbmUgd2l0aCBzZXR1cCIpOworCisgIHJldHVybiB0d29sYW1lLT5zZXR1cDsKKyN1bmRlZiBDSEVDS19FUlJPUgorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF90d29fbGFtZV9nZXRfZGVmYXVsdF9zZXR0aW5ncyAodm9pZCkKK3sKKyAgdHdvbGFtZV9vcHRpb25zICpnbG9wdHMgPSBOVUxMOworCisgIGdsb3B0cyA9IHR3b2xhbWVfaW5pdCAoKTsKKyAgaWYgKGdsb3B0cyA9PSBOVUxMKSB7CisgICAgR1NUX0VSUk9SICgiQ291bGRuJ3QgaW5pdGlhbGl6ZSBUd29MQU1FIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgdHdvbGFtZV9zZXRfbnVtX2NoYW5uZWxzIChnbG9wdHMsIDIpOworICB0d29sYW1lX3NldF9pbl9zYW1wbGVyYXRlIChnbG9wdHMsIDQ0MTAwKTsKKworICBpZiAodHdvbGFtZV9pbml0X3BhcmFtcyAoZ2xvcHRzKSAhPSAwKSB7CisgICAgR1NUX0VSUk9SICgiQ291bGRuJ3Qgc2V0IGRlZmF1bHQgcGFyYW1ldGVycyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLm1vZGUgPSBUV09MQU1FX0pPSU5UX1NURVJFTzsgICAgLyogdHdvbGFtZV9nZXRfbW9kZSAoZ2xvcHRzKTsgKi8KKyAgZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MucHN5bW9kZWwgPSB0d29sYW1lX2dldF9wc3ltb2RlbCAoZ2xvcHRzKTsKKyAgZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MuYml0cmF0ZSA9IHR3b2xhbWVfZ2V0X2JpdHJhdGUgKGdsb3B0cyk7CisgIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLnBhZGRpbmcgPSB0d29sYW1lX2dldF9wYWRkaW5nIChnbG9wdHMpOworICBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy5lbmVyZ3lfbGV2ZWxfZXh0ZW5zaW9uID0KKyAgICAgIHR3b2xhbWVfZ2V0X2VuZXJneV9sZXZlbHMgKGdsb3B0cyk7CisgIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLmVtcGhhc2lzID0gdHdvbGFtZV9nZXRfZW1waGFzaXMgKGdsb3B0cyk7CisgIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLmVycm9yX3Byb3RlY3Rpb24gPQorICAgICAgdHdvbGFtZV9nZXRfZXJyb3JfcHJvdGVjdGlvbiAoZ2xvcHRzKTsKKyAgZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MuY29weXJpZ2h0ID0gdHdvbGFtZV9nZXRfY29weXJpZ2h0IChnbG9wdHMpOworICBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy5vcmlnaW5hbCA9IHR3b2xhbWVfZ2V0X29yaWdpbmFsIChnbG9wdHMpOworICBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy52YnIgPSB0d29sYW1lX2dldF9WQlIgKGdsb3B0cyk7CisgIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLnZicl9sZXZlbCA9IHR3b2xhbWVfZ2V0X1ZCUl9sZXZlbCAoZ2xvcHRzKTsKKyAgZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MuYXRoX2xldmVsID0gdHdvbGFtZV9nZXRfQVRIX2xldmVsIChnbG9wdHMpOworICBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy52YnJfbWF4X2JpdHJhdGUgPQorICAgICAgdHdvbGFtZV9nZXRfVkJSX21heF9iaXRyYXRlX2ticHMgKGdsb3B0cyk7CisgIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLnF1aWNrX21vZGUgPSB0d29sYW1lX2dldF9xdWlja19tb2RlIChnbG9wdHMpOworICBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy5xdWlja19tb2RlX2NvdW50ID0KKyAgICAgIHR3b2xhbWVfZ2V0X3F1aWNrX2NvdW50IChnbG9wdHMpOworCisgIHR3b2xhbWVfY2xvc2UgKCZnbG9wdHMpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChkZWJ1ZywgInR3b2xhbWUiLCAwLCAidHdvbGFtZSBtcDIgZW5jb2RlciIpOworCisgIGlmICghZ3N0X3R3b19sYW1lX2dldF9kZWZhdWx0X3NldHRpbmdzICgpKQorICAgIHJldHVybiBGQUxTRTsKKworI2lmZGVmIEVOQUJMRV9OTFMKKyAgR1NUX0RFQlVHICgiYmluZGluZyB0ZXh0IGRvbWFpbiAlcyB0byBsb2NhbGUgZGlyICVzIiwgR0VUVEVYVF9QQUNLQUdFLAorICAgICAgTE9DQUxFRElSKTsKKyAgYmluZHRleHRkb21haW4gKEdFVFRFWFRfUEFDS0FHRSwgTE9DQUxFRElSKTsKKyAgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKEdFVFRFWFRfUEFDS0FHRSwgIlVURi04Iik7CisjZW5kaWYgLyogRU5BQkxFX05MUyAqLworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInR3b2xhbWVtcDJlbmMiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIEdTVF9UWVBFX1RXT19MQU1FKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICB0d29sYW1lLAorICAgICJFbmNvZGUgTVAycyB3aXRoIFR3b0xBTUUiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9leHQvdHdvbGFtZS9nc3R0d29sYW1lbXAyZW5jLmggYi9leHQvdHdvbGFtZS9nc3R0d29sYW1lbXAyZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJhNmJlYQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC90d29sYW1lL2dzdHR3b2xhbWVtcDJlbmMuaApAQCAtMCwwICsxLDg4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA4PiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfVFdPX0xBTUVfSF9fCisjZGVmaW5lIF9fR1NUX1RXT19MQU1FX0hfXworCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZW5jb2Rlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNpbmNsdWRlIDx0d29sYW1lLmg+CisKKyNkZWZpbmUgR1NUX1RZUEVfVFdPX0xBTUUgXAorICAoZ3N0X3R3b19sYW1lX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9UV09fTEFNRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1RXT19MQU1FLEdzdFR3b0xhbWUpKQorI2RlZmluZSBHU1RfVFdPX0xBTUVfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfVFdPX0xBTUUsR3N0VHdvTGFtZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1RXT19MQU1FKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfVFdPX0xBTUUpKQorI2RlZmluZSBHU1RfSVNfVFdPX0xBTUVfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVFdPX0xBTUUpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0VHdvTGFtZSBHc3RUd29MYW1lOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFR3b0xhbWVDbGFzcyBHc3RUd29MYW1lQ2xhc3M7CisKKy8qKgorICogR3N0VHdvTGFtZToKKyAqCisgKiBPcGFxdWUgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0VHdvTGFtZSB7CisgIEdzdEF1ZGlvRW5jb2RlciBlbGVtZW50OworCisgIGdpbnQgc2FtcGxlcmF0ZTsKKyAgZ2ludCBudW1fY2hhbm5lbHM7CisgIGdib29sZWFuIGZsb2F0X2lucHV0OworICBnYm9vbGVhbiBzZXR1cDsKKworICBnaW50IG1vZGU7CisgIGdpbnQgcHN5bW9kZWw7CisgIGdpbnQgYml0cmF0ZTsKKyAgZ2ludCBwYWRkaW5nOworICBnYm9vbGVhbiBlbmVyZ3lfbGV2ZWxfZXh0ZW5zaW9uOworICBnaW50IGVtcGhhc2lzOworICBnYm9vbGVhbiBlcnJvcl9wcm90ZWN0aW9uOworICBnYm9vbGVhbiBjb3B5cmlnaHQ7CisgIGdib29sZWFuIG9yaWdpbmFsOworICBnYm9vbGVhbiB2YnI7CisgIGdmbG9hdCB2YnJfbGV2ZWw7CisgIGdmbG9hdCBhdGhfbGV2ZWw7CisgIGdpbnQgdmJyX21heF9iaXRyYXRlOworICBnYm9vbGVhbiBxdWlja19tb2RlOworICBnaW50IHF1aWNrX21vZGVfY291bnQ7CisKKyAgdHdvbGFtZV9vcHRpb25zICpnbG9wdHM7Cit9OworCitzdHJ1Y3QgX0dzdFR3b0xhbWVDbGFzcyB7CisgIEdzdEF1ZGlvRW5jb2RlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF90d29fbGFtZV9nZXRfdHlwZSh2b2lkKTsKKworR19FTkRfREVDTFMKKworCisjZW5kaWYgLyogX19HU1RfVFdPX0xBTUVfSF9fICovCmRpZmYgLS1naXQgYS9leHQvdHdvbGFtZS9tZXNvbi5idWlsZCBiL2V4dC90d29sYW1lL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYmFiNjMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvdHdvbGFtZS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDEyIEBACit0d29sYW1lX2RlcCA9IGRlcGVuZGVuY3koJ3R3b2xhbWUnLCB2ZXJzaW9uIDogJz49IDAuMy4xMCcsIHJlcXVpcmVkIDogZmFsc2UpCisKK2lmIHR3b2xhbWVfZGVwLmZvdW5kKCkKKyAgdHdvbGFtZSA9IGxpYnJhcnkoJ2dzdHR3b2xhbWUnLAorICAgIFsnZ3N0dHdvbGFtZW1wMmVuYy5jJ10sCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgICBkZXBlbmRlbmNpZXMgOiBbZ3N0YXVkaW9fZGVwLCB0d29sYW1lX2RlcF0sCisgICAgaW5zdGFsbCA6IHRydWUsCisgICAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorICApCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L3ZweC9Hc3RWUDhFbmMucHJzIGIvZXh0L3ZweC9Hc3RWUDhFbmMucHJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMTM5NTkKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvdnB4L0dzdFZQOEVuYy5wcnMKQEAgLTAsMCArMSw4IEBACitbX3ByZXNldHNfXQordmVyc2lvbj0wLjEwCitlbGVtZW50LW5hbWU9R3N0VlA4RW5jCisKK1tQcm9maWxlIFJlYWx0aW1lXQorZGVhZGxpbmU9MQorY3B1LXVzZWQ9NAorbGFnLWluLWZyYW1lcz0wCmRpZmYgLS1naXQgYS9leHQvdnB4L01ha2VmaWxlLmFtIGIvZXh0L3ZweC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWNlNmRlCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3ZweC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM3IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBcCisJbGliZ3N0dnB4LmxhCisKK2xpYmdzdHZweF9sYV9TT1VSQ0VTID0gXAorICAgIGdzdHZweGRlYy5jIFwKKyAgICBnc3R2cHhlbmMuYyBcCisJZ3N0dnA4ZGVjLmMgXAorCWdzdHZwOGVuYy5jIFwKKwlnc3R2cDh1dGlscy5jIFwKKwlnc3R2cDlkZWMuYyBcCisJZ3N0dnA5ZW5jLmMgXAorCXBsdWdpbi5jCisKK2xpYmdzdHZweF9sYV9DRkxBR1MgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgXAorCSQoR1NUX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQ0ZMQUdTKSBcCisJJChWUFhfQ0ZMQUdTKSBcCisJLURHU1RfVVNFX1VOU1RBQkxFX0FQSQorbGliZ3N0dnB4X2xhX0xJQkFERCA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R0YWctQEdTVF9BUElfVkVSU0lPTkAgLWxnc3R2aWRlby1AR1NUX0FQSV9WRVJTSU9OQCBcCisJJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKFZQWF9MSUJTKQorbGliZ3N0dnB4X2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBcCisgICAgZ3N0dnB4ZGVjLmggXAorICAgIGdzdHZweGVuYy5oIFwKKwlnc3R2cDhkZWMuaCBcCisJZ3N0dnA4ZW5jLmggXAorCWdzdHZwOWRlYy5oIFwKKwlnc3R2cDllbmMuaCBcCisJZ3N0dnA4dXRpbHMuaAorCitwcmVzZXRkaXIgPSAkKGRhdGFkaXIpL2dzdHJlYW1lci0kKEdTVF9BUElfVkVSU0lPTikvcHJlc2V0cworcHJlc2V0X0RBVEEgPSBHc3RWUDhFbmMucHJzCisKK0VYVFJBX0RJU1QgPSAkKHByZXNldF9EQVRBKQpkaWZmIC0tZ2l0IGEvZXh0L3ZweC9nc3R2cDhkZWMuYyBiL2V4dC92cHgvZ3N0dnA4ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE5NjI1YwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC92cHgvZ3N0dnA4ZGVjLmMKQEAgLTAsMCArMSwxNTcgQEAKKy8qIFZQOAorICogQ29weXJpZ2h0IChDKSAyMDA2IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4LDIwMDksMjAxMCBFbnRyb3B5IFdhdmUgSW5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LXZwOGRlYworICogQHNlZV9hbHNvOiB2cDhlbmMsIG1hdHJvc2thZGVtdXgKKyAqCisgKiBUaGlzIGVsZW1lbnQgZGVjb2RlcyBWUDggc3RyZWFtcyBpbnRvIHJhdyB2aWRlby4KKyAqIDx1bGluayB1cmw9Imh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnIj5WUDg8L3VsaW5rPiBpcyBhIHJveWFsdHktZnJlZQorICogdmlkZW8gY29kZWMgbWFpbnRhaW5lZCBieSA8dWxpbmsgdXJsPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vIj5Hb29nbGUKKyAqIDwvdWxpbms+LiBJdCdzIHRoZSBzdWNjZXNzb3Igb2YgT24yIFZQMywgd2hpY2ggd2FzIHRoZSBiYXNlIG9mIHRoZQorICogVGhlb3JhIHZpZGVvIGNvZGVjLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBmaWxlc3JjIGxvY2F0aW9uPXZpZGVvdGVzdHNyYy53ZWJtICEgbWF0cm9za2FkZW11eCAhIHZwOGRlYyAhIHZpZGVvY29udmVydCAhIHZpZGVvc2NhbGUgISBhdXRvdmlkZW9zaW5rCisgKiBdfCBUaGlzIGV4YW1wbGUgcGlwZWxpbmUgd2lsbCBkZWNvZGUgYSBXZWJNIHN0cmVhbSBhbmQgZGVjb2RlcyB0aGUgVlA4IHZpZGVvLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1ZQOF9ERUNPREVSCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdHZwOGRlYy5oIgorI2luY2x1ZGUgImdzdHZwOHV0aWxzLmgiCisKKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9tZXRhLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvcG9vbC5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfdnA4ZGVjX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF92cDhkZWNfZGVidWcKKworI2RlZmluZSBWUDhfREVDT0RFUl9WSURFT19UQUcgIlZQOCB2aWRlbyIKKworc3RhdGljIHZvaWQgZ3N0X3ZwOF9kZWNfc2V0X2RlZmF1bHRfZm9ybWF0IChHc3RWUFhEZWMgKiBkZWMsIEdzdFZpZGVvRm9ybWF0IGZtdCwKKyAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworc3RhdGljIHZvaWQgZ3N0X3ZwOF9kZWNfaGFuZGxlX3Jlc29sdXRpb25fY2hhbmdlIChHc3RWUFhEZWMgKiBkZWMsCisgICAgdnB4X2ltYWdlX3QgKiBpbWcsIEdzdFZpZGVvRm9ybWF0IGZtdCk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfdnA4X2RlY19zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtdnA4IikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3ZwOF9kZWNfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJJNDIwIikpCisgICAgKTsKKworI2RlZmluZSBwYXJlbnRfY2xhc3MgZ3N0X3ZwOF9kZWNfcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RWUDhEZWMsIGdzdF92cDhfZGVjLCBHU1RfVFlQRV9WUFhfREVDKTsKKworc3RhdGljIHZvaWQKK2dzdF92cDhfZGVjX2NsYXNzX2luaXQgKEdzdFZQOERlY0NsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKyAgR3N0VlBYRGVjQ2xhc3MgKnZweF9jbGFzczsKKworICBlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgdnB4X2NsYXNzID0gR1NUX1ZQWF9ERUNfQ0xBU1MgKGtsYXNzKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfdnA4X2RlY19zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3ZwOF9kZWNfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIk9uMiBWUDggRGVjb2RlciIsCisgICAgICAiQ29kZWMvRGVjb2Rlci9WaWRlbyIsCisgICAgICAiRGVjb2RlIFZQOCB2aWRlbyBzdHJlYW1zIiwgIkRhdmlkIFNjaGxlZWYgPGRzQGVudHJvcHl3YXZlLmNvbT4sICIKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4iKTsKKworICB2cHhfY2xhc3MtPnZpZGVvX2NvZGVjX3RhZyA9IFZQOF9ERUNPREVSX1ZJREVPX1RBRzsKKyAgdnB4X2NsYXNzLT5jb2RlY19hbGdvID0gJnZweF9jb2RlY192cDhfZHhfYWxnbzsKKyAgdnB4X2NsYXNzLT5zZXRfZGVmYXVsdF9mb3JtYXQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92cDhfZGVjX3NldF9kZWZhdWx0X2Zvcm1hdCk7CisgIHZweF9jbGFzcy0+aGFuZGxlX3Jlc29sdXRpb25fY2hhbmdlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdnA4X2RlY19oYW5kbGVfcmVzb2x1dGlvbl9jaGFuZ2UpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfdnA4ZGVjX2RlYnVnLCAidnA4ZGVjIiwgMCwgIlZQOCBEZWNvZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnA4X2RlY19pbml0IChHc3RWUDhEZWMgKiBnc3RfdnA4X2RlYykKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAoZ3N0X3ZwOF9kZWMsICJnc3RfdnA4X2RlY19pbml0Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnA4X2RlY19zZXRfZGVmYXVsdF9mb3JtYXQgKEdzdFZQWERlYyAqIGRlYywgR3N0VmlkZW9Gb3JtYXQgZm10LCBpbnQgd2lkdGgsCisgICAgaW50IGhlaWdodCkKK3sKKyAgR3N0VlBYRGVjQ2xhc3MgKnZweGNsYXNzID0gR1NUX1ZQWF9ERUNfR0VUX0NMQVNTIChkZWMpOworICBnX2Fzc2VydCAoZGVjLT5vdXRwdXRfc3RhdGUgPT0gTlVMTCk7CisgIGRlYy0+b3V0cHV0X3N0YXRlID0KKyAgICAgIGdzdF92aWRlb19kZWNvZGVyX3NldF9vdXRwdXRfc3RhdGUgKEdTVF9WSURFT19ERUNPREVSIChkZWMpLAorICAgICAgR1NUX1ZJREVPX0ZPUk1BVF9JNDIwLCB3aWR0aCwgaGVpZ2h0LCBkZWMtPmlucHV0X3N0YXRlKTsKKyAgZ3N0X3ZpZGVvX2RlY29kZXJfbmVnb3RpYXRlIChHU1RfVklERU9fREVDT0RFUiAoZGVjKSk7CisgIHZweGNsYXNzLT5zZW5kX3RhZ3MgKGRlYyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnA4X2RlY19oYW5kbGVfcmVzb2x1dGlvbl9jaGFuZ2UgKEdzdFZQWERlYyAqIGRlYywgdnB4X2ltYWdlX3QgKiBpbWcsCisgICAgR3N0VmlkZW9Gb3JtYXQgZm10KQoreworICBHc3RWaWRlb0luZm8gKmluZm87CisgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqbmV3X291dHB1dF9zdGF0ZTsKKworICBpbmZvID0gJmRlYy0+b3V0cHV0X3N0YXRlLT5pbmZvOworICBpZiAoR1NUX1ZJREVPX0lORk9fV0lEVEggKGluZm8pICE9IGltZy0+ZF93CisgICAgICB8fCBHU1RfVklERU9fSU5GT19IRUlHSFQgKGluZm8pICE9IGltZy0+ZF9oKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVjLAorICAgICAgICAiQ2hhbmdlZCBvdXRwdXQgcmVzb2x1dGlvbiB3YXMgJWQgeCAlZCBub3cgaXMgZ290ICV1IHggJXUgKGRpc3BsYXkgJXUgeCAldSkiLAorICAgICAgICBHU1RfVklERU9fSU5GT19XSURUSCAoaW5mbyksIEdTVF9WSURFT19JTkZPX0hFSUdIVCAoaW5mbyksIGltZy0+dywKKyAgICAgICAgaW1nLT5oLCBpbWctPmRfdywgaW1nLT5kX2gpOworCisgICAgbmV3X291dHB1dF9zdGF0ZSA9CisgICAgICAgIGdzdF92aWRlb19kZWNvZGVyX3NldF9vdXRwdXRfc3RhdGUgKEdTVF9WSURFT19ERUNPREVSIChkZWMpLAorICAgICAgICBHU1RfVklERU9fRk9STUFUX0k0MjAsIGltZy0+ZF93LCBpbWctPmRfaCwgZGVjLT5vdXRwdXRfc3RhdGUpOworICAgIGlmIChkZWMtPm91dHB1dF9zdGF0ZSkgeworICAgICAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChkZWMtPm91dHB1dF9zdGF0ZSk7CisgICAgfQorICAgIGRlYy0+b3V0cHV0X3N0YXRlID0gbmV3X291dHB1dF9zdGF0ZTsKKyAgICAvKiBObyBuZWVkIHRvIGNhbGwgbmVnb3RpYXRlKCkgaGVyZSwgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNhbGxlZAorICAgICAqIGJ5IGFsbG9jYXRlX291dHB1dF9mcmFtZSgpKi8KKyAgfQorfQorCisjZW5kaWYgLyogSEFWRV9WUDhfREVDT0RFUiAqLwpkaWZmIC0tZ2l0IGEvZXh0L3ZweC9nc3R2cDhkZWMuaCBiL2V4dC92cHgvZ3N0dnA4ZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMzYjE2MQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC92cHgvZ3N0dnA4ZGVjLmgKQEAgLTAsMCArMSw3NyBAQAorLyogVlA4CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsMjAwOSwyMDEwIEVudHJvcHkgV2F2ZSBJbmMKKyAqIENvcHlyaWdodCAoQykgMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0dTVF9WUDhfREVDX0hfXworI2RlZmluZSBfX0dTVF9WUDhfREVDX0hfXworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1ZQOF9ERUNPREVSCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZGVjb2Rlci5oPgorI2luY2x1ZGUgPGdzdHZweGRlYy5oPgorCisvKiBGSVhNRTogVW5kZWYgSEFWRV9DT05GSUdfSCBiZWNhdXNlIHZweF9jb2RlYy5oIHVzZXMgaXQsCisgKiB3aGljaCBjYXVzZXMgY29tcGlsYXRpb24gZmFpbHVyZXMgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjdW5kZWYgSEFWRV9DT05GSUdfSAorI2VuZGlmCisKKyNpbmNsdWRlIDx2cHgvdnB4X2RlY29kZXIuaD4KKyNpbmNsdWRlIDx2cHgvdnA4ZHguaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1ZQOF9ERUMgXAorICAoZ3N0X3ZwOF9kZWNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1ZQOF9ERUMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9WUDhfREVDLEdzdFZQOERlYykpCisjZGVmaW5lIEdTVF9WUDhfREVDX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1ZQOF9ERUMsR3N0VlA4RGVjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVlA4X0RFQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1ZQOF9ERUMpKQorI2RlZmluZSBHU1RfSVNfVlA4X0RFQ19DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVlA4X0RFQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWUDhEZWMgR3N0VlA4RGVjOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZQOERlY0NsYXNzIEdzdFZQOERlY0NsYXNzOworCitzdHJ1Y3QgX0dzdFZQOERlYworeworICBHc3RWUFhEZWMgYmFzZV92cHhfZGVjb2RlcjsKK307CisKK3N0cnVjdCBfR3N0VlA4RGVjQ2xhc3MKK3sKKyAgR3N0VlBYRGVjQ2xhc3MgYmFzZV92cHhfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfdnA4X2RlY19nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgorCisjZW5kaWYgLyogX19HU1RfVlA4X0RFQ19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC92cHgvZ3N0dnA4ZW5jLmMgYi9leHQvdnB4L2dzdHZwOGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOWIzODgKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvdnB4L2dzdHZwOGVuYy5jCkBAIC0wLDAgKzEsNDM2IEBACisvKiBWUDgKKyAqIENvcHlyaWdodCAoQykgMjAwNiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBFbnRyb3B5IFdhdmUgSW5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LXZwOGVuYworICogQHNlZV9hbHNvOiB2cDhkZWMsIHdlYm1tdXgsIG9nZ211eAorICoKKyAqIFRoaXMgZWxlbWVudCBlbmNvZGVzIHJhdyB2aWRlbyBpbnRvIGEgVlA4IHN0cmVhbS4KKyAqIDx1bGluayB1cmw9Imh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnIj5WUDg8L3VsaW5rPiBpcyBhIHJveWFsdHktZnJlZQorICogdmlkZW8gY29kZWMgbWFpbnRhaW5lZCBieSA8dWxpbmsgdXJsPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vIj5Hb29nbGUKKyAqIDwvdWxpbms+LiBJdCdzIHRoZSBzdWNjZXNzb3Igb2YgT24yIFZQMywgd2hpY2ggd2FzIHRoZSBiYXNlIG9mIHRoZQorICogVGhlb3JhIHZpZGVvIGNvZGVjLgorICoKKyAqIFRvIGNvbnRyb2wgdGhlIHF1YWxpdHkgb2YgdGhlIGVuY29kaW5nLCB0aGUgI0dzdFZQOEVuYzo6dGFyZ2V0LWJpdHJhdGUsCisgKiAjR3N0VlA4RW5jOjptaW4tcXVhbnRpemVyLCAjR3N0VlA4RW5jOjptYXgtcXVhbnRpemVyIG9yICNHc3RWUDhFbmM6OmNxLWxldmVsCisgKiBwcm9wZXJ0aWVzIGNhbiBiZSB1c2VkLiBXaGljaCBvbmUgaXMgdXNlZCBkZXBlbmRzIG9uIHRoZSBtb2RlIHNlbGVjdGVkIGJ5CisgKiB0aGUgI0dzdFZQOEVuYzo6ZW5kLXVzYWdlIHByb3BlcnR5LgorICogU2VlIDx1bGluayB1cmw9Imh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL2RvY3MvZW5jb2Rlci1wYXJhbWV0ZXJzLyI+RW5jb2RlciBQYXJhbWV0ZXJzPC91bGluaz4KKyAqIGZvciBleHBsYW5hdGlvbiwgZXhhbXBsZXMgZm9yIHVzZWZ1bCBlbmNvZGluZyBwYXJhbWV0ZXJzIGFuZCBtb3JlIGRldGFpbHMKKyAqIG9uIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiB2aWRlb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9MTAwMCAhIHZwOGVuYyAhIHdlYm1tdXggISBmaWxlc2luayBsb2NhdGlvbj12aWRlb3Rlc3RzcmMud2VibQorICogXXwgVGhpcyBleGFtcGxlIHBpcGVsaW5lIHdpbGwgZW5jb2RlIGEgdGVzdCB2aWRlbyBzb3VyY2UgdG8gVlA4IG11eGVkIGluIGFuCisgKiBXZWJNIGNvbnRhaW5lci4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9WUDhfRU5DT0RFUgorCisvKiBnbGliIGRlY2lkZWQgaW4gMi4zMiBpdCB3b3VsZCBiZSBhIGdyZWF0IGlkZWEgdG8gZGVwcmVjYXRlZCBHVmFsdWVBcnJheSB3aXRob3V0CisgKiBwcm92aWRpbmcgYW4gYWx0ZXJuYXRpdmUKKyAqCisgKiBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NzIyOAorICogKi8KKyNkZWZpbmUgR0xJQl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisKKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0dnA4dXRpbHMuaCIKKyNpbmNsdWRlICJnc3R2cDhlbmMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3ZwOGVuY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfdnA4ZW5jX2RlYnVnCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHZweF9pbWFnZV90ICppbWFnZTsKKyAgR0xpc3QgKmludmlzaWJsZTsKK30gR3N0VlA4RW5jVXNlckRhdGE7CisKK3N0YXRpYyB2b2lkCitfZ3N0X21pbmlfb2JqZWN0X3VucmVmMCAoR3N0TWluaU9iamVjdCAqIG9iaikKK3sKKyAgaWYgKG9iaikKKyAgICBnc3RfbWluaV9vYmplY3RfdW5yZWYgKG9iaik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnA4X2VuY191c2VyX2RhdGFfZnJlZSAoR3N0VlA4RW5jVXNlckRhdGEgKiB1c2VyX2RhdGEpCit7CisgIGlmICh1c2VyX2RhdGEtPmltYWdlKQorICAgIGdfc2xpY2VfZnJlZSAodnB4X2ltYWdlX3QsIHVzZXJfZGF0YS0+aW1hZ2UpOworCisgIGdfbGlzdF9mb3JlYWNoICh1c2VyX2RhdGEtPmludmlzaWJsZSwgKEdGdW5jKSBfZ3N0X21pbmlfb2JqZWN0X3VucmVmMCwgTlVMTCk7CisgIGdfbGlzdF9mcmVlICh1c2VyX2RhdGEtPmludmlzaWJsZSk7CisgIGdfc2xpY2VfZnJlZSAoR3N0VlA4RW5jVXNlckRhdGEsIHVzZXJfZGF0YSk7Cit9CisKK3N0YXRpYyB2cHhfY29kZWNfaWZhY2VfdCAqZ3N0X3ZwOF9lbmNfZ2V0X2FsZ28gKEdzdFZQWEVuYyAqIGVuYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3ZwOF9lbmNfZW5hYmxlX3NjYWxpbmcgKEdzdFZQWEVuYyAqIGVuYyk7CitzdGF0aWMgdm9pZCBnc3RfdnA4X2VuY19zZXRfaW1hZ2VfZm9ybWF0IChHc3RWUFhFbmMgKiBlbmMsIHZweF9pbWFnZV90ICogaW1hZ2UpOworc3RhdGljIEdzdENhcHMgKmdzdF92cDhfZW5jX2dldF9uZXdfc2ltcGxlX2NhcHMgKEdzdFZQWEVuYyAqIGVuYyk7CitzdGF0aWMgdm9pZCBnc3RfdnA4X2VuY19zZXRfc3RyZWFtX2luZm8gKEdzdFZQWEVuYyAqIGVuYywgR3N0Q2FwcyAqIGNhcHMsCisgICAgR3N0VmlkZW9JbmZvICogaW5mbyk7CitzdGF0aWMgdm9pZCAqZ3N0X3ZwOF9lbmNfcHJvY2Vzc19mcmFtZV91c2VyX2RhdGEgKEdzdFZQWEVuYyAqIGVuYywKKyAgICBHc3RWaWRlb0NvZGVjRnJhbWUgKiBmcmFtZSk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfdnA4X2VuY19oYW5kbGVfaW52aXNpYmxlX2ZyYW1lX2J1ZmZlciAoR3N0VlBYRW5jICogZW5jLAorICAgIHZvaWQgKnVzZXJfZGF0YSwgR3N0QnVmZmVyICogYnVmZmVyKTsKK3N0YXRpYyB2b2lkIGdzdF92cDhfZW5jX3NldF9mcmFtZV91c2VyX2RhdGEgKEdzdFZQWEVuYyAqIGVuYywKKyAgICBHc3RWaWRlb0NvZGVjRnJhbWUgKiBmcmFtZSwgdnB4X2ltYWdlX3QgKiBpbWFnZSk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF92cDhfZW5jX3ByZV9wdXNoIChHc3RWaWRlb0VuY29kZXIgKiBlbmNvZGVyLAorICAgIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF92cDhfZW5jX3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIFwiSTQyMFwiLCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsxLCAxNjM4M10sICIKKyAgICAgICAgImhlaWdodCA9IChpbnQpIFsxLCAxNjM4M10sIGZyYW1lcmF0ZSA9IChmcmFjdGlvbikgWyAwLzEsIE1BWCBdIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3ZwOF9lbmNfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXZwOCwgIiAicHJvZmlsZSA9IChzdHJpbmcpIHswLCAxLCAyLCAzfSIpCisgICAgKTsKKworI2RlZmluZSBwYXJlbnRfY2xhc3MgZ3N0X3ZwOF9lbmNfcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RWUDhFbmMsIGdzdF92cDhfZW5jLCBHU1RfVFlQRV9WUFhfRU5DKTsKKworc3RhdGljIHZvaWQKK2dzdF92cDhfZW5jX2NsYXNzX2luaXQgKEdzdFZQOEVuY0NsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKyAgR3N0VmlkZW9FbmNvZGVyQ2xhc3MgKnZpZGVvX2VuY29kZXJfY2xhc3M7CisgIEdzdFZQWEVuY0NsYXNzICp2cHhfZW5jb2Rlcl9jbGFzczsKKworICBlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcyA9IEdTVF9WSURFT19FTkNPREVSX0NMQVNTIChrbGFzcyk7CisgIHZweF9lbmNvZGVyX2NsYXNzID0gR1NUX1ZQWF9FTkNfQ0xBU1MgKGtsYXNzKTsKKworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF92cDhfZW5jX3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF92cDhfZW5jX3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiT24yIFZQOCBFbmNvZGVyIiwKKyAgICAgICJDb2RlYy9FbmNvZGVyL1ZpZGVvIiwKKyAgICAgICJFbmNvZGUgVlA4IHZpZGVvIHN0cmVhbXMiLCAiRGF2aWQgU2NobGVlZiA8ZHNAZW50cm9weXdhdmUuY29tPiwgIgorICAgICAgIlNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPiIpOworCisgIHZpZGVvX2VuY29kZXJfY2xhc3MtPnByZV9wdXNoID0gZ3N0X3ZwOF9lbmNfcHJlX3B1c2g7CisKKyAgdnB4X2VuY29kZXJfY2xhc3MtPmdldF9hbGdvID0gZ3N0X3ZwOF9lbmNfZ2V0X2FsZ287CisgIHZweF9lbmNvZGVyX2NsYXNzLT5lbmFibGVfc2NhbGluZyA9IGdzdF92cDhfZW5jX2VuYWJsZV9zY2FsaW5nOworICB2cHhfZW5jb2Rlcl9jbGFzcy0+c2V0X2ltYWdlX2Zvcm1hdCA9IGdzdF92cDhfZW5jX3NldF9pbWFnZV9mb3JtYXQ7CisgIHZweF9lbmNvZGVyX2NsYXNzLT5nZXRfbmV3X3ZweF9jYXBzID0gZ3N0X3ZwOF9lbmNfZ2V0X25ld19zaW1wbGVfY2FwczsKKyAgdnB4X2VuY29kZXJfY2xhc3MtPnNldF9zdHJlYW1faW5mbyA9IGdzdF92cDhfZW5jX3NldF9zdHJlYW1faW5mbzsKKyAgdnB4X2VuY29kZXJfY2xhc3MtPnByb2Nlc3NfZnJhbWVfdXNlcl9kYXRhID0KKyAgICAgIGdzdF92cDhfZW5jX3Byb2Nlc3NfZnJhbWVfdXNlcl9kYXRhOworICB2cHhfZW5jb2Rlcl9jbGFzcy0+aGFuZGxlX2ludmlzaWJsZV9mcmFtZV9idWZmZXIgPQorICAgICAgZ3N0X3ZwOF9lbmNfaGFuZGxlX2ludmlzaWJsZV9mcmFtZV9idWZmZXI7CisgIHZweF9lbmNvZGVyX2NsYXNzLT5zZXRfZnJhbWVfdXNlcl9kYXRhID0gZ3N0X3ZwOF9lbmNfc2V0X2ZyYW1lX3VzZXJfZGF0YTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3ZwOGVuY19kZWJ1ZywgInZwOGVuYyIsIDAsICJWUDggRW5jb2RlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZwOF9lbmNfaW5pdCAoR3N0VlA4RW5jICogZ3N0X3ZwOF9lbmMpCit7CisgIHZweF9jb2RlY19lcnJfdCBzdGF0dXM7CisgIEdzdFZQWEVuYyAqZ3N0X3ZweF9lbmMgPSBHU1RfVlBYX0VOQyAoZ3N0X3ZwOF9lbmMpOworICBHU1RfREVCVUdfT0JKRUNUIChnc3RfdnA4X2VuYywgImdzdF92cDhfZW5jX2luaXQiKTsKKyAgc3RhdHVzID0KKyAgICAgIHZweF9jb2RlY19lbmNfY29uZmlnX2RlZmF1bHQgKGdzdF92cDhfZW5jX2dldF9hbGdvIChnc3RfdnB4X2VuYyksCisgICAgICAmZ3N0X3ZweF9lbmMtPmNmZywgMCk7CisgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZ3N0X3ZweF9lbmMsCisgICAgICAgICJGYWlsZWQgdG8gZ2V0IGRlZmF1bHQgZW5jb2RlciBjb25maWd1cmF0aW9uOiAlcyIsCisgICAgICAgIGdzdF92cHhfZXJyb3JfbmFtZSAoc3RhdHVzKSk7CisgICAgZ3N0X3ZweF9lbmMtPmhhdmVfZGVmYXVsdF9jb25maWcgPSBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfdnB4X2VuYy0+aGF2ZV9kZWZhdWx0X2NvbmZpZyA9IFRSVUU7CisgIH0KK30KKworc3RhdGljIHZweF9jb2RlY19pZmFjZV90ICoKK2dzdF92cDhfZW5jX2dldF9hbGdvIChHc3RWUFhFbmMgKiBlbmMpCit7CisgIHJldHVybiAmdnB4X2NvZGVjX3ZwOF9jeF9hbGdvOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92cDhfZW5jX2VuYWJsZV9zY2FsaW5nIChHc3RWUFhFbmMgKiBlbmMpCit7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZwOF9lbmNfc2V0X2ltYWdlX2Zvcm1hdCAoR3N0VlBYRW5jICogZW5jLCB2cHhfaW1hZ2VfdCAqIGltYWdlKQoreworICBpbWFnZS0+Zm10ID0gVlBYX0lNR19GTVRfSTQyMDsKKyAgaW1hZ2UtPmJwcyA9IDEyOworICBpbWFnZS0+eF9jaHJvbWFfc2hpZnQgPSBpbWFnZS0+eV9jaHJvbWFfc2hpZnQgPSAxOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfdnA4X2VuY19nZXRfbmV3X3NpbXBsZV9jYXBzIChHc3RWUFhFbmMgKiBlbmMpCit7CisgIEdzdENhcHMgKmNhcHM7CisgIGdjaGFyICpwcm9maWxlX3N0ciA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgZW5jLT5jZmcuZ19wcm9maWxlKTsKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LXZwOCIsCisgICAgICAicHJvZmlsZSIsIEdfVFlQRV9TVFJJTkcsIHByb2ZpbGVfc3RyLCBOVUxMKTsKKyAgZ19mcmVlIChwcm9maWxlX3N0cik7CisgIHJldHVybiBjYXBzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZwOF9lbmNfc2V0X3N0cmVhbV9pbmZvIChHc3RWUFhFbmMgKiBlbmMsIEdzdENhcHMgKiBjYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluZm8pCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgR3N0VmlkZW9FbmNvZGVyICp2aWRlb19lbmNvZGVyOworICBHc3RCdWZmZXIgKnN0cmVhbV9oZHIsICp2b3JiaXNjb21tZW50OworICBjb25zdCBHc3RUYWdMaXN0ICppZmFjZV90YWdzOworICBHVmFsdWUgYXJyYXkgPSB7IDAsIH07CisgIEdWYWx1ZSB2YWx1ZSA9IHsgMCwgfTsKKyAgZ3VpbnQ4ICpkYXRhID0gTlVMTDsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgdmlkZW9fZW5jb2RlciA9IEdTVF9WSURFT19FTkNPREVSIChlbmMpOworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgLyogcHV0IGJ1ZmZlcnMgaW4gYSBmaXhlZCBsaXN0ICovCisgIGdfdmFsdWVfaW5pdCAoJmFycmF5LCBHU1RfVFlQRV9BUlJBWSk7CisgIGdfdmFsdWVfaW5pdCAoJnZhbHVlLCBHU1RfVFlQRV9CVUZGRVIpOworCisgIC8qIENyZWF0ZSBPZ2cgc3RyZWFtLWluZm8gKi8KKyAgc3RyZWFtX2hkciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMjYpOworICBnc3RfYnVmZmVyX21hcCAoc3RyZWFtX2hkciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKworICBHU1RfV1JJVEVfVUlOVDggKGRhdGEsIDB4NEYpOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgMSwgMHg1NjUwMzgzMCk7ICAgLyogIlZQODAiICovCisgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDUsIDB4MDEpOyAgICAgLyogc3RyZWFtIGluZm8gaGVhZGVyICovCisgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDYsIDEpOyAgICAgICAgLyogTWFqb3IgdmVyc2lvbiAxICovCisgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDcsIDApOyAgICAgICAgLyogTWlub3IgdmVyc2lvbiAwICovCisgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEgKyA4LCBHU1RfVklERU9fSU5GT19XSURUSCAoaW5mbykpOworICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhICsgMTAsIEdTVF9WSURFT19JTkZPX0hFSUdIVCAoaW5mbykpOworICBHU1RfV1JJVEVfVUlOVDI0X0JFIChkYXRhICsgMTIsIEdTVF9WSURFT19JTkZPX1BBUl9OIChpbmZvKSk7CisgIEdTVF9XUklURV9VSU5UMjRfQkUgKGRhdGEgKyAxNSwgR1NUX1ZJREVPX0lORk9fUEFSX0QgKGluZm8pKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDE4LCBHU1RfVklERU9fSU5GT19GUFNfTiAoaW5mbykpOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgMjIsIEdTVF9WSURFT19JTkZPX0ZQU19EIChpbmZvKSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoc3RyZWFtX2hkciwgJm1hcCk7CisKKyAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoc3RyZWFtX2hkciwgR1NUX0JVRkZFUl9GTEFHX0hFQURFUik7CisgIGdzdF92YWx1ZV9zZXRfYnVmZmVyICgmdmFsdWUsIHN0cmVhbV9oZHIpOworICBnc3RfdmFsdWVfYXJyYXlfYXBwZW5kX3ZhbHVlICgmYXJyYXksICZ2YWx1ZSk7CisgIGdfdmFsdWVfdW5zZXQgKCZ2YWx1ZSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKHN0cmVhbV9oZHIpOworCisgIGlmYWNlX3RhZ3MgPSBnc3RfdGFnX3NldHRlcl9nZXRfdGFnX2xpc3QgKEdTVF9UQUdfU0VUVEVSICh2aWRlb19lbmNvZGVyKSk7CisgIGlmIChpZmFjZV90YWdzKSB7CisgICAgdm9yYmlzY29tbWVudCA9CisgICAgICAgIGdzdF90YWdfbGlzdF90b192b3JiaXNjb21tZW50X2J1ZmZlciAoaWZhY2VfdGFncywKKyAgICAgICAgKGNvbnN0IGd1aW50OCAqKSAiT1ZQODBcMiAiLCA3LAorICAgICAgICAiRW5jb2RlZCB3aXRoIEdTdHJlYW1lciB2cDhlbmMgIiBQQUNLQUdFX1ZFUlNJT04pOworCisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAodm9yYmlzY29tbWVudCwgR1NUX0JVRkZFUl9GTEFHX0hFQURFUik7CisKKyAgICBnX3ZhbHVlX2luaXQgKCZ2YWx1ZSwgR1NUX1RZUEVfQlVGRkVSKTsKKyAgICBnc3RfdmFsdWVfc2V0X2J1ZmZlciAoJnZhbHVlLCB2b3JiaXNjb21tZW50KTsKKyAgICBnc3RfdmFsdWVfYXJyYXlfYXBwZW5kX3ZhbHVlICgmYXJyYXksICZ2YWx1ZSk7CisgICAgZ192YWx1ZV91bnNldCAoJnZhbHVlKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmICh2b3JiaXNjb21tZW50KTsKKyAgfQorCisgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChzLCAic3RyZWFtaGVhZGVyIiwgJmFycmF5KTsKKyAgZ192YWx1ZV91bnNldCAoJmFycmF5KTsKKworfQorCitzdGF0aWMgdm9pZCAqCitnc3RfdnA4X2VuY19wcm9jZXNzX2ZyYW1lX3VzZXJfZGF0YSAoR3N0VlBYRW5jICogZW5jLAorICAgIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lKQoreworICBHc3RWUDhFbmNVc2VyRGF0YSAqdXNlcl9kYXRhOworCisgIHVzZXJfZGF0YSA9IGdzdF92aWRlb19jb2RlY19mcmFtZV9nZXRfdXNlcl9kYXRhIChmcmFtZSk7CisKKyAgaWYgKCF1c2VyX2RhdGEpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChlbmMsICJIYXZlIG5vIGZyYW1lIHVzZXIgZGF0YSIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKHVzZXJfZGF0YS0+aW1hZ2UpCisgICAgZ19zbGljZV9mcmVlICh2cHhfaW1hZ2VfdCwgdXNlcl9kYXRhLT5pbWFnZSk7CisgIHVzZXJfZGF0YS0+aW1hZ2UgPSBOVUxMOworICByZXR1cm4gdXNlcl9kYXRhOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3ZwOF9lbmNfaGFuZGxlX2ludmlzaWJsZV9mcmFtZV9idWZmZXIgKEdzdFZQWEVuYyAqIGVuYywgdm9pZCAqdXNlcl9kYXRhLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0VlA4RW5jVXNlckRhdGEgKnZwOF91c2VyX2RhdGEgPSAoR3N0VlA4RW5jVXNlckRhdGEgKikgdXNlcl9kYXRhOworCisgIGlmICghdnA4X3VzZXJfZGF0YSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGVuYywgIkhhdmUgbm8gZnJhbWUgdXNlciBkYXRhIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgdnA4X3VzZXJfZGF0YS0+aW52aXNpYmxlID0gZ19saXN0X2FwcGVuZCAodnA4X3VzZXJfZGF0YS0+aW52aXNpYmxlLCBidWZmZXIpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK2dzdF92cDhfZW5jX3NldF9mcmFtZV91c2VyX2RhdGEgKEdzdFZQWEVuYyAqIGVuYywgR3N0VmlkZW9Db2RlY0ZyYW1lICogZnJhbWUsCisgICAgdnB4X2ltYWdlX3QgKiBpbWFnZSkKK3sKKyAgR3N0VlA4RW5jVXNlckRhdGEgKnVzZXJfZGF0YTsKKyAgdXNlcl9kYXRhID0gZ19zbGljZV9uZXcwIChHc3RWUDhFbmNVc2VyRGF0YSk7CisgIHVzZXJfZGF0YS0+aW1hZ2UgPSBpbWFnZTsKKyAgZ3N0X3ZpZGVvX2NvZGVjX2ZyYW1lX3NldF91c2VyX2RhdGEgKGZyYW1lLCB1c2VyX2RhdGEsCisgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF92cDhfZW5jX3VzZXJfZGF0YV9mcmVlKTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgZ3VpbnQ2NAorX3RvX2dyYW51bGVwb3MgKGd1aW50NjQgZnJhbWVfZW5kX251bWJlciwgZ3VpbnQgaW52X2NvdW50LCBndWludCBrZXlmcmFtZV9kaXN0KQoreworICBndWludDY0IGdyYW51bGVwb3M7CisgIGd1aW50IGludjsKKworICBpbnYgPSAoaW52X2NvdW50ID09IDApID8gMHgzIDogaW52X2NvdW50IC0gMTsKKworICBncmFudWxlcG9zID0gKGZyYW1lX2VuZF9udW1iZXIgPDwgMzIpIHwgKGludiA8PCAzMCkgfCAoa2V5ZnJhbWVfZGlzdCA8PCAzKTsKKyAgcmV0dXJuIGdyYW51bGVwb3M7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdnA4X2VuY19wcmVfcHVzaCAoR3N0VmlkZW9FbmNvZGVyICogdmlkZW9fZW5jb2RlciwKKyAgICBHc3RWaWRlb0NvZGVjRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0VlA4RW5jICplbmNvZGVyOworICBHc3RWUFhFbmMgKnZweF9lbmM7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RWUDhFbmNVc2VyRGF0YSAqdXNlcl9kYXRhID0gZ3N0X3ZpZGVvX2NvZGVjX2ZyYW1lX2dldF91c2VyX2RhdGEgKGZyYW1lKTsKKyAgR0xpc3QgKmw7CisgIGdpbnQgaW52X2NvdW50OworICBHc3RWaWRlb0luZm8gKmluZm87CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodmlkZW9fZW5jb2RlciwgInByZV9wdXNoIik7CisKKyAgZW5jb2RlciA9IEdTVF9WUDhfRU5DICh2aWRlb19lbmNvZGVyKTsKKyAgdnB4X2VuYyA9IEdTVF9WUFhfRU5DIChlbmNvZGVyKTsKKworICBpbmZvID0gJnZweF9lbmMtPmlucHV0X3N0YXRlLT5pbmZvOworCisgIGdfYXNzZXJ0ICh1c2VyX2RhdGEgIT0gTlVMTCk7CisKKyAgZm9yIChpbnZfY291bnQgPSAwLCBsID0gdXNlcl9kYXRhLT5pbnZpc2libGU7IGw7IGludl9jb3VudCsrLCBsID0gbC0+bmV4dCkgeworICAgIGJ1ZiA9IGwtPmRhdGE7CisgICAgbC0+ZGF0YSA9IE5VTEw7CisKKyAgICAvKiBGSVhNRSA6IEFsbCBvZiB0aGlzIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBoYW5kbGVkIGJ5IGJhc2UgY2xhc3Nlcywgbm8gPyAqLworICAgIGlmIChsID09IHVzZXJfZGF0YS0+aW52aXNpYmxlCisgICAgICAgICYmIEdTVF9WSURFT19DT0RFQ19GUkFNRV9JU19TWU5DX1BPSU5UIChmcmFtZSkpIHsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgICAgICBlbmNvZGVyLT5rZXlmcmFtZV9kaXN0YW5jZSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworICAgICAgZW5jb2Rlci0+a2V5ZnJhbWVfZGlzdGFuY2UrKzsKKyAgICB9CisKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ERUNPREVfT05MWSk7CisgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoZnJhbWUtPm91dHB1dF9idWZmZXIpOworICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikgPSAwOworICAgIGlmIChHU1RfVklERU9fSU5GT19GUFNfRCAoaW5mbykgPT0gMCB8fCBHU1RfVklERU9fSU5GT19GUFNfTiAoaW5mbykgPT0gMCkgeworICAgICAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWYpID0gR1NUX0JVRkZFUl9PRkZTRVRfTk9ORTsKKyAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpID0gR1NUX0JVRkZFUl9PRkZTRVRfTk9ORTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWYpID0KKyAgICAgICAgICBfdG9fZ3JhbnVsZXBvcyAoZnJhbWUtPnByZXNlbnRhdGlvbl9mcmFtZV9udW1iZXIgKyAxLAorICAgICAgICAgIGludl9jb3VudCwgZW5jb2Rlci0+a2V5ZnJhbWVfZGlzdGFuY2UpOworICAgICAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikgPQorICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoZnJhbWUtPnByZXNlbnRhdGlvbl9mcmFtZV9udW1iZXIgKyAxLAorICAgICAgICAgIEdTVF9TRUNPTkQgKiBHU1RfVklERU9fSU5GT19GUFNfRCAoaW5mbyksCisgICAgICAgICAgR1NUX1ZJREVPX0lORk9fRlBTX04gKGluZm8pKTsKKyAgICB9CisKKyAgICByZXQgPSBnc3RfcGFkX3B1c2ggKEdTVF9WSURFT19FTkNPREVSX1NSQ19QQUQgKHZpZGVvX2VuY29kZXIpLCBidWYpOworCisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbmNvZGVyLCAiZmxvdyBlcnJvciAlZCIsIHJldCk7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICB9CisKKyAgYnVmID0gZnJhbWUtPm91dHB1dF9idWZmZXI7CisKKyAgLyogRklYTUUgOiBBbGwgb2YgdGhpcyBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gaGFuZGxlZCBieSBiYXNlIGNsYXNzZXMsIG5vID8gKi8KKyAgaWYgKCF1c2VyX2RhdGEtPmludmlzaWJsZSAmJiBHU1RfVklERU9fQ09ERUNfRlJBTUVfSVNfU1lOQ19QT0lOVCAoZnJhbWUpKSB7CisgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKTsKKyAgICBlbmNvZGVyLT5rZXlmcmFtZV9kaXN0YW5jZSA9IDA7CisgIH0gZWxzZSB7CisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgICAgZW5jb2Rlci0+a2V5ZnJhbWVfZGlzdGFuY2UrKzsKKyAgfQorCisgIGlmIChHU1RfVklERU9fSU5GT19GUFNfRCAoaW5mbykgPT0gMCB8fCBHU1RfVklERU9fSU5GT19GUFNfTiAoaW5mbykgPT0gMCkgeworICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmKSA9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkU7CisgICAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikgPSBHU1RfQlVGRkVSX09GRlNFVF9OT05FOworICB9IGVsc2UgeworICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmKSA9CisgICAgICAgIF90b19ncmFudWxlcG9zIChmcmFtZS0+cHJlc2VudGF0aW9uX2ZyYW1lX251bWJlciArIDEsIDAsCisgICAgICAgIGVuY29kZXItPmtleWZyYW1lX2Rpc3RhbmNlKTsKKyAgICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSA9CisgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoZnJhbWUtPnByZXNlbnRhdGlvbl9mcmFtZV9udW1iZXIgKyAxLAorICAgICAgICBHU1RfU0VDT05EICogR1NUX1ZJREVPX0lORk9fRlBTX0QgKGluZm8pLCBHU1RfVklERU9fSU5GT19GUFNfTiAoaW5mbykpOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHZpZGVvX2VuY29kZXIsICJzcmMgdHM6ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpKSk7CisKK2RvbmU6CisgIHJldHVybiByZXQ7Cit9CisKKyNlbmRpZiAvKiBIQVZFX1ZQOF9FTkNPREVSICovCmRpZmYgLS1naXQgYS9leHQvdnB4L2dzdHZwOGVuYy5oIGIvZXh0L3ZweC9nc3R2cDhlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzMxOWUyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3ZweC9nc3R2cDhlbmMuaApAQCAtMCwwICsxLDczIEBACisvKiBWUDgKKyAqIENvcHlyaWdodCAoQykgMjAwNiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBFbnRyb3B5IFdhdmUgSW5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisjaWZuZGVmIF9fR1NUX1ZQOF9FTkNfSF9fCisjZGVmaW5lIF9fR1NUX1ZQOF9FTkNfSF9fCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmZGVmIEhBVkVfVlA4X0VOQ09ERVIKKworI2luY2x1ZGUgPGdzdHZweGVuYy5oPgorCisvKiBGSVhNRTogVW5kZWYgSEFWRV9DT05GSUdfSCBiZWNhdXNlIHZweF9jb2RlYy5oIHVzZXMgaXQsCisgKiB3aGljaCBjYXVzZXMgY29tcGlsYXRpb24gZmFpbHVyZXMgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjdW5kZWYgSEFWRV9DT05GSUdfSAorI2VuZGlmCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9WUDhfRU5DIFwKKyAgKGdzdF92cDhfZW5jX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WUDhfRU5DKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVlA4X0VOQyxHc3RWUDhFbmMpKQorI2RlZmluZSBHU1RfVlA4X0VOQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WUDhfRU5DLEdzdFZQOEVuY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1ZQOF9FTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WUDhfRU5DKSkKKyNkZWZpbmUgR1NUX0lTX1ZQOF9FTkNfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1ZQOF9FTkMpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0VlA4RW5jIEdzdFZQOEVuYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RWUDhFbmNDbGFzcyBHc3RWUDhFbmNDbGFzczsKKworc3RydWN0IF9Hc3RWUDhFbmMKK3sKKyAgR3N0VlBYRW5jIGJhc2VfdnB4X2VuY29kZXI7CisKKyAgaW50IGtleWZyYW1lX2Rpc3RhbmNlOworfTsKKworc3RydWN0IF9Hc3RWUDhFbmNDbGFzcworeworICBHc3RWUFhFbmNDbGFzcyAgYmFzZV92cHhlbmNfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfdnA4X2VuY19nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgorCisjZW5kaWYgLyogX19HU1RfVlA4X0VOQ19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC92cHgvZ3N0dnA4dXRpbHMuYyBiL2V4dC92cHgvZ3N0dnA4dXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzIxOTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3ZweC9nc3R2cDh1dGlscy5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qIFZQOAorICogQ29weXJpZ2h0IChDKSAyMDA2IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDEwIEVudHJvcHkgV2F2ZSBJbmMKKyAqIENvcHlyaWdodCAoQykgMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisvKiBGSVhNRTogVW5kZWYgSEFWRV9DT05GSUdfSCBiZWNhdXNlIHZweF9jb2RlYy5oIHVzZXMgaXQsCisgKiB3aGljaCBjYXVzZXMgY29tcGlsYXRpb24gZmFpbHVyZXMgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjdW5kZWYgSEFWRV9DT05GSUdfSAorI2VuZGlmCisKKyNpbmNsdWRlIDx2cHgvdnB4X2NvZGVjLmg+CisKKyNpbmNsdWRlICJnc3R2cDh1dGlscy5oIgorCitjb25zdCBjaGFyICoKK2dzdF92cHhfZXJyb3JfbmFtZSAodnB4X2NvZGVjX2Vycl90IHN0YXR1cykKK3sKKyAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICBjYXNlIFZQWF9DT0RFQ19PSzoKKyAgICAgIHJldHVybiAiT0siOworICAgIGNhc2UgVlBYX0NPREVDX0VSUk9SOgorICAgICAgcmV0dXJuICJlcnJvciI7CisgICAgY2FzZSBWUFhfQ09ERUNfTUVNX0VSUk9SOgorICAgICAgcmV0dXJuICJtZW0gZXJyb3IiOworICAgIGNhc2UgVlBYX0NPREVDX0FCSV9NSVNNQVRDSDoKKyAgICAgIHJldHVybiAiYWJpIG1pc21hdGNoIjsKKyAgICBjYXNlIFZQWF9DT0RFQ19JTkNBUEFCTEU6CisgICAgICByZXR1cm4gImluY2FwYWJsZSI7CisgICAgY2FzZSBWUFhfQ09ERUNfVU5TVVBfQklUU1RSRUFNOgorICAgICAgcmV0dXJuICJ1bnN1cHBvcnRlZCBiaXRzdHJlYW0iOworICAgIGNhc2UgVlBYX0NPREVDX1VOU1VQX0ZFQVRVUkU6CisgICAgICByZXR1cm4gInVuc3VwcG9ydGVkIGZlYXR1cmUiOworICAgIGNhc2UgVlBYX0NPREVDX0NPUlJVUFRfRlJBTUU6CisgICAgICByZXR1cm4gImNvcnJ1cHQgZnJhbWUiOworICAgIGNhc2UgVlBYX0NPREVDX0lOVkFMSURfUEFSQU06CisgICAgICByZXR1cm4gImludmFsaWQgcGFyYW1ldGVyIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJ1bmtub3duIjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L3ZweC9nc3R2cDh1dGlscy5oIGIvZXh0L3ZweC9nc3R2cDh1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNDVkZjEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvdnB4L2dzdHZwOHV0aWxzLmgKQEAgLTAsMCArMSwzMCBAQAorLyogVlA4CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRW50cm9weSBXYXZlIEluYworICogQ29weXJpZ2h0IChDKSAyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPHZweC92cHhfY29kZWMuaD4KKworR19CRUdJTl9ERUNMUworCitjb25zdCBjaGFyICogZ3N0X3ZweF9lcnJvcl9uYW1lICh2cHhfY29kZWNfZXJyX3Qgc3RhdHVzKTsKKworR19FTkRfREVDTFMKZGlmZiAtLWdpdCBhL2V4dC92cHgvZ3N0dnA5ZGVjLmMgYi9leHQvdnB4L2dzdHZwOWRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YmIwZmIKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvdnB4L2dzdHZwOWRlYy5jCkBAIC0wLDAgKzEsMjE5IEBACisvKiBWUDkKKyAqIENvcHlyaWdodCAoQykgMjAwNiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwyMDA5LDIwMTAgRW50cm9weSBXYXZlIEluYworICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtdnA5ZGVjCisgKiBAc2VlX2Fsc286IHZwOWVuYywgbWF0cm9za2FkZW11eAorICoKKyAqIFRoaXMgZWxlbWVudCBkZWNvZGVzIFZQOSBzdHJlYW1zIGludG8gcmF3IHZpZGVvLgorICogPHVsaW5rIHVybD0iaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmciPlZQOTwvdWxpbms+IGlzIGEgcm95YWx0eS1mcmVlCisgKiB2aWRlbyBjb2RlYyBtYWludGFpbmVkIGJ5IDx1bGluayB1cmw9Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8iPkdvb2dsZQorICogPC91bGluaz4uIEl0J3MgdGhlIHN1Y2Nlc3NvciBvZiBPbjIgVlAzLCB3aGljaCB3YXMgdGhlIGJhc2Ugb2YgdGhlCisgKiBUaGVvcmEgdmlkZW8gY29kZWMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGZpbGVzcmMgbG9jYXRpb249dmlkZW90ZXN0c3JjLndlYm0gISBtYXRyb3NrYWRlbXV4ICEgdnA5ZGVjICEgdmlkZW9jb252ZXJ0ICEgdmlkZW9zY2FsZSAhIGF1dG92aWRlb3NpbmsKKyAqIF18IFRoaXMgZXhhbXBsZSBwaXBlbGluZSB3aWxsIGRlY29kZSBhIFdlYk0gc3RyZWFtIGFuZCBkZWNvZGVzIHRoZSBWUDkgdmlkZW8uCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmZGVmIEhBVkVfVlA5X0RFQ09ERVIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0dnA4dXRpbHMuaCIKKyNpbmNsdWRlICJnc3R2cDlkZWMuaCIKKworI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb21ldGEuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9wb29sLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF92cDlkZWNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3ZwOWRlY19kZWJ1ZworCisjZGVmaW5lIFZQOV9ERUNPREVSX1ZJREVPX1RBRyAiVlA5IHZpZGVvIgorCitzdGF0aWMgdm9pZCBnc3RfdnA5X2RlY19zZXRfc3RyZWFtX2luZm8gKEdzdFZQWERlYyAqIGRlYywKKyAgICB2cHhfY29kZWNfc3RyZWFtX2luZm9fdCAqIHN0cmVhbV9pbmZvKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdnA5X2RlY19nZXRfdmFsaWRfZm9ybWF0IChHc3RWUFhEZWMgKiBkZWMsCisgICAgdnB4X2ltYWdlX3QgKiBpbWcsIEdzdFZpZGVvRm9ybWF0ICogZm10KTsKK3N0YXRpYyB2b2lkIGdzdF92cDlfZGVjX2hhbmRsZV9yZXNvbHV0aW9uX2NoYW5nZSAoR3N0VlBYRGVjICogZGVjLAorICAgIHZweF9pbWFnZV90ICogaW1nLCBHc3RWaWRlb0Zvcm1hdCBmbXQpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3ZwOV9kZWNfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXZwOSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF92cDlfZGVjX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBJNDIwLCBZVjEyLCBZNDJCLCBZNDQ0IH0iKSkKKyAgICApOworCisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3RfdnA5X2RlY19wYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFZQOURlYywgZ3N0X3ZwOV9kZWMsIEdTVF9UWVBFX1ZQWF9ERUMpOworCitzdGF0aWMgdm9pZAorZ3N0X3ZwOV9kZWNfY2xhc3NfaW5pdCAoR3N0VlA5RGVjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworICBHc3RWUFhEZWNDbGFzcyAqdnB4X2NsYXNzOworCisgIGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICB2cHhfY2xhc3MgPSBHU1RfVlBYX0RFQ19DTEFTUyAoa2xhc3MpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF92cDlfZGVjX3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF92cDlfZGVjX3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiT24yIFZQOSBEZWNvZGVyIiwKKyAgICAgICJDb2RlYy9EZWNvZGVyL1ZpZGVvIiwKKyAgICAgICJEZWNvZGUgVlA5IHZpZGVvIHN0cmVhbXMiLCAiRGF2aWQgU2NobGVlZiA8ZHNAZW50cm9weXdhdmUuY29tPiwgIgorICAgICAgIlNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPiIpOworCisgIHZweF9jbGFzcy0+dmlkZW9fY29kZWNfdGFnID0gVlA5X0RFQ09ERVJfVklERU9fVEFHOworICB2cHhfY2xhc3MtPmNvZGVjX2FsZ28gPSAmdnB4X2NvZGVjX3ZwOV9keF9hbGdvOworICB2cHhfY2xhc3MtPnNldF9zdHJlYW1faW5mbyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdnA5X2RlY19zZXRfc3RyZWFtX2luZm8pOworICB2cHhfY2xhc3MtPmdldF9mcmFtZV9mb3JtYXQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92cDlfZGVjX2dldF92YWxpZF9mb3JtYXQpOworICB2cHhfY2xhc3MtPmhhbmRsZV9yZXNvbHV0aW9uX2NoYW5nZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3ZwOV9kZWNfaGFuZGxlX3Jlc29sdXRpb25fY2hhbmdlKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3ZwOWRlY19kZWJ1ZywgInZwOWRlYyIsIDAsICJWUDkgRGVjb2RlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZwOV9kZWNfaW5pdCAoR3N0VlA5RGVjICogZ3N0X3ZwOV9kZWMpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGdzdF92cDlfZGVjLCAiZ3N0X3ZwOV9kZWNfaW5pdCIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZwOV9kZWNfc2V0X3N0cmVhbV9pbmZvIChHc3RWUFhEZWMgKiBkZWMsCisgICAgdnB4X2NvZGVjX3N0cmVhbV9pbmZvX3QgKiBzdHJlYW1faW5mbykKK3sKKyAgLyogRklYTUU6IHBlZWtfc3RyZWFtX2luZm8oKSBkb2VzIG5vdCByZXR1cm4gdmFsaWQgdmFsdWVzLCB0YWtlIGlucHV0IGNhcHMgKi8KKyAgc3RyZWFtX2luZm8tPncgPSBkZWMtPmlucHV0X3N0YXRlLT5pbmZvLndpZHRoOworICBzdHJlYW1faW5mby0+aCA9IGRlYy0+aW5wdXRfc3RhdGUtPmluZm8uaGVpZ2h0OworICByZXR1cm47Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZwOV9kZWNfZ2V0X3ZhbGlkX2Zvcm1hdCAoR3N0VlBYRGVjICogZGVjLCB2cHhfaW1hZ2VfdCAqIGltZywKKyAgICBHc3RWaWRlb0Zvcm1hdCAqIGZtdCkKK3sKKyAgc3dpdGNoIChpbWctPmZtdCkgeworICAgIGNhc2UgVlBYX0lNR19GTVRfSTQyMDoKKyAgICAgICpmbXQgPSBHU1RfVklERU9fRk9STUFUX0k0MjA7CisgICAgICByZXR1cm4gVFJVRTsKKworICAgIGNhc2UgVlBYX0lNR19GTVRfWVYxMjoKKyAgICAgICpmbXQgPSBHU1RfVklERU9fRk9STUFUX1lWMTI7CisgICAgICByZXR1cm4gVFJVRTsKKworICAgIGNhc2UgVlBYX0lNR19GTVRfSTQyMjoKKyAgICAgICpmbXQgPSBHU1RfVklERU9fRk9STUFUX1k0MkI7CisgICAgICByZXR1cm4gVFJVRTsKKworICAgIGNhc2UgVlBYX0lNR19GTVRfSTQ0NDoKKyAgICAgICpmbXQgPSBHU1RfVklERU9fRk9STUFUX1k0NDQ7CisgICAgICByZXR1cm4gVFJVRTsKKyNpZmRlZiBWUFhfSU1HX0ZNVF9JNDQwCisgICAgY2FzZSBWUFhfSU1HX0ZNVF9JNDQwOgorICAgICAgLyogUGxhbmFyLCBoYWxmIGhlaWdodCwgZnVsbCB3aWR0aCBVL1YgKi8KKyAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKGRlYywgIlBsZWFzZSBhZGQgYSA0OjQ6MCBwbGFuYXIgZnJhbWUgZm9ybWF0Iik7CisgICAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChkZWMsIFNUUkVBTSwgTk9UX0lNUExFTUVOVEVELAorICAgICAgICAgIChOVUxMKSwgKCJVbnN1cHBvcnRlZCBmcmFtZSBmb3JtYXQgLSA0OjQ6MCBwbGFuYXIiKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisjZW5kaWYKKyNpZmRlZiBWUFhfSU1HX0ZNVF9JNDIwMTYKKyAgICBjYXNlIFZQWF9JTUdfRk1UX0k0MjAxNjoKKyAgICAgIC8qIFZQWF9JTUdfRk1UX0k0MjAgfCBWUFhfSU1HX0ZNVF9ISUdIQklUREVQVEggKi8KKyAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKGRlYywgIlBsZWFzZSBhZGQgMTYtYml0IEk0MjAgZm9ybWF0Iik7CisgICAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChkZWMsIFNUUkVBTSwgTk9UX0lNUExFTUVOVEVELAorICAgICAgICAgIChOVUxMKSwgKCJVbnN1cHBvcnRlZCBmcmFtZSBmb3JtYXQgLSAxNi1iaXQgNDoyOjAgcGxhbmFyIikpOworICAgICAgcmV0dXJuIEZBTFNFOworI2VuZGlmCisjaWZkZWYgVlBYX0lNR19GTVRfSTQyMjE2CisgICAgY2FzZSBWUFhfSU1HX0ZNVF9JNDIyMTY6CisgICAgICAvKiBWUFhfSU1HX0ZNVF9JNDIyIHwgVlBYX0lNR19GTVRfSElHSEJJVERFUFRIICovCisgICAgICBHU1RfRklYTUVfT0JKRUNUIChkZWMsICJQbGVhc2UgYWRkIDE2LWJpdCBZNDJCIGZvcm1hdCIpOworICAgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoZGVjLCBTVFJFQU0sIE5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAoTlVMTCksICgiVW5zdXBwb3J0ZWQgZnJhbWUgZm9ybWF0IC0gMTYtYml0IDQ6MjoyIHBsYW5hciIpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorI2lmZGVmIFZQWF9JTUdfRk1UX0k0NDQxNgorICAgIGNhc2UgVlBYX0lNR19GTVRfSTQ0NDE2OgorICAgICAgLyogVlBYX0lNR19GTVRfSTQ0NCB8IFZQWF9JTUdfRk1UX0hJR0hCSVRERVBUSCAqLworICAgICAgR1NUX0ZJWE1FX09CSkVDVCAoZGVjLCAiUGxlYXNlIGFkZCAxNi1iaXQgWTQ0NCBmb3JtYXQiKTsKKyAgICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKGRlYywgU1RSRUFNLCBOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgKE5VTEwpLCAoIlVuc3VwcG9ydGVkIGZyYW1lIGZvcm1hdCAtIDE2LWJpdCA0OjQ6NCBwbGFuYXIiKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisjZW5kaWYKKyNpZmRlZiBWUFhfSU1HX0ZNVF9JNDQwMTYKKyAgICBjYXNlIFZQWF9JTUdfRk1UX0k0NDAxNjoKKyAgICAgIC8qIFZQWF9JTUdfRk1UX0k0NDAgfCBWUFhfSU1HX0ZNVF9ISUdIQklUREVQVEggKi8KKyAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKGRlYywgIlBsZWFzZSBhZGQgMTYtYml0IDQ6NDowIHBsYW5hciBmcmFtZSBmb3JtYXQiKTsKKyAgICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKGRlYywgU1RSRUFNLCBOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgKE5VTEwpLCAoIlVuc3VwcG9ydGVkIGZyYW1lIGZvcm1hdCAtIDE2LWJpdCA0OjQ6MCBwbGFuYXIiKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnA5X2RlY19oYW5kbGVfcmVzb2x1dGlvbl9jaGFuZ2UgKEdzdFZQWERlYyAqIGRlYywgdnB4X2ltYWdlX3QgKiBpbWcsCisgICAgR3N0VmlkZW9Gb3JtYXQgZm10KQoreworICBHc3RWUFhEZWNDbGFzcyAqdnB4Y2xhc3MgPSBHU1RfVlBYX0RFQ19HRVRfQ0xBU1MgKGRlYyk7CisKKyAgaWYgKCFkZWMtPm91dHB1dF9zdGF0ZSB8fCBkZWMtPm91dHB1dF9zdGF0ZS0+aW5mby5maW5mby0+Zm9ybWF0ICE9IGZtdCB8fAorICAgICAgZGVjLT5vdXRwdXRfc3RhdGUtPmluZm8ud2lkdGggIT0gaW1nLT5kX3cgfHwKKyAgICAgIGRlYy0+b3V0cHV0X3N0YXRlLT5pbmZvLmhlaWdodCAhPSBpbWctPmRfaCkgeworICAgIGdib29sZWFuIHNlbmRfdGFncyA9ICFkZWMtPm91dHB1dF9zdGF0ZTsKKworICAgIGlmIChkZWMtPm91dHB1dF9zdGF0ZSkKKyAgICAgIGdzdF92aWRlb19jb2RlY19zdGF0ZV91bnJlZiAoZGVjLT5vdXRwdXRfc3RhdGUpOworCisgICAgZGVjLT5vdXRwdXRfc3RhdGUgPQorICAgICAgICBnc3RfdmlkZW9fZGVjb2Rlcl9zZXRfb3V0cHV0X3N0YXRlIChHU1RfVklERU9fREVDT0RFUiAoZGVjKSwKKyAgICAgICAgZm10LCBpbWctPmRfdywgaW1nLT5kX2gsIGRlYy0+aW5wdXRfc3RhdGUpOworICAgIGdzdF92aWRlb19kZWNvZGVyX25lZ290aWF0ZSAoR1NUX1ZJREVPX0RFQ09ERVIgKGRlYykpOworCisgICAgaWYgKHNlbmRfdGFncykKKyAgICAgIHZweGNsYXNzLT5zZW5kX3RhZ3MgKGRlYyk7CisgIH0KK30KKworI2VuZGlmIC8qIEhBVkVfVlA5X0RFQ09ERVIgKi8KZGlmZiAtLWdpdCBhL2V4dC92cHgvZ3N0dnA5ZGVjLmggYi9leHQvdnB4L2dzdHZwOWRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMzMyZjMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvdnB4L2dzdHZwOWRlYy5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qIFZQOQorICogQ29weXJpZ2h0IChDKSAyMDA2IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4LDIwMDksMjAxMCBFbnRyb3B5IFdhdmUgSW5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX19HU1RfVlA5X0RFQ19IX18KKyNkZWZpbmUgX19HU1RfVlA5X0RFQ19IX18KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9WUDlfREVDT0RFUgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2RlY29kZXIuaD4KKyNpbmNsdWRlIDxnc3R2cHhkZWMuaD4KKworLyogRklYTUU6IFVuZGVmIEhBVkVfQ09ORklHX0ggYmVjYXVzZSB2cHhfY29kZWMuaCB1c2VzIGl0LAorICogd2hpY2ggY2F1c2VzIGNvbXBpbGF0aW9uIGZhaWx1cmVzICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI3VuZGVmIEhBVkVfQ09ORklHX0gKKyNlbmRpZgorCisjaW5jbHVkZSA8dnB4L3ZweF9kZWNvZGVyLmg+CisjaW5jbHVkZSA8dnB4L3ZwOGR4Lmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9WUDlfREVDIFwKKyAgKGdzdF92cDlfZGVjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WUDlfREVDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVlA5X0RFQyxHc3RWUDlEZWMpKQorI2RlZmluZSBHU1RfVlA5X0RFQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WUDlfREVDLEdzdFZQOURlY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1ZQOV9ERUMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WUDlfREVDKSkKKyNkZWZpbmUgR1NUX0lTX1ZQOV9ERUNfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1ZQOV9ERUMpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0VlA5RGVjIEdzdFZQOURlYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RWUDlEZWNDbGFzcyBHc3RWUDlEZWNDbGFzczsKKworc3RydWN0IF9Hc3RWUDlEZWMKK3sKKyAgR3N0VlBYRGVjIGJhc2VfdnB4X2RlY29kZXI7Cit9OworCitzdHJ1Y3QgX0dzdFZQOURlY0NsYXNzCit7CisgIEdzdFZQWERlY0NsYXNzIGJhc2VfdnB4X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3ZwOV9kZWNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYKKworI2VuZGlmIC8qIF9fR1NUX1ZQOV9ERUNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvdnB4L2dzdHZwOWVuYy5jIGIvZXh0L3ZweC9nc3R2cDllbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDhmOWEyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3ZweC9nc3R2cDllbmMuYwpAQCAtMCwwICsxLDI1MiBAQAorLyogVlA5CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRW50cm9weSBXYXZlIEluYworICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtdnA5ZW5jCisgKiBAc2VlX2Fsc286IHZwOWRlYywgd2VibW11eCwgb2dnbXV4CisgKgorICogVGhpcyBlbGVtZW50IGVuY29kZXMgcmF3IHZpZGVvIGludG8gYSBWUDkgc3RyZWFtLgorICogPHVsaW5rIHVybD0iaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmciPlZQOTwvdWxpbms+IGlzIGEgcm95YWx0eS1mcmVlCisgKiB2aWRlbyBjb2RlYyBtYWludGFpbmVkIGJ5IDx1bGluayB1cmw9Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8iPkdvb2dsZQorICogPC91bGluaz4uIEl0J3MgdGhlIHN1Y2Nlc3NvciBvZiBPbjIgVlAzLCB3aGljaCB3YXMgdGhlIGJhc2Ugb2YgdGhlCisgKiBUaGVvcmEgdmlkZW8gY29kZWMuCisgKgorICogVG8gY29udHJvbCB0aGUgcXVhbGl0eSBvZiB0aGUgZW5jb2RpbmcsIHRoZSAjR3N0VlA5RW5jOjp0YXJnZXQtYml0cmF0ZSwKKyAqICNHc3RWUDlFbmM6Om1pbi1xdWFudGl6ZXIsICNHc3RWUDlFbmM6Om1heC1xdWFudGl6ZXIgb3IgI0dzdFZQOUVuYzo6Y3EtbGV2ZWwKKyAqIHByb3BlcnRpZXMgY2FuIGJlIHVzZWQuIFdoaWNoIG9uZSBpcyB1c2VkIGRlcGVuZHMgb24gdGhlIG1vZGUgc2VsZWN0ZWQgYnkKKyAqIHRoZSAjR3N0VlA5RW5jOjplbmQtdXNhZ2UgcHJvcGVydHkuCisgKiBTZWUgPHVsaW5rIHVybD0iaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvZG9jcy9lbmNvZGVyLXBhcmFtZXRlcnMvIj5FbmNvZGVyIFBhcmFtZXRlcnM8L3VsaW5rPgorICogZm9yIGV4cGxhbmF0aW9uLCBleGFtcGxlcyBmb3IgdXNlZnVsIGVuY29kaW5nIHBhcmFtZXRlcnMgYW5kIG1vcmUgZGV0YWlscworICogb24gdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz0xMDAwICEgdnA5ZW5jICEgd2VibW11eCAhIGZpbGVzaW5rIGxvY2F0aW9uPXZpZGVvdGVzdHNyYy53ZWJtCisgKiBdfCBUaGlzIGV4YW1wbGUgcGlwZWxpbmUgd2lsbCBlbmNvZGUgYSB0ZXN0IHZpZGVvIHNvdXJjZSB0byBWUDkgbXV4ZWQgaW4gYW4KKyAqIFdlYk0gY29udGFpbmVyLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1ZQOV9FTkNPREVSCisKKy8qIGdsaWIgZGVjaWRlZCBpbiAyLjMyIGl0IHdvdWxkIGJlIGEgZ3JlYXQgaWRlYSB0byBkZXByZWNhdGVkIEdWYWx1ZUFycmF5IHdpdGhvdXQKKyAqIHByb3ZpZGluZyBhbiBhbHRlcm5hdGl2ZQorICoKKyAqIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY3MjI4CisgKiAqLworI2RlZmluZSBHTElCX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKworI2luY2x1ZGUgPGdzdC90YWcvdGFnLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3R2cDh1dGlscy5oIgorI2luY2x1ZGUgImdzdHZwOWVuYy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfdnA5ZW5jX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF92cDllbmNfZGVidWcKKworCisvKiBGSVhNRTogWTQyQiBhbmQgWTQ0NCBkbyBub3Qgd29yayB5ZXQgaXQgc2VlbXMgKi8KK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfdnA5X2VuY19zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIC8qR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBJNDIwLCBZVjEyLCBZNDJCLCBZNDQ0IH0iKSkgKi8KKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IEk0MjAsIFlWMTIgfSIpKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfdnA5X2VuY19zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtdnA5LCAiICJwcm9maWxlID0gKHN0cmluZykgezAsIDEsIDIsIDN9IikKKyAgICApOworCisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3RfdnA5X2VuY19wYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFZQOUVuYywgZ3N0X3ZwOV9lbmMsIEdTVF9UWVBFX1ZQWF9FTkMpOworCitzdGF0aWMgdnB4X2NvZGVjX2lmYWNlX3QgKmdzdF92cDlfZW5jX2dldF9hbGdvIChHc3RWUFhFbmMgKiBlbmMpOworc3RhdGljIGdib29sZWFuIGdzdF92cDlfZW5jX2VuYWJsZV9zY2FsaW5nIChHc3RWUFhFbmMgKiBlbmMpOworc3RhdGljIHZvaWQgZ3N0X3ZwOV9lbmNfc2V0X2ltYWdlX2Zvcm1hdCAoR3N0VlBYRW5jICogZW5jLCB2cHhfaW1hZ2VfdCAqIGltYWdlKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfdnA5X2VuY19nZXRfbmV3X3NpbXBsZV9jYXBzIChHc3RWUFhFbmMgKiBlbmMpOworc3RhdGljIHZvaWQgZ3N0X3ZwOV9lbmNfc2V0X3N0cmVhbV9pbmZvIChHc3RWUFhFbmMgKiBlbmMsIEdzdENhcHMgKiBjYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluZm8pOworc3RhdGljIHZvaWQgKmdzdF92cDlfZW5jX3Byb2Nlc3NfZnJhbWVfdXNlcl9kYXRhIChHc3RWUFhFbmMgKiBlbmMsCisgICAgR3N0VmlkZW9Db2RlY0ZyYW1lICogZnJhbWUpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3ZwOV9lbmNfaGFuZGxlX2ludmlzaWJsZV9mcmFtZV9idWZmZXIgKEdzdFZQWEVuYyAqIGVuYywKKyAgICB2b2lkICp1c2VyX2RhdGEsIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CitzdGF0aWMgdm9pZCBnc3RfdnA5X2VuY19zZXRfZnJhbWVfdXNlcl9kYXRhIChHc3RWUFhFbmMgKiBlbmMsCisgICAgR3N0VmlkZW9Db2RlY0ZyYW1lICogZnJhbWUsIHZweF9pbWFnZV90ICogaW1hZ2UpOworCitzdGF0aWMgdm9pZAorZ3N0X3ZwOV9lbmNfY2xhc3NfaW5pdCAoR3N0VlA5RW5jQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworICBHc3RWUFhFbmNDbGFzcyAqdnB4X2VuY29kZXJfY2xhc3M7CisKKyAgZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIHZweF9lbmNvZGVyX2NsYXNzID0gR1NUX1ZQWF9FTkNfQ0xBU1MgKGtsYXNzKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfdnA5X2VuY19zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfdnA5X2VuY19zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIk9uMiBWUDkgRW5jb2RlciIsCisgICAgICAiQ29kZWMvRW5jb2Rlci9WaWRlbyIsCisgICAgICAiRW5jb2RlIFZQOSB2aWRlbyBzdHJlYW1zIiwgIkRhdmlkIFNjaGxlZWYgPGRzQGVudHJvcHl3YXZlLmNvbT4sICIKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4iKTsKKworICB2cHhfZW5jb2Rlcl9jbGFzcy0+Z2V0X2FsZ28gPSBnc3RfdnA5X2VuY19nZXRfYWxnbzsKKyAgdnB4X2VuY29kZXJfY2xhc3MtPmVuYWJsZV9zY2FsaW5nID0gZ3N0X3ZwOV9lbmNfZW5hYmxlX3NjYWxpbmc7CisgIHZweF9lbmNvZGVyX2NsYXNzLT5zZXRfaW1hZ2VfZm9ybWF0ID0gZ3N0X3ZwOV9lbmNfc2V0X2ltYWdlX2Zvcm1hdDsKKyAgdnB4X2VuY29kZXJfY2xhc3MtPmdldF9uZXdfdnB4X2NhcHMgPSBnc3RfdnA5X2VuY19nZXRfbmV3X3NpbXBsZV9jYXBzOworICB2cHhfZW5jb2Rlcl9jbGFzcy0+c2V0X3N0cmVhbV9pbmZvID0gZ3N0X3ZwOV9lbmNfc2V0X3N0cmVhbV9pbmZvOworICB2cHhfZW5jb2Rlcl9jbGFzcy0+cHJvY2Vzc19mcmFtZV91c2VyX2RhdGEgPQorICAgICAgZ3N0X3ZwOV9lbmNfcHJvY2Vzc19mcmFtZV91c2VyX2RhdGE7CisgIHZweF9lbmNvZGVyX2NsYXNzLT5oYW5kbGVfaW52aXNpYmxlX2ZyYW1lX2J1ZmZlciA9CisgICAgICBnc3RfdnA5X2VuY19oYW5kbGVfaW52aXNpYmxlX2ZyYW1lX2J1ZmZlcjsKKyAgdnB4X2VuY29kZXJfY2xhc3MtPnNldF9mcmFtZV91c2VyX2RhdGEgPSBnc3RfdnA5X2VuY19zZXRfZnJhbWVfdXNlcl9kYXRhOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfdnA5ZW5jX2RlYnVnLCAidnA5ZW5jIiwgMCwgIlZQOSBFbmNvZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnA5X2VuY19pbml0IChHc3RWUDlFbmMgKiBnc3RfdnA5X2VuYykKK3sKKyAgdnB4X2NvZGVjX2Vycl90IHN0YXR1czsKKyAgR3N0VlBYRW5jICpnc3RfdnB4X2VuYyA9IEdTVF9WUFhfRU5DIChnc3RfdnA5X2VuYyk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGdzdF92cDlfZW5jLCAiZ3N0X3ZwOV9lbmNfaW5pdCIpOworICBzdGF0dXMgPQorICAgICAgdnB4X2NvZGVjX2VuY19jb25maWdfZGVmYXVsdCAoZ3N0X3ZwOV9lbmNfZ2V0X2FsZ28gKGdzdF92cHhfZW5jKSwKKyAgICAgICZnc3RfdnB4X2VuYy0+Y2ZnLCAwKTsKKyAgaWYgKHN0YXR1cyAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChnc3RfdnB4X2VuYywKKyAgICAgICAgIkZhaWxlZCB0byBnZXQgZGVmYXVsdCBlbmNvZGVyIGNvbmZpZ3VyYXRpb246ICVzIiwKKyAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgICBnc3RfdnB4X2VuYy0+aGF2ZV9kZWZhdWx0X2NvbmZpZyA9IEZBTFNFOworICB9IGVsc2UgeworICAgIGdzdF92cHhfZW5jLT5oYXZlX2RlZmF1bHRfY29uZmlnID0gVFJVRTsKKyAgfQorfQorCitzdGF0aWMgdnB4X2NvZGVjX2lmYWNlX3QgKgorZ3N0X3ZwOV9lbmNfZ2V0X2FsZ28gKEdzdFZQWEVuYyAqIGVuYykKK3sKKyAgcmV0dXJuICZ2cHhfY29kZWNfdnA5X2N4X2FsZ287Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZwOV9lbmNfZW5hYmxlX3NjYWxpbmcgKEdzdFZQWEVuYyAqIGVuYykKK3sKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZwOV9lbmNfc2V0X2ltYWdlX2Zvcm1hdCAoR3N0VlBYRW5jICogZW5jLCB2cHhfaW1hZ2VfdCAqIGltYWdlKQoreworICBzd2l0Y2ggKGVuYy0+aW5wdXRfc3RhdGUtPmluZm8uZmluZm8tPmZvcm1hdCkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9JNDIwOgorICAgICAgaW1hZ2UtPmZtdCA9IFZQWF9JTUdfRk1UX0k0MjA7CisgICAgICBpbWFnZS0+YnBzID0gMTI7CisgICAgICBpbWFnZS0+eF9jaHJvbWFfc2hpZnQgPSBpbWFnZS0+eV9jaHJvbWFfc2hpZnQgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWMTI6CisgICAgICBpbWFnZS0+Zm10ID0gVlBYX0lNR19GTVRfWVYxMjsKKyAgICAgIGltYWdlLT5icHMgPSAxMjsKKyAgICAgIGltYWdlLT54X2Nocm9tYV9zaGlmdCA9IGltYWdlLT55X2Nocm9tYV9zaGlmdCA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQyQjoKKyAgICAgIGltYWdlLT5mbXQgPSBWUFhfSU1HX0ZNVF9JNDIyOworICAgICAgaW1hZ2UtPmJwcyA9IDE2OworICAgICAgaW1hZ2UtPnhfY2hyb21hX3NoaWZ0ID0gMTsKKyAgICAgIGltYWdlLT55X2Nocm9tYV9zaGlmdCA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQ0NDoKKyAgICAgIGltYWdlLT5mbXQgPSBWUFhfSU1HX0ZNVF9JNDQ0OworICAgICAgaW1hZ2UtPmJwcyA9IDI0OworICAgICAgaW1hZ2UtPnhfY2hyb21hX3NoaWZ0ID0gaW1hZ2UtPnlfY2hyb21hX3NoaWZ0ID0gMDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF92cDlfZW5jX2dldF9uZXdfc2ltcGxlX2NhcHMgKEdzdFZQWEVuYyAqIGVuYykKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2NoYXIgKnByb2ZpbGVfc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiJWQiLCBlbmMtPmNmZy5nX3Byb2ZpbGUpOworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtdnA5IiwKKyAgICAgICJwcm9maWxlIiwgR19UWVBFX1NUUklORywgcHJvZmlsZV9zdHIsIE5VTEwpOworICBnX2ZyZWUgKHByb2ZpbGVfc3RyKTsKKyAgcmV0dXJuIGNhcHM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnA5X2VuY19zZXRfc3RyZWFtX2luZm8gKEdzdFZQWEVuYyAqIGVuYywgR3N0Q2FwcyAqIGNhcHMsCisgICAgR3N0VmlkZW9JbmZvICogaW5mbykKK3sKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCAqCitnc3RfdnA5X2VuY19wcm9jZXNzX2ZyYW1lX3VzZXJfZGF0YSAoR3N0VlBYRW5jICogZW5jLAorICAgIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lKQoreworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92cDlfZW5jX2hhbmRsZV9pbnZpc2libGVfZnJhbWVfYnVmZmVyIChHc3RWUFhFbmMgKiBlbmMsIHZvaWQgKnVzZXJfZGF0YSwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBnX211dGV4X3VubG9jayAoJmVuYy0+ZW5jb2Rlcl9sb2NrKTsKKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChHU1RfVklERU9fRU5DT0RFUl9TUkNfUEFEIChlbmMpLCBidWZmZXIpOworICBnX211dGV4X2xvY2sgKCZlbmMtPmVuY29kZXJfbG9jayk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnA5X2VuY191c2VyX2RhdGFfZnJlZSAodnB4X2ltYWdlX3QgKiBpbWFnZSkKK3sKKyAgZ19zbGljZV9mcmVlICh2cHhfaW1hZ2VfdCwgaW1hZ2UpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZwOV9lbmNfc2V0X2ZyYW1lX3VzZXJfZGF0YSAoR3N0VlBYRW5jICogZW5jLCBHc3RWaWRlb0NvZGVjRnJhbWUgKiBmcmFtZSwKKyAgICB2cHhfaW1hZ2VfdCAqIGltYWdlKQoreworICBnc3RfdmlkZW9fY29kZWNfZnJhbWVfc2V0X3VzZXJfZGF0YSAoZnJhbWUsIGltYWdlLAorICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnc3RfdnA5X2VuY191c2VyX2RhdGFfZnJlZSk7CisgIHJldHVybjsKK30KKworI2VuZGlmIC8qIEhBVkVfVlA5X0VOQ09ERVIgKi8KZGlmZiAtLWdpdCBhL2V4dC92cHgvZ3N0dnA5ZW5jLmggYi9leHQvdnB4L2dzdHZwOWVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MzM3MmIKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvdnB4L2dzdHZwOWVuYy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qIFZQOQorICogQ29weXJpZ2h0IChDKSAyMDA2IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDEwIEVudHJvcHkgV2F2ZSBJbmMKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKyNpZm5kZWYgX19HU1RfVlA5X0VOQ19IX18KKyNkZWZpbmUgX19HU1RfVlA5X0VOQ19IX18KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9WUDlfRU5DT0RFUgorCisjaW5jbHVkZSA8Z3N0dnB4ZW5jLmg+CisKKy8qIEZJWE1FOiBVbmRlZiBIQVZFX0NPTkZJR19IIGJlY2F1c2UgdnB4X2NvZGVjLmggdXNlcyBpdCwKKyAqIHdoaWNoIGNhdXNlcyBjb21waWxhdGlvbiBmYWlsdXJlcyAqLworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyN1bmRlZiBIQVZFX0NPTkZJR19ICisjZW5kaWYKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1ZQOV9FTkMgXAorICAoZ3N0X3ZwOV9lbmNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1ZQOV9FTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9WUDlfRU5DLEdzdFZQOUVuYykpCisjZGVmaW5lIEdTVF9WUDlfRU5DX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1ZQOV9FTkMsR3N0VlA5RW5jQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVlA5X0VOQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1ZQOV9FTkMpKQorI2RlZmluZSBHU1RfSVNfVlA5X0VOQ19DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVlA5X0VOQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWUDlFbmMgR3N0VlA5RW5jOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZQOUVuY0NsYXNzIEdzdFZQOUVuY0NsYXNzOworCitzdHJ1Y3QgX0dzdFZQOUVuYworeworCUdzdFZQWEVuYyBiYXNlX3ZweF9lbmNvZGVyOworfTsKKworc3RydWN0IF9Hc3RWUDlFbmNDbGFzcworeworICBHc3RWUFhFbmNDbGFzcyAgYmFzZV92cHhlbmNfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfdnA5X2VuY19nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgorCisjZW5kaWYgLyogX19HU1RfVlA5X0VOQ19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC92cHgvZ3N0dnB4ZGVjLmMgYi9leHQvdnB4L2dzdHZweGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZjBmNjIKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvdnB4L2dzdHZweGRlYy5jCkBAIC0wLDAgKzEsODIwIEBACisvKiBWUFgKKyAqIENvcHlyaWdodCAoQykgMjAwNiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwyMDA5LDIwMTAgRW50cm9weSBXYXZlIEluYworICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTIgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQoSEFWRV9WUDhfREVDT0RFUikgfHwgZGVmaW5lZChIQVZFX1ZQOV9ERUNPREVSKQorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3R2cHhkZWMuaCIKKyNpbmNsdWRlICJnc3R2cDh1dGlscy5oIgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvbWV0YS5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb3Bvb2wuaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3ZweGRlY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfdnB4ZGVjX2RlYnVnCisKKyNkZWZpbmUgREVGQVVMVF9QT1NUX1BST0NFU1NJTkcgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9QT1NUX1BST0NFU1NJTkdfRkxBR1MgKFZQOF9ERUJMT0NLIHwgVlA4X0RFTUFDUk9CTE9DSyB8IFZQOF9NRlFFKQorI2RlZmluZSBERUZBVUxUX0RFQkxPQ0tJTkdfTEVWRUwgNAorI2RlZmluZSBERUZBVUxUX05PSVNFX0xFVkVMIDAKKyNkZWZpbmUgREVGQVVMVF9USFJFQURTIDAKKyNkZWZpbmUgREVGQVVMVF9WSURFT19DT0RFQ19UQUcgTlVMTAorI2RlZmluZSBERUZBVUxUX0NPREVDX0FMR08gTlVMTAorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9QT1NUX1BST0NFU1NJTkcsCisgIFBST1BfUE9TVF9QUk9DRVNTSU5HX0ZMQUdTLAorICBQUk9QX0RFQkxPQ0tJTkdfTEVWRUwsCisgIFBST1BfTk9JU0VfTEVWRUwsCisgIFBST1BfVEhSRUFEUworfTsKKworI2RlZmluZSBDX0ZMQUdTKHYpICgoZ3VpbnQpIHYpCisjZGVmaW5lIEdTVF9WUFhfREVDX1RZUEVfUE9TVF9QUk9DRVNTSU5HX0ZMQUdTIChnc3RfdnB4X2RlY19wb3N0X3Byb2Nlc3NpbmdfZmxhZ3NfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X3ZweF9kZWNfcG9zdF9wcm9jZXNzaW5nX2ZsYWdzX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgY29uc3QgR0ZsYWdzVmFsdWUgdmFsdWVzW10gPSB7CisgICAge0NfRkxBR1MgKFZQOF9ERUJMT0NLKSwgIkRlYmxvY2siLCAiZGVibG9jayJ9LAorICAgIHtDX0ZMQUdTIChWUDhfREVNQUNST0JMT0NLKSwgIkRlbWFjcm9ibG9jayIsICJkZW1hY3JvYmxvY2sifSwKKyAgICB7Q19GTEFHUyAoVlA4X0FERE5PSVNFKSwgIkFkZCBub2lzZSIsICJhZGRub2lzZSJ9LAorICAgIHtDX0ZMQUdTIChWUDhfREVCVUdfVFhUX0ZSQU1FX0lORk8pLAorICAgICAgICAgICJQcmludCBmcmFtZSBpbmZvcm1hdGlvbiIsCisgICAgICAgICJ2aXN1YWxpemUtZnJhbWUtaW5mbyJ9LAorICAgIHtDX0ZMQUdTIChWUDhfREVCVUdfVFhUX01CTEtfTU9ERVMpLAorICAgICAgICAgICJTaG93IG1hY3JvYmxvY2sgbW9kZSBzZWxlY3Rpb24gb3ZlcmxhaWQgb24gaW1hZ2UiLAorICAgICAgICAidmlzdWFsaXplLW1hY3JvYmxvY2stbW9kZXMifSwKKyAgICB7Q19GTEFHUyAoVlA4X0RFQlVHX1RYVF9EQ19ESUZGKSwKKyAgICAgICAgICAiU2hvdyBkYyBkaWZmIGZvciBlYWNoIG1hY3JvIGJsb2NrIG92ZXJsYWlkIG9uIGltYWdlIiwKKyAgICAgICAgInZpc3VhbGl6ZS1kYy1kaWZmIn0sCisgICAge0NfRkxBR1MgKFZQOF9ERUJVR19UWFRfUkFURV9JTkZPKSwKKyAgICAgICAgICAiUHJpbnQgdmlkZW8gcmF0ZSBpbmZvIiwKKyAgICAgICAgInZpc3VhbGl6ZS1yYXRlLWluZm8ifSwKKyAgICB7Q19GTEFHUyAoVlA4X01GUUUpLCAiTXVsdGktZnJhbWUgcXVhbGl0eSBlbmhhbmNlbWVudCIsICJtZnFlIn0sCisgICAgezAsIE5VTEwsIE5VTEx9CisgIH07CisgIHN0YXRpYyB2b2xhdGlsZSBHVHlwZSBpZCA9IDA7CisKKyAgaWYgKGdfb25jZV9pbml0X2VudGVyICgoZ3NpemUgKikgJiBpZCkpIHsKKyAgICBHVHlwZSBfaWQ7CisKKyAgICBfaWQgPSBnX2ZsYWdzX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFZQWERlY1Bvc3RQcm9jZXNzaW5nRmxhZ3MiLCB2YWx1ZXMpOworCisgICAgZ19vbmNlX2luaXRfbGVhdmUgKChnc2l6ZSAqKSAmIGlkLCBfaWQpOworICB9CisKKyAgcmV0dXJuIGlkOworfQorCisjdW5kZWYgQ19GTEFHUworCitzdGF0aWMgdm9pZCBnc3RfdnB4X2RlY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfdnB4X2RlY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdnB4X2RlY19zdGFydCAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2Rlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3ZweF9kZWNfc3RvcCAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2Rlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3ZweF9kZWNfc2V0X2Zvcm1hdCAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlciwKKyAgICBHc3RWaWRlb0NvZGVjU3RhdGUgKiBzdGF0ZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3ZweF9kZWNfZmx1c2ggKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIpOworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92cHhfZGVjX2hhbmRsZV9mcmFtZSAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlciwKKyAgICBHc3RWaWRlb0NvZGVjRnJhbWUgKiBmcmFtZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3ZweF9kZWNfZGVjaWRlX2FsbG9jYXRpb24gKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIsCisgICAgR3N0UXVlcnkgKiBxdWVyeSk7CisKK3N0YXRpYyB2b2lkIGdzdF92cHhfZGVjX2ltYWdlX3RvX2J1ZmZlciAoR3N0VlBYRGVjICogZGVjLAorICAgIGNvbnN0IHZweF9pbWFnZV90ICogaW1nLCBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3ZweF9kZWNfb3Blbl9jb2RlYyAoR3N0VlBYRGVjICogZGVjLAorICAgIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lKTsKK3N0YXRpYyB2b2lkIGdzdF92cHhfZGVjX2RlZmF1bHRfc2VuZF90YWdzIChHc3RWUFhEZWMgKiBkZWMpOworc3RhdGljIHZvaWQgZ3N0X3ZweF9kZWNfc2V0X3N0cmVhbV9pbmZvIChHc3RWUFhEZWMgKiBkZWMsCisgICAgdnB4X2NvZGVjX3N0cmVhbV9pbmZvX3QgKiBzdHJlYW1faW5mbyk7CitzdGF0aWMgdm9pZCBnc3RfdnB4X2RlY19zZXRfZGVmYXVsdF9mb3JtYXQgKEdzdFZQWERlYyAqIGRlYywgR3N0VmlkZW9Gb3JtYXQgZm10LAorICAgIGludCB3aWR0aCwgaW50IGhlaWdodCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3ZweF9kZWNfZGVmYXVsdF9mcmFtZV9mb3JtYXQgKEdzdFZQWERlYyAqIGRlYywKKyAgICB2cHhfaW1hZ2VfdCAqIGltZywgR3N0VmlkZW9Gb3JtYXQgKiBmbXQpOworc3RhdGljIHZvaWQgZ3N0X3ZweF9kZWNfaGFuZGxlX3Jlc29sdXRpb25fY2hhbmdlIChHc3RWUFhEZWMgKiBkZWMsCisgICAgdnB4X2ltYWdlX3QgKiBpbWcsIEdzdFZpZGVvRm9ybWF0IGZtdCk7CisKKyNkZWZpbmUgcGFyZW50X2NsYXNzIGdzdF92cHhfZGVjX3BhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0VlBYRGVjLCBnc3RfdnB4X2RlYywgR1NUX1RZUEVfVklERU9fREVDT0RFUik7CisKK3N0YXRpYyB2b2lkCitnc3RfdnB4X2RlY19jbGFzc19pbml0IChHc3RWUFhEZWNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdFZpZGVvRGVjb2RlckNsYXNzICpiYXNlX3ZpZGVvX2RlY29kZXJfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIGJhc2VfdmlkZW9fZGVjb2Rlcl9jbGFzcyA9IEdTVF9WSURFT19ERUNPREVSX0NMQVNTIChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3ZweF9kZWNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfdnB4X2RlY19nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QT1NUX1BST0NFU1NJTkcsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInBvc3QtcHJvY2Vzc2luZyIsICJQb3N0IFByb2Nlc3NpbmciLAorICAgICAgICAgICJFbmFibGUgcG9zdCBwcm9jZXNzaW5nIiwgREVGQVVMVF9QT1NUX1BST0NFU1NJTkcsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QT1NUX1BST0NFU1NJTkdfRkxBR1MsCisgICAgICBnX3BhcmFtX3NwZWNfZmxhZ3MgKCJwb3N0LXByb2Nlc3NpbmctZmxhZ3MiLCAiUG9zdCBQcm9jZXNzaW5nIEZsYWdzIiwKKyAgICAgICAgICAiRmxhZ3MgdG8gY29udHJvbCBwb3N0IHByb2Nlc3NpbmciLAorICAgICAgICAgIEdTVF9WUFhfREVDX1RZUEVfUE9TVF9QUk9DRVNTSU5HX0ZMQUdTLCBERUZBVUxUX1BPU1RfUFJPQ0VTU0lOR19GTEFHUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RFQkxPQ0tJTkdfTEVWRUwsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoImRlYmxvY2tpbmctbGV2ZWwiLCAiRGVibG9ja2luZyBMZXZlbCIsCisgICAgICAgICAgIkRlYmxvY2tpbmcgbGV2ZWwiLAorICAgICAgICAgIDAsIDE2LCBERUZBVUxUX0RFQkxPQ0tJTkdfTEVWRUwsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9OT0lTRV9MRVZFTCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibm9pc2UtbGV2ZWwiLCAiTm9pc2UgTGV2ZWwiLAorICAgICAgICAgICJOb2lzZSBsZXZlbCIsCisgICAgICAgICAgMCwgMTYsIERFRkFVTFRfTk9JU0VfTEVWRUwsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USFJFQURTLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJ0aHJlYWRzIiwgIk1heCBUaHJlYWRzIiwKKyAgICAgICAgICAiTWF4aW11bSBudW1iZXIgb2YgZGVjb2RpbmcgdGhyZWFkcyIsCisgICAgICAgICAgMCwgMTYsIERFRkFVTFRfVEhSRUFEUywgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgYmFzZV92aWRlb19kZWNvZGVyX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdnB4X2RlY19zdGFydCk7CisgIGJhc2VfdmlkZW9fZGVjb2Rlcl9jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdnB4X2RlY19zdG9wKTsKKyAgYmFzZV92aWRlb19kZWNvZGVyX2NsYXNzLT5mbHVzaCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdnB4X2RlY19mbHVzaCk7CisgIGJhc2VfdmlkZW9fZGVjb2Rlcl9jbGFzcy0+c2V0X2Zvcm1hdCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3ZweF9kZWNfc2V0X2Zvcm1hdCk7CisgIGJhc2VfdmlkZW9fZGVjb2Rlcl9jbGFzcy0+aGFuZGxlX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdnB4X2RlY19oYW5kbGVfZnJhbWUpOzsKKyAgYmFzZV92aWRlb19kZWNvZGVyX2NsYXNzLT5kZWNpZGVfYWxsb2NhdGlvbiA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3ZweF9kZWNfZGVjaWRlX2FsbG9jYXRpb24pOworCisgIGtsYXNzLT52aWRlb19jb2RlY190YWcgPSBERUZBVUxUX1ZJREVPX0NPREVDX1RBRzsKKyAga2xhc3MtPmNvZGVjX2FsZ28gPSBERUZBVUxUX0NPREVDX0FMR087CisgIGtsYXNzLT5vcGVuX2NvZGVjID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92cHhfZGVjX29wZW5fY29kZWMpOworICBrbGFzcy0+c2VuZF90YWdzID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92cHhfZGVjX2RlZmF1bHRfc2VuZF90YWdzKTsKKyAga2xhc3MtPnNldF9zdHJlYW1faW5mbyA9IE5VTEw7CisgIGtsYXNzLT5zZXRfZGVmYXVsdF9mb3JtYXQgPSBOVUxMOworICBrbGFzcy0+aGFuZGxlX3Jlc29sdXRpb25fY2hhbmdlID0gTlVMTDsKKyAga2xhc3MtPmdldF9mcmFtZV9mb3JtYXQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92cHhfZGVjX2RlZmF1bHRfZnJhbWVfZm9ybWF0KTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3ZweGRlY19kZWJ1ZywgInZweGRlYyIsIDAsICJWUFggRGVjb2RlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZweF9kZWNfaW5pdCAoR3N0VlBYRGVjICogZ3N0X3ZweF9kZWMpCit7CisgIEdzdFZpZGVvRGVjb2RlciAqZGVjb2RlciA9IChHc3RWaWRlb0RlY29kZXIgKikgZ3N0X3ZweF9kZWM7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZ3N0X3ZweF9kZWMsICJnc3RfdnB4X2RlY19pbml0Iik7CisgIGdzdF92aWRlb19kZWNvZGVyX3NldF9wYWNrZXRpemVkIChkZWNvZGVyLCBUUlVFKTsKKyAgZ3N0X3ZweF9kZWMtPnBvc3RfcHJvY2Vzc2luZyA9IERFRkFVTFRfUE9TVF9QUk9DRVNTSU5HOworICBnc3RfdnB4X2RlYy0+cG9zdF9wcm9jZXNzaW5nX2ZsYWdzID0gREVGQVVMVF9QT1NUX1BST0NFU1NJTkdfRkxBR1M7CisgIGdzdF92cHhfZGVjLT5kZWJsb2NraW5nX2xldmVsID0gREVGQVVMVF9ERUJMT0NLSU5HX0xFVkVMOworICBnc3RfdnB4X2RlYy0+bm9pc2VfbGV2ZWwgPSBERUZBVUxUX05PSVNFX0xFVkVMOworCisgIGdzdF92aWRlb19kZWNvZGVyX3NldF9uZWVkc19mb3JtYXQgKGRlY29kZXIsIFRSVUUpOworICBnc3RfdmlkZW9fZGVjb2Rlcl9zZXRfdXNlX2RlZmF1bHRfcGFkX2FjY2VwdGNhcHMgKGRlY29kZXIsIFRSVUUpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9WSURFT19ERUNPREVSX1NJTktfUEFEIChkZWNvZGVyKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnB4X2RlY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VlBYRGVjICpkZWM7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1ZQWF9ERUMgKG9iamVjdCkpOworICBkZWMgPSBHU1RfVlBYX0RFQyAob2JqZWN0KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChvYmplY3QsICJnc3RfdnB4X2RlY19zZXRfcHJvcGVydHkiKTsKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BPU1RfUFJPQ0VTU0lORzoKKyAgICAgIGRlYy0+cG9zdF9wcm9jZXNzaW5nID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BPU1RfUFJPQ0VTU0lOR19GTEFHUzoKKyAgICAgIGRlYy0+cG9zdF9wcm9jZXNzaW5nX2ZsYWdzID0gZ192YWx1ZV9nZXRfZmxhZ3MgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ERUJMT0NLSU5HX0xFVkVMOgorICAgICAgZGVjLT5kZWJsb2NraW5nX2xldmVsID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05PSVNFX0xFVkVMOgorICAgICAgZGVjLT5ub2lzZV9sZXZlbCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJFQURTOgorICAgICAgZGVjLT50aHJlYWRzID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZweF9kZWNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFZQWERlYyAqZGVjOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19WUFhfREVDIChvYmplY3QpKTsKKyAgZGVjID0gR1NUX1ZQWF9ERUMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BPU1RfUFJPQ0VTU0lORzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBkZWMtPnBvc3RfcHJvY2Vzc2luZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUE9TVF9QUk9DRVNTSU5HX0ZMQUdTOgorICAgICAgZ192YWx1ZV9zZXRfZmxhZ3MgKHZhbHVlLCBkZWMtPnBvc3RfcHJvY2Vzc2luZ19mbGFncyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfREVCTE9DS0lOR19MRVZFTDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBkZWMtPmRlYmxvY2tpbmdfbGV2ZWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05PSVNFX0xFVkVMOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIGRlYy0+bm9pc2VfbGV2ZWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUkVBRFM6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgZGVjLT50aHJlYWRzKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdnB4X2RlY19zdGFydCAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlcikKK3sKKyAgR3N0VlBYRGVjICpnc3RfdnB4X2RlYyA9IEdTVF9WUFhfREVDIChkZWNvZGVyKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChnc3RfdnB4X2RlYywgInN0YXJ0Iik7CisgIGdzdF92cHhfZGVjLT5kZWNvZGVyX2luaXRlZCA9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92cHhfZGVjX3N0b3AgKEdzdFZpZGVvRGVjb2RlciAqIGJhc2VfdmlkZW9fZGVjb2RlcikKK3sKKyAgR3N0VlBYRGVjICpnc3RfdnB4X2RlYyA9IEdTVF9WUFhfREVDIChiYXNlX3ZpZGVvX2RlY29kZXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGdzdF92cHhfZGVjLCAic3RvcCIpOworCisgIGlmIChnc3RfdnB4X2RlYy0+b3V0cHV0X3N0YXRlKSB7CisgICAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChnc3RfdnB4X2RlYy0+b3V0cHV0X3N0YXRlKTsKKyAgICBnc3RfdnB4X2RlYy0+b3V0cHV0X3N0YXRlID0gTlVMTDsKKyAgfQorCisgIGlmIChnc3RfdnB4X2RlYy0+aW5wdXRfc3RhdGUpIHsKKyAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKGdzdF92cHhfZGVjLT5pbnB1dF9zdGF0ZSk7CisgICAgZ3N0X3ZweF9kZWMtPmlucHV0X3N0YXRlID0gTlVMTDsKKyAgfQorCisgIGlmIChnc3RfdnB4X2RlYy0+ZGVjb2Rlcl9pbml0ZWQpCisgICAgdnB4X2NvZGVjX2Rlc3Ryb3kgKCZnc3RfdnB4X2RlYy0+ZGVjb2Rlcik7CisgIGdzdF92cHhfZGVjLT5kZWNvZGVyX2luaXRlZCA9IEZBTFNFOworCisgIGlmIChnc3RfdnB4X2RlYy0+cG9vbCkgeworICAgIGdzdF9idWZmZXJfcG9vbF9zZXRfYWN0aXZlIChnc3RfdnB4X2RlYy0+cG9vbCwgRkFMU0UpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKGdzdF92cHhfZGVjLT5wb29sKTsKKyAgICBnc3RfdnB4X2RlYy0+cG9vbCA9IE5VTEw7CisgICAgZ3N0X3ZweF9kZWMtPmJ1Zl9zaXplID0gMDsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92cHhfZGVjX3NldF9mb3JtYXQgKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIsIEdzdFZpZGVvQ29kZWNTdGF0ZSAqIHN0YXRlKQoreworICBHc3RWUFhEZWMgKmdzdF92cHhfZGVjID0gR1NUX1ZQWF9ERUMgKGRlY29kZXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGdzdF92cHhfZGVjLCAic2V0X2Zvcm1hdCIpOworCisgIGlmIChnc3RfdnB4X2RlYy0+ZGVjb2Rlcl9pbml0ZWQpCisgICAgdnB4X2NvZGVjX2Rlc3Ryb3kgKCZnc3RfdnB4X2RlYy0+ZGVjb2Rlcik7CisgIGdzdF92cHhfZGVjLT5kZWNvZGVyX2luaXRlZCA9IEZBTFNFOworCisgIGlmIChnc3RfdnB4X2RlYy0+b3V0cHV0X3N0YXRlKSB7CisgICAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChnc3RfdnB4X2RlYy0+b3V0cHV0X3N0YXRlKTsKKyAgICBnc3RfdnB4X2RlYy0+b3V0cHV0X3N0YXRlID0gTlVMTDsKKyAgfQorCisgIGlmIChnc3RfdnB4X2RlYy0+aW5wdXRfc3RhdGUpIHsKKyAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKGdzdF92cHhfZGVjLT5pbnB1dF9zdGF0ZSk7CisgIH0KKworICBnc3RfdnB4X2RlYy0+aW5wdXRfc3RhdGUgPSBnc3RfdmlkZW9fY29kZWNfc3RhdGVfcmVmIChzdGF0ZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZweF9kZWNfZmx1c2ggKEdzdFZpZGVvRGVjb2RlciAqIGJhc2VfdmlkZW9fZGVjb2RlcikKK3sKKyAgR3N0VlBYRGVjICpkZWNvZGVyOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VfdmlkZW9fZGVjb2RlciwgImZsdXNoIik7CisKKyAgZGVjb2RlciA9IEdTVF9WUFhfREVDIChiYXNlX3ZpZGVvX2RlY29kZXIpOworCisgIGlmIChkZWNvZGVyLT5vdXRwdXRfc3RhdGUpIHsKKyAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKGRlY29kZXItPm91dHB1dF9zdGF0ZSk7CisgICAgZGVjb2Rlci0+b3V0cHV0X3N0YXRlID0gTlVMTDsKKyAgfQorCisgIGlmIChkZWNvZGVyLT5kZWNvZGVyX2luaXRlZCkKKyAgICB2cHhfY29kZWNfZGVzdHJveSAoJmRlY29kZXItPmRlY29kZXIpOworICBkZWNvZGVyLT5kZWNvZGVyX2luaXRlZCA9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZweF9kZWNfZGVmYXVsdF9zZW5kX3RhZ3MgKEdzdFZQWERlYyAqIGRlYykKK3sKKyAgR3N0VGFnTGlzdCAqbGlzdDsKKyAgR3N0VlBYRGVjQ2xhc3MgKnZweGNsYXNzID0gR1NUX1ZQWF9ERUNfR0VUX0NMQVNTIChkZWMpOworCisgIGlmICh2cHhjbGFzcy0+dmlkZW9fY29kZWNfdGFnID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGxpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBnc3RfdGFnX2xpc3RfYWRkIChsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICBHU1RfVEFHX1ZJREVPX0NPREVDLCB2cHhjbGFzcy0+dmlkZW9fY29kZWNfdGFnLCBOVUxMKTsKKworICBnc3RfcGFkX3B1c2hfZXZlbnQgKEdTVF9WSURFT19ERUNPREVSX1NSQ19QQUQgKGRlYyksCisgICAgICBnc3RfZXZlbnRfbmV3X3RhZyAobGlzdCkpOworfQorCisjaWZkZWYgSEFWRV9WUFhfMV80CitzdHJ1Y3QgRnJhbWUKK3sKKyAgR3N0TWFwSW5mbyBpbmZvOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKK307CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3ZweF9kZWNfcHJlcGFyZV9pbWFnZSAoR3N0VlBYRGVjICogZGVjLCBjb25zdCB2cHhfaW1hZ2VfdCAqIGltZykKK3sKKyAgZ2ludCBjb21wOworICBHc3RWaWRlb01ldGEgKnZtZXRhOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgc3RydWN0IEZyYW1lICpmcmFtZSA9IGltZy0+ZmJfcHJpdjsKKyAgR3N0VmlkZW9JbmZvICppbmZvID0gJmRlYy0+b3V0cHV0X3N0YXRlLT5pbmZvOworCisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfcmVmIChmcmFtZS0+YnVmZmVyKTsKKworICB2bWV0YSA9IGdzdF9idWZmZXJfZ2V0X3ZpZGVvX21ldGEgKGJ1ZmZlcik7CisgIHZtZXRhLT5mb3JtYXQgPSBHU1RfVklERU9fSU5GT19GT1JNQVQgKGluZm8pOworICB2bWV0YS0+d2lkdGggPSBHU1RfVklERU9fSU5GT19XSURUSCAoaW5mbyk7CisgIHZtZXRhLT5oZWlnaHQgPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKGluZm8pOworICB2bWV0YS0+bl9wbGFuZXMgPSBHU1RfVklERU9fSU5GT19OX1BMQU5FUyAoaW5mbyk7CisKKyAgZm9yIChjb21wID0gMDsgY29tcCA8IDQ7IGNvbXArKykgeworICAgIHZtZXRhLT5zdHJpZGVbY29tcF0gPSBpbWctPnN0cmlkZVtjb21wXTsKKyAgICB2bWV0YS0+b2Zmc2V0W2NvbXBdID0KKyAgICAgICAgaW1nLT5wbGFuZXNbY29tcF0gPyBpbWctPnBsYW5lc1tjb21wXSAtIGZyYW1lLT5pbmZvLmRhdGEgOiAwOworICB9CisKKyAgLyogRklYTUUgVGhpcyBpcyBhIFJFQUQvV1JJVEUgbWFwcGVkIGJ1ZmZlciBzZWUgYnVnICM3NTQ4MjYgKi8KKworICByZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgaW50Citnc3RfdnB4X2RlY19nZXRfYnVmZmVyX2NiIChncG9pbnRlciBwcml2LCBnc2l6ZSBtaW5fc2l6ZSwKKyAgICB2cHhfY29kZWNfZnJhbWVfYnVmZmVyX3QgKiBmYikKK3sKKyAgR3N0VlBYRGVjICpkZWMgPSBwcml2OworICBHc3RCdWZmZXIgKmJ1ZmZlciA9IE5VTEw7CisgIHN0cnVjdCBGcmFtZSAqZnJhbWU7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIGlmICghZGVjLT5wb29sIHx8IGRlYy0+YnVmX3NpemUgIT0gbWluX3NpemUpIHsKKyAgICBHc3RCdWZmZXJQb29sICpwb29sOworICAgIEdzdFN0cnVjdHVyZSAqY29uZmlnOworICAgIEdzdENhcHMgKmNhcHM7CisgICAgR3N0QWxsb2NhdG9yICphbGxvY2F0b3I7CisgICAgR3N0QWxsb2NhdGlvblBhcmFtcyBwYXJhbXM7CisKKyAgICBpZiAoZGVjLT5wb29sKSB7CisgICAgICBnc3RfYnVmZmVyX3Bvb2xfc2V0X2FjdGl2ZSAoZGVjLT5wb29sLCBGQUxTRSk7CisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChkZWMtPnBvb2wpOworICAgICAgZGVjLT5wb29sID0gTlVMTDsKKyAgICAgIGRlYy0+YnVmX3NpemUgPSAwOworICAgIH0KKworICAgIGdzdF92aWRlb19kZWNvZGVyX2dldF9hbGxvY2F0b3IgKEdTVF9WSURFT19ERUNPREVSIChkZWMpLCAmYWxsb2NhdG9yLAorICAgICAgICAmcGFyYW1zKTsKKworICAgIGlmIChhbGxvY2F0b3IgJiYKKyAgICAgICAgR1NUX09CSkVDVF9GTEFHX0lTX1NFVCAoYWxsb2NhdG9yLCBHU1RfQUxMT0NBVE9SX0ZMQUdfQ1VTVE9NX0FMTE9DKSkgeworICAgICAgZ3N0X29iamVjdF91bnJlZiAoYWxsb2NhdG9yKTsKKyAgICAgIGFsbG9jYXRvciA9IE5VTEw7CisgICAgfQorCisgICAgcG9vbCA9IGdzdF9idWZmZXJfcG9vbF9uZXcgKCk7CisgICAgY29uZmlnID0gZ3N0X2J1ZmZlcl9wb29sX2dldF9jb25maWcgKHBvb2wpOworICAgIGdzdF9idWZmZXJfcG9vbF9jb25maWdfc2V0X2FsbG9jYXRvciAoY29uZmlnLCBhbGxvY2F0b3IsICZwYXJhbXMpOworICAgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoInZpZGVvL2ludGVybmFsIik7CisgICAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19zZXRfcGFyYW1zIChjb25maWcsIGNhcHMsIG1pbl9zaXplLCAyLCAwKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgZ3N0X2J1ZmZlcl9wb29sX3NldF9jb25maWcgKHBvb2wsIGNvbmZpZyk7CisKKyAgICBpZiAoYWxsb2NhdG9yKQorICAgICAgZ3N0X29iamVjdF91bnJlZiAoYWxsb2NhdG9yKTsKKworICAgIGlmICghZ3N0X2J1ZmZlcl9wb29sX3NldF9hY3RpdmUgKHBvb2wsIFRSVUUpKSB7CisgICAgICBHU1RfV0FSTklORyAoIkZhaWxlZCB0byBjcmVhdGUgaW50ZXJuYWwgcG9vbCIpOworICAgICAgZ3N0X29iamVjdF91bnJlZiAocG9vbCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZGVjLT5wb29sID0gcG9vbDsKKyAgICBkZWMtPmJ1Zl9zaXplID0gbWluX3NpemU7CisgIH0KKworICByZXQgPSBnc3RfYnVmZmVyX3Bvb2xfYWNxdWlyZV9idWZmZXIgKGRlYy0+cG9vbCwgJmJ1ZmZlciwgTlVMTCk7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICBHU1RfV0FSTklORyAoIkZhaWxlZCB0byBhY3F1aXJlIGJ1ZmZlciBmcm9tIGludGVybmFsIHBvb2wuIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogQWRkIGl0IG5vdywgd2hpbGUgdGhlIGJ1ZmZlciBpcyB3cml0YWJsZSAqLworICBnc3RfYnVmZmVyX2FkZF92aWRlb19tZXRhIChidWZmZXIsIEdTVF9WSURFT19GUkFNRV9GTEFHX05PTkUsCisgICAgICBHU1RfVklERU9fRk9STUFUX0VOQ09ERUQsIDAsIDApOworCisgIGZyYW1lID0gZ19uZXcwIChzdHJ1Y3QgRnJhbWUsIDEpOworICBpZiAoIWdzdF9idWZmZXJfbWFwIChidWZmZXIsICZmcmFtZS0+aW5mbywgR1NUX01BUF9SRUFEV1JJVEUpKSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICBnX2ZyZWUgKGZyYW1lKTsKKyAgICBHU1RfV0FSTklORyAoIkZhaWxlZCB0byBtYXAgYnVmZmVyIGZyb20gaW50ZXJuYWwgcG9vbC4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBmYi0+c2l6ZSA9IGZyYW1lLT5pbmZvLnNpemU7CisgIGZiLT5kYXRhID0gZnJhbWUtPmluZm8uZGF0YTsKKyAgZnJhbWUtPmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgZmItPnByaXYgPSBmcmFtZTsKKworICBHU1RfVFJBQ0VfT0JKRUNUIChwcml2LCAiQWxsb2NhdGVkIGJ1ZmZlciAlcCIsIGZyYW1lLT5idWZmZXIpOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Citnc3RfdnB4X2RlY19yZWxlYXNlX2J1ZmZlcl9jYiAoZ3BvaW50ZXIgcHJpdiwgdnB4X2NvZGVjX2ZyYW1lX2J1ZmZlcl90ICogZmIpCit7CisgIHN0cnVjdCBGcmFtZSAqZnJhbWUgPSBmYi0+cHJpdjsKKworICAvKiBXZSdyZSBzb21ldGltZXMgY2FsbGVkIHdpdGhvdXQgYSBmcmFtZSAqLworICBpZiAoIWZyYW1lKQorICAgIHJldHVybiAwOworCisgIEdTVF9UUkFDRV9PQkpFQ1QgKHByaXYsICJSZWxlYXNlIGJ1ZmZlciAlcCIsIGZyYW1lLT5idWZmZXIpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGZyYW1lLT5idWZmZXIsICZmcmFtZS0+aW5mbyk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGZyYW1lLT5idWZmZXIpOworICBnX2ZyZWUgKGZyYW1lKTsKKyAgZmItPnByaXYgPSBOVUxMOworCisgIHJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitnc3RfdnB4X2RlY19pbWFnZV90b19idWZmZXIgKEdzdFZQWERlYyAqIGRlYywgY29uc3QgdnB4X2ltYWdlX3QgKiBpbWcsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBpbnQgZGVzdHN0cmlkZSwgc3Jjc3RyaWRlLCBoZWlnaHQsIHdpZHRoLCBsaW5lLCBjb21wOworICBndWludDggKmRlc3QsICpzcmM7CisgIEdzdFZpZGVvRnJhbWUgZnJhbWU7CisgIEdzdFZpZGVvSW5mbyAqaW5mbyA9ICZkZWMtPm91dHB1dF9zdGF0ZS0+aW5mbzsKKworICBpZiAoIWdzdF92aWRlb19mcmFtZV9tYXAgKCZmcmFtZSwgaW5mbywgYnVmZmVyLCBHU1RfTUFQX1dSSVRFKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlYywgIkNvdWxkIG5vdCBtYXAgdmlkZW8gYnVmZmVyIik7CisgICAgcmV0dXJuOworICB9CisKKyAgZm9yIChjb21wID0gMDsgY29tcCA8IDM7IGNvbXArKykgeworICAgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBICgmZnJhbWUsIGNvbXApOworICAgIHNyYyA9IGltZy0+cGxhbmVzW2NvbXBdOworICAgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKCZmcmFtZSwgY29tcCkKKyAgICAgICAgKiBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFICgmZnJhbWUsIGNvbXApOworICAgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoJmZyYW1lLCBjb21wKTsKKyAgICBkZXN0c3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFICgmZnJhbWUsIGNvbXApOworICAgIHNyY3N0cmlkZSA9IGltZy0+c3RyaWRlW2NvbXBdOworCisgICAgaWYgKHNyY3N0cmlkZSA9PSBkZXN0c3RyaWRlKSB7CisgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChkZWMsICJTdHJpZGUgbWF0Y2hlcy4gQ29tcCAlZDogJWQsIGNvcHlpbmcgZnVsbCBwbGFuZSIsCisgICAgICAgICAgY29tcCwgc3Jjc3RyaWRlKTsKKyAgICAgIG1lbWNweSAoZGVzdCwgc3JjLCBzcmNzdHJpZGUgKiBoZWlnaHQpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChkZWMsICJTdHJpZGUgbWlzbWF0Y2guIENvbXAgJWQ6ICVkICE9ICVkLCBjb3B5aW5nICIKKyAgICAgICAgICAibGluZSBieSBsaW5lLiIsIGNvbXAsIHNyY3N0cmlkZSwgZGVzdHN0cmlkZSk7CisgICAgICBmb3IgKGxpbmUgPSAwOyBsaW5lIDwgaGVpZ2h0OyBsaW5lKyspIHsKKyAgICAgICAgbWVtY3B5IChkZXN0LCBzcmMsIHdpZHRoKTsKKyAgICAgICAgZGVzdCArPSBkZXN0c3RyaWRlOworICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJmZyYW1lKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92cHhfZGVjX29wZW5fY29kZWMgKEdzdFZQWERlYyAqIGRlYywgR3N0VmlkZW9Db2RlY0ZyYW1lICogZnJhbWUpCit7CisgIGludCBmbGFncyA9IDA7CisgIHZweF9jb2RlY19zdHJlYW1faW5mb190IHN0cmVhbV9pbmZvOworICB2cHhfY29kZWNfY2Fwc190IGNhcHM7CisgIHZweF9jb2RlY19kZWNfY2ZnX3QgY2ZnOworICB2cHhfY29kZWNfZXJyX3Qgc3RhdHVzOworICBHc3RNYXBJbmZvIG1pbmZvOworICBHc3RWUFhEZWNDbGFzcyAqdnB4Y2xhc3MgPSBHU1RfVlBYX0RFQ19HRVRfQ0xBU1MgKGRlYyk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHZweGNsYXNzLT5jb2RlY19hbGdvICE9IE5VTEwsIEdTVF9GTE9XX0VSUk9SKTsKKworICBtZW1zZXQgKCZzdHJlYW1faW5mbywgMCwgc2l6ZW9mIChzdHJlYW1faW5mbykpOworICBtZW1zZXQgKCZjZmcsIDAsIHNpemVvZiAoY2ZnKSk7CisgIHN0cmVhbV9pbmZvLnN6ID0gc2l6ZW9mIChzdHJlYW1faW5mbyk7CisKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAoZnJhbWUtPmlucHV0X2J1ZmZlciwgJm1pbmZvLCBHU1RfTUFQX1JFQUQpKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZGVjLCAiRmFpbGVkIHRvIG1hcCBpbnB1dCBidWZmZXIiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KKworICBzdGF0dXMgPSB2cHhfY29kZWNfcGVla19zdHJlYW1faW5mbyAodnB4Y2xhc3MtPmNvZGVjX2FsZ28sCisgICAgICBtaW5mby5kYXRhLCBtaW5mby5zaXplLCAmc3RyZWFtX2luZm8pOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGZyYW1lLT5pbnB1dF9idWZmZXIsICZtaW5mbyk7CisKKyAgaWYgKHN0YXR1cyAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlYywgIlZQWCBwcmVwcm9jZXNzaW5nIGVycm9yOiAlcyIsCisgICAgICAgIGdzdF92cHhfZXJyb3JfbmFtZSAoc3RhdHVzKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0NVU1RPTV9TVUNDRVNTXzE7CisgIH0KKyAgaWYgKCFzdHJlYW1faW5mby5pc19rZikgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVjLCAiTm8ga2V5ZnJhbWUsIHNraXBwaW5nIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0NVU1RPTV9TVUNDRVNTXzE7CisgIH0KKworICBnc3RfdnB4X2RlY19zZXRfc3RyZWFtX2luZm8gKGRlYywgJnN0cmVhbV9pbmZvKTsKKyAgZ3N0X3ZweF9kZWNfc2V0X2RlZmF1bHRfZm9ybWF0IChkZWMsIEdTVF9WSURFT19GT1JNQVRfSTQyMCwgc3RyZWFtX2luZm8udywKKyAgICAgIHN0cmVhbV9pbmZvLmgpOworCisgIGNmZy53ID0gc3RyZWFtX2luZm8udzsKKyAgY2ZnLmggPSBzdHJlYW1faW5mby5oOworCisgIGlmIChkZWMtPnRocmVhZHMgPiAwKQorICAgIGNmZy50aHJlYWRzID0gZGVjLT50aHJlYWRzOworICBlbHNlCisgICAgY2ZnLnRocmVhZHMgPSBnX2dldF9udW1fcHJvY2Vzc29ycyAoKTsKKworICBjYXBzID0gdnB4X2NvZGVjX2dldF9jYXBzICh2cHhjbGFzcy0+Y29kZWNfYWxnbyk7CisKKyAgaWYgKGRlYy0+cG9zdF9wcm9jZXNzaW5nKSB7CisgICAgaWYgKCEoY2FwcyAmIFZQWF9DT0RFQ19DQVBfUE9TVFBST0MpKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlYywgIkRlY29kZXIgZG9lcyBub3Qgc3VwcG9ydCBwb3N0IHByb2Nlc3NpbmciKTsKKyAgICB9IGVsc2UgeworICAgICAgZmxhZ3MgfD0gVlBYX0NPREVDX1VTRV9QT1NUUFJPQzsKKyAgICB9CisgIH0KKworICBzdGF0dXMgPQorICAgICAgdnB4X2NvZGVjX2RlY19pbml0ICgmZGVjLT5kZWNvZGVyLCB2cHhjbGFzcy0+Y29kZWNfYWxnbywgJmNmZywgZmxhZ3MpOworICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZWMsIExJQlJBUlksIElOSVQsCisgICAgICAgICgiRmFpbGVkIHRvIGluaXRpYWxpemUgVlA4IGRlY29kZXIiKSwgKCIlcyIsCisgICAgICAgICAgICBnc3RfdnB4X2Vycm9yX25hbWUgKHN0YXR1cykpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KKworICBpZiAoKGNhcHMgJiBWUFhfQ09ERUNfQ0FQX1BPU1RQUk9DKSAmJiBkZWMtPnBvc3RfcHJvY2Vzc2luZykgeworICAgIHZwOF9wb3N0cHJvY19jZmdfdCBwcF9jZmcgPSB7IDAsIH07CisKKyAgICBwcF9jZmcucG9zdF9wcm9jX2ZsYWcgPSBkZWMtPnBvc3RfcHJvY2Vzc2luZ19mbGFnczsKKyAgICBwcF9jZmcuZGVibG9ja2luZ19sZXZlbCA9IGRlYy0+ZGVibG9ja2luZ19sZXZlbDsKKyAgICBwcF9jZmcubm9pc2VfbGV2ZWwgPSBkZWMtPm5vaXNlX2xldmVsOworCisgICAgc3RhdHVzID0gdnB4X2NvZGVjX2NvbnRyb2wgKCZkZWMtPmRlY29kZXIsIFZQOF9TRVRfUE9TVFBST0MsICZwcF9jZmcpOworICAgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlYywgIkNvdWxkbid0IHNldCBwb3N0cHJvY2Vzc2luZyBzZXR0aW5nczogJXMiLAorICAgICAgICAgIGdzdF92cHhfZXJyb3JfbmFtZSAoc3RhdHVzKSk7CisgICAgfQorICB9CisjaWZkZWYgSEFWRV9WUFhfMV80CisgIHZweF9jb2RlY19zZXRfZnJhbWVfYnVmZmVyX2Z1bmN0aW9ucyAoJmRlYy0+ZGVjb2RlciwKKyAgICAgIGdzdF92cHhfZGVjX2dldF9idWZmZXJfY2IsIGdzdF92cHhfZGVjX3JlbGVhc2VfYnVmZmVyX2NiLCBkZWMpOworI2VuZGlmCisKKyAgZGVjLT5kZWNvZGVyX2luaXRlZCA9IFRSVUU7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3ZweF9kZWNfaGFuZGxlX2ZyYW1lIChHc3RWaWRlb0RlY29kZXIgKiBkZWNvZGVyLCBHc3RWaWRlb0NvZGVjRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0VlBYRGVjICpkZWM7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIHZweF9jb2RlY19lcnJfdCBzdGF0dXM7CisgIHZweF9jb2RlY19pdGVyX3QgaXRlciA9IE5VTEw7CisgIHZweF9pbWFnZV90ICppbWc7CisgIGxvbmcgZGVjb2Rlcl9kZWFkbGluZSA9IDA7CisgIEdzdENsb2NrVGltZURpZmYgZGVhZGxpbmU7CisgIEdzdE1hcEluZm8gbWluZm87CisgIEdzdFZQWERlY0NsYXNzICp2cHhjbGFzczsKKyAgR3N0VmlkZW9Gb3JtYXQgZm10OworCisgIEdTVF9MT0dfT0JKRUNUIChkZWNvZGVyLCAiaGFuZGxlX2ZyYW1lIik7CisKKyAgZGVjID0gR1NUX1ZQWF9ERUMgKGRlY29kZXIpOworICB2cHhjbGFzcyA9IEdTVF9WUFhfREVDX0dFVF9DTEFTUyAoZGVjKTsKKworICBpZiAoIWRlYy0+ZGVjb2Rlcl9pbml0ZWQpIHsKKyAgICByZXQgPSB2cHhjbGFzcy0+b3Blbl9jb2RlYyAoZGVjLCBmcmFtZSk7CisgICAgaWYgKHJldCA9PSBHU1RfRkxPV19DVVNUT01fU1VDQ0VTU18xKSB7CisgICAgICBnc3RfdmlkZW9fZGVjb2Rlcl9kcm9wX2ZyYW1lIChkZWNvZGVyLCBmcmFtZSk7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgICAgfSBlbHNlIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgIGdzdF92aWRlb19jb2RlY19mcmFtZV91bnJlZiAoZnJhbWUpOworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgIH0KKworICBkZWFkbGluZSA9IGdzdF92aWRlb19kZWNvZGVyX2dldF9tYXhfZGVjb2RlX3RpbWUgKGRlY29kZXIsIGZyYW1lKTsKKyAgaWYgKGRlYWRsaW5lIDwgMCkgeworICAgIGRlY29kZXJfZGVhZGxpbmUgPSAxOworICB9IGVsc2UgaWYgKGRlYWRsaW5lID09IEdfTUFYSU5UNjQpIHsKKyAgICBkZWNvZGVyX2RlYWRsaW5lID0gMDsKKyAgfSBlbHNlIHsKKyAgICBkZWNvZGVyX2RlYWRsaW5lID0gTUFYICgxLCBkZWFkbGluZSAvIEdTVF9NU0VDT05EKTsKKyAgfQorCisgIGlmICghZ3N0X2J1ZmZlcl9tYXAgKGZyYW1lLT5pbnB1dF9idWZmZXIsICZtaW5mbywgR1NUX01BUF9SRUFEKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlYywgIkZhaWxlZCB0byBtYXAgaW5wdXQgYnVmZmVyIik7CisgICAgZ3N0X3ZpZGVvX2NvZGVjX2ZyYW1lX3VucmVmIChmcmFtZSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgc3RhdHVzID0gdnB4X2NvZGVjX2RlY29kZSAoJmRlYy0+ZGVjb2RlciwKKyAgICAgIG1pbmZvLmRhdGEsIG1pbmZvLnNpemUsIE5VTEwsIGRlY29kZXJfZGVhZGxpbmUpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGZyYW1lLT5pbnB1dF9idWZmZXIsICZtaW5mbyk7CisKKyAgaWYgKHN0YXR1cykgeworICAgIEdTVF9WSURFT19ERUNPREVSX0VSUk9SIChkZWNvZGVyLCAxLCBMSUJSQVJZLCBFTkNPREUsCisgICAgICAgICgiRmFpbGVkIHRvIGRlY29kZSBmcmFtZSIpLCAoIiVzIiwgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKSwgcmV0KTsKKyAgICBnc3RfdmlkZW9fY29kZWNfZnJhbWVfdW5yZWYgKGZyYW1lKTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgaW1nID0gdnB4X2NvZGVjX2dldF9mcmFtZSAoJmRlYy0+ZGVjb2RlciwgJml0ZXIpOworICBpZiAoaW1nKSB7CisgICAgaWYgKHZweGNsYXNzLT5nZXRfZnJhbWVfZm9ybWF0IChkZWMsIGltZywgJmZtdCkgPT0gRkFMU0UpIHsKKyAgICAgIHZweF9pbWdfZnJlZSAoaW1nKTsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZWNvZGVyLCBMSUJSQVJZLCBFTkNPREUsCisgICAgICAgICAgKCJGYWlsZWQgdG8gZGVjb2RlIGZyYW1lIiksICgiVW5zdXBwb3J0ZWQgY29sb3IgZm9ybWF0ICVkIiwKKyAgICAgICAgICAgICAgaW1nLT5mbXQpKTsKKyAgICAgIGdzdF92aWRlb19jb2RlY19mcmFtZV91bnJlZiAoZnJhbWUpOworICAgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICAgIH0KKworICAgIGlmIChkZWFkbGluZSA8IDApIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChkZWMsICJTa2lwcGluZyBsYXRlIGZyYW1lICglZiBzIHBhc3QgZGVhZGxpbmUpIiwKKyAgICAgICAgICAoZG91YmxlKSAtZGVhZGxpbmUgLyBHU1RfU0VDT05EKTsKKyAgICAgIGdzdF92aWRlb19kZWNvZGVyX2Ryb3BfZnJhbWUgKGRlY29kZXIsIGZyYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgZ3N0X3ZweF9kZWNfaGFuZGxlX3Jlc29sdXRpb25fY2hhbmdlIChkZWMsIGltZywgZm10KTsKKyNpZmRlZiBIQVZFX1ZQWF8xXzQKKyAgICAgIGlmIChpbWctPmZiX3ByaXYgJiYgZGVjLT5oYXZlX3ZpZGVvX21ldGEpIHsKKyAgICAgICAgZnJhbWUtPm91dHB1dF9idWZmZXIgPSBnc3RfdnB4X2RlY19wcmVwYXJlX2ltYWdlIChkZWMsIGltZyk7CisgICAgICAgIHJldCA9IGdzdF92aWRlb19kZWNvZGVyX2ZpbmlzaF9mcmFtZSAoZGVjb2RlciwgZnJhbWUpOworICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgIHsKKyAgICAgICAgcmV0ID0gZ3N0X3ZpZGVvX2RlY29kZXJfYWxsb2NhdGVfb3V0cHV0X2ZyYW1lIChkZWNvZGVyLCBmcmFtZSk7CisKKyAgICAgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSykgeworICAgICAgICAgIGdzdF92cHhfZGVjX2ltYWdlX3RvX2J1ZmZlciAoZGVjLCBpbWcsIGZyYW1lLT5vdXRwdXRfYnVmZmVyKTsKKyAgICAgICAgICByZXQgPSBnc3RfdmlkZW9fZGVjb2Rlcl9maW5pc2hfZnJhbWUgKGRlY29kZXIsIGZyYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnc3RfdmlkZW9fZGVjb2Rlcl9kcm9wX2ZyYW1lIChkZWNvZGVyLCBmcmFtZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB2cHhfaW1nX2ZyZWUgKGltZyk7CisKKyAgICB3aGlsZSAoKGltZyA9IHZweF9jb2RlY19nZXRfZnJhbWUgKCZkZWMtPmRlY29kZXIsICZpdGVyKSkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVjb2RlciwgIk11bHRpcGxlIGRlY29kZWQgZnJhbWVzLi4uIGRyb3BwaW5nIik7CisgICAgICB2cHhfaW1nX2ZyZWUgKGltZyk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIEludmlzaWJsZSBmcmFtZSAqLworICAgIEdTVF9WSURFT19DT0RFQ19GUkFNRV9TRVRfREVDT0RFX09OTFkgKGZyYW1lKTsKKyAgICBnc3RfdmlkZW9fZGVjb2Rlcl9maW5pc2hfZnJhbWUgKGRlY29kZXIsIGZyYW1lKTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZweF9kZWNfZGVjaWRlX2FsbG9jYXRpb24gKEdzdFZpZGVvRGVjb2RlciAqIGJkZWMsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdFZQWERlYyAqZGVjID0gR1NUX1ZQWF9ERUMgKGJkZWMpOworICBHc3RCdWZmZXJQb29sICpwb29sOworICBHc3RTdHJ1Y3R1cmUgKmNvbmZpZzsKKworICBpZiAoIUdTVF9WSURFT19ERUNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kZWNpZGVfYWxsb2NhdGlvbiAoYmRlYywgcXVlcnkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBnX2Fzc2VydCAoZ3N0X3F1ZXJ5X2dldF9uX2FsbG9jYXRpb25fcG9vbHMgKHF1ZXJ5KSA+IDApOworICBnc3RfcXVlcnlfcGFyc2VfbnRoX2FsbG9jYXRpb25fcG9vbCAocXVlcnksIDAsICZwb29sLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHBvb2wgIT0gTlVMTCk7CisKKyAgY29uZmlnID0gZ3N0X2J1ZmZlcl9wb29sX2dldF9jb25maWcgKHBvb2wpOworICBpZiAoZ3N0X3F1ZXJ5X2ZpbmRfYWxsb2NhdGlvbl9tZXRhIChxdWVyeSwgR1NUX1ZJREVPX01FVEFfQVBJX1RZUEUsIE5VTEwpKSB7CisgICAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19hZGRfb3B0aW9uIChjb25maWcsCisgICAgICAgIEdTVF9CVUZGRVJfUE9PTF9PUFRJT05fVklERU9fTUVUQSk7CisgICAgZGVjLT5oYXZlX3ZpZGVvX21ldGEgPSBUUlVFOworICB9CisgIGdzdF9idWZmZXJfcG9vbF9zZXRfY29uZmlnIChwb29sLCBjb25maWcpOworICBnc3Rfb2JqZWN0X3VucmVmIChwb29sKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92cHhfZGVjX3NldF9zdHJlYW1faW5mbyAoR3N0VlBYRGVjICogZGVjLAorICAgIHZweF9jb2RlY19zdHJlYW1faW5mb190ICogc3RyZWFtX2luZm8pCit7CisgIEdzdFZQWERlY0NsYXNzICp2cHhjbGFzcyA9IEdTVF9WUFhfREVDX0dFVF9DTEFTUyAoZGVjKTsKKyAgaWYgKHZweGNsYXNzLT5zZXRfc3RyZWFtX2luZm8gIT0gTlVMTCkgeworICAgIHZweGNsYXNzLT5zZXRfc3RyZWFtX2luZm8gKGRlYywgc3RyZWFtX2luZm8pOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnB4X2RlY19zZXRfZGVmYXVsdF9mb3JtYXQgKEdzdFZQWERlYyAqIGRlYywgR3N0VmlkZW9Gb3JtYXQgZm10LCBpbnQgd2lkdGgsCisgICAgaW50IGhlaWdodCkKK3sKKyAgR3N0VlBYRGVjQ2xhc3MgKnZweGNsYXNzID0gR1NUX1ZQWF9ERUNfR0VUX0NMQVNTIChkZWMpOworICBpZiAodnB4Y2xhc3MtPnNldF9kZWZhdWx0X2Zvcm1hdCAhPSBOVUxMKSB7CisgICAgdnB4Y2xhc3MtPnNldF9kZWZhdWx0X2Zvcm1hdCAoZGVjLCBmbXQsIHdpZHRoLCBoZWlnaHQpOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZweF9kZWNfZGVmYXVsdF9mcmFtZV9mb3JtYXQgKEdzdFZQWERlYyAqIGRlYywgdnB4X2ltYWdlX3QgKiBpbWcsCisgICAgR3N0VmlkZW9Gb3JtYXQgKiBmbXQpCit7CisgIGlmIChpbWctPmZtdCA9PSBWUFhfSU1HX0ZNVF9JNDIwKSB7CisgICAgKmZtdCA9IEdTVF9WSURFT19GT1JNQVRfSTQyMDsKKyAgICByZXR1cm4gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZweF9kZWNfaGFuZGxlX3Jlc29sdXRpb25fY2hhbmdlIChHc3RWUFhEZWMgKiBkZWMsIHZweF9pbWFnZV90ICogaW1nLAorICAgIEdzdFZpZGVvRm9ybWF0IGZtdCkKK3sKKyAgR3N0VlBYRGVjQ2xhc3MgKnZweGNsYXNzID0gR1NUX1ZQWF9ERUNfR0VUX0NMQVNTIChkZWMpOworICBpZiAodnB4Y2xhc3MtPmhhbmRsZV9yZXNvbHV0aW9uX2NoYW5nZSAhPSBOVUxMKSB7CisgICAgdnB4Y2xhc3MtPmhhbmRsZV9yZXNvbHV0aW9uX2NoYW5nZSAoZGVjLCBpbWcsIGZtdCk7CisgIH0KK30KKworI2VuZGlmIC8qIEhBVkVfVlA4X0RFQ09ERVIgfHwgIEhBVkVfVlA5X0RFQ09ERVIgKi8KZGlmZiAtLWdpdCBhL2V4dC92cHgvZ3N0dnB4ZGVjLmggYi9leHQvdnB4L2dzdHZweGRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NTJmODYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvdnB4L2dzdHZweGRlYy5oCkBAIC0wLDAgKzEsMTEzIEBACisvKiBWUFgKKyAqIENvcHlyaWdodCAoQykgMjAwNiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwyMDA5LDIwMTAgRW50cm9weSBXYXZlIEluYworICogQ29weXJpZ2h0IChDKSAyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9fR1NUX1ZQWF9ERUNfSF9fCisjZGVmaW5lIF9fR1NUX1ZQWF9ERUNfSF9fCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQoSEFWRV9WUDhfREVDT0RFUikgfHwgZGVmaW5lZChIQVZFX1ZQOV9ERUNPREVSKQorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2RlY29kZXIuaD4KKworLyogRklYTUU6IFVuZGVmIEhBVkVfQ09ORklHX0ggYmVjYXVzZSB2cHhfY29kZWMuaCB1c2VzIGl0LAorICogd2hpY2ggY2F1c2VzIGNvbXBpbGF0aW9uIGZhaWx1cmVzICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI3VuZGVmIEhBVkVfQ09ORklHX0gKKyNlbmRpZgorCisjaW5jbHVkZSA8dnB4L3ZweF9kZWNvZGVyLmg+CisjaW5jbHVkZSA8dnB4L3ZwOGR4Lmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9WUFhfREVDIFwKKyAgKGdzdF92cHhfZGVjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WUFhfREVDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVlBYX0RFQyxHc3RWUFhEZWMpKQorI2RlZmluZSBHU1RfVlBYX0RFQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WUFhfREVDLEdzdFZQWERlY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1ZQWF9ERUMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WUFhfREVDKSkKKyNkZWZpbmUgR1NUX0lTX1ZQWF9ERUNfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1ZQWF9ERUMpKQorI2RlZmluZSBHU1RfVlBYX0RFQ19HRVRfQ0xBU1Mob2JqKSAgICAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9WUFhfREVDLCBHc3RWUFhEZWNDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWUFhEZWMgR3N0VlBYRGVjOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZQWERlY0NsYXNzIEdzdFZQWERlY0NsYXNzOworCitzdHJ1Y3QgX0dzdFZQWERlYworeworICBHc3RWaWRlb0RlY29kZXIgYmFzZV92aWRlb19kZWNvZGVyOworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIHZweF9jb2RlY19jdHhfdCBkZWNvZGVyOworCisgIC8qIHN0YXRlICovCisgIGdib29sZWFuIGRlY29kZXJfaW5pdGVkOworCisgIC8qIHByb3BlcnRpZXMgKi8KKyAgZ2Jvb2xlYW4gcG9zdF9wcm9jZXNzaW5nOworICBlbnVtIHZwOF9wb3N0cHJvY19sZXZlbCBwb3N0X3Byb2Nlc3NpbmdfZmxhZ3M7CisgIGdpbnQgZGVibG9ja2luZ19sZXZlbDsKKyAgZ2ludCBub2lzZV9sZXZlbDsKKyAgZ2ludCB0aHJlYWRzOworCisgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqaW5wdXRfc3RhdGU7CisgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqb3V0cHV0X3N0YXRlOworCisgIC8qIGFsbG9jYXRpb24gKi8KKyAgZ2Jvb2xlYW4gaGF2ZV92aWRlb19tZXRhOworICBHc3RCdWZmZXJQb29sICpwb29sOworICBnc2l6ZSBidWZfc2l6ZTsKK307CisKK3N0cnVjdCBfR3N0VlBYRGVjQ2xhc3MKK3sKKyAgR3N0VmlkZW9EZWNvZGVyQ2xhc3MgYmFzZV92aWRlb19kZWNvZGVyX2NsYXNzOworICBjb25zdCBjaGFyKiB2aWRlb19jb2RlY190YWc7CisgIC8qc3VwcG9ydGVkIHZweCBhbGdvKi8KKyAgdnB4X2NvZGVjX2lmYWNlX3QqIGNvZGVjX2FsZ287CisgIC8qdmlydHVhbCBmdW5jdGlvbiB0byBvcGVuX2NvZGVjKi8KKyAgR3N0Rmxvd1JldHVybiAoKm9wZW5fY29kZWMpIChHc3RWUFhEZWMgKiBkZWMsIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lKTsKKyAgLyp2aXJ0dWFsIGZ1bmN0aW9uIHRvIHNlbmQgdGFncyovCisgIHZvaWQgKCpzZW5kX3RhZ3MpIChHc3RWUFhEZWMqIGRlYyk7CisgIC8qdmlydHVhbCBmdW5jdGlvbiB0byBzZXQvY29ycmVjdCB0aGUgc3RyZWFtIGluZm8qLworICB2b2lkICgqc2V0X3N0cmVhbV9pbmZvKSAoR3N0VlBYRGVjICpkZWMsIHZweF9jb2RlY19zdHJlYW1faW5mb190ICpzdHJlYW1faW5mbyk7CisgIC8qdmlydHVhbCBmdW5jdGlvbiB0byBzZXQgZGVmYXVsdCBmb3JtYXQgd2hpbGUgb3BlbmluZyBjb2RlYyovCisgIHZvaWQgKCpzZXRfZGVmYXVsdF9mb3JtYXQpIChHc3RWUFhEZWMgKmRlYywgR3N0VmlkZW9Gb3JtYXQgZm10LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICAvKnZpcnR1YWwgZnVuY3Rpb24gdG8gbmVnb3RpYXRlIGZvcm1hdCB3aGlsZSBoYW5kbGluZyBmcmFtZSovCisgIHZvaWQgKCpoYW5kbGVfcmVzb2x1dGlvbl9jaGFuZ2UpIChHc3RWUFhEZWMgKmRlYywgdnB4X2ltYWdlX3QgKmltZywgR3N0VmlkZW9Gb3JtYXQgZm10KTsKKyAgLyp2aXJ0dWFsIGZ1bmN0aW9uIHRvIGNoZWNrIHZhbGlkIGZvcm1hdCovCisgIGdib29sZWFuICgqZ2V0X2ZyYW1lX2Zvcm1hdCkoR3N0VlBYRGVjICpkZWMsIHZweF9pbWFnZV90ICppbWcsIEdzdFZpZGVvRm9ybWF0KiBmbXQpOworfTsKKworR1R5cGUgZ3N0X3ZweF9kZWNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYKKworI2VuZGlmIC8qIF9fR1NUX1ZQOF9ERUNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvdnB4L2dzdHZweGVuYy5jIGIvZXh0L3ZweC9nc3R2cHhlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmEyY2NjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3ZweC9nc3R2cHhlbmMuYwpAQCAtMCwwICsxLDE5NjggQEAKKy8qIFZQWAorICogQ29weXJpZ2h0IChDKSAyMDA2IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDEwIEVudHJvcHkgV2F2ZSBJbmMKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDEyIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhBVkVfVlA4X0VOQ09ERVIpIHx8IGRlZmluZWQoSEFWRV9WUDlfRU5DT0RFUikKKworLyogZ2xpYiBkZWNpZGVkIGluIDIuMzIgaXQgd291bGQgYmUgYSBncmVhdCBpZGVhIHRvIGRlcHJlY2F0ZWQgR1ZhbHVlQXJyYXkgd2l0aG91dAorICogcHJvdmlkaW5nIGFuIGFsdGVybmF0aXZlCisgKgorICogU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjcyMjgKKyAqICovCisjZGVmaW5lIEdMSUJfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworCisjaW5jbHVkZSA8Z3N0L3RhZy90YWcuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdHZwOHV0aWxzLmgiCisjaW5jbHVkZSAiZ3N0dnB4ZW5jLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF92cHhlbmNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3ZweGVuY19kZWJ1ZworCisvKiBGcm9tIHZwOC92cDhfY3hfaWZhY2UuYyBhbmQgdnA5L3ZwOV9jeF9pZmFjZS5jICovCisjZGVmaW5lIERFRkFVTFRfUFJPRklMRSAwCisKKyNkZWZpbmUgREVGQVVMVF9SQ19FTkRfVVNBR0UgVlBYX1ZCUgorI2RlZmluZSBERUZBVUxUX1JDX1RBUkdFVF9CSVRSQVRFIDI1NjAwMAorI2RlZmluZSBERUZBVUxUX1JDX01JTl9RVUFOVElaRVIgNAorI2RlZmluZSBERUZBVUxUX1JDX01BWF9RVUFOVElaRVIgNjMKKworI2RlZmluZSBERUZBVUxUX1JDX0RST1BGUkFNRV9USFJFU0ggMAorI2RlZmluZSBERUZBVUxUX1JDX1JFU0laRV9BTExPV0VEIDAKKyNkZWZpbmUgREVGQVVMVF9SQ19SRVNJWkVfVVBfVEhSRVNIIDMwCisjZGVmaW5lIERFRkFVTFRfUkNfUkVTSVpFX0RPV05fVEhSRVNIIDYwCisjZGVmaW5lIERFRkFVTFRfUkNfVU5ERVJTSE9PVF9QQ1QgMTAwCisjZGVmaW5lIERFRkFVTFRfUkNfT1ZFUlNIT09UX1BDVCAxMDAKKyNkZWZpbmUgREVGQVVMVF9SQ19CVUZfU1ogNjAwMAorI2RlZmluZSBERUZBVUxUX1JDX0JVRl9JTklUSUFMX1NaIDQwMDAKKyNkZWZpbmUgREVGQVVMVF9SQ19CVUZfT1BUSU1BTF9TWiA1MDAwCisjZGVmaW5lIERFRkFVTFRfUkNfMlBBU1NfVkJSX0JJQVNfUENUIDUwCisjZGVmaW5lIERFRkFVTFRfUkNfMlBBU1NfVkJSX01JTlNFQ1RJT05fUENUIDAKKyNkZWZpbmUgREVGQVVMVF9SQ18yUEFTU19WQlJfTUFYU0VDVElPTl9QQ1QgNDAwCisKKyNkZWZpbmUgREVGQVVMVF9LRl9NT0RFIFZQWF9LRl9BVVRPCisjZGVmaW5lIERFRkFVTFRfS0ZfTUFYX0RJU1QgMTI4CisKKyNkZWZpbmUgREVGQVVMVF9NVUxUSVBBU1NfTU9ERSBWUFhfUkNfT05FX1BBU1MKKyNkZWZpbmUgREVGQVVMVF9NVUxUSVBBU1NfQ0FDSEVfRklMRSAibXVsdGlwYXNzLmNhY2hlIgorCisjZGVmaW5lIERFRkFVTFRfVFNfTlVNQkVSX0xBWUVSUyAxCisjZGVmaW5lIERFRkFVTFRfVFNfVEFSR0VUX0JJVFJBVEUgTlVMTAorI2RlZmluZSBERUZBVUxUX1RTX1JBVEVfREVDSU1BVE9SIE5VTEwKKyNkZWZpbmUgREVGQVVMVF9UU19QRVJJT0RJQ0lUWSAwCisjZGVmaW5lIERFRkFVTFRfVFNfTEFZRVJfSUQgTlVMTAorCisjZGVmaW5lIERFRkFVTFRfRVJST1JfUkVTSUxJRU5UIDAKKyNkZWZpbmUgREVGQVVMVF9MQUdfSU5fRlJBTUVTIDAKKworI2RlZmluZSBERUZBVUxUX1RIUkVBRFMgMAorCisjZGVmaW5lIERFRkFVTFRfSF9TQ0FMSU5HX01PREUgVlA4RV9OT1JNQUwKKyNkZWZpbmUgREVGQVVMVF9WX1NDQUxJTkdfTU9ERSBWUDhFX05PUk1BTAorI2RlZmluZSBERUZBVUxUX0NQVV9VU0VEIDAKKyNkZWZpbmUgREVGQVVMVF9FTkFCTEVfQVVUT19BTFRfUkVGIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfREVBRExJTkUgVlBYX0RMX0JFU1RfUVVBTElUWQorI2RlZmluZSBERUZBVUxUX05PSVNFX1NFTlNJVElWSVRZIDAKKyNkZWZpbmUgREVGQVVMVF9TSEFSUE5FU1MgMAorI2RlZmluZSBERUZBVUxUX1NUQVRJQ19USFJFU0hPTEQgMAorI2RlZmluZSBERUZBVUxUX1RPS0VOX1BBUlRJVElPTlMgMAorI2RlZmluZSBERUZBVUxUX0FSTlJfTUFYRlJBTUVTIDAKKyNkZWZpbmUgREVGQVVMVF9BUk5SX1NUUkVOR1RIIDMKKyNkZWZpbmUgREVGQVVMVF9BUk5SX1RZUEUgMworI2RlZmluZSBERUZBVUxUX1RVTklORyBWUDhfVFVORV9QU05SCisjZGVmaW5lIERFRkFVTFRfQ1FfTEVWRUwgMTAKKyNkZWZpbmUgREVGQVVMVF9NQVhfSU5UUkFfQklUUkFURV9QQ1QgMAorI2RlZmluZSBERUZBVUxUX1RJTUVCQVNFX04gMAorI2RlZmluZSBERUZBVUxUX1RJTUVCQVNFX0QgMQorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9SQ19FTkRfVVNBR0UsCisgIFBST1BfUkNfVEFSR0VUX0JJVFJBVEUsCisgIFBST1BfUkNfTUlOX1FVQU5USVpFUiwKKyAgUFJPUF9SQ19NQVhfUVVBTlRJWkVSLAorICBQUk9QX1JDX0RST1BGUkFNRV9USFJFU0gsCisgIFBST1BfUkNfUkVTSVpFX0FMTE9XRUQsCisgIFBST1BfUkNfUkVTSVpFX1VQX1RIUkVTSCwKKyAgUFJPUF9SQ19SRVNJWkVfRE9XTl9USFJFU0gsCisgIFBST1BfUkNfVU5ERVJTSE9PVF9QQ1QsCisgIFBST1BfUkNfT1ZFUlNIT09UX1BDVCwKKyAgUFJPUF9SQ19CVUZfU1osCisgIFBST1BfUkNfQlVGX0lOSVRJQUxfU1osCisgIFBST1BfUkNfQlVGX09QVElNQUxfU1osCisgIFBST1BfUkNfMlBBU1NfVkJSX0JJQVNfUENULAorICBQUk9QX1JDXzJQQVNTX1ZCUl9NSU5TRUNUSU9OX1BDVCwKKyAgUFJPUF9SQ18yUEFTU19WQlJfTUFYU0VDVElPTl9QQ1QsCisgIFBST1BfS0ZfTU9ERSwKKyAgUFJPUF9LRl9NQVhfRElTVCwKKyAgUFJPUF9UU19OVU1CRVJfTEFZRVJTLAorICBQUk9QX1RTX1RBUkdFVF9CSVRSQVRFLAorICBQUk9QX1RTX1JBVEVfREVDSU1BVE9SLAorICBQUk9QX1RTX1BFUklPRElDSVRZLAorICBQUk9QX1RTX0xBWUVSX0lELAorICBQUk9QX01VTFRJUEFTU19NT0RFLAorICBQUk9QX01VTFRJUEFTU19DQUNIRV9GSUxFLAorICBQUk9QX0VSUk9SX1JFU0lMSUVOVCwKKyAgUFJPUF9MQUdfSU5fRlJBTUVTLAorICBQUk9QX1RIUkVBRFMsCisgIFBST1BfREVBRExJTkUsCisgIFBST1BfSF9TQ0FMSU5HX01PREUsCisgIFBST1BfVl9TQ0FMSU5HX01PREUsCisgIFBST1BfQ1BVX1VTRUQsCisgIFBST1BfRU5BQkxFX0FVVE9fQUxUX1JFRiwKKyAgUFJPUF9OT0lTRV9TRU5TSVRJVklUWSwKKyAgUFJPUF9TSEFSUE5FU1MsCisgIFBST1BfU1RBVElDX1RIUkVTSE9MRCwKKyAgUFJPUF9UT0tFTl9QQVJUSVRJT05TLAorICBQUk9QX0FSTlJfTUFYRlJBTUVTLAorICBQUk9QX0FSTlJfU1RSRU5HVEgsCisgIFBST1BfQVJOUl9UWVBFLAorICBQUk9QX1RVTklORywKKyAgUFJPUF9DUV9MRVZFTCwKKyAgUFJPUF9NQVhfSU5UUkFfQklUUkFURV9QQ1QsCisgIFBST1BfVElNRUJBU0UKK307CisKKworI2RlZmluZSBHU1RfVlBYX0VOQ19FTkRfVVNBR0VfVFlQRSAoZ3N0X3ZweF9lbmNfZW5kX3VzYWdlX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF92cHhfZW5jX2VuZF91c2FnZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAge1ZQWF9WQlIsICJWYXJpYWJsZSBCaXQgUmF0ZSAoVkJSKSBtb2RlIiwgInZiciJ9LAorICAgIHtWUFhfQ0JSLCAiQ29uc3RhbnQgQml0IFJhdGUgKENCUikgbW9kZSIsICJjYnIifSwKKyAgICB7VlBYX0NRLCAiQ29uc3RhbnQgUXVhbGl0eSBNb2RlIChDUSkgbW9kZSIsICJjcSJ9LAorICAgIHswLCBOVUxMLCBOVUxMfQorICB9OworICBzdGF0aWMgdm9sYXRpbGUgR1R5cGUgaWQgPSAwOworCisgIGlmIChnX29uY2VfaW5pdF9lbnRlciAoKGdzaXplICopICYgaWQpKSB7CisgICAgR1R5cGUgX2lkOworCisgICAgX2lkID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFZQWEVuY0VuZFVzYWdlIiwgdmFsdWVzKTsKKworICAgIGdfb25jZV9pbml0X2xlYXZlICgoZ3NpemUgKikgJiBpZCwgX2lkKTsKKyAgfQorCisgIHJldHVybiBpZDsKK30KKworI2RlZmluZSBHU1RfVlBYX0VOQ19NVUxUSVBBU1NfTU9ERV9UWVBFIChnc3RfdnB4X2VuY19tdWx0aXBhc3NfbW9kZV9nZXRfdHlwZSgpKQorc3RhdGljIEdUeXBlCitnc3RfdnB4X2VuY19tdWx0aXBhc3NfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAge1ZQWF9SQ19PTkVfUEFTUywgIk9uZSBwYXNzIGVuY29kaW5nIChkZWZhdWx0KSIsICJvbmUtcGFzcyJ9LAorICAgIHtWUFhfUkNfRklSU1RfUEFTUywgIkZpcnN0IHBhc3Mgb2YgbXVsdGlwYXNzIGVuY29kaW5nIiwgImZpcnN0LXBhc3MifSwKKyAgICB7VlBYX1JDX0xBU1RfUEFTUywgIkxhc3QgcGFzcyBvZiBtdWx0aXBhc3MgZW5jb2RpbmciLCAibGFzdC1wYXNzIn0sCisgICAgezAsIE5VTEwsIE5VTEx9CisgIH07CisgIHN0YXRpYyB2b2xhdGlsZSBHVHlwZSBpZCA9IDA7CisKKyAgaWYgKGdfb25jZV9pbml0X2VudGVyICgoZ3NpemUgKikgJiBpZCkpIHsKKyAgICBHVHlwZSBfaWQ7CisKKyAgICBfaWQgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0VlBYRW5jTXVsdGlwYXNzTW9kZSIsIHZhbHVlcyk7CisKKyAgICBnX29uY2VfaW5pdF9sZWF2ZSAoKGdzaXplICopICYgaWQsIF9pZCk7CisgIH0KKworICByZXR1cm4gaWQ7Cit9CisKKyNkZWZpbmUgR1NUX1ZQWF9FTkNfS0ZfTU9ERV9UWVBFIChnc3RfdnB4X2VuY19rZl9tb2RlX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF92cHhfZW5jX2tmX21vZGVfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIHZhbHVlc1tdID0geworICAgIHtWUFhfS0ZfQVVUTywgIkRldGVybWluZSBvcHRpbWFsIHBsYWNlbWVudCBhdXRvbWF0aWNhbGx5IiwgImF1dG8ifSwKKyAgICB7VlBYX0tGX0RJU0FCTEVELCAiRG9uJ3QgYXV0b21hdGljYWxseSBwbGFjZSBrZXlmcmFtZXMiLCAiZGlzYWJsZWQifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0KKyAgfTsKKyAgc3RhdGljIHZvbGF0aWxlIEdUeXBlIGlkID0gMDsKKworICBpZiAoZ19vbmNlX2luaXRfZW50ZXIgKChnc2l6ZSAqKSAmIGlkKSkgeworICAgIEdUeXBlIF9pZDsKKworICAgIF9pZCA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RWUFhFbmNLZk1vZGUiLCB2YWx1ZXMpOworCisgICAgZ19vbmNlX2luaXRfbGVhdmUgKChnc2l6ZSAqKSAmIGlkLCBfaWQpOworICB9CisKKyAgcmV0dXJuIGlkOworfQorCisjZGVmaW5lIEdTVF9WUFhfRU5DX1RVTklOR19UWVBFIChnc3RfdnB4X2VuY190dW5pbmdfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X3ZweF9lbmNfdHVuaW5nX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSB2YWx1ZXNbXSA9IHsKKyAgICB7VlA4X1RVTkVfUFNOUiwgIlR1bmUgZm9yIFBTTlIiLCAicHNuciJ9LAorICAgIHtWUDhfVFVORV9TU0lNLCAiVHVuZSBmb3IgU1NJTSIsICJzc2ltIn0sCisgICAgezAsIE5VTEwsIE5VTEx9CisgIH07CisgIHN0YXRpYyB2b2xhdGlsZSBHVHlwZSBpZCA9IDA7CisKKyAgaWYgKGdfb25jZV9pbml0X2VudGVyICgoZ3NpemUgKikgJiBpZCkpIHsKKyAgICBHVHlwZSBfaWQ7CisKKyAgICBfaWQgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0VlBYRW5jVHVuaW5nIiwgdmFsdWVzKTsKKworICAgIGdfb25jZV9pbml0X2xlYXZlICgoZ3NpemUgKikgJiBpZCwgX2lkKTsKKyAgfQorCisgIHJldHVybiBpZDsKK30KKworI2RlZmluZSBHU1RfVlBYX0VOQ19TQ0FMSU5HX01PREVfVFlQRSAoZ3N0X3ZweF9lbmNfc2NhbGluZ19tb2RlX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF92cHhfZW5jX3NjYWxpbmdfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAge1ZQOEVfTk9STUFMLCAiTm9ybWFsIiwgIm5vcm1hbCJ9LAorICAgIHtWUDhFX0ZPVVJGSVZFLCAiNDo1IiwgIjQ6NSJ9LAorICAgIHtWUDhFX1RIUkVFRklWRSwgIjM6NSIsICIzOjUifSwKKyAgICB7VlA4RV9PTkVUV08sICIxOjIiLCAiMToyIn0sCisgICAgezAsIE5VTEwsIE5VTEx9CisgIH07CisgIHN0YXRpYyB2b2xhdGlsZSBHVHlwZSBpZCA9IDA7CisKKyAgaWYgKGdfb25jZV9pbml0X2VudGVyICgoZ3NpemUgKikgJiBpZCkpIHsKKyAgICBHVHlwZSBfaWQ7CisKKyAgICBfaWQgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0VlBYRW5jU2NhbGluZ01vZGUiLCB2YWx1ZXMpOworCisgICAgZ19vbmNlX2luaXRfbGVhdmUgKChnc2l6ZSAqKSAmIGlkLCBfaWQpOworICB9CisKKyAgcmV0dXJuIGlkOworfQorCisjZGVmaW5lIEdTVF9WUFhfRU5DX1RPS0VOX1BBUlRJVElPTlNfVFlQRSAoZ3N0X3ZweF9lbmNfdG9rZW5fcGFydGl0aW9uc19nZXRfdHlwZSgpKQorc3RhdGljIEdUeXBlCitnc3RfdnB4X2VuY190b2tlbl9wYXJ0aXRpb25zX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSB2YWx1ZXNbXSA9IHsKKyAgICB7VlA4X09ORV9UT0tFTlBBUlRJVElPTiwgIk9uZSB0b2tlbiBwYXJ0aXRpb24iLCAiMSJ9LAorICAgIHtWUDhfVFdPX1RPS0VOUEFSVElUSU9OLCAiVHdvIHRva2VuIHBhcnRpdGlvbnMiLCAiMiJ9LAorICAgIHtWUDhfRk9VUl9UT0tFTlBBUlRJVElPTiwgIkZvdXIgdG9rZW4gcGFydGl0aW9ucyIsICI0In0sCisgICAge1ZQOF9FSUdIVF9UT0tFTlBBUlRJVElPTiwgIkVpZ2h0IHRva2VuIHBhcnRpdGlvbnMiLCAiOCJ9LAorICAgIHswLCBOVUxMLCBOVUxMfQorICB9OworICBzdGF0aWMgdm9sYXRpbGUgR1R5cGUgaWQgPSAwOworCisgIGlmIChnX29uY2VfaW5pdF9lbnRlciAoKGdzaXplICopICYgaWQpKSB7CisgICAgR1R5cGUgX2lkOworCisgICAgX2lkID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFZQWEVuY1Rva2VuUGFydGl0aW9ucyIsIHZhbHVlcyk7CisKKyAgICBnX29uY2VfaW5pdF9sZWF2ZSAoKGdzaXplICopICYgaWQsIF9pZCk7CisgIH0KKworICByZXR1cm4gaWQ7Cit9CisKKyNkZWZpbmUgR1NUX1ZQWF9FTkNfRVJfRkxBR1NfVFlQRSAoZ3N0X3ZweF9lbmNfZXJfZmxhZ3NfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X3ZweF9lbmNfZXJfZmxhZ3NfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBHRmxhZ3NWYWx1ZSB2YWx1ZXNbXSA9IHsKKyAgICB7VlBYX0VSUk9SX1JFU0lMSUVOVF9ERUZBVUxULCAiRGVmYXVsdCBlcnJvciByZXNpbGllbmNlIiwgImRlZmF1bHQifSwKKyAgICB7VlBYX0VSUk9SX1JFU0lMSUVOVF9QQVJUSVRJT05TLAorICAgICAgICAiQWxsb3cgcGFydGl0aW9ucyB0byBiZSBkZWNvZGVkIGluZGVwZW5kZW50bHkiLCAicGFydGl0aW9ucyJ9LAorICAgIHswLCBOVUxMLCBOVUxMfQorICB9OworICBzdGF0aWMgdm9sYXRpbGUgR1R5cGUgaWQgPSAwOworCisgIGlmIChnX29uY2VfaW5pdF9lbnRlciAoKGdzaXplICopICYgaWQpKSB7CisgICAgR1R5cGUgX2lkOworCisgICAgX2lkID0gZ19mbGFnc19yZWdpc3Rlcl9zdGF0aWMgKCJHc3RWUFhFbmNFckZsYWdzIiwgdmFsdWVzKTsKKworICAgIGdfb25jZV9pbml0X2xlYXZlICgoZ3NpemUgKikgJiBpZCwgX2lkKTsKKyAgfQorCisgIHJldHVybiBpZDsKK30KKworc3RhdGljIHZvaWQgZ3N0X3ZweF9lbmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X3ZweF9lbmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3ZweF9lbmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3ZweF9lbmNfc3RhcnQgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIpOworc3RhdGljIGdib29sZWFuIGdzdF92cHhfZW5jX3N0b3AgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIpOworc3RhdGljIGdib29sZWFuIGdzdF92cHhfZW5jX3NldF9mb3JtYXQgKEdzdFZpZGVvRW5jb2RlciAqCisgICAgdmlkZW9fZW5jb2RlciwgR3N0VmlkZW9Db2RlY1N0YXRlICogc3RhdGUpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3ZweF9lbmNfZmluaXNoIChHc3RWaWRlb0VuY29kZXIgKiB2aWRlb19lbmNvZGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdnB4X2VuY19mbHVzaCAoR3N0VmlkZW9FbmNvZGVyICogdmlkZW9fZW5jb2Rlcik7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfdnB4X2VuY19kcmFpbiAoR3N0VmlkZW9FbmNvZGVyICogdmlkZW9fZW5jb2Rlcik7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfdnB4X2VuY19oYW5kbGVfZnJhbWUgKEdzdFZpZGVvRW5jb2RlciAqCisgICAgdmlkZW9fZW5jb2RlciwgR3N0VmlkZW9Db2RlY0ZyYW1lICogZnJhbWUpOworc3RhdGljIGdib29sZWFuIGdzdF92cHhfZW5jX3NpbmtfZXZlbnQgKEdzdFZpZGVvRW5jb2RlciAqCisgICAgdmlkZW9fZW5jb2RlciwgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3ZweF9lbmNfcHJvcG9zZV9hbGxvY2F0aW9uIChHc3RWaWRlb0VuY29kZXIgKiBlbmNvZGVyLAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworCisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3RfdnB4X2VuY19wYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RWUFhFbmMsIGdzdF92cHhfZW5jLCBHU1RfVFlQRV9WSURFT19FTkNPREVSLAorICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfVEFHX1NFVFRFUiwgTlVMTCk7CisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9QUkVTRVQsIE5VTEwpOyk7CisKK3N0YXRpYyB2b2lkCitnc3RfdnB4X2VuY19jbGFzc19pbml0IChHc3RWUFhFbmNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdFZpZGVvRW5jb2RlckNsYXNzICp2aWRlb19lbmNvZGVyX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICB2aWRlb19lbmNvZGVyX2NsYXNzID0gR1NUX1ZJREVPX0VOQ09ERVJfQ0xBU1MgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdnB4X2VuY19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF92cHhfZW5jX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfdnB4X2VuY19maW5hbGl6ZTsKKworICB2aWRlb19lbmNvZGVyX2NsYXNzLT5zdGFydCA9IGdzdF92cHhfZW5jX3N0YXJ0OworICB2aWRlb19lbmNvZGVyX2NsYXNzLT5zdG9wID0gZ3N0X3ZweF9lbmNfc3RvcDsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcy0+aGFuZGxlX2ZyYW1lID0gZ3N0X3ZweF9lbmNfaGFuZGxlX2ZyYW1lOworICB2aWRlb19lbmNvZGVyX2NsYXNzLT5zZXRfZm9ybWF0ID0gZ3N0X3ZweF9lbmNfc2V0X2Zvcm1hdDsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcy0+Zmx1c2ggPSBnc3RfdnB4X2VuY19mbHVzaDsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcy0+ZmluaXNoID0gZ3N0X3ZweF9lbmNfZmluaXNoOworICB2aWRlb19lbmNvZGVyX2NsYXNzLT5zaW5rX2V2ZW50ID0gZ3N0X3ZweF9lbmNfc2lua19ldmVudDsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcy0+cHJvcG9zZV9hbGxvY2F0aW9uID0gZ3N0X3ZweF9lbmNfcHJvcG9zZV9hbGxvY2F0aW9uOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkNfRU5EX1VTQUdFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJlbmQtdXNhZ2UiLCAiUmF0ZSBjb250cm9sIG1vZGUiLAorICAgICAgICAgICJSYXRlIGNvbnRyb2wgbW9kZSIsCisgICAgICAgICAgR1NUX1ZQWF9FTkNfRU5EX1VTQUdFX1RZUEUsIERFRkFVTFRfUkNfRU5EX1VTQUdFLAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JDX1RBUkdFVF9CSVRSQVRFLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInRhcmdldC1iaXRyYXRlIiwgIlRhcmdldCBiaXRyYXRlIiwKKyAgICAgICAgICAiVGFyZ2V0IGJpdHJhdGUgKGluIGJpdHMvc2VjKSIsCisgICAgICAgICAgMCwgR19NQVhJTlQsIERFRkFVTFRfUkNfVEFSR0VUX0JJVFJBVEUsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkNfTUlOX1FVQU5USVpFUiwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJtaW4tcXVhbnRpemVyIiwgIk1pbmltdW0gUXVhbnRpemVyIiwKKyAgICAgICAgICAiTWluaW11bSBRdWFudGl6ZXIgKGJlc3QpIiwKKyAgICAgICAgICAwLCA2MywgREVGQVVMVF9SQ19NSU5fUVVBTlRJWkVSLAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JDX01BWF9RVUFOVElaRVIsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgibWF4LXF1YW50aXplciIsICJNYXhpbXVtIFF1YW50aXplciIsCisgICAgICAgICAgIk1heGltdW0gUXVhbnRpemVyICh3b3JzdCkiLAorICAgICAgICAgIDAsIDYzLCBERUZBVUxUX1JDX01BWF9RVUFOVElaRVIsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkNfRFJPUEZSQU1FX1RIUkVTSCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJkcm9wZnJhbWUtdGhyZXNob2xkIiwgIkRyb3AgRnJhbWUgVGhyZXNob2xkIiwKKyAgICAgICAgICAiVGVtcG9yYWwgcmVzYW1wbGluZyB0aHJlc2hvbGQgKGJ1ZiAlKSIsCisgICAgICAgICAgMCwgMTAwLCBERUZBVUxUX1JDX0RST1BGUkFNRV9USFJFU0gsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkNfUkVTSVpFX0FMTE9XRUQsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInJlc2l6ZS1hbGxvd2VkIiwgIlJlc2l6ZSBBbGxvd2VkIiwKKyAgICAgICAgICAiQWxsb3cgc3BhdGlhbCByZXNhbXBsaW5nIiwKKyAgICAgICAgICBERUZBVUxUX1JDX1JFU0laRV9BTExPV0VELAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JDX1JFU0laRV9VUF9USFJFU0gsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicmVzaXplLXVwLXRocmVzaG9sZCIsICJSZXNpemUgVXAgVGhyZXNob2xkIiwKKyAgICAgICAgICAiVXBzY2FsZSB0aHJlc2hvbGQgKGJ1ZiAlKSIsCisgICAgICAgICAgMCwgMTAwLCBERUZBVUxUX1JDX1JFU0laRV9VUF9USFJFU0gsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkNfUkVTSVpFX0RPV05fVEhSRVNILAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInJlc2l6ZS1kb3duLXRocmVzaG9sZCIsICJSZXNpemUgRG93biBUaHJlc2hvbGQiLAorICAgICAgICAgICJEb3duc2NhbGUgdGhyZXNob2xkIChidWYgJSkiLAorICAgICAgICAgIDAsIDEwMCwgREVGQVVMVF9SQ19SRVNJWkVfRE9XTl9USFJFU0gsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkNfVU5ERVJTSE9PVF9QQ1QsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgidW5kZXJzaG9vdCIsICJVbmRlcnNob290IFBDVCIsCisgICAgICAgICAgIkRhdGFyYXRlIHVuZGVyc2hvb3QgKG1pbikgdGFyZ2V0ICglKSIsCisgICAgICAgICAgMCwgMTAwMCwgREVGQVVMVF9SQ19VTkRFUlNIT09UX1BDVCwKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SQ19PVkVSU0hPT1RfUENULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoIm92ZXJzaG9vdCIsICJPdmVyc2hvb3QgUENUIiwKKyAgICAgICAgICAiRGF0YXJhdGUgb3ZlcnNob290IChtYXgpIHRhcmdldCAoJSkiLAorICAgICAgICAgIDAsIDEwMDAsIERFRkFVTFRfUkNfT1ZFUlNIT09UX1BDVCwKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SQ19CVUZfU1osCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiYnVmZmVyLXNpemUiLCAiQnVmZmVyIHNpemUiLAorICAgICAgICAgICJDbGllbnQgYnVmZmVyIHNpemUgKG1zKSIsCisgICAgICAgICAgMCwgR19NQVhJTlQsIERFRkFVTFRfUkNfQlVGX1NaLAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JDX0JVRl9JTklUSUFMX1NaLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImJ1ZmZlci1pbml0aWFsLXNpemUiLCAiQnVmZmVyIGluaXRpYWwgc2l6ZSIsCisgICAgICAgICAgIkluaXRpYWwgY2xpZW50IGJ1ZmZlciBzaXplIChtcykiLAorICAgICAgICAgIDAsIEdfTUFYSU5ULCBERUZBVUxUX1JDX0JVRl9JTklUSUFMX1NaLAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JDX0JVRl9PUFRJTUFMX1NaLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImJ1ZmZlci1vcHRpbWFsLXNpemUiLCAiQnVmZmVyIG9wdGltYWwgc2l6ZSIsCisgICAgICAgICAgIk9wdGltYWwgY2xpZW50IGJ1ZmZlciBzaXplIChtcykiLAorICAgICAgICAgIDAsIEdfTUFYSU5ULCBERUZBVUxUX1JDX0JVRl9PUFRJTUFMX1NaLAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JDXzJQQVNTX1ZCUl9CSUFTX1BDVCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ0d29wYXNzLXZici1iaWFzIiwgIjItcGFzcyBWQlIgYmlhcyIsCisgICAgICAgICAgIkNCUi9WQlIgYmlhcyAoMD1DQlIsIDEwMD1WQlIpIiwKKyAgICAgICAgICAwLCAxMDAsIERFRkFVTFRfUkNfMlBBU1NfVkJSX0JJQVNfUENULAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9SQ18yUEFTU19WQlJfTUlOU0VDVElPTl9QQ1QsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgidHdvcGFzcy12YnItbWluc2VjdGlvbiIsICIyLXBhc3MgR09QIG1pbiBiaXRyYXRlIiwKKyAgICAgICAgICAiR09QIG1pbmltdW0gYml0cmF0ZSAoJSB0YXJnZXQpIiwgMCwgR19NQVhJTlQsCisgICAgICAgICAgREVGQVVMVF9SQ18yUEFTU19WQlJfTUlOU0VDVElPTl9QQ1QsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1JDXzJQQVNTX1ZCUl9NQVhTRUNUSU9OX1BDVCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ0d29wYXNzLXZici1tYXhzZWN0aW9uIiwgIjItcGFzcyBHT1AgbWF4IGJpdHJhdGUiLAorICAgICAgICAgICJHT1AgbWF4aW11bSBiaXRyYXRlICglIHRhcmdldCkiLCAwLCBHX01BWElOVCwKKyAgICAgICAgICBERUZBVUxUX1JDXzJQQVNTX1ZCUl9NSU5TRUNUSU9OX1BDVCwKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9LRl9NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJrZXlmcmFtZS1tb2RlIiwgIktleWZyYW1lIE1vZGUiLAorICAgICAgICAgICJLZXlmcmFtZSBwbGFjZW1lbnQiLAorICAgICAgICAgIEdTVF9WUFhfRU5DX0tGX01PREVfVFlQRSwgREVGQVVMVF9LRl9NT0RFLAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0tGX01BWF9ESVNULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImtleWZyYW1lLW1heC1kaXN0IiwgIktleWZyYW1lIG1heCBkaXN0YW5jZSIsCisgICAgICAgICAgIk1heGltdW0gZGlzdGFuY2UgYmV0d2VlbiBrZXlmcmFtZXMgKG51bWJlciBvZiBmcmFtZXMpIiwKKyAgICAgICAgICAwLCBHX01BWElOVCwgREVGQVVMVF9LRl9NQVhfRElTVCwKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NVUxUSVBBU1NfTU9ERSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgibXVsdGlwYXNzLW1vZGUiLCAiTXVsdGlwYXNzIE1vZGUiLAorICAgICAgICAgICJNdWx0aXBhc3MgZW5jb2RlIG1vZGUiLAorICAgICAgICAgIEdTVF9WUFhfRU5DX01VTFRJUEFTU19NT0RFX1RZUEUsIERFRkFVTFRfTVVMVElQQVNTX01PREUsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTVVMVElQQVNTX0NBQ0hFX0ZJTEUsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgibXVsdGlwYXNzLWNhY2hlLWZpbGUiLCAiTXVsdGlwYXNzIENhY2hlIEZpbGUiLAorICAgICAgICAgICJNdWx0aXBhc3MgY2FjaGUgZmlsZS4gIgorICAgICAgICAgICJJZiBzdHJlYW0gY2FwcyByZWluaXRlZCwgbXVsdGlwbGUgZmlsZXMgd2lsbCBiZSBjcmVhdGVkOiAiCisgICAgICAgICAgImZpbGUsIGZpbGUuMSwgZmlsZS4yLCAuLi4gYW5kIHNvIG9uLiIsCisgICAgICAgICAgREVGQVVMVF9NVUxUSVBBU1NfQ0FDSEVfRklMRSwKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UU19OVU1CRVJfTEFZRVJTLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInRlbXBvcmFsLXNjYWxhYmlsaXR5LW51bWJlci1sYXllcnMiLAorICAgICAgICAgICJOdW1iZXIgb2YgY29kaW5nIGxheWVycyIsICJOdW1iZXIgb2YgY29kaW5nIGxheWVycyB0byB1c2UiLCAxLCA1LAorICAgICAgICAgIERFRkFVTFRfVFNfTlVNQkVSX0xBWUVSUywKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UU19UQVJHRVRfQklUUkFURSwKKyAgICAgIGdfcGFyYW1fc3BlY192YWx1ZV9hcnJheSAoInRlbXBvcmFsLXNjYWxhYmlsaXR5LXRhcmdldC1iaXRyYXRlIiwKKyAgICAgICAgICAiQ29kaW5nIGxheWVyIHRhcmdldCBiaXRyYXRlcyIsCisgICAgICAgICAgIlRhcmdldCBiaXRyYXRlcyBmb3IgY29kaW5nIGxheWVycyAob25lIHBlciBsYXllciwgZGVjcmVhc2luZykiLAorICAgICAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ0YXJnZXQtYml0cmF0ZSIsICJUYXJnZXQgYml0cmF0ZSIsCisgICAgICAgICAgICAgICJUYXJnZXQgYml0cmF0ZSIsIDAsIEdfTUFYSU5ULCBERUZBVUxUX1JDX1RBUkdFVF9CSVRSQVRFLAorICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVFNfUkFURV9ERUNJTUFUT1IsCisgICAgICBnX3BhcmFtX3NwZWNfdmFsdWVfYXJyYXkgKCJ0ZW1wb3JhbC1zY2FsYWJpbGl0eS1yYXRlLWRlY2ltYXRvciIsCisgICAgICAgICAgIkNvZGluZyBsYXllciByYXRlIGRlY2ltYXRvciIsCisgICAgICAgICAgIlJhdGUgZGVjaW1hdGlvbiBmYWN0b3JzIGZvciBlYWNoIGxheWVyIiwKKyAgICAgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicmF0ZS1kZWNpbWF0b3IiLCAiUmF0ZSBkZWNpbWF0b3IiLAorICAgICAgICAgICAgICAiUmF0ZSBkZWNpbWF0b3IiLCAwLCAxMDAwMDAwMDAwLCAwLAorICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVFNfUEVSSU9ESUNJVFksCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgidGVtcG9yYWwtc2NhbGFiaWxpdHktcGVyaW9kaWNpdHkiLAorICAgICAgICAgICJDb2RpbmcgbGF5ZXIgcGVyaW9kaWNpdHkiLAorICAgICAgICAgICJMZW5ndGggb2Ygc2VxdWVuY2UgdGhhdCBkZWZpbmVzIGxheWVyIG1lbWJlcnNoaXAgcGVyaW9kaWNpdHkiLCAwLCAxNiwKKyAgICAgICAgICBERUZBVUxUX1RTX1BFUklPRElDSVRZLAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RTX0xBWUVSX0lELAorICAgICAgZ19wYXJhbV9zcGVjX3ZhbHVlX2FycmF5ICgidGVtcG9yYWwtc2NhbGFiaWxpdHktbGF5ZXItaWQiLAorICAgICAgICAgICJDb2RpbmcgbGF5ZXIgaWRlbnRpZmljYXRpb24iLAorICAgICAgICAgICJTZXF1ZW5jZSBkZWZpbmluZyBjb2RpbmcgbGF5ZXIgbWVtYmVyc2hpcCIsCisgICAgICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImxheWVyLWlkIiwgIkxheWVyIElEIiwgIkxheWVyIElEIiwgMCwgNCwgMCwKKyAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0xBR19JTl9GUkFNRVMsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgibGFnLWluLWZyYW1lcyIsICJMYWcgaW4gZnJhbWVzIiwKKyAgICAgICAgICAiTWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIHRvIGxhZyIsCisgICAgICAgICAgMCwgMjUsIERFRkFVTFRfTEFHX0lOX0ZSQU1FUywKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9FUlJPUl9SRVNJTElFTlQsCisgICAgICBnX3BhcmFtX3NwZWNfZmxhZ3MgKCJlcnJvci1yZXNpbGllbnQiLCAiRXJyb3IgcmVzaWxpZW50IiwKKyAgICAgICAgICAiRXJyb3IgcmVzaWxpZW5jZSBmbGFncyIsCisgICAgICAgICAgR1NUX1ZQWF9FTkNfRVJfRkxBR1NfVFlQRSwgREVGQVVMVF9FUlJPUl9SRVNJTElFTlQsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVEhSRUFEUywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ0aHJlYWRzIiwgIlRocmVhZHMiLAorICAgICAgICAgICJOdW1iZXIgb2YgdGhyZWFkcyB0byB1c2UiLAorICAgICAgICAgIDAsIDY0LCBERUZBVUxUX1RIUkVBRFMsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfREVBRExJTkUsCisgICAgICBnX3BhcmFtX3NwZWNfaW50NjQgKCJkZWFkbGluZSIsICJEZWFkbGluZSIsCisgICAgICAgICAgIkRlYWRsaW5lIHBlciBmcmFtZSAodXNlYywgMD1kaXNhYmxlZCkiLAorICAgICAgICAgIDAsIEdfTUFYSU5UNjQsIERFRkFVTFRfREVBRExJTkUsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSF9TQ0FMSU5HX01PREUsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoImhvcml6b250YWwtc2NhbGluZy1tb2RlIiwgIkhvcml6b250YWwgc2NhbGluZyBtb2RlIiwKKyAgICAgICAgICAiSG9yaXpvbnRhbCBzY2FsaW5nIG1vZGUiLAorICAgICAgICAgIEdTVF9WUFhfRU5DX1NDQUxJTkdfTU9ERV9UWVBFLCBERUZBVUxUX0hfU0NBTElOR19NT0RFLAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1ZfU0NBTElOR19NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJ2ZXJ0aWNhbC1zY2FsaW5nLW1vZGUiLCAiVmVydGljYWwgc2NhbGluZyBtb2RlIiwKKyAgICAgICAgICAiVmVydGljYWwgc2NhbGluZyBtb2RlIiwKKyAgICAgICAgICBHU1RfVlBYX0VOQ19TQ0FMSU5HX01PREVfVFlQRSwgREVGQVVMVF9WX1NDQUxJTkdfTU9ERSwKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DUFVfVVNFRCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJjcHUtdXNlZCIsICJDUFUgdXNlZCIsCisgICAgICAgICAgIkNQVSB1c2VkIiwKKyAgICAgICAgICAtMTYsIDE2LCBERUZBVUxUX0NQVV9VU0VELAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0VOQUJMRV9BVVRPX0FMVF9SRUYsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImF1dG8tYWx0LXJlZiIsICJBdXRvIGFsdCByZWZlcmVuY2UgZnJhbWVzIiwKKyAgICAgICAgICAiQXV0b21hdGljYWxseSBnZW5lcmF0ZSBBbHRSZWYgZnJhbWVzIiwKKyAgICAgICAgICBERUZBVUxUX0VOQUJMRV9BVVRPX0FMVF9SRUYsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTk9JU0VfU0VOU0lUSVZJVFksCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgibm9pc2Utc2Vuc2l0aXZpdHkiLCAiTm9pc2Ugc2Vuc2l0aXZpdHkiLAorICAgICAgICAgICJOb2lzZSBzZW5zaXNpdml0eSAoZnJhbWVzIHRvIGJsdXIpIiwKKyAgICAgICAgICAwLCA2LCBERUZBVUxUX05PSVNFX1NFTlNJVElWSVRZLAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NIQVJQTkVTUywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJzaGFycG5lc3MiLCAiU2hhcnBuZXNzIiwKKyAgICAgICAgICAiRmlsdGVyIHNoYXJwbmVzcyIsCisgICAgICAgICAgMCwgNywgREVGQVVMVF9TSEFSUE5FU1MsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU1RBVElDX1RIUkVTSE9MRCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJzdGF0aWMtdGhyZXNob2xkIiwgIlN0YXRpYyBUaHJlc2hvbGQiLAorICAgICAgICAgICJNb3Rpb24gZGV0ZWN0aW9uIHRocmVzaG9sZCIsCisgICAgICAgICAgMCwgR19NQVhJTlQsIERFRkFVTFRfU1RBVElDX1RIUkVTSE9MRCwKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UT0tFTl9QQVJUSVRJT05TLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJ0b2tlbi1wYXJ0aXRpb25zIiwgIlRva2VuIHBhcnRpdGlvbnMiLAorICAgICAgICAgICJOdW1iZXIgb2YgdG9rZW4gcGFydGl0aW9ucyIsCisgICAgICAgICAgR1NUX1ZQWF9FTkNfVE9LRU5fUEFSVElUSU9OU19UWVBFLCBERUZBVUxUX1RPS0VOX1BBUlRJVElPTlMsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQVJOUl9NQVhGUkFNRVMsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiYXJuci1tYXhmcmFtZXMiLCAiQWx0UmVmIG1heCBmcmFtZXMiLAorICAgICAgICAgICJBbHRSZWYgbWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIiwKKyAgICAgICAgICAwLCAxNSwgREVGQVVMVF9BUk5SX01BWEZSQU1FUywKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9BUk5SX1NUUkVOR1RILAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImFybnItc3RyZW5ndGgiLCAiQWx0UmVmIHN0cmVuZ3RoIiwKKyAgICAgICAgICAiQWx0UmVmIHN0cmVuZ3RoIiwKKyAgICAgICAgICAwLCA2LCBERUZBVUxUX0FSTlJfU1RSRU5HVEgsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQVJOUl9UWVBFLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImFybnItdHlwZSIsICJBbHRSZWYgdHlwZSIsCisgICAgICAgICAgIkFsdFJlZiB0eXBlIiwKKyAgICAgICAgICAxLCAzLCBERUZBVUxUX0FSTlJfVFlQRSwKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfAorICAgICAgICAgICAgICBHX1BBUkFNX0RFUFJFQ0FURUQpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UVU5JTkcsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoInR1bmluZyIsICJUdW5pbmciLAorICAgICAgICAgICJUdW5pbmciLAorICAgICAgICAgIEdTVF9WUFhfRU5DX1RVTklOR19UWVBFLCBERUZBVUxUX1RVTklORywKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DUV9MRVZFTCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJjcS1sZXZlbCIsICJDb25zdHJhaW5lZCBxdWFsaXR5IGxldmVsIiwKKyAgICAgICAgICAiQ29uc3RyYWluZWQgcXVhbGl0eSBsZXZlbCIsCisgICAgICAgICAgMCwgNjMsIERFRkFVTFRfQ1FfTEVWRUwsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX0lOVFJBX0JJVFJBVEVfUENULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoIm1heC1pbnRyYS1iaXRyYXRlIiwgIk1heCBJbnRyYSBiaXRyYXRlIiwKKyAgICAgICAgICAiTWF4aW11bSBJbnRyYSBmcmFtZSBiaXRyYXRlIiwKKyAgICAgICAgICAwLCBHX01BWElOVCwgREVGQVVMVF9NQVhfSU5UUkFfQklUUkFURV9QQ1QsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVElNRUJBU0UsCisgICAgICBnc3RfcGFyYW1fc3BlY19mcmFjdGlvbiAoInRpbWViYXNlIiwgIlNob3J0ZXN0IGludGVyZnJhbWUgdGltZSIsCisgICAgICAgICAgIkZyYWN0aW9uIG9mIG9uZSBzZWNvbmQgdGhhdCBpcyB0aGUgc2hvcnRlc3QgaW50ZXJmcmFtZSB0aW1lIC0gbm9ybWFsbHkgbGVmdCBhcyB6ZXJvIHdoaWNoIHdpbGwgZGVmYXVsdCB0byB0aGUgZnJhbWVyYXRlIiwKKyAgICAgICAgICAwLCAxLCBHX01BWElOVCwgMSwgREVGQVVMVF9USU1FQkFTRV9OLCBERUZBVUxUX1RJTUVCQVNFX0QsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF92cHhlbmNfZGVidWcsICJ2cHhlbmMiLCAwLCAiVlBYIEVuY29kZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92cHhfZW5jX2luaXQgKEdzdFZQWEVuYyAqIGdzdF92cHhfZW5jKQoreworICBHU1RfREVCVUdfT0JKRUNUIChnc3RfdnB4X2VuYywgImluaXQiKTsKKyAgR1NUX1BBRF9TRVRfQUNDRVBUX1RFTVBMQVRFIChHU1RfVklERU9fRU5DT0RFUl9TSU5LX1BBRCAoZ3N0X3ZweF9lbmMpKTsKKworICBnc3RfdnB4X2VuYy0+Y2ZnLnJjX2VuZF91c2FnZSA9IERFRkFVTFRfUkNfRU5EX1VTQUdFOworICBnc3RfdnB4X2VuYy0+Y2ZnLnJjX3RhcmdldF9iaXRyYXRlID0gREVGQVVMVF9SQ19UQVJHRVRfQklUUkFURSAvIDEwMDA7CisgIGdzdF92cHhfZW5jLT5yY190YXJnZXRfYml0cmF0ZV9zZXQgPSBGQUxTRTsKKyAgZ3N0X3ZweF9lbmMtPmNmZy5yY19taW5fcXVhbnRpemVyID0gREVGQVVMVF9SQ19NSU5fUVVBTlRJWkVSOworICBnc3RfdnB4X2VuYy0+Y2ZnLnJjX21heF9xdWFudGl6ZXIgPSBERUZBVUxUX1JDX01BWF9RVUFOVElaRVI7CisgIGdzdF92cHhfZW5jLT5jZmcucmNfZHJvcGZyYW1lX3RocmVzaCA9IERFRkFVTFRfUkNfRFJPUEZSQU1FX1RIUkVTSDsKKyAgZ3N0X3ZweF9lbmMtPmNmZy5yY19yZXNpemVfYWxsb3dlZCA9IERFRkFVTFRfUkNfUkVTSVpFX0FMTE9XRUQ7CisgIGdzdF92cHhfZW5jLT5jZmcucmNfcmVzaXplX3VwX3RocmVzaCA9IERFRkFVTFRfUkNfUkVTSVpFX1VQX1RIUkVTSDsKKyAgZ3N0X3ZweF9lbmMtPmNmZy5yY19yZXNpemVfZG93bl90aHJlc2ggPSBERUZBVUxUX1JDX1JFU0laRV9ET1dOX1RIUkVTSDsKKyAgZ3N0X3ZweF9lbmMtPmNmZy5yY191bmRlcnNob290X3BjdCA9IERFRkFVTFRfUkNfVU5ERVJTSE9PVF9QQ1Q7CisgIGdzdF92cHhfZW5jLT5jZmcucmNfb3ZlcnNob290X3BjdCA9IERFRkFVTFRfUkNfT1ZFUlNIT09UX1BDVDsKKyAgZ3N0X3ZweF9lbmMtPmNmZy5yY19idWZfc3ogPSBERUZBVUxUX1JDX0JVRl9TWjsKKyAgZ3N0X3ZweF9lbmMtPmNmZy5yY19idWZfaW5pdGlhbF9zeiA9IERFRkFVTFRfUkNfQlVGX0lOSVRJQUxfU1o7CisgIGdzdF92cHhfZW5jLT5jZmcucmNfYnVmX29wdGltYWxfc3ogPSBERUZBVUxUX1JDX0JVRl9PUFRJTUFMX1NaOworICBnc3RfdnB4X2VuYy0+Y2ZnLnJjXzJwYXNzX3Zicl9iaWFzX3BjdCA9IERFRkFVTFRfUkNfMlBBU1NfVkJSX0JJQVNfUENUOworICBnc3RfdnB4X2VuYy0+Y2ZnLnJjXzJwYXNzX3Zicl9taW5zZWN0aW9uX3BjdCA9CisgICAgICBERUZBVUxUX1JDXzJQQVNTX1ZCUl9NSU5TRUNUSU9OX1BDVDsKKyAgZ3N0X3ZweF9lbmMtPmNmZy5yY18ycGFzc192YnJfbWF4c2VjdGlvbl9wY3QgPQorICAgICAgREVGQVVMVF9SQ18yUEFTU19WQlJfTUFYU0VDVElPTl9QQ1Q7CisgIGdzdF92cHhfZW5jLT5jZmcua2ZfbW9kZSA9IERFRkFVTFRfS0ZfTU9ERTsKKyAgZ3N0X3ZweF9lbmMtPmNmZy5rZl9tYXhfZGlzdCA9IERFRkFVTFRfS0ZfTUFYX0RJU1Q7CisgIGdzdF92cHhfZW5jLT5jZmcuZ19wYXNzID0gREVGQVVMVF9NVUxUSVBBU1NfTU9ERTsKKyAgZ3N0X3ZweF9lbmMtPm11bHRpcGFzc19jYWNoZV9wcmVmaXggPSBnX3N0cmR1cCAoREVGQVVMVF9NVUxUSVBBU1NfQ0FDSEVfRklMRSk7CisgIGdzdF92cHhfZW5jLT5tdWx0aXBhc3NfY2FjaGVfZmlsZSA9IE5VTEw7CisgIGdzdF92cHhfZW5jLT5tdWx0aXBhc3NfY2FjaGVfaWR4ID0gMDsKKyAgZ3N0X3ZweF9lbmMtPmNmZy50c19udW1iZXJfbGF5ZXJzID0gREVGQVVMVF9UU19OVU1CRVJfTEFZRVJTOworICBnc3RfdnB4X2VuYy0+bl90c190YXJnZXRfYml0cmF0ZSA9IDA7CisgIGdzdF92cHhfZW5jLT5uX3RzX3JhdGVfZGVjaW1hdG9yID0gMDsKKyAgZ3N0X3ZweF9lbmMtPmNmZy50c19wZXJpb2RpY2l0eSA9IERFRkFVTFRfVFNfUEVSSU9ESUNJVFk7CisgIGdzdF92cHhfZW5jLT5uX3RzX2xheWVyX2lkID0gMDsKKyAgZ3N0X3ZweF9lbmMtPmNmZy5nX2Vycm9yX3Jlc2lsaWVudCA9IERFRkFVTFRfRVJST1JfUkVTSUxJRU5UOworICBnc3RfdnB4X2VuYy0+Y2ZnLmdfbGFnX2luX2ZyYW1lcyA9IERFRkFVTFRfTEFHX0lOX0ZSQU1FUzsKKyAgZ3N0X3ZweF9lbmMtPmNmZy5nX3RocmVhZHMgPSBERUZBVUxUX1RIUkVBRFM7CisgIGdzdF92cHhfZW5jLT5kZWFkbGluZSA9IERFRkFVTFRfREVBRExJTkU7CisgIGdzdF92cHhfZW5jLT5oX3NjYWxpbmdfbW9kZSA9IERFRkFVTFRfSF9TQ0FMSU5HX01PREU7CisgIGdzdF92cHhfZW5jLT52X3NjYWxpbmdfbW9kZSA9IERFRkFVTFRfVl9TQ0FMSU5HX01PREU7CisgIGdzdF92cHhfZW5jLT5jcHVfdXNlZCA9IERFRkFVTFRfQ1BVX1VTRUQ7CisgIGdzdF92cHhfZW5jLT5lbmFibGVfYXV0b19hbHRfcmVmID0gREVGQVVMVF9FTkFCTEVfQVVUT19BTFRfUkVGOworICBnc3RfdnB4X2VuYy0+bm9pc2Vfc2Vuc2l0aXZpdHkgPSBERUZBVUxUX05PSVNFX1NFTlNJVElWSVRZOworICBnc3RfdnB4X2VuYy0+c2hhcnBuZXNzID0gREVGQVVMVF9TSEFSUE5FU1M7CisgIGdzdF92cHhfZW5jLT5zdGF0aWNfdGhyZXNob2xkID0gREVGQVVMVF9TVEFUSUNfVEhSRVNIT0xEOworICBnc3RfdnB4X2VuYy0+dG9rZW5fcGFydGl0aW9ucyA9IERFRkFVTFRfVE9LRU5fUEFSVElUSU9OUzsKKyAgZ3N0X3ZweF9lbmMtPmFybnJfbWF4ZnJhbWVzID0gREVGQVVMVF9BUk5SX01BWEZSQU1FUzsKKyAgZ3N0X3ZweF9lbmMtPmFybnJfc3RyZW5ndGggPSBERUZBVUxUX0FSTlJfU1RSRU5HVEg7CisgIGdzdF92cHhfZW5jLT5hcm5yX3R5cGUgPSBERUZBVUxUX0FSTlJfVFlQRTsKKyAgZ3N0X3ZweF9lbmMtPnR1bmluZyA9IERFRkFVTFRfVFVOSU5HOworICBnc3RfdnB4X2VuYy0+Y3FfbGV2ZWwgPSBERUZBVUxUX0NRX0xFVkVMOworICBnc3RfdnB4X2VuYy0+bWF4X2ludHJhX2JpdHJhdGVfcGN0ID0gREVGQVVMVF9NQVhfSU5UUkFfQklUUkFURV9QQ1Q7CisgIGdzdF92cHhfZW5jLT50aW1lYmFzZV9uID0gREVGQVVMVF9USU1FQkFTRV9OOworICBnc3RfdnB4X2VuYy0+dGltZWJhc2VfZCA9IERFRkFVTFRfVElNRUJBU0VfRDsKKworICBnc3RfdnB4X2VuYy0+Y2ZnLmdfcHJvZmlsZSA9IERFRkFVTFRfUFJPRklMRTsKKworICBnX211dGV4X2luaXQgKCZnc3RfdnB4X2VuYy0+ZW5jb2Rlcl9sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92cHhfZW5jX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RWUFhFbmMgKmdzdF92cHhfZW5jOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG9iamVjdCwgImZpbmFsaXplIik7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1ZQWF9FTkMgKG9iamVjdCkpOworICBnc3RfdnB4X2VuYyA9IEdTVF9WUFhfRU5DIChvYmplY3QpOworCisgIGdfZnJlZSAoZ3N0X3ZweF9lbmMtPm11bHRpcGFzc19jYWNoZV9wcmVmaXgpOworICBnX2ZyZWUgKGdzdF92cHhfZW5jLT5tdWx0aXBhc3NfY2FjaGVfZmlsZSk7CisgIGdzdF92cHhfZW5jLT5tdWx0aXBhc3NfY2FjaGVfaWR4ID0gMDsKKworCisgIGlmIChnc3RfdnB4X2VuYy0+aW5wdXRfc3RhdGUpCisgICAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChnc3RfdnB4X2VuYy0+aW5wdXRfc3RhdGUpOworCisgIGdfbXV0ZXhfY2xlYXIgKCZnc3RfdnB4X2VuYy0+ZW5jb2Rlcl9sb2NrKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnB4X2VuY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VlBYRW5jICpnc3RfdnB4X2VuYzsKKyAgZ2Jvb2xlYW4gZ2xvYmFsID0gRkFMU0U7CisgIHZweF9jb2RlY19lcnJfdCBzdGF0dXM7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1ZQWF9FTkMgKG9iamVjdCkpOworICBnc3RfdnB4X2VuYyA9IEdTVF9WUFhfRU5DIChvYmplY3QpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG9iamVjdCwgImdzdF92cHhfZW5jX3NldF9wcm9wZXJ0eSIpOworICBnX211dGV4X2xvY2sgKCZnc3RfdnB4X2VuYy0+ZW5jb2Rlcl9sb2NrKTsKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1JDX0VORF9VU0FHRToKKyAgICAgIGdzdF92cHhfZW5jLT5jZmcucmNfZW5kX3VzYWdlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgZ2xvYmFsID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SQ19UQVJHRVRfQklUUkFURToKKyAgICAgIGdzdF92cHhfZW5jLT5jZmcucmNfdGFyZ2V0X2JpdHJhdGUgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKSAvIDEwMDA7CisgICAgICBnc3RfdnB4X2VuYy0+cmNfdGFyZ2V0X2JpdHJhdGVfc2V0ID0gVFJVRTsKKyAgICAgIGdsb2JhbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfTUlOX1FVQU5USVpFUjoKKyAgICAgIGdzdF92cHhfZW5jLT5jZmcucmNfbWluX3F1YW50aXplciA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgZ2xvYmFsID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SQ19NQVhfUVVBTlRJWkVSOgorICAgICAgZ3N0X3ZweF9lbmMtPmNmZy5yY19tYXhfcXVhbnRpemVyID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBnbG9iYWwgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JDX0RST1BGUkFNRV9USFJFU0g6CisgICAgICBnc3RfdnB4X2VuYy0+Y2ZnLnJjX2Ryb3BmcmFtZV90aHJlc2ggPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGdsb2JhbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfUkVTSVpFX0FMTE9XRUQ6CisgICAgICBnc3RfdnB4X2VuYy0+Y2ZnLnJjX3Jlc2l6ZV9hbGxvd2VkID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgZ2xvYmFsID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SQ19SRVNJWkVfVVBfVEhSRVNIOgorICAgICAgZ3N0X3ZweF9lbmMtPmNmZy5yY19yZXNpemVfdXBfdGhyZXNoID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBnbG9iYWwgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JDX1JFU0laRV9ET1dOX1RIUkVTSDoKKyAgICAgIGdzdF92cHhfZW5jLT5jZmcucmNfcmVzaXplX2Rvd25fdGhyZXNoID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBnbG9iYWwgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JDX1VOREVSU0hPT1RfUENUOgorICAgICAgZ3N0X3ZweF9lbmMtPmNmZy5yY191bmRlcnNob290X3BjdCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgZ2xvYmFsID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SQ19PVkVSU0hPT1RfUENUOgorICAgICAgZ3N0X3ZweF9lbmMtPmNmZy5yY19vdmVyc2hvb3RfcGN0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBnbG9iYWwgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JDX0JVRl9TWjoKKyAgICAgIGdzdF92cHhfZW5jLT5jZmcucmNfYnVmX3N6ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBnbG9iYWwgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JDX0JVRl9JTklUSUFMX1NaOgorICAgICAgZ3N0X3ZweF9lbmMtPmNmZy5yY19idWZfaW5pdGlhbF9zeiA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgZ2xvYmFsID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SQ19CVUZfT1BUSU1BTF9TWjoKKyAgICAgIGdzdF92cHhfZW5jLT5jZmcucmNfYnVmX29wdGltYWxfc3ogPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGdsb2JhbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfMlBBU1NfVkJSX0JJQVNfUENUOgorICAgICAgZ3N0X3ZweF9lbmMtPmNmZy5yY18ycGFzc192YnJfYmlhc19wY3QgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGdsb2JhbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfMlBBU1NfVkJSX01JTlNFQ1RJT05fUENUOgorICAgICAgZ3N0X3ZweF9lbmMtPmNmZy5yY18ycGFzc192YnJfbWluc2VjdGlvbl9wY3QgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGdsb2JhbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfMlBBU1NfVkJSX01BWFNFQ1RJT05fUENUOgorICAgICAgZ3N0X3ZweF9lbmMtPmNmZy5yY18ycGFzc192YnJfbWF4c2VjdGlvbl9wY3QgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGdsb2JhbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfS0ZfTU9ERToKKyAgICAgIGdzdF92cHhfZW5jLT5jZmcua2ZfbW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGdsb2JhbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfS0ZfTUFYX0RJU1Q6CisgICAgICBnc3RfdnB4X2VuYy0+Y2ZnLmtmX21heF9kaXN0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBnbG9iYWwgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01VTFRJUEFTU19NT0RFOgorICAgICAgZ3N0X3ZweF9lbmMtPmNmZy5nX3Bhc3MgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBnbG9iYWwgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01VTFRJUEFTU19DQUNIRV9GSUxFOgorICAgICAgaWYgKGdzdF92cHhfZW5jLT5tdWx0aXBhc3NfY2FjaGVfcHJlZml4KQorICAgICAgICBnX2ZyZWUgKGdzdF92cHhfZW5jLT5tdWx0aXBhc3NfY2FjaGVfcHJlZml4KTsKKyAgICAgIGdzdF92cHhfZW5jLT5tdWx0aXBhc3NfY2FjaGVfcHJlZml4ID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVFNfTlVNQkVSX0xBWUVSUzoKKyAgICAgIGdzdF92cHhfZW5jLT5jZmcudHNfbnVtYmVyX2xheWVycyA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgZ2xvYmFsID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UU19UQVJHRVRfQklUUkFURTp7CisgICAgICBHVmFsdWVBcnJheSAqdmEgPSBnX3ZhbHVlX2dldF9ib3hlZCAodmFsdWUpOworCisgICAgICBtZW1zZXQgKCZnc3RfdnB4X2VuYy0+Y2ZnLnRzX3RhcmdldF9iaXRyYXRlLCAwLAorICAgICAgICAgIHNpemVvZiAoZ3N0X3ZweF9lbmMtPmNmZy50c190YXJnZXRfYml0cmF0ZSkpOworICAgICAgaWYgKHZhID09IE5VTEwpIHsKKyAgICAgICAgZ3N0X3ZweF9lbmMtPm5fdHNfdGFyZ2V0X2JpdHJhdGUgPSAwOworICAgICAgfSBlbHNlIGlmICh2YS0+bl92YWx1ZXMgPiBWUFhfVFNfTUFYX0xBWUVSUykgeworICAgICAgICBnX3dhcm5pbmcgKCIlczogT25seSAlZCBsYXllcnMgYWxsb3dlZCBhdCBtYXhpbXVtIiwKKyAgICAgICAgICAgIEdTVF9FTEVNRU5UX05BTUUgKGdzdF92cHhfZW5jKSwgVlBYX1RTX01BWF9MQVlFUlMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2ludCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2YS0+bl92YWx1ZXM7IGkrKykKKyAgICAgICAgICBnc3RfdnB4X2VuYy0+Y2ZnLnRzX3RhcmdldF9iaXRyYXRlW2ldID0KKyAgICAgICAgICAgICAgZ192YWx1ZV9nZXRfaW50IChnX3ZhbHVlX2FycmF5X2dldF9udGggKHZhLCBpKSk7CisgICAgICAgIGdzdF92cHhfZW5jLT5uX3RzX3RhcmdldF9iaXRyYXRlID0gdmEtPm5fdmFsdWVzOworICAgICAgfQorICAgICAgZ2xvYmFsID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfVFNfUkFURV9ERUNJTUFUT1I6eworICAgICAgR1ZhbHVlQXJyYXkgKnZhID0gZ192YWx1ZV9nZXRfYm94ZWQgKHZhbHVlKTsKKworICAgICAgbWVtc2V0ICgmZ3N0X3ZweF9lbmMtPmNmZy50c19yYXRlX2RlY2ltYXRvciwgMCwKKyAgICAgICAgICBzaXplb2YgKGdzdF92cHhfZW5jLT5jZmcudHNfcmF0ZV9kZWNpbWF0b3IpKTsKKyAgICAgIGlmICh2YSA9PSBOVUxMKSB7CisgICAgICAgIGdzdF92cHhfZW5jLT5uX3RzX3JhdGVfZGVjaW1hdG9yID0gMDsKKyAgICAgIH0gZWxzZSBpZiAodmEtPm5fdmFsdWVzID4gVlBYX1RTX01BWF9MQVlFUlMpIHsKKyAgICAgICAgZ193YXJuaW5nICgiJXM6IE9ubHkgJWQgbGF5ZXJzIGFsbG93ZWQgYXQgbWF4aW11bSIsCisgICAgICAgICAgICBHU1RfRUxFTUVOVF9OQU1FIChnc3RfdnB4X2VuYyksIFZQWF9UU19NQVhfTEFZRVJTKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmEtPm5fdmFsdWVzOyBpKyspCisgICAgICAgICAgZ3N0X3ZweF9lbmMtPmNmZy50c19yYXRlX2RlY2ltYXRvcltpXSA9CisgICAgICAgICAgICAgIGdfdmFsdWVfZ2V0X2ludCAoZ192YWx1ZV9hcnJheV9nZXRfbnRoICh2YSwgaSkpOworICAgICAgICBnc3RfdnB4X2VuYy0+bl90c19yYXRlX2RlY2ltYXRvciA9IHZhLT5uX3ZhbHVlczsKKyAgICAgIH0KKyAgICAgIGdsb2JhbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX1RTX1BFUklPRElDSVRZOgorICAgICAgZ3N0X3ZweF9lbmMtPmNmZy50c19wZXJpb2RpY2l0eSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgZ2xvYmFsID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UU19MQVlFUl9JRDp7CisgICAgICBHVmFsdWVBcnJheSAqdmEgPSBnX3ZhbHVlX2dldF9ib3hlZCAodmFsdWUpOworCisgICAgICBtZW1zZXQgKCZnc3RfdnB4X2VuYy0+Y2ZnLnRzX2xheWVyX2lkLCAwLAorICAgICAgICAgIHNpemVvZiAoZ3N0X3ZweF9lbmMtPmNmZy50c19sYXllcl9pZCkpOworICAgICAgaWYgKHZhICYmIHZhLT5uX3ZhbHVlcyA+IFZQWF9UU19NQVhfUEVSSU9ESUNJVFkpIHsKKyAgICAgICAgZ193YXJuaW5nICgiJXM6IE9ubHkgJWQgc2l6ZWQgbGF5ZXIgc2VxdWVuY2VzIGFsbG93ZWQgYXQgbWF4aW11bSIsCisgICAgICAgICAgICBHU1RfRUxFTUVOVF9OQU1FIChnc3RfdnB4X2VuYyksIFZQWF9UU19NQVhfUEVSSU9ESUNJVFkpOworICAgICAgfSBlbHNlIGlmICh2YSkgeworICAgICAgICBnaW50IGk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHZhLT5uX3ZhbHVlczsgaSsrKQorICAgICAgICAgIGdzdF92cHhfZW5jLT5jZmcudHNfbGF5ZXJfaWRbaV0gPQorICAgICAgICAgICAgICBnX3ZhbHVlX2dldF9pbnQgKGdfdmFsdWVfYXJyYXlfZ2V0X250aCAodmEsIGkpKTsKKyAgICAgICAgZ3N0X3ZweF9lbmMtPm5fdHNfbGF5ZXJfaWQgPSB2YS0+bl92YWx1ZXM7CisgICAgICB9IGVsc2UgeworICAgICAgICBnc3RfdnB4X2VuYy0+bl90c19sYXllcl9pZCA9IDA7CisgICAgICB9CisgICAgICBnbG9iYWwgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9FUlJPUl9SRVNJTElFTlQ6CisgICAgICBnc3RfdnB4X2VuYy0+Y2ZnLmdfZXJyb3JfcmVzaWxpZW50ID0gZ192YWx1ZV9nZXRfZmxhZ3MgKHZhbHVlKTsKKyAgICAgIGdsb2JhbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTEFHX0lOX0ZSQU1FUzoKKyAgICAgIGdzdF92cHhfZW5jLT5jZmcuZ19sYWdfaW5fZnJhbWVzID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBnbG9iYWwgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUkVBRFM6CisgICAgICBnc3RfdnB4X2VuYy0+Y2ZnLmdfdGhyZWFkcyA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgZ2xvYmFsID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ERUFETElORToKKyAgICAgIGdzdF92cHhfZW5jLT5kZWFkbGluZSA9IGdfdmFsdWVfZ2V0X2ludDY0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSF9TQ0FMSU5HX01PREU6CisgICAgICBnc3RfdnB4X2VuYy0+aF9zY2FsaW5nX21vZGUgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBpZiAoZ3N0X3ZweF9lbmMtPmluaXRlZCkgeworICAgICAgICB2cHhfc2NhbGluZ19tb2RlX3Qgc207CisKKyAgICAgICAgc20uaF9zY2FsaW5nX21vZGUgPSBnc3RfdnB4X2VuYy0+aF9zY2FsaW5nX21vZGU7CisgICAgICAgIHNtLnZfc2NhbGluZ19tb2RlID0gZ3N0X3ZweF9lbmMtPnZfc2NhbGluZ19tb2RlOworCisgICAgICAgIHN0YXR1cyA9CisgICAgICAgICAgICB2cHhfY29kZWNfY29udHJvbCAoJmdzdF92cHhfZW5jLT5lbmNvZGVyLCBWUDhFX1NFVF9TQ0FMRU1PREUsICZzbSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChnc3RfdnB4X2VuYywKKyAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgVlA4RV9TRVRfU0NBTEVNT0RFOiAlcyIsCisgICAgICAgICAgICAgIGdzdF92cHhfZXJyb3JfbmFtZSAoc3RhdHVzKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9WX1NDQUxJTkdfTU9ERToKKyAgICAgIGdzdF92cHhfZW5jLT52X3NjYWxpbmdfbW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGlmIChnc3RfdnB4X2VuYy0+aW5pdGVkKSB7CisgICAgICAgIHZweF9zY2FsaW5nX21vZGVfdCBzbTsKKworICAgICAgICBzbS5oX3NjYWxpbmdfbW9kZSA9IGdzdF92cHhfZW5jLT5oX3NjYWxpbmdfbW9kZTsKKyAgICAgICAgc20udl9zY2FsaW5nX21vZGUgPSBnc3RfdnB4X2VuYy0+dl9zY2FsaW5nX21vZGU7CisKKyAgICAgICAgc3RhdHVzID0KKyAgICAgICAgICAgIHZweF9jb2RlY19jb250cm9sICgmZ3N0X3ZweF9lbmMtPmVuY29kZXIsIFZQOEVfU0VUX1NDQUxFTU9ERSwgJnNtKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGdzdF92cHhfZW5jLAorICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBWUDhFX1NFVF9TQ0FMRU1PREU6ICVzIiwKKyAgICAgICAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NQVV9VU0VEOgorICAgICAgZ3N0X3ZweF9lbmMtPmNwdV91c2VkID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBpZiAoZ3N0X3ZweF9lbmMtPmluaXRlZCkgeworICAgICAgICBzdGF0dXMgPQorICAgICAgICAgICAgdnB4X2NvZGVjX2NvbnRyb2wgKCZnc3RfdnB4X2VuYy0+ZW5jb2RlciwgVlA4RV9TRVRfQ1BVVVNFRCwKKyAgICAgICAgICAgIGdzdF92cHhfZW5jLT5jcHVfdXNlZCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChnc3RfdnB4X2VuYywgIkZhaWxlZCB0byBzZXQgVlA4RV9TRVRfQ1BVVVNFRDogJXMiLAorICAgICAgICAgICAgICBnc3RfdnB4X2Vycm9yX25hbWUgKHN0YXR1cykpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRU5BQkxFX0FVVE9fQUxUX1JFRjoKKyAgICAgIGdzdF92cHhfZW5jLT5lbmFibGVfYXV0b19hbHRfcmVmID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgaWYgKGdzdF92cHhfZW5jLT5pbml0ZWQpIHsKKyAgICAgICAgc3RhdHVzID0KKyAgICAgICAgICAgIHZweF9jb2RlY19jb250cm9sICgmZ3N0X3ZweF9lbmMtPmVuY29kZXIsIFZQOEVfU0VUX0VOQUJMRUFVVE9BTFRSRUYsCisgICAgICAgICAgICAoZ3N0X3ZweF9lbmMtPmVuYWJsZV9hdXRvX2FsdF9yZWYgPyAxIDogMCkpOworICAgICAgICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZ3N0X3ZweF9lbmMsCisgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IFZQOEVfU0VUX0VOQUJMRUFVVE9BTFRSRUY6ICVzIiwKKyAgICAgICAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05PSVNFX1NFTlNJVElWSVRZOgorICAgICAgZ3N0X3ZweF9lbmMtPm5vaXNlX3NlbnNpdGl2aXR5ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBpZiAoZ3N0X3ZweF9lbmMtPmluaXRlZCkgeworICAgICAgICBzdGF0dXMgPQorICAgICAgICAgICAgdnB4X2NvZGVjX2NvbnRyb2wgKCZnc3RfdnB4X2VuYy0+ZW5jb2RlciwKKyAgICAgICAgICAgIFZQOEVfU0VUX05PSVNFX1NFTlNJVElWSVRZLCBnc3RfdnB4X2VuYy0+bm9pc2Vfc2Vuc2l0aXZpdHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZ3N0X3ZweF9lbmMsCisgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IFZQOEVfU0VUX05PSVNFX1NFTlNJVElWSVRZOiAlcyIsCisgICAgICAgICAgICAgIGdzdF92cHhfZXJyb3JfbmFtZSAoc3RhdHVzKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TSEFSUE5FU1M6CisgICAgICBnc3RfdnB4X2VuYy0+c2hhcnBuZXNzID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBpZiAoZ3N0X3ZweF9lbmMtPmluaXRlZCkgeworICAgICAgICBzdGF0dXMgPSB2cHhfY29kZWNfY29udHJvbCAoJmdzdF92cHhfZW5jLT5lbmNvZGVyLCBWUDhFX1NFVF9TSEFSUE5FU1MsCisgICAgICAgICAgICBnc3RfdnB4X2VuYy0+c2hhcnBuZXNzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGdzdF92cHhfZW5jLAorICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBWUDhFX1NFVF9TSEFSUE5FU1M6ICVzIiwKKyAgICAgICAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NUQVRJQ19USFJFU0hPTEQ6CisgICAgICBnc3RfdnB4X2VuYy0+c3RhdGljX3RocmVzaG9sZCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgaWYgKGdzdF92cHhfZW5jLT5pbml0ZWQpIHsKKyAgICAgICAgc3RhdHVzID0KKyAgICAgICAgICAgIHZweF9jb2RlY19jb250cm9sICgmZ3N0X3ZweF9lbmMtPmVuY29kZXIsIFZQOEVfU0VUX1NUQVRJQ19USFJFU0hPTEQsCisgICAgICAgICAgICBnc3RfdnB4X2VuYy0+c3RhdGljX3RocmVzaG9sZCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChnc3RfdnB4X2VuYywKKyAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgVlA4RV9TRVRfU1RBVElDX1RIUkVTSE9MRDogJXMiLAorICAgICAgICAgICAgICBnc3RfdnB4X2Vycm9yX25hbWUgKHN0YXR1cykpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVE9LRU5fUEFSVElUSU9OUzoKKyAgICAgIGdzdF92cHhfZW5jLT50b2tlbl9wYXJ0aXRpb25zID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgaWYgKGdzdF92cHhfZW5jLT5pbml0ZWQpIHsKKyAgICAgICAgc3RhdHVzID0KKyAgICAgICAgICAgIHZweF9jb2RlY19jb250cm9sICgmZ3N0X3ZweF9lbmMtPmVuY29kZXIsIFZQOEVfU0VUX1RPS0VOX1BBUlRJVElPTlMsCisgICAgICAgICAgICBnc3RfdnB4X2VuYy0+dG9rZW5fcGFydGl0aW9ucyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChnc3RfdnB4X2VuYywKKyAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgVlA4RV9TRVRfVE9LRU5fUEFSVElPTlM6ICVzIiwKKyAgICAgICAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FSTlJfTUFYRlJBTUVTOgorICAgICAgZ3N0X3ZweF9lbmMtPmFybnJfbWF4ZnJhbWVzID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBpZiAoZ3N0X3ZweF9lbmMtPmluaXRlZCkgeworICAgICAgICBzdGF0dXMgPQorICAgICAgICAgICAgdnB4X2NvZGVjX2NvbnRyb2wgKCZnc3RfdnB4X2VuYy0+ZW5jb2RlciwgVlA4RV9TRVRfQVJOUl9NQVhGUkFNRVMsCisgICAgICAgICAgICBnc3RfdnB4X2VuYy0+YXJucl9tYXhmcmFtZXMpOworICAgICAgICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZ3N0X3ZweF9lbmMsCisgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IFZQOEVfU0VUX0FSTlJfTUFYRlJBTUVTOiAlcyIsCisgICAgICAgICAgICAgIGdzdF92cHhfZXJyb3JfbmFtZSAoc3RhdHVzKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9BUk5SX1NUUkVOR1RIOgorICAgICAgZ3N0X3ZweF9lbmMtPmFybnJfc3RyZW5ndGggPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGlmIChnc3RfdnB4X2VuYy0+aW5pdGVkKSB7CisgICAgICAgIHN0YXR1cyA9CisgICAgICAgICAgICB2cHhfY29kZWNfY29udHJvbCAoJmdzdF92cHhfZW5jLT5lbmNvZGVyLCBWUDhFX1NFVF9BUk5SX1NUUkVOR1RILAorICAgICAgICAgICAgZ3N0X3ZweF9lbmMtPmFybnJfc3RyZW5ndGgpOworICAgICAgICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZ3N0X3ZweF9lbmMsCisgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IFZQOEVfU0VUX0FSTlJfU1RSRU5HVEg6ICVzIiwKKyAgICAgICAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FSTlJfVFlQRToKKyAgICAgIGdzdF92cHhfZW5jLT5hcm5yX3R5cGUgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGdfd2FybmluZyAoImFybnItdHlwZSBpcyBhIG5vLW9wIHNpbmNlIGNvbnRyb2wgaGFzIGJlZW4gZGVwcmVjYXRlZCAiCisgICAgICAgICAgImluIGxpYnZweCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RVTklORzoKKyAgICAgIGdzdF92cHhfZW5jLT50dW5pbmcgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBpZiAoZ3N0X3ZweF9lbmMtPmluaXRlZCkgeworICAgICAgICBzdGF0dXMgPSB2cHhfY29kZWNfY29udHJvbCAoJmdzdF92cHhfZW5jLT5lbmNvZGVyLCBWUDhFX1NFVF9UVU5JTkcsCisgICAgICAgICAgICBnc3RfdnB4X2VuYy0+dHVuaW5nKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGdzdF92cHhfZW5jLAorICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBWUDhFX1NFVF9UVU5JTkc6ICVzIiwgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NRX0xFVkVMOgorICAgICAgZ3N0X3ZweF9lbmMtPmNxX2xldmVsID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBpZiAoZ3N0X3ZweF9lbmMtPmluaXRlZCkgeworICAgICAgICBzdGF0dXMgPSB2cHhfY29kZWNfY29udHJvbCAoJmdzdF92cHhfZW5jLT5lbmNvZGVyLCBWUDhFX1NFVF9DUV9MRVZFTCwKKyAgICAgICAgICAgIGdzdF92cHhfZW5jLT5jcV9sZXZlbCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChnc3RfdnB4X2VuYywKKyAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgVlA4RV9TRVRfQ1FfTEVWRUw6ICVzIiwKKyAgICAgICAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9JTlRSQV9CSVRSQVRFX1BDVDoKKyAgICAgIGdzdF92cHhfZW5jLT5tYXhfaW50cmFfYml0cmF0ZV9wY3QgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGlmIChnc3RfdnB4X2VuYy0+aW5pdGVkKSB7CisgICAgICAgIHN0YXR1cyA9CisgICAgICAgICAgICB2cHhfY29kZWNfY29udHJvbCAoJmdzdF92cHhfZW5jLT5lbmNvZGVyLAorICAgICAgICAgICAgVlA4RV9TRVRfTUFYX0lOVFJBX0JJVFJBVEVfUENULCBnc3RfdnB4X2VuYy0+bWF4X2ludHJhX2JpdHJhdGVfcGN0KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGdzdF92cHhfZW5jLAorICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBWUDhFX1NFVF9NQVhfSU5UUkFfQklUUkFURV9QQ1Q6ICVzIiwKKyAgICAgICAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RJTUVCQVNFOgorICAgICAgZ3N0X3ZweF9lbmMtPnRpbWViYXNlX24gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX251bWVyYXRvciAodmFsdWUpOworICAgICAgZ3N0X3ZweF9lbmMtPnRpbWViYXNlX2QgPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX2Rlbm9taW5hdG9yICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoZ2xvYmFsICYmZ3N0X3ZweF9lbmMtPmluaXRlZCkgeworICAgIHN0YXR1cyA9CisgICAgICAgIHZweF9jb2RlY19lbmNfY29uZmlnX3NldCAoJmdzdF92cHhfZW5jLT5lbmNvZGVyLCAmZ3N0X3ZweF9lbmMtPmNmZyk7CisgICAgaWYgKHN0YXR1cyAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmZ3N0X3ZweF9lbmMtPmVuY29kZXJfbG9jayk7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZ3N0X3ZweF9lbmMsIExJQlJBUlksIElOSVQsCisgICAgICAgICAgKCJGYWlsZWQgdG8gc2V0IGVuY29kZXIgY29uZmlndXJhdGlvbiIpLCAoIiVzIiwKKyAgICAgICAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmZ3N0X3ZweF9lbmMtPmVuY29kZXJfbG9jayk7CisgICAgfQorICB9IGVsc2UgeworICAgIGdfbXV0ZXhfdW5sb2NrICgmZ3N0X3ZweF9lbmMtPmVuY29kZXJfbG9jayk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF92cHhfZW5jX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWUFhFbmMgKmdzdF92cHhfZW5jOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19WUFhfRU5DIChvYmplY3QpKTsKKyAgZ3N0X3ZweF9lbmMgPSBHU1RfVlBYX0VOQyAob2JqZWN0KTsKKworICBnX211dGV4X2xvY2sgKCZnc3RfdnB4X2VuYy0+ZW5jb2Rlcl9sb2NrKTsKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1JDX0VORF9VU0FHRToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBnc3RfdnB4X2VuYy0+Y2ZnLnJjX2VuZF91c2FnZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfVEFSR0VUX0JJVFJBVEU6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBnc3RfdnB4X2VuYy0+Y2ZnLnJjX3RhcmdldF9iaXRyYXRlICogMTAwMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfTUlOX1FVQU5USVpFUjoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcucmNfbWluX3F1YW50aXplcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfTUFYX1FVQU5USVpFUjoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcucmNfbWF4X3F1YW50aXplcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfRFJPUEZSQU1FX1RIUkVTSDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcucmNfZHJvcGZyYW1lX3RocmVzaCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfUkVTSVpFX0FMTE9XRUQ6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPmNmZy5yY19yZXNpemVfYWxsb3dlZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfUkVTSVpFX1VQX1RIUkVTSDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcucmNfcmVzaXplX3VwX3RocmVzaCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfUkVTSVpFX0RPV05fVEhSRVNIOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPmNmZy5yY19yZXNpemVfZG93bl90aHJlc2gpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JDX1VOREVSU0hPT1RfUENUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPmNmZy5yY191bmRlcnNob290X3BjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfT1ZFUlNIT09UX1BDVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcucmNfb3ZlcnNob290X3BjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfQlVGX1NaOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPmNmZy5yY19idWZfc3opOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JDX0JVRl9JTklUSUFMX1NaOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPmNmZy5yY19idWZfaW5pdGlhbF9zeik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfQlVGX09QVElNQUxfU1o6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBnc3RfdnB4X2VuYy0+Y2ZnLnJjX2J1Zl9vcHRpbWFsX3N6KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SQ18yUEFTU19WQlJfQklBU19QQ1Q6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBnc3RfdnB4X2VuYy0+Y2ZnLnJjXzJwYXNzX3Zicl9iaWFzX3BjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfMlBBU1NfVkJSX01JTlNFQ1RJT05fUENUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPmNmZy5yY18ycGFzc192YnJfbWluc2VjdGlvbl9wY3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JDXzJQQVNTX1ZCUl9NQVhTRUNUSU9OX1BDVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcucmNfMnBhc3NfdmJyX21heHNlY3Rpb25fcGN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9LRl9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcua2ZfbW9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfS0ZfTUFYX0RJU1Q6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBnc3RfdnB4X2VuYy0+Y2ZnLmtmX21heF9kaXN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NVUxUSVBBU1NfTU9ERToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBnc3RfdnB4X2VuYy0+Y2ZnLmdfcGFzcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTVVMVElQQVNTX0NBQ0hFX0ZJTEU6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBnc3RfdnB4X2VuYy0+bXVsdGlwYXNzX2NhY2hlX3ByZWZpeCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVFNfTlVNQkVSX0xBWUVSUzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcudHNfbnVtYmVyX2xheWVycyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVFNfVEFSR0VUX0JJVFJBVEU6eworICAgICAgR1ZhbHVlQXJyYXkgKnZhOworCisgICAgICBpZiAoZ3N0X3ZweF9lbmMtPm5fdHNfdGFyZ2V0X2JpdHJhdGUgPT0gMCkgeworICAgICAgICBnX3ZhbHVlX3NldF9ib3hlZCAodmFsdWUsIE5VTEwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2ludCBpOworCisgICAgICAgIHZhID0gZ192YWx1ZV9hcnJheV9uZXcgKGdzdF92cHhfZW5jLT5uX3RzX3RhcmdldF9iaXRyYXRlKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGdzdF92cHhfZW5jLT5uX3RzX3RhcmdldF9iaXRyYXRlOyBpKyspIHsKKyAgICAgICAgICBHVmFsdWUgdiA9IHsgMCwgfTsKKworICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJnYsIEdfVFlQRV9JTlQpOworICAgICAgICAgIGdfdmFsdWVfc2V0X2ludCAoJnYsIGdzdF92cHhfZW5jLT5jZmcudHNfdGFyZ2V0X2JpdHJhdGVbaV0pOworICAgICAgICAgIGdfdmFsdWVfYXJyYXlfYXBwZW5kICh2YSwgJnYpOworICAgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZ2KTsKKyAgICAgICAgfQorICAgICAgICBnX3ZhbHVlX3NldF9ib3hlZCAodmFsdWUsIHZhKTsKKyAgICAgICAgZ192YWx1ZV9hcnJheV9mcmVlICh2YSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX1RTX1JBVEVfREVDSU1BVE9SOnsKKyAgICAgIEdWYWx1ZUFycmF5ICp2YTsKKworICAgICAgaWYgKGdzdF92cHhfZW5jLT5uX3RzX3JhdGVfZGVjaW1hdG9yID09IDApIHsKKyAgICAgICAgZ192YWx1ZV9zZXRfYm94ZWQgKHZhbHVlLCBOVUxMKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdpbnQgaTsKKworICAgICAgICB2YSA9IGdfdmFsdWVfYXJyYXlfbmV3IChnc3RfdnB4X2VuYy0+bl90c19yYXRlX2RlY2ltYXRvcik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBnc3RfdnB4X2VuYy0+bl90c19yYXRlX2RlY2ltYXRvcjsgaSsrKSB7CisgICAgICAgICAgR1ZhbHVlIHYgPSB7IDAsIH07CisKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZ2LCBHX1RZUEVfSU5UKTsKKyAgICAgICAgICBnX3ZhbHVlX3NldF9pbnQgKCZ2LCBnc3RfdnB4X2VuYy0+Y2ZnLnRzX3JhdGVfZGVjaW1hdG9yW2ldKTsKKyAgICAgICAgICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAodmEsICZ2KTsKKyAgICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdik7CisgICAgICAgIH0KKyAgICAgICAgZ192YWx1ZV9zZXRfYm94ZWQgKHZhbHVlLCB2YSk7CisgICAgICAgIGdfdmFsdWVfYXJyYXlfZnJlZSAodmEpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9UU19QRVJJT0RJQ0lUWToKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcudHNfcGVyaW9kaWNpdHkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RTX0xBWUVSX0lEOnsKKyAgICAgIEdWYWx1ZUFycmF5ICp2YTsKKworICAgICAgaWYgKGdzdF92cHhfZW5jLT5uX3RzX2xheWVyX2lkID09IDApIHsKKyAgICAgICAgZ192YWx1ZV9zZXRfYm94ZWQgKHZhbHVlLCBOVUxMKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdpbnQgaTsKKworICAgICAgICB2YSA9IGdfdmFsdWVfYXJyYXlfbmV3IChnc3RfdnB4X2VuYy0+bl90c19sYXllcl9pZCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBnc3RfdnB4X2VuYy0+bl90c19sYXllcl9pZDsgaSsrKSB7CisgICAgICAgICAgR1ZhbHVlIHYgPSB7IDAsIH07CisKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZ2LCBHX1RZUEVfSU5UKTsKKyAgICAgICAgICBnX3ZhbHVlX3NldF9pbnQgKCZ2LCBnc3RfdnB4X2VuYy0+Y2ZnLnRzX2xheWVyX2lkW2ldKTsKKyAgICAgICAgICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAodmEsICZ2KTsKKyAgICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdik7CisgICAgICAgIH0KKyAgICAgICAgZ192YWx1ZV9zZXRfYm94ZWQgKHZhbHVlLCB2YSk7CisgICAgICAgIGdfdmFsdWVfYXJyYXlfZnJlZSAodmEpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9FUlJPUl9SRVNJTElFTlQ6CisgICAgICBnX3ZhbHVlX3NldF9mbGFncyAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcuZ19lcnJvcl9yZXNpbGllbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0xBR19JTl9GUkFNRVM6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBnc3RfdnB4X2VuYy0+Y2ZnLmdfbGFnX2luX2ZyYW1lcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSRUFEUzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcuZ190aHJlYWRzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ERUFETElORToKKyAgICAgIGdfdmFsdWVfc2V0X2ludDY0ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPmRlYWRsaW5lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9IX1NDQUxJTkdfTU9ERToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBnc3RfdnB4X2VuYy0+aF9zY2FsaW5nX21vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1ZfU0NBTElOR19NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGdzdF92cHhfZW5jLT52X3NjYWxpbmdfbW9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ1BVX1VTRUQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBnc3RfdnB4X2VuYy0+Y3B1X3VzZWQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0VOQUJMRV9BVVRPX0FMVF9SRUY6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPmVuYWJsZV9hdXRvX2FsdF9yZWYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05PSVNFX1NFTlNJVElWSVRZOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPm5vaXNlX3NlbnNpdGl2aXR5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TSEFSUE5FU1M6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBnc3RfdnB4X2VuYy0+c2hhcnBuZXNzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVEFUSUNfVEhSRVNIT0xEOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPnN0YXRpY190aHJlc2hvbGQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RPS0VOX1BBUlRJVElPTlM6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPnRva2VuX3BhcnRpdGlvbnMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FSTlJfTUFYRlJBTUVTOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPmFybnJfbWF4ZnJhbWVzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9BUk5SX1NUUkVOR1RIOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPmFybnJfc3RyZW5ndGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FSTlJfVFlQRToKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5hcm5yX3R5cGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RVTklORzoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBnc3RfdnB4X2VuYy0+dHVuaW5nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DUV9MRVZFTDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5jcV9sZXZlbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX0lOVFJBX0JJVFJBVEVfUENUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPm1heF9pbnRyYV9iaXRyYXRlX3BjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVElNRUJBU0U6CisgICAgICBnc3RfdmFsdWVfc2V0X2ZyYWN0aW9uICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPnRpbWViYXNlX24sCisgICAgICAgICAgZ3N0X3ZweF9lbmMtPnRpbWViYXNlX2QpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorCisgIGdfbXV0ZXhfdW5sb2NrICgmZ3N0X3ZweF9lbmMtPmVuY29kZXJfbG9jayk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZweF9lbmNfc3RhcnQgKEdzdFZpZGVvRW5jb2RlciAqIHZpZGVvX2VuY29kZXIpCit7CisgIEdzdFZQWEVuYyAqZW5jb2RlciA9IEdTVF9WUFhfRU5DICh2aWRlb19lbmNvZGVyKTsKKworICBHU1RfREVCVUdfT0JKRUNUICh2aWRlb19lbmNvZGVyLCAic3RhcnQiKTsKKworICBpZiAoIWVuY29kZXItPmhhdmVfZGVmYXVsdF9jb25maWcpIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZW5jb2RlciwgTElCUkFSWSwgSU5JVCwKKyAgICAgICAgKCJGYWlsZWQgdG8gZ2V0IGRlZmF1bHQgZW5jb2RlciBjb25maWd1cmF0aW9uIiksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnB4X2VuY19kZXN0cm95X2VuY29kZXIgKEdzdFZQWEVuYyAqIGVuY29kZXIpCit7CisgIGdfbXV0ZXhfbG9jayAoJmVuY29kZXItPmVuY29kZXJfbG9jayk7CisgIGlmIChlbmNvZGVyLT5pbml0ZWQpIHsKKyAgICB2cHhfY29kZWNfZGVzdHJveSAoJmVuY29kZXItPmVuY29kZXIpOworICAgIGVuY29kZXItPmluaXRlZCA9IEZBTFNFOworICB9CisKKyAgaWYgKGVuY29kZXItPmZpcnN0X3Bhc3NfY2FjaGVfY29udGVudCkgeworICAgIGdfYnl0ZV9hcnJheV9mcmVlIChlbmNvZGVyLT5maXJzdF9wYXNzX2NhY2hlX2NvbnRlbnQsIFRSVUUpOworICAgIGVuY29kZXItPmZpcnN0X3Bhc3NfY2FjaGVfY29udGVudCA9IE5VTEw7CisgIH0KKworICBpZiAoZW5jb2Rlci0+Y2ZnLnJjX3R3b3Bhc3Nfc3RhdHNfaW4uYnVmKSB7CisgICAgZ19mcmVlIChlbmNvZGVyLT5jZmcucmNfdHdvcGFzc19zdGF0c19pbi5idWYpOworICAgIGVuY29kZXItPmNmZy5yY190d29wYXNzX3N0YXRzX2luLmJ1ZiA9IE5VTEw7CisgICAgZW5jb2Rlci0+Y2ZnLnJjX3R3b3Bhc3Nfc3RhdHNfaW4uc3ogPSAwOworICB9CisgIGdfbXV0ZXhfdW5sb2NrICgmZW5jb2Rlci0+ZW5jb2Rlcl9sb2NrKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdnB4X2VuY19zdG9wIChHc3RWaWRlb0VuY29kZXIgKiB2aWRlb19lbmNvZGVyKQoreworICBHc3RWUFhFbmMgKmVuY29kZXI7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodmlkZW9fZW5jb2RlciwgInN0b3AiKTsKKworICBlbmNvZGVyID0gR1NUX1ZQWF9FTkMgKHZpZGVvX2VuY29kZXIpOworCisgIGdzdF92cHhfZW5jX2Rlc3Ryb3lfZW5jb2RlciAoZW5jb2Rlcik7CisKKyAgZ3N0X3RhZ19zZXR0ZXJfcmVzZXRfdGFncyAoR1NUX1RBR19TRVRURVIgKGVuY29kZXIpKTsKKworICBnX2ZyZWUgKGVuY29kZXItPm11bHRpcGFzc19jYWNoZV9maWxlKTsKKyAgZW5jb2Rlci0+bXVsdGlwYXNzX2NhY2hlX2ZpbGUgPSBOVUxMOworICBlbmNvZGVyLT5tdWx0aXBhc3NfY2FjaGVfaWR4ID0gMDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdpbnQKK2dzdF92cHhfZW5jX2dldF9kb3duc3RyZWFtX3Byb2ZpbGUgKEdzdFZQWEVuYyAqIGVuY29kZXIpCit7CisgIEdzdENhcHMgKmFsbG93ZWQ7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgZ2ludCBwcm9maWxlID0gREVGQVVMVF9QUk9GSUxFOworCisgIGFsbG93ZWQgPSBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgKEdTVF9WSURFT19FTkNPREVSX1NSQ19QQUQgKGVuY29kZXIpKTsKKyAgaWYgKGFsbG93ZWQpIHsKKyAgICBhbGxvd2VkID0gZ3N0X2NhcHNfdHJ1bmNhdGUgKGFsbG93ZWQpOworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChhbGxvd2VkLCAwKTsKKyAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHMsICJwcm9maWxlIikpIHsKKyAgICAgIGNvbnN0IEdWYWx1ZSAqdiA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAicHJvZmlsZSIpOworICAgICAgY29uc3QgZ2NoYXIgKnByb2ZpbGVfc3RyID0gTlVMTDsKKworICAgICAgaWYgKEdTVF9WQUxVRV9IT0xEU19MSVNUICh2KSAmJiBnc3RfdmFsdWVfbGlzdF9nZXRfc2l6ZSAodikgPiAwKSB7CisgICAgICAgIHByb2ZpbGVfc3RyID0gZ192YWx1ZV9nZXRfc3RyaW5nIChnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUgKHYsIDApKTsKKyAgICAgIH0gZWxzZSBpZiAoR19WQUxVRV9IT0xEU19TVFJJTkcgKHYpKSB7CisgICAgICAgIHByb2ZpbGVfc3RyID0gZ192YWx1ZV9nZXRfc3RyaW5nICh2KTsKKyAgICAgIH0KKworICAgICAgaWYgKHByb2ZpbGVfc3RyKSB7CisgICAgICAgIGdjaGFyICplbmRwdHIgPSBOVUxMOworCisgICAgICAgIHByb2ZpbGUgPSBnX2FzY2lpX3N0cnRvdWxsIChwcm9maWxlX3N0ciwgJmVuZHB0ciwgMTApOworICAgICAgICBpZiAoKmVuZHB0ciAhPSAnXDAnIHx8IHByb2ZpbGUgPCAwIHx8IHByb2ZpbGUgPiAzKSB7CisgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoZW5jb2RlciwgIkludmFsaWQgcHJvZmlsZSAnJXMnIiwgcHJvZmlsZV9zdHIpOworICAgICAgICAgIHByb2ZpbGUgPSBERUZBVUxUX1BST0ZJTEU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZ3N0X2NhcHNfdW5yZWYgKGFsbG93ZWQpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZW5jb2RlciwgIlVzaW5nIHByb2ZpbGUgJWQiLCBwcm9maWxlKTsKKworICByZXR1cm4gcHJvZmlsZTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdnB4X2VuY19zZXRfZm9ybWF0IChHc3RWaWRlb0VuY29kZXIgKiB2aWRlb19lbmNvZGVyLAorICAgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqIHN0YXRlKQoreworICBHc3RWUFhFbmMgKmVuY29kZXI7CisgIHZweF9jb2RlY19lcnJfdCBzdGF0dXM7CisgIHZweF9pbWFnZV90ICppbWFnZTsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKyAgR3N0VmlkZW9JbmZvICppbmZvID0gJnN0YXRlLT5pbmZvOworICBHc3RWaWRlb0NvZGVjU3RhdGUgKm91dHB1dF9zdGF0ZTsKKyAgR3N0Q2xvY2tUaW1lIGxhdGVuY3k7CisgIEdzdFZQWEVuY0NsYXNzICp2cHhfZW5jX2NsYXNzOworCisgIGVuY29kZXIgPSBHU1RfVlBYX0VOQyAodmlkZW9fZW5jb2Rlcik7CisgIHZweF9lbmNfY2xhc3MgPSBHU1RfVlBYX0VOQ19HRVRfQ0xBU1MgKGVuY29kZXIpOworICBHU1RfREVCVUdfT0JKRUNUICh2aWRlb19lbmNvZGVyLCAic2V0X2Zvcm1hdCIpOworCisgIGlmIChlbmNvZGVyLT5pbml0ZWQpIHsKKyAgICBnc3RfdnB4X2VuY19kcmFpbiAodmlkZW9fZW5jb2Rlcik7CisgICAgZ19tdXRleF9sb2NrICgmZW5jb2Rlci0+ZW5jb2Rlcl9sb2NrKTsKKyAgICB2cHhfY29kZWNfZGVzdHJveSAoJmVuY29kZXItPmVuY29kZXIpOworICAgIGVuY29kZXItPmluaXRlZCA9IEZBTFNFOworICAgIGVuY29kZXItPm11bHRpcGFzc19jYWNoZV9pZHgrKzsKKyAgfSBlbHNlIHsKKyAgICBnX211dGV4X2xvY2sgKCZlbmNvZGVyLT5lbmNvZGVyX2xvY2spOworICB9CisKKyAgZW5jb2Rlci0+Y2ZnLmdfcHJvZmlsZSA9IGdzdF92cHhfZW5jX2dldF9kb3duc3RyZWFtX3Byb2ZpbGUgKGVuY29kZXIpOworCisgIC8qIFNjYWxlIGRlZmF1bHQgYml0cmF0ZSB0byBvdXIgc2l6ZSAqLworICBpZiAoIWVuY29kZXItPnJjX3RhcmdldF9iaXRyYXRlX3NldCkKKyAgICBlbmNvZGVyLT5jZmcucmNfdGFyZ2V0X2JpdHJhdGUgPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKERFRkFVTFRfUkNfVEFSR0VUX0JJVFJBVEUsCisgICAgICAgIEdTVF9WSURFT19JTkZPX1dJRFRIIChpbmZvKSAqIEdTVF9WSURFT19JTkZPX0hFSUdIVCAoaW5mbyksCisgICAgICAgIDMyMCAqIDI0MCAqIDEwMDApOworCisgIGVuY29kZXItPmNmZy5nX3cgPSBHU1RfVklERU9fSU5GT19XSURUSCAoaW5mbyk7CisgIGVuY29kZXItPmNmZy5nX2ggPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKGluZm8pOworCisgIGlmIChlbmNvZGVyLT50aW1lYmFzZV9uICE9IDAgJiYgZW5jb2Rlci0+dGltZWJhc2VfZCAhPSAwKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodmlkZW9fZW5jb2RlciwgIlVzaW5nIHRpbWViYXNlIGNvbmZpZ3VyYXRpb24iKTsKKyAgICBlbmNvZGVyLT5jZmcuZ190aW1lYmFzZS5udW0gPSBlbmNvZGVyLT50aW1lYmFzZV9uOworICAgIGVuY29kZXItPmNmZy5nX3RpbWViYXNlLmRlbiA9IGVuY29kZXItPnRpbWViYXNlX2Q7CisgIH0gZWxzZSB7CisgICAgLyogWmVybyBmcmFtZXJhdGUgYW5kIG1heC1mcmFtZXJhdGUgYnV0IHN0aWxsIG5lZWQgdG8gc2V0dXAgdGhlIHRpbWViYXNlIHRvIGF2b2lkCisgICAgICogYSBkaXZpZGUgYnkgemVybyBlcnJvci4gUHJlc3VtaW5nIHRoZSBsb3dlc3QgY29tbW9uIGRlbm9taW5hdG9yIHdpbGwgYmUgUlRQIC0KKyAgICAgKiBWUDggcGF5bG9hZCBkcmFmdCBzdGF0ZXMgY2xvY2sgcmF0ZSBvZiA5MDAwMCB3aGljaCBzaG91bGQgd29yayBmb3IgYW55b25lIHdoZXJlCisgICAgICogRlBTIDwgOTAwMDAgKHNob3VsZG4ndCBiZSB0b28gbWFueSBjYXNlcyB3aGVyZSBpdCdzIGhpZ2hlcikgdGhvdWdoIHdvdWxkbid0IGJlIG9wdGltYWwuIFJUUCBzcGVjaWZpY2F0aW9uCisgICAgICogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi1wYXlsb2FkLXZwOC0wMSBzZWN0aW9uIDYuMy4xICovCisgICAgZW5jb2Rlci0+Y2ZnLmdfdGltZWJhc2UubnVtID0gMTsKKyAgICBlbmNvZGVyLT5jZmcuZ190aW1lYmFzZS5kZW4gPSA5MDAwMDsKKyAgfQorCisgIGlmIChlbmNvZGVyLT5jZmcuZ19wYXNzID09IFZQWF9SQ19GSVJTVF9QQVNTIHx8CisgICAgICBlbmNvZGVyLT5jZmcuZ19wYXNzID09IFZQWF9SQ19MQVNUX1BBU1MpIHsKKyAgICBpZiAoIWVuY29kZXItPm11bHRpcGFzc19jYWNoZV9wcmVmaXgpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChlbmNvZGVyLCBSRVNPVVJDRSwgT1BFTl9SRUFELAorICAgICAgICAgICgiTm8gbXVsdGlwYXNzIGNhY2hlIGZpbGUgcHJvdmlkZWQiKSwgKE5VTEwpKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmZW5jb2Rlci0+ZW5jb2Rlcl9sb2NrKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBnX2ZyZWUgKGVuY29kZXItPm11bHRpcGFzc19jYWNoZV9maWxlKTsKKworICAgIGlmIChlbmNvZGVyLT5tdWx0aXBhc3NfY2FjaGVfaWR4ID4gMCkKKyAgICAgIGVuY29kZXItPm11bHRpcGFzc19jYWNoZV9maWxlID0gZ19zdHJkdXBfcHJpbnRmICgiJXMuJXUiLAorICAgICAgICAgIGVuY29kZXItPm11bHRpcGFzc19jYWNoZV9wcmVmaXgsIGVuY29kZXItPm11bHRpcGFzc19jYWNoZV9pZHgpOworICAgIGVsc2UKKyAgICAgIGVuY29kZXItPm11bHRpcGFzc19jYWNoZV9maWxlID0KKyAgICAgICAgICBnX3N0cmR1cCAoZW5jb2Rlci0+bXVsdGlwYXNzX2NhY2hlX3ByZWZpeCk7CisgIH0KKworICBpZiAoZW5jb2Rlci0+Y2ZnLmdfcGFzcyA9PSBWUFhfUkNfRklSU1RfUEFTUykgeworICAgIGlmIChlbmNvZGVyLT5maXJzdF9wYXNzX2NhY2hlX2NvbnRlbnQgIT0gTlVMTCkKKyAgICAgIGdfYnl0ZV9hcnJheV9mcmVlIChlbmNvZGVyLT5maXJzdF9wYXNzX2NhY2hlX2NvbnRlbnQsIFRSVUUpOworCisgICAgZW5jb2Rlci0+Zmlyc3RfcGFzc19jYWNoZV9jb250ZW50ID0gZ19ieXRlX2FycmF5X3NpemVkX25ldyAoNDA5Nik7CisKKyAgfSBlbHNlIGlmIChlbmNvZGVyLT5jZmcuZ19wYXNzID09IFZQWF9SQ19MQVNUX1BBU1MpIHsKKyAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgICBpZiAoZW5jb2Rlci0+Y2ZnLnJjX3R3b3Bhc3Nfc3RhdHNfaW4uYnVmICE9IE5VTEwpIHsKKyAgICAgIGdfZnJlZSAoZW5jb2Rlci0+Y2ZnLnJjX3R3b3Bhc3Nfc3RhdHNfaW4uYnVmKTsKKyAgICAgIGVuY29kZXItPmNmZy5yY190d29wYXNzX3N0YXRzX2luLmJ1ZiA9IE5VTEw7CisgICAgICBlbmNvZGVyLT5jZmcucmNfdHdvcGFzc19zdGF0c19pbi5zeiA9IDA7CisgICAgfQorCisgICAgaWYgKCFnX2ZpbGVfZ2V0X2NvbnRlbnRzIChlbmNvZGVyLT5tdWx0aXBhc3NfY2FjaGVfZmlsZSwKKyAgICAgICAgICAgIChnY2hhciAqKikgJiBlbmNvZGVyLT5jZmcucmNfdHdvcGFzc19zdGF0c19pbi5idWYsCisgICAgICAgICAgICAmZW5jb2Rlci0+Y2ZnLnJjX3R3b3Bhc3Nfc3RhdHNfaW4uc3osICZlcnIpKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZW5jb2RlciwgUkVTT1VSQ0UsIE9QRU5fUkVBRCwKKyAgICAgICAgICAoIkZhaWxlZCB0byByZWFkIG11bHRpcGFzcyBjYWNoZSBmaWxlIHByb3ZpZGVkIiksICgiJXMiLAorICAgICAgICAgICAgICBlcnItPm1lc3NhZ2UpKTsKKyAgICAgIGdfZXJyb3JfZnJlZSAoZXJyKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmZW5jb2Rlci0+ZW5jb2Rlcl9sb2NrKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKworICBzdGF0dXMgPQorICAgICAgdnB4X2NvZGVjX2VuY19pbml0ICgmZW5jb2Rlci0+ZW5jb2RlciwgdnB4X2VuY19jbGFzcy0+Z2V0X2FsZ28gKGVuY29kZXIpLAorICAgICAgJmVuY29kZXItPmNmZywgMCk7CisgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGVuY29kZXIsIExJQlJBUlksIElOSVQsCisgICAgICAgICgiRmFpbGVkIHRvIGluaXRpYWxpemUgZW5jb2RlciIpLCAoIiVzIiwgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKSk7CisgICAgZ19tdXRleF91bmxvY2sgKCZlbmNvZGVyLT5lbmNvZGVyX2xvY2spOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmICh2cHhfZW5jX2NsYXNzLT5lbmFibGVfc2NhbGluZyAoZW5jb2RlcikpIHsKKyAgICB2cHhfc2NhbGluZ19tb2RlX3Qgc207CisKKyAgICBzbS5oX3NjYWxpbmdfbW9kZSA9IGVuY29kZXItPmhfc2NhbGluZ19tb2RlOworICAgIHNtLnZfc2NhbGluZ19tb2RlID0gZW5jb2Rlci0+dl9zY2FsaW5nX21vZGU7CisKKyAgICBzdGF0dXMgPSB2cHhfY29kZWNfY29udHJvbCAoJmVuY29kZXItPmVuY29kZXIsIFZQOEVfU0VUX1NDQUxFTU9ERSwgJnNtKTsKKyAgICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbmNvZGVyLCAiRmFpbGVkIHRvIHNldCBWUDhFX1NFVF9TQ0FMRU1PREU6ICVzIiwKKyAgICAgICAgICBnc3RfdnB4X2Vycm9yX25hbWUgKHN0YXR1cykpOworICAgIH0KKyAgfQorCisgIHN0YXR1cyA9CisgICAgICB2cHhfY29kZWNfY29udHJvbCAoJmVuY29kZXItPmVuY29kZXIsIFZQOEVfU0VUX0NQVVVTRUQsCisgICAgICBlbmNvZGVyLT5jcHVfdXNlZCk7CisgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbmNvZGVyLCAiRmFpbGVkIHRvIHNldCBWUDhFX1NFVF9DUFVVU0VEOiAlcyIsCisgICAgICAgIGdzdF92cHhfZXJyb3JfbmFtZSAoc3RhdHVzKSk7CisgIH0KKworICBzdGF0dXMgPQorICAgICAgdnB4X2NvZGVjX2NvbnRyb2wgKCZlbmNvZGVyLT5lbmNvZGVyLCBWUDhFX1NFVF9FTkFCTEVBVVRPQUxUUkVGLAorICAgICAgKGVuY29kZXItPmVuYWJsZV9hdXRvX2FsdF9yZWYgPyAxIDogMCkpOworICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZW5jb2RlciwKKyAgICAgICAgIkZhaWxlZCB0byBzZXQgVlA4RV9TRVRfRU5BQkxFQVVUT0FMVFJFRjogJXMiLAorICAgICAgICBnc3RfdnB4X2Vycm9yX25hbWUgKHN0YXR1cykpOworICB9CisgIHN0YXR1cyA9IHZweF9jb2RlY19jb250cm9sICgmZW5jb2Rlci0+ZW5jb2RlciwgVlA4RV9TRVRfTk9JU0VfU0VOU0lUSVZJVFksCisgICAgICBlbmNvZGVyLT5ub2lzZV9zZW5zaXRpdml0eSk7CisgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbmNvZGVyLAorICAgICAgICAiRmFpbGVkIHRvIHNldCBWUDhFX1NFVF9OT0lTRV9TRU5TSVRJVklUWTogJXMiLAorICAgICAgICBnc3RfdnB4X2Vycm9yX25hbWUgKHN0YXR1cykpOworICB9CisgIHN0YXR1cyA9IHZweF9jb2RlY19jb250cm9sICgmZW5jb2Rlci0+ZW5jb2RlciwgVlA4RV9TRVRfU0hBUlBORVNTLAorICAgICAgZW5jb2Rlci0+c2hhcnBuZXNzKTsKKyAgaWYgKHN0YXR1cyAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGVuY29kZXIsCisgICAgICAgICJGYWlsZWQgdG8gc2V0IFZQOEVfU0VUX1NIQVJQTkVTUzogJXMiLCBnc3RfdnB4X2Vycm9yX25hbWUgKHN0YXR1cykpOworICB9CisgIHN0YXR1cyA9IHZweF9jb2RlY19jb250cm9sICgmZW5jb2Rlci0+ZW5jb2RlciwgVlA4RV9TRVRfU1RBVElDX1RIUkVTSE9MRCwKKyAgICAgIGVuY29kZXItPnN0YXRpY190aHJlc2hvbGQpOworICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZW5jb2RlciwKKyAgICAgICAgIkZhaWxlZCB0byBzZXQgVlA4RV9TRVRfU1RBVElDX1RIUkVTSE9MRDogJXMiLAorICAgICAgICBnc3RfdnB4X2Vycm9yX25hbWUgKHN0YXR1cykpOworICB9CisgIHN0YXR1cyA9IHZweF9jb2RlY19jb250cm9sICgmZW5jb2Rlci0+ZW5jb2RlciwgVlA4RV9TRVRfVE9LRU5fUEFSVElUSU9OUywKKyAgICAgIGVuY29kZXItPnRva2VuX3BhcnRpdGlvbnMpOworICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZW5jb2RlciwKKyAgICAgICAgIkZhaWxlZCB0byBzZXQgVlA4RV9TRVRfVE9LRU5fUEFSVElPTlM6ICVzIiwKKyAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgfQorICBzdGF0dXMgPSB2cHhfY29kZWNfY29udHJvbCAoJmVuY29kZXItPmVuY29kZXIsIFZQOEVfU0VUX0FSTlJfTUFYRlJBTUVTLAorICAgICAgZW5jb2Rlci0+YXJucl9tYXhmcmFtZXMpOworICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZW5jb2RlciwKKyAgICAgICAgIkZhaWxlZCB0byBzZXQgVlA4RV9TRVRfQVJOUl9NQVhGUkFNRVM6ICVzIiwKKyAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgfQorICBzdGF0dXMgPSB2cHhfY29kZWNfY29udHJvbCAoJmVuY29kZXItPmVuY29kZXIsIFZQOEVfU0VUX0FSTlJfU1RSRU5HVEgsCisgICAgICBlbmNvZGVyLT5hcm5yX3N0cmVuZ3RoKTsKKyAgaWYgKHN0YXR1cyAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGVuY29kZXIsCisgICAgICAgICJGYWlsZWQgdG8gc2V0IFZQOEVfU0VUX0FSTlJfU1RSRU5HVEg6ICVzIiwKKyAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgfQorICBzdGF0dXMgPSB2cHhfY29kZWNfY29udHJvbCAoJmVuY29kZXItPmVuY29kZXIsIFZQOEVfU0VUX1RVTklORywKKyAgICAgIGVuY29kZXItPnR1bmluZyk7CisgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbmNvZGVyLAorICAgICAgICAiRmFpbGVkIHRvIHNldCBWUDhFX1NFVF9UVU5JTkc6ICVzIiwgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgfQorICBzdGF0dXMgPSB2cHhfY29kZWNfY29udHJvbCAoJmVuY29kZXItPmVuY29kZXIsIFZQOEVfU0VUX0NRX0xFVkVMLAorICAgICAgZW5jb2Rlci0+Y3FfbGV2ZWwpOworICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZW5jb2RlciwKKyAgICAgICAgIkZhaWxlZCB0byBzZXQgVlA4RV9TRVRfQ1FfTEVWRUw6ICVzIiwgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgfQorICBzdGF0dXMgPSB2cHhfY29kZWNfY29udHJvbCAoJmVuY29kZXItPmVuY29kZXIsIFZQOEVfU0VUX01BWF9JTlRSQV9CSVRSQVRFX1BDVCwKKyAgICAgIGVuY29kZXItPm1heF9pbnRyYV9iaXRyYXRlX3BjdCk7CisgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbmNvZGVyLAorICAgICAgICAiRmFpbGVkIHRvIHNldCBWUDhFX1NFVF9NQVhfSU5UUkFfQklUUkFURV9QQ1Q6ICVzIiwKKyAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgfQorCisgIGlmIChHU1RfVklERU9fSU5GT19GUFNfRCAoaW5mbykgPT0gMCB8fCBHU1RfVklERU9fSU5GT19GUFNfTiAoaW5mbykgPT0gMCkgeworICAgIC8qIEZJWE1FOiBBc3N1bWUgMjVmcHMgZm9yIHVua25vd24gZnJhbWVyYXRlcy4gQmV0dGVyIHRoYW4gcmVwb3J0aW5nCisgICAgICogdGhhdCB3ZSBpbnRyb2R1Y2Ugbm8gbGF0ZW5jeSB3aGlsZSB3ZSBhY3R1YWxseSBkbworICAgICAqLworICAgIGxhdGVuY3kgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGVuY29kZXItPmNmZy5nX2xhZ19pbl9mcmFtZXMsCisgICAgICAgIDEgKiBHU1RfU0VDT05ELCAyNSk7CisgIH0gZWxzZSB7CisgICAgbGF0ZW5jeSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoZW5jb2Rlci0+Y2ZnLmdfbGFnX2luX2ZyYW1lcywKKyAgICAgICAgR1NUX1ZJREVPX0lORk9fRlBTX0QgKGluZm8pICogR1NUX1NFQ09ORCwgR1NUX1ZJREVPX0lORk9fRlBTX04gKGluZm8pKTsKKyAgfQorICBnc3RfdmlkZW9fZW5jb2Rlcl9zZXRfbGF0ZW5jeSAodmlkZW9fZW5jb2RlciwgbGF0ZW5jeSwgbGF0ZW5jeSk7CisgIGVuY29kZXItPmluaXRlZCA9IFRSVUU7CisKKyAgLyogU3RvcmUgaW5wdXQgc3RhdGUgKi8KKyAgaWYgKGVuY29kZXItPmlucHV0X3N0YXRlKQorICAgIGdzdF92aWRlb19jb2RlY19zdGF0ZV91bnJlZiAoZW5jb2Rlci0+aW5wdXRfc3RhdGUpOworICBlbmNvZGVyLT5pbnB1dF9zdGF0ZSA9IGdzdF92aWRlb19jb2RlY19zdGF0ZV9yZWYgKHN0YXRlKTsKKworICAvKiBwcmVwYXJlIGNhY2hlZCBpbWFnZSBidWZmZXIgc2V0dXAgKi8KKyAgaW1hZ2UgPSAmZW5jb2Rlci0+aW1hZ2U7CisgIG1lbXNldCAoaW1hZ2UsIDAsIHNpemVvZiAoKmltYWdlKSk7CisKKyAgdnB4X2VuY19jbGFzcy0+c2V0X2ltYWdlX2Zvcm1hdCAoZW5jb2RlciwgaW1hZ2UpOworCisgIGltYWdlLT53ID0gaW1hZ2UtPmRfdyA9IEdTVF9WSURFT19JTkZPX1dJRFRIIChpbmZvKTsKKyAgaW1hZ2UtPmggPSBpbWFnZS0+ZF9oID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbmZvKTsKKworICBpbWFnZS0+c3RyaWRlW1ZQWF9QTEFORV9ZXSA9IEdTVF9WSURFT19JTkZPX0NPTVBfU1RSSURFIChpbmZvLCAwKTsKKyAgaW1hZ2UtPnN0cmlkZVtWUFhfUExBTkVfVV0gPSBHU1RfVklERU9fSU5GT19DT01QX1NUUklERSAoaW5mbywgMSk7CisgIGltYWdlLT5zdHJpZGVbVlBYX1BMQU5FX1ZdID0gR1NUX1ZJREVPX0lORk9fQ09NUF9TVFJJREUgKGluZm8sIDIpOworCisgIGNhcHMgPSB2cHhfZW5jX2NsYXNzLT5nZXRfbmV3X3ZweF9jYXBzIChlbmNvZGVyKTsKKworICB2cHhfZW5jX2NsYXNzLT5zZXRfc3RyZWFtX2luZm8gKGVuY29kZXIsIGNhcHMsIGluZm8pOworCisgIGdfbXV0ZXhfdW5sb2NrICgmZW5jb2Rlci0+ZW5jb2Rlcl9sb2NrKTsKKworICBvdXRwdXRfc3RhdGUgPQorICAgICAgZ3N0X3ZpZGVvX2VuY29kZXJfc2V0X291dHB1dF9zdGF0ZSAodmlkZW9fZW5jb2RlciwgY2Fwcywgc3RhdGUpOworICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKG91dHB1dF9zdGF0ZSk7CisKKyAgZ3N0X3ZpZGVvX2VuY29kZXJfbmVnb3RpYXRlIChHU1RfVklERU9fRU5DT0RFUiAoZW5jb2RlcikpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdnB4X2VuY19wcm9jZXNzIChHc3RWUFhFbmMgKiBlbmNvZGVyKQoreworICB2cHhfY29kZWNfaXRlcl90IGl0ZXIgPSBOVUxMOworICBjb25zdCB2cHhfY29kZWNfY3hfcGt0X3QgKnBrdDsKKyAgR3N0VmlkZW9FbmNvZGVyICp2aWRlb19lbmNvZGVyOworICB2b2lkICp1c2VyX2RhdGE7CisgIEdzdFZpZGVvQ29kZWNGcmFtZSAqZnJhbWU7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdFZQWEVuY0NsYXNzICp2cHhfZW5jX2NsYXNzOworICB2cHhfY29kZWNfcHRzX3QgcHRzOworCisgIHZpZGVvX2VuY29kZXIgPSBHU1RfVklERU9fRU5DT0RFUiAoZW5jb2Rlcik7CisgIHZweF9lbmNfY2xhc3MgPSBHU1RfVlBYX0VOQ19HRVRfQ0xBU1MgKGVuY29kZXIpOworCisgIGdfbXV0ZXhfbG9jayAoJmVuY29kZXItPmVuY29kZXJfbG9jayk7CisgIHBrdCA9IHZweF9jb2RlY19nZXRfY3hfZGF0YSAoJmVuY29kZXItPmVuY29kZXIsICZpdGVyKTsKKyAgd2hpbGUgKHBrdCAhPSBOVUxMKSB7CisgICAgR3N0QnVmZmVyICpidWZmZXI7CisgICAgZ2Jvb2xlYW4gaW52aXNpYmxlOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZW5jb2RlciwgInBhY2tldCAldSB0eXBlICVkIiwgKGd1aW50KSBwa3QtPmRhdGEuZnJhbWUuc3osCisgICAgICAgIHBrdC0+a2luZCk7CisKKyAgICBpZiAocGt0LT5raW5kID09IFZQWF9DT0RFQ19TVEFUU19QS1QKKyAgICAgICAgJiYgZW5jb2Rlci0+Y2ZnLmdfcGFzcyA9PSBWUFhfUkNfRklSU1RfUEFTUykgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKGVuY29kZXIsICJoYW5kbGluZyBTVEFUUyBwYWNrZXQiKTsKKworICAgICAgZ19ieXRlX2FycmF5X2FwcGVuZCAoZW5jb2Rlci0+Zmlyc3RfcGFzc19jYWNoZV9jb250ZW50LAorICAgICAgICAgIHBrdC0+ZGF0YS50d29wYXNzX3N0YXRzLmJ1ZiwgcGt0LT5kYXRhLnR3b3Bhc3Nfc3RhdHMuc3opOworCisgICAgICBmcmFtZSA9IGdzdF92aWRlb19lbmNvZGVyX2dldF9vbGRlc3RfZnJhbWUgKHZpZGVvX2VuY29kZXIpOworICAgICAgaWYgKGZyYW1lICE9IE5VTEwpIHsKKyAgICAgICAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0xJVkUpOworICAgICAgICBmcmFtZS0+b3V0cHV0X2J1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgZ19tdXRleF91bmxvY2sgKCZlbmNvZGVyLT5lbmNvZGVyX2xvY2spOworICAgICAgICByZXQgPSBnc3RfdmlkZW9fZW5jb2Rlcl9maW5pc2hfZnJhbWUgKHZpZGVvX2VuY29kZXIsIGZyYW1lKTsKKyAgICAgICAgZ19tdXRleF9sb2NrICgmZW5jb2Rlci0+ZW5jb2Rlcl9sb2NrKTsKKyAgICAgIH0KKworICAgICAgcGt0ID0gdnB4X2NvZGVjX2dldF9jeF9kYXRhICgmZW5jb2Rlci0+ZW5jb2RlciwgJml0ZXIpOworICAgICAgY29udGludWU7CisgICAgfSBlbHNlIGlmIChwa3QtPmtpbmQgIT0gVlBYX0NPREVDX0NYX0ZSQU1FX1BLVCkgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKGVuY29kZXIsICJub24gZnJhbWUgcGt0OiAlZCIsIHBrdC0+a2luZCk7CisgICAgICBwa3QgPSB2cHhfY29kZWNfZ2V0X2N4X2RhdGEgKCZlbmNvZGVyLT5lbmNvZGVyLCAmaXRlcik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpbnZpc2libGUgPSAocGt0LT5kYXRhLmZyYW1lLmZsYWdzICYgVlBYX0ZSQU1FX0lTX0lOVklTSUJMRSkgIT0gMDsKKworICAgIC8qIGRpc2NhcmQgb2xkZXIgZnJhbWVzIHRoYXQgd2VyZSBkcm9wcGVkIGJ5IGxpYnZweCAqLworICAgIGZyYW1lID0gTlVMTDsKKyAgICBkbyB7CisgICAgICBpZiAoZnJhbWUpCisgICAgICAgIGdzdF92aWRlb19lbmNvZGVyX2ZpbmlzaF9mcmFtZSAodmlkZW9fZW5jb2RlciwgZnJhbWUpOworICAgICAgZnJhbWUgPSBnc3RfdmlkZW9fZW5jb2Rlcl9nZXRfb2xkZXN0X2ZyYW1lICh2aWRlb19lbmNvZGVyKTsKKyAgICAgIHB0cyA9CisgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChmcmFtZS0+cHRzLAorICAgICAgICAgIGVuY29kZXItPmNmZy5nX3RpbWViYXNlLmRlbiwKKyAgICAgICAgICBlbmNvZGVyLT5jZmcuZ190aW1lYmFzZS5udW0gKiAoR3N0Q2xvY2tUaW1lKSBHU1RfU0VDT05EKTsKKyAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKGVuY29kZXIsICJ2cHggcHRzOiAlIiBHX0dJTlQ2NF9GT1JNQVQKKyAgICAgICAgICAiLCBnc3QgZnJhbWUgcHRzOiAlIiBHX0dJTlQ2NF9GT1JNQVQsIHBrdC0+ZGF0YS5mcmFtZS5wdHMsIHB0cyk7CisgICAgfSB3aGlsZSAocGt0LT5kYXRhLmZyYW1lLnB0cyA+IHB0cyk7CisKKyAgICBnX2Fzc2VydCAoZnJhbWUgIT0gTlVMTCk7CisgICAgaWYgKChwa3QtPmRhdGEuZnJhbWUuZmxhZ3MgJiBWUFhfRlJBTUVfSVNfS0VZKSAhPSAwKQorICAgICAgR1NUX1ZJREVPX0NPREVDX0ZSQU1FX1NFVF9TWU5DX1BPSU5UIChmcmFtZSk7CisgICAgZWxzZQorICAgICAgR1NUX1ZJREVPX0NPREVDX0ZSQU1FX1VOU0VUX1NZTkNfUE9JTlQgKGZyYW1lKTsKKworICAgIC8qIEZJWE1FIDogSXQgd291bGQgYmUgbmljZSB0byBhdm9pZCB0aGUgbWVtb3J5IGNvcHkgLi4uICovCisgICAgYnVmZmVyID0KKyAgICAgICAgZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZ19tZW1kdXAgKHBrdC0+ZGF0YS5mcmFtZS5idWYsCisgICAgICAgICAgICBwa3QtPmRhdGEuZnJhbWUuc3opLCBwa3QtPmRhdGEuZnJhbWUuc3opOworCisgICAgdXNlcl9kYXRhID0gdnB4X2VuY19jbGFzcy0+cHJvY2Vzc19mcmFtZV91c2VyX2RhdGEgKGVuY29kZXIsIGZyYW1lKTsKKworICAgIGlmIChpbnZpc2libGUpIHsKKyAgICAgIHJldCA9CisgICAgICAgICAgdnB4X2VuY19jbGFzcy0+aGFuZGxlX2ludmlzaWJsZV9mcmFtZV9idWZmZXIgKGVuY29kZXIsIHVzZXJfZGF0YSwKKyAgICAgICAgICBidWZmZXIpOworICAgICAgZ3N0X3ZpZGVvX2NvZGVjX2ZyYW1lX3VucmVmIChmcmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZyYW1lLT5vdXRwdXRfYnVmZmVyID0gYnVmZmVyOworICAgICAgZ19tdXRleF91bmxvY2sgKCZlbmNvZGVyLT5lbmNvZGVyX2xvY2spOworICAgICAgcmV0ID0gZ3N0X3ZpZGVvX2VuY29kZXJfZmluaXNoX2ZyYW1lICh2aWRlb19lbmNvZGVyLCBmcmFtZSk7CisgICAgICBnX211dGV4X2xvY2sgKCZlbmNvZGVyLT5lbmNvZGVyX2xvY2spOworICAgIH0KKworICAgIHBrdCA9IHZweF9jb2RlY19nZXRfY3hfZGF0YSAoJmVuY29kZXItPmVuY29kZXIsICZpdGVyKTsKKyAgfQorICBnX211dGV4X3VubG9jayAoJmVuY29kZXItPmVuY29kZXJfbG9jayk7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGhvbGRpbmcgdGhlbiBzdHJlYW0gbG9jayovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3ZweF9lbmNfZHJhaW4gKEdzdFZpZGVvRW5jb2RlciAqIHZpZGVvX2VuY29kZXIpCit7CisgIEdzdFZQWEVuYyAqZW5jb2RlcjsKKyAgaW50IGZsYWdzID0gMDsKKyAgdnB4X2NvZGVjX2Vycl90IHN0YXR1czsKKyAgZ2ludDY0IGRlYWRsaW5lOworICB2cHhfY29kZWNfcHRzX3QgcHRzOworCisgIGVuY29kZXIgPSBHU1RfVlBYX0VOQyAodmlkZW9fZW5jb2Rlcik7CisKKyAgZ19tdXRleF9sb2NrICgmZW5jb2Rlci0+ZW5jb2Rlcl9sb2NrKTsKKyAgZGVhZGxpbmUgPSBlbmNvZGVyLT5kZWFkbGluZTsKKworICBwdHMgPQorICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChlbmNvZGVyLT5sYXN0X3B0cywKKyAgICAgIGVuY29kZXItPmNmZy5nX3RpbWViYXNlLmRlbiwKKyAgICAgIGVuY29kZXItPmNmZy5nX3RpbWViYXNlLm51bSAqIChHc3RDbG9ja1RpbWUpIEdTVF9TRUNPTkQpOworCisgIHN0YXR1cyA9IHZweF9jb2RlY19lbmNvZGUgKCZlbmNvZGVyLT5lbmNvZGVyLCBOVUxMLCBwdHMsIDAsIGZsYWdzLCBkZWFkbGluZSk7CisgIGdfbXV0ZXhfdW5sb2NrICgmZW5jb2Rlci0+ZW5jb2Rlcl9sb2NrKTsKKworICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChlbmNvZGVyLCAiZW5jb2RlIHJldHVybmVkICVkICVzIiwgc3RhdHVzLAorICAgICAgICBnc3RfdnB4X2Vycm9yX25hbWUgKHN0YXR1cykpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIC8qIGRpc3BhdGNoIHJlbWFpbmluZyBmcmFtZXMgKi8KKyAgZ3N0X3ZweF9lbmNfcHJvY2VzcyAoZW5jb2Rlcik7CisKKyAgZ19tdXRleF9sb2NrICgmZW5jb2Rlci0+ZW5jb2Rlcl9sb2NrKTsKKyAgaWYgKGVuY29kZXItPmNmZy5nX3Bhc3MgPT0gVlBYX1JDX0ZJUlNUX1BBU1MgJiYgZW5jb2Rlci0+bXVsdGlwYXNzX2NhY2hlX2ZpbGUpIHsKKyAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgICBpZiAoIWdfZmlsZV9zZXRfY29udGVudHMgKGVuY29kZXItPm11bHRpcGFzc19jYWNoZV9maWxlLAorICAgICAgICAgICAgKGNvbnN0IGdjaGFyICopIGVuY29kZXItPmZpcnN0X3Bhc3NfY2FjaGVfY29udGVudC0+ZGF0YSwKKyAgICAgICAgICAgIGVuY29kZXItPmZpcnN0X3Bhc3NfY2FjaGVfY29udGVudC0+bGVuLCAmZXJyKSkgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGVuY29kZXIsIFJFU09VUkNFLCBXUklURSwgKE5VTEwpLAorICAgICAgICAgICgiRmFpbGVkIHRvIHdyaXRlIG11bHRpcGFzcyBjYWNoZSBmaWxlOiAlcyIsIGVyci0+bWVzc2FnZSkpOworICAgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICAgIH0KKyAgfQorICBnX211dGV4X3VubG9jayAoJmVuY29kZXItPmVuY29kZXJfbG9jayk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92cHhfZW5jX2ZsdXNoIChHc3RWaWRlb0VuY29kZXIgKiB2aWRlb19lbmNvZGVyKQoreworICBHc3RWUFhFbmMgKmVuY29kZXI7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodmlkZW9fZW5jb2RlciwgImZsdXNoIik7CisKKyAgZW5jb2RlciA9IEdTVF9WUFhfRU5DICh2aWRlb19lbmNvZGVyKTsKKworICBnc3RfdnB4X2VuY19kZXN0cm95X2VuY29kZXIgKGVuY29kZXIpOworICBpZiAoZW5jb2Rlci0+aW5wdXRfc3RhdGUpIHsKKyAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfcmVmIChlbmNvZGVyLT5pbnB1dF9zdGF0ZSk7CisgICAgZ3N0X3ZweF9lbmNfc2V0X2Zvcm1hdCAodmlkZW9fZW5jb2RlciwgZW5jb2Rlci0+aW5wdXRfc3RhdGUpOworICAgIGdzdF92aWRlb19jb2RlY19zdGF0ZV91bnJlZiAoZW5jb2Rlci0+aW5wdXRfc3RhdGUpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdnB4X2VuY19maW5pc2ggKEdzdFZpZGVvRW5jb2RlciAqIHZpZGVvX2VuY29kZXIpCit7CisgIEdzdFZQWEVuYyAqZW5jb2RlcjsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodmlkZW9fZW5jb2RlciwgImZpbmlzaCIpOworCisgIGVuY29kZXIgPSBHU1RfVlBYX0VOQyAodmlkZW9fZW5jb2Rlcik7CisKKyAgaWYgKGVuY29kZXItPmluaXRlZCkgeworICAgIHJldCA9IGdzdF92cHhfZW5jX2RyYWluICh2aWRlb19lbmNvZGVyKTsKKyAgfSBlbHNlIHsKKyAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2cHhfaW1hZ2VfdCAqCitnc3RfdnB4X2VuY19idWZmZXJfdG9faW1hZ2UgKEdzdFZQWEVuYyAqIGVuYywgR3N0VmlkZW9GcmFtZSAqIGZyYW1lKQoreworICB2cHhfaW1hZ2VfdCAqaW1hZ2UgPSBnX3NsaWNlX25ldyAodnB4X2ltYWdlX3QpOworCisgIG1lbWNweSAoaW1hZ2UsICZlbmMtPmltYWdlLCBzaXplb2YgKCppbWFnZSkpOworCisgIGltYWdlLT5wbGFuZXNbVlBYX1BMQU5FX1ldID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZnJhbWUsIDApOworICBpbWFnZS0+cGxhbmVzW1ZQWF9QTEFORV9VXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lLCAxKTsKKyAgaW1hZ2UtPnBsYW5lc1tWUFhfUExBTkVfVl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZSwgMik7CisKKyAgaW1hZ2UtPnN0cmlkZVtWUFhfUExBTkVfWV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAwKTsKKyAgaW1hZ2UtPnN0cmlkZVtWUFhfUExBTkVfVV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAxKTsKKyAgaW1hZ2UtPnN0cmlkZVtWUFhfUExBTkVfVl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAyKTsKKworICByZXR1cm4gaW1hZ2U7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdnB4X2VuY19oYW5kbGVfZnJhbWUgKEdzdFZpZGVvRW5jb2RlciAqIHZpZGVvX2VuY29kZXIsCisgICAgR3N0VmlkZW9Db2RlY0ZyYW1lICogZnJhbWUpCit7CisgIEdzdFZQWEVuYyAqZW5jb2RlcjsKKyAgdnB4X2NvZGVjX2Vycl90IHN0YXR1czsKKyAgaW50IGZsYWdzID0gMDsKKyAgdnB4X2ltYWdlX3QgKmltYWdlOworICBHc3RWaWRlb0ZyYW1lIHZmcmFtZTsKKyAgdnB4X2NvZGVjX3B0c190IHB0czsKKyAgdW5zaWduZWQgbG9uZyBkdXJhdGlvbjsKKyAgR3N0VlBYRW5jQ2xhc3MgKnZweF9lbmNfY2xhc3M7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodmlkZW9fZW5jb2RlciwgImhhbmRsZV9mcmFtZSIpOworCisgIGVuY29kZXIgPSBHU1RfVlBYX0VOQyAodmlkZW9fZW5jb2Rlcik7CisgIHZweF9lbmNfY2xhc3MgPSBHU1RfVlBYX0VOQ19HRVRfQ0xBU1MgKGVuY29kZXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHZpZGVvX2VuY29kZXIsICJzaXplICVkICVkIiwKKyAgICAgIEdTVF9WSURFT19JTkZPX1dJRFRIICgmZW5jb2Rlci0+aW5wdXRfc3RhdGUtPmluZm8pLAorICAgICAgR1NUX1ZJREVPX0lORk9fSEVJR0hUICgmZW5jb2Rlci0+aW5wdXRfc3RhdGUtPmluZm8pKTsKKworICBnc3RfdmlkZW9fZnJhbWVfbWFwICgmdmZyYW1lLCAmZW5jb2Rlci0+aW5wdXRfc3RhdGUtPmluZm8sCisgICAgICBmcmFtZS0+aW5wdXRfYnVmZmVyLCBHU1RfTUFQX1JFQUQpOworICBpbWFnZSA9IGdzdF92cHhfZW5jX2J1ZmZlcl90b19pbWFnZSAoZW5jb2RlciwgJnZmcmFtZSk7CisKKyAgdnB4X2VuY19jbGFzcy0+c2V0X2ZyYW1lX3VzZXJfZGF0YSAoZW5jb2RlciwgZnJhbWUsIGltYWdlKTsKKworICBpZiAoR1NUX1ZJREVPX0NPREVDX0ZSQU1FX0lTX0ZPUkNFX0tFWUZSQU1FIChmcmFtZSkpIHsKKyAgICBmbGFncyB8PSBWUFhfRUZMQUdfRk9SQ0VfS0Y7CisgIH0KKworICBnX211dGV4X2xvY2sgKCZlbmNvZGVyLT5lbmNvZGVyX2xvY2spOworICBwdHMgPQorICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChmcmFtZS0+cHRzLAorICAgICAgZW5jb2Rlci0+Y2ZnLmdfdGltZWJhc2UuZGVuLAorICAgICAgZW5jb2Rlci0+Y2ZnLmdfdGltZWJhc2UubnVtICogKEdzdENsb2NrVGltZSkgR1NUX1NFQ09ORCk7CisgIGVuY29kZXItPmxhc3RfcHRzID0gZnJhbWUtPnB0czsKKworICBpZiAoZnJhbWUtPmR1cmF0aW9uICE9IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICBkdXJhdGlvbiA9CisgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoZnJhbWUtPmR1cmF0aW9uLCBlbmNvZGVyLT5jZmcuZ190aW1lYmFzZS5kZW4sCisgICAgICAgIGVuY29kZXItPmNmZy5nX3RpbWViYXNlLm51bSAqIChHc3RDbG9ja1RpbWUpIEdTVF9TRUNPTkQpOworCisgICAgaWYgKGR1cmF0aW9uID4gMCkgeworICAgICAgZW5jb2Rlci0+bGFzdF9wdHMgKz0gZnJhbWUtPmR1cmF0aW9uOworICAgIH0gZWxzZSB7CisgICAgICAvKiBXZSBmb3JjZSB0aGUgcGF0aCBpZ25vcmluZyB0aGUgZHVyYXRpb24gaWYgd2UgZW5kIHVwIHdpdGggYSB6ZXJvCisgICAgICAgKiB2YWx1ZSBmb3IgZHVyYXRpb24gYWZ0ZXIgc2NhbGluZyAoZS5nLiBkdXJhdGlvbiB2YWx1ZSB0b28gc21hbGwpICovCisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGVuY29kZXIsCisgICAgICAgICAgIklnbm9yaW5nIHRvbyBzbWFsbCBmcmFtZSBkdXJhdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZnJhbWUtPmR1cmF0aW9uKSk7CisgICAgICBkdXJhdGlvbiA9IDE7CisgICAgfQorICB9IGVsc2UgeworICAgIGR1cmF0aW9uID0gMTsKKyAgfQorCisgIHN0YXR1cyA9IHZweF9jb2RlY19lbmNvZGUgKCZlbmNvZGVyLT5lbmNvZGVyLCBpbWFnZSwKKyAgICAgIHB0cywgZHVyYXRpb24sIGZsYWdzLCBlbmNvZGVyLT5kZWFkbGluZSk7CisKKyAgZ19tdXRleF91bmxvY2sgKCZlbmNvZGVyLT5lbmNvZGVyX2xvY2spOworICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKCZ2ZnJhbWUpOworCisgIGlmIChzdGF0dXMgIT0gMCkgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChlbmNvZGVyLCBMSUJSQVJZLCBFTkNPREUsCisgICAgICAgICgiRmFpbGVkIHRvIGVuY29kZSBmcmFtZSIpLCAoIiVzIiwgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKSk7CisgICAgZ3N0X3ZpZGVvX2NvZGVjX2ZyYW1lX3NldF91c2VyX2RhdGEgKGZyYW1lLCBOVUxMLCBOVUxMKTsKKyAgICBnc3RfdmlkZW9fY29kZWNfZnJhbWVfdW5yZWYgKGZyYW1lKTsKKworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorICBnc3RfdmlkZW9fY29kZWNfZnJhbWVfdW5yZWYgKGZyYW1lKTsKKyAgcmV0dXJuIGdzdF92cHhfZW5jX3Byb2Nlc3MgKGVuY29kZXIpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92cHhfZW5jX3NpbmtfZXZlbnQgKEdzdFZpZGVvRW5jb2RlciAqIGJlbmMsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFZQWEVuYyAqZW5jID0gR1NUX1ZQWF9FTkMgKGJlbmMpOworCisgIC8qIEZJWE1FIDogTW92ZSB0aGlzIHRvIGJhc2UgZW5jb2RlciBjbGFzcyAqLworCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID09IEdTVF9FVkVOVF9UQUcpIHsKKyAgICBHc3RUYWdMaXN0ICpsaXN0OworICAgIEdzdFRhZ1NldHRlciAqc2V0dGVyID0gR1NUX1RBR19TRVRURVIgKGVuYyk7CisgICAgY29uc3QgR3N0VGFnTWVyZ2VNb2RlIG1vZGUgPSBnc3RfdGFnX3NldHRlcl9nZXRfdGFnX21lcmdlX21vZGUgKHNldHRlcik7CisKKyAgICBnc3RfZXZlbnRfcGFyc2VfdGFnIChldmVudCwgJmxpc3QpOworICAgIGdzdF90YWdfc2V0dGVyX21lcmdlX3RhZ3MgKHNldHRlciwgbGlzdCwgbW9kZSk7CisgIH0KKworICAvKiBqdXN0IHBlZWtlZCwgYmFzZWNsYXNzIGhhbmRsZXMgdGhlIHJlc3QgKi8KKyAgcmV0dXJuIEdTVF9WSURFT19FTkNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChiZW5jLCBldmVudCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZweF9lbmNfcHJvcG9zZV9hbGxvY2F0aW9uIChHc3RWaWRlb0VuY29kZXIgKiBlbmNvZGVyLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnc3RfcXVlcnlfYWRkX2FsbG9jYXRpb25fbWV0YSAocXVlcnksIEdTVF9WSURFT19NRVRBX0FQSV9UWVBFLCBOVUxMKTsKKworICByZXR1cm4gR1NUX1ZJREVPX0VOQ09ERVJfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnByb3Bvc2VfYWxsb2NhdGlvbiAoZW5jb2RlciwKKyAgICAgIHF1ZXJ5KTsKK30KKworI2VuZGlmIC8qIEhBVkVfVlA4X0VOQ09ERVIgfHwgSEFWRV9WUDlfRU5DT0RFUiAqLwpkaWZmIC0tZ2l0IGEvZXh0L3ZweC9nc3R2cHhlbmMuaCBiL2V4dC92cHgvZ3N0dnB4ZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIwMTkyNwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC92cHgvZ3N0dnB4ZW5jLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qIFZQOAorICogQ29weXJpZ2h0IChDKSAyMDA2IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDEwIEVudHJvcHkgV2F2ZSBJbmMKKyAqIENvcHlyaWdodCAoQykgMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKyNpZm5kZWYgX19HU1RfVlBYX0VOQ19IX18KKyNkZWZpbmUgX19HU1RfVlBYX0VOQ19IX18KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX1ZQOF9FTkNPREVSKSB8fCBkZWZpbmVkKEhBVkVfVlA5X0VOQ09ERVIpCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZW5jb2Rlci5oPgorCisvKiBGSVhNRTogVW5kZWYgSEFWRV9DT05GSUdfSCBiZWNhdXNlIHZweF9jb2RlYy5oIHVzZXMgaXQsCisgKiB3aGljaCBjYXVzZXMgY29tcGlsYXRpb24gZmFpbHVyZXMgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjdW5kZWYgSEFWRV9DT05GSUdfSAorI2VuZGlmCisKKyNpbmNsdWRlIDx2cHgvdnB4X2VuY29kZXIuaD4KKyNpbmNsdWRlIDx2cHgvdnA4Y3guaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1ZQWF9FTkMgXAorICAoZ3N0X3ZweF9lbmNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1ZQWF9FTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9WUFhfRU5DLEdzdFZQWEVuYykpCisjZGVmaW5lIEdTVF9WUFhfRU5DX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1ZQWF9FTkMsR3N0VlBYRW5jQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVlBYX0VOQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1ZQWF9FTkMpKQorI2RlZmluZSBHU1RfSVNfVlBYX0VOQ19DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVlBYX0VOQykpCisjZGVmaW5lIEdTVF9WUFhfRU5DX0dFVF9DTEFTUyhvYmopICAgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIEdTVF9UWVBFX1ZQWF9FTkMsIEdzdFZQWEVuY0NsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZQWEVuYyBHc3RWUFhFbmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VlBYRW5jQ2xhc3MgR3N0VlBYRW5jQ2xhc3M7CisKK3N0cnVjdCBfR3N0VlBYRW5jCit7CisgIEdzdFZpZGVvRW5jb2RlciBiYXNlX3ZpZGVvX2VuY29kZXI7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKyAgdnB4X2NvZGVjX2N0eF90IGVuY29kZXI7CisgIEdNdXRleCBlbmNvZGVyX2xvY2s7CisKKyAgLyogcHJvcGVydGllcyAqLworICB2cHhfY29kZWNfZW5jX2NmZ190IGNmZzsKKyAgZ2Jvb2xlYW4gaGF2ZV9kZWZhdWx0X2NvbmZpZzsKKyAgZ2Jvb2xlYW4gcmNfdGFyZ2V0X2JpdHJhdGVfc2V0OworICBnaW50IG5fdHNfdGFyZ2V0X2JpdHJhdGU7CisgIGdpbnQgbl90c19yYXRlX2RlY2ltYXRvcjsKKyAgZ2ludCBuX3RzX2xheWVyX2lkOworICAvKiBHbG9iYWwgdHdvLXBhc3Mgb3B0aW9ucyAqLworICBnY2hhciAqbXVsdGlwYXNzX2NhY2hlX2ZpbGU7CisgIGdjaGFyICptdWx0aXBhc3NfY2FjaGVfcHJlZml4OworICBndWludCBtdWx0aXBhc3NfY2FjaGVfaWR4OworICBHQnl0ZUFycmF5ICpmaXJzdF9wYXNzX2NhY2hlX2NvbnRlbnQ7CisKKyAgLyogRW5jb2RlIHBhcmFtZXRlciAqLworICBnaW50NjQgZGVhZGxpbmU7CisKKyAgLyogQ29udHJvbHMgKi8KKyAgVlBYX1NDQUxJTkdfTU9ERSBoX3NjYWxpbmdfbW9kZTsKKyAgVlBYX1NDQUxJTkdfTU9ERSB2X3NjYWxpbmdfbW9kZTsKKyAgaW50IGNwdV91c2VkOworICBnYm9vbGVhbiBlbmFibGVfYXV0b19hbHRfcmVmOworICB1bnNpZ25lZCBpbnQgbm9pc2Vfc2Vuc2l0aXZpdHk7CisgIHVuc2lnbmVkIGludCBzaGFycG5lc3M7CisgIHVuc2lnbmVkIGludCBzdGF0aWNfdGhyZXNob2xkOworICB2cDhlX3Rva2VuX3BhcnRpdGlvbnMgdG9rZW5fcGFydGl0aW9uczsKKyAgdW5zaWduZWQgaW50IGFybnJfbWF4ZnJhbWVzOworICB1bnNpZ25lZCBpbnQgYXJucl9zdHJlbmd0aDsKKyAgdW5zaWduZWQgaW50IGFybnJfdHlwZTsKKyAgdnA4ZV90dW5pbmcgdHVuaW5nOworICB1bnNpZ25lZCBpbnQgY3FfbGV2ZWw7CisgIHVuc2lnbmVkIGludCBtYXhfaW50cmFfYml0cmF0ZV9wY3Q7CisgIC8qIFRpbWViYXNlIC0gYSB2YWx1ZSBvZiAwIHdpbGwgdXNlIHRoZSBmcmFtZXJhdGUgKi8KKyAgdW5zaWduZWQgaW50IHRpbWViYXNlX247CisgIHVuc2lnbmVkIGludCB0aW1lYmFzZV9kOworCisgIC8qIHN0YXRlICovCisgIGdib29sZWFuIGluaXRlZDsKKworICB2cHhfaW1hZ2VfdCBpbWFnZTsKKworICBHc3RDbG9ja1RpbWUgbGFzdF9wdHM7CisKKyAgR3N0VmlkZW9Db2RlY1N0YXRlICppbnB1dF9zdGF0ZTsKK307CisKK3N0cnVjdCBfR3N0VlBYRW5jQ2xhc3MKK3sKKyAgR3N0VmlkZW9FbmNvZGVyQ2xhc3MgYmFzZV92aWRlb19lbmNvZGVyX2NsYXNzOworICAvKnZpcnR1YWwgZnVuY3Rpb24gdG8gZ2V0IHN1cHBvcnRlZCBhbGdvKi8KKyAgdnB4X2NvZGVjX2lmYWNlX3QqICgqZ2V0X2FsZ28pIChHc3RWUFhFbmMgKmVuYyk7CisgIC8qZW5hYmxlZCBzY2FsaW5nKi8KKyAgZ2Jvb2xlYW4gKCplbmFibGVfc2NhbGluZykgKEdzdFZQWEVuYyAqZW5jKTsKKyAgLypzZXQgaW1hZ2UgZm9ybWF0IGluZm8qLworICB2b2lkICgqc2V0X2ltYWdlX2Zvcm1hdCkgKEdzdFZQWEVuYyAqZW5jLCB2cHhfaW1hZ2VfdCAqaW1hZ2UpOworICAvKmdldCBuZXcgc2ltcGxlIGNhcHMqLworICBHc3RDYXBzKiAoKmdldF9uZXdfdnB4X2NhcHMpIChHc3RWUFhFbmMgKmVuYyk7CisgIC8qc2V0IHN0cmVhbSBpbmZvKi8KKyAgdm9pZCAoKnNldF9zdHJlYW1faW5mbykgKEdzdFZQWEVuYyAqZW5jLCBHc3RDYXBzICpjYXBzLCBHc3RWaWRlb0luZm8gKmluZm8pOworICAvKnByb2Nlc3MgdXNlciBkYXRhKi8KKyAgdm9pZCogKCpwcm9jZXNzX2ZyYW1lX3VzZXJfZGF0YSkgKEdzdFZQWEVuYyAqZW5jLCBHc3RWaWRlb0NvZGVjRnJhbWUqIGZyYW1lKTsKKyAgLypzZXQgZnJhbWUgdXNlciBkYXRhKi8KKyAgdm9pZCAoKnNldF9mcmFtZV91c2VyX2RhdGEpIChHc3RWUFhFbmMgKmVuYywgR3N0VmlkZW9Db2RlY0ZyYW1lKiBmcmFtZSwgdnB4X2ltYWdlX3QgKmltYWdlKTsKKyAgLypIYW5kbGUgaW52aXNpYmxlIGZyYW1lKi8KKyAgR3N0Rmxvd1JldHVybiAoKmhhbmRsZV9pbnZpc2libGVfZnJhbWVfYnVmZmVyKSAoR3N0VlBYRW5jICplbmMsIHZvaWQqIHVzZXJfZGF0YSwgR3N0QnVmZmVyKiBidWZmZXIpOworfTsKKworR1R5cGUgZ3N0X3ZweF9lbmNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYKKworI2VuZGlmIC8qIF9fR1NUX1ZQWF9FTkNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvdnB4L21lc29uLmJ1aWxkIGIvZXh0L3ZweC9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODVhZWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3ZweC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDYyIEBACit2cHhfc291cmNlcyA9IFsKKyAgJ2dzdHZwOGRlYy5jJywKKyAgJ2dzdHZwOGVuYy5jJywKKyAgJ2dzdHZwOHV0aWxzLmMnLAorICAnZ3N0dnA5ZGVjLmMnLAorICAnZ3N0dnA5ZW5jLmMnLAorICAnZ3N0dnB4ZGVjLmMnLAorICAnZ3N0dnB4ZW5jLmMnLAorICAncGx1Z2luLmMnLAorXQorCit2cHhfZmVhdHVyZXMgPSBbCisgIFsgJ3ZweC92cDhjeC5oJywgJ3ZweF9jb2RlY192cDhfY3hfYWxnbycsICctREhBVkVfVlA4X0VOQ09ERVInLCAnVlA4IGVuY29kZXInIF0sCisgIFsgJ3ZweC92cDhkeC5oJywgJ3ZweF9jb2RlY192cDhfZHhfYWxnbycsICctREhBVkVfVlA4X0RFQ09ERVInLCAnVlA4IGRlY29kZXInIF0sCisgIFsgJ3ZweC92cDhjeC5oJywgJ3ZweF9jb2RlY192cDlfY3hfYWxnbycsICctREhBVkVfVlA5X0VOQ09ERVInLCAnVlA5IGVuY29kZXInIF0sCisgIFsgJ3ZweC92cDhkeC5oJywgJ3ZweF9jb2RlY192cDlfZHhfYWxnbycsICctREhBVkVfVlA5X0RFQ09ERVInLCAnVlA5IGRlY29kZXInIF0sCitdCisKK3ZweF9kZXAgPSBkZXBlbmRlbmN5KCd2cHgnLCB2ZXJzaW9uIDogJz49MS4zLjAnLCByZXF1aXJlZCA6IGZhbHNlKQorCitpZiB2cHhfZGVwLmZvdW5kKCkKKyAgdnB4X2FyZ3MgPSBbXQorICBmb3JlYWNoIGYgOiB2cHhfZmVhdHVyZXMKKyAgICBoZWFkZXIgPSBmLmdldCgwKQorICAgIGNvZGVjX2lmYWNlID0gZi5nZXQoMSkKKyAgICBleHRyYV9kZWZpbmUgPSBmLmdldCgyKQorICAgIGxpbmtfY29kZSA9ICcnJyNpbmNsdWRlIDxAMEA+CisgICAgICAgICAgICAgICAgICAgaW50IG1haW4gKGludCBhLCBjaGFyICoqIGcpIHsKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZweF9jb2RlY19pZmFjZV90ICpjID0gJkAxQDsKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjICE9IDA7CisgICAgICAgICAgICAgICAgICAgfScnJy5mb3JtYXQoaGVhZGVyLGNvZGVjX2lmYWNlKQorICAgICMgRklYTUU6IHNob3VsZCB0YWtlIGRlcGVuZGVuY2llcyA6IHZweF9kZXAgYXJndW1lbnQKKyAgICBpZiBjYy5saW5rcyhsaW5rX2NvZGUsIGFyZ3MgOiBbJy1sdnB4J10pCisgICAgICB2cHhfYXJncyArPSBleHRyYV9kZWZpbmUKKyAgICAgIG1lc3NhZ2UoJ2xpYnZweCBwcm92aWRlcyBAMEAgaW50ZXJmYWNlIChAMUApJy5mb3JtYXQoZi5nZXQoMyksZi5nZXQoMSkpKQorICAgICAgaGF2ZV92cHhfZmVhdHVyZSA9IHRydWUKKyAgICBlbHNlCisgICAgICBtZXNzYWdlKCdsaWJ2cHggZG9lcyBub3QgcHJvdmlkZSBAMEAgaW50ZXJmYWNlIChAMUApJy5mb3JtYXQoZi5nZXQoMyksZi5nZXQoMSkpKQorICAgICAgaGF2ZV92cHhfZmVhdHVyZSA9IGZhbHNlCisgICAgZW5kaWYKKyAgICBzZXRfdmFyaWFibGUoJ2hhdmVfJyArIGYuZ2V0KDMpLnRvX2xvd2VyKCkudW5kZXJzY29yaWZ5KCksIGhhdmVfdnB4X2ZlYXR1cmUpCisgIGVuZGZvcmVhY2gKKworICBpZiB2cHhfYXJncy5sZW5ndGgoKSA9PSAwCisgICAgbWVzc2FnZSgnV0FSTklORzogbGlidnB4IHdhcyBidWlsdCB3aXRob3V0IGFueSBlbmNvZGVyIG9yIGRlY29kZXIgZmVhdHVyZXMhJykKKyAgZW5kaWYKKworICBpZiBkZXBlbmRlbmN5KCd2cHgnLCB2ZXJzaW9uIDogJz49MS40LjAnLCByZXF1aXJlZCA6IGZhbHNlKS5mb3VuZCgpCisgICAgdnB4X2FyZ3MgKz0gJy1ESEFWRV9WUFhfMV80JworICBlbmRpZgorCisgIGdzdHZweCA9IGxpYnJhcnkoJ2dzdHZweCcsCisgICAgdnB4X3NvdXJjZXMsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzICsgdnB4X2FyZ3MsCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICAgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgZ3N0dGFnX2RlcCwgZ3N0dmlkZW9fZGVwLCB2cHhfZGVwXSwKKyAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCisgICkKKworICBpbnN0YWxsX2RhdGEoc291cmNlczogWydHc3RWUDhFbmMucHJzJ10sIGluc3RhbGxfZGlyOiBwcmVzZXRkaXIpCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L3ZweC9wbHVnaW4uYyBiL2V4dC92cHgvcGx1Z2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYwNGVmYQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC92cHgvcGx1Z2luLmMKQEAgLTAsMCArMSw2MyBAQAorLyogVlA4CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRW50cm9weSBXYXZlIEluYworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJnc3R2cDhkZWMuaCIKKyNpbmNsdWRlICJnc3R2cDhlbmMuaCIKKyNpbmNsdWRlICJnc3R2cDlkZWMuaCIKKyNpbmNsdWRlICJnc3R2cDllbmMuaCIKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworI2lmZGVmIEhBVkVfVlA4X0RFQ09ERVIKKyAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInZwOGRlYyIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICBnc3RfdnA4X2RlY19nZXRfdHlwZSAoKSk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVlA4X0VOQ09ERVIKKyAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInZwOGVuYyIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICBnc3RfdnA4X2VuY19nZXRfdHlwZSAoKSk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVlA5X0RFQ09ERVIKKyAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInZwOWRlYyIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICBnc3RfdnA5X2RlY19nZXRfdHlwZSAoKSk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVlA5X0VOQ09ERVIKKyAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInZwOWVuYyIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICBnc3RfdnA5X2VuY19nZXRfdHlwZSAoKSk7CisjZW5kaWYKKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHZweCwKKyAgICAiVlA4IHBsdWdpbiIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZXh0L3dhdnBhY2svTWFrZWZpbGUuYW0gYi9leHQvd2F2cGFjay9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmVkNmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3dhdnBhY2svTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyMSBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0d2F2cGFjay5sYQorCitsaWJnc3R3YXZwYWNrX2xhX1NPVVJDRVMgPSBcCisJCQkJZ3N0d2F2cGFjay5jIFwKKwkJCQlnc3R3YXZwYWNrY29tbW9uLmMgXAorCQkJCWdzdHdhdnBhY2tkZWMuYyBcCisJCQkJZ3N0d2F2cGFja2VuYy5jIFwKKwkJCQlnc3R3YXZwYWNrc3RyZWFtcmVhZGVyLmMKKworbGliZ3N0d2F2cGFja19sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJCQkJJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykgJChXQVZQQUNLX0NGTEFHUykKK2xpYmdzdHdhdnBhY2tfbGFfTElCQUREID0gICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJCQkJJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKFdBVlBBQ0tfTElCUykKK2xpYmdzdHdhdnBhY2tfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IFwKKwkJZ3N0d2F2cGFja2RlYy5oIFwKKwkJZ3N0d2F2cGFja2VuYy5oIFwKKwkJZ3N0d2F2cGFja2NvbW1vbi5oIFwKKwkJZ3N0d2F2cGFja3N0cmVhbXJlYWRlci5oCisKZGlmZiAtLWdpdCBhL2V4dC93YXZwYWNrL2dzdHdhdnBhY2suYyBiL2V4dC93YXZwYWNrL2dzdHdhdnBhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjA5YWEyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3dhdnBhY2svZ3N0d2F2cGFjay5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qIEdTdHJlYW1lciB3YXZwYWNrIHBsdWdpbgorICogKGMpIDIwMDQgQXJ3ZWQgdi4gTWVya2F0eiA8di5tZXJrYXR6QGdteC5uZXQ+CisgKgorICogZ3N0d2F2cGFjay5jOiBwbHVnaW4gbG9hZGVyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC1pMThuLXBsdWdpbi5oPgorCisjaW5jbHVkZSAiZ3N0d2F2cGFja2RlYy5oIgorI2luY2x1ZGUgImdzdHdhdnBhY2tlbmMuaCIKKworLyogZGVidWcgY2F0ZWdvcnkgZm9yIGNvbW1vbiBjb2RlICovCitHU1RfREVCVUdfQ0FURUdPUlkgKHdhdnBhY2tfZGVidWcpOworCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUICh3YXZwYWNrX2RlYnVnLCAid2F2cGFjayIsIDAsICJXYXZwYWNrIGVsZW1lbnRzIik7CisKKyNpZmRlZiBFTkFCTEVfTkxTCisgIEdTVF9ERUJVRyAoImJpbmRpbmcgdGV4dCBkb21haW4gJXMgdG8gbG9jYWxlIGRpciAlcyIsIEdFVFRFWFRfUEFDS0FHRSwKKyAgICAgIExPQ0FMRURJUik7CisgIGJpbmR0ZXh0ZG9tYWluIChHRVRURVhUX1BBQ0tBR0UsIExPQ0FMRURJUik7CisgIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChHRVRURVhUX1BBQ0tBR0UsICJVVEYtOCIpOworI2VuZGlmCisKKyAgcmV0dXJuIChnc3Rfd2F2cGFja19kZWNfcGx1Z2luX2luaXQgKHBsdWdpbikKKyAgICAgICYmIGdzdF93YXZwYWNrX2VuY19wbHVnaW5faW5pdCAocGx1Z2luKSk7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICB3YXZwYWNrLAorICAgICJXYXZwYWNrIGxvc3NsZXNzL2xvc3N5IGF1ZGlvIGZvcm1hdCBoYW5kbGluZyIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5jIGIvZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExN2M5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvd2F2cGFjay9nc3R3YXZwYWNrY29tbW9uLmMKQEAgLTAsMCArMSwyNjQgQEAKKy8qIEdTdHJlYW1lciBXYXZwYWNrIHBsdWdpbgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFyd2VkIHYuIE1lcmthdHogPHYubWVya2F0ekBnbXgubmV0PgorICogQ29weXJpZ2h0IChjKSAxOTk4IC0gMjAwNSBDb25pZmVyIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIGdzdHdhdnBhY2tjb21tb24uYzogY29tbW9uIGhlbHBlciBmdW5jdGlvbnMKKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0d2F2cGFja2NvbW1vbi5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfRVhURVJOICh3YXZwYWNrX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHdhdnBhY2tfZGVidWcKKworZ2Jvb2xlYW4KK2dzdF93YXZwYWNrX3JlYWRfaGVhZGVyIChXYXZwYWNrSGVhZGVyICogaGVhZGVyLCBndWludDggKiBidWYpCit7CisgIG1lbW1vdmUgKGhlYWRlciwgYnVmLCBzaXplb2YgKFdhdnBhY2tIZWFkZXIpKTsKKworICBXYXZwYWNrTGl0dGxlRW5kaWFuVG9OYXRpdmUgKGhlYWRlciwgKGNoYXIgKikgV2F2cGFja0hlYWRlckZvcm1hdCk7CisKKyAgcmV0dXJuIChtZW1jbXAgKGhlYWRlci0+Y2tJRCwgInd2cGsiLCA0KSA9PSAwKTsKK30KKworLyogaW5zcGlyZWQgYnkgdGhlIG9yaWdpbmFsIG9uZSBpbiB3YXZwYWNrICovCitnYm9vbGVhbgorZ3N0X3dhdnBhY2tfcmVhZF9tZXRhZGF0YSAoR3N0V2F2cGFja01ldGFkYXRhICogd3BtZCwgZ3VpbnQ4ICogaGVhZGVyX2RhdGEsCisgICAgZ3VpbnQ4ICoqIHBfZGF0YSkKK3sKKyAgV2F2cGFja0hlYWRlciBoZHI7CisgIGd1aW50OCAqZW5kOworCisgIGdzdF93YXZwYWNrX3JlYWRfaGVhZGVyICgmaGRyLCBoZWFkZXJfZGF0YSk7CisgIGVuZCA9IGhlYWRlcl9kYXRhICsgaGRyLmNrU2l6ZSArIDg7CisKKyAgaWYgKGVuZCAtICpwX2RhdGEgPCAyKQorICAgIHJldHVybiBGQUxTRTsKKworICB3cG1kLT5pZCA9IEdTVF9SRUFEX1VJTlQ4ICgqcF9kYXRhKTsKKyAgd3BtZC0+Ynl0ZV9sZW5ndGggPSAyICogKGd1aW50KSBHU1RfUkVBRF9VSU5UOCAoKnBfZGF0YSArIDEpOworCisgICpwX2RhdGEgKz0gMjsKKworICBpZiAoKHdwbWQtPmlkICYgSURfTEFSR0UpID09IElEX0xBUkdFKSB7CisgICAgZ3VpbnQgZXh0cmE7CisKKyAgICB3cG1kLT5pZCAmPSB+SURfTEFSR0U7CisKKyAgICBpZiAoZW5kIC0gKnBfZGF0YSA8IDIpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBleHRyYSA9IEdTVF9SRUFEX1VJTlQxNl9MRSAoKnBfZGF0YSk7CisgICAgd3BtZC0+Ynl0ZV9sZW5ndGggKz0gKGV4dHJhIDw8IDkpOworICAgICpwX2RhdGEgKz0gMjsKKyAgfQorCisgIGlmICgod3BtZC0+aWQgJiBJRF9PRERfU0laRSkgPT0gSURfT0REX1NJWkUpIHsKKyAgICB3cG1kLT5pZCAmPSB+SURfT0REX1NJWkU7CisgICAgLS13cG1kLT5ieXRlX2xlbmd0aDsKKyAgfQorCisgIGlmICh3cG1kLT5ieXRlX2xlbmd0aCA+IDApIHsKKyAgICBpZiAoZW5kIC0gKnBfZGF0YSA8IHdwbWQtPmJ5dGVfbGVuZ3RoICsgKHdwbWQtPmJ5dGVfbGVuZ3RoICYgMSkpIHsKKyAgICAgIHdwbWQtPmRhdGEgPSBOVUxMOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHdwbWQtPmRhdGEgPSAqcF9kYXRhOworICAgICpwX2RhdGEgKz0gd3BtZC0+Ynl0ZV9sZW5ndGggKyAod3BtZC0+Ynl0ZV9sZW5ndGggJiAxKTsKKyAgfSBlbHNlIHsKKyAgICB3cG1kLT5kYXRhID0gTlVMTDsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitnaW50Citnc3Rfd2F2cGFja19nZXRfZGVmYXVsdF9jaGFubmVsX21hc2sgKGdpbnQgbmNoYW5uZWxzKQoreworICBnaW50IGNoYW5uZWxfbWFzayA9IDA7CisKKyAgLyogU2V0IHRoZSBkZWZhdWx0IGNoYW5uZWwgbWFzayBmb3IgdGhlIGdpdmVuIG51bWJlciBvZiBjaGFubmVscy4KKyAgICogSXQncyB0aGUgc2FtZSBhcyBmb3IgV0FWRV9GT1JNQVRfRVhURU5ERUQ6CisgICAqIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS93aGRjL2RldmljZS9hdWRpby9tdWx0aWNoYXVkLm1zcHgKKyAgICovCisgIHN3aXRjaCAobmNoYW5uZWxzKSB7CisgICAgY2FzZSAxMToKKyAgICAgIGNoYW5uZWxfbWFzayB8PSAweDAwNDAwOworICAgICAgY2hhbm5lbF9tYXNrIHw9IDB4MDAyMDA7CisgICAgY2FzZSA5OgorICAgICAgY2hhbm5lbF9tYXNrIHw9IDB4MDAxMDA7CisgICAgY2FzZSA4OgorICAgICAgY2hhbm5lbF9tYXNrIHw9IDB4MDAwODA7CisgICAgICBjaGFubmVsX21hc2sgfD0gMHgwMDA0MDsKKyAgICBjYXNlIDY6CisgICAgICBjaGFubmVsX21hc2sgfD0gMHgwMDAyMDsKKyAgICAgIGNoYW5uZWxfbWFzayB8PSAweDAwMDEwOworICAgIGNhc2UgNDoKKyAgICAgIGNoYW5uZWxfbWFzayB8PSAweDAwMDA4OworICAgIGNhc2UgMzoKKyAgICAgIGNoYW5uZWxfbWFzayB8PSAweDAwMDA0OworICAgIGNhc2UgMjoKKyAgICAgIGNoYW5uZWxfbWFzayB8PSAweDAwMDAyOworICAgICAgY2hhbm5lbF9tYXNrIHw9IDB4MDAwMDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAvKiBGb3IgbW9ubyB1c2UgZnJvbnQgY2VudGVyICovCisgICAgICBjaGFubmVsX21hc2sgfD0gMHgwMDAwNDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGNoYW5uZWxfbWFzazsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdAoreworICBjb25zdCBndWludDMyIG1zX21hc2s7CisgIGNvbnN0IEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIGdzdF9wb3M7Cit9IGxheW91dF9tYXBwaW5nW10gPSB7CisgIHsKKyAgMHgwMDAwMSwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVH0sIHsKKyAgMHgwMDAwMiwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFR9LCB7CisgIDB4MDAwMDQsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUn0sIHsKKyAgMHgwMDAwOCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMX0sIHsKKyAgMHgwMDAxMCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZUfSwgeworICAweDAwMDIwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX1JJR0hUfSwgeworICAweDAwMDQwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUX09GX0NFTlRFUn0sIHsKKyAgMHgwMDA4MCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFRfT0ZfQ0VOVEVSfSwgeworICAweDAwMTAwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0NFTlRFUn0sIHsKKyAgMHgwMDIwMCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9MRUZUfSwgeworICAweDAwNDAwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX1JJR0hUfSwgeworICAweDAwODAwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfQ0VOVEVSfSwgeworICAweDAxMDAwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfRlJPTlRfTEVGVH0sIHsKKyAgMHgwMjAwMCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX0NFTlRFUn0sIHsKKyAgMHgwNDAwMCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX1JJR0hUfSwgeworICAweDA4MDAwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9MRUZUfSwgeworICAweDEwMDAwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9DRU5URVJ9LCB7CisgIDB4MjAwMDAsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX1JJR0hUfQorfTsKKworI2RlZmluZSBNQVhfQ0hBTk5FTF9QT1NJVElPTlMgR19OX0VMRU1FTlRTIChsYXlvdXRfbWFwcGluZykKKworZ2Jvb2xlYW4KK2dzdF93YXZwYWNrX2dldF9jaGFubmVsX3Bvc2l0aW9ucyAoZ2ludCBudW1fY2hhbm5lbHMsIGdpbnQgbGF5b3V0LAorICAgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uICogcG9zKQoreworICBnaW50IGksIHA7CisKKyAgaWYgKG51bV9jaGFubmVscyA9PSAxICYmIGxheW91dCA9PSAweDAwMDA0KSB7CisgICAgcG9zWzBdID0gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTU9OTzsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHAgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0NIQU5ORUxfUE9TSVRJT05TOyArK2kpIHsKKyAgICBpZiAoKGxheW91dCAmIGxheW91dF9tYXBwaW5nW2ldLm1zX21hc2spICE9IDApIHsKKyAgICAgIGlmIChwID49IG51bV9jaGFubmVscykgeworICAgICAgICBHU1RfV0FSTklORyAoIk1vcmUgYml0cyBzZXQgaW4gdGhlIGNoYW5uZWwgbGF5b3V0IG1hcCB0aGFuIHRoZXJlICIKKyAgICAgICAgICAgICJhcmUgY2hhbm5lbHMhIEJyb2tlbiBmaWxlIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmIChsYXlvdXRfbWFwcGluZ1tpXS5nc3RfcG9zID09IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0lOVkFMSUQpIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJVbnN1cHBvcnRlZCBjaGFubmVsIHBvc2l0aW9uIChtYXNrIDB4JTA4eCkgaW4gY2hhbm5lbCAiCisgICAgICAgICAgICAibGF5b3V0IG1hcCAtIGlnbm9yaW5nIHRob3NlIGNoYW5uZWxzIiwgbGF5b3V0X21hcHBpbmdbaV0ubXNfbWFzayk7CisgICAgICAgIC8qIHdoYXQgdG8gZG8/IGp1c3QgaWdub3JlIGl0IGFuZCBsZXQgZG93bnN0cmVhbSBkZWFsIHdpdGggYSBjaGFubmVsCisgICAgICAgICAqIGxheW91dCB0aGF0IGhhcyBJTlZBTElEIHBvc2l0aW9ucyBpbiBpdCBmb3Igbm93IC4uLiAqLworICAgICAgfQorICAgICAgcG9zW3BdID0gbGF5b3V0X21hcHBpbmdbaV0uZ3N0X3BvczsKKyAgICAgICsrcDsKKyAgICB9CisgIH0KKworICBpZiAocCAhPSBudW1fY2hhbm5lbHMpIHsKKyAgICBHU1RfV0FSTklORyAoIk9ubHkgJWQgYml0cyBzZXQgaW4gdGhlIGNoYW5uZWwgbGF5b3V0IG1hcCwgYnV0IHRoZXJlIGFyZSAiCisgICAgICAgICJzdXBwb3NlZCB0byBiZSAlZCBjaGFubmVscyEgQnJva2VuIGZpbGUiLCBwLCBudW1fY2hhbm5lbHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiAqCitnc3Rfd2F2cGFja19nZXRfZGVmYXVsdF9jaGFubmVsX3Bvc2l0aW9ucyAoZ2ludCBuY2hhbm5lbHMpCit7CisgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uICpwb3MgPSBnX25ldyAoR3N0QXVkaW9DaGFubmVsUG9zaXRpb24sIG5jaGFubmVscyk7CisgIGdpbnQgaTsKKworICBpZiAobmNoYW5uZWxzID09IDEpIHsKKyAgICBwb3NbMF0gPSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVI7CisgICAgcmV0dXJuIHBvczsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBuY2hhbm5lbHM7IGkrKykKKyAgICBwb3NbaV0gPSBsYXlvdXRfbWFwcGluZ1tpXS5nc3RfcG9zOworCisgIHJldHVybiBwb3M7Cit9CisKK2dpbnQKK2dzdF93YXZwYWNrX2dldF9jaGFubmVsX21hc2tfZnJvbV9wb3NpdGlvbnMgKEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uICogcG9zLAorICAgIGdpbnQgbmNoYW5uZWxzKQoreworICBnaW50IGNoYW5uZWxfbWFzayA9IDA7CisgIGdpbnQgaSwgajsKKworICBpZiAobmNoYW5uZWxzID09IDEgJiYgcG9zWzBdID09IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX01PTk8pIHsKKyAgICBjaGFubmVsX21hc2sgPSAweDAwMDAwMDA0OworICAgIHJldHVybiBjaGFubmVsX21hc2s7CisgIH0KKworICAvKiBGSVhNRTogbm90IGV4YWN0bHkgZWZmaWNpZW50IGJ1dCBvdGhlcndpc2Ugd2UgbmVlZCBhbiBpbnZlcnNlCisgICAqIG1hcHBpbmcgdGFibGUgdG9vICovCisgIGZvciAoaSA9IDA7IGkgPCBuY2hhbm5lbHM7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCBNQVhfQ0hBTk5FTF9QT1NJVElPTlM7IGorKykgeworICAgICAgaWYgKHBvc1tpXSA9PSBsYXlvdXRfbWFwcGluZ1tqXS5nc3RfcG9zKSB7CisgICAgICAgIGNoYW5uZWxfbWFzayB8PSBsYXlvdXRfbWFwcGluZ1tqXS5tc19tYXNrOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gY2hhbm5lbF9tYXNrOworfQorCitnYm9vbGVhbgorZ3N0X3dhdnBhY2tfc2V0X2NoYW5uZWxfbWFwcGluZyAoR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gKiBwb3MsIGdpbnQgbmNoYW5uZWxzLAorICAgIGdpbnQ4ICogY2hhbm5lbF9tYXBwaW5nKQoreworICBnaW50IGksIGo7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgZm9yIChpID0gMDsgaSA8IG5jaGFubmVsczsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IE1BWF9DSEFOTkVMX1BPU0lUSU9OUzsgaisrKSB7CisgICAgICBpZiAocG9zW2ldID09IGxheW91dF9tYXBwaW5nW2pdLmdzdF9wb3MpIHsKKyAgICAgICAgY2hhbm5lbF9tYXBwaW5nW2ldID0gajsKKyAgICAgICAgcmV0ICY9IChpID09IGopOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gIXJldDsKK30KZGlmZiAtLWdpdCBhL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tjb21tb24uaCBiL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tjb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGE4MWJmCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qIEdTdHJlYW1lciBXYXZwYWNrIHBsdWdpbgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFyd2VkIHYuIE1lcmthdHogPHYubWVya2F0ekBnbXgubmV0PgorICogQ29weXJpZ2h0IChjKSAyMDA2IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBnc3R3YXZwYWNrY29tbW9uLmg6IGNvbW1vbiBoZWxwZXIgZnVuY3Rpb25zCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9XQVZQQUNLX0NPTU1PTl9IX18KKyNkZWZpbmUgX19HU1RfV0FWUEFDS19DT01NT05fSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8d2F2cGFjay93YXZwYWNrLmg+CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGd1aW50MzIgYnl0ZV9sZW5ndGg7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQ4IGlkOworfSBHc3RXYXZwYWNrTWV0YWRhdGE7CisKKyNkZWZpbmUgSURfVU5JUVVFICAgICAgICAgICAgICAgMHgzZgorI2RlZmluZSBJRF9PUFRJT05BTF9EQVRBICAgICAgICAweDIwCisjZGVmaW5lIElEX09ERF9TSVpFICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgSURfTEFSR0UgICAgICAgICAgICAgICAgMHg4MAorCisjZGVmaW5lIElEX0RVTU1ZICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBJRF9FTkNPREVSX0lORk8gICAgICAgICAweDEKKyNkZWZpbmUgSURfREVDT1JSX1RFUk1TICAgICAgICAgMHgyCisjZGVmaW5lIElEX0RFQ09SUl9XRUlHSFRTICAgICAgIDB4MworI2RlZmluZSBJRF9ERUNPUlJfU0FNUExFUyAgICAgICAweDQKKyNkZWZpbmUgSURfRU5UUk9QWV9WQVJTICAgICAgICAgMHg1CisjZGVmaW5lIElEX0hZQlJJRF9QUk9GSUxFICAgICAgIDB4NgorI2RlZmluZSBJRF9TSEFQSU5HX1dFSUdIVFMgICAgICAweDcKKyNkZWZpbmUgSURfRkxPQVRfSU5GTyAgICAgICAgICAgMHg4CisjZGVmaW5lIElEX0lOVDMyX0lORk8gICAgICAgICAgIDB4OQorI2RlZmluZSBJRF9XVl9CSVRTVFJFQU0gICAgICAgICAweGEKKyNkZWZpbmUgSURfV1ZDX0JJVFNUUkVBTSAgICAgICAgMHhiCisjZGVmaW5lIElEX1dWWF9CSVRTVFJFQU0gICAgICAgIDB4YworI2RlZmluZSBJRF9DSEFOTkVMX0lORk8gICAgICAgICAweGQKKworI2RlZmluZSBJRF9SSUZGX0hFQURFUiAgICAgICAgICAoSURfT1BUSU9OQUxfREFUQSB8IDB4MSkKKyNkZWZpbmUgSURfUklGRl9UUkFJTEVSICAgICAgICAgKElEX09QVElPTkFMX0RBVEEgfCAweDIpCisjZGVmaW5lIElEX1JFUExBWV9HQUlOICAgICAgICAgIChJRF9PUFRJT05BTF9EQVRBIHwgMHgzKQorI2RlZmluZSBJRF9DVUVTSEVFVCAgICAgICAgICAgICAoSURfT1BUSU9OQUxfREFUQSB8IDB4NCkKKyNkZWZpbmUgSURfQ09ORklHX0JMT0NLICAgICAgICAgKElEX09QVElPTkFMX0RBVEEgfCAweDUpCisjZGVmaW5lIElEX01ENV9DSEVDS1NVTSAgICAgICAgIChJRF9PUFRJT05BTF9EQVRBIHwgMHg2KQorI2RlZmluZSBJRF9TQU1QTEVfUkFURSAgICAgICAgICAoSURfT1BUSU9OQUxfREFUQSB8IDB4NykKKworCitnYm9vbGVhbiBnc3Rfd2F2cGFja19yZWFkX2hlYWRlciAoV2F2cGFja0hlYWRlciAqIGhlYWRlciwgZ3VpbnQ4ICogYnVmKTsKK2dib29sZWFuIGdzdF93YXZwYWNrX3JlYWRfbWV0YWRhdGEgKEdzdFdhdnBhY2tNZXRhZGF0YSAqIG1ldGEsCisgICAgZ3VpbnQ4ICogaGVhZGVyX2RhdGEsIGd1aW50OCAqKiBwX2RhdGEpOworZ2ludCBnc3Rfd2F2cGFja19nZXRfZGVmYXVsdF9jaGFubmVsX21hc2sgKGdpbnQgbmNoYW5uZWxzKTsKK2dib29sZWFuIGdzdF93YXZwYWNrX2dldF9jaGFubmVsX3Bvc2l0aW9ucyAoZ2ludCBuY2hhbm5lbHMsIGdpbnQgbGF5b3V0LCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiAqcG9zKTsKK0dzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uICpnc3Rfd2F2cGFja19nZXRfZGVmYXVsdF9jaGFubmVsX3Bvc2l0aW9ucyAoZ2ludCBuY2hhbm5lbHMpOworZ2ludCBnc3Rfd2F2cGFja19nZXRfY2hhbm5lbF9tYXNrX2Zyb21fcG9zaXRpb25zIChHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiAqcG9zLCBnaW50IG5jaGFubmVscyk7CitnYm9vbGVhbiBnc3Rfd2F2cGFja19zZXRfY2hhbm5lbF9tYXBwaW5nIChHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiAqcG9zLCBnaW50IG5jaGFubmVscywgZ2ludDggKmNoYW5uZWxfbWFwcGluZyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jIGIvZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjY2U1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmMKQEAgLTAsMCArMSw0NzMgQEAKKy8qIEdTdHJlYW1lciBXYXZwYWNrIHBsdWdpbgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFyd2VkIHYuIE1lcmthdHogPHYubWVya2F0ekBnbXgubmV0PgorICogQ29weXJpZ2h0IChjKSAyMDA2IEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA2IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBnc3R3YXZwYWNrZGVjLmM6IHJhdyBXYXZwYWNrIGJpdHN0cmVhbSBkZWNvZGVyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtd2F2cGFja2RlYworICoKKyAqIFdhdnBhY2tEZWMgZGVjb2RlcyBmcmFtZWQgKGZvciBleGFtcGxlIGJ5IHRoZSBXYXZwYWNrUGFyc2UgZWxlbWVudCkKKyAqIFdhdnBhY2sgc3RyZWFtcyBhbmQgZGVjb2RlcyB0aGVtIHRvIHJhdyBhdWRpby4KKyAqIDx1bGluayB1cmw9Imh0dHA6Ly93d3cud2F2cGFjay5jb20vIj5XYXZwYWNrPC91bGluaz4gaXMgYW4gb3Blbi1zb3VyY2UKKyAqIGF1ZGlvIGNvZGVjIHRoYXQgZmVhdHVyZXMgYm90aCBsb3NzbGVzcyBhbmQgbG9zc3kgZW5jb2RpbmcuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGZpbGVzcmMgbG9jYXRpb249dGVzdC53diAhIHdhdnBhY2twYXJzZSAhIHdhdnBhY2tkZWMgISBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgYXV0b2F1ZGlvc2luaworICogXXwgVGhpcyBwaXBlbGluZSBkZWNvZGVzIHRoZSBXYXZwYWNrIGZpbGUgdGVzdC53diBpbnRvIHJhdyBhdWRpbyBidWZmZXJzIGFuZAorICogdHJpZXMgdG8gcGxheSBpdCBiYWNrIHVzaW5nIGFuIGF1dG9tYXRpY2FsbHkgZm91bmQgYXVkaW8gc2luay4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8d2F2cGFjay93YXZwYWNrLmg+CisjaW5jbHVkZSAiZ3N0d2F2cGFja2RlYy5oIgorI2luY2x1ZGUgImdzdHdhdnBhY2tjb21tb24uaCIKKyNpbmNsdWRlICJnc3R3YXZwYWNrc3RyZWFtcmVhZGVyLmgiCisKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3dhdnBhY2tfZGVjX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF93YXZwYWNrX2RlY19kZWJ1ZworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC13YXZwYWNrLCAiCisgICAgICAgICJkZXB0aCA9IChpbnQpIFsgMSwgMzIgXSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDggXSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgNjAwMCwgMTkyMDAwIF0sICIgImZyYW1lZCA9IChib29sZWFuKSB0cnVlIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIFM4LCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDggXSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgNjAwMCwgMTkyMDAwIF07ICIKKyAgICAgICAgImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoUzE2KSAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDggXSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgNjAwMCwgMTkyMDAwIF07ICIKKyAgICAgICAgImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoUzMyKSAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDggXSwgIiAicmF0ZSA9IChpbnQpIFsgNjAwMCwgMTkyMDAwIF0iKQorICAgICk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfd2F2cGFja19kZWNfc3RhcnQgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3dhdnBhY2tfZGVjX3N0b3AgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3dhdnBhY2tfZGVjX3NldF9mb3JtYXQgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYywKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfd2F2cGFja19kZWNfaGFuZGxlX2ZyYW1lIChHc3RBdWRpb0RlY29kZXIgKiBkZWMsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKKworc3RhdGljIHZvaWQgZ3N0X3dhdnBhY2tfZGVjX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyB2b2lkIGdzdF93YXZwYWNrX2RlY19wb3N0X3RhZ3MgKEdzdFdhdnBhY2tEZWMgKiBkZWMpOworCisjZGVmaW5lIGdzdF93YXZwYWNrX2RlY19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RXYXZwYWNrRGVjLCBnc3Rfd2F2cGFja19kZWMsIEdTVF9UWVBFX0FVRElPX0RFQ09ERVIpOworCitzdGF0aWMgdm9pZAorZ3N0X3dhdnBhY2tfZGVjX2NsYXNzX2luaXQgKEdzdFdhdnBhY2tEZWNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIChrbGFzcyk7CisgIEdzdEF1ZGlvRGVjb2RlckNsYXNzICpiYXNlX2NsYXNzID0gKEdzdEF1ZGlvRGVjb2RlckNsYXNzICopIChrbGFzcyk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzcmNfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc2lua19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgIldhdnBhY2sgYXVkaW8gZGVjb2RlciIsCisgICAgICAiQ29kZWMvRGVjb2Rlci9BdWRpbyIsCisgICAgICAiRGVjb2RlcyBXYXZwYWNrIGF1ZGlvIGRhdGEiLAorICAgICAgIkFyd2VkIHYuIE1lcmthdHogPHYubWVya2F0ekBnbXgubmV0PiwgIgorICAgICAgIlNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4iKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF93YXZwYWNrX2RlY19maW5hbGl6ZTsKKworICBiYXNlX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2cGFja19kZWNfc3RhcnQpOworICBiYXNlX2NsYXNzLT5zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXZwYWNrX2RlY19zdG9wKTsKKyAgYmFzZV9jbGFzcy0+c2V0X2Zvcm1hdCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2cGFja19kZWNfc2V0X2Zvcm1hdCk7CisgIGJhc2VfY2xhc3MtPmhhbmRsZV9mcmFtZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2cGFja19kZWNfaGFuZGxlX2ZyYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZwYWNrX2RlY19yZXNldCAoR3N0V2F2cGFja0RlYyAqIGRlYykKK3sKKyAgZGVjLT53dl9pZC5idWZmZXIgPSBOVUxMOworICBkZWMtPnd2X2lkLnBvc2l0aW9uID0gZGVjLT53dl9pZC5sZW5ndGggPSAwOworCisgIGRlYy0+Y2hhbm5lbHMgPSAwOworICBkZWMtPmNoYW5uZWxfbWFzayA9IDA7CisgIGRlYy0+c2FtcGxlX3JhdGUgPSAwOworICBkZWMtPmRlcHRoID0gMDsKK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZwYWNrX2RlY19pbml0IChHc3RXYXZwYWNrRGVjICogZGVjKQoreworICBkZWMtPmNvbnRleHQgPSBOVUxMOworICBkZWMtPnN0cmVhbV9yZWFkZXIgPSBnc3Rfd2F2cGFja19zdHJlYW1fcmVhZGVyX25ldyAoKTsKKworICBnc3RfYXVkaW9fZGVjb2Rlcl9zZXRfbmVlZHNfZm9ybWF0IChHU1RfQVVESU9fREVDT0RFUiAoZGVjKSwgVFJVRSk7CisgIGdzdF9hdWRpb19kZWNvZGVyX3NldF91c2VfZGVmYXVsdF9wYWRfYWNjZXB0Y2FwcyAoR1NUX0FVRElPX0RFQ09ERVJfQ0FTVAorICAgICAgKGRlYyksIFRSVUUpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9BVURJT19ERUNPREVSX1NJTktfUEFEIChkZWMpKTsKKworICBnc3Rfd2F2cGFja19kZWNfcmVzZXQgKGRlYyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFja19kZWNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFdhdnBhY2tEZWMgKmRlYyA9IEdTVF9XQVZQQUNLX0RFQyAob2JqZWN0KTsKKworICBnX2ZyZWUgKGRlYy0+c3RyZWFtX3JlYWRlcik7CisgIGRlYy0+c3RyZWFtX3JlYWRlciA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYWNrX2RlY19zdGFydCAoR3N0QXVkaW9EZWNvZGVyICogZGVjKQoreworICBHU1RfREVCVUdfT0JKRUNUIChkZWMsICJzdGFydCIpOworCisgIC8qIG5ldmVyIG1pbmQgYSBmZXcgZXJyb3JzICovCisgIGdzdF9hdWRpb19kZWNvZGVyX3NldF9tYXhfZXJyb3JzIChkZWMsIDE2KTsKKyAgLyogZG9uJ3QgYm90aGVyIHVzIHdpdGggZmx1c2hpbmcgKi8KKyAgZ3N0X2F1ZGlvX2RlY29kZXJfc2V0X2RyYWluYWJsZSAoZGVjLCBGQUxTRSk7CisgIC8qIGFpbSBmb3Igc29tZSBwZXJmZWN0IHRpbWVzdGFtcGluZyAqLworICBnc3RfYXVkaW9fZGVjb2Rlcl9zZXRfdG9sZXJhbmNlIChkZWMsIDEwICogR1NUX01TRUNPTkQpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYWNrX2RlY19zdG9wIChHc3RBdWRpb0RlY29kZXIgKiBkZWMpCit7CisgIEdzdFdhdnBhY2tEZWMgKndwZGVjID0gR1NUX1dBVlBBQ0tfREVDIChkZWMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlYywgInN0b3AiKTsKKworICBpZiAod3BkZWMtPmNvbnRleHQpIHsKKyAgICBXYXZwYWNrQ2xvc2VGaWxlICh3cGRlYy0+Y29udGV4dCk7CisgICAgd3BkZWMtPmNvbnRleHQgPSBOVUxMOworICB9CisKKyAgZ3N0X3dhdnBhY2tfZGVjX3Jlc2V0ICh3cGRlYyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFja19kZWNfbmVnb3RpYXRlIChHc3RXYXZwYWNrRGVjICogZGVjKQoreworICBHc3RBdWRpb0luZm8gaW5mbzsKKyAgR3N0QXVkaW9Gb3JtYXQgZm10OworICBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBwb3NbNjRdID0geyBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9JTlZBTElELCB9OworCisgIC8qIGFycmFuZ2UgZm9yIDEsIDIgb3IgNC1ieXRlIHdpZHRoID09IGRlcHRoIG91dHB1dCAqLworICBkZWMtPndpZHRoID0gZGVjLT5kZXB0aDsKKyAgc3dpdGNoIChkZWMtPmRlcHRoKSB7CisgICAgY2FzZSA4OgorICAgICAgZm10ID0gR1NUX0FVRElPX0ZPUk1BVF9TODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6CisgICAgICBmbXQgPSBfR1NUX0FVRElPX0ZPUk1BVF9ORSAoUzE2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjQ6CisgICAgY2FzZSAzMjoKKyAgICAgIGZtdCA9IF9HU1RfQVVESU9fRk9STUFUX05FIChTMzIpOworICAgICAgZGVjLT53aWR0aCA9IDMyOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGZtdCA9IEdTVF9BVURJT19GT1JNQVRfVU5LTk9XTjsKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgYnJlYWs7CisgIH0KKworICBnX2Fzc2VydCAoZGVjLT5jaGFubmVsX21hc2sgIT0gMCk7CisKKyAgaWYgKCFnc3Rfd2F2cGFja19nZXRfY2hhbm5lbF9wb3NpdGlvbnMgKGRlYy0+Y2hhbm5lbHMsCisgICAgICAgICAgZGVjLT5jaGFubmVsX21hc2ssIHBvcykpCisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZWMsICJGYWlsZWQgdG8gc2V0IGNoYW5uZWwgbGF5b3V0Iik7CisKKyAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoJmluZm8pOworICBnc3RfYXVkaW9faW5mb19zZXRfZm9ybWF0ICgmaW5mbywgZm10LCBkZWMtPnNhbXBsZV9yYXRlLCBkZWMtPmNoYW5uZWxzLCBwb3MpOworCisgIGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uc190b192YWxpZF9vcmRlciAoaW5mby5wb3NpdGlvbiwgaW5mby5jaGFubmVscyk7CisgIGdzdF9hdWRpb19nZXRfY2hhbm5lbF9yZW9yZGVyX21hcCAoaW5mby5jaGFubmVscywKKyAgICAgIGluZm8ucG9zaXRpb24sIHBvcywgZGVjLT5jaGFubmVsX3Jlb3JkZXJfbWFwKTsKKworICAvKiBzaG91bGQgYWx3YXlzIHN1Y2NlZWQgKi8KKyAgZ3N0X2F1ZGlvX2RlY29kZXJfc2V0X291dHB1dF9mb3JtYXQgKEdTVF9BVURJT19ERUNPREVSIChkZWMpLCAmaW5mbyk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhY2tfZGVjX3NldF9mb3JtYXQgKEdzdEF1ZGlvRGVjb2RlciAqIGJkZWMsIEdzdENhcHMgKiBjYXBzKQoreworICAvKiBwcmV0dHkgbXVjaCBub3RoaW5nIHRvIGRvIGhlcmUsCisgICAqIHdlJ2xsIHBhcnNlIGl0IGFsbCBmcm9tIHRoZSBzdHJlYW0gYW5kIHNldHVwIHRoZW4gKi8KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZwYWNrX2RlY19wb3N0X3RhZ3MgKEdzdFdhdnBhY2tEZWMgKiBkZWMpCit7CisgIEdzdFRhZ0xpc3QgKmxpc3Q7CisgIEdzdEZvcm1hdCBmb3JtYXRfdGltZSA9IEdTVF9GT1JNQVRfVElNRSwgZm9ybWF0X2J5dGVzID0gR1NUX0ZPUk1BVF9CWVRFUzsKKyAgZ2ludDY0IGR1cmF0aW9uLCBzaXplOworCisgIC8qIHRyeSB0byBlc3RpbWF0ZSB0aGUgYXZlcmFnZSBiaXRyYXRlICovCisgIGlmIChnc3RfcGFkX3BlZXJfcXVlcnlfZHVyYXRpb24gKEdTVF9BVURJT19ERUNPREVSX1NJTktfUEFEIChkZWMpLAorICAgICAgICAgIGZvcm1hdF9ieXRlcywgJnNpemUpICYmCisgICAgICBnc3RfcGFkX3BlZXJfcXVlcnlfZHVyYXRpb24gKEdTVF9BVURJT19ERUNPREVSX1NJTktfUEFEIChkZWMpLAorICAgICAgICAgIGZvcm1hdF90aW1lLCAmZHVyYXRpb24pICYmIHNpemUgPiAwICYmIGR1cmF0aW9uID4gMCkgeworICAgIGd1aW50NjQgYml0cmF0ZTsKKworICAgIGxpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgICAgYml0cmF0ZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoc2l6ZSwgOCAqIEdTVF9TRUNPTkQsIGR1cmF0aW9uKTsKKyAgICBnc3RfdGFnX2xpc3RfYWRkIChsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIEdTVF9UQUdfQklUUkFURSwKKyAgICAgICAgKGd1aW50KSBiaXRyYXRlLCBOVUxMKTsKKyAgICBnc3RfYXVkaW9fZGVjb2Rlcl9tZXJnZV90YWdzIChHU1RfQVVESU9fREVDT0RFUiAoZGVjKSwgbGlzdCwKKyAgICAgICAgR1NUX1RBR19NRVJHRV9SRVBMQUNFKTsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKGxpc3QpOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfd2F2cGFja19kZWNfaGFuZGxlX2ZyYW1lIChHc3RBdWRpb0RlY29kZXIgKiBiZGVjLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFdhdnBhY2tEZWMgKmRlYzsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBXYXZwYWNrSGVhZGVyIHdwaDsKKyAgaW50MzJfdCBkZWNvZGVkLCB1bnBhY2tlZF9zaXplOworICBnYm9vbGVhbiBmb3JtYXRfY2hhbmdlZDsKKyAgZ2ludCB3aWR0aCwgZGVwdGgsIGksIGosIG1heDsKKyAgZ2ludDMyICpkZWNfZGF0YSA9IE5VTEw7CisgIGd1aW50OCAqb3V0X2RhdGE7CisgIEdzdE1hcEluZm8gbWFwLCBvbWFwOworCisgIGRlYyA9IEdTVF9XQVZQQUNLX0RFQyAoYmRlYyk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGJ1ZiAhPSBOVUxMLCBHU1RfRkxPV19FUlJPUik7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICAvKiBjaGVjayBpbnB1dCwgd2Ugb25seSBhY2NlcHQgZnJhbWVkIGlucHV0IHdpdGggY29tcGxldGUgY2h1bmtzICovCisgIGlmIChtYXAuc2l6ZSA8IHNpemVvZiAoV2F2cGFja0hlYWRlcikpCisgICAgZ290byBpbnB1dF9ub3RfZnJhbWVkOworCisgIGlmICghZ3N0X3dhdnBhY2tfcmVhZF9oZWFkZXIgKCZ3cGgsIG1hcC5kYXRhKSkKKyAgICBnb3RvIGludmFsaWRfaGVhZGVyOworCisgIGlmIChtYXAuc2l6ZSA8IHdwaC5ja1NpemUgKyA0ICogMSArIDQpCisgICAgZ290byBpbnB1dF9ub3RfZnJhbWVkOworCisgIGlmICghKHdwaC5mbGFncyAmIElOSVRJQUxfQkxPQ0spKQorICAgIGdvdG8gaW5wdXRfbm90X2ZyYW1lZDsKKworICBkZWMtPnd2X2lkLmJ1ZmZlciA9IG1hcC5kYXRhOworICBkZWMtPnd2X2lkLmxlbmd0aCA9IG1hcC5zaXplOworICBkZWMtPnd2X2lkLnBvc2l0aW9uID0gMDsKKworICAvKiBjcmVhdGUgYSBuZXcgd2F2cGFjayBjb250ZXh0IGlmIHRoZXJlIGlzIG5vbmUgeWV0IGJ1dCBpZiB0aGVyZQorICAgKiB3YXMgYWxyZWFkeSBvbmUgKGkuZS4gY2FwcyB3ZXJlIHNldCBvbiB0aGUgc3JjcGFkKSBjaGVjayB3aGV0aGVyCisgICAqIHRoZSBuZXcgb25lIGhhcyB0aGUgc2FtZSBjYXBzICovCisgIGlmICghZGVjLT5jb250ZXh0KSB7CisgICAgZ2NoYXIgZXJyb3JfbXNnWzgwXTsKKworICAgIGRlYy0+Y29udGV4dCA9IFdhdnBhY2tPcGVuRmlsZUlucHV0RXggKGRlYy0+c3RyZWFtX3JlYWRlciwKKyAgICAgICAgJmRlYy0+d3ZfaWQsIE5VTEwsIGVycm9yX21zZywgT1BFTl9TVFJFQU1JTkcsIDApOworCisgICAgLyogZXhwZWN0IHRoaXMgdG8gd29yayAqLworICAgIGlmICghZGVjLT5jb250ZXh0KSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlYywgIkNvdWxkbid0IGRlY29kZSBidWZmZXI6ICVzIiwgZXJyb3JfbXNnKTsKKyAgICAgIGdvdG8gY29udGV4dF9mYWlsZWQ7CisgICAgfQorICB9CisKKyAgZ19hc3NlcnQgKGRlYy0+Y29udGV4dCAhPSBOVUxMKTsKKworICBmb3JtYXRfY2hhbmdlZCA9CisgICAgICAoZGVjLT5zYW1wbGVfcmF0ZSAhPSBXYXZwYWNrR2V0U2FtcGxlUmF0ZSAoZGVjLT5jb250ZXh0KSkgfHwKKyAgICAgIChkZWMtPmNoYW5uZWxzICE9IFdhdnBhY2tHZXROdW1DaGFubmVscyAoZGVjLT5jb250ZXh0KSkgfHwKKyAgICAgIChkZWMtPmRlcHRoICE9IFdhdnBhY2tHZXRCeXRlc1BlclNhbXBsZSAoZGVjLT5jb250ZXh0KSAqIDgpIHx8CisgICAgICAoZGVjLT5jaGFubmVsX21hc2sgIT0gV2F2cGFja0dldENoYW5uZWxNYXNrIChkZWMtPmNvbnRleHQpKTsKKworICBpZiAoIWdzdF9wYWRfaGFzX2N1cnJlbnRfY2FwcyAoR1NUX0FVRElPX0RFQ09ERVJfU1JDX1BBRCAoZGVjKSkgfHwKKyAgICAgIGZvcm1hdF9jaGFuZ2VkKSB7CisgICAgZ2ludCBjaGFubmVsX21hc2s7CisKKyAgICBkZWMtPnNhbXBsZV9yYXRlID0gV2F2cGFja0dldFNhbXBsZVJhdGUgKGRlYy0+Y29udGV4dCk7CisgICAgZGVjLT5jaGFubmVscyA9IFdhdnBhY2tHZXROdW1DaGFubmVscyAoZGVjLT5jb250ZXh0KTsKKyAgICBkZWMtPmRlcHRoID0gV2F2cGFja0dldEJ5dGVzUGVyU2FtcGxlIChkZWMtPmNvbnRleHQpICogODsKKworICAgIGNoYW5uZWxfbWFzayA9IFdhdnBhY2tHZXRDaGFubmVsTWFzayAoZGVjLT5jb250ZXh0KTsKKyAgICBpZiAoY2hhbm5lbF9tYXNrID09IDApCisgICAgICBjaGFubmVsX21hc2sgPSBnc3Rfd2F2cGFja19nZXRfZGVmYXVsdF9jaGFubmVsX21hc2sgKGRlYy0+Y2hhbm5lbHMpOworCisgICAgZGVjLT5jaGFubmVsX21hc2sgPSBjaGFubmVsX21hc2s7CisKKyAgICBnc3Rfd2F2cGFja19kZWNfbmVnb3RpYXRlIChkZWMpOworCisgICAgLyogc2VuZCBHU1RfVEFHX0FVRElPX0NPREVDIGFuZCBHU1RfVEFHX0JJVFJBVEUgdGFncyBiZWZvcmUgc29tZXRoaW5nCisgICAgICogaXMgZGVjb2RlZCBvciBhZnRlciB0aGUgZm9ybWF0IGhhcyBjaGFuZ2VkICovCisgICAgZ3N0X3dhdnBhY2tfZGVjX3Bvc3RfdGFncyAoZGVjKTsKKyAgfQorCisgIC8qIGFsbG9jIG91dHB1dCBidWZmZXIgKi8KKyAgZGVjX2RhdGEgPSBnX21hbGxvYyAoNCAqIHdwaC5ibG9ja19zYW1wbGVzICogZGVjLT5jaGFubmVscyk7CisKKyAgLyogZGVjb2RlICovCisgIGRlY29kZWQgPSBXYXZwYWNrVW5wYWNrU2FtcGxlcyAoZGVjLT5jb250ZXh0LCBkZWNfZGF0YSwgd3BoLmJsb2NrX3NhbXBsZXMpOworICBpZiAoZGVjb2RlZCAhPSB3cGguYmxvY2tfc2FtcGxlcykKKyAgICBnb3RvIGRlY29kZV9lcnJvcjsKKworICB1bnBhY2tlZF9zaXplID0gKGRlYy0+d2lkdGggLyA4KSAqIHdwaC5ibG9ja19zYW1wbGVzICogZGVjLT5jaGFubmVsczsKKyAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICh1bnBhY2tlZF9zaXplKTsKKworICAvKiBsZWdhY3k7IHBhc3MgYWxvbmcgb2Zmc2V0LCB3aGF0ZXZlciB0aGF0IG1pZ2h0IGVudGFpbCAqLworICBHU1RfQlVGRkVSX09GRlNFVCAob3V0YnVmKSA9IEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZvbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgb3V0X2RhdGEgPSBvbWFwLmRhdGE7CisKKyAgd2lkdGggPSBkZWMtPndpZHRoOworICBkZXB0aCA9IGRlYy0+ZGVwdGg7CisgIG1heCA9IGRlYy0+Y2hhbm5lbHMgKiB3cGguYmxvY2tfc2FtcGxlczsKKyAgaWYgKHdpZHRoID09IDgpIHsKKyAgICBnaW50OCAqb3V0YnVmZmVyID0gKGdpbnQ4ICopIG91dF9kYXRhOworICAgIGdpbnQgKnJlb3JkZXJfbWFwID0gZGVjLT5jaGFubmVsX3Jlb3JkZXJfbWFwOworCisgICAgZm9yIChpID0gMDsgaSA8IG1heDsgaSArPSBkZWMtPmNoYW5uZWxzKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgZGVjLT5jaGFubmVsczsgaisrKQorICAgICAgICAqb3V0YnVmZmVyKysgPSAoZ2ludDgpIChkZWNfZGF0YVtpICsgcmVvcmRlcl9tYXBbal1dKTsKKyAgICB9CisgIH0gZWxzZSBpZiAod2lkdGggPT0gMTYpIHsKKyAgICBnaW50MTYgKm91dGJ1ZmZlciA9IChnaW50MTYgKikgb3V0X2RhdGE7CisgICAgZ2ludCAqcmVvcmRlcl9tYXAgPSBkZWMtPmNoYW5uZWxfcmVvcmRlcl9tYXA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWF4OyBpICs9IGRlYy0+Y2hhbm5lbHMpIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBkZWMtPmNoYW5uZWxzOyBqKyspCisgICAgICAgICpvdXRidWZmZXIrKyA9IChnaW50MTYpIChkZWNfZGF0YVtpICsgcmVvcmRlcl9tYXBbal1dKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZGVjLT53aWR0aCA9PSAzMikgeworICAgIGdpbnQzMiAqb3V0YnVmZmVyID0gKGdpbnQzMiAqKSBvdXRfZGF0YTsKKyAgICBnaW50ICpyZW9yZGVyX21hcCA9IGRlYy0+Y2hhbm5lbF9yZW9yZGVyX21hcDsKKworICAgIGlmICh3aWR0aCAhPSBkZXB0aCkgeworICAgICAgZm9yIChpID0gMDsgaSA8IG1heDsgaSArPSBkZWMtPmNoYW5uZWxzKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBkZWMtPmNoYW5uZWxzOyBqKyspCisgICAgICAgICAgKm91dGJ1ZmZlcisrID0KKyAgICAgICAgICAgICAgKGdpbnQzMikgKGRlY19kYXRhW2kgKyByZW9yZGVyX21hcFtqXV0gPDwgKHdpZHRoIC0gZGVwdGgpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpID0gMDsgaSA8IG1heDsgaSArPSBkZWMtPmNoYW5uZWxzKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBkZWMtPmNoYW5uZWxzOyBqKyspCisgICAgICAgICAgKm91dGJ1ZmZlcisrID0gKGdpbnQzMikgKGRlY19kYXRhW2kgKyByZW9yZGVyX21hcFtqXV0pOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgfQorCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm9tYXApOworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICBidWYgPSBOVUxMOworCisgIGdfZnJlZSAoZGVjX2RhdGEpOworCisgIHJldCA9IGdzdF9hdWRpb19kZWNvZGVyX2ZpbmlzaF9mcmFtZSAoYmRlYywgb3V0YnVmLCAxKTsKKworb3V0OgorICBpZiAoYnVmKQorICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSykpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZWMsICJmbG93OiAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgfQorCisgIHJldHVybiByZXQ7CisKKy8qIEVSUk9SUyAqLworaW5wdXRfbm90X2ZyYW1lZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZWMsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksICgiRXhwZWN0ZWQgZnJhbWVkIGlucHV0IikpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gb3V0OworICB9CitpbnZhbGlkX2hlYWRlcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZWMsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksICgiSW52YWxpZCB3YXZwYWNrIGhlYWRlciIpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIG91dDsKKyAgfQorY29udGV4dF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfQVVESU9fREVDT0RFUl9FUlJPUiAoYmRlYywgMSwgTElCUkFSWSwgSU5JVCwgKE5VTEwpLAorICAgICAgICAoImVycm9yIGNyZWF0aW5nIFdhdnBhY2sgY29udGV4dCIpLCByZXQpOworICAgIGdvdG8gb3V0OworICB9CitkZWNvZGVfZXJyb3I6CisgIHsKKyAgICBjb25zdCBnY2hhciAqcmVhc29uID0gInVua25vd24iOworCisgICAgaWYgKGRlYy0+Y29udGV4dCkgeworICAgICAgcmVhc29uID0gV2F2cGFja0dldEVycm9yTWVzc2FnZSAoZGVjLT5jb250ZXh0KTsKKyAgICB9IGVsc2UgeworICAgICAgcmVhc29uID0gImNvdWxkbid0IGNyZWF0ZSBkZWNvZGVyIGNvbnRleHQiOworICAgIH0KKyAgICBHU1RfQVVESU9fREVDT0RFUl9FUlJPUiAoYmRlYywgMSwgU1RSRUFNLCBERUNPREUsIChOVUxMKSwKKyAgICAgICAgKCJkZWNvZGluZyBlcnJvcjogJXMiLCByZWFzb24pLCByZXQpOworICAgIGdfZnJlZSAoZGVjX2RhdGEpOworICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfT0spCisgICAgICBnc3RfYXVkaW9fZGVjb2Rlcl9maW5pc2hfZnJhbWUgKGJkZWMsIE5VTEwsIDEpOworICAgIGdvdG8gb3V0OworICB9Cit9CisKK2dib29sZWFuCitnc3Rfd2F2cGFja19kZWNfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAid2F2cGFja2RlYyIsCisgICAgICAgICAgR1NUX1JBTktfUFJJTUFSWSwgR1NUX1RZUEVfV0FWUEFDS19ERUMpKQorICAgIHJldHVybiBGQUxTRTsKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF93YXZwYWNrX2RlY19kZWJ1ZywgIndhdnBhY2tkZWMiLCAwLAorICAgICAgIldhdnBhY2sgZGVjb2RlciIpOworICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuaCBiL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTAwMmI0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5oCkBAIC0wLDAgKzEsNzggQEAKKy8qIEdTdHJlYW1lciBXYXZwYWNrIHBsdWdpbgorICogQ29weXJpZ2h0IChjKSAyMDA0IEFyd2VkIHYuIE1lcmthdHogPHYubWVya2F0ekBnbXgubmV0PgorICogQ29weXJpZ2h0IChjKSAyMDA2IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBnc3R3YXZwYWNrZGVjLmg6IHJhdyBXYXZwYWNrIGJpdHN0cmVhbSBkZWNvZGVyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9XQVZQQUNLX0RFQ19IX18KKyNkZWZpbmUgX19HU1RfV0FWUEFDS19ERUNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZGVjb2Rlci5oPgorCisjaW5jbHVkZSA8d2F2cGFjay93YXZwYWNrLmg+CisKKyNpbmNsdWRlICJnc3R3YXZwYWNrc3RyZWFtcmVhZGVyLmgiCisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfV0FWUEFDS19ERUMgXAorICAoZ3N0X3dhdnBhY2tfZGVjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9XQVZQQUNLX0RFQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1dBVlBBQ0tfREVDLEdzdFdhdnBhY2tEZWMpKQorI2RlZmluZSBHU1RfV0FWUEFDS19ERUNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfV0FWUEFDS19ERUMsR3N0V2F2cGFja0RlY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1dBVlBBQ0tfREVDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfV0FWUEFDS19ERUMpKQorI2RlZmluZSBHU1RfSVNfV0FWUEFDS19ERUNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfV0FWUEFDS19ERUMpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFdhdnBhY2tEZWMgR3N0V2F2cGFja0RlYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RXYXZwYWNrRGVjQ2xhc3MgR3N0V2F2cGFja0RlY0NsYXNzOworCitzdHJ1Y3QgX0dzdFdhdnBhY2tEZWMKK3sKKyAgR3N0QXVkaW9EZWNvZGVyIGVsZW1lbnQ7CisKKyAgLyo8IHByaXZhdGUgPiAqLworCisgIFdhdnBhY2tDb250ZXh0ICpjb250ZXh0OworICBXYXZwYWNrU3RyZWFtUmVhZGVyICpzdHJlYW1fcmVhZGVyOworCisgIHJlYWRfaWQgd3ZfaWQ7CisKKyAgZ2ludCBzYW1wbGVfcmF0ZTsKKyAgZ2ludCBkZXB0aDsKKyAgZ2ludCB3aWR0aDsKKyAgZ2ludCBjaGFubmVsczsKKyAgZ2ludCBjaGFubmVsX21hc2s7CisKKyAgZ2ludCBjaGFubmVsX3Jlb3JkZXJfbWFwWzY0XTsKKworfTsKKworc3RydWN0IF9Hc3RXYXZwYWNrRGVjQ2xhc3MKK3sKKyAgR3N0QXVkaW9EZWNvZGVyQ2xhc3MgcGFyZW50OworfTsKKworR1R5cGUgZ3N0X3dhdnBhY2tfZGVjX2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3dhdnBhY2tfZGVjX3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1dBVlBBQ0tfREVDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jIGIvZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNjIwNWMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmMKQEAgLTAsMCArMSwxMDA1IEBACisvKiBHU3RyZWFtZXIgV2F2cGFjayBlbmNvZGVyIHBsdWdpbgorICogQ29weXJpZ2h0IChjKSAyMDA2IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBnc3R3YXZwYWNrZGVjLmM6IFdhdnBhY2sgYXVkaW8gZW5jb2RlcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXdhdnBhY2tlbmMKKyAqCisgKiBXYXZwYWNrRW5jIGVuY29kZXMgcmF3IGF1ZGlvIGludG8gYSBmcmFtZWQgV2F2cGFjayBzdHJlYW0uCisgKiA8dWxpbmsgdXJsPSJodHRwOi8vd3d3LndhdnBhY2suY29tLyI+V2F2cGFjazwvdWxpbms+IGlzIGFuIG9wZW4tc291cmNlCisgKiBhdWRpbyBjb2RlYyB0aGF0IGZlYXR1cmVzIGJvdGggbG9zc2xlc3MgYW5kIGxvc3N5IGVuY29kaW5nLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBhdWRpb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9NTAwICEgYXVkaW9jb252ZXJ0ICEgd2F2cGFja2VuYyAhIGZpbGVzaW5rIGxvY2F0aW9uPXNpbmV3YXZlLnd2CisgKiBdfCBUaGlzIHBpcGVsaW5lIGVuY29kZXMgYXVkaW8gZnJvbSBhdWRpb3Rlc3RzcmMgaW50byBhIFdhdnBhY2sgZmlsZS4gVGhlIGF1ZGlvY29udmVydCBlbGVtZW50IGlzIG5lZWRlZAorICogYXMgdGhlIFdhdnBhY2sgZW5jb2RlciBvbmx5IGFjY2VwdHMgaW5wdXQgd2l0aCAzMiBiaXQgd2lkdGguCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgY2RkYTovLzEgISBhdWRpb2NvbnZlcnQgISB3YXZwYWNrZW5jICEgZmlsZXNpbmsgbG9jYXRpb249dHJhY2sxLnd2CisgKiBdfCBUaGlzIHBpcGVsaW5lIGVuY29kZXMgYXVkaW8gZnJvbSBhbiBhdWRpbyBDRCBpbnRvIGEgV2F2cGFjayBmaWxlIHVzaW5nCisgKiBsb3NzbGVzcyBlbmNvZGluZyAodGhlIGZpbGUgb3V0cHV0IHdpbGwgYmUgZmFpcmx5IGxhcmdlKS4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBjZGRhOi8vMSAhIGF1ZGlvY29udmVydCAhIHdhdnBhY2tlbmMgYml0cmF0ZT0xMjgwMDAgISBmaWxlc2luayBsb2NhdGlvbj10cmFjazEud3YKKyAqIF18IFRoaXMgcGlwZWxpbmUgZW5jb2RlcyBhdWRpbyBmcm9tIGFuIGF1ZGlvIENEIGludG8gYSBXYXZwYWNrIGZpbGUgdXNpbmcKKyAqIGxvc3N5IGVuY29kaW5nIGF0IGEgY2VydGFpbiBiaXRyYXRlICh0aGUgZmlsZSB3aWxsIGJlIGZhaXJseSBzbWFsbCkuCisgKiA8L3JlZnNlY3QyPgorICovCisKKy8qCisgKiBUT0RPOiAtIGFkZCAzMiBiaXQgZmxvYXQgbW9kZS4gQ09ORklHX0ZMT0FUX0RBVEEKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdsaWIvZ3ByaW50Zi5oPgorCisjaW5jbHVkZSA8d2F2cGFjay93YXZwYWNrLmg+CisjaW5jbHVkZSAiZ3N0d2F2cGFja2VuYy5oIgorI2luY2x1ZGUgImdzdHdhdnBhY2tjb21tb24uaCIKKworc3RhdGljIGdib29sZWFuIGdzdF93YXZwYWNrX2VuY19zdGFydCAoR3N0QXVkaW9FbmNvZGVyICogZW5jKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfd2F2cGFja19lbmNfc3RvcCAoR3N0QXVkaW9FbmNvZGVyICogZW5jKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfd2F2cGFja19lbmNfc2V0X2Zvcm1hdCAoR3N0QXVkaW9FbmNvZGVyICogZW5jLAorICAgIEdzdEF1ZGlvSW5mbyAqIGluZm8pOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3dhdnBhY2tfZW5jX2hhbmRsZV9mcmFtZSAoR3N0QXVkaW9FbmNvZGVyICogZW5jLAorICAgIEdzdEJ1ZmZlciAqIGluX2J1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3dhdnBhY2tfZW5jX3NpbmtfZXZlbnQgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYywKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworc3RhdGljIGludCBnc3Rfd2F2cGFja19lbmNfcHVzaF9ibG9jayAodm9pZCAqaWQsIHZvaWQgKmRhdGEsIGludDMyX3QgY291bnQpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3dhdnBhY2tfZW5jX2RyYWluIChHc3RXYXZwYWNrRW5jICogZW5jKTsKKworc3RhdGljIHZvaWQgZ3N0X3dhdnBhY2tfZW5jX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF93YXZwYWNrX2VuY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK2VudW0KK3sKKyAgQVJHXzAsCisgIEFSR19NT0RFLAorICBBUkdfQklUUkFURSwKKyAgQVJHX0JJVFNQRVJTQU1QTEUsCisgIEFSR19DT1JSRUNUSU9OX01PREUsCisgIEFSR19NRDUsCisgIEFSR19FWFRSQV9QUk9DRVNTSU5HLAorICBBUkdfSk9JTlRfU1RFUkVPX01PREUKK307CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF93YXZwYWNrX2VuY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3Rfd2F2cGFja19lbmNfZGVidWcKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoUzMyKSAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDggXSwgIiAicmF0ZSA9IChpbnQpIFsgNjAwMCwgMTkyMDAwIF0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXdhdnBhY2ssICIKKyAgICAgICAgImRlcHRoID0gKGludCkgWyAxLCAzMiBdLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIFsgMSwgOCBdLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyA2MDAwLCAxOTIwMDAgXSwgIiAiZnJhbWVkID0gKGJvb2xlYW4pIFRSVUUiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSB3dmNzcmNfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgid3Zjc3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXdhdnBhY2stY29ycmVjdGlvbiwgIiAiZnJhbWVkID0gKGJvb2xlYW4pIFRSVUUiKQorICAgICk7CisKK2VudW0KK3sKKyAgR1NUX1dBVlBBQ0tfRU5DX01PREVfVkVSWV9GQVNUID0gMCwKKyAgR1NUX1dBVlBBQ0tfRU5DX01PREVfRkFTVCwKKyAgR1NUX1dBVlBBQ0tfRU5DX01PREVfREVGQVVMVCwKKyAgR1NUX1dBVlBBQ0tfRU5DX01PREVfSElHSCwKKyAgR1NUX1dBVlBBQ0tfRU5DX01PREVfVkVSWV9ISUdICit9OworCisjZGVmaW5lIEdTVF9UWVBFX1dBVlBBQ0tfRU5DX01PREUgKGdzdF93YXZwYWNrX2VuY19tb2RlX2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3Rfd2F2cGFja19lbmNfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIHF0eXBlID0gMDsKKworICBpZiAocXR5cGUgPT0gMCkgeworICAgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIHZhbHVlc1tdID0geworI2lmIDAKKyAgICAgIC8qIFZlcnkgRmFzdCBDb21wcmVzc2lvbiBpcyBub3Qgc3VwcG9ydGVkIHlldCwgYnV0IHdpbGwgYmUgc3VwcG9ydGVkCisgICAgICAgKiBpbiBmdXR1cmUgd2F2cGFjayB2ZXJzaW9ucyAqLworICAgICAge0dTVF9XQVZQQUNLX0VOQ19NT0RFX1ZFUllfRkFTVCwgIlZlcnkgRmFzdCBDb21wcmVzc2lvbiIsICJ2ZXJ5ZmFzdCJ9LAorI2VuZGlmCisgICAgICB7R1NUX1dBVlBBQ0tfRU5DX01PREVfRkFTVCwgIkZhc3QgQ29tcHJlc3Npb24iLCAiZmFzdCJ9LAorICAgICAge0dTVF9XQVZQQUNLX0VOQ19NT0RFX0RFRkFVTFQsICJOb3JtYWwgQ29tcHJlc3Npb24iLCAibm9ybWFsIn0sCisgICAgICB7R1NUX1dBVlBBQ0tfRU5DX01PREVfSElHSCwgIkhpZ2ggQ29tcHJlc3Npb24iLCAiaGlnaCJ9LAorICAgICAge0dTVF9XQVZQQUNLX0VOQ19NT0RFX1ZFUllfSElHSCwgIlZlcnkgSGlnaCBDb21wcmVzc2lvbiIsICJ2ZXJ5aGlnaCJ9LAorICAgICAgezAsIE5VTEwsIE5VTEx9CisgICAgfTsKKworICAgIHF0eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFdhdnBhY2tFbmNNb2RlIiwgdmFsdWVzKTsKKyAgfQorICByZXR1cm4gcXR5cGU7Cit9CisKK2VudW0KK3sKKyAgR1NUX1dBVlBBQ0tfQ09SUkVDVElPTl9NT0RFX09GRiA9IDAsCisgIEdTVF9XQVZQQUNLX0NPUlJFQ1RJT05fTU9ERV9PTiwKKyAgR1NUX1dBVlBBQ0tfQ09SUkVDVElPTl9NT0RFX09QVElNSVpFRAorfTsKKworI2RlZmluZSBHU1RfVFlQRV9XQVZQQUNLX0VOQ19DT1JSRUNUSU9OX01PREUgKGdzdF93YXZwYWNrX2VuY19jb3JyZWN0aW9uX21vZGVfZ2V0X3R5cGUgKCkpCitzdGF0aWMgR1R5cGUKK2dzdF93YXZwYWNrX2VuY19jb3JyZWN0aW9uX21vZGVfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBxdHlwZSA9IDA7CisKKyAgaWYgKHF0eXBlID09IDApIHsKKyAgICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSB2YWx1ZXNbXSA9IHsKKyAgICAgIHtHU1RfV0FWUEFDS19DT1JSRUNUSU9OX01PREVfT0ZGLCAiQ3JlYXRlIG5vIGNvcnJlY3Rpb24gZmlsZSIsICJvZmYifSwKKyAgICAgIHtHU1RfV0FWUEFDS19DT1JSRUNUSU9OX01PREVfT04sICJDcmVhdGUgY29ycmVjdGlvbiBmaWxlIiwgIm9uIn0sCisgICAgICB7R1NUX1dBVlBBQ0tfQ09SUkVDVElPTl9NT0RFX09QVElNSVpFRCwKKyAgICAgICAgICAiQ3JlYXRlIG9wdGltaXplZCBjb3JyZWN0aW9uIGZpbGUiLCAib3B0aW1pemVkIn0sCisgICAgICB7MCwgTlVMTCwgTlVMTH0KKyAgICB9OworCisgICAgcXR5cGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0V2F2cGFja0VuY0NvcnJlY3Rpb25Nb2RlIiwgdmFsdWVzKTsKKyAgfQorICByZXR1cm4gcXR5cGU7Cit9CisKK2VudW0KK3sKKyAgR1NUX1dBVlBBQ0tfSlNfTU9ERV9BVVRPID0gMCwKKyAgR1NUX1dBVlBBQ0tfSlNfTU9ERV9MRUZUX1JJR0hULAorICBHU1RfV0FWUEFDS19KU19NT0RFX01JRF9TSURFCit9OworCisjZGVmaW5lIEdTVF9UWVBFX1dBVlBBQ0tfRU5DX0pPSU5UX1NURVJFT19NT0RFIChnc3Rfd2F2cGFja19lbmNfam9pbnRfc3RlcmVvX21vZGVfZ2V0X3R5cGUgKCkpCitzdGF0aWMgR1R5cGUKK2dzdF93YXZwYWNrX2VuY19qb2ludF9zdGVyZW9fbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIHF0eXBlID0gMDsKKworICBpZiAocXR5cGUgPT0gMCkgeworICAgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIHZhbHVlc1tdID0geworICAgICAge0dTVF9XQVZQQUNLX0pTX01PREVfQVVUTywgImF1dG8iLCAiYXV0byJ9LAorICAgICAge0dTVF9XQVZQQUNLX0pTX01PREVfTEVGVF9SSUdIVCwgImxlZnQvcmlnaHQiLCAibGVmdHJpZ2h0In0sCisgICAgICB7R1NUX1dBVlBBQ0tfSlNfTU9ERV9NSURfU0lERSwgIm1pZC9zaWRlIiwgIm1pZHNpZGUifSwKKyAgICAgIHswLCBOVUxMLCBOVUxMfQorICAgIH07CisKKyAgICBxdHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RXYXZwYWNrRW5jSlNNb2RlIiwgdmFsdWVzKTsKKyAgfQorICByZXR1cm4gcXR5cGU7Cit9CisKKyNkZWZpbmUgZ3N0X3dhdnBhY2tfZW5jX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFdhdnBhY2tFbmMsIGdzdF93YXZwYWNrX2VuYywgR1NUX1RZUEVfQVVESU9fRU5DT0RFUik7CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFja19lbmNfY2xhc3NfaW5pdCAoR3N0V2F2cGFja0VuY0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikgKGtsYXNzKTsKKyAgR3N0QXVkaW9FbmNvZGVyQ2xhc3MgKmJhc2VfY2xhc3MgPSAoR3N0QXVkaW9FbmNvZGVyQ2xhc3MgKikgKGtsYXNzKTsKKworICAvKiBhZGQgcGFkIHRlbXBsYXRlcyAqLworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNpbmtfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc3JjX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnd2Y3NyY19mYWN0b3J5KTsKKworICAvKiBzZXQgZWxlbWVudCBkZXRhaWxzICovCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJXYXZwYWNrIGF1ZGlvIGVuY29kZXIiLAorICAgICAgIkNvZGVjL0VuY29kZXIvQXVkaW8iLAorICAgICAgIkVuY29kZXMgYXVkaW8gd2l0aCB0aGUgV2F2cGFjayBsb3NzbGVzcy9sb3NzeSBhdWRpbyBjb2RlYyIsCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPiIpOworCisgIC8qIHNldCBwcm9wZXJ0eSBoYW5kbGVycyAqLworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3Rfd2F2cGFja19lbmNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfd2F2cGFja19lbmNfZ2V0X3Byb3BlcnR5OworCisgIGJhc2VfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXZwYWNrX2VuY19zdGFydCk7CisgIGJhc2VfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3dhdnBhY2tfZW5jX3N0b3ApOworICBiYXNlX2NsYXNzLT5zZXRfZm9ybWF0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXZwYWNrX2VuY19zZXRfZm9ybWF0KTsKKyAgYmFzZV9jbGFzcy0+aGFuZGxlX2ZyYW1lID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXZwYWNrX2VuY19oYW5kbGVfZnJhbWUpOworICBiYXNlX2NsYXNzLT5zaW5rX2V2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXZwYWNrX2VuY19zaW5rX2V2ZW50KTsKKworICAvKiBpbnN0YWxsIGFsbCBwcm9wZXJ0aWVzICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIEFSR19NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJtb2RlIiwgIkVuY29kaW5nIG1vZGUiLAorICAgICAgICAgICJTcGVlZCB2ZXJzdXMgY29tcHJlc3Npb24gdHJhZGVvZmYuIiwKKyAgICAgICAgICBHU1RfVFlQRV9XQVZQQUNLX0VOQ19NT0RFLCBHU1RfV0FWUEFDS19FTkNfTU9ERV9ERUZBVUxULAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBBUkdfQklUUkFURSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiYml0cmF0ZSIsICJCaXRyYXRlIiwKKyAgICAgICAgICAiVHJ5IHRvIGVuY29kZSB3aXRoIHRoaXMgYXZlcmFnZSBiaXRyYXRlIChiaXRzL3NlYykuICIKKyAgICAgICAgICAiVGhpcyBlbmFibGVzIGxvc3N5IGVuY29kaW5nLCB2YWx1ZXMgc21hbGxlciB0aGFuIDI0MDAwIGRpc2FibGUgaXQgYWdhaW4uIiwKKyAgICAgICAgICAwLCA5NjAwMDAwLCAwLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgQVJHX0JJVFNQRVJTQU1QTEUsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYml0cy1wZXItc2FtcGxlIiwgIkJpdHMgcGVyIHNhbXBsZSIsCisgICAgICAgICAgIlRyeSB0byBlbmNvZGUgd2l0aCB0aGlzIGFtb3VudCBvZiBiaXRzIHBlciBzYW1wbGUuICIKKyAgICAgICAgICAiVGhpcyBlbmFibGVzIGxvc3N5IGVuY29kaW5nLCB2YWx1ZXMgc21hbGxlciB0aGFuIDIuMCBkaXNhYmxlIGl0IGFnYWluLiIsCisgICAgICAgICAgMC4wLCAyNC4wLCAwLjAsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBBUkdfQ09SUkVDVElPTl9NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJjb3JyZWN0aW9uLW1vZGUiLCAiQ29ycmVjdGlvbiBzdHJlYW0gbW9kZSIsCisgICAgICAgICAgIlVzZSB0aGlzIG1vZGUgZm9yIHRoZSBjb3JyZWN0aW9uIHN0cmVhbS4gT25seSB3b3JrcyBpbiBsb3NzeSBtb2RlISIsCisgICAgICAgICAgR1NUX1RZUEVfV0FWUEFDS19FTkNfQ09SUkVDVElPTl9NT0RFLCBHU1RfV0FWUEFDS19DT1JSRUNUSU9OX01PREVfT0ZGLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBBUkdfTUQ1LAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJtZDUiLCAiTUQ1IiwKKyAgICAgICAgICAiU3RvcmUgTUQ1IGhhc2ggb2YgcmF3IHNhbXBsZXMgd2l0aGluIHRoZSBmaWxlLiIsIEZBTFNFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBBUkdfRVhUUkFfUFJPQ0VTU0lORywKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiZXh0cmEtcHJvY2Vzc2luZyIsICJFeHRyYSBwcm9jZXNzaW5nIiwKKyAgICAgICAgICAiVXNlIGJldHRlciBidXQgc2xvd2VyIGZpbHRlcnMgZm9yIGJldHRlciBjb21wcmVzc2lvbi9xdWFsaXR5LiIsCisgICAgICAgICAgMCwgNiwgMCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIEFSR19KT0lOVF9TVEVSRU9fTU9ERSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgiam9pbnQtc3RlcmVvLW1vZGUiLCAiSm9pbnQtU3RlcmVvIG1vZGUiLAorICAgICAgICAgICJVc2UgdGhpcyBqb2ludC1zdGVyZW8gbW9kZS4iLCBHU1RfVFlQRV9XQVZQQUNLX0VOQ19KT0lOVF9TVEVSRU9fTU9ERSwKKyAgICAgICAgICBHU1RfV0FWUEFDS19KU19NT0RFX0FVVE8sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFja19lbmNfcmVzZXQgKEdzdFdhdnBhY2tFbmMgKiBlbmMpCit7CisgIC8qIGNsb3NlIGFuZCBmcmVlIGV2ZXJ5dGhpbmcgc3RyZWFtIHJlbGF0ZWQgaWYgd2UgYWxyZWFkeSBkaWQgc29tZXRoaW5nICovCisgIGlmIChlbmMtPndwX2NvbnRleHQpIHsKKyAgICBXYXZwYWNrQ2xvc2VGaWxlIChlbmMtPndwX2NvbnRleHQpOworICAgIGVuYy0+d3BfY29udGV4dCA9IE5VTEw7CisgIH0KKyAgaWYgKGVuYy0+d3BfY29uZmlnKSB7CisgICAgZ19mcmVlIChlbmMtPndwX2NvbmZpZyk7CisgICAgZW5jLT53cF9jb25maWcgPSBOVUxMOworICB9CisgIGlmIChlbmMtPmZpcnN0X2Jsb2NrKSB7CisgICAgZ19mcmVlIChlbmMtPmZpcnN0X2Jsb2NrKTsKKyAgICBlbmMtPmZpcnN0X2Jsb2NrID0gTlVMTDsKKyAgfQorICBlbmMtPmZpcnN0X2Jsb2NrX3NpemUgPSAwOworICBpZiAoZW5jLT5tZDVfY29udGV4dCkgeworICAgIGdfY2hlY2tzdW1fZnJlZSAoZW5jLT5tZDVfY29udGV4dCk7CisgICAgZW5jLT5tZDVfY29udGV4dCA9IE5VTEw7CisgIH0KKyAgaWYgKGVuYy0+cGVuZGluZ19zZWdtZW50KQorICAgIGdzdF9ldmVudF91bnJlZiAoZW5jLT5wZW5kaW5nX3NlZ21lbnQpOworICBlbmMtPnBlbmRpbmdfc2VnbWVudCA9IE5VTEw7CisKKyAgaWYgKGVuYy0+cGVuZGluZ19idWZmZXIpIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChlbmMtPnBlbmRpbmdfYnVmZmVyKTsKKyAgICBlbmMtPnBlbmRpbmdfYnVmZmVyID0gTlVMTDsKKyAgICBlbmMtPnBlbmRpbmdfb2Zmc2V0ID0gMDsKKyAgfQorCisgIC8qIHJlc2V0IHRoZSBsYXN0IHJldHVybnMgdG8gR1NUX0ZMT1dfT0suIFRoaXMgaXMgb25seSBzZXQgdG8gc29tZXRoaW5nIGVsc2UKKyAgICogd2hpbGUgV2F2cGFja1BhY2tTYW1wbGVzKCkgb3IgbW9yZSBzcGVjaWZpYyBnc3Rfd2F2cGFja19lbmNfcHVzaF9ibG9jaygpCisgICAqIHNvIG5vdCB2YWxpZCBhbnltb3JlICovCisgIGVuYy0+c3JjcGFkX2xhc3RfcmV0dXJuID0gZW5jLT53dmNzcmNwYWRfbGFzdF9yZXR1cm4gPSBHU1RfRkxPV19PSzsKKworICAvKiByZXNldCBzdHJlYW0gaW5mb3JtYXRpb24gKi8KKyAgZW5jLT5zYW1wbGVyYXRlID0gMDsKKyAgZW5jLT5kZXB0aCA9IDA7CisgIGVuYy0+Y2hhbm5lbHMgPSAwOworICBlbmMtPmNoYW5uZWxfbWFzayA9IDA7CisgIGVuYy0+bmVlZF9jaGFubmVsX3JlbWFwID0gRkFMU0U7CisKKyAgZW5jLT50aW1lc3RhbXBfb2Zmc2V0ID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgZW5jLT5uZXh0X3RzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZwYWNrX2VuY19pbml0IChHc3RXYXZwYWNrRW5jICogZW5jKQoreworICBHc3RBdWRpb0VuY29kZXIgKmJlbmMgPSBHU1RfQVVESU9fRU5DT0RFUiAoZW5jKTsKKworICAvKiBpbml0aWFsaXplIG9iamVjdCBhdHRyaWJ1dGVzICovCisgIGVuYy0+d3BfY29uZmlnID0gTlVMTDsKKyAgZW5jLT53cF9jb250ZXh0ID0gTlVMTDsKKyAgZW5jLT5maXJzdF9ibG9jayA9IE5VTEw7CisgIGVuYy0+bWQ1X2NvbnRleHQgPSBOVUxMOworICBnc3Rfd2F2cGFja19lbmNfcmVzZXQgKGVuYyk7CisKKyAgZW5jLT53dl9pZC5jb3JyZWN0aW9uID0gRkFMU0U7CisgIGVuYy0+d3ZfaWQud2F2cGFja19lbmMgPSBlbmM7CisgIGVuYy0+d3ZfaWQucGFzc3Rocm91Z2ggPSBGQUxTRTsKKyAgZW5jLT53dmNfaWQuY29ycmVjdGlvbiA9IFRSVUU7CisgIGVuYy0+d3ZjX2lkLndhdnBhY2tfZW5jID0gZW5jOworICBlbmMtPnd2Y19pZC5wYXNzdGhyb3VnaCA9IEZBTFNFOworCisgIC8qIHNldCBkZWZhdWx0IHZhbHVlcyBvZiBwYXJhbXMgKi8KKyAgZW5jLT5tb2RlID0gR1NUX1dBVlBBQ0tfRU5DX01PREVfREVGQVVMVDsKKyAgZW5jLT5iaXRyYXRlID0gMDsKKyAgZW5jLT5icHMgPSAwLjA7CisgIGVuYy0+Y29ycmVjdGlvbl9tb2RlID0gR1NUX1dBVlBBQ0tfQ09SUkVDVElPTl9NT0RFX09GRjsKKyAgZW5jLT5tZDUgPSBGQUxTRTsKKyAgZW5jLT5leHRyYV9wcm9jZXNzaW5nID0gMDsKKyAgZW5jLT5qb2ludF9zdGVyZW9fbW9kZSA9IEdTVF9XQVZQQUNLX0pTX01PREVfQVVUTzsKKworICAvKiByZXF1aXJlIHBlcmZlY3QgdHMgKi8KKyAgZ3N0X2F1ZGlvX2VuY29kZXJfc2V0X3BlcmZlY3RfdGltZXN0YW1wIChiZW5jLCBUUlVFKTsKKworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9BVURJT19FTkNPREVSX1NJTktfUEFEIChlbmMpKTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYWNrX2VuY19zdGFydCAoR3N0QXVkaW9FbmNvZGVyICogZW5jKQoreworICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJzdGFydCIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYWNrX2VuY19zdG9wIChHc3RBdWRpb0VuY29kZXIgKiBlbmMpCit7CisgIEdzdFdhdnBhY2tFbmMgKndwZW5jID0gR1NUX1dBVlBBQ0tfRU5DIChlbmMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgInN0b3AiKTsKKyAgZ3N0X3dhdnBhY2tfZW5jX3Jlc2V0ICh3cGVuYyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhY2tfZW5jX3NldF9mb3JtYXQgKEdzdEF1ZGlvRW5jb2RlciAqIGJlbmMsIEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIEdzdFdhdnBhY2tFbmMgKmVuYyA9IEdTVF9XQVZQQUNLX0VOQyAoYmVuYyk7CisgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uICpwb3M7CisgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIG9wb3NbNjRdID0geyBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9JTlZBTElELCB9OworICBHc3RDYXBzICpjYXBzOworICBndWludDY0IG1hc2sgPSAwOworCisgIC8qIHdlIG1heSBiZSBjb25maWd1cmVkIGFnYWluLCBidXQgdGhhdCBjaGFuZ2Ugc2hvdWxkIGhhdmUgY2xlYW51cCBjb250ZXh0ICovCisgIGdfYXNzZXJ0IChlbmMtPndwX2NvbnRleHQgPT0gTlVMTCk7CisKKyAgZW5jLT5jaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTIChpbmZvKTsKKyAgZW5jLT5kZXB0aCA9IEdTVF9BVURJT19JTkZPX0RFUFRIIChpbmZvKTsKKyAgZW5jLT5zYW1wbGVyYXRlID0gR1NUX0FVRElPX0lORk9fUkFURSAoaW5mbyk7CisKKyAgcG9zID0gaW5mby0+cG9zaXRpb247CisgIGdfYXNzZXJ0IChwb3MpOworCisgIC8qIElmIG9uZSBjaGFubmVsIGlzIE5PTkUgdGhleSdsbCBiZSBhbGwgdW5kZWZpbmVkICovCisgIGlmIChwb3MgIT0gTlVMTCAmJiBwb3NbMF0gPT0gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTk9ORSkgeworICAgIGdvdG8gaW52YWxpZF9jaGFubmVsczsKKyAgfQorCisgIGVuYy0+Y2hhbm5lbF9tYXNrID0KKyAgICAgIGdzdF93YXZwYWNrX2dldF9jaGFubmVsX21hc2tfZnJvbV9wb3NpdGlvbnMgKHBvcywgZW5jLT5jaGFubmVscyk7CisgIGVuYy0+bmVlZF9jaGFubmVsX3JlbWFwID0KKyAgICAgIGdzdF93YXZwYWNrX3NldF9jaGFubmVsX21hcHBpbmcgKHBvcywgZW5jLT5jaGFubmVscywKKyAgICAgIGVuYy0+Y2hhbm5lbF9tYXBwaW5nKTsKKworICAvKiB3YXZwYWNrIGNhcHMgaG9sZCBnc3QgbWFzaywgbm90IHdhdnBhY2sgbWFzayAqLworICBnc3RfYXVkaW9fY2hhbm5lbF9wb3NpdGlvbnNfdG9fbWFzayAob3BvcywgZW5jLT5jaGFubmVscywgRkFMU0UsICZtYXNrKTsKKworICAvKiBzZXQgZml4ZWQgc3JjIHBhZCBjYXBzIG5vdyB0aGF0IHdlIGtub3cgd2hhdCB3ZSB3aWxsIGdldCAqLworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtd2F2cGFjayIsCisgICAgICAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBlbmMtPmNoYW5uZWxzLAorICAgICAgInJhdGUiLCBHX1RZUEVfSU5ULCBlbmMtPnNhbXBsZXJhdGUsCisgICAgICAiZGVwdGgiLCBHX1RZUEVfSU5ULCBlbmMtPmRlcHRoLCAiZnJhbWVkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworCisgIGlmIChtYXNrKQorICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJjaGFubmVsLW1hc2siLCBHU1RfVFlQRV9CSVRNQVNLLCBtYXNrLCBOVUxMKTsKKworICBpZiAoIWdzdF9hdWRpb19lbmNvZGVyX3NldF9vdXRwdXRfZm9ybWF0IChiZW5jLCBjYXBzKSkKKyAgICBnb3RvIHNldHRpbmdfc3JjX2NhcHNfZmFpbGVkOworCisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAvKiBubyBzcGVjaWFsIGZlZWRiYWNrIHRvIGJhc2UgY2xhc3M7IHNob3VsZCBwcm92aWRlIGFsbCBhdmFpbGFibGUgc2FtcGxlcyAqLworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworc2V0dGluZ19zcmNfY2Fwc19mYWlsZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChlbmMsCisgICAgICAgICJDb3VsZG4ndCBzZXQgY2FwcyBvbiBzb3VyY2UgcGFkOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQoraW52YWxpZF9jaGFubmVsczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgImlucHV0IGhhcyBpbnZhbGlkIGNoYW5uZWwgbGF5b3V0Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFja19lbmNfc2V0X3dwX2NvbmZpZyAoR3N0V2F2cGFja0VuYyAqIGVuYykKK3sKKyAgZW5jLT53cF9jb25maWcgPSBnX25ldzAgKFdhdnBhY2tDb25maWcsIDEpOworICAvKiBzZXQgZ2VuZXJhbCBzdHJlYW0gaW5mb3JtYXRpb25zIGluIHRoZSBXYXZwYWNrQ29uZmlnICovCisgIGVuYy0+d3BfY29uZmlnLT5ieXRlc19wZXJfc2FtcGxlID0gR1NUX1JPVU5EX1VQXzggKGVuYy0+ZGVwdGgpIC8gODsKKyAgZW5jLT53cF9jb25maWctPmJpdHNfcGVyX3NhbXBsZSA9IGVuYy0+ZGVwdGg7CisgIGVuYy0+d3BfY29uZmlnLT5udW1fY2hhbm5lbHMgPSBlbmMtPmNoYW5uZWxzOworICBlbmMtPndwX2NvbmZpZy0+Y2hhbm5lbF9tYXNrID0gZW5jLT5jaGFubmVsX21hc2s7CisgIGVuYy0+d3BfY29uZmlnLT5zYW1wbGVfcmF0ZSA9IGVuYy0+c2FtcGxlcmF0ZTsKKworICAvKgorICAgKiBTZXQgcGFyYW1ldGVycyBpbiBXYXZwYWNrQ29uZmlnCisgICAqLworCisgIC8qIEVuY29kaW5nIG1vZGUgKi8KKyAgc3dpdGNoIChlbmMtPm1vZGUpIHsKKyNpZiAwCisgICAgY2FzZSBHU1RfV0FWUEFDS19FTkNfTU9ERV9WRVJZX0ZBU1Q6CisgICAgICBlbmMtPndwX2NvbmZpZy0+ZmxhZ3MgfD0gQ09ORklHX1ZFUllfRkFTVF9GTEFHOworICAgICAgZW5jLT53cF9jb25maWctPmZsYWdzIHw9IENPTkZJR19GQVNUX0ZMQUc7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgR1NUX1dBVlBBQ0tfRU5DX01PREVfRkFTVDoKKyAgICAgIGVuYy0+d3BfY29uZmlnLT5mbGFncyB8PSBDT05GSUdfRkFTVF9GTEFHOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfV0FWUEFDS19FTkNfTU9ERV9ERUZBVUxUOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfV0FWUEFDS19FTkNfTU9ERV9ISUdIOgorICAgICAgZW5jLT53cF9jb25maWctPmZsYWdzIHw9IENPTkZJR19ISUdIX0ZMQUc7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9XQVZQQUNLX0VOQ19NT0RFX1ZFUllfSElHSDoKKyAgICAgIGVuYy0+d3BfY29uZmlnLT5mbGFncyB8PSBDT05GSUdfSElHSF9GTEFHOworICAgICAgZW5jLT53cF9jb25maWctPmZsYWdzIHw9IENPTkZJR19WRVJZX0hJR0hfRkxBRzsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogQml0cmF0ZSwgZW5hYmxlcyBsb3NzeSBtb2RlICovCisgIGlmIChlbmMtPmJpdHJhdGUpIHsKKyAgICBlbmMtPndwX2NvbmZpZy0+ZmxhZ3MgfD0gQ09ORklHX0hZQlJJRF9GTEFHOworICAgIGVuYy0+d3BfY29uZmlnLT5mbGFncyB8PSBDT05GSUdfQklUUkFURV9LQlBTOworICAgIGVuYy0+d3BfY29uZmlnLT5iaXRyYXRlID0gZW5jLT5iaXRyYXRlIC8gMTAwMC4wOworICB9IGVsc2UgaWYgKGVuYy0+YnBzKSB7CisgICAgZW5jLT53cF9jb25maWctPmZsYWdzIHw9IENPTkZJR19IWUJSSURfRkxBRzsKKyAgICBlbmMtPndwX2NvbmZpZy0+Yml0cmF0ZSA9IGVuYy0+YnBzOworICB9CisKKyAgLyogQ29ycmVjdGlvbiBNb2RlLCBvbmx5IGluIGxvc3N5IG1vZGUgKi8KKyAgaWYgKGVuYy0+d3BfY29uZmlnLT5mbGFncyAmIENPTkZJR19IWUJSSURfRkxBRykgeworICAgIGlmIChlbmMtPmNvcnJlY3Rpb25fbW9kZSA+IEdTVF9XQVZQQUNLX0NPUlJFQ1RJT05fTU9ERV9PRkYpIHsKKyAgICAgIEdzdENhcHMgKmNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC13YXZwYWNrLWNvcnJlY3Rpb24iLAorICAgICAgICAgICJmcmFtZWQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisKKyAgICAgIGVuYy0+d3Zjc3JjcGFkID0KKyAgICAgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnd2Y3NyY19mYWN0b3J5LCAid3Zjc3JjIik7CisKKyAgICAgIC8qIHRyeSB0byBhZGQgY29ycmVjdGlvbiBzcmMgcGFkLCBkb24ndCBzZXQgY29ycmVjdGlvbiBtb2RlIG9uIGZhaWx1cmUgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgIkFkZGluZyBjb3JyZWN0aW9uIHBhZCB3aXRoIGNhcHMgJSIKKyAgICAgICAgICBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisgICAgICBpZiAoIWdzdF9wYWRfc2V0X2NhcHMgKGVuYy0+d3Zjc3JjcGFkLCBjYXBzKSkgeworICAgICAgICBlbmMtPmNvcnJlY3Rpb25fbW9kZSA9IDA7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZW5jLCAic2V0dGluZyBjb3JyZWN0aW9uIGNhcHMgZmFpbGVkIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChlbmMtPnd2Y3NyY3BhZCk7CisgICAgICAgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoZW5jLT53dmNzcmNwYWQsIFRSVUUpOworICAgICAgICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoZW5jKSwgZW5jLT53dmNzcmNwYWQpOworICAgICAgICBlbmMtPndwX2NvbmZpZy0+ZmxhZ3MgfD0gQ09ORklHX0NSRUFURV9XVkM7CisgICAgICAgIGlmIChlbmMtPmNvcnJlY3Rpb25fbW9kZSA9PSBHU1RfV0FWUEFDS19DT1JSRUNUSU9OX01PREVfT1BUSU1JWkVEKSB7CisgICAgICAgICAgZW5jLT53cF9jb25maWctPmZsYWdzIHw9IENPTkZJR19PUFRJTUlaRV9XVkM7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGVuYy0+Y29ycmVjdGlvbl9tb2RlID4gR1NUX1dBVlBBQ0tfQ09SUkVDVElPTl9NT0RFX09GRikgeworICAgICAgZW5jLT5jb3JyZWN0aW9uX21vZGUgPSAwOworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbmMsICJzZXR0aW5nIGNvcnJlY3Rpb24gbW9kZSBvbmx5IGhhcyAiCisgICAgICAgICAgImFueSBlZmZlY3QgaWYgYSBiaXRyYXRlIGlzIHByb3ZpZGVkLiIpOworICAgIH0KKyAgfQorICBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgKEdTVF9FTEVNRU5UIChlbmMpKTsKKworICAvKiBNRDUsIHNldHVwIE1ENSBjb250ZXh0ICovCisgIGlmICgoZW5jLT5tZDUpICYmICEoZW5jLT5tZDVfY29udGV4dCkpIHsKKyAgICBlbmMtPndwX2NvbmZpZy0+ZmxhZ3MgfD0gQ09ORklHX01ENV9DSEVDS1NVTTsKKyAgICBlbmMtPm1kNV9jb250ZXh0ID0gZ19jaGVja3N1bV9uZXcgKEdfQ0hFQ0tTVU1fTUQ1KTsKKyAgfQorCisgIC8qIEV4dHJhIGVuY29kZSBwcm9jZXNzaW5nICovCisgIGlmIChlbmMtPmV4dHJhX3Byb2Nlc3NpbmcpIHsKKyAgICBlbmMtPndwX2NvbmZpZy0+ZmxhZ3MgfD0gQ09ORklHX0VYVFJBX01PREU7CisgICAgZW5jLT53cF9jb25maWctPnhtb2RlID0gZW5jLT5leHRyYV9wcm9jZXNzaW5nOworICB9CisKKyAgLyogSm9pbnQgc3RlcmVvIG1vZGUgKi8KKyAgc3dpdGNoIChlbmMtPmpvaW50X3N0ZXJlb19tb2RlKSB7CisgICAgY2FzZSBHU1RfV0FWUEFDS19KU19NT0RFX0FVVE86CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9XQVZQQUNLX0pTX01PREVfTEVGVF9SSUdIVDoKKyAgICAgIGVuYy0+d3BfY29uZmlnLT5mbGFncyB8PSBDT05GSUdfSk9JTlRfT1ZFUlJJREU7CisgICAgICBlbmMtPndwX2NvbmZpZy0+ZmxhZ3MgJj0gfkNPTkZJR19KT0lOVF9TVEVSRU87CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9XQVZQQUNLX0pTX01PREVfTUlEX1NJREU6CisgICAgICBlbmMtPndwX2NvbmZpZy0+ZmxhZ3MgfD0gKENPTkZJR19KT0lOVF9PVkVSUklERSB8IENPTkZJR19KT0lOVF9TVEVSRU8pOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGludAorZ3N0X3dhdnBhY2tfZW5jX3B1c2hfYmxvY2sgKHZvaWQgKmlkLCB2b2lkICpkYXRhLCBpbnQzMl90IGNvdW50KQoreworICBHc3RXYXZwYWNrRW5jV3JpdGVJRCAqd2lkID0gKEdzdFdhdnBhY2tFbmNXcml0ZUlEICopIGlkOworICBHc3RXYXZwYWNrRW5jICplbmMgPSBHU1RfV0FWUEFDS19FTkMgKHdpZC0+d2F2cGFja19lbmMpOworICBHc3RGbG93UmV0dXJuICpmbG93OworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0UGFkICpwYWQ7CisgIGd1Y2hhciAqYmxvY2sgPSAoZ3VjaGFyICopIGRhdGE7CisgIGdpbnQgc2FtcGxlcyA9IDA7CisKKyAgcGFkID0gKHdpZC0+Y29ycmVjdGlvbikgPyBlbmMtPnd2Y3NyY3BhZCA6IEdTVF9BVURJT19FTkNPREVSX1NSQ19QQUQgKGVuYyk7CisgIGZsb3cgPQorICAgICAgKHdpZC0+Y29ycmVjdGlvbikgPyAmZW5jLT4KKyAgICAgIHd2Y3NyY3BhZF9sYXN0X3JldHVybiA6ICZlbmMtPnNyY3BhZF9sYXN0X3JldHVybjsKKworICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGNvdW50KTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChidWZmZXIsIDAsIGRhdGEsIGNvdW50KTsKKworICBpZiAoY291bnQgPiBzaXplb2YgKFdhdnBhY2tIZWFkZXIpICYmIG1lbWNtcCAoYmxvY2ssICJ3dnBrIiwgNCkgPT0gMCkgeworICAgIC8qIGlmIGl0J3MgYSBXYXZwYWNrIGJsb2NrIHNldCBidWZmZXIgdGltZXN0YW1wIGFuZCBkdXJhdGlvbiwgZXRjICovCisgICAgV2F2cGFja0hlYWRlciB3cGg7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoZW5jLCAiZ290ICVkIGJ5dGVzIG9mIGVuY29kZWQgd2F2cGFjayAlc2RhdGEiLAorICAgICAgICBjb3VudCwgKHdpZC0+Y29ycmVjdGlvbikgPyAiY29ycmVjdGlvbiAiIDogIiIpOworCisgICAgZ3N0X3dhdnBhY2tfcmVhZF9oZWFkZXIgKCZ3cGgsIGJsb2NrKTsKKworICAgIC8qIE9ubHkgc2V0IHdoZW4gcHVzaGluZyB0aGUgZmlyc3QgYnVmZmVyIGFnYWluLCBpbiB0aGF0IGNhc2UKKyAgICAgKiB3ZSBkb24ndCB3YW50IHRvIGRlbGF5IHRoZSBidWZmZXIgb3IgcHVzaCBuZXdzZWdtZW50IGV2ZW50cworICAgICAqLworICAgIGlmICghd2lkLT5wYXNzdGhyb3VnaCkgeworICAgICAgLyogT25seSBwdXNoIGNvbXBsZXRlIGJsb2NrcyAqLworICAgICAgaWYgKGVuYy0+cGVuZGluZ19idWZmZXIgPT0gTlVMTCkgeworICAgICAgICBlbmMtPnBlbmRpbmdfYnVmZmVyID0gYnVmZmVyOworICAgICAgICBlbmMtPnBlbmRpbmdfb2Zmc2V0ID0gd3BoLmJsb2NrX2luZGV4OworICAgICAgfSBlbHNlIGlmIChlbmMtPnBlbmRpbmdfb2Zmc2V0ID09IHdwaC5ibG9ja19pbmRleCkgeworICAgICAgICBlbmMtPnBlbmRpbmdfYnVmZmVyID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKGVuYy0+cGVuZGluZ19idWZmZXIsIGJ1ZmZlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfRVJST1IgKCJHb3QgaW5jb21wbGV0ZSBibG9jaywgZHJvcHBpbmciKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoZW5jLT5wZW5kaW5nX2J1ZmZlcik7CisgICAgICAgIGVuYy0+cGVuZGluZ19idWZmZXIgPSBidWZmZXI7CisgICAgICAgIGVuYy0+cGVuZGluZ19vZmZzZXQgPSB3cGguYmxvY2tfaW5kZXg7CisgICAgICB9CisKKyAgICAgIC8qIElzIHRoaXMgdGhlIG5vdC1maW5hbCBibG9jayBvZiBtdWx0aS1jaGFubmVsIGRhdGE/IElmIHNvLCBqdXN0CisgICAgICAgKiBhY2N1bXVsYXRlIGFuZCByZXR1cm4gaGVyZS4gKi8KKyAgICAgIGlmICghKHdwaC5mbGFncyAmIEZJTkFMX0JMT0NLKSAmJiAoKGJsb2NrWzMyXSAmIElEX09QVElPTkFMX0RBVEEpID09IDApKQorICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgYnVmZmVyID0gZW5jLT5wZW5kaW5nX2J1ZmZlcjsKKyAgICAgIGVuYy0+cGVuZGluZ19idWZmZXIgPSBOVUxMOworICAgICAgZW5jLT5wZW5kaW5nX29mZnNldCA9IDA7CisKKyAgICAgIC8qIG9ubHkgc2VuZCBzZWdtZW50IG9uIGNvcnJlY3Rpb24gcGFkLAorICAgICAgICogcmVndWxhciBwYWQgaXMgaGFuZGxlZCBub3JtYWxseSBieSBiYXNlY2xhc3MgKi8KKyAgICAgIGlmICh3aWQtPmNvcnJlY3Rpb24gJiYgZW5jLT5wZW5kaW5nX3NlZ21lbnQpIHsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChwYWQsIGVuYy0+cGVuZGluZ19zZWdtZW50KTsKKyAgICAgICAgZW5jLT5wZW5kaW5nX3NlZ21lbnQgPSBOVUxMOworICAgICAgfQorCisgICAgICBpZiAod3BoLmJsb2NrX2luZGV4ID09IDApIHsKKyAgICAgICAgLyogc2F2ZSBoZWFkZXIgZm9yIGxhdGVyIHJlZmVyZW5jZSwgc28gd2UgY2FuIHJlLXNlbmQgaXQgbGF0ZXIgb24KKyAgICAgICAgICogRU9TIHdpdGggZml4ZWQgdXAgdmFsdWVzIGZvciB0b3RhbCBzYW1wbGUgY291bnQgZXRjLiAqLworICAgICAgICBpZiAoZW5jLT5maXJzdF9ibG9jayA9PSBOVUxMICYmICF3aWQtPmNvcnJlY3Rpb24pIHsKKyAgICAgICAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgICAgICAgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICAgICAgZW5jLT5maXJzdF9ibG9jayA9IGdfbWVtZHVwIChtYXAuZGF0YSwgbWFwLnNpemUpOworICAgICAgICAgIGVuYy0+Zmlyc3RfYmxvY2tfc2l6ZSA9IG1hcC5zaXplOworICAgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgc2FtcGxlcyA9IHdwaC5ibG9ja19zYW1wbGVzOworCisgICAgLyogZGVjb3JhdGUgYnVmZmVyICovCisgICAgLyogTk9URTogdGhpcyB3aWxsIGdldCBvdmVyd3JpdHRlbiBieSBiYXNlY2xhc3MsIGJ1dCBzdGF5IGZvciB0aG9zZQorICAgICAqIHRoYXQgYXJlIHB1c2hlZCBkaXJlY3RseQorICAgICAqIEZJWE1FOiBhZGQgc2V0dGluZyB0byBiYXNlY2xhc3MgdG8gYXZvaWQgb3ZlcndyaXRpbmcgaXQgPz8gKi8KKyAgICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKSA9IHdwaC5ibG9ja19pbmRleDsKKyAgICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKGJ1ZmZlcikgPSB3cGguYmxvY2tfaW5kZXggKyB3cGguYmxvY2tfc2FtcGxlczsKKyAgfSBlbHNlIHsKKyAgICAvKiBpZiBpdCdzIHNvbWV0aGluZyBlbHNlIHNldCBubyB0aW1lc3RhbXAgYW5kIGR1cmF0aW9uIG9uIHRoZSBidWZmZXIgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJnb3QgJWQgYnl0ZXMgb2YgdW5rbm93biBkYXRhIiwgY291bnQpOworICB9CisKKyAgaWYgKHdpZC0+Y29ycmVjdGlvbiB8fCB3aWQtPnBhc3N0aHJvdWdoKSB7CisgICAgLyogcHVzaCB0aGUgYnVmZmVyIGFuZCBmb3J3YXJkIGVycm9ycyAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgInB1c2hpbmcgYnVmZmVyIHdpdGggJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyIsCisgICAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcikpOworICAgICpmbG93ID0gZ3N0X3BhZF9wdXNoIChwYWQsIGJ1ZmZlcik7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZW5jLCAiaGFuZGluZyBmcmFtZSBvZiAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIiwKKyAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSk7CisgICAgKmZsb3cgPSBnc3RfYXVkaW9fZW5jb2Rlcl9maW5pc2hfZnJhbWUgKEdTVF9BVURJT19FTkNPREVSIChlbmMpLCBidWZmZXIsCisgICAgICAgIHNhbXBsZXMpOworICB9CisKKyAgaWYgKCpmbG93ICE9IEdTVF9GTE9XX09LKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbmMsICJmbG93IG9uICVzOiVzID0gJXMiLAorICAgICAgICBHU1RfREVCVUdfUEFEX05BTUUgKHBhZCksIGdzdF9mbG93X2dldF9uYW1lICgqZmxvdykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3dhdnBhY2tfZW5jX2ZpeF9jaGFubmVsX29yZGVyIChHc3RXYXZwYWNrRW5jICogZW5jLCBnaW50MzIgKiBkYXRhLAorICAgIGdpbnQgbnNhbXBsZXMpCit7CisgIGdpbnQgaSwgajsKKyAgZ2ludDMyIHRtcFs4XTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnNhbXBsZXMgLyBlbmMtPmNoYW5uZWxzOyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgZW5jLT5jaGFubmVsczsgaisrKSB7CisgICAgICB0bXBbZW5jLT5jaGFubmVsX21hcHBpbmdbal1dID0gZGF0YVtqXTsKKyAgICB9CisgICAgZm9yIChqID0gMDsgaiA8IGVuYy0+Y2hhbm5lbHM7IGorKykgeworICAgICAgZGF0YVtqXSA9IHRtcFtqXTsKKyAgICB9CisgICAgZGF0YSArPSBlbmMtPmNoYW5uZWxzOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfd2F2cGFja19lbmNfaGFuZGxlX2ZyYW1lIChHc3RBdWRpb0VuY29kZXIgKiBiZW5jLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFdhdnBhY2tFbmMgKmVuYyA9IEdTVF9XQVZQQUNLX0VOQyAoYmVuYyk7CisgIHVpbnQzMl90IHNhbXBsZV9jb3VudDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdE1hcEluZm8gbWFwOworCisgIC8qIGJhc2UgY2xhc3MgZW5zdXJlcyBjb25maWd1cmF0aW9uICovCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChlbmMtPmRlcHRoICE9IDAsIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEKTsKKworICAvKiByZXNldCB0aGUgbGFzdCByZXR1cm5zIHRvIEdTVF9GTE9XX09LLiBUaGlzIGlzIG9ubHkgc2V0IHRvIHNvbWV0aGluZyBlbHNlCisgICAqIHdoaWxlIFdhdnBhY2tQYWNrU2FtcGxlcygpIG9yIG1vcmUgc3BlY2lmaWMgZ3N0X3dhdnBhY2tfZW5jX3B1c2hfYmxvY2soKQorICAgKiBzbyBub3QgdmFsaWQgYW55bW9yZSAqLworICBlbmMtPnNyY3BhZF9sYXN0X3JldHVybiA9IGVuYy0+d3Zjc3JjcGFkX2xhc3RfcmV0dXJuID0gR1NUX0ZMT1dfT0s7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFidWYpKQorICAgIHJldHVybiBnc3Rfd2F2cGFja19lbmNfZHJhaW4gKGVuYyk7CisKKyAgc2FtcGxlX2NvdW50ID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSAvIDQ7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgImdvdCAldSByYXcgc2FtcGxlcyIsIHNhbXBsZV9jb3VudCk7CisKKyAgLyogY2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGEgdmFsaWQgV2F2cGFja0NvbnRleHQsIG90aGVyd2lzZSBtYWtlIG9uZSAqLworICBpZiAoIWVuYy0+d3BfY29udGV4dCkgeworICAgIC8qIGNyZWF0ZSByYXcgY29udGV4dCAqLworICAgIGVuYy0+d3BfY29udGV4dCA9CisgICAgICAgIFdhdnBhY2tPcGVuRmlsZU91dHB1dCAoZ3N0X3dhdnBhY2tfZW5jX3B1c2hfYmxvY2ssICZlbmMtPnd2X2lkLAorICAgICAgICAoZW5jLT5jb3JyZWN0aW9uX21vZGUgPiAwKSA/ICZlbmMtPnd2Y19pZCA6IE5VTEwpOworICAgIGlmICghZW5jLT53cF9jb250ZXh0KQorICAgICAgZ290byBjb250ZXh0X2ZhaWxlZDsKKworICAgIC8qIHNldCB0aGUgV2F2cGFja0NvbmZpZyBhY2NvcmRpbmcgdG8gb3VyIHBhcmFtZXRlcnMgKi8KKyAgICBnc3Rfd2F2cGFja19lbmNfc2V0X3dwX2NvbmZpZyAoZW5jKTsKKworICAgIC8qIHNldCB0aGUgY29uZmlndXJhdGlvbiB0byB0aGUgY29udGV4dCBub3cgdGhhdCB3ZSBrbm93IGV2ZXJ5dGhpbmcKKyAgICAgKiBhbmQgaW5pdGlhbGl6ZSB0aGUgZW5jb2RlciAqLworICAgIGlmICghV2F2cGFja1NldENvbmZpZ3VyYXRpb24gKGVuYy0+d3BfY29udGV4dCwKKyAgICAgICAgICAgIGVuYy0+d3BfY29uZmlnLCAodWludDMyX3QpICgtMSkpCisgICAgICAgIHx8ICFXYXZwYWNrUGFja0luaXQgKGVuYy0+d3BfY29udGV4dCkpIHsKKyAgICAgIFdhdnBhY2tDbG9zZUZpbGUgKGVuYy0+d3BfY29udGV4dCk7CisgICAgICBnb3RvIGNvbmZpZ19mYWlsZWQ7CisgICAgfQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgInNldHVwIG9mIGVuY29kaW5nIGNvbnRleHQgc3VjY2Vzc2Z1bGwiKTsKKyAgfQorCisgIGlmIChlbmMtPm5lZWRfY2hhbm5lbF9yZW1hcCkgeworICAgIGJ1ZiA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoYnVmKTsKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICBnc3Rfd2F2cGFja19lbmNfZml4X2NoYW5uZWxfb3JkZXIgKGVuYywgKGdpbnQzMiAqKSBtYXAuZGF0YSwgc2FtcGxlX2NvdW50KTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICB9CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICAvKiBpZiB3ZSB3YW50IHRvIGFwcGVuZCB0aGUgTUQ1IHN1bSB0byB0aGUgc3RyZWFtIHVwZGF0ZSBpdCBoZXJlCisgICAqIHdpdGggdGhlIGN1cnJlbnQgcmF3IHNhbXBsZXMgKi8KKyAgaWYgKGVuYy0+bWQ1KSB7CisgICAgZ19jaGVja3N1bV91cGRhdGUgKGVuYy0+bWQ1X2NvbnRleHQsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgIH0KKworICAvKiBlbmNvZGUgYW5kIGhhbmRsZSByZXR1cm4gdmFsdWVzIGZyb20gZW5jb2RpbmcgKi8KKyAgaWYgKFdhdnBhY2tQYWNrU2FtcGxlcyAoZW5jLT53cF9jb250ZXh0LCAoaW50MzJfdCAqKSBtYXAuZGF0YSwKKyAgICAgICAgICBzYW1wbGVfY291bnQgLyBlbmMtPmNoYW5uZWxzKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgImVuY29kaW5nIHNhbXBsZXMgc3VjY2Vzc2Z1bCIpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgIH0gZWxzZSB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICBpZiAoKGVuYy0+c3JjcGFkX2xhc3RfcmV0dXJuID09IEdTVF9GTE9XX09LKSB8fAorICAgICAgICAoZW5jLT53dmNzcmNwYWRfbGFzdF9yZXR1cm4gPT0gR1NUX0ZMT1dfT0spKSB7CisgICAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICB9IGVsc2UgaWYgKChlbmMtPnNyY3BhZF9sYXN0X3JldHVybiA9PSBHU1RfRkxPV19OT1RfTElOS0VEKSAmJgorICAgICAgICAoZW5jLT53dmNzcmNwYWRfbGFzdF9yZXR1cm4gPT0gR1NUX0ZMT1dfTk9UX0xJTktFRCkpIHsKKyAgICAgIHJldCA9IEdTVF9GTE9XX05PVF9MSU5LRUQ7CisgICAgfSBlbHNlIGlmICgoZW5jLT5zcmNwYWRfbGFzdF9yZXR1cm4gPT0gR1NUX0ZMT1dfRkxVU0hJTkcpICYmCisgICAgICAgIChlbmMtPnd2Y3NyY3BhZF9sYXN0X3JldHVybiA9PSBHU1RfRkxPV19GTFVTSElORykpIHsKKyAgICAgIHJldCA9IEdTVF9GTE9XX0ZMVVNISU5HOworICAgIH0gZWxzZSB7CisgICAgICBnb3RvIGVuY29kaW5nX2ZhaWxlZDsKKyAgICB9CisgIH0KKworZXhpdDoKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK2VuY29kaW5nX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChlbmMsIExJQlJBUlksIEVOQ09ERSwgKE5VTEwpLAorICAgICAgICAoImVuY29kaW5nIHNhbXBsZXMgZmFpbGVkIikpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZXhpdDsKKyAgfQorY29uZmlnX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChlbmMsIExJQlJBUlksIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgiZXJyb3Igc2V0dGluZyB1cCB3YXZwYWNrIGVuY29kaW5nIGNvbnRleHQiKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBleGl0OworICB9Citjb250ZXh0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChlbmMsIExJQlJBUlksIElOSVQsIChOVUxMKSwKKyAgICAgICAgKCJlcnJvciBjcmVhdGluZyBXYXZwYWNrIGNvbnRleHQiKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBleGl0OworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFja19lbmNfcmV3cml0ZV9maXJzdF9ibG9jayAoR3N0V2F2cGFja0VuYyAqIGVuYykKK3sKKyAgR3N0U2VnbWVudCBzZWdtZW50OworICBnYm9vbGVhbiByZXQ7CisgIEdzdFF1ZXJ5ICpxdWVyeTsKKyAgZ2Jvb2xlYW4gc2Vla2FibGUgPSBGQUxTRTsKKworICBnX3JldHVybl9pZl9mYWlsIChlbmMpOworICBnX3JldHVybl9pZl9mYWlsIChlbmMtPmZpcnN0X2Jsb2NrKTsKKworICAvKiB1cGRhdGUgdGhlIHNhbXBsZSBjb3VudCBpbiB0aGUgZmlyc3QgYmxvY2sgKi8KKyAgV2F2cGFja1VwZGF0ZU51bVNhbXBsZXMgKGVuYy0+d3BfY29udGV4dCwgZW5jLT5maXJzdF9ibG9jayk7CisKKyAgLyogdHJ5IHRvIHNlZWsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0ICovCisgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19zZWVraW5nIChHU1RfRk9STUFUX0JZVEVTKTsKKyAgaWYgKGdzdF9wYWRfcGVlcl9xdWVyeSAoR1NUX0FVRElPX0VOQ09ERVJfU1JDX1BBRCAoZW5jKSwgcXVlcnkpKSB7CisgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKworICAgIGdzdF9xdWVyeV9wYXJzZV9zZWVraW5nIChxdWVyeSwgJmZvcm1hdCwgJnNlZWthYmxlLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoZm9ybWF0ICE9IEdTVF9GT1JNQVRfQllURVMpCisgICAgICBzZWVrYWJsZSA9IEZBTFNFOworICB9IGVsc2UgeworICAgIEdTVF9MT0dfT0JKRUNUIChlbmMsICJTRUVLSU5HIHF1ZXJ5IG5vdCBoYW5kbGVkIik7CisgIH0KKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisKKyAgaWYgKCFzZWVrYWJsZSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgImRvd25zdHJlYW0gbm90IHNlZWthYmxlOyBub3QgcmV3cml0aW5nIik7CisgICAgcmV0dXJuOworICB9CisKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfQllURVMpOworICByZXQgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKEdTVF9BVURJT19FTkNPREVSX1NSQ19QQUQgKGVuYyksCisgICAgICBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSk7CisgIGlmIChyZXQpIHsKKyAgICAvKiB0cnkgdG8gcmV3cml0ZSB0aGUgZmlyc3QgYmxvY2sgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJyZXdyaXRpbmcgZmlyc3QgYmxvY2sgLi4uIik7CisgICAgZW5jLT53dl9pZC5wYXNzdGhyb3VnaCA9IFRSVUU7CisgICAgcmV0ID0gZ3N0X3dhdnBhY2tfZW5jX3B1c2hfYmxvY2sgKCZlbmMtPnd2X2lkLAorICAgICAgICBlbmMtPmZpcnN0X2Jsb2NrLCBlbmMtPmZpcnN0X2Jsb2NrX3NpemUpOworICAgIGVuYy0+d3ZfaWQucGFzc3Rocm91Z2ggPSBGQUxTRTsKKyAgICBnX2ZyZWUgKGVuYy0+Zmlyc3RfYmxvY2spOworICAgIGVuYy0+Zmlyc3RfYmxvY2sgPSBOVUxMOworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZW5jLCAicmV3cml0aW5nIG9mIGZpcnN0IGJsb2NrIGZhaWxlZC4gIgorICAgICAgICAiU2Vla2luZyB0byBmaXJzdCBibG9jayBmYWlsZWQhIik7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF93YXZwYWNrX2VuY19kcmFpbiAoR3N0V2F2cGFja0VuYyAqIGVuYykKK3sKKyAgaWYgKCFlbmMtPndwX2NvbnRleHQpCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgImRyYWluaW5nIik7CisKKyAgLyogRW5jb2RlIGFsbCByZW1haW5pbmcgc2FtcGxlcyBhbmQgZmx1c2ggdGhlbSB0byB0aGUgc3JjIHBhZHMgKi8KKyAgV2F2cGFja0ZsdXNoU2FtcGxlcyAoZW5jLT53cF9jb250ZXh0KTsKKworICAvKiBEcm9wIGFsbCByZW1haW5pbmcgZGF0YSwgdGhpcyBpcyBubyBjb21wbGV0ZSBibG9jayBvdGhlcndpc2UKKyAgICogaXQgd291bGQndmUgYmVlbiBwdXNoZWQgYWxyZWFkeSAqLworICBpZiAoZW5jLT5wZW5kaW5nX2J1ZmZlcikgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKGVuYy0+cGVuZGluZ19idWZmZXIpOworICAgIGVuYy0+cGVuZGluZ19idWZmZXIgPSBOVUxMOworICAgIGVuYy0+cGVuZGluZ19vZmZzZXQgPSAwOworICB9CisKKyAgLyogd3JpdGUgdGhlIE1ENSBzdW0gaWYgd2UgaGF2ZSB0byB3cml0ZSBvbmUgKi8KKyAgaWYgKChlbmMtPm1kNSkgJiYgKGVuYy0+bWQ1X2NvbnRleHQpKSB7CisgICAgZ3VpbnQ4IG1kNV9kaWdlc3RbMTZdOworICAgIGdzaXplIGRpZ2VzdF9sZW4gPSBzaXplb2YgKG1kNV9kaWdlc3QpOworCisgICAgZ19jaGVja3N1bV9nZXRfZGlnZXN0IChlbmMtPm1kNV9jb250ZXh0LCBtZDVfZGlnZXN0LCAmZGlnZXN0X2xlbik7CisgICAgaWYgKGRpZ2VzdF9sZW4gPT0gc2l6ZW9mIChtZDVfZGlnZXN0KSkgeworICAgICAgV2F2cGFja1N0b3JlTUQ1U3VtIChlbmMtPndwX2NvbnRleHQsIG1kNV9kaWdlc3QpOworICAgICAgV2F2cGFja0ZsdXNoU2FtcGxlcyAoZW5jLT53cF9jb250ZXh0KTsKKyAgICB9IGVsc2UKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZW5jLCAiQ2FsY3VsYXRpbmcgTUQ1IGRpZ2VzdCBmYWlsZWQiKTsKKyAgfQorCisgIC8qIFRyeSB0byByZXdyaXRlIHRoZSBmaXJzdCBmcmFtZSB3aXRoIHRoZSBjb3JyZWN0IHNhbXBsZSBudW1iZXIgKi8KKyAgaWYgKGVuYy0+Zmlyc3RfYmxvY2spCisgICAgZ3N0X3dhdnBhY2tfZW5jX3Jld3JpdGVfZmlyc3RfYmxvY2sgKGVuYyk7CisKKyAgLyogY2xvc2UgdGhlIGNvbnRleHQgaWYgbm90IGFscmVhZHkgaGFwcGVuZWQgKi8KKyAgaWYgKGVuYy0+d3BfY29udGV4dCkgeworICAgIFdhdnBhY2tDbG9zZUZpbGUgKGVuYy0+d3BfY29udGV4dCk7CisgICAgZW5jLT53cF9jb250ZXh0ID0gTlVMTDsKKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2cGFja19lbmNfc2lua19ldmVudCAoR3N0QXVkaW9FbmNvZGVyICogYmVuYywgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0V2F2cGFja0VuYyAqZW5jID0gR1NUX1dBVlBBQ0tfRU5DIChiZW5jKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJSZWNlaXZlZCAlcyBldmVudCBvbiBzaW5rcGFkIiwKKyAgICAgIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDoKKyAgICAgIGlmIChlbmMtPndwX2NvbnRleHQpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbmMsICJnb3QgTkVXU0VHTUVOVCBhZnRlciBlbmNvZGluZyAiCisgICAgICAgICAgICAiYWxyZWFkeSBzdGFydGVkIik7CisgICAgICB9CisgICAgICAvKiBwZWVrIGFuZCBob2xkIE5FV1NFR01FTlQgZXZlbnRzIGZvciBzZW5kaW5nIG9uIGNvcnJlY3Rpb24gcGFkICovCisgICAgICBpZiAoZW5jLT5wZW5kaW5nX3NlZ21lbnQpCisgICAgICAgIGdzdF9ldmVudF91bnJlZiAoZW5jLT5wZW5kaW5nX3NlZ21lbnQpOworICAgICAgZW5jLT5wZW5kaW5nX3NlZ21lbnQgPSBnc3RfZXZlbnRfcmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBiYXNlY2xhc3MgaGFuZGxlcyByZXN0ICovCisgIHJldHVybiBHU1RfQVVESU9fRU5DT0RFUl9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2lua19ldmVudCAoYmVuYywgZXZlbnQpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3dhdnBhY2tfZW5jX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RXYXZwYWNrRW5jICplbmMgPSBHU1RfV0FWUEFDS19FTkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBBUkdfTU9ERToKKyAgICAgIGVuYy0+bW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0JJVFJBVEU6eworICAgICAgZ3VpbnQgdmFsID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworCisgICAgICBpZiAoKHZhbCA+PSAyNDAwMCkgJiYgKHZhbCA8PSA5NjAwMDAwKSkgeworICAgICAgICBlbmMtPmJpdHJhdGUgPSB2YWw7CisgICAgICAgIGVuYy0+YnBzID0gMC4wOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZW5jLT5iaXRyYXRlID0gMDsKKyAgICAgICAgZW5jLT5icHMgPSAwLjA7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBUkdfQklUU1BFUlNBTVBMRTp7CisgICAgICBnZG91YmxlIHZhbCA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworCisgICAgICBpZiAoKHZhbCA+PSAyLjApICYmICh2YWwgPD0gMjQuMCkpIHsKKyAgICAgICAgZW5jLT5icHMgPSB2YWw7CisgICAgICAgIGVuYy0+Yml0cmF0ZSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbmMtPmJwcyA9IDAuMDsKKyAgICAgICAgZW5jLT5iaXRyYXRlID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFSR19DT1JSRUNUSU9OX01PREU6CisgICAgICBlbmMtPmNvcnJlY3Rpb25fbW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX01ENToKKyAgICAgIGVuYy0+bWQ1ID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfRVhUUkFfUFJPQ0VTU0lORzoKKyAgICAgIGVuYy0+ZXh0cmFfcHJvY2Vzc2luZyA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0pPSU5UX1NURVJFT19NT0RFOgorICAgICAgZW5jLT5qb2ludF9zdGVyZW9fbW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZwYWNrX2VuY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0V2F2cGFja0VuYyAqZW5jID0gR1NUX1dBVlBBQ0tfRU5DIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgQVJHX01PREU6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgZW5jLT5tb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0JJVFJBVEU6CisgICAgICBpZiAoZW5jLT5icHMgPT0gMC4wKSB7CisgICAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBlbmMtPmJpdHJhdGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIDApOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfQklUU1BFUlNBTVBMRToKKyAgICAgIGlmIChlbmMtPmJpdHJhdGUgPT0gMCkgeworICAgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCBlbmMtPmJwcyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCAwLjApOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfQ09SUkVDVElPTl9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGVuYy0+Y29ycmVjdGlvbl9tb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX01ENToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBlbmMtPm1kNSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19FWFRSQV9QUk9DRVNTSU5HOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIGVuYy0+ZXh0cmFfcHJvY2Vzc2luZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19KT0lOVF9TVEVSRU9fTU9ERToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBlbmMtPmpvaW50X3N0ZXJlb19tb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF93YXZwYWNrX2VuY19wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJ3YXZwYWNrZW5jIiwKKyAgICAgICAgICBHU1RfUkFOS19OT05FLCBHU1RfVFlQRV9XQVZQQUNLX0VOQykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3Rfd2F2cGFja19lbmNfZGVidWcsICJ3YXZwYWNrZW5jIiwgMCwKKyAgICAgICJXYXZwYWNrIGVuY29kZXIiKTsKKworICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuaCBiL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmE1YjExCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5oCkBAIC0wLDAgKzEsMTA1IEBACisvKiBHU3RyZWFtZXIgV2F2cGFjayBlbmNvZGVyIHBsdWdpbgorICogQ29weXJpZ2h0IChjKSAyMDA2IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBnc3R3YXZwYWNrZW5jLmg6IFdhdnBhY2sgYXVkaW8gZW5jb2RlcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfV0FWUEFDS19FTkNfSF9fCisjZGVmaW5lIF9fR1NUX1dBVlBBQ0tfRU5DX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb2VuY29kZXIuaD4KKworI2luY2x1ZGUgPHdhdnBhY2svd2F2cGFjay5oPgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX1dBVlBBQ0tfRU5DIFwKKyAgKGdzdF93YXZwYWNrX2VuY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfV0FWUEFDS19FTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9XQVZQQUNLX0VOQyxHc3RXYXZwYWNrRW5jKSkKKyNkZWZpbmUgR1NUX1dBVlBBQ0tfRU5DX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1dBVlBBQ0tfRU5DLEdzdFdhdnBhY2tFbmMpKQorI2RlZmluZSBHU1RfSVNfV0FWUEFDS19FTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9XQVZQQUNLX0VOQykpCisjZGVmaW5lIEdTVF9JU19XQVZQQUNLX0VOQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9XQVZQQUNLX0VOQykpCit0eXBlZGVmIHN0cnVjdCBfR3N0V2F2cGFja0VuYyBHc3RXYXZwYWNrRW5jOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFdhdnBhY2tFbmNDbGFzcyBHc3RXYXZwYWNrRW5jQ2xhc3M7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGdib29sZWFuIGNvcnJlY3Rpb247CisgIEdzdFdhdnBhY2tFbmMgKndhdnBhY2tfZW5jOworICBnYm9vbGVhbiBwYXNzdGhyb3VnaDsKK30gR3N0V2F2cGFja0VuY1dyaXRlSUQ7CisKKworc3RydWN0IF9Hc3RXYXZwYWNrRW5jCit7CisgIEdzdEF1ZGlvRW5jb2RlciBlbGVtZW50OworCisgIC8qPCBwcml2YXRlID4gKi8KKyAgR3N0UGFkICp3dmNzcmNwYWQ7CisKKyAgR3N0Rmxvd1JldHVybiBzcmNwYWRfbGFzdF9yZXR1cm47CisgIEdzdEZsb3dSZXR1cm4gd3Zjc3JjcGFkX2xhc3RfcmV0dXJuOworCisgIFdhdnBhY2tDb25maWcgKndwX2NvbmZpZzsKKyAgV2F2cGFja0NvbnRleHQgKndwX2NvbnRleHQ7CisKKyAgZ2ludCBzYW1wbGVyYXRlOworICBnaW50IGNoYW5uZWxzOworICBnaW50IGNoYW5uZWxfbWFzazsKKyAgZ2ludDggY2hhbm5lbF9tYXBwaW5nWzhdOworICBnYm9vbGVhbiBuZWVkX2NoYW5uZWxfcmVtYXA7CisgIGdpbnQgZGVwdGg7CisKKyAgR3N0V2F2cGFja0VuY1dyaXRlSUQgd3ZfaWQ7CisgIEdzdFdhdnBhY2tFbmNXcml0ZUlEIHd2Y19pZDsKKworICBndWludCBtb2RlOworICBndWludCBiaXRyYXRlOworICBnZG91YmxlIGJwczsKKyAgZ3VpbnQgY29ycmVjdGlvbl9tb2RlOworICBnYm9vbGVhbiBtZDU7CisgIEdDaGVja3N1bSAqbWQ1X2NvbnRleHQ7CisgIGd1aW50IGV4dHJhX3Byb2Nlc3Npbmc7CisgIGd1aW50IGpvaW50X3N0ZXJlb19tb2RlOworCisgIHZvaWQgKmZpcnN0X2Jsb2NrOworICBpbnQzMl90IGZpcnN0X2Jsb2NrX3NpemU7CisKKyAgR3N0QnVmZmVyICpwZW5kaW5nX2J1ZmZlcjsKKyAgZ2ludDMyIHBlbmRpbmdfb2Zmc2V0OworICBHc3RFdmVudCAqcGVuZGluZ19zZWdtZW50OworCisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXBfb2Zmc2V0OworICBHc3RDbG9ja1RpbWUgbmV4dF90czsKK307CisKK3N0cnVjdCBfR3N0V2F2cGFja0VuY0NsYXNzCit7CisgIEdzdEF1ZGlvRW5jb2RlckNsYXNzIHBhcmVudDsKK307CisKK0dUeXBlIGdzdF93YXZwYWNrX2VuY19nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF93YXZwYWNrX2VuY19wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9XQVZQQUNLX0VOQ19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tzdHJlYW1yZWFkZXIuYyBiL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tzdHJlYW1yZWFkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDI5YTM3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3dhdnBhY2svZ3N0d2F2cGFja3N0cmVhbXJlYWRlci5jCkBAIC0wLDAgKzEsMTI1IEBACisvKiBHU3RyZWFtZXIgV2F2cGFjayBwbHVnaW4KKyAqIENvcHlyaWdodCAoYykgMjAwNiBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKgorICogZ3N0d2F2cGFja3N0cmVhbXJlYWRlci5jOiBzdHJlYW0gcmVhZGVyIHVzZWQgZm9yIGRlY29kaW5nCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJnc3R3YXZwYWNrc3RyZWFtcmVhZGVyLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKHdhdnBhY2tfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgd2F2cGFja19kZWJ1ZworCitzdGF0aWMgaW50MzJfdAorZ3N0X3dhdnBhY2tfc3RyZWFtX3JlYWRlcl9yZWFkX2J5dGVzICh2b2lkICppZCwgdm9pZCAqZGF0YSwgaW50MzJfdCBiY291bnQpCit7CisgIHJlYWRfaWQgKnJpZCA9IChyZWFkX2lkICopIGlkOworICB1aW50MzJfdCBsZWZ0ID0gcmlkLT5sZW5ndGggLSByaWQtPnBvc2l0aW9uOworICB1aW50MzJfdCB0b19yZWFkID0gTUlOIChsZWZ0LCBiY291bnQpOworCisgIEdTVF9ERUJVRyAoIlRyeWluZyB0byByZWFkICVkIG9mICVkIGJ5dGVzIGZyb20gcG9zaXRpb24gJWQiLCBiY291bnQsCisgICAgICByaWQtPmxlbmd0aCwgcmlkLT5wb3NpdGlvbik7CisKKyAgaWYgKHRvX3JlYWQgPiAwKSB7CisgICAgbWVtbW92ZSAoZGF0YSwgcmlkLT5idWZmZXIgKyByaWQtPnBvc2l0aW9uLCB0b19yZWFkKTsKKyAgICByaWQtPnBvc2l0aW9uICs9IHRvX3JlYWQ7CisgICAgcmV0dXJuIHRvX3JlYWQ7CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkcgKCJDb3VsZG4ndCByZWFkICVkIGJ5dGVzIiwgYmNvdW50KTsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCitzdGF0aWMgdWludDMyX3QKK2dzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfZ2V0X3BvcyAodm9pZCAqaWQpCit7CisgIEdTVF9ERUJVRyAoIlJldHVybmluZyBwb3NpdGlvbiAlZCIsICgocmVhZF9pZCAqKSBpZCktPnBvc2l0aW9uKTsKKyAgcmV0dXJuICgocmVhZF9pZCAqKSBpZCktPnBvc2l0aW9uOworfQorCitzdGF0aWMgaW50Citnc3Rfd2F2cGFja19zdHJlYW1fcmVhZGVyX3NldF9wb3NfYWJzICh2b2lkICppZCwgdWludDMyX3QgcG9zKQoreworICBHU1RfV0FSTklORyAoIlNob3VsZCBub3QgYmUgY2FsbGVkOiB0cmllZCB0byBzZXQgYWJzb2x1dGUgcG9zaXRpb24gdG8gJWQiLAorICAgICAgcG9zKTsKKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50Citnc3Rfd2F2cGFja19zdHJlYW1fcmVhZGVyX3NldF9wb3NfcmVsICh2b2lkICppZCwgaW50MzJfdCBkZWx0YSwgaW50IG1vZGUpCit7CisgIEdTVF9XQVJOSU5HICgiU2hvdWxkIG5vdCBiZSBjYWxsZWQ6IHRyaWVkIHRvIHNldCByZWxhdGl2ZSBwb3NpdGlvbiB0byAlZCIKKyAgICAgICIgd2l0aCBtb2RlICVkIiwgZGVsdGEsIG1vZGUpOworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK2dzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfcHVzaF9iYWNrX2J5dGUgKHZvaWQgKmlkLCBpbnQgYykKK3sKKyAgcmVhZF9pZCAqcmlkID0gKHJlYWRfaWQgKikgaWQ7CisKKyAgR1NUX0RFQlVHICgiUHVzaGluZyBiYWNrIG9uZSBieXRlOiAweCV4IiwgYyk7CisKKyAgaWYgKHJpZC0+cG9zaXRpb24gPT0gMCkKKyAgICByZXR1cm4gcmlkLT5wb3NpdGlvbjsKKworICByaWQtPnBvc2l0aW9uIC09IDE7CisgIHJldHVybiByaWQtPnBvc2l0aW9uOworfQorCitzdGF0aWMgdWludDMyX3QKK2dzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfZ2V0X2xlbmd0aCAodm9pZCAqaWQpCit7CisgIEdTVF9ERUJVRyAoIlJldHVybmluZyBsZW5ndGggJWQiLCAoKHJlYWRfaWQgKikgaWQpLT5sZW5ndGgpOworCisgIHJldHVybiAoKHJlYWRfaWQgKikgaWQpLT5sZW5ndGg7Cit9CisKK3N0YXRpYyBpbnQKK2dzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfY2FuX3NlZWsgKHZvaWQgKmlkKQoreworICBHU1RfREVCVUcgKCJDYW4ndCBzZWVrIik7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludDMyX3QKK2dzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfd3JpdGVfYnl0ZXMgKHZvaWQgKmlkLCB2b2lkICpkYXRhLCBpbnQzMl90IGJjb3VudCkKK3sKKyAgR1NUX1dBUk5JTkcgKCJTaG91bGQgbm90IGJlIGNhbGxlZCwgdHJpZWQgdG8gd3JpdGUgJWQgYnl0ZXMiLCBiY291bnQpOworICByZXR1cm4gMDsKK30KKworV2F2cGFja1N0cmVhbVJlYWRlciAqCitnc3Rfd2F2cGFja19zdHJlYW1fcmVhZGVyX25ldyAodm9pZCkKK3sKKyAgV2F2cGFja1N0cmVhbVJlYWRlciAqc3RyZWFtX3JlYWRlciA9CisgICAgICAoV2F2cGFja1N0cmVhbVJlYWRlciAqKSBnX21hbGxvYzAgKHNpemVvZiAoV2F2cGFja1N0cmVhbVJlYWRlcikpOworICBzdHJlYW1fcmVhZGVyLT5yZWFkX2J5dGVzID0gZ3N0X3dhdnBhY2tfc3RyZWFtX3JlYWRlcl9yZWFkX2J5dGVzOworICBzdHJlYW1fcmVhZGVyLT5nZXRfcG9zID0gZ3N0X3dhdnBhY2tfc3RyZWFtX3JlYWRlcl9nZXRfcG9zOworICBzdHJlYW1fcmVhZGVyLT5zZXRfcG9zX2FicyA9IGdzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfc2V0X3Bvc19hYnM7CisgIHN0cmVhbV9yZWFkZXItPnNldF9wb3NfcmVsID0gZ3N0X3dhdnBhY2tfc3RyZWFtX3JlYWRlcl9zZXRfcG9zX3JlbDsKKyAgc3RyZWFtX3JlYWRlci0+cHVzaF9iYWNrX2J5dGUgPSBnc3Rfd2F2cGFja19zdHJlYW1fcmVhZGVyX3B1c2hfYmFja19ieXRlOworICBzdHJlYW1fcmVhZGVyLT5nZXRfbGVuZ3RoID0gZ3N0X3dhdnBhY2tfc3RyZWFtX3JlYWRlcl9nZXRfbGVuZ3RoOworICBzdHJlYW1fcmVhZGVyLT5jYW5fc2VlayA9IGdzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfY2FuX3NlZWs7CisgIHN0cmVhbV9yZWFkZXItPndyaXRlX2J5dGVzID0gZ3N0X3dhdnBhY2tfc3RyZWFtX3JlYWRlcl93cml0ZV9ieXRlczsKKworICByZXR1cm4gc3RyZWFtX3JlYWRlcjsKK30KZGlmZiAtLWdpdCBhL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tzdHJlYW1yZWFkZXIuaCBiL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tzdHJlYW1yZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzQxMmNjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3dhdnBhY2svZ3N0d2F2cGFja3N0cmVhbXJlYWRlci5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIEdTdHJlYW1lciBXYXZwYWNrIHBsdWdpbgorICogQ29weXJpZ2h0IChjKSAyMDA2IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBnc3R3YXZwYWNrc3RyZWFtcmVhZGVyLmg6IHN0cmVhbSByZWFkZXIgdXNlZCBmb3IgZGVjb2RpbmcKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1dBVlBBQ0tfU1RSRUFNX1JFQURFUl9IX18KKyNkZWZpbmUgX19HU1RfV0FWUEFDS19TVFJFQU1fUkVBREVSX0hfXworCisjaW5jbHVkZSA8d2F2cGFjay93YXZwYWNrLmg+CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGd1aW50OCAqYnVmZmVyOworICB1aW50MzJfdCBsZW5ndGg7CisgIHVpbnQzMl90IHBvc2l0aW9uOworfSByZWFkX2lkOworCitXYXZwYWNrU3RyZWFtUmVhZGVyICpnc3Rfd2F2cGFja19zdHJlYW1fcmVhZGVyX25ldyAodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L3dhdnBhY2svbWVzb24uYnVpbGQgYi9leHQvd2F2cGFjay9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGM5MDcxCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3dhdnBhY2svbWVzb24uYnVpbGQKQEAgLTAsMCArMSwyMSBAQAord2F2cGFja19zb3VyY2VzID0gWworICAnZ3N0d2F2cGFjay5jJywKKyAgJ2dzdHdhdnBhY2tjb21tb24uYycsCisgICdnc3R3YXZwYWNrZGVjLmMnLAorICAnZ3N0d2F2cGFja2VuYy5jJywKKyAgJ2dzdHdhdnBhY2tzdHJlYW1yZWFkZXIuYycsCitdCisKK3dhdnBhY2tfZGVwID0gZGVwZW5kZW5jeSgnd2F2cGFjaycsIHZlcnNpb24gOiAnPj0gNC42MC4wJywgcmVxdWlyZWQgOiBmYWxzZSkKKworaWYgd2F2cGFja19kZXAuZm91bmQoKQorICBnc3R3YXZwYWNrID0gbGlicmFyeSgnZ3N0d2F2cGFjaycsCisgICAgd2F2cGFja19zb3VyY2VzLAorICAgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgICBsaW5rX2FyZ3MgOiBub3NlaF9saW5rX2FyZ3MsCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICAgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgZ3N0YXVkaW9fZGVwLCB3YXZwYWNrX2RlcF0sCisgICAgaW5zdGFsbCA6IHRydWUsCisgICAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorICApCitlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0LWxpYnMvZ3N0L2dldHRleHQuaCBiL2dzdC1saWJzL2dzdC9nZXR0ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3MGFiNwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC1saWJzL2dzdC9nZXR0ZXh0LmgKQEAgLTAsMCArMSw2OSBAQAorLyogQ29udmVuaWVuY2UgaGVhZGVyIGZvciBjb25kaXRpb25hbCB1c2Ugb2YgR05VIDxsaWJpbnRsLmg+LgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTgsIDIwMDAtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgX0xJQkdFVFRFWFRfSAorI2RlZmluZSBfTElCR0VUVEVYVF9IIDEKKworLyogTkxTIGNhbiBiZSBkaXNhYmxlZCB0aHJvdWdoIHRoZSBjb25maWd1cmUgLS1kaXNhYmxlLW5scyBvcHRpb24uICAqLworI2lmZGVmIEVOQUJMRV9OTFMKKworLyogR2V0IGRlY2xhcmF0aW9ucyBvZiBHTlUgbWVzc2FnZSBjYXRhbG9nIGZ1bmN0aW9ucy4gICovCisjIGluY2x1ZGUgPGxpYmludGwuaD4KKworI2Vsc2UKKworLyogU29sYXJpcyAvdXNyL2luY2x1ZGUvbG9jYWxlLmggaW5jbHVkZXMgL3Vzci9pbmNsdWRlL2xpYmludGwuaCwgd2hpY2gKKyAgIGNob2tlcyBpZiBkY2dldHRleHQgaXMgZGVmaW5lZCBhcyBhIG1hY3JvLiAgU28gaW5jbHVkZSBpdCBub3csIHRvIG1ha2UKKyAgIGxhdGVyIGluY2x1c2lvbnMgb2YgPGxvY2FsZS5oPiBhIE5PUC4gIFdlIGRvbid0IGluY2x1ZGUgPGxpYmludGwuaD4KKyAgIGFzIHdlbGwgYmVjYXVzZSBwZW9wbGUgdXNpbmcgImdldHRleHQuaCIgd2lsbCBub3QgaW5jbHVkZSA8bGliaW50bC5oPiwKKyAgIGFuZCBhbHNvIGluY2x1ZGluZyA8bGliaW50bC5oPiB3b3VsZCBmYWlsIG9uIFN1bk9TIDQsIHdoZXJlYXMgPGxvY2FsZS5oPgorICAgaXMgT0suICAqLworI2lmIGRlZmluZWQoX19zdW4pCisjIGluY2x1ZGUgPGxvY2FsZS5oPgorI2VuZGlmCisKKy8qIERpc2FibGVkIE5MUy4KKyAgIFRoZSBjYXN0cyB0byAnY29uc3QgY2hhciAqJyBzZXJ2ZSB0aGUgcHVycG9zZSBvZiBwcm9kdWNpbmcgd2FybmluZ3MKKyAgIGZvciBpbnZhbGlkIHVzZXMgb2YgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhlc2UgZnVuY3Rpb25zLgorICAgT24gcHJlLUFOU0kgc3lzdGVtcyB3aXRob3V0ICdjb25zdCcsIHRoZSBjb25maWcuaCBmaWxlIGlzIHN1cHBvc2VkIHRvCisgICBjb250YWluICIjZGVmaW5lIGNvbnN0Ii4gICovCisjIGRlZmluZSBnZXR0ZXh0KE1zZ2lkKSAoKGNvbnN0IGNoYXIgKikgKE1zZ2lkKSkKKyMgZGVmaW5lIGRnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkKSAoKGNvbnN0IGNoYXIgKikgKE1zZ2lkKSkKKyMgZGVmaW5lIGRjZ2V0dGV4dChEb21haW5uYW1lLCBNc2dpZCwgQ2F0ZWdvcnkpICgoY29uc3QgY2hhciAqKSAoTXNnaWQpKQorIyBkZWZpbmUgbmdldHRleHQoTXNnaWQxLCBNc2dpZDIsIE4pIFwKKyAgICAoKE4pID09IDEgPyAoY29uc3QgY2hhciAqKSAoTXNnaWQxKSA6IChjb25zdCBjaGFyICopIChNc2dpZDIpKQorIyBkZWZpbmUgZG5nZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkMSwgTXNnaWQyLCBOKSBcCisgICAgKChOKSA9PSAxID8gKGNvbnN0IGNoYXIgKikgKE1zZ2lkMSkgOiAoY29uc3QgY2hhciAqKSAoTXNnaWQyKSkKKyMgZGVmaW5lIGRjbmdldHRleHQoRG9tYWlubmFtZSwgTXNnaWQxLCBNc2dpZDIsIE4sIENhdGVnb3J5KSBcCisgICAgKChOKSA9PSAxID8gKGNvbnN0IGNoYXIgKikgKE1zZ2lkMSkgOiAoY29uc3QgY2hhciAqKSAoTXNnaWQyKSkKKyMgZGVmaW5lIHRleHRkb21haW4oRG9tYWlubmFtZSkgKChjb25zdCBjaGFyICopIChEb21haW5uYW1lKSkKKyMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbm5hbWUsIERpcm5hbWUpICgoY29uc3QgY2hhciAqKSAoRGlybmFtZSkpCisjIGRlZmluZSBiaW5kX3RleHRkb21haW5fY29kZXNldChEb21haW5uYW1lLCBDb2Rlc2V0KSAoKGNvbnN0IGNoYXIgKikgKENvZGVzZXQpKQorCisjZW5kaWYKKworLyogQSBwc2V1ZG8gZnVuY3Rpb24gY2FsbCB0aGF0IHNlcnZlcyBhcyBhIG1hcmtlciBmb3IgdGhlIGF1dG9tYXRlZAorICAgZXh0cmFjdGlvbiBvZiBtZXNzYWdlcywgYnV0IGRvZXMgbm90IGNhbGwgZ2V0dGV4dCgpLiAgVGhlIHJ1bi10aW1lCisgICB0cmFuc2xhdGlvbiBpcyBkb25lIGF0IGEgZGlmZmVyZW50IHBsYWNlIGluIHRoZSBjb2RlLgorICAgVGhlIGFyZ3VtZW50LCBTdHJpbmcsIHNob3VsZCBiZSBhIGxpdGVyYWwgc3RyaW5nLiAgQ29uY2F0ZW5hdGVkIHN0cmluZ3MKKyAgIGFuZCBvdGhlciBzdHJpbmcgZXhwcmVzc2lvbnMgd29uJ3Qgd29yay4KKyAgIFRoZSBtYWNybydzIGV4cGFuc2lvbiBpcyBub3QgcGFyZW50aGVzaXplZCwgc28gdGhhdCBpdCBpcyBzdWl0YWJsZSBhcworICAgaW5pdGlhbGl6ZXIgZm9yIHN0YXRpYyAnY2hhcltdJyBvciAnY29uc3QgY2hhcltdJyB2YXJpYWJsZXMuICAqLworI2RlZmluZSBnZXR0ZXh0X25vb3AoU3RyaW5nKSBTdHJpbmcKKworI2VuZGlmIC8qIF9MSUJHRVRURVhUX0ggKi8KZGlmZiAtLWdpdCBhL2dzdC1saWJzL2dzdC9nbGliLWNvbXBhdC1wcml2YXRlLmggYi9nc3QtbGlicy9nc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMzdkZTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QtbGlicy9nc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBnbGliLWNvbXBhdC5jCisgKiBGdW5jdGlvbnMgY29waWVkIGZyb20gZ2xpYiAyLjEwCisgKgorICogQ29weXJpZ2h0IDIwMDUgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dMSUJfQ09NUEFUX1BSSVZBVEVfSF9fCisjZGVmaW5lIF9fR0xJQl9DT01QQVRfUFJJVkFURV9IX18KKworI2luY2x1ZGUgPGdsaWIuaD4KKworR19CRUdJTl9ERUNMUworCisvKiBjb3BpZXMgKi8KKworLyogYWRhcHRhdGlvbnMgKi8KKworR19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QtbGlicy9nc3QvZ3N0LWkxOG4tcGx1Z2luLmggYi9nc3QtbGlicy9nc3QvZ3N0LWkxOG4tcGx1Z2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0MGNlMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC1saWJzL2dzdC9nc3QtaTE4bi1wbHVnaW4uaApAQCAtMCwwICsxLDQ3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKyAqCisgKiBnc3QtaTE4bi1wbHVnaW5zLmg6IGludGVybmF0aW9uYWxpemF0aW9uIG1hY3JvcyBmb3IgdGhlIEdTdHJlYW1lciBwbHVnaW5zCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9JMThOX1BMVUdJTl9IX18KKyNkZWZpbmUgX19HU1RfSTE4Tl9QTFVHSU5fSF9fCisKKyNpZm5kZWYgR0VUVEVYVF9QQUNLQUdFCisjZXJyb3IgWW91IG11c3QgZGVmaW5lIEdFVFRFWFRfUEFDS0FHRSBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgaGVhZGVyLgorI2VuZGlmCisKKyNpZmRlZiBFTkFCTEVfTkxTCisKKyNpbmNsdWRlIDxsb2NhbGUuaD4KKworI2luY2x1ZGUgImdldHRleHQuaCIgLyogaW5jbHVkZWQgd2l0aCBnZXR0ZXh0IGRpc3RyaWJ1dGlvbiBhbmQgY29waWVkICovCisKKy8qIHdlIHdhbnQgdG8gdXNlIHNob3J0aGFuZCBfKCkgZm9yIHRyYW5zbGF0aW5nIGFuZCBOXygpIGZvciBtYXJraW5nICovCisjZGVmaW5lIF8oU3RyaW5nKSBkZ2V0dGV4dCAoR0VUVEVYVF9QQUNLQUdFLCBTdHJpbmcpCisjZGVmaW5lIE5fKFN0cmluZykgZ2V0dGV4dF9ub29wIChTdHJpbmcpCisvKiBGSVhNRTogaWYgd2UgbmVlZCBpdCwgd2UgY2FuIGFkZCBRXyBhcyB3ZWxsLCBsaWtlIGluIGdsaWIgKi8KKworI2Vsc2UKKyNkZWZpbmUgXyhTdHJpbmcpIFN0cmluZworI2RlZmluZSBOXyhTdHJpbmcpIFN0cmluZworI2RlZmluZSBuZ2V0dGV4dChTaW5ndWxhcixQbHVyYWwsQ291bnQpICgoQ291bnQ+MSk/UGx1cmFsOlNpbmd1bGFyKQorCisjZW5kaWYKKworI2VuZGlmIC8qIF9fR1NUX0kxOE5fUExVR0lOX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0LXBsdWdpbnMtZ29vZC5kb2FwIGIvZ3N0LXBsdWdpbnMtZ29vZC5kb2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYTcwZjEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QtcGx1Z2lucy1nb29kLmRvYXAKQEAgLTAsMCArMSw4MjYgQEAKKzxQcm9qZWN0CisgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKKyAgeG1sbnM6cmRmcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hIyIKKyAgeG1sbnM9Imh0dHA6Ly91c2VmdWxpbmMuY29tL25zL2RvYXAjIgorICB4bWxuczpmb2FmPSJodHRwOi8veG1sbnMuY29tL2ZvYWYvMC4xLyIKKyAgeG1sbnM6YWRtaW49Imh0dHA6Ly93ZWJucy5uZXQvbXZjYi8iPgorCisgPG5hbWU+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnM8L25hbWU+CisgPHNob3J0bmFtZT5nc3QtcGx1Z2lucy1nb29kPC9zaG9ydG5hbWU+CisgPGhvbWVwYWdlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvbW9kdWxlcy9nc3QtcGx1Z2lucy1nb29kLmh0bWwiIC8+CisgPGNyZWF0ZWQ+MjAwNS0wOS0wNjwvY3JlYXRlZD4KKyA8c2hvcnRkZXNjIHhtbDpsYW5nPSJlbiI+CithIHNldCBvZiBnb29kLXF1YWxpdHkgcGx1Zy1pbnMgdW5kZXIgb3VyIHByZWZlcnJlZCBsaWNlbnNlLCBMR1BMCis8L3Nob3J0ZGVzYz4KKyA8ZGVzY3JpcHRpb24geG1sOmxhbmc9ImVuIj4KK0dTdHJlYW1lciBHb29kIFBsdWctaW5zIGlzIGEgc2V0IG9mIHBsdWctaW5zIHRoYXQgd2UgY29uc2lkZXIgdG8gaGF2ZSBnb29kCitxdWFsaXR5IGNvZGUgYW5kIGNvcnJlY3QgZnVuY3Rpb25hbGl0eSwgdW5kZXIgb3VyIHByZWZlcnJlZCBsaWNlbnNlIChMR1BMIGZvcgordGhlIHBsdWctaW4gY29kZSwgTEdQTCBvciBMR1BMLWNvbXBhdGlibGUgZm9yIHRoZSBzdXBwb3J0aW5nIGxpYnJhcnkpLgorPC9kZXNjcmlwdGlvbj4KKyA8Y2F0ZWdvcnk+PC9jYXRlZ29yeT4KKyA8YnVnLWRhdGFiYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9lbnRlcl9idWcuY2dpP3Byb2R1Y3Q9R1N0cmVhbWVyJmFtcDtjb21wb25lbnQ9Z3N0LXBsdWdpbnMtZ29vZCIgLz4KKyA8c2NyZWVuc2hvdHM+PC9zY3JlZW5zaG90cz4KKyA8bWFpbGluZy1saXN0IHJkZjpyZXNvdXJjZT0iaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2dzdHJlYW1lci1kZXZlbCIgLz4KKyA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+QzwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgPGxpY2Vuc2UgcmRmOnJlc291cmNlPSJodHRwOi8vdXNlZnVsaW5jLmNvbS9kb2FwL2xpY2Vuc2VzL2xncGwiLz4KKyA8ZG93bmxvYWQtcGFnZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2Rvd25sb2FkLyIgLz4KKworIDxyZXBvc2l0b3J5PgorICAgPEdpdFJlcG9zaXRvcnk+CisgICAgIDxsb2NhdGlvbiByZGY6cmVzb3VyY2U9ImdpdDovL2Fub25naXQuZnJlZWRlc2t0b3Aub3JnL2dzdHJlYW1lci9nc3QtcGx1Z2lucy1nb29kIi8+CisgICAgIDxicm93c2UgcmRmOnJlc291cmNlPSJodHRwOi8vY2dpdC5mcmVlZGVza3RvcC5vcmcvZ3N0cmVhbWVyL2dzdC1wbHVnaW5zLWdvb2QiLz4KKyAgIDwvR2l0UmVwb3NpdG9yeT4KKyA8L3JlcG9zaXRvcnk+IAorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuMTIuMDwvcmV2aXNpb24+CisgICA8YnJhbmNoPm1hc3RlcjwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxNy0wNS0wNDwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuMTIuMC50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS4xMS45MTwvcmV2aXNpb24+CisgICA8YnJhbmNoPm1hc3RlcjwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxNy0wNC0yNzwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuMTEuOTEudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuMTEuOTA8L3JldmlzaW9uPgorICAgPGJyYW5jaD5tYXN0ZXI8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTctMDQtMDc8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjExLjkwLnRhci54eiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4xLjExLjI8L3JldmlzaW9uPgorICAgPGJyYW5jaD5tYXN0ZXI8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTctMDItMjQ8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjExLjIudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuMTEuMTwvcmV2aXNpb24+CisgICA8YnJhbmNoPm1hc3RlcjwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxNy0wMS0xMjwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuMTEuMS50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS4xMC4wPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+bWFzdGVyPC9icmFuY2g+CisgICA8bmFtZT48L25hbWU+CisgICA8Y3JlYXRlZD4yMDE2LTExLTAxPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMS4xMC4wLnRhci54eiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4xLjkuOTA8L3JldmlzaW9uPgorICAgPGJyYW5jaD5tYXN0ZXI8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTYtMDktMzA8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjkuOTAudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuOS4yPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+bWFzdGVyPC9icmFuY2g+CisgICA8bmFtZT48L25hbWU+CisgICA8Y3JlYXRlZD4yMDE2LTA5LTAxPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMS45LjIudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuOS4xPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+bWFzdGVyPC9icmFuY2g+CisgICA8bmFtZT48L25hbWU+CisgICA8Y3JlYXRlZD4yMDE2LTA2LTA2PC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMS45LjEudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuOC4wPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+bWFzdGVyPC9icmFuY2g+CisgICA8bmFtZT48L25hbWU+CisgICA8Y3JlYXRlZD4yMDE2LTAzLTI0PC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMS44LjAudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuNy45MTwvcmV2aXNpb24+CisgICA8YnJhbmNoPm1hc3RlcjwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxNi0wMy0xNTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuNy45MS50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS43LjkwPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+bWFzdGVyPC9icmFuY2g+CisgICA8bmFtZT48L25hbWU+CisgICA8Y3JlYXRlZD4yMDE2LTAzLTAxPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMS43LjkwLnRhci54eiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4xLjcuMjwvcmV2aXNpb24+CisgICA8YnJhbmNoPm1hc3RlcjwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxNi0wMi0xOTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuNy4yLnRhci54eiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4xLjcuMTwvcmV2aXNpb24+CisgICA8YnJhbmNoPm1hc3RlcjwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxNS0xMi0yNDwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuNy4xLnRhci54eiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4xLjYuMjwvcmV2aXNpb24+CisgICA8YnJhbmNoPjEuNjwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxNS0xMi0xNDwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuNi4yLnRhci54eiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4xLjYuMTwvcmV2aXNpb24+CisgICA8YnJhbmNoPjEuNjwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxNS0xMC0zMDwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuNi4xLnRhci54eiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4xLjYuMDwvcmV2aXNpb24+CisgICA8YnJhbmNoPjEuNjwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxNS0wOS0yNTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuNi4wLnRhci54eiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4xLjUuOTE8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjU8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTUtMDktMTg8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjUuOTEudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuNS45MDwvcmV2aXNpb24+CisgICA8YnJhbmNoPjEuNTwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxNS0wOC0xOTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuNS45MC50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS41LjI8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjU8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTUtMDYtMjQ8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjUuMi50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS41LjE8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjU8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTUtMDYtMDc8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjUuMS50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS40LjA8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjQ8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTQtMDctMTk8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjQuMC50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS4zLjkxPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MS4zPC9icmFuY2g+CisgICA8bmFtZT48L25hbWU+CisgICA8Y3JlYXRlZD4yMDE0LTA3LTExPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMS4zLjkxLnRhci54eiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4xLjMuOTA8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjM8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTQtMDYtMjg8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjMuOTAudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuMy4zPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MS4zPC9icmFuY2g+CisgICA8bmFtZT48L25hbWU+CisgICA8Y3JlYXRlZD4yMDE0LTA2LTIyPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMS4zLjMudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuMy4yPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MS4zPC9icmFuY2g+CisgICA8bmFtZT48L25hbWU+CisgICA8Y3JlYXRlZD4yMDE0LTA1LTIxPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMS4zLjIudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuMy4xPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MS4zPC9icmFuY2g+CisgICA8bmFtZT48L25hbWU+CisgICA8Y3JlYXRlZD4yMDE0LTA1LTAzPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMS4zLjEudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuMi4wPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MS4yPC9icmFuY2g+CisgICA8bmFtZT48L25hbWU+CisgICA8Y3JlYXRlZD4yMDEzLTA5LTI0PC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMS4yLjAudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuMS45MDwvcmV2aXNpb24+CisgICA8YnJhbmNoPjEuMTwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMy0wOS0xOTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuMS45MC50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS4xLjQ8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjE8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTMtMDgtMjg8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjEuNC50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS4xLjM8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjE8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTMtMDctMjk8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjEuMy50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS4xLjI8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjE8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTMtMDctMTE8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjEuMi50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS4xLjE8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjE8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTMtMDYtMDU8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjEuMS50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS4wLjI8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjA8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTItMTAtMjQ8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjAuMi50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS4wLjE8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjA8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTItMTAtMDc8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjAuMS50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS4wLjA8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjA8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTItMDktMjQ8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjAuMC50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMS45OTwvcmV2aXNpb24+CisgICA8YnJhbmNoPjAuMTE8L2JyYW5jaD4KKyAgIDxuYW1lPkJlZW4gQXJvdW5kIGZvciBhIExvbmcgTG9uZyBZZWFyPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMi0wOS0xNzwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTEuOTkudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTEuOTQ8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjExPC9icmFuY2g+CisgICA8bmFtZT5CZWF0aWZ1bCBUYW5nbzwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTItMDktMTQ8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjExLjk0LnRhci54eiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjExLjkzPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMTwvYnJhbmNoPgorICAgPG5hbWU+UG9ldGljIFBpdGJ1bGwgUmV2b2x1dGlvbnM8L25hbWU+CisgICA8Y3JlYXRlZD4yMDEyLTA4LTA4PC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMS45My50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMS45MjwvcmV2aXNpb24+CisgICA8YnJhbmNoPjAuMTE8L2JyYW5jaD4KKyAgIDxuYW1lPk1vbmV5PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMi0wNi0wNzwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTEuOTIudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTEuOTE8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjExPC9icmFuY2g+CisgICA8bmFtZT5JIHNtZWxsIHRoZSBibG9vZCBvZiBhbiBFbmdsaXNobWFuPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMi0wNS0xMzwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTEuOTEudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTEuOTA8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjExPC9icmFuY2g+CisgICA8bmFtZT5Gcm9tIGdyaWVmIGFuZCBtb2FuIHRvIGEgZ29sZCB0aHJvbmU8L25hbWU+CisgICA8Y3JlYXRlZD4yMDEyLTA0LTEyPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMS45MC50YXIuYnoyIiAvPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMS45MC50YXIuZ3oiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMS4yPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMTwvYnJhbmNoPgorICAgPG5hbWU+Uml0ZSBvZiBEZXZhc3RhdGlvbjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTItMDMtMjI8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjExLjIudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTEuMi50YXIuZ3oiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMS4xPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMTwvYnJhbmNoPgorICAgPG5hbWU+VGhlIExlcGVyIEFmZmluaXR5PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMi0wMi0xNjwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTEuMS50YXIuYnoyIiAvPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMS4xLnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjMwPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+QWRhZ2lvPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMS0wNi0xNTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMzAudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMzAudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMjk8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5Tb2Z0IENoZWVzZSBFbnRodXNpYXN0PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMS0wNS0xMDwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMjkudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMjkudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMjg8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5JbmNvbnZlbmllbmNlZCBieSB0aGUgU29sYXIgU3lzdGVtPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMS0wMy0wODwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMjgudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMjgudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMjc8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5Tb21lIEtpbmQgb2YgVGVtcG9yYWwgQmxlbmQ8L25hbWU+CisgICA8Y3JlYXRlZD4yMDExLTAxLTIxPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC4yNy50YXIuYnoyIiAvPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC4yNy50YXIuZ3oiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMC4yNjwvcmV2aXNpb24+CisgICA8YnJhbmNoPjAuMTA8L2JyYW5jaD4KKyAgIDxuYW1lPkVzY2FwYWRlczwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTAtMTItMDE8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjI2LnRhci5iejIiIC8+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjI2LnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjI1PC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+V29lIHRvIFlvdSBPaCBFYXJ0aCBhbmQgU2VhPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMC0wOS0wMjwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMjUudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMjUudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMjQ8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5UYWtpbmcgTGliZXJ0aWVzPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMC0wNy0xNTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMjQudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMjQudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMjM8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5TdHlsaXNoIEtpZHMgaW4gUmlvdDwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTAtMDUtMzA8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjIzLnRhci5iejIiIC8+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjIzLnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjIyPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+U3F1YXJlIE9uZTwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTAtMDQtMjc8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjIyLnRhci5iejIiIC8+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjIyLnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjIxPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+TGVtb25zPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMC0wMy0wODwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMjEudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMjEudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMjA8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5MZW1vbmFkZTwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTAtMDMtMDg8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjIwLnRhci5iejIiIC8+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjIwLnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjE5PC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+Q2xvc2VyIHRvIHRoZSBFZGl0PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMC0wMy0wNjwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMTkudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMTkudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMTg8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5TaG9ydCBDaXJjdWl0PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMC0wMi0xMDwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMTgudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMTgudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMTc8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5UaGV5IHVzZWQgdG8gc3BhcmtsZTwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMDktMTEtMTc8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjE3LnRhci5iejIiIC8+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjE3LnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjE2PC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+U2VjcmV0IEhhbmRzaGFrZXM8L25hbWU+CisgICA8Y3JlYXRlZD4yMDA5LTA4LTI4PC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC4xNi50YXIuYnoyIiAvPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC4xNi50YXIuZ3oiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMC4xNTwvcmV2aXNpb24+CisgICA8YnJhbmNoPjAuMTA8L2JyYW5jaD4KKyAgIDxuYW1lPkkndmUgYmVlbiB1cCBhbGwgbmlnaHQ8L25hbWU+CisgICA8Y3JlYXRlZD4yMDA5LTA1LTIwPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC4xNS50YXIuYnoyIiAvPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC4xNS50YXIuZ3oiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMC4xNDwvcmV2aXNpb24+CisgICA8YnJhbmNoPjAuMTA8L2JyYW5jaD4KKyAgIDxuYW1lPkRpc2FmZmVjdGVkIEFmZmVjdGF0aW9uPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAwOS0wMi0xOTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMTQudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMTQudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMTM8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5CbGF0YW50IERpc2NvdXJhZ2VtZW50PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAwOS0wMS0yMjwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMTMudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMTMudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMTI8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5UYWtlbiBVbmRlciBBZHZpc2VtZW50PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAwOS0wMS0yMjwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMTIudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMTIudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMTE8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5TZWNvbmRhcnkgQ29uc2lkZXJhdGlvbjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMDgtMTAtMjQ8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjExLnRhci5iejIiIC8+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjExLnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjEwPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+QmFyZWx5IE1vdmluZzwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMDgtMDgtMjY8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjEwLnRhci5iejIiIC8+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjEwLnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjk8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5TdGVhbSBUcmFpbiBSb2xsaW5nPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAwOC0wNy0zMTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuOS50YXIuYnoyIiAvPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC45LnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjg8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5PbmUgRm9yIFRoZSBNb25leTwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMDgtMDQtMjQ8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjgudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuOC50YXIuZ3oiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMC43PC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+UmVkIERvb3IgQmxhY2s8L25hbWU+CisgICA8Y3JlYXRlZD4yMDA4LTAxLTIwPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC43LnRhci5iejIiIC8+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjcudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuNjwvcmV2aXNpb24+CisgICA8YnJhbmNoPjAuMTA8L2JyYW5jaD4KKyAgIDxuYW1lPldvYmJsZSBCb2FyZDwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMDctMDYtMTk8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjYudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuNi50YXIuZ3oiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMC41PC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+VGhlIFBhdGggb2YgVGhvcm5zPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAwNi0xMi0yMTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuNS50YXIuYnoyIiAvPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC41LnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjQ8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5EZWFyIExlYWRlcjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMDYtMDgtMTQ8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjQudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuNC50YXIuZ3oiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMC4zPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+RGVzcGxhemFkbzwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMDYtMDUtMDQ8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjMudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMy50YXIuZ3oiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMC4yPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+UGFwYSB3YXMgYSByb2xsaW5nIHN0b25lPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAwNi0wMi0wOTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMi50YXIuYnoyIiAvPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC4yLnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjE8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5MaTwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMDYtMDEtMTM8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjEudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMS50YXIuZ3oiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMC4wPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+QWJvbmRhbmNlPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAwNS0xMi0wNTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMC50YXIuYnoyIiAvPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC4wLnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxtYWludGFpbmVyPgorICA8Zm9hZjpQZXJzb24+CisgICAgIDxmb2FmOm5hbWU+V2ltIFRheW1hbnM8L2ZvYWY6bmFtZT4KKyAgICAgPGZvYWY6bWJveF9zaGExc3VtPjBkOTNmZGUwNTI4MTJkNTFhMDVmZDg2ZGU5YmRiZjY3NDQyM2RhYTI8L2ZvYWY6bWJveF9zaGExc3VtPgorICA8L2ZvYWY6UGVyc29uPgorIDwvbWFpbnRhaW5lcj4KKworPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZ3N0L01ha2VmaWxlLmFtIGIvZ3N0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNWE1NmQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0IEBACitTVUJESVJTID0gJChHU1RfUExVR0lOU19TRUxFQ1RFRCkKK0RJU1RfU1VCRElSUyA9ICQoR1NUX1BMVUdJTlNfQUxMKQorCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29tbW9uL3BhcmFsbGVsLXN1YmRpcnMubWFrCmRpZmYgLS1naXQgYS9nc3QvYWxwaGEvTWFrZWZpbGUuYW0gYi9nc3QvYWxwaGEvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMxMjNkZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hbHBoYS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE3IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RhbHBoYS5sYSBsaWJnc3RhbHBoYWNvbG9yLmxhCisKK2xpYmdzdGFscGhhX2xhX1NPVVJDRVMgPSBnc3RhbHBoYS5jCitsaWJnc3RhbHBoYV9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdGFscGhhX2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHZpZGVvLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKExJQk0pCitsaWJnc3RhbHBoYV9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK2xpYmdzdGFscGhhY29sb3JfbGFfU09VUkNFUyA9IGdzdGFscGhhY29sb3IuYworbGliZ3N0YWxwaGFjb2xvcl9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdGFscGhhY29sb3JfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0dmlkZW8tJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpCitsaWJnc3RhbHBoYWNvbG9yX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3RhbHBoYS5oIGdzdGFscGhhY29sb3IuaApkaWZmIC0tZ2l0IGEvZ3N0L2FscGhhL2dzdGFscGhhLmMgYi9nc3QvYWxwaGEvZ3N0YWxwaGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmFkOTgxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2FscGhhL2dzdGFscGhhLmMKQEAgLTAsMCArMSwyNjEzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYWxwaGEKKyAqIAorICogVGhlIGFscGhhIGVsZW1lbnQgYWRkcyBhbiBhbHBoYSBjaGFubmVsIHRvIGEgdmlkZW8gc3RyZWFtLiBUaGUgdmFsdWVzCisgKiBvZiB0aGUgYWxwaGEgY2hhbm5lbCBjYW4gYmUgZWl0aGVyIGJlIHNldCB0byBhIGNvbnN0YW50IG9yIGNhbiBiZQorICogZHluYW1pY2FsbHkgY2FsY3VsYXRlZCB2aWEgY2hyb21hIGtleWluZywgZS5nLiBibHVlIGNhbiBiZSBzZXQgYXMKKyAqIHRoZSB0cmFuc3BhcmVudCBjb2xvci4KKyAqCisgKiBTYW1wbGUgcGlwZWxpbmU6CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdmlkZW90ZXN0c3JjIHBhdHRlcm49c25vdyAhIG1peGVyLnNpbmtfMCBcCisgKiAgIHZpZGVvdGVzdHNyYyBwYXR0ZXJuPXNtcHRlNzUgISBhbHBoYSBtZXRob2Q9Z3JlZW4gISBtaXhlci5zaW5rXzEgXAorICogICB2aWRlb21peGVyIG5hbWU9bWl4ZXIgc2lua18wOjp6b3JkZXI9MCBzaW5rXzE6OnpvcmRlcj0xICEgXAorICogICB2aWRlb2NvbnZlcnQgISBhdXRvdmlkZW9zaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIGFkZHMgYSBhbHBoYSBjaGFubmVsIHRvIHRoZSBTTVBURSBjb2xvciBiYXJzCisgKiB3aXRoIGdyZWVuIGFzIHRoZSB0cmFuc3BhcmVudCBjb2xvciBhbmQgb3ZlcmxheXMgdGhlIG91dHB1dCBvbgorICogdG9wIG9mIGEgc25vdyB2aWRlbyBzdHJlYW0uCisgKi8KKworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RhbHBoYS5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaWZuZGVmIE1fUEkKKyNkZWZpbmUgTV9QSSAgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgorI2VuZGlmCisKKy8qIEdlbmVyYXRlZCBieSAtYmFkL2V4dC9jb2cvZ2VuZXJhdGVfdGFibGVzICovCitzdGF0aWMgY29uc3QgaW50IGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfaGR0dltdID0geworICAyOTgsIDAsIDQ1OSwgLTYzNTE0LAorICAyOTgsIC01NSwgLTEzNiwgMTk2ODEsCisgIDI5OCwgNTQxLCAwLCAtNzM5ODgsCit9OworCitzdGF0aWMgY29uc3QgaW50IGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfc2R0dltdID0geworICAyOTgsIDAsIDQwOSwgLTU3MDY4LAorICAyOTgsIC0xMDAsIC0yMDgsIDM0NzA3LAorICAyOTgsIDUxNiwgMCwgLTcwODcwLAorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9oZHR2W10gPSB7CisgIDQ3LCAxNTcsIDE2LCA0MDk2LAorICAtMjYsIC04NywgMTEyLCAzMjc2OCwKKyAgMTEyLCAtMTAyLCAtMTAsIDMyNzY4LAorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9zZHR2W10gPSB7CisgIDY2LCAxMjksIDI1LCA0MDk2LAorICAtMzgsIC03NCwgMTEyLCAzMjc2OCwKKyAgMTEyLCAtOTQsIC0xOCwgMzI3NjgsCit9OworCitzdGF0aWMgY29uc3QgZ2ludCBjb2dfeWNiY3Jfc2R0dl90b195Y2Jjcl9oZHR2X21hdHJpeF84Yml0W10gPSB7CisgIDI1NiwgLTMwLCAtNTMsIDEwNjAwLAorICAwLCAyNjEsIDI5LCAtNDM2NywKKyAgMCwgMTksIDI2MiwgLTMyODksCit9OworCitzdGF0aWMgY29uc3QgZ2ludCBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0W10gPSB7CisgIDI1NiwgMjUsIDQ5LCAtOTUzNiwKKyAgMCwgMjUzLCAtMjgsIDM5NTgsCisgIDAsIC0xOSwgMjUyLCAyOTE4LAorfTsKKworLyogQWxwaGEgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCisjZGVmaW5lIERFRkFVTFRfTUVUSE9EIEFMUEhBX01FVEhPRF9TRVQKKyNkZWZpbmUgREVGQVVMVF9BTFBIQSAxLjAKKyNkZWZpbmUgREVGQVVMVF9UQVJHRVRfUiAwCisjZGVmaW5lIERFRkFVTFRfVEFSR0VUX0cgMjU1CisjZGVmaW5lIERFRkFVTFRfVEFSR0VUX0IgMAorI2RlZmluZSBERUZBVUxUX0FOR0xFIDIwLjAKKyNkZWZpbmUgREVGQVVMVF9OT0lTRV9MRVZFTCAyLjAKKyNkZWZpbmUgREVGQVVMVF9CTEFDS19TRU5TSVRJVklUWSAxMDAKKyNkZWZpbmUgREVGQVVMVF9XSElURV9TRU5TSVRJVklUWSAxMDAKKyNkZWZpbmUgREVGQVVMVF9QUkVGRVJfUEFTU1RIUk9VR0ggRkFMU0UKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTUVUSE9ELAorICBQUk9QX0FMUEhBLAorICBQUk9QX1RBUkdFVF9SLAorICBQUk9QX1RBUkdFVF9HLAorICBQUk9QX1RBUkdFVF9CLAorICBQUk9QX0FOR0xFLAorICBQUk9QX05PSVNFX0xFVkVMLAorICBQUk9QX0JMQUNLX1NFTlNJVElWSVRZLAorICBQUk9QX1dISVRFX1NFTlNJVElWSVRZLAorICBQUk9QX1BSRUZFUl9QQVNTVEhST1VHSAorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9hbHBoYV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgQVlVViwgIgorICAgICAgICAgICAgIkFSR0IsIEJHUkEsIEFCR1IsIFJHQkEsIFk0NDQsIHhSR0IsIEJHUngsIHhCR1IsICIKKyAgICAgICAgICAgICJSR0J4LCBSR0IsIEJHUiwgWTQyQiwgWVVZMiwgWVZZVSwgVVlWWSwgSTQyMCwgWVYxMiwgWTQxQiB9ICIpKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfYWxwaGFfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IEFZVVYsICIKKyAgICAgICAgICAgICJBUkdCLCBCR1JBLCBBQkdSLCBSR0JBLCBZNDQ0LCB4UkdCLCBCR1J4LCB4QkdSLCAiCisgICAgICAgICAgICAiUkdCeCwgUkdCLCBCR1IsIFk0MkIsIFlVWTIsIFlWWVUsIFVZVlksIEk0MjAsIFlWMTIsICIgIlk0MUIgfSAiKSkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljQ2FwcyBnc3RfYWxwaGFfYWxwaGFfY2FwcyA9CitHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IEFZVVYsIEFSR0IsIEJHUkEsIEFCR1IsIFJHQkEgfSIpKTsKKworLyogRklYTUU6IHdoeSBkbyB3ZSBuZWVkIG91ciBvd24gbG9jayBmb3IgdGhpcz8gKi8KKyNkZWZpbmUgR1NUX0FMUEhBX0xPQ0soYWxwaGEpIEdfU1RNVF9TVEFSVCB7IFwKKyAgR1NUX0xPR19PQkpFQ1QgKGFscGhhLCAiTG9ja2luZyBhbHBoYSBmcm9tIHRocmVhZCAlcCIsIGdfdGhyZWFkX3NlbGYgKCkpOyBcCisgIGdfbXV0ZXhfbG9jayAoJmFscGhhLT5sb2NrKTsgXAorICBHU1RfTE9HX09CSkVDVCAoYWxwaGEsICJMb2NrZWQgYWxwaGEgZnJvbSB0aHJlYWQgJXAiLCBnX3RocmVhZF9zZWxmICgpKTsgXAorfSBHX1NUTVRfRU5ECisKKyNkZWZpbmUgR1NUX0FMUEhBX1VOTE9DSyhhbHBoYSkgR19TVE1UX1NUQVJUIHsgXAorICBHU1RfTE9HX09CSkVDVCAoYWxwaGEsICJVbmxvY2tpbmcgYWxwaGEgZnJvbSB0aHJlYWQgJXAiLCBnX3RocmVhZF9zZWxmICgpKTsgXAorICBnX211dGV4X3VubG9jayAoJmFscGhhLT5sb2NrKTsgXAorfSBHX1NUTVRfRU5ECisKK3N0YXRpYyBHc3RDYXBzICpnc3RfYWxwaGFfdHJhbnNmb3JtX2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiBidHJhbnMsCisgICAgR3N0UGFkRGlyZWN0aW9uIGRpcmVjdGlvbiwgR3N0Q2FwcyAqIGNhcHMsIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIHZvaWQgZ3N0X2FscGhhX2JlZm9yZV90cmFuc2Zvcm0gKEdzdEJhc2VUcmFuc2Zvcm0gKiBidHJhbnMsCisgICAgR3N0QnVmZmVyICogYnVmKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hbHBoYV9zZXRfaW5mbyAoR3N0VmlkZW9GaWx0ZXIgKiBmaWx0ZXIsCisgICAgR3N0Q2FwcyAqIGluY2FwcywgR3N0VmlkZW9JbmZvICogaW5faW5mbywgR3N0Q2FwcyAqIG91dGNhcHMsCisgICAgR3N0VmlkZW9JbmZvICogb3V0X2luZm8pOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2FscGhhX3RyYW5zZm9ybV9mcmFtZSAoR3N0VmlkZW9GaWx0ZXIgKiBmaWx0ZXIsCisgICAgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLCBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lKTsKKworc3RhdGljIHZvaWQgZ3N0X2FscGhhX2luaXRfcGFyYW1zX2Z1bGwgKEdzdEFscGhhICogYWxwaGEsCisgICAgY29uc3QgR3N0VmlkZW9Gb3JtYXRJbmZvICogaW5faW5mbywgY29uc3QgR3N0VmlkZW9Gb3JtYXRJbmZvICogb3V0X2luZm8pOworc3RhdGljIHZvaWQgZ3N0X2FscGhhX2luaXRfcGFyYW1zIChHc3RBbHBoYSAqIGFscGhhKTsKK3N0YXRpYyB2b2lkIGdzdF9hbHBoYV9zZXRfcHJvY2Vzc19mdW5jdGlvbiAoR3N0QWxwaGEgKiBhbHBoYSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2FscGhhX3NldF9wcm9jZXNzX2Z1bmN0aW9uX2Z1bGwgKEdzdEFscGhhICogYWxwaGEsCisgICAgR3N0VmlkZW9JbmZvICogaW5faW5mbywgR3N0VmlkZW9JbmZvICogb3V0X2luZm8pOworCitzdGF0aWMgdm9pZCBnc3RfYWxwaGFfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2FscGhhX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hbHBoYV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKKyNkZWZpbmUgZ3N0X2FscGhhX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdEFscGhhLCBnc3RfYWxwaGEsIEdTVF9UWVBFX1ZJREVPX0ZJTFRFUik7CisKKyNkZWZpbmUgR1NUX1RZUEVfQUxQSEFfTUVUSE9EIChnc3RfYWxwaGFfbWV0aG9kX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9hbHBoYV9tZXRob2RfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBhbHBoYV9tZXRob2RfdHlwZSA9IDA7CisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIGFscGhhX21ldGhvZFtdID0geworICAgIHtBTFBIQV9NRVRIT0RfU0VULCAiU2V0L2FkanVzdCBhbHBoYSBjaGFubmVsIiwgInNldCJ9LAorICAgIHtBTFBIQV9NRVRIT0RfR1JFRU4sICJDaHJvbWEgS2V5IG9uIHB1cmUgZ3JlZW4iLCAiZ3JlZW4ifSwKKyAgICB7QUxQSEFfTUVUSE9EX0JMVUUsICJDaHJvbWEgS2V5IG9uIHB1cmUgYmx1ZSIsICJibHVlIn0sCisgICAge0FMUEhBX01FVEhPRF9DVVNUT00sICJDaHJvbWEgS2V5IG9uIGN1c3RvbSBSR0IgdmFsdWVzIiwgImN1c3RvbSJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIWFscGhhX21ldGhvZF90eXBlKSB7CisgICAgYWxwaGFfbWV0aG9kX3R5cGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0QWxwaGFNZXRob2QiLCBhbHBoYV9tZXRob2QpOworICB9CisgIHJldHVybiBhbHBoYV9tZXRob2RfdHlwZTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9jbGFzc19pbml0IChHc3RBbHBoYUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqYnRyYW5zX2NsYXNzID0gKEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqKSBrbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzcyA9IChHc3RWaWRlb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfYWxwaGFfZGVidWcsICJhbHBoYSIsIDAsCisgICAgICAiYWxwaGEgLSBFbGVtZW50IGZvciBhZGRpbmcgYWxwaGEgY2hhbm5lbCB0byBzdHJlYW1zIik7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2FscGhhX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2FscGhhX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfYWxwaGFfZmluYWxpemU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9NRVRIT0QsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoIm1ldGhvZCIsICJNZXRob2QiLAorICAgICAgICAgICJIb3cgdGhlIGFscGhhIGNoYW5uZWxzIHNob3VsZCBiZSBjcmVhdGVkIiwgR1NUX1RZUEVfQUxQSEFfTUVUSE9ELAorICAgICAgICAgIERFRkFVTFRfTUVUSE9ELCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9BTFBIQSwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJhbHBoYSIsICJBbHBoYSIsICJUaGUgdmFsdWUgZm9yIHRoZSBhbHBoYSBjaGFubmVsIiwKKyAgICAgICAgICAwLjAsIDEuMCwgREVGQVVMVF9BTFBIQSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfVEFSR0VUX1IsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInRhcmdldC1yIiwgIlRhcmdldCBSZWQiLAorICAgICAgICAgICJUaGUgcmVkIGNvbG9yIHZhbHVlIGZvciBjdXN0b20gUkdCIGNocm9tYSBrZXlpbmciLCAwLCAyNTUsCisgICAgICAgICAgREVGQVVMVF9UQVJHRVRfUiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfVEFSR0VUX0csCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInRhcmdldC1nIiwgIlRhcmdldCBHcmVlbiIsCisgICAgICAgICAgIlRoZSBncmVlbiBjb2xvciB2YWx1ZSBmb3IgY3VzdG9tIFJHQiBjaHJvbWEga2V5aW5nIiwgMCwgMjU1LAorICAgICAgICAgIERFRkFVTFRfVEFSR0VUX0csCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1RBUkdFVF9CLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJ0YXJnZXQtYiIsICJUYXJnZXQgQmx1ZSIsCisgICAgICAgICAgIlRoZSBibHVlIGNvbG9yIHZhbHVlIGZvciBjdXN0b20gUkdCIGNocm9tYSBrZXlpbmciLCAwLCAyNTUsCisgICAgICAgICAgREVGQVVMVF9UQVJHRVRfQiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQU5HTEUsCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJhbmdsZSIsICJBbmdsZSIsICJTaXplIG9mIHRoZSBjb2xvcmN1YmUgdG8gY2hhbmdlIiwKKyAgICAgICAgICAwLjAsIDkwLjAsIERFRkFVTFRfQU5HTEUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX05PSVNFX0xFVkVMLAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgibm9pc2UtbGV2ZWwiLCAiTm9pc2UgTGV2ZWwiLCAiU2l6ZSBvZiBub2lzZSByYWRpdXMiLAorICAgICAgICAgIDAuMCwgNjQuMCwgREVGQVVMVF9OT0lTRV9MRVZFTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksCisgICAgICBQUk9QX0JMQUNLX1NFTlNJVElWSVRZLCBnX3BhcmFtX3NwZWNfdWludCAoImJsYWNrLXNlbnNpdGl2aXR5IiwKKyAgICAgICAgICAiQmxhY2sgU2Vuc2l0aXZpdHkiLCAiU2Vuc2l0aXZpdHkgdG8gZGFyayBjb2xvcnMiLCAwLCAxMjgsCisgICAgICAgICAgREVGQVVMVF9CTEFDS19TRU5TSVRJVklUWSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksCisgICAgICBQUk9QX1dISVRFX1NFTlNJVElWSVRZLCBnX3BhcmFtX3NwZWNfdWludCAoIndoaXRlLXNlbnNpdGl2aXR5IiwKKyAgICAgICAgICAiV2hpdGUgU2Vuc2l0aXZpdHkiLCAiU2Vuc2l0aXZpdHkgdG8gYnJpZ2h0IGNvbG9ycyIsIDAsIDEyOCwKKyAgICAgICAgICBERUZBVUxUX1dISVRFX1NFTlNJVElWSVRZLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIFBST1BfUFJFRkVSX1BBU1NUSFJPVUdILCBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInByZWZlci1wYXNzdGhyb3VnaCIsCisgICAgICAgICAgIlByZWZlciBQYXNzdGhyb3VnaCIsCisgICAgICAgICAgIkRvbid0IGRvIGFueSBwcm9jZXNzaW5nIGZvciBhbHBoYT0xLjAgaWYgcG9zc2libGUiLAorICAgICAgICAgIERFRkFVTFRfUFJFRkVSX1BBU1NUSFJPVUdILAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiQWxwaGEgZmlsdGVyIiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1ZpZGVvIiwKKyAgICAgICJBZGRzIGFuIGFscGhhIGNoYW5uZWwgdG8gdmlkZW8gLSB1bmlmb3JtIG9yIHZpYSBjaHJvbWEta2V5aW5nIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPlxuIgorICAgICAgIkVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPlxuIgorICAgICAgIkphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfYWxwaGFfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9hbHBoYV9zcmNfdGVtcGxhdGUpOworCisgIGJ0cmFuc19jbGFzcy0+YmVmb3JlX3RyYW5zZm9ybSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FscGhhX2JlZm9yZV90cmFuc2Zvcm0pOworICBidHJhbnNfY2xhc3MtPnRyYW5zZm9ybV9jYXBzID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hbHBoYV90cmFuc2Zvcm1fY2Fwcyk7CisKKyAgdmZpbHRlcl9jbGFzcy0+c2V0X2luZm8gPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FscGhhX3NldF9pbmZvKTsKKyAgdmZpbHRlcl9jbGFzcy0+dHJhbnNmb3JtX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWxwaGFfdHJhbnNmb3JtX2ZyYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9pbml0IChHc3RBbHBoYSAqIGFscGhhKQoreworICBhbHBoYS0+YWxwaGEgPSBERUZBVUxUX0FMUEhBOworICBhbHBoYS0+bWV0aG9kID0gREVGQVVMVF9NRVRIT0Q7CisgIGFscGhhLT50YXJnZXRfciA9IERFRkFVTFRfVEFSR0VUX1I7CisgIGFscGhhLT50YXJnZXRfZyA9IERFRkFVTFRfVEFSR0VUX0c7CisgIGFscGhhLT50YXJnZXRfYiA9IERFRkFVTFRfVEFSR0VUX0I7CisgIGFscGhhLT5hbmdsZSA9IERFRkFVTFRfQU5HTEU7CisgIGFscGhhLT5ub2lzZV9sZXZlbCA9IERFRkFVTFRfTk9JU0VfTEVWRUw7CisgIGFscGhhLT5ibGFja19zZW5zaXRpdml0eSA9IERFRkFVTFRfQkxBQ0tfU0VOU0lUSVZJVFk7CisgIGFscGhhLT53aGl0ZV9zZW5zaXRpdml0eSA9IERFRkFVTFRfV0hJVEVfU0VOU0lUSVZJVFk7CisKKyAgZ19tdXRleF9pbml0ICgmYWxwaGEtPmxvY2spOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2FscGhhX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RBbHBoYSAqYWxwaGEgPSBHU1RfQUxQSEEgKG9iamVjdCk7CisKKyAgZ19tdXRleF9jbGVhciAoJmFscGhhLT5sb2NrKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYWxwaGFfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEFscGhhICphbHBoYSA9IEdTVF9BTFBIQSAob2JqZWN0KTsKKyAgZ2Jvb2xlYW4gcmVjb25maWd1cmUgPSBGQUxTRTsKKworICBHU1RfQUxQSEFfTE9DSyAoYWxwaGEpOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTUVUSE9EOnsKKyAgICAgIGdpbnQgbWV0aG9kID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworCisgICAgICByZWNvbmZpZ3VyZSA9IChtZXRob2QgIT0gYWxwaGEtPm1ldGhvZCkgJiYgKG1ldGhvZCA9PSBBTFBIQV9NRVRIT0RfU0VUCisgICAgICAgICAgfHwgYWxwaGEtPm1ldGhvZCA9PSBBTFBIQV9NRVRIT0RfU0VUKSAmJiAoYWxwaGEtPmFscGhhID09IDEuMCkKKyAgICAgICAgICAmJiAoYWxwaGEtPnByZWZlcl9wYXNzdGhyb3VnaCk7CisgICAgICBhbHBoYS0+bWV0aG9kID0gbWV0aG9kOworCisgICAgICBnc3RfYWxwaGFfc2V0X3Byb2Nlc3NfZnVuY3Rpb24gKGFscGhhKTsKKyAgICAgIGdzdF9hbHBoYV9pbml0X3BhcmFtcyAoYWxwaGEpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9BTFBIQTp7CisgICAgICBnZG91YmxlIGEgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKworICAgICAgcmVjb25maWd1cmUgPSAoYSAhPSBhbHBoYS0+YWxwaGEpICYmIChhID09IDEuMCB8fCBhbHBoYS0+YWxwaGEgPT0gMS4wKQorICAgICAgICAgICYmIChhbHBoYS0+bWV0aG9kID09IEFMUEhBX01FVEhPRF9TRVQpICYmIChhbHBoYS0+cHJlZmVyX3Bhc3N0aHJvdWdoKTsKKyAgICAgIGFscGhhLT5hbHBoYSA9IGE7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX1RBUkdFVF9SOgorICAgICAgYWxwaGEtPnRhcmdldF9yID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgZ3N0X2FscGhhX2luaXRfcGFyYW1zIChhbHBoYSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEFSR0VUX0c6CisgICAgICBhbHBoYS0+dGFyZ2V0X2cgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBnc3RfYWxwaGFfaW5pdF9wYXJhbXMgKGFscGhhKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UQVJHRVRfQjoKKyAgICAgIGFscGhhLT50YXJnZXRfYiA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGdzdF9hbHBoYV9pbml0X3BhcmFtcyAoYWxwaGEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FOR0xFOgorICAgICAgYWxwaGEtPmFuZ2xlID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIGdzdF9hbHBoYV9pbml0X3BhcmFtcyAoYWxwaGEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05PSVNFX0xFVkVMOgorICAgICAgYWxwaGEtPm5vaXNlX2xldmVsID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIGdzdF9hbHBoYV9pbml0X3BhcmFtcyAoYWxwaGEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JMQUNLX1NFTlNJVElWSVRZOgorICAgICAgYWxwaGEtPmJsYWNrX3NlbnNpdGl2aXR5ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1dISVRFX1NFTlNJVElWSVRZOgorICAgICAgYWxwaGEtPndoaXRlX3NlbnNpdGl2aXR5ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BSRUZFUl9QQVNTVEhST1VHSDp7CisgICAgICBnYm9vbGVhbiBwcmVmZXJfcGFzc3Rocm91Z2ggPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisKKyAgICAgIHJlY29uZmlndXJlID0gKCghICFwcmVmZXJfcGFzc3Rocm91Z2gpICE9ICghICFhbHBoYS0+cHJlZmVyX3Bhc3N0aHJvdWdoKSkKKyAgICAgICAgICAmJiAoYWxwaGEtPm1ldGhvZCA9PSBBTFBIQV9NRVRIT0RfU0VUKSAmJiAoYWxwaGEtPmFscGhhID09IDEuMCk7CisgICAgICBhbHBoYS0+cHJlZmVyX3Bhc3N0aHJvdWdoID0gcHJlZmVyX3Bhc3N0aHJvdWdoOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAocmVjb25maWd1cmUpCisgICAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3JlY29uZmlndXJlX3NyYyAoR1NUX0JBU0VfVFJBTlNGT1JNX0NBU1QgKGFscGhhKSk7CisKKyAgR1NUX0FMUEhBX1VOTE9DSyAoYWxwaGEpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2FscGhhX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBbHBoYSAqYWxwaGEgPSBHU1RfQUxQSEEgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01FVEhPRDoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBhbHBoYS0+bWV0aG9kKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9BTFBIQToKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIGFscGhhLT5hbHBoYSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEFSR0VUX1I6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgYWxwaGEtPnRhcmdldF9yKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UQVJHRVRfRzoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBhbHBoYS0+dGFyZ2V0X2cpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RBUkdFVF9COgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIGFscGhhLT50YXJnZXRfYik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQU5HTEU6CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIGFscGhhLT5hbmdsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTk9JU0VfTEVWRUw6CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIGFscGhhLT5ub2lzZV9sZXZlbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkxBQ0tfU0VOU0lUSVZJVFk6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgYWxwaGEtPmJsYWNrX3NlbnNpdGl2aXR5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9XSElURV9TRU5TSVRJVklUWToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBhbHBoYS0+d2hpdGVfc2Vuc2l0aXZpdHkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BSRUZFUl9QQVNTVEhST1VHSDoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBhbHBoYS0+cHJlZmVyX3Bhc3N0aHJvdWdoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X2FscGhhX3RyYW5zZm9ybV9jYXBzIChHc3RCYXNlVHJhbnNmb3JtICogYnRyYW5zLAorICAgIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdENhcHMgKiBjYXBzLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RBbHBoYSAqYWxwaGEgPSBHU1RfQUxQSEEgKGJ0cmFucyk7CisgIEdzdENhcHMgKnJldCwgKnRtcCwgKnRtcDI7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBnaW50IGk7CisKKyAgdG1wID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIEdTVF9BTFBIQV9MT0NLIChhbHBoYSk7CisgIGZvciAoaSA9IDA7IGkgPCBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7IGkrKykgeworICAgIHN0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfY29weSAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSkpOworCisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHN0cnVjdHVyZSwgImZvcm1hdCIpOworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzdHJ1Y3R1cmUsICJjb2xvcmltZXRyeSIpOworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzdHJ1Y3R1cmUsICJjaHJvbWEtc2l0ZSIpOworCisgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAodG1wLCBzdHJ1Y3R1cmUpOworICB9CisKKyAgaWYgKGRpcmVjdGlvbiA9PSBHU1RfUEFEX1NJTkspIHsKKyAgICB0bXAyID0gZ3N0X3N0YXRpY19jYXBzX2dldCAoJmdzdF9hbHBoYV9hbHBoYV9jYXBzKTsKKyAgICByZXQgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHRtcCwgdG1wMik7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHRtcCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHRtcDIpOworICAgIHRtcCA9IHJldDsKKyAgICByZXQgPSBOVUxMOworCisgICAgaWYgKGFscGhhLT5wcmVmZXJfcGFzc3Rocm91Z2ggJiYgYWxwaGEtPm1ldGhvZCA9PSBBTFBIQV9NRVRIT0RfU0VUCisgICAgICAgICYmIGFscGhhLT5hbHBoYSA9PSAxLjApIHsKKyAgICAgIHJldCA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworICAgICAgZ3N0X2NhcHNfYXBwZW5kIChyZXQsIHRtcCk7CisgICAgICB0bXAgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICByZXQgPSB0bXA7CisgICAgICB0bXAgPSBOVUxMOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXQgPSB0bXA7CisgICAgdG1wID0gTlVMTDsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGFscGhhLAorICAgICAgIlRyYW5zZm9ybWVkICUiIEdTVF9QVFJfRk9STUFUICIgLT4gJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMsIHJldCk7CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKmludGVyc2VjdGlvbjsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFscGhhLCAiVXNpbmcgZmlsdGVyIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIGZpbHRlcik7CisgICAgaW50ZXJzZWN0aW9uID0KKyAgICAgICAgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgcmV0LCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmIChyZXQpOworICAgIHJldCA9IGludGVyc2VjdGlvbjsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhbHBoYSwgIkludGVyc2VjdGlvbiAlIiBHU1RfUFRSX0ZPUk1BVCwgcmV0KTsKKyAgfQorCisKKyAgR1NUX0FMUEhBX1VOTE9DSyAoYWxwaGEpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FscGhhX3NldF9pbmZvIChHc3RWaWRlb0ZpbHRlciAqIGZpbHRlciwKKyAgICBHc3RDYXBzICogaW5jYXBzLCBHc3RWaWRlb0luZm8gKiBpbl9pbmZvLCBHc3RDYXBzICogb3V0Y2FwcywKKyAgICBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0QWxwaGEgKmFscGhhID0gR1NUX0FMUEhBIChmaWx0ZXIpOworICBnYm9vbGVhbiBwYXNzdGhyb3VnaDsKKworICBHU1RfQUxQSEFfTE9DSyAoYWxwaGEpOworCisgIGFscGhhLT5pbl9zZHR2ID0gaW5faW5mby0+Y29sb3JpbWV0cnkubWF0cml4ID09IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQ2MDE7CisgIGFscGhhLT5vdXRfc2R0diA9CisgICAgICBvdXRfaW5mby0+Y29sb3JpbWV0cnkubWF0cml4ID09IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQ2MDE7CisKKyAgcGFzc3Rocm91Z2ggPSBhbHBoYS0+cHJlZmVyX3Bhc3N0aHJvdWdoICYmCisgICAgICBHU1RfVklERU9fSU5GT19GT1JNQVQgKGluX2luZm8pID09IEdTVF9WSURFT19JTkZPX0ZPUk1BVCAob3V0X2luZm8pCisgICAgICAmJiBhbHBoYS0+aW5fc2R0diA9PSBhbHBoYS0+b3V0X3NkdHYgJiYgYWxwaGEtPm1ldGhvZCA9PSBBTFBIQV9NRVRIT0RfU0VUCisgICAgICAmJiBhbHBoYS0+YWxwaGEgPT0gMS4wOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGFscGhhLAorICAgICAgIlNldHRpbmcgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCAiIC0+ICUiIEdTVF9QVFJfRk9STUFUCisgICAgICAiIChwYXNzdGhyb3VnaDogJWQpIiwgaW5jYXBzLCBvdXRjYXBzLCBwYXNzdGhyb3VnaCk7CisgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfcGFzc3Rocm91Z2ggKEdTVF9CQVNFX1RSQU5TRk9STV9DQVNUIChmaWx0ZXIpLAorICAgICAgcGFzc3Rocm91Z2gpOworCisgIGlmICghZ3N0X2FscGhhX3NldF9wcm9jZXNzX2Z1bmN0aW9uX2Z1bGwgKGFscGhhLCBpbl9pbmZvLCBvdXRfaW5mbykKKyAgICAgICYmICFwYXNzdGhyb3VnaCkKKyAgICBnb3RvIG5vX3Byb2Nlc3M7CisKKyAgZ3N0X2FscGhhX2luaXRfcGFyYW1zX2Z1bGwgKGFscGhhLCBpbl9pbmZvLT5maW5mbywgb3V0X2luZm8tPmZpbmZvKTsKKworICBHU1RfQUxQSEFfVU5MT0NLIChhbHBoYSk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub19wcm9jZXNzOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhbHBoYSwKKyAgICAgICAgIk5vIHByb2Nlc3NpbmcgZnVuY3Rpb24gZm9yIHRoaXMgY2FwcyBhbmQgbm8gcGFzc3Rocm91Z2ggbW9kZSIpOworICAgIEdTVF9BTFBIQV9VTkxPQ0sgKGFscGhhKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogYmFzZWQgb24gaHR0cDovL3d3dy5jcy51dGFoLmVkdS9+bWljaGFlbC9jaHJvbWEvCisgKi8KK3N0YXRpYyBpbmxpbmUgZ2ludAorY2hyb21hX2tleWluZ195dXYgKGdpbnQgYSwgZ2ludCAqIHksIGdpbnQgKiB1LAorICAgIGdpbnQgKiB2LCBnaW50IGNyLCBnaW50IGNiLCBnaW50IHNtaW4sIGdpbnQgc21heCwgZ3VpbnQ4IGFjY2VwdF9hbmdsZV90ZywKKyAgICBndWludDggYWNjZXB0X2FuZ2xlX2N0ZywgZ3VpbnQ4IG9uZV9vdmVyX2tjLCBndWludDgga2ZneV9zY2FsZSwgZ2ludDgga2csCisgICAgZ3VpbnQgbm9pc2VfbGV2ZWwyKQoreworICBnaW50IHRtcCwgdG1wMTsKKyAgZ2ludCB4MSwgeTE7CisgIGdpbnQgeCwgejsKKyAgZ2ludCBiX2FscGhhOworCisgIC8qIHRvbyBkYXJrIG9yIHRvbyBicmlnaHQsIGtlZXAgYWxwaGEgKi8KKyAgaWYgKCp5IDwgc21pbiB8fCAqeSA+IHNtYXgpCisgICAgcmV0dXJuIGE7CisKKyAgLyogQ29udmVydCBmb3JlZ3JvdW5kIHRvIFhaIGNvb3JkcyB3aGVyZSBYIGRpcmVjdGlvbiBpcyBkZWZpbmVkIGJ5CisgICAgIHRoZSBrZXkgY29sb3IgKi8KKyAgdG1wID0gKCgqdSkgKiBjYiArICgqdikgKiBjcikgPj4gNzsKKyAgeCA9IENMQU1QICh0bXAsIC0xMjgsIDEyNyk7CisgIHRtcCA9ICgoKnYpICogY2IgLSAoKnUpICogY3IpID4+IDc7CisgIHogPSBDTEFNUCAodG1wLCAtMTI4LCAxMjcpOworCisgIC8qIFdBUk5JTkc6IGFjY2VwdCBhbmdsZSBzaG91bGQgbmV2ZXIgYmUgc2V0IGdyZWF0ZXIgdGhhbiAic29tZXdoYXQgbGVzcworICAgICB0aGFuIDkwIGRlZ3JlZXMiIHRvIGF2b2lkIGRlYWxpbmcgd2l0aCBuZWdhdGl2ZS9pbmZpbml0ZSB0Zy4gSW4gcmVhbGl0eSwKKyAgICAgODAgZGVncmVlcyBzaG91bGQgYmUgZW5vdWdoIGlmIGZvcmVncm91bmQgaXMgcmVhc29uYWJsZS4gSWYgdGhpcyBzZWVtcworICAgICB0byBiZSBhIHByb2JsZW0sIGdvIHRvIGFsdGVybmF0aXZlIHdheXMgb2YgY2hlY2tpbmcgcG9pbnQgcG9zaXRpb24KKyAgICAgKHNjYWxhciBwcm9kdWN0IG9yIGxpbmUgZXF1YXRpb25zKS4gVGhpcyBhbmdsZSBzaG91bGQgbm90IGJlIHRvbyBzbWFsbAorICAgICBlaXRoZXIgdG8gYXZvaWQgaW5maW5pdGUgY3RnICh1c2VkIHRvIHN1cHByZXNzIGZvcmVncm91bmQgd2l0aG91dCB1c2Ugb2YKKyAgICAgZGl2aXNpb24pICovCisKKyAgdG1wID0gKHggKiBhY2NlcHRfYW5nbGVfdGcpID4+IDQ7CisgIHRtcCA9IE1JTiAodG1wLCAxMjcpOworCisgIGlmIChhYnMgKHopID4gdG1wKSB7CisgICAgLyoga2VlcCBmb3JlZ3JvdW5kIEtmZyA9IDAgKi8KKyAgICByZXR1cm4gYTsKKyAgfQorICAvKiBDb21wdXRlIEtmZyAoaW1wbGljaXRseSkgYW5kIEtiZywgc3VwcHJlc3MgZm9yZWdyb3VuZCBpbiBYWiBjb29yZAorICAgICBhY2NvcmRpbmcgdG8gS2ZnICovCisgIHRtcCA9ICh6ICogYWNjZXB0X2FuZ2xlX2N0ZykgPj4gNDsKKyAgdG1wID0gQ0xBTVAgKHRtcCwgLTEyOCwgMTI3KTsKKyAgeDEgPSBhYnMgKHRtcCk7CisgIHkxID0gejsKKworICB0bXAxID0geCAtIHgxOworICB0bXAxID0gTUFYICh0bXAxLCAwKTsKKyAgYl9hbHBoYSA9ICh0bXAxICogb25lX292ZXJfa2MpIC8gMjsKKyAgYl9hbHBoYSA9IDI1NSAtIENMQU1QIChiX2FscGhhLCAwLCAyNTUpOworICBiX2FscGhhID0gKGEgKiBiX2FscGhhKSA+PiA4OworCisgIHRtcCA9ICh0bXAxICoga2ZneV9zY2FsZSkgPj4gNDsKKyAgdG1wMSA9IE1JTiAodG1wLCAyNTUpOworCisgICp5ID0gKCp5IDwgdG1wMSkgPyAwIDogKnkgLSB0bXAxOworCisgIC8qIENvbnZlcnQgc3VwcHJlc3NlZCBmb3JlZ3JvdW5kIGJhY2sgdG8gQ2JDciAqLworICB0bXAgPSAoeDEgKiBjYiAtIHkxICogY3IpID4+IDc7CisgICp1ID0gQ0xBTVAgKHRtcCwgLTEyOCwgMTI3KTsKKworICB0bXAgPSAoeDEgKiBjciArIHkxICogY2IpID4+IDc7CisgICp2ID0gQ0xBTVAgKHRtcCwgLTEyOCwgMTI3KTsKKworICAvKiBEZWFsIHdpdGggbm9pc2UuIEZvciBub3csIGEgY2lyY2xlIGFyb3VuZCB0aGUga2V5IGNvbG9yIHdpdGgKKyAgICAgcmFkaXVzIG9mIG5vaXNlX2xldmVsIHRyZWF0ZWQgYXMgZXhhY3Qga2V5IGNvbG9yLiBJbnRyb2R1Y2VzCisgICAgIHNoYXJwIHRyYW5zaXRpb25zLgorICAgKi8KKyAgdG1wID0geiAqIHogKyAoeCAtIGtnKSAqICh4IC0ga2cpOworICB0bXAgPSBNSU4gKHRtcCwgMHhmZmZmKTsKKworICBpZiAodG1wIDwgbm9pc2VfbGV2ZWwyKQorICAgIGJfYWxwaGEgPSAwOworCisgIHJldHVybiBiX2FscGhhOworfQorCisjZGVmaW5lIEFQUExZX01BVFJJWChtLG8sdjEsdjIsdjMpICgobVtvKjRdICogdjEgKyBtW28qNCsxXSAqIHYyICsgbVtvKjQrMl0gKiB2MyArIG1bbyo0KzNdKSA+PiA4KQorCitzdGF0aWMgdm9pZAorZ3N0X2FscGhhX3NldF9hcmdiX2F5dXYgKGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lLCBHc3RBbHBoYSAqIGFscGhhKQoreworICBnaW50IHNfYWxwaGEgPSBDTEFNUCAoKGdpbnQpIChhbHBoYS0+YWxwaGEgKiAyNTYpLCAwLCAyNTYpOworICBjb25zdCBndWludDggKnNyYzsKKyAgZ3VpbnQ4ICpkZXN0OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgaSwgajsKKyAgZ2ludCBtYXRyaXhbMTJdOworICBnaW50IHksIHUsIHY7CisgIGdpbnQgb1s0XTsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworCisgIG9bMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMyk7CisgIG9bMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMCk7CisgIG9bMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMSk7CisgIG9bM10gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMik7CisKKyAgbWVtY3B5IChtYXRyaXgsCisgICAgICBhbHBoYS0+b3V0X3NkdHYgPyBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYgOgorICAgICAgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9oZHR2LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICBkZXN0WzBdID0gKHNyY1tvWzBdXSAqIHNfYWxwaGEpID4+IDg7CisKKyAgICAgIHkgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgc3JjW29bMV1dLCBzcmNbb1syXV0sIHNyY1tvWzNdXSk7CisgICAgICB1ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHNyY1tvWzFdXSwgc3JjW29bMl1dLCBzcmNbb1szXV0pOworICAgICAgdiA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCBzcmNbb1sxXV0sIHNyY1tvWzJdXSwgc3JjW29bM11dKTsKKworICAgICAgZGVzdFsxXSA9IHk7CisgICAgICBkZXN0WzJdID0gdTsKKyAgICAgIGRlc3RbM10gPSB2OworCisgICAgICBkZXN0ICs9IDQ7CisgICAgICBzcmMgKz0gNDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9jaHJvbWFfa2V5X2FyZ2JfYXl1diAoY29uc3QgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLAorICAgIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUsIEdzdEFscGhhICogYWxwaGEpCit7CisgIGNvbnN0IGd1aW50OCAqc3JjOworICBndWludDggKmRlc3Q7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCBpLCBqOworICBnaW50IGEsIHksIHUsIHY7CisgIGdpbnQgciwgZywgYjsKKyAgZ2ludCBzbWluLCBzbWF4OworICBnaW50IHBhID0gQ0xBTVAgKChnaW50KSAoYWxwaGEtPmFscGhhICogMjU2KSwgMCwgMjU2KTsKKyAgZ2ludDggY2IgPSBhbHBoYS0+Y2IsIGNyID0gYWxwaGEtPmNyOworICBnaW50OCBrZyA9IGFscGhhLT5rZzsKKyAgZ3VpbnQ4IGFjY2VwdF9hbmdsZV90ZyA9IGFscGhhLT5hY2NlcHRfYW5nbGVfdGc7CisgIGd1aW50OCBhY2NlcHRfYW5nbGVfY3RnID0gYWxwaGEtPmFjY2VwdF9hbmdsZV9jdGc7CisgIGd1aW50OCBvbmVfb3Zlcl9rYyA9IGFscGhhLT5vbmVfb3Zlcl9rYzsKKyAgZ3VpbnQ4IGtmZ3lfc2NhbGUgPSBhbHBoYS0+a2ZneV9zY2FsZTsKKyAgZ3VpbnQgbm9pc2VfbGV2ZWwyID0gYWxwaGEtPm5vaXNlX2xldmVsMjsKKyAgZ2ludCBtYXRyaXhbMTJdOworICBnaW50IG9bNF07CisKKyAgc3JjID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAwKTsKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKTsKKworICBvWzBdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAoaW5fZnJhbWUsIDMpOworICBvWzFdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAoaW5fZnJhbWUsIDApOworICBvWzJdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAoaW5fZnJhbWUsIDEpOworICBvWzNdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAoaW5fZnJhbWUsIDIpOworCisgIHNtaW4gPSAxMjggLSBhbHBoYS0+YmxhY2tfc2Vuc2l0aXZpdHk7CisgIHNtYXggPSAxMjggKyBhbHBoYS0+d2hpdGVfc2Vuc2l0aXZpdHk7CisKKyAgbWVtY3B5IChtYXRyaXgsCisgICAgICBhbHBoYS0+b3V0X3NkdHYgPyBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYgOgorICAgICAgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9oZHR2LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICBhID0gKHNyY1tvWzBdXSAqIHBhKSA+PiA4OworICAgICAgciA9IHNyY1tvWzFdXTsKKyAgICAgIGcgPSBzcmNbb1syXV07CisgICAgICBiID0gc3JjW29bM11dOworCisgICAgICB5ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHIsIGcsIGIpOworICAgICAgdSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCByLCBnLCBiKSAtIDEyODsKKyAgICAgIHYgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgciwgZywgYikgLSAxMjg7CisKKyAgICAgIGEgPSBjaHJvbWFfa2V5aW5nX3l1diAoYSwgJnksICZ1LCAmdiwgY3IsIGNiLAorICAgICAgICAgIHNtaW4sIHNtYXgsIGFjY2VwdF9hbmdsZV90ZywgYWNjZXB0X2FuZ2xlX2N0ZywKKyAgICAgICAgICBvbmVfb3Zlcl9rYywga2ZneV9zY2FsZSwga2csIG5vaXNlX2xldmVsMik7CisKKyAgICAgIHUgKz0gMTI4OworICAgICAgdiArPSAxMjg7CisKKyAgICAgIGRlc3RbMF0gPSBhOworICAgICAgZGVzdFsxXSA9IHk7CisgICAgICBkZXN0WzJdID0gdTsKKyAgICAgIGRlc3RbM10gPSB2OworCisgICAgICBzcmMgKz0gNDsKKyAgICAgIGRlc3QgKz0gNDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9zZXRfYXJnYl9hcmdiIChjb25zdCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSwgR3N0QWxwaGEgKiBhbHBoYSkKK3sKKyAgY29uc3QgZ3VpbnQ4ICpzcmM7CisgIGd1aW50OCAqZGVzdDsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnaW50IHNfYWxwaGEgPSBDTEFNUCAoKGdpbnQpIChhbHBoYS0+YWxwaGEgKiAyNTYpLCAwLCAyNTYpOworICBnaW50IGksIGo7CisgIGdpbnQgcFs0XSwgb1s0XTsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworCisgIHBbMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDMpOworICBwWzFdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAwKTsKKyAgcFsyXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMSk7CisgIHBbM10gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDIpOworCisgIG9bMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMyk7CisgIG9bMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMCk7CisgIG9bMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMSk7CisgIG9bM10gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMik7CisKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgIGRlc3RbcFswXV0gPSAoc3JjW29bMF1dICogc19hbHBoYSkgPj4gODsKKworICAgICAgZGVzdFtwWzFdXSA9IHNyY1tvWzFdXTsKKyAgICAgIGRlc3RbcFsyXV0gPSBzcmNbb1syXV07CisgICAgICBkZXN0W3BbM11dID0gc3JjW29bM11dOworCisgICAgICBkZXN0ICs9IDQ7CisgICAgICBzcmMgKz0gNDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9jaHJvbWFfa2V5X2FyZ2JfYXJnYiAoY29uc3QgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLAorICAgIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUsIEdzdEFscGhhICogYWxwaGEpCit7CisgIGNvbnN0IGd1aW50OCAqc3JjOworICBndWludDggKmRlc3Q7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCBpLCBqOworICBnaW50IGEsIHksIHUsIHY7CisgIGdpbnQgciwgZywgYjsKKyAgZ2ludCBzbWluLCBzbWF4OworICBnaW50IHBhID0gQ0xBTVAgKChnaW50KSAoYWxwaGEtPmFscGhhICogMjU2KSwgMCwgMjU2KTsKKyAgZ2ludDggY2IgPSBhbHBoYS0+Y2IsIGNyID0gYWxwaGEtPmNyOworICBnaW50OCBrZyA9IGFscGhhLT5rZzsKKyAgZ3VpbnQ4IGFjY2VwdF9hbmdsZV90ZyA9IGFscGhhLT5hY2NlcHRfYW5nbGVfdGc7CisgIGd1aW50OCBhY2NlcHRfYW5nbGVfY3RnID0gYWxwaGEtPmFjY2VwdF9hbmdsZV9jdGc7CisgIGd1aW50OCBvbmVfb3Zlcl9rYyA9IGFscGhhLT5vbmVfb3Zlcl9rYzsKKyAgZ3VpbnQ4IGtmZ3lfc2NhbGUgPSBhbHBoYS0+a2ZneV9zY2FsZTsKKyAgZ3VpbnQgbm9pc2VfbGV2ZWwyID0gYWxwaGEtPm5vaXNlX2xldmVsMjsKKyAgZ2ludCBtYXRyaXhbMTJdLCBtYXRyaXgyWzEyXTsKKyAgZ2ludCBwWzRdLCBvWzRdOworCisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSk7CisKKyAgcFswXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMyk7CisgIHBbMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDApOworICBwWzJdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAxKTsKKyAgcFszXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMik7CisKKyAgb1swXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAzKTsKKyAgb1sxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAwKTsKKyAgb1syXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAxKTsKKyAgb1szXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAyKTsKKworICBzbWluID0gMTI4IC0gYWxwaGEtPmJsYWNrX3NlbnNpdGl2aXR5OworICBzbWF4ID0gMTI4ICsgYWxwaGEtPndoaXRlX3NlbnNpdGl2aXR5OworCisgIG1lbWNweSAobWF0cml4LCBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYsIDEyICogc2l6ZW9mIChnaW50KSk7CisgIG1lbWNweSAobWF0cml4MiwgY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9zZHR2LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICBhID0gKHNyY1tvWzBdXSAqIHBhKSA+PiA4OworICAgICAgciA9IHNyY1tvWzFdXTsKKyAgICAgIGcgPSBzcmNbb1syXV07CisgICAgICBiID0gc3JjW29bM11dOworCisgICAgICB5ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHIsIGcsIGIpOworICAgICAgdSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCByLCBnLCBiKSAtIDEyODsKKyAgICAgIHYgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgciwgZywgYikgLSAxMjg7CisKKyAgICAgIGEgPSBjaHJvbWFfa2V5aW5nX3l1diAoYSwgJnksICZ1LCAmdiwgY3IsIGNiLAorICAgICAgICAgIHNtaW4sIHNtYXgsIGFjY2VwdF9hbmdsZV90ZywgYWNjZXB0X2FuZ2xlX2N0ZywKKyAgICAgICAgICBvbmVfb3Zlcl9rYywga2ZneV9zY2FsZSwga2csIG5vaXNlX2xldmVsMik7CisKKyAgICAgIHUgKz0gMTI4OworICAgICAgdiArPSAxMjg7CisKKyAgICAgIHIgPSBBUFBMWV9NQVRSSVggKG1hdHJpeDIsIDAsIHksIHUsIHYpOworICAgICAgZyA9IEFQUExZX01BVFJJWCAobWF0cml4MiwgMSwgeSwgdSwgdik7CisgICAgICBiID0gQVBQTFlfTUFUUklYIChtYXRyaXgyLCAyLCB5LCB1LCB2KTsKKworICAgICAgZGVzdFtwWzBdXSA9IGE7CisgICAgICBkZXN0W3BbMV1dID0gQ0xBTVAgKHIsIDAsIDI1NSk7CisgICAgICBkZXN0W3BbMl1dID0gQ0xBTVAgKGcsIDAsIDI1NSk7CisgICAgICBkZXN0W3BbM11dID0gQ0xBTVAgKGIsIDAsIDI1NSk7CisKKyAgICAgIHNyYyArPSA0OworICAgICAgZGVzdCArPSA0OworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2FscGhhX3NldF9heXV2X2FyZ2IgKGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lLCBHc3RBbHBoYSAqIGFscGhhKQoreworICBjb25zdCBndWludDggKnNyYzsKKyAgZ3VpbnQ4ICpkZXN0OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgc19hbHBoYSA9IENMQU1QICgoZ2ludCkgKGFscGhhLT5hbHBoYSAqIDI1NiksIDAsIDI1Nik7CisgIGdpbnQgeSwgeDsKKyAgZ2ludCBtYXRyaXhbMTJdOworICBnaW50IHIsIGcsIGI7CisgIGdpbnQgcFs0XTsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworCisgIHBbMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDMpOworICBwWzFdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAwKTsKKyAgcFsyXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMSk7CisgIHBbM10gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDIpOworCisgIG1lbWNweSAobWF0cml4LAorICAgICAgYWxwaGEtPmluX3NkdHYgPyBjb2dfeWNiY3JfdG9fcmdiX21hdHJpeF84Yml0X3NkdHYgOgorICAgICAgY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9oZHR2LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICBkZXN0W3BbMF1dID0gKHNyY1swXSAqIHNfYWxwaGEpID4+IDg7CisKKyAgICAgIHIgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgc3JjWzFdLCBzcmNbMl0sIHNyY1szXSk7CisgICAgICBnID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHNyY1sxXSwgc3JjWzJdLCBzcmNbM10pOworICAgICAgYiA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCBzcmNbMV0sIHNyY1syXSwgc3JjWzNdKTsKKworICAgICAgZGVzdFtwWzFdXSA9IENMQU1QIChyLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzJdXSA9IENMQU1QIChnLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzNdXSA9IENMQU1QIChiLCAwLCAyNTUpOworCisgICAgICBkZXN0ICs9IDQ7CisgICAgICBzcmMgKz0gNDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9jaHJvbWFfa2V5X2F5dXZfYXJnYiAoY29uc3QgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLAorICAgIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUsIEdzdEFscGhhICogYWxwaGEpCit7CisgIGNvbnN0IGd1aW50OCAqc3JjOworICBndWludDggKmRlc3Q7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCBpLCBqOworICBnaW50IGEsIHksIHUsIHY7CisgIGdpbnQgciwgZywgYjsKKyAgZ2ludCBzbWluLCBzbWF4OworICBnaW50IHBhID0gQ0xBTVAgKChnaW50KSAoYWxwaGEtPmFscGhhICogMjU2KSwgMCwgMjU2KTsKKyAgZ2ludDggY2IgPSBhbHBoYS0+Y2IsIGNyID0gYWxwaGEtPmNyOworICBnaW50OCBrZyA9IGFscGhhLT5rZzsKKyAgZ3VpbnQ4IGFjY2VwdF9hbmdsZV90ZyA9IGFscGhhLT5hY2NlcHRfYW5nbGVfdGc7CisgIGd1aW50OCBhY2NlcHRfYW5nbGVfY3RnID0gYWxwaGEtPmFjY2VwdF9hbmdsZV9jdGc7CisgIGd1aW50OCBvbmVfb3Zlcl9rYyA9IGFscGhhLT5vbmVfb3Zlcl9rYzsKKyAgZ3VpbnQ4IGtmZ3lfc2NhbGUgPSBhbHBoYS0+a2ZneV9zY2FsZTsKKyAgZ3VpbnQgbm9pc2VfbGV2ZWwyID0gYWxwaGEtPm5vaXNlX2xldmVsMjsKKyAgZ2ludCBtYXRyaXhbMTJdOworICBnaW50IHBbNF07CisKKyAgc3JjID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAwKTsKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKTsKKworICBwWzBdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAzKTsKKyAgcFsxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMCk7CisgIHBbMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDEpOworICBwWzNdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAyKTsKKworICBzbWluID0gMTI4IC0gYWxwaGEtPmJsYWNrX3NlbnNpdGl2aXR5OworICBzbWF4ID0gMTI4ICsgYWxwaGEtPndoaXRlX3NlbnNpdGl2aXR5OworCisgIG1lbWNweSAobWF0cml4LAorICAgICAgYWxwaGEtPmluX3NkdHYgPyBjb2dfeWNiY3JfdG9fcmdiX21hdHJpeF84Yml0X3NkdHYgOgorICAgICAgY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9oZHR2LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICBhID0gKHNyY1swXSAqIHBhKSA+PiA4OworICAgICAgeSA9IHNyY1sxXTsKKyAgICAgIHUgPSBzcmNbMl0gLSAxMjg7CisgICAgICB2ID0gc3JjWzNdIC0gMTI4OworCisgICAgICBhID0gY2hyb21hX2tleWluZ195dXYgKGEsICZ5LCAmdSwgJnYsIGNyLCBjYiwKKyAgICAgICAgICBzbWluLCBzbWF4LCBhY2NlcHRfYW5nbGVfdGcsIGFjY2VwdF9hbmdsZV9jdGcsCisgICAgICAgICAgb25lX292ZXJfa2MsIGtmZ3lfc2NhbGUsIGtnLCBub2lzZV9sZXZlbDIpOworCisgICAgICB1ICs9IDEyODsKKyAgICAgIHYgKz0gMTI4OworCisgICAgICByID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHksIHUsIHYpOworICAgICAgZyA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5LCB1LCB2KTsKKyAgICAgIGIgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeSwgdSwgdik7CisKKyAgICAgIGRlc3RbcFswXV0gPSBhOworICAgICAgZGVzdFtwWzFdXSA9IENMQU1QIChyLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzJdXSA9IENMQU1QIChnLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzNdXSA9IENMQU1QIChiLCAwLCAyNTUpOworCisgICAgICBzcmMgKz0gNDsKKyAgICAgIGRlc3QgKz0gNDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9zZXRfYXl1dl9heXV2IChjb25zdCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSwgR3N0QWxwaGEgKiBhbHBoYSkKK3sKKyAgY29uc3QgZ3VpbnQ4ICpzcmM7CisgIGd1aW50OCAqZGVzdDsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnaW50IHNfYWxwaGEgPSBDTEFNUCAoKGdpbnQpIChhbHBoYS0+YWxwaGEgKiAyNTYpLCAwLCAyNTYpOworICBnaW50IHksIHg7CisKKyAgc3JjID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAwKTsKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKTsKKworICBpZiAoYWxwaGEtPmluX3NkdHYgPT0gYWxwaGEtPm91dF9zZHR2KSB7CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICBkZXN0WzBdID0gKHNyY1swXSAqIHNfYWxwaGEpID4+IDg7CisgICAgICAgIGRlc3RbMV0gPSBzcmNbMV07CisgICAgICAgIGRlc3RbMl0gPSBzcmNbMl07CisgICAgICAgIGRlc3RbM10gPSBzcmNbM107CisKKyAgICAgICAgZGVzdCArPSA0OworICAgICAgICBzcmMgKz0gNDsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ2ludCBtYXRyaXhbMTJdOworCisgICAgbWVtY3B5IChtYXRyaXgsCisgICAgICAgIGFscGhhLT5vdXRfc2R0diA/IGNvZ195Y2Jjcl9oZHR2X3RvX3ljYmNyX3NkdHZfbWF0cml4XzhiaXQgOgorICAgICAgICBjb2dfeWNiY3Jfc2R0dl90b195Y2Jjcl9oZHR2X21hdHJpeF84Yml0LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICBkZXN0WzBdID0gKHNyY1swXSAqIHNfYWxwaGEpID4+IDg7CisgICAgICAgIGRlc3RbMV0gPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgc3JjWzFdLCBzcmNbMl0sIHNyY1szXSk7CisgICAgICAgIGRlc3RbMl0gPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgc3JjWzFdLCBzcmNbMl0sIHNyY1szXSk7CisgICAgICAgIGRlc3RbM10gPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgc3JjWzFdLCBzcmNbMl0sIHNyY1szXSk7CisKKyAgICAgICAgZGVzdCArPSA0OworICAgICAgICBzcmMgKz0gNDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9jaHJvbWFfa2V5X2F5dXZfYXl1diAoY29uc3QgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLAorICAgIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUsIEdzdEFscGhhICogYWxwaGEpCit7CisgIGNvbnN0IGd1aW50OCAqc3JjOworICBndWludDggKmRlc3Q7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCBpLCBqOworICBnaW50IGEsIHksIHUsIHY7CisgIGdpbnQgc21pbiwgc21heDsKKyAgZ2ludCBwYSA9IENMQU1QICgoZ2ludCkgKGFscGhhLT5hbHBoYSAqIDI1NiksIDAsIDI1Nik7CisgIGdpbnQ4IGNiID0gYWxwaGEtPmNiLCBjciA9IGFscGhhLT5jcjsKKyAgZ2ludDgga2cgPSBhbHBoYS0+a2c7CisgIGd1aW50OCBhY2NlcHRfYW5nbGVfdGcgPSBhbHBoYS0+YWNjZXB0X2FuZ2xlX3RnOworICBndWludDggYWNjZXB0X2FuZ2xlX2N0ZyA9IGFscGhhLT5hY2NlcHRfYW5nbGVfY3RnOworICBndWludDggb25lX292ZXJfa2MgPSBhbHBoYS0+b25lX292ZXJfa2M7CisgIGd1aW50OCBrZmd5X3NjYWxlID0gYWxwaGEtPmtmZ3lfc2NhbGU7CisgIGd1aW50IG5vaXNlX2xldmVsMiA9IGFscGhhLT5ub2lzZV9sZXZlbDI7CisKKyAgc3JjID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAwKTsKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKTsKKworICBzbWluID0gMTI4IC0gYWxwaGEtPmJsYWNrX3NlbnNpdGl2aXR5OworICBzbWF4ID0gMTI4ICsgYWxwaGEtPndoaXRlX3NlbnNpdGl2aXR5OworCisgIGlmIChhbHBoYS0+aW5fc2R0diA9PSBhbHBoYS0+b3V0X3NkdHYpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgIGEgPSAoc3JjWzBdICogcGEpID4+IDg7CisgICAgICAgIHkgPSBzcmNbMV07CisgICAgICAgIHUgPSBzcmNbMl0gLSAxMjg7CisgICAgICAgIHYgPSBzcmNbM10gLSAxMjg7CisKKyAgICAgICAgYSA9IGNocm9tYV9rZXlpbmdfeXV2IChhLCAmeSwgJnUsICZ2LCBjciwgY2IsCisgICAgICAgICAgICBzbWluLCBzbWF4LCBhY2NlcHRfYW5nbGVfdGcsIGFjY2VwdF9hbmdsZV9jdGcsCisgICAgICAgICAgICBvbmVfb3Zlcl9rYywga2ZneV9zY2FsZSwga2csIG5vaXNlX2xldmVsMik7CisKKyAgICAgICAgdSArPSAxMjg7CisgICAgICAgIHYgKz0gMTI4OworCisgICAgICAgIGRlc3RbMF0gPSBhOworICAgICAgICBkZXN0WzFdID0geTsKKyAgICAgICAgZGVzdFsyXSA9IHU7CisgICAgICAgIGRlc3RbM10gPSB2OworCisgICAgICAgIHNyYyArPSA0OworICAgICAgICBkZXN0ICs9IDQ7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGdpbnQgbWF0cml4WzEyXTsKKworICAgIG1lbWNweSAobWF0cml4LAorICAgICAgICBhbHBoYS0+b3V0X3NkdHYgPyBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0IDoKKyAgICAgICAgY29nX3ljYmNyX3NkdHZfdG9feWNiY3JfaGR0dl9tYXRyaXhfOGJpdCwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgYSA9IChzcmNbMF0gKiBwYSkgPj4gODsKKyAgICAgICAgeSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAwLCBzcmNbMV0sIHNyY1syXSwgc3JjWzNdKTsKKyAgICAgICAgdSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCBzcmNbMV0sIHNyY1syXSwgc3JjWzNdKSAtIDEyODsKKyAgICAgICAgdiA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCBzcmNbMV0sIHNyY1syXSwgc3JjWzNdKSAtIDEyODsKKworICAgICAgICBhID0gY2hyb21hX2tleWluZ195dXYgKGEsICZ5LCAmdSwgJnYsIGNyLCBjYiwKKyAgICAgICAgICAgIHNtaW4sIHNtYXgsIGFjY2VwdF9hbmdsZV90ZywgYWNjZXB0X2FuZ2xlX2N0ZywKKyAgICAgICAgICAgIG9uZV9vdmVyX2tjLCBrZmd5X3NjYWxlLCBrZywgbm9pc2VfbGV2ZWwyKTsKKworICAgICAgICB1ICs9IDEyODsKKyAgICAgICAgdiArPSAxMjg7CisKKyAgICAgICAgZGVzdFswXSA9IGE7CisgICAgICAgIGRlc3RbMV0gPSB5OworICAgICAgICBkZXN0WzJdID0gdTsKKyAgICAgICAgZGVzdFszXSA9IHY7CisKKyAgICAgICAgc3JjICs9IDQ7CisgICAgICAgIGRlc3QgKz0gNDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9zZXRfcmdiX2F5dXYgKGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lLCBHc3RBbHBoYSAqIGFscGhhKQoreworICBjb25zdCBndWludDggKnNyYzsKKyAgZ3VpbnQ4ICpkZXN0OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgc19hbHBoYSA9IENMQU1QICgoZ2ludCkgKGFscGhhLT5hbHBoYSAqIDI1NSksIDAsIDI1NSk7CisgIGdpbnQgaSwgajsKKyAgZ2ludCBtYXRyaXhbMTJdOworICBnaW50IHksIHUsIHY7CisgIGdpbnQgb1szXTsKKyAgZ2ludCBicHA7CisKKyAgc3JjID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAwKTsKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKTsKKworICBicHAgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFIChpbl9mcmFtZSwgMCk7CisgIG9bMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMCk7CisgIG9bMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMSk7CisgIG9bMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMik7CisKKyAgbWVtY3B5IChtYXRyaXgsCisgICAgICBhbHBoYS0+b3V0X3NkdHYgPyBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYgOgorICAgICAgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9oZHR2LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICBkZXN0WzBdID0gc19hbHBoYTsKKworICAgICAgeSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAwLCBzcmNbb1swXV0sIHNyY1tvWzFdXSwgc3JjW29bMl1dKTsKKyAgICAgIHUgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgc3JjW29bMF1dLCBzcmNbb1sxXV0sIHNyY1tvWzJdXSk7CisgICAgICB2ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHNyY1tvWzBdXSwgc3JjW29bMV1dLCBzcmNbb1syXV0pOworCisgICAgICBkZXN0WzFdID0geTsKKyAgICAgIGRlc3RbMl0gPSB1OworICAgICAgZGVzdFszXSA9IHY7CisKKyAgICAgIGRlc3QgKz0gNDsKKyAgICAgIHNyYyArPSBicHA7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYWxwaGFfY2hyb21hX2tleV9yZ2JfYXl1diAoY29uc3QgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLAorICAgIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUsIEdzdEFscGhhICogYWxwaGEpCit7CisgIGNvbnN0IGd1aW50OCAqc3JjOworICBndWludDggKmRlc3Q7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCBpLCBqOworICBnaW50IGEsIHksIHUsIHY7CisgIGdpbnQgciwgZywgYjsKKyAgZ2ludCBzbWluLCBzbWF4OworICBnaW50IHBhID0gQ0xBTVAgKChnaW50KSAoYWxwaGEtPmFscGhhICogMjU1KSwgMCwgMjU1KTsKKyAgZ2ludDggY2IgPSBhbHBoYS0+Y2IsIGNyID0gYWxwaGEtPmNyOworICBnaW50OCBrZyA9IGFscGhhLT5rZzsKKyAgZ3VpbnQ4IGFjY2VwdF9hbmdsZV90ZyA9IGFscGhhLT5hY2NlcHRfYW5nbGVfdGc7CisgIGd1aW50OCBhY2NlcHRfYW5nbGVfY3RnID0gYWxwaGEtPmFjY2VwdF9hbmdsZV9jdGc7CisgIGd1aW50OCBvbmVfb3Zlcl9rYyA9IGFscGhhLT5vbmVfb3Zlcl9rYzsKKyAgZ3VpbnQ4IGtmZ3lfc2NhbGUgPSBhbHBoYS0+a2ZneV9zY2FsZTsKKyAgZ3VpbnQgbm9pc2VfbGV2ZWwyID0gYWxwaGEtPm5vaXNlX2xldmVsMjsKKyAgZ2ludCBtYXRyaXhbMTJdOworICBnaW50IG9bM107CisgIGdpbnQgYnBwOworCisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSk7CisKKyAgYnBwID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUFNUUklERSAoaW5fZnJhbWUsIDApOworCisgIG9bMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMCk7CisgIG9bMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMSk7CisgIG9bMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMik7CisKKyAgc21pbiA9IDEyOCAtIGFscGhhLT5ibGFja19zZW5zaXRpdml0eTsKKyAgc21heCA9IDEyOCArIGFscGhhLT53aGl0ZV9zZW5zaXRpdml0eTsKKworICBtZW1jcHkgKG1hdHJpeCwKKyAgICAgIGFscGhhLT5vdXRfc2R0diA/IGNvZ19yZ2JfdG9feWNiY3JfbWF0cml4XzhiaXRfc2R0diA6CisgICAgICBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X2hkdHYsIDEyICogc2l6ZW9mIChnaW50KSk7CisKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgIGEgPSBwYTsKKyAgICAgIHIgPSBzcmNbb1swXV07CisgICAgICBnID0gc3JjW29bMV1dOworICAgICAgYiA9IHNyY1tvWzJdXTsKKworICAgICAgeSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAwLCByLCBnLCBiKTsKKyAgICAgIHUgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgciwgZywgYikgLSAxMjg7CisgICAgICB2ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHIsIGcsIGIpIC0gMTI4OworCisgICAgICBhID0gY2hyb21hX2tleWluZ195dXYgKGEsICZ5LCAmdSwgJnYsIGNyLCBjYiwKKyAgICAgICAgICBzbWluLCBzbWF4LCBhY2NlcHRfYW5nbGVfdGcsIGFjY2VwdF9hbmdsZV9jdGcsCisgICAgICAgICAgb25lX292ZXJfa2MsIGtmZ3lfc2NhbGUsIGtnLCBub2lzZV9sZXZlbDIpOworCisgICAgICB1ICs9IDEyODsKKyAgICAgIHYgKz0gMTI4OworCisgICAgICBkZXN0WzBdID0gYTsKKyAgICAgIGRlc3RbMV0gPSB5OworICAgICAgZGVzdFsyXSA9IHU7CisgICAgICBkZXN0WzNdID0gdjsKKworICAgICAgc3JjICs9IGJwcDsKKyAgICAgIGRlc3QgKz0gNDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9zZXRfcmdiX2FyZ2IgKGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lLCBHc3RBbHBoYSAqIGFscGhhKQoreworICBjb25zdCBndWludDggKnNyYzsKKyAgZ3VpbnQ4ICpkZXN0OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgc19hbHBoYSA9IENMQU1QICgoZ2ludCkgKGFscGhhLT5hbHBoYSAqIDI1NSksIDAsIDI1NSk7CisgIGdpbnQgaSwgajsKKyAgZ2ludCBwWzRdLCBvWzNdOworICBnaW50IGJwcDsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworCisgIGJwcCA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BTVFJJREUgKGluX2ZyYW1lLCAwKTsKKworICBvWzBdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAoaW5fZnJhbWUsIDApOworICBvWzFdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAoaW5fZnJhbWUsIDEpOworICBvWzJdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAoaW5fZnJhbWUsIDIpOworCisgIHBbMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDMpOworICBwWzFdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAwKTsKKyAgcFsyXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMSk7CisgIHBbM10gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDIpOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICBkZXN0W3BbMF1dID0gc19hbHBoYTsKKworICAgICAgZGVzdFtwWzFdXSA9IHNyY1tvWzBdXTsKKyAgICAgIGRlc3RbcFsyXV0gPSBzcmNbb1sxXV07CisgICAgICBkZXN0W3BbM11dID0gc3JjW29bMl1dOworCisgICAgICBkZXN0ICs9IDQ7CisgICAgICBzcmMgKz0gYnBwOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2FscGhhX2Nocm9tYV9rZXlfcmdiX2FyZ2IgKGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lLCBHc3RBbHBoYSAqIGFscGhhKQoreworICBjb25zdCBndWludDggKnNyYzsKKyAgZ3VpbnQ4ICpkZXN0OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgaSwgajsKKyAgZ2ludCBhLCB5LCB1LCB2OworICBnaW50IHIsIGcsIGI7CisgIGdpbnQgc21pbiwgc21heDsKKyAgZ2ludCBwYSA9IENMQU1QICgoZ2ludCkgKGFscGhhLT5hbHBoYSAqIDI1NSksIDAsIDI1NSk7CisgIGdpbnQ4IGNiID0gYWxwaGEtPmNiLCBjciA9IGFscGhhLT5jcjsKKyAgZ2ludDgga2cgPSBhbHBoYS0+a2c7CisgIGd1aW50OCBhY2NlcHRfYW5nbGVfdGcgPSBhbHBoYS0+YWNjZXB0X2FuZ2xlX3RnOworICBndWludDggYWNjZXB0X2FuZ2xlX2N0ZyA9IGFscGhhLT5hY2NlcHRfYW5nbGVfY3RnOworICBndWludDggb25lX292ZXJfa2MgPSBhbHBoYS0+b25lX292ZXJfa2M7CisgIGd1aW50OCBrZmd5X3NjYWxlID0gYWxwaGEtPmtmZ3lfc2NhbGU7CisgIGd1aW50IG5vaXNlX2xldmVsMiA9IGFscGhhLT5ub2lzZV9sZXZlbDI7CisgIGdpbnQgbWF0cml4WzEyXSwgbWF0cml4MlsxMl07CisgIGdpbnQgcFs0XSwgb1szXTsKKyAgZ2ludCBicHA7CisKKyAgc3JjID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAwKTsKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKTsKKworICBicHAgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFIChpbl9mcmFtZSwgMCk7CisKKyAgb1swXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAwKTsKKyAgb1sxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAxKTsKKyAgb1syXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAyKTsKKworICBwWzBdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAzKTsKKyAgcFsxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMCk7CisgIHBbMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDEpOworICBwWzNdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAyKTsKKworICBzbWluID0gMTI4IC0gYWxwaGEtPmJsYWNrX3NlbnNpdGl2aXR5OworICBzbWF4ID0gMTI4ICsgYWxwaGEtPndoaXRlX3NlbnNpdGl2aXR5OworCisgIG1lbWNweSAobWF0cml4LCBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYsIDEyICogc2l6ZW9mIChnaW50KSk7CisgIG1lbWNweSAobWF0cml4MiwgY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9zZHR2LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICBhID0gcGE7CisgICAgICByID0gc3JjW29bMF1dOworICAgICAgZyA9IHNyY1tvWzFdXTsKKyAgICAgIGIgPSBzcmNbb1syXV07CisKKyAgICAgIHkgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgciwgZywgYik7CisgICAgICB1ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHIsIGcsIGIpIC0gMTI4OworICAgICAgdiA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCByLCBnLCBiKSAtIDEyODsKKworICAgICAgYSA9IGNocm9tYV9rZXlpbmdfeXV2IChhLCAmeSwgJnUsICZ2LCBjciwgY2IsCisgICAgICAgICAgc21pbiwgc21heCwgYWNjZXB0X2FuZ2xlX3RnLCBhY2NlcHRfYW5nbGVfY3RnLAorICAgICAgICAgIG9uZV9vdmVyX2tjLCBrZmd5X3NjYWxlLCBrZywgbm9pc2VfbGV2ZWwyKTsKKworICAgICAgdSArPSAxMjg7CisgICAgICB2ICs9IDEyODsKKworICAgICAgciA9IEFQUExZX01BVFJJWCAobWF0cml4MiwgMCwgeSwgdSwgdik7CisgICAgICBnID0gQVBQTFlfTUFUUklYIChtYXRyaXgyLCAxLCB5LCB1LCB2KTsKKyAgICAgIGIgPSBBUFBMWV9NQVRSSVggKG1hdHJpeDIsIDIsIHksIHUsIHYpOworCisgICAgICBkZXN0W3BbMF1dID0gYTsKKyAgICAgIGRlc3RbcFsxXV0gPSBDTEFNUCAociwgMCwgMjU1KTsKKyAgICAgIGRlc3RbcFsyXV0gPSBDTEFNUCAoZywgMCwgMjU1KTsKKyAgICAgIGRlc3RbcFszXV0gPSBDTEFNUCAoYiwgMCwgMjU1KTsKKworICAgICAgc3JjICs9IGJwcDsKKyAgICAgIGRlc3QgKz0gNDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9zZXRfcGxhbmFyX3l1dl9heXV2IChjb25zdCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSwgR3N0QWxwaGEgKiBhbHBoYSkKK3sKKyAgZ3VpbnQ4ICpkZXN0OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgYl9hbHBoYSA9IENMQU1QICgoZ2ludCkgKGFscGhhLT5hbHBoYSAqIDI1NSksIDAsIDI1NSk7CisgIGNvbnN0IGd1aW50OCAqc3JjWSwgKnNyY1lfdG1wOworICBjb25zdCBndWludDggKnNyY1UsICpzcmNVX3RtcDsKKyAgY29uc3QgZ3VpbnQ4ICpzcmNWLCAqc3JjVl90bXA7CisgIGdpbnQgaSwgajsKKyAgZ2ludCB5X3N0cmlkZSwgdXZfc3RyaWRlOworICBnaW50IHZfc3VicywgaF9zdWJzOworCisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSk7CisKKyAgeV9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGluX2ZyYW1lLCAwKTsKKyAgdXZfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChpbl9mcmFtZSwgMSk7CisKKyAgc3JjWV90bXAgPSBzcmNZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoaW5fZnJhbWUsIDApOworICBzcmNVX3RtcCA9IHNyY1UgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChpbl9mcmFtZSwgMSk7CisgIHNyY1ZfdG1wID0gc3JjViA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGluX2ZyYW1lLCAyKTsKKworICBzd2l0Y2ggKEdTVF9WSURFT19GUkFNRV9GT1JNQVQgKGluX2ZyYW1lKSkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9JNDIwOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVjEyOgorICAgICAgdl9zdWJzID0gaF9zdWJzID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDQ0OgorICAgICAgdl9zdWJzID0gaF9zdWJzID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOgorICAgICAgdl9zdWJzID0gMTsKKyAgICAgIGhfc3VicyA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQxQjoKKyAgICAgIHZfc3VicyA9IDE7CisgICAgICBoX3N1YnMgPSA0OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGFscGhhLT5pbl9zZHR2ID09IGFscGhhLT5vdXRfc2R0dikgeworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgZGVzdFswXSA9IGJfYWxwaGE7CisgICAgICAgIGRlc3RbMV0gPSBzcmNZWzBdOworICAgICAgICBkZXN0WzJdID0gc3JjVVswXTsKKyAgICAgICAgZGVzdFszXSA9IHNyY1ZbMF07CisKKyAgICAgICAgZGVzdCArPSA0OworICAgICAgICBzcmNZKys7CisgICAgICAgIGlmICgoaiArIDEpICUgaF9zdWJzID09IDApIHsKKyAgICAgICAgICBzcmNVKys7CisgICAgICAgICAgc3JjVisrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHNyY1lfdG1wID0gc3JjWSA9IHNyY1lfdG1wICsgeV9zdHJpZGU7CisgICAgICBpZiAoKGkgKyAxKSAlIHZfc3VicyA9PSAwKSB7CisgICAgICAgIHNyY1VfdG1wID0gc3JjVSA9IHNyY1VfdG1wICsgdXZfc3RyaWRlOworICAgICAgICBzcmNWX3RtcCA9IHNyY1YgPSBzcmNWX3RtcCArIHV2X3N0cmlkZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyY1UgPSBzcmNVX3RtcDsKKyAgICAgICAgc3JjViA9IHNyY1ZfdG1wOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBnaW50IG1hdHJpeFsxMl07CisgICAgZ2ludCBhLCB5LCB1LCB2OworCisgICAgbWVtY3B5IChtYXRyaXgsCisgICAgICAgIGFscGhhLT5vdXRfc2R0diA/IGNvZ195Y2Jjcl9oZHR2X3RvX3ljYmNyX3NkdHZfbWF0cml4XzhiaXQgOgorICAgICAgICBjb2dfeWNiY3Jfc2R0dl90b195Y2Jjcl9oZHR2X21hdHJpeF84Yml0LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICBhID0gYl9hbHBoYTsKKyAgICAgICAgeSA9IHNyY1lbMF07CisgICAgICAgIHUgPSBzcmNVWzBdOworICAgICAgICB2ID0gc3JjVlswXTsKKworICAgICAgICBkZXN0WzBdID0gYTsKKyAgICAgICAgZGVzdFsxXSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5LCB1LCB2KTsKKyAgICAgICAgZGVzdFsyXSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5LCB1LCB2KTsKKyAgICAgICAgZGVzdFszXSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5LCB1LCB2KTsKKworICAgICAgICBkZXN0ICs9IDQ7CisgICAgICAgIHNyY1krKzsKKyAgICAgICAgaWYgKChqICsgMSkgJSBoX3N1YnMgPT0gMCkgeworICAgICAgICAgIHNyY1UrKzsKKyAgICAgICAgICBzcmNWKys7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc3JjWV90bXAgPSBzcmNZID0gc3JjWV90bXAgKyB5X3N0cmlkZTsKKyAgICAgIGlmICgoaSArIDEpICUgdl9zdWJzID09IDApIHsKKyAgICAgICAgc3JjVV90bXAgPSBzcmNVID0gc3JjVV90bXAgKyB1dl9zdHJpZGU7CisgICAgICAgIHNyY1ZfdG1wID0gc3JjViA9IHNyY1ZfdG1wICsgdXZfc3RyaWRlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3JjVSA9IHNyY1VfdG1wOworICAgICAgICBzcmNWID0gc3JjVl90bXA7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYWxwaGFfY2hyb21hX2tleV9wbGFuYXJfeXV2X2F5dXYgKGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lLCBHc3RBbHBoYSAqIGFscGhhKQoreworICBndWludDggKmRlc3Q7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCBiX2FscGhhID0gQ0xBTVAgKChnaW50KSAoYWxwaGEtPmFscGhhICogMjU1KSwgMCwgMjU1KTsKKyAgY29uc3QgZ3VpbnQ4ICpzcmNZLCAqc3JjWV90bXA7CisgIGNvbnN0IGd1aW50OCAqc3JjVSwgKnNyY1VfdG1wOworICBjb25zdCBndWludDggKnNyY1YsICpzcmNWX3RtcDsKKyAgZ2ludCBpLCBqOworICBnaW50IGEsIHksIHUsIHY7CisgIGdpbnQgeV9zdHJpZGUsIHV2X3N0cmlkZTsKKyAgZ2ludCB2X3N1YnMsIGhfc3ViczsKKyAgZ2ludCBzbWluID0gMTI4IC0gYWxwaGEtPmJsYWNrX3NlbnNpdGl2aXR5OworICBnaW50IHNtYXggPSAxMjggKyBhbHBoYS0+d2hpdGVfc2Vuc2l0aXZpdHk7CisgIGdpbnQ4IGNiID0gYWxwaGEtPmNiLCBjciA9IGFscGhhLT5jcjsKKyAgZ2ludDgga2cgPSBhbHBoYS0+a2c7CisgIGd1aW50OCBhY2NlcHRfYW5nbGVfdGcgPSBhbHBoYS0+YWNjZXB0X2FuZ2xlX3RnOworICBndWludDggYWNjZXB0X2FuZ2xlX2N0ZyA9IGFscGhhLT5hY2NlcHRfYW5nbGVfY3RnOworICBndWludDggb25lX292ZXJfa2MgPSBhbHBoYS0+b25lX292ZXJfa2M7CisgIGd1aW50OCBrZmd5X3NjYWxlID0gYWxwaGEtPmtmZ3lfc2NhbGU7CisgIGd1aW50IG5vaXNlX2xldmVsMiA9IGFscGhhLT5ub2lzZV9sZXZlbDI7CisKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKTsKKworICB5X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoaW5fZnJhbWUsIDApOworICB1dl9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGluX2ZyYW1lLCAxKTsKKworICBzcmNZX3RtcCA9IHNyY1kgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChpbl9mcmFtZSwgMCk7CisgIHNyY1VfdG1wID0gc3JjVSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGluX2ZyYW1lLCAxKTsKKyAgc3JjVl90bXAgPSBzcmNWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoaW5fZnJhbWUsIDIpOworCisgIHN3aXRjaCAoR1NUX1ZJREVPX0ZSQU1FX0ZPUk1BVCAoaW5fZnJhbWUpKSB7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWMTI6CisgICAgICB2X3N1YnMgPSBoX3N1YnMgPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0NDQ6CisgICAgICB2X3N1YnMgPSBoX3N1YnMgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MkI6CisgICAgICB2X3N1YnMgPSAxOworICAgICAgaF9zdWJzID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDFCOgorICAgICAgdl9zdWJzID0gMTsKKyAgICAgIGhfc3VicyA9IDQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICByZXR1cm47CisgIH0KKworICBpZiAoYWxwaGEtPmluX3NkdHYgPT0gYWxwaGEtPm91dF9zZHR2KSB7CisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICBhID0gYl9hbHBoYTsKKyAgICAgICAgeSA9IHNyY1lbMF07CisgICAgICAgIHUgPSBzcmNVWzBdIC0gMTI4OworICAgICAgICB2ID0gc3JjVlswXSAtIDEyODsKKworICAgICAgICBhID0gY2hyb21hX2tleWluZ195dXYgKGEsICZ5LCAmdSwgJnYsIGNyLCBjYiwgc21pbiwKKyAgICAgICAgICAgIHNtYXgsIGFjY2VwdF9hbmdsZV90ZywgYWNjZXB0X2FuZ2xlX2N0ZywKKyAgICAgICAgICAgIG9uZV9vdmVyX2tjLCBrZmd5X3NjYWxlLCBrZywgbm9pc2VfbGV2ZWwyKTsKKworICAgICAgICB1ICs9IDEyODsKKyAgICAgICAgdiArPSAxMjg7CisKKyAgICAgICAgZGVzdFswXSA9IGE7CisgICAgICAgIGRlc3RbMV0gPSB5OworICAgICAgICBkZXN0WzJdID0gdTsKKyAgICAgICAgZGVzdFszXSA9IHY7CisKKyAgICAgICAgZGVzdCArPSA0OworICAgICAgICBzcmNZKys7CisgICAgICAgIGlmICgoaiArIDEpICUgaF9zdWJzID09IDApIHsKKyAgICAgICAgICBzcmNVKys7CisgICAgICAgICAgc3JjVisrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHNyY1lfdG1wID0gc3JjWSA9IHNyY1lfdG1wICsgeV9zdHJpZGU7CisgICAgICBpZiAoKGkgKyAxKSAlIHZfc3VicyA9PSAwKSB7CisgICAgICAgIHNyY1VfdG1wID0gc3JjVSA9IHNyY1VfdG1wICsgdXZfc3RyaWRlOworICAgICAgICBzcmNWX3RtcCA9IHNyY1YgPSBzcmNWX3RtcCArIHV2X3N0cmlkZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyY1UgPSBzcmNVX3RtcDsKKyAgICAgICAgc3JjViA9IHNyY1ZfdG1wOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBnaW50IG1hdHJpeFsxMl07CisKKyAgICBtZW1jcHkgKG1hdHJpeCwKKyAgICAgICAgYWxwaGEtPm91dF9zZHR2ID8gY29nX3ljYmNyX2hkdHZfdG9feWNiY3Jfc2R0dl9tYXRyaXhfOGJpdCA6CisgICAgICAgIGNvZ195Y2Jjcl9zZHR2X3RvX3ljYmNyX2hkdHZfbWF0cml4XzhiaXQsIDEyICogc2l6ZW9mIChnaW50KSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgIGEgPSBiX2FscGhhOworICAgICAgICB5ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHNyY1lbMF0sIHNyY1VbMF0sIHNyY1ZbMF0pOworICAgICAgICB1ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHNyY1lbMF0sIHNyY1VbMF0sIHNyY1ZbMF0pIC0gMTI4OworICAgICAgICB2ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHNyY1lbMF0sIHNyY1VbMF0sIHNyY1ZbMF0pIC0gMTI4OworCisgICAgICAgIGEgPSBjaHJvbWFfa2V5aW5nX3l1diAoYSwgJnksICZ1LCAmdiwgY3IsIGNiLCBzbWluLAorICAgICAgICAgICAgc21heCwgYWNjZXB0X2FuZ2xlX3RnLCBhY2NlcHRfYW5nbGVfY3RnLAorICAgICAgICAgICAgb25lX292ZXJfa2MsIGtmZ3lfc2NhbGUsIGtnLCBub2lzZV9sZXZlbDIpOworCisgICAgICAgIGRlc3RbMF0gPSBhOworICAgICAgICBkZXN0WzFdID0geTsKKyAgICAgICAgZGVzdFsyXSA9IHUgKyAxMjg7CisgICAgICAgIGRlc3RbM10gPSB2ICsgMTI4OworCisgICAgICAgIGRlc3QgKz0gNDsKKyAgICAgICAgc3JjWSsrOworICAgICAgICBpZiAoKGogKyAxKSAlIGhfc3VicyA9PSAwKSB7CisgICAgICAgICAgc3JjVSsrOworICAgICAgICAgIHNyY1YrKzsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBzcmNZX3RtcCA9IHNyY1kgPSBzcmNZX3RtcCArIHlfc3RyaWRlOworICAgICAgaWYgKChpICsgMSkgJSB2X3N1YnMgPT0gMCkgeworICAgICAgICBzcmNVX3RtcCA9IHNyY1UgPSBzcmNVX3RtcCArIHV2X3N0cmlkZTsKKyAgICAgICAgc3JjVl90bXAgPSBzcmNWID0gc3JjVl90bXAgKyB1dl9zdHJpZGU7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcmNVID0gc3JjVV90bXA7CisgICAgICAgIHNyY1YgPSBzcmNWX3RtcDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9zZXRfcGxhbmFyX3l1dl9hcmdiIChjb25zdCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSwgR3N0QWxwaGEgKiBhbHBoYSkKK3sKKyAgZ3VpbnQ4ICpkZXN0OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgYl9hbHBoYSA9IENMQU1QICgoZ2ludCkgKGFscGhhLT5hbHBoYSAqIDI1NSksIDAsIDI1NSk7CisgIGNvbnN0IGd1aW50OCAqc3JjWSwgKnNyY1lfdG1wOworICBjb25zdCBndWludDggKnNyY1UsICpzcmNVX3RtcDsKKyAgY29uc3QgZ3VpbnQ4ICpzcmNWLCAqc3JjVl90bXA7CisgIGdpbnQgaSwgajsKKyAgZ2ludCB5X3N0cmlkZSwgdXZfc3RyaWRlOworICBnaW50IHZfc3VicywgaF9zdWJzOworICBnaW50IG1hdHJpeFsxMl07CisgIGdpbnQgYSwgeSwgdSwgdjsKKyAgZ2ludCByLCBnLCBiOworICBnaW50IHBbNF07CisKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKTsKKworICBwWzBdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAzKTsKKyAgcFsxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMCk7CisgIHBbMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDEpOworICBwWzNdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAyKTsKKworICB5X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoaW5fZnJhbWUsIDApOworICB1dl9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGluX2ZyYW1lLCAxKTsKKworICBzcmNZX3RtcCA9IHNyY1kgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChpbl9mcmFtZSwgMCk7CisgIHNyY1VfdG1wID0gc3JjVSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGluX2ZyYW1lLCAxKTsKKyAgc3JjVl90bXAgPSBzcmNWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoaW5fZnJhbWUsIDIpOworCisgIHN3aXRjaCAoR1NUX1ZJREVPX0ZSQU1FX0ZPUk1BVCAoaW5fZnJhbWUpKSB7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWMTI6CisgICAgICB2X3N1YnMgPSBoX3N1YnMgPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0NDQ6CisgICAgICB2X3N1YnMgPSBoX3N1YnMgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MkI6CisgICAgICB2X3N1YnMgPSAxOworICAgICAgaF9zdWJzID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDFCOgorICAgICAgdl9zdWJzID0gMTsKKyAgICAgIGhfc3VicyA9IDQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICByZXR1cm47CisgIH0KKworICBtZW1jcHkgKG1hdHJpeCwKKyAgICAgIGFscGhhLT5pbl9zZHR2ID8gY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9zZHR2IDoKKyAgICAgIGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfaGR0diwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKworICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgYSA9IGJfYWxwaGE7CisgICAgICB5ID0gc3JjWVswXTsKKyAgICAgIHUgPSBzcmNVWzBdOworICAgICAgdiA9IHNyY1ZbMF07CisKKyAgICAgIGRlc3RbcFswXV0gPSBhOworICAgICAgciA9IEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5LCB1LCB2KTsKKyAgICAgIGcgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeSwgdSwgdik7CisgICAgICBiID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHksIHUsIHYpOworICAgICAgZGVzdFtwWzFdXSA9IENMQU1QIChyLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzJdXSA9IENMQU1QIChnLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzNdXSA9IENMQU1QIChiLCAwLCAyNTUpOworCisgICAgICBkZXN0ICs9IDQ7CisgICAgICBzcmNZKys7CisgICAgICBpZiAoKGogKyAxKSAlIGhfc3VicyA9PSAwKSB7CisgICAgICAgIHNyY1UrKzsKKyAgICAgICAgc3JjVisrOworICAgICAgfQorICAgIH0KKworICAgIHNyY1lfdG1wID0gc3JjWSA9IHNyY1lfdG1wICsgeV9zdHJpZGU7CisgICAgaWYgKChpICsgMSkgJSB2X3N1YnMgPT0gMCkgeworICAgICAgc3JjVV90bXAgPSBzcmNVID0gc3JjVV90bXAgKyB1dl9zdHJpZGU7CisgICAgICBzcmNWX3RtcCA9IHNyY1YgPSBzcmNWX3RtcCArIHV2X3N0cmlkZTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjVSA9IHNyY1VfdG1wOworICAgICAgc3JjViA9IHNyY1ZfdG1wOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2FscGhhX2Nocm9tYV9rZXlfcGxhbmFyX3l1dl9hcmdiIChjb25zdCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSwgR3N0QWxwaGEgKiBhbHBoYSkKK3sKKyAgZ3VpbnQ4ICpkZXN0OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgYl9hbHBoYSA9IENMQU1QICgoZ2ludCkgKGFscGhhLT5hbHBoYSAqIDI1NSksIDAsIDI1NSk7CisgIGNvbnN0IGd1aW50OCAqc3JjWSwgKnNyY1lfdG1wOworICBjb25zdCBndWludDggKnNyY1UsICpzcmNVX3RtcDsKKyAgY29uc3QgZ3VpbnQ4ICpzcmNWLCAqc3JjVl90bXA7CisgIGdpbnQgaSwgajsKKyAgZ2ludCBhLCB5LCB1LCB2OworICBnaW50IHIsIGcsIGI7CisgIGdpbnQgeV9zdHJpZGUsIHV2X3N0cmlkZTsKKyAgZ2ludCB2X3N1YnMsIGhfc3ViczsKKyAgZ2ludCBzbWluID0gMTI4IC0gYWxwaGEtPmJsYWNrX3NlbnNpdGl2aXR5OworICBnaW50IHNtYXggPSAxMjggKyBhbHBoYS0+d2hpdGVfc2Vuc2l0aXZpdHk7CisgIGdpbnQ4IGNiID0gYWxwaGEtPmNiLCBjciA9IGFscGhhLT5jcjsKKyAgZ2ludDgga2cgPSBhbHBoYS0+a2c7CisgIGd1aW50OCBhY2NlcHRfYW5nbGVfdGcgPSBhbHBoYS0+YWNjZXB0X2FuZ2xlX3RnOworICBndWludDggYWNjZXB0X2FuZ2xlX2N0ZyA9IGFscGhhLT5hY2NlcHRfYW5nbGVfY3RnOworICBndWludDggb25lX292ZXJfa2MgPSBhbHBoYS0+b25lX292ZXJfa2M7CisgIGd1aW50OCBrZmd5X3NjYWxlID0gYWxwaGEtPmtmZ3lfc2NhbGU7CisgIGd1aW50IG5vaXNlX2xldmVsMiA9IGFscGhhLT5ub2lzZV9sZXZlbDI7CisgIGdpbnQgbWF0cml4WzEyXTsKKyAgZ2ludCBwWzRdOworCisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSk7CisKKyAgcFswXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMyk7CisgIHBbMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDApOworICBwWzJdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAxKTsKKyAgcFszXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMik7CisKKyAgeV9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGluX2ZyYW1lLCAwKTsKKyAgdXZfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChpbl9mcmFtZSwgMSk7CisKKyAgc3JjWV90bXAgPSBzcmNZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoaW5fZnJhbWUsIDApOworICBzcmNVX3RtcCA9IHNyY1UgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChpbl9mcmFtZSwgMSk7CisgIHNyY1ZfdG1wID0gc3JjViA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGluX2ZyYW1lLCAyKTsKKworICBzd2l0Y2ggKEdTVF9WSURFT19GUkFNRV9GT1JNQVQgKGluX2ZyYW1lKSkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9JNDIwOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVjEyOgorICAgICAgdl9zdWJzID0gaF9zdWJzID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDQ0OgorICAgICAgdl9zdWJzID0gaF9zdWJzID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOgorICAgICAgdl9zdWJzID0gMTsKKyAgICAgIGhfc3VicyA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQxQjoKKyAgICAgIHZfc3VicyA9IDE7CisgICAgICBoX3N1YnMgPSA0OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgcmV0dXJuOworICB9CisKKyAgbWVtY3B5IChtYXRyaXgsCisgICAgICBhbHBoYS0+aW5fc2R0diA/IGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfc2R0diA6CisgICAgICBjb2dfeWNiY3JfdG9fcmdiX21hdHJpeF84Yml0X2hkdHYsIDEyICogc2l6ZW9mIChnaW50KSk7CisKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgIGEgPSBiX2FscGhhOworICAgICAgeSA9IHNyY1lbMF07CisgICAgICB1ID0gc3JjVVswXSAtIDEyODsKKyAgICAgIHYgPSBzcmNWWzBdIC0gMTI4OworCisgICAgICBhID0gY2hyb21hX2tleWluZ195dXYgKGEsICZ5LCAmdSwgJnYsIGNyLCBjYiwgc21pbiwKKyAgICAgICAgICBzbWF4LCBhY2NlcHRfYW5nbGVfdGcsIGFjY2VwdF9hbmdsZV9jdGcsCisgICAgICAgICAgb25lX292ZXJfa2MsIGtmZ3lfc2NhbGUsIGtnLCBub2lzZV9sZXZlbDIpOworCisgICAgICB1ICs9IDEyODsKKyAgICAgIHYgKz0gMTI4OworCisgICAgICBkZXN0W3BbMF1dID0gYTsKKyAgICAgIHIgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeSwgdSwgdik7CisgICAgICBnID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHksIHUsIHYpOworICAgICAgYiA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5LCB1LCB2KTsKKyAgICAgIGRlc3RbcFsxXV0gPSBDTEFNUCAociwgMCwgMjU1KTsKKyAgICAgIGRlc3RbcFsyXV0gPSBDTEFNUCAoZywgMCwgMjU1KTsKKyAgICAgIGRlc3RbcFszXV0gPSBDTEFNUCAoYiwgMCwgMjU1KTsKKworICAgICAgZGVzdCArPSA0OworICAgICAgc3JjWSsrOworICAgICAgaWYgKChqICsgMSkgJSBoX3N1YnMgPT0gMCkgeworICAgICAgICBzcmNVKys7CisgICAgICAgIHNyY1YrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzcmNZX3RtcCA9IHNyY1kgPSBzcmNZX3RtcCArIHlfc3RyaWRlOworICAgIGlmICgoaSArIDEpICUgdl9zdWJzID09IDApIHsKKyAgICAgIHNyY1VfdG1wID0gc3JjVSA9IHNyY1VfdG1wICsgdXZfc3RyaWRlOworICAgICAgc3JjVl90bXAgPSBzcmNWID0gc3JjVl90bXAgKyB1dl9zdHJpZGU7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY1UgPSBzcmNVX3RtcDsKKyAgICAgIHNyY1YgPSBzcmNWX3RtcDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9zZXRfcGFja2VkXzQyMl9heXV2IChjb25zdCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSwgR3N0QWxwaGEgKiBhbHBoYSkKK3sKKyAgY29uc3QgZ3VpbnQ4ICpzcmM7CisgIGd1aW50OCAqZGVzdDsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnaW50IHNfYWxwaGEgPSBDTEFNUCAoKGdpbnQpIChhbHBoYS0+YWxwaGEgKiAyNTUpLCAwLCAyNTUpOworICBnaW50IGksIGo7CisgIGdpbnQgeSwgdSwgdjsKKyAgZ2ludCBwWzRdOyAgICAgICAgICAgICAgICAgICAgLyogWSBVIFkgViAqLworICBnaW50IHNyY19zdHJpZGU7CisgIGNvbnN0IGd1aW50OCAqc3JjX3RtcDsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworCisgIHNyY19zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGluX2ZyYW1lLCAwKTsKKworICBwWzBdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAoaW5fZnJhbWUsIDApOworICBwWzJdID0gcFswXSArIDI7CisgIHBbMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMSk7CisgIHBbM10gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMik7CisKKyAgaWYgKGFscGhhLT5pbl9zZHR2ICE9IGFscGhhLT5vdXRfc2R0dikgeworICAgIGdpbnQgbWF0cml4WzEyXTsKKworICAgIG1lbWNweSAobWF0cml4LAorICAgICAgICBhbHBoYS0+aW5fc2R0diA/IGNvZ195Y2Jjcl9zZHR2X3RvX3ljYmNyX2hkdHZfbWF0cml4XzhiaXQgOgorICAgICAgICBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICBzcmNfdG1wID0gc3JjOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGggLSAxOyBqICs9IDIpIHsKKyAgICAgICAgZGVzdFswXSA9IHNfYWxwaGE7CisgICAgICAgIGRlc3RbNF0gPSBzX2FscGhhOworCisgICAgICAgIHkgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgc3JjW3BbMF1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSk7CisgICAgICAgIHUgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgc3JjW3BbMF1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSk7CisgICAgICAgIHYgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgc3JjW3BbMF1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSk7CisKKyAgICAgICAgZGVzdFsxXSA9IHk7CisgICAgICAgIGRlc3RbMl0gPSB1OworICAgICAgICBkZXN0WzNdID0gdjsKKworICAgICAgICB5ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHNyY1twWzJdXSwgc3JjW3BbMV1dLCBzcmNbcFszXV0pOworICAgICAgICB1ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHNyY1twWzJdXSwgc3JjW3BbMV1dLCBzcmNbcFszXV0pOworICAgICAgICB2ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHNyY1twWzJdXSwgc3JjW3BbMV1dLCBzcmNbcFszXV0pOworCisgICAgICAgIGRlc3RbNV0gPSB5OworICAgICAgICBkZXN0WzZdID0gdTsKKyAgICAgICAgZGVzdFs3XSA9IHY7CisKKyAgICAgICAgZGVzdCArPSA4OworICAgICAgICBzcmMgKz0gNDsKKyAgICAgIH0KKworICAgICAgaWYgKGogPT0gd2lkdGggLSAxKSB7CisgICAgICAgIGRlc3RbMF0gPSBzX2FscGhhOworCisgICAgICAgIHkgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgc3JjW3BbMF1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSk7CisgICAgICAgIHUgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgc3JjW3BbMF1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSk7CisgICAgICAgIHYgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgc3JjW3BbMF1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSk7CisKKyAgICAgICAgZGVzdFsxXSA9IHk7CisgICAgICAgIGRlc3RbMl0gPSB1OworICAgICAgICBkZXN0WzNdID0gdjsKKworICAgICAgICBkZXN0ICs9IDQ7CisgICAgICB9CisKKyAgICAgIHNyYyA9IHNyY190bXAgKyBzcmNfc3RyaWRlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgIHNyY190bXAgPSBzcmM7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aCAtIDE7IGogKz0gMikgeworICAgICAgICBkZXN0WzBdID0gc19hbHBoYTsKKyAgICAgICAgZGVzdFs0XSA9IHNfYWxwaGE7CisKKyAgICAgICAgeSA9IHNyY1twWzBdXTsKKyAgICAgICAgdSA9IHNyY1twWzFdXTsKKyAgICAgICAgdiA9IHNyY1twWzNdXTsKKworICAgICAgICBkZXN0WzFdID0geTsKKyAgICAgICAgZGVzdFsyXSA9IHU7CisgICAgICAgIGRlc3RbM10gPSB2OworCisgICAgICAgIHkgPSBzcmNbcFsyXV07CisKKyAgICAgICAgZGVzdFs1XSA9IHk7CisgICAgICAgIGRlc3RbNl0gPSB1OworICAgICAgICBkZXN0WzddID0gdjsKKworICAgICAgICBkZXN0ICs9IDg7CisgICAgICAgIHNyYyArPSA0OworICAgICAgfQorCisgICAgICBpZiAoaiA9PSB3aWR0aCAtIDEpIHsKKyAgICAgICAgZGVzdFswXSA9IHNfYWxwaGE7CisKKyAgICAgICAgeSA9IHNyY1twWzBdXTsKKyAgICAgICAgdSA9IHNyY1twWzFdXTsKKyAgICAgICAgdiA9IHNyY1twWzNdXTsKKworICAgICAgICBkZXN0WzFdID0geTsKKyAgICAgICAgZGVzdFsyXSA9IHU7CisgICAgICAgIGRlc3RbM10gPSB2OworCisgICAgICAgIGRlc3QgKz0gNDsKKyAgICAgIH0KKworICAgICAgc3JjID0gc3JjX3RtcCArIHNyY19zdHJpZGU7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYWxwaGFfY2hyb21hX2tleV9wYWNrZWRfNDIyX2F5dXYgKGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lLCBHc3RBbHBoYSAqIGFscGhhKQoreworICBjb25zdCBndWludDggKnNyYzsKKyAgZ3VpbnQ4ICpkZXN0OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgaSwgajsKKyAgZ2ludCBhLCB5LCB1LCB2OworICBnaW50IHNtaW4sIHNtYXg7CisgIGdpbnQgcGEgPSBDTEFNUCAoKGdpbnQpIChhbHBoYS0+YWxwaGEgKiAyNTUpLCAwLCAyNTUpOworICBnaW50OCBjYiA9IGFscGhhLT5jYiwgY3IgPSBhbHBoYS0+Y3I7CisgIGdpbnQ4IGtnID0gYWxwaGEtPmtnOworICBndWludDggYWNjZXB0X2FuZ2xlX3RnID0gYWxwaGEtPmFjY2VwdF9hbmdsZV90ZzsKKyAgZ3VpbnQ4IGFjY2VwdF9hbmdsZV9jdGcgPSBhbHBoYS0+YWNjZXB0X2FuZ2xlX2N0ZzsKKyAgZ3VpbnQ4IG9uZV9vdmVyX2tjID0gYWxwaGEtPm9uZV9vdmVyX2tjOworICBndWludDgga2ZneV9zY2FsZSA9IGFscGhhLT5rZmd5X3NjYWxlOworICBndWludCBub2lzZV9sZXZlbDIgPSBhbHBoYS0+bm9pc2VfbGV2ZWwyOworICBnaW50IHBbNF07ICAgICAgICAgICAgICAgICAgICAvKiBZIFUgWSBWICovCisgIGdpbnQgc3JjX3N0cmlkZTsKKyAgY29uc3QgZ3VpbnQ4ICpzcmNfdG1wOworCisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSk7CisKKyAgc3JjX3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoaW5fZnJhbWUsIDApOworCisgIHBbMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMCk7CisgIHBbMl0gPSBwWzBdICsgMjsKKyAgcFsxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAxKTsKKyAgcFszXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAyKTsKKworICBzbWluID0gMTI4IC0gYWxwaGEtPmJsYWNrX3NlbnNpdGl2aXR5OworICBzbWF4ID0gMTI4ICsgYWxwaGEtPndoaXRlX3NlbnNpdGl2aXR5OworCisgIGlmIChhbHBoYS0+aW5fc2R0diAhPSBhbHBoYS0+b3V0X3NkdHYpIHsKKyAgICBnaW50IG1hdHJpeFsxMl07CisKKyAgICBtZW1jcHkgKG1hdHJpeCwKKyAgICAgICAgYWxwaGEtPmluX3NkdHYgPyBjb2dfeWNiY3Jfc2R0dl90b195Y2Jjcl9oZHR2X21hdHJpeF84Yml0IDoKKyAgICAgICAgY29nX3ljYmNyX2hkdHZfdG9feWNiY3Jfc2R0dl9tYXRyaXhfOGJpdCwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgc3JjX3RtcCA9IHNyYzsKKworICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoIC0gMTsgaiArPSAyKSB7CisgICAgICAgIHkgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgc3JjW3BbMF1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSk7CisgICAgICAgIHUgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgc3JjW3BbMF1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSkgLSAxMjg7CisgICAgICAgIHYgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgc3JjW3BbMF1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSkgLSAxMjg7CisKKyAgICAgICAgYSA9IGNocm9tYV9rZXlpbmdfeXV2IChwYSwgJnksICZ1LCAmdiwgY3IsIGNiLAorICAgICAgICAgICAgc21pbiwgc21heCwgYWNjZXB0X2FuZ2xlX3RnLCBhY2NlcHRfYW5nbGVfY3RnLAorICAgICAgICAgICAgb25lX292ZXJfa2MsIGtmZ3lfc2NhbGUsIGtnLCBub2lzZV9sZXZlbDIpOworCisgICAgICAgIGRlc3RbMF0gPSBhOworICAgICAgICBkZXN0WzFdID0geTsKKyAgICAgICAgZGVzdFsyXSA9IHUgKyAxMjg7CisgICAgICAgIGRlc3RbM10gPSB2ICsgMTI4OworCisgICAgICAgIHkgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgc3JjW3BbMl1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSk7CisgICAgICAgIHUgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgc3JjW3BbMl1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSkgLSAxMjg7CisgICAgICAgIHYgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgc3JjW3BbMl1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSkgLSAxMjg7CisKKyAgICAgICAgYSA9IGNocm9tYV9rZXlpbmdfeXV2IChwYSwgJnksICZ1LCAmdiwgY3IsIGNiLAorICAgICAgICAgICAgc21pbiwgc21heCwgYWNjZXB0X2FuZ2xlX3RnLCBhY2NlcHRfYW5nbGVfY3RnLAorICAgICAgICAgICAgb25lX292ZXJfa2MsIGtmZ3lfc2NhbGUsIGtnLCBub2lzZV9sZXZlbDIpOworCisgICAgICAgIGRlc3RbNF0gPSBhOworICAgICAgICBkZXN0WzVdID0geTsKKyAgICAgICAgZGVzdFs2XSA9IHUgKyAxMjg7CisgICAgICAgIGRlc3RbN10gPSB2ICsgMTI4OworCisgICAgICAgIGRlc3QgKz0gODsKKyAgICAgICAgc3JjICs9IDQ7CisgICAgICB9CisKKyAgICAgIGlmIChqID09IHdpZHRoIC0gMSkgeworICAgICAgICB5ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHNyY1twWzBdXSwgc3JjW3BbMV1dLCBzcmNbcFszXV0pOworICAgICAgICB1ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHNyY1twWzBdXSwgc3JjW3BbMV1dLCBzcmNbcFszXV0pIC0gMTI4OworICAgICAgICB2ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHNyY1twWzBdXSwgc3JjW3BbMV1dLCBzcmNbcFszXV0pIC0gMTI4OworCisgICAgICAgIGEgPSBjaHJvbWFfa2V5aW5nX3l1diAocGEsICZ5LCAmdSwgJnYsIGNyLCBjYiwKKyAgICAgICAgICAgIHNtaW4sIHNtYXgsIGFjY2VwdF9hbmdsZV90ZywgYWNjZXB0X2FuZ2xlX2N0ZywKKyAgICAgICAgICAgIG9uZV9vdmVyX2tjLCBrZmd5X3NjYWxlLCBrZywgbm9pc2VfbGV2ZWwyKTsKKworICAgICAgICBkZXN0WzBdID0gYTsKKyAgICAgICAgZGVzdFsxXSA9IHk7CisgICAgICAgIGRlc3RbMl0gPSB1ICsgMTI4OworICAgICAgICBkZXN0WzNdID0gdiArIDEyODsKKworICAgICAgICBkZXN0ICs9IDQ7CisgICAgICB9CisKKyAgICAgIHNyYyA9IHNyY190bXAgKyBzcmNfc3RyaWRlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgIHNyY190bXAgPSBzcmM7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aCAtIDE7IGogKz0gMikgeworICAgICAgICB5ID0gc3JjW3BbMF1dOworICAgICAgICB1ID0gc3JjW3BbMV1dIC0gMTI4OworICAgICAgICB2ID0gc3JjW3BbM11dIC0gMTI4OworCisgICAgICAgIGEgPSBjaHJvbWFfa2V5aW5nX3l1diAocGEsICZ5LCAmdSwgJnYsIGNyLCBjYiwKKyAgICAgICAgICAgIHNtaW4sIHNtYXgsIGFjY2VwdF9hbmdsZV90ZywgYWNjZXB0X2FuZ2xlX2N0ZywKKyAgICAgICAgICAgIG9uZV9vdmVyX2tjLCBrZmd5X3NjYWxlLCBrZywgbm9pc2VfbGV2ZWwyKTsKKworICAgICAgICBkZXN0WzBdID0gYTsKKyAgICAgICAgZGVzdFsxXSA9IHk7CisgICAgICAgIGRlc3RbMl0gPSB1ICsgMTI4OworICAgICAgICBkZXN0WzNdID0gdiArIDEyODsKKworICAgICAgICB5ID0gc3JjW3BbMl1dOworICAgICAgICB1ID0gc3JjW3BbMV1dIC0gMTI4OworICAgICAgICB2ID0gc3JjW3BbM11dIC0gMTI4OworCisgICAgICAgIGEgPSBjaHJvbWFfa2V5aW5nX3l1diAocGEsICZ5LCAmdSwgJnYsIGNyLCBjYiwKKyAgICAgICAgICAgIHNtaW4sIHNtYXgsIGFjY2VwdF9hbmdsZV90ZywgYWNjZXB0X2FuZ2xlX2N0ZywKKyAgICAgICAgICAgIG9uZV9vdmVyX2tjLCBrZmd5X3NjYWxlLCBrZywgbm9pc2VfbGV2ZWwyKTsKKworICAgICAgICBkZXN0WzRdID0gYTsKKyAgICAgICAgZGVzdFs1XSA9IHk7CisgICAgICAgIGRlc3RbNl0gPSB1ICsgMTI4OworICAgICAgICBkZXN0WzddID0gdiArIDEyODsKKworICAgICAgICBkZXN0ICs9IDg7CisgICAgICAgIHNyYyArPSA0OworICAgICAgfQorCisgICAgICBpZiAoaiA9PSB3aWR0aCAtIDEpIHsKKyAgICAgICAgeSA9IHNyY1twWzBdXTsKKyAgICAgICAgdSA9IHNyY1twWzFdXSAtIDEyODsKKyAgICAgICAgdiA9IHNyY1twWzNdXSAtIDEyODsKKworICAgICAgICBhID0gY2hyb21hX2tleWluZ195dXYgKHBhLCAmeSwgJnUsICZ2LCBjciwgY2IsCisgICAgICAgICAgICBzbWluLCBzbWF4LCBhY2NlcHRfYW5nbGVfdGcsIGFjY2VwdF9hbmdsZV9jdGcsCisgICAgICAgICAgICBvbmVfb3Zlcl9rYywga2ZneV9zY2FsZSwga2csIG5vaXNlX2xldmVsMik7CisKKyAgICAgICAgZGVzdFswXSA9IGE7CisgICAgICAgIGRlc3RbMV0gPSB5OworICAgICAgICBkZXN0WzJdID0gdSArIDEyODsKKyAgICAgICAgZGVzdFszXSA9IHYgKyAxMjg7CisKKyAgICAgICAgZGVzdCArPSA0OworICAgICAgfQorCisgICAgICBzcmMgPSBzcmNfdG1wICsgc3JjX3N0cmlkZTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9zZXRfcGFja2VkXzQyMl9hcmdiIChjb25zdCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSwgR3N0QWxwaGEgKiBhbHBoYSkKK3sKKyAgY29uc3QgZ3VpbnQ4ICpzcmM7CisgIGd1aW50OCAqZGVzdDsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnaW50IHNfYWxwaGEgPSBDTEFNUCAoKGdpbnQpIChhbHBoYS0+YWxwaGEgKiAyNTUpLCAwLCAyNTUpOworICBnaW50IGksIGo7CisgIGdpbnQgcFs0XSwgb1s0XTsKKyAgZ2ludCBzcmNfc3RyaWRlOworICBjb25zdCBndWludDggKnNyY190bXA7CisgIGdpbnQgbWF0cml4WzEyXTsKKyAgZ2ludCByLCBnLCBiOworCisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSk7CisKKyAgc3JjX3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoaW5fZnJhbWUsIDApOworCisgIG9bMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMCk7CisgIG9bMl0gPSBvWzBdICsgMjsKKyAgb1sxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAxKTsKKyAgb1szXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAyKTsKKworICBwWzBdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAzKTsKKyAgcFsxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMCk7CisgIHBbMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDEpOworICBwWzNdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAyKTsKKworICBtZW1jcHkgKG1hdHJpeCwKKyAgICAgIGFscGhhLT5pbl9zZHR2ID8gY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9zZHR2IDoKKyAgICAgIGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfaGR0diwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKworICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICBzcmNfdG1wID0gc3JjOworCisgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoIC0gMTsgaiArPSAyKSB7CisgICAgICByID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHNyY1tvWzBdXSwgc3JjW29bMV1dLCBzcmNbb1szXV0pOworICAgICAgZyA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCBzcmNbb1swXV0sIHNyY1tvWzFdXSwgc3JjW29bM11dKTsKKyAgICAgIGIgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgc3JjW29bMF1dLCBzcmNbb1sxXV0sIHNyY1tvWzNdXSk7CisKKyAgICAgIGRlc3RbcFswXV0gPSBzX2FscGhhOworICAgICAgZGVzdFtwWzFdXSA9IENMQU1QIChyLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzJdXSA9IENMQU1QIChnLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzNdXSA9IENMQU1QIChiLCAwLCAyNTUpOworCisgICAgICByID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHNyY1tvWzJdXSwgc3JjW29bMV1dLCBzcmNbb1szXV0pOworICAgICAgZyA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCBzcmNbb1syXV0sIHNyY1tvWzFdXSwgc3JjW29bM11dKTsKKyAgICAgIGIgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgc3JjW29bMl1dLCBzcmNbb1sxXV0sIHNyY1tvWzNdXSk7CisKKyAgICAgIGRlc3RbNCArIHBbMF1dID0gc19hbHBoYTsKKyAgICAgIGRlc3RbNCArIHBbMV1dID0gQ0xBTVAgKHIsIDAsIDI1NSk7CisgICAgICBkZXN0WzQgKyBwWzJdXSA9IENMQU1QIChnLCAwLCAyNTUpOworICAgICAgZGVzdFs0ICsgcFszXV0gPSBDTEFNUCAoYiwgMCwgMjU1KTsKKworICAgICAgZGVzdCArPSA4OworICAgICAgc3JjICs9IDQ7CisgICAgfQorCisgICAgaWYgKGogPT0gd2lkdGggLSAxKSB7CisgICAgICByID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHNyY1tvWzBdXSwgc3JjW29bMV1dLCBzcmNbb1szXV0pOworICAgICAgZyA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCBzcmNbb1swXV0sIHNyY1tvWzFdXSwgc3JjW29bM11dKTsKKyAgICAgIGIgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgc3JjW29bMF1dLCBzcmNbb1sxXV0sIHNyY1tvWzNdXSk7CisKKyAgICAgIGRlc3RbcFswXV0gPSBzX2FscGhhOworICAgICAgZGVzdFtwWzFdXSA9IENMQU1QIChyLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzJdXSA9IENMQU1QIChnLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzNdXSA9IENMQU1QIChiLCAwLCAyNTUpOworCisgICAgICBkZXN0ICs9IDQ7CisgICAgfQorCisgICAgc3JjID0gc3JjX3RtcCArIHNyY19zdHJpZGU7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9jaHJvbWFfa2V5X3BhY2tlZF80MjJfYXJnYiAoY29uc3QgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLAorICAgIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUsIEdzdEFscGhhICogYWxwaGEpCit7CisgIGNvbnN0IGd1aW50OCAqc3JjOworICBndWludDggKmRlc3Q7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCBpLCBqOworICBnaW50IGEsIHksIHUsIHY7CisgIGdpbnQgciwgZywgYjsKKyAgZ2ludCBzbWluLCBzbWF4OworICBnaW50IHBhID0gQ0xBTVAgKChnaW50KSAoYWxwaGEtPmFscGhhICogMjU1KSwgMCwgMjU1KTsKKyAgZ2ludDggY2IgPSBhbHBoYS0+Y2IsIGNyID0gYWxwaGEtPmNyOworICBnaW50OCBrZyA9IGFscGhhLT5rZzsKKyAgZ3VpbnQ4IGFjY2VwdF9hbmdsZV90ZyA9IGFscGhhLT5hY2NlcHRfYW5nbGVfdGc7CisgIGd1aW50OCBhY2NlcHRfYW5nbGVfY3RnID0gYWxwaGEtPmFjY2VwdF9hbmdsZV9jdGc7CisgIGd1aW50OCBvbmVfb3Zlcl9rYyA9IGFscGhhLT5vbmVfb3Zlcl9rYzsKKyAgZ3VpbnQ4IGtmZ3lfc2NhbGUgPSBhbHBoYS0+a2ZneV9zY2FsZTsKKyAgZ3VpbnQgbm9pc2VfbGV2ZWwyID0gYWxwaGEtPm5vaXNlX2xldmVsMjsKKyAgZ2ludCBwWzRdLCBvWzRdOworICBnaW50IHNyY19zdHJpZGU7CisgIGNvbnN0IGd1aW50OCAqc3JjX3RtcDsKKyAgZ2ludCBtYXRyaXhbMTJdOworCisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSk7CisKKyAgc3JjX3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoaW5fZnJhbWUsIDApOworCisgIG9bMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMCk7CisgIG9bMl0gPSBvWzBdICsgMjsKKyAgb1sxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAxKTsKKyAgb1szXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAyKTsKKworICBwWzBdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAzKTsKKyAgcFsxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMCk7CisgIHBbMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDEpOworICBwWzNdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAyKTsKKworICBtZW1jcHkgKG1hdHJpeCwKKyAgICAgIGFscGhhLT5pbl9zZHR2ID8gY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9zZHR2IDoKKyAgICAgIGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfaGR0diwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKworICBzbWluID0gMTI4IC0gYWxwaGEtPmJsYWNrX3NlbnNpdGl2aXR5OworICBzbWF4ID0gMTI4ICsgYWxwaGEtPndoaXRlX3NlbnNpdGl2aXR5OworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgIHNyY190bXAgPSBzcmM7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGggLSAxOyBqICs9IDIpIHsKKyAgICAgIHkgPSBzcmNbb1swXV07CisgICAgICB1ID0gc3JjW29bMV1dIC0gMTI4OworICAgICAgdiA9IHNyY1tvWzNdXSAtIDEyODsKKworICAgICAgYSA9IGNocm9tYV9rZXlpbmdfeXV2IChwYSwgJnksICZ1LCAmdiwgY3IsIGNiLAorICAgICAgICAgIHNtaW4sIHNtYXgsIGFjY2VwdF9hbmdsZV90ZywgYWNjZXB0X2FuZ2xlX2N0ZywKKyAgICAgICAgICBvbmVfb3Zlcl9rYywga2ZneV9zY2FsZSwga2csIG5vaXNlX2xldmVsMik7CisgICAgICB1ICs9IDEyODsKKyAgICAgIHYgKz0gMTI4OworCisgICAgICByID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHksIHUsIHYpOworICAgICAgZyA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5LCB1LCB2KTsKKyAgICAgIGIgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeSwgdSwgdik7CisKKyAgICAgIGRlc3RbcFswXV0gPSBhOworICAgICAgZGVzdFtwWzFdXSA9IENMQU1QIChyLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzJdXSA9IENMQU1QIChnLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzNdXSA9IENMQU1QIChiLCAwLCAyNTUpOworCisgICAgICB5ID0gc3JjW29bMl1dOworICAgICAgdSA9IHNyY1tvWzFdXSAtIDEyODsKKyAgICAgIHYgPSBzcmNbb1szXV0gLSAxMjg7CisKKyAgICAgIGEgPSBjaHJvbWFfa2V5aW5nX3l1diAocGEsICZ5LCAmdSwgJnYsIGNyLCBjYiwKKyAgICAgICAgICBzbWluLCBzbWF4LCBhY2NlcHRfYW5nbGVfdGcsIGFjY2VwdF9hbmdsZV9jdGcsCisgICAgICAgICAgb25lX292ZXJfa2MsIGtmZ3lfc2NhbGUsIGtnLCBub2lzZV9sZXZlbDIpOworICAgICAgdSArPSAxMjg7CisgICAgICB2ICs9IDEyODsKKworICAgICAgciA9IEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5LCB1LCB2KTsKKyAgICAgIGcgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeSwgdSwgdik7CisgICAgICBiID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHksIHUsIHYpOworCisgICAgICBkZXN0WzQgKyBwWzBdXSA9IGE7CisgICAgICBkZXN0WzQgKyBwWzFdXSA9IENMQU1QIChyLCAwLCAyNTUpOworICAgICAgZGVzdFs0ICsgcFsyXV0gPSBDTEFNUCAoZywgMCwgMjU1KTsKKyAgICAgIGRlc3RbNCArIHBbM11dID0gQ0xBTVAgKGIsIDAsIDI1NSk7CisKKyAgICAgIGRlc3QgKz0gODsKKyAgICAgIHNyYyArPSA0OworICAgIH0KKworICAgIGlmIChqID09IHdpZHRoIC0gMSkgeworICAgICAgeSA9IHNyY1tvWzBdXTsKKyAgICAgIHUgPSBzcmNbb1sxXV0gLSAxMjg7CisgICAgICB2ID0gc3JjW29bM11dIC0gMTI4OworCisgICAgICBhID0gY2hyb21hX2tleWluZ195dXYgKHBhLCAmeSwgJnUsICZ2LCBjciwgY2IsCisgICAgICAgICAgc21pbiwgc21heCwgYWNjZXB0X2FuZ2xlX3RnLCBhY2NlcHRfYW5nbGVfY3RnLAorICAgICAgICAgIG9uZV9vdmVyX2tjLCBrZmd5X3NjYWxlLCBrZywgbm9pc2VfbGV2ZWwyKTsKKyAgICAgIHUgKz0gMTI4OworICAgICAgdiArPSAxMjg7CisKKyAgICAgIHIgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeSwgdSwgdik7CisgICAgICBnID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHksIHUsIHYpOworICAgICAgYiA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5LCB1LCB2KTsKKworICAgICAgZGVzdFtwWzBdXSA9IGE7CisgICAgICBkZXN0W3BbMV1dID0gQ0xBTVAgKHIsIDAsIDI1NSk7CisgICAgICBkZXN0W3BbMl1dID0gQ0xBTVAgKGcsIDAsIDI1NSk7CisgICAgICBkZXN0W3BbM11dID0gQ0xBTVAgKGIsIDAsIDI1NSk7CisKKyAgICAgIGRlc3QgKz0gNDsKKyAgICB9CisKKyAgICBzcmMgPSBzcmNfdG1wICsgc3JjX3N0cmlkZTsKKyAgfQorfQorCisvKiBQcm90ZWN0ZWQgd2l0aCB0aGUgYWxwaGEgbG9jayAqLworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9pbml0X3BhcmFtc19mdWxsIChHc3RBbHBoYSAqIGFscGhhLAorICAgIGNvbnN0IEdzdFZpZGVvRm9ybWF0SW5mbyAqIGluX2luZm8sIGNvbnN0IEdzdFZpZGVvRm9ybWF0SW5mbyAqIG91dF9pbmZvKQoreworICBnZmxvYXQga2dsOworICBnZmxvYXQgdG1wOworICBnZmxvYXQgdG1wMSwgdG1wMjsKKyAgZ2Zsb2F0IHk7CisgIGd1aW50IHRhcmdldF9yID0gYWxwaGEtPnRhcmdldF9yOworICBndWludCB0YXJnZXRfZyA9IGFscGhhLT50YXJnZXRfZzsKKyAgZ3VpbnQgdGFyZ2V0X2IgPSBhbHBoYS0+dGFyZ2V0X2I7CisgIGNvbnN0IGdpbnQgKm1hdHJpeDsKKworICBzd2l0Y2ggKGFscGhhLT5tZXRob2QpIHsKKyAgICBjYXNlIEFMUEhBX01FVEhPRF9HUkVFTjoKKyAgICAgIHRhcmdldF9yID0gMDsKKyAgICAgIHRhcmdldF9nID0gMjU1OworICAgICAgdGFyZ2V0X2IgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBTFBIQV9NRVRIT0RfQkxVRToKKyAgICAgIHRhcmdldF9yID0gMDsKKyAgICAgIHRhcmdldF9nID0gMDsKKyAgICAgIHRhcmdldF9iID0gMjU1OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogUkdCLT5SR0I6IGNvbnZlcnQgdG8gU0RUViBZVVYsIGNocm9tYSBrZXlpbmcsIGNvbnZlcnQgYmFjaworICAgKiBZVVYtPlJHQjogY2hyb21hIGtleWluZywgY29udmVydCB0byBSR0IKKyAgICogUkdCLT5ZVVY6IGNvbnZlcnQgdG8gWVVWLCBjaHJvbWEga2V5aW5nCisgICAqIFlVVi0+WVVWOiBjb252ZXJ0IG1hdHJpeCwgY2hyb21hIGtleWluZworICAgKi8KKyAgaWYgKEdTVF9WSURFT19GT1JNQVRfSU5GT19JU19SR0IgKGluX2luZm8pCisgICAgICAmJiBHU1RfVklERU9fRk9STUFUX0lORk9fSVNfUkdCIChvdXRfaW5mbykpCisgICAgbWF0cml4ID0gY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9zZHR2OworICBlbHNlIGlmIChHU1RfVklERU9fRk9STUFUX0lORk9fSVNfWVVWIChpbl9pbmZvKQorICAgICAgJiYgR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX0lTX1JHQiAob3V0X2luZm8pKQorICAgIG1hdHJpeCA9CisgICAgICAgIChhbHBoYS0+aW5fc2R0dikgPyBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYgOgorICAgICAgICBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X2hkdHY7CisgIGVsc2UgaWYgKEdTVF9WSURFT19GT1JNQVRfSU5GT19JU19SR0IgKGluX2luZm8pCisgICAgICAmJiBHU1RfVklERU9fRk9STUFUX0lORk9fSVNfWVVWIChvdXRfaW5mbykpCisgICAgbWF0cml4ID0KKyAgICAgICAgKGFscGhhLT5vdXRfc2R0dikgPyBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYgOgorICAgICAgICBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X2hkdHY7CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHl1diAtPiB5dXYgKi8KKyAgICBtYXRyaXggPQorICAgICAgICAoYWxwaGEtPm91dF9zZHR2KSA/IGNvZ19yZ2JfdG9feWNiY3JfbWF0cml4XzhiaXRfc2R0diA6CisgICAgICAgIGNvZ19yZ2JfdG9feWNiY3JfbWF0cml4XzhiaXRfaGR0djsKKworICB5ID0gKG1hdHJpeFswXSAqICgoZ2ludCkgdGFyZ2V0X3IpICsKKyAgICAgIG1hdHJpeFsxXSAqICgoZ2ludCkgdGFyZ2V0X2cpICsKKyAgICAgIG1hdHJpeFsyXSAqICgoZ2ludCkgdGFyZ2V0X2IpICsgbWF0cml4WzNdKSA+PiA4OworICAvKiBDYixDciB3aXRob3V0IG9mZnNldCBoZXJlIGJlY2F1c2UgdGhlIGNocm9tYSBrZXlpbmcKKyAgICogd29ya3Mgd2l0aCB0aGVtIGJlaW5nIGluIHJhbmdlIFstMTI4LDEyN10KKyAgICovCisgIHRtcDEgPQorICAgICAgKG1hdHJpeFs0XSAqICgoZ2ludCkgdGFyZ2V0X3IpICsKKyAgICAgIG1hdHJpeFs1XSAqICgoZ2ludCkgdGFyZ2V0X2cpICsgbWF0cml4WzZdICogKChnaW50KSB0YXJnZXRfYikpID4+IDg7CisgIHRtcDIgPQorICAgICAgKG1hdHJpeFs4XSAqICgoZ2ludCkgdGFyZ2V0X3IpICsKKyAgICAgIG1hdHJpeFs5XSAqICgoZ2ludCkgdGFyZ2V0X2cpICsgbWF0cml4WzEwXSAqICgoZ2ludCkgdGFyZ2V0X2IpKSA+PiA4OworCisgIGtnbCA9IHNxcnQgKHRtcDEgKiB0bXAxICsgdG1wMiAqIHRtcDIpOworICBhbHBoYS0+Y2IgPSAxMjcgKiAodG1wMSAvIGtnbCk7CisgIGFscGhhLT5jciA9IDEyNyAqICh0bXAyIC8ga2dsKTsKKworICB0bXAgPSAxNSAqIHRhbiAoTV9QSSAqIGFscGhhLT5hbmdsZSAvIDE4MCk7CisgIHRtcCA9IE1JTiAodG1wLCAyNTUpOworICBhbHBoYS0+YWNjZXB0X2FuZ2xlX3RnID0gdG1wOworICB0bXAgPSAxNSAvIHRhbiAoTV9QSSAqIGFscGhhLT5hbmdsZSAvIDE4MCk7CisgIHRtcCA9IE1JTiAodG1wLCAyNTUpOworICBhbHBoYS0+YWNjZXB0X2FuZ2xlX2N0ZyA9IHRtcDsKKyAgdG1wID0gMSAvIChrZ2wpOworICBhbHBoYS0+b25lX292ZXJfa2MgPSAyNTUgKiAyICogdG1wIC0gMjU1OworICB0bXAgPSAxNSAqIHkgLyBrZ2w7CisgIHRtcCA9IE1JTiAodG1wLCAyNTUpOworICBhbHBoYS0+a2ZneV9zY2FsZSA9IHRtcDsKKyAgYWxwaGEtPmtnID0gTUlOIChrZ2wsIDEyNyk7CisKKyAgYWxwaGEtPm5vaXNlX2xldmVsMiA9IGFscGhhLT5ub2lzZV9sZXZlbCAqIGFscGhhLT5ub2lzZV9sZXZlbDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9pbml0X3BhcmFtcyAoR3N0QWxwaGEgKiBhbHBoYSkKK3sKKyAgY29uc3QgR3N0VmlkZW9Gb3JtYXRJbmZvICpmaW5mb19pbiwgKmZpbmZvX291dDsKKworICBmaW5mb19pbiA9IEdTVF9WSURFT19GSUxURVIgKGFscGhhKS0+aW5faW5mby5maW5mbzsKKyAgZmluZm9fb3V0ID0gR1NUX1ZJREVPX0ZJTFRFUiAoYWxwaGEpLT5vdXRfaW5mby5maW5mbzsKKworICBpZiAoZmluZm9faW4gIT0gTlVMTCAmJiBmaW5mb19vdXQgIT0gTlVMTCkgeworICAgIGdzdF9hbHBoYV9pbml0X3BhcmFtc19mdWxsIChhbHBoYSwgZmluZm9faW4sIGZpbmZvX291dCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYWxwaGEsICJ2aWRlbyBmb3JtYXRzIG5vdCBzZXQgeWV0Iik7CisgIH0KK30KKworLyogUHJvdGVjdGVkIHdpdGggdGhlIGFscGhhIGxvY2sgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FscGhhX3NldF9wcm9jZXNzX2Z1bmN0aW9uX2Z1bGwgKEdzdEFscGhhICogYWxwaGEsIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sCisgICAgR3N0VmlkZW9JbmZvICogb3V0X2luZm8pCit7CisgIGFscGhhLT5wcm9jZXNzID0gTlVMTDsKKworICBzd2l0Y2ggKGFscGhhLT5tZXRob2QpIHsKKyAgICBjYXNlIEFMUEhBX01FVEhPRF9TRVQ6CisgICAgICBzd2l0Y2ggKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAob3V0X2luZm8pKSB7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgICAgIHN3aXRjaCAoR1NUX1ZJREVPX0lORk9fRk9STUFUIChpbl9pbmZvKSkgeworICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FZVVY6CisgICAgICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gZ3N0X2FscGhhX3NldF9heXV2X2F5dXY7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0NDQ6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQyQjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9JNDIwOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWMTI6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQxQjoKKyAgICAgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSBnc3RfYWxwaGFfc2V0X3BsYW5hcl95dXZfYXl1djsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVVZMjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVllVOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gZ3N0X2FscGhhX3NldF9wYWNrZWRfNDIyX2F5dXY7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FSR0I6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQUJHUjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gZ3N0X2FscGhhX3NldF9hcmdiX2F5dXY7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX3hSR0I6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeEJHUjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0J4OgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUng6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUjoKKyAgICAgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSBnc3RfYWxwaGFfc2V0X3JnYl9heXV2OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FSR0I6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BQkdSOgorICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgICAgICAgc3dpdGNoIChHU1RfVklERU9fSU5GT19GT1JNQVQgKGluX2luZm8pKSB7CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVlVVjoKKyAgICAgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSBnc3RfYWxwaGFfc2V0X2F5dXZfYXJnYjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQ0NDoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVYxMjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDFCOgorICAgICAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IGdzdF9hbHBoYV9zZXRfcGxhbmFyX3l1dl9hcmdiOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVVkyOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWWVU6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfVVlWWToKKyAgICAgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSBnc3RfYWxwaGFfc2V0X3BhY2tlZF80MjJfYXJnYjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BQkdSOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQkE6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICAgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSBnc3RfYWxwaGFfc2V0X2FyZ2JfYXJnYjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeFJHQjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94QkdSOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQng6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSeDoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSOgorICAgICAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IGdzdF9hbHBoYV9zZXRfcmdiX2FyZ2I7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBBTFBIQV9NRVRIT0RfR1JFRU46CisgICAgY2FzZSBBTFBIQV9NRVRIT0RfQkxVRToKKyAgICBjYXNlIEFMUEhBX01FVEhPRF9DVVNUT006CisgICAgICBzd2l0Y2ggKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAob3V0X2luZm8pKSB7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgICAgIHN3aXRjaCAoR1NUX1ZJREVPX0lORk9fRk9STUFUIChpbl9pbmZvKSkgeworICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FZVVY6CisgICAgICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gZ3N0X2FscGhhX2Nocm9tYV9rZXlfYXl1dl9heXV2OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDQ0OgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MkI6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfSTQyMDoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVjEyOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MUI6CisgICAgICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gZ3N0X2FscGhhX2Nocm9tYV9rZXlfcGxhbmFyX3l1dl9heXV2OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVVkyOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWWVU6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfVVlWWToKKyAgICAgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSBnc3RfYWxwaGFfY2hyb21hX2tleV9wYWNrZWRfNDIyX2F5dXY7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FSR0I6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQUJHUjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gZ3N0X2FscGhhX2Nocm9tYV9rZXlfYXJnYl9heXV2OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94UkdCOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX3hCR1I6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCeDoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1J4OgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1I6CisgICAgICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gZ3N0X2FscGhhX2Nocm9tYV9rZXlfcmdiX2F5dXY7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FCR1I6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICAgICAgICBzd2l0Y2ggKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoaW5faW5mbykpIHsKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IGdzdF9hbHBoYV9jaHJvbWFfa2V5X2F5dXZfYXJnYjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQ0NDoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVYxMjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDFCOgorICAgICAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IGdzdF9hbHBoYV9jaHJvbWFfa2V5X3BsYW5hcl95dXZfYXJnYjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVVZMjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVllVOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gZ3N0X2FscGhhX2Nocm9tYV9rZXlfcGFja2VkXzQyMl9hcmdiOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BUkdCOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FCR1I6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1JBOgorICAgICAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IGdzdF9hbHBoYV9jaHJvbWFfa2V5X2FyZ2JfYXJnYjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeFJHQjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94QkdSOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQng6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSeDoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSOgorICAgICAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IGdzdF9hbHBoYV9jaHJvbWFfa2V5X3JnYl9hcmdiOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gYWxwaGEtPnByb2Nlc3MgIT0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9zZXRfcHJvY2Vzc19mdW5jdGlvbiAoR3N0QWxwaGEgKiBhbHBoYSkKK3sKKyAgR3N0VmlkZW9JbmZvICppbmZvX2luLCAqaW5mb19vdXQ7CisKKyAgaW5mb19pbiA9ICZHU1RfVklERU9fRklMVEVSIChhbHBoYSktPmluX2luZm87CisgIGluZm9fb3V0ID0gJkdTVF9WSURFT19GSUxURVIgKGFscGhhKS0+b3V0X2luZm87CisKKyAgaWYgKGluZm9faW4tPmZpbmZvICE9IE5VTEwgJiYgaW5mb19vdXQtPmZpbmZvICE9IE5VTEwpIHsKKyAgICBnc3RfYWxwaGFfc2V0X3Byb2Nlc3NfZnVuY3Rpb25fZnVsbCAoYWxwaGEsIGluZm9faW4sIGluZm9fb3V0KTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhbHBoYSwgInZpZGVvIGZvcm1hdHMgbm90IHNldCB5ZXQiKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2FscGhhX2JlZm9yZV90cmFuc2Zvcm0gKEdzdEJhc2VUcmFuc2Zvcm0gKiBidHJhbnMsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0QWxwaGEgKmFscGhhID0gR1NUX0FMUEhBIChidHJhbnMpOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworCisgIHRpbWVzdGFtcCA9IGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmYnRyYW5zLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKSk7CisgIEdTVF9MT0cgKCJHb3Qgc3RyZWFtIHRpbWUgb2YgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApKTsKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEICh0aW1lc3RhbXApKQorICAgIGdzdF9vYmplY3Rfc3luY192YWx1ZXMgKEdTVF9PQkpFQ1QgKGFscGhhKSwgdGltZXN0YW1wKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hbHBoYV90cmFuc2Zvcm1fZnJhbWUgKEdzdFZpZGVvRmlsdGVyICogZmlsdGVyLCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSkKK3sKKyAgR3N0QWxwaGEgKmFscGhhID0gR1NUX0FMUEhBIChmaWx0ZXIpOworCisgIEdTVF9BTFBIQV9MT0NLIChhbHBoYSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFhbHBoYS0+cHJvY2VzcykpCisgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKworICBhbHBoYS0+cHJvY2VzcyAoaW5fZnJhbWUsIG91dF9mcmFtZSwgYWxwaGEpOworCisgIEdTVF9BTFBIQV9VTkxPQ0sgKGFscGhhKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVJST1JTICovCitub3RfbmVnb3RpYXRlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGFscGhhLCAiTm90IG5lZ290aWF0ZWQgeWV0Iik7CisgICAgR1NUX0FMUEhBX1VOTE9DSyAoYWxwaGEpOworICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYWxwaGEiLCBHU1RfUkFOS19OT05FLCBHU1RfVFlQRV9BTFBIQSk7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBhbHBoYSwKKyAgICAiYWRkcyBhbiBhbHBoYSBjaGFubmVsIHRvIHZpZGVvIC0gY29uc3RhbnQgb3IgdmlhIGNocm9tYS1rZXlpbmciLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L2FscGhhL2dzdGFscGhhLmggYi9nc3QvYWxwaGEvZ3N0YWxwaGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDhmYjc4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2FscGhhL2dzdGFscGhhLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0FMUEhBX0hfXworI2RlZmluZSBfX0dTVF9BTFBIQV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9maWx0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0FMUEhBIFwKKyAgKGdzdF9hbHBoYV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQUxQSEEob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9BTFBIQSxHc3RBbHBoYSkpCisjZGVmaW5lIEdTVF9BTFBIQV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9BTFBIQSxHc3RBbHBoYUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FMUEhBKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQUxQSEEpKQorI2RlZmluZSBHU1RfSVNfQUxQSEFfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfQUxQSEEpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0QWxwaGEgR3N0QWxwaGE7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QWxwaGFDbGFzcyBHc3RBbHBoYUNsYXNzOworCisvKiogCisgKiBHc3RBbHBoYU1ldGhvZDoKKyAqIEBBTFBIQV9NRVRIT0RfU0VUOiBTZXQvYWRqdXN0IGFscGhhIGNoYW5uZWwKKyAqIEBBTFBIQV9NRVRIT0RfR1JFRU46IENocm9tYSBLZXkgZ3JlZW4KKyAqIEBBTFBIQV9NRVRIT0RfQkxVRTogQ2hyb21hIEtleSBibHVlCisgKiBAQUxQSEFfTUVUSE9EX0NVU1RPTTogQ2hyb21hIEtleSBvbiB0YXJnZXRfci9nL2IKKyAqLwordHlwZWRlZiBlbnVtCit7CisgIEFMUEhBX01FVEhPRF9TRVQsCisgIEFMUEhBX01FVEhPRF9HUkVFTiwKKyAgQUxQSEFfTUVUSE9EX0JMVUUsCisgIEFMUEhBX01FVEhPRF9DVVNUT00sCit9CitHc3RBbHBoYU1ldGhvZDsKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X2FscGhhX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9hbHBoYV9kZWJ1ZworCitzdHJ1Y3QgX0dzdEFscGhhCit7CisgIEdzdFZpZGVvRmlsdGVyIHBhcmVudDsKKworICAvKiA8cHJpdmF0ZT4gKi8KKworICAvKiBjYXBzICovCisgIEdNdXRleCBsb2NrOworCisgIGdib29sZWFuIGluX3NkdHYsIG91dF9zZHR2OworCisgIC8qIHByb3BlcnRpZXMgKi8KKyAgZ2RvdWJsZSBhbHBoYTsKKworICBndWludCB0YXJnZXRfcjsKKyAgZ3VpbnQgdGFyZ2V0X2c7CisgIGd1aW50IHRhcmdldF9iOworCisgIEdzdEFscGhhTWV0aG9kIG1ldGhvZDsKKworICBnZmxvYXQgYW5nbGU7CisgIGdmbG9hdCBub2lzZV9sZXZlbDsKKyAgZ3VpbnQgYmxhY2tfc2Vuc2l0aXZpdHk7CisgIGd1aW50IHdoaXRlX3NlbnNpdGl2aXR5OworCisgIGdib29sZWFuIHByZWZlcl9wYXNzdGhyb3VnaDsKKworICAvKiBwcm9jZXNzaW5nIGZ1bmN0aW9uICovCisgIHZvaWQgKCpwcm9jZXNzKSAoY29uc3QgR3N0VmlkZW9GcmFtZSAqaW5fZnJhbWUsIEdzdFZpZGVvRnJhbWUgKm91dF9mcmFtZSwgR3N0QWxwaGEgKmFscGhhKTsKKworICAvKiBwcmVjYWxjdWxhdGVkIHZhbHVlcyBmb3IgY2hyb21hIGtleWluZyAqLworICBnaW50OCBjYiwgY3I7CisgIGdpbnQ4IGtnOworICBndWludDggYWNjZXB0X2FuZ2xlX3RnOworICBndWludDggYWNjZXB0X2FuZ2xlX2N0ZzsKKyAgZ3VpbnQ4IG9uZV9vdmVyX2tjOworICBndWludDgga2ZneV9zY2FsZTsKKyAgZ3VpbnQgbm9pc2VfbGV2ZWwyOworfTsKKworc3RydWN0IF9Hc3RBbHBoYUNsYXNzCit7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2FscGhhX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0FMUEhBX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYyBiL2dzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA4MmU3NAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmMKQEAgLTAsMCArMSw3MDcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1hbHBoYWNvbG9yCisgKgorICogVGhlIGFscGhhY29sb3IgZWxlbWVudCBkb2VzIG1lbW9yeS1lZmZpY2llbnQgKGluLXBsYWNlKSBjb2xvdXJzcGFjZQorICogY29udmVyc2lvbiBmcm9tIFJHQkEgdG8gQVlVViBvciBBWVVWIHRvIFJHQkEgd2hpbGUgcHJlc2VydmluZyB0aGUKKyAqIGFscGhhIGNoYW5uZWwuCisgKgorICogU2FtcGxlIHBpcGVsaW5lOgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHZpZGVvdGVzdHNyYyAhICJ2aWRlby94LXJhdyxmb3JtYXQ9KGZvdXJjYylBWVVWIiAhIFwKKyAqICAgYWxwaGFjb2xvciAhIHZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsKKyAqIF18CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0YWxwaGFjb2xvci5oIgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGFscGhhX2NvbG9yX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGFscGhhX2NvbG9yX2RlYnVnCisKKy8qIGVsZW1lbnRmYWN0b3J5IGluZm9ybWF0aW9uICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgUkdCQSwgQkdSQSwgQVJHQiwgQUJHUiwgQVlVViB9IikpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IFJHQkEsIEJHUkEsIEFSR0IsIEFCR1IsIEFZVVYgfSIpKQorICAgICk7CisKK0dfREVGSU5FX1RZUEUgKEdzdEFscGhhQ29sb3IsIGdzdF9hbHBoYV9jb2xvciwgR1NUX1RZUEVfVklERU9fRklMVEVSKTsKKworc3RhdGljIEdzdENhcHMgKmdzdF9hbHBoYV9jb2xvcl90cmFuc2Zvcm1fY2FwcyAoR3N0QmFzZVRyYW5zZm9ybSAqIGJ0cmFucywKKyAgICBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLCBHc3RDYXBzICogY2FwcywgR3N0Q2FwcyAqIGZpbHRlcik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYWxwaGFfY29sb3Jfc2V0X2luZm8gKEdzdFZpZGVvRmlsdGVyICogZmlsdGVyLAorICAgIEdzdENhcHMgKiBpbmNhcHMsIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIG91dF9pbmZvKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9hbHBoYV9jb2xvcl90cmFuc2Zvcm1fZnJhbWVfaXAgKEdzdFZpZGVvRmlsdGVyICoKKyAgICBmaWx0ZXIsIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSk7CisKK3N0YXRpYyB2b2lkCitnc3RfYWxwaGFfY29sb3JfY2xhc3NfaW5pdCAoR3N0QWxwaGFDb2xvckNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqZ3N0YmFzZXRyYW5zZm9ybV9jbGFzcyA9CisgICAgICAoR3N0QmFzZVRyYW5zZm9ybUNsYXNzICopIGtsYXNzOworICBHc3RWaWRlb0ZpbHRlckNsYXNzICpnc3R2aWRlb2ZpbHRlcl9jbGFzcyA9IChHc3RWaWRlb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChhbHBoYV9jb2xvcl9kZWJ1ZywgImFscGhhY29sb3IiLCAwLAorICAgICAgIkFSR0I8LT5BWVVWIGNvbG9yc3BhY2UgY29udmVyc2lvbiBwcmVzZXJ2aW5nIHRoZSBhbHBoYSBjaGFubmVscyIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJBbHBoYSBjb2xvciBmaWx0ZXIiLAorICAgICAgIkZpbHRlci9Db252ZXJ0ZXIvVmlkZW8iLAorICAgICAgIkFSR0IgZnJvbS90byBBWVVWIGNvbG9yc3BhY2UgY29udmVyc2lvbiBwcmVzZXJ2aW5nIHRoZSBhbHBoYSBjaGFubmVsIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc3JjX3RlbXBsYXRlKTsKKworICBnc3RiYXNldHJhbnNmb3JtX2NsYXNzLT50cmFuc2Zvcm1fY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FscGhhX2NvbG9yX3RyYW5zZm9ybV9jYXBzKTsKKyAgZ3N0YmFzZXRyYW5zZm9ybV9jbGFzcy0+dHJhbnNmb3JtX2lwX29uX3Bhc3N0aHJvdWdoID0gRkFMU0U7CisKKyAgZ3N0dmlkZW9maWx0ZXJfY2xhc3MtPnNldF9pbmZvID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hbHBoYV9jb2xvcl9zZXRfaW5mbyk7CisgIGdzdHZpZGVvZmlsdGVyX2NsYXNzLT50cmFuc2Zvcm1fZnJhbWVfaXAgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hbHBoYV9jb2xvcl90cmFuc2Zvcm1fZnJhbWVfaXApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2FscGhhX2NvbG9yX2luaXQgKEdzdEFscGhhQ29sb3IgKiBhbHBoYSkKK3sKKyAgR3N0QmFzZVRyYW5zZm9ybSAqYnRyYW5zID0gR1NUX0JBU0VfVFJBTlNGT1JNIChhbHBoYSk7CisKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9pbl9wbGFjZSAoYnRyYW5zLCBUUlVFKTsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X2FscGhhX2NvbG9yX3RyYW5zZm9ybV9jYXBzIChHc3RCYXNlVHJhbnNmb3JtICogYnRyYW5zLAorICAgIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdENhcHMgKiBjYXBzLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RDYXBzICp0bXBsX2NhcHMgPSBOVUxMOworICBHc3RDYXBzICpyZXN1bHQgPSBOVUxMLCAqbG9jYWxfY2FwcyA9IE5VTEw7CisgIGd1aW50IGk7CisKKyAgbG9jYWxfY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpOyBpKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZSA9CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfY29weSAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSkpOworCisgICAgLyogUmVtb3ZlIGFueSBzcGVjaWZpYyBwYXJhbWV0ZXIgZnJvbSB0aGUgc3RydWN0dXJlICovCisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHN0cnVjdHVyZSwgImZvcm1hdCIpOworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzdHJ1Y3R1cmUsICJjb2xvcmltZXRyeSIpOworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzdHJ1Y3R1cmUsICJjaHJvbWEtc2l0ZSIpOworCisgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAoc3RydWN0dXJlLCAidmlkZW8veC1yYXciKTsKKyAgICBnc3RfY2Fwc19hcHBlbmRfc3RydWN0dXJlIChsb2NhbF9jYXBzLCBzdHJ1Y3R1cmUpOworICB9CisKKyAgLyogR2V0IHRoZSBhcHByb3ByaWF0ZSB0ZW1wbGF0ZSAqLworICBpZiAoZGlyZWN0aW9uID09IEdTVF9QQURfU0lOSykgeworICAgIHRtcGxfY2FwcyA9IGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldF9jYXBzICgmc3JjX3RlbXBsYXRlKTsKKyAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gR1NUX1BBRF9TUkMpIHsKKyAgICB0bXBsX2NhcHMgPSBnc3Rfc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXRfY2FwcyAoJnNpbmtfdGVtcGxhdGUpOworICB9CisKKyAgLyogSW50ZXJzZWN0IHdpdGggb3VyIHRlbXBsYXRlIGNhcHMgKi8KKyAgcmVzdWx0ID0gZ3N0X2NhcHNfaW50ZXJzZWN0IChsb2NhbF9jYXBzLCB0bXBsX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAodG1wbF9jYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGxvY2FsX2NhcHMpOworCisgIHJlc3VsdCA9IGdzdF9jYXBzX3NpbXBsaWZ5IChyZXN1bHQpOworCisgIEdTVF9MT0dfT0JKRUNUIChidHJhbnMsICJ0cmFuc2Zvcm1lZCAlIiBHU1RfUFRSX0ZPUk1BVCAiIHRvICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgY2FwcywgcmVzdWx0KTsKKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoYnRyYW5zLCAiVXNpbmcgZmlsdGVyIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIGZpbHRlcik7CisgICAgaW50ZXJzZWN0aW9uID0KKyAgICAgICAgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgcmVzdWx0LCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmIChyZXN1bHQpOworICAgIHJlc3VsdCA9IGludGVyc2VjdGlvbjsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChidHJhbnMsICJJbnRlcnNlY3Rpb24gJSIgR1NUX1BUUl9GT1JNQVQsIHJlc3VsdCk7CisgIH0KKworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIEdlbmVyYXRlZCBieSAtYmFkL2V4dC9jb2cvZ2VuZXJhdGVfdGFibGVzICovCitzdGF0aWMgY29uc3QgaW50IGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfaGR0dltdID0geworICAyOTgsIDAsIDQ1OSwgLTYzNTE0LAorICAyOTgsIC01NSwgLTEzNiwgMTk2ODEsCisgIDI5OCwgNTQxLCAwLCAtNzM5ODgsCit9OworCitzdGF0aWMgY29uc3QgaW50IGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfc2R0dltdID0geworICAyOTgsIDAsIDQwOSwgLTU3MDY4LAorICAyOTgsIC0xMDAsIC0yMDgsIDM0NzA3LAorICAyOTgsIDUxNiwgMCwgLTcwODcwLAorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9oZHR2W10gPSB7CisgIDQ3LCAxNTcsIDE2LCA0MDk2LAorICAtMjYsIC04NywgMTEyLCAzMjc2OCwKKyAgMTEyLCAtMTAyLCAtMTAsIDMyNzY4LAorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9zZHR2W10gPSB7CisgIDY2LCAxMjksIDI1LCA0MDk2LAorICAtMzgsIC03NCwgMTEyLCAzMjc2OCwKKyAgMTEyLCAtOTQsIC0xOCwgMzI3NjgsCit9OworCitzdGF0aWMgY29uc3QgZ2ludCBjb2dfeWNiY3Jfc2R0dl90b195Y2Jjcl9oZHR2X21hdHJpeF84Yml0W10gPSB7CisgIDI1NiwgLTMwLCAtNTMsIDEwNjAwLAorICAwLCAyNjEsIDI5LCAtNDM2NywKKyAgMCwgMTksIDI2MiwgLTMyODksCit9OworCitzdGF0aWMgY29uc3QgZ2ludCBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0W10gPSB7CisgIDI1NiwgMjUsIDQ5LCAtOTUzNiwKKyAgMCwgMjUzLCAtMjgsIDM5NTgsCisgIDAsIC0xOSwgMjUyLCAyOTE4LAorfTsKKworI2RlZmluZSBERUZJTkVfQVJHQl9BWVVWX0ZVTkNUSU9OUyhuYW1lLCBBLCBSLCBHLCBCKSBcCitzdGF0aWMgdm9pZCBcCit0cmFuc2Zvcm1fIyNuYW1lIyNfYXl1diAoR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBjb25zdCBnaW50ICptYXRyaXgpIFwKK3sgXAorICBndWludDggKmRhdGE7IFwKKyAgZ3NpemUgc2l6ZTsgXAorICBnaW50IHksIHUsIHY7IFwKKyAgZ2ludCB5Y1s0XTsgXAorICBnaW50IHVjWzRdOyBcCisgIGdpbnQgdmNbNF07IFwKKyAgXAorICBkYXRhID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZyYW1lLCAwKTtcCisgIHNpemUgPSBHU1RfVklERU9fRlJBTUVfU0laRSAoZnJhbWUpO1wKKyAgXAorICBtZW1jcHkgKHljLCBtYXRyaXgsIDQgKiBzaXplb2YgKGdpbnQpKTsgXAorICBtZW1jcHkgKHVjLCBtYXRyaXggKyA0LCA0ICogc2l6ZW9mIChnaW50KSk7IFwKKyAgbWVtY3B5ICh2YywgbWF0cml4ICsgOCwgNCAqIHNpemVvZiAoZ2ludCkpOyBcCisgIFwKKyAgd2hpbGUgKHNpemUgPiAwKSB7IFwKKyAgICB5ID0gKGRhdGFbUl0gKiB5Y1swXSArIGRhdGFbR10gKiB5Y1sxXSArIGRhdGFbQl0gKiB5Y1syXSArIHljWzNdKSA+PiA4OyBcCisgICAgdSA9IChkYXRhW1JdICogdWNbMF0gKyBkYXRhW0ddICogdWNbMV0gKyBkYXRhW0JdICogdWNbMl0gKyB1Y1szXSkgPj4gODsgXAorICAgIHYgPSAoZGF0YVtSXSAqIHZjWzBdICsgZGF0YVtHXSAqIHZjWzFdICsgZGF0YVtCXSAqIHZjWzJdICsgdmNbM10pID4+IDg7IFwKKyAgICBcCisgICAgZGF0YVswXSA9IGRhdGFbQV07IFwKKyAgICBkYXRhWzFdID0geTsgXAorICAgIGRhdGFbMl0gPSB1OyBcCisgICAgZGF0YVszXSA9IHY7IFwKKyAgICBcCisgICAgZGF0YSArPSA0OyBcCisgICAgc2l6ZSAtPSA0OyBcCisgIH0gXAorfSBcCitcCitzdGF0aWMgdm9pZCBcCit0cmFuc2Zvcm1fYXl1dl8jI25hbWUgKEdzdFZpZGVvRnJhbWUgKiBmcmFtZSwgY29uc3QgZ2ludCAqbWF0cml4KSBcCit7IFwKKyAgZ3VpbnQ4ICpkYXRhOyBcCisgIGdzaXplIHNpemU7IFwKKyAgZ2ludCByLCBnLCBiOyBcCisgIGdpbnQgcmNbNF07IFwKKyAgZ2ludCBnY1s0XTsgXAorICBnaW50IGJjWzRdOyBcCisgIFwKKyAgZGF0YSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7XAorICBzaXplID0gR1NUX1ZJREVPX0ZSQU1FX1NJWkUgKGZyYW1lKTtcCisgIFwKKyAgbWVtY3B5IChyYywgbWF0cml4LCA0ICogc2l6ZW9mIChnaW50KSk7IFwKKyAgbWVtY3B5IChnYywgbWF0cml4ICsgNCwgNCAqIHNpemVvZiAoZ2ludCkpOyBcCisgIG1lbWNweSAoYmMsIG1hdHJpeCArIDgsIDQgKiBzaXplb2YgKGdpbnQpKTsgXAorICBcCisgIHdoaWxlIChzaXplID4gMCkgeyBcCisgICAgciA9IChkYXRhWzFdICogcmNbMF0gKyBkYXRhWzJdICogcmNbMV0gKyBkYXRhWzNdICogcmNbMl0gKyByY1szXSkgPj4gODsgXAorICAgIGcgPSAoZGF0YVsxXSAqIGdjWzBdICsgZGF0YVsyXSAqIGdjWzFdICsgZGF0YVszXSAqIGdjWzJdICsgZ2NbM10pID4+IDg7IFwKKyAgICBiID0gKGRhdGFbMV0gKiBiY1swXSArIGRhdGFbMl0gKiBiY1sxXSArIGRhdGFbM10gKiBiY1syXSArIGJjWzNdKSA+PiA4OyBcCisgICAgXAorICAgIGRhdGFbQV0gPSBkYXRhWzBdOyBcCisgICAgZGF0YVtSXSA9IENMQU1QIChyLCAwLCAyNTUpOyBcCisgICAgZGF0YVtHXSA9IENMQU1QIChnLCAwLCAyNTUpOyBcCisgICAgZGF0YVtCXSA9IENMQU1QIChiLCAwLCAyNTUpOyBcCisgICAgXAorICAgIGRhdGEgKz0gNDsgXAorICAgIHNpemUgLT0gNDsgXAorICB9IFwKK30KKworREVGSU5FX0FSR0JfQVlVVl9GVU5DVElPTlMgKHJnYmEsIDMsIDAsIDEsIDIpOworREVGSU5FX0FSR0JfQVlVVl9GVU5DVElPTlMgKGJncmEsIDMsIDIsIDEsIDApOworREVGSU5FX0FSR0JfQVlVVl9GVU5DVElPTlMgKGFyZ2IsIDAsIDEsIDIsIDMpOworREVGSU5FX0FSR0JfQVlVVl9GVU5DVElPTlMgKGFiZ3IsIDAsIDMsIDIsIDEpOworCitzdGF0aWMgdm9pZAordHJhbnNmb3JtX2F5dXZfYXl1diAoR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBjb25zdCBnaW50ICogbWF0cml4KQoreworICBndWludDggKmRhdGE7CisgIGdzaXplIHNpemU7CisgIGdpbnQgeSwgdSwgdjsKKyAgZ2ludCB5Y1s0XTsKKyAgZ2ludCB1Y1s0XTsKKyAgZ2ludCB2Y1s0XTsKKworICBpZiAobWF0cml4ID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGRhdGEgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZnJhbWUsIDApOworICBzaXplID0gR1NUX1ZJREVPX0ZSQU1FX1NJWkUgKGZyYW1lKTsKKworICBtZW1jcHkgKHljLCBtYXRyaXgsIDQgKiBzaXplb2YgKGdpbnQpKTsKKyAgbWVtY3B5ICh1YywgbWF0cml4ICsgNCwgNCAqIHNpemVvZiAoZ2ludCkpOworICBtZW1jcHkgKHZjLCBtYXRyaXggKyA4LCA0ICogc2l6ZW9mIChnaW50KSk7CisKKyAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgeSA9IChkYXRhWzFdICogeWNbMF0gKyBkYXRhWzJdICogeWNbMV0gKyBkYXRhWzNdICogeWNbMl0gKyB5Y1szXSkgPj4gODsKKyAgICB1ID0gKGRhdGFbMV0gKiB1Y1swXSArIGRhdGFbMl0gKiB1Y1sxXSArIGRhdGFbM10gKiB1Y1syXSArIHVjWzNdKSA+PiA4OworICAgIHYgPSAoZGF0YVsxXSAqIHZjWzBdICsgZGF0YVsyXSAqIHZjWzFdICsgZGF0YVszXSAqIHZjWzJdICsgdmNbM10pID4+IDg7CisKKyAgICBkYXRhWzFdID0geTsKKyAgICBkYXRhWzJdID0gdTsKKyAgICBkYXRhWzNdID0gdjsKKworICAgIGRhdGEgKz0gNDsKKyAgICBzaXplIC09IDQ7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RyYW5zZm9ybV9hcmdiX2JncmEgKEdzdFZpZGVvRnJhbWUgKiBmcmFtZSwgY29uc3QgZ2ludCAqIG1hdHJpeCkKK3sKKyAgZ3VpbnQ4ICpkYXRhOworICBnc2l6ZSBzaXplOworICBnaW50IHIsIGcsIGI7CisKKyAgZGF0YSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7CisgIHNpemUgPSBHU1RfVklERU9fRlJBTUVfU0laRSAoZnJhbWUpOworCisgIHdoaWxlIChzaXplID4gMCkgeworICAgIHIgPSBkYXRhWzFdOworICAgIGcgPSBkYXRhWzJdOworICAgIGIgPSBkYXRhWzNdOworCisgICAgZGF0YVszXSA9IGRhdGFbMF07CisgICAgZGF0YVswXSA9IGI7CisgICAgZGF0YVsxXSA9IGc7CisgICAgZGF0YVsyXSA9IHI7CisKKyAgICBkYXRhICs9IDQ7CisgICAgc2l6ZSAtPSA0OworICB9Cit9CisKKyNkZWZpbmUgdHJhbnNmb3JtX2FiZ3JfcmdiYSB0cmFuc2Zvcm1fYXJnYl9iZ3JhCisKK3N0YXRpYyB2b2lkCit0cmFuc2Zvcm1fYXJnYl9hYmdyIChHc3RWaWRlb0ZyYW1lICogZnJhbWUsIGNvbnN0IGdpbnQgKiBtYXRyaXgpCit7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3NpemUgc2l6ZTsKKyAgZ2ludCByLCBnLCBiOworCisgIGRhdGEgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZnJhbWUsIDApOworICBzaXplID0gR1NUX1ZJREVPX0ZSQU1FX1NJWkUgKGZyYW1lKTsKKworICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICByID0gZGF0YVsxXTsKKyAgICBnID0gZGF0YVsyXTsKKyAgICBiID0gZGF0YVszXTsKKworICAgIC8qIGRhdGFbMF0gPSBkYXRhWzBdOyAqLworICAgIGRhdGFbMV0gPSBiOworICAgIGRhdGFbMl0gPSBnOworICAgIGRhdGFbM10gPSByOworCisgICAgZGF0YSArPSA0OworICAgIHNpemUgLT0gNDsKKyAgfQorfQorCisjZGVmaW5lIHRyYW5zZm9ybV9hYmdyX2FyZ2IgdHJhbnNmb3JtX2FyZ2JfYWJncgorCitzdGF0aWMgdm9pZAordHJhbnNmb3JtX3JnYmFfYmdyYSAoR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBjb25zdCBnaW50ICogbWF0cml4KQoreworICBndWludDggKmRhdGE7CisgIGdzaXplIHNpemU7CisgIGdpbnQgciwgZywgYjsKKworICBkYXRhID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZyYW1lLCAwKTsKKyAgc2l6ZSA9IEdTVF9WSURFT19GUkFNRV9TSVpFIChmcmFtZSk7CisKKyAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgciA9IGRhdGFbMF07CisgICAgZyA9IGRhdGFbMV07CisgICAgYiA9IGRhdGFbMl07CisKKyAgICAvKiBkYXRhWzNdID0gZGF0YVszXSAqLyA7CisgICAgZGF0YVswXSA9IGI7CisgICAgZGF0YVsxXSA9IGc7CisgICAgZGF0YVsyXSA9IHI7CisKKyAgICBkYXRhICs9IDQ7CisgICAgc2l6ZSAtPSA0OworICB9Cit9CisKKyNkZWZpbmUgdHJhbnNmb3JtX2JncmFfcmdiYSB0cmFuc2Zvcm1fcmdiYV9iZ3JhCisKK3N0YXRpYyB2b2lkCit0cmFuc2Zvcm1fYXJnYl9yZ2JhIChHc3RWaWRlb0ZyYW1lICogZnJhbWUsIGNvbnN0IGdpbnQgKiBtYXRyaXgpCit7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3NpemUgc2l6ZTsKKyAgZ2ludCByLCBnLCBiOworCisgIGRhdGEgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZnJhbWUsIDApOworICBzaXplID0gR1NUX1ZJREVPX0ZSQU1FX1NJWkUgKGZyYW1lKTsKKworICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICByID0gZGF0YVsxXTsKKyAgICBnID0gZGF0YVsyXTsKKyAgICBiID0gZGF0YVszXTsKKworICAgIGRhdGFbM10gPSBkYXRhWzBdOworICAgIGRhdGFbMF0gPSByOworICAgIGRhdGFbMV0gPSBnOworICAgIGRhdGFbMl0gPSBiOworCisgICAgZGF0YSArPSA0OworICAgIHNpemUgLT0gNDsKKyAgfQorfQorCisjZGVmaW5lIHRyYW5zZm9ybV9hYmdyX2JncmEgdHJhbnNmb3JtX2FyZ2JfcmdiYQorCitzdGF0aWMgdm9pZAordHJhbnNmb3JtX2JncmFfYXJnYiAoR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBjb25zdCBnaW50ICogbWF0cml4KQoreworICBndWludDggKmRhdGE7CisgIGdzaXplIHNpemU7CisgIGdpbnQgciwgZywgYjsKKworICBkYXRhID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZyYW1lLCAwKTsKKyAgc2l6ZSA9IEdTVF9WSURFT19GUkFNRV9TSVpFIChmcmFtZSk7CisKKyAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgciA9IGRhdGFbMl07CisgICAgZyA9IGRhdGFbMV07CisgICAgYiA9IGRhdGFbMF07CisKKyAgICBkYXRhWzBdID0gZGF0YVszXTsKKyAgICBkYXRhWzFdID0gcjsKKyAgICBkYXRhWzJdID0gZzsKKyAgICBkYXRhWzNdID0gYjsKKworICAgIGRhdGEgKz0gNDsKKyAgICBzaXplIC09IDQ7CisgIH0KK30KKworI2RlZmluZSB0cmFuc2Zvcm1fcmdiYV9hYmdyIHRyYW5zZm9ybV9iZ3JhX2FyZ2IKKworc3RhdGljIHZvaWQKK3RyYW5zZm9ybV9yZ2JhX2FyZ2IgKEdzdFZpZGVvRnJhbWUgKiBmcmFtZSwgY29uc3QgZ2ludCAqIG1hdHJpeCkKK3sKKyAgZ3VpbnQ4ICpkYXRhOworICBnc2l6ZSBzaXplOworICBnaW50IHIsIGcsIGI7CisKKyAgZGF0YSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7CisgIHNpemUgPSBHU1RfVklERU9fRlJBTUVfU0laRSAoZnJhbWUpOworCisgIHdoaWxlIChzaXplID4gMCkgeworICAgIHIgPSBkYXRhWzBdOworICAgIGcgPSBkYXRhWzFdOworICAgIGIgPSBkYXRhWzJdOworCisgICAgZGF0YVswXSA9IGRhdGFbM107CisgICAgZGF0YVsxXSA9IHI7CisgICAgZGF0YVsyXSA9IGc7CisgICAgZGF0YVszXSA9IGI7CisKKyAgICBkYXRhICs9IDQ7CisgICAgc2l6ZSAtPSA0OworICB9Cit9CisKKyNkZWZpbmUgdHJhbnNmb3JtX2JncmFfYWJnciB0cmFuc2Zvcm1fcmdiYV9hcmdiCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FscGhhX2NvbG9yX3NldF9pbmZvIChHc3RWaWRlb0ZpbHRlciAqIGZpbHRlciwgR3N0Q2FwcyAqIGluY2FwcywKKyAgICBHc3RWaWRlb0luZm8gKiBpbl9pbmZvLCBHc3RDYXBzICogb3V0Y2FwcywgR3N0VmlkZW9JbmZvICogb3V0X2luZm8pCit7CisgIEdzdEFscGhhQ29sb3IgKmFscGhhID0gR1NUX0FMUEhBX0NPTE9SIChmaWx0ZXIpOworICBnYm9vbGVhbiBpbl9zZHR2LCBvdXRfc2R0djsKKworICBhbHBoYS0+cHJvY2VzcyA9IE5VTEw7CisgIGFscGhhLT5tYXRyaXggPSBOVUxMOworCisgIGlmIChHU1RfVklERU9fSU5GT19XSURUSCAoaW5faW5mbykgIT0gR1NUX1ZJREVPX0lORk9fV0lEVEggKG91dF9pbmZvKSB8fAorICAgICAgR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbl9pbmZvKSAhPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKG91dF9pbmZvKSkKKyAgICBnb3RvIGludmFsaWRfY2FwczsKKworICBpbl9zZHR2ID0gaW5faW5mby0+Y29sb3JpbWV0cnkubWF0cml4ID09IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQ2MDE7CisgIG91dF9zZHR2ID0gb3V0X2luZm8tPmNvbG9yaW1ldHJ5Lm1hdHJpeCA9PSBHU1RfVklERU9fQ09MT1JfTUFUUklYX0JUNjAxOworCisgIHN3aXRjaCAoR1NUX1ZJREVPX0lORk9fRk9STUFUIChpbl9pbmZvKSkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BUkdCOgorICAgICAgc3dpdGNoIChHU1RfVklERU9fSU5GT19GT1JNQVQgKG91dF9pbmZvKSkgeworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IE5VTEw7CisgICAgICAgICAgYWxwaGEtPm1hdHJpeCA9IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1JBOgorICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gdHJhbnNmb3JtX2FyZ2JfYmdyYTsKKyAgICAgICAgICBhbHBoYS0+bWF0cml4ID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FCR1I6CisgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSB0cmFuc2Zvcm1fYXJnYl9hYmdyOworICAgICAgICAgIGFscGhhLT5tYXRyaXggPSBOVUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IHRyYW5zZm9ybV9hcmdiX3JnYmE7CisgICAgICAgICAgYWxwaGEtPm1hdHJpeCA9IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gdHJhbnNmb3JtX2FyZ2JfYXl1djsKKyAgICAgICAgICBhbHBoYS0+bWF0cml4ID0KKyAgICAgICAgICAgICAgb3V0X3NkdHYgPyBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYgOgorICAgICAgICAgICAgICBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X2hkdHY7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSBOVUxMOworICAgICAgICAgIGFscGhhLT5tYXRyaXggPSBOVUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgICBzd2l0Y2ggKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAob3V0X2luZm8pKSB7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1JBOgorICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gTlVMTDsKKyAgICAgICAgICBhbHBoYS0+bWF0cml4ID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FSR0I6CisgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSB0cmFuc2Zvcm1fYmdyYV9hcmdiOworICAgICAgICAgIGFscGhhLT5tYXRyaXggPSBOVUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQUJHUjoKKyAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IHRyYW5zZm9ybV9iZ3JhX2FiZ3I7CisgICAgICAgICAgYWxwaGEtPm1hdHJpeCA9IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gdHJhbnNmb3JtX2JncmFfcmdiYTsKKyAgICAgICAgICBhbHBoYS0+bWF0cml4ID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FZVVY6CisgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSB0cmFuc2Zvcm1fYmdyYV9heXV2OworICAgICAgICAgIGFscGhhLT5tYXRyaXggPQorICAgICAgICAgICAgICBvdXRfc2R0diA/IGNvZ19yZ2JfdG9feWNiY3JfbWF0cml4XzhiaXRfc2R0diA6CisgICAgICAgICAgICAgIGNvZ19yZ2JfdG9feWNiY3JfbWF0cml4XzhiaXRfaGR0djsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IE5VTEw7CisgICAgICAgICAgYWxwaGEtPm1hdHJpeCA9IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQUJHUjoKKyAgICAgIHN3aXRjaCAoR1NUX1ZJREVPX0lORk9fRk9STUFUIChvdXRfaW5mbykpIHsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FCR1I6CisgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSBOVUxMOworICAgICAgICAgIGFscGhhLT5tYXRyaXggPSBOVUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IHRyYW5zZm9ybV9hYmdyX3JnYmE7CisgICAgICAgICAgYWxwaGEtPm1hdHJpeCA9IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BUkdCOgorICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gdHJhbnNmb3JtX2FiZ3JfYXJnYjsKKyAgICAgICAgICBhbHBoYS0+bWF0cml4ID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSB0cmFuc2Zvcm1fYWJncl9iZ3JhOworICAgICAgICAgIGFscGhhLT5tYXRyaXggPSBOVUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVlVVjoKKyAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IHRyYW5zZm9ybV9hYmdyX2F5dXY7CisgICAgICAgICAgYWxwaGEtPm1hdHJpeCA9CisgICAgICAgICAgICAgIG91dF9zZHR2ID8gY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9zZHR2IDoKKyAgICAgICAgICAgICAgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9oZHR2OworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gTlVMTDsKKyAgICAgICAgICBhbHBoYS0+bWF0cml4ID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgICAgc3dpdGNoIChHU1RfVklERU9fSU5GT19GT1JNQVQgKG91dF9pbmZvKSkgeworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IE5VTEw7CisgICAgICAgICAgYWxwaGEtPm1hdHJpeCA9IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BUkdCOgorICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gdHJhbnNmb3JtX3JnYmFfYXJnYjsKKyAgICAgICAgICBhbHBoYS0+bWF0cml4ID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FCR1I6CisgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSB0cmFuc2Zvcm1fcmdiYV9hYmdyOworICAgICAgICAgIGFscGhhLT5tYXRyaXggPSBOVUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IHRyYW5zZm9ybV9yZ2JhX2JncmE7CisgICAgICAgICAgYWxwaGEtPm1hdHJpeCA9IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gdHJhbnNmb3JtX3JnYmFfYXl1djsKKyAgICAgICAgICBhbHBoYS0+bWF0cml4ID0KKyAgICAgICAgICAgICAgb3V0X3NkdHYgPyBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYgOgorICAgICAgICAgICAgICBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X2hkdHY7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSBOVUxMOworICAgICAgICAgIGFscGhhLT5tYXRyaXggPSBOVUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FZVVY6CisgICAgICBzd2l0Y2ggKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAob3V0X2luZm8pKSB7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgICAgIGlmIChpbl9zZHR2ID09IG91dF9zZHR2KSB7CisgICAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IHRyYW5zZm9ybV9heXV2X2F5dXY7CisgICAgICAgICAgICBhbHBoYS0+bWF0cml4ID0gTlVMTDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSB0cmFuc2Zvcm1fYXl1dl9heXV2OworICAgICAgICAgICAgYWxwaGEtPm1hdHJpeCA9CisgICAgICAgICAgICAgICAgb3V0X3NkdHYgPyBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0IDoKKyAgICAgICAgICAgICAgICBjb2dfeWNiY3Jfc2R0dl90b195Y2Jjcl9oZHR2X21hdHJpeF84Yml0OworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FSR0I6CisgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSB0cmFuc2Zvcm1fYXl1dl9hcmdiOworICAgICAgICAgIGFscGhhLT5tYXRyaXggPQorICAgICAgICAgICAgICBpbl9zZHR2ID8gY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9zZHR2IDoKKyAgICAgICAgICAgICAgY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9oZHR2OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IHRyYW5zZm9ybV9heXV2X2JncmE7CisgICAgICAgICAgYWxwaGEtPm1hdHJpeCA9CisgICAgICAgICAgICAgIGluX3NkdHYgPyBjb2dfeWNiY3JfdG9fcmdiX21hdHJpeF84Yml0X3NkdHYgOgorICAgICAgICAgICAgICBjb2dfeWNiY3JfdG9fcmdiX21hdHJpeF84Yml0X2hkdHY7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BQkdSOgorICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gdHJhbnNmb3JtX2F5dXZfYWJncjsKKyAgICAgICAgICBhbHBoYS0+bWF0cml4ID0KKyAgICAgICAgICAgICAgaW5fc2R0diA/IGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfc2R0diA6CisgICAgICAgICAgICAgIGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfaGR0djsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQkE6CisgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSB0cmFuc2Zvcm1fYXl1dl9yZ2JhOworICAgICAgICAgIGFscGhhLT5tYXRyaXggPQorICAgICAgICAgICAgICBpbl9zZHR2ID8gY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9zZHR2IDoKKyAgICAgICAgICAgICAgY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9oZHR2OworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gTlVMTDsKKyAgICAgICAgICBhbHBoYS0+bWF0cml4ID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhbHBoYS0+cHJvY2VzcyA9IE5VTEw7CisgICAgICBhbHBoYS0+bWF0cml4ID0gTlVMTDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoaW5faW5mbykgPT0gR1NUX1ZJREVPX0lORk9fRk9STUFUIChvdXRfaW5mbykKKyAgICAgICYmIGluX3NkdHYgPT0gb3V0X3NkdHYpCisgICAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9wYXNzdGhyb3VnaCAoR1NUX0JBU0VfVFJBTlNGT1JNIChmaWx0ZXIpLCBUUlVFKTsKKyAgZWxzZSBpZiAoIWFscGhhLT5wcm9jZXNzKQorICAgIGdvdG8gbm9fcHJvY2VzczsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfY2FwczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFscGhhLCAiaW5jb21wbGV0ZSBvciBpbnZhbGlkIGNhcHMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX3Byb2Nlc3M6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhbHBoYSwgImNvdWxkIG5vdCBmaW5kIHByb2Nlc3MgZnVuY3Rpb24iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hbHBoYV9jb2xvcl90cmFuc2Zvcm1fZnJhbWVfaXAgKEdzdFZpZGVvRmlsdGVyICogZmlsdGVyLAorICAgIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0QWxwaGFDb2xvciAqYWxwaGEgPSBHU1RfQUxQSEFfQ09MT1IgKGZpbHRlcik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFhbHBoYS0+cHJvY2VzcykpCisgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKworICAvKiBUcmFuc2Zvcm0gaW4gcGxhY2UgKi8KKyAgYWxwaGEtPnByb2Nlc3MgKGZyYW1lLCBhbHBoYS0+bWF0cml4KTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVJST1JTICovCitub3RfbmVnb3RpYXRlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGFscGhhLCAiTm90IG5lZ290aWF0ZWQgeWV0Iik7CisgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJhbHBoYWNvbG9yIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgIEdTVF9UWVBFX0FMUEhBX0NPTE9SKTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGFscGhhY29sb3IsCisgICAgIlJHQkEgZnJvbS90byBBWVVWIGNvbG9yc3BhY2UgY29udmVyc2lvbiBwcmVzZXJ2aW5nIHRoZSBhbHBoYSBjaGFubmVsIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmggYi9nc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MGY2MjEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qIEdTdHJlYW1lciBhbHBoYWNvbG9yIGVsZW1lbnQKKyAqIENvcHlyaWdodCAoQykgMjAwNSBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0dTVF9BTFBIQV9DT0xPUl9IXworI2RlZmluZSBfR1NUX0FMUEhBX0NPTE9SX0hfCisKKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9maWx0ZXIuaD4KKworI2RlZmluZSBHU1RfVFlQRV9BTFBIQV9DT0xPUiBcCisgIChnc3RfYWxwaGFfY29sb3JfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0FMUEhBX0NPTE9SKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQUxQSEFfQ09MT1IsR3N0QWxwaGFDb2xvcikpCisjZGVmaW5lIEdTVF9BTFBIQV9DT0xPUl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9BTFBIQV9DT0xPUixHc3RBbHBoYUNvbG9yQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQUxQSEFfQ09MT1Iob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9BTFBIQV9DT0xPUikpCisjZGVmaW5lIEdTVF9JU19BTFBIQV9DT0xPUl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9BTFBIQV9DT0xPUikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBbHBoYUNvbG9yIEdzdEFscGhhQ29sb3I7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QWxwaGFDb2xvckNsYXNzIEdzdEFscGhhQ29sb3JDbGFzczsKKworc3RydWN0IF9Hc3RBbHBoYUNvbG9yCit7CisgIEdzdFZpZGVvRmlsdGVyIHBhcmVudDsKKworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgdm9pZCAoKnByb2Nlc3MpIChHc3RWaWRlb0ZyYW1lICogZnJhbWUsIGNvbnN0IGdpbnQgKiBtYXRyaXgpOworCisgIGNvbnN0IGdpbnQgKm1hdHJpeDsKK307CisKK3N0cnVjdCBfR3N0QWxwaGFDb2xvckNsYXNzCit7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2FscGhhX2NvbG9yX2dldF90eXBlICh2b2lkKTsKKworI2VuZGlmIC8qIF9HU1RfQUxQSEFfQ09MT1JfSF8gKi8KZGlmZiAtLWdpdCBhL2dzdC9hbHBoYS9tZXNvbi5idWlsZCBiL2dzdC9hbHBoYS9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjU1MjVlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2FscGhhL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMTUgQEAKK2dzdGFscGhhID0gbGlicmFyeSgnZ3N0YWxwaGEnLCAnZ3N0YWxwaGEuYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0dmlkZW9fZGVwLCBnc3RfZGVwLCBsaWJtXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKKworZ3N0YWxwaGFjb2xvciA9IGxpYnJhcnkoJ2dzdGFscGhhY29sb3InLCAnZ3N0YWxwaGFjb2xvci5jJywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgIGRlcGVuZGVuY2llcyA6IFtnc3R2aWRlb19kZXAsIGdzdF9kZXBdLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L2FwZXRhZy9NYWtlZmlsZS5hbSBiL2dzdC9hcGV0YWcvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhZWNmNQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hcGV0YWcvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxNSBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0YXBldGFnLmxhCisKK2xpYmdzdGFwZXRhZ19sYV9TT1VSQ0VTID0gZ3N0YXBlZGVtdXguYworbGliZ3N0YXBldGFnX2xhX0NGTEFHUyA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9DRkxBR1MpCitsaWJnc3RhcGV0YWdfbGFfTElCQUREID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHRhZy1AR1NUX0FQSV9WRVJTSU9OQCBcCisJLWxnc3RwYnV0aWxzLUBHU1RfQVBJX1ZFUlNJT05AXAorCSQoR1NUX0JBU0VfTElCUykgXAorCSQoR1NUX0xJQlMpCitsaWJnc3RhcGV0YWdfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdGFwZWRlbXV4LmgKZGlmZiAtLWdpdCBhL2dzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYyBiL2dzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2U2Mjg5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jCkBAIC0wLDAgKzEsNDQ1IEBACisvKiBHU3RyZWFtZXIgQVBFdjEvMiB0YWcgcmVhZGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXBlZGVtdXgKKyAqCisgKiBhcGVkZW11eCBhY2NlcHRzIGRhdGEgc3RyZWFtcyB3aXRoIEFQRSB0YWdzIGF0IHRoZSBzdGFydCBvciBhdCB0aGUgZW5kCisgKiAob3IgYm90aCkuIFRoZSBtaW1lIHR5cGUgb2YgdGhlIGRhdGEgYmV0d2VlbiB0aGUgdGFnIGJsb2NrcyBpcyBkZXRlY3RlZAorICogdXNpbmcgdHlwZWZpbmQgZnVuY3Rpb25zLCBhbmQgdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBtaW1lIHR5cGUgc2V0IG9uCisgKiBvdXRnb2luZyBidWZmZXJzLgorICoKKyAqIFRoZSBlbGVtZW50IGlzIG9ubHkgYWJsZSB0byByZWFkIEFQRSB0YWdzIGF0IHRoZSBlbmQgb2YgYSBzdHJlYW0gZnJvbQorICogYSBzZWVrYWJsZSBzdHJlYW0sIGllLiB3aGVuIGdldF9yYW5nZSBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgdXBzdHJlYW0KKyAqIGVsZW1lbnRzLiBJZiBnZXRfcmFuZ2Ugb3BlcmF0aW9uIGlzIGF2YWlsYWJsZSwgYXBlZGVtdXggbWFrZXMgaXQgYXZhaWxhYmxlCisgKiBkb3duc3RyZWFtLiBUaGlzIG1lYW5zIHRoYXQgZWxlbWVudHMgd2hpY2ggcmVxdWlyZSBnZXRfcmFuZ2UgbW9kZSwgc3VjaCBhcworICogd2F2cGFyc2Ugb3IgbXVzZXBhY2tkZWMsIGNhbiBvcGVyYXRlIG9uIGZpbGVzIGNvbnRhaW5pbmcgQVBFIHRhZworICogaW5mb3JtYXRpb24uCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC10IGZpbGVzcmMgbG9jYXRpb249ZmlsZS5tcGMgISBhcGVkZW11eCAhIGZha2VzaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIHNob3VsZCByZWFkIGFueSBhdmFpbGFibGUgQVBFIHRhZyBpbmZvcm1hdGlvbiBhbmQgb3V0cHV0IGl0LgorICogVGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGluc2lkZSB0aGUgQVBFIHRhZyByZWdpb25zIHNob3VsZCBiZSBkZXRlY3RlZCwgYW5kCisgKiB0aGUgYXBwcm9wcmlhdGUgbWltZSB0eXBlIHNldCBvbiBidWZmZXJzIHByb2R1Y2VkIGZyb20gYXBlZGVtdXguCisgKiA8L3JlZnNlY3QyPgorICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2dzdC1pMThuLXBsdWdpbi5oPgorI2luY2x1ZGUgPGdzdC9wYnV0aWxzL3BidXRpbHMuaD4KKworI2luY2x1ZGUgImdzdGFwZWRlbXV4LmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIEFQRV9WRVJTSU9OX01BSk9SKHZlcikgICgodmVyKS8xMDAwKQorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChhcGVkZW11eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAoYXBlZGVtdXhfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LWFwZXRhZyIpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hcGVfZGVtdXhfaWRlbnRpZnlfdGFnIChHc3RUYWdEZW11eCAqIGRlbXV4LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlciwgZ2Jvb2xlYW4gc3RhcnRfdGFnLCBndWludCAqIHRhZ19zaXplKTsKK3N0YXRpYyBHc3RUYWdEZW11eFJlc3VsdCBnc3RfYXBlX2RlbXV4X3BhcnNlX3RhZyAoR3N0VGFnRGVtdXggKiBkZW11eCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIsIGdib29sZWFuIHN0YXJ0X3RhZywgZ3VpbnQgKiB0YWdfc2l6ZSwKKyAgICBHc3RUYWdMaXN0ICoqIHRhZ3MpOworCitHX0RFRklORV9UWVBFIChHc3RBcGVEZW11eCwgZ3N0X2FwZV9kZW11eCwgR1NUX1RZUEVfVEFHX0RFTVVYKTsKKworc3RhdGljIHZvaWQKK2dzdF9hcGVfZGVtdXhfY2xhc3NfaW5pdCAoR3N0QXBlRGVtdXhDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3M7CisgIEdzdFRhZ0RlbXV4Q2xhc3MgKnRhZ2RlbXV4X2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChhcGVkZW11eF9kZWJ1ZywgImFwZWRlbXV4IiwgMCwKKyAgICAgICJHU3RyZWFtZXIgQVBFIHRhZyBkZW11eGVyIik7CisKKyAgdGFnZGVtdXhfY2xhc3MgPSBHU1RfVEFHX0RFTVVYX0NMQVNTIChrbGFzcyk7CisgIGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJBUEUgdGFnIGRlbXV4ZXIiLAorICAgICAgIkNvZGVjL0RlbXV4ZXIvTWV0YWRhdGEiLAorICAgICAgIlJlYWQgYW5kIG91dHB1dCBBUEUgdGFncyB3aGlsZSBkZW11eGluZyB0aGUgY29udGVudHMiLAorICAgICAgIlRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzaW5rX2ZhY3RvcnkpOworCisgIHRhZ2RlbXV4X2NsYXNzLT5pZGVudGlmeV90YWcgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FwZV9kZW11eF9pZGVudGlmeV90YWcpOworICB0YWdkZW11eF9jbGFzcy0+cGFyc2VfdGFnID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hcGVfZGVtdXhfcGFyc2VfdGFnKTsKKworICAvKiBubyBuZWVkIGZvciBhIG1lcmdlIGZ1bmN0aW9uLCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgdG8gcHJlZmVyIHN0YXJ0CisgICAqIHRhZ3MgKEFQRXYyKSBvdmVyIGVuZCB0YWdzICh1c3VhbGx5IEFQRXYxLCBidXQgY291bGQgdGhlb3JldGljYWxseSBhbHNvCisgICAqIGJlIEFQRXYyKSBpcyBmaW5lICovCisKKyAgdGFnZGVtdXhfY2xhc3MtPm1pbl9zdGFydF9zaXplID0gMzI7CisgIHRhZ2RlbXV4X2NsYXNzLT5taW5fZW5kX3NpemUgPSAzMjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hcGVfZGVtdXhfaW5pdCAoR3N0QXBlRGVtdXggKiBhcGVkZW11eCkKK3sKKyAgLyogbm90aGluZyB0byBkbyBoZXJlICovCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgX0dzdEFwZURlbXV4VGFnVGFibGVFbnRyeQoreworICBjb25zdCBnY2hhciAqYXBlX3RhZzsKKyAgY29uc3QgZ2NoYXIgKmdzdF90YWc7Cit9IHRhZ190YWJsZVtdID0geworICB7CisgICJyZXBsYXlnYWluX3RyYWNrX2dhaW4iLCBHU1RfVEFHX1RSQUNLX0dBSU59LCB7CisgICJyZXBsYXlnYWluX3RyYWNrX3BlYWsiLCBHU1RfVEFHX1RSQUNLX1BFQUt9LCB7CisgICJyZXBsYXlnYWluX2FsYnVtX2dhaW4iLCBHU1RfVEFHX0FMQlVNX0dBSU59LCB7CisgICJyZXBsYXlnYWluX2FsYnVtX3BlYWsiLCBHU1RfVEFHX0FMQlVNX1BFQUt9LCB7CisgICJ0aXRsZSIsIEdTVF9UQUdfVElUTEV9LCB7CisgICJhcnRpc3QiLCBHU1RfVEFHX0FSVElTVH0sIHsKKyAgImFsYnVtIiwgR1NUX1RBR19BTEJVTX0sIHsKKyAgImNvbXBvc2VyIiwgR1NUX1RBR19DT01QT1NFUn0sIHsKKyAgImNvbW1lbnQiLCBHU1RfVEFHX0NPTU1FTlR9LCB7CisgICJjb21tZW50cyIsIEdTVF9UQUdfQ09NTUVOVH0sIHsKKyAgImNvcHlyaWdodCIsIEdTVF9UQUdfQ09QWVJJR0hUfSwgeworICAiZ2VucmUiLCBHU1RfVEFHX0dFTlJFfSwgeworICAiaXNyYyIsIEdTVF9UQUdfSVNSQ30sIHsKKyAgImRpc2MiLCBHU1RfVEFHX0FMQlVNX1ZPTFVNRV9OVU1CRVJ9LCB7CisgICJkaXNrIiwgR1NUX1RBR19BTEJVTV9WT0xVTUVfTlVNQkVSfSwgeworICAiZGlzY251bWJlciIsIEdTVF9UQUdfQUxCVU1fVk9MVU1FX05VTUJFUn0sIHsKKyAgImRpc2tudW1iZXIiLCBHU1RfVEFHX0FMQlVNX1ZPTFVNRV9OVU1CRVJ9LCB7CisgICJ0cmFjayIsIEdTVF9UQUdfVFJBQ0tfTlVNQkVSfSwgeworICAidHJhY2tudW1iZXIiLCBHU1RfVEFHX1RSQUNLX05VTUJFUn0sIHsKKyAgInllYXIiLCBHU1RfVEFHX0RBVEV9LCB7CisgICJmaWxlIiwgR1NUX1RBR19MT0NBVElPTn0KK307CisKK3N0YXRpYyBnYm9vbGVhbgorYXBlX2RlbXV4X2dldF9nc3RfdGFnX2Zyb21fdGFnIChjb25zdCBnY2hhciAqIGFwZV90YWcsCisgICAgY29uc3QgZ2NoYXIgKiogZ3N0X3RhZywgR1R5cGUgKiBnc3RfdGFnX3R5cGUpCit7CisgIGdpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTICh0YWdfdGFibGUpOyArK2kpIHsKKyAgICBpZiAoZ19hc2NpaV9zdHJjYXNlY21wICh0YWdfdGFibGVbaV0uYXBlX3RhZywgYXBlX3RhZykgPT0gMCkgeworICAgICAgKmdzdF90YWcgPSB0YWdfdGFibGVbaV0uZ3N0X3RhZzsKKyAgICAgICpnc3RfdGFnX3R5cGUgPSBnc3RfdGFnX2dldF90eXBlICh0YWdfdGFibGVbaV0uZ3N0X3RhZyk7CisgICAgICBHU1RfTE9HICgiTWFwcGVkIEFQRSB0YWcgJyVzJyB0byBHU3RyZWFtZXIgdGFnICclcyciLCBhcGVfdGFnLCAqZ3N0X3RhZyk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKworICBHU1RfV0FSTklORyAoIkNvdWxkIG5vdCBtYXAgQVBFIHRhZyAnJXMnIHRvIGEgR1N0cmVhbWVyIHRhZyIsIGFwZV90YWcpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBHc3RUYWdMaXN0ICoKK2FwZV9kZW11eF9wYXJzZV90YWdzIChjb25zdCBndWludDggKiBkYXRhLCBnaW50IHNpemUpCit7CisgIEdzdFRhZ0xpc3QgKnRhZ2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgIEdTVF9MT0cgKCJSZWFkaW5nIHRhZ3MgZnJvbSBjaHVuayBvZiBzaXplICV1IGJ5dGVzIiwgc2l6ZSk7CisKKyAgLyogZ2V0IHJpZCBvZiBoZWFkZXIvZm9vdGVyICovCisgIGlmIChzaXplID49IDMyICYmIG1lbWNtcCAoZGF0YSwgIkFQRVRBR0VYIiwgOCkgPT0gMCkgeworICAgIGRhdGEgKz0gMzI7CisgICAgc2l6ZSAtPSAzMjsKKyAgfQorICBpZiAoc2l6ZSA+IDMyICYmIG1lbWNtcCAoZGF0YSArIHNpemUgLSAzMiwgIkFQRVRBR0VYIiwgOCkgPT0gMCkgeworICAgIHNpemUgLT0gMzI7CisgIH0KKworICAvKiByZWFkIGFjdHVhbCB0YWdzIC0gYXQgbGVhc3QgMTAgYnl0ZXMgZm9yIHRhZyBoZWFkZXIgKi8KKyAgd2hpbGUgKHNpemUgPj0gMTApIHsKKyAgICBndWludCBsZW4sIG4gPSA4OworICAgIGdjaGFyICp0YWcsICp2YWw7CisgICAgY29uc3QgZ2NoYXIgKmdzdF90YWc7CisgICAgR1R5cGUgZ3N0X3RhZ190eXBlOworCisgICAgLyogZmluZCB0YWcgdHlwZSBhbmQgc2l6ZSAqLworICAgIGxlbiA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSk7CisgICAgd2hpbGUgKG4gPCBzaXplICYmIGRhdGFbbl0gIT0gMHgwKQorICAgICAgbisrOworICAgIGlmIChuID09IHNpemUpCisgICAgICBicmVhazsKKyAgICBnX2Fzc2VydCAoZGF0YVtuXSA9PSAweDApOworICAgIG4rKzsKKyAgICBpZiAoc2l6ZSAtIG4gPCBsZW4pCisgICAgICBicmVhazsKKworICAgIC8qIElmIHRoZSB0YWcgaXMgZW1wdHksIHNraXAgdG8gdGhlIG5leHQgb25lICovCisgICAgaWYgKGxlbiA9PSAwKQorICAgICAgZ290byBuZXh0X3RhZzsKKworICAgIC8qIHJlYWQgKi8KKyAgICB0YWcgPSBnX3N0cm5kdXAgKChnY2hhciAqKSBkYXRhICsgOCwgbiAtIDkpOworICAgIHZhbCA9IGdfc3RybmR1cCAoKGdjaGFyICopIGRhdGEgKyBuLCBsZW4pOworCisgICAgR1NUX0xPRyAoInRhZyBbJXNdLCB2YWxbJXNdIiwgdGFnLCB2YWwpOworCisgICAgLyogc3BlY2lhbC1jYXNlICdtZWRpYScgdGFnLCBjb3VsZCBiZSBlLmcuICJDRCAxLzIiICovCisgICAgaWYgKGdfYXNjaWlfc3RyY2FzZWNtcCAodGFnLCAibWVkaWEiKSA9PSAwKSB7CisgICAgICBnY2hhciAqc3AsICpzcDI7CisKKyAgICAgIGdfZnJlZSAodGFnKTsKKyAgICAgIHRhZyA9IGdfc3RyZHVwICgiZGlzY251bWJlciIpOworICAgICAgLyogZ2V0IHJpZCBvZiB0aGUgbWVkaXVtIGluIGZyb250ICovCisgICAgICBzcCA9IHN0cmNociAodmFsLCAnICcpOworICAgICAgd2hpbGUgKHNwICE9IE5VTEwgJiYgKHNwMiA9IHN0cmNociAoc3AgKyAxLCAnICcpKSAhPSBOVUxMKQorICAgICAgICBzcCA9IHNwMjsKKyAgICAgIGlmIChzcCkgeworICAgICAgICBtZW1tb3ZlICh2YWwsIHNwICsgMSwgc3RybGVuIChzcCArIDEpICsgMSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGFwZV9kZW11eF9nZXRfZ3N0X3RhZ19mcm9tX3RhZyAodGFnLCAmZ3N0X3RhZywgJmdzdF90YWdfdHlwZSkpIHsKKyAgICAgIEdWYWx1ZSB2ID0geyAwLCB9OworCisgICAgICBzd2l0Y2ggKGdzdF90YWdfdHlwZSkgeworICAgICAgICBjYXNlIEdfVFlQRV9JTlQ6eworICAgICAgICAgIGdpbnQgdl9pbnQ7CisKKyAgICAgICAgICBpZiAoc3NjYW5mICh2YWwsICIlZCIsICZ2X2ludCkgPT0gMSkgeworICAgICAgICAgICAgZ192YWx1ZV9pbml0ICgmdiwgR19UWVBFX0lOVCk7CisgICAgICAgICAgICBnX3ZhbHVlX3NldF9pbnQgKCZ2LCB2X2ludCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgR19UWVBFX1VJTlQ6eworICAgICAgICAgIGd1aW50IHZfdWludCwgY291bnQ7CisKKyAgICAgICAgICBpZiAoc3RyY21wIChnc3RfdGFnLCBHU1RfVEFHX1RSQUNLX05VTUJFUikgPT0gMCkgeworICAgICAgICAgICAgZ2ludCBkdW1teTsKKworICAgICAgICAgICAgaWYgKHNzY2FuZiAodmFsLCAiJXUiLCAmdl91aW50KSA9PSAxICYmIHZfdWludCA+IDApIHsKKyAgICAgICAgICAgICAgZ192YWx1ZV9pbml0ICgmdiwgR19UWVBFX1VJTlQpOworICAgICAgICAgICAgICBnX3ZhbHVlX3NldF91aW50ICgmdiwgdl91aW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEdTVF9MT0cgKCJjaGVja2luZyBmb3IgdHJhY2sgY291bnQ6ICVzIiwgdmFsKTsKKyAgICAgICAgICAgIC8qIG1pZ2h0IGJlIDAvTiBvciAtMS9OIHRvIHNwZWNpZnkgdGhhdCB0aGVyZSBpcyBvbmx5IGEgY291bnQgKi8KKyAgICAgICAgICAgIGlmIChzc2NhbmYgKHZhbCwgIiVkLyV1IiwgJmR1bW15LCAmY291bnQpID09IDIgJiYgY291bnQgPiAwKSB7CisgICAgICAgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAorICAgICAgICAgICAgICAgICAgR1NUX1RBR19UUkFDS19DT1VOVCwgY291bnQsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wIChnc3RfdGFnLCBHU1RfVEFHX0FMQlVNX1ZPTFVNRV9OVU1CRVIpID09IDApIHsKKyAgICAgICAgICAgIGdpbnQgZHVtbXk7CisKKyAgICAgICAgICAgIGlmIChzc2NhbmYgKHZhbCwgIiV1IiwgJnZfdWludCkgPT0gMSAmJiB2X3VpbnQgPiAwKSB7CisgICAgICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJnYsIEdfVFlQRV9VSU5UKTsKKyAgICAgICAgICAgICAgZ192YWx1ZV9zZXRfdWludCAoJnYsIHZfdWludCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBHU1RfTE9HICgiY2hlY2tpbmcgZm9yIHZvbHVtZSBjb3VudDogJXMiLCB2YWwpOworICAgICAgICAgICAgLyogbWlnaHQgYmUgMC9OIG9yIC0xL04gdG8gc3BlY2lmeSB0aGF0IHRoZXJlIGlzIG9ubHkgYSBjb3VudCAqLworICAgICAgICAgICAgaWYgKHNzY2FuZiAodmFsLCAiJWQvJXUiLCAmZHVtbXksICZjb3VudCkgPT0gMiAmJiBjb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFnbGlzdCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsCisgICAgICAgICAgICAgICAgICBHU1RfVEFHX0FMQlVNX1ZPTFVNRV9DT1VOVCwgY291bnQsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAoc3NjYW5mICh2YWwsICIldSIsICZ2X3VpbnQpID09IDEpIHsKKyAgICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJnYsIEdfVFlQRV9VSU5UKTsKKyAgICAgICAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKCZ2LCB2X3VpbnQpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEdfVFlQRV9TVFJJTkc6eworICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJnYsIEdfVFlQRV9TVFJJTkcpOworICAgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAoJnYsIHZhbCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBHX1RZUEVfRE9VQkxFOnsKKyAgICAgICAgICBnZG91YmxlIHZfZG91YmxlOworICAgICAgICAgIGdjaGFyICplbmRwdHI7CisKKyAgICAgICAgICAvKiBmbG9hdGluZyBwb2ludCBzdHJpbmdzIGNhbiBiZSAiNCwxMjMiIG9yICI0LjEyMyIgZGVwZW5kaW5nIG9uCisgICAgICAgICAgICogdGhlIGxvY2FsZS4gV2UgbmVlZCB0byBiZSBhYmxlIHRvIHBhcnNlIGFuZCByZWFkIGVpdGhlciB2ZXJzaW9uCisgICAgICAgICAgICogbm8gbWF0dGVyIHdoYXQgb3VyIGN1cnJlbnQgbG9jYWxlIGlzICovCisgICAgICAgICAgZ19zdHJkZWxpbWl0ICh2YWwsICIsIiwgJy4nKTsKKyAgICAgICAgICB2X2RvdWJsZSA9IGdfYXNjaWlfc3RydG9kICh2YWwsICZlbmRwdHIpOworICAgICAgICAgIGlmIChlbmRwdHIgIT0gdmFsKSB7CisgICAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZ2LCBHX1RZUEVfRE9VQkxFKTsKKyAgICAgICAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAoJnYsIHZfZG91YmxlKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OnsKKyAgICAgICAgICBpZiAoZ3N0X3RhZ190eXBlID09IEdfVFlQRV9EQVRFKSB7CisgICAgICAgICAgICBnaW50IHZfaW50OworCisgICAgICAgICAgICBpZiAoc3NjYW5mICh2YWwsICIlZCIsICZ2X2ludCkgPT0gMSkgeworICAgICAgICAgICAgICBHRGF0ZSAqZGF0ZSA9IGdfZGF0ZV9uZXdfZG15ICgxLCAxLCB2X2ludCk7CisKKyAgICAgICAgICAgICAgZ192YWx1ZV9pbml0ICgmdiwgR19UWVBFX0RBVEUpOworICAgICAgICAgICAgICBnX3ZhbHVlX3Rha2VfYm94ZWQgKCZ2LCBkYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR1NUX1dBUk5JTkcgKCJVbmhhbmRsZWQgdGFnIHR5cGUgJyVzJyBmb3IgdGFnICclcyciLAorICAgICAgICAgICAgICAgIGdfdHlwZV9uYW1lIChnc3RfdGFnX3R5cGUpLCBnc3RfdGFnKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChHX1ZBTFVFX1RZUEUgKCZ2KSAhPSAwKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGRfdmFsdWVzICh0YWdsaXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgICAgIGdzdF90YWcsICZ2LCBOVUxMKTsKKyAgICAgICAgZ192YWx1ZV91bnNldCAoJnYpOworICAgICAgfQorICAgIH0KKyAgICBHU1RfREVCVUcgKCJSZWFkIHRhZyAlczogJXMiLCB0YWcsIHZhbCk7CisgICAgZ19mcmVlICh0YWcpOworICAgIGdfZnJlZSAodmFsKTsKKworICAgIC8qIG1vdmUgZGF0YSBwb2ludGVyICovCisgIG5leHRfdGFnOgorICAgIHNpemUgLT0gbGVuICsgbjsKKyAgICBkYXRhICs9IGxlbiArIG47CisgIH0KKworICBHU1RfREVCVUcgKCJUYWdsaXN0OiAlIiBHU1RfUFRSX0ZPUk1BVCwgdGFnbGlzdCk7CisgIHJldHVybiB0YWdsaXN0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hcGVfZGVtdXhfaWRlbnRpZnlfdGFnIChHc3RUYWdEZW11eCAqIGRlbXV4LCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgZ2Jvb2xlYW4gc3RhcnRfdGFnLCBndWludCAqIHRhZ19zaXplKQoreworICBHc3RNYXBJbmZvIG1hcDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIGlmIChtZW1jbXAgKG1hcC5kYXRhLCAiQVBFVEFHRVgiLCA4KSAhPSAwKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJObyBBUEVUQUdFWCBtYXJrZXIgYXQgJXMgLSBub3QgYW4gQVBFIGZpbGUiLAorICAgICAgICAoc3RhcnRfdGFnKSA/ICJzdGFydCIgOiAiZW5kIik7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAqdGFnX3NpemUgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKG1hcC5kYXRhICsgMTIpOworCisgIC8qIHNpemUgaXMgd2l0aG91dCBoZWFkZXIsIHNvIGFkZCAzMiB0byBhY2NvdW50IGZvciB0aGF0ICovCisgICp0YWdfc2l6ZSArPSAzMjsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0VGFnRGVtdXhSZXN1bHQKK2dzdF9hcGVfZGVtdXhfcGFyc2VfdGFnIChHc3RUYWdEZW11eCAqIGRlbXV4LCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgZ2Jvb2xlYW4gc3RhcnRfdGFnLCBndWludCAqIHRhZ19zaXplLCBHc3RUYWdMaXN0ICoqIHRhZ3MpCit7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQ4ICpmb290ZXI7CisgIGdib29sZWFuIGhhdmVfaGVhZGVyOworICBnYm9vbGVhbiBlbmRfdGFnID0gIXN0YXJ0X3RhZzsKKyAgR3N0Q2FwcyAqc2lua19jYXBzOworICBndWludCB2ZXJzaW9uLCBmb290ZXJfc2l6ZTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdzaXplIHNpemU7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworICBzaXplID0gbWFwLnNpemU7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiUGFyc2luZyBidWZmZXIgb2Ygc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCwgc2l6ZSk7CisKKyAgZm9vdGVyID0gZGF0YSArIHNpemUgLSAzMjsKKworICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJDaGVja2luZyBmb3IgZm9vdGVyIGF0IG9mZnNldCAweCUwNHgiLAorICAgICAgKGd1aW50KSAoZm9vdGVyIC0gZGF0YSkpOworICBpZiAoZm9vdGVyID4gZGF0YSAmJiBtZW1jbXAgKGZvb3RlciwgIkFQRVRBR0VYIiwgOCkgPT0gMCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiRm91bmQgZm9vdGVyIik7CisgICAgZm9vdGVyX3NpemUgPSAzMjsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIk5vIGZvb3RlciIpOworICAgIGZvb3Rlcl9zaXplID0gMDsKKyAgfQorCisgIC8qIEFQRSB0YWdzIGF0IHRoZSBlbmQgbXVzdCBoYXZlIGEgZm9vdGVyICovCisgIGlmIChlbmRfdGFnICYmIGZvb3Rlcl9zaXplID09IDApIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiVGFnIGF0IGVuZCBvZiBmaWxlIHdpdGhvdXQgZm9vdGVyISIpOworICAgIHJldHVybiBHU1RfVEFHX0RFTVVYX1JFU1VMVF9CUk9LRU5fVEFHOworICB9CisKKyAgLyogZG9uJ3QgdHJ1c3QgdGhlIGhlYWRlci9mb290ZXIgZmxhZ3MsIGJldHRlciBkZXRlY3QgdGhlbSBvdXJzZWx2ZXMgKi8KKyAgaGF2ZV9oZWFkZXIgPSAobWVtY21wIChkYXRhLCAiQVBFVEFHRVgiLCA4KSA9PSAwKTsKKworICBpZiAoc3RhcnRfdGFnICYmICFoYXZlX2hlYWRlcikgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiVGFnIGF0IGJlZ2lubmluZyBvZiBmaWxlIHdpdGhvdXQgaGVhZGVyISIpOworICAgIHJldHVybiBHU1RfVEFHX0RFTVVYX1JFU1VMVF9CUk9LRU5fVEFHOworICB9CisKKyAgaWYgKGVuZF90YWcgJiYgIWhhdmVfaGVhZGVyKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJUYWcgYXQgZW5kIG9mIGZpbGUgaGFzIG5vIGhlYWRlciAoQVBFdjEpIik7CisgICAgKnRhZ19zaXplIC09IDMyOyAgICAgICAgICAgIC8qIGFkanVzdCB0YWcgc2l6ZSAqLworICB9CisKKyAgaWYgKGhhdmVfaGVhZGVyKSB7CisgICAgdmVyc2lvbiA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDgpOworICB9IGVsc2UgeworICAgIHZlcnNpb24gPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGZvb3RlciArIDgpOworICB9CisKKyAgLyogc2tpcCBoZWFkZXIgKi8KKyAgaWYgKGhhdmVfaGVhZGVyKSB7CisgICAgZGF0YSArPSAzMjsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiQVBFIHRhZyB3aXRoIHZlcnNpb24gJXUsIHNpemUgJXUgYXQgb2Zmc2V0IDB4JTA4IgorICAgICAgR19HSU5UNjRfTU9ESUZJRVIgIngiLCB2ZXJzaW9uLCAqdGFnX3NpemUsCisgICAgICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKSArICgoaGF2ZV9oZWFkZXIpID8gMCA6IDMyKSk7CisKKyAgaWYgKEFQRV9WRVJTSU9OX01BSk9SICh2ZXJzaW9uKSAhPSAxICYmIEFQRV9WRVJTSU9OX01BSk9SICh2ZXJzaW9uKSAhPSAyKSB7CisgICAgR1NUX1dBUk5JTkcgKCJBUEUgdGFnIGlzIHZlcnNpb24gJXUuJTAzdSwgYnV0IGRlY29kZXIgb25seSBzdXBwb3J0cyAiCisgICAgICAgICJ2MSBvciB2Mi4gSWdub3JpbmcuIiwgQVBFX1ZFUlNJT05fTUFKT1IgKHZlcnNpb24pLCB2ZXJzaW9uICUgMTAwMCk7CisgICAgcmV0dXJuIEdTVF9UQUdfREVNVVhfUkVTVUxUX09LOworICB9CisKKyAgKnRhZ3MgPSBhcGVfZGVtdXhfcGFyc2VfdGFncyAoZGF0YSwgKnRhZ19zaXplIC0gZm9vdGVyX3NpemUpOworCisgIHNpbmtfY2FwcyA9IGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldF9jYXBzICgmc2lua19mYWN0b3J5KTsKKyAgZ3N0X3BiX3V0aWxzX2FkZF9jb2RlY19kZXNjcmlwdGlvbl90b190YWdfbGlzdCAoKnRhZ3MsCisgICAgICBHU1RfVEFHX0NPTlRBSU5FUl9GT1JNQVQsIHNpbmtfY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzaW5rX2NhcHMpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKKyAgcmV0dXJuIEdTVF9UQUdfREVNVVhfUkVTVUxUX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXBlZGVtdXgiLAorICAgICAgR1NUX1JBTktfUFJJTUFSWSwgR1NUX1RZUEVfQVBFX0RFTVVYKTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGFwZXRhZywKKyAgICAiQVBFdjEvMiB0YWcgcmVhZGVyIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgIkxHUEwiLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3QvYXBldGFnL2dzdGFwZWRlbXV4LmggYi9nc3QvYXBldGFnL2dzdGFwZWRlbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM0MDU0NwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hcGV0YWcvZ3N0YXBlZGVtdXguaApAQCAtMCwwICsxLDUyIEBACisvKiBHU3RyZWFtZXIgQVBFdjEvMiB0YWcgcmVhZGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9BUEVfREVNVVhfSF9fCisjZGVmaW5lIF9fR1NUX0FQRV9ERU1VWF9IX18KKworI2luY2x1ZGUgPGdzdC90YWcvZ3N0dGFnZGVtdXguaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0FQRV9ERU1VWCAgICAgICAgICAgICAoZ3N0X2FwZV9kZW11eF9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVBFX0RFTVVYKG9iaikgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0FQRV9ERU1VWCxHc3RBcGVEZW11eCkpCisjZGVmaW5lIEdTVF9BUEVfREVNVVhfQ0xBU1Moa2xhc3MpICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9BUEVfREVNVVgsR3N0QXBlRGVtdXhDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BUEVfREVNVVgob2JqKSAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQVBFX0RFTVVYKSkKKyNkZWZpbmUgR1NUX0lTX0FQRV9ERU1VWF9DTEFTUyhrbGFzcykgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0FQRV9ERU1VWCkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBcGVEZW11eCAgICAgIEdzdEFwZURlbXV4OwordHlwZWRlZiBzdHJ1Y3QgX0dzdEFwZURlbXV4Q2xhc3MgR3N0QXBlRGVtdXhDbGFzczsKKworc3RydWN0IF9Hc3RBcGVEZW11eAoreworICBHc3RUYWdEZW11eCB0YWdkZW11eDsKK307CisKK3N0cnVjdCBfR3N0QXBlRGVtdXhDbGFzcyAKK3sKKyAgR3N0VGFnRGVtdXhDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfYXBlX2RlbXV4X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0FQRV9ERU1VWF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZ3N0L2FwZXRhZy9tZXNvbi5idWlsZCBiL2dzdC9hcGV0YWcvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4YzY0NQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hcGV0YWcvbWVzb24uYnVpbGQKQEAgLTAsMCArMSw3IEBACitnc3RhcGV0YWcgPSBsaWJyYXJ5KCdnc3RhcGV0YWcnLCAnZ3N0YXBlZGVtdXguYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0cGJ1dGlsc19kZXAsIGdzdHRhZ19kZXAsIGdzdF9kZXBdLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvLmdpdGlnbm9yZSBiL2dzdC9hdWRpb2Z4Ly5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5ZmM5NwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4Ly5naXRpZ25vcmUKQEAgLTAsMCArMSw2IEBACisuZGVwcworLmxpYnMKKyoubG8KKyoubGEKK01ha2VmaWxlCitNYWtlZmlsZS5pbgpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW0gYi9nc3QvYXVkaW9meC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2VlN2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw2MCBAQAorIyBwbHVnaW5kaXIgaXMgc2V0IGluIGNvbmZpZ3VyZQorCitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RhdWRpb2Z4LmxhCisKKyMgRklYTUUgMC4xMTogaWdub3JlIEdWYWx1ZUFycmF5IHdhcm5pbmdzIGZvciBub3cgdW50aWwgdGhpcyBpcyBzb3J0ZWQKK0VSUk9SX0NGTEFHUz0KKworT1JDX1NPVVJDRT1hdWRpb3Bhbm9yYW1hb3JjCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29tbW9uL29yYy5tYWsKKworIyBzb3VyY2VzIHVzZWQgdG8gY29tcGlsZSB0aGlzIHBsdWctaW4KK2xpYmdzdGF1ZGlvZnhfbGFfU09VUkNFUyA9IGF1ZGlvZnguY1wKKwlhdWRpb3Bhbm9yYW1hLmMgXAorCWF1ZGlvaW52ZXJ0LmMgXAorCWF1ZGlvYW1wbGlmeS5jIFwKKwlhdWRpb2R5bmFtaWMuYyBcCisJYXVkaW9rYXJhb2tlLmMgXAorCWF1ZGlvZnhiYXNlaWlyZmlsdGVyLmMgXAorCWF1ZGlvY2hlYmxpbWl0LmMgXAorCWF1ZGlvY2hlYmJhbmQuYyBcCisJYXVkaW9paXJmaWx0ZXIuYyBcCisJYXVkaW9meGJhc2VmaXJmaWx0ZXIuYyBcCisJYXVkaW93c2luY2JhbmQuYyBcCisJYXVkaW93c2luY2xpbWl0LmMgXAorCWF1ZGlvZmlyZmlsdGVyLmMgXAorCWF1ZGlvZWNoby5jIFwKKwlnc3RzY2FsZXRlbXBvLmMKK25vZGlzdF9saWJnc3RhdWRpb2Z4X2xhX1NPVVJDRVMgPSAkKE9SQ19OT0RJU1RfU09VUkNFUykKKworIyBmbGFncyB1c2VkIHRvIGNvbXBpbGUgdGhpcyBwbHVnaW4KK2xpYmdzdGF1ZGlvZnhfbGFfQ0ZMQUdTID0gJChHU1RfQ0ZMQUdTKSBcCisJJChHU1RfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJJChPUkNfQ0ZMQUdTKQorbGliZ3N0YXVkaW9meF9sYV9MSUJBREQgPSAkKEdTVF9MSUJTKSBcCisJJChHU1RfQkFTRV9MSUJTKSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIFwKKwktbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJLWxnc3RmZnQtJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkkKE9SQ19MSUJTKSBcCisJJChMSUJNKQorbGliZ3N0YXVkaW9meF9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKKyMgaGVhZGVycyB3ZSBuZWVkIGJ1dCBkb24ndCB3YW50IGluc3RhbGxlZAorbm9pbnN0X0hFQURFUlMgPSBhdWRpb3Bhbm9yYW1hLmggXAorCWF1ZGlvaW52ZXJ0LmggXAorCWF1ZGlvYW1wbGlmeS5oIFwKKwlhdWRpb2R5bmFtaWMuaCBcCisJYXVkaW9rYXJhb2tlLmggXAorCWF1ZGlvZnhiYXNlaWlyZmlsdGVyLmggXAorCWF1ZGlvY2hlYmxpbWl0LmggXAorCWF1ZGlvY2hlYmJhbmQuaCBcCisJYXVkaW9paXJmaWx0ZXIuaCBcCisJYXVkaW9meGJhc2VmaXJmaWx0ZXIuaCBcCisJYXVkaW93c2luY2JhbmQuaCBcCisgICAgICAgIGF1ZGlvd3NpbmNsaW1pdC5oIFwKKwlhdWRpb2ZpcmZpbHRlci5oIFwKKwlhdWRpb2VjaG8uaCBcCisJZ3N0c2NhbGV0ZW1wby5oIFwKKwltYXRoX2NvbXBhdC5oCmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYyBiL2dzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNmNlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYwpAQCAtMCwwICsxLDQ3NiBAQAorLyogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWF1ZGlvYW1wbGlmeQorICoKKyAqIEFtcGxpZmllcyBhbiBhdWRpbyBzdHJlYW0gYnkgYSBnaXZlbiBmYWN0b3IgYW5kIGFsbG93cyB0aGUgc2VsZWN0aW9uIG9mIGRpZmZlcmVudCBjbGlwcGluZyBtb2Rlcy4KKyAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNsaXBwaW5nIG1vZGVzIGlzIGJlc3QgZXZhbHVhdGVkIGJ5IHRlc3RpbmcuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyB3YXZlPXNhdyAhIGF1ZGlvYW1wbGlmeSBhbXBsaWZpY2F0aW9uPTEuNSAhIGFsc2FzaW5rCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPSJtZWxvMS5vZ2ciICEgb2dnZGVtdXggISB2b3JiaXNkZWMgISBhdWRpb2NvbnZlcnQgISBhdWRpb2FtcGxpZnkgYW1wbGlmaWNhdGlvbj0xLjUgY2xpcHBpbmctbWV0aG9kPXdyYXAtbmVnYXRpdmUgISBhbHNhc2luaworICogZ3N0LWxhdW5jaC0xLjAgYXVkaW90ZXN0c3JjIHdhdmU9c2F3ICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9hbXBsaWZ5IGFtcGxpZmljYXRpb249MS41IGNsaXBwaW5nLW1ldGhvZD13cmFwLXBvc2l0aXZlICEgYXVkaW9jb252ZXJ0ICEgYWxzYXNpbmsKKyAqIF18CisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlICJhdWRpb2FtcGxpZnkuaCIKKworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X2F1ZGlvX2FtcGxpZnlfZGVidWcKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKEdTVF9DQVRfREVGQVVMVCk7CisKKy8qIEZpbHRlciBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0FNUExJRklDQVRJT04sCisgIFBST1BfQ0xJUFBJTkdfTUVUSE9ECit9OworCitlbnVtCit7CisgIE1FVEhPRF9DTElQID0gMCwKKyAgTUVUSE9EX1dSQVBfTkVHQVRJVkUsCisgIE1FVEhPRF9XUkFQX1BPU0lUSVZFLAorICBNRVRIT0RfTk9DTElQLAorICBOVU1fTUVUSE9EUworfTsKKworI2RlZmluZSBHU1RfVFlQRV9BVURJT19BTVBMSUZZX0NMSVBQSU5HX01FVEhPRCAoZ3N0X2F1ZGlvX2FtcGxpZnlfY2xpcHBpbmdfbWV0aG9kX2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3RfYXVkaW9fYW1wbGlmeV9jbGlwcGluZ19tZXRob2RfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBndHlwZSA9IDA7CisKKyAgaWYgKGd0eXBlID09IDApIHsKKyAgICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSB2YWx1ZXNbXSA9IHsKKyAgICAgIHtNRVRIT0RfQ0xJUCwgIk5vcm1hbCBjbGlwcGluZyAoZGVmYXVsdCkiLCAiY2xpcCJ9LAorICAgICAge01FVEhPRF9XUkFQX05FR0FUSVZFLAorICAgICAgICAgICAgIlB1c2ggb3ZlcmRyaXZlbiB2YWx1ZXMgYmFjayBmcm9tIHRoZSBvcHBvc2l0ZSBzaWRlIiwKKyAgICAgICAgICAid3JhcC1uZWdhdGl2ZSJ9LAorICAgICAge01FVEhPRF9XUkFQX1BPU0lUSVZFLCAiUHVzaCBvdmVyZHJpdmVuIHZhbHVlcyBiYWNrIGZyb20gdGhlIHNhbWUgc2lkZSIsCisgICAgICAgICAgIndyYXAtcG9zaXRpdmUifSwKKyAgICAgIHtNRVRIT0RfTk9DTElQLCAiTm8gY2xpcHBpbmciLCAibm9uZSJ9LAorICAgICAgezAsIE5VTEwsIE5VTEx9CisgICAgfTsKKyAgICBndHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RBdWRpb0FtcGxpZnlDbGlwcGluZ01ldGhvZCIsIHZhbHVlcyk7CisgIH0KKyAgcmV0dXJuIGd0eXBlOworfQorCisjZGVmaW5lIEFMTE9XRURfQ0FQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJhdWRpby94LXJhdywiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIGZvcm1hdD0oc3RyaW5nKSB7UzgsIkdTVF9BVURJT19ORShTMTYpIiwiR1NUX0FVRElPX05FKFMzMikiLCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHU1RfQVVESU9fTkUoRjMyKSIsIkdTVF9BVURJT19ORShGNjQpIn0sIiAgXAorICAgICIgcmF0ZT0oaW50KVsxLE1BWF0sIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIGNoYW5uZWxzPShpbnQpWzEsTUFYXSwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBsYXlvdXQ9KHN0cmluZykge2ludGVybGVhdmVkLCBub24taW50ZXJsZWF2ZWR9IgorCitHX0RFRklORV9UWVBFIChHc3RBdWRpb0FtcGxpZnksIGdzdF9hdWRpb19hbXBsaWZ5LCBHU1RfVFlQRV9BVURJT19GSUxURVIpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F1ZGlvX2FtcGxpZnlfc2V0X3Byb2Nlc3NfZnVuY3Rpb24gKEdzdEF1ZGlvQW1wbGlmeSAqCisgICAgZmlsdGVyLCBnaW50IGNsaXBwaW5nLCBHc3RBdWRpb0Zvcm1hdCBmb3JtYXQpOworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2FtcGxpZnlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2FtcGxpZnlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F1ZGlvX2FtcGxpZnlfc2V0dXAgKEdzdEF1ZGlvRmlsdGVyICogZmlsdGVyLAorICAgIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwKKyAgICBHc3RCdWZmZXIgKiBidWYpOworCisjZGVmaW5lIE1JTl9naW50OCBHX01JTklOVDgKKyNkZWZpbmUgTUFYX2dpbnQ4IEdfTUFYSU5UOAorI2RlZmluZSBNSU5fZ2ludDE2IEdfTUlOSU5UMTYKKyNkZWZpbmUgTUFYX2dpbnQxNiBHX01BWElOVDE2CisjZGVmaW5lIE1JTl9naW50MzIgR19NSU5JTlQzMgorI2RlZmluZSBNQVhfZ2ludDMyIEdfTUFYSU5UMzIKKworI2RlZmluZSBNQUtFX0lOVF9GVU5DUyh0eXBlLGxhcmdldHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtXyMjdHlwZSMjX2NsaXAgKEdzdEF1ZGlvQW1wbGlmeSAqIGZpbHRlciwgICAgICAgICAgXAorICAgIHZvaWQgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlICpkID0gZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB3aGlsZSAobnVtX3NhbXBsZXMtLSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxhcmdldHlwZSB2YWwgPSAqZCAqIGZpbHRlci0+YW1wbGlmaWNhdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpkKysgPSAgQ0xBTVAgKHZhbCwgTUlOXyMjdHlwZSwgTUFYXyMjdHlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtXyMjdHlwZSMjX3dyYXBfbmVnYXRpdmUgKEdzdEF1ZGlvQW1wbGlmeSAqIGZpbHRlciwgXAorICAgIHZvaWQgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlICpkID0gZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB3aGlsZSAobnVtX3NhbXBsZXMtLSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxhcmdldHlwZSB2YWwgPSAqZCAqIGZpbHRlci0+YW1wbGlmaWNhdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh2YWwgPiBNQVhfIyN0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdmFsID0gTUlOXyMjdHlwZSArICh2YWwgLSBNSU5fIyN0eXBlKSAlICgobGFyZ2V0eXBlKSBNQVhfIyN0eXBlICsgMSAtICAgXAorICAgICAgICAgIE1JTl8jI3R5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYgKHZhbCA8IE1JTl8jI3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdmFsID0gTUFYXyMjdHlwZSAtIChNQVhfIyN0eXBlIC0gdmFsKSAlICgobGFyZ2V0eXBlKSBNQVhfIyN0eXBlICsgMSAtICAgXAorICAgICAgICAgIE1JTl8jI3R5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpkKysgPSB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtXyMjdHlwZSMjX3dyYXBfcG9zaXRpdmUgKEdzdEF1ZGlvQW1wbGlmeSAqIGZpbHRlciwgXAorICAgIHZvaWQgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlICpkID0gZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB3aGlsZSAobnVtX3NhbXBsZXMtLSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxhcmdldHlwZSB2YWwgPSAqZCAqIGZpbHRlci0+YW1wbGlmaWNhdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKHZhbCA+IE1BWF8jI3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2YWwgPSBNQVhfIyN0eXBlIC0gKHZhbCAtIE1BWF8jI3R5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZWxzZSBpZiAodmFsIDwgTUlOXyMjdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2YWwgPSBNSU5fIyN0eXBlICsgKE1JTl8jI3R5cGUgLSB2YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpkKysgPSB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtXyMjdHlwZSMjX25vY2xpcCAoR3N0QXVkaW9BbXBsaWZ5ICogZmlsdGVyLCAgICAgICAgXAorICAgIHZvaWQgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlICpkID0gZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB3aGlsZSAobnVtX3NhbXBsZXMtLSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpkKysgKj0gZmlsdGVyLT5hbXBsaWZpY2F0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIE1BS0VfRkxPQVRfRlVOQ1ModHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fIyN0eXBlIyNfY2xpcCAoR3N0QXVkaW9BbXBsaWZ5ICogZmlsdGVyLCAgICAgICAgICBcCisgICAgdm9pZCAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGUgKmQgPSBkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHdoaWxlIChudW1fc2FtcGxlcy0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZSB2YWwgPSAqZCogZmlsdGVyLT5hbXBsaWZpY2F0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKmQrKyA9IENMQU1QICh2YWwsIC0xLjAsICsxLjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fIyN0eXBlIyNfd3JhcF9uZWdhdGl2ZSAoR3N0QXVkaW9BbXBsaWZ5ICogICAgICAgICBcCisgICAgZmlsdGVyLCB2b2lkICogZGF0YSwgZ3VpbnQgbnVtX3NhbXBsZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGUgKmQgPSBkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHdoaWxlIChudW1fc2FtcGxlcy0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZSB2YWwgPSAqZCAqIGZpbHRlci0+YW1wbGlmaWNhdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAodmFsID4gMS4wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZhbCA9IC0xLjAgKyAodmFsIC0gMS4wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBlbHNlIGlmICh2YWwgPCAtMS4wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZhbCA9IDEuMCAtICgxLjAgLSB2YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKmQrKyA9IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fIyN0eXBlIyNfd3JhcF9wb3NpdGl2ZSAoR3N0QXVkaW9BbXBsaWZ5ICogZmlsdGVyLCBcCisgICAgdm9pZCAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGUgKmQgPSBkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHdoaWxlIChudW1fc2FtcGxlcy0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZSB2YWwgPSAqZCogZmlsdGVyLT5hbXBsaWZpY2F0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAodmFsID4gMS4wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZhbCA9IDEuMCAtICh2YWwgLSAxLjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBlbHNlIGlmICh2YWwgPCAtMS4wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZhbCA9IC0xLjAgKyAoLTEuMCAtIHZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKmQrKyA9IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fIyN0eXBlIyNfbm9jbGlwIChHc3RBdWRpb0FtcGxpZnkgKiBmaWx0ZXIsICAgICAgICBcCisgICAgdm9pZCAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGUgKmQgPSBkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHdoaWxlIChudW1fc2FtcGxlcy0tKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKmQrKyAqPSBmaWx0ZXItPmFtcGxpZmljYXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8qICpJTkRFTlQtT0ZGKiAqLworTUFLRV9JTlRfRlVOQ1MgKGdpbnQ4LGdpbnQpCitNQUtFX0lOVF9GVU5DUyAoZ2ludDE2LGdpbnQpCitNQUtFX0lOVF9GVU5DUyAoZ2ludDMyLGdpbnQ2NCkKK01BS0VfRkxPQVRfRlVOQ1MgKGdmbG9hdCkKK01BS0VfRkxPQVRfRlVOQ1MgKGdkb3VibGUpCisvKiAqSU5ERU5ULU9OKiAqLworCisvKiBHT2JqZWN0IHZtZXRob2QgaW1wbGVtZW50YXRpb25zICovCisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fYW1wbGlmeV9jbGFzc19pbml0IChHc3RBdWRpb0FtcGxpZnlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X2F1ZGlvX2FtcGxpZnlfZGVidWcsICJhdWRpb2FtcGxpZnkiLCAwLAorICAgICAgImF1ZGlvYW1wbGlmeSBlbGVtZW50Iik7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9hdWRpb19hbXBsaWZ5X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2F1ZGlvX2FtcGxpZnlfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQU1QTElGSUNBVElPTiwKKyAgICAgIGdfcGFyYW1fc3BlY19mbG9hdCAoImFtcGxpZmljYXRpb24iLCAiQW1wbGlmaWNhdGlvbiIsCisgICAgICAgICAgIkZhY3RvciBvZiBhbXBsaWZpY2F0aW9uIiwgLUdfTUFYRkxPQVQsIEdfTUFYRkxPQVQsCisgICAgICAgICAgMS4wLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0QXVkaW9BbXBsaWZ5OmNsaXBwaW5nLW1ldGhvZAorICAgKgorICAgKiBDbGlwcGluZyBtZXRob2Q6IGNsaXAgbW9kZSBzZXQgdmFsdWVzIGhpZ2hlciB0aGFuIHRoZSBtYXhpbXVtIHRvIHRoZQorICAgKiBtYXhpbXVtLiBUaGUgd3JhcC1uZWdhdGl2ZSBtb2RlIHB1c2hlcyB0aG9zZSB2YWx1ZXMgYmFjayBmcm9tIHRoZQorICAgKiBvcHBvc2l0ZSBzaWRlLCB3cmFwLXBvc2l0aXZlIHB1c2hlcyB0aGVtIGJhY2sgZnJvbSB0aGUgc2FtZSBzaWRlLgorICAgKgorICAgKiovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ0xJUFBJTkdfTUVUSE9ELAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJjbGlwcGluZy1tZXRob2QiLCAiQ2xpcHBpbmcgbWV0aG9kIiwKKyAgICAgICAgICAiU2VsZWN0cyBob3cgdG8gaGFuZGxlIHZhbHVlcyBoaWdoZXIgdGhhbiB0aGUgbWF4aW11bSIsCisgICAgICAgICAgR1NUX1RZUEVfQVVESU9fQU1QTElGWV9DTElQUElOR19NRVRIT0QsIE1FVEhPRF9DTElQLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJBdWRpbyBhbXBsaWZpZXIiLAorICAgICAgIkZpbHRlci9FZmZlY3QvQXVkaW8iLAorICAgICAgIkFtcGxpZmllcyBhbiBhdWRpbyBzdHJlYW0gYnkgYSBnaXZlbiBmYWN0b3IiLAorICAgICAgIlNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4iKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFMTE9XRURfQ0FQUyk7CisgIGdzdF9hdWRpb19maWx0ZXJfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZXMgKEdTVF9BVURJT19GSUxURVJfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChrbGFzcyktPnRyYW5zZm9ybV9pcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2lwKTsKKyAgR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChrbGFzcyktPnRyYW5zZm9ybV9pcF9vbl9wYXNzdGhyb3VnaCA9IEZBTFNFOworCisgIEdTVF9BVURJT19GSUxURVJfQ0xBU1MgKGtsYXNzKS0+c2V0dXAgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdWRpb19hbXBsaWZ5X3NldHVwKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19hbXBsaWZ5X2luaXQgKEdzdEF1ZGlvQW1wbGlmeSAqIGZpbHRlcikKK3sKKyAgZmlsdGVyLT5hbXBsaWZpY2F0aW9uID0gMS4wOworICBnc3RfYXVkaW9fYW1wbGlmeV9zZXRfcHJvY2Vzc19mdW5jdGlvbiAoZmlsdGVyLCBNRVRIT0RfQ0xJUCwKKyAgICAgIEdTVF9BVURJT19GT1JNQVRfUzE2KTsKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9pbl9wbGFjZSAoR1NUX0JBU0VfVFJBTlNGT1JNIChmaWx0ZXIpLCBUUlVFKTsKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9nYXBfYXdhcmUgKEdTVF9CQVNFX1RSQU5TRk9STSAoZmlsdGVyKSwgVFJVRSk7Cit9CisKK3N0YXRpYyBHc3RBdWRpb0FtcGxpZnlQcm9jZXNzRnVuYworZ3N0X2F1ZGlvX2FtcGxpZnlfcHJvY2Vzc19mdW5jdGlvbiAoZ2ludCBjbGlwcGluZywgR3N0QXVkaW9Gb3JtYXQgZm9ybWF0KQoreworICBzdGF0aWMgY29uc3Qgc3RydWN0IHByb2Nlc3MKKyAgeworICAgIEdzdEF1ZGlvRm9ybWF0IGZvcm1hdDsKKyAgICBnaW50IGNsaXBwaW5nOworICAgIEdzdEF1ZGlvQW1wbGlmeVByb2Nlc3NGdW5jIGZ1bmM7CisgIH0gcHJvY2Vzc1tdID0geworICAgIHsKKyAgICBHU1RfQVVESU9fRk9STUFUX0YzMiwgTUVUSE9EX0NMSVAsIGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9nZmxvYXRfY2xpcH0sIHsKKyAgICBHU1RfQVVESU9fRk9STUFUX0YzMiwgTUVUSE9EX1dSQVBfTkVHQVRJVkUsCisgICAgICAgICAgZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2dmbG9hdF93cmFwX25lZ2F0aXZlfSwgeworICAgIEdTVF9BVURJT19GT1JNQVRfRjMyLCBNRVRIT0RfV1JBUF9QT1NJVElWRSwKKyAgICAgICAgICBnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fZ2Zsb2F0X3dyYXBfcG9zaXRpdmV9LCB7CisgICAgR1NUX0FVRElPX0ZPUk1BVF9GMzIsIE1FVEhPRF9OT0NMSVAsCisgICAgICAgICAgZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2dmbG9hdF9ub2NsaXB9LCB7CisgICAgR1NUX0FVRElPX0ZPUk1BVF9GNjQsIE1FVEhPRF9DTElQLAorICAgICAgICAgIGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9nZG91YmxlX2NsaXB9LCB7CisgICAgR1NUX0FVRElPX0ZPUk1BVF9GNjQsIE1FVEhPRF9XUkFQX05FR0FUSVZFLAorICAgICAgICAgIGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9nZG91YmxlX3dyYXBfbmVnYXRpdmV9LCB7CisgICAgR1NUX0FVRElPX0ZPUk1BVF9GNjQsIE1FVEhPRF9XUkFQX1BPU0lUSVZFLAorICAgICAgICAgIGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9nZG91YmxlX3dyYXBfcG9zaXRpdmV9LCB7CisgICAgR1NUX0FVRElPX0ZPUk1BVF9GNjQsIE1FVEhPRF9OT0NMSVAsCisgICAgICAgICAgZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2dkb3VibGVfbm9jbGlwfSwgeworICAgIEdTVF9BVURJT19GT1JNQVRfUzgsIE1FVEhPRF9DTElQLCBnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fZ2ludDhfY2xpcH0sIHsKKyAgICBHU1RfQVVESU9fRk9STUFUX1M4LCBNRVRIT0RfV1JBUF9ORUdBVElWRSwKKyAgICAgICAgICBnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fZ2ludDhfd3JhcF9uZWdhdGl2ZX0sIHsKKyAgICBHU1RfQVVESU9fRk9STUFUX1M4LCBNRVRIT0RfV1JBUF9QT1NJVElWRSwKKyAgICAgICAgICBnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fZ2ludDhfd3JhcF9wb3NpdGl2ZX0sIHsKKyAgICBHU1RfQVVESU9fRk9STUFUX1M4LCBNRVRIT0RfTk9DTElQLAorICAgICAgICAgIGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9naW50OF9ub2NsaXB9LCB7CisgICAgR1NUX0FVRElPX0ZPUk1BVF9TMTYsIE1FVEhPRF9DTElQLCBnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fZ2ludDE2X2NsaXB9LCB7CisgICAgR1NUX0FVRElPX0ZPUk1BVF9TMTYsIE1FVEhPRF9XUkFQX05FR0FUSVZFLAorICAgICAgICAgIGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9naW50MTZfd3JhcF9uZWdhdGl2ZX0sIHsKKyAgICBHU1RfQVVESU9fRk9STUFUX1MxNiwgTUVUSE9EX1dSQVBfUE9TSVRJVkUsCisgICAgICAgICAgZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2dpbnQxNl93cmFwX3Bvc2l0aXZlfSwgeworICAgIEdTVF9BVURJT19GT1JNQVRfUzE2LCBNRVRIT0RfTk9DTElQLAorICAgICAgICAgIGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9naW50MTZfbm9jbGlwfSwgeworICAgIEdTVF9BVURJT19GT1JNQVRfUzMyLCBNRVRIT0RfQ0xJUCwgZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2dpbnQzMl9jbGlwfSwgeworICAgIEdTVF9BVURJT19GT1JNQVRfUzMyLCBNRVRIT0RfV1JBUF9ORUdBVElWRSwKKyAgICAgICAgICBnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fZ2ludDMyX3dyYXBfbmVnYXRpdmV9LCB7CisgICAgR1NUX0FVRElPX0ZPUk1BVF9TMzIsIE1FVEhPRF9XUkFQX1BPU0lUSVZFLAorICAgICAgICAgIGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9naW50MzJfd3JhcF9wb3NpdGl2ZX0sIHsKKyAgICBHU1RfQVVESU9fRk9STUFUX1MzMiwgTUVUSE9EX05PQ0xJUCwKKyAgICAgICAgICBnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fZ2ludDMyX25vY2xpcH0sIHsKKyAgICAwLCAwLCBOVUxMfQorICB9OworICBjb25zdCBzdHJ1Y3QgcHJvY2VzcyAqcDsKKworICBmb3IgKHAgPSBwcm9jZXNzOyBwLT5mdW5jOyBwKyspCisgICAgaWYgKHAtPmZvcm1hdCA9PSBmb3JtYXQgJiYgcC0+Y2xpcHBpbmcgPT0gY2xpcHBpbmcpCisgICAgICByZXR1cm4gcC0+ZnVuYzsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1ZGlvX2FtcGxpZnlfc2V0X3Byb2Nlc3NfZnVuY3Rpb24gKEdzdEF1ZGlvQW1wbGlmeSAqIGZpbHRlciwgZ2ludAorICAgIGNsaXBwaW5nX21ldGhvZCwgR3N0QXVkaW9Gb3JtYXQgZm9ybWF0KQoreworICBHc3RBdWRpb0FtcGxpZnlQcm9jZXNzRnVuYyBwcm9jZXNzOworCisgIC8qIHNldCBwcm9jZXNzaW5nIGZ1bmN0aW9uICovCisKKyAgcHJvY2VzcyA9IGdzdF9hdWRpb19hbXBsaWZ5X3Byb2Nlc3NfZnVuY3Rpb24gKGNsaXBwaW5nX21ldGhvZCwgZm9ybWF0KTsKKyAgaWYgKCFwcm9jZXNzKSB7CisgICAgR1NUX0RFQlVHICgid3JvbmcgZm9ybWF0Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgZmlsdGVyLT5wcm9jZXNzID0gcHJvY2VzczsKKyAgZmlsdGVyLT5jbGlwcGluZ19tZXRob2QgPSBjbGlwcGluZ19tZXRob2Q7CisgIGZpbHRlci0+Zm9ybWF0ID0gZm9ybWF0OworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2FtcGxpZnlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEF1ZGlvQW1wbGlmeSAqZmlsdGVyID0gR1NUX0FVRElPX0FNUExJRlkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0FNUExJRklDQVRJT046CisgICAgICBmaWx0ZXItPmFtcGxpZmljYXRpb24gPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgICAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9wYXNzdGhyb3VnaCAoR1NUX0JBU0VfVFJBTlNGT1JNIChmaWx0ZXIpLAorICAgICAgICAgIGZpbHRlci0+YW1wbGlmaWNhdGlvbiA9PSAxLjApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NMSVBQSU5HX01FVEhPRDoKKyAgICAgIGdzdF9hdWRpb19hbXBsaWZ5X3NldF9wcm9jZXNzX2Z1bmN0aW9uIChmaWx0ZXIsIGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKSwKKyAgICAgICAgICBmaWx0ZXItPmZvcm1hdCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fYW1wbGlmeV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXVkaW9BbXBsaWZ5ICpmaWx0ZXIgPSBHU1RfQVVESU9fQU1QTElGWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQU1QTElGSUNBVElPTjoKKyAgICAgIGdfdmFsdWVfc2V0X2Zsb2F0ICh2YWx1ZSwgZmlsdGVyLT5hbXBsaWZpY2F0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTElQUElOR19NRVRIT0Q6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgZmlsdGVyLT5jbGlwcGluZ19tZXRob2QpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBHc3RBdWRpb0ZpbHRlciB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYXVkaW9fYW1wbGlmeV9zZXR1cCAoR3N0QXVkaW9GaWx0ZXIgKiBiYXNlLCBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKQoreworICBHc3RBdWRpb0FtcGxpZnkgKmZpbHRlciA9IEdTVF9BVURJT19BTVBMSUZZIChiYXNlKTsKKworICByZXR1cm4gZ3N0X2F1ZGlvX2FtcGxpZnlfc2V0X3Byb2Nlc3NfZnVuY3Rpb24gKGZpbHRlciwKKyAgICAgIGZpbHRlci0+Y2xpcHBpbmdfbWV0aG9kLCBHU1RfQVVESU9fSU5GT19GT1JNQVQgKGluZm8pKTsKK30KKworLyogR3N0QmFzZVRyYW5zZm9ybSB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0QXVkaW9BbXBsaWZ5ICpmaWx0ZXIgPSBHU1RfQVVESU9fQU1QTElGWSAoYmFzZSk7CisgIGd1aW50IG51bV9zYW1wbGVzOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBzdHJlYW1fdGltZTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgdGltZXN0YW1wID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1Zik7CisgIHN0cmVhbV90aW1lID0KKyAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmYmFzZS0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLCB0aW1lc3RhbXApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwgInN5bmMgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSk7CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdHJlYW1fdGltZSkpCisgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoZmlsdGVyKSwgc3RyZWFtX3RpbWUpOworCisgIGlmIChHX1VOTElLRUxZIChHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19HQVApKSkKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEV1JJVEUpOworICBudW1fc2FtcGxlcyA9IG1hcC5zaXplIC8gR1NUX0FVRElPX0ZJTFRFUl9CUFMgKGZpbHRlcik7CisKKyAgZmlsdGVyLT5wcm9jZXNzIChmaWx0ZXIsIG1hcC5kYXRhLCBudW1fc2FtcGxlcyk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuaCBiL2dzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3M2VlZDEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuaApAQCAtMCwwICsxLDYyIEBACisvKiAKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9BVURJT19BTVBMSUZZX0hfXworI2RlZmluZSBfX0dTVF9BVURJT19BTVBMSUZZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9maWx0ZXIuaD4KKworR19CRUdJTl9ERUNMUworI2RlZmluZSBHU1RfVFlQRV9BVURJT19BTVBMSUZZICAgICAgICAgICAgKGdzdF9hdWRpb19hbXBsaWZ5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9BVURJT19BTVBMSUZZKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVVESU9fQU1QTElGWSxHc3RBdWRpb0FtcGxpZnkpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fQU1QTElGWShvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0FVRElPX0FNUExJRlkpKQorI2RlZmluZSBHU1RfQVVESU9fQU1QTElGWV9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcykgLEdTVF9UWVBFX0FVRElPX0FNUExJRlksR3N0QXVkaW9BbXBsaWZ5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fQU1QTElGWV9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcykgLEdTVF9UWVBFX0FVRElPX0FNUExJRlkpKQorI2RlZmluZSBHU1RfQVVESU9fQU1QTElGWV9HRVRfQ0xBU1Mob2JqKSAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MoKG9iaikgLEdTVF9UWVBFX0FVRElPX0FNUExJRlksR3N0QXVkaW9BbXBsaWZ5Q2xhc3MpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1ZGlvQW1wbGlmeSBHc3RBdWRpb0FtcGxpZnk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9BbXBsaWZ5Q2xhc3MgR3N0QXVkaW9BbXBsaWZ5Q2xhc3M7CisKK3R5cGVkZWYgdm9pZCAoKkdzdEF1ZGlvQW1wbGlmeVByb2Nlc3NGdW5jKSAoR3N0QXVkaW9BbXBsaWZ5ICosIHZvaWQgKiwgZ3VpbnQpOworCitzdHJ1Y3QgX0dzdEF1ZGlvQW1wbGlmeQoreworICBHc3RBdWRpb0ZpbHRlciBhdWRpb2ZpbHRlcjsKKworICBnZmxvYXQgYW1wbGlmaWNhdGlvbjsKKworICAvKiA8IHByaXZhdGUgPiAqLworICBHc3RBdWRpb0FtcGxpZnlQcm9jZXNzRnVuYyBwcm9jZXNzOworICBnaW50IGNsaXBwaW5nX21ldGhvZDsKKyAgR3N0QXVkaW9Gb3JtYXQgZm9ybWF0OworfTsKKworc3RydWN0IF9Hc3RBdWRpb0FtcGxpZnlDbGFzcworeworICBHc3RBdWRpb0ZpbHRlckNsYXNzIHBhcmVudDsKK307CisKK0dUeXBlIGdzdF9hdWRpb19hbXBsaWZ5X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9BVURJT19BTVBMSUZZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jIGIvZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZmViZTkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmMKQEAgLTAsMCArMSw2NjAgQEAKKy8qIAorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKiAKKyAqIENoZWJ5c2hldiB0eXBlIDEgZmlsdGVyIGRlc2lnbiBiYXNlZCBvbgorICogIlRoZSBTY2llbnRpc3QgYW5kIEVuZ2luZWVyJ3MgR3VpZGUgdG8gRFNQIiwgQ2hhcHRlciAyMC4KKyAqIGh0dHA6Ly93d3cuZHNwZ3VpZGUuY29tLworICoKKyAqIEZvciB0eXBlIDIgYW5kIENoZWJ5c2hldiBmaWx0ZXJzIGluIGdlbmVyYWwgcmVhZAorICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DaGVieXNoZXZfZmlsdGVyCisgKgorICogVHJhbnNmb3JtYXRpb24gZnJvbSBsb3dwYXNzIHRvIGJhbmRwYXNzL2JhbmRyZWplY3Q6CisgKiBodHRwOi8vZG9jcy5kZXdyZXNlYXJjaC5jb20vRHNwSGVscC9odG1sL0lESF9MaW5lYXJTeXN0ZW1zX0xvd3Bhc3NUb0JhbmRQYXNzWi5odG0KKyAqIGh0dHA6Ly9kb2NzLmRld3Jlc2VhcmNoLmNvbS9Ec3BIZWxwL2h0bWwvSURIX0xpbmVhclN5c3RlbXNfTG93cGFzc1RvQmFuZFN0b3BaLmh0bQorICogCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXVkaW9jaGViYmFuZAorICoKKyAqIEF0dGVudWF0ZXMgYWxsIGZyZXF1ZW5jaWVzIG91dHNpZGUgKGJhbmRwYXNzKSBvciBpbnNpZGUgKGJhbmRyZWplY3QpIG9mIGEgZnJlcXVlbmN5CisgKiBiYW5kLiBUaGUgbnVtYmVyIG9mIHBvbGVzIGFuZCB0aGUgcmlwcGxlIHBhcmFtZXRlciBjb250cm9sIHRoZSByb2xsb2ZmLgorICoKKyAqIFRoaXMgZWxlbWVudCBoYXMgdGhlIGFkdmFudGFnZSBvdmVyIHRoZSB3aW5kb3dlZCBzaW5jIGJhbmRwYXNzIGFuZCBiYW5kcmVqZWN0IGZpbHRlciB0aGF0IGl0IGlzCisgKiBtdWNoIGZhc3RlciBhbmQgcHJvZHVjZXMgYWxtb3N0IGFzIGdvb2QgcmVzdWx0cy4gSXQncyBvbmx5IGRpc2FkdmFudGFnZXMgYXJlIHRoZSBoaWdobHkKKyAqIG5vbi1saW5lYXIgcGhhc2UgYW5kIHRoZSBzbG93ZXIgcm9sbG9mZiBjb21wYXJlZCB0byBhIHdpbmRvd2VkIHNpbmMgZmlsdGVyIHdpdGggYSBsYXJnZSBrZXJuZWwuCisgKgorICogRm9yIHR5cGUgMSB0aGUgcmlwcGxlIHBhcmFtZXRlciBzcGVjaWZpZXMgaG93IG11Y2ggcmlwcGxlIGluIGRCIGlzIGFsbG93ZWQgaW4gdGhlIHBhc3NiYW5kLCBpLmUuCisgKiBzb21lIGZyZXF1ZW5jaWVzIGluIHRoZSBwYXNzYmFuZCB3aWxsIGJlIGFtcGxpZmllZCBieSB0aGF0IHZhbHVlLiBBIGhpZ2hlciByaXBwbGUgdmFsdWUgd2lsbCBhbGxvdworICogYSBmYXN0ZXIgcm9sbG9mZi4KKyAqCisgKiBGb3IgdHlwZSAyIHRoZSByaXBwbGUgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgc3RvcGJhbmQgYXR0ZW51YXRpb24uIEluIHRoZSBzdG9wYmFuZCB0aGUgZ2FpbiB3aWxsCisgKiBiZSBhdCBtb3N0IHRoaXMgdmFsdWUuIEEgbG93ZXIgcmlwcGxlIHZhbHVlIHdpbGwgYWxsb3cgYSBmYXN0ZXIgcm9sbG9mZi4KKyAqCisgKiBBcyBhIHNwZWNpYWwgY2FzZSwgYSBDaGVieXNoZXYgdHlwZSAxIGZpbHRlciB3aXRoIG5vIHJpcHBsZSBpcyBhIEJ1dHRlcndvcnRoIGZpbHRlci4KKyAqCisgKiA8bm90ZT4KKyAqIEJlIHdhcm5lZCB0aGF0IGEgdG9vIGxhcmdlIG51bWJlciBvZiBwb2xlcyBjYW4gcHJvZHVjZSBub2lzZS4gVGhlIG1vc3QgcG9sZXMgYXJlIHBvc3NpYmxlIHdpdGgKKyAqIGEgY3V0b2ZmIGZyZXF1ZW5jeSBhdCBhIHF1YXJ0ZXIgb2YgdGhlIHNhbXBsaW5nIHJhdGUuCisgKiA8L25vdGU+CisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyBmcmVxPTE1MDAgISBhdWRpb2NvbnZlcnQgISBhdWRpb2NoZWJiYW5kIG1vZGU9YmFuZC1wYXNzIGxvd2VyLWZyZXF1ZW5jeT0xMDAwIHVwcGVyLWZyZXF1ZW5jeT02MDAwIHBvbGVzPTQgISBhdWRpb2NvbnZlcnQgISBhbHNhc2luaworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj0ibWVsbzEub2dnIiAhIG9nZ2RlbXV4ICEgdm9yYmlzZGVjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9jaGViYmFuZCBtb2RlPWJhbmQtcmVqZWN0IGxvd2VyLWZyZXF1ZW5jeT0xMDAwIHVwcGVyLWZyZXF1ZW5jeT00MDAwIHJpcHBsZT0wLjIgISBhdWRpb2NvbnZlcnQgISBhbHNhc2luaworICogZ3N0LWxhdW5jaC0xLjAgYXVkaW90ZXN0c3JjIHdhdmU9d2hpdGUtbm9pc2UgISBhdWRpb2NvbnZlcnQgISBhdWRpb2NoZWJiYW5kIG1vZGU9YmFuZC1wYXNzIGxvd2VyLWZyZXF1ZW5jeT0xMDAwIHVwcGVyLWZyZXF1ZW5jeT00MDAwIHR5cGU9MiAhIGF1ZGlvY29udmVydCAhIGFsc2FzaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJtYXRoX2NvbXBhdC5oIgorCisjaW5jbHVkZSAiYXVkaW9jaGViYmFuZC5oIgorCisjaW5jbHVkZSAiZ3N0L2dsaWItY29tcGF0LXByaXZhdGUuaCIKKworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X2F1ZGlvX2NoZWJfYmFuZF9kZWJ1ZworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoR1NUX0NBVF9ERUZBVUxUKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTU9ERSwKKyAgUFJPUF9UWVBFLAorICBQUk9QX0xPV0VSX0ZSRVFVRU5DWSwKKyAgUFJPUF9VUFBFUl9GUkVRVUVOQ1ksCisgIFBST1BfUklQUExFLAorICBQUk9QX1BPTEVTCit9OworCisjZGVmaW5lIGdzdF9hdWRpb19jaGViX2JhbmRfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0QXVkaW9DaGViQmFuZCwgZ3N0X2F1ZGlvX2NoZWJfYmFuZCwKKyAgICBHU1RfVFlQRV9BVURJT19GWF9CQVNFX0lJUl9GSUxURVIpOworCitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fY2hlYl9iYW5kX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19jaGViX2JhbmRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2NoZWJfYmFuZF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9fY2hlYl9iYW5kX3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGZpbHRlciwKKyAgICBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKTsKKworZW51bQoreworICBNT0RFX0JBTkRfUEFTUyA9IDAsCisgIE1PREVfQkFORF9SRUpFQ1QKK307CisKKyNkZWZpbmUgR1NUX1RZUEVfQVVESU9fQ0hFQllTSEVWX0ZSRVFfQkFORF9NT0RFIChnc3RfYXVkaW9fY2hlYl9iYW5kX21vZGVfZ2V0X3R5cGUgKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9hdWRpb19jaGViX2JhbmRfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGd0eXBlID0gMDsKKworICBpZiAoZ3R5cGUgPT0gMCkgeworICAgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIHZhbHVlc1tdID0geworICAgICAge01PREVfQkFORF9QQVNTLCAiQmFuZCBwYXNzIChkZWZhdWx0KSIsCisgICAgICAgICAgImJhbmQtcGFzcyJ9LAorICAgICAge01PREVfQkFORF9SRUpFQ1QsICJCYW5kIHJlamVjdCIsCisgICAgICAgICAgImJhbmQtcmVqZWN0In0sCisgICAgICB7MCwgTlVMTCwgTlVMTH0KKyAgICB9OworCisgICAgZ3R5cGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0QXVkaW9DaGViQmFuZE1vZGUiLCB2YWx1ZXMpOworICB9CisgIHJldHVybiBndHlwZTsKK30KKworLyogR09iamVjdCB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2NoZWJfYmFuZF9jbGFzc19pbml0IChHc3RBdWRpb0NoZWJCYW5kQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyAqZmlsdGVyX2NsYXNzID0gKEdzdEF1ZGlvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9hdWRpb19jaGViX2JhbmRfZGVidWcsICJhdWRpb2NoZWJiYW5kIiwgMCwKKyAgICAgICJhdWRpb2NoZWJiYW5kIGVsZW1lbnQiKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9fY2hlYl9iYW5kX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2F1ZGlvX2NoZWJfYmFuZF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2F1ZGlvX2NoZWJfYmFuZF9maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01PREUsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoIm1vZGUiLCAiTW9kZSIsCisgICAgICAgICAgIkxvdyBwYXNzIG9yIGhpZ2ggcGFzcyBtb2RlIiwgR1NUX1RZUEVfQVVESU9fQ0hFQllTSEVWX0ZSRVFfQkFORF9NT0RFLAorICAgICAgICAgIE1PREVfQkFORF9QQVNTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UWVBFLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInR5cGUiLCAiVHlwZSIsICJUeXBlIG9mIHRoZSBjaGVieWNoZXYgZmlsdGVyIiwgMSwgMiwgMSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyogRklYTUU6IERvbid0IHVzZSB0aGUgY29tcGxldGUgcG9zc2libGUgcmFuZ2UgYnV0IHJlc3RyaWN0IHRoZSB1cHBlciBib3VuZGFyeQorICAgKiBzbyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBVSXMgY2FuIHVzZSBhIHNsaWRlciB3aXRob3V0ICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTE9XRVJfRlJFUVVFTkNZLAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgibG93ZXItZnJlcXVlbmN5IiwgIkxvd2VyIGZyZXF1ZW5jeSIsCisgICAgICAgICAgIlN0YXJ0IGZyZXF1ZW5jeSBvZiB0aGUgYmFuZCAoSHopIiwgMC4wLCAxMDAwMDAuMCwKKyAgICAgICAgICAwLjAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1VQUEVSX0ZSRVFVRU5DWSwKKyAgICAgIGdfcGFyYW1fc3BlY19mbG9hdCAoInVwcGVyLWZyZXF1ZW5jeSIsICJVcHBlciBmcmVxdWVuY3kiLAorICAgICAgICAgICJTdG9wIGZyZXF1ZW5jeSBvZiB0aGUgYmFuZCAoSHopIiwgMC4wLCAxMDAwMDAuMCwgMC4wLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SSVBQTEUsCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJyaXBwbGUiLCAiUmlwcGxlIiwgIkFtb3VudCBvZiByaXBwbGUgKGRCKSIsIDAuMCwKKyAgICAgICAgICAyMDAuMCwgMC4yNSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qIEZJWE1FOiBXaGF0IHRvIGRvIGFib3V0IHRoaXMgdXBwZXIgYm91bmRhcnk/IFdpdGggYSBmcmVxdWVuY2llcyBuZWFyCisgICAqIHJhdGUvNCAzMiBwb2xlcyBhcmUgY29tcGxldGVseSBwb3NzaWJsZSwgd2l0aCBmcmVxdWVuY2llcyB2ZXJ5IGxvdworICAgKiBvciB2ZXJ5IGhpZ2ggMTYgcG9sZXMgYWxyZWFkeSBwcm9kdWNlcyBvbmx5IG5vaXNlICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUE9MRVMsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicG9sZXMiLCAiUG9sZXMiLAorICAgICAgICAgICJOdW1iZXIgb2YgcG9sZXMgdG8gdXNlLCB3aWxsIGJlIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgbXVsdGlwbHkgb2YgZm91ciIsCisgICAgICAgICAgNCwgMzIsIDQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiQmFuZCBwYXNzICYgYmFuZCByZWplY3QgZmlsdGVyIiwgIkZpbHRlci9FZmZlY3QvQXVkaW8iLAorICAgICAgIkNoZWJ5c2hldiBiYW5kIHBhc3MgYW5kIGJhbmQgcmVqZWN0IGZpbHRlciIsCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgZmlsdGVyX2NsYXNzLT5zZXR1cCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVkaW9fY2hlYl9iYW5kX3NldHVwKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19jaGViX2JhbmRfaW5pdCAoR3N0QXVkaW9DaGViQmFuZCAqIGZpbHRlcikKK3sKKyAgZmlsdGVyLT5sb3dlcl9mcmVxdWVuY3kgPSBmaWx0ZXItPnVwcGVyX2ZyZXF1ZW5jeSA9IDAuMDsKKyAgZmlsdGVyLT5tb2RlID0gTU9ERV9CQU5EX1BBU1M7CisgIGZpbHRlci0+dHlwZSA9IDE7CisgIGZpbHRlci0+cG9sZXMgPSA0OworICBmaWx0ZXItPnJpcHBsZSA9IDAuMjU7CisKKyAgZ19tdXRleF9pbml0ICgmZmlsdGVyLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2dlbmVyYXRlX2JpcXVhZF9jb2VmZmljaWVudHMgKEdzdEF1ZGlvQ2hlYkJhbmQgKiBmaWx0ZXIsCisgICAgZ2ludCBwLCBnaW50IHJhdGUsIGdkb3VibGUgKiBiMCwgZ2RvdWJsZSAqIGIxLCBnZG91YmxlICogYjIsIGdkb3VibGUgKiBiMywKKyAgICBnZG91YmxlICogYjQsIGdkb3VibGUgKiBhMSwgZ2RvdWJsZSAqIGEyLCBnZG91YmxlICogYTMsIGdkb3VibGUgKiBhNCkKK3sKKyAgZ2ludCBucCA9IGZpbHRlci0+cG9sZXMgLyAyOworICBnZG91YmxlIHJpcHBsZSA9IGZpbHRlci0+cmlwcGxlOworCisgIC8qIHBvbGUgbG9jYXRpb24gaW4gcy1wbGFuZSAqLworICBnZG91YmxlIHJwLCBpcDsKKworICAvKiB6ZXJvIGxvY2F0aW9uIGluIHMtcGxhbmUgKi8KKyAgZ2RvdWJsZSBpeiA9IDAuMDsKKworICAvKiB0cmFuc2ZlciBmdW5jdGlvbiBjb2VmZmljaWVudHMgZm9yIHRoZSB6LXBsYW5lICovCisgIGdkb3VibGUgeDAsIHgxLCB4MiwgeTEsIHkyOworICBnaW50IHR5cGUgPSBmaWx0ZXItPnR5cGU7CisKKyAgLyogQ2FsY3VsYXRlIHBvbGUgbG9jYXRpb24gZm9yIGxvd3Bhc3MgYXQgZnJlcXVlbmN5IDEgKi8KKyAgeworICAgIGdkb3VibGUgYW5nbGUgPSAoR19QSSAvIDIuMCkgKiAoMi4wICogcCAtIDEpIC8gbnA7CisKKyAgICBycCA9IC1zaW4gKGFuZ2xlKTsKKyAgICBpcCA9IGNvcyAoYW5nbGUpOworICB9CisKKyAgLyogSWYgd2UgYWxsb3cgcmlwcGxlLCBtb3ZlIHRoZSBwb2xlIGZyb20gdGhlIHVuaXQKKyAgICogY2lyY2xlIHRvIGFuIGVsbGlwc2UgYW5kIGtlZXAgY3V0b2ZmIGF0IGZyZXF1ZW5jeSAxICovCisgIGlmIChyaXBwbGUgPiAwICYmIHR5cGUgPT0gMSkgeworICAgIGdkb3VibGUgZXMsIHZ4OworCisgICAgZXMgPSBzcXJ0IChwb3cgKDEwLjAsIHJpcHBsZSAvIDEwLjApIC0gMS4wKTsKKworICAgIHZ4ID0gKDEuMCAvIG5wKSAqIGFzaW5oICgxLjAgLyBlcyk7CisgICAgcnAgPSBycCAqIHNpbmggKHZ4KTsKKyAgICBpcCA9IGlwICogY29zaCAodngpOworICB9IGVsc2UgaWYgKHR5cGUgPT0gMikgeworICAgIGdkb3VibGUgZXMsIHZ4OworCisgICAgZXMgPSBzcXJ0IChwb3cgKDEwLjAsIHJpcHBsZSAvIDEwLjApIC0gMS4wKTsKKyAgICB2eCA9ICgxLjAgLyBucCkgKiBhc2luaCAoZXMpOworICAgIHJwID0gcnAgKiBzaW5oICh2eCk7CisgICAgaXAgPSBpcCAqIGNvc2ggKHZ4KTsKKyAgfQorCisgIC8qIENhbGN1bGF0ZSBpbnZlcnNlIG9mIHRoZSBwb2xlIGxvY2F0aW9uIHRvIG1vdmUgZnJvbQorICAgKiB0eXBlIEkgdG8gdHlwZSBJSSAqLworICBpZiAodHlwZSA9PSAyKSB7CisgICAgZ2RvdWJsZSBtYWcyID0gcnAgKiBycCArIGlwICogaXA7CisKKyAgICBycCAvPSBtYWcyOworICAgIGlwIC89IG1hZzI7CisgIH0KKworICAvKiBDYWxjdWxhdGUgemVybyBsb2NhdGlvbiBmb3IgZnJlcXVlbmN5IDEgb24gdGhlCisgICAqIHVuaXQgY2lyY2xlIGZvciB0eXBlIDIgKi8KKyAgaWYgKHR5cGUgPT0gMikgeworICAgIGdkb3VibGUgYW5nbGUgPSBHX1BJIC8gKG5wICogMi4wKSArICgocCAtIDEpICogR19QSSkgLyAobnApOworICAgIGdkb3VibGUgbWFnMjsKKworICAgIGl6ID0gY29zIChhbmdsZSk7CisgICAgbWFnMiA9IGl6ICogaXo7CisgICAgaXogLz0gbWFnMjsKKyAgfQorCisgIC8qIENvbnZlcnQgZnJvbSBzLWRvbWFpbiB0byB6LWRvbWFpbiBieQorICAgKiB1c2luZyB0aGUgYmlsaW5lYXIgWi10cmFuc2Zvcm0sIGkuZS4KKyAgICogc3Vic3RpdHV0ZSBzIGJ5ICgyL3QpKigoei0xKS8oeisxKSkKKyAgICogd2l0aCB0ID0gMiAqIHRhbigwLjUpLgorICAgKi8KKyAgaWYgKHR5cGUgPT0gMSkgeworICAgIGdkb3VibGUgdCwgbSwgZDsKKworICAgIHQgPSAyLjAgKiB0YW4gKDAuNSk7CisgICAgbSA9IHJwICogcnAgKyBpcCAqIGlwOworICAgIGQgPSA0LjAgLSA0LjAgKiBycCAqIHQgKyBtICogdCAqIHQ7CisKKyAgICB4MCA9ICh0ICogdCkgLyBkOworICAgIHgxID0gMi4wICogeDA7CisgICAgeDIgPSB4MDsKKyAgICB5MSA9ICg4LjAgLSAyLjAgKiBtICogdCAqIHQpIC8gZDsKKyAgICB5MiA9ICgtNC4wIC0gNC4wICogcnAgKiB0IC0gbSAqIHQgKiB0KSAvIGQ7CisgIH0gZWxzZSB7CisgICAgZ2RvdWJsZSB0LCBtLCBkOworCisgICAgdCA9IDIuMCAqIHRhbiAoMC41KTsKKyAgICBtID0gcnAgKiBycCArIGlwICogaXA7CisgICAgZCA9IDQuMCAtIDQuMCAqIHJwICogdCArIG0gKiB0ICogdDsKKworICAgIHgwID0gKHQgKiB0ICogaXogKiBpeiArIDQuMCkgLyBkOworICAgIHgxID0gKC04LjAgKyAyLjAgKiBpeiAqIGl6ICogdCAqIHQpIC8gZDsKKyAgICB4MiA9IHgwOworICAgIHkxID0gKDguMCAtIDIuMCAqIG0gKiB0ICogdCkgLyBkOworICAgIHkyID0gKC00LjAgLSA0LjAgKiBycCAqIHQgLSBtICogdCAqIHQpIC8gZDsKKyAgfQorCisgIC8qIENvbnZlcnQgZnJvbSBsb3dwYXNzIGF0IGZyZXF1ZW5jeSAxIHRvIGVpdGhlciBiYW5kcGFzcworICAgKiBvciBiYW5kIHJlamVjdC4KKyAgICoKKyAgICogRm9yIGJhbmRwYXNzIHN1YnN0aXR1dGUgel4oLTEpIHdpdGg6CisgICAqCisgICAqICAgLTIgICAgICAgICAgICAtMQorICAgKiAteiAgICsgYWxwaGEgKiB6ICAgLSBiZXRhCisgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogICAgICAgICAtMiAgICAgICAgICAgIC0xCisgICAqIGJldGEgKiB6ICAgLSBhbHBoYSAqIHogICArIDEKKyAgICoKKyAgICogYWxwaGEgPSAoMiphKmIpLygxK2IpCisgICAqIGJldGEgPSAoYi0xKS8oYisxKQorICAgKiBhID0gY29zKCh3MSArIHcwKS8yKSAvIGNvcygodzEgLSB3MCkvMikKKyAgICogYiA9IHRhbigxLzIpICogY290KCh3MSAtIHcwKS8yKQorICAgKgorICAgKiBGb3IgYmFuZHJlamVjdCBzdWJzdGl0dXRlIHpeKC0xKSB3aXRoOgorICAgKiAKKyAgICogIC0yICAgICAgICAgICAgLTEKKyAgICogeiAgIC0gYWxwaGEgKiB6ICAgKyBiZXRhCisgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogICAgICAgICAtMiAgICAgICAgICAgIC0xCisgICAqIGJldGEgKiB6ICAgLSBhbHBoYSAqIHogICArIDEKKyAgICoKKyAgICogYWxwaGEgPSAoMiphKS8oMStiKQorICAgKiBiZXRhID0gKDEtYikvKDErYikKKyAgICogYSA9IGNvcygodzEgKyB3MCkvMikgLyBjb3MoKHcxIC0gdzApLzIpCisgICAqIGIgPSB0YW4oMS8yKSAqIHRhbigodzEgLSB3MCkvMikKKyAgICoKKyAgICovCisgIHsKKyAgICBnZG91YmxlIGEsIGIsIGQ7CisgICAgZ2RvdWJsZSBhbHBoYSwgYmV0YTsKKyAgICBnZG91YmxlIHcwID0gMi4wICogR19QSSAqIChmaWx0ZXItPmxvd2VyX2ZyZXF1ZW5jeSAvIHJhdGUpOworICAgIGdkb3VibGUgdzEgPSAyLjAgKiBHX1BJICogKGZpbHRlci0+dXBwZXJfZnJlcXVlbmN5IC8gcmF0ZSk7CisKKyAgICBpZiAoZmlsdGVyLT5tb2RlID09IE1PREVfQkFORF9QQVNTKSB7CisgICAgICBhID0gY29zICgodzEgKyB3MCkgLyAyLjApIC8gY29zICgodzEgLSB3MCkgLyAyLjApOworICAgICAgYiA9IHRhbiAoMS4wIC8gMi4wKSAvIHRhbiAoKHcxIC0gdzApIC8gMi4wKTsKKworICAgICAgYWxwaGEgPSAoMi4wICogYSAqIGIpIC8gKDEuMCArIGIpOworICAgICAgYmV0YSA9IChiIC0gMS4wKSAvIChiICsgMS4wKTsKKworICAgICAgZCA9IDEuMCArIGJldGEgKiAoeTEgLSBiZXRhICogeTIpOworCisgICAgICAqYjAgPSAoeDAgKyBiZXRhICogKC14MSArIGJldGEgKiB4MikpIC8gZDsKKyAgICAgICpiMSA9IChhbHBoYSAqICgtMi4wICogeDAgKyB4MSArIGJldGEgKiB4MSAtIDIuMCAqIGJldGEgKiB4MikpIC8gZDsKKyAgICAgICpiMiA9CisgICAgICAgICAgKC14MSAtIGJldGEgKiBiZXRhICogeDEgKyAyLjAgKiBiZXRhICogKHgwICsgeDIpICsKKyAgICAgICAgICBhbHBoYSAqIGFscGhhICogKHgwIC0geDEgKyB4MikpIC8gZDsKKyAgICAgICpiMyA9IChhbHBoYSAqICh4MSArIGJldGEgKiAoLTIuMCAqIHgwICsgeDEpIC0gMi4wICogeDIpKSAvIGQ7CisgICAgICAqYjQgPSAoYmV0YSAqIChiZXRhICogeDAgLSB4MSkgKyB4MikgLyBkOworICAgICAgKmExID0gKGFscGhhICogKDIuMCArIHkxICsgYmV0YSAqIHkxIC0gMi4wICogYmV0YSAqIHkyKSkgLyBkOworICAgICAgKmEyID0KKyAgICAgICAgICAoLXkxIC0gYmV0YSAqIGJldGEgKiB5MSAtIGFscGhhICogYWxwaGEgKiAoMS4wICsgeTEgLSB5MikgKworICAgICAgICAgIDIuMCAqIGJldGEgKiAoLTEuMCArIHkyKSkgLyBkOworICAgICAgKmEzID0gKGFscGhhICogKHkxICsgYmV0YSAqICgyLjAgKyB5MSkgLSAyLjAgKiB5MikpIC8gZDsKKyAgICAgICphNCA9ICgtYmV0YSAqIGJldGEgLSBiZXRhICogeTEgKyB5MikgLyBkOworICAgIH0gZWxzZSB7CisgICAgICBhID0gY29zICgodzEgKyB3MCkgLyAyLjApIC8gY29zICgodzEgLSB3MCkgLyAyLjApOworICAgICAgYiA9IHRhbiAoMS4wIC8gMi4wKSAqIHRhbiAoKHcxIC0gdzApIC8gMi4wKTsKKworICAgICAgYWxwaGEgPSAoMi4wICogYSkgLyAoMS4wICsgYik7CisgICAgICBiZXRhID0gKDEuMCAtIGIpIC8gKDEuMCArIGIpOworCisgICAgICBkID0gLTEuMCArIGJldGEgKiAoYmV0YSAqIHkyICsgeTEpOworCisgICAgICAqYjAgPSAoLXgwIC0gYmV0YSAqIHgxIC0gYmV0YSAqIGJldGEgKiB4MikgLyBkOworICAgICAgKmIxID0gKGFscGhhICogKDIuMCAqIHgwICsgeDEgKyBiZXRhICogeDEgKyAyLjAgKiBiZXRhICogeDIpKSAvIGQ7CisgICAgICAqYjIgPQorICAgICAgICAgICgteDEgLSBiZXRhICogYmV0YSAqIHgxIC0gMi4wICogYmV0YSAqICh4MCArIHgyKSAtCisgICAgICAgICAgYWxwaGEgKiBhbHBoYSAqICh4MCArIHgxICsgeDIpKSAvIGQ7CisgICAgICAqYjMgPSAoYWxwaGEgKiAoeDEgKyBiZXRhICogKDIuMCAqIHgwICsgeDEpICsgMi4wICogeDIpKSAvIGQ7CisgICAgICAqYjQgPSAoLWJldGEgKiBiZXRhICogeDAgLSBiZXRhICogeDEgLSB4MikgLyBkOworICAgICAgKmExID0gKGFscGhhICogKC0yLjAgKyB5MSArIGJldGEgKiB5MSArIDIuMCAqIGJldGEgKiB5MikpIC8gZDsKKyAgICAgICphMiA9CisgICAgICAgICAgLSh5MSArIGJldGEgKiBiZXRhICogeTEgKyAyLjAgKiBiZXRhICogKC0xLjAgKyB5MikgKworICAgICAgICAgIGFscGhhICogYWxwaGEgKiAoLTEuMCArIHkxICsgeTIpKSAvIGQ7CisgICAgICAqYTMgPSAoYWxwaGEgKiAoYmV0YSAqICgtMi4wICsgeTEpICsgeTEgKyAyLjAgKiB5MikpIC8gZDsKKyAgICAgICphNCA9IC0oLWJldGEgKiBiZXRhICsgYmV0YSAqIHkxICsgeTIpIC8gZDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dlbmVyYXRlX2NvZWZmaWNpZW50cyAoR3N0QXVkaW9DaGViQmFuZCAqIGZpbHRlciwgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbykKK3sKKyAgZ2ludCByYXRlOworCisgIGlmIChpbmZvKSB7CisgICAgcmF0ZSA9IEdTVF9BVURJT19JTkZPX1JBVEUgKGluZm8pOworICB9IGVsc2UgeworICAgIHJhdGUgPSBHU1RfQVVESU9fRklMVEVSX1JBVEUgKGZpbHRlcik7CisgIH0KKworICBpZiAocmF0ZSA9PSAwKSB7CisgICAgZ2RvdWJsZSAqYSA9IGdfbmV3MCAoZ2RvdWJsZSwgMSk7CisgICAgZ2RvdWJsZSAqYiA9IGdfbmV3MCAoZ2RvdWJsZSwgMSk7CisKKyAgICBhWzBdID0gMS4wOworICAgIGJbMF0gPSAxLjA7CisgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9zZXRfY29lZmZpY2llbnRzIChHU1RfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSCisgICAgICAgIChmaWx0ZXIpLCBhLCAxLCBiLCAxKTsKKyAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAicmF0ZSB3YXMgbm90IHNldCB5ZXQiKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoZmlsdGVyLT51cHBlcl9mcmVxdWVuY3kgPD0gZmlsdGVyLT5sb3dlcl9mcmVxdWVuY3kpIHsKKyAgICBnZG91YmxlICphID0gZ19uZXcwIChnZG91YmxlLCAxKTsKKyAgICBnZG91YmxlICpiID0gZ19uZXcwIChnZG91YmxlLCAxKTsKKworICAgIGFbMF0gPSAxLjA7CisgICAgYlswXSA9IChmaWx0ZXItPm1vZGUgPT0gTU9ERV9CQU5EX1BBU1MpID8gMC4wIDogMS4wOworICAgIGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfc2V0X2NvZWZmaWNpZW50cyAoR1NUX0FVRElPX0ZYX0JBU0VfSUlSX0ZJTFRFUgorICAgICAgICAoZmlsdGVyKSwgYSwgMSwgYiwgMSk7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiZnJlcXVlbmN5IGJhbmQgaGFkIG5vIG9yIG5lZ2F0aXZlIGRpbWVuc2lvbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChmaWx0ZXItPnVwcGVyX2ZyZXF1ZW5jeSA+IHJhdGUgLyAyKSB7CisgICAgZmlsdGVyLT51cHBlcl9mcmVxdWVuY3kgPSByYXRlIC8gMjsKKyAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiY2xpcHBlZCB1cHBlciBmcmVxdWVuY3kgdG8gbnlxdWlzdCBmcmVxdWVuY3kiKTsKKyAgfQorCisgIGlmIChmaWx0ZXItPmxvd2VyX2ZyZXF1ZW5jeSA8IDAuMCkgeworICAgIGZpbHRlci0+bG93ZXJfZnJlcXVlbmN5ID0gMC4wOworICAgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICJjbGlwcGVkIGxvd2VyIGZyZXF1ZW5jeSB0byAwLjAiKTsKKyAgfQorCisgIC8qIENhbGN1bGF0ZSBjb2VmZmljaWVudHMgZm9yIHRoZSBjaGVieXNoZXYgZmlsdGVyICovCisgIHsKKyAgICBnaW50IG5wID0gZmlsdGVyLT5wb2xlczsKKyAgICBnZG91YmxlICphLCAqYjsKKyAgICBnaW50IGksIHA7CisKKyAgICBhID0gZ19uZXcwIChnZG91YmxlLCBucCArIDUpOworICAgIGIgPSBnX25ldzAgKGdkb3VibGUsIG5wICsgNSk7CisKKyAgICAvKiBDYWxjdWxhdGUgdHJhbnNmZXIgZnVuY3Rpb24gY29lZmZpY2llbnRzICovCisgICAgYVs0XSA9IDEuMDsKKyAgICBiWzRdID0gMS4wOworCisgICAgZm9yIChwID0gMTsgcCA8PSBucCAvIDQ7IHArKykgeworICAgICAgZ2RvdWJsZSBiMCwgYjEsIGIyLCBiMywgYjQsIGExLCBhMiwgYTMsIGE0OworICAgICAgZ2RvdWJsZSAqdGEgPSBnX25ldzAgKGdkb3VibGUsIG5wICsgNSk7CisgICAgICBnZG91YmxlICp0YiA9IGdfbmV3MCAoZ2RvdWJsZSwgbnAgKyA1KTsKKworICAgICAgZ2VuZXJhdGVfYmlxdWFkX2NvZWZmaWNpZW50cyAoZmlsdGVyLCBwLCByYXRlLAorICAgICAgICAgICZiMCwgJmIxLCAmYjIsICZiMywgJmI0LCAmYTEsICZhMiwgJmEzLCAmYTQpOworCisgICAgICBtZW1jcHkgKHRhLCBhLCBzaXplb2YgKGdkb3VibGUpICogKG5wICsgNSkpOworICAgICAgbWVtY3B5ICh0YiwgYiwgc2l6ZW9mIChnZG91YmxlKSAqIChucCArIDUpKTsKKworICAgICAgLyogYWRkIHRoZSBuZXcgY29lZmZpY2llbnRzIGZvciB0aGUgbmV3IHR3byBwb2xlcworICAgICAgICogdG8gdGhlIGNhc2NhZGUgYnkgbXVsdGlwbGljYXRpb24gb2YgdGhlIHRyYW5zZmVyCisgICAgICAgKiBmdW5jdGlvbnMgKi8KKyAgICAgIGZvciAoaSA9IDQ7IGkgPCBucCArIDU7IGkrKykgeworICAgICAgICBiW2ldID0KKyAgICAgICAgICAgIGIwICogdGJbaV0gKyBiMSAqIHRiW2kgLSAxXSArIGIyICogdGJbaSAtIDJdICsgYjMgKiB0YltpIC0gM10gKworICAgICAgICAgICAgYjQgKiB0YltpIC0gNF07CisgICAgICAgIGFbaV0gPQorICAgICAgICAgICAgdGFbaV0gLSBhMSAqIHRhW2kgLSAxXSAtIGEyICogdGFbaSAtIDJdIC0gYTMgKiB0YVtpIC0gM10gLQorICAgICAgICAgICAgYTQgKiB0YVtpIC0gNF07CisgICAgICB9CisgICAgICBnX2ZyZWUgKHRhKTsKKyAgICAgIGdfZnJlZSAodGIpOworICAgIH0KKworICAgIC8qIE1vdmUgY29lZmZpY2llbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5IHRvIG1vdmUgZnJvbQorICAgICAqIHRoZSB0cmFuc2ZlciBmdW5jdGlvbidzIGNvZWZmaWNpZW50cyB0byB0aGUgZGlmZmVyZW5jZQorICAgICAqIGVxdWF0aW9uJ3MgY29lZmZpY2llbnRzICovCisgICAgZm9yIChpID0gMDsgaSA8PSBucDsgaSsrKSB7CisgICAgICBhW2ldID0gYVtpICsgNF07CisgICAgICBiW2ldID0gYltpICsgNF07CisgICAgfQorCisgICAgLyogTm9ybWFsaXplIHRvIHVuaXR5IGdhaW4gYXQgZnJlcXVlbmN5IDAgYW5kIGZyZXF1ZW5jeQorICAgICAqIDAuNSBmb3IgYmFuZHJlamVjdCBhbmQgdW5pdHkgZ2FpbiBhdCBiYW5kIGNlbnRlciBmcmVxdWVuY3kKKyAgICAgKiBmb3IgYmFuZHBhc3MgKi8KKyAgICBpZiAoZmlsdGVyLT5tb2RlID09IE1PREVfQkFORF9SRUpFQ1QpIHsKKyAgICAgIC8qIGdhaW4gaXMgc3FydChIKDApKkgoMC41KSkgKi8KKworICAgICAgZ2RvdWJsZSBnYWluMSA9CisgICAgICAgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9jYWxjdWxhdGVfZ2FpbiAoYSwgbnAgKyAxLCBiLCBucCArIDEsCisgICAgICAgICAgMS4wLCAwLjApOworICAgICAgZ2RvdWJsZSBnYWluMiA9CisgICAgICAgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9jYWxjdWxhdGVfZ2FpbiAoYSwgbnAgKyAxLCBiLCBucCArIDEsCisgICAgICAgICAgLTEuMCwgMC4wKTsKKworICAgICAgZ2FpbjEgPSBzcXJ0IChnYWluMSAqIGdhaW4yKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8PSBucDsgaSsrKSB7CisgICAgICAgIGJbaV0gLz0gZ2FpbjE7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGdhaW4gaXMgSCh3YyksIHdjID0gY2VudGVyIGZyZXF1ZW5jeSAqLworCisgICAgICBnZG91YmxlIHcxID0gMi4wICogR19QSSAqIChmaWx0ZXItPmxvd2VyX2ZyZXF1ZW5jeSAvIHJhdGUpOworICAgICAgZ2RvdWJsZSB3MiA9IDIuMCAqIEdfUEkgKiAoZmlsdGVyLT51cHBlcl9mcmVxdWVuY3kgLyByYXRlKTsKKyAgICAgIGdkb3VibGUgdzAgPSAodzIgKyB3MSkgLyAyLjA7CisgICAgICBnZG91YmxlIHpyID0gY29zICh3MCksIHppID0gc2luICh3MCk7CisgICAgICBnZG91YmxlIGdhaW4gPQorICAgICAgICAgIGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfY2FsY3VsYXRlX2dhaW4gKGEsIG5wICsgMSwgYiwgbnAgKyAxLCB6ciwKKyAgICAgICAgICB6aSk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPD0gbnA7IGkrKykgeworICAgICAgICBiW2ldIC89IGdhaW47CisgICAgICB9CisgICAgfQorCisgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9zZXRfY29lZmZpY2llbnRzIChHU1RfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSCisgICAgICAgIChmaWx0ZXIpLCBhLCBucCArIDEsIGIsIG5wICsgMSk7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLAorICAgICAgICAiR2VuZXJhdGVkIElJUiBjb2VmZmljaWVudHMgZm9yIHRoZSBDaGVieXNoZXYgZmlsdGVyIik7CisgICAgR1NUX0xPR19PQkpFQ1QgKGZpbHRlciwKKyAgICAgICAgIm1vZGU6ICVzLCB0eXBlOiAlZCwgcG9sZXM6ICVkLCBsb3dlci1mcmVxdWVuY3k6ICUuMmYgSHosIHVwcGVyLWZyZXF1ZW5jeTogJS4yZiBIeiwgcmlwcGxlOiAlLjJmIGRCIiwKKyAgICAgICAgKGZpbHRlci0+bW9kZSA9PSBNT0RFX0JBTkRfUEFTUykgPyAiYmFuZC1wYXNzIiA6ICJiYW5kLXJlamVjdCIsCisgICAgICAgIGZpbHRlci0+dHlwZSwgZmlsdGVyLT5wb2xlcywgZmlsdGVyLT5sb3dlcl9mcmVxdWVuY3ksCisgICAgICAgIGZpbHRlci0+dXBwZXJfZnJlcXVlbmN5LCBmaWx0ZXItPnJpcHBsZSk7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiJS4yZiBkQiBnYWluIEAgMEh6IiwKKyAgICAgICAgMjAuMCAqIGxvZzEwIChnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2NhbGN1bGF0ZV9nYWluIChhLCBucCArIDEsIGIsCisgICAgICAgICAgICAgICAgbnAgKyAxLCAxLjAsIDAuMCkpKTsKKyAgICB7CisgICAgICBnZG91YmxlIHcxID0gMi4wICogR19QSSAqIChmaWx0ZXItPmxvd2VyX2ZyZXF1ZW5jeSAvIHJhdGUpOworICAgICAgZ2RvdWJsZSB3MiA9IDIuMCAqIEdfUEkgKiAoZmlsdGVyLT51cHBlcl9mcmVxdWVuY3kgLyByYXRlKTsKKyAgICAgIGdkb3VibGUgdzAgPSAodzIgKyB3MSkgLyAyLjA7CisgICAgICBnZG91YmxlIHpyLCB6aTsKKworICAgICAgenIgPSBjb3MgKHcxKTsKKyAgICAgIHppID0gc2luICh3MSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiJS4yZiBkQiBnYWluIEAgJWRIeiIsCisgICAgICAgICAgMjAuMCAqIGxvZzEwIChnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2NhbGN1bGF0ZV9nYWluIChhLCBucCArIDEsCisgICAgICAgICAgICAgICAgICBiLCBucCArIDEsIHpyLCB6aSkpLCAoaW50KSBmaWx0ZXItPmxvd2VyX2ZyZXF1ZW5jeSk7CisgICAgICB6ciA9IGNvcyAodzApOworICAgICAgemkgPSBzaW4gKHcwKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICIlLjJmIGRCIGdhaW4gQCAlZEh6IiwKKyAgICAgICAgICAyMC4wICogbG9nMTAgKGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfY2FsY3VsYXRlX2dhaW4gKGEsIG5wICsgMSwKKyAgICAgICAgICAgICAgICAgIGIsIG5wICsgMSwgenIsIHppKSksCisgICAgICAgICAgKGludCkgKChmaWx0ZXItPmxvd2VyX2ZyZXF1ZW5jeSArIGZpbHRlci0+dXBwZXJfZnJlcXVlbmN5KSAvIDIuMCkpOworICAgICAgenIgPSBjb3MgKHcyKTsKKyAgICAgIHppID0gc2luICh3Mik7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiJS4yZiBkQiBnYWluIEAgJWRIeiIsCisgICAgICAgICAgMjAuMCAqIGxvZzEwIChnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2NhbGN1bGF0ZV9nYWluIChhLCBucCArIDEsCisgICAgICAgICAgICAgICAgICBiLCBucCArIDEsIHpyLCB6aSkpLCAoaW50KSBmaWx0ZXItPnVwcGVyX2ZyZXF1ZW5jeSk7CisgICAgfQorICAgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICIlLjJmIGRCIGdhaW4gQCAlZEh6IiwKKyAgICAgICAgMjAuMCAqIGxvZzEwIChnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2NhbGN1bGF0ZV9nYWluIChhLCBucCArIDEsIGIsCisgICAgICAgICAgICAgICAgbnAgKyAxLCAtMS4wLCAwLjApKSwgcmF0ZSAvIDIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fY2hlYl9iYW5kX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RBdWRpb0NoZWJCYW5kICpmaWx0ZXIgPSBHU1RfQVVESU9fQ0hFQl9CQU5EIChvYmplY3QpOworCisgIGdfbXV0ZXhfY2xlYXIgKCZmaWx0ZXItPmxvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19jaGViX2JhbmRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEF1ZGlvQ2hlYkJhbmQgKmZpbHRlciA9IEdTVF9BVURJT19DSEVCX0JBTkQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01PREU6CisgICAgICBnX211dGV4X2xvY2sgKCZmaWx0ZXItPmxvY2spOworICAgICAgZmlsdGVyLT5tb2RlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgZ2VuZXJhdGVfY29lZmZpY2llbnRzIChmaWx0ZXIsIE5VTEwpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZmaWx0ZXItPmxvY2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RZUEU6CisgICAgICBnX211dGV4X2xvY2sgKCZmaWx0ZXItPmxvY2spOworICAgICAgZmlsdGVyLT50eXBlID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBnZW5lcmF0ZV9jb2VmZmljaWVudHMgKGZpbHRlciwgTlVMTCk7CisgICAgICBnX211dGV4X3VubG9jayAoJmZpbHRlci0+bG9jayk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTE9XRVJfRlJFUVVFTkNZOgorICAgICAgZ19tdXRleF9sb2NrICgmZmlsdGVyLT5sb2NrKTsKKyAgICAgIGZpbHRlci0+bG93ZXJfZnJlcXVlbmN5ID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIGdlbmVyYXRlX2NvZWZmaWNpZW50cyAoZmlsdGVyLCBOVUxMKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmZmlsdGVyLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VUFBFUl9GUkVRVUVOQ1k6CisgICAgICBnX211dGV4X2xvY2sgKCZmaWx0ZXItPmxvY2spOworICAgICAgZmlsdGVyLT51cHBlcl9mcmVxdWVuY3kgPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgICAgZ2VuZXJhdGVfY29lZmZpY2llbnRzIChmaWx0ZXIsIE5VTEwpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZmaWx0ZXItPmxvY2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JJUFBMRToKKyAgICAgIGdfbXV0ZXhfbG9jayAoJmZpbHRlci0+bG9jayk7CisgICAgICBmaWx0ZXItPnJpcHBsZSA9IGdfdmFsdWVfZ2V0X2Zsb2F0ICh2YWx1ZSk7CisgICAgICBnZW5lcmF0ZV9jb2VmZmljaWVudHMgKGZpbHRlciwgTlVMTCk7CisgICAgICBnX211dGV4X3VubG9jayAoJmZpbHRlci0+bG9jayk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUE9MRVM6CisgICAgICBnX211dGV4X2xvY2sgKCZmaWx0ZXItPmxvY2spOworICAgICAgZmlsdGVyLT5wb2xlcyA9IEdTVF9ST1VORF9VUF80IChnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKSk7CisgICAgICBnZW5lcmF0ZV9jb2VmZmljaWVudHMgKGZpbHRlciwgTlVMTCk7CisgICAgICBnX211dGV4X3VubG9jayAoJmZpbHRlci0+bG9jayk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fY2hlYl9iYW5kX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb0NoZWJCYW5kICpmaWx0ZXIgPSBHU1RfQVVESU9fQ0hFQl9CQU5EIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGZpbHRlci0+bW9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVFlQRToKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGZpbHRlci0+dHlwZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTE9XRVJfRlJFUVVFTkNZOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBmaWx0ZXItPmxvd2VyX2ZyZXF1ZW5jeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVBQRVJfRlJFUVVFTkNZOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBmaWx0ZXItPnVwcGVyX2ZyZXF1ZW5jeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUklQUExFOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBmaWx0ZXItPnJpcHBsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUE9MRVM6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBmaWx0ZXItPnBvbGVzKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogR3N0QXVkaW9GaWx0ZXIgdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KKworc3RhdGljIGdib29sZWFuCitnc3RfYXVkaW9fY2hlYl9iYW5kX3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGJhc2UsIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIEdzdEF1ZGlvQ2hlYkJhbmQgKmZpbHRlciA9IEdTVF9BVURJT19DSEVCX0JBTkQgKGJhc2UpOworCisgIGdlbmVyYXRlX2NvZWZmaWNpZW50cyAoZmlsdGVyLCBpbmZvKTsKKworICByZXR1cm4gR1NUX0FVRElPX0ZJTFRFUl9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2V0dXAgKGJhc2UsIGluZm8pOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5oIGIvZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YmRhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmgKQEAgLTAsMCArMSw2NCBAQAorLyogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfQVVESU9fQ0hFQl9CQU5EX0hfXworI2RlZmluZSBfX0dTVF9BVURJT19DSEVCX0JBTkRfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb2ZpbHRlci5oPgorCisjaW5jbHVkZSAiYXVkaW9meGJhc2VpaXJmaWx0ZXIuaCIKKworR19CRUdJTl9ERUNMUworI2RlZmluZSBHU1RfVFlQRV9BVURJT19DSEVCX0JBTkQgICAgICAgICAgICAoZ3N0X2F1ZGlvX2NoZWJfYmFuZF9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVVESU9fQ0hFQl9CQU5EKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVVESU9fQ0hFQl9CQU5ELEdzdEF1ZGlvQ2hlYkJhbmQpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fQ0hFQl9CQU5EKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQVVESU9fQ0hFQl9CQU5EKSkKKyNkZWZpbmUgR1NUX0FVRElPX0NIRUJfQkFORF9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcykgLEdTVF9UWVBFX0FVRElPX0NIRUJfQkFORCxHc3RBdWRpb0NoZWJCYW5kQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fQ0hFQl9CQU5EX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSAsR1NUX1RZUEVfQVVESU9fQ0hFQl9CQU5EKSkKKyNkZWZpbmUgR1NUX0FVRElPX0NIRUJfQkFORF9HRVRfQ0xBU1Mob2JqKSAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MoKG9iaikgLEdTVF9UWVBFX0FVRElPX0NIRUJfQkFORCxHc3RBdWRpb0NoZWJCYW5kQ2xhc3MpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1ZGlvQ2hlYkJhbmQgR3N0QXVkaW9DaGViQmFuZDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdWRpb0NoZWJCYW5kQ2xhc3MgR3N0QXVkaW9DaGViQmFuZENsYXNzOworCitzdHJ1Y3QgX0dzdEF1ZGlvQ2hlYkJhbmQKK3sKKyAgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXIgcGFyZW50OworCisgIGdpbnQgbW9kZTsKKyAgZ2ludCB0eXBlOworICBnaW50IHBvbGVzOworICBnZmxvYXQgbG93ZXJfZnJlcXVlbmN5OworICBnZmxvYXQgdXBwZXJfZnJlcXVlbmN5OworICBnZmxvYXQgcmlwcGxlOworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIEdNdXRleCBsb2NrOworfTsKKworc3RydWN0IF9Hc3RBdWRpb0NoZWJCYW5kQ2xhc3MKK3sKKyAgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJDbGFzcyBwYXJlbnQ7Cit9OworCitHVHlwZSBnc3RfYXVkaW9fY2hlYl9iYW5kX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9BVURJT19DSEVCX0JBTkRfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5jIGIvZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjc4ODg2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYwpAQCAtMCwwICsxLDU3NCBAQAorLyogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qIAorICogQ2hlYnlzaGV2IHR5cGUgMSBmaWx0ZXIgZGVzaWduIGJhc2VkIG9uCisgKiAiVGhlIFNjaWVudGlzdCBhbmQgRW5naW5lZXIncyBHdWlkZSB0byBEU1AiLCBDaGFwdGVyIDIwLgorICogaHR0cDovL3d3dy5kc3BndWlkZS5jb20vCisgKgorICogRm9yIHR5cGUgMiBhbmQgQ2hlYnlzaGV2IGZpbHRlcnMgaW4gZ2VuZXJhbCByZWFkCisgKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NoZWJ5c2hldl9maWx0ZXIKKyAqCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXVkaW9jaGVibGltaXQKKyAqCisgKiBBdHRlbnVhdGVzIGFsbCBmcmVxdWVuY2llcyBhYm92ZSB0aGUgY3V0b2ZmIGZyZXF1ZW5jeSAobG93LXBhc3MpIG9yIGFsbCBmcmVxdWVuY2llcyBiZWxvdyB0aGUKKyAqIGN1dG9mZiBmcmVxdWVuY3kgKGhpZ2gtcGFzcykuIFRoZSBudW1iZXIgb2YgcG9sZXMgYW5kIHRoZSByaXBwbGUgcGFyYW1ldGVyIGNvbnRyb2wgdGhlIHJvbGxvZmYuCisgKgorICogVGhpcyBlbGVtZW50IGhhcyB0aGUgYWR2YW50YWdlIG92ZXIgdGhlIHdpbmRvd2VkIHNpbmMgbG93cGFzcyBhbmQgaGlnaHBhc3MgZmlsdGVyIHRoYXQgaXQgaXMKKyAqIG11Y2ggZmFzdGVyIGFuZCBwcm9kdWNlcyBhbG1vc3QgYXMgZ29vZCByZXN1bHRzLiBJdCdzIG9ubHkgZGlzYWR2YW50YWdlcyBhcmUgdGhlIGhpZ2hseQorICogbm9uLWxpbmVhciBwaGFzZSBhbmQgdGhlIHNsb3dlciByb2xsb2ZmIGNvbXBhcmVkIHRvIGEgd2luZG93ZWQgc2luYyBmaWx0ZXIgd2l0aCBhIGxhcmdlIGtlcm5lbC4KKyAqCisgKiBGb3IgdHlwZSAxIHRoZSByaXBwbGUgcGFyYW1ldGVyIHNwZWNpZmllcyBob3cgbXVjaCByaXBwbGUgaW4gZEIgaXMgYWxsb3dlZCBpbiB0aGUgcGFzc2JhbmQsIGkuZS4KKyAqIHNvbWUgZnJlcXVlbmNpZXMgaW4gdGhlIHBhc3NiYW5kIHdpbGwgYmUgYW1wbGlmaWVkIGJ5IHRoYXQgdmFsdWUuIEEgaGlnaGVyIHJpcHBsZSB2YWx1ZSB3aWxsIGFsbG93CisgKiBhIGZhc3RlciByb2xsb2ZmLgorICoKKyAqIEZvciB0eXBlIDIgdGhlIHJpcHBsZSBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBzdG9wYmFuZCBhdHRlbnVhdGlvbi4gSW4gdGhlIHN0b3BiYW5kIHRoZSBnYWluIHdpbGwKKyAqIGJlIGF0IG1vc3QgdGhpcyB2YWx1ZS4gQSBsb3dlciByaXBwbGUgdmFsdWUgd2lsbCBhbGxvdyBhIGZhc3RlciByb2xsb2ZmLgorICoKKyAqIEFzIGEgc3BlY2lhbCBjYXNlLCBhIENoZWJ5c2hldiB0eXBlIDEgZmlsdGVyIHdpdGggbm8gcmlwcGxlIGlzIGEgQnV0dGVyd29ydGggZmlsdGVyLgorICoKKyAqIDxub3RlPjxwYXJhPgorICogQmUgd2FybmVkIHRoYXQgYSB0b28gbGFyZ2UgbnVtYmVyIG9mIHBvbGVzIGNhbiBwcm9kdWNlIG5vaXNlLiBUaGUgbW9zdCBwb2xlcyBhcmUgcG9zc2libGUgd2l0aAorICogYSBjdXRvZmYgZnJlcXVlbmN5IGF0IGEgcXVhcnRlciBvZiB0aGUgc2FtcGxpbmcgcmF0ZS4KKyAqIDwvcGFyYT48L25vdGU+CisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyBmcmVxPTE1MDAgISBhdWRpb2NvbnZlcnQgISBhdWRpb2NoZWJsaW1pdCBtb2RlPWxvdy1wYXNzIGN1dG9mZj0xMDAwIHBvbGVzPTQgISBhdWRpb2NvbnZlcnQgISBhbHNhc2luaworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj0ibWVsbzEub2dnIiAhIG9nZ2RlbXV4ICEgdm9yYmlzZGVjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9jaGVibGltaXQgbW9kZT1oaWdoLXBhc3MgY3V0b2ZmPTQwMCByaXBwbGU9MC4yICEgYXVkaW9jb252ZXJ0ICEgYWxzYXNpbmsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyB3YXZlPXdoaXRlLW5vaXNlICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9jaGVibGltaXQgbW9kZT1sb3ctcGFzcyBjdXRvZmY9ODAwIHR5cGU9MiAhIGF1ZGlvY29udmVydCAhIGFsc2FzaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJtYXRoX2NvbXBhdC5oIgorCisjaW5jbHVkZSAiYXVkaW9jaGVibGltaXQuaCIKKworI2luY2x1ZGUgImdzdC9nbGliLWNvbXBhdC1wcml2YXRlLmgiCisKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9hdWRpb19jaGViX2xpbWl0X2RlYnVnCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChHU1RfQ0FUX0RFRkFVTFQpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9NT0RFLAorICBQUk9QX1RZUEUsCisgIFBST1BfQ1VUT0ZGLAorICBQUk9QX1JJUFBMRSwKKyAgUFJPUF9QT0xFUworfTsKKworI2RlZmluZSBnc3RfYXVkaW9fY2hlYl9saW1pdF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RBdWRpb0NoZWJMaW1pdCwKKyAgICBnc3RfYXVkaW9fY2hlYl9saW1pdCwgR1NUX1RZUEVfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSKTsKKworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2NoZWJfbGltaXRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2NoZWJfbGltaXRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2NoZWJfbGltaXRfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F1ZGlvX2NoZWJfbGltaXRfc2V0dXAgKEdzdEF1ZGlvRmlsdGVyICogZmlsdGVyLAorICAgIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pOworCitlbnVtCit7CisgIE1PREVfTE9XX1BBU1MgPSAwLAorICBNT0RFX0hJR0hfUEFTUworfTsKKworI2RlZmluZSBHU1RfVFlQRV9BVURJT19DSEVCWVNIRVZfRlJFUV9MSU1JVF9NT0RFIChnc3RfYXVkaW9fY2hlYl9saW1pdF9tb2RlX2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3RfYXVkaW9fY2hlYl9saW1pdF9tb2RlX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgZ3R5cGUgPSAwOworCisgIGlmIChndHlwZSA9PSAwKSB7CisgICAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAgICB7TU9ERV9MT1dfUEFTUywgIkxvdyBwYXNzIChkZWZhdWx0KSIsCisgICAgICAgICAgImxvdy1wYXNzIn0sCisgICAgICB7TU9ERV9ISUdIX1BBU1MsICJIaWdoIHBhc3MiLAorICAgICAgICAgICJoaWdoLXBhc3MifSwKKyAgICAgIHswLCBOVUxMLCBOVUxMfQorICAgIH07CisKKyAgICBndHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RBdWRpb0NoZWJMaW1pdE1vZGUiLCB2YWx1ZXMpOworICB9CisgIHJldHVybiBndHlwZTsKK30KKworLyogR09iamVjdCB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2NoZWJfbGltaXRfY2xhc3NfaW5pdCAoR3N0QXVkaW9DaGViTGltaXRDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RBdWRpb0ZpbHRlckNsYXNzICpmaWx0ZXJfY2xhc3MgPSAoR3N0QXVkaW9GaWx0ZXJDbGFzcyAqKSBrbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X2F1ZGlvX2NoZWJfbGltaXRfZGVidWcsICJhdWRpb2NoZWJsaW1pdCIsIDAsCisgICAgICAiYXVkaW9jaGVibGltaXQgZWxlbWVudCIpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9hdWRpb19jaGViX2xpbWl0X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2F1ZGlvX2NoZWJfbGltaXRfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9hdWRpb19jaGViX2xpbWl0X2ZpbmFsaXplOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTU9ERSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgibW9kZSIsICJNb2RlIiwKKyAgICAgICAgICAiTG93IHBhc3Mgb3IgaGlnaCBwYXNzIG1vZGUiLAorICAgICAgICAgIEdTVF9UWVBFX0FVRElPX0NIRUJZU0hFVl9GUkVRX0xJTUlUX01PREUsIE1PREVfTE9XX1BBU1MsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RZUEUsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgidHlwZSIsICJUeXBlIiwgIlR5cGUgb2YgdGhlIGNoZWJ5Y2hldiBmaWx0ZXIiLCAxLCAyLCAxLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKiBGSVhNRTogRG9uJ3QgdXNlIHRoZSBjb21wbGV0ZSBwb3NzaWJsZSByYW5nZSBidXQgcmVzdHJpY3QgdGhlIHVwcGVyIGJvdW5kYXJ5CisgICAqIHNvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIFVJcyBjYW4gdXNlIGEgc2xpZGVyIHdpdGhvdXQgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DVVRPRkYsCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJjdXRvZmYiLCAiQ3V0b2ZmIiwgIkN1dCBvZmYgZnJlcXVlbmN5IChIeikiLCAwLjAsCisgICAgICAgICAgMTAwMDAwLjAsIDAuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUklQUExFLAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgicmlwcGxlIiwgIlJpcHBsZSIsICJBbW91bnQgb2YgcmlwcGxlIChkQikiLCAwLjAsCisgICAgICAgICAgMjAwLjAsIDAuMjUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qIEZJWE1FOiBXaGF0IHRvIGRvIGFib3V0IHRoaXMgdXBwZXIgYm91bmRhcnk/IFdpdGggYSBjdXRvZmYgZnJlcXVlbmN5IG9mCisgICAqIHJhdGUvNCAzMiBwb2xlcyBhcmUgY29tcGxldGVseSBwb3NzaWJsZSwgd2l0aCBhIGN1dG9mZiBmcmVxdWVuY3kgdmVyeSBsb3cKKyAgICogb3IgdmVyeSBoaWdoIDE2IHBvbGVzIGFscmVhZHkgcHJvZHVjZXMgb25seSBub2lzZSAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BPTEVTLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInBvbGVzIiwgIlBvbGVzIiwKKyAgICAgICAgICAiTnVtYmVyIG9mIHBvbGVzIHRvIHVzZSwgd2lsbCBiZSByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IGV2ZW4gbnVtYmVyIiwKKyAgICAgICAgICAyLCAzMiwgNCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJMb3cgcGFzcyAmIGhpZ2ggcGFzcyBmaWx0ZXIiLAorICAgICAgIkZpbHRlci9FZmZlY3QvQXVkaW8iLAorICAgICAgIkNoZWJ5c2hldiBsb3cgcGFzcyBhbmQgaGlnaCBwYXNzIGZpbHRlciIsCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgZmlsdGVyX2NsYXNzLT5zZXR1cCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVkaW9fY2hlYl9saW1pdF9zZXR1cCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fY2hlYl9saW1pdF9pbml0IChHc3RBdWRpb0NoZWJMaW1pdCAqIGZpbHRlcikKK3sKKyAgZmlsdGVyLT5jdXRvZmYgPSAwLjA7CisgIGZpbHRlci0+bW9kZSA9IE1PREVfTE9XX1BBU1M7CisgIGZpbHRlci0+dHlwZSA9IDE7CisgIGZpbHRlci0+cG9sZXMgPSA0OworICBmaWx0ZXItPnJpcHBsZSA9IDAuMjU7CisKKyAgZ19tdXRleF9pbml0ICgmZmlsdGVyLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2dlbmVyYXRlX2JpcXVhZF9jb2VmZmljaWVudHMgKEdzdEF1ZGlvQ2hlYkxpbWl0ICogZmlsdGVyLAorICAgIGdpbnQgcCwgZ2ludCByYXRlLCBnZG91YmxlICogYjAsIGdkb3VibGUgKiBiMSwgZ2RvdWJsZSAqIGIyLAorICAgIGdkb3VibGUgKiBhMSwgZ2RvdWJsZSAqIGEyKQoreworICBnaW50IG5wID0gZmlsdGVyLT5wb2xlczsKKyAgZ2RvdWJsZSByaXBwbGUgPSBmaWx0ZXItPnJpcHBsZTsKKworICAvKiBwb2xlIGxvY2F0aW9uIGluIHMtcGxhbmUgKi8KKyAgZ2RvdWJsZSBycCwgaXA7CisKKyAgLyogemVybyBsb2NhdGlvbiBpbiBzLXBsYW5lICovCisgIGdkb3VibGUgaXogPSAwLjA7CisKKyAgLyogdHJhbnNmZXIgZnVuY3Rpb24gY29lZmZpY2llbnRzIGZvciB0aGUgei1wbGFuZSAqLworICBnZG91YmxlIHgwLCB4MSwgeDIsIHkxLCB5MjsKKyAgZ2ludCB0eXBlID0gZmlsdGVyLT50eXBlOworCisgIC8qIENhbGN1bGF0ZSBwb2xlIGxvY2F0aW9uIGZvciBsb3dwYXNzIGF0IGZyZXF1ZW5jeSAxICovCisgIHsKKyAgICBnZG91YmxlIGFuZ2xlID0gKEdfUEkgLyAyLjApICogKDIuMCAqIHAgLSAxKSAvIG5wOworCisgICAgcnAgPSAtc2luIChhbmdsZSk7CisgICAgaXAgPSBjb3MgKGFuZ2xlKTsKKyAgfQorCisgIC8qIElmIHdlIGFsbG93IHJpcHBsZSwgbW92ZSB0aGUgcG9sZSBmcm9tIHRoZSB1bml0CisgICAqIGNpcmNsZSB0byBhbiBlbGxpcHNlIGFuZCBrZWVwIGN1dG9mZiBhdCBmcmVxdWVuY3kgMSAqLworICBpZiAocmlwcGxlID4gMCAmJiB0eXBlID09IDEpIHsKKyAgICBnZG91YmxlIGVzLCB2eDsKKworICAgIGVzID0gc3FydCAocG93ICgxMC4wLCByaXBwbGUgLyAxMC4wKSAtIDEuMCk7CisKKyAgICB2eCA9ICgxLjAgLyBucCkgKiBhc2luaCAoMS4wIC8gZXMpOworICAgIHJwID0gcnAgKiBzaW5oICh2eCk7CisgICAgaXAgPSBpcCAqIGNvc2ggKHZ4KTsKKyAgfSBlbHNlIGlmICh0eXBlID09IDIpIHsKKyAgICBnZG91YmxlIGVzLCB2eDsKKworICAgIGVzID0gc3FydCAocG93ICgxMC4wLCByaXBwbGUgLyAxMC4wKSAtIDEuMCk7CisgICAgdnggPSAoMS4wIC8gbnApICogYXNpbmggKGVzKTsKKyAgICBycCA9IHJwICogc2luaCAodngpOworICAgIGlwID0gaXAgKiBjb3NoICh2eCk7CisgIH0KKworICAvKiBDYWxjdWxhdGUgaW52ZXJzZSBvZiB0aGUgcG9sZSBsb2NhdGlvbiB0byBjb252ZXJ0IGZyb20KKyAgICogdHlwZSBJIHRvIHR5cGUgSUkgKi8KKyAgaWYgKHR5cGUgPT0gMikgeworICAgIGdkb3VibGUgbWFnMiA9IHJwICogcnAgKyBpcCAqIGlwOworCisgICAgcnAgLz0gbWFnMjsKKyAgICBpcCAvPSBtYWcyOworICB9CisKKyAgLyogQ2FsY3VsYXRlIHplcm8gbG9jYXRpb24gZm9yIGZyZXF1ZW5jeSAxIG9uIHRoZQorICAgKiB1bml0IGNpcmNsZSBmb3IgdHlwZSAyICovCisgIGlmICh0eXBlID09IDIpIHsKKyAgICBnZG91YmxlIGFuZ2xlID0gR19QSSAvIChucCAqIDIuMCkgKyAoKHAgLSAxKSAqIEdfUEkpIC8gKG5wKTsKKyAgICBnZG91YmxlIG1hZzI7CisKKyAgICBpeiA9IGNvcyAoYW5nbGUpOworICAgIG1hZzIgPSBpeiAqIGl6OworICAgIGl6IC89IG1hZzI7CisgIH0KKworICAvKiBDb252ZXJ0IGZyb20gcy1kb21haW4gdG8gei1kb21haW4gYnkKKyAgICogdXNpbmcgdGhlIGJpbGluZWFyIFotdHJhbnNmb3JtLCBpLmUuCisgICAqIHN1YnN0aXR1dGUgcyBieSAoMi90KSooKHotMSkvKHorMSkpCisgICAqIHdpdGggdCA9IDIgKiB0YW4oMC41KS4KKyAgICovCisgIGlmICh0eXBlID09IDEpIHsKKyAgICBnZG91YmxlIHQsIG0sIGQ7CisKKyAgICB0ID0gMi4wICogdGFuICgwLjUpOworICAgIG0gPSBycCAqIHJwICsgaXAgKiBpcDsKKyAgICBkID0gNC4wIC0gNC4wICogcnAgKiB0ICsgbSAqIHQgKiB0OworCisgICAgeDAgPSAodCAqIHQpIC8gZDsKKyAgICB4MSA9IDIuMCAqIHgwOworICAgIHgyID0geDA7CisgICAgeTEgPSAoOC4wIC0gMi4wICogbSAqIHQgKiB0KSAvIGQ7CisgICAgeTIgPSAoLTQuMCAtIDQuMCAqIHJwICogdCAtIG0gKiB0ICogdCkgLyBkOworICB9IGVsc2UgeworICAgIGdkb3VibGUgdCwgbSwgZDsKKworICAgIHQgPSAyLjAgKiB0YW4gKDAuNSk7CisgICAgbSA9IHJwICogcnAgKyBpcCAqIGlwOworICAgIGQgPSA0LjAgLSA0LjAgKiBycCAqIHQgKyBtICogdCAqIHQ7CisKKyAgICB4MCA9ICh0ICogdCAqIGl6ICogaXogKyA0LjApIC8gZDsKKyAgICB4MSA9ICgtOC4wICsgMi4wICogaXogKiBpeiAqIHQgKiB0KSAvIGQ7CisgICAgeDIgPSB4MDsKKyAgICB5MSA9ICg4LjAgLSAyLjAgKiBtICogdCAqIHQpIC8gZDsKKyAgICB5MiA9ICgtNC4wIC0gNC4wICogcnAgKiB0IC0gbSAqIHQgKiB0KSAvIGQ7CisgIH0KKworICAvKiBDb252ZXJ0IGZyb20gbG93cGFzcyBhdCBmcmVxdWVuY3kgMSB0byBlaXRoZXIgbG93cGFzcworICAgKiBvciBoaWdocGFzcy4KKyAgICoKKyAgICogRm9yIGxvd3Bhc3Mgc3Vic3RpdHV0ZSB6XigtMSkgd2l0aDoKKyAgICogIC0xCisgICAqIHogICAtIGsKKyAgICogLS0tLS0tLS0tLS0tCisgICAqICAgICAgICAgIC0xCisgICAqIDEgLSBrICogegorICAgKgorICAgKiBrID0gc2luKCgxLXcpLzIpIC8gc2luKCgxK3cpLzIpCisgICAqCisgICAqIEZvciBoaWdocGFzcyBzdWJzdGl0dXRlIHpeKC0xKSB3aXRoOgorICAgKgorICAgKiAgIC0xCisgICAqIC16ICAgLSBrCisgICAqIC0tLS0tLS0tLS0tLQorICAgKiAgICAgICAgICAtMQorICAgKiAxICsgayAqIHoKKyAgICoKKyAgICogayA9IC1jb3MoKDErdykvMikgLyBjb3MoKDEtdykvMikKKyAgICoKKyAgICovCisgIHsKKyAgICBnZG91YmxlIGssIGQ7CisgICAgZ2RvdWJsZSBvbWVnYSA9IDIuMCAqIEdfUEkgKiAoZmlsdGVyLT5jdXRvZmYgLyByYXRlKTsKKworICAgIGlmIChmaWx0ZXItPm1vZGUgPT0gTU9ERV9MT1dfUEFTUykKKyAgICAgIGsgPSBzaW4gKCgxLjAgLSBvbWVnYSkgLyAyLjApIC8gc2luICgoMS4wICsgb21lZ2EpIC8gMi4wKTsKKyAgICBlbHNlCisgICAgICBrID0gLWNvcyAoKG9tZWdhICsgMS4wKSAvIDIuMCkgLyBjb3MgKChvbWVnYSAtIDEuMCkgLyAyLjApOworCisgICAgZCA9IDEuMCArIHkxICogayAtIHkyICogayAqIGs7CisgICAgKmIwID0gKHgwICsgayAqICgteDEgKyBrICogeDIpKSAvIGQ7CisgICAgKmIxID0gKHgxICsgayAqIGsgKiB4MSAtIDIuMCAqIGsgKiAoeDAgKyB4MikpIC8gZDsKKyAgICAqYjIgPSAoeDAgKiBrICogayAtIHgxICogayArIHgyKSAvIGQ7CisgICAgKmExID0gKDIuMCAqIGsgKyB5MSArIHkxICogayAqIGsgLSAyLjAgKiB5MiAqIGspIC8gZDsKKyAgICAqYTIgPSAoLWsgKiBrIC0geTEgKiBrICsgeTIpIC8gZDsKKworICAgIGlmIChmaWx0ZXItPm1vZGUgPT0gTU9ERV9ISUdIX1BBU1MpIHsKKyAgICAgICphMSA9IC0qYTE7CisgICAgICAqYjEgPSAtKmIxOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ2VuZXJhdGVfY29lZmZpY2llbnRzIChHc3RBdWRpb0NoZWJMaW1pdCAqIGZpbHRlciwgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbykKK3sKKyAgZ2ludCByYXRlOworCisgIGlmIChpbmZvKSB7CisgICAgcmF0ZSA9IEdTVF9BVURJT19JTkZPX1JBVEUgKGluZm8pOworICB9IGVsc2UgeworICAgIHJhdGUgPSBHU1RfQVVESU9fRklMVEVSX1JBVEUgKGZpbHRlcik7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiY3V0b2ZmICVmIiwgZmlsdGVyLT5jdXRvZmYpOworCisgIGlmIChyYXRlID09IDApIHsKKyAgICBnZG91YmxlICphID0gZ19uZXcwIChnZG91YmxlLCAxKTsKKyAgICBnZG91YmxlICpiID0gZ19uZXcwIChnZG91YmxlLCAxKTsKKworICAgIGFbMF0gPSAxLjA7CisgICAgYlswXSA9IDEuMDsKKyAgICBnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX3NldF9jb2VmZmljaWVudHMgKEdTVF9BVURJT19GWF9CQVNFX0lJUl9GSUxURVIKKyAgICAgICAgKGZpbHRlciksIGEsIDEsIGIsIDEpOworCisgICAgR1NUX0xPR19PQkpFQ1QgKGZpbHRlciwgInJhdGUgd2FzIG5vdCBzZXQgeWV0Iik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGZpbHRlci0+Y3V0b2ZmID49IHJhdGUgLyAyLjApIHsKKyAgICBnZG91YmxlICphID0gZ19uZXcwIChnZG91YmxlLCAxKTsKKyAgICBnZG91YmxlICpiID0gZ19uZXcwIChnZG91YmxlLCAxKTsKKworICAgIGFbMF0gPSAxLjA7CisgICAgYlswXSA9IChmaWx0ZXItPm1vZGUgPT0gTU9ERV9MT1dfUEFTUykgPyAxLjAgOiAwLjA7CisgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9zZXRfY29lZmZpY2llbnRzIChHU1RfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSCisgICAgICAgIChmaWx0ZXIpLCBhLCAxLCBiLCAxKTsKKyAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiY3V0b2ZmIHdhcyBoaWdoZXIgdGhhbiBueXF1aXN0IGZyZXF1ZW5jeSIpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmIChmaWx0ZXItPmN1dG9mZiA8PSAwLjApIHsKKyAgICBnZG91YmxlICphID0gZ19uZXcwIChnZG91YmxlLCAxKTsKKyAgICBnZG91YmxlICpiID0gZ19uZXcwIChnZG91YmxlLCAxKTsKKworICAgIGFbMF0gPSAxLjA7CisgICAgYlswXSA9IChmaWx0ZXItPm1vZGUgPT0gTU9ERV9MT1dfUEFTUykgPyAwLjAgOiAxLjA7CisgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9zZXRfY29lZmZpY2llbnRzIChHU1RfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSCisgICAgICAgIChmaWx0ZXIpLCBhLCAxLCBiLCAxKTsKKyAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiY3V0b2ZmIGlzIGxvd2VyIHRoYW4gemVybyIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIENhbGN1bGF0ZSBjb2VmZmljaWVudHMgZm9yIHRoZSBjaGVieXNoZXYgZmlsdGVyICovCisgIHsKKyAgICBnaW50IG5wID0gZmlsdGVyLT5wb2xlczsKKyAgICBnZG91YmxlICphLCAqYjsKKyAgICBnaW50IGksIHA7CisKKyAgICBhID0gZ19uZXcwIChnZG91YmxlLCBucCArIDMpOworICAgIGIgPSBnX25ldzAgKGdkb3VibGUsIG5wICsgMyk7CisKKyAgICAvKiBDYWxjdWxhdGUgdHJhbnNmZXIgZnVuY3Rpb24gY29lZmZpY2llbnRzICovCisgICAgYVsyXSA9IDEuMDsKKyAgICBiWzJdID0gMS4wOworCisgICAgZm9yIChwID0gMTsgcCA8PSBucCAvIDI7IHArKykgeworICAgICAgZ2RvdWJsZSBiMCwgYjEsIGIyLCBhMSwgYTI7CisgICAgICBnZG91YmxlICp0YSA9IGdfbmV3MCAoZ2RvdWJsZSwgbnAgKyAzKTsKKyAgICAgIGdkb3VibGUgKnRiID0gZ19uZXcwIChnZG91YmxlLCBucCArIDMpOworCisgICAgICBnZW5lcmF0ZV9iaXF1YWRfY29lZmZpY2llbnRzIChmaWx0ZXIsIHAsIHJhdGUsICZiMCwgJmIxLCAmYjIsICZhMSwgJmEyKTsKKworICAgICAgbWVtY3B5ICh0YSwgYSwgc2l6ZW9mIChnZG91YmxlKSAqIChucCArIDMpKTsKKyAgICAgIG1lbWNweSAodGIsIGIsIHNpemVvZiAoZ2RvdWJsZSkgKiAobnAgKyAzKSk7CisKKyAgICAgIC8qIGFkZCB0aGUgbmV3IGNvZWZmaWNpZW50cyBmb3IgdGhlIG5ldyB0d28gcG9sZXMKKyAgICAgICAqIHRvIHRoZSBjYXNjYWRlIGJ5IG11bHRpcGxpY2F0aW9uIG9mIHRoZSB0cmFuc2ZlcgorICAgICAgICogZnVuY3Rpb25zICovCisgICAgICBmb3IgKGkgPSAyOyBpIDwgbnAgKyAzOyBpKyspIHsKKyAgICAgICAgYltpXSA9IGIwICogdGJbaV0gKyBiMSAqIHRiW2kgLSAxXSArIGIyICogdGJbaSAtIDJdOworICAgICAgICBhW2ldID0gdGFbaV0gLSBhMSAqIHRhW2kgLSAxXSAtIGEyICogdGFbaSAtIDJdOworICAgICAgfQorICAgICAgZ19mcmVlICh0YSk7CisgICAgICBnX2ZyZWUgKHRiKTsKKyAgICB9CisKKyAgICAvKiBNb3ZlIGNvZWZmaWNpZW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheSB0byBtb3ZlIGZyb20KKyAgICAgKiB0aGUgdHJhbnNmZXIgZnVuY3Rpb24ncyBjb2VmZmljaWVudHMgdG8gdGhlIGRpZmZlcmVuY2UKKyAgICAgKiBlcXVhdGlvbidzIGNvZWZmaWNpZW50cyAqLworICAgIGZvciAoaSA9IDA7IGkgPD0gbnA7IGkrKykgeworICAgICAgYVtpXSA9IGFbaSArIDJdOworICAgICAgYltpXSA9IGJbaSArIDJdOworICAgIH0KKworICAgIC8qIE5vcm1hbGl6ZSB0byB1bml0eSBnYWluIGF0IGZyZXF1ZW5jeSAwIGZvciBsb3dwYXNzCisgICAgICogYW5kIGZyZXF1ZW5jeSAwLjUgZm9yIGhpZ2hwYXNzICovCisgICAgeworICAgICAgZ2RvdWJsZSBnYWluOworCisgICAgICBpZiAoZmlsdGVyLT5tb2RlID09IE1PREVfTE9XX1BBU1MpCisgICAgICAgIGdhaW4gPQorICAgICAgICAgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9jYWxjdWxhdGVfZ2FpbiAoYSwgbnAgKyAxLCBiLCBucCArIDEsCisgICAgICAgICAgICAxLjAsIDAuMCk7CisgICAgICBlbHNlCisgICAgICAgIGdhaW4gPQorICAgICAgICAgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9jYWxjdWxhdGVfZ2FpbiAoYSwgbnAgKyAxLCBiLCBucCArIDEsCisgICAgICAgICAgICAtMS4wLCAwLjApOworCisgICAgICBmb3IgKGkgPSAwOyBpIDw9IG5wOyBpKyspIHsKKyAgICAgICAgYltpXSAvPSBnYWluOworICAgICAgfQorICAgIH0KKworICAgIGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfc2V0X2NvZWZmaWNpZW50cyAoR1NUX0FVRElPX0ZYX0JBU0VfSUlSX0ZJTFRFUgorICAgICAgICAoZmlsdGVyKSwgYSwgbnAgKyAxLCBiLCBucCArIDEpOworCisgICAgR1NUX0xPR19PQkpFQ1QgKGZpbHRlciwKKyAgICAgICAgIkdlbmVyYXRlZCBJSVIgY29lZmZpY2llbnRzIGZvciB0aGUgQ2hlYnlzaGV2IGZpbHRlciIpOworICAgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsCisgICAgICAgICJtb2RlOiAlcywgdHlwZTogJWQsIHBvbGVzOiAlZCwgY3V0b2ZmOiAlLjJmIEh6LCByaXBwbGU6ICUuMmYgZEIiLAorICAgICAgICAoZmlsdGVyLT5tb2RlID09IE1PREVfTE9XX1BBU1MpID8gImxvdy1wYXNzIiA6ICJoaWdoLXBhc3MiLAorICAgICAgICBmaWx0ZXItPnR5cGUsIGZpbHRlci0+cG9sZXMsIGZpbHRlci0+Y3V0b2ZmLCBmaWx0ZXItPnJpcHBsZSk7CisgICAgR1NUX0xPR19PQkpFQ1QgKGZpbHRlciwgIiUuMmYgZEIgZ2FpbiBAIDAgSHoiLAorICAgICAgICAyMC4wICogbG9nMTAgKGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfY2FsY3VsYXRlX2dhaW4gKGEsIG5wICsgMSwgYiwKKyAgICAgICAgICAgICAgICBucCArIDEsIDEuMCwgMC4wKSkpOworCisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworICAgIHsKKyAgICAgIGdkb3VibGUgd2MgPSAyLjAgKiBHX1BJICogKGZpbHRlci0+Y3V0b2ZmIC8gcmF0ZSk7CisgICAgICBnZG91YmxlIHpyID0gY29zICh3YyksIHppID0gc2luICh3Yyk7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICIlLjJmIGRCIGdhaW4gQCAlZCBIeiIsCisgICAgICAgICAgMjAuMCAqIGxvZzEwIChnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2NhbGN1bGF0ZV9nYWluIChhLCBucCArIDEsCisgICAgICAgICAgICAgICAgICBiLCBucCArIDEsIHpyLCB6aSkpLCAoaW50KSBmaWx0ZXItPmN1dG9mZik7CisgICAgfQorI2VuZGlmCisKKyAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiJS4yZiBkQiBnYWluIEAgJWQgSHoiLAorICAgICAgICAyMC4wICogbG9nMTAgKGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfY2FsY3VsYXRlX2dhaW4gKGEsIG5wICsgMSwgYiwKKyAgICAgICAgICAgICAgICBucCArIDEsIC0xLjAsIDAuMCkpLCByYXRlKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2NoZWJfbGltaXRfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEF1ZGlvQ2hlYkxpbWl0ICpmaWx0ZXIgPSBHU1RfQVVESU9fQ0hFQl9MSU1JVCAob2JqZWN0KTsKKworICBnX211dGV4X2NsZWFyICgmZmlsdGVyLT5sb2NrKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fY2hlYl9saW1pdF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXVkaW9DaGViTGltaXQgKmZpbHRlciA9IEdTVF9BVURJT19DSEVCX0xJTUlUIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZ19tdXRleF9sb2NrICgmZmlsdGVyLT5sb2NrKTsKKyAgICAgIGZpbHRlci0+bW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGdlbmVyYXRlX2NvZWZmaWNpZW50cyAoZmlsdGVyLCBOVUxMKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmZmlsdGVyLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UWVBFOgorICAgICAgZ19tdXRleF9sb2NrICgmZmlsdGVyLT5sb2NrKTsKKyAgICAgIGZpbHRlci0+dHlwZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgZ2VuZXJhdGVfY29lZmZpY2llbnRzIChmaWx0ZXIsIE5VTEwpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZmaWx0ZXItPmxvY2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NVVE9GRjoKKyAgICAgIGdfbXV0ZXhfbG9jayAoJmZpbHRlci0+bG9jayk7CisgICAgICBmaWx0ZXItPmN1dG9mZiA9IGdfdmFsdWVfZ2V0X2Zsb2F0ICh2YWx1ZSk7CisgICAgICBnZW5lcmF0ZV9jb2VmZmljaWVudHMgKGZpbHRlciwgTlVMTCk7CisgICAgICBnX211dGV4X3VubG9jayAoJmZpbHRlci0+bG9jayk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUklQUExFOgorICAgICAgZ19tdXRleF9sb2NrICgmZmlsdGVyLT5sb2NrKTsKKyAgICAgIGZpbHRlci0+cmlwcGxlID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIGdlbmVyYXRlX2NvZWZmaWNpZW50cyAoZmlsdGVyLCBOVUxMKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmZmlsdGVyLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QT0xFUzoKKyAgICAgIGdfbXV0ZXhfbG9jayAoJmZpbHRlci0+bG9jayk7CisgICAgICBmaWx0ZXItPnBvbGVzID0gR1NUX1JPVU5EX1VQXzIgKGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpKTsKKyAgICAgIGdlbmVyYXRlX2NvZWZmaWNpZW50cyAoZmlsdGVyLCBOVUxMKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmZmlsdGVyLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19jaGViX2xpbWl0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb0NoZWJMaW1pdCAqZmlsdGVyID0gR1NUX0FVRElPX0NIRUJfTElNSVQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01PREU6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgZmlsdGVyLT5tb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UWVBFOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZmlsdGVyLT50eXBlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DVVRPRkY6CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIGZpbHRlci0+Y3V0b2ZmKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SSVBQTEU6CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIGZpbHRlci0+cmlwcGxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QT0xFUzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGZpbHRlci0+cG9sZXMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBHc3RBdWRpb0ZpbHRlciB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdWRpb19jaGViX2xpbWl0X3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGJhc2UsIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIEdzdEF1ZGlvQ2hlYkxpbWl0ICpmaWx0ZXIgPSBHU1RfQVVESU9fQ0hFQl9MSU1JVCAoYmFzZSk7CisKKyAgZ2VuZXJhdGVfY29lZmZpY2llbnRzIChmaWx0ZXIsIGluZm8pOworCisgIHJldHVybiBHU1RfQVVESU9fRklMVEVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zZXR1cCAoYmFzZSwgaW5mbyk7Cit9CmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5oIGIvZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTMwOTYwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuaApAQCAtMCwwICsxLDY2IEBACisvKiAKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9BVURJT19DSEVCX0xJTUlUX0hfXworI2RlZmluZSBfX0dTVF9BVURJT19DSEVCX0xJTUlUX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9maWx0ZXIuaD4KKworI2luY2x1ZGUgImF1ZGlvZnhiYXNlaWlyZmlsdGVyLmgiCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9BVURJT19DSEVCX0xJTUlUICAgICAgICAgICAgKGdzdF9hdWRpb19jaGViX2xpbWl0X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9BVURJT19DSEVCX0xJTUlUKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVVESU9fQ0hFQl9MSU1JVCxHc3RBdWRpb0NoZWJMaW1pdCkpCisjZGVmaW5lIEdTVF9JU19BVURJT19DSEVCX0xJTUlUKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQVVESU9fQ0hFQl9MSU1JVCkpCisjZGVmaW5lIEdTVF9BVURJT19DSEVCX0xJTUlUX0NMQVNTKGtsYXNzKSAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSAsR1NUX1RZUEVfQVVESU9fQ0hFQl9MSU1JVCxHc3RBdWRpb0NoZWJMaW1pdENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FVRElPX0NIRUJfTElNSVRfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpICxHU1RfVFlQRV9BVURJT19DSEVCX0xJTUlUKSkKKyNkZWZpbmUgR1NUX0FVRElPX0NIRUJfTElNSVRfR0VUX0NMQVNTKG9iaikgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTKChvYmopICxHU1RfVFlQRV9BVURJT19DSEVCX0xJTUlULEdzdEF1ZGlvQ2hlYkxpbWl0Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9DaGViTGltaXQgR3N0QXVkaW9DaGViTGltaXQ7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9DaGViTGltaXRDbGFzcyBHc3RBdWRpb0NoZWJMaW1pdENsYXNzOworCitzdHJ1Y3QgX0dzdEF1ZGlvQ2hlYkxpbWl0Cit7CisgIEdzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyIHBhcmVudDsKKworICBnaW50IG1vZGU7CisgIGdpbnQgdHlwZTsKKyAgZ2ludCBwb2xlczsKKyAgZ2Zsb2F0IGN1dG9mZjsKKyAgZ2Zsb2F0IHJpcHBsZTsKKworICAvKiA8IHByaXZhdGUgPiAqLworICBHTXV0ZXggbG9jazsKK307CisKK3N0cnVjdCBfR3N0QXVkaW9DaGViTGltaXRDbGFzcworeworICBHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlckNsYXNzIHBhcmVudDsKK307CisKK0dUeXBlIGdzdF9hdWRpb19jaGViX2xpbWl0X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0FVRElPX0NIRUJfTElNSVRfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9hdWRpb2R5bmFtaWMuYyBiL2dzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliM2E2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb2R5bmFtaWMuYwpAQCAtMCwwICsxLDcxMyBAQAorLyogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXVkaW9keW5hbWljCisgKgorICogVGhpcyBlbGVtZW50IGNhbiBhY3QgYXMgYSBjb21wcmVzc29yIG9yIGV4cGFuZGVyLiBBIGNvbXByZXNzb3IgY2hhbmdlcyB0aGUKKyAqIGFtcGxpdHVkZSBvZiBhbGwgc2FtcGxlcyBhYm92ZSBhIHNwZWNpZmljIHRocmVzaG9sZCB3aXRoIGEgc3BlY2lmaWMgcmF0aW8sCisgKiBhIGV4cGFuZGVyIGRvZXMgdGhlIHNhbWUgZm9yIGFsbCBzYW1wbGVzIGJlbG93IGEgc3BlY2lmaWMgdGhyZXNob2xkLiBJZgorICogc29mdC1rbmVlIG1vZGUgaXMgc2VsZWN0ZWQgdGhlIHJhdGlvIGlzIGFwcGxpZWQgc21vb3RobHkuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyB3YXZlPXNhdyAhIGF1ZGlvZHluYW1pYyBjaGFyYWN0ZXJpc3RpY3M9c29mdC1rbmVlIG1vZGU9Y29tcHJlc3NvciB0aHJlc2hvbGQ9MC41IHJhdGlvPTAuNSAhIGFsc2FzaW5rCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPSJtZWxvMS5vZ2ciICEgb2dnZGVtdXggISB2b3JiaXNkZWMgISBhdWRpb2NvbnZlcnQgISBhdWRpb2R5bmFtaWMgY2hhcmFjdGVyaXN0aWNzPWhhcmQta25lZSBtb2RlPWV4cGFuZGVyIHRocmVzaG9sZD0wLjIgcmF0aW89NC4wICEgYWxzYXNpbmsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyB3YXZlPXNhdyAhIGF1ZGlvY29udmVydCAhIGF1ZGlvZHluYW1pYyAhIGF1ZGlvY29udmVydCAhIGFsc2FzaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisvKiBUT0RPOiBJbXBsZW1lbnQgYXR0YWNrIGFuZCByZWxlYXNlIHBhcmFtZXRlcnMgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9maWx0ZXIuaD4KKworI2luY2x1ZGUgImF1ZGlvZHluYW1pYy5oIgorCisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfYXVkaW9fZHluYW1pY19kZWJ1ZworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoR1NUX0NBVF9ERUZBVUxUKTsKKworLyogRmlsdGVyIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQ0hBUkFDVEVSSVNUSUNTLAorICBQUk9QX01PREUsCisgIFBST1BfVEhSRVNIT0xELAorICBQUk9QX1JBVElPCit9OworCisjZGVmaW5lIEFMTE9XRURfQ0FQUyBcCisgICAgImF1ZGlvL3gtcmF3LCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBmb3JtYXQ9KHN0cmluZykgeyJHU1RfQVVESU9fTkUoUzE2KSIsIkdTVF9BVURJT19ORShGMzIpIn0sIiBcCisgICAgIiByYXRlPShpbnQpWzEsTUFYXSwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBjaGFubmVscz0oaW50KVsxLE1BWF0sIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBsYXlvdXQ9KHN0cmluZykge2ludGVybGVhdmVkLCBub24taW50ZXJsZWF2ZWR9IgorCitHX0RFRklORV9UWVBFIChHc3RBdWRpb0R5bmFtaWMsIGdzdF9hdWRpb19keW5hbWljLCBHU1RfVFlQRV9BVURJT19GSUxURVIpOworCitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fZHluYW1pY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fZHluYW1pY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9fZHluYW1pY19zZXR1cCAoR3N0QXVkaW9GaWx0ZXIgKiBmaWx0ZXIsCisgICAgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1faGFyZF9rbmVlX2NvbXByZXNzb3JfaW50IChHc3RBdWRpb0R5bmFtaWMgKiBmaWx0ZXIsCisgICAgZ2ludDE2ICogZGF0YSwgZ3VpbnQgbnVtX3NhbXBsZXMpOworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9oYXJkX2tuZWVfY29tcHJlc3Nvcl9mbG9hdCAoR3N0QXVkaW9EeW5hbWljICoKKyAgICBmaWx0ZXIsIGdmbG9hdCAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKTsKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2NvbXByZXNzb3JfaW50IChHc3RBdWRpb0R5bmFtaWMgKiBmaWx0ZXIsCisgICAgZ2ludDE2ICogZGF0YSwgZ3VpbnQgbnVtX3NhbXBsZXMpOworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9zb2Z0X2tuZWVfY29tcHJlc3Nvcl9mbG9hdCAoR3N0QXVkaW9EeW5hbWljICoKKyAgICBmaWx0ZXIsIGdmbG9hdCAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9oYXJkX2tuZWVfZXhwYW5kZXJfaW50IChHc3RBdWRpb0R5bmFtaWMKKyAgICAqIGZpbHRlciwgZ2ludDE2ICogZGF0YSwgZ3VpbnQgbnVtX3NhbXBsZXMpOworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9oYXJkX2tuZWVfZXhwYW5kZXJfZmxvYXQgKEdzdEF1ZGlvRHluYW1pYyAqIGZpbHRlciwKKyAgICBnZmxvYXQgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcyk7CitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2V4cGFuZGVyX2ludCAoR3N0QXVkaW9EeW5hbWljCisgICAgKiBmaWx0ZXIsIGdpbnQxNiAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKTsKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2V4cGFuZGVyX2Zsb2F0IChHc3RBdWRpb0R5bmFtaWMgKiBmaWx0ZXIsCisgICAgZ2Zsb2F0ICogZGF0YSwgZ3VpbnQgbnVtX3NhbXBsZXMpOworCitzdGF0aWMgY29uc3QgR3N0QXVkaW9EeW5hbWljUHJvY2Vzc0Z1bmMgcHJvY2Vzc19mdW5jdGlvbnNbXSA9IHsKKyAgKEdzdEF1ZGlvRHluYW1pY1Byb2Nlc3NGdW5jKQorICAgICAgZ3N0X2F1ZGlvX2R5bmFtaWNfdHJhbnNmb3JtX2hhcmRfa25lZV9jb21wcmVzc29yX2ludCwKKyAgKEdzdEF1ZGlvRHluYW1pY1Byb2Nlc3NGdW5jKQorICAgICAgZ3N0X2F1ZGlvX2R5bmFtaWNfdHJhbnNmb3JtX2hhcmRfa25lZV9jb21wcmVzc29yX2Zsb2F0LAorICAoR3N0QXVkaW9EeW5hbWljUHJvY2Vzc0Z1bmMpCisgICAgICBnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2NvbXByZXNzb3JfaW50LAorICAoR3N0QXVkaW9EeW5hbWljUHJvY2Vzc0Z1bmMpCisgICAgICBnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2NvbXByZXNzb3JfZmxvYXQsCisgIChHc3RBdWRpb0R5bmFtaWNQcm9jZXNzRnVuYykKKyAgICAgIGdzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9oYXJkX2tuZWVfZXhwYW5kZXJfaW50LAorICAoR3N0QXVkaW9EeW5hbWljUHJvY2Vzc0Z1bmMpCisgICAgICBnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1faGFyZF9rbmVlX2V4cGFuZGVyX2Zsb2F0LAorICAoR3N0QXVkaW9EeW5hbWljUHJvY2Vzc0Z1bmMpCisgICAgICBnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2V4cGFuZGVyX2ludCwKKyAgKEdzdEF1ZGlvRHluYW1pY1Byb2Nlc3NGdW5jKQorICBnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2V4cGFuZGVyX2Zsb2F0Cit9OworCitlbnVtCit7CisgIENIQVJBQ1RFUklTVElDU19IQVJEX0tORUUgPSAwLAorICBDSEFSQUNURVJJU1RJQ1NfU09GVF9LTkVFCit9OworCisjZGVmaW5lIEdTVF9UWVBFX0FVRElPX0RZTkFNSUNfQ0hBUkFDVEVSSVNUSUNTIChnc3RfYXVkaW9fZHluYW1pY19jaGFyYWN0ZXJpc3RpY3NfZ2V0X3R5cGUgKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9hdWRpb19keW5hbWljX2NoYXJhY3RlcmlzdGljc19nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGd0eXBlID0gMDsKKworICBpZiAoZ3R5cGUgPT0gMCkgeworICAgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIHZhbHVlc1tdID0geworICAgICAge0NIQVJBQ1RFUklTVElDU19IQVJEX0tORUUsICJIYXJkIEtuZWUgKGRlZmF1bHQpIiwKKyAgICAgICAgICAiaGFyZC1rbmVlIn0sCisgICAgICB7Q0hBUkFDVEVSSVNUSUNTX1NPRlRfS05FRSwgIlNvZnQgS25lZSAoc21vb3RoKSIsCisgICAgICAgICAgInNvZnQta25lZSJ9LAorICAgICAgezAsIE5VTEwsIE5VTEx9CisgICAgfTsKKworICAgIGd0eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdEF1ZGlvRHluYW1pY0NoYXJhY3RlcmlzdGljcyIsIHZhbHVlcyk7CisgIH0KKyAgcmV0dXJuIGd0eXBlOworfQorCitlbnVtCit7CisgIE1PREVfQ09NUFJFU1NPUiA9IDAsCisgIE1PREVfRVhQQU5ERVIKK307CisKKyNkZWZpbmUgR1NUX1RZUEVfQVVESU9fRFlOQU1JQ19NT0RFIChnc3RfYXVkaW9fZHluYW1pY19tb2RlX2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3RfYXVkaW9fZHluYW1pY19tb2RlX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgZ3R5cGUgPSAwOworCisgIGlmIChndHlwZSA9PSAwKSB7CisgICAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAgICB7TU9ERV9DT01QUkVTU09SLCAiQ29tcHJlc3NvciAoZGVmYXVsdCkiLAorICAgICAgICAgICJjb21wcmVzc29yIn0sCisgICAgICB7TU9ERV9FWFBBTkRFUiwgIkV4cGFuZGVyIiwgImV4cGFuZGVyIn0sCisgICAgICB7MCwgTlVMTCwgTlVMTH0KKyAgICB9OworCisgICAgZ3R5cGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0QXVkaW9EeW5hbWljTW9kZSIsIHZhbHVlcyk7CisgIH0KKyAgcmV0dXJuIGd0eXBlOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2R5bmFtaWNfc2V0X3Byb2Nlc3NfZnVuY3Rpb24gKEdzdEF1ZGlvRHluYW1pYyAqIGZpbHRlciwKKyAgICBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKQoreworICBnaW50IGZ1bmNfaW5kZXg7CisKKyAgZnVuY19pbmRleCA9IChmaWx0ZXItPm1vZGUgPT0gTU9ERV9DT01QUkVTU09SKSA/IDAgOiA0OworICBmdW5jX2luZGV4ICs9IChmaWx0ZXItPmNoYXJhY3RlcmlzdGljcyA9PSBDSEFSQUNURVJJU1RJQ1NfSEFSRF9LTkVFKSA/IDAgOiAyOworICBmdW5jX2luZGV4ICs9IChHU1RfQVVESU9fSU5GT19GT1JNQVQgKGluZm8pID09IEdTVF9BVURJT19GT1JNQVRfRjMyKSA/IDEgOiAwOworCisgIGdfYXNzZXJ0IChmdW5jX2luZGV4ID49IDAgJiYgZnVuY19pbmRleCA8IEdfTl9FTEVNRU5UUyAocHJvY2Vzc19mdW5jdGlvbnMpKTsKKworICBmaWx0ZXItPnByb2Nlc3MgPSBwcm9jZXNzX2Z1bmN0aW9uc1tmdW5jX2luZGV4XTsKK30KKworLyogR09iamVjdCB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2R5bmFtaWNfY2xhc3NfaW5pdCAoR3N0QXVkaW9EeW5hbWljQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9hdWRpb19keW5hbWljX2RlYnVnLCAiYXVkaW9keW5hbWljIiwgMCwKKyAgICAgICJhdWRpb2R5bmFtaWMgZWxlbWVudCIpOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9fZHluYW1pY19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9hdWRpb19keW5hbWljX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NIQVJBQ1RFUklTVElDUywKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgiY2hhcmFjdGVyaXN0aWNzIiwgIkNoYXJhY3RlcmlzdGljcyIsCisgICAgICAgICAgIlNlbGVjdHMgd2hldGhlciB0aGUgcmF0aW8gc2hvdWxkIGJlIGFwcGxpZWQgc21vb3RoIChzb2Z0LWtuZWUpICIKKyAgICAgICAgICAib3IgaGFyZCAoaGFyZC1rbmVlKS4iLAorICAgICAgICAgIEdTVF9UWVBFX0FVRElPX0RZTkFNSUNfQ0hBUkFDVEVSSVNUSUNTLCBDSEFSQUNURVJJU1RJQ1NfSEFSRF9LTkVFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTU9ERSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgibW9kZSIsICJNb2RlIiwKKyAgICAgICAgICAiU2VsZWN0cyB3aGV0aGVyIHRoZSBmaWx0ZXIgc2hvdWxkIHdvcmsgb24gbG91ZCBzYW1wbGVzIChjb21wcmVzc29yKSBvciIKKyAgICAgICAgICAicXVpZXQgc2FtcGxlcyAoZXhwYW5kZXIpLiIsCisgICAgICAgICAgR1NUX1RZUEVfQVVESU9fRFlOQU1JQ19NT0RFLCBNT0RFX0NPTVBSRVNTT1IsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USFJFU0hPTEQsCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJ0aHJlc2hvbGQiLCAiVGhyZXNob2xkIiwKKyAgICAgICAgICAiVGhyZXNob2xkIHVudGlsIHRoZSBmaWx0ZXIgaXMgYWN0aXZhdGVkIiwgMC4wLCAxLjAsCisgICAgICAgICAgMC4wLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JBVElPLAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgicmF0aW8iLCAiUmF0aW8iLAorICAgICAgICAgICJSYXRpbyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIiwgMC4wLCBHX01BWEZMT0FULAorICAgICAgICAgIDEuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJEeW5hbWljIHJhbmdlIGNvbnRyb2xsZXIiLCAiRmlsdGVyL0VmZmVjdC9BdWRpbyIsCisgICAgICAiQ29tcHJlc3NvciBhbmQgRXhwYW5kZXIiLCAiU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPiIpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQUxMT1dFRF9DQVBTKTsKKyAgZ3N0X2F1ZGlvX2ZpbHRlcl9jbGFzc19hZGRfcGFkX3RlbXBsYXRlcyAoR1NUX0FVRElPX0ZJTFRFUl9DTEFTUyAoa2xhc3MpLAorICAgICAgY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBHU1RfQVVESU9fRklMVEVSX0NMQVNTIChrbGFzcyktPnNldHVwID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVkaW9fZHluYW1pY19zZXR1cCk7CisKKyAgR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChrbGFzcyktPnRyYW5zZm9ybV9pcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX2R5bmFtaWNfdHJhbnNmb3JtX2lwKTsKKyAgR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChrbGFzcyktPnRyYW5zZm9ybV9pcF9vbl9wYXNzdGhyb3VnaCA9IEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2R5bmFtaWNfaW5pdCAoR3N0QXVkaW9EeW5hbWljICogZmlsdGVyKQoreworICBmaWx0ZXItPnJhdGlvID0gMS4wOworICBmaWx0ZXItPnRocmVzaG9sZCA9IDAuMDsKKyAgZmlsdGVyLT5jaGFyYWN0ZXJpc3RpY3MgPSBDSEFSQUNURVJJU1RJQ1NfSEFSRF9LTkVFOworICBmaWx0ZXItPm1vZGUgPSBNT0RFX0NPTVBSRVNTT1I7CisgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfaW5fcGxhY2UgKEdTVF9CQVNFX1RSQU5TRk9STSAoZmlsdGVyKSwgVFJVRSk7CisgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfZ2FwX2F3YXJlIChHU1RfQkFTRV9UUkFOU0ZPUk0gKGZpbHRlciksIFRSVUUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2R5bmFtaWNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEF1ZGlvRHluYW1pYyAqZmlsdGVyID0gR1NUX0FVRElPX0RZTkFNSUMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0NIQVJBQ1RFUklTVElDUzoKKyAgICAgIGZpbHRlci0+Y2hhcmFjdGVyaXN0aWNzID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgZ3N0X2F1ZGlvX2R5bmFtaWNfc2V0X3Byb2Nlc3NfZnVuY3Rpb24gKGZpbHRlciwKKyAgICAgICAgICBHU1RfQVVESU9fRklMVEVSX0lORk8gKGZpbHRlcikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01PREU6CisgICAgICBmaWx0ZXItPm1vZGUgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBnc3RfYXVkaW9fZHluYW1pY19zZXRfcHJvY2Vzc19mdW5jdGlvbiAoZmlsdGVyLAorICAgICAgICAgIEdTVF9BVURJT19GSUxURVJfSU5GTyAoZmlsdGVyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSRVNIT0xEOgorICAgICAgZmlsdGVyLT50aHJlc2hvbGQgPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JBVElPOgorICAgICAgZmlsdGVyLT5yYXRpbyA9IGdfdmFsdWVfZ2V0X2Zsb2F0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZHluYW1pY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXVkaW9EeW5hbWljICpmaWx0ZXIgPSBHU1RfQVVESU9fRFlOQU1JQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ0hBUkFDVEVSSVNUSUNTOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGZpbHRlci0+Y2hhcmFjdGVyaXN0aWNzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGZpbHRlci0+bW9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSRVNIT0xEOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBmaWx0ZXItPnRocmVzaG9sZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkFUSU86CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIGZpbHRlci0+cmF0aW8pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBHc3RBdWRpb0ZpbHRlciB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdWRpb19keW5hbWljX3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGJhc2UsIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIEdzdEF1ZGlvRHluYW1pYyAqZmlsdGVyID0gR1NUX0FVRElPX0RZTkFNSUMgKGJhc2UpOworCisgIGdzdF9hdWRpb19keW5hbWljX3NldF9wcm9jZXNzX2Z1bmN0aW9uIChmaWx0ZXIsIGluZm8pOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9oYXJkX2tuZWVfY29tcHJlc3Nvcl9pbnQgKEdzdEF1ZGlvRHluYW1pYyAqIGZpbHRlciwKKyAgICBnaW50MTYgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykKK3sKKyAgZ2xvbmcgdmFsOworICBnbG9uZyB0aHJfcCA9IGZpbHRlci0+dGhyZXNob2xkICogR19NQVhJTlQxNjsKKyAgZ2xvbmcgdGhyX24gPSBmaWx0ZXItPnRocmVzaG9sZCAqIEdfTUlOSU5UMTY7CisKKyAgLyogTm90aGluZyB0byBkbyBmb3IgdXMgaWYgcmF0aW8gaXMgMS4wIG9yIGlmIHRoZSB0aHJlc2hvbGQKKyAgICogZXF1YWxzIDEuMC4gKi8KKyAgaWYgKGZpbHRlci0+dGhyZXNob2xkID09IDEuMCB8fCBmaWx0ZXItPnJhdGlvID09IDEuMCkKKyAgICByZXR1cm47CisKKyAgZm9yICg7IG51bV9zYW1wbGVzOyBudW1fc2FtcGxlcy0tKSB7CisgICAgdmFsID0gKmRhdGE7CisKKyAgICBpZiAodmFsID4gdGhyX3ApIHsKKyAgICAgIHZhbCA9IHRocl9wICsgKHZhbCAtIHRocl9wKSAqIGZpbHRlci0+cmF0aW87CisgICAgfSBlbHNlIGlmICh2YWwgPCB0aHJfbikgeworICAgICAgdmFsID0gdGhyX24gKyAodmFsIC0gdGhyX24pICogZmlsdGVyLT5yYXRpbzsKKyAgICB9CisgICAgKmRhdGErKyA9IChnaW50MTYpIENMQU1QICh2YWwsIEdfTUlOSU5UMTYsIEdfTUFYSU5UMTYpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1faGFyZF9rbmVlX2NvbXByZXNzb3JfZmxvYXQgKEdzdEF1ZGlvRHluYW1pYyAqCisgICAgZmlsdGVyLCBnZmxvYXQgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykKK3sKKyAgZ2RvdWJsZSB2YWwsIHRocmVzaG9sZCA9IGZpbHRlci0+dGhyZXNob2xkOworCisgIC8qIE5vdGhpbmcgdG8gZG8gZm9yIHVzIGlmIHJhdGlvID09IDEuMC4KKyAgICogQXMgZmxvYXQgdmFsdWVzIGNhbiBiZSBhYm92ZSAxLjAgd2UgaGF2ZSB0byBkbyBzb21ldGhpbmcKKyAgICogaWYgdGhyZXNob2xkIGlzIGdyZWF0ZXIgdGhhbiAxLjAuICovCisgIGlmIChmaWx0ZXItPnJhdGlvID09IDEuMCkKKyAgICByZXR1cm47CisKKyAgZm9yICg7IG51bV9zYW1wbGVzOyBudW1fc2FtcGxlcy0tKSB7CisgICAgdmFsID0gKmRhdGE7CisKKyAgICBpZiAodmFsID4gdGhyZXNob2xkKSB7CisgICAgICB2YWwgPSB0aHJlc2hvbGQgKyAodmFsIC0gdGhyZXNob2xkKSAqIGZpbHRlci0+cmF0aW87CisgICAgfSBlbHNlIGlmICh2YWwgPCAtdGhyZXNob2xkKSB7CisgICAgICB2YWwgPSAtdGhyZXNob2xkICsgKHZhbCArIHRocmVzaG9sZCkgKiBmaWx0ZXItPnJhdGlvOworICAgIH0KKyAgICAqZGF0YSsrID0gKGdmbG9hdCkgdmFsOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2NvbXByZXNzb3JfaW50IChHc3RBdWRpb0R5bmFtaWMgKiBmaWx0ZXIsCisgICAgZ2ludDE2ICogZGF0YSwgZ3VpbnQgbnVtX3NhbXBsZXMpCit7CisgIGdsb25nIHZhbDsKKyAgZ2xvbmcgdGhyX3AgPSBmaWx0ZXItPnRocmVzaG9sZCAqIEdfTUFYSU5UMTY7CisgIGdsb25nIHRocl9uID0gZmlsdGVyLT50aHJlc2hvbGQgKiBHX01JTklOVDE2OworICBnZG91YmxlIGFfcCwgYl9wLCBjX3A7CisgIGdkb3VibGUgYV9uLCBiX24sIGNfbjsKKworICAvKiBOb3RoaW5nIHRvIGRvIGZvciB1cyBpZiByYXRpbyBpcyAxLjAgb3IgaWYgdGhlIHRocmVzaG9sZAorICAgKiBlcXVhbHMgMS4wLiAqLworICBpZiAoZmlsdGVyLT50aHJlc2hvbGQgPT0gMS4wIHx8IGZpbHRlci0+cmF0aW8gPT0gMS4wKQorICAgIHJldHVybjsKKworICAvKiBXZSBidWlsZCBhIDJuZCBkZWdyZWUgcG9seW5vbWlhbCBoZXJlIGZvcgorICAgKiB2YWx1ZXMgZ3JlYXRlciB0aGFuIHRocmVzaG9sZCBvciBzbWFsbCB0aGFuCisgICAqIC10aHJlc2hvbGQgd2l0aDoKKyAgICogZih0KSA9IHQsIGYnKHQpID0gMSwgZicobSkgPSByCisgICAqID0+CisgICAqIGEgPSAoMS1yKS8oMioodC1tKSkKKyAgICogYiA9IChyKnQgLSBtKS8odC1tKQorICAgKiBjID0gdCAqICgxIC0gYiAtIGEqdCkKKyAgICogZih4KSA9IGF4XjIgKyBieCArIGMKKyAgICovCisKKyAgLyogc2hvdWxkbid0IGhhcHBlbiBiZWNhdXNlIHRoaXMgd291bGQgb25seSBiZSB0aGUgY2FzZQorICAgKiBmb3IgdGhyZXNob2xkID09IDEuMCB3aGljaCB3ZSBjYXRjaCBhYm92ZSAqLworICBnX2Fzc2VydCAodGhyX3AgLSBHX01BWElOVDE2ICE9IDApOworICBnX2Fzc2VydCAodGhyX24gLSBHX01JTklOVCAhPSAwKTsKKworICBhX3AgPSAoMSAtIGZpbHRlci0+cmF0aW8pIC8gKDIgKiAodGhyX3AgLSBHX01BWElOVDE2KSk7CisgIGJfcCA9IChmaWx0ZXItPnJhdGlvICogdGhyX3AgLSBHX01BWElOVDE2KSAvICh0aHJfcCAtIEdfTUFYSU5UMTYpOworICBjX3AgPSB0aHJfcCAqICgxIC0gYl9wIC0gYV9wICogdGhyX3ApOworICBhX24gPSAoMSAtIGZpbHRlci0+cmF0aW8pIC8gKDIgKiAodGhyX24gLSBHX01JTklOVDE2KSk7CisgIGJfbiA9IChmaWx0ZXItPnJhdGlvICogdGhyX24gLSBHX01JTklOVDE2KSAvICh0aHJfbiAtIEdfTUlOSU5UMTYpOworICBjX24gPSB0aHJfbiAqICgxIC0gYl9uIC0gYV9uICogdGhyX24pOworCisgIGZvciAoOyBudW1fc2FtcGxlczsgbnVtX3NhbXBsZXMtLSkgeworICAgIHZhbCA9ICpkYXRhOworCisgICAgaWYgKHZhbCA+IHRocl9wKSB7CisgICAgICB2YWwgPSBhX3AgKiB2YWwgKiB2YWwgKyBiX3AgKiB2YWwgKyBjX3A7CisgICAgfSBlbHNlIGlmICh2YWwgPCB0aHJfbikgeworICAgICAgdmFsID0gYV9uICogdmFsICogdmFsICsgYl9uICogdmFsICsgY19uOworICAgIH0KKyAgICAqZGF0YSsrID0gKGdpbnQxNikgQ0xBTVAgKHZhbCwgR19NSU5JTlQxNiwgR19NQVhJTlQxNik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9zb2Z0X2tuZWVfY29tcHJlc3Nvcl9mbG9hdCAoR3N0QXVkaW9EeW5hbWljICoKKyAgICBmaWx0ZXIsIGdmbG9hdCAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKQoreworICBnZG91YmxlIHZhbDsKKyAgZ2RvdWJsZSB0aHJlc2hvbGQgPSBmaWx0ZXItPnRocmVzaG9sZDsKKyAgZ2RvdWJsZSBhX3AsIGJfcCwgY19wOworICBnZG91YmxlIGFfbiwgYl9uLCBjX247CisKKyAgLyogTm90aGluZyB0byBkbyBmb3IgdXMgaWYgcmF0aW8gPT0gMS4wLgorICAgKiBBcyBmbG9hdCB2YWx1ZXMgY2FuIGJlIGFib3ZlIDEuMCB3ZSBoYXZlIHRvIGRvIHNvbWV0aGluZworICAgKiBpZiB0aHJlc2hvbGQgaXMgZ3JlYXRlciB0aGFuIDEuMC4gKi8KKyAgaWYgKGZpbHRlci0+cmF0aW8gPT0gMS4wKQorICAgIHJldHVybjsKKworICAvKiBXZSBidWlsZCBhIDJuZCBkZWdyZWUgcG9seW5vbWlhbCBoZXJlIGZvcgorICAgKiB2YWx1ZXMgZ3JlYXRlciB0aGFuIHRocmVzaG9sZCBvciBzbWFsbCB0aGFuCisgICAqIC10aHJlc2hvbGQgd2l0aDoKKyAgICogZih0KSA9IHQsIGYnKHQpID0gMSwgZicobSkgPSByCisgICAqID0+CisgICAqIGEgPSAoMS1yKS8oMioodC1tKSkKKyAgICogYiA9IChyKnQgLSBtKS8odC1tKQorICAgKiBjID0gdCAqICgxIC0gYiAtIGEqdCkKKyAgICogZih4KSA9IGF4XjIgKyBieCArIGMKKyAgICovCisKKyAgLyogRklYTUU6IElmIHRyZXNob2xkIGlzIHRoZSBzYW1lIGFzIHRoZSBtYXhpbXVtCisgICAqIHdlIG5lZWQgdG8gcmFpc2UgaXQgYSBiaXQgdG8gcHJldmVudAorICAgKiBkaXZpc2lvbiBieSB6ZXJvLiAqLworICBpZiAodGhyZXNob2xkID09IDEuMCkKKyAgICB0aHJlc2hvbGQgPSAxLjAgKyAwLjAwMDAxOworCisgIGFfcCA9ICgxLjAgLSBmaWx0ZXItPnJhdGlvKSAvICgyLjAgKiAodGhyZXNob2xkIC0gMS4wKSk7CisgIGJfcCA9IChmaWx0ZXItPnJhdGlvICogdGhyZXNob2xkIC0gMS4wKSAvICh0aHJlc2hvbGQgLSAxLjApOworICBjX3AgPSB0aHJlc2hvbGQgKiAoMS4wIC0gYl9wIC0gYV9wICogdGhyZXNob2xkKTsKKyAgYV9uID0gKDEuMCAtIGZpbHRlci0+cmF0aW8pIC8gKDIuMCAqICgtdGhyZXNob2xkICsgMS4wKSk7CisgIGJfbiA9ICgtZmlsdGVyLT5yYXRpbyAqIHRocmVzaG9sZCArIDEuMCkgLyAoLXRocmVzaG9sZCArIDEuMCk7CisgIGNfbiA9IC10aHJlc2hvbGQgKiAoMS4wIC0gYl9uICsgYV9uICogdGhyZXNob2xkKTsKKworICBmb3IgKDsgbnVtX3NhbXBsZXM7IG51bV9zYW1wbGVzLS0pIHsKKyAgICB2YWwgPSAqZGF0YTsKKworICAgIGlmICh2YWwgPiAxLjApIHsKKyAgICAgIHZhbCA9IDEuMCArICh2YWwgLSAxLjApICogZmlsdGVyLT5yYXRpbzsKKyAgICB9IGVsc2UgaWYgKHZhbCA+IHRocmVzaG9sZCkgeworICAgICAgdmFsID0gYV9wICogdmFsICogdmFsICsgYl9wICogdmFsICsgY19wOworICAgIH0gZWxzZSBpZiAodmFsIDwgLTEuMCkgeworICAgICAgdmFsID0gLTEuMCArICh2YWwgKyAxLjApICogZmlsdGVyLT5yYXRpbzsKKyAgICB9IGVsc2UgaWYgKHZhbCA8IC10aHJlc2hvbGQpIHsKKyAgICAgIHZhbCA9IGFfbiAqIHZhbCAqIHZhbCArIGJfbiAqIHZhbCArIGNfbjsKKyAgICB9CisgICAgKmRhdGErKyA9IChnZmxvYXQpIHZhbDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2R5bmFtaWNfdHJhbnNmb3JtX2hhcmRfa25lZV9leHBhbmRlcl9pbnQgKEdzdEF1ZGlvRHluYW1pYyAqIGZpbHRlciwKKyAgICBnaW50MTYgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykKK3sKKyAgZ2xvbmcgdmFsOworICBnbG9uZyB0aHJfcCA9IGZpbHRlci0+dGhyZXNob2xkICogR19NQVhJTlQxNjsKKyAgZ2xvbmcgdGhyX24gPSBmaWx0ZXItPnRocmVzaG9sZCAqIEdfTUlOSU5UMTY7CisgIGdkb3VibGUgemVyb19wLCB6ZXJvX247CisKKyAgLyogTm90aGluZyB0byBkbyBmb3IgdXMgaGVyZSBpZiB0aHJlc2hvbGQgZXF1YWxzIDAuMAorICAgKiBvciByYXRpbyBlcXVhbHMgMS4wICovCisgIGlmIChmaWx0ZXItPnRocmVzaG9sZCA9PSAwLjAgfHwgZmlsdGVyLT5yYXRpbyA9PSAxLjApCisgICAgcmV0dXJuOworCisgIC8qIHplcm8gY3Jvc3Npbmcgb2Ygb3VyIGZ1bmN0aW9uICovCisgIGlmIChmaWx0ZXItPnJhdGlvICE9IDAuMCkgeworICAgIHplcm9fcCA9IHRocl9wIC0gdGhyX3AgLyBmaWx0ZXItPnJhdGlvOworICAgIHplcm9fbiA9IHRocl9uIC0gdGhyX24gLyBmaWx0ZXItPnJhdGlvOworICB9IGVsc2UgeworICAgIHplcm9fcCA9IHplcm9fbiA9IDAuMDsKKyAgfQorCisgIGlmICh6ZXJvX3AgPCAwLjApCisgICAgemVyb19wID0gMC4wOworICBpZiAoemVyb19uID4gMC4wKQorICAgIHplcm9fbiA9IDAuMDsKKworICBmb3IgKDsgbnVtX3NhbXBsZXM7IG51bV9zYW1wbGVzLS0pIHsKKyAgICB2YWwgPSAqZGF0YTsKKworICAgIGlmICh2YWwgPCB0aHJfcCAmJiB2YWwgPiB6ZXJvX3ApIHsKKyAgICAgIHZhbCA9IGZpbHRlci0+cmF0aW8gKiB2YWwgKyB0aHJfcCAqICgxIC0gZmlsdGVyLT5yYXRpbyk7CisgICAgfSBlbHNlIGlmICgodmFsIDw9IHplcm9fcCAmJiB2YWwgPiAwKSB8fCAodmFsID49IHplcm9fbiAmJiB2YWwgPCAwKSkgeworICAgICAgdmFsID0gMDsKKyAgICB9IGVsc2UgaWYgKHZhbCA+IHRocl9uICYmIHZhbCA8IHplcm9fbikgeworICAgICAgdmFsID0gZmlsdGVyLT5yYXRpbyAqIHZhbCArIHRocl9uICogKDEgLSBmaWx0ZXItPnJhdGlvKTsKKyAgICB9CisgICAgKmRhdGErKyA9IChnaW50MTYpIENMQU1QICh2YWwsIEdfTUlOSU5UMTYsIEdfTUFYSU5UMTYpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1faGFyZF9rbmVlX2V4cGFuZGVyX2Zsb2F0IChHc3RBdWRpb0R5bmFtaWMgKiBmaWx0ZXIsCisgICAgZ2Zsb2F0ICogZGF0YSwgZ3VpbnQgbnVtX3NhbXBsZXMpCit7CisgIGdkb3VibGUgdmFsLCB0aHJlc2hvbGQgPSBmaWx0ZXItPnRocmVzaG9sZCwgemVybzsKKworICAvKiBOb3RoaW5nIHRvIGRvIGZvciB1cyBoZXJlIGlmIHRocmVzaG9sZCBlcXVhbHMgMC4wCisgICAqIG9yIHJhdGlvIGVxdWFscyAxLjAgKi8KKyAgaWYgKGZpbHRlci0+dGhyZXNob2xkID09IDAuMCB8fCBmaWx0ZXItPnJhdGlvID09IDEuMCkKKyAgICByZXR1cm47CisKKyAgLyogemVybyBjcm9zc2luZyBvZiBvdXIgZnVuY3Rpb24gKi8KKyAgaWYgKGZpbHRlci0+cmF0aW8gIT0gMC4wKQorICAgIHplcm8gPSB0aHJlc2hvbGQgLSB0aHJlc2hvbGQgLyBmaWx0ZXItPnJhdGlvOworICBlbHNlCisgICAgemVybyA9IDAuMDsKKworICBpZiAoemVybyA8IDAuMCkKKyAgICB6ZXJvID0gMC4wOworCisgIGZvciAoOyBudW1fc2FtcGxlczsgbnVtX3NhbXBsZXMtLSkgeworICAgIHZhbCA9ICpkYXRhOworCisgICAgaWYgKHZhbCA8IHRocmVzaG9sZCAmJiB2YWwgPiB6ZXJvKSB7CisgICAgICB2YWwgPSBmaWx0ZXItPnJhdGlvICogdmFsICsgdGhyZXNob2xkICogKDEuMCAtIGZpbHRlci0+cmF0aW8pOworICAgIH0gZWxzZSBpZiAoKHZhbCA8PSB6ZXJvICYmIHZhbCA+IDAuMCkgfHwgKHZhbCA+PSAtemVybyAmJiB2YWwgPCAwLjApKSB7CisgICAgICB2YWwgPSAwLjA7CisgICAgfSBlbHNlIGlmICh2YWwgPiAtdGhyZXNob2xkICYmIHZhbCA8IC16ZXJvKSB7CisgICAgICB2YWwgPSBmaWx0ZXItPnJhdGlvICogdmFsIC0gdGhyZXNob2xkICogKDEuMCAtIGZpbHRlci0+cmF0aW8pOworICAgIH0KKyAgICAqZGF0YSsrID0gKGdmbG9hdCkgdmFsOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2V4cGFuZGVyX2ludCAoR3N0QXVkaW9EeW5hbWljICogZmlsdGVyLAorICAgIGdpbnQxNiAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKQoreworICBnbG9uZyB2YWw7CisgIGdsb25nIHRocl9wID0gZmlsdGVyLT50aHJlc2hvbGQgKiBHX01BWElOVDE2OworICBnbG9uZyB0aHJfbiA9IGZpbHRlci0+dGhyZXNob2xkICogR19NSU5JTlQxNjsKKyAgZ2RvdWJsZSB6ZXJvX3AsIHplcm9fbjsKKyAgZ2RvdWJsZSBhX3AsIGJfcCwgY19wOworICBnZG91YmxlIGFfbiwgYl9uLCBjX247CisgIGdkb3VibGUgcjI7CisKKyAgLyogTm90aGluZyB0byBkbyBmb3IgdXMgaGVyZSBpZiB0aHJlc2hvbGQgZXF1YWxzIDAuMAorICAgKiBvciByYXRpbyBlcXVhbHMgMS4wICovCisgIGlmIChmaWx0ZXItPnRocmVzaG9sZCA9PSAwLjAgfHwgZmlsdGVyLT5yYXRpbyA9PSAxLjApCisgICAgcmV0dXJuOworCisgIC8qIHplcm8gY3Jvc3Npbmcgb2Ygb3VyIGZ1bmN0aW9uICovCisgIHplcm9fcCA9ICh0aHJfcCAqIChmaWx0ZXItPnJhdGlvIC0gMS4wKSkgLyAoMS4wICsgZmlsdGVyLT5yYXRpbyk7CisgIHplcm9fbiA9ICh0aHJfbiAqIChmaWx0ZXItPnJhdGlvIC0gMS4wKSkgLyAoMS4wICsgZmlsdGVyLT5yYXRpbyk7CisKKyAgaWYgKHplcm9fcCA8IDAuMCkKKyAgICB6ZXJvX3AgPSAwLjA7CisgIGlmICh6ZXJvX24gPiAwLjApCisgICAgemVyb19uID0gMC4wOworCisgIC8qIHNob3VsZG4ndCBoYXBwZW4gYXMgdGhpcyB3b3VsZCBvbmx5IGhhcHBlbgorICAgKiB3aXRoIHRocmVzaG9sZCA9PSAwLjAgKi8KKyAgZ19hc3NlcnQgKHRocl9wICE9IDApOworICBnX2Fzc2VydCAodGhyX24gIT0gMCk7CisKKyAgLyogV2UgYnVpbGQgYSAybiBkZWdyZWUgcG9seW5vbWlhbCBoZXJlIGZvciB2YWx1ZXMgYmV0d2VlbgorICAgKiAwIGFuZCB0aHJlc2hvbGQgb3IgMCBhbmQgLXRocmVzaG9sZCB3aXRoOgorICAgKiBmKHQpID0gdCwgZicodCkgPSAxLCBmKHopID0gMCwgZicoeikgPSByCisgICAqIHogYmV0d2VlbiAwIGFuZCB0CisgICAqID0+CisgICAqIGEgPSAoMSAtIHJeMikgLyAoNCAqIHQpCisgICAqIGIgPSAoMSArIHJeMikgLyAyCisgICAqIGMgPSB0ICogKDEuMCAtIGIgLSBhKnQpCisgICAqIGYoeCkgPSBheF4yICsgYnggKyBjICovCisgIHIyID0gZmlsdGVyLT5yYXRpbyAqIGZpbHRlci0+cmF0aW87CisgIGFfcCA9ICgxLjAgLSByMikgLyAoNC4wICogdGhyX3ApOworICBiX3AgPSAoMS4wICsgcjIpIC8gMi4wOworICBjX3AgPSB0aHJfcCAqICgxLjAgLSBiX3AgLSBhX3AgKiB0aHJfcCk7CisgIGFfbiA9ICgxLjAgLSByMikgLyAoNC4wICogdGhyX24pOworICBiX24gPSAoMS4wICsgcjIpIC8gMi4wOworICBjX24gPSB0aHJfbiAqICgxLjAgLSBiX24gLSBhX24gKiB0aHJfbik7CisKKyAgZm9yICg7IG51bV9zYW1wbGVzOyBudW1fc2FtcGxlcy0tKSB7CisgICAgdmFsID0gKmRhdGE7CisKKyAgICBpZiAodmFsIDwgdGhyX3AgJiYgdmFsID4gemVyb19wKSB7CisgICAgICB2YWwgPSBhX3AgKiB2YWwgKiB2YWwgKyBiX3AgKiB2YWwgKyBjX3A7CisgICAgfSBlbHNlIGlmICgodmFsIDw9IHplcm9fcCAmJiB2YWwgPiAwKSB8fCAodmFsID49IHplcm9fbiAmJiB2YWwgPCAwKSkgeworICAgICAgdmFsID0gMDsKKyAgICB9IGVsc2UgaWYgKHZhbCA+IHRocl9uICYmIHZhbCA8IHplcm9fbikgeworICAgICAgdmFsID0gYV9uICogdmFsICogdmFsICsgYl9uICogdmFsICsgY19uOworICAgIH0KKyAgICAqZGF0YSsrID0gKGdpbnQxNikgQ0xBTVAgKHZhbCwgR19NSU5JTlQxNiwgR19NQVhJTlQxNik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9zb2Z0X2tuZWVfZXhwYW5kZXJfZmxvYXQgKEdzdEF1ZGlvRHluYW1pYyAqIGZpbHRlciwKKyAgICBnZmxvYXQgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykKK3sKKyAgZ2RvdWJsZSB2YWw7CisgIGdkb3VibGUgdGhyZXNob2xkID0gZmlsdGVyLT50aHJlc2hvbGQ7CisgIGdkb3VibGUgemVybzsKKyAgZ2RvdWJsZSBhX3AsIGJfcCwgY19wOworICBnZG91YmxlIGFfbiwgYl9uLCBjX247CisgIGdkb3VibGUgcjI7CisKKyAgLyogTm90aGluZyB0byBkbyBmb3IgdXMgaGVyZSBpZiB0aHJlc2hvbGQgZXF1YWxzIDAuMAorICAgKiBvciByYXRpbyBlcXVhbHMgMS4wICovCisgIGlmIChmaWx0ZXItPnRocmVzaG9sZCA9PSAwLjAgfHwgZmlsdGVyLT5yYXRpbyA9PSAxLjApCisgICAgcmV0dXJuOworCisgIC8qIHplcm8gY3Jvc3Npbmcgb2Ygb3VyIGZ1bmN0aW9uICovCisgIHplcm8gPSAodGhyZXNob2xkICogKGZpbHRlci0+cmF0aW8gLSAxLjApKSAvICgxLjAgKyBmaWx0ZXItPnJhdGlvKTsKKworICBpZiAoemVybyA8IDAuMCkKKyAgICB6ZXJvID0gMC4wOworCisgIC8qIHNob3VsZG4ndCBoYXBwZW4gYXMgdGhpcyBvbmx5IGhhcHBlbnMgd2l0aAorICAgKiB0aHJlc2hvbGQgPT0gMC4wICovCisgIGdfYXNzZXJ0ICh0aHJlc2hvbGQgIT0gMC4wKTsKKworICAvKiBXZSBidWlsZCBhIDJuIGRlZ3JlZSBwb2x5bm9taWFsIGhlcmUgZm9yIHZhbHVlcyBiZXR3ZWVuCisgICAqIDAgYW5kIHRocmVzaG9sZCBvciAwIGFuZCAtdGhyZXNob2xkIHdpdGg6CisgICAqIGYodCkgPSB0LCBmJyh0KSA9IDEsIGYoeikgPSAwLCBmJyh6KSA9IHIKKyAgICogeiBiZXR3ZWVuIDAgYW5kIHQKKyAgICogPT4KKyAgICogYSA9ICgxIC0gcl4yKSAvICg0ICogdCkKKyAgICogYiA9ICgxICsgcl4yKSAvIDIKKyAgICogYyA9IHQgKiAoMS4wIC0gYiAtIGEqdCkKKyAgICogZih4KSA9IGF4XjIgKyBieCArIGMgKi8KKyAgcjIgPSBmaWx0ZXItPnJhdGlvICogZmlsdGVyLT5yYXRpbzsKKyAgYV9wID0gKDEuMCAtIHIyKSAvICg0LjAgKiB0aHJlc2hvbGQpOworICBiX3AgPSAoMS4wICsgcjIpIC8gMi4wOworICBjX3AgPSB0aHJlc2hvbGQgKiAoMS4wIC0gYl9wIC0gYV9wICogdGhyZXNob2xkKTsKKyAgYV9uID0gKDEuMCAtIHIyKSAvICgtNC4wICogdGhyZXNob2xkKTsKKyAgYl9uID0gKDEuMCArIHIyKSAvIDIuMDsKKyAgY19uID0gLXRocmVzaG9sZCAqICgxLjAgLSBiX24gKyBhX24gKiB0aHJlc2hvbGQpOworCisgIGZvciAoOyBudW1fc2FtcGxlczsgbnVtX3NhbXBsZXMtLSkgeworICAgIHZhbCA9ICpkYXRhOworCisgICAgaWYgKHZhbCA8IHRocmVzaG9sZCAmJiB2YWwgPiB6ZXJvKSB7CisgICAgICB2YWwgPSBhX3AgKiB2YWwgKiB2YWwgKyBiX3AgKiB2YWwgKyBjX3A7CisgICAgfSBlbHNlIGlmICgodmFsIDw9IHplcm8gJiYgdmFsID4gMC4wKSB8fCAodmFsID49IC16ZXJvICYmIHZhbCA8IDAuMCkpIHsKKyAgICAgIHZhbCA9IDAuMDsKKyAgICB9IGVsc2UgaWYgKHZhbCA+IC10aHJlc2hvbGQgJiYgdmFsIDwgLXplcm8pIHsKKyAgICAgIHZhbCA9IGFfbiAqIHZhbCAqIHZhbCArIGJfbiAqIHZhbCArIGNfbjsKKyAgICB9CisgICAgKmRhdGErKyA9IChnZmxvYXQpIHZhbDsKKyAgfQorfQorCisvKiBHc3RCYXNlVHJhbnNmb3JtIHZtZXRob2QgaW1wbGVtZW50YXRpb25zICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F1ZGlvX2R5bmFtaWNfdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RBdWRpb0R5bmFtaWMgKmZpbHRlciA9IEdTVF9BVURJT19EWU5BTUlDIChiYXNlKTsKKyAgZ3VpbnQgbnVtX3NhbXBsZXM7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIHN0cmVhbV90aW1lOworICBHc3RNYXBJbmZvIG1hcDsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKTsKKyAgc3RyZWFtX3RpbWUgPQorICAgICAgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZiYXNlLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsIHRpbWVzdGFtcCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAic3luYyB0byAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHN0cmVhbV90aW1lKSkKKyAgICBnc3Rfb2JqZWN0X3N5bmNfdmFsdWVzIChHU1RfT0JKRUNUIChmaWx0ZXIpLCBzdHJlYW1fdGltZSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0dBUCkpKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQURXUklURSk7CisgIG51bV9zYW1wbGVzID0gbWFwLnNpemUgLyBHU1RfQVVESU9fRklMVEVSX0JQUyAoZmlsdGVyKTsKKworICBmaWx0ZXItPnByb2Nlc3MgKGZpbHRlciwgbWFwLmRhdGEsIG51bV9zYW1wbGVzKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5oIGIvZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYxZTRmYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qIAorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfQVVESU9fRFlOQU1JQ19IX18KKyNkZWZpbmUgX19HU1RfQVVESU9fRFlOQU1JQ19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9BVURJT19EWU5BTUlDICAgICAgICAgICAgKGdzdF9hdWRpb19keW5hbWljX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9BVURJT19EWU5BTUlDKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVVESU9fRFlOQU1JQyxHc3RBdWRpb0R5bmFtaWMpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fRFlOQU1JQyhvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0FVRElPX0RZTkFNSUMpKQorI2RlZmluZSBHU1RfQVVESU9fRFlOQU1JQ19DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcykgLEdTVF9UWVBFX0FVRElPX0RZTkFNSUMsR3N0QXVkaW9EeW5hbWljQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fRFlOQU1JQ19DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcykgLEdTVF9UWVBFX0FVRElPX0RZTkFNSUMpKQorI2RlZmluZSBHU1RfQVVESU9fRFlOQU1JQ19HRVRfQ0xBU1Mob2JqKSAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MoKG9iaikgLEdTVF9UWVBFX0FVRElPX0RZTkFNSUMsR3N0QXVkaW9EeW5hbWljQ2xhc3MpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1ZGlvRHluYW1pYyBHc3RBdWRpb0R5bmFtaWM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9EeW5hbWljQ2xhc3MgR3N0QXVkaW9EeW5hbWljQ2xhc3M7CisKK3R5cGVkZWYgdm9pZCAoKkdzdEF1ZGlvRHluYW1pY1Byb2Nlc3NGdW5jKSAoR3N0QXVkaW9EeW5hbWljICosIGd1aW50OCAqLCBndWludCk7CisKK3N0cnVjdCBfR3N0QXVkaW9EeW5hbWljCit7CisgIEdzdEF1ZGlvRmlsdGVyIGF1ZGlvZmlsdGVyOworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIEdzdEF1ZGlvRHluYW1pY1Byb2Nlc3NGdW5jIHByb2Nlc3M7CisgIGdpbnQgY2hhcmFjdGVyaXN0aWNzOworICBnaW50IG1vZGU7CisgIGdmbG9hdCB0aHJlc2hvbGQ7CisgIGdmbG9hdCByYXRpbzsKK307CisKK3N0cnVjdCBfR3N0QXVkaW9EeW5hbWljQ2xhc3MKK3sKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyBwYXJlbnQ7Cit9OworCitHVHlwZSBnc3RfYXVkaW9fZHluYW1pY19nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9BVURJT19EWU5BTUlDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9lY2hvLmMgYi9nc3QvYXVkaW9meC9hdWRpb2VjaG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjViZWYxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvYXVkaW9lY2hvLmMKQEAgLTAsMCArMSw1MDQgQEAKKy8qIAorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXVkaW9lY2hvCisgKgorICogYXVkaW9lY2hvIGFkZHMgYW4gZWNobyBvciAoc2ltcGxlKSByZXZlcmIgZWZmZWN0IHRvIGFuIGF1ZGlvIHN0cmVhbS4gVGhlIGVjaG8KKyAqIGRlbGF5LCBpbnRlbnNpdHkgYW5kIHRoZSBwZXJjZW50YWdlIG9mIGZlZWRiYWNrIGNhbiBiZSBjb25maWd1cmVkLgorICoKKyAqIEZvciBnZXR0aW5nIGFuIGVjaG8gZWZmZWN0IHlvdSBoYXZlIHRvIHNldCB0aGUgZGVsYXkgdG8gYSBsYXJnZXIgdmFsdWUsCisgKiBmb3IgZXhhbXBsZSAyMDBtcyBhbmQgbW9yZS4gRXZlcnl0aGluZyBiZWxvdyB3aWxsIHJlc3VsdCBpbiBhIHNpbXBsZQorICogcmV2ZXJiIGVmZmVjdCwgd2hpY2ggcmVzdWx0cyBpbiBhIHNsaWdodGx5IG1ldGFsbGljIHNvdW5kLgorICoKKyAqIFVzZSB0aGUgbWF4LWRlbGF5IHByb3BlcnR5IHRvIHNldCB0aGUgbWF4aW11bSBhbW91bnQgb2YgZGVsYXkgdGhhdAorICogd2lsbCBiZSB1c2VkLiBUaGlzIGNhbiBvbmx5IGJlIHNldCBiZWZvcmUgZ29pbmcgdG8gdGhlIFBBVVNFRCBvciBQTEFZSU5HCisgKiBzdGF0ZSBhbmQgd2lsbCBiZSBzZXQgdG8gdGhlIGN1cnJlbnQgZGVsYXkgYnkgZGVmYXVsdC4KKyAqCisgKiBhdWRpb2VjaG8gY2FuIGFsc28gYmUgdXNlZCB0byBhcHBseSBhIGNvbmZpZ3VyYWJsZSBkZWxheSB0byBhdWRpbyBjaGFubmVscworICogYnkgc2V0dGluZyBzdXJyb3VuZC1kZWxheT10cnVlLiBJbiB0aGF0IG1vZGUsIGl0IGp1c3QgZGVsYXlzICJzdXJyb3VuZAorICogY2hhbm5lbHMiIGJ5IHRoZSBkZWxheSBhbW91bnQgaW5zdGVhZCBvZiBwZXJmb3JtaW5nIGFuIGVjaG8uIFRoZQorICogY2hhbm5lbHMgdGhhdCBhcmUgY29uZmlndXJlZCBzdXJyb3VuZCBjaGFubmVscyBmb3IgdGhlIGRlbGF5IGFyZQorICogc2VsZWN0ZWQgdXNpbmcgdGhlIHN1cnJvdW5kLWNoYW5uZWxzIG1hc2sgcHJvcGVydHkuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBhdXRvYXVkaW9zcmMgISBhdWRpb2NvbnZlcnQgISBhdWRpb2VjaG8gZGVsYXk9NTAwMDAwMDAwIGludGVuc2l0eT0wLjYgZmVlZGJhY2s9MC40ICEgYXVkaW9jb252ZXJ0ICEgYXV0b2F1ZGlvc2luaworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj0ibWVsbzEub2dnIiAhIGRlY29kZWJpbiAhIGF1ZGlvY29udmVydCAhIGF1ZGlvZWNobyBkZWxheT01MDAwMDAwMCBpbnRlbnNpdHk9MC42IGZlZWRiYWNrPTAuNCAhIGF1ZGlvY29udmVydCAhIGF1dG9hdWRpb3NpbmsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyAhIGF1ZGlvY29udmVydCAhIGF1ZGlvL3gtcmF3LGNoYW5uZWxzPTQgISBhdWRpb2VjaG8gc3Vycm91bmQtZGVsYXk9dHJ1ZSBkZWxheT01MDAwMDAwMDAgISBhdWRpb2NvbnZlcnQgISBhdXRvYXVkaW9zaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb2ZpbHRlci5oPgorCisjaW5jbHVkZSAiYXVkaW9lY2hvLmgiCisKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9hdWRpb19lY2hvX2RlYnVnCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChHU1RfQ0FUX0RFRkFVTFQpOworCisvKiBFdmVyeXRoaW5nIGV4Y2VwdCB0aGUgZmlyc3QgMiBjaGFubmVscyBhcmUgY29uc2lkZXJlZCBzdXJyb3VuZCAqLworI2RlZmluZSBERUZBVUxUX1NVUlJPVU5EX01BU0sgfigoZ3VpbnQ2NCkoMHgzKSkKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfREVMQVksCisgIFBST1BfTUFYX0RFTEFZLAorICBQUk9QX0lOVEVOU0lUWSwKKyAgUFJPUF9GRUVEQkFDSywKKyAgUFJPUF9TVVJfREVMQVksCisgIFBST1BfU1VSX01BU0sKK307CisKKyNkZWZpbmUgQUxMT1dFRF9DQVBTIFwKKyAgICAiYXVkaW8veC1yYXcsIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBmb3JtYXQ9KHN0cmluZykgeyJHU1RfQVVESU9fTkUoRjMyKSIsIkdTVF9BVURJT19ORShGNjQpIn0sICIgXAorICAgICIgcmF0ZT0oaW50KVsxLE1BWF0sIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIGNoYW5uZWxzPShpbnQpWzEsTUFYXSwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBsYXlvdXQ9KHN0cmluZykgaW50ZXJsZWF2ZWQiCisKKyNkZWZpbmUgZ3N0X2F1ZGlvX2VjaG9fcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0QXVkaW9FY2hvLCBnc3RfYXVkaW9fZWNobywgR1NUX1RZUEVfQVVESU9fRklMVEVSKTsKKworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2VjaG9fc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2VjaG9fZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2VjaG9fZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F1ZGlvX2VjaG9fc2V0dXAgKEdzdEF1ZGlvRmlsdGVyICogc2VsZiwKKyAgICBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9fZWNob19zdG9wIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfYXVkaW9fZWNob190cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19lY2hvX3RyYW5zZm9ybV9mbG9hdCAoR3N0QXVkaW9FY2hvICogc2VsZiwKKyAgICBnZmxvYXQgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcyk7CitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fZWNob190cmFuc2Zvcm1fZG91YmxlIChHc3RBdWRpb0VjaG8gKiBzZWxmLAorICAgIGdkb3VibGUgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcyk7CisKKy8qIEdPYmplY3Qgdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19lY2hvX2NsYXNzX2luaXQgKEdzdEF1ZGlvRWNob0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqYmFzZXRyYW5zZm9ybV9jbGFzcyA9IChHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKikga2xhc3M7CisgIEdzdEF1ZGlvRmlsdGVyQ2xhc3MgKmF1ZGlvc2VsZl9jbGFzcyA9IChHc3RBdWRpb0ZpbHRlckNsYXNzICopIGtsYXNzOworICBHc3RDYXBzICpjYXBzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfYXVkaW9fZWNob19kZWJ1ZywgImF1ZGlvZWNobyIsIDAsCisgICAgICAiYXVkaW9lY2hvIGVsZW1lbnQiKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9fZWNob19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9hdWRpb19lY2hvX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfYXVkaW9fZWNob19maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RFTEFZLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoImRlbGF5IiwgIkRlbGF5IiwKKyAgICAgICAgICAiRGVsYXkgb2YgdGhlIGVjaG8gaW4gbmFub3NlY29uZHMiLCAxLCBHX01BWFVJTlQ2NCwKKyAgICAgICAgICAxLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MKKyAgICAgICAgICB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01BWF9ERUxBWSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJtYXgtZGVsYXkiLCAiTWF4aW11bSBEZWxheSIsCisgICAgICAgICAgIk1heGltdW0gZGVsYXkgb2YgdGhlIGVjaG8gaW4gbmFub3NlY29uZHMiCisgICAgICAgICAgIiAoY2FuJ3QgYmUgY2hhbmdlZCBpbiBQTEFZSU5HIG9yIFBBVVNFRCBzdGF0ZSkiLAorICAgICAgICAgIDEsIEdfTUFYVUlOVDY0LCAxLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8CisgICAgICAgICAgR1NUX1BBUkFNX01VVEFCTEVfUkVBRFkpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0lOVEVOU0lUWSwKKyAgICAgIGdfcGFyYW1fc3BlY19mbG9hdCAoImludGVuc2l0eSIsICJJbnRlbnNpdHkiLAorICAgICAgICAgICJJbnRlbnNpdHkgb2YgdGhlIGVjaG8iLCAwLjAsIDEuMCwKKyAgICAgICAgICAwLjAsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUworICAgICAgICAgIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRkVFREJBQ0ssCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJmZWVkYmFjayIsICJGZWVkYmFjayIsCisgICAgICAgICAgIkFtb3VudCBvZiBmZWVkYmFjayIsIDAuMCwgMS4wLAorICAgICAgICAgIDAuMCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTCisgICAgICAgICAgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TVVJfREVMQVksCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInN1cnJvdW5kLWRlbGF5IiwgIkVuYWJsZSBTdXJyb3VuZCBEZWxheSIsCisgICAgICAgICAgIkRlbGF5IFN1cnJvdW5kIENoYW5uZWxzIHdoZW4gVFJVRSBpbnN0ZWFkIG9mIGFwcGx5aW5nIGFuIGVjaG8gZWZmZWN0IiwKKyAgICAgICAgICBGQUxTRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TVVJfTUFTSywKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJzdXJyb3VuZC1tYXNrIiwgIlN1cnJvdW5kIE1hc2siLAorICAgICAgICAgICJBIGJpdG1hc2sgb2YgY2hhbm5lbHMgdGhhdCBhcmUgY29uc2lkZXJlZCBzdXJyb3VuZCBhbmQgZGVsYXllZCB3aGVuIHN1cnJvdW5kLWRlbGF5ID0gVFJVRSIsCisgICAgICAgICAgMSwgR19NQVhVSU5UNjQsIERFRkFVTFRfU1VSUk9VTkRfTUFTSywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfAorICAgICAgICAgIEdTVF9QQVJBTV9NVVRBQkxFX1JFQURZKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkF1ZGlvIGVjaG8iLAorICAgICAgIkZpbHRlci9FZmZlY3QvQXVkaW8iLAorICAgICAgIkFkZHMgYW4gZWNobyBvciByZXZlcmIgZWZmZWN0IHRvIGFuIGF1ZGlvIHN0cmVhbSIsCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBTExPV0VEX0NBUFMpOworICBnc3RfYXVkaW9fZmlsdGVyX2NsYXNzX2FkZF9wYWRfdGVtcGxhdGVzIChHU1RfQVVESU9fRklMVEVSX0NMQVNTIChrbGFzcyksCisgICAgICBjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGF1ZGlvc2VsZl9jbGFzcy0+c2V0dXAgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX2VjaG9fc2V0dXApOworICBiYXNldHJhbnNmb3JtX2NsYXNzLT50cmFuc2Zvcm1faXAgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdWRpb19lY2hvX3RyYW5zZm9ybV9pcCk7CisgIGJhc2V0cmFuc2Zvcm1fY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX2VjaG9fc3RvcCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZWNob19pbml0IChHc3RBdWRpb0VjaG8gKiBzZWxmKQoreworICBzZWxmLT5kZWxheSA9IDE7CisgIHNlbGYtPm1heF9kZWxheSA9IDE7CisgIHNlbGYtPmludGVuc2l0eSA9IDAuMDsKKyAgc2VsZi0+ZmVlZGJhY2sgPSAwLjA7CisgIHNlbGYtPnN1cmRlbGF5ID0gRkFMU0U7CisgIHNlbGYtPnN1cnJvdW5kX21hc2sgPSBERUZBVUxUX1NVUlJPVU5EX01BU0s7CisKKyAgZ19tdXRleF9pbml0ICgmc2VsZi0+bG9jayk7CisKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9pbl9wbGFjZSAoR1NUX0JBU0VfVFJBTlNGT1JNIChzZWxmKSwgVFJVRSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZWNob19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0QXVkaW9FY2hvICpzZWxmID0gR1NUX0FVRElPX0VDSE8gKG9iamVjdCk7CisKKyAgZ19mcmVlIChzZWxmLT5idWZmZXIpOworICBzZWxmLT5idWZmZXIgPSBOVUxMOworCisgIGdfbXV0ZXhfY2xlYXIgKCZzZWxmLT5sb2NrKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZWNob19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXVkaW9FY2hvICpzZWxmID0gR1NUX0FVRElPX0VDSE8gKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RFTEFZOnsKKyAgICAgIGd1aW50NjQgbWF4X2RlbGF5LCBkZWxheTsKKyAgICAgIGd1aW50IHJhdGU7CisKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgZGVsYXkgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIG1heF9kZWxheSA9IHNlbGYtPm1heF9kZWxheTsKKworICAgICAgaWYgKGRlbGF5ID4gbWF4X2RlbGF5ICYmIEdTVF9TVEFURSAoc2VsZikgPiBHU1RfU1RBVEVfUkVBRFkpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzZWxmLCAiTmV3IGRlbGF5ICglIiBHU1RfVElNRV9GT1JNQVQgIikgIgorICAgICAgICAgICAgImlzIGxhcmdlciB0aGFuIG1heGltdW0gZGVsYXkgKCUiIEdTVF9USU1FX0ZPUk1BVCAiKSIsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChkZWxheSksIEdTVF9USU1FX0FSR1MgKG1heF9kZWxheSkpOworICAgICAgICBzZWxmLT5kZWxheSA9IG1heF9kZWxheTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNlbGYtPmRlbGF5ID0gZGVsYXk7CisgICAgICAgIHNlbGYtPm1heF9kZWxheSA9IE1BWCAoZGVsYXksIG1heF9kZWxheSk7CisgICAgICAgIGlmIChkZWxheSA+IG1heF9kZWxheSkgeworICAgICAgICAgIGdfZnJlZSAoc2VsZi0+YnVmZmVyKTsKKyAgICAgICAgICBzZWxmLT5idWZmZXIgPSBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICByYXRlID0gR1NUX0FVRElPX0ZJTFRFUl9SQVRFIChzZWxmKTsKKyAgICAgIGlmIChyYXRlID4gMCkKKyAgICAgICAgc2VsZi0+ZGVsYXlfZnJhbWVzID0KKyAgICAgICAgICAgIE1BWCAoZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzZWxmLT5kZWxheSwgcmF0ZSwgR1NUX1NFQ09ORCksIDEpOworCisgICAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9NQVhfREVMQVk6eworICAgICAgZ3VpbnQ2NCBtYXhfZGVsYXk7CisKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgbWF4X2RlbGF5ID0gZ192YWx1ZV9nZXRfdWludDY0ICh2YWx1ZSk7CisKKyAgICAgIGlmIChHU1RfU1RBVEUgKHNlbGYpID4gR1NUX1NUQVRFX1JFQURZKSB7CisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsICJDYW4ndCBjaGFuZ2UgbWF4aW11bSBkZWxheSBpbiIKKyAgICAgICAgICAgICIgUExBWUlORyBvciBQQVVTRUQgc3RhdGUiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNlbGYtPm1heF9kZWxheSA9IG1heF9kZWxheTsKKyAgICAgICAgZ19mcmVlIChzZWxmLT5idWZmZXIpOworICAgICAgICBzZWxmLT5idWZmZXIgPSBOVUxMOworICAgICAgfQorICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfSU5URU5TSVRZOnsKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgc2VsZi0+aW50ZW5zaXR5ID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0ZFRURCQUNLOnsKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgc2VsZi0+ZmVlZGJhY2sgPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfU1VSX0RFTEFZOnsKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgc2VsZi0+c3VyZGVsYXkgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9TVVJfTUFTSzp7CisgICAgICBnX211dGV4X2xvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIHNlbGYtPnN1cnJvdW5kX21hc2sgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2VjaG9fZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEF1ZGlvRWNobyAqc2VsZiA9IEdTVF9BVURJT19FQ0hPIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9ERUxBWToKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgc2VsZi0+ZGVsYXkpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfREVMQVk6CisgICAgICBnX211dGV4X2xvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHNlbGYtPm1heF9kZWxheSk7CisgICAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0lOVEVOU0lUWToKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBzZWxmLT5pbnRlbnNpdHkpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GRUVEQkFDSzoKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBzZWxmLT5mZWVkYmFjayk7CisgICAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NVUl9ERUxBWToKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNlbGYtPnN1cmRlbGF5KTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1VSX01BU0s6eworICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCBzZWxmLT5zdXJyb3VuZF9tYXNrKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBHc3RBdWRpb0ZpbHRlciB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdWRpb19lY2hvX3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGJhc2UsIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIEdzdEF1ZGlvRWNobyAqc2VsZiA9IEdTVF9BVURJT19FQ0hPIChiYXNlKTsKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKworICBzd2l0Y2ggKEdTVF9BVURJT19JTkZPX0ZPUk1BVCAoaW5mbykpIHsKKyAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfRjMyOgorICAgICAgc2VsZi0+cHJvY2VzcyA9IChHc3RBdWRpb0VjaG9Qcm9jZXNzRnVuYykKKyAgICAgICAgICBnc3RfYXVkaW9fZWNob190cmFuc2Zvcm1fZmxvYXQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfRjY0OgorICAgICAgc2VsZi0+cHJvY2VzcyA9IChHc3RBdWRpb0VjaG9Qcm9jZXNzRnVuYykKKyAgICAgICAgICBnc3RfYXVkaW9fZWNob190cmFuc2Zvcm1fZG91YmxlOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IEZBTFNFOworICAgICAgYnJlYWs7CisgIH0KKworICBnX2ZyZWUgKHNlbGYtPmJ1ZmZlcik7CisgIHNlbGYtPmJ1ZmZlciA9IE5VTEw7CisgIHNlbGYtPmJ1ZmZlcl9wb3MgPSAwOworICBzZWxmLT5idWZmZXJfc2l6ZSA9IDA7CisgIHNlbGYtPmJ1ZmZlcl9zaXplX2ZyYW1lcyA9IDA7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYXVkaW9fZWNob19zdG9wIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSkKK3sKKyAgR3N0QXVkaW9FY2hvICpzZWxmID0gR1NUX0FVRElPX0VDSE8gKGJhc2UpOworCisgIGdfZnJlZSAoc2VsZi0+YnVmZmVyKTsKKyAgc2VsZi0+YnVmZmVyID0gTlVMTDsKKyAgc2VsZi0+YnVmZmVyX3BvcyA9IDA7CisgIHNlbGYtPmJ1ZmZlcl9zaXplID0gMDsKKyAgc2VsZi0+YnVmZmVyX3NpemVfZnJhbWVzID0gMDsKKworICByZXR1cm4gVFJVRTsKK30KKworI2RlZmluZSBUUkFOU0ZPUk1fRlVOQyhuYW1lLCB0eXBlKSBcCitzdGF0aWMgdm9pZCBcCitnc3RfYXVkaW9fZWNob190cmFuc2Zvcm1fIyNuYW1lIChHc3RBdWRpb0VjaG8gKiBzZWxmLCBcCisgICAgdHlwZSAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKSBcCit7IFwKKyAgdHlwZSAqYnVmZmVyID0gKHR5cGUgKikgc2VsZi0+YnVmZmVyOyBcCisgIGd1aW50IGNoYW5uZWxzID0gR1NUX0FVRElPX0ZJTFRFUl9DSEFOTkVMUyAoc2VsZik7IFwKKyAgZ3VpbnQgaSwgajsgXAorICBndWludCBlY2hvX29mZnNldCA9IHNlbGYtPmJ1ZmZlcl9zaXplX2ZyYW1lcyAtIHNlbGYtPmRlbGF5X2ZyYW1lczsgXAorICBnZG91YmxlIGludGVuc2l0eSA9IHNlbGYtPmludGVuc2l0eTsgXAorICBnZG91YmxlIGZlZWRiYWNrID0gc2VsZi0+ZmVlZGJhY2s7IFwKKyAgZ3VpbnQgYnVmZmVyX3BvcyA9IHNlbGYtPmJ1ZmZlcl9wb3M7IFwKKyAgZ3VpbnQgYnVmZmVyX3NpemVfZnJhbWVzID0gc2VsZi0+YnVmZmVyX3NpemVfZnJhbWVzOyBcCisgIFwKKyAgaWYgKHNlbGYtPnN1cmRlbGF5ID09IEZBTFNFKSB7IFwKKyAgICBndWludCByZWFkX3BvcyA9ICgoZWNob19vZmZzZXQgKyBidWZmZXJfcG9zKSAlIGJ1ZmZlcl9zaXplX2ZyYW1lcykgKiBjaGFubmVsczsgXAorICAgIGd1aW50IHdyaXRlX3BvcyA9IChidWZmZXJfcG9zICUgYnVmZmVyX3NpemVfZnJhbWVzKSAqIGNoYW5uZWxzOyBcCisgICAgZ3VpbnQgYnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZV9mcmFtZXMgKiBjaGFubmVsczsgXAorICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc2FtcGxlczsgaSsrKSB7IFwKKyAgICAgIGdkb3VibGUgaW4gPSAqZGF0YTsgXAorICAgICAgZ2RvdWJsZSBlY2hvID0gYnVmZmVyW3JlYWRfcG9zXTsgXAorICAgICAgdHlwZSBvdXQgPSBpbiArIGludGVuc2l0eSAqIGVjaG87IFwKKyAgICAgIFwKKyAgICAgICpkYXRhID0gb3V0OyBcCisgICAgICBcCisgICAgICBidWZmZXJbd3JpdGVfcG9zXSA9IGluICsgZmVlZGJhY2sgKiBlY2hvOyBcCisgICAgICByZWFkX3BvcyA9IChyZWFkX3BvcyArIDEpICUgYnVmZmVyX3NpemU7IFwKKyAgICAgIHdyaXRlX3BvcyA9ICh3cml0ZV9wb3MgKyAxKSAlIGJ1ZmZlcl9zaXplOyBcCisgICAgICBkYXRhKys7IFwKKyAgICB9IFwKKyAgICBidWZmZXJfcG9zID0gd3JpdGVfcG9zIC8gY2hhbm5lbHM7IFwKKyAgfSBlbHNlIHsgXAorICAgIGd1aW50NjQgc3Vycm91bmRfbWFzayA9IHNlbGYtPnN1cnJvdW5kX21hc2s7IFwKKyAgICBndWludCByZWFkX3BvcyA9ICgoZWNob19vZmZzZXQgKyBidWZmZXJfcG9zKSAlIGJ1ZmZlcl9zaXplX2ZyYW1lcykgKiBjaGFubmVsczsgXAorICAgIGd1aW50IHdyaXRlX3BvcyA9IChidWZmZXJfcG9zICUgYnVmZmVyX3NpemVfZnJhbWVzKSAqIGNoYW5uZWxzOyBcCisgICAgZ3VpbnQgYnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZV9mcmFtZXMgKiBjaGFubmVsczsgXAorICAgIFwKKyAgICBudW1fc2FtcGxlcyAvPSBjaGFubmVsczsgXAorICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NhbXBsZXM7IGkrKykgeyBcCisgICAgICBndWludDY0IGNoYW5uZWxfbWFzayA9IDE7IFwKKyAgICAgIFwKKyAgICAgIGZvciAoaiA9IDA7IGogPCBjaGFubmVsczsgaisrKSB7IFwKKyAgICAgICAgaWYgKGNoYW5uZWxfbWFzayAmIHN1cnJvdW5kX21hc2spIHsgXAorICAgICAgICAgIGdkb3VibGUgaW4gPSBkYXRhW2pdOyBcCisgICAgICAgICAgZ2RvdWJsZSBlY2hvID0gYnVmZmVyW3JlYWRfcG9zICsgal07IFwKKyAgICAgICAgICB0eXBlIG91dCA9IGVjaG87IFwKKyAgICAgICAgICBcCisgICAgICAgICAgZGF0YVtqXSA9IG91dDsgXAorICAgICAgICAgIFwKKyAgICAgICAgICBidWZmZXJbd3JpdGVfcG9zICsgal0gPSBpbjsgXAorICAgICAgICB9IGVsc2UgeyBcCisgICAgICAgICAgZ2RvdWJsZSBpbiA9IGRhdGFbal07IFwKKyAgICAgICAgICBnZG91YmxlIGVjaG8gPSBidWZmZXJbcmVhZF9wb3MgKyBqXTsgXAorICAgICAgICAgIHR5cGUgb3V0ID0gaW4gKyBpbnRlbnNpdHkgKiBlY2hvOyBcCisgICAgICAgICAgXAorICAgICAgICAgIGRhdGFbal0gPSBvdXQ7IFwKKyAgICAgICAgICBcCisgICAgICAgICAgYnVmZmVyW3dyaXRlX3BvcyArIGpdID0gaW4gKyBmZWVkYmFjayAqIGVjaG87IFwKKyAgICAgICAgfSBcCisgICAgICAgIGNoYW5uZWxfbWFzayA8PD0gMTsgXAorICAgICAgfSBcCisgICAgICByZWFkX3BvcyA9IChyZWFkX3BvcyArIGNoYW5uZWxzKSAlIGJ1ZmZlcl9zaXplOyBcCisgICAgICB3cml0ZV9wb3MgPSAod3JpdGVfcG9zICsgY2hhbm5lbHMpICUgYnVmZmVyX3NpemU7IFwKKyAgICAgIGRhdGEgKz0gY2hhbm5lbHM7IFwKKyAgICB9IFwKKyAgICBidWZmZXJfcG9zID0gd3JpdGVfcG9zIC8gY2hhbm5lbHM7IFwKKyAgfSBcCisgIHNlbGYtPmJ1ZmZlcl9wb3MgPSBidWZmZXJfcG9zOyBcCit9CisKK1RSQU5TRk9STV9GVU5DIChmbG9hdCwgZ2Zsb2F0KTsKK1RSQU5TRk9STV9GVU5DIChkb3VibGUsIGdkb3VibGUpOworCisvKiBHc3RCYXNlVHJhbnNmb3JtIHZtZXRob2QgaW1wbGVtZW50YXRpb25zICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F1ZGlvX2VjaG9fdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RBdWRpb0VjaG8gKnNlbGYgPSBHU1RfQVVESU9fRUNITyAoYmFzZSk7CisgIGd1aW50IG51bV9zYW1wbGVzOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBzdHJlYW1fdGltZTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpOworICBzdHJlYW1fdGltZSA9CisgICAgICBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJmJhc2UtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgdGltZXN0YW1wKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAic3luYyB0byAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHN0cmVhbV90aW1lKSkKKyAgICBnc3Rfb2JqZWN0X3N5bmNfdmFsdWVzIChHU1RfT0JKRUNUIChzZWxmKSwgc3RyZWFtX3RpbWUpOworCisgIGlmIChzZWxmLT5idWZmZXIgPT0gTlVMTCkgeworICAgIGd1aW50IGJwZiwgcmF0ZTsKKworICAgIGJwZiA9IEdTVF9BVURJT19GSUxURVJfQlBGIChzZWxmKTsKKyAgICByYXRlID0gR1NUX0FVRElPX0ZJTFRFUl9SQVRFIChzZWxmKTsKKworICAgIHNlbGYtPmRlbGF5X2ZyYW1lcyA9CisgICAgICAgIE1BWCAoZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzZWxmLT5kZWxheSwgcmF0ZSwgR1NUX1NFQ09ORCksIDEpOworICAgIHNlbGYtPmJ1ZmZlcl9zaXplX2ZyYW1lcyA9CisgICAgICAgIE1BWCAoZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzZWxmLT5tYXhfZGVsYXksIHJhdGUsIEdTVF9TRUNPTkQpLCAxKTsKKworICAgIHNlbGYtPmJ1ZmZlcl9zaXplID0gc2VsZi0+YnVmZmVyX3NpemVfZnJhbWVzICogYnBmOworICAgIHNlbGYtPmJ1ZmZlciA9IGdfdHJ5X21hbGxvYzAgKHNlbGYtPmJ1ZmZlcl9zaXplKTsKKyAgICBzZWxmLT5idWZmZXJfcG9zID0gMDsKKworICAgIGlmIChzZWxmLT5idWZmZXIgPT0gTlVMTCkgeworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsICJGYWlsZWQgdG8gYWxsb2NhdGUgJXUgYnl0ZXMiLCBzZWxmLT5idWZmZXJfc2l6ZSk7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgfQorICB9CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEV1JJVEUpOworICBudW1fc2FtcGxlcyA9IG1hcC5zaXplIC8gR1NUX0FVRElPX0ZJTFRFUl9CUFMgKHNlbGYpOworCisgIHNlbGYtPnByb2Nlc3MgKHNlbGYsIG1hcC5kYXRhLCBudW1fc2FtcGxlcyk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9hdWRpb2VjaG8uaCBiL2dzdC9hdWRpb2Z4L2F1ZGlvZWNoby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNjg5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb2VjaG8uaApAQCAtMCwwICsxLDczIEBACisvKiAKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA5IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfQVVESU9fRUNIT19IX18KKyNkZWZpbmUgX19HU1RfQVVESU9fRUNIT19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9BVURJT19FQ0hPICAgICAgICAgICAgKGdzdF9hdWRpb19lY2hvX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9BVURJT19FQ0hPKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVVESU9fRUNITyxHc3RBdWRpb0VjaG8pKQorI2RlZmluZSBHU1RfSVNfQVVESU9fRUNITyhvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0FVRElPX0VDSE8pKQorI2RlZmluZSBHU1RfQVVESU9fRUNIT19DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcykgLEdTVF9UWVBFX0FVRElPX0VDSE8sR3N0QXVkaW9FY2hvQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fRUNIT19DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcykgLEdTVF9UWVBFX0FVRElPX0VDSE8pKQorI2RlZmluZSBHU1RfQVVESU9fRUNIT19HRVRfQ0xBU1Mob2JqKSAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MoKG9iaikgLEdTVF9UWVBFX0FVRElPX0VDSE8sR3N0QXVkaW9FY2hvQ2xhc3MpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1ZGlvRWNobyBHc3RBdWRpb0VjaG87Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9FY2hvQ2xhc3MgR3N0QXVkaW9FY2hvQ2xhc3M7CisKK3R5cGVkZWYgdm9pZCAoKkdzdEF1ZGlvRWNob1Byb2Nlc3NGdW5jKSAoR3N0QXVkaW9FY2hvICosIGd1aW50OCAqLCBndWludCk7CisKK3N0cnVjdCBfR3N0QXVkaW9FY2hvCit7CisgIEdzdEF1ZGlvRmlsdGVyIGF1ZGlvZmlsdGVyOworCisgIGd1aW50NjQgZGVsYXk7CisgIGd1aW50NjQgbWF4X2RlbGF5OworICBnZmxvYXQgaW50ZW5zaXR5OworICBnZmxvYXQgZmVlZGJhY2s7CisgIGdib29sZWFuIHN1cmRlbGF5OworICBndWludDY0IHN1cnJvdW5kX21hc2s7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKyAgR3N0QXVkaW9FY2hvUHJvY2Vzc0Z1bmMgcHJvY2VzczsKKyAgZ3VpbnQgZGVsYXlfZnJhbWVzOworICBndWludDggKmJ1ZmZlcjsKKyAgZ3VpbnQgYnVmZmVyX3BvczsKKyAgZ3VpbnQgYnVmZmVyX3NpemU7CisgIGd1aW50IGJ1ZmZlcl9zaXplX2ZyYW1lczsKKworICBHTXV0ZXggbG9jazsKK307CisKK3N0cnVjdCBfR3N0QXVkaW9FY2hvQ2xhc3MKK3sKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyBwYXJlbnQ7Cit9OworCitHVHlwZSBnc3RfYXVkaW9fZWNob19nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9BVURJT19FQ0hPX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9maXJmaWx0ZXIuYyBiL2dzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFiMzJmMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmMKQEAgLTAsMCArMSwyNjIgQEAKKy8qIAorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKiAKKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1hdWRpb2ZpcmZpbHRlcgorICoKKyAqIGF1ZGlvZmlyZmlsdGVyIGltcGxlbWVudHMgYSBnZW5lcmljIGF1ZGlvIDx1bGluayB1cmw9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmluaXRlX2ltcHVsc2VfcmVzcG9uc2UiPkZJUiBmaWx0ZXI8L3VsaW5rPi4gQmVmb3JlIHVzYWdlIHRoZQorICogImtlcm5lbCIgcHJvcGVydHkgaGFzIHRvIGJlIHNldCB0byB0aGUgZmlsdGVyIGtlcm5lbCB0aGF0IHNob3VsZCBiZQorICogdXNlZCBhbmQgdGhlICJsYXRlbmN5IiBwcm9wZXJ0eSBoYXMgdG8gYmUgc2V0IHRvIHRoZSBsYXRlbmN5IChpbiBzYW1wbGVzKQorICogdGhhdCBpcyBpbnRyb2R1Y2VkIGJ5IHRoZSBmaWx0ZXIga2VybmVsLiBTZXR0aW5nIGEgbGF0ZW5jeSBvZiBuIHNhbXBsZXMKKyAqIHdpbGwgbGVhZCB0byB0aGUgZmlyc3QgbiBzYW1wbGVzIGJlaW5nIGRyb3BwZWQgZnJvbSB0aGUgb3V0cHV0IGFuZAorICogbiBzYW1wbGVzIGFkZGVkIHRvIHRoZSBlbmQuCisgKgorICogVGhlIGZpbHRlciBrZXJuZWwgZGVzY3JpYmVzIHRoZSBpbXB1bHNlIHJlc3BvbnNlIG9mIHRoZSBmaWx0ZXIuIFRvCisgKiBjYWxjdWxhdGUgdGhlIGZyZXF1ZW5jeSByZXNwb25zZSBvZiB0aGUgZmlsdGVyIHlvdSBoYXZlIHRvIGNhbGN1bGF0ZQorICogdGhlIEZvdXJpZXIgVHJhbnNmb3JtIG9mIHRoZSBpbXB1bHNlIHJlc3BvbnNlLgorICoKKyAqIFRvIGNoYW5nZSB0aGUgZmlsdGVyIGtlcm5lbCB3aGVuZXZlciB0aGUgc2FtcGxpbmcgcmF0ZSBjaGFuZ2VzIHRoZQorICogInJhdGUtY2hhbmdlZCIgc2lnbmFsIGNhbiBiZSB1c2VkLiBUaGlzIHNob3VsZCBiZSBkb25lIGZvciBtb3N0CisgKiBGSVIgZmlsdGVycyBhcyB0aGV5J3JlIGRlcGVuZGluZyBvbiB0aGUgc2FtcGxpbmcgcmF0ZS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBhcHBsaWNhdGlvbjwvdGl0bGU+CisgKiA8aW5mb3JtYWxleGFtcGxlPjxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iQyI+CisgKiA8eGk6aW5jbHVkZSB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy9YSW5jbHVkZSIgcGFyc2U9InRleHQiIGhyZWY9Ii4uLy4uLy4uLy4uL3Rlc3RzL2V4YW1wbGVzL2F1ZGlvZngvZmlyZmlsdGVyLWV4YW1wbGUuYyIgLz4KKyAqIDwvcHJvZ3JhbWxpc3Rpbmc+PC9pbmZvcm1hbGV4YW1wbGU+CisgKiA8L3JlZnNlY3QyPgorICovCisKKy8qIEZJWE1FIDAuMTE6IHN1cHByZXNzIHdhcm5pbmdzIGZvciBkZXByZWNhdGVkIEFQSSBzdWNoIGFzIEdWYWx1ZUFycmF5CisgKiB3aXRoIG5ld2VyIEdMaWIgdmVyc2lvbnMgKD49IDIuMzEuMCkgKi8KKyNkZWZpbmUgR0xJQl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlICJhdWRpb2ZpcmZpbHRlci5oIgorCisjaW5jbHVkZSAiZ3N0L2dsaWItY29tcGF0LXByaXZhdGUuaCIKKworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X2F1ZGlvX2Zpcl9maWx0ZXJfZGVidWcKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKEdTVF9DQVRfREVGQVVMVCk7CisKK2VudW0KK3sKKyAgU0lHTkFMX1JBVEVfQ0hBTkdFRCwKKyAgTEFTVF9TSUdOQUwKK307CisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0tFUk5FTCwKKyAgUFJPUF9MQVRFTkNZCit9OworCitzdGF0aWMgZ3VpbnQgZ3N0X2F1ZGlvX2Zpcl9maWx0ZXJfc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAsIH07CisKKyNkZWZpbmUgZ3N0X2F1ZGlvX2Zpcl9maWx0ZXJfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0QXVkaW9GSVJGaWx0ZXIsIGdzdF9hdWRpb19maXJfZmlsdGVyLAorICAgIEdTVF9UWVBFX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUik7CisKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19maXJfZmlsdGVyX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19maXJfZmlsdGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19maXJfZmlsdGVyX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hdWRpb19maXJfZmlsdGVyX3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGJhc2UsCisgICAgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbyk7CisKKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19maXJfZmlsdGVyX2NsYXNzX2luaXQgKEdzdEF1ZGlvRklSRmlsdGVyQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyAqZmlsdGVyX2NsYXNzID0gKEdzdEF1ZGlvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9hdWRpb19maXJfZmlsdGVyX2RlYnVnLCAiYXVkaW9maXJmaWx0ZXIiLCAwLAorICAgICAgIkdlbmVyaWMgYXVkaW8gRklSIGZpbHRlciBwbHVnaW4iKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9fZmlyX2ZpbHRlcl9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9hdWRpb19maXJfZmlsdGVyX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfYXVkaW9fZmlyX2ZpbHRlcl9maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0tFUk5FTCwKKyAgICAgIGdfcGFyYW1fc3BlY192YWx1ZV9hcnJheSAoImtlcm5lbCIsICJGaWx0ZXIgS2VybmVsIiwKKyAgICAgICAgICAiRmlsdGVyIGtlcm5lbCBmb3IgdGhlIEZJUiBmaWx0ZXIiLAorICAgICAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJFbGVtZW50IiwgIkZpbHRlciBLZXJuZWwgRWxlbWVudCIsCisgICAgICAgICAgICAgICJFbGVtZW50IG9mIHRoZSBmaWx0ZXIga2VybmVsIiwgLUdfTUFYRE9VQkxFLCBHX01BWERPVUJMRSwgMC4wLAorICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0xBVEVOQ1ksCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgibGF0ZW5jeSIsICJMYXRlY3kiLAorICAgICAgICAgICJGaWx0ZXIgbGF0ZW5jeSBpbiBzYW1wbGVzIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQ2NCwgMCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZmlsdGVyX2NsYXNzLT5zZXR1cCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVkaW9fZmlyX2ZpbHRlcl9zZXR1cCk7CisKKyAgLyoqCisgICAqIEdzdEF1ZGlvRklSRmlsdGVyOjpyYXRlLWNoYW5nZWQ6CisgICAqIEBmaWx0ZXI6IHRoZSBmaWx0ZXIgb24gd2hpY2ggdGhlIHNpZ25hbCBpcyBlbWl0dGVkCisgICAqIEByYXRlOiB0aGUgbmV3IHNhbXBsaW5nIHJhdGUKKyAgICoKKyAgICogV2lsbCBiZSBlbWl0dGVkIHdoZW4gdGhlIHNhbXBsaW5nIHJhdGUgY2hhbmdlcy4gVGhlIGNhbGxiYWNrcworICAgKiB3aWxsIGJlIGNhbGxlZCBmcm9tIHRoZSBzdHJlYW1pbmcgdGhyZWFkIGFuZCBwcm9jZXNzaW5nIHdpbGwKKyAgICogc3RvcCB1bnRpbCB0aGUgZXZlbnQgaXMgaGFuZGxlZC4KKyAgICovCisgIGdzdF9hdWRpb19maXJfZmlsdGVyX3NpZ25hbHNbU0lHTkFMX1JBVEVfQ0hBTkdFRF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgicmF0ZS1jaGFuZ2VkIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdEF1ZGlvRklSRmlsdGVyQ2xhc3MsIHJhdGVfY2hhbmdlZCksCisgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBHX1RZUEVfTk9ORSwgMSwgR19UWVBFX0lOVCk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJBdWRpbyBGSVIgZmlsdGVyIiwgIkZpbHRlci9FZmZlY3QvQXVkaW8iLAorICAgICAgIkdlbmVyaWMgYXVkaW8gRklSIGZpbHRlciB3aXRoIGN1c3RvbSBmaWx0ZXIga2VybmVsIiwKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19maXJfZmlsdGVyX3VwZGF0ZV9rZXJuZWwgKEdzdEF1ZGlvRklSRmlsdGVyICogc2VsZiwgR1ZhbHVlQXJyYXkgKiB2YSkKK3sKKyAgZ2RvdWJsZSAqa2VybmVsOworICBndWludCBpOworCisgIGlmICh2YSkgeworICAgIGlmIChzZWxmLT5rZXJuZWwpCisgICAgICBnX3ZhbHVlX2FycmF5X2ZyZWUgKHNlbGYtPmtlcm5lbCk7CisKKyAgICBzZWxmLT5rZXJuZWwgPSB2YTsKKyAgfQorCisgIGtlcm5lbCA9IGdfbmV3IChnZG91YmxlLCBzZWxmLT5rZXJuZWwtPm5fdmFsdWVzKTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+a2VybmVsLT5uX3ZhbHVlczsgaSsrKSB7CisgICAgR1ZhbHVlICp2ID0gZ192YWx1ZV9hcnJheV9nZXRfbnRoIChzZWxmLT5rZXJuZWwsIGkpOworICAgIGtlcm5lbFtpXSA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodik7CisgIH0KKworICBnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3NldF9rZXJuZWwgKEdTVF9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIgKHNlbGYpLAorICAgICAga2VybmVsLCBzZWxmLT5rZXJuZWwtPm5fdmFsdWVzLCBzZWxmLT5sYXRlbmN5LCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19maXJfZmlsdGVyX2luaXQgKEdzdEF1ZGlvRklSRmlsdGVyICogc2VsZikKK3sKKyAgR1ZhbHVlIHYgPSB7IDAsIH07CisgIEdWYWx1ZUFycmF5ICp2YTsKKworICBzZWxmLT5sYXRlbmN5ID0gMDsKKyAgdmEgPSBnX3ZhbHVlX2FycmF5X25ldyAoMSk7CisKKyAgZ192YWx1ZV9pbml0ICgmdiwgR19UWVBFX0RPVUJMRSk7CisgIGdfdmFsdWVfc2V0X2RvdWJsZSAoJnYsIDEuMCk7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kICh2YSwgJnYpOworICBnX3ZhbHVlX3Vuc2V0ICgmdik7CisgIGdzdF9hdWRpb19maXJfZmlsdGVyX3VwZGF0ZV9rZXJuZWwgKHNlbGYsIHZhKTsKKworICBnX211dGV4X2luaXQgKCZzZWxmLT5sb2NrKTsKK30KKworLyogR3N0QXVkaW9GaWx0ZXIgdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KKworLyogZ2V0IG5vdGlmaWVkIG9mIGNhcHMgYW5kIHBsdWcgaW4gdGhlIGNvcnJlY3QgcHJvY2VzcyBmdW5jdGlvbiAqLworc3RhdGljIGdib29sZWFuCitnc3RfYXVkaW9fZmlyX2ZpbHRlcl9zZXR1cCAoR3N0QXVkaW9GaWx0ZXIgKiBiYXNlLCBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKQoreworICBHc3RBdWRpb0ZJUkZpbHRlciAqc2VsZiA9IEdTVF9BVURJT19GSVJfRklMVEVSIChiYXNlKTsKKyAgZ2ludCBuZXdfcmF0ZSA9IEdTVF9BVURJT19JTkZPX1JBVEUgKGluZm8pOworCisgIGlmIChHU1RfQVVESU9fRklMVEVSX1JBVEUgKHNlbGYpICE9IG5ld19yYXRlKSB7CisgICAgZ19zaWduYWxfZW1pdCAoR19PQkpFQ1QgKHNlbGYpLAorICAgICAgICBnc3RfYXVkaW9fZmlyX2ZpbHRlcl9zaWduYWxzW1NJR05BTF9SQVRFX0NIQU5HRURdLCAwLCBuZXdfcmF0ZSk7CisgIH0KKworICByZXR1cm4gR1NUX0FVRElPX0ZJTFRFUl9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2V0dXAgKGJhc2UsIGluZm8pOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2Zpcl9maWx0ZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEF1ZGlvRklSRmlsdGVyICpzZWxmID0gR1NUX0FVRElPX0ZJUl9GSUxURVIgKG9iamVjdCk7CisKKyAgZ19tdXRleF9jbGVhciAoJnNlbGYtPmxvY2spOworCisgIGlmIChzZWxmLT5rZXJuZWwpCisgICAgZ192YWx1ZV9hcnJheV9mcmVlIChzZWxmLT5rZXJuZWwpOworICBzZWxmLT5rZXJuZWwgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19maXJfZmlsdGVyX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb0ZJUkZpbHRlciAqc2VsZiA9IEdTVF9BVURJT19GSVJfRklMVEVSIChvYmplY3QpOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19BVURJT19GSVJfRklMVEVSIChzZWxmKSk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0tFUk5FTDoKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgLyogdXBkYXRlIGtlcm5lbCBhbHJlYWR5IHB1c2hlcyByZXNpZHVlcyAqLworICAgICAgZ3N0X2F1ZGlvX2Zpcl9maWx0ZXJfdXBkYXRlX2tlcm5lbCAoc2VsZiwgZ192YWx1ZV9kdXBfYm94ZWQgKHZhbHVlKSk7CisgICAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0xBVEVOQ1k6CisgICAgICBnX211dGV4X2xvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIHNlbGYtPmxhdGVuY3kgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIGdzdF9hdWRpb19maXJfZmlsdGVyX3VwZGF0ZV9rZXJuZWwgKHNlbGYsIE5VTEwpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19maXJfZmlsdGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb0ZJUkZpbHRlciAqc2VsZiA9IEdTVF9BVURJT19GSVJfRklMVEVSIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9LRVJORUw6CisgICAgICBnX3ZhbHVlX3NldF9ib3hlZCAodmFsdWUsIHNlbGYtPmtlcm5lbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTEFURU5DWToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHNlbGYtPmxhdGVuY3kpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9maXJmaWx0ZXIuaCBiL2dzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiMzQ3NQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmgKQEAgLTAsMCArMSw3MSBAQAorLyogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOSBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqIAorICovCisKKyNpZm5kZWYgX19HU1RfQVVESU9fRklSX0ZJTFRFUl9IX18KKyNkZWZpbmUgX19HU1RfQVVESU9fRklSX0ZJTFRFUl9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9maWx0ZXIuaD4KKworI2luY2x1ZGUgImF1ZGlvZnhiYXNlZmlyZmlsdGVyLmgiCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9BVURJT19GSVJfRklMVEVSIFwKKyAgKGdzdF9hdWRpb19maXJfZmlsdGVyX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9BVURJT19GSVJfRklMVEVSKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVVESU9fRklSX0ZJTFRFUixHc3RBdWRpb0ZJUkZpbHRlcikpCisjZGVmaW5lIEdTVF9BVURJT19GSVJfRklMVEVSX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0FVRElPX0ZJUl9GSUxURVIsR3N0QXVkaW9GSVJGaWx0ZXJDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BVURJT19GSVJfRklMVEVSKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQVVESU9fRklSX0ZJTFRFUikpCisjZGVmaW5lIEdTVF9JU19BVURJT19GSVJfRklMVEVSX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0FVRElPX0ZJUl9GSUxURVIpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9GSVJGaWx0ZXIgR3N0QXVkaW9GSVJGaWx0ZXI7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9GSVJGaWx0ZXJDbGFzcyBHc3RBdWRpb0ZJUkZpbHRlckNsYXNzOworCisvKioKKyAqIEdzdEF1ZGlvRklSRmlsdGVyOgorICoKKyAqIE9wYXF1ZSBkYXRhIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IF9Hc3RBdWRpb0ZJUkZpbHRlciB7CisgIEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyIHBhcmVudDsKKworICBHVmFsdWVBcnJheSAqa2VybmVsOworICBndWludDY0IGxhdGVuY3k7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKyAgR011dGV4IGxvY2s7Cit9OworCitzdHJ1Y3QgX0dzdEF1ZGlvRklSRmlsdGVyQ2xhc3MgeworICBHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlckNsYXNzIHBhcmVudDsKKworICB2b2lkICgqcmF0ZV9jaGFuZ2VkKSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIGdpbnQgcmF0ZSk7Cit9OworCitHVHlwZSBnc3RfYXVkaW9fZmlyX2ZpbHRlcl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9BVURJT19GSVJfRklMVEVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9meC5jIGIvZ3N0L2F1ZGlvZngvYXVkaW9meC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZGRhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb2Z4LmMKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA2IFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJhdWRpb3Bhbm9yYW1hLmgiCisjaW5jbHVkZSAiYXVkaW9pbnZlcnQuaCIKKyNpbmNsdWRlICJhdWRpb2thcmFva2UuaCIKKyNpbmNsdWRlICJhdWRpb2FtcGxpZnkuaCIKKyNpbmNsdWRlICJhdWRpb2R5bmFtaWMuaCIKKyNpbmNsdWRlICJhdWRpb2NoZWJsaW1pdC5oIgorI2luY2x1ZGUgImF1ZGlvY2hlYmJhbmQuaCIKKyNpbmNsdWRlICJhdWRpb2lpcmZpbHRlci5oIgorI2luY2x1ZGUgImF1ZGlvd3NpbmNiYW5kLmgiCisjaW5jbHVkZSAiYXVkaW93c2luY2xpbWl0LmgiCisjaW5jbHVkZSAiYXVkaW9maXJmaWx0ZXIuaCIKKyNpbmNsdWRlICJhdWRpb2VjaG8uaCIKKyNpbmNsdWRlICJnc3RzY2FsZXRlbXBvLmgiCisKKy8qIGVudHJ5IHBvaW50IHRvIGluaXRpYWxpemUgdGhlIHBsdWctaW4KKyAqIGluaXRpYWxpemUgdGhlIHBsdWctaW4gaXRzZWxmCisgKiByZWdpc3RlciB0aGUgZWxlbWVudCBmYWN0b3JpZXMgYW5kIHBhZCB0ZW1wbGF0ZXMKKyAqIHJlZ2lzdGVyIHRoZSBmZWF0dXJlcworICovCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiAoZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImF1ZGlvcGFub3JhbWEiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX0FVRElPX1BBTk9SQU1BKSAmJgorICAgICAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImF1ZGlvaW52ZXJ0IiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9BVURJT19JTlZFUlQpICYmCisgICAgICBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXVkaW9rYXJhb2tlIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9BVURJT19LQVJBT0tFKSAmJgorICAgICAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImF1ZGlvYW1wbGlmeSIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfQVVESU9fQU1QTElGWSkgJiYKKyAgICAgIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJhdWRpb2R5bmFtaWMiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX0FVRElPX0RZTkFNSUMpICYmCisgICAgICBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXVkaW9jaGVibGltaXQiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX0FVRElPX0NIRUJfTElNSVQpICYmCisgICAgICBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXVkaW9jaGViYmFuZCIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfQVVESU9fQ0hFQl9CQU5EKSAmJgorICAgICAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImF1ZGlvaWlyZmlsdGVyIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9BVURJT19JSVJfRklMVEVSKSAmJgorICAgICAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImF1ZGlvd3NpbmNsaW1pdCIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfQVVESU9fV1NJTkNfTElNSVQpICYmCisgICAgICBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXVkaW93c2luY2JhbmQiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX0FVRElPX1dTSU5DX0JBTkQpICYmCisgICAgICBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXVkaW9maXJmaWx0ZXIiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX0FVRElPX0ZJUl9GSUxURVIpICYmCisgICAgICBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXVkaW9lY2hvIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9BVURJT19FQ0hPKSAmJgorICAgICAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInNjYWxldGVtcG8iLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX1NDQUxFVEVNUE8pKTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGF1ZGlvZngsCisgICAgIkF1ZGlvIGVmZmVjdHMgcGx1Z2luIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmMgYi9nc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYWZiMGEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jCkBAIC0wLDAgKzEsMTA4NiBAQAorLyogLSotIGMtYmFzaWMtb2Zmc2V0OiAyIC0qLQorICogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAxIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgIDIwMDYgRHJlYW1sYWIgVGVjaG5vbG9naWVzIEx0ZC4gPG1hdGhpcy5ob2ZlckBkcmVhbWxhYi5uZXQ+CisgKiAgICAgICAgICAgICAgIDIwMDctMjAwOSBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqIAorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlICJhdWRpb2Z4YmFzZWZpcmZpbHRlci5oIgorCisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX2RlYnVnCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChHU1RfQ0FUX0RFRkFVTFQpOworCisjZGVmaW5lIEFMTE9XRURfQ0FQUyBcCisgICAgImF1ZGlvL3gtcmF3LCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBmb3JtYXQ9KHN0cmluZyl7IkdTVF9BVURJT19ORShGMzIpIiwiR1NUX0FVRElPX05FKEY2NCkifSwgIiBcCisgICAgIiByYXRlID0gKGludCkgWyAxLCBNQVggXSwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBjaGFubmVscyA9IChpbnQpIFsgMSwgTUFYIF0sICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBsYXlvdXQ9KHN0cmluZykgaW50ZXJsZWF2ZWQiCisKKy8qIFN3aXRjaCBmcm9tIHRpbWUtZG9tYWluIHRvIEZGVCBjb252b2x1dGlvbiBmb3Iga2VybmVscyA+PSB0aGlzICovCisjZGVmaW5lIEZGVF9USFJFU0hPTEQgMzIKKworZW51bQoreworICBQUk9QXzAgPSAwLAorICBQUk9QX0xPV19MQVRFTkNZLAorICBQUk9QX0RSQUlOX09OX0NIQU5HRVMKK307CisKKyNkZWZpbmUgREVGQVVMVF9MT1dfTEFURU5DWSBGQUxTRQorI2RlZmluZSBERUZBVUxUX0RSQUlOX09OX0NIQU5HRVMgVFJVRQorCisjZGVmaW5lIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXIsIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXIsCisgICAgR1NUX1RZUEVfQVVESU9fRklMVEVSKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl90cmFuc2Zvcm0gKEdzdEJhc2VUcmFuc2Zvcm0gKgorICAgIGJhc2UsIEdzdEJ1ZmZlciAqIGluYnVmLCBHc3RCdWZmZXIgKiBvdXRidWYpOworc3RhdGljIGdib29sZWFuIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc3RhcnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3N0b3AgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3NpbmtfZXZlbnQgKEdzdEJhc2VUcmFuc2Zvcm0gKgorICAgIGJhc2UsIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfdHJhbnNmb3JtX3NpemUgKEdzdEJhc2VUcmFuc2Zvcm0gKgorICAgIGJhc2UsIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdENhcHMgKiBjYXBzLCBnc2l6ZSBzaXplLAorICAgIEdzdENhcHMgKiBvdGhlcmNhcHMsIGdzaXplICogb3RoZXJzaXplKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGJhc2UsCisgICAgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3F1ZXJ5IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0UGFkRGlyZWN0aW9uIGRpcmVjdGlvbiwgR3N0UXVlcnkgKiBxdWVyKTsKKworLyoKKyAqIFRoZSBjb2RlIGJlbG93IGNhbGN1bGF0ZXMgdGhlIGxpbmVhciBjb252b2x1dGlvbjoKKyAqCisgKiB5W3RdID0gXHN1bV97dT0wfV57TS0xfSB4W3QgLSB1XSAqIGhbdV0KKyAqCisgKiB3aGVyZSB5IGlzIHRoZSBvdXRwdXQsIHggaXMgdGhlIGlucHV0LCBNIGlzIHRoZSBsZW5ndGgKKyAqIG9mIHRoZSBmaWx0ZXIga2VybmVsIGFuZCBoIGlzIHRoZSBmaWx0ZXIga2VybmVsLiBGb3IgeAorICogaG9sZHM6IHhbdF0gPT0gMCBcZm9yYWxsIHQgPCAwLgorICoKKyAqIFRoZSBydW50aW1lIGNvbXBsZXhpdHkgb2YgdGhpcyBpcyBPIChNKSBwZXIgc2FtcGxlLgorICoKKyAqLworI2RlZmluZSBERUZJTkVfUFJPQ0VTU19GVU5DKHdpZHRoLGN0eXBlKSBcCitzdGF0aWMgZ3VpbnQgXAorcHJvY2Vzc18jI3dpZHRoIChHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlciAqIHNlbGYsIGNvbnN0IGcjI2N0eXBlICogc3JjLCBnIyNjdHlwZSAqIGRzdCwgZ3VpbnQgaW5wdXRfc2FtcGxlcykgXAoreyBcCisgIGdpbnQgY2hhbm5lbHMgPSBHU1RfQVVESU9fRklMVEVSX0NIQU5ORUxTIChzZWxmKTsgXAorICBUSU1FX0RPTUFJTl9DT05WT0xVVElPTl9CT0RZIChjaGFubmVscyk7IFwKK30KKworI2RlZmluZSBERUZJTkVfUFJPQ0VTU19GVU5DX0ZJWEVEX0NIQU5ORUxTKHdpZHRoLGNoYW5uZWxzLGN0eXBlKSBcCitzdGF0aWMgZ3VpbnQgXAorcHJvY2Vzc18jI2NoYW5uZWxzIyNfIyN3aWR0aCAoR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXIgKiBzZWxmLCBjb25zdCBnIyNjdHlwZSAqIHNyYywgZyMjY3R5cGUgKiBkc3QsIGd1aW50IGlucHV0X3NhbXBsZXMpIFwKK3sgXAorICBUSU1FX0RPTUFJTl9DT05WT0xVVElPTl9CT0RZIChjaGFubmVscyk7IFwKK30KKworI2RlZmluZSBUSU1FX0RPTUFJTl9DT05WT0xVVElPTl9CT0RZKGNoYW5uZWxzKSBHX1NUTVRfU1RBUlQgeyBcCisgIGdpbnQga2VybmVsX2xlbmd0aCA9IHNlbGYtPmtlcm5lbF9sZW5ndGg7IFwKKyAgZ2ludCBpLCBqLCBrLCBsOyBcCisgIGdpbnQgcmVzX3N0YXJ0OyBcCisgIGdpbnQgZnJvbV9pbnB1dDsgXAorICBnaW50IG9mZjsgXAorICBnZG91YmxlICpidWZmZXIgPSBzZWxmLT5idWZmZXI7IFwKKyAgZ2RvdWJsZSAqa2VybmVsID0gc2VsZi0+a2VybmVsOyBcCisgIFwKKyAgaWYgKCFidWZmZXIpIHsgXAorICAgIHNlbGYtPmJ1ZmZlcl9sZW5ndGggPSBrZXJuZWxfbGVuZ3RoICogY2hhbm5lbHM7IFwKKyAgICBzZWxmLT5idWZmZXIgPSBidWZmZXIgPSBnX25ldzAgKGdkb3VibGUsIHNlbGYtPmJ1ZmZlcl9sZW5ndGgpOyBcCisgIH0gXAorICBcCisgIGlucHV0X3NhbXBsZXMgKj0gY2hhbm5lbHM7IFwKKyAgLyogY29udm9sdXRpb24gKi8gXAorICBmb3IgKGkgPSAwOyBpIDwgaW5wdXRfc2FtcGxlczsgaSsrKSB7IFwKKyAgICBkc3RbaV0gPSAwLjA7IFwKKyAgICBrID0gaSAlIGNoYW5uZWxzOyBcCisgICAgbCA9IGkgLyBjaGFubmVsczsgXAorICAgIGZyb21faW5wdXQgPSBNSU4gKGwsIGtlcm5lbF9sZW5ndGgtMSk7IFwKKyAgICBvZmYgPSBsICogY2hhbm5lbHMgKyBrOyBcCisgICAgZm9yIChqID0gMDsgaiA8PSBmcm9tX2lucHV0OyBqKyspIHsgXAorICAgICAgZHN0W2ldICs9IHNyY1tvZmZdICoga2VybmVsW2pdOyBcCisgICAgICBvZmYgLT0gY2hhbm5lbHM7IFwKKyAgICB9IFwKKyAgICAvKiBqID09IGZyb21faW5wdXQgJiYgb2ZmID09IChsIC0gaikgKiBjaGFubmVscyArIGsgKi8gXAorICAgIG9mZiArPSBrZXJuZWxfbGVuZ3RoICogY2hhbm5lbHM7IFwKKyAgICBmb3IgKDsgaiA8IGtlcm5lbF9sZW5ndGg7IGorKykgeyBcCisgICAgICBkc3RbaV0gKz0gYnVmZmVyW29mZl0gKiBrZXJuZWxbal07IFwKKyAgICAgIG9mZiAtPSBjaGFubmVsczsgXAorICAgIH0gXAorICB9IFwKKyAgXAorICAvKiBjb3B5IHRoZSB0YWlsIG9mIHRoZSBjdXJyZW50IGlucHV0IGJ1ZmZlciB0byB0aGUgcmVzaWR1ZSwgd2hpbGUgXAorICAgKiBrZWVwaW5nIHBhcnRzIG9mIHRoZSByZXNpZHVlIGlmIHRoZSBpbnB1dCBidWZmZXIgaXMgc21hbGxlciB0aGFuIFwKKyAgICogdGhlIGtlcm5lbCBsZW5ndGggKi8gXAorICAvKiBmcm9tIG5vdyBvbiB0YWtlIGtlcm5lbCBsZW5ndGggYXMgbGVuZ3RoIG92ZXIgYWxsIGNoYW5uZWxzICovIFwKKyAga2VybmVsX2xlbmd0aCAqPSBjaGFubmVsczsgXAorICBpZiAoaW5wdXRfc2FtcGxlcyA8IGtlcm5lbF9sZW5ndGgpIFwKKyAgICByZXNfc3RhcnQgPSBrZXJuZWxfbGVuZ3RoIC0gaW5wdXRfc2FtcGxlczsgXAorICBlbHNlIFwKKyAgICByZXNfc3RhcnQgPSAwOyBcCisgIFwKKyAgZm9yIChpID0gMDsgaSA8IHJlc19zdGFydDsgaSsrKSBcCisgICAgYnVmZmVyW2ldID0gYnVmZmVyW2kgKyBpbnB1dF9zYW1wbGVzXTsgXAorICAvKiBpID09IHJlc19zdGFydCAqLyBcCisgIGZvciAoOyBpIDwga2VybmVsX2xlbmd0aDsgaSsrKSBcCisgICAgYnVmZmVyW2ldID0gc3JjW2lucHV0X3NhbXBsZXMgLSBrZXJuZWxfbGVuZ3RoICsgaV07IFwKKyAgXAorICBzZWxmLT5idWZmZXJfZmlsbCArPSBrZXJuZWxfbGVuZ3RoIC0gcmVzX3N0YXJ0OyBcCisgIGlmIChzZWxmLT5idWZmZXJfZmlsbCA+IGtlcm5lbF9sZW5ndGgpIFwKKyAgICBzZWxmLT5idWZmZXJfZmlsbCA9IGtlcm5lbF9sZW5ndGg7IFwKKyAgXAorICByZXR1cm4gaW5wdXRfc2FtcGxlcyAvIGNoYW5uZWxzOyBcCit9IEdfU1RNVF9FTkQKKworREVGSU5FX1BST0NFU1NfRlVOQyAoMzIsIGZsb2F0KTsKK0RFRklORV9QUk9DRVNTX0ZVTkMgKDY0LCBkb3VibGUpOworCitERUZJTkVfUFJPQ0VTU19GVU5DX0ZJWEVEX0NIQU5ORUxTICgzMiwgMSwgZmxvYXQpOworREVGSU5FX1BST0NFU1NfRlVOQ19GSVhFRF9DSEFOTkVMUyAoNjQsIDEsIGRvdWJsZSk7CisKK0RFRklORV9QUk9DRVNTX0ZVTkNfRklYRURfQ0hBTk5FTFMgKDMyLCAyLCBmbG9hdCk7CitERUZJTkVfUFJPQ0VTU19GVU5DX0ZJWEVEX0NIQU5ORUxTICg2NCwgMiwgZG91YmxlKTsKKworI3VuZGVmIFRJTUVfRE9NQUlOX0NPTlZPTFVUSU9OX0JPRFkKKyN1bmRlZiBERUZJTkVfUFJPQ0VTU19GVU5DCisjdW5kZWYgREVGSU5FX1BST0NFU1NfRlVOQ19GSVhFRF9DSEFOTkVMUworCisvKiBUaGlzIGltcGxlbWVudHMgRkZUIGNvbnZvbHV0aW9uIGFuZCB1c2VzIHRoZSBvdmVybGFwLXNhdmUgYWxnb3JpdGhtLgorICogU2VlIGh0dHA6Ly9jbngub3JnL2NvbnRlbnQvbTEyMDIyL2xhdGVzdC8gb3IgeW91ciBmYXZvcml0ZQorICogZGlnaXRhbCBzaWduYWwgcHJvY2Vzc2luZyBib29rIGZvciBkZXRhaWxzLgorICoKKyAqIEluIGV2ZXJ5IHBhc3MgdGhlIGZvbGxvd2luZyBpcyBjYWxjdWxhdGVkOgorICoKKyAqIHkgPSBJRkZUIChGRlQoeCkgKiBGRlQoaCkpCisgKgorICogd2hlcmUgeSBpcyB0aGUgb3V0cHV0IGluIHRoZSB0aW1lIGRvbWFpbiwgeCB0aGUKKyAqIGlucHV0IGFuZCBoIHRoZSBmaWx0ZXIga2VybmVsLiAqIGlzIHRoZSBtdWx0aXBsaWNhdGlvbgorICogb2YgY29tcGxleCBudW1iZXJzLgorICoKKyAqIER1ZSB0byB0aGUgY2lyY3VsYXIgY29udm9sdXRpb24gdGhlb3JlbSB0aGlzCisgKiBnaXZlcyBpbiB0aGUgdGltZSBkb21haW46CisgKgorICogeVt0XSA9IFxzdW1fe3U9MH1ee00tMX0geFt0IC0gdV0gKiBoW3VdCisgKgorICogd2hlcmUgeSBpcyB0aGUgb3V0cHV0LCBNIGlzIHRoZSBrZXJuZWwgbGVuZ3RoLAorICogeCB0aGUgcGVyaW9kaWNhbGx5IGV4dGVuZGVkWzBdIGlucHV0IGFuZCBoIHRoZQorICogZmlsdGVyIGtlcm5lbC4KKyAqCisgKiAoWzBdIFBlcmlvZGljYWxseSBleHRlbmRlZCBtZWFuczogICAgKQorICogKCAgICB4W3RdID0geFt0K2tOXSBcZm9yYWxsIGsgXGluIFogICkKKyAqICggICAgd2hlcmUgTiBpcyB0aGUgbGVuZ3RoIG9mIHggICAgICApCisgKgorICogVGhpcyBtZWFuczoKKyAqIC0gT2J2aW91c2x5IHggYW5kIGggbmVlZCB0byBiZSBvZiB0aGUgc2FtZSBzaXplIGZvciB0aGUgRkZUCisgKiAtIFRoZSBmaXJzdCBNLTEgb3V0cHV0IHZhbHVlcyBhcmUgdXNlbGVzcyBiZWNhdXNlIHRoZXkncmUKKyAqICAgYnVpbHQgZnJvbSAxIHVwIHRvIE0tMSB2YWx1ZXMgZnJvbSB0aGUgZW5kIG9mIHRoZSBpbnB1dAorICogICAoY2lyY3VsYXIgY29udm9sdXNpb24hKS4KKyAqIC0gVGhlIGxhc3QgTS0xIGlucHV0IHZhbHVlcyBhcmUgb25seSB1c2VkIGZvciAxIHVwIHRvIE0tMQorICogICBvdXRwdXQgdmFsdWVzLCBpLmUuIHRoZXkgbmVlZCB0byBiZSB1c2VkIGFnYWluIGluIHRoZQorICogICBuZXh0IHBhc3MgZm9yIHRoZSBmaXJzdCBNLTEgaW5wdXQgdmFsdWVzLgorICoKKyAqID0+IFRoZSBmaXJzdCBwYXNzIG5lZWRzIE0tMSB6ZXJvZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAqIGlucHV0IGFuZCB0aGUgbGFzdCBNLTEgaW5wdXQgdmFsdWVzIG9mIGV2ZXJ5IHBhc3MgbmVlZCB0bworICogYmUgdXNlZCBhcyB0aGUgZmlyc3QgTS0xIGlucHV0IHZhbHVlcyBvZiB0aGUgbmV4dCBwYXNzLgorICoKKyAqID0+IHggbXVzdCBiZSBsYXJnZXIgdGhhbiBoIHRvIGdpdmUgYSB1c2VmdWwgbnVtYmVyIG9mIG91dHB1dAorICogc2FtcGxlcyBhbmQgaCBuZWVkcyB0byBiZSBwYWRkZWQgYnkgemVyb2VzIGF0IHRoZSBlbmQgdG8gZ2l2ZQorICogaXQgdmlydHVhbGx5IHRoZSBzYW1lIHNpemUgYXMgeCAoYnkgTSB3ZSBkZW5vdGUgdGhlIG51bWJlciBvZgorICogbm9uLXBhZGRpbmcgc2FtcGxlcyBvZiBoKS4gSWYgbGVuKHgpPT1sZW4oaCk9PU0gb25seSAxIG91dHB1dAorICogc2FtcGxlIHdvdWxkIGJlIGNhbGN1bGF0ZWQgcGVyIHBhc3MsIGxlbih4KT09MipsZW4oaCkgd291bGQKKyAqIGdpdmUgTSsxIG91dHB1dCBzYW1wbGVzLCBldGMuIFVzdWFsbHkgYSBmYWN0b3IgYmV0d2VlbiA0IGFuZCA4CisgKiBnaXZlcyBhIGxvdyBudW1iZXIgb2Ygb3BlcmF0aW9ucyBwZXIgb3V0cHV0IHNhbXBsZXMgKHNlZSB3ZWJzaXRlCisgKiBnaXZlbiBhYm92ZSkuCisgKgorICogT3ZlcmFsbCB0aGlzIGdpdmVzIGEgcnVudGltZSBjb21wbGV4aXR5IHBlciBzYW1wbGUgb2YKKyAqCisgKiAgICggIE4gbG9nIE4gICkKKyAqIE8gKCAtLS0tLS0tLS0gKSBjb21wYXJlZCB0byBPIChNKSBmb3IgdGhlIGRpcmVjdCBjYWxjdWxhdGlvbi4KKyAqICAgKCBOIC0gTSArIDEgKQorICovCisjZGVmaW5lIERFRklORV9GRlRfUFJPQ0VTU19GVU5DKHdpZHRoLGN0eXBlKSBcCitzdGF0aWMgZ3VpbnQgXAorcHJvY2Vzc19mZnRfIyN3aWR0aCAoR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXIgKiBzZWxmLCBjb25zdCBnIyNjdHlwZSAqIHNyYywgXAorICAgIGcjI2N0eXBlICogZHN0LCBndWludCBpbnB1dF9zYW1wbGVzKSBcCit7IFwKKyAgZ2ludCBjaGFubmVscyA9IEdTVF9BVURJT19GSUxURVJfQ0hBTk5FTFMgKHNlbGYpOyBcCisgIEZGVF9DT05WT0xVVElPTl9CT0RZIChjaGFubmVscyk7IFwKK30KKworI2RlZmluZSBERUZJTkVfRkZUX1BST0NFU1NfRlVOQ19GSVhFRF9DSEFOTkVMUyh3aWR0aCxjaGFubmVscyxjdHlwZSkgXAorc3RhdGljIGd1aW50IFwKK3Byb2Nlc3NfZmZ0XyMjY2hhbm5lbHMjI18jI3dpZHRoIChHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlciAqIHNlbGYsIGNvbnN0IGcjI2N0eXBlICogc3JjLCBcCisgICAgZyMjY3R5cGUgKiBkc3QsIGd1aW50IGlucHV0X3NhbXBsZXMpIFwKK3sgXAorICBGRlRfQ09OVk9MVVRJT05fQk9EWSAoY2hhbm5lbHMpOyBcCit9CisKKyNkZWZpbmUgRkZUX0NPTlZPTFVUSU9OX0JPRFkoY2hhbm5lbHMpIEdfU1RNVF9TVEFSVCB7IFwKKyAgZ2ludCBpLCBqOyBcCisgIGd1aW50IHBhc3M7IFwKKyAgZ3VpbnQga2VybmVsX2xlbmd0aCA9IHNlbGYtPmtlcm5lbF9sZW5ndGg7IFwKKyAgZ3VpbnQgYmxvY2tfbGVuZ3RoID0gc2VsZi0+YmxvY2tfbGVuZ3RoOyBcCisgIGd1aW50IGJ1ZmZlcl9sZW5ndGggPSBzZWxmLT5idWZmZXJfbGVuZ3RoOyBcCisgIGd1aW50IHJlYWxfYnVmZmVyX2xlbmd0aCA9IGJ1ZmZlcl9sZW5ndGggKyBrZXJuZWxfbGVuZ3RoIC0gMTsgXAorICBndWludCBidWZmZXJfZmlsbCA9IHNlbGYtPmJ1ZmZlcl9maWxsOyBcCisgIEdzdEZGVEY2NCAqZmZ0ID0gc2VsZi0+ZmZ0OyBcCisgIEdzdEZGVEY2NCAqaWZmdCA9IHNlbGYtPmlmZnQ7IFwKKyAgR3N0RkZURjY0Q29tcGxleCAqZnJlcXVlbmN5X3Jlc3BvbnNlID0gc2VsZi0+ZnJlcXVlbmN5X3Jlc3BvbnNlOyBcCisgIEdzdEZGVEY2NENvbXBsZXggKmZmdF9idWZmZXIgPSBzZWxmLT5mZnRfYnVmZmVyOyBcCisgIGd1aW50IGZyZXF1ZW5jeV9yZXNwb25zZV9sZW5ndGggPSBzZWxmLT5mcmVxdWVuY3lfcmVzcG9uc2VfbGVuZ3RoOyBcCisgIGdkb3VibGUgKmJ1ZmZlciA9IHNlbGYtPmJ1ZmZlcjsgXAorICBndWludCBnZW5lcmF0ZWQgPSAwOyBcCisgIGdkb3VibGUgcmUsIGltOyBcCisgIFwKKyAgaWYgKCFmZnRfYnVmZmVyKSBcCisgICAgc2VsZi0+ZmZ0X2J1ZmZlciA9IGZmdF9idWZmZXIgPSBcCisgICAgICAgIGdfbmV3IChHc3RGRlRGNjRDb21wbGV4LCBmcmVxdWVuY3lfcmVzcG9uc2VfbGVuZ3RoKTsgXAorICBcCisgIC8qIEJ1ZmZlciBjb250YWlucyB0aGUgdGltZSBkb21haW4gc2FtcGxlcyBvZiBpbnB1dCBkYXRhIGZvciBvbmUgY2h1bmsgXAorICAgKiBwbHVzIHNvbWUgbW9yZSBzcGFjZSBmb3IgdGhlIGludmVyc2UgRkZUIGJlbG93LiBcCisgICAqIFwKKyAgICogVGhlIHNhbXBsZXMgYXJlIHB1dCBhdCBvZmZzZXQga2VybmVsX2xlbmd0aCwgdGhlIGludmVyc2UgRkZUIFwKKyAgICogb3ZlcndyaXRlcyBldmVydGhpbmcgZnJvbSBvZmZzZXQgMCB0byBsZW5ndGgta2VybmVsX2xlbmd0aCsxLCBrZWVwaW5nIFwKKyAgICogdGhlIGxhc3Qga2VybmVsX2xlbmd0aC0xIHNhbXBsZXMgZm9yIGNvcHlpbmcgdG8gdGhlIG5leHQgcHJvY2Vzc2luZyBcCisgICAqIHN0ZXAuIFwKKyAgICovIFwKKyAgaWYgKCFidWZmZXIpIHsgXAorICAgIHNlbGYtPmJ1ZmZlcl9sZW5ndGggPSBidWZmZXJfbGVuZ3RoID0gYmxvY2tfbGVuZ3RoOyBcCisgICAgcmVhbF9idWZmZXJfbGVuZ3RoID0gYnVmZmVyX2xlbmd0aCArIGtlcm5lbF9sZW5ndGggLSAxOyBcCisgICAgXAorICAgIHNlbGYtPmJ1ZmZlciA9IGJ1ZmZlciA9IGdfbmV3MCAoZ2RvdWJsZSwgcmVhbF9idWZmZXJfbGVuZ3RoICogY2hhbm5lbHMpOyBcCisgICAgXAorICAgIC8qIEJlZ2lubmluZyBoYXMga2VybmVsX2xlbmd0aC0xIHplcm9lcyBhdCB0aGUgYmVnaW5uaW5nICovIFwKKyAgICBzZWxmLT5idWZmZXJfZmlsbCA9IGJ1ZmZlcl9maWxsID0ga2VybmVsX2xlbmd0aCAtIDE7IFwKKyAgfSBcCisgIFwKKyAgZ19hc3NlcnQgKHNlbGYtPmJ1ZmZlcl9sZW5ndGggPT0gYmxvY2tfbGVuZ3RoKTsgXAorICBcCisgIHdoaWxlIChpbnB1dF9zYW1wbGVzKSB7IFwKKyAgICBwYXNzID0gTUlOIChidWZmZXJfbGVuZ3RoIC0gYnVmZmVyX2ZpbGwsIGlucHV0X3NhbXBsZXMpOyBcCisgICAgXAorICAgIC8qIERlaW50ZXJsZWF2ZSBjaGFubmVscyAqLyBcCisgICAgZm9yIChpID0gMDsgaSA8IHBhc3M7IGkrKykgeyBcCisgICAgICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgeyBcCisgICAgICAgIGJ1ZmZlcltyZWFsX2J1ZmZlcl9sZW5ndGggKiBqICsgYnVmZmVyX2ZpbGwgKyBrZXJuZWxfbGVuZ3RoIC0gMSArIGldID0gXAorICAgICAgICAgICAgc3JjW2kgKiBjaGFubmVscyArIGpdOyBcCisgICAgICB9IFwKKyAgICB9IFwKKyAgICBidWZmZXJfZmlsbCArPSBwYXNzOyBcCisgICAgc3JjICs9IGNoYW5uZWxzICogcGFzczsgXAorICAgIGlucHV0X3NhbXBsZXMgLT0gcGFzczsgXAorICAgIFwKKyAgICAvKiBJZiB3ZSBkb24ndCBoYXZlIGEgY29tcGxldGUgYnVmZmVyIGdvIG91dCAqLyBcCisgICAgaWYgKGJ1ZmZlcl9maWxsIDwgYnVmZmVyX2xlbmd0aCkgXAorICAgICAgYnJlYWs7IFwKKyAgICBcCisgICAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspIHsgXAorICAgICAgLyogQ2FsY3VsYXRlIEZGVCBvZiBpbnB1dCBibG9jayAqLyBcCisgICAgICBnc3RfZmZ0X2Y2NF9mZnQgKGZmdCwgXAorICAgICAgICAgIGJ1ZmZlciArIHJlYWxfYnVmZmVyX2xlbmd0aCAqIGogKyBrZXJuZWxfbGVuZ3RoIC0gMSwgZmZ0X2J1ZmZlcik7IFwKKyAgICAgIFwKKyAgICAgIC8qIENvbXBsZXggbXVsdGlwbGljYXRpb24gb2YgaW5wdXQgYW5kIGZpbHRlciBzcGVjdHJ1bSAqLyBcCisgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJlcXVlbmN5X3Jlc3BvbnNlX2xlbmd0aDsgaSsrKSB7IFwKKwlyZSA9IGZmdF9idWZmZXJbaV0ucjsgXAorCWltID0gZmZ0X2J1ZmZlcltpXS5pOyBcCisgICAgICAgIFwKKyAgICAgICAgZmZ0X2J1ZmZlcltpXS5yID0gXAorICAgICAgICAgICAgcmUgKiBmcmVxdWVuY3lfcmVzcG9uc2VbaV0uciAtIFwKKyAgICAgICAgICAgIGltICogZnJlcXVlbmN5X3Jlc3BvbnNlW2ldLmk7IFwKKyAgICAgICAgZmZ0X2J1ZmZlcltpXS5pID0gXAorICAgICAgICAgICAgcmUgKiBmcmVxdWVuY3lfcmVzcG9uc2VbaV0uaSArIFwKKyAgICAgICAgICAgIGltICogZnJlcXVlbmN5X3Jlc3BvbnNlW2ldLnI7IFwKKyAgICAgIH0gXAorICAgICAgXAorICAgICAgLyogQ2FsY3VsYXRlIGludmVyc2UgRkZUIG9mIHRoZSByZXN1bHQgKi8gXAorICAgICAgZ3N0X2ZmdF9mNjRfaW52ZXJzZV9mZnQgKGlmZnQsIGZmdF9idWZmZXIsIFwKKyAgICAgICAgICBidWZmZXIgKyByZWFsX2J1ZmZlcl9sZW5ndGggKiBqKTsgXAorICAgICAgXAorICAgICAgLyogQ29weSBhbGwgZXhjZXB0IHRoZSBmaXJzdCBrZXJuZWxfbGVuZ3RoLTEgc2FtcGxlcyB0byB0aGUgb3V0cHV0ICovIFwKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBidWZmZXJfbGVuZ3RoIC0ga2VybmVsX2xlbmd0aCArIDE7IGkrKykgeyBcCisgICAgICAgIGRzdFtpICogY2hhbm5lbHMgKyBqXSA9IFwKKyAgICAgICAgICAgIGJ1ZmZlcltyZWFsX2J1ZmZlcl9sZW5ndGggKiBqICsga2VybmVsX2xlbmd0aCAtIDEgKyBpXTsgXAorICAgICAgfSBcCisgICAgICBcCisgICAgICAvKiBDb3B5IHRoZSBsYXN0IGtlcm5lbF9sZW5ndGgtMSBzYW1wbGVzIHRvIHRoZSBiZWdpbm5pbmcgZm9yIHRoZSBuZXh0IGJsb2NrICovIFwKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXJuZWxfbGVuZ3RoIC0gMTsgaSsrKSB7IFwKKyAgICAgICAgYnVmZmVyW3JlYWxfYnVmZmVyX2xlbmd0aCAqIGogKyBrZXJuZWxfbGVuZ3RoIC0gMSArIGldID0gXAorICAgICAgICAgICAgYnVmZmVyW3JlYWxfYnVmZmVyX2xlbmd0aCAqIGogKyBidWZmZXJfbGVuZ3RoICsgaV07IFwKKyAgICAgIH0gXAorICAgIH0gXAorICAgIFwKKyAgICBnZW5lcmF0ZWQgKz0gYnVmZmVyX2xlbmd0aCAtIGtlcm5lbF9sZW5ndGggKyAxOyBcCisgICAgZHN0ICs9IGNoYW5uZWxzICogKGJ1ZmZlcl9sZW5ndGggLSBrZXJuZWxfbGVuZ3RoICsgMSk7IFwKKyAgICBcCisgICAgLyogVGhlIHRoZSBmaXJzdCBrZXJuZWxfbGVuZ3RoLTEgc2FtcGxlcyBhcmUgdGhlcmUgYWxyZWFkeSAqLyBcCisgICAgYnVmZmVyX2ZpbGwgPSBrZXJuZWxfbGVuZ3RoIC0gMTsgXAorICB9IFwKKyAgXAorICAvKiBXcml0ZSBiYWNrIGNhY2hlZCBidWZmZXJfZmlsbCB2YWx1ZSAqLyBcCisgIHNlbGYtPmJ1ZmZlcl9maWxsID0gYnVmZmVyX2ZpbGw7IFwKKyAgXAorICByZXR1cm4gZ2VuZXJhdGVkOyBcCit9IEdfU1RNVF9FTkQKKworREVGSU5FX0ZGVF9QUk9DRVNTX0ZVTkMgKDMyLCBmbG9hdCk7CitERUZJTkVfRkZUX1BST0NFU1NfRlVOQyAoNjQsIGRvdWJsZSk7CisKK0RFRklORV9GRlRfUFJPQ0VTU19GVU5DX0ZJWEVEX0NIQU5ORUxTICgzMiwgMSwgZmxvYXQpOworREVGSU5FX0ZGVF9QUk9DRVNTX0ZVTkNfRklYRURfQ0hBTk5FTFMgKDY0LCAxLCBkb3VibGUpOworCitERUZJTkVfRkZUX1BST0NFU1NfRlVOQ19GSVhFRF9DSEFOTkVMUyAoMzIsIDIsIGZsb2F0KTsKK0RFRklORV9GRlRfUFJPQ0VTU19GVU5DX0ZJWEVEX0NIQU5ORUxTICg2NCwgMiwgZG91YmxlKTsKKworI3VuZGVmIEZGVF9DT05WT0xVVElPTl9CT0RZCisjdW5kZWYgREVGSU5FX0ZGVF9QUk9DRVNTX0ZVTkMKKyN1bmRlZiBERUZJTkVfRkZUX1BST0NFU1NfRlVOQ19GSVhFRF9DSEFOTkVMUworCisvKiBFbGVtZW50IGNsYXNzICovCitzdGF0aWMgdm9pZAorICAgIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfY2FsY3VsYXRlX2ZyZXF1ZW5jeV9yZXNwb25zZQorICAgIChHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlciAqIHNlbGYpCit7CisgIGdzdF9mZnRfZjY0X2ZyZWUgKHNlbGYtPmZmdCk7CisgIHNlbGYtPmZmdCA9IE5VTEw7CisgIGdzdF9mZnRfZjY0X2ZyZWUgKHNlbGYtPmlmZnQpOworICBzZWxmLT5pZmZ0ID0gTlVMTDsKKyAgZ19mcmVlIChzZWxmLT5mcmVxdWVuY3lfcmVzcG9uc2UpOworICBzZWxmLT5mcmVxdWVuY3lfcmVzcG9uc2VfbGVuZ3RoID0gMDsKKyAgZ19mcmVlIChzZWxmLT5mZnRfYnVmZmVyKTsKKyAgc2VsZi0+ZmZ0X2J1ZmZlciA9IE5VTEw7CisKKyAgaWYgKHNlbGYtPmtlcm5lbCAmJiBzZWxmLT5rZXJuZWxfbGVuZ3RoID49IEZGVF9USFJFU0hPTEQKKyAgICAgICYmICFzZWxmLT5sb3dfbGF0ZW5jeSkgeworICAgIGd1aW50IGJsb2NrX2xlbmd0aCwgaTsKKyAgICBnZG91YmxlICprZXJuZWxfdG1wLCAqa2VybmVsID0gc2VsZi0+a2VybmVsOworCisgICAgLyogV2UgcHJvY2VzcyA0ICoga2VybmVsX2xlbmd0aCBzYW1wbGVzIHBlciBwYXNzIGluIEZGVCBtb2RlICovCisgICAgYmxvY2tfbGVuZ3RoID0gNCAqIHNlbGYtPmtlcm5lbF9sZW5ndGg7CisgICAgYmxvY2tfbGVuZ3RoID0gZ3N0X2ZmdF9uZXh0X2Zhc3RfbGVuZ3RoIChibG9ja19sZW5ndGgpOworICAgIHNlbGYtPmJsb2NrX2xlbmd0aCA9IGJsb2NrX2xlbmd0aDsKKworICAgIGtlcm5lbF90bXAgPSBnX25ldzAgKGdkb3VibGUsIGJsb2NrX2xlbmd0aCk7CisgICAgbWVtY3B5IChrZXJuZWxfdG1wLCBrZXJuZWwsIHNlbGYtPmtlcm5lbF9sZW5ndGggKiBzaXplb2YgKGdkb3VibGUpKTsKKworICAgIHNlbGYtPmZmdCA9IGdzdF9mZnRfZjY0X25ldyAoYmxvY2tfbGVuZ3RoLCBGQUxTRSk7CisgICAgc2VsZi0+aWZmdCA9IGdzdF9mZnRfZjY0X25ldyAoYmxvY2tfbGVuZ3RoLCBUUlVFKTsKKyAgICBzZWxmLT5mcmVxdWVuY3lfcmVzcG9uc2VfbGVuZ3RoID0gYmxvY2tfbGVuZ3RoIC8gMiArIDE7CisgICAgc2VsZi0+ZnJlcXVlbmN5X3Jlc3BvbnNlID0KKyAgICAgICAgZ19uZXcgKEdzdEZGVEY2NENvbXBsZXgsIHNlbGYtPmZyZXF1ZW5jeV9yZXNwb25zZV9sZW5ndGgpOworICAgIGdzdF9mZnRfZjY0X2ZmdCAoc2VsZi0+ZmZ0LCBrZXJuZWxfdG1wLCBzZWxmLT5mcmVxdWVuY3lfcmVzcG9uc2UpOworICAgIGdfZnJlZSAoa2VybmVsX3RtcCk7CisKKyAgICAvKiBOb3JtYWxpemUgdG8gbWFrZSBzdXJlIElGRlQoRkZUKHgpKSA9PSB4ICovCisgICAgZm9yIChpID0gMDsgaSA8IHNlbGYtPmZyZXF1ZW5jeV9yZXNwb25zZV9sZW5ndGg7IGkrKykgeworICAgICAgc2VsZi0+ZnJlcXVlbmN5X3Jlc3BvbnNlW2ldLnIgLz0gYmxvY2tfbGVuZ3RoOworICAgICAgc2VsZi0+ZnJlcXVlbmN5X3Jlc3BvbnNlW2ldLmkgLz0gYmxvY2tfbGVuZ3RoOworICAgIH0KKyAgfQorfQorCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGJhc2UgdHJhbnNmb3JtIGxvY2shICovCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9zZWxlY3RfcHJvY2Vzc19mdW5jdGlvbiAoR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXIgKgorICAgIHNlbGYsIEdzdEF1ZGlvRm9ybWF0IGZvcm1hdCwgZ2ludCBjaGFubmVscykKK3sKKyAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfRjMyOgorICAgICAgaWYgKHNlbGYtPmZmdCAmJiAhc2VsZi0+bG93X2xhdGVuY3kpIHsKKyAgICAgICAgaWYgKGNoYW5uZWxzID09IDEpCisgICAgICAgICAgc2VsZi0+cHJvY2VzcyA9IChHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlclByb2Nlc3NGdW5jKSBwcm9jZXNzX2ZmdF8xXzMyOworICAgICAgICBlbHNlIGlmIChjaGFubmVscyA9PSAyKQorICAgICAgICAgIHNlbGYtPnByb2Nlc3MgPSAoR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXJQcm9jZXNzRnVuYykgcHJvY2Vzc19mZnRfMl8zMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNlbGYtPnByb2Nlc3MgPSAoR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXJQcm9jZXNzRnVuYykgcHJvY2Vzc19mZnRfMzI7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoY2hhbm5lbHMgPT0gMSkKKyAgICAgICAgICBzZWxmLT5wcm9jZXNzID0gKEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyUHJvY2Vzc0Z1bmMpIHByb2Nlc3NfMV8zMjsKKyAgICAgICAgZWxzZSBpZiAoY2hhbm5lbHMgPT0gMikKKyAgICAgICAgICBzZWxmLT5wcm9jZXNzID0gKEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyUHJvY2Vzc0Z1bmMpIHByb2Nlc3NfMl8zMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNlbGYtPnByb2Nlc3MgPSAoR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXJQcm9jZXNzRnVuYykgcHJvY2Vzc18zMjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GNjQ6CisgICAgICBpZiAoc2VsZi0+ZmZ0ICYmICFzZWxmLT5sb3dfbGF0ZW5jeSkgeworICAgICAgICBpZiAoY2hhbm5lbHMgPT0gMSkKKyAgICAgICAgICBzZWxmLT5wcm9jZXNzID0gKEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyUHJvY2Vzc0Z1bmMpIHByb2Nlc3NfZmZ0XzFfNjQ7CisgICAgICAgIGVsc2UgaWYgKGNoYW5uZWxzID09IDIpCisgICAgICAgICAgc2VsZi0+cHJvY2VzcyA9IChHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlclByb2Nlc3NGdW5jKSBwcm9jZXNzX2ZmdF8yXzY0OworICAgICAgICBlbHNlCisgICAgICAgICAgc2VsZi0+cHJvY2VzcyA9IChHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlclByb2Nlc3NGdW5jKSBwcm9jZXNzX2ZmdF82NDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjaGFubmVscyA9PSAxKQorICAgICAgICAgIHNlbGYtPnByb2Nlc3MgPSAoR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXJQcm9jZXNzRnVuYykgcHJvY2Vzc18xXzY0OworICAgICAgICBlbHNlIGlmIChjaGFubmVscyA9PSAyKQorICAgICAgICAgIHNlbGYtPnByb2Nlc3MgPSAoR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXJQcm9jZXNzRnVuYykgcHJvY2Vzc18yXzY0OworICAgICAgICBlbHNlCisgICAgICAgICAgc2VsZi0+cHJvY2VzcyA9IChHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlclByb2Nlc3NGdW5jKSBwcm9jZXNzXzY0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHNlbGYtPnByb2Nlc3MgPSBOVUxMOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyICpzZWxmID0gR1NUX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUiAob2JqZWN0KTsKKworICBnX2ZyZWUgKHNlbGYtPmJ1ZmZlcik7CisgIGdfZnJlZSAoc2VsZi0+a2VybmVsKTsKKyAgZ3N0X2ZmdF9mNjRfZnJlZSAoc2VsZi0+ZmZ0KTsKKyAgZ3N0X2ZmdF9mNjRfZnJlZSAoc2VsZi0+aWZmdCk7CisgIGdfZnJlZSAoc2VsZi0+ZnJlcXVlbmN5X3Jlc3BvbnNlKTsKKyAgZ19mcmVlIChzZWxmLT5mZnRfYnVmZmVyKTsKKyAgZ19tdXRleF9jbGVhciAoJnNlbGYtPmxvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyICpzZWxmID0gR1NUX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTE9XX0xBVEVOQ1k6eworICAgICAgZ2Jvb2xlYW4gbG93X2xhdGVuY3k7CisKKyAgICAgIGlmIChHU1RfU1RBVEUgKHNlbGYpID49IEdTVF9TVEFURV9QQVVTRUQpIHsKKyAgICAgICAgZ193YXJuaW5nICgiQ2hhbmdpbmcgdGhlIFwibG93LWxhdGVuY3lcIiBwcm9wZXJ0eSAiCisgICAgICAgICAgICAiaXMgb25seSBhbGxvd2VkIGluIHN0YXRlcyA8IFBBVVNFRCIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKworICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBsb3dfbGF0ZW5jeSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKworICAgICAgaWYgKHNlbGYtPmxvd19sYXRlbmN5ICE9IGxvd19sYXRlbmN5KSB7CisgICAgICAgIHNlbGYtPmxvd19sYXRlbmN5ID0gbG93X2xhdGVuY3k7CisgICAgICAgIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfY2FsY3VsYXRlX2ZyZXF1ZW5jeV9yZXNwb25zZSAoc2VsZik7CisgICAgICAgIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc2VsZWN0X3Byb2Nlc3NfZnVuY3Rpb24gKHNlbGYsCisgICAgICAgICAgICBHU1RfQVVESU9fRklMVEVSX0ZPUk1BVCAoc2VsZiksIEdTVF9BVURJT19GSUxURVJfQ0hBTk5FTFMgKHNlbGYpKTsKKyAgICAgIH0KKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0RSQUlOX09OX0NIQU5HRVM6eworICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBzZWxmLT5kcmFpbl9vbl9jaGFuZ2VzID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlciAqc2VsZiA9IEdTVF9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xPV19MQVRFTkNZOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNlbGYtPmxvd19sYXRlbmN5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9EUkFJTl9PTl9DSEFOR0VTOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNlbGYtPmRyYWluX29uX2NoYW5nZXMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9jbGFzc19pbml0IChHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlckNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqdHJhbnNfY2xhc3MgPSAoR3N0QmFzZVRyYW5zZm9ybUNsYXNzICopIGtsYXNzOworICBHc3RBdWRpb0ZpbHRlckNsYXNzICpmaWx0ZXJfY2xhc3MgPSAoR3N0QXVkaW9GaWx0ZXJDbGFzcyAqKSBrbGFzczsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9kZWJ1ZywKKyAgICAgICJhdWRpb2Z4YmFzZWZpcmZpbHRlciIsIDAsICJGSVIgZmlsdGVyIGJhc2UgY2xhc3MiKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX2dldF9wcm9wZXJ0eTsKKworICAvKioKKyAgICogR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXI6bG93LWxhdGVuY3k6CisgICAqCisgICAqIFdvcmsgaW4gbG93LWxhdGVuY3kgbW9kZS4gVGhpcyBtb2RlIGlzIG11Y2ggc2xvd2VyIGZvciBsYXJnZSBmaWx0ZXIgc2l6ZXMKKyAgICogYnV0IHRoZSBsYXRlbmN5IGlzIGFsd2F5cyBvbmx5IHRoZSBwcmUtbGF0ZW5jeSBvZiB0aGUgZmlsdGVyLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9MT1dfTEFURU5DWSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgibG93LWxhdGVuY3kiLCAiTG93IGxhdGVuY3kiLAorICAgICAgICAgICJPcGVyYXRlIGluIGxvdyBsYXRlbmN5IG1vZGUuIFRoaXMgbW9kZSBpcyBzbG93ZXIgYnV0IHRoZSAiCisgICAgICAgICAgImxhdGVuY3kgd2lsbCBvbmx5IGJlIHRoZSBmaWx0ZXIgcHJlLWxhdGVuY3kuICIKKyAgICAgICAgICAiQ2FuIG9ubHkgYmUgY2hhbmdlZCBpbiBzdGF0ZXMgPCBQQVVTRUQhIiwgREVGQVVMVF9MT1dfTEFURU5DWSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXI6ZHJhaW4tb24tY2hhbmdlczoKKyAgICoKKyAgICogV2hldGhlciB0aGUgZmlsdGVyIHNob3VsZCBiZSBkcmFpbmVkIHdoZW4gaXRzIGNvZWZpY2llbnRzIGNoYW5nZQorICAgKgorICAgKiBOb3RlOiBDdXJyZW50bHkgdGhpcyBvbmx5IHdvcmtzIGlmIHRoZSBrZXJuZWwgc2l6ZSBpcyBub3QgY2hhbmdlZCEKKyAgICogU3VwcG9ydCBmb3IgZHJhaW5sZXNzIGtlcm5lbCBzaXplIGNoYW5nZXMgd2lsbCBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9EUkFJTl9PTl9DSEFOR0VTLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJkcmFpbi1vbi1jaGFuZ2VzIiwgIkRyYWluIG9uIGNoYW5nZXMiLAorICAgICAgICAgICJEcmFpbnMgdGhlIGZpbHRlciB3aGVuIGl0cyBjb2VmaWNpZW50cyBjaGFuZ2UiLAorICAgICAgICAgIERFRkFVTFRfRFJBSU5fT05fQ0hBTkdFUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFMTE9XRURfQ0FQUyk7CisgIGdzdF9hdWRpb19maWx0ZXJfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZXMgKEdTVF9BVURJT19GSUxURVJfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgdHJhbnNfY2xhc3MtPnRyYW5zZm9ybSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl90cmFuc2Zvcm0pOworICB0cmFuc19jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9zdGFydCk7CisgIHRyYW5zX2NsYXNzLT5zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc3RvcCk7CisgIHRyYW5zX2NsYXNzLT5zaW5rX2V2ZW50ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3NpbmtfZXZlbnQpOworICB0cmFuc19jbGFzcy0+cXVlcnkgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9xdWVyeSk7CisgIHRyYW5zX2NsYXNzLT50cmFuc2Zvcm1fc2l6ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl90cmFuc2Zvcm1fc2l6ZSk7CisgIGZpbHRlcl9jbGFzcy0+c2V0dXAgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9zZXR1cCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX2luaXQgKEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyICogc2VsZikKK3sKKyAgc2VsZi0+a2VybmVsID0gTlVMTDsKKyAgc2VsZi0+YnVmZmVyID0gTlVMTDsKKyAgc2VsZi0+YnVmZmVyX2xlbmd0aCA9IDA7CisKKyAgc2VsZi0+c3RhcnRfdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBzZWxmLT5zdGFydF9vZmYgPSBHU1RfQlVGRkVSX09GRlNFVF9OT05FOworICBzZWxmLT5uc2FtcGxlc19vdXQgPSAwOworICBzZWxmLT5uc2FtcGxlc19pbiA9IDA7CisKKyAgc2VsZi0+bG93X2xhdGVuY3kgPSBERUZBVUxUX0xPV19MQVRFTkNZOworICBzZWxmLT5kcmFpbl9vbl9jaGFuZ2VzID0gREVGQVVMVF9EUkFJTl9PTl9DSEFOR0VTOworCisgIGdfbXV0ZXhfaW5pdCAoJnNlbGYtPmxvY2spOworfQorCit2b2lkCitnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3B1c2hfcmVzaWR1ZSAoR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXIgKiBzZWxmKQoreworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0Rmxvd1JldHVybiByZXM7CisgIGdpbnQgcmF0ZSA9IEdTVF9BVURJT19GSUxURVJfUkFURSAoc2VsZik7CisgIGdpbnQgY2hhbm5lbHMgPSBHU1RfQVVESU9fRklMVEVSX0NIQU5ORUxTIChzZWxmKTsKKyAgZ2ludCBicHMgPSBHU1RfQVVESU9fRklMVEVSX0JQUyAoc2VsZik7CisgIGdpbnQgb3V0c2l6ZSwgb3V0c2FtcGxlczsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqaW4sICpvdXQ7CisKKyAgaWYgKGNoYW5uZWxzID09IDAgfHwgcmF0ZSA9PSAwIHx8IHNlbGYtPm5zYW1wbGVzX2luID09IDApIHsKKyAgICBzZWxmLT5idWZmZXJfZmlsbCA9IDA7CisgICAgZ19mcmVlIChzZWxmLT5idWZmZXIpOworICAgIHNlbGYtPmJ1ZmZlciA9IE5VTEw7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBhbmQgdGhlaXIgbWVtb3J5IHNpemUgdGhhdAorICAgKiBzaG91bGQgYmUgcHVzaGVkIGZyb20gdGhlIHJlc2lkdWUgKi8KKyAgb3V0c2FtcGxlcyA9IHNlbGYtPm5zYW1wbGVzX2luIC0gKHNlbGYtPm5zYW1wbGVzX291dCAtIHNlbGYtPmxhdGVuY3kpOworICBpZiAob3V0c2FtcGxlcyA8PSAwKSB7CisgICAgc2VsZi0+YnVmZmVyX2ZpbGwgPSAwOworICAgIGdfZnJlZSAoc2VsZi0+YnVmZmVyKTsKKyAgICBzZWxmLT5idWZmZXIgPSBOVUxMOworICAgIHJldHVybjsKKyAgfQorICBvdXRzaXplID0gb3V0c2FtcGxlcyAqIGNoYW5uZWxzICogYnBzOworCisgIGlmICghc2VsZi0+ZmZ0IHx8IHNlbGYtPmxvd19sYXRlbmN5KSB7CisgICAgZ2ludDY0IGRpZmZzaXplLCBkaWZmc2FtcGxlczsKKworICAgIC8qIFByb2Nlc3MgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBsYXRlbmN5IGFuZCByZXNpZHVlIGxlbmd0aCBzYW1wbGVzCisgICAgICogdG8gc3RhcnQgYXQgdGhlIGFjdHVhbCBkYXRhIGluc3RlYWQgb2Ygc3RhcnRpbmcgYXQgdGhlIHplcm9zIGJlZm9yZQorICAgICAqIHdoZW4gd2Ugb25seSBnb3Qgb25lIGJ1ZmZlciBzbWFsbGVyIHRoYW4gbGF0ZW5jeSAqLworICAgIGRpZmZzYW1wbGVzID0KKyAgICAgICAgKChnaW50NjQpIHNlbGYtPmxhdGVuY3kpIC0gKChnaW50NjQpIHNlbGYtPmJ1ZmZlcl9maWxsKSAvIGNoYW5uZWxzOworICAgIGlmIChkaWZmc2FtcGxlcyA+IDApIHsKKyAgICAgIGRpZmZzaXplID0gZGlmZnNhbXBsZXMgKiBjaGFubmVscyAqIGJwczsKKyAgICAgIGluID0gZ19uZXcwIChndWludDgsIGRpZmZzaXplKTsKKyAgICAgIG91dCA9IGdfbmV3MCAoZ3VpbnQ4LCBkaWZmc2l6ZSk7CisgICAgICBzZWxmLT5uc2FtcGxlc19vdXQgKz0gc2VsZi0+cHJvY2VzcyAoc2VsZiwgaW4sIG91dCwgZGlmZnNhbXBsZXMpOworICAgICAgZ19mcmVlIChpbik7CisgICAgICBnX2ZyZWUgKG91dCk7CisgICAgfQorCisgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChvdXRzaXplKTsKKworICAgIC8qIENvbnZvbHZlIHRoZSByZXNpZHVlIHdpdGggemVyb3MgdG8gZ2V0IHRoZSBhY3R1YWwgcmVtYWluaW5nIGRhdGEgKi8KKyAgICBpbiA9IGdfbmV3MCAoZ3VpbnQ4LCBvdXRzaXplKTsKKyAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmbWFwLCBHU1RfTUFQX1JFQURXUklURSk7CisgICAgc2VsZi0+bnNhbXBsZXNfb3V0ICs9IHNlbGYtPnByb2Nlc3MgKHNlbGYsIGluLCBtYXAuZGF0YSwgb3V0c2FtcGxlcyk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICAgIGdfZnJlZSAoaW4pOworICB9IGVsc2UgeworICAgIGd1aW50IGdlbnNhbXBsZXMgPSAwOworCisgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChvdXRzaXplKTsKKyAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmbWFwLCBHU1RfTUFQX1JFQURXUklURSk7CisKKyAgICB3aGlsZSAoZ2Vuc2FtcGxlcyA8IG91dHNhbXBsZXMpIHsKKyAgICAgIGd1aW50IHN0ZXBfaW5zYW1wbGVzID0gc2VsZi0+YmxvY2tfbGVuZ3RoIC0gc2VsZi0+YnVmZmVyX2ZpbGw7CisgICAgICBndWludDggKnplcm9lcyA9IGdfbmV3MCAoZ3VpbnQ4LCBzdGVwX2luc2FtcGxlcyAqIGNoYW5uZWxzICogYnBzKTsKKyAgICAgIGd1aW50OCAqb3V0ID0gZ19uZXcgKGd1aW50OCwgc2VsZi0+YmxvY2tfbGVuZ3RoICogY2hhbm5lbHMgKiBicHMpOworICAgICAgZ3VpbnQgc3RlcF9nZW5zYW1wbGVzOworCisgICAgICBzdGVwX2dlbnNhbXBsZXMgPSBzZWxmLT5wcm9jZXNzIChzZWxmLCB6ZXJvZXMsIG91dCwgc3RlcF9pbnNhbXBsZXMpOworICAgICAgZ19mcmVlICh6ZXJvZXMpOworCisgICAgICBtZW1jcHkgKG1hcC5kYXRhICsgZ2Vuc2FtcGxlcyAqIGJwcywgb3V0LCBNSU4gKHN0ZXBfZ2Vuc2FtcGxlcywKKyAgICAgICAgICAgICAgb3V0c2FtcGxlcyAtIGdlbnNhbXBsZXMpICogYnBzKTsKKyAgICAgIGdlbnNhbXBsZXMgKz0gTUlOIChzdGVwX2dlbnNhbXBsZXMsIG91dHNhbXBsZXMgLSBnZW5zYW1wbGVzKTsKKworICAgICAgZ19mcmVlIChvdXQpOworICAgIH0KKyAgICBzZWxmLT5uc2FtcGxlc19vdXQgKz0gZ2Vuc2FtcGxlczsKKworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm1hcCk7CisgIH0KKworICAvKiBTZXQgdGltZXN0YW1wLCBvZmZzZXQsIGV0YyBmcm9tIHRoZSB2YWx1ZXMgd2UKKyAgICogc2F2ZWQgd2hlbiBwcm9jZXNzaW5nIHRoZSByZWd1bGFyIGJ1ZmZlcnMgKi8KKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzZWxmLT5zdGFydF90cykpCisgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgPSBzZWxmLT5zdGFydF90czsKKyAgZWxzZQorICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpID0gMDsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgKz0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHNlbGYtPm5zYW1wbGVzX291dCAtIG91dHNhbXBsZXMgLQorICAgICAgc2VsZi0+bGF0ZW5jeSwgR1NUX1NFQ09ORCwgcmF0ZSk7CisKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9CisgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChvdXRzYW1wbGVzLCBHU1RfU0VDT05ELCByYXRlKTsKKworICBpZiAoc2VsZi0+c3RhcnRfb2ZmICE9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkUpIHsKKyAgICBHU1RfQlVGRkVSX09GRlNFVCAob3V0YnVmKSA9CisgICAgICAgIHNlbGYtPnN0YXJ0X29mZiArIHNlbGYtPm5zYW1wbGVzX291dCAtIG91dHNhbXBsZXMgLSBzZWxmLT5sYXRlbmN5OworICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAob3V0YnVmKSA9IEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpICsgb3V0c2FtcGxlczsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAiUHVzaGluZyByZXNpZHVlIGJ1ZmZlciBvZiBzaXplICUiIEdfR1NJWkVfRk9STUFUICIgd2l0aCB0aW1lc3RhbXA6ICUiCisgICAgICBHU1RfVElNRV9GT1JNQVQgIiwgZHVyYXRpb246ICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBvZmZzZXQ6ICUiCisgICAgICBHX0dVSU5UNjRfRk9STUFUICIsIG9mZnNldF9lbmQ6ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgbnNhbXBsZXNfb3V0OiAlZCIsCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWYpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSksIEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpLAorICAgICAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChvdXRidWYpLCBvdXRzYW1wbGVzKTsKKworICByZXMgPSBnc3RfcGFkX3B1c2ggKEdTVF9CQVNFX1RSQU5TRk9STV9DQVNUIChzZWxmKS0+c3JjcGFkLCBvdXRidWYpOworCisgIGlmIChHX1VOTElLRUxZIChyZXMgIT0gR1NUX0ZMT1dfT0spKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzZWxmLCAiZmFpbGVkIHRvIHB1c2ggcmVzaWR1ZSIpOworICB9CisKKyAgc2VsZi0+YnVmZmVyX2ZpbGwgPSAwOworfQorCisvKiBHc3RBdWRpb0ZpbHRlciB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCisvKiBnZXQgbm90aWZpZWQgb2YgY2FwcyBhbmQgcGx1ZyBpbiB0aGUgY29ycmVjdCBwcm9jZXNzIGZ1bmN0aW9uICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc2V0dXAgKEdzdEF1ZGlvRmlsdGVyICogYmFzZSwKKyAgICBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKQoreworICBHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlciAqc2VsZiA9IEdTVF9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIgKGJhc2UpOworCisgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICBpZiAoc2VsZi0+YnVmZmVyKSB7CisgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9wdXNoX3Jlc2lkdWUgKHNlbGYpOworICAgIGdfZnJlZSAoc2VsZi0+YnVmZmVyKTsKKyAgICBzZWxmLT5idWZmZXIgPSBOVUxMOworICAgIHNlbGYtPmJ1ZmZlcl9maWxsID0gMDsKKyAgICBzZWxmLT5idWZmZXJfbGVuZ3RoID0gMDsKKyAgICBzZWxmLT5zdGFydF90cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgc2VsZi0+c3RhcnRfb2ZmID0gR1NUX0JVRkZFUl9PRkZTRVRfTk9ORTsKKyAgICBzZWxmLT5uc2FtcGxlc19vdXQgPSAwOworICAgIHNlbGYtPm5zYW1wbGVzX2luID0gMDsKKyAgfQorCisgIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc2VsZWN0X3Byb2Nlc3NfZnVuY3Rpb24gKHNlbGYsCisgICAgICBHU1RfQVVESU9fSU5GT19GT1JNQVQgKGluZm8pLCBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoaW5mbykpOworICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworCisgIHJldHVybiAoc2VsZi0+cHJvY2VzcyAhPSBOVUxMKTsKK30KKworLyogR3N0QmFzZVRyYW5zZm9ybSB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfdHJhbnNmb3JtX3NpemUgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLAorICAgIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdENhcHMgKiBjYXBzLCBnc2l6ZSBzaXplLCBHc3RDYXBzICogb3RoZXJjYXBzLAorICAgIGdzaXplICogb3RoZXJzaXplKQoreworICBHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlciAqc2VsZiA9IEdTVF9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIgKGJhc2UpOworICBndWludCBibG9ja2xlbjsKKyAgR3N0QXVkaW9JbmZvIGluZm87CisgIGdpbnQgYnBmOworCisgIGlmICghc2VsZi0+ZmZ0IHx8IHNlbGYtPmxvd19sYXRlbmN5IHx8IGRpcmVjdGlvbiA9PSBHU1RfUEFEX1NSQykgeworICAgICpvdGhlcnNpemUgPSBzaXplOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgaWYgKCFnc3RfYXVkaW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBjYXBzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgYnBmID0gR1NUX0FVRElPX0lORk9fQlBGICgmaW5mbyk7CisKKyAgc2l6ZSAvPSBicGY7CisgIGJsb2NrbGVuID0gc2VsZi0+YmxvY2tfbGVuZ3RoIC0gc2VsZi0+a2VybmVsX2xlbmd0aCArIDE7CisgICpvdGhlcnNpemUgPSAoKHNpemUgKyBibG9ja2xlbiAtIDEpIC8gYmxvY2tsZW4pICogYmxvY2tsZW47CisgICpvdGhlcnNpemUgKj0gYnBmOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl90cmFuc2Zvcm0gKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLAorICAgIEdzdEJ1ZmZlciAqIGluYnVmLCBHc3RCdWZmZXIgKiBvdXRidWYpCit7CisgIEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyICpzZWxmID0gR1NUX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUiAoYmFzZSk7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIGV4cGVjdGVkX3RpbWVzdGFtcDsKKyAgZ2ludCBjaGFubmVscyA9IEdTVF9BVURJT19GSUxURVJfQ0hBTk5FTFMgKHNlbGYpOworICBnaW50IHJhdGUgPSBHU1RfQVVESU9fRklMVEVSX1JBVEUgKHNlbGYpOworICBnaW50IGJwcyA9IEdTVF9BVURJT19GSUxURVJfQlBTIChzZWxmKTsKKyAgR3N0TWFwSW5mbyBpbm1hcCwgb3V0bWFwOworICBndWludCBpbnB1dF9zYW1wbGVzOworICBndWludCBvdXRwdXRfc2FtcGxlczsKKyAgZ3VpbnQgZ2VuZXJhdGVkX3NhbXBsZXM7CisgIGd1aW50NjQgb3V0cHV0X29mZnNldDsKKyAgZ2ludDY0IGRpZmYgPSAwOworICBHc3RDbG9ja1RpbWUgc3RyZWFtX3RpbWU7CisKKyAgdGltZXN0YW1wID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1Zik7CisKKyAgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAodGltZXN0YW1wKQorICAgICAgJiYgIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzZWxmLT5zdGFydF90cykpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiSW52YWxpZCB0aW1lc3RhbXAiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KKworICBnX211dGV4X2xvY2sgKCZzZWxmLT5sb2NrKTsKKyAgc3RyZWFtX3RpbWUgPQorICAgICAgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZiYXNlLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsIHRpbWVzdGFtcCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgInN5bmMgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSk7CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdHJlYW1fdGltZSkpCisgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoc2VsZiksIHN0cmVhbV90aW1lKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc2VsZi0+a2VybmVsICE9IE5VTEwsIEdTVF9GTE9XX0VSUk9SKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNoYW5uZWxzICE9IDAsIEdTVF9GTE9XX0VSUk9SKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHNlbGYtPnN0YXJ0X3RzKSkKKyAgICBleHBlY3RlZF90aW1lc3RhbXAgPQorICAgICAgICBzZWxmLT5zdGFydF90cyArIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHNlbGYtPm5zYW1wbGVzX2luLAorICAgICAgICBHU1RfU0VDT05ELCByYXRlKTsKKyAgZWxzZQorICAgIGV4cGVjdGVkX3RpbWVzdGFtcCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisKKyAgLyogUmVzZXQgdGhlIHJlc2lkdWUgaWYgYWxyZWFkeSBleGlzdGluZyBvbiBkaXNjb250IGJ1ZmZlcnMgKi8KKyAgaWYgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAoaW5idWYpCisgICAgICB8fCAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGV4cGVjdGVkX3RpbWVzdGFtcCkKKyAgICAgICAgICAmJiAoQUJTIChHU1RfQ0xPQ0tfRElGRiAodGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3RpbWVzdGFtcCkpID4gNSAqIEdTVF9NU0VDT05EKSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiRGlzY29udGludWl0eSBkZXRlY3RlZCAtIGZsdXNoaW5nIik7CisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChleHBlY3RlZF90aW1lc3RhbXApKQorICAgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9wdXNoX3Jlc2lkdWUgKHNlbGYpOworICAgIHNlbGYtPmJ1ZmZlcl9maWxsID0gMDsKKyAgICBnX2ZyZWUgKHNlbGYtPmJ1ZmZlcik7CisgICAgc2VsZi0+YnVmZmVyID0gTlVMTDsKKyAgICBzZWxmLT5zdGFydF90cyA9IHRpbWVzdGFtcDsKKyAgICBzZWxmLT5zdGFydF9vZmYgPSBHU1RfQlVGRkVSX09GRlNFVCAoaW5idWYpOworICAgIHNlbGYtPm5zYW1wbGVzX291dCA9IDA7CisgICAgc2VsZi0+bnNhbXBsZXNfaW4gPSAwOworICB9IGVsc2UgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc2VsZi0+c3RhcnRfdHMpKSB7CisgICAgc2VsZi0+c3RhcnRfdHMgPSB0aW1lc3RhbXA7CisgICAgc2VsZi0+c3RhcnRfb2ZmID0gR1NUX0JVRkZFUl9PRkZTRVQgKGluYnVmKTsKKyAgfQorCisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZiwgJmlubWFwLCBHU1RfTUFQX1JFQUQpOworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmb3V0bWFwLCBHU1RfTUFQX1dSSVRFKTsKKworICBpbnB1dF9zYW1wbGVzID0gKGlubWFwLnNpemUgLyBicHMpIC8gY2hhbm5lbHM7CisgIG91dHB1dF9zYW1wbGVzID0gKG91dG1hcC5zaXplIC8gYnBzKSAvIGNoYW5uZWxzOworCisgIHNlbGYtPm5zYW1wbGVzX2luICs9IGlucHV0X3NhbXBsZXM7CisKKyAgZ2VuZXJhdGVkX3NhbXBsZXMgPQorICAgICAgc2VsZi0+cHJvY2VzcyAoc2VsZiwgaW5tYXAuZGF0YSwgb3V0bWFwLmRhdGEsIGlucHV0X3NhbXBsZXMpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmLCAmaW5tYXApOworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWYsICZvdXRtYXApOworCisgIGdfYXNzZXJ0IChnZW5lcmF0ZWRfc2FtcGxlcyA8PSBvdXRwdXRfc2FtcGxlcyk7CisgIHNlbGYtPm5zYW1wbGVzX291dCArPSBnZW5lcmF0ZWRfc2FtcGxlczsKKyAgaWYgKGdlbmVyYXRlZF9zYW1wbGVzID09IDApCisgICAgZ290byBub19zYW1wbGVzOworCisgIC8qIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgd2UgY2FuIHB1c2ggb3V0IG5vdyB3aXRob3V0IG91dHB1dHRpbmcKKyAgICogbGF0ZW5jeSB6ZXJvcyBpbiB0aGUgYmVnaW5uaW5nICovCisgIGRpZmYgPSAoKGdpbnQ2NCkgc2VsZi0+bnNhbXBsZXNfb3V0KSAtICgoZ2ludDY0KSBzZWxmLT5sYXRlbmN5KTsKKyAgaWYgKGRpZmYgPCAwKQorICAgIGdvdG8gbm9fc2FtcGxlczsKKworICBpZiAoZGlmZiA8IGdlbmVyYXRlZF9zYW1wbGVzKSB7CisgICAgZ2ludDY0IHRtcCA9IGRpZmY7CisgICAgZGlmZiA9IGdlbmVyYXRlZF9zYW1wbGVzIC0gZGlmZjsKKyAgICBnZW5lcmF0ZWRfc2FtcGxlcyA9IHRtcDsKKyAgfSBlbHNlIHsKKyAgICBkaWZmID0gMDsKKyAgfQorCisgIGdzdF9idWZmZXJfcmVzaXplIChvdXRidWYsIGRpZmYgKiBicHMgKiBjaGFubmVscywKKyAgICAgIGdlbmVyYXRlZF9zYW1wbGVzICogYnBzICogY2hhbm5lbHMpOworCisgIG91dHB1dF9vZmZzZXQgPSBzZWxmLT5uc2FtcGxlc19vdXQgLSBzZWxmLT5sYXRlbmN5IC0gZ2VuZXJhdGVkX3NhbXBsZXM7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpID0KKyAgICAgIHNlbGYtPnN0YXJ0X3RzICsgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAob3V0cHV0X29mZnNldCwgR1NUX1NFQ09ORCwKKyAgICAgIHJhdGUpOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKG91dHB1dF9zYW1wbGVzLCBHU1RfU0VDT05ELCByYXRlKTsKKyAgaWYgKHNlbGYtPnN0YXJ0X29mZiAhPSBHU1RfQlVGRkVSX09GRlNFVF9OT05FKSB7CisgICAgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZikgPSBzZWxmLT5zdGFydF9vZmYgKyBvdXRwdXRfb2Zmc2V0OworICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAob3V0YnVmKSA9CisgICAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpICsgZ2VuZXJhdGVkX3NhbXBsZXM7CisgIH0gZWxzZSB7CisgICAgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZikgPSBHU1RfQlVGRkVSX09GRlNFVF9OT05FOworICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAob3V0YnVmKSA9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkU7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgIlB1c2hpbmcgYnVmZmVyIG9mIHNpemUgJSIgR19HU0laRV9GT1JNQVQgIiB3aXRoIHRpbWVzdGFtcDogJSIKKyAgICAgIEdTVF9USU1FX0ZPUk1BVCAiLCBkdXJhdGlvbjogJSIgR1NUX1RJTUVfRk9STUFUICIsIG9mZnNldDogJSIKKyAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIiwgb2Zmc2V0X2VuZDogJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBuc2FtcGxlc19vdXQ6ICVkIiwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZiksCisgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSksCisgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpKSwgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZiksCisgICAgICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKG91dGJ1ZiksIGdlbmVyYXRlZF9zYW1wbGVzKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKK25vX3NhbXBsZXM6CisgIHsKKyAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgIHJldHVybiBHU1RfQkFTRV9UUkFOU0ZPUk1fRkxPV19EUk9QUEVEOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UpCit7CisgIEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyICpzZWxmID0gR1NUX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUiAoYmFzZSk7CisKKyAgc2VsZi0+YnVmZmVyX2ZpbGwgPSAwOworICBnX2ZyZWUgKHNlbGYtPmJ1ZmZlcik7CisgIHNlbGYtPmJ1ZmZlciA9IE5VTEw7CisgIHNlbGYtPnN0YXJ0X3RzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgc2VsZi0+c3RhcnRfb2ZmID0gR1NUX0JVRkZFUl9PRkZTRVRfTk9ORTsKKyAgc2VsZi0+bnNhbXBsZXNfb3V0ID0gMDsKKyAgc2VsZi0+bnNhbXBsZXNfaW4gPSAwOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc3RvcCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UpCit7CisgIEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyICpzZWxmID0gR1NUX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUiAoYmFzZSk7CisKKyAgZ19mcmVlIChzZWxmLT5idWZmZXIpOworICBzZWxmLT5idWZmZXIgPSBOVUxMOworICBzZWxmLT5idWZmZXJfbGVuZ3RoID0gMDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3F1ZXJ5IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0UGFkRGlyZWN0aW9uIGRpcmVjdGlvbiwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXIgKnNlbGYgPSBHU1RfQVVESU9fRlhfQkFTRV9GSVJfRklMVEVSICh0cmFucyk7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfTEFURU5DWToKKyAgICB7CisgICAgICBHc3RDbG9ja1RpbWUgbWluLCBtYXg7CisgICAgICBnYm9vbGVhbiBsaXZlOworICAgICAgZ3VpbnQ2NCBsYXRlbmN5OworICAgICAgZ2ludCByYXRlID0gR1NUX0FVRElPX0ZJTFRFUl9SQVRFIChzZWxmKTsKKworICAgICAgaWYgKHJhdGUgPT0gMCkgeworICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgIH0gZWxzZSBpZiAoKHJlcyA9CisgICAgICAgICAgICAgIGdzdF9wYWRfcGVlcl9xdWVyeSAoR1NUX0JBU0VfVFJBTlNGT1JNIChzZWxmKS0+c2lua3BhZCwgcXVlcnkpKSkgeworICAgICAgICBnc3RfcXVlcnlfcGFyc2VfbGF0ZW5jeSAocXVlcnksICZsaXZlLCAmbWluLCAmbWF4KTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiUGVlciBsYXRlbmN5OiBtaW4gJSIKKyAgICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiIG1heCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChtaW4pLCBHU1RfVElNRV9BUkdTIChtYXgpKTsKKworICAgICAgICBpZiAoc2VsZi0+ZmZ0ICYmICFzZWxmLT5sb3dfbGF0ZW5jeSkKKyAgICAgICAgICBsYXRlbmN5ID0gc2VsZi0+YmxvY2tfbGVuZ3RoIC0gc2VsZi0+a2VybmVsX2xlbmd0aCArIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBsYXRlbmN5ID0gc2VsZi0+bGF0ZW5jeTsKKworICAgICAgICAvKiBhZGQgb3VyIG93biBsYXRlbmN5ICovCisgICAgICAgIGxhdGVuY3kgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKGxhdGVuY3ksIEdTVF9TRUNPTkQsIHJhdGUpOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJPdXIgbGF0ZW5jeTogJSIKKyAgICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAobGF0ZW5jeSkpOworCisgICAgICAgIG1pbiArPSBsYXRlbmN5OworICAgICAgICBpZiAobWF4ICE9IEdTVF9DTE9DS19USU1FX05PTkUpCisgICAgICAgICAgbWF4ICs9IGxhdGVuY3k7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkNhbGN1bGF0ZWQgdG90YWwgbGF0ZW5jeSA6IG1pbiAlIgorICAgICAgICAgICAgR1NUX1RJTUVfRk9STUFUICIgbWF4ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKG1pbiksIEdTVF9USU1FX0FSR1MgKG1heCkpOworCisgICAgICAgIGdzdF9xdWVyeV9zZXRfbGF0ZW5jeSAocXVlcnksIGxpdmUsIG1pbiwgbWF4KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0KKyAgICAgICAgICBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKHBhcmVudF9jbGFzcyktPnF1ZXJ5ICh0cmFucywgZGlyZWN0aW9uLAorICAgICAgICAgIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9zaW5rX2V2ZW50IChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlciAqc2VsZiA9IEdTVF9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIgKGJhc2UpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfcHVzaF9yZXNpZHVlIChzZWxmKTsKKyAgICAgIHNlbGYtPnN0YXJ0X3RzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICAgIHNlbGYtPnN0YXJ0X29mZiA9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkU7CisgICAgICBzZWxmLT5uc2FtcGxlc19vdXQgPSAwOworICAgICAgc2VsZi0+bnNhbXBsZXNfaW4gPSAwOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2lua19ldmVudCAoYmFzZSwgZXZlbnQpOworfQorCit2b2lkCitnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3NldF9rZXJuZWwgKEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyICogc2VsZiwKKyAgICBnZG91YmxlICoga2VybmVsLCBndWludCBrZXJuZWxfbGVuZ3RoLCBndWludDY0IGxhdGVuY3ksCisgICAgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbykKK3sKKyAgZ2Jvb2xlYW4gbGF0ZW5jeV9jaGFuZ2VkOworICBHc3RBdWRpb0Zvcm1hdCBmb3JtYXQ7CisgIGdpbnQgY2hhbm5lbHM7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoa2VybmVsICE9IE5VTEwpOworICBnX3JldHVybl9pZl9mYWlsIChzZWxmICE9IE5VTEwpOworCisgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworCisgIGxhdGVuY3lfY2hhbmdlZCA9IChzZWxmLT5sYXRlbmN5ICE9IGxhdGVuY3kKKyAgICAgIHx8ICghc2VsZi0+bG93X2xhdGVuY3kgJiYgc2VsZi0+a2VybmVsX2xlbmd0aCA8IEZGVF9USFJFU0hPTEQKKyAgICAgICAgICAmJiBrZXJuZWxfbGVuZ3RoID49IEZGVF9USFJFU0hPTEQpCisgICAgICB8fCAoIXNlbGYtPmxvd19sYXRlbmN5ICYmIHNlbGYtPmtlcm5lbF9sZW5ndGggPj0gRkZUX1RIUkVTSE9MRAorICAgICAgICAgICYmIGtlcm5lbF9sZW5ndGggPCBGRlRfVEhSRVNIT0xEKSk7CisKKyAgLyogRklYTUU6IElmIHRoZSBsYXRlbmN5IGNoYW5nZXMsIHRoZSBidWZmZXIgc2l6ZSBjaGFuZ2VzIHRvbyBhbmQgd2UKKyAgICogaGF2ZSB0byBkcmFpbiBpbiBhbnkgY2FzZSB1bnRpbCB0aGlzIGlzIGZpeGVkIGluIHRoZSBmdXR1cmUgKi8KKyAgaWYgKHNlbGYtPmJ1ZmZlciAmJiAoIXNlbGYtPmRyYWluX29uX2NoYW5nZXMgfHwgbGF0ZW5jeV9jaGFuZ2VkKSkgeworICAgIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfcHVzaF9yZXNpZHVlIChzZWxmKTsKKyAgICBzZWxmLT5zdGFydF90cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgc2VsZi0+c3RhcnRfb2ZmID0gR1NUX0JVRkZFUl9PRkZTRVRfTk9ORTsKKyAgICBzZWxmLT5uc2FtcGxlc19vdXQgPSAwOworICAgIHNlbGYtPm5zYW1wbGVzX2luID0gMDsKKyAgICBzZWxmLT5idWZmZXJfZmlsbCA9IDA7CisgIH0KKworICBnX2ZyZWUgKHNlbGYtPmtlcm5lbCk7CisgIGlmICghc2VsZi0+ZHJhaW5fb25fY2hhbmdlcyB8fCBsYXRlbmN5X2NoYW5nZWQpIHsKKyAgICBnX2ZyZWUgKHNlbGYtPmJ1ZmZlcik7CisgICAgc2VsZi0+YnVmZmVyID0gTlVMTDsKKyAgICBzZWxmLT5idWZmZXJfZmlsbCA9IDA7CisgICAgc2VsZi0+YnVmZmVyX2xlbmd0aCA9IDA7CisgIH0KKworICBzZWxmLT5rZXJuZWwgPSBrZXJuZWw7CisgIHNlbGYtPmtlcm5lbF9sZW5ndGggPSBrZXJuZWxfbGVuZ3RoOworCisgIGlmIChpbmZvKSB7CisgICAgZm9ybWF0ID0gR1NUX0FVRElPX0lORk9fRk9STUFUIChpbmZvKTsKKyAgICBjaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTIChpbmZvKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQgPSBHU1RfQVVESU9fRklMVEVSX0ZPUk1BVCAoc2VsZik7CisgICAgY2hhbm5lbHMgPSBHU1RfQVVESU9fRklMVEVSX0NIQU5ORUxTIChzZWxmKTsKKyAgfQorCisgIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfY2FsY3VsYXRlX2ZyZXF1ZW5jeV9yZXNwb25zZSAoc2VsZik7CisgIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc2VsZWN0X3Byb2Nlc3NfZnVuY3Rpb24gKHNlbGYsIGZvcm1hdCwgY2hhbm5lbHMpOworCisgIGlmIChsYXRlbmN5X2NoYW5nZWQpIHsKKyAgICBzZWxmLT5sYXRlbmN5ID0gbGF0ZW5jeTsKKyAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UIChzZWxmKSwKKyAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2xhdGVuY3kgKEdTVF9PQkpFQ1QgKHNlbGYpKSk7CisgIH0KKworICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuaCBiL2dzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJkNTU2MQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qIC0qLSBjLWJhc2ljLW9mZnNldDogMiAtKi0KKyAqIAorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICAyMDA2IERyZWFtbGFiIFRlY2hub2xvZ2llcyBMdGQuIDxtYXRoaXMuaG9mZXJAZHJlYW1sYWIubmV0PgorICogICAgICAgICAgICAgICAyMDA5IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICogCisgKi8KKworI2lmbmRlZiBfX0dTVF9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVJfSF9fCisjZGVmaW5lIF9fR1NUX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUl9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9maWx0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvZmZ0L2dzdGZmdGY2NC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQVVESU9fRlhfQkFTRV9GSVJfRklMVEVSIFwKKyAgKGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUixHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlcikpCisjZGVmaW5lIEdTVF9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVJfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfQVVESU9fRlhfQkFTRV9GSVJfRklMVEVSLEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fRlhfQkFTRV9GSVJfRklMVEVSKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQVVESU9fRlhfQkFTRV9GSVJfRklMVEVSKSkKKyNkZWZpbmUgR1NUX0lTX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXIgR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXI7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXJDbGFzcyBHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlckNsYXNzOworCit0eXBlZGVmIGd1aW50ICgqR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXJQcm9jZXNzRnVuYykgKEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyICosIGNvbnN0IGd1aW50OCAqLCBndWludDggKiwgZ3VpbnQpOworCisvKioKKyAqIEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyOgorICoKKyAqIE9wYXF1ZSBkYXRhIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IF9Hc3RBdWRpb0ZYQmFzZUZJUkZpbHRlciB7CisgIEdzdEF1ZGlvRmlsdGVyIGVsZW1lbnQ7CisKKyAgLyogcHJvcGVydGllcyAqLworICBnZG91YmxlICprZXJuZWw7ICAgICAgICAgICAgICAvKiBmaWx0ZXIga2VybmVsIC0tIHRpbWUgZG9tYWluICovCisgIGd1aW50IGtlcm5lbF9sZW5ndGg7ICAgICAgICAgIC8qIGxlbmd0aCBvZiB0aGUgZmlsdGVyIGtlcm5lbCAtLSB0aW1lIGRvbWFpbiAqLworCisgIGd1aW50NjQgbGF0ZW5jeTsgICAgICAgICAgICAgIC8qIHByZS1sYXRlbmN5IG9mIHRoZSBmaWx0ZXIga2VybmVsICovCisgIGdib29sZWFuIGxvd19sYXRlbmN5OyAgICAgICAgIC8qIHdvcmsgaW4gc2xvd2VyIGxvdyBsYXRlbmN5IG1vZGUgKi8KKworICBnYm9vbGVhbiBkcmFpbl9vbl9jaGFuZ2VzOyAgICAvKiBJZiB0aGUgZmlsdGVyIHNob3VsZCBiZSBkcmFpbmVkIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY29lZmljaWVudHMgY2hhbmdlICovCisKKyAgLyogPCBwcml2YXRlID4gKi8KKyAgR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXJQcm9jZXNzRnVuYyBwcm9jZXNzOworCisgIGdkb3VibGUgKmJ1ZmZlcjsgICAgICAgICAgICAgIC8qIGJ1ZmZlciBmb3Igc3RvcmluZyBzYW1wbGVzIG9mIHByZXZpb3VzIGJ1ZmZlcnMgKi8KKyAgZ3VpbnQgYnVmZmVyX2ZpbGw7ICAgICAgICAgICAgLyogZmlsbCBsZXZlbCBvZiBidWZmZXIgKi8KKyAgZ3VpbnQgYnVmZmVyX2xlbmd0aDsgICAgICAgICAgLyogbGVuZ3RoIG9mIHRoZSBidWZmZXIgLS0gbWVhbmluZyBkZXBlbmRzIG9uIHByb2Nlc3NpbmcgbW9kZSAqLworCisgIC8qIEZGVCBjb252b2x1dGlvbiBzcGVjaWZpYyBkYXRhICovCisgIEdzdEZGVEY2NCAqZmZ0OworICBHc3RGRlRGNjQgKmlmZnQ7CisgIEdzdEZGVEY2NENvbXBsZXggKmZyZXF1ZW5jeV9yZXNwb25zZTsgIC8qIGZpbHRlciBrZXJuZWwgLS0gZnJlcXVlbmN5IGRvbWFpbiAqLworICBndWludCBmcmVxdWVuY3lfcmVzcG9uc2VfbGVuZ3RoOyAgICAgICAvKiBsZW5ndGggb2YgZmlsdGVyIGtlcm5lbCAtLSBmcmVxdWVuY3kgZG9tYWluICovCisgIEdzdEZGVEY2NENvbXBsZXggKmZmdF9idWZmZXI7ICAgICAgICAgIC8qIEZGVCBidWZmZXIsIGhhcyB0aGUgbGVuZ3RoIG9mIHRoZSBmcmVxdWVuY3kgcmVzcG9uc2UgKi8KKyAgZ3VpbnQgYmxvY2tfbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgLyogTGVuZ3RoIG9mIHRoZSBwcm9jZXNzaW5nIGJsb2NrcyAtLSB0aW1lIGRvbWFpbiAqLworCisgIEdzdENsb2NrVGltZSBzdGFydF90czsgICAgICAgIC8qIHN0YXJ0IHRpbWVzdGFtcCBhZnRlciBhIGRpc2NvbnQgKi8KKyAgZ3VpbnQ2NCBzdGFydF9vZmY7ICAgICAgICAgICAgLyogc3RhcnQgb2Zmc2V0IGFmdGVyIGEgZGlzY29udCAqLworICBndWludDY0IG5zYW1wbGVzX291dDsgICAgICAgICAvKiBudW1iZXIgb2Ygb3V0cHV0IHNhbXBsZXMgc2luY2UgbGFzdCBkaXNjb250ICovCisgIGd1aW50NjQgbnNhbXBsZXNfaW47ICAgICAgICAgIC8qIG51bWJlciBvZiBpbnB1dCBzYW1wbGVzIHNpbmNlIGxhc3QgZGlzY29udCAqLworCisgIEdNdXRleCBsb2NrOworfTsKKworc3RydWN0IF9Hc3RBdWRpb0ZYQmFzZUZJUkZpbHRlckNsYXNzIHsKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX2dldF90eXBlICh2b2lkKTsKK3ZvaWQgZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9zZXRfa2VybmVsIChHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlciAqZmlsdGVyLCBnZG91YmxlICprZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQga2VybmVsX2xlbmd0aCwgZ3VpbnQ2NCBsYXRlbmN5LCBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKTsKK3ZvaWQgZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9wdXNoX3Jlc2lkdWUgKEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyICpmaWx0ZXIpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfQVVESU9fRlhfQkFTRV9GSVJfRklMVEVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuYyBiL2dzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlaWlyZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1NTNlOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlaWlyZmlsdGVyLmMKQEAgLTAsMCArMSw0MTYgQEAKKy8qIAorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJhdWRpb2Z4YmFzZWlpcmZpbHRlci5oIgorCisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2RlYnVnCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChHU1RfQ0FUX0RFRkFVTFQpOworCisjZGVmaW5lIEFMTE9XRURfQ0FQUyBcCisgICAgImF1ZGlvL3gtcmF3LCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBmb3JtYXQ9KHN0cmluZyl7IkdTVF9BVURJT19ORShGMzIpIiwiR1NUX0FVRElPX05FKEY2NCkifSwiICBcCisgICAgIiByYXRlID0gKGludCkgWyAxLCBNQVggXSwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBjaGFubmVscyA9IChpbnQpIFsgMSwgTUFYIF0sIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBsYXlvdXQ9KHN0cmluZykgaW50ZXJsZWF2ZWQiCisKKyNkZWZpbmUgZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlciwKKyAgICBnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyLCBHU1RfVFlQRV9BVURJT19GSUxURVIpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9zZXR1cCAoR3N0QXVkaW9GaWx0ZXIgKiBmaWx0ZXIsCisgICAgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl90cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9zdG9wIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSk7CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfNjQgKEdzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyICogZmlsdGVyLAorICAgIGdkb3VibGUgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcyk7CitzdGF0aWMgdm9pZCBwcm9jZXNzXzMyIChHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlciAqIGZpbHRlciwKKyAgICBnZmxvYXQgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcyk7CisKKy8qIEdPYmplY3Qgdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyICpmaWx0ZXIgPSBHU1RfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSIChvYmplY3QpOworCisgIGlmIChmaWx0ZXItPmEpIHsKKyAgICBnX2ZyZWUgKGZpbHRlci0+YSk7CisgICAgZmlsdGVyLT5hID0gTlVMTDsKKyAgfQorCisgIGlmIChmaWx0ZXItPmIpIHsKKyAgICBnX2ZyZWUgKGZpbHRlci0+Yik7CisgICAgZmlsdGVyLT5iID0gTlVMTDsKKyAgfQorCisgIGlmIChmaWx0ZXItPmNoYW5uZWxzKSB7CisgICAgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJDaGFubmVsQ3R4ICpjdHg7CisgICAgZ3VpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXItPm5jaGFubmVsczsgaSsrKSB7CisgICAgICBjdHggPSAmZmlsdGVyLT5jaGFubmVsc1tpXTsKKyAgICAgIGdfZnJlZSAoY3R4LT54KTsKKyAgICAgIGdfZnJlZSAoY3R4LT55KTsKKyAgICB9CisKKyAgICBnX2ZyZWUgKGZpbHRlci0+Y2hhbm5lbHMpOworICAgIGZpbHRlci0+Y2hhbm5lbHMgPSBOVUxMOworICB9CisgIGdfbXV0ZXhfY2xlYXIgKCZmaWx0ZXItPmxvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfY2xhc3NfaW5pdCAoR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKnRyYW5zX2NsYXNzID0gKEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqKSBrbGFzczsKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyAqZmlsdGVyX2NsYXNzID0gKEdzdEF1ZGlvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfZGVidWcsCisgICAgICAiYXVkaW9meGJhc2VpaXJmaWx0ZXIiLCAwLCAiQXVkaW8gSUlSIEZpbHRlciBCYXNlIENsYXNzIik7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2ZpbmFsaXplOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQUxMT1dFRF9DQVBTKTsKKyAgZ3N0X2F1ZGlvX2ZpbHRlcl9jbGFzc19hZGRfcGFkX3RlbXBsYXRlcyAoR1NUX0FVRElPX0ZJTFRFUl9DTEFTUyAoa2xhc3MpLAorICAgICAgY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBmaWx0ZXJfY2xhc3MtPnNldHVwID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfc2V0dXApOworCisgIHRyYW5zX2NsYXNzLT50cmFuc2Zvcm1faXAgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfdHJhbnNmb3JtX2lwKTsKKyAgdHJhbnNfY2xhc3MtPnRyYW5zZm9ybV9pcF9vbl9wYXNzdGhyb3VnaCA9IEZBTFNFOworICB0cmFuc19jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX3N0b3ApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9pbml0IChHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlciAqIGZpbHRlcikKK3sKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9pbl9wbGFjZSAoR1NUX0JBU0VfVFJBTlNGT1JNIChmaWx0ZXIpLCBUUlVFKTsKKworICBmaWx0ZXItPmEgPSBOVUxMOworICBmaWx0ZXItPm5hID0gMDsKKyAgZmlsdGVyLT5iID0gTlVMTDsKKyAgZmlsdGVyLT5uYiA9IDA7CisgIGZpbHRlci0+Y2hhbm5lbHMgPSBOVUxMOworICBmaWx0ZXItPm5jaGFubmVscyA9IDA7CisKKyAgZ19tdXRleF9pbml0ICgmZmlsdGVyLT5sb2NrKTsKK30KKworLyogRXZhbHVhdGUgdGhlIHRyYW5zZmVyIGZ1bmN0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIElJUgorICogY29lZmZpY2llbnRzIGF0ICh6ciArIHppKkkpXi0xIGFuZCByZXR1cm4gdGhlIG1hZ25pdHVkZSAqLworZ2RvdWJsZQorZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9jYWxjdWxhdGVfZ2FpbiAoZ2RvdWJsZSAqIGEsIGd1aW50IG5hLCBnZG91YmxlICogYiwKKyAgICBndWludCBuYiwgZ2RvdWJsZSB6ciwgZ2RvdWJsZSB6aSkKK3sKKyAgZ2RvdWJsZSBzdW1fYXIsIHN1bV9haTsKKyAgZ2RvdWJsZSBzdW1fYnIsIHN1bV9iaTsKKyAgZ2RvdWJsZSBnYWluX3IsIGdhaW5faTsKKworICBnZG91YmxlIHN1bV9yX29sZDsKKyAgZ2RvdWJsZSBzdW1faV9vbGQ7CisKKyAgZ2ludCBpOworCisgIHN1bV9hciA9IGFbbmEgLSAxXTsKKyAgc3VtX2FpID0gMC4wOworICBmb3IgKGkgPSBuYSAtIDI7IGkgPj0gMDsgaS0tKSB7CisgICAgc3VtX3Jfb2xkID0gc3VtX2FyOworICAgIHN1bV9pX29sZCA9IHN1bV9haTsKKworICAgIHN1bV9hciA9IChzdW1fcl9vbGQgKiB6ciAtIHN1bV9pX29sZCAqIHppKSArIGFbaV07CisgICAgc3VtX2FpID0gKHN1bV9yX29sZCAqIHppICsgc3VtX2lfb2xkICogenIpICsgMC4wOworICB9CisKKyAgc3VtX2JyID0gYltuYiAtIDFdOworICBzdW1fYmkgPSAwLjA7CisgIGZvciAoaSA9IG5iIC0gMjsgaSA+PSAwOyBpLS0pIHsKKyAgICBzdW1fcl9vbGQgPSBzdW1fYnI7CisgICAgc3VtX2lfb2xkID0gc3VtX2JpOworCisgICAgc3VtX2JyID0gKHN1bV9yX29sZCAqIHpyIC0gc3VtX2lfb2xkICogemkpICsgYltpXTsKKyAgICBzdW1fYmkgPSAoc3VtX3Jfb2xkICogemkgKyBzdW1faV9vbGQgKiB6cikgKyAwLjA7CisgIH0KKworICBnYWluX3IgPQorICAgICAgKHN1bV9iciAqIHN1bV9hciArIHN1bV9iaSAqIHN1bV9haSkgLyAoc3VtX2FyICogc3VtX2FyICsgc3VtX2FpICogc3VtX2FpKTsKKyAgZ2Fpbl9pID0KKyAgICAgIChzdW1fYmkgKiBzdW1fYXIgLSBzdW1fYnIgKiBzdW1fYWkpIC8gKHN1bV9hciAqIHN1bV9hciArIHN1bV9haSAqIHN1bV9haSk7CisKKyAgcmV0dXJuIChzcXJ0IChnYWluX3IgKiBnYWluX3IgKyBnYWluX2kgKiBnYWluX2kpKTsKK30KKwordm9pZAorZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9zZXRfY29lZmZpY2llbnRzIChHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlciAqIGZpbHRlciwKKyAgICBnZG91YmxlICogYSwgZ3VpbnQgbmEsIGdkb3VibGUgKiBiLCBndWludCBuYikKK3sKKyAgZ3VpbnQgaTsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSIChmaWx0ZXIpKTsKKworICBnX211dGV4X2xvY2sgKCZmaWx0ZXItPmxvY2spOworCisgIGdfZnJlZSAoZmlsdGVyLT5hKTsKKyAgZ19mcmVlIChmaWx0ZXItPmIpOworCisgIGZpbHRlci0+YSA9IGZpbHRlci0+YiA9IE5VTEw7CisKKyAgaWYgKGZpbHRlci0+Y2hhbm5lbHMpIHsKKyAgICBHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlckNoYW5uZWxDdHggKmN0eDsKKyAgICBnYm9vbGVhbiBmcmVlID0gKG5hICE9IGZpbHRlci0+bmEgfHwgbmIgIT0gZmlsdGVyLT5uYik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVyLT5uY2hhbm5lbHM7IGkrKykgeworICAgICAgY3R4ID0gJmZpbHRlci0+Y2hhbm5lbHNbaV07CisKKyAgICAgIGlmIChmcmVlKQorICAgICAgICBnX2ZyZWUgKGN0eC0+eCk7CisgICAgICBlbHNlCisgICAgICAgIG1lbXNldCAoY3R4LT54LCAwLCBmaWx0ZXItPm5iICogc2l6ZW9mIChnZG91YmxlKSk7CisKKyAgICAgIGlmIChmcmVlKQorICAgICAgICBnX2ZyZWUgKGN0eC0+eSk7CisgICAgICBlbHNlCisgICAgICAgIG1lbXNldCAoY3R4LT55LCAwLCBmaWx0ZXItPm5hICogc2l6ZW9mIChnZG91YmxlKSk7CisgICAgfQorCisgICAgZ19mcmVlIChmaWx0ZXItPmNoYW5uZWxzKTsKKyAgICBmaWx0ZXItPmNoYW5uZWxzID0gTlVMTDsKKyAgfQorCisgIGZpbHRlci0+bmEgPSBuYTsKKyAgZmlsdGVyLT5uYiA9IG5iOworCisgIGZpbHRlci0+YSA9IGE7CisgIGZpbHRlci0+YiA9IGI7CisKKyAgaWYgKGZpbHRlci0+bmNoYW5uZWxzICYmICFmaWx0ZXItPmNoYW5uZWxzKSB7CisgICAgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJDaGFubmVsQ3R4ICpjdHg7CisKKyAgICBmaWx0ZXItPmNoYW5uZWxzID0KKyAgICAgICAgZ19uZXcwIChHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlckNoYW5uZWxDdHgsIGZpbHRlci0+bmNoYW5uZWxzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVyLT5uY2hhbm5lbHM7IGkrKykgeworICAgICAgY3R4ID0gJmZpbHRlci0+Y2hhbm5lbHNbaV07CisKKyAgICAgIGN0eC0+eCA9IGdfbmV3MCAoZ2RvdWJsZSwgZmlsdGVyLT5uYik7CisgICAgICBjdHgtPnkgPSBnX25ldzAgKGdkb3VibGUsIGZpbHRlci0+bmEpOworICAgIH0KKyAgfQorCisgIGdfbXV0ZXhfdW5sb2NrICgmZmlsdGVyLT5sb2NrKTsKK30KKworLyogR3N0QXVkaW9GaWx0ZXIgdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KKworc3RhdGljIGdib29sZWFuCitnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGJhc2UsCisgICAgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbykKK3sKKyAgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXIgKmZpbHRlciA9IEdTVF9BVURJT19GWF9CQVNFX0lJUl9GSUxURVIgKGJhc2UpOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworICBnaW50IGNoYW5uZWxzOworCisgIGdfbXV0ZXhfbG9jayAoJmZpbHRlci0+bG9jayk7CisgIHN3aXRjaCAoR1NUX0FVRElPX0lORk9fRk9STUFUIChpbmZvKSkgeworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GMzI6CisgICAgICBmaWx0ZXItPnByb2Nlc3MgPSAoR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJQcm9jZXNzRnVuYykKKyAgICAgICAgICBwcm9jZXNzXzMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX0Y2NDoKKyAgICAgIGZpbHRlci0+cHJvY2VzcyA9IChHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlclByb2Nlc3NGdW5jKQorICAgICAgICAgIHByb2Nlc3NfNjQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgfQorCisgIGNoYW5uZWxzID0gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKGluZm8pOworCisgIGlmIChjaGFubmVscyAhPSBmaWx0ZXItPm5jaGFubmVscykgeworICAgIGd1aW50IGk7CisgICAgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJDaGFubmVsQ3R4ICpjdHg7CisKKyAgICBpZiAoZmlsdGVyLT5jaGFubmVscykgeworICAgICAgZm9yIChpID0gMDsgaSA8IGZpbHRlci0+bmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgY3R4ID0gJmZpbHRlci0+Y2hhbm5lbHNbaV07CisKKyAgICAgICAgZ19mcmVlIChjdHgtPngpOworICAgICAgICBnX2ZyZWUgKGN0eC0+eSk7CisgICAgICB9CisgICAgICBnX2ZyZWUgKGZpbHRlci0+Y2hhbm5lbHMpOworICAgIH0KKworICAgIGZpbHRlci0+Y2hhbm5lbHMgPSBnX25ldzAgKEdzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyQ2hhbm5lbEN0eCwgY2hhbm5lbHMpOworICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CisgICAgICBjdHggPSAmZmlsdGVyLT5jaGFubmVsc1tpXTsKKworICAgICAgY3R4LT54ID0gZ19uZXcwIChnZG91YmxlLCBmaWx0ZXItPm5iKTsKKyAgICAgIGN0eC0+eSA9IGdfbmV3MCAoZ2RvdWJsZSwgZmlsdGVyLT5uYSk7CisgICAgfQorICAgIGZpbHRlci0+bmNoYW5uZWxzID0gY2hhbm5lbHM7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZmaWx0ZXItPmxvY2spOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ2RvdWJsZQorcHJvY2VzcyAoR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXIgKiBmaWx0ZXIsCisgICAgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJDaGFubmVsQ3R4ICogY3R4LCBnZG91YmxlIHgwKQoreworICBnZG91YmxlIHZhbCA9IGZpbHRlci0+YlswXSAqIHgwOworICBnaW50IGksIGo7CisKKyAgZm9yIChpID0gMSwgaiA9IGN0eC0+eF9wb3M7IGkgPCBmaWx0ZXItPm5iOyBpKyspIHsKKyAgICB2YWwgKz0gZmlsdGVyLT5iW2ldICogY3R4LT54W2pdOworICAgIGotLTsKKyAgICBpZiAoaiA8IDApCisgICAgICBqID0gZmlsdGVyLT5uYiAtIDE7CisgIH0KKworICBmb3IgKGkgPSAxLCBqID0gY3R4LT55X3BvczsgaSA8IGZpbHRlci0+bmE7IGkrKykgeworICAgIHZhbCAtPSBmaWx0ZXItPmFbaV0gKiBjdHgtPnlbal07CisgICAgai0tOworICAgIGlmIChqIDwgMCkKKyAgICAgIGogPSBmaWx0ZXItPm5hIC0gMTsKKyAgfQorICB2YWwgLz0gZmlsdGVyLT5hWzBdOworCisgIGlmIChjdHgtPngpIHsKKyAgICBjdHgtPnhfcG9zKys7CisgICAgaWYgKGN0eC0+eF9wb3MgPj0gZmlsdGVyLT5uYikKKyAgICAgIGN0eC0+eF9wb3MgPSAwOworICAgIGN0eC0+eFtjdHgtPnhfcG9zXSA9IHgwOworICB9CisgIGlmIChjdHgtPnkpIHsKKyAgICBjdHgtPnlfcG9zKys7CisgICAgaWYgKGN0eC0+eV9wb3MgPj0gZmlsdGVyLT5uYSkKKyAgICAgIGN0eC0+eV9wb3MgPSAwOworCisgICAgY3R4LT55W2N0eC0+eV9wb3NdID0gdmFsOworICB9CisKKyAgcmV0dXJuIHZhbDsKK30KKworI2RlZmluZSBERUZJTkVfUFJPQ0VTU19GVU5DKHdpZHRoLGN0eXBlKSBcCitzdGF0aWMgdm9pZCBcCitwcm9jZXNzXyMjd2lkdGggKEdzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyICogZmlsdGVyLCBcCisgICAgZyMjY3R5cGUgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykgXAoreyBcCisgIGdpbnQgaSwgaiwgY2hhbm5lbHMgPSBmaWx0ZXItPm5jaGFubmVsczsgXAorICBnZG91YmxlIHZhbDsgXAorICBcCisgIGZvciAoaSA9IDA7IGkgPCBudW1fc2FtcGxlcyAvIGNoYW5uZWxzOyBpKyspIHsgXAorICAgIGZvciAoaiA9IDA7IGogPCBjaGFubmVsczsgaisrKSB7IFwKKyAgICAgIHZhbCA9IHByb2Nlc3MgKGZpbHRlciwgJmZpbHRlci0+Y2hhbm5lbHNbal0sICpkYXRhKTsgXAorICAgICAgKmRhdGErKyA9IHZhbDsgXAorICAgIH0gXAorICB9IFwKK30KKworREVGSU5FX1BST0NFU1NfRlVOQyAoMzIsIGZsb2F0KTsKK0RFRklORV9QUk9DRVNTX0ZVTkMgKDY0LCBkb3VibGUpOworCisjdW5kZWYgREVGSU5FX1BST0NFU1NfRlVOQworCisvKiBHc3RCYXNlVHJhbnNmb3JtIHZtZXRob2QgaW1wbGVtZW50YXRpb25zICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl90cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXIgKmZpbHRlciA9IEdTVF9BVURJT19GWF9CQVNFX0lJUl9GSUxURVIgKGJhc2UpOworICBndWludCBudW1fc2FtcGxlczsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCwgc3RyZWFtX3RpbWU7CisgIEdzdE1hcEluZm8gbWFwOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpOworICBzdHJlYW1fdGltZSA9CisgICAgICBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJmJhc2UtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgdGltZXN0YW1wKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsICJzeW5jIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtX3RpbWUpKQorICAgIGdzdF9vYmplY3Rfc3luY192YWx1ZXMgKEdTVF9PQkpFQ1QgKGZpbHRlciksIHN0cmVhbV90aW1lKTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQURXUklURSk7CisgIG51bV9zYW1wbGVzID0gbWFwLnNpemUgLyBHU1RfQVVESU9fRklMVEVSX0JQUyAoZmlsdGVyKTsKKworICBnX211dGV4X2xvY2sgKCZmaWx0ZXItPmxvY2spOworICBpZiAoZmlsdGVyLT5hID09IE5VTEwgfHwgZmlsdGVyLT5iID09IE5VTEwpIHsKKyAgICBnX3dhcm5faWZfZmFpbCAoZmlsdGVyLT5hICE9IE5VTEwgJiYgZmlsdGVyLT5iICE9IE5VTEwpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ19tdXRleF91bmxvY2sgKCZmaWx0ZXItPmxvY2spOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorICBmaWx0ZXItPnByb2Nlc3MgKGZpbHRlciwgbWFwLmRhdGEsIG51bV9zYW1wbGVzKTsKKyAgZ19tdXRleF91bmxvY2sgKCZmaWx0ZXItPmxvY2spOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9zdG9wIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSkKK3sKKyAgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXIgKmZpbHRlciA9IEdTVF9BVURJT19GWF9CQVNFX0lJUl9GSUxURVIgKGJhc2UpOworICBndWludCBjaGFubmVscyA9IGZpbHRlci0+bmNoYW5uZWxzOworICBHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlckNoYW5uZWxDdHggKmN0eDsKKyAgZ3VpbnQgaTsKKworICAvKiBSZXNldCB0aGUgaGlzdG9yeSBvZiBpbnB1dCBhbmQgb3V0cHV0IHZhbHVlcyBpZgorICAgKiBhbHJlYWR5IGV4aXN0aW5nICovCisgIGlmIChjaGFubmVscyAmJiBmaWx0ZXItPmNoYW5uZWxzKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKKyAgICAgIGN0eCA9ICZmaWx0ZXItPmNoYW5uZWxzW2ldOworICAgICAgZ19mcmVlIChjdHgtPngpOworICAgICAgZ19mcmVlIChjdHgtPnkpOworICAgIH0KKyAgICBnX2ZyZWUgKGZpbHRlci0+Y2hhbm5lbHMpOworICB9CisgIGZpbHRlci0+Y2hhbm5lbHMgPSBOVUxMOworICBmaWx0ZXItPm5jaGFubmVscyA9IDA7CisKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWlpcmZpbHRlci5oIGIvZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzhhZTMxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuaApAQCAtMCwwICsxLDc4IEBACisvKiAKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9BVURJT19GWF9CQVNFX0lJUl9GSUxURVJfSF9fCisjZGVmaW5lIF9fR1NUX0FVRElPX0ZYX0JBU0VfSUlSX0ZJTFRFUl9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9BVURJT19GWF9CQVNFX0lJUl9GSUxURVIgICAgICAgICAgICAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSLEdzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyKSkKKyNkZWZpbmUgR1NUX0lTX0FVRElPX0ZYX0JBU0VfSUlSX0ZJTFRFUihvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0FVRElPX0ZYX0JBU0VfSUlSX0ZJTFRFUikpCisjZGVmaW5lIEdTVF9BVURJT19GWF9CQVNFX0lJUl9GSUxURVJfQ0xBU1Moa2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpICxHU1RfVFlQRV9BVURJT19GWF9CQVNFX0lJUl9GSUxURVIsR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BVURJT19GWF9CQVNFX0lJUl9GSUxURVJfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpICxHU1RfVFlQRV9BVURJT19GWF9CQVNFX0lJUl9GSUxURVIpKQorI2RlZmluZSBHU1RfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSX0dFVF9DTEFTUyhvYmopICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUygob2JqKSAsR1NUX1RZUEVfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSLEdzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyQ2xhc3MpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyIEdzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyQ2xhc3MgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJDbGFzczsKKwordHlwZWRlZiB2b2lkICgqR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJQcm9jZXNzRnVuYykgKEdzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyICosIGd1aW50OCAqLCBndWludCk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGdkb3VibGUgKng7CisgIGdpbnQgeF9wb3M7CisgIGdkb3VibGUgKnk7CisgIGdpbnQgeV9wb3M7Cit9IEdzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyQ2hhbm5lbEN0eDsKKworc3RydWN0IF9Hc3RBdWRpb0ZYQmFzZUlJUkZpbHRlcgoreworICBHc3RBdWRpb0ZpbHRlciBhdWRpb2ZpbHRlcjsKKworICAvKiA8IHByaXZhdGUgPiAqLworICBHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlclByb2Nlc3NGdW5jIHByb2Nlc3M7CisKKyAgZ2RvdWJsZSAqYTsKKyAgZ3VpbnQgbmE7CisgIGdkb3VibGUgKmI7CisgIGd1aW50IG5iOworICBHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlckNoYW5uZWxDdHggKmNoYW5uZWxzOworICBndWludCBuY2hhbm5lbHM7CisKKyAgR011dGV4IGxvY2s7Cit9OworCitzdHJ1Y3QgX0dzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyQ2xhc3MKK3sKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyBwYXJlbnQ7Cit9OworCitHVHlwZSBnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2dldF90eXBlICh2b2lkKTsKK3ZvaWQgZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9zZXRfY29lZmZpY2llbnRzIChHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlciAqZmlsdGVyLCBnZG91YmxlICphLCBndWludCBuYSwgZ2RvdWJsZSAqYiwgZ3VpbnQgbmIpOworZ2RvdWJsZSBnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2NhbGN1bGF0ZV9nYWluIChnZG91YmxlICphLCBndWludCBuYSwgZ2RvdWJsZSAqYiwgZ3VpbnQgbmIsIGdkb3VibGUgenIsIGdkb3VibGUgemkpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9paXJmaWx0ZXIuYyBiL2dzdC9hdWRpb2Z4L2F1ZGlvaWlyZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0ZjIwYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2F1ZGlvaWlyZmlsdGVyLmMKQEAgLTAsMCArMSwyODEgQEAKKy8qIAorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKiAKKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1hdWRpb2lpcmZpbHRlcgorICoKKyAqIGF1ZGlvaWlyZmlsdGVyIGltcGxlbWVudHMgYSBnZW5lcmljIGF1ZGlvIDx1bGluayB1cmw9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSW5maW5pdGVfaW1wdWxzZV9yZXNwb25zZSI+SUlSIGZpbHRlcjwvdWxpbms+LiBCZWZvcmUgdXNhZ2UgdGhlCisgKiAiYSIgYW5kICJiIiBwcm9wZXJ0aWVzIGhhdmUgdG8gYmUgc2V0IHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIHRoYXQKKyAqIHNob3VsZCBiZSB1c2VkLgorICoKKyAqIFRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGRlc2NyaWJlIHRoZSBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yIG9mIHRoZQorICogdHJhbnNmZXIgZnVuY3Rpb24uCisgKgorICogVG8gY2hhbmdlIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIHdoZW5ldmVyIHRoZSBzYW1wbGluZyByYXRlIGNoYW5nZXMgdGhlCisgKiAicmF0ZS1jaGFuZ2VkIiBzaWduYWwgY2FuIGJlIHVzZWQuIFRoaXMgc2hvdWxkIGJlIGRvbmUgZm9yIG1vc3QKKyAqIElJUiBmaWx0ZXJzIGFzIHRoZXkncmUgZGVwZW5kaW5nIG9uIHRoZSBzYW1wbGluZyByYXRlLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGFwcGxpY2F0aW9uPC90aXRsZT4KKyAqIDxpbmZvcm1hbGV4YW1wbGU+PHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJDIj4KKyAqIDx4aTppbmNsdWRlIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzL1hJbmNsdWRlIiBwYXJzZT0idGV4dCIgaHJlZj0iLi4vLi4vLi4vLi4vdGVzdHMvZXhhbXBsZXMvYXVkaW9meC9paXJmaWx0ZXItZXhhbXBsZS5jIiAvPgorICogPC9wcm9ncmFtbGlzdGluZz48L2luZm9ybWFsZXhhbXBsZT4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworLyogRklYTUUgMC4xMTogc3VwcHJlc3Mgd2FybmluZ3MgZm9yIGRlcHJlY2F0ZWQgQVBJIHN1Y2ggYXMgR1ZhbHVlQXJyYXkKKyAqIHdpdGggbmV3ZXIgR0xpYiB2ZXJzaW9ucyAoPj0gMi4zMS4wKSAqLworI2RlZmluZSBHTElCX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9maWx0ZXIuaD4KKworI2luY2x1ZGUgImF1ZGlvaWlyZmlsdGVyLmgiCisKKyNpbmNsdWRlICJnc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oIgorCisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfYXVkaW9faWlyX2ZpbHRlcl9kZWJ1ZworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoR1NUX0NBVF9ERUZBVUxUKTsKKworZW51bQoreworICBTSUdOQUxfUkFURV9DSEFOR0VELAorICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQSwKKyAgUFJPUF9CCit9OworCitzdGF0aWMgZ3VpbnQgZ3N0X2F1ZGlvX2lpcl9maWx0ZXJfc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAsIH07CisKKyNkZWZpbmUgZ3N0X2F1ZGlvX2lpcl9maWx0ZXJfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0QXVkaW9JSVJGaWx0ZXIsIGdzdF9hdWRpb19paXJfZmlsdGVyLAorICAgIEdTVF9UWVBFX0FVRElPX0ZYX0JBU0VfSUlSX0ZJTFRFUik7CisKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19paXJfZmlsdGVyX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19paXJfZmlsdGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19paXJfZmlsdGVyX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hdWRpb19paXJfZmlsdGVyX3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGJhc2UsCisgICAgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbyk7CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9faWlyX2ZpbHRlcl9jbGFzc19pbml0IChHc3RBdWRpb0lJUkZpbHRlckNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdEF1ZGlvRmlsdGVyQ2xhc3MgKmZpbHRlcl9jbGFzcyA9IChHc3RBdWRpb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfYXVkaW9faWlyX2ZpbHRlcl9kZWJ1ZywgImF1ZGlvaWlyZmlsdGVyIiwgMCwKKyAgICAgICJHZW5lcmljIGF1ZGlvIElJUiBmaWx0ZXIgcGx1Z2luIik7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2F1ZGlvX2lpcl9maWx0ZXJfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9faWlyX2ZpbHRlcl9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2F1ZGlvX2lpcl9maWx0ZXJfZmluYWxpemU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9BLAorICAgICAgZ19wYXJhbV9zcGVjX3ZhbHVlX2FycmF5ICgiYSIsICJBIiwKKyAgICAgICAgICAiRmlsdGVyIGNvZWZmaWNpZW50cyAoZGVub21pbmF0b3Igb2YgdHJhbnNmZXIgZnVuY3Rpb24pIiwKKyAgICAgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiQ29lZmZpY2llbnQiLCAiRmlsdGVyIENvZWZmaWNpZW50IiwKKyAgICAgICAgICAgICAgIkZpbHRlciBjb2VmZmljaWVudCIsIC1HX01BWERPVUJMRSwgR19NQVhET1VCTEUsIDAuMCwKKyAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9CLAorICAgICAgZ19wYXJhbV9zcGVjX3ZhbHVlX2FycmF5ICgiYiIsICJCIiwKKyAgICAgICAgICAiRmlsdGVyIGNvZWZmaWNpZW50cyAobnVtZXJhdG9yIG9mIHRyYW5zZmVyIGZ1bmN0aW9uKSIsCisgICAgICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoIkNvZWZmaWNpZW50IiwgIkZpbHRlciBDb2VmZmljaWVudCIsCisgICAgICAgICAgICAgICJGaWx0ZXIgY29lZmZpY2llbnQiLCAtR19NQVhET1VCTEUsIEdfTUFYRE9VQkxFLCAwLjAsCisgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyksCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZmlsdGVyX2NsYXNzLT5zZXR1cCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVkaW9faWlyX2ZpbHRlcl9zZXR1cCk7CisKKyAgLyoqCisgICAqIEdzdEF1ZGlvSUlSRmlsdGVyOjpyYXRlLWNoYW5nZWQ6CisgICAqIEBmaWx0ZXI6IHRoZSBmaWx0ZXIgb24gd2hpY2ggdGhlIHNpZ25hbCBpcyBlbWl0dGVkCisgICAqIEByYXRlOiB0aGUgbmV3IHNhbXBsaW5nIHJhdGUKKyAgICoKKyAgICogV2lsbCBiZSBlbWl0dGVkIHdoZW4gdGhlIHNhbXBsaW5nIHJhdGUgY2hhbmdlcy4gVGhlIGNhbGxiYWNrcworICAgKiB3aWxsIGJlIGNhbGxlZCBmcm9tIHRoZSBzdHJlYW1pbmcgdGhyZWFkIGFuZCBwcm9jZXNzaW5nIHdpbGwKKyAgICogc3RvcCB1bnRpbCB0aGUgZXZlbnQgaXMgaGFuZGxlZC4KKyAgICovCisgIGdzdF9hdWRpb19paXJfZmlsdGVyX3NpZ25hbHNbU0lHTkFMX1JBVEVfQ0hBTkdFRF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgicmF0ZS1jaGFuZ2VkIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdEF1ZGlvSUlSRmlsdGVyQ2xhc3MsIHJhdGVfY2hhbmdlZCksCisgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBHX1RZUEVfTk9ORSwgMSwgR19UWVBFX0lOVCk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJBdWRpbyBJSVIgZmlsdGVyIiwgIkZpbHRlci9FZmZlY3QvQXVkaW8iLAorICAgICAgIkdlbmVyaWMgYXVkaW8gSUlSIGZpbHRlciB3aXRoIGN1c3RvbSBmaWx0ZXIga2VybmVsIiwKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19paXJfZmlsdGVyX3VwZGF0ZV9jb2VmZmljaWVudHMgKEdzdEF1ZGlvSUlSRmlsdGVyICogc2VsZiwKKyAgICBHVmFsdWVBcnJheSAqIHZhLCBHVmFsdWVBcnJheSAqIHZiKQoreworICBnZG91YmxlICphID0gTlVMTCwgKmIgPSBOVUxMOworICBndWludCBpOworCisgIGlmICh2YSkgeworICAgIGlmIChzZWxmLT5hKQorICAgICAgZ192YWx1ZV9hcnJheV9mcmVlIChzZWxmLT5hKTsKKworICAgIHNlbGYtPmEgPSB2YTsKKyAgfQorICBpZiAodmIpIHsKKyAgICBpZiAoc2VsZi0+YikKKyAgICAgIGdfdmFsdWVfYXJyYXlfZnJlZSAoc2VsZi0+Yik7CisKKyAgICBzZWxmLT5iID0gdmI7CisgIH0KKworICBpZiAoc2VsZi0+YSAmJiBzZWxmLT5hLT5uX3ZhbHVlcyA+IDApIHsKKyAgICBhID0gZ19uZXcgKGdkb3VibGUsIHNlbGYtPmEtPm5fdmFsdWVzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzZWxmLT5hLT5uX3ZhbHVlczsgaSsrKSB7CisgICAgICBHVmFsdWUgKnYgPSBnX3ZhbHVlX2FycmF5X2dldF9udGggKHNlbGYtPmEsIGkpOworICAgICAgYVtpXSA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodik7CisgICAgfQorICB9CisKKyAgaWYgKHNlbGYtPmIgJiYgc2VsZi0+Yi0+bl92YWx1ZXMgPiAwKSB7CisgICAgYiA9IGdfbmV3IChnZG91YmxlLCBzZWxmLT5iLT5uX3ZhbHVlcyk7CisgICAgZm9yIChpID0gMDsgaSA8IHNlbGYtPmItPm5fdmFsdWVzOyBpKyspIHsKKyAgICAgIEdWYWx1ZSAqdiA9IGdfdmFsdWVfYXJyYXlfZ2V0X250aCAoc2VsZi0+YiwgaSk7CisgICAgICBiW2ldID0gZ192YWx1ZV9nZXRfZG91YmxlICh2KTsKKyAgICB9CisgIH0KKworICBnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX3NldF9jb2VmZmljaWVudHMgKEdTVF9BVURJT19GWF9CQVNFX0lJUl9GSUxURVIKKyAgICAgIChzZWxmKSwgYSwgKHNlbGYtPmEpID8gc2VsZi0+YS0+bl92YWx1ZXMgOiAwLCBiLAorICAgICAgKHNlbGYtPmIpID8gc2VsZi0+Yi0+bl92YWx1ZXMgOiAwKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19paXJfZmlsdGVyX2luaXQgKEdzdEF1ZGlvSUlSRmlsdGVyICogc2VsZikKK3sKKyAgR1ZhbHVlIHYgPSB7IDAsIH07CisgIEdWYWx1ZUFycmF5ICphOworCisgIGEgPSBnX3ZhbHVlX2FycmF5X25ldyAoMSk7CisKKyAgZ192YWx1ZV9pbml0ICgmdiwgR19UWVBFX0RPVUJMRSk7CisgIGdfdmFsdWVfc2V0X2RvdWJsZSAoJnYsIDEuMCk7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kIChhLCAmdik7CisgIGdfdmFsdWVfdW5zZXQgKCZ2KTsKKworICBnc3RfYXVkaW9faWlyX2ZpbHRlcl91cGRhdGVfY29lZmZpY2llbnRzIChzZWxmLCBhLCBnX3ZhbHVlX2FycmF5X2NvcHkgKGEpKTsKKworICBnX211dGV4X2luaXQgKCZzZWxmLT5sb2NrKTsKK30KKworLyogR3N0QXVkaW9GaWx0ZXIgdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KKworLyogZ2V0IG5vdGlmaWVkIG9mIGNhcHMgYW5kIHBsdWcgaW4gdGhlIGNvcnJlY3QgcHJvY2VzcyBmdW5jdGlvbiAqLworc3RhdGljIGdib29sZWFuCitnc3RfYXVkaW9faWlyX2ZpbHRlcl9zZXR1cCAoR3N0QXVkaW9GaWx0ZXIgKiBiYXNlLCBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKQoreworICBHc3RBdWRpb0lJUkZpbHRlciAqc2VsZiA9IEdTVF9BVURJT19JSVJfRklMVEVSIChiYXNlKTsKKyAgZ2ludCBuZXdfcmF0ZSA9IEdTVF9BVURJT19JTkZPX1JBVEUgKGluZm8pOworCisgIGlmIChHU1RfQVVESU9fRklMVEVSX1JBVEUgKHNlbGYpICE9IG5ld19yYXRlKSB7CisgICAgZ19zaWduYWxfZW1pdCAoR19PQkpFQ1QgKHNlbGYpLAorICAgICAgICBnc3RfYXVkaW9faWlyX2ZpbHRlcl9zaWduYWxzW1NJR05BTF9SQVRFX0NIQU5HRURdLCAwLCBuZXdfcmF0ZSk7CisgIH0KKworICByZXR1cm4gR1NUX0FVRElPX0ZJTFRFUl9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2V0dXAgKGJhc2UsIGluZm8pOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2lpcl9maWx0ZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEF1ZGlvSUlSRmlsdGVyICpzZWxmID0gR1NUX0FVRElPX0lJUl9GSUxURVIgKG9iamVjdCk7CisKKyAgZ19tdXRleF9jbGVhciAoJnNlbGYtPmxvY2spOworCisgIGlmIChzZWxmLT5hKQorICAgIGdfdmFsdWVfYXJyYXlfZnJlZSAoc2VsZi0+YSk7CisgIHNlbGYtPmEgPSBOVUxMOworICBpZiAoc2VsZi0+YikKKyAgICBnX3ZhbHVlX2FycmF5X2ZyZWUgKHNlbGYtPmIpOworICBzZWxmLT5iID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9faWlyX2ZpbHRlcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXVkaW9JSVJGaWx0ZXIgKnNlbGYgPSBHU1RfQVVESU9fSUlSX0ZJTFRFUiAob2JqZWN0KTsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfQVVESU9fSUlSX0ZJTFRFUiAoc2VsZikpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9BOgorICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBnc3RfYXVkaW9faWlyX2ZpbHRlcl91cGRhdGVfY29lZmZpY2llbnRzIChzZWxmLCBnX3ZhbHVlX2R1cF9ib3hlZCAodmFsdWUpLAorICAgICAgICAgIE5VTEwpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9COgorICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBnc3RfYXVkaW9faWlyX2ZpbHRlcl91cGRhdGVfY29lZmZpY2llbnRzIChzZWxmLCBOVUxMLAorICAgICAgICAgIGdfdmFsdWVfZHVwX2JveGVkICh2YWx1ZSkpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19paXJfZmlsdGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb0lJUkZpbHRlciAqc2VsZiA9IEdTVF9BVURJT19JSVJfRklMVEVSIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9BOgorICAgICAgZ192YWx1ZV9zZXRfYm94ZWQgKHZhbHVlLCBzZWxmLT5hKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9COgorICAgICAgZ192YWx1ZV9zZXRfYm94ZWQgKHZhbHVlLCBzZWxmLT5iKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb2Z4L2F1ZGlvaWlyZmlsdGVyLmggYi9nc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMzljNWIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qIAorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKiAKKyAqLworCisjaWZuZGVmIF9fR1NUX0FVRElPX0lJUl9GSUxURVJfSF9fCisjZGVmaW5lIF9fR1NUX0FVRElPX0lJUl9GSUxURVJfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlICJhdWRpb2Z4YmFzZWlpcmZpbHRlci5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQVVESU9fSUlSX0ZJTFRFUiBcCisgIChnc3RfYXVkaW9faWlyX2ZpbHRlcl9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVVESU9fSUlSX0ZJTFRFUihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0FVRElPX0lJUl9GSUxURVIsR3N0QXVkaW9JSVJGaWx0ZXIpKQorI2RlZmluZSBHU1RfQVVESU9fSUlSX0ZJTFRFUl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9BVURJT19JSVJfRklMVEVSLEdzdEF1ZGlvSUlSRmlsdGVyQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fSUlSX0ZJTFRFUihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0FVRElPX0lJUl9GSUxURVIpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fSUlSX0ZJTFRFUl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9BVURJT19JSVJfRklMVEVSKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1ZGlvSUlSRmlsdGVyIEdzdEF1ZGlvSUlSRmlsdGVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1ZGlvSUlSRmlsdGVyQ2xhc3MgR3N0QXVkaW9JSVJGaWx0ZXJDbGFzczsKKworLyoqCisgKiBHc3RBdWRpb0lJUkZpbHRlcjoKKyAqCisgKiBPcGFxdWUgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0QXVkaW9JSVJGaWx0ZXIgeworICBHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlciBwYXJlbnQ7CisKKyAgR1ZhbHVlQXJyYXkgKmEsICpiOworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIEdNdXRleCBsb2NrOworfTsKKworc3RydWN0IF9Hc3RBdWRpb0lJUkZpbHRlckNsYXNzIHsKKyAgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJDbGFzcyBwYXJlbnQ7CisKKyAgdm9pZCAoKnJhdGVfY2hhbmdlZCkgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBnaW50IHJhdGUpOworfTsKKworR1R5cGUgZ3N0X2F1ZGlvX2lpcl9maWx0ZXJfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfQVVESU9fSUlSX0ZJTFRFUl9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0LmMgYi9nc3QvYXVkaW9meC9hdWRpb2ludmVydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2OGRkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb2ludmVydC5jCkBAIC0wLDAgKzEsMjU2IEBACisvKiAKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXVkaW9pbnZlcnQKKyAqCisgKiBTd2FwcyB1cHBlciBhbmQgbG93ZXIgaGFsZiBvZiBhdWRpbyBzYW1wbGVzLiBNaXhpbmcgYW4gaW52ZXJ0ZWQgc2FtcGxlIG9uIHRvcCBvZgorICogdGhlIG9yaWdpbmFsIHdpdGggYSBzbGlnaHQgZGVsYXkgY2FuIHByb2R1Y2UgZWZmZWN0cyB0aGF0IHNvdW5kIGxpa2UgcmVzb25hbmNlLgorICogQ3JlYXRpbmcgYSBzdGVyZW8gc2FtcGxlIGZyb20gYSBtb25vIHNvdXJjZSwgd2l0aCBvbmUgY2hhbm5lbCBpbnZlcnRlZCBwcm9kdWNlcyB3aWRlLXN0ZXJlbyBzb3VuZHMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyB3YXZlPXNhdyAhIGF1ZGlvaW52ZXJ0IGRlZ3JlZT0wLjQgISBhbHNhc2luaworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj0ibWVsbzEub2dnIiAhIG9nZ2RlbXV4ICEgdm9yYmlzZGVjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9pbnZlcnQgZGVncmVlPTAuNCAhIGFsc2FzaW5rCisgKiBnc3QtbGF1bmNoLTEuMCBhdWRpb3Rlc3RzcmMgd2F2ZT1zYXcgISBhdWRpb2NvbnZlcnQgISBhdWRpb2ludmVydCBkZWdyZWU9MC40ICEgYXVkaW9jb252ZXJ0ICEgYWxzYXNpbmsKKyAqIF18CisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlICJhdWRpb2ludmVydC5oIgorCisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfYXVkaW9faW52ZXJ0X2RlYnVnCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChHU1RfQ0FUX0RFRkFVTFQpOworCisvKiBGaWx0ZXIgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9ERUdSRUUKK307CisKKyNkZWZpbmUgQUxMT1dFRF9DQVBTIFwKKyAgICAiYXVkaW8veC1yYXcsIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICIgZm9ybWF0PShzdHJpbmcpIHsiR1NUX0FVRElPX05FKFMxNikiLCJHU1RfQVVESU9fTkUoRjMyKSJ9LCIgICAgICBcCisgICAgIiByYXRlPShpbnQpWzEsTUFYXSwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIGNoYW5uZWxzPShpbnQpWzEsTUFYXSwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICIgbGF5b3V0PShzdHJpbmcpIHtpbnRlcmxlYXZlZCwgbm9uLWludGVybGVhdmVkfSIKKworR19ERUZJTkVfVFlQRSAoR3N0QXVkaW9JbnZlcnQsIGdzdF9hdWRpb19pbnZlcnQsIEdTVF9UWVBFX0FVRElPX0ZJTFRFUik7CisKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19pbnZlcnRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2ludmVydF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9faW52ZXJ0X3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGZpbHRlciwKKyAgICBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9hdWRpb19pbnZlcnRfdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwKKyAgICBHc3RCdWZmZXIgKiBidWYpOworCitzdGF0aWMgdm9pZCBnc3RfYXVkaW9faW52ZXJ0X3RyYW5zZm9ybV9pbnQgKEdzdEF1ZGlvSW52ZXJ0ICogZmlsdGVyLAorICAgIGdpbnQxNiAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19pbnZlcnRfdHJhbnNmb3JtX2Zsb2F0IChHc3RBdWRpb0ludmVydCAqIGZpbHRlciwKKyAgICBnZmxvYXQgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcyk7CisKKy8qIEdPYmplY3Qgdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19pbnZlcnRfY2xhc3NfaW5pdCAoR3N0QXVkaW9JbnZlcnRDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X2F1ZGlvX2ludmVydF9kZWJ1ZywgImF1ZGlvaW52ZXJ0IiwgMCwKKyAgICAgICJhdWRpb2ludmVydCBlbGVtZW50Iik7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9hdWRpb19pbnZlcnRfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9faW52ZXJ0X2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RFR1JFRSwKKyAgICAgIGdfcGFyYW1fc3BlY19mbG9hdCAoImRlZ3JlZSIsICJEZWdyZWUiLAorICAgICAgICAgICJEZWdyZWUgb2YgaW52ZXJzaW9uIiwgMC4wLCAxLjAsCisgICAgICAgICAgMC4wLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiQXVkaW8gaW52ZXJzaW9uIiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L0F1ZGlvIiwKKyAgICAgICJTd2FwcyB1cHBlciBhbmQgbG93ZXIgaGFsZiBvZiBhdWRpbyBzYW1wbGVzIiwKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+Iik7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBTExPV0VEX0NBUFMpOworICBnc3RfYXVkaW9fZmlsdGVyX2NsYXNzX2FkZF9wYWRfdGVtcGxhdGVzIChHU1RfQVVESU9fRklMVEVSX0NMQVNTIChrbGFzcyksCisgICAgICBjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAoa2xhc3MpLT50cmFuc2Zvcm1faXAgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdWRpb19pbnZlcnRfdHJhbnNmb3JtX2lwKTsKKyAgR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChrbGFzcyktPnRyYW5zZm9ybV9pcF9vbl9wYXNzdGhyb3VnaCA9IEZBTFNFOworCisgIEdTVF9BVURJT19GSUxURVJfQ0xBU1MgKGtsYXNzKS0+c2V0dXAgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdWRpb19pbnZlcnRfc2V0dXApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2ludmVydF9pbml0IChHc3RBdWRpb0ludmVydCAqIGZpbHRlcikKK3sKKyAgZmlsdGVyLT5kZWdyZWUgPSAwLjA7CisgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfaW5fcGxhY2UgKEdTVF9CQVNFX1RSQU5TRk9STSAoZmlsdGVyKSwgVFJVRSk7CisgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfZ2FwX2F3YXJlIChHU1RfQkFTRV9UUkFOU0ZPUk0gKGZpbHRlciksIFRSVUUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2ludmVydF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXVkaW9JbnZlcnQgKmZpbHRlciA9IEdTVF9BVURJT19JTlZFUlQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RFR1JFRToKKyAgICAgIGZpbHRlci0+ZGVncmVlID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfcGFzc3Rocm91Z2ggKEdTVF9CQVNFX1RSQU5TRk9STSAoZmlsdGVyKSwKKyAgICAgICAgICBmaWx0ZXItPmRlZ3JlZSA9PSAwLjApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2ludmVydF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXVkaW9JbnZlcnQgKmZpbHRlciA9IEdTVF9BVURJT19JTlZFUlQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RFR1JFRToKKyAgICAgIGdfdmFsdWVfc2V0X2Zsb2F0ICh2YWx1ZSwgZmlsdGVyLT5kZWdyZWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBHc3RBdWRpb0ZpbHRlciB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdWRpb19pbnZlcnRfc2V0dXAgKEdzdEF1ZGlvRmlsdGVyICogYmFzZSwgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbykKK3sKKyAgR3N0QXVkaW9JbnZlcnQgKmZpbHRlciA9IEdTVF9BVURJT19JTlZFUlQgKGJhc2UpOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIHN3aXRjaCAoR1NUX0FVRElPX0lORk9fRk9STUFUIChpbmZvKSkgeworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMTY6CisgICAgICBmaWx0ZXItPnByb2Nlc3MgPSAoR3N0QXVkaW9JbnZlcnRQcm9jZXNzRnVuYykKKyAgICAgICAgICBnc3RfYXVkaW9faW52ZXJ0X3RyYW5zZm9ybV9pbnQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfRjMyOgorICAgICAgZmlsdGVyLT5wcm9jZXNzID0gKEdzdEF1ZGlvSW52ZXJ0UHJvY2Vzc0Z1bmMpCisgICAgICAgICAgZ3N0X2F1ZGlvX2ludmVydF90cmFuc2Zvcm1fZmxvYXQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2ludmVydF90cmFuc2Zvcm1faW50IChHc3RBdWRpb0ludmVydCAqIGZpbHRlciwKKyAgICBnaW50MTYgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykKK3sKKyAgZ2ludCBpOworICBnZmxvYXQgZHJ5ID0gMS4wIC0gZmlsdGVyLT5kZWdyZWU7CisgIGdsb25nIHZhbDsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NhbXBsZXM7IGkrKykgeworICAgIHZhbCA9ICgqZGF0YSkgKiBkcnkgKyAoLTEgLSAoKmRhdGEpKSAqIGZpbHRlci0+ZGVncmVlOworICAgICpkYXRhKysgPSAoZ2ludDE2KSBDTEFNUCAodmFsLCBHX01JTklOVDE2LCBHX01BWElOVDE2KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2ludmVydF90cmFuc2Zvcm1fZmxvYXQgKEdzdEF1ZGlvSW52ZXJ0ICogZmlsdGVyLAorICAgIGdmbG9hdCAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKQoreworICBnaW50IGk7CisgIGdmbG9hdCBkcnkgPSAxLjAgLSBmaWx0ZXItPmRlZ3JlZTsKKyAgZ2xvbmcgdmFsOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fc2FtcGxlczsgaSsrKSB7CisgICAgdmFsID0gKCpkYXRhKSAqIGRyeSAtICgqZGF0YSkgKiBmaWx0ZXItPmRlZ3JlZTsKKyAgICAqZGF0YSsrID0gdmFsOworICB9Cit9CisKKy8qIEdzdEJhc2VUcmFuc2Zvcm0gdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYXVkaW9faW52ZXJ0X3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0QXVkaW9JbnZlcnQgKmZpbHRlciA9IEdTVF9BVURJT19JTlZFUlQgKGJhc2UpOworICBndWludCBudW1fc2FtcGxlczsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCwgc3RyZWFtX3RpbWU7CisgIEdzdE1hcEluZm8gbWFwOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpOworICBzdHJlYW1fdGltZSA9CisgICAgICBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJmJhc2UtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgdGltZXN0YW1wKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsICJzeW5jIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtX3RpbWUpKQorICAgIGdzdF9vYmplY3Rfc3luY192YWx1ZXMgKEdTVF9PQkpFQ1QgKGZpbHRlciksIHN0cmVhbV90aW1lKTsKKworICBpZiAoR19VTkxJS0VMWSAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfR0FQKSkpCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgbnVtX3NhbXBsZXMgPSBtYXAuc2l6ZSAvIEdTVF9BVURJT19GSUxURVJfQlBTIChmaWx0ZXIpOworCisgIGZpbHRlci0+cHJvY2VzcyAoZmlsdGVyLCBtYXAuZGF0YSwgbnVtX3NhbXBsZXMpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuaCBiL2dzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JiNWIzZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0LmgKQEAgLTAsMCArMSw2MCBAQAorLyogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfQVVESU9fSU5WRVJUX0hfXworI2RlZmluZSBfX0dTVF9BVURJT19JTlZFUlRfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb2ZpbHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX0FVRElPX0lOVkVSVCAgICAgICAgICAgIChnc3RfYXVkaW9faW52ZXJ0X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9BVURJT19JTlZFUlQob2JqKSAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9BVURJT19JTlZFUlQsR3N0QXVkaW9JbnZlcnQpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fSU5WRVJUKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQVVESU9fSU5WRVJUKSkKKyNkZWZpbmUgR1NUX0FVRElPX0lOVkVSVF9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcykgLEdTVF9UWVBFX0FVRElPX0lOVkVSVCxHc3RBdWRpb0ludmVydENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FVRElPX0lOVkVSVF9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcykgLEdTVF9UWVBFX0FVRElPX0lOVkVSVCkpCisjZGVmaW5lIEdTVF9BVURJT19JTlZFUlRfR0VUX0NMQVNTKG9iaikgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTKChvYmopICxHU1RfVFlQRV9BVURJT19JTlZFUlQsR3N0QXVkaW9JbnZlcnRDbGFzcykpCit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9JbnZlcnQgR3N0QXVkaW9JbnZlcnQ7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9JbnZlcnRDbGFzcyBHc3RBdWRpb0ludmVydENsYXNzOworCit0eXBlZGVmIHZvaWQgKCpHc3RBdWRpb0ludmVydFByb2Nlc3NGdW5jKSAoR3N0QXVkaW9JbnZlcnQgKiwgZ3VpbnQ4ICosIGd1aW50KTsKKworc3RydWN0IF9Hc3RBdWRpb0ludmVydAoreworICBHc3RBdWRpb0ZpbHRlciBhdWRpb2ZpbHRlcjsKKworICBnZmxvYXQgZGVncmVlOworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIEdzdEF1ZGlvSW52ZXJ0UHJvY2Vzc0Z1bmMgcHJvY2VzczsKK307CisKK3N0cnVjdCBfR3N0QXVkaW9JbnZlcnRDbGFzcworeworICBHc3RBdWRpb0ZpbHRlckNsYXNzIHBhcmVudDsKK307CisKK0dUeXBlIGdzdF9hdWRpb19pbnZlcnRfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX0FVRElPX0lOVkVSVF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5jIGIvZ3N0L2F1ZGlvZngvYXVkaW9rYXJhb2tlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2OTdjYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5jCkBAIC0wLDAgKzEsMzYzIEBACisvKiAKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA4IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXVkaW9rYXJhb2tlCisgKgorICogUmVtb3ZlIHRoZSB2b2ljZSBmcm9tIGF1ZGlvIGJ5IGZpbHRlcmluZyB0aGUgY2VudGVyIGNoYW5uZWwuCisgKiBUaGlzIHBsdWdpbiBpcyB1c2VmdWwgZm9yIGthcmFva2UgYXBwbGljYXRpb25zLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPXNvbmcub2dnICEgb2dnZGVtdXggISB2b3JiaXNkZWMgISBhdWRpb2thcmFva2UgISBhdWRpb2NvbnZlcnQgISBhbHNhc2luaworICogXXwKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9maWx0ZXIuaD4KKworI2luY2x1ZGUgImF1ZGlva2FyYW9rZS5oIgorCisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfYXVkaW9fa2FyYW9rZV9kZWJ1ZworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoR1NUX0NBVF9ERUZBVUxUKTsKKworLyogRmlsdGVyIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworI2RlZmluZSBERUZBVUxUX0xFVkVMCQkxLjAKKyNkZWZpbmUgREVGQVVMVF9NT05PX0xFVkVMCTEuMAorI2RlZmluZSBERUZBVUxUX0ZJTFRFUl9CQU5ECTIyMC4wCisjZGVmaW5lIERFRkFVTFRfRklMVEVSX1dJRFRICTEwMC4wCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0xFVkVMLAorICBQUk9QX01PTk9fTEVWRUwsCisgIFBST1BfRklMVEVSX0JBTkQsCisgIFBST1BfRklMVEVSX1dJRFRICit9OworCisjZGVmaW5lIEFMTE9XRURfQ0FQUyBcCisgICAgImF1ZGlvL3gtcmF3LCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBmb3JtYXQ9KHN0cmluZyl7IkdTVF9BVURJT19ORShTMTYpIiwiR1NUX0FVRElPX05FKEYzMikifSwiICBcCisgICAgIiByYXRlPShpbnQpWzEsTUFYXSwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBjaGFubmVscz0oaW50KTIsIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBjaGFubmVsLW1hc2s9KGJpdG1hc2spMHgzLCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBsYXlvdXQ9KHN0cmluZykgaW50ZXJsZWF2ZWQiCisKK0dfREVGSU5FX1RZUEUgKEdzdEF1ZGlvS2FyYW9rZSwgZ3N0X2F1ZGlvX2thcmFva2UsIEdTVF9UWVBFX0FVRElPX0ZJTFRFUik7CisKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19rYXJhb2tlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19rYXJhb2tlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hdWRpb19rYXJhb2tlX3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGZpbHRlciwKKyAgICBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9hdWRpb19rYXJhb2tlX3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UsCisgICAgR3N0QnVmZmVyICogYnVmKTsKKworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2thcmFva2VfdHJhbnNmb3JtX2ludCAoR3N0QXVkaW9LYXJhb2tlICogZmlsdGVyLAorICAgIGdpbnQxNiAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19rYXJhb2tlX3RyYW5zZm9ybV9mbG9hdCAoR3N0QXVkaW9LYXJhb2tlICogZmlsdGVyLAorICAgIGdmbG9hdCAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKTsKKworLyogR09iamVjdCB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2thcmFva2VfY2xhc3NfaW5pdCAoR3N0QXVkaW9LYXJhb2tlQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9hdWRpb19rYXJhb2tlX2RlYnVnLCAiYXVkaW9rYXJhb2tlIiwgMCwKKyAgICAgICJhdWRpb2thcmFva2UgZWxlbWVudCIpOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9fa2FyYW9rZV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9hdWRpb19rYXJhb2tlX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0xFVkVMLAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgibGV2ZWwiLCAiTGV2ZWwiLAorICAgICAgICAgICJMZXZlbCBvZiB0aGUgZWZmZWN0ICgxLjAgPSBmdWxsKSIsIDAuMCwgMS4wLCBERUZBVUxUX0xFVkVMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01PTk9fTEVWRUwsCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJtb25vLWxldmVsIiwgIk1vbm8gTGV2ZWwiLAorICAgICAgICAgICJMZXZlbCBvZiB0aGUgbW9ubyBjaGFubmVsICgxLjAgPSBmdWxsKSIsIDAuMCwgMS4wLCBERUZBVUxUX0xFVkVMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0ZJTFRFUl9CQU5ELAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgiZmlsdGVyLWJhbmQiLCAiRmlsdGVyIEJhbmQiLAorICAgICAgICAgICJUaGUgRnJlcXVlbmN5IGJhbmQgb2YgdGhlIGZpbHRlciIsIDAuMCwgNDQxLjAsIERFRkFVTFRfRklMVEVSX0JBTkQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRklMVEVSX1dJRFRILAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgiZmlsdGVyLXdpZHRoIiwgIkZpbHRlciBXaWR0aCIsCisgICAgICAgICAgIlRoZSBGcmVxdWVuY3kgd2lkdGggb2YgdGhlIGZpbHRlciIsIDAuMCwgMTAwLjAsIERFRkFVTFRfRklMVEVSX1dJRFRILAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiQXVkaW9LYXJhb2tlIiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L0F1ZGlvIiwKKyAgICAgICJSZW1vdmVzIHZvaWNlIGZyb20gc291bmQiLCAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFMTE9XRURfQ0FQUyk7CisgIGdzdF9hdWRpb19maWx0ZXJfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZXMgKEdTVF9BVURJT19GSUxURVJfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChrbGFzcyktPnRyYW5zZm9ybV9pcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX2thcmFva2VfdHJhbnNmb3JtX2lwKTsKKyAgR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChrbGFzcyktPnRyYW5zZm9ybV9pcF9vbl9wYXNzdGhyb3VnaCA9IEZBTFNFOworCisgIEdTVF9BVURJT19GSUxURVJfQ0xBU1MgKGtsYXNzKS0+c2V0dXAgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdWRpb19rYXJhb2tlX3NldHVwKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19rYXJhb2tlX2luaXQgKEdzdEF1ZGlvS2FyYW9rZSAqIGZpbHRlcikKK3sKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9pbl9wbGFjZSAoR1NUX0JBU0VfVFJBTlNGT1JNIChmaWx0ZXIpLCBUUlVFKTsKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9nYXBfYXdhcmUgKEdTVF9CQVNFX1RSQU5TRk9STSAoZmlsdGVyKSwgVFJVRSk7CisKKyAgZmlsdGVyLT5sZXZlbCA9IERFRkFVTFRfTEVWRUw7CisgIGZpbHRlci0+bW9ub19sZXZlbCA9IERFRkFVTFRfTU9OT19MRVZFTDsKKyAgZmlsdGVyLT5maWx0ZXJfYmFuZCA9IERFRkFVTFRfRklMVEVSX0JBTkQ7CisgIGZpbHRlci0+ZmlsdGVyX3dpZHRoID0gREVGQVVMVF9GSUxURVJfV0lEVEg7Cit9CisKK3N0YXRpYyB2b2lkCit1cGRhdGVfZmlsdGVyIChHc3RBdWRpb0thcmFva2UgKiBmaWx0ZXIsIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIGdmbG9hdCBBLCBCLCBDOworICBnaW50IHJhdGU7CisKKyAgaWYgKGluZm8pIHsKKyAgICByYXRlID0gR1NUX0FVRElPX0lORk9fUkFURSAoaW5mbyk7CisgIH0gZWxzZSB7CisgICAgcmF0ZSA9IEdTVF9BVURJT19GSUxURVJfUkFURSAoZmlsdGVyKTsKKyAgfQorCisgIGlmIChyYXRlID09IDApCisgICAgcmV0dXJuOworCisgIEMgPSBleHAgKC0yICogR19QSSAqIGZpbHRlci0+ZmlsdGVyX3dpZHRoIC8gcmF0ZSk7CisgIEIgPSAtNCAqIEMgLyAoMSArIEMpICogY29zICgyICogR19QSSAqIGZpbHRlci0+ZmlsdGVyX2JhbmQgLyByYXRlKTsKKyAgQSA9IHNxcnQgKDEgLSBCICogQiAvICg0ICogQykpICogKDEgLSBDKTsKKworICBmaWx0ZXItPkEgPSBBOworICBmaWx0ZXItPkIgPSBCOworICBmaWx0ZXItPkMgPSBDOworICBmaWx0ZXItPnkxID0gMC4wOworICBmaWx0ZXItPnkyID0gMC4wOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2thcmFva2Vfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEF1ZGlvS2FyYW9rZSAqZmlsdGVyOworCisgIGZpbHRlciA9IEdTVF9BVURJT19LQVJBT0tFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MRVZFTDoKKyAgICAgIGZpbHRlci0+bGV2ZWwgPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01PTk9fTEVWRUw6CisgICAgICBmaWx0ZXItPm1vbm9fbGV2ZWwgPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZJTFRFUl9CQU5EOgorICAgICAgZmlsdGVyLT5maWx0ZXJfYmFuZCA9IGdfdmFsdWVfZ2V0X2Zsb2F0ICh2YWx1ZSk7CisgICAgICB1cGRhdGVfZmlsdGVyIChmaWx0ZXIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZJTFRFUl9XSURUSDoKKyAgICAgIGZpbHRlci0+ZmlsdGVyX3dpZHRoID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIHVwZGF0ZV9maWx0ZXIgKGZpbHRlciwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fa2FyYW9rZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXVkaW9LYXJhb2tlICpmaWx0ZXI7CisKKyAgZmlsdGVyID0gR1NUX0FVRElPX0tBUkFPS0UgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xFVkVMOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBmaWx0ZXItPmxldmVsKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NT05PX0xFVkVMOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBmaWx0ZXItPm1vbm9fbGV2ZWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZJTFRFUl9CQU5EOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBmaWx0ZXItPmZpbHRlcl9iYW5kKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GSUxURVJfV0lEVEg6CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIGZpbHRlci0+ZmlsdGVyX3dpZHRoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogR3N0QXVkaW9GaWx0ZXIgdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KKworc3RhdGljIGdib29sZWFuCitnc3RfYXVkaW9fa2FyYW9rZV9zZXR1cCAoR3N0QXVkaW9GaWx0ZXIgKiBiYXNlLCBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKQoreworICBHc3RBdWRpb0thcmFva2UgKmZpbHRlciA9IEdTVF9BVURJT19LQVJBT0tFIChiYXNlKTsKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKworICBzd2l0Y2ggKEdTVF9BVURJT19JTkZPX0ZPUk1BVCAoaW5mbykpIHsKKyAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzE2OgorICAgICAgZmlsdGVyLT5wcm9jZXNzID0gKEdzdEF1ZGlvS2FyYW9rZVByb2Nlc3NGdW5jKQorICAgICAgICAgIGdzdF9hdWRpb19rYXJhb2tlX3RyYW5zZm9ybV9pbnQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfRjMyOgorICAgICAgZmlsdGVyLT5wcm9jZXNzID0gKEdzdEF1ZGlvS2FyYW9rZVByb2Nlc3NGdW5jKQorICAgICAgICAgIGdzdF9hdWRpb19rYXJhb2tlX3RyYW5zZm9ybV9mbG9hdDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICB9CisgIHVwZGF0ZV9maWx0ZXIgKGZpbHRlciwgaW5mbyk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19rYXJhb2tlX3RyYW5zZm9ybV9pbnQgKEdzdEF1ZGlvS2FyYW9rZSAqIGZpbHRlciwKKyAgICBnaW50MTYgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykKK3sKKyAgZ2ludCBpLCBsLCByLCBvLCB4OworICBnaW50IGNoYW5uZWxzOworICBnZG91YmxlIHk7CisgIGdpbnQgbGV2ZWw7CisKKyAgY2hhbm5lbHMgPSBHU1RfQVVESU9fRklMVEVSX0NIQU5ORUxTIChmaWx0ZXIpOworICBsZXZlbCA9IGZpbHRlci0+bGV2ZWwgKiAyNTY7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9zYW1wbGVzOyBpICs9IGNoYW5uZWxzKSB7CisgICAgLyogZ2V0IGxlZnQgYW5kIHJpZ2h0IGlucHV0cyAqLworICAgIGwgPSBkYXRhW2ldOworICAgIHIgPSBkYXRhW2kgKyAxXTsKKyAgICAvKiBkbyBmaWx0ZXJpbmcgKi8KKyAgICB4ID0gKGwgKyByKSAvIDI7CisgICAgeSA9IChmaWx0ZXItPkEgKiB4IC0gZmlsdGVyLT5CICogZmlsdGVyLT55MSkgLSBmaWx0ZXItPkMgKiBmaWx0ZXItPnkyOworICAgIGZpbHRlci0+eTIgPSBmaWx0ZXItPnkxOworICAgIGZpbHRlci0+eTEgPSB5OworICAgIC8qIGZpbHRlciBtb25vIHNpZ25hbCAqLworICAgIG8gPSAoaW50KSAoeSAqIGZpbHRlci0+bW9ub19sZXZlbCk7CisgICAgbyA9IENMQU1QIChvLCBHX01JTklOVDE2LCBHX01BWElOVDE2KTsKKyAgICBvID0gKG8gKiBsZXZlbCkgPj4gODsKKyAgICAvKiBub3cgY3V0IHRoZSBjZW50ZXIgKi8KKyAgICB4ID0gbCAtICgociAqIGxldmVsKSA+PiA4KSArIG87CisgICAgciA9IHIgLSAoKGwgKiBsZXZlbCkgPj4gOCkgKyBvOworICAgIGRhdGFbaV0gPSBDTEFNUCAoeCwgR19NSU5JTlQxNiwgR19NQVhJTlQxNik7CisgICAgZGF0YVtpICsgMV0gPSBDTEFNUCAociwgR19NSU5JTlQxNiwgR19NQVhJTlQxNik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19rYXJhb2tlX3RyYW5zZm9ybV9mbG9hdCAoR3N0QXVkaW9LYXJhb2tlICogZmlsdGVyLAorICAgIGdmbG9hdCAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKQoreworICBnaW50IGk7CisgIGdpbnQgY2hhbm5lbHM7CisgIGdkb3VibGUgbCwgciwgbzsKKyAgZ2RvdWJsZSB5OworCisgIGNoYW5uZWxzID0gR1NUX0FVRElPX0ZJTFRFUl9DSEFOTkVMUyAoZmlsdGVyKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NhbXBsZXM7IGkgKz0gY2hhbm5lbHMpIHsKKyAgICAvKiBnZXQgbGVmdCBhbmQgcmlnaHQgaW5wdXRzICovCisgICAgbCA9IGRhdGFbaV07CisgICAgciA9IGRhdGFbaSArIDFdOworICAgIC8qIGRvIGZpbHRlcmluZyAqLworICAgIHkgPSAoZmlsdGVyLT5BICogKChsICsgcikgLyAyLjApIC0gZmlsdGVyLT5CICogZmlsdGVyLT55MSkgLQorICAgICAgICBmaWx0ZXItPkMgKiBmaWx0ZXItPnkyOworICAgIGZpbHRlci0+eTIgPSBmaWx0ZXItPnkxOworICAgIGZpbHRlci0+eTEgPSB5OworICAgIC8qIGZpbHRlciBtb25vIHNpZ25hbCAqLworICAgIG8gPSB5ICogZmlsdGVyLT5tb25vX2xldmVsICogZmlsdGVyLT5sZXZlbDsKKyAgICAvKiBub3cgY3V0IHRoZSBjZW50ZXIgKi8KKyAgICBkYXRhW2ldID0gbCAtIChyICogZmlsdGVyLT5sZXZlbCkgKyBvOworICAgIGRhdGFbaSArIDFdID0gciAtIChsICogZmlsdGVyLT5sZXZlbCkgKyBvOworICB9Cit9CisKKy8qIEdzdEJhc2VUcmFuc2Zvcm0gdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYXVkaW9fa2FyYW9rZV90cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdEF1ZGlvS2FyYW9rZSAqZmlsdGVyID0gR1NUX0FVRElPX0tBUkFPS0UgKGJhc2UpOworICBndWludCBudW1fc2FtcGxlczsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCwgc3RyZWFtX3RpbWU7CisgIEdzdE1hcEluZm8gbWFwOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpOworICBzdHJlYW1fdGltZSA9CisgICAgICBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJmJhc2UtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgdGltZXN0YW1wKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsICJzeW5jIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtX3RpbWUpKQorICAgIGdzdF9vYmplY3Rfc3luY192YWx1ZXMgKEdTVF9PQkpFQ1QgKGZpbHRlciksIHN0cmVhbV90aW1lKTsKKworICBpZiAoR19VTkxJS0VMWSAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfR0FQKSkpCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgbnVtX3NhbXBsZXMgPSBtYXAuc2l6ZSAvIEdTVF9BVURJT19GSUxURVJfQlBTIChmaWx0ZXIpOworCisgIGZpbHRlci0+cHJvY2VzcyAoZmlsdGVyLCBtYXAuZGF0YSwgbnVtX3NhbXBsZXMpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9rYXJhb2tlLmggYi9nc3QvYXVkaW9meC9hdWRpb2thcmFva2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzkxZWZjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvYXVkaW9rYXJhb2tlLmgKQEAgLTAsMCArMSw2NyBAQAorLyogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfQVVESU9fS0FSQU9LRV9IX18KKyNkZWZpbmUgX19HU1RfQVVESU9fS0FSQU9LRV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfQVVESU9fS0FSQU9LRSAgICAgICAgICAgIChnc3RfYXVkaW9fa2FyYW9rZV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVVESU9fS0FSQU9LRShvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0FVRElPX0tBUkFPS0UsR3N0QXVkaW9LYXJhb2tlKSkKKyNkZWZpbmUgR1NUX0lTX0FVRElPX0tBUkFPS0Uob2JqKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9BVURJT19LQVJBT0tFKSkKKyNkZWZpbmUgR1NUX0FVRElPX0tBUkFPS0VfQ0xBU1Moa2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpICxHU1RfVFlQRV9BVURJT19LQVJBT0tFLEdzdEF1ZGlvS2FyYW9rZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FVRElPX0tBUkFPS0VfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpICxHU1RfVFlQRV9BVURJT19LQVJBT0tFKSkKKyNkZWZpbmUgR1NUX0FVRElPX0tBUkFPS0VfR0VUX0NMQVNTKG9iaikgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTKChvYmopICxHU1RfVFlQRV9BVURJT19LQVJBT0tFLEdzdEF1ZGlvS2FyYW9rZUNsYXNzKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdWRpb0thcmFva2UgR3N0QXVkaW9LYXJhb2tlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1ZGlvS2FyYW9rZUNsYXNzIEdzdEF1ZGlvS2FyYW9rZUNsYXNzOworCit0eXBlZGVmIHZvaWQgKCpHc3RBdWRpb0thcmFva2VQcm9jZXNzRnVuYykgKEdzdEF1ZGlvS2FyYW9rZSAqLCBndWludDggKiwgZ3VpbnQpOworCitzdHJ1Y3QgX0dzdEF1ZGlvS2FyYW9rZQoreworICBHc3RBdWRpb0ZpbHRlciBhdWRpb2ZpbHRlcjsKKworICAvKiBwcm9wZXJ0aWVzICovCisgIGdmbG9hdCBsZXZlbDsKKyAgZ2Zsb2F0IG1vbm9fbGV2ZWw7CisgIGdmbG9hdCBmaWx0ZXJfYmFuZDsKKyAgZ2Zsb2F0IGZpbHRlcl93aWR0aDsKKworICAvKiBmaWx0ZXIgY29lZiAqLworICBnZmxvYXQgQSwgQiwgQzsKKyAgZ2Zsb2F0IHkxLCB5MjsKKworICAvKiA8IHByaXZhdGUgPiAqLworICBHc3RBdWRpb0thcmFva2VQcm9jZXNzRnVuYyBwcm9jZXNzOworfTsKKworc3RydWN0IF9Hc3RBdWRpb0thcmFva2VDbGFzcworeworICBHc3RBdWRpb0ZpbHRlckNsYXNzIHBhcmVudDsKK307CisKK0dUeXBlIGdzdF9hdWRpb19rYXJhb2tlX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9BVURJT19LQVJBT0tFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jIGIvZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MDE0NjQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hLmMKQEAgLTAsMCArMSw1MzMgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWF1ZGlvcGFub3JhbWEKKyAqCisgKiBTdGVyZW8gcGFub3JhbWEgZWZmZWN0IHdpdGggY29udHJvbGxhYmxlIHBhbiBwb3NpdGlvbi4gT25lIGNhbiBjaG9vc2UgYmV0d2VlbiB0aGUgZGVmYXVsdCBwc3ljaG9hY291c3RpYyBwYW5uaW5nIG1ldGhvZCwKKyAqIHdoaWNoIGtlZXBzIHRoZSBzYW1lIHBlcmNlaXZlZCBsb3VkbmVzcywgYW5kIGEgc2ltcGxlIHBhbm5pbmcgbWV0aG9kIHRoYXQganVzdCBjb250cm9scyB0aGUgdm9sdW1lIG9uIG9uZSBjaGFubmVsLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBhdWRpb3Rlc3RzcmMgd2F2ZT1zYXcgISBhdWRpb3Bhbm9yYW1hIHBhbm9yYW1hPS0xLjAwICEgYWxzYXNpbmsKKyAqIGdzdC1sYXVuY2gtMS4wIGZpbGVzcmMgbG9jYXRpb249Im1lbG8xLm9nZyIgISBvZ2dkZW11eCAhIHZvcmJpc2RlYyAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcGFub3JhbWEgcGFub3JhbWE9LTEuMDAgISBhbHNhc2luaworICogZ3N0LWxhdW5jaC0xLjAgYXVkaW90ZXN0c3JjIHdhdmU9c2F3ICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9wYW5vcmFtYSBwYW5vcmFtYT0tMS4wMCAhIGF1ZGlvY29udmVydCAhIGFsc2FzaW5rCisgKiBnc3QtbGF1bmNoLTEuMCBhdWRpb3Rlc3RzcmMgd2F2ZT1zYXcgISBhdWRpb2NvbnZlcnQgISBhdWRpb3Bhbm9yYW1hIG1ldGhvZD1zaW1wbGUgcGFub3JhbWE9LTAuNTAgISBhdWRpb2NvbnZlcnQgISBhbHNhc2luaworICogXXwKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorCisjaWZkZWYgSEFWRV9PUkMKKyNpbmNsdWRlIDxvcmMvb3JjZnVuY3Rpb25zLmg+CisjZWxzZQorI2RlZmluZSBvcmNfbWVtc2V0IG1lbXNldAorI2VuZGlmCisKKyNpbmNsdWRlICJhdWRpb3Bhbm9yYW1hLmgiCisjaW5jbHVkZSAiYXVkaW9wYW5vcmFtYW9yYy5oIgorCisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfYXVkaW9fcGFub3JhbWFfZGVidWcKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKEdTVF9DQVRfREVGQVVMVCk7CisKKy8qIEZpbHRlciBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9QQU5PUkFNQSwKKyAgUFJPUF9NRVRIT0QKK307CisKKyNkZWZpbmUgR1NUX1RZUEVfQVVESU9fUEFOT1JBTUFfTUVUSE9EIChnc3RfYXVkaW9fcGFub3JhbWFfbWV0aG9kX2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3RfYXVkaW9fcGFub3JhbWFfbWV0aG9kX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgZ3R5cGUgPSAwOworCisgIGlmIChndHlwZSA9PSAwKSB7CisgICAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAgICB7TUVUSE9EX1BTWUNIT0FDT1VTVElDLCAiUHN5Y2hvYWNvdXN0aWMgUGFubmluZyAoZGVmYXVsdCkiLAorICAgICAgICAgICJwc3ljaG9hY291c3RpYyJ9LAorICAgICAge01FVEhPRF9TSU1QTEUsICJTaW1wbGUgUGFubmluZyIsICJzaW1wbGUifSwKKyAgICAgIHswLCBOVUxMLCBOVUxMfQorICAgIH07CisKKyAgICBndHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RBdWRpb1Bhbm9yYW1hTWV0aG9kIiwgdmFsdWVzKTsKKyAgfQorICByZXR1cm4gZ3R5cGU7Cit9CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgIiBHU1RfQVVESU9fTkUgKEYzMikgIiwgIiBHU1RfQVVESU9fTkUgKFMxNikgIn0sICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgeyAiIEdTVF9BVURJT19ORSAoRjMyKSAiLCAiIEdTVF9BVURJT19ORSAoUzE2KSAifSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIgImNoYW5uZWxzID0gKGludCkgMiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQiKQorICAgICk7CisKK0dfREVGSU5FX1RZUEUgKEdzdEF1ZGlvUGFub3JhbWEsIGdzdF9hdWRpb19wYW5vcmFtYSwgR1NUX1RZUEVfQkFTRV9UUkFOU0ZPUk0pOworCitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fcGFub3JhbWFfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX3Bhbm9yYW1hX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hdWRpb19wYW5vcmFtYV9nZXRfdW5pdF9zaXplIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwKKyAgICBHc3RDYXBzICogY2FwcywgZ3NpemUgKiBzaXplKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtX2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLAorICAgIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdENhcHMgKiBjYXBzLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9fcGFub3JhbWFfc2V0X2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLAorICAgIEdzdENhcHMgKiBpbmNhcHMsIEdzdENhcHMgKiBvdXRjYXBzKTsKKworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX3Bhbm9yYW1hX20yc19pbnQgKGdmbG9hdCBwYW4sCisgICAgZ2ludDE2ICogaWRhdGEsIGdpbnQxNiAqIG9kYXRhLCBndWludCBudW1fc2FtcGxlcyk7CitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fcGFub3JhbWFfczJzX2ludCAoZ2Zsb2F0IHBhbiwKKyAgICBnaW50MTYgKiBpZGF0YSwgZ2ludDE2ICogb2RhdGEsIGd1aW50IG51bV9zYW1wbGVzKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19wYW5vcmFtYV9tMnNfZmxvYXQgKGdmbG9hdCBwYW4sCisgICAgZ2Zsb2F0ICogaWRhdGEsIGdmbG9hdCAqIG9kYXRhLCBndWludCBudW1fc2FtcGxlcyk7CitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fcGFub3JhbWFfczJzX2Zsb2F0IChnZmxvYXQgcGFuLAorICAgIGdmbG9hdCAqIGlkYXRhLCBnZmxvYXQgKiBvZGF0YSwgZ3VpbnQgbnVtX3NhbXBsZXMpOworCitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fcGFub3JhbWFfbTJzX2ludF9zaW1wbGUgKGdmbG9hdCBwYW4sCisgICAgZ2ludDE2ICogaWRhdGEsIGdpbnQxNiAqIG9kYXRhLCBndWludCBudW1fc2FtcGxlcyk7CitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fcGFub3JhbWFfczJzX2ludF9zaW1wbGUgKGdmbG9hdCBwYW4sCisgICAgZ2ludDE2ICogaWRhdGEsIGdpbnQxNiAqIG9kYXRhLCBndWludCBudW1fc2FtcGxlcyk7CitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fcGFub3JhbWFfbTJzX2Zsb2F0X3NpbXBsZSAoZ2Zsb2F0IHBhbiwKKyAgICBnZmxvYXQgKiBpZGF0YSwgZ2Zsb2F0ICogb2RhdGEsIGd1aW50IG51bV9zYW1wbGVzKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19wYW5vcmFtYV9zMnNfZmxvYXRfc2ltcGxlIChnZmxvYXQgcGFuLAorICAgIGdmbG9hdCAqIGlkYXRhLCBnZmxvYXQgKiBvZGF0YSwgZ3VpbnQgbnVtX3NhbXBsZXMpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwKKyAgICBHc3RCdWZmZXIgKiBpbmJ1ZiwgR3N0QnVmZmVyICogb3V0YnVmKTsKKworCisvKiBUYWJsZSB3aXRoIHByb2Nlc3NpbmcgZnVuY3Rpb25zOiBbY2hhbm5lbHNdW2Zvcm1hdF1bbWV0aG9kXSAqLworc3RhdGljIGNvbnN0IEdzdEF1ZGlvUGFub3JhbWFQcm9jZXNzRnVuYyBwYW5vcmFtYV9wcm9jZXNzX2Z1bmN0aW9uc1syXVsyXVsyXSA9IHsKKyAgeworICAgICAgICB7CisgICAgICAgICAgICAgIChHc3RBdWRpb1Bhbm9yYW1hUHJvY2Vzc0Z1bmMpIGdzdF9hdWRpb19wYW5vcmFtYV9tMnNfaW50LAorICAgICAgICAgICAgKEdzdEF1ZGlvUGFub3JhbWFQcm9jZXNzRnVuYykgZ3N0X2F1ZGlvX3Bhbm9yYW1hX20yc19pbnRfc2ltcGxlfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAoR3N0QXVkaW9QYW5vcmFtYVByb2Nlc3NGdW5jKSBnc3RfYXVkaW9fcGFub3JhbWFfbTJzX2Zsb2F0LAorICAgICAgICAgICAgKEdzdEF1ZGlvUGFub3JhbWFQcm9jZXNzRnVuYykgZ3N0X2F1ZGlvX3Bhbm9yYW1hX20yc19mbG9hdF9zaW1wbGV9CisgICAgICB9LAorICB7CisgICAgICAgIHsKKyAgICAgICAgICAgICAgKEdzdEF1ZGlvUGFub3JhbWFQcm9jZXNzRnVuYykgZ3N0X2F1ZGlvX3Bhbm9yYW1hX3Myc19pbnQsCisgICAgICAgICAgICAoR3N0QXVkaW9QYW5vcmFtYVByb2Nlc3NGdW5jKSBnc3RfYXVkaW9fcGFub3JhbWFfczJzX2ludF9zaW1wbGV9LAorICAgICAgICB7CisgICAgICAgICAgICAgIChHc3RBdWRpb1Bhbm9yYW1hUHJvY2Vzc0Z1bmMpIGdzdF9hdWRpb19wYW5vcmFtYV9zMnNfZmxvYXQsCisgICAgICAgICAgICAoR3N0QXVkaW9QYW5vcmFtYVByb2Nlc3NGdW5jKSBnc3RfYXVkaW9fcGFub3JhbWFfczJzX2Zsb2F0X3NpbXBsZX0KKyAgICAgIH0KK307CisKKy8qIEdPYmplY3Qgdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19wYW5vcmFtYV9jbGFzc19pbml0IChHc3RBdWRpb1Bhbm9yYW1hQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9hdWRpb19wYW5vcmFtYV9kZWJ1ZywgImF1ZGlvcGFub3JhbWEiLCAwLAorICAgICAgImF1ZGlvcGFub3JhbWEgZWxlbWVudCIpOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9fcGFub3JhbWFfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9fcGFub3JhbWFfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUEFOT1JBTUEsCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJwYW5vcmFtYSIsICJQYW5vcmFtYSIsCisgICAgICAgICAgIlBvc2l0aW9uIGluIHN0ZXJlbyBwYW5vcmFtYSAoLTEuMCBsZWZ0IC0+IDEuMCByaWdodCkiLCAtMS4wLCAxLjAsCisgICAgICAgICAgMC4wLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgLyoqCisgICAqIEdzdEF1ZGlvUGFub3JhbWE6bWV0aG9kOgorICAgKgorICAgKiBQYW5uaW5nIG1ldGhvZDogcHN5Y2hvYWNvdXN0aWMgbW9kZSBrZWVwcyB0aGUgc2FtZSBwZXJjZWl2ZWQgbG91ZG5lc3MsCisgICAqIHdoaWxlIHNpbXBsZSBtb2RlIGp1c3QgY29udHJvbHMgdGhlIHZvbHVtZSBvZiBvbmUgY2hhbm5lbC4gSXQncyBtZXJlbHkKKyAgICogYSBtYXR0ZXIgb2YgdGFzdGUgd2hpY2ggbWV0aG9kIHNob3VsZCBiZSBjaG9zZW4uIAorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NRVRIT0QsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoIm1ldGhvZCIsICJQYW5uaW5nIG1ldGhvZCIsCisgICAgICAgICAgIlBzeWNob2Fjb3VzdGljIG1vZGUga2VlcHMgc2FtZSBwZXJjZWl2ZWQgbG91ZG5lc3MsICIKKyAgICAgICAgICAic2ltcGxlIG1vZGUganVzdCBjb250cm9scyB2b2x1bWUgb2Ygb25lIGNoYW5uZWwuIiwKKyAgICAgICAgICBHU1RfVFlQRV9BVURJT19QQU5PUkFNQV9NRVRIT0QsIE1FVEhPRF9QU1lDSE9BQ09VU1RJQywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiU3RlcmVvIHBvc2l0aW9uaW5nIiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L0F1ZGlvIiwKKyAgICAgICJQb3NpdGlvbnMgYXVkaW8gc3RyZWFtcyBpbiB0aGUgc3RlcmVvIHBhbm9yYW1hIiwKKyAgICAgICJTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworCisgIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAoa2xhc3MpLT5nZXRfdW5pdF9zaXplID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVkaW9fcGFub3JhbWFfZ2V0X3VuaXRfc2l6ZSk7CisgIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAoa2xhc3MpLT50cmFuc2Zvcm1fY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybV9jYXBzKTsKKyAgR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChrbGFzcyktPnNldF9jYXBzID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVkaW9fcGFub3JhbWFfc2V0X2NhcHMpOworICBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKGtsYXNzKS0+dHJhbnNmb3JtID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19wYW5vcmFtYV9pbml0IChHc3RBdWRpb1Bhbm9yYW1hICogZmlsdGVyKQoreworCisgIGZpbHRlci0+cGFub3JhbWEgPSAwOworICBmaWx0ZXItPm1ldGhvZCA9IE1FVEhPRF9QU1lDSE9BQ09VU1RJQzsKKyAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoJmZpbHRlci0+aW5mbyk7CisgIGZpbHRlci0+cHJvY2VzcyA9IE5VTEw7CisKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9nYXBfYXdhcmUgKEdTVF9CQVNFX1RSQU5TRk9STSAoZmlsdGVyKSwgVFJVRSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1ZGlvX3Bhbm9yYW1hX3NldF9wcm9jZXNzX2Z1bmN0aW9uIChHc3RBdWRpb1Bhbm9yYW1hICogZmlsdGVyLAorICAgIEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIGdpbnQgY2hhbm5lbF9pbmRleCwgZm9ybWF0X2luZGV4LCBtZXRob2RfaW5kZXg7CisgIGNvbnN0IEdzdEF1ZGlvRm9ybWF0SW5mbyAqZmluZm8gPSBpbmZvLT5maW5mbzsKKworICAvKiBzZXQgcHJvY2Vzc2luZyBmdW5jdGlvbiAqLworICBjaGFubmVsX2luZGV4ID0gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKGluZm8pIC0gMTsKKyAgaWYgKGNoYW5uZWxfaW5kZXggPiAxIHx8IGNoYW5uZWxfaW5kZXggPCAwKSB7CisgICAgZmlsdGVyLT5wcm9jZXNzID0gTlVMTDsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBmb3JtYXRfaW5kZXggPSBHU1RfQVVESU9fRk9STUFUX0lORk9fSVNfRkxPQVQgKGZpbmZvKSA/IDEgOiAwOworICBtZXRob2RfaW5kZXggPSBmaWx0ZXItPm1ldGhvZDsKKworICBmaWx0ZXItPnByb2Nlc3MgPQorICAgICAgcGFub3JhbWFfcHJvY2Vzc19mdW5jdGlvbnNbY2hhbm5lbF9pbmRleF1bZm9ybWF0X2luZGV4XVttZXRob2RfaW5kZXhdOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19wYW5vcmFtYV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXVkaW9QYW5vcmFtYSAqZmlsdGVyID0gR1NUX0FVRElPX1BBTk9SQU1BIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QQU5PUkFNQToKKyAgICAgIGZpbHRlci0+cGFub3JhbWEgPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01FVEhPRDoKKyAgICAgIGZpbHRlci0+bWV0aG9kID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgZ3N0X2F1ZGlvX3Bhbm9yYW1hX3NldF9wcm9jZXNzX2Z1bmN0aW9uIChmaWx0ZXIsICZmaWx0ZXItPmluZm8pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX3Bhbm9yYW1hX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb1Bhbm9yYW1hICpmaWx0ZXIgPSBHU1RfQVVESU9fUEFOT1JBTUEgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BBTk9SQU1BOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBmaWx0ZXItPnBhbm9yYW1hKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NRVRIT0Q6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgZmlsdGVyLT5tZXRob2QpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBHc3RCYXNlVHJhbnNmb3JtIHZtZXRob2QgaW1wbGVtZW50YXRpb25zICovCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1ZGlvX3Bhbm9yYW1hX2dldF91bml0X3NpemUgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLCBHc3RDYXBzICogY2FwcywKKyAgICBnc2l6ZSAqIHNpemUpCit7CisgIEdzdEF1ZGlvSW5mbyBpbmZvOworCisgIGdfYXNzZXJ0IChzaXplKTsKKworICBpZiAoIWdzdF9hdWRpb19pbmZvX2Zyb21fY2FwcyAoJmluZm8sIGNhcHMpKQorICAgIHJldHVybiBGQUxTRTsKKworICAqc2l6ZSA9IEdTVF9BVURJT19JTkZPX0JQRiAoJmluZm8pOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtX2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLAorICAgIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdENhcHMgKiBjYXBzLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RDYXBzICpyZXM7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBnaW50IGk7CisKKyAgLyogcmVwbGFjZSB0aGUgY2hhbm5lbCBwcm9wZXJ0eSB3aXRoIG91ciByYW5nZS4gKi8KKyAgcmVzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgIGZvciAoaSA9IDA7IGkgPCBnc3RfY2Fwc19nZXRfc2l6ZSAocmVzKTsgaSsrKSB7CisgICAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAocmVzLCBpKTsKKyAgICBpZiAoZGlyZWN0aW9uID09IEdTVF9QQURfU1JDKSB7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGJhc2UsICJbJWRdIGFsbG93IDEtMiBjaGFubmVscyIsIGkpOworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHN0cnVjdHVyZSwgImNoYW5uZWxzIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCAyLCBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0lORk9fT0JKRUNUIChiYXNlLCAiWyVkXSBhbGxvdyAyIGNoYW5uZWxzIiwgaSk7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoc3RydWN0dXJlLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAyLCBOVUxMKTsKKyAgICB9CisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHN0cnVjdHVyZSwgImNoYW5uZWwtbWFzayIpOworICB9CisgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2UsICJ0cmFuc2Zvcm1lZCAlIiBHU1RfUFRSX0ZPUk1BVCwgcmVzKTsKKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZSwgIlVzaW5nIGZpbHRlciBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBmaWx0ZXIpOworICAgIGludGVyc2VjdGlvbiA9CisgICAgICAgIGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHJlcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmVzKTsKKyAgICByZXMgPSBpbnRlcnNlY3Rpb247CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZSwgIkludGVyc2VjdGlvbiAlIiBHU1RfUFRSX0ZPUk1BVCwgcmVzKTsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1ZGlvX3Bhbm9yYW1hX3NldF9jYXBzIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwgR3N0Q2FwcyAqIGluY2FwcywKKyAgICBHc3RDYXBzICogb3V0Y2FwcykKK3sKKyAgR3N0QXVkaW9QYW5vcmFtYSAqZmlsdGVyID0gR1NUX0FVRElPX1BBTk9SQU1BIChiYXNlKTsKKyAgR3N0QXVkaW9JbmZvIGluZm87CisKKyAgLypHU1RfSU5GTyAoImluY2FwcyBhcmUgJSIgR1NUX1BUUl9GT1JNQVQsIGluY2Fwcyk7ICovCisgIGlmICghZ3N0X2F1ZGlvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgaW5jYXBzKSkKKyAgICBnb3RvIG5vX2Zvcm1hdDsKKworICBHU1RfREVCVUcgKCJ0cnkgdG8gcHJvY2VzcyAlZCBpbnB1dCB3aXRoICVkIGNoYW5uZWxzIiwKKyAgICAgIEdTVF9BVURJT19JTkZPX0ZPUk1BVCAoJmluZm8pLCBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJmluZm8pKTsKKworICBpZiAoIWdzdF9hdWRpb19wYW5vcmFtYV9zZXRfcHJvY2Vzc19mdW5jdGlvbiAoZmlsdGVyLCAmaW5mbykpCisgICAgZ290byBub19mb3JtYXQ7CisKKyAgZmlsdGVyLT5pbmZvID0gaW5mbzsKKworICByZXR1cm4gVFJVRTsKKworbm9fZm9ybWF0OgorICB7CisgICAgR1NUX0RFQlVHICgiaW52YWxpZCBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qIHBzeWNob2Fjb3VzdGljIHByb2Nlc3NpbmcgZnVuY3Rpb25zICovCisKKy8qIG1vbm8gdG8gc3RlcmVvIHBhbm5pbmcKKyAqIHBhbjogLTEuMCAgMC4wICAxLjAKKyAqIGw6ICAgIDEuMCAgMC41ICAwLjAgIAorICogcjogICAgMC4wICAwLjUgIDEuMAorICoKKyAqIEZJWE1FOiB3ZSBzaG91bGQgdXNlIC0zZGIgKDEvc3F0cigyKSkgZm9yIDUwOjUwCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fcGFub3JhbWFfbTJzX2ludCAoZ2Zsb2F0IHBhbiwgZ2ludDE2ICogaWRhdGEsIGdpbnQxNiAqIG9kYXRhLCBndWludCBuKQoreworICBnZmxvYXQgciA9IChwYW4gKyAxLjApIC8gMi4wOworICBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX3BzeSAob2RhdGEsIGlkYXRhLCAxLjAgLSByLCByLCBuKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19wYW5vcmFtYV9tMnNfZmxvYXQgKGdmbG9hdCBwYW4sIGdmbG9hdCAqIGlkYXRhLAorICAgIGdmbG9hdCAqIG9kYXRhLCBndWludCBuKQoreworICBnZmxvYXQgciA9IChwYW4gKyAxLjApIC8gMi4wOworICBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX3BzeSAob2RhdGEsIGlkYXRhLCAxLjAgLSByLCByLCBuKTsKK30KKworLyogc3RlcmVvIGJhbGFuY2UKKyAqIHBhbjogLTEuMCAgMC4wICAxLjAKKyAqIGxsOiAgIDEuMCAgMS4wICAwLjAKKyAqIGxyOiAgIDEuMCAgMC4wICAwLjAKKyAqIHJyOiAgIDAuMCAgMS4wICAxLjAKKyAqIHJsOiAgIDAuMCAgMC4wICAxLjAKKyAqLworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19wYW5vcmFtYV9zMnNfaW50IChnZmxvYXQgcGFuLCBnaW50MTYgKiBpZGF0YSwgZ2ludDE2ICogb2RhdGEsIGd1aW50IG4pCit7CisgIGlmIChwYW4gPT0gMC4wKSB7CisgICAgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9ub25lIChvZGF0YSwgaWRhdGEsIG4pOworICB9IGVsc2UgaWYgKHBhbiA+IDAuMCkgeworICAgIGdmbG9hdCBybCA9IHBhbjsKKyAgICBnZmxvYXQgbGwgPSAxLjAgLSBybDsKKyAgICBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3BzeV9yaWdodCAob2RhdGEsIGlkYXRhLCBsbCwgcmwsIG4pOworICB9IGVsc2UgeworICAgIGdmbG9hdCByciA9IDEuMCArIHBhbjsKKyAgICBnZmxvYXQgbHIgPSAxLjAgLSBycjsKKyAgICBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3BzeV9sZWZ0IChvZGF0YSwgaWRhdGEsIGxyLCByciwgbik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19wYW5vcmFtYV9zMnNfZmxvYXQgKGdmbG9hdCBwYW4sIGdmbG9hdCAqIGlkYXRhLAorICAgIGdmbG9hdCAqIG9kYXRhLCBndWludCBuKQoreworICBpZiAocGFuID09IDAuMCkgeworICAgIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfbm9uZSAob2RhdGEsIGlkYXRhLCBuKTsKKyAgfSBlbHNlIGlmIChwYW4gPiAwLjApIHsKKyAgICBnZmxvYXQgcmwgPSBwYW47CisgICAgZ2Zsb2F0IGxsID0gMS4wIC0gcmw7CisgICAgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9wc3lfcmlnaHQgKG9kYXRhLCBpZGF0YSwgbGwsIHJsLCBuKTsKKyAgfSBlbHNlIHsKKyAgICBnZmxvYXQgcnIgPSAxLjAgKyBwYW47CisgICAgZ2Zsb2F0IGxyID0gMS4wIC0gcnI7CisgICAgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9wc3lfbGVmdCAob2RhdGEsIGlkYXRhLCBsciwgcnIsIG4pOworICB9Cit9CisKKy8qIHNpbXBsZSBwcm9jZXNzaW5nIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX3Bhbm9yYW1hX20yc19pbnRfc2ltcGxlIChnZmxvYXQgcGFuLCBnaW50MTYgKiBpZGF0YSwKKyAgICBnaW50MTYgKiBvZGF0YSwgZ3VpbnQgbikKK3sKKyAgaWYgKHBhbiA9PSAwLjApIHsKKyAgICBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX25vbmUgKG9kYXRhLCBpZGF0YSwgbik7CisgIH0gZWxzZSBpZiAocGFuID4gMC4wKSB7CisgICAgZ2Zsb2F0IGxwYW4gPSAxLjAgLSBwYW47CisgICAgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9zaW1fbGVmdCAob2RhdGEsIGlkYXRhLCBscGFuLCBuKTsKKyAgfSBlbHNlIHsKKyAgICBnZmxvYXQgcnBhbiA9IDEuMCArIHBhbjsKKyAgICBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX3NpbV9yaWdodCAob2RhdGEsIGlkYXRhLCBycGFuLCBuKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX3Bhbm9yYW1hX3Myc19pbnRfc2ltcGxlIChnZmxvYXQgcGFuLCBnaW50MTYgKiBpZGF0YSwKKyAgICBnaW50MTYgKiBvZGF0YSwgZ3VpbnQgbikKK3sKKyAgaWYgKHBhbiA9PSAwLjApIHsKKyAgICBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX25vbmUgKG9kYXRhLCBpZGF0YSwgbik7CisgIH0gZWxzZSBpZiAocGFuID4gMC4wKSB7CisgICAgZ2Zsb2F0IGxwYW4gPSAxLjAgLSBwYW47CisgICAgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9zaW1fbGVmdCAob2RhdGEsIGlkYXRhLCBscGFuLCBuKTsKKyAgfSBlbHNlIHsKKyAgICBnZmxvYXQgcnBhbiA9IDEuMCArIHBhbjsKKyAgICBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3NpbV9yaWdodCAob2RhdGEsIGlkYXRhLCBycGFuLCBuKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX3Bhbm9yYW1hX20yc19mbG9hdF9zaW1wbGUgKGdmbG9hdCBwYW4sIGdmbG9hdCAqIGlkYXRhLAorICAgIGdmbG9hdCAqIG9kYXRhLCBndWludCBuKQoreworICBpZiAocGFuID09IDAuMCkgeworICAgIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfbm9uZSAob2RhdGEsIGlkYXRhLCBuKTsKKyAgfSBlbHNlIGlmIChwYW4gPiAwLjApIHsKKyAgICBnZmxvYXQgbHBhbiA9IDEuMCAtIHBhbjsKKyAgICBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX3NpbV9sZWZ0IChvZGF0YSwgaWRhdGEsIGxwYW4sIG4pOworICB9IGVsc2UgeworICAgIGdmbG9hdCBycGFuID0gMS4wICsgcGFuOworICAgIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfc2ltX3JpZ2h0IChvZGF0YSwgaWRhdGEsIHJwYW4sIG4pOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fcGFub3JhbWFfczJzX2Zsb2F0X3NpbXBsZSAoZ2Zsb2F0IHBhbiwgZ2Zsb2F0ICogaWRhdGEsCisgICAgZ2Zsb2F0ICogb2RhdGEsIGd1aW50IG4pCit7CisgIGlmIChwYW4gPT0gMC4wKSB7CisgICAgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9ub25lIChvZGF0YSwgaWRhdGEsIG4pOworICB9IGVsc2UgaWYgKHBhbiA+IDAuMCkgeworICAgIGdmbG9hdCBscGFuID0gMS4wIC0gcGFuOworICAgIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfc2ltX2xlZnQgKG9kYXRhLCBpZGF0YSwgbHBhbiwgbik7CisgIH0gZWxzZSB7CisgICAgZ2Zsb2F0IHJwYW4gPSAxLjAgKyBwYW47CisgICAgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9zaW1fcmlnaHQgKG9kYXRhLCBpZGF0YSwgcnBhbiwgbik7CisgIH0KK30KKworLyogdGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBhY3R1YWwgcHJvY2Vzc2luZworICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybSAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UsIEdzdEJ1ZmZlciAqIGluYnVmLAorICAgIEdzdEJ1ZmZlciAqIG91dGJ1ZikKK3sKKyAgR3N0QXVkaW9QYW5vcmFtYSAqZmlsdGVyID0gR1NUX0FVRElPX1BBTk9SQU1BIChiYXNlKTsKKyAgR3N0Q2xvY2tUaW1lIHRzOworICBHc3RNYXBJbmZvIGlubWFwLCBvdXRtYXA7CisKKyAgdHMgPSBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJmJhc2UtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZikpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAodHMpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAic3luYyB0byAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHRzKSk7CisgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoZmlsdGVyKSwgdHMpOworICB9CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZiwgJm91dG1hcCwgR1NUX01BUF9XUklURSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGluYnVmLCBHU1RfQlVGRkVSX0ZMQUdfR0FQKSkpIHsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19HQVApOworICAgIG9yY19tZW1zZXQgKG91dG1hcC5kYXRhLCAwLCBvdXRtYXAuc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgLyogb3V0cHV0IGlzIGFsd2F5cyBzdGVyZW8sIGlucHV0IGlzIG1vbm8gb3Igc3RlcmVvLAorICAgICAqIGFuZCBpbmZvIGRlc2NyaWJlcyBpbnB1dCBmb3JtYXQgKi8KKyAgICBndWludCBudW1fc2FtcGxlcyA9IG91dG1hcC5zaXplIC8gKDIgKiBHU1RfQVVESU9fSU5GT19CUFMgKCZmaWx0ZXItPmluZm8pKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZiwgJmlubWFwLCBHU1RfTUFQX1JFQUQpOworICAgIGZpbHRlci0+cHJvY2VzcyAoZmlsdGVyLT5wYW5vcmFtYSwgaW5tYXAuZGF0YSwgb3V0bWFwLmRhdGEsIG51bV9zYW1wbGVzKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZiwgJmlubWFwKTsKKyAgfQorCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm91dG1hcCk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5oIGIvZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZDFjZWMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hLmgKQEAgLTAsMCArMSw2OCBAQAorLyogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyAKKyNpZm5kZWYgX19HU1RfQVVESU9fUEFOT1JBTUFfSF9fCisjZGVmaW5lIF9fR1NUX0FVRElPX1BBTk9SQU1BX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0FVRElPX1BBTk9SQU1BICAgICAgICAgICAgKGdzdF9hdWRpb19wYW5vcmFtYV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVVESU9fUEFOT1JBTUEob2JqKSAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9BVURJT19QQU5PUkFNQSxHc3RBdWRpb1Bhbm9yYW1hKSkKKyNkZWZpbmUgR1NUX0lTX0FVRElPX1BBTk9SQU1BKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQVVESU9fUEFOT1JBTUEpKQorI2RlZmluZSBHU1RfQVVESU9fUEFOT1JBTUFfQ0xBU1Moa2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpICxHU1RfVFlQRV9BVURJT19QQU5PUkFNQSxHc3RBdWRpb1Bhbm9yYW1hQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fUEFOT1JBTUFfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpICxHU1RfVFlQRV9BVURJT19QQU5PUkFNQSkpCisjZGVmaW5lIEdTVF9BVURJT19QQU5PUkFNQV9HRVRfQ0xBU1Mob2JqKSAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MoKG9iaikgLEdTVF9UWVBFX0FVRElPX1BBTk9SQU1BLEdzdEF1ZGlvUGFub3JhbWFDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdWRpb1Bhbm9yYW1hICAgICAgR3N0QXVkaW9QYW5vcmFtYTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdWRpb1Bhbm9yYW1hQ2xhc3MgR3N0QXVkaW9QYW5vcmFtYUNsYXNzOworCit0eXBlZGVmIHZvaWQgKCpHc3RBdWRpb1Bhbm9yYW1hUHJvY2Vzc0Z1bmMpKGdmbG9hdCwgZ3VpbnQ4KiwgZ3VpbnQ4KiwgZ3VpbnQpOworCit0eXBlZGVmIGVudW0KK3sKKyAgTUVUSE9EX1BTWUNIT0FDT1VTVElDID0gMCwKKyAgTUVUSE9EX1NJTVBMRQorfSBHc3RBdWRpb1Bhbm9yYW1hTWV0aG9kOworCitzdHJ1Y3QgX0dzdEF1ZGlvUGFub3JhbWEgeworICBHc3RCYXNlVHJhbnNmb3JtIGVsZW1lbnQ7CisKKyAgLyogcHJvcGVydGllcyAqLworICBnZmxvYXQgcGFub3JhbWE7CisgIEdzdEF1ZGlvUGFub3JhbWFNZXRob2QgbWV0aG9kOworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIEdzdEF1ZGlvUGFub3JhbWFQcm9jZXNzRnVuYyBwcm9jZXNzOworICBHc3RBdWRpb0luZm8gaW5mbzsKK307CisKK3N0cnVjdCBfR3N0QXVkaW9QYW5vcmFtYUNsYXNzIHsKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9hdWRpb19wYW5vcmFtYV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9BVURJT19QQU5PUkFNQV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWFvcmMtZGlzdC5jIGIvZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYW9yYy1kaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZkNjg2MQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWFvcmMtZGlzdC5jCkBAIC0wLDAgKzEsMzk3NyBAQAorCisvKiBhdXRvZ2VuZXJhdGVkIGZyb20gYXVkaW9wYW5vcmFtYW9yYy5vcmMgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPGdsaWIuaD4KKworI2lmbmRlZiBfT1JDX0lOVEVHRVJfVFlQRURFRlNfCisjZGVmaW5lIF9PUkNfSU5URUdFUl9UWVBFREVGU18KKyNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorI2luY2x1ZGUgPHN0ZGludC5oPgordHlwZWRlZiBpbnQ4X3Qgb3JjX2ludDg7Cit0eXBlZGVmIGludDE2X3Qgb3JjX2ludDE2OwordHlwZWRlZiBpbnQzMl90IG9yY19pbnQzMjsKK3R5cGVkZWYgaW50NjRfdCBvcmNfaW50NjQ7Cit0eXBlZGVmIHVpbnQ4X3Qgb3JjX3VpbnQ4OwordHlwZWRlZiB1aW50MTZfdCBvcmNfdWludDE2OwordHlwZWRlZiB1aW50MzJfdCBvcmNfdWludDMyOwordHlwZWRlZiB1aW50NjRfdCBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgVUlOVDY0X0MoeCkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCit0eXBlZGVmIHNpZ25lZCBfX2ludDggb3JjX2ludDg7Cit0eXBlZGVmIHNpZ25lZCBfX2ludDE2IG9yY19pbnQxNjsKK3R5cGVkZWYgc2lnbmVkIF9faW50MzIgb3JjX2ludDMyOwordHlwZWRlZiBzaWduZWQgX19pbnQ2NCBvcmNfaW50NjQ7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50OCBvcmNfdWludDg7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50MTYgb3JjX3VpbnQxNjsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQzMiBvcmNfdWludDMyOwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSAoeCMjVWk2NCkKKyNkZWZpbmUgaW5saW5lIF9faW5saW5lCisjZWxzZQorI2luY2x1ZGUgPGxpbWl0cy5oPgordHlwZWRlZiBzaWduZWQgY2hhciBvcmNfaW50ODsKK3R5cGVkZWYgc2hvcnQgb3JjX2ludDE2OwordHlwZWRlZiBpbnQgb3JjX2ludDMyOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIG9yY191aW50ODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgb3JjX3VpbnQxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IG9yY191aW50MzI7CisjaWYgSU5UX01BWCA9PSBMT05HX01BWAordHlwZWRlZiBsb25nIGxvbmcgb3JjX2ludDY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgb3JjX3VpbnQ2NDsKKyNkZWZpbmUgT1JDX1VJTlQ2NF9DKHgpICh4IyNVTEwpCisjZWxzZQordHlwZWRlZiBsb25nIG9yY19pbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgKHgjI1VMKQorI2VuZGlmCisjZW5kaWYKK3R5cGVkZWYgdW5pb24KK3sKKyAgb3JjX2ludDE2IGk7CisgIG9yY19pbnQ4IHgyWzJdOworfSBvcmNfdW5pb24xNjsKK3R5cGVkZWYgdW5pb24KK3sKKyAgb3JjX2ludDMyIGk7CisgIGZsb2F0IGY7CisgIG9yY19pbnQxNiB4MlsyXTsKKyAgb3JjX2ludDggeDRbNF07Cit9IG9yY191bmlvbjMyOwordHlwZWRlZiB1bmlvbgoreworICBvcmNfaW50NjQgaTsKKyAgZG91YmxlIGY7CisgIG9yY19pbnQzMiB4MlsyXTsKKyAgZmxvYXQgeDJmWzJdOworICBvcmNfaW50MTYgeDRbNF07Cit9IG9yY191bmlvbjY0OworI2VuZGlmCisjaWZuZGVmIE9SQ19SRVNUUklDVAorI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjZGVmaW5lIE9SQ19SRVNUUklDVCByZXN0cmljdAorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNAorI2RlZmluZSBPUkNfUkVTVFJJQ1QgX19yZXN0cmljdF9fCisjZWxzZQorI2RlZmluZSBPUkNfUkVTVFJJQ1QKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgT1JDX0lOVEVSTkFMCisjaWYgZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU5MCkKKyNkZWZpbmUgT1JDX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNlbGlmIGRlZmluZWQoX19TVU5QUk9fQykgJiYgKF9fU1VOUFJPX0MgPj0gMHg1NTApCisjZGVmaW5lIE9SQ19JTlRFUk5BTCBfX2hpZGRlbgorI2VsaWYgZGVmaW5lZCAoX19HTlVDX18pCisjZGVmaW5lIE9SQ19JTlRFUk5BTCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisjZWxzZQorI2RlZmluZSBPUkNfSU5URVJOQUwKKyNlbmRpZgorI2VuZGlmCisKKworI2lmbmRlZiBESVNBQkxFX09SQworI2luY2x1ZGUgPG9yYy9vcmMuaD4KKyNlbmRpZgordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX25vbmUgKGdpbnQxNiAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnaW50MTYgKiBPUkNfUkVTVFJJQ1QgczEsIGludCBuKTsKK3ZvaWQgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9ub25lIChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfbm9uZSAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgaW50IG4pOwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX25vbmUgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGludCBuKTsKK3ZvaWQgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9wc3kgKGdpbnQxNiAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnaW50MTYgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBmbG9hdCBwMiwgaW50IG4pOwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX3BzeSAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdmbG9hdCAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGZsb2F0IHAyLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfcHN5X3JpZ2h0IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKTsKK3ZvaWQgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9wc3lfbGVmdCAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGZsb2F0IHAyLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfcHN5X3JpZ2h0IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKTsKK3ZvaWQgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9wc3lfbGVmdCAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdmbG9hdCAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGZsb2F0IHAyLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfc2ltX3JpZ2h0IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pOwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX3NpbV9sZWZ0IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pOwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3NpbV9yaWdodCAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGludCBuKTsKK3ZvaWQgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9zaW1fbGVmdCAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGludCBuKTsKK3ZvaWQgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fcmlnaHQgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfc2ltX2xlZnQgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfc2ltX3JpZ2h0IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pOwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3NpbV9sZWZ0IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pOworCisKKy8qIGJlZ2luIE9yYyBDIHRhcmdldCBwcmVhbWJsZSAqLworI2RlZmluZSBPUkNfQ0xBTVAoeCxhLGIpICgoeCk8KGEpID8gKGEpIDogKCh4KT4oYikgPyAoYikgOiAoeCkpKQorI2RlZmluZSBPUkNfQUJTKGEpICgoYSk8MCA/IC0oYSkgOiAoYSkpCisjZGVmaW5lIE9SQ19NSU4oYSxiKSAoKGEpPChiKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgT1JDX01BWChhLGIpICgoYSk+KGIpID8gKGEpIDogKGIpKQorI2RlZmluZSBPUkNfU0JfTUFYIDEyNworI2RlZmluZSBPUkNfU0JfTUlOICgtMS1PUkNfU0JfTUFYKQorI2RlZmluZSBPUkNfVUJfTUFYIChvcmNfdWludDgpIDI1NQorI2RlZmluZSBPUkNfVUJfTUlOIDAKKyNkZWZpbmUgT1JDX1NXX01BWCAzMjc2NworI2RlZmluZSBPUkNfU1dfTUlOICgtMS1PUkNfU1dfTUFYKQorI2RlZmluZSBPUkNfVVdfTUFYIChvcmNfdWludDE2KTY1NTM1CisjZGVmaW5lIE9SQ19VV19NSU4gMAorI2RlZmluZSBPUkNfU0xfTUFYIDIxNDc0ODM2NDcKKyNkZWZpbmUgT1JDX1NMX01JTiAoLTEtT1JDX1NMX01BWCkKKyNkZWZpbmUgT1JDX1VMX01BWCA0Mjk0OTY3Mjk1VQorI2RlZmluZSBPUkNfVUxfTUlOIDAKKyNkZWZpbmUgT1JDX0NMQU1QX1NCKHgpIE9SQ19DTEFNUCh4LE9SQ19TQl9NSU4sT1JDX1NCX01BWCkKKyNkZWZpbmUgT1JDX0NMQU1QX1VCKHgpIE9SQ19DTEFNUCh4LE9SQ19VQl9NSU4sT1JDX1VCX01BWCkKKyNkZWZpbmUgT1JDX0NMQU1QX1NXKHgpIE9SQ19DTEFNUCh4LE9SQ19TV19NSU4sT1JDX1NXX01BWCkKKyNkZWZpbmUgT1JDX0NMQU1QX1VXKHgpIE9SQ19DTEFNUCh4LE9SQ19VV19NSU4sT1JDX1VXX01BWCkKKyNkZWZpbmUgT1JDX0NMQU1QX1NMKHgpIE9SQ19DTEFNUCh4LE9SQ19TTF9NSU4sT1JDX1NMX01BWCkKKyNkZWZpbmUgT1JDX0NMQU1QX1VMKHgpIE9SQ19DTEFNUCh4LE9SQ19VTF9NSU4sT1JDX1VMX01BWCkKKyNkZWZpbmUgT1JDX1NXQVBfVyh4KSAoKCgoeCkmMHhmZlUpPDw4KSB8ICgoKHgpJjB4ZmYwMFUpPj44KSkKKyNkZWZpbmUgT1JDX1NXQVBfTCh4KSAoKCgoeCkmMHhmZlUpPDwyNCkgfCAoKCh4KSYweGZmMDBVKTw8OCkgfCAoKCh4KSYweGZmMDAwMFUpPj44KSB8ICgoKHgpJjB4ZmYwMDAwMDBVKT4+MjQpKQorI2RlZmluZSBPUkNfU1dBUF9RKHgpICgoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZikpPDw1NikgfCAoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZjAwKSk8PDQwKSB8ICgoKHgpJk9SQ19VSU5UNjRfQygweGZmMDAwMCkpPDwyNCkgfCAoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZjAwMDAwMCkpPDw4KSB8ICgoKHgpJk9SQ19VSU5UNjRfQygweGZmMDAwMDAwMDApKT4+OCkgfCAoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZjAwMDAwMDAwMDApKT4+MjQpIHwgKCgoeCkmT1JDX1VJTlQ2NF9DKDB4ZmYwMDAwMDAwMDAwMDApKT4+NDApIHwgKCgoeCkmT1JDX1VJTlQ2NF9DKDB4ZmYwMDAwMDAwMDAwMDAwMCkpPj41NikpCisjZGVmaW5lIE9SQ19QVFJfT0ZGU0VUKHB0cixvZmZzZXQpICgodm9pZCAqKSgoKHVuc2lnbmVkIGNoYXIgKikocHRyKSkgKyAob2Zmc2V0KSkpCisjZGVmaW5lIE9SQ19ERU5PUk1BTCh4KSAoKHgpICYgKCgoKHgpJjB4N2Y4MDAwMDApID09IDApID8gMHhmZjgwMDAwMCA6IDB4ZmZmZmZmZmYpKQorI2RlZmluZSBPUkNfSVNOQU4oeCkgKCgoKHgpJjB4N2Y4MDAwMDApID09IDB4N2Y4MDAwMDApICYmICgoKHgpJjB4MDA3ZmZmZmYpICE9IDApKQorI2RlZmluZSBPUkNfREVOT1JNQUxfRE9VQkxFKHgpICgoeCkgJiAoKCgoeCkmT1JDX1VJTlQ2NF9DKDB4N2ZmMDAwMDAwMDAwMDAwMCkpID09IDApID8gT1JDX1VJTlQ2NF9DKDB4ZmZmMDAwMDAwMDAwMDAwMCkgOiBPUkNfVUlOVDY0X0MoMHhmZmZmZmZmZmZmZmZmZmZmKSkpCisjZGVmaW5lIE9SQ19JU05BTl9ET1VCTEUoeCkgKCgoKHgpJk9SQ19VSU5UNjRfQygweDdmZjAwMDAwMDAwMDAwMDApKSA9PSBPUkNfVUlOVDY0X0MoMHg3ZmYwMDAwMDAwMDAwMDAwKSkgJiYgKCgoeCkmT1JDX1VJTlQ2NF9DKDB4MDAwZmZmZmZmZmZmZmZmZikpICE9IDApKQorI2lmbmRlZiBPUkNfUkVTVFJJQ1QKKyNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorI2RlZmluZSBPUkNfUkVTVFJJQ1QgcmVzdHJpY3QKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID49IDQKKyNkZWZpbmUgT1JDX1JFU1RSSUNUIF9fcmVzdHJpY3RfXworI2Vsc2UKKyNkZWZpbmUgT1JDX1JFU1RSSUNUCisjZW5kaWYKKyNlbmRpZgorLyogZW5kIE9yYyBDIHRhcmdldCBwcmVhbWJsZSAqLworCisKKworLyogYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9ub25lICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfbm9uZSAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjE2ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uMTYgdmFyMzI7CisgIG9yY191bmlvbjE2IHZhcjMzOworICBvcmNfdW5pb24zMiB2YXIzNDsKKworICBwdHIwID0gKG9yY191bmlvbjMyICopIGQxOworICBwdHI0ID0gKG9yY191bmlvbjE2ICopIHMxOworCisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWR3ICovCisgICAgdmFyMzIgPSBwdHI0W2ldOworICAgIC8qIDE6IGxvYWR3ICovCisgICAgdmFyMzMgPSBwdHI0W2ldOworICAgIC8qIDI6IG1lcmdld2wgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyMzIuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyMzMuaTsKKyAgICAgIHZhcjM0LmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiAzOiBzdG9yZWwgKi8KKyAgICBwdHIwW2ldID0gdmFyMzQ7CisgIH0KKworfQorCisjZWxzZQorc3RhdGljIHZvaWQKK19iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9ub25lIChPcmNFeGVjdXRvciAqIE9SQ19SRVNUUklDVCBleCkKK3sKKyAgaW50IGk7CisgIGludCBuID0gZXgtPm47CisgIG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMTYgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb24xNiB2YXIzMjsKKyAgb3JjX3VuaW9uMTYgdmFyMzM7CisgIG9yY191bmlvbjMyIHZhcjM0OworCisgIHB0cjAgPSAob3JjX3VuaW9uMzIgKikgZXgtPmFycmF5c1swXTsKKyAgcHRyNCA9IChvcmNfdW5pb24xNiAqKSBleC0+YXJyYXlzWzRdOworCisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWR3ICovCisgICAgdmFyMzIgPSBwdHI0W2ldOworICAgIC8qIDE6IGxvYWR3ICovCisgICAgdmFyMzMgPSBwdHI0W2ldOworICAgIC8qIDI6IG1lcmdld2wgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyMzIuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyMzMuaTsKKyAgICAgIHZhcjM0LmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiAzOiBzdG9yZWwgKi8KKyAgICBwdHIwW2ldID0gdmFyMzQ7CisgIH0KKworfQorCit2b2lkCithdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX25vbmUgKGdpbnQxNiAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnaW50MTYgKiBPUkNfUkVTVFJJQ1QgczEsIGludCBuKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgOSwgMzksIDk3LCAxMTcsIDEwMCwgMTA1LCAxMTEsIDExMiwgOTcsIDExMCwgMTExLCAxMTQsIDk3LCAxMDksIDk3LAorICAgICAgICAxMDksIDk1LCAxMTEsIDExNCwgOTksIDk1LCAxMTIsIDExNCwgMTExLCA5OSwgMTAxLCAxMTUsIDExNSwgOTUsIDExNSwKKyAgICAgICAgNDksCisgICAgICAgIDU0LCA5NSwgOTksIDEwNCwgNDksIDk1LCAxMTAsIDExMSwgMTEwLCAxMDEsIDExLCA0LCA0LCAxMiwgMiwgMiwKKyAgICAgICAgMTk1LCAwLCA0LCA0LCAyLCAwLAorICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX25vbmUpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfbm9uZSIpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfbm9uZSk7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDQsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgMiwgInMxIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibWVyZ2V3bCIsIDAsIE9SQ19WQVJfRDEsIE9SQ19WQVJfUzEsIE9SQ19WQVJfUzEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisjZW5kaWYKKworICAgICAgb3JjX3Byb2dyYW1fY29tcGlsZSAocCk7CisgICAgICBjID0gb3JjX3Byb2dyYW1fdGFrZV9jb2RlIChwKTsKKyAgICAgIG9yY19wcm9ncmFtX2ZyZWUgKHApOworICAgIH0KKyAgICBwX2luaXRlZCA9IFRSVUU7CisgICAgb3JjX29uY2VfbXV0ZXhfdW5sb2NrICgpOworICB9CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9BMl0gPSBjOworICBleC0+cHJvZ3JhbSA9IDA7CisKKyAgZXgtPm4gPSBuOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCisKKworLyogYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9ub25lICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfbm9uZSAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdmbG9hdCAqIE9SQ19SRVNUUklDVCBzMSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uMzIgdmFyMzI7CisgIG9yY191bmlvbjMyIHZhcjMzOworICBvcmNfdW5pb242NCB2YXIzNDsKKworICBwdHIwID0gKG9yY191bmlvbjY0ICopIGQxOworICBwdHI0ID0gKG9yY191bmlvbjMyICopIHMxOworCisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRsICovCisgICAgdmFyMzIgPSBwdHI0W2ldOworICAgIC8qIDE6IGxvYWRsICovCisgICAgdmFyMzMgPSBwdHI0W2ldOworICAgIC8qIDI6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyMzIuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyMzMuaTsKKyAgICAgIHZhcjM0LmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiAzOiBzdG9yZXEgKi8KKyAgICBwdHIwW2ldID0gdmFyMzQ7CisgIH0KKworfQorCisjZWxzZQorc3RhdGljIHZvaWQKK19iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9ub25lIChPcmNFeGVjdXRvciAqIE9SQ19SRVNUUklDVCBleCkKK3sKKyAgaW50IGk7CisgIGludCBuID0gZXgtPm47CisgIG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb24zMiB2YXIzMjsKKyAgb3JjX3VuaW9uMzIgdmFyMzM7CisgIG9yY191bmlvbjY0IHZhcjM0OworCisgIHB0cjAgPSAob3JjX3VuaW9uNjQgKikgZXgtPmFycmF5c1swXTsKKyAgcHRyNCA9IChvcmNfdW5pb24zMiAqKSBleC0+YXJyYXlzWzRdOworCisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRsICovCisgICAgdmFyMzIgPSBwdHI0W2ldOworICAgIC8qIDE6IGxvYWRsICovCisgICAgdmFyMzMgPSBwdHI0W2ldOworICAgIC8qIDI6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyMzIuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyMzMuaTsKKyAgICAgIHZhcjM0LmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiAzOiBzdG9yZXEgKi8KKyAgICBwdHIwW2ldID0gdmFyMzQ7CisgIH0KKworfQorCit2b2lkCithdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX25vbmUgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGludCBuKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgOSwgMzksIDk3LCAxMTcsIDEwMCwgMTA1LCAxMTEsIDExMiwgOTcsIDExMCwgMTExLCAxMTQsIDk3LCAxMDksIDk3LAorICAgICAgICAxMDksIDk1LCAxMTEsIDExNCwgOTksIDk1LCAxMTIsIDExNCwgMTExLCA5OSwgMTAxLCAxMTUsIDExNSwgOTUsIDEwMiwKKyAgICAgICAgNTEsCisgICAgICAgIDUwLCA5NSwgOTksIDEwNCwgNDksIDk1LCAxMTAsIDExMSwgMTEwLCAxMDEsIDExLCA4LCA4LCAxMiwgNCwgNCwKKyAgICAgICAgMTk0LCAwLCA0LCA0LCAyLCAwLAorICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX25vbmUpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfbm9uZSIpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfbm9uZSk7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDgsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgNCwgInMxIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibWVyZ2VscSIsIDAsIE9SQ19WQVJfRDEsIE9SQ19WQVJfUzEsIE9SQ19WQVJfUzEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisjZW5kaWYKKworICAgICAgb3JjX3Byb2dyYW1fY29tcGlsZSAocCk7CisgICAgICBjID0gb3JjX3Byb2dyYW1fdGFrZV9jb2RlIChwKTsKKyAgICAgIG9yY19wcm9ncmFtX2ZyZWUgKHApOworICAgIH0KKyAgICBwX2luaXRlZCA9IFRSVUU7CisgICAgb3JjX29uY2VfbXV0ZXhfdW5sb2NrICgpOworICB9CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9BMl0gPSBjOworICBleC0+cHJvZ3JhbSA9IDA7CisKKyAgZXgtPm4gPSBuOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCisKKworLyogYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9ub25lICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfbm9uZSAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uMzIgdmFyMzI7CisgIG9yY191bmlvbjMyIHZhcjMzOworCisgIHB0cjAgPSAob3JjX3VuaW9uMzIgKikgZDE7CisgIHB0cjQgPSAob3JjX3VuaW9uMzIgKikgczE7CisKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGwgKi8KKyAgICB2YXIzMiA9IHB0cjRbaV07CisgICAgLyogMTogY29weXcgKi8KKyAgICB2YXIzMy54MlswXSA9IHZhcjMyLngyWzBdOworICAgIHZhcjMzLngyWzFdID0gdmFyMzIueDJbMV07CisgICAgLyogMjogc3RvcmVsICovCisgICAgcHRyMFtpXSA9IHZhcjMzOworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfbm9uZSAoT3JjRXhlY3V0b3IgKiBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgbiA9IGV4LT5uOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uMzIgdmFyMzI7CisgIG9yY191bmlvbjMyIHZhcjMzOworCisgIHB0cjAgPSAob3JjX3VuaW9uMzIgKikgZXgtPmFycmF5c1swXTsKKyAgcHRyNCA9IChvcmNfdW5pb24zMiAqKSBleC0+YXJyYXlzWzRdOworCisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRsICovCisgICAgdmFyMzIgPSBwdHI0W2ldOworICAgIC8qIDE6IGNvcHl3ICovCisgICAgdmFyMzMueDJbMF0gPSB2YXIzMi54MlswXTsKKyAgICB2YXIzMy54MlsxXSA9IHZhcjMyLngyWzFdOworICAgIC8qIDI6IHN0b3JlbCAqLworICAgIHB0cjBbaV0gPSB2YXIzMzsKKyAgfQorCit9CisKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfbm9uZSAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgaW50IG4pCit7CisgIE9yY0V4ZWN1dG9yIF9leCwgKmV4ID0gJl9leDsKKyAgc3RhdGljIHZvbGF0aWxlIGludCBwX2luaXRlZCA9IDA7CisgIHN0YXRpYyBPcmNDb2RlICpjID0gMDsKKyAgdm9pZCAoKmZ1bmMpIChPcmNFeGVjdXRvciAqKTsKKworICBpZiAoIXBfaW5pdGVkKSB7CisgICAgb3JjX29uY2VfbXV0ZXhfbG9jayAoKTsKKyAgICBpZiAoIXBfaW5pdGVkKSB7CisgICAgICBPcmNQcm9ncmFtICpwOworCisjaWYgMQorICAgICAgc3RhdGljIGNvbnN0IG9yY191aW50OCBiY1tdID0geworICAgICAgICAxLCA5LCAzOSwgOTcsIDExNywgMTAwLCAxMDUsIDExMSwgMTEyLCA5NywgMTEwLCAxMTEsIDExNCwgOTcsIDEwOSwgOTcsCisgICAgICAgIDEwOSwgOTUsIDExMSwgMTE0LCA5OSwgOTUsIDExMiwgMTE0LCAxMTEsIDk5LCAxMDEsIDExNSwgMTE1LCA5NSwgMTE1LAorICAgICAgICA0OSwKKyAgICAgICAgNTQsIDk1LCA5OSwgMTA0LCA1MCwgOTUsIDExMCwgMTExLCAxMTAsIDEwMSwgMTEsIDQsIDQsIDEyLCA0LCA0LAorICAgICAgICAyMSwgMSwgNzksIDAsIDQsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfbm9uZSk7CisjZWxzZQorICAgICAgcCA9IG9yY19wcm9ncmFtX25ldyAoKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9uYW1lIChwLCAiYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9ub25lIik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9ub25lKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9kZXN0aW5hdGlvbiAocCwgNCwgImQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCA0LCAiczEiKTsKKworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb3B5dyIsIDEsIE9SQ19WQVJfRDEsIE9SQ19WQVJfUzEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisjZW5kaWYKKworICAgICAgb3JjX3Byb2dyYW1fY29tcGlsZSAocCk7CisgICAgICBjID0gb3JjX3Byb2dyYW1fdGFrZV9jb2RlIChwKTsKKyAgICAgIG9yY19wcm9ncmFtX2ZyZWUgKHApOworICAgIH0KKyAgICBwX2luaXRlZCA9IFRSVUU7CisgICAgb3JjX29uY2VfbXV0ZXhfdW5sb2NrICgpOworICB9CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9BMl0gPSBjOworICBleC0+cHJvZ3JhbSA9IDA7CisKKyAgZXgtPm4gPSBuOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCisKKworLyogYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9ub25lICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfbm9uZSAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdmbG9hdCAqIE9SQ19SRVNUUklDVCBzMSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uNjQgdmFyMzI7CisgIG9yY191bmlvbjY0IHZhcjMzOworCisgIHB0cjAgPSAob3JjX3VuaW9uNjQgKikgZDE7CisgIHB0cjQgPSAob3JjX3VuaW9uNjQgKikgczE7CisKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZHEgKi8KKyAgICB2YXIzMiA9IHB0cjRbaV07CisgICAgLyogMTogY29weWwgKi8KKyAgICB2YXIzMy54MlswXSA9IHZhcjMyLngyWzBdOworICAgIHZhcjMzLngyWzFdID0gdmFyMzIueDJbMV07CisgICAgLyogMjogc3RvcmVxICovCisgICAgcHRyMFtpXSA9IHZhcjMzOworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfbm9uZSAoT3JjRXhlY3V0b3IgKiBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgbiA9IGV4LT5uOworICBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uNjQgdmFyMzI7CisgIG9yY191bmlvbjY0IHZhcjMzOworCisgIHB0cjAgPSAob3JjX3VuaW9uNjQgKikgZXgtPmFycmF5c1swXTsKKyAgcHRyNCA9IChvcmNfdW5pb242NCAqKSBleC0+YXJyYXlzWzRdOworCisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRxICovCisgICAgdmFyMzIgPSBwdHI0W2ldOworICAgIC8qIDE6IGNvcHlsICovCisgICAgdmFyMzMueDJbMF0gPSB2YXIzMi54MlswXTsKKyAgICB2YXIzMy54MlsxXSA9IHZhcjMyLngyWzFdOworICAgIC8qIDI6IHN0b3JlcSAqLworICAgIHB0cjBbaV0gPSB2YXIzMzsKKyAgfQorCit9CisKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfbm9uZSAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdmbG9hdCAqIE9SQ19SRVNUUklDVCBzMSwgaW50IG4pCit7CisgIE9yY0V4ZWN1dG9yIF9leCwgKmV4ID0gJl9leDsKKyAgc3RhdGljIHZvbGF0aWxlIGludCBwX2luaXRlZCA9IDA7CisgIHN0YXRpYyBPcmNDb2RlICpjID0gMDsKKyAgdm9pZCAoKmZ1bmMpIChPcmNFeGVjdXRvciAqKTsKKworICBpZiAoIXBfaW5pdGVkKSB7CisgICAgb3JjX29uY2VfbXV0ZXhfbG9jayAoKTsKKyAgICBpZiAoIXBfaW5pdGVkKSB7CisgICAgICBPcmNQcm9ncmFtICpwOworCisjaWYgMQorICAgICAgc3RhdGljIGNvbnN0IG9yY191aW50OCBiY1tdID0geworICAgICAgICAxLCA5LCAzOSwgOTcsIDExNywgMTAwLCAxMDUsIDExMSwgMTEyLCA5NywgMTEwLCAxMTEsIDExNCwgOTcsIDEwOSwgOTcsCisgICAgICAgIDEwOSwgOTUsIDExMSwgMTE0LCA5OSwgOTUsIDExMiwgMTE0LCAxMTEsIDk5LCAxMDEsIDExNSwgMTE1LCA5NSwgMTAyLAorICAgICAgICA1MSwKKyAgICAgICAgNTAsIDk1LCA5OSwgMTA0LCA1MCwgOTUsIDExMCwgMTExLCAxMTAsIDEwMSwgMTEsIDgsIDgsIDEyLCA4LCA4LAorICAgICAgICAyMSwgMSwgMTEyLCAwLCA0LCAyLCAwLAorICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX25vbmUpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfbm9uZSIpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfbm9uZSk7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDgsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgOCwgInMxIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29weWwiLCAxLCBPUkNfVkFSX0QxLCBPUkNfVkFSX1MxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworI2VuZGlmCisKKyAgICAgIG9yY19wcm9ncmFtX2NvbXBpbGUgKHApOworICAgICAgYyA9IG9yY19wcm9ncmFtX3Rha2VfY29kZSAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9mcmVlIChwKTsKKyAgICB9CisgICAgcF9pbml0ZWQgPSBUUlVFOworICAgIG9yY19vbmNlX211dGV4X3VubG9jayAoKTsKKyAgfQorICBleC0+YXJyYXlzW09SQ19WQVJfQTJdID0gYzsKKyAgZXgtPnByb2dyYW0gPSAwOworCisgIGV4LT5uID0gbjsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX0QxXSA9IGQxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzFdID0gKHZvaWQgKikgczE7CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfcHN5ICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfcHN5IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKQoreworICBpbnQgaTsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24xNiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjE2IHZhcjM1OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uMzIgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisgIG9yY191bmlvbjMyIHZhcjQxOworICBvcmNfdW5pb24zMiB2YXI0MjsKKyAgb3JjX3VuaW9uNjQgdmFyNDM7CisgIG9yY191bmlvbjY0IHZhcjQ0OworCisgIHB0cjAgPSAob3JjX3VuaW9uMzIgKikgZDE7CisgIHB0cjQgPSAob3JjX3VuaW9uMTYgKikgczE7CisKKyAgLyogMzogbG9hZHBsICovCisgIHZhcjM2LmYgPSBwMjsKKyAgLyogNTogbG9hZHBsICovCisgIHZhcjM3LmYgPSBwMTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZHcgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMTogY29udnN3bCAqLworICAgIHZhcjM5LmkgPSB2YXIzNS5pOworICAgIC8qIDI6IGNvbnZsZiAqLworICAgIHZhcjQwLmYgPSB2YXIzOS5pOworICAgIC8qIDQ6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDAuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNi5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0MS5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDY6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDAuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNy5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0Mi5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDc6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyNDIuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyNDEuaTsKKyAgICAgIHZhcjQzLmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiA4OiBjb252ZmwgKi8KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDMueDJmWzBdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDMueDJbMF0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ0LngyWzBdID0gdG1wOworICAgIH0KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDMueDJmWzFdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDMueDJbMV0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ0LngyWzFdID0gdG1wOworICAgIH0KKyAgICAvKiA5OiBjb252c3NzbHcgKi8KKyAgICB2YXIzOC54MlswXSA9IE9SQ19DTEFNUF9TVyAodmFyNDQueDJbMF0pOworICAgIHZhcjM4LngyWzFdID0gT1JDX0NMQU1QX1NXICh2YXI0NC54MlsxXSk7CisgICAgLyogMTA6IHN0b3JlbCAqLworICAgIHB0cjBbaV0gPSB2YXIzODsKKyAgfQorCit9CisKKyNlbHNlCitzdGF0aWMgdm9pZAorX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX3BzeSAoT3JjRXhlY3V0b3IgKiBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgbiA9IGV4LT5uOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjE2ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uMTYgdmFyMzU7CisgIG9yY191bmlvbjMyIHZhcjM2OworICBvcmNfdW5pb24zMiB2YXIzNzsKKyAgb3JjX3VuaW9uMzIgdmFyMzg7CisgIG9yY191bmlvbjMyIHZhcjM5OworICBvcmNfdW5pb24zMiB2YXI0MDsKKyAgb3JjX3VuaW9uMzIgdmFyNDE7CisgIG9yY191bmlvbjMyIHZhcjQyOworICBvcmNfdW5pb242NCB2YXI0MzsKKyAgb3JjX3VuaW9uNjQgdmFyNDQ7CisKKyAgcHRyMCA9IChvcmNfdW5pb24zMiAqKSBleC0+YXJyYXlzWzBdOworICBwdHI0ID0gKG9yY191bmlvbjE2ICopIGV4LT5hcnJheXNbNF07CisKKyAgLyogMzogbG9hZHBsICovCisgIHZhcjM2LmkgPSBleC0+cGFyYW1zWzI1XTsKKyAgLyogNTogbG9hZHBsICovCisgIHZhcjM3LmkgPSBleC0+cGFyYW1zWzI0XTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZHcgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMTogY29udnN3bCAqLworICAgIHZhcjM5LmkgPSB2YXIzNS5pOworICAgIC8qIDI6IGNvbnZsZiAqLworICAgIHZhcjQwLmYgPSB2YXIzOS5pOworICAgIC8qIDQ6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDAuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNi5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0MS5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDY6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDAuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNy5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0Mi5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDc6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyNDIuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyNDEuaTsKKyAgICAgIHZhcjQzLmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiA4OiBjb252ZmwgKi8KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDMueDJmWzBdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDMueDJbMF0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ0LngyWzBdID0gdG1wOworICAgIH0KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDMueDJmWzFdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDMueDJbMV0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ0LngyWzFdID0gdG1wOworICAgIH0KKyAgICAvKiA5OiBjb252c3NzbHcgKi8KKyAgICB2YXIzOC54MlswXSA9IE9SQ19DTEFNUF9TVyAodmFyNDQueDJbMF0pOworICAgIHZhcjM4LngyWzFdID0gT1JDX0NMQU1QX1NXICh2YXI0NC54MlsxXSk7CisgICAgLyogMTA6IHN0b3JlbCAqLworICAgIHB0cjBbaV0gPSB2YXIzODsKKyAgfQorCit9CisKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfcHN5IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgOSwgMzgsIDk3LCAxMTcsIDEwMCwgMTA1LCAxMTEsIDExMiwgOTcsIDExMCwgMTExLCAxMTQsIDk3LCAxMDksIDk3LAorICAgICAgICAxMDksIDk1LCAxMTEsIDExNCwgOTksIDk1LCAxMTIsIDExNCwgMTExLCA5OSwgMTAxLCAxMTUsIDExNSwgOTUsIDExNSwKKyAgICAgICAgNDksCisgICAgICAgIDU0LCA5NSwgOTksIDEwNCwgNDksIDk1LCAxMTIsIDExNSwgMTIxLCAxMSwgNCwgNCwgMTIsIDIsIDIsIDE3LAorICAgICAgICA0LCAxNywgNCwgMjAsIDgsIDIwLCA0LCAyMCwgNCwgMTUzLCAzMywgNCwgMjExLCAzMywgMzMsIDIwMiwKKyAgICAgICAgMzQsIDMzLCAyNSwgMjAyLCAzMywgMzMsIDI0LCAxOTQsIDMyLCAzMywgMzQsIDIxLCAxLCAyMTAsIDMyLCAzMiwKKyAgICAgICAgMjEsIDEsIDE2NSwgMCwgMzIsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfcHN5KTsKKyNlbHNlCisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3ICgpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X25hbWUgKHAsICJhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX3BzeSIpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfcHN5KTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9kZXN0aW5hdGlvbiAocCwgNCwgImQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCAyLCAiczEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9wYXJhbWV0ZXJfZmxvYXQgKHAsIDQsICJwMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlcl9mbG9hdCAocCwgNCwgInAyIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA4LCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQzIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnN3bCIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfUzEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZsZiIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDIsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGYiLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1AyLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtdWxmIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9QMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibWVyZ2VscSIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDMsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZmbCIsIDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZzc3NsdyIsIDEsIE9SQ19WQVJfRDEsIE9SQ19WQVJfVDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9EMSk7CisjZW5kaWYKKworICAgICAgb3JjX3Byb2dyYW1fY29tcGlsZSAocCk7CisgICAgICBjID0gb3JjX3Byb2dyYW1fdGFrZV9jb2RlIChwKTsKKyAgICAgIG9yY19wcm9ncmFtX2ZyZWUgKHApOworICAgIH0KKyAgICBwX2luaXRlZCA9IFRSVUU7CisgICAgb3JjX29uY2VfbXV0ZXhfdW5sb2NrICgpOworICB9CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9BMl0gPSBjOworICBleC0+cHJvZ3JhbSA9IDA7CisKKyAgZXgtPm4gPSBuOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKyAgeworICAgIG9yY191bmlvbjMyIHRtcDsKKyAgICB0bXAuZiA9IHAxOworICAgIGV4LT5wYXJhbXNbT1JDX1ZBUl9QMV0gPSB0bXAuaTsKKyAgfQorICB7CisgICAgb3JjX3VuaW9uMzIgdG1wOworICAgIHRtcC5mID0gcDI7CisgICAgZXgtPnBhcmFtc1tPUkNfVkFSX1AyXSA9IHRtcC5pOworICB9CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfcHN5ICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfcHN5IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKQoreworICBpbnQgaTsKKyAgb3JjX3VuaW9uNjQgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjMyIHZhcjM0OworICBvcmNfdW5pb24zMiB2YXIzNTsKKyAgb3JjX3VuaW9uMzIgdmFyMzY7CisgIG9yY191bmlvbjMyIHZhcjM3OworICBvcmNfdW5pb242NCB2YXIzODsKKyAgb3JjX3VuaW9uMzIgdmFyMzk7CisgIG9yY191bmlvbjMyIHZhcjQwOworCisgIHB0cjAgPSAob3JjX3VuaW9uNjQgKikgZDE7CisgIHB0cjQgPSAob3JjX3VuaW9uMzIgKikgczE7CisKKyAgLyogMTogbG9hZHBsICovCisgIHZhcjM1LmYgPSBwMjsKKyAgLyogNDogbG9hZHBsICovCisgIHZhcjM3LmYgPSBwMTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGwgKi8KKyAgICB2YXIzNCA9IHB0cjRbaV07CisgICAgLyogMjogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXIzNC5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM1LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjM5LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogMzogbG9hZGwgKi8KKyAgICB2YXIzNiA9IHB0cjRbaV07CisgICAgLyogNTogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXIzNi5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM3LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQwLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogNjogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXI0MC5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXIzOS5pOworICAgICAgdmFyMzguaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDc6IHN0b3JlcSAqLworICAgIHB0cjBbaV0gPSB2YXIzODsKKyAgfQorCit9CisKKyNlbHNlCitzdGF0aWMgdm9pZAorX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX3BzeSAoT3JjRXhlY3V0b3IgKiBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgbiA9IGV4LT5uOworICBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uMzIgdmFyMzQ7CisgIG9yY191bmlvbjMyIHZhcjM1OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uMzIgdmFyMzc7CisgIG9yY191bmlvbjY0IHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisKKyAgcHRyMCA9IChvcmNfdW5pb242NCAqKSBleC0+YXJyYXlzWzBdOworICBwdHI0ID0gKG9yY191bmlvbjMyICopIGV4LT5hcnJheXNbNF07CisKKyAgLyogMTogbG9hZHBsICovCisgIHZhcjM1LmkgPSBleC0+cGFyYW1zWzI1XTsKKyAgLyogNDogbG9hZHBsICovCisgIHZhcjM3LmkgPSBleC0+cGFyYW1zWzI0XTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGwgKi8KKyAgICB2YXIzNCA9IHB0cjRbaV07CisgICAgLyogMjogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXIzNC5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM1LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjM5LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogMzogbG9hZGwgKi8KKyAgICB2YXIzNiA9IHB0cjRbaV07CisgICAgLyogNTogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXIzNi5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM3LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQwLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogNjogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXI0MC5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXIzOS5pOworICAgICAgdmFyMzguaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDc6IHN0b3JlcSAqLworICAgIHB0cjBbaV0gPSB2YXIzODsKKyAgfQorCit9CisKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfcHN5IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgOSwgMzgsIDk3LCAxMTcsIDEwMCwgMTA1LCAxMTEsIDExMiwgOTcsIDExMCwgMTExLCAxMTQsIDk3LCAxMDksIDk3LAorICAgICAgICAxMDksIDk1LCAxMTEsIDExNCwgOTksIDk1LCAxMTIsIDExNCwgMTExLCA5OSwgMTAxLCAxMTUsIDExNSwgOTUsIDEwMiwKKyAgICAgICAgNTEsCisgICAgICAgIDUwLCA5NSwgOTksIDEwNCwgNDksIDk1LCAxMTIsIDExNSwgMTIxLCAxMSwgOCwgOCwgMTIsIDQsIDQsIDE3LAorICAgICAgICA0LCAxNywgNCwgMjAsIDQsIDIwLCA0LCAyMDIsIDMzLCA0LCAyNSwgMjAyLCAzMiwgNCwgMjQsIDE5NCwKKyAgICAgICAgMCwgMzIsIDMzLCAyLCAwLAorICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX3BzeSk7CisjZWxzZQorICAgICAgcCA9IG9yY19wcm9ncmFtX25ldyAoKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9uYW1lIChwLCAiYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9wc3kiKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX3BzeSk7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDgsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgNCwgInMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfcGFyYW1ldGVyX2Zsb2F0IChwLCA0LCAicDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9wYXJhbWV0ZXJfZmxvYXQgKHAsIDQsICJwMiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDIiKTsKKworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtdWxmIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9TMSwgT1JDX1ZBUl9QMiwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsZiIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfUzEsIE9SQ19WQVJfUDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm1lcmdlbHEiLCAwLCBPUkNfVkFSX0QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QyLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworI2VuZGlmCisKKyAgICAgIG9yY19wcm9ncmFtX2NvbXBpbGUgKHApOworICAgICAgYyA9IG9yY19wcm9ncmFtX3Rha2VfY29kZSAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9mcmVlIChwKTsKKyAgICB9CisgICAgcF9pbml0ZWQgPSBUUlVFOworICAgIG9yY19vbmNlX211dGV4X3VubG9jayAoKTsKKyAgfQorICBleC0+YXJyYXlzW09SQ19WQVJfQTJdID0gYzsKKyAgZXgtPnByb2dyYW0gPSAwOworCisgIGV4LT5uID0gbjsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX0QxXSA9IGQxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzFdID0gKHZvaWQgKikgczE7CisgIHsKKyAgICBvcmNfdW5pb24zMiB0bXA7CisgICAgdG1wLmYgPSBwMTsKKyAgICBleC0+cGFyYW1zW09SQ19WQVJfUDFdID0gdG1wLmk7CisgIH0KKyAgeworICAgIG9yY191bmlvbjMyIHRtcDsKKyAgICB0bXAuZiA9IHAyOworICAgIGV4LT5wYXJhbXNbT1JDX1ZBUl9QMl0gPSB0bXAuaTsKKyAgfQorCisgIGZ1bmMgPSBjLT5leGVjOworICBmdW5jIChleCk7Cit9CisjZW5kaWYKKworCisvKiBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3BzeV9yaWdodCAqLworI2lmZGVmIERJU0FCTEVfT1JDCit2b2lkCithdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3BzeV9yaWdodCAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGZsb2F0IHAyLCBpbnQgbikKK3sKKyAgaW50IGk7CisgIG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uMzIgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKyAgb3JjX3VuaW9uNjQgdmFyNDA7CisgIG9yY191bmlvbjY0IHZhcjQxOworICBvcmNfdW5pb24zMiB2YXI0MjsKKyAgb3JjX3VuaW9uMzIgdmFyNDM7CisgIG9yY191bmlvbjMyIHZhcjQ0OworICBvcmNfdW5pb24zMiB2YXI0NTsKKyAgb3JjX3VuaW9uMzIgdmFyNDY7CisgIG9yY191bmlvbjY0IHZhcjQ3OworICBvcmNfdW5pb242NCB2YXI0ODsKKworICBwdHIwID0gKG9yY191bmlvbjMyICopIGQxOworICBwdHI0ID0gKG9yY191bmlvbjMyICopIHMxOworCisgIC8qIDU6IGxvYWRwbCAqLworICB2YXIzNy5mID0gcDI7CisgIC8qIDc6IGxvYWRwbCAqLworICB2YXIzOC5mID0gcDE7CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRsICovCisgICAgdmFyMzYgPSBwdHI0W2ldOworICAgIC8qIDE6IGNvbnZzd2wgKi8KKyAgICB2YXI0MC54MlswXSA9IHZhcjM2LngyWzBdOworICAgIHZhcjQwLngyWzFdID0gdmFyMzYueDJbMV07CisgICAgLyogMjogY29udmxmICovCisgICAgdmFyNDEueDJmWzBdID0gdmFyNDAueDJbMF07CisgICAgdmFyNDEueDJmWzFdID0gdmFyNDAueDJbMV07CisgICAgLyogMzogc2VsZWN0MHFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjQxLmk7CisgICAgICB2YXI0Mi5pID0gX3NyYy54MlswXTsKKyAgICB9CisgICAgLyogNDogc2VsZWN0MXFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjQxLmk7CisgICAgICB2YXI0My5pID0gX3NyYy54MlsxXTsKKyAgICB9CisgICAgLyogNjogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0Mi5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM3LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQ0LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogODogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0Mi5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM4LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQ1LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogOTogYWRkZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0NC5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjQzLmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICsgX3NyYzIuZjsKKyAgICAgIHZhcjQ2LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogMTA6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyNDUuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyNDYuaTsKKyAgICAgIHZhcjQ3LmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiAxMTogY29udmZsICovCisgICAgeworICAgICAgaW50IHRtcDsKKyAgICAgIHRtcCA9IChpbnQpIHZhcjQ3LngyZlswXTsKKyAgICAgIGlmICh0bXAgPT0gMHg4MDAwMDAwMCAmJiAhKHZhcjQ3LngyWzBdICYgMHg4MDAwMDAwMCkpCisgICAgICAgIHRtcCA9IDB4N2ZmZmZmZmY7CisgICAgICB2YXI0OC54MlswXSA9IHRtcDsKKyAgICB9CisgICAgeworICAgICAgaW50IHRtcDsKKyAgICAgIHRtcCA9IChpbnQpIHZhcjQ3LngyZlsxXTsKKyAgICAgIGlmICh0bXAgPT0gMHg4MDAwMDAwMCAmJiAhKHZhcjQ3LngyWzFdICYgMHg4MDAwMDAwMCkpCisgICAgICAgIHRtcCA9IDB4N2ZmZmZmZmY7CisgICAgICB2YXI0OC54MlsxXSA9IHRtcDsKKyAgICB9CisgICAgLyogMTI6IGNvbnZzc3NsdyAqLworICAgIHZhcjM5LngyWzBdID0gT1JDX0NMQU1QX1NXICh2YXI0OC54MlswXSk7CisgICAgdmFyMzkueDJbMV0gPSBPUkNfQ0xBTVBfU1cgKHZhcjQ4LngyWzFdKTsKKyAgICAvKiAxMzogc3RvcmVsICovCisgICAgcHRyMFtpXSA9IHZhcjM5OworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfcHN5X3JpZ2h0IChPcmNFeGVjdXRvciAqCisgICAgT1JDX1JFU1RSSUNUIGV4KQoreworICBpbnQgaTsKKyAgaW50IG4gPSBleC0+bjsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjMyIHZhcjM2OworICBvcmNfdW5pb24zMiB2YXIzNzsKKyAgb3JjX3VuaW9uMzIgdmFyMzg7CisgIG9yY191bmlvbjMyIHZhcjM5OworICBvcmNfdW5pb242NCB2YXI0MDsKKyAgb3JjX3VuaW9uNjQgdmFyNDE7CisgIG9yY191bmlvbjMyIHZhcjQyOworICBvcmNfdW5pb24zMiB2YXI0MzsKKyAgb3JjX3VuaW9uMzIgdmFyNDQ7CisgIG9yY191bmlvbjMyIHZhcjQ1OworICBvcmNfdW5pb24zMiB2YXI0NjsKKyAgb3JjX3VuaW9uNjQgdmFyNDc7CisgIG9yY191bmlvbjY0IHZhcjQ4OworCisgIHB0cjAgPSAob3JjX3VuaW9uMzIgKikgZXgtPmFycmF5c1swXTsKKyAgcHRyNCA9IChvcmNfdW5pb24zMiAqKSBleC0+YXJyYXlzWzRdOworCisgIC8qIDU6IGxvYWRwbCAqLworICB2YXIzNy5pID0gZXgtPnBhcmFtc1syNV07CisgIC8qIDc6IGxvYWRwbCAqLworICB2YXIzOC5pID0gZXgtPnBhcmFtc1syNF07CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRsICovCisgICAgdmFyMzYgPSBwdHI0W2ldOworICAgIC8qIDE6IGNvbnZzd2wgKi8KKyAgICB2YXI0MC54MlswXSA9IHZhcjM2LngyWzBdOworICAgIHZhcjQwLngyWzFdID0gdmFyMzYueDJbMV07CisgICAgLyogMjogY29udmxmICovCisgICAgdmFyNDEueDJmWzBdID0gdmFyNDAueDJbMF07CisgICAgdmFyNDEueDJmWzFdID0gdmFyNDAueDJbMV07CisgICAgLyogMzogc2VsZWN0MHFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjQxLmk7CisgICAgICB2YXI0Mi5pID0gX3NyYy54MlswXTsKKyAgICB9CisgICAgLyogNDogc2VsZWN0MXFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjQxLmk7CisgICAgICB2YXI0My5pID0gX3NyYy54MlsxXTsKKyAgICB9CisgICAgLyogNjogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0Mi5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM3LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQ0LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogODogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0Mi5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM4LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQ1LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogOTogYWRkZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0NC5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjQzLmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICsgX3NyYzIuZjsKKyAgICAgIHZhcjQ2LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogMTA6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyNDUuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyNDYuaTsKKyAgICAgIHZhcjQ3LmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiAxMTogY29udmZsICovCisgICAgeworICAgICAgaW50IHRtcDsKKyAgICAgIHRtcCA9IChpbnQpIHZhcjQ3LngyZlswXTsKKyAgICAgIGlmICh0bXAgPT0gMHg4MDAwMDAwMCAmJiAhKHZhcjQ3LngyWzBdICYgMHg4MDAwMDAwMCkpCisgICAgICAgIHRtcCA9IDB4N2ZmZmZmZmY7CisgICAgICB2YXI0OC54MlswXSA9IHRtcDsKKyAgICB9CisgICAgeworICAgICAgaW50IHRtcDsKKyAgICAgIHRtcCA9IChpbnQpIHZhcjQ3LngyZlsxXTsKKyAgICAgIGlmICh0bXAgPT0gMHg4MDAwMDAwMCAmJiAhKHZhcjQ3LngyWzFdICYgMHg4MDAwMDAwMCkpCisgICAgICAgIHRtcCA9IDB4N2ZmZmZmZmY7CisgICAgICB2YXI0OC54MlsxXSA9IHRtcDsKKyAgICB9CisgICAgLyogMTI6IGNvbnZzc3NsdyAqLworICAgIHZhcjM5LngyWzBdID0gT1JDX0NMQU1QX1NXICh2YXI0OC54MlswXSk7CisgICAgdmFyMzkueDJbMV0gPSBPUkNfQ0xBTVBfU1cgKHZhcjQ4LngyWzFdKTsKKyAgICAvKiAxMzogc3RvcmVsICovCisgICAgcHRyMFtpXSA9IHZhcjM5OworICB9CisKK30KKwordm9pZAorYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9wc3lfcmlnaHQgKGdpbnQxNiAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnaW50MTYgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBmbG9hdCBwMiwgaW50IG4pCit7CisgIE9yY0V4ZWN1dG9yIF9leCwgKmV4ID0gJl9leDsKKyAgc3RhdGljIHZvbGF0aWxlIGludCBwX2luaXRlZCA9IDA7CisgIHN0YXRpYyBPcmNDb2RlICpjID0gMDsKKyAgdm9pZCAoKmZ1bmMpIChPcmNFeGVjdXRvciAqKTsKKworICBpZiAoIXBfaW5pdGVkKSB7CisgICAgb3JjX29uY2VfbXV0ZXhfbG9jayAoKTsKKyAgICBpZiAoIXBfaW5pdGVkKSB7CisgICAgICBPcmNQcm9ncmFtICpwOworCisjaWYgMQorICAgICAgc3RhdGljIGNvbnN0IG9yY191aW50OCBiY1tdID0geworICAgICAgICAxLCA5LCA0NCwgOTcsIDExNywgMTAwLCAxMDUsIDExMSwgMTEyLCA5NywgMTEwLCAxMTEsIDExNCwgOTcsIDEwOSwgOTcsCisgICAgICAgIDEwOSwgOTUsIDExMSwgMTE0LCA5OSwgOTUsIDExMiwgMTE0LCAxMTEsIDk5LCAxMDEsIDExNSwgMTE1LCA5NSwgMTE1LAorICAgICAgICA0OSwKKyAgICAgICAgNTQsIDk1LCA5OSwgMTA0LCA1MCwgOTUsIDExMiwgMTE1LCAxMjEsIDk1LCAxMTQsIDEwNSwgMTAzLCAxMDQsIDExNiwgMTEsCisgICAgICAgIDQsIDQsIDEyLCA0LCA0LCAxNywgNCwgMTcsIDQsIDIwLCA4LCAyMCwgNCwgMjAsIDQsIDIwLAorICAgICAgICA0LCAyMSwgMSwgMTUzLCAzMiwgNCwgMjEsIDEsIDIxMSwgMzIsIDMyLCAxOTIsIDMzLCAzMiwgMTkzLCAzNCwKKyAgICAgICAgMzIsIDIwMiwgMzUsIDMzLCAyNSwgMjAyLCAzMywgMzMsIDI0LCAyMDAsIDM0LCAzNSwgMzQsIDE5NCwgMzIsIDMzLAorICAgICAgICAzNCwgMjEsIDEsIDIxMCwgMzIsIDMyLCAyMSwgMSwgMTY1LCAwLCAzMiwgMiwgMCwKKyAgICAgIH07CisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3X2Zyb21fc3RhdGljX2J5dGVjb2RlIChiYyk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9wc3lfcmlnaHQpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfcHN5X3JpZ2h0Iik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9wc3lfcmlnaHQpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCA0LCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDQsICJzMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlcl9mbG9hdCAocCwgNCwgInAxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfcGFyYW1ldGVyX2Zsb2F0IChwLCA0LCAicDIiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDgsICJ0MSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQyIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDMiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0NCIpOworCisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZzd2wiLCAxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1MxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252bGYiLCAxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJzZWxlY3QwcWwiLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QxLAorICAgICAgICAgIE9SQ19WQVJfRDEsIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJzZWxlY3QxcWwiLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QxLAorICAgICAgICAgIE9SQ19WQVJfRDEsIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtdWxmIiwgMCwgT1JDX1ZBUl9UNCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9QMiwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsZiIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDIsIE9SQ19WQVJfUDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImFkZGYiLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1Q0LCBPUkNfVkFSX1QzLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtZXJnZWxxIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udmZsIiwgMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnNzc2x3IiwgMSwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9EMV0gPSBkMTsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX1MxXSA9ICh2b2lkICopIHMxOworICB7CisgICAgb3JjX3VuaW9uMzIgdG1wOworICAgIHRtcC5mID0gcDE7CisgICAgZXgtPnBhcmFtc1tPUkNfVkFSX1AxXSA9IHRtcC5pOworICB9CisgIHsKKyAgICBvcmNfdW5pb24zMiB0bXA7CisgICAgdG1wLmYgPSBwMjsKKyAgICBleC0+cGFyYW1zW09SQ19WQVJfUDJdID0gdG1wLmk7CisgIH0KKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCisKKworLyogYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9wc3lfbGVmdCAqLworI2lmZGVmIERJU0FCTEVfT1JDCit2b2lkCithdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3BzeV9sZWZ0IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKQoreworICBpbnQgaTsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjMyIHZhcjM2OworICBvcmNfdW5pb24zMiB2YXIzNzsKKyAgb3JjX3VuaW9uMzIgdmFyMzg7CisgIG9yY191bmlvbjMyIHZhcjM5OworICBvcmNfdW5pb242NCB2YXI0MDsKKyAgb3JjX3VuaW9uNjQgdmFyNDE7CisgIG9yY191bmlvbjMyIHZhcjQyOworICBvcmNfdW5pb24zMiB2YXI0MzsKKyAgb3JjX3VuaW9uMzIgdmFyNDQ7CisgIG9yY191bmlvbjMyIHZhcjQ1OworICBvcmNfdW5pb24zMiB2YXI0NjsKKyAgb3JjX3VuaW9uNjQgdmFyNDc7CisgIG9yY191bmlvbjY0IHZhcjQ4OworCisgIHB0cjAgPSAob3JjX3VuaW9uMzIgKikgZDE7CisgIHB0cjQgPSAob3JjX3VuaW9uMzIgKikgczE7CisKKyAgLyogNTogbG9hZHBsICovCisgIHZhcjM3LmYgPSBwMTsKKyAgLyogNzogbG9hZHBsICovCisgIHZhcjM4LmYgPSBwMjsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGwgKi8KKyAgICB2YXIzNiA9IHB0cjRbaV07CisgICAgLyogMTogY29udnN3bCAqLworICAgIHZhcjQwLngyWzBdID0gdmFyMzYueDJbMF07CisgICAgdmFyNDAueDJbMV0gPSB2YXIzNi54MlsxXTsKKyAgICAvKiAyOiBjb252bGYgKi8KKyAgICB2YXI0MS54MmZbMF0gPSB2YXI0MC54MlswXTsKKyAgICB2YXI0MS54MmZbMV0gPSB2YXI0MC54MlsxXTsKKyAgICAvKiAzOiBzZWxlY3QwcWwgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfc3JjOworICAgICAgX3NyYy5pID0gdmFyNDEuaTsKKyAgICAgIHZhcjQyLmkgPSBfc3JjLngyWzBdOworICAgIH0KKyAgICAvKiA0OiBzZWxlY3QxcWwgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfc3JjOworICAgICAgX3NyYy5pID0gdmFyNDEuaTsKKyAgICAgIHZhcjQzLmkgPSBfc3JjLngyWzFdOworICAgIH0KKyAgICAvKiA2OiBtdWxmICovCisgICAgeworICAgICAgb3JjX3VuaW9uMzIgX3NyYzE7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMjsKKyAgICAgIG9yY191bmlvbjMyIF9kZXN0MTsKKyAgICAgIF9zcmMxLmkgPSBPUkNfREVOT1JNQUwgKHZhcjQzLmkpOworICAgICAgX3NyYzIuaSA9IE9SQ19ERU5PUk1BTCAodmFyMzcuaSk7CisgICAgICBfZGVzdDEuZiA9IF9zcmMxLmYgKiBfc3JjMi5mOworICAgICAgdmFyNDQuaSA9IE9SQ19ERU5PUk1BTCAoX2Rlc3QxLmkpOworICAgIH0KKyAgICAvKiA4OiBtdWxmICovCisgICAgeworICAgICAgb3JjX3VuaW9uMzIgX3NyYzE7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMjsKKyAgICAgIG9yY191bmlvbjMyIF9kZXN0MTsKKyAgICAgIF9zcmMxLmkgPSBPUkNfREVOT1JNQUwgKHZhcjQzLmkpOworICAgICAgX3NyYzIuaSA9IE9SQ19ERU5PUk1BTCAodmFyMzguaSk7CisgICAgICBfZGVzdDEuZiA9IF9zcmMxLmYgKiBfc3JjMi5mOworICAgICAgdmFyNDUuaSA9IE9SQ19ERU5PUk1BTCAoX2Rlc3QxLmkpOworICAgIH0KKyAgICAvKiA5OiBhZGRmICovCisgICAgeworICAgICAgb3JjX3VuaW9uMzIgX3NyYzE7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMjsKKyAgICAgIG9yY191bmlvbjMyIF9kZXN0MTsKKyAgICAgIF9zcmMxLmkgPSBPUkNfREVOT1JNQUwgKHZhcjQ0LmkpOworICAgICAgX3NyYzIuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDIuaSk7CisgICAgICBfZGVzdDEuZiA9IF9zcmMxLmYgKyBfc3JjMi5mOworICAgICAgdmFyNDYuaSA9IE9SQ19ERU5PUk1BTCAoX2Rlc3QxLmkpOworICAgIH0KKyAgICAvKiAxMDogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXI0Ni5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXI0NS5pOworICAgICAgdmFyNDcuaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDExOiBjb252ZmwgKi8KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDcueDJmWzBdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDcueDJbMF0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ4LngyWzBdID0gdG1wOworICAgIH0KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDcueDJmWzFdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDcueDJbMV0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ4LngyWzFdID0gdG1wOworICAgIH0KKyAgICAvKiAxMjogY29udnNzc2x3ICovCisgICAgdmFyMzkueDJbMF0gPSBPUkNfQ0xBTVBfU1cgKHZhcjQ4LngyWzBdKTsKKyAgICB2YXIzOS54MlsxXSA9IE9SQ19DTEFNUF9TVyAodmFyNDgueDJbMV0pOworICAgIC8qIDEzOiBzdG9yZWwgKi8KKyAgICBwdHIwW2ldID0gdmFyMzk7CisgIH0KKworfQorCisjZWxzZQorc3RhdGljIHZvaWQKK19iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9wc3lfbGVmdCAoT3JjRXhlY3V0b3IgKgorICAgIE9SQ19SRVNUUklDVCBleCkKK3sKKyAgaW50IGk7CisgIGludCBuID0gZXgtPm47CisgIG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uMzIgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKyAgb3JjX3VuaW9uNjQgdmFyNDA7CisgIG9yY191bmlvbjY0IHZhcjQxOworICBvcmNfdW5pb24zMiB2YXI0MjsKKyAgb3JjX3VuaW9uMzIgdmFyNDM7CisgIG9yY191bmlvbjMyIHZhcjQ0OworICBvcmNfdW5pb24zMiB2YXI0NTsKKyAgb3JjX3VuaW9uMzIgdmFyNDY7CisgIG9yY191bmlvbjY0IHZhcjQ3OworICBvcmNfdW5pb242NCB2YXI0ODsKKworICBwdHIwID0gKG9yY191bmlvbjMyICopIGV4LT5hcnJheXNbMF07CisgIHB0cjQgPSAob3JjX3VuaW9uMzIgKikgZXgtPmFycmF5c1s0XTsKKworICAvKiA1OiBsb2FkcGwgKi8KKyAgdmFyMzcuaSA9IGV4LT5wYXJhbXNbMjRdOworICAvKiA3OiBsb2FkcGwgKi8KKyAgdmFyMzguaSA9IGV4LT5wYXJhbXNbMjVdOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkbCAqLworICAgIHZhcjM2ID0gcHRyNFtpXTsKKyAgICAvKiAxOiBjb252c3dsICovCisgICAgdmFyNDAueDJbMF0gPSB2YXIzNi54MlswXTsKKyAgICB2YXI0MC54MlsxXSA9IHZhcjM2LngyWzFdOworICAgIC8qIDI6IGNvbnZsZiAqLworICAgIHZhcjQxLngyZlswXSA9IHZhcjQwLngyWzBdOworICAgIHZhcjQxLngyZlsxXSA9IHZhcjQwLngyWzFdOworICAgIC8qIDM6IHNlbGVjdDBxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXI0MS5pOworICAgICAgdmFyNDIuaSA9IF9zcmMueDJbMF07CisgICAgfQorICAgIC8qIDQ6IHNlbGVjdDFxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXI0MS5pOworICAgICAgdmFyNDMuaSA9IF9zcmMueDJbMV07CisgICAgfQorICAgIC8qIDY6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDMuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNy5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0NC5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDg6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDMuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzOC5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0NS5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDk6IGFkZGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDQuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXI0Mi5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiArIF9zcmMyLmY7CisgICAgICB2YXI0Ni5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDEwOiBtZXJnZWxxICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX2Rlc3Q7CisgICAgICBfZGVzdC54MlswXSA9IHZhcjQ2Lmk7CisgICAgICBfZGVzdC54MlsxXSA9IHZhcjQ1Lmk7CisgICAgICB2YXI0Ny5pID0gX2Rlc3QuaTsKKyAgICB9CisgICAgLyogMTE6IGNvbnZmbCAqLworICAgIHsKKyAgICAgIGludCB0bXA7CisgICAgICB0bXAgPSAoaW50KSB2YXI0Ny54MmZbMF07CisgICAgICBpZiAodG1wID09IDB4ODAwMDAwMDAgJiYgISh2YXI0Ny54MlswXSAmIDB4ODAwMDAwMDApKQorICAgICAgICB0bXAgPSAweDdmZmZmZmZmOworICAgICAgdmFyNDgueDJbMF0gPSB0bXA7CisgICAgfQorICAgIHsKKyAgICAgIGludCB0bXA7CisgICAgICB0bXAgPSAoaW50KSB2YXI0Ny54MmZbMV07CisgICAgICBpZiAodG1wID09IDB4ODAwMDAwMDAgJiYgISh2YXI0Ny54MlsxXSAmIDB4ODAwMDAwMDApKQorICAgICAgICB0bXAgPSAweDdmZmZmZmZmOworICAgICAgdmFyNDgueDJbMV0gPSB0bXA7CisgICAgfQorICAgIC8qIDEyOiBjb252c3NzbHcgKi8KKyAgICB2YXIzOS54MlswXSA9IE9SQ19DTEFNUF9TVyAodmFyNDgueDJbMF0pOworICAgIHZhcjM5LngyWzFdID0gT1JDX0NMQU1QX1NXICh2YXI0OC54MlsxXSk7CisgICAgLyogMTM6IHN0b3JlbCAqLworICAgIHB0cjBbaV0gPSB2YXIzOTsKKyAgfQorCit9CisKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfcHN5X2xlZnQgKGdpbnQxNiAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnaW50MTYgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBmbG9hdCBwMiwgaW50IG4pCit7CisgIE9yY0V4ZWN1dG9yIF9leCwgKmV4ID0gJl9leDsKKyAgc3RhdGljIHZvbGF0aWxlIGludCBwX2luaXRlZCA9IDA7CisgIHN0YXRpYyBPcmNDb2RlICpjID0gMDsKKyAgdm9pZCAoKmZ1bmMpIChPcmNFeGVjdXRvciAqKTsKKworICBpZiAoIXBfaW5pdGVkKSB7CisgICAgb3JjX29uY2VfbXV0ZXhfbG9jayAoKTsKKyAgICBpZiAoIXBfaW5pdGVkKSB7CisgICAgICBPcmNQcm9ncmFtICpwOworCisjaWYgMQorICAgICAgc3RhdGljIGNvbnN0IG9yY191aW50OCBiY1tdID0geworICAgICAgICAxLCA5LCA0MywgOTcsIDExNywgMTAwLCAxMDUsIDExMSwgMTEyLCA5NywgMTEwLCAxMTEsIDExNCwgOTcsIDEwOSwgOTcsCisgICAgICAgIDEwOSwgOTUsIDExMSwgMTE0LCA5OSwgOTUsIDExMiwgMTE0LCAxMTEsIDk5LCAxMDEsIDExNSwgMTE1LCA5NSwgMTE1LAorICAgICAgICA0OSwKKyAgICAgICAgNTQsIDk1LCA5OSwgMTA0LCA1MCwgOTUsIDExMiwgMTE1LCAxMjEsIDk1LCAxMDgsIDEwMSwgMTAyLCAxMTYsIDExLCA0LAorICAgICAgICA0LCAxMiwgNCwgNCwgMTcsIDQsIDE3LCA0LCAyMCwgOCwgMjAsIDQsIDIwLCA0LCAyMCwgNCwKKyAgICAgICAgMjEsIDEsIDE1MywgMzIsIDQsIDIxLCAxLCAyMTEsIDMyLCAzMiwgMTkyLCAzMywgMzIsIDE5MywgMzUsIDMyLAorICAgICAgICAyMDIsIDM0LCAzNSwgMjQsIDIwMiwgMzUsIDM1LCAyNSwgMjAwLCAzMywgMzQsIDMzLCAxOTQsIDMyLCAzMywgMzUsCisgICAgICAgIDIxLCAxLCAyMTAsIDMyLCAzMiwgMjEsIDEsIDE2NSwgMCwgMzIsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfcHN5X2xlZnQpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfcHN5X2xlZnQiKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3BzeV9sZWZ0KTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9kZXN0aW5hdGlvbiAocCwgNCwgImQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCA0LCAiczEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9wYXJhbWV0ZXJfZmxvYXQgKHAsIDQsICJwMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlcl9mbG9hdCAocCwgNCwgInAyIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA4LCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQzIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDQiKTsKKworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252c3dsIiwgMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9TMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udmxmIiwgMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MHFsIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MXFsIiwgMCwgT1JDX1ZBUl9UNCwgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsZiIsIDAsIE9SQ19WQVJfVDMsIE9SQ19WQVJfVDQsIE9SQ19WQVJfUDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGYiLCAwLCBPUkNfVkFSX1Q0LCBPUkNfVkFSX1Q0LCBPUkNfVkFSX1AyLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhZGRmIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9UMiwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibWVyZ2VscSIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDQsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZmbCIsIDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZzc3NsdyIsIDEsIE9SQ19WQVJfRDEsIE9SQ19WQVJfVDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9EMSk7CisjZW5kaWYKKworICAgICAgb3JjX3Byb2dyYW1fY29tcGlsZSAocCk7CisgICAgICBjID0gb3JjX3Byb2dyYW1fdGFrZV9jb2RlIChwKTsKKyAgICAgIG9yY19wcm9ncmFtX2ZyZWUgKHApOworICAgIH0KKyAgICBwX2luaXRlZCA9IFRSVUU7CisgICAgb3JjX29uY2VfbXV0ZXhfdW5sb2NrICgpOworICB9CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9BMl0gPSBjOworICBleC0+cHJvZ3JhbSA9IDA7CisKKyAgZXgtPm4gPSBuOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKyAgeworICAgIG9yY191bmlvbjMyIHRtcDsKKyAgICB0bXAuZiA9IHAxOworICAgIGV4LT5wYXJhbXNbT1JDX1ZBUl9QMV0gPSB0bXAuaTsKKyAgfQorICB7CisgICAgb3JjX3VuaW9uMzIgdG1wOworICAgIHRtcC5mID0gcDI7CisgICAgZXgtPnBhcmFtc1tPUkNfVkFSX1AyXSA9IHRtcC5pOworICB9CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfcHN5X3JpZ2h0ICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfcHN5X3JpZ2h0IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKQoreworICBpbnQgaTsKKyAgb3JjX3VuaW9uNjQgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjY0IHZhcjM1OworICBvcmNfdW5pb242NCB2YXIzNjsKKyAgb3JjX3VuaW9uMzIgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb242NCB2YXIzOTsKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisgIG9yY191bmlvbjMyIHZhcjQxOworICBvcmNfdW5pb24zMiB2YXI0MjsKKyAgb3JjX3VuaW9uMzIgdmFyNDM7CisgIG9yY191bmlvbjMyIHZhcjQ0OworCisgIHB0cjAgPSAob3JjX3VuaW9uNjQgKikgZDE7CisgIHB0cjQgPSAob3JjX3VuaW9uNjQgKikgczE7CisKKyAgLyogNDogbG9hZHBsICovCisgIHZhcjM3LmYgPSBwMjsKKyAgLyogNjogbG9hZHBsICovCisgIHZhcjM4LmYgPSBwMTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZHEgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMTogc2VsZWN0MHFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjM1Lmk7CisgICAgICB2YXI0MC5pID0gX3NyYy54MlswXTsKKyAgICB9CisgICAgLyogMjogbG9hZHEgKi8KKyAgICB2YXIzNiA9IHB0cjRbaV07CisgICAgLyogMzogc2VsZWN0MXFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjM2Lmk7CisgICAgICB2YXI0MS5pID0gX3NyYy54MlsxXTsKKyAgICB9CisgICAgLyogNTogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0MC5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM3LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQyLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogNzogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0MC5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM4LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQzLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogODogYWRkZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0Mi5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjQxLmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICsgX3NyYzIuZjsKKyAgICAgIHZhcjQ0LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogOTogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXI0My5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXI0NC5pOworICAgICAgdmFyMzkuaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDEwOiBzdG9yZXEgKi8KKyAgICBwdHIwW2ldID0gdmFyMzk7CisgIH0KKworfQorCisjZWxzZQorc3RhdGljIHZvaWQKK19iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9wc3lfcmlnaHQgKE9yY0V4ZWN1dG9yICoKKyAgICBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgbiA9IGV4LT5uOworICBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uNjQgdmFyMzU7CisgIG9yY191bmlvbjY0IHZhcjM2OworICBvcmNfdW5pb24zMiB2YXIzNzsKKyAgb3JjX3VuaW9uMzIgdmFyMzg7CisgIG9yY191bmlvbjY0IHZhcjM5OworICBvcmNfdW5pb24zMiB2YXI0MDsKKyAgb3JjX3VuaW9uMzIgdmFyNDE7CisgIG9yY191bmlvbjMyIHZhcjQyOworICBvcmNfdW5pb24zMiB2YXI0MzsKKyAgb3JjX3VuaW9uMzIgdmFyNDQ7CisKKyAgcHRyMCA9IChvcmNfdW5pb242NCAqKSBleC0+YXJyYXlzWzBdOworICBwdHI0ID0gKG9yY191bmlvbjY0ICopIGV4LT5hcnJheXNbNF07CisKKyAgLyogNDogbG9hZHBsICovCisgIHZhcjM3LmkgPSBleC0+cGFyYW1zWzI1XTsKKyAgLyogNjogbG9hZHBsICovCisgIHZhcjM4LmkgPSBleC0+cGFyYW1zWzI0XTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZHEgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMTogc2VsZWN0MHFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjM1Lmk7CisgICAgICB2YXI0MC5pID0gX3NyYy54MlswXTsKKyAgICB9CisgICAgLyogMjogbG9hZHEgKi8KKyAgICB2YXIzNiA9IHB0cjRbaV07CisgICAgLyogMzogc2VsZWN0MXFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjM2Lmk7CisgICAgICB2YXI0MS5pID0gX3NyYy54MlsxXTsKKyAgICB9CisgICAgLyogNTogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0MC5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM3LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQyLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogNzogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0MC5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM4LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQzLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogODogYWRkZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0Mi5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjQxLmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICsgX3NyYzIuZjsKKyAgICAgIHZhcjQ0LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogOTogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXI0My5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXI0NC5pOworICAgICAgdmFyMzkuaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDEwOiBzdG9yZXEgKi8KKyAgICBwdHIwW2ldID0gdmFyMzk7CisgIH0KKworfQorCit2b2lkCithdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3BzeV9yaWdodCAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdmbG9hdCAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGZsb2F0IHAyLCBpbnQgbikKK3sKKyAgT3JjRXhlY3V0b3IgX2V4LCAqZXggPSAmX2V4OworICBzdGF0aWMgdm9sYXRpbGUgaW50IHBfaW5pdGVkID0gMDsKKyAgc3RhdGljIE9yY0NvZGUgKmMgPSAwOworICB2b2lkICgqZnVuYykgKE9yY0V4ZWN1dG9yICopOworCisgIGlmICghcF9pbml0ZWQpIHsKKyAgICBvcmNfb25jZV9tdXRleF9sb2NrICgpOworICAgIGlmICghcF9pbml0ZWQpIHsKKyAgICAgIE9yY1Byb2dyYW0gKnA7CisKKyNpZiAxCisgICAgICBzdGF0aWMgY29uc3Qgb3JjX3VpbnQ4IGJjW10gPSB7CisgICAgICAgIDEsIDksIDQ0LCA5NywgMTE3LCAxMDAsIDEwNSwgMTExLCAxMTIsIDk3LCAxMTAsIDExMSwgMTE0LCA5NywgMTA5LCA5NywKKyAgICAgICAgMTA5LCA5NSwgMTExLCAxMTQsIDk5LCA5NSwgMTEyLCAxMTQsIDExMSwgOTksIDEwMSwgMTE1LCAxMTUsIDk1LCAxMDIsCisgICAgICAgIDUxLAorICAgICAgICA1MCwgOTUsIDk5LCAxMDQsIDUwLCA5NSwgMTEyLCAxMTUsIDEyMSwgOTUsIDExNCwgMTA1LCAxMDMsIDEwNCwgMTE2LCAxMSwKKyAgICAgICAgOCwgOCwgMTIsIDgsIDgsIDE3LCA0LCAxNywgNCwgMjAsIDQsIDIwLCA0LCAyMCwgNCwgMTkyLAorICAgICAgICAzMiwgNCwgMTkzLCAzMywgNCwgMjAyLCAzNCwgMzIsIDI1LCAyMDIsIDMyLCAzMiwgMjQsIDIwMCwgMzMsIDM0LAorICAgICAgICAzMywgMTk0LCAwLCAzMiwgMzMsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfcHN5X3JpZ2h0KTsKKyNlbHNlCisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3ICgpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X25hbWUgKHAsICJhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3BzeV9yaWdodCIpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfcHN5X3JpZ2h0KTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9kZXN0aW5hdGlvbiAocCwgOCwgImQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCA4LCAiczEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9wYXJhbWV0ZXJfZmxvYXQgKHAsIDQsICJwMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlcl9mbG9hdCAocCwgNCwgInAyIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQzIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MHFsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9TMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MXFsIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9TMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsZiIsIDAsIE9SQ19WQVJfVDMsIE9SQ19WQVJfVDEsIE9SQ19WQVJfUDIsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGYiLCAwLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1AxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhZGRmIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9UMiwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibWVyZ2VscSIsIDAsIE9SQ19WQVJfRDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDIsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisjZW5kaWYKKworICAgICAgb3JjX3Byb2dyYW1fY29tcGlsZSAocCk7CisgICAgICBjID0gb3JjX3Byb2dyYW1fdGFrZV9jb2RlIChwKTsKKyAgICAgIG9yY19wcm9ncmFtX2ZyZWUgKHApOworICAgIH0KKyAgICBwX2luaXRlZCA9IFRSVUU7CisgICAgb3JjX29uY2VfbXV0ZXhfdW5sb2NrICgpOworICB9CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9BMl0gPSBjOworICBleC0+cHJvZ3JhbSA9IDA7CisKKyAgZXgtPm4gPSBuOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKyAgeworICAgIG9yY191bmlvbjMyIHRtcDsKKyAgICB0bXAuZiA9IHAxOworICAgIGV4LT5wYXJhbXNbT1JDX1ZBUl9QMV0gPSB0bXAuaTsKKyAgfQorICB7CisgICAgb3JjX3VuaW9uMzIgdG1wOworICAgIHRtcC5mID0gcDI7CisgICAgZXgtPnBhcmFtc1tPUkNfVkFSX1AyXSA9IHRtcC5pOworICB9CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfcHN5X2xlZnQgKi8KKyNpZmRlZiBESVNBQkxFX09SQwordm9pZAorYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9wc3lfbGVmdCAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdmbG9hdCAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGZsb2F0IHAyLCBpbnQgbikKK3sKKyAgaW50IGk7CisgIG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uNjQgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb242NCB2YXIzNTsKKyAgb3JjX3VuaW9uNjQgdmFyMzY7CisgIG9yY191bmlvbjMyIHZhcjM3OworICBvcmNfdW5pb24zMiB2YXIzODsKKyAgb3JjX3VuaW9uNjQgdmFyMzk7CisgIG9yY191bmlvbjMyIHZhcjQwOworICBvcmNfdW5pb24zMiB2YXI0MTsKKyAgb3JjX3VuaW9uMzIgdmFyNDI7CisgIG9yY191bmlvbjMyIHZhcjQzOworICBvcmNfdW5pb24zMiB2YXI0NDsKKworICBwdHIwID0gKG9yY191bmlvbjY0ICopIGQxOworICBwdHI0ID0gKG9yY191bmlvbjY0ICopIHMxOworCisgIC8qIDQ6IGxvYWRwbCAqLworICB2YXIzNy5mID0gcDE7CisgIC8qIDY6IGxvYWRwbCAqLworICB2YXIzOC5mID0gcDI7CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRxICovCisgICAgdmFyMzUgPSBwdHI0W2ldOworICAgIC8qIDE6IHNlbGVjdDBxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXIzNS5pOworICAgICAgdmFyNDAuaSA9IF9zcmMueDJbMF07CisgICAgfQorICAgIC8qIDI6IGxvYWRxICovCisgICAgdmFyMzYgPSBwdHI0W2ldOworICAgIC8qIDM6IHNlbGVjdDFxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXIzNi5pOworICAgICAgdmFyNDEuaSA9IF9zcmMueDJbMV07CisgICAgfQorICAgIC8qIDU6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDEuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNy5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0Mi5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDc6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDEuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzOC5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0My5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDg6IGFkZGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDIuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXI0MC5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiArIF9zcmMyLmY7CisgICAgICB2YXI0NC5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDk6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyNDQuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyNDMuaTsKKyAgICAgIHZhcjM5LmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiAxMDogc3RvcmVxICovCisgICAgcHRyMFtpXSA9IHZhcjM5OworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfcHN5X2xlZnQgKE9yY0V4ZWN1dG9yICoKKyAgICBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgbiA9IGV4LT5uOworICBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uNjQgdmFyMzU7CisgIG9yY191bmlvbjY0IHZhcjM2OworICBvcmNfdW5pb24zMiB2YXIzNzsKKyAgb3JjX3VuaW9uMzIgdmFyMzg7CisgIG9yY191bmlvbjY0IHZhcjM5OworICBvcmNfdW5pb24zMiB2YXI0MDsKKyAgb3JjX3VuaW9uMzIgdmFyNDE7CisgIG9yY191bmlvbjMyIHZhcjQyOworICBvcmNfdW5pb24zMiB2YXI0MzsKKyAgb3JjX3VuaW9uMzIgdmFyNDQ7CisKKyAgcHRyMCA9IChvcmNfdW5pb242NCAqKSBleC0+YXJyYXlzWzBdOworICBwdHI0ID0gKG9yY191bmlvbjY0ICopIGV4LT5hcnJheXNbNF07CisKKyAgLyogNDogbG9hZHBsICovCisgIHZhcjM3LmkgPSBleC0+cGFyYW1zWzI0XTsKKyAgLyogNjogbG9hZHBsICovCisgIHZhcjM4LmkgPSBleC0+cGFyYW1zWzI1XTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZHEgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMTogc2VsZWN0MHFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjM1Lmk7CisgICAgICB2YXI0MC5pID0gX3NyYy54MlswXTsKKyAgICB9CisgICAgLyogMjogbG9hZHEgKi8KKyAgICB2YXIzNiA9IHB0cjRbaV07CisgICAgLyogMzogc2VsZWN0MXFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjM2Lmk7CisgICAgICB2YXI0MS5pID0gX3NyYy54MlsxXTsKKyAgICB9CisgICAgLyogNTogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0MS5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM3LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQyLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogNzogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0MS5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM4LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQzLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogODogYWRkZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0Mi5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjQwLmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICsgX3NyYzIuZjsKKyAgICAgIHZhcjQ0LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogOTogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXI0NC5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXI0My5pOworICAgICAgdmFyMzkuaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDEwOiBzdG9yZXEgKi8KKyAgICBwdHIwW2ldID0gdmFyMzk7CisgIH0KKworfQorCit2b2lkCithdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3BzeV9sZWZ0IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgOSwgNDMsIDk3LCAxMTcsIDEwMCwgMTA1LCAxMTEsIDExMiwgOTcsIDExMCwgMTExLCAxMTQsIDk3LCAxMDksIDk3LAorICAgICAgICAxMDksIDk1LCAxMTEsIDExNCwgOTksIDk1LCAxMTIsIDExNCwgMTExLCA5OSwgMTAxLCAxMTUsIDExNSwgOTUsIDEwMiwKKyAgICAgICAgNTEsCisgICAgICAgIDUwLCA5NSwgOTksIDEwNCwgNTAsIDk1LCAxMTIsIDExNSwgMTIxLCA5NSwgMTA4LCAxMDEsIDEwMiwgMTE2LCAxMSwgOCwKKyAgICAgICAgOCwgMTIsIDgsIDgsIDE3LCA0LCAxNywgNCwgMjAsIDQsIDIwLCA0LCAyMCwgNCwgMTkyLCAzMiwKKyAgICAgICAgNCwgMTkzLCAzNCwgNCwgMjAyLCAzMywgMzQsIDI0LCAyMDIsIDM0LCAzNCwgMjUsIDIwMCwgMzIsIDMzLCAzMiwKKyAgICAgICAgMTk0LCAwLCAzMiwgMzQsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfcHN5X2xlZnQpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfcHN5X2xlZnQiKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3BzeV9sZWZ0KTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9kZXN0aW5hdGlvbiAocCwgOCwgImQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCA4LCAiczEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9wYXJhbWV0ZXJfZmxvYXQgKHAsIDQsICJwMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlcl9mbG9hdCAocCwgNCwgInAyIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQzIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MHFsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9TMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MXFsIiwgMCwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9TMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsZiIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDMsIE9SQ19WQVJfUDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGYiLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1AyLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhZGRmIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibWVyZ2VscSIsIDAsIE9SQ19WQVJfRDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDMsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisjZW5kaWYKKworICAgICAgb3JjX3Byb2dyYW1fY29tcGlsZSAocCk7CisgICAgICBjID0gb3JjX3Byb2dyYW1fdGFrZV9jb2RlIChwKTsKKyAgICAgIG9yY19wcm9ncmFtX2ZyZWUgKHApOworICAgIH0KKyAgICBwX2luaXRlZCA9IFRSVUU7CisgICAgb3JjX29uY2VfbXV0ZXhfdW5sb2NrICgpOworICB9CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9BMl0gPSBjOworICBleC0+cHJvZ3JhbSA9IDA7CisKKyAgZXgtPm4gPSBuOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKyAgeworICAgIG9yY191bmlvbjMyIHRtcDsKKyAgICB0bXAuZiA9IHAxOworICAgIGV4LT5wYXJhbXNbT1JDX1ZBUl9QMV0gPSB0bXAuaTsKKyAgfQorICB7CisgICAgb3JjX3VuaW9uMzIgdG1wOworICAgIHRtcC5mID0gcDI7CisgICAgZXgtPnBhcmFtc1tPUkNfVkFSX1AyXSA9IHRtcC5pOworICB9CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfc2ltX3JpZ2h0ICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfc2ltX3JpZ2h0IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjE2ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uMTYgdmFyMzU7CisgIG9yY191bmlvbjMyIHZhcjM2OworICBvcmNfdW5pb24zMiB2YXIzNzsKKyAgb3JjX3VuaW9uMzIgdmFyMzg7CisgIG9yY191bmlvbjMyIHZhcjM5OworICBvcmNfdW5pb24zMiB2YXI0MDsKKyAgb3JjX3VuaW9uNjQgdmFyNDE7CisgIG9yY191bmlvbjY0IHZhcjQyOworCisgIHB0cjAgPSAob3JjX3VuaW9uMzIgKikgZDE7CisgIHB0cjQgPSAob3JjX3VuaW9uMTYgKikgczE7CisKKyAgLyogMzogbG9hZHBsICovCisgIHZhcjM2LmYgPSBwMTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZHcgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMTogY29udnN3bCAqLworICAgIHZhcjM4LmkgPSB2YXIzNS5pOworICAgIC8qIDI6IGNvbnZsZiAqLworICAgIHZhcjM5LmYgPSB2YXIzOC5pOworICAgIC8qIDQ6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyMzkuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNi5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0MC5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDU6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyMzkuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyNDAuaTsKKyAgICAgIHZhcjQxLmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiA2OiBjb252ZmwgKi8KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDEueDJmWzBdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDEueDJbMF0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQyLngyWzBdID0gdG1wOworICAgIH0KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDEueDJmWzFdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDEueDJbMV0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQyLngyWzFdID0gdG1wOworICAgIH0KKyAgICAvKiA3OiBjb252c3NzbHcgKi8KKyAgICB2YXIzNy54MlswXSA9IE9SQ19DTEFNUF9TVyAodmFyNDIueDJbMF0pOworICAgIHZhcjM3LngyWzFdID0gT1JDX0NMQU1QX1NXICh2YXI0Mi54MlsxXSk7CisgICAgLyogODogc3RvcmVsICovCisgICAgcHRyMFtpXSA9IHZhcjM3OworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfc2ltX3JpZ2h0IChPcmNFeGVjdXRvciAqCisgICAgT1JDX1JFU1RSSUNUIGV4KQoreworICBpbnQgaTsKKyAgaW50IG4gPSBleC0+bjsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24xNiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjE2IHZhcjM1OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uMzIgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisgIG9yY191bmlvbjY0IHZhcjQxOworICBvcmNfdW5pb242NCB2YXI0MjsKKworICBwdHIwID0gKG9yY191bmlvbjMyICopIGV4LT5hcnJheXNbMF07CisgIHB0cjQgPSAob3JjX3VuaW9uMTYgKikgZXgtPmFycmF5c1s0XTsKKworICAvKiAzOiBsb2FkcGwgKi8KKyAgdmFyMzYuaSA9IGV4LT5wYXJhbXNbMjRdOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkdyAqLworICAgIHZhcjM1ID0gcHRyNFtpXTsKKyAgICAvKiAxOiBjb252c3dsICovCisgICAgdmFyMzguaSA9IHZhcjM1Lmk7CisgICAgLyogMjogY29udmxmICovCisgICAgdmFyMzkuZiA9IHZhcjM4Lmk7CisgICAgLyogNDogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXIzOS5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM2LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQwLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogNTogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXIzOS5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXI0MC5pOworICAgICAgdmFyNDEuaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDY6IGNvbnZmbCAqLworICAgIHsKKyAgICAgIGludCB0bXA7CisgICAgICB0bXAgPSAoaW50KSB2YXI0MS54MmZbMF07CisgICAgICBpZiAodG1wID09IDB4ODAwMDAwMDAgJiYgISh2YXI0MS54MlswXSAmIDB4ODAwMDAwMDApKQorICAgICAgICB0bXAgPSAweDdmZmZmZmZmOworICAgICAgdmFyNDIueDJbMF0gPSB0bXA7CisgICAgfQorICAgIHsKKyAgICAgIGludCB0bXA7CisgICAgICB0bXAgPSAoaW50KSB2YXI0MS54MmZbMV07CisgICAgICBpZiAodG1wID09IDB4ODAwMDAwMDAgJiYgISh2YXI0MS54MlsxXSAmIDB4ODAwMDAwMDApKQorICAgICAgICB0bXAgPSAweDdmZmZmZmZmOworICAgICAgdmFyNDIueDJbMV0gPSB0bXA7CisgICAgfQorICAgIC8qIDc6IGNvbnZzc3NsdyAqLworICAgIHZhcjM3LngyWzBdID0gT1JDX0NMQU1QX1NXICh2YXI0Mi54MlswXSk7CisgICAgdmFyMzcueDJbMV0gPSBPUkNfQ0xBTVBfU1cgKHZhcjQyLngyWzFdKTsKKyAgICAvKiA4OiBzdG9yZWwgKi8KKyAgICBwdHIwW2ldID0gdmFyMzc7CisgIH0KKworfQorCit2b2lkCithdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX3NpbV9yaWdodCAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGludCBuKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgOSwgNDQsIDk3LCAxMTcsIDEwMCwgMTA1LCAxMTEsIDExMiwgOTcsIDExMCwgMTExLCAxMTQsIDk3LCAxMDksIDk3LAorICAgICAgICAxMDksIDk1LCAxMTEsIDExNCwgOTksIDk1LCAxMTIsIDExNCwgMTExLCA5OSwgMTAxLCAxMTUsIDExNSwgOTUsIDExNSwKKyAgICAgICAgNDksCisgICAgICAgIDU0LCA5NSwgOTksIDEwNCwgNDksIDk1LCAxMTUsIDEwNSwgMTA5LCA5NSwgMTE0LCAxMDUsIDEwMywgMTA0LCAxMTYsIDExLAorICAgICAgICA0LCA0LCAxMiwgMiwgMiwgMTcsIDQsIDIwLCA4LCAyMCwgNCwgMjAsIDQsIDE1MywgMzMsIDQsCisgICAgICAgIDIxMSwgMzMsIDMzLCAyMDIsIDM0LCAzMywgMjQsIDE5NCwgMzIsIDMzLCAzNCwgMjEsIDEsIDIxMCwgMzIsIDMyLAorICAgICAgICAyMSwgMSwgMTY1LCAwLCAzMiwgMiwgMCwKKyAgICAgIH07CisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3X2Zyb21fc3RhdGljX2J5dGVjb2RlIChiYyk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9zaW1fcmlnaHQpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfc2ltX3JpZ2h0Iik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9zaW1fcmlnaHQpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCA0LCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDIsICJzMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlcl9mbG9hdCAocCwgNCwgInAxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA4LCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQzIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnN3bCIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfUzEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZsZiIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDIsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGYiLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1AxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtZXJnZWxxIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udmZsIiwgMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnNzc2x3IiwgMSwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9EMV0gPSBkMTsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX1MxXSA9ICh2b2lkICopIHMxOworICB7CisgICAgb3JjX3VuaW9uMzIgdG1wOworICAgIHRtcC5mID0gcDE7CisgICAgZXgtPnBhcmFtc1tPUkNfVkFSX1AxXSA9IHRtcC5pOworICB9CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfc2ltX2xlZnQgKi8KKyNpZmRlZiBESVNBQkxFX09SQwordm9pZAorYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9zaW1fbGVmdCAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGludCBuKQoreworICBpbnQgaTsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24xNiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjE2IHZhcjM1OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uMzIgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisgIG9yY191bmlvbjY0IHZhcjQxOworICBvcmNfdW5pb242NCB2YXI0MjsKKworICBwdHIwID0gKG9yY191bmlvbjMyICopIGQxOworICBwdHI0ID0gKG9yY191bmlvbjE2ICopIHMxOworCisgIC8qIDM6IGxvYWRwbCAqLworICB2YXIzNi5mID0gcDE7CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWR3ICovCisgICAgdmFyMzUgPSBwdHI0W2ldOworICAgIC8qIDE6IGNvbnZzd2wgKi8KKyAgICB2YXIzOC5pID0gdmFyMzUuaTsKKyAgICAvKiAyOiBjb252bGYgKi8KKyAgICB2YXIzOS5mID0gdmFyMzguaTsKKyAgICAvKiA0OiBtdWxmICovCisgICAgeworICAgICAgb3JjX3VuaW9uMzIgX3NyYzE7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMjsKKyAgICAgIG9yY191bmlvbjMyIF9kZXN0MTsKKyAgICAgIF9zcmMxLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM5LmkpOworICAgICAgX3NyYzIuaSA9IE9SQ19ERU5PUk1BTCAodmFyMzYuaSk7CisgICAgICBfZGVzdDEuZiA9IF9zcmMxLmYgKiBfc3JjMi5mOworICAgICAgdmFyNDAuaSA9IE9SQ19ERU5PUk1BTCAoX2Rlc3QxLmkpOworICAgIH0KKyAgICAvKiA1OiBtZXJnZWxxICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX2Rlc3Q7CisgICAgICBfZGVzdC54MlswXSA9IHZhcjQwLmk7CisgICAgICBfZGVzdC54MlsxXSA9IHZhcjM5Lmk7CisgICAgICB2YXI0MS5pID0gX2Rlc3QuaTsKKyAgICB9CisgICAgLyogNjogY29udmZsICovCisgICAgeworICAgICAgaW50IHRtcDsKKyAgICAgIHRtcCA9IChpbnQpIHZhcjQxLngyZlswXTsKKyAgICAgIGlmICh0bXAgPT0gMHg4MDAwMDAwMCAmJiAhKHZhcjQxLngyWzBdICYgMHg4MDAwMDAwMCkpCisgICAgICAgIHRtcCA9IDB4N2ZmZmZmZmY7CisgICAgICB2YXI0Mi54MlswXSA9IHRtcDsKKyAgICB9CisgICAgeworICAgICAgaW50IHRtcDsKKyAgICAgIHRtcCA9IChpbnQpIHZhcjQxLngyZlsxXTsKKyAgICAgIGlmICh0bXAgPT0gMHg4MDAwMDAwMCAmJiAhKHZhcjQxLngyWzFdICYgMHg4MDAwMDAwMCkpCisgICAgICAgIHRtcCA9IDB4N2ZmZmZmZmY7CisgICAgICB2YXI0Mi54MlsxXSA9IHRtcDsKKyAgICB9CisgICAgLyogNzogY29udnNzc2x3ICovCisgICAgdmFyMzcueDJbMF0gPSBPUkNfQ0xBTVBfU1cgKHZhcjQyLngyWzBdKTsKKyAgICB2YXIzNy54MlsxXSA9IE9SQ19DTEFNUF9TVyAodmFyNDIueDJbMV0pOworICAgIC8qIDg6IHN0b3JlbCAqLworICAgIHB0cjBbaV0gPSB2YXIzNzsKKyAgfQorCit9CisKKyNlbHNlCitzdGF0aWMgdm9pZAorX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX3NpbV9sZWZ0IChPcmNFeGVjdXRvciAqCisgICAgT1JDX1JFU1RSSUNUIGV4KQoreworICBpbnQgaTsKKyAgaW50IG4gPSBleC0+bjsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24xNiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjE2IHZhcjM1OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uMzIgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisgIG9yY191bmlvbjY0IHZhcjQxOworICBvcmNfdW5pb242NCB2YXI0MjsKKworICBwdHIwID0gKG9yY191bmlvbjMyICopIGV4LT5hcnJheXNbMF07CisgIHB0cjQgPSAob3JjX3VuaW9uMTYgKikgZXgtPmFycmF5c1s0XTsKKworICAvKiAzOiBsb2FkcGwgKi8KKyAgdmFyMzYuaSA9IGV4LT5wYXJhbXNbMjRdOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkdyAqLworICAgIHZhcjM1ID0gcHRyNFtpXTsKKyAgICAvKiAxOiBjb252c3dsICovCisgICAgdmFyMzguaSA9IHZhcjM1Lmk7CisgICAgLyogMjogY29udmxmICovCisgICAgdmFyMzkuZiA9IHZhcjM4Lmk7CisgICAgLyogNDogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXIzOS5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM2LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQwLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogNTogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXI0MC5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXIzOS5pOworICAgICAgdmFyNDEuaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDY6IGNvbnZmbCAqLworICAgIHsKKyAgICAgIGludCB0bXA7CisgICAgICB0bXAgPSAoaW50KSB2YXI0MS54MmZbMF07CisgICAgICBpZiAodG1wID09IDB4ODAwMDAwMDAgJiYgISh2YXI0MS54MlswXSAmIDB4ODAwMDAwMDApKQorICAgICAgICB0bXAgPSAweDdmZmZmZmZmOworICAgICAgdmFyNDIueDJbMF0gPSB0bXA7CisgICAgfQorICAgIHsKKyAgICAgIGludCB0bXA7CisgICAgICB0bXAgPSAoaW50KSB2YXI0MS54MmZbMV07CisgICAgICBpZiAodG1wID09IDB4ODAwMDAwMDAgJiYgISh2YXI0MS54MlsxXSAmIDB4ODAwMDAwMDApKQorICAgICAgICB0bXAgPSAweDdmZmZmZmZmOworICAgICAgdmFyNDIueDJbMV0gPSB0bXA7CisgICAgfQorICAgIC8qIDc6IGNvbnZzc3NsdyAqLworICAgIHZhcjM3LngyWzBdID0gT1JDX0NMQU1QX1NXICh2YXI0Mi54MlswXSk7CisgICAgdmFyMzcueDJbMV0gPSBPUkNfQ0xBTVBfU1cgKHZhcjQyLngyWzFdKTsKKyAgICAvKiA4OiBzdG9yZWwgKi8KKyAgICBwdHIwW2ldID0gdmFyMzc7CisgIH0KKworfQorCit2b2lkCithdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX3NpbV9sZWZ0IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pCit7CisgIE9yY0V4ZWN1dG9yIF9leCwgKmV4ID0gJl9leDsKKyAgc3RhdGljIHZvbGF0aWxlIGludCBwX2luaXRlZCA9IDA7CisgIHN0YXRpYyBPcmNDb2RlICpjID0gMDsKKyAgdm9pZCAoKmZ1bmMpIChPcmNFeGVjdXRvciAqKTsKKworICBpZiAoIXBfaW5pdGVkKSB7CisgICAgb3JjX29uY2VfbXV0ZXhfbG9jayAoKTsKKyAgICBpZiAoIXBfaW5pdGVkKSB7CisgICAgICBPcmNQcm9ncmFtICpwOworCisjaWYgMQorICAgICAgc3RhdGljIGNvbnN0IG9yY191aW50OCBiY1tdID0geworICAgICAgICAxLCA5LCA0MywgOTcsIDExNywgMTAwLCAxMDUsIDExMSwgMTEyLCA5NywgMTEwLCAxMTEsIDExNCwgOTcsIDEwOSwgOTcsCisgICAgICAgIDEwOSwgOTUsIDExMSwgMTE0LCA5OSwgOTUsIDExMiwgMTE0LCAxMTEsIDk5LCAxMDEsIDExNSwgMTE1LCA5NSwgMTE1LAorICAgICAgICA0OSwKKyAgICAgICAgNTQsIDk1LCA5OSwgMTA0LCA0OSwgOTUsIDExNSwgMTA1LCAxMDksIDk1LCAxMDgsIDEwMSwgMTAyLCAxMTYsIDExLCA0LAorICAgICAgICA0LCAxMiwgMiwgMiwgMTcsIDQsIDIwLCA4LCAyMCwgNCwgMjAsIDQsIDE1MywgMzQsIDQsIDIxMSwKKyAgICAgICAgMzQsIDM0LCAyMDIsIDMzLCAzNCwgMjQsIDE5NCwgMzIsIDMzLCAzNCwgMjEsIDEsIDIxMCwgMzIsIDMyLCAyMSwKKyAgICAgICAgMSwgMTY1LCAwLCAzMiwgMiwgMCwKKyAgICAgIH07CisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3X2Zyb21fc3RhdGljX2J5dGVjb2RlIChiYyk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9zaW1fbGVmdCk7CisjZWxzZQorICAgICAgcCA9IG9yY19wcm9ncmFtX25ldyAoKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9uYW1lIChwLCAiYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9zaW1fbGVmdCIpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfc2ltX2xlZnQpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCA0LCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDIsICJzMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlcl9mbG9hdCAocCwgNCwgInAxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA4LCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQzIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnN3bCIsIDAsIE9SQ19WQVJfVDMsIE9SQ19WQVJfUzEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZsZiIsIDAsIE9SQ19WQVJfVDMsIE9SQ19WQVJfVDMsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGYiLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1AxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtZXJnZWxxIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udmZsIiwgMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnNzc2x3IiwgMSwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9EMV0gPSBkMTsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX1MxXSA9ICh2b2lkICopIHMxOworICB7CisgICAgb3JjX3VuaW9uMzIgdG1wOworICAgIHRtcC5mID0gcDE7CisgICAgZXgtPnBhcmFtc1tPUkNfVkFSX1AxXSA9IHRtcC5pOworICB9CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfc2ltX3JpZ2h0ICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfc2ltX3JpZ2h0IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uMzIgdmFyMzU7CisgIG9yY191bmlvbjMyIHZhcjM2OworICBvcmNfdW5pb24zMiB2YXIzNzsKKyAgb3JjX3VuaW9uNjQgdmFyMzg7CisgIG9yY191bmlvbjY0IHZhcjM5OworICBvcmNfdW5pb24zMiB2YXI0MDsKKyAgb3JjX3VuaW9uMzIgdmFyNDE7CisgIG9yY191bmlvbjMyIHZhcjQyOworICBvcmNfdW5pb242NCB2YXI0MzsKKyAgb3JjX3VuaW9uNjQgdmFyNDQ7CisKKyAgcHRyMCA9IChvcmNfdW5pb24zMiAqKSBkMTsKKyAgcHRyNCA9IChvcmNfdW5pb24zMiAqKSBzMTsKKworICAvKiA1OiBsb2FkcGwgKi8KKyAgdmFyMzYuZiA9IHAxOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkbCAqLworICAgIHZhcjM1ID0gcHRyNFtpXTsKKyAgICAvKiAxOiBjb252c3dsICovCisgICAgdmFyMzgueDJbMF0gPSB2YXIzNS54MlswXTsKKyAgICB2YXIzOC54MlsxXSA9IHZhcjM1LngyWzFdOworICAgIC8qIDI6IGNvbnZsZiAqLworICAgIHZhcjM5LngyZlswXSA9IHZhcjM4LngyWzBdOworICAgIHZhcjM5LngyZlsxXSA9IHZhcjM4LngyWzFdOworICAgIC8qIDM6IHNlbGVjdDBxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXIzOS5pOworICAgICAgdmFyNDAuaSA9IF9zcmMueDJbMF07CisgICAgfQorICAgIC8qIDQ6IHNlbGVjdDFxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXIzOS5pOworICAgICAgdmFyNDEuaSA9IF9zcmMueDJbMV07CisgICAgfQorICAgIC8qIDY6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDEuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNi5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0Mi5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDc6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyNDAuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyNDIuaTsKKyAgICAgIHZhcjQzLmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiA4OiBjb252ZmwgKi8KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDMueDJmWzBdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDMueDJbMF0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ0LngyWzBdID0gdG1wOworICAgIH0KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDMueDJmWzFdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDMueDJbMV0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ0LngyWzFdID0gdG1wOworICAgIH0KKyAgICAvKiA5OiBjb252c3NzbHcgKi8KKyAgICB2YXIzNy54MlswXSA9IE9SQ19DTEFNUF9TVyAodmFyNDQueDJbMF0pOworICAgIHZhcjM3LngyWzFdID0gT1JDX0NMQU1QX1NXICh2YXI0NC54MlsxXSk7CisgICAgLyogMTA6IHN0b3JlbCAqLworICAgIHB0cjBbaV0gPSB2YXIzNzsKKyAgfQorCit9CisKKyNlbHNlCitzdGF0aWMgdm9pZAorX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3NpbV9yaWdodCAoT3JjRXhlY3V0b3IgKgorICAgIE9SQ19SRVNUUklDVCBleCkKK3sKKyAgaW50IGk7CisgIGludCBuID0gZXgtPm47CisgIG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb24zMiB2YXIzNTsKKyAgb3JjX3VuaW9uMzIgdmFyMzY7CisgIG9yY191bmlvbjMyIHZhcjM3OworICBvcmNfdW5pb242NCB2YXIzODsKKyAgb3JjX3VuaW9uNjQgdmFyMzk7CisgIG9yY191bmlvbjMyIHZhcjQwOworICBvcmNfdW5pb24zMiB2YXI0MTsKKyAgb3JjX3VuaW9uMzIgdmFyNDI7CisgIG9yY191bmlvbjY0IHZhcjQzOworICBvcmNfdW5pb242NCB2YXI0NDsKKworICBwdHIwID0gKG9yY191bmlvbjMyICopIGV4LT5hcnJheXNbMF07CisgIHB0cjQgPSAob3JjX3VuaW9uMzIgKikgZXgtPmFycmF5c1s0XTsKKworICAvKiA1OiBsb2FkcGwgKi8KKyAgdmFyMzYuaSA9IGV4LT5wYXJhbXNbMjRdOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkbCAqLworICAgIHZhcjM1ID0gcHRyNFtpXTsKKyAgICAvKiAxOiBjb252c3dsICovCisgICAgdmFyMzgueDJbMF0gPSB2YXIzNS54MlswXTsKKyAgICB2YXIzOC54MlsxXSA9IHZhcjM1LngyWzFdOworICAgIC8qIDI6IGNvbnZsZiAqLworICAgIHZhcjM5LngyZlswXSA9IHZhcjM4LngyWzBdOworICAgIHZhcjM5LngyZlsxXSA9IHZhcjM4LngyWzFdOworICAgIC8qIDM6IHNlbGVjdDBxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXIzOS5pOworICAgICAgdmFyNDAuaSA9IF9zcmMueDJbMF07CisgICAgfQorICAgIC8qIDQ6IHNlbGVjdDFxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXIzOS5pOworICAgICAgdmFyNDEuaSA9IF9zcmMueDJbMV07CisgICAgfQorICAgIC8qIDY6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDEuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNi5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0Mi5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDc6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyNDAuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyNDIuaTsKKyAgICAgIHZhcjQzLmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiA4OiBjb252ZmwgKi8KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDMueDJmWzBdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDMueDJbMF0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ0LngyWzBdID0gdG1wOworICAgIH0KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDMueDJmWzFdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDMueDJbMV0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ0LngyWzFdID0gdG1wOworICAgIH0KKyAgICAvKiA5OiBjb252c3NzbHcgKi8KKyAgICB2YXIzNy54MlswXSA9IE9SQ19DTEFNUF9TVyAodmFyNDQueDJbMF0pOworICAgIHZhcjM3LngyWzFdID0gT1JDX0NMQU1QX1NXICh2YXI0NC54MlsxXSk7CisgICAgLyogMTA6IHN0b3JlbCAqLworICAgIHB0cjBbaV0gPSB2YXIzNzsKKyAgfQorCit9CisKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfc2ltX3JpZ2h0IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pCit7CisgIE9yY0V4ZWN1dG9yIF9leCwgKmV4ID0gJl9leDsKKyAgc3RhdGljIHZvbGF0aWxlIGludCBwX2luaXRlZCA9IDA7CisgIHN0YXRpYyBPcmNDb2RlICpjID0gMDsKKyAgdm9pZCAoKmZ1bmMpIChPcmNFeGVjdXRvciAqKTsKKworICBpZiAoIXBfaW5pdGVkKSB7CisgICAgb3JjX29uY2VfbXV0ZXhfbG9jayAoKTsKKyAgICBpZiAoIXBfaW5pdGVkKSB7CisgICAgICBPcmNQcm9ncmFtICpwOworCisjaWYgMQorICAgICAgc3RhdGljIGNvbnN0IG9yY191aW50OCBiY1tdID0geworICAgICAgICAxLCA5LCA0NCwgOTcsIDExNywgMTAwLCAxMDUsIDExMSwgMTEyLCA5NywgMTEwLCAxMTEsIDExNCwgOTcsIDEwOSwgOTcsCisgICAgICAgIDEwOSwgOTUsIDExMSwgMTE0LCA5OSwgOTUsIDExMiwgMTE0LCAxMTEsIDk5LCAxMDEsIDExNSwgMTE1LCA5NSwgMTE1LAorICAgICAgICA0OSwKKyAgICAgICAgNTQsIDk1LCA5OSwgMTA0LCA1MCwgOTUsIDExNSwgMTA1LCAxMDksIDk1LCAxMTQsIDEwNSwgMTAzLCAxMDQsIDExNiwgMTEsCisgICAgICAgIDQsIDQsIDEyLCA0LCA0LCAxNywgNCwgMjAsIDgsIDIwLCA0LCAyMCwgNCwgMjEsIDEsIDE1MywKKyAgICAgICAgMzIsIDQsIDIxLCAxLCAyMTEsIDMyLCAzMiwgMTkyLCAzMywgMzIsIDE5MywgMzQsIDMyLCAyMDIsIDM0LCAzNCwKKyAgICAgICAgMjQsIDE5NCwgMzIsIDMzLCAzNCwgMjEsIDEsIDIxMCwgMzIsIDMyLCAyMSwgMSwgMTY1LCAwLCAzMiwgMiwKKyAgICAgICAgMCwKKyAgICAgIH07CisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3X2Zyb21fc3RhdGljX2J5dGVjb2RlIChiYyk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9zaW1fcmlnaHQpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfc2ltX3JpZ2h0Iik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9zaW1fcmlnaHQpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCA0LCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDQsICJzMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlcl9mbG9hdCAocCwgNCwgInAxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA4LCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQzIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnN3bCIsIDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfUzEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZsZiIsIDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInNlbGVjdDBxbCIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInNlbGVjdDFxbCIsIDAsIE9SQ19WQVJfVDMsIE9SQ19WQVJfVDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGYiLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1AxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtZXJnZWxxIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udmZsIiwgMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnNzc2x3IiwgMSwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9EMV0gPSBkMTsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX1MxXSA9ICh2b2lkICopIHMxOworICB7CisgICAgb3JjX3VuaW9uMzIgdG1wOworICAgIHRtcC5mID0gcDE7CisgICAgZXgtPnBhcmFtc1tPUkNfVkFSX1AxXSA9IHRtcC5pOworICB9CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfc2ltX2xlZnQgKi8KKyNpZmRlZiBESVNBQkxFX09SQwordm9pZAorYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9zaW1fbGVmdCAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGludCBuKQoreworICBpbnQgaTsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjMyIHZhcjM1OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uMzIgdmFyMzc7CisgIG9yY191bmlvbjY0IHZhcjM4OworICBvcmNfdW5pb242NCB2YXIzOTsKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisgIG9yY191bmlvbjMyIHZhcjQxOworICBvcmNfdW5pb24zMiB2YXI0MjsKKyAgb3JjX3VuaW9uNjQgdmFyNDM7CisgIG9yY191bmlvbjY0IHZhcjQ0OworCisgIHB0cjAgPSAob3JjX3VuaW9uMzIgKikgZDE7CisgIHB0cjQgPSAob3JjX3VuaW9uMzIgKikgczE7CisKKyAgLyogNTogbG9hZHBsICovCisgIHZhcjM2LmYgPSBwMTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGwgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMTogY29udnN3bCAqLworICAgIHZhcjM4LngyWzBdID0gdmFyMzUueDJbMF07CisgICAgdmFyMzgueDJbMV0gPSB2YXIzNS54MlsxXTsKKyAgICAvKiAyOiBjb252bGYgKi8KKyAgICB2YXIzOS54MmZbMF0gPSB2YXIzOC54MlswXTsKKyAgICB2YXIzOS54MmZbMV0gPSB2YXIzOC54MlsxXTsKKyAgICAvKiAzOiBzZWxlY3QwcWwgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfc3JjOworICAgICAgX3NyYy5pID0gdmFyMzkuaTsKKyAgICAgIHZhcjQwLmkgPSBfc3JjLngyWzBdOworICAgIH0KKyAgICAvKiA0OiBzZWxlY3QxcWwgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfc3JjOworICAgICAgX3NyYy5pID0gdmFyMzkuaTsKKyAgICAgIHZhcjQxLmkgPSBfc3JjLngyWzFdOworICAgIH0KKyAgICAvKiA2OiBtdWxmICovCisgICAgeworICAgICAgb3JjX3VuaW9uMzIgX3NyYzE7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMjsKKyAgICAgIG9yY191bmlvbjMyIF9kZXN0MTsKKyAgICAgIF9zcmMxLmkgPSBPUkNfREVOT1JNQUwgKHZhcjQwLmkpOworICAgICAgX3NyYzIuaSA9IE9SQ19ERU5PUk1BTCAodmFyMzYuaSk7CisgICAgICBfZGVzdDEuZiA9IF9zcmMxLmYgKiBfc3JjMi5mOworICAgICAgdmFyNDIuaSA9IE9SQ19ERU5PUk1BTCAoX2Rlc3QxLmkpOworICAgIH0KKyAgICAvKiA3OiBtZXJnZWxxICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX2Rlc3Q7CisgICAgICBfZGVzdC54MlswXSA9IHZhcjQyLmk7CisgICAgICBfZGVzdC54MlsxXSA9IHZhcjQxLmk7CisgICAgICB2YXI0My5pID0gX2Rlc3QuaTsKKyAgICB9CisgICAgLyogODogY29udmZsICovCisgICAgeworICAgICAgaW50IHRtcDsKKyAgICAgIHRtcCA9IChpbnQpIHZhcjQzLngyZlswXTsKKyAgICAgIGlmICh0bXAgPT0gMHg4MDAwMDAwMCAmJiAhKHZhcjQzLngyWzBdICYgMHg4MDAwMDAwMCkpCisgICAgICAgIHRtcCA9IDB4N2ZmZmZmZmY7CisgICAgICB2YXI0NC54MlswXSA9IHRtcDsKKyAgICB9CisgICAgeworICAgICAgaW50IHRtcDsKKyAgICAgIHRtcCA9IChpbnQpIHZhcjQzLngyZlsxXTsKKyAgICAgIGlmICh0bXAgPT0gMHg4MDAwMDAwMCAmJiAhKHZhcjQzLngyWzFdICYgMHg4MDAwMDAwMCkpCisgICAgICAgIHRtcCA9IDB4N2ZmZmZmZmY7CisgICAgICB2YXI0NC54MlsxXSA9IHRtcDsKKyAgICB9CisgICAgLyogOTogY29udnNzc2x3ICovCisgICAgdmFyMzcueDJbMF0gPSBPUkNfQ0xBTVBfU1cgKHZhcjQ0LngyWzBdKTsKKyAgICB2YXIzNy54MlsxXSA9IE9SQ19DTEFNUF9TVyAodmFyNDQueDJbMV0pOworICAgIC8qIDEwOiBzdG9yZWwgKi8KKyAgICBwdHIwW2ldID0gdmFyMzc7CisgIH0KKworfQorCisjZWxzZQorc3RhdGljIHZvaWQKK19iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9zaW1fbGVmdCAoT3JjRXhlY3V0b3IgKgorICAgIE9SQ19SRVNUUklDVCBleCkKK3sKKyAgaW50IGk7CisgIGludCBuID0gZXgtPm47CisgIG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb24zMiB2YXIzNTsKKyAgb3JjX3VuaW9uMzIgdmFyMzY7CisgIG9yY191bmlvbjMyIHZhcjM3OworICBvcmNfdW5pb242NCB2YXIzODsKKyAgb3JjX3VuaW9uNjQgdmFyMzk7CisgIG9yY191bmlvbjMyIHZhcjQwOworICBvcmNfdW5pb24zMiB2YXI0MTsKKyAgb3JjX3VuaW9uMzIgdmFyNDI7CisgIG9yY191bmlvbjY0IHZhcjQzOworICBvcmNfdW5pb242NCB2YXI0NDsKKworICBwdHIwID0gKG9yY191bmlvbjMyICopIGV4LT5hcnJheXNbMF07CisgIHB0cjQgPSAob3JjX3VuaW9uMzIgKikgZXgtPmFycmF5c1s0XTsKKworICAvKiA1OiBsb2FkcGwgKi8KKyAgdmFyMzYuaSA9IGV4LT5wYXJhbXNbMjRdOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkbCAqLworICAgIHZhcjM1ID0gcHRyNFtpXTsKKyAgICAvKiAxOiBjb252c3dsICovCisgICAgdmFyMzgueDJbMF0gPSB2YXIzNS54MlswXTsKKyAgICB2YXIzOC54MlsxXSA9IHZhcjM1LngyWzFdOworICAgIC8qIDI6IGNvbnZsZiAqLworICAgIHZhcjM5LngyZlswXSA9IHZhcjM4LngyWzBdOworICAgIHZhcjM5LngyZlsxXSA9IHZhcjM4LngyWzFdOworICAgIC8qIDM6IHNlbGVjdDBxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXIzOS5pOworICAgICAgdmFyNDAuaSA9IF9zcmMueDJbMF07CisgICAgfQorICAgIC8qIDQ6IHNlbGVjdDFxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXIzOS5pOworICAgICAgdmFyNDEuaSA9IF9zcmMueDJbMV07CisgICAgfQorICAgIC8qIDY6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDAuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNi5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0Mi5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDc6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyNDIuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyNDEuaTsKKyAgICAgIHZhcjQzLmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiA4OiBjb252ZmwgKi8KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDMueDJmWzBdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDMueDJbMF0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ0LngyWzBdID0gdG1wOworICAgIH0KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDMueDJmWzFdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDMueDJbMV0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ0LngyWzFdID0gdG1wOworICAgIH0KKyAgICAvKiA5OiBjb252c3NzbHcgKi8KKyAgICB2YXIzNy54MlswXSA9IE9SQ19DTEFNUF9TVyAodmFyNDQueDJbMF0pOworICAgIHZhcjM3LngyWzFdID0gT1JDX0NMQU1QX1NXICh2YXI0NC54MlsxXSk7CisgICAgLyogMTA6IHN0b3JlbCAqLworICAgIHB0cjBbaV0gPSB2YXIzNzsKKyAgfQorCit9CisKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfc2ltX2xlZnQgKGdpbnQxNiAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnaW50MTYgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbikKK3sKKyAgT3JjRXhlY3V0b3IgX2V4LCAqZXggPSAmX2V4OworICBzdGF0aWMgdm9sYXRpbGUgaW50IHBfaW5pdGVkID0gMDsKKyAgc3RhdGljIE9yY0NvZGUgKmMgPSAwOworICB2b2lkICgqZnVuYykgKE9yY0V4ZWN1dG9yICopOworCisgIGlmICghcF9pbml0ZWQpIHsKKyAgICBvcmNfb25jZV9tdXRleF9sb2NrICgpOworICAgIGlmICghcF9pbml0ZWQpIHsKKyAgICAgIE9yY1Byb2dyYW0gKnA7CisKKyNpZiAxCisgICAgICBzdGF0aWMgY29uc3Qgb3JjX3VpbnQ4IGJjW10gPSB7CisgICAgICAgIDEsIDksIDQzLCA5NywgMTE3LCAxMDAsIDEwNSwgMTExLCAxMTIsIDk3LCAxMTAsIDExMSwgMTE0LCA5NywgMTA5LCA5NywKKyAgICAgICAgMTA5LCA5NSwgMTExLCAxMTQsIDk5LCA5NSwgMTEyLCAxMTQsIDExMSwgOTksIDEwMSwgMTE1LCAxMTUsIDk1LCAxMTUsCisgICAgICAgIDQ5LAorICAgICAgICA1NCwgOTUsIDk5LCAxMDQsIDUwLCA5NSwgMTE1LCAxMDUsIDEwOSwgOTUsIDEwOCwgMTAxLCAxMDIsIDExNiwgMTEsIDQsCisgICAgICAgIDQsIDEyLCA0LCA0LCAxNywgNCwgMjAsIDgsIDIwLCA0LCAyMCwgNCwgMjEsIDEsIDE1MywgMzIsCisgICAgICAgIDQsIDIxLCAxLCAyMTEsIDMyLCAzMiwgMTkyLCAzMywgMzIsIDE5MywgMzQsIDMyLCAyMDIsIDMzLCAzMywgMjQsCisgICAgICAgIDE5NCwgMzIsIDMzLCAzNCwgMjEsIDEsIDIxMCwgMzIsIDMyLCAyMSwgMSwgMTY1LCAwLCAzMiwgMiwgMCwKKworICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3NpbV9sZWZ0KTsKKyNlbHNlCisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3ICgpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X25hbWUgKHAsICJhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3NpbV9sZWZ0Iik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9zaW1fbGVmdCk7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDQsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgNCwgInMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfcGFyYW1ldGVyX2Zsb2F0IChwLCA0LCAicDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDgsICJ0MSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQyIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDMiKTsKKworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252c3dsIiwgMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9TMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udmxmIiwgMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MHFsIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MXFsIiwgMCwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsZiIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDIsIE9SQ19WQVJfUDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm1lcmdlbHEiLCAwLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QzLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252ZmwiLCAxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252c3NzbHciLCAxLCBPUkNfVkFSX0QxLCBPUkNfVkFSX1QxLAorICAgICAgICAgIE9SQ19WQVJfRDEsIE9SQ19WQVJfRDEpOworI2VuZGlmCisKKyAgICAgIG9yY19wcm9ncmFtX2NvbXBpbGUgKHApOworICAgICAgYyA9IG9yY19wcm9ncmFtX3Rha2VfY29kZSAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9mcmVlIChwKTsKKyAgICB9CisgICAgcF9pbml0ZWQgPSBUUlVFOworICAgIG9yY19vbmNlX211dGV4X3VubG9jayAoKTsKKyAgfQorICBleC0+YXJyYXlzW09SQ19WQVJfQTJdID0gYzsKKyAgZXgtPnByb2dyYW0gPSAwOworCisgIGV4LT5uID0gbjsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX0QxXSA9IGQxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzFdID0gKHZvaWQgKikgczE7CisgIHsKKyAgICBvcmNfdW5pb24zMiB0bXA7CisgICAgdG1wLmYgPSBwMTsKKyAgICBleC0+cGFyYW1zW09SQ19WQVJfUDFdID0gdG1wLmk7CisgIH0KKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCisKKworLyogYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fcmlnaHQgKi8KKyNpZmRlZiBESVNBQkxFX09SQwordm9pZAorYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fcmlnaHQgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbikKK3sKKyAgaW50IGk7CisgIG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb24zMiB2YXIzNDsKKyAgb3JjX3VuaW9uMzIgdmFyMzU7CisgIG9yY191bmlvbjMyIHZhcjM2OworICBvcmNfdW5pb242NCB2YXIzNzsKKyAgb3JjX3VuaW9uMzIgdmFyMzg7CisgIG9yY191bmlvbjMyIHZhcjM5OworCisgIHB0cjAgPSAob3JjX3VuaW9uNjQgKikgZDE7CisgIHB0cjQgPSAob3JjX3VuaW9uMzIgKikgczE7CisKKyAgLyogMzogbG9hZHBsICovCisgIHZhcjM2LmYgPSBwMTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGwgKi8KKyAgICB2YXIzNCA9IHB0cjRbaV07CisgICAgLyogMTogY29weWwgKi8KKyAgICB2YXIzOC5pID0gdmFyMzQuaTsKKyAgICAvKiAyOiBsb2FkbCAqLworICAgIHZhcjM1ID0gcHRyNFtpXTsKKyAgICAvKiA0OiBtdWxmICovCisgICAgeworICAgICAgb3JjX3VuaW9uMzIgX3NyYzE7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMjsKKyAgICAgIG9yY191bmlvbjMyIF9kZXN0MTsKKyAgICAgIF9zcmMxLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM1LmkpOworICAgICAgX3NyYzIuaSA9IE9SQ19ERU5PUk1BTCAodmFyMzYuaSk7CisgICAgICBfZGVzdDEuZiA9IF9zcmMxLmYgKiBfc3JjMi5mOworICAgICAgdmFyMzkuaSA9IE9SQ19ERU5PUk1BTCAoX2Rlc3QxLmkpOworICAgIH0KKyAgICAvKiA1OiBtZXJnZWxxICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX2Rlc3Q7CisgICAgICBfZGVzdC54MlswXSA9IHZhcjM4Lmk7CisgICAgICBfZGVzdC54MlsxXSA9IHZhcjM5Lmk7CisgICAgICB2YXIzNy5pID0gX2Rlc3QuaTsKKyAgICB9CisgICAgLyogNjogc3RvcmVxICovCisgICAgcHRyMFtpXSA9IHZhcjM3OworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfc2ltX3JpZ2h0IChPcmNFeGVjdXRvciAqCisgICAgT1JDX1JFU1RSSUNUIGV4KQoreworICBpbnQgaTsKKyAgaW50IG4gPSBleC0+bjsKKyAgb3JjX3VuaW9uNjQgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjMyIHZhcjM0OworICBvcmNfdW5pb24zMiB2YXIzNTsKKyAgb3JjX3VuaW9uMzIgdmFyMzY7CisgIG9yY191bmlvbjY0IHZhcjM3OworICBvcmNfdW5pb24zMiB2YXIzODsKKyAgb3JjX3VuaW9uMzIgdmFyMzk7CisKKyAgcHRyMCA9IChvcmNfdW5pb242NCAqKSBleC0+YXJyYXlzWzBdOworICBwdHI0ID0gKG9yY191bmlvbjMyICopIGV4LT5hcnJheXNbNF07CisKKyAgLyogMzogbG9hZHBsICovCisgIHZhcjM2LmkgPSBleC0+cGFyYW1zWzI0XTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGwgKi8KKyAgICB2YXIzNCA9IHB0cjRbaV07CisgICAgLyogMTogY29weWwgKi8KKyAgICB2YXIzOC5pID0gdmFyMzQuaTsKKyAgICAvKiAyOiBsb2FkbCAqLworICAgIHZhcjM1ID0gcHRyNFtpXTsKKyAgICAvKiA0OiBtdWxmICovCisgICAgeworICAgICAgb3JjX3VuaW9uMzIgX3NyYzE7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMjsKKyAgICAgIG9yY191bmlvbjMyIF9kZXN0MTsKKyAgICAgIF9zcmMxLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM1LmkpOworICAgICAgX3NyYzIuaSA9IE9SQ19ERU5PUk1BTCAodmFyMzYuaSk7CisgICAgICBfZGVzdDEuZiA9IF9zcmMxLmYgKiBfc3JjMi5mOworICAgICAgdmFyMzkuaSA9IE9SQ19ERU5PUk1BTCAoX2Rlc3QxLmkpOworICAgIH0KKyAgICAvKiA1OiBtZXJnZWxxICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX2Rlc3Q7CisgICAgICBfZGVzdC54MlswXSA9IHZhcjM4Lmk7CisgICAgICBfZGVzdC54MlsxXSA9IHZhcjM5Lmk7CisgICAgICB2YXIzNy5pID0gX2Rlc3QuaTsKKyAgICB9CisgICAgLyogNjogc3RvcmVxICovCisgICAgcHRyMFtpXSA9IHZhcjM3OworICB9CisKK30KKwordm9pZAorYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fcmlnaHQgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbikKK3sKKyAgT3JjRXhlY3V0b3IgX2V4LCAqZXggPSAmX2V4OworICBzdGF0aWMgdm9sYXRpbGUgaW50IHBfaW5pdGVkID0gMDsKKyAgc3RhdGljIE9yY0NvZGUgKmMgPSAwOworICB2b2lkICgqZnVuYykgKE9yY0V4ZWN1dG9yICopOworCisgIGlmICghcF9pbml0ZWQpIHsKKyAgICBvcmNfb25jZV9tdXRleF9sb2NrICgpOworICAgIGlmICghcF9pbml0ZWQpIHsKKyAgICAgIE9yY1Byb2dyYW0gKnA7CisKKyNpZiAxCisgICAgICBzdGF0aWMgY29uc3Qgb3JjX3VpbnQ4IGJjW10gPSB7CisgICAgICAgIDEsIDksIDQ0LCA5NywgMTE3LCAxMDAsIDEwNSwgMTExLCAxMTIsIDk3LCAxMTAsIDExMSwgMTE0LCA5NywgMTA5LCA5NywKKyAgICAgICAgMTA5LCA5NSwgMTExLCAxMTQsIDk5LCA5NSwgMTEyLCAxMTQsIDExMSwgOTksIDEwMSwgMTE1LCAxMTUsIDk1LCAxMDIsCisgICAgICAgIDUxLAorICAgICAgICA1MCwgOTUsIDk5LCAxMDQsIDQ5LCA5NSwgMTE1LCAxMDUsIDEwOSwgOTUsIDExNCwgMTA1LCAxMDMsIDEwNCwgMTE2LCAxMSwKKyAgICAgICAgOCwgOCwgMTIsIDQsIDQsIDE3LCA0LCAyMCwgNCwgMjAsIDQsIDExMiwgMzIsIDQsIDIwMiwgMzMsCisgICAgICAgIDQsIDI0LCAxOTQsIDAsIDMyLCAzMywgMiwgMCwKKyAgICAgIH07CisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3X2Zyb21fc3RhdGljX2J5dGVjb2RlIChiYyk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fcmlnaHQpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfc2ltX3JpZ2h0Iik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fcmlnaHQpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCA4LCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDQsICJzMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlcl9mbG9hdCAocCwgNCwgInAxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MiIpOworCisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvcHlsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9TMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsZiIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfUzEsIE9SQ19WQVJfUDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm1lcmdlbHEiLCAwLCBPUkNfVkFSX0QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QyLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworI2VuZGlmCisKKyAgICAgIG9yY19wcm9ncmFtX2NvbXBpbGUgKHApOworICAgICAgYyA9IG9yY19wcm9ncmFtX3Rha2VfY29kZSAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9mcmVlIChwKTsKKyAgICB9CisgICAgcF9pbml0ZWQgPSBUUlVFOworICAgIG9yY19vbmNlX211dGV4X3VubG9jayAoKTsKKyAgfQorICBleC0+YXJyYXlzW09SQ19WQVJfQTJdID0gYzsKKyAgZXgtPnByb2dyYW0gPSAwOworCisgIGV4LT5uID0gbjsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX0QxXSA9IGQxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzFdID0gKHZvaWQgKikgczE7CisgIHsKKyAgICBvcmNfdW5pb24zMiB0bXA7CisgICAgdG1wLmYgPSBwMTsKKyAgICBleC0+cGFyYW1zW09SQ19WQVJfUDFdID0gdG1wLmk7CisgIH0KKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCisKKworLyogYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fbGVmdCAqLworI2lmZGVmIERJU0FCTEVfT1JDCit2b2lkCithdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX3NpbV9sZWZ0IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uMzIgdmFyMzQ7CisgIG9yY191bmlvbjMyIHZhcjM1OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uNjQgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKworICBwdHIwID0gKG9yY191bmlvbjY0ICopIGQxOworICBwdHI0ID0gKG9yY191bmlvbjMyICopIHMxOworCisgIC8qIDE6IGxvYWRwbCAqLworICB2YXIzNS5mID0gcDE7CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRsICovCisgICAgdmFyMzQgPSBwdHI0W2ldOworICAgIC8qIDI6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyMzQuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNS5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXIzOC5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDM6IGxvYWRsICovCisgICAgdmFyMzYgPSBwdHI0W2ldOworICAgIC8qIDQ6IGNvcHlsICovCisgICAgdmFyMzkuaSA9IHZhcjM2Lmk7CisgICAgLyogNTogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXIzOC5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXIzOS5pOworICAgICAgdmFyMzcuaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDY6IHN0b3JlcSAqLworICAgIHB0cjBbaV0gPSB2YXIzNzsKKyAgfQorCit9CisKKyNlbHNlCitzdGF0aWMgdm9pZAorX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX3NpbV9sZWZ0IChPcmNFeGVjdXRvciAqCisgICAgT1JDX1JFU1RSSUNUIGV4KQoreworICBpbnQgaTsKKyAgaW50IG4gPSBleC0+bjsKKyAgb3JjX3VuaW9uNjQgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjMyIHZhcjM0OworICBvcmNfdW5pb24zMiB2YXIzNTsKKyAgb3JjX3VuaW9uMzIgdmFyMzY7CisgIG9yY191bmlvbjY0IHZhcjM3OworICBvcmNfdW5pb24zMiB2YXIzODsKKyAgb3JjX3VuaW9uMzIgdmFyMzk7CisKKyAgcHRyMCA9IChvcmNfdW5pb242NCAqKSBleC0+YXJyYXlzWzBdOworICBwdHI0ID0gKG9yY191bmlvbjMyICopIGV4LT5hcnJheXNbNF07CisKKyAgLyogMTogbG9hZHBsICovCisgIHZhcjM1LmkgPSBleC0+cGFyYW1zWzI0XTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGwgKi8KKyAgICB2YXIzNCA9IHB0cjRbaV07CisgICAgLyogMjogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXIzNC5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM1LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjM4LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogMzogbG9hZGwgKi8KKyAgICB2YXIzNiA9IHB0cjRbaV07CisgICAgLyogNDogY29weWwgKi8KKyAgICB2YXIzOS5pID0gdmFyMzYuaTsKKyAgICAvKiA1OiBtZXJnZWxxICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX2Rlc3Q7CisgICAgICBfZGVzdC54MlswXSA9IHZhcjM4Lmk7CisgICAgICBfZGVzdC54MlsxXSA9IHZhcjM5Lmk7CisgICAgICB2YXIzNy5pID0gX2Rlc3QuaTsKKyAgICB9CisgICAgLyogNjogc3RvcmVxICovCisgICAgcHRyMFtpXSA9IHZhcjM3OworICB9CisKK30KKwordm9pZAorYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fbGVmdCAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdmbG9hdCAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGludCBuKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgOSwgNDMsIDk3LCAxMTcsIDEwMCwgMTA1LCAxMTEsIDExMiwgOTcsIDExMCwgMTExLCAxMTQsIDk3LCAxMDksIDk3LAorICAgICAgICAxMDksIDk1LCAxMTEsIDExNCwgOTksIDk1LCAxMTIsIDExNCwgMTExLCA5OSwgMTAxLCAxMTUsIDExNSwgOTUsIDEwMiwKKyAgICAgICAgNTEsCisgICAgICAgIDUwLCA5NSwgOTksIDEwNCwgNDksIDk1LCAxMTUsIDEwNSwgMTA5LCA5NSwgMTA4LCAxMDEsIDEwMiwgMTE2LCAxMSwgOCwKKyAgICAgICAgOCwgMTIsIDQsIDQsIDE3LCA0LCAyMCwgNCwgMjAsIDQsIDIwMiwgMzIsIDQsIDI0LCAxMTIsIDMzLAorICAgICAgICA0LCAxOTQsIDAsIDMyLCAzMywgMiwgMCwKKyAgICAgIH07CisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3X2Zyb21fc3RhdGljX2J5dGVjb2RlIChiYyk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fbGVmdCk7CisjZWxzZQorICAgICAgcCA9IG9yY19wcm9ncmFtX25ldyAoKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9uYW1lIChwLCAiYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fbGVmdCIpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfc2ltX2xlZnQpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCA4LCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDQsICJzMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlcl9mbG9hdCAocCwgNCwgInAxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MiIpOworCisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGYiLCAwLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1MxLCBPUkNfVkFSX1AxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb3B5bCIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfUzEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm1lcmdlbHEiLCAwLCBPUkNfVkFSX0QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QyLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworI2VuZGlmCisKKyAgICAgIG9yY19wcm9ncmFtX2NvbXBpbGUgKHApOworICAgICAgYyA9IG9yY19wcm9ncmFtX3Rha2VfY29kZSAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9mcmVlIChwKTsKKyAgICB9CisgICAgcF9pbml0ZWQgPSBUUlVFOworICAgIG9yY19vbmNlX211dGV4X3VubG9jayAoKTsKKyAgfQorICBleC0+YXJyYXlzW09SQ19WQVJfQTJdID0gYzsKKyAgZXgtPnByb2dyYW0gPSAwOworCisgIGV4LT5uID0gbjsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX0QxXSA9IGQxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzFdID0gKHZvaWQgKikgczE7CisgIHsKKyAgICBvcmNfdW5pb24zMiB0bXA7CisgICAgdG1wLmYgPSBwMTsKKyAgICBleC0+cGFyYW1zW09SQ19WQVJfUDFdID0gdG1wLmk7CisgIH0KKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCisKKworLyogYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9zaW1fcmlnaHQgKi8KKyNpZmRlZiBESVNBQkxFX09SQwordm9pZAorYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9zaW1fcmlnaHQgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbikKK3sKKyAgaW50IGk7CisgIG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uNjQgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb242NCB2YXIzNDsKKyAgb3JjX3VuaW9uNjQgdmFyMzU7CisgIG9yY191bmlvbjMyIHZhcjM2OworICBvcmNfdW5pb242NCB2YXIzNzsKKyAgb3JjX3VuaW9uMzIgdmFyMzg7CisgIG9yY191bmlvbjMyIHZhcjM5OworICBvcmNfdW5pb24zMiB2YXI0MDsKKworICBwdHIwID0gKG9yY191bmlvbjY0ICopIGQxOworICBwdHI0ID0gKG9yY191bmlvbjY0ICopIHMxOworCisgIC8qIDQ6IGxvYWRwbCAqLworICB2YXIzNi5mID0gcDE7CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRxICovCisgICAgdmFyMzQgPSBwdHI0W2ldOworICAgIC8qIDE6IHNlbGVjdDBxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXIzNC5pOworICAgICAgdmFyMzguaSA9IF9zcmMueDJbMF07CisgICAgfQorICAgIC8qIDI6IGxvYWRxICovCisgICAgdmFyMzUgPSBwdHI0W2ldOworICAgIC8qIDM6IHNlbGVjdDFxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXIzNS5pOworICAgICAgdmFyMzkuaSA9IF9zcmMueDJbMV07CisgICAgfQorICAgIC8qIDU6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyMzkuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNi5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0MC5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDY6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyMzguaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyNDAuaTsKKyAgICAgIHZhcjM3LmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiA3OiBzdG9yZXEgKi8KKyAgICBwdHIwW2ldID0gdmFyMzc7CisgIH0KKworfQorCisjZWxzZQorc3RhdGljIHZvaWQKK19iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9zaW1fcmlnaHQgKE9yY0V4ZWN1dG9yICoKKyAgICBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgbiA9IGV4LT5uOworICBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uNjQgdmFyMzQ7CisgIG9yY191bmlvbjY0IHZhcjM1OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uNjQgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisKKyAgcHRyMCA9IChvcmNfdW5pb242NCAqKSBleC0+YXJyYXlzWzBdOworICBwdHI0ID0gKG9yY191bmlvbjY0ICopIGV4LT5hcnJheXNbNF07CisKKyAgLyogNDogbG9hZHBsICovCisgIHZhcjM2LmkgPSBleC0+cGFyYW1zWzI0XTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZHEgKi8KKyAgICB2YXIzNCA9IHB0cjRbaV07CisgICAgLyogMTogc2VsZWN0MHFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjM0Lmk7CisgICAgICB2YXIzOC5pID0gX3NyYy54MlswXTsKKyAgICB9CisgICAgLyogMjogbG9hZHEgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMzogc2VsZWN0MXFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjM1Lmk7CisgICAgICB2YXIzOS5pID0gX3NyYy54MlsxXTsKKyAgICB9CisgICAgLyogNTogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXIzOS5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM2LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQwLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogNjogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXIzOC5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXI0MC5pOworICAgICAgdmFyMzcuaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDc6IHN0b3JlcSAqLworICAgIHB0cjBbaV0gPSB2YXIzNzsKKyAgfQorCit9CisKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfc2ltX3JpZ2h0IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pCit7CisgIE9yY0V4ZWN1dG9yIF9leCwgKmV4ID0gJl9leDsKKyAgc3RhdGljIHZvbGF0aWxlIGludCBwX2luaXRlZCA9IDA7CisgIHN0YXRpYyBPcmNDb2RlICpjID0gMDsKKyAgdm9pZCAoKmZ1bmMpIChPcmNFeGVjdXRvciAqKTsKKworICBpZiAoIXBfaW5pdGVkKSB7CisgICAgb3JjX29uY2VfbXV0ZXhfbG9jayAoKTsKKyAgICBpZiAoIXBfaW5pdGVkKSB7CisgICAgICBPcmNQcm9ncmFtICpwOworCisjaWYgMQorICAgICAgc3RhdGljIGNvbnN0IG9yY191aW50OCBiY1tdID0geworICAgICAgICAxLCA5LCA0NCwgOTcsIDExNywgMTAwLCAxMDUsIDExMSwgMTEyLCA5NywgMTEwLCAxMTEsIDExNCwgOTcsIDEwOSwgOTcsCisgICAgICAgIDEwOSwgOTUsIDExMSwgMTE0LCA5OSwgOTUsIDExMiwgMTE0LCAxMTEsIDk5LCAxMDEsIDExNSwgMTE1LCA5NSwgMTAyLAorICAgICAgICA1MSwKKyAgICAgICAgNTAsIDk1LCA5OSwgMTA0LCA1MCwgOTUsIDExNSwgMTA1LCAxMDksIDk1LCAxMTQsIDEwNSwgMTAzLCAxMDQsIDExNiwgMTEsCisgICAgICAgIDgsIDgsIDEyLCA4LCA4LCAxNywgNCwgMjAsIDQsIDIwLCA0LCAxOTIsIDMyLCA0LCAxOTMsIDMzLAorICAgICAgICA0LCAyMDIsIDMzLCAzMywgMjQsIDE5NCwgMCwgMzIsIDMzLCAyLCAwLAorICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3NpbV9yaWdodCk7CisjZWxzZQorICAgICAgcCA9IG9yY19wcm9ncmFtX25ldyAoKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9uYW1lIChwLCAiYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9zaW1fcmlnaHQiKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3NpbV9yaWdodCk7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDgsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgOCwgInMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfcGFyYW1ldGVyX2Zsb2F0IChwLCA0LCAicDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQyIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MHFsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9TMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MXFsIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9TMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsZiIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDIsIE9SQ19WQVJfUDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm1lcmdlbHEiLCAwLCBPUkNfVkFSX0QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QyLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworI2VuZGlmCisKKyAgICAgIG9yY19wcm9ncmFtX2NvbXBpbGUgKHApOworICAgICAgYyA9IG9yY19wcm9ncmFtX3Rha2VfY29kZSAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9mcmVlIChwKTsKKyAgICB9CisgICAgcF9pbml0ZWQgPSBUUlVFOworICAgIG9yY19vbmNlX211dGV4X3VubG9jayAoKTsKKyAgfQorICBleC0+YXJyYXlzW09SQ19WQVJfQTJdID0gYzsKKyAgZXgtPnByb2dyYW0gPSAwOworCisgIGV4LT5uID0gbjsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX0QxXSA9IGQxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzFdID0gKHZvaWQgKikgczE7CisgIHsKKyAgICBvcmNfdW5pb24zMiB0bXA7CisgICAgdG1wLmYgPSBwMTsKKyAgICBleC0+cGFyYW1zW09SQ19WQVJfUDFdID0gdG1wLmk7CisgIH0KKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCisKKworLyogYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9zaW1fbGVmdCAqLworI2lmZGVmIERJU0FCTEVfT1JDCit2b2lkCithdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3NpbV9sZWZ0IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uNjQgdmFyMzQ7CisgIG9yY191bmlvbjY0IHZhcjM1OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uNjQgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisKKyAgcHRyMCA9IChvcmNfdW5pb242NCAqKSBkMTsKKyAgcHRyNCA9IChvcmNfdW5pb242NCAqKSBzMTsKKworICAvKiA0OiBsb2FkcGwgKi8KKyAgdmFyMzYuZiA9IHAxOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkcSAqLworICAgIHZhcjM0ID0gcHRyNFtpXTsKKyAgICAvKiAxOiBzZWxlY3QwcWwgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfc3JjOworICAgICAgX3NyYy5pID0gdmFyMzQuaTsKKyAgICAgIHZhcjM4LmkgPSBfc3JjLngyWzBdOworICAgIH0KKyAgICAvKiAyOiBsb2FkcSAqLworICAgIHZhcjM1ID0gcHRyNFtpXTsKKyAgICAvKiAzOiBzZWxlY3QxcWwgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfc3JjOworICAgICAgX3NyYy5pID0gdmFyMzUuaTsKKyAgICAgIHZhcjM5LmkgPSBfc3JjLngyWzFdOworICAgIH0KKyAgICAvKiA1OiBtdWxmICovCisgICAgeworICAgICAgb3JjX3VuaW9uMzIgX3NyYzE7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMjsKKyAgICAgIG9yY191bmlvbjMyIF9kZXN0MTsKKyAgICAgIF9zcmMxLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM4LmkpOworICAgICAgX3NyYzIuaSA9IE9SQ19ERU5PUk1BTCAodmFyMzYuaSk7CisgICAgICBfZGVzdDEuZiA9IF9zcmMxLmYgKiBfc3JjMi5mOworICAgICAgdmFyNDAuaSA9IE9SQ19ERU5PUk1BTCAoX2Rlc3QxLmkpOworICAgIH0KKyAgICAvKiA2OiBtZXJnZWxxICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX2Rlc3Q7CisgICAgICBfZGVzdC54MlswXSA9IHZhcjQwLmk7CisgICAgICBfZGVzdC54MlsxXSA9IHZhcjM5Lmk7CisgICAgICB2YXIzNy5pID0gX2Rlc3QuaTsKKyAgICB9CisgICAgLyogNzogc3RvcmVxICovCisgICAgcHRyMFtpXSA9IHZhcjM3OworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfc2ltX2xlZnQgKE9yY0V4ZWN1dG9yICoKKyAgICBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgbiA9IGV4LT5uOworICBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uNjQgdmFyMzQ7CisgIG9yY191bmlvbjY0IHZhcjM1OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uNjQgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisKKyAgcHRyMCA9IChvcmNfdW5pb242NCAqKSBleC0+YXJyYXlzWzBdOworICBwdHI0ID0gKG9yY191bmlvbjY0ICopIGV4LT5hcnJheXNbNF07CisKKyAgLyogNDogbG9hZHBsICovCisgIHZhcjM2LmkgPSBleC0+cGFyYW1zWzI0XTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZHEgKi8KKyAgICB2YXIzNCA9IHB0cjRbaV07CisgICAgLyogMTogc2VsZWN0MHFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjM0Lmk7CisgICAgICB2YXIzOC5pID0gX3NyYy54MlswXTsKKyAgICB9CisgICAgLyogMjogbG9hZHEgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMzogc2VsZWN0MXFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjM1Lmk7CisgICAgICB2YXIzOS5pID0gX3NyYy54MlsxXTsKKyAgICB9CisgICAgLyogNTogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXIzOC5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM2LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQwLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogNjogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXI0MC5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXIzOS5pOworICAgICAgdmFyMzcuaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDc6IHN0b3JlcSAqLworICAgIHB0cjBbaV0gPSB2YXIzNzsKKyAgfQorCit9CisKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfc2ltX2xlZnQgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbikKK3sKKyAgT3JjRXhlY3V0b3IgX2V4LCAqZXggPSAmX2V4OworICBzdGF0aWMgdm9sYXRpbGUgaW50IHBfaW5pdGVkID0gMDsKKyAgc3RhdGljIE9yY0NvZGUgKmMgPSAwOworICB2b2lkICgqZnVuYykgKE9yY0V4ZWN1dG9yICopOworCisgIGlmICghcF9pbml0ZWQpIHsKKyAgICBvcmNfb25jZV9tdXRleF9sb2NrICgpOworICAgIGlmICghcF9pbml0ZWQpIHsKKyAgICAgIE9yY1Byb2dyYW0gKnA7CisKKyNpZiAxCisgICAgICBzdGF0aWMgY29uc3Qgb3JjX3VpbnQ4IGJjW10gPSB7CisgICAgICAgIDEsIDksIDQzLCA5NywgMTE3LCAxMDAsIDEwNSwgMTExLCAxMTIsIDk3LCAxMTAsIDExMSwgMTE0LCA5NywgMTA5LCA5NywKKyAgICAgICAgMTA5LCA5NSwgMTExLCAxMTQsIDk5LCA5NSwgMTEyLCAxMTQsIDExMSwgOTksIDEwMSwgMTE1LCAxMTUsIDk1LCAxMDIsCisgICAgICAgIDUxLAorICAgICAgICA1MCwgOTUsIDk5LCAxMDQsIDUwLCA5NSwgMTE1LCAxMDUsIDEwOSwgOTUsIDEwOCwgMTAxLCAxMDIsIDExNiwgMTEsIDgsCisgICAgICAgIDgsIDEyLCA4LCA4LCAxNywgNCwgMjAsIDQsIDIwLCA0LCAxOTIsIDMyLCA0LCAxOTMsIDMzLCA0LAorICAgICAgICAyMDIsIDMyLCAzMiwgMjQsIDE5NCwgMCwgMzIsIDMzLCAyLCAwLAorICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3NpbV9sZWZ0KTsKKyNlbHNlCisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3ICgpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X25hbWUgKHAsICJhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3NpbV9sZWZ0Iik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9zaW1fbGVmdCk7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDgsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgOCwgInMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfcGFyYW1ldGVyX2Zsb2F0IChwLCA0LCAicDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQyIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MHFsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9TMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MXFsIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9TMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsZiIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfUDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm1lcmdlbHEiLCAwLCBPUkNfVkFSX0QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QyLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworI2VuZGlmCisKKyAgICAgIG9yY19wcm9ncmFtX2NvbXBpbGUgKHApOworICAgICAgYyA9IG9yY19wcm9ncmFtX3Rha2VfY29kZSAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9mcmVlIChwKTsKKyAgICB9CisgICAgcF9pbml0ZWQgPSBUUlVFOworICAgIG9yY19vbmNlX211dGV4X3VubG9jayAoKTsKKyAgfQorICBleC0+YXJyYXlzW09SQ19WQVJfQTJdID0gYzsKKyAgZXgtPnByb2dyYW0gPSAwOworCisgIGV4LT5uID0gbjsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX0QxXSA9IGQxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzFdID0gKHZvaWQgKikgczE7CisgIHsKKyAgICBvcmNfdW5pb24zMiB0bXA7CisgICAgdG1wLmYgPSBwMTsKKyAgICBleC0+cGFyYW1zW09SQ19WQVJfUDFdID0gdG1wLmk7CisgIH0KKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hb3JjLWRpc3QuaCBiL2dzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWFvcmMtZGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MTFmYmEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hb3JjLWRpc3QuaApAQCAtMCwwICsxLDEwNyBAQAorCisvKiBhdXRvZ2VuZXJhdGVkIGZyb20gYXVkaW9wYW5vcmFtYW9yYy5vcmMgKi8KKworI2lmbmRlZiBfQVVESU9QQU5PUkFNQU9SQ19IXworI2RlZmluZSBfQVVESU9QQU5PUkFNQU9SQ19IXworCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworCisjaWZuZGVmIF9PUkNfSU5URUdFUl9UWVBFREVGU18KKyNkZWZpbmUgX09SQ19JTlRFR0VSX1RZUEVERUZTXworI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjaW5jbHVkZSA8c3RkaW50Lmg+Cit0eXBlZGVmIGludDhfdCBvcmNfaW50ODsKK3R5cGVkZWYgaW50MTZfdCBvcmNfaW50MTY7Cit0eXBlZGVmIGludDMyX3Qgb3JjX2ludDMyOwordHlwZWRlZiBpbnQ2NF90IG9yY19pbnQ2NDsKK3R5cGVkZWYgdWludDhfdCBvcmNfdWludDg7Cit0eXBlZGVmIHVpbnQxNl90IG9yY191aW50MTY7Cit0eXBlZGVmIHVpbnQzMl90IG9yY191aW50MzI7Cit0eXBlZGVmIHVpbnQ2NF90IG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSBVSU5UNjRfQyh4KQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKK3R5cGVkZWYgc2lnbmVkIF9faW50OCBvcmNfaW50ODsKK3R5cGVkZWYgc2lnbmVkIF9faW50MTYgb3JjX2ludDE2OwordHlwZWRlZiBzaWduZWQgX19pbnQzMiBvcmNfaW50MzI7Cit0eXBlZGVmIHNpZ25lZCBfX2ludDY0IG9yY19pbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ4IG9yY191aW50ODsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQxNiBvcmNfdWludDE2OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDMyIG9yY191aW50MzI7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgb3JjX3VpbnQ2NDsKKyNkZWZpbmUgT1JDX1VJTlQ2NF9DKHgpICh4IyNVaTY0KQorI2RlZmluZSBpbmxpbmUgX19pbmxpbmUKKyNlbHNlCisjaW5jbHVkZSA8bGltaXRzLmg+Cit0eXBlZGVmIHNpZ25lZCBjaGFyIG9yY19pbnQ4OwordHlwZWRlZiBzaG9ydCBvcmNfaW50MTY7Cit0eXBlZGVmIGludCBvcmNfaW50MzI7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgb3JjX3VpbnQ4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBvcmNfdWludDE2OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgb3JjX3VpbnQzMjsKKyNpZiBJTlRfTUFYID09IExPTkdfTUFYCit0eXBlZGVmIGxvbmcgbG9uZyBvcmNfaW50NjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgKHgjI1VMTCkKKyNlbHNlCit0eXBlZGVmIGxvbmcgb3JjX2ludDY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSAoeCMjVUwpCisjZW5kaWYKKyNlbmRpZgordHlwZWRlZiB1bmlvbiB7IG9yY19pbnQxNiBpOyBvcmNfaW50OCB4MlsyXTsgfSBvcmNfdW5pb24xNjsKK3R5cGVkZWYgdW5pb24geyBvcmNfaW50MzIgaTsgZmxvYXQgZjsgb3JjX2ludDE2IHgyWzJdOyBvcmNfaW50OCB4NFs0XTsgfSBvcmNfdW5pb24zMjsKK3R5cGVkZWYgdW5pb24geyBvcmNfaW50NjQgaTsgZG91YmxlIGY7IG9yY19pbnQzMiB4MlsyXTsgZmxvYXQgeDJmWzJdOyBvcmNfaW50MTYgeDRbNF07IH0gb3JjX3VuaW9uNjQ7CisjZW5kaWYKKyNpZm5kZWYgT1JDX1JFU1RSSUNUCisjaWYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyNkZWZpbmUgT1JDX1JFU1RSSUNUIHJlc3RyaWN0CisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSA0CisjZGVmaW5lIE9SQ19SRVNUUklDVCBfX3Jlc3RyaWN0X18KKyNlbHNlCisjZGVmaW5lIE9SQ19SRVNUUklDVAorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBPUkNfSU5URVJOQUwKKyNpZiBkZWZpbmVkKF9fU1VOUFJPX0MpICYmIChfX1NVTlBST19DID49IDB4NTkwKQorI2RlZmluZSBPUkNfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlkZGVuIikpKQorI2VsaWYgZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU1MCkKKyNkZWZpbmUgT1JDX0lOVEVSTkFMIF9faGlkZGVuCisjZWxpZiBkZWZpbmVkIChfX0dOVUNfXykKKyNkZWZpbmUgT1JDX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNlbHNlCisjZGVmaW5lIE9SQ19JTlRFUk5BTAorI2VuZGlmCisjZW5kaWYKKwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX25vbmUgKGdpbnQxNiAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfbm9uZSAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLCBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGludCBuKTsKK3ZvaWQgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9ub25lIChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgaW50IG4pOwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX25vbmUgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfcHN5IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGZsb2F0IHAyLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfcHN5IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsIGNvbnN0IGdmbG9hdCAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGZsb2F0IHAyLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfcHN5X3JpZ2h0IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGZsb2F0IHAyLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfcHN5X2xlZnQgKGdpbnQxNiAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKTsKK3ZvaWQgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9wc3lfcmlnaHQgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKTsKK3ZvaWQgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9wc3lfbGVmdCAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLCBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBmbG9hdCBwMiwgaW50IG4pOwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX3NpbV9yaWdodCAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLCBjb25zdCBnaW50MTYgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfc2ltX2xlZnQgKGdpbnQxNiAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pOwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3NpbV9yaWdodCAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLCBjb25zdCBnaW50MTYgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfc2ltX2xlZnQgKGdpbnQxNiAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pOwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX3NpbV9yaWdodCAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLCBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfc2ltX2xlZnQgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pOwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3NpbV9yaWdodCAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLCBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfc2ltX2xlZnQgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYW9yYy5vcmMgYi9nc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hb3JjLm9yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjE0MDExCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYW9yYy5vcmMKQEAgLTAsMCArMSwyNTggQEAKKyMgcGFzcyB0aHJvdWdoIGZ1bmN0aW9ucworCisuZnVuY3Rpb24gYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9ub25lCisuc291cmNlIDIgczEgZ2ludDE2CisuZGVzdCA0IGQxIGdpbnQxNgorCittZXJnZXdsIGQxIHMxIHMxCisKKworLmZ1bmN0aW9uIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfbm9uZQorLnNvdXJjZSA0IHMxIGdmbG9hdAorLmRlc3QgOCBkMSBnZmxvYXQKKworbWVyZ2VscSBkMSBzMSBzMQorCisKKy5mdW5jdGlvbiBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX25vbmUKKy5zb3VyY2UgNCBzMSBnaW50MTYKKy5kZXN0IDQgZDEgZ2ludDE2CisKK3gyIGNvcHl3IGQxIHMxCisKKworLmZ1bmN0aW9uIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfbm9uZQorLnNvdXJjZSA4IHMxIGdmbG9hdAorLmRlc3QgOCBkMSBnZmxvYXQKKworeDIgY29weWwgZDEgczEKKworCisjIHBzeWNob2Fjb3VzdGljIHByb2Nlc3NpbmcgZnVuY3Rpb24KKworLmZ1bmN0aW9uIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfcHN5Cisuc291cmNlIDIgczEgZ2ludDE2CisuZGVzdCA0IGQxIGdpbnQxNgorLmZsb2F0cGFyYW0gNCBscGFuCisuZmxvYXRwYXJhbSA0IHJwYW4KKy50ZW1wIDggdDEKKy50ZW1wIDQgbGVmdAorLnRlbXAgNCByaWdodAorCitjb252c3dsIGxlZnQgczEKK2NvbnZsZiBsZWZ0IGxlZnQKK211bGYgcmlnaHQgbGVmdCBycGFuCittdWxmIGxlZnQgbGVmdCBscGFuCittZXJnZWxxIHQxIGxlZnQgcmlnaHQKK3gyIGNvbnZmbCB0MSB0MQoreDIgY29udnNzc2x3IGQxIHQxCisKKworLmZ1bmN0aW9uIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfcHN5Cisuc291cmNlIDQgczEgZ2Zsb2F0CisuZGVzdCA4IGQxIGdmbG9hdAorLmZsb2F0cGFyYW0gNCBscGFuCisuZmxvYXRwYXJhbSA0IHJwYW4KKy50ZW1wIDQgbGVmdAorLnRlbXAgNCByaWdodAorCittdWxmIHJpZ2h0IHMxIHJwYW4KK211bGYgbGVmdCBzMSBscGFuCittZXJnZWxxIGQxIGxlZnQgcmlnaHQKKworCisuZnVuY3Rpb24gYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9wc3lfcmlnaHQKKy5zb3VyY2UgNCBzMSBnaW50MTYKKy5kZXN0IDQgZDEgZ2ludDE2CisuZmxvYXRwYXJhbSA0IGxscGFuCisuZmxvYXRwYXJhbSA0IHJscGFuCisudGVtcCA4IHQxCisudGVtcCA0IGxlZnQKKy50ZW1wIDQgcmlnaHQKKy50ZW1wIDQgcmlnaHQxCisKK3gyIGNvbnZzd2wgdDEgczEKK3gyIGNvbnZsZiB0MSB0MQorc2VsZWN0MHFsIGxlZnQgdDEKK3NlbGVjdDFxbCByaWdodCB0MQorbXVsZiByaWdodDEgbGVmdCBybHBhbgorbXVsZiBsZWZ0IGxlZnQgbGxwYW4KK2FkZGYgcmlnaHQgcmlnaHQxIHJpZ2h0CittZXJnZWxxIHQxIGxlZnQgcmlnaHQKK3gyIGNvbnZmbCB0MSB0MQoreDIgY29udnNzc2x3IGQxIHQxCisKKworLmZ1bmN0aW9uIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfcHN5X2xlZnQKKy5zb3VyY2UgNCBzMSBnaW50MTYKKy5kZXN0IDQgZDEgZ2ludDE2CisuZmxvYXRwYXJhbSA0IGxycGFuCisuZmxvYXRwYXJhbSA0IHJycGFuCisudGVtcCA4IHQxCisudGVtcCA0IGxlZnQKKy50ZW1wIDQgbGVmdDEKKy50ZW1wIDQgcmlnaHQKKworeDIgY29udnN3bCB0MSBzMQoreDIgY29udmxmIHQxIHQxCitzZWxlY3QwcWwgbGVmdCB0MQorc2VsZWN0MXFsIHJpZ2h0IHQxCittdWxmIGxlZnQxIHJpZ2h0IGxycGFuCittdWxmIHJpZ2h0IHJpZ2h0IHJycGFuCithZGRmIGxlZnQgbGVmdDEgbGVmdAorbWVyZ2VscSB0MSBsZWZ0IHJpZ2h0Cit4MiBjb252ZmwgdDEgdDEKK3gyIGNvbnZzc3NsdyBkMSB0MQorCisKKy5mdW5jdGlvbiBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3BzeV9yaWdodAorLnNvdXJjZSA4IHMxIGdmbG9hdAorLmRlc3QgOCBkMSBnZmxvYXQKKy5mbG9hdHBhcmFtIDQgbGxwYW4KKy5mbG9hdHBhcmFtIDQgcmxwYW4KKy50ZW1wIDQgbGVmdAorLnRlbXAgNCByaWdodAorLnRlbXAgNCByaWdodDEKKworc2VsZWN0MHFsIGxlZnQgczEKK3NlbGVjdDFxbCByaWdodCBzMQorbXVsZiByaWdodDEgbGVmdCBybHBhbgorbXVsZiBsZWZ0IGxlZnQgbGxwYW4KK2FkZGYgcmlnaHQgcmlnaHQxIHJpZ2h0CittZXJnZWxxIGQxIGxlZnQgcmlnaHQKKworCisuZnVuY3Rpb24gYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9wc3lfbGVmdAorLnNvdXJjZSA4IHMxIGdmbG9hdAorLmRlc3QgOCBkMSBnZmxvYXQKKy5mbG9hdHBhcmFtIDQgbHJwYW4KKy5mbG9hdHBhcmFtIDQgcnJwYW4KKy50ZW1wIDQgbGVmdAorLnRlbXAgNCBsZWZ0MQorLnRlbXAgNCByaWdodAorCitzZWxlY3QwcWwgbGVmdCBzMQorc2VsZWN0MXFsIHJpZ2h0IHMxCittdWxmIGxlZnQxIHJpZ2h0IGxycGFuCittdWxmIHJpZ2h0IHJpZ2h0IHJycGFuCithZGRmIGxlZnQgbGVmdDEgbGVmdAorbWVyZ2VscSBkMSBsZWZ0IHJpZ2h0CisKKyMgc2ltcGxlIHByb2Nlc3NpbmcgZnVuY3Rpb25zCisKKy5mdW5jdGlvbiBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX3NpbV9yaWdodAorLnNvdXJjZSAyIHMxIGdpbnQxNgorLmRlc3QgNCBkMSBnaW50MTYKKy5mbG9hdHBhcmFtIDQgcnBhbgorLnRlbXAgOCB0MQorLnRlbXAgNCBsZWZ0CisudGVtcCA0IHJpZ2h0CisKK2NvbnZzd2wgbGVmdCBzMQorY29udmxmIGxlZnQgbGVmdAorbXVsZiByaWdodCBsZWZ0IHJwYW4KK21lcmdlbHEgdDEgbGVmdCByaWdodAoreDIgY29udmZsIHQxIHQxCit4MiBjb252c3NzbHcgZDEgdDEKKworCisuZnVuY3Rpb24gYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9zaW1fbGVmdAorLnNvdXJjZSAyIHMxIGdpbnQxNgorLmRlc3QgNCBkMSBnaW50MTYKKy5mbG9hdHBhcmFtIDQgbHBhbgorLnRlbXAgOCB0MQorLnRlbXAgNCBsZWZ0CisudGVtcCA0IHJpZ2h0CisKK2NvbnZzd2wgcmlnaHQgczEKK2NvbnZsZiByaWdodCByaWdodAorbXVsZiBsZWZ0IHJpZ2h0IGxwYW4KK21lcmdlbHEgdDEgbGVmdCByaWdodAoreDIgY29udmZsIHQxIHQxCit4MiBjb252c3NzbHcgZDEgdDEKKworCisuZnVuY3Rpb24gYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9zaW1fcmlnaHQKKy5zb3VyY2UgNCBzMSBnaW50MTYKKy5kZXN0IDQgZDEgZ2ludDE2CisuZmxvYXRwYXJhbSA0IHJwYW4KKy50ZW1wIDggdDEKKy50ZW1wIDQgbGVmdAorLnRlbXAgNCByaWdodAorCit4MiBjb252c3dsIHQxIHMxCit4MiBjb252bGYgdDEgdDEKK3NlbGVjdDBxbCBsZWZ0IHQxCitzZWxlY3QxcWwgcmlnaHQgdDEKK211bGYgcmlnaHQgcmlnaHQgcnBhbgorbWVyZ2VscSB0MSBsZWZ0IHJpZ2h0Cit4MiBjb252ZmwgdDEgdDEKK3gyIGNvbnZzc3NsdyBkMSB0MQorCisKKy5mdW5jdGlvbiBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3NpbV9sZWZ0Cisuc291cmNlIDQgczEgZ2ludDE2CisuZGVzdCA0IGQxIGdpbnQxNgorLmZsb2F0cGFyYW0gNCBscGFuCisudGVtcCA4IHQxCisudGVtcCA0IGxlZnQKKy50ZW1wIDQgcmlnaHQKKworeDIgY29udnN3bCB0MSBzMQoreDIgY29udmxmIHQxIHQxCitzZWxlY3QwcWwgbGVmdCB0MQorc2VsZWN0MXFsIHJpZ2h0IHQxCittdWxmIGxlZnQgbGVmdCBscGFuCittZXJnZWxxIHQxIGxlZnQgcmlnaHQKK3gyIGNvbnZmbCB0MSB0MQoreDIgY29udnNzc2x3IGQxIHQxCisKKworLmZ1bmN0aW9uIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfc2ltX3JpZ2h0Cisuc291cmNlIDQgczEgZ2Zsb2F0CisuZGVzdCA4IGQxIGdmbG9hdAorLmZsb2F0cGFyYW0gNCBycGFuCisudGVtcCA0IGxlZnQKKy50ZW1wIDQgcmlnaHQKKworY29weWwgbGVmdCBzMQorbXVsZiByaWdodCBzMSBycGFuCittZXJnZWxxIGQxIGxlZnQgcmlnaHQKKworCisuZnVuY3Rpb24gYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fbGVmdAorLnNvdXJjZSA0IHMxIGdmbG9hdAorLmRlc3QgOCBkMSBnZmxvYXQKKy5mbG9hdHBhcmFtIDQgbHBhbgorLnRlbXAgNCBsZWZ0CisudGVtcCA0IHJpZ2h0CisKK211bGYgbGVmdCBzMSBscGFuCitjb3B5bCByaWdodCBzMQorbWVyZ2VscSBkMSBsZWZ0IHJpZ2h0CisKKworLmZ1bmN0aW9uIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfc2ltX3JpZ2h0Cisuc291cmNlIDggczEgZ2Zsb2F0CisuZGVzdCA4IGQxIGdmbG9hdAorLmZsb2F0cGFyYW0gNCBycGFuCisudGVtcCA0IGxlZnQKKy50ZW1wIDQgcmlnaHQKKworc2VsZWN0MHFsIGxlZnQgczEKK3NlbGVjdDFxbCByaWdodCBzMQorbXVsZiByaWdodCByaWdodCBycGFuCittZXJnZWxxIGQxIGxlZnQgcmlnaHQKKworLmZ1bmN0aW9uIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfc2ltX2xlZnQKKy5zb3VyY2UgOCBzMSBnZmxvYXQKKy5kZXN0IDggZDEgZ2Zsb2F0CisuZmxvYXRwYXJhbSA0IGxwYW4KKy50ZW1wIDQgbGVmdAorLnRlbXAgNCByaWdodAorCitzZWxlY3QwcWwgbGVmdCBzMQorc2VsZWN0MXFsIHJpZ2h0IHMxCittdWxmIGxlZnQgbGVmdCBscGFuCittZXJnZWxxIGQxIGxlZnQgcmlnaHQKKwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYyBiL2dzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNiYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E2NmQ0MQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNiYW5kLmMKQEAgLTAsMCArMSw0ODIgQEAKKy8qIC0qLSBjLWJhc2ljLW9mZnNldDogMiAtKi0KKyAqIAorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICAyMDA2IERyZWFtbGFiIFRlY2hub2xvZ2llcyBMdGQuIDxtYXRoaXMuaG9mZXJAZHJlYW1sYWIubmV0PgorICogICAgICAgICAgICAgICAyMDA3LTIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKiAKKyAqIAorICogdGhpcyB3aW5kb3dlZCBzaW5jIGZpbHRlciBpcyB0YWtlbiBmcm9tIHRoZSBmcmVlbHkgZG93bmxvYWRhYmxlIERTUCBib29rLAorICogIlRoZSBTY2llbnRpc3QgYW5kIEVuZ2luZWVyJ3MgR3VpZGUgdG8gRGlnaXRhbCBTaWduYWwgUHJvY2Vzc2luZyIsCisgKiBjaGFwdGVyIDE2CisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5kc3BndWlkZS5jb20vCisgKgorICogRm9yIHRoZSB3aW5kb3cgZnVuY3Rpb25zIHNlZQorICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XaW5kb3dfZnVuY3Rpb24KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1hdWRpb3dzaW5jYmFuZAorICoKKyAqIEF0dGVudWF0ZXMgYWxsIGZyZXF1ZW5jaWVzIG91dHNpZGUgKGJhbmRwYXNzKSBvciBpbnNpZGUgKGJhbmRyZWplY3QpIG9mIGEgZnJlcXVlbmN5CisgKiBiYW5kLiBUaGUgbGVuZ3RoIHBhcmFtZXRlciBjb250cm9scyB0aGUgcm9sbG9mZiwgdGhlIHdpbmRvdyBwYXJhbWV0ZXIKKyAqIGNvbnRyb2xzIHJvbGxvZmYgYW5kIHN0b3BiYW5kIGF0dGVudWF0aW9uLiBUaGUgSGFtbWluZyB3aW5kb3cgcHJvdmlkZXMgYSBmYXN0ZXIgcm9sbG9mZiBidXQgYSBiaXQKKyAqIHdvcnNlIHN0b3BiYW5kIGF0dGVudWF0aW9uLCB0aGUgb3RoZXIgd2F5IGFyb3VuZCBmb3IgdGhlIEJsYWNrbWFuIHdpbmRvdy4KKyAqCisgKiBUaGlzIGVsZW1lbnQgaGFzIHRoZSBhZHZhbnRhZ2Ugb3ZlciB0aGUgQ2hlYnlzaGV2IGJhbmRwYXNzIGFuZCBiYW5kcmVqZWN0IGZpbHRlciB0aGF0IGl0IGhhcworICogYSBtdWNoIGJldHRlciByb2xsb2ZmIHdoZW4gdXNpbmcgYSBsYXJnZXIga2VybmVsIHNpemUgYW5kIGFsbW9zdCBsaW5lYXIgcGhhc2UuIFRoZSBvbmx5CisgKiBkaXNhZHZhbnRhZ2UgaXMgdGhlIG11Y2ggc2xvd2VyIGV4ZWN1dGlvbiB0aW1lIHdpdGggbGFyZ2VyIGtlcm5lbHMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyBmcmVxPTE1MDAgISBhdWRpb2NvbnZlcnQgISBhdWRpb3dzaW5jYmFuZCBtb2RlPWJhbmQtcGFzcyBsb3dlci1mcmVxdWVuY3k9MzAwMCB1cHBlci1mcmVxdWVuY3k9MTAwMDAgbGVuZ3RoPTUwMSB3aW5kb3c9YmxhY2ttYW4gISBhdWRpb2NvbnZlcnQgISBhbHNhc2luaworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj0ibWVsbzEub2dnIiAhIG9nZ2RlbXV4ICEgdm9yYmlzZGVjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW93c2luY2JhbmQgbW9kZT1iYW5kLXJlamVjdCBsb3dlci1mcmVxdWVuY3k9NTkgdXBwZXItZnJlcXVlbmN5PTYxIGxlbmd0aD0xMDAwMSB3aW5kb3c9aGFtbWluZyAhIGF1ZGlvY29udmVydCAhIGFsc2FzaW5rCisgKiBnc3QtbGF1bmNoLTEuMCBhdWRpb3Rlc3RzcmMgd2F2ZT13aGl0ZS1ub2lzZSAhIGF1ZGlvY29udmVydCAhIGF1ZGlvd3NpbmNiYW5kIG1vZGU9YmFuZC1wYXNzIGxvd2VyLWZyZXF1ZW5jeT0xMDAwIHVwcGVyLWZyZXF1ZW5jeT0yMDAwIGxlbmd0aD0zMSAhIGF1ZGlvY29udmVydCAhIGFsc2FzaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb2ZpbHRlci5oPgorCisjaW5jbHVkZSAiYXVkaW93c2luY2JhbmQuaCIKKworI2luY2x1ZGUgImdzdC9nbGliLWNvbXBhdC1wcml2YXRlLmgiCisKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9nc3RfYXVkaW9fd3NpbmNiYW5kX2RlYnVnCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChHU1RfQ0FUX0RFRkFVTFQpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MRU5HVEgsCisgIFBST1BfTE9XRVJfRlJFUVVFTkNZLAorICBQUk9QX1VQUEVSX0ZSRVFVRU5DWSwKKyAgUFJPUF9NT0RFLAorICBQUk9QX1dJTkRPVworfTsKKworZW51bQoreworICBNT0RFX0JBTkRfUEFTUyA9IDAsCisgIE1PREVfQkFORF9SRUpFQ1QKK307CisKKyNkZWZpbmUgR1NUX1RZUEVfQVVESU9fV1NJTkNfQkFORF9NT0RFIChnc3RfZ3N0X2F1ZGlvX3dzaW5jYmFuZF9tb2RlX2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3RfZ3N0X2F1ZGlvX3dzaW5jYmFuZF9tb2RlX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgZ3R5cGUgPSAwOworCisgIGlmIChndHlwZSA9PSAwKSB7CisgICAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAgICB7TU9ERV9CQU5EX1BBU1MsICJCYW5kIHBhc3MgKGRlZmF1bHQpIiwKKyAgICAgICAgICAiYmFuZC1wYXNzIn0sCisgICAgICB7TU9ERV9CQU5EX1JFSkVDVCwgIkJhbmQgcmVqZWN0IiwKKyAgICAgICAgICAiYmFuZC1yZWplY3QifSwKKyAgICAgIHswLCBOVUxMLCBOVUxMfQorICAgIH07CisKKyAgICBndHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RBdWRpb1dTaW5jQmFuZE1vZGUiLCB2YWx1ZXMpOworICB9CisgIHJldHVybiBndHlwZTsKK30KKworZW51bQoreworICBXSU5ET1dfSEFNTUlORyA9IDAsCisgIFdJTkRPV19CTEFDS01BTiwKKyAgV0lORE9XX0dBVVNTSUFOLAorICBXSU5ET1dfQ09TSU5FLAorICBXSU5ET1dfSEFOTgorfTsKKworI2RlZmluZSBHU1RfVFlQRV9BVURJT19XU0lOQ19CQU5EX1dJTkRPVyAoZ3N0X2dzdF9hdWRpb193c2luY2JhbmRfd2luZG93X2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3RfZ3N0X2F1ZGlvX3dzaW5jYmFuZF93aW5kb3dfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBndHlwZSA9IDA7CisKKyAgaWYgKGd0eXBlID09IDApIHsKKyAgICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSB2YWx1ZXNbXSA9IHsKKyAgICAgIHtXSU5ET1dfSEFNTUlORywgIkhhbW1pbmcgd2luZG93IChkZWZhdWx0KSIsCisgICAgICAgICAgImhhbW1pbmcifSwKKyAgICAgIHtXSU5ET1dfQkxBQ0tNQU4sICJCbGFja21hbiB3aW5kb3ciLAorICAgICAgICAgICJibGFja21hbiJ9LAorICAgICAge1dJTkRPV19HQVVTU0lBTiwgIkdhdXNzaWFuIHdpbmRvdyIsCisgICAgICAgICAgImdhdXNzaWFuIn0sCisgICAgICB7V0lORE9XX0NPU0lORSwgIkNvc2luZSB3aW5kb3ciLAorICAgICAgICAgICJjb3NpbmUifSwKKyAgICAgIHtXSU5ET1dfSEFOTiwgIkhhbm4gd2luZG93IiwKKyAgICAgICAgICAiaGFubiJ9LAorICAgICAgezAsIE5VTEwsIE5VTEx9CisgICAgfTsKKworICAgIGd0eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdEF1ZGlvV1NpbmNCYW5kV2luZG93IiwgdmFsdWVzKTsKKyAgfQorICByZXR1cm4gZ3R5cGU7Cit9CisKKyNkZWZpbmUgZ3N0X2F1ZGlvX3dzaW5jYmFuZF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RBdWRpb1dTaW5jQmFuZCwgZ3N0X2F1ZGlvX3dzaW5jYmFuZCwKKyAgICBHU1RfVFlQRV9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIpOworCitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fd3NpbmNiYW5kX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb193c2luY2JhbmRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX3dzaW5jYmFuZF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9fd3NpbmNiYW5kX3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGJhc2UsCisgICAgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbyk7CisKKyNkZWZpbmUgUE9XMih4KSAgKHgpKih4KQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX3dzaW5jYmFuZF9jbGFzc19pbml0IChHc3RBdWRpb1dTaW5jQmFuZENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdEF1ZGlvRmlsdGVyQ2xhc3MgKmZpbHRlcl9jbGFzcyA9IChHc3RBdWRpb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfZ3N0X2F1ZGlvX3dzaW5jYmFuZF9kZWJ1ZywgImF1ZGlvd3NpbmNiYW5kIiwgMCwKKyAgICAgICJCYW5kLXBhc3MgYW5kIEJhbmQtcmVqZWN0IFdpbmRvd2VkIHNpbmMgZmlsdGVyIHBsdWdpbiIpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9hdWRpb193c2luY2JhbmRfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9fd3NpbmNiYW5kX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfYXVkaW9fd3NpbmNiYW5kX2ZpbmFsaXplOworCisgIC8qIEZJWE1FOiBEb24ndCB1c2UgdGhlIGNvbXBsZXRlIHBvc3NpYmxlIHJhbmdlIGJ1dCByZXN0cmljdCB0aGUgdXBwZXIgYm91bmRhcnkKKyAgICogc28gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgVUlzIGNhbiB1c2UgYSBzbGlkZXIgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9MT1dFUl9GUkVRVUVOQ1ksCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJsb3dlci1mcmVxdWVuY3kiLCAiTG93ZXIgRnJlcXVlbmN5IiwKKyAgICAgICAgICAiQ3V0LW9mZiBsb3dlciBmcmVxdWVuY3kgKEh6KSIsIDAuMCwgMTAwMDAwLjAsIDAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1VQUEVSX0ZSRVFVRU5DWSwKKyAgICAgIGdfcGFyYW1fc3BlY19mbG9hdCAoInVwcGVyLWZyZXF1ZW5jeSIsICJVcHBlciBGcmVxdWVuY3kiLAorICAgICAgICAgICJDdXQtb2ZmIHVwcGVyIGZyZXF1ZW5jeSAoSHopIiwgMC4wLCAxMDAwMDAuMCwgMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTEVOR1RILAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImxlbmd0aCIsICJMZW5ndGgiLAorICAgICAgICAgICJGaWx0ZXIga2VybmVsIGxlbmd0aCwgd2lsbCBiZSByb3VuZGVkIHRvIHRoZSBuZXh0IG9kZCBudW1iZXIiLCAzLAorICAgICAgICAgIDI1NjAwMCwgMTAxLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01PREUsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoIm1vZGUiLCAiTW9kZSIsCisgICAgICAgICAgIkJhbmQgcGFzcyBvciBiYW5kIHJlamVjdCBtb2RlIiwgR1NUX1RZUEVfQVVESU9fV1NJTkNfQkFORF9NT0RFLAorICAgICAgICAgIE1PREVfQkFORF9QQVNTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1dJTkRPVywKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgid2luZG93IiwgIldpbmRvdyIsCisgICAgICAgICAgIldpbmRvdyBmdW5jdGlvbiB0byB1c2UiLCBHU1RfVFlQRV9BVURJT19XU0lOQ19CQU5EX1dJTkRPVywKKyAgICAgICAgICBXSU5ET1dfSEFNTUlORywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJCYW5kIHBhc3MgJiBiYW5kIHJlamVjdCBmaWx0ZXIiLCAiRmlsdGVyL0VmZmVjdC9BdWRpbyIsCisgICAgICAiQmFuZCBwYXNzIGFuZCBiYW5kIHJlamVjdCB3aW5kb3dlZCBzaW5jIGZpbHRlciIsCisgICAgICAiVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPiwgIgorICAgICAgIlN0ZXZlbiBXLiBTbWl0aCwgIgorICAgICAgIkRyZWFtbGFiIFRlY2hub2xvZ2llcyBMdGQuIDxtYXRoaXMuaG9mZXJAZHJlYW1sYWIubmV0PiwgIgorICAgICAgIlNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPiIpOworCisgIGZpbHRlcl9jbGFzcy0+c2V0dXAgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX3dzaW5jYmFuZF9zZXR1cCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fd3NpbmNiYW5kX2luaXQgKEdzdEF1ZGlvV1NpbmNCYW5kICogc2VsZikKK3sKKyAgc2VsZi0+a2VybmVsX2xlbmd0aCA9IDEwMTsKKyAgc2VsZi0+bG93ZXJfZnJlcXVlbmN5ID0gMC4wOworICBzZWxmLT51cHBlcl9mcmVxdWVuY3kgPSAwLjA7CisgIHNlbGYtPm1vZGUgPSBNT0RFX0JBTkRfUEFTUzsKKyAgc2VsZi0+d2luZG93ID0gV0lORE9XX0hBTU1JTkc7CisKKyAgZ19tdXRleF9pbml0ICgmc2VsZi0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fd3NpbmNiYW5kX2J1aWxkX2tlcm5lbCAoR3N0QXVkaW9XU2luY0JhbmQgKiBzZWxmLAorICAgIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIGdpbnQgaSA9IDA7CisgIGdkb3VibGUgc3VtID0gMC4wOworICBnaW50IGxlbiA9IDA7CisgIGdkb3VibGUgKmtlcm5lbF9scCwgKmtlcm5lbF9ocDsKKyAgZ2RvdWJsZSB3OworICBnZG91YmxlICprZXJuZWw7CisgIGdpbnQgcmF0ZSwgY2hhbm5lbHM7CisKKyAgbGVuID0gc2VsZi0+a2VybmVsX2xlbmd0aDsKKworICBpZiAoaW5mbykgeworICAgIHJhdGUgPSBHU1RfQVVESU9fSU5GT19SQVRFIChpbmZvKTsKKyAgICBjaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTIChpbmZvKTsKKyAgfSBlbHNlIHsKKyAgICByYXRlID0gR1NUX0FVRElPX0ZJTFRFUl9SQVRFIChzZWxmKTsKKyAgICBjaGFubmVscyA9IEdTVF9BVURJT19GSUxURVJfQ0hBTk5FTFMgKHNlbGYpOworICB9CisKKyAgaWYgKHJhdGUgPT0gMCkgeworICAgIEdTVF9ERUJVRyAoInJhdGUgbm90IHNldCB5ZXQiKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoY2hhbm5lbHMgPT0gMCkgeworICAgIEdTVF9ERUJVRyAoImNoYW5uZWxzIG5vdCBzZXQgeWV0Iik7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogQ2xhbXAgZnJlcXVlbmNpZXMgKi8KKyAgc2VsZi0+bG93ZXJfZnJlcXVlbmN5ID0gQ0xBTVAgKHNlbGYtPmxvd2VyX2ZyZXF1ZW5jeSwgMC4wLCByYXRlIC8gMik7CisgIHNlbGYtPnVwcGVyX2ZyZXF1ZW5jeSA9IENMQU1QIChzZWxmLT51cHBlcl9mcmVxdWVuY3ksIDAuMCwgcmF0ZSAvIDIpOworCisgIGlmIChzZWxmLT5sb3dlcl9mcmVxdWVuY3kgPiBzZWxmLT51cHBlcl9mcmVxdWVuY3kpIHsKKyAgICBnaW50IHRtcCA9IHNlbGYtPmxvd2VyX2ZyZXF1ZW5jeTsKKworICAgIHNlbGYtPmxvd2VyX2ZyZXF1ZW5jeSA9IHNlbGYtPnVwcGVyX2ZyZXF1ZW5jeTsKKyAgICBzZWxmLT51cHBlcl9mcmVxdWVuY3kgPSB0bXA7CisgIH0KKworICBHU1RfREVCVUcgKCJnc3RfYXVkaW9fd3NpbmNiYW5kOiBpbml0aWFsaXppbmcgZmlsdGVyIGtlcm5lbCBvZiBsZW5ndGggJWQgIgorICAgICAgIndpdGggbG93ZXIgZnJlcXVlbmN5ICUuMmxmIEh6ICIKKyAgICAgICIsIHVwcGVyIGZyZXF1ZW5jeSAlLjJsZiBIeiBmb3IgbW9kZSAlcyIsCisgICAgICBsZW4sIHNlbGYtPmxvd2VyX2ZyZXF1ZW5jeSwgc2VsZi0+dXBwZXJfZnJlcXVlbmN5LAorICAgICAgKHNlbGYtPm1vZGUgPT0gTU9ERV9CQU5EX1BBU1MpID8gImJhbmQtcGFzcyIgOiAiYmFuZC1yZWplY3QiKTsKKworICAvKiBmaWxsIHRoZSBscCBrZXJuZWwgKi8KKyAgdyA9IDIgKiBHX1BJICogKHNlbGYtPmxvd2VyX2ZyZXF1ZW5jeSAvIHJhdGUpOworICBrZXJuZWxfbHAgPSBnX25ldyAoZ2RvdWJsZSwgbGVuKTsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgaWYgKGkgPT0gKGxlbiAtIDEpIC8gMi4wKQorICAgICAga2VybmVsX2xwW2ldID0gdzsKKyAgICBlbHNlCisgICAgICBrZXJuZWxfbHBbaV0gPSBzaW4gKHcgKiAoaSAtIChsZW4gLSAxKSAvIDIuMCkpIC8gKGkgLSAobGVuIC0gMSkgLyAyLjApOworCisgICAgLyogd2luZG93aW5nICovCisgICAgc3dpdGNoIChzZWxmLT53aW5kb3cpIHsKKyAgICAgIGNhc2UgV0lORE9XX0hBTU1JTkc6CisgICAgICAgIGtlcm5lbF9scFtpXSAqPSAoMC41NCAtIDAuNDYgKiBjb3MgKDIgKiBHX1BJICogaSAvIChsZW4gLSAxKSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV0lORE9XX0JMQUNLTUFOOgorICAgICAgICBrZXJuZWxfbHBbaV0gKj0gKDAuNDIgLSAwLjUgKiBjb3MgKDIgKiBHX1BJICogaSAvIChsZW4gLSAxKSkgKworICAgICAgICAgICAgMC4wOCAqIGNvcyAoNCAqIEdfUEkgKiBpIC8gKGxlbiAtIDEpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXSU5ET1dfR0FVU1NJQU46CisgICAgICAgIGtlcm5lbF9scFtpXSAqPSBleHAgKC0wLjUgKiBQT1cyICgzLjAgLyBsZW4gKiAoMiAqIGkgLSAobGVuIC0gMSkpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXSU5ET1dfQ09TSU5FOgorICAgICAgICBrZXJuZWxfbHBbaV0gKj0gY29zIChHX1BJICogaSAvIChsZW4gLSAxKSAtIEdfUEkgLyAyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdJTkRPV19IQU5OOgorICAgICAgICBrZXJuZWxfbHBbaV0gKj0gMC41ICogKDEgLSBjb3MgKDIgKiBHX1BJICogaSAvIChsZW4gLSAxKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBub3JtYWxpemUgZm9yIHVuaXR5IGdhaW4gYXQgREMgKi8KKyAgc3VtID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisgICAgc3VtICs9IGtlcm5lbF9scFtpXTsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorICAgIGtlcm5lbF9scFtpXSAvPSBzdW07CisKKyAgLyogZmlsbCB0aGUgaHAga2VybmVsICovCisgIHcgPSAyICogR19QSSAqIChzZWxmLT51cHBlcl9mcmVxdWVuY3kgLyByYXRlKTsKKyAga2VybmVsX2hwID0gZ19uZXcgKGdkb3VibGUsIGxlbik7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgIGlmIChpID09IChsZW4gLSAxKSAvIDIuMCkKKyAgICAgIGtlcm5lbF9ocFtpXSA9IHc7CisgICAgZWxzZQorICAgICAga2VybmVsX2hwW2ldID0gc2luICh3ICogKGkgLSAobGVuIC0gMSkgLyAyLjApKSAvIChpIC0gKGxlbiAtIDEpIC8gMi4wKTsKKworICAgIC8qIFdpbmRvd2luZyAqLworICAgIHN3aXRjaCAoc2VsZi0+d2luZG93KSB7CisgICAgICBjYXNlIFdJTkRPV19IQU1NSU5HOgorICAgICAgICBrZXJuZWxfaHBbaV0gKj0gKDAuNTQgLSAwLjQ2ICogY29zICgyICogR19QSSAqIGkgLyAobGVuIC0gMSkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdJTkRPV19CTEFDS01BTjoKKyAgICAgICAga2VybmVsX2hwW2ldICo9ICgwLjQyIC0gMC41ICogY29zICgyICogR19QSSAqIGkgLyAobGVuIC0gMSkpICsKKyAgICAgICAgICAgIDAuMDggKiBjb3MgKDQgKiBHX1BJICogaSAvIChsZW4gLSAxKSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV0lORE9XX0dBVVNTSUFOOgorICAgICAgICBrZXJuZWxfaHBbaV0gKj0gZXhwICgtMC41ICogUE9XMiAoMy4wIC8gbGVuICogKDIgKiBpIC0gKGxlbiAtIDEpKSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV0lORE9XX0NPU0lORToKKyAgICAgICAga2VybmVsX2hwW2ldICo9IGNvcyAoR19QSSAqIGkgLyAobGVuIC0gMSkgLSBHX1BJIC8gMik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXSU5ET1dfSEFOTjoKKyAgICAgICAga2VybmVsX2hwW2ldICo9IDAuNSAqICgxIC0gY29zICgyICogR19QSSAqIGkgLyAobGVuIC0gMSkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLyogbm9ybWFsaXplIGZvciB1bml0eSBnYWluIGF0IERDICovCisgIHN1bSA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorICAgIHN1bSArPSBrZXJuZWxfaHBbaV07CisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKyAgICBrZXJuZWxfaHBbaV0gLz0gc3VtOworCisgIC8qIGRvIHNwZWN0cmFsIGludmVyc2lvbiB0byBnbyBmcm9tIGxvd3Bhc3MgdG8gaGlnaHBhc3MgKi8KKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorICAgIGtlcm5lbF9ocFtpXSA9IC1rZXJuZWxfaHBbaV07CisgIGlmIChsZW4gJSAyID09IDEpIHsKKyAgICBrZXJuZWxfaHBbKGxlbiAtIDEpIC8gMl0gKz0gMS4wOworICB9IGVsc2UgeworICAgIGtlcm5lbF9ocFtsZW4gLyAyIC0gMV0gKz0gMC41OworICAgIGtlcm5lbF9ocFtsZW4gLyAyXSArPSAwLjU7CisgIH0KKworICAvKiBjb21iaW5lIHRoZSB0d28ga2VybmVscyAqLworICBrZXJuZWwgPSBnX25ldyAoZ2RvdWJsZSwgbGVuKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisgICAga2VybmVsW2ldID0ga2VybmVsX2xwW2ldICsga2VybmVsX2hwW2ldOworCisgIC8qIGZyZWUgdGhlIGhlbHBlciBrZXJuZWxzICovCisgIGdfZnJlZSAoa2VybmVsX2xwKTsKKyAgZ19mcmVlIChrZXJuZWxfaHApOworCisgIC8qIGRvIHNwZWN0cmFsIGludmVyc2lvbiB0byBnbyBmcm9tIGJhbmRyZWplY3QgdG8gYmFuZHBhc3MKKyAgICogaWYgc3BlY2lmaWVkICovCisgIGlmIChzZWxmLT5tb2RlID09IE1PREVfQkFORF9QQVNTKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorICAgICAga2VybmVsW2ldID0gLWtlcm5lbFtpXTsKKyAgICBrZXJuZWxbbGVuIC8gMl0gKz0gMTsKKyAgfQorCisgIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc2V0X2tlcm5lbCAoR1NUX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUiAoc2VsZiksCisgICAgICBrZXJuZWwsIHNlbGYtPmtlcm5lbF9sZW5ndGgsIChsZW4gLSAxKSAvIDIsIGluZm8pOworfQorCisvKiBHc3RBdWRpb0ZpbHRlciB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCisvKiBnZXQgbm90aWZpZWQgb2YgY2FwcyBhbmQgcGx1ZyBpbiB0aGUgY29ycmVjdCBwcm9jZXNzIGZ1bmN0aW9uICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdWRpb193c2luY2JhbmRfc2V0dXAgKEdzdEF1ZGlvRmlsdGVyICogYmFzZSwgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbykKK3sKKyAgR3N0QXVkaW9XU2luY0JhbmQgKnNlbGYgPSBHU1RfQVVESU9fV1NJTkNfQkFORCAoYmFzZSk7CisKKyAgZ3N0X2F1ZGlvX3dzaW5jYmFuZF9idWlsZF9rZXJuZWwgKHNlbGYsIGluZm8pOworCisgIHJldHVybiBHU1RfQVVESU9fRklMVEVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zZXR1cCAoYmFzZSwgaW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fd3NpbmNiYW5kX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RBdWRpb1dTaW5jQmFuZCAqc2VsZiA9IEdTVF9BVURJT19XU0lOQ19CQU5EIChvYmplY3QpOworCisgIGdfbXV0ZXhfY2xlYXIgKCZzZWxmLT5sb2NrKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fd3NpbmNiYW5kX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb1dTaW5jQmFuZCAqc2VsZiA9IEdTVF9BVURJT19XU0lOQ19CQU5EIChvYmplY3QpOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19BVURJT19XU0lOQ19CQU5EIChzZWxmKSk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xFTkdUSDp7CisgICAgICBnaW50IHZhbDsKKworICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICB2YWwgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGlmICh2YWwgJSAyID09IDApCisgICAgICAgIHZhbCsrOworCisgICAgICBpZiAodmFsICE9IHNlbGYtPmtlcm5lbF9sZW5ndGgpIHsKKyAgICAgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9wdXNoX3Jlc2lkdWUgKEdTVF9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIKKyAgICAgICAgICAgIChzZWxmKSk7CisgICAgICAgIHNlbGYtPmtlcm5lbF9sZW5ndGggPSB2YWw7CisgICAgICAgIGdzdF9hdWRpb193c2luY2JhbmRfYnVpbGRfa2VybmVsIChzZWxmLCBOVUxMKTsKKyAgICAgIH0KKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0xPV0VSX0ZSRVFVRU5DWToKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgc2VsZi0+bG93ZXJfZnJlcXVlbmN5ID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIGdzdF9hdWRpb193c2luY2JhbmRfYnVpbGRfa2VybmVsIChzZWxmLCBOVUxMKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVBQRVJfRlJFUVVFTkNZOgorICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBzZWxmLT51cHBlcl9mcmVxdWVuY3kgPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgICAgZ3N0X2F1ZGlvX3dzaW5jYmFuZF9idWlsZF9rZXJuZWwgKHNlbGYsIE5VTEwpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBzZWxmLT5tb2RlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgZ3N0X2F1ZGlvX3dzaW5jYmFuZF9idWlsZF9rZXJuZWwgKHNlbGYsIE5VTEwpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9XSU5ET1c6CisgICAgICBnX211dGV4X2xvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIHNlbGYtPndpbmRvdyA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGdzdF9hdWRpb193c2luY2JhbmRfYnVpbGRfa2VybmVsIChzZWxmLCBOVUxMKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fd3NpbmNiYW5kX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb1dTaW5jQmFuZCAqc2VsZiA9IEdTVF9BVURJT19XU0lOQ19CQU5EIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MRU5HVEg6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBzZWxmLT5rZXJuZWxfbGVuZ3RoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9MT1dFUl9GUkVRVUVOQ1k6CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIHNlbGYtPmxvd2VyX2ZyZXF1ZW5jeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVBQRVJfRlJFUVVFTkNZOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBzZWxmLT51cHBlcl9mcmVxdWVuY3kpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01PREU6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgc2VsZi0+bW9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfV0lORE9XOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHNlbGYtPndpbmRvdyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9hdWRpb3dzaW5jYmFuZC5oIGIvZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2MyYmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuaApAQCAtMCwwICsxLDgwIEBACisvKiAtKi0gYy1iYXNpYy1vZmZzZXQ6IDIgLSotCisgKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICAyMDA2IERyZWFtbGFiIFRlY2hub2xvZ2llcyBMdGQuIDxtYXRoaXMuaG9mZXJAZHJlYW1sYWIubmV0PgorICogICAgICAgICAgICAgICAyMDA3LTIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICoKKyAqIHRoaXMgd2luZG93ZWQgc2luYyBmaWx0ZXIgaXMgdGFrZW4gZnJvbSB0aGUgZnJlZWx5IGRvd25sb2FkYWJsZSBEU1AgYm9vaywKKyAqICJUaGUgU2NpZW50aXN0IGFuZCBFbmdpbmVlcidzIEd1aWRlIHRvIERpZ2l0YWwgU2lnbmFsIFByb2Nlc3NpbmciLAorICogY2hhcHRlciAxNgorICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZHNwZ3VpZGUuY29tLworICoKKyAqLworCisjaWZuZGVmIF9fR1NUX0FVRElPX1dTSU5DX0JBTkRfSF9fCisjZGVmaW5lIF9fR1NUX0FVRElPX1dTSU5DX0JBTkRfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlICJhdWRpb2Z4YmFzZWZpcmZpbHRlci5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQVVESU9fV1NJTkNfQkFORCBcCisgIChnc3RfYXVkaW9fd3NpbmNiYW5kX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9BVURJT19XU0lOQ19CQU5EKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVVESU9fV1NJTkNfQkFORCxHc3RBdWRpb1dTaW5jQmFuZCkpCisjZGVmaW5lIEdTVF9BVURJT19XU0lOQ19CQU5EX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0FVRElPX1dTSU5DX0JBTkQsR3N0QXVkaW9XU2luY0JhbmRDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BVURJT19XU0lOQ19CQU5EKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQVVESU9fV1NJTkNfQkFORCkpCisjZGVmaW5lIEdTVF9JU19BVURJT19XU0lOQ19CQU5EX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0FVRElPX1dTSU5DX0JBTkQpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9XU2luY0JhbmQgR3N0QXVkaW9XU2luY0JhbmQ7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9XU2luY0JhbmRDbGFzcyBHc3RBdWRpb1dTaW5jQmFuZENsYXNzOworCisvKioKKyAqIEdzdEF1ZGlvV1NpbmNCYW5kOgorICoKKyAqIE9wYXF1ZSBkYXRhIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IF9Hc3RBdWRpb1dTaW5jQmFuZCB7CisgIEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyIHBhcmVudDsKKworICBnaW50IG1vZGU7CisgIGdpbnQgd2luZG93OworICBnZmxvYXQgbG93ZXJfZnJlcXVlbmN5LCB1cHBlcl9mcmVxdWVuY3k7CisgIGdpbnQga2VybmVsX2xlbmd0aDsgICAgICAgICAgIC8qIGxlbmd0aCBvZiB0aGUgZmlsdGVyIGtlcm5lbCAqLworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIEdNdXRleCBsb2NrOworfTsKKworc3RydWN0IF9Hc3RBdWRpb1dTaW5jQmFuZENsYXNzIHsKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyBwYXJlbnQ7Cit9OworCitHVHlwZSBnc3RfYXVkaW9fd3NpbmNiYW5kX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0FVRElPX1dTSU5DX0JBTkRfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYyBiL2dzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZWIwMDcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYwpAQCAtMCwwICsxLDQwOCBAQAorLyogLSotIGMtYmFzaWMtb2Zmc2V0OiAyIC0qLQorICogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAxIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgIDIwMDYgRHJlYW1sYWIgVGVjaG5vbG9naWVzIEx0ZC4gPG1hdGhpcy5ob2ZlckBkcmVhbWxhYi5uZXQ+CisgKiAgICAgICAgICAgICAgIDIwMDctMjAwOSBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqIAorICogCisgKiB0aGlzIHdpbmRvd2VkIHNpbmMgZmlsdGVyIGlzIHRha2VuIGZyb20gdGhlIGZyZWVseSBkb3dubG9hZGFibGUgRFNQIGJvb2ssCisgKiAiVGhlIFNjaWVudGlzdCBhbmQgRW5naW5lZXIncyBHdWlkZSB0byBEaWdpdGFsIFNpZ25hbCBQcm9jZXNzaW5nIiwKKyAqIGNoYXB0ZXIgMTYKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmRzcGd1aWRlLmNvbS8KKyAqCisgKiBGb3IgdGhlIHdpbmRvdyBmdW5jdGlvbnMgc2VlCisgKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dpbmRvd19mdW5jdGlvbgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWF1ZGlvd3NpbmNsaW1pdAorICoKKyAqIEF0dGVudWF0ZXMgYWxsIGZyZXF1ZW5jaWVzIGFib3ZlIHRoZSBjdXRvZmYgZnJlcXVlbmN5IChsb3ctcGFzcykgb3IgYWxsIGZyZXF1ZW5jaWVzIGJlbG93IHRoZQorICogY3V0b2ZmIGZyZXF1ZW5jeSAoaGlnaC1wYXNzKS4gVGhlIGxlbmd0aCBwYXJhbWV0ZXIgY29udHJvbHMgdGhlIHJvbGxvZmYsIHRoZSB3aW5kb3cgcGFyYW1ldGVyCisgKiBjb250cm9scyByb2xsb2ZmIGFuZCBzdG9wYmFuZCBhdHRlbnVhdGlvbi4gVGhlIEhhbW1pbmcgd2luZG93IHByb3ZpZGVzIGEgZmFzdGVyIHJvbGxvZmYgYnV0IGEgYml0CisgKiB3b3JzZSBzdG9wYmFuZCBhdHRlbnVhdGlvbiwgdGhlIG90aGVyIHdheSBhcm91bmQgZm9yIHRoZSBCbGFja21hbiB3aW5kb3cuCisgKgorICogVGhpcyBlbGVtZW50IGhhcyB0aGUgYWR2YW50YWdlIG92ZXIgdGhlIENoZWJ5c2hldiBsb3dwYXNzIGFuZCBoaWdocGFzcyBmaWx0ZXIgdGhhdCBpdCBoYXMKKyAqIGEgbXVjaCBiZXR0ZXIgcm9sbG9mZiB3aGVuIHVzaW5nIGEgbGFyZ2VyIGtlcm5lbCBzaXplIGFuZCBhbG1vc3QgbGluZWFyIHBoYXNlLiBUaGUgb25seQorICogZGlzYWR2YW50YWdlIGlzIHRoZSBtdWNoIHNsb3dlciBleGVjdXRpb24gdGltZSB3aXRoIGxhcmdlciBrZXJuZWxzLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBhdWRpb3Rlc3RzcmMgZnJlcT0xNTAwICEgYXVkaW9jb252ZXJ0ICEgYXVkaW93c2luY2xpbWl0IG1vZGU9bG93LXBhc3MgY3V0b2ZmPTEwMDAgbGVuZ3RoPTUwMSAhIGF1ZGlvY29udmVydCAhIGFsc2FzaW5rCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPSJtZWxvMS5vZ2ciICEgb2dnZGVtdXggISB2b3JiaXNkZWMgISBhdWRpb2NvbnZlcnQgISBhdWRpb3dzaW5jbGltaXQgbW9kZT1oaWdoLXBhc3MgY3V0b2ZmPTE1MDAwIGxlbmd0aD01MDEgISBhdWRpb2NvbnZlcnQgISBhbHNhc2luaworICogZ3N0LWxhdW5jaC0xLjAgYXVkaW90ZXN0c3JjIHdhdmU9d2hpdGUtbm9pc2UgISBhdWRpb2NvbnZlcnQgISBhdWRpb3dzaW5jbGltaXQgbW9kZT1sb3ctcGFzcyBjdXRvZmY9MTAwMCBsZW5ndGg9MTAwMDEgd2luZG93PWJsYWNrbWFuICEgYXVkaW9jb252ZXJ0ICEgYWxzYXNpbmsKKyAqIF18CisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlICJhdWRpb3dzaW5jbGltaXQuaCIKKworI2luY2x1ZGUgImdzdC9nbGliLWNvbXBhdC1wcml2YXRlLmgiCisKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9hdWRpb193c2luY2xpbWl0X2RlYnVnCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChHU1RfQ0FUX0RFRkFVTFQpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MRU5HVEgsCisgIFBST1BfRlJFUVVFTkNZLAorICBQUk9QX01PREUsCisgIFBST1BfV0lORE9XCit9OworCitlbnVtCit7CisgIE1PREVfTE9XX1BBU1MgPSAwLAorICBNT0RFX0hJR0hfUEFTUworfTsKKworI2RlZmluZSBHU1RfVFlQRV9BVURJT19XU0lOQ19MSU1JVF9NT0RFIChnc3RfYXVkaW9fd3NpbmNsaW1pdF9tb2RlX2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3RfYXVkaW9fd3NpbmNsaW1pdF9tb2RlX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgZ3R5cGUgPSAwOworCisgIGlmIChndHlwZSA9PSAwKSB7CisgICAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAgICB7TU9ERV9MT1dfUEFTUywgIkxvdyBwYXNzIChkZWZhdWx0KSIsCisgICAgICAgICAgImxvdy1wYXNzIn0sCisgICAgICB7TU9ERV9ISUdIX1BBU1MsICJIaWdoIHBhc3MiLAorICAgICAgICAgICJoaWdoLXBhc3MifSwKKyAgICAgIHswLCBOVUxMLCBOVUxMfQorICAgIH07CisKKyAgICBndHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RBdWRpb1dTaW5jTGltaXRNb2RlIiwgdmFsdWVzKTsKKyAgfQorICByZXR1cm4gZ3R5cGU7Cit9CisKK2VudW0KK3sKKyAgV0lORE9XX0hBTU1JTkcgPSAwLAorICBXSU5ET1dfQkxBQ0tNQU4sCisgIFdJTkRPV19HQVVTU0lBTiwKKyAgV0lORE9XX0NPU0lORSwKKyAgV0lORE9XX0hBTk4KK307CisKKyNkZWZpbmUgR1NUX1RZUEVfQVVESU9fV1NJTkNfTElNSVRfV0lORE9XIChnc3RfYXVkaW9fd3NpbmNsaW1pdF93aW5kb3dfZ2V0X3R5cGUgKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9hdWRpb193c2luY2xpbWl0X3dpbmRvd19nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGd0eXBlID0gMDsKKworICBpZiAoZ3R5cGUgPT0gMCkgeworICAgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIHZhbHVlc1tdID0geworICAgICAge1dJTkRPV19IQU1NSU5HLCAiSGFtbWluZyB3aW5kb3cgKGRlZmF1bHQpIiwKKyAgICAgICAgICAiaGFtbWluZyJ9LAorICAgICAge1dJTkRPV19CTEFDS01BTiwgIkJsYWNrbWFuIHdpbmRvdyIsCisgICAgICAgICAgImJsYWNrbWFuIn0sCisgICAgICB7V0lORE9XX0dBVVNTSUFOLCAiR2F1c3NpYW4gd2luZG93IiwKKyAgICAgICAgICAiZ2F1c3NpYW4ifSwKKyAgICAgIHtXSU5ET1dfQ09TSU5FLCAiQ29zaW5lIHdpbmRvdyIsCisgICAgICAgICAgImNvc2luZSJ9LAorICAgICAge1dJTkRPV19IQU5OLCAiSGFubiB3aW5kb3ciLAorICAgICAgICAgICJoYW5uIn0sCisgICAgICB7MCwgTlVMTCwgTlVMTH0KKyAgICB9OworCisgICAgZ3R5cGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0QXVkaW9XU2luY0xpbWl0V2luZG93IiwgdmFsdWVzKTsKKyAgfQorICByZXR1cm4gZ3R5cGU7Cit9CisKKyNkZWZpbmUgZ3N0X2F1ZGlvX3dzaW5jbGltaXRfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0QXVkaW9XU2luY0xpbWl0LCBnc3RfYXVkaW9fd3NpbmNsaW1pdCwKKyAgICBHU1RfVFlQRV9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIpOworCitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fd3NpbmNsaW1pdF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fd3NpbmNsaW1pdF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fd3NpbmNsaW1pdF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9fd3NpbmNsaW1pdF9zZXR1cCAoR3N0QXVkaW9GaWx0ZXIgKiBiYXNlLAorICAgIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pOworCisKKyNkZWZpbmUgUE9XMih4KSAgKHgpKih4KQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX3dzaW5jbGltaXRfY2xhc3NfaW5pdCAoR3N0QXVkaW9XU2luY0xpbWl0Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyAqZmlsdGVyX2NsYXNzID0gKEdzdEF1ZGlvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9hdWRpb193c2luY2xpbWl0X2RlYnVnLCAiYXVkaW93c2luY2xpbWl0IiwgMCwKKyAgICAgICJMb3ctcGFzcyBhbmQgSGlnaC1wYXNzIFdpbmRvd2VkIHNpbmMgZmlsdGVyIHBsdWdpbiIpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9hdWRpb193c2luY2xpbWl0X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2F1ZGlvX3dzaW5jbGltaXRfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9hdWRpb193c2luY2xpbWl0X2ZpbmFsaXplOworCisgIC8qIEZJWE1FOiBEb24ndCB1c2UgdGhlIGNvbXBsZXRlIHBvc3NpYmxlIHJhbmdlIGJ1dCByZXN0cmljdCB0aGUgdXBwZXIgYm91bmRhcnkKKyAgICogc28gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgVUlzIGNhbiB1c2UgYSBzbGlkZXIgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9GUkVRVUVOQ1ksCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJjdXRvZmYiLCAiQ3V0b2ZmIiwKKyAgICAgICAgICAiQ3V0LW9mZiBGcmVxdWVuY3kgKEh6KSIsIDAuMCwgMTAwMDAwLjAsIDAuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTEVOR1RILAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImxlbmd0aCIsICJMZW5ndGgiLAorICAgICAgICAgICJGaWx0ZXIga2VybmVsIGxlbmd0aCwgd2lsbCBiZSByb3VuZGVkIHRvIHRoZSBuZXh0IG9kZCBudW1iZXIiLAorICAgICAgICAgIDMsIDI1NjAwMCwgMTAxLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01PREUsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoIm1vZGUiLCAiTW9kZSIsCisgICAgICAgICAgIkxvdyBwYXNzIG9yIGhpZ2ggcGFzcyBtb2RlIiwgR1NUX1RZUEVfQVVESU9fV1NJTkNfTElNSVRfTU9ERSwKKyAgICAgICAgICBNT0RFX0xPV19QQVNTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1dJTkRPVywKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgid2luZG93IiwgIldpbmRvdyIsCisgICAgICAgICAgIldpbmRvdyBmdW5jdGlvbiB0byB1c2UiLCBHU1RfVFlQRV9BVURJT19XU0lOQ19MSU1JVF9XSU5ET1csCisgICAgICAgICAgV0lORE9XX0hBTU1JTkcsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiTG93IHBhc3MgJiBoaWdoIHBhc3MgZmlsdGVyIiwgIkZpbHRlci9FZmZlY3QvQXVkaW8iLAorICAgICAgIkxvdyBwYXNzIGFuZCBoaWdoIHBhc3Mgd2luZG93ZWQgc2luYyBmaWx0ZXIiLAorICAgICAgIlRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4sICIKKyAgICAgICJTdGV2ZW4gVy4gU21pdGgsICIKKyAgICAgICJEcmVhbWxhYiBUZWNobm9sb2dpZXMgTHRkLiA8bWF0aGlzLmhvZmVyQGRyZWFtbGFiLm5ldD4sICIKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4iKTsKKworICBmaWx0ZXJfY2xhc3MtPnNldHVwID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdWRpb193c2luY2xpbWl0X3NldHVwKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb193c2luY2xpbWl0X2luaXQgKEdzdEF1ZGlvV1NpbmNMaW1pdCAqIHNlbGYpCit7CisgIHNlbGYtPm1vZGUgPSBNT0RFX0xPV19QQVNTOworICBzZWxmLT53aW5kb3cgPSBXSU5ET1dfSEFNTUlORzsKKyAgc2VsZi0+a2VybmVsX2xlbmd0aCA9IDEwMTsKKyAgc2VsZi0+Y3V0b2ZmID0gMC4wOworCisgIGdfbXV0ZXhfaW5pdCAoJnNlbGYtPmxvY2spOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX3dzaW5jbGltaXRfYnVpbGRfa2VybmVsIChHc3RBdWRpb1dTaW5jTGltaXQgKiBzZWxmLAorICAgIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIGdpbnQgaSA9IDA7CisgIGdkb3VibGUgc3VtID0gMC4wOworICBnaW50IGxlbiA9IDA7CisgIGdkb3VibGUgdzsKKyAgZ2RvdWJsZSAqa2VybmVsID0gTlVMTDsKKyAgZ2ludCByYXRlLCBjaGFubmVsczsKKworICBsZW4gPSBzZWxmLT5rZXJuZWxfbGVuZ3RoOworCisgIGlmIChpbmZvKSB7CisgICAgcmF0ZSA9IEdTVF9BVURJT19JTkZPX1JBVEUgKGluZm8pOworICAgIGNoYW5uZWxzID0gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKGluZm8pOworICB9IGVsc2UgeworICAgIHJhdGUgPSBHU1RfQVVESU9fRklMVEVSX1JBVEUgKHNlbGYpOworICAgIGNoYW5uZWxzID0gR1NUX0FVRElPX0ZJTFRFUl9DSEFOTkVMUyAoc2VsZik7CisgIH0KKworICBpZiAocmF0ZSA9PSAwKSB7CisgICAgR1NUX0RFQlVHICgicmF0ZSBub3Qgc2V0IHlldCIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChjaGFubmVscyA9PSAwKSB7CisgICAgR1NUX0RFQlVHICgiY2hhbm5lbHMgbm90IHNldCB5ZXQiKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBDbGFtcCBjdXRvZmYgZnJlcXVlbmN5IGJldHdlZW4gMCBhbmQgdGhlIG55cXVpc3QgZnJlcXVlbmN5ICovCisgIHNlbGYtPmN1dG9mZiA9IENMQU1QIChzZWxmLT5jdXRvZmYsIDAuMCwgcmF0ZSAvIDIpOworCisgIEdTVF9ERUJVRyAoImdzdF9hdWRpb193c2luY2xpbWl0XzogaW5pdGlhbGl6aW5nIGZpbHRlciBrZXJuZWwgb2YgbGVuZ3RoICVkICIKKyAgICAgICJ3aXRoIGN1dG9mZiAlLjJsZiBIeiAiCisgICAgICAiZm9yIG1vZGUgJXMiLAorICAgICAgbGVuLCBzZWxmLT5jdXRvZmYsCisgICAgICAoc2VsZi0+bW9kZSA9PSBNT0RFX0xPV19QQVNTKSA/ICJsb3ctcGFzcyIgOiAiaGlnaC1wYXNzIik7CisKKyAgLyogZmlsbCB0aGUga2VybmVsICovCisgIHcgPSAyICogR19QSSAqIChzZWxmLT5jdXRvZmYgLyByYXRlKTsKKworICBrZXJuZWwgPSBnX25ldyAoZ2RvdWJsZSwgbGVuKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICBpZiAoaSA9PSAobGVuIC0gMSkgLyAyLjApCisgICAgICBrZXJuZWxbaV0gPSB3OworICAgIGVsc2UKKyAgICAgIGtlcm5lbFtpXSA9IHNpbiAodyAqIChpIC0gKGxlbiAtIDEpIC8gMikpIC8gKGkgLSAobGVuIC0gMSkgLyAyLjApOworCisgICAgLyogd2luZG93aW5nICovCisgICAgc3dpdGNoIChzZWxmLT53aW5kb3cpIHsKKyAgICAgIGNhc2UgV0lORE9XX0hBTU1JTkc6CisgICAgICAgIGtlcm5lbFtpXSAqPSAoMC41NCAtIDAuNDYgKiBjb3MgKDIgKiBHX1BJICogaSAvIChsZW4gLSAxKSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV0lORE9XX0JMQUNLTUFOOgorICAgICAgICBrZXJuZWxbaV0gKj0gKDAuNDIgLSAwLjUgKiBjb3MgKDIgKiBHX1BJICogaSAvIChsZW4gLSAxKSkgKworICAgICAgICAgICAgMC4wOCAqIGNvcyAoNCAqIEdfUEkgKiBpIC8gKGxlbiAtIDEpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXSU5ET1dfR0FVU1NJQU46CisgICAgICAgIGtlcm5lbFtpXSAqPSBleHAgKC0wLjUgKiBQT1cyICgzLjAgLyBsZW4gKiAoMiAqIGkgLSAobGVuIC0gMSkpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXSU5ET1dfQ09TSU5FOgorICAgICAgICBrZXJuZWxbaV0gKj0gY29zIChHX1BJICogaSAvIChsZW4gLSAxKSAtIEdfUEkgLyAyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdJTkRPV19IQU5OOgorICAgICAgICBrZXJuZWxbaV0gKj0gMC41ICogKDEgLSBjb3MgKDIgKiBHX1BJICogaSAvIChsZW4gLSAxKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBub3JtYWxpemUgZm9yIHVuaXR5IGdhaW4gYXQgREMgKi8KKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorICAgIHN1bSArPSBrZXJuZWxbaV07CisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKyAgICBrZXJuZWxbaV0gLz0gc3VtOworCisgIC8qIGNvbnZlcnQgdG8gaGlnaHBhc3MgaWYgc3BlY2lmaWVkICovCisgIGlmIChzZWxmLT5tb2RlID09IE1PREVfSElHSF9QQVNTKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorICAgICAga2VybmVsW2ldID0gLWtlcm5lbFtpXTsKKworICAgIGlmIChsZW4gJSAyID09IDEpIHsKKyAgICAgIGtlcm5lbFsobGVuIC0gMSkgLyAyXSArPSAxLjA7CisgICAgfSBlbHNlIHsKKyAgICAgIGtlcm5lbFtsZW4gLyAyIC0gMV0gKz0gMC41OworICAgICAga2VybmVsW2xlbiAvIDJdICs9IDAuNTsKKyAgICB9CisgIH0KKworICBnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3NldF9rZXJuZWwgKEdTVF9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIgKHNlbGYpLAorICAgICAga2VybmVsLCBzZWxmLT5rZXJuZWxfbGVuZ3RoLCAobGVuIC0gMSkgLyAyLCBpbmZvKTsKK30KKworLyogR3N0QXVkaW9GaWx0ZXIgdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KKworLyogZ2V0IG5vdGlmaWVkIG9mIGNhcHMgYW5kIHBsdWcgaW4gdGhlIGNvcnJlY3QgcHJvY2VzcyBmdW5jdGlvbiAqLworc3RhdGljIGdib29sZWFuCitnc3RfYXVkaW9fd3NpbmNsaW1pdF9zZXR1cCAoR3N0QXVkaW9GaWx0ZXIgKiBiYXNlLCBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKQoreworICBHc3RBdWRpb1dTaW5jTGltaXQgKnNlbGYgPSBHU1RfQVVESU9fV1NJTkNfTElNSVQgKGJhc2UpOworCisgIGdzdF9hdWRpb193c2luY2xpbWl0X2J1aWxkX2tlcm5lbCAoc2VsZiwgaW5mbyk7CisKKyAgcmV0dXJuIEdTVF9BVURJT19GSUxURVJfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNldHVwIChiYXNlLCBpbmZvKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb193c2luY2xpbWl0X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RBdWRpb1dTaW5jTGltaXQgKnNlbGYgPSBHU1RfQVVESU9fV1NJTkNfTElNSVQgKG9iamVjdCk7CisKKyAgZ19tdXRleF9jbGVhciAoJnNlbGYtPmxvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb193c2luY2xpbWl0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb1dTaW5jTGltaXQgKnNlbGYgPSBHU1RfQVVESU9fV1NJTkNfTElNSVQgKG9iamVjdCk7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX0FVRElPX1dTSU5DX0xJTUlUIChzZWxmKSk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xFTkdUSDp7CisgICAgICBnaW50IHZhbDsKKworICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICB2YWwgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGlmICh2YWwgJSAyID09IDApCisgICAgICAgIHZhbCsrOworCisgICAgICBpZiAodmFsICE9IHNlbGYtPmtlcm5lbF9sZW5ndGgpIHsKKyAgICAgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9wdXNoX3Jlc2lkdWUgKEdTVF9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIKKyAgICAgICAgICAgIChzZWxmKSk7CisgICAgICAgIHNlbGYtPmtlcm5lbF9sZW5ndGggPSB2YWw7CisgICAgICAgIGdzdF9hdWRpb193c2luY2xpbWl0X2J1aWxkX2tlcm5lbCAoc2VsZiwgTlVMTCk7CisgICAgICB9CisgICAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9GUkVRVUVOQ1k6CisgICAgICBnX211dGV4X2xvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIHNlbGYtPmN1dG9mZiA9IGdfdmFsdWVfZ2V0X2Zsb2F0ICh2YWx1ZSk7CisgICAgICBnc3RfYXVkaW9fd3NpbmNsaW1pdF9idWlsZF9rZXJuZWwgKHNlbGYsIE5VTEwpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBzZWxmLT5tb2RlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgZ3N0X2F1ZGlvX3dzaW5jbGltaXRfYnVpbGRfa2VybmVsIChzZWxmLCBOVUxMKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfV0lORE9XOgorICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBzZWxmLT53aW5kb3cgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBnc3RfYXVkaW9fd3NpbmNsaW1pdF9idWlsZF9rZXJuZWwgKHNlbGYsIE5VTEwpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb193c2luY2xpbWl0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb1dTaW5jTGltaXQgKnNlbGYgPSBHU1RfQVVESU9fV1NJTkNfTElNSVQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xFTkdUSDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHNlbGYtPmtlcm5lbF9sZW5ndGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZSRVFVRU5DWToKKyAgICAgIGdfdmFsdWVfc2V0X2Zsb2F0ICh2YWx1ZSwgc2VsZi0+Y3V0b2ZmKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHNlbGYtPm1vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1dJTkRPVzoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBzZWxmLT53aW5kb3cpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW93c2luY2xpbWl0LmggYi9nc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2ZhOTE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvYXVkaW93c2luY2xpbWl0LmgKQEAgLTAsMCArMSw4MCBAQAorLyogLSotIGMtYmFzaWMtb2Zmc2V0OiAyIC0qLQorICogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAxIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgIDIwMDYgRHJlYW1sYWIgVGVjaG5vbG9naWVzIEx0ZC4gPG1hdGhpcy5ob2ZlckBkcmVhbWxhYi5uZXQ+CisgKiAgICAgICAgICAgICAgIDIwMDctMjAwOSBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqIAorICogCisgKiB0aGlzIHdpbmRvd2VkIHNpbmMgZmlsdGVyIGlzIHRha2VuIGZyb20gdGhlIGZyZWVseSBkb3dubG9hZGFibGUgRFNQIGJvb2ssCisgKiAiVGhlIFNjaWVudGlzdCBhbmQgRW5naW5lZXIncyBHdWlkZSB0byBEaWdpdGFsIFNpZ25hbCBQcm9jZXNzaW5nIiwKKyAqIGNoYXB0ZXIgMTYKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmRzcGd1aWRlLmNvbS8KKyAqCisgKi8KKworI2lmbmRlZiBfX0dTVF9BVURJT19XU0lOQ19MSU1JVF9IX18KKyNkZWZpbmUgX19HU1RfQVVESU9fV1NJTkNfTElNSVRfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlICJhdWRpb2Z4YmFzZWZpcmZpbHRlci5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQVVESU9fV1NJTkNfTElNSVQgXAorICAoZ3N0X2F1ZGlvX3dzaW5jbGltaXRfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0FVRElPX1dTSU5DX0xJTUlUKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVVESU9fV1NJTkNfTElNSVQsR3N0QXVkaW9XU2luY0xpbWl0KSkKKyNkZWZpbmUgR1NUX0FVRElPX1dTSU5DX0xJTUlUX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0FVRElPX1dTSU5DX0xJTUlULEdzdEF1ZGlvV1NpbmNMaW1pdENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FVRElPX1dTSU5DX0xJTUlUKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQVVESU9fV1NJTkNfTElNSVQpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fV1NJTkNfTElNSVRfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfQVVESU9fV1NJTkNfTElNSVQpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9XU2luY0xpbWl0IEdzdEF1ZGlvV1NpbmNMaW1pdDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdWRpb1dTaW5jTGltaXRDbGFzcyBHc3RBdWRpb1dTaW5jTGltaXRDbGFzczsKKworLyoqCisgKiBHc3RBdWRpb1dTaW5jTGltaXQ6CisgKgorICogT3BhcXVlIGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdEF1ZGlvV1NpbmNMaW1pdCB7CisgIEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyIHBhcmVudDsKKworICBnaW50IG1vZGU7CisgIGdpbnQgd2luZG93OworICBnZmxvYXQgY3V0b2ZmOworICBnaW50IGtlcm5lbF9sZW5ndGg7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKyAgR011dGV4IGxvY2s7Cit9OworCitzdHJ1Y3QgX0dzdEF1ZGlvV1NpbmNMaW1pdENsYXNzIHsKKyAgR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXJDbGFzcyBwYXJlbnQ7Cit9OworCitHVHlwZSBnc3RfYXVkaW9fd3NpbmNsaW1pdF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9BVURJT19XU0lOQ19MSU1JVF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYyBiL2dzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmJjMjBmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jCkBAIC0wLDAgKzEsOTIyIEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUm92IEp1dmFubyA8cm92anV2YW5vQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1zY2FsZXRlbXBvCisgKgorICogU2NhbGUgdGVtcG8gd2hpbGUgbWFpbnRhaW5pbmcgcGl0Y2gKKyAqIChXU09MQS1saWtlIHRlY2huaXF1ZSB3aXRoIGNyb3NzIGNvcnJlbGF0aW9uKQorICogSW5zcGlyZWQgYnkgU291bmRUb3VjaCBsaWJyYXJ5IGJ5IE9sbGkgUGFydmlhaW5lbgorICoKKyAqIFVzZSBTY2VsZXRlbXBvIHRvIGFwcGx5IHBsYXliYWNrIHJhdGVzIHdpdGhvdXQgdGhlIGNoaXBtdW5rIGVmZmVjdC4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogPHBhcmE+CisgKiB8WworICogZmlsZXNyYyBsb2NhdGlvbj1tZWRpYS5leHQgISBkZWNvZGViaW4gbmFtZT1kIFwKKyAqICAgICBkLiAhIHF1ZXVlICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIHNjYWxldGVtcG8gISBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgYXV0b2F1ZGlvc2luayBcCisgKiAgICAgZC4gISBxdWV1ZSAhIHZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsKKyAqIF18CisgKiBPUgorICogfFsKKyAqIHBsYXliaW4gdXJpPS4uLiBhdWRpb19zaW5rPSJzY2FsZXRlbXBvICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIGF1dG9hdWRpb3NpbmsiCisgKiBdfAorICogV2hlbiBhbiBhcHBsaWNhdGlvbiBzZW5kcyBhIHNlZWsgZXZlbnQgd2l0aCByYXRlICE9IDEuMCwgU2NhbGV0ZW1wbyBhcHBsaWVzCisgKiB0aGUgcmF0ZSBjaGFuZ2UgYnkgc2NhbGluZyB0aGUgdGVtcG8gd2l0aG91dCBzY2FsaW5nIHRoZSBwaXRjaC4KKyAqCisgKiBTY2FsZXRlbXBvIHdvcmtzIGJ5IHByb2R1Y2luZyBhdWRpbyBpbiBjb25zdGFudCBzaXplZCBjaHVua3MKKyAqICgjR3N0U2NhbGV0ZW1wbzpzdHJpZGUpIGJ1dCBjb25zdW1pbmcgY2h1bmtzIHByb3BvcnRpb25hbCB0byB0aGUgcGxheWJhY2sKKyAqIHJhdGUuCisgKgorICogU2NhbGV0ZW1wbyB0aGVuIHNtb290aHMgdGhlIG91dHB1dCBieSBibGVuZGluZyB0aGUgZW5kIG9mIG9uZSBzdHJpZGUgd2l0aAorICogdGhlIG5leHQgKCNHc3RTY2FsZXRlbXBvOm92ZXJsYXApLgorICoKKyAqIFNjYWxldGVtcG8gc21vb3RocyB0aGUgb3ZlcmxhcCBmdXJ0aGVyIGJ5IHNlYXJjaGluZyB3aXRoaW4gdGhlIGlucHV0IGJ1ZmZlcgorICogZm9yIHRoZSBiZXN0IG92ZXJsYXAgcG9zaXRpb24uICBTY2FsZXRlbXBvIHVzZXMgYSBzdGF0aXN0aWNhbCBjcm9zcworICogY29ycmVsYXRpb24gKHJvdWdobHkgYSBkb3QtcHJvZHVjdCkuICBTY2FsZXRlbXBvIGNvbnN1bWVzIG1vc3Qgb2YgaXRzIENQVQorICogY3ljbGVzIGhlcmUuIE9uZSBjYW4gdXNlIHRoZSAjR3N0U2NhbGV0ZW1wbzpzZWFyY2ggcHJvcGVyeSB0byB0dW5lIGhvdyBmYXIKKyAqIHRoZSBhbGdvcml0bSBsb29rcy4KKyAqIDwvcGFyYT4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworLyoKKyAqIE5vdGU6IGZyYW1lID0gYXVkaW8ga2V5IHVuaXQgKGkuZS4gb25lIHNhbXBsZSBmb3IgZWFjaCBjaGFubmVsKQorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAgICAgICAgIC8qIGZvciBtZW1zZXQgKi8KKworI2luY2x1ZGUgImdzdHNjYWxldGVtcG8uaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3NjYWxldGVtcG9fZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3NjYWxldGVtcG9fZGVidWcKKworLyogRmlsdGVyIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgTEFTVF9TSUdOQUwKK307CisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX1JBVEUsCisgIFBST1BfU1RSSURFLAorICBQUk9QX09WRVJMQVAsCisgIFBST1BfU0VBUkNILAorfTsKKworI2RlZmluZSBTVVBQT1JURURfQ0FQUyBcCitHU1RfU1RBVElDX0NBUFMgKCBcCisgICAgR1NUX0FVRElPX0NBUFNfTUFLRSAoR1NUX0FVRElPX05FIChGMzIpKSAiOyAiIFwKKyAgICBHU1RfQVVESU9fQ0FQU19NQUtFIChHU1RfQVVESU9fTkUgKEY2NCkpICI7ICIgXAorICAgIEdTVF9BVURJT19DQVBTX01BS0UgKEdTVF9BVURJT19ORSAoUzE2KSkgXAorKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIFNVUFBPUlRFRF9DQVBTKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBTVVBQT1JURURfQ0FQUyk7CisKKyNkZWZpbmUgREVCVUdfSU5JVChibGEpIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3Rfc2NhbGV0ZW1wb19kZWJ1ZywgInNjYWxldGVtcG8iLCAwLCAic2NhbGV0ZW1wbyBlbGVtZW50Iik7CisKKyNkZWZpbmUgZ3N0X3NjYWxldGVtcG9fcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdFNjYWxldGVtcG8sIGdzdF9zY2FsZXRlbXBvLAorICAgIEdTVF9UWVBFX0JBU0VfVFJBTlNGT1JNLCBERUJVR19JTklUICgwKSk7CisKKyNkZWZpbmUgQ1JFQVRFX0JFU1RfT1ZFUkxBUF9PRkZTRVRfRkxPQVRfRlVOQyh0eXBlKSBcCitzdGF0aWMgZ3VpbnQgXAorYmVzdF9vdmVybGFwX29mZnNldF8jI3R5cGUgKEdzdFNjYWxldGVtcG8gKiBzdCkgXAoreyBcCisgIGcjI3R5cGUgKnB3LCAqcG8sICpwcGMsICpzZWFyY2hfc3RhcnQ7IFwKKyAgZyMjdHlwZSBiZXN0X2NvcnIgPSBHX01JTklOVDsgXAorICBndWludCBiZXN0X29mZiA9IDA7IFwKKyAgZ2ludCBpLCBvZmY7IFwKKyAgXAorICBwdyA9IHN0LT50YWJsZV93aW5kb3c7IFwKKyAgcG8gPSBzdC0+YnVmX292ZXJsYXA7IFwKKyAgcG8gKz0gc3QtPnNhbXBsZXNfcGVyX2ZyYW1lOyBcCisgIHBwYyA9IHN0LT5idWZfcHJlX2NvcnI7IFwKKyAgZm9yIChpID0gc3QtPnNhbXBsZXNfcGVyX2ZyYW1lOyBpIDwgc3QtPnNhbXBsZXNfb3ZlcmxhcDsgaSsrKSB7IFwKKyAgICAqcHBjKysgPSAqcHcrKyAqICpwbysrOyBcCisgIH0gXAorICBcCisgIHNlYXJjaF9zdGFydCA9IChnIyN0eXBlICopIHN0LT5idWZfcXVldWUgKyBzdC0+c2FtcGxlc19wZXJfZnJhbWU7IFwKKyAgZm9yIChvZmYgPSAwOyBvZmYgPCBzdC0+ZnJhbWVzX3NlYXJjaDsgb2ZmKyspIHsgXAorICAgIGcjI3R5cGUgY29yciA9IDA7IFwKKyAgICBnIyN0eXBlICpwcyA9IHNlYXJjaF9zdGFydDsgXAorICAgIHBwYyA9IHN0LT5idWZfcHJlX2NvcnI7IFwKKyAgICBmb3IgKGkgPSBzdC0+c2FtcGxlc19wZXJfZnJhbWU7IGkgPCBzdC0+c2FtcGxlc19vdmVybGFwOyBpKyspIHsgXAorICAgICAgY29yciArPSAqcHBjKysgKiAqcHMrKzsgXAorICAgIH0gXAorICAgIGlmIChjb3JyID4gYmVzdF9jb3JyKSB7IFwKKyAgICAgIGJlc3RfY29yciA9IGNvcnI7IFwKKyAgICAgIGJlc3Rfb2ZmID0gb2ZmOyBcCisgICAgfSBcCisgICAgc2VhcmNoX3N0YXJ0ICs9IHN0LT5zYW1wbGVzX3Blcl9mcmFtZTsgXAorICB9IFwKKyAgXAorICByZXR1cm4gYmVzdF9vZmYgKiBzdC0+Ynl0ZXNfcGVyX2ZyYW1lOyBcCit9CisKK0NSRUFURV9CRVNUX09WRVJMQVBfT0ZGU0VUX0ZMT0FUX0ZVTkMgKGZsb2F0KTsKK0NSRUFURV9CRVNUX09WRVJMQVBfT0ZGU0VUX0ZMT0FUX0ZVTkMgKGRvdWJsZSk7CisKKy8qIGJ1ZmZlciBwYWRkaW5nIGZvciBsb29wIG9wdGltaXphdGlvbjogc2l6ZW9mKGdpbnQzMikgKiAobG9vcF9zaXplIC0gMSkgKi8KKyNkZWZpbmUgVU5ST0xMX1BBRERJTkcgKDQqMykKK3N0YXRpYyBndWludAorYmVzdF9vdmVybGFwX29mZnNldF9zMTYgKEdzdFNjYWxldGVtcG8gKiBzdCkKK3sKKyAgZ2ludDMyICpwdywgKnBwYzsKKyAgZ2ludDE2ICpwbywgKnNlYXJjaF9zdGFydDsKKyAgZ2ludDY0IGJlc3RfY29yciA9IEdfTUlOSU5UNjQ7CisgIGd1aW50IGJlc3Rfb2ZmID0gMDsKKyAgZ3VpbnQgb2ZmOworICBnbG9uZyBpOworCisgIHB3ID0gc3QtPnRhYmxlX3dpbmRvdzsKKyAgcG8gPSBzdC0+YnVmX292ZXJsYXA7CisgIHBvICs9IHN0LT5zYW1wbGVzX3Blcl9mcmFtZTsKKyAgcHBjID0gc3QtPmJ1Zl9wcmVfY29ycjsKKyAgZm9yIChpID0gc3QtPnNhbXBsZXNfcGVyX2ZyYW1lOyBpIDwgc3QtPnNhbXBsZXNfb3ZlcmxhcDsgaSsrKSB7CisgICAgKnBwYysrID0gKCpwdysrICogKnBvKyspID4+IDE1OworICB9CisKKyAgc2VhcmNoX3N0YXJ0ID0gKGdpbnQxNiAqKSBzdC0+YnVmX3F1ZXVlICsgc3QtPnNhbXBsZXNfcGVyX2ZyYW1lOworICBmb3IgKG9mZiA9IDA7IG9mZiA8IHN0LT5mcmFtZXNfc2VhcmNoOyBvZmYrKykgeworICAgIGdpbnQ2NCBjb3JyID0gMDsKKyAgICBnaW50MTYgKnBzID0gc2VhcmNoX3N0YXJ0OworICAgIHBwYyA9IHN0LT5idWZfcHJlX2NvcnI7CisgICAgcHBjICs9IHN0LT5zYW1wbGVzX292ZXJsYXAgLSBzdC0+c2FtcGxlc19wZXJfZnJhbWU7CisgICAgcHMgKz0gc3QtPnNhbXBsZXNfb3ZlcmxhcCAtIHN0LT5zYW1wbGVzX3Blcl9mcmFtZTsKKyAgICBpID0gLSgoZ2xvbmcpIHN0LT5zYW1wbGVzX292ZXJsYXAgLSAoZ2xvbmcpIHN0LT5zYW1wbGVzX3Blcl9mcmFtZSk7CisgICAgZG8geworICAgICAgY29yciArPSBwcGNbaSArIDBdICogcHNbaSArIDBdOworICAgICAgY29yciArPSBwcGNbaSArIDFdICogcHNbaSArIDFdOworICAgICAgY29yciArPSBwcGNbaSArIDJdICogcHNbaSArIDJdOworICAgICAgY29yciArPSBwcGNbaSArIDNdICogcHNbaSArIDNdOworICAgICAgaSArPSA0OworICAgIH0gd2hpbGUgKGkgPCAwKTsKKyAgICBpZiAoY29yciA+IGJlc3RfY29ycikgeworICAgICAgYmVzdF9jb3JyID0gY29ycjsKKyAgICAgIGJlc3Rfb2ZmID0gb2ZmOworICAgIH0KKyAgICBzZWFyY2hfc3RhcnQgKz0gc3QtPnNhbXBsZXNfcGVyX2ZyYW1lOworICB9CisKKyAgcmV0dXJuIGJlc3Rfb2ZmICogc3QtPmJ5dGVzX3Blcl9mcmFtZTsKK30KKworI2RlZmluZSBDUkVBVEVfT1VUUFVUX09WRVJMQVBfRkxPQVRfRlVOQyh0eXBlKSBcCitzdGF0aWMgdm9pZCBcCitvdXRwdXRfb3ZlcmxhcF8jI3R5cGUgKEdzdFNjYWxldGVtcG8gKiBzdCwgZ3BvaW50ZXIgYnVmX291dCwgZ3VpbnQgYnl0ZXNfb2ZmKSBcCit7IFwKKyAgZyMjdHlwZSAqcG91dCA9IGJ1Zl9vdXQ7IFwKKyAgZyMjdHlwZSAqcGIgPSBzdC0+dGFibGVfYmxlbmQ7IFwKKyAgZyMjdHlwZSAqcG8gPSBzdC0+YnVmX292ZXJsYXA7IFwKKyAgZyMjdHlwZSAqcGluID0gKGcjI3R5cGUgKikgKHN0LT5idWZfcXVldWUgKyBieXRlc19vZmYpOyBcCisgIGdpbnQgaTsgXAorICBmb3IgKGkgPSAwOyBpIDwgc3QtPnNhbXBsZXNfb3ZlcmxhcDsgaSsrKSB7IFwKKyAgICAqcG91dCsrID0gKnBvIC0gKnBiKysgKiAoKnBvIC0gKnBpbisrKTsgXAorICAgIHBvKys7IFwKKyAgfSBcCit9CisKK0NSRUFURV9PVVRQVVRfT1ZFUkxBUF9GTE9BVF9GVU5DIChmbG9hdCk7CitDUkVBVEVfT1VUUFVUX09WRVJMQVBfRkxPQVRfRlVOQyAoZG91YmxlKTsKKworc3RhdGljIHZvaWQKK291dHB1dF9vdmVybGFwX3MxNiAoR3N0U2NhbGV0ZW1wbyAqIHN0LCBncG9pbnRlciBidWZfb3V0LCBndWludCBieXRlc19vZmYpCit7CisgIGdpbnQxNiAqcG91dCA9IGJ1Zl9vdXQ7CisgIGdpbnQzMiAqcGIgPSBzdC0+dGFibGVfYmxlbmQ7CisgIGdpbnQxNiAqcG8gPSBzdC0+YnVmX292ZXJsYXA7CisgIGdpbnQxNiAqcGluID0gKGdpbnQxNiAqKSAoc3QtPmJ1Zl9xdWV1ZSArIGJ5dGVzX29mZik7CisgIGdpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHN0LT5zYW1wbGVzX292ZXJsYXA7IGkrKykgeworICAgICpwb3V0KysgPSAqcG8gLSAoKCpwYisrICogKCpwbyAtICpwaW4rKykpID4+IDE2KTsKKyAgICBwbysrOworICB9Cit9CisKK3N0YXRpYyBndWludAorZmlsbF9xdWV1ZSAoR3N0U2NhbGV0ZW1wbyAqIHN0LCBHc3RCdWZmZXIgKiBidWZfaW4sIGd1aW50IG9mZnNldCkKK3sKKyAgZ3VpbnQgYnl0ZXNfaW4gPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZfaW4pIC0gb2Zmc2V0OworICBndWludCBvZmZzZXRfdW5jaGFuZ2VkID0gb2Zmc2V0OworICBHc3RNYXBJbmZvIG1hcDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmX2luLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBpZiAoc3QtPmJ5dGVzX3RvX3NsaWRlID4gMCkgeworICAgIGlmIChzdC0+Ynl0ZXNfdG9fc2xpZGUgPCBzdC0+Ynl0ZXNfcXVldWVkKSB7CisgICAgICBndWludCBieXRlc19pbl9tb3ZlID0gc3QtPmJ5dGVzX3F1ZXVlZCAtIHN0LT5ieXRlc190b19zbGlkZTsKKyAgICAgIG1lbW1vdmUgKHN0LT5idWZfcXVldWUsIHN0LT5idWZfcXVldWUgKyBzdC0+Ynl0ZXNfdG9fc2xpZGUsCisgICAgICAgICAgYnl0ZXNfaW5fbW92ZSk7CisgICAgICBzdC0+Ynl0ZXNfdG9fc2xpZGUgPSAwOworICAgICAgc3QtPmJ5dGVzX3F1ZXVlZCA9IGJ5dGVzX2luX21vdmU7CisgICAgfSBlbHNlIHsKKyAgICAgIGd1aW50IGJ5dGVzX2luX3NraXA7CisgICAgICBzdC0+Ynl0ZXNfdG9fc2xpZGUgLT0gc3QtPmJ5dGVzX3F1ZXVlZDsKKyAgICAgIGJ5dGVzX2luX3NraXAgPSBNSU4gKHN0LT5ieXRlc190b19zbGlkZSwgYnl0ZXNfaW4pOworICAgICAgc3QtPmJ5dGVzX3F1ZXVlZCA9IDA7CisgICAgICBzdC0+Ynl0ZXNfdG9fc2xpZGUgLT0gYnl0ZXNfaW5fc2tpcDsKKyAgICAgIG9mZnNldCArPSBieXRlc19pbl9za2lwOworICAgICAgYnl0ZXNfaW4gLT0gYnl0ZXNfaW5fc2tpcDsKKyAgICB9CisgIH0KKworICBpZiAoYnl0ZXNfaW4gPiAwKSB7CisgICAgZ3VpbnQgYnl0ZXNfaW5fY29weSA9CisgICAgICAgIE1JTiAoc3QtPmJ5dGVzX3F1ZXVlX21heCAtIHN0LT5ieXRlc19xdWV1ZWQsIGJ5dGVzX2luKTsKKyAgICBtZW1jcHkgKHN0LT5idWZfcXVldWUgKyBzdC0+Ynl0ZXNfcXVldWVkLCBtYXAuZGF0YSArIG9mZnNldCwgYnl0ZXNfaW5fY29weSk7CisgICAgc3QtPmJ5dGVzX3F1ZXVlZCArPSBieXRlc19pbl9jb3B5OworICAgIG9mZnNldCArPSBieXRlc19pbl9jb3B5OworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1Zl9pbiwgJm1hcCk7CisKKyAgcmV0dXJuIG9mZnNldCAtIG9mZnNldF91bmNoYW5nZWQ7Cit9CisKK3N0YXRpYyB2b2lkCityZWluaXRfYnVmZmVycyAoR3N0U2NhbGV0ZW1wbyAqIHN0KQoreworICBnaW50IGksIGo7CisgIGd1aW50IGZyYW1lc19vdmVybGFwOworICBndWludCBuZXdfc2l6ZTsKKyAgR3N0Q2xvY2tUaW1lIGxhdGVuY3k7CisKKyAgZ3VpbnQgZnJhbWVzX3N0cmlkZSA9IHN0LT5tc19zdHJpZGUgKiBzdC0+c2FtcGxlX3JhdGUgLyAxMDAwLjA7CisgIHN0LT5ieXRlc19zdHJpZGUgPSBmcmFtZXNfc3RyaWRlICogc3QtPmJ5dGVzX3Blcl9mcmFtZTsKKworICAvKiBvdmVybGFwICovCisgIGZyYW1lc19vdmVybGFwID0gZnJhbWVzX3N0cmlkZSAqIHN0LT5wZXJjZW50X292ZXJsYXA7CisgIGlmIChmcmFtZXNfb3ZlcmxhcCA8IDEpIHsgICAgIC8qIGlmIG5vIG92ZXJsYXAgKi8KKyAgICBzdC0+Ynl0ZXNfb3ZlcmxhcCA9IDA7CisgICAgc3QtPmJ5dGVzX3N0YW5kaW5nID0gc3QtPmJ5dGVzX3N0cmlkZTsKKyAgICBzdC0+c2FtcGxlc19zdGFuZGluZyA9IHN0LT5ieXRlc19zdGFuZGluZyAvIHN0LT5ieXRlc19wZXJfc2FtcGxlOworICAgIHN0LT5vdXRwdXRfb3ZlcmxhcCA9IE5VTEw7CisgIH0gZWxzZSB7CisgICAgZ3VpbnQgcHJldl9vdmVybGFwID0gc3QtPmJ5dGVzX292ZXJsYXA7CisgICAgc3QtPmJ5dGVzX292ZXJsYXAgPSBmcmFtZXNfb3ZlcmxhcCAqIHN0LT5ieXRlc19wZXJfZnJhbWU7CisgICAgc3QtPnNhbXBsZXNfb3ZlcmxhcCA9IGZyYW1lc19vdmVybGFwICogc3QtPnNhbXBsZXNfcGVyX2ZyYW1lOworICAgIHN0LT5ieXRlc19zdGFuZGluZyA9IHN0LT5ieXRlc19zdHJpZGUgLSBzdC0+Ynl0ZXNfb3ZlcmxhcDsKKyAgICBzdC0+c2FtcGxlc19zdGFuZGluZyA9IHN0LT5ieXRlc19zdGFuZGluZyAvIHN0LT5ieXRlc19wZXJfc2FtcGxlOworICAgIHN0LT5idWZfb3ZlcmxhcCA9IGdfcmVhbGxvYyAoc3QtPmJ1Zl9vdmVybGFwLCBzdC0+Ynl0ZXNfb3ZlcmxhcCk7CisgICAgLyogUzE2IHVzZXMgZ2ludDMyIGJsZW5kIHRhYmxlLCBmbG9hdHMvZG91YmxlcyB1c2UgdGhlaXIgcmVzcGVjdGl2ZSB0eXBlICovCisgICAgc3QtPnRhYmxlX2JsZW5kID0KKyAgICAgICAgZ19yZWFsbG9jIChzdC0+dGFibGVfYmxlbmQsCisgICAgICAgIHN0LT5zYW1wbGVzX292ZXJsYXAgKiAoc3QtPmZvcm1hdCA9PQorICAgICAgICAgICAgR1NUX0FVRElPX0ZPUk1BVF9TMTYgPyA0IDogc3QtPmJ5dGVzX3Blcl9zYW1wbGUpKTsKKyAgICBpZiAoc3QtPmJ5dGVzX292ZXJsYXAgPiBwcmV2X292ZXJsYXApIHsKKyAgICAgIG1lbXNldCAoKGd1aW50OCAqKSBzdC0+YnVmX292ZXJsYXAgKyBwcmV2X292ZXJsYXAsIDAsCisgICAgICAgICAgc3QtPmJ5dGVzX292ZXJsYXAgLSBwcmV2X292ZXJsYXApOworICAgIH0KKyAgICBpZiAoc3QtPmZvcm1hdCA9PSBHU1RfQVVESU9fRk9STUFUX1MxNikgeworICAgICAgZ2ludDMyICpwYiA9IHN0LT50YWJsZV9ibGVuZDsKKyAgICAgIGdpbnQ2NCBibGVuZCA9IDA7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVzX292ZXJsYXA7IGkrKykgeworICAgICAgICBnaW50MzIgdiA9IGJsZW5kIC8gZnJhbWVzX292ZXJsYXA7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdC0+c2FtcGxlc19wZXJfZnJhbWU7IGorKykgeworICAgICAgICAgICpwYisrID0gdjsKKyAgICAgICAgfQorICAgICAgICBibGVuZCArPSA2NTUzNTsgICAgICAgICAvKiAyXjE2ICovCisgICAgICB9CisgICAgICBzdC0+b3V0cHV0X292ZXJsYXAgPSBvdXRwdXRfb3ZlcmxhcF9zMTY7CisgICAgfSBlbHNlIGlmIChzdC0+Zm9ybWF0ID09IEdTVF9BVURJT19GT1JNQVRfRjMyKSB7CisgICAgICBnZmxvYXQgKnBiID0gc3QtPnRhYmxlX2JsZW5kOworICAgICAgZ2Zsb2F0IHQgPSAoZ2Zsb2F0KSBmcmFtZXNfb3ZlcmxhcDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZXNfb3ZlcmxhcDsgaSsrKSB7CisgICAgICAgIGdmbG9hdCB2ID0gaSAvIHQ7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdC0+c2FtcGxlc19wZXJfZnJhbWU7IGorKykgeworICAgICAgICAgICpwYisrID0gdjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc3QtPm91dHB1dF9vdmVybGFwID0gb3V0cHV0X292ZXJsYXBfZmxvYXQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGdkb3VibGUgKnBiID0gc3QtPnRhYmxlX2JsZW5kOworICAgICAgZ2RvdWJsZSB0ID0gKGdkb3VibGUpIGZyYW1lc19vdmVybGFwOworICAgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lc19vdmVybGFwOyBpKyspIHsKKyAgICAgICAgZ2RvdWJsZSB2ID0gaSAvIHQ7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdC0+c2FtcGxlc19wZXJfZnJhbWU7IGorKykgeworICAgICAgICAgICpwYisrID0gdjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc3QtPm91dHB1dF9vdmVybGFwID0gb3V0cHV0X292ZXJsYXBfZG91YmxlOworICAgIH0KKyAgfQorCisgIC8qIGJlc3Qgb3ZlcmxhcCAqLworICBzdC0+ZnJhbWVzX3NlYXJjaCA9CisgICAgICAoZnJhbWVzX292ZXJsYXAgPD0gMSkgPyAwIDogc3QtPm1zX3NlYXJjaCAqIHN0LT5zYW1wbGVfcmF0ZSAvIDEwMDAuMDsKKyAgaWYgKHN0LT5mcmFtZXNfc2VhcmNoIDwgMSkgeyAgLyogaWYgbm8gc2VhcmNoICovCisgICAgc3QtPmJlc3Rfb3ZlcmxhcF9vZmZzZXQgPSBOVUxMOworICB9IGVsc2UgeworICAgIC8qIFMxNiB1c2VzIGdpbnQzMiBidWZmZXIsIGZsb2F0cy9kb3VibGVzIHVzZSB0aGVpciByZXNwZWN0aXZlIHR5cGUgKi8KKyAgICBndWludCBieXRlc19wcmVfY29yciA9CisgICAgICAgIChzdC0+c2FtcGxlc19vdmVybGFwIC0gc3QtPnNhbXBsZXNfcGVyX2ZyYW1lKSAqIChzdC0+Zm9ybWF0ID09CisgICAgICAgIEdTVF9BVURJT19GT1JNQVRfUzE2ID8gNCA6IHN0LT5ieXRlc19wZXJfc2FtcGxlKTsKKyAgICBzdC0+YnVmX3ByZV9jb3JyID0KKyAgICAgICAgZ19yZWFsbG9jIChzdC0+YnVmX3ByZV9jb3JyLCBieXRlc19wcmVfY29yciArIFVOUk9MTF9QQURESU5HKTsKKyAgICBzdC0+dGFibGVfd2luZG93ID0gZ19yZWFsbG9jIChzdC0+dGFibGVfd2luZG93LCBieXRlc19wcmVfY29ycik7CisgICAgaWYgKHN0LT5mb3JtYXQgPT0gR1NUX0FVRElPX0ZPUk1BVF9TMTYpIHsKKyAgICAgIGdpbnQ2NCB0ID0gZnJhbWVzX292ZXJsYXA7CisgICAgICBnaW50MzIgbiA9IDg1ODk5MzQ1ODhMTCAvICh0ICogdCk7ICAgICAgICAvKiA0ICogKDJeMzEgLSAxKSAvIHReMiAqLworICAgICAgZ2ludDMyICpwdzsKKworICAgICAgbWVtc2V0ICgoZ3VpbnQ4ICopIHN0LT5idWZfcHJlX2NvcnIgKyBieXRlc19wcmVfY29yciwgMCwgVU5ST0xMX1BBRERJTkcpOworICAgICAgcHcgPSBzdC0+dGFibGVfd2luZG93OworICAgICAgZm9yIChpID0gMTsgaSA8IGZyYW1lc19vdmVybGFwOyBpKyspIHsKKyAgICAgICAgZ2ludDMyIHYgPSAoaSAqICh0IC0gaSkgKiBuKSA+PiAxNTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHN0LT5zYW1wbGVzX3Blcl9mcmFtZTsgaisrKSB7CisgICAgICAgICAgKnB3KysgPSB2OworICAgICAgICB9CisgICAgICB9CisgICAgICBzdC0+YmVzdF9vdmVybGFwX29mZnNldCA9IGJlc3Rfb3ZlcmxhcF9vZmZzZXRfczE2OworICAgIH0gZWxzZSBpZiAoc3QtPmZvcm1hdCA9PSBHU1RfQVVESU9fRk9STUFUX0YzMikgeworICAgICAgZ2Zsb2F0ICpwdyA9IHN0LT50YWJsZV93aW5kb3c7CisgICAgICBmb3IgKGkgPSAxOyBpIDwgZnJhbWVzX292ZXJsYXA7IGkrKykgeworICAgICAgICBnZmxvYXQgdiA9IGkgKiAoZnJhbWVzX292ZXJsYXAgLSBpKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHN0LT5zYW1wbGVzX3Blcl9mcmFtZTsgaisrKSB7CisgICAgICAgICAgKnB3KysgPSB2OworICAgICAgICB9CisgICAgICB9CisgICAgICBzdC0+YmVzdF9vdmVybGFwX29mZnNldCA9IGJlc3Rfb3ZlcmxhcF9vZmZzZXRfZmxvYXQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGdkb3VibGUgKnB3ID0gc3QtPnRhYmxlX3dpbmRvdzsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBmcmFtZXNfb3ZlcmxhcDsgaSsrKSB7CisgICAgICAgIGdkb3VibGUgdiA9IGkgKiAoZnJhbWVzX292ZXJsYXAgLSBpKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHN0LT5zYW1wbGVzX3Blcl9mcmFtZTsgaisrKSB7CisgICAgICAgICAgKnB3KysgPSB2OworICAgICAgICB9CisgICAgICB9CisgICAgICBzdC0+YmVzdF9vdmVybGFwX29mZnNldCA9IGJlc3Rfb3ZlcmxhcF9vZmZzZXRfZG91YmxlOworICAgIH0KKyAgfQorCisgIG5ld19zaXplID0KKyAgICAgIChzdC0+ZnJhbWVzX3NlYXJjaCArIGZyYW1lc19zdHJpZGUgKworICAgICAgZnJhbWVzX292ZXJsYXApICogc3QtPmJ5dGVzX3Blcl9mcmFtZTsKKyAgaWYgKHN0LT5ieXRlc19xdWV1ZWQgPiBuZXdfc2l6ZSkgeworICAgIGlmIChzdC0+Ynl0ZXNfdG9fc2xpZGUgPiBzdC0+Ynl0ZXNfcXVldWVkKSB7CisgICAgICBzdC0+Ynl0ZXNfdG9fc2xpZGUgLT0gc3QtPmJ5dGVzX3F1ZXVlZDsKKyAgICAgIHN0LT5ieXRlc19xdWV1ZWQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBndWludCBuZXdfcXVldWVkID0gTUlOIChzdC0+Ynl0ZXNfcXVldWVkIC0gc3QtPmJ5dGVzX3RvX3NsaWRlLCBuZXdfc2l6ZSk7CisgICAgICBtZW1tb3ZlIChzdC0+YnVmX3F1ZXVlLAorICAgICAgICAgIHN0LT5idWZfcXVldWUgKyBzdC0+Ynl0ZXNfcXVldWVkIC0gbmV3X3F1ZXVlZCwgbmV3X3F1ZXVlZCk7CisgICAgICBzdC0+Ynl0ZXNfdG9fc2xpZGUgPSAwOworICAgICAgc3QtPmJ5dGVzX3F1ZXVlZCA9IG5ld19xdWV1ZWQ7CisgICAgfQorICB9CisKKyAgc3QtPmJ5dGVzX3F1ZXVlX21heCA9IG5ld19zaXplOworICBzdC0+YnVmX3F1ZXVlID0gZ19yZWFsbG9jIChzdC0+YnVmX3F1ZXVlLCBzdC0+Ynl0ZXNfcXVldWVfbWF4KTsKKworICBsYXRlbmN5ID0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoc3QtPmJ5dGVzX3F1ZXVlX21heCwgR1NUX1NFQ09ORCwKKyAgICAgIHN0LT5ieXRlc19wZXJfZnJhbWUgKiBzdC0+c2FtcGxlX3JhdGUpOworICBpZiAoc3QtPmxhdGVuY3kgIT0gbGF0ZW5jeSkgeworICAgIHN0LT5sYXRlbmN5ID0gbGF0ZW5jeTsKKyAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UIChzdCksCisgICAgICAgIGdzdF9tZXNzYWdlX25ld19sYXRlbmN5IChHU1RfT0JKRUNUIChzdCkpKTsKKyAgfQorCisgIHN0LT5ieXRlc19zdHJpZGVfc2NhbGVkID0gc3QtPmJ5dGVzX3N0cmlkZSAqIHN0LT5zY2FsZTsKKyAgc3QtPmZyYW1lc19zdHJpZGVfc2NhbGVkID0gc3QtPmJ5dGVzX3N0cmlkZV9zY2FsZWQgLyBzdC0+Ynl0ZXNfcGVyX2ZyYW1lOworCisgIEdTVF9ERUJVRworICAgICAgKCIlLjNmIHNjYWxlLCAlLjNmIHN0cmlkZV9pbiwgJWkgc3RyaWRlX291dCwgJWkgc3RhbmRpbmcsICVpIG92ZXJsYXAsICVpIHNlYXJjaCwgJWkgcXVldWUsICVzIG1vZGUiLAorICAgICAgc3QtPnNjYWxlLCBzdC0+ZnJhbWVzX3N0cmlkZV9zY2FsZWQsCisgICAgICAoZ2ludCkgKHN0LT5ieXRlc19zdHJpZGUgLyBzdC0+Ynl0ZXNfcGVyX2ZyYW1lKSwKKyAgICAgIChnaW50KSAoc3QtPmJ5dGVzX3N0YW5kaW5nIC8gc3QtPmJ5dGVzX3Blcl9mcmFtZSksCisgICAgICAoZ2ludCkgKHN0LT5ieXRlc19vdmVybGFwIC8gc3QtPmJ5dGVzX3Blcl9mcmFtZSksIHN0LT5mcmFtZXNfc2VhcmNoLAorICAgICAgKGdpbnQpIChzdC0+Ynl0ZXNfcXVldWVfbWF4IC8gc3QtPmJ5dGVzX3Blcl9mcmFtZSksCisgICAgICBnc3RfYXVkaW9fZm9ybWF0X3RvX3N0cmluZyAoc3QtPmZvcm1hdCkpOworCisgIHN0LT5yZWluaXRfYnVmZmVycyA9IEZBTFNFOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK3JldmVyc2VfYnVmZmVyIChHc3RTY2FsZXRlbXBvICogc3QsIEdzdEJ1ZmZlciAqIGluYnVmKQoreworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0TWFwSW5mbyBpbWFwLCBvbWFwOworCisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZiwgJmltYXAsIEdTVF9NQVBfUkVBRCk7CisgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoaW1hcC5zaXplKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZiwgJm9tYXAsIEdTVF9NQVBfV1JJVEUpOworCisgIGlmIChzdC0+Zm9ybWF0ID09IEdTVF9BVURJT19GT1JNQVRfRjY0KSB7CisgICAgY29uc3QgZ2ludDY0ICppcCA9IChjb25zdCBnaW50NjQgKikgaW1hcC5kYXRhOworICAgIGdpbnQ2NCAqb3AgPSAoZ2ludDY0ICopIChvbWFwLmRhdGEgKyBvbWFwLnNpemUgLSA4ICogc3QtPnNhbXBsZXNfcGVyX2ZyYW1lKTsKKyAgICBndWludCBpLCBuID0gaW1hcC5zaXplIC8gKDggKiBzdC0+c2FtcGxlc19wZXJfZnJhbWUpOworICAgIGd1aW50IGosIGMgPSBzdC0+c2FtcGxlc19wZXJfZnJhbWU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgYzsgaisrKQorICAgICAgICBvcFtqXSA9IGlwW2pdOworICAgICAgb3AgLT0gYzsKKyAgICAgIGlwICs9IGM7CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IGdpbnQzMiAqaXAgPSAoY29uc3QgZ2ludDMyICopIGltYXAuZGF0YTsKKyAgICBnaW50MzIgKm9wID0gKGdpbnQzMiAqKSAob21hcC5kYXRhICsgb21hcC5zaXplIC0gNCAqIHN0LT5zYW1wbGVzX3Blcl9mcmFtZSk7CisgICAgZ3VpbnQgaSwgbiA9IGltYXAuc2l6ZSAvICg0ICogc3QtPnNhbXBsZXNfcGVyX2ZyYW1lKTsKKyAgICBndWludCBqLCBjID0gc3QtPnNhbXBsZXNfcGVyX2ZyYW1lOworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IGM7IGorKykKKyAgICAgICAgb3Bbal0gPSBpcFtqXTsKKyAgICAgIG9wIC09IGM7CisgICAgICBpcCArPSBjOworICAgIH0KKyAgfQorCisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmLCAmaW1hcCk7CisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm9tYXApOworCisgIHJldHVybiBvdXRidWY7Cit9CisKKy8qIEdzdEJhc2VUcmFuc2Zvcm0gdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfc2NhbGV0ZW1wb190cmFuc2Zvcm0gKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RCdWZmZXIgKiBpbmJ1ZiwgR3N0QnVmZmVyICogb3V0YnVmKQoreworICBHc3RTY2FsZXRlbXBvICpzdCA9IEdTVF9TQ0FMRVRFTVBPICh0cmFucyk7CisgIGdpbnQ4ICpwb3V0OworICBndWludCBvZmZzZXRfaW4sIGJ5dGVzX291dDsKKyAgR3N0TWFwSW5mbyBvbWFwOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworICBHc3RCdWZmZXIgKnRtcGJ1ZiA9IE5VTEw7CisKKyAgaWYgKHN0LT5yZXZlcnNlKQorICAgIHRtcGJ1ZiA9IHJldmVyc2VfYnVmZmVyIChzdCwgaW5idWYpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZvbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgcG91dCA9IChnaW50OCAqKSBvbWFwLmRhdGE7CisgIGJ5dGVzX291dCA9IG9tYXAuc2l6ZTsKKworICBvZmZzZXRfaW4gPSBmaWxsX3F1ZXVlIChzdCwgdG1wYnVmID8gdG1wYnVmIDogaW5idWYsIDApOworICBieXRlc19vdXQgPSAwOworICB3aGlsZSAoc3QtPmJ5dGVzX3F1ZXVlZCA+PSBzdC0+Ynl0ZXNfcXVldWVfbWF4KSB7CisgICAgZ3VpbnQgYnl0ZXNfb2ZmID0gMDsKKyAgICBnZG91YmxlIGZyYW1lc190b19zbGlkZTsKKyAgICBndWludCBmcmFtZXNfdG9fc3RyaWRlX3dob2xlOworCisgICAgLyogb3V0cHV0IHN0cmlkZSAqLworICAgIGlmIChzdC0+b3V0cHV0X292ZXJsYXApIHsKKyAgICAgIGlmIChzdC0+YmVzdF9vdmVybGFwX29mZnNldCkgeworICAgICAgICBieXRlc19vZmYgPSBzdC0+YmVzdF9vdmVybGFwX29mZnNldCAoc3QpOworICAgICAgfQorICAgICAgc3QtPm91dHB1dF9vdmVybGFwIChzdCwgcG91dCwgYnl0ZXNfb2ZmKTsKKyAgICB9CisgICAgbWVtY3B5IChwb3V0ICsgc3QtPmJ5dGVzX292ZXJsYXAsCisgICAgICAgIHN0LT5idWZfcXVldWUgKyBieXRlc19vZmYgKyBzdC0+Ynl0ZXNfb3ZlcmxhcCwgc3QtPmJ5dGVzX3N0YW5kaW5nKTsKKyAgICBwb3V0ICs9IHN0LT5ieXRlc19zdHJpZGU7CisgICAgYnl0ZXNfb3V0ICs9IHN0LT5ieXRlc19zdHJpZGU7CisKKyAgICAvKiBpbnB1dCBzdHJpZGUgKi8KKyAgICBtZW1jcHkgKHN0LT5idWZfb3ZlcmxhcCwKKyAgICAgICAgc3QtPmJ1Zl9xdWV1ZSArIGJ5dGVzX29mZiArIHN0LT5ieXRlc19zdHJpZGUsIHN0LT5ieXRlc19vdmVybGFwKTsKKyAgICBmcmFtZXNfdG9fc2xpZGUgPSBzdC0+ZnJhbWVzX3N0cmlkZV9zY2FsZWQgKyBzdC0+ZnJhbWVzX3N0cmlkZV9lcnJvcjsKKyAgICBmcmFtZXNfdG9fc3RyaWRlX3dob2xlID0gKGdpbnQpIGZyYW1lc190b19zbGlkZTsKKyAgICBzdC0+Ynl0ZXNfdG9fc2xpZGUgPSBmcmFtZXNfdG9fc3RyaWRlX3dob2xlICogc3QtPmJ5dGVzX3Blcl9mcmFtZTsKKyAgICBzdC0+ZnJhbWVzX3N0cmlkZV9lcnJvciA9IGZyYW1lc190b19zbGlkZSAtIGZyYW1lc190b19zdHJpZGVfd2hvbGU7CisKKyAgICBvZmZzZXRfaW4gKz0gZmlsbF9xdWV1ZSAoc3QsIHRtcGJ1ZiA/IHRtcGJ1ZiA6IGluYnVmLCBvZmZzZXRfaW4pOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm9tYXApOworCisgIGlmIChzdC0+cmV2ZXJzZSkgeworICAgIHRpbWVzdGFtcCA9IHN0LT5pbl9zZWdtZW50LnN0b3AgLSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWYpOworICAgIGlmICh0aW1lc3RhbXAgPCBzdC0+bGF0ZW5jeSkKKyAgICAgIHRpbWVzdGFtcCA9IDA7CisgICAgZWxzZQorICAgICAgdGltZXN0YW1wIC09IHN0LT5sYXRlbmN5OworICB9IGVsc2UgeworICAgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZikgLSBzdC0+aW5fc2VnbWVudC5zdGFydDsKKyAgICBpZiAodGltZXN0YW1wIDwgc3QtPmxhdGVuY3kpCisgICAgICB0aW1lc3RhbXAgPSAwOworICAgIGVsc2UKKyAgICAgIHRpbWVzdGFtcCAtPSBzdC0+bGF0ZW5jeTsKKyAgfQorICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSA9IHRpbWVzdGFtcCAvIHN0LT5zY2FsZSArIHN0LT5pbl9zZWdtZW50LnN0YXJ0OworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoYnl0ZXNfb3V0LCBHU1RfU0VDT05ELAorICAgICAgc3QtPmJ5dGVzX3Blcl9mcmFtZSAqIHN0LT5zYW1wbGVfcmF0ZSk7CisgIGdzdF9idWZmZXJfc2V0X3NpemUgKG91dGJ1ZiwgYnl0ZXNfb3V0KTsKKworICBpZiAodG1wYnVmKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKHRtcGJ1Zik7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NjYWxldGVtcG9fc3VibWl0X2lucHV0X2J1ZmZlciAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIGdib29sZWFuIGlzX2Rpc2NvbnQsIEdzdEJ1ZmZlciAqIGlucHV0KQoreworICBHc3RTY2FsZXRlbXBvICpzY2FsZXRlbXBvID0gR1NUX1NDQUxFVEVNUE8gKHRyYW5zKTsKKworICBpZiAoc2NhbGV0ZW1wby0+aW5fc2VnbWVudC5mb3JtYXQgPT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgaW5wdXQgPQorICAgICAgICBnc3RfYXVkaW9fYnVmZmVyX2NsaXAgKGlucHV0LCAmc2NhbGV0ZW1wby0+aW5fc2VnbWVudCwKKyAgICAgICAgc2NhbGV0ZW1wby0+c2FtcGxlX3JhdGUsIHNjYWxldGVtcG8tPmJ5dGVzX3Blcl9mcmFtZSk7CisgICAgaWYgKCFpbnB1dCkKKyAgICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorCisgIHJldHVybiBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKHBhcmVudF9jbGFzcyktPnN1Ym1pdF9pbnB1dF9idWZmZXIgKHRyYW5zLAorICAgICAgaXNfZGlzY29udCwgaW5wdXQpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zY2FsZXRlbXBvX3RyYW5zZm9ybV9zaXplIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0UGFkRGlyZWN0aW9uIGRpcmVjdGlvbiwKKyAgICBHc3RDYXBzICogY2FwcywgZ3NpemUgc2l6ZSwgR3N0Q2FwcyAqIG90aGVyY2FwcywgZ3NpemUgKiBvdGhlcnNpemUpCit7CisgIGlmIChkaXJlY3Rpb24gPT0gR1NUX1BBRF9TSU5LKSB7CisgICAgR3N0U2NhbGV0ZW1wbyAqc2NhbGV0ZW1wbyA9IEdTVF9TQ0FMRVRFTVBPICh0cmFucyk7CisgICAgZ2ludCBieXRlc190b19vdXQ7CisKKyAgICBpZiAoc2NhbGV0ZW1wby0+cmVpbml0X2J1ZmZlcnMpCisgICAgICByZWluaXRfYnVmZmVycyAoc2NhbGV0ZW1wbyk7CisKKyAgICBieXRlc190b19vdXQgPSBzaXplICsgc2NhbGV0ZW1wby0+Ynl0ZXNfcXVldWVkIC0gc2NhbGV0ZW1wby0+Ynl0ZXNfdG9fc2xpZGU7CisgICAgaWYgKGJ5dGVzX3RvX291dCA8IChnaW50KSBzY2FsZXRlbXBvLT5ieXRlc19xdWV1ZV9tYXgpIHsKKyAgICAgICpvdGhlcnNpemUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAvKiB3aGlsZSAodG90YWxfYnVmZmVyZWQgLSBzdHJpZGVfbGVuZ3RoICogbiA+PSBxdWV1ZV9tYXgpIG4rKyAqLworICAgICAgKm90aGVyc2l6ZSA9IHNjYWxldGVtcG8tPmJ5dGVzX3N0cmlkZSAqICgoZ3VpbnQpICgKKyAgICAgICAgICAgICAgKGJ5dGVzX3RvX291dCAtIHNjYWxldGVtcG8tPmJ5dGVzX3F1ZXVlX21heCArCisgICAgICAgICAgICAgICAgICAvKiByb3VuZGluZyBwcm90ZWN0aW9uICovIHNjYWxldGVtcG8tPmJ5dGVzX3Blcl9mcmFtZSkKKyAgICAgICAgICAgICAgLyBzY2FsZXRlbXBvLT5ieXRlc19zdHJpZGVfc2NhbGVkKSArIDEpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2NhbGV0ZW1wb19zaW5rX2V2ZW50IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFNjYWxldGVtcG8gKnNjYWxldGVtcG8gPSBHU1RfU0NBTEVURU1QTyAodHJhbnMpOworCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID09IEdTVF9FVkVOVF9TRUdNRU5UKSB7CisgICAgR3N0U2VnbWVudCBzZWdtZW50OworCisgICAgZ3N0X2V2ZW50X2NvcHlfc2VnbWVudCAoZXZlbnQsICZzZWdtZW50KTsKKworICAgIGlmIChzZWdtZW50LmZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUKKyAgICAgICAgfHwgc2NhbGV0ZW1wby0+c2NhbGUgIT0gQUJTIChzZWdtZW50LnJhdGUpCisgICAgICAgIHx8ICEgIXNjYWxldGVtcG8tPnJldmVyc2UgIT0gISAhKHNlZ21lbnQucmF0ZSA8IDAuMCkpIHsKKyAgICAgIGlmIChzZWdtZW50LmZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUgfHwgQUJTIChzZWdtZW50LnJhdGUgLSAxLjApIDwgMWUtMTApIHsKKyAgICAgICAgc2NhbGV0ZW1wby0+c2NhbGUgPSAxLjA7CisgICAgICAgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfcGFzc3Rocm91Z2ggKEdTVF9CQVNFX1RSQU5TRk9STSAoc2NhbGV0ZW1wbyksCisgICAgICAgICAgICBUUlVFKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfcGFzc3Rocm91Z2ggKEdTVF9CQVNFX1RSQU5TRk9STSAoc2NhbGV0ZW1wbyksCisgICAgICAgICAgICBGQUxTRSk7CisgICAgICAgIHNjYWxldGVtcG8tPnNjYWxlID0gQUJTIChzZWdtZW50LnJhdGUpOworICAgICAgICBzY2FsZXRlbXBvLT5yZXZlcnNlID0gc2VnbWVudC5yYXRlIDwgMC4wOworICAgICAgICBzY2FsZXRlbXBvLT5ieXRlc19zdHJpZGVfc2NhbGVkID0KKyAgICAgICAgICAgIHNjYWxldGVtcG8tPmJ5dGVzX3N0cmlkZSAqIHNjYWxldGVtcG8tPnNjYWxlOworICAgICAgICBzY2FsZXRlbXBvLT5mcmFtZXNfc3RyaWRlX3NjYWxlZCA9CisgICAgICAgICAgICBzY2FsZXRlbXBvLT5ieXRlc19zdHJpZGVfc2NhbGVkIC8gc2NhbGV0ZW1wby0+Ynl0ZXNfcGVyX2ZyYW1lOworICAgICAgICBHU1RfREVCVUcgKCIlLjNmIHNjYWxlLCAlLjNmIHN0cmlkZV9pbiwgJWkgc3RyaWRlX291dCIsCisgICAgICAgICAgICBzY2FsZXRlbXBvLT5zY2FsZSwgc2NhbGV0ZW1wby0+ZnJhbWVzX3N0cmlkZV9zY2FsZWQsCisgICAgICAgICAgICAoZ2ludCkgKHNjYWxldGVtcG8tPmJ5dGVzX3N0cmlkZSAvIHNjYWxldGVtcG8tPmJ5dGVzX3Blcl9mcmFtZSkpOworCisgICAgICAgIHNjYWxldGVtcG8tPmJ5dGVzX3RvX3NsaWRlID0gMDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzY2FsZXRlbXBvLT5pbl9zZWdtZW50ID0gc2VnbWVudDsKKyAgICBzY2FsZXRlbXBvLT5vdXRfc2VnbWVudCA9IHNlZ21lbnQ7CisKKyAgICBpZiAoc2NhbGV0ZW1wby0+c2NhbGUgIT0gMS4wIHx8IHNjYWxldGVtcG8tPnJldmVyc2UpIHsKKyAgICAgIGd1aW50MzIgc2VxbnVtOworCisgICAgICBzZWdtZW50LmFwcGxpZWRfcmF0ZSA9IHNlZ21lbnQucmF0ZTsKKyAgICAgIHNlZ21lbnQucmF0ZSA9IDEuMDsKKworICAgICAgaWYgKHNlZ21lbnQuc3RvcCAhPSAtMSkgeworICAgICAgICBzZWdtZW50LnN0b3AgPQorICAgICAgICAgICAgKHNlZ21lbnQuc3RvcCAtIHNlZ21lbnQuc3RhcnQpIC8gQUJTIChzZWdtZW50LmFwcGxpZWRfcmF0ZSkgKworICAgICAgICAgICAgc2VnbWVudC5zdGFydDsKKyAgICAgIH0KKworICAgICAgc2NhbGV0ZW1wby0+b3V0X3NlZ21lbnQgPSBzZWdtZW50OworCisgICAgICBzZXFudW0gPSBnc3RfZXZlbnRfZ2V0X3NlcW51bSAoZXZlbnQpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisKKyAgICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCk7CisgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZXZlbnQsIHNlcW51bSk7CisKKyAgICAgIHJldHVybiBnc3RfcGFkX3B1c2hfZXZlbnQgKEdTVF9CQVNFX1RSQU5TRk9STV9TUkNfUEFEICh0cmFucyksIGV2ZW50KTsKKyAgICB9CisgIH0gZWxzZSBpZiAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSA9PSBHU1RfRVZFTlRfRkxVU0hfU1RPUCkgeworICAgIGdzdF9zZWdtZW50X2luaXQgKCZzY2FsZXRlbXBvLT5pbl9zZWdtZW50LCBHU1RfRk9STUFUX1VOREVGSU5FRCk7CisgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNjYWxldGVtcG8tPm91dF9zZWdtZW50LCBHU1RfRk9STUFUX1VOREVGSU5FRCk7CisgIH0gZWxzZSBpZiAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSA9PSBHU1RfRVZFTlRfR0FQKSB7CisgICAgaWYgKHNjYWxldGVtcG8tPnNjYWxlICE9IDEuMCkgeworICAgICAgR3N0Q2xvY2tUaW1lIGdhcF90cywgZ2FwX2R1cmF0aW9uOworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2dhcCAoZXZlbnQsICZnYXBfdHMsICZnYXBfZHVyYXRpb24pOworICAgICAgaWYgKHNjYWxldGVtcG8tPnJldmVyc2UpIHsKKyAgICAgICAgZ2FwX3RzID0gc2NhbGV0ZW1wby0+aW5fc2VnbWVudC5zdG9wIC0gZ2FwX3RzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2FwX3RzID0gZ2FwX3RzIC0gc2NhbGV0ZW1wby0+aW5fc2VnbWVudC5zdGFydDsKKyAgICAgIH0KKyAgICAgIGdhcF90cyA9IGdhcF90cyAvIHNjYWxldGVtcG8tPnNjYWxlICsgc2NhbGV0ZW1wby0+aW5fc2VnbWVudC5zdGFydDsKKyAgICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZ2FwX2R1cmF0aW9uKSkgeworICAgICAgICBnYXBfZHVyYXRpb24gPSBnYXBfZHVyYXRpb24gLyBBQlMgKHNjYWxldGVtcG8tPnNjYWxlKTsKKyAgICAgIH0KKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2dhcCAoZ2FwX3RzLCBnYXBfZHVyYXRpb24pOworICAgIH0KKyAgfQorCisgIHJldHVybiBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNpbmtfZXZlbnQgKHRyYW5zLCBldmVudCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NjYWxldGVtcG9fc2V0X2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RDYXBzICogaW5jYXBzLCBHc3RDYXBzICogb3V0Y2FwcykKK3sKKyAgR3N0U2NhbGV0ZW1wbyAqc2NhbGV0ZW1wbyA9IEdTVF9TQ0FMRVRFTVBPICh0cmFucyk7CisKKyAgZ2ludCB3aWR0aCwgYnBzLCBuY2gsIHJhdGU7CisgIEdzdEF1ZGlvSW5mbyBpbmZvOworICBHc3RBdWRpb0Zvcm1hdCBmb3JtYXQ7CisKKyAgaWYgKCFnc3RfYXVkaW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBpbmNhcHMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBuY2ggPSBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJmluZm8pOworICByYXRlID0gR1NUX0FVRElPX0lORk9fUkFURSAoJmluZm8pOworICB3aWR0aCA9IEdTVF9BVURJT19JTkZPX1dJRFRIICgmaW5mbyk7CisgIGZvcm1hdCA9IEdTVF9BVURJT19JTkZPX0ZPUk1BVCAoJmluZm8pOworCisgIGJwcyA9IHdpZHRoIC8gODsKKworICBHU1RfREVCVUcgKCJjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCAiLCAlZCBicHMiLCBpbmNhcHMsIGJwcyk7CisKKyAgaWYgKHJhdGUgIT0gc2NhbGV0ZW1wby0+c2FtcGxlX3JhdGUKKyAgICAgIHx8IG5jaCAhPSBzY2FsZXRlbXBvLT5zYW1wbGVzX3Blcl9mcmFtZQorICAgICAgfHwgYnBzICE9IHNjYWxldGVtcG8tPmJ5dGVzX3Blcl9zYW1wbGUgfHwgZm9ybWF0ICE9IHNjYWxldGVtcG8tPmZvcm1hdCkgeworICAgIHNjYWxldGVtcG8tPnNhbXBsZV9yYXRlID0gcmF0ZTsKKyAgICBzY2FsZXRlbXBvLT5zYW1wbGVzX3Blcl9mcmFtZSA9IG5jaDsKKyAgICBzY2FsZXRlbXBvLT5ieXRlc19wZXJfc2FtcGxlID0gYnBzOworICAgIHNjYWxldGVtcG8tPmJ5dGVzX3Blcl9mcmFtZSA9IG5jaCAqIGJwczsKKyAgICBzY2FsZXRlbXBvLT5mb3JtYXQgPSBmb3JtYXQ7CisgICAgc2NhbGV0ZW1wby0+cmVpbml0X2J1ZmZlcnMgPSBUUlVFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NjYWxldGVtcG9fc3RhcnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucykKK3sKKyAgR3N0U2NhbGV0ZW1wbyAqc2NhbGV0ZW1wbyA9IEdTVF9TQ0FMRVRFTVBPICh0cmFucyk7CisKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNjYWxldGVtcG8tPmluX3NlZ21lbnQsIEdTVF9GT1JNQVRfVU5ERUZJTkVEKTsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNjYWxldGVtcG8tPm91dF9zZWdtZW50LCBHU1RfRk9STUFUX1VOREVGSU5FRCk7CisgIHNjYWxldGVtcG8tPnJlaW5pdF9idWZmZXJzID0gVFJVRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2NhbGV0ZW1wb19zdG9wIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpCit7CisgIEdzdFNjYWxldGVtcG8gKnNjYWxldGVtcG8gPSBHU1RfU0NBTEVURU1QTyAodHJhbnMpOworCisgIGdfZnJlZSAoc2NhbGV0ZW1wby0+YnVmX3F1ZXVlKTsKKyAgc2NhbGV0ZW1wby0+YnVmX3F1ZXVlID0gTlVMTDsKKyAgZ19mcmVlIChzY2FsZXRlbXBvLT5idWZfb3ZlcmxhcCk7CisgIHNjYWxldGVtcG8tPmJ1Zl9vdmVybGFwID0gTlVMTDsKKyAgZ19mcmVlIChzY2FsZXRlbXBvLT50YWJsZV9ibGVuZCk7CisgIHNjYWxldGVtcG8tPnRhYmxlX2JsZW5kID0gTlVMTDsKKyAgZ19mcmVlIChzY2FsZXRlbXBvLT5idWZfcHJlX2NvcnIpOworICBzY2FsZXRlbXBvLT5idWZfcHJlX2NvcnIgPSBOVUxMOworICBnX2ZyZWUgKHNjYWxldGVtcG8tPnRhYmxlX3dpbmRvdyk7CisgIHNjYWxldGVtcG8tPnRhYmxlX3dpbmRvdyA9IE5VTEw7CisgIHNjYWxldGVtcG8tPnJlaW5pdF9idWZmZXJzID0gVFJVRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2NhbGV0ZW1wb19xdWVyeSAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLCBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdFNjYWxldGVtcG8gKnNjYWxldGVtcG8gPSBHU1RfU0NBTEVURU1QTyAodHJhbnMpOworCisgIGlmIChkaXJlY3Rpb24gPT0gR1NUX1BBRF9TUkMpIHsKKyAgICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICAgIGNhc2UgR1NUX1FVRVJZX0xBVEVOQ1k6eworICAgICAgICBHc3RQYWQgKnBlZXI7CisKKyAgICAgICAgaWYgKChwZWVyID0gZ3N0X3BhZF9nZXRfcGVlciAoR1NUX0JBU0VfVFJBTlNGT1JNX1NJTktfUEFEICh0cmFucykpKSkgeworICAgICAgICAgIGlmICgoZ3N0X3BhZF9xdWVyeSAocGVlciwgcXVlcnkpKSkgeworICAgICAgICAgICAgR3N0Q2xvY2tUaW1lIG1pbiwgbWF4OworICAgICAgICAgICAgZ2Jvb2xlYW4gbGl2ZTsKKworICAgICAgICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2xhdGVuY3kgKHF1ZXJ5LCAmbGl2ZSwgJm1pbiwgJm1heCk7CisKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNjYWxldGVtcG8sICJQZWVyIGxhdGVuY3k6IG1pbiAlIgorICAgICAgICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiIG1heCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAobWluKSwgR1NUX1RJTUVfQVJHUyAobWF4KSk7CisKKyAgICAgICAgICAgIC8qIGFkZCBvdXIgb3duIGxhdGVuY3kgKi8KKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNjYWxldGVtcG8sICJPdXIgbGF0ZW5jeTogJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHNjYWxldGVtcG8tPmxhdGVuY3kpKTsKKyAgICAgICAgICAgIG1pbiArPSBzY2FsZXRlbXBvLT5sYXRlbmN5OworICAgICAgICAgICAgaWYgKG1heCAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgICAgICAgICAgICBtYXggKz0gc2NhbGV0ZW1wby0+bGF0ZW5jeTsKKworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2NhbGV0ZW1wbywgIkNhbGN1bGF0ZWQgdG90YWwgbGF0ZW5jeSA6IG1pbiAlIgorICAgICAgICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiIG1heCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAobWluKSwgR1NUX1RJTUVfQVJHUyAobWF4KSk7CisgICAgICAgICAgICBnc3RfcXVlcnlfc2V0X2xhdGVuY3kgKHF1ZXJ5LCBsaXZlLCBtaW4sIG1heCk7CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHBlZXIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgICBkZWZhdWx0OnsKKyAgICAgICAgcmV0dXJuIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAocGFyZW50X2NsYXNzKS0+cXVlcnkgKHRyYW5zLCBkaXJlY3Rpb24sCisgICAgICAgICAgICBxdWVyeSk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKHBhcmVudF9jbGFzcyktPnF1ZXJ5ICh0cmFucywgZGlyZWN0aW9uLAorICAgICAgICBxdWVyeSk7CisgIH0KK30KKworLyogR09iamVjdCB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworc3RhdGljIHZvaWQKK2dzdF9zY2FsZXRlbXBvX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTY2FsZXRlbXBvICpzY2FsZXRlbXBvID0gR1NUX1NDQUxFVEVNUE8gKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1JBVEU6CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCBzY2FsZXRlbXBvLT5zY2FsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1RSSURFOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNjYWxldGVtcG8tPm1zX3N0cmlkZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfT1ZFUkxBUDoKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIHNjYWxldGVtcG8tPnBlcmNlbnRfb3ZlcmxhcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0VBUkNIOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNjYWxldGVtcG8tPm1zX3NlYXJjaCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc2NhbGV0ZW1wb19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0U2NhbGV0ZW1wbyAqc2NhbGV0ZW1wbyA9IEdTVF9TQ0FMRVRFTVBPIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TVFJJREU6eworICAgICAgZ3VpbnQgbmV3X3ZhbHVlID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgaWYgKHNjYWxldGVtcG8tPm1zX3N0cmlkZSAhPSBuZXdfdmFsdWUpIHsKKyAgICAgICAgc2NhbGV0ZW1wby0+bXNfc3RyaWRlID0gbmV3X3ZhbHVlOworICAgICAgICBzY2FsZXRlbXBvLT5yZWluaXRfYnVmZmVycyA9IFRSVUU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX09WRVJMQVA6eworICAgICAgZ2RvdWJsZSBuZXdfdmFsdWUgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIGlmIChzY2FsZXRlbXBvLT5wZXJjZW50X292ZXJsYXAgIT0gbmV3X3ZhbHVlKSB7CisgICAgICAgIHNjYWxldGVtcG8tPnBlcmNlbnRfb3ZlcmxhcCA9IG5ld192YWx1ZTsKKyAgICAgICAgc2NhbGV0ZW1wby0+cmVpbml0X2J1ZmZlcnMgPSBUUlVFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9TRUFSQ0g6eworICAgICAgZ3VpbnQgbmV3X3ZhbHVlID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgaWYgKHNjYWxldGVtcG8tPm1zX3NlYXJjaCAhPSBuZXdfdmFsdWUpIHsKKyAgICAgICAgc2NhbGV0ZW1wby0+bXNfc2VhcmNoID0gbmV3X3ZhbHVlOworICAgICAgICBzY2FsZXRlbXBvLT5yZWluaXRfYnVmZmVycyA9IFRSVUU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3NjYWxldGVtcG9fY2xhc3NfaW5pdCAoR3N0U2NhbGV0ZW1wb0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqYmFzZXRyYW5zZm9ybV9jbGFzcyA9IEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2NhbGV0ZW1wb19nZXRfcHJvcGVydHkpOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NjYWxldGVtcG9fc2V0X3Byb3BlcnR5KTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JBVEUsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgicmF0ZSIsICJQbGF5YmFjayBSYXRlIiwgIkN1cnJlbnQgcGxheWJhY2sgcmF0ZSIsCisgICAgICAgICAgR19NSU5JTlQsIEdfTUFYSU5ULCAxLjAsIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TVFJJREUsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInN0cmlkZSIsICJTdHJpZGUgTGVuZ3RoIiwKKyAgICAgICAgICAiTGVuZ3RoIGluIG1pbGxpc2Vjb25kcyB0byBvdXRwdXQgZWFjaCBzdHJpZGUiLCAxLCA1MDAwLCAzMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX09WRVJMQVAsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgib3ZlcmxhcCIsICJPdmVybGFwIExlbmd0aCIsCisgICAgICAgICAgIlBlcmNlbnRhZ2Ugb2Ygc3RyaWRlIHRvIG92ZXJsYXAiLCAwLCAxLCAuMiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NFQVJDSCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgic2VhcmNoIiwgIlNlYXJjaCBMZW5ndGgiLAorICAgICAgICAgICJMZW5ndGggaW4gbWlsbGlzZWNvbmRzIHRvIHNlYXJjaCBmb3IgYmVzdCBvdmVybGFwIHBvc2l0aW9uIiwgMCwgNTAwLAorICAgICAgICAgIDE0LCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJTY2FsZXRlbXBvIiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1JhdGUiLAorICAgICAgIlN5bmMgYXVkaW8gdGVtcG8gd2l0aCBwbGF5YmFjayByYXRlIiwKKyAgICAgICJSb3YgSnV2YW5vIDxyb3ZqdXZhbm9AdXNlcnMuc291cmNlZm9yZ2UubmV0PiIpOworCisgIGJhc2V0cmFuc2Zvcm1fY2xhc3MtPnNpbmtfZXZlbnQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zY2FsZXRlbXBvX3NpbmtfZXZlbnQpOworICBiYXNldHJhbnNmb3JtX2NsYXNzLT5zZXRfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2NhbGV0ZW1wb19zZXRfY2Fwcyk7CisgIGJhc2V0cmFuc2Zvcm1fY2xhc3MtPnRyYW5zZm9ybV9zaXplID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2NhbGV0ZW1wb190cmFuc2Zvcm1fc2l6ZSk7CisgIGJhc2V0cmFuc2Zvcm1fY2xhc3MtPnRyYW5zZm9ybSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2NhbGV0ZW1wb190cmFuc2Zvcm0pOworICBiYXNldHJhbnNmb3JtX2NsYXNzLT5xdWVyeSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2NhbGV0ZW1wb19xdWVyeSk7CisgIGJhc2V0cmFuc2Zvcm1fY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zY2FsZXRlbXBvX3N0YXJ0KTsKKyAgYmFzZXRyYW5zZm9ybV9jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2NhbGV0ZW1wb19zdG9wKTsKKyAgYmFzZXRyYW5zZm9ybV9jbGFzcy0+c3VibWl0X2lucHV0X2J1ZmZlciA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NjYWxldGVtcG9fc3VibWl0X2lucHV0X2J1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc2NhbGV0ZW1wb19pbml0IChHc3RTY2FsZXRlbXBvICogc2NhbGV0ZW1wbykKK3sKKyAgLyogZGVmYXVsdHMgKi8KKyAgc2NhbGV0ZW1wby0+bXNfc3RyaWRlID0gMzA7CisgIHNjYWxldGVtcG8tPnBlcmNlbnRfb3ZlcmxhcCA9IC4yOworICBzY2FsZXRlbXBvLT5tc19zZWFyY2ggPSAxNDsKKworICAvKiB1bmluaXRpYWxpemVkICovCisgIHNjYWxldGVtcG8tPnNjYWxlID0gMDsKKyAgc2NhbGV0ZW1wby0+c2FtcGxlX3JhdGUgPSAwOworICBzY2FsZXRlbXBvLT5mcmFtZXNfc3RyaWRlX2Vycm9yID0gMDsKKyAgc2NhbGV0ZW1wby0+Ynl0ZXNfc3RyaWRlID0gMDsKKyAgc2NhbGV0ZW1wby0+Ynl0ZXNfcXVldWVkID0gMDsKKyAgc2NhbGV0ZW1wby0+Ynl0ZXNfdG9fc2xpZGUgPSAwOworICBnc3Rfc2VnbWVudF9pbml0ICgmc2NhbGV0ZW1wby0+aW5fc2VnbWVudCwgR1NUX0ZPUk1BVF9VTkRFRklORUQpOworICBnc3Rfc2VnbWVudF9pbml0ICgmc2NhbGV0ZW1wby0+b3V0X3NlZ21lbnQsIEdTVF9GT1JNQVRfVU5ERUZJTkVEKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uaCBiL2dzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTE4ODFkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBSb3YgSnV2YW5vIDxyb3ZqdXZhbm9AdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfU0NBTEVURU1QT19IX18KKyNkZWZpbmUgX19HU1RfU0NBTEVURU1QT19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9TQ0FMRVRFTVBPICAgICAgICAgICAgKGdzdF9zY2FsZXRlbXBvX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9TQ0FMRVRFTVBPKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksIEdTVF9UWVBFX1NDQUxFVEVNUE8sIEdzdFNjYWxldGVtcG8pKQorI2RlZmluZSBHU1RfU0NBTEVURU1QT19DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksICBHU1RfVFlQRV9TQ0FMRVRFTVBPLCBHc3RTY2FsZXRlbXBvQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfU0NBTEVURU1QTyhvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLCBHU1RfVFlQRV9TQ0FMRVRFTVBPKSkKKyNkZWZpbmUgR1NUX0lTX1NDQUxFVEVNUE9fQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLCAgR1NUX1RZUEVfU0NBTEVURU1QTykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RTY2FsZXRlbXBvIEdzdFNjYWxldGVtcG87Cit0eXBlZGVmIHN0cnVjdCBfR3N0U2NhbGV0ZW1wb0NsYXNzIEdzdFNjYWxldGVtcG9DbGFzczsKK3R5cGVkZWYgc3RydWN0IF9Hc3RTY2FsZXRlbXBvUHJpdmF0ZSBHc3RTY2FsZXRlbXBvUHJpdmF0ZTsKKworc3RydWN0IF9Hc3RTY2FsZXRlbXBvCit7CisgIEdzdEJhc2VUcmFuc2Zvcm0gZWxlbWVudDsKKworICBnZG91YmxlIHNjYWxlOworICBnYm9vbGVhbiByZXZlcnNlOworCisgIC8qIHBhcmFtZXRlcnMgKi8KKyAgZ3VpbnQgbXNfc3RyaWRlOworICBnZG91YmxlIHBlcmNlbnRfb3ZlcmxhcDsKKyAgZ3VpbnQgbXNfc2VhcmNoOworCisgIC8qIGNhcHMgKi8KKyAgR3N0QXVkaW9Gb3JtYXQgZm9ybWF0OworICBndWludCBzYW1wbGVzX3Blcl9mcmFtZTsgICAgICAvKiBBS0EgbnVtYmVyIG9mIGNoYW5uZWxzICovCisgIGd1aW50IGJ5dGVzX3Blcl9zYW1wbGU7CisgIGd1aW50IGJ5dGVzX3Blcl9mcmFtZTsKKyAgZ3VpbnQgc2FtcGxlX3JhdGU7CisKKyAgLyogc3RyaWRlICovCisgIGdkb3VibGUgZnJhbWVzX3N0cmlkZV9zY2FsZWQ7CisgIGdkb3VibGUgZnJhbWVzX3N0cmlkZV9lcnJvcjsKKyAgZ3VpbnQgYnl0ZXNfc3RyaWRlOworICBnZG91YmxlIGJ5dGVzX3N0cmlkZV9zY2FsZWQ7CisgIGd1aW50IGJ5dGVzX3F1ZXVlX21heDsKKyAgZ3VpbnQgYnl0ZXNfcXVldWVkOworICBndWludCBieXRlc190b19zbGlkZTsKKyAgZ2ludDggKmJ1Zl9xdWV1ZTsKKworICAvKiBvdmVybGFwICovCisgIGd1aW50IHNhbXBsZXNfb3ZlcmxhcDsKKyAgZ3VpbnQgc2FtcGxlc19zdGFuZGluZzsKKyAgZ3VpbnQgYnl0ZXNfb3ZlcmxhcDsKKyAgZ3VpbnQgYnl0ZXNfc3RhbmRpbmc7CisgIGdwb2ludGVyIGJ1Zl9vdmVybGFwOworICBncG9pbnRlciB0YWJsZV9ibGVuZDsKKyAgdm9pZCAoKm91dHB1dF9vdmVybGFwKSAoR3N0U2NhbGV0ZW1wbyAqIHNjYWxldGVtcG8sIGdwb2ludGVyIG91dF9idWYsIGd1aW50IGJ5dGVzX29mZik7CisKKyAgLyogYmVzdCBvdmVybGFwICovCisgIGd1aW50IGZyYW1lc19zZWFyY2g7CisgIGdwb2ludGVyIGJ1Zl9wcmVfY29ycjsKKyAgZ3BvaW50ZXIgdGFibGVfd2luZG93OworICBndWludCAoKmJlc3Rfb3ZlcmxhcF9vZmZzZXQpIChHc3RTY2FsZXRlbXBvICogc2NhbGV0ZW1wbyk7CisKKyAgLyogZ3N0cmVhbWVyICovCisgIEdzdFNlZ21lbnQgaW5fc2VnbWVudCwgb3V0X3NlZ21lbnQ7CisgIEdzdENsb2NrVGltZSBsYXRlbmN5OworCisgIC8qIHRocmVhZHMgKi8KKyAgZ2Jvb2xlYW4gcmVpbml0X2J1ZmZlcnM7Cit9OworCitzdHJ1Y3QgX0dzdFNjYWxldGVtcG9DbGFzcworeworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3NjYWxldGVtcG9fZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1NDQUxFVEVNUE9fSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9nc3RzY2FsZXRlbXBvcGx1Z2luLmMgYi9nc3QvYXVkaW9meC9nc3RzY2FsZXRlbXBvcGx1Z2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM2ZjFmMQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG9wbHVnaW4uYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUm92IEp1dmFubyA8cm92anV2YW5vQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSAodGhlICJMR1BMIiksIGluCisgKiB3aGljaCBjYXNlIHRoZSBmb2xsb3dpbmcgcHJvdmlzaW9ucyBhcHBseSBpbnN0ZWFkIG9mIHRoZSBvbmVzCisgKiBtZW50aW9uZWQgYWJvdmU6CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSAiZ3N0c2NhbGV0ZW1wby5oIgorCisvKiBlbnRyeSBwb2ludCB0byBpbml0aWFsaXplIHRoZSBwbHVnLWluCisgKiBpbml0aWFsaXplIHRoZSBwbHVnLWluIGl0c2VsZgorICogcmVnaXN0ZXIgdGhlIGVsZW1lbnQgZmFjdG9yaWVzIGFuZCBwYWQgdGVtcGxhdGVzCisgKiByZWdpc3RlciB0aGUgZmVhdHVyZXMKKyAqCisgKiBleGNoYW5nZSB0aGUgc3RyaW5nICdwbHVnaW4nIHdpdGggeW91ciBlbGVtbnQgbmFtZQorICovCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJzY2FsZXRlbXBvIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgIEdTVF9UWVBFX1NDQUxFVEVNUE8pOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHNjYWxldGVtcG8sICJTY2FsZSBhdWRpbyB0ZW1wbyBpbiBzeW5jIHdpdGggcGxheWJhY2sgcmF0ZSIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sIEdTVF9MSUNFTlNFLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9tYXRoX2NvbXBhdC5oIGIvZ3N0L2F1ZGlvZngvbWF0aF9jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTIzNzBjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvbWF0aF9jb21wYXQuaApAQCAtMCwwICsxLDU1IEBACisvKiAKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA4IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fTUFUSF9DT01QQVRfSF9fCisjZGVmaW5lIF9fTUFUSF9DT01QQVRfSF9fCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpZm5kZWYgSEFWRV9BU0lOSAorc3RhdGljIGlubGluZSBnZG91YmxlCithc2luaCAoZ2RvdWJsZSB4KQoreworICByZXR1cm4gbG9nKHggKyBzcXJ0ICh4ICogeCArIDEpKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU0lOSAorc3RhdGljIGlubGluZSBnZG91YmxlCitzaW5oIChnZG91YmxlIHgpCit7CisgIHJldHVybiAwLjUgKiAoZXhwICh4KSAtIGV4cCAoLXgpKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfQ09TSAorc3RhdGljIGlubGluZSBnZG91YmxlCitjb3NoIChnZG91YmxlIHgpCit7CisgIHJldHVybiAwLjUgKiAoZXhwICh4KSArIGV4cCAoLXgpKTsKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19NQVRIX0NPTVBBVF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb2Z4L21lc29uLmJ1aWxkIGIvZ3N0L2F1ZGlvZngvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM1NTA0NAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsNDYgQEAKK2F1ZGlvZnhfc291cmNlcyA9IFsKKyAgJ2F1ZGlvZnguYycsCisgICdhdWRpb3Bhbm9yYW1hLmMnLAorICAnYXVkaW9pbnZlcnQuYycsCisgICdhdWRpb2FtcGxpZnkuYycsCisgICdhdWRpb2R5bmFtaWMuYycsCisgICdhdWRpb2thcmFva2UuYycsCisgICdhdWRpb2Z4YmFzZWlpcmZpbHRlci5jJywKKyAgJ2F1ZGlvY2hlYmxpbWl0LmMnLAorICAnYXVkaW9jaGViYmFuZC5jJywKKyAgJ2F1ZGlvaWlyZmlsdGVyLmMnLAorICAnYXVkaW9meGJhc2VmaXJmaWx0ZXIuYycsCisgICdhdWRpb3dzaW5jYmFuZC5jJywKKyAgJ2F1ZGlvd3NpbmNsaW1pdC5jJywKKyAgJ2F1ZGlvZmlyZmlsdGVyLmMnLAorICAnYXVkaW9lY2hvLmMnLAorICAnZ3N0c2NhbGV0ZW1wby5jJworXQorCitvcmNzcmMgPSAnYXVkaW9wYW5vcmFtYW9yYycKK2lmIGhhdmVfb3JjYworICBvcmNfaCA9IGN1c3RvbV90YXJnZXQob3Jjc3JjICsgJy5oJywKKyAgICBpbnB1dCA6IG9yY3NyYyArICcub3JjJywKKyAgICBvdXRwdXQgOiBvcmNzcmMgKyAnLmgnLAorICAgIGNvbW1hbmQgOiBvcmNjX2FyZ3MgKyBbJy0taGVhZGVyJywgJy1vJywgJ0BPVVRQVVRAJywgJ0BJTlBVVEAnXSkKKyAgb3JjX2MgPSBjdXN0b21fdGFyZ2V0KG9yY3NyYyArICcuYycsCisgICAgaW5wdXQgOiBvcmNzcmMgKyAnLm9yYycsCisgICAgb3V0cHV0IDogb3Jjc3JjICsgJy5jJywKKyAgICBjb21tYW5kIDogb3JjY19hcmdzICsgWyctLWltcGxlbWVudGF0aW9uJywgJy1vJywgJ0BPVVRQVVRAJywgJ0BJTlBVVEAnXSkKK2Vsc2UKKyAgb3JjX2ggPSBjb25maWd1cmVfZmlsZShpbnB1dCA6IG9yY3NyYyArICctZGlzdC5oJywKKyAgICBvdXRwdXQgOiBvcmNzcmMgKyAnLmgnLAorICAgIGNvbmZpZ3VyYXRpb24gOiBjb25maWd1cmF0aW9uX2RhdGEoKSkKKyAgb3JjX2MgPSBjb25maWd1cmVfZmlsZShpbnB1dCA6IG9yY3NyYyArICctZGlzdC5jJywKKyAgICBvdXRwdXQgOiBvcmNzcmMgKyAnLmMnLAorICAgIGNvbmZpZ3VyYXRpb24gOiBjb25maWd1cmF0aW9uX2RhdGEoKSkKK2VuZGlmCisKK2dzdGF1ZGlvZnggPSBsaWJyYXJ5KCdnc3RhdWRpb2Z4JywKKyAgYXVkaW9meF9zb3VyY2VzLCBvcmNfYywgb3JjX2gsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbb3JjX2RlcCwgZ3N0YXVkaW9fZGVwLCBnc3RmZnRfZGVwLCBsaWJtXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKZGlmZiAtLWdpdCBhL2dzdC9hdWRpb3BhcnNlcnMvTWFrZWZpbGUuYW0gYi9nc3QvYXVkaW9wYXJzZXJzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Mjc2ODgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9wYXJzZXJzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTkgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdGF1ZGlvcGFyc2Vycy5sYQorCitsaWJnc3RhdWRpb3BhcnNlcnNfbGFfU09VUkNFUyA9IFwKKwlnc3RhYWNwYXJzZS5jIGdzdGFtcnBhcnNlLmMgZ3N0YWMzcGFyc2UuYyBcCisJZ3N0ZGNhcGFyc2UuYyBnc3RmbGFjcGFyc2UuYyBnc3RtcGVnYXVkaW9wYXJzZS5jIFwKKwlnc3RzYmNwYXJzZS5jIGdzdHdhdnBhY2twYXJzZS5jIHBsdWdpbi5jCisKK2xpYmdzdGF1ZGlvcGFyc2Vyc19sYV9DRkxBR1MgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdGF1ZGlvcGFyc2Vyc19sYV9MSUJBREQgPSBcCisJLWxnc3RwYnV0aWxzLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0dGFnLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJLWxnc3RhdWRpby0kKEdTVF9BUElfVkVSU0lPTikgXAorCSQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykKK2xpYmdzdGF1ZGlvcGFyc2Vyc19sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gZ3N0YWFjcGFyc2UuaCBnc3RhbXJwYXJzZS5oIGdzdGFjM3BhcnNlLmggXAorCWdzdGRjYXBhcnNlLmggZ3N0ZmxhY3BhcnNlLmggZ3N0bXBlZ2F1ZGlvcGFyc2UuaCBnc3RzYmNwYXJzZS5oIFwKKwlnc3R3YXZwYWNrcGFyc2UuaApkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjN2M3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmMKQEAgLTAsMCArMSwxNjcxIEBACisvKiBHU3RyZWFtZXIgQUFDIHBhcnNlciBwbHVnaW4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0OiBTdGVmYW4gS29zdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWFhY3BhcnNlCisgKiBAc2hvcnRfZGVzY3JpcHRpb246IEFBQyBwYXJzZXIKKyAqIEBzZWVfYWxzbzogI0dzdEFtclBhcnNlCisgKgorICogVGhpcyBpcyBhbiBBQUMgcGFyc2VyIHdoaWNoIGhhbmRsZXMgYm90aCBBRElGIGFuZCBBRFRTIHN0cmVhbSBmb3JtYXRzLgorICoKKyAqIEFzIEFESUYgZm9ybWF0IGlzIG5vdCBmcmFtZWQsIGl0IGlzIG5vdCBzZWVrYWJsZSBhbmQgc3RyZWFtIGR1cmF0aW9uIGNhbm5vdAorICogYmUgZGV0ZXJtaW5lZCBlaXRoZXIuIEhvd2V2ZXIsIEFEVFMgZm9ybWF0IEFBQyBjbGlwcyBjYW4gYmUgc2Vla2VkLCBhbmQgcGFyc2VyCisgKiBjYW4gYWxzbyBlc3RpbWF0ZSBwbGF5YmFjayBwb3NpdGlvbiBhbmQgY2xpcCBkdXJhdGlvbi4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj1hYmMuYWFjICEgYWFjcGFyc2UgISBmYWFkICEgYXVkaW9yZXNhbXBsZSAhIGF1ZGlvY29udmVydCAhIGFsc2FzaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJpdHJlYWRlci5oPgorI2luY2x1ZGUgPGdzdC9wYnV0aWxzL3BidXRpbHMuaD4KKyNpbmNsdWRlICJnc3RhYWNwYXJzZS5oIgorCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8vbXBlZywgIgorICAgICAgICAiZnJhbWVkID0gKGJvb2xlYW4pIHRydWUsICIgIm1wZWd2ZXJzaW9uID0gKGludCkgeyAyLCA0IH0sICIKKyAgICAgICAgInN0cmVhbS1mb3JtYXQgPSAoc3RyaW5nKSB7IHJhdywgYWR0cywgYWRpZiwgbG9hcyB9OyIpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby9tcGVnLCBtcGVndmVyc2lvbiA9IChpbnQpIHsgMiwgNCB9OyIpKTsKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoYWFjcGFyc2VfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgYWFjcGFyc2VfZGVidWcKKworCisjZGVmaW5lIEFESUZfTUFYX1NJWkUgNDAgICAgICAgIC8qIFNob3VsZCBiZSBlbm91Z2ggKi8KKyNkZWZpbmUgQURUU19NQVhfU0laRSAxMCAgICAgICAgLyogU2hvdWxkIGJlIGVub3VnaCAqLworI2RlZmluZSBMT0FTX01BWF9TSVpFIDMgICAgICAgICAvKiBTaG91bGQgYmUgZW5vdWdoICovCisjZGVmaW5lIFJBV19NQVhfU0laRSAgMSAgICAgICAgIC8qIENvcnJlY3QgZnJhbWluZyBpcyByZXF1aXJlZCAqLworCisjZGVmaW5lIEFEVFNfSEVBREVSU19MRU5HVEggN1VMIC8qIFRvdGFsIGJ5dGUtbGVuZ3RoIG9mIGZpeGVkIGFuZCB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzIHByZXBlbmRlZCBkdXJpbmcgcmF3IHRvIEFEVFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiAqLworCisjZGVmaW5lIEFBQ19GUkFNRV9EVVJBVElPTihwYXJzZSkgKEdTVF9TRUNPTkQvcGFyc2UtPmZyYW1lc19wZXJfc2VjKQorCitzdGF0aWMgY29uc3QgZ2ludCBsb2FzX3NhbXBsZV9yYXRlX3RhYmxlWzE2XSA9IHsKKyAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwgMjQwMDAsIDIyMDUwLAorICAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwLCA3MzUwLCAwLCAwLCAwCit9OworCitzdGF0aWMgY29uc3QgZ2ludCBsb2FzX2NoYW5uZWxzX3RhYmxlWzE2XSA9IHsKKyAgMCwgMSwgMiwgMywgNCwgNSwgNiwgOCwKKyAgMCwgMCwgMCwgNywgOCwgMCwgOCwgMAorfTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hYWNfcGFyc2Vfc3RhcnQgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYWFjX3BhcnNlX3N0b3AgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hYWNfcGFyc2Vfc2lua19zZXRjYXBzIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X2FhY19wYXJzZV9zaW5rX2dldGNhcHMgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfYWFjX3BhcnNlX2hhbmRsZV9mcmFtZSAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSwgZ2ludCAqIHNraXBzaXplKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9hYWNfcGFyc2VfcHJlX3B1c2hfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUpOworc3RhdGljIGdib29sZWFuIGdzdF9hYWNfcGFyc2Vfc3JjX2V2ZW50IChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hYWNfcGFyc2VfcmVhZF9hdWRpb19zcGVjaWZpY19jb25maWcgKEdzdEFhY1BhcnNlICoKKyAgICBhYWNwYXJzZSwgR3N0Qml0UmVhZGVyICogYnIsIGdpbnQgKiBvYmplY3RfdHlwZSwgZ2ludCAqIHNhbXBsZV9yYXRlLAorICAgIGdpbnQgKiBjaGFubmVscywgZ2ludCAqIGZyYW1lX3NhbXBsZXMpOworCisKKyNkZWZpbmUgZ3N0X2FhY19wYXJzZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RBYWNQYXJzZSwgZ3N0X2FhY19wYXJzZSwgR1NUX1RZUEVfQkFTRV9QQVJTRSk7CisKKy8qKgorICogZ3N0X2FhY19wYXJzZV9jbGFzc19pbml0OgorICogQGtsYXNzOiAjR3N0QWFjUGFyc2VDbGFzcy4KKyAqCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfYWFjX3BhcnNlX2NsYXNzX2luaXQgKEdzdEFhY1BhcnNlQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0QmFzZVBhcnNlQ2xhc3MgKnBhcnNlX2NsYXNzID0gR1NUX0JBU0VfUEFSU0VfQ0xBU1MgKGtsYXNzKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoYWFjcGFyc2VfZGVidWcsICJhYWNwYXJzZSIsIDAsCisgICAgICAiQUFDIGF1ZGlvIHN0cmVhbSBwYXJzZXIiKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywKKyAgICAgICJBQUMgYXVkaW8gc3RyZWFtIHBhcnNlciIsICJDb2RlYy9QYXJzZXIvQXVkaW8iLAorICAgICAgIkFkdmFuY2VkIEF1ZGlvIENvZGluZyBwYXJzZXIiLCAiU3RlZmFuIEtvc3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4iKTsKKworICBwYXJzZV9jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FhY19wYXJzZV9zdGFydCk7CisgIHBhcnNlX2NsYXNzLT5zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hYWNfcGFyc2Vfc3RvcCk7CisgIHBhcnNlX2NsYXNzLT5zZXRfc2lua19jYXBzID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hYWNfcGFyc2Vfc2lua19zZXRjYXBzKTsKKyAgcGFyc2VfY2xhc3MtPmdldF9zaW5rX2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FhY19wYXJzZV9zaW5rX2dldGNhcHMpOworICBwYXJzZV9jbGFzcy0+aGFuZGxlX2ZyYW1lID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hYWNfcGFyc2VfaGFuZGxlX2ZyYW1lKTsKKyAgcGFyc2VfY2xhc3MtPnByZV9wdXNoX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWFjX3BhcnNlX3ByZV9wdXNoX2ZyYW1lKTsKKyAgcGFyc2VfY2xhc3MtPnNyY19ldmVudCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWFjX3BhcnNlX3NyY19ldmVudCk7Cit9CisKKworLyoqCisgKiBnc3RfYWFjX3BhcnNlX2luaXQ6CisgKiBAYWFjcGFyc2U6ICNHc3RBYWNQYXJzZS4KKyAqIEBrbGFzczogI0dzdEFhY1BhcnNlQ2xhc3MuCisgKgorICovCitzdGF0aWMgdm9pZAorZ3N0X2FhY19wYXJzZV9pbml0IChHc3RBYWNQYXJzZSAqIGFhY3BhcnNlKQoreworICBHU1RfREVCVUcgKCJpbml0aWFsaXplZCIpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfSU5URVJTRUNUIChHU1RfQkFTRV9QQVJTRV9TSU5LX1BBRCAoYWFjcGFyc2UpKTsKKyAgR1NUX1BBRF9TRVRfQUNDRVBUX1RFTVBMQVRFIChHU1RfQkFTRV9QQVJTRV9TSU5LX1BBRCAoYWFjcGFyc2UpKTsKKworICBhYWNwYXJzZS0+bGFzdF9wYXJzZWRfc2FtcGxlX3JhdGUgPSAwOworICBhYWNwYXJzZS0+bGFzdF9wYXJzZWRfY2hhbm5lbHMgPSAwOworfQorCisKKy8qKgorICogZ3N0X2FhY19wYXJzZV9zZXRfc3JjX2NhcHM6CisgKiBAYWFjcGFyc2U6ICNHc3RBYWNQYXJzZS4KKyAqIEBzaW5rX2NhcHM6IChwcm9wb3NlZCkgY2FwcyBvZiBzaW5rIHBhZAorICoKKyAqIFNldCBzb3VyY2UgcGFkIGNhcHMgYWNjb3JkaW5nIHRvIGN1cnJlbnQga25vd2xlZGdlIGFib3V0IHRoZQorICogYXVkaW8gc3RyZWFtLgorICoKKyAqIFJldHVybnM6IFRSVUUgaWYgY2FwcyB3ZXJlIHN1Y2Nlc3NmdWxseSBzZXQuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FhY19wYXJzZV9zZXRfc3JjX2NhcHMgKEdzdEFhY1BhcnNlICogYWFjcGFyc2UsIEdzdENhcHMgKiBzaW5rX2NhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgR3N0Q2FwcyAqc3JjX2NhcHMgPSBOVUxMLCAqYWxsb3dlZDsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisgIGNvbnN0IGdjaGFyICpzdHJlYW1fZm9ybWF0OworICBndWludDggY29kZWNfZGF0YVsyXTsKKyAgZ3VpbnQxNiBjb2RlY19kYXRhX2RhdGE7CisgIGdpbnQgc2FtcGxlX3JhdGVfaWR4OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGFhY3BhcnNlLCAic2luayBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgc2lua19jYXBzKTsKKyAgaWYgKHNpbmtfY2FwcykKKyAgICBzcmNfY2FwcyA9IGdzdF9jYXBzX2NvcHkgKHNpbmtfY2Fwcyk7CisgIGVsc2UKKyAgICBzcmNfY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby9tcGVnIik7CisKKyAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoc3JjX2NhcHMsICJmcmFtZWQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwKKyAgICAgICJtcGVndmVyc2lvbiIsIEdfVFlQRV9JTlQsIGFhY3BhcnNlLT5tcGVndmVyc2lvbiwgTlVMTCk7CisKKyAgYWFjcGFyc2UtPm91dHB1dF9oZWFkZXJfdHlwZSA9IGFhY3BhcnNlLT5oZWFkZXJfdHlwZTsKKyAgc3dpdGNoIChhYWNwYXJzZS0+aGVhZGVyX3R5cGUpIHsKKyAgICBjYXNlIERTUEFBQ19IRUFERVJfTk9ORToKKyAgICAgIHN0cmVhbV9mb3JtYXQgPSAicmF3IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFNQQUFDX0hFQURFUl9BRFRTOgorICAgICAgc3RyZWFtX2Zvcm1hdCA9ICJhZHRzIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFNQQUFDX0hFQURFUl9BRElGOgorICAgICAgc3RyZWFtX2Zvcm1hdCA9ICJhZGlmIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFNQQUFDX0hFQURFUl9MT0FTOgorICAgICAgc3RyZWFtX2Zvcm1hdCA9ICJsb2FzIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzdHJlYW1fZm9ybWF0ID0gTlVMTDsKKyAgfQorCisgIC8qIEdlbmVyYXRlIGNvZGVjIGRhdGEgdG8gYmUgYWJsZSB0byBzZXQgcHJvZmlsZS9sZXZlbCBvbiB0aGUgY2FwcyAqLworICBzYW1wbGVfcmF0ZV9pZHggPQorICAgICAgZ3N0X2NvZGVjX3V0aWxzX2FhY19nZXRfaW5kZXhfZnJvbV9zYW1wbGVfcmF0ZSAoYWFjcGFyc2UtPnNhbXBsZV9yYXRlKTsKKyAgaWYgKHNhbXBsZV9yYXRlX2lkeCA8IDApCisgICAgZ290byBub3RfYV9rbm93bl9yYXRlOworICBjb2RlY19kYXRhX2RhdGEgPQorICAgICAgKGFhY3BhcnNlLT5vYmplY3RfdHlwZSA8PCAxMSkgfAorICAgICAgKHNhbXBsZV9yYXRlX2lkeCA8PCA3KSB8IChhYWNwYXJzZS0+Y2hhbm5lbHMgPDwgMyk7CisgIEdTVF9XUklURV9VSU5UMTZfQkUgKGNvZGVjX2RhdGEsIGNvZGVjX2RhdGFfZGF0YSk7CisgIGdzdF9jb2RlY191dGlsc19hYWNfY2Fwc19zZXRfbGV2ZWxfYW5kX3Byb2ZpbGUgKHNyY19jYXBzLCBjb2RlY19kYXRhLCAyKTsKKworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoc3JjX2NhcHMsIDApOworICBpZiAoYWFjcGFyc2UtPnNhbXBsZV9yYXRlID4gMCkKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgInJhdGUiLCBHX1RZUEVfSU5ULCBhYWNwYXJzZS0+c2FtcGxlX3JhdGUsIE5VTEwpOworICBpZiAoYWFjcGFyc2UtPmNoYW5uZWxzID4gMCkKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgYWFjcGFyc2UtPmNoYW5uZWxzLCBOVUxMKTsKKyAgaWYgKHN0cmVhbV9mb3JtYXQpCisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJzdHJlYW0tZm9ybWF0IiwgR19UWVBFX1NUUklORywgc3RyZWFtX2Zvcm1hdCwgTlVMTCk7CisKKyAgYWxsb3dlZCA9IGdzdF9wYWRfZ2V0X2FsbG93ZWRfY2FwcyAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKS0+c3JjcGFkKTsKKyAgaWYgKGFsbG93ZWQgJiYgIWdzdF9jYXBzX2Nhbl9pbnRlcnNlY3QgKHNyY19jYXBzLCBhbGxvd2VkKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKEdTVF9CQVNFX1BBUlNFIChhYWNwYXJzZSktPnNyY3BhZCwKKyAgICAgICAgIkNhcHMgY2FuIG5vdCBpbnRlcnNlY3QiKTsKKyAgICBpZiAoYWFjcGFyc2UtPmhlYWRlcl90eXBlID09IERTUEFBQ19IRUFERVJfQURUUykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKS0+c3JjcGFkLAorICAgICAgICAgICJJbnB1dCBpcyBBRFRTLCB0cnlpbmcgcmF3Iik7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChzcmNfY2FwcywgInN0cmVhbS1mb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAicmF3IiwKKyAgICAgICAgICBOVUxMKTsKKyAgICAgIGlmIChnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChzcmNfY2FwcywgYWxsb3dlZCkpIHsKKyAgICAgICAgR3N0QnVmZmVyICpjb2RlY19kYXRhX2J1ZmZlcjsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChHU1RfQkFTRV9QQVJTRSAoYWFjcGFyc2UpLT5zcmNwYWQsCisgICAgICAgICAgICAiQ2FwcyBjYW4gaW50ZXJzZWN0LCB3ZSB3aWxsIGRyb3AgdGhlIEFEVFMgbGF5ZXIiKTsKKyAgICAgICAgYWFjcGFyc2UtPm91dHB1dF9oZWFkZXJfdHlwZSA9IERTUEFBQ19IRUFERVJfTk9ORTsKKworICAgICAgICAvKiBUaGUgY29kZWNfZGF0YSBkYXRhIGlzIGFjY29yZGluZyB0byBBdWRpb1NwZWNpZmljQ29uZmlnLAorICAgICAgICAgICBJU08vSUVDIDE0NDk2LTMsIDEuNi4yLjEgKi8KKyAgICAgICAgY29kZWNfZGF0YV9idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDIpOworICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKGNvZGVjX2RhdGFfYnVmZmVyLCAwLCBjb2RlY19kYXRhLCAyKTsKKyAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoc3JjX2NhcHMsICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLAorICAgICAgICAgICAgY29kZWNfZGF0YV9idWZmZXIsIE5VTEwpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoYWFjcGFyc2UtPmhlYWRlcl90eXBlID09IERTUEFBQ19IRUFERVJfTk9ORSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKS0+c3JjcGFkLAorICAgICAgICAgICJJbnB1dCBpcyByYXcsIHRyeWluZyBBRFRTIik7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChzcmNfY2FwcywgInN0cmVhbS1mb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiYWR0cyIsCisgICAgICAgICAgTlVMTCk7CisgICAgICBpZiAoZ3N0X2NhcHNfY2FuX2ludGVyc2VjdCAoc3JjX2NhcHMsIGFsbG93ZWQpKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKEdTVF9CQVNFX1BBUlNFIChhYWNwYXJzZSktPnNyY3BhZCwKKyAgICAgICAgICAgICJDYXBzIGNhbiBpbnRlcnNlY3QsIHdlIHdpbGwgcHJlcGVuZCBBRFRTIGhlYWRlcnMiKTsKKyAgICAgICAgYWFjcGFyc2UtPm91dHB1dF9oZWFkZXJfdHlwZSA9IERTUEFBQ19IRUFERVJfQURUUzsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGFsbG93ZWQpCisgICAgZ3N0X2NhcHNfdW5yZWYgKGFsbG93ZWQpOworCisgIGFhY3BhcnNlLT5sYXN0X3BhcnNlZF9jaGFubmVscyA9IDA7CisgIGFhY3BhcnNlLT5sYXN0X3BhcnNlZF9zYW1wbGVfcmF0ZSA9IDA7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYWFjcGFyc2UsICJzZXR0aW5nIHNyYyBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgc3JjX2NhcHMpOworCisgIHJlcyA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9CQVNFX1BBUlNFIChhYWNwYXJzZSktPnNyY3BhZCwgc3JjX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc3JjX2NhcHMpOworICByZXR1cm4gcmVzOworCitub3RfYV9rbm93bl9yYXRlOgorICBHU1RfRVJST1JfT0JKRUNUIChhYWNwYXJzZSwgIk5vdCBhIGtub3duIHNhbXBsZSByYXRlOiAlZCIsCisgICAgICBhYWNwYXJzZS0+c2FtcGxlX3JhdGUpOworICBnc3RfY2Fwc191bnJlZiAoc3JjX2NhcHMpOworICByZXR1cm4gRkFMU0U7Cit9CisKKworLyoqCisgKiBnc3RfYWFjX3BhcnNlX3Npbmtfc2V0Y2FwczoKKyAqIEBzaW5rcGFkOiBHc3RQYWQKKyAqIEBjYXBzOiBHc3RDYXBzCisgKgorICogSW1wbGVtZW50YXRpb24gb2YgInNldF9zaW5rX2NhcHMiIHZtZXRob2QgaW4gI0dzdEJhc2VQYXJzZSBjbGFzcy4KKyAqCisgKiBSZXR1cm5zOiBUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FhY19wYXJzZV9zaW5rX3NldGNhcHMgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0QWFjUGFyc2UgKmFhY3BhcnNlOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2NoYXIgKmNhcHNfc3RyOworICBjb25zdCBHVmFsdWUgKnZhbHVlOworCisgIGFhY3BhcnNlID0gR1NUX0FBQ19QQVJTRSAocGFyc2UpOworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgY2Fwc19zdHIgPSBnc3RfY2Fwc190b19zdHJpbmcgKGNhcHMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGFhY3BhcnNlLCAic2V0Y2FwczogJXMiLCBjYXBzX3N0cik7CisgIGdfZnJlZSAoY2Fwc19zdHIpOworCisgIC8qIFRoaXMgaXMgbmVlZGVkIGF0IGxlYXN0IGluIGNhc2Ugb2YgUlRQCisgICAqIFBhcnNlcyB0aGUgY29kZWNfZGF0YSBpbmZvcm1hdGlvbiB0byBnZXQgT2JqZWN0VHlwZSwKKyAgICogbnVtYmVyIG9mIGNoYW5uZWxzIGFuZCBzYW1wbGVyYXRlICovCisgIHZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImNvZGVjX2RhdGEiKTsKKyAgaWYgKHZhbHVlKSB7CisgICAgR3N0QnVmZmVyICpidWYgPSBnc3RfdmFsdWVfZ2V0X2J1ZmZlciAodmFsdWUpOworCisgICAgaWYgKGJ1ZiAmJiBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpID49IDIpIHsKKyAgICAgIEdzdE1hcEluZm8gbWFwOworICAgICAgR3N0Qml0UmVhZGVyIGJyOworCisgICAgICBpZiAoIWdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGdzdF9iaXRfcmVhZGVyX2luaXQgKCZiciwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICAgIGdzdF9hYWNfcGFyc2VfcmVhZF9hdWRpb19zcGVjaWZpY19jb25maWcgKGFhY3BhcnNlLCAmYnIsCisgICAgICAgICAgJmFhY3BhcnNlLT5vYmplY3RfdHlwZSwgJmFhY3BhcnNlLT5zYW1wbGVfcmF0ZSwgJmFhY3BhcnNlLT5jaGFubmVscywKKyAgICAgICAgICAmYWFjcGFyc2UtPmZyYW1lX3NhbXBsZXMpOworCisgICAgICBhYWNwYXJzZS0+aGVhZGVyX3R5cGUgPSBEU1BBQUNfSEVBREVSX05PTkU7CisgICAgICBhYWNwYXJzZS0+bXBlZ3ZlcnNpb24gPSA0OworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICAgICAgR1NUX0RFQlVHICgiY29kZWNfZGF0YTogb2JqZWN0X3R5cGU9JWQsIHNhbXBsZV9yYXRlPSVkLCBjaGFubmVscz0lZCwgIgorICAgICAgICAgICJzYW1wbGVzPSVkIiwgYWFjcGFyc2UtPm9iamVjdF90eXBlLCBhYWNwYXJzZS0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgYWFjcGFyc2UtPmNoYW5uZWxzLCBhYWNwYXJzZS0+ZnJhbWVfc2FtcGxlcyk7CisKKyAgICAgIC8qIGFycmFuZ2UgZm9yIG1ldGFkYXRhIGFuZCBnZXQgb3V0IG9mIHRoZSB3YXkgKi8KKyAgICAgIGdzdF9hYWNfcGFyc2Vfc2V0X3NyY19jYXBzIChhYWNwYXJzZSwgY2Fwcyk7CisgICAgICBpZiAoYWFjcGFyc2UtPmhlYWRlcl90eXBlID09IGFhY3BhcnNlLT5vdXRwdXRfaGVhZGVyX3R5cGUpCisgICAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9wYXNzdGhyb3VnaCAocGFyc2UsIFRSVUUpOworCisgICAgICAvKiBpbnB1dCBpcyBhbHJlYWR5IGNvcnJlY3RseSBmcmFtZWQgKi8KKyAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAocGFyc2UsIFJBV19NQVhfU0laRSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBjYXBzIGluZm8gb3ZlcnJpZGVzICovCisgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJyYXRlIiwgJmFhY3BhcnNlLT5zYW1wbGVfcmF0ZSk7CisgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsICZhYWNwYXJzZS0+Y2hhbm5lbHMpOworICB9IGVsc2UgeworICAgIGNvbnN0IGdjaGFyICpzdHJlYW1fZm9ybWF0ID0KKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJzdHJlYW0tZm9ybWF0Iik7CisKKyAgICBpZiAoZ19zdHJjbXAwIChzdHJlYW1fZm9ybWF0LCAicmF3IikgPT0gMCkgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAocGFyc2UsICJOZWVkIGNvZGVjX2RhdGEgZm9yIHJhdyBBQUMiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgYWFjcGFyc2UtPnNhbXBsZV9yYXRlID0gMDsKKyAgICAgIGFhY3BhcnNlLT5jaGFubmVscyA9IDA7CisgICAgICBhYWNwYXJzZS0+aGVhZGVyX3R5cGUgPSBEU1BBQUNfSEVBREVSX05PVF9QQVJTRUQ7CisgICAgICBnc3RfYmFzZV9wYXJzZV9zZXRfcGFzc3Rocm91Z2ggKHBhcnNlLCBGQUxTRSk7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCisKKy8qKgorICogZ3N0X2FhY19wYXJzZV9hZHRzX2dldF9mcmFtZV9sZW46CisgKiBAZGF0YTogYmxvY2sgb2YgZGF0YSBjb250YWluaW5nIGFuIEFEVFMgaGVhZGVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBBRFRTIGZyYW1lIGxlbmd0aCBmcm9tIHRoZSBnaXZlbiBoZWFkZXIuCisgKgorICogUmV0dXJuczogc2l6ZSBvZiB0aGUgQURUUyBmcmFtZS4KKyAqLworc3RhdGljIGlubGluZSBndWludAorZ3N0X2FhY19wYXJzZV9hZHRzX2dldF9mcmFtZV9sZW4gKGNvbnN0IGd1aW50OCAqIGRhdGEpCit7CisgIHJldHVybiAoKGRhdGFbM10gJiAweDAzKSA8PCAxMSkgfCAoZGF0YVs0XSA8PCAzKSB8ICgoZGF0YVs1XSAmIDB4ZTApID4+IDUpOworfQorCisKKy8qKgorICogZ3N0X2FhY19wYXJzZV9jaGVja19hZHRzX2ZyYW1lOgorICogQGFhY3BhcnNlOiAjR3N0QWFjUGFyc2UuCisgKiBAZGF0YTogRGF0YSB0byBiZSBjaGVja2VkLgorICogQGF2YWlsOiBBbW91bnQgb2YgZGF0YSBwYXNzZWQuCisgKiBAZnJhbWVzaXplOiBJZiB2YWxpZCBBRFRTIGZyYW1lIHdhcyBmb3VuZCwgdGhpcyB3aWxsIGJlIHNldCB0byB0ZWxsIHRoZQorICogICAgICAgICAgICAgZm91bmQgZnJhbWUgc2l6ZSBpbiBieXRlcy4KKyAqIEBuZWVkZWRfZGF0YTogSWYgZnJhbWUgd2FzIG5vdCBmb3VuZCwgdGhpcyBtYXkgYmUgc2V0IHRvIHRlbGwgaG93IG11Y2gKKyAqICAgICAgICAgICAgICAgbW9yZSBkYXRhIGlzIG5lZWRlZCBpbiB0aGUgbmV4dCByb3VuZCB0byBkZXRlY3QgdGhlIGZyYW1lCisgKiAgICAgICAgICAgICAgIHJlbGlhYmx5LiBUaGlzIG1heSBoYXBwZW4gd2hlbiBhIGZyYW1lIGhlYWRlciBjYW5kaWRhdGUKKyAqICAgICAgICAgICAgICAgaXMgZm91bmQgYnV0IGl0IGNhbm5vdCBiZSBndWFyYW50ZWVkIHRvIGJlIHRoZSBoZWFkZXIgd2l0aG91dAorICogICAgICAgICAgICAgICBwZWVraW5nIHRoZSBmb2xsb3dpbmcgZGF0YS4KKyAqCisgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZGF0YSBjb250YWlucyBjb250YWlucyBBRFRTIGZyYW1lLiBUaGUgYWxnb3JpdGhtCisgKiB3aWxsIGV4YW1pbmUgQURUUyBmcmFtZSBoZWFkZXIgYW5kIGNhbGN1bGF0ZSB0aGUgZnJhbWUgc2l6ZS4gQWxzbywgYW5vdGhlcgorICogY29uc2VjdXRpdmUgQURUUyBmcmFtZSBoZWFkZXIgbmVlZCB0byBiZSBwcmVzZW50IGFmdGVyIHRoZSBmb3VuZCBmcmFtZS4KKyAqIE90aGVyd2lzZSB0aGUgZGF0YSBpcyBub3QgY29uc2lkZXJlZCBhcyBhIHZhbGlkIEFEVFMgZnJhbWUuIEhvd2V2ZXIsIHRoaXMKKyAqICJleHRyYSBjaGVjayIgaXMgb21pdHRlZCB3aGVuIEVPUyBoYXMgYmVlbiByZWNlaXZlZC4gSW4gdGhpcyBjYXNlIGl0IGlzCisgKiBlbm91Z2ggd2hlbiBkYXRhWzBdIGNvbnRhaW5zIGEgdmFsaWQgQURUUyBoZWFkZXIuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgc2V0IHRoZSAjbmVlZGVkX2RhdGEgdG8gaW5kaWNhdGUgdGhhdCBhIHBvc3NpYmxlIGZyYW1lCisgKiBjYW5kaWRhdGUgaGFzIGJlZW4gZm91bmQsIGJ1dCBtb3JlIGRhdGEgKCNuZWVkZWRfZGF0YSBieXRlcykgaXMgbmVlZGVkIHRvCisgKiBiZSBhYnNvbHV0ZWx5IHN1cmUuIFdoZW4gdGhpcyBzaXR1YXRpb24gb2NjdXJzLCBGQUxTRSB3aWxsIGJlIHJldHVybmVkLgorICoKKyAqIFdoZW4gYSB2YWxpZCBmcmFtZSBpcyBkZXRlY3RlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHVzZQorICogZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplKCkgZnVuY3Rpb24gZnJvbSAjR3N0QmFzZVBhcnNlIGNsYXNzCisgKiB0byBzZXQgdGhlIG5lZWRlZCBieXRlcyBmb3IgbmV4dCBmcmFtZS5UaGlzIHdheSBuZXh0IGRhdGEgY2h1bmsgaXMgYWxyZWFkeQorICogb2YgY29ycmVjdCBzaXplLgorICoKKyAqIFJldHVybnM6IFRSVUUgaWYgdGhlIGdpdmVuIGRhdGEgY29udGFpbnMgYSB2YWxpZCBBRFRTIGhlYWRlci4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYWFjX3BhcnNlX2NoZWNrX2FkdHNfZnJhbWUgKEdzdEFhY1BhcnNlICogYWFjcGFyc2UsCisgICAgY29uc3QgZ3VpbnQ4ICogZGF0YSwgY29uc3QgZ3VpbnQgYXZhaWwsIGdib29sZWFuIGRyYWluLAorICAgIGd1aW50ICogZnJhbWVzaXplLCBndWludCAqIG5lZWRlZF9kYXRhKQoreworICBndWludCBjcmNfc2l6ZTsKKworICAqbmVlZGVkX2RhdGEgPSAwOworCisgIC8qIEFic29sdXRlIG1pbmltdW0gdG8gcGVyZm9ybSB0aGUgQURUUyBzeW5jd29yZCwKKyAgICAgbGF5ZXIgYW5kIHNhbXBsaW5nIGZyZXF1ZW5jeSB0ZXN0cyAqLworICBpZiAoR19VTkxJS0VMWSAoYXZhaWwgPCAzKSkgeworICAgICpuZWVkZWRfZGF0YSA9IDM7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogU3luY3dvcmQgYW5kIGxheWVyIHRlc3RzICovCisgIGlmICgoZGF0YVswXSA9PSAweGZmKSAmJiAoKGRhdGFbMV0gJiAweGY2KSA9PSAweGYwKSkgeworCisgICAgLyogU2FtcGxpbmcgZnJlcXVlbmN5IHRlc3QgKi8KKyAgICBpZiAoR19VTkxJS0VMWSAoKGRhdGFbMl0gJiAweDNDKSA+PiAyID09IDE1KSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIC8qIFRoaXMgbG9va3MgbGlrZSBhbiBBRFRTIGZyYW1lIGhlYWRlciBidXQKKyAgICAgICB3ZSBuZWVkIGF0IGxlYXN0IDYgYnl0ZXMgdG8gcHJvY2VlZCAqLworICAgIGlmIChHX1VOTElLRUxZIChhdmFpbCA8IDYpKSB7CisgICAgICAqbmVlZGVkX2RhdGEgPSA2OworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgICpmcmFtZXNpemUgPSBnc3RfYWFjX3BhcnNlX2FkdHNfZ2V0X2ZyYW1lX2xlbiAoZGF0YSk7CisKKyAgICAvKiBJZiBmcmFtZSBoYXMgQ1JDLCBpdCBuZWVkcyAyIGJ5dGVzCisgICAgICAgZm9yIGl0IGF0IHRoZSBlbmQgb2YgdGhlIGhlYWRlciAqLworICAgIGNyY19zaXplID0gKGRhdGFbMV0gJiAweDAxKSA/IDAgOiAyOworCisgICAgLyogQ1JDIHNpemUgdGVzdCAqLworICAgIGlmICgqZnJhbWVzaXplIDwgNyArIGNyY19zaXplKSB7CisgICAgICAqbmVlZGVkX2RhdGEgPSA3ICsgY3JjX3NpemU7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLyogSW4gRU9TIG1vZGUgdGhpcyBpcyBlbm91Z2guIE5vIG5lZWQgdG8gZXhhbWluZSB0aGUgZGF0YSBmdXJ0aGVyLgorICAgICAgIFdlIGFsc28gcmVsYXggdGhlIGNoZWNrIHdoZW4gd2UgaGF2ZSBzeW5jLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0CisgICAgICAgaWYgd2UncmUgbm90IGxvb2tpbmcgYXQgcmFuZG9tIGRhdGEsIHdlIGhhdmUgYSBtdWNoIGhpZ2hlciBjaGFuY2UKKyAgICAgICB0byBnZXQgdGhlIGNvcnJlY3Qgc3luYywgYW5kIHRoaXMgYXZvaWRzIGxvc2luZyB0d28gZnJhbWVzIHdoZW4KKyAgICAgICBhIHNpbmdsZSBiaXQgY29ycnVwdGlvbiBoYXBwZW5zLiAqLworICAgIGlmIChkcmFpbiB8fCAhR1NUX0JBU0VfUEFSU0VfTE9TVF9TWU5DIChhYWNwYXJzZSkpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIGlmICgqZnJhbWVzaXplICsgQURUU19NQVhfU0laRSA+IGF2YWlsKSB7CisgICAgICAvKiBXZSBoYXZlIGZvdW5kIGEgcG9zc2libGUgZnJhbWUgaGVhZGVyIGNhbmRpZGF0ZSwgYnV0IGNhbid0IGJlCisgICAgICAgICBzdXJlIHNpbmNlIHdlIGRvbid0IGhhdmUgZW5vdWdoIGRhdGEgdG8gY2hlY2sgdGhlIG5leHQgZnJhbWUgKi8KKyAgICAgIEdTVF9ERUJVRyAoIk5FRUQgTU9SRSBEQVRBOiB3ZSBuZWVkICVkLCBhdmFpbGFibGUgJWQiLAorICAgICAgICAgICpmcmFtZXNpemUgKyBBRFRTX01BWF9TSVpFLCBhdmFpbCk7CisgICAgICAqbmVlZGVkX2RhdGEgPSAqZnJhbWVzaXplICsgQURUU19NQVhfU0laRTsKKyAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKSwKKyAgICAgICAgICAqZnJhbWVzaXplICsgQURUU19NQVhfU0laRSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKChkYXRhWypmcmFtZXNpemVdID09IDB4ZmYpICYmICgoZGF0YVsqZnJhbWVzaXplICsgMV0gJiAweGY2KSA9PSAweGYwKSkgeworICAgICAgZ3VpbnQgbmV4dGxlbiA9IGdzdF9hYWNfcGFyc2VfYWR0c19nZXRfZnJhbWVfbGVuIChkYXRhICsgKCpmcmFtZXNpemUpKTsKKworICAgICAgR1NUX0xPRyAoIkFEVFMgZnJhbWUgZm91bmQsIGxlbjogJWQgYnl0ZXMiLCAqZnJhbWVzaXplKTsKKyAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKSwKKyAgICAgICAgICBuZXh0bGVuICsgQURUU19NQVhfU0laRSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hYWNfcGFyc2VfbGF0bV9nZXRfdmFsdWUgKEdzdEFhY1BhcnNlICogYWFjcGFyc2UsIEdzdEJpdFJlYWRlciAqIGJyLAorICAgIGd1aW50MzIgKiB2YWx1ZSkKK3sKKyAgZ3VpbnQ4IGJ5dGVzLCBpLCBieXRlOworCisgICp2YWx1ZSA9IDA7CisgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKGJyLCAmYnl0ZXMsIDIpKQorICAgIHJldHVybiBGQUxTRTsKKyAgZm9yIChpID0gMDsgaSA8PSBieXRlczsgKytpKSB7CisgICAgKnZhbHVlIDw8PSA4OworICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKGJyLCAmYnl0ZSwgOCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgKnZhbHVlICs9IGJ5dGU7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FhY19wYXJzZV9nZXRfYXVkaW9fb2JqZWN0X3R5cGUgKEdzdEFhY1BhcnNlICogYWFjcGFyc2UsIEdzdEJpdFJlYWRlciAqIGJyLAorICAgIGd1aW50OCAqIGF1ZGlvX29iamVjdF90eXBlKQoreworICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4IChiciwgYXVkaW9fb2JqZWN0X3R5cGUsIDUpKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKCphdWRpb19vYmplY3RfdHlwZSA9PSAzMSkgeworICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKGJyLCBhdWRpb19vYmplY3RfdHlwZSwgNikpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgKmF1ZGlvX29iamVjdF90eXBlICs9IDMyOworICB9CisgIEdTVF9MT0dfT0JKRUNUIChhYWNwYXJzZSwgImF1ZGlvIG9iamVjdCB0eXBlICV1IiwgKmF1ZGlvX29iamVjdF90eXBlKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FhY19wYXJzZV9nZXRfYXVkaW9fc2FtcGxlX3JhdGUgKEdzdEFhY1BhcnNlICogYWFjcGFyc2UsIEdzdEJpdFJlYWRlciAqIGJyLAorICAgIGdpbnQgKiBzYW1wbGVfcmF0ZSkKK3sKKyAgZ3VpbnQ4IHNhbXBsaW5nX2ZyZXF1ZW5jeV9pbmRleDsKKyAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoYnIsICZzYW1wbGluZ19mcmVxdWVuY3lfaW5kZXgsIDQpKQorICAgIHJldHVybiBGQUxTRTsKKyAgR1NUX0xPR19PQkpFQ1QgKGFhY3BhcnNlLCAic2FtcGxpbmdfZnJlcXVlbmN5X2luZGV4OiAldSIsCisgICAgICBzYW1wbGluZ19mcmVxdWVuY3lfaW5kZXgpOworICBpZiAoc2FtcGxpbmdfZnJlcXVlbmN5X2luZGV4ID09IDB4ZikgeworICAgIGd1aW50MzIgc2FtcGxpbmdfcmF0ZTsKKyAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQzMiAoYnIsICZzYW1wbGluZ19yYXRlLCAyNCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgKnNhbXBsZV9yYXRlID0gc2FtcGxpbmdfcmF0ZTsKKyAgfSBlbHNlIHsKKyAgICAqc2FtcGxlX3JhdGUgPSBsb2FzX3NhbXBsZV9yYXRlX3RhYmxlW3NhbXBsaW5nX2ZyZXF1ZW5jeV9pbmRleF07CisgICAgaWYgKCEqc2FtcGxlX3JhdGUpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgYWFjcGFyc2UtPmxhc3RfcGFyc2VkX3NhbXBsZV9yYXRlID0gKnNhbXBsZV9yYXRlOworICByZXR1cm4gVFJVRTsKK30KKworLyogU2VlIHRhYmxlIDEuMTMgaW4gSVNPL0lFQyAxNDQ5Ni0zICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hYWNfcGFyc2VfcmVhZF9hdWRpb19zcGVjaWZpY19jb25maWcgKEdzdEFhY1BhcnNlICogYWFjcGFyc2UsCisgICAgR3N0Qml0UmVhZGVyICogYnIsIGdpbnQgKiBvYmplY3RfdHlwZSwgZ2ludCAqIHNhbXBsZV9yYXRlLCBnaW50ICogY2hhbm5lbHMsCisgICAgZ2ludCAqIGZyYW1lX3NhbXBsZXMpCit7CisgIGd1aW50OCBhdWRpb19vYmplY3RfdHlwZTsKKyAgZ3VpbnQ4IEdfR05VQ19VTlVTRUQgZXh0ZW5zaW9uX2F1ZGlvX29iamVjdF90eXBlOworICBndWludDggY2hhbm5lbF9jb25maWd1cmF0aW9uLCBleHRlbnNpb25fY2hhbm5lbF9jb25maWd1cmF0aW9uOworICBnYm9vbGVhbiBHX0dOVUNfVU5VU0VEIHNiciA9IEZBTFNFLCBwcyA9IEZBTFNFOworCisgIGlmICghZ3N0X2FhY19wYXJzZV9nZXRfYXVkaW9fb2JqZWN0X3R5cGUgKGFhY3BhcnNlLCBiciwgJmF1ZGlvX29iamVjdF90eXBlKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChvYmplY3RfdHlwZSkKKyAgICAqb2JqZWN0X3R5cGUgPSBhdWRpb19vYmplY3RfdHlwZTsKKworICBpZiAoIWdzdF9hYWNfcGFyc2VfZ2V0X2F1ZGlvX3NhbXBsZV9yYXRlIChhYWNwYXJzZSwgYnIsIHNhbXBsZV9yYXRlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoYnIsICZjaGFubmVsX2NvbmZpZ3VyYXRpb24sIDQpKQorICAgIHJldHVybiBGQUxTRTsKKyAgKmNoYW5uZWxzID0gbG9hc19jaGFubmVsc190YWJsZVtjaGFubmVsX2NvbmZpZ3VyYXRpb25dOworICBHU1RfTE9HX09CSkVDVCAoYWFjcGFyc2UsICJjaGFubmVsX2NvbmZpZ3VyYXRpb246ICVkIiwgY2hhbm5lbF9jb25maWd1cmF0aW9uKTsKKyAgaWYgKCEqY2hhbm5lbHMpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChhdWRpb19vYmplY3RfdHlwZSA9PSA1IHx8IGF1ZGlvX29iamVjdF90eXBlID09IDI5KSB7CisgICAgZXh0ZW5zaW9uX2F1ZGlvX29iamVjdF90eXBlID0gNTsKKyAgICBzYnIgPSBUUlVFOworICAgIGlmIChhdWRpb19vYmplY3RfdHlwZSA9PSAyOSkgeworICAgICAgcHMgPSBUUlVFOworICAgICAgLyogUGFyYW1ldHJpYyBzdGVyZW8uIElmIHdlIGhhdmUgYSBvbmUtY2hhbm5lbCBjb25maWd1cmF0aW9uLCB3ZSBjYW4KKyAgICAgICAqIG92ZXJyaWRlIGl0IHRvIHN0ZXJlbyAqLworICAgICAgaWYgKCpjaGFubmVscyA9PSAxKQorICAgICAgICAqY2hhbm5lbHMgPSAyOworICAgIH0KKworICAgIEdTVF9MT0dfT0JKRUNUIChhYWNwYXJzZSwKKyAgICAgICAgIkF1ZGlvIG9iamVjdCB0eXBlIDUgb3IgMjksIHNvIHJlcmVhZGluZyBzYW1wbGluZyByYXRlICh3YXMgJWQpLi4uIiwKKyAgICAgICAgKnNhbXBsZV9yYXRlKTsKKyAgICBpZiAoIWdzdF9hYWNfcGFyc2VfZ2V0X2F1ZGlvX3NhbXBsZV9yYXRlIChhYWNwYXJzZSwgYnIsIHNhbXBsZV9yYXRlKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmICghZ3N0X2FhY19wYXJzZV9nZXRfYXVkaW9fb2JqZWN0X3R5cGUgKGFhY3BhcnNlLCBiciwgJmF1ZGlvX29iamVjdF90eXBlKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmIChhdWRpb19vYmplY3RfdHlwZSA9PSAyMikgeworICAgICAgLyogZXh0ZW5zaW9uIGNoYW5uZWwgY29uZmlndXJhdGlvbiAqLworICAgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoYnIsICZleHRlbnNpb25fY2hhbm5lbF9jb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICA0KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgR1NUX0xPR19PQkpFQ1QgKGFhY3BhcnNlLCAiZXh0ZW5zaW9uIGNoYW5uZWxfY29uZmlndXJhdGlvbjogJWQiLAorICAgICAgICAgIGV4dGVuc2lvbl9jaGFubmVsX2NvbmZpZ3VyYXRpb24pOworICAgICAgKmNoYW5uZWxzID0gbG9hc19jaGFubmVsc190YWJsZVtleHRlbnNpb25fY2hhbm5lbF9jb25maWd1cmF0aW9uXTsKKyAgICAgIGlmICghKmNoYW5uZWxzKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9IGVsc2UgeworICAgIGV4dGVuc2lvbl9hdWRpb19vYmplY3RfdHlwZSA9IDA7CisgIH0KKworICBHU1RfSU5GT19PQkpFQ1QgKGFhY3BhcnNlLCAiUGFyc2VkIEF1ZGlvU3BlY2lmaWNDb25maWc6ICVkIEh6LCAlZCBjaGFubmVscyIsCisgICAgICAqc2FtcGxlX3JhdGUsICpjaGFubmVscyk7CisKKyAgaWYgKGZyYW1lX3NhbXBsZXMgJiYgYXVkaW9fb2JqZWN0X3R5cGUgPT0gMjMpIHsKKyAgICBndWludDggZnJhbWVfZmxhZzsKKyAgICAvKiBSZWFkIHRoZSBEZWNvZGVyIENvbmZpZ3VyYXRpb24gKEdBU3BlY2lmaWNDb25maWcpIGlmIHByZXNlbnQgKi8KKyAgICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGZpcnN0IGJpdCB0byBrbm93IHdoYXQgdGhlIG51bWJlciBvZiBzYW1wbGVzCisgICAgICogaW4gYSBmcmFtZSBpcyAqLworICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKGJyLCAmZnJhbWVfZmxhZywgMSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgKmZyYW1lX3NhbXBsZXMgPSBmcmFtZV9mbGFnID8gOTYwIDogMTAyNDsKKyAgfQorCisgIC8qIFRoZXJlJ3MgTE9UUyBvZiBzdHVmZiBuZXh0LCBidXQgd2UgaWdub3JlIGl0IGZvciBub3cgYXMgd2UgaGF2ZQorICAgICB3aGF0IHdlIHdhbnQgKHNhbXBsZSByYXRlIGFuZCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoYWFjcGFyc2UsCisgICAgICAiTmVlZCBtb3JlIGNvZGUgdG8gcGFyc2UgaHVtb25nb3VzIExPQVMgZGF0YSwgY3VycmVudGx5IGlnbm9yZWQiKTsKKyAgYWFjcGFyc2UtPmxhc3RfcGFyc2VkX2NoYW5uZWxzID0gKmNoYW5uZWxzOworICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hYWNfcGFyc2VfcmVhZF9sb2FzX2NvbmZpZyAoR3N0QWFjUGFyc2UgKiBhYWNwYXJzZSwgY29uc3QgZ3VpbnQ4ICogZGF0YSwKKyAgICBndWludCBhdmFpbCwgZ2ludCAqIHNhbXBsZV9yYXRlLCBnaW50ICogY2hhbm5lbHMsIGdpbnQgKiB2ZXJzaW9uKQoreworICBHc3RCaXRSZWFkZXIgYnI7CisgIGd1aW50OCB1OCwgdiwgdkE7CisKKyAgLyogTm8gdmVyc2lvbiBpbiB0aGUgYml0c3RyZWFtLCBidXQgdGhlIHNwZWMgaGFzIExPQVMgaW4gdGhlIE1QRUctNCBzZWN0aW9uICovCisgIGlmICh2ZXJzaW9uKQorICAgICp2ZXJzaW9uID0gNDsKKworICBnc3RfYml0X3JlYWRlcl9pbml0ICgmYnIsIGRhdGEsIGF2YWlsKTsKKworICAvKiBza2lwIHN5bmMgd29yZCAoMTEgYml0cykgYW5kIHNpemUgKDEzIGJpdHMpICovCisgIGlmICghZ3N0X2JpdF9yZWFkZXJfc2tpcCAoJmJyLCAxMSArIDEzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogRmlyc3QgYml0IGlzICJ1c2UgbGFzdCBjb25maWciICovCisgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKCZiciwgJnU4LCAxKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICh1OCkgeworICAgIEdTVF9MT0dfT0JKRUNUIChhYWNwYXJzZSwgIkZyYW1lIHVzZXMgcHJldmlvdXMgY29uZmlnIik7CisgICAgaWYgKCFhYWNwYXJzZS0+bGFzdF9wYXJzZWRfc2FtcGxlX3JhdGUgfHwgIWFhY3BhcnNlLT5sYXN0X3BhcnNlZF9jaGFubmVscykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYWFjcGFyc2UsCisgICAgICAgICAgIk5vIHByZXZpb3VzIGNvbmZpZyB0byB1c2UuIFdlJ2xsIGxvb2sgZm9yIG1vcmUgZGF0YS4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgKnNhbXBsZV9yYXRlID0gYWFjcGFyc2UtPmxhc3RfcGFyc2VkX3NhbXBsZV9yYXRlOworICAgICpjaGFubmVscyA9IGFhY3BhcnNlLT5sYXN0X3BhcnNlZF9jaGFubmVsczsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGFhY3BhcnNlLCAiRnJhbWUgY29udGFpbnMgbmV3IGNvbmZpZyIpOworCisgIC8qIGF1ZGlvTXV4VmVyc2lvbiAqLworICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4ICgmYnIsICZ2LCAxKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICh2KSB7CisgICAgLyogYXVkaW9NdXhWZXJzaW9uQSAqLworICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKCZiciwgJnZBLCAxKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfSBlbHNlCisgICAgdkEgPSAwOworCisgIEdTVF9MT0dfT0JKRUNUIChhYWNwYXJzZSwgInYgJWQsIHZBICVkIiwgdiwgdkEpOworICBpZiAodkEgPT0gMCkgeworICAgIGd1aW50OCBzYW1lX3RpbWUsIHN1YmZyYW1lcywgbnVtX3Byb2dyYW0sIHByb2c7CisgICAgaWYgKHYgPT0gMSkgeworICAgICAgZ3VpbnQzMiB2YWx1ZTsKKyAgICAgIC8qIHRhcmFCdWZmZXJGdWxsbmVzcyAqLworICAgICAgaWYgKCFnc3RfYWFjX3BhcnNlX2xhdG1fZ2V0X3ZhbHVlIChhYWNwYXJzZSwgJmJyLCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKCZiciwgJnNhbWVfdGltZSwgMSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoJmJyLCAmc3ViZnJhbWVzLCA2KSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4ICgmYnIsICZudW1fcHJvZ3JhbSwgNCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgR1NUX0xPR19PQkpFQ1QgKGFhY3BhcnNlLCAic2FtZV90aW1lICVkLCBzdWJmcmFtZXMgJWQsIG51bV9wcm9ncmFtICVkIiwKKyAgICAgICAgc2FtZV90aW1lLCBzdWJmcmFtZXMsIG51bV9wcm9ncmFtKTsKKworICAgIGZvciAocHJvZyA9IDA7IHByb2cgPD0gbnVtX3Byb2dyYW07ICsrcHJvZykgeworICAgICAgZ3VpbnQ4IG51bV9sYXllciwgbGF5ZXI7CisgICAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4ICgmYnIsICZudW1fbGF5ZXIsIDMpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBHU1RfTE9HX09CSkVDVCAoYWFjcGFyc2UsICJQcm9ncmFtICVkOiAlZCBsYXllcnMiLCBwcm9nLCBudW1fbGF5ZXIpOworCisgICAgICBmb3IgKGxheWVyID0gMDsgbGF5ZXIgPD0gbnVtX2xheWVyOyArK2xheWVyKSB7CisgICAgICAgIGd1aW50OCB1c2Vfc2FtZV9jb25maWc7CisgICAgICAgIGlmIChwcm9nID09IDAgJiYgbGF5ZXIgPT0gMCkgeworICAgICAgICAgIHVzZV9zYW1lX2NvbmZpZyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoJmJyLCAmdXNlX3NhbWVfY29uZmlnLCAxKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXVzZV9zYW1lX2NvbmZpZykgeworICAgICAgICAgIGlmICh2ID09IDApIHsKKyAgICAgICAgICAgIGlmICghZ3N0X2FhY19wYXJzZV9yZWFkX2F1ZGlvX3NwZWNpZmljX2NvbmZpZyAoYWFjcGFyc2UsICZiciwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3JhdGUsIGNoYW5uZWxzLCBOVUxMKSkKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBndWludDMyIGFzY19sZW47CisgICAgICAgICAgICBpZiAoIWdzdF9hYWNfcGFyc2VfbGF0bV9nZXRfdmFsdWUgKGFhY3BhcnNlLCAmYnIsICZhc2NfbGVuKSkKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgaWYgKCFnc3RfYWFjX3BhcnNlX3JlYWRfYXVkaW9fc3BlY2lmaWNfY29uZmlnIChhYWNwYXJzZSwgJmJyLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZSwgY2hhbm5lbHMsIE5VTEwpKQorICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX3NraXAgKCZiciwgYXNjX2xlbikpCisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgR1NUX0xPR19PQkpFQ1QgKGFhY3BhcnNlLCAiTW9yZSBkYXRhIGlnbm9yZWQiKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGFhY3BhcnNlLCAiU3BlYyBzYXlzIFwiVEJEXCIuLi4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogZ3N0X2FhY19wYXJzZV9sb2FzX2dldF9mcmFtZV9sZW46CisgKiBAZGF0YTogYmxvY2sgb2YgZGF0YSBjb250YWluaW5nIGEgTE9BUyBoZWFkZXIuCisgKgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIExPQVMgZnJhbWUgbGVuZ3RoIGZyb20gdGhlIGdpdmVuIGhlYWRlci4KKyAqCisgKiBSZXR1cm5zOiBzaXplIG9mIHRoZSBMT0FTIGZyYW1lLgorICovCitzdGF0aWMgaW5saW5lIGd1aW50Citnc3RfYWFjX3BhcnNlX2xvYXNfZ2V0X2ZyYW1lX2xlbiAoY29uc3QgZ3VpbnQ4ICogZGF0YSkKK3sKKyAgcmV0dXJuICgoKGRhdGFbMV0gJiAweDFmKSA8PCA4KSB8IGRhdGFbMl0pICsgMzsKK30KKworCisvKioKKyAqIGdzdF9hYWNfcGFyc2VfY2hlY2tfbG9hc19mcmFtZToKKyAqIEBhYWNwYXJzZTogI0dzdEFhY1BhcnNlLgorICogQGRhdGE6IERhdGEgdG8gYmUgY2hlY2tlZC4KKyAqIEBhdmFpbDogQW1vdW50IG9mIGRhdGEgcGFzc2VkLgorICogQGZyYW1lc2l6ZTogSWYgdmFsaWQgTE9BUyBmcmFtZSB3YXMgZm91bmQsIHRoaXMgd2lsbCBiZSBzZXQgdG8gdGVsbCB0aGUKKyAqICAgICAgICAgICAgIGZvdW5kIGZyYW1lIHNpemUgaW4gYnl0ZXMuCisgKiBAbmVlZGVkX2RhdGE6IElmIGZyYW1lIHdhcyBub3QgZm91bmQsIHRoaXMgbWF5IGJlIHNldCB0byB0ZWxsIGhvdyBtdWNoCisgKiAgICAgICAgICAgICAgIG1vcmUgZGF0YSBpcyBuZWVkZWQgaW4gdGhlIG5leHQgcm91bmQgdG8gZGV0ZWN0IHRoZSBmcmFtZQorICogICAgICAgICAgICAgICByZWxpYWJseS4gVGhpcyBtYXkgaGFwcGVuIHdoZW4gYSBmcmFtZSBoZWFkZXIgY2FuZGlkYXRlCisgKiAgICAgICAgICAgICAgIGlzIGZvdW5kIGJ1dCBpdCBjYW5ub3QgYmUgZ3VhcmFudGVlZCB0byBiZSB0aGUgaGVhZGVyIHdpdGhvdXQKKyAqICAgICAgICAgICAgICAgcGVla2luZyB0aGUgZm9sbG93aW5nIGRhdGEuCisgKgorICogQ2hlY2sgaWYgdGhlIGdpdmVuIGRhdGEgY29udGFpbnMgY29udGFpbnMgTE9BUyBmcmFtZS4gVGhlIGFsZ29yaXRobQorICogd2lsbCBleGFtaW5lIExPQVMgZnJhbWUgaGVhZGVyIGFuZCBjYWxjdWxhdGUgdGhlIGZyYW1lIHNpemUuIEFsc28sIGFub3RoZXIKKyAqIGNvbnNlY3V0aXZlIExPQVMgZnJhbWUgaGVhZGVyIG5lZWQgdG8gYmUgcHJlc2VudCBhZnRlciB0aGUgZm91bmQgZnJhbWUuCisgKiBPdGhlcndpc2UgdGhlIGRhdGEgaXMgbm90IGNvbnNpZGVyZWQgYXMgYSB2YWxpZCBMT0FTIGZyYW1lLiBIb3dldmVyLCB0aGlzCisgKiAiZXh0cmEgY2hlY2siIGlzIG9taXR0ZWQgd2hlbiBFT1MgaGFzIGJlZW4gcmVjZWl2ZWQuIEluIHRoaXMgY2FzZSBpdCBpcworICogZW5vdWdoIHdoZW4gZGF0YVswXSBjb250YWlucyBhIHZhbGlkIExPQVMgaGVhZGVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbWF5IHNldCB0aGUgI25lZWRlZF9kYXRhIHRvIGluZGljYXRlIHRoYXQgYSBwb3NzaWJsZSBmcmFtZQorICogY2FuZGlkYXRlIGhhcyBiZWVuIGZvdW5kLCBidXQgbW9yZSBkYXRhICgjbmVlZGVkX2RhdGEgYnl0ZXMpIGlzIG5lZWRlZCB0bworICogYmUgYWJzb2x1dGVseSBzdXJlLiBXaGVuIHRoaXMgc2l0dWF0aW9uIG9jY3VycywgRkFMU0Ugd2lsbCBiZSByZXR1cm5lZC4KKyAqCisgKiBXaGVuIGEgdmFsaWQgZnJhbWUgaXMgZGV0ZWN0ZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCB1c2UKKyAqIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSgpIGZ1bmN0aW9uIGZyb20gI0dzdEJhc2VQYXJzZSBjbGFzcworICogdG8gc2V0IHRoZSBuZWVkZWQgYnl0ZXMgZm9yIG5leHQgZnJhbWUuVGhpcyB3YXkgbmV4dCBkYXRhIGNodW5rIGlzIGFscmVhZHkKKyAqIG9mIGNvcnJlY3Qgc2l6ZS4KKyAqCisgKiBMT0FTIGNhbiBoYXZlIHRocmVlIGRpZmZlcmVudCBmb3JtYXRzLCBpZiBJIHJlYWQgdGhlIHNwZWMgY29ycmVjdGx5LiBPbmx5CisgKiBvbmUgb2YgdGhlbSBpcyBzdXBwb3J0ZWQgaGVyZSwgYXMgdGhlIHR3byBzYW1wbGVzIEkgaGF2ZSB1c2UgdGhpcyBvbmUuCisgKgorICogUmV0dXJuczogVFJVRSBpZiB0aGUgZ2l2ZW4gZGF0YSBjb250YWlucyBhIHZhbGlkIExPQVMgaGVhZGVyLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hYWNfcGFyc2VfY2hlY2tfbG9hc19mcmFtZSAoR3N0QWFjUGFyc2UgKiBhYWNwYXJzZSwKKyAgICBjb25zdCBndWludDggKiBkYXRhLCBjb25zdCBndWludCBhdmFpbCwgZ2Jvb2xlYW4gZHJhaW4sCisgICAgZ3VpbnQgKiBmcmFtZXNpemUsIGd1aW50ICogbmVlZGVkX2RhdGEpCit7CisgICpuZWVkZWRfZGF0YSA9IDA7CisKKyAgLyogMyBieXRlIGhlYWRlciAqLworICBpZiAoR19VTkxJS0VMWSAoYXZhaWwgPCAzKSkgeworICAgICpuZWVkZWRfZGF0YSA9IDM7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKChkYXRhWzBdID09IDB4NTYpICYmICgoZGF0YVsxXSAmIDB4ZTApID09IDB4ZTApKSB7CisgICAgKmZyYW1lc2l6ZSA9IGdzdF9hYWNfcGFyc2VfbG9hc19nZXRfZnJhbWVfbGVuIChkYXRhKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhYWNwYXJzZSwgIkZvdW5kIHBvc3NpYmxlICV1IGJ5dGUgTE9BUyBmcmFtZSIsCisgICAgICAgICpmcmFtZXNpemUpOworCisgICAgLyogSW4gRU9TIG1vZGUgdGhpcyBpcyBlbm91Z2guIE5vIG5lZWQgdG8gZXhhbWluZSB0aGUgZGF0YSBmdXJ0aGVyLgorICAgICAgIFdlIGFsc28gcmVsYXggdGhlIGNoZWNrIHdoZW4gd2UgaGF2ZSBzeW5jLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0CisgICAgICAgaWYgd2UncmUgbm90IGxvb2tpbmcgYXQgcmFuZG9tIGRhdGEsIHdlIGhhdmUgYSBtdWNoIGhpZ2hlciBjaGFuY2UKKyAgICAgICB0byBnZXQgdGhlIGNvcnJlY3Qgc3luYywgYW5kIHRoaXMgYXZvaWRzIGxvc2luZyB0d28gZnJhbWVzIHdoZW4KKyAgICAgICBhIHNpbmdsZSBiaXQgY29ycnVwdGlvbiBoYXBwZW5zLiAqLworICAgIGlmIChkcmFpbiB8fCAhR1NUX0JBU0VfUEFSU0VfTE9TVF9TWU5DIChhYWNwYXJzZSkpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIGlmICgqZnJhbWVzaXplICsgTE9BU19NQVhfU0laRSA+IGF2YWlsKSB7CisgICAgICAvKiBXZSBoYXZlIGZvdW5kIGEgcG9zc2libGUgZnJhbWUgaGVhZGVyIGNhbmRpZGF0ZSwgYnV0IGNhbid0IGJlCisgICAgICAgICBzdXJlIHNpbmNlIHdlIGRvbid0IGhhdmUgZW5vdWdoIGRhdGEgdG8gY2hlY2sgdGhlIG5leHQgZnJhbWUgKi8KKyAgICAgIEdTVF9ERUJVRyAoIk5FRUQgTU9SRSBEQVRBOiB3ZSBuZWVkICVkLCBhdmFpbGFibGUgJWQiLAorICAgICAgICAgICpmcmFtZXNpemUgKyBMT0FTX01BWF9TSVpFLCBhdmFpbCk7CisgICAgICAqbmVlZGVkX2RhdGEgPSAqZnJhbWVzaXplICsgTE9BU19NQVhfU0laRTsKKyAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKSwKKyAgICAgICAgICAqZnJhbWVzaXplICsgTE9BU19NQVhfU0laRSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKChkYXRhWypmcmFtZXNpemVdID09IDB4NTYpICYmICgoZGF0YVsqZnJhbWVzaXplICsgMV0gJiAweGUwKSA9PSAweGUwKSkgeworICAgICAgZ3VpbnQgbmV4dGxlbiA9IGdzdF9hYWNfcGFyc2VfbG9hc19nZXRfZnJhbWVfbGVuIChkYXRhICsgKCpmcmFtZXNpemUpKTsKKworICAgICAgR1NUX0xPRyAoIkxPQVMgZnJhbWUgZm91bmQsIGxlbjogJWQgYnl0ZXMiLCAqZnJhbWVzaXplKTsKKyAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKSwKKyAgICAgICAgICBuZXh0bGVuICsgTE9BU19NQVhfU0laRSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYWFjcGFyc2UsICJUaGF0IHdhcyBhIGZhbHNlIHBvc2l0aXZlIik7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKK30KKworLyogY2FsbGVyIGVuc3VyZSBzdWZmaWNpZW50IGRhdGEgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZ3N0X2FhY19wYXJzZV9wYXJzZV9hZHRzX2hlYWRlciAoR3N0QWFjUGFyc2UgKiBhYWNwYXJzZSwgY29uc3QgZ3VpbnQ4ICogZGF0YSwKKyAgICBnaW50ICogcmF0ZSwgZ2ludCAqIGNoYW5uZWxzLCBnaW50ICogb2JqZWN0LCBnaW50ICogdmVyc2lvbikKK3sKKworICBpZiAocmF0ZSkgeworICAgIGdpbnQgc3JfaWR4ID0gKGRhdGFbMl0gJiAweDNjKSA+PiAyOworCisgICAgKnJhdGUgPSBnc3RfY29kZWNfdXRpbHNfYWFjX2dldF9zYW1wbGVfcmF0ZV9mcm9tX2luZGV4IChzcl9pZHgpOworICB9CisgIGlmIChjaGFubmVscykgeworICAgICpjaGFubmVscyA9ICgoZGF0YVsyXSAmIDB4MDEpIDw8IDIpIHwgKChkYXRhWzNdICYgMHhjMCkgPj4gNik7CisgICAgaWYgKCpjaGFubmVscyA9PSA3KQorICAgICAgKmNoYW5uZWxzID0gODsKKyAgfQorCisgIGlmICh2ZXJzaW9uKQorICAgICp2ZXJzaW9uID0gKGRhdGFbMV0gJiAweDA4KSA/IDIgOiA0OworICBpZiAob2JqZWN0KQorICAgICpvYmplY3QgPSAoKGRhdGFbMl0gJiAweGMwKSA+PiA2KSArIDE7Cit9CisKKy8qKgorICogZ3N0X2FhY19wYXJzZV9kZXRlY3Rfc3RyZWFtOgorICogQGFhY3BhcnNlOiAjR3N0QWFjUGFyc2UuCisgKiBAZGF0YTogQSBibG9jayBvZiBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgZXhhbWluZWQgZm9yIHN0cmVhbSBjaGFyYWN0ZXJpc3RpY3MuCisgKiBAYXZhaWw6IFNpemUgb2YgdGhlIGdpdmVuIGRhdGFibG9jay4KKyAqIEBmcmFtZXNpemU6IElmIHZhbGlkIHN0cmVhbSB3YXMgZm91bmQsIHRoaXMgd2lsbCBiZSBzZXQgdG8gdGVsbCB0aGUKKyAqICAgICAgICAgICAgIGZpcnN0IGZyYW1lIHNpemUgaW4gYnl0ZXMuCisgKiBAc2tpcHNpemU6IElmIHZhbGlkIHN0cmVhbSB3YXMgZm91bmQsIHRoaXMgd2lsbCBiZSBzZXQgdG8gdGVsbCB0aGUgZmlyc3QKKyAqICAgICAgICAgICAgYXVkaW8gZnJhbWUgcG9zaXRpb24gd2l0aGluIHRoZSBnaXZlbiBkYXRhLgorICoKKyAqIEV4YW1pbmVzIHRoZSBnaXZlbiBwaWVjZSBvZiBkYXRhIGFuZCB0cnkgdG8gZGV0ZWN0IHRoZSBmb3JtYXQgb2YgaXQuIEl0CisgKiBjaGVja3MgZm9yICJBRElGIiBoZWFkZXIgKGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNsaXApIGFuZCBBRFRTIGZyYW1lCisgKiBoZWFkZXIuIElmIHRoZSBzdHJlYW0gaXMgZGV0ZWN0ZWQsIFRSVUUgd2lsbCBiZSByZXR1cm5lZCBhbmQgI2ZyYW1lc2l6ZQorICogaXMgc2V0IHRvIGluZGljYXRlIHRoZSBmb3VuZCBmcmFtZSBzaXplLiBBZGRpdGlvbmFsbHksICNza2lwc2l6ZSBtaWdodAorICogYmUgc2V0IHRvIGluZGljYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBuZWVkIHRvIGJlIHNraXBwZWQsIGEuay5hLiB0aGUKKyAqIHBvc2l0aW9uIG9mIHRoZSBmcmFtZSBpbnNpZGUgZ2l2ZW4gZGF0YSBjaHVuay4KKyAqCisgKiBSZXR1cm5zOiBUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FhY19wYXJzZV9kZXRlY3Rfc3RyZWFtIChHc3RBYWNQYXJzZSAqIGFhY3BhcnNlLAorICAgIGNvbnN0IGd1aW50OCAqIGRhdGEsIGNvbnN0IGd1aW50IGF2YWlsLCBnYm9vbGVhbiBkcmFpbiwKKyAgICBndWludCAqIGZyYW1lc2l6ZSwgZ2ludCAqIHNraXBzaXplKQoreworICBnYm9vbGVhbiBmb3VuZCA9IEZBTFNFOworICBndWludCBuZWVkX2RhdGFfYWR0cyA9IDAsIG5lZWRfZGF0YV9sb2FzOworICBndWludCBpID0gMDsKKworICBHU1RfREVCVUdfT0JKRUNUIChhYWNwYXJzZSwgIlBhcnNpbmcgaGVhZGVyIGRhdGEiKTsKKworICAvKiBGSVhNRTogTm8gbmVlZCB0byBjaGVjayBmb3IgQURJRiBpZiB3ZSBhcmUgbm90IGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICAgIHN0cmVhbSAqLworCisgIC8qIENhbiB3ZSBldmVuIHBhcnNlIHRoZSBoZWFkZXI/ICovCisgIGlmIChhdmFpbCA8IE1BWCAoQURUU19NQVhfU0laRSwgTE9BU19NQVhfU0laRSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhYWNwYXJzZSwgIk5vdCBlbm91Z2ggZGF0YSB0byBjaGVjayIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBhdmFpbCAtIDQ7IGkrKykgeworICAgIGlmICgoKGRhdGFbaV0gPT0gMHhmZikgJiYgKChkYXRhW2kgKyAxXSAmIDB4ZjYpID09IDB4ZjApKSB8fAorICAgICAgICAoKGRhdGFbaV0gPT0gMHg1NikgJiYgKChkYXRhW2kgKyAxXSAmIDB4ZTApID09IDB4ZTApKSB8fAorICAgICAgICBzdHJuY21wICgoY2hhciAqKSBkYXRhICsgaSwgIkFESUYiLCA0KSA9PSAwKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChhYWNwYXJzZSwgIkZvdW5kIHNpZ25hdHVyZSBhdCBvZmZzZXQgJXUiLCBpKTsKKyAgICAgIGZvdW5kID0gVFJVRTsKKworICAgICAgaWYgKGkpIHsKKyAgICAgICAgLyogVHJpY2s6IHRlbGwgdGhlIHBhcmVudCBjbGFzcyB0aGF0IHdlIGRpZG4ndCBmaW5kIHRoZSBmcmFtZSB5ZXQsCisgICAgICAgICAgIGJ1dCBtYWtlIGl0IHNraXAgJ2knIGFtb3VudCBvZiBieXRlcy4gTmV4dCB0aW1lIHdlIGFycml2ZQorICAgICAgICAgICBoZXJlIHdlIGhhdmUgZnVsbCBmcmFtZSBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhLiAqLworICAgICAgICAqc2tpcHNpemUgPSBpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKCFmb3VuZCkgeworICAgIGlmIChpKQorICAgICAgKnNraXBzaXplID0gaTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoZ3N0X2FhY19wYXJzZV9jaGVja19hZHRzX2ZyYW1lIChhYWNwYXJzZSwgZGF0YSwgYXZhaWwsIGRyYWluLAorICAgICAgICAgIGZyYW1lc2l6ZSwgJm5lZWRfZGF0YV9hZHRzKSkgeworICAgIGdpbnQgcmF0ZSwgY2hhbm5lbHM7CisKKyAgICBHU1RfSU5GTyAoIkFEVFMgSUQ6ICVkLCBmcmFtZXNpemU6ICVkIiwgKGRhdGFbMV0gJiAweDA4KSA+PiAzLCAqZnJhbWVzaXplKTsKKworICAgIGdzdF9hYWNfcGFyc2VfcGFyc2VfYWR0c19oZWFkZXIgKGFhY3BhcnNlLCBkYXRhLCAmcmF0ZSwgJmNoYW5uZWxzLAorICAgICAgICAmYWFjcGFyc2UtPm9iamVjdF90eXBlLCAmYWFjcGFyc2UtPm1wZWd2ZXJzaW9uKTsKKworICAgIGlmICghY2hhbm5lbHMgfHwgIWZyYW1lc2l6ZSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYWFjcGFyc2UsICJpbXBvc3NpYmxlIEFEVFMgY29uZmlndXJhdGlvbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGFhY3BhcnNlLT5oZWFkZXJfdHlwZSA9IERTUEFBQ19IRUFERVJfQURUUzsKKyAgICBnc3RfYmFzZV9wYXJzZV9zZXRfZnJhbWVfcmF0ZSAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKSwgcmF0ZSwKKyAgICAgICAgYWFjcGFyc2UtPmZyYW1lX3NhbXBsZXMsIDIsIDIpOworCisgICAgR1NUX0RFQlVHICgiQURUUzogc2FtcGxlcmF0ZSAlZCwgY2hhbm5lbHMgJWQsIG9ianR5cGUgJWQsIHZlcnNpb24gJWQiLAorICAgICAgICByYXRlLCBjaGFubmVscywgYWFjcGFyc2UtPm9iamVjdF90eXBlLCBhYWNwYXJzZS0+bXBlZ3ZlcnNpb24pOworCisgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X3N5bmNhYmxlIChHU1RfQkFTRV9QQVJTRSAoYWFjcGFyc2UpLCBUUlVFKTsKKworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgaWYgKGdzdF9hYWNfcGFyc2VfY2hlY2tfbG9hc19mcmFtZSAoYWFjcGFyc2UsIGRhdGEsIGF2YWlsLCBkcmFpbiwKKyAgICAgICAgICBmcmFtZXNpemUsICZuZWVkX2RhdGFfbG9hcykpIHsKKyAgICBnaW50IHJhdGUgPSAwLCBjaGFubmVscyA9IDA7CisKKyAgICBHU1RfSU5GTyAoIkxPQVMsIGZyYW1lc2l6ZTogJWQiLCAqZnJhbWVzaXplKTsKKworICAgIGFhY3BhcnNlLT5oZWFkZXJfdHlwZSA9IERTUEFBQ19IRUFERVJfTE9BUzsKKworICAgIGlmICghZ3N0X2FhY19wYXJzZV9yZWFkX2xvYXNfY29uZmlnIChhYWNwYXJzZSwgZGF0YSwgYXZhaWwsICZyYXRlLAorICAgICAgICAgICAgJmNoYW5uZWxzLCAmYWFjcGFyc2UtPm1wZWd2ZXJzaW9uKSkgeworICAgICAgLyogVGhpcyBpcyBwcmV0dHkgbm9ybWFsIHdoZW4gc2tpcHBpbmcgZGF0YSBhdCB0aGUgc3RhcnQgb2YKKyAgICAgICAqIHJhbmRvbSBzdHJlYW0gKE1QRUctVFMgY2FwdHVyZSBmb3IgZXhhbXBsZSkgKi8KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChhYWNwYXJzZSwgIkVycm9yIHJlYWRpbmcgTE9BUyBjb25maWciKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAocmF0ZSAmJiBjaGFubmVscykgeworICAgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X2ZyYW1lX3JhdGUgKEdTVF9CQVNFX1BBUlNFIChhYWNwYXJzZSksIHJhdGUsCisgICAgICAgICAgYWFjcGFyc2UtPmZyYW1lX3NhbXBsZXMsIDIsIDIpOworCisgICAgICAvKiBEb24ndCBzdG9yZSB0aGUgc2FtcGxlIHJhdGUgYW5kIGNoYW5uZWxzIHlldCAtCisgICAgICAgKiB0aGlzIGlzIGp1c3QgZm9ybWF0IGRldGVjdGlvbi4gKi8KKyAgICAgIEdTVF9ERUJVRyAoIkxPQVM6IHNhbXBsZXJhdGUgJWQsIGNoYW5uZWxzICVkLCBvYmp0eXBlICVkLCB2ZXJzaW9uICVkIiwKKyAgICAgICAgICByYXRlLCBjaGFubmVscywgYWFjcGFyc2UtPm9iamVjdF90eXBlLCBhYWNwYXJzZS0+bXBlZ3ZlcnNpb24pOworICAgIH0KKworICAgIGdzdF9iYXNlX3BhcnNlX3NldF9zeW5jYWJsZSAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKSwgVFJVRSk7CisKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGlmIChuZWVkX2RhdGFfYWR0cyB8fCBuZWVkX2RhdGFfbG9hcykgeworICAgIC8qIFRoaXMgdGVsbHMgdGhlIHBhcmVudCBjbGFzcyBub3QgdG8gc2tpcCBhbnkgZGF0YSAqLworICAgICpza2lwc2l6ZSA9IDA7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKGF2YWlsIDwgQURJRl9NQVhfU0laRSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKG1lbWNtcCAoZGF0YSArIGksICJBRElGIiwgNCkgPT0gMCkgeworICAgIGNvbnN0IGd1aW50OCAqYWRpZjsKKyAgICBpbnQgc2tpcF9zaXplID0gMDsKKyAgICBpbnQgYml0c3RyZWFtX3R5cGU7CisgICAgaW50IHNyX2lkeDsKKyAgICBHc3RDYXBzICpzaW5rY2FwczsKKworICAgIGFhY3BhcnNlLT5oZWFkZXJfdHlwZSA9IERTUEFBQ19IRUFERVJfQURJRjsKKyAgICBhYWNwYXJzZS0+bXBlZ3ZlcnNpb24gPSA0OworCisgICAgLyogU2tpcCB0aGUgIkFESUYiIGJ5dGVzICovCisgICAgYWRpZiA9IGRhdGEgKyBpICsgNDsKKworICAgIC8qIGNvcHlyaWdodCBzdHJpbmcgKi8KKyAgICBpZiAoYWRpZlswXSAmIDB4ODApCisgICAgICBza2lwX3NpemUgKz0gOTsgICAgICAgICAgIC8qIHNraXAgOSBieXRlcyAqLworCisgICAgYml0c3RyZWFtX3R5cGUgPSBhZGlmWzAgKyBza2lwX3NpemVdICYgMHgxMDsKKyAgICBhYWNwYXJzZS0+Yml0cmF0ZSA9CisgICAgICAgICgodW5zaWduZWQgaW50KSAoYWRpZlswICsgc2tpcF9zaXplXSAmIDB4MGYpIDw8IDE5KSB8CisgICAgICAgICgodW5zaWduZWQgaW50KSBhZGlmWzEgKyBza2lwX3NpemVdIDw8IDExKSB8CisgICAgICAgICgodW5zaWduZWQgaW50KSBhZGlmWzIgKyBza2lwX3NpemVdIDw8IDMpIHwKKyAgICAgICAgKCh1bnNpZ25lZCBpbnQpIGFkaWZbMyArIHNraXBfc2l6ZV0gJiAweGUwKTsKKworICAgIC8qIENCUiAqLworICAgIGlmIChiaXRzdHJlYW1fdHlwZSA9PSAwKSB7CisjaWYgMAorICAgICAgLyogQnVmZmVyIGZ1bGxuZXNzIHBhcnNpbmcuIEN1cnJlbnRseSBub3QgbmVlZGVkLi4uICovCisgICAgICBndWludCBudW1fZWxlbXMgPSAwOworICAgICAgZ3VpbnQgZnVsbG5lc3MgPSAwOworCisgICAgICBudW1fZWxlbXMgPSAoYWRpZlszICsgc2tpcF9zaXplXSAmIDB4MWUpOworICAgICAgR1NUX0lORk8gKCJBRElGIG51bV9jb25maWdfZWxlbXM6ICVkIiwgbnVtX2VsZW1zKTsKKworICAgICAgZnVsbG5lc3MgPSAoKHVuc2lnbmVkIGludCkgKGFkaWZbMyArIHNraXBfc2l6ZV0gJiAweDAxKSA8PCAxOSkgfAorICAgICAgICAgICgodW5zaWduZWQgaW50KSBhZGlmWzQgKyBza2lwX3NpemVdIDw8IDExKSB8CisgICAgICAgICAgKCh1bnNpZ25lZCBpbnQpIGFkaWZbNSArIHNraXBfc2l6ZV0gPDwgMykgfAorICAgICAgICAgICgodW5zaWduZWQgaW50KSAoYWRpZls2ICsgc2tpcF9zaXplXSAmIDB4ZTApID4+IDUpOworCisgICAgICBHU1RfSU5GTyAoIkFESUYgYnVmZmVyIGZ1bGxuZXNzOiAlZCIsIGZ1bGxuZXNzKTsKKyNlbmRpZgorICAgICAgYWFjcGFyc2UtPm9iamVjdF90eXBlID0gKChhZGlmWzYgKyBza2lwX3NpemVdICYgMHgwMSkgPDwgMSkgfAorICAgICAgICAgICgoYWRpZls3ICsgc2tpcF9zaXplXSAmIDB4ODApID4+IDcpOworICAgICAgc3JfaWR4ID0gKGFkaWZbNyArIHNraXBfc2l6ZV0gJiAweDc4KSA+PiAzOworICAgIH0KKyAgICAvKiBWQlIgKi8KKyAgICBlbHNlIHsKKyAgICAgIGFhY3BhcnNlLT5vYmplY3RfdHlwZSA9IChhZGlmWzQgKyBza2lwX3NpemVdICYgMHgxOCkgPj4gMzsKKyAgICAgIHNyX2lkeCA9ICgoYWRpZls0ICsgc2tpcF9zaXplXSAmIDB4MDcpIDw8IDEpIHwKKyAgICAgICAgICAoKGFkaWZbNSArIHNraXBfc2l6ZV0gJiAweDgwKSA+PiA3KTsKKyAgICB9CisKKyAgICAvKiBGSVhNRTogVGhpcyBnaXZlcyB0b3RhbGx5IHdyb25nIHJlc3VsdHMuIER1cmF0aW9uIGNhbGN1bGF0aW9uIGNhbm5vdAorICAgICAgIGJlIGJhc2VkIG9uIHRoaXMgKi8KKyAgICBhYWNwYXJzZS0+c2FtcGxlX3JhdGUgPQorICAgICAgICBnc3RfY29kZWNfdXRpbHNfYWFjX2dldF9zYW1wbGVfcmF0ZV9mcm9tX2luZGV4IChzcl9pZHgpOworCisgICAgLyogYmFzZXBhcnNlIGlzIG5vdCBnaXZlbiBhbnkgZnBzLAorICAgICAqIHNvIGl0IHdpbGwgZ2l2ZSB1cCBvbiB0aW1lc3RhbXBzLCBzZWVraW5nLCBldGMgKi8KKworICAgIC8qIEZJWE1FOiBDYW4gd2UgYXNzdW1lIHRoaXM/ICovCisgICAgYWFjcGFyc2UtPmNoYW5uZWxzID0gMjsKKworICAgIEdTVF9JTkZPICgiQURJRjogYnI9JWQsIHNhbXBsZXJhdGU9JWQsIG9ianR5cGU9JWQiLAorICAgICAgICBhYWNwYXJzZS0+Yml0cmF0ZSwgYWFjcGFyc2UtPnNhbXBsZV9yYXRlLCBhYWNwYXJzZS0+b2JqZWN0X3R5cGUpOworCisgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplIChHU1RfQkFTRV9QQVJTRSAoYWFjcGFyc2UpLCA1MTIpOworCisgICAgLyogYXJyYW5nZSBmb3IgbWV0YWRhdGEgYW5kIGdldCBvdXQgb2YgdGhlIHdheSAqLworICAgIHNpbmtjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChHU1RfQkFTRV9QQVJTRV9TSU5LX1BBRCAoYWFjcGFyc2UpKTsKKyAgICBnc3RfYWFjX3BhcnNlX3NldF9zcmNfY2FwcyAoYWFjcGFyc2UsIHNpbmtjYXBzKTsKKyAgICBpZiAoc2lua2NhcHMpCisgICAgICBnc3RfY2Fwc191bnJlZiAoc2lua2NhcHMpOworCisgICAgLyogbm90IHN5bmNhYmxlLCBub3QgZWFzaWx5IHNlZWthYmxlICh1bmxlc3Mgd2UgcHVzaCBkYXRhIGZyb20gc3RhcnQgKi8KKyAgICBnc3RfYmFzZV9wYXJzZV9zZXRfc3luY2FibGUgKEdTVF9CQVNFX1BBUlNFX0NBU1QgKGFhY3BhcnNlKSwgRkFMU0UpOworICAgIGdzdF9iYXNlX3BhcnNlX3NldF9wYXNzdGhyb3VnaCAoR1NUX0JBU0VfUEFSU0VfQ0FTVCAoYWFjcGFyc2UpLCBUUlVFKTsKKyAgICBnc3RfYmFzZV9wYXJzZV9zZXRfYXZlcmFnZV9iaXRyYXRlIChHU1RfQkFTRV9QQVJTRV9DQVNUIChhYWNwYXJzZSksIDApOworCisgICAgKmZyYW1lc2l6ZSA9IGF2YWlsOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBnc3RfYWFjX3BhcnNlX2dldF9hdWRpb19wcm9maWxlX29iamVjdF90eXBlCisgKiBAYWFjcGFyc2U6ICNHc3RBYWNQYXJzZS4KKyAqCisgKiBHZXRzIHRoZSBNUEVHLTIgcHJvZmlsZSBvciB0aGUgTVBFRy00IG9iamVjdCB0eXBlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgKiBtcGVndmVyc2lvbiBhbmQgcHJvZmlsZSBvZiBAYWFjcGFyc2UncyBzcmMgcGFkIGNhcHMsIGFjY29yZGluZyB0byB0aGUKKyAqIHZhbHVlcyBkZWZpbmVkIGJ5IHRhYmxlIDEuQS4xMSBpbiBJU08vSUVDIDE0NDk2LTMuCisgKgorICogUmV0dXJuczogdGhlIHByb2ZpbGUgb3Igb2JqZWN0IHR5cGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byBAYWFjcGFyc2UncyBzcmMKKyAqIHBhZCBjYXBzLCBpZiBzdWNoIGEgdmFsdWUgZXhpc3RzOyBvdGhlcndpc2UgR19NQVhVSU5UOC4KKyAqLworc3RhdGljIGd1aW50OAorZ3N0X2FhY19wYXJzZV9nZXRfYXVkaW9fcHJvZmlsZV9vYmplY3RfdHlwZSAoR3N0QWFjUGFyc2UgKiBhYWNwYXJzZSkKK3sKKyAgR3N0Q2FwcyAqc3JjY2FwczsKKyAgR3N0U3RydWN0dXJlICpzcmNzdHJ1Y3Q7CisgIGNvbnN0IGdjaGFyICpwcm9maWxlOworICBndWludDggcmV0OworCisgIHNyY2NhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKGFhY3BhcnNlKSk7CisgIGlmIChHX1VOTElLRUxZIChzcmNjYXBzID09IE5VTEwpKSB7CisgICAgcmV0dXJuIEdfTUFYVUlOVDg7CisgIH0KKworICBzcmNzdHJ1Y3QgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChzcmNjYXBzLCAwKTsKKyAgcHJvZmlsZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3Jjc3RydWN0LCAicHJvZmlsZSIpOworICBpZiAoR19VTkxJS0VMWSAocHJvZmlsZSA9PSBOVUxMKSkgeworICAgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKyAgICByZXR1cm4gR19NQVhVSU5UODsKKyAgfQorCisgIGlmIChnX3N0cmNtcDAgKHByb2ZpbGUsICJtYWluIikgPT0gMCkgeworICAgIHJldCA9IChndWludDgpIDBVOworICB9IGVsc2UgaWYgKGdfc3RyY21wMCAocHJvZmlsZSwgImxjIikgPT0gMCkgeworICAgIHJldCA9IChndWludDgpIDFVOworICB9IGVsc2UgaWYgKGdfc3RyY21wMCAocHJvZmlsZSwgInNzciIpID09IDApIHsKKyAgICByZXQgPSAoZ3VpbnQ4KSAyVTsKKyAgfSBlbHNlIGlmIChnX3N0cmNtcDAgKHByb2ZpbGUsICJsdHAiKSA9PSAwKSB7CisgICAgaWYgKEdfTElLRUxZIChhYWNwYXJzZS0+bXBlZ3ZlcnNpb24gPT0gNCkpCisgICAgICByZXQgPSAoZ3VpbnQ4KSAzVTsKKyAgICBlbHNlCisgICAgICByZXQgPSBHX01BWFVJTlQ4OyAgICAgICAgIC8qIExUUCBPYmplY3QgVHlwZSBhbGxvd2VkIG9ubHkgZm9yIE1QRUctNCAqLworICB9IGVsc2UgeworICAgIHJldCA9IEdfTUFYVUlOVDg7CisgIH0KKworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogZ3N0X2FhY19wYXJzZV9nZXRfYXVkaW9fY2hhbm5lbF9jb25maWd1cmF0aW9uCisgKiBAbnVtX2NoYW5uZWxzOiBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMuCisgKgorICogR2V0cyB0aGUgQ2hhbm5lbCBDb25maWd1cmF0aW9uIHZhbHVlLCBhcyBkZWZpbmVkIGJ5IHRhYmxlIDEuMTkgaW4gSVNPL0lFQworICogMTQ0OTYtMywgZm9yIGEgZ2l2ZW4gbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzLgorICoKKyAqIFJldHVybnM6IHRoZSBDaGFubmVsIENvbmZpZ3VyYXRpb24gdmFsdWUgY29ycmVzcG9uZGluZyB0byBAbnVtX2NoYW5uZWxzLCBpZgorICogc3VjaCBhIHZhbHVlIGV4aXN0czsgb3RoZXJ3aXNlIEdfTUFYVUlOVDguCisgKi8KK3N0YXRpYyBndWludDgKK2dzdF9hYWNfcGFyc2VfZ2V0X2F1ZGlvX2NoYW5uZWxfY29uZmlndXJhdGlvbiAoZ2ludCBudW1fY2hhbm5lbHMpCit7CisgIGlmIChudW1fY2hhbm5lbHMgPj0gMSAmJiBudW1fY2hhbm5lbHMgPD0gNikgICAvKiBNb25vIHVwIHRvICYgaW5jbHVkaW5nIDUuMSAqLworICAgIHJldHVybiAoZ3VpbnQ4KSBudW1fY2hhbm5lbHM7CisgIGVsc2UgaWYgKG51bV9jaGFubmVscyA9PSA4KSAgIC8qIDcuMSAqLworICAgIHJldHVybiAoZ3VpbnQ4KSA3VTsKKyAgZWxzZQorICAgIHJldHVybiBHX01BWFVJTlQ4OworCisgIC8qIEZJWE1FOiBBZGQgc3VwcG9ydCBmb3IgY29uZmlndXJhdGlvbnMgMTEsIDEyIGFuZCAxNCBmcm9tCisgICAqIElTTy9JRUMgMTQ0OTYtMzoyMDA5L1BEQU0gNCBiYXNlZCBvbiB0aGUgYWN0dWFsIGNoYW5uZWwgbGF5b3V0CisgICAqLworfQorCisvKioKKyAqIGdzdF9hYWNfcGFyc2VfZ2V0X2F1ZGlvX3NhbXBsaW5nX2ZyZXF1ZW5jeV9pbmRleDoKKyAqIEBzYW1wbGVfcmF0ZTogYXVkaW8gc2FtcGxpbmcgcmF0ZS4KKyAqCisgKiBHZXRzIHRoZSBTYW1wbGluZyBGcmVxdWVuY3kgSW5kZXggdmFsdWUsIGFzIGRlZmluZWQgYnkgdGFibGUgMS4xOCBpbiBJU08vSUVDCisgKiAxNDQ5Ni0zLCBmb3IgYSBnaXZlbiBzYW1wbGluZyByYXRlLgorICoKKyAqIFJldHVybnM6IHRoZSBTYW1wbGluZyBGcmVxdWVuY3kgSW5kZXggdmFsdWUgY29ycmVzcG9uZGluZyB0byBAc2FtcGxlX3JhdGUsCisgKiBpZiBzdWNoIGEgdmFsdWUgZXhpc3RzOyBvdGhlcndpc2UgR19NQVhVSU5UOC4KKyAqLworc3RhdGljIGd1aW50OAorZ3N0X2FhY19wYXJzZV9nZXRfYXVkaW9fc2FtcGxpbmdfZnJlcXVlbmN5X2luZGV4IChnaW50IHNhbXBsZV9yYXRlKQoreworICBzd2l0Y2ggKHNhbXBsZV9yYXRlKSB7CisgICAgY2FzZSA5NjAwMDoKKyAgICAgIHJldHVybiAweDBVOworICAgIGNhc2UgODgyMDA6CisgICAgICByZXR1cm4gMHgxVTsKKyAgICBjYXNlIDY0MDAwOgorICAgICAgcmV0dXJuIDB4MlU7CisgICAgY2FzZSA0ODAwMDoKKyAgICAgIHJldHVybiAweDNVOworICAgIGNhc2UgNDQxMDA6CisgICAgICByZXR1cm4gMHg0VTsKKyAgICBjYXNlIDMyMDAwOgorICAgICAgcmV0dXJuIDB4NVU7CisgICAgY2FzZSAyNDAwMDoKKyAgICAgIHJldHVybiAweDZVOworICAgIGNhc2UgMjIwNTA6CisgICAgICByZXR1cm4gMHg3VTsKKyAgICBjYXNlIDE2MDAwOgorICAgICAgcmV0dXJuIDB4OFU7CisgICAgY2FzZSAxMjAwMDoKKyAgICAgIHJldHVybiAweDlVOworICAgIGNhc2UgMTEwMjU6CisgICAgICByZXR1cm4gMHhBVTsKKyAgICBjYXNlIDgwMDA6CisgICAgICByZXR1cm4gMHhCVTsKKyAgICBjYXNlIDczNTA6CisgICAgICByZXR1cm4gMHhDVTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEdfTUFYVUlOVDg7CisgIH0KK30KKworLyoqCisgKiBnc3RfYWFjX3BhcnNlX3ByZXBlbmRfYWR0c19oZWFkZXJzOgorICogQGFhY3BhcnNlOiAjR3N0QWFjUGFyc2UuCisgKiBAZnJhbWU6IHJhdyBBQUMgZnJhbWUgdG8gd2hpY2ggQURUUyBoZWFkZXJzIHNoYWxsIGJlIHByZXBlbmRlZC4KKyAqCisgKiBQcmVwZW5kcyBBRFRTIGhlYWRlcnMgdG8gYSByYXcgQUFDIGF1ZGlvIGZyYW1lLgorICoKKyAqIFJldHVybnM6IFRSVUUgaWYgQURUUyBoZWFkZXJzIHdlcmUgc3VjY2Vzc2Z1bGx5IHByZXBlbmRlZDsgRkFMU0Ugb3RoZXJ3aXNlLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hYWNfcGFyc2VfcHJlcGVuZF9hZHRzX2hlYWRlcnMgKEdzdEFhY1BhcnNlICogYWFjcGFyc2UsCisgICAgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0TWVtb3J5ICptZW07CisgIGd1aW50OCAqYWR0c19oZWFkZXJzOworICBnc2l6ZSBidWZfc2l6ZTsKKyAgZ3NpemUgZnJhbWVfc2l6ZTsKKyAgZ3VpbnQ4IGlkLCBwcm9maWxlLCBjaGFubmVsX2NvbmZpZ3VyYXRpb24sIHNhbXBsaW5nX2ZyZXF1ZW5jeV9pbmRleDsKKworICBpZCA9IChhYWNwYXJzZS0+bXBlZ3ZlcnNpb24gPT0gNCkgPyAweDBVIDogMHgxVTsKKyAgcHJvZmlsZSA9IGdzdF9hYWNfcGFyc2VfZ2V0X2F1ZGlvX3Byb2ZpbGVfb2JqZWN0X3R5cGUgKGFhY3BhcnNlKTsKKyAgaWYgKHByb2ZpbGUgPT0gR19NQVhVSU5UOCkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGFhY3BhcnNlLCAiVW5zdXBwb3J0ZWQgYXVkaW8gcHJvZmlsZSBvciBvYmplY3QgdHlwZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBjaGFubmVsX2NvbmZpZ3VyYXRpb24gPQorICAgICAgZ3N0X2FhY19wYXJzZV9nZXRfYXVkaW9fY2hhbm5lbF9jb25maWd1cmF0aW9uIChhYWNwYXJzZS0+Y2hhbm5lbHMpOworICBpZiAoY2hhbm5lbF9jb25maWd1cmF0aW9uID09IEdfTUFYVUlOVDgpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChhYWNwYXJzZSwgIlVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBzYW1wbGluZ19mcmVxdWVuY3lfaW5kZXggPQorICAgICAgZ3N0X2FhY19wYXJzZV9nZXRfYXVkaW9fc2FtcGxpbmdfZnJlcXVlbmN5X2luZGV4IChhYWNwYXJzZS0+c2FtcGxlX3JhdGUpOworICBpZiAoc2FtcGxpbmdfZnJlcXVlbmN5X2luZGV4ID09IEdfTUFYVUlOVDgpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChhYWNwYXJzZSwgIlVuc3VwcG9ydGVkIHNhbXBsaW5nIGZyZXF1ZW5jeSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGZyYW1lLT5vdXRfYnVmZmVyID0gZ3N0X2J1ZmZlcl9jb3B5IChmcmFtZS0+YnVmZmVyKTsKKyAgYnVmX3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChmcmFtZS0+b3V0X2J1ZmZlcik7CisgIGZyYW1lX3NpemUgPSBidWZfc2l6ZSArIEFEVFNfSEVBREVSU19MRU5HVEg7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGZyYW1lX3NpemUgPj0gMHg0MDAwKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGFhY3BhcnNlLCAiRnJhbWUgc2l6ZSBpcyB0b28gYmlnIGZvciBBRFRTIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgYWR0c19oZWFkZXJzID0gKGd1aW50OCAqKSBnX21hbGxvYzAgKEFEVFNfSEVBREVSU19MRU5HVEgpOworCisgIC8qIE5vdGU6IG5vIGVycm9yIGNvcnJlY3Rpb24gYml0cyBhcmUgYWRkZWQgdG8gdGhlIHJlc3VsdGluZyBBRFRTIGZyYW1lcyAqLworICBhZHRzX2hlYWRlcnNbMF0gPSAweEZGVTsKKyAgYWR0c19oZWFkZXJzWzFdID0gMHhGMFUgfCAoaWQgPDwgMykgfCAweDFVOworICBhZHRzX2hlYWRlcnNbMl0gPSAocHJvZmlsZSA8PCA2KSB8IChzYW1wbGluZ19mcmVxdWVuY3lfaW5kZXggPDwgMikgfCAweDJVIHwKKyAgICAgIChjaGFubmVsX2NvbmZpZ3VyYXRpb24gJiAweDRVKTsKKyAgYWR0c19oZWFkZXJzWzNdID0gKChjaGFubmVsX2NvbmZpZ3VyYXRpb24gJiAweDNVKSA8PCA2KSB8IDB4MzBVIHwKKyAgICAgIChndWludDgpIChmcmFtZV9zaXplID4+IDExKTsKKyAgYWR0c19oZWFkZXJzWzRdID0gKGd1aW50OCkgKChmcmFtZV9zaXplID4+IDMpICYgMHgwMEZGKTsKKyAgYWR0c19oZWFkZXJzWzVdID0gKGd1aW50OCkgKCgoZnJhbWVfc2l6ZSAmIDB4MDAwNykgPDwgNSkgKyAweDFGVSk7CisgIGFkdHNfaGVhZGVyc1s2XSA9IDB4RkNVOworCisgIG1lbSA9IGdzdF9tZW1vcnlfbmV3X3dyYXBwZWQgKDAsIGFkdHNfaGVhZGVycywgQURUU19IRUFERVJTX0xFTkdUSCwgMCwKKyAgICAgIEFEVFNfSEVBREVSU19MRU5HVEgsIGFkdHNfaGVhZGVycywgZ19mcmVlKTsKKyAgZ3N0X2J1ZmZlcl9wcmVwZW5kX21lbW9yeSAoZnJhbWUtPm91dF9idWZmZXIsIG1lbSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogZ3N0X2FhY19wYXJzZV9jaGVja192YWxpZF9mcmFtZToKKyAqIEBwYXJzZTogI0dzdEJhc2VQYXJzZS4KKyAqIEBmcmFtZTogI0dzdEJhc2VQYXJzZUZyYW1lLgorICogQHNraXBzaXplOiBIb3cgbXVjaCBkYXRhIHBhcmVudCBjbGFzcyBzaG91bGQgc2tpcCBpbiBvcmRlciB0byBmaW5kIHRoZQorICogICAgICAgICAgICBmcmFtZSBoZWFkZXIuCisgKgorICogSW1wbGVtZW50YXRpb24gb2YgImhhbmRsZV9mcmFtZSIgdm1ldGhvZCBpbiAjR3N0QmFzZVBhcnNlIGNsYXNzLgorICoKKyAqIEFsc28gZGV0ZXJtaW5lcyBmcmFtZSBvdmVyaGVhZC4KKyAqIEFEVFMgc3RyZWFtcyBoYXZlIGEgNyBieXRlIGhlYWRlciBpbiBlYWNoIGZyYW1lLiBNUDQgYW5kIEFESUYgc3RyZWFtcyBkb24ndCBoYXZlCisgKiBhIHBlci1mcmFtZSBoZWFkZXIuIExPQVMgaGFzIDMgYnl0ZXMuCisgKgorICogV2UncmUgbWFraW5nIGEgY291cGxlIG9mIHNpbXBsaWZ5aW5nIGFzc3VtcHRpb25zOgorICoKKyAqIDEuIFdlIGNvdW50IFByb2dyYW0gQ29uZmlndXJhdGlvbiBFbGVtZW50cyByYXRoZXIgdGhhbiBzZWFyY2hpbmcgZm9yIHRoZW0KKyAqICAgIGluIHRoZSBzdHJlYW1zIHRvIGRpc2NvdW50IHRoZW0gLSB0aGUgb3ZlcmhlYWQgaXMgbmVnbGlnaWJsZS4KKyAqCisgKiAyLiBXZSBpZ25vcmUgQ1JDLiBUaGlzIGhhcyBhIHdvcnN0LWNhc2UgaW1wYWN0IG9mIChudW1fcmF3X2Jsb2NrcyArIDEpKjE2CisgKiAgICBiaXRzLCB3aGljaCBzaG91bGQgc3RpbGwgbm90IGJlIHNpZ25pZmljYW50IGVub3VnaCB0byB3YXJyYW50IHRoZQorICogICAgYWRkaXRpb25hbCBwYXJzaW5nIHRocm91Z2ggdGhlIGhlYWRlcnMKKyAqCisgKiBSZXR1cm5zOiBhICNHc3RGbG93UmV0dXJuLgorICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2FhY19wYXJzZV9oYW5kbGVfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUsIGdpbnQgKiBza2lwc2l6ZSkKK3sKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdEFhY1BhcnNlICphYWNwYXJzZTsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisgIGdib29sZWFuIGxvc3Rfc3luYzsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIGd1aW50IGZyYW1lc2l6ZTsKKyAgZ2ludCByYXRlID0gMCwgY2hhbm5lbHMgPSAwOworCisgIGFhY3BhcnNlID0gR1NUX0FBQ19QQVJTRSAocGFyc2UpOworICBidWZmZXIgPSBmcmFtZS0+YnVmZmVyOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgKnNraXBzaXplID0gLTE7CisgIGxvc3Rfc3luYyA9IEdTVF9CQVNFX1BBUlNFX0xPU1RfU1lOQyAocGFyc2UpOworCisgIGlmIChhYWNwYXJzZS0+aGVhZGVyX3R5cGUgPT0gRFNQQUFDX0hFQURFUl9BRElGIHx8CisgICAgICBhYWNwYXJzZS0+aGVhZGVyX3R5cGUgPT0gRFNQQUFDX0hFQURFUl9OT05FKSB7CisgICAgLyogVGhlcmUgaXMgbm90aGluZyB0byBwYXJzZSAqLworICAgIGZyYW1lc2l6ZSA9IG1hcC5zaXplOworICAgIHJldCA9IFRSVUU7CisKKyAgfSBlbHNlIGlmIChhYWNwYXJzZS0+aGVhZGVyX3R5cGUgPT0gRFNQQUFDX0hFQURFUl9OT1RfUEFSU0VEIHx8IGxvc3Rfc3luYykgeworCisgICAgcmV0ID0gZ3N0X2FhY19wYXJzZV9kZXRlY3Rfc3RyZWFtIChhYWNwYXJzZSwgbWFwLmRhdGEsIG1hcC5zaXplLAorICAgICAgICBHU1RfQkFTRV9QQVJTRV9EUkFJTklORyAocGFyc2UpLCAmZnJhbWVzaXplLCBza2lwc2l6ZSk7CisKKyAgfSBlbHNlIGlmIChhYWNwYXJzZS0+aGVhZGVyX3R5cGUgPT0gRFNQQUFDX0hFQURFUl9BRFRTKSB7CisgICAgZ3VpbnQgbmVlZGVkX2RhdGEgPSAxMDI0OworCisgICAgcmV0ID0gZ3N0X2FhY19wYXJzZV9jaGVja19hZHRzX2ZyYW1lIChhYWNwYXJzZSwgbWFwLmRhdGEsIG1hcC5zaXplLAorICAgICAgICBHU1RfQkFTRV9QQVJTRV9EUkFJTklORyAocGFyc2UpLCAmZnJhbWVzaXplLCAmbmVlZGVkX2RhdGEpOworCisgICAgaWYgKCFyZXQgJiYgbmVlZGVkX2RhdGEpIHsKKyAgICAgIEdTVF9ERUJVRyAoImJ1ZmZlciBkaWRuJ3QgY29udGFpbiB2YWxpZCBmcmFtZSIpOworICAgICAgKnNraXBzaXplID0gMDsKKyAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKSwKKyAgICAgICAgICBuZWVkZWRfZGF0YSk7CisgICAgfQorCisgIH0gZWxzZSBpZiAoYWFjcGFyc2UtPmhlYWRlcl90eXBlID09IERTUEFBQ19IRUFERVJfTE9BUykgeworICAgIGd1aW50IG5lZWRlZF9kYXRhID0gMTAyNDsKKworICAgIHJldCA9IGdzdF9hYWNfcGFyc2VfY2hlY2tfbG9hc19mcmFtZSAoYWFjcGFyc2UsIG1hcC5kYXRhLAorICAgICAgICBtYXAuc2l6ZSwgR1NUX0JBU0VfUEFSU0VfRFJBSU5JTkcgKHBhcnNlKSwgJmZyYW1lc2l6ZSwgJm5lZWRlZF9kYXRhKTsKKworICAgIGlmICghcmV0ICYmIG5lZWRlZF9kYXRhKSB7CisgICAgICBHU1RfREVCVUcgKCJidWZmZXIgZGlkbid0IGNvbnRhaW4gdmFsaWQgZnJhbWUiKTsKKyAgICAgICpza2lwc2l6ZSA9IDA7CisgICAgICBnc3RfYmFzZV9wYXJzZV9zZXRfbWluX2ZyYW1lX3NpemUgKEdTVF9CQVNFX1BBUlNFIChhYWNwYXJzZSksCisgICAgICAgICAgbmVlZGVkX2RhdGEpOworICAgIH0KKworICB9IGVsc2UgeworICAgIEdTVF9ERUJVRyAoImJ1ZmZlciBkaWRuJ3QgY29udGFpbiB2YWxpZCBmcmFtZSIpOworICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKSwKKyAgICAgICAgQURUU19NQVhfU0laRSk7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoIXJldCkpCisgICAgZ290byBleGl0OworCisgIGlmIChhYWNwYXJzZS0+aGVhZGVyX3R5cGUgPT0gRFNQQUFDX0hFQURFUl9BRFRTKSB7CisgICAgLyogc2VlIGFib3ZlICovCisgICAgZnJhbWUtPm92ZXJoZWFkID0gNzsKKworICAgIGdzdF9hYWNfcGFyc2VfcGFyc2VfYWR0c19oZWFkZXIgKGFhY3BhcnNlLCBtYXAuZGF0YSwKKyAgICAgICAgJnJhdGUsICZjaGFubmVscywgTlVMTCwgTlVMTCk7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoYWFjcGFyc2UsICJyYXRlOiAlZCwgY2hhbnM6ICVkIiwgcmF0ZSwgY2hhbm5lbHMpOworCisgICAgaWYgKEdfVU5MSUtFTFkgKHJhdGUgIT0gYWFjcGFyc2UtPnNhbXBsZV9yYXRlCisgICAgICAgICAgICB8fCBjaGFubmVscyAhPSBhYWNwYXJzZS0+Y2hhbm5lbHMpKSB7CisgICAgICBhYWNwYXJzZS0+c2FtcGxlX3JhdGUgPSByYXRlOworICAgICAgYWFjcGFyc2UtPmNoYW5uZWxzID0gY2hhbm5lbHM7CisKKyAgICAgIGlmICghZ3N0X2FhY19wYXJzZV9zZXRfc3JjX2NhcHMgKGFhY3BhcnNlLCBOVUxMKSkgeworICAgICAgICAvKiBJZiBsaW5raW5nIGZhaWxzLCB3ZSBuZWVkIHRvIHJldHVybiBhcHByb3ByaWF0ZSBlcnJvciAqLworICAgICAgICByZXQgPSBHU1RfRkxPV19OT1RfTElOS0VEOworICAgICAgfQorCisgICAgICBnc3RfYmFzZV9wYXJzZV9zZXRfZnJhbWVfcmF0ZSAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKSwKKyAgICAgICAgICBhYWNwYXJzZS0+c2FtcGxlX3JhdGUsIGFhY3BhcnNlLT5mcmFtZV9zYW1wbGVzLCAyLCAyKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoYWFjcGFyc2UtPmhlYWRlcl90eXBlID09IERTUEFBQ19IRUFERVJfTE9BUykgeworICAgIGdib29sZWFuIHNldGNhcHMgPSBGQUxTRTsKKworICAgIC8qIHNlZSBhYm92ZSAqLworICAgIGZyYW1lLT5vdmVyaGVhZCA9IDM7CisKKyAgICBpZiAoIWdzdF9hYWNfcGFyc2VfcmVhZF9sb2FzX2NvbmZpZyAoYWFjcGFyc2UsIG1hcC5kYXRhLCBtYXAuc2l6ZSwgJnJhdGUsCisgICAgICAgICAgICAmY2hhbm5lbHMsIE5VTEwpIHx8ICFyYXRlIHx8ICFjaGFubmVscykgeworICAgICAgLyogVGhpcyBpcyBwcmV0dHkgbm9ybWFsIHdoZW4gc2tpcHBpbmcgZGF0YSBhdCB0aGUgc3RhcnQgb2YKKyAgICAgICAqIHJhbmRvbSBzdHJlYW0gKE1QRUctVFMgY2FwdHVyZSBmb3IgZXhhbXBsZSkgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFhY3BhcnNlLCAiRXJyb3IgcmVhZGluZyBMT0FTIGNvbmZpZy4gU2tpcHBpbmcuIik7CisgICAgICAvKiBTaW5jZSB3ZSBkb24ndCBmdWxseSBwYXJzZSB0aGUgTE9BUyBjb25maWcsIHdlIGRvbid0IGtub3cgZm9yIHN1cmUKKyAgICAgICAqIGhvdyBtdWNoIHRvIHNraXAuIEp1c3Qgc2tpcCAxIHRvIGVuZCB1cCB0byB0aGUgbmV4dCBtYXJrZXIgYW5kCisgICAgICAgKiByZXN1bWUgcGFyc2luZyBmcm9tIHRoZXJlICovCisgICAgICAqc2tpcHNpemUgPSAxOworICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGlmIChHX1VOTElLRUxZIChyYXRlICE9IGFhY3BhcnNlLT5zYW1wbGVfcmF0ZQorICAgICAgICAgICAgfHwgY2hhbm5lbHMgIT0gYWFjcGFyc2UtPmNoYW5uZWxzKSkgeworICAgICAgYWFjcGFyc2UtPnNhbXBsZV9yYXRlID0gcmF0ZTsKKyAgICAgIGFhY3BhcnNlLT5jaGFubmVscyA9IGNoYW5uZWxzOworICAgICAgc2V0Y2FwcyA9IFRSVUU7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGFhY3BhcnNlLCAiTmV3IExPQVMgY29uZmlnOiAlZCBIeiwgJWQgY2hhbm5lbHMiLCByYXRlLAorICAgICAgICAgIGNoYW5uZWxzKTsKKyAgICB9CisKKyAgICAvKiBXZSB3YW50IHRvIHNldCBjYXBzIGJvdGggYXQgc3RhcnQsIGFuZCB3aGVuIHJhdGUvY2hhbm5lbHMgY2hhbmdlLgorICAgICAgIFNpbmNlIG9ubHkgc29tZSBMT0FTIGZyYW1lcyBoYXZlIHRoYXQgaW5mbywgd2UgbWF5IHJlY2VpdmUgZnJhbWVzCisgICAgICAgYmVmb3JlIGtub3dpbmcgYWJvdXQgcmF0ZS9jaGFubmVscy4gKi8KKyAgICBpZiAoc2V0Y2FwcworICAgICAgICB8fCAhZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChhYWNwYXJzZSkpKSB7CisgICAgICBpZiAoIWdzdF9hYWNfcGFyc2Vfc2V0X3NyY19jYXBzIChhYWNwYXJzZSwgTlVMTCkpIHsKKyAgICAgICAgLyogSWYgbGlua2luZyBmYWlscywgd2UgbmVlZCB0byByZXR1cm4gYXBwcm9wcmlhdGUgZXJyb3IgKi8KKyAgICAgICAgcmV0ID0gR1NUX0ZMT1dfTk9UX0xJTktFRDsKKyAgICAgIH0KKworICAgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X2ZyYW1lX3JhdGUgKEdTVF9CQVNFX1BBUlNFIChhYWNwYXJzZSksCisgICAgICAgICAgYWFjcGFyc2UtPnNhbXBsZV9yYXRlLCBhYWNwYXJzZS0+ZnJhbWVfc2FtcGxlcywgMiwgMik7CisgICAgfQorICB9CisKKyAgaWYgKGFhY3BhcnNlLT5oZWFkZXJfdHlwZSA9PSBEU1BBQUNfSEVBREVSX05PTkUKKyAgICAgICYmIGFhY3BhcnNlLT5vdXRwdXRfaGVhZGVyX3R5cGUgPT0gRFNQQUFDX0hFQURFUl9BRFRTKSB7CisgICAgaWYgKCFnc3RfYWFjX3BhcnNlX3ByZXBlbmRfYWR0c19oZWFkZXJzIChhYWNwYXJzZSwgZnJhbWUpKSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChhYWNwYXJzZSwgIkZhaWxlZCB0byBwcmVwZW5kIEFEVFMgaGVhZGVycyB0byBmcmFtZSIpOworICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgfQorICB9CisKK2V4aXQ6CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKKyAgaWYgKHJldCkgeworICAgIC8qIGZvdW5kLCBza2lwIGlmIG5lZWRlZCAqLworICAgIGlmICgqc2tpcHNpemUgPiAwKQorICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgICpza2lwc2l6ZSA9IDA7CisgIH0gZWxzZSB7CisgICAgaWYgKCpza2lwc2l6ZSA8IDApCisgICAgICAqc2tpcHNpemUgPSAxOworICB9CisKKyAgaWYgKHJldCAmJiBmcmFtZXNpemUgPD0gbWFwLnNpemUpIHsKKyAgICByZXR1cm4gZ3N0X2Jhc2VfcGFyc2VfZmluaXNoX2ZyYW1lIChwYXJzZSwgZnJhbWUsIGZyYW1lc2l6ZSk7CisgIH0KKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYWFjX3BhcnNlX3ByZV9wdXNoX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0QWFjUGFyc2UgKmFhY3BhcnNlID0gR1NUX0FBQ19QQVJTRSAocGFyc2UpOworCisgIGlmICghYWFjcGFyc2UtPnNlbnRfY29kZWNfdGFnKSB7CisgICAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgLyogY29kZWMgdGFnICovCisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpKTsKKyAgICBpZiAoY2FwcyA9PSBOVUxMKSB7CisgICAgICBpZiAoR1NUX1BBRF9JU19GTFVTSElORyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpKSkgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHBhcnNlLCAiU3JjIHBhZCBpcyBmbHVzaGluZyIpOworICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRkxVU0hJTkc7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHBhcnNlLCAiU3JjIHBhZCBpcyBub3QgbmVnb3RpYXRlZCEiKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICAgICAgfQorICAgIH0KKworICAgIHRhZ2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAgIGdzdF9wYl91dGlsc19hZGRfY29kZWNfZGVzY3JpcHRpb25fdG9fdGFnX2xpc3QgKHRhZ2xpc3QsCisgICAgICAgIEdTVF9UQUdfQVVESU9fQ09ERUMsIGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAgIGdzdF9iYXNlX3BhcnNlX21lcmdlX3RhZ3MgKHBhcnNlLCB0YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UpOworICAgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnbGlzdCk7CisKKyAgICAvKiBhbHNvIHNpZ25hbHMgdGhlIGVuZCBvZiBmaXJzdC1mcmFtZSBwcm9jZXNzaW5nICovCisgICAgYWFjcGFyc2UtPnNlbnRfY29kZWNfdGFnID0gVFJVRTsKKyAgfQorCisgIC8qIEFzIGEgc3BlY2lhbCBjYXNlLCB3ZSBjYW4gcmVtb3ZlIHRoZSBBRFRTIGZyYW1pbmcgYW5kIG91dHB1dCByYXcgQUFDLiAqLworICBpZiAoYWFjcGFyc2UtPmhlYWRlcl90eXBlID09IERTUEFBQ19IRUFERVJfQURUUworICAgICAgJiYgYWFjcGFyc2UtPm91dHB1dF9oZWFkZXJfdHlwZSA9PSBEU1BBQUNfSEVBREVSX05PTkUpIHsKKyAgICBndWludCBoZWFkZXJfc2l6ZTsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBmcmFtZS0+b3V0X2J1ZmZlciA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoZnJhbWUtPmJ1ZmZlcik7CisgICAgZnJhbWUtPmJ1ZmZlciA9IE5VTEw7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKGZyYW1lLT5vdXRfYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIGhlYWRlcl9zaXplID0gKG1hcC5kYXRhWzFdICYgMSkgPyA3IDogOTsgICAgLyogb3B0aW9uYWwgQ1JDICovCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoZnJhbWUtPm91dF9idWZmZXIsICZtYXApOworICAgIGdzdF9idWZmZXJfcmVzaXplIChmcmFtZS0+b3V0X2J1ZmZlciwgaGVhZGVyX3NpemUsCisgICAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGZyYW1lLT5vdXRfYnVmZmVyKSAtIGhlYWRlcl9zaXplKTsKKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworCisvKioKKyAqIGdzdF9hYWNfcGFyc2Vfc3RhcnQ6CisgKiBAcGFyc2U6ICNHc3RCYXNlUGFyc2UuCisgKgorICogSW1wbGVtZW50YXRpb24gb2YgInN0YXJ0IiB2bWV0aG9kIGluICNHc3RCYXNlUGFyc2UgY2xhc3MuCisgKgorICogUmV0dXJuczogVFJVRSBpZiBzdGFydHVwIHN1Y2NlZWRlZC4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYWFjX3BhcnNlX3N0YXJ0IChHc3RCYXNlUGFyc2UgKiBwYXJzZSkKK3sKKyAgR3N0QWFjUGFyc2UgKmFhY3BhcnNlOworCisgIGFhY3BhcnNlID0gR1NUX0FBQ19QQVJTRSAocGFyc2UpOworICBHU1RfREVCVUcgKCJzdGFydCIpOworICBhYWNwYXJzZS0+ZnJhbWVfc2FtcGxlcyA9IDEwMjQ7CisgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKSwgQURUU19NQVhfU0laRSk7CisgIGFhY3BhcnNlLT5zZW50X2NvZGVjX3RhZyA9IEZBTFNFOworICBhYWNwYXJzZS0+bGFzdF9wYXJzZWRfY2hhbm5lbHMgPSAwOworICBhYWNwYXJzZS0+bGFzdF9wYXJzZWRfc2FtcGxlX3JhdGUgPSAwOworICBhYWNwYXJzZS0+b2JqZWN0X3R5cGUgPSAwOworICBhYWNwYXJzZS0+Yml0cmF0ZSA9IDA7CisgIGFhY3BhcnNlLT5oZWFkZXJfdHlwZSA9IERTUEFBQ19IRUFERVJfTk9UX1BBUlNFRDsKKyAgYWFjcGFyc2UtPm91dHB1dF9oZWFkZXJfdHlwZSA9IERTUEFBQ19IRUFERVJfTk9UX1BBUlNFRDsKKyAgYWFjcGFyc2UtPmNoYW5uZWxzID0gMDsKKyAgYWFjcGFyc2UtPnNhbXBsZV9yYXRlID0gMDsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqCisgKiBnc3RfYWFjX3BhcnNlX3N0b3A6CisgKiBAcGFyc2U6ICNHc3RCYXNlUGFyc2UuCisgKgorICogSW1wbGVtZW50YXRpb24gb2YgInN0b3AiIHZtZXRob2QgaW4gI0dzdEJhc2VQYXJzZSBjbGFzcy4KKyAqCisgKiBSZXR1cm5zOiBUUlVFIGlzIHN0b3BwaW5nIHN1Y2NlZWRlZC4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYWFjX3BhcnNlX3N0b3AgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKQoreworICBHU1RfREVCVUcgKCJzdG9wIik7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX2ZpZWxkcyAoR3N0Q2FwcyAqIGNhcHMpCit7CisgIGd1aW50IGksIG47CisKKyAgbiA9IGdzdF9jYXBzX2dldF9zaXplIChjYXBzKTsKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIGkpOworCisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJmcmFtZWQiKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorYWRkX2NvbnZlcnNpb25fZmllbGRzIChHc3RDYXBzICogY2FwcykKK3sKKyAgZ3VpbnQgaSwgbjsKKworICBuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpOworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgR3N0U3RydWN0dXJlICpzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSk7CisKKyAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHMsICJzdHJlYW0tZm9ybWF0IikpIHsKKyAgICAgIGNvbnN0IEdWYWx1ZSAqdiA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAic3RyZWFtLWZvcm1hdCIpOworCisgICAgICBpZiAoR19WQUxVRV9IT0xEU19TVFJJTkcgKHYpKSB7CisgICAgICAgIGNvbnN0IGdjaGFyICpzdHIgPSBnX3ZhbHVlX2dldF9zdHJpbmcgKHYpOworCisgICAgICAgIGlmIChzdHJjbXAgKHN0ciwgImFkdHMiKSA9PSAwIHx8IHN0cmNtcCAoc3RyLCAicmF3IikgPT0gMCkgeworICAgICAgICAgIEdWYWx1ZSB2YSA9IEdfVkFMVUVfSU5JVDsKKyAgICAgICAgICBHVmFsdWUgdnMgPSBHX1ZBTFVFX0lOSVQ7CisKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZ2YSwgR1NUX1RZUEVfTElTVCk7CisgICAgICAgICAgZ192YWx1ZV9pbml0ICgmdnMsIEdfVFlQRV9TVFJJTkcpOworICAgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAoJnZzLCAiYWR0cyIpOworICAgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJnZhLCAmdnMpOworICAgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAoJnZzLCAicmF3Iik7CisgICAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmdmEsICZ2cyk7CisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKHMsICJzdHJlYW0tZm9ybWF0IiwgJnZhKTsKKyAgICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdmEpOworICAgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZ2cyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoR1NUX1ZBTFVFX0hPTERTX0xJU1QgKHYpKSB7CisgICAgICAgIGdib29sZWFuIGNvbnRhaW5zX3JhdyA9IEZBTFNFOworICAgICAgICBnYm9vbGVhbiBjb250YWluc19hZHRzID0gRkFMU0U7CisgICAgICAgIGd1aW50IG0gPSBnc3RfdmFsdWVfbGlzdF9nZXRfc2l6ZSAodiksIGo7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG07IGorKykgeworICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmUgPSBnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUgKHYsIGopOworICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHI7CisKKyAgICAgICAgICBpZiAoR19WQUxVRV9IT0xEU19TVFJJTkcgKHZlKSAmJiAoc3RyID0gZ192YWx1ZV9nZXRfc3RyaW5nICh2ZSkpKSB7CisgICAgICAgICAgICBpZiAoc3RyY21wIChzdHIsICJhZHRzIikgPT0gMCkKKyAgICAgICAgICAgICAgY29udGFpbnNfYWR0cyA9IFRSVUU7CisgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKHN0ciwgInJhdyIpID09IDApCisgICAgICAgICAgICAgIGNvbnRhaW5zX3JhdyA9IFRSVUU7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbnRhaW5zX2FkdHMgfHwgY29udGFpbnNfcmF3KSB7CisgICAgICAgICAgR1ZhbHVlIHZhID0gR19WQUxVRV9JTklUOworICAgICAgICAgIEdWYWx1ZSB2cyA9IEdfVkFMVUVfSU5JVDsKKworICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJnZhLCBHU1RfVFlQRV9MSVNUKTsKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZ2cywgR19UWVBFX1NUUklORyk7CisgICAgICAgICAgZ192YWx1ZV9jb3B5ICh2LCAmdmEpOworCisgICAgICAgICAgaWYgKCFjb250YWluc19yYXcpIHsKKyAgICAgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAoJnZzLCAicmF3Iik7CisgICAgICAgICAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfdmFsdWUgKCZ2YSwgJnZzKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFjb250YWluc19hZHRzKSB7CisgICAgICAgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKCZ2cywgImFkdHMiKTsKKyAgICAgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJnZhLCAmdnMpOworICAgICAgICAgIH0KKworICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChzLCAic3RyZWFtLWZvcm1hdCIsICZ2YSk7CisKKyAgICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdnMpOworICAgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZ2YSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X2FhY19wYXJzZV9zaW5rX2dldGNhcHMgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RDYXBzICpwZWVyY2FwcywgKnRlbXBsOworICBHc3RDYXBzICpyZXM7CisKKyAgdGVtcGwgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU0lOS19QQUQgKHBhcnNlKSk7CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKmZjb3B5ID0gZ3N0X2NhcHNfY29weSAoZmlsdGVyKTsKKyAgICAvKiBSZW1vdmUgdGhlIGZpZWxkcyB3ZSBjb252ZXJ0ICovCisgICAgcmVtb3ZlX2ZpZWxkcyAoZmNvcHkpOworICAgIGFkZF9jb252ZXJzaW9uX2ZpZWxkcyAoZmNvcHkpOworICAgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSwgZmNvcHkpOworICAgIGdzdF9jYXBzX3VucmVmIChmY29weSk7CisgIH0gZWxzZQorICAgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSwgTlVMTCk7CisKKyAgaWYgKHBlZXJjYXBzKSB7CisgICAgcGVlcmNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChwZWVyY2Fwcyk7CisgICAgLyogUmVtb3ZlIHRoZSBmaWVsZHMgd2UgY29udmVydCAqLworICAgIHJlbW92ZV9maWVsZHMgKHBlZXJjYXBzKTsKKyAgICBhZGRfY29udmVyc2lvbl9maWVsZHMgKHBlZXJjYXBzKTsKKworICAgIHJlcyA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChwZWVyY2FwcywgdGVtcGwsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGVtcGwpOworICB9IGVsc2UgeworICAgIHJlcyA9IHRlbXBsOworICB9CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKmludGVyc2VjdGlvbjsKKworICAgIGludGVyc2VjdGlvbiA9CisgICAgICAgIGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHJlcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmVzKTsKKyAgICByZXMgPSBpbnRlcnNlY3Rpb247CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hYWNfcGFyc2Vfc3JjX2V2ZW50IChHc3RCYXNlUGFyc2UgKiBwYXJzZSwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0QWFjUGFyc2UgKmFhY3BhcnNlID0gR1NUX0FBQ19QQVJTRSAocGFyc2UpOworCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID09IEdTVF9FVkVOVF9GTFVTSF9TVE9QKSB7CisgICAgYWFjcGFyc2UtPmxhc3RfcGFyc2VkX2NoYW5uZWxzID0gMDsKKyAgICBhYWNwYXJzZS0+bGFzdF9wYXJzZWRfc2FtcGxlX3JhdGUgPSAwOworICB9CisKKyAgcmV0dXJuIEdTVF9CQVNFX1BBUlNFX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zcmNfZXZlbnQgKHBhcnNlLCBldmVudCk7Cit9CmRpZmYgLS1naXQgYS9nc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmggYi9nc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBjOTZmZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuaApAQCAtMCwwICsxLDEwNSBAQAorLyogR1N0cmVhbWVyIEFBQyBwYXJzZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0OiBTdGVmYW4gS29zdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfQUFDX1BBUlNFX0hfXworI2RlZmluZSBfX0dTVF9BQUNfUEFSU0VfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXBhcnNlLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9BQUNfUEFSU0UgXAorICAoZ3N0X2FhY19wYXJzZV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQUFDX1BBUlNFKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksIEdTVF9UWVBFX0FBQ19QQVJTRSwgR3N0QWFjUGFyc2UpKQorI2RlZmluZSBHU1RfQUFDX1BBUlNFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLCBHU1RfVFlQRV9BQUNfUEFSU0UsIEdzdEFhY1BhcnNlQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQUFDX1BBUlNFKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksIEdTVF9UWVBFX0FBQ19QQVJTRSkpCisjZGVmaW5lIEdTVF9JU19BQUNfUEFSU0VfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksIEdTVF9UWVBFX0FBQ19QQVJTRSkpCisKKworLyoqCisgKiBHc3RBYWNIZWFkZXJUeXBlOgorICogQERTUEFBQ19IRUFERVJfTk9UX1BBUlNFRDogSGVhZGVyIG5vdCBwYXJzZWQgeWV0LgorICogQERTUEFBQ19IRUFERVJfVU5LTk9XTjogVW5rbm93biAobm90IHJlY29nbml6ZWQpIGhlYWRlci4KKyAqIEBEU1BBQUNfSEVBREVSX0FESUY6IEFESUYgaGVhZGVyIGZvdW5kLgorICogQERTUEFBQ19IRUFERVJfQURUUzogQURUUyBoZWFkZXIgZm91bmQuCisgKiBARFNQQUFDX0hFQURFUl9MT0FTOiBMT0FTIGhlYWRlciBmb3VuZC4KKyAqIEBEU1BBQUNfSEVBREVSX05PTkU6IFJhdyBzdHJlYW0sIG5vIGhlYWRlci4KKyAqCisgKiBUeXBlIGhlYWRlciBlbnVtZXJhdGlvbiBzZXQgaW4gI2hlYWRlcl90eXBlLgorICovCit0eXBlZGVmIGVudW0geworICBEU1BBQUNfSEVBREVSX05PVF9QQVJTRUQsCisgIERTUEFBQ19IRUFERVJfVU5LTk9XTiwKKyAgRFNQQUFDX0hFQURFUl9BRElGLAorICBEU1BBQUNfSEVBREVSX0FEVFMsCisgIERTUEFBQ19IRUFERVJfTE9BUywKKyAgRFNQQUFDX0hFQURFUl9OT05FCit9IEdzdEFhY0hlYWRlclR5cGU7CisKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEFhY1BhcnNlIEdzdEFhY1BhcnNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEFhY1BhcnNlQ2xhc3MgR3N0QWFjUGFyc2VDbGFzczsKKworLyoqCisgKiBHc3RBYWNQYXJzZToKKyAqCisgKiBUaGUgb3BhcXVlIEdzdEFhY1BhcnNlIGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdEFhY1BhcnNlIHsKKyAgR3N0QmFzZVBhcnNlIGVsZW1lbnQ7CisKKyAgLyogU3RyZWFtIHR5cGUgLXJlbGF0ZWQgaW5mbyAqLworICBnaW50ICAgICAgICAgICBvYmplY3RfdHlwZTsKKyAgZ2ludCAgICAgICAgICAgYml0cmF0ZTsKKyAgZ2ludCAgICAgICAgICAgc2FtcGxlX3JhdGU7CisgIGdpbnQgICAgICAgICAgIGNoYW5uZWxzOworICBnaW50ICAgICAgICAgICBtcGVndmVyc2lvbjsKKyAgZ2ludCAgICAgICAgICAgZnJhbWVfc2FtcGxlczsKKworICBHc3RBYWNIZWFkZXJUeXBlIGhlYWRlcl90eXBlOworICBHc3RBYWNIZWFkZXJUeXBlIG91dHB1dF9oZWFkZXJfdHlwZTsKKworICBnYm9vbGVhbiBzZW50X2NvZGVjX3RhZzsKKworICBnaW50IGxhc3RfcGFyc2VkX3NhbXBsZV9yYXRlOworICBnaW50IGxhc3RfcGFyc2VkX2NoYW5uZWxzOworfTsKKworLyoqCisgKiBHc3RBYWNQYXJzZUNsYXNzOgorICogQHBhcmVudF9jbGFzczogRWxlbWVudCBwYXJlbnQgY2xhc3MuCisgKgorICogVGhlIG9wYXF1ZSBHc3RBYWNQYXJzZUNsYXNzIGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdEFhY1BhcnNlQ2xhc3MgeworICBHc3RCYXNlUGFyc2VDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfYWFjX3BhcnNlX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0FBQ19QQVJTRV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYyBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmM4NzcwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jCkBAIC0wLDAgKzEsOTUzIEBACisvKiBHU3RyZWFtZXIgQUMzIHBhcnNlcgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXcgdXNlcnMgc2YgbmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBDb250YWN0OiBTdGVmYW4gS29zdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1hYzNwYXJzZQorICogQHNob3J0X2Rlc2NyaXB0aW9uOiBBQzMgcGFyc2VyCisgKiBAc2VlX2Fsc286ICNHc3RBbXJQYXJzZSwgI0dzdEFBQ1BhcnNlCisgKgorICogVGhpcyBpcyBhbiBBQzMgcGFyc2VyLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPWFiYy5hYzMgISBhYzNwYXJzZSAhIGE1MmRlYyAhIGF1ZGlvcmVzYW1wbGUgISBhdWRpb2NvbnZlcnQgISBhdXRvYXVkaW9zaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisvKiBUT0RPOgorICogIC0gYXVkaW8vYWMzIHRvIGF1ZGlvL3gtcHJpdmF0ZTEtYWMzIGlzIG5vdCBpbXBsZW1lbnRlZCAoZG9uZSBpbiB0aGUgbXV4ZXIpCisgKiAgLSBzaG91bGQgYWNjZXB0IGZyYW1lZCBhbmQgdW5mcmFtZWQgaW5wdXQgKG5lZWRzIGRlY29kZWJpbiBmaXhlcyBmaXJzdCkKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdGFjM3BhcnNlLmgiCisjaW5jbHVkZSA8Z3N0L2Jhc2UvYmFzZS5oPgorI2luY2x1ZGUgPGdzdC9wYnV0aWxzL3BidXRpbHMuaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoYWMzX3BhcnNlX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGFjM19wYXJzZV9kZWJ1ZworCitzdGF0aWMgY29uc3Qgc3RydWN0Cit7CisgIGNvbnN0IGd1aW50IGJpdF9yYXRlOyAgICAgICAgIC8qIG5vbWluYWwgYml0IHJhdGUgKi8KKyAgY29uc3QgZ3VpbnQgZnJhbWVfc2l6ZVszXTsgICAgLyogZnJhbWUgc2l6ZSBmb3IgMzJrSHosIDQ0a0h6LCBhbmQgNDhrSHogKi8KK30gZnJtc2l6Y29kX3RhYmxlWzM4XSA9IHsKKyAgeworICAgIDMyLCB7CisgIDY0LCA2OSwgOTZ9fSwgeworICAgIDMyLCB7CisgIDY0LCA3MCwgOTZ9fSwgeworICAgIDQwLCB7CisgIDgwLCA4NywgMTIwfX0sIHsKKyAgICA0MCwgeworICA4MCwgODgsIDEyMH19LCB7CisgICAgNDgsIHsKKyAgOTYsIDEwNCwgMTQ0fX0sIHsKKyAgICA0OCwgeworICA5NiwgMTA1LCAxNDR9fSwgeworICAgIDU2LCB7CisgIDExMiwgMTIxLCAxNjh9fSwgeworICAgIDU2LCB7CisgIDExMiwgMTIyLCAxNjh9fSwgeworICAgIDY0LCB7CisgIDEyOCwgMTM5LCAxOTJ9fSwgeworICAgIDY0LCB7CisgIDEyOCwgMTQwLCAxOTJ9fSwgeworICAgIDgwLCB7CisgIDE2MCwgMTc0LCAyNDB9fSwgeworICAgIDgwLCB7CisgIDE2MCwgMTc1LCAyNDB9fSwgeworICAgIDk2LCB7CisgIDE5MiwgMjA4LCAyODh9fSwgeworICAgIDk2LCB7CisgIDE5MiwgMjA5LCAyODh9fSwgeworICAgIDExMiwgeworICAyMjQsIDI0MywgMzM2fX0sIHsKKyAgICAxMTIsIHsKKyAgMjI0LCAyNDQsIDMzNn19LCB7CisgICAgMTI4LCB7CisgIDI1NiwgMjc4LCAzODR9fSwgeworICAgIDEyOCwgeworICAyNTYsIDI3OSwgMzg0fX0sIHsKKyAgICAxNjAsIHsKKyAgMzIwLCAzNDgsIDQ4MH19LCB7CisgICAgMTYwLCB7CisgIDMyMCwgMzQ5LCA0ODB9fSwgeworICAgIDE5MiwgeworICAzODQsIDQxNywgNTc2fX0sIHsKKyAgICAxOTIsIHsKKyAgMzg0LCA0MTgsIDU3Nn19LCB7CisgICAgMjI0LCB7CisgIDQ0OCwgNDg3LCA2NzJ9fSwgeworICAgIDIyNCwgeworICA0NDgsIDQ4OCwgNjcyfX0sIHsKKyAgICAyNTYsIHsKKyAgNTEyLCA1NTcsIDc2OH19LCB7CisgICAgMjU2LCB7CisgIDUxMiwgNTU4LCA3Njh9fSwgeworICAgIDMyMCwgeworICA2NDAsIDY5NiwgOTYwfX0sIHsKKyAgICAzMjAsIHsKKyAgNjQwLCA2OTcsIDk2MH19LCB7CisgICAgMzg0LCB7CisgIDc2OCwgODM1LCAxMTUyfX0sIHsKKyAgICAzODQsIHsKKyAgNzY4LCA4MzYsIDExNTJ9fSwgeworICAgIDQ0OCwgeworICA4OTYsIDk3NSwgMTM0NH19LCB7CisgICAgNDQ4LCB7CisgIDg5NiwgOTc2LCAxMzQ0fX0sIHsKKyAgICA1MTIsIHsKKyAgMTAyNCwgMTExNCwgMTUzNn19LCB7CisgICAgNTEyLCB7CisgIDEwMjQsIDExMTUsIDE1MzZ9fSwgeworICAgIDU3NiwgeworICAxMTUyLCAxMjUzLCAxNzI4fX0sIHsKKyAgICA1NzYsIHsKKyAgMTE1MiwgMTI1NCwgMTcyOH19LCB7CisgICAgNjQwLCB7CisgIDEyODAsIDEzOTMsIDE5MjB9fSwgeworICAgIDY0MCwgeworICAxMjgwLCAxMzk0LCAxOTIwfX0KK307CisKK3N0YXRpYyBjb25zdCBndWludCBmc2NvZF9yYXRlc1s0XSA9IHsgNDgwMDAsIDQ0MTAwLCAzMjAwMCwgMCB9Oworc3RhdGljIGNvbnN0IGd1aW50IGFjbW9kX2NoYW5zWzhdID0geyAyLCAxLCAyLCAzLCAzLCA0LCA0LCA1IH07CitzdGF0aWMgY29uc3QgZ3VpbnQgbnVtYmxrc1s0XSA9IHsgMSwgMiwgMywgNiB9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtYWMzLCBmcmFtZWQgPSAoYm9vbGVhbikgdHJ1ZSwgIgorICAgICAgICAiIGNoYW5uZWxzID0gKGludCkgWyAxLCA2IF0sIHJhdGUgPSAoaW50KSBbIDgwMDAsIDQ4MDAwIF0sICIKKyAgICAgICAgIiBhbGlnbm1lbnQgPSAoc3RyaW5nKSB7IGllYzYxOTM3LCBmcmFtZX07ICIKKyAgICAgICAgImF1ZGlvL3gtZWFjMywgZnJhbWVkID0gKGJvb2xlYW4pIHRydWUsICIKKyAgICAgICAgIiBjaGFubmVscyA9IChpbnQpIFsgMSwgNiBdLCByYXRlID0gKGludCkgWyA4MDAwLCA0ODAwMCBdLCAiCisgICAgICAgICIgYWxpZ25tZW50ID0gKHN0cmluZykgeyBpZWM2MTkzNywgZnJhbWV9OyAiKSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1hYzM7ICIgImF1ZGlvL3gtZWFjMzsgIiAiYXVkaW8vYWMzOyAiCisgICAgICAgICJhdWRpby94LXByaXZhdGUxLWFjMyIpKTsKKworc3RhdGljIHZvaWQgZ3N0X2FjM19wYXJzZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYWMzX3BhcnNlX3N0YXJ0IChHc3RCYXNlUGFyc2UgKiBwYXJzZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2FjM19wYXJzZV9zdG9wIChHc3RCYXNlUGFyc2UgKiBwYXJzZSk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfYWMzX3BhcnNlX2hhbmRsZV9mcmFtZSAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSwgZ2ludCAqIHNraXBzaXplKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9hYzNfcGFyc2VfcHJlX3B1c2hfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUpOworc3RhdGljIGdib29sZWFuIGdzdF9hYzNfcGFyc2Vfc3JjX2V2ZW50IChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfYWMzX3BhcnNlX2dldF9zaW5rX2NhcHMgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9hYzNfcGFyc2Vfc2V0X3NpbmtfY2FwcyAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworCisjZGVmaW5lIGdzdF9hYzNfcGFyc2VfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0QWMzUGFyc2UsIGdzdF9hYzNfcGFyc2UsIEdTVF9UWVBFX0JBU0VfUEFSU0UpOworCitzdGF0aWMgdm9pZAorZ3N0X2FjM19wYXJzZV9jbGFzc19pbml0IChHc3RBYzNQYXJzZUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0QmFzZVBhcnNlQ2xhc3MgKnBhcnNlX2NsYXNzID0gR1NUX0JBU0VfUEFSU0VfQ0xBU1MgKGtsYXNzKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoYWMzX3BhcnNlX2RlYnVnLCAiYWMzcGFyc2UiLCAwLAorICAgICAgIkFDMyBhdWRpbyBzdHJlYW0gcGFyc2VyIik7CisKKyAgb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9hYzNfcGFyc2VfZmluYWxpemU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiQUMzIGF1ZGlvIHN0cmVhbSBwYXJzZXIiLCAiQ29kZWMvUGFyc2VyL0NvbnZlcnRlci9BdWRpbyIsCisgICAgICAiQUMzIHBhcnNlciIsICJUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PiIpOworCisgIHBhcnNlX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWMzX3BhcnNlX3N0YXJ0KTsKKyAgcGFyc2VfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FjM19wYXJzZV9zdG9wKTsKKyAgcGFyc2VfY2xhc3MtPmhhbmRsZV9mcmFtZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWMzX3BhcnNlX2hhbmRsZV9mcmFtZSk7CisgIHBhcnNlX2NsYXNzLT5wcmVfcHVzaF9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FjM19wYXJzZV9wcmVfcHVzaF9mcmFtZSk7CisgIHBhcnNlX2NsYXNzLT5zcmNfZXZlbnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FjM19wYXJzZV9zcmNfZXZlbnQpOworICBwYXJzZV9jbGFzcy0+Z2V0X3NpbmtfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWMzX3BhcnNlX2dldF9zaW5rX2NhcHMpOworICBwYXJzZV9jbGFzcy0+c2V0X3NpbmtfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWMzX3BhcnNlX3NldF9zaW5rX2NhcHMpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2FjM19wYXJzZV9yZXNldCAoR3N0QWMzUGFyc2UgKiBhYzNwYXJzZSkKK3sKKyAgYWMzcGFyc2UtPmNoYW5uZWxzID0gLTE7CisgIGFjM3BhcnNlLT5zYW1wbGVfcmF0ZSA9IC0xOworICBhYzNwYXJzZS0+YmxvY2tzID0gLTE7CisgIGFjM3BhcnNlLT5lYWMgPSBGQUxTRTsKKyAgYWMzcGFyc2UtPnNlbnRfY29kZWNfdGFnID0gRkFMU0U7CisgIGdfYXRvbWljX2ludF9zZXQgKCZhYzNwYXJzZS0+YWxpZ24sIEdTVF9BQzNfUEFSU0VfQUxJR05fTk9ORSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYWMzX3BhcnNlX2luaXQgKEdzdEFjM1BhcnNlICogYWMzcGFyc2UpCit7CisgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGFjM3BhcnNlKSwgOCk7CisgIGdzdF9hYzNfcGFyc2VfcmVzZXQgKGFjM3BhcnNlKTsKKyAgYWMzcGFyc2UtPmJhc2VwYXJzZV9jaGFpbmZ1bmMgPQorICAgICAgR1NUX0JBU0VfUEFSU0VfU0lOS19QQUQgKEdTVF9CQVNFX1BBUlNFIChhYzNwYXJzZSkpLT5jaGFpbmZ1bmM7CisgIEdTVF9QQURfU0VUX0FDQ0VQVF9JTlRFUlNFQ1QgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChhYzNwYXJzZSkpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChhYzNwYXJzZSkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2FjM19wYXJzZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hYzNfcGFyc2Vfc3RhcnQgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKQoreworICBHc3RBYzNQYXJzZSAqYWMzcGFyc2UgPSBHU1RfQUMzX1BBUlNFIChwYXJzZSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJzdGFydGluZyIpOworCisgIGdzdF9hYzNfcGFyc2VfcmVzZXQgKGFjM3BhcnNlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYWMzX3BhcnNlX3N0b3AgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKQoreworICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgInN0b3BwaW5nIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYWMzX3BhcnNlX3NldF9hbGlnbm1lbnQgKEdzdEFjM1BhcnNlICogYWMzcGFyc2UsIGdib29sZWFuIGVhYykKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0U3RydWN0dXJlICpzdDsKKyAgY29uc3QgZ2NoYXIgKnN0ciA9IE5VTEw7CisgIGludCBpOworCisgIGlmIChHX0xJS0VMWSAoIWVhYykpCisgICAgZ290byBkb25lOworCisgIGNhcHMgPSBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKGFjM3BhcnNlKSk7CisKKyAgaWYgKCFjYXBzKQorICAgIGdvdG8gZG9uZTsKKworICBmb3IgKGkgPSAwOyBpIDwgZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpOyBpKyspIHsKKyAgICBzdCA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIGkpOworCisgICAgaWYgKCFnX3N0cl9lcXVhbCAoZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAoc3QpLCAiYXVkaW8veC1lYWMzIikpCisgICAgICBjb250aW51ZTsKKworICAgIGlmICgoc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdCwgImFsaWdubWVudCIpKSkgeworICAgICAgaWYgKGdfc3RyX2VxdWFsIChzdHIsICJpZWM2MTkzNyIpKSB7CisgICAgICAgIGdfYXRvbWljX2ludF9zZXQgKCZhYzNwYXJzZS0+YWxpZ24sIEdTVF9BQzNfUEFSU0VfQUxJR05fSUVDNjE5MzcpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhYzNwYXJzZSwgInBpY2tlZCBpZWM2MTkzNyBhbGlnbm1lbnQiKTsKKyAgICAgIH0gZWxzZSBpZiAoZ19zdHJfZXF1YWwgKHN0ciwgImZyYW1lIikgPT0gMCkgeworICAgICAgICBnX2F0b21pY19pbnRfc2V0ICgmYWMzcGFyc2UtPmFsaWduLCBHU1RfQUMzX1BBUlNFX0FMSUdOX0ZSQU1FKTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYWMzcGFyc2UsICJwaWNrZWQgZnJhbWUgYWxpZ25tZW50Iik7CisgICAgICB9IGVsc2UgeworICAgICAgICBnX2F0b21pY19pbnRfc2V0ICgmYWMzcGFyc2UtPmFsaWduLCBHU1RfQUMzX1BBUlNFX0FMSUdOX0ZSQU1FKTsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhYzNwYXJzZSwgInVua25vd24gYWxpZ25tZW50OiAlcyIsIHN0cik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoY2FwcykKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKK2RvbmU6CisgIC8qIGRlZmF1bHQgKi8KKyAgaWYgKGFjM3BhcnNlLT5hbGlnbiA9PSBHU1RfQUMzX1BBUlNFX0FMSUdOX05PTkUpIHsKKyAgICBnX2F0b21pY19pbnRfc2V0ICgmYWMzcGFyc2UtPmFsaWduLCBHU1RfQUMzX1BBUlNFX0FMSUdOX0ZSQU1FKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhYzNwYXJzZSwgInBpY2tlZCBzeW5jZnJhbWUgYWxpZ25tZW50Iik7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYWMzX3BhcnNlX2ZyYW1lX2hlYWRlcl9hYzMgKEdzdEFjM1BhcnNlICogYWMzcGFyc2UsIEdzdEJ1ZmZlciAqIGJ1ZiwKKyAgICBnaW50IHNraXAsIGd1aW50ICogZnJhbWVfc2l6ZSwgZ3VpbnQgKiByYXRlLCBndWludCAqIGNoYW5zLCBndWludCAqIGJsa3MsCisgICAgZ3VpbnQgKiBzaWQpCit7CisgIEdzdEJpdFJlYWRlciBiaXRzOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ4IGZzY29kLCBmcm1zaXpjb2QsIGJzaWQsIGFjbW9kLCBsZmVfb24sIHJhdGVfc2NhbGU7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIEdTVF9MT0dfT0JKRUNUIChhYzNwYXJzZSwgInBhcnNpbmcgYWMzIik7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZ3N0X2JpdF9yZWFkZXJfaW5pdCAoJmJpdHMsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgIGdzdF9iaXRfcmVhZGVyX3NraXBfdW5jaGVja2VkICgmYml0cywgc2tpcCAqIDgpOworCisgIGdzdF9iaXRfcmVhZGVyX3NraXBfdW5jaGVja2VkICgmYml0cywgMTYgKyAxNik7CisgIGZzY29kID0gZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmYml0cywgMik7CisgIGZybXNpemNvZCA9IGdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4X3VuY2hlY2tlZCAoJmJpdHMsIDYpOworCisgIGlmIChHX1VOTElLRUxZIChmc2NvZCA9PSAzIHx8IGZybXNpemNvZCA+PSBHX05fRUxFTUVOVFMgKGZybXNpemNvZF90YWJsZSkpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYWMzcGFyc2UsICJiYWQgZnNjb2Q9JWQgZnJtc2l6Y29kPSVkIiwgZnNjb2QsIGZybXNpemNvZCk7CisgICAgZ290byBjbGVhbnVwOworICB9CisKKyAgYnNpZCA9IGdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4X3VuY2hlY2tlZCAoJmJpdHMsIDUpOworICBnc3RfYml0X3JlYWRlcl9za2lwX3VuY2hlY2tlZCAoJmJpdHMsIDMpOyAgICAgLyogYnNtb2QgKi8KKyAgYWNtb2QgPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OF91bmNoZWNrZWQgKCZiaXRzLCAzKTsKKworICAvKiBzcGVjIG5vdCBxdWl0ZSBjbGVhciBoZXJlOiBkZWNvZGVyIHNob3VsZCBkZWNvZGUgaWYgbGVzcyB0aGFuIDgsCisgICAqIGJ1dCBzZWVtaW5nbHkgb25seSBkZWZpbmVzIDYgYW5kIDggY2FzZXMgKi8KKyAgLyogRmlsZXMgd2l0aCA5IGFuZCAxMCBoYXBwZW4sIGFuZCBzZWVtIHRvIGNvbXBseSB3aXRoIHRoZSA8PSA4CisgICAgIGZvcm1hdCwgc28gbGV0IHRoZW0gdGhyb3VnaC4gVGhlIHNwZWMgc2F5cyBub3RoaW5nIGFib3V0IDkgYW5kIDEwICovCisgIGlmIChic2lkID4gMTApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhYzNwYXJzZSwgInVuZXhwZWN0ZWQgYnNpZD0lZCIsIGJzaWQpOworICAgIGdvdG8gY2xlYW51cDsKKyAgfSBlbHNlIGlmIChic2lkICE9IDggJiYgYnNpZCAhPSA2KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYWMzcGFyc2UsICJ1bmRlZmluZWQgYnNpZD0lZCIsIGJzaWQpOworICB9CisKKyAgaWYgKChhY21vZCAmIDB4MSkgJiYgKGFjbW9kICE9IDB4MSkpICAvKiAzIGZyb250IGNoYW5uZWxzICovCisgICAgZ3N0X2JpdF9yZWFkZXJfc2tpcF91bmNoZWNrZWQgKCZiaXRzLCAyKTsKKyAgaWYgKChhY21vZCAmIDB4NCkpICAgICAgICAgICAgLyogaWYgYSBzdXJyb3VuZCBjaGFubmVsIGV4aXN0cyAqLworICAgIGdzdF9iaXRfcmVhZGVyX3NraXBfdW5jaGVja2VkICgmYml0cywgMik7CisgIGlmIChhY21vZCA9PSAweDIpICAgICAgICAgICAgIC8qIGlmIGluIDIvMCBtb2RlICovCisgICAgZ3N0X2JpdF9yZWFkZXJfc2tpcF91bmNoZWNrZWQgKCZiaXRzLCAyKTsKKworICBsZmVfb24gPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OF91bmNoZWNrZWQgKCZiaXRzLCAxKTsKKworICAvKiA2LzgtPjAsIDktPjEsIDEwLT4yLAorICAgICBzZWUgaHR0cDovL21hdHJvc2thLm9yZy90ZWNobmljYWwvc3BlY3MvY29kZWNpZC9pbmRleC5odG1sICovCisgIHJhdGVfc2NhbGUgPSAoQ0xBTVAgKGJzaWQsIDgsIDEwKSAtIDgpOworCisgIGlmIChmcmFtZV9zaXplKQorICAgICpmcmFtZV9zaXplID0gZnJtc2l6Y29kX3RhYmxlW2ZybXNpemNvZF0uZnJhbWVfc2l6ZVtmc2NvZF0gKiAyOworICBpZiAocmF0ZSkKKyAgICAqcmF0ZSA9IGZzY29kX3JhdGVzW2ZzY29kXSA+PiByYXRlX3NjYWxlOworICBpZiAoY2hhbnMpCisgICAgKmNoYW5zID0gYWNtb2RfY2hhbnNbYWNtb2RdICsgbGZlX29uOworICBpZiAoYmxrcykKKyAgICAqYmxrcyA9IDY7CisgIGlmIChzaWQpCisgICAgKnNpZCA9IDA7CisKKyAgcmV0ID0gVFJVRTsKKworY2xlYW51cDoKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hYzNfcGFyc2VfZnJhbWVfaGVhZGVyX2VhYzMgKEdzdEFjM1BhcnNlICogYWMzcGFyc2UsIEdzdEJ1ZmZlciAqIGJ1ZiwKKyAgICBnaW50IHNraXAsIGd1aW50ICogZnJhbWVfc2l6ZSwgZ3VpbnQgKiByYXRlLCBndWludCAqIGNoYW5zLCBndWludCAqIGJsa3MsCisgICAgZ3VpbnQgKiBzaWQpCit7CisgIEdzdEJpdFJlYWRlciBiaXRzOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQxNiBmcm1zaXosIHNhbXBsZV9yYXRlLCBibG9ja3M7CisgIGd1aW50OCBzdHJtdHlwLCBmc2NvZCwgZnNjb2QyLCBhY21vZCwgbGZlX29uLCBzdHJtaWQsIG51bWJsa3Njb2Q7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIEdTVF9MT0dfT0JKRUNUIChhYzNwYXJzZSwgInBhcnNpbmcgZS1hYzMiKTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBnc3RfYml0X3JlYWRlcl9pbml0ICgmYml0cywgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgZ3N0X2JpdF9yZWFkZXJfc2tpcF91bmNoZWNrZWQgKCZiaXRzLCBza2lwICogOCk7CisKKyAgZ3N0X2JpdF9yZWFkZXJfc2tpcF91bmNoZWNrZWQgKCZiaXRzLCAxNik7CisgIHN0cm10eXAgPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OF91bmNoZWNrZWQgKCZiaXRzLCAyKTsgLyogc3RybXR5cCAgICAgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKHN0cm10eXAgPT0gMykpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhYzNwYXJzZSwgImJhZCBzdHJtdHlwICVkIiwgc3RybXR5cCk7CisgICAgZ290byBjbGVhbnVwOworICB9CisKKyAgc3RybWlkID0gZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmYml0cywgMyk7ICAvKiBzdWJzdHJlYW1pZCAqLworICBmcm1zaXogPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MTZfdW5jaGVja2VkICgmYml0cywgMTEpOyAgICAgICAgLyogZnJtc2l6ICAgICAgKi8KKyAgZnNjb2QgPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OF91bmNoZWNrZWQgKCZiaXRzLCAyKTsgICAvKiBmc2NvZCAgICAgICAqLworICBpZiAoZnNjb2QgPT0gMykgeworICAgIGZzY29kMiA9IGdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4X3VuY2hlY2tlZCAoJmJpdHMsIDIpOyAgICAgICAgLyogZnNjb2QyICAgICAgKi8KKyAgICBpZiAoR19VTkxJS0VMWSAoZnNjb2QyID09IDMpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChhYzNwYXJzZSwgImludmFsaWQgZnNjb2QyIik7CisgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorICAgIHNhbXBsZV9yYXRlID0gZnNjb2RfcmF0ZXNbZnNjb2QyXSAvIDI7CisgICAgYmxvY2tzID0gNjsKKyAgfSBlbHNlIHsKKyAgICBudW1ibGtzY29kID0gZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmYml0cywgMik7ICAgIC8qIG51bWJsa3Njb2QgICovCisgICAgc2FtcGxlX3JhdGUgPSBmc2NvZF9yYXRlc1tmc2NvZF07CisgICAgYmxvY2tzID0gbnVtYmxrc1tudW1ibGtzY29kXTsKKyAgfQorCisgIGFjbW9kID0gZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmYml0cywgMyk7ICAgLyogYWNtb2QgICAgICAgKi8KKyAgbGZlX29uID0gZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmYml0cywgMSk7ICAvKiBsZmVvbiAgICAgICAqLworCisgIGdzdF9iaXRfcmVhZGVyX3NraXBfdW5jaGVja2VkICgmYml0cywgNSk7ICAgICAvKiBic2lkICAgICAgICAqLworCisgIGlmIChmcmFtZV9zaXplKQorICAgICpmcmFtZV9zaXplID0gKGZybXNpeiArIDEpICogMjsKKyAgaWYgKHJhdGUpCisgICAgKnJhdGUgPSBzYW1wbGVfcmF0ZTsKKyAgaWYgKGNoYW5zKQorICAgICpjaGFucyA9IGFjbW9kX2NoYW5zW2FjbW9kXSArIGxmZV9vbjsKKyAgaWYgKGJsa3MpCisgICAgKmJsa3MgPSBibG9ja3M7CisgIGlmIChzaWQpCisgICAgKnNpZCA9IChzdHJtdHlwICYgMHgxKSA8PCAzIHwgc3RybWlkOworCisgIHJldCA9IFRSVUU7CisKK2NsZWFudXA6CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYWMzX3BhcnNlX2ZyYW1lX2hlYWRlciAoR3N0QWMzUGFyc2UgKiBwYXJzZSwgR3N0QnVmZmVyICogYnVmLCBnaW50IHNraXAsCisgICAgZ3VpbnQgKiBmcmFtZXNpemUsIGd1aW50ICogcmF0ZSwgZ3VpbnQgKiBjaGFucywgZ3VpbnQgKiBibG9ja3MsCisgICAgZ3VpbnQgKiBzaWQsIGdib29sZWFuICogZWFjKQoreworICBHc3RCaXRSZWFkZXIgYml0czsKKyAgZ3VpbnQxNiBzeW5jOworICBndWludDggYnNpZDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGdzdF9iaXRfcmVhZGVyX2luaXQgKCZiaXRzLCBtYXAuZGF0YSwgbWFwLnNpemUpOworCisgIEdTVF9NRU1EVU1QX09CSkVDVCAocGFyc2UsICJBQzMgZnJhbWUgc3luYyIsIG1hcC5kYXRhLCBNSU4gKG1hcC5zaXplLCAxNikpOworCisgIGdzdF9iaXRfcmVhZGVyX3NraXBfdW5jaGVja2VkICgmYml0cywgc2tpcCAqIDgpOworCisgIHN5bmMgPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MTZfdW5jaGVja2VkICgmYml0cywgMTYpOworICBnc3RfYml0X3JlYWRlcl9za2lwX3VuY2hlY2tlZCAoJmJpdHMsIDE2ICsgOCk7CisgIGJzaWQgPSBnc3RfYml0X3JlYWRlcl9wZWVrX2JpdHNfdWludDhfdW5jaGVja2VkICgmYml0cywgNSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHN5bmMgIT0gMHgwYjc3KSkKKyAgICBnb3RvIGNsZWFudXA7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAiYnNpZCA9ICVkIiwgYnNpZCk7CisKKyAgaWYgKGJzaWQgPD0gMTApIHsKKyAgICBpZiAoZWFjKQorICAgICAgKmVhYyA9IEZBTFNFOworICAgIHJldCA9IGdzdF9hYzNfcGFyc2VfZnJhbWVfaGVhZGVyX2FjMyAocGFyc2UsIGJ1Ziwgc2tpcCwgZnJhbWVzaXplLCByYXRlLAorICAgICAgICBjaGFucywgYmxvY2tzLCBzaWQpOworICAgIGdvdG8gY2xlYW51cDsKKyAgfSBlbHNlIGlmIChic2lkIDw9IDE2KSB7CisgICAgaWYgKGVhYykKKyAgICAgICplYWMgPSBUUlVFOworICAgIHJldCA9IGdzdF9hYzNfcGFyc2VfZnJhbWVfaGVhZGVyX2VhYzMgKHBhcnNlLCBidWYsIHNraXAsIGZyYW1lc2l6ZSwgcmF0ZSwKKyAgICAgICAgY2hhbnMsIGJsb2Nrcywgc2lkKTsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJ1bmV4cGVjdGVkIGJzaWQgJWQiLCBic2lkKTsKKyAgICByZXQgPSBGQUxTRTsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgInVuZXhwZWN0ZWQgYnNpZCAlZCIsIGJzaWQpOworCitjbGVhbnVwOgorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYWMzX3BhcnNlX2hhbmRsZV9mcmFtZSAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSwgZ2ludCAqIHNraXBzaXplKQoreworICBHc3RBYzNQYXJzZSAqYWMzcGFyc2UgPSBHU1RfQUMzX1BBUlNFIChwYXJzZSk7CisgIEdzdEJ1ZmZlciAqYnVmID0gZnJhbWUtPmJ1ZmZlcjsKKyAgR3N0Qnl0ZVJlYWRlciByZWFkZXI7CisgIGdpbnQgb2ZmOworICBnYm9vbGVhbiBsb3N0X3N5bmMsIGRyYWluaW5nLCBlYWMsIG1vcmUgPSBGQUxTRTsKKyAgZ3VpbnQgZnJtc2l6LCBibG9ja3MsIHNpZDsKKyAgZ3VpbnQgcmF0ZSwgY2hhbnM7CisgIGdib29sZWFuIHVwZGF0ZV9yYXRlID0gRkFMU0U7CisgIGdpbnQgZnJhbWVzaXplID0gMDsKKyAgZ2ludCBoYXZlX2Jsb2NrcyA9IDA7CisgIEdzdE1hcEluZm8gbWFwOworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKyAgR3N0Rmxvd1JldHVybiByZXMgPSBHU1RfRkxPV19PSzsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIGlmIChHX1VOTElLRUxZIChtYXAuc2l6ZSA8IDgpKSB7CisgICAgKnNraXBzaXplID0gMTsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KKworICBnc3RfYnl0ZV9yZWFkZXJfaW5pdCAoJnJlYWRlciwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgb2ZmID0gZ3N0X2J5dGVfcmVhZGVyX21hc2tlZF9zY2FuX3VpbnQzMiAoJnJlYWRlciwgMHhmZmZmMDAwMCwgMHgwYjc3MDAwMCwKKyAgICAgIDAsIG1hcC5zaXplKTsKKworICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJwb3NzaWJsZSBzeW5jIGF0IGJ1ZmZlciBvZmZzZXQgJWQiLCBvZmYpOworCisgIC8qIGRpZG4ndCBmaW5kIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIHN5bmMgd29yZCwgc2tpcCAqLworICBpZiAob2ZmIDwgMCkgeworICAgICpza2lwc2l6ZSA9IG1hcC5zaXplIC0gMzsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KKworICAvKiBwb3NzaWJsZSBmcmFtZSBoZWFkZXIsIGJ1dCBub3QgYXQgb2Zmc2V0IDA/IHNraXAgYnl0ZXMgYmVmb3JlIHN5bmMgKi8KKyAgaWYgKG9mZiA+IDApIHsKKyAgICAqc2tpcHNpemUgPSBvZmY7CisgICAgZ290byBjbGVhbnVwOworICB9CisKKyAgLyogbWFrZSBzdXJlIHRoZSB2YWx1ZXMgaW4gdGhlIGZyYW1lIGhlYWRlciBsb29rIHNhbmUgKi8KKyAgaWYgKCFnc3RfYWMzX3BhcnNlX2ZyYW1lX2hlYWRlciAoYWMzcGFyc2UsIGJ1ZiwgMCwgJmZybXNpeiwgJnJhdGUsICZjaGFucywKKyAgICAgICAgICAmYmxvY2tzLCAmc2lkLCAmZWFjKSkgeworICAgICpza2lwc2l6ZSA9IG9mZiArIDI7CisgICAgZ290byBjbGVhbnVwOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAic2l6ZTogJXUsIGJsb2NrczogJXUsIHJhdGU6ICV1LCBjaGFuczogJXUiLCBmcm1zaXosCisgICAgICBibG9ja3MsIHJhdGUsIGNoYW5zKTsKKworICBmcmFtZXNpemUgPSBmcm1zaXo7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGdfYXRvbWljX2ludF9nZXQgKCZhYzNwYXJzZS0+YWxpZ24pID09CisgICAgICAgICAgR1NUX0FDM19QQVJTRV9BTElHTl9OT05FKSkKKyAgICBnc3RfYWMzX3BhcnNlX3NldF9hbGlnbm1lbnQgKGFjM3BhcnNlLCBlYWMpOworCisgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgImdvdCBmcmFtZSIpOworCisgIGxvc3Rfc3luYyA9IEdTVF9CQVNFX1BBUlNFX0xPU1RfU1lOQyAocGFyc2UpOworICBkcmFpbmluZyA9IEdTVF9CQVNFX1BBUlNFX0RSQUlOSU5HIChwYXJzZSk7CisKKyAgaWYgKGdfYXRvbWljX2ludF9nZXQgKCZhYzNwYXJzZS0+YWxpZ24pID09IEdTVF9BQzNfUEFSU0VfQUxJR05fSUVDNjE5MzcpIHsKKyAgICAvKiBXZSBuZWVkIDYgYXVkaW8gYmxvY2tzIGZyb20gZWFjaCBzdWJzdHJlYW0sIHNvIHdlIGtlZXAgZ29pbmcgZm9yd2FyZHMKKyAgICAgKiB0aWxsIHdlIGhhdmUgaXQgKi8KKworICAgIGdfYXNzZXJ0IChibG9ja3MgPiAwKTsKKyAgICBHU1RfTE9HX09CSkVDVCAoYWMzcGFyc2UsICJOZWVkICVkIGZyYW1lcyBiZWZvcmUgcHVzaGluZyIsIDYgLyBibG9ja3MpOworCisgICAgaWYgKHNpZCAhPSAwKSB7CisgICAgICAvKiBXZSBuZWVkIHRoZSBmaXJzdCBzdWJzdHJlYW0gdG8gYmUgdGhlIG9uZSB3aXRoIGlkIDAgKi8KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChhYzNwYXJzZSwgIlNraXBwaW5nIHRpbGwgd2UgZmluZCBzaWQgMCIpOworICAgICAgKnNraXBzaXplID0gb2ZmICsgMjsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisKKyAgICBmcmFtZXNpemUgPSAwOworCisgICAgLyogTG9vcCB0aWxsIHdlIGhhdmUgNiBibG9ja3MgcGVyIHN1YnN0cmVhbSAqLworICAgIGZvciAoaGF2ZV9ibG9ja3MgPSAwOyAhbW9yZSAmJiBoYXZlX2Jsb2NrcyA8IDY7IGhhdmVfYmxvY2tzICs9IGJsb2NrcykgeworICAgICAgLyogTG9vcCB0aWxsIHdlIGdldCBvbmUgZnJhbWUgZnJvbSBlYWNoIHN1YnN0cmVhbSAqLworICAgICAgZG8geworICAgICAgICBmcmFtZXNpemUgKz0gZnJtc2l6OworCisgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZyZWFkZXIsIGZybXNpeikKKyAgICAgICAgICAgIHx8IG1hcC5zaXplIDwgKGZyYW1lc2l6ZSArIDYpKSB7CisgICAgICAgICAgbW9yZSA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWdzdF9hYzNfcGFyc2VfZnJhbWVfaGVhZGVyIChhYzNwYXJzZSwgYnVmLCBmcmFtZXNpemUsICZmcm1zaXosCisgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgJnNpZCwgJmVhYykpIHsKKyAgICAgICAgICAqc2tpcHNpemUgPSBvZmYgKyAyOworICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoc2lkKTsKKyAgICB9CisKKyAgICAvKiBXZSdyZSBub3cgYXQgdGhlIG5leHQgZnJhbWUsIHNvIG5vIG5lZWQgdG8gc2tpcCBpZiByZXN5bmNpbmcgKi8KKyAgICBmcm1zaXogPSAwOworICB9CisKKyAgaWYgKGxvc3Rfc3luYyAmJiAhZHJhaW5pbmcpIHsKKyAgICBndWludDE2IHdvcmQgPSAwOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoYWMzcGFyc2UsICJyZXN5bmNpbmc7IGNoZWNraW5nIG5leHQgZnJhbWUgc3luY3dvcmQiKTsKKworICAgIGlmIChtb3JlIHx8ICFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJnJlYWRlciwgZnJtc2l6KSB8fAorICAgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfYmUgKCZyZWFkZXIsICZ3b3JkKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYWMzcGFyc2UsICIuLi4gYnV0IG5vdCBzdWZmaWNpZW50IGRhdGEiKTsKKyAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAocGFyc2UsIGZyYW1lc2l6ZSArIDgpOworICAgICAgKnNraXBzaXplID0gMDsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHdvcmQgIT0gMHgwYjc3KSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFjM3BhcnNlLCAiMHgleCBub3QgT0siLCB3b3JkKTsKKyAgICAgICAgKnNraXBzaXplID0gb2ZmICsgMjsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogb2ssIGdvdCBzeW5jIG5vdywgbGV0J3MgYXNzdW1lIGNvbnN0YW50IGZyYW1lIHNpemUgKi8KKyAgICAgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplIChwYXJzZSwgZnJhbWVzaXplKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBleHBlY3QgdG8gaGF2ZSBmb3VuZCBhIGZyYW1lIGhlcmUgKi8KKyAgZ19hc3NlcnQgKGZyYW1lc2l6ZSk7CisgIHJldCA9IFRSVUU7CisKKyAgLyogYXJyYW5nZSBmb3IgbWV0YWRhdGEgc2V0dXAgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKHNpZCkpIHsKKyAgICAvKiBkZXBlbmRlbnQgZnJhbWUsIG5vIG5lZWQgdG8gKGFjKWNvdW50IGZvciBvciBjb25zaWRlciBmdXJ0aGVyICovCisgICAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAic2lkOiAlZCIsIHNpZCk7CisgICAgZnJhbWUtPmZsYWdzIHw9IEdTVF9CQVNFX1BBUlNFX0ZSQU1FX0ZMQUdfTk9fRlJBTUU7CisgICAgLyogVE9ETyBtYXliZSBhbHNvIG1hcmsgYXMgREVMVEFfVU5JVCwKKyAgICAgKiBpZiB0aGF0IGRvZXMgbm90IHN1cnByaXNlIGJhc2VwYXJzZSBlbHNld2hlcmUgKi8KKyAgICAvKiBvY2N1cGllcyBzYW1lIHRpbWUgc3BhY2UgYXMgcHJldmlvdXMgYmFzZSBmcmFtZSAqLworICAgIGlmIChHX0xJS0VMWSAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikgPj0gR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKSkpCisgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKSAtPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpOworICAgIC8qIG9ubHkgc2hvcnRjdXQgaWYgd2UgYWxyZWFkeSBhcnJhbmdlZCBmb3IgY2FwcyAqLworICAgIGlmIChHX0xJS0VMWSAoYWMzcGFyc2UtPnNhbXBsZV9yYXRlID4gMCkpCisgICAgICBnb3RvIGNsZWFudXA7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoYWMzcGFyc2UtPnNhbXBsZV9yYXRlICE9IHJhdGUgfHwgYWMzcGFyc2UtPmNoYW5uZWxzICE9IGNoYW5zCisgICAgICAgICAgfHwgYWMzcGFyc2UtPmVhYyAhPSBlYWMpKSB7CisgICAgR3N0Q2FwcyAqY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKGVhYyA/ICJhdWRpby94LWVhYzMiIDogImF1ZGlvL3gtYWMzIiwKKyAgICAgICAgImZyYW1lZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCAicmF0ZSIsIEdfVFlQRV9JTlQsIHJhdGUsCisgICAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIGNoYW5zLCBOVUxMKTsKKyAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAiYWxpZ25tZW50IiwgR19UWVBFX1NUUklORywKKyAgICAgICAgZ19hdG9taWNfaW50X2dldCAoJmFjM3BhcnNlLT5hbGlnbikgPT0gR1NUX0FDM19QQVJTRV9BTElHTl9JRUM2MTkzNyA/CisgICAgICAgICJpZWM2MTkzNyIgOiAiZnJhbWUiLCBOVUxMKTsKKyAgICBnc3RfcGFkX3NldF9jYXBzIChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChwYXJzZSksIGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAgIGFjM3BhcnNlLT5zYW1wbGVfcmF0ZSA9IHJhdGU7CisgICAgYWMzcGFyc2UtPmNoYW5uZWxzID0gY2hhbnM7CisgICAgYWMzcGFyc2UtPmVhYyA9IGVhYzsKKworICAgIHVwZGF0ZV9yYXRlID0gVFJVRTsKKyAgfQorCisgIGlmIChHX1VOTElLRUxZIChhYzNwYXJzZS0+YmxvY2tzICE9IGJsb2NrcykpIHsKKyAgICBhYzNwYXJzZS0+YmxvY2tzID0gYmxvY2tzOworCisgICAgdXBkYXRlX3JhdGUgPSBUUlVFOworICB9CisKKyAgaWYgKEdfVU5MSUtFTFkgKHVwZGF0ZV9yYXRlKSkKKyAgICBnc3RfYmFzZV9wYXJzZV9zZXRfZnJhbWVfcmF0ZSAocGFyc2UsIHJhdGUsIDI1NiAqIGJsb2NrcywgMiwgMik7CisKK2NsZWFudXA6CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgaWYgKHJldCAmJiBmcmFtZXNpemUgPD0gbWFwLnNpemUpIHsKKyAgICByZXMgPSBnc3RfYmFzZV9wYXJzZV9maW5pc2hfZnJhbWUgKHBhcnNlLCBmcmFtZSwgZnJhbWVzaXplKTsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKKworLyoKKyAqIE1QRUctUFMgcHJpdmF0ZTEgc3RyZWFtcyBhZGQgYSAyIGJ5dGVzICJBdWRpbyBTdWJzdHJlYW0gSGVhZGVycyIgZm9yIGVhY2gKKyAqIGJ1ZmZlciAobm90IGVhY2ggZnJhbWUpIHdpdGggdGhlIG9mZnNldCBvZiB0aGUgbmV4dCBmcmFtZSdzIHN0YXJ0LgorICoKKyAqIEJ1ZmZlciAxOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfGZpcnN0QWNjVW5pdHxBQzNTeW5jV29yZHx4eHh4eHh4eHh4eHh4eHh4eAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQnVmZmVyIDI6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8Zmlyc3RBY2NVbml0fHh4eHh4eHxBQzNTeW5jV29yZHx4eHh4eHh4eHh4CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhlc2UgMiBieXRlcyBjYW4gYmUgZHJvcHBlZCBzYWZlbHkgYXMgdGhleSBkbyBub3QgaW5jbHVkZSBhbnkgdGltaW5nCisgKiBpbmZvcm1hdGlvbiwgb25seSB0aGUgb2Zmc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBmcmFtZS4KKyAqCisgKiBGcm9tIGh0dHA6Ly9zdG5zb2Z0LmNvbS9EVkQvYXNzLWhkci5odG1sOgorICogIkZpcnN0QWNjVW5pdCBvZmZzZXQgdG8gZnJhbWUgd2hpY2ggY29ycmVzcG9uZHMgdG8gUFRTIHZhbHVlIG9mZnNldCAwIGlzIHRoZQorICogbGFzdCBieXRlIG9mIEZpcnN0QWNjVW5pdCwgaWUgYWRkIHRoZSBvZmZzZXQgb2YgYnl0ZSAyIHRvIGdldCB0aGUgQVUncyBvZmZzZXQKKyAqIFRoZSB2YWx1ZSAwMDAwIGluZGljYXRlcyB0aGVyZSBpcyBubyBmaXJzdCBhY2Nlc3MgdW5pdCIKKyAqICovCisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYWMzX3BhcnNlX2NoYWluX3ByaXYgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdEFjM1BhcnNlICphYzNwYXJzZSA9IEdTVF9BQzNfUEFSU0UgKHBhcmVudCk7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBnc2l6ZSBzaXplOworICBndWludDggZGF0YVsyXTsKKyAgZ2ludCBvZmZzZXQ7CisgIGdpbnQgbGVuOworICBHc3RCdWZmZXIgKnN1YmJ1ZjsKKyAgZ2ludCBmaXJzdF9hY2Nlc3M7CisKKyAgc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisgIGlmIChzaXplIDwgMikKKyAgICBnb3RvIG5vdF9lbm91Z2hfZGF0YTsKKworICBnc3RfYnVmZmVyX2V4dHJhY3QgKGJ1ZiwgMCwgZGF0YSwgMik7CisgIGZpcnN0X2FjY2VzcyA9IChkYXRhWzBdIDw8IDgpIHwgZGF0YVsxXTsKKworICAvKiBTa2lwIHRoZSBmaXJzdF9hY2Nlc3MgaGVhZGVyICovCisgIG9mZnNldCA9IDI7CisKKyAgaWYgKGZpcnN0X2FjY2VzcyA+IDEpIHsKKyAgICAvKiBMZW5ndGggb2YgZGF0YSBiZWZvcmUgZmlyc3RfYWNjZXNzICovCisgICAgbGVuID0gZmlyc3RfYWNjZXNzIC0gMTsKKworICAgIGlmIChsZW4gPD0gMCB8fCBvZmZzZXQgKyBsZW4gPiBzaXplKQorICAgICAgZ290byBiYWRfZmlyc3RfYWNjZXNzX3BhcmFtZXRlcjsKKworICAgIHN1YmJ1ZiA9IGdzdF9idWZmZXJfY29weV9yZWdpb24gKGJ1ZiwgR1NUX0JVRkZFUl9DT1BZX0FMTCwgb2Zmc2V0LCBsZW4pOworICAgIEdTVF9CVUZGRVJfRFRTIChzdWJidWYpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICBHU1RfQlVGRkVSX1BUUyAoc3ViYnVmKSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgcmV0ID0gYWMzcGFyc2UtPmJhc2VwYXJzZV9jaGFpbmZ1bmMgKHBhZCwgcGFyZW50LCBzdWJidWYpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0sgJiYgcmV0ICE9IEdTVF9GTE9XX05PVF9MSU5LRUQpIHsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgb2Zmc2V0ICs9IGxlbjsKKyAgICBsZW4gPSBzaXplIC0gb2Zmc2V0OworCisgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgIHN1YmJ1ZiA9IGdzdF9idWZmZXJfY29weV9yZWdpb24gKGJ1ZiwgR1NUX0JVRkZFUl9DT1BZX0FMTCwgb2Zmc2V0LCBsZW4pOworICAgICAgR1NUX0JVRkZFUl9QVFMgKHN1YmJ1ZikgPSBHU1RfQlVGRkVSX1BUUyAoYnVmKTsKKyAgICAgIEdTVF9CVUZGRVJfRFRTIChzdWJidWYpID0gR1NUX0JVRkZFUl9EVFMgKGJ1Zik7CisKKyAgICAgIHJldCA9IGFjM3BhcnNlLT5iYXNlcGFyc2VfY2hhaW5mdW5jIChwYWQsIHBhcmVudCwgc3ViYnVmKTsKKyAgICB9CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBmaXJzdF9hY2Nlc3MgPSAwIG9yIDEsIHNvIGlmIHRoZXJlJ3MgYSB0aW1lc3RhbXAgaXQgYXBwbGllcyB0byB0aGUgZmlyc3QgYnl0ZSAqLworICAgIHN1YmJ1ZiA9CisgICAgICAgIGdzdF9idWZmZXJfY29weV9yZWdpb24gKGJ1ZiwgR1NUX0JVRkZFUl9DT1BZX0FMTCwgb2Zmc2V0LAorICAgICAgICBzaXplIC0gb2Zmc2V0KTsKKyAgICBHU1RfQlVGRkVSX1BUUyAoc3ViYnVmKSA9IEdTVF9CVUZGRVJfUFRTIChidWYpOworICAgIEdTVF9CVUZGRVJfRFRTIChzdWJidWYpID0gR1NUX0JVRkZFUl9EVFMgKGJ1Zik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXQgPSBhYzNwYXJzZS0+YmFzZXBhcnNlX2NoYWluZnVuYyAocGFkLCBwYXJlbnQsIHN1YmJ1Zik7CisgIH0KKworZG9uZToKKyAgcmV0dXJuIHJldDsKKworLyogRVJST1JTICovCitub3RfZW5vdWdoX2RhdGE6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoR1NUX0VMRU1FTlQgKGFjM3BhcnNlKSwgU1RSRUFNLCBGT1JNQVQsIChOVUxMKSwKKyAgICAgICAgKCJJbnN1ZmZpY2llbnQgZGF0YSBpbiBidWZmZXIuIENhbid0IGRldGVybWluZSBmaXJzdF9hY2VzcyIpKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorYmFkX2ZpcnN0X2FjY2Vzc19wYXJhbWV0ZXI6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoR1NUX0VMRU1FTlQgKGFjM3BhcnNlKSwgU1RSRUFNLCBGT1JNQVQsIChOVUxMKSwKKyAgICAgICAgKCJCYWQgZmlyc3RfYWNjZXNzIHBhcmFtZXRlciAoJWQpIGluIGJ1ZmZlciIsIGZpcnN0X2FjY2VzcykpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYWMzX3BhcnNlX3ByZV9wdXNoX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0QWMzUGFyc2UgKmFjM3BhcnNlID0gR1NUX0FDM19QQVJTRSAocGFyc2UpOworCisgIGlmICghYWMzcGFyc2UtPnNlbnRfY29kZWNfdGFnKSB7CisgICAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgLyogY29kZWMgdGFnICovCisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpKTsKKyAgICBpZiAoR19VTkxJS0VMWSAoY2FwcyA9PSBOVUxMKSkgeworICAgICAgaWYgKEdTVF9QQURfSVNfRkxVU0hJTkcgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSkpIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgZmx1c2hpbmciKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgbm90IG5lZ290aWF0ZWQhIik7CisgICAgICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0YWdsaXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgICBnc3RfcGJfdXRpbHNfYWRkX2NvZGVjX2Rlc2NyaXB0aW9uX3RvX3RhZ19saXN0ICh0YWdsaXN0LAorICAgICAgICBHU1RfVEFHX0FVRElPX0NPREVDLCBjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgICBnc3RfYmFzZV9wYXJzZV9tZXJnZV90YWdzIChwYXJzZSwgdGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFKTsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ2xpc3QpOworCisgICAgLyogYWxzbyBzaWduYWxzIHRoZSBlbmQgb2YgZmlyc3QtZnJhbWUgcHJvY2Vzc2luZyAqLworICAgIGFjM3BhcnNlLT5zZW50X2NvZGVjX3RhZyA9IFRSVUU7CisgIH0KKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FjM19wYXJzZV9zcmNfZXZlbnQgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RBYzNQYXJzZSAqYWMzcGFyc2UgPSBHU1RfQUMzX1BBUlNFIChwYXJzZSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSkgJiYKKyAgICAgIGdzdF9ldmVudF9oYXNfbmFtZSAoZXZlbnQsICJhYzNwYXJzZS1zZXQtYWxpZ25tZW50IikpIHsKKyAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnN0ID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUgKGV2ZW50KTsKKyAgICBjb25zdCBnY2hhciAqYWxpZ24gPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0LCAiYWxpZ25tZW50Iik7CisKKyAgICBpZiAoZ19zdHJfZXF1YWwgKGFsaWduLCAiaWVjNjE5MzciKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYWMzcGFyc2UsICJTd2l0Y2hpbmcgdG8gaWVjNjE5MzcgYWxpZ25tZW50Iik7CisgICAgICBnX2F0b21pY19pbnRfc2V0ICgmYWMzcGFyc2UtPmFsaWduLCBHU1RfQUMzX1BBUlNFX0FMSUdOX0lFQzYxOTM3KTsKKyAgICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsIChhbGlnbiwgImZyYW1lIikpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFjM3BhcnNlLCAiU3dpdGNoaW5nIHRvIGZyYW1lIGFsaWdubWVudCIpOworICAgICAgZ19hdG9taWNfaW50X3NldCAoJmFjM3BhcnNlLT5hbGlnbiwgR1NUX0FDM19QQVJTRV9BTElHTl9GUkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdfYXRvbWljX2ludF9zZXQgKCZhYzNwYXJzZS0+YWxpZ24sIEdTVF9BQzNfUEFSU0VfQUxJR05fRlJBTUUpOworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhYzNwYXJzZSwgIkdvdCB1bmtub3duIGFsaWdubWVudCByZXF1ZXN0ICglcykgIgorICAgICAgICAgICJyZXZlcnRpbmcgdG8gZnJhbWUgYWxpZ25tZW50LiIsCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdCwgImFsaWdubWVudCIpKTsKKyAgICB9CisKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHJldHVybiBHU1RfQkFTRV9QQVJTRV9DTEFTUyAocGFyZW50X2NsYXNzKS0+c3JjX2V2ZW50IChwYXJzZSwgZXZlbnQpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX2ZpZWxkcyAoR3N0Q2FwcyAqIGNhcHMpCit7CisgIGd1aW50IGksIG47CisKKyAgbiA9IGdzdF9jYXBzX2dldF9zaXplIChjYXBzKTsKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIGkpOworCisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJmcmFtZWQiKTsKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAocywgImFsaWdubWVudCIpOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2V4dGVuZF9jYXBzIChHc3RDYXBzICogY2FwcywgZ2Jvb2xlYW4gYWRkX3ByaXZhdGUpCit7CisgIGd1aW50IGksIG47CisgIEdzdENhcHMgKm5jYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIG4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCBpKTsKKworICAgIGlmIChhZGRfcHJpdmF0ZSAmJiAhZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgImF1ZGlvL3gtcHJpdmF0ZTEtYWMzIikpIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqbnMgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHMpOworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAobnMsICJhdWRpby94LXByaXZhdGUxLWFjMyIpOworICAgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAobmNhcHMsIG5zKTsKKyAgICB9IGVsc2UgaWYgKCFhZGRfcHJpdmF0ZSAmJgorICAgICAgICBnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiYXVkaW8veC1wcml2YXRlMS1hYzMiKSkgeworICAgICAgR3N0U3RydWN0dXJlICpucyA9IGdzdF9zdHJ1Y3R1cmVfY29weSAocyk7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChucywgImF1ZGlvL3gtYWMzIik7CisgICAgICBnc3RfY2Fwc19hcHBlbmRfc3RydWN0dXJlIChuY2FwcywgbnMpOworICAgICAgbnMgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHMpOworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAobnMsICJhdWRpby94LWVhYzMiKTsKKyAgICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKG5jYXBzLCBucyk7CisgICAgfSBlbHNlIGlmICghYWRkX3ByaXZhdGUpIHsKKyAgICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKG5jYXBzLCBnc3Rfc3RydWN0dXJlX2NvcHkgKHMpKTsKKyAgICB9CisgIH0KKworICBpZiAoYWRkX3ByaXZhdGUpIHsKKyAgICBnc3RfY2Fwc19hcHBlbmQgKGNhcHMsIG5jYXBzKTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgY2FwcyA9IG5jYXBzOworICB9CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9hYzNfcGFyc2VfZ2V0X3NpbmtfY2FwcyAoR3N0QmFzZVBhcnNlICogcGFyc2UsIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKnBlZXJjYXBzLCAqdGVtcGw7CisgIEdzdENhcHMgKnJlczsKKworICB0ZW1wbCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChHU1RfQkFTRV9QQVJTRV9TSU5LX1BBRCAocGFyc2UpKTsKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKmZjb3B5ID0gZ3N0X2NhcHNfY29weSAoZmlsdGVyKTsKKyAgICAvKiBSZW1vdmUgdGhlIGZpZWxkcyB3ZSBjb252ZXJ0ICovCisgICAgcmVtb3ZlX2ZpZWxkcyAoZmNvcHkpOworICAgIC8qIHdlIGRvIG5vdCBhc2sgZG93bnN0cmVhbSB0byBoYW5kbGUgeC1wcml2YXRlMS1hYzMgKi8KKyAgICBmY29weSA9IGV4dGVuZF9jYXBzIChmY29weSwgRkFMU0UpOworICAgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSwgZmNvcHkpOworICAgIGdzdF9jYXBzX3VucmVmIChmY29weSk7CisgIH0gZWxzZQorICAgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSwgTlVMTCk7CisKKyAgaWYgKHBlZXJjYXBzKSB7CisgICAgLyogUmVtb3ZlIHRoZSBmcmFtZWQgYW5kIGFsaWdubWVudCBmaWVsZC4gV2UgY2FuIGNvbnZlcnQKKyAgICAgKiBiZXR3ZWVuIGRpZmZlcmVudCBhbGlnbm1lbnRzLiAqLworICAgIHBlZXJjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAocGVlcmNhcHMpOworICAgIHJlbW92ZV9maWVsZHMgKHBlZXJjYXBzKTsKKyAgICAvKiBhbHNvIGFsbG93IGZvciB4LXByaXZhdGUxLWFjMyBpbnB1dCAqLworICAgIHBlZXJjYXBzID0gZXh0ZW5kX2NhcHMgKHBlZXJjYXBzLCBUUlVFKTsKKworICAgIHJlcyA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChwZWVyY2FwcywgdGVtcGwsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGVtcGwpOworICB9IGVsc2UgeworICAgIHJlcyA9IHRlbXBsOworICB9CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKmludGVyc2VjdGlvbjsKKworICAgIGludGVyc2VjdGlvbiA9CisgICAgICAgIGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHJlcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmVzKTsKKyAgICByZXMgPSBpbnRlcnNlY3Rpb247CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hYzNfcGFyc2Vfc2V0X3NpbmtfY2FwcyAoR3N0QmFzZVBhcnNlICogcGFyc2UsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIEdzdEFjM1BhcnNlICphYzNwYXJzZSA9IEdTVF9BQzNfUEFSU0UgKHBhcnNlKTsKKworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiYXVkaW8veC1wcml2YXRlMS1hYzMiKSkgeworICAgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChwYXJzZS0+c2lua3BhZCwgZ3N0X2FjM19wYXJzZV9jaGFpbl9wcml2KTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAocGFyc2UtPnNpbmtwYWQsIGFjM3BhcnNlLT5iYXNlcGFyc2VfY2hhaW5mdW5jKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuaCBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTdhZjVhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5oCkBAIC0wLDAgKzEsODMgQEAKKy8qIEdTdHJlYW1lciBBQzMgcGFyc2VyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1dyB1c2VycyBzZiBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIENvbnRhY3Q6IFN0ZWZhbiBLb3N0IDxzdGVmYW4ua29zdEBub2tpYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9BQzNfUEFSU0VfSF9fCisjZGVmaW5lIF9fR1NUX0FDM19QQVJTRV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNlcGFyc2UuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0FDM19QQVJTRSBcCisgIChnc3RfYWMzX3BhcnNlX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9BQzNfUEFSU0Uob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSwgR1NUX1RZUEVfQUMzX1BBUlNFLCBHc3RBYzNQYXJzZSkpCisjZGVmaW5lIEdTVF9BQzNfUEFSU0VfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksIEdTVF9UWVBFX0FDM19QQVJTRSwgR3N0QWMzUGFyc2VDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BQzNfUEFSU0Uob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSwgR1NUX1RZUEVfQUMzX1BBUlNFKSkKKyNkZWZpbmUgR1NUX0lTX0FDM19QQVJTRV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSwgR1NUX1RZUEVfQUMzX1BBUlNFKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEFjM1BhcnNlIEdzdEFjM1BhcnNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEFjM1BhcnNlQ2xhc3MgR3N0QWMzUGFyc2VDbGFzczsKKworZW51bSB7CisgIEdTVF9BQzNfUEFSU0VfQUxJR05fTk9ORSwKKyAgR1NUX0FDM19QQVJTRV9BTElHTl9GUkFNRSwKKyAgR1NUX0FDM19QQVJTRV9BTElHTl9JRUM2MTkzNywKK307CisKKy8qKgorICogR3N0QWMzUGFyc2U6CisgKgorICogVGhlIG9wYXF1ZSBHc3RBYzNQYXJzZSBvYmplY3QKKyAqLworc3RydWN0IF9Hc3RBYzNQYXJzZSB7CisgIEdzdEJhc2VQYXJzZSBiYXNlcGFyc2U7CisKKyAgLyo8IHByaXZhdGUgPiovCisgIGdpbnQgICAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZTsKKyAgZ2ludCAgICAgICAgICAgICAgICAgIGNoYW5uZWxzOworICBnaW50ICAgICAgICAgICAgICAgICAgYmxvY2tzOworICBnYm9vbGVhbiAgICAgICAgICAgICAgZWFjOworICBnYm9vbGVhbiAgICAgICAgICAgICAgc2VudF9jb2RlY190YWc7CisgIHZvbGF0aWxlIGdpbnQgICAgICAgICBhbGlnbjsKKyAgR3N0UGFkQ2hhaW5GdW5jdGlvbiAgIGJhc2VwYXJzZV9jaGFpbmZ1bmM7Cit9OworCisvKioKKyAqIEdzdEFjM1BhcnNlQ2xhc3M6CisgKiBAcGFyZW50X2NsYXNzOiBFbGVtZW50IHBhcmVudCBjbGFzcy4KKyAqCisgKiBUaGUgb3BhcXVlIEdzdEFjM1BhcnNlQ2xhc3MgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0QWMzUGFyc2VDbGFzcyB7CisgIEdzdEJhc2VQYXJzZUNsYXNzIGJhc2VwYXJzZV9jbGFzczsKK307CisKK0dUeXBlIGdzdF9hYzNfcGFyc2VfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfQUMzX1BBUlNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMDEzNTkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmMKQEAgLTAsMCArMSw0NTIgQEAKKy8qIEdTdHJlYW1lciBBZGFwdGl2ZSBNdWx0aS1SYXRlIHBhcnNlciBwbHVnaW4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnRhY3Q6IFN0ZWZhbiBLb3N0IDxzdGVmYW4ua29zdEBub2tpYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYW1ycGFyc2UKKyAqIEBzaG9ydF9kZXNjcmlwdGlvbjogQU1SIHBhcnNlcgorICogQHNlZV9hbHNvOiAjR3N0QW1ybmJEZWMsICNHc3RBbXJuYkVuYworICoKKyAqIFRoaXMgaXMgYW4gQU1SIHBhcnNlciBjYXBhYmxlIG9mIGhhbmRsaW5nIGJvdGggbmFycm93LWJhbmQgYW5kIHdpZGViYW5kCisgKiBmb3JtYXRzLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPWFiYy5hbXIgISBhbXJwYXJzZSAhIGFtcmRlYyAhIGF1ZGlvcmVzYW1wbGUgISBhdWRpb2NvbnZlcnQgISBhbHNhc2luaworICogXXwKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RhbXJwYXJzZS5oIgorI2luY2x1ZGUgPGdzdC9wYnV0aWxzL3BidXRpbHMuaD4KKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby9BTVIsICIgInJhdGUgPSAoaW50KSA4MDAwLCAiICJjaGFubmVscyA9IChpbnQpIDE7IgorICAgICAgICAiYXVkaW8vQU1SLVdCLCAiICJyYXRlID0gKGludCkgMTYwMDAsICIgImNoYW5uZWxzID0gKGludCkgMTsiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1hbXItbmItc2g7IGF1ZGlvL3gtYW1yLXdiLXNoIikpOworCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChhbXJwYXJzZV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBhbXJwYXJzZV9kZWJ1ZworCitzdGF0aWMgY29uc3QgZ2ludCBibG9ja19zaXplX25iWzE2XSA9CisgICAgeyAxMiwgMTMsIDE1LCAxNywgMTksIDIwLCAyNiwgMzEsIDUsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKworc3RhdGljIGNvbnN0IGdpbnQgYmxvY2tfc2l6ZV93YlsxNl0gPQorICAgIHsgMTcsIDIzLCAzMiwgMzYsIDQwLCA0NiwgNTAsIDU4LCA2MCwgNSwgLTEsIC0xLCAtMSwgLTEsIDAsIDAgfTsKKworLyogQU1SIGhhcyBhICJoYXJkY29kZWQiIGZyYW1lcmF0ZSBvZiA1MGZwcyAqLworI2RlZmluZSBBTVJfRlJBTUVTX1BFUl9TRUNPTkQgNTAKKyNkZWZpbmUgQU1SX0ZSQU1FX0RVUkFUSU9OIChHU1RfU0VDT05EL0FNUl9GUkFNRVNfUEVSX1NFQ09ORCkKKyNkZWZpbmUgQU1SX01JTUVfSEVBREVSX1NJWkUgOQorCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2Ftcl9wYXJzZV9zdGFydCAoR3N0QmFzZVBhcnNlICogcGFyc2UpOworc3RhdGljIGdib29sZWFuIGdzdF9hbXJfcGFyc2Vfc3RvcCAoR3N0QmFzZVBhcnNlICogcGFyc2UpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2Ftcl9wYXJzZV9zaW5rX3NldGNhcHMgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfYW1yX3BhcnNlX3NpbmtfZ2V0Y2FwcyAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0Q2FwcyAqIGZpbHRlcik7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9hbXJfcGFyc2VfaGFuZGxlX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lLCBnaW50ICogc2tpcHNpemUpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2Ftcl9wYXJzZV9wcmVfcHVzaF9mcmFtZSAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSk7CisKK0dfREVGSU5FX1RZUEUgKEdzdEFtclBhcnNlLCBnc3RfYW1yX3BhcnNlLCBHU1RfVFlQRV9CQVNFX1BBUlNFKTsKKworLyoqCisgKiBnc3RfYW1yX3BhcnNlX2NsYXNzX2luaXQ6CisgKiBAa2xhc3M6IEdzdEFtclBhcnNlQ2xhc3MuCisgKgorICovCitzdGF0aWMgdm9pZAorZ3N0X2Ftcl9wYXJzZV9jbGFzc19pbml0IChHc3RBbXJQYXJzZUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdzdEJhc2VQYXJzZUNsYXNzICpwYXJzZV9jbGFzcyA9IEdTVF9CQVNFX1BBUlNFX0NMQVNTIChrbGFzcyk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGFtcnBhcnNlX2RlYnVnLCAiYW1ycGFyc2UiLCAwLAorICAgICAgIkFNUi1OQiBhdWRpbyBzdHJlYW0gcGFyc2VyIik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiQU1SIGF1ZGlvIHN0cmVhbSBwYXJzZXIiLCAiQ29kZWMvUGFyc2VyL0F1ZGlvIiwKKyAgICAgICJBZGFwdGl2ZSBNdWx0aS1SYXRlIGF1ZGlvIHBhcnNlciIsCisgICAgICAiUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PiIpOworCisgIHBhcnNlX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYW1yX3BhcnNlX3N0YXJ0KTsKKyAgcGFyc2VfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Ftcl9wYXJzZV9zdG9wKTsKKyAgcGFyc2VfY2xhc3MtPnNldF9zaW5rX2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Ftcl9wYXJzZV9zaW5rX3NldGNhcHMpOworICBwYXJzZV9jbGFzcy0+Z2V0X3NpbmtfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYW1yX3BhcnNlX3NpbmtfZ2V0Y2Fwcyk7CisgIHBhcnNlX2NsYXNzLT5oYW5kbGVfZnJhbWUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Ftcl9wYXJzZV9oYW5kbGVfZnJhbWUpOworICBwYXJzZV9jbGFzcy0+cHJlX3B1c2hfZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hbXJfcGFyc2VfcHJlX3B1c2hfZnJhbWUpOworfQorCisKKy8qKgorICogZ3N0X2Ftcl9wYXJzZV9pbml0OgorICogQGFtcnBhcnNlOiAjR3N0QW1yUGFyc2UKKyAqIEBrbGFzczogI0dzdEFtclBhcnNlQ2xhc3MuCisgKgorICovCitzdGF0aWMgdm9pZAorZ3N0X2Ftcl9wYXJzZV9pbml0IChHc3RBbXJQYXJzZSAqIGFtcnBhcnNlKQoreworICAvKiBpbml0IHJlc3QgKi8KKyAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplIChHU1RfQkFTRV9QQVJTRSAoYW1ycGFyc2UpLCA2Mik7CisgIEdTVF9ERUJVRyAoImluaXRpYWxpemVkIik7CisgIEdTVF9QQURfU0VUX0FDQ0VQVF9JTlRFUlNFQ1QgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChhbXJwYXJzZSkpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChhbXJwYXJzZSkpOworfQorCisKKy8qKgorICogZ3N0X2Ftcl9wYXJzZV9zZXRfc3JjX2NhcHM6CisgKiBAYW1ycGFyc2U6ICNHc3RBbXJQYXJzZS4KKyAqCisgKiBTZXQgc291cmNlIHBhZCBjYXBzIGFjY29yZGluZyB0byBjdXJyZW50IGtub3dsZWRnZSBhYm91dCB0aGUKKyAqIGF1ZGlvIHN0cmVhbS4KKyAqCisgKiBSZXR1cm5zOiBUUlVFIGlmIGNhcHMgd2VyZSBzdWNjZXNzZnVsbHkgc2V0LgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hbXJfcGFyc2Vfc2V0X3NyY19jYXBzIChHc3RBbXJQYXJzZSAqIGFtcnBhcnNlKQoreworICBHc3RDYXBzICpzcmNfY2FwcyA9IE5VTEw7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIGlmIChhbXJwYXJzZS0+d2lkZSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFtcnBhcnNlLCAic2V0dGluZyBzcmNwYWQgY2FwcyB0byBBTVItV0IiKTsKKyAgICBzcmNfY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby9BTVItV0IiLAorICAgICAgICAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAxLCAicmF0ZSIsIEdfVFlQRV9JTlQsIDE2MDAwLCBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhbXJwYXJzZSwgInNldHRpbmcgc3JjcGFkIGNhcHMgdG8gQU1SLU5CIik7CisgICAgLyogTWF4LiBzaXplIG9mIE5CIGZyYW1lIGlzIDMxIGJ5dGVzLCBzbyB3ZSBjYW4gc2V0IHRoZSBtaW4uIGZyYW1lCisgICAgICAgc2l6ZSB0byAzMiAoKzEgZm9yIG5leHQgZnJhbWUgaGVhZGVyKSAqLworICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGFtcnBhcnNlKSwgMzIpOworICAgIHNyY19jYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL0FNUiIsCisgICAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDEsICJyYXRlIiwgR19UWVBFX0lOVCwgODAwMCwgTlVMTCk7CisgIH0KKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoR1NUX0JBU0VfUEFSU0UgKGFtcnBhcnNlKS0+c3JjcGFkKTsKKyAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoR1NUX0JBU0VfUEFSU0UgKGFtcnBhcnNlKS0+c3JjcGFkLCBzcmNfY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNfY2Fwcyk7CisgIHJldHVybiByZXM7Cit9CisKKworLyoqCisgKiBnc3RfYW1yX3BhcnNlX3Npbmtfc2V0Y2FwczoKKyAqIEBzaW5rcGFkOiBHc3RQYWQKKyAqIEBjYXBzOiBHc3RDYXBzCisgKgorICogUmV0dXJuczogVFJVRSBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hbXJfcGFyc2Vfc2lua19zZXRjYXBzIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdEFtclBhcnNlICphbXJwYXJzZTsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGNvbnN0IGdjaGFyICpuYW1lOworCisgIGFtcnBhcnNlID0gR1NUX0FNUl9QQVJTRSAocGFyc2UpOworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgbmFtZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHN0cnVjdHVyZSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYW1ycGFyc2UsICJzZXRjYXBzOiAlcyIsIG5hbWUpOworCisgIGlmICghc3RybmNtcCAobmFtZSwgImF1ZGlvL3gtYW1yLXdiLXNoIiwgMTcpKSB7CisgICAgYW1ycGFyc2UtPmJsb2NrX3NpemUgPSBibG9ja19zaXplX3diOworICAgIGFtcnBhcnNlLT53aWRlID0gMTsKKyAgfSBlbHNlIGlmICghc3RybmNtcCAobmFtZSwgImF1ZGlvL3gtYW1yLW5iLXNoIiwgMTcpKSB7CisgICAgYW1ycGFyc2UtPmJsb2NrX3NpemUgPSBibG9ja19zaXplX25iOworICAgIGFtcnBhcnNlLT53aWRlID0gMDsKKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklORyAoIlVua25vd24gY2FwcyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGFtcnBhcnNlLT5uZWVkX2hlYWRlciA9IEZBTFNFOworICBnc3RfYmFzZV9wYXJzZV9zZXRfZnJhbWVfcmF0ZSAoR1NUX0JBU0VfUEFSU0UgKGFtcnBhcnNlKSwgNTAsIDEsIDIsIDIpOworICBnc3RfYW1yX3BhcnNlX3NldF9zcmNfY2FwcyAoYW1ycGFyc2UpOworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBnc3RfYW1yX3BhcnNlX3BhcnNlX2hlYWRlcjoKKyAqIEBhbXJwYXJzZTogI0dzdEFtclBhcnNlCisgKiBAZGF0YTogSGVhZGVyIGRhdGEgdG8gYmUgcGFyc2VkLgorICogQHNraXBzaXplOiBPdXRwdXQgYXJndW1lbnQgd2hlcmUgdGhlIGZyYW1lIHNpemUgd2lsbCBiZSBzdG9yZWQuCisgKgorICogQ2hlY2sgaWYgdGhlIGdpdmVuIGRhdGEgY29udGFpbnMgYW4gQU1SIG1pbWUgaGVhZGVyLgorICoKKyAqIFJldHVybnM6IFRSVUUgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYW1yX3BhcnNlX3BhcnNlX2hlYWRlciAoR3N0QW1yUGFyc2UgKiBhbXJwYXJzZSwKKyAgICBjb25zdCBndWludDggKiBkYXRhLCBnaW50ICogc2tpcHNpemUpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGFtcnBhcnNlLCAiUGFyc2luZyBoZWFkZXIgZGF0YSIpOworCisgIGlmICghbWVtY21wIChkYXRhLCAiIyFBTVItV0JcbiIsIDkpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYW1ycGFyc2UsICJBTVItV0IgZGV0ZWN0ZWQiKTsKKyAgICBhbXJwYXJzZS0+YmxvY2tfc2l6ZSA9IGJsb2NrX3NpemVfd2I7CisgICAgYW1ycGFyc2UtPndpZGUgPSBUUlVFOworICAgICpza2lwc2l6ZSA9IGFtcnBhcnNlLT5oZWFkZXIgPSA5OworICB9IGVsc2UgaWYgKCFtZW1jbXAgKGRhdGEsICIjIUFNUlxuIiwgNikpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhbXJwYXJzZSwgIkFNUi1OQiBkZXRlY3RlZCIpOworICAgIGFtcnBhcnNlLT5ibG9ja19zaXplID0gYmxvY2tfc2l6ZV9uYjsKKyAgICBhbXJwYXJzZS0+d2lkZSA9IEZBTFNFOworICAgICpza2lwc2l6ZSA9IGFtcnBhcnNlLT5oZWFkZXIgPSA2OworICB9IGVsc2UKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZ3N0X2Ftcl9wYXJzZV9zZXRfc3JjX2NhcHMgKGFtcnBhcnNlKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqCisgKiBnc3RfYW1yX3BhcnNlX2NoZWNrX3ZhbGlkX2ZyYW1lOgorICogQHBhcnNlOiAjR3N0QmFzZVBhcnNlLgorICogQGJ1ZmZlcjogI0dzdEJ1ZmZlci4KKyAqIEBmcmFtZXNpemU6IE91dHB1dCB2YXJpYWJsZSB3aGVyZSB0aGUgZm91bmQgZnJhbWUgc2l6ZSBpcyBwdXQuCisgKiBAc2tpcHNpemU6IE91dHB1dCB2YXJpYWJsZSB3aGljaCB0ZWxscyBob3cgbXVjaCBkYXRhIG5lZWRzIHRvIGJlIHNraXBwZWQKKyAqICAgICAgICAgICAgdW50aWwgYSBmcmFtZSBoZWFkZXIgaXMgZm91bmQuCisgKgorICogSW1wbGVtZW50YXRpb24gb2YgImNoZWNrX3ZhbGlkX2ZyYW1lIiB2bWV0aG9kIGluICNHc3RCYXNlUGFyc2UgY2xhc3MuCisgKgorICogUmV0dXJuczogVFJVRSBpZiB0aGUgZ2l2ZW4gZGF0YSBjb250YWlucyB2YWxpZCBmcmFtZS4KKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hbXJfcGFyc2VfaGFuZGxlX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lLCBnaW50ICogc2tpcHNpemUpCit7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2ludCBmc2l6ZSA9IDAsIG1vZGUsIGRzaXplOworICBHc3RBbXJQYXJzZSAqYW1ycGFyc2U7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGdib29sZWFuIGZvdW5kID0gRkFMU0U7CisKKyAgYW1ycGFyc2UgPSBHU1RfQU1SX1BBUlNFIChwYXJzZSk7CisgIGJ1ZmZlciA9IGZyYW1lLT5idWZmZXI7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZHNpemUgPSBtYXAuc2l6ZTsKKworICBHU1RfTE9HICgiYnVmZmVyOiAlZCBieXRlcyIsIGRzaXplKTsKKworICBpZiAoYW1ycGFyc2UtPm5lZWRfaGVhZGVyKSB7CisgICAgaWYgKGRzaXplID49IEFNUl9NSU1FX0hFQURFUl9TSVpFICYmCisgICAgICAgIGdzdF9hbXJfcGFyc2VfcGFyc2VfaGVhZGVyIChhbXJwYXJzZSwgbWFwLmRhdGEsIHNraXBzaXplKSkgeworICAgICAgYW1ycGFyc2UtPm5lZWRfaGVhZGVyID0gRkFMU0U7CisgICAgICBnc3RfYmFzZV9wYXJzZV9zZXRfZnJhbWVfcmF0ZSAoR1NUX0JBU0VfUEFSU0UgKGFtcnBhcnNlKSwgNTAsIDEsIDIsIDIpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklORyAoIm1lZGlhIGRvZXNuJ3QgbG9vayBsaWtlIGEgQU1SIGZvcm1hdCIpOworICAgIH0KKyAgICAvKiBXZSByZXR1cm4gRkFMU0UsIHNvIHRoaXMgZnJhbWUgd29uJ3QgZ2V0IHB1c2hlZCBmb3J3YXJkLiBJbnN0ZWFkLAorICAgICAgIHRoZSAic2tpcCIgdmFsdWUgaXMgc2V0LCBzbyBuZXh0IHRpbWUgd2Ugd2lsbCByZWNlaXZlIGEgdmFsaWQgZnJhbWUuICovCisgICAgZ290byBkb25lOworICB9CisKKyAgKnNraXBzaXplID0gMTsKKyAgLyogRG9lcyB0aGlzIGxvb2sgbGlrZSBhIHBvc3NpYmxlIGZyYW1lIGhlYWRlciBjYW5kaWRhdGU/ICovCisgIGlmICgobWFwLmRhdGFbMF0gJiAweDgzKSA9PSAwKSB7CisgICAgLyogWWVwLiBSZXRyaWV2ZSB0aGUgZnJhbWUgc2l6ZSAqLworICAgIG1vZGUgPSAobWFwLmRhdGFbMF0gPj4gMykgJiAweDBGOworICAgIGZzaXplID0gYW1ycGFyc2UtPmJsb2NrX3NpemVbbW9kZV0gKyAxOyAgICAgLyogKzEgZm9yIHRoZSBoZWFkZXIgYnl0ZSAqLworCisgICAgLyogV2UgcmVjb2duaXplIHRoaXMgZGF0YSBhcyBhIHZhbGlkIGZyYW1lIHdoZW46CisgICAgICogICAgIC0gV2UgYXJlIGluIHN5bmMuIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGV4dHJhIGNoZWNrcyB0aGVuCisgICAgICogICAgIC0gV2UgYXJlIGluIEVPUy4gVGhlcmUgbWlnaHQgbm90IGJlIGVub3VnaCBkYXRhIHRvIGNoZWNrIG5leHQgZnJhbWUKKyAgICAgKiAgICAgLSBTeW5jIGlzIGxvc3QsIGJ1dCB0aGUgZm9sbG93aW5nIGRhdGEgYWZ0ZXIgdGhpcyBmcmFtZSBzZWVtCisgICAgICogICAgICAgdG8gY29udGFpbiBhIHZhbGlkIGhlYWRlciBhcyB3ZWxsIChhbmQgdGhlcmUgaXMgZW5vdWdoIGRhdGEgdG8KKyAgICAgKiAgICAgICBwZXJmb3JtIHRoaXMgY2hlY2spCisgICAgICovCisgICAgaWYgKGZzaXplKSB7CisgICAgICAqc2tpcHNpemUgPSAwOworICAgICAgLyogaW4gc3luYywgbm8gZnVydGhlciBjaGVjayAqLworICAgICAgaWYgKCFHU1RfQkFTRV9QQVJTRV9MT1NUX1NZTkMgKHBhcnNlKSkgeworICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICB9IGVsc2UgaWYgKGRzaXplID4gZnNpemUpIHsKKyAgICAgICAgLyogZW5vdWdoIGRhdGEsIGNoZWNrIGZvciBuZXh0IHN5bmMgKi8KKyAgICAgICAgaWYgKChtYXAuZGF0YVtmc2l6ZV0gJiAweDgzKSA9PSAwKQorICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgIH0gZWxzZSBpZiAoR1NUX0JBU0VfUEFSU0VfRFJBSU5JTkcgKHBhcnNlKSkgeworICAgICAgICAvKiBub3QgZW5vdWdoLCBidXQgZHJhaW5pbmcsIHNvIG9rICovCisgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworZG9uZToKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICBpZiAoZm91bmQgJiYgZnNpemUgPD0gbWFwLnNpemUpIHsKKyAgICByZXQgPSBnc3RfYmFzZV9wYXJzZV9maW5pc2hfZnJhbWUgKHBhcnNlLCBmcmFtZSwgZnNpemUpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBnc3RfYW1yX3BhcnNlX3N0YXJ0OgorICogQHBhcnNlOiAjR3N0QmFzZVBhcnNlLgorICoKKyAqIEltcGxlbWVudGF0aW9uIG9mICJzdGFydCIgdm1ldGhvZCBpbiAjR3N0QmFzZVBhcnNlIGNsYXNzLgorICoKKyAqIFJldHVybnM6IFRSVUUgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYW1yX3BhcnNlX3N0YXJ0IChHc3RCYXNlUGFyc2UgKiBwYXJzZSkKK3sKKyAgR3N0QW1yUGFyc2UgKmFtcnBhcnNlOworCisgIGFtcnBhcnNlID0gR1NUX0FNUl9QQVJTRSAocGFyc2UpOworICBHU1RfREVCVUcgKCJzdGFydCIpOworICBhbXJwYXJzZS0+bmVlZF9oZWFkZXIgPSBUUlVFOworICBhbXJwYXJzZS0+aGVhZGVyID0gMDsKKyAgYW1ycGFyc2UtPnNlbnRfY29kZWNfdGFnID0gRkFMU0U7CisgIHJldHVybiBUUlVFOworfQorCisKKy8qKgorICogZ3N0X2Ftcl9wYXJzZV9zdG9wOgorICogQHBhcnNlOiAjR3N0QmFzZVBhcnNlLgorICoKKyAqIEltcGxlbWVudGF0aW9uIG9mICJzdG9wIiB2bWV0aG9kIGluICNHc3RCYXNlUGFyc2UgY2xhc3MuCisgKgorICogUmV0dXJuczogVFJVRSBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hbXJfcGFyc2Vfc3RvcCAoR3N0QmFzZVBhcnNlICogcGFyc2UpCit7CisgIEdzdEFtclBhcnNlICphbXJwYXJzZTsKKworICBhbXJwYXJzZSA9IEdTVF9BTVJfUEFSU0UgKHBhcnNlKTsKKyAgR1NUX0RFQlVHICgic3RvcCIpOworICBhbXJwYXJzZS0+bmVlZF9oZWFkZXIgPSBUUlVFOworICBhbXJwYXJzZS0+aGVhZGVyID0gMDsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9hbXJfcGFyc2Vfc2lua19nZXRjYXBzIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0Q2FwcyAqcGVlcmNhcHMsICp0ZW1wbDsKKyAgR3N0Q2FwcyAqcmVzOworCisKKyAgdGVtcGwgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU0lOS19QQUQgKHBhcnNlKSk7CisgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSwgZmlsdGVyKTsKKworICBpZiAocGVlcmNhcHMpIHsKKyAgICBndWludCBpLCBuOworCisgICAgLyogUmVuYW1lIHN0cnVjdHVyZSBuYW1lcyAqLworICAgIHBlZXJjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAocGVlcmNhcHMpOworICAgIG4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAocGVlcmNhcHMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHBlZXJjYXBzLCBpKTsKKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJhdWRpby9BTVIiKSkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAocywgImF1ZGlvL3gtYW1yLW5iLXNoIik7CisgICAgICBlbHNlCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHMsICJhdWRpby94LWFtci13Yi1zaCIpOworICAgIH0KKworICAgIHJlcyA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChwZWVyY2FwcywgdGVtcGwsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICByZXMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChyZXMpOworICAgIC8qIEFwcGVuZCB0aGUgdGVtcGxhdGUgY2FwcyBiZWNhdXNlIHdlIHN0aWxsIHdhbnQgdG8gYWNjZXB0CisgICAgICogY2FwcyB3aXRob3V0IGFueSBmaWVsZHMgaW4gdGhlIGNhc2UgdXBzdHJlYW0gZG9lcyBub3QKKyAgICAgKiBrbm93IGFueXRoaW5nLgorICAgICAqLworICAgIGdzdF9jYXBzX2FwcGVuZCAocmVzLCB0ZW1wbCk7CisgIH0gZWxzZSB7CisgICAgcmVzID0gdGVtcGw7CisgIH0KKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uOworCisgICAgaW50ZXJzZWN0aW9uID0KKyAgICAgICAgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgcmVzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmIChyZXMpOworICAgIHJlcyA9IGludGVyc2VjdGlvbjsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYW1yX3BhcnNlX3ByZV9wdXNoX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0QW1yUGFyc2UgKmFtcnBhcnNlID0gR1NUX0FNUl9QQVJTRSAocGFyc2UpOworCisgIGlmICghYW1ycGFyc2UtPnNlbnRfY29kZWNfdGFnKSB7CisgICAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgLyogY29kZWMgdGFnICovCisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpKTsKKyAgICBpZiAoR19VTkxJS0VMWSAoY2FwcyA9PSBOVUxMKSkgeworICAgICAgaWYgKEdTVF9QQURfSVNfRkxVU0hJTkcgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSkpIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgZmx1c2hpbmciKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgbm90IG5lZ290aWF0ZWQhIik7CisgICAgICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0YWdsaXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgICBnc3RfcGJfdXRpbHNfYWRkX2NvZGVjX2Rlc2NyaXB0aW9uX3RvX3RhZ19saXN0ICh0YWdsaXN0LAorICAgICAgICBHU1RfVEFHX0FVRElPX0NPREVDLCBjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgICBnc3RfYmFzZV9wYXJzZV9tZXJnZV90YWdzIChwYXJzZSwgdGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFKTsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ2xpc3QpOworCisgICAgLyogYWxzbyBzaWduYWxzIHRoZSBlbmQgb2YgZmlyc3QtZnJhbWUgcHJvY2Vzc2luZyAqLworICAgIGFtcnBhcnNlLT5zZW50X2NvZGVjX3RhZyA9IFRSVUU7CisgIH0KKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CmRpZmYgLS1naXQgYS9nc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmggYi9nc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhMjljMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuaApAQCAtMCwwICsxLDc4IEBACisvKiBHU3RyZWFtZXIgQWRhcHRpdmUgTXVsdGktUmF0ZSBwYXJzZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdDogU3RlZmFuIEtvc3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0FNUl9QQVJTRV9IX18KKyNkZWZpbmUgX19HU1RfQU1SX1BBUlNFX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2VwYXJzZS5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQU1SX1BBUlNFIFwKKyAgKGdzdF9hbXJfcGFyc2VfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0FNUl9QQVJTRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLCBHU1RfVFlQRV9BTVJfUEFSU0UsIEdzdEFtclBhcnNlKSkKKyNkZWZpbmUgR1NUX0FNUl9QQVJTRV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSwgR1NUX1RZUEVfQU1SX1BBUlNFLCBHc3RBbXJQYXJzZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FNUl9QQVJTRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLCBHU1RfVFlQRV9BTVJfUEFSU0UpKQorI2RlZmluZSBHU1RfSVNfQU1SX1BBUlNFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLCBHU1RfVFlQRV9BTVJfUEFSU0UpKQorCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBbXJQYXJzZSBHc3RBbXJQYXJzZTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RBbXJQYXJzZUNsYXNzIEdzdEFtclBhcnNlQ2xhc3M7CisKKy8qKgorICogR3N0QW1yUGFyc2U6CisgKiBAZWxlbWVudDogdGhlIHBhcmVudCBlbGVtZW50LgorICogQGJsb2NrX3NpemU6IFBvaW50ZXIgdG8gZnJhbWUgc2l6ZSBsb29rdXAgdGFibGUuCisgKiBAbmVlZF9oZWFkZXI6IFRlbGxzIHdoZXRoZXIgdGhlIE1JTUUgaGVhZGVyIHNob3VsZCBiZSByZWFkIGluIHRoZSBiZWdpbm5pbmcuCisgKiBAd2lkZTogV2lkZWJhbmQgbW9kZS4KKyAqCisgKiBUaGUgb3BhcXVlIEdzdEFhY1BhcnNlIGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdEFtclBhcnNlIHsKKyAgR3N0QmFzZVBhcnNlIGVsZW1lbnQ7CisgIGNvbnN0IGdpbnQgKmJsb2NrX3NpemU7CisgIGdib29sZWFuIG5lZWRfaGVhZGVyOworICBnYm9vbGVhbiBzZW50X2NvZGVjX3RhZzsKKyAgZ2ludCBoZWFkZXI7CisgIGdib29sZWFuIHdpZGU7Cit9OworCisvKioKKyAqIEdzdEFtclBhcnNlQ2xhc3M6CisgKiBAcGFyZW50X2NsYXNzOiBFbGVtZW50IHBhcmVudCBjbGFzcy4KKyAqCisgKiBUaGUgb3BhcXVlIEdzdEFtclBhcnNlQ2xhc3MgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0QW1yUGFyc2VDbGFzcyB7CisgIEdzdEJhc2VQYXJzZUNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9hbXJfcGFyc2VfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfQU1SX1BBUlNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYTQwYWMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmMKQEAgLTAsMCArMSw2MTcgQEAKKy8qIEdTdHJlYW1lciBEQ0EgcGFyc2VyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1kY2FwYXJzZQorICogQHNob3J0X2Rlc2NyaXB0aW9uOiBEQ0EgKERUUyBDb2hlcmVudCBBY291c3RpY3MpIHBhcnNlcgorICogQHNlZV9hbHNvOiAjR3N0QW1yUGFyc2UsICNHc3RBQUNQYXJzZSwgI0dzdEFjM1BhcnNlCisgKgorICogVGhpcyBpcyBhIERDQSAoRFRTIENvaGVyZW50IEFjb3VzdGljcykgcGFyc2VyLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPWFiYy5kdHMgISBkY2FwYXJzZSAhIGR0c2RlYyAhIGF1ZGlvcmVzYW1wbGUgISBhdWRpb2NvbnZlcnQgISBhdXRvYXVkaW9zaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisvKiBUT0RPOgorICogIC0gc2hvdWxkIGFjY2VwdCBmcmFtZWQgYW5kIHVuZnJhbWVkIGlucHV0IChuZWVkcyBkZWNvZGViaW4gZml4ZXMgZmlyc3QpCisgKiAgLSBzZWVraW5nIGluIHJhdyAuZHRzIGZpbGVzIGRvZXNuJ3Qgc2VlbSB0byB3b3JrLCBidXQgZHVyYXRpb24gZXN0aW1hdGUgb2sKKyAqCisgKiAgLSBpZiBmcmFtZXMgaGF2ZSAnb2RkJyBkdXJhdGlvbnMsIHRoZSBmcmFtZSBkdXJhdGlvbnMgKHBsdXMgdGltZXN0YW1wcykKKyAqICAgIGFyZW4ndCBhZGp1c3RlZCB1cCBvY2Nhc2lvbmFsbHkgdG8gbWFrZSB1cCBmb3Igcm91bmRpbmcgZXJyb3IgZ2Fwcy4KKyAqICAgIChlLmcuIGlmIDUxMiBzYW1wbGVzIHBlciBmcmFtZSBAIDQ4a0h6ID0gMTAuNjY2NjY2NjY3IG1zL2ZyYW1lKQorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0ZGNhcGFyc2UuaCIKKyNpbmNsdWRlIDxnc3QvYmFzZS9iYXNlLmg+CisjaW5jbHVkZSA8Z3N0L3BidXRpbHMvcGJ1dGlscy5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChkY2FfcGFyc2VfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZGNhX3BhcnNlX2RlYnVnCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1kdHMsIgorICAgICAgICAiIGZyYW1lZCA9IChib29sZWFuKSB0cnVlLCIKKyAgICAgICAgIiBjaGFubmVscyA9IChpbnQpIFsgMSwgOCBdLCIKKyAgICAgICAgIiByYXRlID0gKGludCkgWyA4MDAwLCAxOTIwMDAgXSwiCisgICAgICAgICIgZGVwdGggPSAoaW50KSB7IDE0LCAxNiB9LCIKKyAgICAgICAgIiBlbmRpYW5uZXNzID0gKGludCkgeyBMSVRUTEVfRU5ESUFOLCBCSUdfRU5ESUFOIH0sICIKKyAgICAgICAgIiBibG9jay1zaXplID0gKGludCkgWyAxLCBNQVhdLCAiICIgZnJhbWUtc2l6ZSA9IChpbnQpIFsgMSwgTUFYXSIpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LWR0czsgIiAiYXVkaW8veC1wcml2YXRlMS1kdHMiKSk7CisKK3N0YXRpYyB2b2lkIGdzdF9kY2FfcGFyc2VfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2RjYV9wYXJzZV9zdGFydCAoR3N0QmFzZVBhcnNlICogcGFyc2UpOworc3RhdGljIGdib29sZWFuIGdzdF9kY2FfcGFyc2Vfc3RvcCAoR3N0QmFzZVBhcnNlICogcGFyc2UpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2RjYV9wYXJzZV9oYW5kbGVfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUsIGdpbnQgKiBza2lwc2l6ZSk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfZGNhX3BhcnNlX3ByZV9wdXNoX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfZGNhX3BhcnNlX2dldF9zaW5rX2NhcHMgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9kY2FfcGFyc2Vfc2V0X3NpbmtfY2FwcyAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworCisjZGVmaW5lIGdzdF9kY2FfcGFyc2VfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0RGNhUGFyc2UsIGdzdF9kY2FfcGFyc2UsIEdTVF9UWVBFX0JBU0VfUEFSU0UpOworCitzdGF0aWMgdm9pZAorZ3N0X2RjYV9wYXJzZV9jbGFzc19pbml0IChHc3REY2FQYXJzZUNsYXNzICoga2xhc3MpCit7CisgIEdzdEJhc2VQYXJzZUNsYXNzICpwYXJzZV9jbGFzcyA9IEdTVF9CQVNFX1BBUlNFX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZGNhX3BhcnNlX2RlYnVnLCAiZGNhcGFyc2UiLCAwLAorICAgICAgIkRDQSBhdWRpbyBzdHJlYW0gcGFyc2VyIik7CisKKyAgb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9kY2FfcGFyc2VfZmluYWxpemU7CisKKyAgcGFyc2VfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kY2FfcGFyc2Vfc3RhcnQpOworICBwYXJzZV9jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGNhX3BhcnNlX3N0b3ApOworICBwYXJzZV9jbGFzcy0+aGFuZGxlX2ZyYW1lID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kY2FfcGFyc2VfaGFuZGxlX2ZyYW1lKTsKKyAgcGFyc2VfY2xhc3MtPnByZV9wdXNoX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGNhX3BhcnNlX3ByZV9wdXNoX2ZyYW1lKTsKKyAgcGFyc2VfY2xhc3MtPmdldF9zaW5rX2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2RjYV9wYXJzZV9nZXRfc2lua19jYXBzKTsKKyAgcGFyc2VfY2xhc3MtPnNldF9zaW5rX2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2RjYV9wYXJzZV9zZXRfc2lua19jYXBzKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywKKyAgICAgICJEVFMgQ29oZXJlbnQgQWNvdXN0aWNzIGF1ZGlvIHN0cmVhbSBwYXJzZXIiLCAiQ29kZWMvUGFyc2VyL0F1ZGlvIiwKKyAgICAgICJEQ0EgcGFyc2VyIiwgIlRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGNhX3BhcnNlX3Jlc2V0IChHc3REY2FQYXJzZSAqIGRjYXBhcnNlKQoreworICBkY2FwYXJzZS0+Y2hhbm5lbHMgPSAtMTsKKyAgZGNhcGFyc2UtPnJhdGUgPSAtMTsKKyAgZGNhcGFyc2UtPmRlcHRoID0gLTE7CisgIGRjYXBhcnNlLT5lbmRpYW5uZXNzID0gLTE7CisgIGRjYXBhcnNlLT5ibG9ja19zaXplID0gLTE7CisgIGRjYXBhcnNlLT5mcmFtZV9zaXplID0gLTE7CisgIGRjYXBhcnNlLT5sYXN0X3N5bmMgPSAwOworICBkY2FwYXJzZS0+c2VudF9jb2RlY190YWcgPSBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kY2FfcGFyc2VfaW5pdCAoR3N0RGNhUGFyc2UgKiBkY2FwYXJzZSkKK3sKKyAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplIChHU1RfQkFTRV9QQVJTRSAoZGNhcGFyc2UpLAorICAgICAgRENBX01JTl9GUkFNRVNJWkUpOworICBnc3RfZGNhX3BhcnNlX3Jlc2V0IChkY2FwYXJzZSk7CisgIGRjYXBhcnNlLT5iYXNlcGFyc2VfY2hhaW5mdW5jID0KKyAgICAgIEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChHU1RfQkFTRV9QQVJTRSAoZGNhcGFyc2UpKS0+Y2hhaW5mdW5jOworCisgIEdTVF9QQURfU0VUX0FDQ0VQVF9JTlRFUlNFQ1QgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChkY2FwYXJzZSkpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChkY2FwYXJzZSkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RjYV9wYXJzZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kY2FfcGFyc2Vfc3RhcnQgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKQoreworICBHc3REY2FQYXJzZSAqZGNhcGFyc2UgPSBHU1RfRENBX1BBUlNFIChwYXJzZSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJzdGFydGluZyIpOworCisgIGdzdF9kY2FfcGFyc2VfcmVzZXQgKGRjYXBhcnNlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZGNhX3BhcnNlX3N0b3AgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKQoreworICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgInN0b3BwaW5nIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RjYV9wYXJzZV9wYXJzZV9oZWFkZXIgKEdzdERjYVBhcnNlICogZGNhcGFyc2UsCisgICAgY29uc3QgR3N0Qnl0ZVJlYWRlciAqIHJlYWRlciwgZ3VpbnQgKiBmcmFtZV9zaXplLAorICAgIGd1aW50ICogc2FtcGxlX3JhdGUsIGd1aW50ICogY2hhbm5lbHMsIGd1aW50ICogZGVwdGgsCisgICAgZ2ludCAqIGVuZGlhbm5lc3MsIGd1aW50ICogbnVtX2Jsb2NrcywgZ3VpbnQgKiBzYW1wbGVzX3Blcl9ibG9jaywKKyAgICBnYm9vbGVhbiAqIHRlcm1pbmF0b3IpCit7CisgIHN0YXRpYyBjb25zdCBpbnQgc2FtcGxlX3JhdGVzWzE2XSA9IHsgMCwgODAwMCwgMTYwMDAsIDMyMDAwLCAwLCAwLCAxMTAyNSwKKyAgICAyMjA1MCwgNDQxMDAsIDAsIDAsIDEyMDAwLCAyNDAwMCwgNDgwMDAsIDk2MDAwLCAxOTIwMDAKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGd1aW50OCBjaGFubmVsc190YWJsZVsxNl0gPSB7IDEsIDIsIDIsIDIsIDIsIDMsIDMsIDQsIDQsIDUsCisgICAgNiwgNiwgNiwgNywgOCwgOAorICB9OworICBHc3RCeXRlUmVhZGVyIHIgPSAqcmVhZGVyOworICBndWludDE2IGhkcls4XTsKKyAgZ3VpbnQzMiBtYXJrZXI7CisgIGd1aW50IGNoYW5zLCBsZmUsIGk7CisKKyAgaWYgKGdzdF9ieXRlX3JlYWRlcl9nZXRfcmVtYWluaW5nICgmcikgPCAoNCArIHNpemVvZiAoaGRyKSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIG1hcmtlciA9IGdzdF9ieXRlX3JlYWRlcl9wZWVrX3VpbnQzMl9iZV91bmNoZWNrZWQgKCZyKTsKKworICAvKiByYXcgYmlnIGVuZGlhbiBvciAxNC1iaXQgYmlnIGVuZGlhbiAqLworICBpZiAobWFya2VyID09IDB4N0ZGRTgwMDEgfHwgbWFya2VyID09IDB4MUZGRkU4MDApIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTIChoZHIpOyArK2kpCisgICAgICBoZHJbaV0gPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9iZV91bmNoZWNrZWQgKCZyKTsKKyAgfSBlbHNlCisgICAgLyogcmF3IGxpdHRsZSBlbmRpYW4gb3IgMTQtYml0IGxpdHRsZSBlbmRpYW4gKi8KKyAgaWYgKG1hcmtlciA9PSAweEZFN0YwMTgwIHx8IG1hcmtlciA9PSAweEZGMUYwMEU4KSB7CisgICAgZm9yIChpID0gMDsgaSA8IEdfTl9FTEVNRU5UUyAoaGRyKTsgKytpKQorICAgICAgaGRyW2ldID0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGVfdW5jaGVja2VkICgmcik7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRjYXBhcnNlLCAiZHRzIHN5bmMgbWFya2VyIDB4JTA4eCBhdCBvZmZzZXQgJXUiLCBtYXJrZXIsCisgICAgICBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3BvcyAocmVhZGVyKSk7CisKKyAgLyogMTQtYml0IG1vZGUgKi8KKyAgaWYgKG1hcmtlciA9PSAweDFGRkZFODAwIHx8IG1hcmtlciA9PSAweEZGMUYwMEU4KSB7CisgICAgaWYgKChoZHJbMl0gJiAweEZGRjApICE9IDB4MDdGMCkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAvKiBkaXNjYXJkIHRvcCAyIGJpdHMgKDIgdm9pZCksIHNoaWZ0IGluIDIgKi8KKyAgICBoZHJbMF0gPSAoaGRyWzBdIDw8IDIpIHwgKChoZHJbMV0gPj4gMTIpICYgMHgwMDAzKTsKKyAgICAvKiBkaXNjYXJkIHRvcCA0IGJpdHMgKDIgdm9pZCwgMiBzaGlmdGVkIGludG8gaGRyWzBdKSwgc2hpZnQgaW4gNCBldGMuICovCisgICAgaGRyWzFdID0gKGhkclsxXSA8PCA0KSB8ICgoaGRyWzJdID4+IDEwKSAmIDB4MDAwRik7CisgICAgaGRyWzJdID0gKGhkclsyXSA8PCA2KSB8ICgoaGRyWzNdID4+IDgpICYgMHgwMDNGKTsKKyAgICBoZHJbM10gPSAoaGRyWzNdIDw8IDgpIHwgKChoZHJbNF0gPj4gNikgJiAweDAwRkYpOworICAgIGhkcls0XSA9IChoZHJbNF0gPDwgMTApIHwgKChoZHJbNV0gPj4gNCkgJiAweDAzRkYpOworICAgIGhkcls1XSA9IChoZHJbNV0gPDwgMTIpIHwgKChoZHJbNl0gPj4gMikgJiAweDBGRkYpOworICAgIGhkcls2XSA9IChoZHJbNl0gPDwgMTQpIHwgKChoZHJbN10gPj4gMCkgJiAweDNGRkYpOworICAgIGdfYXNzZXJ0IChoZHJbMF0gPT0gMHg3RkZFICYmIGhkclsxXSA9PSAweDgwMDEpOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRjYXBhcnNlLCAiZnJhbWUgaGVhZGVyOiAlMDR4JTA0eCUwNHglMDR4IiwKKyAgICAgIGhkclsyXSwgaGRyWzNdLCBoZHJbNF0sIGhkcls1XSk7CisKKyAgKnRlcm1pbmF0b3IgPSAoaGRyWzJdICYgMHg4MCkgPyBGQUxTRSA6IFRSVUU7CisgICpzYW1wbGVzX3Blcl9ibG9jayA9ICgoaGRyWzJdID4+IDEwKSAmIDB4MWYpICsgMTsKKyAgKm51bV9ibG9ja3MgPSAoKGhkclsyXSA+PiAyKSAmIDB4N0YpICsgMTsKKyAgKmZyYW1lX3NpemUgPSAoKChoZHJbMl0gJiAweDAzKSA8PCAxMikgfCAoaGRyWzNdID4+IDQpKSArIDE7CisgIGNoYW5zID0gKChoZHJbM10gJiAweDBGKSA8PCAyKSB8IChoZHJbNF0gPj4gMTQpOworICAqc2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZXNbKGhkcls0XSA+PiAxMCkgJiAweDBGXTsKKyAgbGZlID0gKGhkcls1XSA+PiA5KSAmIDB4MDM7CisKKyAgR1NUX1RSQUNFX09CSkVDVCAoZGNhcGFyc2UsICJmcmFtZSBzaXplICV1LCBudW1fYmxvY2tzICV1LCByYXRlICV1LCAiCisgICAgICAic2FtcGxlcyBwZXIgYmxvY2sgJXUiLCAqZnJhbWVfc2l6ZSwgKm51bV9ibG9ja3MsICpzYW1wbGVfcmF0ZSwKKyAgICAgICpzYW1wbGVzX3Blcl9ibG9jayk7CisKKyAgaWYgKCpudW1fYmxvY2tzIDwgNiB8fCAqZnJhbWVfc2l6ZSA8IDk2IHx8ICpzYW1wbGVfcmF0ZSA9PSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAobWFya2VyID09IDB4MUZGRkU4MDAgfHwgbWFya2VyID09IDB4RkYxRjAwRTgpCisgICAgKmZyYW1lX3NpemUgPSAoKmZyYW1lX3NpemUgKiAxNikgLyAxNDsgICAgICAvKiBGSVhNRTogcm91bmQgdXA/ICovCisKKyAgaWYgKGNoYW5zIDwgR19OX0VMRU1FTlRTIChjaGFubmVsc190YWJsZSkpCisgICAgKmNoYW5uZWxzID0gY2hhbm5lbHNfdGFibGVbY2hhbnNdICsgKChsZmUpID8gMSA6IDApOworICBlbHNlCisgICAgKmNoYW5uZWxzID0gMDsKKworICBpZiAoZGVwdGgpCisgICAgKmRlcHRoID0gKG1hcmtlciA9PSAweDFGRkZFODAwIHx8IG1hcmtlciA9PSAweEZGMUYwMEU4KSA/IDE0IDogMTY7CisgIGlmIChlbmRpYW5uZXNzKQorICAgICplbmRpYW5uZXNzID0gKG1hcmtlciA9PSAweEZFN0YwMTgwIHx8IG1hcmtlciA9PSAweEZGMUYwMEU4KSA/CisgICAgICAgIEdfTElUVExFX0VORElBTiA6IEdfQklHX0VORElBTjsKKworICBHU1RfVFJBQ0VfT0JKRUNUIChkY2FwYXJzZSwgImZyYW1lIHNpemUgJXUsIGNoYW5uZWxzICV1LCByYXRlICV1LCAiCisgICAgICAibnVtX2Jsb2NrcyAldSwgc2FtcGxlc19wZXJfYmxvY2sgJXUiLCAqZnJhbWVfc2l6ZSwgKmNoYW5uZWxzLAorICAgICAgKnNhbXBsZV9yYXRlLCAqbnVtX2Jsb2NrcywgKnNhbXBsZXNfcGVyX2Jsb2NrKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdpbnQKK2dzdF9kY2FfcGFyc2VfZmluZF9zeW5jIChHc3REY2FQYXJzZSAqIGRjYXBhcnNlLCBHc3RCeXRlUmVhZGVyICogcmVhZGVyLAorICAgIGdzaXplIGJ1ZnNpemUsIGd1aW50MzIgKiBzeW5jKQoreworICBndWludDMyIGJlc3Rfc3luYyA9IDA7CisgIGd1aW50IGJlc3Rfb2Zmc2V0ID0gR19NQVhVSU5UOworICBnaW50IG9mZjsKKworICAvKiBGSVhNRTogdmVyaWZ5IHN5bmNzIHZpYSBfcGFyc2VfaGVhZGVyKCkgaGVyZSBhbHJlYWR5ICovCisKKyAgLyogUmF3IGxpdHRsZSBlbmRpYW4gKi8KKyAgb2ZmID0gZ3N0X2J5dGVfcmVhZGVyX21hc2tlZF9zY2FuX3VpbnQzMiAocmVhZGVyLCAweGZmZmZmZmZmLCAweGZlN2YwMTgwLAorICAgICAgMCwgYnVmc2l6ZSk7CisgIGlmIChvZmYgPj0gMCAmJiBvZmYgPCBiZXN0X29mZnNldCkgeworICAgIGJlc3Rfb2Zmc2V0ID0gb2ZmOworICAgIGJlc3Rfc3luYyA9IDB4ZmU3ZjAxODA7CisgIH0KKworICAvKiBSYXcgYmlnIGVuZGlhbiAqLworICBvZmYgPSBnc3RfYnl0ZV9yZWFkZXJfbWFza2VkX3NjYW5fdWludDMyIChyZWFkZXIsIDB4ZmZmZmZmZmYsIDB4N2ZmZTgwMDEsCisgICAgICAwLCBidWZzaXplKTsKKyAgaWYgKG9mZiA+PSAwICYmIG9mZiA8IGJlc3Rfb2Zmc2V0KSB7CisgICAgYmVzdF9vZmZzZXQgPSBvZmY7CisgICAgYmVzdF9zeW5jID0gMHg3ZmZlODAwMTsKKyAgfQorCisgIC8qIEZJWE1FOiBjaGVjayBuZXh0IDIgYnl0ZXMgYXMgd2VsbCBmb3IgMTQtYml0IGZvcm1hdHMgKGJ1dCB0aGVuIGRvbid0CisgICAqIGZvcmdldCB0byBhZGp1c3QgdGhlICpza2lwc2l6ZT0gaW4gX2NoZWNrX3ZhbGlkX2ZyYW1lKCkgKi8KKworICAvKiAxNC1iaXQgbGl0dGxlIGVuZGlhbiAgKi8KKyAgb2ZmID0gZ3N0X2J5dGVfcmVhZGVyX21hc2tlZF9zY2FuX3VpbnQzMiAocmVhZGVyLCAweGZmZmZmZmZmLCAweGZmMWYwMGU4LAorICAgICAgMCwgYnVmc2l6ZSk7CisgIGlmIChvZmYgPj0gMCAmJiBvZmYgPCBiZXN0X29mZnNldCkgeworICAgIGJlc3Rfb2Zmc2V0ID0gb2ZmOworICAgIGJlc3Rfc3luYyA9IDB4ZmYxZjAwZTg7CisgIH0KKworICAvKiAxNC1iaXQgYmlnIGVuZGlhbiAgKi8KKyAgb2ZmID0gZ3N0X2J5dGVfcmVhZGVyX21hc2tlZF9zY2FuX3VpbnQzMiAocmVhZGVyLCAweGZmZmZmZmZmLCAweDFmZmZlODAwLAorICAgICAgMCwgYnVmc2l6ZSk7CisgIGlmIChvZmYgPj0gMCAmJiBvZmYgPCBiZXN0X29mZnNldCkgeworICAgIGJlc3Rfb2Zmc2V0ID0gb2ZmOworICAgIGJlc3Rfc3luYyA9IDB4MWZmZmU4MDA7CisgIH0KKworICBpZiAoYmVzdF9vZmZzZXQgPT0gR19NQVhVSU5UKQorICAgIHJldHVybiAtMTsKKworICAqc3luYyA9IGJlc3Rfc3luYzsKKyAgcmV0dXJuIGJlc3Rfb2Zmc2V0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2RjYV9wYXJzZV9oYW5kbGVfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUsIGdpbnQgKiBza2lwc2l6ZSkKK3sKKyAgR3N0RGNhUGFyc2UgKmRjYXBhcnNlID0gR1NUX0RDQV9QQVJTRSAocGFyc2UpOworICBHc3RCdWZmZXIgKmJ1ZiA9IGZyYW1lLT5idWZmZXI7CisgIEdzdEJ5dGVSZWFkZXIgcjsKKyAgZ2Jvb2xlYW4gcGFyc2VyX2luX3N5bmM7CisgIGdib29sZWFuIHRlcm1pbmF0b3I7CisgIGd1aW50MzIgc3luYyA9IDA7CisgIGd1aW50IHNpemUgPSAwLCByYXRlLCBjaGFucywgbnVtX2Jsb2Nrcywgc2FtcGxlc19wZXJfYmxvY2ssIGRlcHRoOworICBnaW50IGJsb2NrX3NpemU7CisgIGdpbnQgZW5kaWFubmVzczsKKyAgZ2ludCBvZmYgPSAtMTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfRU9TOworICBnc2l6ZSBleHRyYV9zaXplID0gMDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIGlmIChHX1VOTElLRUxZIChtYXAuc2l6ZSA8IDE2KSkgeworICAgICpza2lwc2l6ZSA9IDE7CisgICAgZ290byBjbGVhbnVwOworICB9CisKKyAgcGFyc2VyX2luX3N5bmMgPSAhR1NUX0JBU0VfUEFSU0VfTE9TVF9TWU5DIChwYXJzZSk7CisKKyAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZyLCBtYXAuZGF0YSwgbWFwLnNpemUpOworCisgIGlmIChHX0xJS0VMWSAocGFyc2VyX2luX3N5bmMgJiYgZGNhcGFyc2UtPmxhc3Rfc3luYyAhPSAwKSkgeworICAgIG9mZiA9IGdzdF9ieXRlX3JlYWRlcl9tYXNrZWRfc2Nhbl91aW50MzIgKCZyLCAweGZmZmZmZmZmLAorICAgICAgICBkY2FwYXJzZS0+bGFzdF9zeW5jLCAwLCBtYXAuc2l6ZSk7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAob2ZmIDwgMCkpIHsKKyAgICBvZmYgPSBnc3RfZGNhX3BhcnNlX2ZpbmRfc3luYyAoZGNhcGFyc2UsICZyLCBtYXAuc2l6ZSwgJnN5bmMpOworICB9CisKKyAgLyogZGlkbid0IGZpbmQgYW55dGhpbmcgdGhhdCBsb29rcyBsaWtlIGEgc3luYyB3b3JkLCBza2lwICovCisgIGlmIChvZmYgPCAwKSB7CisgICAgKnNraXBzaXplID0gbWFwLnNpemUgLSAzOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRjYXBhcnNlLCAibm8gc3luYywgc2tpcHBpbmcgJWQgYnl0ZXMiLCAqc2tpcHNpemUpOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgInBvc3NpYmxlIHN5bmMgJTA4eCBhdCBidWZmZXIgb2Zmc2V0ICVkIiwgc3luYywgb2ZmKTsKKworICAvKiBwb3NzaWJsZSBmcmFtZSBoZWFkZXIsIGJ1dCBub3QgYXQgb2Zmc2V0IDA/IHNraXAgYnl0ZXMgYmVmb3JlIHN5bmMgKi8KKyAgaWYgKG9mZiA+IDApIHsKKyAgICAqc2tpcHNpemUgPSBvZmY7CisgICAgZ290byBjbGVhbnVwOworICB9CisKKyAgLyogbWFrZSBzdXJlIHRoZSB2YWx1ZXMgaW4gdGhlIGZyYW1lIGhlYWRlciBsb29rIHNhbmUgKi8KKyAgaWYgKCFnc3RfZGNhX3BhcnNlX3BhcnNlX2hlYWRlciAoZGNhcGFyc2UsICZyLCAmc2l6ZSwgJnJhdGUsICZjaGFucywgJmRlcHRoLAorICAgICAgICAgICZlbmRpYW5uZXNzLCAmbnVtX2Jsb2NrcywgJnNhbXBsZXNfcGVyX2Jsb2NrLCAmdGVybWluYXRvcikpIHsKKyAgICAqc2tpcHNpemUgPSA0OworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgImdvdCBmcmFtZSwgc3luYyAlMDh4LCBzaXplICV1LCByYXRlICVkLCBjaGFubmVscyAlZCIsCisgICAgICBzeW5jLCBzaXplLCByYXRlLCBjaGFucyk7CisKKyAgZGNhcGFyc2UtPmxhc3Rfc3luYyA9IHN5bmM7CisKKyAgLyogRklYTUU6IERvbid0IGxvb2sgZm9yIGEgc2Vjb25kIHN5bmN3b3JkLCB0aGVyZSBhcmUgc3RyZWFtcyBvdXQgdGhlcmUKKyAgICogdGhhdCBjb25zaXN0ZW50bHkgY29udGFpbiBnYXJiYWdlIGJldHdlZW4gZXZlcnkgZnJhbWUgc28gd2UgbmV2ZXIgZXZlcgorICAgKiBmaW5kIGEgc2Vjb25kIGNvbnNlY3V0aXZlIHN5bmN3b3JkLgorICAgKiBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczODIzNworICAgKi8KKyNpZiAwCisgIHBhcnNlcl9kcmFpbmluZyA9IEdTVF9CQVNFX1BBUlNFX0RSQUlOSU5HIChwYXJzZSk7CisKKyAgaWYgKCFwYXJzZXJfaW5fc3luYyAmJiAhcGFyc2VyX2RyYWluaW5nKSB7CisgICAgLyogY2hlY2sgZm9yIHNlY29uZCBmcmFtZSB0byBiZSBzdXJlICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGNhcGFyc2UsICJyZXN5bmNpbmc7IGNoZWNraW5nIG5leHQgZnJhbWUgc3luY3dvcmQiKTsKKyAgICBpZiAobWFwLnNpemUgPj0gKHNpemUgKyAxNikpIHsKKyAgICAgIGd1aW50IHMyLCByMiwgYzIsIG4yLCBzMzsKKyAgICAgIGdib29sZWFuIHQ7CisKKyAgICAgIEdTVF9NRU1EVU1QICgiYnVmIiwgbWFwLmRhdGEsIHNpemUgKyAxNik7CisgICAgICBnc3RfYnl0ZV9yZWFkZXJfaW5pdCAoJnIsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgICBnc3RfYnl0ZV9yZWFkZXJfc2tpcF91bmNoZWNrZWQgKCZyLCBzaXplKTsKKworICAgICAgaWYgKCFnc3RfZGNhX3BhcnNlX3BhcnNlX2hlYWRlciAoZGNhcGFyc2UsICZyLCAmczIsICZyMiwgJmMyLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAmbjIsICZzMywgJnQpKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRjYXBhcnNlLCAiZGlkbid0IGZpbmQgc2Vjb25kIHN5bmN3b3JkIik7CisgICAgICAgICpza2lwc2l6ZSA9IDQ7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgIH0KKworICAgICAgLyogb2ssIGdvdCBzeW5jIG5vdywgbGV0J3MgYXNzdW1lIGNvbnN0YW50IGZyYW1lIHNpemUgKi8KKyAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAocGFyc2UsIHNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAvKiB3YWl0IGZvciBzb21lIG1vcmUgZGF0YSAqLworICAgICAgR1NUX0xPR19PQkpFQ1QgKGRjYXBhcnNlLAorICAgICAgICAgICJuZXh0IHN5bmMgb3V0IG9mIHJlYWNoICglIiBHX0dTSVpFX0ZPUk1BVCAiIDwgJXUpIiwgbWFwLnNpemUsCisgICAgICAgICAgc2l6ZSArIDE2KTsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIC8qIGZvdW5kIGZyYW1lICovCisgIHJldCA9IEdTVF9GTE9XX09LOworCisgIC8qIG1ldGFkYXRhIGhhbmRsaW5nICovCisgIGJsb2NrX3NpemUgPSBudW1fYmxvY2tzICogc2FtcGxlc19wZXJfYmxvY2s7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGRjYXBhcnNlLT5yYXRlICE9IHJhdGUgfHwgZGNhcGFyc2UtPmNoYW5uZWxzICE9IGNoYW5zCisgICAgICAgICAgfHwgZGNhcGFyc2UtPmRlcHRoICE9IGRlcHRoIHx8IGRjYXBhcnNlLT5lbmRpYW5uZXNzICE9IGVuZGlhbm5lc3MKKyAgICAgICAgICB8fCAoIXRlcm1pbmF0b3IgJiYgZGNhcGFyc2UtPmJsb2NrX3NpemUgIT0gYmxvY2tfc2l6ZSkKKyAgICAgICAgICB8fCAoc2l6ZSAhPSBkY2FwYXJzZS0+ZnJhbWVfc2l6ZSkpKSB7CisgICAgR3N0Q2FwcyAqY2FwczsKKworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1kdHMiLAorICAgICAgICAiZnJhbWVkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsCisgICAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgcmF0ZSwgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgY2hhbnMsCisgICAgICAgICJlbmRpYW5uZXNzIiwgR19UWVBFX0lOVCwgZW5kaWFubmVzcywgImRlcHRoIiwgR19UWVBFX0lOVCwgZGVwdGgsCisgICAgICAgICJibG9jay1zaXplIiwgR19UWVBFX0lOVCwgYmxvY2tfc2l6ZSwgImZyYW1lLXNpemUiLCBHX1RZUEVfSU5ULCBzaXplLAorICAgICAgICBOVUxMKTsKKyAgICBnc3RfcGFkX3NldF9jYXBzIChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChwYXJzZSksIGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAgIGRjYXBhcnNlLT5yYXRlID0gcmF0ZTsKKyAgICBkY2FwYXJzZS0+Y2hhbm5lbHMgPSBjaGFuczsKKyAgICBkY2FwYXJzZS0+ZGVwdGggPSBkZXB0aDsKKyAgICBkY2FwYXJzZS0+ZW5kaWFubmVzcyA9IGVuZGlhbm5lc3M7CisgICAgZGNhcGFyc2UtPmJsb2NrX3NpemUgPSBibG9ja19zaXplOworICAgIGRjYXBhcnNlLT5mcmFtZV9zaXplID0gc2l6ZTsKKworICAgIGdzdF9iYXNlX3BhcnNlX3NldF9mcmFtZV9yYXRlIChwYXJzZSwgcmF0ZSwgYmxvY2tfc2l6ZSwgMCwgMCk7CisgIH0KKworY2xlYW51cDoKKyAgLyogaXQgaXMgcG9zc2libGUgdGhhdCBEVFMgSEQgc3Vic3RyZWFtIGFmdGVyIERUUyBjb3JlICovCisgIGlmIChwYXJzZS0+ZmxhZ3MgJiBHU1RfQkFTRV9QQVJTRV9GTEFHX0RSQUlOSU5HIHx8IG1hcC5zaXplID49IHNpemUgKyA5KSB7CisgICAgZXh0cmFfc2l6ZSA9IDA7CisgICAgaWYgKG1hcC5zaXplID49IHNpemUgKyA5KSB7CisgICAgICBjb25zdCBndWludDggKm5leHQgPSBtYXAuZGF0YSArIHNpemU7CisgICAgICAvKiBDaGVjayBmb3IgRFRTX1NZTkNXT1JEX1NVQlNUUkVBTSAqLworICAgICAgaWYgKG5leHRbMF0gPT0gMHg2NCAmJiBuZXh0WzFdID09IDB4NTggJiYgbmV4dFsyXSA9PSAweDIwCisgICAgICAgICAgJiYgbmV4dFszXSA9PSAweDI1KSB7CisgICAgICAgIC8qIDcuNC4xIEV4dGVuc2lvbiBTdWJzdHJlYW0gSGVhZGVyICovCisgICAgICAgIEdzdEJpdFJlYWRlciByZWFkZXI7CisgICAgICAgIGdzdF9iaXRfcmVhZGVyX2luaXQgKCZyZWFkZXIsIG5leHQgKyA0LCA1KTsKKyAgICAgICAgZ3N0X2JpdF9yZWFkZXJfc2tpcCAoJnJlYWRlciwgOCArIDIpOyAgIC8qIHNraXAgVXNlckRlZmluZWRCaXRzIGFuZCBuRXh0U1NJbmRleCkgKi8KKyAgICAgICAgaWYgKGdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4X3VuY2hlY2tlZCAoJnJlYWRlciwgMSkgPT0gMCkgeworICAgICAgICAgIGdzdF9iaXRfcmVhZGVyX3NraXAgKCZyZWFkZXIsIDgpOworICAgICAgICAgIGV4dHJhX3NpemUgPQorICAgICAgICAgICAgICBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MzJfdW5jaGVja2VkICgmcmVhZGVyLCAxNikgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9iaXRfcmVhZGVyX3NraXAgKCZyZWFkZXIsIDEyKTsKKyAgICAgICAgICBleHRyYV9zaXplID0KKyAgICAgICAgICAgICAgZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDMyX3VuY2hlY2tlZCAoJnJlYWRlciwgMjApICsgMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgc2l6ZSArIGV4dHJhX3NpemUgPD0gbWFwLnNpemUpIHsKKyAgICAgIHJldCA9IGdzdF9iYXNlX3BhcnNlX2ZpbmlzaF9mcmFtZSAocGFyc2UsIGZyYW1lLCBzaXplICsgZXh0cmFfc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIE1QRUctUFMgcHJpdmF0ZTEgc3RyZWFtcyBhZGQgYSAyIGJ5dGVzICJBdWRpbyBTdWJzdHJlYW0gSGVhZGVycyIgZm9yIGVhY2gKKyAqIGJ1ZmZlciAobm90IGVhY2ggZnJhbWUpIHdpdGggdGhlIG9mZnNldCBvZiB0aGUgbmV4dCBmcmFtZSdzIHN0YXJ0LgorICogVGhlc2UgMiBieXRlcyBjYW4gYmUgZHJvcHBlZCBzYWZlbHkgYXMgdGhleSBkbyBub3QgaW5jbHVkZSBhbnkgdGltaW5nCisgKiBpbmZvcm1hdGlvbiwgb25seSB0aGUgb2Zmc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBmcmFtZS4KKyAqIFNlZSBnc3RhYzNwYXJzZS5jIGZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24uCisgKiAqLworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2RjYV9wYXJzZV9jaGFpbl9wcml2IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3REY2FQYXJzZSAqZGNhcGFyc2UgPSBHU1RfRENBX1BBUlNFIChwYXJlbnQpOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0QnVmZmVyICpuZXdidWY7CisgIGdzaXplIHNpemU7CisKKyAgc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcik7CisgIGlmIChzaXplID49IDIpIHsKKyAgICBuZXdidWYgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIDIsIHNpemUgLSAyKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldCA9IGRjYXBhcnNlLT5iYXNlcGFyc2VfY2hhaW5mdW5jIChwYWQsIHBhcmVudCwgbmV3YnVmKTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldCA9IEdTVF9GTE9XX09LOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9maWVsZHMgKEdzdENhcHMgKiBjYXBzKQoreworICBndWludCBpLCBuOworCisgIG4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCBpKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzLCAiZnJhbWVkIik7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X2RjYV9wYXJzZV9nZXRfc2lua19jYXBzIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0Q2FwcyAqcGVlcmNhcHMsICp0ZW1wbDsKKyAgR3N0Q2FwcyAqcmVzOworCisgIHRlbXBsID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChwYXJzZSkpOworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqZmNvcHkgPSBnc3RfY2Fwc19jb3B5IChmaWx0ZXIpOworICAgIC8qIFJlbW92ZSB0aGUgZmllbGRzIHdlIGNvbnZlcnQgKi8KKyAgICByZW1vdmVfZmllbGRzIChmY29weSk7CisgICAgcGVlcmNhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpLCBmY29weSk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGZjb3B5KTsKKyAgfSBlbHNlCisgICAgcGVlcmNhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpLCBOVUxMKTsKKworICBpZiAocGVlcmNhcHMpIHsKKyAgICAvKiBSZW1vdmUgdGhlIGZyYW1lZCBmaWVsZCAqLworICAgIHBlZXJjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAocGVlcmNhcHMpOworICAgIHJlbW92ZV9maWVsZHMgKHBlZXJjYXBzKTsKKworICAgIHJlcyA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChwZWVyY2FwcywgdGVtcGwsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGVtcGwpOworICB9IGVsc2UgeworICAgIHJlcyA9IHRlbXBsOworICB9CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKmludGVyc2VjdGlvbjsKKworICAgIGludGVyc2VjdGlvbiA9CisgICAgICAgIGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHJlcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmVzKTsKKyAgICByZXMgPSBpbnRlcnNlY3Rpb247CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kY2FfcGFyc2Vfc2V0X3NpbmtfY2FwcyAoR3N0QmFzZVBhcnNlICogcGFyc2UsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIEdzdERjYVBhcnNlICpkY2FwYXJzZSA9IEdTVF9EQ0FfUEFSU0UgKHBhcnNlKTsKKworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiYXVkaW8veC1wcml2YXRlMS1kdHMiKSkgeworICAgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChwYXJzZS0+c2lua3BhZCwgZ3N0X2RjYV9wYXJzZV9jaGFpbl9wcml2KTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAocGFyc2UtPnNpbmtwYWQsIGRjYXBhcnNlLT5iYXNlcGFyc2VfY2hhaW5mdW5jKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9kY2FfcGFyc2VfcHJlX3B1c2hfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLCBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lKQoreworICBHc3REY2FQYXJzZSAqZGNhcGFyc2UgPSBHU1RfRENBX1BBUlNFIChwYXJzZSk7CisKKyAgaWYgKCFkY2FwYXJzZS0+c2VudF9jb2RlY190YWcpIHsKKyAgICBHc3RUYWdMaXN0ICp0YWdsaXN0OworICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAvKiBjb2RlYyB0YWcgKi8KKyAgICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChwYXJzZSkpOworICAgIGlmIChHX1VOTElLRUxZIChjYXBzID09IE5VTEwpKSB7CisgICAgICBpZiAoR1NUX1BBRF9JU19GTFVTSElORyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpKSkgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHBhcnNlLCAiU3JjIHBhZCBpcyBmbHVzaGluZyIpOworICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRkxVU0hJTkc7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHBhcnNlLCAiU3JjIHBhZCBpcyBub3QgbmVnb3RpYXRlZCEiKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICAgICAgfQorICAgIH0KKworICAgIHRhZ2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAgIGdzdF9wYl91dGlsc19hZGRfY29kZWNfZGVzY3JpcHRpb25fdG9fdGFnX2xpc3QgKHRhZ2xpc3QsCisgICAgICAgIEdTVF9UQUdfQVVESU9fQ09ERUMsIGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAgIGdzdF9iYXNlX3BhcnNlX21lcmdlX3RhZ3MgKHBhcnNlLCB0YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UpOworICAgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnbGlzdCk7CisKKyAgICAvKiBhbHNvIHNpZ25hbHMgdGhlIGVuZCBvZiBmaXJzdC1mcmFtZSBwcm9jZXNzaW5nICovCisgICAgZGNhcGFyc2UtPnNlbnRfY29kZWNfdGFnID0gVFJVRTsKKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuaCBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTk4YTA2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5oCkBAIC0wLDAgKzEsODIgQEAKKy8qIEdTdHJlYW1lciBEQ0EgcGFyc2VyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0RDQV9QQVJTRV9IX18KKyNkZWZpbmUgX19HU1RfRENBX1BBUlNFX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2VwYXJzZS5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfRENBX1BBUlNFIFwKKyAgKGdzdF9kY2FfcGFyc2VfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0RDQV9QQVJTRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLCBHU1RfVFlQRV9EQ0FfUEFSU0UsIEdzdERjYVBhcnNlKSkKKyNkZWZpbmUgR1NUX0RDQV9QQVJTRV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSwgR1NUX1RZUEVfRENBX1BBUlNFLCBHc3REY2FQYXJzZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0RDQV9QQVJTRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLCBHU1RfVFlQRV9EQ0FfUEFSU0UpKQorI2RlZmluZSBHU1RfSVNfRENBX1BBUlNFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLCBHU1RfVFlQRV9EQ0FfUEFSU0UpKQorCisjZGVmaW5lIERDQV9NSU5fRlJBTUVTSVpFIDk2CisjZGVmaW5lIERDQV9NQVhfRlJBTUVTSVpFIDE4NzI1IC8qIDE2Mzg0KjE2LzE0ICovCisKK3R5cGVkZWYgc3RydWN0IF9Hc3REY2FQYXJzZSBHc3REY2FQYXJzZTsKK3R5cGVkZWYgc3RydWN0IF9Hc3REY2FQYXJzZUNsYXNzIEdzdERjYVBhcnNlQ2xhc3M7CisKKy8qKgorICogR3N0RGNhUGFyc2U6CisgKgorICogVGhlIG9wYXF1ZSBHc3REY2FQYXJzZSBvYmplY3QKKyAqLworc3RydWN0IF9Hc3REY2FQYXJzZSB7CisgIEdzdEJhc2VQYXJzZSBiYXNlcGFyc2U7CisKKyAgLyo8IHByaXZhdGUgPiovCisgIGdpbnQgICAgICAgICAgICAgICAgICByYXRlOworICBnaW50ICAgICAgICAgICAgICAgICAgY2hhbm5lbHM7CisgIGdpbnQgICAgICAgICAgICAgICAgICBkZXB0aDsKKyAgZ2ludCAgICAgICAgICAgICAgICAgIGVuZGlhbm5lc3M7CisgIGdpbnQgICAgICAgICAgICAgICAgICBibG9ja19zaXplOworICBnaW50ICAgICAgICAgICAgICAgICAgZnJhbWVfc2l6ZTsKKworICBnYm9vbGVhbiAgICAgICAgICAgICAgc2VudF9jb2RlY190YWc7CisKKyAgZ3VpbnQzMiAgICAgICAgICAgICAgIGxhc3Rfc3luYzsKKworICBHc3RQYWRDaGFpbkZ1bmN0aW9uICAgYmFzZXBhcnNlX2NoYWluZnVuYzsKK307CisKKy8qKgorICogR3N0RGNhUGFyc2VDbGFzczoKKyAqIEBwYXJlbnRfY2xhc3M6IEVsZW1lbnQgcGFyZW50IGNsYXNzLgorICoKKyAqIFRoZSBvcGFxdWUgR3N0RGNhUGFyc2VDbGFzcyBkYXRhIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IF9Hc3REY2FQYXJzZUNsYXNzIHsKKyAgR3N0QmFzZVBhcnNlQ2xhc3MgYmFzZXBhcnNlX2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2RjYV9wYXJzZV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9EQ0FfUEFSU0VfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWE2OTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYwpAQCAtMCwwICsxLDE4NzcgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIENvbnRhY3Q6IFN0ZWZhbiBLb3N0IDxzdGVmYW4ua29zdEBub2tpYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtZmxhY3BhcnNlCisgKiBAc2VlX2Fsc286IGZsYWNkZWMsIG9nZ2RlbXV4LCB2b3JiaXNwYXJzZQorICoKKyAqIFRoZSBmbGFjcGFyc2UgZWxlbWVudCB3aWxsIHBhcnNlIHRoZSBoZWFkZXIgcGFja2V0cyBvZiB0aGUgRkxBQworICogc3RyZWFtIGFuZCBwdXQgdGhlbSBhcyB0aGUgc3RyZWFtaGVhZGVyIGluIHRoZSBjYXBzLiBUaGlzIGlzIHVzZWQgaW4gdGhlCisgKiBtdWx0aWZkc2luayBjYXNlIHdoZXJlIHlvdSB3YW50IHRvIHN0cmVhbSBsaXZlIEZMQUMgc3RyZWFtcyB0byBtdWx0aXBsZQorICogY2xpZW50cywgZWFjaCBjbGllbnQgaGFzIHRvIHJlY2VpdmUgdGhlIHN0cmVhbWhlYWRlcnMgZmlyc3QgYmVmb3JlIHRoZXkgY2FuCisgKiBjb25zdW1lIHRoZSBGTEFDIHBhY2tldHMuCisgKgorICogVGhpcyBlbGVtZW50IGFsc28gbWFrZXMgc3VyZSB0aGF0IHRoZSBidWZmZXJzIHRoYXQgaXQgcHVzaGVzIG91dCBhcmUgcHJvcGVybHkKKyAqIHRpbWVzdGFtcGVkIGFuZCB0aGF0IHRoZWlyIG9mZnNldCBhbmQgb2Zmc2V0X2VuZCBhcmUgc2V0LiBUaGUgYnVmZmVycyB0aGF0CisgKiBmbGFjcGFyc2Ugb3V0cHV0cyBoYXZlIGFsbCBvZiB0aGUgbWV0YWRhdGEgdGhhdCBvZ2dtdXggZXhwZWN0cyB0byByZWNlaXZlLAorICogd2hpY2ggYWxsb3dzIHlvdSB0byAoZm9yIGV4YW1wbGUpIHJlbXV4IGFuIG9nZy9mbGFjIG9yIGNvbnZlcnQgYSBuYXRpdmUgRkxBQworICogZm9ybWF0IGZpbGUgdG8gYW4gb2dnIGJpdHN0cmVhbS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGZpbGVzcmMgbG9jYXRpb249c2luZS5mbGFjICEgZmxhY3BhcnNlICEgaWRlbnRpdHkgXAorICogICAgICAgICAgICAhIG9nZ211eCAhIGZpbGVzaW5rIGxvY2F0aW9uPXNpbmUtcmVtdXhlZC5vZ2cKKyAqIF18IFRoaXMgcGlwZWxpbmUgY29udmVydHMgYSBuYXRpdmUgRkxBQyBmb3JtYXQgZmlsZSB0byBhbiBvZ2cgYml0c3RyZWFtLgorICogSXQgYWxzbyBpbGx1c3RyYXRlcyB0aGF0IHRoZSBzdHJlYW1oZWFkZXIgaXMgc2V0IGluIHRoZSBjYXBzLCBhbmQgdGhhdCBlYWNoCisgKiBidWZmZXIgaGFzIHRoZSB0aW1lc3RhbXAsIGR1cmF0aW9uLCBvZmZzZXQsIGFuZCBvZmZzZXRfZW5kIHNldC4KKyAqIDwvcmVmc2VjdDI+CisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdGZsYWNwYXJzZS5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L3RhZy90YWcuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9iYXNlLmg+CisjaW5jbHVkZSA8Z3N0L3BidXRpbHMvcGJ1dGlscy5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChmbGFjcGFyc2VfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZmxhY3BhcnNlX2RlYnVnCisKKy8qIENSQy04LCBwb2x5ID0geF44ICsgeF4yICsgeF4xICsgeF4wLCBpbml0ID0gMCAqLworc3RhdGljIGNvbnN0IGd1aW50OCBjcmM4X3RhYmxlWzI1Nl0gPSB7CisgIDB4MDAsIDB4MDcsIDB4MEUsIDB4MDksIDB4MUMsIDB4MUIsIDB4MTIsIDB4MTUsCisgIDB4MzgsIDB4M0YsIDB4MzYsIDB4MzEsIDB4MjQsIDB4MjMsIDB4MkEsIDB4MkQsCisgIDB4NzAsIDB4NzcsIDB4N0UsIDB4NzksIDB4NkMsIDB4NkIsIDB4NjIsIDB4NjUsCisgIDB4NDgsIDB4NEYsIDB4NDYsIDB4NDEsIDB4NTQsIDB4NTMsIDB4NUEsIDB4NUQsCisgIDB4RTAsIDB4RTcsIDB4RUUsIDB4RTksIDB4RkMsIDB4RkIsIDB4RjIsIDB4RjUsCisgIDB4RDgsIDB4REYsIDB4RDYsIDB4RDEsIDB4QzQsIDB4QzMsIDB4Q0EsIDB4Q0QsCisgIDB4OTAsIDB4OTcsIDB4OUUsIDB4OTksIDB4OEMsIDB4OEIsIDB4ODIsIDB4ODUsCisgIDB4QTgsIDB4QUYsIDB4QTYsIDB4QTEsIDB4QjQsIDB4QjMsIDB4QkEsIDB4QkQsCisgIDB4QzcsIDB4QzAsIDB4QzksIDB4Q0UsIDB4REIsIDB4REMsIDB4RDUsIDB4RDIsCisgIDB4RkYsIDB4RjgsIDB4RjEsIDB4RjYsIDB4RTMsIDB4RTQsIDB4RUQsIDB4RUEsCisgIDB4QjcsIDB4QjAsIDB4QjksIDB4QkUsIDB4QUIsIDB4QUMsIDB4QTUsIDB4QTIsCisgIDB4OEYsIDB4ODgsIDB4ODEsIDB4ODYsIDB4OTMsIDB4OTQsIDB4OUQsIDB4OUEsCisgIDB4MjcsIDB4MjAsIDB4MjksIDB4MkUsIDB4M0IsIDB4M0MsIDB4MzUsIDB4MzIsCisgIDB4MUYsIDB4MTgsIDB4MTEsIDB4MTYsIDB4MDMsIDB4MDQsIDB4MEQsIDB4MEEsCisgIDB4NTcsIDB4NTAsIDB4NTksIDB4NUUsIDB4NEIsIDB4NEMsIDB4NDUsIDB4NDIsCisgIDB4NkYsIDB4NjgsIDB4NjEsIDB4NjYsIDB4NzMsIDB4NzQsIDB4N0QsIDB4N0EsCisgIDB4ODksIDB4OEUsIDB4ODcsIDB4ODAsIDB4OTUsIDB4OTIsIDB4OUIsIDB4OUMsCisgIDB4QjEsIDB4QjYsIDB4QkYsIDB4QjgsIDB4QUQsIDB4QUEsIDB4QTMsIDB4QTQsCisgIDB4RjksIDB4RkUsIDB4RjcsIDB4RjAsIDB4RTUsIDB4RTIsIDB4RUIsIDB4RUMsCisgIDB4QzEsIDB4QzYsIDB4Q0YsIDB4QzgsIDB4REQsIDB4REEsIDB4RDMsIDB4RDQsCisgIDB4NjksIDB4NkUsIDB4NjcsIDB4NjAsIDB4NzUsIDB4NzIsIDB4N0IsIDB4N0MsCisgIDB4NTEsIDB4NTYsIDB4NUYsIDB4NTgsIDB4NEQsIDB4NEEsIDB4NDMsIDB4NDQsCisgIDB4MTksIDB4MUUsIDB4MTcsIDB4MTAsIDB4MDUsIDB4MDIsIDB4MEIsIDB4MEMsCisgIDB4MjEsIDB4MjYsIDB4MkYsIDB4MjgsIDB4M0QsIDB4M0EsIDB4MzMsIDB4MzQsCisgIDB4NEUsIDB4NDksIDB4NDAsIDB4NDcsIDB4NTIsIDB4NTUsIDB4NUMsIDB4NUIsCisgIDB4NzYsIDB4NzEsIDB4NzgsIDB4N0YsIDB4NkEsIDB4NkQsIDB4NjQsIDB4NjMsCisgIDB4M0UsIDB4MzksIDB4MzAsIDB4MzcsIDB4MjIsIDB4MjUsIDB4MkMsIDB4MkIsCisgIDB4MDYsIDB4MDEsIDB4MDgsIDB4MEYsIDB4MUEsIDB4MUQsIDB4MTQsIDB4MTMsCisgIDB4QUUsIDB4QTksIDB4QTAsIDB4QTcsIDB4QjIsIDB4QjUsIDB4QkMsIDB4QkIsCisgIDB4OTYsIDB4OTEsIDB4OTgsIDB4OUYsIDB4OEEsIDB4OEQsIDB4ODQsIDB4ODMsCisgIDB4REUsIDB4RDksIDB4RDAsIDB4RDcsIDB4QzIsIDB4QzUsIDB4Q0MsIDB4Q0IsCisgIDB4RTYsIDB4RTEsIDB4RTgsIDB4RUYsIDB4RkEsIDB4RkQsIDB4RjQsIDB4RjMKK307CisKK3N0YXRpYyBndWludDgKK2dzdF9mbGFjX2NhbGN1bGF0ZV9jcmM4IChjb25zdCBndWludDggKiBkYXRhLCBndWludCBsZW5ndGgpCit7CisgIGd1aW50OCBjcmMgPSAwOworCisgIHdoaWxlIChsZW5ndGgtLSkgeworICAgIGNyYyA9IGNyYzhfdGFibGVbY3JjIF4gKmRhdGFdOworICAgICsrZGF0YTsKKyAgfQorCisgIHJldHVybiBjcmM7Cit9CisKKy8qIENSQy0xNiwgcG9seSA9IHheMTYgKyB4XjE1ICsgeF4yICsgeF4wLCBpbml0ID0gMCAqLworc3RhdGljIGNvbnN0IGd1aW50MTYgY3JjMTZfdGFibGVbMjU2XSA9IHsKKyAgMHgwMDAwLCAweDgwMDUsIDB4ODAwZiwgMHgwMDBhLCAweDgwMWIsIDB4MDAxZSwgMHgwMDE0LCAweDgwMTEsCisgIDB4ODAzMywgMHgwMDM2LCAweDAwM2MsIDB4ODAzOSwgMHgwMDI4LCAweDgwMmQsIDB4ODAyNywgMHgwMDIyLAorICAweDgwNjMsIDB4MDA2NiwgMHgwMDZjLCAweDgwNjksIDB4MDA3OCwgMHg4MDdkLCAweDgwNzcsIDB4MDA3MiwKKyAgMHgwMDUwLCAweDgwNTUsIDB4ODA1ZiwgMHgwMDVhLCAweDgwNGIsIDB4MDA0ZSwgMHgwMDQ0LCAweDgwNDEsCisgIDB4ODBjMywgMHgwMGM2LCAweDAwY2MsIDB4ODBjOSwgMHgwMGQ4LCAweDgwZGQsIDB4ODBkNywgMHgwMGQyLAorICAweDAwZjAsIDB4ODBmNSwgMHg4MGZmLCAweDAwZmEsIDB4ODBlYiwgMHgwMGVlLCAweDAwZTQsIDB4ODBlMSwKKyAgMHgwMGEwLCAweDgwYTUsIDB4ODBhZiwgMHgwMGFhLCAweDgwYmIsIDB4MDBiZSwgMHgwMGI0LCAweDgwYjEsCisgIDB4ODA5MywgMHgwMDk2LCAweDAwOWMsIDB4ODA5OSwgMHgwMDg4LCAweDgwOGQsIDB4ODA4NywgMHgwMDgyLAorICAweDgxODMsIDB4MDE4NiwgMHgwMThjLCAweDgxODksIDB4MDE5OCwgMHg4MTlkLCAweDgxOTcsIDB4MDE5MiwKKyAgMHgwMWIwLCAweDgxYjUsIDB4ODFiZiwgMHgwMWJhLCAweDgxYWIsIDB4MDFhZSwgMHgwMWE0LCAweDgxYTEsCisgIDB4MDFlMCwgMHg4MWU1LCAweDgxZWYsIDB4MDFlYSwgMHg4MWZiLCAweDAxZmUsIDB4MDFmNCwgMHg4MWYxLAorICAweDgxZDMsIDB4MDFkNiwgMHgwMWRjLCAweDgxZDksIDB4MDFjOCwgMHg4MWNkLCAweDgxYzcsIDB4MDFjMiwKKyAgMHgwMTQwLCAweDgxNDUsIDB4ODE0ZiwgMHgwMTRhLCAweDgxNWIsIDB4MDE1ZSwgMHgwMTU0LCAweDgxNTEsCisgIDB4ODE3MywgMHgwMTc2LCAweDAxN2MsIDB4ODE3OSwgMHgwMTY4LCAweDgxNmQsIDB4ODE2NywgMHgwMTYyLAorICAweDgxMjMsIDB4MDEyNiwgMHgwMTJjLCAweDgxMjksIDB4MDEzOCwgMHg4MTNkLCAweDgxMzcsIDB4MDEzMiwKKyAgMHgwMTEwLCAweDgxMTUsIDB4ODExZiwgMHgwMTFhLCAweDgxMGIsIDB4MDEwZSwgMHgwMTA0LCAweDgxMDEsCisgIDB4ODMwMywgMHgwMzA2LCAweDAzMGMsIDB4ODMwOSwgMHgwMzE4LCAweDgzMWQsIDB4ODMxNywgMHgwMzEyLAorICAweDAzMzAsIDB4ODMzNSwgMHg4MzNmLCAweDAzM2EsIDB4ODMyYiwgMHgwMzJlLCAweDAzMjQsIDB4ODMyMSwKKyAgMHgwMzYwLCAweDgzNjUsIDB4ODM2ZiwgMHgwMzZhLCAweDgzN2IsIDB4MDM3ZSwgMHgwMzc0LCAweDgzNzEsCisgIDB4ODM1MywgMHgwMzU2LCAweDAzNWMsIDB4ODM1OSwgMHgwMzQ4LCAweDgzNGQsIDB4ODM0NywgMHgwMzQyLAorICAweDAzYzAsIDB4ODNjNSwgMHg4M2NmLCAweDAzY2EsIDB4ODNkYiwgMHgwM2RlLCAweDAzZDQsIDB4ODNkMSwKKyAgMHg4M2YzLCAweDAzZjYsIDB4MDNmYywgMHg4M2Y5LCAweDAzZTgsIDB4ODNlZCwgMHg4M2U3LCAweDAzZTIsCisgIDB4ODNhMywgMHgwM2E2LCAweDAzYWMsIDB4ODNhOSwgMHgwM2I4LCAweDgzYmQsIDB4ODNiNywgMHgwM2IyLAorICAweDAzOTAsIDB4ODM5NSwgMHg4MzlmLCAweDAzOWEsIDB4ODM4YiwgMHgwMzhlLCAweDAzODQsIDB4ODM4MSwKKyAgMHgwMjgwLCAweDgyODUsIDB4ODI4ZiwgMHgwMjhhLCAweDgyOWIsIDB4MDI5ZSwgMHgwMjk0LCAweDgyOTEsCisgIDB4ODJiMywgMHgwMmI2LCAweDAyYmMsIDB4ODJiOSwgMHgwMmE4LCAweDgyYWQsIDB4ODJhNywgMHgwMmEyLAorICAweDgyZTMsIDB4MDJlNiwgMHgwMmVjLCAweDgyZTksIDB4MDJmOCwgMHg4MmZkLCAweDgyZjcsIDB4MDJmMiwKKyAgMHgwMmQwLCAweDgyZDUsIDB4ODJkZiwgMHgwMmRhLCAweDgyY2IsIDB4MDJjZSwgMHgwMmM0LCAweDgyYzEsCisgIDB4ODI0MywgMHgwMjQ2LCAweDAyNGMsIDB4ODI0OSwgMHgwMjU4LCAweDgyNWQsIDB4ODI1NywgMHgwMjUyLAorICAweDAyNzAsIDB4ODI3NSwgMHg4MjdmLCAweDAyN2EsIDB4ODI2YiwgMHgwMjZlLCAweDAyNjQsIDB4ODI2MSwKKyAgMHgwMjIwLCAweDgyMjUsIDB4ODIyZiwgMHgwMjJhLCAweDgyM2IsIDB4MDIzZSwgMHgwMjM0LCAweDgyMzEsCisgIDB4ODIxMywgMHgwMjE2LCAweDAyMWMsIDB4ODIxOSwgMHgwMjA4LCAweDgyMGQsIDB4ODIwNywgMHgwMjAyCit9OworCitzdGF0aWMgZ3VpbnQxNgorZ3N0X2ZsYWNfY2FsY3VsYXRlX2NyYzE2IChjb25zdCBndWludDggKiBkYXRhLCBndWludCBsZW5ndGgpCit7CisgIGd1aW50MTYgY3JjID0gMDsKKworICB3aGlsZSAobGVuZ3RoLS0pIHsKKyAgICBjcmMgPSAoKGNyYyA8PCA4KSBeIGNyYzE2X3RhYmxlWyhjcmMgPj4gOCkgXiAqZGF0YV0pICYgMHhmZmZmOworICAgIGRhdGErKzsKKyAgfQorCisgIHJldHVybiBjcmM7Cit9CisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0NIRUNLX0ZSQU1FX0NIRUNLU1VNUworfTsKKworI2RlZmluZSBERUZBVUxUX0NIRUNLX0ZSQU1FX0NIRUNLU1VNUyBGQUxTRQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1mbGFjLCBmcmFtZWQgPSAoYm9vbGVhbikgdHJ1ZSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDggXSwgIiAicmF0ZSA9IChpbnQpIFsgMSwgNjU1MzUwIF0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LWZsYWMiKQorICAgICk7CisKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9mbGFjX3BhcnNlX2dlbmVyYXRlX3ZvcmJpc2NvbW1lbnQgKEdzdEZsYWNQYXJzZSAqCisgICAgZmxhY3BhcnNlKTsKKworc3RhdGljIGlubGluZSB2b2lkIGdzdF9mbGFjX3BhcnNlX3Jlc2V0X2J1ZmZlcl90aW1lX2FuZF9vZmZzZXQgKEdzdEJ1ZmZlciAqCisgICAgYnVmZmVyKTsKK3N0YXRpYyB2b2lkIGdzdF9mbGFjX3BhcnNlX3Jlc2V0IChHc3RGbGFjUGFyc2UgKiBwYXJzZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9mbGFjX3BhcnNlX2hhbmRsZV9ibG9ja190eXBlIChHc3RGbGFjUGFyc2UgKiBmbGFjcGFyc2UsCisgICAgZ3VpbnQgdHlwZSwgR3N0QnVmZmVyICogc2J1ZmZlcik7CitzdGF0aWMgdm9pZCBnc3RfZmxhY19wYXJzZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgdm9pZCBnc3RfZmxhY19wYXJzZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfZmxhY19wYXJzZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZmxhY19wYXJzZV9zdGFydCAoR3N0QmFzZVBhcnNlICogcGFyc2UpOworc3RhdGljIGdib29sZWFuIGdzdF9mbGFjX3BhcnNlX3N0b3AgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9mbGFjX3BhcnNlX2hhbmRsZV9mcmFtZSAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSwgZ2ludCAqIHNraXBzaXplKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9mbGFjX3BhcnNlX3BhcnNlX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lLCBnaW50IHNpemUpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2ZsYWNfcGFyc2VfcHJlX3B1c2hfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUpOworc3RhdGljIGdib29sZWFuIGdzdF9mbGFjX3BhcnNlX2NvbnZlcnQgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEZvcm1hdCBzcmNfZm9ybWF0LCBnaW50NjQgc3JjX3ZhbHVlLCBHc3RGb3JtYXQgZGVzdF9mb3JtYXQsCisgICAgZ2ludDY0ICogZGVzdF92YWx1ZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ZsYWNfcGFyc2Vfc3JjX2V2ZW50IChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfZmxhY19wYXJzZV9nZXRfc2lua19jYXBzIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RDYXBzICogZmlsdGVyKTsKKworI2RlZmluZSBnc3RfZmxhY19wYXJzZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RGbGFjUGFyc2UsIGdzdF9mbGFjX3BhcnNlLCBHU1RfVFlQRV9CQVNFX1BBUlNFKTsKKworc3RhdGljIHZvaWQKK2dzdF9mbGFjX3BhcnNlX2NsYXNzX2luaXQgKEdzdEZsYWNQYXJzZUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdzdEJhc2VQYXJzZUNsYXNzICpiYXNlcGFyc2VfY2xhc3MgPSBHU1RfQkFTRV9QQVJTRV9DTEFTUyAoa2xhc3MpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChmbGFjcGFyc2VfZGVidWcsICJmbGFjcGFyc2UiLCAwLAorICAgICAgIkZsYWMgcGFyc2VyIGVsZW1lbnQiKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9mbGFjX3BhcnNlX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfZmxhY19wYXJzZV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9mbGFjX3BhcnNlX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NIRUNLX0ZSQU1FX0NIRUNLU1VNUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiY2hlY2stZnJhbWUtY2hlY2tzdW1zIiwgIkNoZWNrIEZyYW1lIENoZWNrc3VtcyIsCisgICAgICAgICAgIkNoZWNrIHRoZSBvdmVyYWxsIGNoZWNrc3VtcyBvZiBldmVyeSBmcmFtZSIsCisgICAgICAgICAgREVGQVVMVF9DSEVDS19GUkFNRV9DSEVDS1NVTVMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgYmFzZXBhcnNlX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmxhY19wYXJzZV9zdGFydCk7CisgIGJhc2VwYXJzZV9jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmxhY19wYXJzZV9zdG9wKTsKKyAgYmFzZXBhcnNlX2NsYXNzLT5oYW5kbGVfZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbGFjX3BhcnNlX2hhbmRsZV9mcmFtZSk7CisgIGJhc2VwYXJzZV9jbGFzcy0+cHJlX3B1c2hfZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbGFjX3BhcnNlX3ByZV9wdXNoX2ZyYW1lKTsKKyAgYmFzZXBhcnNlX2NsYXNzLT5jb252ZXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbGFjX3BhcnNlX2NvbnZlcnQpOworICBiYXNlcGFyc2VfY2xhc3MtPnNyY19ldmVudCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmxhY19wYXJzZV9zcmNfZXZlbnQpOworICBiYXNlcGFyc2VfY2xhc3MtPmdldF9zaW5rX2NhcHMgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbGFjX3BhcnNlX2dldF9zaW5rX2NhcHMpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc3JjX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNpbmtfZmFjdG9yeSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgIkZMQUMgYXVkaW8gcGFyc2VyIiwKKyAgICAgICJDb2RlYy9QYXJzZXIvQXVkaW8iLAorICAgICAgIlBhcnNlcyBhdWRpbyB3aXRoIHRoZSBGTEFDIGxvc3NsZXNzIGF1ZGlvIGNvZGVjIiwKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9mbGFjX3BhcnNlX2luaXQgKEdzdEZsYWNQYXJzZSAqIGZsYWNwYXJzZSkKK3sKKyAgZmxhY3BhcnNlLT5jaGVja19mcmFtZV9jaGVja3N1bXMgPSBERUZBVUxUX0NIRUNLX0ZSQU1FX0NIRUNLU1VNUzsKKyAgR1NUX1BBRF9TRVRfQUNDRVBUX0lOVEVSU0VDVCAoR1NUX0JBU0VfUEFSU0VfU0lOS19QQUQgKGZsYWNwYXJzZSkpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChmbGFjcGFyc2UpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9mbGFjX3BhcnNlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RGbGFjUGFyc2UgKmZsYWNwYXJzZSA9IEdTVF9GTEFDX1BBUlNFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DSEVDS19GUkFNRV9DSEVDS1NVTVM6CisgICAgICBmbGFjcGFyc2UtPmNoZWNrX2ZyYW1lX2NoZWNrc3VtcyA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9mbGFjX3BhcnNlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RGbGFjUGFyc2UgKmZsYWNwYXJzZSA9IEdTVF9GTEFDX1BBUlNFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DSEVDS19GUkFNRV9DSEVDS1NVTVM6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZmxhY3BhcnNlLT5jaGVja19mcmFtZV9jaGVja3N1bXMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2ZsYWNfcGFyc2VfcmVzZXQgKEdzdEZsYWNQYXJzZSAqIHBhcnNlcikKK3sKKyAgaWYgKHBhcnNlci0+dGFncykgeworICAgIGdzdF90YWdfbGlzdF91bnJlZiAocGFyc2VyLT50YWdzKTsKKyAgICBwYXJzZXItPnRhZ3MgPSBOVUxMOworICB9CisgIGlmIChwYXJzZXItPnRvYykgeworICAgIGdzdF90b2NfdW5yZWYgKHBhcnNlci0+dG9jKTsKKyAgICBwYXJzZXItPnRvYyA9IE5VTEw7CisgIH0KKyAgaWYgKHBhcnNlci0+c2Vla3RhYmxlKSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAocGFyc2VyLT5zZWVrdGFibGUpOworICAgIHBhcnNlci0+c2Vla3RhYmxlID0gTlVMTDsKKyAgfQorCisgIGdfbGlzdF9mb3JlYWNoIChwYXJzZXItPmhlYWRlcnMsIChHRnVuYykgZ3N0X21pbmlfb2JqZWN0X3VucmVmLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKHBhcnNlci0+aGVhZGVycyk7CisgIHBhcnNlci0+aGVhZGVycyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmxhY19wYXJzZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0RmxhY1BhcnNlICpmbGFjcGFyc2UgPSBHU1RfRkxBQ19QQVJTRSAob2JqZWN0KTsKKworICBnc3RfZmxhY19wYXJzZV9yZXNldCAoZmxhY3BhcnNlKTsKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbGFjX3BhcnNlX3N0YXJ0IChHc3RCYXNlUGFyc2UgKiBwYXJzZSkKK3sKKyAgR3N0RmxhY1BhcnNlICpmbGFjcGFyc2UgPSBHU1RfRkxBQ19QQVJTRSAocGFyc2UpOworCisgIGZsYWNwYXJzZS0+c3RhdGUgPSBHU1RfRkxBQ19QQVJTRV9TVEFURV9JTklUOworICBmbGFjcGFyc2UtPm1pbl9ibG9ja3NpemUgPSAwOworICBmbGFjcGFyc2UtPm1heF9ibG9ja3NpemUgPSAwOworICBmbGFjcGFyc2UtPm1pbl9mcmFtZXNpemUgPSAwOworICBmbGFjcGFyc2UtPm1heF9mcmFtZXNpemUgPSAwOworCisgIGZsYWNwYXJzZS0+dXBzdHJlYW1fbGVuZ3RoID0gLTE7CisKKyAgZmxhY3BhcnNlLT5zYW1wbGVyYXRlID0gMDsKKyAgZmxhY3BhcnNlLT5jaGFubmVscyA9IDA7CisgIGZsYWNwYXJzZS0+YnBzID0gMDsKKyAgZmxhY3BhcnNlLT50b3RhbF9zYW1wbGVzID0gMDsKKworICBmbGFjcGFyc2UtPm9mZnNldCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGZsYWNwYXJzZS0+YmxvY2tpbmdfc3RyYXRlZ3kgPSAwOworICBmbGFjcGFyc2UtPmJsb2NrX3NpemUgPSAwOworICBmbGFjcGFyc2UtPnNhbXBsZV9udW1iZXIgPSAwOworICBmbGFjcGFyc2UtPnN0cmF0ZWd5X2NoZWNrZWQgPSBGQUxTRTsKKworICBmbGFjcGFyc2UtPnNlbnRfY29kZWNfdGFnID0gRkFMU0U7CisKKyAgLyogImZMYUMiIG1hcmtlciAqLworICBnc3RfYmFzZV9wYXJzZV9zZXRfbWluX2ZyYW1lX3NpemUgKEdTVF9CQVNFX1BBUlNFIChmbGFjcGFyc2UpLCA0KTsKKworICAvKiBpbmZvcm0gYmFzZWNsYXNzIHdlIGNhbiBjb21lIHVwIHdpdGggdHMsIGJhc2VkIG9uIGNvdW50ZXJzIGluIHBhY2tldHMgKi8KKyAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X2hhc190aW1pbmdfaW5mbyAoR1NUX0JBU0VfUEFSU0VfQ0FTVCAoZmxhY3BhcnNlKSwgVFJVRSk7CisgIGdzdF9iYXNlX3BhcnNlX3NldF9zeW5jYWJsZSAoR1NUX0JBU0VfUEFSU0VfQ0FTVCAoZmxhY3BhcnNlKSwgVFJVRSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ZsYWNfcGFyc2Vfc3RvcCAoR3N0QmFzZVBhcnNlICogcGFyc2UpCit7CisgIEdzdEZsYWNQYXJzZSAqZmxhY3BhcnNlID0gR1NUX0ZMQUNfUEFSU0UgKHBhcnNlKTsKKworICBnc3RfZmxhY19wYXJzZV9yZXNldCAoZmxhY3BhcnNlKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBjb25zdCBndWludDggc2FtcGxlX3NpemVfdGFibGVbXSA9IHsgMCwgOCwgMTIsIDAsIDE2LCAyMCwgMjQsIDAgfTsKKworc3RhdGljIGNvbnN0IGd1aW50MTYgYmxvY2tzaXplX3RhYmxlWzE2XSA9IHsKKyAgMCwgMTkyLCA1NzYgPDwgMCwgNTc2IDw8IDEsIDU3NiA8PCAyLCA1NzYgPDwgMywgMCwgMCwKKyAgMjU2IDw8IDAsIDI1NiA8PCAxLCAyNTYgPDwgMiwgMjU2IDw8IDMsIDI1NiA8PCA0LCAyNTYgPDwgNSwgMjU2IDw8IDYsCisgIDI1NiA8PCA3LAorfTsKKworc3RhdGljIGNvbnN0IGd1aW50MzIgc2FtcGxlX3JhdGVfdGFibGVbMTZdID0geworICAwLAorICA4ODIwMCwgMTc2NDAwLCAxOTIwMDAsCisgIDgwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAsIDk2MDAwLAorICAwLCAwLCAwLCAwLAorfTsKKwordHlwZWRlZiBlbnVtCit7CisgIEZSQU1FX0hFQURFUl9WQUxJRCwKKyAgRlJBTUVfSEVBREVSX0lOVkFMSUQsCisgIEZSQU1FX0hFQURFUl9NT1JFX0RBVEEKK30gRnJhbWVIZWFkZXJDaGVja1JldHVybjsKKworc3RhdGljIEZyYW1lSGVhZGVyQ2hlY2tSZXR1cm4KK2dzdF9mbGFjX3BhcnNlX2ZyYW1lX2hlYWRlcl9pc192YWxpZCAoR3N0RmxhY1BhcnNlICogZmxhY3BhcnNlLAorICAgIGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsIGdib29sZWFuIHNldCwgZ3VpbnQxNiAqIGJsb2NrX3NpemVfcmV0LAorICAgIGdib29sZWFuICogc3VzcGVjdCkKK3sKKyAgR3N0Qml0UmVhZGVyIHJlYWRlciA9IEdTVF9CSVRfUkVBREVSX0lOSVQgKGRhdGEsIHNpemUpOworICBndWludDggYmxvY2tpbmdfc3RyYXRlZ3k7CisgIGd1aW50MTYgYmxvY2tfc2l6ZTsKKyAgZ3VpbnQzMiBzYW1wbGVyYXRlID0gMDsKKyAgZ3VpbnQ2NCBzYW1wbGVfbnVtYmVyOworICBndWludDggY2hhbm5lbHMsIGJwczsKKyAgZ3VpbnQ4IHRtcCA9IDA7CisgIGd1aW50OCBhY3R1YWxfY3JjLCBleHBlY3RlZF9jcmMgPSAwOworCisgIC8qIFNraXAgMTQgYml0IHN5bmMgY29kZSAqLworICBnc3RfYml0X3JlYWRlcl9za2lwX3VuY2hlY2tlZCAoJnJlYWRlciwgMTQpOworCisgIC8qIE11c3QgYmUgMCAqLworICBpZiAoZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmcmVhZGVyLCAxKSAhPSAwKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogMCA9PSBmaXhlZCBibG9jayBzaXplLCAxID09IHZhcmlhYmxlIGJsb2NrIHNpemUgKi8KKyAgYmxvY2tpbmdfc3RyYXRlZ3kgPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OF91bmNoZWNrZWQgKCZyZWFkZXIsIDEpOworICBpZiAoZmxhY3BhcnNlLT5mb3JjZV92YXJpYWJsZV9ibG9ja19zaXplKQorICAgIGJsb2NraW5nX3N0cmF0ZWd5ID0gMTsKKworICAvKiBibG9jayBzaXplIGluZGV4LCBjYWxjdWxhdGlvbiBvZiB0aGUgcmVhbCBibG9ja3NpemUgYmVsb3cgKi8KKyAgYmxvY2tfc2l6ZSA9IGdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQxNl91bmNoZWNrZWQgKCZyZWFkZXIsIDQpOworICBpZiAoYmxvY2tfc2l6ZSA9PSAwKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogc2FtcGxlIHJhdGUgaW5kZXgsIGNhbGN1bGF0aW9uIG9mIHRoZSByZWFsIHNhbXBsZXJhdGUgYmVsb3cgKi8KKyAgc2FtcGxlcmF0ZSA9IGdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQxNl91bmNoZWNrZWQgKCZyZWFkZXIsIDQpOworICBpZiAoc2FtcGxlcmF0ZSA9PSAweDBmKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogY2hhbm5lbCBhc3NpZ25tZW50ICovCisgIGNoYW5uZWxzID0gZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmcmVhZGVyLCA0KTsKKyAgaWYgKGNoYW5uZWxzIDwgOCkgeworICAgIGNoYW5uZWxzKys7CisgIH0gZWxzZSBpZiAoY2hhbm5lbHMgPD0gMTApIHsKKyAgICBjaGFubmVscyA9IDI7CisgIH0gZWxzZSBpZiAoY2hhbm5lbHMgPiAxMCkgeworICAgIGdvdG8gZXJyb3I7CisgIH0KKyAgaWYgKGZsYWNwYXJzZS0+Y2hhbm5lbHMgJiYgZmxhY3BhcnNlLT5jaGFubmVscyAhPSBjaGFubmVscykKKyAgICBnb3RvIGVycm9yOworCisgIC8qIGJpdHMgcGVyIHNhbXBsZSAqLworICBicHMgPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OF91bmNoZWNrZWQgKCZyZWFkZXIsIDMpOworICBpZiAoYnBzID09IDB4MDMgfHwgYnBzID09IDB4MDcpIHsKKyAgICBnb3RvIGVycm9yOworICB9IGVsc2UgaWYgKGJwcyA9PSAwICYmIGZsYWNwYXJzZS0+YnBzID09IDApIHsKKyAgICBnb3RvIG5lZWRfc3RyZWFtaW5mbzsKKyAgfQorICBicHMgPSBzYW1wbGVfc2l6ZV90YWJsZVticHNdOworICBpZiAoZmxhY3BhcnNlLT5icHMgJiYgYnBzICE9IGZsYWNwYXJzZS0+YnBzKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogcmVzZXJ2ZWQsIG11c3QgYmUgMCAqLworICBpZiAoZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmcmVhZGVyLCAxKSAhPSAwKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogcmVhZCAidXRmOCIgZW5jb2RlZCBzYW1wbGUvZnJhbWUgbnVtYmVyICovCisgIHsKKyAgICBnaW50IGxlbiA9IDA7CisKKyAgICBsZW4gPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OF91bmNoZWNrZWQgKCZyZWFkZXIsIDgpOworCisgICAgLyogVGhpcyBpcyBzbGlnaHRseSBmYXN0ZXIgdGhhbiBhIGxvb3AgKi8KKyAgICBpZiAoIShsZW4gJiAweDgwKSkgeworICAgICAgc2FtcGxlX251bWJlciA9IGxlbjsKKyAgICAgIGxlbiA9IDA7CisgICAgfSBlbHNlIGlmICgobGVuICYgMHhjMCkgJiYgIShsZW4gJiAweDIwKSkgeworICAgICAgc2FtcGxlX251bWJlciA9IGxlbiAmIDB4MWY7CisgICAgICBsZW4gPSAxOworICAgIH0gZWxzZSBpZiAoKGxlbiAmIDB4ZTApICYmICEobGVuICYgMHgxMCkpIHsKKyAgICAgIHNhbXBsZV9udW1iZXIgPSBsZW4gJiAweDBmOworICAgICAgbGVuID0gMjsKKyAgICB9IGVsc2UgaWYgKChsZW4gJiAweGYwKSAmJiAhKGxlbiAmIDB4MDgpKSB7CisgICAgICBzYW1wbGVfbnVtYmVyID0gbGVuICYgMHgwNzsKKyAgICAgIGxlbiA9IDM7CisgICAgfSBlbHNlIGlmICgobGVuICYgMHhmOCkgJiYgIShsZW4gJiAweDA0KSkgeworICAgICAgc2FtcGxlX251bWJlciA9IGxlbiAmIDB4MDM7CisgICAgICBsZW4gPSA0OworICAgIH0gZWxzZSBpZiAoKGxlbiAmIDB4ZmMpICYmICEobGVuICYgMHgwMikpIHsKKyAgICAgIHNhbXBsZV9udW1iZXIgPSBsZW4gJiAweDAxOworICAgICAgbGVuID0gNTsKKyAgICB9IGVsc2UgaWYgKChsZW4gJiAweGZlKSAmJiAhKGxlbiAmIDB4MDEpKSB7CisgICAgICBzYW1wbGVfbnVtYmVyID0gbGVuICYgMHgwOworICAgICAgbGVuID0gNjsKKyAgICB9IGVsc2UgeworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoKGJsb2NraW5nX3N0cmF0ZWd5ID09IDAgJiYgbGVuID4gNSkgfHwKKyAgICAgICAgKGJsb2NraW5nX3N0cmF0ZWd5ID09IDEgJiYgbGVuID4gNikpCisgICAgICBnb3RvIGVycm9yOworCisgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKCZyZWFkZXIsICZ0bXAsIDgpKQorICAgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworCisgICAgICBpZiAoKHRtcCAmIDB4YzApICE9IDB4ODApCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgIHNhbXBsZV9udW1iZXIgPDw9IDY7CisgICAgICBzYW1wbGVfbnVtYmVyIHw9ICh0bXAgJiAweDNmKTsKKyAgICAgIGxlbi0tOworICAgIH0KKyAgfQorCisgIC8qIGNhbGN1bGF0ZSByZWFsIGJsb2Nrc2l6ZSBmcm9tIHRoZSBibG9ja3NpemUgaW5kZXggKi8KKyAgaWYgKGJsb2NrX3NpemUgPT0gNikgeworICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDE2ICgmcmVhZGVyLCAmYmxvY2tfc2l6ZSwgOCkpCisgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworICAgIGJsb2NrX3NpemUrKzsKKyAgfSBlbHNlIGlmIChibG9ja19zaXplID09IDcpIHsKKyAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQxNiAoJnJlYWRlciwgJmJsb2NrX3NpemUsIDE2KSkKKyAgICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisgICAgYmxvY2tfc2l6ZSsrOworICB9IGVsc2UgeworICAgIGJsb2NrX3NpemUgPSBibG9ja3NpemVfdGFibGVbYmxvY2tfc2l6ZV07CisgIH0KKworICAvKiBjYWxjdWxhdGUgdGhlIHJlYWwgc2FtcGxlcmF0ZSBmcm9tIHRoZSBzYW1wbGVyYXRlIGluZGV4ICovCisgIGlmIChzYW1wbGVyYXRlID09IDAgJiYgZmxhY3BhcnNlLT5zYW1wbGVyYXRlID09IDApIHsKKyAgICBnb3RvIG5lZWRfc3RyZWFtaW5mbzsKKyAgfSBlbHNlIGlmIChzYW1wbGVyYXRlIDwgMTIpIHsKKyAgICBzYW1wbGVyYXRlID0gc2FtcGxlX3JhdGVfdGFibGVbc2FtcGxlcmF0ZV07CisgIH0gZWxzZSBpZiAoc2FtcGxlcmF0ZSA9PSAxMikgeworICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDMyICgmcmVhZGVyLCAmc2FtcGxlcmF0ZSwgOCkpCisgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworICAgIHNhbXBsZXJhdGUgKj0gMTAwMDsKKyAgfSBlbHNlIGlmIChzYW1wbGVyYXRlID09IDEzKSB7CisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MzIgKCZyZWFkZXIsICZzYW1wbGVyYXRlLCAxNikpCisgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworICB9IGVsc2UgaWYgKHNhbXBsZXJhdGUgPT0gMTQpIHsKKyAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQzMiAoJnJlYWRlciwgJnNhbXBsZXJhdGUsIDE2KSkKKyAgICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisgICAgc2FtcGxlcmF0ZSAqPSAxMDsKKyAgfQorCisgIGlmIChmbGFjcGFyc2UtPnNhbXBsZXJhdGUgJiYgZmxhY3BhcnNlLT5zYW1wbGVyYXRlICE9IHNhbXBsZXJhdGUpCisgICAgZ290byBlcnJvcjsKKworICAvKiBjaGVjayBjcmMtOCBmb3IgdGhlIGhlYWRlciAqLworICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4ICgmcmVhZGVyLCAmZXhwZWN0ZWRfY3JjLCA4KSkKKyAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworCisgIGFjdHVhbF9jcmMgPQorICAgICAgZ3N0X2ZsYWNfY2FsY3VsYXRlX2NyYzggKGRhdGEsCisgICAgICAoZ3N0X2JpdF9yZWFkZXJfZ2V0X3BvcyAoJnJlYWRlcikgLyA4KSAtIDEpOworICBpZiAoYWN0dWFsX2NyYyAhPSBleHBlY3RlZF9jcmMpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjcGFyc2UsCisgICAgICAgICJDaGVja3N1bSBtaXNtYXRjaC4gSGVhZGVyIENSQyB3YXMgJyVkJyBidXQgZnJhbWUgaGFzICclZCciLAorICAgICAgICBleHBlY3RlZF9jcmMsIGFjdHVhbF9jcmMpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICAvKiBTYW5pdHkgY2hlY2sgc2FtcGxlIG51bWJlciBhZ2FpbnN0IGJsb2NraW5nIHN0cmF0ZWd5LCBhcyBpdCBzZWVtcworICAgICBzb21lIGZpbGVzIGNsYWltIGZpeGVkIGJsb2NrIHNpemUgYnV0IHN1cHBseSBzYW1wbGUgbnVtYmVycywKKyAgICAgcmF0aGVyIHRoYW4gYmxvY2sgbnVtYmVycy4gKi8KKyAgaWYgKGJsb2NraW5nX3N0cmF0ZWd5ID09IDAgJiYgZmxhY3BhcnNlLT5ibG9ja19zaXplICE9IDApIHsKKyAgICBpZiAoIWZsYWNwYXJzZS0+c3RyYXRlZ3lfY2hlY2tlZCkgeworICAgICAgaWYgKGJsb2NrX3NpemUgPT0gc2FtcGxlX251bWJlcikgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGZsYWNwYXJzZSwgIlRoaXMgZmlsZSBjbGFpbXMgZml4ZWQgYmxvY2sgc2l6ZSwgIgorICAgICAgICAgICAgImJ1dCBzZWVtcyB0byBiZSBseWluZzogYXNzdW1pbmcgdmFyaWFibGUgYmxvY2sgc2l6ZSIpOworICAgICAgICBmbGFjcGFyc2UtPmZvcmNlX3ZhcmlhYmxlX2Jsb2NrX3NpemUgPSBUUlVFOworICAgICAgICBibG9ja2luZ19zdHJhdGVneSA9IDE7CisgICAgICB9CisgICAgICBmbGFjcGFyc2UtPnN0cmF0ZWd5X2NoZWNrZWQgPSBUUlVFOworICAgIH0KKyAgfQorCisgIC8qIGRvY3VtZW50YXRpb24gc2F5czoKKyAgICogVGhlICJibG9ja2luZyBzdHJhdGVneSIgYml0IG11c3QgYmUgdGhlIHNhbWUgdGhyb3VnaG91dCB0aGUgZW50aXJlIHN0cmVhbS4gKi8KKyAgaWYgKGZsYWNwYXJzZS0+YmxvY2tpbmdfc3RyYXRlZ3kgIT0gYmxvY2tpbmdfc3RyYXRlZ3kpIHsKKyAgICBpZiAoZmxhY3BhcnNlLT5ibG9ja19zaXplICE9IDApIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZmxhY3BhcnNlLCAiYmxvY2tpbmcgc3RyYXRlZ3kgaXMgbm90IGNvbnN0YW50Iik7CisgICAgICBpZiAoc3VzcGVjdCkKKyAgICAgICAgKnN1c3BlY3QgPSBUUlVFOworICAgIH0KKyAgfQorCisgIC8qCisgICAgIFRoZSBGTEFDIGZvcm1hdCBkb2N1bWVudGF0aW9uIHNheXM6CisgICAgIFRoZSAiYmxvY2tpbmcgc3RyYXRlZ3kiIGJpdCBkZXRlcm1pbmVzIGhvdyB0byBjYWxjdWxhdGUgdGhlIHNhbXBsZSBudW1iZXIKKyAgICAgb2YgdGhlIGZpcnN0IHNhbXBsZSBpbiB0aGUgZnJhbWUuIElmIHRoZSBiaXQgaXMgMCAoZml4ZWQtYmxvY2tzaXplKSwgdGhlCisgICAgIGZyYW1lIGhlYWRlciBlbmNvZGVzIHRoZSBmcmFtZSBudW1iZXIgYXMgYWJvdmUsIGFuZCB0aGUgZnJhbWUncyBzdGFydGluZworICAgICBzYW1wbGUgbnVtYmVyIHdpbGwgYmUgdGhlIGZyYW1lIG51bWJlciB0aW1lcyB0aGUgYmxvY2tzaXplLiBJZiBpdCBpcyAxCisgICAgICh2YXJpYWJsZS1ibG9ja3NpemUpLCB0aGUgZnJhbWUgaGVhZGVyIGVuY29kZXMgdGhlIGZyYW1lJ3Mgc3RhcnRpbmcKKyAgICAgc2FtcGxlIG51bWJlciBpdHNlbGYuIChJbiB0aGUgY2FzZSBvZiBhIGZpeGVkLWJsb2Nrc2l6ZSBzdHJlYW0sIG9ubHkgdGhlCisgICAgIGxhc3QgYmxvY2sgbWF5IGJlIHNob3J0ZXIgdGhhbiB0aGUgc3RyZWFtIGJsb2Nrc2l6ZTsgaXRzIHN0YXJ0aW5nIHNhbXBsZQorICAgICBudW1iZXIgd2lsbCBiZSBjYWxjdWxhdGVkIGFzIHRoZSBmcmFtZSBudW1iZXIgdGltZXMgdGhlIHByZXZpb3VzIGZyYW1lJ3MKKyAgICAgYmxvY2tzaXplLCBvciB6ZXJvIGlmIGl0IGlzIHRoZSBmaXJzdCBmcmFtZSkuCisKKyAgICAgVGhlcmVmb3JlLCB3aGVuIGluIGZpeGVkIGJsb2NrIHNpemUgbW9kZSwgd2Ugb25seSB1cGRhdGUgdGhlIGJsb2NrIHNpemUKKyAgICAgdGhlIGZpcnN0IHRpbWUsIHRoZW4gcmV1c2UgdGhhdCBibG9jayBzaXplIGZvciBzdWJzZXF1ZW50IGNhbGxzLgorICAgICBUaGlzIHdpbGwgYWxzbyBmaXggYSB0aW1lc3RhbXAgcHJvYmxlbSB3aXRoIHRoZSBsYXN0IGJsb2NrJ3MgdGltZXN0YW1wCisgICAgIGJlaW5nIG1pc2NhbGN1bGF0ZWQgYnkgc2NhbGluZyB0aGUgYmxvY2sgbnVtYmVyIGJ5IGEgIndyb25nIiBibG9jayBzaXplLgorICAgKi8KKyAgaWYgKGJsb2NraW5nX3N0cmF0ZWd5ID09IDApIHsKKyAgICBpZiAoZmxhY3BhcnNlLT5ibG9ja19zaXplICE9IDApIHsKKyAgICAgIC8qIGFmdGVyIGZpcnN0IGJsb2NrICovCisgICAgICBpZiAoZmxhY3BhcnNlLT5ibG9ja19zaXplICE9IGJsb2NrX3NpemUpIHsKKyAgICAgICAgLyogVE9ETzogY2FuIHdlIGtub3cgd2UncmUgb24gdGhlIGxhc3QgZnJhbWUsIHRvIGF2b2lkIHdhcm5pbmcgPyAqLworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGZsYWNwYXJzZSwgIkJsb2NrIHNpemUgaXMgbm90IGNvbnN0YW50Iik7CisgICAgICAgIGJsb2NrX3NpemUgPSBmbGFjcGFyc2UtPmJsb2NrX3NpemU7CisgICAgICAgIGlmIChzdXNwZWN0KQorICAgICAgICAgICpzdXNwZWN0ID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoc2V0KSB7CisgICAgZmxhY3BhcnNlLT5ibG9ja19zaXplID0gYmxvY2tfc2l6ZTsKKyAgICBpZiAoIWZsYWNwYXJzZS0+c2FtcGxlcmF0ZSkKKyAgICAgIGZsYWNwYXJzZS0+c2FtcGxlcmF0ZSA9IHNhbXBsZXJhdGU7CisgICAgaWYgKCFmbGFjcGFyc2UtPmJwcykKKyAgICAgIGZsYWNwYXJzZS0+YnBzID0gYnBzOworICAgIGlmICghZmxhY3BhcnNlLT5ibG9ja2luZ19zdHJhdGVneSkKKyAgICAgIGZsYWNwYXJzZS0+YmxvY2tpbmdfc3RyYXRlZ3kgPSBibG9ja2luZ19zdHJhdGVneTsKKyAgICBpZiAoIWZsYWNwYXJzZS0+Y2hhbm5lbHMpCisgICAgICBmbGFjcGFyc2UtPmNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgaWYgKCFmbGFjcGFyc2UtPnNhbXBsZV9udW1iZXIpCisgICAgICBmbGFjcGFyc2UtPnNhbXBsZV9udW1iZXIgPSBzYW1wbGVfbnVtYmVyOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY3BhcnNlLAorICAgICAgICAiUGFyc2VkIGZyYW1lIGF0IG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFUICI6XG4iICJCbG9jayBzaXplOiAldVxuIgorICAgICAgICAiU2FtcGxlL0ZyYW1lIG51bWJlcjogJSIgR19HVUlOVDY0X0ZPUk1BVCwgZmxhY3BhcnNlLT5vZmZzZXQsCisgICAgICAgIGZsYWNwYXJzZS0+YmxvY2tfc2l6ZSwgZmxhY3BhcnNlLT5zYW1wbGVfbnVtYmVyKTsKKyAgfQorCisgIGlmIChibG9ja19zaXplX3JldCkKKyAgICAqYmxvY2tfc2l6ZV9yZXQgPSBibG9ja19zaXplOworCisgIHJldHVybiBGUkFNRV9IRUFERVJfVkFMSUQ7CisKK25lZWRfc3RyZWFtaW5mbzoKKyAgR1NUX0VSUk9SX09CSkVDVCAoZmxhY3BhcnNlLCAiTmVlZCBTVFJFQU1JTkZPIG1ldGFkYXRhLiBCaXRzIHBlciBzYW1wbGUgIgorICAgICAgIm9yIHNhbXBsZSByYXRlIG5vdCBpbiBmcmFtZSBoZWFkZXIiKTsKK2Vycm9yOgorICByZXR1cm4gRlJBTUVfSEVBREVSX0lOVkFMSUQ7CisKK25lZWRfbW9yZV9kYXRhOgorICByZXR1cm4gRlJBTUVfSEVBREVSX01PUkVfREFUQTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmxhY19wYXJzZV9mcmFtZV9pc192YWxpZCAoR3N0RmxhY1BhcnNlICogZmxhY3BhcnNlLAorICAgIGNvbnN0IGd1aW50OCAqIGRhdGEsIGdzaXplIHNpemUsIGd1aW50ICogcmV0KQoreworICBndWludCBtYXgsIHJlbWFpbmluZzsKKyAgZ3VpbnQgaSwgc2VhcmNoX3N0YXJ0LCBzZWFyY2hfZW5kOworICBGcmFtZUhlYWRlckNoZWNrUmV0dXJuIGhlYWRlcl9yZXQ7CisgIGd1aW50MTYgYmxvY2tfc2l6ZTsKKyAgZ2Jvb2xlYW4gc3VzcGVjdF9zdGFydCA9IEZBTFNFLCBzdXNwZWN0X2VuZCA9IEZBTFNFOworCisgIGlmIChzaXplIDwgZmxhY3BhcnNlLT5taW5fZnJhbWVzaXplKQorICAgIGdvdG8gbmVlZF9tb3JlOworCisgIGhlYWRlcl9yZXQgPQorICAgICAgZ3N0X2ZsYWNfcGFyc2VfZnJhbWVfaGVhZGVyX2lzX3ZhbGlkIChmbGFjcGFyc2UsIGRhdGEsIHNpemUsIFRSVUUsCisgICAgICAmYmxvY2tfc2l6ZSwgJnN1c3BlY3Rfc3RhcnQpOworICBpZiAoaGVhZGVyX3JldCA9PSBGUkFNRV9IRUFERVJfSU5WQUxJRCkgeworICAgICpyZXQgPSAwOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoaGVhZGVyX3JldCA9PSBGUkFNRV9IRUFERVJfTU9SRV9EQVRBKQorICAgIGdvdG8gbmVlZF9tb3JlOworCisgIC8qIG1pbmQgdW5rbm93biBmcmFtZXNpemUgKi8KKyAgc2VhcmNoX3N0YXJ0ID0gTUFYICgyLCBmbGFjcGFyc2UtPm1pbl9mcmFtZXNpemUpOworICBpZiAoZmxhY3BhcnNlLT5tYXhfZnJhbWVzaXplKQorICAgIHNlYXJjaF9lbmQgPSBNSU4gKHNpemUsIGZsYWNwYXJzZS0+bWF4X2ZyYW1lc2l6ZSArIDkgKyAyKTsKKyAgZWxzZQorICAgIHNlYXJjaF9lbmQgPSBzaXplOworICBzZWFyY2hfZW5kIC09IDI7CisKKyAgcmVtYWluaW5nID0gc2l6ZTsKKworICBmb3IgKGkgPSBzZWFyY2hfc3RhcnQ7IGkgPCBzZWFyY2hfZW5kOyBpKyssIHJlbWFpbmluZy0tKSB7CisKKyAgICBpZiAoKEdTVF9SRUFEX1VJTlQxNl9CRSAoZGF0YSArIGkpICYgMHhmZmZlKSAhPSAweGZmZjgpCisgICAgICBjb250aW51ZTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChmbGFjcGFyc2UsICJwb3NzaWJsZSBmcmFtZSBlbmQgYXQgb2Zmc2V0ICVkIiwgaSk7CisgICAgc3VzcGVjdF9lbmQgPSBGQUxTRTsKKyAgICBoZWFkZXJfcmV0ID0KKyAgICAgICAgZ3N0X2ZsYWNfcGFyc2VfZnJhbWVfaGVhZGVyX2lzX3ZhbGlkIChmbGFjcGFyc2UsIGRhdGEgKyBpLAorICAgICAgICByZW1haW5pbmcsIEZBTFNFLCBOVUxMLCAmc3VzcGVjdF9lbmQpOworICAgIGlmIChoZWFkZXJfcmV0ID09IEZSQU1FX0hFQURFUl9WQUxJRCkgeworICAgICAgaWYgKGZsYWNwYXJzZS0+Y2hlY2tfZnJhbWVfY2hlY2tzdW1zIHx8IHN1c3BlY3Rfc3RhcnQgfHwgc3VzcGVjdF9lbmQpIHsKKyAgICAgICAgZ3VpbnQxNiBhY3R1YWxfY3JjID0gZ3N0X2ZsYWNfY2FsY3VsYXRlX2NyYzE2IChkYXRhLCBpIC0gMik7CisgICAgICAgIGd1aW50MTYgZXhwZWN0ZWRfY3JjID0gR1NUX1JFQURfVUlOVDE2X0JFIChkYXRhICsgaSAtIDIpOworCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChmbGFjcGFyc2UsCisgICAgICAgICAgICAiRm91bmQgcG9zc2libGUgZnJhbWUgKCVkLCAlZCkuIENoZWNraW5nIGZvciBDUkMgbWF0Y2giLAorICAgICAgICAgICAgc3VzcGVjdF9zdGFydCwgc3VzcGVjdF9lbmQpOworICAgICAgICBpZiAoYWN0dWFsX2NyYyAhPSBleHBlY3RlZF9jcmMpIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjcGFyc2UsCisgICAgICAgICAgICAgICJDaGVja3N1bSBtaXNtYXRjaC4gSGVhZGVyIENSQyB3YXMgJyVkJyBidXQgZnJhbWUgaGFzICclZCciLAorICAgICAgICAgICAgICBleHBlY3RlZF9jcmMsIGFjdHVhbF9jcmMpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICAqcmV0ID0gaTsKKyAgICAgIGZsYWNwYXJzZS0+YmxvY2tfc2l6ZSA9IGJsb2NrX3NpemU7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9IGVsc2UgaWYgKGhlYWRlcl9yZXQgPT0gRlJBTUVfSEVBREVSX01PUkVfREFUQSkgeworICAgICAgZ290byBuZWVkX21vcmU7CisgICAgfQorICB9CisKKyAgLyogRm9yIHRoZSBsYXN0IGZyYW1lIG91dHB1dCBldmVyeXRoaW5nIHRvIHRoZSBlbmQgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKEdTVF9CQVNFX1BBUlNFX0RSQUlOSU5HIChmbGFjcGFyc2UpKSkgeworICAgIGlmIChmbGFjcGFyc2UtPmNoZWNrX2ZyYW1lX2NoZWNrc3VtcykgeworICAgICAgZ3VpbnQxNiBhY3R1YWxfY3JjID0gZ3N0X2ZsYWNfY2FsY3VsYXRlX2NyYzE2IChkYXRhLCBzaXplIC0gMik7CisgICAgICBndWludDE2IGV4cGVjdGVkX2NyYyA9IEdTVF9SRUFEX1VJTlQxNl9CRSAoZGF0YSArIHNpemUgLSAyKTsKKworICAgICAgaWYgKGFjdHVhbF9jcmMgPT0gZXhwZWN0ZWRfY3JjKSB7CisgICAgICAgICpyZXQgPSBzaXplOworICAgICAgICBmbGFjcGFyc2UtPmJsb2NrX3NpemUgPSBibG9ja19zaXplOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgKnJldCA9IHNpemU7CisgICAgICBmbGFjcGFyc2UtPmJsb2NrX3NpemUgPSBibG9ja19zaXplOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisKKyAgLyogc28gd2Ugc2VhcmNoZWQgdG8gZXhwZWN0ZWQgZW5kIGFuZCBmb3VuZCBub3RoaW5nLAorICAgKiBnaXZlIHVwIG9uIHRoaXMgZnJhbWUgKHN0YXJ0KSAqLworICBpZiAoZmxhY3BhcnNlLT5tYXhfZnJhbWVzaXplICYmIGkgPiAyICogZmxhY3BhcnNlLT5tYXhfZnJhbWVzaXplKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGZsYWNwYXJzZSwKKyAgICAgICAgImNvdWxkIG5vdCBkZXRlcm1pbmUgdmFsaWQgZnJhbWUgZW5kLCBkaXNjYXJkaW5nIGZyYW1lIChzdGFydCkiKTsKKyAgICAqcmV0ID0gMTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworbmVlZF9tb3JlOgorICBtYXggPSBmbGFjcGFyc2UtPm1heF9mcmFtZXNpemUgKyAxNjsKKyAgaWYgKG1heCA9PSAxNikKKyAgICBtYXggPSAxIDw8IDI0OworICAqcmV0ID0gTUlOIChzaXplICsgNDA5NiwgbWF4KTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZmxhY19wYXJzZV9oYW5kbGVfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUsIGdpbnQgKiBza2lwc2l6ZSkKK3sKKyAgR3N0RmxhY1BhcnNlICpmbGFjcGFyc2UgPSBHU1RfRkxBQ19QQVJTRSAocGFyc2UpOworICBHc3RCdWZmZXIgKmJ1ZmZlciA9IGZyYW1lLT5idWZmZXI7CisgIEdzdE1hcEluZm8gbWFwOworICBnYm9vbGVhbiByZXN1bHQgPSBUUlVFOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludCBmcmFtZXNpemUgPSAwOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgKnNraXBzaXplID0gMTsKKworICBpZiAoR19VTkxJS0VMWSAobWFwLnNpemUgPCA0KSkgeworICAgIHJlc3VsdCA9IEZBTFNFOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorCisgIGlmIChmbGFjcGFyc2UtPnN0YXRlID09IEdTVF9GTEFDX1BBUlNFX1NUQVRFX0lOSVQpIHsKKyAgICBpZiAobWVtY21wIChtYXAuZGF0YSwgImZMYUMiLCA0KSA9PSAwKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjcGFyc2UsICJmTGFDIG1hcmtlciBmb3VuZCIpOworICAgICAgZnJhbWVzaXplID0gNDsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisgICAgaWYgKG1hcC5kYXRhWzBdID09IDB4ZmYgJiYgKG1hcC5kYXRhWzFdID4+IDIpID09IDB4M2UpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZsYWNwYXJzZSwgIkZvdW5kIGhlYWRlcmxlc3MgRkxBQyIpOworICAgICAgLyogTWluaW1hbCBzaXplIG9mIGEgZnJhbWUgaGVhZGVyICovCisgICAgICBnc3RfYmFzZV9wYXJzZV9zZXRfbWluX2ZyYW1lX3NpemUgKEdTVF9CQVNFX1BBUlNFIChmbGFjcGFyc2UpLCA5KTsKKyAgICAgIGZsYWNwYXJzZS0+c3RhdGUgPSBHU1RfRkxBQ19QQVJTRV9TVEFURV9HRU5FUkFURV9IRUFERVJTOworICAgICAgKnNraXBzaXplID0gMDsKKyAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKyAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjcGFyc2UsICJmTGFDIG1hcmtlciBub3QgZm91bmQiKTsKKyAgICByZXN1bHQgPSBGQUxTRTsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KKworICBpZiAoZmxhY3BhcnNlLT5zdGF0ZSA9PSBHU1RfRkxBQ19QQVJTRV9TVEFURV9IRUFERVJTKSB7CisgICAgZ3VpbnQgc2l6ZSA9IDQgKyAoKG1hcC5kYXRhWzFdIDw8IDE2KSB8IChtYXAuZGF0YVsyXSA8PCA4KSB8IChtYXAuZGF0YVszXSkpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY3BhcnNlLCAiRm91bmQgbWV0YWRhdGEgYmxvY2sgb2Ygc2l6ZSAldSIsIHNpemUpOworICAgIGZyYW1lc2l6ZSA9IHNpemU7CisgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplIChHU1RfQkFTRV9QQVJTRSAoZmxhY3BhcnNlKSwgZnJhbWVzaXplKTsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KKworICBpZiAoKEdTVF9SRUFEX1VJTlQxNl9CRSAobWFwLmRhdGEpICYgMHhmZmZlKSA9PSAweGZmZjgpIHsKKyAgICBnYm9vbGVhbiByZXQsIGlzX2ZpcnN0ID0gIWZsYWNwYXJzZS0+c3RyYXRlZ3lfY2hlY2tlZDsKKyAgICBndWludCBuZXh0OworCisgICAgZmxhY3BhcnNlLT5vZmZzZXQgPSBHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKTsKKyAgICBmbGFjcGFyc2UtPmJsb2NraW5nX3N0cmF0ZWd5ID0gMDsKKyAgICBmbGFjcGFyc2UtPnNhbXBsZV9udW1iZXIgPSAwOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY3BhcnNlLCAiRm91bmQgc3luYyBjb2RlIik7CisgICAgcmV0ID0gZ3N0X2ZsYWNfcGFyc2VfZnJhbWVfaXNfdmFsaWQgKGZsYWNwYXJzZSwgbWFwLmRhdGEsIG1hcC5zaXplLCAmbmV4dCk7CisgICAgaWYgKHJldCkgeworICAgICAgaWYgKGlzX2ZpcnN0KSB7CisgICAgICAgIEdTVF9JTkZPX09CSkVDVCAoZmxhY3BhcnNlLCAiRmlyc3Qgc2FtcGxlIG51bWJlciBpcyAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgZmxhY3BhcnNlLT5zYW1wbGVfbnVtYmVyKTsKKyAgICAgICAgZmxhY3BhcnNlLT5maXJzdF9zYW1wbGVfbnVtYmVyID0gZmxhY3BhcnNlLT5zYW1wbGVfbnVtYmVyOworICAgICAgfQorICAgICAgZnJhbWVzaXplID0gbmV4dDsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisKKyAgICAvKiBJZiB3ZSdyZSBhdCBFT1MgYW5kIHRoZSBmcmFtZSB3YXMgbm90IHZhbGlkLCBkcm9wIGl0ISAqLworICAgIGlmIChHX1VOTElLRUxZIChHU1RfQkFTRV9QQVJTRV9EUkFJTklORyAoZmxhY3BhcnNlKSkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZmxhY3BhcnNlLCAiRU9TIik7CisgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisKKyAgICBpZiAobmV4dCA9PSAwKSB7CisgICAgfSBlbHNlIGlmIChuZXh0ID4gbWFwLnNpemUpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZsYWNwYXJzZSwgIlJlcXVlc3RpbmcgJXUgYnl0ZXMiLCBuZXh0KTsKKyAgICAgICpza2lwc2l6ZSA9IDA7CisgICAgICBnc3RfYmFzZV9wYXJzZV9zZXRfbWluX2ZyYW1lX3NpemUgKHBhcnNlLCBuZXh0KTsKKyAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgZ290byBjbGVhbnVwOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChmbGFjcGFyc2UsCisgICAgICAgICAgIkdpdmluZyB1cCBvbiBpbnZhbGlkIGZyYW1lICglIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzKSIsIG1hcC5zaXplKTsKKyAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHc3RCeXRlUmVhZGVyIHJlYWRlcjsKKyAgICBnaW50IG9mZjsKKworICAgIGdzdF9ieXRlX3JlYWRlcl9pbml0ICgmcmVhZGVyLCBtYXAuZGF0YSwgbWFwLnNpemUpOworICAgIG9mZiA9CisgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9tYXNrZWRfc2Nhbl91aW50MzIgKCZyZWFkZXIsIDB4ZmZmYzAwMDAsIDB4ZmZmODAwMDAsCisgICAgICAgIDAsIG1hcC5zaXplKTsKKworICAgIGlmIChvZmYgPiAwKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlBvc3NpYmxlIHN5bmMgYXQgYnVmZmVyIG9mZnNldCAlZCIsIG9mZik7CisgICAgICAqc2tpcHNpemUgPSBvZmY7CisgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjcGFyc2UsICJTeW5jIGNvZGUgbm90IGZvdW5kIik7CisgICAgKnNraXBzaXplID0gbWFwLnNpemUgLSAzOworICAgIHJlc3VsdCA9IEZBTFNFOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorCisgIHJlc3VsdCA9IEZBTFNFOworCitjbGVhbnVwOgorICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgIGlmIChyZXN1bHQpCisgICAgKnNraXBzaXplID0gMDsKKworICBpZiAocmVzdWx0ICYmIGZyYW1lc2l6ZSA8PSBtYXAuc2l6ZSkgeworICAgIHJldCA9IGdzdF9mbGFjX3BhcnNlX3BhcnNlX2ZyYW1lIChwYXJzZSwgZnJhbWUsIGZyYW1lc2l6ZSk7CisgICAgaWYgKHJldCA9PSBHU1RfQkFTRV9QQVJTRV9GTE9XX0RST1BQRUQpIHsKKyAgICAgIGZyYW1lLT5mbGFncyB8PSBHU1RfQkFTRV9QQVJTRV9GUkFNRV9GTEFHX0RST1A7CisgICAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICB9CisgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSykKKyAgICAgIHJldCA9IGdzdF9iYXNlX3BhcnNlX2ZpbmlzaF9mcmFtZSAocGFyc2UsIGZyYW1lLCBmcmFtZXNpemUpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmxhY19wYXJzZV9oYW5kbGVfc3RyZWFtaW5mbyAoR3N0RmxhY1BhcnNlICogZmxhY3BhcnNlLCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdEJpdFJlYWRlciByZWFkZXI7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGdzdF9iaXRfcmVhZGVyX2luaXQgKCZyZWFkZXIsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisKKyAgaWYgKG1hcC5zaXplICE9IDQgKyAzNCkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGZsYWNwYXJzZSwKKyAgICAgICAgIkludmFsaWQgbWV0YWJsb2NrIHNpemUgZm9yIFNUUkVBTUlORk86ICUiIEdfR1NJWkVfRk9STUFUICIiLCBtYXAuc2l6ZSk7CisgICAgZ290byBmYWlsdXJlOworICB9CisKKyAgLyogU2tpcCBtZXRhZGF0YSBibG9jayBoZWFkZXIgKi8KKyAgaWYgKCFnc3RfYml0X3JlYWRlcl9za2lwICgmcmVhZGVyLCAzMikpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQxNiAoJnJlYWRlciwgJmZsYWNwYXJzZS0+bWluX2Jsb2Nrc2l6ZSwgMTYpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmIChmbGFjcGFyc2UtPm1pbl9ibG9ja3NpemUgPCAxNikgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZmxhY3BhcnNlLCAiSW52YWxpZCBtaW5pbXVtIGJsb2NrIHNpemU6ICV1IiwKKyAgICAgICAgZmxhY3BhcnNlLT5taW5fYmxvY2tzaXplKTsKKyAgfQorCisgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDE2ICgmcmVhZGVyLCAmZmxhY3BhcnNlLT5tYXhfYmxvY2tzaXplLCAxNikpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKGZsYWNwYXJzZS0+bWF4X2Jsb2Nrc2l6ZSA8IDE2KSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChmbGFjcGFyc2UsICJJbnZhbGlkIG1heGltdW0gYmxvY2sgc2l6ZTogJXUiLAorICAgICAgICBmbGFjcGFyc2UtPm1heF9ibG9ja3NpemUpOworICB9CisKKyAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MzIgKCZyZWFkZXIsICZmbGFjcGFyc2UtPm1pbl9mcmFtZXNpemUsIDI0KSkKKyAgICBnb3RvIGVycm9yOworICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQzMiAoJnJlYWRlciwgJmZsYWNwYXJzZS0+bWF4X2ZyYW1lc2l6ZSwgMjQpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MzIgKCZyZWFkZXIsICZmbGFjcGFyc2UtPnNhbXBsZXJhdGUsIDIwKSkKKyAgICBnb3RvIGVycm9yOworICBpZiAoZmxhY3BhcnNlLT5zYW1wbGVyYXRlID09IDApIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChmbGFjcGFyc2UsICJJbnZhbGlkIHNhbXBsZSByYXRlIDAiKTsKKyAgICBnb3RvIGZhaWx1cmU7CisgIH0KKworICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4ICgmcmVhZGVyLCAmZmxhY3BhcnNlLT5jaGFubmVscywgMykpCisgICAgZ290byBlcnJvcjsKKyAgZmxhY3BhcnNlLT5jaGFubmVscysrOworICBpZiAoZmxhY3BhcnNlLT5jaGFubmVscyA+IDgpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChmbGFjcGFyc2UsICJJbnZhbGlkIG51bWJlciBvZiBjaGFubmVscyAldSIsCisgICAgICAgIGZsYWNwYXJzZS0+Y2hhbm5lbHMpOworICAgIGdvdG8gZmFpbHVyZTsKKyAgfQorCisgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKCZyZWFkZXIsICZmbGFjcGFyc2UtPmJwcywgNSkpCisgICAgZ290byBlcnJvcjsKKyAgZmxhY3BhcnNlLT5icHMrKzsKKworICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ2NCAoJnJlYWRlciwgJmZsYWNwYXJzZS0+dG90YWxfc2FtcGxlcywgMzYpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmIChmbGFjcGFyc2UtPnRvdGFsX3NhbXBsZXMpIHsKKyAgICBnc3RfYmFzZV9wYXJzZV9zZXRfZHVyYXRpb24gKEdTVF9CQVNFX1BBUlNFIChmbGFjcGFyc2UpLAorICAgICAgICBHU1RfRk9STUFUX0RFRkFVTFQsIGZsYWNwYXJzZS0+dG90YWxfc2FtcGxlcywgMCk7CisgIH0KKworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGZsYWNwYXJzZSwgIlNUUkVBTUlORk86XG4iCisgICAgICAiXHRtaW4vbWF4IGJsb2Nrc2l6ZTogJXUvJXUsXG4iCisgICAgICAiXHRtaW4vbWF4IGZyYW1lc2l6ZTogJXUvJXUsXG4iCisgICAgICAiXHRzYW1wbGVyYXRlOiAldSxcbiIKKyAgICAgICJcdGNoYW5uZWxzOiAldSxcbiIKKyAgICAgICJcdGJpdHMgcGVyIHNhbXBsZTogJXUsXG4iCisgICAgICAiXHR0b3RhbCBzYW1wbGVzOiAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgZmxhY3BhcnNlLT5taW5fYmxvY2tzaXplLCBmbGFjcGFyc2UtPm1heF9ibG9ja3NpemUsCisgICAgICBmbGFjcGFyc2UtPm1pbl9mcmFtZXNpemUsIGZsYWNwYXJzZS0+bWF4X2ZyYW1lc2l6ZSwKKyAgICAgIGZsYWNwYXJzZS0+c2FtcGxlcmF0ZSwKKyAgICAgIGZsYWNwYXJzZS0+Y2hhbm5lbHMsIGZsYWNwYXJzZS0+YnBzLCBmbGFjcGFyc2UtPnRvdGFsX3NhbXBsZXMpOworCisgIHJldHVybiBUUlVFOworCitlcnJvcjoKKyAgR1NUX0VSUk9SX09CSkVDVCAoZmxhY3BhcnNlLCAiRmFpbGVkIHRvIHJlYWQgZGF0YSIpOworZmFpbHVyZToKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbGFjX3BhcnNlX2hhbmRsZV92b3JiaXNjb21tZW50IChHc3RGbGFjUGFyc2UgKiBmbGFjcGFyc2UsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RUYWdMaXN0ICp0YWdzOworICBHc3RNYXBJbmZvIG1hcDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIHRhZ3MgPQorICAgICAgZ3N0X3RhZ19saXN0X2Zyb21fdm9yYmlzY29tbWVudCAobWFwLmRhdGEsIG1hcC5zaXplLCBtYXAuZGF0YSwgNCwgTlVMTCk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKKyAgaWYgKHRhZ3MgPT0gTlVMTCkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGZsYWNwYXJzZSwgIkludmFsaWQgdm9yYmlzY29tbWVudCBibG9jayIpOworICB9IGVsc2UgaWYgKGdzdF90YWdfbGlzdF9pc19lbXB0eSAodGFncykpIHsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ3MpOworICB9IGVsc2UgaWYgKGZsYWNwYXJzZS0+dGFncyA9PSBOVUxMKSB7CisgICAgZmxhY3BhcnNlLT50YWdzID0gdGFnczsKKyAgfSBlbHNlIHsKKyAgICBnc3RfdGFnX2xpc3RfaW5zZXJ0IChmbGFjcGFyc2UtPnRhZ3MsIHRhZ3MsIEdTVF9UQUdfTUVSR0VfQVBQRU5EKTsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ3MpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ZsYWNfcGFyc2VfaGFuZGxlX2N1ZXNoZWV0IChHc3RGbGFjUGFyc2UgKiBmbGFjcGFyc2UsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0Qnl0ZVJlYWRlciByZWFkZXI7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludCBpLCBqOworICBndWludDggbl90cmFja3MsIHRyYWNrX251bSwgaW5kZXg7CisgIGd1aW50NjQgb2Zmc2V0OworICBnaW50NjQgc3RhcnQsIHN0b3A7CisgIGdjaGFyICppZDsKKyAgZ2NoYXIgaXNyY1sxM107CisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisgIEdzdFRvYyAqdG9jOworICBHc3RUb2NFbnRyeSAqY3VyX2VudHJ5ID0gTlVMTCwgKnByZXZfZW50cnkgPSBOVUxMOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGdzdF9ieXRlX3JlYWRlcl9pbml0ICgmcmVhZGVyLCBtYXAuZGF0YSwgbWFwLnNpemUpOworCisgIHRvYyA9IGdzdF90b2NfbmV3IChHU1RfVE9DX1NDT1BFX0dMT0JBTCk7CisKKyAgLyogc2tpcCA0IGJ5dGVzIE1FVEFEQVRBX0JMT0NLX0hFQURFUiAqLworICAvKiBodHRwczovL3hpcGgub3JnL2ZsYWMvZm9ybWF0Lmh0bWwjbWV0YWRhdGFfYmxvY2tfaGVhZGVyICovCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZyZWFkZXIsIDQpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogc2tpcCAzOTUgYnl0ZXMgZnJvbSBNRVRBREFUQV9CTE9DS19DVUVTSEVFVCAqLworICAvKiBodHRwczovL3hpcGgub3JnL2ZsYWMvZm9ybWF0Lmh0bWwjbWV0YWRhdGFfYmxvY2tfY3Vlc2hlZXQgKi8KKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJnJlYWRlciwgMzk1KSkKKyAgICBnb3RvIGVycm9yOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAoJnJlYWRlciwgJm5fdHJhY2tzKSkKKyAgICBnb3RvIGVycm9yOworCisgIC8qIENVRVNIRUVUX1RSQUNLICovCisgIC8qIGh0dHBzOi8veGlwaC5vcmcvZmxhYy9mb3JtYXQuaHRtbCNjdWVzaGVldF90cmFjayAqLworICBmb3IgKGkgPSAwOyBpIDwgbl90cmFja3M7IGkrKykgeworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50NjRfYmUgKCZyZWFkZXIsICZvZmZzZXQpKQorICAgICAgZ290byBlcnJvcjsKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZyZWFkZXIsICZ0cmFja19udW0pKQorICAgICAgZ290byBlcnJvcjsKKworICAgIGlmIChnc3RfYnl0ZV9yZWFkZXJfZ2V0X3JlbWFpbmluZyAoJnJlYWRlcikgPCAxMikKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgbWVtY3B5IChpc3JjLCBtYXAuZGF0YSArIGdzdF9ieXRlX3JlYWRlcl9nZXRfcG9zICgmcmVhZGVyKSwgMTIpOworICAgIC8qIFwwLXRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCisgICAgaXNyY1sxMl0gPSAnXDAnOworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZyZWFkZXIsIDEyKSkKKyAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAvKiBza2lwIDE0IGJ5dGVzIGZyb20gQ1VFU0hFRVRfVFJBQ0sgKi8KKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmcmVhZGVyLCAxNCkpCisgICAgICBnb3RvIGVycm9yOworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAoJnJlYWRlciwgJmluZGV4KSkKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgLyogYWRkIHRyYWNrcyBpbiBUT0MgKi8KKyAgICAvKiBsZWFkLW91dCB0YWNrIGhhcyBudW1iZXIgMTcwIG9yIDI1NSAqLworICAgIGlmICh0cmFja19udW0gIT0gMTcwICYmIHRyYWNrX251bSAhPSAyNTUpIHsKKyAgICAgIHByZXZfZW50cnkgPSBjdXJfZW50cnk7CisgICAgICAvKiBwcmV2aW91cyB0cmFjayBzdG9wIHRpbWUgPSBjdXJyZW50IHRyYWNrIHN0YXJ0IHRpbWUgKi8KKyAgICAgIGlmIChwcmV2X2VudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgZ3N0X3RvY19lbnRyeV9nZXRfc3RhcnRfc3RvcF90aW1lcyAocHJldl9lbnRyeSwgJnN0YXJ0LCBOVUxMKTsKKyAgICAgICAgc3RvcCA9CisgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKG9mZnNldCwgR1NUX1NFQ09ORCwKKyAgICAgICAgICAgIGZsYWNwYXJzZS0+c2FtcGxlcmF0ZSk7CisgICAgICAgIGdzdF90b2NfZW50cnlfc2V0X3N0YXJ0X3N0b3BfdGltZXMgKHByZXZfZW50cnksIHN0YXJ0LCBzdG9wKTsKKyAgICAgIH0KKyAgICAgIGlkID0gZ19zdHJkdXBfcHJpbnRmICgiJTA4eCIsIHRyYWNrX251bSk7CisgICAgICBjdXJfZW50cnkgPSBnc3RfdG9jX2VudHJ5X25ldyAoR1NUX1RPQ19FTlRSWV9UWVBFX1RSQUNLLCBpZCk7CisgICAgICBnX2ZyZWUgKGlkKTsKKyAgICAgIHN0YXJ0ID0KKyAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKG9mZnNldCwgR1NUX1NFQ09ORCwKKyAgICAgICAgICBmbGFjcGFyc2UtPnNhbXBsZXJhdGUpOworICAgICAgZ3N0X3RvY19lbnRyeV9zZXRfc3RhcnRfc3RvcF90aW1lcyAoY3VyX2VudHJ5LCBzdGFydCwgLTEpOworICAgICAgLyogYWRkIElTUkMgYXMgdGFnIGluIHRyYWNrICovCisgICAgICBpZiAoc3RybGVuIChpc3JjKSAhPSAwKSB7CisgICAgICAgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdzLCBHU1RfVEFHX01FUkdFX0FQUEVORCwgR1NUX1RBR19JU1JDLCBpc3JjLCBOVUxMKTsKKyAgICAgICAgZ3N0X3RvY19lbnRyeV9zZXRfdGFncyAoY3VyX2VudHJ5LCB0YWdzKTsKKyAgICAgIH0KKyAgICAgIGdzdF90b2NfYXBwZW5kX2VudHJ5ICh0b2MsIGN1cl9lbnRyeSk7CisgICAgICAvKiBDVUVTSEVFVF9UUkFDS19JTkRFWCAqLworICAgICAgLyogaHR0cHM6Ly94aXBoLm9yZy9mbGFjL2Zvcm1hdC5odG1sI2N1ZXNoZWV0X3RyYWNrX2luZGV4ICovCisgICAgICBmb3IgKGogPSAwOyBqIDwgaW5kZXg7IGorKykgeworICAgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmcmVhZGVyLCAxMikpCisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogc2V0IHN0b3AgdGltZSBpbiBsYXN0IHRyYWNrICovCisgICAgICBzdG9wID0KKyAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKG9mZnNldCwgR1NUX1NFQ09ORCwKKyAgICAgICAgICBmbGFjcGFyc2UtPnNhbXBsZXJhdGUpOworICAgICAgZ3N0X3RvY19lbnRyeV9zZXRfc3RhcnRfc3RvcF90aW1lcyAoY3VyX2VudHJ5LCBzdGFydCwgc3RvcCk7CisgICAgfQorICB9CisKKyAgLyogc2VuZCBkYXRhIGFzIFRPQyAqLworICBpZiAoIWZsYWNwYXJzZS0+dG9jKQorICAgIGZsYWNwYXJzZS0+dG9jID0gdG9jOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIHJldHVybiBUUlVFOworCitlcnJvcjoKKyAgR1NUX0VSUk9SX09CSkVDVCAoZmxhY3BhcnNlLCAiRXJyb3IgcmVhZGluZyBkYXRhIik7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmxhY19wYXJzZV9oYW5kbGVfcGljdHVyZSAoR3N0RmxhY1BhcnNlICogZmxhY3BhcnNlLCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdEJ5dGVSZWFkZXIgcmVhZGVyOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQzMiBpbWdfbGVuID0gMCwgaW1nX3R5cGUgPSAwOworICBndWludDMyIGltZ19taW1ldHlwZV9sZW4gPSAwLCBpbWdfZGVzY3JpcHRpb25fbGVuID0gMDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBnc3RfYnl0ZV9yZWFkZXJfaW5pdCAoJnJlYWRlciwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmcmVhZGVyLCA0KSkKKyAgICBnb3RvIGVycm9yOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZyZWFkZXIsICZpbWdfdHlwZSkpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmcmVhZGVyLCAmaW1nX21pbWV0eXBlX2xlbikpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJnJlYWRlciwgaW1nX21pbWV0eXBlX2xlbikpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmcmVhZGVyLCAmaW1nX2Rlc2NyaXB0aW9uX2xlbikpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJnJlYWRlciwgaW1nX2Rlc2NyaXB0aW9uX2xlbikpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmcmVhZGVyLCA0ICogNCkpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmcmVhZGVyLCAmaW1nX2xlbikpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoZ3N0X2J5dGVfcmVhZGVyX2dldF9wb3MgKCZyZWFkZXIpICsgaW1nX2xlbiA+IG1hcC5zaXplKQorICAgIGdvdG8gZXJyb3I7CisKKyAgR1NUX0lORk9fT0JKRUNUIChmbGFjcGFyc2UsICJHb3QgaW1hZ2Ugb2YgJWQgYnl0ZXMiLCBpbWdfbGVuKTsKKworICBpZiAoaW1nX2xlbiA+IDApIHsKKyAgICBpZiAoZmxhY3BhcnNlLT50YWdzID09IE5VTEwpCisgICAgICBmbGFjcGFyc2UtPnRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgICAgZ3N0X3RhZ19saXN0X2FkZF9pZDNfaW1hZ2UgKGZsYWNwYXJzZS0+dGFncywKKyAgICAgICAgbWFwLmRhdGEgKyBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3BvcyAoJnJlYWRlciksIGltZ19sZW4sIGltZ190eXBlKTsKKyAgfQorCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIHJldHVybiBUUlVFOworCitlcnJvcjoKKyAgR1NUX0VSUk9SX09CSkVDVCAoZmxhY3BhcnNlLCAiRXJyb3IgcmVhZGluZyBkYXRhIik7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmxhY19wYXJzZV9oYW5kbGVfc2Vla3RhYmxlIChHc3RGbGFjUGFyc2UgKiBmbGFjcGFyc2UsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKworICBHU1RfREVCVUdfT0JKRUNUIChmbGFjcGFyc2UsICJzdG9yaW5nIHNlZWt0YWJsZSIpOworICAvKiBvbmx5IHN0b3JlIGZvciBub3c7CisgICAqIG9mZnNldCBvZiB0aGUgZmlyc3QgZnJhbWUgaXMgbmVlZGVkIHRvIGdldCByZWFsIGluZm8gKi8KKyAgaWYgKGZsYWNwYXJzZS0+c2Vla3RhYmxlKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKGZsYWNwYXJzZS0+c2Vla3RhYmxlKTsKKyAgZmxhY3BhcnNlLT5zZWVrdGFibGUgPSBnc3RfYnVmZmVyX3JlZiAoYnVmZmVyKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9mbGFjX3BhcnNlX3Byb2Nlc3Nfc2Vla3RhYmxlIChHc3RGbGFjUGFyc2UgKiBmbGFjcGFyc2UsIGdpbnQ2NCBib2Zmc2V0KQoreworICBHc3RCeXRlUmVhZGVyIGJyOworICBnaW50NjQgb2Zmc2V0ID0gMCwgc2FtcGxlcyA9IDA7CisgIEdzdE1hcEluZm8gbWFwOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGZsYWNwYXJzZSwKKyAgICAgICJwYXJzaW5nIHNlZWt0YWJsZTsgYmFzZSBvZmZzZXQgJSIgR19HSU5UNjRfRk9STUFULCBib2Zmc2V0KTsKKworICBpZiAoYm9mZnNldCA8PSAwKQorICAgIGdvdG8gZXhpdDsKKworICBnc3RfYnVmZmVyX21hcCAoZmxhY3BhcnNlLT5zZWVrdGFibGUsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGdzdF9ieXRlX3JlYWRlcl9pbml0ICgmYnIsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisKKyAgLyogc2tpcCBoZWFkZXIgKi8KKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJmJyLCA0KSkKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogc2Vla3BvaW50cyAqLworICB3aGlsZSAoZ3N0X2J5dGVfcmVhZGVyX2dldF9yZW1haW5pbmcgKCZicikpIHsKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfaW50NjRfYmUgKCZiciwgJnNhbXBsZXMpKQorICAgICAgYnJlYWs7CisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2ludDY0X2JlICgmYnIsICZvZmZzZXQpKQorICAgICAgYnJlYWs7CisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJmJyLCAyKSkKKyAgICAgIGJyZWFrOworCisgICAgR1NUX0xPR19PQkpFQ1QgKGZsYWNwYXJzZSwgInNhbXBsZXMgJSIgR19HSU5UNjRfRk9STUFUICIgLT4gb2Zmc2V0ICUiCisgICAgICAgIEdfR0lOVDY0X0ZPUk1BVCwgc2FtcGxlcywgb2Zmc2V0KTsKKworICAgIC8qIHNhbml0eSBjaGVjayAqLworICAgIGlmIChHX0xJS0VMWSAob2Zmc2V0ID4gMCAmJiBzYW1wbGVzID4gMCkpIHsKKyAgICAgIGdzdF9iYXNlX3BhcnNlX2FkZF9pbmRleF9lbnRyeSAoR1NUX0JBU0VfUEFSU0UgKGZsYWNwYXJzZSksCisgICAgICAgICAgYm9mZnNldCArIG9mZnNldCwgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzYW1wbGVzLCBHU1RfU0VDT05ELAorICAgICAgICAgICAgICBmbGFjcGFyc2UtPnNhbXBsZXJhdGUpLCBUUlVFLCBGQUxTRSk7CisgICAgfQorICB9CisKK2RvbmU6CisgIGdzdF9idWZmZXJfdW5tYXAgKGZsYWNwYXJzZS0+c2Vla3RhYmxlLCAmbWFwKTsKK2V4aXQ6CisgIGdzdF9idWZmZXJfdW5yZWYgKGZsYWNwYXJzZS0+c2Vla3RhYmxlKTsKKyAgZmxhY3BhcnNlLT5zZWVrdGFibGUgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorX3ZhbHVlX2FycmF5X2FwcGVuZF9idWZmZXIgKEdWYWx1ZSAqIGFycmF5X3ZhbCwgR3N0QnVmZmVyICogYnVmKQoreworICBHVmFsdWUgdmFsdWUgPSB7IDAsIH07CisKKyAgZ192YWx1ZV9pbml0ICgmdmFsdWUsIEdTVF9UWVBFX0JVRkZFUik7CisgIC8qIGNvcHkgYnVmZmVyIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggY2lyY3VsYXIgcmVmY291bnRzICovCisgIGJ1ZiA9IGdzdF9idWZmZXJfY29weSAoYnVmKTsKKyAgLyogYWdhaW4sIGZvciBnb29kIG1lYXN1cmUgKi8KKyAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSKTsKKyAgZ3N0X3ZhbHVlX3NldF9idWZmZXIgKCZ2YWx1ZSwgYnVmKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgZ3N0X3ZhbHVlX2FycmF5X2FwcGVuZF92YWx1ZSAoYXJyYXlfdmFsLCAmdmFsdWUpOworICBnX3ZhbHVlX3Vuc2V0ICgmdmFsdWUpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2ZsYWNfcGFyc2VfaGFuZGxlX2hlYWRlcnMgKEdzdEZsYWNQYXJzZSAqIGZsYWNwYXJzZSkKK3sKKyAgR3N0QnVmZmVyICp2b3JiaXNjb21tZW50ID0gTlVMTDsKKyAgR3N0QnVmZmVyICpzdHJlYW1pbmZvID0gTlVMTDsKKyAgR3N0QnVmZmVyICptYXJrZXIgPSBOVUxMOworICBHVmFsdWUgYXJyYXkgPSB7IDAsIH07CisgIEdzdENhcHMgKmNhcHM7CisgIEdMaXN0ICpsOworICBHc3RGbG93UmV0dXJuIHJlcyA9IEdTVF9GTE9XX09LOworCisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1mbGFjIiwKKyAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIGZsYWNwYXJzZS0+Y2hhbm5lbHMsCisgICAgICAiZnJhbWVkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsCisgICAgICAicmF0ZSIsIEdfVFlQRV9JTlQsIGZsYWNwYXJzZS0+c2FtcGxlcmF0ZSwgTlVMTCk7CisKKyAgaWYgKCFmbGFjcGFyc2UtPmhlYWRlcnMpCisgICAgZ290byBwdXNoX2hlYWRlcnM7CisKKyAgZm9yIChsID0gZmxhY3BhcnNlLT5oZWFkZXJzOyBsOyBsID0gbC0+bmV4dCkgeworICAgIEdzdEJ1ZmZlciAqaGVhZGVyID0gbC0+ZGF0YTsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgIGdzdF9idWZmZXJfbWFwIChoZWFkZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChoZWFkZXIsIEdTVF9CVUZGRVJfRkxBR19IRUFERVIpOworCisgICAgaWYgKG1hcC5zaXplID09IDQgJiYgbWVtY21wIChtYXAuZGF0YSwgImZMYUMiLCA0KSA9PSAwKSB7CisgICAgICBtYXJrZXIgPSBoZWFkZXI7CisgICAgfSBlbHNlIGlmIChtYXAuc2l6ZSA+IDEgJiYgKG1hcC5kYXRhWzBdICYgMHg3ZikgPT0gMCkgeworICAgICAgc3RyZWFtaW5mbyA9IGhlYWRlcjsKKyAgICB9IGVsc2UgaWYgKG1hcC5zaXplID4gMSAmJiAobWFwLmRhdGFbMF0gJiAweDdmKSA9PSA0KSB7CisgICAgICB2b3JiaXNjb21tZW50ID0gaGVhZGVyOworICAgIH0KKworICAgIGdzdF9idWZmZXJfdW5tYXAgKGhlYWRlciwgJm1hcCk7CisgIH0KKworICAvKiBhdCBsZWFzdCB0aGlzIG9uZSB3ZSBjYW4gZ2VuZXJhdGUgZWFzaWx5CisgICAqIHRvIHByb3ZpZGUgZnVsbCBoZWFkZXJzIGRvd25zdHJlYW0gKi8KKyAgaWYgKHZvcmJpc2NvbW1lbnQgPT0gTlVMTCAmJiBzdHJlYW1pbmZvICE9IE5VTEwpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjcGFyc2UsCisgICAgICAgICJtaXNzaW5nIHZvcmJpc2NvbW1lbnQgaGVhZGVyOyBnZW5lcmF0aW5nIGR1bW15Iik7CisgICAgdm9yYmlzY29tbWVudCA9IGdzdF9mbGFjX3BhcnNlX2dlbmVyYXRlX3ZvcmJpc2NvbW1lbnQgKGZsYWNwYXJzZSk7CisgICAgZmxhY3BhcnNlLT5oZWFkZXJzID0gZ19saXN0X2luc2VydCAoZmxhY3BhcnNlLT5oZWFkZXJzLCB2b3JiaXNjb21tZW50LAorICAgICAgICBnX2xpc3RfaW5kZXggKGZsYWNwYXJzZS0+aGVhZGVycywgc3RyZWFtaW5mbykgKyAxKTsKKyAgfQorCisgIGlmIChtYXJrZXIgPT0gTlVMTCB8fCBzdHJlYW1pbmZvID09IE5VTEwgfHwgdm9yYmlzY29tbWVudCA9PSBOVUxMKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChmbGFjcGFyc2UsCisgICAgICAgICJtaXNzaW5nIGhlYWRlciAlcCAlcCAlcCwgbXV4aW5nIGludG8gY29udGFpbmVyICIKKyAgICAgICAgImZvcm1hdHMgbWF5IGJlIGJyb2tlbiIsIG1hcmtlciwgc3RyZWFtaW5mbywgdm9yYmlzY29tbWVudCk7CisgICAgZ290byBwdXNoX2hlYWRlcnM7CisgIH0KKworICBnX3ZhbHVlX2luaXQgKCZhcnJheSwgR1NUX1RZUEVfQVJSQVkpOworCisgIC8qIGFkZCBtYXJrZXIgaW5jbHVkaW5nIFNUUkVBTUlORk8gaGVhZGVyICovCisgIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZjsKKyAgICBndWludDE2IG51bTsKKyAgICBHc3RNYXBJbmZvIHNpbmZvbWFwLCB3cml0ZW1hcDsKKworICAgIGdzdF9idWZmZXJfbWFwIChzdHJlYW1pbmZvLCAmc2luZm9tYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgICAvKiBtaW51cyBvbmUgZm9yIHRoZSBtYXJrZXIgdGhhdCBpcyBtZXJnZWQgd2l0aCBzdHJlYW1pbmZvIGhlcmUgKi8KKyAgICBudW0gPSBnX2xpc3RfbGVuZ3RoIChmbGFjcGFyc2UtPmhlYWRlcnMpIC0gMTsKKworICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTMgKyBzaW5mb21hcC5zaXplKTsKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmd3JpdGVtYXAsIEdTVF9NQVBfV1JJVEUpOworCisgICAgd3JpdGVtYXAuZGF0YVswXSA9IDB4N2Y7CisgICAgbWVtY3B5ICh3cml0ZW1hcC5kYXRhICsgMSwgIkZMQUMiLCA0KTsKKyAgICB3cml0ZW1hcC5kYXRhWzVdID0gMHgwMTsgICAgLyogbWFwcGluZyB2ZXJzaW9uIG1ham9yICovCisgICAgd3JpdGVtYXAuZGF0YVs2XSA9IDB4MDA7ICAgIC8qIG1hcHBpbmcgdmVyc2lvbiBtaW5vciAqLworICAgIHdyaXRlbWFwLmRhdGFbN10gPSAobnVtICYgMHhGRjAwKSA+PiA4OworICAgIHdyaXRlbWFwLmRhdGFbOF0gPSAobnVtICYgMHgwMEZGKSA+PiAwOworICAgIG1lbWNweSAod3JpdGVtYXAuZGF0YSArIDksICJmTGFDIiwgNCk7CisgICAgbWVtY3B5ICh3cml0ZW1hcC5kYXRhICsgMTMsIHNpbmZvbWFwLmRhdGEsIHNpbmZvbWFwLnNpemUpOworICAgIF92YWx1ZV9hcnJheV9hcHBlbmRfYnVmZmVyICgmYXJyYXksIGJ1Zik7CisKKyAgICBnc3RfYnVmZmVyX3VubWFwIChzdHJlYW1pbmZvLCAmc2luZm9tYXApOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJndyaXRlbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICB9CisKKyAgLyogYWRkIFZPUkJJU0NPTU1FTlQgaGVhZGVyICovCisgIF92YWx1ZV9hcnJheV9hcHBlbmRfYnVmZmVyICgmYXJyYXksIHZvcmJpc2NvbW1lbnQpOworCisgIC8qIGFkZCBvdGhlciBoZWFkZXJzLCBpZiB0aGVyZSBhcmUgYW55ICovCisgIGZvciAobCA9IGZsYWNwYXJzZS0+aGVhZGVyczsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICBpZiAoR1NUX0JVRkZFUl9DQVNUIChsLT5kYXRhKSAhPSBtYXJrZXIgJiYKKyAgICAgICAgR1NUX0JVRkZFUl9DQVNUIChsLT5kYXRhKSAhPSBzdHJlYW1pbmZvICYmCisgICAgICAgIEdTVF9CVUZGRVJfQ0FTVCAobC0+ZGF0YSkgIT0gdm9yYmlzY29tbWVudCkgeworICAgICAgX3ZhbHVlX2FycmF5X2FwcGVuZF9idWZmZXIgKCZhcnJheSwgR1NUX0JVRkZFUl9DQVNUIChsLT5kYXRhKSk7CisgICAgfQorICB9CisKKyAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApLAorICAgICAgInN0cmVhbWhlYWRlciIsICZhcnJheSk7CisgIGdfdmFsdWVfdW5zZXQgKCZhcnJheSk7CisKK3B1c2hfaGVhZGVyczoKKworICBnc3RfcGFkX3NldF9jYXBzIChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChHU1RfQkFTRV9QQVJTRSAoZmxhY3BhcnNlKSksIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgLyogcHVzaCBoZWFkZXIgYnVmZmVyczsgdXBkYXRlIGNhcHMsIHNvIHdoZW4gd2UgcHVzaCB0aGUgZmlyc3QgYnVmZmVyIHRoZQorICAgKiBuZWdvdGlhdGVkIGNhcHMgd2lsbCBjaGFuZ2UgdG8gY2FwcyB0aGF0IGluY2x1ZGUgdGhlIHN0cmVhbWhlYWRlciBmaWVsZCAqLworICB3aGlsZSAoZmxhY3BhcnNlLT5oZWFkZXJzKSB7CisgICAgR3N0QnVmZmVyICpidWYgPSBHU1RfQlVGRkVSIChmbGFjcGFyc2UtPmhlYWRlcnMtPmRhdGEpOworICAgIEdzdEJhc2VQYXJzZUZyYW1lIGZyYW1lOworCisgICAgZmxhY3BhcnNlLT5oZWFkZXJzID0KKyAgICAgICAgZ19saXN0X2RlbGV0ZV9saW5rIChmbGFjcGFyc2UtPmhlYWRlcnMsIGZsYWNwYXJzZS0+aGVhZGVycyk7CisgICAgYnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChidWYpOworCisgICAgLyogaW5pdCwgc2V0IGFuZCBnaXZlIGF3YXkgZnJhbWUgKi8KKyAgICBnc3RfYmFzZV9wYXJzZV9mcmFtZV9pbml0ICgmZnJhbWUpOworICAgIGZyYW1lLmJ1ZmZlciA9IGJ1ZjsKKyAgICBmcmFtZS5vdmVyaGVhZCA9IC0xOworICAgIHJlcyA9IGdzdF9iYXNlX3BhcnNlX3B1c2hfZnJhbWUgKEdTVF9CQVNFX1BBUlNFIChmbGFjcGFyc2UpLCAmZnJhbWUpOworICAgIGdzdF9iYXNlX3BhcnNlX2ZyYW1lX2ZyZWUgKCZmcmFtZSk7CisgICAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworICB9CisgIGdfbGlzdF9mb3JlYWNoIChmbGFjcGFyc2UtPmhlYWRlcnMsIChHRnVuYykgZ3N0X21pbmlfb2JqZWN0X3VucmVmLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKGZsYWNwYXJzZS0+aGVhZGVycyk7CisgIGZsYWNwYXJzZS0+aGVhZGVycyA9IE5VTEw7CisKKyAgcmV0dXJuIHJlczsKK30KKworLyogZW1wdHkgdm9yYmlzY29tbWVudCAqLworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfZmxhY19wYXJzZV9nZW5lcmF0ZV92b3JiaXNjb21tZW50IChHc3RGbGFjUGFyc2UgKiBmbGFjcGFyc2UpCit7CisgIEdzdFRhZ0xpc3QgKnRhZ2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBndWNoYXIgaGVhZGVyWzRdOworICBndWludCBzaXplOworICBHc3RCdWZmZXIgKnZvcmJpc2NvbW1lbnQ7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGhlYWRlclswXSA9IDB4ODQ7ICAgICAgICAgICAgIC8qIGlzX2xhc3QgPSAxOyB0eXBlID0gNDsgKi8KKworICB2b3JiaXNjb21tZW50ID0KKyAgICAgIGdzdF90YWdfbGlzdF90b192b3JiaXNjb21tZW50X2J1ZmZlciAodGFnbGlzdCwgaGVhZGVyLAorICAgICAgc2l6ZW9mIChoZWFkZXIpLCBOVUxMKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdsaXN0KTsKKworICBnc3RfYnVmZmVyX21hcCAodm9yYmlzY29tbWVudCwgJm1hcCwgR1NUX01BUF9XUklURSk7CisKKyAgLyogR2V0IHJpZCBvZiBmcmFtaW5nIGJpdCAqLworICBpZiAobWFwLmRhdGFbbWFwLnNpemUgLSAxXSA9PSAxKSB7CisgICAgR3N0QnVmZmVyICpzdWI7CisKKyAgICBzdWIgPQorICAgICAgICBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uICh2b3JiaXNjb21tZW50LCBHU1RfQlVGRkVSX0NPUFlfQUxMLCAwLAorICAgICAgICBtYXAuc2l6ZSAtIDEpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKHZvcmJpc2NvbW1lbnQsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKHZvcmJpc2NvbW1lbnQpOworICAgIHZvcmJpc2NvbW1lbnQgPSBzdWI7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKHZvcmJpc2NvbW1lbnQsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICB9CisKKyAgc2l6ZSA9IG1hcC5zaXplIC0gNDsKKyAgbWFwLmRhdGFbMV0gPSAoKHNpemUgJiAweEZGMDAwMCkgPj4gMTYpOworICBtYXAuZGF0YVsyXSA9ICgoc2l6ZSAmIDB4MDBGRjAwKSA+PiA4KTsKKyAgbWFwLmRhdGFbM10gPSAoc2l6ZSAmIDB4MDAwMEZGKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAodm9yYmlzY29tbWVudCwgJm1hcCk7CisgIGdzdF9mbGFjX3BhcnNlX3Jlc2V0X2J1ZmZlcl90aW1lX2FuZF9vZmZzZXQgKHZvcmJpc2NvbW1lbnQpOworCisgIHJldHVybiB2b3JiaXNjb21tZW50OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbGFjX3BhcnNlX2dlbmVyYXRlX2hlYWRlcnMgKEdzdEZsYWNQYXJzZSAqIGZsYWNwYXJzZSkKK3sKKyAgR3N0QnVmZmVyICptYXJrZXIsICpzdHJlYW1pbmZvOworICBHc3RNYXBJbmZvIG1hcDsKKworICBtYXJrZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDQpOworICBnc3RfYnVmZmVyX21hcCAobWFya2VyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgbWVtY3B5IChtYXAuZGF0YSwgImZMYUMiLCA0KTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAobWFya2VyLCAmbWFwKTsKKyAgZ3N0X2ZsYWNfcGFyc2VfcmVzZXRfYnVmZmVyX3RpbWVfYW5kX29mZnNldCAobWFya2VyKTsKKyAgZmxhY3BhcnNlLT5oZWFkZXJzID0gZ19saXN0X2FwcGVuZCAoZmxhY3BhcnNlLT5oZWFkZXJzLCBtYXJrZXIpOworCisgIHN0cmVhbWluZm8gPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDQgKyAzNCk7CisgIGdzdF9idWZmZXJfbWFwIChzdHJlYW1pbmZvLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgbWVtc2V0IChtYXAuZGF0YSwgMCwgNCArIDM0KTsKKworICAvKiBtZXRhZGF0YSBibG9jayBoZWFkZXIgKi8KKyAgbWFwLmRhdGFbMF0gPSAweDAwOyAgICAgICAgICAgLyogaXNfbGFzdCA9IDA7IHR5cGUgPSAwOyAqLworICBtYXAuZGF0YVsxXSA9IDB4MDA7ICAgICAgICAgICAvKiBsZW5ndGggPSAzNDsgKi8KKyAgbWFwLmRhdGFbMl0gPSAweDAwOworICBtYXAuZGF0YVszXSA9IDB4MjI7CisKKyAgLyogc3RyZWFtaW5mbyAqLworCisgIG1hcC5kYXRhWzRdID0gKGZsYWNwYXJzZS0+YmxvY2tfc2l6ZSA+PiA4KSAmIDB4ZmY7ICAgIC8qIG1pbiBibG9ja3NpemUgPSBibG9ja3NpemU7ICovCisgIG1hcC5kYXRhWzVdID0gKGZsYWNwYXJzZS0+YmxvY2tfc2l6ZSkgJiAweGZmOworICBtYXAuZGF0YVs2XSA9IChmbGFjcGFyc2UtPmJsb2NrX3NpemUgPj4gOCkgJiAweGZmOyAgICAvKiBtYXggYmxvY2tzaXplID0gYmxvY2tzaXplOyAqLworICBtYXAuZGF0YVs3XSA9IChmbGFjcGFyc2UtPmJsb2NrX3NpemUpICYgMHhmZjsKKworICBtYXAuZGF0YVs4XSA9IDB4MDA7ICAgICAgICAgICAvKiBtaW4gZnJhbWVzaXplID0gMDsgKi8KKyAgbWFwLmRhdGFbOV0gPSAweDAwOworICBtYXAuZGF0YVsxMF0gPSAweDAwOworICBtYXAuZGF0YVsxMV0gPSAweDAwOyAgICAgICAgICAvKiBtYXggZnJhbWVzaXplID0gMDsgKi8KKyAgbWFwLmRhdGFbMTJdID0gMHgwMDsKKyAgbWFwLmRhdGFbMTNdID0gMHgwMDsKKworICBtYXAuZGF0YVsxNF0gPSAoZmxhY3BhcnNlLT5zYW1wbGVyYXRlID4+IDEyKSAmIDB4ZmY7CisgIG1hcC5kYXRhWzE1XSA9IChmbGFjcGFyc2UtPnNhbXBsZXJhdGUgPj4gNCkgJiAweGZmOworICBtYXAuZGF0YVsxNl0gPSAoZmxhY3BhcnNlLT5zYW1wbGVyYXRlID4+IDApICYgMHhmMDsKKworICBtYXAuZGF0YVsxNl0gfD0gKGZsYWNwYXJzZS0+Y2hhbm5lbHMgLSAxKSA8PCAxOworCisgIG1hcC5kYXRhWzE2XSB8PSAoKGZsYWNwYXJzZS0+YnBzIC0gMSkgPj4gNCkgJiAweDAxOworICBtYXAuZGF0YVsxN10gPSAoKChmbGFjcGFyc2UtPmJwcyAtIDEpKSAmIDB4MGYpIDw8IDQ7CisKKyAgeworICAgIGdpbnQ2NCBkdXJhdGlvbjsKKworICAgIGlmIChnc3RfcGFkX3BlZXJfcXVlcnlfZHVyYXRpb24gKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChmbGFjcGFyc2UpLAorICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCAmZHVyYXRpb24pICYmIGR1cmF0aW9uICE9IC0xKSB7CisgICAgICBkdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX1RPX0ZSQU1FUyAoZHVyYXRpb24sIGZsYWNwYXJzZS0+c2FtcGxlcmF0ZSk7CisKKyAgICAgIG1hcC5kYXRhWzE3XSB8PSAoZHVyYXRpb24gPj4gMzIpICYgMHhmZjsKKyAgICAgIG1hcC5kYXRhWzE4XSB8PSAoZHVyYXRpb24gPj4gMjQpICYgMHhmZjsKKyAgICAgIG1hcC5kYXRhWzE5XSB8PSAoZHVyYXRpb24gPj4gMTYpICYgMHhmZjsKKyAgICAgIG1hcC5kYXRhWzIwXSB8PSAoZHVyYXRpb24gPj4gOCkgJiAweGZmOworICAgICAgbWFwLmRhdGFbMjFdIHw9IChkdXJhdGlvbiA+PiAwKSAmIDB4ZmY7CisgICAgfQorICB9CisgIC8qIE1ENSA9IDA7ICovCisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoc3RyZWFtaW5mbywgJm1hcCk7CisgIGdzdF9mbGFjX3BhcnNlX3Jlc2V0X2J1ZmZlcl90aW1lX2FuZF9vZmZzZXQgKHN0cmVhbWluZm8pOworICBmbGFjcGFyc2UtPmhlYWRlcnMgPSBnX2xpc3RfYXBwZW5kIChmbGFjcGFyc2UtPmhlYWRlcnMsIHN0cmVhbWluZm8pOworCisgIGZsYWNwYXJzZS0+aGVhZGVycyA9IGdfbGlzdF9hcHBlbmQgKGZsYWNwYXJzZS0+aGVhZGVycywKKyAgICAgIGdzdF9mbGFjX3BhcnNlX2dlbmVyYXRlX3ZvcmJpc2NvbW1lbnQgKGZsYWNwYXJzZSkpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2dzdF9mbGFjX3BhcnNlX3Jlc2V0X2J1ZmZlcl90aW1lX2FuZF9vZmZzZXQgKEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcikgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZmZlcikgPSAwOworICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKGJ1ZmZlcikgPSAwOworfQorCisvKiBUeXBlIDEyNyBpcyBpbnZhbGlkIGZvciBhIG1ldGFkYXRhIGJsb2NrIGhlYWRlciAmIHNob3VsZAorICogYmUgZGlzY2FyZGVkIF9iZWZvcmVfIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAqLworc3RhdGljIGdib29sZWFuCitnc3RfZmxhY19wYXJzZV9oYW5kbGVfYmxvY2tfdHlwZSAoR3N0RmxhY1BhcnNlICogZmxhY3BhcnNlLCBndWludCB0eXBlLAorICAgIEdzdEJ1ZmZlciAqIHNidWZmZXIpCit7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgLyogU1RSRUFNSU5GTyAqLworICAgICAgR1NUX0lORk9fT0JKRUNUIChmbGFjcGFyc2UsICJTVFJFQU1JTkZPIGhlYWRlciIpOworICAgICAgcmV0ID0gZ3N0X2ZsYWNfcGFyc2VfaGFuZGxlX3N0cmVhbWluZm8gKGZsYWNwYXJzZSwgc2J1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAvKiBTRUVLVEFCTEUgKi8KKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoZmxhY3BhcnNlLCAiU0VFS1RBQkxFIGhlYWRlciIpOworICAgICAgcmV0ID0gZ3N0X2ZsYWNfcGFyc2VfaGFuZGxlX3NlZWt0YWJsZSAoZmxhY3BhcnNlLCBzYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgIC8qIFZPUkJJU19DT01NRU5UICovCisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGZsYWNwYXJzZSwgIlZPUkJJU0NPTU1FTlQgaGVhZGVyIik7CisgICAgICByZXQgPSBnc3RfZmxhY19wYXJzZV9oYW5kbGVfdm9yYmlzY29tbWVudCAoZmxhY3BhcnNlLCBzYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNTogICAgICAgICAgICAgICAgICAgIC8qIENVRVNIRUVUICovCisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGZsYWNwYXJzZSwgIkNVRVNIRUVUIGhlYWRlciIpOworICAgICAgcmV0ID0gZ3N0X2ZsYWNfcGFyc2VfaGFuZGxlX2N1ZXNoZWV0IChmbGFjcGFyc2UsIHNidWZmZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OiAgICAgICAgICAgICAgICAgICAgLyogUElDVFVSRSAqLworICAgICAgR1NUX0lORk9fT0JKRUNUIChmbGFjcGFyc2UsICJQSUNUVVJFIGhlYWRlciIpOworICAgICAgcmV0ID0gZ3N0X2ZsYWNfcGFyc2VfaGFuZGxlX3BpY3R1cmUgKGZsYWNwYXJzZSwgc2J1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAvKiBQQURESU5HICovCisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGZsYWNwYXJzZSwgIlBBRERJTkcgaGVhZGVyIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAvKiBBUFBMSUNBVElPTiAqLworICAgICAgR1NUX0lORk9fT0JKRUNUIChmbGFjcGFyc2UsICJBUFBMSUNBVElPTiBoZWFkZXIiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgIC8qIFJFU0VSVkVEICovCisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGZsYWNwYXJzZSwgIlVuaGFuZGxlZCBtZXRhZGF0YSBoZWFkZXIgdHlwZSAnJXUnIiwgdHlwZSk7CisgICAgICBHU1RfRklYTUVfT0JKRUNUIChmbGFjcGFyc2UsICJGTEFDIHZlcnNpb24gbWlnaHQgbm90IGJlIGZ1bGx5IHN1cHBvcnRlZCIpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2ZsYWNfcGFyc2VfcGFyc2VfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLCBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lLAorICAgIGdpbnQgc2l6ZSkKK3sKKyAgR3N0RmxhY1BhcnNlICpmbGFjcGFyc2UgPSBHU1RfRkxBQ19QQVJTRSAocGFyc2UpOworICBHc3RCdWZmZXIgKmJ1ZmZlciA9IGZyYW1lLT5idWZmZXIsICpzYnVmZmVyOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR3N0Rmxvd1JldHVybiByZXMgPSBHU1RfRkxPV19FUlJPUjsKKyAgZ3VpbnQ2NCByZWxhdGl2ZV9zYW1wbGVfbnVtYmVyOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgaWYgKGZsYWNwYXJzZS0+c3RhdGUgPT0gR1NUX0ZMQUNfUEFSU0VfU1RBVEVfSU5JVCkgeworICAgIHNidWZmZXIgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIDAsIHNpemUpOworICAgIGdzdF9mbGFjX3BhcnNlX3Jlc2V0X2J1ZmZlcl90aW1lX2FuZF9vZmZzZXQgKHNidWZmZXIpOworCisgICAgLyogMzIgYml0cyBtZXRhZGF0YSBibG9jayAqLworICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGZsYWNwYXJzZSksIDQpOworICAgIGZsYWNwYXJzZS0+c3RhdGUgPSBHU1RfRkxBQ19QQVJTRV9TVEFURV9IRUFERVJTOworCisgICAgZmxhY3BhcnNlLT5oZWFkZXJzID0gZ19saXN0X2FwcGVuZCAoZmxhY3BhcnNlLT5oZWFkZXJzLCBzYnVmZmVyKTsKKworICAgIHJlcyA9IEdTVF9CQVNFX1BBUlNFX0ZMT1dfRFJPUFBFRDsKKyAgfSBlbHNlIGlmIChmbGFjcGFyc2UtPnN0YXRlID09IEdTVF9GTEFDX1BBUlNFX1NUQVRFX0hFQURFUlMpIHsKKyAgICBnYm9vbGVhbiBpc19sYXN0ID0gbWFwLmRhdGFbMF0gPj4gNzsKKyAgICBndWludCB0eXBlID0gKG1hcC5kYXRhWzBdICYgMHg3Rik7CisKKyAgICBpZiAodHlwZSA9PSAxMjcpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZmxhY3BhcnNlLCAiSW52YWxpZCBtZXRhZGF0YSBibG9jayB0eXBlIDEyNyIpOworICAgICAgcmVzID0gR1NUX0JBU0VfUEFSU0VfRkxPV19EUk9QUEVEOworICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZsYWNwYXJzZSwgIkhhbmRsaW5nIG1ldGFkYXRhIGJsb2NrIG9mIHR5cGUgJXUiLCB0eXBlKTsKKworICAgIHNidWZmZXIgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIDAsIHNpemUpOworCisgICAgaWYgKGdzdF9mbGFjX3BhcnNlX2hhbmRsZV9ibG9ja190eXBlIChmbGFjcGFyc2UsIHR5cGUsIHNidWZmZXIpKSB7CisgICAgICBnc3RfZmxhY19wYXJzZV9yZXNldF9idWZmZXJfdGltZV9hbmRfb2Zmc2V0IChzYnVmZmVyKTsKKyAgICAgIGZsYWNwYXJzZS0+aGVhZGVycyA9IGdfbGlzdF9hcHBlbmQgKGZsYWNwYXJzZS0+aGVhZGVycywgc2J1ZmZlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsICJmYWlsZWQgdG8gcGFyc2UgaGVhZGVyIG9mIHR5cGUgJXUiLCB0eXBlKTsKKyAgICAgIEdTVF9NRU1EVU1QX09CSkVDVCAocGFyc2UsICJiYWQgaGVhZGVyIGRhdGEiLCBtYXAuZGF0YSwgc2l6ZSk7CisKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHNidWZmZXIpOworCisgICAgICAvKiBlcnJvciBvdXQgdW5sZXNzIHdlIGhhdmUgYSBTVFJFQU1JTkZPIGhlYWRlciAqLworICAgICAgaWYgKGZsYWNwYXJzZS0+c2FtcGxlcmF0ZSA9PSAwIHx8IGZsYWNwYXJzZS0+YnBzID09IDApCisgICAgICAgIGdvdG8gaGVhZGVyX3BhcnNpbmdfZXJyb3I7CisKKyAgICAgIC8qIC4uIGluIHdoaWNoIGNhc2UganVzdCBzdG9wIGhlYWRlciBwYXJzaW5nIGFuZCB0cnkgdG8gZmluZCBhdWRpbyAqLworICAgICAgaXNfbGFzdCA9IFRSVUU7CisgICAgfQorCisgICAgaWYgKGlzX2xhc3QpIHsKKyAgICAgIHJlcyA9IGdzdF9mbGFjX3BhcnNlX2hhbmRsZV9oZWFkZXJzIChmbGFjcGFyc2UpOworCisgICAgICAvKiBNaW5pbWFsIHNpemUgb2YgYSBmcmFtZSBoZWFkZXIgKi8KKyAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGZsYWNwYXJzZSksIE1BWCAoOSwKKyAgICAgICAgICAgICAgZmxhY3BhcnNlLT5taW5fZnJhbWVzaXplKSk7CisgICAgICBmbGFjcGFyc2UtPnN0YXRlID0gR1NUX0ZMQUNfUEFSU0VfU1RBVEVfREFUQTsKKworICAgICAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0gZWxzZSB7CisgICAgICAvKiBIZWFkZXIgbGVuZ3RoICovCisgICAgICBnc3RfYmFzZV9wYXJzZV9zZXRfbWluX2ZyYW1lX3NpemUgKEdTVF9CQVNFX1BBUlNFIChmbGFjcGFyc2UpLCA0KTsKKyAgICB9CisKKyAgICAvKiBEUk9QUEVEIGJlY2F1c2Ugd2UgcHVzaGVkIGFscmVhZHkgb3Igd2lsbCBwdXNoIGFsbCBoZWFkZXJzIG1hbnVhbGx5ICovCisgICAgcmVzID0gR1NUX0JBU0VfUEFSU0VfRkxPV19EUk9QUEVEOworICB9IGVsc2UgeworICAgIGlmIChmbGFjcGFyc2UtPm9mZnNldCAhPSBHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKSkgeworICAgICAgRnJhbWVIZWFkZXJDaGVja1JldHVybiByZXQ7CisKKyAgICAgIGZsYWNwYXJzZS0+b2Zmc2V0ID0gR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZmZlcik7CisgICAgICByZXQgPQorICAgICAgICAgIGdzdF9mbGFjX3BhcnNlX2ZyYW1lX2hlYWRlcl9pc192YWxpZCAoZmxhY3BhcnNlLAorICAgICAgICAgIG1hcC5kYXRhLCBtYXAuc2l6ZSwgVFJVRSwgTlVMTCwgTlVMTCk7CisgICAgICBpZiAocmV0ICE9IEZSQU1FX0hFQURFUl9WQUxJRCkgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChmbGFjcGFyc2UsCisgICAgICAgICAgICAiQmFzZWNsYXNzIGRpZG4ndCBwcm92aWRlIGEgY29tcGxldGUgZnJhbWUiKTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgfQorICAgIH0KKworICAgIGlmIChmbGFjcGFyc2UtPmJsb2NrX3NpemUgPT0gMCkgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAoZmxhY3BhcnNlLCAiVW5wYXJzZWQgZnJhbWUiKTsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisKKyAgICBpZiAoZmxhY3BhcnNlLT5zZWVrdGFibGUpCisgICAgICBnc3RfZmxhY19wYXJzZV9wcm9jZXNzX3NlZWt0YWJsZSAoZmxhY3BhcnNlLCBHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKSk7CisKKyAgICBpZiAoZmxhY3BhcnNlLT5zdGF0ZSA9PSBHU1RfRkxBQ19QQVJTRV9TVEFURV9HRU5FUkFURV9IRUFERVJTKSB7CisgICAgICBpZiAoZmxhY3BhcnNlLT5ibG9ja2luZ19zdHJhdGVneSA9PSAxKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZmxhY3BhcnNlLAorICAgICAgICAgICAgIkdlbmVyYXRpbmcgaGVhZGVycyBmb3IgdmFyaWFibGUgYmxvY2tzaXplIHN0cmVhbXMgbm90IHN1cHBvcnRlZCIpOworCisgICAgICAgIHJlcyA9IGdzdF9mbGFjX3BhcnNlX2hhbmRsZV9oZWFkZXJzIChmbGFjcGFyc2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY3BhcnNlLCAiR2VuZXJhdGluZyBoZWFkZXJzIik7CisKKyAgICAgICAgaWYgKCFnc3RfZmxhY19wYXJzZV9nZW5lcmF0ZV9oZWFkZXJzIChmbGFjcGFyc2UpKQorICAgICAgICAgIGdvdG8gY2xlYW51cDsKKworICAgICAgICByZXMgPSBnc3RfZmxhY19wYXJzZV9oYW5kbGVfaGVhZGVycyAoZmxhY3BhcnNlKTsKKyAgICAgIH0KKyAgICAgIGZsYWNwYXJzZS0+c3RhdGUgPSBHU1RfRkxBQ19QQVJTRV9TVEFURV9EQVRBOworICAgICAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKworICAgIC8qIGFsc28gY2F0ZXIgZm9yIG9nZ211eCBtZXRhZGF0YSAqLworICAgIHJlbGF0aXZlX3NhbXBsZV9udW1iZXIgPQorICAgICAgICBmbGFjcGFyc2UtPnNhbXBsZV9udW1iZXIgLSBmbGFjcGFyc2UtPmZpcnN0X3NhbXBsZV9udW1iZXI7CisgICAgaWYgKGZsYWNwYXJzZS0+YmxvY2tpbmdfc3RyYXRlZ3kgPT0gMCkgeworICAgICAgR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcikgPQorICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAocmVsYXRpdmVfc2FtcGxlX251bWJlciwKKyAgICAgICAgICBmbGFjcGFyc2UtPmJsb2NrX3NpemUgKiBHU1RfU0VDT05ELCBmbGFjcGFyc2UtPnNhbXBsZXJhdGUpOworICAgICAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWZmZXIpID0KKyAgICAgICAgICByZWxhdGl2ZV9zYW1wbGVfbnVtYmVyICogZmxhY3BhcnNlLT5ibG9ja19zaXplICsKKyAgICAgICAgICBmbGFjcGFyc2UtPmJsb2NrX3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9CVUZGRVJfUFRTIChidWZmZXIpID0KKyAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHJlbGF0aXZlX3NhbXBsZV9udW1iZXIsIEdTVF9TRUNPTkQsCisgICAgICAgICAgZmxhY3BhcnNlLT5zYW1wbGVyYXRlKTsKKyAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmZmVyKSA9CisgICAgICAgICAgcmVsYXRpdmVfc2FtcGxlX251bWJlciArIGZsYWNwYXJzZS0+YmxvY2tfc2l6ZTsKKyAgICB9CisKKyAgICBHU1RfQlVGRkVSX0RUUyAoYnVmZmVyKSA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworICAgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpID0KKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChHU1RfQlVGRkVSX09GRlNFVF9FTkQgKGJ1ZmZlciksIEdTVF9TRUNPTkQsCisgICAgICAgIGZsYWNwYXJzZS0+c2FtcGxlcmF0ZSk7CisgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSA9CisgICAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpIC0gR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcik7CisKKyAgICAvKiBUbyBzaW1wbGlmeSwgd2UganVzdCBhc3N1bWUgdGhhdCBpdCdzIGEgZml4ZWQgc2l6ZSBoZWFkZXIgYW5kIGlnbm9yZQorICAgICAqIHN1YmZyYW1lIGhlYWRlcnMuIFRoZSBmaXJzdCBjb3VsZCBsZWFkIHVzIHRvIGJlIG9mZiBieSA4OCBiaXRzIGFuZAorICAgICAqIHRoZSBzZWNvbmQgZXZlbiBsZXNzLCBzbyB0aGUgdG90YWwgaW5hY2N1cmFjeSBpcyBuZWdsaWdpYmxlLiAqLworICAgIGZyYW1lLT5vdmVyaGVhZCA9IDc7CisKKyAgICAvKiBNaW5pbWFsIHNpemUgb2YgYSBmcmFtZSBoZWFkZXIgKi8KKyAgICBnc3RfYmFzZV9wYXJzZV9zZXRfbWluX2ZyYW1lX3NpemUgKEdTVF9CQVNFX1BBUlNFIChmbGFjcGFyc2UpLCBNQVggKDksCisgICAgICAgICAgICBmbGFjcGFyc2UtPm1pbl9mcmFtZXNpemUpKTsKKworICAgIGZsYWNwYXJzZS0+b2Zmc2V0ID0gLTE7CisgICAgZmxhY3BhcnNlLT5ibG9ja2luZ19zdHJhdGVneSA9IDA7CisgICAgZmxhY3BhcnNlLT5zYW1wbGVfbnVtYmVyID0gMDsKKyAgICByZXMgPSBHU1RfRkxPV19PSzsKKyAgfQorCitjbGVhbnVwOgorICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICByZXR1cm4gcmVzOworCitoZWFkZXJfcGFyc2luZ19lcnJvcjoKKyAgR1NUX0VMRU1FTlRfRVJST1IgKGZsYWNwYXJzZSwgU1RSRUFNLCBERUNPREUsIChOVUxMKSwKKyAgICAgICgiRmFpbGVkIHRvIHBhcnNlIGhlYWRlcnMiKSk7CisgIGdvdG8gY2xlYW51cDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbGFjX3BhcnNlX3ByZV9wdXNoX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0RmxhY1BhcnNlICpmbGFjcGFyc2UgPSBHU1RfRkxBQ19QQVJTRSAocGFyc2UpOworCisgIGlmICghZmxhY3BhcnNlLT5zZW50X2NvZGVjX3RhZykgeworICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICBpZiAoZmxhY3BhcnNlLT50YWdzID09IE5VTEwpCisgICAgICBmbGFjcGFyc2UtPnRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgICAgLyogY29kZWMgdGFnICovCisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpKTsKKyAgICBpZiAoR19VTkxJS0VMWSAoY2FwcyA9PSBOVUxMKSkgeworICAgICAgaWYgKEdTVF9QQURfSVNfRkxVU0hJTkcgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSkpIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgZmx1c2hpbmciKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICAgICAgfQorICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgbm90IG5lZ290aWF0ZWQhIik7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisgICAgfQorICAgIGdzdF9wYl91dGlsc19hZGRfY29kZWNfZGVzY3JpcHRpb25fdG9fdGFnX2xpc3QgKGZsYWNwYXJzZS0+dGFncywKKyAgICAgICAgR1NUX1RBR19BVURJT19DT0RFQywgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgLyogQW5ub3VuY2Ugb3VyIHBlbmRpbmcgdGFncyAqLworICAgIGdzdF9iYXNlX3BhcnNlX21lcmdlX3RhZ3MgKHBhcnNlLCBmbGFjcGFyc2UtPnRhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSk7CisKKyAgICAvKiBhbHNvIHNpZ25hbHMgdGhlIGVuZCBvZiBmaXJzdC1mcmFtZSBwcm9jZXNzaW5nICovCisgICAgZmxhY3BhcnNlLT5zZW50X2NvZGVjX3RhZyA9IFRSVUU7CisgIH0KKworICAvKiBQdXNoIHRvYyAqLworICBpZiAoZmxhY3BhcnNlLT50b2MpIHsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKGZsYWNwYXJzZSksCisgICAgICAgIGdzdF9ldmVudF9uZXdfdG9jIChmbGFjcGFyc2UtPnRvYywgRkFMU0UpKTsKKyAgfQorCisgIGZyYW1lLT5mbGFncyB8PSBHU1RfQkFTRV9QQVJTRV9GUkFNRV9GTEFHX0NMSVA7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbGFjX3BhcnNlX2NvbnZlcnQgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEZvcm1hdCBzcmNfZm9ybWF0LCBnaW50NjQgc3JjX3ZhbHVlLCBHc3RGb3JtYXQgZGVzdF9mb3JtYXQsCisgICAgZ2ludDY0ICogZGVzdF92YWx1ZSkKK3sKKyAgR3N0RmxhY1BhcnNlICpmbGFjcGFyc2UgPSBHU1RfRkxBQ19QQVJTRSAocGFyc2UpOworCisgIGlmIChmbGFjcGFyc2UtPnNhbXBsZXJhdGUgPiAwKSB7CisgICAgaWYgKHNyY19mb3JtYXQgPT0gR1NUX0ZPUk1BVF9ERUZBVUxUICYmIGRlc3RfZm9ybWF0ID09IEdTVF9GT1JNQVRfVElNRSkgeworICAgICAgaWYgKHNyY192YWx1ZSAhPSAtMSkKKyAgICAgICAgKmRlc3RfdmFsdWUgPQorICAgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzcmNfdmFsdWUsIEdTVF9TRUNPTkQsCisgICAgICAgICAgICBmbGFjcGFyc2UtPnNhbXBsZXJhdGUpOworICAgICAgZWxzZQorICAgICAgICAqZGVzdF92YWx1ZSA9IC0xOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfSBlbHNlIGlmIChzcmNfZm9ybWF0ID09IEdTVF9GT1JNQVRfVElNRSAmJgorICAgICAgICBkZXN0X2Zvcm1hdCA9PSBHU1RfRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgIGlmIChzcmNfdmFsdWUgIT0gLTEpCisgICAgICAgICpkZXN0X3ZhbHVlID0KKyAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoc3JjX3ZhbHVlLCBmbGFjcGFyc2UtPnNhbXBsZXJhdGUsCisgICAgICAgICAgICBHU1RfU0VDT05EKTsKKyAgICAgIGVsc2UKKyAgICAgICAgKmRlc3RfdmFsdWUgPSAtMTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorCisgIHJldHVybiBHU1RfQkFTRV9QQVJTRV9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y29udmVydCAocGFyc2UsIHNyY19mb3JtYXQsCisgICAgICBzcmNfdmFsdWUsIGRlc3RfZm9ybWF0LCBkZXN0X3ZhbHVlKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmxhY19wYXJzZV9zcmNfZXZlbnQgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RGbGFjUGFyc2UgKmZsYWNwYXJzZSA9IEdTVF9GTEFDX1BBUlNFIChwYXJzZSk7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1RPQ19TRUxFQ1Q6CisgICAgeworICAgICAgR3N0VG9jRW50cnkgKmVudHJ5ID0gTlVMTDsKKyAgICAgIEdzdEV2ZW50ICpzZWVrX2V2ZW50OworICAgICAgR3N0VG9jICp0b2MgPSBOVUxMOworICAgICAgZ2ludDY0IHN0YXJ0X3BvczsKKyAgICAgIGdjaGFyICp1aWQgPSBOVUxMOworCisgICAgICAvKiBGSVhNRTogc29tZSBsb2NraW5nIHdvdWxkIGJlIGdvb2QgKi8KKyAgICAgIGlmIChmbGFjcGFyc2UtPnRvYykKKyAgICAgICAgdG9jID0gZ3N0X3RvY19yZWYgKGZsYWNwYXJzZS0+dG9jKTsKKworICAgICAgaWYgKHRvYyAhPSBOVUxMKSB7CisgICAgICAgIGdzdF9ldmVudF9wYXJzZV90b2Nfc2VsZWN0IChldmVudCwgJnVpZCk7CisgICAgICAgIGlmICh1aWQgIT0gTlVMTCkgeworICAgICAgICAgIGVudHJ5ID0gZ3N0X3RvY19maW5kX2VudHJ5ICh0b2MsIHVpZCk7CisgICAgICAgICAgaWYgKGVudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGdzdF90b2NfZW50cnlfZ2V0X3N0YXJ0X3N0b3BfdGltZXMgKGVudHJ5LCAmc3RhcnRfcG9zLCBOVUxMKTsKKworICAgICAgICAgICAgLyogRklYTUU6IHVzZSBzZWdtZW50IHJhdGUgaGVyZSBpbnN0ZWFkPyAqLworICAgICAgICAgICAgc2Vla19ldmVudCA9IGdzdF9ldmVudF9uZXdfc2VlayAoMS4wLAorICAgICAgICAgICAgICAgIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgICAgICAgICBHU1RfU0VFS19GTEFHX0ZMVVNILAorICAgICAgICAgICAgICAgIEdTVF9TRUVLX1RZUEVfU0VULCBzdGFydF9wb3MsIEdTVF9TRUVLX1RZUEVfTk9ORSwgLTEpOworCisgICAgICAgICAgICByZXMgPQorICAgICAgICAgICAgICAgIEdTVF9CQVNFX1BBUlNFX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zcmNfZXZlbnQgKHBhcnNlLAorICAgICAgICAgICAgICAgIHNlZWtfZXZlbnQpOworCisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsICJubyBUT0MgZW50cnkgd2l0aCBnaXZlbiBVSUQ6ICVzIiwgdWlkKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ19mcmVlICh1aWQpOworICAgICAgICB9CisgICAgICAgIGdzdF90b2NfdW5yZWYgKHRvYyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjcGFyc2UsICJubyBUT0MgdG8gc2VsZWN0Iik7CisgICAgICB9CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gR1NUX0JBU0VfUEFSU0VfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNyY19ldmVudCAocGFyc2UsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfZmllbGRzIChHc3RDYXBzICogY2FwcykKK3sKKyAgZ3VpbnQgaSwgbjsKKworICBuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpOworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgR3N0U3RydWN0dXJlICpzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSk7CisKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAocywgImZyYW1lZCIpOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9mbGFjX3BhcnNlX2dldF9zaW5rX2NhcHMgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RDYXBzICpwZWVyY2FwcywgKnRlbXBsOworICBHc3RDYXBzICpyZXM7CisKKyAgdGVtcGwgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU0lOS19QQUQgKHBhcnNlKSk7CisgIGlmIChmaWx0ZXIpIHsKKyAgICBHc3RDYXBzICpmY29weSA9IGdzdF9jYXBzX2NvcHkgKGZpbHRlcik7CisgICAgLyogUmVtb3ZlIHRoZSBmaWVsZHMgd2UgY29udmVydCAqLworICAgIHJlbW92ZV9maWVsZHMgKGZjb3B5KTsKKyAgICBwZWVyY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChwYXJzZSksIGZjb3B5KTsKKyAgICBnc3RfY2Fwc191bnJlZiAoZmNvcHkpOworICB9IGVsc2UKKyAgICBwZWVyY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChwYXJzZSksIE5VTEwpOworCisgIGlmIChwZWVyY2FwcykgeworICAgIC8qIFJlbW92ZSB0aGUgZnJhbWVkIGZpZWxkICovCisgICAgcGVlcmNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChwZWVyY2Fwcyk7CisgICAgcmVtb3ZlX2ZpZWxkcyAocGVlcmNhcHMpOworCisgICAgcmVzID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKHBlZXJjYXBzLCB0ZW1wbCwgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcmNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmICh0ZW1wbCk7CisgIH0gZWxzZSB7CisgICAgcmVzID0gdGVtcGw7CisgIH0KKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uOworCisgICAgaW50ZXJzZWN0aW9uID0KKyAgICAgICAgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgcmVzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmIChyZXMpOworICAgIHJlcyA9IGludGVyc2VjdGlvbjsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9nc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5oIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTQxOGRmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuaApAQCAtMCwwICsxLDk5IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+LgorICogQ29weXJpZ2h0IChDKSAyMDA5IE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBDb250YWN0OiBTdGVmYW4gS29zdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfRkxBQ19QQVJTRV9IX18KKyNkZWZpbmUgX19HU1RfRkxBQ19QQVJTRV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNlcGFyc2UuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0ZMQUNfUEFSU0UJCSAgIChnc3RfZmxhY19wYXJzZV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfRkxBQ19QQVJTRShvYmopCQkgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfRkxBQ19QQVJTRSxHc3RGbGFjUGFyc2UpKQorI2RlZmluZSBHU1RfRkxBQ19QQVJTRV9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfRkxBQ19QQVJTRSxHc3RGbGFjUGFyc2VDbGFzcykpCisjZGVmaW5lIEdTVF9GTEFDX1BBUlNFX0dFVF9DTEFTUyhvYmopICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUygob2JqKSxHU1RfVFlQRV9GTEFDX1BBUlNFLEdzdEZsYWNQYXJzZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0ZMQUNfUEFSU0Uob2JqKQkgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfRkxBQ19QQVJTRSkpCisjZGVmaW5lIEdTVF9JU19GTEFDX1BBUlNFX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9GTEFDX1BBUlNFKSkKKyNkZWZpbmUgR1NUX0ZMQUNfUEFSU0VfQ0FTVChvYmopCSgoR3N0RmxhY1BhcnNlICopKG9iaikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RGbGFjUGFyc2UgR3N0RmxhY1BhcnNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEZsYWNQYXJzZUNsYXNzIEdzdEZsYWNQYXJzZUNsYXNzOworCit0eXBlZGVmIGVudW0geworICBHU1RfRkxBQ19QQVJTRV9TVEFURV9JTklULAorICBHU1RfRkxBQ19QQVJTRV9TVEFURV9IRUFERVJTLAorICBHU1RfRkxBQ19QQVJTRV9TVEFURV9HRU5FUkFURV9IRUFERVJTLAorICBHU1RfRkxBQ19QQVJTRV9TVEFURV9EQVRBCit9IEdzdEZsYWNQYXJzZVN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGd1aW50OCB0eXBlOworfSBHc3RGbGFjUGFyc2VTdWJGcmFtZTsKKworc3RydWN0IF9Hc3RGbGFjUGFyc2UgeworICBHc3RCYXNlUGFyc2UgcGFyZW50OworCisgIC8qIFByb3BlcnRpZXMgKi8KKyAgZ2Jvb2xlYW4gY2hlY2tfZnJhbWVfY2hlY2tzdW1zOworCisgIEdzdEZsYWNQYXJzZVN0YXRlIHN0YXRlOworCisgIGdpbnQ2NCB1cHN0cmVhbV9sZW5ndGg7CisKKyAgLyogU1RSRUFNSU5GTyBjb250ZW50ICovCisgIGd1aW50MTYgbWluX2Jsb2Nrc2l6ZSwgbWF4X2Jsb2Nrc2l6ZTsKKyAgZ3VpbnQzMiBtaW5fZnJhbWVzaXplLCBtYXhfZnJhbWVzaXplOworICBndWludDMyIHNhbXBsZXJhdGU7CisgIGd1aW50OCBjaGFubmVsczsKKyAgZ3VpbnQ4IGJwczsKKyAgZ3VpbnQ2NCB0b3RhbF9zYW1wbGVzOworCisgIC8qIEN1cnJlbnQgZnJhbWUgKi8KKyAgZ3VpbnQ2NCBvZmZzZXQ7CisgIGd1aW50OCBibG9ja2luZ19zdHJhdGVneTsKKyAgZ3VpbnQxNiBibG9ja19zaXplOworICBndWludDY0IHNhbXBsZV9udW1iZXI7CisgIGd1aW50NjQgZmlyc3Rfc2FtcGxlX251bWJlcjsKKyAgZ2Jvb2xlYW4gc3RyYXRlZ3lfY2hlY2tlZDsKKworICBnYm9vbGVhbiBzZW50X2NvZGVjX3RhZzsKKworICBHc3RUYWdMaXN0ICp0YWdzOworICBHc3RUb2MgKnRvYzsKKworICBHTGlzdCAqaGVhZGVyczsKKyAgR3N0QnVmZmVyICpzZWVrdGFibGU7CisKKyAgZ2Jvb2xlYW4gZm9yY2VfdmFyaWFibGVfYmxvY2tfc2l6ZTsKK307CisKK3N0cnVjdCBfR3N0RmxhY1BhcnNlQ2xhc3MgeworICBHc3RCYXNlUGFyc2VDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfZmxhY19wYXJzZV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9GTEFDX1BBUlNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYWQ4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmMKQEAgLTAsMCArMSwxNDU1IEBACisvKiBHU3RyZWFtZXIgTVBFRyBhdWRpbyBwYXJzZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3IHVzZXJzIHNmIG5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgQ29udGFjdDogU3RlZmFuIEtvc3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtbXBlZ2F1ZGlvcGFyc2UKKyAqIEBzaG9ydF9kZXNjcmlwdGlvbjogTVBFRyBhdWRpbyBwYXJzZXIKKyAqIEBzZWVfYWxzbzogI0dzdEFtclBhcnNlLCAjR3N0QUFDUGFyc2UKKyAqCisgKiBQYXJzZXMgYW5kIGZyYW1lcyBtcGVnMSBhdWRpbyBzdHJlYW1zLiBQcm92aWRlcyBzZWVraW5nLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPXRlc3QubXAzICEgbXBlZ2F1ZGlvcGFyc2UgISBtcGcxMjNhdWRpb2RlYworICogICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIGF1dG9hdWRpb3NpbmsKKyAqIF18CisgKiA8L3JlZnNlY3QyPgorICovCisKKy8qIEZJWE1FOiB3ZSBzaG91bGQgbWFrZSB0aGUgYmFzZSBjbGFzcyAoR3N0QmFzZVBhcnNlKSBhd2FyZSBvZiB0aGUKKyAqIFhJTkcgc2VlayB0YWJsZSBzb21laG93LCBzbyBpdCBjYW4gdXNlIGl0IHByb3Blcmx5IGZvciB0aGluZ3MgbGlrZQorICogYWNjdXJhdGUgc2Vla3MuIEN1cnJlbnRseSBpdCBjYW4gb25seSBkbyBhIGxvb2t1cCB2aWEgdGhlIGNvbnZlcnQgZnVuY3Rpb24sCisgKiBidXQgdGhlbiBkb2Vzbid0IGtub3cgd2hhdCB0aGUgcmVzdWx0IHJlcHJlc2VudHMgZXhhY3RseS4gT25lIGNvdWxkIGVpdGhlcgorICogYWRkIGEgdmZ1bmMgZm9yIGluZGV4IGxvb2t1cCwgb3IganVzdCBtYWtlIG1wZWdhdWRpb3BhcnNlIHBvcHVsYXRlIHRoZQorICogYmFzZSBjbGFzcydzIGluZGV4IHZpYSB0aGUgQVBJIHByb3ZpZGVkLgorICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdG1wZWdhdWRpb3BhcnNlLmgiCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXJlYWRlci5oPgorI2luY2x1ZGUgPGdzdC9wYnV0aWxzL3BidXRpbHMuaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAobXBlZ19hdWRpb19wYXJzZV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBtcGVnX2F1ZGlvX3BhcnNlX2RlYnVnCisKKyNkZWZpbmUgTVBFR19BVURJT19DSEFOTkVMX01PREVfVU5LTk9XTiAtMQorI2RlZmluZSBNUEVHX0FVRElPX0NIQU5ORUxfTU9ERV9TVEVSRU8gMAorI2RlZmluZSBNUEVHX0FVRElPX0NIQU5ORUxfTU9ERV9KT0lOVF9TVEVSRU8gMQorI2RlZmluZSBNUEVHX0FVRElPX0NIQU5ORUxfTU9ERV9EVUFMX0NIQU5ORUwgMgorI2RlZmluZSBNUEVHX0FVRElPX0NIQU5ORUxfTU9ERV9NT05PIDMKKworI2RlZmluZSBDUkNfVU5LTk9XTiAtMQorI2RlZmluZSBDUkNfUFJPVEVDVEVEIDAKKyNkZWZpbmUgQ1JDX05PVF9QUk9URUNURUQgMQorCisjZGVmaW5lIFhJTkdfRlJBTUVTX0ZMQUcgICAgIDB4MDAwMQorI2RlZmluZSBYSU5HX0JZVEVTX0ZMQUcgICAgICAweDAwMDIKKyNkZWZpbmUgWElOR19UT0NfRkxBRyAgICAgICAgMHgwMDA0CisjZGVmaW5lIFhJTkdfVkJSX1NDQUxFX0ZMQUcgIDB4MDAwOAorCisjZGVmaW5lIE1JTl9GUkFNRV9TSVpFICAgICAgIDYKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby9tcGVnLCAiCisgICAgICAgICJtcGVndmVyc2lvbiA9IChpbnQpIDEsICIKKyAgICAgICAgImxheWVyID0gKGludCkgWyAxLCAzIF0sICIKKyAgICAgICAgIm1wZWdhdWRpb3ZlcnNpb24gPSAoaW50KSBbIDEsIDNdLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyA4MDAwLCA0ODAwMCBdLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdLCAiICJwYXJzZWQ9KGJvb2xlYW4pIHRydWUiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb24gPSAoaW50KSAxIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfbXBlZ19hdWRpb19wYXJzZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbXBlZ19hdWRpb19wYXJzZV9zdGFydCAoR3N0QmFzZVBhcnNlICogcGFyc2UpOworc3RhdGljIGdib29sZWFuIGdzdF9tcGVnX2F1ZGlvX3BhcnNlX3N0b3AgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9tcGVnX2F1ZGlvX3BhcnNlX2hhbmRsZV9mcmFtZSAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSwgZ2ludCAqIHNraXBzaXplKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9tcGVnX2F1ZGlvX3BhcnNlX3ByZV9wdXNoX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbXBlZ19hdWRpb19wYXJzZV9jb252ZXJ0IChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RGb3JtYXQgc3JjX2Zvcm1hdCwgZ2ludDY0IHNyY192YWx1ZSwKKyAgICBHc3RGb3JtYXQgZGVzdF9mb3JtYXQsIGdpbnQ2NCAqIGRlc3RfdmFsdWUpOworc3RhdGljIEdzdENhcHMgKmdzdF9tcGVnX2F1ZGlvX3BhcnNlX2dldF9zaW5rX2NhcHMgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpOworCitzdGF0aWMgdm9pZCBnc3RfbXBlZ19hdWRpb19wYXJzZV9oYW5kbGVfZmlyc3RfZnJhbWUgKEdzdE1wZWdBdWRpb1BhcnNlICoKKyAgICBtcDNwYXJzZSwgR3N0QnVmZmVyICogYnVmKTsKKworI2RlZmluZSBnc3RfbXBlZ19hdWRpb19wYXJzZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RNcGVnQXVkaW9QYXJzZSwgZ3N0X21wZWdfYXVkaW9fcGFyc2UsIEdTVF9UWVBFX0JBU0VfUEFSU0UpOworCisjZGVmaW5lIEdTVF9UWVBFX01QRUdfQVVESU9fQ0hBTk5FTF9NT0RFICBcCisgICAgKGdzdF9tcGVnX2F1ZGlvX2NoYW5uZWxfbW9kZV9nZXRfdHlwZSgpKQorCitzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSBtcGVnX2F1ZGlvX2NoYW5uZWxfbW9kZVtdID0geworICB7TVBFR19BVURJT19DSEFOTkVMX01PREVfVU5LTk9XTiwgIlVua25vd24iLCAidW5rbm93biJ9LAorICB7TVBFR19BVURJT19DSEFOTkVMX01PREVfTU9OTywgIk1vbm8iLCAibW9ubyJ9LAorICB7TVBFR19BVURJT19DSEFOTkVMX01PREVfRFVBTF9DSEFOTkVMLCAiRHVhbCBDaGFubmVsIiwgImR1YWwtY2hhbm5lbCJ9LAorICB7TVBFR19BVURJT19DSEFOTkVMX01PREVfSk9JTlRfU1RFUkVPLCAiSm9pbnQgU3RlcmVvIiwgImpvaW50LXN0ZXJlbyJ9LAorICB7TVBFR19BVURJT19DSEFOTkVMX01PREVfU1RFUkVPLCAiU3RlcmVvIiwgInN0ZXJlbyJ9LAorICB7MCwgTlVMTCwgTlVMTH0sCit9OworCitzdGF0aWMgR1R5cGUKK2dzdF9tcGVnX2F1ZGlvX2NoYW5uZWxfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIG1wZWdfYXVkaW9fY2hhbm5lbF9tb2RlX3R5cGUgPSAwOworCisgIGlmICghbXBlZ19hdWRpb19jaGFubmVsX21vZGVfdHlwZSkgeworICAgIG1wZWdfYXVkaW9fY2hhbm5lbF9tb2RlX3R5cGUgPQorICAgICAgICBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0TXBlZ0F1ZGlvQ2hhbm5lbE1vZGUiLAorICAgICAgICBtcGVnX2F1ZGlvX2NoYW5uZWxfbW9kZSk7CisgIH0KKyAgcmV0dXJuIG1wZWdfYXVkaW9fY2hhbm5lbF9tb2RlX3R5cGU7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqCitnc3RfbXBlZ19hdWRpb19jaGFubmVsX21vZGVfZ2V0X25pY2sgKGdpbnQgbW9kZSkKK3sKKyAgZ3VpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IEdfTl9FTEVNRU5UUyAobXBlZ19hdWRpb19jaGFubmVsX21vZGUpOyBpKyspIHsKKyAgICBpZiAobXBlZ19hdWRpb19jaGFubmVsX21vZGVbaV0udmFsdWUgPT0gbW9kZSkKKyAgICAgIHJldHVybiBtcGVnX2F1ZGlvX2NoYW5uZWxfbW9kZVtpXS52YWx1ZV9uaWNrOworICB9CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X21wZWdfYXVkaW9fcGFyc2VfY2xhc3NfaW5pdCAoR3N0TXBlZ0F1ZGlvUGFyc2VDbGFzcyAqIGtsYXNzKQoreworICBHc3RCYXNlUGFyc2VDbGFzcyAqcGFyc2VfY2xhc3MgPSBHU1RfQkFTRV9QQVJTRV9DTEFTUyAoa2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKG1wZWdfYXVkaW9fcGFyc2VfZGVidWcsICJtcGVnYXVkaW9wYXJzZSIsIDAsCisgICAgICAiTVBFRzEgYXVkaW8gc3RyZWFtIHBhcnNlciIpOworCisgIG9iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfbXBlZ19hdWRpb19wYXJzZV9maW5hbGl6ZTsKKworICBwYXJzZV9jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21wZWdfYXVkaW9fcGFyc2Vfc3RhcnQpOworICBwYXJzZV9jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbXBlZ19hdWRpb19wYXJzZV9zdG9wKTsKKyAgcGFyc2VfY2xhc3MtPmhhbmRsZV9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21wZWdfYXVkaW9fcGFyc2VfaGFuZGxlX2ZyYW1lKTsKKyAgcGFyc2VfY2xhc3MtPnByZV9wdXNoX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbXBlZ19hdWRpb19wYXJzZV9wcmVfcHVzaF9mcmFtZSk7CisgIHBhcnNlX2NsYXNzLT5jb252ZXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tcGVnX2F1ZGlvX3BhcnNlX2NvbnZlcnQpOworICBwYXJzZV9jbGFzcy0+Z2V0X3NpbmtfY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21wZWdfYXVkaW9fcGFyc2VfZ2V0X3NpbmtfY2Fwcyk7CisKKyAgLyogcmVnaXN0ZXIgdGFncyAqLworI2RlZmluZSBHU1RfVEFHX0NSQyAgICAgICJoYXMtY3JjIgorI2RlZmluZSBHU1RfVEFHX01PREUgICAgICJjaGFubmVsLW1vZGUiCisKKyAgZ3N0X3RhZ19yZWdpc3RlciAoR1NUX1RBR19DUkMsIEdTVF9UQUdfRkxBR19NRVRBLCBHX1RZUEVfQk9PTEVBTiwKKyAgICAgICJoYXMgY3JjIiwgIlVzaW5nIENSQyIsIE5VTEwpOworICBnc3RfdGFnX3JlZ2lzdGVyIChHU1RfVEFHX01PREUsIEdTVF9UQUdfRkxBR19FTkNPREVELCBHX1RZUEVfU1RSSU5HLAorICAgICAgImNoYW5uZWwgbW9kZSIsICJNUEVHIGF1ZGlvIGNoYW5uZWwgbW9kZSIsIE5VTEwpOworCisgIGdfdHlwZV9jbGFzc19yZWYgKEdTVF9UWVBFX01QRUdfQVVESU9fQ0hBTk5FTF9NT0RFKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgIk1QRUcxIEF1ZGlvIFBhcnNlciIsCisgICAgICAiQ29kZWMvUGFyc2VyL0F1ZGlvIiwKKyAgICAgICJQYXJzZXMgYW5kIGZyYW1lcyBtcGVnMSBhdWRpbyBzdHJlYW1zIChsZXZlbHMgMS0zKSwgcHJvdmlkZXMgc2VlayIsCisgICAgICAiSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+LCIKKyAgICAgICJNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tcGVnX2F1ZGlvX3BhcnNlX3Jlc2V0IChHc3RNcGVnQXVkaW9QYXJzZSAqIG1wM3BhcnNlKQoreworICBtcDNwYXJzZS0+Y2hhbm5lbHMgPSAtMTsKKyAgbXAzcGFyc2UtPnJhdGUgPSAtMTsKKyAgbXAzcGFyc2UtPnNlbnRfY29kZWNfdGFnID0gRkFMU0U7CisgIG1wM3BhcnNlLT5sYXN0X3Bvc3RlZF9jcmMgPSBDUkNfVU5LTk9XTjsKKyAgbXAzcGFyc2UtPmxhc3RfcG9zdGVkX2NoYW5uZWxfbW9kZSA9IE1QRUdfQVVESU9fQ0hBTk5FTF9NT0RFX1VOS05PV047CisgIG1wM3BhcnNlLT5mcmVlcmF0ZSA9IDA7CisKKyAgbXAzcGFyc2UtPmhkcl9iaXRyYXRlID0gMDsKKworICBtcDNwYXJzZS0+eGluZ19mbGFncyA9IDA7CisgIG1wM3BhcnNlLT54aW5nX2JpdHJhdGUgPSAwOworICBtcDNwYXJzZS0+eGluZ19mcmFtZXMgPSAwOworICBtcDNwYXJzZS0+eGluZ190b3RhbF90aW1lID0gMDsKKyAgbXAzcGFyc2UtPnhpbmdfYnl0ZXMgPSAwOworICBtcDNwYXJzZS0+eGluZ192YnJfc2NhbGUgPSAwOworICBtZW1zZXQgKG1wM3BhcnNlLT54aW5nX3NlZWtfdGFibGUsIDAsIHNpemVvZiAobXAzcGFyc2UtPnhpbmdfc2Vla190YWJsZSkpOworICBtZW1zZXQgKG1wM3BhcnNlLT54aW5nX3NlZWtfdGFibGVfaW52ZXJzZSwgMCwKKyAgICAgIHNpemVvZiAobXAzcGFyc2UtPnhpbmdfc2Vla190YWJsZV9pbnZlcnNlKSk7CisKKyAgbXAzcGFyc2UtPnZicmlfYml0cmF0ZSA9IDA7CisgIG1wM3BhcnNlLT52YnJpX2ZyYW1lcyA9IDA7CisgIG1wM3BhcnNlLT52YnJpX3RvdGFsX3RpbWUgPSAwOworICBtcDNwYXJzZS0+dmJyaV9ieXRlcyA9IDA7CisgIG1wM3BhcnNlLT52YnJpX3NlZWtfcG9pbnRzID0gMDsKKyAgZ19mcmVlIChtcDNwYXJzZS0+dmJyaV9zZWVrX3RhYmxlKTsKKyAgbXAzcGFyc2UtPnZicmlfc2Vla190YWJsZSA9IE5VTEw7CisKKyAgbXAzcGFyc2UtPmVuY29kZXJfZGVsYXkgPSAwOworICBtcDNwYXJzZS0+ZW5jb2Rlcl9wYWRkaW5nID0gMDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tcGVnX2F1ZGlvX3BhcnNlX2luaXQgKEdzdE1wZWdBdWRpb1BhcnNlICogbXAzcGFyc2UpCit7CisgIGdzdF9tcGVnX2F1ZGlvX3BhcnNlX3Jlc2V0IChtcDNwYXJzZSk7CisgIEdTVF9QQURfU0VUX0FDQ0VQVF9JTlRFUlNFQ1QgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChtcDNwYXJzZSkpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChtcDNwYXJzZSkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X21wZWdfYXVkaW9fcGFyc2VfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbXBlZ19hdWRpb19wYXJzZV9zdGFydCAoR3N0QmFzZVBhcnNlICogcGFyc2UpCit7CisgIEdzdE1wZWdBdWRpb1BhcnNlICptcDNwYXJzZSA9IEdTVF9NUEVHX0FVRElPX1BBUlNFIChwYXJzZSk7CisKKyAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplIChHU1RfQkFTRV9QQVJTRSAobXAzcGFyc2UpLCBNSU5fRlJBTUVfU0laRSk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAic3RhcnRpbmciKTsKKworICBnc3RfbXBlZ19hdWRpb19wYXJzZV9yZXNldCAobXAzcGFyc2UpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tcGVnX2F1ZGlvX3BhcnNlX3N0b3AgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKQoreworICBHc3RNcGVnQXVkaW9QYXJzZSAqbXAzcGFyc2UgPSBHU1RfTVBFR19BVURJT19QQVJTRSAocGFyc2UpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAic3RvcHBpbmciKTsKKworICBnc3RfbXBlZ19hdWRpb19wYXJzZV9yZXNldCAobXAzcGFyc2UpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgY29uc3QgZ3VpbnQgbXAzdHlwZXNfYml0cmF0ZXNbMl1bM11bMTZdID0geworICB7CisgICAgICAgIHswLCAzMiwgNjQsIDk2LCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMjg4LCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCx9LAorICAgICAgICB7MCwgMzIsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLCAzODQsfSwKKyAgICAgICAgezAsIDMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAsfQorICAgICAgfSwKKyAgeworICAgICAgICB7MCwgMzIsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwLCAxNzYsIDE5MiwgMjI0LCAyNTYsfSwKKyAgICAgICAgezAsIDgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MCx9LAorICAgICAgICB7MCwgOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwLH0KKyAgICAgIH0sCit9OworCitzdGF0aWMgY29uc3QgZ3VpbnQgbXAzdHlwZXNfZnJlcXNbM11bM10gPSB7IHs0NDEwMCwgNDgwMDAsIDMyMDAwfSwKK3syMjA1MCwgMjQwMDAsIDE2MDAwfSwKK3sxMTAyNSwgMTIwMDAsIDgwMDB9Cit9OworCitzdGF0aWMgaW5saW5lIGd1aW50CittcDNfdHlwZV9mcmFtZV9sZW5ndGhfZnJvbV9oZWFkZXIgKEdzdE1wZWdBdWRpb1BhcnNlICogbXAzcGFyc2UsIGd1aW50MzIgaGVhZGVyLAorICAgIGd1aW50ICogcHV0X3ZlcnNpb24sIGd1aW50ICogcHV0X2xheWVyLCBndWludCAqIHB1dF9jaGFubmVscywKKyAgICBndWludCAqIHB1dF9iaXRyYXRlLCBndWludCAqIHB1dF9zYW1wbGVyYXRlLCBndWludCAqIHB1dF9tb2RlLAorICAgIGd1aW50ICogcHV0X2NyYykKK3sKKyAgZ3VpbnQgbGVuZ3RoOworICBndWxvbmcgbW9kZSwgc2FtcGxlcmF0ZSwgYml0cmF0ZSwgbGF5ZXIsIGNoYW5uZWxzLCBwYWRkaW5nLCBjcmM7CisgIGd1bG9uZyB2ZXJzaW9uOworICBnaW50IGxzZiwgbXBnMjU7CisKKyAgaWYgKGhlYWRlciAmICgxIDw8IDIwKSkgeworICAgIGxzZiA9IChoZWFkZXIgJiAoMSA8PCAxOSkpID8gMCA6IDE7CisgICAgbXBnMjUgPSAwOworICB9IGVsc2UgeworICAgIGxzZiA9IDE7CisgICAgbXBnMjUgPSAxOworICB9CisKKyAgdmVyc2lvbiA9IDEgKyBsc2YgKyBtcGcyNTsKKworICBsYXllciA9IDQgLSAoKGhlYWRlciA+PiAxNykgJiAweDMpOworCisgIGNyYyA9IChoZWFkZXIgPj4gMTYpICYgMHgxOworCisgIGJpdHJhdGUgPSAoaGVhZGVyID4+IDEyKSAmIDB4RjsKKyAgYml0cmF0ZSA9IG1wM3R5cGVzX2JpdHJhdGVzW2xzZl1bbGF5ZXIgLSAxXVtiaXRyYXRlXSAqIDEwMDA7CisgIGlmICghYml0cmF0ZSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChtcDNwYXJzZSwgInVzaW5nIGZyZWVmb3JtIGJpdHJhdGUiKTsKKyAgICBiaXRyYXRlID0gbXAzcGFyc2UtPmZyZWVyYXRlOworICB9CisKKyAgc2FtcGxlcmF0ZSA9IChoZWFkZXIgPj4gMTApICYgMHgzOworICBzYW1wbGVyYXRlID0gbXAzdHlwZXNfZnJlcXNbbHNmICsgbXBnMjVdW3NhbXBsZXJhdGVdOworCisgIC8qIGZvcmNlIDAgbGVuZ3RoIGlmIDAgYml0cmF0ZSAqLworICBwYWRkaW5nID0gKGJpdHJhdGUgPiAwKSA/IChoZWFkZXIgPj4gOSkgJiAweDEgOiAwOworCisgIG1vZGUgPSAoaGVhZGVyID4+IDYpICYgMHgzOworICBjaGFubmVscyA9IChtb2RlID09IDMpID8gMSA6IDI7CisKKyAgc3dpdGNoIChsYXllcikgeworICAgIGNhc2UgMToKKyAgICAgIGxlbmd0aCA9IDQgKiAoKGJpdHJhdGUgKiAxMikgLyBzYW1wbGVyYXRlICsgcGFkZGluZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBsZW5ndGggPSAoYml0cmF0ZSAqIDE0NCkgLyBzYW1wbGVyYXRlICsgcGFkZGluZzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgY2FzZSAzOgorICAgICAgbGVuZ3RoID0gKGJpdHJhdGUgKiAxNDQpIC8gKHNhbXBsZXJhdGUgPDwgbHNmKSArIHBhZGRpbmc7CisgICAgICBicmVhazsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAiQ2FsY3VsYXRlZCBtcDMgZnJhbWUgbGVuZ3RoIG9mICV1IGJ5dGVzIiwKKyAgICAgIGxlbmd0aCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAic2FtcGxlcmF0ZSA9ICVsdSwgYml0cmF0ZSA9ICVsdSwgdmVyc2lvbiA9ICVsdSwgIgorICAgICAgImxheWVyID0gJWx1LCBjaGFubmVscyA9ICVsdSwgbW9kZSA9ICVzIiwgc2FtcGxlcmF0ZSwgYml0cmF0ZSwgdmVyc2lvbiwKKyAgICAgIGxheWVyLCBjaGFubmVscywgZ3N0X21wZWdfYXVkaW9fY2hhbm5lbF9tb2RlX2dldF9uaWNrIChtb2RlKSk7CisKKyAgaWYgKHB1dF92ZXJzaW9uKQorICAgICpwdXRfdmVyc2lvbiA9IHZlcnNpb247CisgIGlmIChwdXRfbGF5ZXIpCisgICAgKnB1dF9sYXllciA9IGxheWVyOworICBpZiAocHV0X2NoYW5uZWxzKQorICAgICpwdXRfY2hhbm5lbHMgPSBjaGFubmVsczsKKyAgaWYgKHB1dF9iaXRyYXRlKQorICAgICpwdXRfYml0cmF0ZSA9IGJpdHJhdGU7CisgIGlmIChwdXRfc2FtcGxlcmF0ZSkKKyAgICAqcHV0X3NhbXBsZXJhdGUgPSBzYW1wbGVyYXRlOworICBpZiAocHV0X21vZGUpCisgICAgKnB1dF9tb2RlID0gbW9kZTsKKyAgaWYgKHB1dF9jcmMpCisgICAgKnB1dF9jcmMgPSBjcmM7CisKKyAgcmV0dXJuIGxlbmd0aDsKK30KKworLyogTWluaW11bSBudW1iZXIgb2YgY29uc2VjdXRpdmUsIHZhbGlkLWxvb2tpbmcgZnJhbWVzIHRvIGNvbnNpZGVyCisgKiBmb3IgcmVzeW5jaW5nICovCisjZGVmaW5lIE1JTl9SRVNZTkNfRlJBTUVTIDMKKworLyogUGVyZm9ybSBleHRlbmRlZCB2YWxpZGF0aW9uIHRvIGNoZWNrIHRoYXQgc3Vic2VxdWVudCBoZWFkZXJzIG1hdGNoCisgKiB0aGUgZmlyc3QgaGVhZGVyIGdpdmVuIGhlcmUgaW4gaW1wb3J0YW50IGNoYXJhY3RlcmlzdGljcywgdG8gYXZvaWQKKyAqIGZhbHNlIHN5bmMuIFdlIGxvb2sgZm9yIGEgbWluaW11bSBvZiBNSU5fUkVTWU5DX0ZSQU1FUyBjb25zZWN1dGl2ZQorICogZnJhbWVzIHRvIG1hdGNoIHRoZWlyIG1ham9yIGNoYXJhY3RlcmlzdGljcy4KKyAqCisgKiBJZiBhdF9lb3MgaXMgc2V0IHRvIFRSVUUsIHdlIGp1c3QgY2hlY2sgdGhhdCB3ZSBkb24ndCBmaW5kIGFueSBpbnZhbGlkCisgKiBmcmFtZXMgaW4gd2hhdGV2ZXIgZGF0YSBpcyBhdmFpbGFibGUsIHJhdGhlciB0aGFuIHJlcXVpcmluZyBhIGZ1bGwKKyAqIE1JTl9SRVNZTkNfRlJBTUVTIG9mIGRhdGEuCisgKgorICogUmV0dXJucyBUUlVFIGlmIHdlJ3ZlIHNlZW4gZW5vdWdoIGRhdGEgdG8gdmFsaWRhdGUgb3IgcmVqZWN0IHRoZSBmcmFtZS4KKyAqIElmIFRSVUUgaXMgcmV0dXJuZWQsIHRoZW4gKnZhbGlkIGNvbnRhaW5zIFRSVUUgaWYgaXQgdmFsaWRhdGVkLCBvciBmYWxzZQorICogaWYgd2UgZGVjaWRlZCBpdCB3YXMgZmFsc2Ugc3luYy4KKyAqIElmIEZBTFNFIGlzIHJldHVybmVkLCB0aGVuICp2YWxpZCBjb250YWlucyBtaW5pbXVtIG5lZWRlZCBkYXRhLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tcDNwYXJzZV92YWxpZGF0ZV9leHRlbmRlZCAoR3N0TXBlZ0F1ZGlvUGFyc2UgKiBtcDNwYXJzZSwgR3N0QnVmZmVyICogYnVmLAorICAgIGd1aW50MzIgaGVhZGVyLCBpbnQgYnBmLCBnYm9vbGVhbiBhdF9lb3MsIGdpbnQgKiB2YWxpZCkKK3sKKyAgZ3VpbnQzMiBuZXh0X2hlYWRlcjsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisgIGludCBmcmFtZXNfZm91bmQgPSAxOworICBpbnQgb2Zmc2V0ID0gYnBmOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgd2hpbGUgKGZyYW1lc19mb3VuZCA8IE1JTl9SRVNZTkNfRlJBTUVTKSB7CisgICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBlbm91Z2ggZGF0YSBmb3IgYWxsIHRoZXNlIGZyYW1lcywgcGx1cyB0aGUgbmV4dAorICAgICAgIGZyYW1lIGhlYWRlci4gKi8KKyAgICBpZiAobWFwLnNpemUgPCBvZmZzZXQgKyA0KSB7CisgICAgICBpZiAoYXRfZW9zKSB7CisgICAgICAgIC8qIFJ1bm5pbmcgb3V0IG9mIGRhdGEgYXQgRU9TIGlzIGZpbmU7IGp1c3QgYWNjZXB0IGl0ICovCisgICAgICAgICp2YWxpZCA9IFRSVUU7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICp2YWxpZCA9IG9mZnNldCArIDQ7CisgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICB9CisgICAgfQorCisgICAgbmV4dF9oZWFkZXIgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKG1hcC5kYXRhICsgb2Zmc2V0KTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChtcDNwYXJzZSwgIkF0ICVkOiBoZWFkZXI9JTA4WCwgaGVhZGVyMj0lMDhYLCBicGY9JWQiLAorICAgICAgICBvZmZzZXQsICh1bnNpZ25lZCBpbnQpIGhlYWRlciwgKHVuc2lnbmVkIGludCkgbmV4dF9oZWFkZXIsIGJwZik7CisKKy8qIG1hc2sgdGhlIGJpdHMgd2hpY2ggYXJlIGFsbG93ZWQgdG8gZGlmZmVyIGJldHdlZW4gZnJhbWVzICovCisjZGVmaW5lIEhEUk1BU0sgfigoMHhGIDw8IDEyKSAgLyogYml0cmF0ZSAqLyB8IFwKKyAgICAgICAgICAgICAgICAgICgweDEgPDwgIDkpICAvKiBwYWRkaW5nICovIHwgXAorICAgICAgICAgICAgICAgICAgKDB4ZiA8PCAgNCkgIC8qIG1vZGV8bW9kZSBleHRlbnNpb24gKi8gfCBcCisgICAgICAgICAgICAgICAgICAoMHhmKSkgICAgICAgIC8qIGNvcHlyaWdodHxlbXBoYXNpcyAqLworCisgICAgaWYgKChuZXh0X2hlYWRlciAmIEhEUk1BU0spICE9IChoZWFkZXIgJiBIRFJNQVNLKSkgeworICAgICAgLyogSWYgYW55IG9mIHRoZSB1bm1hc2tlZCBiaXRzIGRvbid0IG1hdGNoLCB0aGVuIGl0J3Mgbm90IHZhbGlkICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChtcDNwYXJzZSwgIm5leHQgaGVhZGVyIGRvZXNuJ3QgbWF0Y2ggIgorICAgICAgICAgICIoaGVhZGVyPSUwOFggKCUwOFgpLCBoZWFkZXIyPSUwOFggKCUwOFgpLCBicGY9JWQpIiwKKyAgICAgICAgICAoZ3VpbnQpIGhlYWRlciwgKGd1aW50KSBoZWFkZXIgJiBIRFJNQVNLLCAoZ3VpbnQpIG5leHRfaGVhZGVyLAorICAgICAgICAgIChndWludCkgbmV4dF9oZWFkZXIgJiBIRFJNQVNLLCBicGYpOworICAgICAgKnZhbGlkID0gRkFMU0U7CisgICAgICBnb3RvIGNsZWFudXA7CisgICAgfSBlbHNlIGlmICgoKG5leHRfaGVhZGVyID4+IDEyKSAmIDB4ZikgPT0gMHhmKSB7CisgICAgICAvKiBUaGUgZXNzZW50aWFsIHBhcnRzIHdlcmUgdGhlIHNhbWUsIGJ1dCB0aGUgYml0cmF0ZSBoZWxkIGFuCisgICAgICAgICBpbnZhbGlkIHZhbHVlIC0gYWxzbyByZWplY3QgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAibmV4dCBoZWFkZXIgaW52YWxpZCAoYml0cmF0ZSkiKTsKKyAgICAgICp2YWxpZCA9IEZBTFNFOworICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKworICAgIGJwZiA9IG1wM190eXBlX2ZyYW1lX2xlbmd0aF9mcm9tX2hlYWRlciAobXAzcGFyc2UsIG5leHRfaGVhZGVyLAorICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworICAgIC8qIGlmIG5vIGJpdHJhdGUsIGFuZCBubyBmcmVlZm9ybSByYXRlIGtub3duLCB0aGVuIGZhaWwgKi8KKyAgICBpZiAoR19VTkxJS0VMWSAoIWJwZikpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAibmV4dCBoZWFkZXIgaW52YWxpZCAoYml0cmF0ZSAwKSIpOworICAgICAgKnZhbGlkID0gRkFMU0U7CisgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorCisgICAgb2Zmc2V0ICs9IGJwZjsKKyAgICBmcmFtZXNfZm91bmQrKzsKKyAgfQorCisgICp2YWxpZCA9IFRSVUU7CisKK2NsZWFudXA6CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21wZWdfYXVkaW9fcGFyc2VfaGVhZF9jaGVjayAoR3N0TXBlZ0F1ZGlvUGFyc2UgKiBtcDNwYXJzZSwKKyAgICB1bnNpZ25lZCBsb25nIGhlYWQpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAiY2hlY2tpbmcgbXAzIGhlYWRlciAweCUwOGx4IiwgaGVhZCk7CisgIC8qIGlmIGl0J3Mgbm90IGEgdmFsaWQgc3luYyAqLworICBpZiAoKGhlYWQgJiAweGZmZTAwMDAwKSAhPSAweGZmZTAwMDAwKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtcDNwYXJzZSwgImludmFsaWQgc3luYyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICAvKiBpZiBpdCdzIGFuIGludmFsaWQgTVBFRyB2ZXJzaW9uICovCisgIGlmICgoKGhlYWQgPj4gMTkpICYgMykgPT0gMHgxKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtcDNwYXJzZSwgImludmFsaWQgTVBFRyB2ZXJzaW9uOiAweCVseCIsCisgICAgICAgIChoZWFkID4+IDE5KSAmIDMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICAvKiBpZiBpdCdzIGFuIGludmFsaWQgbGF5ZXIgKi8KKyAgaWYgKCEoKGhlYWQgPj4gMTcpICYgMykpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG1wM3BhcnNlLCAiaW52YWxpZCBsYXllcjogMHglbHgiLCAoaGVhZCA+PiAxNykgJiAzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgLyogaWYgaXQncyBhbiBpbnZhbGlkIGJpdHJhdGUgKi8KKyAgaWYgKCgoaGVhZCA+PiAxMikgJiAweGYpID09IDB4ZikgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXAzcGFyc2UsICJpbnZhbGlkIGJpdHJhdGU6IDB4JWx4IiwgKGhlYWQgPj4gMTIpICYgMHhmKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgLyogaWYgaXQncyBhbiBpbnZhbGlkIHNhbXBsZXJhdGUgKi8KKyAgaWYgKCgoaGVhZCA+PiAxMCkgJiAweDMpID09IDB4MykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXAzcGFyc2UsICJpbnZhbGlkIHNhbXBsZXJhdGU6IDB4JWx4IiwKKyAgICAgICAgKGhlYWQgPj4gMTApICYgMHgzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoKGhlYWQgJiAweDMpID09IDB4MikgeworICAgIC8qIElnbm9yZSB0aGlzIGFzIHRoZXJlIGFyZSBzb21lIGZpbGVzIHdpdGggZW1waGFzaXMgMHgyIHRoYXQgY2FuCisgICAgICogYmUgcGxheWVkIGZpbmUuIFNlZSBCR08gIzUzNzIzNSAqLworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXAzcGFyc2UsICJpbnZhbGlkIGVtcGhhc2lzOiAweCVseCIsIGhlYWQgJiAweDMpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIERldGVybWluZXMgcG9zc2libGUgZnJlZWZvcm0gZnJhbWUgcmF0ZS9zaXplIGJ5IGxvb2tpbmcgZm9yIG5leHQKKyAqIGhlYWRlciB3aXRoIHZhbGlkIGJpdHJhdGUgKDAgb3Igb3RoZXJ3aXNlIHZhbGlkKSAoYW5kIHN1ZmZpY2llbnRseQorICogbWF0Y2hpbmcgY3VycmVudCBoZWFkZXIpLgorICoKKyAqIFJldHVybnMgVFJVRSBpZiB3ZSd2ZSBmb3VuZCBzdWNoIG9uZSwgYW5kICpyYXRlIHRoZW4gY29udGFpbnMgcmF0ZQorICogKG9yICpyYXRlIGNvbnRhaW5zIDAgaWYgZGVjaWRlZCBubyBmcmVlZnJhbWUgc2l6ZSBjb3VsZCBiZSBkZXRlcm1pbmVkKS4KKyAqIElmIG5vdCBlbm91Z2ggZGF0YSwgcmV0dXJucyBGQUxTRS4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfbXAzcGFyc2VfZmluZF9mcmVlcmF0ZSAoR3N0TXBlZ0F1ZGlvUGFyc2UgKiBtcDNwYXJzZSwgR3N0TWFwSW5mbyAqIG1hcCwKKyAgICBndWludDMyIGhlYWRlciwgZ2Jvb2xlYW4gYXRfZW9zLCBnaW50ICogX3JhdGUpCit7CisgIGd1aW50MzIgbmV4dF9oZWFkZXI7CisgIGNvbnN0IGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQgYXZhaWxhYmxlOworICBpbnQgb2Zmc2V0ID0gNDsKKyAgZ3Vsb25nIHNhbXBsZXJhdGUsIHJhdGUsIGxheWVyLCBwYWRkaW5nOworICBnYm9vbGVhbiB2YWxpZDsKKyAgZ2ludCBsc2YsIG1wZzI1OworCisgIGF2YWlsYWJsZSA9IG1hcC0+c2l6ZTsKKyAgZGF0YSA9IG1hcC0+ZGF0YTsKKworICAqX3JhdGUgPSAwOworCisgIC8qIHBpY2sgYXBhcnQgaGVhZGVyIGFnYWluIHBhcnRpYWxseSAqLworICBpZiAoaGVhZGVyICYgKDEgPDwgMjApKSB7CisgICAgbHNmID0gKGhlYWRlciAmICgxIDw8IDE5KSkgPyAwIDogMTsKKyAgICBtcGcyNSA9IDA7CisgIH0gZWxzZSB7CisgICAgbHNmID0gMTsKKyAgICBtcGcyNSA9IDE7CisgIH0KKyAgbGF5ZXIgPSA0IC0gKChoZWFkZXIgPj4gMTcpICYgMHgzKTsKKyAgc2FtcGxlcmF0ZSA9IChoZWFkZXIgPj4gMTApICYgMHgzOworICBzYW1wbGVyYXRlID0gbXAzdHlwZXNfZnJlcXNbbHNmICsgbXBnMjVdW3NhbXBsZXJhdGVdOworICBwYWRkaW5nID0gKGhlYWRlciA+PiA5KSAmIDB4MTsKKworICBmb3IgKDsgb2Zmc2V0IDwgYXZhaWxhYmxlOyArK29mZnNldCkgeworICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgZW5vdWdoIGRhdGEgZm9yIGFsbCB0aGVzZSBmcmFtZXMsIHBsdXMgdGhlIG5leHQKKyAgICAgICBmcmFtZSBoZWFkZXIuICovCisgICAgaWYgKGF2YWlsYWJsZSA8IG9mZnNldCArIDQpIHsKKyAgICAgIGlmIChhdF9lb3MpIHsKKyAgICAgICAgLyogUnVubmluZyBvdXQgb2YgZGF0YTsgZmFpbGVkIHRvIGRldGVybWluZSBzaXplICovCisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0KKworICAgIHZhbGlkID0gRkFMU0U7CisgICAgbmV4dF9oZWFkZXIgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEgKyBvZmZzZXQpOworICAgIGlmICgobmV4dF9oZWFkZXIgJiAweEZGRTAwMDAwKSAhPSAweEZGRTAwMDAwKQorICAgICAgZ290byBuZXh0OworCisgICAgR1NUX0RFQlVHX09CSkVDVCAobXAzcGFyc2UsICJBdCAlZDogaGVhZGVyPSUwOFgsIGhlYWRlcjI9JTA4WCIsCisgICAgICAgIG9mZnNldCwgKHVuc2lnbmVkIGludCkgaGVhZGVyLCAodW5zaWduZWQgaW50KSBuZXh0X2hlYWRlcik7CisKKyAgICBpZiAoKG5leHRfaGVhZGVyICYgSERSTUFTSykgIT0gKGhlYWRlciAmIEhEUk1BU0spKSB7CisgICAgICAvKiBJZiBhbnkgb2YgdGhlIHVubWFza2VkIGJpdHMgZG9uJ3QgbWF0Y2gsIHRoZW4gaXQncyBub3QgdmFsaWQgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAibmV4dCBoZWFkZXIgZG9lc24ndCBtYXRjaCAiCisgICAgICAgICAgIihoZWFkZXI9JTA4WCAoJTA4WCksIGhlYWRlcjI9JTA4WCAoJTA4WCkpIiwKKyAgICAgICAgICAoZ3VpbnQpIGhlYWRlciwgKGd1aW50KSBoZWFkZXIgJiBIRFJNQVNLLCAoZ3VpbnQpIG5leHRfaGVhZGVyLAorICAgICAgICAgIChndWludCkgbmV4dF9oZWFkZXIgJiBIRFJNQVNLKTsKKyAgICAgIGdvdG8gbmV4dDsKKyAgICB9IGVsc2UgaWYgKCgobmV4dF9oZWFkZXIgPj4gMTIpICYgMHhmKSA9PSAweGYpIHsKKyAgICAgIC8qIFRoZSBlc3NlbnRpYWwgcGFydHMgd2VyZSB0aGUgc2FtZSwgYnV0IHRoZSBiaXRyYXRlIGhlbGQgYW4KKyAgICAgICAgIGludmFsaWQgdmFsdWUgLSBhbHNvIHJlamVjdCAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXAzcGFyc2UsICJuZXh0IGhlYWRlciBpbnZhbGlkIChiaXRyYXRlKSIpOworICAgICAgZ290byBuZXh0OworICAgIH0KKworICAgIHZhbGlkID0gVFJVRTsKKworICBuZXh0OgorICAgIC8qIGFsbW9zdCBhY2NlcHQgYXMgZnJlZSBmcmFtZSAqLworICAgIGlmIChsYXllciA9PSAxKSB7CisgICAgICByYXRlID0gc2FtcGxlcmF0ZSAqIChvZmZzZXQgLSA0ICogcGFkZGluZyArIDQpIC8gNDgwMDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHJhdGUgPSBzYW1wbGVyYXRlICogKG9mZnNldCAtIHBhZGRpbmcgKyAxKSAvICgxNDQgPj4gbHNmKSAvIDEwMDA7CisgICAgfQorCisgICAgaWYgKHZhbGlkKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAobXAzcGFyc2UsICJjYWxjdWxhdGVkIHJhdGUgJWx1IiwgcmF0ZSAqIDEwMDApOworICAgICAgaWYgKHJhdGUgPCA4IHx8IChsYXllciA9PSAzICYmIHJhdGUgPiA2NDApKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAicmF0ZSBpbnZhbGlkIik7CisgICAgICAgIGlmIChyYXRlIDwgOCkgeworICAgICAgICAgIC8qIG1heWJlIHNvbWUgaG9wZSAqLworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAiYWJvcnRpbmciKTsKKyAgICAgICAgICAvKiBnaXZlIHVwICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICpfcmF0ZSA9IHJhdGUgKiAxMDAwOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGF2b2lkIGluZGVmaW5pdGUgc2VhcmNoaW5nICovCisgICAgICBpZiAocmF0ZSA+IDEwMDApIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXAzcGFyc2UsICJleGNlZWRlZCBzYW5pdHkgcmF0ZTsgYWJvcnRpbmciKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbXBlZ19hdWRpb19wYXJzZV9oYW5kbGVfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUsIGdpbnQgKiBza2lwc2l6ZSkKK3sKKyAgR3N0TXBlZ0F1ZGlvUGFyc2UgKm1wM3BhcnNlID0gR1NUX01QRUdfQVVESU9fUEFSU0UgKHBhcnNlKTsKKyAgR3N0QnVmZmVyICpidWYgPSBmcmFtZS0+YnVmZmVyOworICBHc3RCeXRlUmVhZGVyIHJlYWRlcjsKKyAgZ2ludCBvZmYsIGJwZiA9IDA7CisgIGdib29sZWFuIGxvc3Rfc3luYywgZHJhaW5pbmcsIHZhbGlkLCBjYXBzX2NoYW5nZTsKKyAgZ3VpbnQzMiBoZWFkZXI7CisgIGd1aW50IGJpdHJhdGUsIGxheWVyLCByYXRlLCBjaGFubmVscywgdmVyc2lvbiwgbW9kZSwgY3JjOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgaWYgKEdfVU5MSUtFTFkgKG1hcC5zaXplIDwgNikpIHsKKyAgICAqc2tpcHNpemUgPSAxOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorCisgIGdzdF9ieXRlX3JlYWRlcl9pbml0ICgmcmVhZGVyLCBtYXAuZGF0YSwgbWFwLnNpemUpOworCisgIG9mZiA9IGdzdF9ieXRlX3JlYWRlcl9tYXNrZWRfc2Nhbl91aW50MzIgKCZyZWFkZXIsIDB4ZmZlMDAwMDAsIDB4ZmZlMDAwMDAsCisgICAgICAwLCBtYXAuc2l6ZSk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAicG9zc2libGUgc3luYyBhdCBidWZmZXIgb2Zmc2V0ICVkIiwgb2ZmKTsKKworICAvKiBkaWRuJ3QgZmluZCBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2UgYSBzeW5jIHdvcmQsIHNraXAgKi8KKyAgaWYgKG9mZiA8IDApIHsKKyAgICAqc2tpcHNpemUgPSBtYXAuc2l6ZSAtIDM7CisgICAgZ290byBjbGVhbnVwOworICB9CisKKyAgLyogcG9zc2libGUgZnJhbWUgaGVhZGVyLCBidXQgbm90IGF0IG9mZnNldCAwPyBza2lwIGJ5dGVzIGJlZm9yZSBzeW5jICovCisgIGlmIChvZmYgPiAwKSB7CisgICAgKnNraXBzaXplID0gb2ZmOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorCisgIC8qIG1ha2Ugc3VyZSB0aGUgdmFsdWVzIGluIHRoZSBmcmFtZSBoZWFkZXIgbG9vayBzYW5lICovCisgIGhlYWRlciA9IEdTVF9SRUFEX1VJTlQzMl9CRSAobWFwLmRhdGEpOworICBpZiAoIWdzdF9tcGVnX2F1ZGlvX3BhcnNlX2hlYWRfY2hlY2sgKG1wM3BhcnNlLCBoZWFkZXIpKSB7CisgICAgKnNraXBzaXplID0gMTsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJnb3QgZnJhbWUiKTsKKworICBsb3N0X3N5bmMgPSBHU1RfQkFTRV9QQVJTRV9MT1NUX1NZTkMgKHBhcnNlKTsKKyAgZHJhaW5pbmcgPSBHU1RfQkFTRV9QQVJTRV9EUkFJTklORyAocGFyc2UpOworCisgIGlmIChHX1VOTElLRUxZIChsb3N0X3N5bmMpKQorICAgIG1wM3BhcnNlLT5mcmVlcmF0ZSA9IDA7CisKKyAgYnBmID0gbXAzX3R5cGVfZnJhbWVfbGVuZ3RoX2Zyb21faGVhZGVyIChtcDNwYXJzZSwgaGVhZGVyLAorICAgICAgJnZlcnNpb24sICZsYXllciwgJmNoYW5uZWxzLCAmYml0cmF0ZSwgJnJhdGUsICZtb2RlLCAmY3JjKTsKKworICBpZiAoY2hhbm5lbHMgIT0gbXAzcGFyc2UtPmNoYW5uZWxzIHx8IHJhdGUgIT0gbXAzcGFyc2UtPnJhdGUgfHwKKyAgICAgIGxheWVyICE9IG1wM3BhcnNlLT5sYXllciB8fCB2ZXJzaW9uICE9IG1wM3BhcnNlLT52ZXJzaW9uKQorICAgIGNhcHNfY2hhbmdlID0gVFJVRTsKKyAgZWxzZQorICAgIGNhcHNfY2hhbmdlID0gRkFMU0U7CisKKyAgLyogbWF5YmUgZnJlZSBmb3JtYXQgKi8KKyAgaWYgKGJwZiA9PSAwKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKG1wM3BhcnNlLCAicG9zc2libHkgZnJlZSBmb3JtYXQiKTsKKyAgICBpZiAobG9zdF9zeW5jIHx8IG1wM3BhcnNlLT5mcmVlcmF0ZSA9PSAwKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChtcDNwYXJzZSwgImZpbmRpbmcgZnJlZSBmb3JtYXQgcmF0ZSIpOworICAgICAgaWYgKCFnc3RfbXAzcGFyc2VfZmluZF9mcmVlcmF0ZSAobXAzcGFyc2UsICZtYXAsIGhlYWRlciwgZHJhaW5pbmcsCisgICAgICAgICAgICAgICZ2YWxpZCkpIHsKKyAgICAgICAgLyogbm90IGVub3VnaCBkYXRhICovCisgICAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAocGFyc2UsIHZhbGlkKTsKKyAgICAgICAgKnNraXBzaXplID0gMDsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJkZXRlcm1pbmVkIGZyZWVmb3JtIHNpemUgJWQiLCB2YWxpZCk7CisgICAgICAgIG1wM3BhcnNlLT5mcmVlcmF0ZSA9IHZhbGlkOworICAgICAgfQorICAgIH0KKyAgICAvKiB0cnkgYWdhaW4gKi8KKyAgICBicGYgPSBtcDNfdHlwZV9mcmFtZV9sZW5ndGhfZnJvbV9oZWFkZXIgKG1wM3BhcnNlLCBoZWFkZXIsCisgICAgICAgICZ2ZXJzaW9uLCAmbGF5ZXIsICZjaGFubmVscywgJmJpdHJhdGUsICZyYXRlLCAmbW9kZSwgJmNyYyk7CisgICAgaWYgKCFicGYpIHsKKyAgICAgIC8qIGRpZCBub3QgY29tZSB1cCB3aXRoIHZhbGlkIGZyZWVmb3JtIGxlbmd0aCwgcmVqZWN0IGFmdGVyIGFsbCAqLworICAgICAgKnNraXBzaXplID0gMTsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisgIH0KKworICBpZiAoIWRyYWluaW5nICYmIChsb3N0X3N5bmMgfHwgY2Fwc19jaGFuZ2UpKSB7CisgICAgaWYgKCFnc3RfbXAzcGFyc2VfdmFsaWRhdGVfZXh0ZW5kZWQgKG1wM3BhcnNlLCBidWYsIGhlYWRlciwgYnBmLCBkcmFpbmluZywKKyAgICAgICAgICAgICZ2YWxpZCkpIHsKKyAgICAgIC8qIG5vdCBlbm91Z2ggZGF0YSAqLworICAgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplIChwYXJzZSwgdmFsaWQpOworICAgICAgKnNraXBzaXplID0gMDsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCF2YWxpZCkgeworICAgICAgICAqc2tpcHNpemUgPSBvZmYgKyAyOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKGRyYWluaW5nICYmIGxvc3Rfc3luYyAmJiBjYXBzX2NoYW5nZSAmJiBtcDNwYXJzZS0+cmF0ZSA+IDApIHsKKyAgICAvKiBhdm9pZCBjYXBzIGppdHRlciB0aGF0IHdlIGNhbid0IGJlIHN1cmUgb2YgKi8KKyAgICAqc2tpcHNpemUgPSBvZmYgKyAyOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorCisgIC8qIHJlc3RvcmUgZGVmYXVsdCBtaW5pbXVtICovCisgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAocGFyc2UsIE1JTl9GUkFNRV9TSVpFKTsKKworICByZXMgPSBUUlVFOworCisgIC8qIG1ldGFkYXRhIGhhbmRsaW5nICovCisgIGlmIChHX1VOTElLRUxZIChjYXBzX2NoYW5nZSkpIHsKKyAgICBHc3RDYXBzICpjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL21wZWciLAorICAgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAxLAorICAgICAgICAibXBlZ2F1ZGlvdmVyc2lvbiIsIEdfVFlQRV9JTlQsIHZlcnNpb24sCisgICAgICAgICJsYXllciIsIEdfVFlQRV9JTlQsIGxheWVyLAorICAgICAgICAicmF0ZSIsIEdfVFlQRV9JTlQsIHJhdGUsCisgICAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIGNoYW5uZWxzLCAicGFyc2VkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICAgIGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSwgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgbXAzcGFyc2UtPnJhdGUgPSByYXRlOworICAgIG1wM3BhcnNlLT5jaGFubmVscyA9IGNoYW5uZWxzOworICAgIG1wM3BhcnNlLT5sYXllciA9IGxheWVyOworICAgIG1wM3BhcnNlLT52ZXJzaW9uID0gdmVyc2lvbjsKKworICAgIC8qIHNlZSBodHRwOi8vd3d3LmNvZGVwcm9qZWN0LmNvbS9hdWRpby9NUEVHQXVkaW9JbmZvLmFzcCAqLworICAgIGlmIChtcDNwYXJzZS0+bGF5ZXIgPT0gMSkKKyAgICAgIG1wM3BhcnNlLT5zcGYgPSAzODQ7CisgICAgZWxzZSBpZiAobXAzcGFyc2UtPmxheWVyID09IDIpCisgICAgICBtcDNwYXJzZS0+c3BmID0gMTE1MjsKKyAgICBlbHNlIGlmIChtcDNwYXJzZS0+dmVyc2lvbiA9PSAxKSB7CisgICAgICBtcDNwYXJzZS0+c3BmID0gMTE1MjsKKyAgICB9IGVsc2UgeworICAgICAgLyogTVBFRy0yIG9yICIyLjUiICovCisgICAgICBtcDNwYXJzZS0+c3BmID0gNTc2OworICAgIH0KKworICAgIC8qIGxlYWRfaW46CisgICAgICogV2Ugc3RhcnQgcHVzaGluZyA5IGZyYW1lcyBlYXJsaWVyICgyOSBmcmFtZXMgZm9yIE1QRUcyKSB0aGFuCisgICAgICogc2VnbWVudCBzdGFydCB0byBiZSBhYmxlIHRvIGRlY29kZSB0aGUgZmlyc3QgZnJhbWUgd2Ugd2FudC4KKyAgICAgKiA5ICgyOSkgZnJhbWVzIGFyZSB0aGUgdGhlb3JldGljYWwgbWF4aW11bSBvZiBmcmFtZXMgdGhhdCBjb250YWluCisgICAgICogZGF0YSBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgKGJpdCByZXNlcnZvaXIpLgorICAgICAqCisgICAgICogbGVhZF9vdXQ6CisgICAgICogU29tZSBtcDMgc3RyZWFtcyBoYXZlIGFuIG9mZnNldCBpbiB0aGUgdGltZXN0YW1wcywgZm9yIHdoaWNoIHdlIGhhdmUgdG8KKyAgICAgKiBwdXNoIHRoZSBmcmFtZSAqYWZ0ZXIqIHRoZSBlbmQgcG9zaXRpb24gaW4gb3JkZXIgZm9yIHRoZSBkZWNvZGVyIHRvIGJlCisgICAgICogYWJsZSB0byBkZWNvZGUgZXZlcnl0aGluZyB1cCB1bnRpbCB0aGUgc2VnbWVudC5zdG9wIHBvc2l0aW9uLiAqLworICAgIGdzdF9iYXNlX3BhcnNlX3NldF9mcmFtZV9yYXRlIChwYXJzZSwgbXAzcGFyc2UtPnJhdGUsIG1wM3BhcnNlLT5zcGYsCisgICAgICAgICh2ZXJzaW9uID09IDEpID8gMTAgOiAzMCwgMik7CisgIH0KKworICBtcDNwYXJzZS0+aGRyX2JpdHJhdGUgPSBiaXRyYXRlOworCisgIC8qIEZvciBmaXJzdCBmcmFtZTsgY2hlY2sgZm9yIHNlZWsgdGFibGVzIGFuZCBvdXRwdXQgYSBjb2RlYyB0YWcgKi8KKyAgZ3N0X21wZWdfYXVkaW9fcGFyc2VfaGFuZGxlX2ZpcnN0X2ZyYW1lIChtcDNwYXJzZSwgYnVmKTsKKworICAvKiBzdG9yZSBzb21lIGZyYW1lIGluZm8gZm9yIGxhdGVyIHByb2Nlc3NpbmcgKi8KKyAgbXAzcGFyc2UtPmxhc3RfY3JjID0gY3JjOworICBtcDNwYXJzZS0+bGFzdF9tb2RlID0gbW9kZTsKKworY2xlYW51cDoKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICBpZiAocmVzICYmIGJwZiA8PSBtYXAuc2l6ZSkgeworICAgIHJldHVybiBnc3RfYmFzZV9wYXJzZV9maW5pc2hfZnJhbWUgKHBhcnNlLCBmcmFtZSwgYnBmKTsKKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tcGVnX2F1ZGlvX3BhcnNlX2hhbmRsZV9maXJzdF9mcmFtZSAoR3N0TXBlZ0F1ZGlvUGFyc2UgKiBtcDNwYXJzZSwKKyAgICBHc3RCdWZmZXIgKiBidWYpCit7CisgIGNvbnN0IGd1aW50MzIgeGluZ19pZCA9IDB4NTg2OTZlNjc7ICAgLyogJ1hpbmcnIGluIGhleCAqLworICBjb25zdCBndWludDMyIGluZm9faWQgPSAweDQ5NmU2NjZmOyAgIC8qICdJbmZvJyBpbiBoZXggLSBmb3VuZCBpbiBMQU1FIENCUiBmaWxlcyAqLworICBjb25zdCBndWludDMyIHZicmlfaWQgPSAweDU2NDI1MjQ5OyAgIC8qICdWQlJJJyBpbiBoZXggKi8KKyAgY29uc3QgZ3VpbnQzMiBsYW1lX2lkID0gMHg0YzQxNGQ0NTsgICAvKiAnTEFNRScgaW4gaGV4ICovCisgIGdpbnQgb2Zmc2V0X3hpbmcsIG9mZnNldF92YnJpOworICBndWludDY0IGF2YWlsOworICBnaW50NjQgdXBzdHJlYW1fdG90YWxfYnl0ZXMgPSAwOworICBndWludDMyIHJlYWRfaWRfeGluZyA9IDAsIHJlYWRfaWRfdmJyaSA9IDA7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKmRhdGE7CisgIGd1aW50IGJpdHJhdGU7CisKKyAgaWYgKG1wM3BhcnNlLT5zZW50X2NvZGVjX3RhZykKKyAgICByZXR1cm47CisKKyAgLyogQ2hlY2sgZmlyc3QgZnJhbWUgZm9yIFhpbmcgaW5mbyAqLworICBpZiAobXAzcGFyc2UtPnZlcnNpb24gPT0gMSkgeyAvKiBNUEVHLTEgZmlsZSAqLworICAgIGlmIChtcDNwYXJzZS0+Y2hhbm5lbHMgPT0gMSkKKyAgICAgIG9mZnNldF94aW5nID0gMHgxMTsKKyAgICBlbHNlCisgICAgICBvZmZzZXRfeGluZyA9IDB4MjA7CisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIE1QRUctMiBoZWFkZXIgKi8KKyAgICBpZiAobXAzcGFyc2UtPmNoYW5uZWxzID09IDEpCisgICAgICBvZmZzZXRfeGluZyA9IDB4MDk7CisgICAgZWxzZQorICAgICAgb2Zmc2V0X3hpbmcgPSAweDExOworICB9CisKKyAgLyogVGhlIFZCUkkgdGFnIGlzIGFsd2F5cyBhdCBvZmZzZXQgMHgyMCAqLworICBvZmZzZXRfdmJyaSA9IDB4MjA7CisKKyAgLyogU2tpcCB0aGUgNCBieXRlcyBvZiB0aGUgTVAzIGhlYWRlciB0b28gKi8KKyAgb2Zmc2V0X3hpbmcgKz0gNDsKKyAgb2Zmc2V0X3ZicmkgKz0gNDsKKworICAvKiBDaGVjayBpZiB3ZSBoYXZlIGVub3VnaCBkYXRhIHRvIHJlYWQgdGhlIFhpbmcgaGVhZGVyICovCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKyAgYXZhaWwgPSBtYXAuc2l6ZTsKKworICBpZiAoYXZhaWwgPj0gb2Zmc2V0X3hpbmcgKyA0KSB7CisgICAgcmVhZF9pZF94aW5nID0gR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhICsgb2Zmc2V0X3hpbmcpOworICB9CisgIGlmIChhdmFpbCA+PSBvZmZzZXRfdmJyaSArIDQpIHsKKyAgICByZWFkX2lkX3ZicmkgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEgKyBvZmZzZXRfdmJyaSk7CisgIH0KKworICAvKiBvYnRhaW4gcmVhbCB1cHN0cmVhbSB0b3RhbCBieXRlcyAqLworICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeV9kdXJhdGlvbiAoR1NUX0JBU0VfUEFSU0VfU0lOS19QQUQgKG1wM3BhcnNlKSwKKyAgICAgICAgICBHU1RfRk9STUFUX0JZVEVTLCAmdXBzdHJlYW1fdG90YWxfYnl0ZXMpKQorICAgIHVwc3RyZWFtX3RvdGFsX2J5dGVzID0gMDsKKworICBpZiAocmVhZF9pZF94aW5nID09IHhpbmdfaWQgfHwgcmVhZF9pZF94aW5nID09IGluZm9faWQpIHsKKyAgICBndWludDMyIHhpbmdfZmxhZ3M7CisgICAgZ3VpbnQgYnl0ZXNfbmVlZGVkID0gb2Zmc2V0X3hpbmcgKyA4OworICAgIGdpbnQ2NCB0b3RhbF9ieXRlczsKKyAgICBHc3RDbG9ja1RpbWUgdG90YWxfdGltZTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAiRm91bmQgWGluZyBoZWFkZXIgbWFya2VyIDB4JXgiLCB4aW5nX2lkKTsKKworICAgIC8qIE1vdmUgZGF0YSBhZnRlciBYaW5nIGhlYWRlciAqLworICAgIGRhdGEgKz0gb2Zmc2V0X3hpbmcgKyA0OworCisgICAgLyogUmVhZCA0IGJhc2UgYnl0ZXMgb2YgZmxhZ3MsIGJpZy1lbmRpYW4gKi8KKyAgICB4aW5nX2ZsYWdzID0gR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhKTsKKyAgICBkYXRhICs9IDQ7CisgICAgaWYgKHhpbmdfZmxhZ3MgJiBYSU5HX0ZSQU1FU19GTEFHKQorICAgICAgYnl0ZXNfbmVlZGVkICs9IDQ7CisgICAgaWYgKHhpbmdfZmxhZ3MgJiBYSU5HX0JZVEVTX0ZMQUcpCisgICAgICBieXRlc19uZWVkZWQgKz0gNDsKKyAgICBpZiAoeGluZ19mbGFncyAmIFhJTkdfVE9DX0ZMQUcpCisgICAgICBieXRlc19uZWVkZWQgKz0gMTAwOworICAgIGlmICh4aW5nX2ZsYWdzICYgWElOR19WQlJfU0NBTEVfRkxBRykKKyAgICAgIGJ5dGVzX25lZWRlZCArPSA0OworICAgIGlmIChhdmFpbCA8IGJ5dGVzX25lZWRlZCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXAzcGFyc2UsCisgICAgICAgICAgIk5vdCBlbm91Z2ggZGF0YSB0byByZWFkIFhpbmcgaGVhZGVyIChuZWVkICVkKSIsIGJ5dGVzX25lZWRlZCk7CisgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorCisgICAgR1NUX0RFQlVHX09CSkVDVCAobXAzcGFyc2UsICJSZWFkaW5nIFhpbmcgaGVhZGVyIik7CisgICAgbXAzcGFyc2UtPnhpbmdfZmxhZ3MgPSB4aW5nX2ZsYWdzOworCisgICAgaWYgKHhpbmdfZmxhZ3MgJiBYSU5HX0ZSQU1FU19GTEFHKSB7CisgICAgICBtcDNwYXJzZS0+eGluZ19mcmFtZXMgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEpOworICAgICAgaWYgKG1wM3BhcnNlLT54aW5nX2ZyYW1lcyA9PSAwKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXAzcGFyc2UsCisgICAgICAgICAgICAiSW52YWxpZCBudW1iZXIgb2YgZnJhbWVzIGluIFhpbmcgaGVhZGVyIik7CisgICAgICAgIG1wM3BhcnNlLT54aW5nX2ZsYWdzICY9IH5YSU5HX0ZSQU1FU19GTEFHOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbXAzcGFyc2UtPnhpbmdfdG90YWxfdGltZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoR1NUX1NFQ09ORCwKKyAgICAgICAgICAgIChndWludDY0KSAobXAzcGFyc2UtPnhpbmdfZnJhbWVzKSAqIChtcDNwYXJzZS0+c3BmKSwKKyAgICAgICAgICAgIG1wM3BhcnNlLT5yYXRlKTsKKyAgICAgIH0KKworICAgICAgZGF0YSArPSA0OworICAgIH0gZWxzZSB7CisgICAgICBtcDNwYXJzZS0+eGluZ19mcmFtZXMgPSAwOworICAgICAgbXAzcGFyc2UtPnhpbmdfdG90YWxfdGltZSA9IDA7CisgICAgfQorCisgICAgaWYgKHhpbmdfZmxhZ3MgJiBYSU5HX0JZVEVTX0ZMQUcpIHsKKyAgICAgIG1wM3BhcnNlLT54aW5nX2J5dGVzID0gR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhKTsKKyAgICAgIGlmIChtcDNwYXJzZS0+eGluZ19ieXRlcyA9PSAwKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXAzcGFyc2UsICJJbnZhbGlkIG51bWJlciBvZiBieXRlcyBpbiBYaW5nIGhlYWRlciIpOworICAgICAgICBtcDNwYXJzZS0+eGluZ19mbGFncyAmPSB+WElOR19CWVRFU19GTEFHOworICAgICAgfQorICAgICAgZGF0YSArPSA0OworICAgIH0gZWxzZSB7CisgICAgICBtcDNwYXJzZS0+eGluZ19ieXRlcyA9IDA7CisgICAgfQorCisgICAgLyogSWYgd2Uga25vdyB0aGUgdXBzdHJlYW0gc2l6ZSBhbmQgZHVyYXRpb24sIGNvbXB1dGUgdGhlCisgICAgICogdG90YWwgYml0cmF0ZSwgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBrYml0L3NlYyAqLworICAgIGlmICgodG90YWxfdGltZSA9IG1wM3BhcnNlLT54aW5nX3RvdGFsX3RpbWUpICYmCisgICAgICAgICh0b3RhbF9ieXRlcyA9IG1wM3BhcnNlLT54aW5nX2J5dGVzKSkgeworICAgICAgbXAzcGFyc2UtPnhpbmdfYml0cmF0ZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAodG90YWxfYnl0ZXMsCisgICAgICAgICAgOCAqIEdTVF9TRUNPTkQsIHRvdGFsX3RpbWUpOworICAgICAgbXAzcGFyc2UtPnhpbmdfYml0cmF0ZSArPSA1MDA7CisgICAgICBtcDNwYXJzZS0+eGluZ19iaXRyYXRlIC09IG1wM3BhcnNlLT54aW5nX2JpdHJhdGUgJSAxMDAwOworICAgIH0KKworICAgIGlmICh4aW5nX2ZsYWdzICYgWElOR19UT0NfRkxBRykgeworICAgICAgaW50IGksIHBlcmNlbnQgPSAwOworICAgICAgZ3VjaGFyICp0YWJsZSA9IG1wM3BhcnNlLT54aW5nX3NlZWtfdGFibGU7CisgICAgICBndWNoYXIgb2xkID0gMCwgbmV3OworICAgICAgZ3VpbnQgZmlyc3Q7CisKKyAgICAgIGZpcnN0ID0gZGF0YVswXTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLAorICAgICAgICAgICJTdWJ0cmFjdGluZyBpbml0aWFsIG9mZnNldCBvZiAlZCBieXRlcyBmcm9tIFhpbmcgVE9DIiwgZmlyc3QpOworCisgICAgICAvKiB4aW5nIHNlZWsgdGFibGU6IHBlcmNlbnQgdGltZSAtPiAxLzI1NiBieXRlcG9zICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKyAgICAgICAgbmV3ID0gZGF0YVtpXSAtIGZpcnN0OworICAgICAgICBpZiAob2xkID4gbmV3KSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtcDNwYXJzZSwgIlNraXBwaW5nIGJyb2tlbiBYaW5nIFRPQyIpOworICAgICAgICAgIG1wM3BhcnNlLT54aW5nX2ZsYWdzICY9IH5YSU5HX1RPQ19GTEFHOworICAgICAgICAgIGdvdG8gc2tpcF90b2M7CisgICAgICAgIH0KKyAgICAgICAgbXAzcGFyc2UtPnhpbmdfc2Vla190YWJsZVtpXSA9IG9sZCA9IG5ldzsKKyAgICAgIH0KKworICAgICAgLyogYnVpbGQgaW52ZXJzZSB0YWJsZTogMS8yNTYgYnl0ZXBvcyAtPiAxLzEwMCBwZXJjZW50IHRpbWUgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICB3aGlsZSAocGVyY2VudCA8IDk5ICYmIHRhYmxlW3BlcmNlbnQgKyAxXSA8PSBpKQorICAgICAgICAgIHBlcmNlbnQrKzsKKworICAgICAgICBpZiAodGFibGVbcGVyY2VudF0gPT0gaSkgeworICAgICAgICAgIG1wM3BhcnNlLT54aW5nX3NlZWtfdGFibGVfaW52ZXJzZVtpXSA9IHBlcmNlbnQgKiAxMDA7CisgICAgICAgIH0gZWxzZSBpZiAocGVyY2VudCA8IDk5ICYmIHRhYmxlW3BlcmNlbnRdKSB7CisgICAgICAgICAgZ2RvdWJsZSBmYSwgZmIsIGZ4OworICAgICAgICAgIGdpbnQgYSA9IHBlcmNlbnQsIGIgPSBwZXJjZW50ICsgMTsKKworICAgICAgICAgIGZhID0gdGFibGVbYV07CisgICAgICAgICAgZmIgPSB0YWJsZVtiXTsKKyAgICAgICAgICBmeCA9IChiIC0gYSkgLyAoZmIgLSBmYSkgKiAoaSAtIGZhKSArIGE7CisgICAgICAgICAgbXAzcGFyc2UtPnhpbmdfc2Vla190YWJsZV9pbnZlcnNlW2ldID0gKGd1aW50MTYpIChmeCAqIDEwMCk7CisgICAgICAgIH0gZWxzZSBpZiAocGVyY2VudCA9PSA5OSkgeworICAgICAgICAgIGdkb3VibGUgZmEsIGZiLCBmeDsKKyAgICAgICAgICBnaW50IGEgPSBwZXJjZW50LCBiID0gMTAwOworCisgICAgICAgICAgZmEgPSB0YWJsZVthXTsKKyAgICAgICAgICBmYiA9IDI1Ni4wOworICAgICAgICAgIGZ4ID0gKGIgLSBhKSAvIChmYiAtIGZhKSAqIChpIC0gZmEpICsgYTsKKyAgICAgICAgICBtcDNwYXJzZS0+eGluZ19zZWVrX3RhYmxlX2ludmVyc2VbaV0gPSAoZ3VpbnQxNikgKGZ4ICogMTAwKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIHNraXBfdG9jOgorICAgICAgZGF0YSArPSAxMDA7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lbXNldCAobXAzcGFyc2UtPnhpbmdfc2Vla190YWJsZSwgMCwgc2l6ZW9mIChtcDNwYXJzZS0+eGluZ19zZWVrX3RhYmxlKSk7CisgICAgICBtZW1zZXQgKG1wM3BhcnNlLT54aW5nX3NlZWtfdGFibGVfaW52ZXJzZSwgMCwKKyAgICAgICAgICBzaXplb2YgKG1wM3BhcnNlLT54aW5nX3NlZWtfdGFibGVfaW52ZXJzZSkpOworICAgIH0KKworICAgIGlmICh4aW5nX2ZsYWdzICYgWElOR19WQlJfU0NBTEVfRkxBRykgeworICAgICAgbXAzcGFyc2UtPnhpbmdfdmJyX3NjYWxlID0gR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhKTsKKyAgICAgIGRhdGEgKz0gNDsKKyAgICB9IGVsc2UKKyAgICAgIG1wM3BhcnNlLT54aW5nX3Zicl9zY2FsZSA9IDA7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChtcDNwYXJzZSwgIlhpbmcgaGVhZGVyIHJlcG9ydGVkICV1IGZyYW1lcywgdGltZSAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiwgJXUgYnl0ZXMsIHZiciBzY2FsZSAldSIsIG1wM3BhcnNlLT54aW5nX2ZyYW1lcywKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAobXAzcGFyc2UtPnhpbmdfdG90YWxfdGltZSksIG1wM3BhcnNlLT54aW5nX2J5dGVzLAorICAgICAgICBtcDNwYXJzZS0+eGluZ192YnJfc2NhbGUpOworCisgICAgLyogY2hlY2sgZm9yIHRydW5jYXRlZCBmaWxlICovCisgICAgaWYgKHVwc3RyZWFtX3RvdGFsX2J5dGVzICYmIG1wM3BhcnNlLT54aW5nX2J5dGVzICYmCisgICAgICAgIG1wM3BhcnNlLT54aW5nX2J5dGVzICogMC44ID4gdXBzdHJlYW1fdG90YWxfYnl0ZXMpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXAzcGFyc2UsICJGaWxlIGFwcGVhcnMgdG8gaGF2ZSBiZWVuIHRydW5jYXRlZDsgIgorICAgICAgICAgICJpbnZhbGlkYXRpbmcgWGluZyBoZWFkZXIgZHVyYXRpb24gYW5kIHNpemUiKTsKKyAgICAgIG1wM3BhcnNlLT54aW5nX2ZsYWdzICY9IH5YSU5HX0JZVEVTX0ZMQUc7CisgICAgICBtcDNwYXJzZS0+eGluZ19mbGFncyAmPSB+WElOR19GUkFNRVNfRkxBRzsKKyAgICB9CisKKyAgICAvKiBPcHRpb25hbCBMQU1FIHRhZz8gKi8KKyAgICBpZiAoYXZhaWwgLSBieXRlc19uZWVkZWQgPj0gMzYgJiYgR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhKSA9PSBsYW1lX2lkKSB7CisgICAgICBnY2hhciBsYW1lX3ZlcnNpb25bMTBdID0geyAwLCB9OworICAgICAgZ3VpbnQgdGFnX3JldjsKKyAgICAgIGd1aW50MzIgZW5jb2Rlcl9kZWxheSwgZW5jb2Rlcl9wYWRkaW5nOworCisgICAgICBtZW1jcHkgKGxhbWVfdmVyc2lvbiwgZGF0YSwgOSk7CisgICAgICBkYXRhICs9IDk7CisgICAgICB0YWdfcmV2ID0gZGF0YVswXSA+PiA0OworICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXAzcGFyc2UsICJGb3VuZCBMQU1FIHRhZyByZXZpc2lvbiAlZCBjcmVhdGVkIGJ5ICclcyciLAorICAgICAgICAgIHRhZ19yZXYsIGxhbWVfdmVyc2lvbik7CisKKyAgICAgIC8qIFNraXAgYWxsIHRoZSBpbmZvcm1hdGlvbiB3ZSdyZSBub3QgaW50ZXJlc3RlZCBpbiAqLworICAgICAgZGF0YSArPSAxMjsKKyAgICAgIC8qIEVuY29kZXIgZGVsYXkgYW5kIGVuZCBwYWRkaW5nICovCisgICAgICBlbmNvZGVyX2RlbGF5ID0gR1NUX1JFQURfVUlOVDI0X0JFIChkYXRhKTsKKyAgICAgIGVuY29kZXJfZGVsYXkgPj49IDEyOworICAgICAgZW5jb2Rlcl9wYWRkaW5nID0gR1NUX1JFQURfVUlOVDI0X0JFIChkYXRhKTsKKyAgICAgIGVuY29kZXJfcGFkZGluZyAmPSAweDAwMGZmZjsKKworICAgICAgbXAzcGFyc2UtPmVuY29kZXJfZGVsYXkgPSBlbmNvZGVyX2RlbGF5OworICAgICAgbXAzcGFyc2UtPmVuY29kZXJfcGFkZGluZyA9IGVuY29kZXJfcGFkZGluZzsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXAzcGFyc2UsICJFbmNvZGVyIGRlbGF5ICV1LCBlbmNvZGVyIHBhZGRpbmcgJXUiLAorICAgICAgICAgIGVuY29kZXJfZGVsYXksIGVuY29kZXJfcGFkZGluZyk7CisgICAgfQorICB9IGVsc2UgaWYgKHJlYWRfaWRfdmJyaSA9PSB2YnJpX2lkKSB7CisgICAgZ2ludDY0IHRvdGFsX2J5dGVzLCB0b3RhbF9mcmFtZXM7CisgICAgR3N0Q2xvY2tUaW1lIHRvdGFsX3RpbWU7CisgICAgZ3VpbnQxNiBuc2Vla19wb2ludHM7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChtcDNwYXJzZSwgIkZvdW5kIFZCUkkgaGVhZGVyIG1hcmtlciAweCV4IiwgdmJyaV9pZCk7CisKKyAgICBpZiAoYXZhaWwgPCBvZmZzZXRfdmJyaSArIDI2KSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChtcDNwYXJzZSwKKyAgICAgICAgICAiTm90IGVub3VnaCBkYXRhIHRvIHJlYWQgVkJSSSBoZWFkZXIgKG5lZWQgJWQpIiwgb2Zmc2V0X3ZicmkgKyAyNik7CisgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorCisgICAgR1NUX0RFQlVHX09CSkVDVCAobXAzcGFyc2UsICJSZWFkaW5nIFZCUkkgaGVhZGVyIik7CisKKyAgICAvKiBNb3ZlIGRhdGEgYWZ0ZXIgVkJSSSBoZWFkZXIgKi8KKyAgICBkYXRhICs9IG9mZnNldF92YnJpICsgNDsKKworICAgIGlmIChHU1RfUkVBRF9VSU5UMTZfQkUgKGRhdGEpICE9IDB4MDAwMSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtcDNwYXJzZSwKKyAgICAgICAgICAiVW5zdXBwb3J0ZWQgVkJSSSB2ZXJzaW9uIDB4JXgiLCBHU1RfUkVBRF9VSU5UMTZfQkUgKGRhdGEpKTsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisgICAgZGF0YSArPSAyOworCisgICAgLyogU2tpcCBlbmNvZGVyIGRlbGF5ICovCisgICAgZGF0YSArPSAyOworCisgICAgLyogU2tpcCBxdWFsaXR5ICovCisgICAgZGF0YSArPSAyOworCisgICAgdG90YWxfYnl0ZXMgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEpOworICAgIGlmICh0b3RhbF9ieXRlcyAhPSAwKQorICAgICAgbXAzcGFyc2UtPnZicmlfYnl0ZXMgPSB0b3RhbF9ieXRlczsKKyAgICBkYXRhICs9IDQ7CisKKyAgICB0b3RhbF9mcmFtZXMgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEpOworICAgIGlmICh0b3RhbF9mcmFtZXMgIT0gMCkgeworICAgICAgbXAzcGFyc2UtPnZicmlfZnJhbWVzID0gdG90YWxfZnJhbWVzOworICAgICAgbXAzcGFyc2UtPnZicmlfdG90YWxfdGltZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoR1NUX1NFQ09ORCwKKyAgICAgICAgICAoZ3VpbnQ2NCkgKG1wM3BhcnNlLT52YnJpX2ZyYW1lcykgKiAobXAzcGFyc2UtPnNwZiksIG1wM3BhcnNlLT5yYXRlKTsKKyAgICB9CisgICAgZGF0YSArPSA0OworCisgICAgLyogSWYgd2Uga25vdyB0aGUgdXBzdHJlYW0gc2l6ZSBhbmQgZHVyYXRpb24sIGNvbXB1dGUgdGhlCisgICAgICogdG90YWwgYml0cmF0ZSwgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBrYml0L3NlYyAqLworICAgIGlmICgodG90YWxfdGltZSA9IG1wM3BhcnNlLT52YnJpX3RvdGFsX3RpbWUpICYmCisgICAgICAgICh0b3RhbF9ieXRlcyA9IG1wM3BhcnNlLT52YnJpX2J5dGVzKSkgeworICAgICAgbXAzcGFyc2UtPnZicmlfYml0cmF0ZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAodG90YWxfYnl0ZXMsCisgICAgICAgICAgOCAqIEdTVF9TRUNPTkQsIHRvdGFsX3RpbWUpOworICAgICAgbXAzcGFyc2UtPnZicmlfYml0cmF0ZSArPSA1MDA7CisgICAgICBtcDNwYXJzZS0+dmJyaV9iaXRyYXRlIC09IG1wM3BhcnNlLT52YnJpX2JpdHJhdGUgJSAxMDAwOworICAgIH0KKworICAgIG5zZWVrX3BvaW50cyA9IEdTVF9SRUFEX1VJTlQxNl9CRSAoZGF0YSk7CisgICAgZGF0YSArPSAyOworCisgICAgaWYgKG5zZWVrX3BvaW50cyA+IDApIHsKKyAgICAgIGd1aW50IHNjYWxlLCBzZWVrX2J5dGVzLCBzZWVrX2ZyYW1lczsKKyAgICAgIGdpbnQgaTsKKworICAgICAgbXAzcGFyc2UtPnZicmlfc2Vla19wb2ludHMgPSBuc2Vla19wb2ludHM7CisKKyAgICAgIHNjYWxlID0gR1NUX1JFQURfVUlOVDE2X0JFIChkYXRhKTsKKyAgICAgIGRhdGEgKz0gMjsKKworICAgICAgc2Vla19ieXRlcyA9IEdTVF9SRUFEX1VJTlQxNl9CRSAoZGF0YSk7CisgICAgICBkYXRhICs9IDI7CisKKyAgICAgIHNlZWtfZnJhbWVzID0gR1NUX1JFQURfVUlOVDE2X0JFIChkYXRhKTsKKworICAgICAgaWYgKHNjYWxlID09IDAgfHwgc2Vla19ieXRlcyA9PSAwIHx8IHNlZWtfYnl0ZXMgPiA0IHx8IHNlZWtfZnJhbWVzID09IDApIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtcDNwYXJzZSwgIlVuc3VwcG9ydGVkIFZCUkkgc2VlayB0YWJsZSIpOworICAgICAgICBnb3RvIG91dF92YnJpOworICAgICAgfQorCisgICAgICBpZiAoYXZhaWwgPCBvZmZzZXRfdmJyaSArIDI2ICsgbnNlZWtfcG9pbnRzICogc2Vla19ieXRlcykgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG1wM3BhcnNlLAorICAgICAgICAgICAgIk5vdCBlbm91Z2ggZGF0YSB0byByZWFkIFZCUkkgc2VlayB0YWJsZSAobmVlZCAlZCkiLAorICAgICAgICAgICAgb2Zmc2V0X3ZicmkgKyAyNiArIG5zZWVrX3BvaW50cyAqIHNlZWtfYnl0ZXMpOworICAgICAgICBnb3RvIG91dF92YnJpOworICAgICAgfQorCisgICAgICBpZiAoc2Vla19mcmFtZXMgKiBuc2Vla19wb2ludHMgPCB0b3RhbF9mcmFtZXMgLSBzZWVrX2ZyYW1lcyB8fAorICAgICAgICAgIHNlZWtfZnJhbWVzICogbnNlZWtfcG9pbnRzID4gdG90YWxfZnJhbWVzICsgc2Vla19mcmFtZXMpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtcDNwYXJzZSwKKyAgICAgICAgICAgICJWQlJJIHNlZWsgdGFibGUgZG9lc24ndCBjb3ZlciB0aGUgY29tcGxldGUgZmlsZSIpOworICAgICAgICBnb3RvIG91dF92YnJpOworICAgICAgfQorCisgICAgICBkYXRhID0gbWFwLmRhdGE7CisgICAgICBkYXRhICs9IG9mZnNldF92YnJpICsgMjY7CisKKyAgICAgIC8qIFZCUkkgc2VlayB0YWJsZTogZnJhbWUvc2Vla19mcmFtZXMgLT4gYnl0ZSAqLworICAgICAgbXAzcGFyc2UtPnZicmlfc2Vla190YWJsZSA9IGdfbmV3IChndWludDMyLCBuc2Vla19wb2ludHMpOworICAgICAgaWYgKHNlZWtfYnl0ZXMgPT0gNCkKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5zZWVrX3BvaW50czsgaSsrKSB7CisgICAgICAgICAgbXAzcGFyc2UtPnZicmlfc2Vla190YWJsZVtpXSA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoZGF0YSkgKiBzY2FsZTsKKyAgICAgICAgICBkYXRhICs9IDQ7CisgICAgICB9IGVsc2UgaWYgKHNlZWtfYnl0ZXMgPT0gMykKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5zZWVrX3BvaW50czsgaSsrKSB7CisgICAgICAgICAgbXAzcGFyc2UtPnZicmlfc2Vla190YWJsZVtpXSA9IEdTVF9SRUFEX1VJTlQyNF9CRSAoZGF0YSkgKiBzY2FsZTsKKyAgICAgICAgICBkYXRhICs9IDM7CisgICAgICB9IGVsc2UgaWYgKHNlZWtfYnl0ZXMgPT0gMikKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5zZWVrX3BvaW50czsgaSsrKSB7CisgICAgICAgICAgbXAzcGFyc2UtPnZicmlfc2Vla190YWJsZVtpXSA9IEdTVF9SRUFEX1VJTlQxNl9CRSAoZGF0YSkgKiBzY2FsZTsKKyAgICAgICAgICBkYXRhICs9IDI7CisgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgIC8qIHNlZWtfYnl0ZXMgPT0gMSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnNlZWtfcG9pbnRzOyBpKyspIHsKKyAgICAgICAgICBtcDNwYXJzZS0+dmJyaV9zZWVrX3RhYmxlW2ldID0gR1NUX1JFQURfVUlOVDggKGRhdGEpICogc2NhbGU7CisgICAgICAgICAgZGF0YSArPSAxOworICAgICAgICB9CisgICAgfQorICBvdXRfdmJyaToKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAiVkJSSSBoZWFkZXIgcmVwb3J0ZWQgJXUgZnJhbWVzLCB0aW1lICUiCisgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiLCBieXRlcyAldSIsIG1wM3BhcnNlLT52YnJpX2ZyYW1lcywKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAobXAzcGFyc2UtPnZicmlfdG90YWxfdGltZSksIG1wM3BhcnNlLT52YnJpX2J5dGVzKTsKKworICAgIC8qIGNoZWNrIGZvciB0cnVuY2F0ZWQgZmlsZSAqLworICAgIGlmICh1cHN0cmVhbV90b3RhbF9ieXRlcyAmJiBtcDNwYXJzZS0+dmJyaV9ieXRlcyAmJgorICAgICAgICBtcDNwYXJzZS0+dmJyaV9ieXRlcyAqIDAuOCA+IHVwc3RyZWFtX3RvdGFsX2J5dGVzKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG1wM3BhcnNlLCAiRmlsZSBhcHBlYXJzIHRvIGhhdmUgYmVlbiB0cnVuY2F0ZWQ7ICIKKyAgICAgICAgICAiaW52YWxpZGF0aW5nIFZCUkkgaGVhZGVyIGR1cmF0aW9uIGFuZCBzaXplIik7CisgICAgICBtcDNwYXJzZS0+dmJyaV92YWxpZCA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICBtcDNwYXJzZS0+dmJyaV92YWxpZCA9IFRSVUU7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLAorICAgICAgICAiWGluZywgTEFNRSBvciBWQlJJIGhlYWRlciBub3QgZm91bmQgaW4gZmlyc3QgZnJhbWUiKTsKKyAgfQorCisgIC8qIHNldCBkdXJhdGlvbiBpZiB0YWJsZXMgcHJvdmlkZWQgYSB2YWxpZCBvbmUgKi8KKyAgaWYgKG1wM3BhcnNlLT54aW5nX2ZsYWdzICYgWElOR19GUkFNRVNfRkxBRykgeworICAgIGdzdF9iYXNlX3BhcnNlX3NldF9kdXJhdGlvbiAoR1NUX0JBU0VfUEFSU0UgKG1wM3BhcnNlKSwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICBtcDNwYXJzZS0+eGluZ190b3RhbF90aW1lLCAwKTsKKyAgfQorICBpZiAobXAzcGFyc2UtPnZicmlfdG90YWxfdGltZSAhPSAwICYmIG1wM3BhcnNlLT52YnJpX3ZhbGlkKSB7CisgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X2R1cmF0aW9uIChHU1RfQkFTRV9QQVJTRSAobXAzcGFyc2UpLCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgIG1wM3BhcnNlLT52YnJpX3RvdGFsX3RpbWUsIDApOworICB9CisKKyAgLyogdGVsbCBiYXNlY2xhc3MgaG93IG5pY2VseSB3ZSBjYW4gc2VlaywgYW5kIGEgYml0cmF0ZSBpZiBvbmUgZm91bmQgKi8KKyAgLyogRklYTUU6IGZpbGwgaW5kZXggd2l0aCBzZWVrIHRhYmxlICovCisjaWYgMAorICBzZWVrYWJsZSA9IEdTVF9CQVNFX1BBUlNFX1NFRUtfREVGQVVMVDsKKyAgaWYgKChtcDNwYXJzZS0+eGluZ19mbGFncyAmIFhJTkdfVE9DX0ZMQUcpICYmIG1wM3BhcnNlLT54aW5nX2J5dGVzICYmCisgICAgICBtcDNwYXJzZS0+eGluZ190b3RhbF90aW1lKQorICAgIHNlZWthYmxlID0gR1NUX0JBU0VfUEFSU0VfU0VFS19UQUJMRTsKKworICBpZiAobXAzcGFyc2UtPnZicmlfc2Vla190YWJsZSAmJiBtcDNwYXJzZS0+dmJyaV9ieXRlcyAmJgorICAgICAgbXAzcGFyc2UtPnZicmlfdG90YWxfdGltZSkKKyAgICBzZWVrYWJsZSA9IEdTVF9CQVNFX1BBUlNFX1NFRUtfVEFCTEU7CisjZW5kaWYKKworICBpZiAobXAzcGFyc2UtPnhpbmdfYml0cmF0ZSkKKyAgICBiaXRyYXRlID0gbXAzcGFyc2UtPnhpbmdfYml0cmF0ZTsKKyAgZWxzZSBpZiAobXAzcGFyc2UtPnZicmlfYml0cmF0ZSkKKyAgICBiaXRyYXRlID0gbXAzcGFyc2UtPnZicmlfYml0cmF0ZTsKKyAgZWxzZQorICAgIGJpdHJhdGUgPSAwOworCisgIGdzdF9iYXNlX3BhcnNlX3NldF9hdmVyYWdlX2JpdHJhdGUgKEdTVF9CQVNFX1BBUlNFIChtcDNwYXJzZSksIGJpdHJhdGUpOworCitjbGVhbnVwOgorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tcGVnX2F1ZGlvX3BhcnNlX3RpbWVfdG9fYnl0ZXBvcyAoR3N0TXBlZ0F1ZGlvUGFyc2UgKiBtcDNwYXJzZSwKKyAgICBHc3RDbG9ja1RpbWUgdHMsIGdpbnQ2NCAqIGJ5dGVwb3MpCit7CisgIGdpbnQ2NCB0b3RhbF9ieXRlczsKKyAgR3N0Q2xvY2tUaW1lIHRvdGFsX3RpbWU7CisKKyAgLyogSWYgWElORyBzZWVrIHRhYmxlIGV4aXN0cyB1c2UgdGhpcyBmb3IgdGltZS0+Ynl0ZSBjb252ZXJzaW9uICovCisgIGlmICgobXAzcGFyc2UtPnhpbmdfZmxhZ3MgJiBYSU5HX1RPQ19GTEFHKSAmJgorICAgICAgKHRvdGFsX2J5dGVzID0gbXAzcGFyc2UtPnhpbmdfYnl0ZXMpICYmCisgICAgICAodG90YWxfdGltZSA9IG1wM3BhcnNlLT54aW5nX3RvdGFsX3RpbWUpKSB7CisgICAgZ2RvdWJsZSBmYSwgZmIsIGZ4OworICAgIGdkb3VibGUgcGVyY2VudCA9CisgICAgICAgIENMQU1QICgoMTAwLjAgKiBnc3RfdXRpbF9ndWludDY0X3RvX2dkb3VibGUgKHRzKSkgLworICAgICAgICBnc3RfdXRpbF9ndWludDY0X3RvX2dkb3VibGUgKHRvdGFsX3RpbWUpLCAwLjAsIDEwMC4wKTsKKyAgICBnaW50IGluZGV4ID0gQ0xBTVAgKHBlcmNlbnQsIDAsIDk5KTsKKworICAgIGZhID0gbXAzcGFyc2UtPnhpbmdfc2Vla190YWJsZVtpbmRleF07CisgICAgaWYgKGluZGV4IDwgOTkpCisgICAgICBmYiA9IG1wM3BhcnNlLT54aW5nX3NlZWtfdGFibGVbaW5kZXggKyAxXTsKKyAgICBlbHNlCisgICAgICBmYiA9IDI1Ni4wOworCisgICAgZnggPSBmYSArIChmYiAtIGZhKSAqIChwZXJjZW50IC0gaW5kZXgpOworCisgICAgKmJ5dGVwb3MgPSAoMS4wIC8gMjU2LjApICogZnggKiB0b3RhbF9ieXRlczsKKworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgaWYgKG1wM3BhcnNlLT52YnJpX3NlZWtfdGFibGUgJiYgKHRvdGFsX2J5dGVzID0gbXAzcGFyc2UtPnZicmlfYnl0ZXMpICYmCisgICAgICAodG90YWxfdGltZSA9IG1wM3BhcnNlLT52YnJpX3RvdGFsX3RpbWUpKSB7CisgICAgZ2ludCBpLCBqOworICAgIGdkb3VibGUgYSwgYiwgZmEsIGZiOworCisgICAgaSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAodHMsIG1wM3BhcnNlLT52YnJpX3NlZWtfcG9pbnRzIC0gMSwgdG90YWxfdGltZSk7CisgICAgaSA9IENMQU1QIChpLCAwLCBtcDNwYXJzZS0+dmJyaV9zZWVrX3BvaW50cyAtIDEpOworCisgICAgYSA9IGdzdF9ndWludDY0X3RvX2dkb3VibGUgKGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoaSwgdG90YWxfdGltZSwKKyAgICAgICAgICAgIG1wM3BhcnNlLT52YnJpX3NlZWtfcG9pbnRzKSk7CisgICAgZmEgPSAwLjA7CisgICAgZm9yIChqID0gaTsgaiA+PSAwOyBqLS0pCisgICAgICBmYSArPSBtcDNwYXJzZS0+dmJyaV9zZWVrX3RhYmxlW2pdOworCisgICAgaWYgKGkgKyAxIDwgbXAzcGFyc2UtPnZicmlfc2Vla19wb2ludHMpIHsKKyAgICAgIGIgPSBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIChnc3RfdXRpbF91aW50NjRfc2NhbGUgKGkgKyAxLCB0b3RhbF90aW1lLAorICAgICAgICAgICAgICBtcDNwYXJzZS0+dmJyaV9zZWVrX3BvaW50cykpOworICAgICAgZmIgPSBmYSArIG1wM3BhcnNlLT52YnJpX3NlZWtfdGFibGVbaSArIDFdOworICAgIH0gZWxzZSB7CisgICAgICBiID0gZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSAodG90YWxfdGltZSk7CisgICAgICBmYiA9IHRvdGFsX2J5dGVzOworICAgIH0KKworICAgICpieXRlcG9zID0gZmEgKyAoKGZiIC0gZmEpIC8gKGIgLSBhKSkgKiAoZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSAodHMpIC0gYSk7CisKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbXBlZ19hdWRpb19wYXJzZV9ieXRlcG9zX3RvX3RpbWUgKEdzdE1wZWdBdWRpb1BhcnNlICogbXAzcGFyc2UsCisgICAgZ2ludDY0IGJ5dGVwb3MsIEdzdENsb2NrVGltZSAqIHRzKQoreworICBnaW50NjQgdG90YWxfYnl0ZXM7CisgIEdzdENsb2NrVGltZSB0b3RhbF90aW1lOworCisgIC8qIElmIFhJTkcgc2VlayB0YWJsZSBleGlzdHMgdXNlIHRoaXMgZm9yIGJ5dGUtPnRpbWUgY29udmVyc2lvbiAqLworICBpZiAoKG1wM3BhcnNlLT54aW5nX2ZsYWdzICYgWElOR19UT0NfRkxBRykgJiYKKyAgICAgICh0b3RhbF9ieXRlcyA9IG1wM3BhcnNlLT54aW5nX2J5dGVzKSAmJgorICAgICAgKHRvdGFsX3RpbWUgPSBtcDNwYXJzZS0+eGluZ190b3RhbF90aW1lKSkgeworICAgIGdkb3VibGUgZmEsIGZiLCBmeDsKKyAgICBnZG91YmxlIHBvczsKKyAgICBnaW50IGluZGV4OworCisgICAgcG9zID0gQ0xBTVAgKChieXRlcG9zICogMjU2LjApIC8gdG90YWxfYnl0ZXMsIDAuMCwgMjU2LjApOworICAgIGluZGV4ID0gQ0xBTVAgKHBvcywgMCwgMjU1KTsKKyAgICBmYSA9IG1wM3BhcnNlLT54aW5nX3NlZWtfdGFibGVfaW52ZXJzZVtpbmRleF07CisgICAgaWYgKGluZGV4IDwgMjU1KQorICAgICAgZmIgPSBtcDNwYXJzZS0+eGluZ19zZWVrX3RhYmxlX2ludmVyc2VbaW5kZXggKyAxXTsKKyAgICBlbHNlCisgICAgICBmYiA9IDEwMDAwLjA7CisKKyAgICBmeCA9IGZhICsgKGZiIC0gZmEpICogKHBvcyAtIGluZGV4KTsKKworICAgICp0cyA9ICgxLjAgLyAxMDAwMC4wKSAqIGZ4ICogZ3N0X3V0aWxfZ3VpbnQ2NF90b19nZG91YmxlICh0b3RhbF90aW1lKTsKKworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgaWYgKG1wM3BhcnNlLT52YnJpX3NlZWtfdGFibGUgJiYKKyAgICAgICh0b3RhbF9ieXRlcyA9IG1wM3BhcnNlLT52YnJpX2J5dGVzKSAmJgorICAgICAgKHRvdGFsX3RpbWUgPSBtcDNwYXJzZS0+dmJyaV90b3RhbF90aW1lKSkgeworICAgIGdpbnQgaSA9IDA7CisgICAgZ3VpbnQ2NCBzdW0gPSAwOworICAgIGdkb3VibGUgYSwgYiwgZmEsIGZiOworCisgICAgZG8geworICAgICAgc3VtICs9IG1wM3BhcnNlLT52YnJpX3NlZWtfdGFibGVbaV07CisgICAgICBpKys7CisgICAgfSB3aGlsZSAoaSArIDEgPCBtcDNwYXJzZS0+dmJyaV9zZWVrX3BvaW50cworICAgICAgICAmJiBzdW0gKyBtcDNwYXJzZS0+dmJyaV9zZWVrX3RhYmxlW2ldIDwgYnl0ZXBvcyk7CisgICAgaS0tOworCisgICAgYSA9IGdzdF9ndWludDY0X3RvX2dkb3VibGUgKHN1bSk7CisgICAgZmEgPSBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIChnc3RfdXRpbF91aW50NjRfc2NhbGUgKGksIHRvdGFsX3RpbWUsCisgICAgICAgICAgICBtcDNwYXJzZS0+dmJyaV9zZWVrX3BvaW50cykpOworCisgICAgaWYgKGkgKyAxIDwgbXAzcGFyc2UtPnZicmlfc2Vla19wb2ludHMpIHsKKyAgICAgIGIgPSBhICsgbXAzcGFyc2UtPnZicmlfc2Vla190YWJsZVtpICsgMV07CisgICAgICBmYiA9IGdzdF9ndWludDY0X3RvX2dkb3VibGUgKGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoaSArIDEsIHRvdGFsX3RpbWUsCisgICAgICAgICAgICAgIG1wM3BhcnNlLT52YnJpX3NlZWtfcG9pbnRzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGIgPSB0b3RhbF9ieXRlczsKKyAgICAgIGZiID0gZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSAodG90YWxfdGltZSk7CisgICAgfQorCisgICAgKnRzID0gZ3N0X2dkb3VibGVfdG9fZ3VpbnQ2NCAoZmEgKyAoKGZiIC0gZmEpIC8gKGIgLSBhKSkgKiAoYnl0ZXBvcyAtIGEpKTsKKworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tcGVnX2F1ZGlvX3BhcnNlX2NvbnZlcnQgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLCBHc3RGb3JtYXQgc3JjX2Zvcm1hdCwKKyAgICBnaW50NjQgc3JjX3ZhbHVlLCBHc3RGb3JtYXQgZGVzdF9mb3JtYXQsIGdpbnQ2NCAqIGRlc3RfdmFsdWUpCit7CisgIEdzdE1wZWdBdWRpb1BhcnNlICptcDNwYXJzZSA9IEdTVF9NUEVHX0FVRElPX1BBUlNFIChwYXJzZSk7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIGlmIChzcmNfZm9ybWF0ID09IEdTVF9GT1JNQVRfVElNRSAmJiBkZXN0X2Zvcm1hdCA9PSBHU1RfRk9STUFUX0JZVEVTKQorICAgIHJlcyA9CisgICAgICAgIGdzdF9tcGVnX2F1ZGlvX3BhcnNlX3RpbWVfdG9fYnl0ZXBvcyAobXAzcGFyc2UsIHNyY192YWx1ZSwgZGVzdF92YWx1ZSk7CisgIGVsc2UgaWYgKHNyY19mb3JtYXQgPT0gR1NUX0ZPUk1BVF9CWVRFUyAmJiBkZXN0X2Zvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUpCisgICAgcmVzID0gZ3N0X21wZWdfYXVkaW9fcGFyc2VfYnl0ZXBvc190b190aW1lIChtcDNwYXJzZSwgc3JjX3ZhbHVlLAorICAgICAgICAoR3N0Q2xvY2tUaW1lICopIGRlc3RfdmFsdWUpOworCisgIC8qIGlmIG5vIHRhYmxlcywgZmFsbCBiYWNrIHRvIGRlZmF1bHQgZXN0aW1hdGVkIHJhdGUgYmFzZWQgY29udmVyc2lvbiAqLworICBpZiAoIXJlcykKKyAgICByZXR1cm4gZ3N0X2Jhc2VfcGFyc2VfY29udmVydF9kZWZhdWx0IChwYXJzZSwgc3JjX2Zvcm1hdCwgc3JjX3ZhbHVlLAorICAgICAgICBkZXN0X2Zvcm1hdCwgZGVzdF92YWx1ZSk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tcGVnX2F1ZGlvX3BhcnNlX3ByZV9wdXNoX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lKQoreworICBHc3RNcGVnQXVkaW9QYXJzZSAqbXAzcGFyc2UgPSBHU1RfTVBFR19BVURJT19QQVJTRSAocGFyc2UpOworICBHc3RUYWdMaXN0ICp0YWdsaXN0ID0gTlVMTDsKKworICAvKiB3ZSB3aWxsIGNyZWF0ZSBhIHRhZ2xpc3QgKGlmIGFueSBvZiB0aGUgcGFyYW1ldGVycyBoYXMgY2hhbmdlZCkKKyAgICogdG8gYWRkIHRoZSB0YWdzIHRoYXQgY2hhbmdlZCAqLworICBpZiAobXAzcGFyc2UtPmxhc3RfcG9zdGVkX2NyYyAhPSBtcDNwYXJzZS0+bGFzdF9jcmMpIHsKKyAgICBnYm9vbGVhbiB1c2luZ19jcmM7CisKKyAgICBpZiAoIXRhZ2xpc3QpCisgICAgICB0YWdsaXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKworICAgIG1wM3BhcnNlLT5sYXN0X3Bvc3RlZF9jcmMgPSBtcDNwYXJzZS0+bGFzdF9jcmM7CisgICAgaWYgKG1wM3BhcnNlLT5sYXN0X3Bvc3RlZF9jcmMgPT0gQ1JDX1BST1RFQ1RFRCkgeworICAgICAgdXNpbmdfY3JjID0gVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgdXNpbmdfY3JjID0gRkFMU0U7CisgICAgfQorICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwgR1NUX1RBR19DUkMsCisgICAgICAgIHVzaW5nX2NyYywgTlVMTCk7CisgIH0KKworICBpZiAobXAzcGFyc2UtPmxhc3RfcG9zdGVkX2NoYW5uZWxfbW9kZSAhPSBtcDNwYXJzZS0+bGFzdF9tb2RlKSB7CisgICAgaWYgKCF0YWdsaXN0KQorICAgICAgdGFnbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisKKyAgICBtcDNwYXJzZS0+bGFzdF9wb3N0ZWRfY2hhbm5lbF9tb2RlID0gbXAzcGFyc2UtPmxhc3RfbW9kZTsKKworICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwgR1NUX1RBR19NT0RFLAorICAgICAgICBnc3RfbXBlZ19hdWRpb19jaGFubmVsX21vZGVfZ2V0X25pY2sgKG1wM3BhcnNlLT5sYXN0X21vZGUpLCBOVUxMKTsKKyAgfQorCisgIC8qIHRhZyBzZW5kaW5nIGRvbmUgbGF0ZSBlbm91Z2ggaW4gaG9vayB0byBlbnN1cmUgcGVuZGluZyBldmVudHMKKyAgICogaGF2ZSBhbHJlYWR5IGJlZW4gc2VudCAqLworICBpZiAodGFnbGlzdCAhPSBOVUxMIHx8ICFtcDNwYXJzZS0+c2VudF9jb2RlY190YWcpIHsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgaWYgKHRhZ2xpc3QgPT0gTlVMTCkKKyAgICAgIHRhZ2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgICAgLyogY29kZWMgdGFnICovCisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpKTsKKyAgICBpZiAoR19VTkxJS0VMWSAoY2FwcyA9PSBOVUxMKSkgeworICAgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdsaXN0KTsKKworICAgICAgaWYgKEdTVF9QQURfSVNfRkxVU0hJTkcgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSkpIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgZmx1c2hpbmciKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgbm90IG5lZ290aWF0ZWQhIik7CisgICAgICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICAgIH0KKyAgICB9CisgICAgZ3N0X3BiX3V0aWxzX2FkZF9jb2RlY19kZXNjcmlwdGlvbl90b190YWdfbGlzdCAodGFnbGlzdCwKKyAgICAgICAgR1NUX1RBR19BVURJT19DT0RFQywgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgaWYgKG1wM3BhcnNlLT5oZHJfYml0cmF0ZSA+IDAgJiYgbXAzcGFyc2UtPnhpbmdfYml0cmF0ZSA9PSAwICYmCisgICAgICAgIG1wM3BhcnNlLT52YnJpX2JpdHJhdGUgPT0gMCkgeworICAgICAgLyogV2UgZG9uJ3QgaGF2ZSBhIFZCUiBiaXRyYXRlLCBzbyBwb3N0IHRoZSBhdmFpbGFibGUgYml0cmF0ZSBhcworICAgICAgICogbm9taW5hbCBhbmQgbGV0IGJhc2VwYXJzZSBjYWxjdWxhdGUgdGhlIHJlYWwgYml0cmF0ZSAqLworICAgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICAgIEdTVF9UQUdfTk9NSU5BTF9CSVRSQVRFLCBtcDNwYXJzZS0+aGRyX2JpdHJhdGUsIE5VTEwpOworICAgIH0KKworICAgIC8qIGFsc28gc2lnbmFscyB0aGUgZW5kIG9mIGZpcnN0LWZyYW1lIHByb2Nlc3NpbmcgKi8KKyAgICBtcDNwYXJzZS0+c2VudF9jb2RlY190YWcgPSBUUlVFOworICB9CisKKyAgLyogaWYgdGhlIHRhZ2xpc3QgZXhpc3RzLCB3ZSBuZWVkIHRvIHVwZGF0ZSBpdCBzbyBpdCBnZXRzIHNlbnQgb3V0ICovCisgIGlmICh0YWdsaXN0KSB7CisgICAgZ3N0X2Jhc2VfcGFyc2VfbWVyZ2VfdGFncyAocGFyc2UsIHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSk7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdsaXN0KTsKKyAgfQorCisgIC8qIHVzdWFsIGNsaXBwaW5nIGFwcGxpZXMgKi8KKyAgZnJhbWUtPmZsYWdzIHw9IEdTVF9CQVNFX1BBUlNFX0ZSQU1FX0ZMQUdfQ0xJUDsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfZmllbGRzIChHc3RDYXBzICogY2FwcykKK3sKKyAgZ3VpbnQgaSwgbjsKKworICBuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpOworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgR3N0U3RydWN0dXJlICpzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSk7CisKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAocywgInBhcnNlZCIpOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9tcGVnX2F1ZGlvX3BhcnNlX2dldF9zaW5rX2NhcHMgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RDYXBzICpwZWVyY2FwcywgKnRlbXBsOworICBHc3RDYXBzICpyZXM7CisKKyAgdGVtcGwgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU0lOS19QQUQgKHBhcnNlKSk7CisgIGlmIChmaWx0ZXIpIHsKKyAgICBHc3RDYXBzICpmY29weSA9IGdzdF9jYXBzX2NvcHkgKGZpbHRlcik7CisgICAgLyogUmVtb3ZlIHRoZSBmaWVsZHMgd2UgY29udmVydCAqLworICAgIHJlbW92ZV9maWVsZHMgKGZjb3B5KTsKKyAgICBwZWVyY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChwYXJzZSksIGZjb3B5KTsKKyAgICBnc3RfY2Fwc191bnJlZiAoZmNvcHkpOworICB9IGVsc2UKKyAgICBwZWVyY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChwYXJzZSksIE5VTEwpOworCisgIGlmIChwZWVyY2FwcykgeworICAgIC8qIFJlbW92ZSB0aGUgcGFyc2VkIGZpZWxkICovCisgICAgcGVlcmNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChwZWVyY2Fwcyk7CisgICAgcmVtb3ZlX2ZpZWxkcyAocGVlcmNhcHMpOworCisgICAgcmVzID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKHBlZXJjYXBzLCB0ZW1wbCwgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcmNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmICh0ZW1wbCk7CisgIH0gZWxzZSB7CisgICAgcmVzID0gdGVtcGw7CisgIH0KKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uOworCisgICAgaW50ZXJzZWN0aW9uID0KKyAgICAgICAgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgcmVzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmIChyZXMpOworICAgIHJlcyA9IGludGVyc2VjdGlvbjsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9nc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmggYi9nc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU1NzZiZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuaApAQCAtMCwwICsxLDExMyBAQAorLyogR1N0cmVhbWVyIE1QRUcgYXVkaW8gcGFyc2VyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1dyB1c2VycyBzZiBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIENvbnRhY3Q6IFN0ZWZhbiBLb3N0IDxzdGVmYW4ua29zdEBub2tpYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9NUEVHX0FVRElPX1BBUlNFX0hfXworI2RlZmluZSBfX0dTVF9NUEVHX0FVRElPX1BBUlNFX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2VwYXJzZS5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfTVBFR19BVURJT19QQVJTRSBcCisgIChnc3RfbXBlZ19hdWRpb19wYXJzZV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfTVBFR19BVURJT19QQVJTRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLCBHU1RfVFlQRV9NUEVHX0FVRElPX1BBUlNFLCBHc3RNcGVnQXVkaW9QYXJzZSkpCisjZGVmaW5lIEdTVF9NUEVHX0FVRElPX1BBUlNFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLCBHU1RfVFlQRV9NUEVHX0FVRElPX1BBUlNFLCBHc3RNcGVnQXVkaW9QYXJzZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX01QRUdfQVVESU9fUEFSU0Uob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSwgR1NUX1RZUEVfTVBFR19BVURJT19QQVJTRSkpCisjZGVmaW5lIEdTVF9JU19NUEVHX0FVRElPX1BBUlNFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLCBHU1RfVFlQRV9NUEVHX0FVRElPX1BBUlNFKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE1wZWdBdWRpb1BhcnNlIEdzdE1wZWdBdWRpb1BhcnNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE1wZWdBdWRpb1BhcnNlQ2xhc3MgR3N0TXBlZ0F1ZGlvUGFyc2VDbGFzczsKKworLyoqCisgKiBHc3RNcGVnQXVkaW9QYXJzZToKKyAqCisgKiBUaGUgb3BhcXVlIEdzdE1wZWdBdWRpb1BhcnNlIG9iamVjdAorICovCitzdHJ1Y3QgX0dzdE1wZWdBdWRpb1BhcnNlIHsKKyAgR3N0QmFzZVBhcnNlIGJhc2VwYXJzZTsKKworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgZ2ludCAgICAgICAgIHJhdGU7CisgIGdpbnQgICAgICAgICBjaGFubmVsczsKKyAgZ2ludCAgICAgICAgIGxheWVyOworICBnaW50ICAgICAgICAgdmVyc2lvbjsKKworICBHc3RDbG9ja1RpbWUgbWF4X2JpdHJlc2Vydm9pcjsKKyAgLyogc2FtcGxlcyBwZXIgZnJhbWUgKi8KKyAgZ2ludCAgICAgICAgc3BmOworCisgIGdpbnQgICAgICAgICBmcmVlcmF0ZTsKKworICBnYm9vbGVhbiAgICAgc2VudF9jb2RlY190YWc7CisgIGd1aW50ICAgICAgICBsYXN0X3Bvc3RlZF9iaXRyYXRlOworICBnaW50ICAgICAgICAgbGFzdF9wb3N0ZWRfY3JjLCBsYXN0X2NyYzsKKyAgZ3VpbnQgICAgICAgIGxhc3RfcG9zdGVkX2NoYW5uZWxfbW9kZSwgbGFzdF9tb2RlOworCisgIC8qIEJpdHJhdGUgZnJvbSBub24tdmJyIGhlYWRlcnMgKi8KKyAgZ3VpbnQzMiAgICAgIGhkcl9iaXRyYXRlOworCisgIC8qIFhpbmcgaW5mbyAqLworICBndWludDMyICAgICAgeGluZ19mbGFnczsKKyAgZ3VpbnQzMiAgICAgIHhpbmdfZnJhbWVzOworICBHc3RDbG9ja1RpbWUgeGluZ190b3RhbF90aW1lOworICBndWludDMyICAgICAgeGluZ19ieXRlczsKKyAgLyogcGVyY2VudCAtPiBmaWxlcG9zIG1hcHBpbmcgKi8KKyAgZ3VjaGFyICAgICAgIHhpbmdfc2Vla190YWJsZVsxMDBdOworICAvKiBmaWxlcG9zIC0+IHBlcmNlbnQgbWFwcGluZyAqLworICBndWludDE2ICAgICAgeGluZ19zZWVrX3RhYmxlX2ludmVyc2VbMjU2XTsKKyAgZ3VpbnQzMiAgICAgIHhpbmdfdmJyX3NjYWxlOworICBndWludCAgICAgICAgeGluZ19iaXRyYXRlOworCisgIC8qIFZCUkkgaW5mbyAqLworICBndWludDMyICAgICAgdmJyaV9mcmFtZXM7CisgIEdzdENsb2NrVGltZSB2YnJpX3RvdGFsX3RpbWU7CisgIGd1aW50MzIgICAgICB2YnJpX2J5dGVzOworICBndWludCAgICAgICAgdmJyaV9iaXRyYXRlOworICBndWludCAgICAgICAgdmJyaV9zZWVrX3BvaW50czsKKyAgZ3VpbnQzMiAgICAgKnZicmlfc2Vla190YWJsZTsKKyAgZ2Jvb2xlYW4gICAgIHZicmlfdmFsaWQ7CisKKyAgLyogTEFNRSBpbmZvICovCisgIGd1aW50MzIgICAgICBlbmNvZGVyX2RlbGF5OworICBndWludDMyICAgICAgZW5jb2Rlcl9wYWRkaW5nOworfTsKKworLyoqCisgKiBHc3RNcGVnQXVkaW9QYXJzZUNsYXNzOgorICogQHBhcmVudF9jbGFzczogRWxlbWVudCBwYXJlbnQgY2xhc3MuCisgKgorICogVGhlIG9wYXF1ZSBHc3RNcGVnQXVkaW9QYXJzZUNsYXNzIGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdE1wZWdBdWRpb1BhcnNlQ2xhc3MgeworICBHc3RCYXNlUGFyc2VDbGFzcyBiYXNlcGFyc2VfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfbXBlZ19hdWRpb19wYXJzZV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9NUEVHX0FVRElPX1BBUlNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5jIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYzM5ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9wYXJzZXJzL2dzdHNiY3BhcnNlLmMKQEAgLTAsMCArMSw1MzMgQEAKKy8qIEdTdHJlYW1lciBTQkMgYXVkaW8gcGFyc2VyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgQ29sbGFib3JhIEx0ZC4gPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtc2JjcGFyc2UKKyAqIEBzZWVfYWxzbzogc2JjZGVjLCBzYmNlbmMKKyAqCisgKiBUaGUgc2JjcGFyc2UgZWxlbWVudCB3aWxsIHBhcnNlIGEgYmx1ZXRvb3RoIFNCQyBhdWRpbyBzdHJlYW0gaW50bworICogZnJhbWVzIGFuZCB0aW1lc3RhbXAgdGhlbSBwcm9wZXJseS4KKyAqCisgKiBTaW5jZTogMS4yLjAKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RzYmNwYXJzZS5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L3RhZy90YWcuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9iYXNlLmg+CisjaW5jbHVkZSA8Z3N0L3BidXRpbHMvcGJ1dGlscy5oPgorCisjZGVmaW5lIFNCQ19TWU5DQllURSAweDlDCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHNiY3BhcnNlX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHNiY3BhcnNlX2RlYnVnCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXNiYywgcGFyc2VkID0gKGJvb2xlYW4pIHRydWUsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgWyAxLCAyIF0sICIKKyAgICAgICAgInJhdGUgPSAoaW50KSB7IDE2MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwIH0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXNiYyIpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9zYmNfcGFyc2Vfc3RhcnQgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc2JjX3BhcnNlX3N0b3AgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9zYmNfcGFyc2VfaGFuZGxlX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lLCBnaW50ICogc2tpcHNpemUpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3NiY19wYXJzZV9wcmVfcHVzaF9mcmFtZSAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3NiY19wYXJzZV9nZXRfc2lua19jYXBzIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RDYXBzICogZmlsdGVyKTsKKworc3RhdGljIGd1aW50OCBnc3Rfc2JjX2NhbGN1bGF0ZV9jcmM4IChjb25zdCBndWludDggKiBkYXRhLCBnaW50IGJpdHNfY3JjKTsKK3N0YXRpYyBnc2l6ZSBnc3Rfc2JjX2NhbGNfZnJhbWVsZW4gKGd1aW50IHN1YmJhbmRzLCBHc3RTYmNDaGFubmVsTW9kZSBjaF9tb2RlLAorICAgIGd1aW50IGJsb2NrcywgZ3VpbnQgYml0cG9vbCk7CitzdGF0aWMgZ3NpemUgZ3N0X3NiY19wYXJzZV9oZWFkZXIgKGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50ICogcmF0ZSwKKyAgICBndWludCAqIG5fYmxvY2tzLCBHc3RTYmNDaGFubmVsTW9kZSAqIGNoX21vZGUsCisgICAgR3N0U2JjQWxsb2NhdGlvbk1ldGhvZCAqIGFsbG9jX21ldGhvZCwgZ3VpbnQgKiBuX3N1YmJhbmRzLCBndWludCAqIGJpdHBvb2wpOworCisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3Rfc2JjX3BhcnNlX3BhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0U2JjUGFyc2UsIGdzdF9zYmNfcGFyc2UsIEdTVF9UWVBFX0JBU0VfUEFSU0UpOworCitzdGF0aWMgdm9pZAorZ3N0X3NiY19wYXJzZV9jbGFzc19pbml0IChHc3RTYmNQYXJzZUNsYXNzICoga2xhc3MpCit7CisgIEdzdEJhc2VQYXJzZUNsYXNzICpiYXNlcGFyc2VfY2xhc3MgPSBHU1RfQkFTRV9QQVJTRV9DTEFTUyAoa2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChzYmNwYXJzZV9kZWJ1ZywgInNiY3BhcnNlIiwgMCwgIlNCQyBhdWRpbyBwYXJzZXIiKTsKKworICBiYXNlcGFyc2VfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zYmNfcGFyc2Vfc3RhcnQpOworICBiYXNlcGFyc2VfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NiY19wYXJzZV9zdG9wKTsKKyAgYmFzZXBhcnNlX2NsYXNzLT5wcmVfcHVzaF9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NiY19wYXJzZV9wcmVfcHVzaF9mcmFtZSk7CisgIGJhc2VwYXJzZV9jbGFzcy0+aGFuZGxlX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2JjX3BhcnNlX2hhbmRsZV9mcmFtZSk7CisgIGJhc2VwYXJzZV9jbGFzcy0+Z2V0X3NpbmtfY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NiY19wYXJzZV9nZXRfc2lua19jYXBzKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNyY19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzaW5rX2ZhY3RvcnkpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJTQkMgYXVkaW8gcGFyc2VyIiwKKyAgICAgICJDb2RlYy9QYXJzZXIvQXVkaW8iLCAiUGFyc2VzIGFuIFNCQyBibHVldG9vdGggYXVkaW8gc3RyZWFtIiwKKyAgICAgICJUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zYmNfcGFyc2VfcmVzZXQgKEdzdFNiY1BhcnNlICogc2JjcGFyc2UpCit7CisgIHNiY3BhcnNlLT5hbGxvY19tZXRob2QgPSBHU1RfU0JDX0FMTE9DQVRJT05fTUVUSE9EX0lOVkFMSUQ7CisgIHNiY3BhcnNlLT5jaF9tb2RlID0gR1NUX1NCQ19DSEFOTkVMX01PREVfSU5WQUxJRDsKKyAgc2JjcGFyc2UtPnJhdGUgPSAtMTsKKyAgc2JjcGFyc2UtPm5fYmxvY2tzID0gLTE7CisgIHNiY3BhcnNlLT5uX3N1YmJhbmRzID0gLTE7CisgIHNiY3BhcnNlLT5iaXRwb29sID0gLTE7CisgIHNiY3BhcnNlLT5zZW50X2NvZGVjX3RhZyA9IEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NiY19wYXJzZV9pbml0IChHc3RTYmNQYXJzZSAqIHNiY3BhcnNlKQoreworICBnc3Rfc2JjX3BhcnNlX3Jlc2V0IChzYmNwYXJzZSk7CisgIEdTVF9QQURfU0VUX0FDQ0VQVF9JTlRFUlNFQ1QgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChzYmNwYXJzZSkpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChzYmNwYXJzZSkpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zYmNfcGFyc2Vfc3RhcnQgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKQoreworICBnc3RfYmFzZV9wYXJzZV9zZXRfbWluX2ZyYW1lX3NpemUgKHBhcnNlLAorICAgICAgZ3N0X3NiY19jYWxjX2ZyYW1lbGVuICg0LCBHU1RfU0JDX0NIQU5ORUxfTU9ERV9NT05PLCA0LCAyKSk7CisKKyAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X2hhc190aW1pbmdfaW5mbyAocGFyc2UsIEZBTFNFKTsKKworICBnc3RfYmFzZV9wYXJzZV9zZXRfc3luY2FibGUgKHBhcnNlLCBUUlVFKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2JjX3BhcnNlX3N0b3AgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKQoreworICBnc3Rfc2JjX3BhcnNlX3Jlc2V0IChHU1RfU0JDX1BBUlNFIChwYXJzZSkpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyICoKK2dzdF9zYmNfY2hhbm5lbF9tb2RlX2dldF9uYW1lIChHc3RTYmNDaGFubmVsTW9kZSBjaF9tb2RlKQoreworICBzd2l0Y2ggKGNoX21vZGUpIHsKKyAgICBjYXNlIEdTVF9TQkNfQ0hBTk5FTF9NT0RFX01PTk86CisgICAgICByZXR1cm4gIm1vbm8iOworICAgIGNhc2UgR1NUX1NCQ19DSEFOTkVMX01PREVfRFVBTDoKKyAgICAgIHJldHVybiAiZHVhbCI7CisgICAgY2FzZSBHU1RfU0JDX0NIQU5ORUxfTU9ERV9TVEVSRU86CisgICAgICByZXR1cm4gInN0ZXJlbyI7CisgICAgY2FzZSBHU1RfU0JDX0NIQU5ORUxfTU9ERV9KT0lOVF9TVEVSRU86CisgICAgICByZXR1cm4gImpvaW50IjsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuICJpbnZhbGlkIjsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyICoKK2dzdF9zYmNfYWxsb2NhdGlvbl9tZXRob2RfZ2V0X25hbWUgKEdzdFNiY0FsbG9jYXRpb25NZXRob2QgYWxsb2NfbWV0aG9kKQoreworICBzd2l0Y2ggKGFsbG9jX21ldGhvZCkgeworICAgIGNhc2UgR1NUX1NCQ19BTExPQ0FUSU9OX01FVEhPRF9TTlI6CisgICAgICByZXR1cm4gInNuciI7CisgICAgY2FzZSBHU1RfU0JDX0FMTE9DQVRJT05fTUVUSE9EX0xPVURORVNTOgorICAgICAgcmV0dXJuICJsb3VkbmVzcyI7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAiaW52YWxpZCI7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfc2JjX3BhcnNlX2hhbmRsZV9mcmFtZSAoR3N0QmFzZVBhcnNlICogcGFyc2UsIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUsCisgICAgZ2ludCAqIHNraXBzaXplKQoreworICBHc3RTYmNQYXJzZSAqc2JjcGFyc2UgPSBHU1RfU0JDX1BBUlNFIChwYXJzZSk7CisgIEdzdFNiY0FsbG9jYXRpb25NZXRob2QgYWxsb2NfbWV0aG9kID0gR1NUX1NCQ19BTExPQ0FUSU9OX01FVEhPRF9JTlZBTElEOworICBHc3RTYmNDaGFubmVsTW9kZSBjaF9tb2RlID0gR1NUX1NCQ19DSEFOTkVMX01PREVfSU5WQUxJRDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50IHJhdGUgPSAwLCBuX2Jsb2NrcyA9IDAsIG5fc3ViYmFuZHMgPSAwLCBiaXRwb29sID0gMDsKKyAgZ3NpemUgZnJhbWVfbGVuLCBuZXh0X2xlbjsKKyAgZ2ludCBpLCBtYXhfZnJhbWVzOworCisgIGdzdF9idWZmZXJfbWFwIChmcmFtZS0+YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIGdfYXNzZXJ0IChtYXAuc2l6ZSA+PSA2KTsKKworICBmcmFtZV9sZW4gPSBnc3Rfc2JjX3BhcnNlX2hlYWRlciAobWFwLmRhdGEsICZyYXRlLCAmbl9ibG9ja3MsICZjaF9tb2RlLAorICAgICAgJmFsbG9jX21ldGhvZCwgJm5fc3ViYmFuZHMsICZiaXRwb29sKTsKKworICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJmcmFtZV9sZW46ICV1IiwgKGd1aW50KSBmcmFtZV9sZW4pOworCisgIGlmIChmcmFtZV9sZW4gPT0gMCkKKyAgICBnb3RvIHJlc3luYzsKKworICBpZiAoc2JjcGFyc2UtPmFsbG9jX21ldGhvZCAhPSBhbGxvY19tZXRob2QKKyAgICAgIHx8IHNiY3BhcnNlLT5jaF9tb2RlICE9IGNoX21vZGUKKyAgICAgIHx8IHNiY3BhcnNlLT5yYXRlICE9IHJhdGUKKyAgICAgIHx8IHNiY3BhcnNlLT5uX2Jsb2NrcyAhPSBuX2Jsb2NrcworICAgICAgfHwgc2JjcGFyc2UtPm5fc3ViYmFuZHMgIT0gbl9zdWJiYW5kcyB8fCBzYmNwYXJzZS0+Yml0cG9vbCAhPSBiaXRwb29sKSB7CisgICAgZ3VpbnQgYXZnX2JpdHJhdGU7CisgICAgR3N0Q2FwcyAqY2FwczsKKworICAgIC8qIEZJWE1FOiBkbyBhbGwgb2YgdGhlc2UgbmVlZCB0byBiZSBpbiB0aGUgY2Fwcz8gKi8KKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtc2JjIiwgInJhdGUiLCBHX1RZUEVfSU5ULCByYXRlLAorICAgICAgICAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAoY2hfbW9kZSA9PSBHU1RfU0JDX0NIQU5ORUxfTU9ERV9NT05PKSA/IDEgOiAyLAorICAgICAgICAiY2hhbm5lbC1tb2RlIiwgR19UWVBFX1NUUklORywgZ3N0X3NiY19jaGFubmVsX21vZGVfZ2V0X25hbWUgKGNoX21vZGUpLAorICAgICAgICAiYmxvY2tzIiwgR19UWVBFX0lOVCwgbl9ibG9ja3MsICJzdWJiYW5kcyIsIEdfVFlQRV9JTlQsIG5fc3ViYmFuZHMsCisgICAgICAgICJhbGxvY2F0aW9uLW1ldGhvZCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgIGdzdF9zYmNfYWxsb2NhdGlvbl9tZXRob2RfZ2V0X25hbWUgKGFsbG9jX21ldGhvZCksCisgICAgICAgICJiaXRwb29sIiwgR19UWVBFX0lOVCwgYml0cG9vbCwgInBhcnNlZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKworICAgIEdTVF9JTkZPX09CSkVDVCAoc2JjcGFyc2UsICJjYXBzIGNoYW5nZWQgdG8gJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChzYmNwYXJzZSksCisgICAgICAgIGdzdF9ldmVudF9uZXdfY2FwcyAoY2FwcykpOworCisgICAgYXZnX2JpdHJhdGUgPSAoOCAqIGZyYW1lX2xlbiAqIHJhdGUpIC8gKG5fc3ViYmFuZHMgKiBuX2Jsb2Nrcyk7CisgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X2F2ZXJhZ2VfYml0cmF0ZSAocGFyc2UsIGF2Z19iaXRyYXRlKTsKKworICAgIGdzdF9iYXNlX3BhcnNlX3NldF9mcmFtZV9yYXRlIChwYXJzZSwgcmF0ZSwgbl9zdWJiYW5kcyAqIG5fYmxvY2tzLCAwLCAwKTsKKworICAgIHNiY3BhcnNlLT5hbGxvY19tZXRob2QgPSBhbGxvY19tZXRob2Q7CisgICAgc2JjcGFyc2UtPmNoX21vZGUgPSBjaF9tb2RlOworICAgIHNiY3BhcnNlLT5yYXRlID0gcmF0ZTsKKyAgICBzYmNwYXJzZS0+bl9ibG9ja3MgPSBuX2Jsb2NrczsKKyAgICBzYmNwYXJzZS0+bl9zdWJiYW5kcyA9IG5fc3ViYmFuZHM7CisgICAgc2JjcGFyc2UtPmJpdHBvb2wgPSBiaXRwb29sOworCisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICB9CisKKyAgaWYgKGZyYW1lX2xlbiA+IG1hcC5zaXplKQorICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKGZyYW1lLT5idWZmZXIpID0gR1NUX0JVRkZFUl9PRkZTRVRfTk9ORTsKKyAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChmcmFtZS0+YnVmZmVyKSA9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkU7CisKKyAgLyogY29tcGxldGVseSBhcmJpdHJhcnkgbGltaXQsIHdlIG9ubHkgcHJvY2VzcyBkYXRhIHdlIGFscmVhZHkgaGF2ZSwKKyAgICogc28gd2UgYXJlbid0IGludHJvZHVjaW5nIGxhdGVuY3kgaGVyZSAqLworICBtYXhfZnJhbWVzID0gTUlOIChtYXAuc2l6ZSAvIGZyYW1lX2xlbiwgbl9ibG9ja3MgKiBuX3N1YmJhbmRzICogNSk7CisgIEdTVF9MT0dfT0JKRUNUIChzYmNwYXJzZSwgInBhcnNpbmcgdXAgdG8gJWQgZnJhbWVzIiwgbWF4X2ZyYW1lcyk7CisKKyAgZm9yIChpID0gMTsgaSA8IG1heF9mcmFtZXM7ICsraSkgeworICAgIG5leHRfbGVuID0gZ3N0X3NiY19wYXJzZV9oZWFkZXIgKG1hcC5kYXRhICsgKGkgKiBmcmFtZV9sZW4pLCAmcmF0ZSwKKyAgICAgICAgJm5fYmxvY2tzLCAmY2hfbW9kZSwgJmFsbG9jX21ldGhvZCwgJm5fc3ViYmFuZHMsICZiaXRwb29sKTsKKworICAgIGlmIChuZXh0X2xlbiAhPSBmcmFtZV9sZW4gfHwgc2JjcGFyc2UtPmFsbG9jX21ldGhvZCAhPSBhbGxvY19tZXRob2QgfHwKKyAgICAgICAgc2JjcGFyc2UtPmNoX21vZGUgIT0gY2hfbW9kZSB8fCBzYmNwYXJzZS0+cmF0ZSAhPSByYXRlIHx8CisgICAgICAgIHNiY3BhcnNlLT5uX2Jsb2NrcyAhPSBuX2Jsb2NrcyB8fCBzYmNwYXJzZS0+bl9zdWJiYW5kcyAhPSBuX3N1YmJhbmRzIHx8CisgICAgICAgIHNiY3BhcnNlLT5iaXRwb29sICE9IGJpdHBvb2wpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBHU1RfTE9HX09CSkVDVCAoc2JjcGFyc2UsICJwYWNraW5nICVkIFNCQyBmcmFtZXMgaW50byBuZXh0IG91dHB1dCBidWZmZXIiLCBpKTsKKworICAvKiBOb3RlOiBsb2NhbCBuX3N1YmJhbmRzIGFuZCBuX2Jsb2NrcyB2YXJpYWJsZXMgbWlnaHQgYmUgdGFpbnRlZCBpZiB3ZQorICAgKiBiYWlsZWQgb3V0IG9mIHRoZSBsb29wIGFib3ZlIGJlY2F1c2Ugb2YgYSBoZWFkZXIgY29uZmlndXJhdGlvbiBtaXNtYXRjaCAqLworICBnc3RfYmFzZV9wYXJzZV9zZXRfZnJhbWVfcmF0ZSAocGFyc2UsIHJhdGUsCisgICAgICBzYmNwYXJzZS0+bl9zdWJiYW5kcyAqIHNiY3BhcnNlLT5uX2Jsb2NrcyAqIGksIDAsIDApOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGZyYW1lLT5idWZmZXIsICZtYXApOworICByZXR1cm4gZ3N0X2Jhc2VfcGFyc2VfZmluaXNoX2ZyYW1lIChwYXJzZSwgZnJhbWUsIGkgKiBmcmFtZV9sZW4pOworCityZXN5bmM6CisgIHsKKyAgICBjb25zdCBndWludDggKnBvc3NpYmxlX3N5bmM7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIm5vIHN5bmMsIHJlc3luY2luZyIpOworCisgICAgcG9zc2libGVfc3luYyA9IG1lbWNociAobWFwLmRhdGEsIFNCQ19TWU5DQllURSwgbWFwLnNpemUpOworCisgICAgaWYgKHBvc3NpYmxlX3N5bmMgIT0gTlVMTCkKKyAgICAgICpza2lwc2l6ZSA9IChnaW50KSAocG9zc2libGVfc3luYyAtIG1hcC5kYXRhKTsKKyAgICBlbHNlCisgICAgICAqc2tpcHNpemUgPSBtYXAuc2l6ZTsKKworICAgIGdzdF9idWZmZXJfdW5tYXAgKGZyYW1lLT5idWZmZXIsICZtYXApOworCisgICAgLyogd2UgY291bGQgb3B0aW1pc2UgdGhpbmdzIGhlcmUgYnkgbG9vcGluZyBvdmVyIHRoZSBkYXRhIGFuZCBjaGVja2luZworICAgICAqIHdoZXRoZXIgdGhlIHN5bmMgaXMgZ29vZCBvciBub3QgaW5zdGVhZCBvZiBoYW5kaW5nIGNvbnRyb2wgYmFjayB0bworICAgICAqIHRoZSBiYXNlIGNsYXNzIGp1c3QgdG8gYmUgY2FsbGVkIGFnYWluICovCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CituZWVkX21vcmVfZGF0YToKKyAgeworICAgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgIm5lZWQgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcywgYnV0IG9ubHkgaGF2ZSAlIiBHX0dTSVpFX0ZPUk1BVCwKKyAgICAgICAgZnJhbWVfbGVuLCBtYXAuc2l6ZSk7CisgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplIChwYXJzZSwgZnJhbWVfbGVuKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChmcmFtZS0+YnVmZmVyLCAmbWFwKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9maWVsZHMgKEdzdENhcHMgKiBjYXBzKQoreworICBndWludCBpLCBuOworCisgIG4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCBpKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzLCAicGFyc2VkIik7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3NiY19wYXJzZV9nZXRfc2lua19jYXBzIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0Q2FwcyAqcGVlcmNhcHMsICp0ZW1wbDsKKyAgR3N0Q2FwcyAqcmVzOworCisgIHRlbXBsID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChwYXJzZSkpOworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqZmNvcHkgPSBnc3RfY2Fwc19jb3B5IChmaWx0ZXIpOworICAgIC8qIFJlbW92ZSB0aGUgZmllbGRzIHdlIGNvbnZlcnQgKi8KKyAgICByZW1vdmVfZmllbGRzIChmY29weSk7CisgICAgcGVlcmNhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpLCBmY29weSk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGZjb3B5KTsKKyAgfSBlbHNlCisgICAgcGVlcmNhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpLCBOVUxMKTsKKworICBpZiAocGVlcmNhcHMpIHsKKyAgICAvKiBSZW1vdmUgdGhlIHBhcnNlZCBmaWVsZCAqLworICAgIHBlZXJjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAocGVlcmNhcHMpOworICAgIHJlbW92ZV9maWVsZHMgKHBlZXJjYXBzKTsKKworICAgIHJlcyA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChwZWVyY2FwcywgdGVtcGwsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGVtcGwpOworICB9IGVsc2UgeworICAgIHJlcyA9IHRlbXBsOworICB9CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKmludGVyc2VjdGlvbjsKKworICAgIGludGVyc2VjdGlvbiA9CisgICAgICAgIGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHJlcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmVzKTsKKyAgICByZXMgPSBpbnRlcnNlY3Rpb247CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgY29uc3QgZ3VpbnQ4IGNyY190YWJsZVsyNTZdID0geworICAweDAwLCAweDFELCAweDNBLCAweDI3LCAweDc0LCAweDY5LCAweDRFLCAweDUzLAorICAweEU4LCAweEY1LCAweEQyLCAweENGLCAweDlDLCAweDgxLCAweEE2LCAweEJCLAorICAweENELCAweEQwLCAweEY3LCAweEVBLCAweEI5LCAweEE0LCAweDgzLCAweDlFLAorICAweDI1LCAweDM4LCAweDFGLCAweDAyLCAweDUxLCAweDRDLCAweDZCLCAweDc2LAorICAweDg3LCAweDlBLCAweEJELCAweEEwLCAweEYzLCAweEVFLCAweEM5LCAweEQ0LAorICAweDZGLCAweDcyLCAweDU1LCAweDQ4LCAweDFCLCAweDA2LCAweDIxLCAweDNDLAorICAweDRBLCAweDU3LCAweDcwLCAweDZELCAweDNFLCAweDIzLCAweDA0LCAweDE5LAorICAweEEyLCAweEJGLCAweDk4LCAweDg1LCAweEQ2LCAweENCLCAweEVDLCAweEYxLAorICAweDEzLCAweDBFLCAweDI5LCAweDM0LCAweDY3LCAweDdBLCAweDVELCAweDQwLAorICAweEZCLCAweEU2LCAweEMxLCAweERDLCAweDhGLCAweDkyLCAweEI1LCAweEE4LAorICAweERFLCAweEMzLCAweEU0LCAweEY5LCAweEFBLCAweEI3LCAweDkwLCAweDhELAorICAweDM2LCAweDJCLCAweDBDLCAweDExLCAweDQyLCAweDVGLCAweDc4LCAweDY1LAorICAweDk0LCAweDg5LCAweEFFLCAweEIzLCAweEUwLCAweEZELCAweERBLCAweEM3LAorICAweDdDLCAweDYxLCAweDQ2LCAweDVCLCAweDA4LCAweDE1LCAweDMyLCAweDJGLAorICAweDU5LCAweDQ0LCAweDYzLCAweDdFLCAweDJELCAweDMwLCAweDE3LCAweDBBLAorICAweEIxLCAweEFDLCAweDhCLCAweDk2LCAweEM1LCAweEQ4LCAweEZGLCAweEUyLAorICAweDI2LCAweDNCLCAweDFDLCAweDAxLCAweDUyLCAweDRGLCAweDY4LCAweDc1LAorICAweENFLCAweEQzLCAweEY0LCAweEU5LCAweEJBLCAweEE3LCAweDgwLCAweDlELAorICAweEVCLCAweEY2LCAweEQxLCAweENDLCAweDlGLCAweDgyLCAweEE1LCAweEI4LAorICAweDAzLCAweDFFLCAweDM5LCAweDI0LCAweDc3LCAweDZBLCAweDRELCAweDUwLAorICAweEExLCAweEJDLCAweDlCLCAweDg2LCAweEQ1LCAweEM4LCAweEVGLCAweEYyLAorICAweDQ5LCAweDU0LCAweDczLCAweDZFLCAweDNELCAweDIwLCAweDA3LCAweDFBLAorICAweDZDLCAweDcxLCAweDU2LCAweDRCLCAweDE4LCAweDA1LCAweDIyLCAweDNGLAorICAweDg0LCAweDk5LCAweEJFLCAweEEzLCAweEYwLCAweEVELCAweENBLCAweEQ3LAorICAweDM1LCAweDI4LCAweDBGLCAweDEyLCAweDQxLCAweDVDLCAweDdCLCAweDY2LAorICAweERELCAweEMwLCAweEU3LCAweEZBLCAweEE5LCAweEI0LCAweDkzLCAweDhFLAorICAweEY4LCAweEU1LCAweEMyLCAweERGLCAweDhDLCAweDkxLCAweEI2LCAweEFCLAorICAweDEwLCAweDBELCAweDJBLCAweDM3LCAweDY0LCAweDc5LCAweDVFLCAweDQzLAorICAweEIyLCAweEFGLCAweDg4LCAweDk1LCAweEM2LCAweERCLCAweEZDLCAweEUxLAorICAweDVBLCAweDQ3LCAweDYwLCAweDdELCAweDJFLCAweDMzLCAweDE0LCAweDA5LAorICAweDdGLCAweDYyLCAweDQ1LCAweDU4LCAweDBCLCAweDE2LCAweDMxLCAweDJDLAorICAweDk3LCAweDhBLCAweEFELCAweEIwLCAweEUzLCAweEZFLCAweEQ5LCAweEM0Cit9OworCitzdGF0aWMgZ3VpbnQ4Citnc3Rfc2JjX2NhbGN1bGF0ZV9jcmM4IChjb25zdCBndWludDggKiBkYXRhLCBnaW50IGNyY19iaXRzKQoreworICBndWludDggY3JjID0gMHgwZjsKKyAgZ3VpbnQ4IG9jdGV0OworCisgIHdoaWxlIChjcmNfYml0cyA+PSA4KSB7CisgICAgY3JjID0gY3JjX3RhYmxlW2NyYyBeICpkYXRhXTsKKyAgICBjcmNfYml0cyAtPSA4OworICAgICsrZGF0YTsKKyAgfQorCisgIG9jdGV0ID0gKmRhdGE7CisgIHdoaWxlIChjcmNfYml0cyA+IDApIHsKKyAgICBnY2hhciBiaXQgPSAoKG9jdGV0IF4gY3JjKSAmIDB4ODApID4+IDc7CisKKyAgICBjcmMgPSAoKGNyYyAmIDB4N2YpIDw8IDEpIF4gKGJpdCA/IDB4MWQgOiAwKTsKKworICAgIG9jdGV0ID0gb2N0ZXQgPDwgMTsKKyAgICAtLWNyY19iaXRzOworICB9CisKKyAgcmV0dXJuIGNyYzsKK30KKworc3RhdGljIGdzaXplCitnc3Rfc2JjX2NhbGNfZnJhbWVsZW4gKGd1aW50IHN1YmJhbmRzLCBHc3RTYmNDaGFubmVsTW9kZSBjaF9tb2RlLAorICAgIGd1aW50IGJsb2NrcywgZ3VpbnQgYml0cG9vbCkKK3sKKyAgc3dpdGNoIChjaF9tb2RlKSB7CisgICAgY2FzZSBHU1RfU0JDX0NIQU5ORUxfTU9ERV9NT05POgorICAgICAgcmV0dXJuIDQgKyAoc3ViYmFuZHMgKiAxKSAvIDIgKyAoKGJsb2NrcyAqIDEgKiBiaXRwb29sKSArIDcpIC8gODsKKyAgICBjYXNlIEdTVF9TQkNfQ0hBTk5FTF9NT0RFX0RVQUw6CisgICAgICByZXR1cm4gNCArIChzdWJiYW5kcyAqIDIpIC8gMiArICgoYmxvY2tzICogMiAqIGJpdHBvb2wpICsgNykgLyA4OworICAgIGNhc2UgR1NUX1NCQ19DSEFOTkVMX01PREVfU1RFUkVPOgorICAgICAgcmV0dXJuIDQgKyAoc3ViYmFuZHMgKiAyKSAvIDIgKyAoKGJsb2NrcyAqIGJpdHBvb2wpICsgNykgLyA4OworICAgIGNhc2UgR1NUX1NCQ19DSEFOTkVMX01PREVfSk9JTlRfU1RFUkVPOgorICAgICAgcmV0dXJuIDQgKyAoc3ViYmFuZHMgKiAyKSAvIDIgKyAoKHN1YmJhbmRzICsgYmxvY2tzICogYml0cG9vbCkgKyA3KSAvIDg7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgZ19yZXR1cm5fdmFsX2lmX3JlYWNoZWQgKDApOworfQorCitzdGF0aWMgZ3NpemUKK2dzdF9zYmNfcGFyc2VfaGVhZGVyIChjb25zdCBndWludDggKiBkYXRhLCBndWludCAqIHJhdGUsIGd1aW50ICogbl9ibG9ja3MsCisgICAgR3N0U2JjQ2hhbm5lbE1vZGUgKiBjaF9tb2RlLCBHc3RTYmNBbGxvY2F0aW9uTWV0aG9kICogYWxsb2NfbWV0aG9kLAorICAgIGd1aW50ICogbl9zdWJiYW5kcywgZ3VpbnQgKiBiaXRwb29sKQoreworICBzdGF0aWMgY29uc3QgZ3VpbnQxNiBzYmNfcmF0ZXNbNF0gPSB7IDE2MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwIH07CisgIHN0YXRpYyBjb25zdCBndWludDggc2JjX2Jsb2Nrc1s0XSA9IHsgNCwgOCwgMTIsIDE2IH07CisgIGd1aW50OCBjcmNfZGF0YVsyICsgMSArIDhdLCBjcmNfYml0cywgaTsKKworICBHU1RfTUVNRFVNUCAoImhlYWRlciIsIGRhdGEsIDgpOworCisgIGlmIChkYXRhWzBdICE9IFNCQ19TWU5DQllURSkKKyAgICByZXR1cm4gMDsKKworICAqcmF0ZSA9IHNiY19yYXRlc1soZGF0YVsxXSA+PiA2KSAmIDB4MDNdOworICAqbl9ibG9ja3MgPSBzYmNfYmxvY2tzWyhkYXRhWzFdID4+IDQpICYgMHgwM107CisgICpjaF9tb2RlID0gKEdzdFNiY0NoYW5uZWxNb2RlKSAoKGRhdGFbMV0gPj4gMikgJiAweDAzKTsKKyAgKmFsbG9jX21ldGhvZCA9IChkYXRhWzFdID4+IDEpICYgMHgwMTsKKyAgKm5fc3ViYmFuZHMgPSAoZGF0YVsxXSAmIDB4MDEpID8gOCA6IDQ7CisgICpiaXRwb29sID0gZGF0YVsyXTsKKworICBHU1RfVFJBQ0UgKCJyYXRlPSV1LCBuX2Jsb2Nrcz0ldSwgY2hfbW9kZT0ldSwgYWxsb2NfbWV0aG9kPSV1LCAiCisgICAgICAibl9zdWJiYW5kcz0ldSwgYml0cG9vbD0ldSIsICpyYXRlLCAqbl9ibG9ja3MsICpjaF9tb2RlLCAqYWxsb2NfbWV0aG9kLAorICAgICAgKm5fc3ViYmFuZHMsICpiaXRwb29sKTsKKworICBpZiAoKmJpdHBvb2wgPCAyKQorICAgIHJldHVybiAwOworCisgIC8qIGNoZWNrIENSQyAqLworICBjcmNfZGF0YVswXSA9IGRhdGFbMV07CisgIGNyY19kYXRhWzFdID0gZGF0YVsyXTsKKyAgY3JjX2JpdHMgPSAxNjsKKworICAvKiBqb2ludCBmbGFncyBhbmQgUkZBICovCisgIGlmICgqY2hfbW9kZSA9PSBHU1RfU0JDX0NIQU5ORUxfTU9ERV9KT0lOVF9TVEVSRU8pCisgICAgY3JjX2JpdHMgKz0gKm5fc3ViYmFuZHM7CisKKyAgLyogc2NhbGUgZmFjdG9ycyAqLworICBpZiAoKmNoX21vZGUgPT0gR1NUX1NCQ19DSEFOTkVMX01PREVfTU9OTykKKyAgICBjcmNfYml0cyArPSAqbl9zdWJiYW5kcyAqIDEgKiA0OworICBlbHNlCisgICAgY3JjX2JpdHMgKz0gKm5fc3ViYmFuZHMgKiAyICogNDsKKworICBmb3IgKGkgPSAxNjsgaSA8IGNyY19iaXRzOyBpICs9IDgpIHsKKyAgICBjcmNfZGF0YVtpIC8gOF0gPSBkYXRhWzEgKyAoaSAvIDgpICsgMV07CisgIH0KKworICBpZiAoaSA+IGNyY19iaXRzKSB7CisgICAgY3JjX2RhdGFbKGkgLyA4KSAtIDFdICY9IDB4RjA7CisgIH0KKworICBHU1RfTUVNRFVNUCAoImNyYyBieXRlcyIsIGNyY19kYXRhLCBHU1RfUk9VTkRfVVBfOCAoY3JjX2JpdHMpIC8gOCk7CisgIGlmIChnc3Rfc2JjX2NhbGN1bGF0ZV9jcmM4IChjcmNfZGF0YSwgY3JjX2JpdHMpICE9IGRhdGFbM10pIHsKKyAgICBHU1RfTE9HICgiaGVhZGVyIENSQyBjaGVjayBmYWlsZWQsIGJpdHM9JXUsIGdvdCAweCUwMngsIGV4cGVjdGVkIDB4JTAyeCIsCisgICAgICAgIGNyY19iaXRzLCBnc3Rfc2JjX2NhbGN1bGF0ZV9jcmM4IChjcmNfZGF0YSwgY3JjX2JpdHMpLCBkYXRhWzNdKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiBnc3Rfc2JjX2NhbGNfZnJhbWVsZW4gKCpuX3N1YmJhbmRzLCAqY2hfbW9kZSwgKm5fYmxvY2tzLCAqYml0cG9vbCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfc2JjX3BhcnNlX3ByZV9wdXNoX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0U2JjUGFyc2UgKnNiY3BhcnNlID0gR1NUX1NCQ19QQVJTRSAocGFyc2UpOworCisgIGlmICghc2JjcGFyc2UtPnNlbnRfY29kZWNfdGFnKSB7CisgICAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgLyogY29kZWMgdGFnICovCisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpKTsKKyAgICBpZiAoR19VTkxJS0VMWSAoY2FwcyA9PSBOVUxMKSkgeworICAgICAgaWYgKEdTVF9QQURfSVNfRkxVU0hJTkcgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSkpIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgZmx1c2hpbmciKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgbm90IG5lZ290aWF0ZWQhIik7CisgICAgICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0YWdsaXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgICBnc3RfcGJfdXRpbHNfYWRkX2NvZGVjX2Rlc2NyaXB0aW9uX3RvX3RhZ19saXN0ICh0YWdsaXN0LAorICAgICAgICBHU1RfVEFHX0FVRElPX0NPREVDLCBjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgICBnc3RfYmFzZV9wYXJzZV9tZXJnZV90YWdzIChwYXJzZSwgdGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFKTsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ2xpc3QpOworCisgICAgLyogYWxzbyBzaWduYWxzIHRoZSBlbmQgb2YgZmlyc3QtZnJhbWUgcHJvY2Vzc2luZyAqLworICAgIHNiY3BhcnNlLT5zZW50X2NvZGVjX3RhZyA9IFRSVUU7CisgIH0KKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CmRpZmYgLS1naXQgYS9nc3QvYXVkaW9wYXJzZXJzL2dzdHNiY3BhcnNlLmggYi9nc3QvYXVkaW9wYXJzZXJzL2dzdHNiY3BhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQyMDRiZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0c2JjcGFyc2UuaApAQCAtMCwwICsxLDc2IEBACisvKiBHU3RyZWFtZXIgU0JDIGF1ZGlvIHBhcnNlcgorICogQ29weXJpZ2h0IChDKSAyMDEyIENvbGxhYm9yYSBMdGQuIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1NCQ19QQVJTRV9IX0lOQ0xVREVEX18KKyNkZWZpbmUgX19HU1RfU0JDX1BBUlNFX0hfSU5DTFVERURfXworCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXBhcnNlLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9TQkNfUEFSU0UgICAgICAgICAgICAoZ3N0X3NiY19wYXJzZV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfU0JDX1BBUlNFKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfU0JDX1BBUlNFLEdzdFNiY1BhcnNlKSkKKyNkZWZpbmUgR1NUX1NCQ19QQVJTRV9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfU0JDX1BBUlNFLEdzdFNiY1BhcnNlQ2xhc3MpKQorI2RlZmluZSBHU1RfU0JDX1BBUlNFX0dFVF9DTEFTUyhvYmopICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUygob2JqKSxHU1RfVFlQRV9TQkNfUEFSU0UsR3N0U2JjUGFyc2VDbGFzcykpCisjZGVmaW5lIEdTVF9JU19TQkNfUEFSU0Uob2JqKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9TQkNfUEFSU0UpKQorI2RlZmluZSBHU1RfSVNfU0JDX1BBUlNFX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9TQkNfUEFSU0UpKQorI2RlZmluZSBHU1RfU0JDX1BBUlNFX0NBU1Qob2JqKSAgICAgICAoKEdzdFNiY1BhcnNlICopKG9iaikpCisKK3R5cGVkZWYgZW51bSB7CisgIEdTVF9TQkNfQ0hBTk5FTF9NT0RFX0lOVkFMSUQgPSAtMSwKKyAgR1NUX1NCQ19DSEFOTkVMX01PREVfTU9OTyA9IDAsCisgIEdTVF9TQkNfQ0hBTk5FTF9NT0RFX0RVQUwgPSAxLAorICBHU1RfU0JDX0NIQU5ORUxfTU9ERV9TVEVSRU8gPSAyLAorICBHU1RfU0JDX0NIQU5ORUxfTU9ERV9KT0lOVF9TVEVSRU8gPSAzCit9IEdzdFNiY0NoYW5uZWxNb2RlOworCit0eXBlZGVmIGVudW0geworICBHU1RfU0JDX0FMTE9DQVRJT05fTUVUSE9EX0lOVkFMSUQgPSAtMSwKKyAgR1NUX1NCQ19BTExPQ0FUSU9OX01FVEhPRF9MT1VETkVTUyA9IDAsCisgIEdTVF9TQkNfQUxMT0NBVElPTl9NRVRIT0RfU05SID0gMQorfSBHc3RTYmNBbGxvY2F0aW9uTWV0aG9kOworCit0eXBlZGVmIHN0cnVjdCBfR3N0U2JjUGFyc2UgR3N0U2JjUGFyc2U7Cit0eXBlZGVmIHN0cnVjdCBfR3N0U2JjUGFyc2VDbGFzcyBHc3RTYmNQYXJzZUNsYXNzOworCitzdHJ1Y3QgX0dzdFNiY1BhcnNlIHsKKyAgR3N0QmFzZVBhcnNlIGJhc2VwYXJzZTsKKworICAvKiBjdXJyZW50IG91dHB1dCBmb3JtYXQgKi8KKyAgR3N0U2JjQWxsb2NhdGlvbk1ldGhvZCAgYWxsb2NfbWV0aG9kOworICBHc3RTYmNDaGFubmVsTW9kZSAgICAgICBjaF9tb2RlOworICBnaW50ICAgICAgICAgICAgICAgICAgICByYXRlOworICBnaW50ICAgICAgICAgICAgICAgICAgICBuX2Jsb2NrczsKKyAgZ2ludCAgICAgICAgICAgICAgICAgICAgbl9zdWJiYW5kczsKKyAgZ2ludCAgICAgICAgICAgICAgICAgICAgYml0cG9vbDsKKworICBnYm9vbGVhbiAgICAgICAgICAgICAgICBzZW50X2NvZGVjX3RhZzsKK307CisKK3N0cnVjdCBfR3N0U2JjUGFyc2VDbGFzcyB7CisgIEdzdEJhc2VQYXJzZUNsYXNzIGJhc2VwYXJzZV9jbGFzczsKK307CisKK0dUeXBlIGdzdF9zYmNfcGFyc2VfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfU0JDX1BBUlNFX0hfSU5DTFVERURfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvcGFyc2Vycy9nc3R3YXZwYWNrcGFyc2UuYyBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxZDE5YwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmMKQEAgLTAsMCArMSw3MDYgQEAKKy8qIEdTdHJlYW1lciBXYXZwYWNrIHBhcnNlcgorICogQ29weXJpZ2h0IChDKSAyMDEyIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSAyMDEyIE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBDb250YWN0OiBTdGVmYW4gS29zdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC13YXZwYWNrcGFyc2UKKyAqIEBzaG9ydF9kZXNjcmlwdGlvbjogV2F2cGFjayBwYXJzZXIKKyAqIEBzZWVfYWxzbzogI0dzdEFtclBhcnNlLCAjR3N0QUFDUGFyc2UKKyAqCisgKiBUaGlzIGlzIGFuIFdhdnBhY2sgcGFyc2VyLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPWFiYy53YXZwYWNrICEgd2F2cGFja3BhcnNlICEgd2F2cGFja2RlYyAhIGF1ZGlvcmVzYW1wbGUgISBhdWRpb2NvbnZlcnQgISBhdXRvYXVkaW9zaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdHdhdnBhY2twYXJzZS5oIgorCisjaW5jbHVkZSA8Z3N0L2Jhc2UvYmFzZS5oPgorI2luY2x1ZGUgPGdzdC9wYnV0aWxzL3BidXRpbHMuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAod2F2cGFja19wYXJzZV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCB3YXZwYWNrX3BhcnNlX2RlYnVnCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC13YXZwYWNrLCAiCisgICAgICAgICJkZXB0aCA9IChpbnQpIFsgMSwgMzIgXSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDggXSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgNjAwMCwgMTkyMDAwIF0sICIgImZyYW1lZCA9IChib29sZWFuKSBUUlVFOyAiCisgICAgICAgICJhdWRpby94LXdhdnBhY2stY29ycmVjdGlvbiwgIiAiZnJhbWVkID0gKGJvb2xlYW4pIFRSVUUiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC13YXZwYWNrIikpOworCitzdGF0aWMgdm9pZCBnc3Rfd2F2cGFja19wYXJzZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfd2F2cGFja19wYXJzZV9zdGFydCAoR3N0QmFzZVBhcnNlICogcGFyc2UpOworc3RhdGljIGdib29sZWFuIGdzdF93YXZwYWNrX3BhcnNlX3N0b3AgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF93YXZwYWNrX3BhcnNlX2hhbmRsZV9mcmFtZSAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSwgZ2ludCAqIHNraXBzaXplKTsKK3N0YXRpYyBHc3RDYXBzICpnc3Rfd2F2cGFja19wYXJzZV9nZXRfc2lua19jYXBzIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF93YXZwYWNrX3BhcnNlX3ByZV9wdXNoX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lKTsKKworI2RlZmluZSBnc3Rfd2F2cGFja19wYXJzZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RXYXZwYWNrUGFyc2UsIGdzdF93YXZwYWNrX3BhcnNlLCBHU1RfVFlQRV9CQVNFX1BBUlNFKTsKKworc3RhdGljIHZvaWQKK2dzdF93YXZwYWNrX3BhcnNlX2NsYXNzX2luaXQgKEdzdFdhdnBhY2tQYXJzZUNsYXNzICoga2xhc3MpCit7CisgIEdzdEJhc2VQYXJzZUNsYXNzICpwYXJzZV9jbGFzcyA9IEdTVF9CQVNFX1BBUlNFX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAod2F2cGFja19wYXJzZV9kZWJ1ZywgIndhdnBhY2twYXJzZSIsIDAsCisgICAgICAiV2F2cGFjayBhdWRpbyBzdHJlYW0gcGFyc2VyIik7CisKKyAgb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF93YXZwYWNrX3BhcnNlX2ZpbmFsaXplOworCisgIHBhcnNlX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2cGFja19wYXJzZV9zdGFydCk7CisgIHBhcnNlX2NsYXNzLT5zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXZwYWNrX3BhcnNlX3N0b3ApOworICBwYXJzZV9jbGFzcy0+aGFuZGxlX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2cGFja19wYXJzZV9oYW5kbGVfZnJhbWUpOworICBwYXJzZV9jbGFzcy0+Z2V0X3NpbmtfY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3dhdnBhY2tfcGFyc2VfZ2V0X3NpbmtfY2Fwcyk7CisgIHBhcnNlX2NsYXNzLT5wcmVfcHVzaF9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3dhdnBhY2tfcGFyc2VfcHJlX3B1c2hfZnJhbWUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIldhdnBhY2sgYXVkaW8gc3RyZWFtIHBhcnNlciIsICJDb2RlYy9QYXJzZXIvQXVkaW8iLAorICAgICAgIldhdnBhY2sgcGFyc2VyIiwgIk1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3dhdnBhY2tfcGFyc2VfcmVzZXQgKEdzdFdhdnBhY2tQYXJzZSAqIHd2cGFyc2UpCit7CisgIHd2cGFyc2UtPmNoYW5uZWxzID0gLTE7CisgIHd2cGFyc2UtPmNoYW5uZWxfbWFzayA9IDA7CisgIHd2cGFyc2UtPnNhbXBsZV9yYXRlID0gLTE7CisgIHd2cGFyc2UtPndpZHRoID0gLTE7CisgIHd2cGFyc2UtPnRvdGFsX3NhbXBsZXMgPSAwOworICB3dnBhcnNlLT5zZW50X2NvZGVjX3RhZyA9IEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3dhdnBhY2tfcGFyc2VfaW5pdCAoR3N0V2F2cGFja1BhcnNlICogd3ZwYXJzZSkKK3sKKyAgZ3N0X3dhdnBhY2tfcGFyc2VfcmVzZXQgKHd2cGFyc2UpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfSU5URVJTRUNUIChHU1RfQkFTRV9QQVJTRV9TSU5LX1BBRCAod3ZwYXJzZSkpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEICh3dnBhcnNlKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFja19wYXJzZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYWNrX3BhcnNlX3N0YXJ0IChHc3RCYXNlUGFyc2UgKiBwYXJzZSkKK3sKKyAgR3N0V2F2cGFja1BhcnNlICp3dnBhcnNlID0gR1NUX1dBVlBBQ0tfUEFSU0UgKHBhcnNlKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgInN0YXJ0aW5nIik7CisKKyAgZ3N0X3dhdnBhY2tfcGFyc2VfcmVzZXQgKHd2cGFyc2UpOworCisgIC8qIG5lZWQgaGVhZGVyIGF0IGxlYXN0ICovCisgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKHd2cGFyc2UpLAorICAgICAgc2l6ZW9mIChXYXZwYWNrSGVhZGVyKSk7CisKKyAgLyogaW5mb3JtIGJhc2VjbGFzcyB3ZSBjYW4gY29tZSB1cCB3aXRoIHRzLCBiYXNlZCBvbiBjb3VudGVycyBpbiBwYWNrZXRzICovCisgIGdzdF9iYXNlX3BhcnNlX3NldF9oYXNfdGltaW5nX2luZm8gKEdTVF9CQVNFX1BBUlNFX0NBU1QgKHd2cGFyc2UpLCBUUlVFKTsKKyAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X3N5bmNhYmxlIChHU1RfQkFTRV9QQVJTRV9DQVNUICh3dnBhcnNlKSwgVFJVRSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhY2tfcGFyc2Vfc3RvcCAoR3N0QmFzZVBhcnNlICogcGFyc2UpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAic3RvcHBpbmciKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdpbnQKK2dzdF93YXZwYWNrX2dldF9kZWZhdWx0X2NoYW5uZWxfbWFzayAoZ2ludCBuY2hhbm5lbHMpCit7CisgIGdpbnQgY2hhbm5lbF9tYXNrID0gMDsKKworICAvKiBTZXQgdGhlIGRlZmF1bHQgY2hhbm5lbCBtYXNrIGZvciB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGNoYW5uZWxzLgorICAgKiBJdCdzIHRoZSBzYW1lIGFzIGZvciBXQVZFX0ZPUk1BVF9FWFRFTkRFRDoKKyAgICogaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3doZGMvZGV2aWNlL2F1ZGlvL211bHRpY2hhdWQubXNweAorICAgKi8KKyAgc3dpdGNoIChuY2hhbm5lbHMpIHsKKyAgICBjYXNlIDExOgorICAgICAgY2hhbm5lbF9tYXNrIHw9IDB4MDA0MDA7CisgICAgICBjaGFubmVsX21hc2sgfD0gMHgwMDIwMDsKKyAgICBjYXNlIDk6CisgICAgICBjaGFubmVsX21hc2sgfD0gMHgwMDEwMDsKKyAgICBjYXNlIDg6CisgICAgICBjaGFubmVsX21hc2sgfD0gMHgwMDA4MDsKKyAgICAgIGNoYW5uZWxfbWFzayB8PSAweDAwMDQwOworICAgIGNhc2UgNjoKKyAgICAgIGNoYW5uZWxfbWFzayB8PSAweDAwMDIwOworICAgICAgY2hhbm5lbF9tYXNrIHw9IDB4MDAwMTA7CisgICAgY2FzZSA0OgorICAgICAgY2hhbm5lbF9tYXNrIHw9IDB4MDAwMDg7CisgICAgY2FzZSAzOgorICAgICAgY2hhbm5lbF9tYXNrIHw9IDB4MDAwMDQ7CisgICAgY2FzZSAyOgorICAgICAgY2hhbm5lbF9tYXNrIHw9IDB4MDAwMDI7CisgICAgICBjaGFubmVsX21hc2sgfD0gMHgwMDAwMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIC8qIEZvciBtb25vIHVzZSBmcm9udCBjZW50ZXIgKi8KKyAgICAgIGNoYW5uZWxfbWFzayB8PSAweDAwMDA0OworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gY2hhbm5lbF9tYXNrOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0Cit7CisgIGNvbnN0IGd1aW50MzIgbXNfbWFzazsKKyAgY29uc3QgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gZ3N0X3BvczsKK30gbGF5b3V0X21hcHBpbmdbXSA9IHsKKyAgeworICAweDAwMDAxLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUfSwgeworICAweDAwMDAyLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVH0sIHsKKyAgMHgwMDAwNCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSfSwgeworICAweDAwMDA4LCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxfSwgeworICAweDAwMDEwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0xFRlR9LCB7CisgIDB4MDAwMjAsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfUklHSFR9LCB7CisgIDB4MDAwNDAsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlRfT0ZfQ0VOVEVSfSwgeworICAweDAwMDgwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVF9PRl9DRU5URVJ9LCB7CisgIDB4MDAxMDAsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfQ0VOVEVSfSwgeworICAweDAwMjAwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlR9LCB7CisgIDB4MDA0MDAsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1NJREVfUklHSFR9LCB7CisgIDB4MDA4MDAsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9DRU5URVJ9LCB7CisgIDB4MDEwMDAsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9MRUZUfSwgeworICAweDAyMDAwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfRlJPTlRfQ0VOVEVSfSwgeworICAweDA0MDAwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfRlJPTlRfUklHSFR9LCB7CisgIDB4MDgwMDAsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX0xFRlR9LCB7CisgIDB4MTAwMDAsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX0NFTlRFUn0sIHsKKyAgMHgyMDAwMCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX1JFQVJfUklHSFR9Cit9OworCisjZGVmaW5lIE1BWF9DSEFOTkVMX1BPU0lUSU9OUyBHX05fRUxFTUVOVFMgKGxheW91dF9tYXBwaW5nKQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYWNrX2dldF9jaGFubmVsX3Bvc2l0aW9ucyAoZ2ludCBudW1fY2hhbm5lbHMsIGdpbnQgbGF5b3V0LAorICAgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uICogcG9zKQoreworICBnaW50IGksIHA7CisKKyAgaWYgKG51bV9jaGFubmVscyA9PSAxICYmIGxheW91dCA9PSAweDAwMDA0KSB7CisgICAgcG9zWzBdID0gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTU9OTzsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHAgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0NIQU5ORUxfUE9TSVRJT05TOyArK2kpIHsKKyAgICBpZiAoKGxheW91dCAmIGxheW91dF9tYXBwaW5nW2ldLm1zX21hc2spICE9IDApIHsKKyAgICAgIGlmIChwID49IG51bV9jaGFubmVscykgeworICAgICAgICBHU1RfV0FSTklORyAoIk1vcmUgYml0cyBzZXQgaW4gdGhlIGNoYW5uZWwgbGF5b3V0IG1hcCB0aGFuIHRoZXJlICIKKyAgICAgICAgICAgICJhcmUgY2hhbm5lbHMhIEJyb2tlbiBmaWxlIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmIChsYXlvdXRfbWFwcGluZ1tpXS5nc3RfcG9zID09IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0lOVkFMSUQpIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJVbnN1cHBvcnRlZCBjaGFubmVsIHBvc2l0aW9uIChtYXNrIDB4JTA4eCkgaW4gY2hhbm5lbCAiCisgICAgICAgICAgICAibGF5b3V0IG1hcCAtIGlnbm9yaW5nIHRob3NlIGNoYW5uZWxzIiwgbGF5b3V0X21hcHBpbmdbaV0ubXNfbWFzayk7CisgICAgICAgIC8qIHdoYXQgdG8gZG8/IGp1c3QgaWdub3JlIGl0IGFuZCBsZXQgZG93bnN0cmVhbSBkZWFsIHdpdGggYSBjaGFubmVsCisgICAgICAgICAqIGxheW91dCB0aGF0IGhhcyBJTlZBTElEIHBvc2l0aW9ucyBpbiBpdCBmb3Igbm93IC4uLiAqLworICAgICAgfQorICAgICAgcG9zW3BdID0gbGF5b3V0X21hcHBpbmdbaV0uZ3N0X3BvczsKKyAgICAgICsrcDsKKyAgICB9CisgIH0KKworICBpZiAocCAhPSBudW1fY2hhbm5lbHMpIHsKKyAgICBHU1RfV0FSTklORyAoIk9ubHkgJWQgYml0cyBzZXQgaW4gdGhlIGNoYW5uZWwgbGF5b3V0IG1hcCwgYnV0IHRoZXJlIGFyZSAiCisgICAgICAgICJzdXBwb3NlZCB0byBiZSAlZCBjaGFubmVscyEgQnJva2VuIGZpbGUiLCBwLCBudW1fY2hhbm5lbHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgY29uc3QgZ3VpbnQzMiBzYW1wbGVfcmF0ZXNbXSA9IHsKKyAgNjAwMCwgODAwMCwgOTYwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsCisgIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwLCA2NDAwMCwgODgyMDAsIDk2MDAwLCAxOTIwMDAKK307CisKKyNkZWZpbmUgQ0hFQ0soY2FsbCkgeyBcCisgIGlmICghY2FsbCkgXAorICAgIGdvdG8gcmVhZF9mYWlsZWQ7IFwKK30KKworLyogY2FsbGVyIGVuc3VyZXMgcHJvcGVybHkgc3luYydlZCB3aXRoIGVub3VnaCBkYXRhICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYWNrX3BhcnNlX2ZyYW1lX21ldGFkYXRhIChHc3RXYXZwYWNrUGFyc2UgKiBwYXJzZSwgR3N0QnVmZmVyICogYnVmLAorICAgIGdpbnQgc2tpcCwgV2F2cGFja0hlYWRlciAqIHdwaCwgV2F2cGFja0luZm8gKiB3cGkpCit7CisgIEdzdEJ5dGVSZWFkZXIgYnI7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHdwaCAhPSBOVUxMIHx8IHdwaSAhPSBOVUxMLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChnc3RfYnVmZmVyX2dldF9zaXplIChidWYpID49CisgICAgICBza2lwICsgc2l6ZW9mIChXYXZwYWNrSGVhZGVyKSwgRkFMU0UpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZiciwgbWFwLmRhdGEgKyBza2lwLCB3cGgtPmNrU2l6ZSArIDgpOworICAvKiBza2lwIHBhc3QgaGVhZGVyICovCisgIGdzdF9ieXRlX3JlYWRlcl9za2lwX3VuY2hlY2tlZCAoJmJyLCBzaXplb2YgKFdhdnBhY2tIZWFkZXIpKTsKKworICAvKiBnZXQgc29tZSBiYXNpY3MgZnJvbSBoZWFkZXIgKi8KKyAgaSA9ICh3cGgtPmZsYWdzID4+IDIzKSAmIDB4RjsKKyAgaWYgKCF3cGktPnJhdGUpCisgICAgd3BpLT5yYXRlID0gKGkgPCBHX05fRUxFTUVOVFMgKHNhbXBsZV9yYXRlcykpID8gc2FtcGxlX3JhdGVzW2ldIDogNDQxMDA7CisgIHdwaS0+d2lkdGggPSAoKHdwaC0+ZmxhZ3MgJiAweDMpICsgMSkgKiA4OworICBpZiAoIXdwaS0+Y2hhbm5lbHMpCisgICAgd3BpLT5jaGFubmVscyA9ICh3cGgtPmZsYWdzICYgMHg0KSA/IDEgOiAyOworICBpZiAoIXdwaS0+Y2hhbm5lbF9tYXNrKQorICAgIHdwaS0+Y2hhbm5lbF9tYXNrID0gNSAtIHdwaS0+Y2hhbm5lbHM7CisKKyAgLyogbmVlZCB0byBkaWcgbWV0YWRhdGEgYmxvY2tzIGZvciBzb21lIG1vcmUgKi8KKyAgd2hpbGUgKGdzdF9ieXRlX3JlYWRlcl9nZXRfcmVtYWluaW5nICgmYnIpKSB7CisgICAgZ2ludCBzaXplID0gMDsKKyAgICBndWludDE2IHNpemUyID0gMDsKKyAgICBndWludDggYywgaWQ7CisgICAgY29uc3QgZ3VpbnQ4ICpkYXRhOworICAgIEdzdEJ5dGVSZWFkZXIgbWJyOworCisgICAgQ0hFQ0sgKGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZiciwgJmlkKSk7CisgICAgQ0hFQ0sgKGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZiciwgJmMpKTsKKyAgICBpZiAoaWQgJiBJRF9MQVJHRSkKKyAgICAgIENIRUNLIChnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAoJmJyLCAmc2l6ZTIpKTsKKyAgICBzaXplID0gc2l6ZTI7CisgICAgc2l6ZSA8PD0gODsKKyAgICBzaXplICs9IGM7CisgICAgc2l6ZSA8PD0gMTsKKyAgICBpZiAoaWQgJiBJRF9PRERfU0laRSkKKyAgICAgIHNpemUtLTsKKworICAgIENIRUNLIChnc3RfYnl0ZV9yZWFkZXJfZ2V0X2RhdGEgKCZiciwgc2l6ZSArIChzaXplICYgMSksICZkYXRhKSk7CisgICAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZtYnIsIGRhdGEsIHNpemUpOworCisgICAgc3dpdGNoIChpZCkgeworICAgICAgY2FzZSBJRF9XVkNfQklUU1RSRUFNOgorICAgICAgICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJjb3JyZWN0aW9uIGJpdHN0cmVhbSIpOworICAgICAgICB3cGktPmNvcnJlY3Rpb24gPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSURfV1ZfQklUU1RSRUFNOgorICAgICAgY2FzZSBJRF9XVlhfQklUU1RSRUFNOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSURfU0FNUExFX1JBVEU6CisgICAgICAgIGlmIChzaXplID09IDMpIHsKKyAgICAgICAgICBDSEVDSyAoZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MjRfbGUgKCZtYnIsICZ3cGktPnJhdGUpKTsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJ1cGRhdGVkIHdpdGggY3VzdG9tIHJhdGUgJWQiLCB3cGktPnJhdGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAidW5leHBlY3RlZCBzaXplIGZvciBTQU1QTEVfUkFURSBtZXRhZGF0YSIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJRF9DSEFOTkVMX0lORk86CisgICAgICB7CisgICAgICAgIGd1aW50MTYgY2hhbm5lbHM7CisgICAgICAgIGd1aW50MzIgbWFzayA9IDA7CisKKyAgICAgICAgaWYgKHNpemUgPT0gNikgeworICAgICAgICAgIENIRUNLIChnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAoJm1iciwgJmNoYW5uZWxzKSk7CisgICAgICAgICAgY2hhbm5lbHMgPSBjaGFubmVscyAmIDB4RkZGOworICAgICAgICAgIENIRUNLIChnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQyNF9sZSAoJm1iciwgJm1hc2spKTsKKyAgICAgICAgfSBlbHNlIGlmIChzaXplKSB7CisgICAgICAgICAgQ0hFQ0sgKGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZtYnIsICZjKSk7CisgICAgICAgICAgY2hhbm5lbHMgPSBjOworICAgICAgICAgIHdoaWxlIChnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQ4ICgmbWJyLCAmYykpCisgICAgICAgICAgICBtYXNrIHw9ICgoKGd1aW50MzIpIGMpIDw8IDgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAidW5leHBlY3RlZCBzaXplIGZvciBDSEFOTkVMX0lORk8gbWV0YWRhdGEiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB3cGktPmNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgICAgIHdwaS0+Y2hhbm5lbF9tYXNrID0gbWFzazsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJ1bnBhcnNlZCBJRCAweCV4IiwgaWQpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworcmVhZF9mYWlsZWQ6CisgIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAic2hvcnQgcmVhZCB3aGlsZSBwYXJzaW5nIG1ldGFkYXRhIik7CisgICAgLyogbGV0J3MgbG9vayB0aGUgb3RoZXIgd2F5IGFueXdheSAqLworICAgIHJldHVybiBUUlVFOworICB9Cit9CisKKy8qIGNhbGxlciBlbnN1cmVzIHByb3Blcmx5IHN5bmMnZWQgd2l0aCBlbm91Z2ggZGF0YSAqLworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2cGFja19wYXJzZV9mcmFtZV9oZWFkZXIgKEdzdFdhdnBhY2tQYXJzZSAqIHBhcnNlLCBHc3RCdWZmZXIgKiBidWYsCisgICAgZ2ludCBza2lwLCBXYXZwYWNrSGVhZGVyICogX3dwaCkKK3sKKyAgR3N0Qnl0ZVJlYWRlciBicjsKKyAgV2F2cGFja0hlYWRlciB3cGggPSB7IHswLH0sIDAsIH07CisgIEdzdE1hcEluZm8gbWFwOworICBnYm9vbGVhbiBoZGwgPSBUUlVFOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChnc3RfYnVmZmVyX2dldF9zaXplIChidWYpID49CisgICAgICBza2lwICsgc2l6ZW9mIChXYXZwYWNrSGVhZGVyKSwgRkFMU0UpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGdzdF9ieXRlX3JlYWRlcl9pbml0ICgmYnIsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisKKyAgLyogbWFya2VyICovCisgIGdzdF9ieXRlX3JlYWRlcl9za2lwX3VuY2hlY2tlZCAoJmJyLCBza2lwICsgNCk7CisKKyAgLyogcmVhZCAqLworICBoZGwgJj0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKCZiciwgJndwaC5ja1NpemUpOworICBoZGwgJj0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKCZiciwgJndwaC52ZXJzaW9uKTsKKyAgaGRsICY9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZiciwgJndwaC50cmFja19ubyk7CisgIGhkbCAmPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQ4ICgmYnIsICZ3cGguaW5kZXhfbm8pOworICBoZGwgJj0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKCZiciwgJndwaC50b3RhbF9zYW1wbGVzKTsKKyAgaGRsICY9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2xlICgmYnIsICZ3cGguYmxvY2tfaW5kZXgpOworICBoZGwgJj0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKCZiciwgJndwaC5ibG9ja19zYW1wbGVzKTsKKyAgaGRsICY9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2xlICgmYnIsICZ3cGguZmxhZ3MpOworICBoZGwgJj0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKCZiciwgJndwaC5jcmMpOworCisgIGlmICghaGRsKQorICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsICJFcnJvciByZWFkaW5nIGhlYWRlciIpOworCisgIC8qIGR1bXAgKi8KKyAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAic2l6ZSAlZCIsIHdwaC5ja1NpemUpOworICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJ2ZXJzaW9uIDB4JXgiLCB3cGgudmVyc2lvbik7CisgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgInRvdGFsIHNhbXBsZXMgJWQiLCB3cGgudG90YWxfc2FtcGxlcyk7CisgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgImJsb2NrIGluZGV4ICVkIiwgd3BoLmJsb2NrX2luZGV4KTsKKyAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAiYmxvY2sgc2FtcGxlcyAlZCIsIHdwaC5ibG9ja19zYW1wbGVzKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAiZmxhZ3MgMHgleCIsIHdwaC5mbGFncyk7CisgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgImNyYyAweCV4Iiwgd3BoLmZsYWdzKTsKKworICBpZiAoIXBhcnNlLT50b3RhbF9zYW1wbGVzICYmIHdwaC5ibG9ja19pbmRleCA9PSAwICYmIHdwaC50b3RhbF9zYW1wbGVzICE9IC0xKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJkZXRlcm1pbmVkIGR1cmF0aW9uIG9mICV1IHNhbXBsZXMiLAorICAgICAgICB3cGgudG90YWxfc2FtcGxlcyk7CisgICAgcGFyc2UtPnRvdGFsX3NhbXBsZXMgPSB3cGgudG90YWxfc2FtcGxlczsKKyAgfQorCisgIGlmIChfd3BoKQorICAgICpfd3BoID0gd3BoOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfd2F2cGFja19wYXJzZV9oYW5kbGVfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUsIGdpbnQgKiBza2lwc2l6ZSkKK3sKKyAgR3N0V2F2cGFja1BhcnNlICp3dnBhcnNlID0gR1NUX1dBVlBBQ0tfUEFSU0UgKHBhcnNlKTsKKyAgR3N0QnVmZmVyICpidWYgPSBmcmFtZS0+YnVmZmVyOworICBHc3RCeXRlUmVhZGVyIHJlYWRlcjsKKyAgZ2ludCBvZmY7CisgIGd1aW50IHJhdGUsIGNoYW5zLCB3aWR0aCwgbWFzazsKKyAgZ2Jvb2xlYW4gbG9zdF9zeW5jLCBkcmFpbmluZywgZmluYWw7CisgIGd1aW50IGZybXNpemUgPSAwOworICBXYXZwYWNrSGVhZGVyIHdwaDsKKyAgV2F2cGFja0luZm8gd3BpID0geyAwLCB9OworICBHc3RNYXBJbmZvIG1hcDsKKworICBpZiAoR19VTkxJS0VMWSAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSA8IHNpemVvZiAoV2F2cGFja0hlYWRlcikpKQorICAgIHJldHVybiBGQUxTRTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBnc3RfYnl0ZV9yZWFkZXJfaW5pdCAoJnJlYWRlciwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKworICAvKiBzY2FuIGZvciAnd3ZwaycgbWFya2VyICovCisgIG9mZiA9IGdzdF9ieXRlX3JlYWRlcl9tYXNrZWRfc2Nhbl91aW50MzIgKCZyZWFkZXIsIDB4ZmZmZmZmZmYsIDB4Nzc3NjcwNmIsCisgICAgICAwLCBtYXAuc2l6ZSk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAicG9zc2libGUgc3luYyBhdCBidWZmZXIgb2Zmc2V0ICVkIiwgb2ZmKTsKKworICAvKiBkaWRuJ3QgZmluZCBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2UgYSBzeW5jIHdvcmQsIHNraXAgKi8KKyAgaWYgKG9mZiA8IDApIHsKKyAgICAqc2tpcHNpemUgPSBtYXAuc2l6ZSAtIDM7CisgICAgZ290byBza2lwOworICB9CisKKyAgLyogcG9zc2libGUgZnJhbWUgaGVhZGVyLCBidXQgbm90IGF0IG9mZnNldCAwPyBza2lwIGJ5dGVzIGJlZm9yZSBzeW5jICovCisgIGlmIChvZmYgPiAwKSB7CisgICAgKnNraXBzaXplID0gb2ZmOworICAgIGdvdG8gc2tpcDsKKyAgfQorCisgIC8qIG1ha2Ugc3VyZSB0aGUgdmFsdWVzIGluIHRoZSBmcmFtZSBoZWFkZXIgbG9vayBzYW5lICovCisgIGdzdF93YXZwYWNrX3BhcnNlX2ZyYW1lX2hlYWRlciAod3ZwYXJzZSwgYnVmLCAwLCAmd3BoKTsKKyAgZnJtc2l6ZSA9IHdwaC5ja1NpemUgKyA4OworCisgIC8qIG5lZWQgdGhlIGVudGlyZSBmcmFtZSBmb3IgcGFyc2luZyAqLworICBpZiAoZ3N0X2J5dGVfcmVhZGVyX2dldF9yZW1haW5pbmcgKCZyZWFkZXIpIDwgZnJtc2l6ZSkKKyAgICBnb3RvIG1vcmU7CisKKyAgLyogZ290IGEgZnJhbWUsIG5vdyB3ZSBjYW4gZGlnIGZvciBzb21lIG1vcmUgbWV0YWRhdGEgKi8KKyAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAiZ290IGZyYW1lIik7CisgIGdzdF93YXZwYWNrX3BhcnNlX2ZyYW1lX21ldGFkYXRhICh3dnBhcnNlLCBidWYsIDAsICZ3cGgsICZ3cGkpOworCisgIGxvc3Rfc3luYyA9IEdTVF9CQVNFX1BBUlNFX0xPU1RfU1lOQyAocGFyc2UpOworICBkcmFpbmluZyA9IEdTVF9CQVNFX1BBUlNFX0RSQUlOSU5HIChwYXJzZSk7CisKKyAgd2hpbGUgKCEoZmluYWwgPSAod3BoLmZsYWdzICYgRkxBR19GSU5BTF9CTE9DSykpIHx8IChsb3N0X3N5bmMgJiYgIWRyYWluaW5nKSkgeworICAgIGd1aW50MzIgd29yZCA9IDA7CisKKyAgICBHU1RfTE9HX09CSkVDVCAod3ZwYXJzZSwgImNoZWNraW5nIG5leHQgZnJhbWUgc3luY3dvcmQ7ICIKKyAgICAgICAgImxvc3Rfc3luYzogJWQsIGRyYWluaW5nOiAlZCwgZmluYWw6ICVkIiwgbG9zdF9zeW5jLCBkcmFpbmluZywgZmluYWwpOworCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJnJlYWRlciwgd3BoLmNrU2l6ZSArIDgpIHx8CisgICAgICAgICFnc3RfYnl0ZV9yZWFkZXJfcGVla191aW50MzJfYmUgKCZyZWFkZXIsICZ3b3JkKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAod3ZwYXJzZSwgIi4uLiBidXQgbm90IHN1ZmZpY2llbnQgZGF0YSIpOworICAgICAgZnJtc2l6ZSArPSA0OworICAgICAgZ290byBtb3JlOworICAgIH0gZWxzZSB7CisgICAgICBpZiAod29yZCAhPSAweDc3NzY3MDZiKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHd2cGFyc2UsICIweCV4IG5vdCBPSyIsIHdvcmQpOworICAgICAgICAqc2tpcHNpemUgPSBvZmYgKyAyOworICAgICAgICBnb3RvIHNraXA7CisgICAgICB9CisgICAgICAvKiBuZWVkIHRvIHBhcnNlIGVhY2ggZnJhbWUvYmxvY2sgZm9yIG1ldGFkYXRhIGlmIHNldmVyYWwgb25lcyAqLworICAgICAgaWYgKCFmaW5hbCkgeworICAgICAgICBnaW50IGF2OworCisgICAgICAgIEdTVF9MT0dfT0JKRUNUICh3dnBhcnNlLCAiY2hlY2tpbmcgZnJhbWUgYXQgb2Zmc2V0ICVkICgweCV4KSIsCisgICAgICAgICAgICBmcm1zaXplLCBmcm1zaXplKTsKKyAgICAgICAgYXYgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3JlbWFpbmluZyAoJnJlYWRlcik7CisgICAgICAgIGlmIChhdiA8IHNpemVvZiAoV2F2cGFja0hlYWRlcikpIHsKKyAgICAgICAgICBmcm1zaXplICs9IHNpemVvZiAoV2F2cGFja0hlYWRlcik7CisgICAgICAgICAgZ290byBtb3JlOworICAgICAgICB9CisgICAgICAgIGdzdF93YXZwYWNrX3BhcnNlX2ZyYW1lX2hlYWRlciAod3ZwYXJzZSwgYnVmLCBmcm1zaXplLCAmd3BoKTsKKyAgICAgICAgb2ZmID0gZnJtc2l6ZTsKKyAgICAgICAgZnJtc2l6ZSArPSB3cGguY2tTaXplICsgODsKKyAgICAgICAgaWYgKGF2IDwgd3BoLmNrU2l6ZSArIDgpCisgICAgICAgICAgZ290byBtb3JlOworICAgICAgICBnc3Rfd2F2cGFja19wYXJzZV9mcmFtZV9tZXRhZGF0YSAod3ZwYXJzZSwgYnVmLCBvZmYsICZ3cGgsICZ3cGkpOworICAgICAgICAvKiBjb3VsZCBhbHNvIGNoZWNrIGZvciBtYXRjaGluZyBibG9ja19pbmRleCBhbmQgYmxvY2tfc2FtcGxlcyA/PyAqLworICAgICAgfQorICAgIH0KKworICAgIC8qIHJlc3luY2VkIGlmIHdlIG1ha2UgaXQgaGVyZSAqLworICAgIGxvc3Rfc3luYyA9IEZBTFNFOworICB9CisKKyAgcmF0ZSA9IHdwaS5yYXRlOworICB3aWR0aCA9IHdwaS53aWR0aDsKKyAgY2hhbnMgPSB3cGkuY2hhbm5lbHM7CisgIG1hc2sgPSB3cGkuY2hhbm5lbF9tYXNrOworCisgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgInJhdGU6ICV1LCB3aWR0aDogJXUsIGNoYW5zOiAldSIsIHJhdGUsIHdpZHRoLCBjaGFucyk7CisKKyAgR1NUX0JVRkZFUl9QVFMgKGJ1ZikgPQorICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAod3BoLmJsb2NrX2luZGV4LCBHU1RfU0VDT05ELCByYXRlKTsKKyAgR1NUX0JVRkZFUl9EVFMgKGJ1ZikgPSBHU1RfQlVGRkVSX1BUUyAoYnVmKTsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKSA9CisgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50ICh3cGguYmxvY2tfaW5kZXggKyB3cGguYmxvY2tfc2FtcGxlcywKKyAgICAgIEdTVF9TRUNPTkQsIHJhdGUpIC0gR1NUX0JVRkZFUl9QVFMgKGJ1Zik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHd2cGFyc2UtPnNhbXBsZV9yYXRlICE9IHJhdGUgfHwgd3ZwYXJzZS0+Y2hhbm5lbHMgIT0gY2hhbnMKKyAgICAgICAgICB8fCB3dnBhcnNlLT53aWR0aCAhPSB3aWR0aCB8fCB3dnBhcnNlLT5jaGFubmVsX21hc2sgIT0gbWFzaykpIHsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgaWYgKHdwaS5jb3JyZWN0aW9uKSB7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtd2F2cGFjay1jb3JyZWN0aW9uIiwKKyAgICAgICAgICAiZnJhbWVkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtd2F2cGFjayIsCisgICAgICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgY2hhbnMsCisgICAgICAgICAgInJhdGUiLCBHX1RZUEVfSU5ULCByYXRlLAorICAgICAgICAgICJkZXB0aCIsIEdfVFlQRV9JTlQsIHdpZHRoLCAiZnJhbWVkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworCisgICAgICBpZiAoIW1hc2spCisgICAgICAgIG1hc2sgPSBnc3Rfd2F2cGFja19nZXRfZGVmYXVsdF9jaGFubmVsX21hc2sgKHd2cGFyc2UtPmNoYW5uZWxzKTsKKyAgICAgIGlmIChtYXNrICE9IDApIHsKKyAgICAgICAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zWzY0XSA9CisgICAgICAgICAgICB7IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0lOVkFMSUQsIH07CisgICAgICAgIGd1aW50NjQgZ21hc2s7CisKKyAgICAgICAgaWYgKCFnc3Rfd2F2cGFja19nZXRfY2hhbm5lbF9wb3NpdGlvbnMgKGNoYW5zLCBtYXNrLCBwb3MpKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh3dnBhcnNlLCAiRmFpbGVkIHRvIGRldGVybWluZSBjaGFubmVsIGxheW91dCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uc190b19tYXNrIChwb3MsIGNoYW5zLCBGQUxTRSwgJmdtYXNrKTsKKyAgICAgICAgICBpZiAoZ21hc2spCisgICAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLAorICAgICAgICAgICAgICAgICJjaGFubmVsLW1hc2siLCBHU1RfVFlQRV9CSVRNQVNLLCBnbWFzaywgTlVMTCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBnc3RfcGFkX3NldF9jYXBzIChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChwYXJzZSksIGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAgIHd2cGFyc2UtPnNhbXBsZV9yYXRlID0gcmF0ZTsKKyAgICB3dnBhcnNlLT5jaGFubmVscyA9IGNoYW5zOworICAgIHd2cGFyc2UtPndpZHRoID0gd2lkdGg7CisgICAgd3ZwYXJzZS0+Y2hhbm5lbF9tYXNrID0gbWFzazsKKworICAgIGlmICh3dnBhcnNlLT50b3RhbF9zYW1wbGVzKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUICh3dnBhcnNlLCAic2V0dGluZyBkdXJhdGlvbiIpOworICAgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X2R1cmF0aW9uIChHU1RfQkFTRV9QQVJTRSAod3ZwYXJzZSksCisgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50ICh3dnBhcnNlLT50b3RhbF9zYW1wbGVzLAorICAgICAgICAgICAgICBHU1RfU0VDT05ELCB3dnBhcnNlLT5zYW1wbGVfcmF0ZSksIDApOworICAgIH0KKyAgfQorCisgIC8qIHJldHVybiB0byBub3JtYWwgc2l6ZSAqLworICBnc3RfYmFzZV9wYXJzZV9zZXRfbWluX2ZyYW1lX3NpemUgKHBhcnNlLCBzaXplb2YgKFdhdnBhY2tIZWFkZXIpKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICByZXR1cm4gZ3N0X2Jhc2VfcGFyc2VfZmluaXNoX2ZyYW1lIChwYXJzZSwgZnJhbWUsIGZybXNpemUpOworCitza2lwOgorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICBHU1RfTE9HX09CSkVDVCAod3ZwYXJzZSwgInNraXBwaW5nICVkIiwgKnNraXBzaXplKTsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCittb3JlOgorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICBHU1RfTE9HX09CSkVDVCAod3ZwYXJzZSwgIm5lZWQgYXQgbGVhc3QgJXUiLCBmcm1zaXplKTsKKyAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplIChwYXJzZSwgZnJtc2l6ZSk7CisgICpza2lwc2l6ZSA9IDA7CisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9maWVsZHMgKEdzdENhcHMgKiBjYXBzKQoreworICBndWludCBpLCBuOworCisgIG4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCBpKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzLCAiZnJhbWVkIik7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3dhdnBhY2tfcGFyc2VfZ2V0X3NpbmtfY2FwcyAoR3N0QmFzZVBhcnNlICogcGFyc2UsIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKnBlZXJjYXBzLCAqdGVtcGw7CisgIEdzdENhcHMgKnJlczsKKworICB0ZW1wbCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChHU1RfQkFTRV9QQVJTRV9TSU5LX1BBRCAocGFyc2UpKTsKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKmZjb3B5ID0gZ3N0X2NhcHNfY29weSAoZmlsdGVyKTsKKyAgICAvKiBSZW1vdmUgdGhlIGZpZWxkcyB3ZSBjb252ZXJ0ICovCisgICAgcmVtb3ZlX2ZpZWxkcyAoZmNvcHkpOworICAgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSwgZmNvcHkpOworICAgIGdzdF9jYXBzX3VucmVmIChmY29weSk7CisgIH0gZWxzZQorICAgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSwgTlVMTCk7CisKKyAgaWYgKHBlZXJjYXBzKSB7CisgICAgLyogUmVtb3ZlIHRoZSBmcmFtZWQgZmllbGQgKi8KKyAgICBwZWVyY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKHBlZXJjYXBzKTsKKyAgICByZW1vdmVfZmllbGRzIChwZWVyY2Fwcyk7CisKKyAgICByZXMgPSBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAocGVlcmNhcHMsIHRlbXBsLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmIChwZWVyY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHRlbXBsKTsKKyAgfSBlbHNlIHsKKyAgICByZXMgPSB0ZW1wbDsKKyAgfQorCisgIGlmIChmaWx0ZXIpIHsKKyAgICBHc3RDYXBzICppbnRlcnNlY3Rpb247CisKKyAgICBpbnRlcnNlY3Rpb24gPQorICAgICAgICBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCByZXMsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHJlcyk7CisgICAgcmVzID0gaW50ZXJzZWN0aW9uOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF93YXZwYWNrX3BhcnNlX3ByZV9wdXNoX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lKQoreworICBHc3RXYXZwYWNrUGFyc2UgKndhdnBhY2twYXJzZSA9IEdTVF9XQVZQQUNLX1BBUlNFIChwYXJzZSk7CisKKyAgaWYgKCF3YXZwYWNrcGFyc2UtPnNlbnRfY29kZWNfdGFnKSB7CisgICAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgLyogY29kZWMgdGFnICovCisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpKTsKKyAgICBpZiAoR19VTkxJS0VMWSAoY2FwcyA9PSBOVUxMKSkgeworICAgICAgaWYgKEdTVF9QQURfSVNfRkxVU0hJTkcgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSkpIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgZmx1c2hpbmciKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgbm90IG5lZ290aWF0ZWQhIik7CisgICAgICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0YWdsaXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgICBnc3RfcGJfdXRpbHNfYWRkX2NvZGVjX2Rlc2NyaXB0aW9uX3RvX3RhZ19saXN0ICh0YWdsaXN0LAorICAgICAgICBHU1RfVEFHX0FVRElPX0NPREVDLCBjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgICBnc3RfYmFzZV9wYXJzZV9tZXJnZV90YWdzIChwYXJzZSwgdGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFKTsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ2xpc3QpOworCisgICAgLyogYWxzbyBzaWduYWxzIHRoZSBlbmQgb2YgZmlyc3QtZnJhbWUgcHJvY2Vzc2luZyAqLworICAgIHdhdnBhY2twYXJzZS0+c2VudF9jb2RlY190YWcgPSBUUlVFOworICB9CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvcGFyc2Vycy9nc3R3YXZwYWNrcGFyc2UuaCBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzMjVhYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qIEdTdHJlYW1lciBXYXZwYWNrIHBhcnNlcgorICogQ29weXJpZ2h0IChDKSAyMDEyIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSAyMDEyIE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBDb250YWN0OiBTdGVmYW4gS29zdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfV0FWUEFDS19QQVJTRV9IX18KKyNkZWZpbmUgX19HU1RfV0FWUEFDS19QQVJTRV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNlcGFyc2UuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1dBVlBBQ0tfUEFSU0UgXAorICAoZ3N0X3dhdnBhY2tfcGFyc2VfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1dBVlBBQ0tfUEFSU0Uob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSwgR1NUX1RZUEVfV0FWUEFDS19QQVJTRSwgR3N0V2F2cGFja1BhcnNlKSkKKyNkZWZpbmUgR1NUX1dBVlBBQ0tfUEFSU0VfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksIEdTVF9UWVBFX1dBVlBBQ0tfUEFSU0UsIEdzdFdhdnBhY2tQYXJzZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1dBVlBBQ0tfUEFSU0Uob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSwgR1NUX1RZUEVfV0FWUEFDS19QQVJTRSkpCisjZGVmaW5lIEdTVF9JU19XQVZQQUNLX1BBUlNFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLCBHU1RfVFlQRV9XQVZQQUNLX1BBUlNFKSkKKworCisjZGVmaW5lIElEX1VOSVFVRSAgICAgICAgICAgICAgIDB4M2YKKyNkZWZpbmUgSURfT1BUSU9OQUxfREFUQSAgICAgICAgMHgyMAorI2RlZmluZSBJRF9PRERfU0laRSAgICAgICAgICAgICAweDQwCisjZGVmaW5lIElEX0xBUkdFICAgICAgICAgICAgICAgIDB4ODAKKworI2RlZmluZSBJRF9EVU1NWSAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgSURfRU5DT0RFUl9JTkZPICAgICAgICAgMHgxCisjZGVmaW5lIElEX0RFQ09SUl9URVJNUyAgICAgICAgIDB4MgorI2RlZmluZSBJRF9ERUNPUlJfV0VJR0hUUyAgICAgICAweDMKKyNkZWZpbmUgSURfREVDT1JSX1NBTVBMRVMgICAgICAgMHg0CisjZGVmaW5lIElEX0VOVFJPUFlfVkFSUyAgICAgICAgIDB4NQorI2RlZmluZSBJRF9IWUJSSURfUFJPRklMRSAgICAgICAweDYKKyNkZWZpbmUgSURfU0hBUElOR19XRUlHSFRTICAgICAgMHg3CisjZGVmaW5lIElEX0ZMT0FUX0lORk8gICAgICAgICAgIDB4OAorI2RlZmluZSBJRF9JTlQzMl9JTkZPICAgICAgICAgICAweDkKKyNkZWZpbmUgSURfV1ZfQklUU1RSRUFNICAgICAgICAgMHhhCisjZGVmaW5lIElEX1dWQ19CSVRTVFJFQU0gICAgICAgIDB4YgorI2RlZmluZSBJRF9XVlhfQklUU1RSRUFNICAgICAgICAweGMKKyNkZWZpbmUgSURfQ0hBTk5FTF9JTkZPICAgICAgICAgMHhkCisKKyNkZWZpbmUgSURfUklGRl9IRUFERVIgICAgICAgICAgKElEX09QVElPTkFMX0RBVEEgfCAweDEpCisjZGVmaW5lIElEX1JJRkZfVFJBSUxFUiAgICAgICAgIChJRF9PUFRJT05BTF9EQVRBIHwgMHgyKQorI2RlZmluZSBJRF9SRVBMQVlfR0FJTiAgICAgICAgICAoSURfT1BUSU9OQUxfREFUQSB8IDB4MykKKyNkZWZpbmUgSURfQ1VFU0hFRVQgICAgICAgICAgICAgKElEX09QVElPTkFMX0RBVEEgfCAweDQpCisjZGVmaW5lIElEX0NPTkZJR19CTE9DSyAgICAgICAgIChJRF9PUFRJT05BTF9EQVRBIHwgMHg1KQorI2RlZmluZSBJRF9NRDVfQ0hFQ0tTVU0gICAgICAgICAoSURfT1BUSU9OQUxfREFUQSB8IDB4NikKKyNkZWZpbmUgSURfU0FNUExFX1JBVEUgICAgICAgICAgKElEX09QVElPTkFMX0RBVEEgfCAweDcpCisKKyNkZWZpbmUgRkxBR19GSU5BTF9CTE9DSyAgICAgICAgKDEgPDwgMTIpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY2hhciBja0lEIFs0XTsgICAgICAgICAgICAgLyogInd2cGsiICovCisgIGd1aW50MzIgY2tTaXplOyAgICAgICAgICAgIC8qIHNpemUgb2YgZW50aXJlIGJsb2NrIChtaW51cyA4LCBvZiBjb3Vyc2UpICovCisgIGd1aW50MTYgdmVyc2lvbjsgICAgICAgICAgIC8qIDB4NDAyIHRvIDB4NDEwIGFyZSBjdXJyZW50bHkgdmFsaWQgZm9yIGRlY29kZSAqLworICBndWNoYXIgdHJhY2tfbm87ICAgICAgICAgICAvKiB0cmFjayBudW1iZXIgKDAgaWYgbm90IHVzZWQsIGxpa2Ugbm93KSAqLworICBndWNoYXIgaW5kZXhfbm87ICAgICAgICAgICAvKiB0cmFjayBzdWItaW5kZXggKDAgaWYgbm90IHVzZWQsIGxpa2Ugbm93KSAqLworICBndWludDMyIHRvdGFsX3NhbXBsZXM7ICAgICAvKiB0b3RhbCBzYW1wbGVzIGZvciBlbnRpcmUgZmlsZSwgYnV0IHRoaXMgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb25seSB2YWxpZCBpZiBibG9ja19pbmRleCA9PSAwIGFuZCBhIHZhbHVlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIC0xIGluZGljYXRlcyB1bmtub3duIGxlbmd0aCAqLworICBndWludDMyIGJsb2NrX2luZGV4OyAgICAgICAvKiBpbmRleCBvZiBmaXJzdCBzYW1wbGUgaW4gYmxvY2sgcmVsYXRpdmUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmVnaW5uaW5nIG9mIGZpbGUgKG5vcm1hbGx5IHRoaXMgd291bGQgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYXQgMCBmb3IgdGhlIGZpcnN0IGJsb2NrKSAqLworICBndWludDMyIGJsb2NrX3NhbXBsZXM7ICAgICAvKiBudW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGlzIGJsb2NrICgwID0gbm8gYXVkaW8pICovCisgIGd1aW50MzIgZmxhZ3M7ICAgICAgICAgICAgIC8qIHZhcmlvdXMgZmxhZ3MgZm9yIGlkIGFuZCBkZWNvZGluZyAqLworICBndWludDMyIGNyYzsgICAgICAgICAgICAgICAvKiBjcmMgZm9yIGFjdHVhbCBkZWNvZGVkIGRhdGEgKi8KK30gV2F2cGFja0hlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBnYm9vbGVhbiBjb3JyZWN0aW9uOworICBndWludCByYXRlOworICBndWludCB3aWR0aDsKKyAgZ3VpbnQgY2hhbm5lbHM7CisgIGd1aW50IGNoYW5uZWxfbWFzazsKK30gV2F2cGFja0luZm87CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RXYXZwYWNrUGFyc2UgR3N0V2F2cGFja1BhcnNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFdhdnBhY2tQYXJzZUNsYXNzIEdzdFdhdnBhY2tQYXJzZUNsYXNzOworCisvKioKKyAqIEdzdFdhdnBhY2tQYXJzZToKKyAqCisgKiBUaGUgb3BhcXVlIEdzdFdhdnBhY2tQYXJzZSBvYmplY3QKKyAqLworc3RydWN0IF9Hc3RXYXZwYWNrUGFyc2UgeworICBHc3RCYXNlUGFyc2UgYmFzZXBhcnNlOworCisgIC8qPCBwcml2YXRlID4qLworICBnaW50ICAgICAgICAgIHNhbXBsZV9yYXRlOworICBnaW50ICAgICAgICAgIGNoYW5uZWxzOworICBnaW50ICAgICAgICAgIHdpZHRoOworICBnaW50ICAgICAgICAgIGNoYW5uZWxfbWFzazsKKworICBndWludCAgICAgICAgIHRvdGFsX3NhbXBsZXM7CisKKyAgZ2Jvb2xlYW4gICAgICBzZW50X2NvZGVjX3RhZzsKK307CisKKy8qKgorICogR3N0V2F2cGFja1BhcnNlQ2xhc3M6CisgKiBAcGFyZW50X2NsYXNzOiBFbGVtZW50IHBhcmVudCBjbGFzcy4KKyAqCisgKiBUaGUgb3BhcXVlIEdzdFdhdnBhY2tQYXJzZUNsYXNzIGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdFdhdnBhY2tQYXJzZUNsYXNzIHsKKyAgR3N0QmFzZVBhcnNlQ2xhc3MgYmFzZXBhcnNlX2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3dhdnBhY2tfcGFyc2VfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfV0FWUEFDS19QQVJTRV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb3BhcnNlcnMvbWVzb24uYnVpbGQgYi9nc3QvYXVkaW9wYXJzZXJzL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNWJmODcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9wYXJzZXJzL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMjEgQEAKK2F1ZGlvcGFyc2Vyc19zcmMgPSBbCisgICdnc3RhYWNwYXJzZS5jJywKKyAgJ2dzdGFtcnBhcnNlLmMnLAorICAnZ3N0YWMzcGFyc2UuYycsCisgICdnc3RkY2FwYXJzZS5jJywKKyAgJ2dzdGZsYWNwYXJzZS5jJywKKyAgJ2dzdG1wZWdhdWRpb3BhcnNlLmMnLAorICAnZ3N0c2JjcGFyc2UuYycsCisgICdnc3R3YXZwYWNrcGFyc2UuYycsCisgICdwbHVnaW4uYycsCitdCisKK2dzdGF1ZGlvcGFyc2VycyA9IGxpYnJhcnkoJ2dzdGF1ZGlvcGFyc2VycycsCisgIGF1ZGlvcGFyc2Vyc19zcmMsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0X2RlcCwgZ3N0YmFzZV9kZXAsIGdzdHBidXRpbHNfZGVwLAorICAgICAgICAgICAgICAgICAgZ3N0YXVkaW9fZGVwLCBnc3R0YWdfZGVwXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKZGlmZiAtLWdpdCBhL2dzdC9hdWRpb3BhcnNlcnMvcGx1Z2luLmMgYi9nc3QvYXVkaW9wYXJzZXJzL3BsdWdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYmZlNjAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9wYXJzZXJzL3BsdWdpbi5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qIEdTdHJlYW1lciBhdWRpbyBwYXJzZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RhYWNwYXJzZS5oIgorI2luY2x1ZGUgImdzdGFtcnBhcnNlLmgiCisjaW5jbHVkZSAiZ3N0YWMzcGFyc2UuaCIKKyNpbmNsdWRlICJnc3RkY2FwYXJzZS5oIgorI2luY2x1ZGUgImdzdGZsYWNwYXJzZS5oIgorI2luY2x1ZGUgImdzdG1wZWdhdWRpb3BhcnNlLmgiCisjaW5jbHVkZSAiZ3N0c2JjcGFyc2UuaCIKKyNpbmNsdWRlICJnc3R3YXZwYWNrcGFyc2UuaCIKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBnYm9vbGVhbiByZXQ7CisKKyAgcmV0ID0gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImFhY3BhcnNlIiwKKyAgICAgIEdTVF9SQU5LX1BSSU1BUlkgKyAxLCBHU1RfVFlQRV9BQUNfUEFSU0UpOworICByZXQgJj0gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImFtcnBhcnNlIiwKKyAgICAgIEdTVF9SQU5LX1BSSU1BUlkgKyAxLCBHU1RfVFlQRV9BTVJfUEFSU0UpOworICByZXQgJj0gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImFjM3BhcnNlIiwKKyAgICAgIEdTVF9SQU5LX1BSSU1BUlkgKyAxLCBHU1RfVFlQRV9BQzNfUEFSU0UpOworICByZXQgJj0gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImRjYXBhcnNlIiwKKyAgICAgIEdTVF9SQU5LX1BSSU1BUlkgKyAxLCBHU1RfVFlQRV9EQ0FfUEFSU0UpOworICByZXQgJj0gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImZsYWNwYXJzZSIsCisgICAgICBHU1RfUkFOS19QUklNQVJZICsgMSwgR1NUX1RZUEVfRkxBQ19QQVJTRSk7CisgIHJldCAmPSBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAibXBlZ2F1ZGlvcGFyc2UiLAorICAgICAgR1NUX1JBTktfUFJJTUFSWSArIDIsIEdTVF9UWVBFX01QRUdfQVVESU9fUEFSU0UpOworICByZXQgJj0gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInNiY3BhcnNlIiwKKyAgICAgIEdTVF9SQU5LX1BSSU1BUlkgKyAxLCBHU1RfVFlQRV9TQkNfUEFSU0UpOworICByZXQgJj0gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIndhdnBhY2twYXJzZSIsCisgICAgICBHU1RfUkFOS19QUklNQVJZICsgMSwgR1NUX1RZUEVfV0FWUEFDS19QQVJTRSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgYXVkaW9wYXJzZXJzLAorICAgICJQYXJzZXJzIGZvciB2YXJpb3VzIGF1ZGlvIGZvcm1hdHMiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9nc3QvYXVwYXJzZS8uZ2l0aWdub3JlIGIvZ3N0L2F1cGFyc2UvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGY1ZWQzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1cGFyc2UvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDcgQEAKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorKi5vCisqLmxvCisqLmxhCisuZGVwcworLmxpYnMKZGlmZiAtLWdpdCBhL2dzdC9hdXBhcnNlL01ha2VmaWxlLmFtIGIvZ3N0L2F1cGFyc2UvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEzZDBmMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdXBhcnNlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOCBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0YXVwYXJzZS5sYQorCitsaWJnc3RhdXBhcnNlX2xhX1NPVVJDRVMgPSBnc3RhdXBhcnNlLmMKK2xpYmdzdGF1cGFyc2VfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdGF1cGFyc2VfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pICQoR1NUX0xJQlMpICQoR1NUX0JBU0VfTElCUykKK2xpYmdzdGF1cGFyc2VfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdGF1cGFyc2UuaApkaWZmIC0tZ2l0IGEvZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jIGIvZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MTRhZDgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmMKQEAgLTAsMCArMSw4MTEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXVwYXJzZQorICoKKyAqIFBhcnNlcyAuYXUgZmlsZXMgbW9zdGx5IG9yaWdpbmF0aW5nIGZyb20gc3VuIG9zIGJhc2VkIGNvbXB1dGVycy4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdGF1cGFyc2UuaCIKKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoYXVwYXJzZV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAoYXVwYXJzZV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LWF1IikKKyAgICApOworCisjZGVmaW5lIEdTVF9BVV9QQVJTRV9SQVdfUEFEX1RFTVBMQVRFX0NBUFMgXAorICAgICJhdWRpby94LXJhdywgIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImZvcm1hdD0gKHN0cmluZykgeyBTOCwgUzE2TEUsIFMxNkJFLCBTMjRMRSwgUzI0QkUsICIgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIlMzMkxFLCBTMzJCRSwgRjMyTEUsIEYzMkJFLCAiICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICJGNjRMRSwgRjY0QkUgfSwgIiBcCisgICAgInJhdGUgPSAoaW50KSBbIDgwMDAsIDE5MjAwMCBdLCAiICAgICAgIFwKKyAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiICAgICAgICAgICAgICAgICAgXAorICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZDsiICAgICAgICBcCisgICAgImF1ZGlvL3gtcmF3LCAiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiZm9ybWF0PSAoc3RyaW5nKSB7IFM4LCBTMTZMRSwgUzE2QkUsIFMyNExFLCBTMjRCRSwgIiAgXAorICAgICAgICAgICAgICAgICAgICAgICAiUzMyTEUsIFMzMkJFLCBGMzJMRSwgRjMyQkUsICIgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIkY2NExFLCBGNjRCRSB9LCAiIFwKKyAgICAicmF0ZSA9IChpbnQpIFsgODAwMCwgMTkyMDAwIF0sICIgICAgICAgXAorICAgICJjaGFubmVscyA9IChpbnQpIDIsICIgICAgICAgICAgICAgICAgICBcCisgICAgImNoYW5uZWwtbWFzayA9IChiaXRtYXNrKSAweDMsIiAgICAgICAgIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQiCisKKyNkZWZpbmUgR1NUX0FVX1BBUlNFX0FMQVdfUEFEX1RFTVBMQVRFX0NBUFMgXAorICAgICJhdWRpby94LWFsYXcsICIgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJhdGUgPSAoaW50KSBbIDgwMDAsIDE5MjAwMCBdLCAiICAgICAgIFwKKyAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDIgXSIKKworI2RlZmluZSBHU1RfQVVfUEFSU0VfTVVMQVdfUEFEX1RFTVBMQVRFX0NBUFMgXAorICAgICJhdWRpby94LW11bGF3LCAiICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJyYXRlID0gKGludCkgWyA4MDAwLCAxOTIwMDAgXSwgIiAgICAgICAgXAorICAgICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdIgorCisvKiBOb3RoaW5nIHRvIGRlY29kZSB0aG9zZSBBRFBDTSBzdHJlYW1zIGZvciBub3cgKi8KKyNkZWZpbmUgR1NUX0FVX1BBUlNFX0FEUENNX1BBRF9URU1QTEFURV9DQVBTIFwKKyAgICAiYXVkaW8veC1hZHBjbSwgIiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgeyBnNzIxLCBnNzIyLCBnNzIzXzMsIGc3MjNfNSB9IgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX0FVX1BBUlNFX1JBV19QQURfVEVNUExBVEVfQ0FQUyAiOyAiCisgICAgICAgIEdTVF9BVV9QQVJTRV9BTEFXX1BBRF9URU1QTEFURV9DQVBTICI7IgorICAgICAgICBHU1RfQVVfUEFSU0VfTVVMQVdfUEFEX1RFTVBMQVRFX0NBUFMgIjsiCisgICAgICAgIEdTVF9BVV9QQVJTRV9BRFBDTV9QQURfVEVNUExBVEVfQ0FQUykpOworCisKK3N0YXRpYyB2b2lkIGdzdF9hdV9wYXJzZV9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9hdV9wYXJzZV9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyICogYnVmKTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfYXVfcGFyc2VfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyB2b2lkIGdzdF9hdV9wYXJzZV9yZXNldCAoR3N0QXVQYXJzZSAqIGF1cGFyc2UpOworc3RhdGljIGdib29sZWFuIGdzdF9hdV9wYXJzZV9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworc3RhdGljIGdib29sZWFuIGdzdF9hdV9wYXJzZV9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9hdV9wYXJzZV9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVfcGFyc2Vfc3JjX2NvbnZlcnQgKEdzdEF1UGFyc2UgKiBhdXBhcnNlLAorICAgIEdzdEZvcm1hdCBzcmNfZm9ybWF0LCBnaW50NjQgc3JjdmFsLCBHc3RGb3JtYXQgZGVzdF9mb3JtYXQsCisgICAgZ2ludDY0ICogZGVzdHZhbCk7CisKKyNkZWZpbmUgZ3N0X2F1X3BhcnNlX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdEF1UGFyc2UsIGdzdF9hdV9wYXJzZSwgR1NUX1RZUEVfRUxFTUVOVCk7CisKK3N0YXRpYyB2b2lkCitnc3RfYXVfcGFyc2VfY2xhc3NfaW5pdCAoR3N0QXVQYXJzZUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChhdXBhcnNlX2RlYnVnLCAiYXVwYXJzZSIsIDAsICIuYXUgcGFyc2VyIik7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3RfYXVfcGFyc2VfZGlzcG9zZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdV9wYXJzZV9jaGFuZ2Vfc3RhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiQVUgYXVkaW8gZGVtdXhlciIsCisgICAgICAiQ29kZWMvRGVtdXhlci9BdWRpbyIsCisgICAgICAiUGFyc2UgYW4gLmF1IGZpbGUgaW50byByYXcgYXVkaW8iLAorICAgICAgIkVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVfcGFyc2VfaW5pdCAoR3N0QXVQYXJzZSAqIGF1cGFyc2UpCit7CisgIGF1cGFyc2UtPnNpbmtwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNpbmtfdGVtcGxhdGUsICJzaW5rIik7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChhdXBhcnNlLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdV9wYXJzZV9jaGFpbikpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoYXVwYXJzZS0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVfcGFyc2Vfc2lua19ldmVudCkpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoYXVwYXJzZSksIGF1cGFyc2UtPnNpbmtwYWQpOworCisgIGF1cGFyc2UtPnNyY3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc3JjX3RlbXBsYXRlLCAic3JjIik7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChhdXBhcnNlLT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1X3BhcnNlX3NyY19xdWVyeSkpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoYXVwYXJzZS0+c3JjcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdV9wYXJzZV9zcmNfZXZlbnQpKTsKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoYXVwYXJzZS0+c3JjcGFkKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKGF1cGFyc2UpLCBhdXBhcnNlLT5zcmNwYWQpOworCisgIGF1cGFyc2UtPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgIGdzdF9hdV9wYXJzZV9yZXNldCAoYXVwYXJzZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVfcGFyc2VfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0QXVQYXJzZSAqYXUgPSBHU1RfQVVfUEFSU0UgKG9iamVjdCk7CisKKyAgaWYgKGF1LT5hZGFwdGVyICE9IE5VTEwpIHsKKyAgICBnX29iamVjdF91bnJlZiAoYXUtPmFkYXB0ZXIpOworICAgIGF1LT5hZGFwdGVyID0gTlVMTDsKKyAgfQorICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdV9wYXJzZV9yZXNldCAoR3N0QXVQYXJzZSAqIGF1cGFyc2UpCit7CisgIGF1cGFyc2UtPm9mZnNldCA9IDA7CisgIGF1cGFyc2UtPmJ1ZmZlcl9vZmZzZXQgPSAwOworICBhdXBhcnNlLT5lbmNvZGluZyA9IDA7CisgIGF1cGFyc2UtPnNhbXBsZXJhdGUgPSAwOworICBhdXBhcnNlLT5jaGFubmVscyA9IDA7CisKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGF1cGFyc2UtPmFkYXB0ZXIpOworCisgIGdzdF9jYXBzX3JlcGxhY2UgKCZhdXBhcnNlLT5zcmNfY2FwcywgTlVMTCk7CisKKyAgLyogZ3N0X3NlZ21lbnRfaW5pdCAoJmF1cGFyc2UtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7ICovCit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVfcGFyc2VfbmVnb3RpYXRlX3NyY3BhZCAoR3N0QXVQYXJzZSAqIGF1cGFyc2UsIEdzdENhcHMgKiBuZXdfY2FwcykKK3sKKyAgaWYgKGF1cGFyc2UtPnNyY19jYXBzICYmIGdzdF9jYXBzX2lzX2VxdWFsIChuZXdfY2FwcywgYXVwYXJzZS0+c3JjX2NhcHMpKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGF1cGFyc2UsICJzYW1lIGNhcHMsIG5vdGhpbmcgdG8gZG8iKTsKKyAgICByZXR1cm47CisgIH0KKworICBnc3RfY2Fwc19yZXBsYWNlICgmYXVwYXJzZS0+c3JjX2NhcHMsIG5ld19jYXBzKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXVwYXJzZSwgIkNoYW5naW5nIHNyYyBwYWQgY2FwcyB0byAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIGF1cGFyc2UtPnNyY19jYXBzKTsKKyAgZ3N0X3BhZF9zZXRfY2FwcyAoYXVwYXJzZS0+c3JjcGFkLCBhdXBhcnNlLT5zcmNfY2Fwcyk7CisKKyAgcmV0dXJuOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F1X3BhcnNlX3BhcnNlX2hlYWRlciAoR3N0QXVQYXJzZSAqIGF1cGFyc2UpCit7CisgIEdzdENhcHMgKnRlbXBjYXBzOworICBndWludDMyIHNpemU7CisgIGd1aW50OCAqaGVhZDsKKyAgZ2NoYXIgbGF5b3V0WzddID0geyAwLCB9OworICBHc3RBdWRpb0Zvcm1hdCBmb3JtYXQgPSBHU1RfQVVESU9fRk9STUFUX1VOS05PV047CisgIGdpbnQgbGF3ID0gMDsKKyAgZ3VpbnQgZW5kaWFubmVzczsKKworICBoZWFkID0gKGd1aW50OCAqKSBnc3RfYWRhcHRlcl9tYXAgKGF1cGFyc2UtPmFkYXB0ZXIsIDI0KTsKKyAgZ19hc3NlcnQgKGhlYWQgIT0gTlVMTCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXVwYXJzZSwgIlslYyVjJWMlY10iLCBoZWFkWzBdLCBoZWFkWzFdLCBoZWFkWzJdLCBoZWFkWzNdKTsKKworICBzd2l0Y2ggKEdTVF9SRUFEX1VJTlQzMl9CRSAoaGVhZCkpIHsKKyAgICAgIC8qIG5vcm1hbCBmb3JtYXQgaXMgYmlnIGVuZGlhbiAoYXUgaXMgYSBTcGFyYyBmb3JtYXQpICovCisgICAgY2FzZSAweDJlNzM2ZTY0OnsgICAgICAgICAgLyogIi5zbmQiICovCisgICAgICBlbmRpYW5uZXNzID0gR19CSUdfRU5ESUFOOworICAgICAgYnJlYWs7CisgICAgfQorICAgICAgLyogYW5kIG9mIGNvdXJzZSwgc29tZW9uZSBoYWQgdG8gaW52ZW50IGEgbGl0dGxlIGVuZGlhbgorICAgICAgICogdmVyc2lvbi4gIFVzZWQgYnkgREVDIHN5c3RlbXMuICovCisgICAgY2FzZSAweDY0NmU3MzJlOiAgICAgICAgICAgLyogZG5zLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBjYXNlIDB4MDA2NDczMmU6eyAgICAgICAgICAvKiBvdGhlciBzb3VyY2Ugc2F5IGl0IGlzICJkbnMuIiAqLworICAgICAgZW5kaWFubmVzcyA9IEdfTElUVExFX0VORElBTjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OnsKKyAgICAgIGdvdG8gdW5rbm93bl9oZWFkZXI7CisgICAgfQorICB9CisKKyAgYXVwYXJzZS0+b2Zmc2V0ID0gR1NUX1JFQURfVUlOVDMyX0JFIChoZWFkICsgNCk7CisgIC8qIERvIG5vdCB0cnVzdCBzaXplLCBjb3VsZCBiZSBzZXQgdG8gLTEgOiB1bmtub3duCisgICAqIG90aGVyd2lzZTogZmlsZXNpemUgPSBzaXplICsgYXVwYXJzZS0+b2Zmc2V0CisgICAqLworICBzaXplID0gR1NUX1JFQURfVUlOVDMyX0JFIChoZWFkICsgOCk7CisgIGF1cGFyc2UtPmVuY29kaW5nID0gR1NUX1JFQURfVUlOVDMyX0JFIChoZWFkICsgMTIpOworICBhdXBhcnNlLT5zYW1wbGVyYXRlID0gR1NUX1JFQURfVUlOVDMyX0JFIChoZWFkICsgMTYpOworICBhdXBhcnNlLT5jaGFubmVscyA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoaGVhZCArIDIwKTsKKworICBpZiAoYXVwYXJzZS0+c2FtcGxlcmF0ZSA8IDgwMDAgfHwgYXVwYXJzZS0+c2FtcGxlcmF0ZSA+IDE5MjAwMCkKKyAgICBnb3RvIHVuc3VwcG9ydGVkX3NhbXBsZV9yYXRlOworCisgIGlmIChhdXBhcnNlLT5jaGFubmVscyA8IDEgfHwgYXVwYXJzZS0+Y2hhbm5lbHMgPiAyKQorICAgIGdvdG8gdW5zdXBwb3J0ZWRfbnVtYmVyX29mX2NoYW5uZWxzOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF1cGFyc2UsICJvZmZzZXQgJSIgR19HSU5UNjRfRk9STUFUICIsIHNpemUgJXUsICIKKyAgICAgICJlbmNvZGluZyAldSwgZnJlcXVlbmN5ICV1LCBjaGFubmVscyAldSIsIGF1cGFyc2UtPm9mZnNldCwgc2l6ZSwKKyAgICAgIGF1cGFyc2UtPmVuY29kaW5nLCBhdXBhcnNlLT5zYW1wbGVyYXRlLCBhdXBhcnNlLT5jaGFubmVscyk7CisKKyAgLyogRG9jczoKKyAgICogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL3B1YmxpYy9wdWJzL2V4dGVybmFsL2F1Zm9ybWF0Lmh0bWwKKyAgICogaHR0cDovL2FzdHJvbm9teS5zd2luLmVkdS5hdS9+cGJvdXJrZS9kYXRhZm9ybWF0cy9hdS8KKyAgICogU29sYXJpcyBoZWFkZXJzIDogL3Vzci9pbmNsdWRlL2F1ZGlvL2F1LmgKKyAgICogbGlic25kZmlsZSA6IHNyYy9hdS5jCisgICAqCisgICAqIFNhbXBsZXMgOgorICAgKiBodHRwOi8vd3d3LnRzcC5lY2UubWNnaWxsLmNhL01NU1AvRG9jdW1lbnRzL0F1ZGlvRm9ybWF0cy9BVS9TYW1wbGVzLmh0bWwKKyAgICovCisKKyAgc3dpdGNoIChhdXBhcnNlLT5lbmNvZGluZykgeworICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgIC8qIDgtYml0IElTRE4gbXUtbGF3IEcuNzExICovCisgICAgICBsYXcgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNzogICAgICAgICAgICAgICAgICAgLyogOC1iaXQgSVNETiAgQS1sYXcgRy43MTEgKi8KKyAgICAgIGxhdyA9IDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgIC8qICA4LWJpdCBsaW5lYXIgUENNLCBGSVhNRSBzaWduZWQ/ICovCisgICAgICBmb3JtYXQgPSBHU1RfQVVESU9fRk9STUFUX1M4OworICAgICAgYXVwYXJzZS0+c2FtcGxlX3NpemUgPSBhdXBhcnNlLT5jaGFubmVsczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgIC8qIDE2LWJpdCBsaW5lYXIgUENNICovCisgICAgICBpZiAoZW5kaWFubmVzcyA9PSBHX0xJVFRMRV9FTkRJQU4pCisgICAgICAgIGZvcm1hdCA9IEdTVF9BVURJT19GT1JNQVRfUzE2TEU7CisgICAgICBlbHNlCisgICAgICAgIGZvcm1hdCA9IEdTVF9BVURJT19GT1JNQVRfUzE2QkU7CisgICAgICBhdXBhcnNlLT5zYW1wbGVfc2l6ZSA9IGF1cGFyc2UtPmNoYW5uZWxzICogMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgIC8qIDI0LWJpdCBsaW5lYXIgUENNICovCisgICAgICBpZiAoZW5kaWFubmVzcyA9PSBHX0xJVFRMRV9FTkRJQU4pCisgICAgICAgIGZvcm1hdCA9IEdTVF9BVURJT19GT1JNQVRfUzI0TEU7CisgICAgICBlbHNlCisgICAgICAgIGZvcm1hdCA9IEdTVF9BVURJT19GT1JNQVRfUzI0QkU7CisgICAgICBhdXBhcnNlLT5zYW1wbGVfc2l6ZSA9IGF1cGFyc2UtPmNoYW5uZWxzICogMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNTogICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBsaW5lYXIgUENNICovCisgICAgICBpZiAoZW5kaWFubmVzcyA9PSBHX0xJVFRMRV9FTkRJQU4pCisgICAgICAgIGZvcm1hdCA9IEdTVF9BVURJT19GT1JNQVRfUzMyTEU7CisgICAgICBlbHNlCisgICAgICAgIGZvcm1hdCA9IEdTVF9BVURJT19GT1JNQVRfUzMyQkU7CisgICAgICBhdXBhcnNlLT5zYW1wbGVfc2l6ZSA9IGF1cGFyc2UtPmNoYW5uZWxzICogNDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSA2OiAgICAgICAgICAgICAgICAgICAgLyogMzItYml0IElFRUUgZmxvYXRpbmcgcG9pbnQgKi8KKyAgICAgIGlmIChlbmRpYW5uZXNzID09IEdfTElUVExFX0VORElBTikKKyAgICAgICAgZm9ybWF0ID0gR1NUX0FVRElPX0ZPUk1BVF9GMzJMRTsKKyAgICAgIGVsc2UKKyAgICAgICAgZm9ybWF0ID0gR1NUX0FVRElPX0ZPUk1BVF9GMzJCRTsKKyAgICAgIGF1cGFyc2UtPnNhbXBsZV9zaXplID0gYXVwYXJzZS0+Y2hhbm5lbHMgKiA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OiAgICAgICAgICAgICAgICAgICAgLyogNjQtYml0IElFRUUgZmxvYXRpbmcgcG9pbnQgKi8KKyAgICAgIGlmIChlbmRpYW5uZXNzID09IEdfTElUVExFX0VORElBTikKKyAgICAgICAgZm9ybWF0ID0gR1NUX0FVRElPX0ZPUk1BVF9GNjRMRTsKKyAgICAgIGVsc2UKKyAgICAgICAgZm9ybWF0ID0gR1NUX0FVRElPX0ZPUk1BVF9GNjRCRTsKKyAgICAgIGF1cGFyc2UtPnNhbXBsZV9zaXplID0gYXVwYXJzZS0+Y2hhbm5lbHMgKiA4OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDIzOiAgICAgICAgICAgICAgICAgICAvKiA0LWJpdCBDQ0lUVCBHLjcyMSAgIEFEUENNIDMya2JwcyAtPiBtb2RwbHVnL2xpYnNuZGZpbGUgKGNvbXByZXNzZWQgOC1iaXQgbXUtbGF3KSAqLworICAgICAgc3RyY3B5IChsYXlvdXQsICJnNzIxIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI0OiAgICAgICAgICAgICAgICAgICAvKiA4LWJpdCBDQ0lUVCBHLjcyMiAgIEFEUENNICAgICAgICAtPiBydHAgKi8KKyAgICAgIHN0cmNweSAobGF5b3V0LCAiZzcyMiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNTogICAgICAgICAgICAgICAgICAgLyogMy1iaXQgQ0NJVFQgRy43MjMuMyBBRFBDTSAyNGticHMgLT4gcnRwL3hpbmUvbW9kcGx1Zy9saWJzbmRmaWxlICovCisgICAgICBzdHJjcHkgKGxheW91dCwgImc3MjNfMyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNjogICAgICAgICAgICAgICAgICAgLyogNS1iaXQgQ0NJVFQgRy43MjMuNSBBRFBDTSA0MGticHMgLT4gcnRwL3hpbmUvbW9kcGx1Zy9saWJzbmRmaWxlICovCisgICAgICBzdHJjcHkgKGxheW91dCwgImc3MjNfNSIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDg6ICAgICAgICAgICAgICAgICAgICAvKiBGcmFnbWVudGVkIHNhbXBsZSBkYXRhICovCisgICAgY2FzZSA5OiAgICAgICAgICAgICAgICAgICAgLyogQVVfRU5DT0RJTkdfTkVTVEVEICovCisKKyAgICBjYXNlIDEwOiAgICAgICAgICAgICAgICAgICAvKiBEU1AgcHJvZ3JhbSAqLworICAgIGNhc2UgMTE6ICAgICAgICAgICAgICAgICAgIC8qIERTUCAgOC1iaXQgZml4ZWQgcG9pbnQgKi8KKyAgICBjYXNlIDEyOiAgICAgICAgICAgICAgICAgICAvKiBEU1AgMTYtYml0IGZpeGVkIHBvaW50ICovCisgICAgY2FzZSAxMzogICAgICAgICAgICAgICAgICAgLyogRFNQIDI0LWJpdCBmaXhlZCBwb2ludCAqLworICAgIGNhc2UgMTQ6ICAgICAgICAgICAgICAgICAgIC8qIERTUCAzMi1iaXQgZml4ZWQgcG9pbnQgKi8KKworICAgIGNhc2UgMTY6ICAgICAgICAgICAgICAgICAgIC8qIEFVX0VOQ09ESU5HX0RJU1BMQVkgOiBub24tYXVkaW8gZGlzcGxheSBkYXRhICovCisgICAgY2FzZSAxNzogICAgICAgICAgICAgICAgICAgLyogQVVfRU5DT0RJTkdfTVVMQVdfU1FVRUxDSCAqLworCisgICAgY2FzZSAxODogICAgICAgICAgICAgICAgICAgLyogMTYtYml0IGxpbmVhciB3aXRoIGVtcGhhc2lzICovCisgICAgY2FzZSAxOTogICAgICAgICAgICAgICAgICAgLyogMTYtYml0IGxpbmVhciBjb21wcmVzc2VkIChOZVhUKSAqLworICAgIGNhc2UgMjA6ICAgICAgICAgICAgICAgICAgIC8qIDE2LWJpdCBsaW5lYXIgd2l0aCBlbXBoYXNpcyBhbmQgY29tcHJlc3Npb24gKi8KKworICAgIGNhc2UgMjE6ICAgICAgICAgICAgICAgICAgIC8qIE11c2ljIGtpdCBEU1AgY29tbWFuZHMgKi8KKyAgICBjYXNlIDIyOiAgICAgICAgICAgICAgICAgICAvKiBNdXNpYyBraXQgRFNQIGNvbW1hbmRzIHNhbXBsZXMgKi8KKworICAgIGRlZmF1bHQ6CisgICAgICBnb3RvIHVua25vd25fZm9ybWF0OworICB9CisKKyAgaWYgKGxhdykgeworICAgIHRlbXBjYXBzID0KKyAgICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoKGxhdyA9PSAxKSA/ICJhdWRpby94LW11bGF3IiA6ICJhdWRpby94LWFsYXciLAorICAgICAgICAicmF0ZSIsIEdfVFlQRV9JTlQsIGF1cGFyc2UtPnNhbXBsZXJhdGUsCisgICAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIGF1cGFyc2UtPmNoYW5uZWxzLCBOVUxMKTsKKyAgICBhdXBhcnNlLT5zYW1wbGVfc2l6ZSA9IGF1cGFyc2UtPmNoYW5uZWxzOworICB9IGVsc2UgaWYgKGZvcm1hdCAhPSBHU1RfQVVESU9fRk9STUFUX1VOS05PV04pIHsKKyAgICBHc3RDYXBzICp0ZW1wbF9jYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKGF1cGFyc2UtPnNyY3BhZCk7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uOworCisgICAgdGVtcGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLAorICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgZ3N0X2F1ZGlvX2Zvcm1hdF90b19zdHJpbmcgKGZvcm1hdCksCisgICAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgYXVwYXJzZS0+c2FtcGxlcmF0ZSwKKyAgICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgYXVwYXJzZS0+Y2hhbm5lbHMsIE5VTEwpOworCisgICAgaW50ZXJzZWN0aW9uID0gZ3N0X2NhcHNfaW50ZXJzZWN0ICh0ZW1wY2FwcywgdGVtcGxfY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHRlbXBjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGVtcGxfY2Fwcyk7CisgICAgdGVtcGNhcHMgPSBpbnRlcnNlY3Rpb247CisgIH0gZWxzZSBpZiAobGF5b3V0WzBdKSB7CisgICAgdGVtcGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1hZHBjbSIsCisgICAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCBsYXlvdXQsIE5VTEwpOworICAgIGF1cGFyc2UtPnNhbXBsZV9zaXplID0gMDsKKyAgfSBlbHNlCisgICAgZ290byB1bmtub3duX2Zvcm1hdDsKKworICBHU1RfREVCVUdfT0JKRUNUIChhdXBhcnNlLCAic2FtcGxlX3NpemU9JWQiLCBhdXBhcnNlLT5zYW1wbGVfc2l6ZSk7CisKKyAgZ3N0X2F1X3BhcnNlX25lZ290aWF0ZV9zcmNwYWQgKGF1cGFyc2UsIHRlbXBjYXBzKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChhdXBhcnNlLCAib2Zmc2V0PSUiIEdfR0lOVDY0X0ZPUk1BVCwgYXVwYXJzZS0+b2Zmc2V0KTsKKyAgZ3N0X2FkYXB0ZXJfdW5tYXAgKGF1cGFyc2UtPmFkYXB0ZXIpOworICBnc3RfYWRhcHRlcl9mbHVzaCAoYXVwYXJzZS0+YWRhcHRlciwgYXVwYXJzZS0+b2Zmc2V0KTsKKworICBnc3RfY2Fwc191bnJlZiAodGVtcGNhcHMpOworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVJST1JTICovCit1bmtub3duX2hlYWRlcjoKKyAgeworICAgIGdzdF9hZGFwdGVyX3VubWFwIChhdXBhcnNlLT5hZGFwdGVyKTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXVwYXJzZSwgU1RSRUFNLCBXUk9OR19UWVBFLCAoTlVMTCksIChOVUxMKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit1bnN1cHBvcnRlZF9zYW1wbGVfcmF0ZToKKyAgeworICAgIGdzdF9hZGFwdGVyX3VubWFwIChhdXBhcnNlLT5hZGFwdGVyKTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXVwYXJzZSwgU1RSRUFNLCBGT1JNQVQsIChOVUxMKSwKKyAgICAgICAgKCJVbnN1cHBvcnRlZCBzYW1wbGVyYXRlOiAldSIsIGF1cGFyc2UtPnNhbXBsZXJhdGUpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK3Vuc3VwcG9ydGVkX251bWJlcl9vZl9jaGFubmVsczoKKyAgeworICAgIGdzdF9hZGFwdGVyX3VubWFwIChhdXBhcnNlLT5hZGFwdGVyKTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXVwYXJzZSwgU1RSRUFNLCBGT1JNQVQsIChOVUxMKSwKKyAgICAgICAgKCJVbnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHM6ICV1IiwgYXVwYXJzZS0+Y2hhbm5lbHMpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK3Vua25vd25fZm9ybWF0OgorICB7CisgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKGF1cGFyc2UtPmFkYXB0ZXIpOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChhdXBhcnNlLCBTVFJFQU0sIEZPUk1BVCwgKE5VTEwpLAorICAgICAgICAoIlVuc3VwcG9ydGVkIGVuY29kaW5nOiAldSIsIGF1cGFyc2UtPmVuY29kaW5nKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKKyNkZWZpbmUgQVVfSEVBREVSX1NJWkUgMjQKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hdV9wYXJzZV9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0QXVQYXJzZSAqYXVwYXJzZTsKKyAgZ2ludCBhdmFpbCwgc2VuZG5vdyA9IDA7CisgIGdpbnQ2NCB0aW1lc3RhbXA7CisgIGdpbnQ2NCBkdXJhdGlvbjsKKyAgZ2ludDY0IG9mZnNldDsKKworICBhdXBhcnNlID0gR1NUX0FVX1BBUlNFIChwYXJlbnQpOworCisgIEdTVF9MT0dfT0JKRUNUIChhdXBhcnNlLCAiZ290IGJ1ZmZlciBvZiBzaXplICUiIEdfR1NJWkVfRk9STUFULAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSk7CisKKyAgZ3N0X2FkYXB0ZXJfcHVzaCAoYXVwYXJzZS0+YWRhcHRlciwgYnVmKTsKKyAgYnVmID0gTlVMTDsKKworICAvKiBpZiB3ZSBoYXZlbid0IHNlZW4gYW55IGRhdGEgeWV0Li4uICovCisgIGlmICghZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChhdXBhcnNlLT5zcmNwYWQpKSB7CisgICAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoYXVwYXJzZS0+YWRhcHRlcikgPCBBVV9IRUFERVJfU0laRSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXVwYXJzZSwgIm5lZWQgbW9yZSBkYXRhIHRvIHBhcnNlIGhlYWRlciIpOworICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICByZXQgPSBnc3RfYXVfcGFyc2VfcGFyc2VfaGVhZGVyIChhdXBhcnNlKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgZ290byBvdXQ7CisKKyAgICBpZiAoYXVwYXJzZS0+bmVlZF9zZWdtZW50KSB7CisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKGF1cGFyc2UtPnNyY3BhZCwKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZhdXBhcnNlLT5zZWdtZW50KSk7CisgICAgICBhdXBhcnNlLT5uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKyAgICB9CisgIH0KKworICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoYXVwYXJzZS0+YWRhcHRlcik7CisKKyAgaWYgKGF1cGFyc2UtPnNhbXBsZV9zaXplID4gMCkgeworICAgIC8qIEVuc3VyZSB3ZSBwdXNoIGEgYnVmZmVyIHRoYXQncyBhIG11bHRpcGxlIG9mIHRoZSBmcmFtZSBzaXplIGRvd25zdHJlYW0gKi8KKyAgICBzZW5kbm93ID0gYXZhaWwgLSAoYXZhaWwgJSBhdXBhcnNlLT5zYW1wbGVfc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgLyogSXQncyBzb21ldGhpbmcgbm9uLXRyaXZpYWwgKHN1Y2ggYXMgQURQQ00pLCB3ZSBkb24ndCB1bmRlcnN0YW5kIGl0LCBzbworICAgICAqIGp1c3QgcHVzaCBkb3duc3RyZWFtIGFuZCBhc3N1bWUgaXQgd2lsbCBrbm93IHdoYXQgdG8gZG8gd2l0aCBpdCAqLworICAgIHNlbmRub3cgPSBhdmFpbDsKKyAgfQorCisgIGlmIChzZW5kbm93ID4gMCkgeworICAgIEdzdEJ1ZmZlciAqb3V0YnVmOworICAgIGdpbnQ2NCBwb3M7CisKKyAgICBvdXRidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoYXVwYXJzZS0+YWRhcHRlciwgc2VuZG5vdyk7CisgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChvdXRidWYpOworCisgICAgcG9zID0gYXVwYXJzZS0+YnVmZmVyX29mZnNldCAtIGF1cGFyc2UtPm9mZnNldDsKKyAgICBwb3MgPSBNQVggKHBvcywgMCk7CisKKyAgICBpZiAoYXVwYXJzZS0+c2FtcGxlX3NpemUgPiAwICYmIGF1cGFyc2UtPnNhbXBsZXJhdGUgPiAwKSB7CisgICAgICBnc3RfYXVfcGFyc2Vfc3JjX2NvbnZlcnQgKGF1cGFyc2UsIEdTVF9GT1JNQVRfQllURVMsIHBvcywKKyAgICAgICAgICBHU1RfRk9STUFUX0RFRkFVTFQsICZvZmZzZXQpOworICAgICAgZ3N0X2F1X3BhcnNlX3NyY19jb252ZXJ0IChhdXBhcnNlLCBHU1RfRk9STUFUX0JZVEVTLCBwb3MsCisgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCAmdGltZXN0YW1wKTsKKyAgICAgIGdzdF9hdV9wYXJzZV9zcmNfY29udmVydCAoYXVwYXJzZSwgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICAgICAgICBzZW5kbm93LCBHU1RfRk9STUFUX1RJTUUsICZkdXJhdGlvbik7CisKKyAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpID0gb2Zmc2V0OworICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgPSB0aW1lc3RhbXA7CisgICAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gZHVyYXRpb247CisgICAgfQorCisgICAgYXVwYXJzZS0+YnVmZmVyX29mZnNldCArPSBzZW5kbm93OworCisgICAgcmV0ID0gZ3N0X3BhZF9wdXNoIChhdXBhcnNlLT5zcmNwYWQsIG91dGJ1Zik7CisgIH0KKworb3V0OgorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1X3BhcnNlX3NyY19jb252ZXJ0IChHc3RBdVBhcnNlICogYXVwYXJzZSwgR3N0Rm9ybWF0IHNyY19mb3JtYXQsCisgICAgZ2ludDY0IHNyY3ZhbCwgR3N0Rm9ybWF0IGRlc3RfZm9ybWF0LCBnaW50NjQgKiBkZXN0dmFsKQoreworICBnYm9vbGVhbiByZXQgPSBUUlVFOworICBndWludCBzYW1wbGVzaXplLCByYXRlOworCisgIGlmIChkZXN0X2Zvcm1hdCA9PSBzcmNfZm9ybWF0KSB7CisgICAgKmRlc3R2YWwgPSBzcmN2YWw7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBHU1RfT0JKRUNUX0xPQ0sgKGF1cGFyc2UpOworICBzYW1wbGVzaXplID0gYXVwYXJzZS0+c2FtcGxlX3NpemU7CisgIHJhdGUgPSBhdXBhcnNlLT5zYW1wbGVyYXRlOworICBHU1RfT0JKRUNUX1VOTE9DSyAoYXVwYXJzZSk7CisKKyAgaWYgKHNhbXBsZXNpemUgPT0gMCB8fCByYXRlID09IDApIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoYXVwYXJzZSwgImNhbm5vdCBjb252ZXJ0LCBzYW1wbGVfc2l6ZSBvciByYXRlIHVua25vd24iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBzd2l0Y2ggKHNyY19mb3JtYXQpIHsKKyAgICBjYXNlIEdTVF9GT1JNQVRfQllURVM6CisgICAgICBzcmN2YWwgLz0gc2FtcGxlc2l6ZTsKKyAgICAgIC8qIGZhbGx0aHJvdWdoICovCisgICAgY2FzZSBHU1RfRk9STUFUX0RFRkFVTFQ6eworICAgICAgc3dpdGNoIChkZXN0X2Zvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfREVGQVVMVDoKKyAgICAgICAgICAqZGVzdHZhbCA9IHNyY3ZhbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0JZVEVTOgorICAgICAgICAgICpkZXN0dmFsID0gc3JjdmFsICogc2FtcGxlc2l6ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6CisgICAgICAgICAgKmRlc3R2YWwgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChzcmN2YWwsIEdTVF9TRUNPTkQsIHJhdGUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldCA9IEZBTFNFOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0ZPUk1BVF9USU1FOnsKKyAgICAgIHN3aXRjaCAoZGVzdF9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0JZVEVTOgorICAgICAgICAgICpkZXN0dmFsID0gc2FtcGxlc2l6ZSAqCisgICAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHNyY3ZhbCwgcmF0ZSwgR1NUX1NFQ09ORCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICAgICpkZXN0dmFsID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoc3JjdmFsLCByYXRlLCBHU1RfU0VDT05EKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXQgPSBGQUxTRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OnsKKyAgICAgIHJldCA9IEZBTFNFOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKCFyZXQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdXBhcnNlLCAiY291bGQgbm90IGNvbnZlcnQgZnJvbSAlcyB0byAlcyBmb3JtYXQiLAorICAgICAgICBnc3RfZm9ybWF0X2dldF9uYW1lIChzcmNfZm9ybWF0KSwgZ3N0X2Zvcm1hdF9nZXRfbmFtZSAoZGVzdF9mb3JtYXQpKTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1X3BhcnNlX3NyY19xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdEF1UGFyc2UgKmF1cGFyc2U7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIGF1cGFyc2UgPSBHU1RfQVVfUEFSU0UgKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfRFVSQVRJT046eworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgICAgIGdpbnQ2NCBsZW4sIHZhbDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2R1cmF0aW9uIChxdWVyeSwgJmZvcm1hdCwgTlVMTCk7CisgICAgICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeV9kdXJhdGlvbiAoYXVwYXJzZS0+c2lua3BhZCwgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICAgICAgICAgICAgJmxlbikpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXVwYXJzZSwgImZhaWxlZCB0byBxdWVyeSB1cHN0cmVhbSBsZW5ndGgiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGF1cGFyc2UpOworICAgICAgbGVuIC09IGF1cGFyc2UtPm9mZnNldDsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChhdXBhcnNlKTsKKworICAgICAgcmV0ID0KKyAgICAgICAgICBnc3RfYXVfcGFyc2Vfc3JjX2NvbnZlcnQgKGF1cGFyc2UsIEdTVF9GT1JNQVRfQllURVMsIGxlbiwgZm9ybWF0LAorICAgICAgICAgICZ2YWwpOworCisgICAgICBpZiAocmV0KSB7CisgICAgICAgIGdzdF9xdWVyeV9zZXRfZHVyYXRpb24gKHF1ZXJ5LCBmb3JtYXQsIHZhbCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfUE9TSVRJT046eworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgICAgIGdpbnQ2NCBwb3MsIHZhbDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3Bvc2l0aW9uIChxdWVyeSwgJmZvcm1hdCwgTlVMTCk7CisgICAgICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeV9wb3NpdGlvbiAoYXVwYXJzZS0+c2lua3BhZCwgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICAgICAgICAgICAgJnBvcykpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXVwYXJzZSwgImZhaWxlZCB0byBxdWVyeSB1cHN0cmVhbSBwb3NpdGlvbiIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoYXVwYXJzZSk7CisgICAgICBwb3MgLT0gYXVwYXJzZS0+b2Zmc2V0OworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGF1cGFyc2UpOworCisgICAgICByZXQgPSBnc3RfYXVfcGFyc2Vfc3JjX2NvbnZlcnQgKGF1cGFyc2UsIEdTVF9GT1JNQVRfQllURVMsIHBvcywKKyAgICAgICAgICBmb3JtYXQsICZ2YWwpOworCisgICAgICBpZiAocmV0KSB7CisgICAgICAgIGdzdF9xdWVyeV9zZXRfcG9zaXRpb24gKHF1ZXJ5LCBmb3JtYXQsIHZhbCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfU0VFS0lORzp7CisgICAgICBHc3RGb3JtYXQgZm9ybWF0OworCisgICAgICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksICZmb3JtYXQsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgLyogRklYTUU6IHF1ZXJ5IGR1cmF0aW9uIGluICdmb3JtYXQnCisgICAgICAgICBnc3RfcXVlcnlfc2V0X3NlZWtpbmcgKHF1ZXJ5LCBmb3JtYXQsIFRSVUUsIDAsIGR1cmF0aW9uKTsKKyAgICAgICAqLworICAgICAgZ3N0X3F1ZXJ5X3NldF9zZWVraW5nIChxdWVyeSwgZm9ybWF0LCBUUlVFLCAwLCBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYXVfcGFyc2VfaGFuZGxlX3NlZWsgKEdzdEF1UGFyc2UgKiBhdXBhcnNlLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RTZWVrVHlwZSBzdGFydF90eXBlLCBzdG9wX3R5cGU7CisgIEdzdFNlZWtGbGFncyBmbGFnczsKKyAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgZ2RvdWJsZSByYXRlOworICBnaW50NjQgc3RhcnQsIHN0b3A7CisgIGdib29sZWFuIHJlczsKKworICBnc3RfZXZlbnRfcGFyc2Vfc2VlayAoZXZlbnQsICZyYXRlLCAmZm9ybWF0LCAmZmxhZ3MsICZzdGFydF90eXBlLCAmc3RhcnQsCisgICAgICAmc3RvcF90eXBlLCAmc3RvcCk7CisKKyAgaWYgKGZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdXBhcnNlLCAib25seSBzdXBwb3J0IHNlZWtzIGluIFRJTUUgZm9ybWF0Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmVzID0gZ3N0X2F1X3BhcnNlX3NyY19jb252ZXJ0IChhdXBhcnNlLCBHU1RfRk9STUFUX1RJTUUsIHN0YXJ0LAorICAgICAgR1NUX0ZPUk1BVF9CWVRFUywgJnN0YXJ0KTsKKworICBpZiAoc3RvcCA+IDApIHsKKyAgICByZXMgPSBnc3RfYXVfcGFyc2Vfc3JjX2NvbnZlcnQgKGF1cGFyc2UsIEdTVF9GT1JNQVRfVElNRSwgc3RvcCwKKyAgICAgICAgR1NUX0ZPUk1BVF9CWVRFUywgJnN0b3ApOworICB9CisKKyAgR1NUX0lORk9fT0JKRUNUIChhdXBhcnNlLAorICAgICAgInNlZWtpbmc6ICUiIEdfR0lOVDY0X0ZPUk1BVCAiIC4uLiAlIiBHX0dJTlQ2NF9GT1JNQVQsIHN0YXJ0LCBzdG9wKTsKKworICBldmVudCA9IGdzdF9ldmVudF9uZXdfc2VlayAocmF0ZSwgR1NUX0ZPUk1BVF9CWVRFUywgZmxhZ3MsIHN0YXJ0X3R5cGUsIHN0YXJ0LAorICAgICAgc3RvcF90eXBlLCBzdG9wKTsKKyAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChhdXBhcnNlLT5zaW5rcGFkLCBldmVudCk7CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1X3BhcnNlX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RBdVBhcnNlICphdXBhcnNlOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIGF1cGFyc2UgPSBHU1RfQVVfUEFSU0UgKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfQ0FQUzoKKyAgICB7CisgICAgICAvKiBkaXNjYXJkLCB3ZSdsbCBjb21lIHVwIHdpdGggcHJvcGVyIHNyYyBjYXBzICovCisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgIHsKKyAgICAgIGdpbnQ2NCBzdGFydCwgc3RvcCwgb2Zmc2V0ID0gMDsKKyAgICAgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICAgICAgLyogc29tZSBkZWJ1ZyBvdXRwdXQgKi8KKyAgICAgIGdzdF9ldmVudF9jb3B5X3NlZ21lbnQgKGV2ZW50LCAmc2VnbWVudCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdXBhcnNlLCAicmVjZWl2ZWQgbmV3c2VnbWVudCAlIiBHU1RfU0VHTUVOVF9GT1JNQVQsCisgICAgICAgICAgJnNlZ21lbnQpOworCisgICAgICBzdGFydCA9IHNlZ21lbnQuc3RhcnQ7CisgICAgICBzdG9wID0gc2VnbWVudC5zdG9wOworICAgICAgaWYgKGF1cGFyc2UtPnNhbXBsZV9zaXplID4gMCkgeworICAgICAgICBpZiAoc3RhcnQgPiAwKSB7CisgICAgICAgICAgb2Zmc2V0ID0gc3RhcnQ7CisgICAgICAgICAgc3RhcnQgLT0gYXVwYXJzZS0+b2Zmc2V0OworICAgICAgICAgIHN0YXJ0ID0gTUFYIChzdGFydCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0b3AgPiAwKSB7CisgICAgICAgICAgc3RvcCAtPSBhdXBhcnNlLT5vZmZzZXQ7CisgICAgICAgICAgc3RvcCA9IE1BWCAoc3RvcCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZ3N0X2F1X3BhcnNlX3NyY19jb252ZXJ0IChhdXBhcnNlLCBHU1RfRk9STUFUX0JZVEVTLCBzdGFydCwKKyAgICAgICAgICAgIEdTVF9GT1JNQVRfVElNRSwgJnN0YXJ0KTsKKyAgICAgICAgZ3N0X2F1X3BhcnNlX3NyY19jb252ZXJ0IChhdXBhcnNlLCBHU1RfRk9STUFUX0JZVEVTLCBzdG9wLAorICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCAmc3RvcCk7CisgICAgICB9CisKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoYXVwYXJzZSwKKyAgICAgICAgICAibmV3IHNlZ21lbnQ6ICUiIEdTVF9USU1FX0ZPUk1BVCAiIC4uLiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoc3RhcnQpLCBHU1RfVElNRV9BUkdTIChzdG9wKSk7CisKKyAgICAgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICAgICAgc2VnbWVudC5zdGFydCA9IHNlZ21lbnQudGltZSA9IHN0YXJ0OworICAgICAgc2VnbWVudC5zdG9wID0gc3RvcDsKKworICAgICAgZ3N0X3NlZ21lbnRfY29weV9pbnRvICgmc2VnbWVudCwgJmF1cGFyc2UtPnNlZ21lbnQpOworCisgICAgICBpZiAoIWdzdF9wYWRfaGFzX2N1cnJlbnRfY2FwcyAoYXVwYXJzZS0+c3JjcGFkKSkgeworICAgICAgICBhdXBhcnNlLT5uZWVkX3NlZ21lbnQgPSBUUlVFOworICAgICAgICByZXQgPSBUUlVFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXVwYXJzZS0+bmVlZF9zZWdtZW50ID0gRkFMU0U7CisgICAgICAgIHJldCA9IGdzdF9wYWRfcHVzaF9ldmVudCAoYXVwYXJzZS0+c3JjcGFkLAorICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworICAgICAgfQorCisgICAgICBhdXBhcnNlLT5idWZmZXJfb2Zmc2V0ID0gb2Zmc2V0OworCisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgICBpZiAoIWF1cGFyc2UtPnNyY3BhZCkgeworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXVwYXJzZSwgU1RSRUFNLCBXUk9OR19UWVBFLAorICAgICAgICAgICAgKCJObyB2YWxpZCBpbnB1dCBmb3VuZCBiZWZvcmUgZW5kIG9mIHN0cmVhbSIpLCAoTlVMTCkpOworICAgICAgfQorICAgICAgLyogZmFsbC10aHJvdWdoICovCisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYXVfcGFyc2Vfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0QXVQYXJzZSAqYXVwYXJzZTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIGF1cGFyc2UgPSBHU1RfQVVfUEFSU0UgKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICAgIHJldCA9IGdzdF9hdV9wYXJzZV9oYW5kbGVfc2VlayAoYXVwYXJzZSwgZXZlbnQpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9hdV9wYXJzZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RBdVBhcnNlICphdXBhcnNlID0gR1NUX0FVX1BBUlNFIChlbGVtZW50KTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTOworCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkKKyAgICByZXR1cm4gcmV0OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3RfYXVfcGFyc2VfcmVzZXQgKGF1cGFyc2UpOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXVwYXJzZSIsIEdTVF9SQU5LX1NFQ09OREFSWSwKKyAgICAgICAgICBHU1RfVFlQRV9BVV9QQVJTRSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGF1cGFyc2UsCisgICAgInBhcnNlcyBhdSBzdHJlYW1zIiwgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwKKyAgICBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmggYi9nc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhMDk5NQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdXBhcnNlL2dzdGF1cGFyc2UuaApAQCAtMCwwICsxLDc1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9BVV9QQVJTRV9IX18KKyNkZWZpbmUgX19HU1RfQVVfUEFSU0VfSF9fCisKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0FVX1BBUlNFIFwKKyAgKGdzdF9hdV9wYXJzZV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVVfUEFSU0Uob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9BVV9QQVJTRSxHc3RBdVBhcnNlKSkKKyNkZWZpbmUgR1NUX0FVX1BBUlNFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0FVX1BBUlNFLEdzdEF1UGFyc2VDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BVV9QQVJTRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0FVX1BBUlNFKSkKKyNkZWZpbmUgR1NUX0lTX0FVX1BBUlNFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0FVX1BBUlNFKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1UGFyc2UgR3N0QXVQYXJzZTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdVBhcnNlQ2xhc3MgR3N0QXVQYXJzZUNsYXNzOworCitzdHJ1Y3QgX0dzdEF1UGFyc2UgeworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgR3N0UGFkICAgICAqc2lua3BhZDsKKyAgR3N0UGFkICAgICAqc3JjcGFkOworCisgIEdzdENhcHMgICAgKnNyY19jYXBzOworCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisKKyAgR3N0U2VnbWVudCAgc2VnbWVudDsKKyAgZ2Jvb2xlYW4gICAgbmVlZF9zZWdtZW50OworCisgIGdpbnQ2NCAgICAgIG9mZnNldDsgICAgICAgIC8qIHdoZXJlIHNhbXBsZSBkYXRhIHN0YXJ0cyAqLworICBnaW50NjQgICAgICBidWZmZXJfb2Zmc2V0OworICBndWludCAgICAgICBzYW1wbGVfc2l6ZTsKKyAgZ3VpbnQgICAgICAgZW5jb2Rpbmc7CisgIGd1aW50ICAgICAgIHNhbXBsZXJhdGU7CisgIGd1aW50ICAgICAgIGNoYW5uZWxzOworfTsKKworc3RydWN0IF9Hc3RBdVBhcnNlQ2xhc3MgeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2F1X3BhcnNlX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0FVX1BBUlNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1cGFyc2UvbWVzb24uYnVpbGQgYi9nc3QvYXVwYXJzZS9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDMwOGQyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1cGFyc2UvbWVzb24uYnVpbGQKQEAgLTAsMCArMSw4IEBACitnc3RhdXBhcnNlID0gbGlicmFyeSgnZ3N0YXVwYXJzZScsCisgICdnc3RhdXBhcnNlLmMnLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdGF1ZGlvX2RlcCwgZ3N0YmFzZV9kZXBdLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L2F1dG9kZXRlY3QvTWFrZWZpbGUuYW0gYi9nc3QvYXV0b2RldGVjdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjkyOGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1dG9kZXRlY3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxOCBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0YXV0b2RldGVjdC5sYQorCitsaWJnc3RhdXRvZGV0ZWN0X2xhX1NPVVJDRVMgPSBcCisJZ3N0YXV0b2F1ZGlvc2luay5jIFwKKwlnc3RhdXRvYXVkaW9zcmMuYyBcCisJZ3N0YXV0b2RldGVjdC5jIFwKKwlnc3RhdXRvdmlkZW9zaW5rLmMgXAorCWdzdGF1dG92aWRlb3NyYy5jCitsaWJnc3RhdXRvZGV0ZWN0X2xhX0NGTEFHUyA9ICQoR1NUX0NGTEFHUykKK2xpYmdzdGF1dG9kZXRlY3RfbGFfTElCQUREID0gJChHU1RfTElCUykKK2xpYmdzdGF1dG9kZXRlY3RfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IFwKKwlnc3RhdXRvYXVkaW9zaW5rLmggXAorCWdzdGF1dG9hdWRpb3NyYy5oIFwKKwlnc3RhdXRvZGV0ZWN0LmggXAorCWdzdGF1dG92aWRlb3NpbmsuaCBcCisJZ3N0YXV0b3ZpZGVvc3JjLmgKZGlmZiAtLWdpdCBhL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYyBiL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWRmNmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jCkBAIC0wLDAgKzEsMTQzIEBACisvKiBHU3RyZWFtZXIKKyAqIChjKSAyMDA1IFJvbmFsZCBTLiBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqIChjKSAyMDA2IEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1hdXRvYXVkaW9zaW5rCisgKiBAc2VlX2Fsc286IGF1dG92aWRlb3NpbmssIGFsc2FzaW5rLCBvc3NzaW5rCisgKgorICogYXV0b2F1ZGlvc2luayBpcyBhbiBhdWRpbyBzaW5rIHRoYXQgYXV0b21hdGljYWxseSBkZXRlY3RzIGFuIGFwcHJvcHJpYXRlCisgKiBhdWRpbyBzaW5rIHRvIHVzZS4gIEl0IGRvZXMgc28gYnkgc2Nhbm5pbmcgdGhlIHJlZ2lzdHJ5IGZvciBhbGwgZWxlbWVudHMKKyAqIHRoYXQgaGF2ZSA8cXVvdGU+U2luazwvcXVvdGU+IGFuZCA8cXVvdGU+QXVkaW88L3F1b3RlPiBpbiB0aGUgY2xhc3MgZmllbGQKKyAqIG9mIHRoZWlyIGVsZW1lbnQgaW5mb3JtYXRpb24sIGFuZCBhbHNvIGhhdmUgYSBub24temVybyBhdXRvcGx1Z2dpbmcgcmFuay4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgLW0gYXVkaW90ZXN0c3JjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIGF1dG9hdWRpb3NpbmsKKyAqIF18CisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdGF1dG9hdWRpb3NpbmsuaCIKKworI2RlZmluZSBERUZBVUxUX1RTX09GRlNFVCAgICAgICAgICAgMAorCisvKiBQcm9wZXJ0aWVzICovCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9UU19PRkZTRVQsCit9OworCitzdGF0aWMgdm9pZCBnc3RfYXV0b19hdWRpb19zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hdXRvX2F1ZGlvX3NpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1dG9fYXVkaW9fc2lua19jb25maWd1cmUgKEdzdEF1dG9EZXRlY3QgKiBhdXRvZGV0ZWN0LAorICAgIEdzdEVsZW1lbnQgKiBraWQpOworCitHX0RFRklORV9UWVBFIChHc3RBdXRvQXVkaW9TaW5rLCBnc3RfYXV0b19hdWRpb19zaW5rLCBHU1RfVFlQRV9BVVRPX0RFVEVDVCk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK3N0YXRpYyB2b2lkCitnc3RfYXV0b19hdWRpb19zaW5rX2NsYXNzX2luaXQgKEdzdEF1dG9BdWRpb1NpbmtDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmVrbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdzdEF1dG9EZXRlY3RDbGFzcyAqYWtsYXNzID0gR1NUX0FVVE9fREVURUNUX0NMQVNTIChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2F1dG9fYXVkaW9fc2lua19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9hdXRvX2F1ZGlvX3NpbmtfZ2V0X3Byb3BlcnR5OworCisgIGFrbGFzcy0+Y29uZmlndXJlID0gZ3N0X2F1dG9fYXVkaW9fc2lua19jb25maWd1cmU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UU19PRkZTRVQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50NjQgKCJ0cy1vZmZzZXQiLCAiVFMgT2Zmc2V0IiwKKyAgICAgICAgICAiVGltZXN0YW1wIG9mZnNldCBpbiBuYW5vc2Vjb25kcyIsIEdfTUlOSU5UNjQsIEdfTUFYSU5UNjQsCisgICAgICAgICAgREVGQVVMVF9UU19PRkZTRVQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChla2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWtsYXNzLCAiQXV0byBhdWRpbyBzaW5rIiwKKyAgICAgICJTaW5rL0F1ZGlvIiwKKyAgICAgICJXcmFwcGVyIGF1ZGlvIHNpbmsgZm9yIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgYXVkaW8gc2luayIsCisgICAgICAiSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1dG9fYXVkaW9fc2lua19pbml0IChHc3RBdXRvQXVkaW9TaW5rICogc2luaykKK3sKKyAgR3N0QXV0b0RldGVjdCAqYXV0b2RldGVjdCA9IEdTVF9BVVRPX0RFVEVDVCAoc2luayk7CisKKyAgYXV0b2RldGVjdC0+bWVkaWFfa2xhc3MgPSAiQXVkaW8iOworICBhdXRvZGV0ZWN0LT5mbGFnID0gR1NUX0VMRU1FTlRfRkxBR19TSU5LOworCisgIHNpbmstPnRzX29mZnNldCA9IERFRkFVTFRfVFNfT0ZGU0VUOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1dG9fYXVkaW9fc2lua19jb25maWd1cmUgKEdzdEF1dG9EZXRlY3QgKiBhdXRvZGV0ZWN0LCBHc3RFbGVtZW50ICoga2lkKQoreworICBHc3RBdXRvQXVkaW9TaW5rICpzZWxmID0gR1NUX0FVVE9fQVVESU9fU0lOSyAoYXV0b2RldGVjdCk7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoa2lkKSwgInRzLW9mZnNldCIsIHNlbGYtPnRzX29mZnNldCwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXV0b19hdWRpb19zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdXRvQXVkaW9TaW5rICpzaW5rID0gR1NUX0FVVE9fQVVESU9fU0lOSyAob2JqZWN0KTsKKyAgR3N0QXV0b0RldGVjdCAqYXV0b2RldGVjdCA9IChHc3RBdXRvRGV0ZWN0ICopIHNpbms7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1RTX09GRlNFVDoKKyAgICAgIHNpbmstPnRzX29mZnNldCA9IGdfdmFsdWVfZ2V0X2ludDY0ICh2YWx1ZSk7CisgICAgICBpZiAoYXV0b2RldGVjdC0+a2lkKQorICAgICAgICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChhdXRvZGV0ZWN0LT5raWQpLCBwc3BlYy0+bmFtZSwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1dG9fYXVkaW9fc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXV0b0F1ZGlvU2luayAqc2luayA9IEdTVF9BVVRPX0FVRElPX1NJTksgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1RTX09GRlNFVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludDY0ICh2YWx1ZSwgc2luay0+dHNfb2Zmc2V0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuaCBiL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGEwYjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIEdTdHJlYW1lcgorICogKGMpIDIwMDUgUm9uYWxkIFMuIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfQVVUT19BVURJT19TSU5LX0hfXworI2RlZmluZSBfX0dTVF9BVVRPX0FVRElPX1NJTktfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSAiZ3N0YXV0b2RldGVjdC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQVVUT19BVURJT19TSU5LIFwKKyAgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9BVVRPX0FVRElPX1NJTksob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0FVVE9fQVVESU9fU0lOSywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdEF1dG9BdWRpb1NpbmspKQorI2RlZmluZSBHU1RfQVVUT19BVURJT19TSU5LX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfQVVUT19BVURJT19TSU5LLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0QXV0b0F1ZGlvU2lua0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FVVE9fQVVESU9fU0lOSyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfQVVUT19BVURJT19TSU5LKSkKKyNkZWZpbmUgR1NUX0lTX0FVVE9fQVVESU9fU0lOS19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX0FVVE9fQVVESU9fU0lOSykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdXRvQXVkaW9TaW5rIHsKKyAgR3N0QXV0b0RldGVjdCBwYXJlbnQ7CisKKyAgR3N0Q2xvY2tUaW1lRGlmZiB0c19vZmZzZXQ7Cit9IEdzdEF1dG9BdWRpb1Npbms7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdXRvQXVkaW9TaW5rQ2xhc3MgeworICBHc3RBdXRvRGV0ZWN0Q2xhc3MgcGFyZW50X2NsYXNzOworfSBHc3RBdXRvQXVkaW9TaW5rQ2xhc3M7CisKK0dUeXBlICAgZ3N0X2F1dG9fYXVkaW9fc2lua19nZXRfdHlwZSAgICAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9BVVRPX0FVRElPX1NJTktfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuYyBiL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZGRhMDAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuYwpAQCAtMCwwICsxLDk1IEBACisvKiBHU3RyZWFtZXIKKyAqIChjKSAyMDA1IFJvbmFsZCBTLiBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqIChjKSAyMDA2IEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKyAqIChjKSAyMDA4IFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1hdXRvYXVkaW9zcmMKKyAqIEBzZWVfYWxzbzogYXV0b3ZpZGVvc3JjLCBhbHNhc3JjLCBvc3NzcmMKKyAqCisgKiBhdXRvYXVkaW9zcmMgaXMgYW4gYXVkaW8gc291cmNlIHRoYXQgYXV0b21hdGljYWxseSBkZXRlY3RzIGFuIGFwcHJvcHJpYXRlCisgKiBhdWRpbyBzb3VyY2UgdG8gdXNlLiAgSXQgZG9lcyBzbyBieSBzY2FubmluZyB0aGUgcmVnaXN0cnkgZm9yIGFsbCBlbGVtZW50cworICogdGhhdCBoYXZlIDxxdW90ZT5Tb3VyY2U8L3F1b3RlPiBhbmQgPHF1b3RlPkF1ZGlvPC9xdW90ZT4gaW4gdGhlIGNsYXNzIGZpZWxkCisgKiBvZiB0aGVpciBlbGVtZW50IGluZm9ybWF0aW9uLCBhbmQgYWxzbyBoYXZlIGEgbm9uLXplcm8gYXV0b3BsdWdnaW5nIHJhbmsuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IC1tIGF1dG9hdWRpb3NyYyAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhdXRvYXVkaW9zaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RhdXRvYXVkaW9zcmMuaCIKKworR19ERUZJTkVfVFlQRSAoR3N0QXV0b0F1ZGlvU3JjLCBnc3RfYXV0b19hdWRpb19zcmMsIEdTVF9UWVBFX0FVVE9fREVURUNUKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKKworc3RhdGljIEdzdEVsZW1lbnQgKgorZ3N0X2F1dG9fYXVkaW9fc3JjX2NyZWF0ZV9mYWtlX2VsZW1lbnQgKEdzdEF1dG9EZXRlY3QgKiBhdXRvZGV0ZWN0KQoreworICBHc3RFbGVtZW50ICpmYWtlOworCisgIGZha2UgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb3Rlc3RzcmMiLCAiZmFrZS1hdXRvLWF1ZGlvLXNyYyIpOworICBpZiAoZmFrZSAhPSBOVUxMKSB7CisgICAgZ19vYmplY3Rfc2V0IChmYWtlLCAiaXMtbGl2ZSIsIFRSVUUsIE5VTEwpOworICAgIGdzdF91dGlsX3NldF9vYmplY3RfYXJnIChHX09CSkVDVCAoZmFrZSksICJ3YXZlIiwgInNpbGVuY2UiKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXV0b2RldGVjdCwgUkVTT1VSQ0UsIE5PVF9GT1VORCwKKyAgICAgICAgKCJGYWlsZWQgdG8gZmluZCB1c2FibGUgYXVkaW8gc291cmNlIGVsZW1lbnQuIiksCisgICAgICAgICgiRmFpbGVkIHRvIGZpbmQgYSB1c2FibGUgYXVkaW8gc291cmNlIGFuZCBjb3VsZG4ndCBjcmVhdGUgYW4gYXVkaW8iCisgICAgICAgICAgICAidGVzdHNyYyBhcyBmYWxsYmFjayBlaXRoZXIsIGNoZWNrIHlvdXIgR1N0cmVhbWVyIGluc3RhbGxhdGlvbi4iKSk7CisgICAgLyogVGhpcyB3aWxsIGVycm9yIG91dCB3aXRoIG5vdC1uZWdvdGlhdGVkLi4gKi8KKyAgICBmYWtlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNyYyIsICJmYWtlLWF1dG8tYXVkaW8tc3JjIik7CisgIH0KKyAgcmV0dXJuIGZha2U7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXV0b19hdWRpb19zcmNfY2xhc3NfaW5pdCAoR3N0QXV0b0F1ZGlvU3JjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0QXV0b0RldGVjdENsYXNzICphdXRvY2xhc3MgPSBHU1RfQVVUT19ERVRFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICpla2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChla2xhc3MsICZzcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChla2xhc3MsICJBdXRvIGF1ZGlvIHNvdXJjZSIsCisgICAgICAiU291cmNlL0F1ZGlvIiwKKyAgICAgICJXcmFwcGVyIGF1ZGlvIHNvdXJjZSBmb3IgYXV0b21hdGljYWxseSBkZXRlY3RlZCBhdWRpbyBzb3VyY2UiLAorICAgICAgIkphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4sICIKKyAgICAgICJTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+Iik7CisKKyAgYXV0b2NsYXNzLT5jcmVhdGVfZmFrZV9lbGVtZW50ID0gZ3N0X2F1dG9fYXVkaW9fc3JjX2NyZWF0ZV9mYWtlX2VsZW1lbnQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXV0b19hdWRpb19zcmNfaW5pdCAoR3N0QXV0b0F1ZGlvU3JjICogc3JjKQoreworICBHc3RBdXRvRGV0ZWN0ICphdXRvZGV0ZWN0ID0gR1NUX0FVVE9fREVURUNUIChzcmMpOworCisgIGF1dG9kZXRlY3QtPm1lZGlhX2tsYXNzID0gIkF1ZGlvIjsKKyAgYXV0b2RldGVjdC0+ZmxhZyA9IEdTVF9FTEVNRU5UX0ZMQUdfU09VUkNFOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmggYi9nc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjdjZGFlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmgKQEAgLTAsMCArMSw1NCBAQAorLyogR1N0cmVhbWVyCisgKiAoYykgMjAwNSBSb25hbGQgUy4gQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAoYykgMjAwOCBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9BVVRPX0FVRElPX1NSQ19IX18KKyNkZWZpbmUgX19HU1RfQVVUT19BVURJT19TUkNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSAiZ3N0YXV0b2RldGVjdC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQVVUT19BVURJT19TUkMgXAorICAoZ3N0X2F1dG9fYXVkaW9fc3JjX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfQVVUT19BVURJT19TUkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0FVVE9fQVVESU9fU1JDLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0QXV0b0F1ZGlvU3JjKSkKKyNkZWZpbmUgR1NUX0FVVE9fQVVESU9fU1JDX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfQVVUT19BVURJT19TUkMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RBdXRvQXVkaW9TcmNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BVVRPX0FVRElPX1NSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfQVVUT19BVURJT19TUkMpKQorI2RlZmluZSBHU1RfSVNfQVVUT19BVURJT19TUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9BVVRPX0FVRElPX1NSQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdXRvQXVkaW9TcmMgeworICBHc3RBdXRvRGV0ZWN0IHBhcmVudDsKK30gR3N0QXV0b0F1ZGlvU3JjOworCit0eXBlZGVmIHN0cnVjdCBfR3N0QXV0b0F1ZGlvU3JjQ2xhc3MgeworICBHc3RBdXRvRGV0ZWN0Q2xhc3MgcGFyZW50X2NsYXNzOworfSBHc3RBdXRvQXVkaW9TcmNDbGFzczsKKworR1R5cGUgICBnc3RfYXV0b19hdWRpb19zcmNfZ2V0X3R5cGUgICAgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfQVVUT19BVURJT19TUkNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXV0b2RldGVjdC9nc3RhdXRvZGV0ZWN0LmMgYi9nc3QvYXV0b2RldGVjdC9nc3RhdXRvZGV0ZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzMDI0MQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG9kZXRlY3QuYwpAQCAtMCwwICsxLDUwNyBAQAorLyogR1N0cmVhbWVyCisgKiAoYykgMjAwNSBSb25hbGQgUy4gQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImdzdGF1dG9kZXRlY3QuaCIKKyNpbmNsdWRlICJnc3RhdXRvYXVkaW9zaW5rLmgiCisjaW5jbHVkZSAiZ3N0YXV0b2F1ZGlvc3JjLmgiCisjaW5jbHVkZSAiZ3N0YXV0b3ZpZGVvc2luay5oIgorI2luY2x1ZGUgImdzdGF1dG92aWRlb3NyYy5oIgorCitHU1RfREVCVUdfQ0FURUdPUlkgKGF1dG9kZXRlY3RfZGVidWcpOworCisjZGVmaW5lIERFRkFVTFRfU1lOQyAgICAgICAgICAgICAgICBUUlVFCisKKy8qIFByb3BlcnRpZXMgKi8KK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0NBUFMsCisgIFBST1BfU1lOQywKK307CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfYXV0b19kZXRlY3RfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyB2b2lkIGdzdF9hdXRvX2RldGVjdF9jb25zdHJ1Y3RlZCAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgdm9pZCBnc3RfYXV0b19kZXRlY3RfZGlzcG9zZSAoR09iamVjdCAqIHNlbGYpOworc3RhdGljIHZvaWQgZ3N0X2F1dG9fZGV0ZWN0X2NsZWFyX2tpZCAoR3N0QXV0b0RldGVjdCAqIHNlbGYpOworc3RhdGljIHZvaWQgZ3N0X2F1dG9fZGV0ZWN0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hdXRvX2RldGVjdF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKKyNkZWZpbmUgZ3N0X2F1dG9fZGV0ZWN0X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX0FCU1RSQUNUX1RZUEUgKEdzdEF1dG9EZXRlY3QsIGdzdF9hdXRvX2RldGVjdCwgR1NUX1RZUEVfQklOKTsKKworc3RhdGljIHZvaWQKK2dzdF9hdXRvX2RldGVjdF9jbGFzc19pbml0IChHc3RBdXRvRGV0ZWN0Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmVrbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgZWtsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5jb25zdHJ1Y3RlZCA9IGdzdF9hdXRvX2RldGVjdF9jb25zdHJ1Y3RlZDsKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF9hdXRvX2RldGVjdF9kaXNwb3NlOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfYXV0b19kZXRlY3Rfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfYXV0b19kZXRlY3RfZ2V0X3Byb3BlcnR5OworCisgIGVrbGFzcy0+Y2hhbmdlX3N0YXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdXRvX2RldGVjdF9jaGFuZ2Vfc3RhdGUpOworCisgIC8qKgorICAgKiBHc3RBdXRvRGV0ZWN0OmZpbHRlci1jYXBzOgorICAgKgorICAgKiBUaGlzIHByb3BlcnR5IHdpbGwgZmlsdGVyIG91dCBjYW5kaWRhdGUgc2lua3MgdGhhdCBjYW4gaGFuZGxlIHRoZSBzcGVjaWZpZWQKKyAgICogY2Fwcy4gQnkgZGVmYXVsdCBvbmx5IGVsZW1lbnRzIHRoYXQgc3VwcG9ydCB1bmNvbXByZXNzZWQgZGF0YSBhcmUgc2VsZWN0ZWQuCisgICAqCisgICAqIFRoaXMgcHJvcGVydHkgY2FuIG9ubHkgYmUgc2V0IGJlZm9yZSB0aGUgZWxlbWVudCBnb2VzIHRvIHRoZSBSRUFEWSBzdGF0ZS4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ0FQUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoImZpbHRlci1jYXBzIiwgIkZpbHRlciBjYXBzIiwKKyAgICAgICAgICAiRmlsdGVyIHNpbmsgY2FuZGlkYXRlcyB1c2luZyB0aGVzZSBjYXBzLiIsIEdTVF9UWVBFX0NBUFMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TWU5DLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJzeW5jIiwgIlN5bmMiLAorICAgICAgICAgICJTeW5jIG9uIHRoZSBjbG9jayIsIERFRkFVTFRfU1lOQywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdXRvX2RldGVjdF9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RBdXRvRGV0ZWN0ICpzZWxmID0gR1NUX0FVVE9fREVURUNUIChvYmplY3QpOworCisgIGdzdF9hdXRvX2RldGVjdF9jbGVhcl9raWQgKHNlbGYpOworCisgIGlmIChzZWxmLT5maWx0ZXJfY2FwcykKKyAgICBnc3RfY2Fwc191bnJlZiAoc2VsZi0+ZmlsdGVyX2NhcHMpOworICBzZWxmLT5maWx0ZXJfY2FwcyA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKChHT2JqZWN0ICopIHNlbGYpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1dG9fZGV0ZWN0X2NsZWFyX2tpZCAoR3N0QXV0b0RldGVjdCAqIHNlbGYpCit7CisgIGlmIChzZWxmLT5raWQpIHsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNlbGYtPmtpZCwgR1NUX1NUQVRFX05VTEwpOworICAgIGdzdF9iaW5fcmVtb3ZlIChHU1RfQklOIChzZWxmKSwgc2VsZi0+a2lkKTsKKyAgICBzZWxmLT5raWQgPSBOVUxMOworICB9Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK2dzdF9hdXRvX2RldGVjdF9jcmVhdGVfZmFrZV9lbGVtZW50X2RlZmF1bHQgKEdzdEF1dG9EZXRlY3QgKiBzZWxmKQoreworICBHc3RFbGVtZW50ICpmYWtlOworICBnY2hhciBkdW1teV9mYWN0b3J5WzEwXSwgZHVtbXlfbmFtZVsyMF07CisKKyAgc3ByaW50ZiAoZHVtbXlfZmFjdG9yeSwgImZha2UlcyIsIHNlbGYtPnR5cGVfa2xhc3NfbGMpOworICBzcHJpbnRmIChkdW1teV9uYW1lLCAiZmFrZS0lcy0lcyIsIHNlbGYtPm1lZGlhX2tsYXNzX2xjLCBzZWxmLT50eXBlX2tsYXNzX2xjKTsKKyAgZmFrZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoZHVtbXlfZmFjdG9yeSwgZHVtbXlfbmFtZSk7CisgIGdfb2JqZWN0X3NldCAoZmFrZSwgInN5bmMiLCBzZWxmLT5zeW5jLCBOVUxMKTsKKworICByZXR1cm4gZmFrZTsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorZ3N0X2F1dG9fZGV0ZWN0X2NyZWF0ZV9mYWtlX2VsZW1lbnQgKEdzdEF1dG9EZXRlY3QgKiBzZWxmKQoreworICBHc3RBdXRvRGV0ZWN0Q2xhc3MgKmtsYXNzID0gR1NUX0FVVE9fREVURUNUX0dFVF9DTEFTUyAoc2VsZik7CisgIEdzdEVsZW1lbnQgKmZha2U7CisKKyAgaWYgKGtsYXNzLT5jcmVhdGVfZmFrZV9lbGVtZW50KQorICAgIGZha2UgPSBrbGFzcy0+Y3JlYXRlX2Zha2VfZWxlbWVudCAoc2VsZik7CisgIGVsc2UKKyAgICBmYWtlID0gZ3N0X2F1dG9fZGV0ZWN0X2NyZWF0ZV9mYWtlX2VsZW1lbnRfZGVmYXVsdCAoc2VsZik7CisKKyAgcmV0dXJuIGZha2U7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1dG9fZGV0ZWN0X2F0dGFjaF9naG9zdF9wYWQgKEdzdEF1dG9EZXRlY3QgKiBzZWxmKQoreworICBHc3RQYWQgKnRhcmdldCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzZWxmLT5raWQsIHNlbGYtPnR5cGVfa2xhc3NfbGMpOworICBnYm9vbGVhbiByZXMgPSBnc3RfZ2hvc3RfcGFkX3NldF90YXJnZXQgKEdTVF9HSE9TVF9QQUQgKHNlbGYtPnBhZCksIHRhcmdldCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHRhcmdldCk7CisKKyAgcmV0dXJuIHJlczsKK30KKworLyogSGFjayB0byBtYWtlIGluaXRpYWwgbGlua2luZyB3b3JrOyBpZGVhbGx5LCB0aGlzJ2Qgd29yayBldmVuIHdoZW4KKyAqIG5vIHRhcmdldCBoYXMgYmVlbiBhc3NpZ25lZCB0byB0aGUgZ2hvc3RwYWQgeWV0LiAqLworc3RhdGljIHZvaWQKK2dzdF9hdXRvX2RldGVjdF9yZXNldCAoR3N0QXV0b0RldGVjdCAqIHNlbGYpCit7CisgIGdzdF9hdXRvX2RldGVjdF9jbGVhcl9raWQgKHNlbGYpOworCisgIC8qIHBsYWNlaG9sZGVyIGVsZW1lbnQgKi8KKyAgc2VsZi0+a2lkID0gZ3N0X2F1dG9fZGV0ZWN0X2NyZWF0ZV9mYWtlX2VsZW1lbnQgKHNlbGYpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAoc2VsZiksIHNlbGYtPmtpZCk7CisKKyAgZ3N0X2F1dG9fZGV0ZWN0X2F0dGFjaF9naG9zdF9wYWQgKHNlbGYpOworfQorCitzdGF0aWMgR3N0U3RhdGljQ2FwcyByYXdfYXVkaW9fY2FwcyA9IEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3Iik7CitzdGF0aWMgR3N0U3RhdGljQ2FwcyByYXdfdmlkZW9fY2FwcyA9IEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtcmF3Iik7CisKK3N0YXRpYyB2b2lkCitnc3RfYXV0b19kZXRlY3RfaW5pdCAoR3N0QXV0b0RldGVjdCAqIHNlbGYpCit7CisgIHNlbGYtPnN5bmMgPSBERUZBVUxUX1NZTkM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXV0b19kZXRlY3RfY29uc3RydWN0ZWQgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEF1dG9EZXRlY3QgKnNlbGYgPSBHU1RfQVVUT19ERVRFQ1QgKG9iamVjdCk7CisgIGdib29sZWFuIGlzX2F1ZGlvOworCisgIGlmIChHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y29uc3RydWN0ZWQpCisgICAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNvbnN0cnVjdGVkIChvYmplY3QpOworCisgIGlzX2F1ZGlvID0gIWdfc3RyY21wMCAoc2VsZi0+bWVkaWFfa2xhc3MsICJBdWRpbyIpOworICBzZWxmLT50eXBlX2tsYXNzID0gKHNlbGYtPmZsYWcgPT0gR1NUX0VMRU1FTlRfRkxBR19TSU5LKSA/ICJTaW5rIiA6ICJTb3VyY2UiOworICBzZWxmLT50eXBlX2tsYXNzX2xjID0gKHNlbGYtPmZsYWcgPT0gR1NUX0VMRU1FTlRfRkxBR19TSU5LKSA/ICJzaW5rIiA6ICJzcmMiOworICBzZWxmLT5tZWRpYV9rbGFzc19sYyA9IGlzX2F1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyI7CisgIC8qIHNldCB0aGUgZGVmYXVsdCByYXcgY2FwcyAqLworICBzZWxmLT5maWx0ZXJfY2FwcyA9IGdzdF9zdGF0aWNfY2Fwc19nZXQgKGlzX2F1ZGlvID8gJnJhd19hdWRpb19jYXBzIDoKKyAgICAgICZyYXdfdmlkZW9fY2Fwcyk7CisKKyAgc2VsZi0+cGFkID0gZ3N0X2dob3N0X3BhZF9uZXdfbm9fdGFyZ2V0IChzZWxmLT50eXBlX2tsYXNzX2xjLAorICAgICAgKHNlbGYtPmZsYWcgPT0gR1NUX0VMRU1FTlRfRkxBR19TSU5LKSA/IEdTVF9QQURfU0lOSyA6IEdTVF9QQURfU1JDKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKHNlbGYpLCBzZWxmLT5wYWQpOworCisgIGdzdF9hdXRvX2RldGVjdF9yZXNldCAoc2VsZik7CisKKyAgLyogbWFyayBlbGVtZW50IHR5cGUgKi8KKyAgR1NUX09CSkVDVF9GTEFHX1NFVCAoc2VsZiwgc2VsZi0+ZmxhZyk7CisgIGdzdF9iaW5fc2V0X3N1cHByZXNzZWRfZmxhZ3MgKEdTVF9CSU4gKHNlbGYpLAorICAgICAgR1NUX0VMRU1FTlRfRkxBR19TT1VSQ0UgfCBHU1RfRUxFTUVOVF9GTEFHX1NJTkspOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdXRvX2RldGVjdF9mYWN0b3J5X2ZpbHRlciAoR3N0UGx1Z2luRmVhdHVyZSAqIGZlYXR1cmUsIGdwb2ludGVyIGRhdGEpCit7CisgIEdzdEF1dG9EZXRlY3QgKnNlbGYgPSAoR3N0QXV0b0RldGVjdCAqKSBkYXRhOworICBndWludCByYW5rOworICBjb25zdCBnY2hhciAqa2xhc3M7CisKKyAgLyogd2Ugb25seSBjYXJlIGFib3V0IGVsZW1lbnQgZmFjdG9yaWVzICovCisgIGlmICghR1NUX0lTX0VMRU1FTlRfRkFDVE9SWSAoZmVhdHVyZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIGF1ZGlvIHNpbmtzICovCisgIGtsYXNzID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9nZXRfbWV0YWRhdGEgKEdTVF9FTEVNRU5UX0ZBQ1RPUlkgKGZlYXR1cmUpLAorICAgICAgR1NUX0VMRU1FTlRfTUVUQURBVEFfS0xBU1MpOworICBpZiAoIShzdHJzdHIgKGtsYXNzLCBzZWxmLT50eXBlX2tsYXNzKSAmJiBzdHJzdHIgKGtsYXNzLCBzZWxmLT5tZWRpYV9rbGFzcykpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBvbmx5IHNlbGVjdCBlbGVtZW50cyB3aXRoIGF1dG9wbHVnZ2luZyByYW5rICovCisgIHJhbmsgPSBnc3RfcGx1Z2luX2ZlYXR1cmVfZ2V0X3JhbmsgKGZlYXR1cmUpOworICBpZiAocmFuayA8IEdTVF9SQU5LX01BUkdJTkFMKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorY3JlYXRlX2VsZW1lbnRfd2l0aF9wcmV0dHlfbmFtZSAoR3N0QXV0b0RldGVjdCAqIHNlbGYsCisgICAgR3N0RWxlbWVudEZhY3RvcnkgKiBmYWN0b3J5KQoreworICBHc3RFbGVtZW50ICplbGVtZW50OworICBnY2hhciAqbmFtZSwgKm1hcmtlcjsKKworICBtYXJrZXIgPSBnX3N0cmR1cCAoR1NUX09CSkVDVF9OQU1FIChmYWN0b3J5KSk7CisgIGlmIChnX3N0cl9oYXNfc3VmZml4IChtYXJrZXIsIHNlbGYtPnR5cGVfa2xhc3NfbGMpKQorICAgIG1hcmtlcltzdHJsZW4gKG1hcmtlcikgLSA0XSA9ICdcMCc7CisgIGlmIChnX3N0cl9oYXNfcHJlZml4IChtYXJrZXIsICJnc3QiKSkKKyAgICBtZW1tb3ZlIChtYXJrZXIsIG1hcmtlciArIDMsIHN0cmxlbiAobWFya2VyICsgMykgKyAxKTsKKyAgbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoIiVzLWFjdHVhbC0lcy0lcyIsIEdTVF9PQkpFQ1RfTkFNRSAoc2VsZiksCisgICAgICBzZWxmLT50eXBlX2tsYXNzX2xjLCBtYXJrZXIpOworICBnX2ZyZWUgKG1hcmtlcik7CisKKyAgZWxlbWVudCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfY3JlYXRlIChmYWN0b3J5LCBuYW1lKTsKKyAgZ19mcmVlIChuYW1lKTsKKworICByZXR1cm4gZWxlbWVudDsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorZ3N0X2F1dG9fZGV0ZWN0X2ZpbmRfYmVzdCAoR3N0QXV0b0RldGVjdCAqIHNlbGYpCit7CisgIEdMaXN0ICpsaXN0LCAqaXRlbTsKKyAgR3N0RWxlbWVudCAqY2hvaWNlID0gTlVMTDsKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZSA9IE5VTEw7CisgIEdTTGlzdCAqZXJyb3JzID0gTlVMTDsKKyAgR3N0QnVzICpidXMgPSBnc3RfYnVzX25ldyAoKTsKKyAgR3N0UGFkICplbF9wYWQgPSBOVUxMOworICBHc3RDYXBzICplbF9jYXBzID0gTlVMTDsKKyAgZ2Jvb2xlYW4gbm9fbWF0Y2ggPSBUUlVFOworCisgIC8qIFdlIGRvbid0IHRyZWF0IHNvdW5kIHNlcnZlciBzaW5rcyBzcGVjaWFsLiBPdXIgcG9saWN5IGlzIHRoYXQgc291bmQKKyAgICogc2VydmVyIHNpbmtzIHRoYXQgaGF2ZSBhIHJhbmsgbXVzdCBub3QgYXV0by1zcGF3biBhIGRhZW1vbiB1bmRlciBhbnkKKyAgICogY2lyY3Vtc3RhbmNlcywgc28gdGhlcmUncyBub3RoaW5nIGZvciB1cyB0byB3b3JyeSBhYm91dCBoZXJlICovCisgIGxpc3QgPSBnc3RfcmVnaXN0cnlfZmVhdHVyZV9maWx0ZXIgKGdzdF9yZWdpc3RyeV9nZXQgKCksCisgICAgICAoR3N0UGx1Z2luRmVhdHVyZUZpbHRlcikgZ3N0X2F1dG9fZGV0ZWN0X2ZhY3RvcnlfZmlsdGVyLCBGQUxTRSwgc2VsZik7CisgIGxpc3QgPQorICAgICAgZ19saXN0X3NvcnQgKGxpc3QsIChHQ29tcGFyZUZ1bmMpIGdzdF9wbHVnaW5fZmVhdHVyZV9yYW5rX2NvbXBhcmVfZnVuYyk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNlbGYsICJUcnlpbmcgdG8gZmluZCB1c2FibGUgJXMgZWxlbWVudHMgLi4uIiwKKyAgICAgIHNlbGYtPm1lZGlhX2tsYXNzX2xjKTsKKworICBmb3IgKGl0ZW0gPSBsaXN0OyBpdGVtICE9IE5VTEw7IGl0ZW0gPSBpdGVtLT5uZXh0KSB7CisgICAgR3N0RWxlbWVudEZhY3RvcnkgKmYgPSBHU1RfRUxFTUVOVF9GQUNUT1JZIChpdGVtLT5kYXRhKTsKKyAgICBHc3RFbGVtZW50ICplbDsKKworICAgIGlmICgoZWwgPSBjcmVhdGVfZWxlbWVudF93aXRoX3ByZXR0eV9uYW1lIChzZWxmLCBmKSkpIHsKKyAgICAgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlRlc3RpbmcgJXMiLCBHU1RfT0JKRUNUX05BTUUgKGYpKTsKKworICAgICAgLyogSWYgYXV0b2RldGVjdCBoYXMgYmVlbiBwcm92aWRlZCB3aXRoIGZpbHRlciBjYXBzLAorICAgICAgICogYWNjZXB0IG9ubHkgZWxlbWVudHMgdGhhdCBtYXRjaCB3aXRoIHRoZSBmaWx0ZXIgY2FwcyAqLworICAgICAgaWYgKHNlbGYtPmZpbHRlcl9jYXBzKSB7CisgICAgICAgIGVsX3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChlbCwgc2VsZi0+dHlwZV9rbGFzc19sYyk7CisgICAgICAgIGVsX2NhcHMgPSBnc3RfcGFkX3F1ZXJ5X2NhcHMgKGVsX3BhZCwgTlVMTCk7CisgICAgICAgIGdzdF9vYmplY3RfdW5yZWYgKGVsX3BhZCk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICAgICAiQ2hlY2tpbmcgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQgIiB2cy4gJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgICAgICBzZWxmLT5maWx0ZXJfY2FwcywgZWxfY2Fwcyk7CisgICAgICAgIG5vX21hdGNoID0gIWdzdF9jYXBzX2Nhbl9pbnRlcnNlY3QgKHNlbGYtPmZpbHRlcl9jYXBzLCBlbF9jYXBzKTsKKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKGVsX2NhcHMpOworCisgICAgICAgIGlmIChub19tYXRjaCkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJJbmNvbXBhdGlibGUgY2FwcyIpOworICAgICAgICAgIGdzdF9vYmplY3RfdW5yZWYgKGVsKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiRm91bmQgY29tcGF0aWJsZSBjYXBzIik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAoZWwsIGJ1cyk7CisgICAgICByZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsLCBHU1RfU1RBVEVfUkVBRFkpOworICAgICAgaWYgKHJldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlRoaXMgd29ya2VkISIpOworICAgICAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsLCBHU1RfU1RBVEVfTlVMTCk7CisgICAgICAgIGNob2ljZSA9IGVsOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLyogY29sbGVjdCBhbGwgZXJyb3IgbWVzc2FnZXMgKi8KKyAgICAgIHdoaWxlICgobWVzc2FnZSA9IGdzdF9idXNfcG9wX2ZpbHRlcmVkIChidXMsIEdTVF9NRVNTQUdFX0VSUk9SKSkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImVycm9yIG1lc3NhZ2UgJSIgR1NUX1BUUl9GT1JNQVQsIG1lc3NhZ2UpOworICAgICAgICBlcnJvcnMgPSBnX3NsaXN0X2FwcGVuZCAoZXJyb3JzLCBtZXNzYWdlKTsKKyAgICAgIH0KKworICAgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbCwgR1NUX1NUQVRFX05VTEwpOworICAgICAgZ3N0X29iamVjdF91bnJlZiAoZWwpOworICAgIH0KKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJkb25lIHRyeWluZyIpOworICBpZiAoIWNob2ljZSkgeworICAgIC8qIFdlIHBvc3QgYSB3YXJuaW5nIGFuZCBwbHVnIGEgZmFrZS1lbGVtZW50LiBUaGlzIGlzIGNvbnZlbmllbnQgZm9yIHJ1bm5pbmcKKyAgICAgKiB0ZXN0cyB3aXRob3V0IHJlcXVpcmluZyBoYXJkd2FyZSBzcmMvc2lua3MuICovCisgICAgaWYgKGVycm9ycykgeworICAgICAgR0Vycm9yICplcnIgPSBOVUxMOworICAgICAgZ2NoYXIgKmRiZyA9IE5VTEw7CisKKyAgICAgIC8qIEZJWE1FOiB3ZSBmb3J3YXJkIHRoZSBmaXJzdCBtZXNzYWdlIGZvciBub3c7IGJ1dCBsYXRlciBvbiBpdCBtaWdodCBtYWtlCisgICAgICAgKiBzZW5zZSB0byBmb3J3YXJkIGFsbCBzbyB0aGF0IGFwcHMgY2FuIGFjdHVhbGx5IGFuYWx5c2UgdGhlbS4gKi8KKyAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChHU1RfTUVTU0FHRSAoZXJyb3JzLT5kYXRhKSwgJmVyciwgJmRiZyk7CisgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHNlbGYpLAorICAgICAgICAgIGdzdF9tZXNzYWdlX25ld193YXJuaW5nIChHU1RfT0JKRUNUX0NBU1QgKHNlbGYpLCBlcnIsIGRiZykpOworICAgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICAgICAgZ19mcmVlIChkYmcpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBzZW5kIHdhcm5pbmcgbWVzc2FnZSB0byBhcHBsaWNhdGlvbiBhbmQgdXNlIGEgZmFrZXNyYyAqLworICAgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoc2VsZiwgUkVTT1VSQ0UsIE5PVF9GT1VORCwgKE5VTEwpLAorICAgICAgICAgICgiRmFpbGVkIHRvIGZpbmQgYSB1c2FibGUgJXMgJXMiLCBzZWxmLT5tZWRpYV9rbGFzc19sYywKKyAgICAgICAgICAgICAgc2VsZi0+dHlwZV9rbGFzc19sYykpOworICAgIH0KKyAgICBjaG9pY2UgPSBnc3RfYXV0b19kZXRlY3RfY3JlYXRlX2Zha2VfZWxlbWVudCAoc2VsZik7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChjaG9pY2UsIEdTVF9TVEFURV9SRUFEWSk7CisgIH0KKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZ3N0X3BsdWdpbl9mZWF0dXJlX2xpc3RfZnJlZSAobGlzdCk7CisgIGdfc2xpc3RfZm9yZWFjaCAoZXJyb3JzLCAoR0Z1bmMpIGdzdF9taW5pX29iamVjdF91bnJlZiwgTlVMTCk7CisgIGdfc2xpc3RfZnJlZSAoZXJyb3JzKTsKKworICByZXR1cm4gY2hvaWNlOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdXRvX2RldGVjdF9kZXRlY3QgKEdzdEF1dG9EZXRlY3QgKiBzZWxmKQoreworICBHc3RFbGVtZW50ICpraWQ7CisgIEdzdEF1dG9EZXRlY3RDbGFzcyAqa2xhc3MgPSBHU1RfQVVUT19ERVRFQ1RfR0VUX0NMQVNTIChzZWxmKTsKKworICBnc3RfYXV0b19kZXRlY3RfY2xlYXJfa2lkIChzZWxmKTsKKworICAvKiBmaW5kIGVsZW1lbnQgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkNyZWF0aW5nIG5ldyBraWQiKTsKKyAgaWYgKCEoa2lkID0gZ3N0X2F1dG9fZGV0ZWN0X2ZpbmRfYmVzdCAoc2VsZikpKQorICAgIGdvdG8gbm9fc2luazsKKworICBzZWxmLT5oYXNfc3luYyA9CisgICAgICBnX29iamVjdF9jbGFzc19maW5kX3Byb3BlcnR5IChHX09CSkVDVF9HRVRfQ0xBU1MgKGtpZCksICJzeW5jIikgIT0gTlVMTDsKKyAgaWYgKHNlbGYtPmhhc19zeW5jKQorICAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGtpZCksICJzeW5jIiwgc2VsZi0+c3luYywgTlVMTCk7CisgIGlmIChrbGFzcy0+Y29uZmlndXJlKSB7CisgICAga2xhc3MtPmNvbmZpZ3VyZSAoc2VsZiwga2lkKTsKKyAgfQorCisgIHNlbGYtPmtpZCA9IGtpZDsKKworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAoc2VsZiksIGtpZCk7CisKKyAgLyogRW5zdXJlIHRoZSBjaGlsZCBpcyBicm91Z2h0IHVwIHRvIHRoZSByaWdodCBzdGF0ZSB0byBtYXRjaCB0aGUgcGFyZW50LiAqLworICBpZiAoR1NUX1NUQVRFIChzZWxmLT5raWQpIDwgR1NUX1NUQVRFIChzZWxmKSkKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNlbGYtPmtpZCwgR1NUX1NUQVRFIChzZWxmKSk7CisKKyAgLyogYXR0YWNoIGdob3N0IHBhZCAqLworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiUmUtYXNzaWduaW5nIGdob3N0cGFkIik7CisgIGlmICghZ3N0X2F1dG9fZGV0ZWN0X2F0dGFjaF9naG9zdF9wYWQgKHNlbGYpKQorICAgIGdvdG8gdGFyZ2V0X2ZhaWxlZDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiZG9uZSBjaGFuZ2luZyBhdXRvICVzICVzIiwgc2VsZi0+bWVkaWFfa2xhc3NfbGMsCisgICAgICBzZWxmLT50eXBlX2tsYXNzX2xjKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK25vX3Npbms6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2VsZiwgTElCUkFSWSwgSU5JVCwgKE5VTEwpLAorICAgICAgICAoIkZhaWxlZCB0byBmaW5kIGEgc3VwcG9ydGVkIGF1ZGlvIHNpbmsiKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit0YXJnZXRfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNlbGYsIExJQlJBUlksIElOSVQsIChOVUxMKSwKKyAgICAgICAgKCJGYWlsZWQgdG8gc2V0IHRhcmdldCBwYWQiKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2F1dG9fZGV0ZWN0X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUzsKKyAgR3N0QXV0b0RldGVjdCAqc2luayA9IEdTVF9BVVRPX0RFVEVDVCAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBpZiAoIWdzdF9hdXRvX2RldGVjdF9kZXRlY3QgKHNpbmspKQorICAgICAgICByZXR1cm4gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisgIGlmIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKQorICAgIHJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBnc3RfYXV0b19kZXRlY3RfcmVzZXQgKHNpbmspOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdXRvX2RldGVjdF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXV0b0RldGVjdCAqc2VsZiA9IEdTVF9BVVRPX0RFVEVDVCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ0FQUzoKKyAgICAgIGlmIChzZWxmLT5maWx0ZXJfY2FwcykKKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKHNlbGYtPmZpbHRlcl9jYXBzKTsKKyAgICAgIHNlbGYtPmZpbHRlcl9jYXBzID0gZ3N0X2NhcHNfY29weSAoZ3N0X3ZhbHVlX2dldF9jYXBzICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NZTkM6CisgICAgICBzZWxmLT5zeW5jID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgaWYgKHNlbGYtPmtpZCAmJiBzZWxmLT5oYXNfc3luYykKKyAgICAgICAgZ19vYmplY3Rfc2V0X3Byb3BlcnR5IChHX09CSkVDVCAoc2VsZi0+a2lkKSwgcHNwZWMtPm5hbWUsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdXRvX2RldGVjdF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXV0b0RldGVjdCAqc2VsZiA9IEdTVF9BVVRPX0RFVEVDVCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ0FQUzoKKyAgICAgIGdzdF92YWx1ZV9zZXRfY2FwcyAodmFsdWUsIHNlbGYtPmZpbHRlcl9jYXBzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TWU5DOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNlbGYtPnN5bmMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChhdXRvZGV0ZWN0X2RlYnVnLCAiYXV0b2RldGVjdCIsIDAsCisgICAgICAiQXV0b2RldGVjdGlvbiBhdWRpby92aWRlbyBvdXRwdXQgd3JhcHBlciBlbGVtZW50cyIpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXV0b3ZpZGVvc2luayIsCisgICAgICBHU1RfUkFOS19OT05FLCBHU1RfVFlQRV9BVVRPX1ZJREVPX1NJTkspICYmCisgICAgICBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXV0b3ZpZGVvc3JjIiwKKyAgICAgIEdTVF9SQU5LX05PTkUsIEdTVF9UWVBFX0FVVE9fVklERU9fU1JDKSAmJgorICAgICAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImF1dG9hdWRpb3NpbmsiLAorICAgICAgR1NUX1JBTktfTk9ORSwgR1NUX1RZUEVfQVVUT19BVURJT19TSU5LKSAmJgorICAgICAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImF1dG9hdWRpb3NyYyIsCisgICAgICBHU1RfUkFOS19OT05FLCBHU1RfVFlQRV9BVVRPX0FVRElPX1NSQyk7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBhdXRvZGV0ZWN0LAorICAgICJQbHVnaW4gY29udGFpbnMgYXV0by1kZXRlY3Rpb24gcGx1Z2lucyBmb3IgdmlkZW8vYXVkaW8gaW4tIGFuZCBvdXRwdXRzIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG9kZXRlY3QuaCBiL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG9kZXRlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWFlODlmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2RldGVjdC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qIEdTdHJlYW1lcgorICogKGMpIDIwMDUgUm9uYWxkIFMuIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfQVVUT19ERVRFQ1RfSF9fCisjZGVmaW5lIF9fR1NUX0FVVE9fREVURUNUX0hfXworCitHX0JFR0lOX0RFQ0xTCisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKGF1dG9kZXRlY3RfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgYXV0b2RldGVjdF9kZWJ1ZworCisjZGVmaW5lIEdTVF9UWVBFX0FVVE9fREVURUNUIChnc3RfYXV0b19kZXRlY3RfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9BVVRPX0RFVEVDVChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfQVVUT19ERVRFQ1QsIEdzdEF1dG9EZXRlY3QpKQorI2RlZmluZSBHU1RfQVVUT19ERVRFQ1RfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9BVVRPX0RFVEVDVCwgR3N0QXV0b0RldGVjdENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FVVE9fREVURUNUKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9BVVRPX0RFVEVDVCkpCisjZGVmaW5lIEdTVF9JU19BVVRPX0RFVEVDVF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX0FVVE9fREVURUNUKSkKKyNkZWZpbmUgR1NUX0FVVE9fREVURUNUX0dFVF9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9BVVRPX0RFVEVDVCwgR3N0QXV0b0RldGVjdENsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1dG9EZXRlY3QgeworICBHc3RCaW4gcGFyZW50OworICAKKyAgLyogY29uZmlndXJhdGlvbiBmb3Igc3ViY2xhc3NlcyAqLworICBjb25zdCBnY2hhciAqbWVkaWFfa2xhc3M7IC8qIEF1ZGlvL1ZpZGVvLy4uLiAqLworICBHc3RFbGVtZW50RmxhZ3MgZmxhZzsgLyogR1NUX0VMRU1FTlRfRkxBR197U0lOSy9TT1VSQ0V9ICovCisKKyAgLyogZXhwbGljaXQgcG9pbnRlcnMgdG8gc3R1ZmYgdXNlZCAqLworICBHc3RQYWQgKnBhZDsKKyAgR3N0Q2FwcyAqZmlsdGVyX2NhcHM7CisgIGdib29sZWFuIHN5bmM7CisKKyAgLyogPCBwcml2YXRlID4gKi8gCisgIEdzdEVsZW1lbnQgKmtpZDsKKyAgZ2Jvb2xlYW4gaGFzX3N5bmM7CisgIGNvbnN0IGdjaGFyICp0eXBlX2tsYXNzOyAvKiBTb3VyY2UvU2luayAqLworICBjb25zdCBnY2hhciAqbWVkaWFfa2xhc3NfbGMsICp0eXBlX2tsYXNzX2xjOyAvKiBsb3dlciBjYXNlIHZlcnNpb25zICovCisKK30gR3N0QXV0b0RldGVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1dG9EZXRlY3RDbGFzcyB7CisgIEdzdEJpbkNsYXNzIHBhcmVudF9jbGFzczsKKyAgCisgIC8qPCBwcml2YXRlID4qLworICAvKiB2aXJ0dWFsIG1ldGhvZHMgZm9yIHN1YmNsYXNzZXMgKi8KKyAgdm9pZCAoKmNvbmZpZ3VyZSkoR3N0QXV0b0RldGVjdCAqc2VsZiwgR3N0RWxlbWVudCAqa2lkKTsKKyAgR3N0RWxlbWVudCAqICgqY3JlYXRlX2Zha2VfZWxlbWVudCkgKEdzdEF1dG9EZXRlY3QgKiBhdXRvZGV0ZWN0KTsKK30gR3N0QXV0b0RldGVjdENsYXNzOworCitHVHlwZSAgIGdzdF9hdXRvX2RldGVjdF9nZXRfdHlwZSAgICAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9BVVRPX0RFVEVDVF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYyBiL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGZkOTFlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jCkBAIC0wLDAgKzEsMTQzIEBACisvKiBHU3RyZWFtZXIKKyAqIChjKSAyMDA1IFJvbmFsZCBTLiBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqIChjKSAyMDA2IEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1hdXRvdmlkZW9zaW5rCisgKiBAc2VlX2Fsc286IGF1dG9hdWRpb3NpbmssIHhpbWFnZXNpbmssIHh2aW1hZ2VzaW5rLCBzZGx2aWRlb3NpbmsKKyAqCisgKiBhdXRvdmlkZW9zaW5rIGlzIGEgdmlkZW8gc2luayB0aGF0IGF1dG9tYXRpY2FsbHkgZGV0ZWN0cyBhbiBhcHByb3ByaWF0ZQorICogdmlkZW8gc2luayB0byB1c2UuICBJdCBkb2VzIHNvIGJ5IHNjYW5uaW5nIHRoZSByZWdpc3RyeSBmb3IgYWxsIGVsZW1lbnRzCisgKiB0aGF0IGhhdmUgPHF1b3RlPlNpbms8L3F1b3RlPiBhbmQgPHF1b3RlPlZpZGVvPC9xdW90ZT4gaW4gdGhlIGNsYXNzIGZpZWxkCisgKiBvZiB0aGVpciBlbGVtZW50IGluZm9ybWF0aW9uLCBhbmQgYWxzbyBoYXZlIGEgbm9uLXplcm8gYXV0b3BsdWdnaW5nIHJhbmsuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IC1tIHZpZGVvdGVzdHNyYyAhIGF1dG92aWRlb3NpbmsKKyAqIF18CisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdGF1dG92aWRlb3NpbmsuaCIKKworI2RlZmluZSBERUZBVUxUX1RTX09GRlNFVCAgICAgICAgICAgMAorCisvKiBQcm9wZXJ0aWVzICovCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9UU19PRkZTRVQsCit9OworCitzdGF0aWMgdm9pZCBnc3RfYXV0b192aWRlb19zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hdXRvX3ZpZGVvX3NpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1dG9fdmlkZW9fc2lua19jb25maWd1cmUgKEdzdEF1dG9EZXRlY3QgKiBhdXRvZGV0ZWN0LAorICAgIEdzdEVsZW1lbnQgKiBraWQpOworCitHX0RFRklORV9UWVBFIChHc3RBdXRvVmlkZW9TaW5rLCBnc3RfYXV0b192aWRlb19zaW5rLCBHU1RfVFlQRV9BVVRPX0RFVEVDVCk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK3N0YXRpYyB2b2lkCitnc3RfYXV0b192aWRlb19zaW5rX2NsYXNzX2luaXQgKEdzdEF1dG9WaWRlb1NpbmtDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmVrbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdzdEF1dG9EZXRlY3RDbGFzcyAqYWtsYXNzID0gR1NUX0FVVE9fREVURUNUX0NMQVNTIChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2F1dG9fdmlkZW9fc2lua19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9hdXRvX3ZpZGVvX3NpbmtfZ2V0X3Byb3BlcnR5OworCisgIGFrbGFzcy0+Y29uZmlndXJlID0gZ3N0X2F1dG9fdmlkZW9fc2lua19jb25maWd1cmU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UU19PRkZTRVQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50NjQgKCJ0cy1vZmZzZXQiLCAiVFMgT2Zmc2V0IiwKKyAgICAgICAgICAiVGltZXN0YW1wIG9mZnNldCBpbiBuYW5vc2Vjb25kcyIsIEdfTUlOSU5UNjQsIEdfTUFYSU5UNjQsCisgICAgICAgICAgREVGQVVMVF9UU19PRkZTRVQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChla2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWtsYXNzLCAiQXV0byB2aWRlbyBzaW5rIiwKKyAgICAgICJTaW5rL1ZpZGVvIiwKKyAgICAgICJXcmFwcGVyIHZpZGVvIHNpbmsgZm9yIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdmlkZW8gc2luayIsCisgICAgICAiSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1dG9fdmlkZW9fc2lua19pbml0IChHc3RBdXRvVmlkZW9TaW5rICogc2luaykKK3sKKyAgR3N0QXV0b0RldGVjdCAqYXV0b2RldGVjdCA9IEdTVF9BVVRPX0RFVEVDVCAoc2luayk7CisKKyAgYXV0b2RldGVjdC0+bWVkaWFfa2xhc3MgPSAiVmlkZW8iOworICBhdXRvZGV0ZWN0LT5mbGFnID0gR1NUX0VMRU1FTlRfRkxBR19TSU5LOworCisgIHNpbmstPnRzX29mZnNldCA9IERFRkFVTFRfVFNfT0ZGU0VUOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1dG9fdmlkZW9fc2lua19jb25maWd1cmUgKEdzdEF1dG9EZXRlY3QgKiBhdXRvZGV0ZWN0LCBHc3RFbGVtZW50ICoga2lkKQoreworICBHc3RBdXRvVmlkZW9TaW5rICpzZWxmID0gR1NUX0FVVE9fVklERU9fU0lOSyAoYXV0b2RldGVjdCk7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoa2lkKSwgInRzLW9mZnNldCIsIHNlbGYtPnRzX29mZnNldCwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXV0b192aWRlb19zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdXRvVmlkZW9TaW5rICpzaW5rID0gR1NUX0FVVE9fVklERU9fU0lOSyAob2JqZWN0KTsKKyAgR3N0QXV0b0RldGVjdCAqYXV0b2RldGVjdCA9IChHc3RBdXRvRGV0ZWN0ICopIHNpbms7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1RTX09GRlNFVDoKKyAgICAgIHNpbmstPnRzX29mZnNldCA9IGdfdmFsdWVfZ2V0X2ludDY0ICh2YWx1ZSk7CisgICAgICBpZiAoYXV0b2RldGVjdC0+a2lkKQorICAgICAgICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChhdXRvZGV0ZWN0LT5raWQpLCBwc3BlYy0+bmFtZSwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1dG9fdmlkZW9fc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXV0b1ZpZGVvU2luayAqc2luayA9IEdTVF9BVVRPX1ZJREVPX1NJTksgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1RTX09GRlNFVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludDY0ICh2YWx1ZSwgc2luay0+dHNfb2Zmc2V0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuaCBiL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjdkYjQwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIEdTdHJlYW1lcgorICogKGMpIDIwMDUgUm9uYWxkIFMuIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfQVVUT19WSURFT19TSU5LX0hfXworI2RlZmluZSBfX0dTVF9BVVRPX1ZJREVPX1NJTktfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSAiZ3N0YXV0b2RldGVjdC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQVVUT19WSURFT19TSU5LIFwKKyAgKGdzdF9hdXRvX3ZpZGVvX3NpbmtfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9BVVRPX1ZJREVPX1NJTksob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0FVVE9fVklERU9fU0lOSywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdEF1dG9WaWRlb1NpbmspKQorI2RlZmluZSBHU1RfQVVUT19WSURFT19TSU5LX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfQVVUT19WSURFT19TSU5LLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0QXV0b1ZpZGVvU2lua0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FVVE9fVklERU9fU0lOSyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfQVVUT19WSURFT19TSU5LKSkKKyNkZWZpbmUgR1NUX0lTX0FVVE9fVklERU9fU0lOS19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX0FVVE9fVklERU9fU0lOSykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdXRvVmlkZW9TaW5rIHsKKyAgR3N0QXV0b0RldGVjdCBwYXJlbnQ7CisKKyAgR3N0Q2xvY2tUaW1lRGlmZiB0c19vZmZzZXQ7Cit9IEdzdEF1dG9WaWRlb1Npbms7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdXRvVmlkZW9TaW5rQ2xhc3MgeworICBHc3RBdXRvRGV0ZWN0Q2xhc3MgcGFyZW50X2NsYXNzOworfSBHc3RBdXRvVmlkZW9TaW5rQ2xhc3M7CisKK0dUeXBlICAgZ3N0X2F1dG9fdmlkZW9fc2lua19nZXRfdHlwZSAgICAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9BVVRPX1ZJREVPX1NJTktfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYyBiL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNDM0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYwpAQCAtMCwwICsxLDk0IEBACisvKiBHU3RyZWFtZXIKKyAqIChjKSAyMDA1IFJvbmFsZCBTLiBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqIChjKSAyMDA2IEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKyAqIChjKSAyMDA4IFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1hdXRvdmlkZW9zcmMKKyAqIEBzZWVfYWxzbzogYXV0b2F1ZGlvc3JjLCB2NGwyc3JjLCB2NGxzcmMKKyAqCisgKiBhdXRvdmlkZW9zcmMgaXMgYSB2aWRlbyBzcmMgdGhhdCBhdXRvbWF0aWNhbGx5IGRldGVjdHMgYW4gYXBwcm9wcmlhdGUKKyAqIHZpZGVvIHNvdXJjZSB0byB1c2UuICBJdCBkb2VzIHNvIGJ5IHNjYW5uaW5nIHRoZSByZWdpc3RyeSBmb3IgYWxsIGVsZW1lbnRzCisgKiB0aGF0IGhhdmUgPHF1b3RlPlNvdXJjZTwvcXVvdGU+IGFuZCA8cXVvdGU+VmlkZW88L3F1b3RlPiBpbiB0aGUgY2xhc3MgZmllbGQKKyAqIG9mIHRoZWlyIGVsZW1lbnQgaW5mb3JtYXRpb24sIGFuZCBhbHNvIGhhdmUgYSBub24temVybyBhdXRvcGx1Z2dpbmcgcmFuay4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgLW0gYXV0b3ZpZGVvc3JjICEgeHZpbWFnZXNpbmsKKyAqIF18CisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdGF1dG92aWRlb3NyYy5oIgorCitHX0RFRklORV9UWVBFIChHc3RBdXRvVmlkZW9TcmMsIGdzdF9hdXRvX3ZpZGVvX3NyYywgR1NUX1RZUEVfQVVUT19ERVRFQ1QpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgR3N0RWxlbWVudCAqCitnc3RfYXV0b192aWRlb19zcmNfY3JlYXRlX2Zha2VfZWxlbWVudCAoR3N0QXV0b0RldGVjdCAqIGF1dG9kZXRlY3QpCit7CisgIEdzdEVsZW1lbnQgKmZha2U7CisKKyAgZmFrZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsICJmYWtlLWF1dG8tdmlkZW8tc3JjIik7CisgIGlmIChmYWtlICE9IE5VTEwpIHsKKyAgICBnX29iamVjdF9zZXQgKGZha2UsICJpcy1saXZlIiwgVFJVRSwgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF1dG9kZXRlY3QsIFJFU09VUkNFLCBOT1RfRk9VTkQsCisgICAgICAgICgiRmFpbGVkIHRvIGZpbmQgdXNhYmxlIHZpZGVvIHNvdXJjZSBlbGVtZW50LiIpLAorICAgICAgICAoIkZhaWxlZCB0byBmaW5kIGEgdXNhYmxlIHZpZGVvIHNvdXJjZSBhbmQgY291bGRuJ3QgY3JlYXRlIGEgdmlkZW8iCisgICAgICAgICAgICAidGVzdHNyYyBhcyBmYWxsYmFjayBlaXRoZXIsIGNoZWNrIHlvdXIgR1N0cmVhbWVyIGluc3RhbGxhdGlvbi4iKSk7CisgICAgLyogVGhpcyB3aWxsIGVycm9yIG91dCB3aXRoIG5vdC1uZWdvdGlhdGVkLi4gKi8KKyAgICBmYWtlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNyYyIsICJmYWtlLWF1dG8tdmlkZW8tc3JjIik7CisgIH0KKyAgcmV0dXJuIGZha2U7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXV0b192aWRlb19zcmNfY2xhc3NfaW5pdCAoR3N0QXV0b1ZpZGVvU3JjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0QXV0b0RldGVjdENsYXNzICphdXRvY2xhc3MgPSBHU1RfQVVUT19ERVRFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICpla2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChla2xhc3MsICZzcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChla2xhc3MsICJBdXRvIHZpZGVvIHNvdXJjZSIsCisgICAgICAiU291cmNlL1ZpZGVvIiwKKyAgICAgICJXcmFwcGVyIHZpZGVvIHNvdXJjZSBmb3IgYXV0b21hdGljYWxseSBkZXRlY3RlZCB2aWRlbyBzb3VyY2UiLAorICAgICAgIkphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4sICIKKyAgICAgICJTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+Iik7CisKKyAgYXV0b2NsYXNzLT5jcmVhdGVfZmFrZV9lbGVtZW50ID0gZ3N0X2F1dG9fdmlkZW9fc3JjX2NyZWF0ZV9mYWtlX2VsZW1lbnQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXV0b192aWRlb19zcmNfaW5pdCAoR3N0QXV0b1ZpZGVvU3JjICogc3JjKQoreworICBHc3RBdXRvRGV0ZWN0ICphdXRvZGV0ZWN0ID0gR1NUX0FVVE9fREVURUNUIChzcmMpOworCisgIGF1dG9kZXRlY3QtPm1lZGlhX2tsYXNzID0gIlZpZGVvIjsKKyAgYXV0b2RldGVjdC0+ZmxhZyA9IEdTVF9FTEVNRU5UX0ZMQUdfU09VUkNFOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc3JjLmggYi9nc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzZjYzcyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc3JjLmgKQEAgLTAsMCArMSw1NCBAQAorLyogR1N0cmVhbWVyCisgKiAoYykgMjAwNSBSb25hbGQgUy4gQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAoYykgMjAwOCBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9BVVRPX1ZJREVPX1NSQ19IX18KKyNkZWZpbmUgX19HU1RfQVVUT19WSURFT19TUkNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSAiZ3N0YXV0b2RldGVjdC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQVVUT19WSURFT19TUkMgXAorICAoZ3N0X2F1dG9fdmlkZW9fc3JjX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfQVVUT19WSURFT19TUkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0FVVE9fVklERU9fU1JDLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0QXV0b1ZpZGVvU3JjKSkKKyNkZWZpbmUgR1NUX0FVVE9fVklERU9fU1JDX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfQVVUT19WSURFT19TUkMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RBdXRvVmlkZW9TcmNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BVVRPX1ZJREVPX1NSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfQVVUT19WSURFT19TUkMpKQorI2RlZmluZSBHU1RfSVNfQVVUT19WSURFT19TUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9BVVRPX1ZJREVPX1NSQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdXRvVmlkZW9TcmMgeworICBHc3RBdXRvRGV0ZWN0IHBhcmVudDsKK30gR3N0QXV0b1ZpZGVvU3JjOworCit0eXBlZGVmIHN0cnVjdCBfR3N0QXV0b1ZpZGVvU3JjQ2xhc3MgeworICBHc3RBdXRvRGV0ZWN0Q2xhc3MgcGFyZW50X2NsYXNzOworfSBHc3RBdXRvVmlkZW9TcmNDbGFzczsKKworR1R5cGUgICBnc3RfYXV0b192aWRlb19zcmNfZ2V0X3R5cGUgICAgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfQVVUT19WSURFT19TUkNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXV0b2RldGVjdC9tZXNvbi5idWlsZCBiL2dzdC9hdXRvZGV0ZWN0L21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MTJkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXV0b2RldGVjdC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDE2IEBACithdXRvZGV0ZWN0X3NvdXJjZXMgPSBbCisgICdnc3RhdXRvYXVkaW9zaW5rLmMnLAorICAnZ3N0YXV0b2F1ZGlvc3JjLmMnLAorICAnZ3N0YXV0b2RldGVjdC5jJywKKyAgJ2dzdGF1dG92aWRlb3NpbmsuYycsCisgICdnc3RhdXRvdmlkZW9zcmMuYycsCitdCisKK2dzdGF1dG9kZXRlY3QgPSBsaWJyYXJ5KCdnc3RhdXRvZGV0ZWN0JywKKyAgYXV0b2RldGVjdF9zb3VyY2VzLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdF9kZXBdLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L2F2aS8uZ2l0aWdub3JlIGIvZ3N0L2F2aS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZjk2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXZpLy5naXRpZ25vcmUKQEAgLTAsMCArMSw4IEBACitNYWtlZmlsZQorTWFrZWZpbGUuaW4KKyoubworKi5sbworKi5sYQorLmRlcHMKKy5saWJzCitjb2RlY3Rlc3QKZGlmZiAtLWdpdCBhL2dzdC9hdmkvTWFrZWZpbGUuYW0gYi9nc3QvYXZpL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NmEzMjcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXZpL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjcgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdGF2aS5sYQorCitsaWJnc3RhdmlfbGFfU09VUkNFUyA9IFwKKwlnc3RhdmkuYyBcCisJZ3N0YXZpbXV4LmMgXAorCWdzdGF2aWRlbXV4LmMgXAorCWdzdGF2aXN1YnRpdGxlLmMKKworbm9pbnN0X0hFQURFUlMgPSBcCisJYXZpLWlkcy5oIFwKKwlnc3RhdmltdXguaCBcCisJZ3N0YXZpZGVtdXguaCBcCisJZ3N0YXZpc3VidGl0bGUuaAorCitsaWJnc3RhdmlfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdGF2aV9sYV9MSUJBREQgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIFwKKwkkKEdTVF9CQVNFX0xJQlMpIFwKKwkkKEdTVF9MSUJTKSBcCisJLWxnc3RyaWZmLUBHU1RfQVBJX1ZFUlNJT05AIFwKKwktbGdzdGF1ZGlvLUBHU1RfQVBJX1ZFUlNJT05AIFwKKwktbGdzdHRhZy1AR1NUX0FQSV9WRVJTSU9OQCBcCisJLWxnc3R2aWRlby1AR1NUX0FQSV9WRVJTSU9OQAorCitsaWJnc3RhdmlfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitFWFRSQV9ESVNUID0gUkVBRE1FCmRpZmYgLS1naXQgYS9nc3QvYXZpL1JFQURNRSBiL2dzdC9hdmkvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YTA4YTkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXZpL1JFQURNRQpAQCAtMCwwICsxLDcyIEBACitUaGUgYXZpIGRlY29kZXIgcGx1Z2lucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGF2aSBkZWNvZGVyIGNvbnNpc3RzIG9mIGEgc2V0IG9mIGdzdHJlYW1lciBwbHVnaW5zOgorCisgLSBkZW11eGVyIChhdmlkZW11eCkKKyAtIGF2aSB0byBnc3RyZWFtZXIgdHlwZSBjb252ZXJ0ZXIgKGF2aXR5cGVzKQorIC0gd2luZG93cyBkbGxzIHdyYXBwZXJzLgorCit0aGUgYXZpZGVjb2RlciBlbGVtZW50IHVzZXMgdGhlIGFib3ZlIHBsdWdpbnMgdG8gcGVyZm9ybSB0aGUgYXZpCitkZWNvZGluZy4gSXQgaXMgY29uc3RydWN0ZWQgYXMgYSBjdXN0b20gYmluIHdoaWNoIGluaXRpYWxseSBvbmx5IGhhcwordGhlIGRlbXV4ZXIgZWxlbWVudCBpbiBpdC4gVGhlIGRlbXV4ZXIgaGFzIGEgc2V0IG9mIHBhZHRlbXBsYXRlcyBmb3IKK3JhdyBhdWRpbyBhbmQgdmlkZW8uCisKKyAgKC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSkKKyAgISBhdmlkZWNvZGVyICAgICAgICAgICAgICAgICAgICAgICAgICEKKyAgISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2aWRlby9yYXcpLi4uCisgICEgICAgICgtLS0tLS0tLS0tKSAgICAgICAgICAgICAgICAgICAhCisgICEgICAgICEgZGVtdXhlciAodmlkZW8veC1tc3ZpZGVvLCBhdWRzKS4uCisgICEgICAgICEgICAgICAgICAgISAgICAgICAgICAgICAgICAgICAhCisgICEgICAtc3JjICAgICAgICAgISAgICAgICAgICAgICAgICAgICAhCisgICEgIC8gICEgICAgICAgICAodmlkZW8veC1tc3ZpZGVvLCB2aWRzKS4uCisgLSBzcmMgICEgICAgICAgICAgISAgICAgICAgICAgICAgICAgICAhCisgICEgICAgICgtLS0tLS0tLS0tKSAgICAgICAgICAgICAgICAoYXVkaW8vcmF3KS4uLgorICAhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIQorICAoLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKQorCit0aGUgZGVtdXhlciBoYXMgYSBzZXQgb2YgcGFkdGVtcGxhdGVzIGZvciB0aGUgcmF3IGF2aSBoZWFkZXIgcHJvcGVydGllcy4KKworVGhlIGF2aSBkZWNvZGVyIHdpbGwgYWN0IG9uIHRoZSBuZXdfcGFkIHNpZ25hbCBvZiB0aGUgZGVtdXhlciBlbGVtZW50CithbmQgd2lsbCBhdHRhY2ggYW4gYXZpdHlwZSBwbHVnaW4gdG8gdGhlIG5ldyBwYWQuIENhcHMgbmVnb3RpYXRpb24gd2lsbAorY29udmVydCB0aGUgcmF3IGF2aSBjYXBzIHRvIHRoZSBnc3RyZWFtZXIgY2Fwcy4gSWYgdGhlIHNyYyBwYWQgb2YgdGhlCithdml0eXBlcyBwbHVnaW4gYXJlIGNvbXBhdGlibGUgd2l0aCB0aGUgYXZpZGVjb2RlciBwYWR0ZW1wbGF0ZSwgdGhlIAorYXZpdHlwZSBwYWQgaXMgZ2hvc3RlZCB0byB0aGUgYXZpZGVjb2RlciBiaW4sIHRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgbm8KK2NvZGVjIGlzIG5lZWRlZCAoZm9yIHJhdyBQQ00gc2FtcGxlcywgZm9yIGV4YW1wbGUpLgorCitXaGVuIHRoZSBhdml0eXBlcyBjYXBzIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIG9uZSBvZiB0aGUgYXZpZGVjb2RlciAKK3RlbXBsYXRlcywgYSBzdGF0aWMgYXV0b3BsdWdnZXIgaXMgdXNlZCB0aGUgZmluZCBhbiBlbGVtZW50IHRvIGNvbm5lY3QKK3RoZSBkZW11eGVycyBwYWQgdG8gdGhlIGRlY29kZXJzIHBhZHRlbXBsYXRlLgorCitXaGVuIG5vIGVsZW1lbnQgY291bGQgYmUgZm91bmQsIGFuIHdpbmRlYyBwbHVnaW4gaXMgYXR0YWNoZWQgdG8gdGhlIAorZGVtdXhlcnMgcGFkIGFuZCB0aGUgYXZpdHlwZXMgcGx1Z2luIGlzIHJlbW92ZWQgZnJvbSB0aGUgZGVjb2Rlci4KKworCitleGFtcGxlOgorLS0tLS0tLS0KKworIEFuIGF2aWRlY29kZXIgdGhhdCBoYXMgYSB2aWRlbyBwYWQgKGRlY29kZWQgd2l0aCB3aW5kb3dzIGRsbHMpIGFuZCBhbgorIGF1ZGlvIHBhZCAocmF3IFBDTSkuCisKKyAgKC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0pCisgICEgYXZpZGVjb2RlciAgICAgICAgICAgICAgICgtLS0tLS0tLSkgICAgKC0tLS0tLSkgICAgICAgICAgICAgICAgIQorICAhICAgICAgICAgICAgICAgICAgICAgICAgICAhYXZpdHlwZXMhICAgICF3aW5kZWMhICAgICAgIC8tLSAodmlkZW8vcmF3KQorICAhICAgICAoLS0tLS0tLS0tLSkgICAgIC8tc2luayAgICAgIHNyYy0tc2luayAgIHNyYyAtLS0tLSAgICAgICAgICEKKyAgISAgICAgIWRlbXV4ZXIgKHZpZGVvL3gtbXN2aWRlbywgICAgISAgICAhICAgICAgISAgICAgICAgICAgICAgICAhCisgICEgICAgICEgICAgICAgICAgISBhdWRzKS4uICgtLS0tLS0tLSkgICAgKC0tLS0tLSkgICAgICAgICAgICAgICAgISAgCisgICEgICAtc2luayAgICAgICAgISAgICAgICAgICgtLS0tLS0tLSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIQorICAhICAvICAhICAgICAgICAodmlkZW8veC0uLiwhYXZpdHlwZXMhICAgICAgICAgICAgICAgICAgICAgICAgICAgICEKKyAtc2luayAgISAgICAgICAgICAhIHZpZHMpLi4gISAgICAgICAgISAgICAgICAgICAgICAgICAgICAgICAgICAgICAhCisgICEgICAgICgtLS0tLS0tLS0tKSAgICAgXC1zaW5rICAgICAgc3JjIC0tLS0tLS0tLS0tLS0tLS0tLS0tIChhdWRpby9yYXcpCisgICEgICAgICAgICAgICAgICAgICAgICAgICAgICgtLS0tLS0tLSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIQorICAoLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSkKKworCisKK1RPRE8KKy0tLS0KKworYXV0b21hdGljYWxseSBnZW5lcmF0ZSB0aGUgcGFkdGVtcGxhdGVzIGZyb20gYWxsIHBvc3NpYmxlIGF2aSB0eXBlcworZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LgorCisKZGlmZiAtLWdpdCBhL2dzdC9hdmkvYXZpLWlkcy5oIGIvZ3N0L2F2aS9hdmktaWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwOTgwMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdmkvYXZpLWlkcy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0FWSV9IX18KKyNkZWZpbmUgX19HU1RfQVZJX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCit0eXBlZGVmIHN0cnVjdCBfZ3N0X3JpZmZfYXZpaCB7CisgIGd1aW50MzIgdXNfZnJhbWU7ICAgICAgICAgIC8qIG1pY3Jvc2VjIHBlciBmcmFtZSAqLworICBndWludDMyIG1heF9icHM7ICAgICAgICAgICAvKiBieXRlL3Mgb3ZlcmFsbCAqLworICBndWludDMyIHBhZF9ncmFuOyAgICAgICAgICAvKiBwYWRfZ3JhbnVsYXJpdHkgKi8KKyAgZ3VpbnQzMiBmbGFnczsKKy8qIGZsYWdzIHZhbHVlcyAqLworI2RlZmluZSBHU1RfUklGRl9BVklIX0hBU0lOREVYICAgICAgIDB4MDAwMDAwMTAgLyogaGFzIGlkeDEgY2h1bmsgKi8KKyNkZWZpbmUgR1NUX1JJRkZfQVZJSF9NVVNUVVNFSU5ERVggICAweDAwMDAwMDIwIC8qIG11c3QgdXNlIGlkeDEgY2h1bmsgdG8gZGV0ZXJtaW5lIG9yZGVyICovCisjZGVmaW5lIEdTVF9SSUZGX0FWSUhfSVNJTlRFUkxFQVZFRCAgMHgwMDAwMDEwMCAvKiBBVkkgZmlsZSBpcyBpbnRlcmxlYXZlZCAqLworI2RlZmluZSBHU1RfUklGRl9BVklIX1RSVVNUQ0tUWVBFICAgIDB4MDAwMDA4MDAgLyogVXNlIENLVHlwZSB0byBmaW5kIGtleSBmcmFtZXMgKi8KKyNkZWZpbmUgR1NUX1JJRkZfQVZJSF9XQVNDQVBUVVJFRklMRSAweDAwMDEwMDAwIC8qIHNwZWNpYWxseSBhbGxvY2F0ZWQgdXNlZCBmb3IgY2FwdHVyaW5nIHJlYWwgdGltZSB2aWRlbyAqLworI2RlZmluZSBHU1RfUklGRl9BVklIX0NPUFlSSUdIVEVEICAgIDB4MDAwMjAwMDAgLyogY29udGFpbnMgY29weXJpZ2h0ZWQgZGF0YSAqLworICBndWludDMyIHRvdF9mcmFtZXM7ICAgICAgICAvKiAjIG9mIGZyYW1lcyAoYWxsKSAqLworICBndWludDMyIGluaXRfZnJhbWVzOyAgICAgICAvKiBpbml0aWFsIGZyYW1lcyAoPz8/KSAqLworICBndWludDMyIHN0cmVhbXM7CisgIGd1aW50MzIgYnVmc2l6ZTsgICAgICAgICAgIC8qIHN1Z2dlc3RlZCBidWZmZXIgc2l6ZSAqLworICBndWludDMyIHdpZHRoOworICBndWludDMyIGhlaWdodDsKKyAgZ3VpbnQzMiBzY2FsZTsKKyAgZ3VpbnQzMiByYXRlOworICBndWludDMyIHN0YXJ0OworICBndWludDMyIGxlbmd0aDsKK30gZ3N0X3JpZmZfYXZpaDsKKworLyogdnBycCAodmlkZW8gcHJvcGVydGllcykgT0RNTCBoZWFkZXIgKi8KKy8qIHNlZSBPRE1MIHNwZWMgZm9yIHNvbWUvbW9yZSBleHBsYW5hdGlvbiAqLworI2RlZmluZSBHU1RfUklGRl9UQUdfdnBycCBHU1RfTUFLRV9GT1VSQ0MgKCd2JywncCcsJ3InLCdwJykKKyNkZWZpbmUgR1NUX1JJRkZfRFhTQiBHU1RfTUFLRV9GT1VSQ0MgKCdEJywnWCcsJ1MnLCdCJykKKyNkZWZpbmUgR1NUX1JJRkZfVlBSUF9WSURFT19GSUVMRFMgICAgICAgICgyKQorCit0eXBlZGVmIHN0cnVjdCBfZ3N0X3JpZmZfdnBycF92aWRlb19maWVsZF9kZXNjIHsKKyAgZ3VpbnQzMiBjb21wcmVzc2VkX2JtX2hlaWdodDsKKyAgZ3VpbnQzMiBjb21wcmVzc2VkX2JtX3dpZHRoOworICBndWludDMyIHZhbGlkX2JtX2hlaWdodDsKKyAgZ3VpbnQzMiB2YWxpZF9ibV93aWR0aDsKKyAgZ3VpbnQzMiB2YWxpZF9ibV94X29mZnNldDsKKyAgZ3VpbnQzMiB2YWxpZF9ibV95X29mZnNldDsKKyAgZ3VpbnQzMiB2aWRlb194X3Rfb2Zmc2V0OworICBndWludDMyIHZpZGVvX3lfc3RhcnQ7Cit9IGdzdF9yaWZmX3ZwcnBfdmlkZW9fZmllbGRfZGVzYzsKKwordHlwZWRlZiBzdHJ1Y3QgX2dzdF9yaWZmX3ZwcnAgeworICBndWludDMyIGZvcm1hdF90b2tlbjsgICAgICAvKiB3aGV0aGVyIGZpZWxkcyBkZWZpbmVkIGJ5IHN0YW5kYXJkICovCisgIGd1aW50MzIgc3RhbmRhcmQ7ICAgICAgICAgIC8qIHZpZGVvIGRpc3BsYXkgc3RhbmRhcmQsIFVOS05PV04sIFBBTCwgZXRjICovCisgIGd1aW50MzIgdmVydF9yYXRlOyAgICAgICAgIC8qIHZlcnRpY2FsIHJlZnJlc2ggcmF0ZSAqLworICBndWludDMyIGhvcl90X3RvdGFsOyAgICAgICAvKiB3aWR0aCAqLworICBndWludDMyIHZlcnRfbGluZXM7ICAgICAgICAvKiBoZWlnaHQgKi8KKyAgZ3VpbnQzMiBhc3BlY3Q7ICAgICAgICAgICAgLyogYXNwZWN0IHJhdGlvIGhpZ2ggd29yZDpsb3cgd29yZCAqLworICBndWludDMyIHdpZHRoOyAgICAgICAgICAgICAvKiBhY3RpdmUgd2lkdGggKi8KKyAgZ3VpbnQzMiBoZWlnaHQ7ICAgICAgICAgICAgLyogYWN0aXZlIGhlaWdodCAqLworICBndWludDMyIGZpZWxkczsgICAgICAgICAgICAvKiBmaWVsZCBjb3VudCAqLworICBnc3RfcmlmZl92cHJwX3ZpZGVvX2ZpZWxkX2Rlc2MgZmllbGRfaW5mb1tHU1RfUklGRl9WUFJQX1ZJREVPX0ZJRUxEU107Cit9IGdzdF9yaWZmX3ZwcnA7CisKKyNlbmRpZiAvKiBfX0dTVF9BVklfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXZpL2dzdGF2aS5jIGIvZ3N0L2F2aS9nc3RhdmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGNmMGFkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F2aS9nc3RhdmkuYwpAQCAtMCwwICsxLDU4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAdGVtcGxlLWJhcHRpc3QuY29tPgorICoKKyAqIGdzdGF2aS5jOiBwbHVnaW4gcmVnaXN0ZXJpbmcKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3QvZ3N0LWkxOG4tcGx1Z2luLmgiCisKKyNpbmNsdWRlICJnc3RhdmlkZW11eC5oIgorI2luY2x1ZGUgImdzdGF2aW11eC5oIgorI2luY2x1ZGUgImdzdGF2aXN1YnRpdGxlLmgiCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgZ3N0X3JpZmZfaW5pdCAoKTsKKworI2lmZGVmIEVOQUJMRV9OTFMKKyAgYmluZHRleHRkb21haW4gKEdFVFRFWFRfUEFDS0FHRSwgTE9DQUxFRElSKTsKKyAgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKEdFVFRFWFRfUEFDS0FHRSwgIlVURi04Iik7CisjZW5kaWYgLyogRU5BQkxFX05MUyAqLworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImF2aWRlbXV4IiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgICAgICBHU1RfVFlQRV9BVklfREVNVVgpIHx8CisgICAgICAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImF2aW11eCIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICAgICAgR1NUX1RZUEVfQVZJX01VWCkgfHwKKyAgICAgICFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXZpc3VidGl0bGUiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIEdTVF9UWVBFX0FWSV9TVUJUSVRMRSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGF2aSwKKyAgICAiQVZJIHN0cmVhbSBoYW5kbGluZyIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L2F2aS9nc3RhdmlkZW11eC5jIGIvZ3N0L2F2aS9nc3RhdmlkZW11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMmVlODkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXZpL2dzdGF2aWRlbXV4LmMKQEAgLTAsMCArMSw2MDQ0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAdGVtcGxlLWJhcHRpc3QuY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gTm9raWEgQ29ycG9yYXRpb24gKGNvbnRhY3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4pCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5LTIwMTA+IFNURXJpY3Nzb24gPGJlbmphbWluLmdhaWduYXJkQHN0ZXJpY3Nzb24uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKiBFbGVtZW50LUNoZWNrbGlzdC1WZXJzaW9uOiA1ICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWF2aWRlbXV4CisgKgorICogRGVtdXhlcyBhbiAuYXZpIGZpbGUgaW50byByYXcgb3IgY29tcHJlc3NlZCBhdWRpbyBhbmQvb3IgdmlkZW8gc3RyZWFtcy4KKyAqCisgKiBUaGlzIGVsZW1lbnQgc3VwcG9ydHMgYm90aCBwdXNoIGFuZCBwdWxsLWJhc2VkIHNjaGVkdWxpbmcsIGRlcGVuZGluZyBvbiB0aGUKKyAqIGNhcGFiaWxpdGllcyBvZiB0aGUgdXBzdHJlYW0gZWxlbWVudHMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGZpbGVzcmMgbG9jYXRpb249dGVzdC5hdmkgISBhdmlkZW11eCBuYW1lPWRlbXV4ICBkZW11eC5hdWRpb18wMCAhIGRlY29kZWJpbiAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhdXRvYXVkaW9zaW5rICAgZGVtdXgudmlkZW9fMDAgISBxdWV1ZSAhIGRlY29kZWJpbiAhIHZpZGVvY29udmVydCAhIHZpZGVvc2NhbGUgISBhdXRvdmlkZW9zaW5rCisgKiBdfCBQbGF5IChwYXJzZSBhbmQgZGVjb2RlKSBhbiAuYXZpIGZpbGUgYW5kIHRyeSB0byBvdXRwdXQgaXQgdG8KKyAqIGFuIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgc291bmRjYXJkIGFuZCB2aWRlb3NpbmsuIElmIHRoZSBBVkkgZmlsZSBjb250YWlucworICogY29tcHJlc3NlZCBhdWRpbyBvciB2aWRlbyBkYXRhLCB0aGlzIHdpbGwgb25seSB3b3JrIGlmIHlvdSBoYXZlIHRoZQorICogcmlnaHQgZGVjb2RlciBlbGVtZW50cy9wbHVnaW5zIGluc3RhbGxlZC4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImdzdC9yaWZmL3JpZmYtbWVkaWEuaCIKKyNpbmNsdWRlICJnc3RhdmlkZW11eC5oIgorI2luY2x1ZGUgImF2aS1pZHMuaCIKKyNpbmNsdWRlIDxnc3QvZ3N0LWkxOG4tcGx1Z2luLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC90YWcvdGFnLmg+CisKKyNkZWZpbmUgRElWX1JPVU5EX1VQKHMsdikgKCgocykgKyAoKHYpLTEpKSAvICh2KSkKKworI2RlZmluZSBHU1RfQVZJX0tFWUZSQU1FICgxIDw8IDApCisjZGVmaW5lIEVOVFJZX0lTX0tFWUZSQU1FKGUpICgoZSktPmZsYWdzID09IEdTVF9BVklfS0VZRlJBTUUpCisjZGVmaW5lIEVOVFJZX1NFVF9LRVlGUkFNRShlKSAoKGUpLT5mbGFncyA9IEdTVF9BVklfS0VZRlJBTUUpCisjZGVmaW5lIEVOVFJZX1VOU0VUX0tFWUZSQU1FKGUpICgoZSktPmZsYWdzID0gMCkKKworCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChhdmlkZW11eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBhdmlkZW11eF9kZWJ1ZworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbCA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtbXN2aWRlbyIpCisgICAgKTsKKworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzbmFwX3R5cGVzWzJdWzJdID0geworICB7ImFueSIsICJhZnRlciJ9LAorICB7ImJlZm9yZSIsICJuZWFyZXN0In0sCit9OworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGdzdF9hdmlfZGVtdXhfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgdm9pZCBnc3RfYXZpX2RlbXV4X3Jlc2V0IChHc3RBdmlEZW11eCAqIGF2aSk7CisKKyNpZiAwCitzdGF0aWMgY29uc3QgR3N0RXZlbnRNYXNrICpnc3RfYXZpX2RlbXV4X2dldF9ldmVudF9tYXNrIChHc3RQYWQgKiBwYWQpOworI2VuZGlmCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXZpX2RlbXV4X2hhbmRsZV9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXZpX2RlbXV4X3B1c2hfZXZlbnQgKEdzdEF2aURlbXV4ICogYXZpLCBHc3RFdmVudCAqIGV2ZW50KTsKKworI2lmIDAKK3N0YXRpYyBjb25zdCBHc3RGb3JtYXQgKmdzdF9hdmlfZGVtdXhfZ2V0X3NyY19mb3JtYXRzIChHc3RQYWQgKiBwYWQpOworI2VuZGlmCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RRdWVyeSAqIHF1ZXJ5KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXZpX2RlbXV4X3NyY19jb252ZXJ0IChHc3RQYWQgKiBwYWQsIEdzdEZvcm1hdCBzcmNfZm9ybWF0LAorICAgIGdpbnQ2NCBzcmNfdmFsdWUsIEdzdEZvcm1hdCAqIGRlc3RfZm9ybWF0LCBnaW50NjQgKiBkZXN0X3ZhbHVlKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hdmlfZGVtdXhfZG9fc2VlayAoR3N0QXZpRGVtdXggKiBhdmksIEdzdFNlZ21lbnQgKiBzZWdtZW50LAorICAgIEdzdFNlZWtGbGFncyBmbGFncyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F2aV9kZW11eF9oYW5kbGVfc2VlayAoR3N0QXZpRGVtdXggKiBhdmksIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXZpX2RlbXV4X2hhbmRsZV9zZWVrX3B1c2ggKEdzdEF2aURlbXV4ICogYXZpLCBHc3RQYWQgKiBwYWQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgdm9pZCBnc3RfYXZpX2RlbXV4X2xvb3AgKEdzdFBhZCAqIHBhZCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F2aV9kZW11eF9zaW5rX2FjdGl2YXRlIChHc3RQYWQgKiBzaW5rcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F2aV9kZW11eF9zaW5rX2FjdGl2YXRlX21vZGUgKEdzdFBhZCAqIHNpbmtwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RQYWRNb2RlIG1vZGUsIGdib29sZWFuIGFjdGl2ZSk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfYXZpX2RlbXV4X2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWYpOworI2lmIDAKK3N0YXRpYyB2b2lkIGdzdF9hdmlfZGVtdXhfc2V0X2luZGV4IChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0SW5kZXggKiBpbmRleCk7CitzdGF0aWMgR3N0SW5kZXggKmdzdF9hdmlfZGVtdXhfZ2V0X2luZGV4IChHc3RFbGVtZW50ICogZWxlbWVudCk7CisjZW5kaWYKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfYXZpX2RlbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CitzdGF0aWMgdm9pZCBnc3RfYXZpX2RlbXV4X2NhbGN1bGF0ZV9kdXJhdGlvbnNfZnJvbV9pbmRleCAoR3N0QXZpRGVtdXggKiBhdmkpOworc3RhdGljIHZvaWQgZ3N0X2F2aV9kZW11eF9nZXRfYnVmZmVyX2luZm8gKEdzdEF2aURlbXV4ICogYXZpLAorICAgIEdzdEF2aVN0cmVhbSAqIHN0cmVhbSwgZ3VpbnQgZW50cnlfbiwgR3N0Q2xvY2tUaW1lICogdGltZXN0YW1wLAorICAgIEdzdENsb2NrVGltZSAqIHRzX2VuZCwgZ3VpbnQ2NCAqIG9mZnNldCwgZ3VpbnQ2NCAqIG9mZnNldF9lbmQpOworCitzdGF0aWMgdm9pZCBnc3RfYXZpX2RlbXV4X3BhcnNlX2lkaXQgKEdzdEF2aURlbXV4ICogYXZpLCBHc3RCdWZmZXIgKiBidWYpOworc3RhdGljIHZvaWQgZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJkIChHc3RBdmlEZW11eCAqIGF2aSwgR3N0QnVmZmVyICogYnVmKTsKKworc3RhdGljIHZvaWQgcGFyc2VfdGFnX3ZhbHVlIChHc3RBdmlEZW11eCAqIGF2aSwgR3N0VGFnTGlzdCAqIHRhZ2xpc3QsCisgICAgY29uc3QgZ2NoYXIgKiB0eXBlLCBndWludDggKiBwdHIsIGd1aW50IHRzaXplKTsKKworLyogR09iamVjdCBtZXRob2RzICovCisKKyNkZWZpbmUgZ3N0X2F2aV9kZW11eF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RBdmlEZW11eCwgZ3N0X2F2aV9kZW11eCwgR1NUX1RZUEVfRUxFTUVOVCk7CisKK3N0YXRpYyB2b2lkCitnc3RfYXZpX2RlbXV4X2NsYXNzX2luaXQgKEdzdEF2aURlbXV4Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0UGFkVGVtcGxhdGUgKnZpZGVvc3JjdGVtcGwsICphdWRpb3NyY3RlbXBsLCAqc3Vic3JjdGVtcGwsICpzdWJwaWNzcmN0ZW1wbDsKKyAgR3N0Q2FwcyAqYXVkY2FwcywgKnZpZGNhcHMsICpzdWJjYXBzLCAqc3VicGljY2FwczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoYXZpZGVtdXhfZGVidWcsICJhdmlkZW11eCIsCisgICAgICAwLCAiRGVtdXhlciBmb3IgQVZJIHN0cmVhbXMiKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9hdmlfZGVtdXhfZmluYWxpemU7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXZpX2RlbXV4X2NoYW5nZV9zdGF0ZSk7CisjaWYgMAorICBnc3RlbGVtZW50X2NsYXNzLT5zZXRfaW5kZXggPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F2aV9kZW11eF9zZXRfaW5kZXgpOworICBnc3RlbGVtZW50X2NsYXNzLT5nZXRfaW5kZXggPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F2aV9kZW11eF9nZXRfaW5kZXgpOworI2VuZGlmCisKKyAgYXVkY2FwcyA9IGdzdF9yaWZmX2NyZWF0ZV9hdWRpb190ZW1wbGF0ZV9jYXBzICgpOworICBnc3RfY2Fwc19hcHBlbmQgKGF1ZGNhcHMsIGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby94LWF2aS11bmtub3duIikpOworICBhdWRpb3NyY3RlbXBsID0gZ3N0X3BhZF90ZW1wbGF0ZV9uZXcgKCJhdWRpb18ldSIsCisgICAgICBHU1RfUEFEX1NSQywgR1NUX1BBRF9TT01FVElNRVMsIGF1ZGNhcHMpOworCisgIHZpZGNhcHMgPSBnc3RfcmlmZl9jcmVhdGVfdmlkZW9fdGVtcGxhdGVfY2FwcyAoKTsKKyAgZ3N0X2NhcHNfYXBwZW5kICh2aWRjYXBzLCBnc3RfcmlmZl9jcmVhdGVfaWF2c190ZW1wbGF0ZV9jYXBzICgpKTsKKyAgZ3N0X2NhcHNfYXBwZW5kICh2aWRjYXBzLCBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgidmlkZW8veC1hdmktdW5rbm93biIpKTsKKyAgdmlkZW9zcmN0ZW1wbCA9IGdzdF9wYWRfdGVtcGxhdGVfbmV3ICgidmlkZW9fJXUiLAorICAgICAgR1NUX1BBRF9TUkMsIEdTVF9QQURfU09NRVRJTUVTLCB2aWRjYXBzKTsKKworICBzdWJjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtc3VidGl0bGUtYXZpIik7CisgIHN1YnNyY3RlbXBsID0gZ3N0X3BhZF90ZW1wbGF0ZV9uZXcgKCJzdWJ0aXRsZV8ldSIsCisgICAgICBHU1RfUEFEX1NSQywgR1NUX1BBRF9TT01FVElNRVMsIHN1YmNhcHMpOworICBzdWJwaWNjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInN1YnBpY3R1cmUveC14c3ViIik7CisgIHN1YnBpY3NyY3RlbXBsID0gZ3N0X3BhZF90ZW1wbGF0ZV9uZXcgKCJzdWJwaWN0dXJlXyV1IiwKKyAgICAgIEdTVF9QQURfU1JDLCBHU1RfUEFEX1NPTUVUSU1FUywgc3VicGljY2Fwcyk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsIGF1ZGlvc3JjdGVtcGwpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCB2aWRlb3NyY3RlbXBsKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgc3Vic3JjdGVtcGwpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCBzdWJwaWNzcmN0ZW1wbCk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbCk7CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGF1ZGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAodmlkY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzdWJjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHN1YnBpY2NhcHMpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJBdmkgZGVtdXhlciIsCisgICAgICAiQ29kZWMvRGVtdXhlciIsCisgICAgICAiRGVtdWx0aXBsZXggYW4gYXZpIGZpbGUgaW50byBhdWRpbyBhbmQgdmlkZW8iLAorICAgICAgIkVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+LCAiCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNoZWxsby5iZT4sICIKKyAgICAgICJUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9pbml0IChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgYXZpLT5zaW5rcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzaW5rX3RlbXBsLCAic2luayIpOworICBnc3RfcGFkX3NldF9hY3RpdmF0ZV9mdW5jdGlvbiAoYXZpLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdmlfZGVtdXhfc2lua19hY3RpdmF0ZSkpOworICBnc3RfcGFkX3NldF9hY3RpdmF0ZW1vZGVfZnVuY3Rpb24gKGF2aS0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXZpX2RlbXV4X3NpbmtfYWN0aXZhdGVfbW9kZSkpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoYXZpLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdmlfZGVtdXhfY2hhaW4pKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKGF2aS0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zaW5rX2V2ZW50KSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKGF2aSksIGF2aS0+c2lua3BhZCk7CisKKyAgYXZpLT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworICBhdmktPmZsb3djb21iaW5lciA9IGdzdF9mbG93X2NvbWJpbmVyX25ldyAoKTsKKworICBnc3RfYXZpX2RlbXV4X3Jlc2V0IChhdmkpOworCisgIEdTVF9PQkpFQ1RfRkxBR19TRVQgKGF2aSwgR1NUX0VMRU1FTlRfRkxBR19JTkRFWEFCTEUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0QXZpRGVtdXggKmF2aSA9IEdTVF9BVklfREVNVVggKG9iamVjdCk7CisKKyAgR1NUX0RFQlVHICgiQVZJOiBmaW5hbGl6ZSIpOworCisgIGdfb2JqZWN0X3VucmVmIChhdmktPmFkYXB0ZXIpOworICBnc3RfZmxvd19jb21iaW5lcl9mcmVlIChhdmktPmZsb3djb21iaW5lcik7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9yZXNldF9zdHJlYW0gKEdzdEF2aURlbXV4ICogYXZpLCBHc3RBdmlTdHJlYW0gKiBzdHJlYW0pCit7CisgIGdfZnJlZSAoc3RyZWFtLT5zdHJoKTsKKyAgZ19mcmVlIChzdHJlYW0tPnN0cmYuZGF0YSk7CisgIGdfZnJlZSAoc3RyZWFtLT5uYW1lKTsKKyAgZ19mcmVlIChzdHJlYW0tPmluZGV4KTsKKyAgZ19mcmVlIChzdHJlYW0tPmluZGV4ZXMpOworICBpZiAoc3RyZWFtLT5pbml0ZGF0YSkKKyAgICBnc3RfYnVmZmVyX3VucmVmIChzdHJlYW0tPmluaXRkYXRhKTsKKyAgaWYgKHN0cmVhbS0+ZXh0cmFkYXRhKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKHN0cmVhbS0+ZXh0cmFkYXRhKTsKKyAgaWYgKHN0cmVhbS0+cmdiOF9wYWxldHRlKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKHN0cmVhbS0+cmdiOF9wYWxldHRlKTsKKyAgaWYgKHN0cmVhbS0+cGFkKSB7CisgICAgaWYgKHN0cmVhbS0+ZXhwb3NlZCkgeworICAgICAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzdHJlYW0tPnBhZCwgRkFMU0UpOworICAgICAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAoYXZpKSwgc3RyZWFtLT5wYWQpOworICAgICAgZ3N0X2Zsb3dfY29tYmluZXJfcmVtb3ZlX3BhZCAoYXZpLT5mbG93Y29tYmluZXIsIHN0cmVhbS0+cGFkKTsKKyAgICB9IGVsc2UKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHN0cmVhbS0+cGFkKTsKKyAgfQorICBpZiAoc3RyZWFtLT50YWdsaXN0KSB7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmIChzdHJlYW0tPnRhZ2xpc3QpOworICAgIHN0cmVhbS0+dGFnbGlzdCA9IE5VTEw7CisgIH0KKyAgbWVtc2V0IChzdHJlYW0sIDAsIHNpemVvZiAoR3N0QXZpU3RyZWFtKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXZpX2RlbXV4X3Jlc2V0IChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgZ2ludCBpOworCisgIEdTVF9ERUJVRyAoIkFWSTogcmVzZXQiKTsKKworICBmb3IgKGkgPSAwOyBpIDwgYXZpLT5udW1fc3RyZWFtczsgaSsrKQorICAgIGdzdF9hdmlfZGVtdXhfcmVzZXRfc3RyZWFtIChhdmksICZhdmktPnN0cmVhbVtpXSk7CisKKyAgYXZpLT5oZWFkZXJfc3RhdGUgPSBHU1RfQVZJX0RFTVVYX0hFQURFUl9UQUdfTElTVDsKKyAgYXZpLT5udW1fc3RyZWFtcyA9IDA7CisgIGF2aS0+bnVtX3Zfc3RyZWFtcyA9IDA7CisgIGF2aS0+bnVtX2Ffc3RyZWFtcyA9IDA7CisgIGF2aS0+bnVtX3Rfc3RyZWFtcyA9IDA7CisgIGF2aS0+bnVtX3NwX3N0cmVhbXMgPSAwOworICBhdmktPm1haW5fc3RyZWFtID0gLTE7CisKKyAgYXZpLT5oYXZlX2dyb3VwX2lkID0gRkFMU0U7CisgIGF2aS0+Z3JvdXBfaWQgPSBHX01BWFVJTlQ7CisKKyAgYXZpLT5zdGF0ZSA9IEdTVF9BVklfREVNVVhfU1RBUlQ7CisgIGF2aS0+b2Zmc2V0ID0gMDsKKyAgYXZpLT5idWlsZGluZ19pbmRleCA9IEZBTFNFOworCisgIGF2aS0+aW5kZXhfb2Zmc2V0ID0gMDsKKyAgZ19mcmVlIChhdmktPmF2aWgpOworICBhdmktPmF2aWggPSBOVUxMOworCisjaWYgMAorICBpZiAoYXZpLT5lbGVtZW50X2luZGV4KQorICAgIGdzdF9vYmplY3RfdW5yZWYgKGF2aS0+ZWxlbWVudF9pbmRleCk7CisgIGF2aS0+ZWxlbWVudF9pbmRleCA9IE5VTEw7CisjZW5kaWYKKworICBpZiAoYXZpLT5zZWdfZXZlbnQpIHsKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGF2aS0+c2VnX2V2ZW50KTsKKyAgICBhdmktPnNlZ19ldmVudCA9IE5VTEw7CisgIH0KKyAgaWYgKGF2aS0+c2Vla19ldmVudCkgeworICAgIGdzdF9ldmVudF91bnJlZiAoYXZpLT5zZWVrX2V2ZW50KTsKKyAgICBhdmktPnNlZWtfZXZlbnQgPSBOVUxMOworICB9CisKKyAgaWYgKGF2aS0+Z2xvYmFsdGFncykKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKGF2aS0+Z2xvYmFsdGFncyk7CisgIGF2aS0+Z2xvYmFsdGFncyA9IE5VTEw7CisKKyAgYXZpLT5nb3RfdGFncyA9IFRSVUU7ICAgICAgICAgLyogd2UgYWx3YXlzIHdhbnQgdG8gcHVzaCBnbG9iYWwgdGFncyAqLworICBhdmktPmhhdmVfZW9zID0gRkFMU0U7CisgIGF2aS0+c2Vla2FibGUgPSBUUlVFOworCisgIGdzdF9hZGFwdGVyX2NsZWFyIChhdmktPmFkYXB0ZXIpOworCisgIGdzdF9zZWdtZW50X2luaXQgKCZhdmktPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGF2aS0+c2VnbWVudF9zZXFudW0gPSAwOworfQorCisKKy8qIEdzdEVsZW1lbnQgbWV0aG9kcyAqLworCisjaWYgMAorc3RhdGljIGNvbnN0IEdzdEZvcm1hdCAqCitnc3RfYXZpX2RlbXV4X2dldF9zcmNfZm9ybWF0cyAoR3N0UGFkICogcGFkKQoreworICBHc3RBdmlTdHJlYW0gKnN0cmVhbSA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKworICBzdGF0aWMgY29uc3QgR3N0Rm9ybWF0IHNyY19hX2Zvcm1hdHNbXSA9IHsKKyAgICBHU1RfRk9STUFUX1RJTUUsCisgICAgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICBHU1RfRk9STUFUX0RFRkFVTFQsCisgICAgMAorICB9OworICBzdGF0aWMgY29uc3QgR3N0Rm9ybWF0IHNyY192X2Zvcm1hdHNbXSA9IHsKKyAgICBHU1RfRk9STUFUX1RJTUUsCisgICAgR1NUX0ZPUk1BVF9ERUZBVUxULAorICAgIDAKKyAgfTsKKworICByZXR1cm4gKHN0cmVhbS0+c3RyaC0+dHlwZSA9PSBHU1RfUklGRl9GQ0NfYXVkcyA/CisgICAgICBzcmNfYV9mb3JtYXRzIDogc3JjX3ZfZm9ybWF0cyk7Cit9CisjZW5kaWYKKworLyogYXNzdW1lcyBzdHJlYW0tPnN0cmYuYXVkcy0+YXZfYnBzICE9IDAgKi8KK3N0YXRpYyBpbmxpbmUgR3N0Q2xvY2tUaW1lCithdmlfc3RyZWFtX2NvbnZlcnRfYnl0ZXNfdG9fdGltZV91bmNoZWNrZWQgKEdzdEF2aVN0cmVhbSAqIHN0cmVhbSwKKyAgICBndWludDY0IGJ5dGVzKQoreworICByZXR1cm4gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoYnl0ZXMsIEdTVF9TRUNPTkQsCisgICAgICBzdHJlYW0tPnN0cmYuYXVkcy0+YXZfYnBzKTsKK30KKworc3RhdGljIGlubGluZSBndWludDY0Cithdmlfc3RyZWFtX2NvbnZlcnRfdGltZV90b19ieXRlc191bmNoZWNrZWQgKEdzdEF2aVN0cmVhbSAqIHN0cmVhbSwKKyAgICBHc3RDbG9ja1RpbWUgdGltZSkKK3sKKyAgcmV0dXJuIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHRpbWUsIHN0cmVhbS0+c3RyZi5hdWRzLT5hdl9icHMsCisgICAgICBHU1RfU0VDT05EKTsKK30KKworLyogYXNzdW1lcyBzdHJlYW0tPnN0cmgtPnJhdGUgIT0gMCAqLworc3RhdGljIGlubGluZSBHc3RDbG9ja1RpbWUKK2F2aV9zdHJlYW1fY29udmVydF9mcmFtZXNfdG9fdGltZV91bmNoZWNrZWQgKEdzdEF2aVN0cmVhbSAqIHN0cmVhbSwKKyAgICBndWludDY0IGZyYW1lcykKK3sKKyAgcmV0dXJuIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoZnJhbWVzLCBzdHJlYW0tPnN0cmgtPnNjYWxlICogR1NUX1NFQ09ORCwKKyAgICAgIHN0cmVhbS0+c3RyaC0+cmF0ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ3VpbnQ2NAorYXZpX3N0cmVhbV9jb252ZXJ0X3RpbWVfdG9fZnJhbWVzX3VuY2hlY2tlZCAoR3N0QXZpU3RyZWFtICogc3RyZWFtLAorICAgIEdzdENsb2NrVGltZSB0aW1lKQoreworICByZXR1cm4gZ3N0X3V0aWxfdWludDY0X3NjYWxlICh0aW1lLCBzdHJlYW0tPnN0cmgtPnJhdGUsCisgICAgICBzdHJlYW0tPnN0cmgtPnNjYWxlICogR1NUX1NFQ09ORCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F2aV9kZW11eF9zcmNfY29udmVydCAoR3N0UGFkICogcGFkLAorICAgIEdzdEZvcm1hdCBzcmNfZm9ybWF0LAorICAgIGdpbnQ2NCBzcmNfdmFsdWUsIEdzdEZvcm1hdCAqIGRlc3RfZm9ybWF0LCBnaW50NjQgKiBkZXN0X3ZhbHVlKQoreworICBHc3RBdmlTdHJlYW0gKnN0cmVhbSA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgZ2Jvb2xlYW4gcmVzID0gVFJVRTsKKworICBHU1RfTE9HX09CSkVDVCAocGFkLAorICAgICAgIlJlY2VpdmVkICBzcmNfZm9ybWF0OiVzLCBzcmNfdmFsdWU6JSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgIiwgZGVzdF9mb3JtYXQ6JXMiLCBnc3RfZm9ybWF0X2dldF9uYW1lIChzcmNfZm9ybWF0KSwgc3JjX3ZhbHVlLAorICAgICAgZ3N0X2Zvcm1hdF9nZXRfbmFtZSAoKmRlc3RfZm9ybWF0KSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHNyY19mb3JtYXQgPT0gKmRlc3RfZm9ybWF0KSkgeworICAgICpkZXN0X3ZhbHVlID0gc3JjX3ZhbHVlOworICAgIGdvdG8gZG9uZTsKKyAgfQorICBpZiAoR19VTkxJS0VMWSAoIXN0cmVhbS0+c3RyaCB8fCAhc3RyZWFtLT5zdHJmLmRhdGEpKSB7CisgICAgcmVzID0gRkFMU0U7CisgICAgZ290byBkb25lOworICB9CisgIGlmIChHX1VOTElLRUxZIChzdHJlYW0tPnN0cmgtPnR5cGUgPT0gR1NUX1JJRkZfRkNDX3ZpZHMgJiYKKyAgICAgICAgICAoc3JjX2Zvcm1hdCA9PSBHU1RfRk9STUFUX0JZVEVTCisgICAgICAgICAgICAgIHx8ICpkZXN0X2Zvcm1hdCA9PSBHU1RfRk9STUFUX0JZVEVTKSkpIHsKKyAgICByZXMgPSBGQUxTRTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBzd2l0Y2ggKHNyY19mb3JtYXQpIHsKKyAgICBjYXNlIEdTVF9GT1JNQVRfVElNRToKKyAgICAgIHN3aXRjaCAoKmRlc3RfZm9ybWF0KSB7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9CWVRFUzoKKyAgICAgICAgICAqZGVzdF92YWx1ZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHNyY192YWx1ZSwKKyAgICAgICAgICAgICAgc3RyZWFtLT5zdHJmLmF1ZHMtPmF2X2JwcywgR1NUX1NFQ09ORCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICAgICpkZXN0X3ZhbHVlID0KKyAgICAgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX3JvdW5kIChzcmNfdmFsdWUsIHN0cmVhbS0+c3RyaC0+cmF0ZSwKKyAgICAgICAgICAgICAgc3RyZWFtLT5zdHJoLT5zY2FsZSAqIEdTVF9TRUNPTkQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRk9STUFUX0JZVEVTOgorICAgICAgc3dpdGNoICgqZGVzdF9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6CisgICAgICAgICAgaWYgKHN0cmVhbS0+c3RyZi5hdWRzLT5hdl9icHMgIT0gMCkgeworICAgICAgICAgICAgKmRlc3RfdmFsdWUgPSBhdmlfc3RyZWFtX2NvbnZlcnRfYnl0ZXNfdG9fdGltZV91bmNoZWNrZWQgKHN0cmVhbSwKKyAgICAgICAgICAgICAgICBzcmNfdmFsdWUpOworICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9GT1JNQVRfREVGQVVMVDoKKyAgICAgIHN3aXRjaCAoKmRlc3RfZm9ybWF0KSB7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9USU1FOgorICAgICAgICAgICpkZXN0X3ZhbHVlID0KKyAgICAgICAgICAgICAgYXZpX3N0cmVhbV9jb252ZXJ0X2ZyYW1lc190b190aW1lX3VuY2hlY2tlZCAoc3RyZWFtLCBzcmNfdmFsdWUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IEZBTFNFOworICB9CisKK2RvbmU6CisgIEdTVF9MT0dfT0JKRUNUIChwYWQsCisgICAgICAiUmV0dXJuaW5nIHJlczolZCBkZXN0X2Zvcm1hdDolcyBkZXN0X3ZhbHVlOiUiIEdfR1VJTlQ2NF9GT1JNQVQsIHJlcywKKyAgICAgIGdzdF9mb3JtYXRfZ2V0X25hbWUgKCpkZXN0X2Zvcm1hdCksICpkZXN0X3ZhbHVlKTsKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisgIEdzdEF2aURlbXV4ICphdmkgPSBHU1RfQVZJX0RFTVVYIChwYXJlbnQpOworCisgIEdzdEF2aVN0cmVhbSAqc3RyZWFtID0gZ3N0X3BhZF9nZXRfZWxlbWVudF9wcml2YXRlIChwYWQpOworCisgIGlmICghc3RyZWFtLT5zdHJoIHx8ICFzdHJlYW0tPnN0cmYuZGF0YSkKKyAgICByZXR1cm4gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX1BPU0lUSU9OOnsKKyAgICAgIGdpbnQ2NCBwb3MgPSAwOworCisgICAgICBHU1RfREVCVUcgKCJwb3MgcXVlcnkgZm9yIHN0cmVhbSAldTogZnJhbWVzICV1LCBieXRlcyAldSIsCisgICAgICAgICAgc3RyZWFtLT5udW0sIHN0cmVhbS0+Y3VycmVudF9lbnRyeSwgc3RyZWFtLT5jdXJyZW50X3RvdGFsKTsKKworICAgICAgLyogRklYTUUsIHRoaXMgbG9va3MgY2x1bXN5ICovCisgICAgICBpZiAoc3RyZWFtLT5zdHJoLT50eXBlID09IEdTVF9SSUZGX0ZDQ19hdWRzKSB7CisgICAgICAgIGlmIChzdHJlYW0tPmlzX3ZicikgeworICAgICAgICAgIC8qIFZCUiAqLworICAgICAgICAgIHBvcyA9IGF2aV9zdHJlYW1fY29udmVydF9mcmFtZXNfdG9fdGltZV91bmNoZWNrZWQgKHN0cmVhbSwKKyAgICAgICAgICAgICAgc3RyZWFtLT5jdXJyZW50X2VudHJ5KTsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJWQlIgY29udmVydCBmcmFtZSAldSwgdGltZSAlIgorICAgICAgICAgICAgICBHU1RfVElNRV9GT1JNQVQsIHN0cmVhbS0+Y3VycmVudF9lbnRyeSwgR1NUX1RJTUVfQVJHUyAocG9zKSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLT5zdHJmLmF1ZHMtPmF2X2JwcyAhPSAwKSB7CisgICAgICAgICAgLyogQ0JSICovCisgICAgICAgICAgcG9zID0gYXZpX3N0cmVhbV9jb252ZXJ0X2J5dGVzX3RvX3RpbWVfdW5jaGVja2VkIChzdHJlYW0sCisgICAgICAgICAgICAgIHN0cmVhbS0+Y3VycmVudF90b3RhbCk7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLAorICAgICAgICAgICAgICAiQ0JSIGNvbnZlcnQgYnl0ZXMgJXUsIHRpbWUgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgICBzdHJlYW0tPmN1cnJlbnRfdG90YWwsIEdTVF9USU1FX0FSR1MgKHBvcykpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS0+aWR4X24gIT0gMCAmJiBzdHJlYW0tPnRvdGFsX2J5dGVzICE9IDApIHsKKyAgICAgICAgICAvKiBjYWxjdWxhdGUgdGltZXN0YW1wcyBiYXNlZCBvbiBwZXJjZW50YWdlIG9mIGxlbmd0aCAqLworICAgICAgICAgIGd1aW50NjQgeGxlbiA9IGF2aS0+YXZpaC0+dXNfZnJhbWUgKgorICAgICAgICAgICAgICBhdmktPmF2aWgtPnRvdF9mcmFtZXMgKiBHU1RfVVNFQ09ORDsKKworICAgICAgICAgIHBvcyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoeGxlbiwgc3RyZWFtLT5jdXJyZW50X3RvdGFsLAorICAgICAgICAgICAgICBzdHJlYW0tPnRvdGFsX2J5dGVzKTsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksCisgICAgICAgICAgICAgICJDQlIgcGVyYyBjb252ZXJ0IGJ5dGVzICV1LCB0aW1lICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgICAgc3RyZWFtLT5jdXJyZW50X3RvdGFsLCBHU1RfVElNRV9BUkdTIChwb3MpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiB3ZSBkb24ndCBrbm93ICovCisgICAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzdHJlYW0tPnN0cmgtPnJhdGUgIT0gMCkgeworICAgICAgICAgIHBvcyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoKGd1aW50NjQpIHN0cmVhbS0+Y3VycmVudF9lbnRyeSAqCisgICAgICAgICAgICAgIHN0cmVhbS0+c3RyaC0+c2NhbGUsIEdTVF9TRUNPTkQsIChndWludDY0KSBzdHJlYW0tPnN0cmgtPnJhdGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBvcyA9IHN0cmVhbS0+Y3VycmVudF9lbnRyeSAqIGF2aS0+YXZpaC0+dXNfZnJhbWUgKiBHU1RfVVNFQ09ORDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHJlcykgeworICAgICAgICBHU1RfREVCVUcgKCJwb3MgcXVlcnkgOiAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHBvcykpOworICAgICAgICBnc3RfcXVlcnlfc2V0X3Bvc2l0aW9uIChxdWVyeSwgR1NUX0ZPUk1BVF9USU1FLCBwb3MpOworICAgICAgfSBlbHNlCisgICAgICAgIEdTVF9XQVJOSU5HICgicG9zIHF1ZXJ5IGZhaWxlZCIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX0RVUkFUSU9OOgorICAgIHsKKyAgICAgIEdzdEZvcm1hdCBmbXQ7CisgICAgICBHc3RDbG9ja1RpbWUgZHVyYXRpb247CisKKyAgICAgIC8qIG9ubHkgYWN0IG9uIGF1ZGlvIG9yIHZpZGVvIHN0cmVhbXMgKi8KKyAgICAgIGlmIChzdHJlYW0tPnN0cmgtPnR5cGUgIT0gR1NUX1JJRkZfRkNDX2F1ZHMgJiYKKyAgICAgICAgICBzdHJlYW0tPnN0cmgtPnR5cGUgIT0gR1NUX1JJRkZfRkNDX3ZpZHMgJiYKKyAgICAgICAgICBzdHJlYW0tPnN0cmgtPnR5cGUgIT0gR1NUX1JJRkZfRkNDX2lhdnMpIHsKKyAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvKiB0YWtlIHN0cmVhbSBkdXJhdGlvbiwgZmFsbCBiYWNrIHRvIGF2aWggZHVyYXRpb24gKi8KKyAgICAgIGlmICgoZHVyYXRpb24gPSBzdHJlYW0tPmR1cmF0aW9uKSA9PSAtMSkKKyAgICAgICAgaWYgKChkdXJhdGlvbiA9IHN0cmVhbS0+aGRyX2R1cmF0aW9uKSA9PSAtMSkKKyAgICAgICAgICBkdXJhdGlvbiA9IGF2aS0+ZHVyYXRpb247CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9kdXJhdGlvbiAocXVlcnksICZmbXQsIE5VTEwpOworCisgICAgICBzd2l0Y2ggKGZtdCkgeworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfVElNRToKKyAgICAgICAgICBnc3RfcXVlcnlfc2V0X2R1cmF0aW9uIChxdWVyeSwgZm10LCBkdXJhdGlvbik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICB7CisgICAgICAgICAgZ2ludDY0IGR1cjsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdWVyeSwgInRvdGFsIGZyYW1lcyBpcyAlIiBHX0dVSU5UMzJfRk9STUFULAorICAgICAgICAgICAgICBzdHJlYW0tPmlkeF9uKTsKKworICAgICAgICAgIGlmIChzdHJlYW0tPmlkeF9uID4gMCkKKyAgICAgICAgICAgIGdzdF9xdWVyeV9zZXRfZHVyYXRpb24gKHF1ZXJ5LCBmbXQsIHN0cmVhbS0+aWR4X24pOworICAgICAgICAgIGVsc2UgaWYgKGdzdF9wYWRfcXVlcnlfY29udmVydCAocGFkLCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwgZm10LCAmZHVyKSkKKyAgICAgICAgICAgIGdzdF9xdWVyeV9zZXRfZHVyYXRpb24gKHF1ZXJ5LCBmbXQsIGR1cik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9TRUVLSU5HOnsKKyAgICAgIEdzdEZvcm1hdCBmbXQ7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9zZWVraW5nIChxdWVyeSwgJmZtdCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICBpZiAoZm10ID09IEdTVF9GT1JNQVRfVElNRSkgeworICAgICAgICBnYm9vbGVhbiBzZWVrYWJsZSA9IFRSVUU7CisKKyAgICAgICAgaWYgKGF2aS0+c3RyZWFtaW5nKSB7CisgICAgICAgICAgc2Vla2FibGUgPSBhdmktPnNlZWthYmxlOworICAgICAgICB9CisKKyAgICAgICAgZ3N0X3F1ZXJ5X3NldF9zZWVraW5nIChxdWVyeSwgR1NUX0ZPUk1BVF9USU1FLCBzZWVrYWJsZSwKKyAgICAgICAgICAgIDAsIHN0cmVhbS0+ZHVyYXRpb24pOworICAgICAgICByZXMgPSBUUlVFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX0NPTlZFUlQ6eworICAgICAgR3N0Rm9ybWF0IHNyY19mbXQsIGRlc3RfZm10OworICAgICAgZ2ludDY0IHNyY192YWwsIGRlc3RfdmFsOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY29udmVydCAocXVlcnksICZzcmNfZm10LCAmc3JjX3ZhbCwgJmRlc3RfZm10LCAmZGVzdF92YWwpOworICAgICAgaWYgKChyZXMgPSBnc3RfYXZpX2RlbXV4X3NyY19jb252ZXJ0IChwYWQsIHNyY19mbXQsIHNyY192YWwsICZkZXN0X2ZtdCwKKyAgICAgICAgICAgICAgICAgICZkZXN0X3ZhbCkpKQorICAgICAgICBnc3RfcXVlcnlfc2V0X2NvbnZlcnQgKHF1ZXJ5LCBzcmNfZm10LCBzcmNfdmFsLCBkZXN0X2ZtdCwgZGVzdF92YWwpOworICAgICAgZWxzZQorICAgICAgICByZXMgPSBnc3RfcGFkX3F1ZXJ5X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfU0VHTUVOVDoKKyAgICB7CisgICAgICBHc3RGb3JtYXQgZm9ybWF0OworICAgICAgZ2ludDY0IHN0YXJ0LCBzdG9wOworCisgICAgICBmb3JtYXQgPSBhdmktPnNlZ21lbnQuZm9ybWF0OworCisgICAgICBzdGFydCA9CisgICAgICAgICAgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZhdmktPnNlZ21lbnQsIGZvcm1hdCwKKyAgICAgICAgICBhdmktPnNlZ21lbnQuc3RhcnQpOworICAgICAgaWYgKChzdG9wID0gYXZpLT5zZWdtZW50LnN0b3ApID09IC0xKQorICAgICAgICBzdG9wID0gYXZpLT5zZWdtZW50LmR1cmF0aW9uOworICAgICAgZWxzZQorICAgICAgICBzdG9wID0gZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZhdmktPnNlZ21lbnQsIGZvcm1hdCwgc3RvcCk7CisKKyAgICAgIGdzdF9xdWVyeV9zZXRfc2VnbWVudCAocXVlcnksIGF2aS0+c2VnbWVudC5yYXRlLCBmb3JtYXQsIHN0YXJ0LCBzdG9wKTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworI2lmIDAKK3N0YXRpYyBjb25zdCBHc3RFdmVudE1hc2sgKgorZ3N0X2F2aV9kZW11eF9nZXRfZXZlbnRfbWFzayAoR3N0UGFkICogcGFkKQoreworICBzdGF0aWMgY29uc3QgR3N0RXZlbnRNYXNrIG1hc2tzW10gPSB7CisgICAge0dTVF9FVkVOVF9TRUVLLCBHU1RfU0VFS19NRVRIT0RfU0VUIHwgR1NUX1NFRUtfRkxBR19LRVlfVU5JVH0sCisgICAgezAsfQorICB9OworCisgIHJldHVybiBtYXNrczsKK30KKyNlbmRpZgorCisjaWYgMAorc3RhdGljIGd1aW50NjQKK2dzdF9hdmlfZGVtdXhfc2Vla19zdHJlYW1zIChHc3RBdmlEZW11eCAqIGF2aSwgZ3VpbnQ2NCBvZmZzZXQsIGdib29sZWFuIGJlZm9yZSkKK3sKKyAgR3N0QXZpU3RyZWFtICpzdHJlYW07CisgIEdzdEluZGV4RW50cnkgKmVudHJ5OworICBnaW50IGk7CisgIGdpbnQ2NCB2YWwsIG1pbiA9IG9mZnNldDsKKworICBmb3IgKGkgPSAwOyBpIDwgYXZpLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgc3RyZWFtID0gJmF2aS0+c3RyZWFtW2ldOworCisgICAgZW50cnkgPSBnc3RfaW5kZXhfZ2V0X2Fzc29jX2VudHJ5IChhdmktPmVsZW1lbnRfaW5kZXgsIHN0cmVhbS0+aW5kZXhfaWQsCisgICAgICAgIGJlZm9yZSA/IEdTVF9JTkRFWF9MT09LVVBfQkVGT1JFIDogR1NUX0lOREVYX0xPT0tVUF9BRlRFUiwKKyAgICAgICAgR1NUX0FTU09DSUFUSU9OX0ZMQUdfTk9ORSwgR1NUX0ZPUk1BVF9CWVRFUywgb2Zmc2V0KTsKKworICAgIGlmIChiZWZvcmUpIHsKKyAgICAgIGlmIChlbnRyeSkgeworICAgICAgICBnc3RfaW5kZXhfZW50cnlfYXNzb2NfbWFwIChlbnRyeSwgR1NUX0ZPUk1BVF9CWVRFUywgJnZhbCk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInN0cmVhbSAlZCwgcHJldmlvdXMgZW50cnkgYXQgJSIKKyAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIGksIHZhbCk7CisgICAgICAgIGlmICh2YWwgPCBtaW4pCisgICAgICAgICAgbWluID0gdmFsOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKCFlbnRyeSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAibm8gcG9zaXRpb24gZm9yIHN0cmVhbSAlZCwgYXNzdW1pbmcgYXQgc3RhcnQiLCBpKTsKKyAgICAgIHN0cmVhbS0+Y3VycmVudF9lbnRyeSA9IDA7CisgICAgICBzdHJlYW0tPmN1cnJlbnRfdG90YWwgPSAwOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgZ3N0X2luZGV4X2VudHJ5X2Fzc29jX21hcCAoZW50cnksIEdTVF9GT1JNQVRfQllURVMsICZ2YWwpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInN0cmVhbSAlZCwgbmV4dCBlbnRyeSBhdCAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICBpLCB2YWwpOworCisgICAgZ3N0X2luZGV4X2VudHJ5X2Fzc29jX21hcCAoZW50cnksIEdTVF9GT1JNQVRfVElNRSwgJnZhbCk7CisgICAgc3RyZWFtLT5jdXJyZW50X3RvdGFsID0gdmFsOworICAgIGdzdF9pbmRleF9lbnRyeV9hc3NvY19tYXAgKGVudHJ5LCBHU1RfRk9STUFUX0RFRkFVTFQsICZ2YWwpOworICAgIHN0cmVhbS0+Y3VycmVudF9lbnRyeSA9IHZhbDsKKyAgfQorCisgIHJldHVybiBtaW47Cit9CisjZW5kaWYKKworc3RhdGljIGdpbnQKK2dzdF9hdmlfZGVtdXhfaW5kZXhfZW50cnlfb2Zmc2V0X3NlYXJjaCAoR3N0QXZpSW5kZXhFbnRyeSAqIGVudHJ5LAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGlmIChlbnRyeS0+b2Zmc2V0IDwgKm9mZnNldCkKKyAgICByZXR1cm4gLTE7CisgIGVsc2UgaWYgKGVudHJ5LT5vZmZzZXQgPiAqb2Zmc2V0KQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGd1aW50NjQKK2dzdF9hdmlfZGVtdXhfc2Vla19zdHJlYW1zX2luZGV4IChHc3RBdmlEZW11eCAqIGF2aSwgZ3VpbnQ2NCBvZmZzZXQsCisgICAgZ2Jvb2xlYW4gYmVmb3JlKQoreworICBHc3RBdmlTdHJlYW0gKnN0cmVhbTsKKyAgR3N0QXZpSW5kZXhFbnRyeSAqZW50cnk7CisgIGdpbnQgaTsKKyAgZ2ludDY0IHZhbCwgbWluID0gb2Zmc2V0OworICBndWludCBpbmRleCA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IGF2aS0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgIHN0cmVhbSA9ICZhdmktPnN0cmVhbVtpXTsKKworICAgIC8qIGNvbXBlbnNhdGUgZm9yIGNodW5rIGhlYWRlciAqLworICAgIG9mZnNldCArPSA4OworICAgIGVudHJ5ID0KKyAgICAgICAgZ3N0X3V0aWxfYXJyYXlfYmluYXJ5X3NlYXJjaCAoc3RyZWFtLT5pbmRleCwgc3RyZWFtLT5pZHhfbiwKKyAgICAgICAgc2l6ZW9mIChHc3RBdmlJbmRleEVudHJ5KSwKKyAgICAgICAgKEdDb21wYXJlRGF0YUZ1bmMpIGdzdF9hdmlfZGVtdXhfaW5kZXhfZW50cnlfb2Zmc2V0X3NlYXJjaCwKKyAgICAgICAgYmVmb3JlID8gR1NUX1NFQVJDSF9NT0RFX0JFRk9SRSA6IEdTVF9TRUFSQ0hfTU9ERV9BRlRFUiwgJm9mZnNldCwgTlVMTCk7CisgICAgb2Zmc2V0IC09IDg7CisKKyAgICBpZiAoZW50cnkpCisgICAgICBpbmRleCA9IGVudHJ5IC0gc3RyZWFtLT5pbmRleDsKKworICAgIGlmIChiZWZvcmUpIHsKKyAgICAgIGlmIChlbnRyeSkgeworICAgICAgICB2YWwgPSBzdHJlYW0tPmluZGV4W2luZGV4XS5vZmZzZXQ7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwKKyAgICAgICAgICAgICJzdHJlYW0gJWQsIHByZXZpb3VzIGVudHJ5IGF0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIGksIHZhbCk7CisgICAgICAgIGlmICh2YWwgPCBtaW4pCisgICAgICAgICAgbWluID0gdmFsOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKCFlbnRyeSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAibm8gcG9zaXRpb24gZm9yIHN0cmVhbSAlZCwgYXNzdW1pbmcgYXQgc3RhcnQiLCBpKTsKKyAgICAgIHN0cmVhbS0+Y3VycmVudF9lbnRyeSA9IDA7CisgICAgICBzdHJlYW0tPmN1cnJlbnRfdG90YWwgPSAwOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgdmFsID0gc3RyZWFtLT5pbmRleFtpbmRleF0ub2Zmc2V0IC0gODsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJzdHJlYW0gJWQsIG5leHQgZW50cnkgYXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwgaSwKKyAgICAgICAgdmFsKTsKKworICAgIHN0cmVhbS0+Y3VycmVudF90b3RhbCA9IHN0cmVhbS0+aW5kZXhbaW5kZXhdLnRvdGFsOworICAgIHN0cmVhbS0+Y3VycmVudF9lbnRyeSA9IGluZGV4OworICB9CisKKyAgcmV0dXJuIG1pbjsKK30KKworI2RlZmluZSBHU1RfQVZJX1NFRUtfUFVTSF9ESVNQTEFDRSAgICAgKDQgKiBHU1RfU0VDT05EKQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdmlfZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisgIEdzdEF2aURlbXV4ICphdmkgPSBHU1RfQVZJX0RFTVVYIChwYXJlbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwKKyAgICAgICJoYXZlIGV2ZW50IHR5cGUgJXM6ICVwIG9uIHNpbmsgcGFkIiwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpLCBldmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDoKKyAgICB7CisgICAgICBnaW50NjQgYm9mZnNldCwgb2Zmc2V0ID0gMDsKKyAgICAgIEdzdFNlZ21lbnQgc2VnbWVudDsKKyAgICAgIEdzdEV2ZW50ICpzZWdtZW50X2V2ZW50OworCisgICAgICAvKiBzb21lIGRlYnVnIG91dHB1dCAqLworICAgICAgZ3N0X2V2ZW50X2NvcHlfc2VnbWVudCAoZXZlbnQsICZzZWdtZW50KTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInJlY2VpdmVkIG5ld3NlZ21lbnQgJSIgR1NUX1NFR01FTlRfRk9STUFULAorICAgICAgICAgICZzZWdtZW50KTsKKworICAgICAgLyogY2hhaW4gd2lsbCBzZW5kIGluaXRpYWwgbmV3c2VnbWVudCBhZnRlciBwYWRzIGhhdmUgYmVlbiBhZGRlZCAqLworICAgICAgaWYgKGF2aS0+c3RhdGUgIT0gR1NUX0FWSV9ERU1VWF9NT1ZJKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInN0aWxsIHN0YXJ0aW5nLCBlYXRpbmcgZXZlbnQiKTsKKyAgICAgICAgZ290byBleGl0OworICAgICAgfQorCisgICAgICAvKiB3ZSBvbmx5IGV4cGVjdCBhIEJZVEUgc2VnbWVudCwgZS5nLiBmb2xsb3dpbmcgYSBzZWVrICovCisgICAgICBpZiAoc2VnbWVudC5mb3JtYXQgIT0gR1NUX0ZPUk1BVF9CWVRFUykgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJ1bnN1cHBvcnRlZCBzZWdtZW50IGZvcm1hdCwgaWdub3JpbmciKTsKKyAgICAgICAgZ290byBleGl0OworICAgICAgfQorCisgICAgICBpZiAoYXZpLT5oYXZlX2luZGV4KSB7CisgICAgICAgIEdzdEF2aUluZGV4RW50cnkgKmVudHJ5OworICAgICAgICBndWludCBpID0gMCwgaW5kZXggPSAwLCBrID0gMDsKKyAgICAgICAgR3N0QXZpU3RyZWFtICpzdHJlYW07CisKKyAgICAgICAgLyogY29tcGVuc2F0ZSBjaHVuayBoZWFkZXIsIHN0b3JlZCBpbmRleCBvZmZzZXQgcG9pbnRzIGFmdGVyIGhlYWRlciAqLworICAgICAgICBib2Zmc2V0ID0gc2VnbWVudC5zdGFydCArIDg7CisgICAgICAgIC8qIGZpbmQgd2hpY2ggc3RyZWFtIHdlJ3JlIG9uICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICBzdHJlYW0gPSAmYXZpLT5zdHJlYW1baV07CisKKyAgICAgICAgICAvKiBmaW5kIHRoZSBpbmRleCBmb3Igc3RhcnQgYnl0ZXMgb2Zmc2V0ICovCisgICAgICAgICAgZW50cnkgPSBnc3RfdXRpbF9hcnJheV9iaW5hcnlfc2VhcmNoIChzdHJlYW0tPmluZGV4LAorICAgICAgICAgICAgICBzdHJlYW0tPmlkeF9uLCBzaXplb2YgKEdzdEF2aUluZGV4RW50cnkpLAorICAgICAgICAgICAgICAoR0NvbXBhcmVEYXRhRnVuYykgZ3N0X2F2aV9kZW11eF9pbmRleF9lbnRyeV9vZmZzZXRfc2VhcmNoLAorICAgICAgICAgICAgICBHU1RfU0VBUkNIX01PREVfQUZURVIsICZib2Zmc2V0LCBOVUxMKTsKKworICAgICAgICAgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgaW5kZXggPSBlbnRyeSAtIHN0cmVhbS0+aW5kZXg7CisKKyAgICAgICAgICAvKiB3ZSBhcmUgb24gdGhlIHN0cmVhbSB3aXRoIGEgY2h1bmsgc3RhcnQgb2Zmc2V0IGNsb3Nlc3QgdG8gc3RhcnQgKi8KKyAgICAgICAgICBpZiAoIW9mZnNldCB8fCBzdHJlYW0tPmluZGV4W2luZGV4XS5vZmZzZXQgPCBvZmZzZXQpIHsKKyAgICAgICAgICAgIG9mZnNldCA9IHN0cmVhbS0+aW5kZXhbaW5kZXhdLm9mZnNldDsKKyAgICAgICAgICAgIGsgPSBpOworICAgICAgICAgIH0KKyAgICAgICAgICAvKiBleGFjdCBtYXRjaCBuZWVkcyBubyBmdXJ0aGVyIHNlYXJjaGluZyAqLworICAgICAgICAgIGlmIChzdHJlYW0tPmluZGV4W2luZGV4XS5vZmZzZXQgPT0gYm9mZnNldCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IHdoaWxlICgrK2kgPCBhdmktPm51bV9zdHJlYW1zKTsKKyAgICAgICAgYm9mZnNldCAtPSA4OworICAgICAgICBvZmZzZXQgLT0gODsKKyAgICAgICAgc3RyZWFtID0gJmF2aS0+c3RyZWFtW2tdOworCisgICAgICAgIC8qIHNvIHdlIGhhdmUgbm8gaWRlYSB3aGF0IGlzIHRvIGNvbWUsIG9yIHdoZXJlIHdlIGFyZSAqLworICAgICAgICBpZiAoIW9mZnNldCkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLCAiaW5zdWZmaWNpZW50IGluZGV4IGRhdGEsIGZvcmNpbmcgRU9TIik7CisgICAgICAgICAgZ290byBlb3M7CisgICAgICAgIH0KKworICAgICAgICAvKiBnZXQgdGhlIHRzIGNvcnJlc3BvbmRpbmcgdG8gc3RhcnQgb2Zmc2V0IGJ5dGVzIGZvciB0aGUgc3RyZWFtICovCisgICAgICAgIGdzdF9hdmlfZGVtdXhfZ2V0X2J1ZmZlcl9pbmZvIChhdmksIHN0cmVhbSwgaW5kZXgsCisgICAgICAgICAgICAoR3N0Q2xvY2tUaW1lICopICYgc2VnbWVudC50aW1lLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyNpZiAwCisgICAgICB9IGVsc2UgaWYgKGF2aS0+ZWxlbWVudF9pbmRleCkgeworICAgICAgICBHc3RJbmRleEVudHJ5ICplbnRyeTsKKworICAgICAgICAvKiBMZXQncyBjaGVjayBpZiB3ZSBoYXZlIGFuIGluZGV4IGVudHJ5IGZvciB0aGlzIHBvc2l0aW9uICovCisgICAgICAgIGVudHJ5ID0gZ3N0X2luZGV4X2dldF9hc3NvY19lbnRyeSAoYXZpLT5lbGVtZW50X2luZGV4LCBhdmktPmluZGV4X2lkLAorICAgICAgICAgICAgR1NUX0lOREVYX0xPT0tVUF9BRlRFUiwgR1NUX0FTU09DSUFUSU9OX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgIEdTVF9GT1JNQVRfQllURVMsIHNlZ21lbnQuc3RhcnQpOworCisgICAgICAgIC8qIHdlIGNhbiBub3QgZ28gd2hlcmUgd2UgaGF2ZSBub3QgeWV0IGJlZW4gYmVmb3JlIC4uLiAqLworICAgICAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksICJpbnN1ZmZpY2llbnQgaW5kZXggZGF0YSwgZm9yY2luZyBFT1MiKTsKKyAgICAgICAgICBnb3RvIGVvczsKKyAgICAgICAgfQorCisgICAgICAgIGdzdF9pbmRleF9lbnRyeV9hc3NvY19tYXAgKGVudHJ5LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgICAoZ2ludDY0ICopICYgc2VnbWVudC50aW1lKTsKKyAgICAgICAgZ3N0X2luZGV4X2VudHJ5X2Fzc29jX21hcCAoZW50cnksIEdTVF9GT1JNQVRfQllURVMsICZvZmZzZXQpOworI2VuZGlmCisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aSwgIm5vIGluZGV4IGRhdGEsIGZvcmNpbmcgRU9TIik7CisgICAgICAgIGdvdG8gZW9zOworICAgICAgfQorCisgICAgICBzZWdtZW50LmZvcm1hdCA9IEdTVF9GT1JNQVRfVElNRTsKKyAgICAgIHNlZ21lbnQuc3RhcnQgPSBzZWdtZW50LnRpbWU7CisgICAgICBzZWdtZW50LnN0b3AgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgICAgc2VnbWVudC5wb3NpdGlvbiA9IHNlZ21lbnQuc3RhcnQ7CisKKyAgICAgIC8qIHJlc2N1ZSBkdXJhdGlvbiAqLworICAgICAgc2VnbWVudC5kdXJhdGlvbiA9IGF2aS0+c2VnbWVudC5kdXJhdGlvbjsKKworICAgICAgLyogc2V0IHVwIHNlZ21lbnQgYW5kIHNlbmQgZG93bnN0cmVhbSAqLworICAgICAgZ3N0X3NlZ21lbnRfY29weV9pbnRvICgmc2VnbWVudCwgJmF2aS0+c2VnbWVudCk7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIlB1c2hpbmcgbmV3c2VnICUiIEdTVF9TRUdNRU5UX0ZPUk1BVCwgJnNlZ21lbnQpOworICAgICAgYXZpLT5zZWdtZW50X3NlcW51bSA9IGdzdF9ldmVudF9nZXRfc2VxbnVtIChldmVudCk7CisgICAgICBzZWdtZW50X2V2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCk7CisgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoc2VnbWVudF9ldmVudCwgZ3N0X2V2ZW50X2dldF9zZXFudW0gKGV2ZW50KSk7CisgICAgICBnc3RfYXZpX2RlbXV4X3B1c2hfZXZlbnQgKGF2aSwgc2VnbWVudF9ldmVudCk7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIm5leHQgY2h1bmsgZXhwZWN0ZWQgYXQgJSIgR19HSU5UNjRfRk9STUFULAorICAgICAgICAgIGJvZmZzZXQpOworCisgICAgICAvKiBhZGp1c3Qgc3RhdGUgZm9yIHN0cmVhbWluZyB0aHJlYWQgYWNjb3JkaW5nbHkgKi8KKyAgICAgIGlmIChhdmktPmhhdmVfaW5kZXgpCisgICAgICAgIGdzdF9hdmlfZGVtdXhfc2Vla19zdHJlYW1zX2luZGV4IChhdmksIG9mZnNldCwgRkFMU0UpOworI2lmIDAKKyAgICAgIGVsc2UKKyAgICAgICAgZ3N0X2F2aV9kZW11eF9zZWVrX3N0cmVhbXMgKGF2aSwgb2Zmc2V0LCBGQUxTRSk7CisjZW5kaWYKKworICAgICAgLyogc2V0IHVwIHN0cmVhbWluZyB0aHJlYWQgKi8KKyAgICAgIGdfYXNzZXJ0IChvZmZzZXQgPj0gYm9mZnNldCk7CisgICAgICBhdmktPm9mZnNldCA9IGJvZmZzZXQ7CisgICAgICBhdmktPnRvZHJvcCA9IG9mZnNldCAtIGJvZmZzZXQ7CisKKyAgICBleGl0OgorICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICByZXMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgZW9zOgorICAgICAgLyogc2V0IHVwIGZvciBFT1MgKi8KKyAgICAgIGF2aS0+aGF2ZV9lb3MgPSBUUlVFOworICAgICAgZ290byBleGl0OworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgeworICAgICAgaWYgKGF2aS0+c3RhdGUgIT0gR1NUX0FWSV9ERU1VWF9NT1ZJKSB7CisgICAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXZpLCBTVFJFQU0sIERFTVVYLAorICAgICAgICAgICAgKE5VTEwpLCAoImdvdCBlb3MgYW5kIGRpZG4ndCByZWNlaXZlIGEgY29tcGxldGUgaGVhZGVyIG9iamVjdCIpKTsKKyAgICAgIH0gZWxzZSBpZiAoIWdzdF9hdmlfZGVtdXhfcHVzaF9ldmVudCAoYXZpLCBldmVudCkpIHsKKyAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF2aSwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgICAgIChOVUxMKSwgKCJnb3QgZW9zIGJ1dCBubyBzdHJlYW1zICh5ZXQpIikpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6CisgICAgeworICAgICAgZ2ludCBpOworCisgICAgICBnc3RfYWRhcHRlcl9jbGVhciAoYXZpLT5hZGFwdGVyKTsKKyAgICAgIGF2aS0+aGF2ZV9lb3MgPSBGQUxTRTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmktPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgYXZpLT5zdHJlYW1baV0uZGlzY29udCA9IFRSVUU7CisgICAgICB9CisgICAgICAvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCBjYXNlIHNvIHRoYXQgdGhlIGV2ZW50IGdldHMgcGFzc2VkIGRvd25zdHJlYW0gKi8KKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisgIEdzdEF2aURlbXV4ICphdmkgPSBHU1RfQVZJX0RFTVVYIChwYXJlbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwKKyAgICAgICJoYXZlIGV2ZW50IHR5cGUgJXM6ICVwIG9uIHNyYyBwYWQiLCBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCksIGV2ZW50KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TRUVLOgorICAgICAgaWYgKCFhdmktPnN0cmVhbWluZykgeworICAgICAgICByZXMgPSBnc3RfYXZpX2RlbXV4X2hhbmRsZV9zZWVrIChhdmksIHBhZCwgZXZlbnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gZ3N0X2F2aV9kZW11eF9oYW5kbGVfc2Vla19wdXNoIChhdmksIHBhZCwgZXZlbnQpOworICAgICAgfQorICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCisvKiBzdHJlYW1pbmcgaGVscGVyIChwdXNoKSAqLworCisvKgorICogZ3N0X2F2aV9kZW11eF9wZWVrX2NodW5rX2luZm86CisgKiBAYXZpOiBBdmkgb2JqZWN0CisgKiBAdGFnOiBob2xkZXIgZm9yIHRhZworICogQHNpemU6IGhvbGRlciBmb3IgdGFnIHNpemUKKyAqCisgKiBQZWVrIG5leHQgY2h1bmsgaW5mbyAodGFnIGFuZCBzaXplKQorICoKKyAqIFJldHVybnM6IFRSVUUgd2hlbiBvbmUgY2h1bmsgaW5mbyBoYXMgYmVlbiBnb3QKKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYXZpX2RlbXV4X3BlZWtfY2h1bmtfaW5mbyAoR3N0QXZpRGVtdXggKiBhdmksIGd1aW50MzIgKiB0YWcsIGd1aW50MzIgKiBzaXplKQoreworICBjb25zdCBndWludDggKmRhdGEgPSBOVUxMOworCisgIGlmIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGF2aS0+YWRhcHRlcikgPCA4KQorICAgIHJldHVybiBGQUxTRTsKKworICBkYXRhID0gZ3N0X2FkYXB0ZXJfbWFwIChhdmktPmFkYXB0ZXIsIDgpOworICAqdGFnID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKyAgKnNpemUgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEgKyA0KTsKKyAgZ3N0X2FkYXB0ZXJfdW5tYXAgKGF2aS0+YWRhcHRlcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBnc3RfYXZpX2RlbXV4X3BlZWtfY2h1bms6CisgKiBAYXZpOiBBdmkgb2JqZWN0CisgKiBAdGFnOiBob2xkZXIgZm9yIHRhZworICogQHNpemU6IGhvbGRlciBmb3IgdGFnIHNpemUKKyAqCisgKiBQZWVrIGVub3VnaCBkYXRhIGZvciBvbmUgZnVsbCBjaHVuaworICoKKyAqIFJldHVybnM6ICVUUlVFIHdoZW4gb25lIGNodW5rIGhhcyBiZWVuIGdvdAorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdmlfZGVtdXhfcGVla19jaHVuayAoR3N0QXZpRGVtdXggKiBhdmksIGd1aW50MzIgKiB0YWcsIGd1aW50MzIgKiBzaXplKQoreworICBndWludDMyIHBlZWtfc2l6ZSA9IDA7CisgIGdpbnQgYXZhaWxhYmxlOworCisgIGlmICghZ3N0X2F2aV9kZW11eF9wZWVrX2NodW5rX2luZm8gKGF2aSwgdGFnLCBzaXplKSkKKyAgICBnb3RvIHBlZWtfZmFpbGVkOworCisgIC8qIHNpemUgMCAtPiBlbXB0eSBkYXRhIGJ1ZmZlciB3b3VsZCBzdXJwcmlzZSBtb3N0IGNhbGxlcnMsCisgICAqIGxhcmdlIHNpemUgLT4gZG8gbm90IGJvdGhlciB0cnlpbmcgdG8gc3F1ZWV6ZSB0aGF0IGludG8gYWRhcHRlciwKKyAgICogc28gd2UgdGhyb3cgcG9vciBtYW4ncyBleGNlcHRpb24sIHdoaWNoIGNhbiBiZSBjYXVnaHQgaWYgY2FsbGVyIHJlYWxseQorICAgKiB3YW50cyB0byBoYW5kbGUgMCBzaXplIGNodW5rICovCisgIGlmICghKCpzaXplKSB8fCAoKnNpemUpID49ICgxIDw8IDMwKSkKKyAgICBnb3RvIHN0cmFuZ2Vfc2l6ZTsKKworICBwZWVrX3NpemUgPSAoKnNpemUgKyAxKSAmIH4xOworICBhdmFpbGFibGUgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGF2aS0+YWRhcHRlcik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLAorICAgICAgIk5lZWQgdG8gcGVlayBjaHVuayBvZiAlZCBieXRlcyB0byByZWFkIGNodW5rICUiIEdTVF9GT1VSQ0NfRk9STUFUCisgICAgICAiLCAlZCBieXRlcyBhdmFpbGFibGUiLCAqc2l6ZSwgR1NUX0ZPVVJDQ19BUkdTICgqdGFnKSwgYXZhaWxhYmxlKTsKKworICBpZiAoYXZhaWxhYmxlIDwgKDggKyBwZWVrX3NpemUpKQorICAgIGdvdG8gbmVlZF9tb3JlOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworcGVla19mYWlsZWQ6CisgIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgIkZhaWxlZCB0byBwZWVrIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitzdHJhbmdlX3NpemU6CisgIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwKKyAgICAgICAgIkludmFsaWQvdW5leHBlY3RlZCBjaHVuayBzaXplICVkIGZvciB0YWcgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsICpzaXplLAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKCp0YWcpKTsKKyAgICAvKiBjaGFpbiBzaG91bGQgZ2l2ZSB1cCAqLworICAgIGF2aS0+YWJvcnRfYnVmZmVyaW5nID0gVFJVRTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25lZWRfbW9yZToKKyAgeworICAgIEdTVF9JTkZPX09CSkVDVCAoYXZpLCAibmVlZCBtb3JlICVkIDwgJSIgR19HVUlOVDMyX0ZPUk1BVCwKKyAgICAgICAgYXZhaWxhYmxlLCA4ICsgcGVla19zaXplKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogQVZJIGluaXQgKi8KKworLyoKKyAqIGdzdF9hdmlfZGVtdXhfcGFyc2VfZmlsZV9oZWFkZXI6CisgKiBAZWxlbWVudDogY2FsbGVyIGVsZW1lbnQgKHVzZWQgZm9yIGVycm9ycy9kZWJ1ZykuCisgKiBAYnVmOiBpbnB1dCBkYXRhIHRvIGJlIHVzZWQgZm9yIHBhcnNpbmcuCisgKgorICogIk9wZW4iIGEgUklGRi9BVkkgZmlsZS4gVGhlIGJ1ZmZlciBzaG91bGQgYmUgYXQgbGVhc3QgMTIKKyAqIGJ5dGVzIGxvbmcuIFRha2VzIG93bmVyc2hpcCBvZiBAYnVmLgorICoKKyAqIFJldHVybnM6IFRSVUUgaWYgdGhlIGZpbGUgaXMgYSBSSUZGL0FWSSBmaWxlLCBGQUxTRSBvdGhlcndpc2UuCisgKiAgICAgICAgICBUaHJvd3MgYW4gZXJyb3IsIGNhbGxlciBzaG91bGQgZXJyb3Igb3V0IChmYXRhbCkuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F2aV9kZW11eF9wYXJzZV9maWxlX2hlYWRlciAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgZ3VpbnQzMiBkb2N0eXBlOworICBHc3RDbG9ja1RpbWUgc3RhbXA7CisKKyAgc3RhbXAgPSBnc3RfdXRpbF9nZXRfdGltZXN0YW1wICgpOworCisgIC8qIHJpZmZfcGFyc2UgcG9zdHMgYW4gZXJyb3IgKi8KKyAgaWYgKCFnc3RfcmlmZl9wYXJzZV9maWxlX2hlYWRlciAoZWxlbWVudCwgYnVmLCAmZG9jdHlwZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChkb2N0eXBlICE9IEdTVF9SSUZGX1JJRkZfQVZJKQorICAgIGdvdG8gbm90X2F2aTsKKworICBzdGFtcCA9IGdzdF91dGlsX2dldF90aW1lc3RhbXAgKCkgLSBzdGFtcDsKKyAgR1NUX0RFQlVHX09CSkVDVCAoZWxlbWVudCwgImhlYWRlciBwYXJzaW5nIHRvb2sgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoc3RhbXApKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK25vdF9hdmk6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZWxlbWVudCwgU1RSRUFNLCBXUk9OR19UWVBFLCAoTlVMTCksCisgICAgICAgICgiRmlsZSBpcyBub3QgYW4gQVZJIGZpbGU6IDB4JSIgR19HSU5UMzJfTU9ESUZJRVIgIngiLCBkb2N0eXBlKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qCisgKiBSZWFkIEFWSSBmaWxlIHRhZyB3aGVuIHN0cmVhbWluZworICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5pdF9wdXNoIChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoYXZpLT5hZGFwdGVyKSA+PSAxMikgeworICAgIEdzdEJ1ZmZlciAqdG1wOworCisgICAgdG1wID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKGF2aS0+YWRhcHRlciwgMTIpOworCisgICAgR1NUX0RFQlVHICgiUGFyc2luZyBhdmkgaGVhZGVyIik7CisgICAgaWYgKCFnc3RfYXZpX2RlbXV4X3BhcnNlX2ZpbGVfaGVhZGVyIChHU1RfRUxFTUVOVF9DQVNUIChhdmkpLCB0bXApKSB7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgfQorICAgIEdTVF9ERUJVRyAoImhlYWRlciBvayIpOworICAgIGF2aS0+b2Zmc2V0ICs9IDEyOworCisgICAgYXZpLT5zdGF0ZSA9IEdTVF9BVklfREVNVVhfSEVBREVSOworICB9CisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworLyoKKyAqIFJlYWQgQVZJIGZpbGUgdGFnCisgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbml0X3B1bGwgKEdzdEF2aURlbXV4ICogYXZpKQoreworICBHc3RGbG93UmV0dXJuIHJlczsKKyAgR3N0QnVmZmVyICpidWYgPSBOVUxMOworCisgIHJlcyA9IGdzdF9wYWRfcHVsbF9yYW5nZSAoYXZpLT5zaW5rcGFkLCBhdmktPm9mZnNldCwgMTIsICZidWYpOworICBpZiAocmVzICE9IEdTVF9GTE9XX09LKQorICAgIHJldHVybiByZXM7CisgIGVsc2UgaWYgKCFnc3RfYXZpX2RlbXV4X3BhcnNlX2ZpbGVfaGVhZGVyIChHU1RfRUxFTUVOVF9DQVNUIChhdmkpLCBidWYpKQorICAgIGdvdG8gd3JvbmdfaGVhZGVyOworCisgIGF2aS0+b2Zmc2V0ICs9IDEyOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX2hlYWRlcjoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgImVycm9yIHBhcnNpbmcgZmlsZSBoZWFkZXIiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworLyogQVZJIGhlYWRlciBoYW5kbGluZyAqLworLyoKKyAqIGdzdF9hdmlfZGVtdXhfcGFyc2VfYXZpaDoKKyAqIEBhdmk6IGNhbGxlciBlbGVtZW50ICh1c2VkIGZvciBlcnJvcnMvZGVidWcpLgorICogQGJ1ZjogaW5wdXQgZGF0YSB0byBiZSB1c2VkIGZvciBwYXJzaW5nLgorICogQGF2aWg6IHBvaW50ZXIgdG8gc3RydWN0dXJlIChmaWxsZWQgaW4gYnkgZnVuY3Rpb24pIGNvbnRhaW5pbmcKKyAqICAgICAgICBzdHJlYW0gaW5mb3JtYXRpb24gKHN1Y2ggYXMgZmxhZ3MsIG51bWJlciBvZiBzdHJlYW1zLCBldGMuKS4KKyAqCisgKiBSZWFkICdhdmloJyBoZWFkZXIuIERpc2NhcmRzIGJ1ZmZlciBhZnRlciB1c2UuCisgKgorICogUmV0dXJuczogVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvdGhlcndpc2UuIFRocm93cyBhbiBlcnJvciBpZgorICogICAgICAgICAgdGhlIGhlYWRlciBpcyBpbnZhbGlkLiBUaGUgY2FsbGVyIHNob3VsZCBlcnJvciBvdXQKKyAqICAgICAgICAgIChmYXRhbCkuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F2aV9kZW11eF9wYXJzZV9hdmloIChHc3RBdmlEZW11eCAqIGF2aSwKKyAgICBHc3RCdWZmZXIgKiBidWYsIGdzdF9yaWZmX2F2aWggKiogX2F2aWgpCit7CisgIGdzdF9yaWZmX2F2aWggKmF2aWg7CisgIGdzaXplIHNpemU7CisKKyAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgIGdvdG8gbm9fYnVmZmVyOworCisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpOworICBpZiAoc2l6ZSA8IHNpemVvZiAoZ3N0X3JpZmZfYXZpaCkpCisgICAgZ290byBhdmloX3Rvb19zbWFsbDsKKworICBhdmloID0gZ19tYWxsb2MgKHNpemUpOworICBnc3RfYnVmZmVyX2V4dHJhY3QgKGJ1ZiwgMCwgYXZpaCwgc2l6ZSk7CisKKyNpZiAoR19CWVRFX09SREVSID09IEdfQklHX0VORElBTikKKyAgYXZpaC0+dXNfZnJhbWUgPSBHVUlOVDMyX0ZST01fTEUgKGF2aWgtPnVzX2ZyYW1lKTsKKyAgYXZpaC0+bWF4X2JwcyA9IEdVSU5UMzJfRlJPTV9MRSAoYXZpaC0+bWF4X2Jwcyk7CisgIGF2aWgtPnBhZF9ncmFuID0gR1VJTlQzMl9GUk9NX0xFIChhdmloLT5wYWRfZ3Jhbik7CisgIGF2aWgtPmZsYWdzID0gR1VJTlQzMl9GUk9NX0xFIChhdmloLT5mbGFncyk7CisgIGF2aWgtPnRvdF9mcmFtZXMgPSBHVUlOVDMyX0ZST01fTEUgKGF2aWgtPnRvdF9mcmFtZXMpOworICBhdmloLT5pbml0X2ZyYW1lcyA9IEdVSU5UMzJfRlJPTV9MRSAoYXZpaC0+aW5pdF9mcmFtZXMpOworICBhdmloLT5zdHJlYW1zID0gR1VJTlQzMl9GUk9NX0xFIChhdmloLT5zdHJlYW1zKTsKKyAgYXZpaC0+YnVmc2l6ZSA9IEdVSU5UMzJfRlJPTV9MRSAoYXZpaC0+YnVmc2l6ZSk7CisgIGF2aWgtPndpZHRoID0gR1VJTlQzMl9GUk9NX0xFIChhdmloLT53aWR0aCk7CisgIGF2aWgtPmhlaWdodCA9IEdVSU5UMzJfRlJPTV9MRSAoYXZpaC0+aGVpZ2h0KTsKKyAgYXZpaC0+c2NhbGUgPSBHVUlOVDMyX0ZST01fTEUgKGF2aWgtPnNjYWxlKTsKKyAgYXZpaC0+cmF0ZSA9IEdVSU5UMzJfRlJPTV9MRSAoYXZpaC0+cmF0ZSk7CisgIGF2aWgtPnN0YXJ0ID0gR1VJTlQzMl9GUk9NX0xFIChhdmloLT5zdGFydCk7CisgIGF2aWgtPmxlbmd0aCA9IEdVSU5UMzJfRlJPTV9MRSAoYXZpaC0+bGVuZ3RoKTsKKyNlbmRpZgorCisgIC8qIGRlYnVnIHN0dWZmICovCisgIEdTVF9JTkZPX09CSkVDVCAoYXZpLCAiYXZpaCB0YWcgZm91bmQ6Iik7CisgIEdTVF9JTkZPX09CSkVDVCAoYXZpLCAiIHVzX2ZyYW1lICAgICV1IiwgYXZpaC0+dXNfZnJhbWUpOworICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgIiBtYXhfYnBzICAgICAldSIsIGF2aWgtPm1heF9icHMpOworICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgIiBwYWRfZ3JhbiAgICAldSIsIGF2aWgtPnBhZF9ncmFuKTsKKyAgR1NUX0lORk9fT0JKRUNUIChhdmksICIgZmxhZ3MgICAgICAgMHglMDh4IiwgYXZpaC0+ZmxhZ3MpOworICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgIiB0b3RfZnJhbWVzICAldSIsIGF2aWgtPnRvdF9mcmFtZXMpOworICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgIiBpbml0X2ZyYW1lcyAldSIsIGF2aWgtPmluaXRfZnJhbWVzKTsKKyAgR1NUX0lORk9fT0JKRUNUIChhdmksICIgc3RyZWFtcyAgICAgJXUiLCBhdmloLT5zdHJlYW1zKTsKKyAgR1NUX0lORk9fT0JKRUNUIChhdmksICIgYnVmc2l6ZSAgICAgJXUiLCBhdmloLT5idWZzaXplKTsKKyAgR1NUX0lORk9fT0JKRUNUIChhdmksICIgd2lkdGggICAgICAgJXUiLCBhdmloLT53aWR0aCk7CisgIEdTVF9JTkZPX09CSkVDVCAoYXZpLCAiIGhlaWdodCAgICAgICV1IiwgYXZpaC0+aGVpZ2h0KTsKKyAgR1NUX0lORk9fT0JKRUNUIChhdmksICIgc2NhbGUgICAgICAgJXUiLCBhdmloLT5zY2FsZSk7CisgIEdTVF9JTkZPX09CSkVDVCAoYXZpLCAiIHJhdGUgICAgICAgICV1IiwgYXZpaC0+cmF0ZSk7CisgIEdTVF9JTkZPX09CSkVDVCAoYXZpLCAiIHN0YXJ0ICAgICAgICV1IiwgYXZpaC0+c3RhcnQpOworICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgIiBsZW5ndGggICAgICAldSIsIGF2aWgtPmxlbmd0aCk7CisKKyAgKl9hdmloID0gYXZpaDsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICBpZiAoYXZpaC0+dXNfZnJhbWUgIT0gMCAmJiBhdmloLT50b3RfZnJhbWVzICE9IDApCisgICAgYXZpLT5kdXJhdGlvbiA9CisgICAgICAgIChndWludDY0KSBhdmloLT51c19mcmFtZSAqIChndWludDY0KSBhdmloLT50b3RfZnJhbWVzICogMTAwMDsKKyAgZWxzZQorICAgIGF2aS0+ZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIEdTVF9JTkZPX09CSkVDVCAoYXZpLCAiIGhlYWRlciBkdXJhdGlvbiAgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoYXZpLT5kdXJhdGlvbikpOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworbm9fYnVmZmVyOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF2aSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLCAoIk5vIGJ1ZmZlciIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2F2aWhfdG9vX3NtYWxsOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF2aSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAoIlRvbyBzbWFsbCBhdmloICglIiBHX0dTSVpFX0ZPUk1BVCAiIGF2YWlsYWJsZSwgJWQgbmVlZGVkKSIsCisgICAgICAgICAgICBzaXplLCAoaW50KSBzaXplb2YgKGdzdF9yaWZmX2F2aWgpKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyoKKyAqIGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3VwZXJpbmRleDoKKyAqIEBhdmk6IGNhbGxlciBlbGVtZW50ICh1c2VkIGZvciBkZWJ1Z2dpbmcvZXJyb3JzKS4KKyAqIEBidWY6IGlucHV0IGRhdGEgdG8gdXNlIGZvciBwYXJzaW5nLgorICogQGxvY2F0aW9uczogbG9jYXRpb25zIGluIHRoZSBmaWxlIChieXRlLW9mZnNldHMpIHRoYXQgY29udGFpbgorICogICAgICAgICAgICAgdGhlIGFjdHVhbCBpbmRleGVzIChzZWUgZ2V0X2F2aV9kZW11eF9wYXJzZV9zdWJpbmRleCgpKS4KKyAqICAgICAgICAgICAgIFRoZSBhcnJheSBlbmRzIHdpdGggR1NUX0JVRkZFUl9PRkZTRVRfTk9ORS4KKyAqCisgKiBSZWFkcyBzdXBlcmluZGV4IChvcGVuRE1MLTIgc3BlYyBzdHVmZikgZnJvbSB0aGUgcHJvdmlkZWQgZGF0YS4KKyAqCisgKiBSZXR1cm5zOiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG90aGVyd2lzZS4gSW5kZXhlcyBzaG91bGQgYmUgc2tpcHBlZAorICogICAgICAgICAgb24gZXJyb3IsIGJ1dCB0aGV5IGFyZSBub3QgZmF0YWwuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F2aV9kZW11eF9wYXJzZV9zdXBlcmluZGV4IChHc3RBdmlEZW11eCAqIGF2aSwKKyAgICBHc3RCdWZmZXIgKiBidWYsIGd1aW50NjQgKiogX2luZGV4ZXMpCit7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKmRhdGE7CisgIGd1aW50MTYgYnBlID0gMTY7CisgIGd1aW50MzIgbnVtLCBpOworICBndWludDY0ICppbmRleGVzOworICBnc2l6ZSBzaXplOworCisgICpfaW5kZXhlcyA9IE5VTEw7CisKKyAgaWYgKGJ1ZikgeworICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgZGF0YSA9IG1hcC5kYXRhOworICAgIHNpemUgPSBtYXAuc2l6ZTsKKyAgfSBlbHNlIHsKKyAgICBkYXRhID0gTlVMTDsKKyAgICBzaXplID0gMDsKKyAgfQorCisgIGlmIChzaXplIDwgMjQpCisgICAgZ290byB0b29fc21hbGw7CisKKyAgLyogY2hlY2sgdHlwZSBvZiBpbmRleC4gVGhlIG9wZW5kbWwyIHNwZWNzIHN0YXRlIHRoYXQKKyAgICogdGhlcmUgc2hvdWxkIGJlIDQgZHdvcmRzIHBlciBhcnJheSBlbnRyeS4gVHlwZSBjYW4gYmUKKyAgICogZWl0aGVyIGZyYW1lIG9yIGZpZWxkIChhbmQgd2UgZG9uJ3QgY2FyZSkuICovCisgIGlmIChHU1RfUkVBRF9VSU5UMTZfTEUgKGRhdGEpICE9IDQgfHwKKyAgICAgIChkYXRhWzJdICYgMHhmZSkgIT0gMHgwIHx8IGRhdGFbM10gIT0gMHgwKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksCisgICAgICAgICJTdXBlcmluZGV4IGZvciBzdHJlYW0gaGFzIHVuZXhwZWN0ZWQgIgorICAgICAgICAic2l6ZV9lbnRyeSAlZCAoYnl0ZXMpIG9yIGZsYWdzIDB4JTAyeC8weCUwMngiLAorICAgICAgICBHU1RfUkVBRF9VSU5UMTZfTEUgKGRhdGEpLCBkYXRhWzJdLCBkYXRhWzNdKTsKKyAgICBicGUgPSBHU1RfUkVBRF9VSU5UMTZfTEUgKGRhdGEpICogNDsKKyAgfQorICBudW0gPSBHU1RfUkVBRF9VSU5UMzJfTEUgKCZkYXRhWzRdKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJnb3QgJWQgaW5kZXhlcyIsIG51bSk7CisKKyAgLyogdGhpcyBjYW4ndCB3b3JrIG91dCB3ZWxsIC4uLiAqLworICBpZiAobnVtID4gR19NQVhVSU5UMzIgPj4gMSB8fCBicGUgPCA4KSB7CisgICAgZ290byBpbnZhbGlkX3BhcmFtczsKKyAgfQorCisgIGluZGV4ZXMgPSBnX25ldyAoZ3VpbnQ2NCwgbnVtICsgMSk7CisgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgIGlmIChzaXplIDwgMjQgKyBicGUgKiAoaSArIDEpKQorICAgICAgYnJlYWs7CisgICAgaW5kZXhlc1tpXSA9IEdTVF9SRUFEX1VJTlQ2NF9MRSAoJmRhdGFbMjQgKyBicGUgKiBpXSk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiaW5kZXggJWQgYXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwgaSwgaW5kZXhlc1tpXSk7CisgIH0KKyAgaW5kZXhlc1tpXSA9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkU7CisgICpfaW5kZXhlcyA9IGluZGV4ZXM7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK3Rvb19zbWFsbDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGF2aSwKKyAgICAgICAgIk5vdCBlbm91Z2ggZGF0YSB0byBwYXJzZSBzdXBlcmluZGV4ICglIiBHX0dTSVpFX0ZPUk1BVAorICAgICAgICAiIGF2YWlsYWJsZSwgMjQgbmVlZGVkKSIsIHNpemUpOworICAgIGlmIChidWYpIHsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfcGFyYW1zOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoYXZpLCAiaW52YWxpZCBpbmRleCBwYXJhbWV0ZXJzIChudW0gPSAlZCwgYnBlID0gJWQpIiwKKyAgICAgICAgbnVtLCBicGUpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogYWRkIGFuIGVudHJ5IHRvIHRoZSBpbmRleCBvZiBhIHN0cmVhbS4gQG51bSBzaG91bGQgYmUgYW4gZXN0aW1hdGUgb2YgdGhlCisgKiB0b3RhbCBhbW91bnQgb2YgaW5kZXggZW50cmllcyBmb3IgYWxsIHN0cmVhbXMgYW5kIGlzIHVzZWQgdG8gZHluYW1pY2FsbHkKKyAqIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGluZGV4IGVudHJpZXMuICovCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitnc3RfYXZpX2RlbXV4X2FkZF9pbmRleCAoR3N0QXZpRGVtdXggKiBhdmksIEdzdEF2aVN0cmVhbSAqIHN0cmVhbSwKKyAgICBndWludCBudW0sIEdzdEF2aUluZGV4RW50cnkgKiBlbnRyeSkKK3sKKyAgLyogZW5zdXJlIGluZGV4IG1lbW9yeSAqLworICBpZiAoR19VTkxJS0VMWSAoc3RyZWFtLT5pZHhfbiA+PSBzdHJlYW0tPmlkeF9tYXgpKSB7CisgICAgZ3VpbnQgaWR4X21heCA9IHN0cmVhbS0+aWR4X21heDsKKyAgICBHc3RBdmlJbmRleEVudHJ5ICpuZXdfaWR4OworCisgICAgLyogd2UgbmVlZCB0byBtYWtlIHNvbWUgbW9yZSByb29tICovCisgICAgaWYgKGlkeF9tYXggPT0gMCkgeworICAgICAgLyogaW5pdGlhbCBzaXplIGd1ZXNzLCBhc3N1bWUgZWFjaCBzdHJlYW0gaGFzIGFuIGVxdWFsIGFtb3VudCBvZiBlbnRyaWVzLAorICAgICAgICogb3ZlcnNob290IHdpdGggYXQgbGVhc3QgOEsgKi8KKyAgICAgIGlkeF9tYXggPSAobnVtIC8gYXZpLT5udW1fc3RyZWFtcykgKyAoODE5MiAvIHNpemVvZiAoR3N0QXZpSW5kZXhFbnRyeSkpOworICAgIH0gZWxzZSB7CisgICAgICBpZHhfbWF4ICs9IDgxOTIgLyBzaXplb2YgKEdzdEF2aUluZGV4RW50cnkpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiZXhwYW5kZWQgaW5kZXggZnJvbSAldSB0byAldSIsCisgICAgICAgICAgc3RyZWFtLT5pZHhfbWF4LCBpZHhfbWF4KTsKKyAgICB9CisgICAgbmV3X2lkeCA9IGdfdHJ5X3JlbmV3IChHc3RBdmlJbmRleEVudHJ5LCBzdHJlYW0tPmluZGV4LCBpZHhfbWF4KTsKKyAgICAvKiBvdXQgb2YgbWVtb3J5LCBpZiB0aGlzIGZhaWxzIHN0cmVhbS0+aW5kZXggaXMgdW50b3VjaGVkLiAqLworICAgIGlmIChHX1VOTElLRUxZICghbmV3X2lkeCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgLyogdXNlIG5ldyBpbmRleCAqLworICAgIHN0cmVhbS0+aW5kZXggPSBuZXdfaWR4OworICAgIHN0cmVhbS0+aWR4X21heCA9IGlkeF9tYXg7CisgIH0KKworICAvKiB1cGRhdGUgZW50cnkgdG90YWwgYW5kIHN0cmVhbSBzdGF0cy4gVGhlIGVudHJ5IHRvdGFsIGNhbiBiZSBjb252ZXJ0ZWQgdG8KKyAgICogdGhlIHRpbWVzdGFtcCBvZiB0aGUgZW50cnkgZWFzaWx5LiAqLworICBpZiAoc3RyZWFtLT5zdHJoLT50eXBlID09IEdTVF9SSUZGX0ZDQ19hdWRzKSB7CisgICAgZ2ludCBibG9ja2FsaWduOworCisgICAgaWYgKHN0cmVhbS0+aXNfdmJyKSB7CisgICAgICBlbnRyeS0+dG90YWwgPSBzdHJlYW0tPnRvdGFsX2Jsb2NrczsKKyAgICB9IGVsc2UgeworICAgICAgZW50cnktPnRvdGFsID0gc3RyZWFtLT50b3RhbF9ieXRlczsKKyAgICB9CisgICAgYmxvY2thbGlnbiA9IHN0cmVhbS0+c3RyZi5hdWRzLT5ibG9ja2FsaWduOworICAgIGlmIChibG9ja2FsaWduID4gMCkKKyAgICAgIHN0cmVhbS0+dG90YWxfYmxvY2tzICs9IERJVl9ST1VORF9VUCAoZW50cnktPnNpemUsIGJsb2NrYWxpZ24pOworICAgIGVsc2UKKyAgICAgIHN0cmVhbS0+dG90YWxfYmxvY2tzKys7CisgIH0gZWxzZSB7CisgICAgaWYgKHN0cmVhbS0+aXNfdmJyKSB7CisgICAgICBlbnRyeS0+dG90YWwgPSBzdHJlYW0tPmlkeF9uOworICAgIH0gZWxzZSB7CisgICAgICBlbnRyeS0+dG90YWwgPSBzdHJlYW0tPnRvdGFsX2J5dGVzOworICAgIH0KKyAgfQorICBzdHJlYW0tPnRvdGFsX2J5dGVzICs9IGVudHJ5LT5zaXplOworICBpZiAoRU5UUllfSVNfS0VZRlJBTUUgKGVudHJ5KSkKKyAgICBzdHJlYW0tPm5fa2V5ZnJhbWVzKys7CisKKyAgLyogYW5kIGFkZCAqLworICBHU1RfTE9HX09CSkVDVCAoYXZpLAorICAgICAgIkFkZGluZyBzdHJlYW0gJXUsIGluZGV4IGVudHJ5ICVkLCBrZiAlZCwgc2l6ZSAldSAiCisgICAgICAiLCBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCB0b3RhbCAlIiBHX0dVSU5UNjRfRk9STUFULCBzdHJlYW0tPm51bSwKKyAgICAgIHN0cmVhbS0+aWR4X24sIEVOVFJZX0lTX0tFWUZSQU1FIChlbnRyeSksIGVudHJ5LT5zaXplLCBlbnRyeS0+b2Zmc2V0LAorICAgICAgZW50cnktPnRvdGFsKTsKKyAgc3RyZWFtLT5pbmRleFtzdHJlYW0tPmlkeF9uKytdID0gKmVudHJ5OworCisgIHJldHVybiBUUlVFOworfQorCisvKiBnaXZlbiBAZW50cnlfbiBpbiBAc3RyZWFtLCBjYWxjdWxhdGUgaW5mbyBzdWNoIGFzIHRpbWVzdGFtcHMgYW5kCisgKiBvZmZzZXRzIGZvciB0aGUgZW50cnkuICovCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9nZXRfYnVmZmVyX2luZm8gKEdzdEF2aURlbXV4ICogYXZpLCBHc3RBdmlTdHJlYW0gKiBzdHJlYW0sCisgICAgZ3VpbnQgZW50cnlfbiwgR3N0Q2xvY2tUaW1lICogdGltZXN0YW1wLCBHc3RDbG9ja1RpbWUgKiB0c19lbmQsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCwgZ3VpbnQ2NCAqIG9mZnNldF9lbmQpCit7CisgIEdzdEF2aUluZGV4RW50cnkgKmVudHJ5OworCisgIGVudHJ5ID0gJnN0cmVhbS0+aW5kZXhbZW50cnlfbl07CisKKyAgaWYgKHN0cmVhbS0+aXNfdmJyKSB7CisgICAgLyogVkJSIHN0cmVhbSBuZXh0IHRpbWVzdGFtcCAqLworICAgIGlmIChzdHJlYW0tPnN0cmgtPnR5cGUgPT0gR1NUX1JJRkZfRkNDX2F1ZHMpIHsKKyAgICAgIGlmICh0aW1lc3RhbXApCisgICAgICAgICp0aW1lc3RhbXAgPQorICAgICAgICAgICAgYXZpX3N0cmVhbV9jb252ZXJ0X2ZyYW1lc190b190aW1lX3VuY2hlY2tlZCAoc3RyZWFtLCBlbnRyeS0+dG90YWwpOworICAgICAgaWYgKHRzX2VuZCkgeworICAgICAgICBnaW50IHNpemUgPSAxOworICAgICAgICBpZiAoR19MSUtFTFkgKGVudHJ5X24gKyAxIDwgc3RyZWFtLT5pZHhfbikpCisgICAgICAgICAgc2l6ZSA9IHN0cmVhbS0+aW5kZXhbZW50cnlfbiArIDFdLnRvdGFsIC0gZW50cnktPnRvdGFsOworICAgICAgICAqdHNfZW5kID0gYXZpX3N0cmVhbV9jb252ZXJ0X2ZyYW1lc190b190aW1lX3VuY2hlY2tlZCAoc3RyZWFtLAorICAgICAgICAgICAgZW50cnktPnRvdGFsICsgc2l6ZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICh0aW1lc3RhbXApCisgICAgICAgICp0aW1lc3RhbXAgPQorICAgICAgICAgICAgYXZpX3N0cmVhbV9jb252ZXJ0X2ZyYW1lc190b190aW1lX3VuY2hlY2tlZCAoc3RyZWFtLCBlbnRyeV9uKTsKKyAgICAgIGlmICh0c19lbmQpCisgICAgICAgICp0c19lbmQgPSBhdmlfc3RyZWFtX2NvbnZlcnRfZnJhbWVzX3RvX3RpbWVfdW5jaGVja2VkIChzdHJlYW0sCisgICAgICAgICAgICBlbnRyeV9uICsgMSk7CisgICAgfQorICB9IGVsc2UgaWYgKHN0cmVhbS0+c3RyaC0+dHlwZSA9PSBHU1RfUklGRl9GQ0NfYXVkcykgeworICAgIC8qIGNvbnN0YW50IHJhdGUgc3RyZWFtICovCisgICAgaWYgKHRpbWVzdGFtcCkKKyAgICAgICp0aW1lc3RhbXAgPQorICAgICAgICAgIGF2aV9zdHJlYW1fY29udmVydF9ieXRlc190b190aW1lX3VuY2hlY2tlZCAoc3RyZWFtLCBlbnRyeS0+dG90YWwpOworICAgIGlmICh0c19lbmQpCisgICAgICAqdHNfZW5kID0gYXZpX3N0cmVhbV9jb252ZXJ0X2J5dGVzX3RvX3RpbWVfdW5jaGVja2VkIChzdHJlYW0sCisgICAgICAgICAgZW50cnktPnRvdGFsICsgZW50cnktPnNpemUpOworICB9CisgIGlmIChzdHJlYW0tPnN0cmgtPnR5cGUgPT0gR1NUX1JJRkZfRkNDX3ZpZHMpIHsKKyAgICAvKiB2aWRlbyBvZmZzZXRzIGFyZSB0aGUgZnJhbWUgbnVtYmVyICovCisgICAgaWYgKG9mZnNldCkKKyAgICAgICpvZmZzZXQgPSBlbnRyeV9uOworICAgIGlmIChvZmZzZXRfZW5kKQorICAgICAgKm9mZnNldF9lbmQgPSBlbnRyeV9uICsgMTsKKyAgfSBlbHNlIHsKKyAgICAvKiBubyBvZmZzZXRzIGZvciBhdWRpbyAqLworICAgIGlmIChvZmZzZXQpCisgICAgICAqb2Zmc2V0ID0gLTE7CisgICAgaWYgKG9mZnNldF9lbmQpCisgICAgICAqb2Zmc2V0X2VuZCA9IC0xOworICB9Cit9CisKKy8qIGNvbGxlY3QgYW5kIGRlYnVnIHN0YXRzIGFib3V0IHRoZSBpbmRleGVzIGZvciBhbGwgc3RyZWFtcy4KKyAqIFRoaXMgbWV0aG9kIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGZpbGxpbmcgaW4gdGhlIHN0cmVhbSBkdXJhdGlvbgorICogYXMgbWVhc3VyZWQgYnkgdGhlIGFtb3VudCBvZiBpbmRleCBlbnRyaWVzLgorICoKKyAqIFJldHVybnMgVFJVRSBpZiB0aGUgaW5kZXggaXMgbm90IGVtcHR5LCBlbHNlIEZBTFNFICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdmlfZGVtdXhfZG9faW5kZXhfc3RhdHMgKEdzdEF2aURlbXV4ICogYXZpKQoreworICBndWludCB0b3RhbF9pZHggPSAwOworICBndWludCBpOworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgZ3VpbnQgdG90YWxfbWF4ID0gMDsKKyNlbmRpZgorCisgIC8qIGdldCBzdHJlYW0gc3RhdHMgbm93ICovCisgIGZvciAoaSA9IDA7IGkgPCBhdmktPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICBHc3RBdmlTdHJlYW0gKnN0cmVhbTsKKworICAgIGlmIChHX1VOTElLRUxZICghKHN0cmVhbSA9ICZhdmktPnN0cmVhbVtpXSkpKQorICAgICAgY29udGludWU7CisgICAgaWYgKEdfVU5MSUtFTFkgKCFzdHJlYW0tPnN0cmgpKQorICAgICAgY29udGludWU7CisgICAgaWYgKEdfVU5MSUtFTFkgKCFzdHJlYW0tPmluZGV4IHx8IHN0cmVhbS0+aWR4X24gPT0gMCkpCisgICAgICBjb250aW51ZTsKKworICAgIC8qIHdlIGludGVyZXN0ZWQgaW4gdGhlIGVuZF90cyBvZiB0aGUgbGFzdCBlbnRyeSwgd2hpY2ggaXMgdGhlIHRvdGFsCisgICAgICogZHVyYXRpb24gb2YgdGhpcyBzdHJlYW0gKi8KKyAgICBnc3RfYXZpX2RlbXV4X2dldF9idWZmZXJfaW5mbyAoYXZpLCBzdHJlYW0sIHN0cmVhbS0+aWR4X24gLSAxLAorICAgICAgICBOVUxMLCAmc3RyZWFtLT5pZHhfZHVyYXRpb24sIE5VTEwsIE5VTEwpOworCisgICAgdG90YWxfaWR4ICs9IHN0cmVhbS0+aWR4X247CisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworICAgIHRvdGFsX21heCArPSBzdHJlYW0tPmlkeF9tYXg7CisjZW5kaWYKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgIlN0cmVhbSAlZCwgZHVyICUiIEdTVF9USU1FX0ZPUk1BVCAiLCAlNnUgZW50cmllcywgIgorICAgICAgICAiJTV1IGtleWZyYW1lcywgZW50cnkgc2l6ZSA9ICUydSwgdG90YWwgc2l6ZSA9ICUxMHUsIGFsbG9jYXRlZCAlMTB1IiwKKyAgICAgICAgaSwgR1NUX1RJTUVfQVJHUyAoc3RyZWFtLT5pZHhfZHVyYXRpb24pLCBzdHJlYW0tPmlkeF9uLAorICAgICAgICBzdHJlYW0tPm5fa2V5ZnJhbWVzLCAoZ3VpbnQpIHNpemVvZiAoR3N0QXZpSW5kZXhFbnRyeSksCisgICAgICAgIChndWludCkgKHN0cmVhbS0+aWR4X24gKiBzaXplb2YgKEdzdEF2aUluZGV4RW50cnkpKSwKKyAgICAgICAgKGd1aW50KSAoc3RyZWFtLT5pZHhfbWF4ICogc2l6ZW9mIChHc3RBdmlJbmRleEVudHJ5KSkpOworCisgICAgLyoga25vd2luZyBhbGwgdGhhdCB3ZSBkbywgdGhhdCBhbHNvIGluY2x1ZGVzIGF2ZyBiaXRyYXRlICovCisgICAgaWYgKCFzdHJlYW0tPnRhZ2xpc3QpIHsKKyAgICAgIHN0cmVhbS0+dGFnbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgICAgfQorICAgIGlmIChzdHJlYW0tPnRvdGFsX2J5dGVzICYmIHN0cmVhbS0+aWR4X2R1cmF0aW9uKQorICAgICAgZ3N0X3RhZ19saXN0X2FkZCAoc3RyZWFtLT50YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgR1NUX1RBR19CSVRSQVRFLAorICAgICAgICAgIChndWludCkgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzdHJlYW0tPnRvdGFsX2J5dGVzICogOCwKKyAgICAgICAgICAgICAgR1NUX1NFQ09ORCwgc3RyZWFtLT5pZHhfZHVyYXRpb24pLCBOVUxMKTsKKyAgfQorICB0b3RhbF9pZHggKj0gc2l6ZW9mIChHc3RBdmlJbmRleEVudHJ5KTsKKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgIHRvdGFsX21heCAqPSBzaXplb2YgKEdzdEF2aUluZGV4RW50cnkpOworI2VuZGlmCisgIEdTVF9JTkZPX09CSkVDVCAoYXZpLCAiJXUgYnl0ZXMgZm9yIGluZGV4IHZzICV1IGlkZWFsbHksICV1IHdhc3RlZCIsCisgICAgICB0b3RhbF9tYXgsIHRvdGFsX2lkeCwgdG90YWxfbWF4IC0gdG90YWxfaWR4KTsKKworICBpZiAodG90YWxfaWR4ID09IDApIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aSwgIkluZGV4IGlzIGVtcHR5ICEiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBnc3RfYXZpX2RlbXV4X3BhcnNlX3N1YmluZGV4OgorICogQGF2aTogQXZpIG9iamVjdAorICogQGJ1ZjogaW5wdXQgZGF0YSB0byB1c2UgZm9yIHBhcnNpbmcuCisgKiBAc3RyZWFtOiBzdHJlYW0gY29udGV4dC4KKyAqIEBlbnRyaWVzX2xpc3Q6IGEgbGlzdCAocmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uKSBjb250YWluaW5nIGFsbCB0aGUKKyAqICAgICAgICAgICBpbmRleGVzIHBhcnNlZCBpbiB0aGlzIHNwZWNpZmljIHN1YmluZGV4LiBUaGUgZmlyc3QKKyAqICAgICAgICAgICBlbnRyeSBpcyBhbHNvIGEgcG9pbnRlciB0byBhbGxvY2F0ZWQgbWVtb3J5IHRoYXQgbmVlZHMKKyAqICAgICAgICAgICB0byBiZSBmcmVlwrRlZC4gTWF5IGJlIE5VTEwgaWYgbm8gc3VwcG9ydGVkIGluZGV4ZXMgd2VyZQorICogICAgICAgICAgIGZvdW5kLgorICoKKyAqIFJlYWRzIHN1cGVyaW5kZXggKG9wZW5ETUwtMiBzcGVjIHN0dWZmKSBmcm9tIHRoZSBwcm92aWRlZCBkYXRhLgorICogVGhlIGJ1ZmZlciBzaG91bGQgY29udGFpbiBhIEdTVF9SSUZGX1RBR19peD8/IGNodW5rLgorICoKKyAqIFJldHVybnM6IFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb3RoZXJ3aXNlLiBFcnJvcnMgYXJlIGZhdGFsLCB3ZQorICogICAgICAgICAgdGhyb3cgYW4gZXJyb3IsIGNhbGxlciBzaG91bGQgYmFpbCBvdXQgYXNhcC4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYXZpX2RlbXV4X3BhcnNlX3N1YmluZGV4IChHc3RBdmlEZW11eCAqIGF2aSwgR3N0QXZpU3RyZWFtICogc3RyZWFtLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQxNiBicGU7CisgIGd1aW50MzIgbnVtLCBpOworICBndWludDY0IGJhc2VvZmY7CisKKyAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKworICAvKiBjaGVjayBzaXplICovCisgIGlmIChtYXAuc2l6ZSA8IDI0KQorICAgIGdvdG8gdG9vX3NtYWxsOworCisgIC8qIFdlIGRvbid0IHN1cHBvcnQgaW5kZXgtZGF0YSB5ZXQgKi8KKyAgaWYgKGRhdGFbM10gJiAweDgwKQorICAgIGdvdG8gbm90X2ltcGxlbWVudGVkOworCisgIC8qIGNoZWNrIHR5cGUgb2YgaW5kZXguIFRoZSBvcGVuZG1sMiBzcGVjcyBzdGF0ZSB0aGF0CisgICAqIHRoZXJlIHNob3VsZCBiZSA0IGR3b3JkcyBwZXIgYXJyYXkgZW50cnkuIFR5cGUgY2FuIGJlCisgICAqIGVpdGhlciBmcmFtZSBvciBmaWVsZCAoYW5kIHdlIGRvbid0IGNhcmUpLiAqLworICBicGUgPSAoZGF0YVsyXSAmIDB4MDEpID8gMTIgOiA4OworICBpZiAoR1NUX1JFQURfVUlOVDE2X0xFIChkYXRhKSAhPSBicGUgLyA0IHx8CisgICAgICAoZGF0YVsyXSAmIDB4ZmUpICE9IDB4MCB8fCBkYXRhWzNdICE9IDB4MSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLAorICAgICAgICAiU3VwZXJpbmRleCBmb3Igc3RyZWFtICVkIGhhcyB1bmV4cGVjdGVkICIKKyAgICAgICAgInNpemVfZW50cnkgJWQgKGJ5dGVzKSBvciBmbGFncyAweCUwMngvMHglMDJ4IiwKKyAgICAgICAgc3RyZWFtLT5udW0sIEdTVF9SRUFEX1VJTlQxNl9MRSAoZGF0YSksIGRhdGFbMl0sIGRhdGFbM10pOworICAgIGJwZSA9IEdTVF9SRUFEX1VJTlQxNl9MRSAoZGF0YSkgKiA0OworICB9CisgIG51bSA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoJmRhdGFbNF0pOworICBiYXNlb2ZmID0gR1NUX1JFQURfVUlOVDY0X0xFICgmZGF0YVsxMl0pOworCisgIC8qIElmIHRoZXJlJ3Mgbm90aGluZywganVzdCByZXR1cm4gISAqLworICBpZiAobnVtID09IDApCisgICAgZ290byBlbXB0eV9pbmRleDsKKworICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgIlBhcnNpbmcgc3ViaW5kZXgsIG5yX2VudHJpZXMgPSAlNmQiLCBudW0pOworCisgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgIEdzdEF2aUluZGV4RW50cnkgZW50cnk7CisKKyAgICBpZiAobWFwLnNpemUgPCAyNCArIGJwZSAqIChpICsgMSkpCisgICAgICBicmVhazsKKworICAgIC8qIGZpbGwgaW4gb2Zmc2V0IGFuZCBzaXplLiBvZmZzZXQgY29udGFpbnMgdGhlIGtleWZyYW1lIGZsYWcgaW4gdGhlCisgICAgICogdXBwZXIgYml0Ki8KKyAgICBlbnRyeS5vZmZzZXQgPSBiYXNlb2ZmICsgR1NUX1JFQURfVUlOVDMyX0xFICgmZGF0YVsyNCArIGJwZSAqIGldKTsKKyAgICBlbnRyeS5zaXplID0gR1NUX1JFQURfVUlOVDMyX0xFICgmZGF0YVsyNCArIGJwZSAqIGkgKyA0XSk7CisgICAgLyogaGFuZGxlIGZsYWdzICovCisgICAgaWYgKHN0cmVhbS0+c3RyaC0+dHlwZSA9PSBHU1RfUklGRl9GQ0NfYXVkcykgeworICAgICAgLyogYWxsIGF1ZGlvIGZyYW1lcyBhcmUga2V5ZnJhbWVzICovCisgICAgICBFTlRSWV9TRVRfS0VZRlJBTUUgKCZlbnRyeSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGVsc2UgcmVhZCBmbGFncyAqLworICAgICAgZW50cnkuZmxhZ3MgPSAoZW50cnkuc2l6ZSAmIDB4ODAwMDAwMDApID8gMCA6IEdTVF9BVklfS0VZRlJBTUU7CisgICAgfQorICAgIGVudHJ5LnNpemUgJj0gfjB4ODAwMDAwMDA7CisKKyAgICAvKiBhbmQgYWRkICovCisgICAgaWYgKEdfVU5MSUtFTFkgKCFnc3RfYXZpX2RlbXV4X2FkZF9pbmRleCAoYXZpLCBzdHJlYW0sIG51bSwgJmVudHJ5KSkpCisgICAgICBnb3RvIG91dF9vZl9tZW07CisgIH0KK2RvbmU6CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCit0b29fc21hbGw6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChhdmksCisgICAgICAgICJOb3QgZW5vdWdoIGRhdGEgdG8gcGFyc2Ugc3ViaW5kZXggKCUiIEdfR1NJWkVfRk9STUFUCisgICAgICAgICIgYXZhaWxhYmxlLCAyNCBuZWVkZWQpIiwgbWFwLnNpemUpOworICAgIGdvdG8gZG9uZTsgICAgICAgICAgICAgICAgICAvKiBjb250aW51ZSAqLworICB9Citub3RfaW1wbGVtZW50ZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXZpLCBTVFJFQU0sIE5PVF9JTVBMRU1FTlRFRCwgKE5VTEwpLAorICAgICAgICAoIlN1YmluZGV4LWlzLWRhdGEgaXMgbm90IGltcGxlbWVudGVkIikpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2VtcHR5X2luZGV4OgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAidGhlIGluZGV4IGlzIGVtcHR5Iik7CisgICAgZ290byBkb25lOyAgICAgICAgICAgICAgICAgIC8qIGNvbnRpbnVlICovCisgIH0KK291dF9vZl9tZW06CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXZpLCBSRVNPVVJDRSwgTk9fU1BBQ0VfTEVGVCwgKE5VTEwpLAorICAgICAgICAoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yICV1KiV1PSV1IGJ5dGVzIiwKKyAgICAgICAgICAgIChndWludCkgc2l6ZW9mIChHc3RBdmlJbmRleEVudHJ5KSwgbnVtLAorICAgICAgICAgICAgKGd1aW50KSBzaXplb2YgKEdzdEF2aUluZGV4RW50cnkpICogbnVtKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKgorICogQ3JlYXRlIGFuZCBwdXNoIGEgZmx1c2hpbmcgc2VlayBldmVudCB1cHN0cmVhbQorICovCitzdGF0aWMgZ2Jvb2xlYW4KK3BlcmZvcm1fc2Vla190b19vZmZzZXQgKEdzdEF2aURlbXV4ICogZGVtdXgsIGd1aW50NjQgb2Zmc2V0LCBndWludDMyIHNlcW51bSkKK3sKKyAgR3N0RXZlbnQgKmV2ZW50OworICBnYm9vbGVhbiByZXMgPSAwOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiU2Vla2luZyB0byAlIiBHX0dVSU5UNjRfRk9STUFULCBvZmZzZXQpOworCisgIGV2ZW50ID0KKyAgICAgIGdzdF9ldmVudF9uZXdfc2VlayAoMS4wLCBHU1RfRk9STUFUX0JZVEVTLAorICAgICAgR1NUX1NFRUtfRkxBR19GTFVTSCB8IEdTVF9TRUVLX0ZMQUdfQUNDVVJBVEUsIEdTVF9TRUVLX1RZUEVfU0VULCBvZmZzZXQsCisgICAgICBHU1RfU0VFS19UWVBFX05PTkUsIC0xKTsKKyAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGV2ZW50LCBzZXFudW0pOworICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKGRlbXV4LT5zaW5rcGFkLCBldmVudCk7CisKKyAgaWYgKHJlcykKKyAgICBkZW11eC0+b2Zmc2V0ID0gb2Zmc2V0OworICByZXR1cm4gcmVzOworfQorCisvKgorICogUmVhZCBBVkkgaW5kZXggd2hlbiBzdHJlYW1pbmcKKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYXZpX2RlbXV4X3JlYWRfc3ViaW5kZXhlc19wdXNoIChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgZ3VpbnQzMiB0YWcgPSAwLCBzaXplOworICBHc3RCdWZmZXIgKmJ1ZiA9IE5VTEw7CisgIGd1aW50IG9kbWxfc3RyZWFtOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInJlYWQgc3ViaW5kZXhlcyBmb3IgJWQgc3RyZWFtcyIsIGF2aS0+bnVtX3N0cmVhbXMpOworCisgIGlmIChhdmktPm9kbWxfc3ViaWR4c1thdmktPm9kbWxfc3ViaWR4XSAhPSBhdmktPm9mZnNldCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfYXZpX2RlbXV4X3BlZWtfY2h1bmsgKGF2aSwgJnRhZywgJnNpemUpKQorICAgIHJldHVybiBUUlVFOworCisgIC8qIHRoaXMgaXMgdGhlIE9ETUwgY2h1bmsgd2UgZXhwZWN0ICovCisgIG9kbWxfc3RyZWFtID0gYXZpLT5vZG1sX3N0cmVhbTsKKworICBpZiAoKHRhZyAhPSBHU1RfTUFLRV9GT1VSQ0MgKCdpJywgJ3gnLCAnMCcgKyBvZG1sX3N0cmVhbSAvIDEwLAorICAgICAgICAgICAgICAnMCcgKyBvZG1sX3N0cmVhbSAlIDEwKSkgJiYKKyAgICAgICh0YWcgIT0gR1NUX01BS0VfRk9VUkNDICgnMCcgKyBvZG1sX3N0cmVhbSAvIDEwLAorICAgICAgICAgICAgICAnMCcgKyBvZG1sX3N0cmVhbSAlIDEwLCAnaScsICd4JykpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksICJOb3QgYW4gaXgjIyBjaHVuayAoJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIikiLAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHRhZykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGF2aS0+b2Zmc2V0ICs9IDggKyBHU1RfUk9VTkRfVVBfMiAoc2l6ZSk7CisgIC8qIGZsdXNoIGNodW5rIGhlYWRlciBzbyB3ZSBnZXQganVzdCB0aGUgJ3NpemUnIHBheWxvYWQgZGF0YSAqLworICBnc3RfYWRhcHRlcl9mbHVzaCAoYXZpLT5hZGFwdGVyLCA4KTsKKyAgYnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKGF2aS0+YWRhcHRlciwgc2l6ZSk7CisKKyAgaWYgKCFnc3RfYXZpX2RlbXV4X3BhcnNlX3N1YmluZGV4IChhdmksICZhdmktPnN0cmVhbVtvZG1sX3N0cmVhbV0sIGJ1ZikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIHdlIHBhcnNlZCB0aGUgaW5kZXgsIGdvIHRvIG5leHQgc3ViaW5kZXggKi8KKyAgYXZpLT5vZG1sX3N1YmlkeCsrOworCisgIGlmIChhdmktPm9kbWxfc3ViaWR4c1thdmktPm9kbWxfc3ViaWR4XSA9PSBHU1RfQlVGRkVSX09GRlNFVF9OT05FKSB7CisgICAgLyogd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbmRleGVzIGZvciB0aGlzIHN0cmVhbSwgbW92ZSB0byB0aGUgbmV4dAorICAgICAqIHN0cmVhbSB0byBoYW5kbGUgdGhlIGZpcnN0IGluZGV4ICovCisgICAgYXZpLT5vZG1sX3N0cmVhbSsrOworICAgIGF2aS0+b2RtbF9zdWJpZHggPSAwOworCisgICAgaWYgKGF2aS0+b2RtbF9zdHJlYW0gPCBhdmktPm51bV9zdHJlYW1zKSB7CisgICAgICAvKiB0aGVyZSBhcmUgbW9yZSBpbmRleGVzICovCisgICAgICBhdmktPm9kbWxfc3ViaWR4cyA9IGF2aS0+c3RyZWFtW2F2aS0+b2RtbF9zdHJlYW1dLmluZGV4ZXM7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHdlJ3JlIGRvbmUsIGdldCBzdHJlYW0gc3RhdHMgbm93ICovCisgICAgICBhdmktPmhhdmVfaW5kZXggPSBnc3RfYXZpX2RlbXV4X2RvX2luZGV4X3N0YXRzIChhdmkpOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKworICAvKiBzZWVrIHRvIG5leHQgaW5kZXggKi8KKyAgcmV0dXJuIHBlcmZvcm1fc2Vla190b19vZmZzZXQgKGF2aSwgYXZpLT5vZG1sX3N1YmlkeHNbYXZpLT5vZG1sX3N1YmlkeF0sCisgICAgICBhdmktPnNlZ21lbnRfc2VxbnVtKTsKK30KKworLyoKKyAqIFJlYWQgQVZJIGluZGV4CisgKi8KK3N0YXRpYyB2b2lkCitnc3RfYXZpX2RlbXV4X3JlYWRfc3ViaW5kZXhlc19wdWxsIChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgZ3VpbnQzMiB0YWc7CisgIEdzdEJ1ZmZlciAqYnVmOworICBnaW50IGksIG47CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAicmVhZCBzdWJpbmRleGVzIGZvciAlZCBzdHJlYW1zIiwgYXZpLT5udW1fc3RyZWFtcyk7CisKKyAgZm9yIChuID0gMDsgbiA8IGF2aS0+bnVtX3N0cmVhbXM7IG4rKykgeworICAgIEdzdEF2aVN0cmVhbSAqc3RyZWFtID0gJmF2aS0+c3RyZWFtW25dOworCisgICAgaWYgKHN0cmVhbS0+aW5kZXhlcyA9PSBOVUxMKQorICAgICAgY29udGludWU7CisKKyAgICBmb3IgKGkgPSAwOyBzdHJlYW0tPmluZGV4ZXNbaV0gIT0gR1NUX0JVRkZFUl9PRkZTRVRfTk9ORTsgaSsrKSB7CisgICAgICBpZiAoZ3N0X3JpZmZfcmVhZF9jaHVuayAoR1NUX0VMRU1FTlRfQ0FTVCAoYXZpKSwgYXZpLT5zaW5rcGFkLAorICAgICAgICAgICAgICAmc3RyZWFtLT5pbmRleGVzW2ldLCAmdGFnLCAmYnVmKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgY29udGludWU7CisgICAgICBlbHNlIGlmICgodGFnICE9IEdTVF9NQUtFX0ZPVVJDQyAoJ2knLCAneCcsICcwJyArIHN0cmVhbS0+bnVtIC8gMTAsCisgICAgICAgICAgICAgICAgICAnMCcgKyBzdHJlYW0tPm51bSAlIDEwKSkgJiYKKyAgICAgICAgICAodGFnICE9IEdTVF9NQUtFX0ZPVVJDQyAoJzAnICsgc3RyZWFtLT5udW0gLyAxMCwKKyAgICAgICAgICAgICAgICAgICcwJyArIHN0cmVhbS0+bnVtICUgMTAsICdpJywgJ3gnKSkpIHsKKyAgICAgICAgLyogU29tZSBPRE1MIGZpbGVzIChjcmVhdGVkIGJ5IGdvZCBrbm93cyB3aGF0IG11eGVyKSBoYXZlIGEgIyNpeCBmb3JtYXQKKyAgICAgICAgICogaW5zdGVhZCBvZiB0aGUgJ29mZmljaWFsJyBpeCMjLiBUaGV5IGFyZSBzdGlsbCB2YWxpZCB0aG91Z2guICovCisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLCAiTm90IGFuIGl4IyMgY2h1bmsgKCUiIEdTVF9GT1VSQ0NfRk9STUFUICIpIiwKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSk7CisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoIWdzdF9hdmlfZGVtdXhfcGFyc2Vfc3ViaW5kZXggKGF2aSwgc3RyZWFtLCBidWYpKQorICAgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBnX2ZyZWUgKHN0cmVhbS0+aW5kZXhlcyk7CisgICAgc3RyZWFtLT5pbmRleGVzID0gTlVMTDsKKyAgfQorICAvKiBnZXQgc3RyZWFtIHN0YXRzIG5vdyAqLworICBhdmktPmhhdmVfaW5kZXggPSBnc3RfYXZpX2RlbXV4X2RvX2luZGV4X3N0YXRzIChhdmkpOworfQorCisvKgorICogZ3N0X2F2aV9kZW11eF9yaWZmX3BhcnNlX3ZwcnA6CisgKiBAZWxlbWVudDogY2FsbGVyIGVsZW1lbnQgKHVzZWQgZm9yIGRlYnVnZ2luZy9lcnJvcikuCisgKiBAYnVmOiBpbnB1dCBkYXRhIHRvIGJlIHVzZWQgZm9yIHBhcnNpbmcsIHN0cmlwcGVkIGZyb20gaGVhZGVyLgorICogQHZwcnA6IGEgcG9pbnRlciAocmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbikgdG8gYSBmaWxsZWQtaW4gdnBycAorICogICAgICAgIHN0cnVjdHVyZS4gQ2FsbGVyIHNob3VsZCBmcmVlIGl0LgorICoKKyAqIFBhcnNlcyBhIHZpZGVvIHN0cmVhbcK0cyB2cHJwLiBUaGlzIGZ1bmN0aW9uIHRha2VzIG93bmVyc2hpcCBvZiBAYnVmLgorICoKKyAqIFJldHVybnM6IFRSVUUgaWYgcGFyc2luZyBzdWNjZWVkZWQsIG90aGVyd2lzZSBGQUxTRS4gVGhlIHN0cmVhbQorICogICAgICAgICAgc2hvdWxkIGJlIHNraXBwZWQgb24gZXJyb3IsIGJ1dCBpdCBpcyBub3QgZmF0YWwuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F2aV9kZW11eF9yaWZmX3BhcnNlX3ZwcnAgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZiwgZ3N0X3JpZmZfdnBycCAqKiBfdnBycCkKK3sKKyAgZ3N0X3JpZmZfdnBycCAqdnBycDsKKyAgZ2ludCBrOworICBnc2l6ZSBzaXplOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChidWYgIT0gTlVMTCwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoX3ZwcnAgIT0gTlVMTCwgRkFMU0UpOworCisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpOworCisgIGlmIChzaXplIDwgR19TVFJVQ1RfT0ZGU0VUIChnc3RfcmlmZl92cHJwLCBmaWVsZF9pbmZvKSkKKyAgICBnb3RvIHRvb19zbWFsbDsKKworICB2cHJwID0gZ19tYWxsb2MgKHNpemUpOworICBnc3RfYnVmZmVyX2V4dHJhY3QgKGJ1ZiwgMCwgdnBycCwgc2l6ZSk7CisKKyNpZiAoR19CWVRFX09SREVSID09IEdfQklHX0VORElBTikKKyAgdnBycC0+Zm9ybWF0X3Rva2VuID0gR1VJTlQzMl9GUk9NX0xFICh2cHJwLT5mb3JtYXRfdG9rZW4pOworICB2cHJwLT5zdGFuZGFyZCA9IEdVSU5UMzJfRlJPTV9MRSAodnBycC0+c3RhbmRhcmQpOworICB2cHJwLT52ZXJ0X3JhdGUgPSBHVUlOVDMyX0ZST01fTEUgKHZwcnAtPnZlcnRfcmF0ZSk7CisgIHZwcnAtPmhvcl90X3RvdGFsID0gR1VJTlQzMl9GUk9NX0xFICh2cHJwLT5ob3JfdF90b3RhbCk7CisgIHZwcnAtPnZlcnRfbGluZXMgPSBHVUlOVDMyX0ZST01fTEUgKHZwcnAtPnZlcnRfbGluZXMpOworICB2cHJwLT5hc3BlY3QgPSBHVUlOVDMyX0ZST01fTEUgKHZwcnAtPmFzcGVjdCk7CisgIHZwcnAtPndpZHRoID0gR1VJTlQzMl9GUk9NX0xFICh2cHJwLT53aWR0aCk7CisgIHZwcnAtPmhlaWdodCA9IEdVSU5UMzJfRlJPTV9MRSAodnBycC0+aGVpZ2h0KTsKKyAgdnBycC0+ZmllbGRzID0gR1VJTlQzMl9GUk9NX0xFICh2cHJwLT5maWVsZHMpOworI2VuZGlmCisKKyAgLyogc2l6ZSBjaGVja2luZyAqLworICAvKiBjYWxjdWxhdGUgZmllbGRzIGJhc2VkIG9uIHNpemUgKi8KKyAgayA9IChzaXplIC0gR19TVFJVQ1RfT0ZGU0VUIChnc3RfcmlmZl92cHJwLCBmaWVsZF9pbmZvKSkgLyB2cHJwLT5maWVsZHM7CisgIGlmICh2cHJwLT5maWVsZHMgPiBrKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbGVtZW50LAorICAgICAgICAidnBycCBoZWFkZXIgaW5kaWNhdGVkICVkIGZpZWxkcywgb25seSAlZCBhdmFpbGFibGUiLCB2cHJwLT5maWVsZHMsIGspOworICAgIHZwcnAtPmZpZWxkcyA9IGs7CisgIH0KKyAgaWYgKHZwcnAtPmZpZWxkcyA+IEdTVF9SSUZGX1ZQUlBfVklERU9fRklFTERTKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbGVtZW50LAorICAgICAgICAidnBycCBoZWFkZXIgaW5kaWNhdGVkICVkIGZpZWxkcywgYXQgbW9zdCAlZCBzdXBwb3J0ZWQiLCB2cHJwLT5maWVsZHMsCisgICAgICAgIEdTVF9SSUZGX1ZQUlBfVklERU9fRklFTERTKTsKKyAgICB2cHJwLT5maWVsZHMgPSBHU1RfUklGRl9WUFJQX1ZJREVPX0ZJRUxEUzsKKyAgfQorI2lmIChHX0JZVEVfT1JERVIgPT0gR19CSUdfRU5ESUFOKQorICBmb3IgKGsgPSAwOyBrIDwgdnBycC0+ZmllbGRzOyBrKyspIHsKKyAgICBnc3RfcmlmZl92cHJwX3ZpZGVvX2ZpZWxkX2Rlc2MgKmZkOworCisgICAgZmQgPSAmdnBycC0+ZmllbGRfaW5mb1trXTsKKyAgICBmZC0+Y29tcHJlc3NlZF9ibV9oZWlnaHQgPSBHVUlOVDMyX0ZST01fTEUgKGZkLT5jb21wcmVzc2VkX2JtX2hlaWdodCk7CisgICAgZmQtPmNvbXByZXNzZWRfYm1fd2lkdGggPSBHVUlOVDMyX0ZST01fTEUgKGZkLT5jb21wcmVzc2VkX2JtX3dpZHRoKTsKKyAgICBmZC0+dmFsaWRfYm1faGVpZ2h0ID0gR1VJTlQzMl9GUk9NX0xFIChmZC0+dmFsaWRfYm1faGVpZ2h0KTsKKyAgICBmZC0+dmFsaWRfYm1fd2lkdGggPSBHVUlOVDE2X0ZST01fTEUgKGZkLT52YWxpZF9ibV93aWR0aCk7CisgICAgZmQtPnZhbGlkX2JtX3hfb2Zmc2V0ID0gR1VJTlQxNl9GUk9NX0xFIChmZC0+dmFsaWRfYm1feF9vZmZzZXQpOworICAgIGZkLT52YWxpZF9ibV95X29mZnNldCA9IEdVSU5UMzJfRlJPTV9MRSAoZmQtPnZhbGlkX2JtX3lfb2Zmc2V0KTsKKyAgICBmZC0+dmlkZW9feF90X29mZnNldCA9IEdVSU5UMzJfRlJPTV9MRSAoZmQtPnZpZGVvX3hfdF9vZmZzZXQpOworICAgIGZkLT52aWRlb195X3N0YXJ0ID0gR1VJTlQzMl9GUk9NX0xFIChmZC0+dmlkZW9feV9zdGFydCk7CisgIH0KKyNlbmRpZgorCisgIC8qIGRlYnVnICovCisgIEdTVF9JTkZPX09CSkVDVCAoZWxlbWVudCwgInZwcnAgdGFnIGZvdW5kIGluIGNvbnRleHQgdmlkczoiKTsKKyAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiIGZvcm1hdF90b2tlbiAgJWQiLCB2cHJwLT5mb3JtYXRfdG9rZW4pOworICBHU1RfSU5GT19PQkpFQ1QgKGVsZW1lbnQsICIgc3RhbmRhcmQgICAgICAlZCIsIHZwcnAtPnN0YW5kYXJkKTsKKyAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiIHZlcnRfcmF0ZSAgICAgJWQiLCB2cHJwLT52ZXJ0X3JhdGUpOworICBHU1RfSU5GT19PQkpFQ1QgKGVsZW1lbnQsICIgaG9yX3RfdG90YWwgICAlZCIsIHZwcnAtPmhvcl90X3RvdGFsKTsKKyAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiIHZlcnRfbGluZXMgICAgJWQiLCB2cHJwLT52ZXJ0X2xpbmVzKTsKKyAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiIGFzcGVjdCAgICAgICAgJWQ6JWQiLCB2cHJwLT5hc3BlY3QgPj4gMTYsCisgICAgICB2cHJwLT5hc3BlY3QgJiAweGZmZmYpOworICBHU1RfSU5GT19PQkpFQ1QgKGVsZW1lbnQsICIgd2lkdGggICAgICAgICAlZCIsIHZwcnAtPndpZHRoKTsKKyAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiIGhlaWdodCAgICAgICAgJWQiLCB2cHJwLT5oZWlnaHQpOworICBHU1RfSU5GT19PQkpFQ1QgKGVsZW1lbnQsICIgZmllbGRzICAgICAgICAlZCIsIHZwcnAtPmZpZWxkcyk7CisgIGZvciAoayA9IDA7IGsgPCB2cHJwLT5maWVsZHM7IGsrKykgeworICAgIGdzdF9yaWZmX3ZwcnBfdmlkZW9fZmllbGRfZGVzYyAqZmQ7CisKKyAgICBmZCA9ICYodnBycC0+ZmllbGRfaW5mb1trXSk7CisgICAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiIGZpZWxkICV1IGRlc2NyaXB0aW9uOiIsIGspOworICAgIEdTVF9JTkZPX09CSkVDVCAoZWxlbWVudCwgIiAgY29tcHJlc3NlZF9ibV9oZWlnaHQgICVkIiwKKyAgICAgICAgZmQtPmNvbXByZXNzZWRfYm1faGVpZ2h0KTsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGVsZW1lbnQsICIgIGNvbXByZXNzZWRfYm1fd2lkdGggICVkIiwKKyAgICAgICAgZmQtPmNvbXByZXNzZWRfYm1fd2lkdGgpOworICAgIEdTVF9JTkZPX09CSkVDVCAoZWxlbWVudCwgIiAgdmFsaWRfYm1faGVpZ2h0ICAgICAgICVkIiwKKyAgICAgICAgZmQtPnZhbGlkX2JtX2hlaWdodCk7CisgICAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiICB2YWxpZF9ibV93aWR0aCAgICAgICAgJWQiLCBmZC0+dmFsaWRfYm1fd2lkdGgpOworICAgIEdTVF9JTkZPX09CSkVDVCAoZWxlbWVudCwgIiAgdmFsaWRfYm1feF9vZmZzZXQgICAgICVkIiwKKyAgICAgICAgZmQtPnZhbGlkX2JtX3hfb2Zmc2V0KTsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGVsZW1lbnQsICIgIHZhbGlkX2JtX3lfb2Zmc2V0ICAgICAlZCIsCisgICAgICAgIGZkLT52YWxpZF9ibV95X29mZnNldCk7CisgICAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiICB2aWRlb194X3Rfb2Zmc2V0ICAgICAgJWQiLAorICAgICAgICBmZC0+dmlkZW9feF90X29mZnNldCk7CisgICAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiICB2aWRlb195X3N0YXJ0ICAgICAgICAgJWQiLCBmZC0+dmlkZW9feV9zdGFydCk7CisgIH0KKworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgICpfdnBycCA9IHZwcnA7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCit0b29fc21hbGw6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChlbGVtZW50LAorICAgICAgICAiVG9vIHNtYWxsIHZwcnAgKCUiIEdfR1NJWkVfRk9STUFUICIgYXZhaWxhYmxlLCBhdCBsZWFzdCAlZCBuZWVkZWQpIiwKKyAgICAgICAgc2l6ZSwgKGludCkgR19TVFJVQ1RfT0ZGU0VUIChnc3RfcmlmZl92cHJwLCBmaWVsZF9pbmZvKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdmlfZGVtdXhfZXhwb3NlX3N0cmVhbXMgKEdzdEF2aURlbXV4ICogYXZpLCBnYm9vbGVhbiBmb3JjZSkKK3sKKyAgZ3VpbnQgaTsKKworICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJmb3JjZSA6ICVkIiwgZm9yY2UpOworCisgIGZvciAoaSA9IDA7IGkgPCBhdmktPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICBHc3RBdmlTdHJlYW0gKnN0cmVhbSA9ICZhdmktPnN0cmVhbVtpXTsKKworICAgIGlmIChmb3JjZSB8fCBzdHJlYW0tPmlkeF9uICE9IDApIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChhdmksICJBZGRpbmcgcGFkICVzIiwgR1NUX1BBRF9OQU1FIChzdHJlYW0tPnBhZCkpOworICAgICAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoKEdzdEVsZW1lbnQgKikgYXZpLCBzdHJlYW0tPnBhZCk7CisgICAgICBnc3RfZmxvd19jb21iaW5lcl9hZGRfcGFkIChhdmktPmZsb3djb21iaW5lciwgc3RyZWFtLT5wYWQpOworCisjaWYgMAorICAgICAgaWYgKGF2aS0+ZWxlbWVudF9pbmRleCkKKyAgICAgICAgZ3N0X2luZGV4X2dldF93cml0ZXJfaWQgKGF2aS0+ZWxlbWVudF9pbmRleCwKKyAgICAgICAgICAgIEdTVF9PQkpFQ1RfQ0FTVCAoc3RyZWFtLT5wYWQpLCAmc3RyZWFtLT5pbmRleF9pZCk7CisjZW5kaWYKKworICAgICAgc3RyZWFtLT5leHBvc2VkID0gVFJVRTsKKyAgICAgIGlmIChhdmktPm1haW5fc3RyZWFtID09IC0xKQorICAgICAgICBhdmktPm1haW5fc3RyZWFtID0gaTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksICJTdHJlYW0gIyVkIGRvZXNuJ3QgaGF2ZSBhbnkgZW50cnksIHJlbW92aW5nIGl0IiwKKyAgICAgICAgICBpKTsKKyAgICAgIGdzdF9hdmlfZGVtdXhfcmVzZXRfc3RyZWFtIChhdmksIHN0cmVhbSk7CisgICAgfQorICB9Cit9CisKKy8qIGJ1ZiBjb250YWlucyBMSVNUIGNodW5rIGRhdGEsIGFuZCB3aWxsIGJlIHBhZGRlZCB0byBldmVuIHNpemUsCisgKiBzaW5jZSBzb21lIGJ1Z2d5IGZpbGVzIGRvIG5vdCBhY2NvdW50IGZvciB0aGUgcGFkZGluZyBvZiBjaHVua3MKKyAqIHdpdGhpbiBhIExJU1QgaW4gdGhlIHNpemUgb2YgdGhlIExJU1QgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZ3N0X2F2aV9kZW11eF9yb3VuZHVwX2xpc3QgKEdzdEF2aURlbXV4ICogYXZpLCBHc3RCdWZmZXIgKiogYnVmKQoreworICBnc2l6ZSBzaXplOworCisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplICgqYnVmKTsKKworICBpZiAoR19VTkxJS0VMWSAoc2l6ZSAmIDEpKSB7CisgICAgR3N0QnVmZmVyICpvYnVmOworICAgIEdzdE1hcEluZm8gbWFwOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAicm91bmRpbmcgdXAgZHViaW91cyBsaXN0IHNpemUgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICAgIHNpemUpOworICAgIG9idWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHNpemUgKyAxKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChvYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKCpidWYsIDAsIG1hcC5kYXRhLCBzaXplKTsKKyAgICAvKiBhc3N1bWUgMCBwYWRkaW5nLCBhdCBsZWFzdCBtYWtlcyBvdXRjb21lIGRldGVybWluaXN0aWMgKi8KKyAgICBtYXAuZGF0YVtzaXplXSA9IDA7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob2J1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlIChidWYsIG9idWYpOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9hdmlfZGVtdXhfY2hlY2tfY2FwcyAoR3N0QXZpRGVtdXggKiBhdmksIEdzdEF2aVN0cmVhbSAqIHN0cmVhbSwKKyAgICBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzOworICBjb25zdCBHVmFsdWUgKnZhbDsKKyAgR3N0QnVmZmVyICpidWY7CisKKyAgY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGNhcHMpOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJ2aWRlby94LXJhdyIpKSB7CisgICAgc3RyZWFtLT5pc19yYXcgPSBUUlVFOworICAgIHN0cmVhbS0+YWxpZ25tZW50ID0gMzI7CisgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgInBpeGVsLWFzcGVjdC1yYXRpbyIpKQorICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iLCBHU1RfVFlQRV9GUkFDVElPTiwKKyAgICAgICAgICAxLCAxLCBOVUxMKTsKKyAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGRfdHlwZWQgKHMsICJwYWxldHRlX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIpKSB7CisgICAgICBnc3Rfc3RydWN0dXJlX2dldCAocywgInBhbGV0dGVfZGF0YSIsIEdTVF9UWVBFX0JVRkZFUiwKKyAgICAgICAgICAmc3RyZWFtLT5yZ2I4X3BhbGV0dGUsIE5VTEwpOworICAgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJwYWxldHRlX2RhdGEiKTsKKyAgICAgIHJldHVybiBjYXBzOworICAgIH0KKyAgfSBlbHNlIGlmICghZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgInZpZGVvL3gtaDI2NCIpKSB7CisgICAgcmV0dXJuIGNhcHM7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJjaGVja2luZyBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICAvKiBzb21lIG11eGVycyBwdXQgaW52YWxpZCBieXRlc3RyZWFtIHN0dWZmIGluIGgyNjQgZXh0cmEgZGF0YSAqLworICB2YWwgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgImNvZGVjX2RhdGEiKTsKKyAgaWYgKHZhbCAmJiAoYnVmID0gZ3N0X3ZhbHVlX2dldF9idWZmZXIgKHZhbCkpKSB7CisgICAgZ3VpbnQ4ICpkYXRhOworICAgIGdpbnQgc2l6ZTsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgZGF0YSA9IG1hcC5kYXRhOworICAgIHNpemUgPSBtYXAuc2l6ZTsKKyAgICBpZiAoc2l6ZSA+PSA0KSB7CisgICAgICBndWludDMyIGggPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEpOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICAgIGlmIChoID09IDB4MDEpIHsKKyAgICAgICAgLyogY2FuIGhhcmRseSBiZSB2YWxpZCBBVkMgY29kZWMgZGF0YSAqLworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksCisgICAgICAgICAgICAiZGlzY2FyZGluZyBpbnZhbGlkIGNvZGVjX2RhdGEgY29udGFpbmluZyBieXRlLXN0cmVhbSIpOworICAgICAgICAvKiBzbyBkbyBub3QgcHJldGVuZCB0byBkb3duc3RyZWFtIHRoYXQgaXQgaXMgcGFja2V0aXplZCBhdmMgKi8KKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJjb2RlY19kYXRhIik7CisgICAgICAgIC8qIC4uLiBidXQgcmF0aGVyIHByb3Blcmx5IHBhcnNlZCBieXRlc3RyZWFtICovCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAic3RyZWFtLWZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJieXRlLXN0cmVhbSIsCisgICAgICAgICAgICAiYWxpZ25tZW50IiwgR19UWVBFX1NUUklORywgImF1IiwgTlVMTCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKKy8qCisgKiBnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbToKKyAqIEBhdmk6IGNhbGxpbmcgZWxlbWVudCAodXNlZCBmb3IgZGVidWdnaW5nL2Vycm9ycykuCisgKiBAYnVmOiBpbnB1dCBidWZmZXIgdXNlZCB0byBwYXJzZSB0aGUgc3RyZWFtLgorICoKKyAqIFBhcnNlcyBhbGwgc3ViY2h1bmtzIGluIGEgc3RybCBjaHVuayAod2hpY2ggZGVmaW5lcyBhIHNpbmdsZQorICogc3RyZWFtKS4gRGlzY2FyZHMgdGhlIGJ1ZmZlciBhZnRlciB1c2UuIFRoaXMgZnVuY3Rpb24gd2lsbAorICogaW5jcmVtZW50IHRoZSBzdHJlYW0gY291bnRlciBpbnRlcm5hbGx5LgorICoKKyAqIFJldHVybnM6IHdoZXRoZXIgdGhlIHN0cmVhbSB3YXMgaWRlbnRpZmllZCBzdWNjZXNzZnVsbHkuCisgKiAgICAgICAgICBFcnJvcnMgYXJlIG5vdCBmYXRhbC4gSXQgZG9lcyBpbmRpY2F0ZSB0aGUgc3RyZWFtCisgKiAgICAgICAgICB3YXMgc2tpcHBlZC4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSAoR3N0QXZpRGVtdXggKiBhdmksIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0QXZpU3RyZWFtICpzdHJlYW07CisgIEdzdEVsZW1lbnRDbGFzcyAqa2xhc3M7CisgIEdzdFBhZFRlbXBsYXRlICp0ZW1wbDsKKyAgR3N0QnVmZmVyICpzdWIgPSBOVUxMOworICBndWludCBvZmZzZXQgPSA0OworICBndWludDMyIHRhZyA9IDA7CisgIGdjaGFyICpjb2RlY19uYW1lID0gTlVMTCwgKnBhZG5hbWUgPSBOVUxMOworICBjb25zdCBnY2hhciAqdGFnX25hbWU7CisgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworICBHc3RQYWQgKnBhZDsKKyAgR3N0RWxlbWVudCAqZWxlbWVudDsKKyAgZ2Jvb2xlYW4gZ290X3N0cmggPSBGQUxTRSwgZ290X3N0cmYgPSBGQUxTRSwgZ290X3ZwcnAgPSBGQUxTRTsKKyAgZ3N0X3JpZmZfdnBycCAqdnBycCA9IE5VTEw7CisgIEdzdEV2ZW50ICpldmVudDsKKyAgZ2NoYXIgKnN0cmVhbV9pZDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdib29sZWFuIHNwYXJzZSA9IEZBTFNFOworCisgIGVsZW1lbnQgPSBHU1RfRUxFTUVOVF9DQVNUIChhdmkpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIlBhcnNpbmcgc3RyZWFtIik7CisKKyAgZ3N0X2F2aV9kZW11eF9yb3VuZHVwX2xpc3QgKGF2aSwgJmJ1Zik7CisKKyAgaWYgKGF2aS0+bnVtX3N0cmVhbXMgPj0gR1NUX0FWSV9ERU1VWF9NQVhfU1RSRUFNUykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLAorICAgICAgICAibWF4aW11bSBubyBvZiBzdHJlYW1zICglZCkgZXhjZWVkZWQsIGlnbm9yaW5nIHN0cmVhbSIsCisgICAgICAgIEdTVF9BVklfREVNVVhfTUFYX1NUUkVBTVMpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgLyogbm90IGEgZmF0YWwgZXJyb3IsIGxldCdzIHNheSAqLworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgc3RyZWFtID0gJmF2aS0+c3RyZWFtW2F2aS0+bnVtX3N0cmVhbXNdOworCisgIC8qIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgc3RyZWFtLT5pZHhfZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBzdHJlYW0tPmhkcl9kdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIHN0cmVhbS0+ZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIHdoaWxlIChnc3RfcmlmZl9wYXJzZV9jaHVuayAoZWxlbWVudCwgYnVmLCAmb2Zmc2V0LCAmdGFnLCAmc3ViKSkgeworICAgIC8qIHN1YiBjYW4gYmUgTlVMTCBpZiB0aGUgY2h1bmsgaXMgZW1wdHkgKi8KKyAgICBpZiAoc3ViID09IE5VTEwpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgImlnbm9yaW5nIGVtcHR5IGNodW5rICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgIGNhc2UgR1NUX1JJRkZfVEFHX3N0cmg6CisgICAgICB7CisgICAgICAgIGdzdF9yaWZmX3N0cmggKnN0cmg7CisKKyAgICAgICAgaWYgKGdvdF9zdHJoKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksICJJZ25vcmluZyBhZGRpdGlvbmFsIHN0cmggY2h1bmsiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWdzdF9yaWZmX3BhcnNlX3N0cmggKGVsZW1lbnQsIHN1YiwgJnN0cmVhbS0+c3RyaCkpIHsKKyAgICAgICAgICAvKiBvd25lcnNoaXAgZ2l2ZW4gYXdheSAqLworICAgICAgICAgIHN1YiA9IE5VTEw7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksICJGYWlsZWQgdG8gcGFyc2Ugc3RyaCBjaHVuayIpOworICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBzdWIgPSBOVUxMOworICAgICAgICBzdHJoID0gc3RyZWFtLT5zdHJoOworICAgICAgICAvKiBzYW5pdHkgY2hlY2s7IHN0cmVhbSBoZWFkZXIgZnJhbWUgcmF0ZSBtYXRjaGVzIGdsb2JhbCBoZWFkZXIKKyAgICAgICAgICogZnJhbWUgZHVyYXRpb24gKi8KKyAgICAgICAgaWYgKHN0cmVhbS0+c3RyaC0+dHlwZSA9PSBHU1RfUklGRl9GQ0NfdmlkcykgeworICAgICAgICAgIEdzdENsb2NrVGltZSBzX2R1cjsKKyAgICAgICAgICBHc3RDbG9ja1RpbWUgaF9kdXIgPSBhdmktPmF2aWgtPnVzX2ZyYW1lICogR1NUX1VTRUNPTkQ7CisKKyAgICAgICAgICBzX2R1ciA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoR1NUX1NFQ09ORCwgc3RyaC0+c2NhbGUsIHN0cmgtPnJhdGUpOworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInZlcmlmeWluZyBzdHJlYW0gZnJhbWVyYXRlICVkLyVkLCAiCisgICAgICAgICAgICAgICJmcmFtZSBkdXJhdGlvbiA9ICVkIG1zIiwgc3RyaC0+cmF0ZSwgc3RyaC0+c2NhbGUsCisgICAgICAgICAgICAgIChnaW50KSAoc19kdXIgLyBHU1RfTVNFQ09ORCkpOworICAgICAgICAgIGlmIChoX2R1ciA+ICgxMCAqIEdTVF9NU0VDT05EKSAmJiAoc19kdXIgPiAxMCAqIGhfZHVyKSkgeworICAgICAgICAgICAgc3RyaC0+cmF0ZSA9IEdTVF9TRUNPTkQgLyBHU1RfVVNFQ09ORDsKKyAgICAgICAgICAgIHN0cmgtPnNjYWxlID0gaF9kdXIgLyBHU1RfVVNFQ09ORDsKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgImNvcnJlY3Rpbmcgc3RyZWFtIGZyYW1lcmF0ZSB0byAlZC8lZCIsCisgICAgICAgICAgICAgICAgc3RyaC0+cmF0ZSwgc3RyaC0+c2NhbGUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBkZXRlcm1pbmUgZHVyYXRpb24gYXMgaW5kaWNhdGVkIGJ5IGhlYWRlciAqLworICAgICAgICBzdHJlYW0tPmhkcl9kdXJhdGlvbiA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoKGd1aW50NjQpIHN0cmgtPmxlbmd0aCAqCisgICAgICAgICAgICBzdHJoLT5zY2FsZSwgR1NUX1NFQ09ORCwgKGd1aW50NjQpIHN0cmgtPnJhdGUpOworICAgICAgICBHU1RfSU5GTyAoIlN0cmVhbSBkdXJhdGlvbiBhY2NvcmRpbmcgdG8gaGVhZGVyOiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChzdHJlYW0tPmhkcl9kdXJhdGlvbikpOworICAgICAgICBpZiAoc3RyZWFtLT5oZHJfZHVyYXRpb24gPT0gMCkKKyAgICAgICAgICBzdHJlYW0tPmhkcl9kdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisKKyAgICAgICAgZ290X3N0cmggPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgR1NUX1JJRkZfVEFHX3N0cmY6CisgICAgICB7CisgICAgICAgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgICAgICAgIGlmIChnb3Rfc3RyZikgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLCAiSWdub3JpbmcgYWRkaXRpb25hbCBzdHJmIGNodW5rIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFnb3Rfc3RyaCkgeworICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGF2aSwgIkZvdW5kIHN0cmYgY2h1bmsgYmVmb3JlIHN0cmggY2h1bmsiKTsKKyAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChzdHJlYW0tPnN0cmgtPnR5cGUpIHsKKyAgICAgICAgICBjYXNlIEdTVF9SSUZGX0ZDQ192aWRzOgorICAgICAgICAgICAgc3RyZWFtLT5pc192YnIgPSBUUlVFOworICAgICAgICAgICAgcmVzID0gZ3N0X3JpZmZfcGFyc2Vfc3RyZl92aWRzIChlbGVtZW50LCBzdWIsCisgICAgICAgICAgICAgICAgJnN0cmVhbS0+c3RyZi52aWRzLCAmc3RyZWFtLT5leHRyYWRhdGEpOworICAgICAgICAgICAgc3ViID0gTlVMTDsKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVsZW1lbnQsICJtYXJraW5nIHZpZGVvIGFzIFZCUiwgcmVzICVkIiwgcmVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR1NUX1JJRkZfRkNDX2F1ZHM6CisgICAgICAgICAgICByZXMgPQorICAgICAgICAgICAgICAgIGdzdF9yaWZmX3BhcnNlX3N0cmZfYXVkcyAoZWxlbWVudCwgc3ViLCAmc3RyZWFtLT5zdHJmLmF1ZHMsCisgICAgICAgICAgICAgICAgJnN0cmVhbS0+ZXh0cmFkYXRhKTsKKyAgICAgICAgICAgIHN1YiA9IE5VTEw7CisgICAgICAgICAgICBpZiAoIXJlcykKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBzdHJlYW0tPmlzX3ZiciA9IChzdHJlYW0tPnN0cmgtPnNhbXBsZXNpemUgPT0gMCkKKyAgICAgICAgICAgICAgICAmJiBzdHJlYW0tPnN0cmgtPnNjYWxlID4gMQorICAgICAgICAgICAgICAgICYmIHN0cmVhbS0+c3RyZi5hdWRzLT5ibG9ja2FsaWduICE9IDE7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChlbGVtZW50LCAibWFya2luZyBhdWRpbyBhcyBWQlI6JWQsIHJlcyAlZCIsCisgICAgICAgICAgICAgICAgc3RyZWFtLT5pc192YnIsIHJlcyk7CisgICAgICAgICAgICAvKiB3ZSBuZWVkIHRoZXNlIG9yIHdlIGhhdmUgbm8gd2F5IHRvIGNvbWUgdXAgd2l0aCB0aW1lc3RhbXBzICovCisgICAgICAgICAgICBpZiAoKCFzdHJlYW0tPmlzX3ZiciAmJiAhc3RyZWFtLT5zdHJmLmF1ZHMtPmF2X2JwcykgfHwKKyAgICAgICAgICAgICAgICAoc3RyZWFtLT5pc192YnIgJiYgKCFzdHJlYW0tPnN0cmgtPnNjYWxlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3RyZWFtLT5zdHJoLT5yYXRlKSkpIHsKKyAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbGVtZW50LAorICAgICAgICAgICAgICAgICAgImludmFsaWQgYXVkaW8gaGVhZGVyLCBpZ25vcmluZyBzdHJlYW0iKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogc29tZSBtb3JlIHNhbml0eSBjaGVja3MgKi8KKyAgICAgICAgICAgIGlmIChzdHJlYW0tPmlzX3ZicikgeworICAgICAgICAgICAgICBpZiAoc3RyZWFtLT5zdHJmLmF1ZHMtPmJsb2NrYWxpZ24gPD0gNCkgeworICAgICAgICAgICAgICAgIC8qIHRoYXQgd291bGQgbWVhbiAodG9vKSBtYW55IGZyYW1lcyBwZXIgY2h1bmssCisgICAgICAgICAgICAgICAgICogc28gbm90IGxpa2VseSBzZXQgYXMgZXhwZWN0ZWQgKi8KKyAgICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChlbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAic3VzcGljaW91cyBibG9ja2FsaWduICVkIGZvciBWQlIgYXVkaW87ICIKKyAgICAgICAgICAgICAgICAgICAgIm92ZXJyaWRpbmcgdG8gMSBmcmFtZSBwZXIgY2h1bmsiLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPnN0cmYuYXVkcy0+YmxvY2thbGlnbik7CisgICAgICAgICAgICAgICAgLyogdGhpcyBzaG91bGQgdG9wIGFueSBsaWtlbHkgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBzdHJlYW0tPnN0cmYuYXVkcy0+YmxvY2thbGlnbiA9ICgxIDw8IDEyKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHU1RfUklGRl9GQ0NfaWF2czoKKyAgICAgICAgICAgIHN0cmVhbS0+aXNfdmJyID0gVFJVRTsKKyAgICAgICAgICAgIHJlcyA9IGdzdF9yaWZmX3BhcnNlX3N0cmZfaWF2cyAoZWxlbWVudCwgc3ViLAorICAgICAgICAgICAgICAgICZzdHJlYW0tPnN0cmYuaWF2cywgJnN0cmVhbS0+ZXh0cmFkYXRhKTsKKyAgICAgICAgICAgIHN1YiA9IE5VTEw7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChlbGVtZW50LCAibWFya2luZyBpYXZzIGFzIFZCUiwgcmVzICVkIiwgcmVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR1NUX1JJRkZfRkNDX3R4dHM6CisgICAgICAgICAgICAvKiBub3RoaW5nIHRvIHBhcnNlIGhlcmUgKi8KKyAgICAgICAgICAgIHN0cmVhbS0+aXNfdmJyID0gKHN0cmVhbS0+c3RyaC0+c2FtcGxlc2l6ZSA9PSAwKQorICAgICAgICAgICAgICAgICYmIChzdHJlYW0tPnN0cmgtPnNjYWxlID4gMSk7CisgICAgICAgICAgICByZXMgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGF2aSwKKyAgICAgICAgICAgICAgICAiRG9uwrR0IGtub3cgaG93IHRvIGhhbmRsZSBzdHJlYW0gdHlwZSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHN0cmVhbS0+c3RyaC0+dHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN1YikgeworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHN1Yik7CisgICAgICAgICAgc3ViID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXJlcykKKyAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGdvdF9zdHJmID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEdTVF9SSUZGX1RBR192cHJwOgorICAgICAgeworICAgICAgICBpZiAoZ290X3ZwcnApIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aSwgIklnbm9yaW5nIGFkZGl0aW9uYWwgdnBycCBjaHVuayIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghZ290X3N0cmgpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChhdmksICJGb3VuZCB2cHJwIGNodW5rIGJlZm9yZSBzdHJoIGNodW5rIik7CisgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGlmICghZ290X3N0cmYpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChhdmksICJGb3VuZCB2cHJwIGNodW5rIGJlZm9yZSBzdHJmIGNodW5rIik7CisgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFnc3RfYXZpX2RlbXV4X3JpZmZfcGFyc2VfdnBycCAoZWxlbWVudCwgc3ViLCAmdnBycCkpIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aSwgIkZhaWxlZCB0byBwYXJzZSB2cHJwIGNodW5rIik7CisgICAgICAgICAgLyogbm90IGNvbnNpZGVyZWQgZmF0YWwgKi8KKyAgICAgICAgICBnX2ZyZWUgKHZwcnApOworICAgICAgICAgIHZwcnAgPSBOVUxMOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RfdnBycCA9IFRSVUU7CisgICAgICAgIHN1YiA9IE5VTEw7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBHU1RfUklGRl9UQUdfc3RyZDoKKyAgICAgICAgaWYgKHN0cmVhbS0+aW5pdGRhdGEpCisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoc3RyZWFtLT5pbml0ZGF0YSk7CisgICAgICAgIHN0cmVhbS0+aW5pdGRhdGEgPSBzdWI7CisgICAgICAgIGlmIChzdWIgIT0gTlVMTCkgeworICAgICAgICAgIGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZCAoYXZpLCBzdWIpOworICAgICAgICAgIHN1YiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9SSUZGX1RBR19zdHJuOgorICAgICAgICBnX2ZyZWUgKHN0cmVhbS0+bmFtZSk7CisKKyAgICAgICAgZ3N0X2J1ZmZlcl9tYXAgKHN1YiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICAgICAgICBpZiAoYXZpLT5nbG9iYWx0YWdzID09IE5VTEwpCisgICAgICAgICAgYXZpLT5nbG9iYWx0YWdzID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgICAgICAgcGFyc2VfdGFnX3ZhbHVlIChhdmksIGF2aS0+Z2xvYmFsdGFncywgR1NUX1RBR19USVRMRSwKKyAgICAgICAgICAgIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisKKyAgICAgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nIChhdmktPmdsb2JhbHRhZ3MsIEdTVF9UQUdfVElUTEUsCisgICAgICAgICAgICAgICAgJnN0cmVhbS0+bmFtZSkpCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic3RyZWFtIG5hbWU6ICVzIiwgc3RyZWFtLT5uYW1lKTsKKworICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChzdWIsICZtYXApOworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChzdWIpOworICAgICAgICBzdWIgPSBOVUxMOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1JJRkZfSURJVDoKKyAgICAgICAgZ3N0X2F2aV9kZW11eF9wYXJzZV9pZGl0IChhdmksIHN1Yik7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKHRhZyA9PSBHU1RfTUFLRV9GT1VSQ0MgKCdpJywgJ24nLCAnZCcsICd4JykgfHwKKyAgICAgICAgICAgIHRhZyA9PSBHU1RfTUFLRV9GT1VSQ0MgKCdpJywgJ3gnLCAnMCcgKyBhdmktPm51bV9zdHJlYW1zIC8gMTAsCisgICAgICAgICAgICAgICAgJzAnICsgYXZpLT5udW1fc3RyZWFtcyAlIDEwKSkgeworICAgICAgICAgIGdfZnJlZSAoc3RyZWFtLT5pbmRleGVzKTsKKyAgICAgICAgICBnc3RfYXZpX2RlbXV4X3BhcnNlX3N1cGVyaW5kZXggKGF2aSwgc3ViLCAmc3RyZWFtLT5pbmRleGVzKTsKKyAgICAgICAgICBzdHJlYW0tPnN1cGVyaW5kZXggPSBUUlVFOworICAgICAgICAgIHN1YiA9IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksCisgICAgICAgICAgICAiVW5rbm93biBzdHJlYW0gaGVhZGVyIHRhZyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiLCBpZ25vcmluZyIsCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHRhZykpOworICAgICAgICAvKiBPbmx5IGdldCBidWZmZXIgZm9yIGRlYnVnZ2luZyBpZiB0aGUgbWVtZHVtcCBpcyBuZWVkZWQgICovCisgICAgICAgIGlmIChnc3RfZGVidWdfY2F0ZWdvcnlfZ2V0X3RocmVzaG9sZCAoR1NUX0NBVF9ERUZBVUxUKSA+PSA5KSB7CisgICAgICAgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICAgICAgICBnc3RfYnVmZmVyX21hcCAoc3ViLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgICAgIEdTVF9NRU1EVU1QX09CSkVDVCAoYXZpLCAiVW5rbm93biBzdHJlYW0gaGVhZGVyIHRhZyIsIG1hcC5kYXRhLAorICAgICAgICAgICAgICBtYXAuc2l6ZSk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoc3ViLCAmbWFwKTsKKyAgICAgICAgfQorICAgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgICAgIGNhc2UgR1NUX1JJRkZfVEFHX0pVTlE6CisgICAgICBjYXNlIEdTVF9SSUZGX1RBR19KVU5LOgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHN1YiAhPSBOVUxMKSB7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChzdWIpOworICAgICAgc3ViID0gTlVMTDsKKyAgICB9CisgIH0KKworICBpZiAoIWdvdF9zdHJoKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksICJGYWlsZWQgdG8gZmluZCBzdHJoIGNodW5rIik7CisgICAgZ290byBmYWlsOworICB9CisKKyAgaWYgKCFnb3Rfc3RyZikgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLCAiRmFpbGVkIHRvIGZpbmQgc3RyZiBjaHVuayIpOworICAgIGdvdG8gZmFpbDsKKyAgfQorCisgIC8qIGdldCBjbGFzcyB0byBmaWd1cmUgb3V0IHRoZSB0ZW1wbGF0ZSAqLworICBrbGFzcyA9IEdTVF9FTEVNRU5UX0dFVF9DTEFTUyAoYXZpKTsKKworICAvKiB3ZSBub3cgaGF2ZSBhbGwgaW5mbywgbGV0wrRzIHNldCB1cCBhIHBhZCBhbmQgYSBjYXBzIGFuZCBiZSBkb25lICovCisgIC8qIGNyZWF0ZSBzdHJlYW0gbmFtZSArIHBhZCAqLworICBzd2l0Y2ggKHN0cmVhbS0+c3RyaC0+dHlwZSkgeworICAgIGNhc2UgR1NUX1JJRkZfRkNDX3ZpZHM6eworICAgICAgZ3VpbnQzMiBmb3VyY2M7CisKKyAgICAgIGZvdXJjYyA9IChzdHJlYW0tPnN0cmYudmlkcy0+Y29tcHJlc3Npb24pID8KKyAgICAgICAgICBzdHJlYW0tPnN0cmYudmlkcy0+Y29tcHJlc3Npb24gOiBzdHJlYW0tPnN0cmgtPmZjY19oYW5kbGVyOworICAgICAgY2FwcyA9IGdzdF9yaWZmX2NyZWF0ZV92aWRlb19jYXBzIChmb3VyY2MsIHN0cmVhbS0+c3RyaCwKKyAgICAgICAgICBzdHJlYW0tPnN0cmYudmlkcywgc3RyZWFtLT5leHRyYWRhdGEsIHN0cmVhbS0+aW5pdGRhdGEsICZjb2RlY19uYW1lKTsKKworICAgICAgLyogRFhTQiBpcyBYU1VCLCBhbmQgaXQgaXMgcGxhY2VkIGluc2lkZSBhIHZpZHMgKi8KKyAgICAgIGlmICghY2FwcyB8fCAoZm91cmNjICE9IEdTVF9NQUtFX0ZPVVJDQyAoJ0QnLCAnWCcsICdTJywgJ0InKSAmJgorICAgICAgICAgICAgICBmb3VyY2MgIT0gR1NUX01BS0VfRk9VUkNDICgnRCcsICdYJywgJ1MnLCAnQScpKSkgeworICAgICAgICBwYWRuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgidmlkZW9fJXUiLCBhdmktPm51bV92X3N0cmVhbXMpOworICAgICAgICB0ZW1wbCA9IGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLCAidmlkZW9fJXUiKTsKKyAgICAgICAgaWYgKCFjYXBzKSB7CisgICAgICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWF2aS11bmtub3duIiwgImZvdXJjYyIsCisgICAgICAgICAgICAgIEdfVFlQRV9JTlQsIGZvdXJjYywgTlVMTCk7CisgICAgICAgIH0gZWxzZSBpZiAoZ290X3ZwcnAgJiYgdnBycCkgeworICAgICAgICAgIGd1aW50MzIgYXNwZWN0X24sIGFzcGVjdF9kOworICAgICAgICAgIGdpbnQgbiwgZDsKKworICAgICAgICAgIGFzcGVjdF9uID0gdnBycC0+YXNwZWN0ID4+IDE2OworICAgICAgICAgIGFzcGVjdF9kID0gdnBycC0+YXNwZWN0ICYgMHhmZmZmOworICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgcGl4ZWwgYXNwZWN0IHJhdGlvIHVzaW5nIHcvaCBhbmQgYXNwZWN0IHJhdGlvICovCisgICAgICAgICAgbiA9IGFzcGVjdF9uICogc3RyZWFtLT5zdHJmLnZpZHMtPmhlaWdodDsKKyAgICAgICAgICBkID0gYXNwZWN0X2QgKiBzdHJlYW0tPnN0cmYudmlkcy0+d2lkdGg7CisgICAgICAgICAgaWYgKG4gJiYgZCkKKyAgICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iLCBHU1RfVFlQRV9GUkFDVElPTiwKKyAgICAgICAgICAgICAgICBuLCBkLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBjYXBzID0gZ3N0X2F2aV9kZW11eF9jaGVja19jYXBzIChhdmksIHN0cmVhbSwgY2Fwcyk7CisgICAgICAgIHRhZ19uYW1lID0gR1NUX1RBR19WSURFT19DT0RFQzsKKyAgICAgICAgYXZpLT5udW1fdl9zdHJlYW1zKys7CisgICAgICB9IGVsc2UgeworICAgICAgICBwYWRuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgic3VicGljdHVyZV8ldSIsIGF2aS0+bnVtX3NwX3N0cmVhbXMpOworICAgICAgICB0ZW1wbCA9IGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLCAic3VicGljdHVyZV8ldSIpOworICAgICAgICB0YWdfbmFtZSA9IE5VTEw7CisgICAgICAgIGF2aS0+bnVtX3NwX3N0cmVhbXMrKzsKKyAgICAgICAgc3BhcnNlID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9SSUZGX0ZDQ19hdWRzOnsKKyAgICAgIC8qIEZJWE1FOiBEbyBzb21ldGhpbmcgd2l0aCB0aGUgY2hhbm5lbCByZW9yZGVyIG1hcCAqLworICAgICAgcGFkbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoImF1ZGlvXyV1IiwgYXZpLT5udW1fYV9zdHJlYW1zKTsKKyAgICAgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJhdWRpb18ldSIpOworICAgICAgY2FwcyA9IGdzdF9yaWZmX2NyZWF0ZV9hdWRpb19jYXBzIChzdHJlYW0tPnN0cmYuYXVkcy0+Zm9ybWF0LAorICAgICAgICAgIHN0cmVhbS0+c3RyaCwgc3RyZWFtLT5zdHJmLmF1ZHMsIHN0cmVhbS0+ZXh0cmFkYXRhLAorICAgICAgICAgIHN0cmVhbS0+aW5pdGRhdGEsICZjb2RlY19uYW1lLCBOVUxMKTsKKyAgICAgIGlmICghY2FwcykgeworICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtYXZpLXVua25vd24iLCAiY29kZWNfaWQiLAorICAgICAgICAgICAgR19UWVBFX0lOVCwgc3RyZWFtLT5zdHJmLmF1ZHMtPmZvcm1hdCwgTlVMTCk7CisgICAgICB9CisgICAgICB0YWdfbmFtZSA9IEdTVF9UQUdfQVVESU9fQ09ERUM7CisgICAgICBhdmktPm51bV9hX3N0cmVhbXMrKzsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9SSUZGX0ZDQ19pYXZzOnsKKyAgICAgIGd1aW50MzIgZm91cmNjID0gc3RyZWFtLT5zdHJoLT5mY2NfaGFuZGxlcjsKKworICAgICAgcGFkbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInZpZGVvXyV1IiwgYXZpLT5udW1fdl9zdHJlYW1zKTsKKyAgICAgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJ2aWRlb18ldSIpOworICAgICAgY2FwcyA9IGdzdF9yaWZmX2NyZWF0ZV9pYXZzX2NhcHMgKGZvdXJjYywgc3RyZWFtLT5zdHJoLAorICAgICAgICAgIHN0cmVhbS0+c3RyZi5pYXZzLCBzdHJlYW0tPmV4dHJhZGF0YSwgc3RyZWFtLT5pbml0ZGF0YSwgJmNvZGVjX25hbWUpOworICAgICAgaWYgKCFjYXBzKSB7CisgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1hdmktdW5rbm93biIsICJmb3VyY2MiLAorICAgICAgICAgICAgR19UWVBFX0lOVCwgZm91cmNjLCBOVUxMKTsKKyAgICAgIH0KKyAgICAgIHRhZ19uYW1lID0gR1NUX1RBR19WSURFT19DT0RFQzsKKyAgICAgIGF2aS0+bnVtX3Zfc3RyZWFtcysrOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1JJRkZfRkNDX3R4dHM6eworICAgICAgcGFkbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInN1YnRpdGxlXyV1IiwgYXZpLT5udW1fdF9zdHJlYW1zKTsKKyAgICAgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJzdWJ0aXRsZV8ldSIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXN1YnRpdGxlLWF2aSIpOworICAgICAgdGFnX25hbWUgPSBOVUxMOworICAgICAgYXZpLT5udW1fdF9zdHJlYW1zKys7CisgICAgICBzcGFyc2UgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBnX3JldHVybl92YWxfaWZfcmVhY2hlZCAoRkFMU0UpOworICB9CisKKyAgLyogbm8gY2FwcyBtZWFucyBubyBzdHJlYW0gKi8KKyAgaWYgKCFjYXBzKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZWxlbWVudCwgIkRpZCBub3QgZmluZCBjYXBzIGZvciBzdHJlYW0gJXMiLCBwYWRuYW1lKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChlbGVtZW50LCAiY29kZWMtbmFtZT0lcyIsIGNvZGVjX25hbWUgPyBjb2RlY19uYW1lIDogIk5VTEwiKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoZWxlbWVudCwgImNhcHM9JSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIC8qIHNldCBwcm9wZXIgc2V0dGluZ3MgYW5kIGFkZCBpdCAqLworICBpZiAoc3RyZWFtLT5wYWQpCisgICAgZ3N0X29iamVjdF91bnJlZiAoc3RyZWFtLT5wYWQpOworICBwYWQgPSBzdHJlYW0tPnBhZCA9IGdzdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKHRlbXBsLCBwYWRuYW1lKTsKKyAgZ19mcmVlIChwYWRuYW1lKTsKKworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChwYWQpOworI2lmIDAKKyAgZ3N0X3BhZF9zZXRfZm9ybWF0c19mdW5jdGlvbiAocGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdmlfZGVtdXhfZ2V0X3NyY19mb3JtYXRzKSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X21hc2tfZnVuY3Rpb24gKHBhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXZpX2RlbXV4X2dldF9ldmVudF9tYXNrKSk7CisjZW5kaWYKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHBhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpKTsKKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKHBhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpKTsKKyNpZiAwCisgIGdzdF9wYWRfc2V0X2NvbnZlcnRfZnVuY3Rpb24gKHBhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXZpX2RlbXV4X3NyY19jb252ZXJ0KSk7CisjZW5kaWYKKworICBzdHJlYW0tPm51bSA9IGF2aS0+bnVtX3N0cmVhbXM7CisKKyAgc3RyZWFtLT5zdGFydF9lbnRyeSA9IDA7CisgIHN0cmVhbS0+c3RlcF9lbnRyeSA9IDA7CisgIHN0cmVhbS0+c3RvcF9lbnRyeSA9IDA7CisKKyAgc3RyZWFtLT5jdXJyZW50X2VudHJ5ID0gLTE7CisgIHN0cmVhbS0+Y3VycmVudF90b3RhbCA9IDA7CisKKyAgc3RyZWFtLT5kaXNjb250ID0gVFJVRTsKKworICBzdHJlYW0tPnRvdGFsX2J5dGVzID0gMDsKKyAgc3RyZWFtLT50b3RhbF9ibG9ja3MgPSAwOworICBzdHJlYW0tPm5fa2V5ZnJhbWVzID0gMDsKKworICBzdHJlYW0tPmlkeF9uID0gMDsKKyAgc3RyZWFtLT5pZHhfbWF4ID0gMDsKKworICBnc3RfcGFkX3NldF9lbGVtZW50X3ByaXZhdGUgKHBhZCwgc3RyZWFtKTsKKyAgYXZpLT5udW1fc3RyZWFtcysrOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAocGFkLCBUUlVFKTsKKyAgc3RyZWFtX2lkID0KKyAgICAgIGdzdF9wYWRfY3JlYXRlX3N0cmVhbV9pZF9wcmludGYgKHBhZCwgR1NUX0VMRU1FTlRfQ0FTVCAoYXZpKSwgIiUwM3UiLAorICAgICAgYXZpLT5udW1fc3RyZWFtcyk7CisKKyAgZXZlbnQgPSBnc3RfcGFkX2dldF9zdGlja3lfZXZlbnQgKGF2aS0+c2lua3BhZCwgR1NUX0VWRU5UX1NUUkVBTV9TVEFSVCwgMCk7CisgIGlmIChldmVudCkgeworICAgIGlmIChnc3RfZXZlbnRfcGFyc2VfZ3JvdXBfaWQgKGV2ZW50LCAmYXZpLT5ncm91cF9pZCkpCisgICAgICBhdmktPmhhdmVfZ3JvdXBfaWQgPSBUUlVFOworICAgIGVsc2UKKyAgICAgIGF2aS0+aGF2ZV9ncm91cF9pZCA9IEZBTFNFOworICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICB9IGVsc2UgaWYgKCFhdmktPmhhdmVfZ3JvdXBfaWQpIHsKKyAgICBhdmktPmhhdmVfZ3JvdXBfaWQgPSBUUlVFOworICAgIGF2aS0+Z3JvdXBfaWQgPSBnc3RfdXRpbF9ncm91cF9pZF9uZXh0ICgpOworICB9CisKKyAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoc3RyZWFtX2lkKTsKKyAgaWYgKGF2aS0+aGF2ZV9ncm91cF9pZCkKKyAgICBnc3RfZXZlbnRfc2V0X2dyb3VwX2lkIChldmVudCwgYXZpLT5ncm91cF9pZCk7CisgIGlmIChzcGFyc2UpCisgICAgZ3N0X2V2ZW50X3NldF9zdHJlYW1fZmxhZ3MgKGV2ZW50LCBHU1RfU1RSRUFNX0ZMQUdfU1BBUlNFKTsKKworICBnc3RfcGFkX3B1c2hfZXZlbnQgKHBhZCwgZXZlbnQpOworICBnX2ZyZWUgKHN0cmVhbV9pZCk7CisgIGdzdF9wYWRfc2V0X2NhcHMgKHBhZCwgY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAvKiBtYWtlIHRhZ3MgKi8KKyAgaWYgKGNvZGVjX25hbWUgJiYgdGFnX25hbWUpIHsKKyAgICBpZiAoIXN0cmVhbS0+dGFnbGlzdCkKKyAgICAgIHN0cmVhbS0+dGFnbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisKKyAgICBhdmktPmdvdF90YWdzID0gVFJVRTsKKworICAgIGdzdF90YWdfbGlzdF9hZGQgKHN0cmVhbS0+dGFnbGlzdCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsIHRhZ19uYW1lLAorICAgICAgICBjb2RlY19uYW1lLCBOVUxMKTsKKyAgfQorCisgIGdfZnJlZSAodnBycCk7CisgIGdfZnJlZSAoY29kZWNfbmFtZSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitmYWlsOgorICB7CisgICAgLyogdW5yZWYgYW55IG1lbSB0aGF0IG1heSBiZSBpbiB1c2UgKi8KKyAgICBpZiAoYnVmKQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICBpZiAoc3ViKQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoc3ViKTsKKyAgICBnX2ZyZWUgKHZwcnApOworICAgIGdfZnJlZSAoY29kZWNfbmFtZSk7CisgICAgZ3N0X2F2aV9kZW11eF9yZXNldF9zdHJlYW0gKGF2aSwgc3RyZWFtKTsKKyAgICBhdmktPm51bV9zdHJlYW1zKys7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qCisgKiBnc3RfYXZpX2RlbXV4X3BhcnNlX29kbWw6CisgKiBAYXZpOiBjYWxsaW5nIGVsZW1lbnQgKHVzZWQgZm9yIGRlYnVnL2Vycm9yKS4KKyAqIEBidWY6IGlucHV0IGJ1ZmZlciB0byBiZSB1c2VkIGZvciBwYXJzaW5nLgorICoKKyAqIFJlYWQgYW4gb3BlbkRNTC0yLjAgZXh0ZW5zaW9uIGhlYWRlci4gRmlsbHMgaW4gdGhlIGZyYW1lIG51bWJlcgorICogaW4gdGhlIGF2aSBkZW11eGVyIG9iamVjdCB3aGVuIHJlYWRpbmcgc3VjY2VlZHMuCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfYXZpX2RlbXV4X3BhcnNlX29kbWwgKEdzdEF2aURlbXV4ICogYXZpLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIGd1aW50MzIgdGFnID0gMDsKKyAgZ3VpbnQgb2Zmc2V0ID0gNDsKKyAgR3N0QnVmZmVyICpzdWIgPSBOVUxMOworCisgIHdoaWxlIChnc3RfcmlmZl9wYXJzZV9jaHVuayAoR1NUX0VMRU1FTlRfQ0FTVCAoYXZpKSwgYnVmLCAmb2Zmc2V0LCAmdGFnLAorICAgICAgICAgICZzdWIpKSB7CisgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgIGNhc2UgR1NUX1JJRkZfVEFHX2RtbGg6eworICAgICAgICBnc3RfcmlmZl9kbWxoIGRtbGgsICpfZG1saDsKKyAgICAgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICAgICAgLyogc3ViID09IE5VTEwgaXMgcG9zc2libGUgYW5kIG1lYW5zIGFuIGVtcHR5IGJ1ZmZlciAqLworICAgICAgICBpZiAoc3ViID09IE5VTEwpCisgICAgICAgICAgZ290byBuZXh0OworCisgICAgICAgIGdzdF9idWZmZXJfbWFwIChzdWIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgICAgICAgLyogY2hlY2sgc2l6ZSAqLworICAgICAgICBpZiAobWFwLnNpemUgPCBzaXplb2YgKGdzdF9yaWZmX2RtbGgpKSB7CisgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoYXZpLAorICAgICAgICAgICAgICAiRE1MSCBlbnRyeSBpcyB0b28gc21hbGwgKCUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMsICVkIG5lZWRlZCkiLAorICAgICAgICAgICAgICBtYXAuc2l6ZSwgKGludCkgc2l6ZW9mIChnc3RfcmlmZl9kbWxoKSk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoc3ViLCAmbWFwKTsKKyAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgIH0KKyAgICAgICAgX2RtbGggPSAoZ3N0X3JpZmZfZG1saCAqKSBtYXAuZGF0YTsKKyAgICAgICAgZG1saC50b3RhbGZyYW1lcyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoJl9kbWxoLT50b3RhbGZyYW1lcyk7CisgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKHN1YiwgJm1hcCk7CisKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChhdmksICJkbWxoIHRhZyBmb3VuZDogdG90YWxmcmFtZXM6ICV1IiwKKyAgICAgICAgICAgIGRtbGgudG90YWxmcmFtZXMpOworCisgICAgICAgIGF2aS0+YXZpaC0+dG90X2ZyYW1lcyA9IGRtbGgudG90YWxmcmFtZXM7CisgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksCisgICAgICAgICAgICAiVW5rbm93biB0YWcgJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiBpbiBPRE1MIGhlYWRlciIsCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHRhZykpOworICAgICAgICAvKiBPbmx5IGdldCBidWZmZXIgZm9yIGRlYnVnZ2luZyBpZiB0aGUgbWVtZHVtcCBpcyBuZWVkZWQgICovCisgICAgICAgIGlmIChnc3RfZGVidWdfY2F0ZWdvcnlfZ2V0X3RocmVzaG9sZCAoR1NUX0NBVF9ERUZBVUxUKSA+PSA5KSB7CisgICAgICAgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICAgICAgICBnc3RfYnVmZmVyX21hcCAoc3ViLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgICAgIEdTVF9NRU1EVU1QX09CSkVDVCAoYXZpLCAiVW5rbm93biBPRE1MIHRhZyIsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoc3ViLCAmbWFwKTsKKyAgICAgICAgfQorICAgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgICAgIGNhc2UgR1NUX1JJRkZfVEFHX0pVTlE6CisgICAgICBjYXNlIEdTVF9SSUZGX1RBR19KVU5LOgorICAgICAgbmV4dDoKKyAgICAgICAgLyogc2tpcCBhbmQgbW92ZSB0byBuZXh0IGNodW5rICovCisgICAgICAgIGlmIChzdWIpIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChzdWIpOworICAgICAgICAgIHN1YiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChidWYpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKK30KKworLyogSW5kZXggaGVscGVyICovCitzdGF0aWMgZ3VpbnQKK2dzdF9hdmlfZGVtdXhfaW5kZXhfbGFzdCAoR3N0QXZpRGVtdXggKiBhdmksIEdzdEF2aVN0cmVhbSAqIHN0cmVhbSkKK3sKKyAgcmV0dXJuIHN0cmVhbS0+aWR4X247Cit9CisKKy8qIGZpbmQgYSBwcmV2aW91cyBlbnRyeSBpbiB0aGUgaW5kZXggd2l0aCB0aGUgZ2l2ZW4gZmxhZ3MgKi8KK3N0YXRpYyBndWludAorZ3N0X2F2aV9kZW11eF9pbmRleF9wcmV2IChHc3RBdmlEZW11eCAqIGF2aSwgR3N0QXZpU3RyZWFtICogc3RyZWFtLAorICAgIGd1aW50IGxhc3QsIGdib29sZWFuIGtleWZyYW1lKQoreworICBHc3RBdmlJbmRleEVudHJ5ICplbnRyeTsKKyAgZ3VpbnQgaTsKKworICBmb3IgKGkgPSBsYXN0OyBpID4gMDsgaS0tKSB7CisgICAgZW50cnkgPSAmc3RyZWFtLT5pbmRleFtpIC0gMV07CisgICAgaWYgKCFrZXlmcmFtZSB8fCBFTlRSWV9JU19LRVlGUkFNRSAoZW50cnkpKSB7CisgICAgICByZXR1cm4gaSAtIDE7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgZ3VpbnQKK2dzdF9hdmlfZGVtdXhfaW5kZXhfbmV4dCAoR3N0QXZpRGVtdXggKiBhdmksIEdzdEF2aVN0cmVhbSAqIHN0cmVhbSwKKyAgICBndWludCBsYXN0LCBnYm9vbGVhbiBrZXlmcmFtZSkKK3sKKyAgR3N0QXZpSW5kZXhFbnRyeSAqZW50cnk7CisgIGdpbnQgaTsKKworICBmb3IgKGkgPSBsYXN0ICsgMTsgaSA8IHN0cmVhbS0+aWR4X247IGkrKykgeworICAgIGVudHJ5ID0gJnN0cmVhbS0+aW5kZXhbaV07CisgICAgaWYgKCFrZXlmcmFtZSB8fCBFTlRSWV9JU19LRVlGUkFNRSAoZW50cnkpKSB7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0cmVhbS0+aWR4X24gLSAxOworfQorCitzdGF0aWMgZ3VpbnQKK2dzdF9hdmlfZGVtdXhfaW5kZXhfZW50cnlfc2VhcmNoIChHc3RBdmlJbmRleEVudHJ5ICogZW50cnksIGd1aW50NjQgKiB0b3RhbCkKK3sKKyAgaWYgKGVudHJ5LT50b3RhbCA8ICp0b3RhbCkKKyAgICByZXR1cm4gLTE7CisgIGVsc2UgaWYgKGVudHJ5LT50b3RhbCA+ICp0b3RhbCkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBnc3RfYXZpX2RlbXV4X2luZGV4X2Zvcl90aW1lOgorICogQGF2aTogQXZpIG9iamVjdAorICogQHN0cmVhbTogdGhlIHN0cmVhbQorICogQHRpbWU6IGEgdGltZSBwb3NpdGlvbgorICogQG5leHQ6IHdoZXRoZXIgdG8gbG9vayBmb3IgZW50cnkgYmVmb3JlIG9yIGFmdGVyIEB0aW1lCisgKgorICogRmluZHMgdGhlIGluZGV4IGVudHJ5IHdoaWNoIHRpbWUgaXMgbGVzcy9tb3JlIG9yIGVxdWFsIHRoYW4gdGhlIHJlcXVlc3RlZCB0aW1lLgorICogVHJ5IHRvIGF2b2lkIGJpbmFyeSBzZWFyY2ggd2hlbiB3ZSBjYW4gY29udmVydCB0aGUgdGltZSB0byBhbiBpbmRleAorICogcG9zaXRpb24gZGlyZWN0bHkgKGZvciBleGFtcGxlIGZvciB2aWRlbyBmcmFtZXMgd2l0aCBhIGZpeGVkIGR1cmF0aW9uKS4KKyAqCisgKiBSZXR1cm5zOiB0aGUgZm91bmQgcG9zaXRpb24gaW4gdGhlIGluZGV4LgorICovCitzdGF0aWMgZ3VpbnQKK2dzdF9hdmlfZGVtdXhfaW5kZXhfZm9yX3RpbWUgKEdzdEF2aURlbXV4ICogYXZpLAorICAgIEdzdEF2aVN0cmVhbSAqIHN0cmVhbSwgZ3VpbnQ2NCB0aW1lLCBnYm9vbGVhbiBuZXh0KQoreworICBndWludCBpbmRleCA9IC0xOworICBndWludDY0IHRvdGFsOworCisgIEdTVF9MT0dfT0JKRUNUIChhdmksICJzZWFyY2ggdGltZTolIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHRpbWUpKTsKKworICAvKiBlYXN5IChhbmQgY29tbW9uKSBjYXNlcyAqLworICBpZiAodGltZSA9PSAwIHx8IHN0cmVhbS0+aWR4X24gPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHRpbWUgPj0gc3RyZWFtLT5pZHhfZHVyYXRpb24pCisgICAgcmV0dXJuIHN0cmVhbS0+aWR4X24gLSAxOworCisgIC8qIGZpZ3VyZSBvdXQgd2hlcmUgd2UgbmVlZCB0byBnby4gRm9yIHRoYXQgd2UgY29udmVydCB0aGUgdGltZSB0byBhbgorICAgKiBpbmRleCBlbnRyeSBvciB3ZSBjb252ZXJ0IGl0IHRvIGEgdG90YWwgYW5kIHRoZW4gZG8gYSBiaW5hcnkgc2VhcmNoLiAqLworICBpZiAoc3RyZWFtLT5pc192YnIpIHsKKyAgICAvKiBWQlIgc3RyZWFtIG5leHQgdGltZXN0YW1wICovCisgICAgaWYgKHN0cmVhbS0+c3RyaC0+dHlwZSA9PSBHU1RfUklGRl9GQ0NfYXVkcykgeworICAgICAgdG90YWwgPSBhdmlfc3RyZWFtX2NvbnZlcnRfdGltZV90b19mcmFtZXNfdW5jaGVja2VkIChzdHJlYW0sIHRpbWUpOworICAgIH0gZWxzZSB7CisgICAgICBpbmRleCA9IGF2aV9zdHJlYW1fY29udmVydF90aW1lX3RvX2ZyYW1lc191bmNoZWNrZWQgKHN0cmVhbSwgdGltZSk7CisgICAgICAvKiB0aGlzIGVudHJ5IHR5cGljYWxseSB1bmRlcnNob290cyB0aGUgdGFyZ2V0IHRpbWUsCisgICAgICAgKiBzbyBjaGVjayBhIGJpdCBtb3JlIGlmIG5leHQgbmVlZGVkICovCisgICAgICBpZiAobmV4dCAmJiBpbmRleCAhPSAtMSkgeworICAgICAgICBHc3RDbG9ja1RpbWUgaXRpbWUgPQorICAgICAgICAgICAgYXZpX3N0cmVhbV9jb252ZXJ0X2ZyYW1lc190b190aW1lX3VuY2hlY2tlZCAoc3RyZWFtLCBpbmRleCk7CisgICAgICAgIGlmIChpdGltZSA8IHRpbWUgJiYgaW5kZXggKyAxIDwgc3RyZWFtLT5pZHhfbikKKyAgICAgICAgICBpbmRleCsrOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmIChzdHJlYW0tPnN0cmgtPnR5cGUgPT0gR1NUX1JJRkZfRkNDX2F1ZHMpIHsKKyAgICAvKiBjb25zdGFudCByYXRlIHN0cmVhbSAqLworICAgIHRvdGFsID0gYXZpX3N0cmVhbV9jb252ZXJ0X3RpbWVfdG9fYnl0ZXNfdW5jaGVja2VkIChzdHJlYW0sIHRpbWUpOworICB9IGVsc2UKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKGluZGV4ID09IC0xKSB7CisgICAgR3N0QXZpSW5kZXhFbnRyeSAqZW50cnk7CisKKyAgICAvKiBubyBpbmRleCwgZmluZCBpbmRleCB3aXRoIGJpbmFyeSBzZWFyY2ggb24gdG90YWwgKi8KKyAgICBHU1RfTE9HX09CSkVDVCAoYXZpLCAiYmluYXJ5IHNlYXJjaCBmb3IgZW50cnkgd2l0aCB0b3RhbCAlIgorICAgICAgICBHX0dVSU5UNjRfRk9STUFULCB0b3RhbCk7CisKKyAgICBlbnRyeSA9IGdzdF91dGlsX2FycmF5X2JpbmFyeV9zZWFyY2ggKHN0cmVhbS0+aW5kZXgsCisgICAgICAgIHN0cmVhbS0+aWR4X24sIHNpemVvZiAoR3N0QXZpSW5kZXhFbnRyeSksCisgICAgICAgIChHQ29tcGFyZURhdGFGdW5jKSBnc3RfYXZpX2RlbXV4X2luZGV4X2VudHJ5X3NlYXJjaCwKKyAgICAgICAgbmV4dCA/IEdTVF9TRUFSQ0hfTU9ERV9BRlRFUiA6IEdTVF9TRUFSQ0hfTU9ERV9CRUZPUkUsICZ0b3RhbCwgTlVMTCk7CisKKyAgICBpZiAoZW50cnkgPT0gTlVMTCkgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKGF2aSwgIm5vdCBmb3VuZCwgYXNzdW1lIGluZGV4IDAiKTsKKyAgICAgIGluZGV4ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZXggPSBlbnRyeSAtIHN0cmVhbS0+aW5kZXg7CisgICAgICBHU1RfTE9HX09CSkVDVCAoYXZpLCAiZm91bmQgYXQgJXUiLCBpbmRleCk7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9MT0dfT0JKRUNUIChhdmksICJjb252ZXJ0ZWQgdGltZSB0byBpbmRleCAldSIsIGluZGV4KTsKKyAgfQorCisgIHJldHVybiBpbmRleDsKK30KKworc3RhdGljIGlubGluZSBHc3RBdmlTdHJlYW0gKgorZ3N0X2F2aV9kZW11eF9zdHJlYW1fZm9yX2lkIChHc3RBdmlEZW11eCAqIGF2aSwgZ3VpbnQzMiBpZCkKK3sKKyAgZ3VpbnQgc3RyZWFtX25yOworICBHc3RBdmlTdHJlYW0gKnN0cmVhbTsKKworICAvKiBnZXQgdGhlIHN0cmVhbSBmb3IgdGhpcyBlbnRyeSAqLworICBzdHJlYW1fbnIgPSBDSFVOS0lEX1RPX1NUUkVBTU5SIChpZCk7CisgIGlmIChHX1VOTElLRUxZIChzdHJlYW1fbnIgPj0gYXZpLT5udW1fc3RyZWFtcykpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aSwKKyAgICAgICAgImludmFsaWQgc3RyZWFtIG5yICVkICgweCUwOHgsICUiIEdTVF9GT1VSQ0NfRk9STUFUICIpIiwgc3RyZWFtX25yLCBpZCwKKyAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChpZCkpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHN0cmVhbSA9ICZhdmktPnN0cmVhbVtzdHJlYW1fbnJdOworICBpZiAoR19VTkxJS0VMWSAoIXN0cmVhbS0+c3RyaCkpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aSwgIlVuaGFuZGxlZCBzdHJlYW0gJWQsIHNraXBwaW5nIiwgc3RyZWFtX25yKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gc3RyZWFtOworfQorCisvKgorICogZ3N0X2F2aV9kZW11eF9wYXJzZV9pbmRleDoKKyAqIEBhdmk6IGNhbGxpbmcgZWxlbWVudCAodXNlZCBmb3IgZGVidWdnaW5nL2Vycm9ycykuCisgKiBAYnVmOiBidWZmZXIgY29udGFpbmluZyB0aGUgZnVsbCBpbmRleC4KKyAqCisgKiBSZWFkIGluZGV4IGVudHJpZXMgZnJvbSB0aGUgcHJvdmlkZWQgYnVmZmVyLgorICogVGhlIGJ1ZmZlciBzaG91bGQgY29udGFpbiBhIEdTVF9SSUZGX1RBR19pZHgxIGNodW5rLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdmlfZGVtdXhfcGFyc2VfaW5kZXggKEdzdEF2aURlbXV4ICogYXZpLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludCBpLCBudW0sIG47CisgIGdzdF9yaWZmX2luZGV4X2VudHJ5ICppbmRleDsKKyAgR3N0Q2xvY2tUaW1lIHN0YW1wOworICBHc3RBdmlTdHJlYW0gKnN0cmVhbTsKKyAgR3N0QXZpSW5kZXhFbnRyeSBlbnRyeTsKKyAgZ3VpbnQzMiBpZDsKKworICBpZiAoIWJ1ZikKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICBzdGFtcCA9IGdzdF91dGlsX2dldF90aW1lc3RhbXAgKCk7CisKKyAgLyogc2VlIGhvdyBtYW55IGl0ZW1zIGluIHRoZSBpbmRleCAqLworICBudW0gPSBtYXAuc2l6ZSAvIHNpemVvZiAoZ3N0X3JpZmZfaW5kZXhfZW50cnkpOworICBpZiAobnVtID09IDApCisgICAgZ290byBlbXB0eV9saXN0OworCisgIEdTVF9JTkZPX09CSkVDVCAoYXZpLCAiUGFyc2luZyBpbmRleCwgbnJfZW50cmllcyA9ICU2ZCIsIG51bSk7CisKKyAgaW5kZXggPSAoZ3N0X3JpZmZfaW5kZXhfZW50cnkgKikgbWFwLmRhdGE7CisKKyAgLyogZmlndXJlIG91dCBpZiB0aGUgaW5kZXggaXMgMCBiYXNlZCBvciByZWxhdGl2ZSB0byB0aGUgTU9WSSBzdGFydCAqLworICBlbnRyeS5vZmZzZXQgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKCZpbmRleFswXS5vZmZzZXQpOworICBpZiAoZW50cnkub2Zmc2V0IDwgYXZpLT5vZmZzZXQpIHsKKyAgICBhdmktPmluZGV4X29mZnNldCA9IGF2aS0+b2Zmc2V0ICsgODsKKyAgICBHU1RfREVCVUcgKCJpbmRleF9vZmZzZXQgPSAlIiBHX0dVSU5UNjRfRk9STUFULCBhdmktPmluZGV4X29mZnNldCk7CisgIH0gZWxzZSB7CisgICAgYXZpLT5pbmRleF9vZmZzZXQgPSAwOworICAgIEdTVF9ERUJVRyAoImluZGV4IGlzIDAgYmFzZWQiKTsKKyAgfQorCisgIGZvciAoaSA9IDAsIG4gPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICBpZCA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoJmluZGV4W2ldLmlkKTsKKyAgICBlbnRyeS5vZmZzZXQgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKCZpbmRleFtpXS5vZmZzZXQpOworCisgICAgLyogc29tZSBzYW5pdHkgY2hlY2tzICovCisgICAgaWYgKEdfVU5MSUtFTFkgKGlkID09IEdTVF9SSUZGX3JlYyB8fCBpZCA9PSAwIHx8CisgICAgICAgICAgICAoZW50cnkub2Zmc2V0ID09IDAgJiYgbiA+IDApKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogZ2V0IHRoZSBzdHJlYW0gZm9yIHRoaXMgZW50cnkgKi8KKyAgICBzdHJlYW0gPSBnc3RfYXZpX2RlbXV4X3N0cmVhbV9mb3JfaWQgKGF2aSwgaWQpOworICAgIGlmIChHX1VOTElLRUxZICghc3RyZWFtKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogaGFuZGxlIG9mZnNldCBhbmQgc2l6ZSAqLworICAgIGVudHJ5Lm9mZnNldCArPSBhdmktPmluZGV4X29mZnNldCArIDg7CisgICAgZW50cnkuc2l6ZSA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoJmluZGV4W2ldLnNpemUpOworCisgICAgLyogaGFuZGxlIGZsYWdzICovCisgICAgaWYgKHN0cmVhbS0+c3RyaC0+dHlwZSA9PSBHU1RfUklGRl9GQ0NfYXVkcykgeworICAgICAgLyogYWxsIGF1ZGlvIGZyYW1lcyBhcmUga2V5ZnJhbWVzICovCisgICAgICBFTlRSWV9TRVRfS0VZRlJBTUUgKCZlbnRyeSk7CisgICAgfSBlbHNlIGlmIChzdHJlYW0tPnN0cmgtPnR5cGUgPT0gR1NUX1JJRkZfRkNDX3ZpZHMgJiYKKyAgICAgICAgc3RyZWFtLT5zdHJmLnZpZHMtPmNvbXByZXNzaW9uID09IEdTVF9SSUZGX0RYU0IpIHsKKyAgICAgIC8qIGFsbCB4c3ViIGZyYW1lcyBhcmUga2V5ZnJhbWVzICovCisgICAgICBFTlRSWV9TRVRfS0VZRlJBTUUgKCZlbnRyeSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGd1aW50MzIgZmxhZ3M7CisgICAgICAvKiBlbHNlIHJlYWQgZmxhZ3MgKi8KKyAgICAgIGZsYWdzID0gR1NUX1JFQURfVUlOVDMyX0xFICgmaW5kZXhbaV0uZmxhZ3MpOworICAgICAgaWYgKGZsYWdzICYgR1NUX1JJRkZfSUZfS0VZRlJBTUUpIHsKKyAgICAgICAgRU5UUllfU0VUX0tFWUZSQU1FICgmZW50cnkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRU5UUllfVU5TRVRfS0VZRlJBTUUgKCZlbnRyeSk7CisgICAgICB9CisgICAgfQorCisgICAgLyogYW5kIGFkZCAqLworICAgIGlmIChHX1VOTElLRUxZICghZ3N0X2F2aV9kZW11eF9hZGRfaW5kZXggKGF2aSwgc3RyZWFtLCBudW0sICZlbnRyeSkpKQorICAgICAgZ290byBvdXRfb2ZfbWVtOworCisgICAgbisrOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgLyogZ2V0IHN0cmVhbSBzdGF0cyBub3cgKi8KKyAgYXZpLT5oYXZlX2luZGV4ID0gZ3N0X2F2aV9kZW11eF9kb19pbmRleF9zdGF0cyAoYXZpKTsKKworICBzdGFtcCA9IGdzdF91dGlsX2dldF90aW1lc3RhbXAgKCkgLSBzdGFtcDsKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiaW5kZXggcGFyc2luZyB0b29rICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHN0YW1wKSk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitlbXB0eV9saXN0OgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiZW1wdHkgaW5kZXgiKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitvdXRfb2ZfbWVtOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF2aSwgUkVTT1VSQ0UsIE5PX1NQQUNFX0xFRlQsIChOVUxMKSwKKyAgICAgICAgKCJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciAldSoldT0ldSBieXRlcyIsCisgICAgICAgICAgICAoZ3VpbnQpIHNpemVvZiAoR3N0QXZpSW5kZXhFbnRyeSksIG51bSwKKyAgICAgICAgICAgIChndWludCkgc2l6ZW9mIChHc3RBdmlJbmRleEVudHJ5KSAqIG51bSkpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyoKKyAqIGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luZGV4OgorICogQGF2aTogYXZpIGRlbXV4ZXIgb2JqZWN0LgorICoKKyAqIFNlZWtzIHRvIGluZGV4IGFuZCByZWFkcyBpdC4KKyAqLworc3RhdGljIHZvaWQKK2dzdF9hdmlfZGVtdXhfc3RyZWFtX2luZGV4IChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXM7CisgIGd1aW50NjQgb2Zmc2V0ID0gYXZpLT5vZmZzZXQ7CisgIEdzdEJ1ZmZlciAqYnVmID0gTlVMTDsKKyAgZ3VpbnQzMiB0YWc7CisgIGd1aW50MzIgc2l6ZTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgR1NUX0RFQlVHICgiZGVtdXggc3RyZWFtIGluZGV4IGF0IG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFULCBvZmZzZXQpOworCisgIC8qIGdldCBjaHVuayBpbmZvcm1hdGlvbiAqLworICByZXMgPSBnc3RfcGFkX3B1bGxfcmFuZ2UgKGF2aS0+c2lua3BhZCwgb2Zmc2V0LCA4LCAmYnVmKTsKKyAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykKKyAgICBnb3RvIHB1bGxfZmFpbGVkOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGlmIChtYXAuc2l6ZSA8IDgpCisgICAgZ290byB0b29fc21hbGw7CisKKyAgLyogY2hlY2sgdGFnIGZpcnN0IGJlZm9yZSBibGluZHkgdHJ5aW5nIHRvIHJlYWQgJ3NpemUnIGJ5dGVzICovCisgIHRhZyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAobWFwLmRhdGEpOworICBzaXplID0gR1NUX1JFQURfVUlOVDMyX0xFIChtYXAuZGF0YSArIDQpOworICBpZiAodGFnID09IEdTVF9SSUZGX1RBR19MSVNUKSB7CisgICAgLyogdGhpcyBpcyB0aGUgbW92aSB0YWcgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJza2lwIExJU1QgY2h1bmssIHNpemUgJSIgR19HVUlOVDMyX0ZPUk1BVCwKKyAgICAgICAgKDggKyBHU1RfUk9VTkRfVVBfMiAoc2l6ZSkpKTsKKyAgICBvZmZzZXQgKz0gOCArIEdTVF9ST1VORF9VUF8yIChzaXplKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgICBidWYgPSBOVUxMOworICAgIHJlcyA9IGdzdF9wYWRfcHVsbF9yYW5nZSAoYXZpLT5zaW5rcGFkLCBvZmZzZXQsIDgsICZidWYpOworICAgIGlmIChyZXMgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIHB1bGxfZmFpbGVkOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBpZiAobWFwLnNpemUgPCA4KQorICAgICAgZ290byB0b29fc21hbGw7CisKKyAgICB0YWcgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKG1hcC5kYXRhKTsKKyAgICBzaXplID0gR1NUX1JFQURfVUlOVDMyX0xFIChtYXAuZGF0YSArIDQpOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgaWYgKHRhZyAhPSBHU1RfUklGRl9UQUdfaWR4MSkKKyAgICBnb3RvIG5vX2luZGV4OworICBpZiAoIXNpemUpCisgICAgZ290byB6ZXJvX2luZGV4OworCisgIEdTVF9ERUJVRyAoImluZGV4IGZvdW5kIGF0IG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFULCBvZmZzZXQpOworCisgIC8qIHJlYWQgY2h1bmssIGFkdmFuY2Ugb2Zmc2V0ICovCisgIGlmIChnc3RfcmlmZl9yZWFkX2NodW5rIChHU1RfRUxFTUVOVF9DQVNUIChhdmkpLAorICAgICAgICAgIGF2aS0+c2lua3BhZCwgJm9mZnNldCwgJnRhZywgJmJ1ZikgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuOworCisgIEdTVF9ERUJVRyAoIndpbGwgcGFyc2UgaW5kZXggY2h1bmsgc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCAiIGZvciB0YWcgJSIKKyAgICAgIEdTVF9GT1VSQ0NfRk9STUFULCBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpLCBHU1RfRk9VUkNDX0FSR1MgKHRhZykpOworCisgIGdzdF9hdmlfZGVtdXhfcGFyc2VfaW5kZXggKGF2aSwgYnVmKTsKKworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgLyogZGVidWcgb3VyIGluZGV4ZXMgKi8KKyAgeworICAgIGdpbnQgaTsKKyAgICBHc3RBdmlTdHJlYW0gKnN0cmVhbTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhdmktPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgIHN0cmVhbSA9ICZhdmktPnN0cmVhbVtpXTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInN0cmVhbSAldTogJXUgZnJhbWVzLCAlIiBHX0dJTlQ2NF9GT1JNQVQgIiBieXRlcyIsCisgICAgICAgICAgaSwgc3RyZWFtLT5pZHhfbiwgc3RyZWFtLT50b3RhbF9ieXRlcyk7CisgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworcHVsbF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksCisgICAgICAgICJwdWxsIHJhbmdlIGZhaWxlZDogcG9zPSUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBzaXplPTgiLCBvZmZzZXQpOworICAgIHJldHVybjsKKyAgfQordG9vX3NtYWxsOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiQnVmZmVyIGlzIHRvbyBzbWFsbCIpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm47CisgIH0KK25vX2luZGV4OgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksCisgICAgICAgICJObyBpbmRleCBkYXRhIChpZHgxKSBhZnRlciBtb3ZpIGNodW5rLCBidXQgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSk7CisgICAgcmV0dXJuOworICB9Cit6ZXJvX2luZGV4OgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksICJFbXB0eSBpbmRleCBkYXRhIChpZHgxKSBhZnRlciBtb3ZpIGNodW5rIik7CisgICAgcmV0dXJuOworICB9Cit9CisKKy8qCisgKiBnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleF9wdXNoOgorICogQGF2aTogYXZpIGRlbXV4ZXIgb2JqZWN0LgorICoKKyAqIFJlYWQgaW5kZXguCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleF9wdXNoIChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgZ3VpbnQ2NCBvZmZzZXQgPSBhdmktPmlkeDFfb2Zmc2V0OworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgZ3VpbnQzMiB0YWc7CisgIGd1aW50MzIgc2l6ZTsKKworICBHU1RfREVCVUcgKCJkZW11eCBzdHJlYW0gaW5kZXggYXQgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG9mZnNldCk7CisKKyAgLyogZ2V0IGNodW5rIGluZm9ybWF0aW9uICovCisgIGlmICghZ3N0X2F2aV9kZW11eF9wZWVrX2NodW5rIChhdmksICZ0YWcsICZzaXplKSkKKyAgICByZXR1cm47CisKKyAgLyogY2hlY2sgdGFnIGZpcnN0IGJlZm9yZSBibGluZGx5IHRyeWluZyB0byByZWFkICdzaXplJyBieXRlcyAqLworICBpZiAodGFnID09IEdTVF9SSUZGX1RBR19MSVNUKSB7CisgICAgLyogdGhpcyBpcyB0aGUgbW92aSB0YWcgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJza2lwIExJU1QgY2h1bmssIHNpemUgJSIgR19HVUlOVDMyX0ZPUk1BVCwKKyAgICAgICAgKDggKyBHU1RfUk9VTkRfVVBfMiAoc2l6ZSkpKTsKKyAgICBhdmktPmlkeDFfb2Zmc2V0ID0gb2Zmc2V0ICsgOCArIEdTVF9ST1VORF9VUF8yIChzaXplKTsKKyAgICAvKiBpc3N1ZSBzZWVrIHRvIGFsbG93IGNoYWluIGZ1bmN0aW9uIHRvIGhhbmRsZSBpdCBhbmQgcmV0dXJuISAqLworICAgIHBlcmZvcm1fc2Vla190b19vZmZzZXQgKGF2aSwgYXZpLT5pZHgxX29mZnNldCwgYXZpLT5zZWdtZW50X3NlcW51bSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHRhZyAhPSBHU1RfUklGRl9UQUdfaWR4MSkKKyAgICBnb3RvIG5vX2luZGV4OworCisgIEdTVF9ERUJVRyAoImluZGV4IGZvdW5kIGF0IG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFULCBvZmZzZXQpOworCisgIC8qIGZsdXNoIGNodW5rIGhlYWRlciAqLworICBnc3RfYWRhcHRlcl9mbHVzaCAoYXZpLT5hZGFwdGVyLCA4KTsKKyAgLyogcmVhZCBjaHVuayBwYXlsb2FkICovCisgIGJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChhdmktPmFkYXB0ZXIsIHNpemUpOworICBpZiAoIWJ1ZikKKyAgICBnb3RvIHB1bGxfZmFpbGVkOworICAvKiBhZHZhbmNlIG9mZnNldCAqLworICBvZmZzZXQgKz0gOCArIEdTVF9ST1VORF9VUF8yIChzaXplKTsKKworICBHU1RfREVCVUcgKCJ3aWxsIHBhcnNlIGluZGV4IGNodW5rIHNpemUgJSIgR19HU0laRV9GT1JNQVQgIiBmb3IgdGFnICUiCisgICAgICBHU1RfRk9VUkNDX0ZPUk1BVCwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSwgR1NUX0ZPVVJDQ19BUkdTICh0YWcpKTsKKworICBhdmktPm9mZnNldCA9IGF2aS0+Zmlyc3RfbW92aV9vZmZzZXQ7CisgIGdzdF9hdmlfZGVtdXhfcGFyc2VfaW5kZXggKGF2aSwgYnVmKTsKKworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgLyogZGVidWcgb3VyIGluZGV4ZXMgKi8KKyAgeworICAgIGdpbnQgaTsKKyAgICBHc3RBdmlTdHJlYW0gKnN0cmVhbTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhdmktPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgIHN0cmVhbSA9ICZhdmktPnN0cmVhbVtpXTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInN0cmVhbSAldTogJXUgZnJhbWVzLCAlIiBHX0dJTlQ2NF9GT1JNQVQgIiBieXRlcyIsCisgICAgICAgICAgaSwgc3RyZWFtLT5pZHhfbiwgc3RyZWFtLT50b3RhbF9ieXRlcyk7CisgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworcHVsbF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksCisgICAgICAgICJ0YWtpbmcgZGF0YSBmcm9tIGFkYXB0ZXIgZmFpbGVkOiBwb3M9JSIgR19HVUlOVDY0X0ZPUk1BVCAiIHNpemU9JXUiLAorICAgICAgICBvZmZzZXQsIHNpemUpOworICAgIHJldHVybjsKKyAgfQorbm9faW5kZXg6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aSwKKyAgICAgICAgIk5vIGluZGV4IGRhdGEgKGlkeDEpIGFmdGVyIG1vdmkgY2h1bmssIGJ1dCAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgR1NUX0ZPVVJDQ19BUkdTICh0YWcpKTsKKyAgICByZXR1cm47CisgIH0KK30KKworLyoKKyAqIGdzdF9hdmlfZGVtdXhfcGVla190YWc6CisgKgorICogUmV0dXJucyB0aGUgdGFnIGFuZCBzaXplIG9mIHRoZSBuZXh0IGNodW5rCisgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYXZpX2RlbXV4X3BlZWtfdGFnIChHc3RBdmlEZW11eCAqIGF2aSwgZ3VpbnQ2NCBvZmZzZXQsIGd1aW50MzIgKiB0YWcsCisgICAgZ3VpbnQgKiBzaXplKQoreworICBHc3RGbG93UmV0dXJuIHJlczsKKyAgR3N0QnVmZmVyICpidWYgPSBOVUxMOworICBHc3RNYXBJbmZvIG1hcDsKKworICByZXMgPSBnc3RfcGFkX3B1bGxfcmFuZ2UgKGF2aS0+c2lua3BhZCwgb2Zmc2V0LCA4LCAmYnVmKTsKKyAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykKKyAgICBnb3RvIHB1bGxfZmFpbGVkOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGlmIChtYXAuc2l6ZSAhPSA4KQorICAgIGdvdG8gd3Jvbmdfc2l6ZTsKKworICAqdGFnID0gR1NUX1JFQURfVUlOVDMyX0xFIChtYXAuZGF0YSk7CisgICpzaXplID0gR1NUX1JFQURfVUlOVDMyX0xFIChtYXAuZGF0YSArIDQpOworCisgIEdTVF9MT0dfT0JKRUNUIChhdmksICJUYWdbJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIl0gKHNpemU6JWQpICUiCisgICAgICBHX0dJTlQ2NF9GT1JNQVQgIiAtLSAlIiBHX0dJTlQ2NF9GT1JNQVQsIEdTVF9GT1VSQ0NfQVJHUyAoKnRhZyksCisgICAgICAqc2l6ZSwgb2Zmc2V0ICsgOCwgb2Zmc2V0ICsgOCArIChnaW50NjQpICogc2l6ZSk7CisKK2RvbmU6CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK3B1bGxfZmFpbGVkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAicHVsbF9yYW5nZWQgcmV0dXJuZWQgJXMiLCBnc3RfZmxvd19nZXRfbmFtZSAocmVzKSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQord3Jvbmdfc2l6ZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgImdvdCAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIHdoaWNoIGlzIDw+IDggYnl0ZXMiLAorICAgICAgICBtYXAuc2l6ZSk7CisgICAgcmVzID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBkb25lOworICB9Cit9CisKKy8qCisgKiBnc3RfYXZpX2RlbXV4X25leHRfZGF0YV9idWZmZXI6CisgKgorICogUmV0dXJucyB0aGUgb2Zmc2V0IGFuZCBzaXplIG9mIHRoZSBuZXh0IGJ1ZmZlcgorICogUG9zaXRpb24gaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBidWZmZXIgKGFmdGVyIHRhZyBhbmQgc2l6ZSkKKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hdmlfZGVtdXhfbmV4dF9kYXRhX2J1ZmZlciAoR3N0QXZpRGVtdXggKiBhdmksIGd1aW50NjQgKiBvZmZzZXQsCisgICAgZ3VpbnQzMiAqIHRhZywgZ3VpbnQgKiBzaXplKQoreworICBndWludDY0IG9mZiA9ICpvZmZzZXQ7CisgIGd1aW50IF9zaXplID0gMDsKKyAgR3N0Rmxvd1JldHVybiByZXM7CisKKyAgZG8geworICAgIHJlcyA9IGdzdF9hdmlfZGVtdXhfcGVla190YWcgKGF2aSwgb2ZmLCB0YWcsICZfc2l6ZSk7CisgICAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworICAgIGlmICgqdGFnID09IEdTVF9SSUZGX1RBR19MSVNUIHx8ICp0YWcgPT0gR1NUX1JJRkZfVEFHX1JJRkYpCisgICAgICBvZmYgKz0gOCArIDQ7ICAgICAgICAgICAgIC8qIHNraXAgdGFnICsgc2l6ZSArIHN1YnRhZyAqLworICAgIGVsc2UgeworICAgICAgKm9mZnNldCA9IG9mZiArIDg7CisgICAgICAqc2l6ZSA9IF9zaXplOworICAgICAgYnJlYWs7CisgICAgfQorICB9IHdoaWxlIChUUlVFKTsKKworICByZXR1cm4gcmVzOworfQorCisvKgorICogZ3N0X2F2aV9kZW11eF9zdHJlYW1fc2NhbjoKKyAqIEBhdmk6IGNhbGxpbmcgZWxlbWVudCAodXNlZCBmb3IgZGVidWdnaW5nL2Vycm9ycykuCisgKgorICogU2NhbiB0aGUgZmlsZSBmb3IgYWxsIGNodW5rcyB0byAiY3JlYXRlIiBhIG5ldyBpbmRleC4KKyAqIHB1bGwtcmFuZ2UgYmFzZWQKKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYXZpX2RlbXV4X3N0cmVhbV9zY2FuIChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXM7CisgIEdzdEF2aVN0cmVhbSAqc3RyZWFtOworICBndWludDY0IHBvcyA9IDA7CisgIGd1aW50NjQgbGVuZ3RoOworICBnaW50NjQgdG1wbGVuZ3RoOworICBndWludDMyIHRhZyA9IDA7CisgIGd1aW50IG51bTsKKworICAvKiBGSVhNRToKKyAgICogLSBpbXBsZW1lbnQgbm9uLXNlZWthYmxlIHNvdXJjZSBzdXBwb3J0LgorICAgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiQ3JlYXRpbmcgaW5kZXgiKTsKKworICAvKiBnZXQgdGhlIHNpemUgb2YgdGhlIGZpbGUgKi8KKyAgaWYgKCFnc3RfcGFkX3BlZXJfcXVlcnlfZHVyYXRpb24gKGF2aS0+c2lua3BhZCwgR1NUX0ZPUk1BVF9CWVRFUywgJnRtcGxlbmd0aCkpCisgICAgcmV0dXJuIEZBTFNFOworICBsZW5ndGggPSB0bXBsZW5ndGg7CisKKyAgLyogZ3Vlc3MgdGhlIHRvdGFsIGFtb3VudCBvZiBlbnRyaWVzIHdlIGV4cGVjdCAqLworICBudW0gPSAxNjAwMDsKKworICB3aGlsZSAoVFJVRSkgeworICAgIEdzdEF2aUluZGV4RW50cnkgZW50cnk7CisgICAgZ3VpbnQgc2l6ZSA9IDA7CisKKyAgICAvKiBzdGFydCByZWFkaW5nIGRhdGEgYnVmZmVycyB0byBmaW5kIHRoZSBpZCBhbmQgb2Zmc2V0ICovCisgICAgcmVzID0gZ3N0X2F2aV9kZW11eF9uZXh0X2RhdGFfYnVmZmVyIChhdmksICZwb3MsICZ0YWcsICZzaXplKTsKKyAgICBpZiAoR19VTkxJS0VMWSAocmVzICE9IEdTVF9GTE9XX09LKSkKKyAgICAgIGJyZWFrOworCisgICAgLyogZ2V0IHN0cmVhbSAqLworICAgIHN0cmVhbSA9IGdzdF9hdmlfZGVtdXhfc3RyZWFtX2Zvcl9pZCAoYXZpLCB0YWcpOworICAgIGlmIChHX1VOTElLRUxZICghc3RyZWFtKSkKKyAgICAgIGdvdG8gbmV4dDsKKworICAgIC8qIHdlIGNhbid0IGZpZ3VyZSBvdXQgdGhlIGtleWZyYW1lcywgYXNzdW1lIHRoZXkgYWxsIGFyZSAqLworICAgIGVudHJ5LmZsYWdzID0gR1NUX0FWSV9LRVlGUkFNRTsKKyAgICBlbnRyeS5vZmZzZXQgPSBwb3M7CisgICAgZW50cnkuc2l6ZSA9IHNpemU7CisKKyAgICAvKiBhbmQgYWRkIHRvIHRoZSBpbmRleCBvZiB0aGlzIHN0cmVhbSAqLworICAgIGlmIChHX1VOTElLRUxZICghZ3N0X2F2aV9kZW11eF9hZGRfaW5kZXggKGF2aSwgc3RyZWFtLCBudW0sICZlbnRyeSkpKQorICAgICAgZ290byBvdXRfb2ZfbWVtOworCisgIG5leHQ6CisgICAgLyogdXBkYXRlIHBvc2l0aW9uICovCisgICAgcG9zICs9IEdTVF9ST1VORF9VUF8yIChzaXplKTsKKyAgICBpZiAoR19VTkxJS0VMWSAocG9zID4gbGVuZ3RoKSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksCisgICAgICAgICAgIlN0b3BwaW5nIGluZGV4IGxvb2t1cCBzaW5jZSB3ZSBhcmUgZnVydGhlciB0aGFuIEVPRiIpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLyogY29sbGVjdCBzdGF0cyAqLworICBhdmktPmhhdmVfaW5kZXggPSBnc3RfYXZpX2RlbXV4X2RvX2luZGV4X3N0YXRzIChhdmkpOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworb3V0X29mX21lbToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChhdmksIFJFU09VUkNFLCBOT19TUEFDRV9MRUZULCAoTlVMTCksCisgICAgICAgICgiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgJXUqJXU9JXUgYnl0ZXMiLAorICAgICAgICAgICAgKGd1aW50KSBzaXplb2YgKEdzdEF2aUluZGV4RW50cnkpLCBudW0sCisgICAgICAgICAgICAoZ3VpbnQpIHNpemVvZiAoR3N0QXZpSW5kZXhFbnRyeSkgKiBudW0pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdmlfZGVtdXhfY2FsY3VsYXRlX2R1cmF0aW9uc19mcm9tX2luZGV4IChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgZ3VpbnQgaTsKKyAgR3N0Q2xvY2tUaW1lIHRvdGFsOworICBHc3RBdmlTdHJlYW0gKnN0cmVhbTsKKworICB0b3RhbCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisKKyAgLyogYWxsIHN0cmVhbXMgc3RhcnQgYXQgYSB0aW1lc3RhbXAgMCAqLworICBmb3IgKGkgPSAwOyBpIDwgYXZpLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uLCBoZHVyYXRpb247CisgICAgZ3N0X3JpZmZfc3RyaCAqc3RyaDsKKworICAgIHN0cmVhbSA9ICZhdmktPnN0cmVhbVtpXTsKKyAgICBpZiAoR19VTkxJS0VMWSAoIXN0cmVhbSB8fCAhc3RyZWFtLT5pZHhfbiB8fCAhKHN0cmggPSBzdHJlYW0tPnN0cmgpKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogZ2V0IGhlYWRlciBkdXJhdGlvbiBmb3IgdGhlIHN0cmVhbSAqLworICAgIGhkdXJhdGlvbiA9IHN0cmVhbS0+aGRyX2R1cmF0aW9uOworICAgIC8qIGluZGV4IGR1cmF0aW9uIGNhbGN1bGF0ZWQgZHVyaW5nIHBhcnNpbmcgKi8KKyAgICBkdXJhdGlvbiA9IHN0cmVhbS0+aWR4X2R1cmF0aW9uOworCisgICAgLyogbm93IHBpY2sgYSBnb29kIGR1cmF0aW9uICovCisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChkdXJhdGlvbikpIHsKKyAgICAgIC8qIGluZGV4IGdhdmUgdmFsaWQgZHVyYXRpb24sIHVzZSB0aGF0ICovCisgICAgICBHU1RfSU5GTyAoIlN0cmVhbSAlcCBkdXJhdGlvbiBhY2NvcmRpbmcgdG8gaW5kZXg6ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBzdHJlYW0sIEdTVF9USU1FX0FSR1MgKGR1cmF0aW9uKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGZhbGwgYmFjayB0byBoZWFkZXIgaW5mbyB0byBjYWxjdWxhdGUgYSBkdXJhdGlvbiAqLworICAgICAgZHVyYXRpb24gPSBoZHVyYXRpb247CisgICAgfQorICAgIEdTVF9JTkZPICgiU2V0dGluZyBkdXJhdGlvbiBvZiBzdHJlYW0gIyVkIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgaSwgR1NUX1RJTUVfQVJHUyAoZHVyYXRpb24pKTsKKyAgICAvKiBzZXQgZHVyYXRpb24gZm9yIHRoZSBzdHJlYW0gKi8KKyAgICBzdHJlYW0tPmR1cmF0aW9uID0gZHVyYXRpb247CisKKyAgICAvKiBmaW5kIHRvdGFsIGR1cmF0aW9uICovCisgICAgaWYgKHRvdGFsID09IEdTVF9DTE9DS19USU1FX05PTkUgfHwKKyAgICAgICAgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChkdXJhdGlvbikgJiYgZHVyYXRpb24gPiB0b3RhbCkpCisgICAgICB0b3RhbCA9IGR1cmF0aW9uOworICB9CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEICh0b3RhbCkgJiYgKHRvdGFsID4gMCkpIHsKKyAgICAvKiBub3cgdXBkYXRlIHRoZSBkdXJhdGlvbiBmb3IgdGhvc2Ugc3RyZWFtcyB3aGVyZSB3ZSBoYWQgbm9uZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBhdmktPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgIHN0cmVhbSA9ICZhdmktPnN0cmVhbVtpXTsKKworICAgICAgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtLT5kdXJhdGlvbikKKyAgICAgICAgICB8fCBzdHJlYW0tPmR1cmF0aW9uID09IDApIHsKKyAgICAgICAgc3RyZWFtLT5kdXJhdGlvbiA9IHRvdGFsOworCisgICAgICAgIEdTVF9JTkZPICgiU3RyZWFtICVwIGR1cmF0aW9uIGFjY29yZGluZyB0byB0b3RhbDogJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgc3RyZWFtLCBHU1RfVElNRV9BUkdTICh0b3RhbCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGFuZCBzZXQgdGhlIHRvdGFsIGR1cmF0aW9uIGluIHRoZSBzZWdtZW50LiAqLworICBHU1RfSU5GTyAoIlNldHRpbmcgdG90YWwgZHVyYXRpb24gdG86ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRvdGFsKSk7CisKKyAgYXZpLT5zZWdtZW50LmR1cmF0aW9uID0gdG90YWw7Cit9CisKKy8qIHJldHVybnMgRkFMU0UgaWYgdGhlcmUgYXJlIG5vIHBhZHMgdG8gZGVsaXZlciBldmVudCB0bywKKyAqIG90aGVyd2lzZSBUUlVFICh3aGF0ZXZlciB0aGUgb3V0Y29tZSBvZiBldmVudCBzZW5kaW5nKSwKKyAqIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgZXZlbnQuICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdmlfZGVtdXhfcHVzaF9ldmVudCAoR3N0QXZpRGVtdXggKiBhdmksIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJlc3VsdCA9IEZBTFNFOworICBnaW50IGk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic2VuZGluZyAlcyBldmVudCB0byAlZCBzdHJlYW1zIiwKKyAgICAgIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSwgYXZpLT5udW1fc3RyZWFtcyk7CisKKyAgZm9yIChpID0gMDsgaSA8IGF2aS0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgIEdzdEF2aVN0cmVhbSAqc3RyZWFtID0gJmF2aS0+c3RyZWFtW2ldOworCisgICAgaWYgKHN0cmVhbS0+cGFkKSB7CisgICAgICByZXN1bHQgPSBUUlVFOworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzdHJlYW0tPnBhZCwgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpKTsKKyAgICB9CisgIH0KKyAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXZpX2RlbXV4X2NoZWNrX3NlZWthYmlsaXR5IChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgR3N0UXVlcnkgKnF1ZXJ5OworICBnYm9vbGVhbiBzZWVrYWJsZSA9IEZBTFNFOworICBnaW50NjQgc3RhcnQgPSAtMSwgc3RvcCA9IC0xOworCisgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19zZWVraW5nIChHU1RfRk9STUFUX0JZVEVTKTsKKyAgaWYgKCFnc3RfcGFkX3BlZXJfcXVlcnkgKGF2aS0+c2lua3BhZCwgcXVlcnkpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic2Vla2luZyBxdWVyeSBmYWlsZWQiKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksIE5VTEwsICZzZWVrYWJsZSwgJnN0YXJ0LCAmc3RvcCk7CisKKyAgLyogdHJ5IGhhcmRlciB0byBxdWVyeSB1cHN0cmVhbSBzaXplIGlmIHdlIGRpZG4ndCBnZXQgaXQgdGhlIGZpcnN0IHRpbWUgKi8KKyAgaWYgKHNlZWthYmxlICYmIHN0b3AgPT0gLTEpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJkb2luZyBkdXJhdGlvbiBxdWVyeSB0byBmaXggdXAgdW5zZXQgc3RvcCIpOworICAgIGdzdF9wYWRfcGVlcl9xdWVyeV9kdXJhdGlvbiAoYXZpLT5zaW5rcGFkLCBHU1RfRk9STUFUX0JZVEVTLCAmc3RvcCk7CisgIH0KKworICAvKiBpZiB1cHN0cmVhbSBkb2Vzbid0IGtub3cgdGhlIHNpemUsIGl0J3MgbGlrZWx5IHRoYXQgaXQncyBub3Qgc2Vla2FibGUgaW4KKyAgICogcHJhY3RpY2UgZXZlbiBpZiBpdCB0ZWNobmljYWxseSBtYXkgYmUgc2Vla2FibGUgKi8KKyAgaWYgKHNlZWthYmxlICYmIChzdGFydCAhPSAwIHx8IHN0b3AgPD0gc3RhcnQpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic2Vla2FibGUgYnV0IHVua25vd24gc3RhcnQvc3RvcCAtPiBkaXNhYmxlIik7CisgICAgc2Vla2FibGUgPSBGQUxTRTsKKyAgfQorCitkb25lOgorICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgInNlZWthYmxlOiAlZCAoJSIgR19HVUlOVDY0X0ZPUk1BVCAiIC0gJSIKKyAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIikiLCBzZWVrYWJsZSwgc3RhcnQsIHN0b3ApOworICBhdmktPnNlZWthYmxlID0gc2Vla2FibGU7CisKKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7Cit9CisKKy8qCisgKiBSZWFkIEFWSSBoZWFkZXJzIHdoZW4gc3RyZWFtaW5nCisgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXJfcHVzaCAoR3N0QXZpRGVtdXggKiBhdmkpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGd1aW50MzIgdGFnID0gMDsKKyAgZ3VpbnQzMiBsdGFnID0gMDsKKyAgZ3VpbnQzMiBzaXplID0gMDsKKyAgY29uc3QgZ3VpbnQ4ICpkYXRhOworICBHc3RCdWZmZXIgKmJ1ZiA9IE5VTEwsICpzdWIgPSBOVUxMOworICBndWludCBvZmZzZXQgPSA0OworICBnaW50IGk7CisgIEdzdFRhZ0xpc3QgKnRhZ3MgPSBOVUxMOworICBndWludDggZm91cmNjWzRdOworCisgIEdTVF9ERUJVRyAoIlJlYWRpbmcgYW5kIHBhcnNpbmcgYXZpIGhlYWRlcnM6ICVkIiwgYXZpLT5oZWFkZXJfc3RhdGUpOworCisgIHN3aXRjaCAoYXZpLT5oZWFkZXJfc3RhdGUpIHsKKyAgICBjYXNlIEdTVF9BVklfREVNVVhfSEVBREVSX1RBR19MSVNUOgorICAgIGFnYWluOgorICAgICAgaWYgKGdzdF9hdmlfZGVtdXhfcGVla19jaHVuayAoYXZpLCAmdGFnLCAmc2l6ZSkpIHsKKyAgICAgICAgYXZpLT5vZmZzZXQgKz0gOCArIEdTVF9ST1VORF9VUF8yIChzaXplKTsKKyAgICAgICAgaWYgKHRhZyAhPSBHU1RfUklGRl9UQUdfTElTVCkKKyAgICAgICAgICBnb3RvIGhlYWRlcl9ub19saXN0OworCisgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChhdmktPmFkYXB0ZXIsIDgpOworICAgICAgICAvKiBGaW5kIHRoZSAnaGRybCcgTElTVCB0YWcgKi8KKyAgICAgICAgR1NUX0RFQlVHICgiUmVhZGluZyAlZCBieXRlcyIsIHNpemUpOworICAgICAgICBidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoYXZpLT5hZGFwdGVyLCBzaXplKTsKKworICAgICAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKGJ1ZiwgMCwgZm91cmNjLCA0KTsKKworICAgICAgICBpZiAoR1NUX1JFQURfVUlOVDMyX0xFIChmb3VyY2MpICE9IEdTVF9SSUZGX0xJU1RfaGRybCkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLCAiSW52YWxpZCBBVkkgaGVhZGVyIChubyBoZHJsIGF0IHN0YXJ0KTogJSIKKyAgICAgICAgICAgICAgR1NUX0ZPVVJDQ19GT1JNQVQsIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICBnb3RvIGFnYWluOworICAgICAgICB9CisKKyAgICAgICAgLyogbWluZCBwYWRkaW5nICovCisgICAgICAgIGlmIChzaXplICYgMSkKKyAgICAgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAoYXZpLT5hZGFwdGVyLCAxKTsKKworICAgICAgICBHU1RfREVCVUcgKCInaGRybCcgTElTVCB0YWcgZm91bmQuIFBhcnNpbmcgbmV4dCBjaHVuayIpOworCisgICAgICAgIGdzdF9hdmlfZGVtdXhfcm91bmR1cF9saXN0IChhdmksICZidWYpOworCisgICAgICAgIC8qIHRoZSBoZHJsIHN0YXJ0cyB3aXRoIGEgJ2F2aWgnIGhlYWRlciAqLworICAgICAgICBpZiAoIWdzdF9yaWZmX3BhcnNlX2NodW5rIChHU1RfRUxFTUVOVF9DQVNUIChhdmkpLCBidWYsICZvZmZzZXQsICZ0YWcsCisgICAgICAgICAgICAgICAgJnN1YikpCisgICAgICAgICAgZ290byBoZWFkZXJfbm9fYXZpaDsKKworICAgICAgICBpZiAodGFnICE9IEdTVF9SSUZGX1RBR19hdmloKQorICAgICAgICAgIGdvdG8gaGVhZGVyX25vX2F2aWg7CisKKyAgICAgICAgaWYgKCFnc3RfYXZpX2RlbXV4X3BhcnNlX2F2aWggKGF2aSwgc3ViLCAmYXZpLT5hdmloKSkKKyAgICAgICAgICBnb3RvIGhlYWRlcl93cm9uZ19hdmloOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIkFWSSBoZWFkZXIgb2ssIHJlYWRpbmcgZWxlbW50cyBmcm9tIGhlYWRlciIpOworCisgICAgICAgIC8qIG5vdywgcmVhZCB0aGUgZWxlbWVudHMgZnJvbSB0aGUgaGVhZGVyIHVudGlsIHRoZSBlbmQgKi8KKyAgICAgICAgd2hpbGUgKGdzdF9yaWZmX3BhcnNlX2NodW5rIChHU1RfRUxFTUVOVF9DQVNUIChhdmkpLCBidWYsICZvZmZzZXQsICZ0YWcsCisgICAgICAgICAgICAgICAgJnN1YikpIHsKKyAgICAgICAgICAvKiBzdWIgY2FuIGJlIE5VTEwgb24gZW1wdHkgdGFncyAqLworICAgICAgICAgIGlmICghc3ViKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBzd2l0Y2ggKHRhZykgeworICAgICAgICAgICAgY2FzZSBHU1RfUklGRl9UQUdfTElTVDoKKyAgICAgICAgICAgICAgaWYgKGdzdF9idWZmZXJfZ2V0X3NpemUgKHN1YikgPCA0KQorICAgICAgICAgICAgICAgIGdvdG8gbmV4dDsKKworICAgICAgICAgICAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKHN1YiwgMCwgZm91cmNjLCA0KTsKKworICAgICAgICAgICAgICBzd2l0Y2ggKEdTVF9SRUFEX1VJTlQzMl9MRSAoZm91cmNjKSkgeworICAgICAgICAgICAgICAgIGNhc2UgR1NUX1JJRkZfTElTVF9zdHJsOgorICAgICAgICAgICAgICAgICAgaWYgKCEoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0gKGF2aSwgc3ViKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3ViID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoYXZpLCBTVFJFQU0sIERFTVVYLCAoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImZhaWxlZCB0byBwYXJzZSBzdHJlYW0sIGlnbm9yaW5nIikpOworICAgICAgICAgICAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBzdWIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgICAgIGNhc2UgR1NUX1JJRkZfTElTVF9vZG1sOgorICAgICAgICAgICAgICAgICAgZ3N0X2F2aV9kZW11eF9wYXJzZV9vZG1sIChhdmksIHN1Yik7CisgICAgICAgICAgICAgICAgICBzdWIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLAorICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGxpc3QgJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiBpbiBBVkkgaGVhZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKEdTVF9SRUFEX1VJTlQzMl9MRSAoZm91cmNjKSkpOworICAgICAgICAgICAgICAgICAgLyogZmFsbC10aHJvdWdoICovCisgICAgICAgICAgICAgICAgY2FzZSBHU1RfUklGRl9UQUdfSlVOUToKKyAgICAgICAgICAgICAgICBjYXNlIEdTVF9SSUZGX1RBR19KVU5LOgorICAgICAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHU1RfUklGRl9JRElUOgorICAgICAgICAgICAgICBnc3RfYXZpX2RlbXV4X3BhcnNlX2lkaXQgKGF2aSwgc3ViKTsKKyAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksCisgICAgICAgICAgICAgICAgICAiVW5rbm93biB0YWcgJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiBpbiBBVkkgaGVhZGVyIiwKKyAgICAgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSk7CisgICAgICAgICAgICAgIC8qIE9ubHkgZ2V0IGJ1ZmZlciBmb3IgZGVidWdnaW5nIGlmIHRoZSBtZW1kdW1wIGlzIG5lZWRlZCAgKi8KKyAgICAgICAgICAgICAgaWYgKGdzdF9kZWJ1Z19jYXRlZ29yeV9nZXRfdGhyZXNob2xkIChHU1RfQ0FUX0RFRkFVTFQpID49IDkpIHsKKyAgICAgICAgICAgICAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgICAgICAgICAgICAgIGdzdF9idWZmZXJfbWFwIChzdWIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICAgICAgICAgICAgR1NUX01FTURVTVBfT0JKRUNUIChhdmksICJVbmtub3duIHRhZyIsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoc3ViLCAmbWFwKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX1JJRkZfVEFHX0pVTlE6CisgICAgICAgICAgICBjYXNlIEdTVF9SSUZGX1RBR19KVU5LOgorICAgICAgICAgICAgbmV4dDoKKyAgICAgICAgICAgICAgLyogbW92ZSB0byBuZXh0IGNodW5rICovCisgICAgICAgICAgICAgIGlmIChzdWIpCisgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoc3ViKTsKKyAgICAgICAgICAgICAgc3ViID0gTlVMTDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgIEdTVF9ERUJVRyAoImVsZW1lbnRzIHBhcnNlZCIpOworCisgICAgICAgIC8qIGNoZWNrIHBhcnNlZCBzdHJlYW1zICovCisgICAgICAgIGlmIChhdmktPm51bV9zdHJlYW1zID09IDApIHsKKyAgICAgICAgICBnb3RvIG5vX3N0cmVhbXM7CisgICAgICAgIH0gZWxzZSBpZiAoYXZpLT5udW1fc3RyZWFtcyAhPSBhdmktPmF2aWgtPnN0cmVhbXMpIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aSwKKyAgICAgICAgICAgICAgIlN0cmVhbSBoZWFkZXIgbWVudGlvbmVkICVkIHN0cmVhbXMsIGJ1dCAlZCBhdmFpbGFibGUiLAorICAgICAgICAgICAgICBhdmktPmF2aWgtPnN0cmVhbXMsIGF2aS0+bnVtX3N0cmVhbXMpOworICAgICAgICB9CisgICAgICAgIEdTVF9ERUJVRyAoIkdldCBqdW5rIGFuZCBpbmZvIG5leHQiKTsKKyAgICAgICAgYXZpLT5oZWFkZXJfc3RhdGUgPSBHU1RfQVZJX0RFTVVYX0hFQURFUl9JTkZPOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogTmVlZCBtb3JlIGRhdGEgKi8KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIH0KKyAgICAgIC8qIGZhbGwtdGhvdWdoICovCisgICAgY2FzZSBHU1RfQVZJX0RFTVVYX0hFQURFUl9JTkZPOgorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic2tpcHBpbmcganVuayBiZXR3ZWVuIGhlYWRlciBhbmQgZGF0YSAuLi4iKTsKKyAgICAgIHdoaWxlIChUUlVFKSB7CisgICAgICAgIGlmIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGF2aS0+YWRhcHRlcikgPCAxMikKKyAgICAgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgICAgICAgZGF0YSA9IGdzdF9hZGFwdGVyX21hcCAoYXZpLT5hZGFwdGVyLCAxMik7CisgICAgICAgIHRhZyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSk7CisgICAgICAgIHNpemUgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEgKyA0KTsKKyAgICAgICAgbHRhZyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDgpOworICAgICAgICBnc3RfYWRhcHRlcl91bm1hcCAoYXZpLT5hZGFwdGVyKTsKKworICAgICAgICBpZiAodGFnID09IEdTVF9SSUZGX1RBR19MSVNUKSB7CisgICAgICAgICAgc3dpdGNoIChsdGFnKSB7CisgICAgICAgICAgICBjYXNlIEdTVF9SSUZGX0xJU1RfbW92aToKKyAgICAgICAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGF2aS0+YWRhcHRlciwgMTIpOworICAgICAgICAgICAgICBpZiAoIWF2aS0+Zmlyc3RfbW92aV9vZmZzZXQpCisgICAgICAgICAgICAgICAgYXZpLT5maXJzdF9tb3ZpX29mZnNldCA9IGF2aS0+b2Zmc2V0OworICAgICAgICAgICAgICBhdmktPm9mZnNldCArPSAxMjsKKyAgICAgICAgICAgICAgYXZpLT5pZHgxX29mZnNldCA9IGF2aS0+b2Zmc2V0ICsgc2l6ZSAtIDQ7CisgICAgICAgICAgICAgIGdvdG8gc2tpcHBpbmdfZG9uZTsKKyAgICAgICAgICAgIGNhc2UgR1NUX1JJRkZfTElTVF9JTkZPOgorICAgICAgICAgICAgICBHU1RfREVCVUcgKCJGb3VuZCBJTkZPIGNodW5rIik7CisgICAgICAgICAgICAgIGlmIChnc3RfYXZpX2RlbXV4X3BlZWtfY2h1bmsgKGF2aSwgJnRhZywgJnNpemUpKSB7CisgICAgICAgICAgICAgICAgR1NUX0RFQlVHICgiZ290IHNpemUgJWQiLCBzaXplKTsKKyAgICAgICAgICAgICAgICBhdmktPm9mZnNldCArPSAxMjsKKyAgICAgICAgICAgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAoYXZpLT5hZGFwdGVyLCAxMik7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPiA0KSB7CisgICAgICAgICAgICAgICAgICBidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoYXZpLT5hZGFwdGVyLCBzaXplIC0gNCk7CisgICAgICAgICAgICAgICAgICAvKiBtaW5kIHBhZGRpbmcgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChzaXplICYgMSkKKyAgICAgICAgICAgICAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGF2aS0+YWRhcHRlciwgMSk7CisgICAgICAgICAgICAgICAgICBnc3RfcmlmZl9wYXJzZV9pbmZvIChHU1RfRUxFTUVOVF9DQVNUIChhdmkpLCBidWYsICZ0YWdzKTsKKyAgICAgICAgICAgICAgICAgIGlmICh0YWdzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdmktPmdsb2JhbHRhZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICBnc3RfdGFnX2xpc3RfaW5zZXJ0IChhdmktPmdsb2JhbHRhZ3MsIHRhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSk7CisgICAgICAgICAgICAgICAgICAgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICBhdmktPmdsb2JhbHRhZ3MgPSB0YWdzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB0YWdzID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAgIGF2aS0+b2Zmc2V0ICs9IEdTVF9ST1VORF9VUF8yIChzaXplKSAtIDQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIEdTVF9ERUJVRyAoInNraXBwaW5nIElORk8gTElTVCBwcmVmaXgiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogTmVlZCBtb3JlIGRhdGEgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBpZiAoZ3N0X2F2aV9kZW11eF9wZWVrX2NodW5rIChhdmksICZ0YWcsICZzaXplKSB8fCBzaXplID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiBhY2NlcHQgMCBzaXplIGJ1ZmZlciBoZXJlICovCisgICAgICAgICAgICAgICAgYXZpLT5hYm9ydF9idWZmZXJpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBhdmktPm9mZnNldCArPSA4ICsgR1NUX1JPVU5EX1VQXzIgKHNpemUpOworICAgICAgICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChhdmktPmFkYXB0ZXIsIDggKyBHU1RfUk9VTkRfVVBfMiAoc2l6ZSkpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIE5lZWQgbW9yZSBkYXRhICovCisgICAgICAgICAgICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoZ3N0X2F2aV9kZW11eF9wZWVrX2NodW5rIChhdmksICZ0YWcsICZzaXplKSB8fCBzaXplID09IDApIHsKKyAgICAgICAgICAgIC8qIGFjY2VwdCAwIHNpemUgYnVmZmVyIGhlcmUgKi8KKyAgICAgICAgICAgIGF2aS0+YWJvcnRfYnVmZmVyaW5nID0gRkFMU0U7CisgICAgICAgICAgICBhdmktPm9mZnNldCArPSA4ICsgR1NUX1JPVU5EX1VQXzIgKHNpemUpOworICAgICAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGF2aS0+YWRhcHRlciwgOCArIEdTVF9ST1VORF9VUF8yIChzaXplKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIE5lZWQgbW9yZSBkYXRhICovCisgICAgICAgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX1dBUk5JTkcgKCJ1bmhhbmRsZWQgaGVhZGVyIHN0YXRlOiAlZCIsIGF2aS0+aGVhZGVyX3N0YXRlKTsKKyAgICAgIGJyZWFrOworICB9Citza2lwcGluZ19kb25lOgorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInNraXBwaW5nIGRvbmUgLi4uIChzdHJlYW1zPSV1LCBzdHJlYW1bMF0uaW5kZXhlcz0lcCkiLAorICAgICAgYXZpLT5udW1fc3RyZWFtcywgYXZpLT5zdHJlYW1bMF0uaW5kZXhlcyk7CisKKyAgR1NUX0RFQlVHICgiRm91bmQgbW92aSBjaHVuay4gU3RhcnRpbmcgdG8gc3RyZWFtIGRhdGEiKTsKKyAgYXZpLT5zdGF0ZSA9IEdTVF9BVklfREVNVVhfTU9WSTsKKworICAvKiBubyBpbmRleGVzIGluIHB1c2ggbW9kZSwgYnV0IGl0IHN0aWxsIHNldHMgc29tZSB2YXJpYWJsZXMgKi8KKyAgZ3N0X2F2aV9kZW11eF9jYWxjdWxhdGVfZHVyYXRpb25zX2Zyb21faW5kZXggKGF2aSk7CisKKyAgZ3N0X2F2aV9kZW11eF9leHBvc2Vfc3RyZWFtcyAoYXZpLCBUUlVFKTsKKworICAvKiBwcmVwYXJlIGFsbCBzdHJlYW1zIGZvciBpbmRleCAwICovCisgIGZvciAoaSA9IDA7IGkgPCBhdmktPm51bV9zdHJlYW1zOyBpKyspCisgICAgYXZpLT5zdHJlYW1baV0uY3VycmVudF9lbnRyeSA9IDA7CisKKyAgLyogY3JlYXRlIGluaXRpYWwgTkVXU0VHTUVOVCBldmVudCAqLworICBpZiAoYXZpLT5zZWdfZXZlbnQpCisgICAgZ3N0X2V2ZW50X3VucmVmIChhdmktPnNlZ19ldmVudCk7CisgIGF2aS0+c2VnX2V2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmYXZpLT5zZWdtZW50KTsKKyAgaWYgKGF2aS0+c2VnbWVudF9zZXFudW0pCisgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGF2aS0+c2VnX2V2ZW50LCBhdmktPnNlZ21lbnRfc2VxbnVtKTsKKworICBnc3RfYXZpX2RlbXV4X2NoZWNrX3NlZWthYmlsaXR5IChhdmkpOworCisgIC8qIGF0IHRoaXMgcG9pbnQgd2Uga25vdyBhbGwgdGhlIHN0cmVhbXMgYW5kIHdlIGNhbiBzaWduYWwgdGhlIG5vIG1vcmUKKyAgICogcGFkcyBzaWduYWwgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic2lnbmFsaW5nIG5vIG1vcmUgcGFkcyIpOworICBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgKEdTVF9FTEVNRU5UX0NBU1QgKGF2aSkpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworICAvKiBFUlJPUlMgKi8KK25vX3N0cmVhbXM6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXZpLCBTVFJFQU0sIERFTVVYLCAoTlVMTCksICgiTm8gc3RyZWFtcyBmb3VuZCIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2hlYWRlcl9ub19saXN0OgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF2aSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAoIkludmFsaWQgQVZJIGhlYWRlciAobm8gTElTVCBhdCBzdGFydCk6ICUiCisgICAgICAgICAgICBHU1RfRk9VUkNDX0ZPUk1BVCwgR1NUX0ZPVVJDQ19BUkdTICh0YWcpKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CitoZWFkZXJfbm9fYXZpaDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChhdmksIFNUUkVBTSwgREVNVVgsIChOVUxMKSwKKyAgICAgICAgKCJJbnZhbGlkIEFWSSBoZWFkZXIgKG5vIGF2aWggYXQgc3RhcnQpOiAlIgorICAgICAgICAgICAgR1NUX0ZPVVJDQ19GT1JNQVQsIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSkpOworICAgIGlmIChzdWIpCisgICAgICBnc3RfYnVmZmVyX3VucmVmIChzdWIpOworCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2hlYWRlcl93cm9uZ19hdmloOgorICB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdmlfZGVtdXhfYWRkX2RhdGVfdGFnIChHc3RBdmlEZW11eCAqIGF2aSwgZ2ludCB5LCBnaW50IG0sIGdpbnQgZCwKKyAgICBnaW50IGgsIGdpbnQgbWluLCBnaW50IHMpCit7CisgIEdEYXRlICpkYXRlOworICBHc3REYXRlVGltZSAqZHQ7CisKKyAgZGF0ZSA9IGdfZGF0ZV9uZXdfZG15IChkLCBtLCB5KTsKKyAgaWYgKCFnX2RhdGVfdmFsaWQgKGRhdGUpKSB7CisgICAgLyogYm9ndXMgZGF0ZSAqLworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLCAiUmVmdXNpbmcgdG8gYWRkIGludmFsaWQgZGF0ZSAlZC0lZC0lZCIsIHksIG0sIGQpOworICAgIGdfZGF0ZV9mcmVlIChkYXRlKTsKKyAgICByZXR1cm47CisgIH0KKworICBkdCA9IGdzdF9kYXRlX3RpbWVfbmV3X2xvY2FsX3RpbWUgKHksIG0sIGQsIGgsIG1pbiwgcyk7CisKKyAgaWYgKGF2aS0+Z2xvYmFsdGFncyA9PSBOVUxMKQorICAgIGF2aS0+Z2xvYmFsdGFncyA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisKKyAgZ3N0X3RhZ19saXN0X2FkZCAoYXZpLT5nbG9iYWx0YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIEdTVF9UQUdfREFURSwgZGF0ZSwKKyAgICAgIE5VTEwpOworICBnX2RhdGVfZnJlZSAoZGF0ZSk7CisgIGlmIChkdCkgeworICAgIGdzdF90YWdfbGlzdF9hZGQgKGF2aS0+Z2xvYmFsdGFncywgR1NUX1RBR19NRVJHRV9SRVBMQUNFLCBHU1RfVEFHX0RBVEVfVElNRSwKKyAgICAgICAgZHQsIE5VTEwpOworICAgIGdzdF9kYXRlX3RpbWVfdW5yZWYgKGR0KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9wYXJzZV9pZGl0X251bXNfb25seSAoR3N0QXZpRGVtdXggKiBhdmksIGdjaGFyICogZGF0YSkKK3sKKyAgZ2ludCB5LCBtLCBkOworICBnaW50IGhyID0gMCwgbWluID0gMCwgc2VjID0gMDsKKyAgZ2ludCByZXQ7CisKKyAgR1NUX0RFQlVHICgiZGF0YSA6ICclcyciLCBkYXRhKTsKKworICByZXQgPSBzc2NhbmYgKGRhdGEsICIlZDolZDolZCAlZDolZDolZCIsICZ5LCAmbSwgJmQsICZociwgJm1pbiwgJnNlYyk7CisgIGlmIChyZXQgPCAzKSB7CisgICAgLyogQXR0ZW1wdCBZWVlZL01NL0RELyBISDpNTSB2YXJpYW50IChmb3VuZCBpbiBDQVNJTyBjYW1lcmFzKSAqLworICAgIHJldCA9IHNzY2FuZiAoZGF0YSwgIiUwNGQvJTAyZC8lMDJkLyAlZDolZCIsICZ5LCAmbSwgJmQsICZociwgJm1pbik7CisgICAgaWYgKHJldCA8IDMpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLCAiRmFpbGVkIHRvIHBhcnNlIElESVQgdGFnIik7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGdzdF9hdmlfZGVtdXhfYWRkX2RhdGVfdGFnIChhdmksIHksIG0sIGQsIGhyLCBtaW4sIHNlYyk7Cit9CisKK3N0YXRpYyBnaW50CitnZXRfbW9udGhfbnVtIChnY2hhciAqIGRhdGEsIGd1aW50IHNpemUpCit7CisgIGlmIChnX2FzY2lpX3N0cm5jYXNlY21wIChkYXRhLCAiamFuIiwgMykgPT0gMCkgeworICAgIHJldHVybiAxOworICB9IGVsc2UgaWYgKGdfYXNjaWlfc3RybmNhc2VjbXAgKGRhdGEsICJmZWIiLCAzKSA9PSAwKSB7CisgICAgcmV0dXJuIDI7CisgIH0gZWxzZSBpZiAoZ19hc2NpaV9zdHJuY2FzZWNtcCAoZGF0YSwgIm1hciIsIDMpID09IDApIHsKKyAgICByZXR1cm4gMzsKKyAgfSBlbHNlIGlmIChnX2FzY2lpX3N0cm5jYXNlY21wIChkYXRhLCAiYXByIiwgMykgPT0gMCkgeworICAgIHJldHVybiA0OworICB9IGVsc2UgaWYgKGdfYXNjaWlfc3RybmNhc2VjbXAgKGRhdGEsICJtYXkiLCAzKSA9PSAwKSB7CisgICAgcmV0dXJuIDU7CisgIH0gZWxzZSBpZiAoZ19hc2NpaV9zdHJuY2FzZWNtcCAoZGF0YSwgImp1biIsIDMpID09IDApIHsKKyAgICByZXR1cm4gNjsKKyAgfSBlbHNlIGlmIChnX2FzY2lpX3N0cm5jYXNlY21wIChkYXRhLCAianVsIiwgMykgPT0gMCkgeworICAgIHJldHVybiA3OworICB9IGVsc2UgaWYgKGdfYXNjaWlfc3RybmNhc2VjbXAgKGRhdGEsICJhdWciLCAzKSA9PSAwKSB7CisgICAgcmV0dXJuIDg7CisgIH0gZWxzZSBpZiAoZ19hc2NpaV9zdHJuY2FzZWNtcCAoZGF0YSwgInNlcCIsIDMpID09IDApIHsKKyAgICByZXR1cm4gOTsKKyAgfSBlbHNlIGlmIChnX2FzY2lpX3N0cm5jYXNlY21wIChkYXRhLCAib2N0IiwgMykgPT0gMCkgeworICAgIHJldHVybiAxMDsKKyAgfSBlbHNlIGlmIChnX2FzY2lpX3N0cm5jYXNlY21wIChkYXRhLCAibm92IiwgMykgPT0gMCkgeworICAgIHJldHVybiAxMTsKKyAgfSBlbHNlIGlmIChnX2FzY2lpX3N0cm5jYXNlY21wIChkYXRhLCAiZGVjIiwgMykgPT0gMCkgeworICAgIHJldHVybiAxMjsKKyAgfQorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9wYXJzZV9pZGl0X3RleHQgKEdzdEF2aURlbXV4ICogYXZpLCBnY2hhciAqIGRhdGEpCit7CisgIGdpbnQgeWVhciwgbW9udGgsIGRheTsKKyAgZ2ludCBob3VyLCBtaW4sIHNlYzsKKyAgZ2ludCByZXQ7CisgIGdjaGFyIHdlZWtkYXlbNF07CisgIGdjaGFyIG1vbnRoc3RyWzRdOworCisgIHJldCA9IHNzY2FuZiAoZGF0YSwgIiUzcyAlM3MgJWQgJWQ6JWQ6JWQgJWQiLCB3ZWVrZGF5LCBtb250aHN0ciwgJmRheSwgJmhvdXIsCisgICAgICAmbWluLCAmc2VjLCAmeWVhcik7CisgIGlmIChyZXQgIT0gNykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLCAiRmFpbGVkIHRvIHBhcnNlIElESVQgdGFnIik7CisgICAgcmV0dXJuOworICB9CisgIG1vbnRoID0gZ2V0X21vbnRoX251bSAobW9udGhzdHIsIHN0cmxlbiAobW9udGhzdHIpKTsKKyAgZ3N0X2F2aV9kZW11eF9hZGRfZGF0ZV90YWcgKGF2aSwgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWluLCBzZWMpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9wYXJzZV9pZGl0IChHc3RBdmlEZW11eCAqIGF2aSwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2NoYXIgKnB0cjsKKyAgZ3NpemUgbGVmdDsKKyAgZ2NoYXIgKnNhZmVkYXRhID0gTlVMTDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAvKgorICAgKiBBY2NvcmRpbmcgdG86CisgICAqIGh0dHA6Ly93d3cuZWRlbi1mb3VuZGF0aW9uLm9yZy9wcm9kdWN0cy9jb2RlL2ZpbG1fZGF0ZV9zdGFtcC9pbmRleC5odG1sCisgICAqCisgICAqIFRoaXMgdGFnIGNvdWxkIGJlIGluIG9uZSBvZiB0aGUgYmVsb3cgZm9ybWF0cworICAgKiAyMDA1OjA4OjE3IDExOjQyOjQzCisgICAqIFRIVSBPQ1QgMjYgMTY6NDY6MDQgMjAwNgorICAgKiBNb24gTWFyICAzIDA5OjQ0OjU2IDIwMDgKKyAgICoKKyAgICogRklYTUU6IE91ciBkYXRlIHRhZyBkb2Vzbid0IGluY2x1ZGUgaG91cnMKKyAgICovCisKKyAgLyogc2tpcCBldmVudHVhbCBpbml0aWFsIHdoaXRlc3BhY2UgKi8KKyAgcHRyID0gKGdjaGFyICopIG1hcC5kYXRhOworICBsZWZ0ID0gbWFwLnNpemU7CisKKyAgd2hpbGUgKGxlZnQgPiAwICYmIGdfYXNjaWlfaXNzcGFjZSAocHRyWzBdKSkgeworICAgIHB0cisrOworICAgIGxlZnQtLTsKKyAgfQorCisgIGlmIChsZWZ0ID09IDApIHsKKyAgICBnb3RvIG5vbl9wYXJzYWJsZTsKKyAgfQorCisgIC8qIG1ha2UgYSBzYWZlIGNvcHkgdG8gYWRkIGEgXDAgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nICovCisgIHNhZmVkYXRhID0gZ19zdHJuZHVwIChwdHIsIGxlZnQpOworCisgIC8qIHRlc3QgaWYgdGhlIGZpcnN0IGNoYXIgaXMgYSBhbHBoYSBvciBhIG51bWJlciAqLworICBpZiAoZ19hc2NpaV9pc2RpZ2l0IChwdHJbMF0pKSB7CisgICAgZ3N0X2F2aV9kZW11eF9wYXJzZV9pZGl0X251bXNfb25seSAoYXZpLCBzYWZlZGF0YSk7CisgICAgZ19mcmVlIChzYWZlZGF0YSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAoZ19hc2NpaV9pc2FscGhhIChwdHJbMF0pKSB7CisgICAgZ3N0X2F2aV9kZW11eF9wYXJzZV9pZGl0X3RleHQgKGF2aSwgc2FmZWRhdGEpOworICAgIGdfZnJlZSAoc2FmZWRhdGEpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZ19mcmVlIChzYWZlZGF0YSk7CisKK25vbl9wYXJzYWJsZToKKyAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksICJJRElUIHRhZyBoYXMgbm8gcGFyc2FibGUgaW5mbyIpOworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworfQorCitzdGF0aWMgdm9pZAorcGFyc2VfdGFnX3ZhbHVlIChHc3RBdmlEZW11eCAqIGF2aSwgR3N0VGFnTGlzdCAqIHRhZ2xpc3QsIGNvbnN0IGdjaGFyICogdHlwZSwKKyAgICBndWludDggKiBwdHIsIGd1aW50IHRzaXplKQoreworICBzdGF0aWMgY29uc3QgZ2NoYXIgKmVudl92YXJzW10gPSB7ICJHU1RfQVZJX1RBR19FTkNPRElORyIsCisgICAgIkdTVF9SSUZGX1RBR19FTkNPRElORyIsICJHU1RfVEFHX0VOQ09ESU5HIiwgTlVMTAorICB9OworICBHVHlwZSB0YWdfdHlwZTsKKyAgZ2NoYXIgKnZhbDsKKworICB0YWdfdHlwZSA9IGdzdF90YWdfZ2V0X3R5cGUgKHR5cGUpOworICB2YWwgPSBnc3RfdGFnX2ZyZWVmb3JtX3N0cmluZ190b191dGY4ICgoZ2NoYXIgKikgcHRyLCB0c2l6ZSwgZW52X3ZhcnMpOworCisgIGlmICh2YWwgIT0gTlVMTCkgeworICAgIGlmICh0YWdfdHlwZSA9PSBHX1RZUEVfU1RSSU5HKSB7CisgICAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdsaXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwgdHlwZSwgdmFsLCBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgR1ZhbHVlIHRhZ192YWwgPSB7IDAsIH07CisKKyAgICAgIGdfdmFsdWVfaW5pdCAoJnRhZ192YWwsIHRhZ190eXBlKTsKKyAgICAgIGlmIChnc3RfdmFsdWVfZGVzZXJpYWxpemUgKCZ0YWdfdmFsLCB2YWwpKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGRfdmFsdWUgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELCB0eXBlLCAmdGFnX3ZhbCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aSwgImNvdWxkIG5vdCBkZXNlcmlhbGl6ZSAnJXMnIGludG8gYSAiCisgICAgICAgICAgICAidGFnICVzIG9mIHR5cGUgJXMiLCB2YWwsIHR5cGUsIGdfdHlwZV9uYW1lICh0YWdfdHlwZSkpOworICAgICAgfQorICAgICAgZ192YWx1ZV91bnNldCAoJnRhZ192YWwpOworICAgIH0KKyAgICBnX2ZyZWUgKHZhbCk7CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksICJjb3VsZCBub3QgZXh0cmFjdCAlcyB0YWciLCB0eXBlKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJkIChHc3RBdmlEZW11eCAqIGF2aSwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQzMiB0YWc7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgaWYgKG1hcC5zaXplID4gNCkgeworICAgIGd1aW50OCAqcHRyID0gbWFwLmRhdGE7CisgICAgZ3NpemUgbGVmdCA9IG1hcC5zaXplOworCisgICAgLyogcGFyc2luZyBiYXNlZCBvbgorICAgICAqIGh0dHA6Ly93d3cuZWRlbi1mb3VuZGF0aW9uLm9yZy9wcm9kdWN0cy9jb2RlL2ZpbG1fZGF0ZV9zdGFtcC9pbmRleC5odG1sCisgICAgICovCisgICAgdGFnID0gR1NUX1JFQURfVUlOVDMyX0xFIChwdHIpOworICAgIGlmICgodGFnID09IEdTVF9NQUtFX0ZPVVJDQyAoJ0EnLCAnVicsICdJJywgJ0YnKSkgJiYgKG1hcC5zaXplID4gOTgpKSB7CisgICAgICBnc2l6ZSBzdWJfc2l6ZTsKKworICAgICAgcHRyICs9IDk4OworICAgICAgbGVmdCAtPSA5ODsKKyAgICAgIGlmICghbWVtY21wIChwdHIsICJGVUpJRklMTSIsIDgpKSB7CisgICAgICAgIEdTVF9NRU1EVU1QX09CSkVDVCAoYXZpLCAiZnVqaWZpbSB0YWciLCBwdHIsIDQ4KTsKKworICAgICAgICBwdHIgKz0gMTA7CisgICAgICAgIGxlZnQgLT0gMTA7CisgICAgICAgIHN1Yl9zaXplID0gMDsKKyAgICAgICAgd2hpbGUgKHB0cltzdWJfc2l6ZV0gJiYgc3ViX3NpemUgPCBsZWZ0KQorICAgICAgICAgIHN1Yl9zaXplKys7CisKKyAgICAgICAgaWYgKGF2aS0+Z2xvYmFsdGFncyA9PSBOVUxMKQorICAgICAgICAgIGF2aS0+Z2xvYmFsdGFncyA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZCAoYXZpLT5nbG9iYWx0YWdzLCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgICAgIEdTVF9UQUdfREVWSUNFX01BTlVGQUNUVVJFUiwgIkZVSklGSUxNIiwgTlVMTCk7CisgICAgICAgIHBhcnNlX3RhZ192YWx1ZSAoYXZpLCBhdmktPmdsb2JhbHRhZ3MsIEdTVF9UQUdfREVWSUNFX01PREVMLCBwdHIsCisgICAgICAgICAgICBzdWJfc2l6ZSk7CisKKyAgICAgICAgd2hpbGUgKHB0cltzdWJfc2l6ZV0gPT0gJ1wwJyAmJiBzdWJfc2l6ZSA8IGxlZnQpCisgICAgICAgICAgc3ViX3NpemUrKzsKKworICAgICAgICBwdHIgKz0gc3ViX3NpemU7CisgICAgICAgIGxlZnQgLT0gc3ViX3NpemU7CisgICAgICAgIHN1Yl9zaXplID0gMDsKKyAgICAgICAgd2hpbGUgKHB0cltzdWJfc2l6ZV0gJiYgc3ViX3NpemUgPCBsZWZ0KQorICAgICAgICAgIHN1Yl9zaXplKys7CisgICAgICAgIGlmIChwdHJbNF0gPT0gJzonKQorICAgICAgICAgIHB0cls0XSA9ICctJzsKKyAgICAgICAgaWYgKHB0cls3XSA9PSAnOicpCisgICAgICAgICAgcHRyWzddID0gJy0nOworCisgICAgICAgIHBhcnNlX3RhZ192YWx1ZSAoYXZpLCBhdmktPmdsb2JhbHRhZ3MsIEdTVF9UQUdfREFURV9USU1FLCBwdHIsCisgICAgICAgICAgICBzdWJfc2l6ZSk7CisgICAgICB9CisgICAgfQorICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7Cit9CisKKy8qCisgKiBnc3RfYXZpX2RlbXV4X3BhcnNlX25jZHQ6CisgKiBAZWxlbWVudDogY2FsbGVyIGVsZW1lbnQgKHVzZWQgZm9yIGRlYnVnZ2luZy9lcnJvcikuCisgKiBAYnVmOiBpbnB1dCBkYXRhIHRvIGJlIHVzZWQgZm9yIHBhcnNpbmcsIHN0cmlwcGVkIGZyb20gaGVhZGVyLgorICogQHRhZ2xpc3Q6IGEgcG9pbnRlciB0byBhIHRhZ2xpc3QgKHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24pCisgKiAgICAgICAgICAgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHN0cmVhbS4gTWF5IGJlCisgKiAgICAgICAgICAgTlVMTCBpZiBubyBzdXBwb3J0ZWQgdGFncyB3ZXJlIGZvdW5kLgorICoKKyAqIFBhcnNlcyBOaWtvbiBtZXRhZGF0YSBmcm9tIGlucHV0IGRhdGEuCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfYXZpX2RlbXV4X3BhcnNlX25jZHQgKEdzdEF2aURlbXV4ICogYXZpLCBHc3RCdWZmZXIgKiBidWYsCisgICAgR3N0VGFnTGlzdCAqKiBfdGFnbGlzdCkKK3sKKyAgR3N0TWFwSW5mbyBpbmZvOworICBndWludDggKnB0cjsKKyAgZ3NpemUgbGVmdDsKKyAgZ3VpbnQgdHNpemU7CisgIGd1aW50MzIgdGFnOworICBjb25zdCBnY2hhciAqdHlwZTsKKyAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKworICBnX3JldHVybl9pZl9mYWlsIChfdGFnbGlzdCAhPSBOVUxMKTsKKworICBpZiAoIWJ1ZikgeworICAgICpfdGFnbGlzdCA9IE5VTEw7CisgICAgcmV0dXJuOworICB9CisgIGdzdF9idWZmZXJfbWFwIChidWYsICZpbmZvLCBHU1RfTUFQX1JFQUQpOworCisgIHRhZ2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgIHB0ciA9IGluZm8uZGF0YTsKKyAgbGVmdCA9IGluZm8uc2l6ZTsKKworICB3aGlsZSAobGVmdCA+IDgpIHsKKyAgICB0YWcgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKHB0cik7CisgICAgdHNpemUgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKHB0ciArIDQpOworCisgICAgR1NUX01FTURVTVBfT0JKRUNUIChhdmksICJ0YWcgY2h1bmsiLCBwdHIsIE1JTiAodHNpemUgKyA4LCBsZWZ0KSk7CisKKyAgICBsZWZ0IC09IDg7CisgICAgcHRyICs9IDg7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJ0YWcgJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiwgc2l6ZSAldSIsCisgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSwgdHNpemUpOworCisgICAgaWYgKHRzaXplID4gbGVmdCkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksCisgICAgICAgICAgIlRhZ3NpemUgJWQgaXMgbGFyZ2VyIHRoYW4gYXZhaWxhYmxlIGRhdGEgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICAgICAgdHNpemUsIGxlZnQpOworICAgICAgdHNpemUgPSBsZWZ0OworICAgIH0KKworICAgIC8qIGZpbmQgb3V0IHRoZSB0eXBlIG9mIG1ldGFkYXRhICovCisgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgIGNhc2UgR1NUX1JJRkZfTElTVF9uY3RnOgorICAgICAgICB3aGlsZSAodHNpemUgPiA0KSB7CisgICAgICAgICAgZ3VpbnQxNiBzdWJfdGFnID0gR1NUX1JFQURfVUlOVDE2X0xFIChwdHIpOworICAgICAgICAgIGd1aW50MTYgc3ViX3NpemUgPSBHU1RfUkVBRF9VSU5UMTZfTEUgKHB0ciArIDIpOworCisgICAgICAgICAgdHNpemUgLT0gNDsKKyAgICAgICAgICBwdHIgKz0gNDsKKyAgICAgICAgICBsZWZ0IC09IDQ7CisKKyAgICAgICAgICBpZiAoc3ViX3NpemUgPiB0c2l6ZSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic3ViLXRhZyAldSwgc2l6ZSAldSIsIHN1Yl90YWcsIHN1Yl9zaXplKTsKKyAgICAgICAgICAvKiBodHRwOi8vd3d3LnNuby5waHkucXVlZW5zdS5jYS9+cGhpbC9leGlmdG9vbC9UYWdOYW1lcy9OaWtvbi5odG1sI05DVEcKKyAgICAgICAgICAgKiBmb3Igc29tZSByZWFzb24gdGhlIHN1Yl90YWcgaGFzIGEgKzIgb2Zmc2V0CisgICAgICAgICAgICovCisgICAgICAgICAgc3dpdGNoIChzdWJfdGFnKSB7CisgICAgICAgICAgICBjYXNlIDB4MDM6ICAgICAgICAgLyogTWFrZSAqLworICAgICAgICAgICAgICB0eXBlID0gR1NUX1RBR19ERVZJQ0VfTUFOVUZBQ1RVUkVSOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgwNDogICAgICAgICAvKiBNb2RlbCAqLworICAgICAgICAgICAgICB0eXBlID0gR1NUX1RBR19ERVZJQ0VfTU9ERUw7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAvKiBUT0RPOiAweDA1OiBpcyBzb2Z0d2FyZSB2ZXJzaW9uLCBsaWtlIFYxLjAgKi8KKyAgICAgICAgICAgIGNhc2UgMHgwNjogICAgICAgICAvKiBTb2Z0d2FyZSAqLworICAgICAgICAgICAgICB0eXBlID0gR1NUX1RBR19FTkNPREVSOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgxMzogICAgICAgICAvKiBDcmVhdGlvbkRhdGUgKi8KKyAgICAgICAgICAgICAgdHlwZSA9IEdTVF9UQUdfREFURV9USU1FOworICAgICAgICAgICAgICBpZiAobGVmdCA+IDcpIHsKKyAgICAgICAgICAgICAgICBpZiAocHRyWzRdID09ICc6JykKKyAgICAgICAgICAgICAgICAgIHB0cls0XSA9ICctJzsKKyAgICAgICAgICAgICAgICBpZiAocHRyWzddID09ICc6JykKKyAgICAgICAgICAgICAgICAgIHB0cls3XSA9ICctJzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHR5cGUgPSBOVUxMOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHR5cGUgIT0gTlVMTCAmJiBwdHJbMF0gIT0gJ1wwJykgeworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAibWFwcGVkIHRhZyAldSB0byB0YWcgJXMiLCBzdWJfdGFnLCB0eXBlKTsKKworICAgICAgICAgICAgcGFyc2VfdGFnX3ZhbHVlIChhdmksIHRhZ2xpc3QsIHR5cGUsIHB0ciwgc3ViX3NpemUpOworICAgICAgICAgIH0KKworICAgICAgICAgIHB0ciArPSBzdWJfc2l6ZTsKKyAgICAgICAgICB0c2l6ZSAtPSBzdWJfc2l6ZTsKKyAgICAgICAgICBsZWZ0IC09IHN1Yl9zaXplOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdHlwZSA9IE5VTEw7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLAorICAgICAgICAgICAgIlVua25vd24gbmNkdCAobWV0YWRhdGEpIHRhZyBlbnRyeSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSk7CisgICAgICAgIEdTVF9NRU1EVU1QX09CSkVDVCAoYXZpLCAiVW5rbm93biBuY2R0IiwgcHRyLCB0c2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICh0c2l6ZSAmIDEpIHsKKyAgICAgIHRzaXplKys7CisgICAgICBpZiAodHNpemUgPiBsZWZ0KQorICAgICAgICB0c2l6ZSA9IGxlZnQ7CisgICAgfQorCisgICAgcHRyICs9IHRzaXplOworICAgIGxlZnQgLT0gdHNpemU7CisgIH0KKworICBpZiAoIWdzdF90YWdfbGlzdF9pc19lbXB0eSAodGFnbGlzdCkpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgImV4dHJhY3RlZCB0YWdzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgdGFnbGlzdCk7CisgICAgKl90YWdsaXN0ID0gdGFnbGlzdDsKKyAgfSBlbHNlIHsKKyAgICAqX3RhZ2xpc3QgPSBOVUxMOworICAgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnbGlzdCk7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmaW5mbyk7CisKKyAgcmV0dXJuOworfQorCisvKgorICogUmVhZCBmdWxsIEFWSSBoZWFkZXJzLgorICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyX3B1bGwgKEdzdEF2aURlbXV4ICogYXZpKQoreworICBHc3RGbG93UmV0dXJuIHJlczsKKyAgR3N0QnVmZmVyICpidWYsICpzdWIgPSBOVUxMOworICBndWludDMyIHRhZzsKKyAgZ3VpbnQgb2Zmc2V0ID0gNDsKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IEdTVF9FTEVNRU5UX0NBU1QgKGF2aSk7CisgIEdzdENsb2NrVGltZSBzdGFtcDsKKyAgR3N0VGFnTGlzdCAqdGFncyA9IE5VTEw7CisgIGd1aW50OCBmb3VyY2NbNF07CisKKyAgc3RhbXAgPSBnc3RfdXRpbF9nZXRfdGltZXN0YW1wICgpOworCisgIC8qIHRoZSBoZWFkZXIgY29uc2lzdHMgb2YgYSAnaGRybCcgTElTVCB0YWcgKi8KKyAgcmVzID0gZ3N0X3JpZmZfcmVhZF9jaHVuayAoZWxlbWVudCwgYXZpLT5zaW5rcGFkLCAmYXZpLT5vZmZzZXQsICZ0YWcsICZidWYpOworICBpZiAocmVzICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gcHVsbF9yYW5nZV9mYWlsZWQ7CisgIGVsc2UgaWYgKHRhZyAhPSBHU1RfUklGRl9UQUdfTElTVCkKKyAgICBnb3RvIG5vX2xpc3Q7CisgIGVsc2UgaWYgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikgPCA0KQorICAgIGdvdG8gbm9faGVhZGVyOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInBhcnNpbmcgaGVhZGVycyIpOworCisgIC8qIEZpbmQgdGhlICdoZHJsJyBMSVNUIHRhZyAqLworICBnc3RfYnVmZmVyX2V4dHJhY3QgKGJ1ZiwgMCwgZm91cmNjLCA0KTsKKyAgd2hpbGUgKEdTVF9SRUFEX1VJTlQzMl9MRSAoZm91cmNjKSAhPSBHU1RfUklGRl9MSVNUX2hkcmwpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoYXZpLCAiYnVmZmVyIGNvbnRhaW5zICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKEdTVF9SRUFEX1VJTlQzMl9MRSAoZm91cmNjKSkpOworCisgICAgLyogRWF0IHVwICovCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAgIC8qIHJlYWQgbmV3IGNodW5rICovCisgICAgcmVzID0gZ3N0X3JpZmZfcmVhZF9jaHVuayAoZWxlbWVudCwgYXZpLT5zaW5rcGFkLCAmYXZpLT5vZmZzZXQsICZ0YWcsICZidWYpOworICAgIGlmIChyZXMgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIHB1bGxfcmFuZ2VfZmFpbGVkOworICAgIGVsc2UgaWYgKHRhZyAhPSBHU1RfUklGRl9UQUdfTElTVCkKKyAgICAgIGdvdG8gbm9fbGlzdDsKKyAgICBlbHNlIGlmIChnc3RfYnVmZmVyX2dldF9zaXplIChidWYpIDwgNCkKKyAgICAgIGdvdG8gbm9faGVhZGVyOworICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoYnVmLCAwLCBmb3VyY2MsIDQpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiaGRybCBMSVNUIHRhZyBmb3VuZCIpOworCisgIGdzdF9hdmlfZGVtdXhfcm91bmR1cF9saXN0IChhdmksICZidWYpOworCisgIC8qIHRoZSBoZHJsIHN0YXJ0cyB3aXRoIGEgJ2F2aWgnIGhlYWRlciAqLworICBpZiAoIWdzdF9yaWZmX3BhcnNlX2NodW5rIChlbGVtZW50LCBidWYsICZvZmZzZXQsICZ0YWcsICZzdWIpKQorICAgIGdvdG8gbm9fYXZpaDsKKyAgZWxzZSBpZiAodGFnICE9IEdTVF9SSUZGX1RBR19hdmloKQorICAgIGdvdG8gbm9fYXZpaDsKKyAgZWxzZSBpZiAoIWdzdF9hdmlfZGVtdXhfcGFyc2VfYXZpaCAoYXZpLCBzdWIsICZhdmktPmF2aWgpKQorICAgIGdvdG8gaW52YWxpZF9hdmloOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIkFWSSBoZWFkZXIgb2ssIHJlYWRpbmcgZWxlbWVudHMgZnJvbSBoZWFkZXIiKTsKKworICAvKiBub3csIHJlYWQgdGhlIGVsZW1lbnRzIGZyb20gdGhlIGhlYWRlciB1bnRpbCB0aGUgZW5kICovCisgIHdoaWxlIChnc3RfcmlmZl9wYXJzZV9jaHVuayAoZWxlbWVudCwgYnVmLCAmb2Zmc2V0LCAmdGFnLCAmc3ViKSkgeworICAgIEdzdE1hcEluZm8gbWFwOworCisgICAgLyogc3ViIGNhbiBiZSBOVUxMIG9uIGVtcHR5IHRhZ3MgKi8KKyAgICBpZiAoIXN1YikKKyAgICAgIGNvbnRpbnVlOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKHN1YiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICAgIHN3aXRjaCAodGFnKSB7CisgICAgICBjYXNlIEdTVF9SSUZGX1RBR19MSVNUOgorICAgICAgICBpZiAobWFwLnNpemUgPCA0KQorICAgICAgICAgIGdvdG8gbmV4dDsKKworICAgICAgICBzd2l0Y2ggKEdTVF9SRUFEX1VJTlQzMl9MRSAobWFwLmRhdGEpKSB7CisgICAgICAgICAgY2FzZSBHU1RfUklGRl9MSVNUX3N0cmw6CisgICAgICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChzdWIsICZtYXApOworICAgICAgICAgICAgaWYgKCEoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0gKGF2aSwgc3ViKSkpIHsKKyAgICAgICAgICAgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoYXZpLCBTVFJFQU0sIERFTVVYLCAoTlVMTCksCisgICAgICAgICAgICAgICAgICAoImZhaWxlZCB0byBwYXJzZSBzdHJlYW0sIGlnbm9yaW5nIikpOworICAgICAgICAgICAgICBzdWIgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ViID0gTlVMTDsKKyAgICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgICBjYXNlIEdTVF9SSUZGX0xJU1Rfb2RtbDoKKyAgICAgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKHN1YiwgJm1hcCk7CisgICAgICAgICAgICBnc3RfYXZpX2RlbXV4X3BhcnNlX29kbWwgKGF2aSwgc3ViKTsKKyAgICAgICAgICAgIHN1YiA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdTVF9SSUZGX0xJU1RfSU5GTzoKKyAgICAgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKHN1YiwgJm1hcCk7CisgICAgICAgICAgICBnc3RfYnVmZmVyX3Jlc2l6ZSAoc3ViLCA0LCAtMSk7CisgICAgICAgICAgICBnc3RfcmlmZl9wYXJzZV9pbmZvIChlbGVtZW50LCBzdWIsICZ0YWdzKTsKKyAgICAgICAgICAgIGlmICh0YWdzKSB7CisgICAgICAgICAgICAgIGlmIChhdmktPmdsb2JhbHRhZ3MpIHsKKyAgICAgICAgICAgICAgICBnc3RfdGFnX2xpc3RfaW5zZXJ0IChhdmktPmdsb2JhbHRhZ3MsIHRhZ3MsCisgICAgICAgICAgICAgICAgICAgIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSk7CisgICAgICAgICAgICAgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdzKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdmktPmdsb2JhbHRhZ3MgPSB0YWdzOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0YWdzID0gTlVMTDsKKyAgICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHN1Yik7CisgICAgICAgICAgICBzdWIgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHU1RfUklGRl9MSVNUX25jZHQ6CisgICAgICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChzdWIsICZtYXApOworICAgICAgICAgICAgZ3N0X2J1ZmZlcl9yZXNpemUgKHN1YiwgNCwgLTEpOworICAgICAgICAgICAgZ3N0X2F2aV9kZW11eF9wYXJzZV9uY2R0IChhdmksIHN1YiwgJnRhZ3MpOworICAgICAgICAgICAgaWYgKHRhZ3MpIHsKKyAgICAgICAgICAgICAgaWYgKGF2aS0+Z2xvYmFsdGFncykgeworICAgICAgICAgICAgICAgIGdzdF90YWdfbGlzdF9pbnNlcnQgKGF2aS0+Z2xvYmFsdGFncywgdGFncywKKyAgICAgICAgICAgICAgICAgICAgR1NUX1RBR19NRVJHRV9SRVBMQUNFKTsKKyAgICAgICAgICAgICAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ3MpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2aS0+Z2xvYmFsdGFncyA9IHRhZ3M7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhZ3MgPSBOVUxMOworICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoc3ViKTsKKyAgICAgICAgICAgIHN1YiA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksCisgICAgICAgICAgICAgICAgIlVua25vd24gbGlzdCAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIGluIEFWSSBoZWFkZXIiLAorICAgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoR1NUX1JFQURfVUlOVDMyX0xFIChtYXAuZGF0YSkpKTsKKyAgICAgICAgICAgIEdTVF9NRU1EVU1QX09CSkVDVCAoYXZpLCAiVW5rbm93biBsaXN0IiwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICAgICAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICAgICAgICAgIGNhc2UgR1NUX1JJRkZfVEFHX0pVTlE6CisgICAgICAgICAgY2FzZSBHU1RfUklGRl9UQUdfSlVOSzoKKyAgICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1JJRkZfSURJVDoKKyAgICAgICAgZ3N0X2F2aV9kZW11eF9wYXJzZV9pZGl0IChhdmksIHN1Yik7CisgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLAorICAgICAgICAgICAgIlVua25vd24gdGFnICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgaW4gQVZJIGhlYWRlciIsCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHRhZykpOworICAgICAgICBHU1RfTUVNRFVNUF9PQkpFQ1QgKGF2aSwgIlVua25vd24gdGFnIiwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICAgICAgLyogZmFsbC10aHJvdWdoICovCisgICAgICBjYXNlIEdTVF9SSUZGX1RBR19KVU5ROgorICAgICAgY2FzZSBHU1RfUklGRl9UQUdfSlVOSzoKKyAgICAgIG5leHQ6CisgICAgICAgIGlmIChzdWIpIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChzdWIsICZtYXApOworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHN1Yik7CisgICAgICAgIH0KKyAgICAgICAgc3ViID0gTlVMTDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIEdTVF9ERUJVRyAoImVsZW1lbnRzIHBhcnNlZCIpOworCisgIC8qIGNoZWNrIHBhcnNlZCBzdHJlYW1zICovCisgIGlmIChhdmktPm51bV9zdHJlYW1zID09IDApCisgICAgZ290byBub19zdHJlYW1zOworICBlbHNlIGlmIChhdmktPm51bV9zdHJlYW1zICE9IGF2aS0+YXZpaC0+c3RyZWFtcykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLAorICAgICAgICAiU3RyZWFtIGhlYWRlciBtZW50aW9uZWQgJWQgc3RyZWFtcywgYnV0ICVkIGF2YWlsYWJsZSIsCisgICAgICAgIGF2aS0+YXZpaC0+c3RyZWFtcywgYXZpLT5udW1fc3RyZWFtcyk7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJza2lwcGluZyBqdW5rIGJldHdlZW4gaGVhZGVyIGFuZCBkYXRhLCBvZmZzZXQ9JSIKKyAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIGF2aS0+b2Zmc2V0KTsKKworICAvKiBOb3csIGZpbmQgdGhlIGRhdGEgKGkuZS4gc2tpcCBhbGwganVuayBiZXR3ZWVuIGhlYWRlciBhbmQgZGF0YSkgKi8KKyAgZG8geworICAgIEdzdE1hcEluZm8gbWFwOworICAgIGd1aW50IHNpemU7CisgICAgZ3VpbnQzMiB0YWcsIGx0YWc7CisKKyAgICBidWYgPSBOVUxMOworICAgIHJlcyA9IGdzdF9wYWRfcHVsbF9yYW5nZSAoYXZpLT5zaW5rcGFkLCBhdmktPm9mZnNldCwgMTIsICZidWYpOworICAgIGlmIChyZXMgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInB1bGxfcmFuZ2UgZmFpbHVyZSB3aGlsZSBsb29raW5nIGZvciB0YWdzIik7CisgICAgICBnb3RvIHB1bGxfcmFuZ2VfZmFpbGVkOworICAgIH0gZWxzZSBpZiAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSA8IDEyKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksCisgICAgICAgICAgImdvdCAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIHdoaWNoIGlzIGxlc3MgdGhhbiAxMiBieXRlcyIsCisgICAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICAgIH0KKworICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgdGFnID0gR1NUX1JFQURfVUlOVDMyX0xFIChtYXAuZGF0YSk7CisgICAgc2l6ZSA9IEdTVF9SRUFEX1VJTlQzMl9MRSAobWFwLmRhdGEgKyA0KTsKKyAgICBsdGFnID0gR1NUX1JFQURfVUlOVDMyX0xFIChtYXAuZGF0YSArIDgpOworCisgICAgR1NUX0RFQlVHICgidGFnICUiIEdTVF9GT1VSQ0NfRk9STUFUICIsIHNpemUgJXUiLAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHRhZyksIHNpemUpOworICAgIEdTVF9NRU1EVU1QICgiVGFnIGNvbnRlbnQiLCBtYXAuZGF0YSwgbWFwLnNpemUpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAgIHN3aXRjaCAodGFnKSB7CisgICAgICBjYXNlIEdTVF9SSUZGX1RBR19MSVNUOnsKKyAgICAgICAgc3dpdGNoIChsdGFnKSB7CisgICAgICAgICAgY2FzZSBHU1RfUklGRl9MSVNUX21vdmk6CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksCisgICAgICAgICAgICAgICAgIlJlYWNoZWQgdGhlICdtb3ZpJyB0YWcsIHdlJ3JlIGRvbmUgd2l0aCBza2lwcGluZyIpOworICAgICAgICAgICAgZ290byBza2lwcGluZ19kb25lOworICAgICAgICAgIGNhc2UgR1NUX1JJRkZfTElTVF9JTkZPOgorICAgICAgICAgICAgcmVzID0KKyAgICAgICAgICAgICAgICBnc3RfcmlmZl9yZWFkX2NodW5rIChlbGVtZW50LCBhdmktPnNpbmtwYWQsICZhdmktPm9mZnNldCwgJnRhZywKKyAgICAgICAgICAgICAgICAmYnVmKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiY291bGRuJ3QgcmVhZCBJTkZPIGNodW5rIik7CisgICAgICAgICAgICAgIGdvdG8gcHVsbF9yYW5nZV9mYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBHU1RfREVCVUcgKCJnb3Qgc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSk7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDQpIHsKKyAgICAgICAgICAgICAgR1NUX0RFQlVHICgic2tpcHBpbmcgSU5GTyBMSVNUIHByZWZpeCIpOworICAgICAgICAgICAgICBhdmktPm9mZnNldCArPSAoNCAtIEdTVF9ST1VORF9VUF8yIChzaXplKSk7CisgICAgICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdWIgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWYsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIDQsIC0xKTsKKyAgICAgICAgICAgIGdzdF9yaWZmX3BhcnNlX2luZm8gKGVsZW1lbnQsIHN1YiwgJnRhZ3MpOworICAgICAgICAgICAgaWYgKHRhZ3MpIHsKKyAgICAgICAgICAgICAgaWYgKGF2aS0+Z2xvYmFsdGFncykgeworICAgICAgICAgICAgICAgIGdzdF90YWdfbGlzdF9pbnNlcnQgKGF2aS0+Z2xvYmFsdGFncywgdGFncywKKyAgICAgICAgICAgICAgICAgICAgR1NUX1RBR19NRVJHRV9SRVBMQUNFKTsKKyAgICAgICAgICAgICAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ3MpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2aS0+Z2xvYmFsdGFncyA9IHRhZ3M7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhZ3MgPSBOVUxMOworICAgICAgICAgICAgaWYgKHN1YikgeworICAgICAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChzdWIpOworICAgICAgICAgICAgICBzdWIgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICAgIC8qIGdzdF9yaWZmX3JlYWRfY2h1bmsoKSBoYXMgYWxyZWFkeSBhZHZhbmNlZCBhdmktPm9mZnNldCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHU1RfUklGRl9MSVNUX25jZHQ6CisgICAgICAgICAgICByZXMgPQorICAgICAgICAgICAgICAgIGdzdF9yaWZmX3JlYWRfY2h1bmsgKGVsZW1lbnQsIGF2aS0+c2lua3BhZCwgJmF2aS0+b2Zmc2V0LCAmdGFnLAorICAgICAgICAgICAgICAgICZidWYpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykgeworICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJjb3VsZG4ndCByZWFkIG5jZHQgY2h1bmsiKTsKKyAgICAgICAgICAgICAgZ290byBwdWxsX3JhbmdlX2ZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEdTVF9ERUJVRyAoImdvdCBzaXplICUiIEdfR1NJWkVfRk9STUFULCBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpKTsKKyAgICAgICAgICAgIGlmIChzaXplIDwgNCkgeworICAgICAgICAgICAgICBHU1RfREVCVUcgKCJza2lwcGluZyBuY2R0IExJU1QgcHJlZml4Iik7CisgICAgICAgICAgICAgIGF2aS0+b2Zmc2V0ICs9ICg0IC0gR1NUX1JPVU5EX1VQXzIgKHNpemUpKTsKKyAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN1YiA9IGdzdF9idWZmZXJfY29weV9yZWdpb24gKGJ1ZiwgR1NUX0JVRkZFUl9DT1BZX0FMTCwgNCwgLTEpOworICAgICAgICAgICAgZ3N0X2F2aV9kZW11eF9wYXJzZV9uY2R0IChhdmksIHN1YiwgJnRhZ3MpOworICAgICAgICAgICAgaWYgKHRhZ3MpIHsKKyAgICAgICAgICAgICAgaWYgKGF2aS0+Z2xvYmFsdGFncykgeworICAgICAgICAgICAgICAgIGdzdF90YWdfbGlzdF9pbnNlcnQgKGF2aS0+Z2xvYmFsdGFncywgdGFncywKKyAgICAgICAgICAgICAgICAgICAgR1NUX1RBR19NRVJHRV9SRVBMQUNFKTsKKyAgICAgICAgICAgICAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ3MpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2aS0+Z2xvYmFsdGFncyA9IHRhZ3M7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhZ3MgPSBOVUxMOworICAgICAgICAgICAgaWYgKHN1YikgeworICAgICAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChzdWIpOworICAgICAgICAgICAgICBzdWIgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICAgIC8qIGdzdF9yaWZmX3JlYWRfY2h1bmsoKSBoYXMgYWxyZWFkeSBhZHZhbmNlZCBhdmktPm9mZnNldCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLAorICAgICAgICAgICAgICAgICJTa2lwcGluZyB1bmtub3duIGxpc3QgdGFnICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAobHRhZykpOworICAgICAgICAgICAgYXZpLT5vZmZzZXQgKz0gOCArIEdTVF9ST1VORF9VUF8yIChzaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksICJTa2lwcGluZyB1bmtub3duIHRhZyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSk7CisgICAgICAgIC8qIEZhbGwtdGhyb3VnaCAqLworICAgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdKJywgJ1UnLCAnTicsICdRJyk6CisgICAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ0onLCAnVScsICdOJywgJ0snKToKKyAgICAgICAgLyogT25seSBnZXQgYnVmZmVyIGZvciBkZWJ1Z2dpbmcgaWYgdGhlIG1lbWR1bXAgaXMgbmVlZGVkICAqLworICAgICAgICBpZiAoZ3N0X2RlYnVnX2NhdGVnb3J5X2dldF90aHJlc2hvbGQgKEdTVF9DQVRfREVGQVVMVCkgPj0gOSkgeworICAgICAgICAgIGJ1ZiA9IE5VTEw7CisgICAgICAgICAgcmVzID0gZ3N0X3BhZF9wdWxsX3JhbmdlIChhdmktPnNpbmtwYWQsIGF2aS0+b2Zmc2V0LCBzaXplLCAmYnVmKTsKKyAgICAgICAgICBpZiAocmVzICE9IEdTVF9GTE9XX09LKSB7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJjb3VsZG4ndCByZWFkIElORk8gY2h1bmsiKTsKKyAgICAgICAgICAgIGdvdG8gcHVsbF9yYW5nZV9mYWlsZWQ7CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICAgICAgR1NUX01FTURVTVAgKCJKdW5rIiwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgYXZpLT5vZmZzZXQgKz0gOCArIEdTVF9ST1VORF9VUF8yIChzaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IHdoaWxlICgxKTsKK3NraXBwaW5nX2RvbmU6CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic2tpcHBpbmcgZG9uZSAuLi4gKHN0cmVhbXM9JXUsIHN0cmVhbVswXS5pbmRleGVzPSVwKSIsCisgICAgICBhdmktPm51bV9zdHJlYW1zLCBhdmktPnN0cmVhbVswXS5pbmRleGVzKTsKKworICAvKiBjcmVhdGUgb3IgcmVhZCBzdHJlYW0gaW5kZXggKGZvciBzZWVraW5nKSAqLworICBpZiAoYXZpLT5zdHJlYW1bMF0uaW5kZXhlcyAhPSBOVUxMKSB7CisgICAgLyogd2UgcmVhZCBhIHN1cGVyIGluZGV4IGFscmVhZHkgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3VwZXJpbmRleCgpICkgKi8KKyAgICBnc3RfYXZpX2RlbXV4X3JlYWRfc3ViaW5kZXhlc19wdWxsIChhdmkpOworICB9CisgIGlmICghYXZpLT5oYXZlX2luZGV4KSB7CisgICAgaWYgKGF2aS0+YXZpaC0+ZmxhZ3MgJiBHU1RfUklGRl9BVklIX0hBU0lOREVYKQorICAgICAgZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5kZXggKGF2aSk7CisKKyAgICAvKiBzdGlsbCBubyBpbmRleCwgc2NhbiAqLworICAgIGlmICghYXZpLT5oYXZlX2luZGV4KSB7CisgICAgICBnc3RfYXZpX2RlbXV4X3N0cmVhbV9zY2FuIChhdmkpOworCisgICAgICAvKiBzdGlsbCBubyBpbmRleC4uIHRoaXMgaXMgYSBmYXRhbCBlcnJvciBmb3Igbm93LgorICAgICAgICogRklYTUUsIHdlIHNob3VsZCBzd2l0Y2ggdG8gcGxhaW4gcHVzaCBtb2RlIHdpdGhvdXQgc2Vla2luZworICAgICAgICogaW5zdGVhZCBvZiBmYWlsaW5nLiAqLworICAgICAgaWYgKCFhdmktPmhhdmVfaW5kZXgpCisgICAgICAgIGdvdG8gbm9faW5kZXg7CisgICAgfQorICB9CisgIC8qIHVzZSB0aGUgaW5kZXhlcyBub3cgdG8gY29uc3RydWN0IG5pY2UgZHVyYXRpb25zICovCisgIGdzdF9hdmlfZGVtdXhfY2FsY3VsYXRlX2R1cmF0aW9uc19mcm9tX2luZGV4IChhdmkpOworCisgIGdzdF9hdmlfZGVtdXhfZXhwb3NlX3N0cmVhbXMgKGF2aSwgRkFMU0UpOworCisgIC8qIGRvIGluaXRpYWwgc2VlayB0byB0aGUgZGVmYXVsdCBzZWdtZW50IHZhbHVlcyAqLworICBnc3RfYXZpX2RlbXV4X2RvX3NlZWsgKGF2aSwgJmF2aS0+c2VnbWVudCwgMCk7CisKKyAgLyogY3JlYXRlIGluaXRpYWwgTkVXU0VHTUVOVCBldmVudCAqLworICBpZiAoYXZpLT5zZWdfZXZlbnQpCisgICAgZ3N0X2V2ZW50X3VucmVmIChhdmktPnNlZ19ldmVudCk7CisgIGF2aS0+c2VnX2V2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmYXZpLT5zZWdtZW50KTsKKyAgaWYgKGF2aS0+c2VnbWVudF9zZXFudW0pCisgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGF2aS0+c2VnX2V2ZW50LCBhdmktPnNlZ21lbnRfc2VxbnVtKTsKKworICBzdGFtcCA9IGdzdF91dGlsX2dldF90aW1lc3RhbXAgKCkgLSBzdGFtcDsKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAicHVsbGluZyBoZWFkZXIgdG9vayAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChzdGFtcCkpOworCisgIC8qIGF0IHRoaXMgcG9pbnQgd2Uga25vdyBhbGwgdGhlIHN0cmVhbXMgYW5kIHdlIGNhbiBzaWduYWwgdGhlIG5vIG1vcmUKKyAgICogcGFkcyBzaWduYWwgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic2lnbmFsaW5nIG5vIG1vcmUgcGFkcyIpOworICBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgKEdTVF9FTEVNRU5UX0NBU1QgKGF2aSkpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworICAvKiBFUlJPUlMgKi8KK25vX2xpc3Q6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXZpLCBTVFJFQU0sIERFTVVYLCAoTlVMTCksCisgICAgICAgICgiSW52YWxpZCBBVkkgaGVhZGVyIChubyBMSVNUIGF0IHN0YXJ0KTogJSIKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfRk9STUFULCBHU1RfRk9VUkNDX0FSR1MgKHRhZykpKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorbm9faGVhZGVyOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF2aSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAoIkludmFsaWQgQVZJIGhlYWRlciAobm8gaGRybCBhdCBzdGFydCk6ICUiCisgICAgICAgICAgICBHU1RfRk9VUkNDX0ZPUk1BVCwgR1NUX0ZPVVJDQ19BUkdTICh0YWcpKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK25vX2F2aWg6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXZpLCBTVFJFQU0sIERFTVVYLCAoTlVMTCksCisgICAgICAgICgiSW52YWxpZCBBVkkgaGVhZGVyIChubyBhdmloIGF0IHN0YXJ0KTogJSIKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfRk9STUFULCBHU1RfRk9VUkNDX0FSR1MgKHRhZykpKTsKKyAgICBpZiAoc3ViKQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoc3ViKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQoraW52YWxpZF9hdmloOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF2aSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAoIkludmFsaWQgQVZJIGhlYWRlciAoY2Fubm90IHBhcnNlIGF2aWggYXQgc3RhcnQpIikpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Citub19zdHJlYW1zOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF2aSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLCAoIk5vIHN0cmVhbXMgZm91bmQiKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Citub19pbmRleDoKKyAgeworICAgIEdTVF9XQVJOSU5HICgiZmlsZSB3aXRob3V0IG9yIHRvbyBiaWcgaW5kZXgiKTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXZpLCBTVFJFQU0sIERFTVVYLCAoTlVMTCksCisgICAgICAgICgiQ291bGQgbm90IGdldC9jcmVhdGUgaW5kZXgiKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CitwdWxsX3JhbmdlX2ZhaWxlZDoKKyAgeworICAgIGlmIChyZXMgPT0gR1NUX0ZMT1dfRkxVU0hJTkcpCisgICAgICByZXR1cm4gcmVzOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChhdmksIFNUUkVBTSwgREVNVVgsIChOVUxMKSwKKyAgICAgICAgKCJwdWxsX3JhbmdlIGZsb3cgcmVhZGluZyBoZWFkZXI6ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJlcykpKTsKKyAgICByZXR1cm4gcmVzOworICB9Cit9CisKKy8qIG1vdmUgYSBzdHJlYW0gdG8gQGluZGV4ICovCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9tb3ZlX3N0cmVhbSAoR3N0QXZpRGVtdXggKiBhdmksIEdzdEF2aVN0cmVhbSAqIHN0cmVhbSwKKyAgICBHc3RTZWdtZW50ICogc2VnbWVudCwgZ3VpbnQgaW5kZXgpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIk1vdmUgc3RyZWFtICVkIHRvICV1Iiwgc3RyZWFtLT5udW0sIGluZGV4KTsKKworICBpZiAoc2VnbWVudC0+cmF0ZSA8IDAuMCkgeworICAgIGd1aW50IG5leHRfa2V5OworICAgIC8qIEJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgZnJhbWUgb3JkZXIgd2UgbmVlZCB0byBwdXNoIGZyb20gdGhlIHByZXYga2V5ZnJhbWUKKyAgICAgKiB0byB0aGUgbmV4dCBrZXlmcmFtZS4gSWYgdGhlcmUgaXMgYSBzbWFydCBkZWNvZGVyIGRvd25zdHJlYW0gaGUgd2lsbCBub3RpY2UKKyAgICAgKiB0aGF0IHRoZXJlIGFyZSB0b28gbWFueSBlbmNvZGVkIGZyYW1lcyBzZW5kIGFuZCByZXR1cm4gRU9TIHdoZW4gdGhlcmUKKyAgICAgKiBhcmUgZW5vdWdoIGRlY29kZWQgZnJhbWVzIHRvIGZpbGwgdGhlIHNlZ21lbnQuICovCisgICAgbmV4dF9rZXkgPSBnc3RfYXZpX2RlbXV4X2luZGV4X25leHQgKGF2aSwgc3RyZWFtLCBpbmRleCwgVFJVRSk7CisKKyAgICAvKiBGSVhNRSwgd2UgZ28gYmFjayB0byAwLCB3ZSBzaG91bGQgbG9vayBhdCBzZWdtZW50LnN0YXJ0LiBXZSB3aWxsIGhvd2V2ZXIKKyAgICAgKiBzdG9wIGVhcmxpZXIgd2hlbiB0aGUgc2VlIHRoZSB0aW1lc3RhbXAgPCBzZWdtZW50LnN0YXJ0ICovCisgICAgc3RyZWFtLT5zdGFydF9lbnRyeSA9IDA7CisgICAgc3RyZWFtLT5zdGVwX2VudHJ5ID0gaW5kZXg7CisgICAgc3RyZWFtLT5jdXJyZW50X2VudHJ5ID0gaW5kZXg7CisgICAgc3RyZWFtLT5zdG9wX2VudHJ5ID0gbmV4dF9rZXk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJyZXZlcnNlIHNlZWs6IHN0YXJ0ICV1LCBzdGVwICV1LCBzdG9wICV1IiwKKyAgICAgICAgc3RyZWFtLT5zdGFydF9lbnRyeSwgc3RyZWFtLT5zdGVwX2VudHJ5LCBzdHJlYW0tPnN0b3BfZW50cnkpOworICB9IGVsc2UgeworICAgIHN0cmVhbS0+c3RhcnRfZW50cnkgPSBpbmRleDsKKyAgICBzdHJlYW0tPnN0ZXBfZW50cnkgPSBpbmRleDsKKyAgICBzdHJlYW0tPnN0b3BfZW50cnkgPSBnc3RfYXZpX2RlbXV4X2luZGV4X2xhc3QgKGF2aSwgc3RyZWFtKTsKKyAgfQorICBpZiAoc3RyZWFtLT5jdXJyZW50X2VudHJ5ICE9IGluZGV4KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiTW92ZSBESVNDT05UIGZyb20gJXUgdG8gJXUiLAorICAgICAgICBzdHJlYW0tPmN1cnJlbnRfZW50cnksIGluZGV4KTsKKyAgICBzdHJlYW0tPmN1cnJlbnRfZW50cnkgPSBpbmRleDsKKyAgICBzdHJlYW0tPmRpc2NvbnQgPSBUUlVFOworICB9CisKKyAgLyogdXBkYXRlIHRoZSBidWZmZXIgaW5mbyAqLworICBnc3RfYXZpX2RlbXV4X2dldF9idWZmZXJfaW5mbyAoYXZpLCBzdHJlYW0sIGluZGV4LAorICAgICAgJnN0cmVhbS0+Y3VycmVudF90aW1lc3RhbXAsICZzdHJlYW0tPmN1cnJlbnRfdHNfZW5kLAorICAgICAgJnN0cmVhbS0+Y3VycmVudF9vZmZzZXQsICZzdHJlYW0tPmN1cnJlbnRfb2Zmc2V0X2VuZCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiTW92ZWQgdG8gJXUsIHRzICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiwgdHNfZW5kICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBvZmYgJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgIiwgb2ZmX2VuZCAlIiBHX0dVSU5UNjRfRk9STUFULCBpbmRleCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHN0cmVhbS0+Y3VycmVudF90aW1lc3RhbXApLAorICAgICAgR1NUX1RJTUVfQVJHUyAoc3RyZWFtLT5jdXJyZW50X3RzX2VuZCksIHN0cmVhbS0+Y3VycmVudF9vZmZzZXQsCisgICAgICBzdHJlYW0tPmN1cnJlbnRfb2Zmc2V0X2VuZCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiU2Vla2luZyB0byBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgIHN0cmVhbS0+aW5kZXhbaW5kZXhdLm9mZnNldCk7Cit9CisKKy8qCisgKiBEbyB0aGUgYWN0dWFsIHNlZWtpbmcuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F2aV9kZW11eF9kb19zZWVrIChHc3RBdmlEZW11eCAqIGF2aSwgR3N0U2VnbWVudCAqIHNlZ21lbnQsCisgICAgR3N0U2Vla0ZsYWdzIGZsYWdzKQoreworICBHc3RDbG9ja1RpbWUgc2Vla190aW1lOworICBnYm9vbGVhbiBrZXlmcmFtZSwgYmVmb3JlLCBhZnRlcjsKKyAgZ3VpbnQgaSwgaW5kZXg7CisgIEdzdEF2aVN0cmVhbSAqc3RyZWFtOworICBnYm9vbGVhbiBuZXh0OworCisgIHNlZWtfdGltZSA9IHNlZ21lbnQtPnBvc2l0aW9uOworICBrZXlmcmFtZSA9ICEgIShmbGFncyAmIEdTVF9TRUVLX0ZMQUdfS0VZX1VOSVQpOworICBiZWZvcmUgPSAhICEoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NOQVBfQkVGT1JFKTsKKyAgYWZ0ZXIgPSAhICEoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NOQVBfQUZURVIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInNlZWsgdG86ICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiBrZXlmcmFtZSBzZWVraW5nOiVkLCAlcyIsIEdTVF9USU1FX0FSR1MgKHNlZWtfdGltZSksIGtleWZyYW1lLAorICAgICAgc25hcF90eXBlc1tiZWZvcmUgPyAxIDogMF1bYWZ0ZXIgPyAxIDogMF0pOworCisgIC8qIEZJWE1FLCB0aGlzIGNvZGUgYXNzdW1lcyB0aGUgbWFpbiBzdHJlYW0gd2l0aCBrZXlmcmFtZXMgaXMgc3RyZWFtIDAsCisgICAqIHdoaWNoIGlzIG1vc3RseSBjb3JyZWN0Li4uICovCisgIHN0cmVhbSA9ICZhdmktPnN0cmVhbVthdmktPm1haW5fc3RyZWFtXTsKKworICBuZXh0ID0gYWZ0ZXIgJiYgIWJlZm9yZTsKKyAgaWYgKHNlZ21lbnQtPnJhdGUgPCAwKQorICAgIG5leHQgPSAhbmV4dDsKKworICAvKiBnZXQgdGhlIGVudHJ5IGluZGV4IGZvciB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uICovCisgIGluZGV4ID0gZ3N0X2F2aV9kZW11eF9pbmRleF9mb3JfdGltZSAoYXZpLCBzdHJlYW0sIHNlZWtfdGltZSwgbmV4dCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIkdvdCBlbnRyeSAldSIsIGluZGV4KTsKKyAgaWYgKGluZGV4ID09IC0xKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBjaGVjayBpZiB3ZSBhcmUgYWxyZWFkeSBvbiBhIGtleWZyYW1lICovCisgIGlmICghRU5UUllfSVNfS0VZRlJBTUUgKCZzdHJlYW0tPmluZGV4W2luZGV4XSkpIHsKKyAgICBpZiAobmV4dCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAibm90IGtleWZyYW1lLCBzZWFyY2hpbmcgZm9yd2FyZCIpOworICAgICAgLyogbm93IGdvIHRvIHRoZSBuZXh0IGtleWZyYW1lLCB0aGlzIGlzIHdoZXJlIHdlIHNob3VsZCBzdGFydAorICAgICAgICogZGVjb2RpbmcgZnJvbS4gKi8KKyAgICAgIGluZGV4ID0gZ3N0X2F2aV9kZW11eF9pbmRleF9uZXh0IChhdmksIHN0cmVhbSwgaW5kZXgsIFRSVUUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAibmV4dCBrZXlmcmFtZSBhdCAldSIsIGluZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAibm90IGtleWZyYW1lLCBzZWFyY2hpbmcgYmFjayIpOworICAgICAgLyogbm93IGdvIHRvIHRoZSBwcmV2aW91cyBrZXlmcmFtZSwgdGhpcyBpcyB3aGVyZSB3ZSBzaG91bGQgc3RhcnQKKyAgICAgICAqIGRlY29kaW5nIGZyb20uICovCisgICAgICBpbmRleCA9IGdzdF9hdmlfZGVtdXhfaW5kZXhfcHJldiAoYXZpLCBzdHJlYW0sIGluZGV4LCBUUlVFKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInByZXZpb3VzIGtleWZyYW1lIGF0ICV1IiwgaW5kZXgpOworICAgIH0KKyAgfQorCisgIC8qIG1vdmUgdGhlIG1haW4gc3RyZWFtIHRvIHRoaXMgcG9zaXRpb24gKi8KKyAgZ3N0X2F2aV9kZW11eF9tb3ZlX3N0cmVhbSAoYXZpLCBzdHJlYW0sIHNlZ21lbnQsIGluZGV4KTsKKworICBpZiAoa2V5ZnJhbWUpIHsKKyAgICAvKiB3aGVuIHNlZWtpbmcgdG8gYSBrZXlmcmFtZSwgd2UgdXBkYXRlIHRoZSByZXN1bHQgc2VlayB0aW1lCisgICAgICogdG8gdGhlIHRpbWUgb2YgdGhlIGtleWZyYW1lLiAqLworICAgIHNlZWtfdGltZSA9IHN0cmVhbS0+Y3VycmVudF90aW1lc3RhbXA7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAia2V5ZnJhbWUgYWRqdXN0ZWQgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChzZWVrX3RpbWUpKTsKKyAgICAvKiB0aGUgc2VlayB0aW1lIGlzIGFsd2F5cyB0aGUgcG9zaXRpb24gLi4uICovCisgICAgc2VnbWVudC0+cG9zaXRpb24gPSBzZWVrX3RpbWU7CisgICAgLyogLi4uIGFuZCBzdGFydCBhbmQgc3RyZWFtIHRpbWUgd2hlbiBnb2luZyBmb3J3YXJkcywKKyAgICAgKiBvdGhlcndpc2Ugb25seSBzdG9wIHRpbWUgKi8KKyAgICBpZiAoc2VnbWVudC0+cmF0ZSA+IDAuMCkKKyAgICAgIHNlZ21lbnQtPnN0YXJ0ID0gc2VnbWVudC0+dGltZSA9IHNlZWtfdGltZTsKKyAgICBlbHNlCisgICAgICBzZWdtZW50LT5zdG9wID0gc2Vla190aW1lOworICB9CisKKyAgLyogbm93IHNldCBESVNDT05UIGFuZCBhbGlnbiB0aGUgb3RoZXIgc3RyZWFtcyAqLworICBmb3IgKGkgPSAwOyBpIDwgYXZpLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgR3N0QXZpU3RyZWFtICpvc3RyZWFtOworCisgICAgb3N0cmVhbSA9ICZhdmktPnN0cmVhbVtpXTsKKyAgICBpZiAoKG9zdHJlYW0gPT0gc3RyZWFtKSB8fCAob3N0cmVhbS0+aW5kZXggPT0gTlVMTCkpCisgICAgICBjb250aW51ZTsKKworICAgIC8qIGdldCB0aGUgZW50cnkgaW5kZXggZm9yIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gKi8KKyAgICBpbmRleCA9IGdzdF9hdmlfZGVtdXhfaW5kZXhfZm9yX3RpbWUgKGF2aSwgb3N0cmVhbSwgc2Vla190aW1lLCBGQUxTRSk7CisgICAgaWYgKGluZGV4ID09IC0xKQorICAgICAgY29udGludWU7CisKKyAgICAvKiBtb3ZlIHRvIHByZXZpb3VzIGtleWZyYW1lICovCisgICAgaWYgKCFFTlRSWV9JU19LRVlGUkFNRSAoJm9zdHJlYW0tPmluZGV4W2luZGV4XSkpCisgICAgICBpbmRleCA9IGdzdF9hdmlfZGVtdXhfaW5kZXhfcHJldiAoYXZpLCBvc3RyZWFtLCBpbmRleCwgVFJVRSk7CisKKyAgICBnc3RfYXZpX2RlbXV4X21vdmVfc3RyZWFtIChhdmksIG9zdHJlYW0sIHNlZ21lbnQsIGluZGV4KTsKKyAgfQorICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJkb25lIHNlZWsgdG86ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHNlZWtfdGltZSkpOworCisgIHJldHVybiBUUlVFOworfQorCisvKgorICogSGFuZGxlIHNlZWsgZXZlbnQgaW4gcHVsbCBtb2RlLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWsgKEdzdEF2aURlbXV4ICogYXZpLCBHc3RQYWQgKiBwYWQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdkb3VibGUgcmF0ZTsKKyAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgR3N0U2Vla0ZsYWdzIGZsYWdzOworICBHc3RTZWVrVHlwZSBjdXJfdHlwZSA9IEdTVF9TRUVLX1RZUEVfTk9ORSwgc3RvcF90eXBlOworICBnaW50NjQgY3VyLCBzdG9wOworICBnYm9vbGVhbiBmbHVzaDsKKyAgZ2Jvb2xlYW4gdXBkYXRlOworICBHc3RTZWdtZW50IHNlZWtzZWdtZW50ID0geyAwLCB9OworICBnaW50IGk7CisgIGd1aW50MzIgc2VxbnVtID0gMDsKKworICBpZiAoZXZlbnQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJkb2luZyBzZWVrIHdpdGggZXZlbnQiKTsKKworICAgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgJnJhdGUsICZmb3JtYXQsICZmbGFncywKKyAgICAgICAgJmN1cl90eXBlLCAmY3VyLCAmc3RvcF90eXBlLCAmc3RvcCk7CisgICAgc2VxbnVtID0gZ3N0X2V2ZW50X2dldF9zZXFudW0gKGV2ZW50KTsKKworICAgIC8qIHdlIGhhdmUgdG8gaGF2ZSBhIGZvcm1hdCBhcyB0aGUgc2VnbWVudCBmb3JtYXQuIFRyeSB0byBjb252ZXJ0CisgICAgICogaWYgbm90LiAqLworICAgIGlmIChmb3JtYXQgIT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICBnYm9vbGVhbiByZXMgPSBUUlVFOworCisgICAgICBpZiAoY3VyX3R5cGUgIT0gR1NUX1NFRUtfVFlQRV9OT05FKQorICAgICAgICByZXMgPSBnc3RfcGFkX3F1ZXJ5X2NvbnZlcnQgKHBhZCwgZm9ybWF0LCBjdXIsIEdTVF9GT1JNQVRfVElNRSwgJmN1cik7CisgICAgICBpZiAocmVzICYmIHN0b3BfdHlwZSAhPSBHU1RfU0VFS19UWVBFX05PTkUpCisgICAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfY29udmVydCAocGFkLCBmb3JtYXQsIHN0b3AsIEdTVF9GT1JNQVRfVElNRSwgJnN0b3ApOworICAgICAgaWYgKCFyZXMpCisgICAgICAgIGdvdG8gbm9fZm9ybWF0OworCisgICAgICBmb3JtYXQgPSBHU1RfRk9STUFUX1RJTUU7CisgICAgfQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwKKyAgICAgICAgInNlZWsgcmVxdWVzdGVkOiByYXRlICVnIGN1ciAlIiBHU1RfVElNRV9GT1JNQVQgIiBzdG9wICUiCisgICAgICAgIEdTVF9USU1FX0ZPUk1BVCwgcmF0ZSwgR1NUX1RJTUVfQVJHUyAoY3VyKSwgR1NUX1RJTUVfQVJHUyAoc3RvcCkpOworICAgIC8qIEZJWE1FOiBjYW4gd2UgZG8gYW55dGhpbmcgd2l0aCByYXRlIT0xLjAgKi8KKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJkb2luZyBzZWVrIHdpdGhvdXQgZXZlbnQiKTsKKyAgICBmbGFncyA9IDA7CisgICAgcmF0ZSA9IDEuMDsKKyAgfQorCisgIC8qIHNhdmUgZmx1c2ggZmxhZyAqLworICBmbHVzaCA9IGZsYWdzICYgR1NUX1NFRUtfRkxBR19GTFVTSDsKKworICBpZiAoZmx1c2gpIHsKKyAgICBHc3RFdmVudCAqZmV2ZW50ID0gZ3N0X2V2ZW50X25ld19mbHVzaF9zdGFydCAoKTsKKworICAgIGlmIChzZXFudW0pCisgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZmV2ZW50LCBzZXFudW0pOworICAgIC8qIGZvciBhIGZsdXNoaW5nIHNlZWssIHdlIHNlbmQgYSBmbHVzaF9zdGFydCBvbiBhbGwgcGFkcy4gVGhpcyB3aWxsCisgICAgICogZXZlbnR1YWxseSBzdG9wIHN0cmVhbWluZyB3aXRoIGEgV1JPTkdfU1RBVEUuIFdlIGNhbiB0aHVzIGV2ZW50dWFsbHkKKyAgICAgKiB0YWtlIHRoZSBTVFJFQU1fTE9DSy4gKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJzZW5kaW5nIGZsdXNoIHN0YXJ0Iik7CisgICAgZ3N0X2F2aV9kZW11eF9wdXNoX2V2ZW50IChhdmksIGdzdF9ldmVudF9yZWYgKGZldmVudCkpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoYXZpLT5zaW5rcGFkLCBmZXZlbnQpOworICB9IGVsc2UgeworICAgIC8qIGEgbm9uLWZsdXNoaW5nIHNlZWssIHdlIFBBVVNFIHRoZSB0YXNrIHNvIHRoYXQgd2UgY2FuIHRha2UgdGhlCisgICAgICogU1RSRUFNX0xPQ0sgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJub24gZmx1c2hpbmcgc2VlaywgcGF1c2luZyB0YXNrIik7CisgICAgZ3N0X3BhZF9wYXVzZV90YXNrIChhdmktPnNpbmtwYWQpOworICB9CisKKyAgLyogd2FpdCBmb3Igc3RyZWFtaW5nIHRvIHN0b3AgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAid2FpdCBmb3Igc3RyZWFtaW5nIHRvIHN0b3AiKTsKKyAgR1NUX1BBRF9TVFJFQU1fTE9DSyAoYXZpLT5zaW5rcGFkKTsKKworICAvKiBjb3B5IHNlZ21lbnQsIHdlIG5lZWQgdGhpcyBiZWNhdXNlIHdlIHN0aWxsIG5lZWQgdGhlIG9sZAorICAgKiBzZWdtZW50IHdoZW4gd2UgY2xvc2UgdGhlIGN1cnJlbnQgc2VnbWVudC4gKi8KKyAgbWVtY3B5ICgmc2Vla3NlZ21lbnQsICZhdmktPnNlZ21lbnQsIHNpemVvZiAoR3N0U2VnbWVudCkpOworCisgIGlmIChldmVudCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgImNvbmZpZ3VyaW5nIHNlZWsiKTsKKyAgICBnc3Rfc2VnbWVudF9kb19zZWVrICgmc2Vla3NlZ21lbnQsIHJhdGUsIGZvcm1hdCwgZmxhZ3MsCisgICAgICAgIGN1cl90eXBlLCBjdXIsIHN0b3BfdHlwZSwgc3RvcCwgJnVwZGF0ZSk7CisgIH0KKyAgLyogZG8gdGhlIHNlZWssIHNlZWtzZWdtZW50LnBvc2l0aW9uIGNvbnRhaW5zIHRoZSBuZXcgcG9zaXRpb24sIHRoaXMKKyAgICogYWN0dWFsbHkgbmV2ZXIgZmFpbHMuICovCisgIGdzdF9hdmlfZGVtdXhfZG9fc2VlayAoYXZpLCAmc2Vla3NlZ21lbnQsIGZsYWdzKTsKKworICBpZiAoZmx1c2gpIHsKKyAgICBHc3RFdmVudCAqZmV2ZW50ID0gZ3N0X2V2ZW50X25ld19mbHVzaF9zdG9wIChUUlVFKTsKKworICAgIGlmIChzZXFudW0pCisgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZmV2ZW50LCBzZXFudW0pOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic2VuZGluZyBmbHVzaCBzdG9wIik7CisgICAgZ3N0X2F2aV9kZW11eF9wdXNoX2V2ZW50IChhdmksIGdzdF9ldmVudF9yZWYgKGZldmVudCkpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoYXZpLT5zaW5rcGFkLCBmZXZlbnQpOworICB9CisKKyAgLyogbm93IHVwZGF0ZSB0aGUgcmVhbCBzZWdtZW50IGluZm8gKi8KKyAgbWVtY3B5ICgmYXZpLT5zZWdtZW50LCAmc2Vla3NlZ21lbnQsIHNpemVvZiAoR3N0U2VnbWVudCkpOworCisgIC8qIHBvc3QgdGhlIFNFR01FTlRfU1RBUlQgbWVzc2FnZSB3aGVuIHdlIGRvIHNlZ21lbnRlZCBwbGF5YmFjayAqLworICBpZiAoYXZpLT5zZWdtZW50LmZsYWdzICYgR1NUX1NFRUtfRkxBR19TRUdNRU5UKSB7CisgICAgR3N0TWVzc2FnZSAqc2VnbWVudF9zdGFydF9tc2cgPQorICAgICAgICBnc3RfbWVzc2FnZV9uZXdfc2VnbWVudF9zdGFydCAoR1NUX09CSkVDVF9DQVNUIChhdmkpLAorICAgICAgICBhdmktPnNlZ21lbnQuZm9ybWF0LCBhdmktPnNlZ21lbnQucG9zaXRpb24pOworICAgIGlmIChzZXFudW0pCisgICAgICBnc3RfbWVzc2FnZV9zZXRfc2VxbnVtIChzZWdtZW50X3N0YXJ0X21zZywgc2VxbnVtKTsKKyAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKGF2aSksIHNlZ21lbnRfc3RhcnRfbXNnKTsKKyAgfQorCisgIC8qIHF1ZXVlIHRoZSBzZWdtZW50IGV2ZW50IGZvciB0aGUgc3RyZWFtaW5nIHRocmVhZC4gKi8KKyAgaWYgKGF2aS0+c2VnX2V2ZW50KQorICAgIGdzdF9ldmVudF91bnJlZiAoYXZpLT5zZWdfZXZlbnQpOworICBhdmktPnNlZ19ldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJmF2aS0+c2VnbWVudCk7CisgIGlmIChzZXFudW0pCisgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGF2aS0+c2VnX2V2ZW50LCBzZXFudW0pOworICBhdmktPnNlZ21lbnRfc2VxbnVtID0gc2VxbnVtOworCisgIGlmICghYXZpLT5zdHJlYW1pbmcpIHsKKyAgICBnc3RfcGFkX3N0YXJ0X3Rhc2sgKGF2aS0+c2lua3BhZCwgKEdzdFRhc2tGdW5jdGlvbikgZ3N0X2F2aV9kZW11eF9sb29wLAorICAgICAgICBhdmktPnNpbmtwYWQsIE5VTEwpOworICB9CisgIC8qIHJlc2V0IHRoZSBsYXN0IGZsb3cgYW5kIG1hcmsgZGlzY29udCwgc2VlayBpcyBhbHdheXMgRElTQ09OVCAqLworICBmb3IgKGkgPSAwOyBpIDwgYXZpLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAibWFya2luZyBESVNDT05UIik7CisgICAgYXZpLT5zdHJlYW1baV0uZGlzY29udCA9IFRSVUU7CisgIH0KKyAgLyogbGlrZXdpc2UgZm9yIHRoZSB3aG9sZSBuZXcgc2VnbWVudCAqLworICBnc3RfZmxvd19jb21iaW5lcl9yZXNldCAoYXZpLT5mbG93Y29tYmluZXIpOworICBHU1RfUEFEX1NUUkVBTV9VTkxPQ0sgKGF2aS0+c2lua3BhZCk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub19mb3JtYXQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJ1bnN1cHBvcnRlZCBmb3JtYXQgZ2l2ZW4sIHNlZWsgYWJvcnRlZC4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyoKKyAqIEhhbmRsZSBzZWVrIGV2ZW50IGluIHB1c2ggbW9kZS4KKyAqLworc3RhdGljIGdib29sZWFuCithdmlfZGVtdXhfaGFuZGxlX3NlZWtfcHVzaCAoR3N0QXZpRGVtdXggKiBhdmksIEdzdFBhZCAqIHBhZCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2RvdWJsZSByYXRlOworICBHc3RGb3JtYXQgZm9ybWF0OworICBHc3RTZWVrRmxhZ3MgZmxhZ3M7CisgIEdzdFNlZWtUeXBlIGN1cl90eXBlID0gR1NUX1NFRUtfVFlQRV9OT05FLCBzdG9wX3R5cGU7CisgIGdpbnQ2NCBjdXIsIHN0b3A7CisgIGdib29sZWFuIGtleWZyYW1lLCBiZWZvcmUsIGFmdGVyLCBuZXh0OworICBHc3RBdmlTdHJlYW0gKnN0cmVhbTsKKyAgZ3VpbnQgaW5kZXg7CisgIGd1aW50IG4sIHN0cl9udW07CisgIGd1aW50NjQgbWluX29mZnNldDsKKyAgR3N0U2VnbWVudCBzZWVrc2VnbWVudDsKKyAgZ2Jvb2xlYW4gdXBkYXRlOworCisgIC8qIGNoZWNrIHdlIGhhdmUgdGhlIGluZGV4ICovCisgIGlmICghYXZpLT5oYXZlX2luZGV4KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAibm8gc2VlayBpbmRleCBidWlsdCwgc2VlayBhYm9ydGVkLiIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJkb2luZyBwdXNoLWJhc2VkIHNlZWsgd2l0aCBldmVudCIpOworICB9CisKKyAgZ3N0X2V2ZW50X3BhcnNlX3NlZWsgKGV2ZW50LCAmcmF0ZSwgJmZvcm1hdCwgJmZsYWdzLAorICAgICAgJmN1cl90eXBlLCAmY3VyLCAmc3RvcF90eXBlLCAmc3RvcCk7CisKKyAgaWYgKGZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICBnYm9vbGVhbiByZXMgPSBUUlVFOworCisgICAgaWYgKGN1cl90eXBlICE9IEdTVF9TRUVLX1RZUEVfTk9ORSkKKyAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfY29udmVydCAocGFkLCBmb3JtYXQsIGN1ciwgR1NUX0ZPUk1BVF9USU1FLCAmY3VyKTsKKyAgICBpZiAocmVzICYmIHN0b3BfdHlwZSAhPSBHU1RfU0VFS19UWVBFX05PTkUpCisgICAgICByZXMgPSBnc3RfcGFkX3F1ZXJ5X2NvbnZlcnQgKHBhZCwgZm9ybWF0LCBzdG9wLCBHU1RfRk9STUFUX1RJTUUsICZzdG9wKTsKKyAgICBpZiAoIXJlcykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAidW5zdXBwb3J0ZWQgZm9ybWF0IGdpdmVuLCBzZWVrIGFib3J0ZWQuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgZm9ybWF0ID0gR1NUX0ZPUk1BVF9USU1FOworICB9CisKKyAgLyogbGV0IGdzdF9zZWdtZW50IGhhbmRsZSBhbnkgdHJpY2t5IHN0dWZmICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgImNvbmZpZ3VyaW5nIHNlZWsiKTsKKyAgbWVtY3B5ICgmc2Vla3NlZ21lbnQsICZhdmktPnNlZ21lbnQsIHNpemVvZiAoR3N0U2VnbWVudCkpOworICBnc3Rfc2VnbWVudF9kb19zZWVrICgmc2Vla3NlZ21lbnQsIHJhdGUsIGZvcm1hdCwgZmxhZ3MsCisgICAgICBjdXJfdHlwZSwgY3VyLCBzdG9wX3R5cGUsIHN0b3AsICZ1cGRhdGUpOworCisgIGtleWZyYW1lID0gISAhKGZsYWdzICYgR1NUX1NFRUtfRkxBR19LRVlfVU5JVCk7CisgIGN1ciA9IHNlZWtzZWdtZW50LnBvc2l0aW9uOworICBiZWZvcmUgPSAhICEoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NOQVBfQkVGT1JFKTsKKyAgYWZ0ZXIgPSAhICEoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NOQVBfQUZURVIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwKKyAgICAgICJTZWVrIHJlcXVlc3RlZDogdHMgJSIgR1NUX1RJTUVfRk9STUFUICIgc3RvcCAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIsIGtmICV1LCAlcywgcmF0ZSAlbGYiLCBHU1RfVElNRV9BUkdTIChjdXIpLCBHU1RfVElNRV9BUkdTIChzdG9wKSwKKyAgICAgIGtleWZyYW1lLCBzbmFwX3R5cGVzW2JlZm9yZSA/IDEgOiAwXVthZnRlciA/IDEgOiAwXSwgcmF0ZSk7CisKKyAgaWYgKHJhdGUgPCAwKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAibmVnYXRpdmUgcmF0ZSBzZWVrIG5vdCBzdXBwb3J0ZWQgaW4gcHVzaCBtb2RlIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogRklYTUUsIHRoaXMgY29kZSBhc3N1bWVzIHRoZSBtYWluIHN0cmVhbSB3aXRoIGtleWZyYW1lcyBpcyBzdHJlYW0gMCwKKyAgICogd2hpY2ggaXMgbW9zdGx5IGNvcnJlY3QuLi4gKi8KKyAgc3RyX251bSA9IGF2aS0+bWFpbl9zdHJlYW07CisgIHN0cmVhbSA9ICZhdmktPnN0cmVhbVtzdHJfbnVtXTsKKworICBuZXh0ID0gYWZ0ZXIgJiYgIWJlZm9yZTsKKyAgaWYgKHNlZWtzZWdtZW50LnJhdGUgPCAwKQorICAgIG5leHQgPSAhbmV4dDsKKworICAvKiBnZXQgdGhlIGVudHJ5IGluZGV4IGZvciB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uICovCisgIGluZGV4ID0gZ3N0X2F2aV9kZW11eF9pbmRleF9mb3JfdGltZSAoYXZpLCBzdHJlYW0sIGN1ciwgbmV4dCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInN0ciAldTogRm91bmQgZW50cnkgJXUgZm9yICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIHN0cl9udW0sIGluZGV4LCBHU1RfVElNRV9BUkdTIChjdXIpKTsKKyAgaWYgKGluZGV4ID09IC0xKQorICAgIHJldHVybiAtMTsKKworICAvKiBjaGVjayBpZiB3ZSBhcmUgYWxyZWFkeSBvbiBhIGtleWZyYW1lICovCisgIGlmICghRU5UUllfSVNfS0VZRlJBTUUgKCZzdHJlYW0tPmluZGV4W2luZGV4XSkpIHsKKyAgICBpZiAobmV4dCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiRW50cnkgaXMgbm90IGEga2V5ZnJhbWUgLSBzZWFyY2hpbmcgZm9yd2FyZCIpOworICAgICAgLyogbm93IGdvIHRvIHRoZSBuZXh0IGtleWZyYW1lLCB0aGlzIGlzIHdoZXJlIHdlIHNob3VsZCBzdGFydAorICAgICAgICogZGVjb2RpbmcgZnJvbS4gKi8KKyAgICAgIGluZGV4ID0gZ3N0X2F2aV9kZW11eF9pbmRleF9uZXh0IChhdmksIHN0cmVhbSwgaW5kZXgsIFRSVUUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiRm91bmQgcHJldmlvdXMga2V5ZnJhbWUgYXQgJXUiLCBpbmRleCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIkVudHJ5IGlzIG5vdCBhIGtleWZyYW1lIC0gc2VhcmNoaW5nIGJhY2siKTsKKyAgICAgIC8qIG5vdyBnbyB0byB0aGUgcHJldmlvdXMga2V5ZnJhbWUsIHRoaXMgaXMgd2hlcmUgd2Ugc2hvdWxkIHN0YXJ0CisgICAgICAgKiBkZWNvZGluZyBmcm9tLiAqLworICAgICAgaW5kZXggPSBnc3RfYXZpX2RlbXV4X2luZGV4X3ByZXYgKGF2aSwgc3RyZWFtLCBpbmRleCwgVFJVRSk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJGb3VuZCBwcmV2aW91cyBrZXlmcmFtZSBhdCAldSIsIGluZGV4KTsKKyAgICB9CisgIH0KKworICBnc3RfYXZpX2RlbXV4X2dldF9idWZmZXJfaW5mbyAoYXZpLCBzdHJlYW0sIGluZGV4LAorICAgICAgJnN0cmVhbS0+Y3VycmVudF90aW1lc3RhbXAsICZzdHJlYW0tPmN1cnJlbnRfdHNfZW5kLAorICAgICAgJnN0cmVhbS0+Y3VycmVudF9vZmZzZXQsICZzdHJlYW0tPmN1cnJlbnRfb2Zmc2V0X2VuZCk7CisKKyAgLyogcmUtdXNlIGN1ciB0byBiZSB0aGUgdGltZXN0YW1wIG9mIHRoZSBzZWVrIGFzIGl0IF93aWxsXyBiZSAqLworICBjdXIgPSBzdHJlYW0tPmN1cnJlbnRfdGltZXN0YW1wOworCisgIG1pbl9vZmZzZXQgPSBzdHJlYW0tPmluZGV4W2luZGV4XS5vZmZzZXQ7CisgIGF2aS0+c2Vla19rZl9vZmZzZXQgPSBtaW5fb2Zmc2V0IC0gODsKKworICBHU1RfREVCVUdfT0JKRUNUIChhdmksCisgICAgICAiU2VlayB0bzogdHMgJSIgR1NUX1RJTUVfRk9STUFUICIgKG9uIHN0ciAldSwgaWR4ICV1LCBvZmZzZXQgJSIKKyAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIikiLCBHU1RfVElNRV9BUkdTIChzdHJlYW0tPmN1cnJlbnRfdGltZXN0YW1wKSwgc3RyX251bSwKKyAgICAgIGluZGV4LCBtaW5fb2Zmc2V0KTsKKworICBmb3IgKG4gPSAwOyBuIDwgYXZpLT5udW1fc3RyZWFtczsgbisrKSB7CisgICAgR3N0QXZpU3RyZWFtICpzdHIgPSAmYXZpLT5zdHJlYW1bbl07CisgICAgZ3VpbnQgaWR4OworCisgICAgaWYgKG4gPT0gYXZpLT5tYWluX3N0cmVhbSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogZ2V0IHRoZSBlbnRyeSBpbmRleCBmb3IgdGhlIHJlcXVlc3RlZCBwb3NpdGlvbiAqLworICAgIGlkeCA9IGdzdF9hdmlfZGVtdXhfaW5kZXhfZm9yX3RpbWUgKGF2aSwgc3RyLCBjdXIsIEZBTFNFKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJzdHIgJXU6IEZvdW5kIGVudHJ5ICV1IGZvciAlIiBHU1RfVElNRV9GT1JNQVQsIG4sCisgICAgICAgIGlkeCwgR1NUX1RJTUVfQVJHUyAoY3VyKSk7CisgICAgaWYgKGlkeCA9PSAtMSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogY2hlY2sgaWYgd2UgYXJlIGFscmVhZHkgb24gYSBrZXlmcmFtZSAqLworICAgIGlmICghRU5UUllfSVNfS0VZRlJBTUUgKCZzdHItPmluZGV4W2lkeF0pKSB7CisgICAgICBpZiAobmV4dCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJFbnRyeSBpcyBub3QgYSBrZXlmcmFtZSAtIHNlYXJjaGluZyBmb3J3YXJkIik7CisgICAgICAgIC8qIG5vdyBnbyB0byB0aGUgbmV4dCBrZXlmcmFtZSwgdGhpcyBpcyB3aGVyZSB3ZSBzaG91bGQgc3RhcnQKKyAgICAgICAgICogZGVjb2RpbmcgZnJvbS4gKi8KKyAgICAgICAgaWR4ID0gZ3N0X2F2aV9kZW11eF9pbmRleF9uZXh0IChhdmksIHN0ciwgaWR4LCBUUlVFKTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiRm91bmQgbmV4dCBrZXlmcmFtZSBhdCAldSIsIGlkeCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJFbnRyeSBpcyBub3QgYSBrZXlmcmFtZSAtIHNlYXJjaGluZyBiYWNrIik7CisgICAgICAgIC8qIG5vdyBnbyB0byB0aGUgcHJldmlvdXMga2V5ZnJhbWUsIHRoaXMgaXMgd2hlcmUgd2Ugc2hvdWxkIHN0YXJ0CisgICAgICAgICAqIGRlY29kaW5nIGZyb20uICovCisgICAgICAgIGlkeCA9IGdzdF9hdmlfZGVtdXhfaW5kZXhfcHJldiAoYXZpLCBzdHIsIGlkeCwgVFJVRSk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIkZvdW5kIHByZXZpb3VzIGtleWZyYW1lIGF0ICV1IiwgaWR4KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnc3RfYXZpX2RlbXV4X2dldF9idWZmZXJfaW5mbyAoYXZpLCBzdHIsIGlkeCwKKyAgICAgICAgJnN0ci0+Y3VycmVudF90aW1lc3RhbXAsICZzdHItPmN1cnJlbnRfdHNfZW5kLAorICAgICAgICAmc3RyLT5jdXJyZW50X29mZnNldCwgJnN0ci0+Y3VycmVudF9vZmZzZXRfZW5kKTsKKworICAgIGlmIChzdHItPmluZGV4W2lkeF0ub2Zmc2V0IDwgbWluX29mZnNldCkgeworICAgICAgbWluX29mZnNldCA9IHN0ci0+aW5kZXhbaWR4XS5vZmZzZXQ7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksCisgICAgICAgICAgIkZvdW5kIGFuIGVhcmxpZXIgb2Zmc2V0IGF0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgc3RyICV1IiwKKyAgICAgICAgICBtaW5fb2Zmc2V0LCBuKTsKKyAgICAgIHN0cl9udW0gPSBuOworICAgICAgc3RyZWFtID0gc3RyOworICAgICAgaW5kZXggPSBpZHg7CisgICAgfQorICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLAorICAgICAgIlNlZWsgcGVyZm9ybWVkOiBzdHIgJXUsIG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFUICIsIGlkeCAldSwgdHMgJSIKKyAgICAgIEdTVF9USU1FX0ZPUk1BVCAiLCB0c19lbmQgJSIgR1NUX1RJTUVfRk9STUFUICIsIG9mZiAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAiLCBvZmZfZW5kICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHN0cl9udW0sIG1pbl9vZmZzZXQsIGluZGV4LAorICAgICAgR1NUX1RJTUVfQVJHUyAoc3RyZWFtLT5jdXJyZW50X3RpbWVzdGFtcCksCisgICAgICBHU1RfVElNRV9BUkdTIChzdHJlYW0tPmN1cnJlbnRfdHNfZW5kKSwgc3RyZWFtLT5jdXJyZW50X29mZnNldCwKKyAgICAgIHN0cmVhbS0+Y3VycmVudF9vZmZzZXRfZW5kKTsKKworICAvKiBpbmRleCBkYXRhIHJlZmVycyB0byBkYXRhLCBub3QgY2h1bmsgaGVhZGVyIChmb3IgcHVsbCBtb2RlIGNvbnZlbmllbmNlKSAqLworICBtaW5fb2Zmc2V0IC09IDg7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInNlZWtpbmcgdG8gY2h1bmsgYXQgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBtaW5fb2Zmc2V0KTsKKworICBpZiAoIXBlcmZvcm1fc2Vla190b19vZmZzZXQgKGF2aSwgbWluX29mZnNldCwgZ3N0X2V2ZW50X2dldF9zZXFudW0gKGV2ZW50KSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJzZWVrIGV2ZW50IGZhaWxlZCEiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIEhhbmRsZSB3aGV0aGVyIHdlIGNhbiBwZXJmb3JtIHRoZSBzZWVrIGV2ZW50IG9yIGlmIHdlIGhhdmUgdG8gbGV0IHRoZSBjaGFpbgorICogZnVuY3Rpb24gaGFuZGxlIHNlZWtzIHRvIGJ1aWxkIHRoZSBzZWVrIGluZGV4ZXMgZmlyc3QuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F2aV9kZW11eF9oYW5kbGVfc2Vla19wdXNoIChHc3RBdmlEZW11eCAqIGF2aSwgR3N0UGFkICogcGFkLAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIC8qIGNoZWNrIGZvciBoYXZpbmcgcGFyc2VkIGluZGV4IGFscmVhZHkgKi8KKyAgaWYgKCFhdmktPmhhdmVfaW5kZXgpIHsKKyAgICBndWludDY0IG9mZnNldCA9IDA7CisgICAgZ2Jvb2xlYW4gYnVpbGRpbmdfaW5kZXg7CisKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKGF2aSk7CisgICAgLyogaGFuZGxlIHRoZSBzZWVrIGV2ZW50IGluIHRoZSBjaGFpbiBmdW5jdGlvbiAqLworICAgIGF2aS0+c3RhdGUgPSBHU1RfQVZJX0RFTVVYX1NFRUs7CisKKyAgICAvKiBjb3B5IHRoZSBldmVudCAqLworICAgIGlmIChhdmktPnNlZWtfZXZlbnQpCisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGF2aS0+c2Vla19ldmVudCk7CisgICAgYXZpLT5zZWVrX2V2ZW50ID0gZ3N0X2V2ZW50X3JlZiAoZXZlbnQpOworCisgICAgLyogc2V0IHRoZSBidWlsZGluZ19pbmRleCBmbGFnIHNvIHRoYXQgb25seSBvbmUgdGhyZWFkIGNhbiBzZXR1cCB0aGUKKyAgICAgKiBzdHJ1Y3R1cmVzIGZvciBpbmRleCBzZWVraW5nLiAqLworICAgIGJ1aWxkaW5nX2luZGV4ID0gYXZpLT5idWlsZGluZ19pbmRleDsKKyAgICBpZiAoIWJ1aWxkaW5nX2luZGV4KSB7CisgICAgICBhdmktPmJ1aWxkaW5nX2luZGV4ID0gVFJVRTsKKyAgICAgIGlmIChhdmktPnN0cmVhbVswXS5pbmRleGVzKSB7CisgICAgICAgIGF2aS0+b2RtbF9zdHJlYW0gPSAwOworICAgICAgICBhdmktPm9kbWxfc3ViaWR4cyA9IGF2aS0+c3RyZWFtW2F2aS0+b2RtbF9zdHJlYW1dLmluZGV4ZXM7CisgICAgICAgIG9mZnNldCA9IGF2aS0+b2RtbF9zdWJpZHhzWzBdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb2Zmc2V0ID0gYXZpLT5pZHgxX29mZnNldDsKKyAgICAgIH0KKyAgICB9CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGF2aSk7CisKKyAgICBpZiAoIWJ1aWxkaW5nX2luZGV4KSB7CisgICAgICAvKiBzZWVrIHRvIHRoZSBmaXJzdCBzdWJpbmRleCBvciBsZWdhY3kgaW5kZXggKi8KKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoYXZpLAorICAgICAgICAgICJTZWVraW5nIHRvIGxlZ2FjeSBpbmRleC9maXJzdCBzdWJpbmRleCBhdCAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgIG9mZnNldCk7CisgICAgICByZXR1cm4gcGVyZm9ybV9zZWVrX3RvX29mZnNldCAoYXZpLCBvZmZzZXQsIGdzdF9ldmVudF9nZXRfc2VxbnVtIChldmVudCkpOworICAgIH0KKworICAgIC8qIEZJWE1FOiB3ZSBoYXZlIHRvIGFsd2F5cyByZXR1cm4gdHJ1ZSBzbyB0aGF0IHdlIGRvbid0IGJsb2NrIHRoZSBzZWVrCisgICAgICogdGhyZWFkLgorICAgICAqIE5vdGU6IG1heWJlIGl0IGlzIE9LIHRvIHJldHVybiB0cnVlIGlmIHdlJ3JlIHN0aWxsIGJ1aWxkaW5nIHRoZSBpbmRleCAqLworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgcmV0dXJuIGF2aV9kZW11eF9oYW5kbGVfc2Vla19wdXNoIChhdmksIHBhZCwgZXZlbnQpOworfQorCisvKgorICogSGVscGVyIGZvciBnc3RfYXZpX2RlbXV4X2ludmVydCgpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc3dhcF9saW5lIChndWludDggKiBkMSwgZ3VpbnQ4ICogZDIsIGd1aW50OCAqIHRtcCwgZ2ludCBieXRlcykKK3sKKyAgbWVtY3B5ICh0bXAsIGQxLCBieXRlcyk7CisgIG1lbWNweSAoZDEsIGQyLCBieXRlcyk7CisgIG1lbWNweSAoZDIsIHRtcCwgYnl0ZXMpOworfQorCisKKyNkZWZpbmUgZ3N0X2F2aV9kZW11eF9pc191bmNvbXByZXNzZWQoZm91cmNjKQkJXAorICAoZm91cmNjID09IEdTVF9SSUZGX0RJQiB8fAkJCQlcCisgICBmb3VyY2MgPT0gR1NUX1JJRkZfcmdiIHx8CQkJCVwKKyAgIGZvdXJjYyA9PSBHU1RfUklGRl9SR0IgfHwgZm91cmNjID09IEdTVF9SSUZGX1JBVykKKworLyoKKyAqIEludmVydCBESUIgYnVmZmVycy4uLiBUYWtlcyBleGlzdGluZyBidWZmZXIgYW5kCisgKiByZXR1cm5zIGVpdGhlciB0aGUgYnVmZmVyIG9yIGEgbmV3IG9uZSAod2l0aCBvbGQKKyAqIG9uZSBkZXJlZmVyZW5jZWQpLgorICogRklYTUU6IGNhbid0IHdlIHByZWFsbG9jYXRlIHRtcD8gYW5kIHJlbWVtYmVyIHN0cmlkZSwgYnBwPworICovCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9hdmlfZGVtdXhfaW52ZXJ0IChHc3RBdmlTdHJlYW0gKiBzdHJlYW0sIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgZ2ludCB5LCB3LCBoOworICBnaW50IGJwcCwgc3RyaWRlOworICBndWludDggKnRtcCA9IE5VTEw7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDMyIGZvdXJjYzsKKworICBpZiAoc3RyZWFtLT5zdHJoLT50eXBlICE9IEdTVF9SSUZGX0ZDQ192aWRzKQorICAgIHJldHVybiBidWY7CisKKyAgaWYgKHN0cmVhbS0+c3RyZi52aWRzID09IE5VTEwpIHsKKyAgICBHU1RfV0FSTklORyAoIkZhaWxlZCB0byByZXRyaWV2ZSB2aWRzIGZvciBzdHJlYW0iKTsKKyAgICByZXR1cm4gYnVmOworICB9CisKKyAgZm91cmNjID0gKHN0cmVhbS0+c3RyZi52aWRzLT5jb21wcmVzc2lvbikgPworICAgICAgc3RyZWFtLT5zdHJmLnZpZHMtPmNvbXByZXNzaW9uIDogc3RyZWFtLT5zdHJoLT5mY2NfaGFuZGxlcjsKKyAgaWYgKCFnc3RfYXZpX2RlbXV4X2lzX3VuY29tcHJlc3NlZCAoZm91cmNjKSkgeworICAgIHJldHVybiBidWY7ICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgbm9uIERJQiBidWZmZXJzICovCisgIH0KKworICAvKiByYXcgcmdiIGRhdGEgaXMgc3RvcmVkIHRvcGRvd24sIGJ1dCBpbnN0ZWFkIG9mIGludmVydGluZyB0aGUgYnVmZmVyLCAqLworICAvKiBzb21lIHRvb2xzIGp1c3QgbmVnYXRlIHRoZSBoZWlnaHQgZmllbGQgaW4gdGhlIGhlYWRlciAoZS5nLiBmZm1wZWcpICovCisgIGlmICgoKGdpbnQzMikgc3RyZWFtLT5zdHJmLnZpZHMtPmhlaWdodCkgPCAwKQorICAgIHJldHVybiBidWY7CisKKyAgaCA9IHN0cmVhbS0+c3RyZi52aWRzLT5oZWlnaHQ7CisgIHcgPSBzdHJlYW0tPnN0cmYudmlkcy0+d2lkdGg7CisgIGJwcCA9IHN0cmVhbS0+c3RyZi52aWRzLT5iaXRfY250ID8gc3RyZWFtLT5zdHJmLnZpZHMtPmJpdF9jbnQgOiA4OworICBzdHJpZGUgPSBHU1RfUk9VTkRfVVBfNCAodyAqIChicHAgLyA4KSk7CisKKyAgYnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChidWYpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgaWYgKG1hcC5zaXplIDwgKHN0cmlkZSAqIGgpKSB7CisgICAgR1NUX1dBUk5JTkcgKCJCdWZmZXIgaXMgc21hbGxlciB0aGFuIHJlcG9ydGVkIFdpZHRoIHggSGVpZ2h0IHggRGVwdGgiKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIHJldHVybiBidWY7CisgIH0KKworICB0bXAgPSBnX21hbGxvYyAoc3RyaWRlKTsKKworICBmb3IgKHkgPSAwOyB5IDwgaCAvIDI7IHkrKykgeworICAgIHN3YXBfbGluZSAobWFwLmRhdGEgKyBzdHJpZGUgKiB5LCBtYXAuZGF0YSArIHN0cmlkZSAqIChoIC0gMSAtIHkpLCB0bXAsCisgICAgICAgIHN0cmlkZSk7CisgIH0KKworICBnX2ZyZWUgKHRtcCk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICAvKiBhcHBlbmQgcGFsZXR0ZSB0byBwYWxldHRlZCBSR0I4IGJ1ZmZlciBkYXRhICovCisgIGlmIChzdHJlYW0tPnJnYjhfcGFsZXR0ZSAhPSBOVUxMKQorICAgIGJ1ZiA9IGdzdF9idWZmZXJfYXBwZW5kIChidWYsIGdzdF9idWZmZXJfcmVmIChzdHJlYW0tPnJnYjhfcGFsZXR0ZSkpOworCisgIHJldHVybiBidWY7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9hZGRfYXNzb2MgKEdzdEF2aURlbXV4ICogYXZpLCBHc3RBdmlTdHJlYW0gKiBzdHJlYW0sCisgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCwgZ3VpbnQ2NCBvZmZzZXQsIGdib29sZWFuIGtleWZyYW1lKQoreworICAvKiBkbyBub3QgYWRkIGluZGVmaW5pdGVseSBmb3Igb3Blbi1lbmRlZCBzdHJlYW1pbmcgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKGF2aS0+ZWxlbWVudF9pbmRleCAmJiBhdmktPnNlZWthYmxlKSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChhdmksICJhZGRpbmcgYXNzb2NpYXRpb24gJSIgR1NUX1RJTUVfRk9STUFUICItPiAlIgorICAgICAgICBHX0dVSU5UNjRfRk9STUFULCBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApLCBvZmZzZXQpOworICAgIGdzdF9pbmRleF9hZGRfYXNzb2NpYXRpb24gKGF2aS0+ZWxlbWVudF9pbmRleCwgYXZpLT5pbmRleF9pZCwKKyAgICAgICAga2V5ZnJhbWUgPyBHU1RfQVNTT0NJQVRJT05fRkxBR19LRVlfVU5JVCA6CisgICAgICAgIEdTVF9BU1NPQ0lBVElPTl9GTEFHX0RFTFRBX1VOSVQsIEdTVF9GT1JNQVRfVElNRSwgdGltZXN0YW1wLAorICAgICAgICBHU1RfRk9STUFUX0JZVEVTLCBvZmZzZXQsIE5VTEwpOworICAgIC8qIGN1cnJlbnRfZW50cnkgaXMgREVGQVVMVCAoZnJhbWUgIykgKi8KKyAgICBnc3RfaW5kZXhfYWRkX2Fzc29jaWF0aW9uIChhdmktPmVsZW1lbnRfaW5kZXgsIHN0cmVhbS0+aW5kZXhfaWQsCisgICAgICAgIGtleWZyYW1lID8gR1NUX0FTU09DSUFUSU9OX0ZMQUdfS0VZX1VOSVQgOgorICAgICAgICBHU1RfQVNTT0NJQVRJT05fRkxBR19ERUxUQV9VTklULCBHU1RfRk9STUFUX1RJTUUsIHRpbWVzdGFtcCwKKyAgICAgICAgR1NUX0ZPUk1BVF9CWVRFUywgb2Zmc2V0LCBHU1RfRk9STUFUX0RFRkFVTFQsIHN0cmVhbS0+Y3VycmVudF9lbnRyeSwKKyAgICAgICAgTlVMTCk7CisgIH0KK30KKyNlbmRpZgorCisvKgorICogUmV0dXJucyB0aGUgYWdncmVnYXRlZCBHc3RGbG93UmV0dXJuLgorICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9kZW11eF9jb21iaW5lX2Zsb3dzIChHc3RBdmlEZW11eCAqIGF2aSwgR3N0QXZpU3RyZWFtICogc3RyZWFtLAorICAgIEdzdEZsb3dSZXR1cm4gcmV0KQoreworICBHU1RfTE9HX09CSkVDVCAoYXZpLCAiU3RyZWFtICVzOiVzIGZsb3cgcmV0dXJuOiAlcyIsCisgICAgICBHU1RfREVCVUdfUEFEX05BTUUgKHN0cmVhbS0+cGFkKSwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworICByZXQgPSBnc3RfZmxvd19jb21iaW5lcl91cGRhdGVfcGFkX2Zsb3cgKGF2aS0+Zmxvd2NvbWJpbmVyLCBzdHJlYW0tPnBhZCwgcmV0KTsKKyAgR1NUX0xPR19PQkpFQ1QgKGF2aSwgImNvbWJpbmVkIHRvIHJldHVybiAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKworICByZXR1cm4gcmV0OworfQorCisvKiBtb3ZlIEBzdHJlYW0gdG8gdGhlIG5leHQgcG9zaXRpb24gaW4gaXRzIGluZGV4ICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9kZW11eF9hZHZhbmNlIChHc3RBdmlEZW11eCAqIGF2aSwgR3N0QXZpU3RyZWFtICogc3RyZWFtLAorICAgIEdzdEZsb3dSZXR1cm4gcmV0KQoreworICBndWludCBvbGRfZW50cnksIG5ld19lbnRyeTsKKworICBvbGRfZW50cnkgPSBzdHJlYW0tPmN1cnJlbnRfZW50cnk7CisgIC8qIG1vdmUgZm9yd2FyZHMgKi8KKyAgbmV3X2VudHJ5ID0gb2xkX2VudHJ5ICsgMTsKKworICAvKiBzZWUgaWYgd2UgcmVhY2hlZCB0aGUgZW5kICovCisgIGlmIChuZXdfZW50cnkgPj0gc3RyZWFtLT5zdG9wX2VudHJ5KSB7CisgICAgaWYgKGF2aS0+c2VnbWVudC5yYXRlIDwgMC4wKSB7CisgICAgICBpZiAoc3RyZWFtLT5zdGVwX2VudHJ5ID09IHN0cmVhbS0+c3RhcnRfZW50cnkpIHsKKyAgICAgICAgLyogd2Ugc3RlcHBlZCBhbGwgdGhlIHdheSB0byB0aGUgc3RhcnQsIGVvcyAqLworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJyZXZlcnNlIHJlYWNoZWQgc3RhcnQgJXUiLCBzdHJlYW0tPnN0YXJ0X2VudHJ5KTsKKyAgICAgICAgZ290byBlb3M7CisgICAgICB9CisgICAgICAvKiBiYWNrd2FyZHMsIHN0b3AgYmVjb21lcyBzdGVwLCBmaW5kIGEgbmV3IHN0ZXAgKi8KKyAgICAgIHN0cmVhbS0+c3RvcF9lbnRyeSA9IHN0cmVhbS0+c3RlcF9lbnRyeTsKKyAgICAgIHN0cmVhbS0+c3RlcF9lbnRyeSA9IGdzdF9hdmlfZGVtdXhfaW5kZXhfcHJldiAoYXZpLCBzdHJlYW0sCisgICAgICAgICAgc3RyZWFtLT5zdG9wX2VudHJ5LCBUUlVFKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLAorICAgICAgICAgICJyZXZlcnNlIHBsYXliYWNrIGp1bXA6IHN0YXJ0ICV1LCBzdGVwICV1LCBzdG9wICV1IiwKKyAgICAgICAgICBzdHJlYW0tPnN0YXJ0X2VudHJ5LCBzdHJlYW0tPnN0ZXBfZW50cnksIHN0cmVhbS0+c3RvcF9lbnRyeSk7CisKKyAgICAgIC8qIGFuZCBzdGFydCBmcm9tIHRoZSBwcmV2aW91cyBrZXlmcmFtZSBub3cgKi8KKyAgICAgIG5ld19lbnRyeSA9IHN0cmVhbS0+c3RlcF9lbnRyeTsKKyAgICB9IGVsc2UgeworICAgICAgLyogRU9TICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJmb3J3YXJkIHJlYWNoZWQgc3RvcCAldSIsIHN0cmVhbS0+c3RvcF9lbnRyeSk7CisgICAgICBnb3RvIGVvczsKKyAgICB9CisgIH0KKworICBpZiAobmV3X2VudHJ5ICE9IG9sZF9lbnRyeSkgeworICAgIHN0cmVhbS0+Y3VycmVudF9lbnRyeSA9IG5ld19lbnRyeTsKKyAgICBzdHJlYW0tPmN1cnJlbnRfdG90YWwgPSBzdHJlYW0tPmluZGV4W25ld19lbnRyeV0udG90YWw7CisKKyAgICBpZiAobmV3X2VudHJ5ID09IG9sZF9lbnRyeSArIDEpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIm1vdmVkIGZvcndhcmRzIGZyb20gJXUgdG8gJXUiLAorICAgICAgICAgIG9sZF9lbnRyeSwgbmV3X2VudHJ5KTsKKyAgICAgIC8qIHdlIHNpbXBseSBtb3ZlZCBvbmUgc3RlcCBmb3J3YXJkcywgcmV1c2UgY3VycmVudCBpbmZvICovCisgICAgICBzdHJlYW0tPmN1cnJlbnRfdGltZXN0YW1wID0gc3RyZWFtLT5jdXJyZW50X3RzX2VuZDsKKyAgICAgIHN0cmVhbS0+Y3VycmVudF9vZmZzZXQgPSBzdHJlYW0tPmN1cnJlbnRfb2Zmc2V0X2VuZDsKKyAgICAgIGdzdF9hdmlfZGVtdXhfZ2V0X2J1ZmZlcl9pbmZvIChhdmksIHN0cmVhbSwgbmV3X2VudHJ5LAorICAgICAgICAgIE5VTEwsICZzdHJlYW0tPmN1cnJlbnRfdHNfZW5kLCBOVUxMLCAmc3RyZWFtLT5jdXJyZW50X29mZnNldF9lbmQpOworICAgIH0gZWxzZSB7CisgICAgICAvKiB3ZSBtb3ZlZCBESVNDT05ULCBmdWxsIHVwZGF0ZSAqLworICAgICAgZ3N0X2F2aV9kZW11eF9nZXRfYnVmZmVyX2luZm8gKGF2aSwgc3RyZWFtLCBuZXdfZW50cnksCisgICAgICAgICAgJnN0cmVhbS0+Y3VycmVudF90aW1lc3RhbXAsICZzdHJlYW0tPmN1cnJlbnRfdHNfZW5kLAorICAgICAgICAgICZzdHJlYW0tPmN1cnJlbnRfb2Zmc2V0LCAmc3RyZWFtLT5jdXJyZW50X29mZnNldF9lbmQpOworICAgICAgLyogYW5kIE1BUksgZGlzY29udCBmb3IgdGhpcyBzdHJlYW0gKi8KKyAgICAgIHN0cmVhbS0+ZGlzY29udCA9IFRSVUU7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJNb3ZlZCBmcm9tICV1IHRvICV1LCB0cyAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAiLCB0c19lbmQgJSIgR1NUX1RJTUVfRk9STUFUICIsIG9mZiAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgIiwgb2ZmX2VuZCAlIiBHX0dVSU5UNjRfRk9STUFULCBvbGRfZW50cnksIG5ld19lbnRyeSwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChzdHJlYW0tPmN1cnJlbnRfdGltZXN0YW1wKSwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChzdHJlYW0tPmN1cnJlbnRfdHNfZW5kKSwgc3RyZWFtLT5jdXJyZW50X29mZnNldCwKKyAgICAgICAgICBzdHJlYW0tPmN1cnJlbnRfb2Zmc2V0X2VuZCk7CisgICAgfQorICB9CisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1IgKi8KK2VvczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIndlIGFyZSBFT1MiKTsKKyAgICAvKiBzZXR0aW5nIGN1cnJlbnRfdGltZXN0YW1wIHRvIC0xIG1hcmtzIEVPUyAqLworICAgIHN0cmVhbS0+Y3VycmVudF90aW1lc3RhbXAgPSAtMTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRU9TOworICB9Cit9CisKKy8qIGZpbmQgdGhlIHN0cmVhbSB3aXRoIHRoZSBsb3dlc3QgY3VycmVudCBwb3NpdGlvbiB3aGVuIGdvaW5nIGZvcndhcmRzIG9yIHdpdGgKKyAqIHRoZSBoaWdoZXN0IHBvc2l0aW9uIHdoZW4gZ29pbmcgYmFja3dhcmRzLCB0aGlzIGlzIHRoZSBzdHJlYW0KKyAqIHdlIHNob3VsZCBwdXNoIGZyb20gbmV4dCAqLworc3RhdGljIGdpbnQKK2dzdF9hdmlfZGVtdXhfZmluZF9uZXh0IChHc3RBdmlEZW11eCAqIGF2aSwgZ2Zsb2F0IHJhdGUpCit7CisgIGd1aW50NjQgbWluX3RpbWUsIG1heF90aW1lOworICBndWludCBzdHJlYW1fbnVtLCBpOworCisgIG1heF90aW1lID0gMDsKKyAgbWluX3RpbWUgPSBHX01BWFVJTlQ2NDsKKyAgc3RyZWFtX251bSA9IC0xOworCisgIGZvciAoaSA9IDA7IGkgPCBhdmktPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICBndWludDY0IHBvc2l0aW9uOworICAgIEdzdEF2aVN0cmVhbSAqc3RyZWFtOworCisgICAgc3RyZWFtID0gJmF2aS0+c3RyZWFtW2ldOworCisgICAgLyogaWdub3JlIHN0cmVhbXMgdGhhdCBmaW5pc2hlZCAqLworICAgIGlmIChzdHJlYW0tPnBhZCAmJiBHU1RfUEFEX0xBU1RfRkxPV19SRVRVUk4gKHN0cmVhbS0+cGFkKSA9PSBHU1RfRkxPV19FT1MpCisgICAgICBjb250aW51ZTsKKworICAgIHBvc2l0aW9uID0gc3RyZWFtLT5jdXJyZW50X3RpbWVzdGFtcDsKKworICAgIC8qIHBvc2l0aW9uIG9mIC0xIGlzIEVPUyAqLworICAgIGlmIChwb3NpdGlvbiAhPSAtMSkgeworICAgICAgaWYgKHJhdGUgPiAwLjAgJiYgcG9zaXRpb24gPCBtaW5fdGltZSkgeworICAgICAgICBtaW5fdGltZSA9IHBvc2l0aW9uOworICAgICAgICBzdHJlYW1fbnVtID0gaTsKKyAgICAgIH0gZWxzZSBpZiAocmF0ZSA8IDAuMCAmJiBwb3NpdGlvbiA+PSBtYXhfdGltZSkgeworICAgICAgICBtYXhfdGltZSA9IHBvc2l0aW9uOworICAgICAgICBzdHJlYW1fbnVtID0gaTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0cmVhbV9udW07Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X2F2aV9kZW11eF9hbGlnbl9idWZmZXIgKEdzdEF2aURlbXV4ICogZGVtdXgsCisgICAgR3N0QnVmZmVyICogYnVmZmVyLCBnc2l6ZSBhbGlnbm1lbnQpCit7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgaWYgKG1hcC5zaXplIDwgc2l6ZW9mIChndWludHB0cikpIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgIHJldHVybiBidWZmZXI7CisgIH0KKworICBpZiAoKChndWludHB0cikgbWFwLmRhdGEpICYgKGFsaWdubWVudCAtIDEpKSB7CisgICAgR3N0QnVmZmVyICpuZXdfYnVmZmVyOworICAgIEdzdEFsbG9jYXRpb25QYXJhbXMgcGFyYW1zID0geyAwLCBhbGlnbm1lbnQgLSAxLCAwLCAwLCB9OworCisgICAgbmV3X2J1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLAorICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpLCAmcGFyYW1zKTsKKworICAgIC8qIENvcHkgZGF0YSAiYnkgaGFuZCIsIHNvIGVuc3VyZSBhbGlnbm1lbnQgaXMga2VwdDogKi8KKyAgICBnc3RfYnVmZmVyX2ZpbGwgKG5ld19idWZmZXIsIDAsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisKKyAgICBnc3RfYnVmZmVyX2NvcHlfaW50byAobmV3X2J1ZmZlciwgYnVmZmVyLCBHU1RfQlVGRkVSX0NPUFlfTUVUQURBVEEsIDAsIC0xKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgIldlIHdhbnQgb3V0cHV0IGFsaWduZWQgb24gJSIgR19HU0laRV9GT1JNQVQgIiwgcmVhbGxvY2F0ZWQiLAorICAgICAgICBhbGlnbm1lbnQpOworCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgICAgcmV0dXJuIG5ld19idWZmZXI7CisgIH0KKworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICByZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9kZW11eF9sb29wX2RhdGEgKEdzdEF2aURlbXV4ICogYXZpKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludCBzdHJlYW1fbnVtOworICBHc3RBdmlTdHJlYW0gKnN0cmVhbTsKKyAgZ2Jvb2xlYW4gcHJvY2Vzc2VkID0gRkFMU0U7CisgIEdzdEJ1ZmZlciAqYnVmOworICBndWludDY0IG9mZnNldCwgc2l6ZTsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCwgZHVyYXRpb247CisgIGd1aW50NjQgb3V0X29mZnNldCwgb3V0X29mZnNldF9lbmQ7CisgIGdib29sZWFuIGtleWZyYW1lOworICBHc3RBdmlJbmRleEVudHJ5ICplbnRyeTsKKworICBkbyB7CisgICAgc3RyZWFtX251bSA9IGdzdF9hdmlfZGVtdXhfZmluZF9uZXh0IChhdmksIGF2aS0+c2VnbWVudC5yYXRlKTsKKworICAgIC8qIGFsbCBhcmUgRU9TICovCisgICAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbV9udW0gPT0gLTEpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJhbGwgc3RyZWFtcyBhcmUgRU9TIik7CisgICAgICBnb3RvIGVvczsKKyAgICB9CisKKyAgICAvKiB3ZSBoYXZlIHRoZSBzdHJlYW0gbm93ICovCisgICAgc3RyZWFtID0gJmF2aS0+c3RyZWFtW3N0cmVhbV9udW1dOworCisgICAgLyogc2tpcCBzdHJlYW1zIHdpdGhvdXQgcGFkcyAqLworICAgIGlmICghc3RyZWFtLT5wYWQpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInNraXBwaW5nIGVudHJ5IGZyb20gc3RyZWFtICVkIHdpdGhvdXQgcGFkIiwKKyAgICAgICAgICBzdHJlYW1fbnVtKTsKKyAgICAgIGdvdG8gbmV4dDsKKyAgICB9CisKKyAgICAvKiBnZXQgdGhlIHRpbWluZyBpbmZvIGZvciB0aGUgZW50cnkgKi8KKyAgICB0aW1lc3RhbXAgPSBzdHJlYW0tPmN1cnJlbnRfdGltZXN0YW1wOworICAgIGR1cmF0aW9uID0gc3RyZWFtLT5jdXJyZW50X3RzX2VuZCAtIHRpbWVzdGFtcDsKKyAgICBvdXRfb2Zmc2V0ID0gc3RyZWFtLT5jdXJyZW50X29mZnNldDsKKyAgICBvdXRfb2Zmc2V0X2VuZCA9IHN0cmVhbS0+Y3VycmVudF9vZmZzZXRfZW5kOworCisgICAgLyogZ2V0IHRoZSBlbnRyeSBkYXRhIGluZm8gKi8KKyAgICBlbnRyeSA9ICZzdHJlYW0tPmluZGV4W3N0cmVhbS0+Y3VycmVudF9lbnRyeV07CisgICAgb2Zmc2V0ID0gZW50cnktPm9mZnNldDsKKyAgICBzaXplID0gZW50cnktPnNpemU7CisgICAga2V5ZnJhbWUgPSBFTlRSWV9JU19LRVlGUkFNRSAoZW50cnkpOworCisgICAgLyogc2tpcCBlbXB0eSBlbnRyaWVzICovCisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiU2tpcHBpbmcgZW50cnkgJXUgKCUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgJXApIiwKKyAgICAgICAgICBzdHJlYW0tPmN1cnJlbnRfZW50cnksIHNpemUsIHN0cmVhbS0+cGFkKTsKKyAgICAgIGdvdG8gbmV4dDsKKyAgICB9CisKKyAgICBpZiAoYXZpLT5zZWdtZW50LnJhdGUgPiAwLjApIHsKKyAgICAgIC8qIG9ubHkgY2hlY2sgdGhpcyBmb3IgZm93YXJkcyBwbGF5YmFjayBmb3Igbm93ICovCisgICAgICBpZiAoa2V5ZnJhbWUgJiYgR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGF2aS0+c2VnbWVudC5zdG9wKQorICAgICAgICAgICYmICh0aW1lc3RhbXAgPiBhdmktPnNlZ21lbnQuc3RvcCkpIHsKKyAgICAgICAgZ290byBlb3Nfc3RvcDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGtleWZyYW1lICYmIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChhdmktPnNlZ21lbnQuc3RhcnQpCisgICAgICAgICAgJiYgKHRpbWVzdGFtcCA8IGF2aS0+c2VnbWVudC5zdGFydCkpCisgICAgICAgIGdvdG8gZW9zX3N0b3A7CisgICAgfQorCisgICAgR1NUX0xPRyAoInJlYWRpbmcgYnVmZmVyIChzaXplPSUiIEdfR1VJTlQ2NF9GT1JNQVQgIiksIHN0cmVhbSAlZCwgcG9zICUiCisgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIiAoMHglIiBHX0dJTlQ2NF9NT0RJRklFUiAieCksIGtmICVkIiwgc2l6ZSwKKyAgICAgICAgc3RyZWFtX251bSwgb2Zmc2V0LCBvZmZzZXQsIGtleWZyYW1lKTsKKworICAgIC8qIEZJWE1FLCBjaGVjayBsYXJnZSBjaHVua3MgYW5kIGN1dCB0aGVtIHVwICovCisKKyAgICAvKiBwdWxsIGluIHRoZSBkYXRhICovCisgICAgYnVmID0gTlVMTDsKKyAgICByZXQgPSBnc3RfcGFkX3B1bGxfcmFuZ2UgKGF2aS0+c2lua3BhZCwgb2Zmc2V0LCBzaXplLCAmYnVmKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgZ290byBwdWxsX2ZhaWxlZDsKKworICAgIC8qIGNoZWNrIGZvciBzaG9ydCBidWZmZXJzLCB0aGlzIGlzIEVPUyBhcyB3ZWxsICovCisgICAgaWYgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikgPCBzaXplKQorICAgICAgZ290byBzaG9ydF9idWZmZXI7CisKKyAgICAvKiBpbnZlcnQgdGhlIHBpY3R1cmUgaWYgbmVlZGVkLCBhbmQgYXBwZW5kIHBhbGV0dGUgZm9yIFJHQjhQICovCisgICAgYnVmID0gZ3N0X2F2aV9kZW11eF9pbnZlcnQgKHN0cmVhbSwgYnVmKTsKKworICAgIC8qIG1hcmsgbm9uLWtleWZyYW1lcyAqLworICAgIGlmIChrZXlmcmFtZSB8fCBzdHJlYW0tPmlzX3JhdykgeworICAgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKTsKKyAgICAgIEdTVF9CVUZGRVJfUFRTIChidWYpID0gdGltZXN0YW1wOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKTsKKyAgICAgIEdTVF9CVUZGRVJfUFRTIChidWYpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICB9CisKKyAgICBHU1RfQlVGRkVSX0RUUyAoYnVmKSA9IHRpbWVzdGFtcDsKKworICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikgPSBkdXJhdGlvbjsKKyAgICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSA9IG91dF9vZmZzZXQ7CisgICAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWYpID0gb3V0X29mZnNldF9lbmQ7CisKKyAgICAvKiBtYXJrIGRpc2NvbnQgd2hlbiBwZW5kaW5nICovCisgICAgaWYgKHN0cmVhbS0+ZGlzY29udCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic2V0dGluZyBESVNDT05UIGZsYWciKTsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgICAgc3RyZWFtLT5kaXNjb250ID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgfQorI2lmIDAKKyAgICBnc3RfYXZpX2RlbXV4X2FkZF9hc3NvYyAoYXZpLCBzdHJlYW0sIHRpbWVzdGFtcCwgb2Zmc2V0LCBrZXlmcmFtZSk7CisjZW5kaWYKKworICAgIC8qIHVwZGF0ZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzZWdtZW50ICovCisgICAgYXZpLT5zZWdtZW50LnBvc2l0aW9uID0gdGltZXN0YW1wOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiUHVzaGluZyBidWZmZXIgb2Ygc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCAiLCB0cyAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiwgZHVyICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBvZmYgJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAiLCBvZmZfZW5kICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZiksIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGR1cmF0aW9uKSwgb3V0X29mZnNldCwgb3V0X29mZnNldF9lbmQpOworCisgICAgaWYgKHN0cmVhbS0+YWxpZ25tZW50ID4gMSkKKyAgICAgIGJ1ZiA9IGdzdF9hdmlfZGVtdXhfYWxpZ25fYnVmZmVyIChhdmksIGJ1Ziwgc3RyZWFtLT5hbGlnbm1lbnQpOworICAgIHJldCA9IGdzdF9wYWRfcHVzaCAoc3RyZWFtLT5wYWQsIGJ1Zik7CisKKyAgICAvKiBtYXJrIGFzIHByb2Nlc3NlZCwgd2UgaW5jcmVtZW50IHRoZSBmcmFtZSBhbmQgYnl0ZSBjb3VudGVycyB0aGVuCisgICAgICogbGVhdmUgdGhlIHdoaWxlIGxvb3AgYW5kIHJldHVybiB0aGUgR3N0Rmxvd1JldHVybiAqLworICAgIHByb2Nlc3NlZCA9IFRSVUU7CisKKyAgICBpZiAoYXZpLT5zZWdtZW50LnJhdGUgPCAwKSB7CisgICAgICBpZiAodGltZXN0YW1wID4gYXZpLT5zZWdtZW50LnN0b3AgJiYgcmV0ID09IEdTVF9GTE9XX0VPUykgeworICAgICAgICAvKiBJbiByZXZlcnNlIHBsYXliYWNrIHdlIGNhbiBnZXQgYSBHU1RfRkxPV19FT1Mgd2hlbgorICAgICAgICAgKiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgc2VnbWVudCwgc28gd2UganVzdCBuZWVkIHRvIGp1bXAKKyAgICAgICAgICogYmFjayB0byB0aGUgcHJldmlvdXMgc2VjdGlvbi4gKi8KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiZG93bnN0cmVhbSBoYXMgcmVhY2hlZCBlbmQgb2Ygc2VnbWVudCIpOworICAgICAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICAgIH0KKyAgICB9CisgIG5leHQ6CisgICAgLyogbW92ZSB0byBuZXh0IGl0ZW0gKi8KKyAgICByZXQgPSBnc3RfYXZpX2RlbXV4X2FkdmFuY2UgKGF2aSwgc3RyZWFtLCByZXQpOworCisgICAgLyogY29tYmluZSBmbG93cyAqLworICAgIHJldCA9IGdzdF9hdmlfZGVtdXhfY29tYmluZV9mbG93cyAoYXZpLCBzdHJlYW0sIHJldCk7CisgIH0gd2hpbGUgKCFwcm9jZXNzZWQpOworCitiZWFjaDoKKyAgcmV0dXJuIHJldDsKKworICAvKiBzcGVjaWFsIGNhc2VzICovCitlb3M6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJObyBzYW1wbGVzIGxlZnQgZm9yIGFueSBzdHJlYW1zIC0gRU9TIik7CisgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgIGdvdG8gYmVhY2g7CisgIH0KK2Vvc19zdG9wOgorICB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGF2aSwgIkZvdW5kIGtleWZyYW1lIGFmdGVyIHNlZ21lbnQsIgorICAgICAgICAiIHNldHRpbmcgRU9TICglIiBHU1RfVElNRV9GT1JNQVQgIiA+ICUiIEdTVF9USU1FX0ZPUk1BVCAiKSIsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCksIEdTVF9USU1FX0FSR1MgKGF2aS0+c2VnbWVudC5zdG9wKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgIC8qIG1vdmUgdG8gbmV4dCBzdHJlYW0gKi8KKyAgICBnb3RvIG5leHQ7CisgIH0KK3B1bGxfZmFpbGVkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAicHVsbCByYW5nZSBmYWlsZWQ6IHBvcz0lIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICIgc2l6ZT0lIiBHX0dVSU5UNjRfRk9STUFULCBvZmZzZXQsIHNpemUpOworICAgIGdvdG8gYmVhY2g7CisgIH0KK3Nob3J0X2J1ZmZlcjoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLCAiU2hvcnQgcmVhZCBhdCBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAiLCBvbmx5IGdvdCAlIiBHX0dTSVpFX0ZPUk1BVCAiLyUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICAgIiBieXRlcyAodHJ1bmNhdGVkIGZpbGU/KSIsIG9mZnNldCwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSwgc2l6ZSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXQgPSBHU1RfRkxPV19FT1M7CisgICAgZ290byBiZWFjaDsKKyAgfQorfQorCisvKgorICogUmVhZCBkYXRhLiBJZiB3ZSBoYXZlIGFuIGluZGV4IGl0IGRlbGVnYXRlcyB0bworICogZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkoKS4KKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hdmlfZGVtdXhfc3RyZWFtX2RhdGEgKEdzdEF2aURlbXV4ICogYXZpKQoreworICBndWludDMyIHRhZyA9IDA7CisgIGd1aW50MzIgc2l6ZSA9IDA7CisgIGdpbnQgc3RyZWFtX25yID0gMDsKKyAgR3N0Rmxvd1JldHVybiByZXMgPSBHU1RfRkxPV19PSzsKKworICBpZiAoR19VTkxJS0VMWSAoYXZpLT5oYXZlX2VvcykpIHsKKyAgICAvKiBDbGVhbiBhZGFwdGVyLCB3ZSdyZSBkb25lICovCisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGF2aS0+YWRhcHRlcik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VPUzsKKyAgfQorCisgIGlmIChHX1VOTElLRUxZIChhdmktPnRvZHJvcCkpIHsKKyAgICBndWludCBkcm9wOworCisgICAgaWYgKChkcm9wID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChhdmktPmFkYXB0ZXIpKSkgeworICAgICAgaWYgKGRyb3AgPiBhdmktPnRvZHJvcCkKKyAgICAgICAgZHJvcCA9IGF2aS0+dG9kcm9wOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiRHJvcHBpbmcgJWQgYnl0ZXMiLCBkcm9wKTsKKyAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChhdmktPmFkYXB0ZXIsIGRyb3ApOworICAgICAgYXZpLT50b2Ryb3AgLT0gZHJvcDsKKyAgICAgIGF2aS0+b2Zmc2V0ICs9IGRyb3A7CisgICAgfQorICB9CisKKyAgLyogSXRlcmF0ZSB1bnRpbCBuZWVkIG1vcmUgZGF0YSwgc28gYWRhcHRlciB3b24ndCBncm93IHRvbyBtdWNoICovCisgIHdoaWxlICgxKSB7CisgICAgaWYgKEdfVU5MSUtFTFkgKCFnc3RfYXZpX2RlbXV4X3BlZWtfY2h1bmtfaW5mbyAoYXZpLCAmdGFnLCAmc2l6ZSkpKSB7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgICAgfQorCisgICAgR1NUX0RFQlVHICgiVHJ5aW5nIGNodW5rICglIiBHU1RfRk9VUkNDX0ZPUk1BVCAiKSwgc2l6ZSAlZCIsCisgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSwgc2l6ZSk7CisKKyAgICBpZiAoR19MSUtFTFkgKCh0YWcgJiAweGZmKSA+PSAnMCcgJiYgKHRhZyAmIDB4ZmYpIDw9ICc5JyAmJgorICAgICAgICAgICAgKCh0YWcgPj4gOCkgJiAweGZmKSA+PSAnMCcgJiYgKCh0YWcgPj4gOCkgJiAweGZmKSA8PSAnOScpKSB7CisgICAgICBHU1RfTE9HICgiQ2h1bmsgb2siKTsKKyAgICB9IGVsc2UgaWYgKCh0YWcgJiAweGZmZmYpID09ICgoJ3gnIDw8IDgpIHwgJ2knKSkgeworICAgICAgR1NUX0RFQlVHICgiRm91bmQgc3ViLWluZGV4IHRhZyIpOworICAgICAgaWYgKGdzdF9hdmlfZGVtdXhfcGVla19jaHVuayAoYXZpLCAmdGFnLCAmc2l6ZSkgfHwgc2l6ZSA9PSAwKSB7CisgICAgICAgIC8qIGFjY2VwdCAwIHNpemUgYnVmZmVyIGhlcmUgKi8KKyAgICAgICAgYXZpLT5hYm9ydF9idWZmZXJpbmcgPSBGQUxTRTsKKyAgICAgICAgR1NUX0RFQlVHICgiICBza2lwcGluZyAlZCBieXRlcyBmb3Igbm93Iiwgc2l6ZSk7CisgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChhdmktPmFkYXB0ZXIsIDggKyBHU1RfUk9VTkRfVVBfMiAoc2l6ZSkpOworICAgICAgfQorICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgIH0gZWxzZSBpZiAodGFnID09IEdTVF9SSUZGX1RBR19SSUZGKSB7CisgICAgICAvKiBSSUZGIHRhZ3MgY2FuIGFwcGVhciBpbiBPRE1MIGZpbGVzLCBqdXN0IGp1bXAgb3ZlciB0aGVtICovCisgICAgICBpZiAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChhdmktPmFkYXB0ZXIpID49IDEyKSB7CisgICAgICAgIEdTVF9ERUJVRyAoIkZvdW5kIFJJRkYgdGFnLCBza2lwcGluZyBSSUZGIGhlYWRlciIpOworICAgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAoYXZpLT5hZGFwdGVyLCAxMik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgIH0gZWxzZSBpZiAodGFnID09IEdTVF9SSUZGX1RBR19pZHgxKSB7CisgICAgICBHU1RfREVCVUcgKCJGb3VuZCBpbmRleCB0YWciKTsKKyAgICAgIGlmIChnc3RfYXZpX2RlbXV4X3BlZWtfY2h1bmsgKGF2aSwgJnRhZywgJnNpemUpIHx8IHNpemUgPT0gMCkgeworICAgICAgICAvKiBhY2NlcHQgMCBzaXplIGJ1ZmZlciBoZXJlICovCisgICAgICAgIGF2aS0+YWJvcnRfYnVmZmVyaW5nID0gRkFMU0U7CisgICAgICAgIEdTVF9ERUJVRyAoIiAgc2tpcHBpbmcgJWQgYnl0ZXMgZm9yIG5vdyIsIHNpemUpOworICAgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAoYXZpLT5hZGFwdGVyLCA4ICsgR1NUX1JPVU5EX1VQXzIgKHNpemUpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgICB9IGVsc2UgaWYgKHRhZyA9PSBHU1RfUklGRl9UQUdfTElTVCkgeworICAgICAgLyogbW92aSBjaHVua3MgbWlnaHQgYmUgZ3JvdXBlZCBpbiByZWMgbGlzdCAqLworICAgICAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoYXZpLT5hZGFwdGVyKSA+PSAxMikgeworICAgICAgICBHU1RfREVCVUcgKCJGb3VuZCBMSVNUIHRhZywgc2tpcHBpbmcgTElTVCBoZWFkZXIiKTsKKyAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGF2aS0+YWRhcHRlciwgMTIpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgICB9IGVsc2UgaWYgKHRhZyA9PSBHU1RfUklGRl9UQUdfSlVOSyB8fCB0YWcgPT0gR1NUX1JJRkZfVEFHX0pVTlEpIHsKKyAgICAgIC8qIHJlYyBsaXN0IG1pZ2h0IGNvbnRhaW4gSlVOSyBjaHVua3MgKi8KKyAgICAgIEdTVF9ERUJVRyAoIkZvdW5kIEpVTksgdGFnIik7CisgICAgICBpZiAoZ3N0X2F2aV9kZW11eF9wZWVrX2NodW5rIChhdmksICZ0YWcsICZzaXplKSB8fCBzaXplID09IDApIHsKKyAgICAgICAgLyogYWNjZXB0IDAgc2l6ZSBidWZmZXIgaGVyZSAqLworICAgICAgICBhdmktPmFib3J0X2J1ZmZlcmluZyA9IEZBTFNFOworICAgICAgICBHU1RfREVCVUcgKCIgIHNraXBwaW5nICVkIGJ5dGVzIGZvciBub3ciLCBzaXplKTsKKyAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGF2aS0+YWRhcHRlciwgOCArIEdTVF9ST1VORF9VUF8yIChzaXplKSk7CisgICAgICB9CisgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVRyAoIk5vIG1vcmUgc3RyZWFtIGNodW5rcywgc2VuZCBFT1MiKTsKKyAgICAgIGF2aS0+aGF2ZV9lb3MgPSBUUlVFOworICAgICAgcmV0dXJuIEdTVF9GTE9XX0VPUzsKKyAgICB9CisKKyAgICBpZiAoR19VTkxJS0VMWSAoIWdzdF9hdmlfZGVtdXhfcGVla19jaHVuayAoYXZpLCAmdGFnLCAmc2l6ZSkpKSB7CisgICAgICAvKiBzdXBwb3NlZGx5IG9uZSBob3BlcyB0byBjYXRjaCBhIG5pY2VyIGNodW5rIGxhdGVyIG9uIC4uLiAqLworICAgICAgLyogRklYTUUgPz8gZ2l2ZSB1cCBoZXJlIHJhdGhlciB0aGFuIHBvc3NpYmx5IGVuZGluZyB1cCBnb2luZworICAgICAgICogdGhyb3VnaCB0aGUgd2hvbGUgZmlsZSAqLworICAgICAgaWYgKGF2aS0+YWJvcnRfYnVmZmVyaW5nKSB7CisgICAgICAgIGF2aS0+YWJvcnRfYnVmZmVyaW5nID0gRkFMU0U7CisgICAgICAgIGlmIChzaXplKSB7CisgICAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGF2aS0+YWRhcHRlciwgOCk7CisgICAgICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgICAgICB9CisgICAgfQorICAgIEdTVF9ERUJVRyAoImNodW5rIElEICUiIEdTVF9GT1VSQ0NfRk9STUFUICIsIHNpemUgJXUiLAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHRhZyksIHNpemUpOworCisgICAgc3RyZWFtX25yID0gQ0hVTktJRF9UT19TVFJFQU1OUiAodGFnKTsKKworICAgIGlmIChHX1VOTElLRUxZIChzdHJlYW1fbnIgPCAwIHx8IHN0cmVhbV9uciA+PSBhdmktPm51bV9zdHJlYW1zKSkgeworICAgICAgLyogcmVjb3ZlcmFibGUgKi8KKyAgICAgIEdTVF9XQVJOSU5HICgiSW52YWxpZCBzdHJlYW0gSUQgJWQgKCUiIEdTVF9GT1VSQ0NfRk9STUFUICIpIiwKKyAgICAgICAgICBzdHJlYW1fbnIsIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSk7CisgICAgICBhdmktPm9mZnNldCArPSA4ICsgR1NUX1JPVU5EX1VQXzIgKHNpemUpOworICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGF2aS0+YWRhcHRlciwgOCArIEdTVF9ST1VORF9VUF8yIChzaXplKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdzdEF2aVN0cmVhbSAqc3RyZWFtOworICAgICAgR3N0Q2xvY2tUaW1lIG5leHRfdHMgPSAwOworICAgICAgR3N0QnVmZmVyICpidWYgPSBOVUxMOworI2lmIDAKKyAgICAgIGd1aW50NjQgb2Zmc2V0OworI2VuZGlmCisgICAgICBnYm9vbGVhbiBzYXdfZGVzaXJlZF9rZiA9IHN0cmVhbV9uciAhPSBhdmktPm1haW5fc3RyZWFtCisgICAgICAgICAgfHwgYXZpLT5vZmZzZXQgPj0gYXZpLT5zZWVrX2tmX29mZnNldDsKKworICAgICAgaWYgKHN0cmVhbV9uciA9PSBhdmktPm1haW5fc3RyZWFtICYmIGF2aS0+b2Zmc2V0ID09IGF2aS0+c2Vla19rZl9vZmZzZXQpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiRGVzaXJlZCBrZXlmcmFtZSByZWFjaGVkIik7CisgICAgICAgIGF2aS0+c2Vla19rZl9vZmZzZXQgPSAwOworICAgICAgfQorCisgICAgICBpZiAoc2F3X2Rlc2lyZWRfa2YpIHsKKyAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGF2aS0+YWRhcHRlciwgOCk7CisgICAgICAgIC8qIGdldCBidWZmZXIgKi8KKyAgICAgICAgaWYgKHNpemUpIHsKKyAgICAgICAgICBidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoYXZpLT5hZGFwdGVyLCBHU1RfUk9VTkRfVVBfMiAoc2l6ZSkpOworICAgICAgICAgIC8qIHBhdGNoIHRoZSBzaXplICovCisgICAgICAgICAgZ3N0X2J1ZmZlcl9yZXNpemUgKGJ1ZiwgMCwgc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnVmID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLAorICAgICAgICAgICAgIkRlc2lyZWQga2V5ZnJhbWUgbm90IHlldCByZWFjaGVkLCBmbHVzaGluZyBjaHVuayIpOworICAgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAoYXZpLT5hZGFwdGVyLCA4ICsgR1NUX1JPVU5EX1VQXzIgKHNpemUpKTsKKyAgICAgIH0KKworI2lmIDAKKyAgICAgIG9mZnNldCA9IGF2aS0+b2Zmc2V0OworI2VuZGlmCisgICAgICBhdmktPm9mZnNldCArPSA4ICsgR1NUX1JPVU5EX1VQXzIgKHNpemUpOworCisgICAgICBzdHJlYW0gPSAmYXZpLT5zdHJlYW1bc3RyZWFtX25yXTsKKworICAgICAgLyogc2V0IGRlbGF5IChpZiBhbnkpCisgICAgICAgICBpZiAoc3RyZWFtLT5zdHJoLT5pbml0X2ZyYW1lcyA9PSBzdHJlYW0tPmN1cnJlbnRfZnJhbWUgJiYKKyAgICAgICAgIHN0cmVhbS0+ZGVsYXkgPT0gMCkKKyAgICAgICAgIHN0cmVhbS0+ZGVsYXkgPSBuZXh0X3RzOworICAgICAgICovCisKKyAgICAgIC8qIHBhcnNpbmcgb2YgY29ycmVzcG9uZGluZyBoZWFkZXIgbWF5IGhhdmUgZmFpbGVkICovCisgICAgICBpZiAoR19VTkxJS0VMWSAoIXN0cmVhbS0+cGFkKSkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aSwgIm5vIHBhZCBmb3Igc3RyZWFtIElEICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTICh0YWcpKTsKKyAgICAgICAgaWYgKGJ1ZikKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogZ2V0IHRpbWUgb2YgdGhpcyBidWZmZXIgKi8KKyAgICAgICAgZ3N0X3BhZF9xdWVyeV9wb3NpdGlvbiAoc3RyZWFtLT5wYWQsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgICAgIChnaW50NjQgKikgJiBuZXh0X3RzKTsKKworI2lmIDAKKyAgICAgICAgZ3N0X2F2aV9kZW11eF9hZGRfYXNzb2MgKGF2aSwgc3RyZWFtLCBuZXh0X3RzLCBvZmZzZXQsIEZBTFNFKTsKKyNlbmRpZgorCisgICAgICAgIC8qIGluY3JlbWVudCBvdXIgcG9zaXRpb25zICovCisgICAgICAgIHN0cmVhbS0+Y3VycmVudF9lbnRyeSsrOworICAgICAgICAvKiBhcyBpbiBwdWxsIG1vZGUsICd0b3RhbCcgaXMgZWl0aGVyIGJ5dGVzIChDQlIpIG9yIGZyYW1lcyAoVkJSKSAqLworICAgICAgICBpZiAoc3RyZWFtLT5zdHJoLT50eXBlID09IEdTVF9SSUZGX0ZDQ19hdWRzICYmIHN0cmVhbS0+aXNfdmJyKSB7CisgICAgICAgICAgZ2ludCBibG9ja2FsaWduID0gc3RyZWFtLT5zdHJmLmF1ZHMtPmJsb2NrYWxpZ247CisgICAgICAgICAgaWYgKGJsb2NrYWxpZ24gPiAwKQorICAgICAgICAgICAgc3RyZWFtLT5jdXJyZW50X3RvdGFsICs9IERJVl9ST1VORF9VUCAoc2l6ZSwgYmxvY2thbGlnbik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RyZWFtLT5jdXJyZW50X3RvdGFsKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RyZWFtLT5jdXJyZW50X3RvdGFsICs9IHNpemU7CisgICAgICAgIH0KKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGF2aSwgImN1cnJlbnQgZW50cnkgJXUsIHRvdGFsICV1IiwKKyAgICAgICAgICAgIHN0cmVhbS0+Y3VycmVudF9lbnRyeSwgc3RyZWFtLT5jdXJyZW50X3RvdGFsKTsKKworICAgICAgICAvKiB1cGRhdGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc2VnbWVudCAqLworICAgICAgICBhdmktPnNlZ21lbnQucG9zaXRpb24gPSBuZXh0X3RzOworCisgICAgICAgIGlmIChzYXdfZGVzaXJlZF9rZiAmJiBidWYpIHsKKyAgICAgICAgICBHc3RDbG9ja1RpbWUgZHVyX3RzID0gMDsKKworICAgICAgICAgIC8qIGludmVydCB0aGUgcGljdHVyZSBpZiBuZWVkZWQsIGFuZCBhcHBlbmQgcGFsZXR0ZSBmb3IgUkdCOFAgKi8KKyAgICAgICAgICBidWYgPSBnc3RfYXZpX2RlbXV4X2ludmVydCAoc3RyZWFtLCBidWYpOworCisgICAgICAgICAgZ3N0X3BhZF9xdWVyeV9wb3NpdGlvbiAoc3RyZWFtLT5wYWQsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgICAgICAgKGdpbnQ2NCAqKSAmIGR1cl90cyk7CisKKyAgICAgICAgICBHU1RfQlVGRkVSX0RUUyAoYnVmKSA9IG5leHRfdHM7CisgICAgICAgICAgR1NUX0JVRkZFUl9QVFMgKGJ1ZikgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgICAgICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikgPSBkdXJfdHMgLSBuZXh0X3RzOworICAgICAgICAgIGlmIChzdHJlYW0tPnN0cmgtPnR5cGUgPT0gR1NUX1JJRkZfRkNDX3ZpZHMpIHsKKyAgICAgICAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpID0gc3RyZWFtLT5jdXJyZW50X2VudHJ5IC0gMTsKKyAgICAgICAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmKSA9IHN0cmVhbS0+Y3VycmVudF9lbnRyeTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikgPSBHU1RfQlVGRkVSX09GRlNFVF9OT05FOworICAgICAgICAgICAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWYpID0gR1NUX0JVRkZFUl9PRkZTRVRfTk9ORTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksCisgICAgICAgICAgICAgICJQdXNoaW5nIGJ1ZmZlciB3aXRoIHRpbWU9JSIgR1NUX1RJTUVfRk9STUFUICIsIGR1cmF0aW9uICUiCisgICAgICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiLCBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAgICAgICAiIGFuZCBzaXplICVkIG92ZXIgcGFkICVzIiwgR1NUX1RJTUVfQVJHUyAobmV4dF90cyksCisgICAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikpLAorICAgICAgICAgICAgICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSwgc2l6ZSwgR1NUX1BBRF9OQU1FIChzdHJlYW0tPnBhZCkpOworCisgICAgICAgICAgLyogbWFyayBkaXNjb250IHdoZW4gcGVuZGluZyAqLworICAgICAgICAgIGlmIChHX1VOTElLRUxZIChzdHJlYW0tPmRpc2NvbnQpKSB7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJTZXR0aW5nIERJU0NPTlQiKTsKKyAgICAgICAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgICAgICAgICAgc3RyZWFtLT5kaXNjb250ID0gRkFMU0U7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHN0cmVhbS0+YWxpZ25tZW50ID4gMSkKKyAgICAgICAgICAgIGJ1ZiA9IGdzdF9hdmlfZGVtdXhfYWxpZ25fYnVmZmVyIChhdmksIGJ1Ziwgc3RyZWFtLT5hbGlnbm1lbnQpOworICAgICAgICAgIHJlcyA9IGdzdF9wYWRfcHVzaCAoc3RyZWFtLT5wYWQsIGJ1Zik7CisgICAgICAgICAgYnVmID0gTlVMTDsKKworICAgICAgICAgIC8qIGNvbWJpbmUgZmxvd3MgKi8KKyAgICAgICAgICByZXMgPSBnc3RfYXZpX2RlbXV4X2NvbWJpbmVfZmxvd3MgKGF2aSwgc3RyZWFtLCByZXMpOworICAgICAgICAgIGlmIChHX1VOTElLRUxZIChyZXMgIT0gR1NUX0ZMT1dfT0spKSB7CisgICAgICAgICAgICBHU1RfREVCVUcgKCJQdXNoIGZhaWxlZDsgJXMiLCBnc3RfZmxvd19nZXRfbmFtZSAocmVzKSk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKKy8qCisgKiBTZW5kIHBlbmRpbmcgdGFncy4KKyAqLworc3RhdGljIHZvaWQKK3B1c2hfdGFnX2xpc3RzIChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgZ3VpbnQgaTsKKyAgR3N0VGFnTGlzdCAqdGFnczsKKworICBpZiAoIWF2aS0+Z290X3RhZ3MpCisgICAgcmV0dXJuOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIlB1c2hpbmcgcGVuZGluZyB0YWcgbGlzdHMiKTsKKworICBmb3IgKGkgPSAwOyBpIDwgYXZpLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgR3N0QXZpU3RyZWFtICpzdHJlYW0gPSAmYXZpLT5zdHJlYW1baV07CisgICAgR3N0UGFkICpwYWQgPSBzdHJlYW0tPnBhZDsKKworICAgIHRhZ3MgPSBzdHJlYW0tPnRhZ2xpc3Q7CisKKyAgICBpZiAocGFkICYmIHRhZ3MpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgIlRhZ3M6ICUiIEdTVF9QVFJfRk9STUFULCB0YWdzKTsKKworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChwYWQsIGdzdF9ldmVudF9uZXdfdGFnICh0YWdzKSk7CisgICAgICBzdHJlYW0tPnRhZ2xpc3QgPSBOVUxMOworICAgIH0KKyAgfQorCisgIGlmICghKHRhZ3MgPSBhdmktPmdsb2JhbHRhZ3MpKQorICAgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgIEdTVF9UQUdfQ09OVEFJTkVSX0ZPUk1BVCwgIkFWSSIsIE5VTEwpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIkdsb2JhbCB0YWdzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgdGFncyk7CisgIGdzdF90YWdfbGlzdF9zZXRfc2NvcGUgKHRhZ3MsIEdTVF9UQUdfU0NPUEVfR0xPQkFMKTsKKyAgZ3N0X2F2aV9kZW11eF9wdXNoX2V2ZW50IChhdmksIGdzdF9ldmVudF9uZXdfdGFnICh0YWdzKSk7CisgIGF2aS0+Z2xvYmFsdGFncyA9IE5VTEw7CisgIGF2aS0+Z290X3RhZ3MgPSBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdmlfZGVtdXhfbG9vcCAoR3N0UGFkICogcGFkKQoreworICBHc3RGbG93UmV0dXJuIHJlczsKKyAgR3N0QXZpRGVtdXggKmF2aSA9IEdTVF9BVklfREVNVVggKEdTVF9QQURfUEFSRU5UIChwYWQpKTsKKworICBzd2l0Y2ggKGF2aS0+c3RhdGUpIHsKKyAgICBjYXNlIEdTVF9BVklfREVNVVhfU1RBUlQ6CisgICAgICByZXMgPSBnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbml0X3B1bGwgKGF2aSk7CisgICAgICBpZiAoR19VTkxJS0VMWSAocmVzICE9IEdTVF9GTE9XX09LKSkgeworICAgICAgICBHU1RfV0FSTklORyAoInN0cmVhbV9pbml0IGZsb3c6ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJlcykpOworICAgICAgICBnb3RvIHBhdXNlOworICAgICAgfQorICAgICAgYXZpLT5zdGF0ZSA9IEdTVF9BVklfREVNVVhfSEVBREVSOworICAgICAgLyogZmFsbC10aHJvdWdoICovCisgICAgY2FzZSBHU1RfQVZJX0RFTVVYX0hFQURFUjoKKyAgICAgIHJlcyA9IGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlcl9wdWxsIChhdmkpOworICAgICAgaWYgKEdfVU5MSUtFTFkgKHJlcyAhPSBHU1RfRkxPV19PSykpIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJzdHJlYW1faGVhZGVyIGZsb3c6ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJlcykpOworICAgICAgICBnb3RvIHBhdXNlOworICAgICAgfQorICAgICAgYXZpLT5zdGF0ZSA9IEdTVF9BVklfREVNVVhfTU9WSTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FWSV9ERU1VWF9NT1ZJOgorICAgICAgaWYgKEdfVU5MSUtFTFkgKGF2aS0+c2VnX2V2ZW50KSkgeworICAgICAgICBnc3RfYXZpX2RlbXV4X3B1c2hfZXZlbnQgKGF2aSwgYXZpLT5zZWdfZXZlbnQpOworICAgICAgICBhdmktPnNlZ19ldmVudCA9IE5VTEw7CisgICAgICB9CisgICAgICBpZiAoR19VTkxJS0VMWSAoYXZpLT5nb3RfdGFncykpIHsKKyAgICAgICAgcHVzaF90YWdfbGlzdHMgKGF2aSk7CisgICAgICB9CisgICAgICAvKiBwcm9jZXNzIGVhY2ggaW5kZXggZW50cnkgaW4gdHVybiAqLworICAgICAgcmVzID0gZ3N0X2F2aV9kZW11eF9sb29wX2RhdGEgKGF2aSk7CisKKyAgICAgIC8qIHBhdXNlIHdoZW4gZXJyb3IgKi8KKyAgICAgIGlmIChHX1VOTElLRUxZIChyZXMgIT0gR1NUX0ZMT1dfT0spKSB7CisgICAgICAgIEdTVF9JTkZPICgic3RyZWFtX21vdmkgZmxvdzogJXMiLCBnc3RfZmxvd19nZXRfbmFtZSAocmVzKSk7CisgICAgICAgIGdvdG8gcGF1c2U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX0VSUk9SX09CSkVDVCAoYXZpLCAidW5rbm93biBzdGF0ZSAlZCIsIGF2aS0+c3RhdGUpOworICAgICAgcmVzID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICBnb3RvIHBhdXNlOworICB9CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworcGF1c2U6eworCisgICAgZ2Jvb2xlYW4gcHVzaF9lb3MgPSBGQUxTRTsKKyAgICBHU1RfTE9HX09CSkVDVCAoYXZpLCAicGF1c2luZyB0YXNrLCByZWFzb24gJXMiLCBnc3RfZmxvd19nZXRfbmFtZSAocmVzKSk7CisgICAgZ3N0X3BhZF9wYXVzZV90YXNrIChhdmktPnNpbmtwYWQpOworCisgICAgaWYgKHJlcyA9PSBHU1RfRkxPV19FT1MpIHsKKyAgICAgIC8qIGhhbmRsZSBlbmQtb2Ytc3RyZWFtL3NlZ21lbnQgKi8KKyAgICAgIC8qIHNvIGFsaWduIG91ciBwb3NpdGlvbiB3aXRoIHRoZSBlbmQgb2YgaXQsIGlmIHRoZXJlIGlzIG9uZQorICAgICAgICogdGhpcyBlbnN1cmVzIGEgc3Vic2VxdWVudCB3aWxsIGFycml2ZSBhdCBjb3JyZWN0IGJhc2UvYWNjIHRpbWUgKi8KKyAgICAgIGlmIChhdmktPnNlZ21lbnQucmF0ZSA+IDAuMCAmJgorICAgICAgICAgIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChhdmktPnNlZ21lbnQuc3RvcCkpCisgICAgICAgIGF2aS0+c2VnbWVudC5wb3NpdGlvbiA9IGF2aS0+c2VnbWVudC5zdG9wOworICAgICAgZWxzZSBpZiAoYXZpLT5zZWdtZW50LnJhdGUgPCAwLjApCisgICAgICAgIGF2aS0+c2VnbWVudC5wb3NpdGlvbiA9IGF2aS0+c2VnbWVudC5zdGFydDsKKyAgICAgIGlmIChhdmktPnNlZ21lbnQuZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NFR01FTlQpIHsKKyAgICAgICAgZ2ludDY0IHN0b3A7CisgICAgICAgIEdzdEV2ZW50ICpldmVudDsKKyAgICAgICAgR3N0TWVzc2FnZSAqbXNnOworCisgICAgICAgIGlmICgoc3RvcCA9IGF2aS0+c2VnbWVudC5zdG9wKSA9PSAtMSkKKyAgICAgICAgICBzdG9wID0gYXZpLT5zZWdtZW50LmR1cmF0aW9uOworCisgICAgICAgIEdTVF9JTkZPX09CSkVDVCAoYXZpLCAic2VuZGluZyBzZWdtZW50X2RvbmUiKTsKKworICAgICAgICBtc2cgPQorICAgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X3NlZ21lbnRfZG9uZSAoR1NUX09CSkVDVF9DQVNUIChhdmkpLAorICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBzdG9wKTsKKyAgICAgICAgaWYgKGF2aS0+c2VnbWVudF9zZXFudW0pCisgICAgICAgICAgZ3N0X21lc3NhZ2Vfc2V0X3NlcW51bSAobXNnLCBhdmktPnNlZ21lbnRfc2VxbnVtKTsKKyAgICAgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChhdmkpLCBtc2cpOworCisgICAgICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50X2RvbmUgKEdTVF9GT1JNQVRfVElNRSwgc3RvcCk7CisgICAgICAgIGlmIChhdmktPnNlZ21lbnRfc2VxbnVtKQorICAgICAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChldmVudCwgYXZpLT5zZWdtZW50X3NlcW51bSk7CisgICAgICAgIGdzdF9hdmlfZGVtdXhfcHVzaF9ldmVudCAoYXZpLCBldmVudCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwdXNoX2VvcyA9IFRSVUU7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXMgPT0gR1NUX0ZMT1dfTk9UX0xJTktFRCB8fCByZXMgPCBHU1RfRkxPV19FT1MpIHsKKyAgICAgIC8qIGZvciBmYXRhbCBlcnJvcnMgd2UgcG9zdCBhbiBlcnJvciBtZXNzYWdlLCB3cm9uZy1zdGF0ZSBpcworICAgICAgICogbm90IGZhdGFsIGJlY2F1c2UgaXQgaGFwcGVucyBkdWUgdG8gZmx1c2hlcyBhbmQgb25seSBtZWFucworICAgICAgICogdGhhdCB3ZSBzaG91bGQgc3RvcCBub3cuICovCisgICAgICBHU1RfRUxFTUVOVF9GTE9XX0VSUk9SIChhdmksIHJlcyk7CisgICAgICBwdXNoX2VvcyA9IFRSVUU7CisgICAgfQorICAgIGlmIChwdXNoX2VvcykgeworICAgICAgR3N0RXZlbnQgKmV2ZW50OworCisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgInNlbmRpbmcgZW9zIik7CisgICAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfZW9zICgpOworICAgICAgaWYgKGF2aS0+c2VnbWVudF9zZXFudW0pCisgICAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChldmVudCwgYXZpLT5zZWdtZW50X3NlcW51bSk7CisgICAgICBpZiAoIWdzdF9hdmlfZGVtdXhfcHVzaF9ldmVudCAoYXZpLCBldmVudCkgJiYgKHJlcyA9PSBHU1RfRkxPV19FT1MpKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChhdmksIFNUUkVBTSwgREVNVVgsCisgICAgICAgICAgICAoTlVMTCksICgiZ290IGVvcyBidXQgbm8gc3RyZWFtcyAoeWV0KSIpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9kZW11eF9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXM7CisgIEdzdEF2aURlbXV4ICphdmkgPSBHU1RfQVZJX0RFTVVYIChwYXJlbnQpOworICBnaW50IGk7CisKKyAgaWYgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAoYnVmKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgImdvdCBESVNDT05UIik7CisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGF2aS0+YWRhcHRlcik7CisgICAgLyogbWFyayBhbGwgc3RyZWFtcyBESVNDT05UICovCisgICAgZm9yIChpID0gMDsgaSA8IGF2aS0+bnVtX3N0cmVhbXM7IGkrKykKKyAgICAgIGF2aS0+c3RyZWFtW2ldLmRpc2NvbnQgPSBUUlVFOworICB9CisKKyAgR1NUX0RFQlVHICgiU3RvcmUgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyBpbiBhZGFwdGVyIiwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikpOworICBnc3RfYWRhcHRlcl9wdXNoIChhdmktPmFkYXB0ZXIsIGJ1Zik7CisKKyAgc3dpdGNoIChhdmktPnN0YXRlKSB7CisgICAgY2FzZSBHU1RfQVZJX0RFTVVYX1NUQVJUOgorICAgICAgaWYgKChyZXMgPSBnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbml0X3B1c2ggKGF2aSkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgICAgIEdTVF9XQVJOSU5HICgic3RyZWFtX2luaXQgZmxvdzogJXMiLCBnc3RfZmxvd19nZXRfbmFtZSAocmVzKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVZJX0RFTVVYX0hFQURFUjoKKyAgICAgIGlmICgocmVzID0gZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyX3B1c2ggKGF2aSkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgICAgIEdTVF9XQVJOSU5HICgic3RyZWFtX2hlYWRlciBmbG93OiAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXMpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9BVklfREVNVVhfTU9WSToKKyAgICAgIGlmIChHX1VOTElLRUxZIChhdmktPnNlZ19ldmVudCkpIHsKKyAgICAgICAgZ3N0X2F2aV9kZW11eF9wdXNoX2V2ZW50IChhdmksIGF2aS0+c2VnX2V2ZW50KTsKKyAgICAgICAgYXZpLT5zZWdfZXZlbnQgPSBOVUxMOworICAgICAgfQorICAgICAgaWYgKEdfVU5MSUtFTFkgKGF2aS0+Z290X3RhZ3MpKSB7CisgICAgICAgIHB1c2hfdGFnX2xpc3RzIChhdmkpOworICAgICAgfQorICAgICAgcmVzID0gZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSAoYXZpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FWSV9ERU1VWF9TRUVLOgorICAgIHsKKyAgICAgIEdzdEV2ZW50ICpldmVudDsKKworICAgICAgcmVzID0gR1NUX0ZMT1dfT0s7CisKKyAgICAgIC8qIG9idGFpbiBhbmQgcGFyc2UgaW5kZXhlcyAqLworICAgICAgaWYgKGF2aS0+c3RyZWFtWzBdLmluZGV4ZXMgJiYgIWdzdF9hdmlfZGVtdXhfcmVhZF9zdWJpbmRleGVzX3B1c2ggKGF2aSkpCisgICAgICAgIC8qIHNlZWsgaW4gc3ViaW5kZXggcmVhZCBmdW5jdGlvbiBmYWlsZWQgKi8KKyAgICAgICAgZ290byBpbmRleF9mYWlsZWQ7CisKKyAgICAgIGlmICghYXZpLT5zdHJlYW1bMF0uaW5kZXhlcyAmJiAhYXZpLT5oYXZlX2luZGV4CisgICAgICAgICAgJiYgYXZpLT5hdmloLT5mbGFncyAmIEdTVF9SSUZGX0FWSUhfSEFTSU5ERVgpCisgICAgICAgIGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luZGV4X3B1c2ggKGF2aSk7CisKKyAgICAgIGlmIChhdmktPmhhdmVfaW5kZXgpIHsKKyAgICAgICAgLyogdXNlIHRoZSBpbmRleGVzIG5vdyB0byBjb25zdHJ1Y3QgbmljZSBkdXJhdGlvbnMgKi8KKyAgICAgICAgZ3N0X2F2aV9kZW11eF9jYWxjdWxhdGVfZHVyYXRpb25zX2Zyb21faW5kZXggKGF2aSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBzdGlsbCBwYXJzaW5nIGluZGV4ZXMgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoYXZpKTsKKyAgICAgIGV2ZW50ID0gYXZpLT5zZWVrX2V2ZW50OworICAgICAgYXZpLT5zZWVrX2V2ZW50ID0gTlVMTDsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChhdmkpOworCisgICAgICAvKiBjYWxjdWxhdGUgYW5kIHBlcmZvcm0gc2VlayAqLworICAgICAgaWYgKCFhdmlfZGVtdXhfaGFuZGxlX3NlZWtfcHVzaCAoYXZpLCBhdmktPnNpbmtwYWQsIGV2ZW50KSkgeworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgZ290byBzZWVrX2ZhaWxlZDsKKyAgICAgIH0KKworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBhdmktPnN0YXRlID0gR1NUX0FWSV9ERU1VWF9NT1ZJOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXZpLCBTVFJFQU0sIEZBSUxFRCwgKE5VTEwpLAorICAgICAgICAgICgiSWxsZWdhbCBpbnRlcm5hbCBzdGF0ZSIpKTsKKyAgICAgIHJlcyA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgYnJlYWs7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJzdGF0ZTogJWQgcmVzOiVzIiwgYXZpLT5zdGF0ZSwKKyAgICAgIGdzdF9mbG93X2dldF9uYW1lIChyZXMpKTsKKworICBpZiAoR19VTkxJS0VMWSAoYXZpLT5hYm9ydF9idWZmZXJpbmcpKQorICAgIGdvdG8gYWJvcnRfYnVmZmVyaW5nOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitpbmRleF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXZpLCBTVFJFQU0sIERFTVVYLCAoTlVMTCksICgiZmFpbGVkIHRvIHJlYWQgaW5kZXhlcyIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK3NlZWtfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF2aSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLCAoInB1c2ggbW9kZSBzZWVrIGZhaWxlZCIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2Fib3J0X2J1ZmZlcmluZzoKKyAgeworICAgIGF2aS0+YWJvcnRfYnVmZmVyaW5nID0gRkFMU0U7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF2aSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLCAoInVuaGFuZGxlZCBidWZmZXIgc2l6ZSIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYXZpX2RlbXV4X3NpbmtfYWN0aXZhdGUgKEdzdFBhZCAqIHNpbmtwYWQsIEdzdE9iamVjdCAqIHBhcmVudCkKK3sKKyAgR3N0UXVlcnkgKnF1ZXJ5OworICBnYm9vbGVhbiBwdWxsX21vZGU7CisKKyAgcXVlcnkgPSBnc3RfcXVlcnlfbmV3X3NjaGVkdWxpbmcgKCk7CisKKyAgaWYgKCFnc3RfcGFkX3BlZXJfcXVlcnkgKHNpbmtwYWQsIHF1ZXJ5KSkgeworICAgIGdzdF9xdWVyeV91bnJlZiAocXVlcnkpOworICAgIGdvdG8gYWN0aXZhdGVfcHVzaDsKKyAgfQorCisgIHB1bGxfbW9kZSA9IGdzdF9xdWVyeV9oYXNfc2NoZWR1bGluZ19tb2RlX3dpdGhfZmxhZ3MgKHF1ZXJ5LAorICAgICAgR1NUX1BBRF9NT0RFX1BVTEwsIEdTVF9TQ0hFRFVMSU5HX0ZMQUdfU0VFS0FCTEUpOworICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKworICBpZiAoIXB1bGxfbW9kZSkKKyAgICBnb3RvIGFjdGl2YXRlX3B1c2g7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2lua3BhZCwgImFjdGl2YXRpbmcgcHVsbCIpOworICByZXR1cm4gZ3N0X3BhZF9hY3RpdmF0ZV9tb2RlIChzaW5rcGFkLCBHU1RfUEFEX01PREVfUFVMTCwgVFJVRSk7CisKK2FjdGl2YXRlX3B1c2g6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rcGFkLCAiYWN0aXZhdGluZyBwdXNoIik7CisgICAgcmV0dXJuIGdzdF9wYWRfYWN0aXZhdGVfbW9kZSAoc2lua3BhZCwgR1NUX1BBRF9NT0RFX1BVU0gsIFRSVUUpOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F2aV9kZW11eF9zaW5rX2FjdGl2YXRlX21vZGUgKEdzdFBhZCAqIHNpbmtwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RQYWRNb2RlIG1vZGUsIGdib29sZWFuIGFjdGl2ZSkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RBdmlEZW11eCAqYXZpID0gR1NUX0FWSV9ERU1VWCAocGFyZW50KTsKKworICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIEdTVF9QQURfTU9ERV9QVUxMOgorICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICBhdmktPnN0cmVhbWluZyA9IEZBTFNFOworICAgICAgICByZXMgPSBnc3RfcGFkX3N0YXJ0X3Rhc2sgKHNpbmtwYWQsIChHc3RUYXNrRnVuY3Rpb24pIGdzdF9hdmlfZGVtdXhfbG9vcCwKKyAgICAgICAgICAgIHNpbmtwYWQsIE5VTEwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gZ3N0X3BhZF9zdG9wX3Rhc2sgKHNpbmtwYWQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUEFEX01PREVfUFVTSDoKKyAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgR1NUX0RFQlVHICgiYXZpOiBhY3RpdmF0aW5nIHB1c2gvY2hhaW4gZnVuY3Rpb24iKTsKKyAgICAgICAgYXZpLT5zdHJlYW1pbmcgPSBUUlVFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHICgiYXZpOiBkZWFjdGl2YXRpbmcgcHVzaC9jaGFpbiBmdW5jdGlvbiIpOworICAgICAgfQorICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9zZXRfaW5kZXggKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RJbmRleCAqIGluZGV4KQoreworICBHc3RBdmlEZW11eCAqYXZpID0gR1NUX0FWSV9ERU1VWCAoZWxlbWVudCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChhdmkpOworICBpZiAoYXZpLT5lbGVtZW50X2luZGV4KQorICAgIGdzdF9vYmplY3RfdW5yZWYgKGF2aS0+ZWxlbWVudF9pbmRleCk7CisgIGlmIChpbmRleCkgeworICAgIGF2aS0+ZWxlbWVudF9pbmRleCA9IGdzdF9vYmplY3RfcmVmIChpbmRleCk7CisgIH0gZWxzZSB7CisgICAgYXZpLT5lbGVtZW50X2luZGV4ID0gTlVMTDsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoYXZpKTsKKyAgLyogb2JqZWN0IGxvY2sgbWlnaHQgYmUgdGFrZW4gYWdhaW4gKi8KKyAgaWYgKGluZGV4KQorICAgIGdzdF9pbmRleF9nZXRfd3JpdGVyX2lkIChpbmRleCwgR1NUX09CSkVDVF9DQVNUIChlbGVtZW50KSwgJmF2aS0+aW5kZXhfaWQpOworICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJTZXQgaW5kZXggJSIgR1NUX1BUUl9GT1JNQVQsIGF2aS0+ZWxlbWVudF9pbmRleCk7Cit9CisKK3N0YXRpYyBHc3RJbmRleCAqCitnc3RfYXZpX2RlbXV4X2dldF9pbmRleCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdEluZGV4ICpyZXN1bHQgPSBOVUxMOworICBHc3RBdmlEZW11eCAqYXZpID0gR1NUX0FWSV9ERU1VWCAoZWxlbWVudCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChhdmkpOworICBpZiAoYXZpLT5lbGVtZW50X2luZGV4KQorICAgIHJlc3VsdCA9IGdzdF9vYmplY3RfcmVmIChhdmktPmVsZW1lbnRfaW5kZXgpOworICBHU1RfT0JKRUNUX1VOTE9DSyAoYXZpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJSZXR1cm5pbmcgaW5kZXggJSIgR1NUX1BUUl9GT1JNQVQsIHJlc3VsdCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9hdmlfZGVtdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RBdmlEZW11eCAqYXZpID0gR1NUX0FWSV9ERU1VWCAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGF2aS0+c3RyZWFtaW5nID0gRkFMU0U7CisgICAgICBnc3Rfc2VnbWVudF9pbml0ICgmYXZpLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisgIGlmIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKQorICAgIGdvdG8gZG9uZTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgYXZpLT5oYXZlX2luZGV4ID0gRkFMU0U7CisgICAgICBnc3RfYXZpX2RlbXV4X3Jlc2V0IChhdmkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKK2RvbmU6CisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9nc3QvYXZpL2dzdGF2aWRlbXV4LmggYi9nc3QvYXZpL2dzdGF2aWRlbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlNDZhMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdmkvZ3N0YXZpZGVtdXguaApAQCAtMCwwICsxLDIyMSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gTm9raWEgQ29ycG9yYXRpb24gKGNvbnRhY3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4pCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9BVklfREVNVVhfSF9fCisjZGVmaW5lIF9fR1NUX0FWSV9ERU1VWF9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImF2aS1pZHMuaCIKKyNpbmNsdWRlICJnc3QvcmlmZi9yaWZmLWlkcy5oIgorI2luY2x1ZGUgImdzdC9yaWZmL3JpZmYtcmVhZC5oIgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RmbG93Y29tYmluZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0FWSV9ERU1VWCBcCisgIChnc3RfYXZpX2RlbXV4X2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfQVZJX0RFTVVYKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBHU1RfVFlQRV9BVklfREVNVVgsIEdzdEF2aURlbXV4KSkKKyNkZWZpbmUgR1NUX0FWSV9ERU1VWF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIEdTVF9UWVBFX0FWSV9ERU1VWCwgR3N0QXZpRGVtdXhDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BVklfREVNVVgob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX0FWSV9ERU1VWCkpCisjZGVmaW5lIEdTVF9JU19BVklfREVNVVhfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9BVklfREVNVVgpKQorCisjZGVmaW5lIEdTVF9BVklfREVNVVhfTUFYX1NUUkVBTVMgICAgICAgMTYKKworI2RlZmluZSBDSFVOS0lEX1RPX1NUUkVBTU5SKGNodW5raWQpIFwKKyAgKCgoKGNodW5raWQpICYgMHhmZikgLSAnMCcpICogMTAgKyBcCisgICAoKChjaHVua2lkKSA+PiA4KSAmIDB4ZmYpIC0gJzAnKQorCisKKy8qIG5ldyBpbmRleCBlbnRyaWVzIDI0IGJ5dGVzICovCit0eXBlZGVmIHN0cnVjdCB7CisgIGd1aW50MzIgICAgICAgIGZsYWdzOworICBndWludDMyICAgICAgICBzaXplOyAgICAvKiBieXRlcyBvZiB0aGUgZGF0YSAqLworICBndWludDY0ICAgICAgICBvZmZzZXQ7ICAvKiBkYXRhIG9mZnNldCBpbiBmaWxlICovCisgIGd1aW50NjQgICAgICAgIHRvdGFsOyAgIC8qIHRvdGFsIGJ5dGVzIGJlZm9yZSAqLworfSBHc3RBdmlJbmRleEVudHJ5OworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIGluZGV4IG9mIHRoaXMgc3RyZWFtY29udGV4dCAqLworICBndWludCAgICAgICAgICBudW07CisKKyAgLyogcGFkKi8KKyAgR3N0UGFkICAgICAgICAqcGFkOworICBnYm9vbGVhbiAgICAgICBleHBvc2VkOworCisgIC8qIHN0cmVhbSBpbmZvIGFuZCBoZWFkZXJzICovCisgIGdzdF9yaWZmX3N0cmggKnN0cmg7CisgIHVuaW9uIHsKKyAgICBnc3RfcmlmZl9zdHJmX3ZpZHMgKnZpZHM7CisgICAgZ3N0X3JpZmZfc3RyZl9hdWRzICphdWRzOworICAgIGdzdF9yaWZmX3N0cmZfaWF2cyAqaWF2czsKKyAgICBncG9pbnRlciAgICAgZGF0YTsKKyAgfSBzdHJmOworICBHc3RCdWZmZXIgICAgICpleHRyYWRhdGEsICppbml0ZGF0YTsKKyAgR3N0QnVmZmVyICAgICAqcmdiOF9wYWxldHRlOworICBnY2hhciAgICAgICAgICpuYW1lOworCisgIC8qIHRoZSBzdGFydC9zdGVwL3N0b3AgZW50cmllcyAqLworICBndWludCAgICAgICAgICBzdGFydF9lbnRyeTsKKyAgZ3VpbnQgICAgICAgICAgc3RlcF9lbnRyeTsKKyAgZ3VpbnQgICAgICAgICAgc3RvcF9lbnRyeTsKKworICAvKiBjdXJyZW50IGluZGV4IGVudHJ5ICovCisgIGd1aW50ICAgICAgICAgIGN1cnJlbnRfZW50cnk7CisgIC8qIHBvc2l0aW9uIChieXRlLCBmcmFtZSwgdGltZSkgZm9yIGN1cnJlbnRfZW50cnkgKi8KKyAgZ3VpbnQgICAgICAgICAgY3VycmVudF90b3RhbDsKKyAgR3N0Q2xvY2tUaW1lICAgY3VycmVudF90aW1lc3RhbXA7CisgIEdzdENsb2NrVGltZSAgIGN1cnJlbnRfdHNfZW5kOworICBndWludDY0ICAgICAgICBjdXJyZW50X29mZnNldDsKKyAgZ3VpbnQ2NCAgICAgICAgY3VycmVudF9vZmZzZXRfZW5kOworCisgIGdib29sZWFuICAgICAgIGRpc2NvbnQ7CisKKyAgLyogc3RyZWFtIGxlbmd0aCAqLworICBndWludDY0ICAgICAgICB0b3RhbF9ieXRlczsKKyAgZ3VpbnQzMiAgICAgICAgdG90YWxfYmxvY2tzOworICBndWludCAgICAgICAgICBuX2tleWZyYW1lczsKKyAgLyogc3RyZWFtIGxlbmd0aCBhY2NvcmRpbmcgdG8gaW5kZXggKi8KKyAgR3N0Q2xvY2tUaW1lICAgaWR4X2R1cmF0aW9uOworICAvKiBzdHJlYW0gbGVuZ3RoIGFjY29yZGluZyB0byBoZWFkZXIgKi8KKyAgR3N0Q2xvY2tUaW1lICAgaGRyX2R1cmF0aW9uOworICAvKiBzdHJlYW0gbGVuZ3RoIGJhc2VkIG9uIGhlYWRlci9pbmRleCAqLworICBHc3RDbG9ja1RpbWUgICBkdXJhdGlvbjsKKworICAvKiBWQlIgaW5kaWNhdG9yICovCisgIGdib29sZWFuICAgICAgIGlzX3ZicjsKKworICAvKiBvcGVuRE1MIHN1cHBvcnQgKGZvciBmaWxlcyA+NEdCKSAqLworICBnYm9vbGVhbiAgICAgICBzdXBlcmluZGV4OworICBndWludDY0ICAgICAgICppbmRleGVzOworCisgIC8qIG5ldyBpbmRleGVzICovCisgIEdzdEF2aUluZGV4RW50cnkgKmluZGV4OyAgICAgLyogYXJyYXkgd2l0aCBpbmRleCBlbnRyaWVzICovCisgIGd1aW50ICAgICAgICAgICAgIGlkeF9uOyAgICAgLyogbnVtYmVyIG9mIGVudHJpZXMgKi8KKyAgZ3VpbnQgICAgICAgICAgICAgaWR4X21heDsgICAvKiBtYXggYWxsb2NhdGVkIHNpemUgb2YgZW50cmllcyAqLworCisgIEdzdFRhZ0xpc3QJKnRhZ2xpc3Q7CisKKyAgZ2ludCAgICAgICAgICAgaW5kZXhfaWQ7CisgIGdib29sZWFuIGlzX3JhdzsKKyAgZ3NpemUgYWxpZ25tZW50OworfSBHc3RBdmlTdHJlYW07CisKK3R5cGVkZWYgZW51bSB7CisgIEdTVF9BVklfREVNVVhfU1RBUlQsCisgIEdTVF9BVklfREVNVVhfSEVBREVSLAorICBHU1RfQVZJX0RFTVVYX01PVkksCisgIEdTVF9BVklfREVNVVhfU0VFSywKK30gR3N0QXZpRGVtdXhTdGF0ZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX0FWSV9ERU1VWF9IRUFERVJfVEFHX0xJU1QsCisgIEdTVF9BVklfREVNVVhfSEVBREVSX0FWSUgsCisgIEdTVF9BVklfREVNVVhfSEVBREVSX0VMRU1FTlRTLAorICBHU1RfQVZJX0RFTVVYX0hFQURFUl9JTkZPLAorICBHU1RfQVZJX0RFTVVYX0hFQURFUl9KVU5LLAorICBHU1RfQVZJX0RFTVVYX0hFQURFUl9EQVRBCit9IEdzdEF2aURlbXV4SGVhZGVyU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdmlEZW11eCB7CisgIEdzdEVsZW1lbnQgICAgIHBhcmVudDsKKworICAvKiBwYWRzICovCisgIEdzdFBhZCAgICAgICAgKnNpbmtwYWQ7CisKKyAgLyogQVZJIGRlY29kaW5nIHN0YXRlICovCisgIEdzdEF2aURlbXV4U3RhdGUgc3RhdGU7CisgIEdzdEF2aURlbXV4SGVhZGVyU3RhdGUgaGVhZGVyX3N0YXRlOworICBndWludDY0ICAgICAgICBvZmZzZXQ7CisgIGdib29sZWFuICAgICAgIGFib3J0X2J1ZmZlcmluZzsKKworICAvKiB3aGVuIHdlIGxvYWRlZCB0aGUgaW5kZXhlcyAqLworICBnYm9vbGVhbiAgICAgICBoYXZlX2luZGV4OworICAvKiBpbmRleCBvZmZzZXQgaW4gdGhlIGZpbGUgKi8KKyAgZ3VpbnQ2NCAgICAgICAgaW5kZXhfb2Zmc2V0OworCisgIC8qIHN0cmVhbXMgKi8KKyAgR3N0QXZpU3RyZWFtICAgc3RyZWFtW0dTVF9BVklfREVNVVhfTUFYX1NUUkVBTVNdOworICBndWludCAgICAgICAgICBudW1fc3RyZWFtczsKKyAgZ3VpbnQgICAgICAgICAgbnVtX3Zfc3RyZWFtczsKKyAgZ3VpbnQgICAgICAgICAgbnVtX2Ffc3RyZWFtczsKKyAgZ3VpbnQgICAgICAgICAgbnVtX3Rfc3RyZWFtczsgICAvKiBzdWJ0aXRsZSB0ZXh0IHN0cmVhbXMgKi8KKyAgZ3VpbnQgICAgICAgICAgbnVtX3NwX3N0cmVhbXM7ICAvKiBzdWJwaWN0dXJlIHN0cmVhbXMgKi8KKworICBndWludCAgICAgICAgICBtYWluX3N0cmVhbTsgLyogdXNlZCBmb3Igc2Vla2luZyAqLworCisgIEdzdEZsb3dDb21iaW5lciAqZmxvd2NvbWJpbmVyOworCisgIGdib29sZWFuICAgICAgIGhhdmVfZ3JvdXBfaWQ7CisgIGd1aW50ICAgICAgICAgIGdyb3VwX2lkOworCisgIC8qIGZvciBzdHJlYW1pbmcgbW9kZSAqLworICBnYm9vbGVhbiAgICAgICBzdHJlYW1pbmc7CisgIGdib29sZWFuICAgICAgIGhhdmVfZW9zOworICBHc3RBZGFwdGVyICAgICphZGFwdGVyOworICBndWludCAgICAgICAgICB0b2Ryb3A7CisKKyAgLyogc29tZSBzdHJlYW0gaW5mbyBmb3IgbGVuZ3RoICovCisgIGdzdF9yaWZmX2F2aWggKmF2aWg7CisgIEdzdENsb2NrVGltZSAgIGR1cmF0aW9uOworCisgIC8qIHNlZ21lbnQgaW4gVElNRSAqLworICBHc3RTZWdtZW50ICAgICBzZWdtZW50OworICBndWludDMyICAgICAgICBzZWdtZW50X3NlcW51bTsKKworICAvKiBwZW5kaW5nIHRhZ3MvZXZlbnRzICovCisgIEdzdEV2ZW50ICAgICAgKnNlZ19ldmVudDsKKyAgR3N0VGFnTGlzdAkqZ2xvYmFsdGFnczsKKyAgZ2Jvb2xlYW4JIGdvdF90YWdzOworCisjaWYgMAorICAvKiBnc3QgaW5kZXggc3VwcG9ydCAqLworICBHc3RJbmRleCAgICAgICplbGVtZW50X2luZGV4OworICBnaW50ICAgICAgICAgICBpbmRleF9pZDsKKyNlbmRpZgorCisgIGdib29sZWFuICAgICAgIHNlZWthYmxlOworCisgIGd1aW50NjQgICAgICAgIGZpcnN0X21vdmlfb2Zmc2V0OworICBndWludDY0ICAgICAgICBpZHgxX29mZnNldDsgLyogb2Zmc2V0IGluIGZpbGUgb2YgbGlzdC9jaHVuayBhZnRlciBtb3ZpICovCisgIEdzdEV2ZW50ICAgICAgKnNlZWtfZXZlbnQ7CisKKyAgZ2Jvb2xlYW4gICAgICAgYnVpbGRpbmdfaW5kZXg7CisgIGd1aW50ICAgICAgICAgIG9kbWxfc3RyZWFtOworICBndWludCAgICAgICAgICBvZG1sX3N1YmlkeDsKKyAgZ3VpbnQ2NCAgICAgICAqb2RtbF9zdWJpZHhzOworCisgIGd1aW50NjQgICAgICAgIHNlZWtfa2Zfb2Zmc2V0OyAvKiBvZmZzZXQgb2YgdGhlIGtleWZyYW1lIHRvIHdoaWNoIHdlIHdhbnQgdG8gc2VlayAqLworfSBHc3RBdmlEZW11eDsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF2aURlbXV4Q2xhc3MgeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfSBHc3RBdmlEZW11eENsYXNzOworCitHVHlwZSAgICAgICAgICAgZ3N0X2F2aV9kZW11eF9nZXRfdHlwZSAgICAgICAgICAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9BVklfREVNVVhfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXZpL2dzdGF2aW11eC5jIGIvZ3N0L2F2aS9nc3RhdmltdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTNlZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F2aS9nc3RhdmltdXguYwpAQCAtMCwwICsxLDIzMDMgQEAKKy8qIEFWSSBtdXhlciBwbHVnaW4gZm9yIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqICAgICAgICAgICAoQykgMjAwNiBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qIGJhc2VkIG9uOgorICogLSB0aGUgb2xkIGF2aW11eGVyIChieSBXaW0gVGF5bWFucykKKyAqIC0geGF3dHYncyBhdml3cml0ZXIgKGJ5IEdlcmQgS25vcnIpCisgKiAtIG1qcGVndG9vbHMnIGF2aWxpYiAoYnkgUmFpbmVyIEpvaGFubmkpCisgKiAtIG9wZW5ETUwgbGFyZ2UtQVZJIGRvY3MKKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1hdmltdXgKKyAqCisgKiBNdXhlcyByYXcgb3IgY29tcHJlc3NlZCBhdWRpbyBhbmQvb3IgdmlkZW8gc3RyZWFtcyBpbnRvIGFuIEFWSSBmaWxlLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lczwvdGl0bGU+CisgKiA8cGFyYT4od3JpdGUgZXZlcnl0aGluZyBpbiBvbmUgbGluZSwgd2l0aG91dCB0aGUgYmFja3NsYXNoIGNoYXJhY3RlcnMpPC9wYXJhPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz0yNTAgXAorICogISAndmlkZW8veC1yYXcsZm9ybWF0PShzdHJpbmcpSTQyMCx3aWR0aD0zMjAsaGVpZ2h0PTI0MCxmcmFtZXJhdGU9KGZyYWN0aW9uKTI1LzEnIFwKKyAqICEgcXVldWUgISBtdXguIFwKKyAqIGF1ZGlvdGVzdHNyYyBudW0tYnVmZmVycz00NDAgISBhdWRpb2NvbnZlcnQgXAorICogISAnYXVkaW8veC1yYXcscmF0ZT00NDEwMCxjaGFubmVscz0yJyAhIHF1ZXVlICEgbXV4LiBcCisgKiBhdmltdXggbmFtZT1tdXggISBmaWxlc2luayBsb2NhdGlvbj10ZXN0LmF2aQorICogXXwgVGhpcyB3aWxsIGNyZWF0ZSBhbiAuQVZJIGZpbGUgY29udGFpbmluZyBhbiB1bmNvbXByZXNzZWQgdmlkZW8gc3RyZWFtCisgKiB3aXRoIGEgdGVzdCBwaWN0dXJlIGFuZCBhbiB1bmNvbXByZXNzZWQgYXVkaW8gc3RyZWFtIGNvbnRhaW5pbmcgYQorICogdGVzdCBzb3VuZC4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB2aWRlb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9MjUwIFwKKyAqICEgJ3ZpZGVvL3gtcmF3LGZvcm1hdD0oc3RyaW5nKUk0MjAsd2lkdGg9MzIwLGhlaWdodD0yNDAsZnJhbWVyYXRlPShmcmFjdGlvbikyNS8xJyBcCisgKiAhIHh2aWRlbmMgISBxdWV1ZSAhIG11eC4gXAorICogYXVkaW90ZXN0c3JjIG51bS1idWZmZXJzPTQ0MCAhIGF1ZGlvY29udmVydCAhICdhdWRpby94LXJhdyxyYXRlPTQ0MTAwLGNoYW5uZWxzPTInIFwKKyAqICEgbGFtZSAhIHF1ZXVlICEgbXV4LiBcCisgKiBhdmltdXggbmFtZT1tdXggISBmaWxlc2luayBsb2NhdGlvbj10ZXN0LmF2aQorICogXXwgVGhpcyB3aWxsIGNyZWF0ZSBhbiAuQVZJIGZpbGUgY29udGFpbmluZyB0aGUgc2FtZSB0ZXN0IHZpZGVvIGFuZCBzb3VuZAorICogYXMgYWJvdmUsIG9ubHkgdGhhdCBib3RoIHN0cmVhbXMgd2lsbCBiZSBjb21wcmVzc2VkIHRoaXMgdGltZS4gVGhpcyB3aWxsCisgKiBvbmx5IHdvcmsgaWYgeW91IGhhdmUgdGhlIG5lY2Vzc2FyeSBlbmNvZGVyIGVsZW1lbnRzIGluc3RhbGxlZCBvZiBjb3Vyc2UuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdC9nc3QtaTE4bi1wbHVnaW4uaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXdyaXRlci5oPgorCisjaW5jbHVkZSAiZ3N0YXZpbXV4LmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGF2aW11eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBhdmltdXhfZGVidWcKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQklHRklMRQorfTsKKworI2RlZmluZSBERUZBVUxUX0JJR0ZJTEUgVFJVRQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1tc3ZpZGVvIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgdmlkZW9fc2lua19mYWN0b3J5ID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInZpZGVvXyV1IiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9SRVFVRVNULAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSB7IFlVWTIsIEk0MjAsIEJHUiwgQkdSeCwgQkdSQSwgR1JBWTgsIFVZVlkgfSwgIgorICAgICAgICAid2lkdGggPSAoaW50KSBbIDE2LCA0MDk2IF0sICIKKyAgICAgICAgImhlaWdodCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIgorICAgICAgICAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSBbIDAsIE1BWCBdOyAiCisgICAgICAgICJpbWFnZS9qcGVnLCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIgorICAgICAgICAiaGVpZ2h0ID0gKGludCkgWyAxNiwgNDA5NiBdLCAiCisgICAgICAgICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMCwgTUFYIF07ICIKKyAgICAgICAgInZpZGVvL3gtZGl2eCwgIgorICAgICAgICAid2lkdGggPSAoaW50KSBbIDE2LCA0MDk2IF0sICIKKyAgICAgICAgImhlaWdodCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIgorICAgICAgICAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSBbIDAsIE1BWCBdLCAiCisgICAgICAgICJkaXZ4dmVyc2lvbiA9IChpbnQpIFsgMywgNSBdOyAiCisgICAgICAgICJ2aWRlby94LW1zbXBlZywgIgorICAgICAgICAid2lkdGggPSAoaW50KSBbIDE2LCA0MDk2IF0sICIKKyAgICAgICAgImhlaWdodCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIgorICAgICAgICAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSBbIDAsIE1BWCBdLCAiCisgICAgICAgICJtc21wZWd2ZXJzaW9uID0gKGludCkgWyA0MSwgNDMgXTsgIgorICAgICAgICAidmlkZW8vbXBlZywgIgorICAgICAgICAid2lkdGggPSAoaW50KSBbIDE2LCA0MDk2IF0sICIKKyAgICAgICAgImhlaWdodCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIgorICAgICAgICAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSBbIDAsIE1BWCBdLCAiCisgICAgICAgICJtcGVndmVyc2lvbiA9IChpbnQpIHsgMSwgMiwgNH0sICIKKyAgICAgICAgInN5c3RlbXN0cmVhbSA9IChib29sZWFuKSBGQUxTRTsgIgorICAgICAgICAidmlkZW8veC1oMjYzLCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIgorICAgICAgICAiaGVpZ2h0ID0gKGludCkgWyAxNiwgNDA5NiBdLCAiCisgICAgICAgICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMCwgTUFYIF07ICIKKyAgICAgICAgInZpZGVvL3gtaDI2NCwgIgorICAgICAgICAic3RyZWFtLWZvcm1hdCA9IChzdHJpbmcpIGJ5dGUtc3RyZWFtLCAiCisgICAgICAgICJhbGlnbm1lbnQgPSAoc3RyaW5nKSBhdSwgIgorICAgICAgICAid2lkdGggPSAoaW50KSBbIDE2LCA0MDk2IF0sICIKKyAgICAgICAgImhlaWdodCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIgorICAgICAgICAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSBbIDAsIE1BWCBdOyAiCisgICAgICAgICJ2aWRlby94LWR2LCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIDcyMCwgIgorICAgICAgICAiaGVpZ2h0ID0gKGludCkgeyA1NzYsIDQ4MCB9LCAiCisgICAgICAgICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMCwgTUFYIF0sICIKKyAgICAgICAgInN5c3RlbXN0cmVhbSA9IChib29sZWFuKSBGQUxTRTsgIgorICAgICAgICAidmlkZW8veC1odWZmeXV2LCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIgorICAgICAgICAiaGVpZ2h0ID0gKGludCkgWyAxNiwgNDA5NiBdLCAiICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMCwgTUFYIF07IgorICAgICAgICAidmlkZW8veC13bXYsICIKKyAgICAgICAgIndpZHRoID0gKGludCkgWyAxNiwgNDA5NiBdLCAiCisgICAgICAgICJoZWlnaHQgPSAoaW50KSBbIDE2LCA0MDk2IF0sICIgImZyYW1lcmF0ZSA9IChmcmFjdGlvbikgWyAwLCBNQVggXSwgIgorICAgICAgICAid212dmVyc2lvbiA9IChpbnQpIFsgMSwgM107IgorICAgICAgICAiaW1hZ2UveC1qcGMsICIKKyAgICAgICAgIndpZHRoID0gKGludCkgWyAxLCAyMTQ3NDgzNjQ3IF0sICIKKyAgICAgICAgImhlaWdodCA9IChpbnQpIFsgMSwgMjE0NzQ4MzY0NyBdLCAiCisgICAgICAgICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMCwgTUFYIF07IgorICAgICAgICAidmlkZW8veC12cDgsICIKKyAgICAgICAgIndpZHRoID0gKGludCkgWyAxLCAyMTQ3NDgzNjQ3IF0sICIKKyAgICAgICAgImhlaWdodCA9IChpbnQpIFsgMSwgMjE0NzQ4MzY0NyBdLCAiCisgICAgICAgICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMCwgTUFYIF07IgorICAgICAgICAiaW1hZ2UvcG5nLCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIgorICAgICAgICAiaGVpZ2h0ID0gKGludCkgWyAxNiwgNDA5NiBdLCBmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMCwgTUFYIF0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBhdWRpb19zaW5rX2ZhY3RvcnkgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgiYXVkaW9fJXUiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgVTgsIFMxNkxFIH0sICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEwMDAsIDk2MDAwIF0sICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgWyAxLCAyIF07ICIKKyAgICAgICAgImF1ZGlvL21wZWcsICIKKyAgICAgICAgIm1wZWd2ZXJzaW9uID0gKGludCkgMSwgIgorICAgICAgICAibGF5ZXIgPSAoaW50KSBbIDEsIDMgXSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMTAwMCwgOTYwMDAgXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDIgXTsgIgorICAgICAgICAiYXVkaW8vbXBlZywgIgorICAgICAgICAibXBlZ3ZlcnNpb24gPSAoaW50KSA0LCAiCisgICAgICAgICJzdHJlYW0tZm9ybWF0ID0gKHN0cmluZykgcmF3LCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxMDAwLCA5NjAwMCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdOyAiCisvKiNpZiAwIFZDNiBkb2Vzbid0IHN1cHBvcnQgI2lmIGhlcmUgLi4uCisgICAgICAgICJhdWRpby94LXZvcmJpcywgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMTAwMCwgOTYwMDAgXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDIgXTsgIgorI2VuZGlmKi8KKyAgICAgICAgImF1ZGlvL3gtYWMzLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxMDAwLCA5NjAwMCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgNiBdOyAiCisgICAgICAgICJhdWRpby94LWFsYXcsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEwMDAsIDQ4MDAwIF0sICIgImNoYW5uZWxzID0gKGludCkgWyAxLCAyIF07ICIKKyAgICAgICAgImF1ZGlvL3gtbXVsYXcsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEwMDAsIDQ4MDAwIF0sICIgImNoYW5uZWxzID0gKGludCkgWyAxLCAyIF07ICIKKyAgICAgICAgImF1ZGlvL3gtd21hLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxMDAwLCA5NjAwMCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdLCAiCisgICAgICAgICJ3bWF2ZXJzaW9uID0gKGludCkgWyAxLCAyIF0gIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfYXZpX211eF9wYWRfcmVzZXQgKEdzdEF2aVBhZCAqIGF2aXBhZCwgZ2Jvb2xlYW4gZnJlZSk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9hdmlfbXV4X2NvbGxlY3RfcGFkcyAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLAorICAgIEdzdEF2aU11eCAqIGF2aW11eCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F2aV9tdXhfaGFuZGxlX2V2ZW50IChHc3RDb2xsZWN0UGFkcyAqIHBhZCwKKyAgICBHc3RDb2xsZWN0RGF0YSAqIGRhdGEsIEdzdEV2ZW50ICogZXZlbnQsIGdwb2ludGVyIHVzZXJfZGF0YSk7CitzdGF0aWMgR3N0UGFkICpnc3RfYXZpX211eF9yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsIGNvbnN0IGdjaGFyICogbmFtZSwgY29uc3QgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIHZvaWQgZ3N0X2F2aV9tdXhfcmVsZWFzZV9wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RQYWQgKiBwYWQpOworc3RhdGljIHZvaWQgZ3N0X2F2aV9tdXhfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F2aV9tdXhfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9hdmlfbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKKyNkZWZpbmUgZ3N0X2F2aV9tdXhfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdEF2aU11eCwgZ3N0X2F2aV9tdXgsIEdTVF9UWVBFX0VMRU1FTlQsCisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9UQUdfU0VUVEVSLCBOVUxMKSk7CisKK3N0YXRpYyB2b2lkCitnc3RfYXZpX211eF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0QXZpTXV4ICptdXggPSBHU1RfQVZJX01VWCAob2JqZWN0KTsKKyAgR1NMaXN0ICpub2RlOworCisgIC8qIGNvbXBsZXRlbHkgZnJlZSBlYWNoIHNpbmtwYWQgKi8KKyAgbm9kZSA9IG11eC0+c2lua3BhZHM7CisgIHdoaWxlIChub2RlKSB7CisgICAgR3N0QXZpUGFkICphdmlwYWQgPSAoR3N0QXZpUGFkICopIG5vZGUtPmRhdGE7CisKKyAgICBub2RlID0gbm9kZS0+bmV4dDsKKworICAgIGdzdF9hdmlfbXV4X3BhZF9yZXNldCAoYXZpcGFkLCBUUlVFKTsKKyAgICBnX2ZyZWUgKGF2aXBhZCk7CisgIH0KKyAgZ19zbGlzdF9mcmVlIChtdXgtPnNpbmtwYWRzKTsKKyAgbXV4LT5zaW5rcGFkcyA9IE5VTEw7CisKKyAgZ19mcmVlIChtdXgtPmlkeCk7CisgIG11eC0+aWR4ID0gTlVMTDsKKworICBnc3Rfb2JqZWN0X3VucmVmIChtdXgtPmNvbGxlY3QpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdmlfbXV4X2NsYXNzX2luaXQgKEdzdEF2aU11eENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoYXZpbXV4X2RlYnVnLCAiYXZpbXV4IiwgMCwgIk11eGVyIGZvciBBVkkgc3RyZWFtcyIpOworCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9hdmlfbXV4X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2F2aV9tdXhfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9hdmlfbXV4X2ZpbmFsaXplOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQklHRklMRSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiYmlnZmlsZSIsICJCaWdmaWxlIFN1cHBvcnQgKD4yR0IpIiwKKyAgICAgICAgICAiU3VwcG9ydCBmb3Igb3BlbkRNTC0yLjAgKGJpZykgQVZJIGZpbGVzIiwgREVGQVVMVF9CSUdGSUxFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPnJlcXVlc3RfbmV3X3BhZCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F2aV9tdXhfcmVxdWVzdF9uZXdfcGFkKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cmVsZWFzZV9wYWQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F2aV9tdXhfcmVsZWFzZV9wYWQpOworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F2aV9tdXhfY2hhbmdlX3N0YXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNyY19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmYXVkaW9fc2lua19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmdmlkZW9fc2lua19mYWN0b3J5KTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiQXZpIG11eGVyIiwKKyAgICAgICJDb2RlYy9NdXhlciIsCisgICAgICAiTXV4ZXMgYXVkaW8gYW5kIHZpZGVvIGludG8gYW4gYXZpIHN0cmVhbSIsCisgICAgICAiR1N0cmVhbWVyIG1haW50YWluZXJzIDxnc3RyZWFtZXItZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnPiIpOworfQorCisvKiByZXNldCBwYWQgdG8gaW5pdGlhbCBzdGF0ZQorICogZnJlZSAtIGlmIHRydWUsIHJlbGVhc2UgYWxsLCBub3Qgb25seSBzdHJlYW0gcmVsYXRlZCwgZGF0YSAqLworc3RhdGljIHZvaWQKK2dzdF9hdmlfbXV4X3BhZF9yZXNldCAoR3N0QXZpUGFkICogYXZpcGFkLCBnYm9vbGVhbiBmcmVlKQoreworICAvKiBnZW5lcmljIHBhcnQgKi8KKyAgbWVtc2V0ICgmKGF2aXBhZC0+aGRyKSwgMCwgc2l6ZW9mIChnc3RfcmlmZl9zdHJoKSk7CisKKyAgbWVtc2V0ICgmKGF2aXBhZC0+aWR4WzBdKSwgMCwgc2l6ZW9mIChhdmlwYWQtPmlkeCkpOworCisgIGlmIChmcmVlKSB7CisgICAgZ19mcmVlIChhdmlwYWQtPnRhZyk7CisgICAgYXZpcGFkLT50YWcgPSBOVUxMOworICAgIGdfZnJlZSAoYXZpcGFkLT5pZHhfdGFnKTsKKyAgICBhdmlwYWQtPmlkeF90YWcgPSBOVUxMOworICB9CisKKyAgaWYgKGF2aXBhZC0+aXNfdmlkZW8pIHsKKyAgICBHc3RBdmlWaWRlb1BhZCAqdmlkcGFkID0gKEdzdEF2aVZpZGVvUGFkICopIGF2aXBhZDsKKworICAgIGF2aXBhZC0+aGRyLnR5cGUgPSBHU1RfTUFLRV9GT1VSQ0MgKCd2JywgJ2knLCAnZCcsICdzJyk7CisgICAgaWYgKHZpZHBhZC0+dmlkc19jb2RlY19kYXRhKSB7CisgICAgICBnc3RfYnVmZmVyX3VucmVmICh2aWRwYWQtPnZpZHNfY29kZWNfZGF0YSk7CisgICAgICB2aWRwYWQtPnZpZHNfY29kZWNfZGF0YSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKHZpZHBhZC0+cHJlcGVuZF9idWZmZXIpIHsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHZpZHBhZC0+cHJlcGVuZF9idWZmZXIpOworICAgICAgdmlkcGFkLT5wcmVwZW5kX2J1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgbWVtc2V0ICgmKHZpZHBhZC0+dmlkcyksIDAsIHNpemVvZiAoZ3N0X3JpZmZfc3RyZl92aWRzKSk7CisgICAgbWVtc2V0ICgmKHZpZHBhZC0+dnBycCksIDAsIHNpemVvZiAoZ3N0X3JpZmZfdnBycCkpOworICB9IGVsc2UgeworICAgIEdzdEF2aUF1ZGlvUGFkICphdWRwYWQgPSAoR3N0QXZpQXVkaW9QYWQgKikgYXZpcGFkOworCisgICAgYXVkcGFkLT5zYW1wbGVzID0gMDsKKworICAgIGF2aXBhZC0+aGRyLnR5cGUgPSBHU1RfTUFLRV9GT1VSQ0MgKCdhJywgJ3UnLCAnZCcsICdzJyk7CisgICAgaWYgKGF1ZHBhZC0+YXVkc19jb2RlY19kYXRhKSB7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChhdWRwYWQtPmF1ZHNfY29kZWNfZGF0YSk7CisgICAgICBhdWRwYWQtPmF1ZHNfY29kZWNfZGF0YSA9IE5VTEw7CisgICAgfQorCisgICAgbWVtc2V0ICgmKGF1ZHBhZC0+YXVkcyksIDAsIHNpemVvZiAoZ3N0X3JpZmZfc3RyZl9hdWRzKSk7CisKKyAgICBhdWRwYWQtPmF1ZGlvX3NpemUgPSAwOworICAgIGF1ZHBhZC0+YXVkaW9fdGltZSA9IDA7CisgICAgYXVkcGFkLT5tYXhfYXVkaW9fY2h1bmsgPSAwOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXZpX211eF9yZXNldCAoR3N0QXZpTXV4ICogYXZpbXV4KQoreworICBHU0xpc3QgKm5vZGUsICpuZXdsaXN0ID0gTlVMTDsKKworICAvKiBmcmVlIGFuZCByZXNldCBlYWNoIHNpbmtwYWQgKi8KKyAgbm9kZSA9IGF2aW11eC0+c2lua3BhZHM7CisgIHdoaWxlIChub2RlKSB7CisgICAgR3N0QXZpUGFkICphdmlwYWQgPSAoR3N0QXZpUGFkICopIG5vZGUtPmRhdGE7CisKKyAgICBub2RlID0gbm9kZS0+bmV4dDsKKworICAgIGdzdF9hdmlfbXV4X3BhZF9yZXNldCAoYXZpcGFkLCBGQUxTRSk7CisgICAgLyogaWYgdGhpcyBwYWQgaGFzIGNvbGxlY3RkYXRhLCBrZWVwIGl0LCBvdGhlcndpc2UgZHVtcCBpdCBjb21wbGV0ZWx5ICovCisgICAgaWYgKGF2aXBhZC0+Y29sbGVjdCkKKyAgICAgIG5ld2xpc3QgPSBnX3NsaXN0X2FwcGVuZCAobmV3bGlzdCwgYXZpcGFkKTsKKyAgICBlbHNlIHsKKyAgICAgIGdzdF9hdmlfbXV4X3BhZF9yZXNldCAoYXZpcGFkLCBUUlVFKTsKKyAgICAgIGdfZnJlZSAoYXZpcGFkKTsKKyAgICB9CisgIH0KKworICAvKiBmcmVlIHRoZSBvbGQgbGlzdCBvZiBzaW5rcGFkcywgb25seSBrZWVwIHRoZSByZWFsIGNvbGxlY3Rpbmcgb25lcyAqLworICBnX3NsaXN0X2ZyZWUgKGF2aW11eC0+c2lua3BhZHMpOworICBhdmltdXgtPnNpbmtwYWRzID0gbmV3bGlzdDsKKworICAvKiBhdmkgZGF0YSAqLworICBhdmltdXgtPm51bV9mcmFtZXMgPSAwOworICBtZW1zZXQgKCYoYXZpbXV4LT5hdmlfaGRyKSwgMCwgc2l6ZW9mIChnc3RfcmlmZl9hdmloKSk7CisgIGF2aW11eC0+YXZpX2hkci5tYXhfYnBzID0gMTAwMDAwMDA7CisgIGF2aW11eC0+Y29kZWNfZGF0YV9zaXplID0gMDsKKworICBpZiAoYXZpbXV4LT50YWdzX3NuYXApIHsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKGF2aW11eC0+dGFnc19zbmFwKTsKKyAgICBhdmltdXgtPnRhZ3Nfc25hcCA9IE5VTEw7CisgIH0KKworICBnX2ZyZWUgKGF2aW11eC0+aWR4KTsKKyAgYXZpbXV4LT5pZHggPSBOVUxMOworCisgIC8qIHN0YXRlIGluZm8gKi8KKyAgYXZpbXV4LT53cml0ZV9oZWFkZXIgPSBUUlVFOworCisgIC8qIHRhZ3MgKi8KKyAgZ3N0X3RhZ19zZXR0ZXJfcmVzZXRfdGFncyAoR1NUX1RBR19TRVRURVIgKGF2aW11eCkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9tdXhfaW5pdCAoR3N0QXZpTXV4ICogYXZpbXV4KQoreworICBhdmltdXgtPnNyY3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc3JjX2ZhY3RvcnksICJzcmMiKTsKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoYXZpbXV4LT5zcmNwYWQpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoYXZpbXV4KSwgYXZpbXV4LT5zcmNwYWQpOworCisgIC8qIHByb3BlcnR5ICovCisgIGF2aW11eC0+ZW5hYmxlX2xhcmdlX2F2aSA9IERFRkFVTFRfQklHRklMRTsKKworICBhdmltdXgtPmNvbGxlY3QgPSBnc3RfY29sbGVjdF9wYWRzX25ldyAoKTsKKyAgZ3N0X2NvbGxlY3RfcGFkc19zZXRfZnVuY3Rpb24gKGF2aW11eC0+Y29sbGVjdCwKKyAgICAgIChHc3RDb2xsZWN0UGFkc0Z1bmN0aW9uKSAoR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdmlfbXV4X2NvbGxlY3RfcGFkcykpLAorICAgICAgYXZpbXV4KTsKKyAgZ3N0X2NvbGxlY3RfcGFkc19zZXRfZXZlbnRfZnVuY3Rpb24gKGF2aW11eC0+Y29sbGVjdCwKKyAgICAgIChHc3RDb2xsZWN0UGFkc0V2ZW50RnVuY3Rpb24pIChHU1RfREVCVUdfRlVOQ1BUUgorICAgICAgICAgIChnc3RfYXZpX211eF9oYW5kbGVfZXZlbnQpKSwgYXZpbXV4KTsKKworICAvKiBzZXQgdG8gY2xlYW4gc3RhdGUgKi8KKyAgZ3N0X2F2aV9tdXhfcmVzZXQgKGF2aW11eCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F2aV9tdXhfdmlkc2lua19zZXRfY2FwcyAoR3N0UGFkICogcGFkLCBHc3RDYXBzICogdnNjYXBzKQoreworICBHc3RBdmlNdXggKmF2aW11eDsKKyAgR3N0QXZpVmlkZW9QYWQgKmF2aXBhZDsKKyAgR3N0QXZpQ29sbGVjdERhdGEgKmNvbGxlY3RfcGFkOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgY29uc3QgZ2NoYXIgKm1pbWV0eXBlOworICBjb25zdCBHVmFsdWUgKmZwcywgKnBhcjsKKyAgY29uc3QgR1ZhbHVlICpjb2RlY19kYXRhOworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgcGFyX24sIHBhcl9kOworICBnYm9vbGVhbiBjb2RlY19kYXRhX2luX2hlYWRlcnMgPSBUUlVFOworICBnYm9vbGVhbiB2YWxpZF9jYXBzID0gVFJVRTsKKworICBhdmltdXggPSBHU1RfQVZJX01VWCAoZ3N0X3BhZF9nZXRfcGFyZW50IChwYWQpKTsKKworICAvKiBmaW5kIHN0cmVhbSBkYXRhICovCisgIGNvbGxlY3RfcGFkID0gKEdzdEF2aUNvbGxlY3REYXRhICopIGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgZ19hc3NlcnQgKGNvbGxlY3RfcGFkKTsKKyAgYXZpcGFkID0gKEdzdEF2aVZpZGVvUGFkICopIGNvbGxlY3RfcGFkLT5hdmlwYWQ7CisgIGdfYXNzZXJ0IChhdmlwYWQpOworICBnX2Fzc2VydCAoYXZpcGFkLT5wYXJlbnQuaXNfdmlkZW8pOworICBnX2Fzc2VydCAoYXZpcGFkLT5wYXJlbnQuaGRyLnR5cGUgPT0gR1NUX01BS0VfRk9VUkNDICgndicsICdpJywgJ2QnLCAncycpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChhdmltdXgsICIlczolcywgY2Fwcz0lIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIEdTVF9ERUJVR19QQURfTkFNRSAocGFkKSwgdnNjYXBzKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlICh2c2NhcHMsIDApOworICBtaW1ldHlwZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHN0cnVjdHVyZSk7CisKKyAgLyogZ2xvYmFsICovCisgIGF2aXBhZC0+dmlkcy5zaXplID0gc2l6ZW9mIChnc3RfcmlmZl9zdHJmX3ZpZHMpOworICBhdmlwYWQtPnZpZHMucGxhbmVzID0gMTsKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgIndpZHRoIiwgJndpZHRoKSB8fAorICAgICAgIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICBnb3RvIHJlZnVzZV9jYXBzOworICB9CisKKyAgYXZpcGFkLT52aWRzLndpZHRoID0gd2lkdGg7CisgIGF2aXBhZC0+dmlkcy5oZWlnaHQgPSBoZWlnaHQ7CisKKyAgZnBzID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImZyYW1lcmF0ZSIpOworICBpZiAoZnBzID09IE5VTEwgfHwgIUdTVF9WQUxVRV9IT0xEU19GUkFDVElPTiAoZnBzKSkKKyAgICBnb3RvIHJlZnVzZV9jYXBzOworCisgIGF2aXBhZC0+cGFyZW50Lmhkci5yYXRlID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9udW1lcmF0b3IgKGZwcyk7CisgIGF2aXBhZC0+cGFyZW50Lmhkci5zY2FsZSA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fZGVub21pbmF0b3IgKGZwcyk7CisgIGlmIChhdmlwYWQtPnBhcmVudC5oZHIucmF0ZSA8PSAwIHx8IGF2aXBhZC0+cGFyZW50Lmhkci5zY2FsZSA8PSAwKQorICAgIGdvdG8gcmVmdXNlX2NhcHM7CisKKyAgLyogKHBpeGVsKSBhc3BlY3QgcmF0aW8gZGF0YSwgaWYgYW55ICovCisgIHBhciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJwaXhlbC1hc3BlY3QtcmF0aW8iKTsKKyAgLyogb25seSB1c2UgdmlkZW8gcHJvcGVydGllcyBoZWFkZXIgaWYgdGhlcmUgaXMgbm9uLXRyaXZpYWwgYXNwZWN0IGluZm8gKi8KKyAgaWYgKHBhciAmJiBHU1RfVkFMVUVfSE9MRFNfRlJBQ1RJT04gKHBhcikgJiYKKyAgICAgICgocGFyX24gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX251bWVyYXRvciAocGFyKSkgIT0KKyAgICAgICAgICAocGFyX2QgPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX2Rlbm9taW5hdG9yIChwYXIpKSkpIHsKKyAgICBHVmFsdWUgdG9fcmF0aW8gPSB7IDAsIH07CisgICAgZ3VpbnQgcmF0aW9fbiwgcmF0aW9fZDsKKworICAgIC8qIHNvbWUgZnJhY3Rpb24gdm9vZG9vIHRvIG9idGFpbiBzaW1wbGVzdCBwb3NzaWJsZSByYXRpbyAqLworICAgIGdfdmFsdWVfaW5pdCAoJnRvX3JhdGlvLCBHU1RfVFlQRV9GUkFDVElPTik7CisgICAgZ3N0X3ZhbHVlX3NldF9mcmFjdGlvbiAoJnRvX3JhdGlvLCB3aWR0aCAqIHBhcl9uLCBoZWlnaHQgKiBwYXJfZCk7CisgICAgcmF0aW9fbiA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fbnVtZXJhdG9yICgmdG9fcmF0aW8pOworICAgIHJhdGlvX2QgPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX2Rlbm9taW5hdG9yICgmdG9fcmF0aW8pOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aW11eCwgImdlbmVyYXRpbmcgdnBycCBkYXRhIHdpdGggYXNwZWN0IHJhdGlvICVkLyVkIiwKKyAgICAgICAgcmF0aW9fbiwgcmF0aW9fZCk7CisgICAgLyogc2ltcGx5IGZpbGwgaW4gKi8KKyAgICBhdmlwYWQtPnZwcnAudmVydF9yYXRlID0gYXZpcGFkLT5wYXJlbnQuaGRyLnJhdGUgLyBhdmlwYWQtPnBhcmVudC5oZHIuc2NhbGU7CisgICAgYXZpcGFkLT52cHJwLmhvcl90X3RvdGFsID0gd2lkdGg7CisgICAgYXZpcGFkLT52cHJwLnZlcnRfbGluZXMgPSBoZWlnaHQ7CisgICAgYXZpcGFkLT52cHJwLmFzcGVjdCA9IChyYXRpb19uKSA8PCAxNiB8IChyYXRpb19kICYgMHhmZmZmKTsKKyAgICBhdmlwYWQtPnZwcnAud2lkdGggPSB3aWR0aDsKKyAgICBhdmlwYWQtPnZwcnAuaGVpZ2h0ID0gaGVpZ2h0OworICAgIGF2aXBhZC0+dnBycC5maWVsZHMgPSAxOworICAgIGF2aXBhZC0+dnBycC5maWVsZF9pbmZvWzBdLmNvbXByZXNzZWRfYm1faGVpZ2h0ID0gaGVpZ2h0OworICAgIGF2aXBhZC0+dnBycC5maWVsZF9pbmZvWzBdLmNvbXByZXNzZWRfYm1fd2lkdGggPSB3aWR0aDsKKyAgICBhdmlwYWQtPnZwcnAuZmllbGRfaW5mb1swXS52YWxpZF9ibV9oZWlnaHQgPSBoZWlnaHQ7CisgICAgYXZpcGFkLT52cHJwLmZpZWxkX2luZm9bMF0udmFsaWRfYm1fd2lkdGggPSB3aWR0aDsKKyAgfQorCisgIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtcmF3IikpIHsKKyAgICBjb25zdCBnY2hhciAqZm9ybWF0OworICAgIEdzdFZpZGVvRm9ybWF0IGZtdDsKKworICAgIGZvcm1hdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZm9ybWF0Iik7CisgICAgZm10ID0gZ3N0X3ZpZGVvX2Zvcm1hdF9mcm9tX3N0cmluZyAoZm9ybWF0KTsKKworICAgIHN3aXRjaCAoZm10KSB7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVVZMjoKKyAgICAgICAgYXZpcGFkLT52aWRzLmNvbXByZXNzaW9uID0gR1NUX01BS0VfRk9VUkNDICgnWScsICdVJywgJ1knLCAnMicpOworICAgICAgICBhdmlwYWQtPnZpZHMuYml0X2NudCA9IDE2OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9VWVZZOgorICAgICAgICBhdmlwYWQtPnZpZHMuY29tcHJlc3Npb24gPSBHU1RfTUFLRV9GT1VSQ0MgKCdVJywgJ1knLCAnVicsICdZJyk7CisgICAgICAgIGF2aXBhZC0+dmlkcy5iaXRfY250ID0gMTY7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgICAgIGF2aXBhZC0+dmlkcy5jb21wcmVzc2lvbiA9IEdTVF9NQUtFX0ZPVVJDQyAoJ0knLCAnNCcsICcyJywgJzAnKTsKKyAgICAgICAgYXZpcGFkLT52aWRzLmJpdF9jbnQgPSAxMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfR1JBWTg6CisgICAgICAgIGF2aXBhZC0+dmlkcy5jb21wcmVzc2lvbiA9IEdTVF9NQUtFX0ZPVVJDQyAoJ1knLCAnOCcsICcwJywgJzAnKTsKKyAgICAgICAgYXZpcGFkLT52aWRzLmJpdF9jbnQgPSA4OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1I6CisgICAgICAgIGF2aXBhZC0+dmlkcy5jb21wcmVzc2lvbiA9IEdTVF9NQUtFX0ZPVVJDQyAoMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCk7CisgICAgICAgIGF2aXBhZC0+dmlkcy5iaXRfY250ID0gMjQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUng6CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICAgICAgYXZpcGFkLT52aWRzLmNvbXByZXNzaW9uID0gR1NUX01BS0VfRk9VUkNDICgweDAwLCAweDAwLCAweDAwLCAweDAwKTsKKyAgICAgICAgYXZpcGFkLT52aWRzLmJpdF9jbnQgPSAzMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB2YWxpZF9jYXBzID0gRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBhdmlwYWQtPnZpZHMuYml0X2NudCA9IDI0OworICAgIGF2aXBhZC0+dmlkcy5jb21wcmVzc2lvbiA9IDA7CisKKyAgICAvKiBmaW5kIGZvcm1hdCAqLworICAgIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtaHVmZnl1diIpKSB7CisgICAgICBhdmlwYWQtPnZpZHMuY29tcHJlc3Npb24gPSBHU1RfTUFLRV9GT1VSQ0MgKCdIJywgJ0YnLCAnWScsICdVJyk7CisgICAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImltYWdlL2pwZWciKSkgeworICAgICAgYXZpcGFkLT52aWRzLmNvbXByZXNzaW9uID0gR1NUX01BS0VfRk9VUkNDICgnTScsICdKJywgJ1AnLCAnRycpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LWRpdngiKSkgeworICAgICAgZ2ludCBkaXZ4dmVyc2lvbjsKKworICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJkaXZ4dmVyc2lvbiIsICZkaXZ4dmVyc2lvbik7CisgICAgICBzd2l0Y2ggKGRpdnh2ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICBhdmlwYWQtPnZpZHMuY29tcHJlc3Npb24gPSBHU1RfTUFLRV9GT1VSQ0MgKCdEJywgJ0knLCAnVicsICczJyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICBhdmlwYWQtPnZpZHMuY29tcHJlc3Npb24gPSBHU1RfTUFLRV9GT1VSQ0MgKCdEJywgJ0knLCAnVicsICdYJyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICBhdmlwYWQtPnZpZHMuY29tcHJlc3Npb24gPSBHU1RfTUFLRV9GT1VSQ0MgKCdEJywgJ1gnLCAnNScsICcwJyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdmFsaWRfY2FwcyA9IEZBTFNFOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAoc3RydWN0dXJlLCAidmlkZW8veC1tc21wZWciKSkgeworICAgICAgZ2ludCBtc21wZWd2ZXJzaW9uOworCisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgIm1zbXBlZ3ZlcnNpb24iLCAmbXNtcGVndmVyc2lvbik7CisgICAgICBzd2l0Y2ggKG1zbXBlZ3ZlcnNpb24pIHsKKyAgICAgICAgY2FzZSA0MToKKyAgICAgICAgICBhdmlwYWQtPnZpZHMuY29tcHJlc3Npb24gPSBHU1RfTUFLRV9GT1VSQ0MgKCdNJywgJ1AnLCAnRycsICc0Jyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDI6CisgICAgICAgICAgYXZpcGFkLT52aWRzLmNvbXByZXNzaW9uID0gR1NUX01BS0VfRk9VUkNDICgnTScsICdQJywgJzQnLCAnMicpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQzOgorICAgICAgICAgIGF2aXBhZC0+dmlkcy5jb21wcmVzc2lvbiA9IEdTVF9NQUtFX0ZPVVJDQyAoJ00nLCAnUCcsICc0JywgJzMnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBHU1RfSU5GTyAoInVuaGFuZGxlZCBtc21wZWd2ZXJzaW9uIDogJWQsIGZhbGwgYmFjayB0byBmb3VyY2M9TVBFRyIsCisgICAgICAgICAgICAgIG1zbXBlZ3ZlcnNpb24pOworICAgICAgICAgIGF2aXBhZC0+dmlkcy5jb21wcmVzc2lvbiA9IEdTVF9NQUtFX0ZPVVJDQyAoJ00nLCAnUCcsICdFJywgJ0cnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC1kdiIpKSB7CisgICAgICBhdmlwYWQtPnZpZHMuY29tcHJlc3Npb24gPSBHU1RfTUFLRV9GT1VSQ0MgKCdEJywgJ1YnLCAnUycsICdEJyk7CisgICAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtaDI2MyIpKSB7CisgICAgICBhdmlwYWQtPnZpZHMuY29tcHJlc3Npb24gPSBHU1RfTUFLRV9GT1VSQ0MgKCdIJywgJzInLCAnNicsICczJyk7CisgICAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtaDI2NCIpKSB7CisgICAgICBhdmlwYWQtPnZpZHMuY29tcHJlc3Npb24gPSBHU1RfTUFLRV9GT1VSQ0MgKCdIJywgJzInLCAnNicsICc0Jyk7CisgICAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL21wZWciKSkgeworICAgICAgZ2ludCBtcGVndmVyc2lvbjsKKworICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJtcGVndmVyc2lvbiIsICZtcGVndmVyc2lvbik7CisKKyAgICAgIHN3aXRjaCAobXBlZ3ZlcnNpb24pIHsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIGF2aXBhZC0+dmlkcy5jb21wcmVzc2lvbiA9IEdTVF9NQUtFX0ZPVVJDQyAoJ00nLCAnUCcsICdHJywgJzInKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgIC8qIG1wbGF5ZXIvZmZtcGVnIG1pZ2h0IG5vdCB3b3JrIHdpdGggRElWWCwgYnV0IHdpdGggRk1QNCAqLworICAgICAgICAgIGF2aXBhZC0+dmlkcy5jb21wcmVzc2lvbiA9IEdTVF9NQUtFX0ZPVVJDQyAoJ0QnLCAnSScsICdWJywgJ1gnKTsKKworICAgICAgICAgIC8qIERJVlgvWFZJRCBpbiBBVkkgc3RvcmUgdGhlIGNvZGVjX2RhdGEgY2h1bmsgYXMgcGFydCBvZiB0aGUKKyAgICAgICAgICAgICBmaXJzdCBkYXRhIGJ1ZmZlci4gU28gZm9yIHRoaXMgY2FzZSwgd2UgcHJlcGVuZCB0aGUgY29kZWNfZGF0YQorICAgICAgICAgICAgIGJsb2IgKGlmIGFueSkgdG8gdGhhdCBmaXJzdCBidWZmZXIgKi8KKyAgICAgICAgICBjb2RlY19kYXRhX2luX2hlYWRlcnMgPSBGQUxTRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBHU1RfSU5GTyAoInVuaGFuZGxlZCBtcGVndmVyc2lvbiA6ICVkLCBmYWxsIGJhY2sgdG8gZm91cmNjPU1QRUciLAorICAgICAgICAgICAgICBtcGVndmVyc2lvbik7CisgICAgICAgICAgYXZpcGFkLT52aWRzLmNvbXByZXNzaW9uID0gR1NUX01BS0VfRk9VUkNDICgnTScsICdQJywgJ0UnLCAnRycpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LXdtdiIpKSB7CisgICAgICBnaW50IHdtdnZlcnNpb247CisKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgIndtdnZlcnNpb24iLCAmd212dmVyc2lvbikpIHsKKyAgICAgICAgc3dpdGNoICh3bXZ2ZXJzaW9uKSB7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgYXZpcGFkLT52aWRzLmNvbXByZXNzaW9uID0gR1NUX01BS0VfRk9VUkNDICgnVycsICdNJywgJ1YnLCAnMScpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgYXZpcGFkLT52aWRzLmNvbXByZXNzaW9uID0gR1NUX01BS0VfRk9VUkNDICgnVycsICdNJywgJ1YnLCAnMicpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgYXZpcGFkLT52aWRzLmNvbXByZXNzaW9uID0gR1NUX01BS0VfRk9VUkNDICgnVycsICdNJywgJ1YnLCAnMycpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHZhbGlkX2NhcHMgPSBGQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImltYWdlL3gtanBjIikpIHsKKyAgICAgIGF2aXBhZC0+dmlkcy5jb21wcmVzc2lvbiA9IEdTVF9NQUtFX0ZPVVJDQyAoJ00nLCAnSicsICcyJywgJ0MnKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC12cDgiKSkgeworICAgICAgYXZpcGFkLT52aWRzLmNvbXByZXNzaW9uID0gR1NUX01BS0VfRk9VUkNDICgnVicsICdQJywgJzgnLCAnMCcpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJpbWFnZS9wbmciKSkgeworICAgICAgYXZpcGFkLT52aWRzLmNvbXByZXNzaW9uID0gR1NUX01BS0VfRk9VUkNDICgncCcsICduJywgJ2cnLCAnICcpOworICAgIH0gZWxzZSB7CisgICAgICB2YWxpZF9jYXBzID0gRkFMU0U7CisgICAgfQorCisgICAgaWYgKCF2YWxpZF9jYXBzKQorICAgICAgZ290byByZWZ1c2VfY2FwczsKKyAgfQorCisgIC8qIGNvZGVjIGluaXRpYWxpemF0aW9uIGRhdGEsIGlmIGFueSAqLworICBjb2RlY19kYXRhID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImNvZGVjX2RhdGEiKTsKKyAgaWYgKGNvZGVjX2RhdGEpIHsKKyAgICBpZiAoY29kZWNfZGF0YV9pbl9oZWFkZXJzKSB7CisgICAgICBhdmlwYWQtPnZpZHNfY29kZWNfZGF0YSA9IGdzdF92YWx1ZV9nZXRfYnVmZmVyIChjb2RlY19kYXRhKTsKKyAgICAgIGdzdF9idWZmZXJfcmVmIChhdmlwYWQtPnZpZHNfY29kZWNfZGF0YSk7CisgICAgICAvKiBrZWVwIGdsb2JhbCB0cmFjayBvZiBzaXplICovCisgICAgICBhdmltdXgtPmNvZGVjX2RhdGFfc2l6ZSArPSBnc3RfYnVmZmVyX2dldF9zaXplIChhdmlwYWQtPnZpZHNfY29kZWNfZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGF2aXBhZC0+cHJlcGVuZF9idWZmZXIgPQorICAgICAgICAgIGdzdF9idWZmZXJfcmVmIChnc3RfdmFsdWVfZ2V0X2J1ZmZlciAoY29kZWNfZGF0YSkpOworICAgIH0KKyAgfQorCisgIGF2aXBhZC0+cGFyZW50Lmhkci5mY2NfaGFuZGxlciA9IGF2aXBhZC0+dmlkcy5jb21wcmVzc2lvbjsKKyAgYXZpcGFkLT52aWRzLmltYWdlX3NpemUgPSBhdmlwYWQtPnZpZHMuaGVpZ2h0ICogYXZpcGFkLT52aWRzLndpZHRoOworICAvKiBobSwgbWF5YmUgd2h5IGF2aSBvbmx5IGhhbmRsZXMgb25lIHN0cmVhbSB3ZWxsIC4uLiAqLworICBhdmltdXgtPmF2aV9oZHIud2lkdGggPSBhdmlwYWQtPnZpZHMud2lkdGg7CisgIGF2aW11eC0+YXZpX2hkci5oZWlnaHQgPSBhdmlwYWQtPnZpZHMuaGVpZ2h0OworICBhdmltdXgtPmF2aV9oZHIudXNfZnJhbWUgPSAxMDAwMDAwLiAqIGF2aXBhZC0+cGFyZW50Lmhkci5zY2FsZSAvCisgICAgICBhdmlwYWQtPnBhcmVudC5oZHIucmF0ZTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChhdmltdXgpOworICByZXR1cm4gVFJVRTsKKworcmVmdXNlX2NhcHM6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aW11eCwgInJlZnVzZWQgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgdnNjYXBzKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChhdmltdXgpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBnc3RfYXZpX211eF9hdWRzaW5rX3NldF9maWVsZHMgKEdzdEF2aU11eCAqIGF2aW11eCwKKyAgICBHc3RBdmlBdWRpb1BhZCAqIGF2aXBhZCk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYXZpX211eF9hdWRzaW5rX3NjYW5fbXBlZ19hdWRpbyAoR3N0QXZpTXV4ICogYXZpbXV4LCBHc3RBdmlQYWQgKiBhdmlwYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQgc3BmOworICBndWludDMyIGhlYWRlcjsKKyAgZ3Vsb25nIGxheWVyOworICBndWxvbmcgdmVyc2lvbjsKKyAgZ2ludCBsc2YsIG1wZzI1OworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGlmIChtYXAuc2l6ZSA8IDQpCisgICAgZ290byBub3RfcGFyc2VkOworCisgIGhlYWRlciA9IEdTVF9SRUFEX1VJTlQzMl9CRSAobWFwLmRhdGEpOworCisgIGlmICgoaGVhZGVyICYgMHhmZmUwMDAwMCkgIT0gMHhmZmUwMDAwMCkKKyAgICBnb3RvIG5vdF9wYXJzZWQ7CisKKyAgLyogdGhhbmtzIGdvIHRvIG1wM3BhcnNlICovCisgIGlmIChoZWFkZXIgJiAoMSA8PCAyMCkpIHsKKyAgICBsc2YgPSAoaGVhZGVyICYgKDEgPDwgMTkpKSA/IDAgOiAxOworICAgIG1wZzI1ID0gMDsKKyAgfSBlbHNlIHsKKyAgICBsc2YgPSAxOworICAgIG1wZzI1ID0gMTsKKyAgfQorCisgIHZlcnNpb24gPSAxICsgbHNmICsgbXBnMjU7CisgIGxheWVyID0gNCAtICgoaGVhZGVyID4+IDE3KSAmIDB4Myk7CisKKyAgLyogc2VlIGh0dHA6Ly93d3cuY29kZXByb2plY3QuY29tL2F1ZGlvL01QRUdBdWRpb0luZm8uYXNwICovCisgIGlmIChsYXllciA9PSAxKQorICAgIHNwZiA9IDM4NDsKKyAgZWxzZSBpZiAobGF5ZXIgPT0gMikKKyAgICBzcGYgPSAxMTUyOworICBlbHNlIGlmICh2ZXJzaW9uID09IDEpIHsKKyAgICBzcGYgPSAxMTUyOworICB9IGVsc2UgeworICAgIC8qIE1QRUctMiBvciAiMi41IiAqLworICAgIHNwZiA9IDU3NjsKKyAgfQorCisgIGlmIChHX1VOTElLRUxZIChhdmlwYWQtPmhkci5zY2FsZSA8PSAxKSkgeworICAgIGF2aXBhZC0+aGRyLnNjYWxlID0gc3BmOworICAgIGdzdF9hdmlfbXV4X2F1ZHNpbmtfc2V0X2ZpZWxkcyAoYXZpbXV4LCAoR3N0QXZpQXVkaW9QYWQgKikgYXZpcGFkKTsKKyAgfSBlbHNlIGlmIChHX1VOTElLRUxZIChhdmlwYWQtPmhkci5zY2FsZSAhPSBzcGYpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmltdXgsICJpbnB1dCBtcGVnIGF1ZGlvIGhhcyB2YXJ5aW5nIGZyYW1lIHNpemUiKTsKKyAgICBnb3RvIGNicl9mYWxsYmFjazsKKyAgfQorZG9uZToKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVhJVFMgKi8KK25vdF9wYXJzZWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aW11eCwgImlucHV0IG1wZWcgYXVkaW8gaXMgbm90IHBhcnNlZCIpOworICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICB9CitjYnJfZmFsbGJhY2s6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aW11eCwgImZhbGxpbmcgYmFjayB0byBDQlIgbXV4aW5nIik7CisgICAgYXZpcGFkLT5oZHIuc2NhbGUgPSAxOworICAgIGdzdF9hdmlfbXV4X2F1ZHNpbmtfc2V0X2ZpZWxkcyAoYXZpbXV4LCAoR3N0QXZpQXVkaW9QYWQgKikgYXZpcGFkKTsKKyAgICAvKiBubyBuZWVkIHRvIGNoZWNrIGZ1cnRoZXIgKi8KKyAgICBhdmlwYWQtPmhvb2sgPSBOVUxMOworICAgIGdvdG8gZG9uZTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9tdXhfYXVkc2lua19zZXRfZmllbGRzIChHc3RBdmlNdXggKiBhdmltdXgsIEdzdEF2aUF1ZGlvUGFkICogYXZpcGFkKQoreworICBpZiAoYXZpcGFkLT5wYXJlbnQuaGRyLnNjYWxlID4gMSkgeworICAgIC8qIHZiciBjYXNlOiBmaXhlZCBkdXJhdGlvbiBwZXIgZnJhbWUvY2h1bmsgKi8KKyAgICBhdmlwYWQtPnBhcmVudC5oZHIucmF0ZSA9IGF2aXBhZC0+YXVkcy5yYXRlOworICAgIGF2aXBhZC0+cGFyZW50Lmhkci5zYW1wbGVzaXplID0gMDsKKyAgICAvKiB0aGlzIHRyaWdnZXJzIGRldGVybWluaW5nIGxhcmdlc3QgYXVkaW8gY2h1bmsgc2l6ZSB0byB3cml0ZSBhdCBlbmQgKi8KKyAgICBhdmlwYWQtPm1heF9hdWRpb19jaHVuayA9IGF2aXBhZC0+YXVkcy5ibG9ja2FsaWduID0KKyAgICAgICAgYXZpcGFkLT5wYXJlbnQuaGRyLnNjYWxlOworICB9IGVsc2UgeworICAgIC8qIGJ5IHNwZWMsIGhkci5yYXRlIGlzIGF2X2JwcyByZWxhdGVkLCBpcyBjYWxjdWxhdGVkIHRoYXQgd2F5IGluIHN0b3BfZmlsZSwKKyAgICAgKiBhbmQgcmVkdWNlcyB0byBzYW1wbGUgcmF0ZSBpbiBQQ00gbGlrZSBjYXNlcyAqLworICAgIGF2aXBhZC0+cGFyZW50Lmhkci5yYXRlID0gYXZpcGFkLT5hdWRzLmF2X2JwcyAvIGF2aXBhZC0+YXVkcy5ibG9ja2FsaWduOworICAgIGF2aXBhZC0+cGFyZW50Lmhkci5zYW1wbGVzaXplID0gYXZpcGFkLT5hdWRzLmJsb2NrYWxpZ247CisgICAgYXZpcGFkLT5wYXJlbnQuaGRyLnNjYWxlID0gMTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdmlfbXV4X2F1ZHNpbmtfc2V0X2NhcHMgKEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIHZzY2FwcykKK3sKKyAgR3N0QXZpTXV4ICphdmltdXg7CisgIEdzdEF2aUF1ZGlvUGFkICphdmlwYWQ7CisgIEdzdEF2aUNvbGxlY3REYXRhICpjb2xsZWN0X3BhZDsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGNvbnN0IGdjaGFyICptaW1ldHlwZTsKKyAgY29uc3QgR1ZhbHVlICpjb2RlY19kYXRhOworICBnaW50IGNoYW5uZWxzLCByYXRlOworCisgIGF2aW11eCA9IEdTVF9BVklfTVVYIChnc3RfcGFkX2dldF9wYXJlbnQgKHBhZCkpOworCisgIC8qIGZpbmQgc3RyZWFtIGRhdGEgKi8KKyAgY29sbGVjdF9wYWQgPSAoR3N0QXZpQ29sbGVjdERhdGEgKikgZ3N0X3BhZF9nZXRfZWxlbWVudF9wcml2YXRlIChwYWQpOworICBnX2Fzc2VydCAoY29sbGVjdF9wYWQpOworICBhdmlwYWQgPSAoR3N0QXZpQXVkaW9QYWQgKikgY29sbGVjdF9wYWQtPmF2aXBhZDsKKyAgZ19hc3NlcnQgKGF2aXBhZCk7CisgIGdfYXNzZXJ0ICghYXZpcGFkLT5wYXJlbnQuaXNfdmlkZW8pOworICBnX2Fzc2VydCAoYXZpcGFkLT5wYXJlbnQuaGRyLnR5cGUgPT0gR1NUX01BS0VfRk9VUkNDICgnYScsICd1JywgJ2QnLCAncycpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChhdmltdXgsICIlczolcywgY2Fwcz0lIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIEdTVF9ERUJVR19QQURfTkFNRSAocGFkKSwgdnNjYXBzKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlICh2c2NhcHMsIDApOworICBtaW1ldHlwZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHN0cnVjdHVyZSk7CisKKyAgLyogd2Ugd2FudCB0aGVzZSBmb3IgYWxsICovCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsICZjaGFubmVscykgfHwKKyAgICAgICFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgInJhdGUiLCAmcmF0ZSkpIHsKKyAgICBnb3RvIHJlZnVzZV9jYXBzOworICB9CisKKyAgYXZpcGFkLT5hdWRzLmNoYW5uZWxzID0gY2hhbm5lbHM7CisgIGF2aXBhZC0+YXVkcy5yYXRlID0gcmF0ZTsKKworICAvKiBjb2RlYyBpbml0aWFsaXphdGlvbiBkYXRhLCBpZiBhbnkgKi8KKyAgY29kZWNfZGF0YSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJjb2RlY19kYXRhIik7CisgIGlmIChjb2RlY19kYXRhKSB7CisgICAgYXZpcGFkLT5hdWRzX2NvZGVjX2RhdGEgPSBnc3RfdmFsdWVfZ2V0X2J1ZmZlciAoY29kZWNfZGF0YSk7CisgICAgZ3N0X2J1ZmZlcl9yZWYgKGF2aXBhZC0+YXVkc19jb2RlY19kYXRhKTsKKyAgICAvKiBrZWVwIGdsb2JhbCB0cmFjayBvZiBzaXplICovCisgICAgYXZpbXV4LT5jb2RlY19kYXRhX3NpemUgKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYXZpcGFkLT5hdWRzX2NvZGVjX2RhdGEpOworICB9CisKKyAgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1yYXciKSkgeworICAgIGNvbnN0IGdjaGFyICpmb3JtYXQ7CisgICAgR3N0QXVkaW9Gb3JtYXQgZm10OworCisgICAgZm9ybWF0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJmb3JtYXQiKTsKKyAgICBmbXQgPSBnc3RfYXVkaW9fZm9ybWF0X2Zyb21fc3RyaW5nIChmb3JtYXQpOworCisgICAgc3dpdGNoIChmbXQpIHsKKyAgICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9VODoKKyAgICAgICAgYXZpcGFkLT5hdWRzLmJsb2NrYWxpZ24gPSA4OworICAgICAgICBhdmlwYWQtPmF1ZHMuYml0c19wZXJfc2FtcGxlID0gODsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzE2OgorICAgICAgICBhdmlwYWQtPmF1ZHMuYmxvY2thbGlnbiA9IDE2OworICAgICAgICBhdmlwYWQtPmF1ZHMuYml0c19wZXJfc2FtcGxlID0gMTY7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byByZWZ1c2VfY2FwczsKKyAgICB9CisKKyAgICBhdmlwYWQtPmF1ZHMuZm9ybWF0ID0gR1NUX1JJRkZfV0FWRV9GT1JNQVRfUENNOworICAgIC8qIHNldCBzb21lIG1vcmUgaW5mbyBzdHJhaWdodCAqLworICAgIGF2aXBhZC0+YXVkcy5ibG9ja2FsaWduIC89IDg7CisgICAgYXZpcGFkLT5hdWRzLmJsb2NrYWxpZ24gKj0gYXZpcGFkLT5hdWRzLmNoYW5uZWxzOworICAgIGF2aXBhZC0+YXVkcy5hdl9icHMgPSBhdmlwYWQtPmF1ZHMuYmxvY2thbGlnbiAqIGF2aXBhZC0+YXVkcy5yYXRlOworICB9IGVsc2UgeworICAgIGF2aXBhZC0+YXVkcy5mb3JtYXQgPSAwOworICAgIC8qIHNldCBzb21lIGRlZmF1bHRzICovCisgICAgYXZpcGFkLT5hdWRzLmJsb2NrYWxpZ24gPSAxOworICAgIGF2aXBhZC0+YXVkcy5hdl9icHMgPSAwOworICAgIGF2aXBhZC0+YXVkcy5iaXRzX3Blcl9zYW1wbGUgPSAxNjsKKworICAgIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL21wZWciKSkgeworICAgICAgZ2ludCBtcGVndmVyc2lvbjsKKworICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJtcGVndmVyc2lvbiIsICZtcGVndmVyc2lvbik7CisgICAgICBzd2l0Y2ggKG1wZWd2ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMTp7CisgICAgICAgICAgZ2ludCBsYXllciA9IDM7CisgICAgICAgICAgZ2Jvb2xlYW4gcGFyc2VkID0gRkFMU0U7CisKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImxheWVyIiwgJmxheWVyKTsKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9ib29sZWFuIChzdHJ1Y3R1cmUsICJwYXJzZWQiLCAmcGFyc2VkKTsKKyAgICAgICAgICBzd2l0Y2ggKGxheWVyKSB7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgIGF2aXBhZC0+YXVkcy5mb3JtYXQgPSBHU1RfUklGRl9XQVZFX0ZPUk1BVF9NUEVHTDM7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICBhdmlwYWQtPmF1ZHMuZm9ybWF0ID0gR1NUX1JJRkZfV0FWRV9GT1JNQVRfTVBFR0wxMjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChwYXJzZWQpIHsKKyAgICAgICAgICAgIC8qIHRyZWF0IGFzIFZCUiwgc2hvdWxkIGFsc28gY292ZXIgQ0JSIGNhc2U7CisgICAgICAgICAgICAgKiBzZXR1cCBob29rIHRvIHBhcnNlIGZyYW1lIGhlYWRlciBhbmQgZGV0ZXJtaW5lIHNwZiAqLworICAgICAgICAgICAgYXZpcGFkLT5wYXJlbnQuaG9vayA9IGdzdF9hdmlfbXV4X2F1ZHNpbmtfc2Nhbl9tcGVnX2F1ZGlvOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aW11eCwgInVucGFyc2VkIE1QRUcgYXVkaW8gaW5wdXQgKD8pLCAiCisgICAgICAgICAgICAgICAgImRvaW5nIENCUiBtdXhpbmciKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSA0OgorICAgICAgICB7CisgICAgICAgICAgR3N0QnVmZmVyICpjb2RlY19kYXRhX2J1ZiA9IGF2aXBhZC0+YXVkc19jb2RlY19kYXRhOworICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHJlYW1fZm9ybWF0OworICAgICAgICAgIGd1aW50IGNvZGVjOworICAgICAgICAgIGd1aW50OCBkYXRhWzJdOworCisgICAgICAgICAgc3RyZWFtX2Zvcm1hdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAic3RyZWFtLWZvcm1hdCIpOworICAgICAgICAgIGlmIChzdHJlYW1fZm9ybWF0KSB7CisgICAgICAgICAgICBpZiAoc3RyY21wIChzdHJlYW1fZm9ybWF0LCAicmF3IikgIT0gMCkgeworICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aW11eCwgIkFBQydzIHN0cmVhbSBmb3JtYXQgJyVzJyBpcyBub3QgIgorICAgICAgICAgICAgICAgICAgInN1cHBvcnRlZCwgcGxlYXNlIHVzZSAncmF3JyIsIHN0cmVhbV9mb3JtYXQpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmltdXgsICJBQUMncyBzdHJlYW0tZm9ybWF0IG5vdCBzcGVjaWZpZWQsICIKKyAgICAgICAgICAgICAgICAiYXNzdW1pbmcgJ3JhdyciKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiB2YnIgY2FzZSBuZWVkcyBzb21lIHNwZWNpYWwgaGFuZGxpbmcgKi8KKyAgICAgICAgICBpZiAoIWNvZGVjX2RhdGFfYnVmIHx8IGdzdF9idWZmZXJfZ2V0X3NpemUgKGNvZGVjX2RhdGFfYnVmKSA8IDIpIHsKKyAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpbXV4LCAibm8gKHZhbGlkKSBjb2RlY19kYXRhIGZvciBBQUMgYXVkaW8iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBhdmlwYWQtPmF1ZHMuZm9ybWF0ID0gR1NUX1JJRkZfV0FWRV9GT1JNQVRfQUFDOworICAgICAgICAgIC8qIG5lZWQgdG8gZGV0ZXJtaW5lIGZyYW1lIGxlbmd0aCAqLworICAgICAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoY29kZWNfZGF0YV9idWYsIDAsIGRhdGEsIDIpOworICAgICAgICAgIGNvZGVjID0gR1NUX1JFQURfVUlOVDE2X0JFIChkYXRhKTsKKyAgICAgICAgICBhdmlwYWQtPnBhcmVudC5oZHIuc2NhbGUgPSAoY29kZWMgJiAweDQpID8gOTYwIDogMTAyNDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJhdWRpby94LXZvcmJpcyIpKSB7CisgICAgICBhdmlwYWQtPmF1ZHMuZm9ybWF0ID0gR1NUX1JJRkZfV0FWRV9GT1JNQVRfVk9SQklTMzsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1hYzMiKSkgeworICAgICAgYXZpcGFkLT5hdWRzLmZvcm1hdCA9IEdTVF9SSUZGX1dBVkVfRk9STUFUX0E1MjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1hbGF3IikpIHsKKyAgICAgIGF2aXBhZC0+YXVkcy5mb3JtYXQgPSBHU1RfUklGRl9XQVZFX0ZPUk1BVF9BTEFXOworICAgICAgYXZpcGFkLT5hdWRzLmJpdHNfcGVyX3NhbXBsZSA9IDg7CisgICAgICBhdmlwYWQtPmF1ZHMuYmxvY2thbGlnbiA9IGF2aXBhZC0+YXVkcy5jaGFubmVsczsKKyAgICAgIGF2aXBhZC0+YXVkcy5hdl9icHMgPSBhdmlwYWQtPmF1ZHMuYmxvY2thbGlnbiAqIGF2aXBhZC0+YXVkcy5yYXRlOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJhdWRpby94LW11bGF3IikpIHsKKyAgICAgIGF2aXBhZC0+YXVkcy5mb3JtYXQgPSBHU1RfUklGRl9XQVZFX0ZPUk1BVF9NVUxBVzsKKyAgICAgIGF2aXBhZC0+YXVkcy5iaXRzX3Blcl9zYW1wbGUgPSA4OworICAgICAgYXZpcGFkLT5hdWRzLmJsb2NrYWxpZ24gPSBhdmlwYWQtPmF1ZHMuY2hhbm5lbHM7CisgICAgICBhdmlwYWQtPmF1ZHMuYXZfYnBzID0gYXZpcGFkLT5hdWRzLmJsb2NrYWxpZ24gKiBhdmlwYWQtPmF1ZHMucmF0ZTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC13bWEiKSkgeworICAgICAgZ2ludCB2ZXJzaW9uOworICAgICAgZ2ludCBiaXRyYXRlOworICAgICAgZ2ludCBibG9ja19hbGlnbjsKKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAid21hdmVyc2lvbiIsICZ2ZXJzaW9uKSkgeworICAgICAgICBzd2l0Y2ggKHZlcnNpb24pIHsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBhdmlwYWQtPmF1ZHMuZm9ybWF0ID0gR1NUX1JJRkZfV0FWRV9GT1JNQVRfV01BVjE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBhdmlwYWQtPmF1ZHMuZm9ybWF0ID0gR1NUX1JJRkZfV0FWRV9GT1JNQVRfV01BVjI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGF2aXBhZC0+YXVkcy5mb3JtYXQgIT0gMCkgeworICAgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJibG9ja19hbGlnbiIsICZibG9ja19hbGlnbikpIHsKKyAgICAgICAgICBhdmlwYWQtPmF1ZHMuYmxvY2thbGlnbiA9IGJsb2NrX2FsaWduOworICAgICAgICB9CisgICAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImJpdHJhdGUiLCAmYml0cmF0ZSkpIHsKKyAgICAgICAgICBhdmlwYWQtPmF1ZHMuYXZfYnBzID0gYml0cmF0ZSAvIDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoIWF2aXBhZC0+YXVkcy5mb3JtYXQpCisgICAgZ290byByZWZ1c2VfY2FwczsKKworICBhdmlwYWQtPnBhcmVudC5oZHIuZmNjX2hhbmRsZXIgPSBhdmlwYWQtPmF1ZHMuZm9ybWF0OworICBnc3RfYXZpX211eF9hdWRzaW5rX3NldF9maWVsZHMgKGF2aW11eCwgYXZpcGFkKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChhdmltdXgpOworICByZXR1cm4gVFJVRTsKKworcmVmdXNlX2NhcHM6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aW11eCwgInJlZnVzZWQgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgdnNjYXBzKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChhdmltdXgpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisKK3N0YXRpYyBHc3RQYWQgKgorZ3N0X2F2aV9tdXhfcmVxdWVzdF9uZXdfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLCBjb25zdCBnY2hhciAqIHJlcV9uYW1lLCBjb25zdCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0QXZpTXV4ICphdmltdXg7CisgIEdzdFBhZCAqbmV3cGFkOworICBHc3RBdmlQYWQgKmF2aXBhZDsKKyAgR3N0RWxlbWVudENsYXNzICprbGFzczsKKyAgZ2NoYXIgKm5hbWUgPSBOVUxMOworICBjb25zdCBnY2hhciAqcGFkX25hbWUgPSBOVUxMOworICBnaW50IHBhZF9pZDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAodGVtcGwgIT0gTlVMTCwgTlVMTCk7CisKKyAgaWYgKHRlbXBsLT5kaXJlY3Rpb24gIT0gR1NUX1BBRF9TSU5LKQorICAgIGdvdG8gd3JvbmdfZGlyZWN0aW9uOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfQVZJX01VWCAoZWxlbWVudCksIE5VTEwpOworICBhdmltdXggPSBHU1RfQVZJX01VWCAoZWxlbWVudCk7CisKKyAgaWYgKCFhdmltdXgtPndyaXRlX2hlYWRlcikKKyAgICBnb3RvIHRvb19sYXRlOworCisgIGtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChlbGVtZW50KTsKKworICBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJhdWRpb18ldSIpKSB7CisgICAgLyogZG9uJ3QgbWl4IG5hbWVkIGFuZCB1bm5hbWVkIHBhZHMsIGlmIHRoZSBwYWQgYWxyZWFkeSBleGlzdHMgd2UgZmFpbCB3aGVuCisgICAgICogdHJ5aW5nIHRvIGFkZCBpdCAqLworICAgIGlmIChyZXFfbmFtZSAhPSBOVUxMICYmIHNzY2FuZiAocmVxX25hbWUsICJhdWRpb18ldSIsICZwYWRfaWQpID09IDEpIHsKKyAgICAgIHBhZF9uYW1lID0gcmVxX25hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJhdWRpb18ldSIsIGF2aW11eC0+YXVkaW9fcGFkcysrKTsKKyAgICAgIHBhZF9uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKiBpbml0IHBhZCBzcGVjaWZpYyBkYXRhICovCisgICAgYXZpcGFkID0gZ19tYWxsb2MwIChzaXplb2YgKEdzdEF2aUF1ZGlvUGFkKSk7CisgICAgYXZpcGFkLT5pc192aWRlbyA9IEZBTFNFOworICAgIGF2aXBhZC0+aGRyLnR5cGUgPSBHU1RfTUFLRV9GT1VSQ0MgKCdhJywgJ3UnLCAnZCcsICdzJyk7CisgICAgLyogYXVkaW8gZ29lcyBsYXN0ICovCisgICAgYXZpbXV4LT5zaW5rcGFkcyA9IGdfc2xpc3RfYXBwZW5kIChhdmltdXgtPnNpbmtwYWRzLCBhdmlwYWQpOworICB9IGVsc2UgaWYgKHRlbXBsID09IGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLCAidmlkZW9fJXUiKSkgeworICAgIC8qIHRob3VnaCBzdHJlYW1zIGFyZSBwcmV0dHkgZ2VuZXJpYyBhbmQgcmVsYXRpdmVseSBzZWxmLWNvbnRhaW5lZCwKKyAgICAgKiBzb21lIHZpZGVvIGluZm8gZ29lcyBpbiBhIHNpbmdsZSBhdmkgaGVhZGVyIC1hbmQgdGhlcmVmb3JlIG11eCBzdHJ1Y3QtCisgICAgICogc28gdmlkZW8gcmVzdHJpY3RlZCB0byBvbmUgc3RyZWFtICovCisgICAgaWYgKGF2aW11eC0+dmlkZW9fcGFkcyA+IDApCisgICAgICBnb3RvIHRvb19tYW55X3ZpZGVvX3BhZHM7CisKKyAgICAvKiBzZXR1cCBwYWQgKi8KKyAgICBwYWRfbmFtZSA9ICJ2aWRlb18wIjsKKyAgICBhdmltdXgtPnZpZGVvX3BhZHMrKzsKKworICAgIC8qIGluaXQgcGFkIHNwZWNpZmljIGRhdGEgKi8KKyAgICBhdmlwYWQgPSBnX21hbGxvYzAgKHNpemVvZiAoR3N0QXZpVmlkZW9QYWQpKTsKKyAgICBhdmlwYWQtPmlzX3ZpZGVvID0gVFJVRTsKKyAgICBhdmlwYWQtPmhkci50eXBlID0gR1NUX01BS0VfRk9VUkNDICgndicsICdpJywgJ2QnLCAncycpOworICAgIC8qIHZpZGVvIGdvZXMgZmlyc3QgKi8KKyAgICBhdmltdXgtPnNpbmtwYWRzID0gZ19zbGlzdF9wcmVwZW5kIChhdmltdXgtPnNpbmtwYWRzLCBhdmlwYWQpOworICB9IGVsc2UKKyAgICBnb3RvIHdyb25nX3RlbXBsYXRlOworCisgIG5ld3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKHRlbXBsLCBwYWRfbmFtZSk7CisKKyAgYXZpcGFkLT5jb2xsZWN0ID0gZ3N0X2NvbGxlY3RfcGFkc19hZGRfcGFkIChhdmltdXgtPmNvbGxlY3QsCisgICAgICBuZXdwYWQsIHNpemVvZiAoR3N0QXZpQ29sbGVjdERhdGEpLCBOVUxMLCBUUlVFKTsKKyAgKChHc3RBdmlDb2xsZWN0RGF0YSAqKSAoYXZpcGFkLT5jb2xsZWN0KSktPmF2aXBhZCA9IGF2aXBhZDsKKworICBpZiAoIWdzdF9lbGVtZW50X2FkZF9wYWQgKGVsZW1lbnQsIG5ld3BhZCkpCisgICAgZ290byBwYWRfYWRkX2ZhaWxlZDsKKworICBnX2ZyZWUgKG5hbWUpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG5ld3BhZCwgIkFkZGVkIG5ldyByZXF1ZXN0IHBhZCIpOworCisgIHJldHVybiBuZXdwYWQ7CisKKyAgLyogRVJST1JTICovCit3cm9uZ19kaXJlY3Rpb246CisgIHsKKyAgICBnX3dhcm5pbmcgKCJhdmltdXg6IHJlcXVlc3QgcGFkIHRoYXQgaXMgbm90IGEgU0lOSyBwYWRcbiIpOworICAgIHJldHVybiBOVUxMOworICB9Cit0b29fbGF0ZToKKyAgeworICAgIGdfd2FybmluZyAoImF2aW11eDogcmVxdWVzdCBwYWQgY2Fubm90IGJlIGFkZGVkIGFmdGVyIHN0cmVhbWluZyBzdGFydGVkXG4iKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQord3JvbmdfdGVtcGxhdGU6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJhdmltdXg6IHRoaXMgaXMgbm90IG91ciB0ZW1wbGF0ZSFcbiIpOworICAgIHJldHVybiBOVUxMOworICB9Cit0b29fbWFueV92aWRlb19wYWRzOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmltdXgsICJDYW4gb25seSBoYXZlIG9uZSB2aWRlbyBzdHJlYW0iKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorcGFkX2FkZF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aW11eCwgIkFkZGluZyB0aGUgbmV3IHBhZCAnJXMnIGZhaWxlZCIsIHBhZF9uYW1lKTsKKyAgICBnX2ZyZWUgKG5hbWUpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKG5ld3BhZCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdmlfbXV4X3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKQoreworICBHc3RBdmlNdXggKmF2aW11eCA9IEdTVF9BVklfTVVYIChlbGVtZW50KTsKKyAgR1NMaXN0ICpub2RlOworCisgIG5vZGUgPSBhdmltdXgtPnNpbmtwYWRzOworICB3aGlsZSAobm9kZSkgeworICAgIEdzdEF2aVBhZCAqYXZpcGFkID0gKEdzdEF2aVBhZCAqKSBub2RlLT5kYXRhOworCisgICAgaWYgKGF2aXBhZC0+Y29sbGVjdC0+cGFkID09IHBhZCkgeworICAgICAgLyogcGFkIGNvdW50IHNob3VsZCBub3QgYmUgYWRqdXN0ZWQsCisgICAgICAgKiBhcyBpdCBhbHNvIHJlcHJlc2VudCBudW1iZXIgb2Ygc3RyZWFtcyBwcmVzZW50ICovCisgICAgICBhdmlwYWQtPmNvbGxlY3QgPSBOVUxMOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpbXV4LCAicmVtb3ZlZCBwYWQgJyVzJyIsIEdTVF9QQURfTkFNRSAocGFkKSk7CisgICAgICBnc3RfY29sbGVjdF9wYWRzX3JlbW92ZV9wYWQgKGF2aW11eC0+Y29sbGVjdCwgcGFkKTsKKyAgICAgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKGVsZW1lbnQsIHBhZCk7CisgICAgICAvKiBpZiBub3Qgc3RhcnRlZCB5ZXQsIHdlIGNhbiByZW1vdmUgYW55IHNpZ24gdGhpcyBwYWQgZXZlciBleGlzdGVkICovCisgICAgICAvKiBpbiB0aGlzIGNhc2UgX3N0YXJ0IHdpbGwgdGFrZSBjYXJlIG9mIHRoZSByZWFsIHBhZCBjb3VudCAqLworICAgICAgaWYgKGF2aW11eC0+d3JpdGVfaGVhZGVyKSB7CisgICAgICAgIGF2aW11eC0+c2lua3BhZHMgPSBnX3NsaXN0X3JlbW92ZSAoYXZpbXV4LT5zaW5rcGFkcywgYXZpcGFkKTsKKyAgICAgICAgZ3N0X2F2aV9tdXhfcGFkX3Jlc2V0IChhdmlwYWQsIFRSVUUpOworICAgICAgICBnX2ZyZWUgKGF2aXBhZCk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgIH0KKworICBnX3dhcm5pbmcgKCJVbmtub3duIHBhZCAlcyIsIEdTVF9QQURfTkFNRSAocGFkKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ3VpbnQKK2dzdF9hdmlfbXV4X3N0YXJ0X2NodW5rIChHc3RCeXRlV3JpdGVyICogYncsIGNvbnN0IGdjaGFyICogdGFnLCBndWludDMyIGZvdXJjYykKK3sKKyAgZ3VpbnQgY2h1bmtfb2Zmc2V0OworCisgIGlmICh0YWcpCisgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhIChidywgKGNvbnN0IGd1aW50OCAqKSB0YWcsIDQpOworICBlbHNlCisgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKGJ3LCBmb3VyY2MpOworCisgIGNodW5rX29mZnNldCA9IGdzdF9ieXRlX3dyaXRlcl9nZXRfcG9zIChidyk7CisgIC8qIHJlYWwgY2h1bmsgc2l6ZSBjb21lcyBsYXRlciAqLworICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoYncsIDApOworCisgIHJldHVybiBjaHVua19vZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZ3N0X2F2aV9tdXhfZW5kX2NodW5rIChHc3RCeXRlV3JpdGVyICogYncsIGd1aW50IGNodW5rX29mZnNldCkKK3sKKyAgZ3VpbnQgc2l6ZTsKKworICBzaXplID0gZ3N0X2J5dGVfd3JpdGVyX2dldF9wb3MgKGJ3KTsKKworICBnc3RfYnl0ZV93cml0ZXJfc2V0X3BvcyAoYncsIGNodW5rX29mZnNldCk7CisgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlIChidywgc2l6ZSAtIGNodW5rX29mZnNldCAtIDQpOworICBnc3RfYnl0ZV93cml0ZXJfc2V0X3BvcyAoYncsIHNpemUpOworCisgIC8qIGFycmFuZ2UgZm9yIGV2ZW4gcGFkZGluZyAqLworICBpZiAoc2l6ZSAmIDEpCisgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50OCAoYncsIDApOworfQorCisvKiBtYXliZSBzb21lIG9mIHRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgbW92ZWQgdG8gcmlmZi5oPyAqLworCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9tdXhfd3JpdGVfdGFnIChjb25zdCBHc3RUYWdMaXN0ICogbGlzdCwgY29uc3QgZ2NoYXIgKiB0YWcsCisgICAgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgY29uc3Qgc3RydWN0CisgIHsKKyAgICBndWludDMyIGZjYzsKKyAgICBjb25zdCBnY2hhciAqdGFnOworICB9IHJpZmZ0YWdzW10gPSB7CisgICAgeworICAgIEdTVF9SSUZGX0lORk9fSUFSTCwgR1NUX1RBR19MT0NBVElPTn0sIHsKKyAgICBHU1RfUklGRl9JTkZPX0lBUlQsIEdTVF9UQUdfQVJUSVNUfSwgeworICAgIEdTVF9SSUZGX0lORk9fSUNNVCwgR1NUX1RBR19DT01NRU5UfSwgeworICAgIEdTVF9SSUZGX0lORk9fSUNPUCwgR1NUX1RBR19DT1BZUklHSFR9LCB7CisgICAgR1NUX1JJRkZfSU5GT19JQ1JELCBHU1RfVEFHX0RBVEV9LCB7CisgICAgR1NUX1JJRkZfSU5GT19JR05SLCBHU1RfVEFHX0dFTlJFfSwgeworICAgIEdTVF9SSUZGX0lORk9fSUtFWSwgR1NUX1RBR19LRVlXT1JEU30sIHsKKyAgICBHU1RfUklGRl9JTkZPX0lOQU0sIEdTVF9UQUdfVElUTEV9LCB7CisgICAgR1NUX1JJRkZfSU5GT19JU0ZULCBHU1RfVEFHX0VOQ09ERVJ9LCB7CisgICAgR1NUX1JJRkZfSU5GT19JU1JDLCBHU1RfVEFHX0lTUkN9LCB7CisgICAgMCwgTlVMTH0KKyAgfTsKKyAgZ2ludCBuOworICBnY2hhciAqc3RyID0gTlVMTDsKKyAgR3N0Qnl0ZVdyaXRlciAqYncgPSBkYXRhOworICBndWludCBjaHVuazsKKworICBmb3IgKG4gPSAwOyByaWZmdGFnc1tuXS5mY2MgIT0gMDsgbisrKSB7CisgICAgaWYgKCFzdHJjbXAgKHJpZmZ0YWdzW25dLnRhZywgdGFnKSkgeworICAgICAgaWYgKHJpZmZ0YWdzW25dLmZjYyA9PSBHU1RfUklGRl9JTkZPX0lDUkQpIHsKKyAgICAgICAgR0RhdGUgKmRhdGU7CisgICAgICAgIC8qIHNwZWNpYWwgY2FzZSBmb3IgdGhlIGRhdGUgdGFnICovCisgICAgICAgIGlmIChnc3RfdGFnX2xpc3RfZ2V0X2RhdGUgKGxpc3QsIHRhZywgJmRhdGUpKSB7CisgICAgICAgICAgc3RyID0KKyAgICAgICAgICAgICAgZ19zdHJkdXBfcHJpbnRmICgiJTA0ZDolMDJkOiUwMmQiLCBnX2RhdGVfZ2V0X3llYXIgKGRhdGUpLAorICAgICAgICAgICAgICBnX2RhdGVfZ2V0X21vbnRoIChkYXRlKSwgZ19kYXRlX2dldF9kYXkgKGRhdGUpKTsKKyAgICAgICAgICBnX2RhdGVfZnJlZSAoZGF0ZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nIChsaXN0LCB0YWcsICZzdHIpOworICAgICAgfQorICAgICAgaWYgKHN0cikgeworICAgICAgICBjaHVuayA9IGdzdF9hdmlfbXV4X3N0YXJ0X2NodW5rIChidywgTlVMTCwgcmlmZnRhZ3Nbbl0uZmNjKTsKKyAgICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF9zdHJpbmcgKGJ3LCBzdHIpOworICAgICAgICBnc3RfYXZpX211eF9lbmRfY2h1bmsgKGJ3LCBjaHVuayk7CisgICAgICAgIGdfZnJlZSAoc3RyKTsKKyAgICAgICAgc3RyID0gTlVMTDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X2F2aV9tdXhfcmlmZl9nZXRfYXZpX2hlYWRlciAoR3N0QXZpTXV4ICogYXZpbXV4KQoreworICBjb25zdCBHc3RUYWdMaXN0ICp0YWdzOworICBHc3RCdWZmZXIgKmJ1ZmZlciA9IE5VTEw7CisgIGdpbnQgc2l6ZSA9IDA7CisgIEdzdEJ5dGVXcml0ZXIgYnc7CisgIEdTTGlzdCAqbm9kZTsKKyAgZ3VpbnQgYXZpaCwgcmlmZiwgaGRybDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdib29sZWFuIGhkbCA9IFRSVUU7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpbXV4LCAiY3JlYXRpbmcgYXZpIGhlYWRlciwgZGF0YV9zaXplICV1LCBpZHhfc2l6ZSAldSIsCisgICAgICBhdmltdXgtPmRhdGFfc2l6ZSwgYXZpbXV4LT5pZHhfc2l6ZSk7CisKKyAgaWYgKGF2aW11eC0+dGFnc19zbmFwKQorICAgIHRhZ3MgPSBhdmltdXgtPnRhZ3Nfc25hcDsKKyAgZWxzZSB7CisgICAgLyogbmVlZCB0byBtYWtlIHNuYXBzaG90IG9mIGN1cnJlbnQgc3RhdGUgb2YgdGFncyB0byBlbnN1cmUgdGhlIHNhbWUgc2V0CisgICAgICogaXMgdXNlZCBuZXh0IHRpbWUgYXJvdW5kIGR1cmluZyBoZWFkZXIgcmV3cml0ZSBhdCB0aGUgZW5kICovCisgICAgdGFncyA9IGdzdF90YWdfc2V0dGVyX2dldF90YWdfbGlzdCAoR1NUX1RBR19TRVRURVIgKGF2aW11eCkpOworICAgIGlmICh0YWdzKQorICAgICAgdGFncyA9IGF2aW11eC0+dGFnc19zbmFwID0gZ3N0X3RhZ19saXN0X2NvcHkgKHRhZ3MpOworICB9CisKKyAgZ3N0X2J5dGVfd3JpdGVyX2luaXRfd2l0aF9zaXplICgmYncsIDEwMjQsIEZBTFNFKTsKKworICAvKiBhdmkgaGVhZGVyIG1ldGFkYXRhICovCisgIHJpZmYgPSBnc3RfYXZpX211eF9zdGFydF9jaHVuayAoJmJ3LCAiUklGRiIsIDApOworICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICgmYncsIChndWludDggKikgIkFWSSAiLCA0KTsKKyAgaGRybCA9IGdzdF9hdmlfbXV4X3N0YXJ0X2NodW5rICgmYncsICJMSVNUIiwgMCk7CisgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X2RhdGEgKCZidywgKGd1aW50OCAqKSAiaGRybCIsIDQpOworCisgIGF2aWggPSBnc3RfYXZpX211eF9zdGFydF9jaHVuayAoJmJ3LCAiYXZpaCIsIDApOworICAvKiB0aGUgQVZJIGhlYWRlciBpdHNlbGYgKi8KKyAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIGF2aW11eC0+YXZpX2hkci51c19mcmFtZSk7CisgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBhdmltdXgtPmF2aV9oZHIubWF4X2Jwcyk7CisgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBhdmltdXgtPmF2aV9oZHIucGFkX2dyYW4pOworICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXZpbXV4LT5hdmlfaGRyLmZsYWdzKTsKKyAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIGF2aW11eC0+YXZpX2hkci50b3RfZnJhbWVzKTsKKyAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIGF2aW11eC0+YXZpX2hkci5pbml0X2ZyYW1lcyk7CisgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBhdmltdXgtPmF2aV9oZHIuc3RyZWFtcyk7CisgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBhdmltdXgtPmF2aV9oZHIuYnVmc2l6ZSk7CisgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBhdmltdXgtPmF2aV9oZHIud2lkdGgpOworICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXZpbXV4LT5hdmlfaGRyLmhlaWdodCk7CisgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBhdmltdXgtPmF2aV9oZHIuc2NhbGUpOworICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXZpbXV4LT5hdmlfaGRyLnJhdGUpOworICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXZpbXV4LT5hdmlfaGRyLnN0YXJ0KTsKKyAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIGF2aW11eC0+YXZpX2hkci5sZW5ndGgpOworICBnc3RfYXZpX211eF9lbmRfY2h1bmsgKCZidywgYXZpaCk7CisKKyAgLyogc3RyZWFtIGRhdGEgKi8KKyAgbm9kZSA9IGF2aW11eC0+c2lua3BhZHM7CisgIHdoaWxlIChub2RlKSB7CisgICAgR3N0QXZpUGFkICphdmlwYWQgPSAoR3N0QXZpUGFkICopIG5vZGUtPmRhdGE7CisgICAgR3N0QXZpVmlkZW9QYWQgKnZpZHBhZCA9IChHc3RBdmlWaWRlb1BhZCAqKSBhdmlwYWQ7CisgICAgR3N0QXZpQXVkaW9QYWQgKmF1ZHBhZCA9IChHc3RBdmlBdWRpb1BhZCAqKSBhdmlwYWQ7CisgICAgZ2ludCBjb2RlY19zaXplID0gMDsKKyAgICBndWludCBzdHJoLCBzdHJsLCBzdHJmLCBpbmR4OworCisgICAgLyogc3RyZWFtIGxpc3QgbWV0YWRhdGEgKi8KKyAgICBzdHJsID0gZ3N0X2F2aV9tdXhfc3RhcnRfY2h1bmsgKCZidywgIkxJU1QiLCAwKTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICgmYncsIChndWludDggKikgInN0cmwiLCA0KTsKKworICAgIC8qIGdlbmVyaWMgaGVhZGVyICovCisgICAgc3RyaCA9IGdzdF9hdmlfbXV4X3N0YXJ0X2NodW5rICgmYncsICJzdHJoIiwgMCk7CisgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIGF2aXBhZC0+aGRyLnR5cGUpOworICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBhdmlwYWQtPmhkci5mY2NfaGFuZGxlcik7CisgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIGF2aXBhZC0+aGRyLmZsYWdzKTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXZpcGFkLT5oZHIucHJpb3JpdHkpOworICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBhdmlwYWQtPmhkci5pbml0X2ZyYW1lcyk7CisgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIGF2aXBhZC0+aGRyLnNjYWxlKTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXZpcGFkLT5oZHIucmF0ZSk7CisgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIGF2aXBhZC0+aGRyLnN0YXJ0KTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXZpcGFkLT5oZHIubGVuZ3RoKTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXZpcGFkLT5oZHIuYnVmc2l6ZSk7CisgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIGF2aXBhZC0+aGRyLnF1YWxpdHkpOworICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBhdmlwYWQtPmhkci5zYW1wbGVzaXplKTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MTZfbGUgKCZidywgMCk7CisgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDE2X2xlICgmYncsIDApOworICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQxNl9sZSAoJmJ3LCAwKTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MTZfbGUgKCZidywgMCk7CisgICAgZ3N0X2F2aV9tdXhfZW5kX2NodW5rICgmYncsIHN0cmgpOworCisgICAgaWYgKGF2aXBhZC0+aXNfdmlkZW8pIHsKKyAgICAgIGNvZGVjX3NpemUgPSB2aWRwYWQtPnZpZHNfY29kZWNfZGF0YSA/CisgICAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAodmlkcGFkLT52aWRzX2NvZGVjX2RhdGEpIDogMDsKKyAgICAgIC8qIHRoZSB2aWRlbyBoZWFkZXIgKi8KKyAgICAgIHN0cmYgPSBnc3RfYXZpX211eF9zdGFydF9jaHVuayAoJmJ3LCAic3RyZiIsIDApOworICAgICAgLyogdGhlIGFjdHVhbCBoZWFkZXIgKi8KKyAgICAgIGhkbCAmPQorICAgICAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIHZpZHBhZC0+dmlkcy5zaXplICsgY29kZWNfc2l6ZSk7CisgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgdmlkcGFkLT52aWRzLndpZHRoKTsKKyAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCB2aWRwYWQtPnZpZHMuaGVpZ2h0KTsKKyAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQxNl9sZSAoJmJ3LCB2aWRwYWQtPnZpZHMucGxhbmVzKTsKKyAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQxNl9sZSAoJmJ3LCB2aWRwYWQtPnZpZHMuYml0X2NudCk7CisgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgdmlkcGFkLT52aWRzLmNvbXByZXNzaW9uKTsKKyAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCB2aWRwYWQtPnZpZHMuaW1hZ2Vfc2l6ZSk7CisgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgdmlkcGFkLT52aWRzLnhwZWxzX21ldGVyKTsKKyAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCB2aWRwYWQtPnZpZHMueXBlbHNfbWV0ZXIpOworICAgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIHZpZHBhZC0+dmlkcy5udW1fY29sb3JzKTsKKyAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCB2aWRwYWQtPnZpZHMuaW1wX2NvbG9ycyk7CisgICAgICBpZiAodmlkcGFkLT52aWRzX2NvZGVjX2RhdGEpIHsKKyAgICAgICAgZ3N0X2J1ZmZlcl9tYXAgKHZpZHBhZC0+dmlkc19jb2RlY19kYXRhLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICgmYncsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKHZpZHBhZC0+dmlkc19jb2RlY19kYXRhLCAmbWFwKTsKKyAgICAgIH0KKyAgICAgIGdzdF9hdmlfbXV4X2VuZF9jaHVuayAoJmJ3LCBzdHJmKTsKKworICAgICAgLyogYWRkIHZpZGVvIHByb3BlcnR5IGRhdGEsIG1haW5seSBmb3IgYXNwZWN0IHJhdGlvLCBpZiBhbnkgKi8KKyAgICAgIGlmICh2aWRwYWQtPnZwcnAuYXNwZWN0KSB7CisgICAgICAgIGdpbnQgZjsKKyAgICAgICAgZ3VpbnQgdnBycDsKKworICAgICAgICAvKiBsZXQncyBiZSBvbiB0aGUgc2FmZSBzaWRlICovCisgICAgICAgIHZpZHBhZC0+dnBycC5maWVsZHMgPSBNSU4gKHZpZHBhZC0+dnBycC5maWVsZHMsCisgICAgICAgICAgICBHU1RfUklGRl9WUFJQX1ZJREVPX0ZJRUxEUyk7CisgICAgICAgIC8qIHRoZSB2cHJwIGhlYWRlciAqLworICAgICAgICB2cHJwID0gZ3N0X2F2aV9tdXhfc3RhcnRfY2h1bmsgKCZidywgInZwcnAiLCAwKTsKKyAgICAgICAgLyogdGhlIGFjdHVhbCBkYXRhICovCisgICAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCB2aWRwYWQtPnZwcnAuZm9ybWF0X3Rva2VuKTsKKyAgICAgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIHZpZHBhZC0+dnBycC5zdGFuZGFyZCk7CisgICAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCB2aWRwYWQtPnZwcnAudmVydF9yYXRlKTsKKyAgICAgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIHZpZHBhZC0+dnBycC5ob3JfdF90b3RhbCk7CisgICAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCB2aWRwYWQtPnZwcnAudmVydF9saW5lcyk7CisgICAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCB2aWRwYWQtPnZwcnAuYXNwZWN0KTsKKyAgICAgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIHZpZHBhZC0+dnBycC53aWR0aCk7CisgICAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCB2aWRwYWQtPnZwcnAuaGVpZ2h0KTsKKyAgICAgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIHZpZHBhZC0+dnBycC5maWVsZHMpOworCisgICAgICAgIGZvciAoZiA9IDA7IGYgPCB2aWRwYWQtPnZwcnAuZmllbGRzOyArK2YpIHsKKyAgICAgICAgICBnc3RfcmlmZl92cHJwX3ZpZGVvX2ZpZWxkX2Rlc2MgKmZkOworCisgICAgICAgICAgZmQgPSAmKHZpZHBhZC0+dnBycC5maWVsZF9pbmZvW2ZdKTsKKyAgICAgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgZmQtPmNvbXByZXNzZWRfYm1faGVpZ2h0KTsKKyAgICAgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgZmQtPmNvbXByZXNzZWRfYm1fd2lkdGgpOworICAgICAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBmZC0+dmFsaWRfYm1faGVpZ2h0KTsKKyAgICAgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgZmQtPnZhbGlkX2JtX3dpZHRoKTsKKyAgICAgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgZmQtPnZhbGlkX2JtX3hfb2Zmc2V0KTsKKyAgICAgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgZmQtPnZhbGlkX2JtX3lfb2Zmc2V0KTsKKyAgICAgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgZmQtPnZpZGVvX3hfdF9vZmZzZXQpOworICAgICAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBmZC0+dmlkZW9feV9zdGFydCk7CisgICAgICAgIH0KKyAgICAgICAgZ3N0X2F2aV9tdXhfZW5kX2NodW5rICgmYncsIHZwcnApOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBjb2RlY19zaXplID0gYXVkcGFkLT5hdWRzX2NvZGVjX2RhdGEgPworICAgICAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGF1ZHBhZC0+YXVkc19jb2RlY19kYXRhKSA6IDA7CisgICAgICAvKiB0aGUgYXVkaW8gaGVhZGVyICovCisgICAgICBzdHJmID0gZ3N0X2F2aV9tdXhfc3RhcnRfY2h1bmsgKCZidywgInN0cmYiLCAwKTsKKyAgICAgIC8qIHRoZSBhY3R1YWwgaGVhZGVyICovCisgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MTZfbGUgKCZidywgYXVkcGFkLT5hdWRzLmZvcm1hdCk7CisgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MTZfbGUgKCZidywgYXVkcGFkLT5hdWRzLmNoYW5uZWxzKTsKKyAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBhdWRwYWQtPmF1ZHMucmF0ZSk7CisgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXVkcGFkLT5hdWRzLmF2X2Jwcyk7CisgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MTZfbGUgKCZidywgYXVkcGFkLT5hdWRzLmJsb2NrYWxpZ24pOworICAgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDE2X2xlICgmYncsIGF1ZHBhZC0+YXVkcy5iaXRzX3Blcl9zYW1wbGUpOworICAgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDE2X2xlICgmYncsIGNvZGVjX3NpemUpOworICAgICAgaWYgKGF1ZHBhZC0+YXVkc19jb2RlY19kYXRhKSB7CisgICAgICAgIGdzdF9idWZmZXJfbWFwIChhdWRwYWQtPmF1ZHNfY29kZWNfZGF0YSwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfZGF0YSAoJmJ3LCBtYXAuZGF0YSwgbWFwLnNpemUpOworICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChhdWRwYWQtPmF1ZHNfY29kZWNfZGF0YSwgJm1hcCk7CisgICAgICB9CisgICAgICBnc3RfYXZpX211eF9lbmRfY2h1bmsgKCZidywgc3RyZik7CisgICAgfQorCisgICAgLyogb2RtbCBzdXBlcmluZGV4IGNodW5rICovCisgICAgaWYgKGF2aXBhZC0+aWR4X2luZGV4ID4gMCkKKyAgICAgIGluZHggPSBnc3RfYXZpX211eF9zdGFydF9jaHVuayAoJmJ3LCAiaW5keCIsIDApOworICAgIGVsc2UKKyAgICAgIGluZHggPSBnc3RfYXZpX211eF9zdGFydF9jaHVuayAoJmJ3LCAiSlVOSyIsIDApOworICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQxNl9sZSAoJmJ3LCA0KTsgICAgICAvKiBieXRlcyBwZXIgZW50cnkgKi8KKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50OCAoJmJ3LCAwKTsgIC8qIGluZGV4IHN1YnR5cGUgKi8KKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50OCAoJmJ3LCBHU1RfQVZJX0lOREVYX09GX0lOREVYRVMpOyAgIC8qIGluZGV4IHR5cGUgKi8KKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXZpcGFkLT5pZHhfaW5kZXgpOyAgICAgIC8qIGVudHJpZXMgaW4gdXNlICovCisgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfZGF0YSAoJmJ3LCAoZ3VpbnQ4ICopIGF2aXBhZC0+dGFnLCA0KTsgICAvKiBzdHJlYW0gaWQgKi8KKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgMCk7ICAgICAgLyogcmVzZXJ2ZWQgKi8KKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgMCk7ICAgICAgLyogcmVzZXJ2ZWQgKi8KKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgMCk7ICAgICAgLyogcmVzZXJ2ZWQgKi8KKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICgmYncsIChndWludDggKikgYXZpcGFkLT5pZHgsCisgICAgICAgIEdTVF9BVklfU1VQRVJJTkRFWF9DT1VOVCAqIHNpemVvZiAoZ3N0X2F2aV9zdXBlcmluZGV4X2VudHJ5KSk7CisgICAgZ3N0X2F2aV9tdXhfZW5kX2NodW5rICgmYncsIGluZHgpOworCisgICAgLyogZW5kIHN0cmwgZm9yIHRoaXMgc3RyZWFtICovCisgICAgZ3N0X2F2aV9tdXhfZW5kX2NodW5rICgmYncsIHN0cmwpOworCisgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgIH0KKworICBpZiAoYXZpbXV4LT52aWRlb19wYWRzID4gMCkgeworICAgIGd1aW50IG9kbWwsIGRtbGg7CisgICAgLyogb2RtbCBoZWFkZXIgKi8KKyAgICBvZG1sID0gZ3N0X2F2aV9tdXhfc3RhcnRfY2h1bmsgKCZidywgIkxJU1QiLCAwKTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICgmYncsIChndWludDggKikgIm9kbWwiLCA0KTsKKyAgICBkbWxoID0gZ3N0X2F2aV9tdXhfc3RhcnRfY2h1bmsgKCZidywgImRtbGgiLCAwKTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXZpbXV4LT50b3RhbF9mcmFtZXMpOworICAgIGdzdF9hdmlfbXV4X2VuZF9jaHVuayAoJmJ3LCBkbWxoKTsKKyAgICBnc3RfYXZpX211eF9lbmRfY2h1bmsgKCZidywgb2RtbCk7CisgIH0KKworICAvKiBlbmQgaGRybCAqLworICBnc3RfYXZpX211eF9lbmRfY2h1bmsgKCZidywgaGRybCk7CisKKyAgLyogdGFncyAqLworICBpZiAodGFncykgeworICAgIGd1aW50IGluZm87CisKKyAgICBpbmZvID0gZ3N0X2F2aV9tdXhfc3RhcnRfY2h1bmsgKCZidywgIkxJU1QiLCAwKTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICgmYncsIChndWludDggKikgIklORk8iLCA0KTsKKworICAgIGdzdF90YWdfbGlzdF9mb3JlYWNoICh0YWdzLCBnc3RfYXZpX211eF93cml0ZV90YWcsICZidyk7CisgICAgaWYgKGluZm8gKyA4ID09IGdzdF9ieXRlX3dyaXRlcl9nZXRfcG9zICgmYncpKSB7CisgICAgICAvKiBubyB0YWdzIHdyaXRlbiwgcmVtb3ZlIHRoZSBlbXB0eSBJTkZPIExJU1QgYXMgaXQgaXMgdXNlbGVzcworICAgICAgICogYW5kIHByZXZlbnRzIHBsYXliYWNrIGluIHZsYyAqLworICAgICAgZ3N0X2J5dGVfd3JpdGVyX3NldF9wb3MgKCZidywgaW5mbyAtIDQpOworICAgIH0gZWxzZSB7CisgICAgICBnc3RfYXZpX211eF9lbmRfY2h1bmsgKCZidywgaW5mbyk7CisgICAgfQorICB9CisKKyAgLyogcG9wIFJJRkYgKi8KKyAgZ3N0X2F2aV9tdXhfZW5kX2NodW5rICgmYncsIHJpZmYpOworCisgIC8qIGF2aSBkYXRhIGhlYWRlciAqLworICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICgmYncsIChndWludDggKikgIkxJU1QiLCA0KTsKKyAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIGF2aW11eC0+ZGF0YV9zaXplKTsKKyAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfZGF0YSAoJmJ3LCAoZ3VpbnQ4ICopICJtb3ZpIiwgNCk7CisKKyAgaWYgKCFoZGwpCisgICAgZ290byBiZWFjaDsKKworICAvKiBub3cgZ2V0IHRoZSBkYXRhICovCisgIGJ1ZmZlciA9IGdzdF9ieXRlX3dyaXRlcl9yZXNldF9hbmRfZ2V0X2J1ZmZlciAoJmJ3KTsKKworICAvKiAuLi4gYnV0IFJJRkYgaW5jbHVkZXMgbW9yZSB0aGFuIGp1c3QgaGVhZGVyICovCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgc2l6ZSA9IEdTVF9SRUFEX1VJTlQzMl9MRSAobWFwLmRhdGEgKyA0KTsKKyAgc2l6ZSArPSA4ICsgYXZpbXV4LT5kYXRhX3NpemUgKyBhdmltdXgtPmlkeF9zaXplOworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChtYXAuZGF0YSArIDQsIHNpemUpOworCisgIEdTVF9NRU1EVU1QX09CSkVDVCAoYXZpbXV4LCAiYXZpIGhlYWRlciIsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKK2JlYWNoOgorICByZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9hdmlfbXV4X3JpZmZfZ2V0X2F2aXhfaGVhZGVyIChndWludDMyIGRhdGF4X3NpemUpCit7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBHc3RNYXBJbmZvIG1hcDsKKworICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDI0KTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgbWVtY3B5IChtYXAuZGF0YSArIDAsICJSSUZGIiwgNCk7CisgIEdTVF9XUklURV9VSU5UMzJfTEUgKG1hcC5kYXRhICsgNCwgZGF0YXhfc2l6ZSArIDMgKiA0KTsKKyAgbWVtY3B5IChtYXAuZGF0YSArIDgsICJBVklYIiwgNCk7CisgIG1lbWNweSAobWFwLmRhdGEgKyAxMiwgIkxJU1QiLCA0KTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAobWFwLmRhdGEgKyAxNiwgZGF0YXhfc2l6ZSk7CisgIG1lbWNweSAobWFwLmRhdGEgKyAyMCwgIm1vdmkiLCA0KTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICByZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgaW5saW5lIEdzdEJ1ZmZlciAqCitnc3RfYXZpX211eF9yaWZmX2dldF9oZWFkZXIgKEdzdEF2aVBhZCAqIGF2aXBhZCwgZ3VpbnQzMiB2aWRlb19mcmFtZV9zaXplKQoreworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg4KTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgbWVtY3B5IChtYXAuZGF0YSArIDAsIGF2aXBhZC0+dGFnLCA0KTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAobWFwLmRhdGEgKyA0LCB2aWRlb19mcmFtZV9zaXplKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICByZXR1cm4gYnVmZmVyOworfQorCisvKiB3cml0ZSBhbiBvZG1sIGluZGV4IGNodW5rIGluIHRoZSBtb3ZpIGxpc3QgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYXZpX211eF93cml0ZV9hdml4X2luZGV4IChHc3RBdmlNdXggKiBhdmltdXgsIEdzdEF2aVBhZCAqIGF2aXBhZCwKKyAgICBnY2hhciAqIGNvZGUsIGdjaGFyICogY2h1bmssIGdzdF9hdmlfc3VwZXJpbmRleF9lbnRyeSAqIHN1cGVyX2luZGV4LAorICAgIGdpbnQgKiBzdXBlcl9pbmRleF9jb3VudCkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXM7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBndWludDggKmRhdGE7CisgIGdzdF9yaWZmX2luZGV4X2VudHJ5ICplbnRyeTsKKyAgZ2ludCBpOworICBndWludDMyIHNpemUsIGVudHJ5X2NvdW50OworICBnYm9vbGVhbiBpc19wY20gPSBGQUxTRTsKKyAgZ3VpbnQzMiBwY21fc2FtcGxlcyA9IDA7CisgIEdzdE1hcEluZm8gbWFwOworCisgIC8qIGNoZWNrIGlmIGl0IGlzIHBjbSAqLworICBpZiAoYXZpcGFkICYmICFhdmlwYWQtPmlzX3ZpZGVvKSB7CisgICAgR3N0QXZpQXVkaW9QYWQgKmF1ZGlvcGFkID0gKEdzdEF2aUF1ZGlvUGFkICopIGF2aXBhZDsKKyAgICBpZiAoYXVkaW9wYWQtPmF1ZHMuZm9ybWF0ID09IEdTVF9SSUZGX1dBVkVfRk9STUFUX1BDTSkgeworICAgICAgcGNtX3NhbXBsZXMgPSBhdWRpb3BhZC0+c2FtcGxlczsKKyAgICAgIGlzX3BjbSA9IFRSVUU7CisgICAgfQorICB9CisKKyAgLyogYWxsb2NhdGUgdGhlIG1heGltdW0gcG9zc2libGUgKi8KKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgzMiArIDggKiBhdmltdXgtPmlkeF9pbmRleCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKworICAvKiBnZW5lcmFsIGluZGV4IGNodW5rIGluZm8gKi8KKyAgbWVtY3B5IChtYXAuZGF0YSArIDAsIGNodW5rLCA0KTsgICAgICAvKiBjaHVuayBpZCAqLworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChtYXAuZGF0YSArIDQsIDApOyAgICAgICAgLyogY2h1bmsgc2l6ZTsgZmlsbCBsYXRlciAqLworICBHU1RfV1JJVEVfVUlOVDE2X0xFIChtYXAuZGF0YSArIDgsIDIpOyAgICAgICAgLyogaW5kZXggZW50cnkgaXMgMiB3b3JkcyAqLworICBtYXAuZGF0YVsxMF0gPSAwOyAgICAgICAgICAgICAvKiBpbmRleCBzdWJ0eXBlICovCisgIG1hcC5kYXRhWzExXSA9IEdTVF9BVklfSU5ERVhfT0ZfQ0hVTktTOyAgICAgICAvKiBpbmRleCB0eXBlOiBBVklfSU5ERVhfT0ZfQ0hVTktTICovCisgIEdTVF9XUklURV9VSU5UMzJfTEUgKG1hcC5kYXRhICsgMTIsIDApOyAgICAgICAvKiBlbnRyaWVzIGluIHVzZTsgZmlsbCBsYXRlciAqLworICBtZW1jcHkgKG1hcC5kYXRhICsgMTYsIGNvZGUsIDQpOyAgICAgIC8qIHN0cmVhbSB0byB3aGljaCBpbmRleCByZWZlcnMgKi8KKyAgR1NUX1dSSVRFX1VJTlQ2NF9MRSAobWFwLmRhdGEgKyAyMCwgYXZpbXV4LT5hdml4X3N0YXJ0KTsgICAgICAvKiBiYXNlIG9mZnNldCAqLworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChtYXAuZGF0YSArIDI4LCAwKTsgICAgICAgLyogcmVzZXJ2ZWQgKi8KKyAgbWFwLmRhdGEgKz0gMzI7CisKKyAgLyogbm93IHRoZSBhY3R1YWwgaW5kZXggZW50cmllcyAqLworICBpID0gYXZpbXV4LT5pZHhfaW5kZXg7CisgIGVudHJ5ID0gYXZpbXV4LT5pZHg7CisgIHdoaWxlIChpID4gMCkgeworICAgIGlmIChtZW1jbXAgKCZlbnRyeS0+aWQsIGNvZGUsIDQpID09IDApIHsKKyAgICAgIC8qIGVudGVyIHJlbGF0aXZlIG9mZnNldCB0byB0aGUgZGF0YSAoISkgKi8KKyAgICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKG1hcC5kYXRhLCBHVUlOVDMyX0ZST01fTEUgKGVudHJ5LT5vZmZzZXQpICsgOCk7CisgICAgICAvKiBtc2IgaXMgc2V0IGlmIG5vdCAoISkga2V5ZnJhbWUgKi8KKyAgICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKG1hcC5kYXRhICsgNCwgR1VJTlQzMl9GUk9NX0xFIChlbnRyeS0+c2l6ZSkKKyAgICAgICAgICB8IChHVUlOVDMyX0ZST01fTEUgKGVudHJ5LT5mbGFncykKKyAgICAgICAgICAgICAgJiBHU1RfUklGRl9JRl9LRVlGUkFNRSA/IDAgOiAxVSA8PCAzMSkpOworICAgICAgbWFwLmRhdGEgKz0gODsKKyAgICB9CisgICAgaS0tOworICAgIGVudHJ5Kys7CisgIH0KKworICAvKiBvaywgbm93IHdlIGtub3cgdGhlIHNpemUgYW5kIG5vIG9mIGVudHJpZXMsIGZpbGwgaW4gd2hlcmUgbmVlZGVkICovCisgIHNpemUgPSBtYXAuZGF0YSAtIGRhdGE7CisgIEdTVF9XUklURV9VSU5UMzJfTEUgKGRhdGEgKyA0LCBzaXplIC0gOCk7CisgIGVudHJ5X2NvdW50ID0gKHNpemUgLSAzMikgLyA4OworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhICsgMTIsIGVudHJ5X2NvdW50KTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl9yZXNpemUgKGJ1ZmZlciwgMCwgc2l6ZSk7CisKKyAgLyogc2VuZCAqLworICBpZiAoKHJlcyA9IGdzdF9wYWRfcHVzaCAoYXZpbXV4LT5zcmNwYWQsIGJ1ZmZlcikpICE9IEdTVF9GTE9XX09LKQorICAgIHJldHVybiByZXM7CisKKyAgLyoga2VlcCB0cmFjayBvZiB0aGlzIGluIHN1cGVyaW5kZXggKGlmIHJvb20pIC4uLiAqLworICBpZiAoKnN1cGVyX2luZGV4X2NvdW50IDwgR1NUX0FWSV9TVVBFUklOREVYX0NPVU5UKSB7CisgICAgaSA9ICpzdXBlcl9pbmRleF9jb3VudDsKKyAgICBzdXBlcl9pbmRleFtpXS5vZmZzZXQgPSBHVUlOVDY0X1RPX0xFIChhdmltdXgtPnRvdGFsX2RhdGEpOworICAgIHN1cGVyX2luZGV4W2ldLnNpemUgPSBHVUlOVDMyX1RPX0xFIChzaXplKTsKKyAgICBpZiAoaXNfcGNtKSB7CisgICAgICBzdXBlcl9pbmRleFtpXS5kdXJhdGlvbiA9IEdVSU5UMzJfVE9fTEUgKHBjbV9zYW1wbGVzKTsKKyAgICB9IGVsc2UgeworICAgICAgc3VwZXJfaW5kZXhbaV0uZHVyYXRpb24gPSBHVUlOVDMyX1RPX0xFIChlbnRyeV9jb3VudCk7CisgICAgfQorICAgICgqc3VwZXJfaW5kZXhfY291bnQpKys7CisgIH0gZWxzZQorICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpbXV4LCAiTm8gbW9yZSByb29tIGluIHN1cGVyaW5kZXggb2Ygc3RyZWFtICVzIiwKKyAgICAgICAgY29kZSk7CisKKyAgLyogLi4uIGFuZCBpbiBzaXplICovCisgIGF2aW11eC0+dG90YWxfZGF0YSArPSBzaXplOworICBpZiAoYXZpbXV4LT5pc19iaWdmaWxlKQorICAgIGF2aW11eC0+ZGF0YXhfc2l6ZSArPSBzaXplOworICBlbHNlCisgICAgYXZpbXV4LT5kYXRhX3NpemUgKz0gc2l6ZTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKKy8qIHNvbWUgb3RoZXIgdXNhYmxlIGZ1bmN0aW9ucyAodGhhbmt5b3UgeGF3dHYgOy0pICkgKi8KKworc3RhdGljIHZvaWQKK2dzdF9hdmlfbXV4X2FkZF9pbmRleCAoR3N0QXZpTXV4ICogYXZpbXV4LCBHc3RBdmlQYWQgKiBhdmlwYWQsIGd1aW50MzIgZmxhZ3MsCisgICAgZ3VpbnQzMiBzaXplKQoreworICBnY2hhciAqY29kZSA9IGF2aXBhZC0+dGFnOworICBpZiAoYXZpbXV4LT5pZHhfaW5kZXggPT0gYXZpbXV4LT5pZHhfY291bnQpIHsKKyAgICBhdmltdXgtPmlkeF9jb3VudCArPSAyNTY7CisgICAgYXZpbXV4LT5pZHggPQorICAgICAgICBnX3JlYWxsb2MgKGF2aW11eC0+aWR4LAorICAgICAgICBhdmltdXgtPmlkeF9jb3VudCAqIHNpemVvZiAoZ3N0X3JpZmZfaW5kZXhfZW50cnkpKTsKKyAgfQorCisgIC8qIGluIGNhc2Ugb2YgcGNtIGF1ZGlvLCB3ZSBuZWVkIHRvIGNvdW50IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBmb3IKKyAgICogcHV0dGluZyBpbiB0aGUgaW5keCBlbnRyaWVzICovCisgIGlmICghYXZpcGFkLT5pc192aWRlbykgeworICAgIEdzdEF2aUF1ZGlvUGFkICphdWRpb3BhZCA9IChHc3RBdmlBdWRpb1BhZCAqKSBhdmlwYWQ7CisgICAgaWYgKGF1ZGlvcGFkLT5hdWRzLmZvcm1hdCA9PSBHU1RfUklGRl9XQVZFX0ZPUk1BVF9QQ00pIHsKKyAgICAgIGF1ZGlvcGFkLT5zYW1wbGVzICs9IHNpemUgLyBhdWRpb3BhZC0+YXVkcy5ibG9ja2FsaWduOworICAgIH0KKyAgfQorCisgIG1lbWNweSAoJihhdmltdXgtPmlkeFthdmltdXgtPmlkeF9pbmRleF0uaWQpLCBjb2RlLCA0KTsKKyAgYXZpbXV4LT5pZHhbYXZpbXV4LT5pZHhfaW5kZXhdLmZsYWdzID0gR1VJTlQzMl9UT19MRSAoZmxhZ3MpOworICBhdmltdXgtPmlkeFthdmltdXgtPmlkeF9pbmRleF0ub2Zmc2V0ID0gR1VJTlQzMl9UT19MRSAoYXZpbXV4LT5pZHhfb2Zmc2V0KTsKKyAgYXZpbXV4LT5pZHhbYXZpbXV4LT5pZHhfaW5kZXhdLnNpemUgPSBHVUlOVDMyX1RPX0xFIChzaXplKTsKKyAgYXZpbXV4LT5pZHhfaW5kZXgrKzsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hdmlfbXV4X3dyaXRlX2luZGV4IChHc3RBdmlNdXggKiBhdmltdXgpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3NpemUgc2l6ZTsKKworICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDgpOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBtZW1jcHkgKG1hcC5kYXRhICsgMCwgImlkeDEiLCA0KTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAobWFwLmRhdGEgKyA0LAorICAgICAgYXZpbXV4LT5pZHhfaW5kZXggKiBzaXplb2YgKGdzdF9yaWZmX2luZGV4X2VudHJ5KSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKKyAgcmVzID0gZ3N0X3BhZF9wdXNoIChhdmltdXgtPnNyY3BhZCwgYnVmZmVyKTsKKyAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykKKyAgICByZXR1cm4gcmVzOworCisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3ICgpOworCisgIHNpemUgPSBhdmltdXgtPmlkeF9pbmRleCAqIHNpemVvZiAoZ3N0X3JpZmZfaW5kZXhfZW50cnkpOworICBkYXRhID0gKGd1aW50OCAqKSBhdmltdXgtPmlkeDsKKyAgYXZpbXV4LT5pZHggPSBOVUxMOyAgICAgICAgICAgLyogd2lsbCBiZSBmcmVlKCknZWQgYnkgZ3N0X2J1ZmZlcl91bnJlZigpICovCisKKyAgZ3N0X2J1ZmZlcl9hcHBlbmRfbWVtb3J5IChidWZmZXIsCisgICAgICBnc3RfbWVtb3J5X25ld193cmFwcGVkICgwLCBkYXRhLCBzaXplLCAwLCBzaXplLCBkYXRhLCBnX2ZyZWUpKTsKKworICBhdmltdXgtPnRvdGFsX2RhdGEgKz0gc2l6ZSArIDg7CisKKyAgcmVzID0gZ3N0X3BhZF9wdXNoIChhdmltdXgtPnNyY3BhZCwgYnVmZmVyKTsKKyAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykKKyAgICByZXR1cm4gcmVzOworCisgIGF2aW11eC0+aWR4X3NpemUgKz0gYXZpbXV4LT5pZHhfaW5kZXggKiBzaXplb2YgKGdzdF9yaWZmX2luZGV4X2VudHJ5KSArIDg7CisKKyAgLyogdXBkYXRlIGhlYWRlciAqLworICBhdmltdXgtPmF2aV9oZHIuZmxhZ3MgfD0gR1NUX1JJRkZfQVZJSF9IQVNJTkRFWDsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9tdXhfYmlnZmlsZSAoR3N0QXZpTXV4ICogYXZpbXV4LCBnYm9vbGVhbiBsYXN0KQoreworICBHc3RGbG93UmV0dXJuIHJlcyA9IEdTVF9GTE9XX09LOworICBHc3RCdWZmZXIgKmhlYWRlcjsKKyAgR1NMaXN0ICpub2RlOworCisgIC8qIGZpcnN0IHNvbWUgb2RtbCBzdGFuZGFyZCBpbmRleCBjaHVua3MgaW4gdGhlIG1vdmkgbGlzdCAqLworICBub2RlID0gYXZpbXV4LT5zaW5rcGFkczsKKyAgd2hpbGUgKG5vZGUpIHsKKyAgICBHc3RBdmlQYWQgKmF2aXBhZCA9IChHc3RBdmlQYWQgKikgbm9kZS0+ZGF0YTsKKworICAgIG5vZGUgPSBub2RlLT5uZXh0OworCisgICAgcmVzID0gZ3N0X2F2aV9tdXhfd3JpdGVfYXZpeF9pbmRleCAoYXZpbXV4LCBhdmlwYWQsIGF2aXBhZC0+dGFnLAorICAgICAgICBhdmlwYWQtPmlkeF90YWcsIGF2aXBhZC0+aWR4LCAmYXZpcGFkLT5pZHhfaW5kZXgpOworICAgIGlmIChyZXMgIT0gR1NUX0ZMT1dfT0spCisgICAgICByZXR1cm4gcmVzOworICB9CisKKyAgaWYgKGF2aW11eC0+aXNfYmlnZmlsZSkgeworICAgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICAgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX0JZVEVTKTsKKworICAgIC8qIHNlYXJjaCBiYWNrICovCisgICAgc2VnbWVudC5zdGFydCA9IGF2aW11eC0+YXZpeF9zdGFydDsKKyAgICBzZWdtZW50LnRpbWUgPSBhdmltdXgtPmF2aXhfc3RhcnQ7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChhdmltdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgICAgLyogcmV3cml0ZSBBVklYIGhlYWRlciAqLworICAgIGhlYWRlciA9IGdzdF9hdmlfbXV4X3JpZmZfZ2V0X2F2aXhfaGVhZGVyIChhdmltdXgtPmRhdGF4X3NpemUpOworICAgIHJlcyA9IGdzdF9wYWRfcHVzaCAoYXZpbXV4LT5zcmNwYWQsIGhlYWRlcik7CisKKyAgICAvKiBnbyBiYWNrIHRvIGN1cnJlbnQgbG9jYXRpb24sIGF0IGxlYXN0IHRyeSAqLworICAgIHNlZ21lbnQuc3RhcnQgPSBhdmltdXgtPnRvdGFsX2RhdGE7CisgICAgc2VnbWVudC50aW1lID0gYXZpbXV4LT50b3RhbF9kYXRhOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoYXZpbXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKworICAgIGlmIChyZXMgIT0gR1NUX0ZMT1dfT0spCisgICAgICByZXR1cm4gcmVzOworICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBhIHN0YW5kYXJkIGluZGV4IGluIHRoZSBmaXJzdCByaWZmIGNodW5rICovCisgICAgcmVzID0gZ3N0X2F2aV9tdXhfd3JpdGVfaW5kZXggKGF2aW11eCk7CisgICAgLyogdGhlIGluZGV4IGRhdGEvYnVmZmVyIGlzIGZyZWVkIGJ5IHB1c2hpbmcgaXQgKi8KKyAgICBhdmltdXgtPmlkeF9jb3VudCA9IDA7CisgICAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykKKyAgICAgIHJldHVybiByZXM7CisgIH0KKworICBhdmltdXgtPmF2aXhfc3RhcnQgPSBhdmltdXgtPnRvdGFsX2RhdGE7CisKKyAgaWYgKGxhc3QpCisgICAgcmV0dXJuIHJlczsKKworICBhdmltdXgtPmlzX2JpZ2ZpbGUgPSBUUlVFOworICBhdmltdXgtPm51bXhfZnJhbWVzID0gMDsKKyAgYXZpbXV4LT5kYXRheF9zaXplID0gNDsgICAgICAgLyogbW92aSB0YWcgKi8KKyAgYXZpbXV4LT5pZHhfaW5kZXggPSAwOworICBub2RlID0gYXZpbXV4LT5zaW5rcGFkczsKKyAgd2hpbGUgKG5vZGUpIHsKKyAgICBHc3RBdmlQYWQgKmF2aXBhZCA9IChHc3RBdmlQYWQgKikgbm9kZS0+ZGF0YTsKKyAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICBpZiAoIWF2aXBhZC0+aXNfdmlkZW8pIHsKKyAgICAgIEdzdEF2aUF1ZGlvUGFkICphdWRpb3BhZCA9IChHc3RBdmlBdWRpb1BhZCAqKSBhdmlwYWQ7CisgICAgICBhdWRpb3BhZC0+c2FtcGxlcyA9IDA7CisgICAgfQorICB9CisKKyAgaGVhZGVyID0gZ3N0X2F2aV9tdXhfcmlmZl9nZXRfYXZpeF9oZWFkZXIgKDApOworICBhdmltdXgtPnRvdGFsX2RhdGEgKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoaGVhZGVyKTsKKyAgLyogYXZpeF9zdGFydCBpcyB1c2VkIGFzIGJhc2Ugb2Zmc2V0IGZvciB0aGUgb2RtbCBpbmRleCBjaHVuayAqLworICBhdmltdXgtPmlkeF9vZmZzZXQgPSBhdmltdXgtPnRvdGFsX2RhdGEgLSBhdmltdXgtPmF2aXhfc3RhcnQ7CisKKyAgcmV0dXJuIGdzdF9wYWRfcHVzaCAoYXZpbXV4LT5zcmNwYWQsIGhlYWRlcik7Cit9CisKKy8qIGVub3VnaCBoZWFkZXIgYmxhYmxhIG5vdywgbGV0J3MgZ28gb24gdG8gYWN0dWFsbHkgd3JpdGluZyB0aGUgaGVhZGVycyAqLworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9tdXhfc3RhcnRfZmlsZSAoR3N0QXZpTXV4ICogYXZpbXV4KQoreworICBHc3RGbG93UmV0dXJuIHJlczsKKyAgR3N0QnVmZmVyICpoZWFkZXI7CisgIEdTTGlzdCAqbm9kZTsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGF2aW11eC0+dG90YWxfZGF0YSA9IDA7CisgIGF2aW11eC0+dG90YWxfZnJhbWVzID0gMDsKKyAgYXZpbXV4LT5kYXRhX3NpemUgPSA0OyAgICAgICAgLyogbW92aSB0YWcgKi8KKyAgYXZpbXV4LT5kYXRheF9zaXplID0gMDsKKyAgYXZpbXV4LT5udW1fZnJhbWVzID0gMDsKKyAgYXZpbXV4LT5udW14X2ZyYW1lcyA9IDA7CisgIGF2aW11eC0+YXZpeF9zdGFydCA9IDA7CisKKyAgYXZpbXV4LT5pZHhfaW5kZXggPSAwOworICBhdmltdXgtPmlkeF9vZmZzZXQgPSAwOyAgICAgICAvKiBzZWUgMTAgbGluZXMgYmVsb3cgKi8KKyAgYXZpbXV4LT5pZHhfc2l6ZSA9IDA7CisgIGF2aW11eC0+aWR4X2NvdW50ID0gMDsKKyAgYXZpbXV4LT5pZHggPSBOVUxMOworCisgIC8qIHN0YXRlICovCisgIGF2aW11eC0+d3JpdGVfaGVhZGVyID0gRkFMU0U7CisgIGF2aW11eC0+cmVzdGFydCA9IEZBTFNFOworCisgIC8qIGluaXQgc3RyZWFtcywgc2VlIHdoYXQgd2UndmUgZ290ICovCisgIG5vZGUgPSBhdmltdXgtPnNpbmtwYWRzOworICBhdmltdXgtPmF1ZGlvX3BhZHMgPSBhdmltdXgtPnZpZGVvX3BhZHMgPSAwOworICB3aGlsZSAobm9kZSkgeworICAgIEdzdEF2aVBhZCAqYXZpcGFkID0gKEdzdEF2aVBhZCAqKSBub2RlLT5kYXRhOworCisgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisKKyAgICBpZiAoIWF2aXBhZC0+aXNfdmlkZW8pIHsKKyAgICAgIC8qIGF1ZGlvIHN0cmVhbSBudW1iZXJzIG11c3Qgc3RhcnQgYXQgMSBpZmYgdGhlcmUgaXMgYSB2aWRlbyBzdHJlYW0gMDsKKyAgICAgICAqIHJlcXVlc3RfcGFkIGluc2VydHMgdmlkZW8gcGFkIGF0IGhlYWQgb2YgbGlzdCwgc28gdGhpcyB0ZXN0IHN1ZmZpY2VzICovCisgICAgICBpZiAoYXZpbXV4LT52aWRlb19wYWRzKQorICAgICAgICBhdmltdXgtPmF1ZGlvX3BhZHMrKzsKKyAgICAgIGF2aXBhZC0+dGFnID0gZ19zdHJkdXBfcHJpbnRmICgiJTAydXdiIiwgYXZpbXV4LT5hdWRpb19wYWRzKTsKKyAgICAgIGF2aXBhZC0+aWR4X3RhZyA9IGdfc3RyZHVwX3ByaW50ZiAoIml4JTAydSIsIGF2aW11eC0+YXVkaW9fcGFkcyk7CisgICAgICBpZiAoIWF2aW11eC0+dmlkZW9fcGFkcykKKyAgICAgICAgYXZpbXV4LT5hdWRpb19wYWRzKys7CisgICAgfSBlbHNlIHsKKyAgICAgIGF2aXBhZC0+dGFnID0gZ19zdHJkdXBfcHJpbnRmICgiJTAydWRiIiwgYXZpbXV4LT52aWRlb19wYWRzKTsKKyAgICAgIGF2aXBhZC0+aWR4X3RhZyA9IGdfc3RyZHVwX3ByaW50ZiAoIml4JTAydSIsIGF2aW11eC0+dmlkZW9fcGFkcysrKTsKKyAgICB9CisgIH0KKworICAvKiBzdHJlYW0tc3RhcnQgKEZJWE1FOiBjcmVhdGUgaWQgYmFzZWQgb24gaW5wdXQgaWRzKSAqLworICB7CisgICAgZ2NoYXIgc19pZFszMl07CisKKyAgICBnX3NucHJpbnRmIChzX2lkLCBzaXplb2YgKHNfaWQpLCAiYXZpbXV4LSUwOHgiLCBnX3JhbmRvbV9pbnQgKCkpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoYXZpbXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0IChzX2lkKSk7CisgIH0KKworICBjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKGF2aW11eC0+c3JjcGFkKTsKKyAgZ3N0X3BhZF9zZXRfY2FwcyAoYXZpbXV4LT5zcmNwYWQsIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgLyogbGV0IGRvd25zdHJlYW0ga25vdyB3ZSB0aGluayBpbiBCWVRFUyBhbmQgZXhwZWN0IHRvIGRvIHNlZWtpbmcgbGF0ZXIgb24gKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfQllURVMpOworICBnc3RfcGFkX3B1c2hfZXZlbnQgKGF2aW11eC0+c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSk7CisKKyAgLyogaGVhZGVyICovCisgIGF2aW11eC0+YXZpX2hkci5zdHJlYW1zID0gZ19zbGlzdF9sZW5ndGggKGF2aW11eC0+c2lua3BhZHMpOworICBhdmltdXgtPmlzX2JpZ2ZpbGUgPSBGQUxTRTsKKworICBoZWFkZXIgPSBnc3RfYXZpX211eF9yaWZmX2dldF9hdmlfaGVhZGVyIChhdmltdXgpOworICBhdmltdXgtPnRvdGFsX2RhdGEgKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoaGVhZGVyKTsKKworICByZXMgPSBnc3RfcGFkX3B1c2ggKGF2aW11eC0+c3JjcGFkLCBoZWFkZXIpOworCisgIGF2aW11eC0+aWR4X29mZnNldCA9IGF2aW11eC0+dG90YWxfZGF0YTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9tdXhfc3RvcF9maWxlIChHc3RBdmlNdXggKiBhdmltdXgpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzID0gR1NUX0ZMT1dfT0s7CisgIEdzdEJ1ZmZlciAqaGVhZGVyOworICBHU0xpc3QgKm5vZGU7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICAvKiBEbyBub3Qgd3JpdGUgaW5kZXggYW5kIGhlYWRlciwgaWYgdGhlIGluZGV4IGhhcyBubyBkYXRhICovCisgIGlmIChhdmltdXgtPmlkeCA9PSBOVUxMKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICAvKiBpZiBiaWdmaWxlLCByZXdyaXRlIGhlYWRlciwgZWxzZSB3cml0ZSBpbmRleGVzICovCisgIC8qIGRvbid0IGJhaWwgb3V0IGF0IG9uY2UgaWYgZXJyb3IsIHN0aWxsIHRyeSB0byByZS13cml0ZSBoZWFkZXIgKi8KKyAgaWYgKGF2aW11eC0+dmlkZW9fcGFkcyA+IDApIHsKKyAgICBpZiAoYXZpbXV4LT5pc19iaWdmaWxlKSB7CisgICAgICByZXMgPSBnc3RfYXZpX211eF9iaWdmaWxlIChhdmltdXgsIFRSVUUpOworICAgIH0gZWxzZSB7CisgICAgICByZXMgPSBnc3RfYXZpX211eF93cml0ZV9pbmRleCAoYXZpbXV4KTsKKyAgICB9CisgIH0KKworICAvKiB3ZSBkbyBvdXIgYmVzdCB0byBtYWtlIGl0IGludGVybGVhdmVkIGF0IGxlYXN0IC4uLiAqLworICBpZiAoYXZpbXV4LT5hdWRpb19wYWRzID4gMCAmJiBhdmltdXgtPnZpZGVvX3BhZHMgPiAwKQorICAgIGF2aW11eC0+YXZpX2hkci5mbGFncyB8PSBHU1RfUklGRl9BVklIX0lTSU5URVJMRUFWRUQ7CisKKyAgLyogc2V0IHJhdGUgYW5kIGV2ZXJ5dGhpbmcgaGF2aW5nIHRvIGRvIHdpdGggdGhhdCAqLworICBhdmltdXgtPmF2aV9oZHIubWF4X2JwcyA9IDA7CisgIG5vZGUgPSBhdmltdXgtPnNpbmtwYWRzOworICB3aGlsZSAobm9kZSkgeworICAgIEdzdEF2aVBhZCAqYXZpcGFkID0gKEdzdEF2aVBhZCAqKSBub2RlLT5kYXRhOworCisgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisKKyAgICBpZiAoIWF2aXBhZC0+aXNfdmlkZW8pIHsKKyAgICAgIEdzdEF2aUF1ZGlvUGFkICphdWRwYWQgPSAoR3N0QXZpQXVkaW9QYWQgKikgYXZpcGFkOworCisgICAgICAvKiBjYWxjdWxhdGUgYnBzIGlmIG5lZWRlZCAqLworICAgICAgaWYgKCFhdWRwYWQtPmF1ZHMuYXZfYnBzKSB7CisgICAgICAgIGlmIChhdWRwYWQtPmF1ZGlvX3RpbWUpIHsKKyAgICAgICAgICBhdWRwYWQtPmF1ZHMuYXZfYnBzID0KKyAgICAgICAgICAgICAgKEdTVF9TRUNPTkQgKiBhdWRwYWQtPmF1ZGlvX3NpemUpIC8gYXVkcGFkLT5hdWRpb190aW1lOworICAgICAgICAgIC8qIHJvdW5kIGJwcyB0byBuZWFyZXN0IG11bHRpcGxlIG9mIDg7CisgICAgICAgICAgICogd2hpY2ggaXMgbXVjaCBtb3JlIGxpa2VseSB0byBiZSB0aGUgKGNicikgYml0cmF0ZSBpbiB1c2U7CisgICAgICAgICAgICogd2hpY2ggaW4gdHVybiByZXN1bHRzIGluIGJldHRlciB0aW1lc3RhbXAgY2FsY3VsYXRpb24gb24gcGxheWJhY2sgKi8KKyAgICAgICAgICBhdWRwYWQtPmF1ZHMuYXZfYnBzID0gR1NUX1JPVU5EX1VQXzggKGF1ZHBhZC0+YXVkcy5hdl9icHMgLSA0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChhdmltdXgsIFNUUkVBTSwgTVVYLAorICAgICAgICAgICAgICAoXygiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIikpLAorICAgICAgICAgICAgICAoTlVMTCkpOworICAgICAgICAgIGF1ZHBhZC0+YXVkcy5hdl9icHMgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBob3VzZWtlZXBpbmcgZm9yIHZiciBjYXNlICovCisgICAgICBpZiAoYXVkcGFkLT5tYXhfYXVkaW9fY2h1bmspCisgICAgICAgIGF1ZHBhZC0+YXVkcy5ibG9ja2FsaWduID0gYXVkcGFkLT5tYXhfYXVkaW9fY2h1bms7CisgICAgICBpZiAoYXVkcGFkLT5hdWRzLmJsb2NrYWxpZ24gPT0gMCkKKyAgICAgICAgYXVkcGFkLT5hdWRzLmJsb2NrYWxpZ24gPSAxOworICAgICAgLyogbm90ZSB0aGF0IGhkci5yYXRlIGlzIGFjdHVhbGx5IHVzZWQgYnkgZGVtdXggaW4gY2JyIGNhc2UgKi8KKyAgICAgIGlmIChhdmlwYWQtPmhkci5zY2FsZSA8PSAxKQorICAgICAgICBhdmlwYWQtPmhkci5yYXRlID0gYXVkcGFkLT5hdWRzLmF2X2JwcyAvIGF1ZHBhZC0+YXVkcy5ibG9ja2FsaWduOworICAgICAgYXZpbXV4LT5hdmlfaGRyLm1heF9icHMgKz0gYXVkcGFkLT5hdWRzLmF2X2JwczsKKyAgICAgIGF2aXBhZC0+aGRyLmxlbmd0aCA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoYXVkcGFkLT5hdWRpb190aW1lLAorICAgICAgICAgIGF2aXBhZC0+aGRyLnJhdGUsIGF2aXBhZC0+aGRyLnNjYWxlICogR1NUX1NFQ09ORCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdzdEF2aVZpZGVvUGFkICp2aWRwYWQgPSAoR3N0QXZpVmlkZW9QYWQgKikgYXZpcGFkOworCisgICAgICBhdmltdXgtPmF2aV9oZHIubWF4X2JwcyArPSAoKHZpZHBhZC0+dmlkcy5iaXRfY250ICsgNykgLyA4KSAqCisgICAgICAgICAgKDEwMDAwMDAuIC8gYXZpbXV4LT5hdmlfaGRyLnVzX2ZyYW1lKSAqIHZpZHBhZC0+dmlkcy5pbWFnZV9zaXplOworICAgICAgYXZpcGFkLT5oZHIubGVuZ3RoID0gYXZpbXV4LT50b3RhbF9mcmFtZXM7CisgICAgfQorICB9CisKKyAgLyogc3RhdGlzdGljcy90b3RhbF9mcmFtZXMvLi4uICovCisgIGF2aW11eC0+YXZpX2hkci50b3RfZnJhbWVzID0gYXZpbXV4LT5udW1fZnJhbWVzOworCisgIC8qIHNlZWsgYW5kIHJld3JpdGUgdGhlIGhlYWRlciAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAoYXZpbXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKworICAvKiB0aGUgZmlyc3QgZXJyb3Igc3Vydml2ZXMgKi8KKyAgaGVhZGVyID0gZ3N0X2F2aV9tdXhfcmlmZl9nZXRfYXZpX2hlYWRlciAoYXZpbXV4KTsKKyAgaWYgKHJlcyA9PSBHU1RfRkxPV19PSykKKyAgICByZXMgPSBnc3RfcGFkX3B1c2ggKGF2aW11eC0+c3JjcGFkLCBoZWFkZXIpOworICBlbHNlCisgICAgZ3N0X3BhZF9wdXNoIChhdmltdXgtPnNyY3BhZCwgaGVhZGVyKTsKKworICBzZWdtZW50LnN0YXJ0ID0gYXZpbXV4LT50b3RhbF9kYXRhOworICBzZWdtZW50LnRpbWUgPSBhdmltdXgtPnRvdGFsX2RhdGE7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAoYXZpbXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKworICBhdmltdXgtPndyaXRlX2hlYWRlciA9IFRSVUU7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hdmlfbXV4X3Jlc3RhcnRfZmlsZSAoR3N0QXZpTXV4ICogYXZpbXV4KQoreworICBHc3RGbG93UmV0dXJuIHJlczsKKworICBpZiAoKHJlcyA9IGdzdF9hdmlfbXV4X3N0b3BfZmlsZSAoYXZpbXV4KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJlczsKKworICBnc3RfcGFkX3B1c2hfZXZlbnQgKGF2aW11eC0+c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisKKyAgcmV0dXJuIGdzdF9hdmlfbXV4X3N0YXJ0X2ZpbGUgKGF2aW11eCk7Cit9CisKKy8qIGhhbmRsZSBldmVudHMgKHNlYXJjaCkgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F2aV9tdXhfaGFuZGxlX2V2ZW50IChHc3RDb2xsZWN0UGFkcyAqIHBhZHMsIEdzdENvbGxlY3REYXRhICogZGF0YSwKKyAgICBHc3RFdmVudCAqIGV2ZW50LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdEF2aU11eCAqYXZpbXV4OworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIGF2aW11eCA9IEdTVF9BVklfTVVYICh1c2VyX2RhdGEpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKyAgICAgIEdzdEF2aUNvbGxlY3REYXRhICpjb2xsZWN0X3BhZDsKKyAgICAgIEdzdEF2aVZpZGVvUGFkICphdmlwYWQ7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9jYXBzIChldmVudCwgJmNhcHMpOworCisgICAgICAvKiBmaW5kIHN0cmVhbSBkYXRhICovCisgICAgICBjb2xsZWN0X3BhZCA9IChHc3RBdmlDb2xsZWN0RGF0YSAqKSBkYXRhOworICAgICAgZ19hc3NlcnQgKGNvbGxlY3RfcGFkKTsKKyAgICAgIGF2aXBhZCA9IChHc3RBdmlWaWRlb1BhZCAqKSBjb2xsZWN0X3BhZC0+YXZpcGFkOworICAgICAgZ19hc3NlcnQgKGF2aXBhZCk7CisKKyAgICAgIGlmIChhdmlwYWQtPnBhcmVudC5pc192aWRlbykgeworICAgICAgICByZXQgPSBnc3RfYXZpX211eF92aWRzaW5rX3NldF9jYXBzIChkYXRhLT5wYWQsIGNhcHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gZ3N0X2F2aV9tdXhfYXVkc2lua19zZXRfY2FwcyAoZGF0YS0+cGFkLCBjYXBzKTsKKyAgICAgIH0KKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgZXZlbnQgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX1RBRzp7CisgICAgICBHc3RUYWdMaXN0ICpsaXN0OworICAgICAgR3N0VGFnU2V0dGVyICpzZXR0ZXIgPSBHU1RfVEFHX1NFVFRFUiAoYXZpbXV4KTsKKyAgICAgIGNvbnN0IEdzdFRhZ01lcmdlTW9kZSBtb2RlID0gZ3N0X3RhZ19zZXR0ZXJfZ2V0X3RhZ19tZXJnZV9tb2RlIChzZXR0ZXIpOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfdGFnIChldmVudCwgJmxpc3QpOworICAgICAgZ3N0X3RhZ19zZXR0ZXJfbWVyZ2VfdGFncyAoc2V0dGVyLCBsaXN0LCBtb2RlKTsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgZXZlbnQgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChldmVudCAhPSBOVUxMKQorICAgIHJldHVybiBnc3RfY29sbGVjdF9wYWRzX2V2ZW50X2RlZmF1bHQgKHBhZHMsIGRhdGEsIGV2ZW50LCBGQUxTRSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogc2VuZCBleHRyYSAncGFkZGluZycgZGF0YSAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hdmlfbXV4X3NlbmRfcGFkX2RhdGEgKEdzdEF2aU11eCAqIGF2aW11eCwgZ3Vsb25nIG51bV9ieXRlcykKK3sKKyAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChudW1fYnl0ZXMpOworICBnc3RfYnVmZmVyX21lbXNldCAoYnVmZmVyLCAwLCAwLCBudW1fYnl0ZXMpOworCisgIHJldHVybiBnc3RfcGFkX3B1c2ggKGF2aW11eC0+c3JjcGFkLCBidWZmZXIpOworfQorCisjZGVmaW5lIGdzdF9hdmlfbXV4X2lzX3VuY29tcHJlc3NlZChmb3VyY2MpCQlcCisgIChmb3VyY2MgPT0gR1NUX1JJRkZfRElCIHx8CQkJCVwKKyAgIGZvdXJjYyA9PSBHU1RfUklGRl9yZ2IgfHwJCQkJXAorICAgZm91cmNjID09IEdTVF9SSUZGX1JHQiB8fCBmb3VyY2MgPT0gR1NUX1JJRkZfUkFXKQorCisvKgorICogSGVscGVyIGZvciBnc3RfYXZpX2RlbXV4X2ludmVydCgpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc3dhcF9saW5lIChndWludDggKiBkMSwgZ3VpbnQ4ICogZDIsIGd1aW50OCAqIHRtcCwgZ2ludCBieXRlcykKK3sKKyAgbWVtY3B5ICh0bXAsIGQxLCBieXRlcyk7CisgIG1lbWNweSAoZDEsIGQyLCBieXRlcyk7CisgIG1lbWNweSAoZDIsIHRtcCwgYnl0ZXMpOworfQorCisvKgorICogSW52ZXJ0IERJQiBidWZmZXJzLi4uIFRha2VzIGV4aXN0aW5nIGJ1ZmZlciBhbmQKKyAqIHJldHVybnMgZWl0aGVyIHRoZSBidWZmZXIgb3IgYSBuZXcgb25lICh3aXRoIG9sZAorICogb25lIGRlcmVmZXJlbmNlZCkuCisgKiBGRk1QRUcgZG9lcyB0aGlzIGJ5IHNpbXBseSBuZWdhdGluZyB0aGUgaGVpZ2h0IGluIHRoZSBoZWFkZXIuIFNob3VsZCB3ZT8KKyAqIEZJWE1FOiBjYW4ndCB3ZSBwcmVhbGxvY2F0ZSB0bXA/IGFuZCByZW1lbWJlciBzdHJpZGUsIGJwcD8KKyAqICAgICAgICB0aGlzIGNvdWxkIGJlIGRvbmUgaW4gZG9fb25lX2J1ZmZlcigpIEkgc3VwcG9zZQorICovCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9hdmlfbXV4X2ludmVydCAoR3N0QXZpUGFkICogYXZpcGFkLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIGdpbnQgeSwgdywgaDsKKyAgZ2ludCBicHAsIHN0cmlkZTsKKyAgZ3VpbnQ4ICp0bXAgPSBOVUxMOworICBHc3RNYXBJbmZvIG1hcDsKKworICBHc3RBdmlWaWRlb1BhZCAqdmlkcGFkID0gKEdzdEF2aVZpZGVvUGFkICopIGF2aXBhZDsKKworICBoID0gdmlkcGFkLT52aWRzLmhlaWdodDsKKyAgdyA9IHZpZHBhZC0+dmlkcy53aWR0aDsKKyAgYnBwID0gdmlkcGFkLT52aWRzLmJpdF9jbnQgPyB2aWRwYWQtPnZpZHMuYml0X2NudCA6IDg7CisgIHN0cmlkZSA9IEdTVF9ST1VORF9VUF80ICh3ICogKGJwcCAvIDgpKTsKKworICBidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKGJ1Zik7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEV1JJVEUpOworICBpZiAobWFwLnNpemUgPCAoc3RyaWRlICogaCkpIHsKKyAgICBHU1RfV0FSTklORyAoIkJ1ZmZlciBpcyBzbWFsbGVyIHRoYW4gcmVwb3J0ZWQgV2lkdGggeCBIZWlnaHQgeCBEZXB0aCIpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorCisgIHRtcCA9IGdfbWFsbG9jIChzdHJpZGUpOworCisgIGZvciAoeSA9IDA7IHkgPCBoIC8gMjsgeSsrKSB7CisgICAgc3dhcF9saW5lIChtYXAuZGF0YSArIHN0cmlkZSAqIHksIG1hcC5kYXRhICsgc3RyaWRlICogKGggLSAxIC0geSksIHRtcCwKKyAgICAgICAgc3RyaWRlKTsKKyAgfQorCisgIGdfZnJlZSAodG1wKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIHJldHVybiBidWY7Cit9CisKKy8qIGRvIGJ1ZmZlciAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hdmlfbXV4X2RvX2J1ZmZlciAoR3N0QXZpTXV4ICogYXZpbXV4LCBHc3RBdmlQYWQgKiBhdmlwYWQpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzOworICBHc3RCdWZmZXIgKmRhdGEsICpoZWFkZXI7CisgIGd1bG9uZyB0b3RhbF9zaXplLCBwYWRfYnl0ZXMgPSAwOworICBndWludCBmbGFnczsKKyAgZ3NpemUgZGF0YXNpemU7CisgIEdzdENsb2NrVGltZSB0aW1lOworCisgIGRhdGEgPSBnc3RfY29sbGVjdF9wYWRzX3BvcCAoYXZpbXV4LT5jb2xsZWN0LCBhdmlwYWQtPmNvbGxlY3QpOworICAvKiBhcnJhbmdlIGRvd25zdHJlYW0gcnVubmluZyB0aW1lICovCisgIHRpbWUgPSBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZhdmlwYWQtPmNvbGxlY3QtPnNlZ21lbnQsCisgICAgICBHU1RfRk9STUFUX1RJTUUsIEdTVF9CVUZGRVJfVElNRVNUQU1QIChkYXRhKSk7CisgIGlmICh0aW1lICE9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChkYXRhKSkgeworICAgIGRhdGEgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKGRhdGEpOworICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChkYXRhKSA9IHRpbWU7CisgIH0KKworICAvKiBQcmVwZW5kIGEgc3BlY2lhbCBidWZmZXIgdG8gdGhlIGZpcnN0IG9uZSBmb3Igc29tZSBmb3JtYXRzICovCisgIGlmIChhdmlwYWQtPmlzX3ZpZGVvKSB7CisgICAgR3N0QXZpVmlkZW9QYWQgKnZpZHBhZCA9IChHc3RBdmlWaWRlb1BhZCAqKSBhdmlwYWQ7CisKKyAgICBpZiAodmlkcGFkLT5wcmVwZW5kX2J1ZmZlcikgeworICAgICAgLyogS2VlcCBhIHJlZmVyZW5jZSB0byBkYXRhIHVudGlsIHdlIGNvcHkgdGhlIHRpbWVzdGFtcHMsIHRoZW4gcmVsZWFzZSBpdCAqLworICAgICAgR3N0QnVmZmVyICpuZXdkYXRhID0KKyAgICAgICAgICBnc3RfYnVmZmVyX2FwcGVuZCAodmlkcGFkLT5wcmVwZW5kX2J1ZmZlciwgZ3N0X2J1ZmZlcl9yZWYgKGRhdGEpKTsKKyAgICAgIGdzdF9idWZmZXJfY29weV9pbnRvIChuZXdkYXRhLCBkYXRhLCBHU1RfQlVGRkVSX0NPUFlfVElNRVNUQU1QUywgMCwgLTEpOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoZGF0YSk7CisKKyAgICAgIGRhdGEgPSBuZXdkYXRhOworICAgICAgdmlkcGFkLT5wcmVwZW5kX2J1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgLyogRElCIGJ1ZmZlcnMgYXJlIHN0b3JlZCB0b3Bkb3duIChJIGRvbid0IGtub3cgd2h5KSAqLworICAgIGlmIChnc3RfYXZpX211eF9pc191bmNvbXByZXNzZWQgKGF2aXBhZC0+aGRyLmZjY19oYW5kbGVyKSkgeworICAgICAgZGF0YSA9IGdzdF9hdmlfbXV4X2ludmVydCAoYXZpcGFkLCBkYXRhKTsKKyAgICB9CisgIH0KKworICBpZiAoYXZpbXV4LT5yZXN0YXJ0KSB7CisgICAgaWYgKChyZXMgPSBnc3RfYXZpX211eF9yZXN0YXJ0X2ZpbGUgKGF2aW11eCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgZ290byBkb25lOworICB9CisKKyAgZGF0YXNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChkYXRhKTsKKworICAvKiBuZWVkIHRvIHJlc3RhcnQgb3Igc3RhcnQgYSBuZXh0IGF2aXggY2h1bmsgPyAqLworICBpZiAoKGF2aW11eC0+aXNfYmlnZmlsZSA/IGF2aW11eC0+ZGF0YXhfc2l6ZSA6IGF2aW11eC0+ZGF0YV9zaXplKSArCisgICAgICBkYXRhc2l6ZSA+IEdTVF9BVklfTUFYX1NJWkUpIHsKKyAgICBpZiAoYXZpbXV4LT5lbmFibGVfbGFyZ2VfYXZpKSB7CisgICAgICBpZiAoKHJlcyA9IGdzdF9hdmlfbXV4X2JpZ2ZpbGUgKGF2aW11eCwgRkFMU0UpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBkb25lOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoKHJlcyA9IGdzdF9hdmlfbXV4X3Jlc3RhcnRfZmlsZSAoYXZpbXV4KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgIH0KKworICAvKiBnZXQgaGVhZGVyIGFuZCByZWNvcmQgc29tZSBzdGF0cyAqLworICBpZiAoZGF0YXNpemUgJiAxKSB7CisgICAgcGFkX2J5dGVzID0gMiAtIChkYXRhc2l6ZSAmIDEpOworICB9CisgIGhlYWRlciA9IGdzdF9hdmlfbXV4X3JpZmZfZ2V0X2hlYWRlciAoYXZpcGFkLCBkYXRhc2l6ZSk7CisgIHRvdGFsX3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChoZWFkZXIpICsgZGF0YXNpemUgKyBwYWRfYnl0ZXM7CisKKyAgaWYgKGF2aW11eC0+aXNfYmlnZmlsZSkgeworICAgIGF2aW11eC0+ZGF0YXhfc2l6ZSArPSB0b3RhbF9zaXplOworICB9IGVsc2UgeworICAgIGF2aW11eC0+ZGF0YV9zaXplICs9IHRvdGFsX3NpemU7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoYXZpcGFkLT5ob29rKSkgeworICAgIGdzdF9idWZmZXJfcmVmIChkYXRhKTsKKyAgICBhdmlwYWQtPmhvb2sgKGF2aW11eCwgYXZpcGFkLCBkYXRhKTsKKyAgfQorCisgIC8qIHRoZSBzdWdnZXN0ZWQgYnVmZmVyIHNpemUgaXMgdGhlIG1heCBmcmFtZSBzaXplICovCisgIGlmIChhdmlwYWQtPmhkci5idWZzaXplIDwgZGF0YXNpemUpCisgICAgYXZpcGFkLT5oZHIuYnVmc2l6ZSA9IGRhdGFzaXplOworCisgIGlmIChhdmlwYWQtPmlzX3ZpZGVvKSB7CisgICAgYXZpbXV4LT50b3RhbF9mcmFtZXMrKzsKKworICAgIGlmIChhdmltdXgtPmlzX2JpZ2ZpbGUpIHsKKyAgICAgIGF2aW11eC0+bnVteF9mcmFtZXMrKzsKKyAgICB9IGVsc2UgeworICAgICAgYXZpbXV4LT5udW1fZnJhbWVzKys7CisgICAgfQorCisgICAgZmxhZ3MgPSAweDAyOworICAgIGlmICghR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoZGF0YSwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpKQorICAgICAgZmxhZ3MgfD0gMHgxMDsKKyAgfSBlbHNlIHsKKyAgICBHc3RBdmlBdWRpb1BhZCAqYXVkcGFkID0gKEdzdEF2aUF1ZGlvUGFkICopIGF2aXBhZDsKKworICAgIGZsYWdzID0gMDsKKyAgICBhdWRwYWQtPmF1ZGlvX3NpemUgKz0gZGF0YXNpemU7CisgICAgYXVkcGFkLT5hdWRpb190aW1lICs9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGRhdGEpOworICAgIGlmIChhdWRwYWQtPm1heF9hdWRpb19jaHVuayAmJiBkYXRhc2l6ZSA+IGF1ZHBhZC0+bWF4X2F1ZGlvX2NodW5rKQorICAgICAgYXVkcGFkLT5tYXhfYXVkaW9fY2h1bmsgPSBkYXRhc2l6ZTsKKyAgfQorCisgIGdzdF9hdmlfbXV4X2FkZF9pbmRleCAoYXZpbXV4LCBhdmlwYWQsIGZsYWdzLCBkYXRhc2l6ZSk7CisKKyAgLyogc2VuZCBidWZmZXJzICovCisgIEdTVF9MT0dfT0JKRUNUIChhdmltdXgsICJwdXNoaW5nIGJ1ZmZlcnM6IGhlYWQsIGRhdGEiKTsKKworICBpZiAoKHJlcyA9IGdzdF9wYWRfcHVzaCAoYXZpbXV4LT5zcmNwYWQsIGhlYWRlcikpICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gZG9uZTsKKworICBnc3RfYnVmZmVyX3JlZiAoZGF0YSk7CisgIGlmICgocmVzID0gZ3N0X3BhZF9wdXNoIChhdmltdXgtPnNyY3BhZCwgZGF0YSkpICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gZG9uZTsKKworICBpZiAocGFkX2J5dGVzKSB7CisgICAgaWYgKChyZXMgPSBnc3RfYXZpX211eF9zZW5kX3BhZF9kYXRhIChhdmltdXgsIHBhZF9ieXRlcykpICE9IEdTVF9GTE9XX09LKQorICAgICAgZ290byBkb25lOworICB9CisKKyAgLyogaWYgYW55IHB1c2ggYWJvdmUgZmFpbHMsIHdlJ3JlIGluIHRyb3VibGUgd2l0aCBmaWxlIGNvbnNpc3RlbmN5IGFueXdheSAqLworICBhdmltdXgtPnRvdGFsX2RhdGEgKz0gdG90YWxfc2l6ZTsKKyAgYXZpbXV4LT5pZHhfb2Zmc2V0ICs9IHRvdGFsX3NpemU7CisKK2RvbmU6CisgIGdzdF9idWZmZXJfdW5yZWYgKGRhdGEpOworICByZXR1cm4gcmVzOworfQorCisvKiBwaWNrIHRoZSBvbGRlc3QgYnVmZmVyIGZyb20gdGhlIHBhZHMgYW5kIHB1c2ggaXQgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYXZpX211eF9kb19vbmVfYnVmZmVyIChHc3RBdmlNdXggKiBhdmltdXgpCit7CisgIEdzdEF2aVBhZCAqYXZpcGFkLCAqYmVzdF9wYWQ7CisgIEdTTGlzdCAqbm9kZTsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIEdzdENsb2NrVGltZSB0aW1lLCBiZXN0X3RpbWUsIGRlbGF5OworCisgIG5vZGUgPSBhdmltdXgtPnNpbmtwYWRzOworICBiZXN0X3BhZCA9IE5VTEw7CisgIGJlc3RfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGZvciAoOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgIGF2aXBhZCA9IChHc3RBdmlQYWQgKikgbm9kZS0+ZGF0YTsKKworICAgIGlmICghYXZpcGFkLT5jb2xsZWN0KQorICAgICAgY29udGludWU7CisKKyAgICBidWZmZXIgPSBnc3RfY29sbGVjdF9wYWRzX3BlZWsgKGF2aW11eC0+Y29sbGVjdCwgYXZpcGFkLT5jb2xsZWN0KTsKKyAgICBpZiAoIWJ1ZmZlcikKKyAgICAgIGNvbnRpbnVlOworICAgIHRpbWUgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgICAgLyogaW52YWxpZCBzaG91bGQgcGFzcyAqLworICAgIGlmIChHX0xJS0VMWSAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHRpbWUpKSkgeworICAgICAgdGltZSA9IGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJmF2aXBhZC0+Y29sbGVjdC0+c2VnbWVudCwKKyAgICAgICAgICBHU1RfRk9STUFUX1RJTUUsIHRpbWUpOworICAgICAgaWYgKEdfVU5MSUtFTFkgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAodGltZSkpKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aW11eCwgImNsaXBwaW5nIGJ1ZmZlciBvbiBwYWQgJXMgb3V0c2lkZSBzZWdtZW50IiwKKyAgICAgICAgICAgIEdTVF9QQURfTkFNRSAoYXZpcGFkLT5jb2xsZWN0LT5wYWQpKTsKKyAgICAgICAgYnVmZmVyID0gZ3N0X2NvbGxlY3RfcGFkc19wb3AgKGF2aW11eC0+Y29sbGVjdCwgYXZpcGFkLT5jb2xsZWN0KTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgICAgfQorICAgIH0KKworICAgIGRlbGF5ID0gYXZpcGFkLT5pc192aWRlbyA/IEdTVF9TRUNPTkQgLyAyIDogMDsKKworICAgIC8qIGludmFsaWQgdGltZXN0YW1wIGJ1ZmZlcnMgcGFzcyBmaXJzdCwKKyAgICAgKiB0aGVzZSBhcmUgcHJvYmFibHkgaW5pdGlhbGl6YXRpb24gYnVmZmVycyAqLworICAgIGlmIChiZXN0X3BhZCA9PSBOVUxMIHx8ICFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAodGltZSkKKyAgICAgICAgfHwgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChiZXN0X3RpbWUpICYmIHRpbWUgKyBkZWxheSA8IGJlc3RfdGltZSkpIHsKKyAgICAgIGJlc3RfcGFkID0gYXZpcGFkOworICAgICAgYmVzdF90aW1lID0gdGltZSArIGRlbGF5OworICAgIH0KKyAgfQorCisgIGlmIChiZXN0X3BhZCkgeworICAgIEdTVF9MT0dfT0JKRUNUIChhdmltdXgsICJzZWxlY3RlZCBwYWQgJXMgd2l0aCB0aW1lICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1BBRF9OQU1FIChiZXN0X3BhZC0+Y29sbGVjdC0+cGFkKSwgR1NUX1RJTUVfQVJHUyAoYmVzdF90aW1lKSk7CisKKyAgICByZXR1cm4gZ3N0X2F2aV9tdXhfZG9fYnVmZmVyIChhdmltdXgsIGJlc3RfcGFkKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBzaW1wbHkgZmluaXNoIG9mZiB0aGUgZmlsZSBhbmQgc2VuZCBFT1MgKi8KKyAgICBnc3RfYXZpX211eF9zdG9wX2ZpbGUgKGF2aW11eCk7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChhdmltdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisgIH0KKworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9tdXhfY29sbGVjdF9wYWRzIChHc3RDb2xsZWN0UGFkcyAqIHBhZHMsIEdzdEF2aU11eCAqIGF2aW11eCkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXM7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGF2aW11eC0+d3JpdGVfaGVhZGVyKSkgeworICAgIGlmICgocmVzID0gZ3N0X2F2aV9tdXhfc3RhcnRfZmlsZSAoYXZpbXV4KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICByZXR1cm4gcmVzOworICB9CisKKyAgcmV0dXJuIGdzdF9hdmlfbXV4X2RvX29uZV9idWZmZXIgKGF2aW11eCk7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9hdmlfbXV4X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdmlNdXggKmF2aW11eDsKKworICBhdmltdXggPSBHU1RfQVZJX01VWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQklHRklMRToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBhdmltdXgtPmVuYWJsZV9sYXJnZV9hdmkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9tdXhfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEF2aU11eCAqYXZpbXV4OworCisgIGF2aW11eCA9IEdTVF9BVklfTVVYIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9CSUdGSUxFOgorICAgICAgYXZpbXV4LT5lbmFibGVfbGFyZ2VfYXZpID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9hdmlfbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdEF2aU11eCAqYXZpbXV4OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgYXZpbXV4ID0gR1NUX0FWSV9NVVggKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfY29sbGVjdF9wYWRzX3N0YXJ0IChhdmltdXgtPmNvbGxlY3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19QTEFZSU5HOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9jb2xsZWN0X3BhZHNfc3RvcCAoYXZpbXV4LT5jb2xsZWN0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkKKyAgICBnb3RvIGRvbmU7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9hdmlfbXV4X3Jlc2V0IChhdmltdXgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworZG9uZToKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2dzdC9hdmkvZ3N0YXZpbXV4LmggYi9nc3QvYXZpL2dzdGF2aW11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZDUzNDMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXZpL2dzdGF2aW11eC5oCkBAIC0wLDAgKzEsMTk4IEBACisvKiBBVkkgbXV4ZXIgcGx1Z2luIGZvciBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX0FWSV9NVVhfSF9fCisjZGVmaW5lIF9fR1NUX0FWSV9NVVhfSF9fCisKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3Rjb2xsZWN0cGFkcy5oPgorI2luY2x1ZGUgPGdzdC9yaWZmL3JpZmYtaWRzLmg+CisjaW5jbHVkZSAiYXZpLWlkcy5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQVZJX01VWCBcCisgIChnc3RfYXZpX211eF9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVZJX01VWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0FWSV9NVVgsR3N0QXZpTXV4KSkKKyNkZWZpbmUgR1NUX0FWSV9NVVhfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfQVZJX01VWCxHc3RBdmlNdXhDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BVklfTVVYKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQVZJX01VWCkpCisjZGVmaW5lIEdTVF9JU19BVklfTVVYX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0FWSV9NVVgpKQorCisjZGVmaW5lIEdTVF9BVklfSU5ERVhfT0ZfSU5ERVhFUyAgICAgMAorI2RlZmluZSBHU1RfQVZJX0lOREVYX09GX0NIVU5LUyAgICAgIDEKKworLyogdGhpcyBhbGxvd3MgaW5kZXhpbmcgdXAgdG8gNjRHQiBhdmkgZmlsZSAqLworI2RlZmluZSBHU1RfQVZJX1NVUEVSSU5ERVhfQ09VTlQgICAgMzIKKworLyogbWF4IHNpemUgKi8KKyNkZWZpbmUgR1NUX0FWSV9NQVhfU0laRSAgICAweDQwMDAwMDAwCisKK3R5cGVkZWYgc3RydWN0IF9nc3RfYXZpX3N1cGVyaW5kZXhfZW50cnkgeworICBndWludDY0IG9mZnNldDsKKyAgZ3VpbnQzMiBzaXplOworICBndWludDMyIGR1cmF0aW9uOworfSBnc3RfYXZpX3N1cGVyaW5kZXhfZW50cnk7CisKK3R5cGVkZWYgc3RydWN0IF9nc3RfcmlmZl9zdHJoX2Z1bGwgeworICBnc3RfcmlmZl9zdHJoICBwYXJlbnQ7CisgIC8qIHJjRnJhbWUsIFJFQ1Qgc3RydWN0dXJlIChzdHJ1Y3Qgb2YgNCBzaG9ydHMpICovCisgIGdpbnQxNiAgbGVmdDsKKyAgZ2ludDE2ICB0b3A7CisgIGdpbnQxNiAgcmlnaHQ7CisgIGdpbnQxNiAgYm90dG9tOworfSBnc3RfcmlmZl9zdHJoX2Z1bGw7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdmlQYWQgR3N0QXZpUGFkOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF2aU11eCBHc3RBdmlNdXg7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXZpTXV4Q2xhc3MgR3N0QXZpTXV4Q2xhc3M7CisKK3R5cGVkZWYgR3N0Rmxvd1JldHVybiAoKkdzdEF2aVBhZEhvb2spIChHc3RBdmlNdXggKiBhdmksIEdzdEF2aVBhZCAqIGF2aXBhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworCitzdHJ1Y3QgX0dzdEF2aVBhZCB7CisgIC8qIGRvIG5vdCBleHRlbmQsIGxpbmsgdG8gaXQgKi8KKyAgLyogaXMgTlVMTCBpZiBvcmlnaW5hbCBzaW5rIHJlcXVlc3QgcGFkIGhhcyBiZWVuIHJlbW92ZWQgKi8KKyAgR3N0Q29sbGVjdERhdGEgKmNvbGxlY3Q7CisKKyAgLyogdHlwZSAqLworICBnYm9vbGVhbiBpc192aWRlbzsKKyAgZ2Jvb2xlYW4gY29ubmVjdGVkOworCisgIC8qIGNodW5rIHRhZyAqLworICBnY2hhciAqdGFnOworCisgIC8qIHN0cmVhbSBoZWFkZXIgKi8KKyAgZ3N0X3JpZmZfc3RyaCBoZHI7CisKKyAgLyogb2RtbCBzdXBlciBpbmRleGVzICovCisgIGdzdF9hdmlfc3VwZXJpbmRleF9lbnRyeSBpZHhbR1NUX0FWSV9TVVBFUklOREVYX0NPVU5UXTsKKyAgZ2ludCBpZHhfaW5kZXg7CisgIGdjaGFyICppZHhfdGFnOworCisgIC8qIHN0cmVhbSBzcGVjaWZpYyBob29rICovCisgIEdzdEF2aVBhZEhvb2sgaG9vazsKK307CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdmlWaWRlb1BhZCB7CisgIEdzdEF2aVBhZCBwYXJlbnQ7CisKKyAgLyogc3RyZWFtIGZvcm1hdCAqLworICBnc3RfcmlmZl9zdHJmX3ZpZHMgdmlkczsKKyAgLyogZXh0cmEgZGF0YSAqLworICBHc3RCdWZmZXIgKnZpZHNfY29kZWNfZGF0YTsKKyAgLyogT0RNTCB2aWRlbyBwcm9wZXJ0aWVzICovCisgIGdzdF9yaWZmX3ZwcnAgdnBycDsKKworICBHc3RCdWZmZXIgKnByZXBlbmRfYnVmZmVyOworCit9IEdzdEF2aVZpZGVvUGFkOworCit0eXBlZGVmIHN0cnVjdCBfR3N0QXZpQXVkaW9QYWQgeworICBHc3RBdmlQYWQgcGFyZW50OworCisgIC8qIHN0cmVhbSBmb3JtYXQgKi8KKyAgZ3N0X3JpZmZfc3RyZl9hdWRzIGF1ZHM7CisgIC8qIGF1ZGlvIGluZm8gZm9yIGJwcyBjYWxjdWxhdGlvbiAqLworICBndWludDMyIGF1ZGlvX3NpemU7CisgIGd1aW50NjQgYXVkaW9fdGltZTsKKyAgLyogbWF4IGF1ZGlvIGNodW5rIHNpemUgZm9yIHZiciAqLworICBndWludDMyIG1heF9hdWRpb19jaHVuazsKKworICAvKiBjb3VudHMgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHB1dCBpbiBpbmR4IGNodW5rCisgICAqIHVzZWZ1bCBmb3IgcmF3IGF1ZGlvIHdoZXJlIHVzdWFsbHkgdGhlcmUgYXJlIG1vcmUgdGhhbgorICAgKiAxIHNhbXBsZSBpbiBlYWNoIEdzdEJ1ZmZlciAqLworICBnaW50IHNhbXBsZXM7CisKKyAgLyogZXh0cmEgZGF0YSAqLworICBHc3RCdWZmZXIgKmF1ZHNfY29kZWNfZGF0YTsKK30gR3N0QXZpQXVkaW9QYWQ7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdmlDb2xsZWN0RGF0YSB7CisgIC8qIGV4dGVuZCB0aGUgQ29sbGVjdERhdGEgKi8KKyAgR3N0Q29sbGVjdERhdGEgY29sbGVjdDsKKworICBHc3RBdmlQYWQgICAgICAqYXZpcGFkOworfSBHc3RBdmlDb2xsZWN0RGF0YTsKKworc3RydWN0IF9Hc3RBdmlNdXggeworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgLyogcGFkcyAqLworICBHc3RQYWQgICAgICAgICAgICAgICpzcmNwYWQ7CisgIC8qIHNpbmtwYWRzLCB2aWRlbyBmaXJzdCAqLworICBHU0xpc3QgICAgICAgICAgICAgICpzaW5rcGFkczsKKyAgLyogdmlkZW8gcmVzdHJpY3RlZCB0byAxIHBhZCAqLworICBndWludCAgICAgICAgICAgICAgIHZpZGVvX3BhZHMsIGF1ZGlvX3BhZHM7CisgIEdzdENvbGxlY3RQYWRzICAgICAqY29sbGVjdDsKKworICAvKiB0aGUgQVZJIGhlYWRlciAqLworICAvKiBzdGlsbCBzb21lIHNpbmdsZSBzdHJlYW0gdmlkZW8gZGF0YSBpbiBtdXggc3RydWN0ICovCisgIGdzdF9yaWZmX2F2aWggYXZpX2hkcjsKKyAgLyogdG90YWwgbnVtYmVyIG9mICh2aWRlbykgZnJhbWVzICovCisgIGd1aW50MzIgdG90YWxfZnJhbWVzOworICAvKiBhbW91bnQgb2YgdG90YWwgZGF0YSAoYnl0ZXMpICovCisgIGd1aW50NjQgdG90YWxfZGF0YTsKKyAgLyogYW1vdW50IG9mIGRhdGEgKGJ5dGVzKSBpbiB0aGUgQVZJL0FWSVggYmxvY2s7CisgICAqIGFjdHVhbGx5IHRoZSBtb3ZpIGxpc3QsIHNvIGNvdW50ZWQgZnJvbSBhbmQgaW5jbHVkaW5nIHRoZSBtb3ZpIHRhZyAqLworICBndWludDMyIGRhdGFfc2l6ZSwgZGF0YXhfc2l6ZTsKKyAgLyogbnVtICh2aWRlbykgZnJhbWVzIGluIHRoZSBBVkkvQVZJWCBibG9jayAqLworICBndWludDMyIG51bV9mcmFtZXMsIG51bXhfZnJhbWVzOworICAvKiBzaXplIG9mIGhkcmwgbGlzdCwgaW5jbHVkaW5nIHRhZyBhcyB1c3VhbCAqLworCisgIC8qIHRvdGFsIHNpemUgb2YgZXh0cmEgY29kZWMgZGF0YSAqLworICBndWludDMyIGNvZGVjX2RhdGFfc2l6ZTsKKyAgLyogc3RhdGUgaW5mbyAqLworICBnYm9vbGVhbiB3cml0ZV9oZWFkZXI7CisgIGdib29sZWFuIHJlc3RhcnQ7CisKKyAgLyogdGFncyAqLworICBHc3RUYWdMaXN0ICp0YWdzX3NuYXA7CisKKyAgLyogaW5mb3JtYXRpb24gYWJvdXQgdGhlIEFWSSBpbmRleCAoJ2lkeCcpICovCisgIGdzdF9yaWZmX2luZGV4X2VudHJ5ICppZHg7CisgIGdpbnQgaWR4X2luZGV4LCBpZHhfY291bnQ7CisgIC8qIG9mZnNldCBvZiAqY2h1bmsqIChyZWxhdGl2ZSB0byBhIGJhc2Ugb2Zmc2V0KTsgZW50ZXJlZCBpbiB0aGUgaW5kZXggKi8KKyAgZ3VpbnQzMiBpZHhfb2Zmc2V0OworICAvKiBzaXplIG9mIGlkeDEgY2h1bmsgKGluY2x1ZGluZyEgY2h1bmsgaGVhZGVyIGFuZCBzaXplIGJ5dGVzKSAqLworICBndWludDMyIGlkeF9zaXplOworCisgIC8qIGFyZSB3ZSBhIGJpZyBmaWxlIGFscmVhZHk/ICovCisgIGdib29sZWFuIGlzX2JpZ2ZpbGU7CisgIGd1aW50NjQgYXZpeF9zdGFydDsKKworICAvKiB3aGV0aGVyIHRvIHVzZSAibGFyZ2UgQVZJIGZpbGVzIiBvciBqdXN0IHN0aWNrIHRvIHNtYWxsIGluZGV4ZWQgZmlsZXMgKi8KKyAgZ2Jvb2xlYW4gZW5hYmxlX2xhcmdlX2F2aTsKK307CisKK3N0cnVjdCBfR3N0QXZpTXV4Q2xhc3MgeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2F2aV9tdXhfZ2V0X3R5cGUodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKworI2VuZGlmIC8qIF9fR1NUX0FWSV9NVVhfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmMgYi9nc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVjOWNjYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYwpAQCAtMCwwICsxLDM4OSBAQAorLyogR1N0cmVhbWVyIEFWSSBHQUIyIHN1YnRpdGxlIHBhcnNlcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXZpc3VidGl0bGUKKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8cGFyYT4KKyAqIFBhcnNlcyB0aGUgc3VidGl0bGUgc3RyZWFtIGZyb20gYW4gYXZpIGZpbGUuCisgKiA8L3BhcmE+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiA8cGFyYT4KKyAqIDxwcm9ncmFtbGlzdGluZz4KKyAqIGdzdC1sYXVuY2gtMS4wIGZpbGVzcmMgbG9jYXRpb249c3VidGl0bGUuYXZpICEgYXZpZGVtdXggbmFtZT1kZW11eCAhIHF1ZXVlICEgYXZpc3VidGl0bGUgISBzdWJwYXJzZSAhIHRleHRvdmVybGF5IG5hbWU9b3ZlcmxheSAhIHZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsgZGVtdXguICEgcXVldWUgISBkZWNvZGViaW4gISBvdmVybGF5LgorICogPC9wcm9ncmFtbGlzdGluZz4KKyAqIFRoaXMgcGxheXMgYW4gYXZpIGZpbGUgd2l0aCBhIHZpZGVvIGFuZCBzdWJ0aXRsZSBzdHJlYW0uCisgKiA8L3BhcmE+CisgKiA8L3JlZnNlY3QyPgorICovCisKKy8qIGV4YW1wbGUgb2YgYSBzdWJ0aXRsZSBjaHVuayBpbiBhbiBhdmkgZmlsZQorICogMDAwMDAwMDA6IDQ3IDQxIDQyIDMyIDAwIDAyIDAwIDEwIDAwIDAwIDAwIDQ1IDAwIDZlIDAwIDY3ICBHQUIyLi4uLi4uLkUubi5nCisgKiAwMDAwMDAxMDogMDAgNmMgMDAgNjkgMDAgNzMgMDAgNjggMDAgMDAgMDAgMDQgMDAgOGUgMDAgMDAgIC5sLmkucy5oLi4uLi4uLi4KKyAqIDAwMDAwMDIwOiAwMCBlZiBiYiBiZiAzMSAwZCAwYSAzMCAzMCAzYSAzMCAzMCAzYSAzMCAzMCAyYyAgLi4uLjEuLjAwOjAwOjAwLAorICogMDAwMDAwMzA6IDMxIDMwIDMwIDIwIDJkIDJkIDNlIDIwIDMwIDMwIDNhIDMwIDMwIDNhIDMwIDMyICAxMDAgLS0+IDAwOjAwOjAyCisgKiAwMDAwMDA0MDogMmMgMzAgMzAgMzAgMGQgMGEgM2MgNjIgM2UgNDEgNmUgMjAgNTUgNTQgNDYgMzggICwwMDAuLjxiPkFuIFVURjgKKyAqIDAwMDAwMDUwOiAyMCA1MyA3NSA2MiA3NCA2OSA3NCA2YyA2NSAyMCA3NyA2OSA3NCA2OCAyMCA0MiAgIFN1YnRpdGxlIHdpdGggQgorICogMDAwMDAwNjA6IDRmIDRkIDNjIDJmIDYyIDNlIDBkIDBhIDBkIDBhIDMyIDBkIDBhIDMwIDMwIDNhICBPTTwvYj4uLi4uMi4uMDA6CisgKiAwMDAwMDA3MDogMzAgMzAgM2EgMzAgMzIgMmMgMzEgMzAgMzAgMjAgMmQgMmQgM2UgMjAgMzAgMzAgIDAwOjAyLDEwMCAtLT4gMDAKKyAqIDAwMDAwMDgwOiAzYSAzMCAzMCAzYSAzMCAzNCAyYyAzMCAzMCAzMCAwZCAwYSA1MyA2ZiA2ZCA2NSAgOjAwOjA0LDAwMC4uU29tZQorICogMDAwMDAwOTA6IDc0IDY4IDY5IDZlIDY3IDIwIDZlIDZmIDZlIDQxIDUzIDQzIDQ5IDQ5IDIwIDJkICB0aGluZyBub25BU0NJSSAtCisgKiAwMDAwMDBhMDogMjAgYzIgYjUgYzMgYjYgYzMgYTQgYzMgYmMgYzMgOWYgMGQgMGEgMGQgMGEgICAgICAuLi4uLi4uLi4uLi4uLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0YXZpc3VidGl0bGUuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoYXZpc3VidGl0bGVfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgYXZpc3VidGl0bGVfZGVidWcKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXN1YnRpdGxlLWF2aSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXN1YnRpdGxlIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfYXZpX3N1YnRpdGxlX3RpdGxlX3RhZyAoR3N0QXZpU3VidGl0bGUgKiBzdWIsIGdjaGFyICogdGl0bGUpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2F2aV9zdWJ0aXRsZV9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfYXZpX3N1YnRpdGxlX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F2aV9zdWJ0aXRsZV9zZW5kX2V2ZW50IChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworI2RlZmluZSBnc3RfYXZpX3N1YnRpdGxlX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdEF2aVN1YnRpdGxlLCBnc3RfYXZpX3N1YnRpdGxlLCBHU1RfVFlQRV9FTEVNRU5UKTsKKworI2RlZmluZSBJU19CT01fVVRGOChkYXRhKSAgICAgKChHU1RfUkVBRF9VSU5UMzJfQkUoZGF0YSkgPj4gOCkgPT0gMHhFRkJCQkYpCisjZGVmaW5lIElTX0JPTV9VVEYxNl9CRShkYXRhKSAoR1NUX1JFQURfVUlOVDE2X0JFKGRhdGEpID09IDB4RkVGRikKKyNkZWZpbmUgSVNfQk9NX1VURjE2X0xFKGRhdGEpIChHU1RfUkVBRF9VSU5UMTZfTEUoZGF0YSkgPT0gMHhGRUZGKQorI2RlZmluZSBJU19CT01fVVRGMzJfQkUoZGF0YSkgKEdTVF9SRUFEX1VJTlQzMl9CRShkYXRhKSA9PSAweEZFRkYpCisjZGVmaW5lIElTX0JPTV9VVEYzMl9MRShkYXRhKSAoR1NUX1JFQURfVUlOVDMyX0xFKGRhdGEpID09IDB4RkVGRikKKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfYXZpX3N1YnRpdGxlX2V4dHJhY3RfZmlsZSAoR3N0QXZpU3VidGl0bGUgKiBzdWIsIEdzdEJ1ZmZlciAqIGJ1ZmZlciwKKyAgICBndWludCBvZmZzZXQsIGd1aW50IGxlbikKK3sKKyAgY29uc3QgZ2NoYXIgKmlucHV0X2VuYyA9IE5VTEw7CisgIEdzdEJ1ZmZlciAqcmV0ID0gTlVMTDsKKyAgZ2NoYXIgKmRhdGE7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRhdGEgPSAoZ2NoYXIgKikgKG1hcC5kYXRhICsgb2Zmc2V0KTsKKworICBpZiAobGVuID49ICgzICsgMSkgJiYgSVNfQk9NX1VURjggKGRhdGEpICYmCisgICAgICBnX3V0ZjhfdmFsaWRhdGUgKGRhdGEgKyAzLCBsZW4gLSAzLCBOVUxMKSkgeworICAgIHJldCA9CisgICAgICAgIGdzdF9idWZmZXJfY29weV9yZWdpb24gKGJ1ZmZlciwgR1NUX0JVRkZFUl9DT1BZX0FMTCwgb2Zmc2V0ICsgMywKKyAgICAgICAgbGVuIC0gMyk7CisgIH0gZWxzZSBpZiAobGVuID49IDIgJiYgSVNfQk9NX1VURjE2X0JFIChkYXRhKSkgeworICAgIGlucHV0X2VuYyA9ICJVVEYtMTZCRSI7CisgICAgZGF0YSArPSAyOworICAgIGxlbiAtPSAyOworICB9IGVsc2UgaWYgKGxlbiA+PSAyICYmIElTX0JPTV9VVEYxNl9MRSAoZGF0YSkpIHsKKyAgICBpbnB1dF9lbmMgPSAiVVRGLTE2TEUiOworICAgIGRhdGEgKz0gMjsKKyAgICBsZW4gLT0gMjsKKyAgfSBlbHNlIGlmIChsZW4gPj0gNCAmJiBJU19CT01fVVRGMzJfQkUgKGRhdGEpKSB7CisgICAgaW5wdXRfZW5jID0gIlVURi0zMkJFIjsKKyAgICBkYXRhICs9IDQ7CisgICAgbGVuIC09IDQ7CisgIH0gZWxzZSBpZiAobGVuID49IDQgJiYgSVNfQk9NX1VURjMyX0xFIChkYXRhKSkgeworICAgIGlucHV0X2VuYyA9ICJVVEYtMzJMRSI7CisgICAgZGF0YSArPSA0OworICAgIGxlbiAtPSA0OworICB9IGVsc2UgaWYgKGdfdXRmOF92YWxpZGF0ZSAoZGF0YSwgbGVuLCBOVUxMKSkgeworICAgIC8qIG5vdCBzcGVjaWZpZWQsIGNoZWNrIGlmIGl0J3MgVVRGLTggKi8KKyAgICByZXQgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIG9mZnNldCwgbGVuKTsKKyAgfSBlbHNlIHsKKyAgICAvKiB3ZSBjb3VsZCBmYWxsIGJhY2sgdG8gZ3N0X3RhZ19mcmVlZm9ybV90b191dGY4KCkgaGVyZSAqLworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3ViLCAidW5zcGVjaWZpZWQgZW5jb2RpbmcsIGFuZCBub3QgVVRGLTgiKTsKKyAgICByZXQgPSBOVUxMOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChyZXQgIT0gTlVMTCB8fCBpbnB1dF9lbmMgIT0gTlVMTCwgTlVMTCk7CisKKyAgaWYgKGlucHV0X2VuYykgeworICAgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgICBnY2hhciAqdXRmODsKKyAgICBnc2l6ZSBzbGVuOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3ViLCAiY29udmVydGluZyBzdWJ0aXRsZXMgZnJvbSAlcyB0byBVVEYtOCIsIGlucHV0X2VuYyk7CisgICAgdXRmOCA9IGdfY29udmVydCAoZGF0YSwgbGVuLCAiVVRGLTgiLCBpbnB1dF9lbmMsIE5VTEwsIE5VTEwsICZlcnIpOworCisgICAgaWYgKGVyciAhPSBOVUxMKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHN1YiwgImNvbnZlcnNpb24gdG8gVVRGLTggZmFpbGVkIDogJXMiLCBlcnItPm1lc3NhZ2UpOworICAgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICAgICAgcmV0ID0gTlVMTDsKKyAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICByZXQgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgICBzbGVuID0gc3RybGVuICh1dGY4KTsKKyAgICBnc3RfYnVmZmVyX2FwcGVuZF9tZW1vcnkgKHJldCwKKyAgICAgICAgZ3N0X21lbW9yeV9uZXdfd3JhcHBlZCAoMCwgdXRmOCwgc2xlbiwgMCwgc2xlbiwgdXRmOCwgZ19mcmVlKSk7CisKKyAgICBHU1RfQlVGRkVSX09GRlNFVCAocmV0KSA9IDA7CisgIH0KKworZG9uZToKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIGdzdF9hdmlfc3VidGl0bGVfdGl0bGVfdGFnOgorICogQHN1Yjogc3VidGl0bGUgZWxlbWVudAorICogQHRpdGxlOiB0aGUgdGl0bGUgb2YgdGhpcyBzdWJ0aXRsZSBzdHJlYW0KKyAqCisgKiBTZW5kIGFuIGV2ZW50IHRvIHRoZSBzcmNwYWQgb2YgdGhlIEBzdWIgZWxlbWVudCB3aXRoIHRoZSB0aXRsZQorICogb2YgdGhlIHN1YnRpdGxlIHN0cmVhbSBhcyBhIEdTVF9UQUdfVElUTEUKKyAqLworc3RhdGljIHZvaWQKK2dzdF9hdmlfc3VidGl0bGVfdGl0bGVfdGFnIChHc3RBdmlTdWJ0aXRsZSAqIHN1YiwgZ2NoYXIgKiB0aXRsZSkKK3sKKyAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzdWItPnNyYywKKyAgICAgIGdzdF9ldmVudF9uZXdfdGFnIChnc3RfdGFnX2xpc3RfbmV3IChHU1RfVEFHX1RJVExFLCB0aXRsZSwgTlVMTCkpKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hdmlfc3VidGl0bGVfcGFyc2VfZ2FiMl9jaHVuayAoR3N0QXZpU3VidGl0bGUgKiBzdWIsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgZ2NoYXIgKm5hbWVfdXRmODsKKyAgZ3VpbnQgbmFtZV9sZW5ndGg7CisgIGd1aW50IGZpbGVfbGVuZ3RoOworICBHc3RNYXBJbmZvIG1hcDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIC8qIGNoZWNrIHRoZSBtYWdpYyB3b3JkICJHQUIyXDAiLCBhbmQgdGhlIG5leHQgd29yZCBtdXN0IGJlIDIgKi8KKyAgaWYgKG1hcC5zaXplIDwgMTIgfHwgbWVtY21wIChtYXAuZGF0YSwgIkdBQjJcMFwyXDAiLCA1ICsgMikgIT0gMCkKKyAgICBnb3RvIHdyb25nX21hZ2ljX3dvcmQ7CisKKyAgLyogcmVhZCAnbmFtZScgb2Ygc3VidGl0bGUgKi8KKyAgbmFtZV9sZW5ndGggPSBHU1RfUkVBRF9VSU5UMzJfTEUgKG1hcC5kYXRhICsgNSArIDIpOworICBHU1RfTE9HX09CSkVDVCAoc3ViLCAibGVuZ3RoIG9mIG5hbWU6ICV1IiwgbmFtZV9sZW5ndGgpOworICBpZiAobWFwLnNpemUgPD0gMTcgKyBuYW1lX2xlbmd0aCkKKyAgICBnb3RvIHdyb25nX25hbWVfbGVuZ3RoOworCisgIG5hbWVfdXRmOCA9CisgICAgICBnX2NvbnZlcnQgKChnY2hhciAqKSBtYXAuZGF0YSArIDExLCBuYW1lX2xlbmd0aCwgIlVURi04IiwgIlVURi0xNkxFIiwKKyAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworCisgIGlmIChuYW1lX3V0ZjgpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoc3ViLCAic3VidGl0bGUgbmFtZTogJXMiLCBuYW1lX3V0ZjgpOworICAgIGdzdF9hdmlfc3VidGl0bGVfdGl0bGVfdGFnIChzdWIsIG5hbWVfdXRmOCk7CisgICAgZ19mcmVlIChuYW1lX3V0ZjgpOworICB9CisKKyAgLyogbmV4dCB3b3JkIG11c3QgYmUgNCAqLworICBpZiAoR1NUX1JFQURfVUlOVDE2X0xFIChtYXAuZGF0YSArIDExICsgbmFtZV9sZW5ndGgpICE9IDB4NCkKKyAgICBnb3RvIHdyb25nX2ZpeGVkX3dvcmRfMjsKKworICBmaWxlX2xlbmd0aCA9IEdTVF9SRUFEX1VJTlQzMl9MRSAobWFwLmRhdGEgKyAxMyArIG5hbWVfbGVuZ3RoKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHN1YiwgImxlbmd0aCBzcnQvc3NhIGZpbGU6ICV1IiwgZmlsZV9sZW5ndGgpOworCisgIGlmIChtYXAuc2l6ZSA8ICgxNyArIG5hbWVfbGVuZ3RoICsgZmlsZV9sZW5ndGgpKQorICAgIGdvdG8gd3JvbmdfdG90YWxfbGVuZ3RoOworCisgIC8qIHN0b3JlIHRoaXMsIHNvIHdlIGNhbiBzZW5kIGl0IGFnYWluIGFmdGVyIGEgc2Vlazsgbm90ZSB0aGF0IHdlIHNob3VsZG4ndAorICAgKiBhc3N1bWUgYWxsIHRoZSByZW1haW5pbmcgZGF0YSBpbiB0aGUgY2h1bmsgaXMgc3VidGl0bGUgZGF0YSwgdGhlcmUgbWF5CisgICAqIGJlIHBhZGRpbmcgYXQgdGhlIGVuZCBmb3Igc29tZSByZWFzb24sIHNvIG9ubHkgcGFyc2UgZmlsZV9sZW5ndGggYnl0ZXMgKi8KKyAgc3ViLT5zdWJmaWxlID0KKyAgICAgIGdzdF9hdmlfc3VidGl0bGVfZXh0cmFjdF9maWxlIChzdWIsIGJ1ZiwgMTcgKyBuYW1lX2xlbmd0aCwgZmlsZV9sZW5ndGgpOworCisgIGlmIChzdWItPnN1YmZpbGUgPT0gTlVMTCkKKyAgICBnb3RvIGV4dHJhY3RfZmFpbGVkOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIC8qIEVSUk9SUyAqLword3JvbmdfbWFnaWNfd29yZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzdWIsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksICgiV3JvbmcgbWFnaWMgd29yZCIpKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQord3JvbmdfbmFtZV9sZW5ndGg6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3ViLCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLAorICAgICAgICAoIm5hbWUgZG9lc24ndCBmaXQgaW4gYnVmZmVyICglIiBHX0dTSVpFX0ZPUk1BVCAiIDwgJWQpIiwgbWFwLnNpemUsCisgICAgICAgICAgICAxNyArIG5hbWVfbGVuZ3RoKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK3dyb25nX2ZpeGVkX3dvcmRfMjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzdWIsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksCisgICAgICAgICgid3JvbmcgZml4ZWQgd29yZDogZXhwZWN0ZWQgJXUsIGdvdCAldSIsIDQsCisgICAgICAgICAgICBHU1RfUkVBRF9VSU5UMTZfTEUgKG1hcC5kYXRhICsgMTEgKyBuYW1lX2xlbmd0aCkpKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQord3JvbmdfdG90YWxfbGVuZ3RoOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHN1YiwgU1RSRUFNLCBERUNPREUsIChOVUxMKSwKKyAgICAgICAgKCJidWZmZXIgc2l6ZSBpcyB3cm9uZzogbmVlZCAlZCBieXRlcywgaGF2ZSAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIiwKKyAgICAgICAgICAgIDE3ICsgbmFtZV9sZW5ndGggKyBmaWxlX2xlbmd0aCwgbWFwLnNpemUpKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorZXh0cmFjdF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3ViLCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLAorICAgICAgICAoImNvdWxkIG5vdCBleHRyYWN0IHN1YnRpdGxlcyIpKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9zdWJ0aXRsZV9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0QXZpU3VidGl0bGUgKnN1YiA9IEdTVF9BVklfU1VCVElUTEUgKHBhcmVudCk7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIGlmIChzdWItPnN1YmZpbGUgIT0gTlVMTCkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3ViLCAiR290IG1vcmUgYnVmZmVycyB0aGFuIGV4cGVjdGVkLCBkcm9wcGluZyIpOworICAgIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICAvKiB3ZSBleHBlY3QgZXhhY3RseSBvbmUgYnVmZmVyIHdpdGggdGhlIHdob2xlIHNydC9zc2EgZmlsZSBpbiBpdCAqLworICByZXQgPSBnc3RfYXZpX3N1YnRpdGxlX3BhcnNlX2dhYjJfY2h1bmsgKHN1YiwgYnVmZmVyKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogbm93IHB1c2ggdGhlIHN1YnRpdGxlIGRhdGEgZG93bnN0cmVhbSAqLworICByZXQgPSBnc3RfcGFkX3B1c2ggKHN1Yi0+c3JjLCBnc3RfYnVmZmVyX3JlZiAoc3ViLT5zdWJmaWxlKSk7CisKK2RvbmU6CisKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYXZpX3N1YnRpdGxlX3NlbmRfZXZlbnQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RBdmlTdWJ0aXRsZSAqYXZpc3VidGl0bGUgPSBHU1RfQVZJX1NVQlRJVExFIChlbGVtZW50KTsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgaWYgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX1NFRUspIHsKKyAgICBpZiAoYXZpc3VidGl0bGUtPnN1YmZpbGUpIHsKKyAgICAgIGlmIChnc3RfcGFkX3B1c2ggKGF2aXN1YnRpdGxlLT5zcmMsCisgICAgICAgICAgICAgIGdzdF9idWZmZXJfcmVmIChhdmlzdWJ0aXRsZS0+c3ViZmlsZSkpID09IEdTVF9GTE9XX09LKQorICAgICAgICByZXQgPSBUUlVFOworICAgIH0KKyAgfQorICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdmlfc3VidGl0bGVfY2xhc3NfaW5pdCAoR3N0QXZpU3VidGl0bGVDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChhdmlzdWJ0aXRsZV9kZWJ1ZywgImF2aXN1YnRpdGxlIiwgMCwKKyAgICAgICJwYXJzZSBhdmkgc3VidGl0bGUgc3RyZWFtIik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXZpX3N1YnRpdGxlX2NoYW5nZV9zdGF0ZSk7CisgIGdzdGVsZW1lbnRfY2xhc3MtPnNlbmRfZXZlbnQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdmlfc3VidGl0bGVfc2VuZF9ldmVudCk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiQXZpIHN1YnRpdGxlIHBhcnNlciIsICJDb2RlYy9QYXJzZXIvU3VidGl0bGUiLAorICAgICAgIlBhcnNlIGF2aSBzdWJ0aXRsZSBzdHJlYW0iLCAiVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdmlfc3VidGl0bGVfaW5pdCAoR3N0QXZpU3VidGl0bGUgKiBzZWxmKQoreworICBHc3RDYXBzICpjYXBzOworCisgIHNlbGYtPnNyYyA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc3JjX3RlbXBsYXRlLCAic3JjIik7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzZWxmKSwgc2VsZi0+c3JjKTsKKworICBzZWxmLT5zaW5rID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzaW5rX3RlbXBsYXRlLCAic2luayIpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoc2VsZi0+c2luaywKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXZpX3N1YnRpdGxlX2NoYWluKSk7CisKKyAgY2FwcyA9IGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldF9jYXBzICgmc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X3BhZF9zZXRfY2FwcyAoc2VsZi0+c3JjLCBjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKHNlbGYtPnNyYyk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzZWxmKSwgc2VsZi0+c2luayk7CisKKyAgc2VsZi0+c3ViZmlsZSA9IE5VTEw7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2F2aV9zdWJ0aXRsZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdEF2aVN1YnRpdGxlICpzdWIgPSBHU1RfQVZJX1NVQlRJVExFIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkKKyAgICByZXR1cm4gcmV0OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBpZiAoc3ViLT5zdWJmaWxlKSB7CisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHN1Yi0+c3ViZmlsZSk7CisgICAgICAgIHN1Yi0+c3ViZmlsZSA9IE5VTEw7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZ3N0L2F2aS9nc3RhdmlzdWJ0aXRsZS5oIGIvZ3N0L2F2aS9nc3RhdmlzdWJ0aXRsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmODA0OGUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmgKQEAgLTAsMCArMSwzOSBAQAorCisjaWZuZGVmIF9fR1NUQVZJU1VCVElUTEVfSF9fCisjZGVmaW5lIF9fR1NUQVZJU1VCVElUTEVfSF9fCisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK0dfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF2aVN1YnRpdGxlIEdzdEF2aVN1YnRpdGxlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF2aVN1YnRpdGxlQ2xhc3MgR3N0QXZpU3VidGl0bGVDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9BVklfU1VCVElUTEUgKGdzdF9hdmlfc3VidGl0bGVfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9BVklfU1VCVElUTEUob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBHU1RfVFlQRV9BVklfU1VCVElUTEUsIEdzdEF2aVN1YnRpdGxlKSkKKyNkZWZpbmUgR1NUX0FWSV9TVUJUSVRMRV9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9BVklfU1VCVElUTEUsIEdzdEF2aVN1YnRpdGxlQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQVZJX1NVQlRJVExFKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfQVZJX1NVQlRJVExFKSkKKyNkZWZpbmUgR1NUX0lTX0FWSV9TVUJUSVRMRV9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9BVklfU1VCVElUTEUpKQorI2RlZmluZSBHU1RfQVZJX1NVQlRJVExFX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfQVZJX1NVQlRJVExFLCBHc3RBdmlTdWJ0aXRsZUNsYXNzKSkKKworR1R5cGUgZ3N0X2F2aV9zdWJ0aXRsZV9nZXRfdHlwZSAodm9pZCk7CisKK3N0cnVjdCBfR3N0QXZpU3VidGl0bGUKK3sKKyAgR3N0RWxlbWVudCBwYXJlbnQ7CisKKyAgR3N0UGFkICAgICpzcmM7CisgIEdzdFBhZCAgICAqc2luazsKKworICBHc3RCdWZmZXIgKnN1YmZpbGU7ICAvKiB0aGUgY29tcGxldGUgc3VidGl0bGUgZmlsZSBpbiBvbmUgYnVmZmVyICovCit9OworCitzdHJ1Y3QgX0dzdEF2aVN1YnRpdGxlQ2xhc3MKK3sKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudDsKK307CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC9hdmkvbWVzb24uYnVpbGQgYi9nc3QvYXZpL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZmQxYzQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXZpL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMTUgQEAKK2F2aV9zb3VyY2VzID0gWworICAnZ3N0YXZpLmMnLAorICAnZ3N0YXZpbXV4LmMnLAorICAnZ3N0YXZpZGVtdXguYycsCisgICdnc3RhdmlzdWJ0aXRsZS5jJworXQorCitnc3RhdmkgPSBsaWJyYXJ5KCdnc3RhdmknLAorICBhdmlfc291cmNlcywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luYywgbGlic2luY10sCisgIGRlcGVuZGVuY2llcyA6IFtnc3RfZGVwLCBnc3RyaWZmX2RlcCwgZ3N0YXVkaW9fZGVwLCBnc3R2aWRlb19kZXAsIGdzdHRhZ19kZXBdLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L2N1dHRlci9NYWtlZmlsZS5hbSBiL2dzdC9jdXR0ZXIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1Njc3ZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9jdXR0ZXIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMCBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0Y3V0dGVyLmxhCisKK2xpYmdzdGN1dHRlcl9sYV9TT1VSQ0VTID0gZ3N0Y3V0dGVyLmMKK2xpYmdzdGN1dHRlcl9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKQorbGliZ3N0Y3V0dGVyX2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKEdTVF9CQVNFX0xJQlMpICQoTElCTSkKK2xpYmdzdGN1dHRlcl9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gZ3N0Y3V0dGVyLmggZmlsdGVyLmZ1bmMKKworRVhUUkFfRElTVCA9IFJFQURNRQpkaWZmIC0tZ2l0IGEvZ3N0L2N1dHRlci9SRUFETUUgYi9nc3QvY3V0dGVyL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzA5NzVlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2N1dHRlci9SRUFETUUKQEAgLTAsMCArMSwzOCBAQAorY3V0dGVyIHBsdWdpbiBieSB0aG9tYXMgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCitTWU5PUFNJUworCitUaGlzIHBsdWdpbiBlbWl0cyBzaWduYWxzIHdoZW4gUk1TIGxldmVsIG9mIGF1ZGlvIHNpZ25hbCBjcm9zc2VzIGEKK3RocmVzaG9sZCBmb3IgYSBnaXZlbiBhbW91bnQgb2YgdGltZS4gIAorCitBcyBzb29uIGFzIHRoZSBidWZmZXIncyBSTVMgaXMgZ3JlYXRlciB0aGFuIHRoZSB0aHJlc2hvbGQgdmFsdWUsIHRoZSBwbHVnaW4gZmlyZXMgYSBDVVRfU1RBUlQgc2lnbmFsLgorCitXaGVuIHRoZSBidWZmZXIncyBSTVMgbGV2ZWwgZHJvcHMgYmVsb3cgdGhlIHRocmVzaG9sZCB2YWx1ZSBmb3IgYSBjb25zZWN1dGl2ZSBydW4gbGVuZ3RoIGxvbmdlciB0aGFuIHRoZSBnaXZlbiBydW5sZW5ndGgsIGl0IHNlbmRzIGEgQ1VUX1NUT1Agc2lnbmFsLgorCitXaGVuIGEgcHJlLXJlY29yZGluZyBidWZmZXIgaXMgdXNlZCwgdGhlIHBsdWdpbiB3aWxsIGRlbGF5IHRocm91Z2hwdXQgb2YgZGF0YSB3aGVuIGl0J3MgaW4gInNpbGVudCIgbW9kZSBmb3IgYSBtYXhpbXVtIGxlbmd0aCBlcXVhbCB0byB0aGUgcHJlLXJlY29yZGluZyBidWZmZXIgbGVuZ3RoLiAgQXMgc29vbiBhcyB0aGUgaW5wdXQgbGV2ZWwgY3Jvc3NlcyB0aGUgdGhyZXNob2xkIGxldmVsLCB0aGlzIHByZS1yZWNvcmRlZCBidWZmZXIgaXMgZmx1c2hlZCB0byB0aGUgc3JjIHBhZCAoc28geW91IGNhbiBhY3R1YWxseSByZWNvcmQgdGhlIGF1ZGlvIGp1c3QgYmVmb3JlIHRoZSB0aHJlc2hvbGQgY3Jvc3NpbmcpIGFmdGVyIHNlbmRpbmcgdGhlIHNpZ25hbC4KKworQVJHVU1FTlRTCisKK0dzdEN1dHRlcjo6dGhyZXNob2xkCisJbGV2ZWwgKGJldHdlZW4gMCBhbmQgMSkgb2YgdGhyZXNob2xkCitHc3RDdXR0ZXI6OnRocmVzaG9sZF9kQgorCWxldmVsIG9mIHRocmVzaG9sZCBpbiBkQiAoYmV0d2VlbiAtaW5mIGFuZCAwKQorR3N0Q3V0dGVyOjpydW5sZW5ndGgKKwltaW5pbXVtIGxlbmd0aCAoaW4gc2Vjb25kcykgYmVmb3JlIHBsdWdpbiBzZW5kcyBjdXRfc3RvcCBzaWduYWwKK0dzdEN1dHRlcjo6cHJlbGVuZ3RoCisgICAgICAgIGxlbmd0aCBvZiBwcmUtcmVjb3JkaW5nIGJ1ZmZlcgorICAgICAgICAKK1NJR05BTFMKKworCUNVVF9TVEFSVAorCWdldHMgc2VudCB3aGVuIHRoZSBsZXZlbCBvZiB0aGUgc2lnbmFsIGdvZXMgYWJvdmUgdGhyZXNob2xkIGxldmVsCisJQ1VUX1NUT1AKKwlnZXRzIHNlbnQgd2hlbiB0aGUgbGV2ZWwgb2YgdGhlIHNpZ25hbCBoYXMgYmVlbiBiZWxvdyB0aGUKKwl0aHJlc2hvbGQgbGV2ZWwgZm9yIGEgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGl0ZXJhdGlvbnMgb2Ygd2hpY2gKKwl0aGUgY3VtdWxhdGl2ZSBsZW5ndGggaXMgbW9yZSB0aGFuIHRoZSBydW5sZW5ndGgKKworTElNSVRBVElPTlMKKworCSogUk1TIHZhbHVlIGlzIGNhbGN1bGF0ZWQgb3ZlciB0aGUgd2hvbGUgZGF0YSBidWZmZXIsIHNvCisJICB0aGUgdGltZSByZXNvbHV0aW9uIGlzIGxpbWl0ZWQgdG8gdGhlIGJ1ZmZlciBsZW5ndGgKKwkqIFJNUyB2YWx1ZSBpcyBjYWxjdWxhdGVkIG92ZXIgYWxsIG9mIHRoZSBjaGFubmVscyBjb21iaW5lZApkaWZmIC0tZ2l0IGEvZ3N0L2N1dHRlci9maWx0ZXIuZnVuYyBiL2dzdC9jdXR0ZXIvZmlsdGVyLmZ1bmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRiZTU2NgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9jdXR0ZXIvZmlsdGVyLmZ1bmMKQEAgLTAsMCArMSwxNiBAQAoreworICBndWludCBqOworICByZWdpc3RlciBkb3VibGUgc3F1YXJlc3VtID0gMC4wOworCisgIC8qCisgICAqIHByb2Nlc3MgZGF0YSBoZXJlICAKKyAgICogaW5wdXQgc2FtcGxlIGRhdGEgZW50ZXJzIGluICppbl9kYXRhIGFzIDggb3IgMTYgYml0IGRhdGEKKyAgICogc2FtcGxlcyBmb3IgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCBhcmUgaW50ZXJsZWF2ZWQKKyAgICovCisKKyAgZm9yIChqID0gMDsgaiA8IG51bV9zYW1wbGVzOyBqKyspIAorICAgICBzcXVhcmVzdW0gKz0gZGF0YVtqXSAqIGRhdGFbal07CisKKyAgcmV0dXJuIChzcXVhcmVzdW0gLyAoZmxvYXQpIG51bV9zYW1wbGVzKTsKK30KKwpkaWZmIC0tZ2l0IGEvZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYyBiL2dzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzZGRmNgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmMKQEAgLTAsMCArMSw1MTIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgMjAwMiwyMDAzLDIwMDUKKyAqICAgICAgICAgICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LWN1dHRlcgorICoKKyAqIEFuYWx5c2VzIHRoZSBhdWRpbyBzaWduYWwgZm9yIHBlcmlvZHMgb2Ygc2lsZW5jZS4gVGhlIHN0YXJ0IGFuZCBlbmQgb2YKKyAqIHNpbGVuY2UgaXMgc2lnbmFsbGVkIGJ5IGJ1cyBtZXNzYWdlcyBuYW1lZAorICogPGNsYXNzbmFtZT4mcXVvdDtjdXR0ZXImcXVvdDs8L2NsYXNzbmFtZT4uCisgKiBUaGUgbWVzc2FnZSdzIHN0cnVjdHVyZSBjb250YWlucyB0d28gZmllbGRzOgorICogPGl0ZW1pemVkbGlzdD4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgICNHc3RDbG9ja1RpbWUKKyAqICAgPGNsYXNzbmFtZT4mcXVvdDt0aW1lc3RhbXAmcXVvdDs8L2NsYXNzbmFtZT46CisgKiAgIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGJ1ZmZlciB0aGF0IHRyaWdnZXJlZCB0aGUgbWVzc2FnZS4KKyAqICAgPC9wYXJhPgorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgIGdib29sZWFuCisgKiAgIDxjbGFzc25hbWU+JnF1b3Q7YWJvdmUmcXVvdDs8L2NsYXNzbmFtZT46CisgKiAgICVUUlVFIGZvciBiZWdpbiBvZiBzaWxlbmNlIGFuZCAlRkFMU0UgZm9yIGVuZCBvZiBzaWxlbmNlLgorICogICA8L3BhcmE+CisgKiA8L2xpc3RpdGVtPgorICogPC9pdGVtaXplZGxpc3Q+CisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC1tIGZpbGVzcmMgbG9jYXRpb249Zm9vLm9nZyAhIGRlY29kZWJpbiAhIGF1ZGlvY29udmVydCAhIGN1dHRlciAhIGF1dG9hdWRpb3NpbmsKKyAqIF18IFNob3cgY3V0IG1lc3NhZ2VzLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgImdzdGN1dHRlci5oIgorI2luY2x1ZGUgIm1hdGguaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoY3V0dGVyX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGN1dHRlcl9kZWJ1ZworCisjZGVmaW5lIENVVFRFUl9ERUZBVUxUX1RIUkVTSE9MRF9MRVZFTCAgICAwLjEKKyNkZWZpbmUgQ1VUVEVSX0RFRkFVTFRfVEhSRVNIT0xEX0xFTkdUSCAgKDUwMCAqIEdTVF9NU0VDT05EKQorI2RlZmluZSBDVVRURVJfREVGQVVMVF9QUkVfTEVOR1RIICAgICAgICAoMjAwICogR1NUX01TRUNPTkQpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBjdXR0ZXJfc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgUzgsIiBHU1RfQVVESU9fTkUgKFMxNikgIiB9LCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxLCBNQVggXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIE1BWCBdLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGN1dHRlcl9zaW5rX2ZhY3RvcnkgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgUzgsIiBHU1RfQVVESU9fTkUgKFMxNikgIiB9LCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxLCBNQVggXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIE1BWCBdLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCIpCisgICAgKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfVEhSRVNIT0xELAorICBQUk9QX1RIUkVTSE9MRF9EQiwKKyAgUFJPUF9SVU5fTEVOR1RILAorICBQUk9QX1BSRV9MRU5HVEgsCisgIFBST1BfTEVBS1kKK307CisKKyNkZWZpbmUgZ3N0X2N1dHRlcl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RDdXR0ZXIsIGdzdF9jdXR0ZXIsIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9jdXR0ZXJfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyB2b2lkIGdzdF9jdXR0ZXJfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2N1dHRlcl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfY3V0dGVyX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9jdXR0ZXJfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKK3N0YXRpYyB2b2lkCitnc3RfY3V0dGVyX2NsYXNzX2luaXQgKEdzdEN1dHRlckNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfY3V0dGVyX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2N1dHRlcl9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9USFJFU0hPTEQsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgidGhyZXNob2xkIiwgIlRocmVzaG9sZCIsCisgICAgICAgICAgIlZvbHVtZSB0aHJlc2hvbGQgYmVmb3JlIHRyaWdnZXIiLAorICAgICAgICAgIC1HX01BWERPVUJMRSwgR19NQVhET1VCTEUsIDAuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9USFJFU0hPTERfREIsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgidGhyZXNob2xkLWRCIiwgIlRocmVzaG9sZCAoZEIpIiwKKyAgICAgICAgICAiVm9sdW1lIHRocmVzaG9sZCBiZWZvcmUgdHJpZ2dlciAoaW4gZEIpIiwKKyAgICAgICAgICAtR19NQVhET1VCTEUsIEdfTUFYRE9VQkxFLCAwLjAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfUlVOX0xFTkdUSCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJydW4tbGVuZ3RoIiwgIlJ1biBsZW5ndGgiLAorICAgICAgICAgICJMZW5ndGggb2YgZHJvcCBiZWxvdyB0aHJlc2hvbGQgYmVmb3JlIGN1dF9zdG9wIChpbiBuYW5vc2Vjb25kcykiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVDY0LCAwLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9QUkVfTEVOR1RILAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoInByZS1sZW5ndGgiLCAiUHJlLXJlY29yZGluZyBidWZmZXIgbGVuZ3RoIiwKKyAgICAgICAgICAiTGVuZ3RoIG9mIHByZS1yZWNvcmRpbmcgYnVmZmVyIChpbiBuYW5vc2Vjb25kcykiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVDY0LCAwLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9MRUFLWSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgibGVha3kiLCAiTGVha3kiLAorICAgICAgICAgICJkbyB3ZSBsZWFrIGJ1ZmZlcnMgd2hlbiBiZWxvdyB0aHJlc2hvbGQgPyIsCisgICAgICAgICAgRkFMU0UsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChjdXR0ZXJfZGVidWcsICJjdXR0ZXIiLCAwLCAiQXVkaW8gY3V0dGluZyIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmN1dHRlcl9zcmNfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmN1dHRlcl9zaW5rX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiQXVkaW8gY3V0dGVyIiwKKyAgICAgICJGaWx0ZXIvRWRpdG9yL0F1ZGlvIiwgIkF1ZGlvIEN1dHRlciB0byBzcGxpdCBhdWRpbyBpbnRvIG5vbi1zaWxlbnQgYml0cyIsCisgICAgICAiVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPiIpOworICBlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfY3V0dGVyX2NoYW5nZV9zdGF0ZTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9jdXR0ZXJfaW5pdCAoR3N0Q3V0dGVyICogZmlsdGVyKQoreworICBmaWx0ZXItPnNpbmtwYWQgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZjdXR0ZXJfc2lua19mYWN0b3J5LCAic2luayIpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoZmlsdGVyLT5zaW5rcGFkLCBnc3RfY3V0dGVyX2NoYWluKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKGZpbHRlci0+c2lua3BhZCwgZ3N0X2N1dHRlcl9ldmVudCk7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKGZpbHRlci0+c2lua3BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChmaWx0ZXIpLCBmaWx0ZXItPnNpbmtwYWQpOworCisgIGZpbHRlci0+c3JjcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmY3V0dGVyX3NyY19mYWN0b3J5LCAic3JjIik7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKGZpbHRlci0+c3JjcGFkKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKGZpbHRlciksIGZpbHRlci0+c3JjcGFkKTsKKworICBmaWx0ZXItPnRocmVzaG9sZF9sZXZlbCA9IENVVFRFUl9ERUZBVUxUX1RIUkVTSE9MRF9MRVZFTDsKKyAgZmlsdGVyLT50aHJlc2hvbGRfbGVuZ3RoID0gQ1VUVEVSX0RFRkFVTFRfVEhSRVNIT0xEX0xFTkdUSDsKKyAgZmlsdGVyLT5zaWxlbnRfcnVuX2xlbmd0aCA9IDAgKiBHU1RfU0VDT05EOworICBmaWx0ZXItPnNpbGVudCA9IFRSVUU7CisgIGZpbHRlci0+c2lsZW50X3ByZXYgPSBGQUxTRTsgIC8qIHByZXZpb3VzIHZhbHVlIG9mIHNpbGVudCAqLworCisgIGZpbHRlci0+cHJlX2xlbmd0aCA9IENVVFRFUl9ERUZBVUxUX1BSRV9MRU5HVEg7CisgIGZpbHRlci0+cHJlX3J1bl9sZW5ndGggPSAwICogR1NUX1NFQ09ORDsKKyAgZmlsdGVyLT5wcmVfYnVmZmVyID0gTlVMTDsKKyAgZmlsdGVyLT5sZWFreSA9IEZBTFNFOworfQorCitzdGF0aWMgR3N0TWVzc2FnZSAqCitnc3RfY3V0dGVyX21lc3NhZ2VfbmV3IChHc3RDdXR0ZXIgKiBjLCBnYm9vbGVhbiBhYm92ZSwgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCkKK3sKKyAgR3N0U3RydWN0dXJlICpzOworCisgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAoImN1dHRlciIsCisgICAgICAiYWJvdmUiLCBHX1RZUEVfQk9PTEVBTiwgYWJvdmUsCisgICAgICAidGltZXN0YW1wIiwgR1NUX1RZUEVfQ0xPQ0tfVElNRSwgdGltZXN0YW1wLCBOVUxMKTsKKworICByZXR1cm4gZ3N0X21lc3NhZ2VfbmV3X2VsZW1lbnQgKEdTVF9PQkpFQ1QgKGMpLCBzKTsKK30KKworLyogQ2FsY3VsYXRlIHRoZSBOb3JtYWxpemVkIEN1bXVsYXRpdmUgU3F1YXJlIG92ZXIgYSBidWZmZXIgb2YgdGhlIGdpdmVuIHR5cGUKKyAqIGFuZCBvdmVyIGFsbCBjaGFubmVscyBjb21iaW5lZCAqLworCisjZGVmaW5lIERFRklORV9DVVRURVJfQ0FMQ1VMQVRPUihUWVBFLCBSRVNPTFVUSU9OKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBpbmxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitnc3RfY3V0dGVyX2NhbGN1bGF0ZV8jI1RZUEUgKFRZUEUgKiBpbiwgZ3VpbnQgbnVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICpOQ1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJlZ2lzdGVyIGludCBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvdWJsZSBzcXVhcmVzdW0gPSAwLjA7ICAgICAgICAgICAvKiBzcXVhcmUgc3VtIG9mIHRoZSBpbnRlZ2VyIHNhbXBsZXMgKi8gICBcCisgIHJlZ2lzdGVyIGRvdWJsZSBzcXVhcmUgPSAwLjA7ICAgICAvKiBTcXVhcmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdkb3VibGUgbm9ybWFsaXplcjsgICAgICAgICAgICAgICAvKiBkaXZpc29yIHRvIGdldCBhIFstMS4wLCAxLjBdIHJhbmdlICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICpOQ1MgPSAwLjA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3JtYWxpemVkIEN1bXVsYXRpdmUgU3F1YXJlICovICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5vcm1hbGl6ZXIgPSAoZG91YmxlKSAoMSA8PCAoUkVTT0xVVElPTiAqIDIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaiA9IDA7IGogPCBudW07IGorKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3F1YXJlID0gKChkb3VibGUpIGluW2pdKSAqIGluW2pdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3F1YXJlc3VtICs9IHNxdWFyZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICpOQ1MgPSBzcXVhcmVzdW0gLyBub3JtYWxpemVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0RFRklORV9DVVRURVJfQ0FMQ1VMQVRPUiAoZ2ludDE2LCAxNSk7CitERUZJTkVfQ1VUVEVSX0NBTENVTEFUT1IgKGdpbnQ4LCA3KTsKKworc3RhdGljIGdib29sZWFuCitnc3RfY3V0dGVyX3NldGNhcHMgKEdzdEN1dHRlciAqIGZpbHRlciwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdEF1ZGlvSW5mbyBpbmZvOworCisgIGlmICghZ3N0X2F1ZGlvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgY2FwcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGZpbHRlci0+aW5mbyA9IGluZm87CisKKyAgcmV0dXJuIGdzdF9wYWRfc2V0X2NhcHMgKGZpbHRlci0+c3JjcGFkLCBjYXBzKTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfY3V0dGVyX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0Q3V0dGVyICpmaWx0ZXIgPSBHU1RfQ1VUVEVSIChlbGVtZW50KTsKKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ19saXN0X2ZyZWVfZnVsbCAoZmlsdGVyLT5wcmVfYnVmZmVyLCAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9idWZmZXJfdW5yZWYpOworICAgICAgZmlsdGVyLT5wcmVfYnVmZmVyID0gTlVMTDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9jdXR0ZXJfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBnYm9vbGVhbiByZXQ7CisgIEdzdEN1dHRlciAqZmlsdGVyOworCisgIGZpbHRlciA9IEdTVF9DVVRURVIgKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfY2FwcyAoZXZlbnQsICZjYXBzKTsKKyAgICAgIHJldCA9IGdzdF9jdXR0ZXJfc2V0Y2FwcyAoZmlsdGVyLCBjYXBzKTsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2N1dHRlcl9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0Q3V0dGVyICpmaWx0ZXI7CisgIEdzdE1hcEluZm8gbWFwOworICBnaW50MTYgKmluX2RhdGE7CisgIGdpbnQgYnBmLCByYXRlOworICBnc2l6ZSBpbl9zaXplOworICBndWludCBudW1fc2FtcGxlczsKKyAgZ2RvdWJsZSBOQ1MgPSAwLjA7ICAgICAgICAgICAgLyogTm9ybWFsaXplZCBDdW11bGF0aXZlIFNxdWFyZSBvZiBidWZmZXIgKi8KKyAgZ2RvdWJsZSBSTVMgPSAwLjA7ICAgICAgICAgICAgLyogUk1TIG9mIHNpZ25hbCBpbiBidWZmZXIgKi8KKyAgZ2RvdWJsZSBOTVMgPSAwLjA7ICAgICAgICAgICAgLyogTm9ybWFsaXplZCBNZWFuIFNxdWFyZSBvZiBidWZmZXIgKi8KKyAgR3N0QnVmZmVyICpwcmVidWY7ICAgICAgICAgICAgLyogcG9pbnRlciB0byBhIHByZWJ1ZmZlciBlbGVtZW50ICovCisgIEdzdENsb2NrVGltZSBkdXJhdGlvbjsKKworICBmaWx0ZXIgPSBHU1RfQ1VUVEVSIChwYXJlbnQpOworCisgIGlmIChHU1RfQVVESU9fSU5GT19GT1JNQVQgKCZmaWx0ZXItPmluZm8pID09IEdTVF9BVURJT19GT1JNQVRfVU5LTk9XTikKKyAgICBnb3RvIG5vdF9uZWdvdGlhdGVkOworCisgIGJwZiA9IEdTVF9BVURJT19JTkZPX0JQRiAoJmZpbHRlci0+aW5mbyk7CisgIHJhdGUgPSBHU1RfQVVESU9fSU5GT19SQVRFICgmZmlsdGVyLT5pbmZvKTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBpbl9kYXRhID0gKGdpbnQxNiAqKSBtYXAuZGF0YTsKKyAgaW5fc2l6ZSA9IG1hcC5zaXplOworCisgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICJsZW5ndGggb2YgcHJlcmVjIGJ1ZmZlcjogJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoZmlsdGVyLT5wcmVfcnVuX2xlbmd0aCkpOworCisgIC8qIGNhbGN1bGF0ZSBtZWFuIHNxdWFyZSB2YWx1ZSBvbiBidWZmZXIgKi8KKyAgc3dpdGNoIChHU1RfQVVESU9fSU5GT19GT1JNQVQgKCZmaWx0ZXItPmluZm8pKSB7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MxNjoKKyAgICAgIG51bV9zYW1wbGVzID0gaW5fc2l6ZSAvIDI7CisgICAgICBnc3RfY3V0dGVyX2NhbGN1bGF0ZV9naW50MTYgKGluX2RhdGEsIG51bV9zYW1wbGVzLCAmTkNTKTsKKyAgICAgIE5NUyA9IE5DUyAvIG51bV9zYW1wbGVzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1M4OgorICAgICAgbnVtX3NhbXBsZXMgPSBpbl9zaXplOworICAgICAgZ3N0X2N1dHRlcl9jYWxjdWxhdGVfZ2ludDggKChnaW50OCAqKSBpbl9kYXRhLCBudW1fc2FtcGxlcywgJk5DUyk7CisgICAgICBOTVMgPSBOQ1MgLyBudW1fc2FtcGxlczsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiB0aGlzIHNob3VsZG4ndCBoYXBwZW4gKi8KKyAgICAgIGdfd2FybmluZyAoIm5vIG1lYW4gc3F1YXJlIGZ1bmN0aW9uIGZvciBmb3JtYXQiKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICBmaWx0ZXItPnNpbGVudF9wcmV2ID0gZmlsdGVyLT5zaWxlbnQ7CisKKyAgZHVyYXRpb24gPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGluX3NpemUgLyBicGYsIEdTVF9TRUNPTkQsIHJhdGUpOworCisgIFJNUyA9IHNxcnQgKE5NUyk7CisgIC8qIGlmIFJNUyBiZWxvdyB0aHJlc2hvbGQsIGFkZCBidWZmZXIgbGVuZ3RoIHRvIHNpbGVudCBydW4gbGVuZ3RoIGNvdW50CisgICAqIGlmIG5vdCwgcmVzZXQKKyAgICovCisgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICJidWZmZXIgc3RhdHM6IE5NUyAlZiwgUk1TICVmLCBhdWRpbyBsZW5ndGggJWYiLCBOTVMsCisgICAgICBSTVMsIGdzdF9ndWludDY0X3RvX2dkb3VibGUgKGR1cmF0aW9uKSk7CisKKyAgaWYgKFJNUyA8IGZpbHRlci0+dGhyZXNob2xkX2xldmVsKQorICAgIGZpbHRlci0+c2lsZW50X3J1bl9sZW5ndGggKz0gZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSAoZHVyYXRpb24pOworICBlbHNlIHsKKyAgICBmaWx0ZXItPnNpbGVudF9ydW5fbGVuZ3RoID0gMCAqIEdTVF9TRUNPTkQ7CisgICAgZmlsdGVyLT5zaWxlbnQgPSBGQUxTRTsKKyAgfQorCisgIGlmIChmaWx0ZXItPnNpbGVudF9ydW5fbGVuZ3RoID4gZmlsdGVyLT50aHJlc2hvbGRfbGVuZ3RoKQorICAgIC8qIGl0IGhhcyBiZWVuIHNpbGVudCBsb25nIGVub3VnaCwgZmxhZyBpdCAqLworICAgIGZpbHRlci0+c2lsZW50ID0gVFJVRTsKKworICAvKiBoYXMgdGhlIHNpbGVudCBzdGF0dXMgY2hhbmdlZCA/IGlmIHNvLCBzZW5kIHJpZ2h0IHNpZ25hbAorICAgKiBhbmQsIGlmIGZyb20gc2lsZW50IC0+IG5vdCBzaWxlbnQsIGZsdXNoIHByZV9yZWNvcmQgYnVmZmVyCisgICAqLworICBpZiAoZmlsdGVyLT5zaWxlbnQgIT0gZmlsdGVyLT5zaWxlbnRfcHJldikgeworICAgIGlmIChmaWx0ZXItPnNpbGVudCkgeworICAgICAgR3N0TWVzc2FnZSAqbSA9CisgICAgICAgICAgZ3N0X2N1dHRlcl9tZXNzYWdlX25ldyAoZmlsdGVyLCBGQUxTRSwgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAic2lnbmFsaW5nIENVVF9TVE9QIik7CisgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UIChmaWx0ZXIpLCBtKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2ludCBjb3VudCA9IDA7CisgICAgICBHc3RNZXNzYWdlICptID0KKyAgICAgICAgICBnc3RfY3V0dGVyX21lc3NhZ2VfbmV3IChmaWx0ZXIsIFRSVUUsIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAic2lnbmFsaW5nIENVVF9TVEFSVCIpOworICAgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVCAoZmlsdGVyKSwgbSk7CisgICAgICAvKiBmaXJzdCBvZiBhbGwsIGZsdXNoIGN1cnJlbnQgYnVmZmVyICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsICJmbHVzaGluZyBidWZmZXIgb2YgbGVuZ3RoICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChmaWx0ZXItPnByZV9ydW5fbGVuZ3RoKSk7CisKKyAgICAgIHdoaWxlIChmaWx0ZXItPnByZV9idWZmZXIpIHsKKyAgICAgICAgcHJlYnVmID0gKGdfbGlzdF9maXJzdCAoZmlsdGVyLT5wcmVfYnVmZmVyKSktPmRhdGE7CisgICAgICAgIGZpbHRlci0+cHJlX2J1ZmZlciA9IGdfbGlzdF9yZW1vdmUgKGZpbHRlci0+cHJlX2J1ZmZlciwgcHJlYnVmKTsKKyAgICAgICAgZ3N0X3BhZF9wdXNoIChmaWx0ZXItPnNyY3BhZCwgcHJlYnVmKTsKKyAgICAgICAgKytjb3VudDsKKyAgICAgIH0KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwgImZsdXNoZWQgJWQgYnVmZmVycyIsIGNvdW50KTsKKyAgICAgIGZpbHRlci0+cHJlX3J1bl9sZW5ndGggPSAwICogR1NUX1NFQ09ORDsKKyAgICB9CisgIH0KKyAgLyogbm93IGNoZWNrIGlmIHdlIGhhdmUgdG8gc2VuZCB0aGUgbmV3IGJ1ZmZlciB0byB0aGUgaW50ZXJuYWwgYnVmZmVyIGNhY2hlCisgICAqIG9yIHRvIHRoZSBzcmNwYWQgKi8KKyAgaWYgKGZpbHRlci0+c2lsZW50KSB7CisgICAgZmlsdGVyLT5wcmVfYnVmZmVyID0gZ19saXN0X2FwcGVuZCAoZmlsdGVyLT5wcmVfYnVmZmVyLCBidWYpOworICAgIGZpbHRlci0+cHJlX3J1bl9sZW5ndGggKz0gZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSAoZHVyYXRpb24pOworCisgICAgd2hpbGUgKGZpbHRlci0+cHJlX3J1bl9sZW5ndGggPiBmaWx0ZXItPnByZV9sZW5ndGgpIHsKKyAgICAgIEdzdENsb2NrVGltZSBwZHVyYXRpb247CisgICAgICBnc2l6ZSBwc2l6ZTsKKworICAgICAgcHJlYnVmID0gKGdfbGlzdF9maXJzdCAoZmlsdGVyLT5wcmVfYnVmZmVyKSktPmRhdGE7CisgICAgICBnX2Fzc2VydCAoR1NUX0lTX0JVRkZFUiAocHJlYnVmKSk7CisKKyAgICAgIHBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAocHJlYnVmKTsKKyAgICAgIHBkdXJhdGlvbiA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAocHNpemUgLyBicGYsIEdTVF9TRUNPTkQsIHJhdGUpOworCisgICAgICBmaWx0ZXItPnByZV9idWZmZXIgPSBnX2xpc3RfcmVtb3ZlIChmaWx0ZXItPnByZV9idWZmZXIsIHByZWJ1Zik7CisgICAgICBmaWx0ZXItPnByZV9ydW5fbGVuZ3RoIC09IGdzdF9ndWludDY0X3RvX2dkb3VibGUgKHBkdXJhdGlvbik7CisKKyAgICAgIC8qIG9ubHkgcGFzcyBidWZmZXJzIGlmIHdlIGRvbid0IGxlYWsgKi8KKyAgICAgIGlmICghZmlsdGVyLT5sZWFreSkKKyAgICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoIChmaWx0ZXItPnNyY3BhZCwgcHJlYnVmKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocHJlYnVmKTsKKyAgICB9CisgIH0gZWxzZQorICAgIHJldCA9IGdzdF9wYWRfcHVzaCAoZmlsdGVyLT5zcmNwYWQsIGJ1Zik7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK25vdF9uZWdvdGlhdGVkOgorICB7CisgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfY3V0dGVyX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RDdXR0ZXIgKmZpbHRlcjsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfQ1VUVEVSIChvYmplY3QpKTsKKyAgZmlsdGVyID0gR1NUX0NVVFRFUiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfVEhSRVNIT0xEOgorICAgICAgZmlsdGVyLT50aHJlc2hvbGRfbGV2ZWwgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVRyAoIkRFQlVHOiBzZXQgdGhyZXNob2xkIGxldmVsIHRvICVmIiwgZmlsdGVyLT50aHJlc2hvbGRfbGV2ZWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUkVTSE9MRF9EQjoKKyAgICAgIC8qIHNldCB0aGUgbGV2ZWwgZ2l2ZW4gaW4gZEIKKyAgICAgICAqIHZhbHVlIGluIGRCID0gMjAgKiBsb2cgKHZhbHVlKQorICAgICAgICogdmFsdWVzIGluIGRCIDwgMCByZXN1bHQgaW4gdmFsdWVzIGJldHdlZW4gMCBhbmQgMQorICAgICAgICovCisgICAgICBmaWx0ZXItPnRocmVzaG9sZF9sZXZlbCA9IHBvdyAoMTAsIGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpIC8gMjApOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAic2V0IHRocmVzaG9sZCBsZXZlbCB0byAlZiIsCisgICAgICAgICAgZmlsdGVyLT50aHJlc2hvbGRfbGV2ZWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JVTl9MRU5HVEg6CisgICAgICAvKiBzZXQgdGhlIG1pbmltdW0gbGVuZ3RoIG9mIHRoZSBzaWxlbnQgcnVuIHJlcXVpcmVkICovCisgICAgICBmaWx0ZXItPnRocmVzaG9sZF9sZW5ndGggPQorICAgICAgICAgIGdzdF9ndWludDY0X3RvX2dkb3VibGUgKGdfdmFsdWVfZ2V0X3VpbnQ2NCAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUkVfTEVOR1RIOgorICAgICAgLyogc2V0IHRoZSBsZW5ndGggb2YgdGhlIHByZS1yZWNvcmQgYmxvY2sgKi8KKyAgICAgIGZpbHRlci0+cHJlX2xlbmd0aCA9IGdzdF9ndWludDY0X3RvX2dkb3VibGUgKGdfdmFsdWVfZ2V0X3VpbnQ2NCAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9MRUFLWToKKyAgICAgIC8qIHNldCBpZiB0aGUgcHJlLXJlY29yZCBidWZmZXIgaXMgbGVha3kgb3Igbm90ICovCisgICAgICBmaWx0ZXItPmxlYWt5ID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2N1dHRlcl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0Q3V0dGVyICpmaWx0ZXI7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX0NVVFRFUiAob2JqZWN0KSk7CisgIGZpbHRlciA9IEdTVF9DVVRURVIgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1JVTl9MRU5HVEg6CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCBmaWx0ZXItPnRocmVzaG9sZF9sZW5ndGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUkVTSE9MRDoKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIGZpbHRlci0+dGhyZXNob2xkX2xldmVsKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJFU0hPTERfREI6CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCAyMCAqIGxvZyAoZmlsdGVyLT50aHJlc2hvbGRfbGV2ZWwpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUkVfTEVOR1RIOgorICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgZmlsdGVyLT5wcmVfbGVuZ3RoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9MRUFLWToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBmaWx0ZXItPmxlYWt5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJjdXR0ZXIiLCBHU1RfUkFOS19OT05FLCBHU1RfVFlQRV9DVVRURVIpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGN1dHRlciwKKyAgICAiQXVkaW8gQ3V0dGVyIHRvIHNwbGl0IGF1ZGlvIGludG8gbm9uLXNpbGVudCBiaXRzIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgIkxHUEwiLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pOwpkaWZmIC0tZ2l0IGEvZ3N0L2N1dHRlci9nc3RjdXR0ZXIuaCBiL2dzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg3NWY4ZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmgKQEAgLTAsMCArMSw4MyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9DVVRURVJfSF9fCisjZGVmaW5lIF9fR1NUX0NVVFRFUl9IX18KKworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorLyogI2luY2x1ZGUgPGdzdC9tZXRhL2F1ZGlvcmF3Lmg+ICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKyNkZWZpbmUgR1NUX1RZUEVfQ1VUVEVSIFwKKyAgKGdzdF9jdXR0ZXJfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0NVVFRFUihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0NVVFRFUixHc3RDdXR0ZXIpKQorI2RlZmluZSBHU1RfQ1VUVEVSX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0NVVFRFUixHc3RDdXR0ZXJDbGFzcykpCisjZGVmaW5lIEdTVF9JU19DVVRURVIob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9DVVRURVIpKQorI2RlZmluZSBHU1RfSVNfQ1VUVEVSX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0NVVFRFUikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RDdXR0ZXIgR3N0Q3V0dGVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEN1dHRlckNsYXNzIEdzdEN1dHRlckNsYXNzOworCitzdHJ1Y3QgX0dzdEN1dHRlcgoreworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgR3N0UGFkICpzaW5rcGFkLCAqc3JjcGFkOworCisgIGRvdWJsZSB0aHJlc2hvbGRfbGV2ZWw7ICAgICAgIC8qIGxldmVsIGJlbG93IHdoaWNoIHRvIGN1dCAqLworICBkb3VibGUgdGhyZXNob2xkX2xlbmd0aDsgICAgICAvKiBob3cgbG9uZyBzaWduYWwgaGFzIHRvIHJlbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiZWxvdyB0aGlzIGxldmVsIGJlZm9yZSBjdXR0aW5nICovCisgIGRvdWJsZSBzaWxlbnRfcnVuX2xlbmd0aDsgICAgIC8qIGhvdyBsb25nIGhhcyBpdCBiZWVuIGJlbG93IHRocmVzaG9sZCA/ICovCisgIGdib29sZWFuIHNpbGVudDsKKyAgZ2Jvb2xlYW4gc2lsZW50X3ByZXY7CisKKyAgZG91YmxlIHByZV9sZW5ndGg7ICAgICAgICAgICAgLyogaG93IGxvbmcgY2FuIHRoZSBwcmUtcmVjb3JkIGJ1ZmZlciBiZSA/ICovCisgIGRvdWJsZSBwcmVfcnVuX2xlbmd0aDsgICAgICAgIC8qIGhvdyBsb25nIGlzIGl0IGN1cnJlbnRseSA/ICovCisgIEdMaXN0ICpwcmVfYnVmZmVyOyAgICAgICAgICAgIC8qIGxpc3Qgb2YgR3N0QnVmZmVycyBpbiBwcmUtcmVjb3JkIGJ1ZmZlciAqLworICBnYm9vbGVhbiBsZWFreTsgICAgICAgICAgICAgICAvKiBkbyB3ZSBsZWFrIGFuIG92ZXJmbG93aW5nIHByZWJ1ZmZlciA/ICovCisKKyAgR3N0QXVkaW9JbmZvIGluZm87Cit9OworCitzdHJ1Y3QgX0dzdEN1dHRlckNsYXNzCit7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7CisgIHZvaWQgKCpjdXRfc3RhcnQpIChHc3RDdXR0ZXIqIGZpbHRlcik7CisgIHZvaWQgKCpjdXRfc3RvcCkgKEdzdEN1dHRlciogZmlsdGVyKTsKK307CisKK0dUeXBlIGdzdF9jdXR0ZXJfZ2V0X3R5cGUgKHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKyNlbmRpZiAvKiBfX0dTVF9TVEVSRU9fSF9fICovCmRpZmYgLS1naXQgYS9nc3QvY3V0dGVyL21lc29uLmJ1aWxkIGIvZ3N0L2N1dHRlci9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjU4MGJkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2N1dHRlci9tZXNvbi5idWlsZApAQCAtMCwwICsxLDcgQEAKK2dzdGN1dHRlciA9IGxpYnJhcnkoJ2dzdGN1dHRlcicsICdnc3RjdXR0ZXIuYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0YmFzZV9kZXAsIGdzdGF1ZGlvX2RlcCwgbGlibV0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9NYWtlZmlsZS5hbSBiL2dzdC9kZWJ1Z3V0aWxzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZTljOGMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVidWd1dGlscy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM5IEBACisKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdGRlYnVnLmxhIGxpYmdzdG5hdmlnYXRpb250ZXN0LmxhIAorCitub2luc3RfSEVBREVSUyA9IFwKKwljcHVyZXBvcnQuaCBcCisJZ3N0Y2Fwc2RlYnVnLmggXAorCWdzdGNhcHNzZXR0ZXIuaCBcCisJZ3N0bmF2aWdhdGlvbnRlc3QuaCBcCisJZ3N0bmF2c2Vlay5oIFwKKwlnc3RwdXNoZmlsZXNyYy5oIFwKKwlnc3R0YWdpbmplY3QuaCBcCisJcHJvZ3Jlc3NyZXBvcnQuaCBcCisJdGVzdHMuaAorCitsaWJnc3RuYXZpZ2F0aW9udGVzdF9sYV9TT1VSQ0VTID0gZ3N0bmF2aWdhdGlvbnRlc3QuYworbGliZ3N0bmF2aWdhdGlvbnRlc3RfbGFfQ0ZMQUdTID0gJChHU1RfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgXAorCQkJCSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKQorbGliZ3N0bmF2aWdhdGlvbnRlc3RfbGFfTElCQUREID0gJChHU1RfTElCUykgJChHU1RfQkFTRV9MSUJTKSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0dmlkZW8tQEdTVF9BUElfVkVSU0lPTkAgJChMSUJNKQorbGliZ3N0bmF2aWdhdGlvbnRlc3RfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitsaWJnc3RkZWJ1Z19sYV9TT1VSQ0VTID0gXAorCWdzdGRlYnVnLmMgXAorCWJyZWFrbXlkYXRhLmMgXAorCWdzdGNhcHNzZXR0ZXIuYyBcCisJZ3N0bmF2c2Vlay5jIFwKKwlnc3RwdXNoZmlsZXNyYy5jIFwKKwlnc3R0YWdpbmplY3QuYyBcCisJcm5kYnVmZmVyc2l6ZS5jIFwKKwlwcm9ncmVzc3JlcG9ydC5jIFwKKwl0ZXN0cy5jIFwKKwljcHVyZXBvcnQuYyBcCisJdGVzdHBsdWdpbi5jCisKKyMJZ3N0Y2Fwc2RlYnVnLmMKKworbGliZ3N0ZGVidWdfbGFfQ0ZMQUdTID0gJChHU1RfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykKK2xpYmdzdGRlYnVnX2xhX0xJQkFERCA9ICQoR1NUX0xJQlMpICQoR1NUX0JBU0VfTElCUykKK2xpYmdzdGRlYnVnX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKZGlmZiAtLWdpdCBhL2dzdC9kZWJ1Z3V0aWxzL2JyZWFrbXlkYXRhLmMgYi9nc3QvZGVidWd1dGlscy9icmVha215ZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MjJkMzAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVidWd1dGlscy9icmVha215ZGF0YS5jCkBAIC0wLDAgKzEsMjkzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBCZW5qYW1pbiBPdHRlIDxvdHRlQGdub21lLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYnJlYWtteWRhdGEKKyAqCisgKiBUaGlzIGVsZW1lbnQgbW9kaWZpZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgaXQgaXMgcGFzc2VkIHJhbmRvbWx5CisgKiBhY2NvcmRpbmcgdG8gdGhlIHBhcmFtZXRlcnMgc2V0LgorICogSXQgb3RoZXJ3aXNlIGFjdHMgYXMgYW4gaWRlbnRpdHkuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfYnJlYWtfbXlfZGF0YV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfYnJlYWtfbXlfZGF0YV9kZWJ1ZworCisjZGVmaW5lIEdTVF9UWVBFX0JSRUFLX01ZX0RBVEEgXAorICAoZ3N0X2JyZWFrX215X2RhdGFfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0JSRUFLX01ZX0RBVEEob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9CUkVBS19NWV9EQVRBLEdzdEJyZWFrTXlEYXRhKSkKKyNkZWZpbmUgR1NUX0JSRUFLX01ZX0RBVEFfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfQlJFQUtfTVlfREFUQSxHc3RCcmVha015RGF0YUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0JSRUFLX01ZX0RBVEEob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9CUkVBS19NWV9EQVRBKSkKKyNkZWZpbmUgR1NUX0lTX0JSRUFLX01ZX0RBVEFfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfQlJFQUtfTVlfREFUQSkpCisKK0dUeXBlIGdzdF9icmVha19teV9kYXRhX2dldF90eXBlICh2b2lkKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfU0VFRCwKKyAgUFJPUF9TRVRfVE8sCisgIFBST1BfU0tJUCwKKyAgUFJPUF9QUk9CQUJJTElUWQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEJyZWFrTXlEYXRhIEdzdEJyZWFrTXlEYXRhOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEJyZWFrTXlEYXRhQ2xhc3MgR3N0QnJlYWtNeURhdGFDbGFzczsKKworc3RydWN0IF9Hc3RCcmVha015RGF0YQoreworICBHc3RCYXNlVHJhbnNmb3JtIGJhc2V0cmFuc2Zvcm07CisKKyAgR1JhbmQgKnJhbmQ7CisgIGd1aW50IHNraXBwZWQ7CisKKyAgZ3VpbnQzMiBzZWVkOworICBnaW50IHNldDsKKyAgZ3VpbnQgc2tpcDsKKyAgZ2RvdWJsZSBwcm9iYWJpbGl0eTsKK307CisKK3N0cnVjdCBfR3N0QnJlYWtNeURhdGFDbGFzcworeworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworc3RhdGljIHZvaWQgZ3N0X2JyZWFrX215X2RhdGFfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2JyZWFrX215X2RhdGFfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfYnJlYWtfbXlfZGF0YV90cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RCdWZmZXIgKiBidWYpOworc3RhdGljIGdib29sZWFuIGdzdF9icmVha19teV9kYXRhX3N0b3AgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2JyZWFrX215X2RhdGFfc3RhcnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucyk7CisKK0dzdFN0YXRpY1BhZFRlbXBsYXRlIGJtZF9zcmNfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK0dzdFN0YXRpY1BhZFRlbXBsYXRlIGJtZF9zaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKKyNkZWZpbmUgZ3N0X2JyZWFrX215X2RhdGFfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0QnJlYWtNeURhdGEsIGdzdF9icmVha19teV9kYXRhLCBHU1RfVFlQRV9CQVNFX1RSQU5TRk9STSk7CisKKworc3RhdGljIHZvaWQKK2dzdF9icmVha19teV9kYXRhX2NsYXNzX2luaXQgKEdzdEJyZWFrTXlEYXRhQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzICpnc3RiYXNldHJhbnNfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzID0gR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChrbGFzcyk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9icmVha19teV9kYXRhX2RlYnVnLCAiYnJlYWtteWRhdGEiLCAwLAorICAgICAgImRlYnVnZ2luZyBjYXRlZ29yeSBmb3IgYnJlYWtteWRhdGEgZWxlbWVudCIpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9icmVha19teV9kYXRhX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2JyZWFrX215X2RhdGFfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU0VFRCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgic2VlZCIsICJzZWVkIiwKKyAgICAgICAgICAic2VlZCBmb3IgcmFuZG9tbmVzcyAoaW5pdGlhbGl6ZWQgd2hlbiBnb2luZyBmcm9tIFJFQURZIHRvIFBBVVNFRCkiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVDMyLCAwLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU0VUX1RPLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInNldC10byIsICJzZXQtdG8iLAorICAgICAgICAgICJzZXQgY2hhbmdlZCBieXRlcyB0byB0aGlzIHZhbHVlICgtMSBtZWFucyByYW5kb20gdmFsdWUiLAorICAgICAgICAgIC0xLCBHX01BWFVJTlQ4LCAtMSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NLSVAsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInNraXAiLCAic2tpcCIsCisgICAgICAgICAgImFtb3VudCBvZiBieXRlcyBza2lwcGVkIGF0IHRoZSBiZWdpbm5pbmcgb2Ygc3RyZWFtIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIDAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QUk9CQUJJTElUWSwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJwcm9iYWJpbGl0eSIsICJwcm9iYWJpbGl0eSIsCisgICAgICAgICAgInByb2JhYmlsaXR5IGZvciBlYWNoIGJ5dGUgaW4gdGhlIGJ1ZmZlciB0byBiZSBjaGFuZ2VkIiwgMC4wLCAxLjAsCisgICAgICAgICAgMC4wLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmJtZF9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmYm1kX3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkJyZWFrIG15IGRhdGEiLAorICAgICAgIlRlc3RpbmciLAorICAgICAgInJhbmRvbWx5IGNoYW5nZSBkYXRhIGluIHRoZSBzdHJlYW0iLCAiQmVuamFtaW4gT3R0ZSA8b3R0ZUBnbm9tZT4iKTsKKworICBnc3RiYXNldHJhbnNfY2xhc3MtPnRyYW5zZm9ybV9pcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2JyZWFrX215X2RhdGFfdHJhbnNmb3JtX2lwKTsKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYnJlYWtfbXlfZGF0YV9zdGFydCk7CisgIGdzdGJhc2V0cmFuc19jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYnJlYWtfbXlfZGF0YV9zdG9wKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9icmVha19teV9kYXRhX2luaXQgKEdzdEJyZWFrTXlEYXRhICogYm1kKQoreworICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X2luX3BsYWNlIChHU1RfQkFTRV9UUkFOU0ZPUk0gKGJtZCksIFRSVUUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2JyZWFrX215X2RhdGFfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEJyZWFrTXlEYXRhICpibWQgPSBHU1RfQlJFQUtfTVlfREFUQSAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGJtZCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1NFRUQ6CisgICAgICBibWQtPnNlZWQgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0VUX1RPOgorICAgICAgYm1kLT5zZXQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TS0lQOgorICAgICAgYm1kLT5za2lwID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BST0JBQklMSVRZOgorICAgICAgYm1kLT5wcm9iYWJpbGl0eSA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorCisgIEdTVF9PQkpFQ1RfVU5MT0NLIChibWQpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2JyZWFrX215X2RhdGFfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEJyZWFrTXlEYXRhICpibWQgPSBHU1RfQlJFQUtfTVlfREFUQSAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGJtZCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1NFRUQ6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgYm1kLT5zZWVkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TRVRfVE86CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBibWQtPnNldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0tJUDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBibWQtPnNraXApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BST0JBQklMSVRZOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgYm1kLT5wcm9iYWJpbGl0eSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGJtZCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYnJlYWtfbXlfZGF0YV90cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RCcmVha015RGF0YSAqYm1kID0gR1NUX0JSRUFLX01ZX0RBVEEgKHRyYW5zKTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdzaXplIGk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGdzdF9idWZmZXJfaXNfd3JpdGFibGUgKGJ1ZiksIEdTVF9GTE9XX0VSUk9SKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGJtZCk7CisKKyAgaWYgKGJtZC0+c2tpcHBlZCA8IGJtZC0+c2tpcCkgeworICAgIGkgPSBibWQtPnNraXAgLSBibWQtPnNraXBwZWQ7CisgIH0gZWxzZSB7CisgICAgaSA9IDA7CisgIH0KKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQURXUklURSk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGJtZCwKKyAgICAgICJnb3QgYnVmZmVyICVwIChzaXplICUiIEdfR1NJWkVfRk9STUFUICIsIHRpbWVzdGFtcCAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAiLCBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCAiIiwgYnVmLCBtYXAuc2l6ZSwKKyAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpLCBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSk7CisKKyAgZm9yICg7IGkgPCBtYXAuc2l6ZTsgaSsrKSB7CisgICAgaWYgKGdfcmFuZF9kb3VibGVfcmFuZ2UgKGJtZC0+cmFuZCwgMCwgMS4wKSA8PSBibWQtPnByb2JhYmlsaXR5KSB7CisgICAgICBndWludDggbmV3OworCisgICAgICBpZiAoYm1kLT5zZXQgPCAwKSB7CisgICAgICAgIG5ldyA9IGdfcmFuZF9pbnRfcmFuZ2UgKGJtZC0+cmFuZCwgMCwgMjU2KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5ldyA9IGJtZC0+c2V0OworICAgICAgfQorICAgICAgR1NUX0lORk9fT0JKRUNUIChibWQsCisgICAgICAgICAgImNoYW5naW5nIGJ5dGUgJSIgR19HU0laRV9GT1JNQVQgIiBmcm9tIDB4JTAyWCB0byAweCUwMlgiLCBpLAorICAgICAgICAgIChndWludCkgR1NUX1JFQURfVUlOVDggKG1hcC5kYXRhICsgaSksIChndWludCkgKChndWludDgpIG5ldykpOworICAgICAgbWFwLmRhdGFbaV0gPSBuZXc7CisgICAgfQorICB9CisgIC8qIGRvbid0IG92ZXJmbG93ICovCisgIGJtZC0+c2tpcHBlZCArPSBNSU4gKEdfTUFYVUlOVCAtIGJtZC0+c2tpcHBlZCwgbWFwLnNpemUpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGJtZCk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9icmVha19teV9kYXRhX3N0YXJ0IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpCit7CisgIEdzdEJyZWFrTXlEYXRhICpibWQgPSBHU1RfQlJFQUtfTVlfREFUQSAodHJhbnMpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoYm1kKTsKKyAgYm1kLT5yYW5kID0gZ19yYW5kX25ld193aXRoX3NlZWQgKGJtZC0+c2VlZCk7CisgIGJtZC0+c2tpcHBlZCA9IDA7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChibWQpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9icmVha19teV9kYXRhX3N0b3AgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucykKK3sKKyAgR3N0QnJlYWtNeURhdGEgKmJtZCA9IEdTVF9CUkVBS19NWV9EQVRBICh0cmFucyk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChibWQpOworICBnX3JhbmRfZnJlZSAoYm1kLT5yYW5kKTsKKyAgYm1kLT5yYW5kID0gTlVMTDsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGJtZCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9jcHVyZXBvcnQuYyBiL2dzdC9kZWJ1Z3V0aWxzL2NwdXJlcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MWMzOGUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVidWd1dGlscy9jcHVyZXBvcnQuYwpAQCAtMCwwICsxLDE0OSBAQAorLyogR1N0cmVhbWVyIENwdSBSZXBvcnQgRWxlbWVudAorICogQ29weXJpZ2h0IChDKSA8MjAxMD4gWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXMgbWVyYWxpIG9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImNwdXJlcG9ydC5oIgorCisKK2VudW0KK3sKKyAgUFJPUF8wLAorfTsKKworR3N0U3RhdGljUGFkVGVtcGxhdGUgY3B1X3JlcG9ydF9zcmNfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK0dzdFN0YXRpY1BhZFRlbXBsYXRlIGNwdV9yZXBvcnRfc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfY3B1X3JlcG9ydF90cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RCdWZmZXIgKiBidWYpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2NwdV9yZXBvcnRfc3RhcnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2NwdV9yZXBvcnRfc3RvcCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKTsKKworI2RlZmluZSBnc3RfY3B1X3JlcG9ydF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RDcHVSZXBvcnQsIGdzdF9jcHVfcmVwb3J0LCBHU1RfVFlQRV9CQVNFX1RSQU5TRk9STSk7CisKK3N0YXRpYyB2b2lkCitnc3RfY3B1X3JlcG9ydF9maW5hbGl6ZSAoR09iamVjdCAqIG9iaikKK3sKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmopOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2NwdV9yZXBvcnRfY2xhc3NfaW5pdCAoR3N0Q3B1UmVwb3J0Q2xhc3MgKiBnX2NsYXNzKQoreworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKmdzdGJhc2V0cmFuc19jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChnX2NsYXNzKTsKKyAgZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChnX2NsYXNzKTsKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzID0gR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChnX2NsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9jcHVfcmVwb3J0X2ZpbmFsaXplOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmNwdV9yZXBvcnRfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmNwdV9yZXBvcnRfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiQ1BVIHJlcG9ydCIsCisgICAgICAiVGVzdGluZyIsCisgICAgICAiUG9zdCBjcHUgdXNhZ2UgaW5mb3JtYXRpb24gZXZlcnkgYnVmZmVyIiwKKyAgICAgICJaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4iKTsKKworICBnc3RiYXNldHJhbnNfY2xhc3MtPnRyYW5zZm9ybV9pcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2NwdV9yZXBvcnRfdHJhbnNmb3JtX2lwKTsKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfY3B1X3JlcG9ydF9zdGFydCk7CisgIGdzdGJhc2V0cmFuc19jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfY3B1X3JlcG9ydF9zdG9wKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9jcHVfcmVwb3J0X2luaXQgKEdzdENwdVJlcG9ydCAqIHJlcG9ydCkKK3sKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9wYXNzdGhyb3VnaCAoR1NUX0JBU0VfVFJBTlNGT1JNIChyZXBvcnQpLCBUUlVFKTsKKworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2NwdV9yZXBvcnRfdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Q3B1UmVwb3J0ICpmaWx0ZXI7CisgIEdUaW1lVmFsIGN1cl90aW1lOworICBjbG9ja190IGN1cl9jcHVfdGltZTsKKyAgR3N0TWVzc2FnZSAqbXNnOworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIGdpbnQ2NCB0aW1lX3Rha2VuOworCisKKyAgZ19nZXRfY3VycmVudF90aW1lICgmY3VyX3RpbWUpOworICBjdXJfY3B1X3RpbWUgPSBjbG9jayAoKTsKKworICBmaWx0ZXIgPSBHU1RfQ1BVX1JFUE9SVCAodHJhbnMpOworCisKKyAgdGltZV90YWtlbiA9IEdTVF9USU1FVkFMX1RPX1RJTUUgKGN1cl90aW1lKSAtCisgICAgICBHU1RfVElNRVZBTF9UT19USU1FIChmaWx0ZXItPmxhc3RfdGltZSk7CisKKyAgcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgiY3B1LXJlcG9ydCIsICJjcHUtdGltZSIsIEdfVFlQRV9ET1VCTEUsCisgICAgICAoKGdkb3VibGUpIChjdXJfY3B1X3RpbWUgLSBmaWx0ZXItPmxhc3RfY3B1X3RpbWUpKSwKKyAgICAgICJhY3R1YWwtdGltZSIsIEdfVFlQRV9JTlQ2NCwgdGltZV90YWtlbiwgImJ1ZmZlci10aW1lIiwgR19UWVBFX0lOVDY0LAorICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZiksIE5VTEwpOworICBtc2cgPSBnc3RfbWVzc2FnZV9uZXdfZWxlbWVudCAoR1NUX09CSkVDVF9DQVNUIChmaWx0ZXIpLCBzKTsKKyAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChmaWx0ZXIpLCBtc2cpOworICBmaWx0ZXItPmxhc3RfdGltZSA9IGN1cl90aW1lOworICBmaWx0ZXItPmxhc3RfY3B1X3RpbWUgPSBjdXJfY3B1X3RpbWU7CisKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2NwdV9yZXBvcnRfc3RhcnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucykKK3sKKyAgR3N0Q3B1UmVwb3J0ICpmaWx0ZXI7CisKKyAgZmlsdGVyID0gR1NUX0NQVV9SRVBPUlQgKHRyYW5zKTsKKworICBnX2dldF9jdXJyZW50X3RpbWUgKCZmaWx0ZXItPmxhc3RfdGltZSk7CisgIGZpbHRlci0+c3RhcnRfdGltZSA9IGZpbHRlci0+bGFzdF90aW1lOworICBmaWx0ZXItPmxhc3RfY3B1X3RpbWUgPSBjbG9jayAoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2NwdV9yZXBvcnRfc3RvcCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICAvKiBhbnl0aGluZyB3ZSBzaG91bGQgYmUgZG9pbmcgaGVyZT8gKi8KKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9jcHVyZXBvcnQuaCBiL2dzdC9kZWJ1Z3V0aWxzL2NwdXJlcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MDU1NTkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVidWd1dGlscy9jcHVyZXBvcnQuaApAQCAtMCwwICsxLDU4IEBACisvKiBHU3RyZWFtZXIgQ1BVIFJlcG9ydCBFbGVtZW50CisgKiBDb3B5cmlnaHQgKEMpIDwyMDEwPiBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBtZXJhbGkgb3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfQ1BVX1JFUE9SVF9IX18KKyNkZWZpbmUgX19HU1RfQ1BVX1JFUE9SVF9IX18KKworI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKworR19CRUdJTl9ERUNMUworI2RlZmluZSBHU1RfVFlQRV9DUFVfUkVQT1JUIFwKKyAgKGdzdF9jcHVfcmVwb3J0X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9DUFVfUkVQT1JUKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQ1BVX1JFUE9SVCxHc3RDcHVSZXBvcnQpKQorI2RlZmluZSBHU1RfQ1BVX1JFUE9SVF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9DUFVfUkVQT1JULEdzdENwdVJlcG9ydENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0NQVV9SRVBPUlQob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9DUFVfUkVQT1JUKSkKKyNkZWZpbmUgR1NUX0lTX0NQVV9SRVBPUlRfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfQ1BVX1JFUE9SVCkpCit0eXBlZGVmIHN0cnVjdCBfR3N0Q3B1UmVwb3J0IEdzdENwdVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RDcHVSZXBvcnRDbGFzcyBHc3RDcHVSZXBvcnRDbGFzczsKKworc3RydWN0IF9Hc3RDcHVSZXBvcnQKK3sKKyAgR3N0QmFzZVRyYW5zZm9ybSBiYXNldHJhbnNmb3JtOworCisgIEdUaW1lVmFsIHN0YXJ0X3RpbWU7CisgIEdUaW1lVmFsIGxhc3RfdGltZTsKKyAgY2xvY2tfdCBsYXN0X2NwdV90aW1lOworfTsKKworc3RydWN0IF9Hc3RDcHVSZXBvcnRDbGFzcworeworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2NwdV9yZXBvcnRfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX0NQVV9SRVBPUlRfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9nc3RjYXBzZGVidWcuYyBiL2dzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNkZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYmM1NTEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVidWd1dGlscy9nc3RjYXBzZGVidWcuYwpAQCAtMCwwICsxLDI1OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgImdzdGNhcHNkZWJ1Zy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfY2Fwc19kZWJ1Z19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfY2Fwc19kZWJ1Z19kZWJ1ZworCisvKiBwcm90b3R5cGVzICovCisKKworc3RhdGljIHZvaWQgZ3N0X2NhcHNfZGVidWdfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgdm9pZCBnc3RfY2Fwc19kZWJ1Z19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9jYXBzX2RlYnVnX3NpbmtfY2hhaW4gKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIEdzdENhcHMgKmdzdF9jYXBzX2RlYnVnX2dldGNhcHMgKEdzdFBhZCAqIHBhZCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2NhcHNfZGVidWdfYWNjZXB0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfY2Fwc19kZWJ1Z19idWZmZXJhbGxvYyAoR3N0UGFkICogcGFkLAorICAgIGd1aW50NjQgb2Zmc2V0LCBndWludCBzaXplLCBHc3RDYXBzICogY2FwcywgR3N0QnVmZmVyICoqIGJ1Zik7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2NhcHNfZGVidWdfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKKy8qIHBhZCB0ZW1wbGF0ZXMgKi8KKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9jYXBzX2RlYnVnX3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfY2Fwc19kZWJ1Z19zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCisvKiBjbGFzcyBpbml0aWFsaXphdGlvbiAqLworCisjZGVmaW5lIGdzdF9jYXBzX2RlYnVnX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdENhcHNEZWJ1ZywgZ3N0X2NhcHNfZGVidWcsIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgdm9pZAorZ3N0X2NhcHNfZGVidWdfY2xhc3NfaW5pdCAoR3N0Q2Fwc0RlYnVnQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X2NhcHNfZGVidWdfZGlzcG9zZTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfY2Fwc19kZWJ1Z19maW5hbGl6ZTsKKyAgZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9jYXBzX2RlYnVnX2NoYW5nZV9zdGF0ZSk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9jYXBzX2RlYnVnX2RlYnVnLCAiY2Fwc2RlYnVnIiwgMCwKKyAgICAgICJkZWJ1ZyBjYXRlZ29yeSBmb3IgY2Fwc2RlYnVnIGVsZW1lbnQiKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfY2Fwc19kZWJ1Z19zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfY2Fwc19kZWJ1Z19zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiQ2FwcyBkZWJ1ZyIsCisgICAgICAiR2VuZXJpYyIsICJEZWJ1ZyBjYXBzIG5lZ290aWF0aW9uIiwgIkRhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2NhcHNfZGVidWdfaW5pdCAoR3N0Q2Fwc0RlYnVnICogY2Fwc2RlYnVnKQoreworCisgIGNhcHNkZWJ1Zy0+c3JjcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmZ3N0X2NhcHNfZGVidWdfc3JjX3RlbXBsYXRlLCAic3JjIik7CisgIGdzdF9wYWRfc2V0X2dldGNhcHNfZnVuY3Rpb24gKGNhcHNkZWJ1Zy0+c3JjcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9jYXBzX2RlYnVnX2dldGNhcHMpKTsKKyAgZ3N0X3BhZF9zZXRfYWNjZXB0Y2Fwc19mdW5jdGlvbiAoY2Fwc2RlYnVnLT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2NhcHNfZGVidWdfYWNjZXB0Y2FwcykpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoY2Fwc2RlYnVnKSwgY2Fwc2RlYnVnLT5zcmNwYWQpOworCisgIGNhcHNkZWJ1Zy0+c2lua3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJmdzdF9jYXBzX2RlYnVnX3NpbmtfdGVtcGxhdGUsICJzaW5rIik7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChjYXBzZGVidWctPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2NhcHNfZGVidWdfc2lua19jaGFpbikpOworICBnc3RfcGFkX3NldF9idWZmZXJhbGxvY19mdW5jdGlvbiAoY2Fwc2RlYnVnLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9jYXBzX2RlYnVnX2J1ZmZlcmFsbG9jKSk7CisgIGdzdF9wYWRfc2V0X2dldGNhcHNfZnVuY3Rpb24gKGNhcHNkZWJ1Zy0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfY2Fwc19kZWJ1Z19nZXRjYXBzKSk7CisgIGdzdF9wYWRfc2V0X2FjY2VwdGNhcHNfZnVuY3Rpb24gKGNhcHNkZWJ1Zy0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfY2Fwc19kZWJ1Z19hY2NlcHRjYXBzKSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChjYXBzZGVidWcpLCBjYXBzZGVidWctPnNpbmtwYWQpOworCit9CisKK3ZvaWQKK2dzdF9jYXBzX2RlYnVnX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIC8qIGNsZWFuIHVwIGFzIHBvc3NpYmxlLiAgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyAqLworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCit2b2lkCitnc3RfY2Fwc19kZWJ1Z19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgLyogY2xlYW4gdXAgb2JqZWN0IGhlcmUgKi8KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKKworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9jYXBzX2RlYnVnX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfY2Fwc19kZWJ1Z19zaW5rX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdENhcHNEZWJ1ZyAqY2Fwc2RlYnVnOworCisgIGNhcHNkZWJ1ZyA9IEdTVF9DQVBTX0RFQlVHIChnc3RfcGFkX2dldF9wYXJlbnQgKHBhZCkpOworCisgIHJldCA9IGdzdF9wYWRfcHVzaCAoY2Fwc2RlYnVnLT5zcmNwYWQsIGJ1ZmZlcik7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoY2Fwc2RlYnVnKTsKKworICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFRISVNQQUQgKChwYWQgPT0gY2Fwc2RlYnVnLT5zcmNwYWQpID8gImRvd25zdHJlYW0iIDogInVwc3RyZWFtIikKKyNkZWZpbmUgT1RIRVJQQUQgKChwYWQgPT0gY2Fwc2RlYnVnLT5zcmNwYWQpID8gInVwc3RyZWFtIiA6ICJkb3duc3RyZWFtIikKKworc3RhdGljIEdzdENhcHMgKgorZ3N0X2NhcHNfZGVidWdfZ2V0Y2FwcyAoR3N0UGFkICogcGFkKQoreworICBHc3RDYXBzICpjYXBzOworICBHc3RDYXBzRGVidWcgKmNhcHNkZWJ1ZzsKKyAgZ2NoYXIgKnM7CisgIEdzdFBhZCAqb3RoZXJwYWQ7CisKKyAgY2Fwc2RlYnVnID0gR1NUX0NBUFNfREVCVUcgKGdzdF9wYWRfZ2V0X3BhcmVudCAocGFkKSk7CisgIG90aGVycGFkID0KKyAgICAgIChwYWQgPT0gY2Fwc2RlYnVnLT5zcmNwYWQpID8gY2Fwc2RlYnVnLT5zaW5rcGFkIDogY2Fwc2RlYnVnLT5zcmNwYWQ7CisKKyAgR1NUX0lORk8gKCIlcyBjYWxsZWQgZ2V0Y2FwcyIsIFRISVNQQUQpOworCisgIGNhcHMgPSBnc3RfcGFkX3BlZXJfZ2V0X2NhcHMgKG90aGVycGFkKTsKKworICBzID0gZ3N0X2NhcHNfdG9fc3RyaW5nIChjYXBzKTsKKyAgR1NUX0lORk8gKCIlcyByZXR1cm5lZCAlcyIsIE9USEVSUEFELCBzKTsKKyAgZ19mcmVlIChzKTsKKworICBpZiAoY2FwcyA9PSBOVUxMKQorICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfYW55ICgpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKGNhcHNkZWJ1Zyk7CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3RfY2Fwc19kZWJ1Z19hY2NlcHRjYXBzIChHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RDYXBzRGVidWcgKmNhcHNkZWJ1ZzsKKyAgZ2NoYXIgKnM7CisgIGdib29sZWFuIHJldDsKKyAgR3N0UGFkICpvdGhlcnBhZDsKKworICBjYXBzZGVidWcgPSBHU1RfQ0FQU19ERUJVRyAoZ3N0X3BhZF9nZXRfcGFyZW50IChwYWQpKTsKKyAgb3RoZXJwYWQgPQorICAgICAgKHBhZCA9PSBjYXBzZGVidWctPnNyY3BhZCkgPyBjYXBzZGVidWctPnNpbmtwYWQgOiBjYXBzZGVidWctPnNyY3BhZDsKKworICBzID0gZ3N0X2NhcHNfdG9fc3RyaW5nIChjYXBzKTsKKyAgR1NUX0lORk8gKCIlcyBjYWxsZWQgYWNjZXB0Y2FwcyB3aXRoICVzIiwgVEhJU1BBRCwgcyk7CisgIGdfZnJlZSAocyk7CisKKyAgcmV0ID0gZ3N0X3BhZF9wZWVyX2FjY2VwdF9jYXBzIChvdGhlcnBhZCwgY2Fwcyk7CisKKyAgR1NUX0lORk8gKCIlcyByZXR1cm5lZCAlcyIsIE9USEVSUEFELCByZXQgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChjYXBzZGVidWcpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfY2Fwc19kZWJ1Z19idWZmZXJhbGxvYyAoR3N0UGFkICogcGFkLCBndWludDY0IG9mZnNldCwgZ3VpbnQgc2l6ZSwKKyAgICBHc3RDYXBzICogY2FwcywgR3N0QnVmZmVyICoqIGJ1ZikKK3sKKyAgR3N0Q2Fwc0RlYnVnICpjYXBzZGVidWc7CisgIGdjaGFyICpzOworICBnY2hhciAqdDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdFBhZCAqb3RoZXJwYWQ7CisgIGdib29sZWFuIG5ld2NhcHM7CisKKyAgY2Fwc2RlYnVnID0gR1NUX0NBUFNfREVCVUcgKGdzdF9wYWRfZ2V0X3BhcmVudCAocGFkKSk7CisgIG90aGVycGFkID0KKyAgICAgIChwYWQgPT0gY2Fwc2RlYnVnLT5zcmNwYWQpID8gY2Fwc2RlYnVnLT5zaW5rcGFkIDogY2Fwc2RlYnVnLT5zcmNwYWQ7CisKKyAgbmV3Y2FwcyA9IChjYXBzICE9IEdTVF9QQURfQ0FQUyAocGFkKSk7CisKKyAgaWYgKG5ld2NhcHMpIHsKKyAgICBzID0gZ3N0X2NhcHNfdG9fc3RyaW5nIChjYXBzKTsKKyAgICBHU1RfSU5GTyAoIiVzIGNhbGxlZCBidWZmZXJhbGxvYyB3aXRoIG5ldyBjYXBzLCBvZmZzZXQ9JSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAiIHNpemU9JWQgY2Fwcz0lcyIsIFRISVNQQUQsIG9mZnNldCwgc2l6ZSwgcyk7CisgICAgZ19mcmVlIChzKTsKKyAgfQorCisgIHJldCA9IGdzdF9wYWRfYWxsb2NfYnVmZmVyX2FuZF9zZXRfY2FwcyAob3RoZXJwYWQsIG9mZnNldCwgc2l6ZSwgY2FwcywgYnVmKTsKKworICBpZiAobmV3Y2FwcykgeworICAgIEdTVF9JTkZPICgiJXMgcmV0dXJuZWQgJXMiLCBPVEhFUlBBRCwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworICB9CisgIGlmIChjYXBzICE9IEdTVF9CVUZGRVJfQ0FQUyAoKmJ1ZikpIHsKKyAgICBzID0gZ3N0X2NhcHNfdG9fc3RyaW5nIChjYXBzKTsKKyAgICB0ID0gZ3N0X2NhcHNfdG9fc3RyaW5nIChHU1RfQlVGRkVSX0NBUFMgKCpidWYpKTsKKyAgICBHU1RfSU5GTworICAgICAgICAoIiVzIHJldHVybmVkIGZyb20gYnVmZmVyYWxsb2Mgd2l0aCBkaWZmZXJlbnQgY2FwcywgcmVxdWVzdGVkPSVzIHJldHVybmVkPSVzIiwKKyAgICAgICAgT1RIRVJQQUQsIHMsIHQpOworICAgIGdfZnJlZSAocyk7CisgICAgZ19mcmVlICh0KTsKKyAgfQorCisgIGdzdF9vYmplY3RfdW5yZWYgKGNhcHNkZWJ1Zyk7CisKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2dzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNkZWJ1Zy5oIGIvZ3N0L2RlYnVndXRpbHMvZ3N0Y2Fwc2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwOTMwZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNkZWJ1Zy5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDEwIEZJWE1FIDxmaXhtZUBleGFtcGxlLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9HU1RfQ0FQU19ERUJVR19IXworI2RlZmluZSBfR1NUX0NBUFNfREVCVUdfSF8KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9DQVBTX0RFQlVHICAgKGdzdF9jYXBzX2RlYnVnX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9DQVBTX0RFQlVHKG9iaikgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQ0FQU19ERUJVRyxHc3RDYXBzRGVidWcpKQorI2RlZmluZSBHU1RfQ0FQU19ERUJVR19DTEFTUyhrbGFzcykgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9DQVBTX0RFQlVHLEdzdENhcHNEZWJ1Z0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0NBUFNfREVCVUcob2JqKSAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9DQVBTX0RFQlVHKSkKKyNkZWZpbmUgR1NUX0lTX0NBUFNfREVCVUdfQ0xBU1Mob2JqKSAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0NBUFNfREVCVUcpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0Q2Fwc0RlYnVnIEdzdENhcHNEZWJ1ZzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RDYXBzRGVidWdDbGFzcyBHc3RDYXBzRGVidWdDbGFzczsKKworc3RydWN0IF9Hc3RDYXBzRGVidWcKK3sKKyAgR3N0RWxlbWVudCBiYXNlX2NhcHNkZWJ1ZzsKKworICBHc3RQYWQgKnNyY3BhZDsKKyAgR3N0UGFkICpzaW5rcGFkOworCit9OworCitzdHJ1Y3QgX0dzdENhcHNEZWJ1Z0NsYXNzCit7CisgIEdzdEVsZW1lbnRDbGFzcyBiYXNlX2NhcHNkZWJ1Z19jbGFzczsKK307CisKK0dUeXBlIGdzdF9jYXBzX2RlYnVnX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmMgYi9nc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzZGI3NgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNzZXR0ZXIuYwpAQCAtMCwwICsxLDMzMSBAQAorLyogR1N0cmVhbWVyIEVsZW1lbnQKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA5IE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzA3LCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtY2Fwc3NldHRlcgorICoKKyAqIFNldHMgb3IgbWVyZ2VzIGNhcHMgb24gYSBzdHJlYW0ncyBidWZmZXJzLiBUaGF0IGlzLCBhIGJ1ZmZlcidzIGNhcHMgYXJlCisgKiB1cGRhdGVkIHVzaW5nIChmaWVsZHMgb2YpICNHc3RDYXBzU2V0dGVyOmNhcHMuIE5vdGUgdGhhdCB0aGlzIG1heSBjb250YWluCisgKiBtdWx0aXBsZSBzdHJ1Y3R1cmVzICh0aG91Z2ggbm90IGxpa2VseSByZWNvbW1lbmRlZCksIGJ1dCBlYWNoIG9mIHRoZXNlIG11c3QKKyAqIGJlIGZpeGVkIChvciB3aWxsIG90aGVyd2lzZSBiZSByZWplY3RlZCkuCisgKiAKKyAqIElmICNHc3RDYXBzU2V0dGVyOmpvaW4gaXMgJVRSVUUsIHRoZW4gdGhlIGluY29taW5nIGNhcHMnIG1pbWUtdHlwZSBpcworICogY29tcGFyZWQgdG8gdGhlIG1pbWUtdHlwZShzKSBvZiBwcm92aWRlZCBjYXBzIGFuZCBvbmx5IG1hdGNoaW5nIHN0cnVjdHVyZShzKQorICogYXJlIGNvbnNpZGVyZWQgZm9yIHVwZGF0aW5nLgorICogCisgKiBJZiAjR3N0Q2Fwc1NldHRlcjpyZXBsYWNlIGlzICVUUlVFLCB0aGVuIGFueSBjYXBzIHVwZGF0ZSBpcyBwcmVjZWRlZCBieQorICogY2xlYXJpbmcgZXhpc3RpbmcgZmllbGRzLCBtYWtpbmcgcHJvdmlkZWQgZmllbGRzIChhcyBhIHdob2xlKSByZXBsYWNlCisgKiBpbmNvbWluZyBvbmVzLiBPdGhlcndpc2UsIG5vIGNsZWFyaW5nIGlzIHBlcmZvcm1lZCwgaW4gd2hpY2ggY2FzZSBwcm92aWRlZAorICogZmllbGRzIGFyZSBhZGRlZC9tZXJnZWQgb250byBpbmNvbWluZyBjYXBzCisgKiAKKyAqIEFsdGhvdWdoIHRoaXMgZWxlbWVudCBtaWdodCBtYWlubHkgc2VydmUgYXMgZGVidWcgaGVscGVyLAorICogaXQgY2FuIGFsc28gcHJhY3RpY2FsbHkgYmUgdXNlZCB0byBjb3JyZWN0IGEgZmF1bHR5IHBpeGVsLWFzcGVjdC1yYXRpbywKKyAqIG9yIHRvIG1vZGlmeSBhIHl1diBmb3VyY2MgdmFsdWUgdG8gZWZmZWN0aXZlbHkgc3dhcCBjaHJvbWEgY29tcG9uZW50cyBvciBzdWNoCisgKiBhbGlrZS4KKyAqLworCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdGNhcHNzZXR0ZXIuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGNhcHNfc2V0dGVyX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGNhcHNfc2V0dGVyX2RlYnVnCisKKworLyogc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9DQVBTLAorICBQUk9QX0pPSU4sCisgIFBST1BfUkVQTEFDRQorICAgICAgLyogRklMTCBNRSAqLworfTsKKworI2RlZmluZSBERUZBVUxUX0pPSU4gICAgICAgICAgICAgIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9SRVBMQUNFICAgICAgICAgICBGQUxTRQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X2NhcHNfc2V0dGVyX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoR1NUX0JBU0VfVFJBTlNGT1JNX1NSQ19OQU1FLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X2NhcHNfc2V0dGVyX3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKEdTVF9CQVNFX1RSQU5TRk9STV9TSU5LX05BTUUsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfY2Fwc19zZXR0ZXJfdHJhbnNmb3JtX3NpemUgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLCBHc3RDYXBzICogY2FwcywgZ3NpemUgc2l6ZSwKKyAgICBHc3RDYXBzICogb3RoZXJjYXBzLCBnc2l6ZSAqIG90aGVyc2l6ZSk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X2NhcHNfc2V0dGVyX3RyYW5zZm9ybV9jYXBzIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0UGFkRGlyZWN0aW9uIGRpcmVjdGlvbiwgR3N0Q2FwcyAqIGNhcHMsIEdzdENhcHMgKiBjZmlsdGVyKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9jYXBzX3NldHRlcl90cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiBidHJhbnMsCisgICAgR3N0QnVmZmVyICogaW4pOworCitzdGF0aWMgdm9pZCBnc3RfY2Fwc19zZXR0ZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgdm9pZCBnc3RfY2Fwc19zZXR0ZXJfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2NhcHNfc2V0dGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworI2RlZmluZSBnc3RfY2Fwc19zZXR0ZXJfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0Q2Fwc1NldHRlciwgZ3N0X2NhcHNfc2V0dGVyLCBHU1RfVFlQRV9CQVNFX1RSQU5TRk9STSk7CisKK3N0YXRpYyB2b2lkCitnc3RfY2Fwc19zZXR0ZXJfY2xhc3NfaW5pdCAoR3N0Q2Fwc1NldHRlckNsYXNzICogZ19jbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBnX2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoZ19jbGFzcyk7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqdHJhbnNfY2xhc3MgPSAoR3N0QmFzZVRyYW5zZm9ybUNsYXNzICopIGdfY2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGNhcHNfc2V0dGVyX2RlYnVnLCAiY2Fwc3NldHRlciIsIDAsICJjYXBzc2V0dGVyIik7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2NhcHNfc2V0dGVyX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2NhcHNfc2V0dGVyX2dldF9wcm9wZXJ0eTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9jYXBzX3NldHRlcl9maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NBUFMsCisgICAgICBnX3BhcmFtX3NwZWNfYm94ZWQgKCJjYXBzIiwgIk1lcmdlIGNhcHMiLAorICAgICAgICAgICJNZXJnZSB0aGVzZSBjYXBzICh0aGVyZWJ5IG92ZXJ3cml0aW5nKSBpbiB0aGUgc3RyZWFtIiwKKyAgICAgICAgICBHU1RfVFlQRV9DQVBTLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9KT0lOLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJqb2luIiwgIkpvaW4iLAorICAgICAgICAgICJNYXRjaCBpbmNvbWluZyBjYXBzJyBtaW1lLXR5cGUgdG8gbWltZS10eXBlIG9mIHByb3ZpZGVkIGNhcHMiLAorICAgICAgICAgIERFRkFVTFRfSk9JTiwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkVQTEFDRSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgicmVwbGFjZSIsICJSZXBsYWNlIiwKKyAgICAgICAgICAiRHJvcCBmaWVsZHMgb2YgaW5jb21pbmcgY2FwcyIsIERFRkFVTFRfUkVQTEFDRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiQ2Fwc1NldHRlciIsCisgICAgICAiR2VuZXJpYyIsCisgICAgICAiU2V0L21lcmdlIGNhcHMgb24gc3RyZWFtIiwKKyAgICAgICJNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X2NhcHNfc2V0dGVyX3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfY2Fwc19zZXR0ZXJfc3JjX3RlbXBsYXRlKTsKKworICB0cmFuc19jbGFzcy0+dHJhbnNmb3JtX3NpemUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9jYXBzX3NldHRlcl90cmFuc2Zvcm1fc2l6ZSk7CisgIHRyYW5zX2NsYXNzLT50cmFuc2Zvcm1fY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2NhcHNfc2V0dGVyX3RyYW5zZm9ybV9jYXBzKTsKKyAgLyogZHVtbXkgc2VlbXMgbmVlZGVkICovCisgIHRyYW5zX2NsYXNzLT50cmFuc2Zvcm1faXAgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2NhcHNfc2V0dGVyX3RyYW5zZm9ybV9pcCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfY2Fwc19zZXR0ZXJfaW5pdCAoR3N0Q2Fwc1NldHRlciAqIGZpbHRlcikKK3sKKyAgZmlsdGVyLT5jYXBzID0gZ3N0X2NhcHNfbmV3X2FueSAoKTsKKyAgZmlsdGVyLT5qb2luID0gREVGQVVMVF9KT0lOOworICBmaWx0ZXItPnJlcGxhY2UgPSBERUZBVUxUX1JFUExBQ0U7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfY2Fwc19zZXR0ZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdENhcHNTZXR0ZXIgKmZpbHRlciA9IEdTVF9DQVBTX1NFVFRFUiAob2JqZWN0KTsKKworICBnc3RfY2Fwc19yZXBsYWNlICgmZmlsdGVyLT5jYXBzLCBOVUxMKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2NhcHNfc2V0dGVyX3RyYW5zZm9ybV9zaXplIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0UGFkRGlyZWN0aW9uIGRpcmVjdGlvbiwgR3N0Q2FwcyAqIGNhcHMsIGdzaXplIHNpemUsCisgICAgR3N0Q2FwcyAqIG90aGVyY2FwcywgZ3NpemUgKiBvdGhlcnNpemUpCit7CisgICpvdGhlcnNpemUgPSBzaXplOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfY2Fwc19zZXR0ZXJfdHJhbnNmb3JtX2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLCBHc3RDYXBzICogY2FwcywgR3N0Q2FwcyAqIGNmaWx0ZXIpCit7CisgIEdzdENhcHNTZXR0ZXIgKmZpbHRlciA9IEdTVF9DQVBTX1NFVFRFUiAodHJhbnMpOworICBHc3RDYXBzICpyZXQgPSBOVUxMLCAqZmlsdGVyX2NhcHMgPSBOVUxMOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZSwgKm1lcmdlOworICBjb25zdCBnY2hhciAqbmFtZTsKKyAgZ2ludCBpLCBqLCBrOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHRyYW5zLAorICAgICAgInJlY2VpdmluZyBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCAiLCB3aXRoIGZpbHRlcjogJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBjYXBzLCBjZmlsdGVyKTsKKworICAvKiBwYXNzIGZpbHRlciBjYXBzIHVwc3RyZWFtLCBvciBhbnkgaWYgbm8gZmlsdGVyICovCisgIGlmIChkaXJlY3Rpb24gIT0gR1NUX1BBRF9TSU5LKSB7CisgICAgaWYgKCFjZmlsdGVyIHx8IGdzdF9jYXBzX2lzX2VtcHR5IChjZmlsdGVyKSkgeworICAgICAgcmV0dXJuIGdzdF9jYXBzX3JlZiAoR1NUX0NBUFNfQU5ZKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGdzdF9jYXBzX3JlZiAoY2ZpbHRlcik7CisgICAgfQorICB9CisKKyAgcmV0ID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworICBmaWx0ZXJfY2FwcyA9IGdzdF9jYXBzX3JlZiAoZmlsdGVyLT5jYXBzKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGZpbHRlcik7CisKKyAgZm9yIChrID0gMDsgayA8IGdzdF9jYXBzX2dldF9zaXplIChyZXQpOyBrKyspIHsKKyAgICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChyZXQsIGspOworICAgIG5hbWUgPSBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzdHJ1Y3R1cmUpOworCisgICAgZm9yIChpID0gMDsgaSA8IGdzdF9jYXBzX2dldF9zaXplIChmaWx0ZXJfY2Fwcyk7ICsraSkgeworICAgICAgbWVyZ2UgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChmaWx0ZXJfY2FwcywgaSk7CisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAobWVyZ2UsIG5hbWUpIHx8ICFmaWx0ZXItPmpvaW4pIHsKKworICAgICAgICBpZiAoIWZpbHRlci0+am9pbikKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzdHJ1Y3R1cmUsIGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKG1lcmdlKSk7CisKKyAgICAgICAgaWYgKGZpbHRlci0+cmVwbGFjZSkKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9hbGxfZmllbGRzIChzdHJ1Y3R1cmUpOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBnc3Rfc3RydWN0dXJlX25fZmllbGRzIChtZXJnZSk7ICsraikgeworICAgICAgICAgIGNvbnN0IGdjaGFyICpmbmFtZTsKKworICAgICAgICAgIGZuYW1lID0gZ3N0X3N0cnVjdHVyZV9udGhfZmllbGRfbmFtZSAobWVyZ2UsIGopOworICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChzdHJ1Y3R1cmUsIGZuYW1lLAorICAgICAgICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAobWVyZ2UsIGZuYW1lKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUICh0cmFucywgInJldHVybmluZyBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgcmV0KTsKKworICBnc3RfY2Fwc191bnJlZiAoZmlsdGVyX2NhcHMpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfY2Fwc19zZXR0ZXJfdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogYnRyYW5zLCBHc3RCdWZmZXIgKiBpbikKK3sKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9jYXBzX2lzX2ZpeGVkX2ZvcmVhY2ggKEdRdWFyayBmaWVsZF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsCisgICAgZ3BvaW50ZXIgdW51c2VkKQoreworICByZXR1cm4gZ3N0X3ZhbHVlX2lzX2ZpeGVkICh2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfY2Fwc19zZXR0ZXJfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdENhcHNTZXR0ZXIgKmZpbHRlciA9IEdTVF9DQVBTX1NFVFRFUiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ0FQUzp7CisgICAgICBHc3RDYXBzICpuZXdfY2FwczsKKyAgICAgIGNvbnN0IEdzdENhcHMgKm5ld19jYXBzX3ZhbCA9IGdzdF92YWx1ZV9nZXRfY2FwcyAodmFsdWUpOworICAgICAgZ2ludCBpOworCisgICAgICBpZiAobmV3X2NhcHNfdmFsID09IE5VTEwpIHsKKyAgICAgICAgbmV3X2NhcHMgPSBnc3RfY2Fwc19uZXdfYW55ICgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmV3X2NhcHMgPSBnc3RfY2Fwc19jb3B5IChuZXdfY2Fwc192YWwpOworICAgICAgfQorCisgICAgICBmb3IgKGkgPSAwOyBuZXdfY2FwcyAmJiAoaSA8IGdzdF9jYXBzX2dldF9zaXplIChuZXdfY2FwcykpOyArK2kpIHsKKyAgICAgICAgR3N0U3RydWN0dXJlICpzOworCisgICAgICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChuZXdfY2FwcywgaSk7CisgICAgICAgIGlmICghZ3N0X3N0cnVjdHVyZV9mb3JlYWNoIChzLCBnc3RfY2Fwc19pc19maXhlZF9mb3JlYWNoLCBOVUxMKSkgeworICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGZpbHRlciwgInJlamVjdGVkIHVuZml4ZWQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgICAgICAgIG5ld19jYXBzKTsKKyAgICAgICAgICBnc3RfY2Fwc191bnJlZiAobmV3X2NhcHMpOworICAgICAgICAgIG5ld19jYXBzID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAobmV3X2NhcHMpIHsKKyAgICAgICAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworICAgICAgICBnc3RfY2Fwc19yZXBsYWNlICgmZmlsdGVyLT5jYXBzLCBuZXdfY2Fwcyk7CisgICAgICAgIC8qIGRyb3AgZXh0cmEgcmVmICovCisgICAgICAgIGdzdF9jYXBzX3VucmVmIChuZXdfY2Fwcyk7CisgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwgInNldCBuZXcgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgbmV3X2NhcHMpOworICAgICAgfQorCisgICAgICAvKiB0cnkgdG8gYWN0aXZhdGUgdGhlc2UgbmV3IGNhcHMgbmV4dCB0aW1lIGFyb3VuZCAqLworICAgICAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3JlY29uZmlndXJlX3NyYyAoR1NUX0JBU0VfVFJBTlNGT1JNIChmaWx0ZXIpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfSk9JTjoKKyAgICAgIGZpbHRlci0+am9pbiA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRVBMQUNFOgorICAgICAgZmlsdGVyLT5yZXBsYWNlID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2NhcHNfc2V0dGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RDYXBzU2V0dGVyICpmaWx0ZXIgPSBHU1RfQ0FQU19TRVRURVIgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0NBUFM6CisgICAgICBnc3RfdmFsdWVfc2V0X2NhcHMgKHZhbHVlLCBmaWx0ZXItPmNhcHMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0pPSU46CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZmlsdGVyLT5qb2luKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRVBMQUNFOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIGZpbHRlci0+cmVwbGFjZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmggYi9nc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ2YmYxOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNzZXR0ZXIuaApAQCAtMCwwICsxLDYzIEBACisvKiBHU3RyZWFtZXIgRWxlbWVudAorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDkgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDcsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfQ0FQU19TRVRURVJfSF9fCisjZGVmaW5lIF9fR1NUX0NBUFNfU0VUVEVSX0hfXworCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQ0FQU19TRVRURVIgXAorICAoZ3N0X2NhcHNfc2V0dGVyX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9DQVBTX1NFVFRFUihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0NBUFNfU0VUVEVSLEdzdENhcHNTZXR0ZXIpKQorI2RlZmluZSBHU1RfQ0FQU19TRVRURVJfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfQ0FQU19TRVRURVIsR3N0Q2Fwc1NldHRlckNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0NBUFNfU0VUVEVSKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQ0FQU19TRVRURVIpKQorI2RlZmluZSBHU1RfSVNfQ0FQU19TRVRURVJfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfQ0FQU19TRVRURVIpKQorCitHVHlwZSBnc3RfY2Fwc19zZXR0ZXJfZ2V0X3R5cGUgKHZvaWQpOworCit0eXBlZGVmIHN0cnVjdCBfR3N0Q2Fwc1NldHRlciBHc3RDYXBzU2V0dGVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdENhcHNTZXR0ZXJDbGFzcyBHc3RDYXBzU2V0dGVyQ2xhc3M7CisKK3N0cnVjdCBfR3N0Q2Fwc1NldHRlcgoreworICBHc3RCYXNlVHJhbnNmb3JtIHBhcmVudDsKKworICAvKiA8IHByaXZhdGUgPiAqLworICAvKiBwcm9wZXJ0aWVzICovCisgIEdzdENhcHMgKmNhcHM7CisgIGdib29sZWFuIGpvaW47CisgIGdib29sZWFuIHJlcGxhY2U7Cit9OworCisKK3N0cnVjdCBfR3N0Q2Fwc1NldHRlckNsYXNzCit7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfQ0FQU19TRVRURVJfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9nc3RkZWJ1Zy5jIGIvZ3N0L2RlYnVndXRpbHMvZ3N0ZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTZhYTlmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlYnVndXRpbHMvZ3N0ZGVidWcuYwpAQCAtMCwwICsxLDc2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBCZW5qYW1pbiBPdHRlIDxvdHRlQGdub21lLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworR1R5cGUgZ3N0X2JyZWFrX215X2RhdGFfZ2V0X3R5cGUgKHZvaWQpOworLy9HVHlwZSBnc3RfY2Fwc19kZWJ1Z19nZXRfdHlwZSAodm9pZCk7CitHVHlwZSBnc3RfY2Fwc19zZXR0ZXJfZ2V0X3R5cGUgKHZvaWQpOworR1R5cGUgZ3N0X3JuZF9idWZmZXJfc2l6ZV9nZXRfdHlwZSAodm9pZCk7CitHVHlwZSBnc3RfbmF2c2Vla19nZXRfdHlwZSAodm9pZCk7CitHVHlwZSBnc3RfcHJvZ3Jlc3NfcmVwb3J0X2dldF90eXBlICh2b2lkKTsKK0dUeXBlIGdzdF90YWdfaW5qZWN0X2dldF90eXBlICh2b2lkKTsKK0dUeXBlIGdzdF90ZXN0X2dldF90eXBlICh2b2lkKTsKK0dUeXBlIGdzdF9wdXNoX2ZpbGVfc3JjX2dldF90eXBlICh2b2lkKTsKKy8qCitHVHlwZSBnc3RfZ3N0X25lZ290aWF0aW9uX2dldF90eXBlICh2b2lkKTsKKyovCitHVHlwZSBnc3RfY3B1X3JlcG9ydF9nZXRfdHlwZSAodm9pZCk7CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYnJlYWtteWRhdGEiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIGdzdF9icmVha19teV9kYXRhX2dldF90eXBlICgpKQorICAgICAgfHwgIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJjYXBzc2V0dGVyIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBnc3RfY2Fwc19zZXR0ZXJfZ2V0X3R5cGUgKCkpCisgICAgICB8fCAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJuZGJ1ZmZlcnNpemUiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIGdzdF9ybmRfYnVmZmVyX3NpemVfZ2V0X3R5cGUgKCkpCisgICAgICB8fCAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIm5hdnNlZWsiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIGdzdF9uYXZzZWVrX2dldF90eXBlICgpKQorICAgICAgfHwgIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJwdXNoZmlsZXNyYyIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgZ3N0X3B1c2hfZmlsZV9zcmNfZ2V0X3R5cGUgKCkpIHx8CisvKiAgICAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIm5lZ290aWF0aW9uIiwgR1NUX1JBTktfTk9ORSwgZ3N0X2dzdF9uZWdvdGlhdGlvbl9nZXRfdHlwZSAoKSkgfHwgKi8KKyAgICAgICFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicHJvZ3Jlc3NyZXBvcnQiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIGdzdF9wcm9ncmVzc19yZXBvcnRfZ2V0X3R5cGUgKCkpCisgICAgICB8fCAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInRhZ2luamVjdCIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgZ3N0X3RhZ19pbmplY3RfZ2V0X3R5cGUgKCkpCisgICAgICB8fCAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInRlc3RzaW5rIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBnc3RfdGVzdF9nZXRfdHlwZSAoKSkKKyNpZiAwCisgICAgICB8fCAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImNhcHNkZWJ1ZyIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgZ3N0X2NhcHNfZGVidWdfZ2V0X3R5cGUgKCkpCisjZW5kaWYKKyAgICAgIHx8ICFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiY3B1cmVwb3J0IiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBnc3RfY3B1X3JlcG9ydF9nZXRfdHlwZSAoKSkpCisKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBkZWJ1ZywKKyAgICAiZWxlbWVudHMgZm9yIHRlc3RpbmcgYW5kIGRlYnVnZ2luZyIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L2RlYnVndXRpbHMvZ3N0bmF2aWdhdGlvbnRlc3QuYyBiL2dzdC9kZWJ1Z3V0aWxzL2dzdG5hdmlnYXRpb250ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyZmUxMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWJ1Z3V0aWxzL2dzdG5hdmlnYXRpb250ZXN0LmMKQEAgLTAsMCArMSwyNzcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdG5hdmlnYXRpb250ZXN0LmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpZmRlZiBfTVNDX1ZFUgorI2RlZmluZSByaW50KHgpIChmbG9vcigoeCkrMC41KSkKKyNlbmRpZgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChuYXZpZ2F0aW9udGVzdF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBuYXZpZ2F0aW9udGVzdF9kZWJ1ZworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X25hdmlnYXRpb250ZXN0X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgiSTQyMCIpKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfbmF2aWdhdGlvbnRlc3Rfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJJNDIwIikpCisgICAgKTsKKworI2RlZmluZSBnc3RfbmF2aWdhdGlvbnRlc3RfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0TmF2aWdhdGlvbnRlc3QsIGdzdF9uYXZpZ2F0aW9udGVzdCwgR1NUX1RZUEVfVklERU9fRklMVEVSKTsKKworc3RhdGljIGdib29sZWFuCitnc3RfbmF2aWdhdGlvbnRlc3Rfc3JjX2V2ZW50IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFZpZGVvSW5mbyAqaW5mbzsKKyAgR3N0TmF2aWdhdGlvbnRlc3QgKm5hdnRlc3Q7CisgIGNvbnN0IGdjaGFyICp0eXBlOworCisgIG5hdnRlc3QgPSBHU1RfTkFWSUdBVElPTlRFU1QgKHRyYW5zKTsKKworICBpbmZvID0gJkdTVF9WSURFT19GSUxURVIgKHRyYW5zKS0+aW5faW5mbzsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9OQVZJR0FUSU9OOgorICAgIHsKKyAgICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChldmVudCk7CisgICAgICBnaW50IGZwc19uLCBmcHNfZDsKKworICAgICAgZnBzX24gPSBHU1RfVklERU9fSU5GT19GUFNfTiAoaW5mbyk7CisgICAgICBmcHNfZCA9IEdTVF9WSURFT19JTkZPX0ZQU19EIChpbmZvKTsKKworICAgICAgdHlwZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgImV2ZW50Iik7CisgICAgICBpZiAoZ19zdHJfZXF1YWwgKHR5cGUsICJtb3VzZS1tb3ZlIikpIHsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfZG91YmxlIChzLCAicG9pbnRlcl94IiwgJm5hdnRlc3QtPngpOworICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9kb3VibGUgKHMsICJwb2ludGVyX3kiLCAmbmF2dGVzdC0+eSk7CisgICAgICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsICh0eXBlLCAibW91c2UtYnV0dG9uLXByZXNzIikpIHsKKyAgICAgICAgQnV0dG9uQ2xpY2sgKmNsaWNrID0gZ19uZXcgKEJ1dHRvbkNsaWNrLCAxKTsKKworICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9kb3VibGUgKHMsICJwb2ludGVyX3giLCAmY2xpY2stPngpOworICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9kb3VibGUgKHMsICJwb2ludGVyX3kiLCAmY2xpY2stPnkpOworICAgICAgICBjbGljay0+aW1hZ2VzX2xlZnQgPSAoZnBzX24gKyBmcHNfZCAtIDEpIC8gZnBzX2Q7CisgICAgICAgIC8qIGdyZWVuICovCisgICAgICAgIGNsaWNrLT5jeSA9IDE1MDsKKyAgICAgICAgY2xpY2stPmN1ID0gNDY7CisgICAgICAgIGNsaWNrLT5jdiA9IDIxOworICAgICAgICBuYXZ0ZXN0LT5jbGlja3MgPSBnX3NsaXN0X3ByZXBlbmQgKG5hdnRlc3QtPmNsaWNrcywgY2xpY2spOworICAgICAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAodHlwZSwgIm1vdXNlLWJ1dHRvbi1yZWxlYXNlIikpIHsKKyAgICAgICAgQnV0dG9uQ2xpY2sgKmNsaWNrID0gZ19uZXcgKEJ1dHRvbkNsaWNrLCAxKTsKKworICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9kb3VibGUgKHMsICJwb2ludGVyX3giLCAmY2xpY2stPngpOworICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9kb3VibGUgKHMsICJwb2ludGVyX3kiLCAmY2xpY2stPnkpOworICAgICAgICBjbGljay0+aW1hZ2VzX2xlZnQgPSAoZnBzX24gKyBmcHNfZCAtIDEpIC8gZnBzX2Q7CisgICAgICAgIC8qIHJlZCAqLworICAgICAgICBjbGljay0+Y3kgPSA3NjsKKyAgICAgICAgY2xpY2stPmN1ID0gODU7CisgICAgICAgIGNsaWNrLT5jdiA9IDI1NTsKKyAgICAgICAgbmF2dGVzdC0+Y2xpY2tzID0gZ19zbGlzdF9wcmVwZW5kIChuYXZ0ZXN0LT5jbGlja3MsIGNsaWNrKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAocGFyZW50X2NsYXNzKS0+c3JjX2V2ZW50ICh0cmFucywgZXZlbnQpOworfQorCisvKiBVc2VmdWwgbWFjcm9zICovCisjZGVmaW5lIEdTVF9WSURFT19JNDIwX1lfUk9XU1RSSURFKHdpZHRoKSAoR1NUX1JPVU5EX1VQXzQod2lkdGgpKQorI2RlZmluZSBHU1RfVklERU9fSTQyMF9VX1JPV1NUUklERSh3aWR0aCkgKEdTVF9ST1VORF9VUF84KHdpZHRoKS8yKQorI2RlZmluZSBHU1RfVklERU9fSTQyMF9WX1JPV1NUUklERSh3aWR0aCkgKChHU1RfUk9VTkRfVVBfOChHU1RfVklERU9fSTQyMF9ZX1JPV1NUUklERSh3aWR0aCkpKS8yKQorCisjZGVmaW5lIEdTVF9WSURFT19JNDIwX1lfT0ZGU0VUKHcsaCkgKDApCisjZGVmaW5lIEdTVF9WSURFT19JNDIwX1VfT0ZGU0VUKHcsaCkgKEdTVF9WSURFT19JNDIwX1lfT0ZGU0VUKHcsaCkrKEdTVF9WSURFT19JNDIwX1lfUk9XU1RSSURFKHcpKkdTVF9ST1VORF9VUF8yKGgpKSkKKyNkZWZpbmUgR1NUX1ZJREVPX0k0MjBfVl9PRkZTRVQodyxoKSAoR1NUX1ZJREVPX0k0MjBfVV9PRkZTRVQodyxoKSsoR1NUX1ZJREVPX0k0MjBfVV9ST1dTVFJJREUodykqR1NUX1JPVU5EX1VQXzIoaCkvMikpCisKKyNkZWZpbmUgR1NUX1ZJREVPX0k0MjBfU0laRSh3LGgpICAgICAoR1NUX1ZJREVPX0k0MjBfVl9PRkZTRVQodyxoKSsoR1NUX1ZJREVPX0k0MjBfVl9ST1dTVFJJREUodykqR1NUX1JPVU5EX1VQXzIoaCkvMikpCisKK3N0YXRpYyB2b2lkCitkcmF3X2JveF9wbGFuYXI0MTEgKEdzdFZpZGVvRnJhbWUgKiBmcmFtZSwgaW50IHgsIGludCB5LAorICAgIGd1aW50OCBjb2xvcnksIGd1aW50OCBjb2xvcnUsIGd1aW50OCBjb2xvcnYpCit7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgaW50IHgxLCB4MiwgeTEsIHkyOworICBndWludDggKmQ7CisgIGdpbnQgc3RyaWRlOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChmcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGZyYW1lKTsKKworICBpZiAoeCA8IDAgfHwgeSA8IDAgfHwgeCA+PSB3aWR0aCB8fCB5ID49IGhlaWdodCkKKyAgICByZXR1cm47CisKKyAgeDEgPSBNQVggKHggLSA1LCAwKTsKKyAgeDIgPSBNSU4gKHggKyA1LCB3aWR0aCk7CisgIHkxID0gTUFYICh5IC0gNSwgMCk7CisgIHkyID0gTUlOICh5ICsgNSwgaGVpZ2h0KTsKKworICBkID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZyYW1lLCAwKTsKKyAgc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoZnJhbWUsIDApOworCisgIGZvciAoeSA9IHkxOyB5IDwgeTI7IHkrKykgeworICAgIGZvciAoeCA9IHgxOyB4IDwgeDI7IHgrKykgeworICAgICAgZFt5ICogc3RyaWRlICsgeF0gPSBjb2xvcnk7CisgICAgfQorICB9CisKKyAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMSk7CisgIHN0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGZyYW1lLCAxKTsKKworICB4MSAvPSAyOworICB4MiAvPSAyOworICB5MSAvPSAyOworICB5MiAvPSAyOworICBmb3IgKHkgPSB5MTsgeSA8IHkyOyB5KyspIHsKKyAgICBmb3IgKHggPSB4MTsgeCA8IHgyOyB4KyspIHsKKyAgICAgIGRbeSAqIHN0cmlkZSArIHhdID0gY29sb3J1OworICAgIH0KKyAgfQorCisgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZnJhbWUsIDIpOworICBzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChmcmFtZSwgMik7CisKKyAgZm9yICh5ID0geTE7IHkgPCB5MjsgeSsrKSB7CisgICAgZm9yICh4ID0geDE7IHggPCB4MjsgeCsrKSB7CisgICAgICBkW3kgKiBzdHJpZGUgKyB4XSA9IGNvbG9ydjsKKyAgICB9CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9uYXZpZ2F0aW9udGVzdF90cmFuc2Zvcm1fZnJhbWUgKEdzdFZpZGVvRmlsdGVyICogZmlsdGVyLAorICAgIEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSkKK3sKKyAgR3N0TmF2aWdhdGlvbnRlc3QgKm5hdnRlc3QgPSBHU1RfTkFWSUdBVElPTlRFU1QgKGZpbHRlcik7CisgIEdTTGlzdCAqd2FsazsKKworICBnc3RfdmlkZW9fZnJhbWVfY29weSAob3V0X2ZyYW1lLCBpbl9mcmFtZSk7CisKKyAgd2FsayA9IG5hdnRlc3QtPmNsaWNrczsKKyAgd2hpbGUgKHdhbGspIHsKKyAgICBCdXR0b25DbGljayAqY2xpY2sgPSB3YWxrLT5kYXRhOworCisgICAgd2FsayA9IGdfc2xpc3RfbmV4dCAod2Fsayk7CisgICAgZHJhd19ib3hfcGxhbmFyNDExIChvdXRfZnJhbWUsCisgICAgICAgIHJpbnQgKGNsaWNrLT54KSwgcmludCAoY2xpY2stPnkpLCBjbGljay0+Y3ksIGNsaWNrLT5jdSwgY2xpY2stPmN2KTsKKyAgICBpZiAoLS1jbGljay0+aW1hZ2VzX2xlZnQgPCAxKSB7CisgICAgICBuYXZ0ZXN0LT5jbGlja3MgPSBnX3NsaXN0X3JlbW92ZSAobmF2dGVzdC0+Y2xpY2tzLCBjbGljayk7CisgICAgICBnX2ZyZWUgKGNsaWNrKTsKKyAgICB9CisgIH0KKyAgZHJhd19ib3hfcGxhbmFyNDExIChvdXRfZnJhbWUsCisgICAgICByaW50IChuYXZ0ZXN0LT54KSwgcmludCAobmF2dGVzdC0+eSksIDAsIDEyOCwgMTI4KTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X25hdmlnYXRpb250ZXN0X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTOworICBHc3ROYXZpZ2F0aW9udGVzdCAqbmF2dGVzdCA9IEdTVF9OQVZJR0FUSU9OVEVTVCAoZWxlbWVudCk7CisKKyAgaWYgKEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUpCisgICAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgLyogZG93bndhcmRzIHN0YXRlIGNoYW5nZXMgKi8KKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICB7CisgICAgICBnX3NsaXN0X2ZvcmVhY2ggKG5hdnRlc3QtPmNsaWNrcywgKEdGdW5jKSBnX2ZyZWUsIE5VTEwpOworICAgICAgZ19zbGlzdF9mcmVlIChuYXZ0ZXN0LT5jbGlja3MpOworICAgICAgbmF2dGVzdC0+Y2xpY2tzID0gTlVMTDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X25hdmlnYXRpb250ZXN0X2NsYXNzX2luaXQgKEdzdE5hdmlnYXRpb250ZXN0Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKnRyYW5zX2NsYXNzOworICBHc3RWaWRlb0ZpbHRlckNsYXNzICp2ZmlsdGVyX2NsYXNzOworCisgIGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICB0cmFuc19jbGFzcyA9IChHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKikga2xhc3M7CisgIHZmaWx0ZXJfY2xhc3MgPSAoR3N0VmlkZW9GaWx0ZXJDbGFzcyAqKSBrbGFzczsKKworICBlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9uYXZpZ2F0aW9udGVzdF9jaGFuZ2Vfc3RhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJWaWRlbyBuYXZpZ2F0aW9uIHRlc3QiLAorICAgICAgIkZpbHRlci9FZmZlY3QvVmlkZW8iLAorICAgICAgIkhhbmRsZSBuYXZpZ2F0aW9uIGV2ZW50cyBzaG93aW5nIGEgYmxhY2sgc3F1YXJlIGZvbGxvd2luZyBtb3VzZSBwb2ludGVyIiwKKyAgICAgICJEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfbmF2aWdhdGlvbnRlc3Rfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9uYXZpZ2F0aW9udGVzdF9zcmNfdGVtcGxhdGUpOworCisgIHRyYW5zX2NsYXNzLT5zcmNfZXZlbnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X25hdmlnYXRpb250ZXN0X3NyY19ldmVudCk7CisKKyAgdmZpbHRlcl9jbGFzcy0+dHJhbnNmb3JtX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbmF2aWdhdGlvbnRlc3RfdHJhbnNmb3JtX2ZyYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9uYXZpZ2F0aW9udGVzdF9pbml0IChHc3ROYXZpZ2F0aW9udGVzdCAqIG5hdnRlc3QpCit7CisgIG5hdnRlc3QtPnggPSAtMTsKKyAgbmF2dGVzdC0+eSA9IC0xOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChuYXZpZ2F0aW9udGVzdF9kZWJ1ZywgIm5hdmlnYXRpb250ZXN0IiwgMCwKKyAgICAgICJuYXZpZ2F0aW9udGVzdCIpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAibmF2aWdhdGlvbnRlc3QiLCBHU1RfUkFOS19OT05FLAorICAgICAgR1NUX1RZUEVfTkFWSUdBVElPTlRFU1QpOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgbmF2aWdhdGlvbnRlc3QsCisgICAgIlRlbXBsYXRlIGZvciBhIHZpZGVvIGZpbHRlciIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sIEdTVF9MSUNFTlNFLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9nc3RuYXZpZ2F0aW9udGVzdC5oIGIvZ3N0L2RlYnVndXRpbHMvZ3N0bmF2aWdhdGlvbnRlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWNmNDU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlYnVndXRpbHMvZ3N0bmF2aWdhdGlvbnRlc3QuaApAQCAtMCwwICsxLDY1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX05BVklHQVRJT05URVNUX0hfXworI2RlZmluZSBfX0dTVF9OQVZJR0FUSU9OVEVTVF9IX18KKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2ZpbHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX05BVklHQVRJT05URVNUIFwKKyAgKGdzdF9uYXZpZ2F0aW9udGVzdF9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfTkFWSUdBVElPTlRFU1Qob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9OQVZJR0FUSU9OVEVTVCxHc3ROYXZpZ2F0aW9udGVzdCkpCisjZGVmaW5lIEdTVF9OQVZJR0FUSU9OVEVTVF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9OQVZJR0FUSU9OVEVTVCxHc3ROYXZpZ2F0aW9udGVzdENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX05BVklHQVRJT05URVNUKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfTkFWSUdBVElPTlRFU1QpKQorI2RlZmluZSBHU1RfSVNfTkFWSUdBVElPTlRFU1RfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfTkFWSUdBVElPTlRFU1QpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdE5hdmlnYXRpb250ZXN0IEdzdE5hdmlnYXRpb250ZXN0OwordHlwZWRlZiBzdHJ1Y3QgX0dzdE5hdmlnYXRpb250ZXN0Q2xhc3MgR3N0TmF2aWdhdGlvbnRlc3RDbGFzczsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ2RvdWJsZSB4OworICBnZG91YmxlIHk7CisgIGdpbnQgaW1hZ2VzX2xlZnQ7CisgIGd1aW50OCBjeSwgY3UsIGN2OworfSBCdXR0b25DbGljazsKKworc3RydWN0IF9Hc3ROYXZpZ2F0aW9udGVzdAoreworICBHc3RWaWRlb0ZpbHRlciB2aWRlb2ZpbHRlcjsKKworICBnZG91YmxlIHgsIHk7CisgIEdTTGlzdCAqY2xpY2tzOworfTsKKworc3RydWN0IF9Hc3ROYXZpZ2F0aW9udGVzdENsYXNzCit7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X25hdmlnYXRpb250ZXN0X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9OQVZJR0FUSU9OVEVTVF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9kZWJ1Z3V0aWxzL2dzdG5hdnNlZWsuYyBiL2dzdC9kZWJ1Z3V0aWxzL2dzdG5hdnNlZWsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDkzODZjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlYnVndXRpbHMvZ3N0bmF2c2Vlay5jCkBAIC0wLDAgKzEsMzkwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyAocHJvYmFibHkpIGdlbmVyYXRlZCBmcm9tIGdzdG5hdnNlZWsuYywKKyAqIGdzdG5hdnNlZWsuYyx2IDEuNyAyMDAzLzExLzA4IDAyOjQ4OjU5IGRzY2hsZWVmIEV4cCAKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RuYXZzZWVrLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9TRUVLT0ZGU0VUCit9OworCitHc3RTdGF0aWNQYWRUZW1wbGF0ZSBuYXZzZWVrX3NyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKKworR3N0U3RhdGljUGFkVGVtcGxhdGUgbmF2c2Vla19zaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbmF2c2Vla19zaW5rX2V2ZW50IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfbmF2c2Vla190cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNldHJhbnMsCisgICAgR3N0QnVmZmVyICogYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbmF2c2Vla19zcmNfZXZlbnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbmF2c2Vla19zdG9wIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpOworc3RhdGljIGdib29sZWFuIGdzdF9uYXZzZWVrX3N0YXJ0IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpOworCitzdGF0aWMgdm9pZCBnc3RfbmF2c2Vla19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfbmF2c2Vla19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK0dUeXBlIGdzdF9uYXZzZWVrX2dldF90eXBlICh2b2lkKTsKKyNkZWZpbmUgZ3N0X25hdnNlZWtfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0TmF2U2VlaywgZ3N0X25hdnNlZWssIEdTVF9UWVBFX0JBU0VfVFJBTlNGT1JNKTsKKworc3RhdGljIHZvaWQKK2dzdF9uYXZzZWVrX2NsYXNzX2luaXQgKEdzdE5hdlNlZWtDbGFzcyAqIGtsYXNzKQoreworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKmdzdGJhc2V0cmFuc19jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBnc3RiYXNldHJhbnNfY2xhc3MgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfbmF2c2Vla19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9uYXZzZWVrX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9TRUVLT0ZGU0VULCBnX3BhcmFtX3NwZWNfZG91YmxlICgic2Vlay1vZmZzZXQiLCAiU2VlayBPZmZzZXQiLAorICAgICAgICAgICJUaW1lIGluIHNlY29uZHMgdG8gc2VlayBieSIsIDAuMCwgR19NQVhET1VCTEUsIDUuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZuYXZzZWVrX3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZuYXZzZWVrX3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywKKyAgICAgICJTZWVrIGJhc2VkIG9uIGxlZnQtcmlnaHQgYXJyb3dzIiwgIkZpbHRlci9WaWRlbyIsCisgICAgICAiU2VlayBiYXNlZCBvbiBuYXZpZ2F0aW9uIGtleXMgbGVmdC1yaWdodCIsCisgICAgICAiSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+Iik7CisKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzLT5zcmNfZXZlbnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X25hdnNlZWtfc3JjX2V2ZW50KTsKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzLT5zaW5rX2V2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9uYXZzZWVrX3NpbmtfZXZlbnQpOworICBnc3RiYXNldHJhbnNfY2xhc3MtPnRyYW5zZm9ybV9pcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X25hdnNlZWtfdHJhbnNmb3JtX2lwKTsKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbmF2c2Vla19zdGFydCk7CisgIGdzdGJhc2V0cmFuc19jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbmF2c2Vla19zdG9wKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9uYXZzZWVrX2luaXQgKEdzdE5hdlNlZWsgKiBuYXZzZWVrKQoreworICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X3Bhc3N0aHJvdWdoIChHU1RfQkFTRV9UUkFOU0ZPUk0gKG5hdnNlZWspLCBUUlVFKTsKKworICBuYXZzZWVrLT5zZWVrX29mZnNldCA9IDUuMDsKKyAgbmF2c2Vlay0+bG9vcCA9IEZBTFNFOworICBuYXZzZWVrLT5ncmFiX3NlZ19zdGFydCA9IEZBTFNFOworICBuYXZzZWVrLT5ncmFiX3NlZ19lbmQgPSBGQUxTRTsKKyAgbmF2c2Vlay0+c2VnbWVudF9zdGFydCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIG5hdnNlZWstPnNlZ21lbnRfZW5kID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9uYXZzZWVrX3NlZWsgKEdzdE5hdlNlZWsgKiBuYXZzZWVrLCBnaW50NjQgb2Zmc2V0KQoreworICBnYm9vbGVhbiByZXQ7CisgIEdzdFBhZCAqcGVlcl9wYWQ7CisgIGdpbnQ2NCBwZWVyX3ZhbHVlOworCisgIC8qIFF1ZXJ5IGZvciB0aGUgY3VycmVudCB0aW1lIHRoZW4gYXR0ZW1wdCB0byBzZXQgdG8gdGltZSArIG9mZnNldCAqLworICBwZWVyX3BhZCA9IGdzdF9wYWRfZ2V0X3BlZXIgKEdTVF9CQVNFX1RSQU5TRk9STSAobmF2c2VlayktPnNpbmtwYWQpOworICByZXQgPSBnc3RfcGFkX3F1ZXJ5X3Bvc2l0aW9uIChwZWVyX3BhZCwgR1NUX0ZPUk1BVF9USU1FLCAmcGVlcl92YWx1ZSk7CisKKyAgaWYgKHJldCkgeworICAgIEdzdEV2ZW50ICpldmVudDsKKworICAgIHBlZXJfdmFsdWUgKz0gb2Zmc2V0OworICAgIGlmIChwZWVyX3ZhbHVlIDwgMCkKKyAgICAgIHBlZXJfdmFsdWUgPSAwOworCisgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZWsgKDEuMCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICBHU1RfU0VFS19GTEFHX0FDQ1VSQVRFIHwgR1NUX1NFRUtfRkxBR19GTFVTSCwKKyAgICAgICAgR1NUX1NFRUtfVFlQRV9TRVQsIHBlZXJfdmFsdWUsIEdTVF9TRUVLX1RZUEVfTk9ORSwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisKKyAgICBnc3RfcGFkX3NlbmRfZXZlbnQgKHBlZXJfcGFkLCBldmVudCk7CisgIH0KKworICBnc3Rfb2JqZWN0X3VucmVmIChwZWVyX3BhZCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbmF2c2Vla19jaGFuZ2VfcGxheWJhY2tfcmF0ZSAoR3N0TmF2U2VlayAqIG5hdnNlZWssIGdkb3VibGUgcmF0ZSkKK3sKKyAgZ2Jvb2xlYW4gcmV0OworICBHc3RQYWQgKnBlZXJfcGFkOworICBnaW50NjQgY3VycmVudF9wb3NpdGlvbjsKKworICBwZWVyX3BhZCA9IGdzdF9wYWRfZ2V0X3BlZXIgKEdTVF9CQVNFX1RSQU5TRk9STSAobmF2c2VlayktPnNpbmtwYWQpOworICByZXQgPSBnc3RfcGFkX3F1ZXJ5X3Bvc2l0aW9uIChwZWVyX3BhZCwgR1NUX0ZPUk1BVF9USU1FLCAmY3VycmVudF9wb3NpdGlvbik7CisKKyAgaWYgKHJldCkgeworICAgIEdzdEV2ZW50ICpldmVudDsKKyAgICBnaW50NjQgc3RhcnQ7CisgICAgZ2ludDY0IHN0b3A7CisKKyAgICBpZiAocmF0ZSA+IDAuMCkgeworICAgICAgc3RhcnQgPSBjdXJyZW50X3Bvc2l0aW9uOworICAgICAgc3RvcCA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAvKiBuZWdhdGl2ZSByYXRlOiB3ZSBwbGF5IGZyb20gc3RvcCB0byBzdGFydCAqLworICAgICAgc3RhcnQgPSAwOworICAgICAgc3RvcCA9IGN1cnJlbnRfcG9zaXRpb247CisgICAgfQorCisgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZWsgKHJhdGUsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgR1NUX1NFRUtfRkxBR19BQ0NVUkFURSB8IEdTVF9TRUVLX0ZMQUdfRkxVU0ggfCBHU1RfU0VFS19GTEFHX1NLSVAsCisgICAgICAgIEdTVF9TRUVLX1RZUEVfU0VULCBzdGFydCwgR1NUX1NFRUtfVFlQRV9TRVQsIHN0b3ApOworCisgICAgZ3N0X3BhZF9zZW5kX2V2ZW50IChwZWVyX3BhZCwgZXZlbnQpOworICB9CisgIGdzdF9vYmplY3RfdW5yZWYgKHBlZXJfcGFkKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9uYXZzZWVrX3NlZ3NlZWsgKEdzdE5hdlNlZWsgKiBuYXZzZWVrKQoreworICBHc3RFdmVudCAqZXZlbnQ7CisgIEdzdFBhZCAqcGVlcl9wYWQ7CisKKyAgaWYgKChuYXZzZWVrLT5zZWdtZW50X3N0YXJ0ID09IEdTVF9DTE9DS19USU1FX05PTkUpIHx8CisgICAgICAobmF2c2Vlay0+c2VnbWVudF9lbmQgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgfHwKKyAgICAgICghR1NUX1BBRF9JU19MSU5LRUQgKEdTVF9CQVNFX1RSQU5TRk9STSAobmF2c2VlayktPnNpbmtwYWQpKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChuYXZzZWVrLT5sb29wKSB7CisgICAgZXZlbnQgPQorICAgICAgICBnc3RfZXZlbnRfbmV3X3NlZWsgKDEuMCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICBHU1RfU0VFS19GTEFHX0FDQ1VSQVRFIHwgR1NUX1NFRUtfRkxBR19TRUdNRU5ULAorICAgICAgICBHU1RfU0VFS19UWVBFX1NFVCwgbmF2c2Vlay0+c2VnbWVudF9zdGFydCwgR1NUX1NFRUtfVFlQRV9TRVQsCisgICAgICAgIG5hdnNlZWstPnNlZ21lbnRfZW5kKTsKKyAgfSBlbHNlIHsKKyAgICBldmVudCA9CisgICAgICAgIGdzdF9ldmVudF9uZXdfc2VlayAoMS4wLCBHU1RfRk9STUFUX1RJTUUsIEdTVF9TRUVLX0ZMQUdfQUNDVVJBVEUsCisgICAgICAgIEdTVF9TRUVLX1RZUEVfU0VULCBuYXZzZWVrLT5zZWdtZW50X3N0YXJ0LCBHU1RfU0VFS19UWVBFX1NFVCwKKyAgICAgICAgbmF2c2Vlay0+c2VnbWVudF9lbmQpOworICB9CisKKyAgcGVlcl9wYWQgPSBnc3RfcGFkX2dldF9wZWVyIChHU1RfQkFTRV9UUkFOU0ZPUk0gKG5hdnNlZWspLT5zaW5rcGFkKTsKKyAgZ3N0X3BhZF9zZW5kX2V2ZW50IChwZWVyX3BhZCwgZXZlbnQpOworICBnc3Rfb2JqZWN0X3VucmVmIChwZWVyX3BhZCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbmF2c2Vla190b2dnbGVfcGxheV9wYXVzZSAoR3N0TmF2U2VlayAqIG5hdnNlZWspCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHNyZXQ7CisgIEdzdFN0YXRlIGN1cnJlbnQsIHBlbmRpbmcsIHN0YXRlOworCisgIHNyZXQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKEdTVF9FTEVNRU5UIChuYXZzZWVrKSwgJmN1cnJlbnQsICZwZW5kaW5nLCAwKTsKKyAgaWYgKHNyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKQorICAgIHJldHVybjsKKworICBzdGF0ZSA9IChwZW5kaW5nICE9IEdTVF9TVEFURV9WT0lEX1BFTkRJTkcpID8gcGVuZGluZyA6IGN1cnJlbnQ7CisKKyAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVCAobmF2c2VlayksCisgICAgICBnc3RfbWVzc2FnZV9uZXdfcmVxdWVzdF9zdGF0ZSAoR1NUX09CSkVDVCAobmF2c2VlayksCisgICAgICAgICAgKHN0YXRlID09IEdTVF9TVEFURV9QTEFZSU5HKSA/IEdTVF9TVEFURV9QQVVTRUQgOiBHU1RfU1RBVEVfUExBWUlORykpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9uYXZzZWVrX3NyY19ldmVudCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3ROYXZTZWVrICpuYXZzZWVrOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIG5hdnNlZWsgPSBHU1RfTkFWU0VFSyAodHJhbnMpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX05BVklHQVRJT046CisgICAgeworICAgICAgLyogQ2hlY2sgZm9yIGEga2V5dXAgYW5kIGNvbnZlcnQgbGVmdC9yaWdodCB0byBhIHNlZWsgZXZlbnQgKi8KKyAgICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICAgICAgY29uc3QgZ2NoYXIgKmV2ZW50X3R5cGU7CisKKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChldmVudCk7CisgICAgICBnX3JldHVybl92YWxfaWZfZmFpbCAoc3RydWN0dXJlICE9IE5VTEwsIEZBTFNFKTsKKworICAgICAgZXZlbnRfdHlwZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZXZlbnQiKTsKKyAgICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChldmVudF90eXBlICE9IE5VTEwsIEZBTFNFKTsKKworICAgICAgaWYgKHN0cmNtcCAoZXZlbnRfdHlwZSwgImtleS1wcmVzcyIpID09IDApIHsKKyAgICAgICAgY29uc3QgZ2NoYXIgKmtleTsKKworICAgICAgICBrZXkgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImtleSIpOworICAgICAgICBnX3JldHVybl92YWxfaWZfZmFpbCAoa2V5ICE9IE5VTEwsIEZBTFNFKTsKKworICAgICAgICBpZiAoc3RyY21wIChrZXksICJMZWZ0IikgPT0gMCkgeworICAgICAgICAgIC8qIFNlZWsgYmFja3dhcmQgYnkgNSBzZWNzICovCisgICAgICAgICAgZ3N0X25hdnNlZWtfc2VlayAobmF2c2VlaywgLTEuMCAqIG5hdnNlZWstPnNlZWtfb2Zmc2V0ICogR1NUX1NFQ09ORCk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wIChrZXksICJSaWdodCIpID09IDApIHsKKyAgICAgICAgICAvKiBTZWVrIGZvcndhcmQgKi8KKyAgICAgICAgICBnc3RfbmF2c2Vla19zZWVrIChuYXZzZWVrLCBuYXZzZWVrLT5zZWVrX29mZnNldCAqIEdTVF9TRUNPTkQpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCAoa2V5LCAicyIpID09IDApIHsKKyAgICAgICAgICAvKiBHcmFiIHRoZSBuZXh0IGZyYW1lIGFzIHRoZSBzdGFydCBmcmFtZSBvZiBhIHNlZ21lbnQgKi8KKyAgICAgICAgICBuYXZzZWVrLT5ncmFiX3NlZ19zdGFydCA9IFRSVUU7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wIChrZXksICJlIikgPT0gMCkgeworICAgICAgICAgIC8qIEdyYWIgdGhlIG5leHQgZnJhbWUgYXMgdGhlIGVuZCBmcmFtZSBvZiBhIHNlZ21lbnQgKi8KKyAgICAgICAgICBuYXZzZWVrLT5ncmFiX3NlZ19lbmQgPSBUUlVFOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCAoa2V5LCAibCIpID09IDApIHsKKyAgICAgICAgICAvKiBUb2dnbGUgdGhlIGxvb3AgZmxhZy4gSWYgd2UgaGF2ZSBib3RoIHN0YXJ0IGFuZCBlbmQgc2VnbWVudCB0aW1lcyBzZW5kIGEgc2VlayAqLworICAgICAgICAgIG5hdnNlZWstPmxvb3AgPSAhbmF2c2Vlay0+bG9vcDsKKyAgICAgICAgICBnc3RfbmF2c2Vla19zZWdzZWVrIChuYXZzZWVrKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAgKGtleSwgImYiKSA9PSAwKSB7CisgICAgICAgICAgLyogZmFzdCBmb3J3YXJkICovCisgICAgICAgICAgZ3N0X25hdnNlZWtfY2hhbmdlX3BsYXliYWNrX3JhdGUgKG5hdnNlZWssIDIuMCk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wIChrZXksICJyIikgPT0gMCkgeworICAgICAgICAgIC8qIHJld2luZCAqLworICAgICAgICAgIGdzdF9uYXZzZWVrX2NoYW5nZV9wbGF5YmFja19yYXRlIChuYXZzZWVrLCAtMi4wKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAgKGtleSwgIm4iKSA9PSAwKSB7CisgICAgICAgICAgLyogbm9ybWFsIHNwZWVkICovCisgICAgICAgICAgZ3N0X25hdnNlZWtfY2hhbmdlX3BsYXliYWNrX3JhdGUgKG5hdnNlZWssIDEuMCk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wIChrZXksICJzcGFjZSIpID09IDApIHsKKyAgICAgICAgICBnc3RfbmF2c2Vla190b2dnbGVfcGxheV9wYXVzZSAobmF2c2Vlayk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBldmVudCA9IE5VTEw7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKGV2ZW50KQorICAgIHJldCA9IEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAocGFyZW50X2NsYXNzKS0+c3JjX2V2ZW50ICh0cmFucywgZXZlbnQpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbmF2c2Vla19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0TmF2U2VlayAqbmF2c2VlayA9IEdTVF9OQVZTRUVLIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TRUVLT0ZGU0VUOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChuYXZzZWVrKTsKKyAgICAgIG5hdnNlZWstPnNlZWtfb2Zmc2V0ID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAobmF2c2Vlayk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbmF2c2Vla19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0TmF2U2VlayAqbmF2c2VlayA9IEdTVF9OQVZTRUVLIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TRUVLT0ZGU0VUOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChuYXZzZWVrKTsKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIG5hdnNlZWstPnNlZWtfb2Zmc2V0KTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChuYXZzZWVrKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbmF2c2Vla19zaW5rX2V2ZW50IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdE5hdlNlZWsgKm5hdnNlZWsgPSBHU1RfTkFWU0VFSyAodHJhbnMpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAobmF2c2Vlayk7CisgICAgICBpZiAobmF2c2Vlay0+bG9vcCkKKyAgICAgICAgZ3N0X25hdnNlZWtfc2Vnc2VlayAobmF2c2Vlayk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAobmF2c2Vlayk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2lua19ldmVudCAodHJhbnMsIGV2ZW50KTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9uYXZzZWVrX3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2V0cmFucywgR3N0QnVmZmVyICogYnVmKQoreworICBHc3ROYXZTZWVrICpuYXZzZWVrID0gR1NUX05BVlNFRUsgKGJhc2V0cmFucyk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChuYXZzZWVrKTsKKworICBpZiAoR1NUX0JVRkZFUl9USU1FU1RBTVBfSVNfVkFMSUQgKGJ1ZikpIHsKKyAgICBpZiAobmF2c2Vlay0+Z3JhYl9zZWdfc3RhcnQpIHsKKyAgICAgIG5hdnNlZWstPnNlZ21lbnRfc3RhcnQgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKTsKKyAgICAgIG5hdnNlZWstPnNlZ21lbnRfZW5kID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICAgIG5hdnNlZWstPmdyYWJfc2VnX3N0YXJ0ID0gRkFMU0U7CisgICAgfQorCisgICAgaWYgKG5hdnNlZWstPmdyYWJfc2VnX2VuZCkgeworICAgICAgbmF2c2Vlay0+c2VnbWVudF9lbmQgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKTsKKyAgICAgIG5hdnNlZWstPmdyYWJfc2VnX2VuZCA9IEZBTFNFOworICAgICAgZ3N0X25hdnNlZWtfc2Vnc2VlayAobmF2c2Vlayk7CisgICAgfQorICB9CisKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKG5hdnNlZWspOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbmF2c2Vla19zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICAvKiBhbnl0aGluZyB3ZSBzaG91bGQgYmUgZG9pbmcgaGVyZT8gKi8KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X25hdnNlZWtfc3RvcCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICAvKiBhbnl0aGluZyB3ZSBzaG91bGQgYmUgZG9pbmcgaGVyZT8gKi8KKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9nc3RuYXZzZWVrLmggYi9nc3QvZGVidWd1dGlscy9nc3RuYXZzZWVrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI5YzkyNAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWJ1Z3V0aWxzL2dzdG5hdnNlZWsuaApAQCAtMCwwICsxLDYwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX05BVlNFRUtfSF9fCisjZGVmaW5lIF9fR1NUX05BVlNFRUtfSF9fCisKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfTkFWU0VFSyBcCisgIChnc3RfbmF2c2Vla19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfTkFWU0VFSyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX05BVlNFRUssR3N0TmF2U2VlaykpCisjZGVmaW5lIEdTVF9OQVZTRUVLX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX05BVlNFRUssR3N0TmF2U2Vla0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX05BVlNFRUsob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9OQVZTRUVLKSkKKyNkZWZpbmUgR1NUX0lTX05BVlNFRUtfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfTkFWU0VFSykpCit0eXBlZGVmIHN0cnVjdCBfR3N0TmF2U2VlayBHc3ROYXZTZWVrOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE5hdlNlZWtDbGFzcyBHc3ROYXZTZWVrQ2xhc3M7CisKK3N0cnVjdCBfR3N0TmF2U2VlaworeworICBHc3RCYXNlVHJhbnNmb3JtIGJhc2V0cmFuc2Zvcm07CisKKyAgZ2RvdWJsZSBzZWVrX29mZnNldDsKKyAgZ2Jvb2xlYW4gbG9vcDsKKyAgZ2Jvb2xlYW4gZ3JhYl9zZWdfc3RhcnQ7CisgIGdib29sZWFuIGdyYWJfc2VnX2VuZDsKKyAgR3N0Q2xvY2tUaW1lIHNlZ21lbnRfc3RhcnQ7CisgIEdzdENsb2NrVGltZSBzZWdtZW50X2VuZDsKK307CisKK3N0cnVjdCBfR3N0TmF2U2Vla0NsYXNzCit7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX05BVlNFRUtfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9nc3RwdXNoZmlsZXNyYy5jIGIvZ3N0L2RlYnVndXRpbHMvZ3N0cHVzaGZpbGVzcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjBhY2NiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlYnVndXRpbHMvZ3N0cHVzaGZpbGVzcmMuYwpAQCAtMCwwICsxLDQyMSBAQAorLyogR1N0cmVhbWVyIFB1c2ggRmlsZSBTb3VyY2UKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcHVzaGZpbGVzcmMKKyAqIEBzZWVfYWxzbzogZmlsZXNyYworICoKKyAqIFRoaXMgZWxlbWVudCBpcyBvbmx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiBJdCBpbXBsZW1lbnRzIGFuIFVSSQorICogcHJvdG9jb2wgaGFuZGxlciBmb3IgdGhlICdwdXNoZmlsZScgcHJvdG9jb2wgYW5kIGJlaGF2ZXMgbGlrZSBhIGZpbGUgc291cmNlCisgKiBlbGVtZW50IHRoYXQgY2Fubm90IGJlIGFjdGl2YXRlZCBpbiBwdWxsLW1vZGUuIFRoaXMgbWFrZXMgaXQgdmVyeSBlYXN5IHRvCisgKiBkZWJ1ZyBkZW11eGVycyBvciBkZWNvZGVycyB0aGF0IGNhbiBvcGVyYXRlIGJvdGggcHVsbCBhbmQgcHVzaC1iYXNlZCBpbgorICogY29ubmVjdGlvbiB3aXRoIHRoZSBwbGF5YmluIGVsZW1lbnQgKHdoaWNoIGNyZWF0ZXMgYSBzb3VyY2UgYmFzZWQgb24gdGhlCisgKiBVUkkgcGFzc2VkKS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLW0gcGxheWJpbiB1cmk9cHVzaGZpbGU6Ly8vaG9tZS95b3Uvc29tZS9maWxlLm9nZworICogXXwgVGhpcyBwbGF5cyBiYWNrIHRoZSBnaXZlbiBmaWxlIHVzaW5nIHBsYXliaW4sIHdpdGggdGhlIGRlbXV4ZXIgb3BlcmF0aW5nCisgKiBwdXNoLWJhc2VkLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RwdXNoZmlsZXNyYy5oIgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChwdXNoZmlsZXNyY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBwdXNoZmlsZXNyY19kZWJ1ZworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MT0NBVElPTiwKKyAgUFJPUF9USU1FX1NFR01FTlQsCisgIFBST1BfU1RSRUFNX1RJTUUsCisgIFBST1BfU1RBUlRfVElNRSwKKyAgUFJPUF9JTklUSUFMX1RJTUVTVEFNUCwKKyAgUFJPUF9SQVRFLAorICBQUk9QX0FQUExJRURfUkFURQorfTsKKworI2RlZmluZSBERUZBVUxUX1RJTUVfU0VHTUVOVCBGQUxTRQorI2RlZmluZSBERUZBVUxUX1NUUkVBTV9USU1FIDAKKyNkZWZpbmUgREVGQVVMVF9TVEFSVF9USU1FIDAKKyNkZWZpbmUgREVGQVVMVF9JTklUSUFMX1RJTUVTVEFNUCBHU1RfQ0xPQ0tfVElNRV9OT05FCisjZGVmaW5lIERFRkFVTFRfUkFURSAxLjAKKyNkZWZpbmUgREVGQVVMVF9BUFBMSUVEX1JBVEUgMS4wCisKK3N0YXRpYyB2b2lkIGdzdF9wdXNoX2ZpbGVfc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9wdXNoX2ZpbGVfc3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgdm9pZCBnc3RfcHVzaF9maWxlX3NyY191cmlfaGFuZGxlcl9pbml0IChncG9pbnRlciBnX2lmYWNlLAorICAgIGdwb2ludGVyIGlmYWNlX2RhdGEpOworCisjZGVmaW5lIGdzdF9wdXNoX2ZpbGVfc3JjX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RQdXNoRmlsZVNyYywgZ3N0X3B1c2hfZmlsZV9zcmMsIEdTVF9UWVBFX0JJTiwKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1VSSV9IQU5ETEVSLAorICAgICAgICBnc3RfcHVzaF9maWxlX3NyY191cmlfaGFuZGxlcl9pbml0KSk7CisKK3N0YXRpYyB2b2lkCitnc3RfcHVzaF9maWxlX3NyY19kaXNwb3NlIChHT2JqZWN0ICogb2JqKQoreworICBHc3RQdXNoRmlsZVNyYyAqc3JjID0gR1NUX1BVU0hfRklMRV9TUkMgKG9iaik7CisKKyAgaWYgKHNyYy0+c3JjcGFkKSB7CisgICAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlQgKHNyYyksIHNyYy0+c3JjcGFkKTsKKyAgICBzcmMtPnNyY3BhZCA9IE5VTEw7CisgIH0KKyAgaWYgKHNyYy0+ZmlsZXNyYykgeworICAgIGdzdF9iaW5fcmVtb3ZlIChHU1RfQklOIChzcmMpLCBzcmMtPmZpbGVzcmMpOworICAgIHNyYy0+ZmlsZXNyYyA9IE5VTEw7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdXNoX2ZpbGVfc3JjX2NsYXNzX2luaXQgKEdzdFB1c2hGaWxlU3JjQ2xhc3MgKiBnX2NsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGdfY2xhc3MpOworICBlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGdfY2xhc3MpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChwdXNoZmlsZXNyY19kZWJ1ZywgInB1c2hmaWxlc3JjIiwgMCwKKyAgICAgICJwdXNoZmlsZXNyYyBlbGVtZW50Iik7CisKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF9wdXNoX2ZpbGVfc3JjX2Rpc3Bvc2U7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9wdXNoX2ZpbGVfc3JjX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3B1c2hfZmlsZV9zcmNfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTE9DQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgibG9jYXRpb24iLCAiRmlsZSBMb2NhdGlvbiIsCisgICAgICAgICAgIkxvY2F0aW9uIG9mIHRoZSBmaWxlIHRvIHJlYWQiLCBOVUxMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8CisgICAgICAgICAgR1NUX1BBUkFNX01VVEFCTEVfUkVBRFkpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RJTUVfU0VHTUVOVCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgidGltZS1zZWdtZW50IiwgIlRpbWUgU2VnbWVudCIsCisgICAgICAgICAgIkVtaXQgVElNRSBTRUdNRU5UUyIsIERFRkFVTFRfVElNRV9TRUdNRU5ULCBHX1BBUkFNX1JFQURXUklURSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU1RSRUFNX1RJTUUsCisgICAgICBnX3BhcmFtX3NwZWNfaW50NjQgKCJzdHJlYW0tdGltZSIsICJTdHJlYW0gVGltZSIsCisgICAgICAgICAgIkluaXRpYWwgU3RyZWFtIFRpbWUgKGlmIHRpbWUtc2VnbWVudCBUUlVFKSIsIDAsIEdfTUFYSU5UNjQsCisgICAgICAgICAgREVGQVVMVF9TVFJFQU1fVElNRSwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NUQVJUX1RJTUUsCisgICAgICBnX3BhcmFtX3NwZWNfaW50NjQgKCJzdGFydC10aW1lIiwgIlN0YXJ0IFRpbWUiLAorICAgICAgICAgICJJbml0aWFsIFN0YXJ0IFRpbWUgKGlmIHRpbWUtc2VnbWVudCBUUlVFKSIsIDAsIEdfTUFYSU5UNjQsCisgICAgICAgICAgREVGQVVMVF9TVEFSVF9USU1FLCBHX1BBUkFNX1JFQURXUklURSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSU5JVElBTF9USU1FU1RBTVAsCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgiaW5pdGlhbC10aW1lc3RhbXAiLCAiSW5pdGlhbCBUaW1lc3RhbXAiLAorICAgICAgICAgICJJbml0aWFsIEJ1ZmZlciBUaW1lc3RhbXAgKGlmIHRpbWUtc2VnbWVudCBUUlVFKSIsIDAsIEdfTUFYVUlOVDY0LAorICAgICAgICAgIERFRkFVTFRfSU5JVElBTF9USU1FU1RBTVAsIEdfUEFSQU1fUkVBRFdSSVRFKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SQVRFLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoInJhdGUiLCAiUmF0ZSIsICJSYXRlIHRvIHVzZSBpbiBUSU1FIFNFR01FTlQiLAorICAgICAgICAgIEdfTUlORE9VQkxFLCBHX01BWERPVUJMRSwgREVGQVVMVF9SQVRFLCBHX1BBUkFNX1JFQURXUklURSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQVBQTElFRF9SQVRFLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoImFwcGxpZWQtcmF0ZSIsICJBcHBsaWVkIFJhdGUiLAorICAgICAgICAgICJBcHBsaWVkIHJhdGUgdG8gdXNlIGluIFRJTUUgU0VHTUVOVCIsIEdfTUlORE9VQkxFLCBHX01BWERPVUJMRSwKKyAgICAgICAgICBERUZBVUxUX0FQUExJRURfUkFURSwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNyY3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiUHVzaCBGaWxlIFNvdXJjZSIsCisgICAgICAiVGVzdGluZyIsCisgICAgICAiSW1wbGVtZW50cyBwdXNoZmlsZTovLyBVUkktaGFuZGxlciBmb3IgcHVzaC1iYXNlZCBmaWxlIGFjY2VzcyIsCisgICAgICAiVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdXNoX2ZpbGVfc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RQdXNoRmlsZVNyYyAqc3JjID0gKEdzdFB1c2hGaWxlU3JjICopIG9iamVjdDsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTE9DQVRJT046CisgICAgICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChzcmMtPmZpbGVzcmMpLCAibG9jYXRpb24iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVElNRV9TRUdNRU5UOgorICAgICAgc3JjLT50aW1lX3NlZ21lbnQgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1RSRUFNX1RJTUU6CisgICAgICBzcmMtPnN0cmVhbV90aW1lID0gZ192YWx1ZV9nZXRfaW50NjQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVEFSVF9USU1FOgorICAgICAgc3JjLT5zdGFydF90aW1lID0gZ192YWx1ZV9nZXRfaW50NjQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JTklUSUFMX1RJTUVTVEFNUDoKKyAgICAgIHNyYy0+aW5pdGlhbF90aW1lc3RhbXAgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SQVRFOgorICAgICAgc3JjLT5yYXRlID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQVBQTElFRF9SQVRFOgorICAgICAgc3JjLT5hcHBsaWVkX3JhdGUgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdXNoX2ZpbGVfc3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RQdXNoRmlsZVNyYyAqc3JjID0gKEdzdFB1c2hGaWxlU3JjICopIG9iamVjdDsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTE9DQVRJT046CisgICAgICBnX29iamVjdF9nZXRfcHJvcGVydHkgKEdfT0JKRUNUIChzcmMtPmZpbGVzcmMpLCAibG9jYXRpb24iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVElNRV9TRUdNRU5UOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNyYy0+dGltZV9zZWdtZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVFJFQU1fVElNRToKKyAgICAgIGdfdmFsdWVfc2V0X2ludDY0ICh2YWx1ZSwgc3JjLT5zdHJlYW1fdGltZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1RBUlRfVElNRToKKyAgICAgIGdfdmFsdWVfc2V0X2ludDY0ICh2YWx1ZSwgc3JjLT5zdGFydF90aW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JTklUSUFMX1RJTUVTVEFNUDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHNyYy0+aW5pdGlhbF90aW1lc3RhbXApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JBVEU6CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCBzcmMtPnJhdGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FQUExJRURfUkFURToKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIHNyYy0+YXBwbGllZF9yYXRlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdFBhZFByb2JlUmV0dXJuCitnc3RfcHVzaF9maWxlX3NyY19naG9zdHBhZF9idWZmZXJfcHJvYmUgKEdzdFBhZCAqIHBhZCwgR3N0UGFkUHJvYmVJbmZvICogaW5mbywKKyAgICBHc3RQdXNoRmlsZVNyYyAqIHNyYykKK3sKKyAgR3N0QnVmZmVyICpidWZmZXIgPSBHU1RfUEFEX1BST0JFX0lORk9fQlVGRkVSIChpbmZvKTsKKworICBpZiAoc3JjLT50aW1lX3NlZ21lbnQgJiYgIXNyYy0+c2Vlbl9maXJzdF9idWZmZXIpIHsKKyAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSA9IHNyYy0+aW5pdGlhbF90aW1lc3RhbXA7CisgICAgc3JjLT5zZWVuX2ZpcnN0X2J1ZmZlciA9IFRSVUU7CisgIH0KKyAgcmV0dXJuIEdTVF9QQURfUFJPQkVfT0s7Cit9CisKK3N0YXRpYyBHc3RQYWRQcm9iZVJldHVybgorZ3N0X3B1c2hfZmlsZV9zcmNfZ2hvc3RwYWRfZXZlbnRfcHJvYmUgKEdzdFBhZCAqIHBhZCwgR3N0UGFkUHJvYmVJbmZvICogaW5mbywKKyAgICBHc3RQdXNoRmlsZVNyYyAqIHNyYykKK3sKKyAgR3N0RXZlbnQgKmV2ZW50ID0gR1NUX1BBRF9QUk9CRV9JTkZPX0VWRU5UIChpbmZvKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgIHsKKyAgICAgIGlmIChzcmMtPnRpbWVfc2VnbWVudCkgeworICAgICAgICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgICAgICAgIEdzdEV2ZW50ICpyZXBsYWNlbWVudDsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiUmVwbGFjaW5nIG91dGdvaW5nIHNlZ21lbnQgd2l0aCBUSU1FIFNFR01FTlQiKTsKKyAgICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgICAgICAgIHNlZ21lbnQuc3RhcnQgPSBzcmMtPnN0YXJ0X3RpbWU7CisgICAgICAgIHNlZ21lbnQudGltZSA9IHNyYy0+c3RyZWFtX3RpbWU7CisgICAgICAgIHNlZ21lbnQucmF0ZSA9IHNyYy0+cmF0ZTsKKyAgICAgICAgc2VnbWVudC5hcHBsaWVkX3JhdGUgPSBzcmMtPmFwcGxpZWRfcmF0ZTsKKyAgICAgICAgcmVwbGFjZW1lbnQgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KTsKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgIEdTVF9QQURfUFJPQkVfSU5GT19EQVRBIChpbmZvKSA9IHJlcGxhY2VtZW50OworICAgICAgfQorICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIEdTVF9QQURfUFJPQkVfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3B1c2hfZmlsZV9zcmNfZ2hvc3RwYWRfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFB1c2hGaWxlU3JjICpzcmMgPSAoR3N0UHVzaEZpbGVTcmMgKikgcGFyZW50OworICBnYm9vbGVhbiByZXQ7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICAgIGlmIChzcmMtPnRpbWVfc2VnbWVudCkgeworICAgICAgICAvKiBXaGVuIHdvcmtpbmcgaW4gdGltZSB3ZSBkb24ndCBhbGxvdyBzZWVrcyAqLworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJSZWZ1c2luZyBzZWVrIGV2ZW50IGluIFRJTUUgbW9kZSIpOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLyogUEFTU1RIUk9VR0ggKi8KKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wdXNoX2ZpbGVfc3JjX2dob3N0cGFkX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RQdXNoRmlsZVNyYyAqc3JjID0gKEdzdFB1c2hGaWxlU3JjICopIHBhcmVudDsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX1NDSEVEVUxJTkc6CisgICAgICAvKiBXaGVuIHdvcmtpbmcgaW4gdGltZSB3ZSBkb24ndCBhbGxvdyBzZWVrcyAqLworICAgICAgaWYgKHNyYy0+dGltZV9zZWdtZW50KQorICAgICAgICBnc3RfcXVlcnlfc2V0X3NjaGVkdWxpbmcgKHF1ZXJ5LCBHU1RfU0NIRURVTElOR19GTEFHX1NFUVVFTlRJQUwsIDEsIC0xLAorICAgICAgICAgICAgMCk7CisgICAgICBlbHNlCisgICAgICAgIGdzdF9xdWVyeV9zZXRfc2NoZWR1bGluZyAocXVlcnksIEdTVF9TQ0hFRFVMSU5HX0ZMQUdfU0VFS0FCTEUsIDEsIC0xLAorICAgICAgICAgICAgMCk7CisgICAgICBnc3RfcXVlcnlfYWRkX3NjaGVkdWxpbmdfbW9kZSAocXVlcnksIEdTVF9QQURfTU9ERV9QVVNIKTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdXNoX2ZpbGVfc3JjX2luaXQgKEdzdFB1c2hGaWxlU3JjICogc3JjKQoreworICBzcmMtPnRpbWVfc2VnbWVudCA9IERFRkFVTFRfVElNRV9TRUdNRU5UOworICBzcmMtPnN0cmVhbV90aW1lID0gREVGQVVMVF9TVFJFQU1fVElNRTsKKyAgc3JjLT5zdGFydF90aW1lID0gREVGQVVMVF9TVEFSVF9USU1FOworICBzcmMtPmluaXRpYWxfdGltZXN0YW1wID0gREVGQVVMVF9JTklUSUFMX1RJTUVTVEFNUDsKKyAgc3JjLT5yYXRlID0gREVGQVVMVF9SQVRFOworICBzcmMtPmFwcGxpZWRfcmF0ZSA9IERFRkFVTFRfQVBQTElFRF9SQVRFOworICBzcmMtPnNlZW5fZmlyc3RfYnVmZmVyID0gRkFMU0U7CisKKyAgc3JjLT5maWxlc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmlsZXNyYyIsICJyZWFsLWZpbGVzcmMiKTsKKyAgaWYgKHNyYy0+ZmlsZXNyYykgeworICAgIEdzdFBhZCAqcGFkOworCisgICAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHNyYyksIHNyYy0+ZmlsZXNyYyk7CisgICAgcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNyYy0+ZmlsZXNyYywgInNyYyIpOworICAgIGdfYXNzZXJ0IChwYWQgIT0gTlVMTCk7CisgICAgc3JjLT5zcmNwYWQgPSBnc3RfZ2hvc3RfcGFkX25ldyAoInNyYyIsIHBhZCk7CisgICAgLyogRklYTUVeSF5IQ09SRTogdHJ5IHB1c2hmaWxlOi8vL2Zvby9iYXIuZXh0ICEgdHlwZWZpbmQgISBmYWtlc2luayB3aXRob3V0CisgICAgICogdGhpcyBhbmQgd2F0Y2ggY29yZSBidWdnaW5lc3MgKHNvbWUgcGFkIHN0YXlzIGluIGZsdXNoaW5nIHN0YXRlKSAqLworICAgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChzcmMtPnNyY3BhZCwKKyAgICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wdXNoX2ZpbGVfc3JjX2dob3N0cGFkX3F1ZXJ5KSk7CisgICAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHNyYy0+c3JjcGFkLAorICAgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3B1c2hfZmlsZV9zcmNfZ2hvc3RwYWRfZXZlbnQpKTsKKyAgICAvKiBBZGQgb3V0Z29pbmcgZXZlbnQgcHJvYmUgdG8gcmVwbGFjZSBzZWdtZW50IGFuZCBidWZmZXIgdGltZXN0YW1wICovCisgICAgZ3N0X3BhZF9hZGRfcHJvYmUgKHNyYy0+c3JjcGFkLCBHU1RfUEFEX1BST0JFX1RZUEVfRVZFTlRfRE9XTlNUUkVBTSwKKyAgICAgICAgKEdzdFBhZFByb2JlQ2FsbGJhY2spIGdzdF9wdXNoX2ZpbGVfc3JjX2dob3N0cGFkX2V2ZW50X3Byb2JlLAorICAgICAgICBzcmMsIE5VTEwpOworICAgIGdzdF9wYWRfYWRkX3Byb2JlIChzcmMtPnNyY3BhZCwgR1NUX1BBRF9QUk9CRV9UWVBFX0JVRkZFUiwKKyAgICAgICAgKEdzdFBhZFByb2JlQ2FsbGJhY2spIGdzdF9wdXNoX2ZpbGVfc3JjX2dob3N0cGFkX2J1ZmZlcl9wcm9iZSwKKyAgICAgICAgc3JjLCBOVUxMKTsKKyAgICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoc3JjKSwgc3JjLT5zcmNwYWQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisgIH0KK30KKworLyoqKiBHU1RVUklIQU5ETEVSIElOVEVSRkFDRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgR3N0VVJJVHlwZQorZ3N0X3B1c2hfZmlsZV9zcmNfdXJpX2dldF90eXBlIChHVHlwZSB0eXBlKQoreworICByZXR1cm4gR1NUX1VSSV9TUkM7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqY29uc3QgKgorZ3N0X3B1c2hfZmlsZV9zcmNfdXJpX2dldF9wcm90b2NvbHMgKEdUeXBlIHR5cGUpCit7CisgIHN0YXRpYyBjb25zdCBnY2hhciAqcHJvdG9jb2xzW10gPSB7ICJwdXNoZmlsZSIsIE5VTEwgfTsKKworICByZXR1cm4gcHJvdG9jb2xzOworfQorCitzdGF0aWMgZ2NoYXIgKgorZ3N0X3B1c2hfZmlsZV9zcmNfdXJpX2dldF91cmkgKEdzdFVSSUhhbmRsZXIgKiBoYW5kbGVyKQoreworICBHc3RQdXNoRmlsZVNyYyAqc3JjID0gR1NUX1BVU0hfRklMRV9TUkMgKGhhbmRsZXIpOworICBnY2hhciAqZmlsZXVyaSwgKnB1c2hmaWxldXJpOworCisgIGlmIChzcmMtPmZpbGVzcmMgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBmaWxldXJpID0gZ3N0X3VyaV9oYW5kbGVyX2dldF91cmkgKEdTVF9VUklfSEFORExFUiAoc3JjLT5maWxlc3JjKSk7CisgIGlmIChmaWxldXJpID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIHB1c2hmaWxldXJpID0gZ19zdHJjb25jYXQgKCJwdXNoIiwgZmlsZXVyaSwgTlVMTCk7CisgIGdfZnJlZSAoZmlsZXVyaSk7CisKKyAgcmV0dXJuIHB1c2hmaWxldXJpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wdXNoX2ZpbGVfc3JjX3VyaV9zZXRfdXJpIChHc3RVUklIYW5kbGVyICogaGFuZGxlciwgY29uc3QgZ2NoYXIgKiB1cmksCisgICAgR0Vycm9yICoqIGVycm9yKQoreworICBHc3RQdXNoRmlsZVNyYyAqc3JjID0gR1NUX1BVU0hfRklMRV9TUkMgKGhhbmRsZXIpOworCisgIGlmIChzcmMtPmZpbGVzcmMgPT0gTlVMTCkgeworICAgIGdfc2V0X2Vycm9yX2xpdGVyYWwgKGVycm9yLCBHU1RfVVJJX0VSUk9SLCBHU1RfVVJJX0VSUk9SX0JBRF9TVEFURSwKKyAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgZmlsZSBzb3VyY2UgZWxlbWVudCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIHNraXAgJ3B1c2gnIGJpdCAqLworICByZXR1cm4gZ3N0X3VyaV9oYW5kbGVyX3NldF91cmkgKEdTVF9VUklfSEFORExFUiAoc3JjLT5maWxlc3JjKSwgdXJpICsgNCwKKyAgICAgIGVycm9yKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdXNoX2ZpbGVfc3JjX3VyaV9oYW5kbGVyX2luaXQgKGdwb2ludGVyIGdfaWZhY2UsIGdwb2ludGVyIGlmYWNlX2RhdGEpCit7CisgIEdzdFVSSUhhbmRsZXJJbnRlcmZhY2UgKmlmYWNlID0gKEdzdFVSSUhhbmRsZXJJbnRlcmZhY2UgKikgZ19pZmFjZTsKKworICBpZmFjZS0+Z2V0X3R5cGUgPSBnc3RfcHVzaF9maWxlX3NyY191cmlfZ2V0X3R5cGU7CisgIGlmYWNlLT5nZXRfcHJvdG9jb2xzID0gZ3N0X3B1c2hfZmlsZV9zcmNfdXJpX2dldF9wcm90b2NvbHM7CisgIGlmYWNlLT5nZXRfdXJpID0gZ3N0X3B1c2hfZmlsZV9zcmNfdXJpX2dldF91cmk7CisgIGlmYWNlLT5zZXRfdXJpID0gZ3N0X3B1c2hfZmlsZV9zcmNfdXJpX3NldF91cmk7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9nc3RwdXNoZmlsZXNyYy5oIGIvZ3N0L2RlYnVndXRpbHMvZ3N0cHVzaGZpbGVzcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODJhZTEzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlYnVndXRpbHMvZ3N0cHVzaGZpbGVzcmMuaApAQCAtMCwwICsxLDY0IEBACisvKiBHU3RyZWFtZXIgUHVzaCBGaWxlIFNvdXJjZQorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1BVU0hfRklMRV9TUkNfSF9fCisjZGVmaW5lIF9fR1NUX1BVU0hfRklMRV9TUkNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0YmluLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfUFVTSF9GSUxFX1NSQyBcCisgIChnc3RfcHVzaF9maWxlX3NyY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUFVTSF9GSUxFX1NSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1BVU0hfRklMRV9TUkMsR3N0UHVzaEZpbGVTcmMpKQorI2RlZmluZSBHU1RfUFVTSF9GSUxFX1NSQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9QVVNIX0ZJTEVfU1JDLEdzdFB1c2hGaWxlU3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUFVTSF9GSUxFX1NSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1BVU0hfRklMRV9TUkMpKQorI2RlZmluZSBHU1RfSVNfUFVTSF9GSUxFX1NSQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9QVVNIX0ZJTEVfU1JDKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RQdXNoRmlsZVNyYyBHc3RQdXNoRmlsZVNyYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RQdXNoRmlsZVNyY0NsYXNzIEdzdFB1c2hGaWxlU3JjQ2xhc3M7CisKK3N0cnVjdCBfR3N0UHVzaEZpbGVTcmMKK3sKKyAgR3N0QmluIHBhcmVudDsKKworICAvKjwgcHJpdmF0ZSA+ICovCisgIEdzdEVsZW1lbnQgKmZpbGVzcmM7CisgIEdzdFBhZCAqc3JjcGFkOworCisgIGdib29sZWFuIHRpbWVfc2VnbWVudDsKKyAgZ2Jvb2xlYW4gc2Vlbl9maXJzdF9idWZmZXI7CisgIGdpbnQ2NCBzdHJlYW1fdGltZTsKKyAgZ2ludDY0IHN0YXJ0X3RpbWU7CisgIGd1aW50NjQgaW5pdGlhbF90aW1lc3RhbXA7CisgIGdkb3VibGUgcmF0ZTsKKyAgZ2RvdWJsZSBhcHBsaWVkX3JhdGU7Cit9OworCitzdHJ1Y3QgX0dzdFB1c2hGaWxlU3JjQ2xhc3MKK3sKKyAgR3N0QmluQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3B1c2hfZmlsZV9zcmNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1BVU0hfRklMRV9TUkNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuYyBiL2dzdC9kZWJ1Z3V0aWxzL2dzdHRhZ2luamVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZGI3OTcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuYwpAQCAtMCwwICsxLDIwMyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIGdzdHRhZ2luamVjdC5jOgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC10YWdpbmplY3QKKyAqCisgKiBFbGVtZW50IHRoYXQgaW5qZWN0cyBuZXcgbWV0YWRhdGEgdGFncywgYnV0IHBhc3NlcyBpbmNvbW1pbmcgZGF0YSB0aHJvdWdoCisgKiB1bm1vZGlmaWVkLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgYXVkaW90ZXN0c3JjIG51bS1idWZmZXJzPTEwMCAhIHRhZ2luamVjdCB0YWdzPSJ0aXRsZT10ZXN0c3JjLGFydGlzdD1nc3RyZWFtZXIiICEgdm9yYmlzZW5jICEgb2dnbXV4ICEgZmlsZXNpbmsgbG9jYXRpb249dGVzdC5vZ2cKKyAqIF18IHNldCB0aXRsZSBhbmQgYXJ0aXN0CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgYXVkaW90ZXN0c3JjIG51bS1idWZmZXJzPTEwMCAhIHRhZ2luamVjdCB0YWdzPSJrZXl3b3Jkcz1ce1widGVzdG9uZVwiLFwiYXVkaW9cIlx9LHRpdGxlPVwiYXVkaW9cIHRlc3R0b25lXCIiICEgdm9yYmlzZW5jICEgb2dnbXV4ICEgZmlsZXNpbmsgbG9jYXRpb249dGVzdC5vZ2cKKyAqIF18IHNldCBrZXl3b3JkcyBhbmQgdGl0bGUgZGVtb25zdHJhdGluZyBxdW90aW5nIG9mIHNwZWNpYWwgY2hhcnMgYW5kIGhhbmRsaW5nIGxpc3RzCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnc3R0YWdpbmplY3QuaCIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF90YWdfaW5qZWN0X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF90YWdfaW5qZWN0X2RlYnVnCisKK2VudW0KK3sKKyAgUFJPUF9UQUdTID0gMQorfTsKKworCisjZGVmaW5lIGdzdF90YWdfaW5qZWN0X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFRhZ0luamVjdCwgZ3N0X3RhZ19pbmplY3QsIEdTVF9UWVBFX0JBU0VfVFJBTlNGT1JNKTsKKworc3RhdGljIHZvaWQgZ3N0X3RhZ19pbmplY3RfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X3RhZ19pbmplY3Rfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3RhZ19pbmplY3RfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfdGFnX2luamVjdF90cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RCdWZmZXIgKiBidWYpOworc3RhdGljIGdib29sZWFuIGdzdF90YWdfaW5qZWN0X3N0YXJ0IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpOworCisKK3N0YXRpYyB2b2lkCitnc3RfdGFnX2luamVjdF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0VGFnSW5qZWN0ICpzZWxmID0gR1NUX1RBR19JTkpFQ1QgKG9iamVjdCk7CisKKyAgaWYgKHNlbGYtPnRhZ3MpIHsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHNlbGYtPnRhZ3MpOworICAgIHNlbGYtPnRhZ3MgPSBOVUxMOworICB9CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3RhZ19pbmplY3RfY2xhc3NfaW5pdCAoR3N0VGFnSW5qZWN0Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqZ3N0YmFzZXRyYW5zX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzID0gR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChrbGFzcyk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF90YWdfaW5qZWN0X2RlYnVnLCAidGFnaW5qZWN0IiwgMCwKKyAgICAgICJ0YWcgaW5qZWN0IGVsZW1lbnQiKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdGFnX2luamVjdF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF90YWdfaW5qZWN0X2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RBR1MsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgidGFncyIsICJ0YWdsaXN0IiwKKyAgICAgICAgICAiTGlzdCBvZiB0YWdzIHRvIGluamVjdCBpbnRvIHRoZSB0YXJnZXQgZmlsZSIsCisgICAgICAgICAgTlVMTCwgR19QQVJBTV9XUklUQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF90YWdfaW5qZWN0X2ZpbmFsaXplOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiVGFnSW5qZWN0IiwKKyAgICAgICJHZW5lcmljIiwgImluamVjdCBtZXRhZGF0YSB0YWdzIiwgIlN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4iKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmN0ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua3RlbXBsYXRlKTsKKworICBnc3RiYXNldHJhbnNfY2xhc3MtPnRyYW5zZm9ybV9pcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3RhZ19pbmplY3RfdHJhbnNmb3JtX2lwKTsKKworICBnc3RiYXNldHJhbnNfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF90YWdfaW5qZWN0X3N0YXJ0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF90YWdfaW5qZWN0X2luaXQgKEdzdFRhZ0luamVjdCAqIHNlbGYpCit7CisgIEdzdEJhc2VUcmFuc2Zvcm0gKnRyYW5zID0gR1NUX0JBU0VfVFJBTlNGT1JNIChzZWxmKTsKKworICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X2dhcF9hd2FyZSAodHJhbnMsIFRSVUUpOworCisgIHNlbGYtPnRhZ3MgPSBOVUxMOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3RhZ19pbmplY3RfdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0VGFnSW5qZWN0ICpzZWxmID0gR1NUX1RBR19JTkpFQ1QgKHRyYW5zKTsKKworICBpZiAoR19VTkxJS0VMWSAoIXNlbGYtPnRhZ3Nfc2VudCkpIHsKKyAgICBzZWxmLT50YWdzX3NlbnQgPSBUUlVFOworICAgIC8qIHNlbmQgdGFncyAqLworICAgIGlmIChzZWxmLT50YWdzICYmICFnc3RfdGFnX2xpc3RfaXNfZW1wdHkgKHNlbGYtPnRhZ3MpKSB7CisgICAgICBHU1RfREVCVUcgKCJ0YWcgZXZlbnQgOiUiIEdTVF9QVFJfRk9STUFULCBzZWxmLT50YWdzKTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoR1NUX0JBU0VfVFJBTlNGT1JNX1NSQ19QQUQgKHRyYW5zKSwKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X3RhZyAoZ3N0X3RhZ19saXN0X3JlZiAoc2VsZi0+dGFncykpKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdGFnX2luamVjdF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VGFnSW5qZWN0ICpzZWxmID0gR1NUX1RBR19JTkpFQ1QgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1RBR1M6eworICAgICAgZ2NoYXIgKnN0cnVjdHVyZSA9CisgICAgICAgICAgZ19zdHJkdXBfcHJpbnRmICgidGFnbGlzdCwlcyIsIGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKTsKKyAgICAgIGlmICghKHNlbGYtPnRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2Zyb21fc3RyaW5nIChzdHJ1Y3R1cmUpKSkgeworICAgICAgICBHU1RfV0FSTklORyAoInVucGFyc2FibGUgdGFnbGlzdCA9ICclcyciLCBzdHJ1Y3R1cmUpOworICAgICAgfQorCisgICAgICAvKiBtYWtlIHN1cmUgdGhhdCB0YWdzIHdpbGwgYmUgc2VuZCAqLworICAgICAgc2VsZi0+dGFnc19zZW50ID0gRkFMU0U7CisgICAgICBnX2ZyZWUgKHN0cnVjdHVyZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3RhZ19pbmplY3RfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIC8qR3N0VGFnSW5qZWN0ICpzZWxmID0gR1NUX1RBR19JTkpFQ1QgKG9iamVjdCk7ICovCisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF90YWdfaW5qZWN0X3N0YXJ0IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpCit7CisgIEdzdFRhZ0luamVjdCAqc2VsZiA9IEdTVF9UQUdfSU5KRUNUICh0cmFucyk7CisKKyAgLyogd2UgbmVlZCB0byBzZW50IHRhZ3MgX3RyYW5zZm9ybV9pcCgpIG9uY2UgKi8KKyAgc2VsZi0+dGFnc19zZW50ID0gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuaCBiL2dzdC9kZWJ1Z3V0aWxzL2dzdHRhZ2luamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NDU5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuaApAQCAtMCwwICsxLDY2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKgorICogZ3N0dGFnaW5qZWN0Lmg6CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1RBR19JTkpFQ1RfSF9fCisjZGVmaW5lIF9fR1NUX1RBR19JTkpFQ1RfSF9fCisKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfVEFHX0lOSkVDVCBcCisgIChnc3RfdGFnX2luamVjdF9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfVEFHX0lOSkVDVChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1RBR19JTkpFQ1QsR3N0VGFnSW5qZWN0KSkKKyNkZWZpbmUgR1NUX1RBR19JTkpFQ1RfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfVEFHX0lOSkVDVCxHc3RUYWdJbmplY3RDbGFzcykpCisjZGVmaW5lIEdTVF9JU19UQUdfSU5KRUNUKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfVEFHX0lOSkVDVCkpCisjZGVmaW5lIEdTVF9JU19UQUdfSU5KRUNUX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1RBR19JTkpFQ1QpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFRhZ0luamVjdCBHc3RUYWdJbmplY3Q7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VGFnSW5qZWN0Q2xhc3MgR3N0VGFnSW5qZWN0Q2xhc3M7CisKKy8qKgorICogR3N0VGFnSW5qZWN0OgorICoKKyAqIE9wYXF1ZSAjR3N0VGFnSW5qZWN0IGRhdGEgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBfR3N0VGFnSW5qZWN0Cit7CisgIEdzdEJhc2VUcmFuc2Zvcm0gZWxlbWVudDsKKworICAvKjwgcHJpdmF0ZSA+ICovCisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisgIGdib29sZWFuIHRhZ3Nfc2VudDsKK307CisKK3N0cnVjdCBfR3N0VGFnSW5qZWN0Q2xhc3MKK3sKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF90YWdfaW5qZWN0X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9UQUdfSU5KRUNUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2RlYnVndXRpbHMvbWVzb24uYnVpbGQgYi9nc3QvZGVidWd1dGlscy9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTgwNTc3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlYnVndXRpbHMvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwyNyBAQAorZ3N0bmF2aWdhdGlvbnRlc3QgPSBsaWJyYXJ5KCdnc3RuYXZpZ2F0aW9udGVzdCcsCisgICdnc3RuYXZpZ2F0aW9udGVzdC5jJywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgZ3N0dmlkZW9fZGVwLCBsaWJtXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKKworZ3N0ZGVidWcgPSBsaWJyYXJ5KCdnc3RkZWJ1ZycsCisgICdnc3RkZWJ1Zy5jJywKKyAgJ2JyZWFrbXlkYXRhLmMnLAorICAnZ3N0Y2Fwc3NldHRlci5jJywKKyAgJ2dzdG5hdnNlZWsuYycsCisgICdnc3RwdXNoZmlsZXNyYy5jJywKKyAgJ2dzdHRhZ2luamVjdC5jJywKKyAgJ3JuZGJ1ZmZlcnNpemUuYycsCisgICdwcm9ncmVzc3JlcG9ydC5jJywKKyAgJ3Rlc3RzLmMnLAorICAnY3B1cmVwb3J0LmMnLAorICAndGVzdHBsdWdpbi5jJywKKyAgY19hcmdzOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdF9kZXAsIGdzdGJhc2VfZGVwLCBnc3R2aWRlb19kZXBdLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L2RlYnVndXRpbHMvcHJvZ3Jlc3NyZXBvcnQuYyBiL2dzdC9kZWJ1Z3V0aWxzL3Byb2dyZXNzcmVwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2YmYwZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWJ1Z3V0aWxzL3Byb2dyZXNzcmVwb3J0LmMKQEAgLTAsMCArMSw1MjEgQEAKKy8qIEdTdHJlYW1lciBQcm9ncmVzcyBSZXBvcnQgRWxlbWVudAorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSA8MjAwND4gSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXByb2dyZXNzcmVwb3J0CisgKgorICogVGhlIHByb2dyZXNzcmVwb3J0IGVsZW1lbnQgY2FuIGJlIHB1dCBpbnRvIGEgcGlwZWxpbmUgdG8gcmVwb3J0IHByb2dyZXNzLAorICogd2hpY2ggaXMgZG9uZSBieSBkb2luZyB1cHN0cmVhbSBkdXJhdGlvbiBhbmQgcG9zaXRpb24gcXVlcmllcyBpbiByZWd1bGFyCisgKiAocmVhbC10aW1lKSBpbnRlcnZhbHMuIEJvdGggdGhlIGludGVydmFsIGFuZCB0aGUgcHJlZmVyZWQgcXVlcnkgZm9ybWF0CisgKiBjYW4gYmUgc3BlY2lmaWVkIHZpYSB0aGUgI0dzdFByb2dyZXNzUmVwb3J0OnVwZGF0ZS1mcmVxIGFuZCB0aGUKKyAqICNHc3RQcm9ncmVzc1JlcG9ydDpmb3JtYXQgcHJvcGVydHkuCisgKgorICogRWxlbWVudCBtZXNzYWdlcyBjb250YWluaW5nIGEgInByb2dyZXNzIiBzdHJ1Y3R1cmUgYXJlIHBvc3RlZCBvbiB0aGUgYnVzCisgKiB3aGVuZXZlciBwcm9ncmVzcyBoYXMgYmVlbiBxdWVyaWVkIChzaW5jZSBnc3QtcGx1Z2lucy1nb29kIDAuMTAuNiBvbmx5KS4KKyAqCisgKiBTaW5jZSB0aGUgZWxlbWVudCB3YXMgb3JpZ2luYWxseSBkZXNpZ25lZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBpdCB3aWxsCisgKiBieSBkZWZhdWx0IGFsc28gcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgcHJvZ3Jlc3MgdG8gdGhlCisgKiB0ZXJtaW5hbC4gVGhpcyBjYW4gYmUgcHJldmVudGVkIGJ5IHNldHRpbmcgdGhlICNHc3RQcm9ncmVzc1JlcG9ydDpzaWxlbnQKKyAqIHByb3BlcnR5IHRvICVUUlVFLgorICoKKyAqIFRoaXMgZWxlbWVudCBpcyBtb3N0IHVzZWZ1bCBpbiB0cmFuc2NvZGluZyBwaXBlbGluZXMgb3Igb3RoZXIgc2l0dWF0aW9ucworICogd2hlcmUganVzdCBxdWVyeWluZyB0aGUgcGlwZWxpbmUgbWlnaHQgbm90IGxlYWQgdG8gdGhlIHdhbnRlZCByZXN1bHQuIEZvcgorICogcHJvZ3Jlc3MgaW4gVElNRSBmb3JtYXQsIHRoZSBlbGVtZW50IGlzIGJlc3QgcGxhY2VkIGluIGEgJ3JhdyBzdHJlYW0nCisgKiBzZWN0aW9uIG9mIHRoZSBwaXBlbGluZSAob3IgYWZ0ZXIgYW55IGRlbXV4ZXJzL2RlY29kZXJzL3BhcnNlcnMpLgorICoKKyAqIFRocmVlIG1vcmUgdGhpbmdzIHNob3VsZCBiZSBwb2ludGVkIG91dDogZmlyc3RseSwgdGhlIGVsZW1lbnQgd2lsbCBvbmx5CisgKiBxdWVyeSBwcm9ncmVzcyB3aGVuIGRhdGEgZmxvdyBoYXBwZW5zLiBJZiBkYXRhIGZsb3cgaXMgc3RhbGxlZCBmb3Igc29tZQorICogcmVhc29uLCBubyBwcm9ncmVzcyBtZXNzYWdlcyB3aWxsIGJlIHBvc3RlZC4gU2Vjb25kbHksIHRoZXJlIGFyZSBvdGhlcgorICogZWxlbWVudHMgKGxpa2UgcXRkZW11eCwgZm9yIGV4YW1wbGUpIHRoYXQgbWF5IGFsc28gcG9zdCAicHJvZ3Jlc3MiIGVsZW1lbnQKKyAqIG1lc3NhZ2VzIG9uIHRoZSBidXMuIEFwcGxpY2F0aW9ucyBzaG91bGQgY2hlY2sgdGhlIHNvdXJjZSBvZiBhbnkgZWxlbWVudAorICogbWVzc2FnZXMgdGhleSByZWNlaXZlLCBpZiBuZWVkZWQuIEZpbmFsbHksIGFwcGxpY2F0aW9ucyBzaG91bGQgbm90IHRha2UKKyAqIGFjdGlvbiBvbiByZWNlaXZpbmcgbm90aWZpY2F0aW9uIG9mIHByb2dyZXNzIGJlaW5nIDEwMCUsIHRoZXkgc2hvdWxkIG9ubHkKKyAqIHRha2UgYWN0aW9uIHdoZW4gdGhleSByZWNlaXZlIGFuIEVPUyBtZXNzYWdlIChzaW5jZSB0aGUgcHJvZ3Jlc3MgcmVwb3J0ZWQKKyAqIGlzIGluIHJlZmVyZW5jZSB0byBhbiBpbnRlcm5hbCBwb2ludCBvZiBhIHBpcGVsaW5lIGFuZCBub3QgdGhlIHBpcGVsaW5lIGFzCisgKiBhIHdob2xlKS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLW0gZmlsZXNyYyBsb2NhdGlvbj1mb28ub2dnICEgZGVjb2RlYmluICEgcHJvZ3Jlc3NyZXBvcnQgdXBkYXRlLWZyZXE9MSAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhdXRvYXVkaW9zaW5rCisgKiBdfCBUaGlzIHNob3dzIGEgcHJvZ3Jlc3MgcXVlcnkgd2hlcmUgYSBkdXJhdGlvbiBpcyBhdmFpbGFibGUuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLW0gYXVkaW90ZXN0c3JjICEgcHJvZ3Jlc3NyZXBvcnQgdXBkYXRlLWZyZXE9MSAhIGF1ZGlvY29udmVydCAhIGF1dG9hdWRpb3NpbmsKKyAqIF18IFRoaXMgc2hvd3MgYSBwcm9ncmVzcyBxdWVyeSB3aGVyZSBubyBkdXJhdGlvbiBpcyBhdmFpbGFibGUuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAicHJvZ3Jlc3NyZXBvcnQuaCIKKworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9VUERBVEVfRlJFUSwKKyAgUFJPUF9TSUxFTlQsCisgIFBST1BfRE9fUVVFUlksCisgIFBST1BfRk9STUFUCit9OworCitHc3RTdGF0aWNQYWRUZW1wbGF0ZSBwcm9ncmVzc19yZXBvcnRfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKKworR3N0U3RhdGljUGFkVGVtcGxhdGUgcHJvZ3Jlc3NfcmVwb3J0X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKKyNkZWZpbmUgREVGQVVMVF9VUERBVEVfRlJFUSAgNQorI2RlZmluZSBERUZBVUxUX1NJTEVOVCAgICAgICBGQUxTRQorI2RlZmluZSBERUZBVUxUX0RPX1FVRVJZICAgICBUUlVFCisjZGVmaW5lIERFRkFVTFRfRk9STUFUICAgICAgICJhdXRvIgorCitzdGF0aWMgdm9pZCBnc3RfcHJvZ3Jlc3NfcmVwb3J0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9wcm9ncmVzc19yZXBvcnRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3Byb2dyZXNzX3JlcG9ydF9zaW5rX2V2ZW50IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcHJvZ3Jlc3NfcmVwb3J0X3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcHJvZ3Jlc3NfcmVwb3J0X3N0YXJ0IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpOworc3RhdGljIGdib29sZWFuIGdzdF9wcm9ncmVzc19yZXBvcnRfc3RvcCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKTsKKworI2RlZmluZSBnc3RfcHJvZ3Jlc3NfcmVwb3J0X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFByb2dyZXNzUmVwb3J0LCBnc3RfcHJvZ3Jlc3NfcmVwb3J0LCBHU1RfVFlQRV9CQVNFX1RSQU5TRk9STSk7CisKK3N0YXRpYyB2b2lkCitnc3RfcHJvZ3Jlc3NfcmVwb3J0X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqKQoreworICBHc3RQcm9ncmVzc1JlcG9ydCAqZmlsdGVyID0gR1NUX1BST0dSRVNTX1JFUE9SVCAob2JqKTsKKworICBnX2ZyZWUgKGZpbHRlci0+Zm9ybWF0KTsKKyAgZmlsdGVyLT5mb3JtYXQgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wcm9ncmVzc19yZXBvcnRfY2xhc3NfaW5pdCAoR3N0UHJvZ3Jlc3NSZXBvcnRDbGFzcyAqIGdfY2xhc3MpCit7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqZ3N0YmFzZXRyYW5zX2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3M7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGdfY2xhc3MpOworICBlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGdfY2xhc3MpOworICBnc3RiYXNldHJhbnNfY2xhc3MgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKGdfY2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3Byb2dyZXNzX3JlcG9ydF9maW5hbGl6ZTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3Byb2dyZXNzX3JlcG9ydF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9wcm9ncmVzc19yZXBvcnRfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1VQREFURV9GUkVRLCBnX3BhcmFtX3NwZWNfaW50ICgidXBkYXRlLWZyZXEiLCAiVXBkYXRlIEZyZXF1ZW5jeSIsCisgICAgICAgICAgIk51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gcmVwb3J0cyB3aGVuIGRhdGEgaXMgZmxvd2luZyIsIDEsIEdfTUFYSU5ULAorICAgICAgICAgIERFRkFVTFRfVVBEQVRFX0ZSRVEsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1NJTEVOVCwgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJzaWxlbnQiLAorICAgICAgICAgICJEbyBub3QgcHJpbnQgb3V0cHV0IHRvIHN0ZG91dCIsICJEbyBub3QgcHJpbnQgb3V0cHV0IHRvIHN0ZG91dCIsCisgICAgICAgICAgREVGQVVMVF9TSUxFTlQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX0RPX1FVRVJZLCBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImRvLXF1ZXJ5IiwKKyAgICAgICAgICAiVXNlIGEgcXVlcnkgaW5zdGVhZCBvZiBidWZmZXIgbWV0YWRhdGEgdG8gZGV0ZXJtaW5lIHN0cmVhbSBwb3NpdGlvbiIsCisgICAgICAgICAgIlVzZSBhIHF1ZXJ5IGluc3RlYWQgb2YgYnVmZmVyIG1ldGFkYXRhIHRvIGRldGVybWluZSBzdHJlYW0gcG9zaXRpb24iLAorICAgICAgICAgIERFRkFVTFRfRE9fUVVFUlksIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX0ZPUk1BVCwgZ19wYXJhbV9zcGVjX3N0cmluZyAoImZvcm1hdCIsICJmb3JtYXQiLAorICAgICAgICAgICJGb3JtYXQgdG8gdXNlIGZvciB0aGUgcXVlcnlpbmciLCBERUZBVUxUX0ZPUk1BVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZwcm9ncmVzc19yZXBvcnRfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJnByb2dyZXNzX3JlcG9ydF9zcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJQcm9ncmVzcyByZXBvcnQiLAorICAgICAgIlRlc3RpbmciLAorICAgICAgIlBlcmlvZGljYWxseSBxdWVyeSBhbmQgcmVwb3J0IG9uIHByb2Nlc3NpbmcgcHJvZ3Jlc3MiLAorICAgICAgIkphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPiIpOworCisgIGdzdGJhc2V0cmFuc19jbGFzcy0+c2lua19ldmVudCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Byb2dyZXNzX3JlcG9ydF9zaW5rX2V2ZW50KTsKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzLT50cmFuc2Zvcm1faXAgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wcm9ncmVzc19yZXBvcnRfdHJhbnNmb3JtX2lwKTsKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHJvZ3Jlc3NfcmVwb3J0X3N0YXJ0KTsKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzLT5zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wcm9ncmVzc19yZXBvcnRfc3RvcCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHJvZ3Jlc3NfcmVwb3J0X2luaXQgKEdzdFByb2dyZXNzUmVwb3J0ICogcmVwb3J0KQoreworICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X3Bhc3N0aHJvdWdoIChHU1RfQkFTRV9UUkFOU0ZPUk0gKHJlcG9ydCksIFRSVUUpOworCisgIHJlcG9ydC0+dXBkYXRlX2ZyZXEgPSBERUZBVUxUX1VQREFURV9GUkVROworICByZXBvcnQtPnNpbGVudCA9IERFRkFVTFRfU0lMRU5UOworICByZXBvcnQtPmRvX3F1ZXJ5ID0gREVGQVVMVF9ET19RVUVSWTsKKyAgcmVwb3J0LT5mb3JtYXQgPSBnX3N0cmR1cCAoREVGQVVMVF9GT1JNQVQpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Byb2dyZXNzX3JlcG9ydF9wb3N0X3Byb2dyZXNzIChHc3RQcm9ncmVzc1JlcG9ydCAqIGZpbHRlciwKKyAgICBHc3RGb3JtYXQgZm9ybWF0LCBnaW50NjQgY3VycmVudCwgZ2ludDY0IHRvdGFsKQoreworICBHc3RTdHJ1Y3R1cmUgKnMgPSBOVUxMOworCisgIGlmIChjdXJyZW50ID49IDAgJiYgdG90YWwgPiAwKSB7CisgICAgZ2RvdWJsZSBwZXJjOworCisgICAgcGVyYyA9IGdzdF91dGlsX2d1aW50NjRfdG9fZ2RvdWJsZSAoY3VycmVudCkgKiAxMDAuMCAvCisgICAgICAgIGdzdF91dGlsX2d1aW50NjRfdG9fZ2RvdWJsZSAodG90YWwpOworICAgIHBlcmMgPSBDTEFNUCAocGVyYywgMC4wLCAxMDAuMCk7CisKKyAgICAvKiB3ZSBwcm92aWRlIGEgInBlcmNlbnQiIGZpZWxkIG9mIGludGVnZXIgdHlwZSB0byBzdGF5IGNvbXBhdGlibGUKKyAgICAgKiB3aXRoIHF0ZGVtdXgsIGJ1dCBhZGQgYSBzZWNvbmQgInBlcmNlbnQtZG91YmxlIiBmaWVsZCBmb3IgdGhvc2Ugd2hvCisgICAgICogd2FudCBtb3JlIHByZWNpc2lvbiBhbmQgYXJlIHRvbyBsYXp5IHRvIGNhbGN1bGF0ZSBpdCB0aGVtc2VsdmVzICovCisgICAgcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgicHJvZ3Jlc3MiLCAicGVyY2VudCIsIEdfVFlQRV9JTlQsIChnaW50KSBwZXJjLAorICAgICAgICAicGVyY2VudC1kb3VibGUiLCBHX1RZUEVfRE9VQkxFLCBwZXJjLCAiY3VycmVudCIsIEdfVFlQRV9JTlQ2NCwgY3VycmVudCwKKyAgICAgICAgInRvdGFsIiwgR19UWVBFX0lOVDY0LCB0b3RhbCwgTlVMTCk7CisgIH0gZWxzZSBpZiAoY3VycmVudCA+PSAwKSB7CisgICAgcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgicHJvZ3Jlc3MiLCAiY3VycmVudCIsIEdfVFlQRV9JTlQ2NCwgY3VycmVudCwgTlVMTCk7CisgIH0KKworICBpZiAocykgeworICAgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICJwb3N0aW5nIHByb2dyZXNzIG1lc3NhZ2U6ICUiIEdTVF9QVFJfRk9STUFULCBzKTsKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgImZvcm1hdCIsIEdTVF9UWVBFX0ZPUk1BVCwgZm9ybWF0LCBOVUxMKTsKKyAgICAvKiBjYW4ndCBwb3N0IGl0IHJpZ2h0IGhlcmUgYmVjYXVzZSB3ZSdyZSBob2xkaW5nIHRoZSBvYmplY3QgbG9jayAqLworICAgIGZpbHRlci0+cGVuZGluZ19tc2cgPSBnc3RfbWVzc2FnZV9uZXdfZWxlbWVudCAoR1NUX09CSkVDVF9DQVNUIChmaWx0ZXIpLCBzKTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wcm9ncmVzc19yZXBvcnRfZG9fcXVlcnkgKEdzdFByb2dyZXNzUmVwb3J0ICogZmlsdGVyLCBHc3RGb3JtYXQgZm9ybWF0LAorICAgIGdpbnQgaGgsIGdpbnQgbW0sIGdpbnQgc3MsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgY29uc3QgZ2NoYXIgKmZvcm1hdF9uYW1lID0gTlVMTDsKKyAgR3N0UGFkICpzaW5rX3BhZDsKKyAgZ2ludDY0IGN1ciwgdG90YWw7CisKKyAgc2lua19wYWQgPSBHU1RfQkFTRV9UUkFOU0ZPUk0gKGZpbHRlciktPnNpbmtwYWQ7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGZpbHRlciwgInF1ZXJ5aW5nIHVzaW5nIGZvcm1hdCAlZCAoJXMpIiwgZm9ybWF0LAorICAgICAgZ3N0X2Zvcm1hdF9nZXRfbmFtZSAoZm9ybWF0KSk7CisKKyAgaWYgKGZpbHRlci0+ZG9fcXVlcnkgfHwgIWJ1ZikgeworICAgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICJ1c2luZyB1cHN0cmVhbSBxdWVyeSIpOworICAgIGlmICghZ3N0X3BhZF9wZWVyX3F1ZXJ5X3Bvc2l0aW9uIChzaW5rX3BhZCwgZm9ybWF0LCAmY3VyKSB8fAorICAgICAgICAhZ3N0X3BhZF9wZWVyX3F1ZXJ5X2R1cmF0aW9uIChzaW5rX3BhZCwgZm9ybWF0LCAmdG90YWwpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9IGVsc2UgeworICAgIEdzdEJhc2VUcmFuc2Zvcm0gKmJhc2UgPSBHU1RfQkFTRV9UUkFOU0ZPUk0gKGZpbHRlcik7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAidXNpbmcgYnVmZmVyIG1ldGFkYXRhIik7CisgICAgaWYgKGZvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUgJiYgYmFzZS0+c2VnbWVudC5mb3JtYXQgPT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICBjdXIgPSBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJmJhc2UtPnNlZ21lbnQsIGZvcm1hdCwKKyAgICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKSk7CisgICAgICB0b3RhbCA9IGJhc2UtPnNlZ21lbnQuZHVyYXRpb247CisgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gR1NUX0ZPUk1BVF9CVUZGRVJTKSB7CisgICAgICBjdXIgPSBmaWx0ZXItPmJ1ZmZlcl9jb3VudDsKKyAgICAgIHRvdGFsID0gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKworICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgR1NUX0ZPUk1BVF9CWVRFUzoKKyAgICAgIGZvcm1hdF9uYW1lID0gImJ5dGVzIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0ZPUk1BVF9CVUZGRVJTOgorICAgICAgZm9ybWF0X25hbWUgPSAiYnVmZmVycyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9GT1JNQVRfUEVSQ0VOVDoKKyAgICAgIGZvcm1hdF9uYW1lID0gInBlcmNlbnQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6CisgICAgICBmb3JtYXRfbmFtZSA9ICJzZWNvbmRzIjsKKyAgICAgIGN1ciAvPSBHU1RfU0VDT05EOworICAgICAgdG90YWwgLz0gR1NUX1NFQ09ORDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0ZPUk1BVF9ERUZBVUxUOnsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgIGZvcm1hdF9uYW1lID0gImJvZ291bml0cyI7CisgICAgICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChHU1RfQkFTRV9UUkFOU0ZPUk0gKGZpbHRlciktPnNpbmtwYWQpOworICAgICAgaWYgKGNhcHMpIHsKKyAgICAgICAgaWYgKGdzdF9jYXBzX2lzX2ZpeGVkIChjYXBzKSAmJiAhZ3N0X2NhcHNfaXNfYW55IChjYXBzKSkgeworICAgICAgICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICAgICAgICAgIGNvbnN0IGdjaGFyICptaW1lX3R5cGUgPSBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzKTsKKworICAgICAgICAgIGlmIChnX3N0cl9oYXNfcHJlZml4IChtaW1lX3R5cGUsICJ2aWRlby8iKSB8fAorICAgICAgICAgICAgICBnX3N0cl9oYXNfcHJlZml4IChtaW1lX3R5cGUsICJpbWFnZS8iKSkgeworICAgICAgICAgICAgZm9ybWF0X25hbWUgPSAiZnJhbWVzIjsKKyAgICAgICAgICB9IGVsc2UgaWYgKGdfc3RyX2hhc19wcmVmaXggKG1pbWVfdHlwZSwgImF1ZGlvLyIpKSB7CisgICAgICAgICAgICBmb3JtYXRfbmFtZSA9ICJzYW1wbGVzIjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6eworICAgICAgY29uc3QgR3N0Rm9ybWF0RGVmaW5pdGlvbiAqZGV0YWlsczsKKworICAgICAgZGV0YWlscyA9IGdzdF9mb3JtYXRfZ2V0X2RldGFpbHMgKGZvcm1hdCk7CisgICAgICBpZiAoZGV0YWlscykgeworICAgICAgICBmb3JtYXRfbmFtZSA9IGRldGFpbHMtPm5pY2s7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3JtYXRfbmFtZSA9ICJ1bmtub3duIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmICghZmlsdGVyLT5zaWxlbnQpIHsKKyAgICBpZiAodG90YWwgPiAwKSB7CisgICAgICBnX3ByaW50ICgiJXMgKCUwMmQ6JTAyZDolMDJkKTogJSIgR19HSU5UNjRfRk9STUFUICIgLyAlIgorICAgICAgICAgIEdfR0lOVDY0X0ZPUk1BVCAiICVzICglNC4xZiAlJSlcbiIsIEdTVF9PQkpFQ1RfTkFNRSAoZmlsdGVyKSwgaGgsCisgICAgICAgICAgbW0sIHNzLCBjdXIsIHRvdGFsLCBmb3JtYXRfbmFtZSwgKGdkb3VibGUpIGN1ciAvIHRvdGFsICogMTAwLjApOworICAgIH0gZWxzZSB7CisgICAgICBnX3ByaW50ICgiJXMgKCUwMmQ6JTAyZDolMDJkKTogJSIgR19HSU5UNjRfRk9STUFUICIgJXNcbiIsCisgICAgICAgICAgR1NUX09CSkVDVF9OQU1FIChmaWx0ZXIpLCBoaCwgbW0sIHNzLCBjdXIsIGZvcm1hdF9uYW1lKTsKKyAgICB9CisgIH0KKworICBnc3RfcHJvZ3Jlc3NfcmVwb3J0X3Bvc3RfcHJvZ3Jlc3MgKGZpbHRlciwgZm9ybWF0LCBjdXIsIHRvdGFsKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHJvZ3Jlc3NfcmVwb3J0X3JlcG9ydCAoR3N0UHJvZ3Jlc3NSZXBvcnQgKiBmaWx0ZXIsIEdUaW1lVmFsIGN1cl90aW1lLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rm9ybWF0IHRyeV9mb3JtYXRzW10gPSB7IEdTVF9GT1JNQVRfVElNRSwgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICBHU1RfRk9STUFUX1BFUkNFTlQsIEdTVF9GT1JNQVRfQlVGRkVSUywKKyAgICBHU1RfRk9STUFUX0RFRkFVTFQKKyAgfTsKKyAgR3N0TWVzc2FnZSAqbXNnOworICBHc3RGb3JtYXQgZm9ybWF0ID0gR1NUX0ZPUk1BVF9VTkRFRklORUQ7CisgIGdib29sZWFuIGRvbmUgPSBGQUxTRTsKKyAgZ2xvbmcgcnVuX3RpbWU7CisgIGdpbnQgaGgsIG1tLCBzczsKKworICBydW5fdGltZSA9IGN1cl90aW1lLnR2X3NlYyAtIGZpbHRlci0+c3RhcnRfdGltZS50dl9zZWM7CisKKyAgaGggPSAocnVuX3RpbWUgLyAzNjAwKSAlIDEwMDsKKyAgbW0gPSAocnVuX3RpbWUgLyA2MCkgJSA2MDsKKyAgc3MgPSAocnVuX3RpbWUgJSA2MCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworCisgIGlmIChmaWx0ZXItPmZvcm1hdCAhPSBOVUxMICYmIHN0cmNtcCAoZmlsdGVyLT5mb3JtYXQsICJhdXRvIikgIT0gMCkgeworICAgIGZvcm1hdCA9IGdzdF9mb3JtYXRfZ2V0X2J5X25pY2sgKGZpbHRlci0+Zm9ybWF0KTsKKyAgfQorCisgIGlmIChmb3JtYXQgIT0gR1NUX0ZPUk1BVF9VTkRFRklORUQpIHsKKyAgICBkb25lID0gZ3N0X3Byb2dyZXNzX3JlcG9ydF9kb19xdWVyeSAoZmlsdGVyLCBmb3JtYXQsIGhoLCBtbSwgc3MsIGJ1Zik7CisgIH0gZWxzZSB7CisgICAgZ2ludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEdfTl9FTEVNRU5UUyAodHJ5X2Zvcm1hdHMpOyArK2kpIHsKKyAgICAgIGRvbmUgPSBnc3RfcHJvZ3Jlc3NfcmVwb3J0X2RvX3F1ZXJ5IChmaWx0ZXIsIHRyeV9mb3JtYXRzW2ldLCBoaCwgbW0sIHNzLAorICAgICAgICAgIGJ1Zik7CisgICAgICBpZiAoZG9uZSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKCFkb25lICYmICFmaWx0ZXItPnNpbGVudCkgeworICAgIGdfcHJpbnQgKCIlcyAoJTJkOiUyZDolMmQpOiBDb3VsZCBub3QgcXVlcnkgcG9zaXRpb24gYW5kL29yIGR1cmF0aW9uXG4iLAorICAgICAgICBHU1RfT0JKRUNUX05BTUUgKGZpbHRlciksIGhoLCBtbSwgc3MpOworICB9CisKKyAgbXNnID0gZmlsdGVyLT5wZW5kaW5nX21zZzsKKyAgZmlsdGVyLT5wZW5kaW5nX21zZyA9IE5VTEw7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworCisgIGlmIChtc2cpIHsKKyAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKGZpbHRlciksIG1zZyk7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcHJvZ3Jlc3NfcmVwb3J0X3NpbmtfZXZlbnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UHJvZ3Jlc3NSZXBvcnQgKmZpbHRlcjsKKworICBmaWx0ZXIgPSBHU1RfUFJPR1JFU1NfUkVQT1JUICh0cmFucyk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRU9TOgorICAgIHsKKyAgICAgIEdUaW1lVmFsIGN1cl90aW1lOworCisgICAgICBnX2dldF9jdXJyZW50X3RpbWUgKCZjdXJfdGltZSk7CisgICAgICBnc3RfcHJvZ3Jlc3NfcmVwb3J0X3JlcG9ydCAoZmlsdGVyLCBjdXJfdGltZSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNpbmtfZXZlbnQgKHRyYW5zLCBldmVudCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcHJvZ3Jlc3NfcmVwb3J0X3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFByb2dyZXNzUmVwb3J0ICpmaWx0ZXI7CisgIGdib29sZWFuIG5lZWRfdXBkYXRlOworICBHVGltZVZhbCBjdXJfdGltZTsKKworICBnX2dldF9jdXJyZW50X3RpbWUgKCZjdXJfdGltZSk7CisKKyAgZmlsdGVyID0gR1NUX1BST0dSRVNTX1JFUE9SVCAodHJhbnMpOworCisgIC8qIENoZWNrIGlmIHVwZGF0ZV9mcmVxIHNlY29uZHMgaGF2ZSBwYXNzZWQgc2luY2UgdGhlIGxhc3QgdXBkYXRlICovCisgIEdTVF9PQkpFQ1RfTE9DSyAoZmlsdGVyKTsKKyAgbmVlZF91cGRhdGUgPQorICAgICAgKChjdXJfdGltZS50dl9zZWMgLSBmaWx0ZXItPmxhc3RfcmVwb3J0LnR2X3NlYykgPj0gZmlsdGVyLT51cGRhdGVfZnJlcSk7CisgIGZpbHRlci0+YnVmZmVyX2NvdW50Kys7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworCisgIGlmIChuZWVkX3VwZGF0ZSkgeworICAgIGdzdF9wcm9ncmVzc19yZXBvcnRfcmVwb3J0IChmaWx0ZXIsIGN1cl90aW1lLCBidWYpOworICAgIEdTVF9PQkpFQ1RfTE9DSyAoZmlsdGVyKTsKKyAgICBmaWx0ZXItPmxhc3RfcmVwb3J0ID0gY3VyX3RpbWU7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGZpbHRlcik7CisgIH0KKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Byb2dyZXNzX3JlcG9ydF9zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICBHc3RQcm9ncmVzc1JlcG9ydCAqZmlsdGVyOworCisgIGZpbHRlciA9IEdTVF9QUk9HUkVTU19SRVBPUlQgKHRyYW5zKTsKKworICBnX2dldF9jdXJyZW50X3RpbWUgKCZmaWx0ZXItPmxhc3RfcmVwb3J0KTsKKyAgZmlsdGVyLT5zdGFydF90aW1lID0gZmlsdGVyLT5sYXN0X3JlcG9ydDsKKyAgZmlsdGVyLT5idWZmZXJfY291bnQgPSAwOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wcm9ncmVzc19yZXBvcnRfc3RvcCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICAvKiBhbnl0aGluZyB3ZSBzaG91bGQgYmUgZG9pbmcgaGVyZT8gKi8KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHJvZ3Jlc3NfcmVwb3J0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RQcm9ncmVzc1JlcG9ydCAqZmlsdGVyOworCisgIGZpbHRlciA9IEdTVF9QUk9HUkVTU19SRVBPUlQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1VQREFURV9GUkVROgorICAgICAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworICAgICAgZmlsdGVyLT51cGRhdGVfZnJlcSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGZpbHRlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0lMRU5UOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworICAgICAgZmlsdGVyLT5zaWxlbnQgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ET19RVUVSWToKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZmlsdGVyKTsKKyAgICAgIGZpbHRlci0+ZG9fcXVlcnkgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GT1JNQVQ6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGZpbHRlcik7CisgICAgICBnX2ZyZWUgKGZpbHRlci0+Zm9ybWF0KTsKKyAgICAgIGZpbHRlci0+Zm9ybWF0ID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBpZiAoZmlsdGVyLT5mb3JtYXQgPT0gTlVMTCkKKyAgICAgICAgZmlsdGVyLT5mb3JtYXQgPSBnX3N0cmR1cCAoImF1dG8iKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHJvZ3Jlc3NfcmVwb3J0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RQcm9ncmVzc1JlcG9ydCAqZmlsdGVyOworCisgIGZpbHRlciA9IEdTVF9QUk9HUkVTU19SRVBPUlQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1VQREFURV9GUkVROgorICAgICAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZmlsdGVyLT51cGRhdGVfZnJlcSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TSUxFTlQ6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGZpbHRlcik7CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZmlsdGVyLT5zaWxlbnQpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGZpbHRlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRE9fUVVFUlk6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGZpbHRlcik7CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZmlsdGVyLT5kb19xdWVyeSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GT1JNQVQ6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGZpbHRlcik7CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBmaWx0ZXItPmZvcm1hdCk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9kZWJ1Z3V0aWxzL3Byb2dyZXNzcmVwb3J0LmggYi9nc3QvZGVidWd1dGlscy9wcm9ncmVzc3JlcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OTA5MzcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVidWd1dGlscy9wcm9ncmVzc3JlcG9ydC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qIEdTdHJlYW1lciBQcm9ncmVzcyBSZXBvcnQgRWxlbWVudAorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSA8MjAwND4gSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUFJPR1JFU1NfUkVQT1JUX0hfXworI2RlZmluZSBfX0dTVF9QUk9HUkVTU19SRVBPUlRfSF9fCisKKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfUFJPR1JFU1NfUkVQT1JUIFwKKyAgKGdzdF9wcm9ncmVzc19yZXBvcnRfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1BST0dSRVNTX1JFUE9SVChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1BST0dSRVNTX1JFUE9SVCxHc3RQcm9ncmVzc1JlcG9ydCkpCisjZGVmaW5lIEdTVF9QUk9HUkVTU19SRVBPUlRfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUFJPR1JFU1NfUkVQT1JULEdzdFByb2dyZXNzUmVwb3J0Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUFJPR1JFU1NfUkVQT1JUKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUFJPR1JFU1NfUkVQT1JUKSkKKyNkZWZpbmUgR1NUX0lTX1BST0dSRVNTX1JFUE9SVF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9QUk9HUkVTU19SRVBPUlQpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFByb2dyZXNzUmVwb3J0IEdzdFByb2dyZXNzUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFByb2dyZXNzUmVwb3J0Q2xhc3MgR3N0UHJvZ3Jlc3NSZXBvcnRDbGFzczsKKworc3RydWN0IF9Hc3RQcm9ncmVzc1JlcG9ydAoreworICBHc3RCYXNlVHJhbnNmb3JtIGJhc2V0cmFuc2Zvcm07CisKKyAgR3N0TWVzc2FnZSAqcGVuZGluZ19tc2c7CisKKyAgZ2ludCB1cGRhdGVfZnJlcTsKKyAgZ2Jvb2xlYW4gc2lsZW50OworICBnYm9vbGVhbiBkb19xdWVyeTsKKyAgR1RpbWVWYWwgc3RhcnRfdGltZTsKKyAgR1RpbWVWYWwgbGFzdF9yZXBvcnQ7CisgIGdpbnQ2NCBidWZmZXJfY291bnQ7CisKKyAgLyogRm9ybWF0IHVzZWQgZm9yIHF1ZXJ5aW5nLiBVc2luZyBhIHN0cmluZyBoZXJlIGJlY2F1c2UgdGhlCisgICAqIGZvcm1hdCBtaWdodCBub3QgYmUgcmVnaXN0ZXJlZCB5ZXQgd2hlbiB0aGUgcHJvcGVydHkgaXMgc2V0ICovCisgIGdjaGFyICpmb3JtYXQ7Cit9OworCitzdHJ1Y3QgX0dzdFByb2dyZXNzUmVwb3J0Q2xhc3MKK3sKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9wcm9ncmVzc19yZXBvcnRfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1BST0dSRVNTX1JFUE9SVF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYyBiL2dzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzNhMjNjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlYnVndXRpbHMvcm5kYnVmZmVyc2l6ZS5jCkBAIC0wLDAgKzEsNTc2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNyBOb2tpYSBDb3Jwb3JhdGlvbiAoY29udGFjdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPikKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcm5kYnVmZmVyc2l6ZQorICoKKyAqIFRoaXMgZWxlbWVudCBwdWxscyBidWZmZXJzIHdpdGggcmFuZG9tIHNpemVzIGZyb20gdGhlIHNvdXJjZS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3Rfcm5kX2J1ZmZlcl9zaXplX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9ybmRfYnVmZmVyX3NpemVfZGVidWcKKworI2RlZmluZSBHU1RfVFlQRV9STkRfQlVGRkVSX1NJWkUgICAgICAgICAgICAoZ3N0X3JuZF9idWZmZXJfc2l6ZV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUk5EX0JVRkZFUl9TSVpFKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUk5EX0JVRkZFUl9TSVpFLEdzdFJuZEJ1ZmZlclNpemUpKQorI2RlZmluZSBHU1RfUk5EX0JVRkZFUl9TSVpFX0NMQVNTKGtsYXNzKSAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9STkRfQlVGRkVSX1NJWkUsR3N0Um5kQnVmZmVyU2l6ZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JORF9CVUZGRVJfU0laRShvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JORF9CVUZGRVJfU0laRSkpCisjZGVmaW5lIEdTVF9JU19STkRfQlVGRkVSX1NJWkVfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JORF9CVUZGRVJfU0laRSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSbmRCdWZmZXJTaXplIEdzdFJuZEJ1ZmZlclNpemU7Cit0eXBlZGVmIHN0cnVjdCBfR3N0Um5kQnVmZmVyU2l6ZUNsYXNzIEdzdFJuZEJ1ZmZlclNpemVDbGFzczsKKworc3RydWN0IF9Hc3RSbmRCdWZmZXJTaXplCit7CisgIEdzdEVsZW1lbnQgcGFyZW50OworCisgIC8qPCBwcml2YXRlID4gKi8KKyAgR1JhbmQgKnJhbmQ7CisgIGd1aW50IHNlZWQ7CisgIGdpbnQgbWluLCBtYXg7CisKKyAgR3N0UGFkICpzaW5rcGFkLCAqc3JjcGFkOworICBndWludDY0IG9mZnNldDsKKworICBnYm9vbGVhbiBuZWVkX25ld3NlZ21lbnQ7CisKKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKK307CisKK3N0cnVjdCBfR3N0Um5kQnVmZmVyU2l6ZUNsYXNzCit7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitlbnVtCit7CisgIFBST1BfU0VFRCA9IDEsCisgIFBST1BfTUlOSU1VTSwKKyAgUFJPUF9NQVhJTVVNCit9OworCisjZGVmaW5lIERFRkFVTFRfU0VFRCAwCisjZGVmaW5lIERFRkFVTFRfTUlOICAxCisjZGVmaW5lIERFRkFVTFRfTUFYICAoOCoxMDI0KQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgdm9pZCBnc3Rfcm5kX2J1ZmZlcl9zaXplX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyB2b2lkIGdzdF9ybmRfYnVmZmVyX3NpemVfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3JuZF9idWZmZXJfc2l6ZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfcm5kX2J1ZmZlcl9zaXplX2FjdGl2YXRlIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3JuZF9idWZmZXJfc2l6ZV9hY3RpdmF0ZV9tb2RlIChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RQYWRNb2RlIG1vZGUsIGdib29sZWFuIGFjdGl2ZSk7CitzdGF0aWMgdm9pZCBnc3Rfcm5kX2J1ZmZlcl9zaXplX2xvb3AgKEdzdFJuZEJ1ZmZlclNpemUgKiBzZWxmKTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3Rfcm5kX2J1ZmZlcl9zaXplX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3JuZF9idWZmZXJfc2l6ZV9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9ybmRfYnVmZmVyX3NpemVfc2lua19ldmVudCAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfcm5kX2J1ZmZlcl9zaXplX2NoYWluIChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpOworCitHVHlwZSBnc3Rfcm5kX2J1ZmZlcl9zaXplX2dldF90eXBlICh2b2lkKTsKKyNkZWZpbmUgZ3N0X3JuZF9idWZmZXJfc2l6ZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSbmRCdWZmZXJTaXplLCBnc3Rfcm5kX2J1ZmZlcl9zaXplLCBHU1RfVFlQRV9FTEVNRU5UKTsKKworc3RhdGljIHZvaWQKK2dzdF9ybmRfYnVmZmVyX3NpemVfY2xhc3NfaW5pdCAoR3N0Um5kQnVmZmVyU2l6ZUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9ybmRfYnVmZmVyX3NpemVfZGVidWcsICJybmRidWZmZXJzaXplIiwgMCwKKyAgICAgICJybmRidWZmZXJzaXplIGVsZW1lbnQiKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3Rfcm5kX2J1ZmZlcl9zaXplX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3JuZF9idWZmZXJfc2l6ZV9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3JuZF9idWZmZXJfc2l6ZV9maW5hbGl6ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlJhbmRvbSBidWZmZXIgc2l6ZSIsCisgICAgICAiVGVzdGluZyIsICJwdWxsIHJhbmRvbSBzaXplZCBidWZmZXJzIiwKKyAgICAgICJTdGVmYW4gS29zdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPiIpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3JuZF9idWZmZXJfc2l6ZV9jaGFuZ2Vfc3RhdGUpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU0VFRCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgic2VlZCIsICJyYW5kb20gbnVtYmVyIHNlZWQiLAorICAgICAgICAgICJzZWVkIGZvciByYW5kb21uZXNzIChpbml0aWFsaXplZCB3aGVuIGdvaW5nIGZyb20gUkVBRFkgdG8gUEFVU0VEKSIsCisgICAgICAgICAgMCwgR19NQVhVSU5UMzIsIERFRkFVTFRfU0VFRCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01JTklNVU0sCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgibWluIiwgIm1pbmludW0iLCAibWluaW51bSBidWZmZXIgc2l6ZSIsCisgICAgICAgICAgMCwgR19NQVhJTlQzMiwgREVGQVVMVF9NSU4sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhJTVVNLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoIm1heCIsICJtYXhpbXVtIiwgIm1heGltdW0gYnVmZmVyIHNpemUiLAorICAgICAgICAgIDEsIEdfTUFYSU5UMzIsIERFRkFVTFRfTUFYLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfcm5kX2J1ZmZlcl9zaXplX2luaXQgKEdzdFJuZEJ1ZmZlclNpemUgKiBzZWxmKQoreworICBzZWxmLT5zaW5rcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzaW5rX3RlbXBsYXRlLCAic2luayIpOworICBnc3RfcGFkX3NldF9hY3RpdmF0ZV9mdW5jdGlvbiAoc2VsZi0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfcm5kX2J1ZmZlcl9zaXplX2FjdGl2YXRlKSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2YXRlbW9kZV9mdW5jdGlvbiAoc2VsZi0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfcm5kX2J1ZmZlcl9zaXplX2FjdGl2YXRlX21vZGUpKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHNlbGYtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3JuZF9idWZmZXJfc2l6ZV9zaW5rX2V2ZW50KSk7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChzZWxmLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ybmRfYnVmZmVyX3NpemVfY2hhaW4pKTsKKyAgR1NUX09CSkVDVF9GTEFHX1NFVCAoc2VsZi0+c2lua3BhZCwgR1NUX1BBRF9GTEFHX1BST1hZX0NBUFMpOworICBHU1RfT0JKRUNUX0ZMQUdfU0VUIChzZWxmLT5zaW5rcGFkLCBHU1RfUEFEX0ZMQUdfUFJPWFlfQUxMT0NBVElPTik7CisgIEdTVF9PQkpFQ1RfRkxBR19TRVQgKHNlbGYtPnNpbmtwYWQsIEdTVF9QQURfRkxBR19QUk9YWV9TQ0hFRFVMSU5HKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKHNlbGYpLCBzZWxmLT5zaW5rcGFkKTsKKworICBzZWxmLT5zcmNwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNyY190ZW1wbGF0ZSwgInNyYyIpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoc2VsZi0+c3JjcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ybmRfYnVmZmVyX3NpemVfc3JjX2V2ZW50KSk7CisgIEdTVF9PQkpFQ1RfRkxBR19TRVQgKHNlbGYtPnNyY3BhZCwgR1NUX1BBRF9GTEFHX1BST1hZX0NBUFMpOworICBHU1RfT0JKRUNUX0ZMQUdfU0VUIChzZWxmLT5zcmNwYWQsIEdTVF9QQURfRkxBR19QUk9YWV9BTExPQ0FUSU9OKTsKKyAgR1NUX09CSkVDVF9GTEFHX1NFVCAoc2VsZi0+c3JjcGFkLCBHU1RfUEFEX0ZMQUdfUFJPWFlfU0NIRURVTElORyk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzZWxmKSwgc2VsZi0+c3JjcGFkKTsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3JuZF9idWZmZXJfc2l6ZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0Um5kQnVmZmVyU2l6ZSAqc2VsZiA9IEdTVF9STkRfQlVGRkVSX1NJWkUgKG9iamVjdCk7CisKKyAgaWYgKHNlbGYtPnJhbmQpIHsKKyAgICBnX3JhbmRfZnJlZSAoc2VsZi0+cmFuZCk7CisgICAgc2VsZi0+cmFuZCA9IE5VTEw7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9ybmRfYnVmZmVyX3NpemVfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJuZEJ1ZmZlclNpemUgKnNlbGYgPSBHU1RfUk5EX0JVRkZFUl9TSVpFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TRUVEOgorICAgICAgc2VsZi0+c2VlZCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NSU5JTVVNOgorICAgICAgc2VsZi0+bWluID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYSU1VTToKKyAgICAgIHNlbGYtPm1heCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCitnc3Rfcm5kX2J1ZmZlcl9zaXplX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSbmRCdWZmZXJTaXplICpzZWxmID0gR1NUX1JORF9CVUZGRVJfU0laRSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU0VFRDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzZWxmLT5zZWVkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NSU5JTVVNOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgc2VsZi0+bWluKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhJTVVNOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgc2VsZi0+bWF4KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ybmRfYnVmZmVyX3NpemVfYWN0aXZhdGUgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50KQoreworICBHc3RRdWVyeSAqcXVlcnk7CisgIGdib29sZWFuIHB1bGxfbW9kZTsKKworICBxdWVyeSA9IGdzdF9xdWVyeV9uZXdfc2NoZWR1bGluZyAoKTsKKworICBpZiAoZ3N0X3BhZF9wZWVyX3F1ZXJ5IChwYWQsIHF1ZXJ5KSkKKyAgICBwdWxsX21vZGUgPSBnc3RfcXVlcnlfaGFzX3NjaGVkdWxpbmdfbW9kZV93aXRoX2ZsYWdzIChxdWVyeSwKKyAgICAgICAgR1NUX1BBRF9NT0RFX1BVTEwsIEdTVF9TQ0hFRFVMSU5HX0ZMQUdfU0VFS0FCTEUpOworICBlbHNlCisgICAgcHVsbF9tb2RlID0gRkFMU0U7CisKKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisKKyAgaWYgKHB1bGxfbW9kZSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgImFjdGl2YXRpbmcgcHVsbCIpOworICAgIHJldHVybiBnc3RfcGFkX2FjdGl2YXRlX21vZGUgKHBhZCwgR1NUX1BBRF9NT0RFX1BVTEwsIFRSVUUpOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgImFjdGl2YXRpbmcgcHVzaCIpOworICAgIHJldHVybiBnc3RfcGFkX2FjdGl2YXRlX21vZGUgKHBhZCwgR1NUX1BBRF9NT0RFX1BVU0gsIFRSVUUpOworICB9Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3Rfcm5kX2J1ZmZlcl9zaXplX2FjdGl2YXRlX21vZGUgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFBhZE1vZGUgbW9kZSwgZ2Jvb2xlYW4gYWN0aXZlKQoreworICBnYm9vbGVhbiByZXM7CisgIEdzdFJuZEJ1ZmZlclNpemUgKnNlbGYgPSBHU1RfUk5EX0JVRkZFUl9TSVpFIChwYXJlbnQpOworCisgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgR1NUX1BBRF9NT0RFX1BVTEw6CisgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgIEdTVF9JTkZPX09CSkVDVCAoc2VsZiwgInN0YXJ0aW5nIHB1bGwiKTsKKyAgICAgICAgcmVzID0KKyAgICAgICAgICAgIGdzdF9wYWRfc3RhcnRfdGFzayAocGFkLCAoR3N0VGFza0Z1bmN0aW9uKSBnc3Rfcm5kX2J1ZmZlcl9zaXplX2xvb3AsCisgICAgICAgICAgICBzZWxmLCBOVUxMKTsKKyAgICAgICAgc2VsZi0+bmVlZF9uZXdzZWdtZW50ID0gVFJVRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9JTkZPX09CSkVDVCAoc2VsZiwgInN0b3BwaW5nIHB1bGwiKTsKKyAgICAgICAgcmVzID0gZ3N0X3BhZF9zdG9wX3Rhc2sgKHBhZCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9QQURfTU9ERV9QVVNIOgorICAgICAgR1NUX0lORk9fT0JKRUNUIChzZWxmLCAiJXNhY3RpdmF0aW5nIGluIHB1c2ggbW9kZSIsIChhY3RpdmUpID8gIiIgOiAiZGUiKTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ybmRfYnVmZmVyX3NpemVfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSbmRCdWZmZXJTaXplICpzZWxmOworICBHc3RTZWVrVHlwZSBzdGFydF90eXBlOworICBHc3RTZWVrRmxhZ3MgZmxhZ3M7CisgIEdzdEZvcm1hdCBmb3JtYXQ7CisgIGdpbnQ2NCBzdGFydDsKKworICBpZiAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSAhPSBHU1RfRVZFTlRfU0VFSykgeworICAgIHJldHVybiBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgIH0KKworICBzZWxmID0gR1NUX1JORF9CVUZGRVJfU0laRSAocGFyZW50KTsKKyAgZ3N0X2V2ZW50X3BhcnNlX3NlZWsgKGV2ZW50LCBOVUxMLCAmZm9ybWF0LCAmZmxhZ3MsICZzdGFydF90eXBlLCAmc3RhcnQsCisgICAgICBOVUxMLCBOVUxMKTsKKworICBpZiAoZm9ybWF0ICE9IEdTVF9GT1JNQVRfQllURVMpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhZCwgIm9ubHkgQllURSBmb3JtYXQgc3VwcG9ydGVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChzdGFydF90eXBlICE9IEdTVF9TRUVLX1RZUEVfU0VUKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYWQsICJvbmx5IFNFRUtfVFlQRV9TRVQgc3VwcG9ydGVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKChmbGFncyAmIEdTVF9TRUVLX0ZMQUdfRkxVU0gpKSB7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzZWxmLT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfZmx1c2hfc3RhcnQgKCkpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc2VsZi0+c2lua3BhZCwgZ3N0X2V2ZW50X25ld19mbHVzaF9zdGFydCAoKSk7CisgIH0gZWxzZSB7CisgICAgZ3N0X3BhZF9wYXVzZV90YXNrIChzZWxmLT5zaW5rcGFkKTsKKyAgfQorCisgIEdTVF9QQURfU1RSRUFNX0xPQ0sgKHNlbGYtPnNpbmtwYWQpOworCisgIGlmICgoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX0ZMVVNIKSkgeworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc2VsZi0+c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2ZsdXNoX3N0b3AgKFRSVUUpKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNpbmtwYWQsIGdzdF9ldmVudF9uZXdfZmx1c2hfc3RvcCAoVFJVRSkpOworICB9CisKKyAgR1NUX0lORk9fT0JKRUNUIChwYWQsICJzZWVraW5nIHRvIG9mZnNldCAlIiBHX0dJTlQ2NF9GT1JNQVQsIHN0YXJ0KTsKKworICBzZWxmLT5vZmZzZXQgPSBzdGFydDsKKyAgc2VsZi0+bmVlZF9uZXdzZWdtZW50ID0gVFJVRTsKKworICBnc3RfcGFkX3N0YXJ0X3Rhc2sgKHNlbGYtPnNpbmtwYWQsIChHc3RUYXNrRnVuY3Rpb24pIGdzdF9ybmRfYnVmZmVyX3NpemVfbG9vcCwKKyAgICAgIHNlbGYsIE5VTEwpOworCisgIEdTVF9QQURfU1RSRUFNX1VOTE9DSyAoc2VsZi0+c2lua3BhZCk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3JuZF9idWZmZXJfc2l6ZV9kcmFpbl9hZGFwdGVyIChHc3RSbmRCdWZmZXJTaXplICogc2VsZiwgZ2Jvb2xlYW4gZW9zKQoreworICBHc3RGbG93UmV0dXJuIGZsb3c7CisgIEdzdEJ1ZmZlciAqYnVmOworICBndWludCBudW1fYnl0ZXMsIGF2YWlsOworCisgIGZsb3cgPSBHU1RfRkxPV19PSzsKKworICBpZiAoR19VTkxJS0VMWSAoc2VsZi0+bWluID4gc2VsZi0+bWF4KSkKKyAgICBnb3RvIGJvZ3VzX21pbm1heDsKKworICBkbyB7CisgICAgaWYgKHNlbGYtPm1pbiAhPSBzZWxmLT5tYXgpIHsKKyAgICAgIG51bV9ieXRlcyA9IGdfcmFuZF9pbnRfcmFuZ2UgKHNlbGYtPnJhbmQsIHNlbGYtPm1pbiwgc2VsZi0+bWF4KTsKKyAgICB9IGVsc2UgeworICAgICAgbnVtX2J5dGVzID0gc2VsZi0+bWluOworICAgIH0KKworICAgIEdTVF9MT0dfT0JKRUNUIChzZWxmLCAicHVsbGluZyAldSBieXRlcyBvdXQgb2YgYWRhcHRlciIsIG51bV9ieXRlcyk7CisKKyAgICBidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoc2VsZi0+YWRhcHRlciwgbnVtX2J5dGVzKTsKKworICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgaWYgKCFlb3MpIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHNlbGYsICJub3QgZW5vdWdoIGJ5dGVzIGluIGFkYXB0ZXIiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChzZWxmLT5hZGFwdGVyKTsKKworICAgICAgaWYgKGF2YWlsID09IDApCisgICAgICAgIGJyZWFrOworCisgICAgICBpZiAoYXZhaWwgPCBzZWxmLT5taW4pIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzZWxmLCAiZGlzY2FyZGluZyAldSBieXRlcyBhdCBlbmQgKG1pbj0ldSkiLAorICAgICAgICAgICAgYXZhaWwsIHNlbGYtPm1pbik7CisgICAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChzZWxmLT5hZGFwdGVyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoc2VsZi0+YWRhcHRlciwgYXZhaWwpOworICAgICAgZ19hc3NlcnQgKGJ1ZiAhPSBOVUxMKTsKKyAgICB9CisKKyAgICBmbG93ID0gZ3N0X3BhZF9wdXNoIChzZWxmLT5zcmNwYWQsIGJ1Zik7CisgIH0KKyAgd2hpbGUgKGZsb3cgPT0gR1NUX0ZMT1dfT0spOworCisgIHJldHVybiBmbG93OworCisvKiBFUlJPUlMgKi8KK2JvZ3VzX21pbm1heDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzZWxmLCBMSUJSQVJZLCBTRVRUSU5HUywKKyAgICAgICAgKCJUaGUgbWluaW11bSBidWZmZXIgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIG1heGltdW0gYnVmZmVyIHNpemUuIiksCisgICAgICAgICgiYnVmZmVyIHNpemVzOiBtYXg9JWQsIG1pbj0lZCIsIHNlbGYtPm1pbiwgc2VsZi0+bWF4KSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3JuZF9idWZmZXJfc2l6ZV9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSbmRCdWZmZXJTaXplICpybmQgPSBHU1RfUk5EX0JVRkZFUl9TSVpFIChwYXJlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgIGdzdF9ybmRfYnVmZmVyX3NpemVfZHJhaW5fYWRhcHRlciAocm5kLCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6CisgICAgICBpZiAocm5kLT5hZGFwdGVyICE9IE5VTEwpCisgICAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChybmQtPmFkYXB0ZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ybmRfYnVmZmVyX3NpemVfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFJuZEJ1ZmZlclNpemUgKnJuZCA9IEdTVF9STkRfQlVGRkVSX1NJWkUgKHBhcmVudCk7CisgIEdzdEZsb3dSZXR1cm4gZmxvdzsKKworICBpZiAocm5kLT5hZGFwdGVyID09IE5VTEwpCisgICAgcm5kLT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworCisgIGdzdF9hZGFwdGVyX3B1c2ggKHJuZC0+YWRhcHRlciwgYnVmKTsKKworICBmbG93ID0gZ3N0X3JuZF9idWZmZXJfc2l6ZV9kcmFpbl9hZGFwdGVyIChybmQsIEZBTFNFKTsKKworICBpZiAoZmxvdyAhPSBHU1RfRkxPV19PSykKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHJuZCwgImZsb3c6ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKGZsb3cpKTsKKworICByZXR1cm4gZmxvdzsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ybmRfYnVmZmVyX3NpemVfbG9vcCAoR3N0Um5kQnVmZmVyU2l6ZSAqIHNlbGYpCit7CisgIEdzdEJ1ZmZlciAqYnVmID0gTlVMTDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIGd1aW50IG51bV9ieXRlcywgc2l6ZTsKKworICBpZiAoR19VTkxJS0VMWSAoc2VsZi0+bWluID4gc2VsZi0+bWF4KSkKKyAgICBnb3RvIGJvZ3VzX21pbm1heDsKKworICBpZiAoR19VTkxJS0VMWSAoc2VsZi0+bWluICE9IHNlbGYtPm1heCkpIHsKKyAgICBudW1fYnl0ZXMgPSBnX3JhbmRfaW50X3JhbmdlIChzZWxmLT5yYW5kLCBzZWxmLT5taW4sIHNlbGYtPm1heCk7CisgIH0gZWxzZSB7CisgICAgbnVtX2J5dGVzID0gc2VsZi0+bWluOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNlbGYsICJwdWxsaW5nICV1IGJ5dGVzIGF0IG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgbnVtX2J5dGVzLCBzZWxmLT5vZmZzZXQpOworCisgIHJldCA9IGdzdF9wYWRfcHVsbF9yYW5nZSAoc2VsZi0+c2lua3BhZCwgc2VsZi0+b2Zmc2V0LCBudW1fYnl0ZXMsICZidWYpOworCisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBwdWxsX2ZhaWxlZDsKKworICBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKworICBpZiAoc2l6ZSA8IG51bV9ieXRlcykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc2VsZiwgInNob3J0IGJ1ZmZlcjogJXUgYnl0ZXMiLCBzaXplKTsKKyAgfQorCisgIGlmIChzZWxmLT5uZWVkX25ld3NlZ21lbnQpIHsKKyAgICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgICAgc2VnbWVudC5zdGFydCA9IHNlbGYtPm9mZnNldDsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworICAgIHNlbGYtPm5lZWRfbmV3c2VnbWVudCA9IEZBTFNFOworICB9CisKKyAgc2VsZi0+b2Zmc2V0ICs9IHNpemU7CisKKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChzZWxmLT5zcmNwYWQsIGJ1Zik7CisKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICBnb3RvIHB1c2hfZmFpbGVkOworCisgIHJldHVybjsKKworcGF1c2VfdGFzazoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJwYXVzaW5nIHRhc2siKTsKKyAgICBnc3RfcGFkX3BhdXNlX3Rhc2sgKHNlbGYtPnNpbmtwYWQpOworICAgIHJldHVybjsKKyAgfQorCitwdWxsX2ZhaWxlZDoKKyAgeworICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfRU9TKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiZW9zIik7CisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNlbGYsICJwdWxsX3JhbmdlIGZsb3c6ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworICAgIH0KKyAgICBnb3RvIHBhdXNlX3Rhc2s7CisgIH0KKworcHVzaF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAicHVzaCBmbG93OiAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgICBpZiAocmV0ID09IEdTVF9GTE9XX0VPUykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImVvcyIpOworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzZWxmLT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKyAgICB9IGVsc2UgaWYgKHJldCA8IEdTVF9GTE9XX0VPUyB8fCByZXQgPT0gR1NUX0ZMT1dfTk9UX0xJTktFRCkgeworICAgICAgR1NUX0VMRU1FTlRfRkxPV19FUlJPUiAoc2VsZiwgcmV0KTsKKyAgICB9CisgICAgZ290byBwYXVzZV90YXNrOworICB9CisKK2JvZ3VzX21pbm1heDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzZWxmLCBMSUJSQVJZLCBTRVRUSU5HUywKKyAgICAgICAgKCJUaGUgbWluaW11bSBidWZmZXIgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIG1heGltdW0gYnVmZmVyIHNpemUuIiksCisgICAgICAgICgiYnVmZmVyIHNpemVzOiBtYXg9JWQsIG1pbj0lZCIsIHNlbGYtPm1pbiwgc2VsZi0+bWF4KSk7CisgICAgZ290byBwYXVzZV90YXNrOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3JuZF9idWZmZXJfc2l6ZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJuZEJ1ZmZlclNpemUgKnNlbGYgPSBHU1RfUk5EX0JVRkZFUl9TSVpFIChlbGVtZW50KTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIHNlbGYtPm9mZnNldCA9IDA7CisgICAgICBpZiAoIXNlbGYtPnJhbmQpIHsKKyAgICAgICAgc2VsZi0+cmFuZCA9IGdfcmFuZF9uZXdfd2l0aF9zZWVkIChzZWxmLT5zZWVkKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUExBWUlORzoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QTEFZSU5HX1RPX1BBVVNFRDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBpZiAoc2VsZi0+cmFuZCkgeworICAgICAgICBnX3JhbmRfZnJlZSAoc2VsZi0+cmFuZCk7CisgICAgICAgIHNlbGYtPnJhbmQgPSBOVUxMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBpZiAoc2VsZi0+YWRhcHRlcikgeworICAgICAgICBnX29iamVjdF91bnJlZiAoc2VsZi0+YWRhcHRlcik7CisgICAgICAgIHNlbGYtPmFkYXB0ZXIgPSBOVUxMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2dzdC9kZWJ1Z3V0aWxzL3Rlc3RwbHVnaW4uYyBiL2dzdC9kZWJ1Z3V0aWxzL3Rlc3RwbHVnaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjljYTBmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlYnVndXRpbHMvdGVzdHBsdWdpbi5jCkBAIC0wLDAgKzEsMzA0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBCZW5qYW1pbiBPdHRlIDxvdHRlQGdub21lLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNlc2luay5oPgorI2luY2x1ZGUgInRlc3RzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF90ZXN0X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF90ZXN0X2RlYnVnCisKKy8qIFRoaXMgcGx1Z2luIGRvZXMgYWxsIHRoZSB0ZXN0cyByZWdpc3RlcmVkIGluIHRoZSB0ZXN0cy5oIGZpbGUKKyAqLworCisjZGVmaW5lIEdTVF9UWVBFX1RFU1QgXAorICAoZ3N0X3Rlc3RfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1RFU1Qob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9URVNULEdzdFRlc3QpKQorI2RlZmluZSBHU1RfVEVTVF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9URVNULEdzdFRlc3RDbGFzcykpCisjZGVmaW5lIEdTVF9URVNUX0dFVF9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLEdTVF9UWVBFX1RFU1QsR3N0VGVzdENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1RFU1Qob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9URVNUKSkKKyNkZWZpbmUgR1NUX0lTX1RFU1RfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVEVTVCkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RUZXN0IEdzdFRlc3Q7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VGVzdENsYXNzIEdzdFRlc3RDbGFzczsKKworc3RydWN0IF9Hc3RUZXN0Cit7CisgIEdzdEJhc2VTaW5rIGJhc2VzaW5rOworCisgIGdwb2ludGVyIHRlc3RzW1RFU1RTX0NPVU5UXTsKKyAgR1ZhbHVlIHZhbHVlc1tURVNUU19DT1VOVF07Cit9OworCitzdHJ1Y3QgX0dzdFRlc3RDbGFzcworeworICBHc3RCYXNlU2lua0NsYXNzIHBhcmVudF9jbGFzczsKKworICBnY2hhciAqcGFyYW1fbmFtZXNbMiAqIFRFU1RTX0NPVU5UXTsKK307CisKK3N0YXRpYyB2b2lkIGdzdF90ZXN0X2ZpbmFsaXplIChHc3RUZXN0ICogdGVzdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdGVzdF9zdGFydCAoR3N0QmFzZVNpbmsgKiB0cmFucyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3Rlc3Rfc3RvcCAoR3N0QmFzZVNpbmsgKiB0cmFucyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3Rlc3Rfc2lua19ldmVudCAoR3N0QmFzZVNpbmsgKiBiYXNlc2luaywgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfdGVzdF9yZW5kZXJfYnVmZmVyIChHc3RCYXNlU2luayAqIGJhc2VzaW5rLAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyB2b2lkIGdzdF90ZXN0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF90ZXN0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitHVHlwZSBnc3RfdGVzdF9nZXRfdHlwZSAodm9pZCk7CisjZGVmaW5lIGdzdF90ZXN0X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFRlc3QsIGdzdF90ZXN0LCBHU1RfVFlQRV9CQVNFX1NJTkspOworCisKK3N0YXRpYyB2b2lkCitnc3RfdGVzdF9jbGFzc19pbml0IChHc3RUZXN0Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0QmFzZVNpbmtDbGFzcyAqYmFzZXNpbmtfY2xhc3MgPSBHU1RfQkFTRV9TSU5LX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgZ3VpbnQgaTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3Rlc3RfZGVidWcsICJ0ZXN0c2luayIsIDAsCisgICAgICAiZGVidWdnaW5nIGNhdGVnb3J5IGZvciB0ZXN0c2luayBlbGVtZW50Iik7CisKKyAgb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdGVzdF9zZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3Rlc3RfZ2V0X3Byb3BlcnR5OworCisgIG9iamVjdF9jbGFzcy0+ZmluYWxpemUgPSAoR09iamVjdEZpbmFsaXplRnVuYykgZ3N0X3Rlc3RfZmluYWxpemU7CisKKyAgZm9yIChpID0gMDsgaSA8IFRFU1RTX0NPVU5UOyBpKyspIHsKKyAgICBHUGFyYW1TcGVjICpzcGVjOworCisgICAgc3BlYyA9IHRlc3RzW2ldLmdldF9zcGVjICgmdGVzdHNbaV0sIEZBTFNFKTsKKyAgICBrbGFzcy0+cGFyYW1fbmFtZXNbMiAqIGldID0gZ19zdHJkdXAgKGdfcGFyYW1fc3BlY19nZXRfbmFtZSAoc3BlYykpOworICAgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKG9iamVjdF9jbGFzcywgMiAqIGkgKyAxLCBzcGVjKTsKKyAgICBzcGVjID0gdGVzdHNbaV0uZ2V0X3NwZWMgKCZ0ZXN0c1tpXSwgVFJVRSk7CisgICAga2xhc3MtPnBhcmFtX25hbWVzWzIgKiBpICsgMV0gPSBnX3N0cmR1cCAoZ19wYXJhbV9zcGVjX2dldF9uYW1lIChzcGVjKSk7CisgICAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAob2JqZWN0X2NsYXNzLCAyICogaSArIDIsIHNwZWMpOworICB9CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJUZXN0IHBsdWdpbiIsCisgICAgICAiVGVzdGluZyIsICJwZXJmb3JtIGEgbnVtYmVyIG9mIHRlc3RzIiwgIkJlbmphbWluIE90dGUgPG90dGVAZ25vbWU+Iik7CisKKyAgYmFzZXNpbmtfY2xhc3MtPnJlbmRlciA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdGVzdF9yZW5kZXJfYnVmZmVyKTsKKyAgYmFzZXNpbmtfY2xhc3MtPmV2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF90ZXN0X3NpbmtfZXZlbnQpOworICBiYXNlc2lua19jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Rlc3Rfc3RhcnQpOworICBiYXNlc2lua19jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdGVzdF9zdG9wKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF90ZXN0X2luaXQgKEdzdFRlc3QgKiB0ZXN0KQoreworICBHc3RUZXN0Q2xhc3MgKmtsYXNzOworICBndWludCBpOworCisgIGtsYXNzID0gR1NUX1RFU1RfR0VUX0NMQVNTICh0ZXN0KTsKKyAgZm9yIChpID0gMDsgaSA8IFRFU1RTX0NPVU5UOyBpKyspIHsKKyAgICBHUGFyYW1TcGVjICpzcGVjID0gZ19vYmplY3RfY2xhc3NfZmluZF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwKKyAgICAgICAga2xhc3MtPnBhcmFtX25hbWVzWzIgKiBpICsgMV0pOworCisgICAgZ192YWx1ZV9pbml0ICgmdGVzdC0+dmFsdWVzW2ldLCBHX1BBUkFNX1NQRUNfVkFMVUVfVFlQRSAoc3BlYykpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdGVzdF9maW5hbGl6ZSAoR3N0VGVzdCAqIHRlc3QpCit7CisgIGd1aW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IFRFU1RTX0NPVU5UOyBpKyspIHsKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmdGVzdC0+dmFsdWVzW2ldKTsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAoKEdPYmplY3QgKikgdGVzdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0c191bnNldCAoR3N0VGVzdCAqIHRlc3QpCit7CisgIGd1aW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IFRFU1RTX0NPVU5UOyBpKyspIHsKKyAgICBpZiAodGVzdC0+dGVzdHNbaV0pIHsKKyAgICAgIHRlc3RzW2ldLmZyZWUgKHRlc3QtPnRlc3RzW2ldKTsKKyAgICAgIHRlc3QtPnRlc3RzW2ldID0gTlVMTDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK3Rlc3RzX3NldCAoR3N0VGVzdCAqIHRlc3QpCit7CisgIGd1aW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IFRFU1RTX0NPVU5UOyBpKyspIHsKKyAgICBnX2Fzc2VydCAodGVzdC0+dGVzdHNbaV0gPT0gTlVMTCk7CisgICAgdGVzdC0+dGVzdHNbaV0gPSB0ZXN0c1tpXS5uZXcgKCZ0ZXN0c1tpXSk7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdGVzdF9zaW5rX2V2ZW50IChHc3RCYXNlU2luayAqIGJhc2VzaW5rLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RUZXN0Q2xhc3MgKmtsYXNzID0gR1NUX1RFU1RfR0VUX0NMQVNTIChiYXNlc2luayk7CisgIEdzdFRlc3QgKnRlc3QgPSBHU1RfVEVTVCAoYmFzZXNpbmspOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworLyoKKyAgICBjYXNlIEdTVF9FVkVOVF9ORVdTRUdNRU5UOgorICAgICAgaWYgKEdTVF9FVkVOVF9ESVNDT05UX05FV19NRURJQSAoZXZlbnQpKSB7CisgICAgICAgIHRlc3RzX3Vuc2V0ICh0ZXN0KTsKKyAgICAgICAgdGVzdHNfc2V0ICh0ZXN0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworKi8KKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6eworICAgICAgZ2ludCBpOworCisgICAgICBnX29iamVjdF9mcmVlemVfbm90aWZ5IChHX09CSkVDVCAodGVzdCkpOworICAgICAgZm9yIChpID0gMDsgaSA8IFRFU1RTX0NPVU5UOyBpKyspIHsKKyAgICAgICAgaWYgKHRlc3QtPnRlc3RzW2ldKSB7CisgICAgICAgICAgaWYgKCF0ZXN0c1tpXS5maW5pc2ggKHRlc3QtPnRlc3RzW2ldLCAmdGVzdC0+dmFsdWVzW2ldKSkgeworICAgICAgICAgICAgR1ZhbHVlIHYgPSB7IDAsIH07CisgICAgICAgICAgICBnY2hhciAqcmVhbCwgKmV4cGVjdGVkOworCisgICAgICAgICAgICBleHBlY3RlZCA9IGdzdF92YWx1ZV9zZXJpYWxpemUgKCZ0ZXN0LT52YWx1ZXNbaV0pOworICAgICAgICAgICAgZ192YWx1ZV9pbml0ICgmdiwgR19WQUxVRV9UWVBFICgmdGVzdC0+dmFsdWVzW2ldKSk7CisgICAgICAgICAgICBnX29iamVjdF9nZXRfcHJvcGVydHkgKEdfT0JKRUNUICh0ZXN0KSwga2xhc3MtPnBhcmFtX25hbWVzWzIgKiBpXSwKKyAgICAgICAgICAgICAgICAmdik7CisgICAgICAgICAgICByZWFsID0gZ3N0X3ZhbHVlX3NlcmlhbGl6ZSAoJnYpOworICAgICAgICAgICAgZ192YWx1ZV91bnNldCAoJnYpOworICAgICAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHRlc3QsIFNUUkVBTSwgRk9STUFULCAoTlVMTCksCisgICAgICAgICAgICAgICAgKCJ0ZXN0ICVzIHJldHVybmVkIHZhbHVlIFwiJXNcIiBhbmQgbm90IGV4cGVjdGVkIHZhbHVlIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgIGtsYXNzLT5wYXJhbV9uYW1lc1syICogaV0sIHJlYWwsIGV4cGVjdGVkKSk7CisgICAgICAgICAgICBnX2ZyZWUgKHJlYWwpOworICAgICAgICAgICAgZ19mcmVlIChleHBlY3RlZCk7CisgICAgICAgICAgfQorICAgICAgICAgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKHRlc3QpLCBrbGFzcy0+cGFyYW1fbmFtZXNbMiAqIGldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZ19vYmplY3RfdGhhd19ub3RpZnkgKEdfT0JKRUNUICh0ZXN0KSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIEdTVF9CQVNFX1NJTktfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmV2ZW50IChiYXNlc2luaywgZXZlbnQpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3Rlc3RfcmVuZGVyX2J1ZmZlciAoR3N0QmFzZVNpbmsgKiBiYXNlc2luaywgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RUZXN0ICp0ZXN0ID0gR1NUX1RFU1QgKGJhc2VzaW5rKTsKKyAgZ3VpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgVEVTVFNfQ09VTlQ7IGkrKykgeworICAgIGlmICh0ZXN0LT50ZXN0c1tpXSkgeworICAgICAgdGVzdHNbaV0uYWRkICh0ZXN0LT50ZXN0c1tpXSwgYnVmKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF90ZXN0X3N0YXJ0IChHc3RCYXNlU2luayAqIHNpbmspCit7CisgIEdzdFRlc3QgKnRlc3QgPSBHU1RfVEVTVCAoc2luayk7CisKKyAgdGVzdHNfc2V0ICh0ZXN0KTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Rlc3Rfc3RvcCAoR3N0QmFzZVNpbmsgKiBzaW5rKQoreworICBHc3RUZXN0ICp0ZXN0ID0gR1NUX1RFU1QgKHNpbmspOworCisgIHRlc3RzX3Vuc2V0ICh0ZXN0KTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdGVzdF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VGVzdCAqdGVzdCA9IEdTVF9URVNUIChvYmplY3QpOworCisgIGlmIChwcm9wX2lkID09IDAgfHwgcHJvcF9pZCA+IDIgKiBURVNUU19DT1VOVCkgeworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHByb3BfaWQgJSAyKSB7CisgICAgLyogcmVhbCB2YWx1ZXMgY2FuJ3QgYmUgc2V0ICovCisgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBleHBlY3RlZCB2YWx1ZXMgKi8KKyAgICBHU1RfT0JKRUNUX0xPQ0sgKHRlc3QpOworICAgIGdfdmFsdWVfY29weSAodmFsdWUsICZ0ZXN0LT52YWx1ZXNbcHJvcF9pZCAvIDIgLSAxXSk7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHRlc3QpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdGVzdF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VGVzdCAqdGVzdCA9IEdTVF9URVNUIChvYmplY3QpOworICBndWludCBpZCA9IChwcm9wX2lkIC0gMSkgLyAyOworCisgIGlmIChwcm9wX2lkID09IDAgfHwgcHJvcF9pZCA+IDIgKiBURVNUU19DT1VOVCkgeworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgcmV0dXJuOworICB9CisKKyAgR1NUX09CSkVDVF9MT0NLICh0ZXN0KTsKKworICBpZiAocHJvcF9pZCAlIDIpIHsKKyAgICAvKiByZWFsIHZhbHVlcyAqLworICAgIHRlc3RzW2lkXS5nZXRfdmFsdWUgKHRlc3QtPnRlc3RzW2lkXSwgdmFsdWUpOworICB9IGVsc2UgeworICAgIC8qIGV4cGVjdGVkIHZhbHVlcyAqLworICAgIGdfdmFsdWVfY29weSAoJnRlc3QtPnZhbHVlc1tpZF0sIHZhbHVlKTsKKyAgfQorCisgIEdTVF9PQkpFQ1RfVU5MT0NLICh0ZXN0KTsKK30KZGlmZiAtLWdpdCBhL2dzdC9kZWJ1Z3V0aWxzL3Rlc3RzLmMgYi9nc3QvZGVidWd1dGlscy90ZXN0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYTJhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVidWd1dGlscy90ZXN0cy5jCkBAIC0wLDAgKzEsMjY5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBCZW5qYW1pbiBPdHRlIDxvdHRlQGdub21lLm9yZz4KKyAqCisgKiBpbmNsdWRlcyBjb2RlIGJhc2VkIG9uIGdsaWJjIDIuMi4zJ3MgY3J5cHQvbWQ1LmMsCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInRlc3RzLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworCisvKgorICoqKiBMRU5HVEggKioqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ2ludDY0IHZhbHVlOworfQorTGVuZ3RoVGVzdDsKKworc3RhdGljIEdQYXJhbVNwZWMgKgorbGVuZ3RoX2dldF9zcGVjIChjb25zdCBHc3RUZXN0SW5mbyAqIGluZm8sIGdib29sZWFuIGNvbXBhcmVfdmFsdWUpCit7CisgIGlmIChjb21wYXJlX3ZhbHVlKSB7CisgICAgcmV0dXJuIGdfcGFyYW1fc3BlY19pbnQ2NCAoImV4cGVjdGVkLWxlbmd0aCIsICJleHBlY3RlZCBsZW5ndGgiLAorICAgICAgICAiZXhwZWN0ZWQgbGVuZ3RoIG9mIHN0cmVhbSIsIC0xLCBHX01BWElOVDY0LCAtMSwKKyAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGdfcGFyYW1fc3BlY19pbnQ2NCAoImxlbmd0aCIsICJsZW5ndGgiLCAibGVuZ3RoIG9mIHN0cmVhbSIsCisgICAgICAgIC0xLCBHX01BWElOVDY0LCAtMSwgR19QQVJBTV9SRUFEQUJMRSk7CisgIH0KK30KKworc3RhdGljIGdwb2ludGVyCitsZW5ndGhfbmV3IChjb25zdCBHc3RUZXN0SW5mbyAqIGluZm8pCit7CisgIHJldHVybiBnX25ldzAgKExlbmd0aFRlc3QsIDEpOworfQorCitzdGF0aWMgdm9pZAorbGVuZ3RoX2FkZCAoZ3BvaW50ZXIgdGVzdCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBMZW5ndGhUZXN0ICp0ID0gdGVzdDsKKworICB0LT52YWx1ZSArPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2xlbmd0aF9maW5pc2ggKGdwb2ludGVyIHRlc3QsIEdWYWx1ZSAqIHZhbHVlKQoreworICBMZW5ndGhUZXN0ICp0ID0gdGVzdDsKKworICBpZiAoZ192YWx1ZV9nZXRfaW50NjQgKHZhbHVlKSA9PSAtMSkKKyAgICByZXR1cm4gVFJVRTsKKworICByZXR1cm4gdC0+dmFsdWUgPT0gZ192YWx1ZV9nZXRfaW50NjQgKHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQKK2xlbmd0aF9nZXRfdmFsdWUgKGdwb2ludGVyIHRlc3QsIEdWYWx1ZSAqIHZhbHVlKQoreworICBMZW5ndGhUZXN0ICp0ID0gdGVzdDsKKworICBnX3ZhbHVlX3NldF9pbnQ2NCAodmFsdWUsIHQgPyB0LT52YWx1ZSA6IC0xKTsKK30KKworLyoKKyAqKiogQlVGRkVSIENPVU5UICoqKgorICovCisKK3N0YXRpYyBHUGFyYW1TcGVjICoKK2J1ZmZlcl9jb3VudF9nZXRfc3BlYyAoY29uc3QgR3N0VGVzdEluZm8gKiBpbmZvLCBnYm9vbGVhbiBjb21wYXJlX3ZhbHVlKQoreworICBpZiAoY29tcGFyZV92YWx1ZSkgeworICAgIHJldHVybiBnX3BhcmFtX3NwZWNfaW50NjQgKCJleHBlY3RlZC1idWZmZXItY291bnQiLCAiZXhwZWN0ZWQgYnVmZmVyIGNvdW50IiwKKyAgICAgICAgImV4cGVjdGVkIG51bWJlciBvZiBidWZmZXJzIGluIHN0cmVhbSIsCisgICAgICAgIC0xLCBHX01BWElOVDY0LCAtMSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGdfcGFyYW1fc3BlY19pbnQ2NCAoImJ1ZmZlci1jb3VudCIsICJidWZmZXIgY291bnQiLAorICAgICAgICAibnVtYmVyIG9mIGJ1ZmZlcnMgaW4gc3RyZWFtIiwgLTEsIEdfTUFYSU5UNjQsIC0xLCBHX1BBUkFNX1JFQURBQkxFKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorYnVmZmVyX2NvdW50X2FkZCAoZ3BvaW50ZXIgdGVzdCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBMZW5ndGhUZXN0ICp0ID0gdGVzdDsKKworICB0LT52YWx1ZSsrOworfQorCisvKgorICoqKiBUSU1FU1RBTVAgLyBEVVJBVElPTiBNQVRDSElORyAqKioKKyAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBndWludDY0IGRpZmY7CisgIGd1aW50IGNvdW50OworICBHc3RDbG9ja1RpbWUgZXhwZWN0ZWQ7Cit9CitUaW1lRHVyVGVzdDsKKworc3RhdGljIEdQYXJhbVNwZWMgKgordGltZWR1cl9nZXRfc3BlYyAoY29uc3QgR3N0VGVzdEluZm8gKiBpbmZvLCBnYm9vbGVhbiBjb21wYXJlX3ZhbHVlKQoreworICBpZiAoY29tcGFyZV92YWx1ZSkgeworICAgIHJldHVybiBnX3BhcmFtX3NwZWNfaW50NjQgKCJhbGxvd2VkLXRpbWVzdGFtcC1kZXZpYXRpb24iLAorICAgICAgICAiYWxsb3dlZCB0aW1lc3RhbXAgZGV2aWF0aW9uIiwKKyAgICAgICAgImFsbG93ZWQgYXZlcmFnZSBkaWZmZXJlbmNlIGluIHVzZWMgYmV0d2VlbiB0aW1lc3RhbXAgb2YgbmV4dCBidWZmZXIgIgorICAgICAgICAiYW5kIGV4cGVjdGVkIHRpbWVzdGFtcCBmcm9tIGFuYWx5emluZyBsYXN0IGJ1ZmZlciIsCisgICAgICAgIC0xLCBHX01BWElOVDY0LCAtMSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGdfcGFyYW1fc3BlY19pbnQ2NCAoInRpbWVzdGFtcC1kZXZpYXRpb24iLAorICAgICAgICAidGltZXN0YW1wIGRldmlhdGlvbiIsCisgICAgICAgICJhdmVyYWdlIGRpZmZlcmVuY2UgaW4gdXNlYyBiZXR3ZWVuIHRpbWVzdGFtcCBvZiBuZXh0IGJ1ZmZlciAiCisgICAgICAgICJhbmQgZXhwZWN0ZWQgdGltZXN0YW1wIGZyb20gYW5hbHl6aW5nIGxhc3QgYnVmZmVyIiwKKyAgICAgICAgLTEsIEdfTUFYSU5UNjQsIC0xLCBHX1BBUkFNX1JFQURBQkxFKTsKKyAgfQorfQorCitzdGF0aWMgZ3BvaW50ZXIKK3RpbWVkdXJfbmV3IChjb25zdCBHc3RUZXN0SW5mbyAqIGluZm8pCit7CisgIFRpbWVEdXJUZXN0ICpyZXQgPSBnX25ldzAgKFRpbWVEdXJUZXN0LCAxKTsKKworICByZXQtPmV4cGVjdGVkID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAordGltZWR1cl9hZGQgKGdwb2ludGVyIHRlc3QsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgVGltZUR1clRlc3QgKnQgPSB0ZXN0OworCisgIGlmIChHU1RfQlVGRkVSX1RJTUVTVEFNUF9JU19WQUxJRCAoYnVmZmVyKSAmJgorICAgICAgR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHQtPmV4cGVjdGVkKSkgeworICAgIHQtPmRpZmYgKz0KKyAgICAgICAgQUJTIChHU1RfQ0xPQ0tfRElGRiAodC0+ZXhwZWN0ZWQsIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpKSk7CisgICAgdC0+Y291bnQrKzsKKyAgfQorICBpZiAoR1NUX0JVRkZFUl9USU1FU1RBTVBfSVNfVkFMSUQgKGJ1ZmZlcikgJiYKKyAgICAgIEdTVF9CVUZGRVJfRFVSQVRJT05fSVNfVkFMSUQgKGJ1ZmZlcikpIHsKKyAgICB0LT5leHBlY3RlZCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpICsgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKTsKKyAgfSBlbHNlIHsKKyAgICB0LT5leHBlY3RlZCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCit0aW1lZHVyX2ZpbmlzaCAoZ3BvaW50ZXIgdGVzdCwgR1ZhbHVlICogdmFsdWUpCit7CisgIFRpbWVEdXJUZXN0ICp0ID0gdGVzdDsKKworICBpZiAoZ192YWx1ZV9nZXRfaW50NjQgKHZhbHVlKSA9PSAtMSkKKyAgICByZXR1cm4gVFJVRTsKKworICByZXR1cm4gKHQtPmRpZmYgLyBNQVggKDEsIHQtPmNvdW50KSkgPD0gZ192YWx1ZV9nZXRfaW50NjQgKHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQKK3RpbWVkdXJfZ2V0X3ZhbHVlIChncG9pbnRlciB0ZXN0LCBHVmFsdWUgKiB2YWx1ZSkKK3sKKyAgVGltZUR1clRlc3QgKnQgPSB0ZXN0OworCisgIGdfdmFsdWVfc2V0X2ludDY0ICh2YWx1ZSwgdCA/ICh0LT5kaWZmIC8gTUFYICgxLCB0LT5jb3VudCkpIDogLTEpOworfQorCisvKgorICoqKiBNRDUgKioqCisgKi8KKworc3RhdGljIEdQYXJhbVNwZWMgKgorbWQ1X2dldF9zcGVjIChjb25zdCBHc3RUZXN0SW5mbyAqIGluZm8sIGdib29sZWFuIGNvbXBhcmVfdmFsdWUpCit7CisgIGlmIChjb21wYXJlX3ZhbHVlKSB7CisgICAgcmV0dXJuIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJleHBlY3RlZC1tZDUiLCAiZXhwZWN0ZWQgbWQ1IiwKKyAgICAgICAgImV4cGVjdGVkIG1kNSBvZiBwcm9jZXNzaW5nIHRoZSB3aG9sZSBkYXRhIiwKKyAgICAgICAgIi0tLSIsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QpOworICB9IGVsc2UgeworICAgIHJldHVybiBnX3BhcmFtX3NwZWNfc3RyaW5nICgibWQ1IiwgIm1kNSIsCisgICAgICAgICJtZDUgb2YgcHJvY2Vzc2luZyB0aGUgd2hvbGUgZGF0YSIsICItLS0iLCBHX1BBUkFNX1JFQURBQkxFKTsKKyAgfQorfQorCitzdGF0aWMgZ3BvaW50ZXIKK21kNV9uZXcgKGNvbnN0IEdzdFRlc3RJbmZvICogaW5mbykKK3sKKyAgcmV0dXJuIGdfY2hlY2tzdW1fbmV3IChHX0NIRUNLU1VNX01ENSk7Cit9CisKK3N0YXRpYyB2b2lkCittZDVfYWRkIChncG9pbnRlciBjaGVja3N1bSwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RNYXBJbmZvIG1hcDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBnX2NoZWNrc3VtX3VwZGF0ZSAoY2hlY2tzdW0sIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorbWQ1X2ZpbmlzaCAoZ3BvaW50ZXIgY2hlY2tzdW0sIEdWYWx1ZSAqIHZhbHVlKQoreworICBjb25zdCBnY2hhciAqZXhwZWN0ZWQsICpyZXN1bHQ7CisKKyAgZXhwZWN0ZWQgPSBnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKTsKKyAgcmVzdWx0ID0gZ19jaGVja3N1bV9nZXRfc3RyaW5nIChjaGVja3N1bSk7CisKKyAgaWYgKGdfc3RyX2VxdWFsIChleHBlY3RlZCwgIi0tLSIpKQorICAgIHJldHVybiBUUlVFOworICBpZiAoZ19zdHJfZXF1YWwgKGV4cGVjdGVkLCByZXN1bHQpKQorICAgIHJldHVybiBUUlVFOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCittZDVfZ2V0X3ZhbHVlIChncG9pbnRlciBjaGVja3N1bSwgR1ZhbHVlICogdmFsdWUpCit7CisgIGlmICghY2hlY2tzdW0pIHsKKyAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCAiLS0tIik7CisgIH0gZWxzZSB7CisgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgZ19jaGVja3N1bV9nZXRfc3RyaW5nIChjaGVja3N1bSkpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCittZDVfZnJlZSAoZ3BvaW50ZXIgY2hlY2tzdW0pCit7CisgIGdfY2hlY2tzdW1fZnJlZSAoY2hlY2tzdW0pOworfQorCisvKgorICoqKiBURVNUSU5GTyAqKioKKyAqLworCitjb25zdCBHc3RUZXN0SW5mbyB0ZXN0c1tdID0geworICB7bGVuZ3RoX2dldF9zcGVjLCBsZW5ndGhfbmV3LCBsZW5ndGhfYWRkLAorICAgICAgbGVuZ3RoX2ZpbmlzaCwgbGVuZ3RoX2dldF92YWx1ZSwgZ19mcmVlfSwKKyAge2J1ZmZlcl9jb3VudF9nZXRfc3BlYywgbGVuZ3RoX25ldywgYnVmZmVyX2NvdW50X2FkZCwKKyAgICAgIGxlbmd0aF9maW5pc2gsIGxlbmd0aF9nZXRfdmFsdWUsIGdfZnJlZX0sCisgIHt0aW1lZHVyX2dldF9zcGVjLCB0aW1lZHVyX25ldywgdGltZWR1cl9hZGQsCisgICAgICB0aW1lZHVyX2ZpbmlzaCwgdGltZWR1cl9nZXRfdmFsdWUsIGdfZnJlZX0sCisgIHttZDVfZ2V0X3NwZWMsIG1kNV9uZXcsIG1kNV9hZGQsCisgICAgICBtZDVfZmluaXNoLCBtZDVfZ2V0X3ZhbHVlLCBtZDVfZnJlZX0KK307CmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy90ZXN0cy5oIGIvZ3N0L2RlYnVndXRpbHMvdGVzdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGZhMDg4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlYnVndXRpbHMvdGVzdHMuaApAQCAtMCwwICsxLDQzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBCZW5qYW1pbiBPdHRlIDxvdHRlQGdub21lLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisjaWZuZGVmIF9fR1NUX1RFU1RTX0hfXworI2RlZmluZSBfX0dTVF9URVNUU19IX18KKworCit0eXBlZGVmIHN0cnVjdCBfR3N0VGVzdEluZm8gR3N0VGVzdEluZm87CisKK3N0cnVjdCBfR3N0VGVzdEluZm8KK3sKKyAgR1BhcmFtU3BlYyAqKCpnZXRfc3BlYykgKGNvbnN0IEdzdFRlc3RJbmZvICogaW5mbywgZ2Jvb2xlYW4gY29tcGFyZV92YWx1ZSk7CisgICAgZ3BvaW50ZXIgKCpuZXcpIChjb25zdCBHc3RUZXN0SW5mbyAqIGluZm8pOworICB2b2lkICgqYWRkKSAoZ3BvaW50ZXIgdGVzdCwgR3N0QnVmZmVyICogYnVmZmVyKTsKKyAgICBnYm9vbGVhbiAoKmZpbmlzaCkgKGdwb2ludGVyIHRlc3QsIEdWYWx1ZSAqIHZhbHVlKTsKKyAgdm9pZCAoKmdldF92YWx1ZSkgKGdwb2ludGVyIHRlc3QsIEdWYWx1ZSAqIHZhbHVlKTsKKyAgdm9pZCAoKmZyZWUpIChncG9pbnRlciB0ZXN0KTsKK307CisKK2V4dGVybiBjb25zdCBHc3RUZXN0SW5mbyB0ZXN0c1tdOworLyoga2VlcCB1cCB0byBkYXRlISAqLworI2RlZmluZSBURVNUU19DT1VOVCAoNCkKKworCisjZW5kaWYgLyogX19HU1RfVEVTVFNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUuYW0gYi9nc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFlN2VkOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDUyIEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RkZWludGVybGFjZS5sYQorCitPUkNfU09VUkNFPXR2dGltZQoraW5jbHVkZSAkKHRvcF9zcmNkaXIpL2NvbW1vbi9vcmMubWFrCisKK2xpYmdzdGRlaW50ZXJsYWNlX2xhX1NPVVJDRVMgPSBcCisJZ3N0ZGVpbnRlcmxhY2UuYyBcCisJZ3N0ZGVpbnRlcmxhY2VtZXRob2QuYyBcCisJdHZ0aW1lL3RvbXNtb2NvbXAuYyBcCisJdHZ0aW1lL2dyZWVkeS5jIFwKKwl0dnRpbWUvZ3JlZWR5aC5jIFwKKwl0dnRpbWUvdmZpci5jIFwKKwl0dnRpbWUvd2VhdmV0ZmYuYyBcCisJdHZ0aW1lL3dlYXZlYmZmLmMgXAorCXR2dGltZS93ZWF2ZS5jIFwKKwl0dnRpbWUvbGluZWFyLmMgXAorCXR2dGltZS9saW5lYXJibGVuZC5jIFwKKwl0dnRpbWUvc2NhbGVyYm9iLmMKK25vZGlzdF9saWJnc3RkZWludGVybGFjZV9sYV9TT1VSQ0VTID0gJChPUkNfTk9ESVNUX1NPVVJDRVMpCisKK2xpYmdzdGRlaW50ZXJsYWNlX2xhX0NGTEFHUyA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKE9SQ19DRkxBR1MpCitsaWJnc3RkZWludGVybGFjZV9sYV9MSUJBREQgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0dmlkZW8tJChHU1RfQVBJX1ZFUlNJT04pICQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykgJChPUkNfTElCUykKK2xpYmdzdGRlaW50ZXJsYWNlX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBcCisJZ3N0ZGVpbnRlcmxhY2UuaCBcCisJZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaCBcCisJdHZ0aW1lL21teC5oIFwKKwl0dnRpbWUvc3NlLmggXAorCXR2dGltZS9ncmVlZHloLmFzbSBcCisJdHZ0aW1lL2dyZWVkeWhtYWNyb3MuaCBcCisJdHZ0aW1lL3BsdWdpbnMuaCBcCisJdHZ0aW1lL3g4Ni02NF9tYWNyb3MuaW5jIFwKKwl0dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wMEEuaW5jIFwKKwl0dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wQm90dG9tLmluYyBcCisJdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcEVkZ2VBOC5pbmMgXAorCXR2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BFZGdlQS5pbmMgXAorCXR2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBMi5pbmMgXAorCXR2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBNi5pbmMgXAorCXR2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBSDIuaW5jIFwKKwl0dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wT2RkQUguaW5jIFwKKwl0dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wT2RkQS5pbmMgXAorCXR2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BUb3AuaW5jIFwKKwl0dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wVkFILmluYyBcCisJdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFZBLmluYyBcCisJdHZ0aW1lL3RvbXNtb2NvbXAvU3RyYW5nZUJvYi5pbmMgXAorCXR2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwyLmluYyBcCisJdHZ0aW1lL3RvbXNtb2NvbXAvVG9tc01vQ29tcEFsbC5pbmMgXAorCXR2dGltZS90b21zbW9jb21wL3RvbXNtb2NvbXBtYWNyb3MuaCBcCisJdHZ0aW1lL3RvbXNtb2NvbXAvV2llcmRCb2IuaW5jCmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYyBiL2dzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MmExYzQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYwpAQCAtMCwwICsxLDMxNDQgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNYXJ0aW4gRWlrZXJtYW5uIDxtZWlrZXJAdXBiLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSAyMDExIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1kZWludGVybGFjZQorICoKKyAqIGRlaW50ZXJsYWNlIGRlaW50ZXJsYWNlcyBpbnRlcmxhY2VkIHZpZGVvIGZyYW1lcyB0byBwcm9ncmVzc2l2ZSB2aWRlbyBmcmFtZXMuCisgKiBGb3IgdGhpcyBkaWZmZXJlbnQgYWxnb3JpdGhtcyBjYW4gYmUgc2VsZWN0ZWQgd2hpY2ggd2lsbCBiZSBkZXNjcmliZWQgbGF0ZXIuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGZpbGVzcmMgbG9jYXRpb249L3BhdGgvdG8vZmlsZSAhIGRlY29kZWJpbiAhIHZpZGVvY29udmVydCAhIGRlaW50ZXJsYWNlICEgdmlkZW9jb252ZXJ0ICEgYXV0b3ZpZGVvc2luaworICogXXwgVGhpcyBwaXBlbGluZSBkZWludGVybGFjZXMgYSB2aWRlbyBmaWxlIHdpdGggdGhlIGRlZmF1bHQgZGVpbnRlcmxhY2luZyBvcHRpb25zLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RkZWludGVybGFjZS5oIgorI2luY2x1ZGUgInR2dGltZS9wbHVnaW5zLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmIEhBVkVfT1JDCisjaW5jbHVkZSA8b3JjL29yYy5oPgorI2VuZGlmCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGRlaW50ZXJsYWNlX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChkZWludGVybGFjZV9kZWJ1ZykKKworLyogUHJvcGVydGllcyAqLworCisjZGVmaW5lIERFRkFVTFRfTU9ERSAgICAgICAgICAgIEdTVF9ERUlOVEVSTEFDRV9NT0RFX0FVVE8KKyNkZWZpbmUgREVGQVVMVF9NRVRIT0QgICAgICAgICAgR1NUX0RFSU5URVJMQUNFX0xJTkVBUgorI2RlZmluZSBERUZBVUxUX0ZJRUxEUyAgICAgICAgICBHU1RfREVJTlRFUkxBQ0VfQUxMCisjZGVmaW5lIERFRkFVTFRfRklFTERfTEFZT1VUICAgIEdTVF9ERUlOVEVSTEFDRV9MQVlPVVRfQVVUTworI2RlZmluZSBERUZBVUxUX0xPQ0tJTkcgICAgICAgICBHU1RfREVJTlRFUkxBQ0VfTE9DS0lOR19OT05FCisjZGVmaW5lIERFRkFVTFRfSUdOT1JFX09CU0NVUkUgIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9EUk9QX09SUEhBTlMgICAgVFJVRQorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9NT0RFLAorICBQUk9QX01FVEhPRCwKKyAgUFJPUF9GSUVMRFMsCisgIFBST1BfRklFTERfTEFZT1VULAorICBQUk9QX0xPQ0tJTkcsCisgIFBST1BfSUdOT1JFX09CU0NVUkUsCisgIFBST1BfRFJPUF9PUlBIQU5TCit9OworCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfUCAgICAoMTw8MCkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX0JVRkZFUl9TVEFURV9JICAgICgxPDwxKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfQlVGRkVSX1NUQVRFX1RDX0IgKDE8PDIpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfVENfVCAoMTw8MykKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX0JVRkZFUl9TVEFURV9UQ19QICgxPDw0KQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfQlVGRkVSX1NUQVRFX1RDX00gKDE8PDUpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfUkZGICAoMTw8NikKKworI2RlZmluZSBHU1RfT05FIFwKKyAgKEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfVENfVCB8IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfVENfQikKKyNkZWZpbmUgR1NUX1BSRyBcCisgIChHU1RfREVJTlRFUkxBQ0VfQlVGRkVSX1NUQVRFX1AgfCBHU1RfREVJTlRFUkxBQ0VfQlVGRkVSX1NUQVRFX1RDX1ApCisjZGVmaW5lIEdTVF9JTlQgXAorICAoR1NUX0RFSU5URVJMQUNFX0JVRkZFUl9TVEFURV9JIHwgR1NUX0RFSU5URVJMQUNFX0JVRkZFUl9TVEFURV9UQ19NKQorI2RlZmluZSBHU1RfUkZGIChHU1RfREVJTlRFUkxBQ0VfQlVGRkVSX1NUQVRFX1JGRikKKworI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfT0JTQ1VSRV9USFJFU0hPTEQgNQorCitzdGF0aWMgY29uc3QgVGVsZWNpbmVQYXR0ZXJuIHRlbGVjaW5lX3BhdHRlcm5zW10gPSB7CisgIC8qIDYwaSAtPiA2MHAgb3IgNTBpIC0+IDUwcCAoTk9URSBUSEUgV0VJUkQgUkFUSU9TKSAqLworICB7IjE6MSIsIDEsIDIsIDEsIHtHU1RfT05FLH19LAorICAvKiA2MGkgLT4gMzBwIG9yIDUwaSAtPiAyNXAgKi8KKyAgeyIyOjIiLCAxLCAxLCAxLCB7R1NUX0lOVCx9fSwKKyAgLyogNjBpIHRlbGVjaW5lIC0+IDI0cCAqLworICB7IjI6My1SRkYiLCA0LCA0LCA1LCB7R1NUX1BSRywgR1NUX1JGRiwgR1NUX1BSRywgR1NUX1JGRix9fSwKKyAgeyIyOjMiLCA1LCA0LCA1LCB7R1NUX1BSRywgR1NUX1BSRywgR1NUX09ORSwgR1NUX09ORSwgR1NUX1BSRyx9fSwKKyAgeyIzOjI6MjozLVJGRiIsIDQsIDQsIDUsIHtHU1RfUkZGLCBHU1RfUFJHLCBHU1RfUFJHLCBHU1RfUkZGLH19LAorICB7IjM6MjoyOjMiLCA1LCA0LCA1LCB7R1NUX1BSRywgR1NUX09ORSwgR1NUX0lOVCwgR1NUX09ORSwgR1NUX1BSRyx9fSwKKyAgLyogZmllbGRhbmFseXNpcyBzaG91bGQgaW5kaWNhdGUgdGhpcyB1c2luZyBSRkYgb24gdGhlIHNlY29uZCBhbmQgZm91cnRoCisgICAqIGJ1ZmZlcnMgYW5kIG5vdCBzZW5kIHRoZSB0aGlyZCBidWZmZXIgYXQgYWxsLiBpdCB3aWxsIGJlIGlkZW50aWZpZWQgYXMKKyAgICogMzoyOjI6My1SRkYgKi8KKyAgLyogeyIyOjM6MzoyIiwgNSwgNCwgNSwge0dTVF9QUkcsIEdTVF9QUkcsIEdTVF9EUlAsIEdTVF9QUkcsIEdTVF9QUkcsfX0sICovCisKKyAgLyogVGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgb2JzY3VyZSBhbmQgYXJlIGlnbm9yZWQgaWYgaWdub3JlLW9ic2N1cmUgaXMKKyAgICogc2V0IHRvIHRydWUuIElmIGFueSBwYXR0ZXJucyBhcmUgYWRkZWQgYWJvdmUgdGhpcyBsaW5lLCBjaGVjayBhbmQgZWRpdAorICAgKiBHU1RfREVJTlRFUkxBQ0VfT0JTQ1VSRV9USFJFU0hPTEQgKi8KKworICAvKiA1MGkgRXVybyBwdWxsZG93biAtPiAyNHAgKi8KKyAgeyIyLTExOjMiLCAyNSwgMjQsIDI1LCB7R1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywKKyAgICAgICAgICAgICAgR1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywKKyAgICAgICAgICAgICAgR1NUX1BSRywgR1NUX1BSRywgR1NUX09ORSwgR1NUX0lOVCwgR1NUX0lOVCwKKyAgICAgICAgICAgICAgR1NUX0lOVCwgR1NUX0lOVCwgR1NUX0lOVCwgR1NUX0lOVCwgR1NUX0lOVCwKKyAgICAgICAgICBHU1RfSU5ULCBHU1RfSU5ULCBHU1RfSU5ULCBHU1RfT05FLCBHU1RfUFJHLH19LAorI2lmIDAKKyAgLyogaGF2ZW4ndCBmaWd1cmVkIG91dCBob3cgZmllbGRhbmFseXNpcyBzaG91bGQgaGFuZGxlIHRoZXNlIHlldCAqLworICAvKiA2MGkgKE5UU0MgMzAwMDAvMTAwMSkgLT4gMTZwICgxNjAwMC8xMDAxKSAqLworICB7IjM6NC0zIiwgMTUsIDgsIDE1LCB7R1NUX1BSRywgR1NUX0RSUCwgR1NUX1BSRywgR1NUX0RSUCwgR1NUX1BSRywKKyAgICAgICAgICAgICAgR1NUX0RSUCwgR1NUX1BSRywgR1NUX0RSUCwgR1NUX1BSRywgR1NUX0RSUCwKKyAgICAgICAgICBHU1RfUFJHLCBHU1RfRFJQLCBHU1RfUFJHLCBHU1RfRFJQLCBHU1RfUFJHLH19LAorICAvKiA1MGkgKFBBTCkgLT4gMTZwICovCisgIHsiMy03OjQiLCAyNSwgMTYsIDI1LCB7R1NUX1BSRywgR1NUX0RSUCwgR1NUX1BSRywgR1NUX1BSRywgR1NUX0RSUCwKKyAgICAgICAgICAgICAgR1NUX1BSRywgR1NUX1BSRywgR1NUX0RSUCwgR1NUX1BSRywgR1NUX1BSRywKKyAgICAgICAgICAgICAgR1NUX0RSUCwgR1NUX1BSRywgR1NUX0RSUCwgR1NUX1BSRywgR1NUX1BSRywKKyAgICAgICAgICAgICAgR1NUX0RSUCwgR1NUX1BSRywgR1NUX1BSRywgR1NUX0RSUCwgR1NUX1BSRywKKyAgICAgICAgICBHU1RfUFJHLCBHU1RfRFJQLCBHU1RfUFJHLCBHU1RfUFJHLCBHU1RfRFJQLH19LAorICAvKiBOVFNDIDYwaSAtPiAxOHAgKi8KKyAgeyIzOjM6NCIsIDUsIDMsIDUsIHtHU1RfUFJHLCBHU1RfRFJQLCBHU1RfUFJHLCBHU1RfRFJQLCBHU1RfUFJHLH19LAorICAvKiBOVFNDIDYwaSAtPiAyMHAgKi8KKyAgeyIzOjMiLCAzLCAyLCAzLCB7R1NUX1BSRywgR1NUX0RSUCwgR1NUX1BSRyx9fSwKKyNlbmRpZgorICAvKiBOVFNDIDYwaSAtPiAyNy41ICovCisgIHsiMzoyLTQiLCAxMSwgMTAsIDExLCB7R1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywKKyAgICAgICAgICAgICAgR1NUX1BSRywgR1NUX09ORSwgR1NUX0lOVCwgR1NUX0lOVCwgR1NUX0lOVCwKKyAgICAgICAgICBHU1RfT05FLH19LAorICAvKiBQQUwgNTBpIC0+IDI3LjUgKi8KKyAgeyIxOjItNCIsIDksIDksIDEwLCB7R1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywgR1NUX0lOVCwKKyAgICAgICAgICBHU1RfSU5ULCBHU1RfSU5ULCBHU1RfSU5ULCBHU1RfSU5ULH19LAorfTsKKworc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgbWV0aG9kc190eXBlc1tdID0geworICB7R1NUX0RFSU5URVJMQUNFX1RPTVNNT0NPTVAsICJNb3Rpb24gQWRhcHRpdmU6IE1vdGlvbiBTZWFyY2giLAorICAgICAgInRvbXNtb2NvbXAifSwKKyAge0dTVF9ERUlOVEVSTEFDRV9HUkVFRFlfSCwgIk1vdGlvbiBBZGFwdGl2ZTogQWR2YW5jZWQgRGV0ZWN0aW9uIiwKKyAgICAgICJncmVlZHloIn0sCisgIHtHU1RfREVJTlRFUkxBQ0VfR1JFRURZX0wsICJNb3Rpb24gQWRhcHRpdmU6IFNpbXBsZSBEZXRlY3Rpb24iLCAiZ3JlZWR5bCJ9LAorICB7R1NUX0RFSU5URVJMQUNFX1ZGSVIsICJCbHVyIFZlcnRpY2FsIiwgInZmaXIifSwKKyAge0dTVF9ERUlOVEVSTEFDRV9MSU5FQVIsICJMaW5lYXIiLCAibGluZWFyIn0sCisgIHtHU1RfREVJTlRFUkxBQ0VfTElORUFSX0JMRU5ELCAiQmx1cjogVGVtcG9yYWwgKERvIE5vdCBVc2UpIiwKKyAgICAgICJsaW5lYXJibGVuZCJ9LAorICB7R1NUX0RFSU5URVJMQUNFX1NDQUxFUl9CT0IsICJEb3VibGUgbGluZXMiLCAic2NhbGVyYm9iIn0sCisgIHtHU1RfREVJTlRFUkxBQ0VfV0VBVkUsICJXZWF2ZSAoRG8gTm90IFVzZSkiLCAid2VhdmUifSwKKyAge0dTVF9ERUlOVEVSTEFDRV9XRUFWRV9URkYsICJQcm9ncmVzc2l2ZTogVG9wIEZpZWxkIEZpcnN0IChEbyBOb3QgVXNlKSIsCisgICAgICAid2VhdmV0ZmYifSwKKyAge0dTVF9ERUlOVEVSTEFDRV9XRUFWRV9CRkYsICJQcm9ncmVzc2l2ZTogQm90dG9tIEZpZWxkIEZpcnN0IChEbyBOb3QgVXNlKSIsCisgICAgICAid2VhdmViZmYifSwKKyAgezAsIE5VTEwsIE5VTEx9LAorfTsKKworc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgbG9ja2luZ190eXBlc1tdID0geworICB7R1NUX0RFSU5URVJMQUNFX0xPQ0tJTkdfTk9ORSwKKyAgICAgICJObyBwYXR0ZXJuIGxvY2tpbmciLCAibm9uZSJ9LAorICB7R1NUX0RFSU5URVJMQUNFX0xPQ0tJTkdfQVVUTywKKyAgICAgICAgIkNob29zZSBwYXNzaXZlL2FjdGl2ZSBsb2NraW5nIGRlcGVuZGluZyBvbiB3aGV0aGVyIHVwc3RyZWFtIGlzIGxpdmUiLAorICAgICAgImF1dG8ifSwKKyAge0dTVF9ERUlOVEVSTEFDRV9MT0NLSU5HX0FDVElWRSwKKyAgICAgICAgIkJsb2NrIHVudGlsIHBhdHRlcm4tbG9ja2VkLiBVc2UgYWNjdXJhdGUgdGltZXN0YW1wIGludGVycG9sYXRpb24gd2l0aGluIGEgcGF0dGVybiByZXBlYXQuIiwKKyAgICAgICJhY3RpdmUifSwKKyAge0dTVF9ERUlOVEVSTEFDRV9MT0NLSU5HX1BBU1NJVkUsCisgICAgICAgICJEbyBub3QgYmxvY2suIFVzZSBuYcOvdmUgdGltZXN0YW1wIGFkanVzdG1lbnQgdW50aWwgcGF0dGVybi1sb2NrZWQgYmFzZWQgb24gc3RhdGUgaGlzdG9yeS4iLAorICAgICAgInBhc3NpdmUifSwKKyAgezAsIE5VTEwsIE5VTEx9LAorfTsKKworCisjZGVmaW5lIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRFMgKGdzdF9kZWludGVybGFjZV9tZXRob2RzX2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kc19nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGRlaW50ZXJsYWNlX21ldGhvZHNfdHlwZSA9IDA7CisKKyAgaWYgKCFkZWludGVybGFjZV9tZXRob2RzX3R5cGUpIHsKKyAgICBkZWludGVybGFjZV9tZXRob2RzX3R5cGUgPQorICAgICAgICBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0RGVpbnRlcmxhY2VNZXRob2RzIiwgbWV0aG9kc190eXBlcyk7CisgIH0KKyAgcmV0dXJuIGRlaW50ZXJsYWNlX21ldGhvZHNfdHlwZTsKK30KKworI2RlZmluZSBHU1RfVFlQRV9ERUlOVEVSTEFDRV9GSUVMRFMgKGdzdF9kZWludGVybGFjZV9maWVsZHNfZ2V0X3R5cGUgKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9kZWludGVybGFjZV9maWVsZHNfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBkZWludGVybGFjZV9maWVsZHNfdHlwZSA9IDA7CisKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgZmllbGRzX3R5cGVzW10gPSB7CisgICAge0dTVF9ERUlOVEVSTEFDRV9BTEwsICJBbGwgZmllbGRzIiwgImFsbCJ9LAorICAgIHtHU1RfREVJTlRFUkxBQ0VfVEYsICJUb3AgZmllbGRzIG9ubHkiLCAidG9wIn0sCisgICAge0dTVF9ERUlOVEVSTEFDRV9CRiwgIkJvdHRvbSBmaWVsZHMgb25seSIsICJib3R0b20ifSwKKyAgICB7R1NUX0RFSU5URVJMQUNFX0ZJRUxEU19BVVRPLCAiQXV0b21hdGljYWxseSBkZXRlY3QiLCAiYXV0byJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIWRlaW50ZXJsYWNlX2ZpZWxkc190eXBlKSB7CisgICAgZGVpbnRlcmxhY2VfZmllbGRzX3R5cGUgPQorICAgICAgICBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0RGVpbnRlcmxhY2VGaWVsZHMiLCBmaWVsZHNfdHlwZXMpOworICB9CisgIHJldHVybiBkZWludGVybGFjZV9maWVsZHNfdHlwZTsKK30KKworI2RlZmluZSBHU1RfVFlQRV9ERUlOVEVSTEFDRV9GSUVMRF9MQVlPVVQgKGdzdF9kZWludGVybGFjZV9maWVsZF9sYXlvdXRfZ2V0X3R5cGUgKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9kZWludGVybGFjZV9maWVsZF9sYXlvdXRfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBkZWludGVybGFjZV9maWVsZF9sYXlvdXRfdHlwZSA9IDA7CisKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgZmllbGRfbGF5b3V0X3R5cGVzW10gPSB7CisgICAge0dTVF9ERUlOVEVSTEFDRV9MQVlPVVRfQVVUTywgIkF1dG8gZGV0ZWN0aW9uIiwgImF1dG8ifSwKKyAgICB7R1NUX0RFSU5URVJMQUNFX0xBWU9VVF9URkYsICJUb3AgZmllbGQgZmlyc3QiLCAidGZmIn0sCisgICAge0dTVF9ERUlOVEVSTEFDRV9MQVlPVVRfQkZGLCAiQm90dG9tIGZpZWxkIGZpcnN0IiwgImJmZiJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIWRlaW50ZXJsYWNlX2ZpZWxkX2xheW91dF90eXBlKSB7CisgICAgZGVpbnRlcmxhY2VfZmllbGRfbGF5b3V0X3R5cGUgPQorICAgICAgICBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0RGVpbnRlcmxhY2VGaWVsZExheW91dCIsCisgICAgICAgIGZpZWxkX2xheW91dF90eXBlcyk7CisgIH0KKyAgcmV0dXJuIGRlaW50ZXJsYWNlX2ZpZWxkX2xheW91dF90eXBlOworfQorCisjZGVmaW5lIEdTVF9UWVBFX0RFSU5URVJMQUNFX01PREVTIChnc3RfZGVpbnRlcmxhY2VfbW9kZXNfZ2V0X3R5cGUgKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9kZWludGVybGFjZV9tb2Rlc19nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGRlaW50ZXJsYWNlX21vZGVzX3R5cGUgPSAwOworCisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIG1vZGVzX3R5cGVzW10gPSB7CisgICAge0dTVF9ERUlOVEVSTEFDRV9NT0RFX0FVVE8sICJBdXRvIGRldGVjdGlvbiAoYmVzdCBlZmZvcnQpIiwgImF1dG8ifSwKKyAgICB7R1NUX0RFSU5URVJMQUNFX01PREVfSU5URVJMQUNFRCwgIkZvcmNlIGRlaW50ZXJsYWNpbmciLCAiaW50ZXJsYWNlZCJ9LAorICAgIHtHU1RfREVJTlRFUkxBQ0VfTU9ERV9ESVNBQkxFRCwgIlJ1biBpbiBwYXNzdGhyb3VnaCBtb2RlIiwgImRpc2FibGVkIn0sCisgICAge0dTVF9ERUlOVEVSTEFDRV9NT0RFX0FVVE9fU1RSSUNULCAiQXV0byBkZXRlY3Rpb24gKHN0cmljdCkiLAorICAgICAgICAiYXV0by1zdHJpY3QifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0sCisgIH07CisKKyAgaWYgKCFkZWludGVybGFjZV9tb2Rlc190eXBlKSB7CisgICAgZGVpbnRlcmxhY2VfbW9kZXNfdHlwZSA9CisgICAgICAgIGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3REZWludGVybGFjZU1vZGVzIiwgbW9kZXNfdHlwZXMpOworICB9CisgIHJldHVybiBkZWludGVybGFjZV9tb2Rlc190eXBlOworfQorCisjZGVmaW5lIEdTVF9UWVBFX0RFSU5URVJMQUNFX0xPQ0tJTkcgKGdzdF9kZWludGVybGFjZV9sb2NraW5nX2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3RfZGVpbnRlcmxhY2VfbG9ja2luZ19nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGRlaW50ZXJsYWNlX2xvY2tpbmdfdHlwZSA9IDA7CisKKyAgaWYgKCFkZWludGVybGFjZV9sb2NraW5nX3R5cGUpIHsKKyAgICBkZWludGVybGFjZV9sb2NraW5nX3R5cGUgPQorICAgICAgICBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0RGVpbnRlcmxhY2VMb2NraW5nIiwgbG9ja2luZ190eXBlcyk7CisgIH0KKworICByZXR1cm4gZGVpbnRlcmxhY2VfbG9ja2luZ190eXBlOworfQorCisjZGVmaW5lIERFSU5URVJMQUNFX1ZJREVPX0ZPUk1BVFMgXAorICAgICJ7IEFZVVYsIEFSR0IsIEFCR1IsIFJHQkEsIEJHUkEsIFk0NDQsIHhSR0IsIHhCR1IsIFJHQngsIEJHUngsIFJHQiwgIiBcCisgICAgIkJHUiwgWVVZMiwgWVZZVSwgVVlWWSwgWTQyQiwgSTQyMCwgWVYxMiwgWTQxQiwgTlYxMiwgTlYyMSB9IgorCisjZGVmaW5lIERFSU5URVJMQUNFX0NBUFMgR1NUX1ZJREVPX0NBUFNfTUFLRShERUlOVEVSTEFDRV9WSURFT19GT1JNQVRTKQorCisjZGVmaW5lIERFSU5URVJMQUNFX0FMTF9DQVBTIERFSU5URVJMQUNFX0NBUFMgIjsiIFwKKyAgICBHU1RfVklERU9fQ0FQU19NQUtFX1dJVEhfRkVBVFVSRVMgKCJBTlkiLCBHU1RfVklERU9fRk9STUFUU19BTEwpCisKK3N0YXRpYyBHc3RTdGF0aWNDYXBzIHByb2dyZXNzaXZlX2NhcHMgPQorR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1yYXcoQU5ZKSxpbnRlcmxhY2UtbW9kZT0oc3RyaW5nKXByb2dyZXNzaXZlIik7CitzdGF0aWMgR3N0U3RhdGljQ2FwcyBkZWludGVybGFjZV9jYXBzID0gR1NUX1NUQVRJQ19DQVBTIChERUlOVEVSTEFDRV9DQVBTKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbCA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKERFSU5URVJMQUNFX0FMTF9DQVBTKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChERUlOVEVSTEFDRV9BTExfQ0FQUykKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfZGVpbnRlcmxhY2VfZmluYWxpemUgKEdPYmplY3QgKiBzZWxmKTsKK3N0YXRpYyB2b2lkIGdzdF9kZWludGVybGFjZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBzZWxmLCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2RlaW50ZXJsYWNlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIHNlbGYsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBHc3RDYXBzICpnc3RfZGVpbnRlcmxhY2VfZ2V0Y2FwcyAoR3N0RGVpbnRlcmxhY2UgKiBzZWxmLCBHc3RQYWQgKiBwYWQsCisgICAgR3N0Q2FwcyAqIGZpbHRlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2RlaW50ZXJsYWNlX3NldGNhcHMgKEdzdERlaW50ZXJsYWNlICogc2VsZiwgR3N0UGFkICogcGFkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZGVpbnRlcmxhY2Vfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2RlaW50ZXJsYWNlX3NpbmtfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2RlaW50ZXJsYWNlX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9kZWludGVybGFjZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworc3RhdGljIGdib29sZWFuIGdzdF9kZWludGVybGFjZV9zZXRfYWxsb2NhdGlvbiAoR3N0RGVpbnRlcmxhY2UgKiBzZWxmLAorICAgIEdzdEJ1ZmZlclBvb2wgKiBwb29sLCBHc3RBbGxvY2F0b3IgKiBhbGxvY2F0b3IsCisgICAgR3N0QWxsb2NhdGlvblBhcmFtcyAqIHBhcmFtcyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZGVpbnRlcmxhY2Vfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZGVpbnRlcmxhY2Vfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2RlaW50ZXJsYWNlX291dHB1dF9mcmFtZSAoR3N0RGVpbnRlcmxhY2UgKiBzZWxmLAorICAgIGdib29sZWFuIGZsdXNoaW5nKTsKK3N0YXRpYyB2b2lkIGdzdF9kZWludGVybGFjZV9yZXNldCAoR3N0RGVpbnRlcmxhY2UgKiBzZWxmKTsKK3N0YXRpYyB2b2lkIGdzdF9kZWludGVybGFjZV91cGRhdGVfcW9zIChHc3REZWludGVybGFjZSAqIHNlbGYsCisgICAgZ2RvdWJsZSBwcm9wb3J0aW9uLCBHc3RDbG9ja1RpbWVEaWZmIGRpZmYsIEdzdENsb2NrVGltZSB0aW1lKTsKK3N0YXRpYyB2b2lkIGdzdF9kZWludGVybGFjZV9yZXNldF9xb3MgKEdzdERlaW50ZXJsYWNlICogc2VsZik7CitzdGF0aWMgdm9pZCBnc3RfZGVpbnRlcmxhY2VfcmVhZF9xb3MgKEdzdERlaW50ZXJsYWNlICogc2VsZiwKKyAgICBnZG91YmxlICogcHJvcG9ydGlvbiwgR3N0Q2xvY2tUaW1lICogdGltZSk7CisKKyNkZWZpbmUgSVNfVEVMRUNJTkUobSkgKChtKSA9PSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfTUlYRUQgJiYgc2VsZi0+cGF0dGVybiA+IDEpCisKKy8qIEZJWE1FOiB3aGF0J3MgdGhlIHBvaW50IG9mIHRoZSBjaGlsZHByb3h5IGludGVyZmFjZSBoZXJlPyBXaGF0IGNhbiB5b3UKKyAqIGFjdHVhbGx5IGRvIHdpdGggaXQ/IFRoZSBtZXRob2Qgb2JqZWN0cyBzZWVtIHRvIGhhdmUgbm8gcHJvcGVydGllcyAqLworI2lmIDAKK3N0YXRpYyB2b2lkIGdzdF9kZWludGVybGFjZV9jaGlsZF9wcm94eV9pbnRlcmZhY2VfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwKKyAgICBncG9pbnRlciBpZmFjZV9kYXRhKTsKKworc3RhdGljIHZvaWQKK19kb19pbml0IChHVHlwZSBvYmplY3RfdHlwZSkKK3sKKyAgY29uc3QgR0ludGVyZmFjZUluZm8gY2hpbGRfcHJveHlfaW50ZXJmYWNlX2luZm8gPSB7CisgICAgKEdJbnRlcmZhY2VJbml0RnVuYykgZ3N0X2RlaW50ZXJsYWNlX2NoaWxkX3Byb3h5X2ludGVyZmFjZV9pbml0LAorICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnRlcmZhY2VfZmluYWxpemUgKi8KKyAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50ZXJmYWNlX2RhdGEgKi8KKyAgfTsKKworICBnX3R5cGVfYWRkX2ludGVyZmFjZV9zdGF0aWMgKG9iamVjdF90eXBlLCBHU1RfVFlQRV9DSElMRF9QUk9YWSwKKyAgICAgICZjaGlsZF9wcm94eV9pbnRlcmZhY2VfaW5mbyk7Cit9CisjZW5kaWYKKworR19ERUZJTkVfVFlQRSAoR3N0RGVpbnRlcmxhY2UsIGdzdF9kZWludGVybGFjZSwgR1NUX1RZUEVfRUxFTUVOVCk7CisKKyNkZWZpbmUgcGFyZW50X2NsYXNzIGdzdF9kZWludGVybGFjZV9wYXJlbnRfY2xhc3MKKworc3RhdGljIGNvbnN0IHN0cnVjdAoreworICBHVHlwZSAoKmdldF90eXBlKSAodm9pZCk7Cit9IF9tZXRob2RfdHlwZXNbXSA9IHsKKyAgeworICBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3RvbXNtb2NvbXBfZ2V0X3R5cGV9LCB7CisgIGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2hfZ2V0X3R5cGV9LCB7CisgIGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2xfZ2V0X3R5cGV9LCB7CisgIGdzdF9kZWludGVybGFjZV9tZXRob2RfdmZpcl9nZXRfdHlwZX0sIHsKKyAgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9saW5lYXJfZ2V0X3R5cGV9LCB7CisgIGdzdF9kZWludGVybGFjZV9tZXRob2RfbGluZWFyX2JsZW5kX2dldF90eXBlfSwgeworICBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3NjYWxlcl9ib2JfZ2V0X3R5cGV9LCB7CisgIGdzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfZ2V0X3R5cGV9LCB7CisgIGdzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfdGZmX2dldF90eXBlfSwgeworICBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3dlYXZlX2JmZl9nZXRfdHlwZX0KK307CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2Vfc2V0X21ldGhvZCAoR3N0RGVpbnRlcmxhY2UgKiBzZWxmLCBHc3REZWludGVybGFjZU1ldGhvZHMgbWV0aG9kKQoreworICBHVHlwZSBtZXRob2RfdHlwZTsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBHc3RWaWRlb0Zvcm1hdCBmb3JtYXQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlNldHRpbmcgbmV3IG1ldGhvZCAlZCIsIG1ldGhvZCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fSU5GT19XSURUSCAoJnNlbGYtPnZpbmZvKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUICgmc2VsZi0+dmluZm8pOworICBmb3JtYXQgPSBHU1RfVklERU9fSU5GT19GT1JNQVQgKCZzZWxmLT52aW5mbyk7CisKKyAgaWYgKHNlbGYtPm1ldGhvZCkgeworICAgIGlmIChzZWxmLT5tZXRob2RfaWQgPT0gbWV0aG9kICYmCisgICAgICAgIGdzdF9kZWludGVybGFjZV9tZXRob2Rfc3VwcG9ydGVkIChHX1RZUEVfRlJPTV9JTlNUQU5DRSAoc2VsZi0+bWV0aG9kKSwKKyAgICAgICAgICAgIGZvcm1hdCwgd2lkdGgsIGhlaWdodCkpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJSZXVzaW5nIGN1cnJlbnQgbWV0aG9kIik7CisgICAgICByZXR1cm47CisgICAgfQorI2lmIDAKKyAgICBnc3RfY2hpbGRfcHJveHlfY2hpbGRfcmVtb3ZlZCAoR1NUX09CSkVDVCAoc2VsZiksCisgICAgICAgIEdTVF9PQkpFQ1QgKHNlbGYtPm1ldGhvZCkpOworICAgIGdzdF9vYmplY3RfdW5wYXJlbnQgKEdTVF9PQkpFQ1QgKHNlbGYtPm1ldGhvZCkpOworICAgIHNlbGYtPm1ldGhvZCA9IE5VTEw7CisjZW5kaWYKKyAgfQorCisgIG1ldGhvZF90eXBlID0KKyAgICAgIF9tZXRob2RfdHlwZXNbbWV0aG9kXS5nZXRfdHlwZSAhPQorICAgICAgTlVMTCA/IF9tZXRob2RfdHlwZXNbbWV0aG9kXS5nZXRfdHlwZSAoKSA6IEdfVFlQRV9JTlZBTElEOworICBpZiAobWV0aG9kX3R5cGUgPT0gR19UWVBFX0lOVkFMSUQKKyAgICAgIHx8ICFnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3N1cHBvcnRlZCAobWV0aG9kX3R5cGUsIGZvcm1hdCwKKyAgICAgICAgICB3aWR0aCwgaGVpZ2h0KSkgeworICAgIEdUeXBlIHRtcDsKKyAgICBnaW50IGk7CisKKyAgICBtZXRob2RfdHlwZSA9IEdfVFlQRV9JTlZBTElEOworCisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzZWxmLCAiTWV0aG9kIGRvZXNuJ3Qgc3VwcG9ydCByZXF1ZXN0ZWQgZm9ybWF0Iik7CisgICAgZm9yIChpID0gMDsgaSA8IEdfTl9FTEVNRU5UUyAoX21ldGhvZF90eXBlcyk7IGkrKykgeworICAgICAgaWYgKF9tZXRob2RfdHlwZXNbaV0uZ2V0X3R5cGUgPT0gTlVMTCkKKyAgICAgICAgY29udGludWU7CisgICAgICB0bXAgPSBfbWV0aG9kX3R5cGVzW2ldLmdldF90eXBlICgpOworICAgICAgaWYgKGdzdF9kZWludGVybGFjZV9tZXRob2Rfc3VwcG9ydGVkICh0bXAsIGZvcm1hdCwgd2lkdGgsIGhlaWdodCkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlVzaW5nIG1ldGhvZCAlZCIsIGkpOworICAgICAgICBtZXRob2RfdHlwZSA9IHRtcDsKKyAgICAgICAgbWV0aG9kID0gaTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIC8qIElmIHdlIGdldCBoZXJlIHdlIG11c3QgaGF2ZSBpbnZhbGlkIGNhcHMhICovCisgICAgZ19hc3NlcnQgKG1ldGhvZF90eXBlICE9IEdfVFlQRV9JTlZBTElEKTsKKyAgfQorCisgIHNlbGYtPm1ldGhvZCA9IGdfb2JqZWN0X25ldyAobWV0aG9kX3R5cGUsICJuYW1lIiwgIm1ldGhvZCIsIE5VTEwpOworICBzZWxmLT5tZXRob2RfaWQgPSBtZXRob2Q7CisKKyAgZ3N0X29iamVjdF9zZXRfcGFyZW50IChHU1RfT0JKRUNUIChzZWxmLT5tZXRob2QpLCBHU1RfT0JKRUNUIChzZWxmKSk7CisjaWYgMAorICBnc3RfY2hpbGRfcHJveHlfY2hpbGRfYWRkZWQgKEdTVF9PQkpFQ1QgKHNlbGYpLCBHU1RfT0JKRUNUIChzZWxmLT5tZXRob2QpKTsKKyNlbmRpZgorCisgIGlmIChzZWxmLT5tZXRob2QpCisgICAgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9zZXR1cCAoc2VsZi0+bWV0aG9kLCAmc2VsZi0+dmluZm8pOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGFjZV9jbGlwX2J1ZmZlciAoR3N0RGVpbnRlcmxhY2UgKiBzZWxmLCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIEdzdENsb2NrVGltZSBzdGFydCwgc3RvcDsKKyAgZ3VpbnQ2NCBjc3RhcnQsIGNzdG9wOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAiQ2xpcHBpbmcgYnVmZmVyIHRvIHRoZSBjdXJyZW50IHNlZ21lbnQ6ICUiIEdTVF9USU1FX0ZPUk1BVCAiIC0tICUiCisgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpKSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcikpKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkN1cnJlbnQgc2VnbWVudDogJSIgR1NUX1NFR01FTlRfRk9STUFULAorICAgICAgJnNlbGYtPnNlZ21lbnQpOworCisgIGlmIChHX1VOTElLRUxZIChzZWxmLT5zZWdtZW50LmZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUpKQorICAgIGdvdG8gYmVhY2g7CisgIGlmIChHX1VOTElLRUxZICghR1NUX0JVRkZFUl9USU1FU1RBTVBfSVNfVkFMSUQgKGJ1ZmZlcikpKQorICAgIGdvdG8gYmVhY2g7CisKKyAgc3RhcnQgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKTsKKyAgc3RvcCA9IHN0YXJ0ICsgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKTsKKworICBpZiAoIShyZXQgPSBnc3Rfc2VnbWVudF9jbGlwICgmc2VsZi0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICAgICAgICBzdGFydCwgc3RvcCwgJmNzdGFydCwgJmNzdG9wKSkpCisgICAgZ290byBiZWFjaDsKKworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSA9IGNzdGFydDsKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChjc3RvcCkpCisgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSA9IGNzdG9wIC0gY3N0YXJ0OworCitiZWFjaDoKKyAgaWYgKHJldCkKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgICAiQ2xpcHBlZCBidWZmZXIgdG8gdGhlIGN1cnJlbnQgc2VnbWVudDogJSIgR1NUX1RJTUVfRk9STUFUICIgLS0gJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcikpKTsKKyAgZWxzZQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJCdWZmZXIgb3V0c2lkZSB0aGUgY3VycmVudCBzZWdtZW50IC0tIGRyb3BwaW5nIik7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9jbGFzc19pbml0IChHc3REZWludGVybGFjZUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbCk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbCk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywKKyAgICAgICJEZWludGVybGFjZXIiLAorICAgICAgIkZpbHRlci9FZmZlY3QvVmlkZW8vRGVpbnRlcmxhY2UiLAorICAgICAgIkRlaW50ZXJsYWNlIE1ldGhvZHMgcG9ydGVkIGZyb20gRFNjYWxlci9UdlRpbWUiLAorICAgICAgIk1hcnRpbiBFaWtlcm1hbm4gPG1laWtlckB1cGIuZGU+LCAiCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2RlaW50ZXJsYWNlX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2RlaW50ZXJsYWNlX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfZGVpbnRlcmxhY2VfZmluYWxpemU7CisKKyAgLyoqCisgICAqIEdzdERlaW50ZXJsYWNlOm1vZGU6CisgICAqCisgICAqIFRoaXMgc2VsZWN0cyB3aGV0aGVyIHRoZSBkZWludGVybGFjaW5nIG1ldGhvZHMgc2hvdWxkCisgICAqIGFsd2F5cyBiZSBhcHBsaWVkIG9yIGlmIHRoZXkgc2hvdWxkIG9ubHkgYmUgYXBwbGllZAorICAgKiBvbiBjb250ZW50IHRoYXQgaGFzIHRoZSAiaW50ZXJsYWNlZCIgZmxhZyBvbiB0aGUgY2Fwcy4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTU9ERSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgibW9kZSIsCisgICAgICAgICAgIk1vZGUiLAorICAgICAgICAgICJEZWludGVybGFjZSBNb2RlIiwKKyAgICAgICAgICBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NT0RFUywKKyAgICAgICAgICBERUZBVUxUX01PREUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykKKyAgICAgICk7CisKKyAgLyoqCisgICAqIEdzdERlaW50ZXJsYWNlOm1ldGhvZDoKKyAgICoKKyAgICogU2VsZWN0cyB0aGUgZGlmZmVyZW50IGRlaW50ZXJsYWNpbmcgYWxnb3JpdGhtcyB0aGF0IGNhbiBiZSB1c2VkLgorICAgKiBUaGVzZSBwcm92aWRlIGRpZmZlcmVudCBxdWFsaXR5IGFuZCBDUFUgdXNhZ2UuCisgICAqCisgICAqIFNvbWUgbWV0aG9kcyBwcm92aWRlIHBhcmFtZXRlcnMgd2hpY2ggY2FuIGJlIHNldCBieSBnZXR0aW5nCisgICAqIHRoZSAibWV0aG9kIiBjaGlsZCB2aWEgdGhlICNHc3RDaGlsZFByb3h5IGludGVyZmFjZSBhbmQKKyAgICogc2V0dGluZyB0aGUgYXBwcm9waWF0ZSBwcm9wZXJ0aWVzIG9uIGl0LgorICAgKgorICAgKiA8aXRlbWl6ZWRsaXN0PgorICAgKiA8bGlzdGl0ZW0+CisgICAqIDxwYXJhPgorICAgKiB0b21zbW9jb21wCisgICAqIE1vdGlvbiBBZGFwdGl2ZTogTW90aW9uIFNlYXJjaAorICAgKiA8L3BhcmE+CisgICAqIDwvbGlzdGl0ZW0+CisgICAqIDxsaXN0aXRlbT4KKyAgICogPHBhcmE+CisgICAqIGdyZWVkeWgKKyAgICogTW90aW9uIEFkYXB0aXZlOiBBZHZhbmNlZCBEZXRlY3Rpb24KKyAgICogPC9wYXJhPgorICAgKiA8L2xpc3RpdGVtPgorICAgKiA8bGlzdGl0ZW0+CisgICAqIDxwYXJhPgorICAgKiBncmVlZHlsCisgICAqIE1vdGlvbiBBZGFwdGl2ZTogU2ltcGxlIERldGVjdGlvbgorICAgKiA8L3BhcmE+CisgICAqIDwvbGlzdGl0ZW0+CisgICAqIDxsaXN0aXRlbT4KKyAgICogPHBhcmE+CisgICAqIHZmaXIKKyAgICogQmx1ciB2ZXJ0aWNhbAorICAgKiA8L3BhcmE+CisgICAqIDwvbGlzdGl0ZW0+CisgICAqIDxsaXN0aXRlbT4KKyAgICogPHBhcmE+CisgICAqIGxpbmVhcgorICAgKiBMaW5lYXIgaW50ZXJwb2xhdGlvbgorICAgKiA8L3BhcmE+CisgICAqIDwvbGlzdGl0ZW0+CisgICAqIDxsaXN0aXRlbT4KKyAgICogPHBhcmE+CisgICAqIGxpbmVhcmJsZW5kCisgICAqIExpbmVhciBpbnRlcnBvbGF0aW9uIGluIHRpbWUgZG9tYWluLiAgQW55IG1vdGlvbiBjYXVzZXMgc2lnbmlmaWNhbnQKKyAgICogZ2hvc3RpbmcsIHNvIHRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC4KKyAgICogPC9wYXJhPgorICAgKiA8L2xpc3RpdGVtPgorICAgKiA8bGlzdGl0ZW0+CisgICAqIDxwYXJhPgorICAgKiBzY2FsZXJib2IKKyAgICogRG91YmxlIGxpbmVzCisgICAqIDwvcGFyYT4KKyAgICogPC9saXN0aXRlbT4KKyAgICogPGxpc3RpdGVtPgorICAgKiA8cGFyYT4KKyAgICogd2VhdmUKKyAgICogV2VhdmUuICBCYWQgcXVhbGl0eSwgZG8gbm90IHVzZS4KKyAgICogPC9wYXJhPgorICAgKiA8L2xpc3RpdGVtPgorICAgKiA8bGlzdGl0ZW0+CisgICAqIDxwYXJhPgorICAgKiB3ZWF2ZXRmZgorICAgKiBQcm9ncmVzc2l2ZTogVG9wIEZpZWxkIEZpcnN0LiAgQmFkIHF1YWxpdHksIGRvIG5vdCB1c2UuCisgICAqIDwvcGFyYT4KKyAgICogPC9saXN0aXRlbT4KKyAgICogPGxpc3RpdGVtPgorICAgKiA8cGFyYT4KKyAgICogd2VhdmViZmYKKyAgICogUHJvZ3Jlc3NpdmU6IEJvdHRvbSBGaWVsZCBGaXJzdC4gIEJhZCBxdWFsaXR5LCBkbyBub3QgdXNlLgorICAgKiA8L3BhcmE+CisgICAqIDwvbGlzdGl0ZW0+CisgICAqIDwvaXRlbWl6ZWRsaXN0PgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NRVRIT0QsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoIm1ldGhvZCIsCisgICAgICAgICAgIk1ldGhvZCIsCisgICAgICAgICAgIkRlaW50ZXJsYWNlIE1ldGhvZCIsCisgICAgICAgICAgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EUywKKyAgICAgICAgICBERUZBVUxUX01FVEhPRCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKQorICAgICAgKTsKKworICAvKioKKyAgICogR3N0RGVpbnRlcmxhY2U6ZmllbGRzOgorICAgKgorICAgKiBUaGlzIHNlbGVjdHMgd2hpY2ggZmllbGRzIHNob3VsZCBiZSBvdXRwdXQuIElmICJhbGwiIGlzIHNlbGVjdGVkCisgICAqIHRoZSBvdXRwdXQgZnJhbWVyYXRlIHdpbGwgYmUgZG91YmxlLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9GSUVMRFMsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoImZpZWxkcyIsCisgICAgICAgICAgImZpZWxkcyIsCisgICAgICAgICAgIkZpZWxkcyB0byB1c2UgZm9yIGRlaW50ZXJsYWNpbmciLAorICAgICAgICAgIEdTVF9UWVBFX0RFSU5URVJMQUNFX0ZJRUxEUywKKyAgICAgICAgICBERUZBVUxUX0ZJRUxEUywgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKQorICAgICAgKTsKKworICAvKioKKyAgICogR3N0RGVpbnRlcmxhY2U6bGF5b3V0OgorICAgKgorICAgKiBUaGlzIHNlbGVjdHMgd2hpY2ggZmllbGRzIGlzIHRoZSBmaXJzdCBpbiB0aW1lLgorICAgKgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9GSUVMRF9MQVlPVVQsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoInRmZiIsCisgICAgICAgICAgInRmZiIsCisgICAgICAgICAgIkRlaW50ZXJsYWNlIHRvcCBmaWVsZCBmaXJzdCIsCisgICAgICAgICAgR1NUX1RZUEVfREVJTlRFUkxBQ0VfRklFTERfTEFZT1VULAorICAgICAgICAgIERFRkFVTFRfRklFTERfTEFZT1VULCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpCisgICAgICApOworCisgIC8qKgorICAgKiBHc3REZWludGVybGFjZTpsb2NraW5nOgorICAgKgorICAgKiBUaGlzIHNlbGVjdHMgd2hpY2ggYXBwcm9hY2ggdG8gcGF0dGVybiBsb2NraW5nIGlzIHVzZWQgd2hpY2ggYWZmZWN0cworICAgKiBwcm9jZXNzaW5nIGxhdGVuY3kgYW5kIGFjY3VyYWN5IG9mIHRpbWVzdGFtcCBhZGp1c3RtZW50IGZvciB0ZWxlY2luZQorICAgKiBzdHJlYW1zLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9MT0NLSU5HLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJsb2NraW5nIiwgImxvY2tpbmciLCAiUGF0dGVybiBsb2NraW5nIG1vZGUiLAorICAgICAgICAgIEdTVF9UWVBFX0RFSU5URVJMQUNFX0xPQ0tJTkcsIERFRkFVTFRfTE9DS0lORywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0RGVpbnRlcmxhY2U6aWdub3JlLW9ic2N1cmU6CisgICAqCisgICAqIFRoaXMgc2VsZWN0cyB3aGV0aGVyIHRvIGlnbm9yZSBvYnNjdXJlL3JhcmUgdGVsZWNpbmUgcGF0dGVybnMuCisgICAqIE5UU0MgMjozIHB1bGxkb3duIHZhcmlhbnRzIGFyZSB0aGUgb25seSByZWFsbHkgY29tbW9uIHBhdHRlcm5zLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9JR05PUkVfT0JTQ1VSRSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiaWdub3JlLW9ic2N1cmUiLCAiaWdub3JlLW9ic2N1cmUiLAorICAgICAgICAgICJJZ25vcmUgb2JzY3VyZSB0ZWxlY2luZSBwYXR0ZXJucyAob25seSBjb25zaWRlciBQLCBJIGFuZCAyOjMgIgorICAgICAgICAgICJ2YXJpYW50cykuIiwgREVGQVVMVF9JR05PUkVfT0JTQ1VSRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0RGVpbnRlcmxhY2U6ZHJvcC1vcnBoYW5zOgorICAgKgorICAgKiBUaGlzIHNlbGVjdHMgd2hldGhlciB0byBkcm9wIG9ycGhhbiBmaWVsZHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0ZWxlY2luZQorICAgKiBwYXR0ZXJucyBpbiBhY3RpdmUgbG9ja2luZyBtb2RlLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9EUk9QX09SUEhBTlMsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImRyb3Atb3JwaGFucyIsICJkcm9wLW9ycGhhbnMiLAorICAgICAgICAgICJEcm9wIG9ycGhhbiBmaWVsZHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0ZWxlY2luZSBwYXR0ZXJucyBpbiAiCisgICAgICAgICAgImFjdGl2ZSBsb2NraW5nIG1vZGUuIiwgREVGQVVMVF9EUk9QX09SUEhBTlMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGVpbnRlcmxhY2VfY2hhbmdlX3N0YXRlKTsKK30KKworI2lmIDAKK3N0YXRpYyBHc3RPYmplY3QgKgorZ3N0X2RlaW50ZXJsYWNlX2NoaWxkX3Byb3h5X2dldF9jaGlsZF9ieV9pbmRleCAoR3N0Q2hpbGRQcm94eSAqIGNoaWxkX3Byb3h5LAorICAgIGd1aW50IGluZGV4KQoreworICBHc3REZWludGVybGFjZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEFDRSAoY2hpbGRfcHJveHkpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChpbmRleCA9PSAwLCBOVUxMKTsKKworICByZXR1cm4gZ3N0X29iamVjdF9yZWYgKHNlbGYtPm1ldGhvZCk7Cit9CisKK3N0YXRpYyBndWludAorZ3N0X2RlaW50ZXJsYWNlX2NoaWxkX3Byb3h5X2dldF9jaGlsZHJlbl9jb3VudCAoR3N0Q2hpbGRQcm94eSAqIGNoaWxkX3Byb3h5KQoreworICBHc3REZWludGVybGFjZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEFDRSAoY2hpbGRfcHJveHkpOworCisgIHJldHVybiAoKHNlbGYtPm1ldGhvZCkgPyAxIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfY2hpbGRfcHJveHlfaW50ZXJmYWNlX2luaXQgKGdwb2ludGVyIGdfaWZhY2UsCisgICAgZ3BvaW50ZXIgaWZhY2VfZGF0YSkKK3sKKyAgR3N0Q2hpbGRQcm94eUludGVyZmFjZSAqaWZhY2UgPSBnX2lmYWNlOworCisgIGlmYWNlLT5nZXRfY2hpbGRfYnlfaW5kZXggPSBnc3RfZGVpbnRlcmxhY2VfY2hpbGRfcHJveHlfZ2V0X2NoaWxkX2J5X2luZGV4OworICBpZmFjZS0+Z2V0X2NoaWxkcmVuX2NvdW50ID0gZ3N0X2RlaW50ZXJsYWNlX2NoaWxkX3Byb3h5X2dldF9jaGlsZHJlbl9jb3VudDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX2luaXQgKEdzdERlaW50ZXJsYWNlICogc2VsZikKK3sKKyAgc2VsZi0+c2lua3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc2lua190ZW1wbCwgInNpbmsiKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHNlbGYtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2RlaW50ZXJsYWNlX2NoYWluKSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChzZWxmLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kZWludGVybGFjZV9zaW5rX2V2ZW50KSk7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChzZWxmLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kZWludGVybGFjZV9zaW5rX3F1ZXJ5KSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzZWxmKSwgc2VsZi0+c2lua3BhZCk7CisKKyAgc2VsZi0+c3JjcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzcmNfdGVtcGwsICJzcmMiKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHNlbGYtPnNyY3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGVpbnRlcmxhY2Vfc3JjX2V2ZW50KSk7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChzZWxmLT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2RlaW50ZXJsYWNlX3NyY19xdWVyeSkpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoc2VsZiksIHNlbGYtPnNyY3BhZCk7CisKKyAgc2VsZi0+bW9kZSA9IERFRkFVTFRfTU9ERTsKKyAgc2VsZi0+dXNlcl9zZXRfbWV0aG9kX2lkID0gREVGQVVMVF9NRVRIT0Q7CisgIGdzdF92aWRlb19pbmZvX2luaXQgKCZzZWxmLT52aW5mbyk7CisgIGdzdF9kZWludGVybGFjZV9zZXRfbWV0aG9kIChzZWxmLCBzZWxmLT51c2VyX3NldF9tZXRob2RfaWQpOworICBzZWxmLT5maWVsZHMgPSBERUZBVUxUX0ZJRUxEUzsKKyAgc2VsZi0+dXNlcl9zZXRfZmllbGRzID0gREVGQVVMVF9GSUVMRFM7CisgIHNlbGYtPmZpZWxkX2xheW91dCA9IERFRkFVTFRfRklFTERfTEFZT1VUOworICBzZWxmLT5sb2NraW5nID0gREVGQVVMVF9MT0NLSU5HOworICBzZWxmLT5pZ25vcmVfb2JzY3VyZSA9IERFRkFVTFRfSUdOT1JFX09CU0NVUkU7CisgIHNlbGYtPmRyb3Bfb3JwaGFucyA9IERFRkFVTFRfRFJPUF9PUlBIQU5TOworCisgIHNlbGYtPmxvd19sYXRlbmN5ID0gLTE7CisgIHNlbGYtPnBhdHRlcm4gPSAtMTsKKyAgc2VsZi0+cGF0dGVybl9waGFzZSA9IC0xOworICBzZWxmLT5wYXR0ZXJuX2NvdW50ID0gMDsKKyAgc2VsZi0+b3V0cHV0X2NvdW50ID0gMDsKKyAgc2VsZi0+cGF0dGVybl9iYXNlX3RzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgc2VsZi0+cGF0dGVybl9idWZfZHVyID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgc2VsZi0+c3RpbGxfZnJhbWVfbW9kZSA9IEZBTFNFOworCisgIGdzdF9kZWludGVybGFjZV9yZXNldCAoc2VsZik7Cit9CisKK3N0YXRpYyBHc3RWaWRlb0ZyYW1lICoKK2dzdF92aWRlb19mcmFtZV9uZXdfYW5kX21hcCAoR3N0VmlkZW9JbmZvICogdmluZm8sIEdzdEJ1ZmZlciAqIGJ1ZmZlciwKKyAgICBHc3RNYXBGbGFncyBmbGFncykKK3sKKyAgR3N0VmlkZW9GcmFtZSAqZnJhbWUgPSBnX21hbGxvYzAgKHNpemVvZiAoR3N0VmlkZW9GcmFtZSkpOworICBpZiAoIWdzdF92aWRlb19mcmFtZV9tYXAgKGZyYW1lLCB2aW5mbywgYnVmZmVyLCBmbGFncykpIHsKKyAgICBnX2ZyZWUgKGZyYW1lKTsKKyAgICBnX3JldHVybl92YWxfaWZfcmVhY2hlZCAoTlVMTCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIGZyYW1lOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwX2FuZF9mcmVlIChHc3RWaWRlb0ZyYW1lICogZnJhbWUpCit7CisgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoZnJhbWUpOworICBnX2ZyZWUgKGZyYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9yZXNldF9oaXN0b3J5IChHc3REZWludGVybGFjZSAqIHNlbGYsIGdib29sZWFuIGRyb3BfYWxsKQoreworICBnaW50IGk7CisKKyAgaWYgKCFkcm9wX2FsbCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJGbHVzaGluZyBoaXN0b3J5IChjb3VudCAlZCkiLCBzZWxmLT5oaXN0b3J5X2NvdW50KTsKKyAgICB3aGlsZSAoc2VsZi0+aGlzdG9yeV9jb3VudCA+IDApIHsKKyAgICAgIGlmIChnc3RfZGVpbnRlcmxhY2Vfb3V0cHV0X2ZyYW1lIChzZWxmLCBUUlVFKSAhPSBHU1RfRkxPV19PSykgeworICAgICAgICAvKiBFbmNvdW50ZXJlZCBlcnJvciwgb3IgZmx1c2hpbmcgLT4gc2tpcCBhbmQgZHJvcCBhbGwgcmVtYWluaW5nICovCisgICAgICAgIGRyb3BfYWxsID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChkcm9wX2FsbCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJSZXNldHRpbmcgaGlzdG9yeSAoY291bnQgJWQpIiwKKyAgICAgICAgc2VsZi0+aGlzdG9yeV9jb3VudCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+aGlzdG9yeV9jb3VudDsgaSsrKSB7CisgICAgICBpZiAoc2VsZi0+ZmllbGRfaGlzdG9yeVtpXS5mcmFtZSkgeworICAgICAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXBfYW5kX2ZyZWUgKHNlbGYtPmZpZWxkX2hpc3RvcnlbaV0uZnJhbWUpOworICAgICAgICBzZWxmLT5maWVsZF9oaXN0b3J5W2ldLmZyYW1lID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgbWVtc2V0IChzZWxmLT5maWVsZF9oaXN0b3J5LCAwLAorICAgICAgR1NUX0RFSU5URVJMQUNFX01BWF9GSUVMRF9ISVNUT1JZICogc2l6ZW9mIChHc3REZWludGVybGFjZUZpZWxkKSk7CisgIHNlbGYtPmhpc3RvcnlfY291bnQgPSAwOworICBtZW1zZXQgKHNlbGYtPmJ1Zl9zdGF0ZXMsIDAsCisgICAgICBHU1RfREVJTlRFUkxBQ0VfTUFYX0JVRkZFUl9TVEFURV9ISVNUT1JZICoKKyAgICAgIHNpemVvZiAoR3N0RGVpbnRlcmxhY2VCdWZmZXJTdGF0ZSkpOworICBzZWxmLT5zdGF0ZV9jb3VudCA9IDA7CisgIHNlbGYtPnBhdHRlcm5fbG9jayA9IEZBTFNFOworICBzZWxmLT5wYXR0ZXJuX3JlZnJlc2ggPSBUUlVFOworICBzZWxmLT5jdXJfZmllbGRfaWR4ID0gLTE7CisKKyAgaWYgKCFzZWxmLT5zdGlsbF9mcmFtZV9tb2RlICYmIHNlbGYtPmxhc3RfYnVmZmVyKSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoc2VsZi0+bGFzdF9idWZmZXIpOworICAgIHNlbGYtPmxhc3RfYnVmZmVyID0gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX3Jlc2V0IChHc3REZWludGVybGFjZSAqIHNlbGYpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJSZXNldHRpbmcgaW50ZXJuYWwgc3RhdGUiKTsKKworICBnc3RfdmlkZW9faW5mb19pbml0ICgmc2VsZi0+dmluZm8pOworCisgIHNlbGYtPnBhc3N0aHJvdWdoID0gRkFMU0U7CisKKyAgc2VsZi0+cmVjb25maWd1cmUgPSBGQUxTRTsKKyAgaWYgKChnaW50KSBzZWxmLT5uZXdfbW9kZSAhPSAtMSkKKyAgICBzZWxmLT5tb2RlID0gc2VsZi0+bmV3X21vZGU7CisgIGlmICgoZ2ludCkgc2VsZi0+bmV3X2ZpZWxkcyAhPSAtMSkKKyAgICBzZWxmLT51c2VyX3NldF9maWVsZHMgPSBzZWxmLT5uZXdfZmllbGRzOworICBzZWxmLT5uZXdfbW9kZSA9IC0xOworICBzZWxmLT5uZXdfZmllbGRzID0gLTE7CisKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlbGYtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVU5ERUZJTkVEKTsKKworICBpZiAoc2VsZi0+cmVxdWVzdF9jYXBzKQorICAgIGdzdF9jYXBzX3VucmVmIChzZWxmLT5yZXF1ZXN0X2NhcHMpOworICBzZWxmLT5yZXF1ZXN0X2NhcHMgPSBOVUxMOworCisgIGdzdF9kZWludGVybGFjZV9yZXNldF9oaXN0b3J5IChzZWxmLCBUUlVFKTsKKworICBnc3RfZGVpbnRlcmxhY2VfcmVzZXRfcW9zIChzZWxmKTsKKworICBzZWxmLT5uZWVkX21vcmUgPSBGQUxTRTsKKyAgc2VsZi0+aGF2ZV9lb3MgPSBGQUxTRTsKKworICBzZWxmLT5kaXNjb250ID0gVFJVRTsKKworICBnc3RfZGVpbnRlcmxhY2Vfc2V0X2FsbG9jYXRpb24gKHNlbGYsIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3REZWludGVybGFjZSAqc2VsZjsKKworICBzZWxmID0gR1NUX0RFSU5URVJMQUNFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFOnsKKyAgICAgIGdpbnQgbmV3X21vZGU7CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc2VsZik7CisgICAgICBuZXdfbW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGlmIChzZWxmLT5tb2RlICE9IG5ld19tb2RlICYmIGdzdF9wYWRfaGFzX2N1cnJlbnRfY2FwcyAoc2VsZi0+c3JjcGFkKSkgeworICAgICAgICBzZWxmLT5yZWNvbmZpZ3VyZSA9IFRSVUU7CisgICAgICAgIHNlbGYtPm5ld19tb2RlID0gbmV3X21vZGU7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZWxmLT5tb2RlID0gbmV3X21vZGU7CisgICAgICB9CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc2VsZik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX01FVEhPRDoKKyAgICAgIHNlbGYtPnVzZXJfc2V0X21ldGhvZF9pZCA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGdzdF9kZWludGVybGFjZV9zZXRfbWV0aG9kIChzZWxmLCBzZWxmLT51c2VyX3NldF9tZXRob2RfaWQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZJRUxEUzp7CisgICAgICBnaW50IG5ld19maWVsZHM7CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc2VsZik7CisgICAgICBuZXdfZmllbGRzID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgaWYgKHNlbGYtPnVzZXJfc2V0X2ZpZWxkcyAhPSBuZXdfZmllbGRzCisgICAgICAgICAgJiYgZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChzZWxmLT5zcmNwYWQpKSB7CisgICAgICAgIHNlbGYtPnJlY29uZmlndXJlID0gVFJVRTsKKyAgICAgICAgc2VsZi0+bmV3X2ZpZWxkcyA9IG5ld19maWVsZHM7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZWxmLT51c2VyX3NldF9maWVsZHMgPSBuZXdfZmllbGRzOworICAgICAgfQorICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNlbGYpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9GSUVMRF9MQVlPVVQ6CisgICAgICBzZWxmLT5maWVsZF9sYXlvdXQgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTE9DS0lORzoKKyAgICAgIHNlbGYtPmxvY2tpbmcgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSUdOT1JFX09CU0NVUkU6CisgICAgICBzZWxmLT5pZ25vcmVfb2JzY3VyZSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9EUk9QX09SUEhBTlM6CisgICAgICBzZWxmLT5kcm9wX29ycGhhbnMgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChzZWxmLCBwcm9wX2lkLCBwc3BlYyk7CisgIH0KKworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3REZWludGVybGFjZSAqc2VsZjsKKworICBzZWxmID0gR1NUX0RFSU5URVJMQUNFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHNlbGYtPm1vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01FVEhPRDoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBzZWxmLT51c2VyX3NldF9tZXRob2RfaWQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZJRUxEUzoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBzZWxmLT51c2VyX3NldF9maWVsZHMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZJRUxEX0xBWU9VVDoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBzZWxmLT5maWVsZF9sYXlvdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0xPQ0tJTkc6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgc2VsZi0+bG9ja2luZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSUdOT1JFX09CU0NVUkU6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgc2VsZi0+aWdub3JlX29ic2N1cmUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RST1BfT1JQSEFOUzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBzZWxmLT5kcm9wX29ycGhhbnMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAoc2VsZiwgcHJvcF9pZCwgcHNwZWMpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdERlaW50ZXJsYWNlICpzZWxmID0gR1NUX0RFSU5URVJMQUNFIChvYmplY3QpOworCisgIGdzdF9kZWludGVybGFjZV9yZXNldCAoc2VsZik7CisKKyAgaWYgKHNlbGYtPm1ldGhvZCkgeworICAgIGdzdF9vYmplY3RfdW5wYXJlbnQgKEdTVF9PQkpFQ1QgKHNlbGYtPm1ldGhvZCkpOworICAgIHNlbGYtPm1ldGhvZCA9IE5VTEw7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfdXBkYXRlX3BhdHRlcm5fdGltZXN0YW1wcyAoR3N0RGVpbnRlcmxhY2UgKiBzZWxmKQoreworICBnaW50IHN0YXRlX2lkeDsKKyAgaWYgKHNlbGYtPmxvd19sYXRlbmN5KSB7CisgICAgLyogaW4gbG93LWxhdGVuY3kgbW9kZSB0aGUgYnVmZmVyIHN0YXRlIGhpc3RvcnkgY29udGFpbnMgb2xkIGJ1ZmZlcgorICAgICAqIHN0YXRlcyBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IG9uZSBhbmQgcGVyaGFwcyBzb21lIGZ1dHVyZSBvbmVzLgorICAgICAqIHRoZSBjdXJyZW50IGJ1ZmZlcidzIHN0YXRlIGlzIGdpdmVuIGJ5IHRoZSBudW1iZXIgb2YgZmllbGQgcGFpcnMKKyAgICAgKiByb3VuZGVkIHVwLCBtaW51cyAxLiB0aGUgYmVsb3cgaXMgZXF1aXZhbGVudCAqLworICAgIHN0YXRlX2lkeCA9IChzZWxmLT5oaXN0b3J5X2NvdW50IC0gMSkgPj4gMTsKKyAgfSBlbHNlIHsKKyAgICAvKiBpbiBoaWdoLWxhdGVuY3kgbW9kZSBzdGF0ZV9jb3VudCAtIDEgaXMgdGhlIGN1cnJlbnQgYnVmZmVyJ3Mgc3RhdGUgKi8KKyAgICBzdGF0ZV9pZHggPSBzZWxmLT5zdGF0ZV9jb3VudCAtIDE7CisgIH0KKworICBzZWxmLT5wYXR0ZXJuX2Jhc2VfdHMgPSBzZWxmLT5idWZfc3RhdGVzW3N0YXRlX2lkeF0udGltZXN0YW1wOworICBpZiAoc2VsZi0+YnVmX3N0YXRlc1tzdGF0ZV9pZHhdLnN0YXRlICE9IEdTVF9SRkYpIHsKKyAgICBzZWxmLT5wYXR0ZXJuX2J1Zl9kdXIgPQorICAgICAgICAoc2VsZi0+YnVmX3N0YXRlc1tzdGF0ZV9pZHhdLmR1cmF0aW9uICoKKyAgICAgICAgdGVsZWNpbmVfcGF0dGVybnNbc2VsZi0+cGF0dGVybl0ucmF0aW9fZCkgLworICAgICAgICB0ZWxlY2luZV9wYXR0ZXJuc1tzZWxmLT5wYXR0ZXJuXS5yYXRpb19uOworICB9IGVsc2UgeworICAgIHNlbGYtPnBhdHRlcm5fYnVmX2R1ciA9CisgICAgICAgIChzZWxmLT5idWZfc3RhdGVzW3N0YXRlX2lkeF0uZHVyYXRpb24gKgorICAgICAgICB0ZWxlY2luZV9wYXR0ZXJuc1tzZWxmLT5wYXR0ZXJuXS5yYXRpb19kICogMikgLworICAgICAgICAodGVsZWNpbmVfcGF0dGVybnNbc2VsZi0+cGF0dGVybl0ucmF0aW9fbiAqIDMpOworICB9CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAiU3RhcnRpbmcgYSBuZXcgcGF0dGVybiByZXBlYXQgd2l0aCBiYXNlIHRzICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiBhbmQgZHVyICUiIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAoc2VsZi0+cGF0dGVybl9iYXNlX3RzKSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHNlbGYtPnBhdHRlcm5fYnVmX2R1cikpOworfQorCitzdGF0aWMgR3N0VmlkZW9GcmFtZSAqCitnc3RfZGVpbnRlcmxhY2VfcG9wX2hpc3RvcnkgKEdzdERlaW50ZXJsYWNlICogc2VsZikKK3sKKyAgR3N0VmlkZW9GcmFtZSAqZnJhbWU7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNlbGYtPmhpc3RvcnlfY291bnQgPiAwLCBOVUxMKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiUG9wIGxhc3QgaGlzdG9yeSBmcmFtZSAtLSBjdXJyZW50IGhpc3Rvcnkgc2l6ZSAlZCIsCisgICAgICBzZWxmLT5oaXN0b3J5X2NvdW50KTsKKworICBmcmFtZSA9IHNlbGYtPmZpZWxkX2hpc3Rvcnlbc2VsZi0+aGlzdG9yeV9jb3VudCAtIDFdLmZyYW1lOworCisgIHNlbGYtPmhpc3RvcnlfY291bnQtLTsKKyAgaWYgKHNlbGYtPmxvY2tpbmcgIT0gR1NUX0RFSU5URVJMQUNFX0xPQ0tJTkdfTk9ORSAmJiAoIXNlbGYtPmhpc3RvcnlfY291bnQKKyAgICAgICAgICB8fCBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZnJhbWUsIDApICE9CisgICAgICAgICAgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNlbGYtPmZpZWxkX2hpc3Rvcnlbc2VsZi0+aGlzdG9yeV9jb3VudCAtCisgICAgICAgICAgICAgICAgICAxXS5mcmFtZSwgMCkpKSB7CisgICAgaWYgKCFzZWxmLT5sb3dfbGF0ZW5jeSkKKyAgICAgIHNlbGYtPnN0YXRlX2NvdW50LS07CisgICAgaWYgKHNlbGYtPnBhdHRlcm5fbG9jaykgeworICAgICAgc2VsZi0+cGF0dGVybl9jb3VudCsrOworICAgICAgaWYgKHNlbGYtPnBhdHRlcm4gIT0gLTEKKyAgICAgICAgICAmJiBzZWxmLT5wYXR0ZXJuX2NvdW50ID49IHRlbGVjaW5lX3BhdHRlcm5zW3NlbGYtPnBhdHRlcm5dLmxlbmd0aCkgeworICAgICAgICBzZWxmLT5wYXR0ZXJuX2NvdW50ID0gMDsKKyAgICAgICAgc2VsZi0+b3V0cHV0X2NvdW50ID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiUmV0dXJuaW5nIGZyYW1lOiAlcCAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIgd2l0aCBkdXJhdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQgIiBhbmQgc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCwgZnJhbWUsCisgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoZnJhbWUtPmJ1ZmZlcikpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVVJBVElPTiAoZnJhbWUtPmJ1ZmZlcikpLAorICAgICAgR1NUX1ZJREVPX0ZSQU1FX1NJWkUgKGZyYW1lKSk7CisKKyAgcmV0dXJuIGZyYW1lOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX2dldF9idWZmZXJfc3RhdGUgKEdzdERlaW50ZXJsYWNlICogc2VsZiwgR3N0VmlkZW9GcmFtZSAqIGZyYW1lLAorICAgIGd1aW50OCAqIHN0YXRlLCBHc3RWaWRlb0ludGVybGFjZU1vZGUgKiBpX21vZGUpCit7CisgIEdzdFZpZGVvSW50ZXJsYWNlTW9kZSBpbnRlcmxhY2luZ19tb2RlOworCisgIGlmICghKGlfbW9kZSB8fCBzdGF0ZSkpCisgICAgcmV0dXJuOworCisgIGludGVybGFjaW5nX21vZGUgPSBHU1RfVklERU9fSU5GT19JTlRFUkxBQ0VfTU9ERSAoJmZyYW1lLT5pbmZvKTsKKyAgaWYgKHNlbGYtPm1vZGUgPT0gR1NUX0RFSU5URVJMQUNFX01PREVfSU5URVJMQUNFRCkKKyAgICBpbnRlcmxhY2luZ19tb2RlID0gR1NUX1ZJREVPX0lOVEVSTEFDRV9NT0RFX0lOVEVSTEVBVkVEOworCisgIGlmIChzdGF0ZSkgeworICAgIGlmIChpbnRlcmxhY2luZ19tb2RlID09IEdTVF9WSURFT19JTlRFUkxBQ0VfTU9ERV9NSVhFRCkgeworICAgICAgaWYgKEdTVF9WSURFT19GUkFNRV9JU19SRkYgKGZyYW1lKSkgeworICAgICAgICAqc3RhdGUgPSBHU1RfREVJTlRFUkxBQ0VfQlVGRkVSX1NUQVRFX1JGRjsKKyAgICAgIH0gZWxzZSBpZiAoR1NUX1ZJREVPX0ZSQU1FX0lTX09ORUZJRUxEIChmcmFtZSkpIHsKKyAgICAgICAgLyogdGMgdG9wIGlmIHRmZiwgdGMgYm90dG9tIG90aGVyd2lzZSAqLworICAgICAgICBpZiAoR1NUX1ZJREVPX0ZSQU1FX0lTX1RGRiAoZnJhbWUpKSB7CisgICAgICAgICAgKnN0YXRlID0gR1NUX0RFSU5URVJMQUNFX0JVRkZFUl9TVEFURV9UQ19UOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpzdGF0ZSA9IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfVENfQjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChHU1RfVklERU9fRlJBTUVfSVNfSU5URVJMQUNFRCAoZnJhbWUpKSB7CisgICAgICAgICpzdGF0ZSA9IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfVENfTTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpzdGF0ZSA9IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfVENfUDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGludGVybGFjaW5nX21vZGUgPT0gR1NUX1ZJREVPX0lOVEVSTEFDRV9NT0RFX0lOVEVSTEVBVkVEKSB7CisgICAgICAgICpzdGF0ZSA9IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfSTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpzdGF0ZSA9IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfUDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoaV9tb2RlKQorICAgICppX21vZGUgPSBpbnRlcmxhY2luZ19tb2RlOworfQorCisjZGVmaW5lIFNUQVRFX1RPX1NUUklORyhzKSAoKHMpID09IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfUCA/ICJQIiA6IFwKKyAgKHMpID09IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfSSA/ICJJIiA6IFwKKyAgKHMpID09IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfVENfQiA/ICJCIiA6IFwKKyAgKHMpID09IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfVENfVCA/ICJUIiA6IFwKKyAgKHMpID09IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfVENfUCA/ICJUQ1AiIDogXAorICAocykgPT0gR1NUX0RFSU5URVJMQUNFX0JVRkZFUl9TVEFURV9UQ19NID8gIlRDTSIgOiAiUkZGIikKKworI2RlZmluZSBNT0RFX1RPX1NUUklORyhtKSAoKG0pID09IEdTVF9WSURFT19JTlRFUkxBQ0VfTU9ERV9NSVhFRCA/ICJNSVhFRCIgOiBcCisgIChtKSA9PSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfSU5URVJMRUFWRUQgPyAiSSIgOiBcCisgIChtKSA9PSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfRklFTERTID8gIkZJRUxEUyIgOiAiUCIpCisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfcHVzaF9oaXN0b3J5IChHc3REZWludGVybGFjZSAqIHNlbGYsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgaW50IGkgPSAxOworICBHc3REZWludGVybGFjZUZpZWxkTGF5b3V0IGZpZWxkX2xheW91dCA9IHNlbGYtPmZpZWxkX2xheW91dDsKKyAgZ2Jvb2xlYW4gdGZmOworICBnYm9vbGVhbiBvbmVmaWVsZDsKKyAgR3N0VmlkZW9GcmFtZSAqZnJhbWUgPSBOVUxMOworICBHc3RWaWRlb0ZyYW1lICpmaWVsZDEsICpmaWVsZDIgPSBOVUxMOworICBndWludCBmaWVsZHNfdG9fcHVzaDsKKyAgZ3VpbnQgZmllbGQxX2ZsYWdzLCBmaWVsZDJfZmxhZ3M7CisgIEdzdFZpZGVvSW50ZXJsYWNlTW9kZSBpbnRlcmxhY2luZ19tb2RlOworICBndWludDggYnVmX3N0YXRlOworCisgIC8qIHdlIHdpbGwgb25seSByZWFkIGZyb20gdGhpcyBidWZmZXIgYW5kIHdyaXRlIGludG8gZnJlc2ggb3V0cHV0IGJ1ZmZlcnMKKyAgICogaWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIGNoYW5nZSB0aGUgbWFwIGZsYWdzIGFzIGFwcHJvcHJpYXRlCisgICAqLworICBmcmFtZSA9IGdzdF92aWRlb19mcmFtZV9uZXdfYW5kX21hcCAoJnNlbGYtPnZpbmZvLCBidWZmZXIsIEdTVF9NQVBfUkVBRCk7CisgIC8qIHdlIGNhbiBtYW5hZ2UgdGhlIGJ1ZmZlciByZWYgY291bnQgdXNpbmcgdGhlIG1hcHMgZnJvbSBoZXJlIG9uICovCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgdGZmID0gR1NUX1ZJREVPX0ZSQU1FX0lTX1RGRiAoZnJhbWUpOworICBvbmVmaWVsZCA9IEdTVF9WSURFT19GUkFNRV9JU19PTkVGSUVMRCAoZnJhbWUpOworICBmaWVsZHNfdG9fcHVzaCA9IChvbmVmaWVsZCkgPyAxIDogMjsKKworICBnX3JldHVybl9pZl9mYWlsIChzZWxmLT5oaXN0b3J5X2NvdW50IDwKKyAgICAgIEdTVF9ERUlOVEVSTEFDRV9NQVhfRklFTERfSElTVE9SWSAtIGZpZWxkc190b19wdXNoKTsKKworICBnc3RfZGVpbnRlcmxhY2VfZ2V0X2J1ZmZlcl9zdGF0ZSAoc2VsZiwgZnJhbWUsICZidWZfc3RhdGUsICZpbnRlcmxhY2luZ19tb2RlKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgIlB1c2hpbmcgbmV3IGZyYW1lIGFzICVkIGZpZWxkcyB0byB0aGUgaGlzdG9yeSAoY291bnQgYmVmb3JlICVkKTogcHRyICVwIGF0ICUiCisgICAgICBHU1RfVElNRV9GT1JNQVQgIiB3aXRoIGR1cmF0aW9uICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiwgc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCAiLCBzdGF0ZSAlcywgaW50ZXJsYWNpbmcgbW9kZSAlcyIsCisgICAgICBmaWVsZHNfdG9fcHVzaCwgc2VsZi0+aGlzdG9yeV9jb3VudCwgZnJhbWUsCisgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSksCisgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpKSwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlciksCisgICAgICBTVEFURV9UT19TVFJJTkcgKGJ1Zl9zdGF0ZSksIE1PREVfVE9fU1RSSU5HIChpbnRlcmxhY2luZ19tb2RlKSk7CisKKyAgLyogbW92ZSB1cCBmb3IgbmV3IHN0YXRlICovCisgIG1lbW1vdmUgKCZzZWxmLT5idWZfc3RhdGVzWzFdLCAmc2VsZi0+YnVmX3N0YXRlc1swXSwKKyAgICAgIChHU1RfREVJTlRFUkxBQ0VfTUFYX0JVRkZFUl9TVEFURV9ISVNUT1JZIC0gMSkgKgorICAgICAgc2l6ZW9mIChHc3REZWludGVybGFjZUJ1ZmZlclN0YXRlKSk7CisgIHNlbGYtPmJ1Zl9zdGF0ZXNbMF0uc3RhdGUgPSBidWZfc3RhdGU7CisgIHNlbGYtPmJ1Zl9zdGF0ZXNbMF0udGltZXN0YW1wID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcik7CisgIHNlbGYtPmJ1Zl9zdGF0ZXNbMF0uZHVyYXRpb24gPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpOworICBpZiAoc2VsZi0+c3RhdGVfY291bnQgPCBHU1RfREVJTlRFUkxBQ0VfTUFYX0JVRkZFUl9TVEFURV9ISVNUT1JZKQorICAgIHNlbGYtPnN0YXRlX2NvdW50Kys7CisKKyAgZm9yIChpID0gR1NUX0RFSU5URVJMQUNFX01BWF9GSUVMRF9ISVNUT1JZIC0gMTsgaSA+PSBmaWVsZHNfdG9fcHVzaDsgaS0tKSB7CisgICAgc2VsZi0+ZmllbGRfaGlzdG9yeVtpXS5mcmFtZSA9CisgICAgICAgIHNlbGYtPmZpZWxkX2hpc3RvcnlbaSAtIGZpZWxkc190b19wdXNoXS5mcmFtZTsKKyAgICBzZWxmLT5maWVsZF9oaXN0b3J5W2ldLmZsYWdzID0KKyAgICAgICAgc2VsZi0+ZmllbGRfaGlzdG9yeVtpIC0gZmllbGRzX3RvX3B1c2hdLmZsYWdzOworICB9CisKKyAgaWYgKGZpZWxkX2xheW91dCA9PSBHU1RfREVJTlRFUkxBQ0VfTEFZT1VUX0FVVE8pIHsKKyAgICBpZiAoIUdTVF9WSURFT19JTkZPX0lTX0lOVEVSTEFDRUQgKCZzZWxmLT52aW5mbykpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc2VsZiwgIkNhbid0IGRldGVjdCBmaWVsZCBsYXlvdXQgLS0gYXNzdW1pbmcgVEZGIik7CisgICAgICBmaWVsZF9sYXlvdXQgPSBHU1RfREVJTlRFUkxBQ0VfTEFZT1VUX1RGRjsKKyAgICB9IGVsc2UgaWYgKHRmZikgeworICAgICAgZmllbGRfbGF5b3V0ID0gR1NUX0RFSU5URVJMQUNFX0xBWU9VVF9URkY7CisgICAgfSBlbHNlIHsKKyAgICAgIGZpZWxkX2xheW91dCA9IEdTVF9ERUlOVEVSTEFDRV9MQVlPVVRfQkZGOworICAgIH0KKyAgfQorCisgIGZpZWxkMSA9IGZyYW1lOworICBmaWVsZDIgPSBnc3RfdmlkZW9fZnJhbWVfbmV3X2FuZF9tYXAgKCZzZWxmLT52aW5mbywgYnVmZmVyLCBHU1RfTUFQX1JFQUQpOworICBpZiAoZmllbGRfbGF5b3V0ID09IEdTVF9ERUlOVEVSTEFDRV9MQVlPVVRfVEZGKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlRvcCBmaWVsZCBmaXJzdCIpOworICAgIGZpZWxkMV9mbGFncyA9IFBJQ1RVUkVfSU5URVJMQUNFRF9UT1A7CisgICAgZmllbGQyX2ZsYWdzID0gUElDVFVSRV9JTlRFUkxBQ0VEX0JPVFRPTTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiQm90dG9tIGZpZWxkIGZpcnN0Iik7CisgICAgZmllbGQxX2ZsYWdzID0gUElDVFVSRV9JTlRFUkxBQ0VEX0JPVFRPTTsKKyAgICBmaWVsZDJfZmxhZ3MgPSBQSUNUVVJFX0lOVEVSTEFDRURfVE9QOworICB9CisKKyAgLyogU3dhcCBmb3IgcmV2ZXJzZSBwbGF5YmFjayAqLworICBpZiAoc2VsZi0+c2VnbWVudC5yYXRlIDwgMCkgeworICAgIGZpZWxkMV9mbGFncyA9IGZpZWxkMV9mbGFncyBeIGZpZWxkMl9mbGFnczsKKyAgICBmaWVsZDJfZmxhZ3MgPSBmaWVsZDFfZmxhZ3MgXiBmaWVsZDJfZmxhZ3M7CisgICAgZmllbGQxX2ZsYWdzID0gZmllbGQxX2ZsYWdzIF4gZmllbGQyX2ZsYWdzOworICB9CisKKyAgaWYgKCFvbmVmaWVsZCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJUd28gZmllbGRzIik7CisgICAgc2VsZi0+ZmllbGRfaGlzdG9yeVsxXS5mcmFtZSA9IGZpZWxkMTsKKyAgICBzZWxmLT5maWVsZF9oaXN0b3J5WzFdLmZsYWdzID0gZmllbGQxX2ZsYWdzOworCisgICAgc2VsZi0+ZmllbGRfaGlzdG9yeVswXS5mcmFtZSA9IGZpZWxkMjsKKyAgICBzZWxmLT5maWVsZF9oaXN0b3J5WzBdLmZsYWdzID0gZmllbGQyX2ZsYWdzOworICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBvbmVmaWVsZCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJPbmUgZmllbGQiKTsKKyAgICBzZWxmLT5maWVsZF9oaXN0b3J5WzBdLmZyYW1lID0gZmllbGQxOworICAgIHNlbGYtPmZpZWxkX2hpc3RvcnlbMF0uZmxhZ3MgPSBmaWVsZDFfZmxhZ3M7CisgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwX2FuZF9mcmVlIChmaWVsZDIpOworICB9CisKKyAgc2VsZi0+aGlzdG9yeV9jb3VudCArPSBmaWVsZHNfdG9fcHVzaDsKKyAgc2VsZi0+Y3VyX2ZpZWxkX2lkeCArPSBmaWVsZHNfdG9fcHVzaDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiUHVzaGVkIGJ1ZmZlciAtLSBjdXJyZW50IGhpc3Rvcnkgc2l6ZSAlZCwgaW5kZXggJWQiLAorICAgICAgc2VsZi0+aGlzdG9yeV9jb3VudCwgc2VsZi0+Y3VyX2ZpZWxkX2lkeCk7CisKKyAgaWYgKHNlbGYtPmxhc3RfYnVmZmVyKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKHNlbGYtPmxhc3RfYnVmZmVyKTsKKyAgc2VsZi0+bGFzdF9idWZmZXIgPSBnc3RfYnVmZmVyX3JlZiAoYnVmZmVyKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV91cGRhdGVfcW9zIChHc3REZWludGVybGFjZSAqIHNlbGYsIGdkb3VibGUgcHJvcG9ydGlvbiwKKyAgICBHc3RDbG9ja1RpbWVEaWZmIGRpZmYsIEdzdENsb2NrVGltZSB0aW1lc3RhbXApCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAiVXBkYXRpbmcgUW9TOiBwcm9wb3J0aW9uICVsZiwgZGlmZiAlIiBHU1RfU1RJTUVfRk9STUFUICIsIHRpbWVzdGFtcCAlIgorICAgICAgR1NUX1RJTUVfRk9STUFULCBwcm9wb3J0aW9uLCBHU1RfU1RJTUVfQVJHUyAoZGlmZiksCisgICAgICBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHNlbGYpOworICBzZWxmLT5wcm9wb3J0aW9uID0gcHJvcG9ydGlvbjsKKyAgaWYgKEdfTElLRUxZICh0aW1lc3RhbXAgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkpIHsKKyAgICBpZiAoR19VTkxJS0VMWSAoZGlmZiA+IDApKQorICAgICAgc2VsZi0+ZWFybGllc3RfdGltZSA9CisgICAgICAgICAgdGltZXN0YW1wICsgMiAqIGRpZmYgKyAoKHNlbGYtPmZpZWxkcyA9PQorICAgICAgICAgICAgICBHU1RfREVJTlRFUkxBQ0VfQUxMKSA/IHNlbGYtPmZpZWxkX2R1cmF0aW9uIDogMiAqCisgICAgICAgICAgc2VsZi0+ZmllbGRfZHVyYXRpb24pOworICAgIGVsc2UKKyAgICAgIHNlbGYtPmVhcmxpZXN0X3RpbWUgPSB0aW1lc3RhbXAgKyBkaWZmOworICB9IGVsc2UgeworICAgIHNlbGYtPmVhcmxpZXN0X3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChzZWxmKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9yZXNldF9xb3MgKEdzdERlaW50ZXJsYWNlICogc2VsZikKK3sKKyAgZ3N0X2RlaW50ZXJsYWNlX3VwZGF0ZV9xb3MgKHNlbGYsIDAuNSwgMCwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgIHNlbGYtPnByb2Nlc3NlZCA9IDA7CisgIHNlbGYtPmRyb3BwZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX3JlYWRfcW9zIChHc3REZWludGVybGFjZSAqIHNlbGYsIGdkb3VibGUgKiBwcm9wb3J0aW9uLAorICAgIEdzdENsb2NrVGltZSAqIHRpbWUpCit7CisgIEdTVF9PQkpFQ1RfTE9DSyAoc2VsZik7CisgICpwcm9wb3J0aW9uID0gc2VsZi0+cHJvcG9ydGlvbjsKKyAgKnRpbWUgPSBzZWxmLT5lYXJsaWVzdF90aW1lOworICBHU1RfT0JKRUNUX1VOTE9DSyAoc2VsZik7Cit9CisKKy8qIFBlcmZvcm0gcW9zIGNhbGN1bGF0aW9ucyBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgbmV4dCBmcmFtZS4gUmV0dXJucyBUUlVFIGlmCisgKiB0aGUgZnJhbWUgc2hvdWxkIGJlIHByb2Nlc3NlZCwgRkFMU0UgaWYgdGhlIGZyYW1lIGNhbiBiZSBkcm9wcGVkIGVudGlyZWx5ICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGFjZV9kb19xb3MgKEdzdERlaW50ZXJsYWNlICogc2VsZiwgY29uc3QgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RDbG9ja1RpbWUgcW9zdGltZSwgZWFybGllc3RfdGltZTsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpOworICBnZG91YmxlIHByb3BvcnRpb247CisKKyAgLyogbm8gdGltZXN0YW1wLCBjYW4ndCBkbyBRb1MgPT4gcHJvY2VzcyBmcmFtZSAqLworICBpZiAoR19VTkxJS0VMWSAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEICh0aW1lc3RhbXApKSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChzZWxmLCAiaW52YWxpZCB0aW1lc3RhbXAsIGNhbid0IGRvIFFvUywgcHJvY2VzcyBmcmFtZSIpOworICAgIGdvdG8ga2VlcF9mcmFtZTsKKyAgfQorCisgIC8qIGdldCBsYXRlc3QgUW9TIG9ic2VydmF0aW9uIHZhbHVlcyAqLworICBnc3RfZGVpbnRlcmxhY2VfcmVhZF9xb3MgKHNlbGYsICZwcm9wb3J0aW9uLCAmZWFybGllc3RfdGltZSk7CisKKyAgLyogc2tpcCBxb3MgaWYgd2UgaGF2ZSBubyBvYnNlcnZhdGlvbiAoeWV0KSA9PiBwcm9jZXNzIGZyYW1lICovCisgIGlmIChHX1VOTElLRUxZICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGVhcmxpZXN0X3RpbWUpKSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChzZWxmLCAibm8gb2JzZXJ2YXRpb24geWV0LCBwcm9jZXNzIGZyYW1lIik7CisgICAgZ290byBrZWVwX2ZyYW1lOworICB9CisKKyAgLyogcW9zIGlzIGRvbmUgb24gcnVubmluZyB0aW1lICovCisgIHFvc3RpbWUgPSBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZzZWxmLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICB0aW1lc3RhbXApOworCisgIC8qIHNlZSBob3cgb3VyIG5leHQgdGltZXN0YW1wIHJlbGF0ZXMgdG8gdGhlIGxhdGVzdCBxb3MgdGltZXN0YW1wICovCisgIEdTVF9MT0dfT0JKRUNUIChzZWxmLCAicW9zdGltZSAlIiBHU1RfVElNRV9GT1JNQVQgIiwgZWFybGllc3QgJSIKKyAgICAgIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAocW9zdGltZSksIEdTVF9USU1FX0FSR1MgKGVhcmxpZXN0X3RpbWUpKTsKKworICBpZiAocW9zdGltZSAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FICYmIHFvc3RpbWUgPD0gZWFybGllc3RfdGltZSkgeworICAgIEdzdENsb2NrVGltZSBzdHJlYW1fdGltZSwgaml0dGVyOworICAgIEdzdE1lc3NhZ2UgKnFvc19tc2c7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAid2UgYXJlIGxhdGUsIGRyb3AgZnJhbWUiKTsKKyAgICBzZWxmLT5kcm9wcGVkKys7CisgICAgc3RyZWFtX3RpbWUgPQorICAgICAgICBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJnNlbGYtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgdGltZXN0YW1wKTsKKyAgICBqaXR0ZXIgPSBHU1RfQ0xPQ0tfRElGRiAocW9zdGltZSwgZWFybGllc3RfdGltZSk7CisgICAgcW9zX21zZyA9CisgICAgICAgIGdzdF9tZXNzYWdlX25ld19xb3MgKEdTVF9PQkpFQ1QgKHNlbGYpLCBGQUxTRSwgcW9zdGltZSwgc3RyZWFtX3RpbWUsCisgICAgICAgIHRpbWVzdGFtcCwgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSk7CisgICAgZ3N0X21lc3NhZ2Vfc2V0X3Fvc192YWx1ZXMgKHFvc19tc2csIGppdHRlciwgcHJvcG9ydGlvbiwgMTAwMDAwMCk7CisgICAgZ3N0X21lc3NhZ2Vfc2V0X3Fvc19zdGF0cyAocW9zX21zZywgR1NUX0ZPUk1BVF9CVUZGRVJTLAorICAgICAgICBzZWxmLT5wcm9jZXNzZWQsIHNlbGYtPmRyb3BwZWQpOworICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKHNlbGYpLCBxb3NfbXNnKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAoc2VsZiwgInByb2Nlc3MgZnJhbWUiKTsKK2tlZXBfZnJhbWU6CisgIHNlbGYtPnByb2Nlc3NlZCsrOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZGVpbnRlcmxhY2VfZml4X3RpbWVzdGFtcHMgKEdzdERlaW50ZXJsYWNlICogc2VsZiwKKyAgICBHc3RWaWRlb0ZyYW1lICogZmllbGQxLCBHc3RWaWRlb0ZyYW1lICogZmllbGQyKQoreworICBHc3RWaWRlb0ZyYW1lICpmaWVsZDMsICpmaWVsZDQ7CisgIEdzdFZpZGVvSW50ZXJsYWNlTW9kZSBpbnRlcmxhY2luZ19tb2RlOworCisgIC8qIEZJWE1FOiBUaGlzIGlzIGJyb2tlbiBmb3IgcmF0ZSA8IDAgKi8KKyAgaWYgKHNlbGYtPnBhdHRlcm5fbG9jayAmJiBzZWxmLT5wYXR0ZXJuID4gLTEpIHsKKyAgICAvKiBhY2N1cmF0ZSBwYXR0ZXJuLWxvY2tlZCB0aW1lc3RhbXAgYWRqdXN0bWVudCAqLworICAgIGlmICghc2VsZi0+cGF0dGVybl9jb3VudCkKKyAgICAgIGdzdF9kZWludGVybGFjZV91cGRhdGVfcGF0dGVybl90aW1lc3RhbXBzIChzZWxmKTsKKworICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChmaWVsZDEtPmJ1ZmZlcikgPQorICAgICAgICBzZWxmLT5wYXR0ZXJuX2Jhc2VfdHMgKyBzZWxmLT5vdXRwdXRfY291bnQgKiBzZWxmLT5wYXR0ZXJuX2J1Zl9kdXI7CisgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoZmllbGQxLT5idWZmZXIpID0gc2VsZi0+cGF0dGVybl9idWZfZHVyOworICAgIHNlbGYtPm91dHB1dF9jb3VudCsrOworICB9IGVsc2UgeworICAgIC8qIG5haXZlIChidXQgbG93LWxhdGVuY3kpIHRpbWVzdGFtcCBhZGp1c3RtZW50IGJhc2VkIG9uIHN1YnNlcXVlbnQKKyAgICAgKiBmaWVsZHMvYnVmZmVycyAqLworICAgIGlmIChmaWVsZDIKKyAgICAgICAgJiYgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZpZWxkMSwKKyAgICAgICAgICAgIDApICE9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmaWVsZDIsIDApKSB7CisgICAgICBpZiAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGZpZWxkMS0+YnVmZmVyKSArCisgICAgICAgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoZmllbGQxLT5idWZmZXIpID09CisgICAgICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGZpZWxkMi0+YnVmZmVyKSkgeworICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoZmllbGQxLT5idWZmZXIpID0KKyAgICAgICAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChmaWVsZDItPmJ1ZmZlcikgPQorICAgICAgICAgICAgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChmaWVsZDEtPmJ1ZmZlcikgKworICAgICAgICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGZpZWxkMi0+YnVmZmVyKSkgLyAyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGZpZWxkMi0+YnVmZmVyKSA9CisgICAgICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoZmllbGQxLT5idWZmZXIpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzZWxmLT5oaXN0b3J5X2NvdW50IDwgMykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIk5lZWQgbW9yZSBmaWVsZHMgKGhhdmUgJWQsIG5lZWQgMykiLAorICAgICAgICAgIHNlbGYtPmhpc3RvcnlfY291bnQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGZpZWxkMyA9IHNlbGYtPmZpZWxkX2hpc3Rvcnlbc2VsZi0+aGlzdG9yeV9jb3VudCAtIDNdLmZyYW1lOworICAgIGludGVybGFjaW5nX21vZGUgPSBHU1RfVklERU9fSU5GT19JTlRFUkxBQ0VfTU9ERSAoJmZpZWxkMy0+aW5mbyk7CisgICAgaWYgKElTX1RFTEVDSU5FIChpbnRlcmxhY2luZ19tb2RlKSkgeworICAgICAgaWYgKHNlbGYtPmhpc3RvcnlfY291bnQgPCA0KSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJOZWVkIG1vcmUgZmllbGRzIChoYXZlICVkLCBuZWVkIDQpIiwKKyAgICAgICAgICAgIHNlbGYtPmhpc3RvcnlfY291bnQpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisKKyAgICAgIGZpZWxkNCA9IHNlbGYtPmZpZWxkX2hpc3Rvcnlbc2VsZi0+aGlzdG9yeV9jb3VudCAtIDRdLmZyYW1lOworICAgICAgaWYgKEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmaWVsZDMsCisgICAgICAgICAgICAgIDApICE9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmaWVsZDQsIDApKSB7CisgICAgICAgIC8qIHRlbGVjaW5lIGZpZWxkcyBpbiBzZXBhcmF0ZSBidWZmZXJzICovCisgICAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChmaWVsZDMtPmJ1ZmZlcikgPQorICAgICAgICAgICAgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChmaWVsZDMtPmJ1ZmZlcikgKworICAgICAgICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGZpZWxkNC0+YnVmZmVyKSkgLyAyOworICAgICAgfQorICAgIH0KKworICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGZpZWxkMS0+YnVmZmVyKSA9CisgICAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChmaWVsZDMtPmJ1ZmZlcikgLQorICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoZmllbGQxLT5idWZmZXIpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwKKyAgICAgICJGaWVsZCAxIGFkanVzdGVkIHRvIHRzICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBkdXIgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGZpZWxkMS0+YnVmZmVyKSksCisgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RVUkFUSU9OIChmaWVsZDEtPmJ1ZmZlcikpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfZ2V0X3BhdHRlcm5fbG9jayAoR3N0RGVpbnRlcmxhY2UgKiBzZWxmLCBnYm9vbGVhbiAqIGZsdXNoX29uZSkKK3sKKyAgLyogbG9vcCBvdmVyIGFsbCBwb3NzaWJsZSBwYXR0ZXJucyBhbmQgYWxsIHBvc3NpYmxlIHBoYXNlcworICAgKiBnaXZpbmcgZWFjaCBhIHNjb3JlLiB0aGUgaGlnaGVzdCBzY29yZSBnZXRzIHRoZSBsb2NrICovCisgIC8qIHRoZSBzY29yZSBpcyBjYWxjdWxhdGVkIGFzIHRoZSBudW1iZXIgb2YgbWF0Y2hlZCBidWZmZXJzIGluIHRoZQorICAgKiBzZXF1ZW5jZSBzdGFydGluZyBhdCB0aGUgcGhhc2Ugb2Zmc2V0IHdpdGggdGhvc2UgZnJvbSB0aGUgaGlzdG9yeQorICAgKiB0aGVuIHRoZSBsb25nZXN0IGR1cmF0aW9uIHBhdHRlcm4gbWF0Y2ggaXMgdGFrZW4uIGlmIHRoZXJlIGlzIG1vcmUgdGhhbgorICAgKiBvbmUgcGF0dGVybiBtYXRjaGluZyBhbGwgYnVmZmVycywgd2UgdGFrZSB0aGUgbG9uZ2VzdCBwYXR0ZXJuIG9mIHRob3NlLgorICAgKiBtYXRjaGVzIHRvIGNvbXBsZXRlIHBhdHRlcm5zIGFyZSBwcmVmZXJyZWQuIGlmIG5vIG5vbi10cml2aWFsIHBhdHRlcm4gaXMKKyAgICogbWF0Y2hlZCwgdHJpdmlhbCBwYXR0ZXJucyBhcmUgdGVzdGVkLiAqLworICBnaW50IGksIGosIGssIHNjb3JlLCBwYXR0ZXJuLCBwaGFzZTsKKyAgY29uc3QgZ2ludCBzdGF0ZV9jb3VudCA9IHNlbGYtPnN0YXRlX2NvdW50OworICBjb25zdCBnaW50IG5fcmVxdWlyZWQgPSBzZWxmLT5pZ25vcmVfb2JzY3VyZSA/CisgICAgICBHU1RfREVJTlRFUkxBQ0VfT0JTQ1VSRV9USFJFU0hPTEQgOgorICAgICAgR1NUX0RFSU5URVJMQUNFX01BWF9CVUZGRVJfU1RBVEVfSElTVE9SWTsKKworICAvKiBzZXQgdW5rbm93biBwYXR0ZXJuIGFzIHRoaXMgaXMgdXNlZCBpbiBsb2dpYyBvdXRzaWRlIHRoaXMgZnVuY3Rpb24gKi8KKyAgc2VsZi0+cGF0dGVybiA9IC0xOworCisgIC8qIHdhaXQgZm9yIG1vcmUgYnVmZmVycyAqLworICBpZiAoIXNlbGYtPmhhdmVfZW9zICYmIHN0YXRlX2NvdW50IDwgbl9yZXF1aXJlZCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJOZWVkIG1vcmUgYnVmZmVycyBpbiBzdGF0ZSBoaXN0b3J5IC0gJWQvJWQiLAorICAgICAgICBzdGF0ZV9jb3VudCwgbl9yZXF1aXJlZCk7CisgICAgcmV0dXJuOworICB9CisKKyAgc2NvcmUgPSBwYXR0ZXJuID0gcGhhc2UgPSAtMTsKKworICAvKiBsb29wIG92ZXIgYWxsIHBhdHRlcm5zICovCisgIGZvciAoaSA9IDA7IGkgPCBHX05fRUxFTUVOVFMgKHRlbGVjaW5lX3BhdHRlcm5zKTsgaSsrKSB7CisgICAgY29uc3QgZ3VpbnQ4IGxlbmd0aCA9IHRlbGVjaW5lX3BhdHRlcm5zW2ldLmxlbmd0aDsKKworICAgIGlmIChzZWxmLT5pZ25vcmVfb2JzY3VyZSAmJiBpID49IEdTVF9ERUlOVEVSTEFDRV9PQlNDVVJFX1RIUkVTSE9MRCkKKyAgICAgIGJyZWFrOworCisgICAgaWYgKHN0YXRlX2NvdW50IDwgbGVuZ3RoKQorICAgICAgY29udGludWU7CisKKyAgICAvKiBsb29wIG92ZXIgYWxsIHBoYXNlcyAqLworICAgIGZvciAoaiA9IDA7IGogPCBsZW5ndGg7IGorKykgeworICAgICAgLyogbG93LWxhdGVuY3kgbW9kZSBsb29rcyBhdCBwYXN0IGJ1ZmZlcnMsIGhpZ2ggbGF0ZW5jeSBhdCBmdXR1cmUgYnVmZmVycyAqLworICAgICAgY29uc3QgZ2ludCBzdGF0ZV9pZHggPQorICAgICAgICAgIHNlbGYtPmxvd19sYXRlbmN5ID8gKHNlbGYtPmhpc3RvcnlfY291bnQgLSAxKSA+PiAxIDogc3RhdGVfY291bnQgLSAxOworICAgICAgLyogbG9vcCBvdmVyIGhpc3RvcnksIGJyZWFraW5nIG9uIGRpZmZlcmluZyBidWZmZXIgc3RhdGVzICovCisgICAgICBmb3IgKGsgPSAwOyBrIDwgbGVuZ3RoICYmIGsgPCBzdGF0ZV9jb3VudDsgaysrKSB7CisgICAgICAgIGNvbnN0IGd1aW50OCBoaXN0ID0gc2VsZi0+YnVmX3N0YXRlc1tzdGF0ZV9pZHggLSBrXS5zdGF0ZTsKKyAgICAgICAgY29uc3QgZ3VpbnQ4IHBhdHQgPSB0ZWxlY2luZV9wYXR0ZXJuc1tpXS5zdGF0ZXNbKGogKyBrKSAlIGxlbmd0aF07CisgICAgICAgIGlmICghKGhpc3QgJiBwYXR0KSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLyogbWFrZSBjb21wbGV0ZSBtYXRjaGVzIG1vcmUgc2lnbmZpY2FudCAqLworICAgICAgaWYgKGsgPT0gbGVuZ3RoKQorICAgICAgICBrICs9IEdTVF9ERUlOVEVSTEFDRV9NQVhfQlVGRkVSX1NUQVRFX0hJU1RPUlk7CisKKyAgICAgIC8qIHRha2UgYXMgbmV3IGJlc3QgcGF0dGVybiBpZiB0aGUgbnVtYmVyIG9mIG1hdGNoZWQgYnVmZmVycyBpcyBtb3JlIHRoYW4KKyAgICAgICAqIGZvciBvdGhlciBwYXR0ZXJucyAqLworICAgICAgaWYgKGsgPiBzY29yZSkgeworICAgICAgICBzY29yZSA9IGs7CisgICAgICAgIHBhdHRlcm4gPSBpOworICAgICAgICBwaGFzZSA9IGo7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKHBhdHRlcm4gPCAwKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzZWxmLCAiRmFpbGVkIHRvIHNlbGVjdCBhIHBhdHRlcm4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgIkZpbmFsIHBhdHRlcm4gbWF0Y2ggcmVzdWx0OiBwYSAlZCwgcGggJWQsIGwgJWQsIHMgJWQiLCBwYXR0ZXJuLCBwaGFzZSwKKyAgICAgIHRlbGVjaW5lX3BhdHRlcm5zW3BhdHRlcm5dLmxlbmd0aCwgc2NvcmUpOworICBzZWxmLT5wYXR0ZXJuID0gcGF0dGVybjsKKyAgc2VsZi0+cGF0dGVybl9waGFzZSA9IHBoYXNlOworICBzZWxmLT5wYXR0ZXJuX2NvdW50ID0gMDsKKyAgc2VsZi0+b3V0cHV0X2NvdW50ID0gMDsKKyAgc2VsZi0+cGF0dGVybl9sb2NrID0gVFJVRTsKKworICBmb3IgKGkgPSAwOyBpIDwgdGVsZWNpbmVfcGF0dGVybnNbcGF0dGVybl0ubGVuZ3RoOyBpKyspIHsKKyAgICBnaW50IHN0YXRlX2lkeCA9CisgICAgICAgIHNlbGYtPmxvd19sYXRlbmN5ID8gKHNlbGYtPmhpc3RvcnlfY291bnQgLSAxKSA+PiAxIDogc2VsZi0+c3RhdGVfY291bnQgLQorICAgICAgICAxOworICAgIHN0YXRlX2lkeCAtPSBpOworICAgIEdTVF9MT0dfT0JKRUNUIChzZWxmLCAiYnVmWyVkXSAlcyIsIGksCisgICAgICAgIFNUQVRFX1RPX1NUUklORyAoc2VsZi0+YnVmX3N0YXRlc1tzdGF0ZV9pZHhdLnN0YXRlKSk7CisgIH0KKworICAvKiBjaGVjayBmb3IgdGhlIGNhc2UgdGhhdCB0aGUgZmlyc3QgZmllbGQgb2YgdGhlIHBhdHRlcm4gaXMgYW4gb3JwaGFuICovCisgIGlmIChwYXR0ZXJuID4gMQorICAgICAgJiYgdGVsZWNpbmVfcGF0dGVybnNbcGF0dGVybl0uc3RhdGVzW3BoYXNlXSAmIChHU1RfT05FIHwgR1NUX0lOVCkpIHsKKyAgICBnaW50IGkgPSBwaGFzZSwgZmllbGRfY291bnQgPSAwOworICAgIGd1aW50OCBzdGF0ZSA9IHRlbGVjaW5lX3BhdHRlcm5zW3BhdHRlcm5dLnN0YXRlc1tpXTsKKworICAgIGRvIHsKKyAgICAgIGlmIChzdGF0ZSAmIEdTVF9PTkUpIHsKKyAgICAgICAgZmllbGRfY291bnQrKzsKKyNpZiAwCisgICAgICB9IGVsc2UgaWYgKCEoc3RhdGUgJiBHU1RfRFJQKSkgeworI2VuZGlmCisgICAgICB9IGVsc2UgeworICAgICAgICBmaWVsZF9jb3VudCArPSAyOworICAgICAgfQorICAgICAgaSsrOworICAgICAgaSAlPSB0ZWxlY2luZV9wYXR0ZXJuc1twYXR0ZXJuXS5sZW5ndGg7CisgICAgICBzdGF0ZSA9IHRlbGVjaW5lX3BhdHRlcm5zW3BhdHRlcm5dLnN0YXRlc1tpXTsKKyAgICB9IHdoaWxlICghKHN0YXRlICYgR1NUX1BSRykpOworCisgICAgLyogaWYgZmllbGRfY291bnQgaXMgb2RkLCB3ZSBoYXZlIGFuIG9ycGhhbiBmaWVsZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAgICAqIHNlcXVlbmNlCisgICAgICogbm90ZSAtIGRvbid0IGRvIHRoaXMgaW4gbG93LWxhdGVuY3kgbW9kZSBhcyB3ZSBhcmUgc29tZXdoZXJlIHdpdGhpbiB0aGUKKyAgICAgKiBwYXR0ZXJuIGFscmVhZHkgKi8KKyAgICBpZiAoIXNlbGYtPmxvd19sYXRlbmN5ICYmICgqZmx1c2hfb25lID0gZmllbGRfY291bnQgJiAxKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIk9ycGhhbiBmaWVsZCBkZXRlY3RlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSAiCisgICAgICAgICAgInBhdHRlcm4gLSBpdCB3aWxsIGJlIGRlaW50ZXJsYWNlZC4iKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9kZWludGVybGFjZV9vdXRwdXRfZnJhbWUgKEdzdERlaW50ZXJsYWNlICogc2VsZiwgZ2Jvb2xlYW4gZmx1c2hpbmcpCit7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBnaW50IGZpZWxkc19yZXF1aXJlZDsKKyAgR3N0QnVmZmVyICpidWYsICpvdXRidWY7CisgIEdzdFZpZGVvRnJhbWUgKm91dGZyYW1lID0gTlVMTDsKKyAgR3N0RGVpbnRlcmxhY2VGaWVsZCAqZmllbGQxLCAqZmllbGQyOworICBHc3RWaWRlb0ludGVybGFjZU1vZGUgaW50ZXJsYWNpbmdfbW9kZTsKKyAgZ3VpbnQ4IGJ1Zl9zdGF0ZTsKKyAgZ2Jvb2xlYW4gaGxfbm9fbG9jazsgICAgICAgICAgLyogaW5kaWNhdGVzIGhpZ2ggbGF0ZW5jeSB0aW1lc3RhbXAgYWRqdXN0bWVudCBidXQgbm8gcGF0dGVybiBsb2NrIChjb3VsZCBiZSBPTkVGIG9yIEkpICovCisgIGdib29sZWFuIHNhbWVfYnVmZmVyOyAgICAgICAgIC8qIGFyZSBmaWVsZDEgYW5kIGZpZWxkMiBpbiB0aGUgc2FtZSBidWZmZXI/ICovCisgIGdib29sZWFuIGZsdXNoX29uZTsgICAgICAgICAgIC8qIHVzZWQgZm9yIGZsdXNoaW5nIG9uZSBmaWVsZCB3aGVuIGluIGhpZ2ggbGF0ZW5jeSBtb2RlIGFuZCBub3QgbG9ja2VkICovCisgIFRlbGVjaW5lUGF0dGVybiBwYXR0ZXJuOworICBndWludDggcGhhc2UsIGNvdW50OworICBjb25zdCBHc3REZWludGVybGFjZUxvY2tpbmcgbG9ja2luZyA9IHNlbGYtPmxvY2tpbmc7CisKKyAgbWVtc2V0ICgmcGF0dGVybiwgMCwgc2l6ZW9mIChwYXR0ZXJuKSk7CisKK3Jlc3RhcnQ6CisgIHJldCA9IEdTVF9GTE9XX09LOworICBobF9ub19sb2NrID0gRkFMU0U7CisgIGZsdXNoX29uZSA9IEZBTFNFOworICBzZWxmLT5uZWVkX21vcmUgPSBGQUxTRTsKKyAgcGhhc2UgPSBzZWxmLT5wYXR0ZXJuX3BoYXNlOworICBjb3VudCA9IHNlbGYtPnBhdHRlcm5fY291bnQ7CisKKyAgaWYgKCFzZWxmLT5oaXN0b3J5X2NvdW50KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkhpc3RvcnkgaXMgZW1wdHksIHdhaXRpbmcgZm9yIG1vcmUgYnVmZmVycyEiKTsKKyAgICBnb3RvIG5lZWRfbW9yZTsKKyAgfQorCisgIGZpZWxkMSA9ICZzZWxmLT5maWVsZF9oaXN0b3J5W3NlbGYtPmhpc3RvcnlfY291bnQgLSAxXTsKKworICBpZiAobG9ja2luZyAhPSBHU1RfREVJTlRFUkxBQ0VfTE9DS0lOR19OT05FKSB7CisgICAgR3N0Q2FwcyAqc2lua2NhcHM7CisKKyAgICBpZiAoIXNlbGYtPnN0YXRlX2NvdW50KSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLAorICAgICAgICAgICJCUk9LRU4hIEZpZWxkcyBpbiBoaXN0b3J5ICsgbm8gc3RhdGVzIHNob3VsZCBub3QgaGFwcGVuISIpOworICAgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICAgIH0KKworICAgIGdzdF9kZWludGVybGFjZV9nZXRfYnVmZmVyX3N0YXRlIChzZWxmLCBmaWVsZDEtPmZyYW1lLCAmYnVmX3N0YXRlLAorICAgICAgICAmaW50ZXJsYWNpbmdfbW9kZSk7CisKKyAgICBpZiAoc2VsZi0+cGF0dGVybiAhPSAtMSkKKyAgICAgIHBhdHRlcm4gPSB0ZWxlY2luZV9wYXR0ZXJuc1tzZWxmLT5wYXR0ZXJuXTsKKworICAgIC8qIHBhdHRlcm5zIDAgYW5kIDEgYXJlIGludGVybGFjZWQsIHRoZSByZXN0IGFyZSB0ZWxlY2luZSAqLworICAgIGlmIChzZWxmLT5wYXR0ZXJuID4gMSkKKyAgICAgIGludGVybGFjaW5nX21vZGUgPSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfTUlYRUQ7CisKKyAgICBpZiAoc2VsZi0+cGF0dGVybiA9PSAtMSB8fCBzZWxmLT5wYXR0ZXJuX3JlZnJlc2gKKyAgICAgICAgfHwgIShidWZfc3RhdGUgJiBwYXR0ZXJuLnN0YXRlc1socGhhc2UgKyBjb3VudCkgJSBwYXR0ZXJuLmxlbmd0aF0pKSB7CisgICAgICBpZiAoc2VsZi0+cGF0dGVybiA9PSAtMSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiTm8gcGF0dGVybiBsb2NrIC0gcmVmcmVzaCBsb2NrIik7CisgICAgICB9IGVsc2UgaWYgKHNlbGYtPnBhdHRlcm5fcmVmcmVzaCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiUGF0dGVybiByZWZyZXNoIC0gcmVmcmVzaCBsb2NrIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiVW5leHBlY3RlZCBidWZmZXIgc3RhdGUgLSByZWZyZXNoIGxvY2siKTsKKyAgICAgIH0KKyAgICAgIC8qIG5vIHBhdHRlcm4sIHBhdHRlcm4gcmVmcmVzaCBzZXQgb3IgdW5leHBlY3RlZCBidWZmZXIgc3RhdGUgKi8KKyAgICAgIHNlbGYtPnBhdHRlcm5fbG9jayA9IEZBTFNFOworICAgICAgc2VsZi0+cGF0dGVybl9yZWZyZXNoID0gVFJVRTsKKworICAgICAgLyogcmVmcmVzaCBwYXR0ZXJuIGxvY2sgKi8KKyAgICAgIGdzdF9kZWludGVybGFjZV9nZXRfcGF0dGVybl9sb2NrIChzZWxmLCAmZmx1c2hfb25lKTsKKworICAgICAgaWYgKHNlbGYtPnBhdHRlcm4gIT0gLTEpIHsKKyAgICAgICAgLyogbG9ja2VkIG9udG8gYSB2YWxpZCBwYXR0ZXJuIHNvIHJlZnJlc2ggY29tcGxldGUgKi8KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlBhdHRlcm4gbG9ja2VkISAlcyBzdGFydGluZyBhdCAlZCIsCisgICAgICAgICAgICB0ZWxlY2luZV9wYXR0ZXJuc1tzZWxmLT5wYXR0ZXJuXS5uaWNrLCBzZWxmLT5wYXR0ZXJuX3BoYXNlKTsKKyAgICAgICAgc2VsZi0+cGF0dGVybl9yZWZyZXNoID0gRkFMU0U7CisgICAgICB9IGVsc2UgaWYgKCFzZWxmLT5sb3dfbGF0ZW5jeSkgeworICAgICAgICBpZiAoIXNlbGYtPnBhdHRlcm5fbG9jaykgeworICAgICAgICAgIGdvdG8gbmVlZF9tb3JlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGhsX25vX2xvY2sgPSBUUlVFOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIHNldGNhcHMgb24gc2luayBhbmQgc3JjIHBhZHMgKi8KKyAgICAgIHNpbmtjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChzZWxmLT5zaW5rcGFkKTsKKyAgICAgIGlmICghc2lua2NhcHMgfHwgIWdzdF9kZWludGVybGFjZV9zZXRjYXBzIChzZWxmLCBzZWxmLT5zaW5rcGFkLCBzaW5rY2FwcykpIHsKKyAgICAgICAgaWYgKHNpbmtjYXBzKQorICAgICAgICAgIGdzdF9jYXBzX3VucmVmIChzaW5rY2Fwcyk7CisgICAgICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICAgIH0KKworICAgICAgZ3N0X2NhcHNfdW5yZWYgKHNpbmtjYXBzKTsKKworICAgICAgaWYgKGZsdXNoX29uZSAmJiBzZWxmLT5kcm9wX29ycGhhbnMpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkRyb3BwaW5nIG9ycGhhbiBmaXJzdCBmaWVsZCIpOworICAgICAgICBzZWxmLT5jdXJfZmllbGRfaWR4LS07CisgICAgICAgIGdzdF92aWRlb19mcmFtZV91bm1hcF9hbmRfZnJlZSAoZ3N0X2RlaW50ZXJsYWNlX3BvcF9oaXN0b3J5IChzZWxmKSk7CisgICAgICAgIGdvdG8gcmVzdGFydDsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ3N0X2RlaW50ZXJsYWNlX2dldF9idWZmZXJfc3RhdGUgKHNlbGYsIGZpZWxkMS0+ZnJhbWUsIE5VTEwsCisgICAgICAgICZpbnRlcmxhY2luZ19tb2RlKTsKKyAgfQorCisgIHNhbWVfYnVmZmVyID0gc2VsZi0+aGlzdG9yeV9jb3VudCA+PSAyCisgICAgICAmJiAoR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZpZWxkMS0+ZnJhbWUsIDApID09CisgICAgICBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc2VsZi0+ZmllbGRfaGlzdG9yeVtzZWxmLT5oaXN0b3J5X2NvdW50IC0KKyAgICAgICAgICAgICAgMl0uZnJhbWUsIDApKTsKKworICBpZiAoKGZsdXNoaW5nICYmIHNlbGYtPmhpc3RvcnlfY291bnQgPT0gMSkgfHwgKGZsdXNoX29uZQorICAgICAgICAgICYmICFzZWxmLT5kcm9wX29ycGhhbnMpIHx8IChobF9ub19sb2NrICYmIChzZWxmLT5oaXN0b3J5X2NvdW50ID09IDEKKyAgICAgICAgICAgICAgfHwgIXNhbWVfYnVmZmVyKSkpIHsKKyAgICAvKiBUaGlzIGNhc2UgaXMgZm9yIGZsdXNoaW5nIGEgc2luZ2xlIGZpZWxkOgorICAgICAqIC0gZmx1c2hpbmcgYW5kIDEgZmllbGQgaW4gdGhlIGhpc3RvcnkKKyAgICAgKiAtIGZsdXNoIG9uZSAoZHVlIHRvIG9ycGhhbnMgaW4gdGhlIHBhdHRlcm4pIGFuZCBkbyBub3QgZHJvcCBvcnBoYW5zCisgICAgICogLSBoaWdoLWxhdGVuY3kgcGF0dGVybiBsb2NraW5nIHdpdGggbm8gcG9zc2libGUgbG9jayBnaXZlbiB0aGUgY3VycmVudAorICAgICAqICAgc3RhdGUgYW5kIGVpdGhlciBvbmx5IG9uZSBmaWVsZCBpbiB0aGUgaGlzdG9yeSBvciB0aGUgdGlwIHR3byBmaWVsZHMKKyAgICAgKiAgIGFyZSBpbiBzZXBhcmF0ZSBidWZmZXJzICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkZsdXNoaW5nIG9uZSBmaWVsZCB1c2luZyBsaW5lYXIgbWV0aG9kIik7CisgICAgZ3N0X2RlaW50ZXJsYWNlX3NldF9tZXRob2QgKHNlbGYsIEdTVF9ERUlOVEVSTEFDRV9MSU5FQVIpOworICAgIGZpZWxkc19yZXF1aXJlZCA9IGdzdF9kZWludGVybGFjZV9tZXRob2RfZ2V0X2ZpZWxkc19yZXF1aXJlZCAoc2VsZi0+bWV0aG9kKTsKKyAgfSBlbHNlIGlmIChpbnRlcmxhY2luZ19tb2RlID09IEdTVF9WSURFT19JTlRFUkxBQ0VfTU9ERV9QUk9HUkVTU0lWRSB8fAorICAgICAgKGludGVybGFjaW5nX21vZGUgPT0gR1NUX1ZJREVPX0lOVEVSTEFDRV9NT0RFX01JWEVEICYmCisgICAgICAgICAgIUdTVF9WSURFT19GUkFNRV9JU19JTlRFUkxBQ0VEIChmaWVsZDEtPmZyYW1lKSkpIHsKKyAgICAvKiBUaGlzIGNhc2UgaXMgZm9yIHByb2Nlc3NpbmcgcHJvZ3Jlc3NpdmUgYnVmZmVycywgdGVsZWNpbmUgb3IgcGxhaW4KKyAgICAgKiBwcm9ncmVzc2l2ZSAqLworICAgIEdzdFZpZGVvRnJhbWUgKmZpZWxkMV9mcmFtZTsKKyAgICBHc3RCdWZmZXIgKmZpZWxkMV9idWZmZXI7CisKKyAgICAvKiBwcm9ncmVzc2l2ZSAqLworICAgIGZpZWxkc19yZXF1aXJlZCA9IDI7CisKKyAgICAvKiBOb3QgZW5vdWdoIGZpZWxkcyBpbiB0aGUgaGlzdG9yeSAqLworICAgIGlmICghZmx1c2hpbmcgJiYgc2VsZi0+aGlzdG9yeV9jb3VudCA8IGZpZWxkc19yZXF1aXJlZCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIk5lZWQgbW9yZSBmaWVsZHMgKGhhdmUgJWQsIG5lZWQgJWQpIiwKKyAgICAgICAgICBzZWxmLT5oaXN0b3J5X2NvdW50LCBzZWxmLT5jdXJfZmllbGRfaWR4ICsgZmllbGRzX3JlcXVpcmVkKTsKKyAgICAgIGdvdG8gbmVlZF9tb3JlOworICAgIH0KKworICAgIGZpZWxkMiA9ICZzZWxmLT5maWVsZF9oaXN0b3J5W3NlbGYtPmhpc3RvcnlfY291bnQgLSAyXTsKKyAgICBpZiAoR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZpZWxkMS0+ZnJhbWUsCisgICAgICAgICAgICAwKSAhPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZmllbGQyLT5mcmFtZSwgMCkpIHsKKyAgICAgIC8qIEVSUk9SIC0gbmV4dCB0d28gZmllbGRzIGluIGZpZWxkIGhpc3RvcnkgYXJlIG5vdCBvbmUgcHJvZ3Jlc3NpdmUgYnVmZmVyIC0gd2VhdmU/ICovCisgICAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLAorICAgICAgICAgICJQcm9ncmVzc2l2ZSBidWZmZXIgYnV0IHR3byBmaWVsZHMgYXQgdGlwIGFyZW4ndCBpbiB0aGUgc2FtZSBidWZmZXIhIik7CisgICAgfQorCisgICAgaWYgKElTX1RFTEVDSU5FIChpbnRlcmxhY2luZ19tb2RlKQorICAgICAgICAmJiAhZ3N0X2RlaW50ZXJsYWNlX2ZpeF90aW1lc3RhbXBzIChzZWxmLCBmaWVsZDEtPmZyYW1lLCBmaWVsZDItPmZyYW1lKQorICAgICAgICAmJiAhZmx1c2hpbmcpCisgICAgICBnb3RvIG5lZWRfbW9yZTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICJGcmFtZSB0eXBlOiBQcm9ncmVzc2l2ZTsgcHVzaGluZyBidWZmZXIgYXMgYSBmcmFtZSIpOworICAgIC8qIHBvcCBhbmQgcHVzaCAqLworICAgIHNlbGYtPmN1cl9maWVsZF9pZHgtLTsKKyAgICBmaWVsZDFfZnJhbWUgPSBnc3RfZGVpbnRlcmxhY2VfcG9wX2hpc3RvcnkgKHNlbGYpOworICAgIGZpZWxkMV9idWZmZXIgPSBmaWVsZDFfZnJhbWUtPmJ1ZmZlcjsKKyAgICBnc3RfYnVmZmVyX3JlZiAoZmllbGQxX2J1ZmZlcik7CisgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwX2FuZF9mcmVlIChmaWVsZDFfZnJhbWUpOworICAgIC8qIGZpZWxkMiBpcyB0aGUgc2FtZSBidWZmZXIgYXMgZmllbGQxLCBidXQgd2UgbmVlZCB0byByZW1vdmUgaXQgZnJvbSB0aGUKKyAgICAgKiBoaXN0b3J5IGFueXdheSAqLworICAgIHNlbGYtPmN1cl9maWVsZF9pZHgtLTsKKyAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXBfYW5kX2ZyZWUgKGdzdF9kZWludGVybGFjZV9wb3BfaGlzdG9yeSAoc2VsZikpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICJbT1VUXSB0cyAlIiBHU1RfVElNRV9GT1JNQVQgIiwgZHVyICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBlbmQgJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoZmllbGQxX2J1ZmZlcikpLAorICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RVUkFUSU9OIChmaWVsZDFfYnVmZmVyKSksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChmaWVsZDFfYnVmZmVyKSArCisgICAgICAgICAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChmaWVsZDFfYnVmZmVyKSkpOworICAgIGlmIChzZWxmLT5kaXNjb250KSB7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChmaWVsZDFfYnVmZmVyLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgICBzZWxmLT5kaXNjb250ID0gRkFMU0U7CisgICAgfQorICAgIHJldHVybiBnc3RfcGFkX3B1c2ggKHNlbGYtPnNyY3BhZCwgZmllbGQxX2J1ZmZlcik7CisgIH0gZWxzZSBpZiAoSVNfVEVMRUNJTkUgKGludGVybGFjaW5nX21vZGUpCisgICAgICAmJiBHU1RfVklERU9fRlJBTUVfSVNfSU5URVJMQUNFRCAoZmllbGQxLT5mcmFtZSkgJiYgIXNhbWVfYnVmZmVyKSB7CisgICAgLyogVGhpcyBjYXNlIG5lZWRzIHRvIGlkZW50aWZ5IHRlbGVjaW5lIG1peGVkIGJ1ZmZlcnMgdGhhdCByZXF1aXJlIHdlYXZpbmcKKyAgICAgKiBvZiB0d28gZmllbGRzIGluIGRpZmZlcmVudCBidWZmZXJzLgorICAgICAqIC0gaW50ZXJsYWNpbmcgbW9kZSBpcyBtaXhlZAorICAgICAqIC0gbG9ja2VkIG9uIHRvIGEgdGVsZWNpbmUgcGF0dGVybgorICAgICAqIC0gZnJhbWUgaXMgaW50ZXJsYWNlZAorICAgICAqIC0gZmllbGRzIGFyZSBpbiBzZXBhcmF0ZSBidWZmZXJzCisgICAgICogSWYgd2UgZG9uJ3QgeWV0IGhhdmUgYSBwYXR0ZXJuIGxvY2ssIHdlIHdpbGwgaGF2ZSB0byBkZWludGVybGFjZSBhcyB3ZQorICAgICAqIGRvbid0IGV4cGxpY2l0bHkga25vdyB3ZSBoYXZlIGEgdGVsZWNpbmUgc2VxdWVuY2UgYW5kIHNvIHdlIGRyb3AgdGhyb3VnaAorICAgICAqIHRvIHRoZSBwbGFpbiBkZWludGVybGFjZSBjYXNlICovCisgICAgZmllbGRzX3JlcXVpcmVkID0gMjsKKyAgICBpZiAoIWZsdXNoaW5nICYmIHNlbGYtPmhpc3RvcnlfY291bnQgPCBmaWVsZHNfcmVxdWlyZWQpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJOZWVkIG1vcmUgZmllbGRzIChoYXZlICVkLCBuZWVkICVkKSIsCisgICAgICAgICAgc2VsZi0+aGlzdG9yeV9jb3VudCwgc2VsZi0+Y3VyX2ZpZWxkX2lkeCArIGZpZWxkc19yZXF1aXJlZCk7CisgICAgICBnb3RvIG5lZWRfbW9yZTsKKyAgICB9CisKKyAgICBmaWVsZDIgPSAmc2VsZi0+ZmllbGRfaGlzdG9yeVtzZWxmLT5oaXN0b3J5X2NvdW50IC0gMl07CisgICAgaWYgKCFnc3RfZGVpbnRlcmxhY2VfZml4X3RpbWVzdGFtcHMgKHNlbGYsIGZpZWxkMS0+ZnJhbWUsIGZpZWxkMi0+ZnJhbWUpCisgICAgICAgICYmICFmbHVzaGluZykKKyAgICAgIGdvdG8gbmVlZF9tb3JlOworCisgICAgLyogY2hlY2sgZmllbGQxIGFuZCBmaWVsZDIgYnVmZmVyIGNhcHMgYW5kIGZsYWdzIGFyZSBjb3JyZXNwb25kaW5nICovCisgICAgaWYgKGZpZWxkMS0+ZmxhZ3MgPT0gZmllbGQyLT5mbGFncykgeworICAgICAgLyogRVJST1IgLSBmaWVsZHMgYXJlIG9mIHNhbWUgcGFyaXR5IC0gd2hhdCBzaG91bGQgYmUgZG9uZSBoZXJlPworICAgICAgICogcGVyaGFwcyBkZWludGVybGFjZSB0aGUgdGlwIGZpZWxkIGFuZCBzdGFydCBhZ2Fpbj8gKi8KKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsICJUZWxlY2luZSBtaXhlZCB3aXRoIGZpZWxkcyBvZiBzYW1lIHBhcml0eSEiKTsKKyAgICB9CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwKKyAgICAgICAgIkZyYW1lIHR5cGU6IFRlbGVjaW5lIE1peGVkOyB3ZWF2aW5nIHRpcCB0d28gZmllbGRzIGludG8gYSBmcmFtZSIpOworICAgIC8qIHNldCBtZXRob2QgdG8gV0VBVkUgKi8KKyAgICBnc3RfZGVpbnRlcmxhY2Vfc2V0X21ldGhvZCAoc2VsZiwgR1NUX0RFSU5URVJMQUNFX1dFQVZFKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBUaGlzIGlzIHRoZSBmaW5hbCBjYXRjaC1hbGwgY2FzZSB0aGF0IGFwcGxpZXMgdGhlIHNlbGVjdGVkIGRlaW50ZXJsYWNpbmcKKyAgICAgKiBtZXRob2QuIEF0IHRoaXMgcG9pbnQgdGhlIGZpZWxkcyB0byBiZSBwcm9jZXNzZWQgYXJlIGVpdGhlciBkZWZpbml0ZWx5CisgICAgICogaW50ZXJsYWNlZCBvciB3ZSBkbyBub3QgeWV0IGtub3cgdGhhdCB3ZSBoYXZlIGEgdGVsZWNpbmUgcGF0dGVybiBsb2NrCisgICAgICogYW5kIHNvIHRoZSBiZXN0IHdlIGNhbiBkbyBpcyB0byBkZWludGVybGFjZSB0aGUgZmllbGRzLiAqLworICAgIGdzdF9kZWludGVybGFjZV9zZXRfbWV0aG9kIChzZWxmLCBzZWxmLT51c2VyX3NldF9tZXRob2RfaWQpOworICAgIGZpZWxkc19yZXF1aXJlZCA9IGdzdF9kZWludGVybGFjZV9tZXRob2RfZ2V0X2ZpZWxkc19yZXF1aXJlZCAoc2VsZi0+bWV0aG9kKTsKKyAgICBpZiAoZmx1c2hpbmcgJiYgc2VsZi0+aGlzdG9yeV9jb3VudCA8IGZpZWxkc19yZXF1aXJlZCkgeworICAgICAgLyogbm90ZTogd2UgYWxyZWFkeSBjaGVja2VkIGZvciBmbHVzaGluZyB3aXRoIGhpc3RvcnkgY291bnQgPT0gMSBhYm92ZQorICAgICAgICogc28gd2UgbXVzdCBoYXZlIDIgb3IgbW9yZSBmaWVsZHMgaW4gaGVyZSAqLworICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NldF9tZXRob2QgKHNlbGYsIEdTVF9ERUlOVEVSTEFDRV9WRklSKTsKKyAgICAgIGZpZWxkc19yZXF1aXJlZCA9CisgICAgICAgICAgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9nZXRfZmllbGRzX3JlcXVpcmVkIChzZWxmLT5tZXRob2QpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkZsdXNoaW5nIGZpZWxkKHMpIHVzaW5nICVzIG1ldGhvZCIsCisgICAgICAgICAgbWV0aG9kc190eXBlc1tzZWxmLT5tZXRob2RfaWRdLnZhbHVlX25pY2spOworICAgIH0KKworICAgIC8qIE5vdCBlbm91Z2ggZmllbGRzIGluIHRoZSBoaXN0b3J5ICovCisgICAgaWYgKCFmbHVzaGluZyAmJiBzZWxmLT5oaXN0b3J5X2NvdW50IDwgZmllbGRzX3JlcXVpcmVkKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiTmVlZCBtb3JlIGZpZWxkcyAoaGF2ZSAlZCwgbmVlZCAlZCkiLAorICAgICAgICAgIHNlbGYtPmhpc3RvcnlfY291bnQsIHNlbGYtPmN1cl9maWVsZF9pZHggKyBmaWVsZHNfcmVxdWlyZWQpOworICAgICAgZ290byBuZWVkX21vcmU7CisgICAgfQorCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwKKyAgICAgICAgIkZyYW1lIHR5cGU6IEludGVybGFjZWQ7IGRlaW50ZXJsYWNpbmcgdXNpbmcgJXMgbWV0aG9kIiwKKyAgICAgICAgbWV0aG9kc190eXBlc1tzZWxmLT5tZXRob2RfaWRdLnZhbHVlX25pY2spOworICB9CisKKyAgaWYgKCFmbHVzaGluZyAmJiBzZWxmLT5jdXJfZmllbGRfaWR4IDwgMSkgeworICAgIGdvdG8gbmVlZF9tb3JlOworICB9IGVsc2UgaWYgKHNlbGYtPmN1cl9maWVsZF9pZHggPCAwICYmIGZsdXNoaW5nKSB7CisgICAgc2VsZi0+Y3VyX2ZpZWxkX2lkeCsrOworICB9CisKKyAgaWYgKHNlbGYtPmZpZWxkcyA9PSBHU1RfREVJTlRFUkxBQ0VfQUxMIHx8IElTX1RFTEVDSU5FIChpbnRlcmxhY2luZ19tb2RlKSkKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiQWxsIGZpZWxkcyIpOworICBlbHNlIGlmIChzZWxmLT5maWVsZHMgPT0gR1NUX0RFSU5URVJMQUNFX1RGKQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJUb3AgZmllbGRzIik7CisgIGVsc2UgaWYgKHNlbGYtPmZpZWxkcyA9PSBHU1RfREVJTlRFUkxBQ0VfQkYpCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkJvdHRvbSBmaWVsZHMiKTsKKworICBpZiAoKHNlbGYtPmZpZWxkX2hpc3Rvcnlbc2VsZi0+Y3VyX2ZpZWxkX2lkeF0uZmxhZ3MgPT0gUElDVFVSRV9JTlRFUkxBQ0VEX1RPUAorICAgICAgICAgICYmIChzZWxmLT5maWVsZHMgPT0gR1NUX0RFSU5URVJMQUNFX1RGCisgICAgICAgICAgICAgIHx8IElTX1RFTEVDSU5FIChpbnRlcmxhY2luZ19tb2RlKSkpCisgICAgICB8fCAoc2VsZi0+ZmllbGRzID09IEdTVF9ERUlOVEVSTEFDRV9BTEwKKyAgICAgICAgICAmJiAhSVNfVEVMRUNJTkUgKGludGVybGFjaW5nX21vZGUpKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJkZWludGVybGFjaW5nIHRvcCBmaWVsZCIpOworCisgICAgLyogY3JlYXRlIG5ldyBidWZmZXIgKi8KKyAgICByZXQgPSBnc3RfYnVmZmVyX3Bvb2xfYWNxdWlyZV9idWZmZXIgKHNlbGYtPnBvb2wsICZvdXRidWYsIE5VTEwpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIG5vX2J1ZmZlcjsKKworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZWxmLT5oaXN0b3J5X2NvdW50ID49CisgICAgICAgIDEgKyBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dldF9sYXRlbmN5IChzZWxmLT5tZXRob2QpLCBHU1RfRkxPV19FUlJPUik7CisKKyAgICBidWYgPQorICAgICAgICBzZWxmLT5maWVsZF9oaXN0b3J5W3NlbGYtPmhpc3RvcnlfY291bnQgLSAxIC0KKyAgICAgICAgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9nZXRfbGF0ZW5jeSAoc2VsZi0+bWV0aG9kKV0uZnJhbWUtPmJ1ZmZlcjsKKworICAgIGlmICghSVNfVEVMRUNJTkUgKGludGVybGFjaW5nX21vZGUpKSB7CisgICAgICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKTsKKworICAgICAgaWYgKHNlbGYtPmZpZWxkcyA9PSBHU1RfREVJTlRFUkxBQ0VfQUxMKSB7CisgICAgICAgIGlmIChzZWxmLT5zZWdtZW50LnJhdGUgPCAwKQorICAgICAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpID0gdGltZXN0YW1wICsgc2VsZi0+ZmllbGRfZHVyYXRpb247CisgICAgICAgIGVsc2UKKyAgICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSA9IHRpbWVzdGFtcDsKKyAgICAgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9IHNlbGYtPmZpZWxkX2R1cmF0aW9uOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgPSB0aW1lc3RhbXA7CisgICAgICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPSAyICogc2VsZi0+ZmllbGRfZHVyYXRpb247CisgICAgICB9CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgICAgICJbQURKVVNUXSB0cyAlIiBHU1RfVElNRV9GT1JNQVQgIiwgZHVyICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBlbmQgJSIKKyAgICAgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpKSwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpKSwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSArCisgICAgICAgICAgICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikpKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgPQorICAgICAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChmaWVsZDEtPmZyYW1lLT5idWZmZXIpOworICAgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9CisgICAgICAgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoZmllbGQxLT5mcmFtZS0+YnVmZmVyKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGRyb3AgdGhlIGZyYW1lIGJlY2F1c2Ugb2YgUW9TICovCisgICAgaWYgKCFnc3RfZGVpbnRlcmxhY2VfZG9fcW9zIChzZWxmLCBidWYpKSB7CisgICAgICBzZWxmLT5jdXJfZmllbGRfaWR4LS07CisgICAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXBfYW5kX2ZyZWUgKGdzdF9kZWludGVybGFjZV9wb3BfaGlzdG9yeSAoc2VsZikpOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmKTsKKyAgICAgIG91dGJ1ZiA9IE5VTEw7CisgICAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHNlbGYtPmN1cl9maWVsZF9pZHggPCAwICYmIGZsdXNoaW5nKSB7CisgICAgICAgIGlmIChzZWxmLT5oaXN0b3J5X2NvdW50ID09IDEpIHsKKyAgICAgICAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXBfYW5kX2ZyZWUgKGdzdF9kZWludGVybGFjZV9wb3BfaGlzdG9yeSAoc2VsZikpOworICAgICAgICAgIGdvdG8gbmVlZF9tb3JlOworICAgICAgICB9CisgICAgICAgIHNlbGYtPmN1cl9maWVsZF9pZHgrKzsKKyAgICAgIH0KKyAgICAgIGlmIChzZWxmLT5jdXJfZmllbGRfaWR4IDwgMCkgeworICAgICAgICBnb3RvIG5lZWRfbW9yZTsKKyAgICAgIH0KKyAgICAgIGlmICghZmx1c2hpbmcgJiYgc2VsZi0+Y3VyX2ZpZWxkX2lkeCA8IDEpIHsKKyAgICAgICAgZ290byBuZWVkX21vcmU7CisgICAgICB9CisKKyAgICAgIC8qIG1hcCB0aGUgZnJhbWUgc28gdGhlIGRlaW50ZXJsYWNlIG1ldGhvZHMgY2FuIHdyaXRlIHRoZSBkYXRhIHRvIHRoZQorICAgICAgICogY29ycmVjdCBtZW1vcnkgbG9jYXRpb25zICovCisgICAgICBvdXRmcmFtZSA9CisgICAgICAgICAgZ3N0X3ZpZGVvX2ZyYW1lX25ld19hbmRfbWFwICgmc2VsZi0+dmluZm8sIG91dGJ1ZiwgR1NUX01BUF9XUklURSk7CisKKyAgICAgIC8qIGRvIG1hZ2ljIGNhbGN1bHVzICovCisgICAgICBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lIChzZWxmLT5tZXRob2QsCisgICAgICAgICAgc2VsZi0+ZmllbGRfaGlzdG9yeSwgc2VsZi0+aGlzdG9yeV9jb3VudCwgb3V0ZnJhbWUsCisgICAgICAgICAgc2VsZi0+Y3VyX2ZpZWxkX2lkeCk7CisKKyAgICAgIGdzdF92aWRlb19mcmFtZV91bm1hcF9hbmRfZnJlZSAob3V0ZnJhbWUpOworCisgICAgICBzZWxmLT5jdXJfZmllbGRfaWR4LS07CisgICAgICAvKiBuZWVkIHRvIHJlbW92ZSB0aGUgZmllbGQgaW4gdGhlIHRlbGVjaW5lIHdlYXZpbmcgY2FzZSAqLworICAgICAgaWYgKChJU19URUxFQ0lORSAoaW50ZXJsYWNpbmdfbW9kZSkKKyAgICAgICAgICAgICAgJiYgc2VsZi0+bWV0aG9kX2lkID09IEdTVF9ERUlOVEVSTEFDRV9XRUFWRSkKKyAgICAgICAgICB8fCBzZWxmLT5jdXJfZmllbGRfaWR4ICsgMSArCisgICAgICAgICAgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9nZXRfbGF0ZW5jeSAoc2VsZi0+bWV0aG9kKSA8CisgICAgICAgICAgc2VsZi0+aGlzdG9yeV9jb3VudCB8fCBmbHVzaGluZykgeworICAgICAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXBfYW5kX2ZyZWUgKGdzdF9kZWludGVybGFjZV9wb3BfaGlzdG9yeSAoc2VsZikpOworICAgICAgfQorCisgICAgICBpZiAoZ3N0X2RlaW50ZXJsYWNlX2NsaXBfYnVmZmVyIChzZWxmLCBvdXRidWYpKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICAgICAiW09VVF0gdHMgJSIgR1NUX1RJTUVfRk9STUFUICIsIGR1ciAlIiBHU1RfVElNRV9GT1JNQVQgIiwgZW5kICUiCisgICAgICAgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpKSwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikpLAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgKworICAgICAgICAgICAgICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikpKTsKKyAgICAgICAgaWYgKHNlbGYtPmRpc2NvbnQpIHsKKyAgICAgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICAgICAgICBzZWxmLT5kaXNjb250ID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoIChzZWxmLT5zcmNwYWQsIG91dGJ1Zik7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmKTsKKyAgICAgIH0KKworICAgICAgb3V0YnVmID0gTlVMTDsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIHJldHVybiByZXQ7CisgICAgICBpZiAoSVNfVEVMRUNJTkUgKGludGVybGFjaW5nX21vZGUpCisgICAgICAgICAgJiYgc2VsZi0+bWV0aG9kX2lkID09IEdTVF9ERUlOVEVSTEFDRV9XRUFWRSkgeworICAgICAgICAvKiBwb3Agb2ZmIHRoZSBzZWNvbmQgZmllbGQgKi8KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlJlbW92aW5nIHVudXNlZCBmaWVsZCAoY291bnQ6ICVkKSIsCisgICAgICAgICAgICBzZWxmLT5oaXN0b3J5X2NvdW50KTsKKyAgICAgICAgc2VsZi0+Y3VyX2ZpZWxkX2lkeC0tOworICAgICAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXBfYW5kX2ZyZWUgKGdzdF9kZWludGVybGFjZV9wb3BfaGlzdG9yeSAoc2VsZikpOworICAgICAgICBpbnRlcmxhY2luZ19tb2RlID0gR1NUX1ZJREVPX0lOVEVSTEFDRV9NT0RFX0lOVEVSTEVBVkVEOworICAgICAgICByZXR1cm4gcmV0OworICAgICAgfQorICAgIH0KKworICAgIGlmIChmbHVzaF9vbmUgJiYgIXNlbGYtPmRyb3Bfb3JwaGFucykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIk9ycGhhbiBmaWVsZCBkZWludGVybGFjZWQgLSByZWNvbmZpZ3VyaW5nIik7CisgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgfQorICB9CisgIC8qIG5vIGNhbGN1bGF0aW9uIGRvbmU6IHJlbW92ZSBleGNlc3MgZmllbGQgKi8KKyAgZWxzZSBpZiAoc2VsZi0+ZmllbGRfaGlzdG9yeVtzZWxmLT5jdXJfZmllbGRfaWR4XS5mbGFncyA9PQorICAgICAgUElDVFVSRV9JTlRFUkxBQ0VEX1RPUCAmJiAoc2VsZi0+ZmllbGRzID09IEdTVF9ERUlOVEVSTEFDRV9CRgorICAgICAgICAgICYmICFJU19URUxFQ0lORSAoaW50ZXJsYWNpbmdfbW9kZSkpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlJlbW92aW5nIHVudXNlZCB0b3AgZmllbGQiKTsKKyAgICBzZWxmLT5jdXJfZmllbGRfaWR4LS07CisgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwX2FuZF9mcmVlIChnc3RfZGVpbnRlcmxhY2VfcG9wX2hpc3RvcnkgKHNlbGYpKTsKKworICAgIGlmIChmbHVzaF9vbmUgJiYgIXNlbGYtPmRyb3Bfb3JwaGFucykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIk9ycGhhbiBmaWVsZCBkZWludGVybGFjZWQgLSByZWNvbmZpZ3VyaW5nIik7CisgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgfQorICB9CisKKyAgaWYgKHNlbGYtPmhpc3RvcnlfY291bnQgPCBmaWVsZHNfcmVxdWlyZWQpCisgICAgcmV0dXJuIHJldDsKKworICBpZiAoc2VsZi0+Y3VyX2ZpZWxkX2lkeCA8IDApCisgICAgcmV0dXJuIHJldDsKKworICAvKiBkZWludGVybGFjZSBib3R0b21fZmllbGQgKi8KKyAgaWYgKChzZWxmLT5maWVsZF9oaXN0b3J5W3NlbGYtPmN1cl9maWVsZF9pZHhdLmZsYWdzID09CisgICAgICAgICAgUElDVFVSRV9JTlRFUkxBQ0VEX0JPVFRPTSAmJiAoc2VsZi0+ZmllbGRzID09IEdTVF9ERUlOVEVSTEFDRV9CRgorICAgICAgICAgICAgICB8fCBJU19URUxFQ0lORSAoaW50ZXJsYWNpbmdfbW9kZSkpKQorICAgICAgfHwgKHNlbGYtPmZpZWxkcyA9PSBHU1RfREVJTlRFUkxBQ0VfQUxMCisgICAgICAgICAgJiYgIUlTX1RFTEVDSU5FIChpbnRlcmxhY2luZ19tb2RlKSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiZGVpbnRlcmxhY2luZyBib3R0b20gZmllbGQiKTsKKworICAgIC8qIGNyZWF0ZSBuZXcgYnVmZmVyICovCisgICAgcmV0ID0gZ3N0X2J1ZmZlcl9wb29sX2FjcXVpcmVfYnVmZmVyIChzZWxmLT5wb29sLCAmb3V0YnVmLCBOVUxMKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgZ290byBub19idWZmZXI7CisKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCAoc2VsZi0+aGlzdG9yeV9jb3VudCA+PQorICAgICAgICBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dldF9sYXRlbmN5IChzZWxmLT5tZXRob2QpICsgMSwgR1NUX0ZMT1dfRVJST1IpOworCisgICAgYnVmID0KKyAgICAgICAgc2VsZi0+ZmllbGRfaGlzdG9yeVtzZWxmLT5oaXN0b3J5X2NvdW50IC0gMSAtCisgICAgICAgIGdzdF9kZWludGVybGFjZV9tZXRob2RfZ2V0X2xhdGVuY3kgKHNlbGYtPm1ldGhvZCldLmZyYW1lLT5idWZmZXI7CisgICAgaWYgKCFJU19URUxFQ0lORSAoaW50ZXJsYWNpbmdfbW9kZSkpIHsKKyAgICAgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpOworCisgICAgICBpZiAoc2VsZi0+ZmllbGRzID09IEdTVF9ERUlOVEVSTEFDRV9BTEwpIHsKKyAgICAgICAgaWYgKHNlbGYtPnNlZ21lbnQucmF0ZSA8IDApCisgICAgICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgPSB0aW1lc3RhbXA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSA9IHRpbWVzdGFtcCArIHNlbGYtPmZpZWxkX2R1cmF0aW9uOworICAgICAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gc2VsZi0+ZmllbGRfZHVyYXRpb247CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSA9IHRpbWVzdGFtcDsKKyAgICAgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9IDIgKiBzZWxmLT5maWVsZF9kdXJhdGlvbjsKKyAgICAgIH0KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICAgIltBREpVU1RdIHRzICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBkdXIgJSIgR1NUX1RJTUVfRk9STUFUICIsIGVuZCAlIgorICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikpLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikpLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpICsKKyAgICAgICAgICAgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSkpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSA9CisgICAgICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGZpZWxkMS0+ZnJhbWUtPmJ1ZmZlcik7CisgICAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0KKyAgICAgICAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChmaWVsZDEtPmZyYW1lLT5idWZmZXIpOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIHdlIG5lZWQgdG8gZHJvcCB0aGUgZnJhbWUgYmVjYXVzZSBvZiBRb1MgKi8KKyAgICBpZiAoIWdzdF9kZWludGVybGFjZV9kb19xb3MgKHNlbGYsIGJ1ZikpIHsKKyAgICAgIHNlbGYtPmN1cl9maWVsZF9pZHgtLTsKKyAgICAgIGdzdF92aWRlb19mcmFtZV91bm1hcF9hbmRfZnJlZSAoZ3N0X2RlaW50ZXJsYWNlX3BvcF9oaXN0b3J5IChzZWxmKSk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWYpOworICAgICAgb3V0YnVmID0gTlVMTDsKKyAgICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgIH0gZWxzZSB7CisgICAgICAvKiBtYXAgdGhlIGZyYW1lIHNvIHRoZSBkZWludGVybGFjZSBtZXRob2RzIGNhbiB3cml0ZSB0aGUgZGF0YSB0byB0aGUKKyAgICAgICAqIGNvcnJlY3QgbWVtb3J5IGxvY2F0aW9ucyAqLworICAgICAgb3V0ZnJhbWUgPQorICAgICAgICAgIGdzdF92aWRlb19mcmFtZV9uZXdfYW5kX21hcCAoJnNlbGYtPnZpbmZvLCBvdXRidWYsIEdTVF9NQVBfV1JJVEUpOworCisgICAgICAvKiBkbyBtYWdpYyBjYWxjdWx1cyAqLworICAgICAgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZSAoc2VsZi0+bWV0aG9kLAorICAgICAgICAgIHNlbGYtPmZpZWxkX2hpc3RvcnksIHNlbGYtPmhpc3RvcnlfY291bnQsIG91dGZyYW1lLAorICAgICAgICAgIHNlbGYtPmN1cl9maWVsZF9pZHgpOworCisgICAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXBfYW5kX2ZyZWUgKG91dGZyYW1lKTsKKworICAgICAgc2VsZi0+Y3VyX2ZpZWxkX2lkeC0tOworICAgICAgLyogbmVlZCB0byByZW1vdmUgdGhlIGZpZWxkIGluIHRoZSB0ZWxlY2luZSB3ZWF2aW5nIGNhc2UgKi8KKyAgICAgIGlmICgoSVNfVEVMRUNJTkUgKGludGVybGFjaW5nX21vZGUpCisgICAgICAgICAgICAgICYmIHNlbGYtPm1ldGhvZF9pZCA9PSBHU1RfREVJTlRFUkxBQ0VfV0VBVkUpCisgICAgICAgICAgfHwgc2VsZi0+Y3VyX2ZpZWxkX2lkeCArIDEgKworICAgICAgICAgIGdzdF9kZWludGVybGFjZV9tZXRob2RfZ2V0X2xhdGVuY3kgKHNlbGYtPm1ldGhvZCkgPAorICAgICAgICAgIHNlbGYtPmhpc3RvcnlfY291bnQpIHsKKyAgICAgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwX2FuZF9mcmVlIChnc3RfZGVpbnRlcmxhY2VfcG9wX2hpc3RvcnkgKHNlbGYpKTsKKyAgICAgIH0KKworICAgICAgaWYgKGdzdF9kZWludGVybGFjZV9jbGlwX2J1ZmZlciAoc2VsZiwgb3V0YnVmKSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgICAgICAgIltPVVRdIHRzICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBkdXIgJSIgR1NUX1RJTUVfRk9STUFUICIsIGVuZCAlIgorICAgICAgICAgICAgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSksCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpKSwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpICsKKyAgICAgICAgICAgICAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpKSk7CisgICAgICAgIHJldCA9IGdzdF9wYWRfcHVzaCAoc2VsZi0+c3JjcGFkLCBvdXRidWYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1Zik7CisgICAgICB9CisKKyAgICAgIG91dGJ1ZiA9IE5VTEw7CisgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICByZXR1cm4gcmV0OworICAgICAgaWYgKElTX1RFTEVDSU5FIChpbnRlcmxhY2luZ19tb2RlKQorICAgICAgICAgICYmIHNlbGYtPm1ldGhvZF9pZCA9PSBHU1RfREVJTlRFUkxBQ0VfV0VBVkUpIHsKKyAgICAgICAgLyogcG9wIG9mZiB0aGUgc2Vjb25kIGZpZWxkICovCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJSZW1vdmluZyB1bnVzZWQgZmllbGQgKGNvdW50OiAlZCkiLAorICAgICAgICAgICAgc2VsZi0+aGlzdG9yeV9jb3VudCk7CisgICAgICAgIHNlbGYtPmN1cl9maWVsZF9pZHgtLTsKKyAgICAgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwX2FuZF9mcmVlIChnc3RfZGVpbnRlcmxhY2VfcG9wX2hpc3RvcnkgKHNlbGYpKTsKKyAgICAgICAgaW50ZXJsYWNpbmdfbW9kZSA9IEdTVF9WSURFT19JTlRFUkxBQ0VfTU9ERV9JTlRFUkxFQVZFRDsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmx1c2hfb25lICYmICFzZWxmLT5kcm9wX29ycGhhbnMpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJPcnBoYW4gZmllbGQgZGVpbnRlcmxhY2VkIC0gcmVjb25maWd1cmluZyIpOworICAgICAgZ290byByZXN0YXJ0OworICAgIH0KKyAgfQorICAvKiBubyBjYWxjdWxhdGlvbiBkb25lOiByZW1vdmUgZXhjZXNzIGZpZWxkICovCisgIGVsc2UgaWYgKHNlbGYtPmZpZWxkX2hpc3Rvcnlbc2VsZi0+Y3VyX2ZpZWxkX2lkeF0uZmxhZ3MgPT0KKyAgICAgIFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00gJiYgKHNlbGYtPmZpZWxkcyA9PSBHU1RfREVJTlRFUkxBQ0VfVEYKKyAgICAgICAgICAmJiAhSVNfVEVMRUNJTkUgKGludGVybGFjaW5nX21vZGUpKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJSZW1vdmluZyB1bnVzZWQgYm90dG9tIGZpZWxkIik7CisgICAgc2VsZi0+Y3VyX2ZpZWxkX2lkeC0tOworICAgIGdzdF92aWRlb19mcmFtZV91bm1hcF9hbmRfZnJlZSAoZ3N0X2RlaW50ZXJsYWNlX3BvcF9oaXN0b3J5IChzZWxmKSk7CisKKyAgICBpZiAoZmx1c2hfb25lICYmICFzZWxmLT5kcm9wX29ycGhhbnMpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJPcnBoYW4gZmllbGQgZGVpbnRlcmxhY2VkIC0gcmVjb25maWd1cmluZyIpOworICAgICAgZ290byByZXN0YXJ0OworICAgIH0KKyAgfQorCisgIHJldHVybiByZXQ7CisKK25lZWRfbW9yZToKKyAgeworICAgIHNlbGYtPm5lZWRfbW9yZSA9IFRSVUU7CisgICAgcmV0dXJuIHJldDsKKyAgfQorbm9fYnVmZmVyOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImNvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXIiKTsKKyAgICByZXR1cm4gcmV0OworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RlaW50ZXJsYWNlX2dldF9sYXRlbmN5IChHc3REZWludGVybGFjZSAqIHNlbGYpCit7CisgIGlmIChzZWxmLT5sb2NraW5nID09IEdTVF9ERUlOVEVSTEFDRV9MT0NLSU5HX0FVVE8pIHsKKyAgICBHc3RRdWVyeSAqcXVlcnk7CisKKyAgICBxdWVyeSA9IGdzdF9xdWVyeV9uZXdfbGF0ZW5jeSAoKTsKKyAgICBpZiAoKGdzdF9wYWRfcGVlcl9xdWVyeSAoc2VsZi0+c2lua3BhZCwgcXVlcnkpKSkgeworICAgICAgZ2Jvb2xlYW4gaXNfbGl2ZTsKKyAgICAgIC8qIGlmIHVwc3RyZWFtIGlzIGxpdmUsIHdlIHVzZSBsb3ctbGF0ZW5jeSBwYXNzaXZlIGxvY2tpbmcgbW9kZQorICAgICAgICogZWxzZSBoaWdoLWxhdGVuY3kgYWN0aXZlIGxvY2tpbmcgbW9kZSAqLworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2xhdGVuY3kgKHF1ZXJ5LCAmaXNfbGl2ZSwgTlVMTCwgTlVMTCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiTGF0ZW5jeSBxdWVyeSBpbmRpY2F0ZXMgc3RyZWFtIGlzICVzIiwKKyAgICAgICAgICBpc19saXZlID8gImxpdmUgLSB1c2luZyBwYXNzaXZlIGxvY2tpbmciIDoKKyAgICAgICAgICAibm90IGxpdmUgLSB1c2luZyBhY3RpdmUgbG9ja2luZyIpOworICAgICAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisgICAgICByZXR1cm4gaXNfbGl2ZTsKKyAgICB9IGVsc2UgeworICAgICAgLyogY29uc2VydmF0aXZlbHkgdXNlIHBhc3NpdmUgbG9ja2luZyBpZiB0aGUgcXVlcnkgZmFpbHMgKi8KKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc2VsZiwKKyAgICAgICAgICAiTGF0ZW5jeSBxdWVyeSBmYWlsZWQgLSBmYWxsIGJhY2sgdG8gdXNpbmcgcGFzc2l2ZSBsb2NraW5nIik7CisgICAgICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gc2VsZi0+bG9ja2luZyAtIDI7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9kZWludGVybGFjZV9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0RGVpbnRlcmxhY2UgKnNlbGYgPSBHU1RfREVJTlRFUkxBQ0UgKHBhcmVudCk7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgR1NUX09CSkVDVF9MT0NLIChzZWxmKTsKKyAgaWYgKHNlbGYtPnJlY29uZmlndXJlIHx8IGdzdF9wYWRfY2hlY2tfcmVjb25maWd1cmUgKHNlbGYtPnNyY3BhZCkpIHsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgaWYgKChnaW50KSBzZWxmLT5uZXdfZmllbGRzICE9IC0xKQorICAgICAgc2VsZi0+dXNlcl9zZXRfZmllbGRzID0gc2VsZi0+bmV3X2ZpZWxkczsKKyAgICBpZiAoKGdpbnQpIHNlbGYtPm5ld19tb2RlICE9IC0xKQorICAgICAgc2VsZi0+bW9kZSA9IHNlbGYtPm5ld19tb2RlOworICAgIHNlbGYtPm5ld19tb2RlID0gLTE7CisgICAgc2VsZi0+bmV3X2ZpZWxkcyA9IC0xOworCisgICAgc2VsZi0+cmVjb25maWd1cmUgPSBGQUxTRTsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc2VsZik7CisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoc2VsZi0+c2lua3BhZCk7CisgICAgaWYgKGNhcHMgIT0gTlVMTCkgeworICAgICAgaWYgKCFnc3RfZGVpbnRlcmxhY2Vfc2V0Y2FwcyAoc2VsZiwgc2VsZi0+c2lua3BhZCwgY2FwcykpIHsKKyAgICAgICAgZ3N0X3BhZF9tYXJrX3JlY29uZmlndXJlIChzZWxmLT5zcmNwYWQpOworICAgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICAgIGlmIChHU1RfUEFEX0lTX0ZMVVNISU5HIChzZWxmLT5zcmNwYWQpKQorICAgICAgICAgIHJldHVybiBHU1RfRkxPV19GTFVTSElORzsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICAgIH0KKyAgICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICB9IGVsc2UgeworICAgICAgZ3N0X3BhZF9tYXJrX3JlY29uZmlndXJlIChzZWxmLT5zcmNwYWQpOworICAgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc2VsZik7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgIltJTl0gdHMgJSIgR1NUX1RJTUVfRk9STUFUICIsIGR1ciAlIiBHU1RfVElNRV9GT1JNQVQgIiwgZW5kICUiCisgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpKSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikgKyBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpKSk7CisKKyAgaWYgKHNlbGYtPnN0aWxsX2ZyYW1lX21vZGUgfHwgc2VsZi0+cGFzc3Rocm91Z2gpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgICAiRnJhbWUgdHlwZTogUHJvZ3Jlc3NpdmU/OyBwdXNoaW5nIGJ1ZmZlciB1c2luZyBwYXNzLXRocm91Z2giKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgICAiW09VVF0gdHMgJSIgR1NUX1RJTUVfRk9STUFUICIsIGR1ciAlIiBHU1RfVElNRV9GT1JNQVQgIiwgZW5kICUiCisgICAgICAgIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikpLAorICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpKSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikgKyBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpKSk7CisKKyAgICByZXR1cm4gZ3N0X3BhZF9wdXNoIChzZWxmLT5zcmNwYWQsIGJ1Zik7CisgIH0KKworICBpZiAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiRElTQ09OVCBidWZmZXIsIHJlc2V0dGluZyBoaXN0b3J5Iik7CisgICAgZ3N0X2RlaW50ZXJsYWNlX3Jlc2V0X2hpc3RvcnkgKHNlbGYsIEZBTFNFKTsKKyAgICBzZWxmLT5kaXNjb250ID0gVFJVRTsKKyAgfQorCisgIGdzdF9kZWludGVybGFjZV9wdXNoX2hpc3RvcnkgKHNlbGYsIGJ1Zik7CisgIGJ1ZiA9IE5VTEw7CisKKyAgZG8geworICAgIHJldCA9IGdzdF9kZWludGVybGFjZV9vdXRwdXRfZnJhbWUgKHNlbGYsIEZBTFNFKTsKKyAgfSB3aGlsZSAoIXNlbGYtPm5lZWRfbW9yZSAmJiBzZWxmLT5oaXN0b3J5X2NvdW50ID4gMCAmJiByZXQgPT0gR1NUX0ZMT1dfT0spOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RlaW50ZXJsYWNlX2FjY2VwdGNhcHMgKEdzdERlaW50ZXJsYWNlICogc2VsZiwgR3N0UGFkICogcGFkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2Jvb2xlYW4gcmV0OworICBHc3RDYXBzICpvdXJjYXBzOworCisgIC8qIEluIEFVVE8vRElTQUJMRUQgbW9kZSB3ZSBhY2NlcHQgZXZlcnl0aGluZyB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aAorICAgKiBvdXIgdGVtcGxhdGUgY2Fwcy4gSW4gSU5URVJMQUNFRCBtb2RlIHdlIGZvcmNlIGRlaW50ZXJsYWNpbmcsIG1lYW5pbmcKKyAgICogd2UgY2FuIG9ubHkgcG9zc2libHkgc3VwcG9ydCB0aGUgZGVpbnRlcmxhY2UgY2Fwcy4KKyAgICogSW4gQVVUT19TVFJJQ1QgbW9kZSB3ZSBhY2NlcHQgYWxsIHByb2dyZXNzaXZlIGZvcm1hdHMsIGJ1dCBvbmx5IHRob3NlCisgICAqIGludGVybGFjZWQgZm9ybWF0IHRoYXQgd2UgY2FuIGFjdHVhbGx5IGRlaW50ZXJsYWNlICovCisgIGlmIChzZWxmLT5tb2RlID09IEdTVF9ERUlOVEVSTEFDRV9NT0RFX0RJU0FCTEVECisgICAgICB8fCBzZWxmLT5tb2RlID09IEdTVF9ERUlOVEVSTEFDRV9NT0RFX0FVVE8pIHsKKyAgICBvdXJjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHBhZCk7CisgICAgcmV0ID0gZ3N0X2NhcHNfaXNfc3Vic2V0IChjYXBzLCBvdXJjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAob3VyY2Fwcyk7CisgIH0gZWxzZSBpZiAoc2VsZi0+bW9kZSA9PSBHU1RfREVJTlRFUkxBQ0VfTU9ERV9JTlRFUkxBQ0VEKSB7CisgICAgb3VyY2FwcyA9IGdzdF9zdGF0aWNfY2Fwc19nZXQgKCZkZWludGVybGFjZV9jYXBzKTsKKyAgICByZXQgPSBnc3RfY2Fwc19pc19zdWJzZXQgKGNhcHMsIG91cmNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChvdXJjYXBzKTsKKyAgfSBlbHNlIGlmIChzZWxmLT5tb2RlID09IEdTVF9ERUlOVEVSTEFDRV9NT0RFX0FVVE9fU1RSSUNUKSB7CisgICAgb3VyY2FwcyA9IGdzdF9zdGF0aWNfY2Fwc19nZXQgKCZwcm9ncmVzc2l2ZV9jYXBzKTsKKyAgICByZXQgPSBnc3RfY2Fwc19pc19zdWJzZXQgKGNhcHMsIG91cmNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChvdXJjYXBzKTsKKworICAgIGlmICghcmV0KSB7CisgICAgICBvdXJjYXBzID0gZ3N0X3N0YXRpY19jYXBzX2dldCAoJmRlaW50ZXJsYWNlX2NhcHMpOworICAgICAgcmV0ID0gZ3N0X2NhcHNfaXNfc3Vic2V0IChjYXBzLCBvdXJjYXBzKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChvdXJjYXBzKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJhY2NlcHQtY2FwcyByZXN1bHQ6JWQgZm9yIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICByZXQsIGNhcHMpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RlaW50ZXJsYWNlX2ZyYWN0aW9uX2RvdWJsZSAoZ2ludCAqIG5fb3V0LCBnaW50ICogZF9vdXQsIGdib29sZWFuIGhhbGYpCit7CisgIGdpbnQgbiwgZCwgZ2NkOworCisgIG4gPSAqbl9vdXQ7CisgIGQgPSAqZF9vdXQ7CisKKyAgaWYgKGQgPT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKG4gPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICBnY2QgPSBnc3RfdXRpbF9ncmVhdGVzdF9jb21tb25fZGl2aXNvciAobiwgZCk7CisgIG4gLz0gZ2NkOworICBkIC89IGdjZDsKKworICBpZiAoaGFsZikgeworICAgIGlmIChHX01BWElOVCAvIDIgPj0gQUJTIChkKSkgeworICAgICAgZCAqPSAyOworICAgIH0gZWxzZSBpZiAobiA+PSAyICYmIG4gIT0gR19NQVhJTlQpIHsKKyAgICAgIG4gLz0gMjsKKyAgICB9IGVsc2UgeworICAgICAgZCA9IEdfTUFYSU5UOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoR19NQVhJTlQgLyAyID49IEFCUyAobikpIHsKKyAgICAgIG4gKj0gMjsKKyAgICB9IGVsc2UgaWYgKGQgPj0gMiAmJiBkICE9IEdfTUFYSU5UKSB7CisgICAgICBkIC89IDI7CisgICAgfSBlbHNlIHsKKyAgICAgIG4gPSBHX01BWElOVDsKKyAgICB9CisgIH0KKworICAqbl9vdXQgPSBuOworICAqZF9vdXQgPSBkOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfZGVpbnRlcmxhY2VfY2Fwc19kb3VibGVfZnJhbWVyYXRlIChHc3RDYXBzICogY2FwcywgZ2Jvb2xlYW4gaGFsZikKK3sKKyAgZ3VpbnQgbGVuOworCisgIGZvciAobGVuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpOyBsZW4gPiAwOyBsZW4tLSkgeworICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIGxlbiAtIDEpOworICAgIGNvbnN0IEdWYWx1ZSAqdmFsOworCisgICAgdmFsID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJmcmFtZXJhdGUiKTsKKyAgICBpZiAoIXZhbCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKEdfVkFMVUVfVFlQRSAodmFsKSA9PSBHU1RfVFlQRV9GUkFDVElPTikgeworICAgICAgZ2ludCBuLCBkOworCisgICAgICBuID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9udW1lcmF0b3IgKHZhbCk7CisgICAgICBkID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9kZW5vbWluYXRvciAodmFsKTsKKworICAgICAgaWYgKCFnc3RfZGVpbnRlcmxhY2VfZnJhY3Rpb25fZG91YmxlICgmbiwgJmQsIGhhbGYpKSB7CisgICAgICAgIGdzdF9jYXBzX3JlbW92ZV9zdHJ1Y3R1cmUgKGNhcHMsIGxlbiAtIDEpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTiwgbiwgZCwgTlVMTCk7CisgICAgfSBlbHNlIGlmIChHX1ZBTFVFX1RZUEUgKHZhbCkgPT0gR1NUX1RZUEVfRlJBQ1RJT05fUkFOR0UpIHsKKyAgICAgIGNvbnN0IEdWYWx1ZSAqbWluLCAqbWF4OworICAgICAgR1ZhbHVlIG5yYW5nZSA9IHsgMCwgfSwgbm1pbiA9IHsKKyAgICAgIDAsfSwgbm1heCA9IHsKKyAgICAgIDAsfTsKKyAgICAgIGdpbnQgbiwgZDsKKworICAgICAgZ192YWx1ZV9pbml0ICgmbnJhbmdlLCBHU1RfVFlQRV9GUkFDVElPTl9SQU5HRSk7CisgICAgICBnX3ZhbHVlX2luaXQgKCZubWluLCBHU1RfVFlQRV9GUkFDVElPTik7CisgICAgICBnX3ZhbHVlX2luaXQgKCZubWF4LCBHU1RfVFlQRV9GUkFDVElPTik7CisKKyAgICAgIG1pbiA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fcmFuZ2VfbWluICh2YWwpOworICAgICAgbWF4ID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9yYW5nZV9tYXggKHZhbCk7CisKKyAgICAgIG4gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX251bWVyYXRvciAobWluKTsKKyAgICAgIGQgPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX2Rlbm9taW5hdG9yIChtaW4pOworCisgICAgICBpZiAoIWdzdF9kZWludGVybGFjZV9mcmFjdGlvbl9kb3VibGUgKCZuLCAmZCwgaGFsZikpIHsKKyAgICAgICAgZ192YWx1ZV91bnNldCAoJm5yYW5nZSk7CisgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZubWF4KTsKKyAgICAgICAgZ192YWx1ZV91bnNldCAoJm5taW4pOworICAgICAgICBnc3RfY2Fwc19yZW1vdmVfc3RydWN0dXJlIChjYXBzLCBsZW4gLSAxKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGdzdF92YWx1ZV9zZXRfZnJhY3Rpb24gKCZubWluLCBuLCBkKTsKKworICAgICAgbiA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fbnVtZXJhdG9yIChtYXgpOworICAgICAgZCA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fZGVub21pbmF0b3IgKG1heCk7CisKKyAgICAgIGlmICghZ3N0X2RlaW50ZXJsYWNlX2ZyYWN0aW9uX2RvdWJsZSAoJm4sICZkLCBoYWxmKSkgeworICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmbnJhbmdlKTsKKyAgICAgICAgZ192YWx1ZV91bnNldCAoJm5tYXgpOworICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmbm1pbik7CisgICAgICAgIGdzdF9jYXBzX3JlbW92ZV9zdHJ1Y3R1cmUgKGNhcHMsIGxlbiAtIDEpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgZ3N0X3ZhbHVlX3NldF9mcmFjdGlvbiAoJm5tYXgsIG4sIGQpOworICAgICAgZ3N0X3ZhbHVlX3NldF9mcmFjdGlvbl9yYW5nZSAoJm5yYW5nZSwgJm5taW4sICZubWF4KTsKKworICAgICAgZ3N0X3N0cnVjdHVyZV90YWtlX3ZhbHVlIChzLCAiZnJhbWVyYXRlIiwgJm5yYW5nZSk7CisKKyAgICAgIGdfdmFsdWVfdW5zZXQgKCZubWluKTsKKyAgICAgIGdfdmFsdWVfdW5zZXQgKCZubWF4KTsKKyAgICB9IGVsc2UgaWYgKEdfVkFMVUVfVFlQRSAodmFsKSA9PSBHU1RfVFlQRV9MSVNUKSB7CisgICAgICBjb25zdCBHVmFsdWUgKmx2YWw7CisgICAgICBHVmFsdWUgbmxpc3QgPSB7IDAsIH07CisgICAgICBHVmFsdWUgbnZhbCA9IHsgMCwgfTsKKyAgICAgIGdpbnQgaTsKKworICAgICAgZ192YWx1ZV9pbml0ICgmbmxpc3QsIEdTVF9UWVBFX0xJU1QpOworICAgICAgZm9yIChpID0gZ3N0X3ZhbHVlX2xpc3RfZ2V0X3NpemUgKHZhbCk7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgZ2ludCBuLCBkOworCisgICAgICAgIGx2YWwgPSBnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUgKHZhbCwgaSAtIDEpOworCisgICAgICAgIGlmIChHX1ZBTFVFX1RZUEUgKGx2YWwpICE9IEdTVF9UWVBFX0ZSQUNUSU9OKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIG4gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX251bWVyYXRvciAobHZhbCk7CisgICAgICAgIGQgPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX2Rlbm9taW5hdG9yIChsdmFsKTsKKworICAgICAgICAvKiBEb3VibGUvSGFsZiB0aGUgZnJhbWVyYXRlIGJ1dCBpZiB0aGlzIGZhaWxzIHNpbXBseQorICAgICAgICAgKiBza2lwIHRoaXMgdmFsdWUgZnJvbSB0aGUgbGlzdCAqLworICAgICAgICBpZiAoIWdzdF9kZWludGVybGFjZV9mcmFjdGlvbl9kb3VibGUgKCZuLCAmZCwgaGFsZikpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGdfdmFsdWVfaW5pdCAoJm52YWwsIEdTVF9UWVBFX0ZSQUNUSU9OKTsKKworICAgICAgICBnc3RfdmFsdWVfc2V0X2ZyYWN0aW9uICgmbnZhbCwgbiwgZCk7CisgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF9hbmRfdGFrZV92YWx1ZSAoJm5saXN0LCAmbnZhbCk7CisgICAgICB9CisgICAgICBnc3Rfc3RydWN0dXJlX3Rha2VfdmFsdWUgKHMsICJmcmFtZXJhdGUiLCAmbmxpc3QpOworICAgIH0KKyAgfQorCisgIHJldHVybiBjYXBzOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfZGVpbnRlcmxhY2VfZ2V0Y2FwcyAoR3N0RGVpbnRlcmxhY2UgKiBzZWxmLCBHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKnJldCwgKmNhcHM7CisgIEdzdFBhZCAqb3RoZXJwYWQ7CisgIGdpbnQgbGVuOworICBHc3RDYXBzICpvdXJjYXBzOworICBHc3RDYXBzICpwZWVyY2FwczsKKyAgR3N0Q2FwcyAqdG1wLCAqdG1wMjsKKworICBvdGhlcnBhZCA9IChwYWQgPT0gc2VsZi0+c3JjcGFkKSA/IHNlbGYtPnNpbmtwYWQgOiBzZWxmLT5zcmNwYWQ7CisKKyAgb3VyY2FwcyA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChwYWQpOworICBwZWVyY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChvdGhlcnBhZCwgTlVMTCk7CisKKyAgLyogRmlsdGVyIGFueSBwZWVyY2FwcyB0aGF0IGFyZSBhdmFpbGFibGUgd2l0aCBvdXIgdGVtcGxhdGUKKyAgICogdG8gZ2V0IHN0YXJ0ZWQgd2l0aCB0aGUgc3Vic2V0IG9mIGNhcHMgd2UgYWN0dWFsbHkgc3VwcG9ydCAqLworICBpZiAocGVlcmNhcHMpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJQZWVyIGhhcyBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBwZWVyY2Fwcyk7CisgICAgY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGdzdF9jYXBzX2ludGVyc2VjdCAob3VyY2FwcywgcGVlcmNhcHMpKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcmNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChvdXJjYXBzKTsKKyAgICBwZWVyY2FwcyA9IG91cmNhcHMgPSBOVUxMOworICB9IGVsc2UgeworICAgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChvdXJjYXBzKTsKKyAgICBvdXJjYXBzID0gTlVMTDsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwKKyAgICAgICJUcmFuc2Zvcm1pbmcgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCAiIHdpdGggZmlsdGVyICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgY2FwcywgZmlsdGVyKTsKKworICAvKiBJZiBkZWludGVybGFjaW5nIGlzIGRpc2FibGVkLCB3ZSBqdXN0IHBhc3N0aHJvdWdoIHRoZQorICAgKiBjYXBzIGFuZCBldmVyeXRoaW5nICovCisgIGlmIChzZWxmLT5tb2RlID09IEdTVF9ERUlOVEVSTEFDRV9NT0RFX0RJU0FCTEVEKSB7CisgICAgcmV0ID0gY2FwczsKKyAgICBjYXBzID0gTlVMTDsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICAvKiBJZiBkZWludGVybGFjaW5nIGlzIGVuZm9yY2VkLCB3ZSBjYW4gb25seSBhY2NlcHQgdGhlCisgICAqIGNhcHMgZm9yIHdoaWNoIHdlIGNhbiBhY3R1YWxseSBkbyBkZWludGVybGFjaW5nICovCisgIGlmIChzZWxmLT5tb2RlID09IEdTVF9ERUlOVEVSTEFDRV9NT0RFX0lOVEVSTEFDRUQpIHsKKyAgICB0bXAgPSBnc3Rfc3RhdGljX2NhcHNfZ2V0ICgmZGVpbnRlcmxhY2VfY2Fwcyk7CisgICAgcmV0ID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGNhcHMsIHRtcCwgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICB0bXAgPSBOVUxMOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICBjYXBzID0gTlVMTDsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBnX2Fzc2VydCAoc2VsZi0+bW9kZSA9PSBHU1RfREVJTlRFUkxBQ0VfTU9ERV9BVVRPCisgICAgICB8fCBzZWxmLT5tb2RlID09IEdTVF9ERUlOVEVSTEFDRV9NT0RFX0FVVE9fU1RSSUNUKTsKKworICAvKiBGb3IgdGhlIGF1dG8gbW9kZSB3ZSBoYXZlIHRvIGRvIGEgYml0IG1vcmUgdGhhbiB0aGF0ICovCisgIHJldCA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKworICAvKiBXZSBjYW4gYWNjZXB0IGFueSBzdHJ1Y3R1cmUgaWYKKyAgICogLSB0aGV5IGFyZSBwcm9ncmVzc2l2ZSBhbHJlYWR5CisgICAqCisgICAqLworICB0bXAgPSBnc3Rfc3RhdGljX2NhcHNfZ2V0ICgmcHJvZ3Jlc3NpdmVfY2Fwcyk7CisgIHRtcDIgPSBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoY2FwcywgdG1wLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgdG1wID0gTlVMTDsKKyAgcmV0ID0gZ3N0X2NhcHNfbWVyZ2UgKHJldCwgdG1wMik7CisgIHRtcDIgPSBOVUxMOworCisgIC8qIG9yCisgICAqIC0gdGhleSBoYXZlIHN5c21lbSBjYXBzIGZlYXR1cmVzIGFuZCBhIGZvcm1hdCBmb3Igd2hpY2ggd2Ugc3VwcG9ydAorICAgKiAgIGRlaW50ZXJsYWNpbmcKKyAgICogb3IKKyAgICogLSB0aGV5IGhhdmUgQU5ZIGNhcHMgZmVhdHVyZXMsIGluIHdoaWNoIGNhc2Ugd2Ugc3VwcG9ydCBpdCBmb3IKKyAgICogICBzeXNtZW0gY2FwcyBmZWF0dXJlcyBmb3IgZm9ybWF0cyB3ZSBzdXBwb3J0CisgICAqCisgICAqIE5PVEU6IFRoZXNlIGFyZSB0aGUgY2FwcyB3aGVyZSB3ZSBhY3R1YWxseSB3b3VsZCBkbyBkZWludGVybGFjaW5nCisgICAqIG91cnNlbHZlcy4gSWYgZmllbGRzID09IEFMTCB3ZSB3b3VsZCBkb3VibGUgdGhlIGZyYW1lcmF0ZSBzbyB3b3VsZAorICAgKiBoYXZlIHRvIGhhbGYgdGhlIGZyYW1lcmF0ZSBjb25zdHJhaW50cyBmcm9tIGRvd25zdHJlYW0gaGVyZQorICAgKi8KKyAgdG1wID0gZ3N0X3N0YXRpY19jYXBzX2dldCAoJmRlaW50ZXJsYWNlX2NhcHMpOworICB0bXAyID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGNhcHMsIHRtcCwgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHRtcCk7CisgIHRtcCA9IE5VTEw7CisKKyAgZm9yIChsZW4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAodG1wMik7IGxlbiA+IDA7IGxlbi0tKSB7CisgICAgR3N0U3RydWN0dXJlICpzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAodG1wMiwgbGVuIC0gMSk7CisKKyAgICBpZiAocGFkID09IHNlbGYtPnNpbmtwYWQpCisgICAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAocywgImludGVybGFjZS1tb2RlIik7CisgICAgZWxzZQorICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJpbnRlcmxhY2UtbW9kZSIsIEdfVFlQRV9TVFJJTkcsICJwcm9ncmVzc2l2ZSIsCisgICAgICAgICAgTlVMTCk7CisgIH0KKworICBpZiAoc2VsZi0+dXNlcl9zZXRfZmllbGRzID09IEdTVF9ERUlOVEVSTEFDRV9BTEwpIHsKKyAgICB0bXAyID0gZ3N0X2RlaW50ZXJsYWNlX2NhcHNfZG91YmxlX2ZyYW1lcmF0ZSAodG1wMiwgKHBhZCA9PSBzZWxmLT5zaW5rcGFkKSk7CisgIH0KKyAgaWYgKHNlbGYtPnVzZXJfc2V0X2ZpZWxkcyA9PSBHU1RfREVJTlRFUkxBQ0VfRklFTERTX0FVVE8pIHsKKyAgICB0bXAgPSBnc3RfY2Fwc19jb3B5ICh0bXAyKTsKKyAgICB0bXAgPSBnc3RfZGVpbnRlcmxhY2VfY2Fwc19kb3VibGVfZnJhbWVyYXRlICh0bXAsIChwYWQgPT0gc2VsZi0+c2lua3BhZCkpOworICB9CisKKyAgcmV0ID0gZ3N0X2NhcHNfbWVyZ2UgKHJldCwgdG1wMik7CisgIHRtcDIgPSBOVUxMOworICBpZiAodG1wICE9IE5VTEwpIHsKKyAgICByZXQgPSBnc3RfY2Fwc19tZXJnZSAocmV0LCB0bXApOworICAgIHRtcCA9IE5VTEw7CisgIH0KKworICAvKiBvcgorICAgKiAtIGFueXRoaW5nIGVsc2UgaW4gd2hpY2ggY2FzZSB3ZSB3b3VsZCBqdXN0IHBhc3N0aHJvdWdoIGFnYWluIGlmIHdlJ3JlCisgICAqICAgb25seSBpbiBBVVRPIGFuZCBub3QgQVVUT19TVFJJQ1QgbW9kZQorICAgKi8KKyAgaWYgKHNlbGYtPm1vZGUgPT0gR1NUX0RFSU5URVJMQUNFX01PREVfQVVUTykKKyAgICByZXQgPSBnc3RfY2Fwc19tZXJnZSAocmV0LCBnc3RfY2Fwc19jb3B5IChjYXBzKSk7CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBjYXBzID0gTlVMTDsKKworZG9uZToKKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqdG1wOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgImludGVyc2VjdGluZyB3aXRoICUiIEdTVF9QVFJfRk9STUFULCBmaWx0ZXIpOworICAgIHRtcCA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHJldCwgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmV0KTsKKyAgICByZXQgPSB0bXA7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJSZXR1cm5pbmcgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgcmV0KTsKKworICByZXR1cm4gcmV0OworfQorCisvKiB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIHBvb2wsIGFsbG9jYXRvciBhbmQgcXVlcnkgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RlaW50ZXJsYWNlX3NldF9hbGxvY2F0aW9uIChHc3REZWludGVybGFjZSAqIHNlbGYsCisgICAgR3N0QnVmZmVyUG9vbCAqIHBvb2wsIEdzdEFsbG9jYXRvciAqIGFsbG9jYXRvciwKKyAgICBHc3RBbGxvY2F0aW9uUGFyYW1zICogcGFyYW1zKQoreworICBHc3RBbGxvY2F0b3IgKm9sZGFsbG9jOworICBHc3RCdWZmZXJQb29sICpvbGRwb29sOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoc2VsZik7CisgIG9sZHBvb2wgPSBzZWxmLT5wb29sOworICBzZWxmLT5wb29sID0gcG9vbDsKKworICBvbGRhbGxvYyA9IHNlbGYtPmFsbG9jYXRvcjsKKyAgc2VsZi0+YWxsb2NhdG9yID0gYWxsb2NhdG9yOworCisgIGlmIChwYXJhbXMpCisgICAgc2VsZi0+cGFyYW1zID0gKnBhcmFtczsKKyAgZWxzZQorICAgIGdzdF9hbGxvY2F0aW9uX3BhcmFtc19pbml0ICgmc2VsZi0+cGFyYW1zKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNlbGYpOworCisgIGlmIChvbGRwb29sKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImRlYWN0aXZhdGluZyBvbGQgcG9vbCAlcCIsIG9sZHBvb2wpOworICAgIGdzdF9idWZmZXJfcG9vbF9zZXRfYWN0aXZlIChvbGRwb29sLCBGQUxTRSk7CisgICAgZ3N0X29iamVjdF91bnJlZiAob2xkcG9vbCk7CisgIH0KKyAgaWYgKG9sZGFsbG9jKSB7CisgICAgZ3N0X29iamVjdF91bnJlZiAob2xkYWxsb2MpOworICB9CisgIGlmIChwb29sKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImFjdGl2YXRpbmcgbmV3IHBvb2wgJXAiLCBwb29sKTsKKyAgICBnc3RfYnVmZmVyX3Bvb2xfc2V0X2FjdGl2ZSAocG9vbCwgVFJVRSk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RlaW50ZXJsYWNlX2RvX2J1ZmZlcnBvb2wgKEdzdERlaW50ZXJsYWNlICogc2VsZiwgR3N0Q2FwcyAqIG91dGNhcHMpCit7CisgIEdzdFF1ZXJ5ICpxdWVyeTsKKyAgZ2Jvb2xlYW4gcmVzdWx0ID0gVFJVRTsKKyAgR3N0QnVmZmVyUG9vbCAqcG9vbDsKKyAgR3N0QWxsb2NhdG9yICphbGxvY2F0b3I7CisgIEdzdEFsbG9jYXRpb25QYXJhbXMgcGFyYW1zOworICBHc3RTdHJ1Y3R1cmUgKmNvbmZpZzsKKyAgZ3VpbnQgc2l6ZSwgbWluLCBtYXg7CisKKyAgaWYgKHNlbGYtPnBhc3N0aHJvdWdoKSB7CisgICAgLyogd2UgYXJlIGluIHBhc3N0aHJvdWdoLCB0aGUgaW5wdXQgYnVmZmVyIGlzIG5ldmVyIGNvcGllZCBhbmQgYWx3YXlzIHBhc3NlZAorICAgICAqIGFsb25nLiBXZSBuZXZlciBhbGxvY2F0ZSBhbiBvdXRwdXQgYnVmZmVyIG9uIHRoZSBzcmNwYWQuIFdoYXQgd2UgZG8gaXMKKyAgICAgKiBsZXQgdGhlIHVwc3RyZWFtIGVsZW1lbnQgZGVjaWRlIGlmIGl0IHdhbnRzIHRvIHVzZSBhIGJ1ZmZlcnBvb2wgYW5kCisgICAgICogdGhlbiB3ZSB3aWxsIHByb3h5IHRoZSBkb3duc3RyZWFtIHBvb2wgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAid2UncmUgcGFzc3Rob3VnaCwgZGVsYXkgYnVmZmVycG9vbCIpOworICAgIGdzdF9kZWludGVybGFjZV9zZXRfYWxsb2NhdGlvbiAoc2VsZiwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICAvKiBub3QgcGFzc3Rocm91Z2gsIHdlIG5lZWQgdG8gYWxsb2NhdGUgKi8KKyAgLyogZmluZCBhIHBvb2wgZm9yIHRoZSBuZWdvdGlhdGVkIGNhcHMgbm93ICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJkb2luZyBhbGxvY2F0aW9uIHF1ZXJ5Iik7CisgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19hbGxvY2F0aW9uIChvdXRjYXBzLCBUUlVFKTsKKyAgaWYgKCFnc3RfcGFkX3BlZXJfcXVlcnkgKHNlbGYtPnNyY3BhZCwgcXVlcnkpKSB7CisgICAgLyogbm90IGEgcHJvYmxlbSwganVzdCBkZWJ1ZyBhIGxpdHRsZSAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJwZWVyIEFMTE9DQVRJT04gcXVlcnkgZmFpbGVkIik7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiQUxMT0NBVElPTiAoJWQpIHBhcmFtczogJSIgR1NUX1BUUl9GT1JNQVQsIHJlc3VsdCwKKyAgICAgIHF1ZXJ5KTsKKworICAvKiB3ZSBnb3QgY29uZmlndXJhdGlvbiBmcm9tIG91ciBwZWVyIG9yIHRoZSBkZWNpZGVfYWxsb2NhdGlvbiBtZXRob2QsCisgICAqIHBhcnNlIHRoZW0gKi8KKyAgaWYgKGdzdF9xdWVyeV9nZXRfbl9hbGxvY2F0aW9uX3BhcmFtcyAocXVlcnkpID4gMCkgeworICAgIGdzdF9xdWVyeV9wYXJzZV9udGhfYWxsb2NhdGlvbl9wYXJhbSAocXVlcnksIDAsICZhbGxvY2F0b3IsICZwYXJhbXMpOworICB9IGVsc2UgeworICAgIGFsbG9jYXRvciA9IE5VTEw7CisgICAgZ3N0X2FsbG9jYXRpb25fcGFyYW1zX2luaXQgKCZwYXJhbXMpOworICB9CisKKyAgaWYgKGdzdF9xdWVyeV9nZXRfbl9hbGxvY2F0aW9uX3Bvb2xzIChxdWVyeSkgPiAwKQorICAgIGdzdF9xdWVyeV9wYXJzZV9udGhfYWxsb2NhdGlvbl9wb29sIChxdWVyeSwgMCwgJnBvb2wsICZzaXplLCAmbWluLCAmbWF4KTsKKyAgZWxzZSB7CisgICAgcG9vbCA9IE5VTEw7CisgICAgc2l6ZSA9IEdTVF9WSURFT19JTkZPX1NJWkUgKCZzZWxmLT52aW5mbyk7CisgICAgbWluID0KKyAgICAgICAgTUFYICgoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9nZXRfZmllbGRzX3JlcXVpcmVkIChzZWxmLT5tZXRob2QpICsKKyAgICAgICAgICAgIDEpIC8gMiArIDEsIDQpOworICAgIG1heCA9IDA7CisgIH0KKworICBpZiAocG9vbCA9PSBOVUxMKSB7CisgICAgLyogbm8gcG9vbCwgd2UgY2FuIG1ha2Ugb3VyIG93biAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJubyBwb29sLCBtYWtpbmcgbmV3IHBvb2wiKTsKKyAgICBwb29sID0gZ3N0X3ZpZGVvX2J1ZmZlcl9wb29sX25ldyAoKTsKKyAgfQorCisgIC8qIG5vdyBjb25maWd1cmUgKi8KKyAgY29uZmlnID0gZ3N0X2J1ZmZlcl9wb29sX2dldF9jb25maWcgKHBvb2wpOworICBnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX3NldF9wYXJhbXMgKGNvbmZpZywgb3V0Y2Fwcywgc2l6ZSwgbWluLCBtYXgpOworICBnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX3NldF9hbGxvY2F0b3IgKGNvbmZpZywgYWxsb2NhdG9yLCAmcGFyYW1zKTsKKyAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19hZGRfb3B0aW9uIChjb25maWcsIEdTVF9CVUZGRVJfUE9PTF9PUFRJT05fVklERU9fTUVUQSk7CisgIGdzdF9idWZmZXJfcG9vbF9zZXRfY29uZmlnIChwb29sLCBjb25maWcpOworCisgIC8qIG5vdyBzdG9yZSAqLworICByZXN1bHQgPSBnc3RfZGVpbnRlcmxhY2Vfc2V0X2FsbG9jYXRpb24gKHNlbGYsIHBvb2wsIGFsbG9jYXRvciwgJnBhcmFtcyk7CisKKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGFjZV9zZXRjYXBzIChHc3REZWludGVybGFjZSAqIHNlbGYsIEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKnNyY2NhcHMgPSBOVUxMOworICBHc3RWaWRlb0ludGVybGFjZU1vZGUgaW50ZXJsYWNpbmdfbW9kZTsKKyAgZ2ludCBmcHNfbiwgZnBzX2Q7CisgIEdzdENhcHMgKnBlZXJjYXBzLCAqY3VycmVudF9jYXBzOworCisgIGdzdF9wYWRfY2hlY2tfcmVjb25maWd1cmUgKHNlbGYtPnNyY3BhZCk7CisKKyAgaWYgKChjdXJyZW50X2NhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHBhZCkpKSB7CisgICAgaWYgKGdzdF9jYXBzX2lzX2VxdWFsIChjYXBzLCBjdXJyZW50X2NhcHMpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJHb3Qgc2FtZSBjYXBzIGFnYWluLCByZXR1cm5pbmciKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChjdXJyZW50X2NhcHMpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGdzdF9kZWludGVybGFjZV9yZXNldF9oaXN0b3J5IChzZWxmLCBGQUxTRSk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGN1cnJlbnRfY2Fwcyk7CisgIH0KKyAgcGVlcmNhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAoc2VsZi0+c3JjcGFkLCBOVUxMKTsKKworICAvKiBNYWtlIHN1cmUgdGhlIHBlZXIgY2FwcyBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZSB0ZW1wbGF0ZSBjYXBzICovCisgIGlmIChwZWVyY2FwcykgeworICAgIEdzdENhcHMgKnRtcCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChzZWxmLT5zcmNwYWQpOworICAgIEdzdENhcHMgKnRtcDIgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHBlZXJjYXBzLCB0bXApOworCisgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICBwZWVyY2FwcyA9IE5VTEw7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHRtcCk7CisKKyAgICBpZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKHRtcDIpKSB7CisgICAgICBnc3RfY2Fwc191bnJlZiAodG1wMik7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiUGVlciBjYXBzIG5vdCBjb21wYXRpYmxlIHdpdGggdGVtcGxhdGUgY2FwcyIpOworICAgICAgZ290byBpbnZhbGlkX2NhcHM7CisgICAgfQorICAgIHBlZXJjYXBzID0gdG1wMjsKKyAgfQorCisgIGlmIChzZWxmLT5sb2NraW5nICE9IEdTVF9ERUlOVEVSTEFDRV9MT0NLSU5HX05PTkUpIHsKKyAgICBpZiAoc2VsZi0+bG93X2xhdGVuY3kgPT0gLTEpCisgICAgICBzZWxmLT5sb3dfbGF0ZW5jeSA9IGdzdF9kZWludGVybGFjZV9nZXRfbGF0ZW5jeSAoc2VsZik7CisKKyAgICBpZiAoc2VsZi0+cGF0dGVybl9sb2NrKSB7CisgICAgICAvKiByZWZyZXNoIGhhcyBiZWVuIHN1Y2Nlc3NmdWwgLSB3ZSBoYXZlIGEgbG9jayBub3cgKi8KKyAgICAgIHNlbGYtPnBhdHRlcm5fcmVmcmVzaCA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAvKiBpZiB3ZSB3ZXJlIG5vdCByZWZyZXNoaW5nICghcGF0dGVybl9yZWZyZXNoKSB0aGUgY2FwcyBoYXZlIGNoYW5nZWQKKyAgICAgICAqIHNvIHdlIG5lZWQgdG8gcmVmcmVzaCBhbmQgd2UgZG9uJ3QgaGF2ZSBhIGxvY2sgYW55bW9yZQorICAgICAgICogb3RoZXJ3aXNlIHdlIGhhdmUgcGF0dGVybl9mcmVzaCBhbmQgIXBhdHRlcm5fbG9jayBhbnl3YXkgKi8KKyAgICAgIHNlbGYtPnBhdHRlcm5fcmVmcmVzaCA9IFRSVUU7CisgICAgICBzZWxmLT5wYXR0ZXJuX2xvY2sgPSBGQUxTRTsKKyAgICB9CisgIH0KKworICBpZiAoIWdzdF92aWRlb19pbmZvX2Zyb21fY2FwcyAoJnNlbGYtPnZpbmZvLCBjYXBzKSkKKyAgICBnb3RvIGludmFsaWRfY2FwczsKKworICBmcHNfbiA9IEdTVF9WSURFT19JTkZPX0ZQU19OICgmc2VsZi0+dmluZm8pOworICBmcHNfZCA9IEdTVF9WSURFT19JTkZPX0ZQU19EICgmc2VsZi0+dmluZm8pOworCisgIC8qIFVwZGF0ZSBwYXNzdGhyb3VnaCBpbmZvcm1hdGlvbiAqLworICBpZiAoc2VsZi0+bW9kZSA9PSBHU1RfREVJTlRFUkxBQ0VfTU9ERV9ESVNBQkxFRCkgeworICAgIHNlbGYtPnBhc3N0aHJvdWdoID0gVFJVRTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiUGFzc3Rocm91Z2ggYmVjYXVzZSBtb2RlPWRpc2FibGVkIik7CisgIH0gZWxzZSBpZiAoc2VsZi0+bW9kZSA9PSBHU1RfREVJTlRFUkxBQ0VfTU9ERV9JTlRFUkxBQ0VEKSB7CisgICAgR3N0Q2FwcyAqdG1wID0gZ3N0X3N0YXRpY19jYXBzX2dldCAoJmRlaW50ZXJsYWNlX2NhcHMpOworCisgICAgaWYgKCFnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChjYXBzLCB0bXApKSB7CisgICAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsICJVbnN1cHBvcnRlZCBjYXBzIGZvciBtb2RlPWludGVybGFjZWQiKTsKKyAgICAgIGdvdG8gaW52YWxpZF9jYXBzOworICAgIH0KKworICAgIHNlbGYtPnBhc3N0aHJvdWdoID0gRkFMU0U7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIk5vdCBwYXNzdGhyb3VnaCBiZWNhdXNlIG1vZGU9aW50ZXJsYWNlZCIpOworICB9IGVsc2UgaWYgKHNlbGYtPm1vZGUgPT0gR1NUX0RFSU5URVJMQUNFX01PREVfQVVUTworICAgICAgfHwgc2VsZi0+bW9kZSA9PSBHU1RfREVJTlRFUkxBQ0VfTU9ERV9BVVRPX1NUUklDVCkgeworICAgIEdzdENhcHMgKnRtcCA9IGdzdF9zdGF0aWNfY2Fwc19nZXQgKCZkZWludGVybGFjZV9jYXBzKTsKKworICAgIC8qIEFscmVhZHkgcHJvZ3Jlc3NpdmU/IFBhc3N0aHJvdWdoICovCisgICAgaWYgKCFHU1RfVklERU9fSU5GT19JU19JTlRFUkxBQ0VEICgmc2VsZi0+dmluZm8pKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgICAgICJQYXNzdGhyb3VnaCBiZWNhdXNlIG1vZGU9YXV0byBhbmQgcHJvZ3Jlc3NpdmUgY2FwcyIpOworICAgICAgc2VsZi0+cGFzc3Rocm91Z2ggPSBUUlVFOworICAgIH0gZWxzZSBpZiAoZ3N0X2NhcHNfY2FuX2ludGVyc2VjdCAoY2FwcywgdG1wKSkgeworICAgICAgaWYgKHBlZXJjYXBzKSB7CisgICAgICAgIEdzdENhcHMgKmFsbG93ZWRfY2FwczsKKyAgICAgICAgR3N0Q2FwcyAqdG1wMjsKKyAgICAgICAgR3N0U3RydWN0dXJlICpzOworCisgICAgICAgIGFsbG93ZWRfY2FwcyA9IGdzdF9jYXBzX2ludGVyc2VjdCAocGVlcmNhcHMsIHRtcCk7CisKKyAgICAgICAgdG1wMiA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworICAgICAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAodG1wMiwgMCk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiaW50ZXJsYWNlLW1vZGUiLCBHX1RZUEVfU1RSSU5HLCAicHJvZ3Jlc3NpdmUiLAorICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzLCAiZnJhbWVyYXRlIik7CisKKyAgICAgICAgLyogRG93bnN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IHByb2dyZXNzaXZlIGNhcHMgYnV0IHN1cHBvcnRzCisgICAgICAgICAqIHRoZSB1cHN0cmVhbSBjYXBzLCBnbyBwYXNzdGhyb3VnaC4KKyAgICAgICAgICogVE9ETzogV2UgbWlnaHQgd2FudCB0byBjaGVjayB0aGUgZnJhbWVyYXRlIGNvbXBhdGliaWxpdHkKKyAgICAgICAgICogb2YgdGhlIGNhcHMgdG9vIGhlcmUKKyAgICAgICAgICovCisgICAgICAgIGlmIChnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChhbGxvd2VkX2NhcHMsIGNhcHMpCisgICAgICAgICAgICAmJiAhZ3N0X2NhcHNfY2FuX2ludGVyc2VjdCAoYWxsb3dlZF9jYXBzLCB0bXAyKSkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICAgICAgICJQYXNzdGhyb3VnaCBiZWNhdXNlIG1vZGU9YXV0bywgIgorICAgICAgICAgICAgICAiZG93bnN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IHByb2dyZXNzaXZlIGNhcHMgYW5kIGludGVybGFjZWQgY2FwcyIpOworICAgICAgICAgIHNlbGYtPnBhc3N0aHJvdWdoID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiTm90IHBhc3N0aHJvdWdoIGJlY2F1c2UgbW9kZT1hdXRvLCAiCisgICAgICAgICAgICAgICJkb3duc3RyZWFtIHN1cHBvcnRzIHByb2dyZXNzaXZlIGNhcHMgYW5kIGludGVybGFjZWQgY2FwcyIpOworICAgICAgICAgIHNlbGYtPnBhc3N0aHJvdWdoID0gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBnc3RfY2Fwc191bnJlZiAoYWxsb3dlZF9jYXBzKTsKKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKHRtcDIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwKKyAgICAgICAgICAgICJOb3QgcGFzc3Rocm91Z2ggYmVjYXVzZSBtb2RlPWF1dG8gYW5kIGludGVybGFjZWQgY2FwcyIpOworICAgICAgICBzZWxmLT5wYXNzdGhyb3VnaCA9IEZBTFNFOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoc2VsZi0+bW9kZSA9PSBHU1RfREVJTlRFUkxBQ0VfTU9ERV9BVVRPKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc2VsZiwKKyAgICAgICAgICAgICJQYXNzdGhyb3VnaCBiZWNhdXNlIG1vZGU9YXV0byBhbmQgdW5zdXBwb3J0ZWQgaW50ZXJsYWNlZCBjYXBzIik7CisgICAgICAgIHNlbGYtPnBhc3N0aHJvdWdoID0gVFJVRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9jYXBzX3VucmVmICh0bXApOworICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLAorICAgICAgICAgICAgIlVuc3VwcG9ydGVkIGludGVybGFjZWQgY2FwcyBpbiBtb2RlPWF1dG8tc3RyaWN0Iik7CisgICAgICAgIGdvdG8gaW52YWxpZF9jYXBzOworICAgICAgfQorICAgIH0KKworICAgIGdzdF9jYXBzX3VucmVmICh0bXApOworICB9IGVsc2UgeworICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICB9CisKKyAgaW50ZXJsYWNpbmdfbW9kZSA9IEdTVF9WSURFT19JTkZPX0lOVEVSTEFDRV9NT0RFICgmc2VsZi0+dmluZm8pOworCisgIGlmICghc2VsZi0+cGFzc3Rocm91Z2gpIHsKKyAgICBpZiAoc2VsZi0+cGF0dGVybl9sb2NrKSB7CisgICAgICBzcmNjYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgICAgICBpZiAoc2VsZi0+cGF0dGVybiAhPSAtMQorICAgICAgICAgICYmIEdfVU5MSUtFTFkgKCFnc3RfdXRpbF9mcmFjdGlvbl9tdWx0aXBseSAoZnBzX24sIGZwc19kLAorICAgICAgICAgICAgICAgICAgdGVsZWNpbmVfcGF0dGVybnNbc2VsZi0+cGF0dGVybl0ucmF0aW9fbiwKKyAgICAgICAgICAgICAgICAgIHRlbGVjaW5lX3BhdHRlcm5zW3NlbGYtPnBhdHRlcm5dLnJhdGlvX2QsICZmcHNfbiwgJmZwc19kKSkpCisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsCisgICAgICAgICAgICAiTXVsdGlwbHlpbmcgdGhlIGZyYW1lcmF0ZSBieSB0aGUgdGVsZWNpbmUgcGF0dGVybiByYXRpbyBvdmVyZmxvd2VkISIpOworICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoc3JjY2FwcywgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLCBmcHNfbiwKKyAgICAgICAgICBmcHNfZCwgTlVMTCk7CisgICAgfSBlbHNlIGlmIChzZWxmLT5sb2NraW5nID09IEdTVF9ERUlOVEVSTEFDRV9MT0NLSU5HX0FDVElWRQorICAgICAgICB8fCBzZWxmLT5sb3dfbGF0ZW5jeSA9PSAwKSB7CisgICAgICAvKiBpbiBoaWdoIGxhdGVuY3kgcGF0dGVybiBsb2NraW5nIG1vZGUgaWYgd2UgZG9uJ3QgaGF2ZSBhIHBhdHRlcm4gbG9jaywKKyAgICAgICAqIHRoZSBzaW5rIHBhZCBjYXBzIGFyZSB0aGUgYmVzdCB3ZSBrbm93ICovCisgICAgICBzcmNjYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgICAgfSBlbHNlIGlmIChzZWxmLT5sb3dfbGF0ZW5jeSA+IDAKKyAgICAgICAgJiYgaW50ZXJsYWNpbmdfbW9kZSA9PSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfTUlYRUQKKyAgICAgICAgJiYgc2VsZi0+cGF0dGVybiA9PSAtMSkgeworICAgICAgLyogZm9yIGluaXRpYWwgYnVmZmVycyBvZiBhIHRlbGVjaW5lIHBhdHRlcm4sIHVudGlsIHRoZXJlIGlzIGEgbG9jayB3ZQorICAgICAgICogd2Ugb3V0cHV0IG5hw692ZWx5IGFkanVzdGVkIHRpbWVzdGFtcHMgaW4gbG93LWxhdGVuY3kgcGF0dGVybiBsb2NraW5nCisgICAgICAgKiBtb2RlICovCisgICAgICBzcmNjYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChzcmNjYXBzLCAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT04sIDAsIDEsIE5VTEwpOworICAgIH0gZWxzZSBpZiAoc2VsZi0+dXNlcl9zZXRfZmllbGRzID09IEdTVF9ERUlOVEVSTEFDRV9GSUVMRFNfQVVUTykgeworICAgICAgc3JjY2FwcyA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworICAgICAgaWYgKHBlZXJjYXBzKSB7CisgICAgICAgIGdib29sZWFuIGNhbl9iZV90ZiA9IEZBTFNFOworCisgICAgICAgIC8qIFdlIGFscmVhZHkga25vdyB0aGF0IHdlIGFyZSBub3QgcGFzc3Rocm91Z2g6IGludGVybGFjZS1tb2RlIHdpbGwKKyAgICAgICAgICogYmUgcHJvZ3Jlc3NpdmUgKi8KKyAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoc3JjY2FwcywgImludGVybGFjZS1tb2RlIiwgR19UWVBFX1NUUklORywKKyAgICAgICAgICAgICJwcm9ncmVzc2l2ZSIsIE5VTEwpOworCisgICAgICAgIGlmIChnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChwZWVyY2Fwcywgc3JjY2FwcykpIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiQ2FuIGRlaW50ZXJsYWNlIHRvcCBmaWVsZHMiKTsKKyAgICAgICAgICBjYW5fYmVfdGYgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIHNyY2NhcHMgPSBnc3RfZGVpbnRlcmxhY2VfY2Fwc19kb3VibGVfZnJhbWVyYXRlIChzcmNjYXBzLCBGQUxTRSk7CisgICAgICAgIGlmICghZ3N0X2NhcHNfY2FuX2ludGVyc2VjdCAocGVlcmNhcHMsIHNyY2NhcHMpKSB7CisgICAgICAgICAgaWYgKGNhbl9iZV90ZikgeworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIldpbGwgZGVpbnRlcmxhY2UgdG9wIGZpZWxkcyIpOworICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoc3JjY2FwcywgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLCBmcHNfbiwKKyAgICAgICAgICAgICAgICBmcHNfZCwgTlVMTCk7CisgICAgICAgICAgICBzZWxmLT5maWVsZHMgPSBHU1RfREVJTlRFUkxBQ0VfVEY7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICAgICAgICAgIkNhbid0IG5lZ290aWF0ZSB1cHN0cmVhbSBhbmQgZG93bnN0cmVhbSBjYXBzIik7CisgICAgICAgICAgICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisgICAgICAgICAgICBnb3RvIGludmFsaWRfY2FwczsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkRlaW50ZXJsYWNpbmcgYWxsIGZpZWxkcyIpOworICAgICAgICAgIHNlbGYtPmZpZWxkcyA9IEdTVF9ERUlOVEVSTEFDRV9BTEw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICAgICAiTm8gcGVlciBjYXBzIHlldCwgZmFsbGluZyBiYWNrIHRvIGRlaW50ZXJsYWNpbmcgYWxsIGZpZWxkcyIpOworICAgICAgICBzZWxmLT5maWVsZHMgPSBHU1RfREVJTlRFUkxBQ0VfQUxMOworICAgICAgICBzcmNjYXBzID0gZ3N0X2RlaW50ZXJsYWNlX2NhcHNfZG91YmxlX2ZyYW1lcmF0ZSAoc3JjY2FwcywgRkFMU0UpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzZWxmLT5maWVsZHMgPSBzZWxmLT51c2VyX3NldF9maWVsZHM7CisgICAgICBzcmNjYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgICAgICBpZiAoc2VsZi0+ZmllbGRzID09IEdTVF9ERUlOVEVSTEFDRV9BTEwpCisgICAgICAgIHNyY2NhcHMgPSBnc3RfZGVpbnRlcmxhY2VfY2Fwc19kb3VibGVfZnJhbWVyYXRlIChzcmNjYXBzLCBGQUxTRSk7CisgICAgfQorCisgICAgLyogSWYgbm90IHBhc3N0aHJvdWdoLCB3ZSBhcmUgZ29pbmcgdG8gb3V0cHV0IHByb2dyZXNzaXZlIGNvbnRlbnQgKi8KKyAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChzcmNjYXBzLCAiaW50ZXJsYWNlLW1vZGUiLCBHX1RZUEVfU1RSSU5HLAorICAgICAgICAicHJvZ3Jlc3NpdmUiLCBOVUxMKTsKKworICAgIGdzdF9kZWludGVybGFjZV9zZXRfbWV0aG9kIChzZWxmLCBzZWxmLT5tZXRob2RfaWQpOworICAgIGdzdF9kZWludGVybGFjZV9tZXRob2Rfc2V0dXAgKHNlbGYtPm1ldGhvZCwgJnNlbGYtPnZpbmZvKTsKKyAgfSBlbHNlIHsKKyAgICBzcmNjYXBzID0gZ3N0X2NhcHNfcmVmIChjYXBzKTsKKyAgfQorCisgIGlmIChmcHNfbiAhPSAwKSB7CisgICAgc2VsZi0+ZmllbGRfZHVyYXRpb24gPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKEdTVF9TRUNPTkQsIGZwc19kLCAyICogZnBzX24pOworICB9IGVsc2UgeworICAgIHNlbGYtPmZpZWxkX2R1cmF0aW9uID0gMDsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgIlNpbmsgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJTcmMgIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBzcmNjYXBzKTsKKworICBpZiAoIWdzdF9wYWRfc2V0X2NhcHMgKHNlbGYtPnNyY3BhZCwgc3JjY2FwcykpCisgICAgZ290byBzZXRfY2Fwc19mYWlsZWQ7CisKKyAgaWYgKCFnc3RfZGVpbnRlcmxhY2VfZG9fYnVmZmVycG9vbCAoc2VsZiwgc3JjY2FwcykpCisgICAgZ290byBub19idWZmZXJwb29sOworCisgIGlmIChwZWVyY2FwcykKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcmNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgcmV0dXJuIFRSVUU7CisKK2ludmFsaWRfY2FwczoKKyAgeworICAgIGlmIChwZWVyY2FwcykKKyAgICAgIGdzdF9jYXBzX3VucmVmIChwZWVyY2Fwcyk7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocGFkLCAiSW52YWxpZCBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisgICAgZ3N0X3BhZF9tYXJrX3JlY29uZmlndXJlIChzZWxmLT5zcmNwYWQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorc2V0X2NhcHNfZmFpbGVkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocGFkLCAiRmFpbGVkIHRvIHNldCBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgc3JjY2Fwcyk7CisgICAgaWYgKHBlZXJjYXBzKQorICAgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisgICAgZ3N0X3BhZF9tYXJrX3JlY29uZmlndXJlIChzZWxmLT5zcmNwYWQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fYnVmZmVycG9vbDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBhZCwgImNvdWxkIG5vdCBuZWdvdGlhdGUgYnVmZmVycG9vbCIpOworICAgIGlmIChwZWVyY2FwcykKKyAgICAgIGdzdF9jYXBzX3VucmVmIChwZWVyY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworICAgIGdzdF9wYWRfbWFya19yZWNvbmZpZ3VyZSAoc2VsZi0+c3JjcGFkKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZGVpbnRlcmxhY2Vfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisgIEdzdERlaW50ZXJsYWNlICpzZWxmID0gR1NUX0RFSU5URVJMQUNFIChwYXJlbnQpOworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJyZWNlaXZlZCAlcyBldmVudDogJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCksIGV2ZW50KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfY2FwcyAoZXZlbnQsICZjYXBzKTsKKyAgICAgIHJlcyA9IGdzdF9kZWludGVybGFjZV9zZXRjYXBzIChzZWxmLCBwYWQsIGNhcHMpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDoKKyAgICB7CisgICAgICBjb25zdCBHc3RTZWdtZW50ICpzZWdtZW50OworCisgICAgICBnc3RfZXZlbnRfcGFyc2Vfc2VnbWVudCAoZXZlbnQsICZzZWdtZW50KTsKKworICAgICAgZ3N0X2RlaW50ZXJsYWNlX3Jlc2V0X3FvcyAoc2VsZik7CisgICAgICBnc3RfZGVpbnRlcmxhY2VfcmVzZXRfaGlzdG9yeSAoc2VsZiwgRkFMU0UpOworCisgICAgICBpZiAoc2VnbWVudC0+Zm9ybWF0ID09IEdTVF9GT1JNQVRfVElNRSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsCisgICAgICAgICAgICAiR290IFNFR01FTlQgZXZlbnQgaW4gVElNRSBmb3JtYXQsIHBhc3Npbmcgb24gKCUiCisgICAgICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiAtICUiIEdTVF9USU1FX0ZPUk1BVCAiKSIsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChzZWdtZW50LT5zdGFydCksIEdTVF9USU1FX0FSR1MgKHNlZ21lbnQtPnN0b3ApKTsKKyAgICAgICAgZ3N0X3NlZ21lbnRfY29weV9pbnRvIChzZWdtZW50LCAmc2VsZi0+c2VnbWVudCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhZCwgIkdvdCBTRUdNRU5UIGV2ZW50IGluICVzIGZvcm1hdCIsCisgICAgICAgICAgICBnc3RfZm9ybWF0X2dldF9uYW1lIChzZWdtZW50LT5mb3JtYXQpKTsKKyAgICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlbGYtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVU5ERUZJTkVEKTsKKyAgICAgIH0KKworICAgICAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChzZWxmLT5zcmNwYWQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9DVVNUT01fRE9XTlNUUkVBTTp7CisgICAgICBnYm9vbGVhbiBzdGlsbF9zdGF0ZTsKKworICAgICAgaWYgKGdzdF92aWRlb19ldmVudF9wYXJzZV9zdGlsbF9mcmFtZSAoZXZlbnQsICZzdGlsbF9zdGF0ZSkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlJlY2VpdmVkIHN0aWxsIGZyYW1lIGV2ZW50LCBzdGF0ZSAlZCIsCisgICAgICAgICAgICBzdGlsbF9zdGF0ZSk7CisKKyAgICAgICAgaWYgKHN0aWxsX3N0YXRlKSB7CisgICAgICAgICAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiSGFuZGxpbmcgc3RpbGwgZnJhbWUiKTsKKyAgICAgICAgICBzZWxmLT5zdGlsbF9mcmFtZV9tb2RlID0gVFJVRTsKKyAgICAgICAgICBnc3RfZGVpbnRlcmxhY2VfcmVzZXRfaGlzdG9yeSAoc2VsZiwgRkFMU0UpOworICAgICAgICAgIGlmIChzZWxmLT5sYXN0X2J1ZmZlcikgeworICAgICAgICAgICAgcmV0ID0KKyAgICAgICAgICAgICAgICBnc3RfcGFkX3B1c2ggKHNlbGYtPnNyY3BhZCwgZ3N0X2J1ZmZlcl9yZWYgKHNlbGYtPmxhc3RfYnVmZmVyKSk7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiUHVzaGVkIHN0aWxsIGZyYW1lLCByZXN1bHQ6ICVzIiwKKyAgICAgICAgICAgICAgICBnc3RfZmxvd19nZXRfbmFtZSAocmV0KSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc2VsZiwgIk5vIHBlbmRpbmcgYnVmZmVyISIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiRW5kaW5nIHN0aWxsIGZyYW1lcyIpOworICAgICAgICAgIHNlbGYtPnN0aWxsX2ZyYW1lX21vZGUgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNyY3BhZCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgIHNlbGYtPmhhdmVfZW9zID0gVFJVRTsKKyAgICAgIGdzdF9kZWludGVybGFjZV9yZXNldF9oaXN0b3J5IChzZWxmLCBGQUxTRSk7CisgICAgICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNyY3BhZCwgZXZlbnQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgaWYgKHNlbGYtPnN0aWxsX2ZyYW1lX21vZGUpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkVuZGluZyBzdGlsbCBmcmFtZXMiKTsKKyAgICAgICAgc2VsZi0+c3RpbGxfZnJhbWVfbW9kZSA9IEZBTFNFOworICAgICAgfQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3Jlc2V0X3FvcyAoc2VsZik7CisgICAgICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNyY3BhZCwgZXZlbnQpOworICAgICAgZ3N0X2RlaW50ZXJsYWNlX3Jlc2V0X2hpc3RvcnkgKHNlbGYsIFRSVUUpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGFjZV9wcm9wb3NlX2FsbG9jYXRpb24gKEdzdERlaW50ZXJsYWNlICogc2VsZiwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0QnVmZmVyUG9vbCAqcG9vbDsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0VmlkZW9JbmZvIGluZm87CisgIGd1aW50IHNpemU7CisgIEdzdFN0cnVjdHVyZSAqY29uZmlnOworCisgIGdzdF9xdWVyeV9wYXJzZV9hbGxvY2F0aW9uIChxdWVyeSwgJmNhcHMsIE5VTEwpOworCisgIGlmIChjYXBzID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3ZpZGVvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgY2FwcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHNpemUgPSBHU1RfVklERU9fSU5GT19TSVpFICgmaW5mbyk7CisKKyAgcG9vbCA9IGdzdF92aWRlb19idWZmZXJfcG9vbF9uZXcgKCk7CisKKyAgZ3N0X3F1ZXJ5X2FkZF9hbGxvY2F0aW9uX3Bvb2wgKHF1ZXJ5LCBwb29sLCBzaXplLCAwLCAwKTsKKworICBjb25maWcgPSBnc3RfYnVmZmVyX3Bvb2xfZ2V0X2NvbmZpZyAocG9vbCk7CisgIGdzdF9idWZmZXJfcG9vbF9jb25maWdfc2V0X3BhcmFtcyAoY29uZmlnLCBjYXBzLCBzaXplLAorICAgICAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfZ2V0X2ZpZWxkc19yZXF1aXJlZCAoc2VsZi0+bWV0aG9kKSArIDEpIC8gMiArIDEsCisgICAgICAwKTsKKyAgZ3N0X2J1ZmZlcl9wb29sX3NldF9jb25maWcgKHBvb2wsIGNvbmZpZyk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocG9vbCk7CisgIGdzdF9xdWVyeV9hZGRfYWxsb2NhdGlvbl9tZXRhIChxdWVyeSwgR1NUX1ZJREVPX01FVEFfQVBJX1RZUEUsIE5VTEwpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGFjZV9zaW5rX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0RGVpbnRlcmxhY2UgKnNlbGYgPSBHU1RfREVJTlRFUkxBQ0UgKHBhcmVudCk7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICIlcyBxdWVyeSIsIEdTVF9RVUVSWV9UWVBFX05BTUUgKHF1ZXJ5KSk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpmaWx0ZXIsICpjYXBzOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY2FwcyAocXVlcnksICZmaWx0ZXIpOworICAgICAgY2FwcyA9IGdzdF9kZWludGVybGFjZV9nZXRjYXBzIChzZWxmLCBwYWQsIGZpbHRlcik7CisgICAgICBnc3RfcXVlcnlfc2V0X2NhcHNfcmVzdWx0IChxdWVyeSwgY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICByZXMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX0FDQ0VQVF9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisgICAgICBnYm9vbGVhbiByZXQ7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9hY2NlcHRfY2FwcyAocXVlcnksICZjYXBzKTsKKyAgICAgIHJldCA9IGdzdF9kZWludGVybGFjZV9hY2NlcHRjYXBzIChzZWxmLCBwYWQsIGNhcHMpOworICAgICAgZ3N0X3F1ZXJ5X3NldF9hY2NlcHRfY2Fwc19yZXN1bHQgKHF1ZXJ5LCByZXQpOworICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9BTExPQ0FUSU9OOgorICAgICAgaWYgKHNlbGYtPnBhc3N0aHJvdWdoKQorICAgICAgICByZXMgPSBnc3RfcGFkX3BlZXJfcXVlcnkgKHNlbGYtPnNyY3BhZCwgcXVlcnkpOworICAgICAgZWxzZQorICAgICAgICByZXMgPSBnc3RfZGVpbnRlcmxhY2VfcHJvcG9zZV9hbGxvY2F0aW9uIChzZWxmLCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfZGVpbnRlcmxhY2VfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3REZWludGVybGFjZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEFDRSAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19QTEFZSU5HOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisgIGlmIChyZXQgIT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKQorICAgIHJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9kZWludGVybGFjZV9yZXNldCAoc2VsZik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGFjZV9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3REZWludGVybGFjZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEFDRSAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgInJlY2VpdmVkICVzIGV2ZW50IiwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9RT1M6eworICAgICAgR3N0Q2xvY2tUaW1lRGlmZiBkaWZmOworICAgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKyAgICAgIEdzdFFPU1R5cGUgdHlwZTsKKyAgICAgIGdkb3VibGUgcHJvcG9ydGlvbjsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3FvcyAoZXZlbnQsICZ0eXBlLCAmcHJvcG9ydGlvbiwgJmRpZmYsICZ0aW1lc3RhbXApOworCisgICAgICBnc3RfZGVpbnRlcmxhY2VfdXBkYXRlX3FvcyAoc2VsZiwgcHJvcG9ydGlvbiwgZGlmZiwgdGltZXN0YW1wKTsKKyAgICB9CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGFjZV9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3REZWludGVybGFjZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEFDRSAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgIiVzIHF1ZXJ5IiwgR1NUX1FVRVJZX1RZUEVfTkFNRSAocXVlcnkpKTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9MQVRFTkNZOgorICAgICAgaWYgKCFzZWxmLT5wYXNzdGhyb3VnaCkgeworICAgICAgICBHc3RDbG9ja1RpbWUgbWluLCBtYXg7CisgICAgICAgIGdib29sZWFuIGxpdmU7CisgICAgICAgIEdzdFBhZCAqcGVlcjsKKworICAgICAgICBpZiAoKHBlZXIgPSBnc3RfcGFkX2dldF9wZWVyIChzZWxmLT5zaW5rcGFkKSkpIHsKKyAgICAgICAgICBpZiAoKHJlcyA9IGdzdF9wYWRfcXVlcnkgKHBlZXIsIHF1ZXJ5KSkpIHsKKyAgICAgICAgICAgIEdzdENsb2NrVGltZSBsYXRlbmN5OworICAgICAgICAgICAgZ2ludCBmaWVsZHNfcmVxdWlyZWQgPSAwOworICAgICAgICAgICAgZ2ludCBtZXRob2RfbGF0ZW5jeSA9IDA7CisKKyAgICAgICAgICAgIGlmIChzZWxmLT5tZXRob2QpIHsKKyAgICAgICAgICAgICAgZmllbGRzX3JlcXVpcmVkID0KKyAgICAgICAgICAgICAgICAgIGdzdF9kZWludGVybGFjZV9tZXRob2RfZ2V0X2ZpZWxkc19yZXF1aXJlZCAoc2VsZi0+bWV0aG9kKTsKKyAgICAgICAgICAgICAgbWV0aG9kX2xhdGVuY3kgPQorICAgICAgICAgICAgICAgICAgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9nZXRfbGF0ZW5jeSAoc2VsZi0+bWV0aG9kKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2xhdGVuY3kgKHF1ZXJ5LCAmbGl2ZSwgJm1pbiwgJm1heCk7CisKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJQZWVyIGxhdGVuY3k6IG1pbiAlIgorICAgICAgICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiIG1heCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAobWluKSwgR1NUX1RJTUVfQVJHUyAobWF4KSk7CisKKyAgICAgICAgICAgIC8qIGFkZCBvdXIgb3duIGxhdGVuY3kgKi8KKyAgICAgICAgICAgIGxhdGVuY3kgPSAoZmllbGRzX3JlcXVpcmVkICsgbWV0aG9kX2xhdGVuY3kpICogc2VsZi0+ZmllbGRfZHVyYXRpb247CisKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJPdXIgbGF0ZW5jeTogbWluICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAgICAgICAgICIsIG1heCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAobGF0ZW5jeSksIEdTVF9USU1FX0FSR1MgKGxhdGVuY3kpKTsKKworICAgICAgICAgICAgbWluICs9IGxhdGVuY3k7CisgICAgICAgICAgICBpZiAobWF4ICE9IEdTVF9DTE9DS19USU1FX05PTkUpCisgICAgICAgICAgICAgIG1heCArPSBsYXRlbmN5OworCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiQ2FsY3VsYXRlZCB0b3RhbCBsYXRlbmN5IDogbWluICUiCisgICAgICAgICAgICAgICAgR1NUX1RJTUVfRk9STUFUICIgbWF4ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChtaW4pLCBHU1RfVElNRV9BUkdTIChtYXgpKTsKKworICAgICAgICAgICAgZ3N0X3F1ZXJ5X3NldF9sYXRlbmN5IChxdWVyeSwgbGl2ZSwgbWluLCBtYXgpOworICAgICAgICAgIH0KKyAgICAgICAgICBnc3Rfb2JqZWN0X3VucmVmIChwZWVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChkZWludGVybGFjZV9kZWJ1ZywgImRlaW50ZXJsYWNlIiwgMCwgIkRlaW50ZXJsYWNlciIpOworCisjaWYgSEFWRV9PUkMKKyAgb3JjX2luaXQgKCk7CisjZW5kaWYKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJkZWludGVybGFjZSIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfREVJTlRFUkxBQ0UpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBkZWludGVybGFjZSwKKyAgICAiRGVpbnRlcmxhY2VyIiwgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwKKyAgICBHU1RfUEFDS0FHRV9PUklHSU4pOwpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmggYi9nc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGNjNjM3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmgKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNYXJ0aW4gRWlrZXJtYW5uIDxtZWlrZXJAdXBiLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfREVJTlRFUkxBQ0VfSF9fCisjZGVmaW5lIF9fR1NUX0RFSU5URVJMQUNFX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb3Bvb2wuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9tZXRhLmg+CisKKyNpbmNsdWRlICJnc3RkZWludGVybGFjZW1ldGhvZC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0UgXAorICAoZ3N0X2RlaW50ZXJsYWNlX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0RFSU5URVJMQUNFLEdzdERlaW50ZXJsYWNlKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0RFSU5URVJMQUNFLEdzdERlaW50ZXJsYWNlKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfREVJTlRFUkxBQ0UpKQorI2RlZmluZSBHU1RfSVNfREVJTlRFUkxBQ0VfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0RFSU5URVJMQUNFKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdERlaW50ZXJsYWNlIEdzdERlaW50ZXJsYWNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdERlaW50ZXJsYWNlQ2xhc3MgR3N0RGVpbnRlcmxhY2VDbGFzczsKKwordHlwZWRlZiBlbnVtCit7CisgIEdTVF9ERUlOVEVSTEFDRV9UT01TTU9DT01QLAorICBHU1RfREVJTlRFUkxBQ0VfR1JFRURZX0gsCisgIEdTVF9ERUlOVEVSTEFDRV9HUkVFRFlfTCwKKyAgR1NUX0RFSU5URVJMQUNFX1ZGSVIsCisgIEdTVF9ERUlOVEVSTEFDRV9MSU5FQVIsCisgIEdTVF9ERUlOVEVSTEFDRV9MSU5FQVJfQkxFTkQsCisgIEdTVF9ERUlOVEVSTEFDRV9TQ0FMRVJfQk9CLAorICBHU1RfREVJTlRFUkxBQ0VfV0VBVkUsCisgIEdTVF9ERUlOVEVSTEFDRV9XRUFWRV9URkYsCisgIEdTVF9ERUlOVEVSTEFDRV9XRUFWRV9CRkYKK30gR3N0RGVpbnRlcmxhY2VNZXRob2RzOworCit0eXBlZGVmIGVudW0KK3sKKyAgR1NUX0RFSU5URVJMQUNFX0FMTCwgICAgICAgICAvKiBBbGwgKG1pc3NpbmcgZGF0YSBpcyBpbnRlcnAuKSAqLworICBHU1RfREVJTlRFUkxBQ0VfVEYsICAgICAgICAgIC8qIFRvcCBGaWVsZHMgT25seSAqLworICBHU1RfREVJTlRFUkxBQ0VfQkYsICAgICAgICAgIC8qIEJvdHRvbSBGaWVsZHMgT25seSAqLworICBHU1RfREVJTlRFUkxBQ0VfRklFTERTX0FVVE8gIC8qIEF1dG9tYXRpY2FsbHkgZGV0ZWN0ICovCit9IEdzdERlaW50ZXJsYWNlRmllbGRzOworCit0eXBlZGVmIGVudW0KK3sKKyAgR1NUX0RFSU5URVJMQUNFX0xBWU9VVF9BVVRPLAorICBHU1RfREVJTlRFUkxBQ0VfTEFZT1VUX1RGRiwKKyAgR1NUX0RFSU5URVJMQUNFX0xBWU9VVF9CRkYKK30gR3N0RGVpbnRlcmxhY2VGaWVsZExheW91dDsKKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX0RFSU5URVJMQUNFX01PREVfQVVUTywKKyAgR1NUX0RFSU5URVJMQUNFX01PREVfSU5URVJMQUNFRCwKKyAgR1NUX0RFSU5URVJMQUNFX01PREVfRElTQUJMRUQsCisgIEdTVF9ERUlOVEVSTEFDRV9NT0RFX0FVVE9fU1RSSUNUCit9IEdzdERlaW50ZXJsYWNlTW9kZTsKKwordHlwZWRlZiBlbnVtCit7CisgIEdTVF9ERUlOVEVSTEFDRV9MT0NLSU5HX05PTkUsCisgIEdTVF9ERUlOVEVSTEFDRV9MT0NLSU5HX0FVVE8sCisgIEdTVF9ERUlOVEVSTEFDRV9MT0NLSU5HX0FDVElWRSwKKyAgR1NUX0RFSU5URVJMQUNFX0xPQ0tJTkdfUEFTU0lWRSwKK30gR3N0RGVpbnRlcmxhY2VMb2NraW5nOworCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NQVhfRklFTERfSElTVE9SWSAxMAorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUFYX0JVRkZFUl9TVEFURV9ISVNUT1JZIDUwCisvKiBjaGVjayBtYXggZmllbGQgaGlzdG9yeSBpcyBsYXJnZSBlbm91Z2ggKi8KKyNpZiBHU1RfREVJTlRFUkxBQ0VfTUFYX0ZJRUxEX0hJU1RPUlkgPCBHU1RfREVJTlRFUkxBQ0VfTUFYX0JVRkZFUl9TVEFURV9ISVNUT1JZICogMworI3VuZGVmIEdTVF9ERUlOVEVSTEFDRV9NQVhfRklFTERfSElTVE9SWQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUFYX0ZJRUxEX0hJU1RPUlkgKEdTVF9ERUlOVEVSTEFDRV9NQVhfQlVGRkVSX1NUQVRFX0hJU1RPUlkgKiAzKQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IF9UZWxlY2luZVBhdHRlcm4gVGVsZWNpbmVQYXR0ZXJuOworc3RydWN0IF9UZWxlY2luZVBhdHRlcm4KK3sKKyAgY29uc3QgZ2NoYXIgKm5pY2s7CisgIGd1aW50OCBsZW5ndGg7CisgIGd1aW50OCByYXRpb19uLCByYXRpb19kOworICBndWludDggc3RhdGVzW0dTVF9ERUlOVEVSTEFDRV9NQVhfQlVGRkVSX1NUQVRFX0hJU1RPUlldOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdERlaW50ZXJsYWNlQnVmZmVyU3RhdGUgR3N0RGVpbnRlcmxhY2VCdWZmZXJTdGF0ZTsKK3N0cnVjdCBfR3N0RGVpbnRlcmxhY2VCdWZmZXJTdGF0ZQoreworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworICBHc3RDbG9ja1RpbWUgZHVyYXRpb247CisgIGd1aW50OCBzdGF0ZTsKK307CisKK3N0cnVjdCBfR3N0RGVpbnRlcmxhY2UKK3sKKyAgR3N0RWxlbWVudCBwYXJlbnQ7CisKKyAgR3N0UGFkICpzcmNwYWQsICpzaW5rcGFkOworCisgIC8qIDxwcml2YXRlPiAqLworICBHc3REZWludGVybGFjZU1vZGUgbW9kZTsKKworICBHc3REZWludGVybGFjZUZpZWxkTGF5b3V0IGZpZWxkX2xheW91dDsKKworICBHc3REZWludGVybGFjZUZpZWxkcyBmaWVsZHM7CisKKyAgR3N0RGVpbnRlcmxhY2VGaWVsZHMgdXNlcl9zZXRfZmllbGRzOworCisgIC8qIGN1cnJlbnQgc3RhdGUgKGRpZmZlcnMgd2hlbiBmbHVzaGluZy9pbnZlcnNlIHRlbGVjaW5lIHVzaW5nIHdlYXZlKSAqLworICBHc3REZWludGVybGFjZU1ldGhvZHMgbWV0aG9kX2lkOworICAvKiBwcm9wZXJ0eSB2YWx1ZSAqLworICBHc3REZWludGVybGFjZU1ldGhvZHMgdXNlcl9zZXRfbWV0aG9kX2lkOworICBHc3REZWludGVybGFjZU1ldGhvZCAqbWV0aG9kOworCisgIEdzdFZpZGVvSW5mbyB2aW5mbzsKKyAgR3N0QnVmZmVyUG9vbCAqcG9vbDsKKyAgR3N0QWxsb2NhdG9yICphbGxvY2F0b3I7CisgIEdzdEFsbG9jYXRpb25QYXJhbXMgcGFyYW1zOworCisgIGdib29sZWFuIHBhc3N0aHJvdWdoOworICBnYm9vbGVhbiBkaXNjb250OworCisgIEdzdENsb2NrVGltZSBmaWVsZF9kdXJhdGlvbjsgLyogRHVyYXRpb24gb2Ygb25lIGZpZWxkICovCisKKyAgLyogVGhlIG1vc3QgcmVjZW50IHBpY3R1cmVzIAorICAgICBQaWN0dXJlSGlzdG9yeVswXSBpcyBhbHdheXMgdGhlIG1vc3QgcmVjZW50LgorICAgICBQb2ludGVycyBhcmUgTlVMTCBpZiB0aGUgcGljdHVyZSBpbiBxdWVzdGlvbiBpc24ndCB2YWxpZCwgZS5nLiBiZWNhdXNlCisgICAgIHRoZSBwcm9ncmFtIGp1c3Qgc3RhcnRlZCBvciBhIHBpY3R1cmUgd2FzIHNraXBwZWQuCisgICAqLworICBHc3REZWludGVybGFjZUZpZWxkIGZpZWxkX2hpc3RvcnlbR1NUX0RFSU5URVJMQUNFX01BWF9GSUVMRF9ISVNUT1JZXTsKKyAgZ3VpbnQgaGlzdG9yeV9jb3VudDsKKyAgaW50IGN1cl9maWVsZF9pZHg7CisKKyAgLyogU2V0IHRvIFRSVUUgaWYgd2UncmUgaW4gc3RpbGwgZnJhbWUgbW9kZSwKKyAgICAgaS5lLiBqdXN0IGZvcndhcmQgYWxsIGJ1ZmZlcnMKKyAgICovCisgIGdib29sZWFuIHN0aWxsX2ZyYW1lX21vZGU7CisKKyAgLyogTGFzdCBidWZmZXIgdGhhdCB3YXMgcHVzaGVkIGluICovCisgIEdzdEJ1ZmZlciAqbGFzdF9idWZmZXI7CisKKyAgLyogQ3VycmVudCBzZWdtZW50ICovCisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICAvKiBRb1Mgc3R1ZmYgKi8KKyAgZ2RvdWJsZSBwcm9wb3J0aW9uOworICBHc3RDbG9ja1RpbWUgZWFybGllc3RfdGltZTsKKyAgZ2ludDY0IHByb2Nlc3NlZDsKKyAgZ2ludDY0IGRyb3BwZWQ7CisKKyAgR3N0Q2FwcyAqcmVxdWVzdF9jYXBzOworCisgIGdib29sZWFuIHJlY29uZmlndXJlOworICBHc3REZWludGVybGFjZU1vZGUgbmV3X21vZGU7CisgIEdzdERlaW50ZXJsYWNlRmllbGRzIG5ld19maWVsZHM7CisKKyAgR3N0RGVpbnRlcmxhY2VMb2NraW5nIGxvY2tpbmc7CisgIGdpbnQgbG93X2xhdGVuY3k7CisgIGdib29sZWFuIGRyb3Bfb3JwaGFuczsKKyAgZ2Jvb2xlYW4gaWdub3JlX29ic2N1cmU7CisgIGdib29sZWFuIHBhdHRlcm5fbG9jazsKKyAgZ2Jvb2xlYW4gcGF0dGVybl9yZWZyZXNoOworICBHc3REZWludGVybGFjZUJ1ZmZlclN0YXRlIGJ1Zl9zdGF0ZXNbR1NUX0RFSU5URVJMQUNFX01BWF9CVUZGRVJfU1RBVEVfSElTVE9SWV07CisgIGdpbnQgc3RhdGVfY291bnQ7CisgIGdpbnQgcGF0dGVybjsKKyAgZ3VpbnQ4IHBhdHRlcm5fcGhhc2U7CisgIGd1aW50OCBwYXR0ZXJuX2NvdW50OworICBndWludDggb3V0cHV0X2NvdW50OworICBHc3RDbG9ja1RpbWUgcGF0dGVybl9iYXNlX3RzOworICBHc3RDbG9ja1RpbWUgcGF0dGVybl9idWZfZHVyOworCisgIGdib29sZWFuIG5lZWRfbW9yZTsKKyAgZ2Jvb2xlYW4gaGF2ZV9lb3M7Cit9OworCitzdHJ1Y3QgX0dzdERlaW50ZXJsYWNlQ2xhc3MKK3sKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9kZWludGVybGFjZV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9ERUlOVEVSTEFDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5jIGIvZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlbWV0aG9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNlNzdlNwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5jCkBAIC0wLDAgKzEsODAyIEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0Bjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RkZWludGVybGFjZW1ldGhvZC5oIgorCitHX0RFRklORV9BQlNUUkFDVF9UWVBFIChHc3REZWludGVybGFjZU1ldGhvZCwgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZCwKKyAgICBHU1RfVFlQRV9PQkpFQ1QpOworCitnYm9vbGVhbgorZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9zdXBwb3J0ZWQgKEdUeXBlIHR5cGUsIEdzdFZpZGVvRm9ybWF0IGZvcm1hdCwgZ2ludCB3aWR0aCwKKyAgICBnaW50IGhlaWdodCkKK3sKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzcyAqa2xhc3MgPQorICAgICAgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9DTEFTUyAoZ190eXBlX2NsYXNzX3JlZiAodHlwZSkpOworICBnYm9vbGVhbiByZXQ7CisKKyAgaWYgKGZvcm1hdCA9PSBHU1RfVklERU9fRk9STUFUX1VOS05PV04pCisgICAgcmV0ID0gVFJVRTsKKyAgZWxzZQorICAgIHJldCA9IGtsYXNzLT5zdXBwb3J0ZWQgKGtsYXNzLCBmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOworICBnX3R5cGVfY2xhc3NfdW5yZWYgKGtsYXNzKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGFjZV9tZXRob2Rfc3VwcG9ydGVkX2ltcGwgKEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKiBrbGFzcywKKyAgICBHc3RWaWRlb0Zvcm1hdCBmb3JtYXQsIGdpbnQgd2lkdGgsIGdpbnQgaGVpZ2h0KQoreworICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVVkyOgorICAgICAgcmV0dXJuIChrbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfeXV5MiAhPSBOVUxMKTsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVZZVToKKyAgICAgIHJldHVybiAoa2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l2eXUgIT0gTlVMTCk7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICByZXR1cm4gKGtsYXNzLT5kZWludGVybGFjZV9mcmFtZV91eXZ5ICE9IE5VTEwpOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9JNDIwOgorICAgICAgcmV0dXJuIChrbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfaTQyMCAhPSBOVUxMKTsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVYxMjoKKyAgICAgIHJldHVybiAoa2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l2MTIgIT0gTlVMTCk7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0NDQ6CisgICAgICByZXR1cm4gKGtsYXNzLT5kZWludGVybGFjZV9mcmFtZV95NDQ0ICE9IE5VTEwpOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOgorICAgICAgcmV0dXJuIChrbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfeTQyYiAhPSBOVUxMKTsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQxQjoKKyAgICAgIHJldHVybiAoa2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3k0MWIgIT0gTlVMTCk7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FZVVY6CisgICAgICByZXR1cm4gKGtsYXNzLT5kZWludGVybGFjZV9mcmFtZV9heXV2ICE9IE5VTEwpOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9OVjEyOgorICAgICAgcmV0dXJuIChrbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfbnYxMiAhPSBOVUxMKTsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYyMToKKyAgICAgIHJldHVybiAoa2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX252MjEgIT0gTlVMTCk7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FSR0I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX3hSR0I6CisgICAgICByZXR1cm4gKGtsYXNzLT5kZWludGVybGFjZV9mcmFtZV9hcmdiICE9IE5VTEwpOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BQkdSOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94QkdSOgorICAgICAgcmV0dXJuIChrbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfYWJnciAhPSBOVUxMKTsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCeDoKKyAgICAgIHJldHVybiAoa2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3JnYmEgIT0gTlVMTCk7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUng6CisgICAgICByZXR1cm4gKGtsYXNzLT5kZWludGVybGFjZV9mcmFtZV9iZ3JhICE9IE5VTEwpOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgICByZXR1cm4gKGtsYXNzLT5kZWludGVybGFjZV9mcmFtZV9yZ2IgIT0gTlVMTCk7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUjoKKyAgICAgIHJldHVybiAoa2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX2JnciAhPSBOVUxMKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3ZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2Rfc2V0dXAgKEdzdERlaW50ZXJsYWNlTWV0aG9kICogc2VsZiwgR3N0VmlkZW9JbmZvICogdmluZm8pCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKmtsYXNzID0gR1NUX0RFSU5URVJMQUNFX01FVEhPRF9HRVRfQ0xBU1MgKHNlbGYpOworCisgIGtsYXNzLT5zZXR1cCAoc2VsZiwgdmluZm8pOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9zZXR1cF9pbXBsIChHc3REZWludGVybGFjZU1ldGhvZCAqIHNlbGYsCisgICAgR3N0VmlkZW9JbmZvICogdmluZm8pCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKmtsYXNzID0gR1NUX0RFSU5URVJMQUNFX01FVEhPRF9HRVRfQ0xBU1MgKHNlbGYpOworCisgIHNlbGYtPnZpbmZvID0gdmluZm87CisKKyAgc2VsZi0+ZGVpbnRlcmxhY2VfZnJhbWUgPSBOVUxMOworCisgIGlmIChHU1RfVklERU9fSU5GT19GT1JNQVQgKHNlbGYtPnZpbmZvKSA9PSBHU1RfVklERU9fRk9STUFUX1VOS05PV04pCisgICAgcmV0dXJuOworCisgIHN3aXRjaCAoR1NUX1ZJREVPX0lORk9fRk9STUFUIChzZWxmLT52aW5mbykpIHsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVVZMjoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l1eTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVZZVToKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l2eXU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfVVlWWToKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3V5dnk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfSTQyMDoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX2k0MjA7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVYxMjoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l2MTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQ0NDoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3k0NDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQyQjoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3k0MmI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQxQjoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3k0MWI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVlVVjoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX2F5dXY7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYxMjoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX252MTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYyMToKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX252MjE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeFJHQjoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX2FyZ2I7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQUJHUjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeEJHUjoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX2FiZ3I7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCeDoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3JnYmE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSeDoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX2JncmE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCOgorICAgICAgc2VsZi0+ZGVpbnRlcmxhY2VfZnJhbWUgPSBrbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfcmdiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUjoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX2JncjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzZWxmLT5kZWludGVybGFjZV9mcmFtZSA9IE5VTEw7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9jbGFzc19pbml0IChHc3REZWludGVybGFjZU1ldGhvZENsYXNzICoga2xhc3MpCit7CisgIGtsYXNzLT5zZXR1cCA9IGdzdF9kZWludGVybGFjZV9tZXRob2Rfc2V0dXBfaW1wbDsKKyAga2xhc3MtPnN1cHBvcnRlZCA9IGdzdF9kZWludGVybGFjZV9tZXRob2Rfc3VwcG9ydGVkX2ltcGw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2luaXQgKEdzdERlaW50ZXJsYWNlTWV0aG9kICogc2VsZikKK3sKKyAgc2VsZi0+dmluZm8gPSBOVUxMOworfQorCit2b2lkCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lIChHc3REZWludGVybGFjZU1ldGhvZCAqIHNlbGYsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VGaWVsZCAqIGhpc3RvcnksIGd1aW50IGhpc3RvcnlfY291bnQsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dGZyYW1lLCBpbnQgY3VyX2ZpZWxkX2lkeCkKK3sKKyAgZ19hc3NlcnQgKHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lICE9IE5VTEwpOworICBzZWxmLT5kZWludGVybGFjZV9mcmFtZSAoc2VsZiwgaGlzdG9yeSwgaGlzdG9yeV9jb3VudCwgb3V0ZnJhbWUsCisgICAgICBjdXJfZmllbGRfaWR4KTsKK30KKworZ2ludAorZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9nZXRfZmllbGRzX3JlcXVpcmVkIChHc3REZWludGVybGFjZU1ldGhvZCAqIHNlbGYpCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKmtsYXNzID0gR1NUX0RFSU5URVJMQUNFX01FVEhPRF9HRVRfQ0xBU1MgKHNlbGYpOworCisgIHJldHVybiBrbGFzcy0+ZmllbGRzX3JlcXVpcmVkOworfQorCitnaW50Citnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dldF9sYXRlbmN5IChHc3REZWludGVybGFjZU1ldGhvZCAqIHNlbGYpCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKmtsYXNzID0gR1NUX0RFSU5URVJMQUNFX01FVEhPRF9HRVRfQ0xBU1MgKHNlbGYpOworCisgIHJldHVybiBrbGFzcy0+bGF0ZW5jeTsKK30KKworR19ERUZJTkVfQUJTVFJBQ1RfVFlQRSAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QsCisgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2QsIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRCk7CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2Rfc3VwcG9ydGVkIChHc3REZWludGVybGFjZU1ldGhvZENsYXNzICogbWtsYXNzLAorICAgIEdzdFZpZGVvRm9ybWF0IGZvcm1hdCwgZ2ludCB3aWR0aCwgZ2ludCBoZWlnaHQpCit7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgKmtsYXNzID0KKyAgICAgIEdTVF9ERUlOVEVSTEFDRV9TSU1QTEVfTUVUSE9EX0NMQVNTIChta2xhc3MpOworCisgIGlmICghR1NUX0RFSU5URVJMQUNFX01FVEhPRF9DTEFTUworICAgICAgKGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX3BhcmVudF9jbGFzcyktPnN1cHBvcnRlZCAobWtsYXNzLCBmb3JtYXQsCisgICAgICAgICAgd2lkdGgsIGhlaWdodCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FSR0I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX3hSR0I6CisgICAgICByZXR1cm4gKGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9hcmdiICE9IE5VTEwKKyAgICAgICAgICAmJiBrbGFzcy0+Y29weV9zY2FubGluZV9hcmdiICE9IE5VTEwpOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0J4OgorICAgICAgcmV0dXJuIChrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiYSAhPSBOVUxMCisgICAgICAgICAgJiYga2xhc3MtPmNvcHlfc2NhbmxpbmVfcmdiYSAhPSBOVUxMKTsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQUJHUjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeEJHUjoKKyAgICAgIHJldHVybiAoa2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2FiZ3IgIT0gTlVMTAorICAgICAgICAgICYmIGtsYXNzLT5jb3B5X3NjYW5saW5lX2FiZ3IgIT0gTlVMTCk7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUng6CisgICAgICByZXR1cm4gKGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3JhICE9IE5VTEwKKyAgICAgICAgICAmJiBrbGFzcy0+Y29weV9zY2FubGluZV9iZ3JhICE9IE5VTEwpOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgICByZXR1cm4gKGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9yZ2IgIT0gTlVMTAorICAgICAgICAgICYmIGtsYXNzLT5jb3B5X3NjYW5saW5lX3JnYiAhPSBOVUxMKTsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSOgorICAgICAgcmV0dXJuIChrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYmdyICE9IE5VTEwKKyAgICAgICAgICAmJiBrbGFzcy0+Y29weV9zY2FubGluZV9iZ3IgIT0gTlVMTCk7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lVWTI6CisgICAgICByZXR1cm4gKGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV95dXkyICE9IE5VTEwKKyAgICAgICAgICAmJiBrbGFzcy0+Y29weV9zY2FubGluZV95dXkyICE9IE5VTEwpOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVllVOgorICAgICAgcmV0dXJuIChrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXZ5dSAhPSBOVUxMCisgICAgICAgICAgJiYga2xhc3MtPmNvcHlfc2NhbmxpbmVfeXZ5dSAhPSBOVUxMKTsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfVVlWWToKKyAgICAgIHJldHVybiAoa2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3V5dnkgIT0gTlVMTAorICAgICAgICAgICYmIGtsYXNzLT5jb3B5X3NjYW5saW5lX3V5dnkgIT0gTlVMTCk7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FZVVY6CisgICAgICByZXR1cm4gKGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9heXV2ICE9IE5VTEwKKyAgICAgICAgICAmJiBrbGFzcy0+Y29weV9zY2FubGluZV9heXV2ICE9IE5VTEwpOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9OVjEyOgorICAgICAgcmV0dXJuIChrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYxMiAhPSBOVUxMCisgICAgICAgICAgJiYga2xhc3MtPmNvcHlfc2NhbmxpbmVfbnYxMiAhPSBOVUxMKTsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYyMToKKyAgICAgIHJldHVybiAoa2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX252MjEgIT0gTlVMTAorICAgICAgICAgICYmIGtsYXNzLT5jb3B5X3NjYW5saW5lX252MjEgIT0gTlVMTCk7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWMTI6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0NDQ6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MkI6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MUI6CisgICAgICByZXR1cm4gKGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfeSAhPSBOVUxMCisgICAgICAgICAgJiYga2xhc3MtPmNvcHlfc2NhbmxpbmVfcGxhbmFyX3kgIT0gTlVMTCAmJgorICAgICAgICAgIGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdSAhPSBOVUxMCisgICAgICAgICAgJiYga2xhc3MtPmNvcHlfc2NhbmxpbmVfcGxhbmFyX3UgIT0gTlVMTCAmJgorICAgICAgICAgIGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdiAhPSBOVUxMCisgICAgICAgICAgJiYga2xhc3MtPmNvcHlfc2NhbmxpbmVfcGxhbmFyX3YgIT0gTlVMTCk7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2ludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZAorICAgIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsIGd1aW50OCAqIG91dCwKKyAgICBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc3RyaWRlKQoreworICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMSwgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2NvcHlfc2NhbmxpbmVfcGFja2VkIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqCisgICAgc2VsZiwgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywKKyAgICBndWludCBzdHJpZGUpCit7CisgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0wLCBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWVfcGFja2VkIChHc3REZWludGVybGFjZU1ldGhvZCAqCisgICAgbWV0aG9kLCBjb25zdCBHc3REZWludGVybGFjZUZpZWxkICogaGlzdG9yeSwgZ3VpbnQgaGlzdG9yeV9jb3VudCwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0ZnJhbWUsIGdpbnQgY3VyX2ZpZWxkX2lkeCkKK3sKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKnNlbGYgPSBHU1RfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRCAobWV0aG9kKTsKKyNpZm5kZWYgR19ESVNBQkxFX0FTU0VSVAorICBHc3REZWludGVybGFjZU1ldGhvZENsYXNzICpkbV9jbGFzcyA9IEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR0VUX0NMQVNTIChzZWxmKTsKKyNlbmRpZgorICBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSBzY2FubGluZXM7CisgIGd1aW50IGN1cl9maWVsZF9mbGFnczsKKyAgZ2ludCBpOworICBnaW50IGZyYW1lX2hlaWdodCwgZnJhbWVfd2lkdGg7CisgIEdzdFZpZGVvRnJhbWUgKmZyYW1lcCwgKmZyYW1lMCwgKmZyYW1lMSwgKmZyYW1lMjsKKworICBnX2Fzc2VydCAoc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkICE9IE5VTEwpOworICBnX2Fzc2VydCAoc2VsZi0+Y29weV9zY2FubGluZV9wYWNrZWQgIT0gTlVMTCk7CisKKyAgZnJhbWVfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAob3V0ZnJhbWUpOworICBmcmFtZV93aWR0aCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKG91dGZyYW1lLCAwKTsKKworICBmcmFtZTAgPSBoaXN0b3J5W2N1cl9maWVsZF9pZHhdLmZyYW1lOworICBmcmFtZV93aWR0aCA9IE1JTiAoZnJhbWVfd2lkdGgsIEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGZyYW1lMCwgMCkpOworICBjdXJfZmllbGRfZmxhZ3MgPSBoaXN0b3J5W2N1cl9maWVsZF9pZHhdLmZsYWdzOworCisgIGZyYW1lcCA9IChjdXJfZmllbGRfaWR4ID4gMCA/IGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCAtIDFdLmZyYW1lIDogTlVMTCk7CisgIGlmIChmcmFtZXApCisgICAgZnJhbWVfd2lkdGggPSBNSU4gKGZyYW1lX3dpZHRoLCBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChmcmFtZXAsIDApKTsKKworICBnX2Fzc2VydCAoZG1fY2xhc3MtPmZpZWxkc19yZXF1aXJlZCA8PSA0KTsKKworICBmcmFtZTEgPQorICAgICAgKGN1cl9maWVsZF9pZHggKyAxIDwKKyAgICAgIGhpc3RvcnlfY291bnQgPyBoaXN0b3J5W2N1cl9maWVsZF9pZHggKyAxXS5mcmFtZSA6IE5VTEwpOworICBpZiAoZnJhbWUxKQorICAgIGZyYW1lX3dpZHRoID0gTUlOIChmcmFtZV93aWR0aCwgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoZnJhbWUxLCAwKSk7CisKKyAgZnJhbWUyID0KKyAgICAgIChjdXJfZmllbGRfaWR4ICsgMiA8CisgICAgICBoaXN0b3J5X2NvdW50ID8gaGlzdG9yeVtjdXJfZmllbGRfaWR4ICsgMl0uZnJhbWUgOiBOVUxMKTsKKyAgaWYgKGZyYW1lMikKKyAgICBmcmFtZV93aWR0aCA9IE1JTiAoZnJhbWVfd2lkdGgsIEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGZyYW1lMiwgMCkpOworCisjZGVmaW5lIENMQU1QX0xPVyhpKSAoKChpKTwwKSA/IChpKzIpIDogKGkpKQorI2RlZmluZSBDTEFNUF9ISShpKSAoKChpKT49KGZyYW1lX2hlaWdodCkpID8gKGktMikgOiAoaSkpCisjZGVmaW5lIExJTkUoeCxpKSAoKChndWludDgqKUdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBKCh4KSwwKSkgKyBDTEFNUF9ISShDTEFNUF9MT1coaSkpICogXAorICAgIEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUoKHgpLDApKQorI2RlZmluZSBMSU5FMih4LGkpICgoeCkgPyBMSU5FKHgsaSkgOiBOVUxMKQorCisgIGZvciAoaSA9IDA7IGkgPCBmcmFtZV9oZWlnaHQ7IGkrKykgeworICAgIG1lbXNldCAoJnNjYW5saW5lcywgMCwgc2l6ZW9mIChzY2FubGluZXMpKTsKKyAgICBzY2FubGluZXMuYm90dG9tX2ZpZWxkID0gKGN1cl9maWVsZF9mbGFncyA9PSBQSUNUVVJFX0lOVEVSTEFDRURfQk9UVE9NKTsKKworICAgIGlmICghKChpICYgMSkgXiBzY2FubGluZXMuYm90dG9tX2ZpZWxkKSkgeworICAgICAgLyogY29weWluZyAqLworICAgICAgc2NhbmxpbmVzLnRwID0gTElORTIgKGZyYW1lcCwgaSAtIDEpOworICAgICAgc2NhbmxpbmVzLmJwID0gTElORTIgKGZyYW1lcCwgaSArIDEpOworCisgICAgICBzY2FubGluZXMudHQwID0gTElORTIgKGZyYW1lMCwgKGkgLSAyID49IDApID8gaSAtIDIgOiBpKTsKKyAgICAgIHNjYW5saW5lcy5tMCA9IExJTkUyIChmcmFtZTAsIGkpOworICAgICAgc2NhbmxpbmVzLmJiMCA9IExJTkUyIChmcmFtZTAsIChpICsgMiA8IGZyYW1lX2hlaWdodCA/IGkgKyAyIDogaSkpOworCisgICAgICBzY2FubGluZXMudDEgPSBMSU5FMiAoZnJhbWUxLCBpIC0gMSk7CisgICAgICBzY2FubGluZXMuYjEgPSBMSU5FMiAoZnJhbWUxLCBpICsgMSk7CisKKyAgICAgIHNjYW5saW5lcy50dDIgPSBMSU5FMiAoZnJhbWUyLCAoaSAtIDIgPj0gMCkgPyBpIC0gMiA6IGkpOworICAgICAgc2NhbmxpbmVzLm0yID0gTElORTIgKGZyYW1lMiwgaSk7CisgICAgICBzY2FubGluZXMuYmIyID0gTElORTIgKGZyYW1lMiwgKGkgKyAyIDwgZnJhbWVfaGVpZ2h0ID8gaSArIDIgOiBpKSk7CisKKyAgICAgIHNlbGYtPmNvcHlfc2NhbmxpbmVfcGFja2VkIChzZWxmLCBMSU5FIChvdXRmcmFtZSwgaSksICZzY2FubGluZXMsCisgICAgICAgICAgZnJhbWVfd2lkdGgpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBpbnRlcnBvbGF0aW5nICovCisgICAgICBzY2FubGluZXMudHRwID0gTElORTIgKGZyYW1lcCwgKGkgLSAyID49IDApID8gaSAtIDIgOiBpKTsKKyAgICAgIHNjYW5saW5lcy5tcCA9IExJTkUyIChmcmFtZXAsIGkpOworICAgICAgc2NhbmxpbmVzLmJicCA9IExJTkUyIChmcmFtZXAsIChpICsgMiA8IGZyYW1lX2hlaWdodCA/IGkgKyAyIDogaSkpOworCisgICAgICBzY2FubGluZXMudDAgPSBMSU5FMiAoZnJhbWUwLCBpIC0gMSk7CisgICAgICBzY2FubGluZXMuYjAgPSBMSU5FMiAoZnJhbWUwLCBpICsgMSk7CisKKyAgICAgIHNjYW5saW5lcy50dDEgPSBMSU5FMiAoZnJhbWUxLCAoaSAtIDIgPj0gMCkgPyBpIC0gMiA6IGkpOworICAgICAgc2NhbmxpbmVzLm0xID0gTElORTIgKGZyYW1lMSwgaSk7CisgICAgICBzY2FubGluZXMuYmIxID0gTElORTIgKGZyYW1lMSwgKGkgKyAyIDwgZnJhbWVfaGVpZ2h0ID8gaSArIDIgOiBpKSk7CisKKyAgICAgIHNjYW5saW5lcy50MiA9IExJTkUyIChmcmFtZTIsIGkgLSAxKTsKKyAgICAgIHNjYW5saW5lcy5iMiA9IExJTkUyIChmcmFtZTIsIGkgKyAxKTsKKworICAgICAgc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkIChzZWxmLCBMSU5FIChvdXRmcmFtZSwgaSksICZzY2FubGluZXMsCisgICAgICAgICAgZnJhbWVfd2lkdGgpOworICAgIH0KKyN1bmRlZiBMSU5FCisjdW5kZWYgTElORTIKKyAgfQorfQorCitzdGF0aWMgdm9pZAorICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2ludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl95CisgICAgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwgZ3VpbnQ4ICogb3V0LAorICAgIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMSwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9jb3B5X3NjYW5saW5lX3BsYW5hcl95IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZAorICAgICogc2VsZiwgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQKKyAgICBzaXplKQoreworICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMCwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCisgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfaW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3UKKyAgICAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLCBndWludDggKiBvdXQsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0xLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2NvcHlfc2NhbmxpbmVfcGxhbmFyX3UgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kCisgICAgKiBzZWxmLCBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludAorICAgIHNpemUpCit7CisgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0wLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKKyAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdgorICAgIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsIGd1aW50OCAqIG91dCwKKyAgICBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTEsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfY29weV9zY2FubGluZV9wbGFuYXJfdiAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QKKyAgICAqIHNlbGYsIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50CisgICAgc2l6ZSkKK3sKKyAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTAsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lX3BsYW5hcl9wbGFuZQorICAgIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsIEdzdFZpZGVvRnJhbWUgKiBkZXN0LAorICAgIGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBmcmFtZTAsIGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBmcmFtZTEsCisgICAgY29uc3QgR3N0VmlkZW9GcmFtZSAqIGZyYW1lMiwgY29uc3QgR3N0VmlkZW9GcmFtZSAqIGZyYW1lcCwKKyAgICBndWludCBjdXJfZmllbGRfZmxhZ3MsIGdpbnQgcGxhbmUsCisgICAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lLAorICAgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmUpCit7CisgIEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhIHNjYW5saW5lczsKKyAgZ2ludCBpOworICBnaW50IGZyYW1lX2hlaWdodCwgZnJhbWVfd2lkdGg7CisKKyAgZnJhbWVfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChkZXN0LCBwbGFuZSk7CisgIGZyYW1lX3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGRlc3QsIHBsYW5lKSAqCisgICAgICBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFIChkZXN0LCBwbGFuZSk7CisKKyAgZ19hc3NlcnQgKGludGVycG9sYXRlX3NjYW5saW5lICE9IE5VTEwpOworICBnX2Fzc2VydCAoY29weV9zY2FubGluZSAhPSBOVUxMKTsKKworI2RlZmluZSBMSU5FKHgsaSkgKCgoZ3VpbnQ4KilHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSgoeCkscGxhbmUpKSArIENMQU1QX0hJKENMQU1QX0xPVyhpKSkgKiBcCisgICAgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSgoeCkscGxhbmUpKQorI2RlZmluZSBMSU5FMih4LGkpICgoeCkgPyBMSU5FKHgsaSkgOiBOVUxMKQorCisgIGZvciAoaSA9IDA7IGkgPCBmcmFtZV9oZWlnaHQ7IGkrKykgeworICAgIG1lbXNldCAoJnNjYW5saW5lcywgMCwgc2l6ZW9mIChzY2FubGluZXMpKTsKKyAgICBzY2FubGluZXMuYm90dG9tX2ZpZWxkID0gKGN1cl9maWVsZF9mbGFncyA9PSBQSUNUVVJFX0lOVEVSTEFDRURfQk9UVE9NKTsKKworICAgIGlmICghKChpICYgMSkgXiBzY2FubGluZXMuYm90dG9tX2ZpZWxkKSkgeworICAgICAgLyogY29weWluZyAqLworICAgICAgc2NhbmxpbmVzLnRwID0gTElORTIgKGZyYW1lcCwgaSAtIDEpOworICAgICAgc2NhbmxpbmVzLmJwID0gTElORTIgKGZyYW1lcCwgaSArIDEpOworCisgICAgICBzY2FubGluZXMudHQwID0gTElORTIgKGZyYW1lMCwgKGkgLSAyID49IDApID8gaSAtIDIgOiBpKTsKKyAgICAgIHNjYW5saW5lcy5tMCA9IExJTkUyIChmcmFtZTAsIGkpOworICAgICAgc2NhbmxpbmVzLmJiMCA9IExJTkUyIChmcmFtZTAsIChpICsgMiA8IGZyYW1lX2hlaWdodCA/IGkgKyAyIDogaSkpOworCisgICAgICBzY2FubGluZXMudDEgPSBMSU5FMiAoZnJhbWUxLCBpIC0gMSk7CisgICAgICBzY2FubGluZXMuYjEgPSBMSU5FMiAoZnJhbWUxLCBpICsgMSk7CisKKyAgICAgIHNjYW5saW5lcy50dDIgPSBMSU5FMiAoZnJhbWUyLCAoaSAtIDIgPj0gMCkgPyBpIC0gMiA6IGkpOworICAgICAgc2NhbmxpbmVzLm0yID0gTElORTIgKGZyYW1lMiwgaSk7CisgICAgICBzY2FubGluZXMuYmIyID0gTElORTIgKGZyYW1lMiwgKGkgKyAyIDwgZnJhbWVfaGVpZ2h0ID8gaSArIDIgOiBpKSk7CisKKyAgICAgIGNvcHlfc2NhbmxpbmUgKHNlbGYsIExJTkUgKGRlc3QsIGkpLCAmc2NhbmxpbmVzLCBmcmFtZV93aWR0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGludGVycG9sYXRpbmcgKi8KKyAgICAgIHNjYW5saW5lcy50dHAgPSBMSU5FMiAoZnJhbWVwLCAoaSAtIDIgPj0gMCkgPyBpIC0gMiA6IGkpOworICAgICAgc2NhbmxpbmVzLm1wID0gTElORTIgKGZyYW1lcCwgaSk7CisgICAgICBzY2FubGluZXMuYmJwID0gTElORTIgKGZyYW1lcCwgKGkgKyAyIDwgZnJhbWVfaGVpZ2h0ID8gaSArIDIgOiBpKSk7CisKKyAgICAgIHNjYW5saW5lcy50MCA9IExJTkUyIChmcmFtZTAsIGkgLSAxKTsKKyAgICAgIHNjYW5saW5lcy5iMCA9IExJTkUyIChmcmFtZTAsIGkgKyAxKTsKKworICAgICAgc2NhbmxpbmVzLnR0MSA9IExJTkUyIChmcmFtZTEsIChpIC0gMiA+PSAwKSA/IGkgLSAyIDogaSk7CisgICAgICBzY2FubGluZXMubTEgPSBMSU5FMiAoZnJhbWUxLCBpKTsKKyAgICAgIHNjYW5saW5lcy5iYjEgPSBMSU5FMiAoZnJhbWUxLCAoaSArIDIgPCBmcmFtZV9oZWlnaHQgPyBpICsgMiA6IGkpKTsKKworICAgICAgc2NhbmxpbmVzLnQyID0gTElORTIgKGZyYW1lMiwgaSAtIDEpOworICAgICAgc2NhbmxpbmVzLmIyID0gTElORTIgKGZyYW1lMiwgaSArIDEpOworCisgICAgICBpbnRlcnBvbGF0ZV9zY2FubGluZSAoc2VsZiwgTElORSAoZGVzdCwgaSksICZzY2FubGluZXMsIGZyYW1lX3dpZHRoKTsKKyAgICB9CisjdW5kZWYgTElORQorI3VuZGVmIExJTkUyCisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lX3BsYW5hciAoR3N0RGVpbnRlcmxhY2VNZXRob2QgKgorICAgIG1ldGhvZCwgY29uc3QgR3N0RGVpbnRlcmxhY2VGaWVsZCAqIGhpc3RvcnksIGd1aW50IGhpc3RvcnlfY291bnQsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dGZyYW1lLCBnaW50IGN1cl9maWVsZF9pZHgpCit7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICpzZWxmID0gR1NUX0RFSU5URVJMQUNFX1NJTVBMRV9NRVRIT0QgKG1ldGhvZCk7CisjaWZuZGVmIEdfRElTQUJMRV9BU1NFUlQKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzcyAqZG1fY2xhc3MgPSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0dFVF9DTEFTUyAoc2VsZik7CisjZW5kaWYKKyAgY29uc3QgR3N0VmlkZW9GcmFtZSAqZnJhbWUwLCAqZnJhbWUxLCAqZnJhbWUyLCAqZnJhbWVwOworICBndWludCBjdXJfZmllbGRfZmxhZ3MgPSBoaXN0b3J5W2N1cl9maWVsZF9pZHhdLmZsYWdzOworICBnaW50IGk7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gY29weV9zY2FubGluZTsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBpbnRlcnBvbGF0ZV9zY2FubGluZTsKKworICBnX2Fzc2VydCAoc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyWzBdICE9IE5VTEwpOworICBnX2Fzc2VydCAoc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyWzFdICE9IE5VTEwpOworICBnX2Fzc2VydCAoc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyWzJdICE9IE5VTEwpOworICBnX2Fzc2VydCAoc2VsZi0+Y29weV9zY2FubGluZV9wbGFuYXJbMF0gIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChzZWxmLT5jb3B5X3NjYW5saW5lX3BsYW5hclsxXSAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKHNlbGYtPmNvcHlfc2NhbmxpbmVfcGxhbmFyWzJdICE9IE5VTEwpOworCisgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICBjb3B5X3NjYW5saW5lID0gc2VsZi0+Y29weV9zY2FubGluZV9wbGFuYXJbaV07CisgICAgaW50ZXJwb2xhdGVfc2NhbmxpbmUgPSBzZWxmLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJbaV07CisKKyAgICBmcmFtZXAgPSAoY3VyX2ZpZWxkX2lkeCA+IDAgPyBoaXN0b3J5W2N1cl9maWVsZF9pZHggLSAxXS5mcmFtZSA6IE5VTEwpOworCisgICAgZnJhbWUwID0gaGlzdG9yeVtjdXJfZmllbGRfaWR4XS5mcmFtZTsKKworICAgIGdfYXNzZXJ0IChkbV9jbGFzcy0+ZmllbGRzX3JlcXVpcmVkIDw9IDQpOworCisgICAgZnJhbWUxID0KKyAgICAgICAgKGN1cl9maWVsZF9pZHggKyAxIDwKKyAgICAgICAgaGlzdG9yeV9jb3VudCA/IGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCArIDFdLmZyYW1lIDogTlVMTCk7CisgICAgZnJhbWUyID0KKyAgICAgICAgKGN1cl9maWVsZF9pZHggKyAyIDwKKyAgICAgICAgaGlzdG9yeV9jb3VudCA/IGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCArIDJdLmZyYW1lIDogTlVMTCk7CisKKyAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZV9wbGFuYXJfcGxhbmUgKHNlbGYsCisgICAgICAgIG91dGZyYW1lLCBmcmFtZTAsIGZyYW1lMSwgZnJhbWUyLCBmcmFtZXAsIGN1cl9maWVsZF9mbGFncywgaSwKKyAgICAgICAgY29weV9zY2FubGluZSwgaW50ZXJwb2xhdGVfc2NhbmxpbmUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZV9udjEyIChHc3REZWludGVybGFjZU1ldGhvZCAqCisgICAgbWV0aG9kLCBjb25zdCBHc3REZWludGVybGFjZUZpZWxkICogaGlzdG9yeSwgZ3VpbnQgaGlzdG9yeV9jb3VudCwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0ZnJhbWUsIGdpbnQgY3VyX2ZpZWxkX2lkeCkKK3sKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKnNlbGYgPSBHU1RfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRCAobWV0aG9kKTsKKyNpZm5kZWYgR19ESVNBQkxFX0FTU0VSVAorICBHc3REZWludGVybGFjZU1ldGhvZENsYXNzICpkbV9jbGFzcyA9IEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR0VUX0NMQVNTIChzZWxmKTsKKyNlbmRpZgorICBjb25zdCBHc3RWaWRlb0ZyYW1lICpmcmFtZTAsICpmcmFtZTEsICpmcmFtZTIsICpmcmFtZXA7CisgIGd1aW50IGN1cl9maWVsZF9mbGFncyA9IGhpc3RvcnlbY3VyX2ZpZWxkX2lkeF0uZmxhZ3M7CisgIGdpbnQgaTsKKworICBnX2Fzc2VydCAoc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkICE9IE5VTEwpOworICBnX2Fzc2VydCAoc2VsZi0+Y29weV9zY2FubGluZV9wYWNrZWQgIT0gTlVMTCk7CisKKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgIGZyYW1lcCA9IChjdXJfZmllbGRfaWR4ID4gMCA/IGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCAtIDFdLmZyYW1lIDogTlVMTCk7CisKKyAgICBmcmFtZTAgPSBoaXN0b3J5W2N1cl9maWVsZF9pZHhdLmZyYW1lOworCisgICAgZ19hc3NlcnQgKGRtX2NsYXNzLT5maWVsZHNfcmVxdWlyZWQgPD0gNCk7CisKKyAgICBmcmFtZTEgPQorICAgICAgICAoY3VyX2ZpZWxkX2lkeCArIDEgPAorICAgICAgICBoaXN0b3J5X2NvdW50ID8gaGlzdG9yeVtjdXJfZmllbGRfaWR4ICsgMV0uZnJhbWUgOiBOVUxMKTsKKyAgICBmcmFtZTIgPQorICAgICAgICAoY3VyX2ZpZWxkX2lkeCArIDIgPAorICAgICAgICBoaXN0b3J5X2NvdW50ID8gaGlzdG9yeVtjdXJfZmllbGRfaWR4ICsgMl0uZnJhbWUgOiBOVUxMKTsKKworICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lX3BsYW5hcl9wbGFuZSAoc2VsZiwKKyAgICAgICAgb3V0ZnJhbWUsIGZyYW1lMCwgZnJhbWUxLCBmcmFtZTIsIGZyYW1lcCwgY3VyX2ZpZWxkX2ZsYWdzLCBpLAorICAgICAgICBzZWxmLT5jb3B5X3NjYW5saW5lX3BhY2tlZCwgc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2Rfc2V0dXAgKEdzdERlaW50ZXJsYWNlTWV0aG9kICogbWV0aG9kLAorICAgIEdzdFZpZGVvSW5mbyAqIHZpbmZvKQoreworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqc2VsZiA9IEdTVF9ERUlOVEVSTEFDRV9TSU1QTEVfTUVUSE9EIChtZXRob2QpOworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzICprbGFzcyA9CisgICAgICBHU1RfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRF9HRVRfQ0xBU1MgKHNlbGYpOworCisgIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfQ0xBU1MKKyAgICAgIChnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9wYXJlbnRfY2xhc3MpLT5zZXR1cCAobWV0aG9kLCB2aW5mbyk7CisKKyAgc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkID0gTlVMTDsKKyAgc2VsZi0+Y29weV9zY2FubGluZV9wYWNrZWQgPSBOVUxMOworCisgIHNlbGYtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hclswXSA9IE5VTEw7CisgIHNlbGYtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hclsxXSA9IE5VTEw7CisgIHNlbGYtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hclsyXSA9IE5VTEw7CisgIHNlbGYtPmNvcHlfc2NhbmxpbmVfcGxhbmFyWzBdID0gTlVMTDsKKyAgc2VsZi0+Y29weV9zY2FubGluZV9wbGFuYXJbMV0gPSBOVUxMOworICBzZWxmLT5jb3B5X3NjYW5saW5lX3BsYW5hclsyXSA9IE5VTEw7CisKKyAgaWYgKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAodmluZm8pID09IEdTVF9WSURFT19GT1JNQVRfVU5LTk9XTikKKyAgICByZXR1cm47CisKKyAgc3dpdGNoIChHU1RfVklERU9fSU5GT19GT1JNQVQgKHZpbmZvKSkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVVkyOgorICAgICAgc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkID0ga2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3l1eTI7CisgICAgICBzZWxmLT5jb3B5X3NjYW5saW5lX3BhY2tlZCA9IGtsYXNzLT5jb3B5X3NjYW5saW5lX3l1eTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVZZVToKKyAgICAgIHNlbGYtPmludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZCA9IGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV95dnl1OworICAgICAgc2VsZi0+Y29weV9zY2FubGluZV9wYWNrZWQgPSBrbGFzcy0+Y29weV9zY2FubGluZV95dnl1OworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICBzZWxmLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wYWNrZWQgPSBrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfdXl2eTsKKyAgICAgIHNlbGYtPmNvcHlfc2NhbmxpbmVfcGFja2VkID0ga2xhc3MtPmNvcHlfc2NhbmxpbmVfdXl2eTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkID0ga2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2F5dXY7CisgICAgICBzZWxmLT5jb3B5X3NjYW5saW5lX3BhY2tlZCA9IGtsYXNzLT5jb3B5X3NjYW5saW5lX2F5dXY7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeFJHQjoKKyAgICAgIHNlbGYtPmludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZCA9IGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9hcmdiOworICAgICAgc2VsZi0+Y29weV9zY2FubGluZV9wYWNrZWQgPSBrbGFzcy0+Y29weV9zY2FubGluZV9hcmdiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FCR1I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX3hCR1I6CisgICAgICBzZWxmLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wYWNrZWQgPSBrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYWJncjsKKyAgICAgIHNlbGYtPmNvcHlfc2NhbmxpbmVfcGFja2VkID0ga2xhc3MtPmNvcHlfc2NhbmxpbmVfYWJncjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0J4OgorICAgICAgc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkID0ga2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3JnYmE7CisgICAgICBzZWxmLT5jb3B5X3NjYW5saW5lX3BhY2tlZCA9IGtsYXNzLT5jb3B5X3NjYW5saW5lX3JnYmE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSeDoKKyAgICAgIHNlbGYtPmludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZCA9IGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3JhOworICAgICAgc2VsZi0+Y29weV9zY2FubGluZV9wYWNrZWQgPSBrbGFzcy0+Y29weV9zY2FubGluZV9iZ3JhOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQjoKKyAgICAgIHNlbGYtPmludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZCA9IGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9yZ2I7CisgICAgICBzZWxmLT5jb3B5X3NjYW5saW5lX3BhY2tlZCA9IGtsYXNzLT5jb3B5X3NjYW5saW5lX3JnYjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1I6CisgICAgICBzZWxmLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wYWNrZWQgPSBrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYmdyOworICAgICAgc2VsZi0+Y29weV9zY2FubGluZV9wYWNrZWQgPSBrbGFzcy0+Y29weV9zY2FubGluZV9iZ3I7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYxMjoKKyAgICAgIHNlbGYtPmludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZCA9IGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9udjEyOworICAgICAgc2VsZi0+Y29weV9zY2FubGluZV9wYWNrZWQgPSBrbGFzcy0+Y29weV9zY2FubGluZV9udjEyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX05WMjE6CisgICAgICBzZWxmLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wYWNrZWQgPSBrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYyMTsKKyAgICAgIHNlbGYtPmNvcHlfc2NhbmxpbmVfcGFja2VkID0ga2xhc3MtPmNvcHlfc2NhbmxpbmVfbnYyMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9JNDIwOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVjEyOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDQ0OgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDFCOgorICAgICAgc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyWzBdID0KKyAgICAgICAgICBrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3k7CisgICAgICBzZWxmLT5jb3B5X3NjYW5saW5lX3BsYW5hclswXSA9IGtsYXNzLT5jb3B5X3NjYW5saW5lX3BsYW5hcl95OworICAgICAgc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyWzFdID0KKyAgICAgICAgICBrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3U7CisgICAgICBzZWxmLT5jb3B5X3NjYW5saW5lX3BsYW5hclsxXSA9IGtsYXNzLT5jb3B5X3NjYW5saW5lX3BsYW5hcl91OworICAgICAgc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyWzJdID0KKyAgICAgICAgICBrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3Y7CisgICAgICBzZWxmLT5jb3B5X3NjYW5saW5lX3BsYW5hclsyXSA9IGtsYXNzLT5jb3B5X3NjYW5saW5lX3BsYW5hcl92OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9jbGFzc19pbml0IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzCisgICAgKiBrbGFzcykKK3sKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzcyAqZG1fY2xhc3MgPSAoR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzcyAqKSBrbGFzczsKKworICBkbV9jbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfYXl1diA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZV9wYWNrZWQ7CisgIGRtX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV95dXkyID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lX3BhY2tlZDsKKyAgZG1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l2eXUgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWVfcGFja2VkOworICBkbV9jbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfdXl2eSA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZV9wYWNrZWQ7CisgIGRtX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV9hcmdiID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lX3BhY2tlZDsKKyAgZG1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX2FiZ3IgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWVfcGFja2VkOworICBkbV9jbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfcmdiYSA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZV9wYWNrZWQ7CisgIGRtX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV9iZ3JhID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lX3BhY2tlZDsKKyAgZG1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3JnYiA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZV9wYWNrZWQ7CisgIGRtX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV9iZ3IgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWVfcGFja2VkOworICBkbV9jbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfaTQyMCA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZV9wbGFuYXI7CisgIGRtX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV95djEyID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lX3BsYW5hcjsKKyAgZG1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3k0NDQgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWVfcGxhbmFyOworICBkbV9jbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfeTQyYiA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZV9wbGFuYXI7CisgIGRtX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV95NDFiID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lX3BsYW5hcjsKKyAgZG1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX252MTIgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWVfbnYxMjsKKyAgZG1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX252MjEgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWVfbnYxMjsKKyAgZG1fY2xhc3MtPmZpZWxkc19yZXF1aXJlZCA9IDI7CisgIGRtX2NsYXNzLT5zZXR1cCA9IGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX3NldHVwOworICBkbV9jbGFzcy0+c3VwcG9ydGVkID0gZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2Rfc3VwcG9ydGVkOworCisgIGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV95dXkyID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2ludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZDsKKyAga2xhc3MtPmNvcHlfc2NhbmxpbmVfeXV5MiA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9jb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAga2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3l2eXUgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfaW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkOworICBrbGFzcy0+Y29weV9zY2FubGluZV95dnl1ID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2NvcHlfc2NhbmxpbmVfcGFja2VkOworICBrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYXl1diA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9pbnRlcnBvbGF0ZV9zY2FubGluZV9wYWNrZWQ7CisgIGtsYXNzLT5jb3B5X3NjYW5saW5lX2F5dXYgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV91eXZ5ID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2ludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZDsKKyAga2xhc3MtPmNvcHlfc2NhbmxpbmVfdXl2eSA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9jb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAga2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX252MTIgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfaW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkOworICBrbGFzcy0+Y29weV9zY2FubGluZV9udjEyID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2NvcHlfc2NhbmxpbmVfcGFja2VkOworCisgIGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9hcmdiID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2ludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZDsKKyAga2xhc3MtPmNvcHlfc2NhbmxpbmVfYXJnYiA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9jb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAga2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2FiZ3IgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfaW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkOworICBrbGFzcy0+Y29weV9zY2FubGluZV9hYmdyID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2NvcHlfc2NhbmxpbmVfcGFja2VkOworCisgIGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9yZ2JhID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2ludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZDsKKyAga2xhc3MtPmNvcHlfc2NhbmxpbmVfcmdiYSA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9jb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAga2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2JncmEgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfaW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkOworICBrbGFzcy0+Y29weV9zY2FubGluZV9iZ3JhID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2NvcHlfc2NhbmxpbmVfcGFja2VkOworICBrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2ludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZDsKKyAga2xhc3MtPmNvcHlfc2NhbmxpbmVfcmdiID0gZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3IgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfaW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkOworICBrbGFzcy0+Y29weV9zY2FubGluZV9iZ3IgPSBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9jb3B5X3NjYW5saW5lX3BhY2tlZDsKKworICBrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3kgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfaW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3k7CisgIGtsYXNzLT5jb3B5X3NjYW5saW5lX3BsYW5hcl95ID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2NvcHlfc2NhbmxpbmVfcGxhbmFyX3k7CisgIGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdSA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdTsKKyAga2xhc3MtPmNvcHlfc2NhbmxpbmVfcGxhbmFyX3UgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfY29weV9zY2FubGluZV9wbGFuYXJfdTsKKyAga2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl92ID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2ludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl92OworICBrbGFzcy0+Y29weV9zY2FubGluZV9wbGFuYXJfdiA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9jb3B5X3NjYW5saW5lX3BsYW5hcl92OworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfaW5pdCAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmKQoreworfQpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlbWV0aG9kLmggYi9nc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTY0NjMyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlbWV0aG9kLmgKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0RFSU5URVJMQUNFX01FVEhPRF9IX18KKyNkZWZpbmUgX19HU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaWYgZGVmaW5lZChIQVZFX0dDQ19BU00pICYmIGRlZmluZWQoSEFWRV9PUkMpCisjaWYgZGVmaW5lZChIQVZFX0NQVV9JMzg2KSB8fCBkZWZpbmVkKEhBVkVfQ1BVX1g4Nl82NCkKKyNkZWZpbmUgQlVJTERfWDg2X0FTTQorI2VuZGlmCisjZW5kaWYKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRAkJKGdzdF9kZWludGVybGFjZV9tZXRob2RfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9JU19ERUlOVEVSTEFDRV9NRVRIT0Qob2JqKQkJKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9DTEFTUyhrbGFzcykJKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0QpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0dFVF9DTEFTUyhvYmopCShHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9ELCBHc3REZWludGVybGFjZU1ldGhvZENsYXNzKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRChvYmopCQkoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0QsIEdzdERlaW50ZXJsYWNlTWV0aG9kKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9DTEFTUyhrbGFzcykJKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0QsIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0NBU1Qob2JqKQkoKEdzdERlaW50ZXJsYWNlTWV0aG9kKikob2JqKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdERlaW50ZXJsYWNlTWV0aG9kIEdzdERlaW50ZXJsYWNlTWV0aG9kOwordHlwZWRlZiBzdHJ1Y3QgX0dzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzczsKKworCisjZGVmaW5lIFBJQ1RVUkVfUFJPR1JFU1NJVkUgMAorI2RlZmluZSBQSUNUVVJFX0lOVEVSTEFDRURfQk9UVE9NIDEKKyNkZWZpbmUgUElDVFVSRV9JTlRFUkxBQ0VEX1RPUCAyCisjZGVmaW5lIFBJQ1RVUkVfSU5URVJMQUNFRF9NQVNLIChQSUNUVVJFX0lOVEVSTEFDRURfQk9UVE9NIHwgUElDVFVSRV9JTlRFUkxBQ0VEX1RPUCkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0VmlkZW9GcmFtZSAqZnJhbWU7CisgIC8qIHNlZSBQSUNUVVJFXyBmbGFncyBpbiAqLmMgKi8KKyAgZ3VpbnQgZmxhZ3M7Cit9IEdzdERlaW50ZXJsYWNlRmllbGQ7CisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBkZWludGVybGFjZXIgcGx1Z2luLgorICovCisKK3R5cGVkZWYgdm9pZCAoKkdzdERlaW50ZXJsYWNlTWV0aG9kRGVpbnRlcmxhY2VGdW5jdGlvbikgKAorICAgIEdzdERlaW50ZXJsYWNlTWV0aG9kICpzZWxmLCBjb25zdCBHc3REZWludGVybGFjZUZpZWxkICpoaXN0b3J5LAorICAgIGd1aW50IGhpc3RvcnlfY291bnQsIEdzdFZpZGVvRnJhbWUgKm91dGZyYW1lLCBpbnQgY3VyX2ZpZWxkX2lkeCk7CisKK3N0cnVjdCBfR3N0RGVpbnRlcmxhY2VNZXRob2QgeworICBHc3RPYmplY3QgcGFyZW50OworCisgIEdzdFZpZGVvSW5mbyAqdmluZm87CisKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2REZWludGVybGFjZUZ1bmN0aW9uIGRlaW50ZXJsYWNlX2ZyYW1lOworfTsKKworc3RydWN0IF9Hc3REZWludGVybGFjZU1ldGhvZENsYXNzIHsKKyAgR3N0T2JqZWN0Q2xhc3MgcGFyZW50X2NsYXNzOworICBndWludCBmaWVsZHNfcmVxdWlyZWQ7CisgIGd1aW50IGxhdGVuY3k7CisKKyAgZ2Jvb2xlYW4gKCpzdXBwb3J0ZWQpIChHc3REZWludGVybGFjZU1ldGhvZENsYXNzICprbGFzcywgR3N0VmlkZW9Gb3JtYXQgZm9ybWF0LCBnaW50IHdpZHRoLCBnaW50IGhlaWdodCk7CisKKyAgdm9pZCAoKnNldHVwKSAoR3N0RGVpbnRlcmxhY2VNZXRob2QgKnNlbGYsIEdzdFZpZGVvSW5mbyAqIHZpbmZvKTsKKworICBHc3REZWludGVybGFjZU1ldGhvZERlaW50ZXJsYWNlRnVuY3Rpb24gZGVpbnRlcmxhY2VfZnJhbWVfeXV5MjsKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2REZWludGVybGFjZUZ1bmN0aW9uIGRlaW50ZXJsYWNlX2ZyYW1lX3l2eXU7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kRGVpbnRlcmxhY2VGdW5jdGlvbiBkZWludGVybGFjZV9mcmFtZV91eXZ5OworICBHc3REZWludGVybGFjZU1ldGhvZERlaW50ZXJsYWNlRnVuY3Rpb24gZGVpbnRlcmxhY2VfZnJhbWVfaTQyMDsKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2REZWludGVybGFjZUZ1bmN0aW9uIGRlaW50ZXJsYWNlX2ZyYW1lX3l2MTI7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kRGVpbnRlcmxhY2VGdW5jdGlvbiBkZWludGVybGFjZV9mcmFtZV95NDQ0OworICBHc3REZWludGVybGFjZU1ldGhvZERlaW50ZXJsYWNlRnVuY3Rpb24gZGVpbnRlcmxhY2VfZnJhbWVfeTQyYjsKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2REZWludGVybGFjZUZ1bmN0aW9uIGRlaW50ZXJsYWNlX2ZyYW1lX3k0MWI7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kRGVpbnRlcmxhY2VGdW5jdGlvbiBkZWludGVybGFjZV9mcmFtZV9heXV2OworICBHc3REZWludGVybGFjZU1ldGhvZERlaW50ZXJsYWNlRnVuY3Rpb24gZGVpbnRlcmxhY2VfZnJhbWVfbnYxMjsKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2REZWludGVybGFjZUZ1bmN0aW9uIGRlaW50ZXJsYWNlX2ZyYW1lX252MjE7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kRGVpbnRlcmxhY2VGdW5jdGlvbiBkZWludGVybGFjZV9mcmFtZV9hcmdiOworICBHc3REZWludGVybGFjZU1ldGhvZERlaW50ZXJsYWNlRnVuY3Rpb24gZGVpbnRlcmxhY2VfZnJhbWVfYWJncjsKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2REZWludGVybGFjZUZ1bmN0aW9uIGRlaW50ZXJsYWNlX2ZyYW1lX3JnYmE7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kRGVpbnRlcmxhY2VGdW5jdGlvbiBkZWludGVybGFjZV9mcmFtZV9iZ3JhOworICBHc3REZWludGVybGFjZU1ldGhvZERlaW50ZXJsYWNlRnVuY3Rpb24gZGVpbnRlcmxhY2VfZnJhbWVfcmdiOworICBHc3REZWludGVybGFjZU1ldGhvZERlaW50ZXJsYWNlRnVuY3Rpb24gZGVpbnRlcmxhY2VfZnJhbWVfYmdyOworCisgIGNvbnN0IGdjaGFyICpuYW1lOworICBjb25zdCBnY2hhciAqbmljazsKK307CisKK0dUeXBlIGdzdF9kZWludGVybGFjZV9tZXRob2RfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3N1cHBvcnRlZCAoR1R5cGUgdHlwZSwgR3N0VmlkZW9Gb3JtYXQgZm9ybWF0LCBnaW50IHdpZHRoLCBnaW50IGhlaWdodCk7Cit2b2lkIGdzdF9kZWludGVybGFjZV9tZXRob2Rfc2V0dXAgKEdzdERlaW50ZXJsYWNlTWV0aG9kICogc2VsZiwgR3N0VmlkZW9JbmZvICogdmluZm8pOwordm9pZCBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lIChHc3REZWludGVybGFjZU1ldGhvZCAqIHNlbGYsIGNvbnN0IEdzdERlaW50ZXJsYWNlRmllbGQgKiBoaXN0b3J5LCBndWludCBoaXN0b3J5X2NvdW50LCBHc3RWaWRlb0ZyYW1lICogb3V0ZnJhbWUsCisgICAgaW50IGN1cl9maWVsZF9pZHgpOworZ2ludCBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dldF9maWVsZHNfcmVxdWlyZWQgKEdzdERlaW50ZXJsYWNlTWV0aG9kICogc2VsZik7CitnaW50IGdzdF9kZWludGVybGFjZV9tZXRob2RfZ2V0X2xhdGVuY3kgKEdzdERlaW50ZXJsYWNlTWV0aG9kICogc2VsZik7CisKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRAkJKGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfSVNfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRChvYmopCQkoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9TSU1QTEVfTUVUSE9EKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX1NJTVBMRV9NRVRIT0RfQ0xBU1Moa2xhc3MpCShHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRCkpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9TSU1QTEVfTUVUSE9EX0dFVF9DTEFTUyhvYmopCShHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRCwgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RDbGFzcykpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9TSU1QTEVfTUVUSE9EKG9iaikJCShHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0RFSU5URVJMQUNFX1NJTVBMRV9NRVRIT0QsIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX1NJTVBMRV9NRVRIT0RfQ0xBU1Moa2xhc3MpCShHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRCwgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RDbGFzcykpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9TSU1QTEVfTUVUSE9EX0NBU1Qob2JqKQkoKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kKikob2JqKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kOwordHlwZWRlZiBzdHJ1Y3QgX0dzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RDbGFzczsKK3R5cGVkZWYgc3RydWN0IF9Hc3REZWludGVybGFjZVNjYW5saW5lRGF0YSBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YTsKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHNpbXBsZSBkZWludGVybGFjZXIgcGx1Z2luLgorICovCisKK3N0cnVjdCBfR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgeworIGNvbnN0IGd1aW50OCAqdHRwLCAqdHAsICptcCwgKmJwLCAqYmJwOworIGNvbnN0IGd1aW50OCAqdHQwLCAqdDAsICptMCwgKmIwLCAqYmIwOworIGNvbnN0IGd1aW50OCAqdHQxLCAqdDEsICptMSwgKmIxLCAqYmIxOworIGNvbnN0IGd1aW50OCAqdHQyLCAqdDIsICptMiwgKmIyLCAqYmIyOworIGdib29sZWFuIGJvdHRvbV9maWVsZDsKK307CisKKy8qCisgKiBGb3IgaW50ZXJwb2xhdGVfc2NhbmxpbmUgdGhlIGlucHV0IGlzOgorICoKKyAqIHwgICB0LTMgICAgICAgdC0yICAgICAgIHQtMSAgICAgICB0ICAgICAgICB0KzEKKyAqIHwgRmllbGQgMyB8IEZpZWxkIDIgfCBGaWVsZCAxIHwgRmllbGQgMCB8IEZpZWxkIC0xCisgKiB8ICBUVDMgICAgfCAgICAgICAgIHwgICBUVDEgICB8ICAgICAgICAgfCAgIFRUcAorICogfCAgICAgICAgIHwgICBUMiAgICB8ICAgICAgICAgfCAgIFQwICAgIHwKKyAqIHwgICBNMyAgICB8ICAgICAgICAgfCAgICBNMSAgIHwgICAgICAgICB8ICAgIE1wCisgKiB8ICAgICAgICAgfCAgIEIyICAgIHwgICAgICAgICB8ICAgQjAgICAgfAorICogfCAgQkIzICAgIHwgICAgICAgICB8ICAgQkIxICAgfCAgICAgICAgIHwgICBCQnAKKyAqCisgKiBGb3IgY29weV9zY2FubGluZSB0aGUgaW5wdXQgaXM6CisgKgorICogfCAgIHQtMyAgICAgICB0LTIgICAgICAgdC0xICAgICAgIHQgICAgICAgICB0KzEKKyAqIHwgRmllbGQgMyB8IEZpZWxkIDIgfCBGaWVsZCAxIHwgRmllbGQgMCB8IEZpZWxkIC0xCisgKiB8ICAgICAgICAgfCAgIFRUMiAgIHwgICAgICAgICB8ICBUVDAgICAgfAorICogfCAgIFQzICAgIHwgICAgICAgICB8ICAgVDEgICAgfCAgICAgICAgIHwgICBUcAorICogfCAgICAgICAgIHwgICAgTTIgICB8ICAgICAgICAgfCAgIE0wICAgIHwKKyAqIHwgICBCMyAgICB8ICAgICAgICAgfCAgIEIxICAgIHwgICAgICAgICB8ICAgQnAKKyAqIHwgICAgICAgICB8ICAgQkIyICAgfCAgICAgICAgIHwgIEJCMCAgICB8CisgKgorICogQWxsIG90aGVyIHZhbHVlcyBhcmUgTlVMTC4KKyAqLworCit0eXBlZGVmIHZvaWQgKCpHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZEZ1bmN0aW9uKSAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKnNlbGYsIGd1aW50OCAqb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqc2NhbmxpbmVzLCBndWludCBzaXplKTsKKworc3RydWN0IF9Hc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCB7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kIHBhcmVudDsKKworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZEZ1bmN0aW9uIGludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZDsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZEZ1bmN0aW9uIGludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hclszXTsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX3BsYW5hclszXTsKK307CisKK3N0cnVjdCBfR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RDbGFzcyB7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgcGFyZW50X2NsYXNzOworCisgIC8qIFBhY2tlZCBmb3JtYXRzICovCisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfeXV5MjsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX3l1eTI7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfeXZ5dTsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX3l2eXU7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfdXl2eTsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX3V5dnk7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfYXl1djsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX2F5dXY7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfYXJnYjsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX2FyZ2I7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfYWJncjsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX2FiZ3I7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiYTsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX3JnYmE7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfYmdyYTsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX2JncmE7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiOworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZEZ1bmN0aW9uIGNvcHlfc2NhbmxpbmVfcmdiOworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZEZ1bmN0aW9uIGludGVycG9sYXRlX3NjYW5saW5lX2JncjsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX2JncjsKKworICAvKiBTZW1pLXBsYW5hciBmb3JtYXRzICovCisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYxMjsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX252MTI7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYyMTsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX252MjE7CisKKyAgLyogUGxhbmFyIGZvcm1hdHMgKi8KKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX3BsYW5hcl95OworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZEZ1bmN0aW9uIGludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl95OworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZEZ1bmN0aW9uIGNvcHlfc2NhbmxpbmVfcGxhbmFyX3U7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3U7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gY29weV9zY2FubGluZV9wbGFuYXJfdjsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBpbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdjsKK307CisKK0dUeXBlIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0RFSU5URVJMQUNFX01FVEhPRF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9kZWludGVybGFjZS9tZXNvbi5idWlsZCBiL2dzdC9kZWludGVybGFjZS9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWU2YzUzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsNDMgQEAKK2ludGVybGFjZV9zb3VyY2VzID0gWworICAnZ3N0ZGVpbnRlcmxhY2UuYycsCisgICdnc3RkZWludGVybGFjZW1ldGhvZC5jJywKKyAgJ3R2dGltZS90b21zbW9jb21wLmMnLAorICAndHZ0aW1lL2dyZWVkeS5jJywKKyAgJ3R2dGltZS9ncmVlZHloLmMnLAorICAndHZ0aW1lL3ZmaXIuYycsCisgICd0dnRpbWUvd2VhdmV0ZmYuYycsCisgICd0dnRpbWUvd2VhdmViZmYuYycsCisgICd0dnRpbWUvd2VhdmUuYycsCisgICd0dnRpbWUvbGluZWFyLmMnLAorICAndHZ0aW1lL2xpbmVhcmJsZW5kLmMnLAorICAndHZ0aW1lL3NjYWxlcmJvYi5jJworXQorCitvcmNzcmMgPSAndHZ0aW1lJworaWYgaGF2ZV9vcmNjCisgIG9yY19oID0gY3VzdG9tX3RhcmdldChvcmNzcmMgKyAnLmgnLAorICAgIGlucHV0IDogb3Jjc3JjICsgJy5vcmMnLAorICAgIG91dHB1dCA6IG9yY3NyYyArICcuaCcsCisgICAgY29tbWFuZCA6IG9yY2NfYXJncyArIFsnLS1oZWFkZXInLCAnLW8nLCAnQE9VVFBVVEAnLCAnQElOUFVUQCddKQorICBvcmNfYyA9IGN1c3RvbV90YXJnZXQob3Jjc3JjICsgJy5jJywKKyAgICBpbnB1dCA6IG9yY3NyYyArICcub3JjJywKKyAgICBvdXRwdXQgOiBvcmNzcmMgKyAnLmMnLAorICAgIGNvbW1hbmQgOiBvcmNjX2FyZ3MgKyBbJy0taW1wbGVtZW50YXRpb24nLCAnLW8nLCAnQE9VVFBVVEAnLCAnQElOUFVUQCddKQorZWxzZQorICBvcmNfaCA9IGNvbmZpZ3VyZV9maWxlKGlucHV0IDogb3Jjc3JjICsgJy1kaXN0LmgnLAorICAgIG91dHB1dCA6IG9yY3NyYyArICcuaCcsCisgICAgY29uZmlndXJhdGlvbiA6IGNvbmZpZ3VyYXRpb25fZGF0YSgpKQorICBvcmNfYyA9IGNvbmZpZ3VyZV9maWxlKGlucHV0IDogb3Jjc3JjICsgJy1kaXN0LmMnLAorICAgIG91dHB1dCA6IG9yY3NyYyArICcuYycsCisgICAgY29uZmlndXJhdGlvbiA6IGNvbmZpZ3VyYXRpb25fZGF0YSgpKQorZW5kaWYKKworZ3N0ZGVpbnRlcmxhY2UgPSBsaWJyYXJ5KCdnc3RkZWludGVybGFjZScsCisgIGludGVybGFjZV9zb3VyY2VzLCBvcmNfYywgb3JjX2gsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbb3JjX2RlcCwgZ3N0YmFzZV9kZXAsIGdzdHZpZGVvX2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCisKZGlmZiAtLWdpdCBhL2dzdC9kZWludGVybGFjZS90dnRpbWUtZGlzdC5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdjMTA1NgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUtZGlzdC5jCkBAIC0wLDAgKzEsMTExOSBAQAorCisvKiBhdXRvZ2VuZXJhdGVkIGZyb20gdHZ0aW1lLm9yYyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaWZuZGVmIF9PUkNfSU5URUdFUl9UWVBFREVGU18KKyNkZWZpbmUgX09SQ19JTlRFR0VSX1RZUEVERUZTXworI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjaW5jbHVkZSA8c3RkaW50Lmg+Cit0eXBlZGVmIGludDhfdCBvcmNfaW50ODsKK3R5cGVkZWYgaW50MTZfdCBvcmNfaW50MTY7Cit0eXBlZGVmIGludDMyX3Qgb3JjX2ludDMyOwordHlwZWRlZiBpbnQ2NF90IG9yY19pbnQ2NDsKK3R5cGVkZWYgdWludDhfdCBvcmNfdWludDg7Cit0eXBlZGVmIHVpbnQxNl90IG9yY191aW50MTY7Cit0eXBlZGVmIHVpbnQzMl90IG9yY191aW50MzI7Cit0eXBlZGVmIHVpbnQ2NF90IG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSBVSU5UNjRfQyh4KQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKK3R5cGVkZWYgc2lnbmVkIF9faW50OCBvcmNfaW50ODsKK3R5cGVkZWYgc2lnbmVkIF9faW50MTYgb3JjX2ludDE2OwordHlwZWRlZiBzaWduZWQgX19pbnQzMiBvcmNfaW50MzI7Cit0eXBlZGVmIHNpZ25lZCBfX2ludDY0IG9yY19pbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ4IG9yY191aW50ODsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQxNiBvcmNfdWludDE2OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDMyIG9yY191aW50MzI7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgb3JjX3VpbnQ2NDsKKyNkZWZpbmUgT1JDX1VJTlQ2NF9DKHgpICh4IyNVaTY0KQorI2RlZmluZSBpbmxpbmUgX19pbmxpbmUKKyNlbHNlCisjaW5jbHVkZSA8bGltaXRzLmg+Cit0eXBlZGVmIHNpZ25lZCBjaGFyIG9yY19pbnQ4OwordHlwZWRlZiBzaG9ydCBvcmNfaW50MTY7Cit0eXBlZGVmIGludCBvcmNfaW50MzI7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgb3JjX3VpbnQ4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBvcmNfdWludDE2OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgb3JjX3VpbnQzMjsKKyNpZiBJTlRfTUFYID09IExPTkdfTUFYCit0eXBlZGVmIGxvbmcgbG9uZyBvcmNfaW50NjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgKHgjI1VMTCkKKyNlbHNlCit0eXBlZGVmIGxvbmcgb3JjX2ludDY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSAoeCMjVUwpCisjZW5kaWYKKyNlbmRpZgordHlwZWRlZiB1bmlvbgoreworICBvcmNfaW50MTYgaTsKKyAgb3JjX2ludDggeDJbMl07Cit9IG9yY191bmlvbjE2OwordHlwZWRlZiB1bmlvbgoreworICBvcmNfaW50MzIgaTsKKyAgZmxvYXQgZjsKKyAgb3JjX2ludDE2IHgyWzJdOworICBvcmNfaW50OCB4NFs0XTsKK30gb3JjX3VuaW9uMzI7Cit0eXBlZGVmIHVuaW9uCit7CisgIG9yY19pbnQ2NCBpOworICBkb3VibGUgZjsKKyAgb3JjX2ludDMyIHgyWzJdOworICBmbG9hdCB4MmZbMl07CisgIG9yY19pbnQxNiB4NFs0XTsKK30gb3JjX3VuaW9uNjQ7CisjZW5kaWYKKyNpZm5kZWYgT1JDX1JFU1RSSUNUCisjaWYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyNkZWZpbmUgT1JDX1JFU1RSSUNUIHJlc3RyaWN0CisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSA0CisjZGVmaW5lIE9SQ19SRVNUUklDVCBfX3Jlc3RyaWN0X18KKyNlbHNlCisjZGVmaW5lIE9SQ19SRVNUUklDVAorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBPUkNfSU5URVJOQUwKKyNpZiBkZWZpbmVkKF9fU1VOUFJPX0MpICYmIChfX1NVTlBST19DID49IDB4NTkwKQorI2RlZmluZSBPUkNfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlkZGVuIikpKQorI2VsaWYgZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU1MCkKKyNkZWZpbmUgT1JDX0lOVEVSTkFMIF9faGlkZGVuCisjZWxpZiBkZWZpbmVkIChfX0dOVUNfXykKKyNkZWZpbmUgT1JDX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNlbHNlCisjZGVmaW5lIE9SQ19JTlRFUk5BTAorI2VuZGlmCisjZW5kaWYKKworCisjaWZuZGVmIERJU0FCTEVfT1JDCisjaW5jbHVkZSA8b3JjL29yYy5oPgorI2VuZGlmCit2b2lkIGRlaW50ZXJsYWNlX2xpbmVfdmZpciAoZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMSwgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMyLAorICAgIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMywgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHM0LAorICAgIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzNSwgaW50IG4pOwordm9pZCBkZWludGVybGFjZV9saW5lX2xpbmVhciAoZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMSwgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMyLCBpbnQgbik7Cit2b2lkIGRlaW50ZXJsYWNlX2xpbmVfbGluZWFyX2JsZW5kIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczIsCisgICAgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMzLCBpbnQgbik7Cit2b2lkIGRlaW50ZXJsYWNlX2xpbmVfZ3JlZWR5IChvcmNfdWludDggKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3Qgb3JjX3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBjb25zdCBvcmNfdWludDggKiBPUkNfUkVTVFJJQ1QgczIsCisgICAgY29uc3Qgb3JjX3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMzLCBjb25zdCBvcmNfdWludDggKiBPUkNfUkVTVFJJQ1QgczQsCisgICAgaW50IHAxLCBpbnQgbik7CisKKworLyogYmVnaW4gT3JjIEMgdGFyZ2V0IHByZWFtYmxlICovCisjZGVmaW5lIE9SQ19DTEFNUCh4LGEsYikgKCh4KTwoYSkgPyAoYSkgOiAoKHgpPihiKSA/IChiKSA6ICh4KSkpCisjZGVmaW5lIE9SQ19BQlMoYSkgKChhKTwwID8gLShhKSA6IChhKSkKKyNkZWZpbmUgT1JDX01JTihhLGIpICgoYSk8KGIpID8gKGEpIDogKGIpKQorI2RlZmluZSBPUkNfTUFYKGEsYikgKChhKT4oYikgPyAoYSkgOiAoYikpCisjZGVmaW5lIE9SQ19TQl9NQVggMTI3CisjZGVmaW5lIE9SQ19TQl9NSU4gKC0xLU9SQ19TQl9NQVgpCisjZGVmaW5lIE9SQ19VQl9NQVggKG9yY191aW50OCkgMjU1CisjZGVmaW5lIE9SQ19VQl9NSU4gMAorI2RlZmluZSBPUkNfU1dfTUFYIDMyNzY3CisjZGVmaW5lIE9SQ19TV19NSU4gKC0xLU9SQ19TV19NQVgpCisjZGVmaW5lIE9SQ19VV19NQVggKG9yY191aW50MTYpNjU1MzUKKyNkZWZpbmUgT1JDX1VXX01JTiAwCisjZGVmaW5lIE9SQ19TTF9NQVggMjE0NzQ4MzY0NworI2RlZmluZSBPUkNfU0xfTUlOICgtMS1PUkNfU0xfTUFYKQorI2RlZmluZSBPUkNfVUxfTUFYIDQyOTQ5NjcyOTVVCisjZGVmaW5lIE9SQ19VTF9NSU4gMAorI2RlZmluZSBPUkNfQ0xBTVBfU0IoeCkgT1JDX0NMQU1QKHgsT1JDX1NCX01JTixPUkNfU0JfTUFYKQorI2RlZmluZSBPUkNfQ0xBTVBfVUIoeCkgT1JDX0NMQU1QKHgsT1JDX1VCX01JTixPUkNfVUJfTUFYKQorI2RlZmluZSBPUkNfQ0xBTVBfU1coeCkgT1JDX0NMQU1QKHgsT1JDX1NXX01JTixPUkNfU1dfTUFYKQorI2RlZmluZSBPUkNfQ0xBTVBfVVcoeCkgT1JDX0NMQU1QKHgsT1JDX1VXX01JTixPUkNfVVdfTUFYKQorI2RlZmluZSBPUkNfQ0xBTVBfU0woeCkgT1JDX0NMQU1QKHgsT1JDX1NMX01JTixPUkNfU0xfTUFYKQorI2RlZmluZSBPUkNfQ0xBTVBfVUwoeCkgT1JDX0NMQU1QKHgsT1JDX1VMX01JTixPUkNfVUxfTUFYKQorI2RlZmluZSBPUkNfU1dBUF9XKHgpICgoKCh4KSYweGZmVSk8PDgpIHwgKCgoeCkmMHhmZjAwVSk+PjgpKQorI2RlZmluZSBPUkNfU1dBUF9MKHgpICgoKCh4KSYweGZmVSk8PDI0KSB8ICgoKHgpJjB4ZmYwMFUpPDw4KSB8ICgoKHgpJjB4ZmYwMDAwVSk+PjgpIHwgKCgoeCkmMHhmZjAwMDAwMFUpPj4yNCkpCisjZGVmaW5lIE9SQ19TV0FQX1EoeCkgKCgoKHgpJk9SQ19VSU5UNjRfQygweGZmKSk8PDU2KSB8ICgoKHgpJk9SQ19VSU5UNjRfQygweGZmMDApKTw8NDApIHwgKCgoeCkmT1JDX1VJTlQ2NF9DKDB4ZmYwMDAwKSk8PDI0KSB8ICgoKHgpJk9SQ19VSU5UNjRfQygweGZmMDAwMDAwKSk8PDgpIHwgKCgoeCkmT1JDX1VJTlQ2NF9DKDB4ZmYwMDAwMDAwMCkpPj44KSB8ICgoKHgpJk9SQ19VSU5UNjRfQygweGZmMDAwMDAwMDAwMCkpPj4yNCkgfCAoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZjAwMDAwMDAwMDAwMCkpPj40MCkgfCAoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZjAwMDAwMDAwMDAwMDAwKSk+PjU2KSkKKyNkZWZpbmUgT1JDX1BUUl9PRkZTRVQocHRyLG9mZnNldCkgKCh2b2lkICopKCgodW5zaWduZWQgY2hhciAqKShwdHIpKSArIChvZmZzZXQpKSkKKyNkZWZpbmUgT1JDX0RFTk9STUFMKHgpICgoeCkgJiAoKCgoeCkmMHg3ZjgwMDAwMCkgPT0gMCkgPyAweGZmODAwMDAwIDogMHhmZmZmZmZmZikpCisjZGVmaW5lIE9SQ19JU05BTih4KSAoKCgoeCkmMHg3ZjgwMDAwMCkgPT0gMHg3ZjgwMDAwMCkgJiYgKCgoeCkmMHgwMDdmZmZmZikgIT0gMCkpCisjZGVmaW5lIE9SQ19ERU5PUk1BTF9ET1VCTEUoeCkgKCh4KSAmICgoKCh4KSZPUkNfVUlOVDY0X0MoMHg3ZmYwMDAwMDAwMDAwMDAwKSkgPT0gMCkgPyBPUkNfVUlOVDY0X0MoMHhmZmYwMDAwMDAwMDAwMDAwKSA6IE9SQ19VSU5UNjRfQygweGZmZmZmZmZmZmZmZmZmZmYpKSkKKyNkZWZpbmUgT1JDX0lTTkFOX0RPVUJMRSh4KSAoKCgoeCkmT1JDX1VJTlQ2NF9DKDB4N2ZmMDAwMDAwMDAwMDAwMCkpID09IE9SQ19VSU5UNjRfQygweDdmZjAwMDAwMDAwMDAwMDApKSAmJiAoKCh4KSZPUkNfVUlOVDY0X0MoMHgwMDBmZmZmZmZmZmZmZmZmKSkgIT0gMCkpCisjaWZuZGVmIE9SQ19SRVNUUklDVAorI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjZGVmaW5lIE9SQ19SRVNUUklDVCByZXN0cmljdAorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNAorI2RlZmluZSBPUkNfUkVTVFJJQ1QgX19yZXN0cmljdF9fCisjZWxzZQorI2RlZmluZSBPUkNfUkVTVFJJQ1QKKyNlbmRpZgorI2VuZGlmCisvKiBlbmQgT3JjIEMgdGFyZ2V0IHByZWFtYmxlICovCisKKworCisvKiBkZWludGVybGFjZV9saW5lX3ZmaXIgKi8KKyNpZmRlZiBESVNBQkxFX09SQwordm9pZAorZGVpbnRlcmxhY2VfbGluZV92ZmlyIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczIsIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMywKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczQsIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzNSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgY29uc3Qgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHI1OworICBjb25zdCBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjY7CisgIGNvbnN0IG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyNzsKKyAgY29uc3Qgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHI4OworICBvcmNfaW50OCB2YXIzNTsKKyAgb3JjX2ludDggdmFyMzY7CisgIG9yY19pbnQ4IHZhcjM3OworICBvcmNfaW50OCB2YXIzODsKKyAgb3JjX2ludDggdmFyMzk7CisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPT0gMiAmJiBkZWZpbmVkIChfX2kzODZfXykKKyAgdm9sYXRpbGUgb3JjX3VuaW9uMTYgdmFyNDA7CisjZWxzZQorICBvcmNfdW5pb24xNiB2YXI0MDsKKyNlbmRpZgorICBvcmNfaW50OCB2YXI0MTsKKyAgb3JjX3VuaW9uMTYgdmFyNDI7CisgIG9yY191bmlvbjE2IHZhcjQzOworICBvcmNfdW5pb24xNiB2YXI0NDsKKyAgb3JjX3VuaW9uMTYgdmFyNDU7CisgIG9yY191bmlvbjE2IHZhcjQ2OworICBvcmNfdW5pb24xNiB2YXI0NzsKKyAgb3JjX3VuaW9uMTYgdmFyNDg7CisgIG9yY191bmlvbjE2IHZhcjQ5OworICBvcmNfdW5pb24xNiB2YXI1MDsKKyAgb3JjX3VuaW9uMTYgdmFyNTE7CisgIG9yY191bmlvbjE2IHZhcjUyOworICBvcmNfdW5pb24xNiB2YXI1MzsKKyAgb3JjX3VuaW9uMTYgdmFyNTQ7CisKKyAgcHRyMCA9IChvcmNfaW50OCAqKSBkMTsKKyAgcHRyNCA9IChvcmNfaW50OCAqKSBzMTsKKyAgcHRyNSA9IChvcmNfaW50OCAqKSBzMjsKKyAgcHRyNiA9IChvcmNfaW50OCAqKSBzMzsKKyAgcHRyNyA9IChvcmNfaW50OCAqKSBzNDsKKyAgcHRyOCA9IChvcmNfaW50OCAqKSBzNTsKKworICAvKiAxNjogbG9hZHB3ICovCisgIHZhcjQwLmkgPSAweDAwMDAwMDA0OyAgICAgICAgIC8qIDQgb3IgMS45NzYyNmUtMzIzZiAqLworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkYiAqLworICAgIHZhcjM1ID0gcHRyNFtpXTsKKyAgICAvKiAxOiBjb252dWJ3ICovCisgICAgdmFyNDIuaSA9IChvcmNfdWludDgpIHZhcjM1OworICAgIC8qIDI6IGxvYWRiICovCisgICAgdmFyMzYgPSBwdHI4W2ldOworICAgIC8qIDM6IGNvbnZ1YncgKi8KKyAgICB2YXI0My5pID0gKG9yY191aW50OCkgdmFyMzY7CisgICAgLyogNDogYWRkdyAqLworICAgIHZhcjQ0LmkgPSB2YXI0Mi5pICsgdmFyNDMuaTsKKyAgICAvKiA1OiBsb2FkYiAqLworICAgIHZhcjM3ID0gcHRyNVtpXTsKKyAgICAvKiA2OiBjb252dWJ3ICovCisgICAgdmFyNDUuaSA9IChvcmNfdWludDgpIHZhcjM3OworICAgIC8qIDc6IGxvYWRiICovCisgICAgdmFyMzggPSBwdHI3W2ldOworICAgIC8qIDg6IGNvbnZ1YncgKi8KKyAgICB2YXI0Ni5pID0gKG9yY191aW50OCkgdmFyMzg7CisgICAgLyogOTogYWRkdyAqLworICAgIHZhcjQ3LmkgPSB2YXI0NS5pICsgdmFyNDYuaTsKKyAgICAvKiAxMDogc2hsdyAqLworICAgIHZhcjQ4LmkgPSAoKG9yY191aW50MTYpIHZhcjQ3LmkpIDw8IDI7CisgICAgLyogMTE6IGxvYWRiICovCisgICAgdmFyMzkgPSBwdHI2W2ldOworICAgIC8qIDEyOiBjb252dWJ3ICovCisgICAgdmFyNDkuaSA9IChvcmNfdWludDgpIHZhcjM5OworICAgIC8qIDEzOiBzaGx3ICovCisgICAgdmFyNTAuaSA9ICgob3JjX3VpbnQxNikgdmFyNDkuaSkgPDwgMTsKKyAgICAvKiAxNDogc3VidyAqLworICAgIHZhcjUxLmkgPSB2YXI0OC5pIC0gdmFyNDQuaTsKKyAgICAvKiAxNTogYWRkdyAqLworICAgIHZhcjUyLmkgPSB2YXI1MS5pICsgdmFyNTAuaTsKKyAgICAvKiAxNzogYWRkdyAqLworICAgIHZhcjUzLmkgPSB2YXI1Mi5pICsgdmFyNDAuaTsKKyAgICAvKiAxODogc2hyc3cgKi8KKyAgICB2YXI1NC5pID0gdmFyNTMuaSA+PiAzOworICAgIC8qIDE5OiBjb252c3Vzd2IgKi8KKyAgICB2YXI0MSA9IE9SQ19DTEFNUF9VQiAodmFyNTQuaSk7CisgICAgLyogMjA6IHN0b3JlYiAqLworICAgIHB0cjBbaV0gPSB2YXI0MTsKKyAgfQorCit9CisKKyNlbHNlCitzdGF0aWMgdm9pZAorX2JhY2t1cF9kZWludGVybGFjZV9saW5lX3ZmaXIgKE9yY0V4ZWN1dG9yICogT1JDX1JFU1RSSUNUIGV4KQoreworICBpbnQgaTsKKyAgaW50IG4gPSBleC0+bjsKKyAgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIGNvbnN0IG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyNTsKKyAgY29uc3Qgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHI2OworICBjb25zdCBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjc7CisgIGNvbnN0IG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyODsKKyAgb3JjX2ludDggdmFyMzU7CisgIG9yY19pbnQ4IHZhcjM2OworICBvcmNfaW50OCB2YXIzNzsKKyAgb3JjX2ludDggdmFyMzg7CisgIG9yY19pbnQ4IHZhcjM5OworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID09IDIgJiYgZGVmaW5lZCAoX19pMzg2X18pCisgIHZvbGF0aWxlIG9yY191bmlvbjE2IHZhcjQwOworI2Vsc2UKKyAgb3JjX3VuaW9uMTYgdmFyNDA7CisjZW5kaWYKKyAgb3JjX2ludDggdmFyNDE7CisgIG9yY191bmlvbjE2IHZhcjQyOworICBvcmNfdW5pb24xNiB2YXI0MzsKKyAgb3JjX3VuaW9uMTYgdmFyNDQ7CisgIG9yY191bmlvbjE2IHZhcjQ1OworICBvcmNfdW5pb24xNiB2YXI0NjsKKyAgb3JjX3VuaW9uMTYgdmFyNDc7CisgIG9yY191bmlvbjE2IHZhcjQ4OworICBvcmNfdW5pb24xNiB2YXI0OTsKKyAgb3JjX3VuaW9uMTYgdmFyNTA7CisgIG9yY191bmlvbjE2IHZhcjUxOworICBvcmNfdW5pb24xNiB2YXI1MjsKKyAgb3JjX3VuaW9uMTYgdmFyNTM7CisgIG9yY191bmlvbjE2IHZhcjU0OworCisgIHB0cjAgPSAob3JjX2ludDggKikgZXgtPmFycmF5c1swXTsKKyAgcHRyNCA9IChvcmNfaW50OCAqKSBleC0+YXJyYXlzWzRdOworICBwdHI1ID0gKG9yY19pbnQ4ICopIGV4LT5hcnJheXNbNV07CisgIHB0cjYgPSAob3JjX2ludDggKikgZXgtPmFycmF5c1s2XTsKKyAgcHRyNyA9IChvcmNfaW50OCAqKSBleC0+YXJyYXlzWzddOworICBwdHI4ID0gKG9yY19pbnQ4ICopIGV4LT5hcnJheXNbOF07CisKKyAgLyogMTY6IGxvYWRwdyAqLworICB2YXI0MC5pID0gMHgwMDAwMDAwNDsgICAgICAgICAvKiA0IG9yIDEuOTc2MjZlLTMyM2YgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGIgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMTogY29udnVidyAqLworICAgIHZhcjQyLmkgPSAob3JjX3VpbnQ4KSB2YXIzNTsKKyAgICAvKiAyOiBsb2FkYiAqLworICAgIHZhcjM2ID0gcHRyOFtpXTsKKyAgICAvKiAzOiBjb252dWJ3ICovCisgICAgdmFyNDMuaSA9IChvcmNfdWludDgpIHZhcjM2OworICAgIC8qIDQ6IGFkZHcgKi8KKyAgICB2YXI0NC5pID0gdmFyNDIuaSArIHZhcjQzLmk7CisgICAgLyogNTogbG9hZGIgKi8KKyAgICB2YXIzNyA9IHB0cjVbaV07CisgICAgLyogNjogY29udnVidyAqLworICAgIHZhcjQ1LmkgPSAob3JjX3VpbnQ4KSB2YXIzNzsKKyAgICAvKiA3OiBsb2FkYiAqLworICAgIHZhcjM4ID0gcHRyN1tpXTsKKyAgICAvKiA4OiBjb252dWJ3ICovCisgICAgdmFyNDYuaSA9IChvcmNfdWludDgpIHZhcjM4OworICAgIC8qIDk6IGFkZHcgKi8KKyAgICB2YXI0Ny5pID0gdmFyNDUuaSArIHZhcjQ2Lmk7CisgICAgLyogMTA6IHNobHcgKi8KKyAgICB2YXI0OC5pID0gKChvcmNfdWludDE2KSB2YXI0Ny5pKSA8PCAyOworICAgIC8qIDExOiBsb2FkYiAqLworICAgIHZhcjM5ID0gcHRyNltpXTsKKyAgICAvKiAxMjogY29udnVidyAqLworICAgIHZhcjQ5LmkgPSAob3JjX3VpbnQ4KSB2YXIzOTsKKyAgICAvKiAxMzogc2hsdyAqLworICAgIHZhcjUwLmkgPSAoKG9yY191aW50MTYpIHZhcjQ5LmkpIDw8IDE7CisgICAgLyogMTQ6IHN1YncgKi8KKyAgICB2YXI1MS5pID0gdmFyNDguaSAtIHZhcjQ0Lmk7CisgICAgLyogMTU6IGFkZHcgKi8KKyAgICB2YXI1Mi5pID0gdmFyNTEuaSArIHZhcjUwLmk7CisgICAgLyogMTc6IGFkZHcgKi8KKyAgICB2YXI1My5pID0gdmFyNTIuaSArIHZhcjQwLmk7CisgICAgLyogMTg6IHNocnN3ICovCisgICAgdmFyNTQuaSA9IHZhcjUzLmkgPj4gMzsKKyAgICAvKiAxOTogY29udnN1c3diICovCisgICAgdmFyNDEgPSBPUkNfQ0xBTVBfVUIgKHZhcjU0LmkpOworICAgIC8qIDIwOiBzdG9yZWIgKi8KKyAgICBwdHIwW2ldID0gdmFyNDE7CisgIH0KKworfQorCit2b2lkCitkZWludGVybGFjZV9saW5lX3ZmaXIgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLAorICAgIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMiwgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMzLAorICAgIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzNCwgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHM1LCBpbnQgbikKK3sKKyAgT3JjRXhlY3V0b3IgX2V4LCAqZXggPSAmX2V4OworICBzdGF0aWMgdm9sYXRpbGUgaW50IHBfaW5pdGVkID0gMDsKKyAgc3RhdGljIE9yY0NvZGUgKmMgPSAwOworICB2b2lkICgqZnVuYykgKE9yY0V4ZWN1dG9yICopOworCisgIGlmICghcF9pbml0ZWQpIHsKKyAgICBvcmNfb25jZV9tdXRleF9sb2NrICgpOworICAgIGlmICghcF9pbml0ZWQpIHsKKyAgICAgIE9yY1Byb2dyYW0gKnA7CisKKyNpZiAxCisgICAgICBzdGF0aWMgY29uc3Qgb3JjX3VpbnQ4IGJjW10gPSB7CisgICAgICAgIDEsIDksIDIxLCAxMDAsIDEwMSwgMTA1LCAxMTAsIDExNiwgMTAxLCAxMTQsIDEwOCwgOTcsIDk5LCAxMDEsIDk1LCAxMDgsCisgICAgICAgIDEwNSwgMTEwLCAxMDEsIDk1LCAxMTgsIDEwMiwgMTA1LCAxMTQsIDExLCAxLCAxLCAxMiwgMSwgMSwgMTIsIDEsCisgICAgICAgIDEsIDEyLCAxLCAxLCAxMiwgMSwgMSwgMTIsIDEsIDEsIDE0LCAyLCAyLCAwLCAwLCAwLAorICAgICAgICAxNCwgMiwgMSwgMCwgMCwgMCwgMTQsIDIsIDQsIDAsIDAsIDAsIDE0LCAyLCAzLCAwLAorICAgICAgICAwLCAwLCAyMCwgMiwgMjAsIDIsIDIwLCAyLCAxNTAsIDMyLCA0LCAxNTAsIDMzLCA4LCA3MCwgMzIsCisgICAgICAgIDMyLCAzMywgMTUwLCAzMywgNSwgMTUwLCAzNCwgNywgNzAsIDMzLCAzMywgMzQsIDkzLCAzMywgMzMsIDE2LAorICAgICAgICAxNTAsIDM0LCA2LCA5MywgMzQsIDM0LCAxNywgOTgsIDMzLCAzMywgMzIsIDcwLCAzMywgMzMsIDM0LCA3MCwKKyAgICAgICAgMzMsIDMzLCAxOCwgOTQsIDMzLCAzMywgMTksIDE2MCwgMCwgMzMsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwgX2JhY2t1cF9kZWludGVybGFjZV9saW5lX3ZmaXIpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImRlaW50ZXJsYWNlX2xpbmVfdmZpciIpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwgX2JhY2t1cF9kZWludGVybGFjZV9saW5lX3ZmaXIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCAxLCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDEsICJzMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgMSwgInMyIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCAxLCAiczMiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDEsICJzNCIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgMSwgInM1Iik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfY29uc3RhbnQgKHAsIDIsIDB4MDAwMDAwMDIsICJjMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2NvbnN0YW50IChwLCAyLCAweDAwMDAwMDAxLCAiYzIiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9jb25zdGFudCAocCwgMiwgMHgwMDAwMDAwNCwgImMzIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfY29uc3RhbnQgKHAsIDIsIDB4MDAwMDAwMDMsICJjNCIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgMiwgInQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCAyLCAidDIiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDIsICJ0MyIpOworCisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZ1YnciLCAwLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1MxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9TNSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiYWRkdyIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDIsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZ1YnciLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1MyLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMCwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9TNCwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiYWRkdyIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDMsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInNobHciLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QyLCBPUkNfVkFSX0MxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMCwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9TMywgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2hsdyIsIDAsIE9SQ19WQVJfVDMsIE9SQ19WQVJfVDMsIE9SQ19WQVJfQzIsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInN1YnciLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhZGR3IiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiYWRkdyIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDIsIE9SQ19WQVJfQzMsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInNocnN3IiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9DNCwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnN1c3diIiwgMCwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9UMiwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9EMV0gPSBkMTsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX1MxXSA9ICh2b2lkICopIHMxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzJdID0gKHZvaWQgKikgczI7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TM10gPSAodm9pZCAqKSBzMzsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX1M0XSA9ICh2b2lkICopIHM0OworICBleC0+YXJyYXlzW09SQ19WQVJfUzVdID0gKHZvaWQgKikgczU7CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIGRlaW50ZXJsYWNlX2xpbmVfbGluZWFyICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK2RlaW50ZXJsYWNlX2xpbmVfbGluZWFyIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczIsIGludCBuKQoreworICBpbnQgaTsKKyAgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIGNvbnN0IG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyNTsKKyAgb3JjX2ludDggdmFyMzI7CisgIG9yY19pbnQ4IHZhcjMzOworICBvcmNfaW50OCB2YXIzNDsKKworICBwdHIwID0gKG9yY19pbnQ4ICopIGQxOworICBwdHI0ID0gKG9yY19pbnQ4ICopIHMxOworICBwdHI1ID0gKG9yY19pbnQ4ICopIHMyOworCisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRiICovCisgICAgdmFyMzIgPSBwdHI0W2ldOworICAgIC8qIDE6IGxvYWRiICovCisgICAgdmFyMzMgPSBwdHI1W2ldOworICAgIC8qIDI6IGF2Z3ViICovCisgICAgdmFyMzQgPSAoKG9yY191aW50OCkgdmFyMzIgKyAob3JjX3VpbnQ4KSB2YXIzMyArIDEpID4+IDE7CisgICAgLyogMzogc3RvcmViICovCisgICAgcHRyMFtpXSA9IHZhcjM0OworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX2RlaW50ZXJsYWNlX2xpbmVfbGluZWFyIChPcmNFeGVjdXRvciAqIE9SQ19SRVNUUklDVCBleCkKK3sKKyAgaW50IGk7CisgIGludCBuID0gZXgtPm47CisgIG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHI0OworICBjb25zdCBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjU7CisgIG9yY19pbnQ4IHZhcjMyOworICBvcmNfaW50OCB2YXIzMzsKKyAgb3JjX2ludDggdmFyMzQ7CisKKyAgcHRyMCA9IChvcmNfaW50OCAqKSBleC0+YXJyYXlzWzBdOworICBwdHI0ID0gKG9yY19pbnQ4ICopIGV4LT5hcnJheXNbNF07CisgIHB0cjUgPSAob3JjX2ludDggKikgZXgtPmFycmF5c1s1XTsKKworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkYiAqLworICAgIHZhcjMyID0gcHRyNFtpXTsKKyAgICAvKiAxOiBsb2FkYiAqLworICAgIHZhcjMzID0gcHRyNVtpXTsKKyAgICAvKiAyOiBhdmd1YiAqLworICAgIHZhcjM0ID0gKChvcmNfdWludDgpIHZhcjMyICsgKG9yY191aW50OCkgdmFyMzMgKyAxKSA+PiAxOworICAgIC8qIDM6IHN0b3JlYiAqLworICAgIHB0cjBbaV0gPSB2YXIzNDsKKyAgfQorCit9CisKK3ZvaWQKK2RlaW50ZXJsYWNlX2xpbmVfbGluZWFyIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczIsIGludCBuKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgOSwgMjMsIDEwMCwgMTAxLCAxMDUsIDExMCwgMTE2LCAxMDEsIDExNCwgMTA4LCA5NywgOTksIDEwMSwgOTUsIDEwOCwKKyAgICAgICAgMTA1LCAxMTAsIDEwMSwgOTUsIDEwOCwgMTA1LCAxMTAsIDEwMSwgOTcsIDExNCwgMTEsIDEsIDEsIDEyLCAxLCAxLAorICAgICAgICAxMiwgMSwgMSwgMzksIDAsIDQsIDUsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwgX2JhY2t1cF9kZWludGVybGFjZV9saW5lX2xpbmVhcik7CisjZWxzZQorICAgICAgcCA9IG9yY19wcm9ncmFtX25ldyAoKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9uYW1lIChwLCAiZGVpbnRlcmxhY2VfbGluZV9saW5lYXIiKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsIF9iYWNrdXBfZGVpbnRlcmxhY2VfbGluZV9saW5lYXIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCAxLCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDEsICJzMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgMSwgInMyIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiYXZndWIiLCAwLCBPUkNfVkFSX0QxLCBPUkNfVkFSX1MxLCBPUkNfVkFSX1MyLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworI2VuZGlmCisKKyAgICAgIG9yY19wcm9ncmFtX2NvbXBpbGUgKHApOworICAgICAgYyA9IG9yY19wcm9ncmFtX3Rha2VfY29kZSAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9mcmVlIChwKTsKKyAgICB9CisgICAgcF9pbml0ZWQgPSBUUlVFOworICAgIG9yY19vbmNlX211dGV4X3VubG9jayAoKTsKKyAgfQorICBleC0+YXJyYXlzW09SQ19WQVJfQTJdID0gYzsKKyAgZXgtPnByb2dyYW0gPSAwOworCisgIGV4LT5uID0gbjsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX0QxXSA9IGQxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzFdID0gKHZvaWQgKikgczE7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMl0gPSAodm9pZCAqKSBzMjsKKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCisKKworLyogZGVpbnRlcmxhY2VfbGluZV9saW5lYXJfYmxlbmQgKi8KKyNpZmRlZiBESVNBQkxFX09SQwordm9pZAorZGVpbnRlcmxhY2VfbGluZV9saW5lYXJfYmxlbmQgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMiwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczMsIGludCBuKQoreworICBpbnQgaTsKKyAgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIGNvbnN0IG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyNTsKKyAgY29uc3Qgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHI2OworICBvcmNfaW50OCB2YXIzNTsKKyAgb3JjX2ludDggdmFyMzY7CisgIG9yY19pbnQ4IHZhcjM3OworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID09IDIgJiYgZGVmaW5lZCAoX19pMzg2X18pCisgIHZvbGF0aWxlIG9yY191bmlvbjE2IHZhcjM4OworI2Vsc2UKKyAgb3JjX3VuaW9uMTYgdmFyMzg7CisjZW5kaWYKKyAgb3JjX2ludDggdmFyMzk7CisgIG9yY191bmlvbjE2IHZhcjQwOworICBvcmNfdW5pb24xNiB2YXI0MTsKKyAgb3JjX3VuaW9uMTYgdmFyNDI7CisgIG9yY191bmlvbjE2IHZhcjQzOworICBvcmNfdW5pb24xNiB2YXI0NDsKKyAgb3JjX3VuaW9uMTYgdmFyNDU7CisgIG9yY191bmlvbjE2IHZhcjQ2OworICBvcmNfdW5pb24xNiB2YXI0NzsKKworICBwdHIwID0gKG9yY19pbnQ4ICopIGQxOworICBwdHI0ID0gKG9yY19pbnQ4ICopIHMxOworICBwdHI1ID0gKG9yY19pbnQ4ICopIHMyOworICBwdHI2ID0gKG9yY19pbnQ4ICopIHMzOworCisgIC8qIDk6IGxvYWRwdyAqLworICB2YXIzOC5pID0gMHgwMDAwMDAwMjsgICAgICAgICAvKiAyIG9yIDkuODgxMzFlLTMyNGYgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGIgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMTogY29udnVidyAqLworICAgIHZhcjQwLmkgPSAob3JjX3VpbnQ4KSB2YXIzNTsKKyAgICAvKiAyOiBsb2FkYiAqLworICAgIHZhcjM2ID0gcHRyNVtpXTsKKyAgICAvKiAzOiBjb252dWJ3ICovCisgICAgdmFyNDEuaSA9IChvcmNfdWludDgpIHZhcjM2OworICAgIC8qIDQ6IGxvYWRiICovCisgICAgdmFyMzcgPSBwdHI2W2ldOworICAgIC8qIDU6IGNvbnZ1YncgKi8KKyAgICB2YXI0Mi5pID0gKG9yY191aW50OCkgdmFyMzc7CisgICAgLyogNjogYWRkdyAqLworICAgIHZhcjQzLmkgPSB2YXI0MC5pICsgdmFyNDEuaTsKKyAgICAvKiA3OiBhZGR3ICovCisgICAgdmFyNDQuaSA9IHZhcjQyLmkgKyB2YXI0Mi5pOworICAgIC8qIDg6IGFkZHcgKi8KKyAgICB2YXI0NS5pID0gdmFyNDMuaSArIHZhcjQ0Lmk7CisgICAgLyogMTA6IGFkZHcgKi8KKyAgICB2YXI0Ni5pID0gdmFyNDUuaSArIHZhcjM4Lmk7CisgICAgLyogMTE6IHNocnN3ICovCisgICAgdmFyNDcuaSA9IHZhcjQ2LmkgPj4gMjsKKyAgICAvKiAxMjogY29udnN1c3diICovCisgICAgdmFyMzkgPSBPUkNfQ0xBTVBfVUIgKHZhcjQ3LmkpOworICAgIC8qIDEzOiBzdG9yZWIgKi8KKyAgICBwdHIwW2ldID0gdmFyMzk7CisgIH0KKworfQorCisjZWxzZQorc3RhdGljIHZvaWQKK19iYWNrdXBfZGVpbnRlcmxhY2VfbGluZV9saW5lYXJfYmxlbmQgKE9yY0V4ZWN1dG9yICogT1JDX1JFU1RSSUNUIGV4KQoreworICBpbnQgaTsKKyAgaW50IG4gPSBleC0+bjsKKyAgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIGNvbnN0IG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyNTsKKyAgY29uc3Qgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHI2OworICBvcmNfaW50OCB2YXIzNTsKKyAgb3JjX2ludDggdmFyMzY7CisgIG9yY19pbnQ4IHZhcjM3OworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID09IDIgJiYgZGVmaW5lZCAoX19pMzg2X18pCisgIHZvbGF0aWxlIG9yY191bmlvbjE2IHZhcjM4OworI2Vsc2UKKyAgb3JjX3VuaW9uMTYgdmFyMzg7CisjZW5kaWYKKyAgb3JjX2ludDggdmFyMzk7CisgIG9yY191bmlvbjE2IHZhcjQwOworICBvcmNfdW5pb24xNiB2YXI0MTsKKyAgb3JjX3VuaW9uMTYgdmFyNDI7CisgIG9yY191bmlvbjE2IHZhcjQzOworICBvcmNfdW5pb24xNiB2YXI0NDsKKyAgb3JjX3VuaW9uMTYgdmFyNDU7CisgIG9yY191bmlvbjE2IHZhcjQ2OworICBvcmNfdW5pb24xNiB2YXI0NzsKKworICBwdHIwID0gKG9yY19pbnQ4ICopIGV4LT5hcnJheXNbMF07CisgIHB0cjQgPSAob3JjX2ludDggKikgZXgtPmFycmF5c1s0XTsKKyAgcHRyNSA9IChvcmNfaW50OCAqKSBleC0+YXJyYXlzWzVdOworICBwdHI2ID0gKG9yY19pbnQ4ICopIGV4LT5hcnJheXNbNl07CisKKyAgLyogOTogbG9hZHB3ICovCisgIHZhcjM4LmkgPSAweDAwMDAwMDAyOyAgICAgICAgIC8qIDIgb3IgOS44ODEzMWUtMzI0ZiAqLworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkYiAqLworICAgIHZhcjM1ID0gcHRyNFtpXTsKKyAgICAvKiAxOiBjb252dWJ3ICovCisgICAgdmFyNDAuaSA9IChvcmNfdWludDgpIHZhcjM1OworICAgIC8qIDI6IGxvYWRiICovCisgICAgdmFyMzYgPSBwdHI1W2ldOworICAgIC8qIDM6IGNvbnZ1YncgKi8KKyAgICB2YXI0MS5pID0gKG9yY191aW50OCkgdmFyMzY7CisgICAgLyogNDogbG9hZGIgKi8KKyAgICB2YXIzNyA9IHB0cjZbaV07CisgICAgLyogNTogY29udnVidyAqLworICAgIHZhcjQyLmkgPSAob3JjX3VpbnQ4KSB2YXIzNzsKKyAgICAvKiA2OiBhZGR3ICovCisgICAgdmFyNDMuaSA9IHZhcjQwLmkgKyB2YXI0MS5pOworICAgIC8qIDc6IGFkZHcgKi8KKyAgICB2YXI0NC5pID0gdmFyNDIuaSArIHZhcjQyLmk7CisgICAgLyogODogYWRkdyAqLworICAgIHZhcjQ1LmkgPSB2YXI0My5pICsgdmFyNDQuaTsKKyAgICAvKiAxMDogYWRkdyAqLworICAgIHZhcjQ2LmkgPSB2YXI0NS5pICsgdmFyMzguaTsKKyAgICAvKiAxMTogc2hyc3cgKi8KKyAgICB2YXI0Ny5pID0gdmFyNDYuaSA+PiAyOworICAgIC8qIDEyOiBjb252c3Vzd2IgKi8KKyAgICB2YXIzOSA9IE9SQ19DTEFNUF9VQiAodmFyNDcuaSk7CisgICAgLyogMTM6IHN0b3JlYiAqLworICAgIHB0cjBbaV0gPSB2YXIzOTsKKyAgfQorCit9CisKK3ZvaWQKK2RlaW50ZXJsYWNlX2xpbmVfbGluZWFyX2JsZW5kIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczIsCisgICAgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMzLCBpbnQgbikKK3sKKyAgT3JjRXhlY3V0b3IgX2V4LCAqZXggPSAmX2V4OworICBzdGF0aWMgdm9sYXRpbGUgaW50IHBfaW5pdGVkID0gMDsKKyAgc3RhdGljIE9yY0NvZGUgKmMgPSAwOworICB2b2lkICgqZnVuYykgKE9yY0V4ZWN1dG9yICopOworCisgIGlmICghcF9pbml0ZWQpIHsKKyAgICBvcmNfb25jZV9tdXRleF9sb2NrICgpOworICAgIGlmICghcF9pbml0ZWQpIHsKKyAgICAgIE9yY1Byb2dyYW0gKnA7CisKKyNpZiAxCisgICAgICBzdGF0aWMgY29uc3Qgb3JjX3VpbnQ4IGJjW10gPSB7CisgICAgICAgIDEsIDksIDI5LCAxMDAsIDEwMSwgMTA1LCAxMTAsIDExNiwgMTAxLCAxMTQsIDEwOCwgOTcsIDk5LCAxMDEsIDk1LCAxMDgsCisgICAgICAgIDEwNSwgMTEwLCAxMDEsIDk1LCAxMDgsIDEwNSwgMTEwLCAxMDEsIDk3LCAxMTQsIDk1LCA5OCwgMTA4LCAxMDEsIDExMCwKKyAgICAgICAgMTAwLAorICAgICAgICAxMSwgMSwgMSwgMTIsIDEsIDEsIDEyLCAxLCAxLCAxMiwgMSwgMSwgMTQsIDIsIDIsIDAsCisgICAgICAgIDAsIDAsIDIwLCAyLCAyMCwgMiwgMjAsIDIsIDE1MCwgMzIsIDQsIDE1MCwgMzMsIDUsIDE1MCwgMzQsCisgICAgICAgIDYsIDcwLCAzMiwgMzIsIDMzLCA3MCwgMzQsIDM0LCAzNCwgNzAsIDMyLCAzMiwgMzQsIDcwLCAzMiwgMzIsCisgICAgICAgIDE2LCA5NCwgMzIsIDMyLCAxNiwgMTYwLCAwLCAzMiwgMiwgMCwKKyAgICAgIH07CisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3X2Zyb21fc3RhdGljX2J5dGVjb2RlIChiYyk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfZGVpbnRlcmxhY2VfbGluZV9saW5lYXJfYmxlbmQpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImRlaW50ZXJsYWNlX2xpbmVfbGluZWFyX2JsZW5kIik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfZGVpbnRlcmxhY2VfbGluZV9saW5lYXJfYmxlbmQpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCAxLCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDEsICJzMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgMSwgInMyIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCAxLCAiczMiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9jb25zdGFudCAocCwgMiwgMHgwMDAwMDAwMiwgImMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCAyLCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDIsICJ0MiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgMiwgInQzIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnVidyIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfUzEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZ1YnciLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1MyLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMCwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9TMywgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiYWRkdyIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDIsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImFkZHciLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QzLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhZGR3IiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiYWRkdyIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfQzEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInNocnN3IiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9DMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnN1c3diIiwgMCwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9EMV0gPSBkMTsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX1MxXSA9ICh2b2lkICopIHMxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzJdID0gKHZvaWQgKikgczI7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TM10gPSAodm9pZCAqKSBzMzsKKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCisKKworLyogZGVpbnRlcmxhY2VfbGluZV9ncmVlZHkgKi8KKyNpZmRlZiBESVNBQkxFX09SQwordm9pZAorZGVpbnRlcmxhY2VfbGluZV9ncmVlZHkgKG9yY191aW50OCAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBvcmNfdWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGNvbnN0IG9yY191aW50OCAqIE9SQ19SRVNUUklDVCBzMiwKKyAgICBjb25zdCBvcmNfdWludDggKiBPUkNfUkVTVFJJQ1QgczMsIGNvbnN0IG9yY191aW50OCAqIE9SQ19SRVNUUklDVCBzNCwKKyAgICBpbnQgcDEsIGludCBuKQoreworICBpbnQgaTsKKyAgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIGNvbnN0IG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyNTsKKyAgY29uc3Qgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHI2OworICBjb25zdCBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjc7CisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPT0gMiAmJiBkZWZpbmVkIChfX2kzODZfXykKKyAgdm9sYXRpbGUgb3JjX2ludDggdmFyNDQ7CisjZWxzZQorICBvcmNfaW50OCB2YXI0NDsKKyNlbmRpZgorICBvcmNfaW50OCB2YXI0NTsKKyAgb3JjX2ludDggdmFyNDY7CisgIG9yY19pbnQ4IHZhcjQ3OworICBvcmNfaW50OCB2YXI0ODsKKyAgb3JjX2ludDggdmFyNDk7CisgIG9yY19pbnQ4IHZhcjUwOworICBvcmNfaW50OCB2YXI1MTsKKyAgb3JjX2ludDggdmFyNTI7CisgIG9yY19pbnQ4IHZhcjUzOworICBvcmNfaW50OCB2YXI1NDsKKyAgb3JjX2ludDggdmFyNTU7CisgIG9yY19pbnQ4IHZhcjU2OworICBvcmNfaW50OCB2YXI1NzsKKyAgb3JjX2ludDggdmFyNTg7CisgIG9yY19pbnQ4IHZhcjU5OworICBvcmNfaW50OCB2YXI2MDsKKyAgb3JjX2ludDggdmFyNjE7CisgIG9yY19pbnQ4IHZhcjYyOworICBvcmNfaW50OCB2YXI2MzsKKyAgb3JjX2ludDggdmFyNjQ7CisgIG9yY19pbnQ4IHZhcjY1OworICBvcmNfaW50OCB2YXI2NjsKKyAgb3JjX2ludDggdmFyNjc7CisgIG9yY19pbnQ4IHZhcjY4OworCisgIHB0cjAgPSAob3JjX2ludDggKikgZDE7CisgIHB0cjQgPSAob3JjX2ludDggKikgczE7CisgIHB0cjUgPSAob3JjX2ludDggKikgczI7CisgIHB0cjYgPSAob3JjX2ludDggKikgczM7CisgIHB0cjcgPSAob3JjX2ludDggKikgczQ7CisKKyAgLyogMTE6IGxvYWRwYiAqLworICB2YXI0NCA9IDB4MDAwMDAwODA7ICAgICAgICAgICAvKiAxMjggb3IgNi4zMjQwNGUtMzIyZiAqLworICAvKiAyMDogbG9hZHBiICovCisgIHZhcjQ1ID0gcDE7CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRiICovCisgICAgdmFyNDcgPSBwdHI0W2ldOworICAgIC8qIDE6IGxvYWRiICovCisgICAgdmFyNDggPSBwdHI3W2ldOworICAgIC8qIDI6IGxvYWRiICovCisgICAgdmFyNDkgPSBwdHI2W2ldOworICAgIC8qIDM6IGxvYWRiICovCisgICAgdmFyNTAgPSBwdHI1W2ldOworICAgIC8qIDQ6IGF2Z3ViICovCisgICAgdmFyNTEgPSAoKG9yY191aW50OCkgdmFyNTAgKyAob3JjX3VpbnQ4KSB2YXI0OSArIDEpID4+IDE7CisgICAgLyogNTogbWF4dWIgKi8KKyAgICB2YXI1MiA9IE9SQ19NQVggKChvcmNfdWludDgpIHZhcjQ3LCAob3JjX3VpbnQ4KSB2YXI1MSk7CisgICAgLyogNjogbWludWIgKi8KKyAgICB2YXI1MyA9IE9SQ19NSU4gKChvcmNfdWludDgpIHZhcjQ3LCAob3JjX3VpbnQ4KSB2YXI1MSk7CisgICAgLyogNzogc3ViYiAqLworICAgIHZhcjU0ID0gdmFyNTIgLSB2YXI1MzsKKyAgICAvKiA4OiBtYXh1YiAqLworICAgIHZhcjU1ID0gT1JDX01BWCAoKG9yY191aW50OCkgdmFyNDgsIChvcmNfdWludDgpIHZhcjUxKTsKKyAgICAvKiA5OiBtaW51YiAqLworICAgIHZhcjU2ID0gT1JDX01JTiAoKG9yY191aW50OCkgdmFyNDgsIChvcmNfdWludDgpIHZhcjUxKTsKKyAgICAvKiAxMDogc3ViYiAqLworICAgIHZhcjU3ID0gdmFyNTUgLSB2YXI1NjsKKyAgICAvKiAxMjogeG9yYiAqLworICAgIHZhcjU4ID0gdmFyNTQgXiB2YXI0NDsKKyAgICAvKiAxMzogeG9yYiAqLworICAgIHZhcjU5ID0gdmFyNTcgXiB2YXI0NDsKKyAgICAvKiAxNDogY21wZ3RzYiAqLworICAgIHZhcjYwID0gKHZhcjU4ID4gdmFyNTkpID8gKH4wKSA6IDA7CisgICAgLyogMTU6IGFuZGIgKi8KKyAgICB2YXI2MSA9IHZhcjQ4ICYgdmFyNjA7CisgICAgLyogMTY6IGFuZG5iICovCisgICAgdmFyNjIgPSAofnZhcjYwKSAmIHZhcjQ3OworICAgIC8qIDE3OiBvcmIgKi8KKyAgICB2YXI2MyA9IHZhcjYxIHwgdmFyNjI7CisgICAgLyogMTg6IG1heHViICovCisgICAgdmFyNjQgPSBPUkNfTUFYICgob3JjX3VpbnQ4KSB2YXI1MCwgKG9yY191aW50OCkgdmFyNDkpOworICAgIC8qIDE5OiBtaW51YiAqLworICAgIHZhcjY1ID0gT1JDX01JTiAoKG9yY191aW50OCkgdmFyNTAsIChvcmNfdWludDgpIHZhcjQ5KTsKKyAgICAvKiAyMTogYWRkdXNiICovCisgICAgdmFyNjYgPSBPUkNfQ0xBTVBfVUIgKChvcmNfdWludDgpIHZhcjY0ICsgKG9yY191aW50OCkgdmFyNDUpOworICAgIC8qIDIyOiBzdWJ1c2IgKi8KKyAgICB2YXI2NyA9IE9SQ19DTEFNUF9VQiAoKG9yY191aW50OCkgdmFyNjUgLSAob3JjX3VpbnQ4KSB2YXI0NSk7CisgICAgLyogMjM6IG1pbnViICovCisgICAgdmFyNjggPSBPUkNfTUlOICgob3JjX3VpbnQ4KSB2YXI2MywgKG9yY191aW50OCkgdmFyNjYpOworICAgIC8qIDI0OiBtYXh1YiAqLworICAgIHZhcjQ2ID0gT1JDX01BWCAoKG9yY191aW50OCkgdmFyNjgsIChvcmNfdWludDgpIHZhcjY3KTsKKyAgICAvKiAyNTogc3RvcmViICovCisgICAgcHRyMFtpXSA9IHZhcjQ2OworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX2RlaW50ZXJsYWNlX2xpbmVfZ3JlZWR5IChPcmNFeGVjdXRvciAqIE9SQ19SRVNUUklDVCBleCkKK3sKKyAgaW50IGk7CisgIGludCBuID0gZXgtPm47CisgIG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHI0OworICBjb25zdCBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjU7CisgIGNvbnN0IG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyNjsKKyAgY29uc3Qgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHI3OworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID09IDIgJiYgZGVmaW5lZCAoX19pMzg2X18pCisgIHZvbGF0aWxlIG9yY19pbnQ4IHZhcjQ0OworI2Vsc2UKKyAgb3JjX2ludDggdmFyNDQ7CisjZW5kaWYKKyAgb3JjX2ludDggdmFyNDU7CisgIG9yY19pbnQ4IHZhcjQ2OworICBvcmNfaW50OCB2YXI0NzsKKyAgb3JjX2ludDggdmFyNDg7CisgIG9yY19pbnQ4IHZhcjQ5OworICBvcmNfaW50OCB2YXI1MDsKKyAgb3JjX2ludDggdmFyNTE7CisgIG9yY19pbnQ4IHZhcjUyOworICBvcmNfaW50OCB2YXI1MzsKKyAgb3JjX2ludDggdmFyNTQ7CisgIG9yY19pbnQ4IHZhcjU1OworICBvcmNfaW50OCB2YXI1NjsKKyAgb3JjX2ludDggdmFyNTc7CisgIG9yY19pbnQ4IHZhcjU4OworICBvcmNfaW50OCB2YXI1OTsKKyAgb3JjX2ludDggdmFyNjA7CisgIG9yY19pbnQ4IHZhcjYxOworICBvcmNfaW50OCB2YXI2MjsKKyAgb3JjX2ludDggdmFyNjM7CisgIG9yY19pbnQ4IHZhcjY0OworICBvcmNfaW50OCB2YXI2NTsKKyAgb3JjX2ludDggdmFyNjY7CisgIG9yY19pbnQ4IHZhcjY3OworICBvcmNfaW50OCB2YXI2ODsKKworICBwdHIwID0gKG9yY19pbnQ4ICopIGV4LT5hcnJheXNbMF07CisgIHB0cjQgPSAob3JjX2ludDggKikgZXgtPmFycmF5c1s0XTsKKyAgcHRyNSA9IChvcmNfaW50OCAqKSBleC0+YXJyYXlzWzVdOworICBwdHI2ID0gKG9yY19pbnQ4ICopIGV4LT5hcnJheXNbNl07CisgIHB0cjcgPSAob3JjX2ludDggKikgZXgtPmFycmF5c1s3XTsKKworICAvKiAxMTogbG9hZHBiICovCisgIHZhcjQ0ID0gMHgwMDAwMDA4MDsgICAgICAgICAgIC8qIDEyOCBvciA2LjMyNDA0ZS0zMjJmICovCisgIC8qIDIwOiBsb2FkcGIgKi8KKyAgdmFyNDUgPSBleC0+cGFyYW1zWzI0XTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGIgKi8KKyAgICB2YXI0NyA9IHB0cjRbaV07CisgICAgLyogMTogbG9hZGIgKi8KKyAgICB2YXI0OCA9IHB0cjdbaV07CisgICAgLyogMjogbG9hZGIgKi8KKyAgICB2YXI0OSA9IHB0cjZbaV07CisgICAgLyogMzogbG9hZGIgKi8KKyAgICB2YXI1MCA9IHB0cjVbaV07CisgICAgLyogNDogYXZndWIgKi8KKyAgICB2YXI1MSA9ICgob3JjX3VpbnQ4KSB2YXI1MCArIChvcmNfdWludDgpIHZhcjQ5ICsgMSkgPj4gMTsKKyAgICAvKiA1OiBtYXh1YiAqLworICAgIHZhcjUyID0gT1JDX01BWCAoKG9yY191aW50OCkgdmFyNDcsIChvcmNfdWludDgpIHZhcjUxKTsKKyAgICAvKiA2OiBtaW51YiAqLworICAgIHZhcjUzID0gT1JDX01JTiAoKG9yY191aW50OCkgdmFyNDcsIChvcmNfdWludDgpIHZhcjUxKTsKKyAgICAvKiA3OiBzdWJiICovCisgICAgdmFyNTQgPSB2YXI1MiAtIHZhcjUzOworICAgIC8qIDg6IG1heHViICovCisgICAgdmFyNTUgPSBPUkNfTUFYICgob3JjX3VpbnQ4KSB2YXI0OCwgKG9yY191aW50OCkgdmFyNTEpOworICAgIC8qIDk6IG1pbnViICovCisgICAgdmFyNTYgPSBPUkNfTUlOICgob3JjX3VpbnQ4KSB2YXI0OCwgKG9yY191aW50OCkgdmFyNTEpOworICAgIC8qIDEwOiBzdWJiICovCisgICAgdmFyNTcgPSB2YXI1NSAtIHZhcjU2OworICAgIC8qIDEyOiB4b3JiICovCisgICAgdmFyNTggPSB2YXI1NCBeIHZhcjQ0OworICAgIC8qIDEzOiB4b3JiICovCisgICAgdmFyNTkgPSB2YXI1NyBeIHZhcjQ0OworICAgIC8qIDE0OiBjbXBndHNiICovCisgICAgdmFyNjAgPSAodmFyNTggPiB2YXI1OSkgPyAofjApIDogMDsKKyAgICAvKiAxNTogYW5kYiAqLworICAgIHZhcjYxID0gdmFyNDggJiB2YXI2MDsKKyAgICAvKiAxNjogYW5kbmIgKi8KKyAgICB2YXI2MiA9ICh+dmFyNjApICYgdmFyNDc7CisgICAgLyogMTc6IG9yYiAqLworICAgIHZhcjYzID0gdmFyNjEgfCB2YXI2MjsKKyAgICAvKiAxODogbWF4dWIgKi8KKyAgICB2YXI2NCA9IE9SQ19NQVggKChvcmNfdWludDgpIHZhcjUwLCAob3JjX3VpbnQ4KSB2YXI0OSk7CisgICAgLyogMTk6IG1pbnViICovCisgICAgdmFyNjUgPSBPUkNfTUlOICgob3JjX3VpbnQ4KSB2YXI1MCwgKG9yY191aW50OCkgdmFyNDkpOworICAgIC8qIDIxOiBhZGR1c2IgKi8KKyAgICB2YXI2NiA9IE9SQ19DTEFNUF9VQiAoKG9yY191aW50OCkgdmFyNjQgKyAob3JjX3VpbnQ4KSB2YXI0NSk7CisgICAgLyogMjI6IHN1YnVzYiAqLworICAgIHZhcjY3ID0gT1JDX0NMQU1QX1VCICgob3JjX3VpbnQ4KSB2YXI2NSAtIChvcmNfdWludDgpIHZhcjQ1KTsKKyAgICAvKiAyMzogbWludWIgKi8KKyAgICB2YXI2OCA9IE9SQ19NSU4gKChvcmNfdWludDgpIHZhcjYzLCAob3JjX3VpbnQ4KSB2YXI2Nik7CisgICAgLyogMjQ6IG1heHViICovCisgICAgdmFyNDYgPSBPUkNfTUFYICgob3JjX3VpbnQ4KSB2YXI2OCwgKG9yY191aW50OCkgdmFyNjcpOworICAgIC8qIDI1OiBzdG9yZWIgKi8KKyAgICBwdHIwW2ldID0gdmFyNDY7CisgIH0KKworfQorCit2b2lkCitkZWludGVybGFjZV9saW5lX2dyZWVkeSAob3JjX3VpbnQ4ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IG9yY191aW50OCAqIE9SQ19SRVNUUklDVCBzMSwgY29uc3Qgb3JjX3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMyLAorICAgIGNvbnN0IG9yY191aW50OCAqIE9SQ19SRVNUUklDVCBzMywgY29uc3Qgb3JjX3VpbnQ4ICogT1JDX1JFU1RSSUNUIHM0LAorICAgIGludCBwMSwgaW50IG4pCit7CisgIE9yY0V4ZWN1dG9yIF9leCwgKmV4ID0gJl9leDsKKyAgc3RhdGljIHZvbGF0aWxlIGludCBwX2luaXRlZCA9IDA7CisgIHN0YXRpYyBPcmNDb2RlICpjID0gMDsKKyAgdm9pZCAoKmZ1bmMpIChPcmNFeGVjdXRvciAqKTsKKworICBpZiAoIXBfaW5pdGVkKSB7CisgICAgb3JjX29uY2VfbXV0ZXhfbG9jayAoKTsKKyAgICBpZiAoIXBfaW5pdGVkKSB7CisgICAgICBPcmNQcm9ncmFtICpwOworCisjaWYgMQorICAgICAgc3RhdGljIGNvbnN0IG9yY191aW50OCBiY1tdID0geworICAgICAgICAxLCA5LCAyMywgMTAwLCAxMDEsIDEwNSwgMTEwLCAxMTYsIDEwMSwgMTE0LCAxMDgsIDk3LCA5OSwgMTAxLCA5NSwgMTA4LAorICAgICAgICAxMDUsIDExMCwgMTAxLCA5NSwgMTAzLCAxMTQsIDEwMSwgMTAxLCAxMDAsIDEyMSwgMTEsIDEsIDEsIDEyLCAxLCAxLAorICAgICAgICAxMiwgMSwgMSwgMTIsIDEsIDEsIDEyLCAxLCAxLCAxNCwgMSwgMTI4LCAwLCAwLCAwLCAxNiwKKyAgICAgICAgMSwgMjAsIDEsIDIwLCAxLCAyMCwgMSwgMjAsIDEsIDIwLCAxLCAyMCwgMSwgMjAsIDEsIDIwLAorICAgICAgICAxLCAyMCwgMSwgMjAsIDEsIDIwLCAxLCAyMCwgMSwgNDMsIDMyLCA0LCA0MywgMzMsIDcsIDQzLAorICAgICAgICAzNCwgNiwgNDMsIDM1LCA1LCAzOSwgMzYsIDM1LCAzNCwgNTMsIDM5LCAzMiwgMzYsIDU1LCA0MCwgMzIsCisgICAgICAgIDM2LCA2NSwgMzcsIDM5LCA0MCwgNTMsIDM5LCAzMywgMzYsIDU1LCA0MCwgMzMsIDM2LCA2NSwgMzgsIDM5LAorICAgICAgICA0MCwgNjgsIDM3LCAzNywgMTYsIDY4LCAzOCwgMzgsIDE2LCA0MSwgNDAsIDM3LCAzOCwgMzYsIDM5LCAzMywKKyAgICAgICAgNDAsIDM3LCA0MCwgNDAsIDMyLCA1OSwgNDEsIDM5LCA0MCwgNTMsIDQzLCAzNSwgMzQsIDU1LCA0MiwgMzUsCisgICAgICAgIDM0LCAzNSwgNDMsIDQzLCAyNCwgNjcsIDQyLCA0MiwgMjQsIDU1LCA0MSwgNDEsIDQzLCA1MywgMCwgNDEsCisgICAgICAgIDQyLCAyLCAwLAorICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsIF9iYWNrdXBfZGVpbnRlcmxhY2VfbGluZV9ncmVlZHkpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImRlaW50ZXJsYWNlX2xpbmVfZ3JlZWR5Iik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLCBfYmFja3VwX2RlaW50ZXJsYWNlX2xpbmVfZ3JlZWR5KTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9kZXN0aW5hdGlvbiAocCwgMSwgImQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCAxLCAiczEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDEsICJzMiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgMSwgInMzIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCAxLCAiczQiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9jb25zdGFudCAocCwgMSwgMHgwMDAwMDA4MCwgImMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfcGFyYW1ldGVyIChwLCAxLCAicDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDEsICJ0MSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgMSwgInQyIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCAxLCAidDMiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDEsICJ0NCIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgMSwgInQ1Iik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCAxLCAidDYiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDEsICJ0NyIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgMSwgInQ4Iik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCAxLCAidDkiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDEsICJ0MTAiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDEsICJ0MTEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDEsICJ0MTIiKTsKKworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJsb2FkYiIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfUzEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImxvYWRiIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9TNCwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibG9hZGIiLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1MzLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJsb2FkYiIsIDAsIE9SQ19WQVJfVDQsIE9SQ19WQVJfUzIsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImF2Z3ViIiwgMCwgT1JDX1ZBUl9UNSwgT1JDX1ZBUl9UNCwgT1JDX1ZBUl9UMywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibWF4dWIiLCAwLCBPUkNfVkFSX1Q4LCBPUkNfVkFSX1QxLCBPUkNfVkFSX1Q1LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtaW51YiIsIDAsIE9SQ19WQVJfVDksIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDUsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInN1YmIiLCAwLCBPUkNfVkFSX1Q2LCBPUkNfVkFSX1Q4LCBPUkNfVkFSX1Q5LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtYXh1YiIsIDAsIE9SQ19WQVJfVDgsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDUsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm1pbnViIiwgMCwgT1JDX1ZBUl9UOSwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UNSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic3ViYiIsIDAsIE9SQ19WQVJfVDcsIE9SQ19WQVJfVDgsIE9SQ19WQVJfVDksCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInhvcmIiLCAwLCBPUkNfVkFSX1Q2LCBPUkNfVkFSX1Q2LCBPUkNfVkFSX0MxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJ4b3JiIiwgMCwgT1JDX1ZBUl9UNywgT1JDX1ZBUl9UNywgT1JDX1ZBUl9DMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY21wZ3RzYiIsIDAsIE9SQ19WQVJfVDksIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDcsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImFuZGIiLCAwLCBPUkNfVkFSX1Q4LCBPUkNfVkFSX1QyLCBPUkNfVkFSX1Q5LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhbmRuYiIsIDAsIE9SQ19WQVJfVDksIE9SQ19WQVJfVDksIE9SQ19WQVJfVDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm9yYiIsIDAsIE9SQ19WQVJfVDEwLCBPUkNfVkFSX1Q4LCBPUkNfVkFSX1Q5LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtYXh1YiIsIDAsIE9SQ19WQVJfVDEyLCBPUkNfVkFSX1Q0LCBPUkNfVkFSX1QzLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtaW51YiIsIDAsIE9SQ19WQVJfVDExLCBPUkNfVkFSX1Q0LCBPUkNfVkFSX1QzLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhZGR1c2IiLCAwLCBPUkNfVkFSX1QxMiwgT1JDX1ZBUl9UMTIsCisgICAgICAgICAgT1JDX1ZBUl9QMSwgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInN1YnVzYiIsIDAsIE9SQ19WQVJfVDExLCBPUkNfVkFSX1QxMSwKKyAgICAgICAgICBPUkNfVkFSX1AxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibWludWIiLCAwLCBPUkNfVkFSX1QxMCwgT1JDX1ZBUl9UMTAsCisgICAgICAgICAgT1JDX1ZBUl9UMTIsIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtYXh1YiIsIDAsIE9SQ19WQVJfRDEsIE9SQ19WQVJfVDEwLCBPUkNfVkFSX1QxMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9EMV0gPSBkMTsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX1MxXSA9ICh2b2lkICopIHMxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzJdID0gKHZvaWQgKikgczI7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TM10gPSAodm9pZCAqKSBzMzsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX1M0XSA9ICh2b2lkICopIHM0OworICBleC0+cGFyYW1zW09SQ19WQVJfUDFdID0gcDE7CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0LmggYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLWRpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGJjOTAxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0LmgKQEAgLTAsMCArMSw5MyBAQAorCisvKiBhdXRvZ2VuZXJhdGVkIGZyb20gdHZ0aW1lLm9yYyAqLworCisjaWZuZGVmIF9UVlRJTUVfSF8KKyNkZWZpbmUgX1RWVElNRV9IXworCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworCisjaWZuZGVmIF9PUkNfSU5URUdFUl9UWVBFREVGU18KKyNkZWZpbmUgX09SQ19JTlRFR0VSX1RZUEVERUZTXworI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjaW5jbHVkZSA8c3RkaW50Lmg+Cit0eXBlZGVmIGludDhfdCBvcmNfaW50ODsKK3R5cGVkZWYgaW50MTZfdCBvcmNfaW50MTY7Cit0eXBlZGVmIGludDMyX3Qgb3JjX2ludDMyOwordHlwZWRlZiBpbnQ2NF90IG9yY19pbnQ2NDsKK3R5cGVkZWYgdWludDhfdCBvcmNfdWludDg7Cit0eXBlZGVmIHVpbnQxNl90IG9yY191aW50MTY7Cit0eXBlZGVmIHVpbnQzMl90IG9yY191aW50MzI7Cit0eXBlZGVmIHVpbnQ2NF90IG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSBVSU5UNjRfQyh4KQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKK3R5cGVkZWYgc2lnbmVkIF9faW50OCBvcmNfaW50ODsKK3R5cGVkZWYgc2lnbmVkIF9faW50MTYgb3JjX2ludDE2OwordHlwZWRlZiBzaWduZWQgX19pbnQzMiBvcmNfaW50MzI7Cit0eXBlZGVmIHNpZ25lZCBfX2ludDY0IG9yY19pbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ4IG9yY191aW50ODsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQxNiBvcmNfdWludDE2OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDMyIG9yY191aW50MzI7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgb3JjX3VpbnQ2NDsKKyNkZWZpbmUgT1JDX1VJTlQ2NF9DKHgpICh4IyNVaTY0KQorI2RlZmluZSBpbmxpbmUgX19pbmxpbmUKKyNlbHNlCisjaW5jbHVkZSA8bGltaXRzLmg+Cit0eXBlZGVmIHNpZ25lZCBjaGFyIG9yY19pbnQ4OwordHlwZWRlZiBzaG9ydCBvcmNfaW50MTY7Cit0eXBlZGVmIGludCBvcmNfaW50MzI7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgb3JjX3VpbnQ4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBvcmNfdWludDE2OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgb3JjX3VpbnQzMjsKKyNpZiBJTlRfTUFYID09IExPTkdfTUFYCit0eXBlZGVmIGxvbmcgbG9uZyBvcmNfaW50NjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgKHgjI1VMTCkKKyNlbHNlCit0eXBlZGVmIGxvbmcgb3JjX2ludDY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSAoeCMjVUwpCisjZW5kaWYKKyNlbmRpZgordHlwZWRlZiB1bmlvbiB7IG9yY19pbnQxNiBpOyBvcmNfaW50OCB4MlsyXTsgfSBvcmNfdW5pb24xNjsKK3R5cGVkZWYgdW5pb24geyBvcmNfaW50MzIgaTsgZmxvYXQgZjsgb3JjX2ludDE2IHgyWzJdOyBvcmNfaW50OCB4NFs0XTsgfSBvcmNfdW5pb24zMjsKK3R5cGVkZWYgdW5pb24geyBvcmNfaW50NjQgaTsgZG91YmxlIGY7IG9yY19pbnQzMiB4MlsyXTsgZmxvYXQgeDJmWzJdOyBvcmNfaW50MTYgeDRbNF07IH0gb3JjX3VuaW9uNjQ7CisjZW5kaWYKKyNpZm5kZWYgT1JDX1JFU1RSSUNUCisjaWYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyNkZWZpbmUgT1JDX1JFU1RSSUNUIHJlc3RyaWN0CisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSA0CisjZGVmaW5lIE9SQ19SRVNUUklDVCBfX3Jlc3RyaWN0X18KKyNlbHNlCisjZGVmaW5lIE9SQ19SRVNUUklDVAorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBPUkNfSU5URVJOQUwKKyNpZiBkZWZpbmVkKF9fU1VOUFJPX0MpICYmIChfX1NVTlBST19DID49IDB4NTkwKQorI2RlZmluZSBPUkNfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlkZGVuIikpKQorI2VsaWYgZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU1MCkKKyNkZWZpbmUgT1JDX0lOVEVSTkFMIF9faGlkZGVuCisjZWxpZiBkZWZpbmVkIChfX0dOVUNfXykKKyNkZWZpbmUgT1JDX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNlbHNlCisjZGVmaW5lIE9SQ19JTlRFUk5BTAorI2VuZGlmCisjZW5kaWYKKwordm9pZCBkZWludGVybGFjZV9saW5lX3ZmaXIgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczIsIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMywgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHM0LCBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczUsIGludCBuKTsKK3ZvaWQgZGVpbnRlcmxhY2VfbGluZV9saW5lYXIgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczIsIGludCBuKTsKK3ZvaWQgZGVpbnRlcmxhY2VfbGluZV9saW5lYXJfYmxlbmQgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczIsIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMywgaW50IG4pOwordm9pZCBkZWludGVybGFjZV9saW5lX2dyZWVkeSAob3JjX3VpbnQ4ICogT1JDX1JFU1RSSUNUIGQxLCBjb25zdCBvcmNfdWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGNvbnN0IG9yY191aW50OCAqIE9SQ19SRVNUUklDVCBzMiwgY29uc3Qgb3JjX3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMzLCBjb25zdCBvcmNfdWludDggKiBPUkNfUkVTVFJJQ1QgczQsIGludCBwMSwgaW50IG4pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS5vcmMgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLm9yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDIxN2U3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS5vcmMKQEAgLTAsMCArMSwxMDkgQEAKKworLmZ1bmN0aW9uIGRlaW50ZXJsYWNlX2xpbmVfdmZpcgorLmRlc3QgMSBkMSBndWludDgKKy5zb3VyY2UgMSBzMSBndWludDgKKy5zb3VyY2UgMSBzMiBndWludDgKKy5zb3VyY2UgMSBzMyBndWludDgKKy5zb3VyY2UgMSBzNCBndWludDgKKy5zb3VyY2UgMSBzNSBndWludDgKKy50ZW1wIDIgdDEKKy50ZW1wIDIgdDIKKy50ZW1wIDIgdDMKKworY29udnVidyB0MSwgczEKK2NvbnZ1YncgdDIsIHM1CithZGR3IHQxLCB0MSwgdDIKK2NvbnZ1YncgdDIsIHMyCitjb252dWJ3IHQzLCBzNAorYWRkdyB0MiwgdDIsIHQzCitzaGx3IHQyLCB0MiwgMgorY29udnVidyB0MywgczMKK3NobHcgdDMsIHQzLCAxCitzdWJ3IHQyLCB0MiwgdDEKK2FkZHcgdDIsIHQyLCB0MworYWRkdyB0MiwgdDIsIDQKK3NocnN3IHQyLCB0MiwgMworY29udnN1c3diIGQxLCB0MgorCisKKy5mdW5jdGlvbiBkZWludGVybGFjZV9saW5lX2xpbmVhcgorLmRlc3QgMSBkMSBndWludDgKKy5zb3VyY2UgMSBzMSBndWludDgKKy5zb3VyY2UgMSBzMiBndWludDgKKworYXZndWIgZDEsIHMxLCBzMgorCisKKy5mdW5jdGlvbiBkZWludGVybGFjZV9saW5lX2xpbmVhcl9ibGVuZAorLmRlc3QgMSBkMSBndWludDgKKy5zb3VyY2UgMSBzMSBndWludDgKKy5zb3VyY2UgMSBzMiBndWludDgKKy5zb3VyY2UgMSBzMyBndWludDgKKy50ZW1wIDIgdDEKKy50ZW1wIDIgdDIKKy50ZW1wIDIgdDMKKworY29udnVidyB0MSwgczEKK2NvbnZ1YncgdDIsIHMyCitjb252dWJ3IHQzLCBzMworYWRkdyB0MSwgdDEsIHQyCithZGR3IHQzLCB0MywgdDMKK2FkZHcgdDEsIHQxLCB0MworYWRkdyB0MSwgdDEsIDIKK3NocnN3IHQxLCB0MSwgMgorY29udnN1c3diIGQxLCB0MQorCisKKy5mdW5jdGlvbiBkZWludGVybGFjZV9saW5lX2dyZWVkeQorLmRlc3QgMSBkMQorLnNvdXJjZSAxIG0wCisuc291cmNlIDEgdDEKKy5zb3VyY2UgMSBiMQorLnNvdXJjZSAxIG0yCisucGFyYW0gMSBtYXhfY29tYgorLnRlbXAgMSB0bTAKKy50ZW1wIDEgdG0yCisudGVtcCAxIHRiMQorLnRlbXAgMSB0dDEKKy50ZW1wIDEgYXZnCisudGVtcCAxIGwyX2RpZmYKKy50ZW1wIDEgbHAyX2RpZmYKKy50ZW1wIDEgdDIKKy50ZW1wIDEgdDMKKy50ZW1wIDEgYmVzdAorLnRlbXAgMSBtaW4KKy50ZW1wIDEgbWF4CisKKworbG9hZGIgdG0wLCBtMAorbG9hZGIgdG0yLCBtMgorCitsb2FkYiB0YjEsIGIxCitsb2FkYiB0dDEsIHQxCithdmd1YiBhdmcsIHR0MSwgdGIxCisKK21heHViIHQyLCB0bTAsIGF2ZworbWludWIgdDMsIHRtMCwgYXZnCitzdWJiIGwyX2RpZmYsIHQyLCB0MworCittYXh1YiB0MiwgdG0yLCBhdmcKK21pbnViIHQzLCB0bTIsIGF2Zworc3ViYiBscDJfZGlmZiwgdDIsIHQzCisKK3hvcmIgbDJfZGlmZiwgbDJfZGlmZiwgMHg4MAoreG9yYiBscDJfZGlmZiwgbHAyX2RpZmYsIDB4ODAKK2NtcGd0c2IgdDMsIGwyX2RpZmYsIGxwMl9kaWZmCisKK2FuZGIgdDIsIHRtMiwgdDMKK2FuZG5iIHQzLCB0MywgdG0wCitvcmIgYmVzdCwgdDIsIHQzCisKK21heHViIG1heCwgdHQxLCB0YjEKK21pbnViIG1pbiwgdHQxLCB0YjEKK2FkZHVzYiBtYXgsIG1heCwgbWF4X2NvbWIKK3N1YnVzYiBtaW4sIG1pbiwgbWF4X2NvbWIKK21pbnViIGJlc3QsIGJlc3QsIG1heAorbWF4dWIgZDEsIGJlc3QsIG1pbgorCisKKwpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHkuYyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA0Y2U4YgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5LmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgVG9tIEJhcnJ5ICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogbW14LmggcG9ydCBjb3B5cmlnaHQgKGMpIDIwMDIgQmlsbHkgQmlnZ3MgPHZla3RvckBkdW1idGVybS5uZXQ+LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCwyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKgorICogUmVsaWNlbnNlZCBmb3IgR1N0cmVhbWVyIGZyb20gR1BMIHRvIExHUEwgd2l0aCBwZXJtaXQgZnJvbSBUb20gQmFycnkKKyAqIGFuZCBCaWxseSBCaWdncy4KKyAqIFNlZTogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTYzNTc4CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdGRlaW50ZXJsYWNlbWV0aG9kLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAidHZ0aW1lLmgiCisKKworI2RlZmluZSBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0wJKGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2xfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9JU19ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0wob2JqKQkJKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9MKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9HUkVFRFlfTF9DTEFTUyhrbGFzcykJKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0wpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9MX0dFVF9DTEFTUyhvYmopCShHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9MLCBHc3REZWludGVybGFjZU1ldGhvZEdyZWVkeUxDbGFzcykpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0wob2JqKQkJKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9MLCBHc3REZWludGVybGFjZU1ldGhvZEdyZWVkeUwpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9MX0NMQVNTKGtsYXNzKQkoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9HUkVFRFlfTCwgR3N0RGVpbnRlcmxhY2VNZXRob2RHcmVlZHlMQ2xhc3MpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9MX0NBU1Qob2JqKQkoKEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5TCopKG9iaikpCisKK0dUeXBlIGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2xfZ2V0X3R5cGUgKHZvaWQpOworCit0eXBlZGVmIHN0cnVjdAoreworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCBwYXJlbnQ7CisKKyAgZ3VpbnQgbWF4X2NvbWI7Cit9IEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5TDsKKwordHlwZWRlZiBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzIEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5TENsYXNzOworCisvLyBUaGlzIGlzIGEgc2ltcGxlIGxpZ2h0d2VpZ2h0IERlSW50ZXJsYWNlIG1ldGhvZCB0aGF0IHVzZXMgbGl0dGxlIENQVSB0aW1lCisvLyBidXQgZ2l2ZXMgdmVyeSBnb29kIHJlc3VsdHMgZm9yIGxvdyBvciBpbnRlcm1lZGl0ZSBtb3Rpb24uCisvLyBJdCBkZWZlcnMgZnJhbWVzIGJ5IG9uZSBmaWVsZCwgYnV0IHRoYXQgZG9lcyBub3Qgc2VlbSB0byBwcm9kdWNlIG5vdGljZWFibGUKKy8vIGxpcCBzeW5jIHByb2JsZW1zLgorLy8KKy8vIFRoZSBtZXRob2QgdXNlZCBpcyB0byB0YWtlIGVpdGhlciB0aGUgb2xkZXIgb3IgbmV3ZXIgd2VhdmUgcGl4ZWwgZGVwZW5kaW5nCisvLyB1cG9uIHdoaWNoIGdpdmUgdGhlIHNtYWxsZXIgY29tYiBmYWN0b3IsIGFuZCB0aGVuIGNsaXAgdG8gYXZvaWQgbGFyZ2UgZGFtYWdlCisvLyB3aGVuIHdyb25nLgorLy8KKy8vIEknZCBpbnRlbmRlZCB0aGlzIHRvIGJlIHBhcnQgb2YgYSBsYXJnZXIgbW9yZSBlbGFib3JhdGUgbWV0aG9kIGFkZGVkIHRvIAorLy8gQmxlbmRlZCBDbGlwIGJ1dCB0aGlzIGdpdmUgdG9vIGdvb2QgcmVzdWx0cyBmb3IgdGhlIENQVSB0byBpZ25vcmUgaGVyZS4KKworc3RhdGljIGlubGluZSB2b2lkCitkZWludGVybGFjZV9ncmVlZHlfaW50ZXJwb2xhdGVfc2NhbmxpbmVfb3JjIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgZ3VpbnQgbWF4X2NvbWIgPSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9MIChzZWxmKS0+bWF4X2NvbWI7CisKKyAgaWYgKHNjYW5saW5lcy0+bTEgPT0gTlVMTCB8fCBzY2FubGluZXMtPm1wID09IE5VTEwpIHsKKyAgICBkZWludGVybGFjZV9saW5lX2xpbmVhciAob3V0LCBzY2FubGluZXMtPnQwLCBzY2FubGluZXMtPmIwLCBzaXplKTsKKyAgfSBlbHNlIHsKKyAgICBkZWludGVybGFjZV9saW5lX2dyZWVkeSAob3V0LCBzY2FubGluZXMtPm0xLCBzY2FubGluZXMtPnQwLCBzY2FubGluZXMtPmIwLAorICAgICAgICBzY2FubGluZXMtPm1wID8gc2NhbmxpbmVzLT5tcCA6IHNjYW5saW5lcy0+bTEsIG1heF9jb21iLCBzaXplKTsKKyAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2RlaW50ZXJsYWNlX2dyZWVkeV9pbnRlcnBvbGF0ZV9zY2FubGluZV9vcmNfcGxhbmFyX3UgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kCisgICAgKiBzZWxmLCBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludAorICAgIHNpemUpCit7CisgIGd1aW50IG1heF9jb21iID0gR1NUX0RFSU5URVJMQUNFX01FVEhPRF9HUkVFRFlfTCAoc2VsZiktPm1heF9jb21iOworCisgIGlmIChzY2FubGluZXMtPm0xID09IE5VTEwgfHwgc2NhbmxpbmVzLT5tcCA9PSBOVUxMKSB7CisgICAgZGVpbnRlcmxhY2VfbGluZV9saW5lYXIgKG91dCwgc2NhbmxpbmVzLT50MCwgc2NhbmxpbmVzLT5iMCwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgZGVpbnRlcmxhY2VfbGluZV9ncmVlZHkgKG91dCwgc2NhbmxpbmVzLT5tMSwgc2NhbmxpbmVzLT50MCwgc2NhbmxpbmVzLT5iMCwKKyAgICAgICAgc2NhbmxpbmVzLT5tcCA/IHNjYW5saW5lcy0+bXAgOiBzY2FubGluZXMtPm0xLCBtYXhfY29tYiwgc2l6ZSk7CisgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitkZWludGVybGFjZV9ncmVlZHlfaW50ZXJwb2xhdGVfc2NhbmxpbmVfb3JjX3BsYW5hcl92IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZAorICAgICogc2VsZiwgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQKKyAgICBzaXplKQoreworICBndWludCBtYXhfY29tYiA9IEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0wgKHNlbGYpLT5tYXhfY29tYjsKKworICBpZiAoc2NhbmxpbmVzLT5tMSA9PSBOVUxMIHx8IHNjYW5saW5lcy0+bXAgPT0gTlVMTCkgeworICAgIGRlaW50ZXJsYWNlX2xpbmVfbGluZWFyIChvdXQsIHNjYW5saW5lcy0+dDAsIHNjYW5saW5lcy0+YjAsIHNpemUpOworICB9IGVsc2UgeworICAgIGRlaW50ZXJsYWNlX2xpbmVfZ3JlZWR5IChvdXQsIHNjYW5saW5lcy0+bTEsIHNjYW5saW5lcy0+dDAsIHNjYW5saW5lcy0+YjAsCisgICAgICAgIHNjYW5saW5lcy0+bXAgPyBzY2FubGluZXMtPm1wIDogc2NhbmxpbmVzLT5tMSwgbWF4X2NvbWIsIHNpemUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9ncmVlZHlfY29weV9zY2FubGluZSAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0wLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX2dyZWVkeV9jb3B5X3NjYW5saW5lX3BsYW5hcl91IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTAsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2VfZ3JlZWR5X2NvcHlfc2NhbmxpbmVfcGxhbmFyX3YgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMCwgc2l6ZSk7Cit9CisKK0dfREVGSU5FX1RZUEUgKEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5TCwgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfbCwKKyAgICBHU1RfVFlQRV9ERUlOVEVSTEFDRV9TSU1QTEVfTUVUSE9EKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTUFYX0NPTUIKK307CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dyZWVkeV9sX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3REZWludGVybGFjZU1ldGhvZEdyZWVkeUwgKnNlbGYgPSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9MIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NQVhfQ09NQjoKKyAgICAgIHNlbGYtPm1heF9jb21iID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2xfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5TCAqc2VsZiA9IEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0wgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01BWF9DT01COgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNlbGYtPm1heF9jb21iKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dyZWVkeV9sX2NsYXNzX2luaXQgKEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5TENsYXNzICoKKyAgICBrbGFzcykKK3sKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzcyAqZGltX2NsYXNzID0gKEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKikga2xhc3M7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgKmRpc21fY2xhc3MgPQorICAgICAgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgKikga2xhc3M7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfbF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2xfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX0NPTUIsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm1heC1jb21iIiwKKyAgICAgICAgICAiTWF4IGNvbWIiLAorICAgICAgICAgICJNYXggQ29tYiIsIDAsIDI1NSwgMTUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykKKyAgICAgICk7CisKKyAgZGltX2NsYXNzLT5maWVsZHNfcmVxdWlyZWQgPSAyOworICBkaW1fY2xhc3MtPm5hbWUgPSAiTW90aW9uIEFkYXB0aXZlOiBTaW1wbGUgRGV0ZWN0aW9uIjsKKyAgZGltX2NsYXNzLT5uaWNrID0gImdyZWVkeWwiOworICBkaW1fY2xhc3MtPmxhdGVuY3kgPSAxOworCisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2F5dXYgPQorICAgICAgZGVpbnRlcmxhY2VfZ3JlZWR5X2ludGVycG9sYXRlX3NjYW5saW5lX29yYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXV5MiA9CisgICAgICBkZWludGVybGFjZV9ncmVlZHlfaW50ZXJwb2xhdGVfc2NhbmxpbmVfb3JjOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV95dnl1ID0KKyAgICAgIGRlaW50ZXJsYWNlX2dyZWVkeV9pbnRlcnBvbGF0ZV9zY2FubGluZV9vcmM7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3V5dnkgPQorICAgICAgZGVpbnRlcmxhY2VfZ3JlZWR5X2ludGVycG9sYXRlX3NjYW5saW5lX29yYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYXJnYiA9CisgICAgICBkZWludGVybGFjZV9ncmVlZHlfaW50ZXJwb2xhdGVfc2NhbmxpbmVfb3JjOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9hYmdyID0KKyAgICAgIGRlaW50ZXJsYWNlX2dyZWVkeV9pbnRlcnBvbGF0ZV9zY2FubGluZV9vcmM7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3JnYmEgPQorICAgICAgZGVpbnRlcmxhY2VfZ3JlZWR5X2ludGVycG9sYXRlX3NjYW5saW5lX29yYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYmdyYSA9CisgICAgICBkZWludGVybGFjZV9ncmVlZHlfaW50ZXJwb2xhdGVfc2NhbmxpbmVfb3JjOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9yZ2IgPQorICAgICAgZGVpbnRlcmxhY2VfZ3JlZWR5X2ludGVycG9sYXRlX3NjYW5saW5lX29yYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYmdyID0KKyAgICAgIGRlaW50ZXJsYWNlX2dyZWVkeV9pbnRlcnBvbGF0ZV9zY2FubGluZV9vcmM7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl95ID0KKyAgICAgIGRlaW50ZXJsYWNlX2dyZWVkeV9pbnRlcnBvbGF0ZV9zY2FubGluZV9vcmM7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl91ID0KKyAgICAgIGRlaW50ZXJsYWNlX2dyZWVkeV9pbnRlcnBvbGF0ZV9zY2FubGluZV9vcmNfcGxhbmFyX3U7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl92ID0KKyAgICAgIGRlaW50ZXJsYWNlX2dyZWVkeV9pbnRlcnBvbGF0ZV9zY2FubGluZV9vcmNfcGxhbmFyX3Y7CisKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9heXV2ID0gZGVpbnRlcmxhY2VfZ3JlZWR5X2NvcHlfc2NhbmxpbmU7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfeXV5MiA9IGRlaW50ZXJsYWNlX2dyZWVkeV9jb3B5X3NjYW5saW5lOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3l2eXUgPSBkZWludGVybGFjZV9ncmVlZHlfY29weV9zY2FubGluZTsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV91eXZ5ID0gZGVpbnRlcmxhY2VfZ3JlZWR5X2NvcHlfc2NhbmxpbmU7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfYXJnYiA9IGRlaW50ZXJsYWNlX2dyZWVkeV9jb3B5X3NjYW5saW5lOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2FiZ3IgPSBkZWludGVybGFjZV9ncmVlZHlfY29weV9zY2FubGluZTsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9yZ2JhID0gZGVpbnRlcmxhY2VfZ3JlZWR5X2NvcHlfc2NhbmxpbmU7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfYmdyYSA9IGRlaW50ZXJsYWNlX2dyZWVkeV9jb3B5X3NjYW5saW5lOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3JnYiA9IGRlaW50ZXJsYWNlX2dyZWVkeV9jb3B5X3NjYW5saW5lOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2JnciA9IGRlaW50ZXJsYWNlX2dyZWVkeV9jb3B5X3NjYW5saW5lOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3BsYW5hcl95ID0gZGVpbnRlcmxhY2VfZ3JlZWR5X2NvcHlfc2NhbmxpbmU7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfcGxhbmFyX3UgPQorICAgICAgZGVpbnRlcmxhY2VfZ3JlZWR5X2NvcHlfc2NhbmxpbmVfcGxhbmFyX3U7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfcGxhbmFyX3YgPQorICAgICAgZGVpbnRlcmxhY2VfZ3JlZWR5X2NvcHlfc2NhbmxpbmVfcGxhbmFyX3Y7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dyZWVkeV9sX2luaXQgKEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5TCAqIHNlbGYpCit7CisgIHNlbGYtPm1heF9jb21iID0gMTU7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWguYXNtIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHloLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWEwM2RmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHloLmFzbQpAQCAtMCwwICsxLDQ3MiBAQAorLyoKKyAqCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMSBUb20gQmFycnkuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4LDIwMTAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWdsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKy8qCisgKiBSZWxpY2Vuc2VkIGZvciBHU3RyZWFtZXIgZnJvbSBHUEwgdG8gTEdQTCB3aXRoIHBlcm1pdCBmcm9tIFRvbSBCYXJyeS4KKyAqIFNlZTogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTYzNTc4CisgKi8KKworCisjaW5jbHVkZSAieDg2LTY0X21hY3Jvcy5pbmMiCisKK3N0YXRpYyB2b2lkCitGVU5DVF9OQU1FX1lVWTIgKEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SCAqc2VsZiwgY29uc3QgZ3VpbnQ4ICogTDEsIGNvbnN0IGd1aW50OCAqIEwyLCBjb25zdCBndWludDggKiBMMywgY29uc3QgZ3VpbnQ4ICogTDJQLCBndWludDggKiBEZXN0LCBnaW50IHdpZHRoKQoreworCisgIC8vIGluIHRpZ2h0IGxvb3Agc29tZSB2YXJzIGFyZSBhY2Nlc3NlZCBmYXN0ZXIgaW4gbG9jYWwgc3RvcmFnZQorICBnaW50NjQgWU1hc2sgPSAweDAwZmYwMGZmMDBmZjAwZmZ1bGw7ICAgICAgICAvLyB0byBrZWVwIG9ubHkgbHVtYQorICBnaW50NjQgVVZNYXNrID0gMHhmZjAwZmYwMGZmMDBmZjAwdWxsOyAgICAgICAvLyB0byBrZWVwIG9ubHkgY2hyb21hCisgIGdpbnQ2NCBTaGlmdE1hc2sgPSAweGZlZmVmZWZlZmVmZWZlZmV1bGw7ICAgIC8vIHRvIGF2b2lkIHNoaWZ0aW5nIGNocm9tYSB0byBsdW1hCisgIGdpbnQ2NCBRVzI1NiA9IDB4MDEwMDAxMDAwMTAwMDEwMHVsbDsgICAgICAgIC8vIDQgMjU2J3MKKyAgZ2ludDY0IE1heENvbWI7CisgIGdpbnQ2NCBNb3Rpb25UaHJlc2hvbGQ7CisgIGdpbnQ2NCBNb3Rpb25TZW5zZTsKKyAgZ2ludDY0IGk7CisgIGdsb25nIExvb3BDdHI7CisgIGdsb25nIG9sZGJ4ID0gMDsKKworICBnaW50NjQgUVcyNTZCOworICBnaW50NjQgTGFzdEF2ZyA9IDA7ICAgICAgICAgIC8vaW50ZXJwIHZhbHVlIGZyb20gbGVmdCBxd29yZAorCisgIC8vIEZJWE1FOiBVc2UgQyBpbXBsZW1lbnRhdGlvbiBpZiB0aGUgd2lkdGggaXMgbm90IGEgbXVsdGlwbGUgb2YgNAorICAvLyBEbyBzb21ldGhpbmcgbW9yZSBvcHRpbWFsIGxhdGVyCisgIGlmICh3aWR0aCAlIDQgIT0gMCkKKyAgICBDX0ZVTkNUX1lVWTIgKHNlbGYsIEwxLCBMMiwgTDMsIEwyUCwgRGVzdCwgd2lkdGgpOworCisgIC8vIFNldCB1cCBvdXIgdHdvIHBhcm1zIHRoYXQgYXJlIGFjdHVhbGx5IGV2YWx1YXRlZCBmb3IgZWFjaCBwaXhlbAorICBpID0gc2VsZi0+bWF4X2NvbWI7CisgIE1heENvbWIgPQorICAgICAgaSA8PCA1NiB8IGkgPDwgNDggfCBpIDw8IDQwIHwgaSA8PCAzMiB8IGkgPDwgMjQgfCBpIDw8IDE2IHwgaSA8PCA4IHwgaTsKKworICBpID0gc2VsZi0+bW90aW9uX3RocmVzaG9sZDsgICAgLy8gc2NhbGUgdG8gcmFuZ2Ugb2YgMC0yNTcKKyAgTW90aW9uVGhyZXNob2xkID0gaSA8PCA0OCB8IGkgPDwgMzIgfCBpIDw8IDE2IHwgaSB8IFVWTWFzazsKKworICBpID0gc2VsZi0+bW90aW9uX3NlbnNlOyAgICAgICAgLy8gc2NhbGUgdG8gcmFuZ2Ugb2YgMC0yNTcKKyAgTW90aW9uU2Vuc2UgPSBpIDw8IDQ4IHwgaSA8PCAzMiB8IGkgPDwgMTYgfCBpOworCisgIGkgPSAweGZmZmZmZmZmIC0gMjU2OworICBRVzI1NkIgPSBpIDw8IDQ4IHwgaSA8PCAzMiB8IGkgPDwgMTYgfCBpOyAgICAgLy8gc2F2ZSBhIGNvdXBsZSBpbnN0ciBvbiBQTUlOU1cgaW5zdHJ1Y3QuCisKKyAgTG9vcEN0ciA9IHdpZHRoIC8gOCAtIDE7ICAgICAgIC8vIHRoZXJlIGFyZSBMaW5lTGVuZ3RoIC8gNCBxd29yZHMgcGVyIGxpbmUgYnV0IGRvIDEgbGVzcywgYWRqIGF0IGVuZCBvZiBsb29wCisKKyAgLy8gRm9yIGVhc2Ugb2YgcmVhZGluZywgdGhlIGNvbW1lbnRzIGJlbG93IGFzc3VtZSB0aGF0IHdlJ3JlIG9wZXJhdGluZyBvbiBhbiBvZGQKKyAgLy8gZmllbGQgKGkuZS4sIHRoYXQgSW5mb0lzT2RkIGlzIHRydWUpLiAgQXNzdW1lIHRoZSBvYnZpb3VzIGZvciBldmVuIGxpbmVzLi4KKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgLy8gc2F2ZSBlYnggKC1mUElDKQorICAgICAgTU9WWCAiICUlIiBYQlggIiwgJVtvbGRieF1cblx0IgorICAgICAgTU9WWCAiICAlW0wxXSwgICAgICAgICAgJSUiIFhBWCAiXG5cdCIKKyAgICAgIExFQVggIiAgOCglJSIgWEFYICIpLCAgICAgJSUiIFhCWCAiXG5cdCIgICAvLyBuZXh0IHF3b3JkIG5lZWRlZCBieSBESlIKKyAgICAgIE1PVlggIiAgJVtMM10sICAgICAgICAgICUlIiBYQ1ggIlxuXHQiCisgICAgICBTVUJYICIgICUlIiBYQVggIiwgICAgICAgICUlIiBYQ1ggIlxuXHQiICAgLy8gY2FycnkgTDMgYWRkciBhcyBhbiBvZmZzZXQKKyAgICAgIE1PVlggIiAgJVtMMlBdLCAgICAgICAgICUlIiBYRFggIlxuXHQiCisgICAgICBNT1ZYICIgICVbTDJdLCAgICAgICAgICAlJSIgWFNJICJcblx0IgorICAgICAgTU9WWCAiICAlW0Rlc3RdLCAgICAgICAgJSUiIFhESSAiXG5cdCIgICAgICAvLyBETDEgaWYgT2RkIG9yIERMMiBpZiBFdmVuCisKKyAgICAgICIuYWxpZ24gOFxuXHQiCisgICAgICAiMTpcblx0IgorICAgICAgIm1vdnEgICglJSIgWFNJICIpLCAgICAgICUlbW0wXG5cdCIgICAgICAgLy8gTDIgLSB0aGUgbmV3ZXN0IHdlYXZlIHBpeGVsIHZhbHVlCisgICAgICAibW92cSAgKCUlIiBYQVggIiksICAgICAgJSVtbTFcblx0IiAgICAgICAvLyBMMSAtIHRoZSB0b3AgcGl4ZWwKKyAgICAgICJtb3ZxICAoJSUiIFhEWCAiKSwgICAgICAlJW1tMlxuXHQiICAgICAgIC8vIEwyUCAtIHRoZSBwcmV2IHdlYXZlIHBpeGVsCisgICAgICAibW92cSAgKCUlIiBYQVggIiwgJSUiIFhDWCAiKSwgJSVtbTNcblx0IiAvLyBMMywgbmV4dCBvZGQgcm93CisgICAgICAibW92cSAgJSVtbTEsICAgICAgICAgICUlbW02XG5cdCIgICAgICAgICAvLyBMMSAtIGdldCBzaW1wbGUgc2luZ2xlIHBpeGVsIGludGVycAorCisgICAgICAvLyAgICAgICAgcGF2Z2IgICBtbTYsIG1tMyAgICAgICAgICAgICAgICAgICAgLy8gdXNlIG1hY3JvIGJlbG93CisgICAgICBWX1BBVkdCICgiJSVtbTYiLCAiJSVtbTMiLCAiJSVtbTQiLCAiJVtTaGlmdE1hc2tdIikKKworICAgICAgLy8gREpSIC0gRGlhZ29uYWwgSmFnZ2llIFJlZHVjdGlvbgorICAgICAgLy8gSW4gdGhlIGV2ZW50IHRoYXQgd2UgYXJlIGdvaW5nIHRvIHVzZSBhbiBhdmVyYWdlIChCb2IpIHBpeGVsIHdlIGRvIG5vdCB3YW50IGEgamFnZ2VkCisgICAgICAvLyBzdGFpciBzdGVwIGVmZmVjdC4gIFRvIGNvbWJhdCB0aGlzIHdlIGF2ZyBpbiB0aGUgMiBob3Jpem9udGFsbHkgYWRqYWNlbiBwaXhlbHMgaW50byB0aGUKKyAgICAgIC8vIGludGVycG9sYXRlZCBCb2IgbWl4LiBUaGlzIHdpbGwgZG8gaG9yaXpvbnRhbCBzbW9vdGhpbmcgZm9yIG9ubHkgdGhlIEJvYidkIHBpeGVscy4KKworICAgICAgIm1vdnEgICVbTGFzdEF2Z10sICAgICAlJW1tNFxuXHQiIC8vIHRoZSBib2IgdmFsdWUgZnJvbSBwcmV2IHF3b3JkIGluIHJvdworICAgICAgIm1vdnEgICUlbW02LCAgICAgICAgICAlW0xhc3RBdmddXG5cdCIgICAgLy8gc2F2ZSBmb3IgbmV4dCBwYXNzCisgICAgICAicHNybHEgJDQ4LCAgICAgICAgICAgICUlbW00XG5cdCIgLy8gcmlnaHQganVzdGlmeSAxIHBpeGVsCisgICAgICAibW92cSAgJSVtbTYsICAgICAgICAgICUlbW03XG5cdCIgLy8gY29weSBvZiBzaW1wbGUgYm9iIHBpeGVsCisgICAgICAicHNsbHEgJDE2LCAgICAgICAgICAgICUlbW03XG5cdCIgLy8gbGVmdCBqdXN0aWZ5IDMgcGl4ZWxzCisgICAgICAicG9yICAgJSVtbTcsICAgICAgICAgICUlbW00XG5cdCIgLy8gYW5kIGNvbWJpbmUKKyAgICAgICJtb3ZxICAoJSUiIFhCWCAiKSwgICAgICAlJW1tNVxuXHQiICAgICAgIC8vIG5leHQgaG9yaXogcXdvcmQgZnJvbSBMMQorICAgICAgLy8gcGF2Z2IgICBtbTUsIHF3b3JkIHB0cltlYngrZWN4XSAvLyBuZXh0IGhvcml6IHF3b3JkIGZyb20gTDMsIHVzZSBtYWNybyBiZWxvdworCisgICAgICBWX1BBVkdCICgiJSVtbTUiLCAiKCUlIiBYQlggIiwlJSIgWENYICIpIiwgIiUlbW03IiwgIiVbU2hpZnRNYXNrXSIpCisgICAgICAicHNsbHEgJDQ4LCAgICAgICAgICAgICUlbW01XG5cdCIgLy8gbGVmdCBqdXN0IDEgcGl4ZWwKKyAgICAgICJtb3ZxICAlJW1tNiwgICAgICAgICAgJSVtbTdcblx0IiAvLyBhbm90aGVyIGNvcHkgb2Ygc2ltcGxlIGJvYiBwaXhlbAorICAgICAgInBzcmxxICQxNiwgICAgICAgICAgICAlJW1tN1xuXHQiIC8vIHJpZ2h0IGp1c3QgMyBwaXhlbHMKKyAgICAgICJwb3IgICAlJW1tNywgICAgICAgICAgJSVtbTVcblx0IiAvLyBjb21iaW5lCisgICAgICAvLyBwYXZnYiAgICAgICAgbW00LCBtbTUgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdmcgb2YgZm9yd2FyZCBhbmQgcHJldiBieSAxIHBpeGVsLCB1c2UgbWFjcm8KKyAgICAgIFZfUEFWR0IgKCIlJW1tNCIsICIlJW1tNSIsICIlJW1tNSIsICIlW1NoaWZ0TWFza10iKSAgICAgICAvLyBtbTUgZ2V0cyBtb2RpZmllZCBpZiBNTVgKKyAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgcGF2Z2IgICAgICAgIG1tNiwgbW00ICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXZnIG9mIGNlbnRlciBhbmQgc3Vycm91bmQgaW50ZXJwIHZhbHMsIHVzZSBtYWNybworICAgICAgVl9QQVZHQiAoIiUlbW02IiwgIiUlbW00IiwgIiUlbW03IiwgIiVbU2hpZnRNYXNrXSIpCisKKyAgICAgIC8vIERvbid0IGRvIGFueSBtb3JlIGF2ZXJhZ2luZyB0aGFuIG5lZWRlZCBmb3IgbW14LiBJdCBodXJ0cyBwZXJmb3JtYW5jZSBhbmQgY2F1c2VzIHJvdW5kaW5nIGVycm9ycy4KKyNpZm5kZWYgSVNfTU1YCisgICAgICAvLyAgICAgICAgICBwYXZnYiAgICAgICAgbW00LCBtbTYgICAgICAgICAgICAgICAgICAgICAgICAvLyAxLzQgY2VudGVyLCAzLzQgYWRqYWNlbnQKKyAgICAgIFZfUEFWR0IgKCIlJW1tNCIsICIlJW1tNiIsICIlJW1tNyIsICIlW1NoaWZ0TWFza10iKQorICAgICAgLy8gICAgICAgICAgICAgICAgICAgIHBhdmdiICAgICAgICBtbTYsIG1tNCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMvOCBjZW50ZXIsIDUvOCBhZGphY2VudAorICAgICAgVl9QQVZHQiAoIiUlbW02IiwgIiUlbW00IiwgIiUlbW03IiwgIiVbU2hpZnRNYXNrXSIpCisjZW5kaWYKKworICAgICAgLy8gZ2V0IGFicyB2YWx1ZSBvZiBwb3NzaWJsZSBMMiBjb21iCisgICAgICAibW92cSAgICAlJW1tNiwgICAgICAgICUlbW00XG5cdCIgLy8gd29yayBjb3B5IG9mIGludGVycCB2YWwKKyAgICAgICJtb3ZxICAgICUlbW0yLCAgICAgICAgJSVtbTdcblx0IiAvLyBMMgorICAgICAgInBzdWJ1c2IgJSVtbTQsICAgICAgICAlJW1tN1xuXHQiIC8vIEwyIC0gYXZnCisgICAgICAibW92cSAgICAlJW1tNCwgICAgICAgICUlbW01XG5cdCIgLy8gYXZnCisgICAgICAicHN1YnVzYiAlJW1tMiwgICAgICAgICUlbW01XG5cdCIgLy8gYXZnIC0gTDIKKyAgICAgICJwb3IgICAgICUlbW03LCAgICAgICAgJSVtbTVcblx0IiAvLyBhYnMoYXZnLUwyKQorCisgICAgICAvLyBnZXQgYWJzIHZhbHVlIG9mIHBvc3NpYmxlIEwyUCBjb21iCisgICAgICAibW92cSAgICAlJW1tMCwgICAgICAgICUlbW03XG5cdCIgLy8gTDJQCisgICAgICAicHN1YnVzYiAlJW1tNCwgICAgICAgICUlbW03XG5cdCIgLy8gTDJQIC0gYXZnCisgICAgICAicHN1YnVzYiAlJW1tMCwgICAgICAgICUlbW00XG5cdCIgLy8gYXZnIC0gTDJQCisgICAgICAicG9yICAgICAlJW1tNywgICAgICAgICUlbW00XG5cdCIgLy8gYWJzKGF2Zy1MMlApCisKKyAgICAgIC8vIHVzZSBMMiBvciBMMlAgZGVwZW5kaW5nIHVwb24gd2hpY2ggbWFrZXMgc21hbGxlciBjb21iCisgICAgICAicHN1YnVzYiAlJW1tNSwgICAgICAgICUlbW00XG5cdCIgLy8gc2VlIGlmIGl0IGdvZXMgdG8gemVybworICAgICAgInBzdWJ1c2IgJSVtbTUsICAgICAgICAlJW1tNVxuXHQiIC8vIDAKKyAgICAgICJwY21wZXFiICUlbW01LCAgICAgICAgJSVtbTRcblx0IiAvLyBpZiAobW00PTApIHRoZW4gRkYgZWxzZSAwCisgICAgICAicGNtcGVxYiAlJW1tNCwgICAgICAgICUlbW01XG5cdCIgLy8gb3Bwb3NpdGUgb2YgbW00CisKKyAgICAgIC8vIGlmIENvbWIoTDJQKSA8PSBDb21iKEwyKSB0aGVuIG1tND1mZiwgbW01PTAgZWxzZSBtbTQ9MCwgbW01ID0gNTUKKyAgICAgICJwYW5kICAgICUlbW0yLCAgICAgICAgJSVtbTVcblx0IiAvLyB1c2UgTDIgaWYgbW01ID09IGZmLCBlbHNlIDAKKyAgICAgICJwYW5kICAgICUlbW0wLCAgICAgICAgJSVtbTRcblx0IiAvLyB1c2UgTDJQIGlmIG1tNCA9IGZmLCBlbHNlIDAKKyAgICAgICJwb3IgICAgICUlbW01LCAgICAgICAgJSVtbTRcblx0IiAvLyBtYXkgdGhlIGJlc3Qgd2luCisKKyAgICAgIC8vIEludmVudG9yeTogYXQgdGhpcyBwb2ludCB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAgICAgLy8gbW0wID0gTDJQIChvciBMMikKKyAgICAgIC8vIG1tMSA9IEwxCisgICAgICAvLyBtbTIgPSBMMiAob3IgTDJQKQorICAgICAgLy8gbW0zID0gTDMKKyAgICAgIC8vIG1tNCA9IHRoZSBiZXN0IG9mIEwyLEwyUCB3ZWF2ZSBwaXhlbCwgYmFzZSB1cG9uIGNvbWIKKyAgICAgIC8vIG1tNiA9IHRoZSBhdmcgaW50ZXJwb2xhdGVkIHZhbHVlLCBpZiB3ZSBuZWVkIHRvIHVzZSBpdAorICAgICAgLy8gTGV0J3MgbWVhc3VyZSBtb3ZlbWVudCwgYXMgaG93IG11Y2ggdGhlIHdlYXZlIHBpeGVsIGhhcyBjaGFuZ2VkCisKKyAgICAgICJtb3ZxICAgICUlbW0yLCAgICAgICAgJSVtbTdcblx0IgorICAgICAgInBzdWJ1c2IgJSVtbTAsICAgICAgICAlJW1tMlxuXHQiCisgICAgICAicHN1YnVzYiAlJW1tNywgICAgICAgICUlbW0wXG5cdCIKKyAgICAgICJwb3IgICAgICUlbW0yLCAgICAgICAgJSVtbTBcblx0IiAgIC8vIGFicyB2YWx1ZSBvZiBjaGFuZ2UsIHVzZWQgbGF0ZXIKKworICAgICAgLy8gTm93IGxldHMgY2xpcCBvdXIgY2hvc2VuIHZhbHVlIHRvIGJlIG5vdCBvdXRzaWRlIG9mIHRoZSByYW5nZQorICAgICAgLy8gb2YgdGhlIGhpZ2gvbG93IHJhbmdlIEwxLUwzIGJ5IG1vcmUgdGhhbiBNYXhDb21iLgorICAgICAgLy8gVGhpcyBhbGxvd3Mgc29tZSBjb21iIGJ1dCBsaW1pdHMgdGhlIGRhbWFnZXMgYW5kIGFsc28gYWxsb3dzIG1vcmUKKyAgICAgIC8vIGRldGFpbCB0aGFuIGEgYm9yaW5nIG92ZXJzbW9vdGhlZCBjbGlwLgorCisgICAgICAibW92cSAgICAlJW1tMSwgICAgICAgICUlbW0yXG5cdCIgLy8gY29weSBMMQorICAgICAgLy8gcG1heHViIG1tMiwgbW0zICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIG1hY3JvCisgICAgICBWX1BNQVhVQiAoIiUlbW0yIiwgIiUlbW0zIikgICAgICAgLy8gbm93ID0gTWF4KEwxLEwzKQorICAgICAgIm1vdnEgICAgJSVtbTEsICAgICAgICAlJW1tNVxuXHQiIC8vIGNvcHkgTDEKKyAgICAgIC8vIHBtaW51YiAgICAgICAgbW01LCBtbTMgICAgICAgICAgICAgICAgICAgIC8vIG5vdyA9IE1pbihMMSxMMyksIHVzZSBtYWNybworICAgICAgVl9QTUlOVUIgKCIlJW1tNSIsICIlJW1tMyIsICIlJW1tNyIpCisKKyAgICAgIC8vIGFsbG93IHRoZSB2YWx1ZSB0byBiZSBhYm92ZSB0aGUgaGlnaCBvciBiZWxvdyB0aGUgbG93IGJ5IGFtdCBvZiBNYXhDb21iCisgICAgICAicHN1YnVzYiAlW01heENvbWJdLCAgICUlbW01XG5cdCIgLy8gbG93ZXIgbWluIGJ5IGRpZmYKKyAgICAgICJwYWRkdXNiICVbTWF4Q29tYl0sICAgJSVtbTJcblx0IiAvLyBpbmNyZWFzZSBtYXggYnkgZGlmZgorICAgICAgLy8gcG1heHViICAgICAgICBtbTQsIG1tNSAgICAgICAgIC8vIG5vdyA9IE1heChiZXN0LE1pbihMMSxMMykgdXNlIG1hY3JvCisgICAgICBWX1BNQVhVQiAoIiUlbW00IiwgIiUlbW01IikKKyAgICAgIC8vIHBtaW51YiAgICAgICAgbW00LCBtbTIgICAgICAgICAvLyBub3cgPSBNaW4oIE1heChiZXN0LCBNaW4oTDEsTDMpLCBMMiApPUwyIGNsaXBwZWQKKyAgICAgIFZfUE1JTlVCICgiJSVtbTQiLCAiJSVtbTIiLCAiJSVtbTciKQorCisgICAgICAvLyBCbGVuZCB3ZWF2ZSBwaXhlbCB3aXRoIGJvYiBwaXhlbCwgZGVwZW5kaW5nIG9uIG1vdGlvbiB2YWwgaW4gbW0wCisgICAgICAicHN1YnVzYiAlW01vdGlvblRocmVzaG9sZF0sICUlbW0wXG5cdCIgICAvLyB0ZXN0IFRocmVzaG9sZCwgY2xlYXIgY2hyb21hIGNoYW5nZQorICAgICAgInBtdWxsdyAgJVtNb3Rpb25TZW5zZV0sICUlbW0wXG5cdCIgICAgICAgLy8gbXVsIGJ5IHVzZXIgZmFjdG9yLCBrZWVwIGxvdyAxNiBiaXRzCisgICAgICAibW92cSAgICAlW1FXMjU2XSwgJSVtbTdcblx0IgorI2lmZGVmIElTX01NWEVYVAorICAgICAgInBtaW5zdyAgJSVtbTcsICAgICAgICAlJW1tMFxuXHQiIC8vIG1heCA9IDI1NgorI2Vsc2UKKyAgICAgICJwYWRkdXN3ICVbUVcyNTZCXSwgICAgJSVtbTBcblx0IiAvLyBhZGQsIG1heSBzYXQgYXQgZmZmLi4KKyAgICAgICJwc3VidXN3ICVbUVcyNTZCXSwgICAgJSVtbTBcblx0IiAvLyBub3cgPSBNaW4oTDEsMjU2KQorI2VuZGlmCisgICAgICAicHN1YnVzdyAlJW1tMCwgICAgICAgICUlbW03XG5cdCIgLy8gc28gdGhlIDIgc3VtIHRvIDI1Niwgd2VpZ2h0ZWQgYXZnCisgICAgICAibW92cSAgICAlJW1tNCwgICAgICAgICUlbW0yXG5cdCIgLy8gc2F2ZSB3ZWF2ZSBjaHJvbWEgaW5mbyBiZWZvcmUgdHJhc2hpbmcKKyAgICAgICJwYW5kICAgICVbWU1hc2tdLCAgICAgJSVtbTRcblx0IiAvLyBrZWVwIG9ubHkgbHVtYSBmcm9tIGNhbGMnZCB2YWx1ZQorICAgICAgInBtdWxsdyAgJSVtbTcsICAgICAgICAlJW1tNFxuXHQiIC8vIHVzZSBtb3JlIHdlYXZlIGZvciBsZXNzIG1vdGlvbgorICAgICAgInBhbmQgICAgJVtZTWFza10sICAgICAlJW1tNlxuXHQiIC8vIGtlZXAgb25seSBsdW1hIGZyb20gY2FsYydkIHZhbHVlCisgICAgICAicG11bGx3ICAlJW1tMCwgICAgICAgICUlbW02XG5cdCIgLy8gdXNlIG1vcmUgYm9iIGZvciBsYXJnZSBtb3Rpb24KKyAgICAgICJwYWRkdXN3ICUlbW02LCAgICAgICAgJSVtbTRcblx0IiAvLyBjb21iaW5lCisgICAgICAicHNybHcgICAkOCwgICAgICAgICAgICUlbW00XG5cdCIgLy8gZGl2IGJ5IDI1NiB0byBnZXQgd2VpZ2h0ZWQgYXZnCisgICAgICAvLyBjaHJvbWEgY29tZXMgZnJvbSB3ZWF2ZSBwaXhlbAorICAgICAgInBhbmQgICAgJVtVVk1hc2tdLCAgICAlJW1tMlxuXHQiIC8vIGtlZXAgY2hyb21hCisgICAgICAicG9yICAgICAlJW1tNCwgICAgICAgICUlbW0yXG5cdCIgLy8gYW5kIGNvbWJpbmUKKyAgICAgIFZfTU9WTlRRICgiKCUlIiBYREkgIikiLCAiJSVtbTIiKSAvLyBtb3ZlIGluIG91ciBjbGlwcGVkIGJlc3QsIHVzZSBtYWNybworICAgICAgLy8gYnVtcCBwdHJzIGFuZCBsb29wCisgICAgICBMRUFYICIgICAgOCglJSIgWEFYICIpLCAgICUlIiBYQVggIlxuXHQiCisgICAgICBMRUFYICIgICAgOCglJSIgWEJYICIpLCAgICUlIiBYQlggIlxuXHQiCisgICAgICBMRUFYICIgICAgOCglJSIgWERYICIpLCAgICUlIiBYRFggIlxuXHQiCisgICAgICBMRUFYICIgICAgOCglJSIgWERJICIpLCAgICUlIiBYREkgIlxuXHQiCisgICAgICBMRUFYICIgICAgOCglJSIgWFNJICIpLCAgICUlIiBYU0kgIlxuXHQiCisgICAgICBERUNYICIgICAgJVtMb29wQ3RyXVxuXHQiCisgICAgICAKKyAgICAgICJqZyAgICAgIDFiXG5cdCIgICAvLyBsb29wIGlmIG5vdCB0byBsYXN0IGxpbmUKKyAgICAgIC8vIG5vdGUgUC1JSUkgZGVmYXVsdCBhc3N1bWVzIGJhY2t3YXJkIGJyYW5jaGVzIHRha2VuCisgICAgICAiamwgICAgICAxZlxuXHQiICAgICAgICAgIC8vIGRvbmUKKyAgICAgIE1PVlggIiAgICAlJSIgWEFYICIsICAgICAgJSUiIFhCWCAiXG5cdCIgIC8vIHNoYXJwbmVzcyBsb29rYWhlYWQgMSBieXRlIG9ubHksIGJlIHdyb25nIG9uIDEKKyAgICAgICJqbXAgICAgIDFiXG5cdCIKKyAgICAgIAorICAgICAgIjE6XG5cdCIgICAgICAKKyAgICAgIE1PVlggIiAlW29sZGJ4XSwgJSUiIFhCWCAiXG5cdCIKKyAgICAgICJlbW1zXG5cdCI6ICAgICAvKiBubyBvdXRwdXRzICovCisKKyAgICAgIDpbTGFzdEF2Z10gIm0iIChMYXN0QXZnKSwKKyAgICAgICBbTDFdICJtIiAoTDEpLAorICAgICAgIFtMM10gIm0iIChMMyksCisgICAgICAgW0wyUF0gIm0iIChMMlApLAorICAgICAgIFtMMl0gIm0iIChMMiksCisgICAgICAgW0Rlc3RdICJtIiAoRGVzdCksCisgICAgICAgW1NoaWZ0TWFza10gIm0iIChTaGlmdE1hc2spLAorICAgICAgIFtNYXhDb21iXSAibSIgKE1heENvbWIpLAorICAgICAgIFtNb3Rpb25UaHJlc2hvbGRdICJtIiAoTW90aW9uVGhyZXNob2xkKSwKKyAgICAgICBbTW90aW9uU2Vuc2VdICJtIiAoTW90aW9uU2Vuc2UpLAorICAgICAgIFtRVzI1NkJdICJtIiAoUVcyNTZCKSwKKyAgICAgICBbWU1hc2tdICJtIiAoWU1hc2spLAorICAgICAgIFtVVk1hc2tdICJtIiAoVVZNYXNrKSwKKyAgICAgICBbTG9vcEN0cl0gIm0iIChMb29wQ3RyKSwKKyAgICAgICBbUVcyNTZdICJtIiAoUVcyNTYpLAorICAgICAgIFtvbGRieF0gIm0iIChvbGRieCkKKyAgICAgIDogWEFYLCBYQ1gsIFhEWCwgWFNJLCBYREksCisgICAgICAic3QiLCAic3QoMSkiLCAic3QoMikiLCAic3QoMykiLCAic3QoNCkiLCAic3QoNSkiLCAic3QoNikiLCAic3QoNykiLAorI2lmZGVmIF9fTU1YX18KKyAgICAgICJtbTAiLCAibW0xIiwgIm1tMiIsICJtbTMiLCAibW00IiwgIm1tNSIsICJtbTYiLCAibW03IiwKKyNlbmRpZgorICAgICAgIm1lbW9yeSIsICJjYyIpOworfQorCitzdGF0aWMgdm9pZAorRlVOQ1RfTkFNRV9VWVZZIChHc3REZWludGVybGFjZU1ldGhvZEdyZWVkeUggKnNlbGYsIGNvbnN0IGd1aW50OCAqIEwxLCBjb25zdCBndWludDggKiBMMiwgY29uc3QgZ3VpbnQ4ICogTDMsIGNvbnN0IGd1aW50OCAqIEwyUCwgZ3VpbnQ4ICogRGVzdCwgZ2ludCB3aWR0aCkKK3sKKworICAvLyBpbiB0aWdodCBsb29wIHNvbWUgdmFycyBhcmUgYWNjZXNzZWQgZmFzdGVyIGluIGxvY2FsIHN0b3JhZ2UKKyAgZ2ludDY0IFlNYXNrID0gMHhmZjAwZmYwMGZmMDBmZjAwdWxsOyAgICAgICAvLyB0byBrZWVwIG9ubHkgbHVtYQorICBnaW50NjQgVVZNYXNrID0gMHgwMGZmMDBmZjAwZmYwMGZmdWxsOyAgICAgICAgLy8gdG8ga2VlcCBvbmx5IGNocm9tYQorICBnaW50NjQgU2hpZnRNYXNrID0gMHhmZWZlZmVmZWZlZmVmZWZldWxsOyAgICAvLyB0byBhdm9pZCBzaGlmdGluZyBjaHJvbWEgdG8gbHVtYQorICBnaW50NjQgUVcyNTYgPSAweDAxMDAwMTAwMDEwMDAxMDB1bGw7ICAgICAgICAvLyA0IDI1NidzCisgIGdpbnQ2NCBNYXhDb21iOworICBnaW50NjQgTW90aW9uVGhyZXNob2xkOworICBnaW50NjQgTW90aW9uU2Vuc2U7CisgIGdpbnQ2NCBpOworICBnbG9uZyBMb29wQ3RyOworICBnbG9uZyBvbGRieCA9IDA7CisKKyAgZ2ludDY0IFFXMjU2QjsKKyAgZ2ludDY0IExhc3RBdmcgPSAwOyAgICAgICAgICAvL2ludGVycCB2YWx1ZSBmcm9tIGxlZnQgcXdvcmQKKworICAvLyBGSVhNRTogVXNlIEMgaW1wbGVtZW50YXRpb24gaWYgdGhlIHdpZHRoIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQKKyAgLy8gRG8gc29tZXRoaW5nIG1vcmUgb3B0aW1hbCBsYXRlcgorICBpZiAod2lkdGggJSA0ICE9IDApCisgICAgQ19GVU5DVF9VWVZZIChzZWxmLCBMMSwgTDIsIEwzLCBMMlAsIERlc3QsIHdpZHRoKTsKKworICAvLyBTZXQgdXAgb3VyIHR3byBwYXJtcyB0aGF0IGFyZSBhY3R1YWxseSBldmFsdWF0ZWQgZm9yIGVhY2ggcGl4ZWwKKyAgaSA9IHNlbGYtPm1heF9jb21iOworICBNYXhDb21iID0KKyAgICAgIGkgPDwgNTYgfCBpIDw8IDQ4IHwgaSA8PCA0MCB8IGkgPDwgMzIgfCBpIDw8IDI0IHwgaSA8PCAxNiB8IGkgPDwgOCB8IGk7CisKKyAgaSA9IHNlbGYtPm1vdGlvbl90aHJlc2hvbGQ7ICAgIC8vIHNjYWxlIHRvIHJhbmdlIG9mIDAtMjU3CisgIE1vdGlvblRocmVzaG9sZCA9IGkgPDwgNDggfCBpIDw8IDMyIHwgaSA8PCAxNiB8IGkgfCBVVk1hc2s7CisKKyAgaSA9IHNlbGYtPm1vdGlvbl9zZW5zZTsgICAgICAgIC8vIHNjYWxlIHRvIHJhbmdlIG9mIDAtMjU3CisgIE1vdGlvblNlbnNlID0gaSA8PCA0OCB8IGkgPDwgMzIgfCBpIDw8IDE2IHwgaTsKKworICBpID0gMHhmZmZmZmZmZiAtIDI1NjsKKyAgUVcyNTZCID0gaSA8PCA0OCB8IGkgPDwgMzIgfCBpIDw8IDE2IHwgaTsgICAgIC8vIHNhdmUgYSBjb3VwbGUgaW5zdHIgb24gUE1JTlNXIGluc3RydWN0LgorCisgIExvb3BDdHIgPSB3aWR0aCAvIDggLSAxOyAgICAgICAvLyB0aGVyZSBhcmUgTGluZUxlbmd0aCAvIDQgcXdvcmRzIHBlciBsaW5lIGJ1dCBkbyAxIGxlc3MsIGFkaiBhdCBlbmQgb2YgbG9vcAorCisgIC8vIEZvciBlYXNlIG9mIHJlYWRpbmcsIHRoZSBjb21tZW50cyBiZWxvdyBhc3N1bWUgdGhhdCB3ZSdyZSBvcGVyYXRpbmcgb24gYW4gb2RkCisgIC8vIGZpZWxkIChpLmUuLCB0aGF0IEluZm9Jc09kZCBpcyB0cnVlKS4gIEFzc3VtZSB0aGUgb2J2aW91cyBmb3IgZXZlbiBsaW5lcy4uCisgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgIC8vIHNhdmUgZWJ4ICgtZlBJQykKKyAgICAgIE1PVlggIiAlJSIgWEJYICIsICVbb2xkYnhdXG5cdCIKKyAgICAgIE1PVlggIiAgJVtMMV0sICAgICAgICAgICUlIiBYQVggIlxuXHQiCisgICAgICBMRUFYICIgIDgoJSUiIFhBWCAiKSwgICAgICUlIiBYQlggIlxuXHQiICAgLy8gbmV4dCBxd29yZCBuZWVkZWQgYnkgREpSCisgICAgICBNT1ZYICIgICVbTDNdLCAgICAgICAgICAlJSIgWENYICJcblx0IgorICAgICAgU1VCWCAiICAlJSIgWEFYICIsICAgICAgICAlJSIgWENYICJcblx0IiAgIC8vIGNhcnJ5IEwzIGFkZHIgYXMgYW4gb2Zmc2V0CisgICAgICBNT1ZYICIgICVbTDJQXSwgICAgICAgICAlJSIgWERYICJcblx0IgorICAgICAgTU9WWCAiICAlW0wyXSwgICAgICAgICAgJSUiIFhTSSAiXG5cdCIKKyAgICAgIE1PVlggIiAgJVtEZXN0XSwgICAgICAgICUlIiBYREkgIlxuXHQiICAgICAgLy8gREwxIGlmIE9kZCBvciBETDIgaWYgRXZlbgorCisgICAgICAiLmFsaWduIDhcblx0IgorICAgICAgIjE6XG5cdCIKKyAgICAgICJtb3ZxICAoJSUiIFhTSSAiKSwgICAgICAlJW1tMFxuXHQiICAgICAgIC8vIEwyIC0gdGhlIG5ld2VzdCB3ZWF2ZSBwaXhlbCB2YWx1ZQorICAgICAgIm1vdnEgICglJSIgWEFYICIpLCAgICAgICUlbW0xXG5cdCIgICAgICAgLy8gTDEgLSB0aGUgdG9wIHBpeGVsCisgICAgICAibW92cSAgKCUlIiBYRFggIiksICAgICAgJSVtbTJcblx0IiAgICAgICAvLyBMMlAgLSB0aGUgcHJldiB3ZWF2ZSBwaXhlbAorICAgICAgIm1vdnEgICglJSIgWEFYICIsICUlIiBYQ1ggIiksICUlbW0zXG5cdCIgLy8gTDMsIG5leHQgb2RkIHJvdworICAgICAgIm1vdnEgICUlbW0xLCAgICAgICAgICAlJW1tNlxuXHQiICAgICAgICAgLy8gTDEgLSBnZXQgc2ltcGxlIHNpbmdsZSBwaXhlbCBpbnRlcnAKKworICAgICAgLy8gICAgICAgIHBhdmdiICAgbW02LCBtbTMgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBtYWNybyBiZWxvdworICAgICAgVl9QQVZHQiAoIiUlbW02IiwgIiUlbW0zIiwgIiUlbW00IiwgIiVbU2hpZnRNYXNrXSIpCisKKyAgICAgIC8vIERKUiAtIERpYWdvbmFsIEphZ2dpZSBSZWR1Y3Rpb24KKyAgICAgIC8vIEluIHRoZSBldmVudCB0aGF0IHdlIGFyZSBnb2luZyB0byB1c2UgYW4gYXZlcmFnZSAoQm9iKSBwaXhlbCB3ZSBkbyBub3Qgd2FudCBhIGphZ2dlZAorICAgICAgLy8gc3RhaXIgc3RlcCBlZmZlY3QuICBUbyBjb21iYXQgdGhpcyB3ZSBhdmcgaW4gdGhlIDIgaG9yaXpvbnRhbGx5IGFkamFjZW4gcGl4ZWxzIGludG8gdGhlCisgICAgICAvLyBpbnRlcnBvbGF0ZWQgQm9iIG1peC4gVGhpcyB3aWxsIGRvIGhvcml6b250YWwgc21vb3RoaW5nIGZvciBvbmx5IHRoZSBCb2InZCBwaXhlbHMuCisKKyAgICAgICJtb3ZxICAlW0xhc3RBdmddLCAgICAgJSVtbTRcblx0IiAvLyB0aGUgYm9iIHZhbHVlIGZyb20gcHJldiBxd29yZCBpbiByb3cKKyAgICAgICJtb3ZxICAlJW1tNiwgICAgICAgICAgJVtMYXN0QXZnXVxuXHQiICAgIC8vIHNhdmUgZm9yIG5leHQgcGFzcworICAgICAgInBzcmxxICQ0OCwgICAgICAgICAgICAlJW1tNFxuXHQiIC8vIHJpZ2h0IGp1c3RpZnkgMSBwaXhlbAorICAgICAgIm1vdnEgICUlbW02LCAgICAgICAgICAlJW1tN1xuXHQiIC8vIGNvcHkgb2Ygc2ltcGxlIGJvYiBwaXhlbAorICAgICAgInBzbGxxICQxNiwgICAgICAgICAgICAlJW1tN1xuXHQiIC8vIGxlZnQganVzdGlmeSAzIHBpeGVscworICAgICAgInBvciAgICUlbW03LCAgICAgICAgICAlJW1tNFxuXHQiIC8vIGFuZCBjb21iaW5lCisgICAgICAibW92cSAgKCUlIiBYQlggIiksICAgICAgJSVtbTVcblx0IiAgICAgICAvLyBuZXh0IGhvcml6IHF3b3JkIGZyb20gTDEKKyAgICAgIC8vIHBhdmdiICAgbW01LCBxd29yZCBwdHJbZWJ4K2VjeF0gLy8gbmV4dCBob3JpeiBxd29yZCBmcm9tIEwzLCB1c2UgbWFjcm8gYmVsb3cKKworICAgICAgVl9QQVZHQiAoIiUlbW01IiwgIiglJSIgWEJYICIsJSUiIFhDWCAiKSIsICIlJW1tNyIsICIlW1NoaWZ0TWFza10iKQorICAgICAgInBzbGxxICQ0OCwgICAgICAgICAgICAlJW1tNVxuXHQiIC8vIGxlZnQganVzdCAxIHBpeGVsCisgICAgICAibW92cSAgJSVtbTYsICAgICAgICAgICUlbW03XG5cdCIgLy8gYW5vdGhlciBjb3B5IG9mIHNpbXBsZSBib2IgcGl4ZWwKKyAgICAgICJwc3JscSAkMTYsICAgICAgICAgICAgJSVtbTdcblx0IiAvLyByaWdodCBqdXN0IDMgcGl4ZWxzCisgICAgICAicG9yICAgJSVtbTcsICAgICAgICAgICUlbW01XG5cdCIgLy8gY29tYmluZQorICAgICAgLy8gcGF2Z2IgICAgICAgIG1tNCwgbW01ICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXZnIG9mIGZvcndhcmQgYW5kIHByZXYgYnkgMSBwaXhlbCwgdXNlIG1hY3JvCisgICAgICBWX1BBVkdCICgiJSVtbTQiLCAiJSVtbTUiLCAiJSVtbTUiLCAiJVtTaGlmdE1hc2tdIikgICAgICAgLy8gbW01IGdldHMgbW9kaWZpZWQgaWYgTU1YCisgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIHBhdmdiICAgICAgICBtbTYsIG1tNCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF2ZyBvZiBjZW50ZXIgYW5kIHN1cnJvdW5kIGludGVycCB2YWxzLCB1c2UgbWFjcm8KKyAgICAgIFZfUEFWR0IgKCIlJW1tNiIsICIlJW1tNCIsICIlJW1tNyIsICIlW1NoaWZ0TWFza10iKQorCisgICAgICAvLyBEb24ndCBkbyBhbnkgbW9yZSBhdmVyYWdpbmcgdGhhbiBuZWVkZWQgZm9yIG1teC4gSXQgaHVydHMgcGVyZm9ybWFuY2UgYW5kIGNhdXNlcyByb3VuZGluZyBlcnJvcnMuCisjaWZuZGVmIElTX01NWAorICAgICAgLy8gICAgICAgICAgcGF2Z2IgICAgICAgIG1tNCwgbW02ICAgICAgICAgICAgICAgICAgICAgICAgLy8gMS80IGNlbnRlciwgMy80IGFkamFjZW50CisgICAgICBWX1BBVkdCICgiJSVtbTQiLCAiJSVtbTYiLCAiJSVtbTciLCAiJVtTaGlmdE1hc2tdIikKKyAgICAgIC8vICAgICAgICAgICAgICAgICAgICBwYXZnYiAgICAgICAgbW02LCBtbTQgICAgICAgICAgICAgICAgICAgICAgICAvLyAzLzggY2VudGVyLCA1LzggYWRqYWNlbnQKKyAgICAgIFZfUEFWR0IgKCIlJW1tNiIsICIlJW1tNCIsICIlJW1tNyIsICIlW1NoaWZ0TWFza10iKQorI2VuZGlmCisKKyAgICAgIC8vIGdldCBhYnMgdmFsdWUgb2YgcG9zc2libGUgTDIgY29tYgorICAgICAgIm1vdnEgICAgJSVtbTYsICAgICAgICAlJW1tNFxuXHQiIC8vIHdvcmsgY29weSBvZiBpbnRlcnAgdmFsCisgICAgICAibW92cSAgICAlJW1tMiwgICAgICAgICUlbW03XG5cdCIgLy8gTDIKKyAgICAgICJwc3VidXNiICUlbW00LCAgICAgICAgJSVtbTdcblx0IiAvLyBMMiAtIGF2ZworICAgICAgIm1vdnEgICAgJSVtbTQsICAgICAgICAlJW1tNVxuXHQiIC8vIGF2ZworICAgICAgInBzdWJ1c2IgJSVtbTIsICAgICAgICAlJW1tNVxuXHQiIC8vIGF2ZyAtIEwyCisgICAgICAicG9yICAgICAlJW1tNywgICAgICAgICUlbW01XG5cdCIgLy8gYWJzKGF2Zy1MMikKKworICAgICAgLy8gZ2V0IGFicyB2YWx1ZSBvZiBwb3NzaWJsZSBMMlAgY29tYgorICAgICAgIm1vdnEgICAgJSVtbTAsICAgICAgICAlJW1tN1xuXHQiIC8vIEwyUAorICAgICAgInBzdWJ1c2IgJSVtbTQsICAgICAgICAlJW1tN1xuXHQiIC8vIEwyUCAtIGF2ZworICAgICAgInBzdWJ1c2IgJSVtbTAsICAgICAgICAlJW1tNFxuXHQiIC8vIGF2ZyAtIEwyUAorICAgICAgInBvciAgICAgJSVtbTcsICAgICAgICAlJW1tNFxuXHQiIC8vIGFicyhhdmctTDJQKQorCisgICAgICAvLyB1c2UgTDIgb3IgTDJQIGRlcGVuZGluZyB1cG9uIHdoaWNoIG1ha2VzIHNtYWxsZXIgY29tYgorICAgICAgInBzdWJ1c2IgJSVtbTUsICAgICAgICAlJW1tNFxuXHQiIC8vIHNlZSBpZiBpdCBnb2VzIHRvIHplcm8KKyAgICAgICJwc3VidXNiICUlbW01LCAgICAgICAgJSVtbTVcblx0IiAvLyAwCisgICAgICAicGNtcGVxYiAlJW1tNSwgICAgICAgICUlbW00XG5cdCIgLy8gaWYgKG1tND0wKSB0aGVuIEZGIGVsc2UgMAorICAgICAgInBjbXBlcWIgJSVtbTQsICAgICAgICAlJW1tNVxuXHQiIC8vIG9wcG9zaXRlIG9mIG1tNAorCisgICAgICAvLyBpZiBDb21iKEwyUCkgPD0gQ29tYihMMikgdGhlbiBtbTQ9ZmYsIG1tNT0wIGVsc2UgbW00PTAsIG1tNSA9IDU1CisgICAgICAicGFuZCAgICAlJW1tMiwgICAgICAgICUlbW01XG5cdCIgLy8gdXNlIEwyIGlmIG1tNSA9PSBmZiwgZWxzZSAwCisgICAgICAicGFuZCAgICAlJW1tMCwgICAgICAgICUlbW00XG5cdCIgLy8gdXNlIEwyUCBpZiBtbTQgPSBmZiwgZWxzZSAwCisgICAgICAicG9yICAgICAlJW1tNSwgICAgICAgICUlbW00XG5cdCIgLy8gbWF5IHRoZSBiZXN0IHdpbgorCisgICAgICAvLyBJbnZlbnRvcnk6IGF0IHRoaXMgcG9pbnQgd2UgaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgICAgIC8vIG1tMCA9IEwyUCAob3IgTDIpCisgICAgICAvLyBtbTEgPSBMMQorICAgICAgLy8gbW0yID0gTDIgKG9yIEwyUCkKKyAgICAgIC8vIG1tMyA9IEwzCisgICAgICAvLyBtbTQgPSB0aGUgYmVzdCBvZiBMMixMMlAgd2VhdmUgcGl4ZWwsIGJhc2UgdXBvbiBjb21iCisgICAgICAvLyBtbTYgPSB0aGUgYXZnIGludGVycG9sYXRlZCB2YWx1ZSwgaWYgd2UgbmVlZCB0byB1c2UgaXQKKyAgICAgIC8vIExldCdzIG1lYXN1cmUgbW92ZW1lbnQsIGFzIGhvdyBtdWNoIHRoZSB3ZWF2ZSBwaXhlbCBoYXMgY2hhbmdlZAorCisgICAgICAibW92cSAgICAlJW1tMiwgICAgICAgICUlbW03XG5cdCIKKyAgICAgICJwc3VidXNiICUlbW0wLCAgICAgICAgJSVtbTJcblx0IgorICAgICAgInBzdWJ1c2IgJSVtbTcsICAgICAgICAlJW1tMFxuXHQiCisgICAgICAicG9yICAgICAlJW1tMiwgICAgICAgICUlbW0wXG5cdCIgICAvLyBhYnMgdmFsdWUgb2YgY2hhbmdlLCB1c2VkIGxhdGVyCisKKyAgICAgIC8vIE5vdyBsZXRzIGNsaXAgb3VyIGNob3NlbiB2YWx1ZSB0byBiZSBub3Qgb3V0c2lkZSBvZiB0aGUgcmFuZ2UKKyAgICAgIC8vIG9mIHRoZSBoaWdoL2xvdyByYW5nZSBMMS1MMyBieSBtb3JlIHRoYW4gTWF4Q29tYi4KKyAgICAgIC8vIFRoaXMgYWxsb3dzIHNvbWUgY29tYiBidXQgbGltaXRzIHRoZSBkYW1hZ2VzIGFuZCBhbHNvIGFsbG93cyBtb3JlCisgICAgICAvLyBkZXRhaWwgdGhhbiBhIGJvcmluZyBvdmVyc21vb3RoZWQgY2xpcC4KKworICAgICAgIm1vdnEgICAgJSVtbTEsICAgICAgICAlJW1tMlxuXHQiIC8vIGNvcHkgTDEKKyAgICAgIC8vIHBtYXh1YiBtbTIsIG1tMyAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBtYWNybworICAgICAgVl9QTUFYVUIgKCIlJW1tMiIsICIlJW1tMyIpICAgICAgIC8vIG5vdyA9IE1heChMMSxMMykKKyAgICAgICJtb3ZxICAgICUlbW0xLCAgICAgICAgJSVtbTVcblx0IiAvLyBjb3B5IEwxCisgICAgICAvLyBwbWludWIgICAgICAgIG1tNSwgbW0zICAgICAgICAgICAgICAgICAgICAvLyBub3cgPSBNaW4oTDEsTDMpLCB1c2UgbWFjcm8KKyAgICAgIFZfUE1JTlVCICgiJSVtbTUiLCAiJSVtbTMiLCAiJSVtbTciKQorCisgICAgICAvLyBhbGxvdyB0aGUgdmFsdWUgdG8gYmUgYWJvdmUgdGhlIGhpZ2ggb3IgYmVsb3cgdGhlIGxvdyBieSBhbXQgb2YgTWF4Q29tYgorICAgICAgInBzdWJ1c2IgJVtNYXhDb21iXSwgICAlJW1tNVxuXHQiIC8vIGxvd2VyIG1pbiBieSBkaWZmCisgICAgICAicGFkZHVzYiAlW01heENvbWJdLCAgICUlbW0yXG5cdCIgLy8gaW5jcmVhc2UgbWF4IGJ5IGRpZmYKKyAgICAgIC8vIHBtYXh1YiAgICAgICAgbW00LCBtbTUgICAgICAgICAvLyBub3cgPSBNYXgoYmVzdCxNaW4oTDEsTDMpIHVzZSBtYWNybworICAgICAgVl9QTUFYVUIgKCIlJW1tNCIsICIlJW1tNSIpCisgICAgICAvLyBwbWludWIgICAgICAgIG1tNCwgbW0yICAgICAgICAgLy8gbm93ID0gTWluKCBNYXgoYmVzdCwgTWluKEwxLEwzKSwgTDIgKT1MMiBjbGlwcGVkCisgICAgICBWX1BNSU5VQiAoIiUlbW00IiwgIiUlbW0yIiwgIiUlbW03IikKKworICAgICAgLy8gQmxlbmQgd2VhdmUgcGl4ZWwgd2l0aCBib2IgcGl4ZWwsIGRlcGVuZGluZyBvbiBtb3Rpb24gdmFsIGluIG1tMAorICAgICAgInBzdWJ1c2IgJVtNb3Rpb25UaHJlc2hvbGRdLCAlJW1tMFxuXHQiICAgLy8gdGVzdCBUaHJlc2hvbGQsIGNsZWFyIGNocm9tYSBjaGFuZ2UKKyAgICAgICJwc3JsdyAgICQ4LCAgICAgICAgICAgJSVtbTBcblx0IiAvLyBkaXYgYnkgMjU2IHRvIGdldCB3ZWlnaHRlZCBhdmcKKyAgICAgICJwbXVsbHcgICVbTW90aW9uU2Vuc2VdLCAlJW1tMFxuXHQiICAgICAgIC8vIG11bCBieSB1c2VyIGZhY3Rvciwga2VlcCBsb3cgMTYgYml0cworICAgICAgIm1vdnEgICAgJVtRVzI1Nl0sICUlbW03XG5cdCIKKyNpZmRlZiBJU19NTVhFWFQKKyAgICAgICJwbWluc3cgICUlbW03LCAgICAgICAgJSVtbTBcblx0IiAvLyBtYXggPSAyNTYKKyNlbHNlCisgICAgICAicGFkZHVzdyAlW1FXMjU2Ql0sICAgICUlbW0wXG5cdCIgLy8gYWRkLCBtYXkgc2F0IGF0IGZmZi4uCisgICAgICAicHN1YnVzdyAlW1FXMjU2Ql0sICAgICUlbW0wXG5cdCIgLy8gbm93ID0gTWluKEwxLDI1NikKKyNlbmRpZgorICAgICAgInBzdWJ1c3cgJSVtbTAsICAgICAgICAlJW1tN1xuXHQiIC8vIHNvIHRoZSAyIHN1bSB0byAyNTYsIHdlaWdodGVkIGF2ZworICAgICAgIm1vdnEgICAgJSVtbTQsICAgICAgICAlJW1tMlxuXHQiIC8vIHNhdmUgd2VhdmUgY2hyb21hIGluZm8gYmVmb3JlIHRyYXNoaW5nCisgICAgICAicGFuZCAgICAlW1lNYXNrXSwgICAgICUlbW00XG5cdCIgLy8ga2VlcCBvbmx5IGx1bWEgZnJvbSBjYWxjJ2QgdmFsdWUKKyAgICAgICJwc3JsdyAgICQ4LCAgICAgICAgICAgJSVtbTRcblx0IiAvLyBkaXYgYnkgMjU2IHRvIGdldCB3ZWlnaHRlZCBhdmcKKyAgICAgICJwbXVsbHcgICUlbW03LCAgICAgICAgJSVtbTRcblx0IiAvLyB1c2UgbW9yZSB3ZWF2ZSBmb3IgbGVzcyBtb3Rpb24KKyAgICAgICJwYW5kICAgICVbWU1hc2tdLCAgICAgJSVtbTZcblx0IiAvLyBrZWVwIG9ubHkgbHVtYSBmcm9tIGNhbGMnZCB2YWx1ZQorICAgICAgInBzcmx3ICAgJDgsICAgICAgICAgICAlJW1tNlxuXHQiIC8vIGRpdiBieSAyNTYgdG8gZ2V0IHdlaWdodGVkIGF2ZworICAgICAgInBtdWxsdyAgJSVtbTAsICAgICAgICAlJW1tNlxuXHQiIC8vIHVzZSBtb3JlIGJvYiBmb3IgbGFyZ2UgbW90aW9uCisgICAgICAicGFkZHVzdyAlJW1tNiwgICAgICAgICUlbW00XG5cdCIgLy8gY29tYmluZQorICAgICAgInBhbmQgICAgJVtZTWFza10sICAgICAlJW1tNFxuXHQiIC8vIGtlZXAgb25seSBsdW1hIGZyb20gY2FsYydkIHZhbHVlCisgICAgICAvLyBjaHJvbWEgY29tZXMgZnJvbSB3ZWF2ZSBwaXhlbAorICAgICAgInBhbmQgICAgJVtVVk1hc2tdLCAgICAlJW1tMlxuXHQiIC8vIGtlZXAgY2hyb21hCisgICAgICAicG9yICAgICAlJW1tNCwgICAgICAgICUlbW0yXG5cdCIgLy8gYW5kIGNvbWJpbmUKKyAgICAgIFZfTU9WTlRRICgiKCUlIiBYREkgIikiLCAiJSVtbTIiKSAvLyBtb3ZlIGluIG91ciBjbGlwcGVkIGJlc3QsIHVzZSBtYWNybworICAgICAgLy8gYnVtcCBwdHJzIGFuZCBsb29wCisgICAgICBMRUFYICIgICAgOCglJSIgWEFYICIpLCAgICUlIiBYQVggIlxuXHQiCisgICAgICBMRUFYICIgICAgOCglJSIgWEJYICIpLCAgICUlIiBYQlggIlxuXHQiCisgICAgICBMRUFYICIgICAgOCglJSIgWERYICIpLCAgICUlIiBYRFggIlxuXHQiCisgICAgICBMRUFYICIgICAgOCglJSIgWERJICIpLCAgICUlIiBYREkgIlxuXHQiCisgICAgICBMRUFYICIgICAgOCglJSIgWFNJICIpLCAgICUlIiBYU0kgIlxuXHQiCisgICAgICBERUNYICIgICAgJVtMb29wQ3RyXVxuXHQiCisgICAgICAKKyAgICAgICJqZyAgICAgIDFiXG5cdCIgICAvLyBsb29wIGlmIG5vdCB0byBsYXN0IGxpbmUKKyAgICAgIC8vIG5vdGUgUC1JSUkgZGVmYXVsdCBhc3N1bWVzIGJhY2t3YXJkIGJyYW5jaGVzIHRha2VuCisgICAgICAiamwgICAgICAxZlxuXHQiICAgICAgICAgIC8vIGRvbmUKKyAgICAgIE1PVlggIiAgICAlJSIgWEFYICIsICAgICAgJSUiIFhCWCAiXG5cdCIgIC8vIHNoYXJwbmVzcyBsb29rYWhlYWQgMSBieXRlIG9ubHksIGJlIHdyb25nIG9uIDEKKyAgICAgICJqbXAgICAgIDFiXG5cdCIKKyAgICAgIAorICAgICAgIjE6XG5cdCIgICAgICAKKyAgICAgIE1PVlggIiAlW29sZGJ4XSwgJSUiIFhCWCAiXG5cdCIKKyAgICAgICJlbW1zXG5cdCI6ICAgICAvKiBubyBvdXRwdXRzICovCisKKyAgICAgIDpbTGFzdEF2Z10gIm0iIChMYXN0QXZnKSwKKyAgICAgICBbTDFdICJtIiAoTDEpLAorICAgICAgIFtMM10gIm0iIChMMyksCisgICAgICAgW0wyUF0gIm0iIChMMlApLAorICAgICAgIFtMMl0gIm0iIChMMiksCisgICAgICAgW0Rlc3RdICJtIiAoRGVzdCksCisgICAgICAgW1NoaWZ0TWFza10gIm0iIChTaGlmdE1hc2spLAorICAgICAgIFtNYXhDb21iXSAibSIgKE1heENvbWIpLAorICAgICAgIFtNb3Rpb25UaHJlc2hvbGRdICJtIiAoTW90aW9uVGhyZXNob2xkKSwKKyAgICAgICBbTW90aW9uU2Vuc2VdICJtIiAoTW90aW9uU2Vuc2UpLAorICAgICAgIFtRVzI1NkJdICJtIiAoUVcyNTZCKSwKKyAgICAgICBbWU1hc2tdICJtIiAoWU1hc2spLAorICAgICAgIFtVVk1hc2tdICJtIiAoVVZNYXNrKSwKKyAgICAgICBbTG9vcEN0cl0gIm0iIChMb29wQ3RyKSwKKyAgICAgICBbUVcyNTZdICJtIiAoUVcyNTYpLAorICAgICAgIFtvbGRieF0gIm0iIChvbGRieCkKKyAgICAgIDogWEFYLCBYQ1gsIFhEWCwgWFNJLCBYREksCisgICAgICAic3QiLCAic3QoMSkiLCAic3QoMikiLCAic3QoMykiLCAic3QoNCkiLCAic3QoNSkiLCAic3QoNikiLCAic3QoNykiLAorI2lmZGVmIF9fTU1YX18KKyAgICAgICJtbTAiLCAibW0xIiwgIm1tMiIsICJtbTMiLCAibW00IiwgIm1tNSIsICJtbTYiLCAibW03IiwKKyNlbmRpZgorICAgICAgIm1lbW9yeSIsICJjYyIpOworfQorCmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWguYyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5Zjc1ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWguYwpAQCAtMCwwICsxLDEwNzYgQEAKKy8qCisgKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgQmlsbHkgQmlnZ3MgPHZla3RvckBkdW1idGVybS5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0Bjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIFJlbGljZW5zZWQgZm9yIEdTdHJlYW1lciBmcm9tIEdQTCB0byBMR1BMIHdpdGggcGVybWl0IGZyb20gQmlsbHkgQmlnZ3MuCisgKiBTZWU6IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTE2MzU3OAorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJncmVlZHlobWFjcm9zLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlICJwbHVnaW5zLmgiCisjaW5jbHVkZSAiZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaCIKKyNpZmRlZiBIQVZFX09SQworI2luY2x1ZGUgPG9yYy9vcmMuaD4KKyNlbmRpZgorCisjZGVmaW5lIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9HUkVFRFlfSAkoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfaF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9HUkVFRFlfSChvYmopCQkoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0gpKQorI2RlZmluZSBHU1RfSVNfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9IX0NMQVNTKGtsYXNzKQkoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9HUkVFRFlfSCkpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0hfR0VUX0NMQVNTKG9iaikJKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0gsIEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SENsYXNzKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9HUkVFRFlfSChvYmopCQkoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0gsIEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SCkpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0hfQ0xBU1Moa2xhc3MpCShHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9ILCBHc3REZWludGVybGFjZU1ldGhvZEdyZWVkeUhDbGFzcykpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0hfQ0FTVChvYmopCSgoR3N0RGVpbnRlcmxhY2VNZXRob2RHcmVlZHlIKikob2JqKSkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2QgcGFyZW50OworCisgIGd1aW50IG1heF9jb21iLCBtb3Rpb25fdGhyZXNob2xkLCBtb3Rpb25fc2Vuc2U7Cit9IEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SDsKKwordHlwZWRlZiB2b2lkICgqU2NhbmxpbmVGdW5jdGlvbikgKEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SCAqIHNlbGYsCisgICAgY29uc3QgZ3VpbnQ4ICogTDIsIGNvbnN0IGd1aW50OCAqIEwxLCBjb25zdCBndWludDggKiBMMywgY29uc3QgZ3VpbnQ4ICogTDJQLAorICAgIGd1aW50OCAqIERlc3QsIGdpbnQgd2lkdGgpOworCit0eXBlZGVmIHN0cnVjdAoreworICBHc3REZWludGVybGFjZU1ldGhvZENsYXNzIHBhcmVudF9jbGFzczsKKyAgU2NhbmxpbmVGdW5jdGlvbiBzY2FubGluZV95dXkyOyAgICAgICAvKiBUaGlzIGlzIGZvciBZVllVIHRvbyAqLworICBTY2FubGluZUZ1bmN0aW9uIHNjYW5saW5lX3V5dnk7CisgIFNjYW5saW5lRnVuY3Rpb24gc2NhbmxpbmVfYXl1djsKKyAgU2NhbmxpbmVGdW5jdGlvbiBzY2FubGluZV9wbGFuYXJfeTsKKyAgU2NhbmxpbmVGdW5jdGlvbiBzY2FubGluZV9wbGFuYXJfdXY7Cit9IEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SENsYXNzOworCitzdGF0aWMgdm9pZAorZ3JlZWR5aF9zY2FubGluZV9DX2F5dXYgKEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SCAqIHNlbGYsIGNvbnN0IGd1aW50OCAqIEwxLAorICAgIGNvbnN0IGd1aW50OCAqIEwyLCBjb25zdCBndWludDggKiBMMywgY29uc3QgZ3VpbnQ4ICogTDJQLCBndWludDggKiBEZXN0LAorICAgIGdpbnQgd2lkdGgpCit7CisgIGdpbnQgUG9zLCBDb21wOworICBndWludDggbDEsIGwxXzEsIGwzLCBsM18xOworICBndWludDggYXZnLCBhdmdfMTsKKyAgZ3VpbnQ4IGF2Z19fMVs0XSA9IHsgMCwgfTsKKyAgZ3VpbnQ4IGF2Z19zOworICBndWludDggYXZnX3NjOworICBndWludDggYmVzdDsKKyAgZ3VpbnQxNiBtb3Y7CisgIGd1aW50OCBvdXQ7CisgIGd1aW50OCBsMiwgbHAyOworICBndWludDggbDJfZGlmZiwgbHAyX2RpZmY7CisgIGd1aW50OCBtaW4sIG1heDsKKyAgZ3VpbnQgbWF4X2NvbWIgPSBzZWxmLT5tYXhfY29tYjsKKyAgZ3VpbnQgbW90aW9uX3NlbnNlID0gc2VsZi0+bW90aW9uX3NlbnNlOworICBndWludCBtb3Rpb25fdGhyZXNob2xkID0gc2VsZi0+bW90aW9uX3RocmVzaG9sZDsKKworICB3aWR0aCAvPSA0OworICBmb3IgKFBvcyA9IDA7IFBvcyA8IHdpZHRoOyBQb3MrKykgeworICAgIGZvciAoQ29tcCA9IDA7IENvbXAgPCA0OyBDb21wKyspIHsKKyAgICAgIGwxID0gTDFbMF07CisgICAgICBsMyA9IEwzWzBdOworCisgICAgICBpZiAoUG9zID09IHdpZHRoIC0gMSkgeworICAgICAgICBsMV8xID0gbDE7CisgICAgICAgIGwzXzEgPSBsMzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGwxXzEgPSBMMVs0XTsKKyAgICAgICAgbDNfMSA9IEwzWzRdOworICAgICAgfQorCisgICAgICAvKiBBdmVyYWdlIG9mIEwxIGFuZCBMMyAqLworICAgICAgYXZnID0gKGwxICsgbDMpIC8gMjsKKworICAgICAgaWYgKFBvcyA9PSAwKSB7CisgICAgICAgIGF2Z19fMVtDb21wXSA9IGF2ZzsKKyAgICAgIH0KKworICAgICAgLyogQXZlcmFnZSBvZiBuZXh0IEwxIGFuZCBuZXh0IEwzICovCisgICAgICBhdmdfMSA9IChsMV8xICsgbDNfMSkgLyAyOworCisgICAgICAvKiBDYWxjdWxhdGUgYXZlcmFnZSBvZiBvbmUgcGl4ZWwgZm9yd2FyZCBhbmQgcHJldmlvdXMgKi8KKyAgICAgIGF2Z19zID0gKGF2Z19fMVtDb21wXSArIGF2Z18xKSAvIDI7CisKKyAgICAgIC8qIENhbGN1bGF0ZSBhdmVyYWdlIG9mIGNlbnRlciBhbmQgc3Vycm91bmRpbmcgcGl4ZWxzICovCisgICAgICBhdmdfc2MgPSAoYXZnICsgYXZnX3MpIC8gMjsKKworICAgICAgLyogbW92ZSBmb3J3YXJkICovCisgICAgICBhdmdfXzFbQ29tcF0gPSBhdmc7CisKKyAgICAgIC8qIEdldCBiZXN0IEwyL0wyUCwgaS5lLiBsZWFzdCBkaWZmIGZyb20gYWJvdmUgYXZlcmFnZSAqLworICAgICAgbDIgPSBMMlswXTsKKyAgICAgIGxwMiA9IEwyUFswXTsKKworICAgICAgbDJfZGlmZiA9IEFCUyAobDIgLSBhdmdfc2MpOworCisgICAgICBscDJfZGlmZiA9IEFCUyAobHAyIC0gYXZnX3NjKTsKKworICAgICAgaWYgKGwyX2RpZmYgPiBscDJfZGlmZikKKyAgICAgICAgYmVzdCA9IGxwMjsKKyAgICAgIGVsc2UKKyAgICAgICAgYmVzdCA9IGwyOworCisgICAgICAvKiBDbGlwIHRoaXMgYmVzdCBMMi9MMlAgYnkgTDEvTDMgYW5kIGFsbG93IHRvIGRpZmZlciBieSBHcmVlZHlNYXhDb21iICovCisgICAgICBtYXggPSBNQVggKGwxLCBsMyk7CisgICAgICBtaW4gPSBNSU4gKGwxLCBsMyk7CisKKyAgICAgIGlmIChtYXggPCAyNTYgLSBtYXhfY29tYikKKyAgICAgICAgbWF4ICs9IG1heF9jb21iOworICAgICAgZWxzZQorICAgICAgICBtYXggPSAyNTU7CisKKyAgICAgIGlmIChtaW4gPiBtYXhfY29tYikKKyAgICAgICAgbWluIC09IG1heF9jb21iOworICAgICAgZWxzZQorICAgICAgICBtaW4gPSAwOworCisgICAgICBvdXQgPSBDTEFNUCAoYmVzdCwgbWluLCBtYXgpOworCisgICAgICBpZiAoQ29tcCA8IDIpIHsKKyAgICAgICAgLyogRG8gbW90aW9uIGNvbXBlbnNhdGlvbiBmb3IgbHVtYSwgaS5lLiBob3cgbXVjaAorICAgICAgICAgKiB0aGUgd2VhdmUgcGl4ZWwgZGlmZmVycyAqLworICAgICAgICBtb3YgPSBBQlMgKGwyIC0gbHAyKTsKKyAgICAgICAgaWYgKG1vdiA+IG1vdGlvbl90aHJlc2hvbGQpCisgICAgICAgICAgbW92IC09IG1vdGlvbl90aHJlc2hvbGQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtb3YgPSAwOworCisgICAgICAgIG1vdiA9IG1vdiAqIG1vdGlvbl9zZW5zZTsKKyAgICAgICAgaWYgKG1vdiA+IDI1NikKKyAgICAgICAgICBtb3YgPSAyNTY7CisKKyAgICAgICAgLyogV2VpZ2h0ZWQgc3VtIG9uIGNsaXBwZWQgd2VhdmUgcGl4ZWwgYW5kIGF2ZXJhZ2UgKi8KKyAgICAgICAgb3V0ID0gKG91dCAqICgyNTYgLSBtb3YpICsgYXZnX3NjICogbW92KSAvIDI1NjsKKyAgICAgIH0KKworICAgICAgRGVzdFswXSA9IG91dDsKKworICAgICAgRGVzdCArPSAxOworICAgICAgTDEgKz0gMTsKKyAgICAgIEwyICs9IDE7CisgICAgICBMMyArPSAxOworICAgICAgTDJQICs9IDE7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitncmVlZHloX3NjYW5saW5lX0NfeXV5MiAoR3N0RGVpbnRlcmxhY2VNZXRob2RHcmVlZHlIICogc2VsZiwgY29uc3QgZ3VpbnQ4ICogTDEsCisgICAgY29uc3QgZ3VpbnQ4ICogTDIsIGNvbnN0IGd1aW50OCAqIEwzLCBjb25zdCBndWludDggKiBMMlAsIGd1aW50OCAqIERlc3QsCisgICAgZ2ludCB3aWR0aCkKK3sKKyAgZ2ludCBQb3M7CisgIGd1aW50OCBsMV9sLCBsMV8xX2wsIGwzX2wsIGwzXzFfbDsKKyAgZ3VpbnQ4IGwxX2MsIGwxXzFfYywgbDNfYywgbDNfMV9jOworICBndWludDggYXZnX2wsIGF2Z19jLCBhdmdfbF8xLCBhdmdfY18xOworICBndWludDggYXZnX2xfXzEgPSAwLCBhdmdfY19fMSA9IDA7CisgIGd1aW50OCBhdmdfc19sLCBhdmdfc19jOworICBndWludDggYXZnX3NjX2wsIGF2Z19zY19jOworICBndWludDggYmVzdF9sLCBiZXN0X2M7CisgIGd1aW50MTYgbW92X2w7CisgIGd1aW50OCBvdXRfbCwgb3V0X2M7CisgIGd1aW50OCBsMl9sLCBsMl9jLCBscDJfbCwgbHAyX2M7CisgIGd1aW50OCBsMl9sX2RpZmYsIGwyX2NfZGlmZiwgbHAyX2xfZGlmZiwgbHAyX2NfZGlmZjsKKyAgZ3VpbnQ4IG1pbl9sLCBtaW5fYywgbWF4X2wsIG1heF9jOworICBndWludCBtYXhfY29tYiA9IHNlbGYtPm1heF9jb21iOworICBndWludCBtb3Rpb25fc2Vuc2UgPSBzZWxmLT5tb3Rpb25fc2Vuc2U7CisgIGd1aW50IG1vdGlvbl90aHJlc2hvbGQgPSBzZWxmLT5tb3Rpb25fdGhyZXNob2xkOworCisgIHdpZHRoIC89IDI7CisgIGZvciAoUG9zID0gMDsgUG9zIDwgd2lkdGg7IFBvcysrKSB7CisgICAgbDFfbCA9IEwxWzBdOworICAgIGwxX2MgPSBMMVsxXTsKKyAgICBsM19sID0gTDNbMF07CisgICAgbDNfYyA9IEwzWzFdOworCisgICAgaWYgKFBvcyA9PSB3aWR0aCAtIDEpIHsKKyAgICAgIGwxXzFfbCA9IGwxX2w7CisgICAgICBsMV8xX2MgPSBsMV9jOworICAgICAgbDNfMV9sID0gbDNfbDsKKyAgICAgIGwzXzFfYyA9IGwzX2M7CisgICAgfSBlbHNlIHsKKyAgICAgIGwxXzFfbCA9IEwxWzJdOworICAgICAgbDFfMV9jID0gTDFbM107CisgICAgICBsM18xX2wgPSBMM1syXTsKKyAgICAgIGwzXzFfYyA9IEwzWzNdOworICAgIH0KKworICAgIC8qIEF2ZXJhZ2Ugb2YgTDEgYW5kIEwzICovCisgICAgYXZnX2wgPSAobDFfbCArIGwzX2wpIC8gMjsKKyAgICBhdmdfYyA9IChsMV9jICsgbDNfYykgLyAyOworCisgICAgaWYgKFBvcyA9PSAwKSB7CisgICAgICBhdmdfbF9fMSA9IGF2Z19sOworICAgICAgYXZnX2NfXzEgPSBhdmdfYzsKKyAgICB9CisKKyAgICAvKiBBdmVyYWdlIG9mIG5leHQgTDEgYW5kIG5leHQgTDMgKi8KKyAgICBhdmdfbF8xID0gKGwxXzFfbCArIGwzXzFfbCkgLyAyOworICAgIGF2Z19jXzEgPSAobDFfMV9jICsgbDNfMV9jKSAvIDI7CisKKyAgICAvKiBDYWxjdWxhdGUgYXZlcmFnZSBvZiBvbmUgcGl4ZWwgZm9yd2FyZCBhbmQgcHJldmlvdXMgKi8KKyAgICBhdmdfc19sID0gKGF2Z19sX18xICsgYXZnX2xfMSkgLyAyOworICAgIGF2Z19zX2MgPSAoYXZnX2NfXzEgKyBhdmdfY18xKSAvIDI7CisKKyAgICAvKiBDYWxjdWxhdGUgYXZlcmFnZSBvZiBjZW50ZXIgYW5kIHN1cnJvdW5kaW5nIHBpeGVscyAqLworICAgIGF2Z19zY19sID0gKGF2Z19sICsgYXZnX3NfbCkgLyAyOworICAgIGF2Z19zY19jID0gKGF2Z19jICsgYXZnX3NfYykgLyAyOworCisgICAgLyogbW92ZSBmb3J3YXJkICovCisgICAgYXZnX2xfXzEgPSBhdmdfbDsKKyAgICBhdmdfY19fMSA9IGF2Z19jOworCisgICAgLyogR2V0IGJlc3QgTDIvTDJQLCBpLmUuIGxlYXN0IGRpZmYgZnJvbSBhYm92ZSBhdmVyYWdlICovCisgICAgbDJfbCA9IEwyWzBdOworICAgIGwyX2MgPSBMMlsxXTsKKyAgICBscDJfbCA9IEwyUFswXTsKKyAgICBscDJfYyA9IEwyUFsxXTsKKworICAgIGwyX2xfZGlmZiA9IEFCUyAobDJfbCAtIGF2Z19zY19sKTsKKyAgICBsMl9jX2RpZmYgPSBBQlMgKGwyX2MgLSBhdmdfc2NfYyk7CisKKyAgICBscDJfbF9kaWZmID0gQUJTIChscDJfbCAtIGF2Z19zY19sKTsKKyAgICBscDJfY19kaWZmID0gQUJTIChscDJfYyAtIGF2Z19zY19jKTsKKworICAgIGlmIChsMl9sX2RpZmYgPiBscDJfbF9kaWZmKQorICAgICAgYmVzdF9sID0gbHAyX2w7CisgICAgZWxzZQorICAgICAgYmVzdF9sID0gbDJfbDsKKworICAgIGlmIChsMl9jX2RpZmYgPiBscDJfY19kaWZmKQorICAgICAgYmVzdF9jID0gbHAyX2M7CisgICAgZWxzZQorICAgICAgYmVzdF9jID0gbDJfYzsKKworICAgIC8qIENsaXAgdGhpcyBiZXN0IEwyL0wyUCBieSBMMS9MMyBhbmQgYWxsb3cgdG8gZGlmZmVyIGJ5IEdyZWVkeU1heENvbWIgKi8KKyAgICBtYXhfbCA9IE1BWCAobDFfbCwgbDNfbCk7CisgICAgbWluX2wgPSBNSU4gKGwxX2wsIGwzX2wpOworCisgICAgaWYgKG1heF9sIDwgMjU2IC0gbWF4X2NvbWIpCisgICAgICBtYXhfbCArPSBtYXhfY29tYjsKKyAgICBlbHNlCisgICAgICBtYXhfbCA9IDI1NTsKKworICAgIGlmIChtaW5fbCA+IG1heF9jb21iKQorICAgICAgbWluX2wgLT0gbWF4X2NvbWI7CisgICAgZWxzZQorICAgICAgbWluX2wgPSAwOworCisgICAgbWF4X2MgPSBNQVggKGwxX2MsIGwzX2MpOworICAgIG1pbl9jID0gTUlOIChsMV9jLCBsM19jKTsKKworICAgIGlmIChtYXhfYyA8IDI1NiAtIG1heF9jb21iKQorICAgICAgbWF4X2MgKz0gbWF4X2NvbWI7CisgICAgZWxzZQorICAgICAgbWF4X2MgPSAyNTU7CisKKyAgICBpZiAobWluX2MgPiBtYXhfY29tYikKKyAgICAgIG1pbl9jIC09IG1heF9jb21iOworICAgIGVsc2UKKyAgICAgIG1pbl9jID0gMDsKKworICAgIG91dF9sID0gQ0xBTVAgKGJlc3RfbCwgbWluX2wsIG1heF9sKTsKKyAgICBvdXRfYyA9IENMQU1QIChiZXN0X2MsIG1pbl9jLCBtYXhfYyk7CisKKyAgICAvKiBEbyBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBsdW1hLCBpLmUuIGhvdyBtdWNoCisgICAgICogdGhlIHdlYXZlIHBpeGVsIGRpZmZlcnMgKi8KKyAgICBtb3ZfbCA9IEFCUyAobDJfbCAtIGxwMl9sKTsKKyAgICBpZiAobW92X2wgPiBtb3Rpb25fdGhyZXNob2xkKQorICAgICAgbW92X2wgLT0gbW90aW9uX3RocmVzaG9sZDsKKyAgICBlbHNlCisgICAgICBtb3ZfbCA9IDA7CisKKyAgICBtb3ZfbCA9IG1vdl9sICogbW90aW9uX3NlbnNlOworICAgIGlmIChtb3ZfbCA+IDI1NikKKyAgICAgIG1vdl9sID0gMjU2OworCisgICAgLyogV2VpZ2h0ZWQgc3VtIG9uIGNsaXBwZWQgd2VhdmUgcGl4ZWwgYW5kIGF2ZXJhZ2UgKi8KKyAgICBvdXRfbCA9IChvdXRfbCAqICgyNTYgLSBtb3ZfbCkgKyBhdmdfc2NfbCAqIG1vdl9sKSAvIDI1NjsKKworICAgIERlc3RbMF0gPSBvdXRfbDsKKyAgICBEZXN0WzFdID0gb3V0X2M7CisKKyAgICBEZXN0ICs9IDI7CisgICAgTDEgKz0gMjsKKyAgICBMMiArPSAyOworICAgIEwzICs9IDI7CisgICAgTDJQICs9IDI7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dyZWVkeWhfc2NhbmxpbmVfQ191eXZ5IChHc3REZWludGVybGFjZU1ldGhvZEdyZWVkeUggKiBzZWxmLCBjb25zdCBndWludDggKiBMMSwKKyAgICBjb25zdCBndWludDggKiBMMiwgY29uc3QgZ3VpbnQ4ICogTDMsIGNvbnN0IGd1aW50OCAqIEwyUCwgZ3VpbnQ4ICogRGVzdCwKKyAgICBnaW50IHdpZHRoKQoreworICBnaW50IFBvczsKKyAgZ3VpbnQ4IGwxX2wsIGwxXzFfbCwgbDNfbCwgbDNfMV9sOworICBndWludDggbDFfYywgbDFfMV9jLCBsM19jLCBsM18xX2M7CisgIGd1aW50OCBhdmdfbCwgYXZnX2MsIGF2Z19sXzEsIGF2Z19jXzE7CisgIGd1aW50OCBhdmdfbF9fMSA9IDAsIGF2Z19jX18xID0gMDsKKyAgZ3VpbnQ4IGF2Z19zX2wsIGF2Z19zX2M7CisgIGd1aW50OCBhdmdfc2NfbCwgYXZnX3NjX2M7CisgIGd1aW50OCBiZXN0X2wsIGJlc3RfYzsKKyAgZ3VpbnQxNiBtb3ZfbDsKKyAgZ3VpbnQ4IG91dF9sLCBvdXRfYzsKKyAgZ3VpbnQ4IGwyX2wsIGwyX2MsIGxwMl9sLCBscDJfYzsKKyAgZ3VpbnQ4IGwyX2xfZGlmZiwgbDJfY19kaWZmLCBscDJfbF9kaWZmLCBscDJfY19kaWZmOworICBndWludDggbWluX2wsIG1pbl9jLCBtYXhfbCwgbWF4X2M7CisgIGd1aW50IG1heF9jb21iID0gc2VsZi0+bWF4X2NvbWI7CisgIGd1aW50IG1vdGlvbl9zZW5zZSA9IHNlbGYtPm1vdGlvbl9zZW5zZTsKKyAgZ3VpbnQgbW90aW9uX3RocmVzaG9sZCA9IHNlbGYtPm1vdGlvbl90aHJlc2hvbGQ7CisKKyAgd2lkdGggLz0gMjsKKyAgZm9yIChQb3MgPSAwOyBQb3MgPCB3aWR0aDsgUG9zKyspIHsKKyAgICBsMV9sID0gTDFbMV07CisgICAgbDFfYyA9IEwxWzBdOworICAgIGwzX2wgPSBMM1sxXTsKKyAgICBsM19jID0gTDNbMF07CisKKyAgICBpZiAoUG9zID09IHdpZHRoIC0gMSkgeworICAgICAgbDFfMV9sID0gbDFfbDsKKyAgICAgIGwxXzFfYyA9IGwxX2M7CisgICAgICBsM18xX2wgPSBsM19sOworICAgICAgbDNfMV9jID0gbDNfYzsKKyAgICB9IGVsc2UgeworICAgICAgbDFfMV9sID0gTDFbM107CisgICAgICBsMV8xX2MgPSBMMVsyXTsKKyAgICAgIGwzXzFfbCA9IEwzWzNdOworICAgICAgbDNfMV9jID0gTDNbMl07CisgICAgfQorCisgICAgLyogQXZlcmFnZSBvZiBMMSBhbmQgTDMgKi8KKyAgICBhdmdfbCA9IChsMV9sICsgbDNfbCkgLyAyOworICAgIGF2Z19jID0gKGwxX2MgKyBsM19jKSAvIDI7CisKKyAgICBpZiAoUG9zID09IDApIHsKKyAgICAgIGF2Z19sX18xID0gYXZnX2w7CisgICAgICBhdmdfY19fMSA9IGF2Z19jOworICAgIH0KKworICAgIC8qIEF2ZXJhZ2Ugb2YgbmV4dCBMMSBhbmQgbmV4dCBMMyAqLworICAgIGF2Z19sXzEgPSAobDFfMV9sICsgbDNfMV9sKSAvIDI7CisgICAgYXZnX2NfMSA9IChsMV8xX2MgKyBsM18xX2MpIC8gMjsKKworICAgIC8qIENhbGN1bGF0ZSBhdmVyYWdlIG9mIG9uZSBwaXhlbCBmb3J3YXJkIGFuZCBwcmV2aW91cyAqLworICAgIGF2Z19zX2wgPSAoYXZnX2xfXzEgKyBhdmdfbF8xKSAvIDI7CisgICAgYXZnX3NfYyA9IChhdmdfY19fMSArIGF2Z19jXzEpIC8gMjsKKworICAgIC8qIENhbGN1bGF0ZSBhdmVyYWdlIG9mIGNlbnRlciBhbmQgc3Vycm91bmRpbmcgcGl4ZWxzICovCisgICAgYXZnX3NjX2wgPSAoYXZnX2wgKyBhdmdfc19sKSAvIDI7CisgICAgYXZnX3NjX2MgPSAoYXZnX2MgKyBhdmdfc19jKSAvIDI7CisKKyAgICAvKiBtb3ZlIGZvcndhcmQgKi8KKyAgICBhdmdfbF9fMSA9IGF2Z19sOworICAgIGF2Z19jX18xID0gYXZnX2M7CisKKyAgICAvKiBHZXQgYmVzdCBMMi9MMlAsIGkuZS4gbGVhc3QgZGlmZiBmcm9tIGFib3ZlIGF2ZXJhZ2UgKi8KKyAgICBsMl9sID0gTDJbMV07CisgICAgbDJfYyA9IEwyWzBdOworICAgIGxwMl9sID0gTDJQWzFdOworICAgIGxwMl9jID0gTDJQWzBdOworCisgICAgbDJfbF9kaWZmID0gQUJTIChsMl9sIC0gYXZnX3NjX2wpOworICAgIGwyX2NfZGlmZiA9IEFCUyAobDJfYyAtIGF2Z19zY19jKTsKKworICAgIGxwMl9sX2RpZmYgPSBBQlMgKGxwMl9sIC0gYXZnX3NjX2wpOworICAgIGxwMl9jX2RpZmYgPSBBQlMgKGxwMl9jIC0gYXZnX3NjX2MpOworCisgICAgaWYgKGwyX2xfZGlmZiA+IGxwMl9sX2RpZmYpCisgICAgICBiZXN0X2wgPSBscDJfbDsKKyAgICBlbHNlCisgICAgICBiZXN0X2wgPSBsMl9sOworCisgICAgaWYgKGwyX2NfZGlmZiA+IGxwMl9jX2RpZmYpCisgICAgICBiZXN0X2MgPSBscDJfYzsKKyAgICBlbHNlCisgICAgICBiZXN0X2MgPSBsMl9jOworCisgICAgLyogQ2xpcCB0aGlzIGJlc3QgTDIvTDJQIGJ5IEwxL0wzIGFuZCBhbGxvdyB0byBkaWZmZXIgYnkgR3JlZWR5TWF4Q29tYiAqLworICAgIG1heF9sID0gTUFYIChsMV9sLCBsM19sKTsKKyAgICBtaW5fbCA9IE1JTiAobDFfbCwgbDNfbCk7CisKKyAgICBpZiAobWF4X2wgPCAyNTYgLSBtYXhfY29tYikKKyAgICAgIG1heF9sICs9IG1heF9jb21iOworICAgIGVsc2UKKyAgICAgIG1heF9sID0gMjU1OworCisgICAgaWYgKG1pbl9sID4gbWF4X2NvbWIpCisgICAgICBtaW5fbCAtPSBtYXhfY29tYjsKKyAgICBlbHNlCisgICAgICBtaW5fbCA9IDA7CisKKyAgICBtYXhfYyA9IE1BWCAobDFfYywgbDNfYyk7CisgICAgbWluX2MgPSBNSU4gKGwxX2MsIGwzX2MpOworCisgICAgaWYgKG1heF9jIDwgMjU2IC0gbWF4X2NvbWIpCisgICAgICBtYXhfYyArPSBtYXhfY29tYjsKKyAgICBlbHNlCisgICAgICBtYXhfYyA9IDI1NTsKKworICAgIGlmIChtaW5fYyA+IG1heF9jb21iKQorICAgICAgbWluX2MgLT0gbWF4X2NvbWI7CisgICAgZWxzZQorICAgICAgbWluX2MgPSAwOworCisgICAgb3V0X2wgPSBDTEFNUCAoYmVzdF9sLCBtaW5fbCwgbWF4X2wpOworICAgIG91dF9jID0gQ0xBTVAgKGJlc3RfYywgbWluX2MsIG1heF9jKTsKKworICAgIC8qIERvIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIGx1bWEsIGkuZS4gaG93IG11Y2gKKyAgICAgKiB0aGUgd2VhdmUgcGl4ZWwgZGlmZmVycyAqLworICAgIG1vdl9sID0gQUJTIChsMl9sIC0gbHAyX2wpOworICAgIGlmIChtb3ZfbCA+IG1vdGlvbl90aHJlc2hvbGQpCisgICAgICBtb3ZfbCAtPSBtb3Rpb25fdGhyZXNob2xkOworICAgIGVsc2UKKyAgICAgIG1vdl9sID0gMDsKKworICAgIG1vdl9sID0gbW92X2wgKiBtb3Rpb25fc2Vuc2U7CisgICAgaWYgKG1vdl9sID4gMjU2KQorICAgICAgbW92X2wgPSAyNTY7CisKKyAgICAvKiBXZWlnaHRlZCBzdW0gb24gY2xpcHBlZCB3ZWF2ZSBwaXhlbCBhbmQgYXZlcmFnZSAqLworICAgIG91dF9sID0gKG91dF9sICogKDI1NiAtIG1vdl9sKSArIGF2Z19zY19sICogbW92X2wpIC8gMjU2OworCisgICAgRGVzdFsxXSA9IG91dF9sOworICAgIERlc3RbMF0gPSBvdXRfYzsKKworICAgIERlc3QgKz0gMjsKKyAgICBMMSArPSAyOworICAgIEwyICs9IDI7CisgICAgTDMgKz0gMjsKKyAgICBMMlAgKz0gMjsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3JlZWR5aF9zY2FubGluZV9DX3BsYW5hcl95IChHc3REZWludGVybGFjZU1ldGhvZEdyZWVkeUggKiBzZWxmLAorICAgIGNvbnN0IGd1aW50OCAqIEwxLCBjb25zdCBndWludDggKiBMMiwgY29uc3QgZ3VpbnQ4ICogTDMsIGNvbnN0IGd1aW50OCAqIEwyUCwKKyAgICBndWludDggKiBEZXN0LCBnaW50IHdpZHRoKQoreworICBnaW50IFBvczsKKyAgZ3VpbnQ4IGwxLCBsMV8xLCBsMywgbDNfMTsKKyAgZ3VpbnQ4IGF2ZywgYXZnXzE7CisgIGd1aW50OCBhdmdfXzEgPSAwOworICBndWludDggYXZnX3M7CisgIGd1aW50OCBhdmdfc2M7CisgIGd1aW50OCBiZXN0OworICBndWludDE2IG1vdjsKKyAgZ3VpbnQ4IG91dDsKKyAgZ3VpbnQ4IGwyLCBscDI7CisgIGd1aW50OCBsMl9kaWZmLCBscDJfZGlmZjsKKyAgZ3VpbnQ4IG1pbiwgbWF4OworICBndWludCBtYXhfY29tYiA9IHNlbGYtPm1heF9jb21iOworICBndWludCBtb3Rpb25fc2Vuc2UgPSBzZWxmLT5tb3Rpb25fc2Vuc2U7CisgIGd1aW50IG1vdGlvbl90aHJlc2hvbGQgPSBzZWxmLT5tb3Rpb25fdGhyZXNob2xkOworCisgIGZvciAoUG9zID0gMDsgUG9zIDwgd2lkdGg7IFBvcysrKSB7CisgICAgbDEgPSBMMVswXTsKKyAgICBsMyA9IEwzWzBdOworCisgICAgaWYgKFBvcyA9PSB3aWR0aCAtIDEpIHsKKyAgICAgIGwxXzEgPSBsMTsKKyAgICAgIGwzXzEgPSBsMzsKKyAgICB9IGVsc2UgeworICAgICAgbDFfMSA9IEwxWzFdOworICAgICAgbDNfMSA9IEwzWzFdOworICAgIH0KKworICAgIC8qIEF2ZXJhZ2Ugb2YgTDEgYW5kIEwzICovCisgICAgYXZnID0gKGwxICsgbDMpIC8gMjsKKworICAgIGlmIChQb3MgPT0gMCkgeworICAgICAgYXZnX18xID0gYXZnOworICAgIH0KKworICAgIC8qIEF2ZXJhZ2Ugb2YgbmV4dCBMMSBhbmQgbmV4dCBMMyAqLworICAgIGF2Z18xID0gKGwxXzEgKyBsM18xKSAvIDI7CisKKyAgICAvKiBDYWxjdWxhdGUgYXZlcmFnZSBvZiBvbmUgcGl4ZWwgZm9yd2FyZCBhbmQgcHJldmlvdXMgKi8KKyAgICBhdmdfcyA9IChhdmdfXzEgKyBhdmdfMSkgLyAyOworCisgICAgLyogQ2FsY3VsYXRlIGF2ZXJhZ2Ugb2YgY2VudGVyIGFuZCBzdXJyb3VuZGluZyBwaXhlbHMgKi8KKyAgICBhdmdfc2MgPSAoYXZnICsgYXZnX3MpIC8gMjsKKworICAgIC8qIG1vdmUgZm9yd2FyZCAqLworICAgIGF2Z19fMSA9IGF2ZzsKKworICAgIC8qIEdldCBiZXN0IEwyL0wyUCwgaS5lLiBsZWFzdCBkaWZmIGZyb20gYWJvdmUgYXZlcmFnZSAqLworICAgIGwyID0gTDJbMF07CisgICAgbHAyID0gTDJQWzBdOworCisgICAgbDJfZGlmZiA9IEFCUyAobDIgLSBhdmdfc2MpOworCisgICAgbHAyX2RpZmYgPSBBQlMgKGxwMiAtIGF2Z19zYyk7CisKKyAgICBpZiAobDJfZGlmZiA+IGxwMl9kaWZmKQorICAgICAgYmVzdCA9IGxwMjsKKyAgICBlbHNlCisgICAgICBiZXN0ID0gbDI7CisKKyAgICAvKiBDbGlwIHRoaXMgYmVzdCBMMi9MMlAgYnkgTDEvTDMgYW5kIGFsbG93IHRvIGRpZmZlciBieSBHcmVlZHlNYXhDb21iICovCisgICAgbWF4ID0gTUFYIChsMSwgbDMpOworICAgIG1pbiA9IE1JTiAobDEsIGwzKTsKKworICAgIGlmIChtYXggPCAyNTYgLSBtYXhfY29tYikKKyAgICAgIG1heCArPSBtYXhfY29tYjsKKyAgICBlbHNlCisgICAgICBtYXggPSAyNTU7CisKKyAgICBpZiAobWluID4gbWF4X2NvbWIpCisgICAgICBtaW4gLT0gbWF4X2NvbWI7CisgICAgZWxzZQorICAgICAgbWluID0gMDsKKworICAgIG91dCA9IENMQU1QIChiZXN0LCBtaW4sIG1heCk7CisKKyAgICAvKiBEbyBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBsdW1hLCBpLmUuIGhvdyBtdWNoCisgICAgICogdGhlIHdlYXZlIHBpeGVsIGRpZmZlcnMgKi8KKyAgICBtb3YgPSBBQlMgKGwyIC0gbHAyKTsKKyAgICBpZiAobW92ID4gbW90aW9uX3RocmVzaG9sZCkKKyAgICAgIG1vdiAtPSBtb3Rpb25fdGhyZXNob2xkOworICAgIGVsc2UKKyAgICAgIG1vdiA9IDA7CisKKyAgICBtb3YgPSBtb3YgKiBtb3Rpb25fc2Vuc2U7CisgICAgaWYgKG1vdiA+IDI1NikKKyAgICAgIG1vdiA9IDI1NjsKKworICAgIC8qIFdlaWdodGVkIHN1bSBvbiBjbGlwcGVkIHdlYXZlIHBpeGVsIGFuZCBhdmVyYWdlICovCisgICAgb3V0ID0gKG91dCAqICgyNTYgLSBtb3YpICsgYXZnX3NjICogbW92KSAvIDI1NjsKKworICAgIERlc3RbMF0gPSBvdXQ7CisKKyAgICBEZXN0ICs9IDE7CisgICAgTDEgKz0gMTsKKyAgICBMMiArPSAxOworICAgIEwzICs9IDE7CisgICAgTDJQICs9IDE7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dyZWVkeWhfc2NhbmxpbmVfQ19wbGFuYXJfdXYgKEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SCAqIHNlbGYsCisgICAgY29uc3QgZ3VpbnQ4ICogTDEsIGNvbnN0IGd1aW50OCAqIEwyLCBjb25zdCBndWludDggKiBMMywgY29uc3QgZ3VpbnQ4ICogTDJQLAorICAgIGd1aW50OCAqIERlc3QsIGdpbnQgd2lkdGgpCit7CisgIGdpbnQgUG9zOworICBndWludDggbDEsIGwxXzEsIGwzLCBsM18xOworICBndWludDggYXZnLCBhdmdfMTsKKyAgZ3VpbnQ4IGF2Z19fMSA9IDA7CisgIGd1aW50OCBhdmdfczsKKyAgZ3VpbnQ4IGF2Z19zYzsKKyAgZ3VpbnQ4IGJlc3Q7CisgIGd1aW50OCBvdXQ7CisgIGd1aW50OCBsMiwgbHAyOworICBndWludDggbDJfZGlmZiwgbHAyX2RpZmY7CisgIGd1aW50OCBtaW4sIG1heDsKKyAgZ3VpbnQgbWF4X2NvbWIgPSBzZWxmLT5tYXhfY29tYjsKKworICBmb3IgKFBvcyA9IDA7IFBvcyA8IHdpZHRoOyBQb3MrKykgeworICAgIGwxID0gTDFbMF07CisgICAgbDMgPSBMM1swXTsKKworICAgIGlmIChQb3MgPT0gd2lkdGggLSAxKSB7CisgICAgICBsMV8xID0gbDE7CisgICAgICBsM18xID0gbDM7CisgICAgfSBlbHNlIHsKKyAgICAgIGwxXzEgPSBMMVsxXTsKKyAgICAgIGwzXzEgPSBMM1sxXTsKKyAgICB9CisKKyAgICAvKiBBdmVyYWdlIG9mIEwxIGFuZCBMMyAqLworICAgIGF2ZyA9IChsMSArIGwzKSAvIDI7CisKKyAgICBpZiAoUG9zID09IDApIHsKKyAgICAgIGF2Z19fMSA9IGF2ZzsKKyAgICB9CisKKyAgICAvKiBBdmVyYWdlIG9mIG5leHQgTDEgYW5kIG5leHQgTDMgKi8KKyAgICBhdmdfMSA9IChsMV8xICsgbDNfMSkgLyAyOworCisgICAgLyogQ2FsY3VsYXRlIGF2ZXJhZ2Ugb2Ygb25lIHBpeGVsIGZvcndhcmQgYW5kIHByZXZpb3VzICovCisgICAgYXZnX3MgPSAoYXZnX18xICsgYXZnXzEpIC8gMjsKKworICAgIC8qIENhbGN1bGF0ZSBhdmVyYWdlIG9mIGNlbnRlciBhbmQgc3Vycm91bmRpbmcgcGl4ZWxzICovCisgICAgYXZnX3NjID0gKGF2ZyArIGF2Z19zKSAvIDI7CisKKyAgICAvKiBtb3ZlIGZvcndhcmQgKi8KKyAgICBhdmdfXzEgPSBhdmc7CisKKyAgICAvKiBHZXQgYmVzdCBMMi9MMlAsIGkuZS4gbGVhc3QgZGlmZiBmcm9tIGFib3ZlIGF2ZXJhZ2UgKi8KKyAgICBsMiA9IEwyWzBdOworICAgIGxwMiA9IEwyUFswXTsKKworICAgIGwyX2RpZmYgPSBBQlMgKGwyIC0gYXZnX3NjKTsKKworICAgIGxwMl9kaWZmID0gQUJTIChscDIgLSBhdmdfc2MpOworCisgICAgaWYgKGwyX2RpZmYgPiBscDJfZGlmZikKKyAgICAgIGJlc3QgPSBscDI7CisgICAgZWxzZQorICAgICAgYmVzdCA9IGwyOworCisgICAgLyogQ2xpcCB0aGlzIGJlc3QgTDIvTDJQIGJ5IEwxL0wzIGFuZCBhbGxvdyB0byBkaWZmZXIgYnkgR3JlZWR5TWF4Q29tYiAqLworICAgIG1heCA9IE1BWCAobDEsIGwzKTsKKyAgICBtaW4gPSBNSU4gKGwxLCBsMyk7CisKKyAgICBpZiAobWF4IDwgMjU2IC0gbWF4X2NvbWIpCisgICAgICBtYXggKz0gbWF4X2NvbWI7CisgICAgZWxzZQorICAgICAgbWF4ID0gMjU1OworCisgICAgaWYgKG1pbiA+IG1heF9jb21iKQorICAgICAgbWluIC09IG1heF9jb21iOworICAgIGVsc2UKKyAgICAgIG1pbiA9IDA7CisKKyAgICBvdXQgPSBDTEFNUCAoYmVzdCwgbWluLCBtYXgpOworCisgICAgRGVzdFswXSA9IG91dDsKKworICAgIERlc3QgKz0gMTsKKyAgICBMMSArPSAxOworICAgIEwyICs9IDE7CisgICAgTDMgKz0gMTsKKyAgICBMMlAgKz0gMTsKKyAgfQorfQorCisjaWZkZWYgQlVJTERfWDg2X0FTTQorCisjZGVmaW5lIElTX01NWEVYVAorI2RlZmluZSBTSU1EX1RZUEUgTU1YRVhUCisjZGVmaW5lIENfRlVOQ1RfWVVZMiBncmVlZHloX3NjYW5saW5lX0NfeXV5MgorI2RlZmluZSBDX0ZVTkNUX1VZVlkgZ3JlZWR5aF9zY2FubGluZV9DX3V5dnkKKyNkZWZpbmUgQ19GVU5DVF9QTEFOQVJfWSBncmVlZHloX3NjYW5saW5lX0NfcGxhbmFyX3kKKyNkZWZpbmUgQ19GVU5DVF9QTEFOQVJfVVYgZ3JlZWR5aF9zY2FubGluZV9DX3BsYW5hcl91dgorI2RlZmluZSBGVU5DVF9OQU1FX1lVWTIgZ3JlZWR5aF9zY2FubGluZV9NTVhFWFRfeXV5MgorI2RlZmluZSBGVU5DVF9OQU1FX1VZVlkgZ3JlZWR5aF9zY2FubGluZV9NTVhFWFRfdXl2eQorI2RlZmluZSBGVU5DVF9OQU1FX1BMQU5BUl9ZIGdyZWVkeWhfc2NhbmxpbmVfTU1YRVhUX3BsYW5hcl95CisjZGVmaW5lIEZVTkNUX05BTUVfUExBTkFSX1VWIGdyZWVkeWhfc2NhbmxpbmVfTU1YRVhUX3BsYW5hcl91dgorI2luY2x1ZGUgImdyZWVkeWguYXNtIgorI3VuZGVmIFNJTURfVFlQRQorI3VuZGVmIElTX01NWEVYVAorI3VuZGVmIEZVTkNUX05BTUVfWVVZMgorI3VuZGVmIEZVTkNUX05BTUVfVVlWWQorI3VuZGVmIEZVTkNUX05BTUVfUExBTkFSX1kKKyN1bmRlZiBGVU5DVF9OQU1FX1BMQU5BUl9VVgorCisjZGVmaW5lIElTXzNETk9XCisjZGVmaW5lIFNJTURfVFlQRSAzRE5PVworI2RlZmluZSBGVU5DVF9OQU1FX1lVWTIgZ3JlZWR5aF9zY2FubGluZV8zRE5PV195dXkyCisjZGVmaW5lIEZVTkNUX05BTUVfVVlWWSBncmVlZHloX3NjYW5saW5lXzNETk9XX3V5dnkKKyNkZWZpbmUgRlVOQ1RfTkFNRV9QTEFOQVJfWSBncmVlZHloX3NjYW5saW5lXzNETk9XX3BsYW5hcl95CisjZGVmaW5lIEZVTkNUX05BTUVfUExBTkFSX1VWIGdyZWVkeWhfc2NhbmxpbmVfM0ROT1dfcGxhbmFyX3V2CisjaW5jbHVkZSAiZ3JlZWR5aC5hc20iCisjdW5kZWYgU0lNRF9UWVBFCisjdW5kZWYgSVNfM0ROT1cKKyN1bmRlZiBGVU5DVF9OQU1FX1lVWTIKKyN1bmRlZiBGVU5DVF9OQU1FX1VZVlkKKyN1bmRlZiBGVU5DVF9OQU1FX1BMQU5BUl9ZCisjdW5kZWYgRlVOQ1RfTkFNRV9QTEFOQVJfVVYKKworI2RlZmluZSBJU19NTVgKKyNkZWZpbmUgU0lNRF9UWVBFIE1NWAorI2RlZmluZSBGVU5DVF9OQU1FX1lVWTIgZ3JlZWR5aF9zY2FubGluZV9NTVhfeXV5MgorI2RlZmluZSBGVU5DVF9OQU1FX1VZVlkgZ3JlZWR5aF9zY2FubGluZV9NTVhfdXl2eQorI2RlZmluZSBGVU5DVF9OQU1FX1BMQU5BUl9ZIGdyZWVkeWhfc2NhbmxpbmVfTU1YX3BsYW5hcl95CisjZGVmaW5lIEZVTkNUX05BTUVfUExBTkFSX1VWIGdyZWVkeWhfc2NhbmxpbmVfTU1YX3BsYW5hcl91dgorI2luY2x1ZGUgImdyZWVkeWguYXNtIgorI3VuZGVmIFNJTURfVFlQRQorI3VuZGVmIElTX01NWAorI3VuZGVmIEZVTkNUX05BTUVfWVVZMgorI3VuZGVmIEZVTkNUX05BTUVfVVlWWQorI3VuZGVmIEZVTkNUX05BTUVfUExBTkFSX1kKKyN1bmRlZiBGVU5DVF9OQU1FX1BMQU5BUl9VVgorI3VuZGVmIENfRlVOQ1RfWVVZMgorI3VuZGVmIENfRlVOQ1RfUExBTkFSX1kKKyN1bmRlZiBDX0ZVTkNUX1BMQU5BUl9VVgorCisjZW5kaWYKKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX2ZyYW1lX2RpX2dyZWVkeWhfcGFja2VkIChHc3REZWludGVybGFjZU1ldGhvZCAqIG1ldGhvZCwKKyAgICBjb25zdCBHc3REZWludGVybGFjZUZpZWxkICogaGlzdG9yeSwgZ3VpbnQgaGlzdG9yeV9jb3VudCwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0ZnJhbWUsIGludCBjdXJfZmllbGRfaWR4KQoreworICBHc3REZWludGVybGFjZU1ldGhvZEdyZWVkeUggKnNlbGYgPSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9IIChtZXRob2QpOworICBHc3REZWludGVybGFjZU1ldGhvZEdyZWVkeUhDbGFzcyAqa2xhc3MgPQorICAgICAgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9HUkVFRFlfSF9HRVRfQ0xBU1MgKHNlbGYpOworICBnaW50IEluZm9Jc09kZCA9IDA7CisgIGdpbnQgTGluZTsKKyAgZ2ludCBSb3dTdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKG91dGZyYW1lLCAwKTsKKyAgZ2ludCBGaWVsZEhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKG91dGZyYW1lKSAvIDI7CisgIGdpbnQgUGl0Y2ggPSBSb3dTdHJpZGUgKiAyOworICBjb25zdCBndWludDggKkwxOyAgICAgICAgICAgICAvLyBwdHIgdG8gTGluZTEsIG9mIDMKKyAgY29uc3QgZ3VpbnQ4ICpMMjsgICAgICAgICAgICAgLy8gcHRyIHRvIExpbmUyLCB0aGUgd2VhdmUgbGluZQorICBjb25zdCBndWludDggKkwzOyAgICAgICAgICAgICAvLyBwdHIgdG8gTGluZTMKKyAgY29uc3QgZ3VpbnQ4ICpMMlA7ICAgICAgICAgICAgLy8gcHRyIHRvIHByZXYgTGluZTIKKyAgZ3VpbnQ4ICpEZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAob3V0ZnJhbWUsIDApOworICBTY2FubGluZUZ1bmN0aW9uIHNjYW5saW5lOworCisgIGlmIChjdXJfZmllbGRfaWR4ICsgMiA+IGhpc3RvcnlfY291bnQgfHwgY3VyX2ZpZWxkX2lkeCA8IDEpIHsKKyAgICBHc3REZWludGVybGFjZU1ldGhvZCAqYmFja3VwX21ldGhvZDsKKworICAgIGJhY2t1cF9tZXRob2QgPSBnX29iamVjdF9uZXcgKGdzdF9kZWludGVybGFjZV9tZXRob2RfbGluZWFyX2dldF90eXBlICgpLAorICAgICAgICBOVUxMKTsKKworICAgIGdzdF9kZWludGVybGFjZV9tZXRob2Rfc2V0dXAgKGJhY2t1cF9tZXRob2QsIG1ldGhvZC0+dmluZm8pOworICAgIGdzdF9kZWludGVybGFjZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWUgKGJhY2t1cF9tZXRob2QsCisgICAgICAgIGhpc3RvcnksIGhpc3RvcnlfY291bnQsIG91dGZyYW1lLCBjdXJfZmllbGRfaWR4KTsKKworICAgIGdfb2JqZWN0X3VucmVmIChiYWNrdXBfbWV0aG9kKTsKKyAgICByZXR1cm47CisgIH0KKworICBjdXJfZmllbGRfaWR4ICs9IDI7CisKKyAgc3dpdGNoIChHU1RfVklERU9fSU5GT19GT1JNQVQgKG1ldGhvZC0+dmluZm8pKSB7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lVWTI6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWWVU6CisgICAgICBzY2FubGluZSA9IGtsYXNzLT5zY2FubGluZV95dXkyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICBzY2FubGluZSA9IGtsYXNzLT5zY2FubGluZV91eXZ5OworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FZVVY6CisgICAgICBzY2FubGluZSA9IGtsYXNzLT5zY2FubGluZV9heXV2OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgcmV0dXJuOworICB9CisKKyAgLy8gY29weSBmaXJzdCBldmVuIGxpbmUgbm8gbWF0dGVyIHdoYXQsIGFuZCB0aGUgZmlyc3Qgb2RkIGxpbmUgaWYgd2UncmUKKyAgLy8gcHJvY2Vzc2luZyBhbiBFVkVOIGZpZWxkLiAobm90ZSBkaWZmIGZyb20gb3RoZXIgZGVpbnQgcnRucy4pCisKKyAgaWYgKGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCAtIDFdLmZsYWdzID09IFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00pIHsKKyAgICBJbmZvSXNPZGQgPSAxOworCisgICAgTDEgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChoaXN0b3J5W2N1cl9maWVsZF9pZHggLSAyXS5mcmFtZSwgMCk7CisgICAgaWYgKGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCAtIDJdLmZsYWdzICYgUElDVFVSRV9JTlRFUkxBQ0VEX0JPVFRPTSkKKyAgICAgIEwxICs9IFJvd1N0cmlkZTsKKworICAgIEwyID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoaGlzdG9yeVtjdXJfZmllbGRfaWR4IC0gMV0uZnJhbWUsIDApOworICAgIGlmIChoaXN0b3J5W2N1cl9maWVsZF9pZHggLSAxXS5mbGFncyAmIFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00pCisgICAgICBMMiArPSBSb3dTdHJpZGU7CisKKyAgICBMMyA9IEwxICsgUGl0Y2g7CisgICAgTDJQID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoaGlzdG9yeVtjdXJfZmllbGRfaWR4IC0gM10uZnJhbWUsIDApOworICAgIGlmIChoaXN0b3J5W2N1cl9maWVsZF9pZHggLSAzXS5mbGFncyAmIFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00pCisgICAgICBMMlAgKz0gUm93U3RyaWRlOworCisgICAgLy8gY29weSBmaXJzdCBldmVuIGxpbmUKKyAgICBtZW1jcHkgKERlc3QsIEwxLCBSb3dTdHJpZGUpOworICAgIERlc3QgKz0gUm93U3RyaWRlOworICB9IGVsc2UgeworICAgIEluZm9Jc09kZCA9IDA7CisgICAgTDEgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChoaXN0b3J5W2N1cl9maWVsZF9pZHggLSAyXS5mcmFtZSwgMCk7CisgICAgaWYgKGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCAtIDJdLmZsYWdzICYgUElDVFVSRV9JTlRFUkxBQ0VEX0JPVFRPTSkKKyAgICAgIEwxICs9IFJvd1N0cmlkZTsKKworICAgIEwyID0gKGd1aW50OCAqKSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChoaXN0b3J5W2N1cl9maWVsZF9pZHggLQorICAgICAgICAgICAgMV0uZnJhbWUsIDApICsgUGl0Y2g7CisgICAgaWYgKGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCAtIDFdLmZsYWdzICYgUElDVFVSRV9JTlRFUkxBQ0VEX0JPVFRPTSkKKyAgICAgIEwyICs9IFJvd1N0cmlkZTsKKworICAgIEwzID0gTDEgKyBQaXRjaDsKKyAgICBMMlAgPQorICAgICAgICAoZ3VpbnQ4ICopIEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCAtIDNdLmZyYW1lLAorICAgICAgICAwKSArIFBpdGNoOworICAgIGlmIChoaXN0b3J5W2N1cl9maWVsZF9pZHggLSAzXS5mbGFncyAmIFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00pCisgICAgICBMMlAgKz0gUm93U3RyaWRlOworCisgICAgLy8gY29weSBmaXJzdCBldmVuIGxpbmUKKyAgICBtZW1jcHkgKERlc3QsIEwxLCBSb3dTdHJpZGUpOworICAgIERlc3QgKz0gUm93U3RyaWRlOworICAgIC8vIHRoZW4gZmlyc3Qgb2RkIGxpbmUKKyAgICBtZW1jcHkgKERlc3QsIEwxLCBSb3dTdHJpZGUpOworICAgIERlc3QgKz0gUm93U3RyaWRlOworICB9CisKKyAgZm9yIChMaW5lID0gMDsgTGluZSA8IChGaWVsZEhlaWdodCAtIDEpOyArK0xpbmUpIHsKKyAgICBzY2FubGluZSAoc2VsZiwgTDEsIEwyLCBMMywgTDJQLCBEZXN0LCBSb3dTdHJpZGUpOworICAgIERlc3QgKz0gUm93U3RyaWRlOworICAgIG1lbWNweSAoRGVzdCwgTDMsIFJvd1N0cmlkZSk7CisgICAgRGVzdCArPSBSb3dTdHJpZGU7CisKKyAgICBMMSArPSBQaXRjaDsKKyAgICBMMiArPSBQaXRjaDsKKyAgICBMMyArPSBQaXRjaDsKKyAgICBMMlAgKz0gUGl0Y2g7CisgIH0KKworICBpZiAoSW5mb0lzT2RkKSB7CisgICAgbWVtY3B5IChEZXN0LCBMMiwgUm93U3RyaWRlKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2VfZnJhbWVfZGlfZ3JlZWR5aF9wbGFuYXJfcGxhbmUgKEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SCAqIHNlbGYsCisgICAgY29uc3QgZ3VpbnQ4ICogTDEsIGNvbnN0IGd1aW50OCAqIEwyLCBjb25zdCBndWludDggKiBMMywgY29uc3QgZ3VpbnQ4ICogTDJQLAorICAgIGd1aW50OCAqIERlc3QsIGdpbnQgUm93U3RyaWRlLCBnaW50IEZpZWxkSGVpZ2h0LCBnaW50IFBpdGNoLCBnaW50IEluZm9Jc09kZCwKKyAgICBTY2FubGluZUZ1bmN0aW9uIHNjYW5saW5lKQoreworICBnaW50IExpbmU7CisKKyAgLy8gY29weSBmaXJzdCBldmVuIGxpbmUgbm8gbWF0dGVyIHdoYXQsIGFuZCB0aGUgZmlyc3Qgb2RkIGxpbmUgaWYgd2UncmUKKyAgLy8gcHJvY2Vzc2luZyBhbiBFVkVOIGZpZWxkLiAobm90ZSBkaWZmIGZyb20gb3RoZXIgZGVpbnQgcnRucy4pCisKKyAgaWYgKEluZm9Jc09kZCkgeworICAgIC8vIGNvcHkgZmlyc3QgZXZlbiBsaW5lCisgICAgbWVtY3B5IChEZXN0LCBMMSwgUm93U3RyaWRlKTsKKyAgICBEZXN0ICs9IFJvd1N0cmlkZTsKKyAgfSBlbHNlIHsKKyAgICAvLyBjb3B5IGZpcnN0IGV2ZW4gbGluZQorICAgIG1lbWNweSAoRGVzdCwgTDEsIFJvd1N0cmlkZSk7CisgICAgRGVzdCArPSBSb3dTdHJpZGU7CisgICAgLy8gdGhlbiBmaXJzdCBvZGQgbGluZQorICAgIG1lbWNweSAoRGVzdCwgTDEsIFJvd1N0cmlkZSk7CisgICAgRGVzdCArPSBSb3dTdHJpZGU7CisgIH0KKworICBmb3IgKExpbmUgPSAwOyBMaW5lIDwgKEZpZWxkSGVpZ2h0IC0gMSk7ICsrTGluZSkgeworICAgIHNjYW5saW5lIChzZWxmLCBMMSwgTDIsIEwzLCBMMlAsIERlc3QsIFJvd1N0cmlkZSk7CisgICAgRGVzdCArPSBSb3dTdHJpZGU7CisgICAgbWVtY3B5IChEZXN0LCBMMywgUm93U3RyaWRlKTsKKyAgICBEZXN0ICs9IFJvd1N0cmlkZTsKKworICAgIEwxICs9IFBpdGNoOworICAgIEwyICs9IFBpdGNoOworICAgIEwzICs9IFBpdGNoOworICAgIEwyUCArPSBQaXRjaDsKKyAgfQorCisgIGlmIChJbmZvSXNPZGQpIHsKKyAgICBtZW1jcHkgKERlc3QsIEwyLCBSb3dTdHJpZGUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9mcmFtZV9kaV9ncmVlZHloX3BsYW5hciAoR3N0RGVpbnRlcmxhY2VNZXRob2QgKiBtZXRob2QsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VGaWVsZCAqIGhpc3RvcnksIGd1aW50IGhpc3RvcnlfY291bnQsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dGZyYW1lLCBpbnQgY3VyX2ZpZWxkX2lkeCkKK3sKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2RHcmVlZHlIICpzZWxmID0gR1NUX0RFSU5URVJMQUNFX01FVEhPRF9HUkVFRFlfSCAobWV0aG9kKTsKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2RHcmVlZHlIQ2xhc3MgKmtsYXNzID0KKyAgICAgIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0hfR0VUX0NMQVNTIChzZWxmKTsKKyAgZ2ludCBJbmZvSXNPZGQ7CisgIGdpbnQgUm93U3RyaWRlOworICBnaW50IEZpZWxkSGVpZ2h0OworICBnaW50IFBpdGNoOworICBjb25zdCBndWludDggKkwxOyAgICAgICAgICAgICAvLyBwdHIgdG8gTGluZTEsIG9mIDMKKyAgY29uc3QgZ3VpbnQ4ICpMMjsgICAgICAgICAgICAgLy8gcHRyIHRvIExpbmUyLCB0aGUgd2VhdmUgbGluZQorICBjb25zdCBndWludDggKkwzOyAgICAgICAgICAgICAvLyBwdHIgdG8gTGluZTMKKyAgY29uc3QgZ3VpbnQ4ICpMMlA7ICAgICAgICAgICAgLy8gcHRyIHRvIHByZXYgTGluZTIKKyAgZ3VpbnQ4ICpEZXN0OworICBnaW50IGk7CisgIFNjYW5saW5lRnVuY3Rpb24gc2NhbmxpbmU7CisKKyAgaWYgKGN1cl9maWVsZF9pZHggKyAyID4gaGlzdG9yeV9jb3VudCB8fCBjdXJfZmllbGRfaWR4IDwgMSkgeworICAgIEdzdERlaW50ZXJsYWNlTWV0aG9kICpiYWNrdXBfbWV0aG9kOworCisgICAgYmFja3VwX21ldGhvZCA9IGdfb2JqZWN0X25ldyAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9saW5lYXJfZ2V0X3R5cGUgKCksCisgICAgICAgIE5VTEwpOworCisgICAgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9zZXR1cCAoYmFja3VwX21ldGhvZCwgbWV0aG9kLT52aW5mbyk7CisgICAgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZSAoYmFja3VwX21ldGhvZCwKKyAgICAgICAgaGlzdG9yeSwgaGlzdG9yeV9jb3VudCwgb3V0ZnJhbWUsIGN1cl9maWVsZF9pZHgpOworCisgICAgZ19vYmplY3RfdW5yZWYgKGJhY2t1cF9tZXRob2QpOworICAgIHJldHVybjsKKyAgfQorCisgIGN1cl9maWVsZF9pZHggKz0gMjsKKworICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgSW5mb0lzT2RkID0gKGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCAtIDFdLmZsYWdzID09IFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00pOworICAgIFJvd1N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAob3V0ZnJhbWUsIGkpOworICAgIEZpZWxkSGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChvdXRmcmFtZSwgaSkgLyAyOworICAgIFBpdGNoID0gUm93U3RyaWRlICogMjsKKworICAgIGlmIChpID09IDApCisgICAgICBzY2FubGluZSA9IGtsYXNzLT5zY2FubGluZV9wbGFuYXJfeTsKKyAgICBlbHNlCisgICAgICBzY2FubGluZSA9IGtsYXNzLT5zY2FubGluZV9wbGFuYXJfdXY7CisKKyAgICBEZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAob3V0ZnJhbWUsIGkpOworCisgICAgTDEgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChoaXN0b3J5W2N1cl9maWVsZF9pZHggLSAyXS5mcmFtZSwgaSk7CisgICAgaWYgKGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCAtIDJdLmZsYWdzICYgUElDVFVSRV9JTlRFUkxBQ0VEX0JPVFRPTSkKKyAgICAgIEwxICs9IFJvd1N0cmlkZTsKKworICAgIEwyID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoaGlzdG9yeVtjdXJfZmllbGRfaWR4IC0gMV0uZnJhbWUsIGkpOworICAgIGlmIChoaXN0b3J5W2N1cl9maWVsZF9pZHggLSAxXS5mbGFncyAmIFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00pCisgICAgICBMMiArPSBSb3dTdHJpZGU7CisKKyAgICBMMyA9IEwxICsgUGl0Y2g7CisgICAgTDJQID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoaGlzdG9yeVtjdXJfZmllbGRfaWR4IC0gM10uZnJhbWUsIGkpOworICAgIGlmIChoaXN0b3J5W2N1cl9maWVsZF9pZHggLSAzXS5mbGFncyAmIFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00pCisgICAgICBMMlAgKz0gUm93U3RyaWRlOworCisgICAgZGVpbnRlcmxhY2VfZnJhbWVfZGlfZ3JlZWR5aF9wbGFuYXJfcGxhbmUgKHNlbGYsIEwxLCBMMiwgTDMsIEwyUCwgRGVzdCwKKyAgICAgICAgUm93U3RyaWRlLCBGaWVsZEhlaWdodCwgUGl0Y2gsIEluZm9Jc09kZCwgc2NhbmxpbmUpOworICB9Cit9CisKK0dfREVGSU5FX1RZUEUgKEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SCwgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfaCwKKyAgICBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0QpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9NQVhfQ09NQiwKKyAgUFJPUF9NT1RJT05fVEhSRVNIT0xELAorICBQUk9QX01PVElPTl9TRU5TRQorfTsKKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2hfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SCAqc2VsZiA9IEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0ggKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01BWF9DT01COgorICAgICAgc2VsZi0+bWF4X2NvbWIgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTU9USU9OX1RIUkVTSE9MRDoKKyAgICAgIHNlbGYtPm1vdGlvbl90aHJlc2hvbGQgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTU9USU9OX1NFTlNFOgorICAgICAgc2VsZi0+bW90aW9uX3NlbnNlID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2hfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SCAqc2VsZiA9IEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0ggKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01BWF9DT01COgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNlbGYtPm1heF9jb21iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NT1RJT05fVEhSRVNIT0xEOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNlbGYtPm1vdGlvbl90aHJlc2hvbGQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01PVElPTl9TRU5TRToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzZWxmLT5tb3Rpb25fc2Vuc2UpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2hfY2xhc3NfaW5pdCAoR3N0RGVpbnRlcmxhY2VNZXRob2RHcmVlZHlIQ2xhc3MgKgorICAgIGtsYXNzKQoreworICBHc3REZWludGVybGFjZU1ldGhvZENsYXNzICpkaW1fY2xhc3MgPSAoR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzcyAqKSBrbGFzczsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyNpZmRlZiBCVUlMRF9YODZfQVNNCisgIGd1aW50IGNwdV9mbGFncyA9CisgICAgICBvcmNfdGFyZ2V0X2dldF9kZWZhdWx0X2ZsYWdzIChvcmNfdGFyZ2V0X2dldF9ieV9uYW1lICgibW14IikpOworI2VuZGlmCisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfaF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2hfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX0NPTUIsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm1heC1jb21iIiwKKyAgICAgICAgICAiTWF4IGNvbWIiLAorICAgICAgICAgICJNYXggQ29tYiIsIDAsIDI1NSwgNSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKQorICAgICAgKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01PVElPTl9USFJFU0hPTEQsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm1vdGlvbi10aHJlc2hvbGQiLAorICAgICAgICAgICJNb3Rpb24gVGhyZXNob2xkIiwKKyAgICAgICAgICAiTW90aW9uIFRocmVzaG9sZCIsCisgICAgICAgICAgMCwgMjU1LCAyNSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKQorICAgICAgKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01PVElPTl9TRU5TRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibW90aW9uLXNlbnNlIiwKKyAgICAgICAgICAiTW90aW9uIFNlbnNlIiwKKyAgICAgICAgICAiTW90aW9uIFNlbnNlIiwKKyAgICAgICAgICAwLCAyNTUsIDMwLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpCisgICAgICApOworCisgIGRpbV9jbGFzcy0+ZmllbGRzX3JlcXVpcmVkID0gNDsKKyAgZGltX2NsYXNzLT5uYW1lID0gIk1vdGlvbiBBZGFwdGl2ZTogQWR2YW5jZWQgRGV0ZWN0aW9uIjsKKyAgZGltX2NsYXNzLT5uaWNrID0gImdyZWVkeWgiOworICBkaW1fY2xhc3MtPmxhdGVuY3kgPSAxOworCisgIGRpbV9jbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfeXV5MiA9IGRlaW50ZXJsYWNlX2ZyYW1lX2RpX2dyZWVkeWhfcGFja2VkOworICBkaW1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l2eXUgPSBkZWludGVybGFjZV9mcmFtZV9kaV9ncmVlZHloX3BhY2tlZDsKKyAgZGltX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV91eXZ5ID0gZGVpbnRlcmxhY2VfZnJhbWVfZGlfZ3JlZWR5aF9wYWNrZWQ7CisgIGRpbV9jbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfYXl1diA9IGRlaW50ZXJsYWNlX2ZyYW1lX2RpX2dyZWVkeWhfcGFja2VkOworICBkaW1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3k0NDQgPSBkZWludGVybGFjZV9mcmFtZV9kaV9ncmVlZHloX3BsYW5hcjsKKyAgZGltX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV9pNDIwID0gZGVpbnRlcmxhY2VfZnJhbWVfZGlfZ3JlZWR5aF9wbGFuYXI7CisgIGRpbV9jbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfeXYxMiA9IGRlaW50ZXJsYWNlX2ZyYW1lX2RpX2dyZWVkeWhfcGxhbmFyOworICBkaW1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3k0MmIgPSBkZWludGVybGFjZV9mcmFtZV9kaV9ncmVlZHloX3BsYW5hcjsKKyAgZGltX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV95NDFiID0gZGVpbnRlcmxhY2VfZnJhbWVfZGlfZ3JlZWR5aF9wbGFuYXI7CisKKyNpZmRlZiBCVUlMRF9YODZfQVNNCisgIGlmIChjcHVfZmxhZ3MgJiBPUkNfVEFSR0VUX01NWF9NTVhFWFQpIHsKKyAgICBrbGFzcy0+c2NhbmxpbmVfeXV5MiA9IGdyZWVkeWhfc2NhbmxpbmVfTU1YRVhUX3l1eTI7CisgICAga2xhc3MtPnNjYW5saW5lX3V5dnkgPSBncmVlZHloX3NjYW5saW5lX01NWEVYVF91eXZ5OworICB9IGVsc2UgaWYgKGNwdV9mbGFncyAmIE9SQ19UQVJHRVRfTU1YXzNETk9XKSB7CisgICAga2xhc3MtPnNjYW5saW5lX3l1eTIgPSBncmVlZHloX3NjYW5saW5lXzNETk9XX3l1eTI7CisgICAga2xhc3MtPnNjYW5saW5lX3V5dnkgPSBncmVlZHloX3NjYW5saW5lXzNETk9XX3V5dnk7CisgIH0gZWxzZSBpZiAoY3B1X2ZsYWdzICYgT1JDX1RBUkdFVF9NTVhfTU1YKSB7CisgICAga2xhc3MtPnNjYW5saW5lX3l1eTIgPSBncmVlZHloX3NjYW5saW5lX01NWF95dXkyOworICAgIGtsYXNzLT5zY2FubGluZV91eXZ5ID0gZ3JlZWR5aF9zY2FubGluZV9NTVhfdXl2eTsKKyAgfSBlbHNlIHsKKyAgICBrbGFzcy0+c2NhbmxpbmVfeXV5MiA9IGdyZWVkeWhfc2NhbmxpbmVfQ195dXkyOworICAgIGtsYXNzLT5zY2FubGluZV91eXZ5ID0gZ3JlZWR5aF9zY2FubGluZV9DX3V5dnk7CisgIH0KKyNlbHNlCisgIGtsYXNzLT5zY2FubGluZV95dXkyID0gZ3JlZWR5aF9zY2FubGluZV9DX3l1eTI7CisgIGtsYXNzLT5zY2FubGluZV91eXZ5ID0gZ3JlZWR5aF9zY2FubGluZV9DX3V5dnk7CisjZW5kaWYKKyAgLyogVE9ETzogTU1YIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIHR3byAqLworICBrbGFzcy0+c2NhbmxpbmVfYXl1diA9IGdyZWVkeWhfc2NhbmxpbmVfQ19heXV2OworICBrbGFzcy0+c2NhbmxpbmVfcGxhbmFyX3kgPSBncmVlZHloX3NjYW5saW5lX0NfcGxhbmFyX3k7CisgIGtsYXNzLT5zY2FubGluZV9wbGFuYXJfdXYgPSBncmVlZHloX3NjYW5saW5lX0NfcGxhbmFyX3V2OworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfaF9pbml0IChHc3REZWludGVybGFjZU1ldGhvZEdyZWVkeUggKiBzZWxmKQoreworICBzZWxmLT5tYXhfY29tYiA9IDU7CisgIHNlbGYtPm1vdGlvbl90aHJlc2hvbGQgPSAyNTsKKyAgc2VsZi0+bW90aW9uX3NlbnNlID0gMzA7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWhtYWNyb3MuaCBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aG1hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZWFmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWhtYWNyb3MuaApAQCAtMCwwICsxLDgzIEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgVG9tIEJhcnJ5ICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBSZWxpY2Vuc2VkIGZvciBHU3RyZWFtZXIgZnJvbSBHUEwgdG8gTEdQTCB3aXRoIHBlcm1pdCBmcm9tIFRvbSBCYXJyeS4KKyAqIFNlZTogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTYzNTc4CisgKi8KKworLy8gRGVmaW5lIGEgZmV3IG1hY3JvcyBmb3IgQ1BVIGRlcGVuZGVudCBpbnN0cnVjdGlvbnMuIAorLy8gSSBzdXNwZWN0IEkgZG9uJ3QgcmVhbGx5IHVuZGVyc3RhbmQgaG93IHRoZSBDIG1hY3JvIHByZXByb2Nlc3NvciB3b3JrcyBidXQKKy8vIHRoaXMgc2VlbXMgdG8gZ2V0IHRoZSBqb2IgZG9uZS4gICAgICAgICAgLy8gVFJCIDcvMDEKKworLy8gQkVGT1JFIFVTSU5HIFRIRVNFIFlPVSBNVVNUIFNFVDoKKworLy8gI2RlZmluZSBTSU1EX1RZUEUgTU1YRVhUICAgICAgICAgICAgKG9yIE1NWCBvciAzRE5PVykKKworLy8gc29tZSBtYWNyb3MgZm9yIHBhdmdiIGluc3RydWN0aW9uCisvLyAgICAgIFZfUEFWR0IobW1yMSwgbW1yMiwgbW1yIHdvcmsgcmVnaXN0ZXIsIHNtYXNrKSBtbXIyIG1heSA9IG1tcncgaWYgeW91IGNhbiB0cmFzaCBpdAorCisjZGVmaW5lIFZfUEFWR0JfTU1YKG1tcjEsIG1tcjIsIG1tcncsIHNtYXNrKSBcCisJIm1vdnEgICAgIm1tcjIiLCAgIm1tcnciXG5cdCIgICAgICAgICAgICBcCisJInBhbmQgICAgInNtYXNrIiwgIm1tcnciXG5cdCIgICAgICAgICAgICBcCisJInBzcmx3ICAgJDEsICAgICAgIm1tcnciXG5cdCIgICAgICAgICAgICBcCisJInBhbmQgICAgInNtYXNrIiwgIm1tcjEiXG5cdCIgICAgICAgICAgICBcCisJInBzcmx3ICAgJDEsICAgICAgIm1tcjEiXG5cdCIgICAgICAgICAgICBcCisJInBhZGR1c2IgIm1tcnciLCAgIm1tcjEiXG5cdCIKKyNkZWZpbmUgVl9QQVZHQl9NTVhFWFQobW1yMSwgbW1yMiwgbW1ydywgc21hc2spICAgICAgInBhdmdiICAgIm1tcjIiLCAibW1yMSJcblx0IgorI2RlZmluZSBWX1BBVkdCXzNETk9XKG1tcjEsIG1tcjIsIG1tcncsIHNtYXNrKSAgICAicGF2Z3VzYiAibW1yMiIsICJtbXIxIlxuXHQiCisjZGVmaW5lIFZfUEFWR0IobW1yMSwgbW1yMiwgbW1ydywgc21hc2spICAgICAgICAgIFZfUEFWR0IyKG1tcjEsIG1tcjIsIG1tcncsIHNtYXNrLCBTSU1EX1RZUEUpIAorI2RlZmluZSBWX1BBVkdCMihtbXIxLCBtbXIyLCBtbXJ3LCBzbWFzaywgc2ltZF90eXBlKSBWX1BBVkdCMyhtbXIxLCBtbXIyLCBtbXJ3LCBzbWFzaywgc2ltZF90eXBlKSAKKyNkZWZpbmUgVl9QQVZHQjMobW1yMSwgbW1yMiwgbW1ydywgc21hc2ssIHNpbWRfdHlwZSkgVl9QQVZHQl8jI3NpbWRfdHlwZShtbXIxLCBtbXIyLCBtbXJ3LCBzbWFzaykgCisKKy8vIHNvbWUgbWFjcm9zIGZvciBwbWF4dWIgaW5zdHJ1Y3Rpb24KKyNkZWZpbmUgVl9QTUFYVUJfTU1YKG1tcjEsIG1tcjIpIFwKKyAgICAicHN1YnVzYiAibW1yMiIsICJtbXIxIlxuXHQiIFwKKyAgICAicGFkZHVzYiAibW1yMiIsICJtbXIxIlxuXHQiCisjZGVmaW5lIFZfUE1BWFVCX01NWEVYVChtbXIxLCBtbXIyKSAgICAgICJwbWF4dWIgIm1tcjIiLCAibW1yMSJcblx0IgorI2RlZmluZSBWX1BNQVhVQl8zRE5PVyhtbXIxLCBtbXIyKSAgICBWX1BNQVhVQl9NTVgobW1yMSwgbW1yMikgIC8vIHVzZSBNTVggdmVyc2lvbgorI2RlZmluZSBWX1BNQVhVQihtbXIxLCBtbXIyKSAgICAgICAgICBWX1BNQVhVQjIobW1yMSwgbW1yMiwgU0lNRF9UWVBFKSAKKyNkZWZpbmUgVl9QTUFYVUIyKG1tcjEsIG1tcjIsIHNpbWRfdHlwZSkgVl9QTUFYVUIzKG1tcjEsIG1tcjIsIHNpbWRfdHlwZSkgCisjZGVmaW5lIFZfUE1BWFVCMyhtbXIxLCBtbXIyLCBzaW1kX3R5cGUpIFZfUE1BWFVCXyMjc2ltZF90eXBlKG1tcjEsIG1tcjIpIAorCisvLyBzb21lIG1hY3JvcyBmb3IgcG1pbnViIGluc3RydWN0aW9uCisvLyAgICAgIFZfUE1JTlVCKG1tcjEsIG1tcjIsIG1tciB3b3JrIHJlZ2lzdGVyKSAgICAgbW1yMiBtYXkgTk9UID0gbW1ydworI2RlZmluZSBWX1BNSU5VQl9NTVgobW1yMSwgbW1yMiwgbW1ydykgXAorICAgICJwY21wZXFiICJtbXJ3IiwgIm1tcnciXG5cdCIgICAgICAgXAorICAgICJwc3VidXNiICJtbXIyIiwgIm1tcnciXG5cdCIgICAgICAgXAorICAgICJwYWRkdXNiICJtbXJ3IiwgIm1tcjEiXG5cdCIgICAgICAgXAorICAgICJwc3VidXNiICJtbXJ3IiwgIm1tcjEiXG5cdCIKKyNkZWZpbmUgVl9QTUlOVUJfTU1YRVhUKG1tcjEsIG1tcjIsIG1tcncpICAgICAgInBtaW51YiAibW1yMiIsICJtbXIxIlxuXHQiCisjZGVmaW5lIFZfUE1JTlVCXzNETk9XKG1tcjEsIG1tcjIsIG1tcncpICAgIFZfUE1JTlVCX01NWChtbXIxLCBtbXIyLCBtbXJ3KSAgLy8gdXNlIE1NWCB2ZXJzaW9uCisjZGVmaW5lIFZfUE1JTlVCKG1tcjEsIG1tcjIsIG1tcncpICAgICAgICAgIFZfUE1JTlVCMihtbXIxLCBtbXIyLCBtbXJ3LCBTSU1EX1RZUEUpIAorI2RlZmluZSBWX1BNSU5VQjIobW1yMSwgbW1yMiwgbW1ydywgc2ltZF90eXBlKSBWX1BNSU5VQjMobW1yMSwgbW1yMiwgbW1ydywgc2ltZF90eXBlKSAKKyNkZWZpbmUgVl9QTUlOVUIzKG1tcjEsIG1tcjIsIG1tcncsIHNpbWRfdHlwZSkgVl9QTUlOVUJfIyNzaW1kX3R5cGUobW1yMSwgbW1yMiwgbW1ydykgCisKKy8vIHNvbWUgbWFjcm9zIGZvciBtb3ZudHEgaW5zdHJ1Y3Rpb24KKy8vICAgICAgVl9NT1ZOVFEobW1yMSwgbW1yMikgCisjZGVmaW5lIFZfTU9WTlRRX01NWChtbXIxLCBtbXIyKSAgICAgICJtb3ZxICAgIm1tcjIiLCAibW1yMSJcblx0IgorI2RlZmluZSBWX01PVk5UUV8zRE5PVyhtbXIxLCBtbXIyKSAgICAibW92cSAgICJtbXIyIiwgIm1tcjEiXG5cdCIKKyNkZWZpbmUgVl9NT1ZOVFFfTU1YRVhUKG1tcjEsIG1tcjIpICAgICAgIm1vdm50cSAibW1yMiIsICJtbXIxIlxuXHQiCisjZGVmaW5lIFZfTU9WTlRRKG1tcjEsIG1tcjIpICAgICAgICAgIFZfTU9WTlRRMihtbXIxLCBtbXIyLCBTSU1EX1RZUEUpIAorI2RlZmluZSBWX01PVk5UUTIobW1yMSwgbW1yMiwgc2ltZF90eXBlKSBWX01PVk5UUTMobW1yMSwgbW1yMiwgc2ltZF90eXBlKSAKKyNkZWZpbmUgVl9NT1ZOVFEzKG1tcjEsIG1tcjIsIHNpbWRfdHlwZSkgVl9NT1ZOVFFfIyNzaW1kX3R5cGUobW1yMSwgbW1yMikKKworLy8gZW5kIG9mIG1hY3JvcworCmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2xpbmVhci5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzQ1MzUzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXIuYwpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBCaWxseSBCaWdncyA8dmVrdG9yQGR1bWJ0ZXJtLm5ldD4uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0Bjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIFJlbGljZW5zZWQgZm9yIEdTdHJlYW1lciBmcm9tIEdQTCB0byBMR1BMIHdpdGggcGVybWl0IGZyb20gQmlsbHkgQmlnZ3MuCisgKiBTZWU6IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTE2MzU3OAorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RkZWludGVybGFjZW1ldGhvZC5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIEhBVkVfT1JDCisjaW5jbHVkZSA8b3JjL29yYy5oPgorI2VuZGlmCisjaW5jbHVkZSAidHZ0aW1lLmgiCisKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX0xJTkVBUgkoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9saW5lYXJfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9JU19ERUlOVEVSTEFDRV9NRVRIT0RfTElORUFSKG9iaikJCShHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9MSU5FQVIpKQorI2RlZmluZSBHU1RfSVNfREVJTlRFUkxBQ0VfTUVUSE9EX0xJTkVBUl9DTEFTUyhrbGFzcykJKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfTElORUFSKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9MSU5FQVJfR0VUX0NMQVNTKG9iaikJKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfTElORUFSLCBHc3REZWludGVybGFjZU1ldGhvZExpbmVhckNsYXNzKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9MSU5FQVIob2JqKQkJKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX0xJTkVBUiwgR3N0RGVpbnRlcmxhY2VNZXRob2RMaW5lYXIpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0xJTkVBUl9DTEFTUyhrbGFzcykJKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfTElORUFSLCBHc3REZWludGVybGFjZU1ldGhvZExpbmVhckNsYXNzKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9MSU5FQVJfQ0FTVChvYmopCSgoR3N0RGVpbnRlcmxhY2VNZXRob2RMaW5lYXIqKShvYmopKQorCitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9nZXRfdHlwZSAodm9pZCk7CisKK3R5cGVkZWYgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgR3N0RGVpbnRlcmxhY2VNZXRob2RMaW5lYXI7Cit0eXBlZGVmIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgR3N0RGVpbnRlcmxhY2VNZXRob2RMaW5lYXJDbGFzczsKKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9jIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBndWludDggKiBzMSwgY29uc3QgZ3VpbnQ4ICogczIsIGdpbnQgc2l6ZSkKK3sKKyAgZGVpbnRlcmxhY2VfbGluZV9saW5lYXIgKG91dCwgczEsIHMyLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wYWNrZWRfYyAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9jIChzZWxmLCBvdXQsIHNjYW5saW5lcy0+dDAsIHNjYW5saW5lcy0+YjAsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX3BsYW5hcl95X2MgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYyAoc2VsZiwgb3V0LCBzY2FubGluZXMtPnQwLCBzY2FubGluZXMtPmIwLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wbGFuYXJfdV9jIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2MgKHNlbGYsIG91dCwgc2NhbmxpbmVzLT50MCwgc2NhbmxpbmVzLT5iMCwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfcGxhbmFyX3ZfYyAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9jIChzZWxmLCBvdXQsIHNjYW5saW5lcy0+dDAsIHNjYW5saW5lcy0+YjAsIHNpemUpOworfQorCitHX0RFRklORV9UWVBFIChHc3REZWludGVybGFjZU1ldGhvZExpbmVhciwgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9saW5lYXIsCisgICAgR1NUX1RZUEVfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9jbGFzc19pbml0IChHc3REZWludGVybGFjZU1ldGhvZExpbmVhckNsYXNzICoKKyAgICBrbGFzcykKK3sKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzcyAqZGltX2NsYXNzID0gKEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKikga2xhc3M7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgKmRpc21fY2xhc3MgPQorICAgICAgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgKikga2xhc3M7CisKKyAgZGltX2NsYXNzLT5maWVsZHNfcmVxdWlyZWQgPSAxOworICBkaW1fY2xhc3MtPm5hbWUgPSAiVGVsZXZpc2lvbjogRnVsbCByZXNvbHV0aW9uIjsKKyAgZGltX2NsYXNzLT5uaWNrID0gImxpbmVhciI7CisgIGRpbV9jbGFzcy0+bGF0ZW5jeSA9IDA7CisKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXV5MiA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXZ5dSA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfdXl2eSA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYXl1diA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYXJnYiA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYWJnciA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiYSA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYmdyYSA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3IgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfcGFja2VkX2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX252MTIgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfcGFja2VkX2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX252MjEgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfcGFja2VkX2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl95ID0KKyAgICAgIGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wbGFuYXJfeV9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdSA9CisgICAgICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfcGxhbmFyX3VfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3YgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX3BsYW5hcl92X2M7CisKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2RfbGluZWFyX2luaXQgKEdzdERlaW50ZXJsYWNlTWV0aG9kTGluZWFyICogc2VsZikKK3sKK30KZGlmZiAtLWdpdCBhL2dzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyYmxlbmQuYyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyYmxlbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGU0YTBiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXJibGVuZC5jCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogTGluZWFyIGJsZW5kIGRlaW50ZXJsYWNpbmcgcGx1Z2luLiAgVGhlIGlkZWEgZm9yIHRoaXMgYWxnb3JpdGhtIGNhbWUKKyAqIGZyb20gdGhlIGxpbmVhciBibGVuZCBkZWludGVybGFjZXIgd2hpY2ggb3JpZ2luYXRlZCBpbiB0aGUgbXBsYXllcgorICogc291cmNlcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgQmlsbHkgQmlnZ3MgPHZla3RvckBkdW1idGVybS5uZXQ+LgorICogQ29weXJpZ2h0IChDKSAyMDA4LDIwMTAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBSZWxpY2Vuc2VkIGZvciBHU3RyZWFtZXIgZnJvbSBHUEwgdG8gTEdQTCB3aXRoIHBlcm1pdCBmcm9tIEJpbGx5IEJpZ2dzLgorICogU2VlOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjM1NzgKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBIQVZFX09SQworI2luY2x1ZGUgPG9yYy9vcmMuaD4KKyNlbmRpZgorI2luY2x1ZGUgInR2dGltZS5oIgorCisjZGVmaW5lIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9MSU5FQVJfQkxFTkQJKGdzdF9kZWludGVybGFjZV9tZXRob2RfbGluZWFyX2JsZW5kX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfSVNfREVJTlRFUkxBQ0VfTUVUSE9EX0xJTkVBUl9CTEVORChvYmopCQkoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfTElORUFSX0JMRU5EKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9MSU5FQVJfQkxFTkRfQ0xBU1Moa2xhc3MpCShHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX0xJTkVBUl9CTEVORCkpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfTElORUFSX0JMRU5EX0dFVF9DTEFTUyhvYmopCShHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX0xJTkVBUl9CTEVORCwgR3N0RGVpbnRlcmxhY2VNZXRob2RMaW5lYXJCbGVuZENsYXNzKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9MSU5FQVJfQkxFTkQob2JqKQkJKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX0xJTkVBUl9CTEVORCwgR3N0RGVpbnRlcmxhY2VNZXRob2RMaW5lYXJCbGVuZCkpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfTElORUFSX0JMRU5EX0NMQVNTKGtsYXNzKQkoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9MSU5FQVJfQkxFTkQsIEdzdERlaW50ZXJsYWNlTWV0aG9kTGluZWFyQmxlbmRDbGFzcykpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfTElORUFSX0JMRU5EX0NBU1Qob2JqKQkoKEdzdERlaW50ZXJsYWNlTWV0aG9kTGluZWFyQmxlbmQqKShvYmopKQorCitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9ibGVuZF9nZXRfdHlwZSAodm9pZCk7CisKK3R5cGVkZWYgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgR3N0RGVpbnRlcmxhY2VNZXRob2RMaW5lYXJCbGVuZDsKK3R5cGVkZWYgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RDbGFzcyBHc3REZWludGVybGFjZU1ldGhvZExpbmVhckJsZW5kQ2xhc3M7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kX2MgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IGd1aW50OCAqIHQwLCBjb25zdCBndWludDggKiBiMCwgY29uc3QgZ3VpbnQ4ICogbTEsCisgICAgZ2ludCBzaXplKQoreworICBpZiAobTEgPT0gTlVMTCkgeworICAgIGRlaW50ZXJsYWNlX2xpbmVfbGluZWFyIChvdXQsIHQwLCBiMCwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgZGVpbnRlcmxhY2VfbGluZV9saW5lYXJfYmxlbmQgKG91dCwgdDAsIGIwLCBtMSwgc2l6ZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZF9wYWNrZWRfYyAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZF9jIChzZWxmLCBvdXQsIHNjYW5saW5lcy0+dDAsIHNjYW5saW5lcy0+YjAsCisgICAgICBzY2FubGluZXMtPm0xLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZF9wbGFuYXJfeV9jIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kX2MgKHNlbGYsIG91dCwgc2NhbmxpbmVzLT50MCwgc2NhbmxpbmVzLT5iMCwKKyAgICAgIHNjYW5saW5lcy0+bTEsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kX3BsYW5hcl91X2MgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmRfYyAoc2VsZiwgb3V0LCBzY2FubGluZXMtPnQwLCBzY2FubGluZXMtPmIwLAorICAgICAgc2NhbmxpbmVzLT5tMSwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmRfcGxhbmFyX3ZfYyAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZF9jIChzZWxmLCBvdXQsIHNjYW5saW5lcy0+dDAsIHNjYW5saW5lcy0+YjAsCisgICAgICBzY2FubGluZXMtPm0xLCBzaXplKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX2MgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IGd1aW50OCAqIG0wLCBjb25zdCBndWludDggKiB0MSwgY29uc3QgZ3VpbnQ4ICogYjEsCisgICAgZ2ludCBzaXplKQoreworICBpZiAodDEgPT0gTlVMTCkgeworICAgIG1lbWNweSAob3V0LCBtMCwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgZGVpbnRlcmxhY2VfbGluZV9saW5lYXJfYmxlbmQgKG91dCwgdDEsIGIxLCBtMCwgc2l6ZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZDJfcGFja2VkX2MgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX2MgKHNlbGYsIG91dCwgc2NhbmxpbmVzLT5tMCwgc2NhbmxpbmVzLT50MSwKKyAgICAgIHNjYW5saW5lcy0+YjEsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kMl9wbGFuYXJfeV9jIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqCisgICAgc2VsZiwgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywKKyAgICBndWludCBzaXplKQoreworICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX2MgKHNlbGYsIG91dCwgc2NhbmxpbmVzLT5tMCwgc2NhbmxpbmVzLT50MSwKKyAgICAgIHNjYW5saW5lcy0+YjEsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kMl9wbGFuYXJfdV9jIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqCisgICAgc2VsZiwgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywKKyAgICBndWludCBzaXplKQoreworICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX2MgKHNlbGYsIG91dCwgc2NhbmxpbmVzLT5tMCwgc2NhbmxpbmVzLT50MSwKKyAgICAgIHNjYW5saW5lcy0+YjEsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kMl9wbGFuYXJfdl9jIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqCisgICAgc2VsZiwgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywKKyAgICBndWludCBzaXplKQoreworICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX2MgKHNlbGYsIG91dCwgc2NhbmxpbmVzLT5tMCwgc2NhbmxpbmVzLT50MSwKKyAgICAgIHNjYW5saW5lcy0+YjEsIHNpemUpOworfQorCitHX0RFRklORV9UWVBFIChHc3REZWludGVybGFjZU1ldGhvZExpbmVhckJsZW5kLAorICAgIGdzdF9kZWludGVybGFjZV9tZXRob2RfbGluZWFyX2JsZW5kLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9TSU1QTEVfTUVUSE9EKTsKKworc3RhdGljIHZvaWQKKyAgICBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9ibGVuZF9jbGFzc19pbml0CisgICAgKEdzdERlaW50ZXJsYWNlTWV0aG9kTGluZWFyQmxlbmRDbGFzcyAqIGtsYXNzKQoreworICBHc3REZWludGVybGFjZU1ldGhvZENsYXNzICpkaW1fY2xhc3MgPSAoR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RDbGFzcyAqZGlzbV9jbGFzcyA9CisgICAgICAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RDbGFzcyAqKSBrbGFzczsKKworICBkaW1fY2xhc3MtPmZpZWxkc19yZXF1aXJlZCA9IDI7CisgIGRpbV9jbGFzcy0+bmFtZSA9ICJCbHVyOiBUZW1wb3JhbCI7CisgIGRpbV9jbGFzcy0+bmljayA9ICJsaW5lYXJibGVuZCI7CisgIGRpbV9jbGFzcy0+bGF0ZW5jeSA9IDE7CisKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXV5MiA9CisgICAgICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmRfcGFja2VkX2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3l2eXUgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV91eXZ5ID0KKyAgICAgIGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZF9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYXl1diA9CisgICAgICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmRfcGFja2VkX2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2FyZ2IgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9yZ2JhID0KKyAgICAgIGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZF9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYWJnciA9CisgICAgICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmRfcGFja2VkX2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2JncmEgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9yZ2IgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3IgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9udjEyID0KKyAgICAgIGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZF9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYyMSA9CisgICAgICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmRfcGFja2VkX2M7CisKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3kgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kX3BsYW5hcl95X2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl91ID0KKyAgICAgIGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZF9wbGFuYXJfdV9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdiA9CisgICAgICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmRfcGxhbmFyX3ZfYzsKKworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3l1eTIgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3l2eXUgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3V5dnkgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2F5dXYgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2FyZ2IgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2FiZ3IgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3JnYmEgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2JncmEgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3JnYiA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZDJfcGFja2VkX2M7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfYmdyID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kMl9wYWNrZWRfYzsKKworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3BsYW5hcl95ID0KKyAgICAgIGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZDJfcGxhbmFyX3lfYzsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9wbGFuYXJfdSA9CisgICAgICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX3BsYW5hcl91X2M7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfcGxhbmFyX3YgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kMl9wbGFuYXJfdl9jOworCit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9ibGVuZF9pbml0IChHc3REZWludGVybGFjZU1ldGhvZExpbmVhckJsZW5kICoKKyAgICBzZWxmKQoreworfQpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9tbXguaCBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvbW14LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBlNTgyYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvbW14LmgKQEAgLTAsMCArMSw3MjMgQEAKKy8qCW1teC5oCisKKwlNdWx0aU1lZGlhIGVYdGVuc2lvbnMgR0NDIGludGVyZmFjZSBsaWJyYXJ5IGZvciBJQTMyLgorCisJVG8gdXNlIHRoaXMgbGlicmFyeSwgc2ltcGx5IGluY2x1ZGUgdGhpcyBoZWFkZXIgZmlsZQorCWFuZCBjb21waWxlIHdpdGggR0NDLiAgWW91IE1VU1QgaGF2ZSBpbmxpbmluZyBlbmFibGVkCisJaW4gb3JkZXIgZm9yIG1teF9vaygpIHRvIHdvcms7IHRoaXMgY2FuIGJlIGRvbmUgYnkKKwlzaW1wbHkgdXNpbmcgLU8gb24gdGhlIEdDQyBjb21tYW5kIGxpbmUuCisKKwlDb21waWxpbmcgd2l0aCAtRE1NWF9UUkFDRSB3aWxsIGNhdXNlIGRldGFpbGVkIHRyYWNlCisJb3V0cHV0IHRvIGJlIHNlbnQgdG8gc3RkZXJyIGZvciBlYWNoIG1teCBvcGVyYXRpb24uCisJVGhpcyBhZGRzIGxvdHMgb2YgY29kZSwgYW5kIG9idmlvdXNseSBzbG93cyBleGVjdXRpb24gdG8KKwlhIGNyYXdsLCBidXQgY2FuIGJlIHZlcnkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuCisKKwlUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkKKwlFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUCisJTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKKwlBTkQgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworCTE5OTctOTggYnkgSC4gRGlldHogYW5kIFIuIEZpc2hlcgorCisgSGlzdG9yeToKKwk5Ny05OCoJUi5GaXNoZXIJRWFybHkgdmVyc2lvbnMKKwk5ODA1MDEJUi5GaXNoZXIJT3JpZ2luYWwgUmVsZWFzZQorCTk4MDYxMSoJSC5EaWV0egkJUmV3cml0ZSwgY29ycmVjdGx5IGltcGxlbWVudGluZyBpbmxpbmVzLCBhbmQKKwkJUi5GaXNoZXIJIGluY2x1ZGluZyBkaXJlY3QgcmVnaXN0ZXIgYWNjZXNzZXMuCisJOTgwNjE2CVIuRmlzaGVyCVJlbGVhc2Ugb2YgOTgwNjExIGFzIDk4MDYxNi4KKwk5ODA3MTQJUi5GaXNoZXIJTWlub3IgY29ycmVjdGlvbnMgdG8gTWFrZWZpbGUsIGV0Yy4KKwk5ODA3MTUJUi5GaXNoZXIJbW14X29rKCkgbm93IHByZXZlbnRzIG9wdGltaXplciBmcm9tIHVzaW5nCisJCQkJIGNsb2JiZXJlZCB2YWx1ZXMuCisJCQkJbW14X29rKCkgbm93IGNoZWNrcyBpZiBjcHVpZCBpbnN0cnVjdGlvbiBpcworCQkJCSBhdmFpbGFibGUgYmVmb3JlIHRyeWluZyB0byB1c2UgaXQuCisJOTgwNzI2KglSLkZpc2hlcgltbV9zdXBwb3J0KCkgc2VhcmNoZXMgZm9yIEFNRCAzRE5vdywgQ3lyaXgKKwkJCQkgRXh0ZW5kZWQgTU1YLCBhbmQgc3RhbmRhcmQgTU1YLiAgSXQgcmV0dXJucyBhCisJCQkJIHZhbHVlIHdoaWNoIGlzIHBvc2l0aXZlIGlmIGFueSBvZiB0aGVzZSBhcmUKKwkJCQkgc3VwcG9ydGVkLCBhbmQgY2FuIGJlIG1hc2tlZCB3aXRoIGNvbnN0YW50cyB0bworCQkJCSBzZWUgd2hpY2guICBtbXhfb2soKSBpcyBub3cgYSBjYWxsIHRvIHRoaXMKKwk5ODA3MjYqCVIuRmlzaGVyCUFkZGVkIGkyciBzdXBwb3J0IGZvciBzaGlmdCBmdW5jdGlvbnMKKwk5ODA5MTkJUi5GaXNoZXIJRml4ZWQgQU1EIGV4dGVuZGVkIGZlYXR1cmUgcmVjb2duaXRpb24gYnVnLgorCTk4MDkyMQlSLkZpc2hlcglBZGRlZCBkZWZpbml0aW9uL2NoZWNrIGZvciBfTU1YX0guCisJCQkJQWRkZWQgImZsb2F0IHNbMl0iIHRvIG1teF90IGZvciB1c2Ugd2l0aAorCQkJCSAgM0ROb3cgYW5kIEVNTVguICBTbyBzYW1lIG1teF90IGNhbiBiZSB1c2VkLgorCTk4MTAxMwlSLkZpc2hlcglGaXhlZCBjcHVpZCBmdW5jdGlvbiAxIGJ1ZyAobG9va2VkIGF0IHdyb25nIHJlZykKKwkJCQlGaXhlZCBwc2xscV9pMnIgZXJyb3IgaW4gbW14dGVzdC5jCisKKwkqIFVucmVsZWFzZWQgKGludGVybmFsIG9yIGludGVyaW0pIHZlcnNpb25zCisKKyBOb3RlczoKKwlJdCBhcHBlYXJzIHRoYXQgdGhlIGxhdGVzdCBnYXMgaGFzIHRoZSBwYW5kIHByb2JsZW0gZml4ZWQsIHRoZXJlZm9yZQorCSAgSSdsbCB1bmRlZmluZSBCUk9LRU5fUEFORCBieSBkZWZhdWx0LgorCVN0cmluZyBjb21wYXJlcyBtYXkgYmUgcXVpY2tlciB0aGFuIHRoZSBtdWx0aXBsZSB0ZXN0L2p1bXBzIGluIHZlbmRvcgorCSAgdGVzdCBzZXF1ZW5jZSBpbiBtbXhfb2soKSwgYnV0IEknbSBub3QgY29uY2VybmVkIHdpdGggdGhhdCByaWdodCBub3cuCisKKyBBY2tub3dsZWRnbWVudHM6CisJSnVzc2kgTGFha28gZm9yIHBvaW50aW5nIG91dCB0aGUgZXJyb3JzIHVsdGltYXRlbHkgZm91bmQgdG8gYmUKKwkgIGNvbm5lY3RlZCB0byB0aGUgZmFpbHVyZSB0byBub3RpZnkgdGhlIG9wdGltaXplciBvZiBjbG9iYmVyZWQgdmFsdWVzLgorCVJvZ2VyIEhhcmRpbWFuIGZvciByZW1pbmRpbmcgdXMgdGhhdCBDUFVJRCBpc24ndCBldmVyeXdoZXJlLCBhbmQgdGhhdAorCSAgc29tZW9uZSBtYXkgYWN0dWFsbHkgdHJ5IHRvIHVzZSB0aGlzIG9uIGEgbWFjaGluZSB3aXRob3V0IENQVUlELgorCSAgQWxzbyBmb3Igc3VnZ2VzdGluZyBjb2RlIGZvciBjaGVja2luZyB0aGlzLgorCVJvYmVydCBEYWxlIGZvciBwb2ludGluZyBvdXQgdGhlIEFNRCByZWNvZ25pdGlvbiBidWcuCisJSmltbXkgTWF5ZmllbGQgYW5kIENhcmwgV2l0dHkgZm9yIHBvaW50aW5nIG91dCB0aGUgSW50ZWwgcmVjb2duaXRpb24KKwkgIGJ1Zy4KKwlDYXJsIFdpdHR5IGZvciBwb2ludGluZyBvdXQgdGhlIHBzbGxxX2kyciB0ZXN0IGJ1Zy4KKyovCisKKyNpZm5kZWYgX01NWF9ICisjZGVmaW5lIF9NTVhfSAorCisvKiNkZWZpbmUgTU1YX1RSQUNFICovCisKKy8qCVdhcm5pbmc6ICBhdCB0aGlzIHdyaXRpbmcsIHRoZSB2ZXJzaW9uIG9mIEdBUyBwYWNrYWdlZAorCXdpdGggbW9zdCBMaW51eCBkaXN0cmlidXRpb25zIGRvZXMgbm90IGhhbmRsZSB0aGUKKwlwYXJhbGxlbCBBTkQgb3BlcmF0aW9uIG1uZW1vbmljIGNvcnJlY3RseS4gIElmIHRoZQorCXN5bWJvbCBCUk9LRU5fUEFORCBpcyBkZWZpbmVkLCBhIHNsb3dlciBhbHRlcm5hdGl2ZQorCWNvZGluZyB3aWxsIGJlIHVzZWQuICBJZiBleGVjdXRpb24gb2YgbW14dGVzdCByZXN1bHRzCisJaW4gYW4gaWxsZWdhbCBpbnN0cnVjdGlvbiBmYXVsdCwgZGVmaW5lIHRoaXMgc3ltYm9sLgorKi8KKyN1bmRlZglCUk9LRU5fUEFORAorCisKKy8qCVRoZSB0eXBlIG9mIGFuIHZhbHVlIHRoYXQgZml0cyBpbiBhbiBNTVggcmVnaXN0ZXIKKwkobm90ZSB0aGF0IGxvbmcgbG9uZyBjb25zdGFudCB2YWx1ZXMgTVVTVCBiZSBzdWZmaXhlZAorCSBieSBMTCBhbmQgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlcyBieSBVTEwsIGxlc3QKKwkgdGhleSBiZSB0cnVuY2F0ZWQgYnkgdGhlIGNvbXBpbGVyKQorKi8KK3R5cGVkZWYJdW5pb24geworCWxvbmcgbG9uZwkJcTsJLyogUXVhZHdvcmQgKDY0LWJpdCkgdmFsdWUgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcJdXE7CS8qIFVuc2lnbmVkIFF1YWR3b3JkICovCisJaW50CQkJZFsyXTsJLyogMiBEb3VibGV3b3JkICgzMi1iaXQpIHZhbHVlcyAqLworCXVuc2lnbmVkIGludAkJdWRbMl07CS8qIDIgVW5zaWduZWQgRG91Ymxld29yZCAqLworCXNob3J0CQkJd1s0XTsJLyogNCBXb3JkICgxNi1iaXQpIHZhbHVlcyAqLworCXVuc2lnbmVkIHNob3J0CQl1d1s0XTsJLyogNCBVbnNpZ25lZCBXb3JkICovCisJY2hhcgkJCWJbOF07CS8qIDggQnl0ZSAoOC1iaXQpIHZhbHVlcyAqLworCXVuc2lnbmVkIGNoYXIJCXViWzhdOwkvKiA4IFVuc2lnbmVkIEJ5dGUgKi8KKwlmbG9hdAkJCXNbMl07CS8qIFNpbmdsZS1wcmVjaXNpb24gKDMyLWJpdCkgdmFsdWUgKi8KK30gbW14X3Q7CisKKworLyoJRnVuY3Rpb24gdG8gdGVzdCBpZiBtdWx0aW1lZGlhIGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkLi4uCisqLworc3RhdGljIGlubGluZSBpbnQKK21tX3N1cHBvcnQodm9pZCkKK3sKKwkvKiBSZXR1cm5zIDEgaWYgTU1YIGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkLAorCSAgIDMgaWYgQ3lyaXggTU1YIGFuZCBFeHRlbmRlZCBNTVggaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQKKwkgICA1IGlmIEFNRCBNTVggYW5kIDNETm93ISBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZAorCSAgIDAgaWYgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBhbnkgb2YgdGhlc2UKKwkqLworCXJlZ2lzdGVyIGludCBydmFsID0gMDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJLyogU2VlIGlmIENQVUlEIGluc3RydWN0aW9uIGlzIHN1cHBvcnRlZCAuLi4gKi8KKwkJLyogLi4uIEdldCBjb3BpZXMgb2YgRUZMQUdTIGludG8gZWF4IGFuZCBlY3ggKi8KKwkJInB1c2hmXG5cdCIKKwkJInBvcGwgJSVlYXhcblx0IgorCQkibW92bCAlJWVheCwgJSVlY3hcblx0IgorCisJCS8qIC4uLiBUb2dnbGUgdGhlIElEIGJpdCBpbiBvbmUgY29weSBhbmQgc3RvcmUgKi8KKwkJLyogICAgIHRvIHRoZSBFRkxBR1MgcmVnICovCisJCSJ4b3JsICQweDIwMDAwMCwgJSVlYXhcblx0IgorCQkicHVzaCAlJWVheFxuXHQiCisJCSJwb3BmXG5cdCIKKworCQkvKiAuLi4gR2V0IHRoZSAoaG9wZWZ1bGx5IG1vZGlmaWVkKSBFRkxBR1MgKi8KKwkJInB1c2hmXG5cdCIKKwkJInBvcGwgJSVlYXhcblx0IgorCisJCS8qIC4uLiBDb21wYXJlIGFuZCB0ZXN0IHJlc3VsdCAqLworCQkieG9ybCAlJWVheCwgJSVlY3hcblx0IgorCQkidGVzdGwgJDB4MjAwMDAwLCAlJWVjeFxuXHQiCisJCSJqeiBOb3RTdXBwb3J0ZWQxXG5cdCIJCS8qIE5vdGhpbmcgc3VwcG9ydGVkICovCisKKworCQkvKiBHZXQgc3RhbmRhcmQgQ1BVSUQgaW5mb3JtYXRpb24sIGFuZAorCQkgICAgICAgZ28gdG8gYSBzcGVjaWZpYyB2ZW5kb3Igc2VjdGlvbiAqLworCQkibW92bCAkMCwgJSVlYXhcblx0IgorCQkiY3B1aWRcblx0IgorCisJCS8qIENoZWNrIGZvciBJbnRlbCAqLworCQkiY21wbCAkMHg3NTZlNjU0NywgJSVlYnhcblx0IgorCQkiam5lIFRyeUFNRFxuXHQiCisJCSJjbXBsICQweDQ5NjU2ZTY5LCAlJWVkeFxuXHQiCisJCSJqbmUgVHJ5QU1EXG5cdCIKKwkJImNtcGwgJDB4NmM2NTc0NmUsICUlZWN4XG4iCisJCSJqbmUgVHJ5QU1EXG5cdCIKKwkJImptcCBJbnRlbFxuXHQiCisKKwkJLyogQ2hlY2sgZm9yIEFNRCAqLworCQkiXG5UcnlBTUQ6XG5cdCIKKwkJImNtcGwgJDB4Njg3NDc1NDEsICUlZWJ4XG5cdCIKKwkJImpuZSBUcnlDeXJpeFxuXHQiCisJCSJjbXBsICQweDY5NzQ2ZTY1LCAlJWVkeFxuXHQiCisJCSJqbmUgVHJ5Q3lyaXhcblx0IgorCQkiY21wbCAkMHg0NDRkNDE2MywgJSVlY3hcbiIKKwkJImpuZSBUcnlDeXJpeFxuXHQiCisJCSJqbXAgQU1EXG5cdCIKKworCQkvKiBDaGVjayBmb3IgQ3lyaXggKi8KKwkJIlxuVHJ5Q3lyaXg6XG5cdCIKKwkJImNtcGwgJDB4Njk3Mjc5NDMsICUlZWJ4XG5cdCIKKwkJImpuZSBOb3RTdXBwb3J0ZWQyXG5cdCIKKwkJImNtcGwgJDB4NzM2ZTQ5NzgsICUlZWR4XG5cdCIKKwkJImpuZSBOb3RTdXBwb3J0ZWQzXG5cdCIKKwkJImNtcGwgJDB4NjQ2MTY1NzQsICUlZWN4XG5cdCIKKwkJImpuZSBOb3RTdXBwb3J0ZWQ0XG5cdCIKKwkJLyogRHJvcCB0aHJvdWdoIHRvIEN5cml4Li4uICovCisKKworCQkvKiBDeXJpeCBTZWN0aW9uICovCisJCS8qIFNlZSBpZiBleHRlbmRlZCBDUFVJRCBpcyBzdXBwb3J0ZWQgKi8KKwkJIm1vdmwgJDB4ODAwMDAwMDAsICUlZWF4XG5cdCIKKwkJImNwdWlkXG5cdCIKKwkJImNtcGwgJDB4ODAwMDAwMDAsICUlZWF4XG5cdCIKKwkJImpsIE1NWHRlc3Rcblx0IgkvKiBUcnkgc3RhbmRhcmQgQ1BVSUQgaW5zdGVhZCAqLworCisJCS8qIEV4dGVuZGVkIENQVUlEIHN1cHBvcnRlZCwgc28gZ2V0IGV4dGVuZGVkIGZlYXR1cmVzICovCisJCSJtb3ZsICQweDgwMDAwMDAxLCAlJWVheFxuXHQiCisJCSJjcHVpZFxuXHQiCisJCSJ0ZXN0bCAkMHgwMDgwMDAwMCwgJSVlYXhcblx0IgkvKiBUZXN0IGZvciBNTVggKi8KKwkJImp6IE5vdFN1cHBvcnRlZDVcblx0IgkJLyogTU1YIG5vdCBzdXBwb3J0ZWQgKi8KKwkJInRlc3RsICQweDAxMDAwMDAwLCAlJWVheFxuXHQiCS8qIFRlc3QgZm9yIEV4dCdkIE1NWCAqLworCQkiam56IEVNTVhTdXBwb3J0ZWRcblx0IgorCQkibW92bCAkMSwgJTBcblxuXHQiCQkvKiBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cbiIKKwkJIkVNTVhTdXBwb3J0ZWQ6XG5cdCIKKwkJIm1vdmwgJDMsICUwXG5cblx0IgkJLyogRU1NWCBhbmQgTU1YIFN1cHBvcnRlZCAqLworCQkiam1wIFJldHVyblxuXHQiCisKKworCQkvKiBBTUQgU2VjdGlvbiAqLworCQkiQU1EOlxuXHQiCisKKwkJLyogU2VlIGlmIGV4dGVuZGVkIENQVUlEIGlzIHN1cHBvcnRlZCAqLworCQkibW92bCAkMHg4MDAwMDAwMCwgJSVlYXhcblx0IgorCQkiY3B1aWRcblx0IgorCQkiY21wbCAkMHg4MDAwMDAwMCwgJSVlYXhcblx0IgorCQkiamwgTU1YdGVzdFxuXHQiCS8qIFRyeSBzdGFuZGFyZCBDUFVJRCBpbnN0ZWFkICovCisKKwkJLyogRXh0ZW5kZWQgQ1BVSUQgc3VwcG9ydGVkLCBzbyBnZXQgZXh0ZW5kZWQgZmVhdHVyZXMgKi8KKwkJIm1vdmwgJDB4ODAwMDAwMDEsICUlZWF4XG5cdCIKKwkJImNwdWlkXG5cdCIKKwkJInRlc3RsICQweDAwODAwMDAwLCAlJWVkeFxuXHQiCS8qIFRlc3QgZm9yIE1NWCAqLworCQkianogTm90U3VwcG9ydGVkNlxuXHQiCQkvKiBNTVggbm90IHN1cHBvcnRlZCAqLworCQkidGVzdGwgJDB4ODAwMDAwMDAsICUlZWR4XG5cdCIJLyogVGVzdCBmb3IgM0ROb3chICovCisJCSJqbnogVGhyZWVETm93U3VwcG9ydGVkXG5cdCIKKwkJIm1vdmwgJDEsICUwXG5cblx0IgkJLyogTU1YIFN1cHBvcnRlZCAqLworCQkiam1wIFJldHVyblxuXG4iCisJCSJUaHJlZUROb3dTdXBwb3J0ZWQ6XG5cdCIKKwkJIm1vdmwgJDUsICUwXG5cblx0IgkJLyogM0ROb3chIGFuZCBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cdCIKKworCisJCS8qIEludGVsIFNlY3Rpb24gKi8KKwkJIkludGVsOlxuXHQiCisKKwkJLyogQ2hlY2sgZm9yIE1NWCAqLworCQkiTU1YdGVzdDpcblx0IgorCQkibW92bCAkMSwgJSVlYXhcblx0IgorCQkiY3B1aWRcblx0IgorCQkidGVzdGwgJDB4MDA4MDAwMDAsICUlZWR4XG5cdCIJLyogVGVzdCBmb3IgTU1YICovCisJCSJqeiBOb3RTdXBwb3J0ZWQ3XG5cdCIJCS8qIE1NWCBOb3Qgc3VwcG9ydGVkICovCisJCSJtb3ZsICQxLCAlMFxuXG5cdCIJCS8qIE1NWCBTdXBwb3J0ZWQgKi8KKwkJImptcCBSZXR1cm5cblx0IgorCisJCS8qIE5vdGhpbmcgc3VwcG9ydGVkICovCisJCSJcbk5vdFN1cHBvcnRlZDE6XG5cdCIKKwkJIiNtb3ZsICQxMDEsICUwXG5cblx0IgorCQkiXG5Ob3RTdXBwb3J0ZWQyOlxuXHQiCisJCSIjbW92bCAkMTAyLCAlMFxuXG5cdCIKKwkJIlxuTm90U3VwcG9ydGVkMzpcblx0IgorCQkiI21vdmwgJDEwMywgJTBcblxuXHQiCisJCSJcbk5vdFN1cHBvcnRlZDQ6XG5cdCIKKwkJIiNtb3ZsICQxMDQsICUwXG5cblx0IgorCQkiXG5Ob3RTdXBwb3J0ZWQ1OlxuXHQiCisJCSIjbW92bCAkMTA1LCAlMFxuXG5cdCIKKwkJIlxuTm90U3VwcG9ydGVkNjpcblx0IgorCQkiI21vdmwgJDEwNiwgJTBcblxuXHQiCisJCSJcbk5vdFN1cHBvcnRlZDc6XG5cdCIKKwkJIiNtb3ZsICQxMDcsICUwXG5cblx0IgorCQkibW92bCAkMCwgJTBcblxuXHQiCisKKwkJIlJldHVybjpcblx0IgorCQk6ICI9YSIgKHJ2YWwpCisJCTogLyogbm8gaW5wdXQgKi8KKwkJOiAiZWF4IiwgImVieCIsICJlY3giLCAiZWR4IgorCSk7CisKKwkvKiBSZXR1cm4gKi8KKwlyZXR1cm4ocnZhbCk7Cit9CisKKy8qCUZ1bmN0aW9uIHRvIHRlc3QgaWYgbW14IGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkLi4uCisqLworc3RhdGljIGlubGluZSBpbnQKK21teF9vayh2b2lkKQoreworCS8qIFJldHVybnMgMSBpZiBNTVggaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQsIDAgb3RoZXJ3aXNlICovCisJcmV0dXJuICggbW1fc3VwcG9ydCgpICYgMHgxICk7Cit9CisKKworLyoJSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIGluc3RydWN0aW9uIG1hY3JvcyB0aGF0IGZvbGxvdy4uLgorCShub3RlIHRoYXQgbWVtb3J5LXRvLXJlZ2lzdGVyLCBtMnIsIGluc3RydWN0aW9ucyBhcmUgbmVhcmx5CisJIGFzIGVmZmljaWVudCBhcyByZWdpc3Rlci10by1yZWdpc3RlciwgcjJyLCBpbnN0cnVjdGlvbnM7CisJIGhvd2V2ZXIsIG1lbW9yeS10by1tZW1vcnkgaW5zdHJ1Y3Rpb25zIGFyZSByZWFsbHkgc2ltdWxhdGVkCisJIGFzIGEgY29udmVuaWVuY2UsIGFuZCBhcmUgb25seSAxLzMgYXMgZWZmaWNpZW50KQorKi8KKyNpZmRlZglNTVhfVFJBQ0UKKworLyoJSW5jbHVkZSB0aGUgc3R1ZmYgZm9yIHByaW50aW5nIGEgdHJhY2UgdG8gc3RkZXJyLi4uCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZQltbXhfaTJyKG9wLCBpbW0sIHJlZykgXAorCXsgXAorCQltbXhfdCBtbXhfdHJhY2U7IFwKKwkJbW14X3RyYWNlID0gKGltbSk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNvcCAiX2kycigiICNpbW0gIj0weCUwMTZsbHgsICIsIG1teF90cmFjZS5xKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWcgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjcmVnICI9MHglMDE2bGx4KSA9PiAiLCBtbXhfdHJhY2UucSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUwLCAlJSIgI3JlZyBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCQkgICAgICA6ICJYIiAoaW1tKSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI3JlZyAiPTB4JTAxNmxseFxuIiwgbW14X3RyYWNlLnEpOyBcCisJfQorCisjZGVmaW5lCW1teF9tMnIob3AsIG1lbSwgcmVnKSBcCisJeyBcCisJCW1teF90IG1teF90cmFjZTsgXAorCQltbXhfdHJhY2UgPSAobWVtKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI29wICJfbTJyKCIgI21lbSAiPTB4JTAxNmxseCwgIiwgbW14X3RyYWNlLnEpOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZyAiLCAlMCIgXAorCQkJCSAgICAgIDogIj1YIiAobW14X3RyYWNlKSBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNyZWcgIj0weCUwMTZsbHgpID0+ICIsIG1teF90cmFjZS5xKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gXAorCQkJCSAgICAgIDogIlgiIChtZW0pKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWcgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjcmVnICI9MHglMDE2bGx4XG4iLCBtbXhfdHJhY2UucSk7IFwKKwl9CisKKyNkZWZpbmUJbW14X3IybShvcCwgcmVnLCBtZW0pIFwKKwl7IFwKKwkJbW14X3QgbW14X3RyYWNlOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZyAiLCAlMCIgXAorCQkJCSAgICAgIDogIj1YIiAobW14X3RyYWNlKSBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNvcCAiX3IybSgiICNyZWcgIj0weCUwMTZsbHgsICIsIG1teF90cmFjZS5xKTsgXAorCQltbXhfdHJhY2UgPSAobWVtKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI21lbSAiPTB4JTAxNmxseCkgPT4gIiwgbW14X3RyYWNlLnEpOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlJSIgI3JlZyAiLCAlMCIgXAorCQkJCSAgICAgIDogIj1YIiAobWVtKSBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKKwkJbW14X3RyYWNlID0gKG1lbSk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNtZW0gIj0weCUwMTZsbHhcbiIsIG1teF90cmFjZS5xKTsgXAorCX0KKworI2RlZmluZQltbXhfcjJyKG9wLCByZWdzLCByZWdkKSBcCisJeyBcCisJCW1teF90IG1teF90cmFjZTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWdzICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI29wICJfcjJyKCIgI3JlZ3MgIj0weCUwMTZsbHgsICIsIG1teF90cmFjZS5xKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWdkICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI3JlZ2QgIj0weCUwMTZsbHgpID0+ICIsIG1teF90cmFjZS5xKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJSIgI3JlZ3MgIiwgJSIgI3JlZ2QpOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZ2QgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjcmVnZCAiPTB4JTAxNmxseFxuIiwgbW14X3RyYWNlLnEpOyBcCisJfQorCisjZGVmaW5lCW1teF9tMm0ob3AsIG1lbXMsIG1lbWQpIFwKKwl7IFwKKwkJbW14X3QgbW14X3RyYWNlOyBcCisJCW1teF90cmFjZSA9IChtZW1zKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI29wICJfbTJtKCIgI21lbXMgIj0weCUwMTZsbHgsICIsIG1teF90cmFjZS5xKTsgXAorCQltbXhfdHJhY2UgPSAobWVtZCk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNtZW1kICI9MHglMDE2bGx4KSA9PiAiLCBtbXhfdHJhY2UucSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUwLCAlJW1tMFxuXHQiIFwKKwkJCQkgICAgICAjb3AgIiAlMSwgJSVtbTBcblx0IiBcCisJCQkJICAgICAgIm1vdnEgJSVtbTAsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtZW1kKSBcCisJCQkJICAgICAgOiAiWCIgKG1lbXMpKTsgXAorCQltbXhfdHJhY2UgPSAobWVtZCk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNtZW1kICI9MHglMDE2bGx4XG4iLCBtbXhfdHJhY2UucSk7IFwKKwl9CisKKyNlbHNlCisKKy8qCVRoZXNlIG1hY3JvcyBhcmUgYSBsb3Qgc2ltcGxlciB3aXRob3V0IHRoZSB0cmFjaW5nLi4uCisqLworCisjZGVmaW5lCW1teF9pMnIob3AsIGltbSwgcmVnKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICQiICNpbW0gIiwgJSUiICNyZWcgXAorCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyk7CisKKyNkZWZpbmUJbW14X20ycihvcCwgbWVtLCByZWcpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCisJCQkgICAgICA6ICJtIiAobWVtKSkKKworI2RlZmluZQltbXhfcjJtKG9wLCByZWcsIG1lbSkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlJSIgI3JlZyAiLCAlMCIgXAorCQkJICAgICAgOiAiPW0iIChtZW0pIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyApCisKKyNkZWZpbmUJbW14X3IycihvcCwgcmVncywgcmVnZCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlIiAjcmVncyAiLCAlIiAjcmVnZCkKKworI2RlZmluZQltbXhfbTJtKG9wLCBtZW1zLCBtZW1kKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUwLCAlJW1tMFxuXHQiIFwKKwkJCSAgICAgICNvcCAiICUxLCAlJW1tMFxuXHQiIFwKKwkJCSAgICAgICJtb3ZxICUlbW0wLCAlMCIgXAorCQkJICAgICAgOiAiPW0iIChtZW1kKSBcCisJCQkgICAgICA6ICJtIiAobWVtcykpCisKKyNlbmRpZgorCisKKy8qCTF4NjQgTU9WZSBRdWFkd29yZAorCSh0aGlzIGlzIGJvdGggYSBsb2FkIGFuZCBhIHN0b3JlLi4uCisJIGluIGZhY3QsIGl0IGlzIHRoZSBvbmx5IHdheSB0byBzdG9yZSkKKyovCisjZGVmaW5lCW1vdnFfbTJyKHZhciwgcmVnKQltbXhfbTJyKG1vdnEsIHZhciwgcmVnKQorI2RlZmluZQltb3ZxX3IybShyZWcsIHZhcikJbW14X3IybShtb3ZxLCByZWcsIHZhcikKKyNkZWZpbmUJbW92cV9yMnIocmVncywgcmVnZCkJbW14X3Iycihtb3ZxLCByZWdzLCByZWdkKQorI2RlZmluZQltb3ZxKHZhcnMsIHZhcmQpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJTEsICUlbW0wXG5cdCIgXAorCQkJICAgICAgIm1vdnEgJSVtbTAsICUwIiBcCisJCQkgICAgICA6ICI9WCIgKHZhcmQpIFwKKwkJCSAgICAgIDogIlgiICh2YXJzKSkKKworCisvKgkxeDMyIE1PVmUgRG91Ymxld29yZAorCShsaWtlIG1vdnEsIHRoaXMgaXMgYm90aCBsb2FkIGFuZCBzdG9yZS4uLgorCSBidXQgaXMgbW9zdCB1c2VmdWwgZm9yIG1vdmluZyB0aGluZ3MgYmV0d2VlbgorCSBtbXggcmVnaXN0ZXJzIGFuZCBvcmRpbmFyeSByZWdpc3RlcnMpCisqLworI2RlZmluZQltb3ZkX20ycih2YXIsIHJlZykJbW14X20ycihtb3ZkLCB2YXIsIHJlZykKKyNkZWZpbmUJbW92ZF9yMm0ocmVnLCB2YXIpCW1teF9yMm0obW92ZCwgcmVnLCB2YXIpCisjZGVmaW5lCW1vdmRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIobW92ZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJbW92ZCh2YXJzLCB2YXJkKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZkICUxLCAlJW1tMFxuXHQiIFwKKwkJCSAgICAgICJtb3ZkICUlbW0wLCAlMCIgXAorCQkJICAgICAgOiAiPVgiICh2YXJkKSBcCisJCQkgICAgICA6ICJYIiAodmFycykpCisKKworLyoJMngzMiwgNHgxNiwgYW5kIDh4OCBQYXJhbGxlbCBBRERzCisqLworI2RlZmluZQlwYWRkZF9tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZGQsIHZhciwgcmVnKQorI2RlZmluZQlwYWRkZF9yMnIocmVncywgcmVnZCkJbW14X3IycihwYWRkZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZGQodmFycywgdmFyZCkJbW14X20ybShwYWRkZCwgdmFycywgdmFyZCkKKworI2RlZmluZQlwYWRkd19tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHcsIHZhciwgcmVnKQorI2RlZmluZQlwYWRkd19yMnIocmVncywgcmVnZCkJbW14X3IycihwYWRkdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZHcodmFycywgdmFyZCkJbW14X20ybShwYWRkdywgdmFycywgdmFyZCkKKworI2RlZmluZQlwYWRkYl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZGIsIHZhciwgcmVnKQorI2RlZmluZQlwYWRkYl9yMnIocmVncywgcmVnZCkJbW14X3IycihwYWRkYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZGIodmFycywgdmFyZCkJbW14X20ybShwYWRkYiwgdmFycywgdmFyZCkKKworCisvKgk0eDE2IGFuZCA4eDggUGFyYWxsZWwgQUREcyB1c2luZyBTYXR1cmF0aW9uIGFyaXRobWV0aWMKKyovCisjZGVmaW5lCXBhZGRzd19tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHN3LCB2YXIsIHJlZykKKyNkZWZpbmUJcGFkZHN3X3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBhZGRzdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZHN3KHZhcnMsIHZhcmQpCW1teF9tMm0ocGFkZHN3LCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBhZGRzYl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHNiLCB2YXIsIHJlZykKKyNkZWZpbmUJcGFkZHNiX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBhZGRzYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZHNiKHZhcnMsIHZhcmQpCW1teF9tMm0ocGFkZHNiLCB2YXJzLCB2YXJkKQorCisKKy8qCTR4MTYgYW5kIDh4OCBQYXJhbGxlbCBBRERzIHVzaW5nIFVuc2lnbmVkIFNhdHVyYXRpb24gYXJpdGhtZXRpYworKi8KKyNkZWZpbmUJcGFkZHVzd19tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHVzdywgdmFyLCByZWcpCisjZGVmaW5lCXBhZGR1c3dfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGFkZHVzdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZHVzdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBhZGR1c3csIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcGFkZHVzYl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHVzYiwgdmFyLCByZWcpCisjZGVmaW5lCXBhZGR1c2JfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGFkZHVzYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZHVzYih2YXJzLCB2YXJkKQltbXhfbTJtKHBhZGR1c2IsIHZhcnMsIHZhcmQpCisKKworLyoJMngzMiwgNHgxNiwgYW5kIDh4OCBQYXJhbGxlbCBTVUJzCisqLworI2RlZmluZQlwc3ViZF9tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YmQsIHZhciwgcmVnKQorI2RlZmluZQlwc3ViZF9yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3ViZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YmQodmFycywgdmFyZCkJbW14X20ybShwc3ViZCwgdmFycywgdmFyZCkKKworI2RlZmluZQlwc3Vid19tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YncsIHZhciwgcmVnKQorI2RlZmluZQlwc3Vid19yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3VidywgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YncodmFycywgdmFyZCkJbW14X20ybShwc3VidywgdmFycywgdmFyZCkKKworI2RlZmluZQlwc3ViYl9tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YmIsIHZhciwgcmVnKQorI2RlZmluZQlwc3ViYl9yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3ViYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YmIodmFycywgdmFyZCkJbW14X20ybShwc3ViYiwgdmFycywgdmFyZCkKKworCisvKgk0eDE2IGFuZCA4eDggUGFyYWxsZWwgU1VCcyB1c2luZyBTYXR1cmF0aW9uIGFyaXRobWV0aWMKKyovCisjZGVmaW5lCXBzdWJzd19tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YnN3LCB2YXIsIHJlZykKKyNkZWZpbmUJcHN1YnN3X3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzdWJzdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YnN3KHZhcnMsIHZhcmQpCW1teF9tMm0ocHN1YnN3LCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBzdWJzYl9tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YnNiLCB2YXIsIHJlZykKKyNkZWZpbmUJcHN1YnNiX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzdWJzYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YnNiKHZhcnMsIHZhcmQpCW1teF9tMm0ocHN1YnNiLCB2YXJzLCB2YXJkKQorCisKKy8qCTR4MTYgYW5kIDh4OCBQYXJhbGxlbCBTVUJzIHVzaW5nIFVuc2lnbmVkIFNhdHVyYXRpb24gYXJpdGhtZXRpYworKi8KKyNkZWZpbmUJcHN1YnVzd19tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YnVzdywgdmFyLCByZWcpCisjZGVmaW5lCXBzdWJ1c3dfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHN1YnVzdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YnVzdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBzdWJ1c3csIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHN1YnVzYl9tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YnVzYiwgdmFyLCByZWcpCisjZGVmaW5lCXBzdWJ1c2JfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHN1YnVzYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YnVzYih2YXJzLCB2YXJkKQltbXhfbTJtKHBzdWJ1c2IsIHZhcnMsIHZhcmQpCisKKworLyoJNHgxNiBQYXJhbGxlbCBNVUxzIGdpdmluZyBMb3cgNHgxNiBwb3J0aW9ucyBvZiByZXN1bHRzCisqLworI2RlZmluZQlwbXVsbHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBtdWxsdywgdmFyLCByZWcpCisjZGVmaW5lCXBtdWxsd19yMnIocmVncywgcmVnZCkJbW14X3IycihwbXVsbHcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBtdWxsdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBtdWxsdywgdmFycywgdmFyZCkKKworCisvKgk0eDE2IFBhcmFsbGVsIE1VTHMgZ2l2aW5nIEhpZ2ggNHgxNiBwb3J0aW9ucyBvZiByZXN1bHRzCisqLworI2RlZmluZQlwbXVsaHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBtdWxodywgdmFyLCByZWcpCisjZGVmaW5lCXBtdWxod19yMnIocmVncywgcmVnZCkJbW14X3IycihwbXVsaHcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBtdWxodyh2YXJzLCB2YXJkKQltbXhfbTJtKHBtdWxodywgdmFycywgdmFyZCkKKworCisvKgk0eDE2LT4yeDMyIFBhcmFsbGVsIE11bC1BREQKKwkobXVscyBsaWtlIHBtdWxsdywgdGhlbiBhZGRzIGFkamFjZW50IDE2LWJpdCBmaWVsZHMKKwkgaW4gdGhlIG11bHRpcGx5IHJlc3VsdCB0byBtYWtlIHRoZSBmaW5hbCAyeDMyIHJlc3VsdCkKKyovCisjZGVmaW5lCXBtYWRkd2RfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBtYWRkd2QsIHZhciwgcmVnKQorI2RlZmluZQlwbWFkZHdkX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBtYWRkd2QsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBtYWRkd2QodmFycywgdmFyZCkJbW14X20ybShwbWFkZHdkLCB2YXJzLCB2YXJkKQorCisKKy8qCTF4NjQgYml0d2lzZSBBTkQKKyovCisjaWZkZWYJQlJPS0VOX1BBTkQKKyNkZWZpbmUJcGFuZF9tMnIodmFyLCByZWcpIFwKKwl7IFwKKwkJbW14X20ycihwYW5kbiwgKG1teF90KSAtMUxMLCByZWcpOyBcCisJCW1teF9tMnIocGFuZG4sIHZhciwgcmVnKTsgXAorCX0KKyNkZWZpbmUJcGFuZF9yMnIocmVncywgcmVnZCkgXAorCXsgXAorCQltbXhfbTJyKHBhbmRuLCAobW14X3QpIC0xTEwsIHJlZ2QpOyBcCisJCW1teF9yMnIocGFuZG4sIHJlZ3MsIHJlZ2QpOyBcCisJfQorI2RlZmluZQlwYW5kKHZhcnMsIHZhcmQpIFwKKwl7IFwKKwkJbW92cV9tMnIodmFyZCwgbW0wKTsgXAorCQltbXhfbTJyKHBhbmRuLCAobW14X3QpIC0xTEwsIG1tMCk7IFwKKwkJbW14X20ycihwYW5kbiwgdmFycywgbW0wKTsgXAorCQltb3ZxX3IybShtbTAsIHZhcmQpOyBcCisJfQorI2Vsc2UKKyNkZWZpbmUJcGFuZF9tMnIodmFyLCByZWcpCW1teF9tMnIocGFuZCwgdmFyLCByZWcpCisjZGVmaW5lCXBhbmRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGFuZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFuZCh2YXJzLCB2YXJkKQltbXhfbTJtKHBhbmQsIHZhcnMsIHZhcmQpCisjZW5kaWYKKworCisvKgkxeDY0IGJpdHdpc2UgQU5EIHdpdGggTm90IHRoZSBkZXN0aW5hdGlvbgorKi8KKyNkZWZpbmUJcGFuZG5fbTJyKHZhciwgcmVnKQltbXhfbTJyKHBhbmRuLCB2YXIsIHJlZykKKyNkZWZpbmUJcGFuZG5fcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGFuZG4sIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBhbmRuKHZhcnMsIHZhcmQpCW1teF9tMm0ocGFuZG4sIHZhcnMsIHZhcmQpCisKKworLyoJMXg2NCBiaXR3aXNlIE9SCisqLworI2RlZmluZQlwb3JfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBvciwgdmFyLCByZWcpCisjZGVmaW5lCXBvcl9yMnIocmVncywgcmVnZCkJbW14X3Iycihwb3IsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBvcih2YXJzLCB2YXJkKQltbXhfbTJtKHBvciwgdmFycywgdmFyZCkKKworCisvKgkxeDY0IGJpdHdpc2UgZVhjbHVzaXZlIE9SCisqLworI2RlZmluZQlweG9yX20ycih2YXIsIHJlZykJbW14X20ycihweG9yLCB2YXIsIHJlZykKKyNkZWZpbmUJcHhvcl9yMnIocmVncywgcmVnZCkJbW14X3IycihweG9yLCByZWdzLCByZWdkKQorI2RlZmluZQlweG9yKHZhcnMsIHZhcmQpCW1teF9tMm0ocHhvciwgdmFycywgdmFyZCkKKworCisvKgkyeDMyLCA0eDE2LCBhbmQgOHg4IFBhcmFsbGVsIENvTVBhcmUgZm9yIEVRdWFsaXR5CisJKHJlc3VsdGluZyBmaWVsZHMgYXJlIGVpdGhlciAwIG9yIC0xKQorKi8KKyNkZWZpbmUJcGNtcGVxZF9tMnIodmFyLCByZWcpCW1teF9tMnIocGNtcGVxZCwgdmFyLCByZWcpCisjZGVmaW5lCXBjbXBlcWRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGNtcGVxZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGNtcGVxZCh2YXJzLCB2YXJkKQltbXhfbTJtKHBjbXBlcWQsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcGNtcGVxd19tMnIodmFyLCByZWcpCW1teF9tMnIocGNtcGVxdywgdmFyLCByZWcpCisjZGVmaW5lCXBjbXBlcXdfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGNtcGVxdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcGNtcGVxdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBjbXBlcXcsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcGNtcGVxYl9tMnIodmFyLCByZWcpCW1teF9tMnIocGNtcGVxYiwgdmFyLCByZWcpCisjZGVmaW5lCXBjbXBlcWJfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGNtcGVxYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGNtcGVxYih2YXJzLCB2YXJkKQltbXhfbTJtKHBjbXBlcWIsIHZhcnMsIHZhcmQpCisKKworLyoJMngzMiwgNHgxNiwgYW5kIDh4OCBQYXJhbGxlbCBDb01QYXJlIGZvciBHcmVhdGVyIFRoYW4KKwkocmVzdWx0aW5nIGZpZWxkcyBhcmUgZWl0aGVyIDAgb3IgLTEpCisqLworI2RlZmluZQlwY21wZ3RkX20ycih2YXIsIHJlZykJbW14X20ycihwY21wZ3RkLCB2YXIsIHJlZykKKyNkZWZpbmUJcGNtcGd0ZF9yMnIocmVncywgcmVnZCkJbW14X3IycihwY21wZ3RkLCByZWdzLCByZWdkKQorI2RlZmluZQlwY21wZ3RkKHZhcnMsIHZhcmQpCW1teF9tMm0ocGNtcGd0ZCwgdmFycywgdmFyZCkKKworI2RlZmluZQlwY21wZ3R3X20ycih2YXIsIHJlZykJbW14X20ycihwY21wZ3R3LCB2YXIsIHJlZykKKyNkZWZpbmUJcGNtcGd0d19yMnIocmVncywgcmVnZCkJbW14X3IycihwY21wZ3R3LCByZWdzLCByZWdkKQorI2RlZmluZQlwY21wZ3R3KHZhcnMsIHZhcmQpCW1teF9tMm0ocGNtcGd0dywgdmFycywgdmFyZCkKKworI2RlZmluZQlwY21wZ3RiX20ycih2YXIsIHJlZykJbW14X20ycihwY21wZ3RiLCB2YXIsIHJlZykKKyNkZWZpbmUJcGNtcGd0Yl9yMnIocmVncywgcmVnZCkJbW14X3IycihwY21wZ3RiLCByZWdzLCByZWdkKQorI2RlZmluZQlwY21wZ3RiKHZhcnMsIHZhcmQpCW1teF9tMm0ocGNtcGd0YiwgdmFycywgdmFyZCkKKworCisvKgkxeDY0LCAyeDMyLCBhbmQgNHgxNiBQYXJhbGxlbCBTaGlmdCBMZWZ0IExvZ2ljYWwKKyovCisjZGVmaW5lCXBzbGxxX2kycihpbW0sIHJlZykJbW14X2kycihwc2xscSwgaW1tLCByZWcpCisjZGVmaW5lCXBzbGxxX20ycih2YXIsIHJlZykJbW14X20ycihwc2xscSwgdmFyLCByZWcpCisjZGVmaW5lCXBzbGxxX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzbGxxLCByZWdzLCByZWdkKQorI2RlZmluZQlwc2xscSh2YXJzLCB2YXJkKQltbXhfbTJtKHBzbGxxLCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBzbGxkX2kycihpbW0sIHJlZykJbW14X2kycihwc2xsZCwgaW1tLCByZWcpCisjZGVmaW5lCXBzbGxkX20ycih2YXIsIHJlZykJbW14X20ycihwc2xsZCwgdmFyLCByZWcpCisjZGVmaW5lCXBzbGxkX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzbGxkLCByZWdzLCByZWdkKQorI2RlZmluZQlwc2xsZCh2YXJzLCB2YXJkKQltbXhfbTJtKHBzbGxkLCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBzbGx3X2kycihpbW0sIHJlZykJbW14X2kycihwc2xsdywgaW1tLCByZWcpCisjZGVmaW5lCXBzbGx3X20ycih2YXIsIHJlZykJbW14X20ycihwc2xsdywgdmFyLCByZWcpCisjZGVmaW5lCXBzbGx3X3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzbGx3LCByZWdzLCByZWdkKQorI2RlZmluZQlwc2xsdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBzbGx3LCB2YXJzLCB2YXJkKQorCisKKy8qCTF4NjQsIDJ4MzIsIGFuZCA0eDE2IFBhcmFsbGVsIFNoaWZ0IFJpZ2h0IExvZ2ljYWwKKyovCisjZGVmaW5lCXBzcmxxX2kycihpbW0sIHJlZykJbW14X2kycihwc3JscSwgaW1tLCByZWcpCisjZGVmaW5lCXBzcmxxX20ycih2YXIsIHJlZykJbW14X20ycihwc3JscSwgdmFyLCByZWcpCisjZGVmaW5lCXBzcmxxX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzcmxxLCByZWdzLCByZWdkKQorI2RlZmluZQlwc3JscSh2YXJzLCB2YXJkKQltbXhfbTJtKHBzcmxxLCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBzcmxkX2kycihpbW0sIHJlZykJbW14X2kycihwc3JsZCwgaW1tLCByZWcpCisjZGVmaW5lCXBzcmxkX20ycih2YXIsIHJlZykJbW14X20ycihwc3JsZCwgdmFyLCByZWcpCisjZGVmaW5lCXBzcmxkX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzcmxkLCByZWdzLCByZWdkKQorI2RlZmluZQlwc3JsZCh2YXJzLCB2YXJkKQltbXhfbTJtKHBzcmxkLCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBzcmx3X2kycihpbW0sIHJlZykJbW14X2kycihwc3JsdywgaW1tLCByZWcpCisjZGVmaW5lCXBzcmx3X20ycih2YXIsIHJlZykJbW14X20ycihwc3JsdywgdmFyLCByZWcpCisjZGVmaW5lCXBzcmx3X3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzcmx3LCByZWdzLCByZWdkKQorI2RlZmluZQlwc3Jsdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBzcmx3LCB2YXJzLCB2YXJkKQorCisKKy8qCTJ4MzIgYW5kIDR4MTYgUGFyYWxsZWwgU2hpZnQgUmlnaHQgQXJpdGhtZXRpYworKi8KKyNkZWZpbmUJcHNyYWRfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzcmFkLCBpbW0sIHJlZykKKyNkZWZpbmUJcHNyYWRfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzcmFkLCB2YXIsIHJlZykKKyNkZWZpbmUJcHNyYWRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNyYWQsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzcmFkKHZhcnMsIHZhcmQpCW1teF9tMm0ocHNyYWQsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHNyYXdfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzcmF3LCBpbW0sIHJlZykKKyNkZWZpbmUJcHNyYXdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzcmF3LCB2YXIsIHJlZykKKyNkZWZpbmUJcHNyYXdfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNyYXcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzcmF3KHZhcnMsIHZhcmQpCW1teF9tMm0ocHNyYXcsIHZhcnMsIHZhcmQpCisKKworLyoJMngzMi0+NHgxNiBhbmQgNHgxNi0+OHg4IFBBQ0sgYW5kIFNpZ25lZCBTYXR1cmF0ZQorCShwYWNrcyBzb3VyY2UgYW5kIGRlc3QgZmllbGRzIGludG8gZGVzdCBpbiB0aGF0IG9yZGVyKQorKi8KKyNkZWZpbmUJcGFja3NzZHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBhY2tzc2R3LCB2YXIsIHJlZykKKyNkZWZpbmUJcGFja3NzZHdfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocGFja3NzZHcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBhY2tzc2R3KHZhcnMsIHZhcmQpCW1teF9tMm0ocGFja3NzZHcsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcGFja3Nzd2JfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBhY2tzc3diLCB2YXIsIHJlZykKKyNkZWZpbmUJcGFja3Nzd2JfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocGFja3Nzd2IsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBhY2tzc3diKHZhcnMsIHZhcmQpCW1teF9tMm0ocGFja3Nzd2IsIHZhcnMsIHZhcmQpCisKKworLyoJNHgxNi0+OHg4IFBBQ0sgYW5kIFVuc2lnbmVkIFNhdHVyYXRlCisJKHBhY2tzIHNvdXJjZSBhbmQgZGVzdCBmaWVsZHMgaW50byBkZXN0IGluIHRoYXQgb3JkZXIpCisqLworI2RlZmluZQlwYWNrdXN3Yl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFja3Vzd2IsIHZhciwgcmVnKQorI2RlZmluZQlwYWNrdXN3Yl9yMnIocmVncywgcmVnZCkgbW14X3IycihwYWNrdXN3YiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFja3Vzd2IodmFycywgdmFyZCkJbW14X20ybShwYWNrdXN3YiwgdmFycywgdmFyZCkKKworCisvKgkyeDMyLT4xeDY0LCA0eDE2LT4yeDMyLCBhbmQgOHg4LT40eDE2IFVOUGFDSyBMb3cKKwkoaW50ZXJsZWF2ZXMgbG93IGhhbGYgb2YgZGVzdCB3aXRoIGxvdyBoYWxmIG9mIHNvdXJjZQorCSBhcyBwYWRkaW5nIGluIGVhY2ggcmVzdWx0IGZpZWxkKQorKi8KKyNkZWZpbmUJcHVucGNrbGRxX20ycih2YXIsIHJlZykJbW14X20ycihwdW5wY2tsZHEsIHZhciwgcmVnKQorI2RlZmluZQlwdW5wY2tsZHFfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocHVucGNrbGRxLCByZWdzLCByZWdkKQorI2RlZmluZQlwdW5wY2tsZHEodmFycywgdmFyZCkJbW14X20ybShwdW5wY2tsZHEsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHVucGNrbHdkX20ycih2YXIsIHJlZykJbW14X20ycihwdW5wY2tsd2QsIHZhciwgcmVnKQorI2RlZmluZQlwdW5wY2tsd2RfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocHVucGNrbHdkLCByZWdzLCByZWdkKQorI2RlZmluZQlwdW5wY2tsd2QodmFycywgdmFyZCkJbW14X20ybShwdW5wY2tsd2QsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHVucGNrbGJ3X20ycih2YXIsIHJlZykJbW14X20ycihwdW5wY2tsYncsIHZhciwgcmVnKQorI2RlZmluZQlwdW5wY2tsYndfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocHVucGNrbGJ3LCByZWdzLCByZWdkKQorI2RlZmluZQlwdW5wY2tsYncodmFycywgdmFyZCkJbW14X20ybShwdW5wY2tsYncsIHZhcnMsIHZhcmQpCisKKworLyoJMngzMi0+MXg2NCwgNHgxNi0+MngzMiwgYW5kIDh4OC0+NHgxNiBVTlBhQ0sgSGlnaAorCShpbnRlcmxlYXZlcyBoaWdoIGhhbGYgb2YgZGVzdCB3aXRoIGhpZ2ggaGFsZiBvZiBzb3VyY2UKKwkgYXMgcGFkZGluZyBpbiBlYWNoIHJlc3VsdCBmaWVsZCkKKyovCisjZGVmaW5lCXB1bnBja2hkcV9tMnIodmFyLCByZWcpCW1teF9tMnIocHVucGNraGRxLCB2YXIsIHJlZykKKyNkZWZpbmUJcHVucGNraGRxX3IycihyZWdzLCByZWdkKSBtbXhfcjJyKHB1bnBja2hkcSwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHVucGNraGRxKHZhcnMsIHZhcmQpCW1teF9tMm0ocHVucGNraGRxLCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXB1bnBja2h3ZF9tMnIodmFyLCByZWcpCW1teF9tMnIocHVucGNraHdkLCB2YXIsIHJlZykKKyNkZWZpbmUJcHVucGNraHdkX3IycihyZWdzLCByZWdkKSBtbXhfcjJyKHB1bnBja2h3ZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHVucGNraHdkKHZhcnMsIHZhcmQpCW1teF9tMm0ocHVucGNraHdkLCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXB1bnBja2hid19tMnIodmFyLCByZWcpCW1teF9tMnIocHVucGNraGJ3LCB2YXIsIHJlZykKKyNkZWZpbmUJcHVucGNraGJ3X3IycihyZWdzLCByZWdkKSBtbXhfcjJyKHB1bnBja2hidywgcmVncywgcmVnZCkKKyNkZWZpbmUJcHVucGNraGJ3KHZhcnMsIHZhcmQpCW1teF9tMm0ocHVucGNraGJ3LCB2YXJzLCB2YXJkKQorCisKKy8qCUVtcHR5IE1NeCBTdGF0ZQorCSh1c2VkIHRvIGNsZWFuLXVwIHdoZW4gZ29pbmcgZnJvbSBtbXggdG8gZmxvYXQgdXNlCisJIG9mIHRoZSByZWdpc3RlcnMgdGhhdCBhcmUgc2hhcmVkIGJ5IGJvdGg7IG5vdGUgdGhhdAorCSB0aGVyZSBpcyBubyBmbG9hdC10by1tbXggb3BlcmF0aW9uIG5lZWRlZCwgYmVjYXVzZQorCSBvbmx5IHRoZSBmbG9hdCB0YWcgd29yZCBpbmZvIGlzIGNvcnJ1cHRpYmxlKQorKi8KKyNpZmRlZglNTVhfVFJBQ0UKKworI2RlZmluZQllbW1zKCkgXAorCXsgXAorCQlmcHJpbnRmKHN0ZGVyciwgImVtbXMoKVxuIik7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlbW1zIik7IFwKKwl9CisKKyNlbHNlCisKKyNkZWZpbmUJZW1tcygpCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlbW1zIikKKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9wbHVnaW5zLmggYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3BsdWdpbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODA4NWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9wbHVnaW5zLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBCaWxseSBCaWdncyA8dmVrdG9yQGR1bWJ0ZXJtLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0Bjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIFJlbGljZW5zZWQgZm9yIEdTdHJlYW1lciBmcm9tIEdQTCB0byBMR1BMIHdpdGggcGVybWl0IGZyb20gQmlsbHkgQmlnZ3MuCisgKiBTZWU6IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTE2MzU3OAorICovCisKKyNpZm5kZWYgVFZUSU1FX1BMVUdJTlNfSF9JTkNMVURFRAorI2RlZmluZSBUVlRJTUVfUExVR0lOU19IX0lOQ0xVREVECisKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfVE9NU01PQ09NUCAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF90b21zbW9jb21wX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfVFlQRV9ERUlOVEVSTEFDRV9HUkVFRFlfSCAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfaF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfR1JFRURZX0wgKGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2xfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9UWVBFX0RFSU5URVJMQUNFX1ZGSVIgKGdzdF9kZWludGVybGFjZV9tZXRob2RfdmZpcl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTElORUFSIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTElORUFSX0JMRU5EIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9ibGVuZF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfU0NBTEVSX0JPQiAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9zY2FsZXJfYm9iX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfVFlQRV9ERUlOVEVSTEFDRV9XRUFWRSAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF93ZWF2ZV9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfV0VBVkVfVEZGIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3dlYXZlX3RmZl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfV0VBVkVfQkZGIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3dlYXZlX2JmZl9nZXRfdHlwZSAoKSkKKworR1R5cGUgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF90b21zbW9jb21wX2dldF90eXBlICh2b2lkKTsKK0dUeXBlIGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2hfZ2V0X3R5cGUgKHZvaWQpOworR1R5cGUgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfbF9nZXRfdHlwZSAodm9pZCk7CitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3ZmaXJfZ2V0X3R5cGUgKHZvaWQpOworCitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9nZXRfdHlwZSAodm9pZCk7CitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9ibGVuZF9nZXRfdHlwZSAodm9pZCk7CitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3NjYWxlcl9ib2JfZ2V0X3R5cGUgKHZvaWQpOworR1R5cGUgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF93ZWF2ZV9nZXRfdHlwZSAodm9pZCk7CitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3dlYXZlX3RmZl9nZXRfdHlwZSAodm9pZCk7CitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3dlYXZlX2JmZl9nZXRfdHlwZSAodm9pZCk7CisKKyNlbmRpZiAvKiBUVlRJTUVfUExVR0lOU19IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3NjYWxlcmJvYi5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9zY2FsZXJib2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDIwYmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9zY2FsZXJib2IuYwpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIERvdWJsZSBsaW5lcworICogQ29weXJpZ2h0IChDKSAyMDA4LDIwMTAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdGRlaW50ZXJsYWNlbWV0aG9kLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1NDQUxFUl9CT0IJKGdzdF9kZWludGVybGFjZV9tZXRob2Rfc2NhbGVyX2JvYl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9TQ0FMRVJfQk9CKG9iaikJCShHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9TQ0FMRVJfQk9CKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9TQ0FMRVJfQk9CX0NMQVNTKGtsYXNzKQkoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9TQ0FMRVJfQk9CKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9TQ0FMRVJfQk9CX0dFVF9DTEFTUyhvYmopCShHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1NDQUxFUl9CT0IsIEdzdERlaW50ZXJsYWNlTWV0aG9kU2NhbGVyQm9iQ2xhc3MpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX1NDQUxFUl9CT0Iob2JqKQkJKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1NDQUxFUl9CT0IsIEdzdERlaW50ZXJsYWNlTWV0aG9kU2NhbGVyQm9iKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9TQ0FMRVJfQk9CX0NMQVNTKGtsYXNzKQkoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9TQ0FMRVJfQk9CLCBHc3REZWludGVybGFjZU1ldGhvZFNjYWxlckJvYkNsYXNzKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9TQ0FMRVJfQk9CX0NBU1Qob2JqKQkoKEdzdERlaW50ZXJsYWNlTWV0aG9kU2NhbGVyQm9iKikob2JqKSkKKworR1R5cGUgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9zY2FsZXJfYm9iX2dldF90eXBlICh2b2lkKTsKKwordHlwZWRlZiBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCBHc3REZWludGVybGFjZU1ldGhvZFNjYWxlckJvYjsKK3R5cGVkZWYgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RDbGFzcyBHc3REZWludGVybGFjZU1ldGhvZFNjYWxlckJvYkNsYXNzOworCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT50MCwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9zY2FubGluZV9zY2FsZXJfYm9iX3BsYW5hcl95IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+dDAsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wbGFuYXJfdSAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPnQwLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX3NjYWxlcl9ib2JfcGxhbmFyX3YgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT50MCwgc2l6ZSk7Cit9CisKK0dfREVGSU5FX1RZUEUgKEdzdERlaW50ZXJsYWNlTWV0aG9kU2NhbGVyQm9iLCBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3NjYWxlcl9ib2IsCisgICAgR1NUX1RZUEVfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3NjYWxlcl9ib2JfY2xhc3NfaW5pdCAoR3N0RGVpbnRlcmxhY2VNZXRob2RTY2FsZXJCb2JDbGFzcworICAgICoga2xhc3MpCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKmRpbV9jbGFzcyA9IChHc3REZWludGVybGFjZU1ldGhvZENsYXNzICopIGtsYXNzOworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzICpkaXNtX2NsYXNzID0KKyAgICAgIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzICopIGtsYXNzOworCisgIGRpbV9jbGFzcy0+ZmllbGRzX3JlcXVpcmVkID0gMjsKKyAgZGltX2NsYXNzLT5uYW1lID0gIkRvdWJsZSBsaW5lcyI7CisgIGRpbV9jbGFzcy0+bmljayA9ICJzY2FsZXJib2IiOworICBkaW1fY2xhc3MtPmxhdGVuY3kgPSAxOworCisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2F5dXYgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3l1eTIgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3l2eXUgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3V5dnkgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX252MTIgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX252MjEgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2FyZ2IgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2FiZ3IgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3JnYmEgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2JncmEgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3JnYiA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3NjYWxlcl9ib2JfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3IgPSBkZWludGVybGFjZV9zY2FubGluZV9zY2FsZXJfYm9iX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3kgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wbGFuYXJfeTsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3UgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wbGFuYXJfdTsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3YgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wbGFuYXJfdjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2Rfc2NhbGVyX2JvYl9pbml0IChHc3REZWludGVybGFjZU1ldGhvZFNjYWxlckJvYiAqIHNlbGYpCit7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3NzZS5oIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9zc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTAwZWUwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9zc2UuaApAQCAtMCwwICsxLDk5MiBAQAorLyoJc3NlLmgKKworCVN0cmVhbWluZyBTSU1EIEV4dGVuc3Rpb25zIChhLmsuYS4gS2F0bWFpIE5ldyBJbnN0cnVjdGlvbnMpCisJR0NDIGludGVyZmFjZSBsaWJyYXJ5IGZvciBJQTMyLgorCisJVG8gdXNlIHRoaXMgbGlicmFyeSwgc2ltcGx5IGluY2x1ZGUgdGhpcyBoZWFkZXIgZmlsZQorCWFuZCBjb21waWxlIHdpdGggR0NDLiAgWW91IE1VU1QgaGF2ZSBpbmxpbmluZyBlbmFibGVkCisJaW4gb3JkZXIgZm9yIHNzZV9vaygpIHRvIHdvcms7IHRoaXMgY2FuIGJlIGRvbmUgYnkKKwlzaW1wbHkgdXNpbmcgLU8gb24gdGhlIEdDQyBjb21tYW5kIGxpbmUuCisKKwlDb21waWxpbmcgd2l0aCAtRFNTRV9UUkFDRSB3aWxsIGNhdXNlIGRldGFpbGVkIHRyYWNlCisJb3V0cHV0IHRvIGJlIHNlbnQgdG8gc3RkZXJyIGZvciBlYWNoIHNzZSBvcGVyYXRpb24uCisJVGhpcyBhZGRzIGxvdHMgb2YgY29kZSwgYW5kIG9idmlvdXNseSBzbG93cyBleGVjdXRpb24gdG8KKwlhIGNyYXdsLCBidXQgY2FuIGJlIHZlcnkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuCisKKwlUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkKKwlFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUCisJTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKKwlBTkQgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworCTE5OTkgYnkgUi4gRmlzaGVyCisJQmFzZWQgb24gbGlibW14IGJ5IEguIERpZXR6IGFuZCBSLiBGaXNoZXIKKworIE5vdGVzOgorCVRoaXMgaXMgc3RpbGwgZXh0cmVtZWx5IGFscGhhLgorCUJlY2F1c2UgdGhpcyBsaWJyYXJ5IGRlcGVuZHMgb24gYW4gYXNzZW1ibGVyIHdoaWNoIHVuZGVyc3RhbmRzIHRoZQorCSBTU0Ugb3Bjb2RlcywgeW91IHByb2JhYmx5IHdvbid0IGJlIGFibGUgdG8gdXNlIHRoaXMgeWV0LgorCUZvciBub3csIGRvIG5vdCB1c2UgVFJBQ0UgdmVyc2lvbnMuICBUaGVzZSBib3RoIG1ha2UgdXNlCisJIG9mIHRoZSBNTVggcmVnaXN0ZXJzLCBub3QgdGhlIFNTRSByZWdpc3RlcnMuICBUaGlzIHdpbGwgYmUgcmVzb2x2ZWQKKwkgYXQgYSBsYXRlciBkYXRlLgorIFRvRG86CisJUmV3cml0ZSBUUkFDRSBtYWNyb3MKKwlNYWpvciBEZWJ1Z2dpbmcgV29yaworKi8KKworI2lmbmRlZiBfU1NFX0gKKyNkZWZpbmUgX1NTRV9ICisKKworCisvKglUaGUgdHlwZSBvZiBhbiB2YWx1ZSB0aGF0IGZpdHMgaW4gYW4gU1NFIHJlZ2lzdGVyCisJKG5vdGUgdGhhdCBsb25nIGxvbmcgY29uc3RhbnQgdmFsdWVzIE1VU1QgYmUgc3VmZml4ZWQKKwkgYnkgTEwgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZXMgYnkgVUxMLCBsZXN0CisJIHRoZXkgYmUgdHJ1bmNhdGVkIGJ5IHRoZSBjb21waWxlcikKKyovCit0eXBlZGVmCXVuaW9uIHsKKwlmbG9hdAkJCXNmWzRdOwkvKiBTaW5nbGUtcHJlY2lzaW9uICgzMi1iaXQpIHZhbHVlICovCit9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkICgxNikpKSBzc2VfdDsJLyogT24gYSAxNiBieXRlICgxMjgtYml0KSBib3VuZGFyeSAqLworCisKKyNpZiAwCisvKglGdW5jdGlvbiB0byB0ZXN0IGlmIG11bHRpbWVkaWEgaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQuLi4KKyovCitpbmxpbmUgZXh0ZXJuIGludAorbW1fc3VwcG9ydCh2b2lkKQoreworCS8qIFJldHVybnMgMSBpZiBNTVggaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQsCisJICAgMyBpZiBDeXJpeCBNTVggYW5kIEV4dGVuZGVkIE1NWCBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZAorCSAgIDUgaWYgQU1EIE1NWCBhbmQgM0ROb3chIGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkCisJICAgOSBpZiBNTVggYW5kIFNTRSBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZAorCSAgIDAgaWYgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBhbnkgb2YgdGhlc2UKKwkqLworCXJlZ2lzdGVyIGludCBydmFsID0gMDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJLyogU2VlIGlmIENQVUlEIGluc3RydWN0aW9uIGlzIHN1cHBvcnRlZCAuLi4gKi8KKwkJLyogLi4uIEdldCBjb3BpZXMgb2YgRUZMQUdTIGludG8gZWF4IGFuZCBlY3ggKi8KKwkJInB1c2hmXG5cdCIKKwkJInBvcGwgJSVlYXhcblx0IgorCQkibW92bCAlJWVheCwgJSVlY3hcblx0IgorCisJCS8qIC4uLiBUb2dnbGUgdGhlIElEIGJpdCBpbiBvbmUgY29weSBhbmQgc3RvcmUgKi8KKwkJLyogICAgIHRvIHRoZSBFRkxBR1MgcmVnICovCisJCSJ4b3JsICQweDIwMDAwMCwgJSVlYXhcblx0IgorCQkicHVzaCAlJWVheFxuXHQiCisJCSJwb3BmXG5cdCIKKworCQkvKiAuLi4gR2V0IHRoZSAoaG9wZWZ1bGx5IG1vZGlmaWVkKSBFRkxBR1MgKi8KKwkJInB1c2hmXG5cdCIKKwkJInBvcGwgJSVlYXhcblx0IgorCisJCS8qIC4uLiBDb21wYXJlIGFuZCB0ZXN0IHJlc3VsdCAqLworCQkieG9ybCAlJWVheCwgJSVlY3hcblx0IgorCQkidGVzdGwgJDB4MjAwMDAwLCAlJWVjeFxuXHQiCisJCSJqeiBOb3RTdXBwb3J0ZWQxXG5cdCIJCS8qIENQVUlEIG5vdCBzdXBwb3J0ZWQgKi8KKworCisJCS8qIEdldCBzdGFuZGFyZCBDUFVJRCBpbmZvcm1hdGlvbiwgYW5kCisJCSAgICAgICBnbyB0byBhIHNwZWNpZmljIHZlbmRvciBzZWN0aW9uICovCisJCSJtb3ZsICQwLCAlJWVheFxuXHQiCisJCSJjcHVpZFxuXHQiCisKKwkJLyogQ2hlY2sgZm9yIEludGVsICovCisJCSJjbXBsICQweDc1NmU2NTQ3LCAlJWVieFxuXHQiCisJCSJqbmUgVHJ5QU1EXG5cdCIKKwkJImNtcGwgJDB4NDk2NTZlNjksICUlZWR4XG5cdCIKKwkJImpuZSBUcnlBTURcblx0IgorCQkiY21wbCAkMHg2YzY1NzQ2ZSwgJSVlY3hcbiIKKwkJImpuZSBUcnlBTURcblx0IgorCQkiam1wIEludGVsXG5cdCIKKworCQkvKiBDaGVjayBmb3IgQU1EICovCisJCSJcblRyeUFNRDpcblx0IgorCQkiY21wbCAkMHg2ODc0NzU0MSwgJSVlYnhcblx0IgorCQkiam5lIFRyeUN5cml4XG5cdCIKKwkJImNtcGwgJDB4Njk3NDZlNjUsICUlZWR4XG5cdCIKKwkJImpuZSBUcnlDeXJpeFxuXHQiCisJCSJjbXBsICQweDQ0NGQ0MTYzLCAlJWVjeFxuIgorCQkiam5lIFRyeUN5cml4XG5cdCIKKwkJImptcCBBTURcblx0IgorCisJCS8qIENoZWNrIGZvciBDeXJpeCAqLworCQkiXG5UcnlDeXJpeDpcblx0IgorCQkiY21wbCAkMHg2OTcyNzk0MywgJSVlYnhcblx0IgorCQkiam5lIE5vdFN1cHBvcnRlZDJcblx0IgorCQkiY21wbCAkMHg3MzZlNDk3OCwgJSVlZHhcblx0IgorCQkiam5lIE5vdFN1cHBvcnRlZDNcblx0IgorCQkiY21wbCAkMHg2NDYxNjU3NCwgJSVlY3hcblx0IgorCQkiam5lIE5vdFN1cHBvcnRlZDRcblx0IgorCQkvKiBEcm9wIHRocm91Z2ggdG8gQ3lyaXguLi4gKi8KKworCisJCS8qIEN5cml4IFNlY3Rpb24gKi8KKwkJLyogU2VlIGlmIGV4dGVuZGVkIENQVUlEIGxldmVsIDgwMDAwMDAxIGlzIHN1cHBvcnRlZCAqLworCQkvKiBUaGUgdmFsdWUgb2YgQ1BVSUQvODAwMDAwMDEgZm9yIHRoZSA2eDg2TVggaXMgdW5kZWZpbmVkCisJCSAgIGFjY29yZGluZyB0byB0aGUgQ3lyaXggQ1BVIERldGVjdGlvbiBHdWlkZSAoUHJlbGltaW5hcnkKKwkJICAgUmV2LiAxLjAxIHRhYmxlIDEpLCBzbyB3ZSdsbCBjaGVjayB0aGUgdmFsdWUgb2YgZWF4IGZvcgorCQkgICBDUFVJRC8wIHRvIHNlZSBpZiBzdGFuZGFyZCBDUFVJRCBsZXZlbCAyIGlzIHN1cHBvcnRlZC4KKwkJICAgQWNjb3JkaW5nIHRvIHRoZSB0YWJsZSwgdGhlIG9ubHkgQ1BVIHdoaWNoIHN1cHBvcnRzIGxldmVsCisJCSAgIDIgaXMgYWxzbyB0aGUgb25seSBvbmUgd2hpY2ggc3VwcG9ydHMgZXh0ZW5kZWQgQ1BVSUQgbGV2ZWxzLgorCQkqLworCQkiY21wbCAkMHgyLCAlJWVheFxuXHQiCisJCSJqbmUgTU1YdGVzdFxuXHQiCS8qIFVzZSBzdGFuZGFyZCBDUFVJRCBpbnN0ZWFkICovCisKKwkJLyogRXh0ZW5kZWQgQ1BVSUQgc3VwcG9ydGVkIChpbiB0aGVvcnkpLCBzbyBnZXQgZXh0ZW5kZWQKKwkJICAgZmVhdHVyZXMgKi8KKwkJIm1vdmwgJDB4ODAwMDAwMDEsICUlZWF4XG5cdCIKKwkJImNwdWlkXG5cdCIKKwkJInRlc3RsICQweDAwODAwMDAwLCAlJWVheFxuXHQiCS8qIFRlc3QgZm9yIE1NWCAqLworCQkianogTm90U3VwcG9ydGVkNVxuXHQiCQkvKiBNTVggbm90IHN1cHBvcnRlZCAqLworCQkidGVzdGwgJDB4MDEwMDAwMDAsICUlZWF4XG5cdCIJLyogVGVzdCBmb3IgRXh0J2QgTU1YICovCisJCSJqbnogRU1NWFN1cHBvcnRlZFxuXHQiCisJCSJtb3ZsICQxLCAlMDpcblxuXHQiCQkvKiBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cbiIKKwkJIkVNTVhTdXBwb3J0ZWQ6XG5cdCIKKwkJIm1vdmwgJDMsICUwOlxuXG5cdCIJCS8qIEVNTVggYW5kIE1NWCBTdXBwb3J0ZWQgKi8KKwkJImptcCBSZXR1cm5cblx0IgorCisKKwkJLyogQU1EIFNlY3Rpb24gKi8KKwkJIkFNRDpcblx0IgorCisJCS8qIFNlZSBpZiBleHRlbmRlZCBDUFVJRCBpcyBzdXBwb3J0ZWQgKi8KKwkJIm1vdmwgJDB4ODAwMDAwMDAsICUlZWF4XG5cdCIKKwkJImNwdWlkXG5cdCIKKwkJImNtcGwgJDB4ODAwMDAwMDAsICUlZWF4XG5cdCIKKwkJImpsIE1NWHRlc3Rcblx0IgkvKiBVc2Ugc3RhbmRhcmQgQ1BVSUQgaW5zdGVhZCAqLworCisJCS8qIEV4dGVuZGVkIENQVUlEIHN1cHBvcnRlZCwgc28gZ2V0IGV4dGVuZGVkIGZlYXR1cmVzICovCisJCSJtb3ZsICQweDgwMDAwMDAxLCAlJWVheFxuXHQiCisJCSJjcHVpZFxuXHQiCisJCSJ0ZXN0bCAkMHgwMDgwMDAwMCwgJSVlZHhcblx0IgkvKiBUZXN0IGZvciBNTVggKi8KKwkJImp6IE5vdFN1cHBvcnRlZDZcblx0IgkJLyogTU1YIG5vdCBzdXBwb3J0ZWQgKi8KKwkJInRlc3RsICQweDgwMDAwMDAwLCAlJWVkeFxuXHQiCS8qIFRlc3QgZm9yIDNETm93ISAqLworCQkiam56IFRocmVlRE5vd1N1cHBvcnRlZFxuXHQiCisJCSJtb3ZsICQxLCAlMDpcblxuXHQiCQkvKiBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cbiIKKwkJIlRocmVlRE5vd1N1cHBvcnRlZDpcblx0IgorCQkibW92bCAkNSwgJTA6XG5cblx0IgkJLyogM0ROb3chIGFuZCBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cdCIKKworCisJCS8qIEludGVsIFNlY3Rpb24gKi8KKwkJIkludGVsOlxuXHQiCisKKwkJLyogQ2hlY2sgZm9yIFNTRSAqLworCQkiU1NFdGVzdDpcblx0IgorCQkibW92bCAkMSwgJSVlYXhcblx0IgorCQkiY3B1aWRcblx0IgorCQkidGVzdGwgJDB4MDIwMDAwMDAsICUlZWR4XG5cdCIJLyogVGVzdCBmb3IgU1NFICovCisJCSJqeiBNTVh0ZXN0XG5cdCIJCS8qIFNTRSBOb3Qgc3VwcG9ydGVkICovCisJCSJtb3ZsICQ5LCAlMDpcblxuXHQiCQkvKiBTU0UgU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cdCIKKworCQkvKiBDaGVjayBmb3IgTU1YICovCisJCSJNTVh0ZXN0OlxuXHQiCisJCSJtb3ZsICQxLCAlJWVheFxuXHQiCisJCSJjcHVpZFxuXHQiCisJCSJ0ZXN0bCAkMHgwMDgwMDAwMCwgJSVlZHhcblx0IgkvKiBUZXN0IGZvciBNTVggKi8KKwkJImp6IE5vdFN1cHBvcnRlZDdcblx0IgkJLyogTU1YIE5vdCBzdXBwb3J0ZWQgKi8KKwkJIm1vdmwgJDEsICUwOlxuXG5cdCIJCS8qIE1NWCBTdXBwb3J0ZWQgKi8KKwkJImptcCBSZXR1cm5cblx0IgorCisJCS8qIE5vdGhpbmcgc3VwcG9ydGVkICovCisJCSJcbk5vdFN1cHBvcnRlZDE6XG5cdCIKKwkJIiNtb3ZsICQxMDEsICUwOlxuXG5cdCIKKwkJIlxuTm90U3VwcG9ydGVkMjpcblx0IgorCQkiI21vdmwgJDEwMiwgJTA6XG5cblx0IgorCQkiXG5Ob3RTdXBwb3J0ZWQzOlxuXHQiCisJCSIjbW92bCAkMTAzLCAlMDpcblxuXHQiCisJCSJcbk5vdFN1cHBvcnRlZDQ6XG5cdCIKKwkJIiNtb3ZsICQxMDQsICUwOlxuXG5cdCIKKwkJIlxuTm90U3VwcG9ydGVkNTpcblx0IgorCQkiI21vdmwgJDEwNSwgJTA6XG5cblx0IgorCQkiXG5Ob3RTdXBwb3J0ZWQ2OlxuXHQiCisJCSIjbW92bCAkMTA2LCAlMDpcblxuXHQiCisJCSJcbk5vdFN1cHBvcnRlZDc6XG5cdCIKKwkJIiNtb3ZsICQxMDcsICUwOlxuXG5cdCIKKwkJIm1vdmwgJDAsICUwOlxuXG5cdCIKKworCQkiUmV0dXJuOlxuXHQiCisJCTogIj1hIiAocnZhbCkKKwkJOiAvKiBubyBpbnB1dCAqLworCQk6ICJlYXgiLCAiZWJ4IiwgImVjeCIsICJlZHgiCisJKTsKKworCS8qIFJldHVybiAqLworCXJldHVybihydmFsKTsKK30KKworLyoJRnVuY3Rpb24gdG8gdGVzdCBpZiBzc2UgaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQuLi4KKyovCitpbmxpbmUgZXh0ZXJuIGludAorc3NlX29rKHZvaWQpCit7CisJLyogUmV0dXJucyAxIGlmIFNTRSBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZCwgMCBvdGhlcndpc2UgKi8KKwlyZXR1cm4gKCAobW1fc3VwcG9ydCgpICYgMHg4KSA+PiAzICApOworfQorI2VuZGlmCisKKworCisvKglIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgaW5zdHJ1Y3Rpb24gbWFjcm9zIHRoYXQgZm9sbG93Li4uCisJKG5vdGUgdGhhdCBtZW1vcnktdG8tcmVnaXN0ZXIsIG0yciwgaW5zdHJ1Y3Rpb25zIGFyZSBuZWFybHkKKwkgYXMgZWZmaWNpZW50IGFzIHJlZ2lzdGVyLXRvLXJlZ2lzdGVyLCByMnIsIGluc3RydWN0aW9uczsKKwkgaG93ZXZlciwgbWVtb3J5LXRvLW1lbW9yeSBpbnN0cnVjdGlvbnMgYXJlIHJlYWxseSBzaW11bGF0ZWQKKwkgYXMgYSBjb252ZW5pZW5jZSwgYW5kIGFyZSBvbmx5IDEvMyBhcyBlZmZpY2llbnQpCisqLworI2lmZGVmCVNTRV9UUkFDRQorCisvKglJbmNsdWRlIHRoZSBzdHVmZiBmb3IgcHJpbnRpbmcgYSB0cmFjZSB0byBzdGRlcnIuLi4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lCXNzZV9pMnIob3AsIGltbSwgcmVnKSBcCisJeyBcCisJCXNzZV90IHNzZV90cmFjZTsgXAorCQlzc2VfdHJhY2UudXEgPSAoaW1tKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI29wICJfaTJyKCIgI2ltbSAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCXNzZV90cmFjZS5kWzFdLCBzc2VfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChzc2VfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI3JlZyAiPTB4JTA4eCUwOHgpID0+ICIsIFwKKwkJCXNzZV90cmFjZS5kWzFdLCBzc2VfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUwLCAlJSIgI3JlZyBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCQkgICAgICA6ICJYIiAoaW1tKSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChzc2VfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI3JlZyAiPTB4JTA4eCUwOHhcbiIsIFwKKwkJCXNzZV90cmFjZS5kWzFdLCBzc2VfdHJhY2UuZFswXSk7IFwKKwl9CisKKyNkZWZpbmUJc3NlX20ycihvcCwgbWVtLCByZWcpIFwKKwl7IFwKKwkJc3NlX3Qgc3NlX3RyYWNlOyBcCisJCXNzZV90cmFjZSA9IChtZW0pOyBcCisJCWZwcmludGYoc3RkZXJyLCAjb3AgIl9tMnIoIiAjbWVtICI9MHglMDh4JTA4eCwgIiwgXAorCQkJc3NlX3RyYWNlLmRbMV0sIHNzZV90cmFjZS5kWzBdKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWcgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKHNzZV90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjcmVnICI9MHglMDh4JTA4eCkgPT4gIiwgXAorCQkJc3NlX3RyYWNlLmRbMV0sIHNzZV90cmFjZS5kWzBdKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gXAorCQkJCSAgICAgIDogIlgiIChtZW0pKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWcgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKHNzZV90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjcmVnICI9MHglMDh4JTA4eFxuIiwgXAorCQkJc3NlX3RyYWNlLmRbMV0sIHNzZV90cmFjZS5kWzBdKTsgXAorCX0KKworI2RlZmluZQlzc2VfcjJtKG9wLCByZWcsIG1lbSkgXAorCXsgXAorCQlzc2VfdCBzc2VfdHJhY2U7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChzc2VfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI29wICJfcjJtKCIgI3JlZyAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCXNzZV90cmFjZS5kWzFdLCBzc2VfdHJhY2UuZFswXSk7IFwKKwkJc3NlX3RyYWNlID0gKG1lbSk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNtZW0gIj0weCUwOHglMDh4KSA9PiAiLCBcCisJCQlzc2VfdHJhY2UuZFsxXSwgc3NlX3RyYWNlLmRbMF0pOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlJSIgI3JlZyAiLCAlMCIgXAorCQkJCSAgICAgIDogIj1YIiAobWVtKSBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKKwkJc3NlX3RyYWNlID0gKG1lbSk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNtZW0gIj0weCUwOHglMDh4XG4iLCBcCisJCQlzc2VfdHJhY2UuZFsxXSwgc3NlX3RyYWNlLmRbMF0pOyBcCisJfQorCisjZGVmaW5lCXNzZV9yMnIob3AsIHJlZ3MsIHJlZ2QpIFwKKwl7IFwKKwkJc3NlX3Qgc3NlX3RyYWNlOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZ3MgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKHNzZV90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjb3AgIl9yMnIoIiAjcmVncyAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCXNzZV90cmFjZS5kWzFdLCBzc2VfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnZCAiLCAlMCIgXAorCQkJCSAgICAgIDogIj1YIiAoc3NlX3RyYWNlKSBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNyZWdkICI9MHglMDh4JTA4eCkgPT4gIiwgXAorCQkJc3NlX3RyYWNlLmRbMV0sIHNzZV90cmFjZS5kWzBdKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJSIgI3JlZ3MgIiwgJSIgI3JlZ2QpOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZ2QgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKHNzZV90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjcmVnZCAiPTB4JTA4eCUwOHhcbiIsIFwKKwkJCXNzZV90cmFjZS5kWzFdLCBzc2VfdHJhY2UuZFswXSk7IFwKKwl9CisKKyNkZWZpbmUJc3NlX20ybShvcCwgbWVtcywgbWVtZCkgXAorCXsgXAorCQlzc2VfdCBzc2VfdHJhY2U7IFwKKwkJc3NlX3RyYWNlID0gKG1lbXMpOyBcCisJCWZwcmludGYoc3RkZXJyLCAjb3AgIl9tMm0oIiAjbWVtcyAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCXNzZV90cmFjZS5kWzFdLCBzc2VfdHJhY2UuZFswXSk7IFwKKwkJc3NlX3RyYWNlID0gKG1lbWQpOyBcCisJCWZwcmludGYoc3RkZXJyLCAjbWVtZCAiPTB4JTA4eCUwOHgpID0+ICIsIFwKKwkJCXNzZV90cmFjZS5kWzFdLCBzc2VfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUwLCAlJW1tMFxuXHQiIFwKKwkJCQkgICAgICAjb3AgIiAlMSwgJSVtbTBcblx0IiBcCisJCQkJICAgICAgIm1vdnEgJSVtbTAsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtZW1kKSBcCisJCQkJICAgICAgOiAiWCIgKG1lbXMpKTsgXAorCQlzc2VfdHJhY2UgPSAobWVtZCk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNtZW1kICI9MHglMDh4JTA4eFxuIiwgXAorCQkJc3NlX3RyYWNlLmRbMV0sIHNzZV90cmFjZS5kWzBdKTsgXAorCX0KKworI2Vsc2UKKworLyoJVGhlc2UgbWFjcm9zIGFyZSBhIGxvdCBzaW1wbGVyIHdpdGhvdXQgdGhlIHRyYWNpbmcuLi4KKyovCisKKyNkZWZpbmUJc3NlX2kycihvcCwgaW1tLCByZWcpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCisJCQkgICAgICA6ICJYIiAoaW1tKSApCisKKyNkZWZpbmUJc3NlX20ycihvcCwgbWVtLCByZWcpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCisJCQkgICAgICA6ICJYIiAobWVtKSkKKworI2RlZmluZQlzc2VfcjJtKG9wLCByZWcsIG1lbSkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlJSIgI3JlZyAiLCAlMCIgXAorCQkJICAgICAgOiAiPVgiIChtZW0pIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyApCisKKyNkZWZpbmUJc3NlX3IycihvcCwgcmVncywgcmVnZCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlIiAjcmVncyAiLCAlIiAjcmVnZCkKKworI2RlZmluZQlzc2VfcjJyaShvcCwgcmVncywgcmVnZCwgaW1tKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUwLCAlJSIgI3JlZ3MgIiwgJSUiICNyZWdkIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCisJCQkgICAgICA6ICJYIiAoaW1tKSApCisKKy8qIExvYWQgZGF0YSBmcm9tIG1lbXMgdG8geG1tcmVnLCBvcGVyYXRlIG9uIHhtbXJlZywgYW5kIHN0b3JlIGRhdGEgdG8gbWVtZCAqLworI2RlZmluZQlzc2VfbTJtKG9wLCBtZW1zLCBtZW1kLCB4bW1yZWcpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnVwcyAlMCwgJSV4bW0wXG5cdCIgXAorCQkJICAgICAgI29wICIgJTEsICUleG1tMFxuXHQiIFwKKwkJCSAgICAgICJtb3Z1cHMgJSVtbTAsICUwIiBcCisJCQkgICAgICA6ICI9WCIgKG1lbWQpIFwKKwkJCSAgICAgIDogIlgiIChtZW1zKSkKKworI2RlZmluZQlzc2VfbTJyaShvcCwgbWVtLCByZWcsIHN1Ym9wKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUwLCAlJSIgI3JlZyAiLCAiICNzdWJvcCBcCisJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gXAorCQkJICAgICAgOiAiWCIgKG1lbSkpCisKKyNkZWZpbmUJc3NlX20ybWkob3AsIG1lbXMsIG1lbWQsIHhtbXJlZywgc3Vib3ApIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnVwcyAlMCwgJSV4bW0wXG5cdCIgXAorCQkJICAgICAgI29wICIgJTEsICUleG1tMCwgIiAjc3Vib3AgIlxuXHQiIFwKKwkJCSAgICAgICJtb3Z1cHMgJSVtbTAsICUwIiBcCisJCQkgICAgICA6ICI9WCIgKG1lbWQpIFwKKwkJCSAgICAgIDogIlgiIChtZW1zKSkKKyNlbmRpZgorCisKKworCisvKgkxeDEyOCBNT1ZlIEFsaWduZWQgZm91ciBQYWNrZWQgU2luZ2xlLWZwCisqLworI2RlZmluZQltb3ZhcHNfbTJyKHZhciwgcmVnKQlzc2VfbTJyKG1vdmFwcywgdmFyLCByZWcpCisjZGVmaW5lCW1vdmFwc19yMm0ocmVnLCB2YXIpCXNzZV9yMm0obW92YXBzLCByZWcsIHZhcikKKyNkZWZpbmUJbW92YXBzX3IycihyZWdzLCByZWdkKQlzc2VfcjJyKG1vdmFwcywgcmVncywgcmVnZCkKKyNkZWZpbmUJbW92YXBzKHZhcnMsIHZhcmQpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmFwcyAlMSwgJSVtbTBcblx0IiBcCisJCQkgICAgICAibW92YXBzICUlbW0wLCAlMCIgXAorCQkJICAgICAgOiAiPVgiICh2YXJkKSBcCisJCQkgICAgICA6ICJYIiAodmFycykpCisKKworLyoJMXgxMjggTU9WZSBhbGlnbmVkIE5vbi1UZW1wb3JhbCBmb3VyIFBhY2tlZCBTaW5nbGUtZnAKKyovCisjZGVmaW5lCW1vdm50cHNfcjJtKHhtbXJlZywgdmFyKQlzc2VfcjJtKG1vdm50cHMsIHhtbXJlZywgdmFyKQorCisKKy8qCTF4NjQgTU9WZSBOb24tVGVtcG9yYWwgUXVhZHdvcmQKKyovCisjZGVmaW5lCW1vdm50cV9yMm0obW1yZWcsIHZhcikJCXNzZV9yMm0obW92bnRxLCBtbXJlZywgdmFyKQorCisKKy8qCTF4MTI4IE1PVmUgVW5hbGlnbmVkIGZvdXIgUGFja2VkIFNpbmdsZS1mcAorKi8KKyNkZWZpbmUJbW92dXBzX20ycih2YXIsIHJlZykJc3NlX20ycihtb3Z1cHMsIHZhciwgcmVnKQorI2RlZmluZQltb3Z1cHNfcjJtKHJlZywgdmFyKQlzc2VfcjJtKG1vdnVwcywgcmVnLCB2YXIpCisjZGVmaW5lCW1vdnVwc19yMnIocmVncywgcmVnZCkJc3NlX3Iycihtb3Z1cHMsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCW1vdnVwcyh2YXJzLCB2YXJkKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3Z1cHMgJTEsICUlbW0wXG5cdCIgXAorCQkJICAgICAgIm1vdnVwcyAlJW1tMCwgJTAiIFwKKwkJCSAgICAgIDogIj1YIiAodmFyZCkgXAorCQkJICAgICAgOiAiWCIgKHZhcnMpKQorCisKKy8qCU1PVmUgSGlnaCB0byBMb3cgUGFja2VkIFNpbmdsZS1mcAorCWhpZ2ggaGFsZiBvZiA0eDMyZiAoeCkgLT4gbG93IGhhbGYgb2YgNHgzMmYgKHkpCisqLworI2RlZmluZQltb3ZobHBzX3IycihyZWdzLCByZWdkKQlzc2VfcjJyKG1vdmhscHMsIHJlZ3MsIHJlZ2QpCisKKworLyoJTU9WZSBMb3cgdG8gSGlnaCBQYWNrZWQgU2luZ2xlLWZwCisJbG93IGhhbGYgb2YgNHgzMmYgKHgpIC0+IGhpZ2ggaGFsZiBvZiA0eDMyZiAoeSkKKyovCisjZGVmaW5lCW1vdmxocHNfcjJyKHJlZ3MsIHJlZ2QpCXNzZV9yMnIobW92bGhwcywgcmVncywgcmVnZCkKKworCisvKglNT1ZlIEhpZ2ggUGFja2VkIFNpbmdsZS1mcAorCTJ4MzJmIC0+IGhpZ2ggaGFsZiBvZiA0eDMyZgorKi8KKyNkZWZpbmUJbW92aHBzX20ycih2YXIsIHJlZykJc3NlX20ycihtb3ZocHMsIHZhciwgcmVnKQorI2RlZmluZQltb3ZocHNfcjJtKHJlZywgdmFyKQlzc2VfcjJtKG1vdmhwcywgcmVnLCB2YXIpCisjZGVmaW5lCW1vdmhwcyh2YXJzLCB2YXJkKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZocHMgJTEsICUlbW0wXG5cdCIgXAorCQkJICAgICAgIm1vdmhwcyAlJW1tMCwgJTAiIFwKKwkJCSAgICAgIDogIj1YIiAodmFyZCkgXAorCQkJICAgICAgOiAiWCIgKHZhcnMpKQorCisKKy8qCU1PVmUgTG93IFBhY2tlZCBTaW5nbGUtZnAKKwkyeDMyZiAtPiBsb3cgaGFsZiBvZiA0eDMyZgorKi8KKyNkZWZpbmUJbW92bHBzX20ycih2YXIsIHJlZykJc3NlX20ycihtb3ZscHMsIHZhciwgcmVnKQorI2RlZmluZQltb3ZscHNfcjJtKHJlZywgdmFyKQlzc2VfcjJtKG1vdmxwcywgcmVnLCB2YXIpCisjZGVmaW5lCW1vdmxwcyh2YXJzLCB2YXJkKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZscHMgJTEsICUlbW0wXG5cdCIgXAorCQkJICAgICAgIm1vdmxwcyAlJW1tMCwgJTAiIFwKKwkJCSAgICAgIDogIj1YIiAodmFyZCkgXAorCQkJICAgICAgOiAiWCIgKHZhcnMpKQorCisKKy8qCU1PVmUgU2NhbGFyIFNpbmdsZS1mcAorCWxvd2VzdCBmaWVsZCBvZiA0eDMyZiAoeCkgLT4gbG93ZXN0IGZpZWxkIG9mIDR4MzJmICh5KQorKi8KKyNkZWZpbmUJbW92c3NfbTJyKHZhciwgcmVnKQlzc2VfbTJyKG1vdnNzLCB2YXIsIHJlZykKKyNkZWZpbmUJbW92c3NfcjJtKHJlZywgdmFyKQlzc2VfcjJtKG1vdnNzLCByZWcsIHZhcikKKyNkZWZpbmUJbW92c3NfcjJyKHJlZ3MsIHJlZ2QpCXNzZV9yMnIobW92c3MsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCW1vdnNzKHZhcnMsIHZhcmQpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnNzICUxLCAlJW1tMFxuXHQiIFwKKwkJCSAgICAgICJtb3ZzcyAlJW1tMCwgJTAiIFwKKwkJCSAgICAgIDogIj1YIiAodmFyZCkgXAorCQkJICAgICAgOiAiWCIgKHZhcnMpKQorCisKKy8qCTR4MTYgUGFja2VkIFNIVUZmbGUgV29yZAorKi8KKyNkZWZpbmUJcHNodWZ3X20ycih2YXIsIHJlZywgaW5kZXgpCXNzZV9tMnJpKHBzaHVmdywgdmFyLCByZWcsIGluZGV4KQorI2RlZmluZQlwc2h1ZndfcjJyKHJlZ3MsIHJlZ2QsIGluZGV4KQlzc2VfcjJyaShwc2h1ZncsIHJlZ3MsIHJlZ2QsIGluZGV4KQorCisKKy8qCTF4MTI4IFNIVUZmbGUgUGFja2VkIFNpbmdsZS1mcAorKi8KKyNkZWZpbmUJc2h1ZnBzX20ycih2YXIsIHJlZywgaW5kZXgpCXNzZV9tMnJpKHNodWZwcywgdmFyLCByZWcsIGluZGV4KQorI2RlZmluZQlzaHVmcHNfcjJyKHJlZ3MsIHJlZ2QsIGluZGV4KQlzc2VfcjJyaShzaHVmcHMsIHJlZ3MsIHJlZ2QsIGluZGV4KQorCisKKy8qCUNvblZlclQgUGFja2VkIHNpZ25lZCBJbnQzMiB0bygyKSBQYWNrZWQgU2luZ2xlLWZwCisqLworI2RlZmluZQljdnRwaTJwc19tMnIodmFyLCB4bW1yZWcpCXNzZV9tMnIoY3Z0cGkycHMsIHZhciwgeG1tcmVnKQorI2RlZmluZQljdnRwaTJwc19yMnIobW1yZWcsIHhtbXJlZykJc3NlX3IycihjdnRwaTJwcywgbW1yZWcsIHhtbXJlZykKKworCisvKglDb25WZXJUIFBhY2tlZCBTaW5nbGUtZnAgdG8oMikgUGFja2VkIHNpZ25lZCBJbnQzMgorKi8KKyNkZWZpbmUJY3Z0cHMycGlfbTJyKHZhciwgbW1yZWcpCXNzZV9tMnIoY3Z0cHMycGksIHZhciwgbW1yZWcpCisjZGVmaW5lCWN2dHBzMnBpX3Iycih4bW1yZWcsIG1tcmVnKQlzc2VfcjJyKGN2dHBzMnBpLCBtbXJlZywgeG1tcmVnKQorCisKKy8qCUNvblZlclQgd2l0aCBUcnVuY2F0ZSBQYWNrZWQgU2luZ2xlLWZwIHRvKDIpIFBhY2tlZCBJbnQzMgorKi8KKyNkZWZpbmUJY3Z0dHBzMnBpX20ycih2YXIsIG1tcmVnKQlzc2VfbTJyKGN2dHRwczJwaSwgdmFyLCBtbXJlZykKKyNkZWZpbmUJY3Z0dHBzMnBpX3Iycih4bW1yZWcsIG1tcmVnKQlzc2VfcjJyKGN2dHRwczJwaSwgbW1yZWcsIHhtbXJlZykKKworCisvKglDb25WZXJUIFNpZ25lZCBJbnQzMiB0bygyKSBTaW5nbGUtZnAgKFNjYWxhcikKKyovCisjZGVmaW5lCWN2dHNpMnNzX20ycih2YXIsIHhtbXJlZykJc3NlX20ycihjdnRzaTJzcywgdmFyLCB4bW1yZWcpCisjZGVmaW5lCWN2dHNpMnNzX3IycihyZWcsIHhtbXJlZykJc3NlX3IycihjdnRzaTJzcywgcmVnLCB4bW1yZWcpCisKKworLyoJQ29uVmVyVCBTY2FsYXIgU2luZ2xlLWZwIHRvKDIpIFNpZ25lZCBJbnQzMgorKi8KKyNkZWZpbmUJY3Z0c3Myc2lfbTJyKHZhciwgcmVnKQkJc3NlX20ycihjdnRzczJzaSwgdmFyLCByZWcpCisjZGVmaW5lCWN2dHNzMnNpX3Iycih4bW1yZWcsIHJlZykJc3NlX3IycihjdnRzczJzaSwgeG1tcmVnLCByZWcpCisKKworLyoJQ29uVmVyVCB3aXRoIFRydW5jYXRlIFNjYWxhciBTaW5nbGUtZnAgdG8oMikgU2lnbmVkIEludDMyCisqLworI2RlZmluZQljdnR0c3Myc2lfbTJyKHZhciwgcmVnKQkJc3NlX20ycihjdnRzczJzaSwgdmFyLCByZWcpCisjZGVmaW5lCWN2dHRzczJzaV9yMnIoeG1tcmVnLCByZWcpCXNzZV9yMnIoY3Z0c3Myc2ksIHhtbXJlZywgcmVnKQorCisKKy8qCVBhcmFsbGVsIEVYVFJhY3QgV29yZCBmcm9tIDR4MTYKKyovCisjZGVmaW5lCXBleHRyd19yMnIobW1yZWcsIHJlZywgZmllbGQpCXNzZV9yMnJpKHBleHRydywgbW1yZWcsIHJlZywgZmllbGQpCisKKworLyoJUGFyYWxsZWwgSU5TZVJ0IFdvcmQgZnJvbSA0eDE2CisqLworI2RlZmluZQlwaW5zcndfcjJyKHJlZywgbW1yZWcsIGZpZWxkKQlzc2VfcjJyaShwaW5zcncsIHJlZywgbW1yZWcsIGZpZWxkKQorCisKKworLyoJTU9WZSBNYVNLIGZyb20gUGFja2VkIFNpbmdsZS1mcAorKi8KKyNpZmRlZglTU0VfVFJBQ0UKKwkjZGVmaW5lCW1vdm1za3BzKHhtbXJlZywgcmVnKSBcCisJeyBcCisJCWZwcmludGYoc3RkZXJyLCAibW92bXNrcHMoKVxuIik7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3Ztc2twcyAlIiAjeG1tcmVnICIsICUiICNyZWcpIFwKKwl9CisjZWxzZQorCSNkZWZpbmUJbW92bXNrcHMoeG1tcmVnLCByZWcpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdm1za3BzICUiICN4bW1yZWcgIiwgJSIgI3JlZykKKyNlbmRpZgorCisKKy8qCVBhcmFsbGVsIE1PVmUgTWFTSyBmcm9tIG1teCByZWcgdG8gMzItYml0IHJlZworKi8KKyNpZmRlZglTU0VfVFJBQ0UKKwkjZGVmaW5lCXBtb3Ztc2tiKG1tcmVnLCByZWcpIFwKKwl7IFwKKwkJZnByaW50ZihzdGRlcnIsICJtb3Ztc2twcygpXG4iKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdm1za3BzICUiICNtbXJlZyAiLCAlIiAjcmVnKSBcCisJfQorI2Vsc2UKKwkjZGVmaW5lCXBtb3Ztc2tiKG1tcmVnLCByZWcpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdm1za3BzICUiICNtbXJlZyAiLCAlIiAjcmVnKQorI2VuZGlmCisKKworLyoJTUFTS2VkIE1PVmUgZnJvbSA4eDggdG8gbWVtb3J5IHBvaW50ZWQgdG8gYnkgKGUpZGkgcmVnaXN0ZXIKKyovCisjZGVmaW5lCW1hc2ttb3ZxKG1tcmVncywgZmllbGRyZWcpCXNzZV9yMnJpKG1hc2ttb3ZxLCBtbXJlZ3MsIGZpZWxkcmVnKQorCisKKworCisvKgk0eDMyZiBQYXJhbGxlbCBBRERzCisqLworI2RlZmluZQlhZGRwc19tMnIodmFyLCByZWcpCQlzc2VfbTJyKGFkZHBzLCB2YXIsIHJlZykKKyNkZWZpbmUJYWRkcHNfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKGFkZHBzLCByZWdzLCByZWdkKQorI2RlZmluZQlhZGRwcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm0oYWRkcHMsIHZhcnMsIHZhcmQsIHhtbXJlZykKKworCisvKglMb3dlc3QgRmllbGQgb2YgNHgzMmYgUGFyYWxsZWwgQUREcworKi8KKyNkZWZpbmUJYWRkc3NfbTJyKHZhciwgcmVnKQkJc3NlX20ycihhZGRzcywgdmFyLCByZWcpCisjZGVmaW5lCWFkZHNzX3IycihyZWdzLCByZWdkKQkJc3NlX3IycihhZGRzcywgcmVncywgcmVnZCkKKyNkZWZpbmUJYWRkc3ModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtKGFkZHNzLCB2YXJzLCB2YXJkLCB4bW1yZWcpCisKKworLyoJNHgzMmYgUGFyYWxsZWwgU1VCcworKi8KKyNkZWZpbmUJc3VicHNfbTJyKHZhciwgcmVnKQkJc3NlX20ycihzdWJwcywgdmFyLCByZWcpCisjZGVmaW5lCXN1YnBzX3IycihyZWdzLCByZWdkKQkJc3NlX3IycihzdWJwcywgcmVncywgcmVnZCkKKyNkZWZpbmUJc3VicHModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtKHN1YnBzLCB2YXJzLCB2YXJkLCB4bW1yZWcpCisKKworLyoJTG93ZXN0IEZpZWxkIG9mIDR4MzJmIFBhcmFsbGVsIFNVQnMKKyovCisjZGVmaW5lCXN1YnNzX20ycih2YXIsIHJlZykJCXNzZV9tMnIoc3Vic3MsIHZhciwgcmVnKQorI2RlZmluZQlzdWJzc19yMnIocmVncywgcmVnZCkJCXNzZV9yMnIoc3Vic3MsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXN1YnNzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybShzdWJzcywgdmFycywgdmFyZCwgeG1tcmVnKQorCisKKy8qCTh4OHUgLT4gNHgxNnUgUGFja2VkIFN1bSBvZiBBYnNvbHV0ZSBEaWZmZXJlbmNlcworKi8KKyNkZWZpbmUJcHNhZGJ3X20ycih2YXIsIHJlZykJCXNzZV9tMnIocHNhZGJ3LCB2YXIsIHJlZykKKyNkZWZpbmUJcHNhZGJ3X3IycihyZWdzLCByZWdkKQkJc3NlX3Iycihwc2FkYncsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzYWRidyh2YXJzLCB2YXJkLCBtbXJlZykJc3NlX20ybShwc2FkYncsIHZhcnMsIHZhcmQsIG1tcmVnKQorCisKKy8qCTR4MTZ1IFBhcmFsbGVsIE1VTCBIaWdoIFVuc2lnbmVkCisqLworI2RlZmluZQlwbXVsaHV3X20ycih2YXIsIHJlZykJCXNzZV9tMnIocG11bGh1dywgdmFyLCByZWcpCisjZGVmaW5lCXBtdWxodXdfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKHBtdWxodXcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBtdWxodXcodmFycywgdmFyZCwgbW1yZWcpCXNzZV9tMm0ocG11bGh1dywgdmFycywgdmFyZCwgbW1yZWcpCisKKworLyoJNHgzMmYgUGFyYWxsZWwgTVVMcworKi8KKyNkZWZpbmUJbXVscHNfbTJyKHZhciwgcmVnKQkJc3NlX20ycihtdWxwcywgdmFyLCByZWcpCisjZGVmaW5lCW11bHBzX3IycihyZWdzLCByZWdkKQkJc3NlX3IycihtdWxwcywgcmVncywgcmVnZCkKKyNkZWZpbmUJbXVscHModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtKG11bHBzLCB2YXJzLCB2YXJkLCB4bW1yZWcpCisKKworLyoJTG93ZXN0IEZpZWxkIG9mIDR4MzJmIFBhcmFsbGVsIE1VTHMKKyovCisjZGVmaW5lCW11bHNzX20ycih2YXIsIHJlZykJCXNzZV9tMnIobXVsc3MsIHZhciwgcmVnKQorI2RlZmluZQltdWxzc19yMnIocmVncywgcmVnZCkJCXNzZV9yMnIobXVsc3MsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCW11bHNzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybShtdWxzcywgdmFycywgdmFyZCwgeG1tcmVnKQorCisKKy8qCTR4MzJmIFBhcmFsbGVsIERJVnMKKyovCisjZGVmaW5lCWRpdnBzX20ycih2YXIsIHJlZykJCXNzZV9tMnIoZGl2cHMsIHZhciwgcmVnKQorI2RlZmluZQlkaXZwc19yMnIocmVncywgcmVnZCkJCXNzZV9yMnIoZGl2cHMsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCWRpdnBzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybShkaXZwcywgdmFycywgdmFyZCwgeG1tcmVnKQorCisKKy8qCUxvd2VzdCBGaWVsZCBvZiA0eDMyZiBQYXJhbGxlbCBESVZzCisqLworI2RlZmluZQlkaXZzc19tMnIodmFyLCByZWcpCQlzc2VfbTJyKGRpdnNzLCB2YXIsIHJlZykKKyNkZWZpbmUJZGl2c3NfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKGRpdnNzLCByZWdzLCByZWdkKQorI2RlZmluZQlkaXZzcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm0oZGl2c3MsIHZhcnMsIHZhcmQsIHhtbXJlZykKKworCisvKgk0eDMyZiBQYXJhbGxlbCBSZWNpcHJvY2FscworKi8KKyNkZWZpbmUJcmNwcHNfbTJyKHZhciwgcmVnKQkJc3NlX20ycihyY3BwcywgdmFyLCByZWcpCisjZGVmaW5lCXJjcHBzX3IycihyZWdzLCByZWdkKQkJc3NlX3IycihyY3BwcywgcmVncywgcmVnZCkKKyNkZWZpbmUJcmNwcHModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtKHJjcHBzLCB2YXJzLCB2YXJkLCB4bW1yZWcpCisKKworLyoJTG93ZXN0IEZpZWxkIG9mIDR4MzJmIFBhcmFsbGVsIFJlY2lwcm9jYWxzCisqLworI2RlZmluZQlyY3Bzc19tMnIodmFyLCByZWcpCQlzc2VfbTJyKHJjcHNzLCB2YXIsIHJlZykKKyNkZWZpbmUJcmNwc3NfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKHJjcHNzLCByZWdzLCByZWdkKQorI2RlZmluZQlyY3Bzcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm0ocmNwc3MsIHZhcnMsIHZhcmQsIHhtbXJlZykKKworCisvKgk0eDMyZiBQYXJhbGxlbCBTcXVhcmUgUm9vdCBvZiBSZWNpcHJvY2FscworKi8KKyNkZWZpbmUJcnNxcnRwc19tMnIodmFyLCByZWcpCQlzc2VfbTJyKHJzcXJ0cHMsIHZhciwgcmVnKQorI2RlZmluZQlyc3FydHBzX3IycihyZWdzLCByZWdkKQkJc3NlX3Iycihyc3FydHBzLCByZWdzLCByZWdkKQorI2RlZmluZQlyc3FydHBzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybShyc3FydHBzLCB2YXJzLCB2YXJkLCB4bW1yZWcpCisKKworLyoJTG93ZXN0IEZpZWxkIG9mIDR4MzJmIFBhcmFsbGVsIFNxdWFyZSBSb290IG9mIFJlY2lwcm9jYWxzCisqLworI2RlZmluZQlyc3FydHNzX20ycih2YXIsIHJlZykJCXNzZV9tMnIocnNxcnRzcywgdmFyLCByZWcpCisjZGVmaW5lCXJzcXJ0c3NfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKHJzcXJ0c3MsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXJzcXJ0c3ModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtKHJzcXJ0c3MsIHZhcnMsIHZhcmQsIHhtbXJlZykKKworCisvKgk0eDMyZiBQYXJhbGxlbCBTcXVhcmUgUm9vdHMKKyovCisjZGVmaW5lCXNxcnRwc19tMnIodmFyLCByZWcpCQlzc2VfbTJyKHNxcnRwcywgdmFyLCByZWcpCisjZGVmaW5lCXNxcnRwc19yMnIocmVncywgcmVnZCkJCXNzZV9yMnIoc3FydHBzLCByZWdzLCByZWdkKQorI2RlZmluZQlzcXJ0cHModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtKHNxcnRwcywgdmFycywgdmFyZCwgeG1tcmVnKQorCisKKy8qCUxvd2VzdCBGaWVsZCBvZiA0eDMyZiBQYXJhbGxlbCBTcXVhcmUgUm9vdHMKKyovCisjZGVmaW5lCXNxcnRzc19tMnIodmFyLCByZWcpCQlzc2VfbTJyKHNxcnRzcywgdmFyLCByZWcpCisjZGVmaW5lCXNxcnRzc19yMnIocmVncywgcmVnZCkJCXNzZV9yMnIoc3FydHNzLCByZWdzLCByZWdkKQorI2RlZmluZQlzcXJ0c3ModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtKHNxcnRzcywgdmFycywgdmFyZCwgeG1tcmVnKQorCisKKy8qCTh4OHUgYW5kIDR4MTZ1IFBhcmFsbGVsIEFWZXJhR2UKKyovCisjZGVmaW5lCXBhdmdiX20ycih2YXIsIHJlZykJCXNzZV9tMnIocGF2Z2IsIHZhciwgcmVnKQorI2RlZmluZQlwYXZnYl9yMnIocmVncywgcmVnZCkJCXNzZV9yMnIocGF2Z2IsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBhdmdiKHZhcnMsIHZhcmQsIG1tcmVnKQlzc2VfbTJtKHBhdmdiLCB2YXJzLCB2YXJkLCBtbXJlZykKKworI2RlZmluZQlwYXZnd19tMnIodmFyLCByZWcpCQlzc2VfbTJyKHBhdmd3LCB2YXIsIHJlZykKKyNkZWZpbmUJcGF2Z3dfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKHBhdmd3LCByZWdzLCByZWdkKQorI2RlZmluZQlwYXZndyh2YXJzLCB2YXJkLCBtbXJlZykJc3NlX20ybShwYXZndywgdmFycywgdmFyZCwgbW1yZWcpCisKKworLyoJMXgxMjggYml0d2lzZSBBTkQKKyovCisjZGVmaW5lCWFuZHBzX20ycih2YXIsIHJlZykJCXNzZV9tMnIoYW5kcHMsIHZhciwgcmVnKQorI2RlZmluZQlhbmRwc19yMnIocmVncywgcmVnZCkJCXNzZV9yMnIoYW5kcHMsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCWFuZHBzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybShhbmRwcywgdmFycywgdmFyZCwgeG1tcmVnKQorCisKKy8qCTF4MTI4IGJpdHdpc2UgQU5EIHdpdGggTm90IHRoZSBkZXN0aW5hdGlvbgorKi8KKyNkZWZpbmUJYW5kbnBzX20ycih2YXIsIHJlZykJCXNzZV9tMnIoYW5kbnBzLCB2YXIsIHJlZykKKyNkZWZpbmUJYW5kbnBzX3IycihyZWdzLCByZWdkKQkJc3NlX3IycihhbmRucHMsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCWFuZG5wcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm0oYW5kbnBzLCB2YXJzLCB2YXJkLCB4bW1yZWcpCisKKworLyoJMXgxMjggYml0d2lzZSBPUgorKi8KKyNkZWZpbmUJb3Jwc19tMnIodmFyLCByZWcpCQlzc2VfbTJyKG9ycHMsIHZhciwgcmVnKQorI2RlZmluZQlvcnBzX3IycihyZWdzLCByZWdkKQkJc3NlX3IycihvcnBzLCByZWdzLCByZWdkKQorI2RlZmluZQlvcnBzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybShvcnBzLCB2YXJzLCB2YXJkLCB4bW1yZWcpCisKKworLyoJMXgxMjggYml0d2lzZSBlWGNsdXNpdmUgT1IKKyovCisjZGVmaW5lCXhvcnBzX20ycih2YXIsIHJlZykJCXNzZV9tMnIoeG9ycHMsIHZhciwgcmVnKQorI2RlZmluZQl4b3Jwc19yMnIocmVncywgcmVnZCkJCXNzZV9yMnIoeG9ycHMsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXhvcnBzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybSh4b3JwcywgdmFycywgdmFyZCwgeG1tcmVnKQorCisKKy8qCTh4OHUsIDR4MTYsIGFuZCA0eDMyZiBQYXJhbGxlbCBNYXhpbXVtCisqLworI2RlZmluZQlwbWF4dWJfbTJyKHZhciwgcmVnKQkJc3NlX20ycihwbWF4dWIsIHZhciwgcmVnKQorI2RlZmluZQlwbWF4dWJfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKHBtYXh1YiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcG1heHViKHZhcnMsIHZhcmQsIG1tcmVnKQlzc2VfbTJtKHBtYXh1YiwgdmFycywgdmFyZCwgbW1yZWcpCisKKyNkZWZpbmUJcG1heHN3X20ycih2YXIsIHJlZykJCXNzZV9tMnIocG1heHN3LCB2YXIsIHJlZykKKyNkZWZpbmUJcG1heHN3X3IycihyZWdzLCByZWdkKQkJc3NlX3IycihwbWF4c3csIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBtYXhzdyh2YXJzLCB2YXJkLCBtbXJlZykJc3NlX20ybShwbWF4c3csIHZhcnMsIHZhcmQsIG1tcmVnKQorCisjZGVmaW5lCW1heHBzX20ycih2YXIsIHJlZykJCXNzZV9tMnIobWF4cHMsIHZhciwgcmVnKQorI2RlZmluZQltYXhwc19yMnIocmVncywgcmVnZCkJCXNzZV9yMnIobWF4cHMsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCW1heHBzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybShtYXhwcywgdmFycywgdmFyZCwgeG1tcmVnKQorCisKKy8qCUxvd2VzdCBGaWVsZCBvZiA0eDMyZiBQYXJhbGxlbCBNYXhpbXVtCisqLworI2RlZmluZQltYXhzc19tMnIodmFyLCByZWcpCQlzc2VfbTJyKG1heHNzLCB2YXIsIHJlZykKKyNkZWZpbmUJbWF4c3NfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKG1heHNzLCByZWdzLCByZWdkKQorI2RlZmluZQltYXhzcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm0obWF4c3MsIHZhcnMsIHZhcmQsIHhtbXJlZykKKworCisvKgk4eDh1LCA0eDE2LCBhbmQgNHgzMmYgUGFyYWxsZWwgTWluaW11bQorKi8KKyNkZWZpbmUJcG1pbnViX20ycih2YXIsIHJlZykJCXNzZV9tMnIocG1pbnViLCB2YXIsIHJlZykKKyNkZWZpbmUJcG1pbnViX3IycihyZWdzLCByZWdkKQkJc3NlX3IycihwbWludWIsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBtaW51Yih2YXJzLCB2YXJkLCBtbXJlZykJc3NlX20ybShwbWludWIsIHZhcnMsIHZhcmQsIG1tcmVnKQorCisjZGVmaW5lCXBtaW5zd19tMnIodmFyLCByZWcpCQlzc2VfbTJyKHBtaW5zdywgdmFyLCByZWcpCisjZGVmaW5lCXBtaW5zd19yMnIocmVncywgcmVnZCkJCXNzZV9yMnIocG1pbnN3LCByZWdzLCByZWdkKQorI2RlZmluZQlwbWluc3codmFycywgdmFyZCwgbW1yZWcpCXNzZV9tMm0ocG1pbnN3LCB2YXJzLCB2YXJkLCBtbXJlZykKKworI2RlZmluZQltaW5wc19tMnIodmFyLCByZWcpCQlzc2VfbTJyKG1pbnBzLCB2YXIsIHJlZykKKyNkZWZpbmUJbWlucHNfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKG1pbnBzLCByZWdzLCByZWdkKQorI2RlZmluZQltaW5wcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm0obWlucHMsIHZhcnMsIHZhcmQsIHhtbXJlZykKKworCisvKglMb3dlc3QgRmllbGQgb2YgNHgzMmYgUGFyYWxsZWwgTWluaW11bQorKi8KKyNkZWZpbmUJbWluc3NfbTJyKHZhciwgcmVnKQkJc3NlX20ycihtaW5zcywgdmFyLCByZWcpCisjZGVmaW5lCW1pbnNzX3IycihyZWdzLCByZWdkKQkJc3NlX3IycihtaW5zcywgcmVncywgcmVnZCkKKyNkZWZpbmUJbWluc3ModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtKG1pbnNzLCB2YXJzLCB2YXJkLCB4bW1yZWcpCisKKworLyoJNHgzMmYgUGFyYWxsZWwgQ29NUGFyZXMKKwkocmVzdWx0aW5nIGZpZWxkcyBhcmUgZWl0aGVyIDAgb3IgLTEpCisqLworI2RlZmluZQljbXBwc19tMnIodmFyLCByZWcsIG9wKQkJc3NlX20ycmkoY21wcHMsIHZhciwgcmVnLCBvcCkKKyNkZWZpbmUJY21wcHNfcjJyKHJlZ3MsIHJlZ2QsIG9wKQlzc2VfcjJyaShjbXBwcywgcmVncywgcmVnZCwgb3ApCisjZGVmaW5lCWNtcHBzKHZhcnMsIHZhcmQsIG9wLCB4bW1yZWcpCXNzZV9tMm1pKGNtcHBzLCB2YXJzLCB2YXJkLCB4bW1yZWcsIG9wKQorCisjZGVmaW5lCWNtcGVxcHNfbTJyKHZhciwgcmVnKQkJc3NlX20ycmkoY21wcHMsIHZhciwgcmVnLCAwKQorI2RlZmluZQljbXBlcXBzX3IycihyZWdzLCByZWdkKQkJc3NlX3IycmkoY21wcHMsIHJlZ3MsIHJlZ2QsIDApCisjZGVmaW5lCWNtcGVxcHModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtaShjbXBwcywgdmFycywgdmFyZCwgeG1tcmVnLCAwKQorCisjZGVmaW5lCWNtcGx0cHNfbTJyKHZhciwgcmVnKQkJc3NlX20ycmkoY21wcHMsIHZhciwgcmVnLCAxKQorI2RlZmluZQljbXBsdHBzX3IycihyZWdzLCByZWdkKQkJc3NlX3IycmkoY21wcHMsIHJlZ3MsIHJlZ2QsIDEpCisjZGVmaW5lCWNtcGx0cHModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtaShjbXBwcywgdmFycywgdmFyZCwgeG1tcmVnLCAxKQorCisjZGVmaW5lCWNtcGxlcHNfbTJyKHZhciwgcmVnKQkJc3NlX20ycmkoY21wcHMsIHZhciwgcmVnLCAyKQorI2RlZmluZQljbXBsZXBzX3IycihyZWdzLCByZWdkKQkJc3NlX3IycmkoY21wcHMsIHJlZ3MsIHJlZ2QsIDIpCisjZGVmaW5lCWNtcGxlcHModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtaShjbXBwcywgdmFycywgdmFyZCwgeG1tcmVnLCAyKQorCisjZGVmaW5lCWNtcHVub3JkcHNfbTJyKHZhciwgcmVnKQlzc2VfbTJyaShjbXBwcywgdmFyLCByZWcsIDMpCisjZGVmaW5lCWNtcHVub3JkcHNfcjJyKHJlZ3MsIHJlZ2QpCXNzZV9yMnJpKGNtcHBzLCByZWdzLCByZWdkLCAzKQorI2RlZmluZQljbXB1bm9yZHBzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybWkoY21wcHMsIHZhcnMsIHZhcmQsIHhtbXJlZywgMykKKworI2RlZmluZQljbXBuZXFwc19tMnIodmFyLCByZWcpCQlzc2VfbTJyaShjbXBwcywgdmFyLCByZWcsIDQpCisjZGVmaW5lCWNtcG5lcXBzX3IycihyZWdzLCByZWdkKQlzc2VfcjJyaShjbXBwcywgcmVncywgcmVnZCwgNCkKKyNkZWZpbmUJY21wbmVxcHModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtaShjbXBwcywgdmFycywgdmFyZCwgeG1tcmVnLCA0KQorCisjZGVmaW5lCWNtcG5sdHBzX20ycih2YXIsIHJlZykJCXNzZV9tMnJpKGNtcHBzLCB2YXIsIHJlZywgNSkKKyNkZWZpbmUJY21wbmx0cHNfcjJyKHJlZ3MsIHJlZ2QpCXNzZV9yMnJpKGNtcHBzLCByZWdzLCByZWdkLCA1KQorI2RlZmluZQljbXBubHRwcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm1pKGNtcHBzLCB2YXJzLCB2YXJkLCB4bW1yZWcsIDUpCisKKyNkZWZpbmUJY21wbmxlcHNfbTJyKHZhciwgcmVnKQkJc3NlX20ycmkoY21wcHMsIHZhciwgcmVnLCA2KQorI2RlZmluZQljbXBubGVwc19yMnIocmVncywgcmVnZCkJc3NlX3IycmkoY21wcHMsIHJlZ3MsIHJlZ2QsIDYpCisjZGVmaW5lCWNtcG5sZXBzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybWkoY21wcHMsIHZhcnMsIHZhcmQsIHhtbXJlZywgNikKKworI2RlZmluZQljbXBvcmRwc19tMnIodmFyLCByZWcpCQlzc2VfbTJyaShjbXBwcywgdmFyLCByZWcsIDcpCisjZGVmaW5lCWNtcG9yZHBzX3IycihyZWdzLCByZWdkKQlzc2VfcjJyaShjbXBwcywgcmVncywgcmVnZCwgNykKKyNkZWZpbmUJY21wb3JkcHModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtaShjbXBwcywgdmFycywgdmFyZCwgeG1tcmVnLCA3KQorCisKKy8qCUxvd2VzdCBGaWVsZCBvZiA0eDMyZiBQYXJhbGxlbCBDb01QYXJlcworCShyZXN1bHRpbmcgZmllbGRzIGFyZSBlaXRoZXIgMCBvciAtMSkKKyovCisjZGVmaW5lCWNtcHNzX20ycih2YXIsIHJlZywgb3ApCQlzc2VfbTJyaShjbXBzcywgdmFyLCByZWcsIG9wKQorI2RlZmluZQljbXBzc19yMnIocmVncywgcmVnZCwgb3ApCXNzZV9yMnJpKGNtcHNzLCByZWdzLCByZWdkLCBvcCkKKyNkZWZpbmUJY21wc3ModmFycywgdmFyZCwgb3AsIHhtbXJlZykJc3NlX20ybWkoY21wc3MsIHZhcnMsIHZhcmQsIHhtbXJlZywgb3ApCisKKyNkZWZpbmUJY21wZXFzc19tMnIodmFyLCByZWcpCQlzc2VfbTJyaShjbXBzcywgdmFyLCByZWcsIDApCisjZGVmaW5lCWNtcGVxc3NfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyaShjbXBzcywgcmVncywgcmVnZCwgMCkKKyNkZWZpbmUJY21wZXFzcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm1pKGNtcHNzLCB2YXJzLCB2YXJkLCB4bW1yZWcsIDApCisKKyNkZWZpbmUJY21wbHRzc19tMnIodmFyLCByZWcpCQlzc2VfbTJyaShjbXBzcywgdmFyLCByZWcsIDEpCisjZGVmaW5lCWNtcGx0c3NfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyaShjbXBzcywgcmVncywgcmVnZCwgMSkKKyNkZWZpbmUJY21wbHRzcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm1pKGNtcHNzLCB2YXJzLCB2YXJkLCB4bW1yZWcsIDEpCisKKyNkZWZpbmUJY21wbGVzc19tMnIodmFyLCByZWcpCQlzc2VfbTJyaShjbXBzcywgdmFyLCByZWcsIDIpCisjZGVmaW5lCWNtcGxlc3NfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyaShjbXBzcywgcmVncywgcmVnZCwgMikKKyNkZWZpbmUJY21wbGVzcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm1pKGNtcHNzLCB2YXJzLCB2YXJkLCB4bW1yZWcsIDIpCisKKyNkZWZpbmUJY21wdW5vcmRzc19tMnIodmFyLCByZWcpCXNzZV9tMnJpKGNtcHNzLCB2YXIsIHJlZywgMykKKyNkZWZpbmUJY21wdW5vcmRzc19yMnIocmVncywgcmVnZCkJc3NlX3IycmkoY21wc3MsIHJlZ3MsIHJlZ2QsIDMpCisjZGVmaW5lCWNtcHVub3Jkc3ModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtaShjbXBzcywgdmFycywgdmFyZCwgeG1tcmVnLCAzKQorCisjZGVmaW5lCWNtcG5lcXNzX20ycih2YXIsIHJlZykJCXNzZV9tMnJpKGNtcHNzLCB2YXIsIHJlZywgNCkKKyNkZWZpbmUJY21wbmVxc3NfcjJyKHJlZ3MsIHJlZ2QpCXNzZV9yMnJpKGNtcHNzLCByZWdzLCByZWdkLCA0KQorI2RlZmluZQljbXBuZXFzcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm1pKGNtcHNzLCB2YXJzLCB2YXJkLCB4bW1yZWcsIDQpCisKKyNkZWZpbmUJY21wbmx0c3NfbTJyKHZhciwgcmVnKQkJc3NlX20ycmkoY21wc3MsIHZhciwgcmVnLCA1KQorI2RlZmluZQljbXBubHRzc19yMnIocmVncywgcmVnZCkJc3NlX3IycmkoY21wc3MsIHJlZ3MsIHJlZ2QsIDUpCisjZGVmaW5lCWNtcG5sdHNzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybWkoY21wc3MsIHZhcnMsIHZhcmQsIHhtbXJlZywgNSkKKworI2RlZmluZQljbXBubGVzc19tMnIodmFyLCByZWcpCQlzc2VfbTJyaShjbXBzcywgdmFyLCByZWcsIDYpCisjZGVmaW5lCWNtcG5sZXNzX3IycihyZWdzLCByZWdkKQlzc2VfcjJyaShjbXBzcywgcmVncywgcmVnZCwgNikKKyNkZWZpbmUJY21wbmxlc3ModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtaShjbXBzcywgdmFycywgdmFyZCwgeG1tcmVnLCA2KQorCisjZGVmaW5lCWNtcG9yZHNzX20ycih2YXIsIHJlZykJCXNzZV9tMnJpKGNtcHNzLCB2YXIsIHJlZywgNykKKyNkZWZpbmUJY21wb3Jkc3NfcjJyKHJlZ3MsIHJlZ2QpCXNzZV9yMnJpKGNtcHNzLCByZWdzLCByZWdkLCA3KQorI2RlZmluZQljbXBvcmRzcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm1pKGNtcHNzLCB2YXJzLCB2YXJkLCB4bW1yZWcsIDcpCisKKworLyoJTG93ZXN0IEZpZWxkIG9mIDR4MzJmIFBhcmFsbGVsIENvTVBhcmVzIHRvIHNldCBFRkxBR1MKKwkocmVzdWx0aW5nIGZpZWxkcyBhcmUgZWl0aGVyIDAgb3IgLTEpCisqLworI2RlZmluZQljb21pc3NfbTJyKHZhciwgcmVnKQkJc3NlX20ycihjb21pc3MsIHZhciwgcmVnKQorI2RlZmluZQljb21pc3NfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKGNvbWlzcywgcmVncywgcmVnZCkKKyNkZWZpbmUJY29taXNzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybShjb21pc3MsIHZhcnMsIHZhcmQsIHhtbXJlZykKKworCisvKglMb3dlc3QgRmllbGQgb2YgNHgzMmYgVW5vcmRlcmVkIFBhcmFsbGVsIENvTVBhcmVzIHRvIHNldCBFRkxBR1MKKwkocmVzdWx0aW5nIGZpZWxkcyBhcmUgZWl0aGVyIDAgb3IgLTEpCisqLworI2RlZmluZQl1Y29taXNzX20ycih2YXIsIHJlZykJCXNzZV9tMnIodWNvbWlzcywgdmFyLCByZWcpCisjZGVmaW5lCXVjb21pc3NfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKHVjb21pc3MsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXVjb21pc3ModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtKHVjb21pc3MsIHZhcnMsIHZhcmQsIHhtbXJlZykKKworCisvKgkyLSg0eDMyZikgLT4gNHgzMmYgVU5QYUNLIExvdyBQYWNrZWQgU2luZ2xlLWZwCisJKGludGVybGVhdmVzIGxvdyBoYWxmIG9mIGRlc3Qgd2l0aCBsb3cgaGFsZiBvZiBzb3VyY2UKKwkgYXMgcGFkZGluZyBpbiBlYWNoIHJlc3VsdCBmaWVsZCkKKyovCisjZGVmaW5lCXVucGNrbHBzX20ycih2YXIsIHJlZykJCXNzZV9tMnIodW5wY2tscHMsIHZhciwgcmVnKQorI2RlZmluZQl1bnBja2xwc19yMnIocmVncywgcmVnZCkJc3NlX3Iycih1bnBja2xwcywgcmVncywgcmVnZCkKKworCisvKgkyLSg0eDMyZikgLT4gNHgzMmYgVU5QYUNLIEhpZ2ggUGFja2VkIFNpbmdsZS1mcAorCShpbnRlcmxlYXZlcyBoaWdoIGhhbGYgb2YgZGVzdCB3aXRoIGhpZ2ggaGFsZiBvZiBzb3VyY2UKKwkgYXMgcGFkZGluZyBpbiBlYWNoIHJlc3VsdCBmaWVsZCkKKyovCisjZGVmaW5lCXVucGNraHBzX20ycih2YXIsIHJlZykJCXNzZV9tMnIodW5wY2tocHMsIHZhciwgcmVnKQorI2RlZmluZQl1bnBja2hwc19yMnIocmVncywgcmVnZCkJc3NlX3Iycih1bnBja2hwcywgcmVncywgcmVnZCkKKworCisKKy8qCUZwIGFuZCBtbVggUmVTVE9SZSBzdGF0ZQorKi8KKyNpZmRlZglTU0VfVFJBQ0UKKwkjZGVmaW5lCWZ4cnN0b3IobWVtKSBcCisJeyBcCisJCWZwcmludGYoc3RkZXJyLCAiZnhyc3RvcigpXG4iKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImZ4cnN0b3IgJTAiIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCisJCQkgICAgICA6ICJYIiAobWVtKSkgXAorCX0KKyNlbHNlCisJI2RlZmluZQlmeHJzdG9yKG1lbSkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgiZnhyc3RvciAlMCIgXAorCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCSAgICAgIDogIlgiIChtZW0pKQorI2VuZGlmCisKKworLyoJRnAgYW5kIG1tWCBTQVZFIHN0YXRlCisqLworI2lmZGVmCVNTRV9UUkFDRQorCSNkZWZpbmUJZnhzYXZlKG1lbSkgXAorCXsgXAorCQlmcHJpbnRmKHN0ZGVyciwgImZ4c2F2ZSgpXG4iKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImZ4c2F2ZSAlMCIgXAorCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCSAgICAgIDogIlgiIChtZW0pKSBcCisJfQorI2Vsc2UKKwkjZGVmaW5lCWZ4c2F2ZShtZW0pIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImZ4c2F2ZSAlMCIgXAorCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCSAgICAgIDogIlgiIChtZW0pKQorI2VuZGlmCisKKworLyoJU1RvcmUgc3RyZWFNaW5nIHNpbWQgZVh0ZW5zaW9ucyBDb250cm9sL1N0YXR1cyBSZWdpc3RlcgorKi8KKyNpZmRlZglTU0VfVFJBQ0UKKwkjZGVmaW5lCXN0bXhjc3IobWVtKSBcCisJeyBcCisJCWZwcmludGYoc3RkZXJyLCAic3RteGNzcigpXG4iKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN0bXhjc3IgJTAiIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCisJCQkgICAgICA6ICJYIiAobWVtKSkgXAorCX0KKyNlbHNlCisJI2RlZmluZQlzdG14Y3NyKG1lbSkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgic3RteGNzciAlMCIgXAorCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCSAgICAgIDogIlgiIChtZW0pKQorI2VuZGlmCisKKworLyoJTG9hRCBzdHJlYU1pbmcgc2ltZCBlWHRlbnNpb25zIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyCisqLworI2lmZGVmCVNTRV9UUkFDRQorCSNkZWZpbmUJbGRteGNzcihtZW0pIFwKKwl7IFwKKwkJZnByaW50ZihzdGRlcnIsICJsZG14Y3NyKClcbiIpOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibGRteGNzciAlMCIgXAorCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCSAgICAgIDogIlgiIChtZW0pKSBcCisJfQorI2Vsc2UKKwkjZGVmaW5lCWxkbXhjc3IobWVtKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJsZG14Y3NyICUwIiBcCisJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gXAorCQkJICAgICAgOiAiWCIgKG1lbSkpCisjZW5kaWYKKworCisvKglTdG9yZSBGRU5DRSAtIGVuZm9yY2Ugb3JkZXJpbmcgb2Ygc3RvcmVzIGJlZm9yZSBmZW5jZSB2cy4gc3RvcmVzCisJb2NjdXJpbmcgYWZ0ZXIgZmVuY2UgaW4gc291cmNlIGNvZGUuCisqLworI2lmZGVmCVNTRV9UUkFDRQorCSNkZWZpbmUJc2ZlbmNlKCkgXAorCXsgXAorCQlmcHJpbnRmKHN0ZGVyciwgInNmZW5jZSgpXG4iKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInNmZW5jZVxuXHQiKSBcCisJfQorI2Vsc2UKKwkjZGVmaW5lCXNmZW5jZSgpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInNmZW5jZVxuXHQiKQorI2VuZGlmCisKKworLyoJUFJFRkVUQ0ggZGF0YSB1c2luZyBUMCwgVDEsIFQyLCBvciBOVEEgaGludAorCQlUMCAgPSBQcmVmZXRjaCBpbnRvIGFsbCBjYWNoZSBsZXZlbHMKKwkJVDEgID0gUHJlZmV0Y2ggaW50byBhbGwgY2FjaGUgbGV2ZWxzIGV4Y2VwdCAwdGggbGV2ZWwKKwkJVDIgID0gUHJlZmV0Y2ggaW50byBhbGwgY2FjaGUgbGV2ZWxzIGV4Y2VwdCAwdGggYW5kIDFzdCBsZXZlbHMKKwkJTlRBID0gUHJlZmV0Y2ggZGF0YSBpbnRvIG5vbi10ZW1wb3JhbCBjYWNoZSBzdHJ1Y3R1cmUKKyovCisjaWZkZWYJU1NFX1RSQUNFCisjZWxzZQorCSNkZWZpbmUJcHJlZmV0Y2gobWVtLCBoaW50KSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJwcmVmZXRjaCIgI2hpbnQgIiAlMCIgXAorCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCSAgICAgIDogIlgiIChtZW0pKQorCisJI2RlZmluZQlwcmVmZXRjaHQwKG1lbSkJCXByZWZldGNoKG1lbSwgdDApCisJI2RlZmluZQlwcmVmZXRjaHQxKG1lbSkJCXByZWZldGNoKG1lbSwgdDEpCisJI2RlZmluZQlwcmVmZXRjaHQyKG1lbSkJCXByZWZldGNoKG1lbSwgdDIpCisJI2RlZmluZQlwcmVmZXRjaG50YShtZW0pCXByZWZldGNoKG1lbSwgbnRhKQorI2VuZGlmCisKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzZTcyYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC5jCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEJpbGx5IEJpZ2dzIDx2ZWt0b3JAZHVtYnRlcm0ubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA4LDIwMTAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBSZWxpY2Vuc2VkIGZvciBHU3RyZWFtZXIgZnJvbSBHUEwgdG8gTEdQTCB3aXRoIHBlcm1pdCBmcm9tIFRvbSBCYXJyeS4KKyAqIFNlZTogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTYzNTc4CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2lmZGVmIEhBVkVfT1JDCisjaW5jbHVkZSA8b3JjL29yYy5oPgorI2VuZGlmCisjaW5jbHVkZSAiZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaCIKKyNpbmNsdWRlICJwbHVnaW5zLmgiCisKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1RPTVNNT0NPTVAJKGdzdF9kZWludGVybGFjZV9tZXRob2RfdG9tc21vY29tcF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9UT01TTU9DT01QKG9iaikJCShHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9UT01TTU9DT01QKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9UT01TTU9DT01QX0NMQVNTKGtsYXNzKQkoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9UT01TTU9DT01QKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9UT01TTU9DT01QX0dFVF9DTEFTUyhvYmopCShHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1RPTVNNT0NPTVAsIEdzdERlaW50ZXJsYWNlTWV0aG9kVG9tc01vQ29tcENsYXNzKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9UT01TTU9DT01QKG9iaikJCShHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9UT01TTU9DT01QLCBHc3REZWludGVybGFjZU1ldGhvZFRvbXNNb0NvbXApKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX1RPTVNNT0NPTVBfQ0xBU1Moa2xhc3MpCShHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1RPTVNNT0NPTVAsIEdzdERlaW50ZXJsYWNlTWV0aG9kVG9tc01vQ29tcENsYXNzKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9UT01TTU9DT01QX0NBU1Qob2JqKQkoKEdzdERlaW50ZXJsYWNlTWV0aG9kVG9tc01vQ29tcCopKG9iaikpCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kIHBhcmVudDsKKworICBndWludCBzZWFyY2hfZWZmb3J0OworICBnYm9vbGVhbiBzdHJhbmdlX2JvYjsKK30gR3N0RGVpbnRlcmxhY2VNZXRob2RUb21zTW9Db21wOworCit0eXBlZGVmIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgR3N0RGVpbnRlcmxhY2VNZXRob2RUb21zTW9Db21wQ2xhc3M7CisKK3N0YXRpYyB2b2lkCitGaWVsZGNvcHkgKGd1aW50OCAqIGRlc3QsIGNvbnN0IGd1aW50OCAqIHNyYywgZ2ludCBjb3VudCwKKyAgICBnaW50IHJvd3MsIGdpbnQgZHN0X3BpdGNoLCBnaW50IHNyY19waXRjaCkKK3sKKyAgZ2ludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKKyAgICBtZW1jcHkgKGRlc3QsIHNyYywgY291bnQpOworICAgIHNyYyArPSBzcmNfcGl0Y2g7CisgICAgZGVzdCArPSBkc3RfcGl0Y2g7CisgIH0KK30KKworI2RlZmluZSBVU0VfRk9SX0RTQ0FMRVIKKworI2RlZmluZSBJU19DCisjZGVmaW5lIFNJTURfVFlQRSBDCisjZGVmaW5lIEZVTkNUX05BTUUgdG9tc21vY29tcERTY2FsZXJfQworI2luY2x1ZGUgInRvbXNtb2NvbXAvVG9tc01vQ29tcEFsbC5pbmMiCisjdW5kZWYgIElTX0MKKyN1bmRlZiAgU0lNRF9UWVBFCisjdW5kZWYgIEZVTkNUX05BTUUKKworI2lmZGVmIEJVSUxEX1g4Nl9BU00KKworI2luY2x1ZGUgInRvbXNtb2NvbXAvdG9tc21vY29tcG1hY3Jvcy5oIgorI2luY2x1ZGUgIng4Ni02NF9tYWNyb3MuaW5jIgorCisjZGVmaW5lIElTX01NWAorI2RlZmluZSBTSU1EX1RZUEUgTU1YCisjZGVmaW5lIEZVTkNUX05BTUUgdG9tc21vY29tcERTY2FsZXJfTU1YCisjaW5jbHVkZSAidG9tc21vY29tcC9Ub21zTW9Db21wQWxsLmluYyIKKyN1bmRlZiAgSVNfTU1YCisjdW5kZWYgIFNJTURfVFlQRQorI3VuZGVmICBGVU5DVF9OQU1FCisKKyNkZWZpbmUgSVNfM0ROT1cKKyNkZWZpbmUgU0lNRF9UWVBFIDNETk9XCisjZGVmaW5lIEZVTkNUX05BTUUgdG9tc21vY29tcERTY2FsZXJfM0ROT1cKKyNpbmNsdWRlICJ0b21zbW9jb21wL1RvbXNNb0NvbXBBbGwuaW5jIgorI3VuZGVmICBJU18zRE5PVworI3VuZGVmICBTSU1EX1RZUEUKKyN1bmRlZiAgRlVOQ1RfTkFNRQorCisjZGVmaW5lIElTX01NWEVYVAorI2RlZmluZSBTSU1EX1RZUEUgTU1YRVhUCisjZGVmaW5lIEZVTkNUX05BTUUgdG9tc21vY29tcERTY2FsZXJfTU1YRVhUCisjaW5jbHVkZSAidG9tc21vY29tcC9Ub21zTW9Db21wQWxsLmluYyIKKyN1bmRlZiAgSVNfTU1YRVhUCisjdW5kZWYgIFNJTURfVFlQRQorI3VuZGVmICBGVU5DVF9OQU1FCisKKyNlbmRpZgorCitHX0RFRklORV9UWVBFIChHc3REZWludGVybGFjZU1ldGhvZFRvbXNNb0NvbXAsCisgICAgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF90b21zbW9jb21wLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0QpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9TRUFSQ0hfRUZGT1JULAorICBQUk9QX1NUUkFOR0VfQk9CCit9OworCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF90b21zbW9jb21wX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3REZWludGVybGFjZU1ldGhvZFRvbXNNb0NvbXAgKnNlbGYgPQorICAgICAgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9UT01TTU9DT01QIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TRUFSQ0hfRUZGT1JUOgorICAgICAgc2VsZi0+c2VhcmNoX2VmZm9ydCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVFJBTkdFX0JPQjoKKyAgICAgIHNlbGYtPnN0cmFuZ2VfYm9iID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2RfdG9tc21vY29tcF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2RUb21zTW9Db21wICpzZWxmID0KKyAgICAgIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfVE9NU01PQ09NUCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU0VBUkNIX0VGRk9SVDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzZWxmLT5zZWFyY2hfZWZmb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVFJBTkdFX0JPQjoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBzZWxmLT5zdHJhbmdlX2JvYik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorICAgIGdzdF9kZWludGVybGFjZV9tZXRob2RfdG9tc21vY29tcF9jbGFzc19pbml0CisgICAgKEdzdERlaW50ZXJsYWNlTWV0aG9kVG9tc01vQ29tcENsYXNzICoga2xhc3MpCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKmRpbV9jbGFzcyA9IChHc3REZWludGVybGFjZU1ldGhvZENsYXNzICopIGtsYXNzOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworI2lmZGVmIEJVSUxEX1g4Nl9BU00KKyAgZ3VpbnQgY3B1X2ZsYWdzID0KKyAgICAgIG9yY190YXJnZXRfZ2V0X2RlZmF1bHRfZmxhZ3MgKG9yY190YXJnZXRfZ2V0X2J5X25hbWUgKCJtbXgiKSk7CisjZW5kaWYKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3RvbXNtb2NvbXBfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3RvbXNtb2NvbXBfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU0VBUkNIX0VGRk9SVCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgic2VhcmNoLWVmZm9ydCIsCisgICAgICAgICAgIlNlYXJjaCBFZmZvcnQiLAorICAgICAgICAgICJTZWFyY2ggRWZmb3J0IiwgMCwgMjcsIDUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykKKyAgICAgICk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TVFJBTkdFX0JPQiwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgic3RyYW5nZS1ib2IiLAorICAgICAgICAgICJTdHJhbmdlIEJvYiIsCisgICAgICAgICAgIlVzZSBzdHJhbmdlIGJvYiIsIEZBTFNFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpCisgICAgICApOworCisgIGRpbV9jbGFzcy0+ZmllbGRzX3JlcXVpcmVkID0gNDsKKyAgZGltX2NsYXNzLT5uYW1lID0gIk1vdGlvbiBBZGFwdGl2ZTogTW90aW9uIFNlYXJjaCI7CisgIGRpbV9jbGFzcy0+bmljayA9ICJ0b21zbW9jb21wIjsKKyAgZGltX2NsYXNzLT5sYXRlbmN5ID0gMTsKKworI2lmZGVmIEJVSUxEX1g4Nl9BU00KKyAgaWYgKGNwdV9mbGFncyAmIE9SQ19UQVJHRVRfTU1YX01NWEVYVCkgeworICAgIGRpbV9jbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfeXV5MiA9IHRvbXNtb2NvbXBEU2NhbGVyX01NWEVYVDsKKyAgICBkaW1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l2eXUgPSB0b21zbW9jb21wRFNjYWxlcl9NTVhFWFQ7CisgIH0gZWxzZSBpZiAoY3B1X2ZsYWdzICYgT1JDX1RBUkdFVF9NTVhfM0ROT1cpIHsKKyAgICBkaW1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l1eTIgPSB0b21zbW9jb21wRFNjYWxlcl8zRE5PVzsKKyAgICBkaW1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l2eXUgPSB0b21zbW9jb21wRFNjYWxlcl8zRE5PVzsKKyAgfSBlbHNlIGlmIChjcHVfZmxhZ3MgJiBPUkNfVEFSR0VUX01NWF9NTVgpIHsKKyAgICBkaW1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l1eTIgPSB0b21zbW9jb21wRFNjYWxlcl9NTVg7CisgICAgZGltX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV95dnl1ID0gdG9tc21vY29tcERTY2FsZXJfTU1YOworICB9IGVsc2UgeworICAgIGRpbV9jbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfeXV5MiA9IHRvbXNtb2NvbXBEU2NhbGVyX0M7CisgICAgZGltX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV95dnl1ID0gdG9tc21vY29tcERTY2FsZXJfQzsKKyAgfQorI2Vsc2UKKyAgZGltX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV95dXkyID0gdG9tc21vY29tcERTY2FsZXJfQzsKKyAgZGltX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV95dnl1ID0gdG9tc21vY29tcERTY2FsZXJfQzsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF90b21zbW9jb21wX2luaXQgKEdzdERlaW50ZXJsYWNlTWV0aG9kVG9tc01vQ29tcCAqIHNlbGYpCit7CisgIHNlbGYtPnNlYXJjaF9lZmZvcnQgPSA1OworICBzZWxmLT5zdHJhbmdlX2JvYiA9IEZBTFNFOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3AwQS5pbmMgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcDBBLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWQ5YWVjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3AwQS5pbmMKQEAgLTAsMCArMSwxNSBAQAorLy8gLSotIGMrKyAtKi0KKworLy8gU2VhcmNoZXMganVzdCB0aGUgY2VudGVyIHBpeGVsLCBpbiBib3RoIHRoZSBvbGQKKy8vICBhbmQgbmV3IGZpZWxkcywgYnV0IHRha2VzIGF2ZXJhZ2VzLiBUaGlzIGlzIGFuIGV2ZW4KKy8vIHBpeGVsIGFkZHJlc3MuIEFueSBjaHJvbWEgbWF0Y2ggd2lsbCBiZSB1c2VkLiAoWVVZMikKKy8vIFdlIGJlc3QgbGlrZSBmaW5kaW5nIDAgbW90aW9uIHNvIHdlIHdpbGwgYmlhcyBldmVyeXRoaW5nIHdlIGZvdW5kIHByZXZpb3VzbHkKKy8vIHVwIGJ5IGEgbGl0dGxlLCBhbmQgYWRqdXN0IGxhdGVyCisKKyNpZmRlZiBJU19TU0UyCisJCSJwYWRkdXNiICJfT05FUyIsICUleG1tN1xuXHQiCQkJCS8vIGJpYXMgdG93YXJkIG5vIG1vdGlvbgorI2Vsc2UKKwkJInBhZGR1c2IgIl9PTkVTIiwgJSVtbTdcblx0IiAJCQkJLy8gYmlhcyB0b3dhcmQgbm8gbW90aW9uCisjZW5kaWYKKworICAgICAgICBNRVJHRTRQSVhhdmcoIiglJSJYREkiLCAlJSJYQ1giKSIsICIoJSUiWFNJIiwgJSUiWENYIikiKSAgLy8gY2VudGVyLCBpbiBvbGQgYW5kIG5ldwpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BCb3R0b20uaW5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BCb3R0b20uaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNTYwMzUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcEJvdHRvbS5pbmMKQEAgLTAsMCArMSwxNzQgQEAKKy8vIC0qLSBjKysgLSotICAgICAgIAorCisvLyBWZXJzaW9uIGZvciBub24tU1NFMgorCisjaWZuZGVmIElTX0MKKworI2lmZGVmIFNLSVBfU0VBUkNICisgICAgICAgICAgICAibW92cSAgICAlJW1tNiwgJSVtbTBcblx0IiAgICAgICAgICAgIC8vIGp1c3QgdXNlIHRoZSByZXN1bHRzIG9mIG91ciB3aWVyZCBib2IKKyNlbHNlCisKKworICAgICAgICAgICAgLy8gSkEgOS9EZWMvMjAwMgorICAgICAgICAgICAgLy8gZmFpbGVkIGV4cGVyaW1lbnQKKyAgICAgICAgICAgIC8vIGJ1dCBsZWF2ZSBpbiBwbGFjZWhvbGRlciBmb3IgbWUgdG8gcGxheSBhYm91dAorI2lmZGVmIERPTlRfVVNFX1NUUkFOR0VfQk9CCisgICAgICAgICAgICAvLyBVc2UgdGhlIGJlc3Qgd2VhdmUgaWYgZGlmZnMgbGVzcyB0aGFuIDEwIGFzIHRoYXQKKyAgICAgICAgICAgIC8vIG1lYW5zIHRoZSBpbWFnZSBpcyBzdGlsbCBvciBtb3ZpbmcgY2xlYW5seQorICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbW90aW9uIHdlIHdpbGwgY2xpcCB3aGljaCB3aWxsIGNhdGNoIGFueXRoaW5nCisgICAgICAgICAgICAicHN1YnVzYiAiX0ZPVVJTIiwgJSVtbTdcblx0IiAgICAgICAgICAvLyBzZXRzIGJpdHMgdG8gemVybyBpZiB3ZWF2ZSBkaWZmIDwgNAorICAgICAgICAgICAgInB4b3IgICAgJSVtbTAsICUlbW0wXG5cdCIKKyAgICAgICAgICAgICJwY21wZXFiICUlbW0wLCAlJW1tN1xuXHQiICAgICAgICAgICAgLy8gYWxsIGZmIHdoZXJlIHdlYXZlIGJldHRlciwgZWxzZSAwMAorICAgICAgICAgICAgInBjbXBlcWIgJSVtbTcsICUlbW0wXG5cdCIgICAgICAgICAgICAvLyBhbGwgZmYgd2hlcmUgYm9iIGJldHRlciwgZWxzZSAwMAorICAgICAgICAgICAgInBhbmQgICAgJSVtbTYsICUlbW0wXG5cdCIgICAgICAgICAgICAvLyB1c2UgYm9iIGZvciB0aGVzZSBwaXhlbCB2YWx1ZXMKKyAgICAgICAgICAgICJwYW5kICAgICUlbW01LCAlJW1tN1xuXHQiICAgICAgICAgICAgLy8gdXNlIHdlYXZlIGZvciB0aGVzZQorICAgICAgICAgICAgInBvciAgICAgJSVtbTcsICUlbW0wXG5cdCIgICAgICAgICAgICAvLyBjb21iaW5lIGJvdGgKKyNlbHNlCisgICAgICAgICAgICAvLyBVc2UgdGhlIGJldHRlciBvZiBib2Igb3Igd2VhdmUKKyAgICAgICAgICAgIC8vICAgICAgcG1pbnViICBtbTQsIFRFTlMgICAgICAgICAgIC8vIHRoZSBtb3N0IHdlIGNhcmUgYWJvdXQKKyAgICAgICAgICAgIFZfUE1JTlVCICgiJSVtbTQiLCBfVEVOUywgIiUlbW0wIikgICAvLyB0aGUgbW9zdCB3ZSBjYXJlIGFib3V0CisgICAgICAgICAgICAKKyAgICAgICAgICAgICJwc3VidXNiICUlbW00LCAlJW1tN1xuXHQiICAgICAgICAgICAgLy8gZm9yZWdpdmUgdGhhdCBtdWNoIGZyb20gd2VhdmUgZXN0PworICAgICAgICAgICAgInBzdWJ1c2IgIl9GT1VSUyIsICUlbW03XG5cdCIgICAgICAgLy8gYmlhcyBpdCBhIGJpdCB0b3dhcmQgd2VhdmUKKyAgICAgICAgICAgICJweG9yICAgICUlbW0wLCAlJW1tMFxuXHQiCisgICAgICAgICAgICAicGNtcGVxYiAlJW1tMCwgJSVtbTdcblx0IiAgICAgICAgICAgIC8vIGFsbCBmZiB3aGVyZSB3ZWF2ZSBiZXR0ZXIsIGVsc2UgMDAKKyAgICAgICAgICAgICJwY21wZXFiICUlbW03LCAlJW1tMFxuXHQiICAgICAgICAgICAgLy8gYWxsIGZmIHdoZXJlIGJvYiBiZXR0ZXIsIGVsc2UgMDAKKyAgICAgICAgICAgICJwYW5kICAgICUlbW02LCAlJW1tMFxuXHQiICAgICAgICAgICAgLy8gdXNlIGJvYiBmb3IgdGhlc2UgcGl4ZWwgdmFsdWVzCisgICAgICAgICAgICAicGFuZCAgICAlJW1tNSwgJSVtbTdcblx0IiAgICAgICAgICAgIC8vIHVzZSB3ZWF2ZSBmb3IgdGhlc2UKKyAgICAgICAgICAgICJwb3IgICAgICUlbW03LCAlJW1tMFxuXHQiICAgICAgICAgICAgLy8gY29tYmluZSBib3RoCisjZW5kaWYKKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gICAgICBwbWludWIgIG1tMCwgTWF4X1ZhbHMgICAgICAgLy8gYnV0IGNsaXAgdG8gY2F0Y2ggdGhlIHN0cmF5IGVycm9yCisgICAgICAgICAgICAgICAgVl9QTUlOVUIgKCIlJW1tMCIsIF9NYXhfVmFscywgIiUlbW0xIikgLy8gYnV0IGNsaXAgdG8gY2F0Y2ggdGhlIHN0cmF5IGVycm9yCisgICAgICAgICAgICAgICAgLy8gICAgICBwbWF4dWIgIG1tMCwgTWluX1ZhbHMKKyAgICAgICAgICAgICAgICBWX1BNQVhVQiAoIiUlbW0wIiwgX01pbl9WYWxzKQorICAgICAgICAgICAgICAgIAorI2VuZGlmCisKKworICAgICAgICAgICAgTU9WWCIgICAgICJfcERlc3QiLCAlJSJYQVgiXG5cdCIKKyAgICAgICAgICAgICAgICAKKyNpZmRlZiBVU0VfVkVSVElDQUxfRklMVEVSCisgICAgICAgICAgICAibW92cSAgICAlJW1tMCwgJSVtbTFcblx0IgorICAgICAgICAgICAgLy8gICAgICBwYXZnYiAgIG1tMCwgcXdvcmQgcHRyWyJYQlgiXQorICAgICAgICAgICAgVl9QQVZHQiAoIiUlbW0wIiwgIiglJSJYQlgiKSIsICIlJW1tMiIsIF9TaGlmdE1hc2spCisgICAgICAgICAgICAvLyAgICAgIG1vdm50cSAgcXdvcmQgcHRyWyJYQVgiKyJYRFgiXSwgbW0wCisgICAgICAgICAgICBWX01PVk5UUSAoIiglIlhBWCIsICUlIlhEWCIpIiwgIiUlbW0wIikKKyAgICAgICAgICAgIC8vICAgICAgcGF2Z2IgICBtbTEsIHF3b3JkIHB0clsiWEJYIisiWENYIl0KKyAgICAgICAgICAgIFZfUEFWR0IgKCIlJW1tMSIsICIoJSUiWEJYIiwgJSUiWENYIikiLCAiJSVtbTIiLCBfU2hpZnRNYXNrKQorCSAgICAvL0ZJWE1FOiBYRFggb3IgWEFYISEKKyAgICAgICAgICAgICJhZGRxICAgIl9kc3RfcGl0Y2h3IiwgJSUiWEJYCisgICAgICAgICAgICAvLyAgICAgIG1vdm50cSAgcXdvcmQgcHRyWyJYQVgiKyJYRFgiXSwgbW0xCisgICAgICAgICAgICBWX01PVk5UUSAoIiglJSJYQVgiLCAlJSJYRFgiKSIsICIlJW1tMSIpCisjZWxzZQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gICAgICBtb3ZudHEgIHF3b3JkIHB0clsiWEFYIisiWERYIl0sIG1tMAorICAgICAgICAgICAgICAgIFZfTU9WTlRRICgiKCUlIlhBWCIsICUlIlhEWCIpIiwgIiUlbW0wIikKKyNlbmRpZgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICBMRUFYIiAgICA4KCUlIlhEWCIpLCAlJSJYRFgiXG5cdCIgICAgICAgLy8gYnVtcCBvZmZzZXQgcG9pbnRlcgorICAgICAgICAgICBDTVBYIiAgICAiX0xhc3Q4IiwgJSUiWERYIlxuXHQiICAgICAgIC8vIGRvbmUgd2l0aCBsaW5lPworICAgICAgICAgICAiamIgICAgICAxYlxuXHQiICAgICAgICAgICAgICAgICAgICAvLyB5CisKKyAgICAgICAgICAgTU9WWCIgIl9vbGRieCIsICUlIlhCWCJcblx0IgorCisgICAgICAgIDogLyogbm8gb3V0cHV0cyAqLworCisgICAgICAgIDogIm0iKHBCb2IpLAorICAgICAgICAgICJtIihzcmNfcGl0Y2gyKSwKKyAgICAgICAgICAibSIoU2hpZnRNYXNrKSwKKyAgICAgICAgICAibSIocERlc3QpLAorICAgICAgICAgICJtIihkc3RfcGl0Y2h3KSwKKyAgICAgICAgICAibSIoTGFzdDgpLAorICAgICAgICAgICJtIihwU3JjKSwKKyAgICAgICAgICAibSIocFNyY1ApLAorICAgICAgICAgICJtIihwQm9iUCksCisgICAgICAgICAgIm0iKERpZmZUaHJlcyksCisgICAgICAgICAgIm0iKE1pbl9WYWxzKSwKKyAgICAgICAgICAibSIoTWF4X1ZhbHMpLAorICAgICAgICAgICJtIihGT1VSUyksCisgICAgICAgICAgIm0iKFRFTlMpLAorICAgICAgICAgICJtIihPTkVTKSwKKyAgICAgICAgICAibSIoVVZNYXNrKSwKKyAgICAgICAgICAibSIoTWF4X01vdiksCisgICAgICAgICAgIm0iKFlNYXNrKSwKKyAgICAgICAgICAibSIob2xkYngpCisKKyAgICAgICAgOiBYQVgsIFhDWCwgWERYLCBYU0ksIFhESSwKKyAgICAgICAgICAic3QiLCAic3QoMSkiLCAic3QoMikiLCAic3QoMykiLCAic3QoNCkiLCAic3QoNSkiLCAic3QoNikiLCAic3QoNykiLAorI2lmZGVmIF9fTU1YX18KKyAgICAgICAgICAibW0wIiwgIm1tMSIsICJtbTIiLCAibW0zIiwgIm1tNCIsICJtbTUiLCAibW02IiwgIm1tNyIsCisjZW5kaWYKKyAgICAgICAgICAibWVtb3J5IiwgImNjIgorICAgICAgICApOworCisgICAgICAgIC8vIGFkanVzdCBmb3IgbmV4dCBsaW5lCisgICAgICAgIHBTcmMgICs9IHNyY19waXRjaDI7CisgICAgICAgIHBTcmNQICs9IHNyY19waXRjaDI7CisgICAgICAgIHBEZXN0ICs9IGRzdF9waXRjaDI7CisgICAgICAgIHBCb2IgICs9IHNyY19waXRjaDI7CisgICAgICAgIHBCb2JQICs9IHNyY19waXRjaDI7CisgICAgfQorICAgIAorICAgIHJldHVybiAwOworI2Vsc2UKKyNpZmRlZiBTS0lQX1NFQVJDSAorICAgICAgICAgICAgb3V0WzBdID0gYmVzdFswXTsgICAgICAgICAgICAvLyBqdXN0IHVzZSB0aGUgcmVzdWx0cyBvZiBvdXIgd2llcmQgYm9iCisJICAgIG91dFsxXSA9IGJlc3RbMV07CisjZWxzZQorICAgICAgICAgICAgZGlmZlswXSA9IGRpZmZbMF0gLSBNSU4gKGRpZmZbMF0sIDEwKSAtIDQ7CisJICAgIGRpZmZbMV0gPSBkaWZmWzFdIC0gTUlOIChkaWZmWzFdIC0gMTApIC0gNDsKKwkgICAgaWYgKGRpZmZbMF0gPCAwKQorCSAgICAgIG91dFswXSA9IHdlYXZlWzBdOworCSAgICBlbHNlCisJICAgICAgb3V0WzBdID0gYmVzdFswXTsKKwkgICAgCisJICAgIGlmIChkaWZmWzFdIDwgMCkKKwkgICAgICBvdXRbMV0gPSB3ZWF2ZVsxXTsKKwkgICAgZWxzZQorCSAgICAgIG91dFsxXSA9IGJlc3RbMV07CisKKworCSAgICBvdXRbMF0gPSBDTEFNUCAob3V0WzBdLCBNaW5WYWxzWzBdLCBNYXhWYWxzWzBdKTsKKwkgICAgb3V0WzFdID0gQ0xBTVAgKG91dFsxXSwgTWluVmFsc1sxXSwgTWF4VmFsc1sxXSk7CisjZW5kaWYKKworI2lmZGVmIFVTRV9WRVJUSUNBTF9GSUxURVIKKyAgICAgICAgICAgIHBEZXN0W3hdID0gKG91dFswXSArIHBCb2JbMF0pIC8gMjsKKwkgICAgcERlc3RbeCArIGRzdF9waXRjaHddID0gKHBCb2Jbc3JjX3BpdGNoMl0gKyBvdXRbMF0pIC8gMjsKKyAgICAgICAgICAgIHBEZXN0W3ggKyAxXSA9IChvdXRbMV0gKyBwQm9iWzFdKSAvIDI7CisJICAgIHBEZXN0W3ggKyAxICsgZHN0X3BpdGNod10gPSAocEJvYltzcmNfcGl0Y2gyICsgMV0gKyBvdXRbMV0pIC8gMjsKKyNlbHNlCisgICAgICAgICAgICBwRGVzdFt4XSA9IG91dFswXTsKKwkgICAgcERlc3RbeCsxXSA9IG91dFsxXTsKKyNlbmRpZgorICAgICAgICAgICAgcEJvYiArPSAyOworICAgICAgICAgICAgcEJvYlAgKz0gMjsKKyAgICAgICAgICAgIHBTcmMgKz0gMjsKKyAgICAgICAgICAgIHBTcmNQICs9IDI7CisJfQorICAgICAgICAvLyBhZGp1c3QgZm9yIG5leHQgbGluZQorICAgICAgICBwU3JjICA9IHNyY19waXRjaDIgKiAoeSsxKSArIHBXZWF2ZVNyYzsKKyAgICAgICAgcFNyY1AgPSBzcmNfcGl0Y2gyICogKHkrMSkgKyBwV2VhdmVTcmNQOworICAgICAgICBwRGVzdCA9IGRzdF9waXRjaDIgKiAoeSsxKSArIHBXZWF2ZURlc3QgKyBkc3RfcGl0Y2gyOworCisKKwlpZiAoVG9wRmlyc3QpCisJeworCQlwQm9iID0gcENvcHlTcmMgKyBzcmNfcGl0Y2gyOworCQlwQm9iUCA9IHBDb3B5U3JjUCArIHNyY19waXRjaDI7CisJfQorCWVsc2UKKwl7CisJCXBCb2IgPSAgcENvcHlTcmM7CisJCXBCb2JQID0gIHBDb3B5U3JjUDsKKwl9CisKKyAgICAgICAgcEJvYiAgKz0gc3JjX3BpdGNoMiAqICh5KzEpOworICAgICAgICBwQm9iUCArPSBzcmNfcGl0Y2gyICogKHkrMSk7CisgICAgfQorICAgIAorICAgIHJldHVybiAwOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wRWRnZUEuaW5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BFZGdlQS5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIwOGZlOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wRWRnZUEuaW5jCkBAIC0wLDAgKzEsMTEgQEAKKy8vIC0qLSBjKysgLSotCisKKy8vIFNlYXJjaGVzIDIgcGl4ZWwgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0LCBpbiBib3RoIHRoZSBvbGQKKy8vICBhbmQgbmV3IGZpZWxkcywgYnV0IHRha2VzIGF2ZXJhZ2VzLiBUaGVzZSBhcmUgZXZlbgorLy8gcGl4ZWwgYWRkcmVzc2VzLiBDaHJvbWEgbWF0Y2ggd2lsbCBiZSB1c2VkLiAoWVVZMikKKyAgICAgICAgTUVSR0U0UElYYXZnKCItNCglJSJYREkiKSIsICI0KCUlIlhTSSIsICUlIlhDWCIsIDIpIikgIC8vIHVwIGxlZnQsIGRvd24gcmlnaHQKKyAgICAgICAgTUVSR0U0UElYYXZnKCI0KCUlIlhESSIpIiwgIi00KCUlIlhTSSIsICUlIlhDWCIsIDIpIikgIC8vIHVwIHJpZ2h0LCBkb3duIGxlZnQKKyAgICAgICAgTUVSR0U0UElYYXZnKCItNCglJSJYREkiLCAlJSJYQ1giKSIsICI0KCUlIlhTSSIsICUlIlhDWCIpIikgLy8gbGVmdCwgcmlnaHQKKyAgICAgICAgTUVSR0U0UElYYXZnKCI0KCUlIlhESSIsICUlIlhDWCIpIiwgIi00KCUlIlhTSSIsICUlIlhDWCIpIikgLy8gcmlnaHQsIGxlZnQKKyAgICAgICAgTUVSR0U0UElYYXZnKCItNCglJSJYREkiLCAlJSJYQ1giLCAyKSIsICI0KCUlIlhTSSIpIikgICAvLyBkb3duIGxlZnQsIHVwIHJpZ2h0CisgICAgICAgIE1FUkdFNFBJWGF2ZygiNCglJSJYREkiLCAlJSJYQ1giLCAyKSIsICItNCglJSJYU0kiKSIpICAgLy8gZG93biByaWdodCwgdXAgbGVmdApkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BFZGdlQTguaW5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BFZGdlQTguaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NDFjM2YKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcEVkZ2VBOC5pbmMKQEAgLTAsMCArMSwxMiBAQAorLy8gLSotIGMrKyAtKi0KKworLy8gU2VhcmNoZXMgNCBwaXhlbCB0byB0aGUgbGVmdCBhbmQgcmlnaHQsIGluIGJvdGggdGhlIG9sZAorLy8gIGFuZCBuZXcgZmllbGRzLCBidXQgdGFrZXMgYXZlcmFnZXMuIFRoZXNlIGFyZSBldmVuCisvLyBwaXhlbCBhZGRyZXNzZXMuIENocm9tYSBtYXRjaCB3aWxsIGJlIHVzZWQuIChZVVkyKQorICAgICAgICBNRVJHRTRQSVhhdmcoIi04KCUlIlhESSIpIiwgIjgoJSUiWFNJIiwgJSUiWENYIiwgMikiKSAgLy8gdXAgbGVmdCwgZG93biByaWdodAorICAgICAgICBNRVJHRTRQSVhhdmcoIjgoJSUiWERJIikiLCAiLTgoJSUiWFNJIiwgJSUiWENYIiwgMikiKSAgLy8gdXAgcmlnaHQsIGRvd24gbGVmdAorICAgICAgICBNRVJHRTRQSVhhdmcoIi04KCUlIlhESSIsICUlIlhDWCIpIiwgIjgoJSUiWFNJIiwgJSUiWENYIikiKSAvLyBsZWZ0LCByaWdodAorICAgICAgICBNRVJHRTRQSVhhdmcoIjgoJSUiWERJIiwgJSUiWENYIikiLCAiLTgoJSUiWFNJIiwgJSUiWENYIikiKSAvLyByaWdodCwgbGVmdAorICAgICAgICBNRVJHRTRQSVhhdmcoIi04KCUlIlhESSIsICUlIlhDWCIsIDIpIiwgIjgoJSUiWFNJIikiKSAgIC8vIGRvd24gbGVmdCwgdXAgcmlnaHQKKyAgICAgICAgTUVSR0U0UElYYXZnKCI4KCUlIlhESSIsICUlIlhDWCIsIDIpIiwgIi04KCUlIlhTSSIpIikgICAvLyBkb3duIHJpZ2h0LCB1cCBsZWZ0CisKZGlmZiAtLWdpdCBhL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wT2RkQS5pbmMgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEEuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNTM3NWYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEEuaW5jCkBAIC0wLDAgKzEsMTAgQEAKKy8vIC0qLSBjKysgLSotCisKKy8vIFNlYXJjaGVzIDEgcGl4ZWwgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0LCBpbiBib3RoIHRoZSBvbGQKKy8vICBhbmQgbmV3IGZpZWxkcywgYnV0IHRha2VzIGF2ZXJhZ2VzLiBUaGVzZSBhcmUgb2RkCisvLyBwaXhlbCBhZGRyZXNzZXMuIEFueSBjaHJvbWEgbWF0Y2ggd2lsbCBub3QgYmUgdXNlZC4gKFlVWTIpCisgICAgICAgIE1FUkdFNFBJWGF2ZygiLTIoJSUiWERJIikiLCAiMiglJSJYU0kiLCAlJSJYQ1giLCAyKSIpICAvLyB1cCBsZWZ0LCBkb3duIHJpZ2h0CisgICAgICAgIE1FUkdFNFBJWGF2ZygiMiglJSJYREkiKSIsICItMiglJSJYU0kiLCAlJSJYQ1giLCAyKSIpICAvLyB1cCByaWdodCwgZG93biBsZWZ0CisgICAgICAgIE1FUkdFNFBJWGF2ZygiLTIoJSUiWERJIiwgJSUiWENYIiwgMikiLCAiMiglJSJYU0kiKSIpICAgLy8gZG93biBsZWZ0LCB1cCByaWdodAorICAgICAgICBNRVJHRTRQSVhhdmcoIjIoJSUiWERJIiwgJSUiWENYIiwgMikiLCAiLTIoJSUiWFNJIikiKSAgIC8vIGRvd24gcmlnaHQsIHVwIGxlZnQgICAKKyNpbmNsdWRlICJTZWFyY2hMb29wT2RkQTIuaW5jIgpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBMi5pbmMgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEEyLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDNmNmZiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBMi5pbmMKQEAgLTAsMCArMSw1IEBACisvLyBTZWFyY2hlcyAxIHBpeGVsIHRvIHRoZSBsZWZ0IGFuZCByaWdodCwgaW4gYm90aCB0aGUgb2xkCisvLyBhbmQgbmV3IGZpZWxkcywgYnV0IHRha2VzIGF2ZXJhZ2VzLiBUaGVzZSBhcmUgb2RkCisvLyBwaXhlbCBhZGRyZXNzZXMuIEFueSBjaHJvbWEgbWF0Y2ggd2lsbCBub3QgYmUgdXNlZC4gKFlVWTIpCisgICAgICAgIE1FUkdFNFBJWGF2ZygiLTIoJSUiWERJIiwgJSUiWENYIikiLCAiMiglJSJYU0kiLCAlJSJYQ1giKSIpIC8vIGxlZnQsIHJpZ2h0CisgICAgICAgIE1FUkdFNFBJWGF2ZygiMiglJSJYREkiLCAlJSJYQ1giKSIsICItMiglJSJYU0kiLCAlJSJYQ1giKSIpIC8vIHJpZ2h0LCBsZWZ0CmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEE2LmluYyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wT2RkQTYuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYWUwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEE2LmluYwpAQCAtMCwwICsxLDExIEBACisvLyAtKi0gYysrIC0qLQorCisvLyBTZWFyY2hlcyAzIHBpeGVscyB0byB0aGUgbGVmdCBhbmQgcmlnaHQsIGluIGJvdGggdGhlIG9sZAorLy8gIGFuZCBuZXcgZmllbGRzLCBidXQgdGFrZXMgYXZlcmFnZXMuIFRoZXNlIGFyZSBvZGQKKy8vIHBpeGVsIGFkZHJlc3Nlcy4gQW55IGNocm9tYSBtYXRjaCB3aWxsIG5vdCBiZSB1c2VkLiAoWVVZMikKKyAgICAgICAgTUVSR0U0UElYYXZnKCItNiglJSJYREkiKSIsICI2KCUlIlhTSSIsICUlIlhDWCIsIDIpIikgIC8vIHVwIGxlZnQsIGRvd24gcmlnaHQKKyAgICAgICAgTUVSR0U0UElYYXZnKCI2KCUlIlhESSIpIiwgIi02KCUlIlhTSSIsICUlIlhDWCIsIDIpIikgIC8vIHVwIHJpZ2h0LCBkb3duIGxlZnQKKyAgICAgICAgTUVSR0U0UElYYXZnKCItNiglJSJYREkiLCAlJSJYQ1giKSIsICI2KCUlIlhTSSIsICUlIlhDWCIpIikgLy8gbGVmdCwgcmlnaHQKKyAgICAgICAgTUVSR0U0UElYYXZnKCI2KCUlIlhESSIsICUlIlhDWCIpIiwgIi02KCUlIlhTSSIsICUlIlhDWCIpIikgLy8gcmlnaHQsIGxlZnQKKyAgICAgICAgTUVSR0U0UElYYXZnKCItNiglJSJYREkiLCAlJSJYQ1giLCAyKSIsICI2KCUlIlhTSSIpIikgICAvLyBkb3duIGxlZnQsIHVwIHJpZ2h0CisgICAgICAgIE1FUkdFNFBJWGF2ZygiNiglJSJYREkiLCAlJSJYQ1giLCAyKSIsICItNiglJSJYU0kiKSIpICAgLy8gZG93biByaWdodCwgdXAgbGVmdApkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBSC5pbmMgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEFILmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTllM2M3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBSC5pbmMKQEAgLTAsMCArMSwxMCBAQAorLy8gU2VhcmNoZXMgMSBwaXhlbCB0byB0aGUgbGVmdCBhbmQgcmlnaHQsIGluIGJvdGggdGhlIG9sZA0KKy8vICBhbmQgbmV3IGZpZWxkcywgYnV0IHRha2VzIHYtaGFsZiBwZWwgYXZlcmFnZXMuIFRoZXNlIGFyZSBvZGQNCisvLyBwaXhlbCBhZGRyZXNzZXMuIEFueSBjaHJvbWEgbWF0Y2ggd2lsbCBub3QgYmUgdXNlZC4gKFlVWTIpDQorCQlfX2FzbQ0KKwkJew0KKyAgICAgICAgTUVSR0U0UElYYXZnSCgiWERJIi0yLCAiWERJIisiWENYIi0yLCAiWFNJIisiWENYIisyLCAiWFNJIisyKiJYQ1giKzIpICAvLyB1cCBsZWZ0LCBkb3duIHJpZ2h0DQorICAgICAgICBNRVJHRTRQSVhhdmdIKCJYREkiKzIsICJYREkiKyJYQ1giKzIsICJYU0kiKyJYQ1giLTIsICJYU0kiKzIqIlhDWCItMikgICAvLyB1cCByaWdodCwgZG93biBsZWZ0DQorICAgICAgICBNRVJHRTRQSVhhdmdIKCJYREkiKzIqIlhDWCItMiwgIlhESSIrIlhDWCItMiwgIlhTSSIrIlhDWCIrMiwgIlhTSSIrMikgICAvLyBkb3duIGxlZnQsIHVwIHJpZ2h0DQorICAgICAgICBNRVJHRTRQSVhhdmdIKCJYREkiKzIqIlhDWCIrMiwgIlhESSIrIlhDWCIrMiwgIlhTSSIrIlhDWCItMiwgIlhTSSItMikgICAvLyBkb3duIHJpZ2h0LCB1cCBsZWZ0ICAgDQorCQl9DQpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBSDIuaW5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBSDIuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkN2Q4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEFIMi5pbmMKQEAgLTAsMCArMSw1IEBACisvLyBTZWFyY2hlcyAxIHBpeGVsIHRvIHRoZSBsZWZ0IGFuZCByaWdodCwgaW4gYm90aCB0aGUgb2xkCisvLyAgYW5kIG5ldyBmaWVsZHMsIGJ1dCB0YWtlcyB2ZXJ0aWNhbCBhdmVyYWdlcy4gVGhlc2UgYXJlIG9kZAorLy8gcGl4ZWwgYWRkcmVzc2VzLiBBbnkgY2hyb21hIG1hdGNoIHdpbGwgbm90IGJlIHVzZWQuIChZVVkyKQorICAgICBNRVJHRTRQSVhhdmdIKCItMiglJSJYREkiLCAlJSJYQ1giKSIsICIoJSUiWERJIiwgJSUiWENYIikiLCAiKCUlIlhTSSIsICUlIlhDWCIpIiwgIjIoJSUiWFNJIiwgJSUiWENYIikiKSAvLyBsZWZ0LCByaWdodAorICAgICBNRVJHRTRQSVhhdmdIKCIyKCUlIlhESSIsICUlIlhDWCIpIiwgIiglJSJYREkiLCAlJSJYQ1giKSIsICIoJSUiWFNJIiwgJSUiWENYIikiLCAiLTIoJSUiWFNJIiwgJSUiWENYIikiKSAvLyByaWdodCwgbGVmdApkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BUb3AuaW5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BUb3AuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NWM3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFRvcC5pbmMKQEAgLTAsMCArMSwyNTQgQEAKKy8vIC0qLSBjKysgLSotCisKK3Vuc2lnbmVkIGNoYXIqIHBEZXN0OworY29uc3QgdW5zaWduZWQgY2hhciogcFNyY1A7Citjb25zdCB1bnNpZ25lZCBjaGFyKiBwU3JjOworY29uc3QgdW5zaWduZWQgY2hhciogcEJvYjsKK2NvbnN0IHVuc2lnbmVkIGNoYXIqIHBCb2JQOworCisvLyBsb25nIGlzIGludDMyIG9uIEFSQ0hfMzY4LCBpbnQ2NCBvbiBBUkNIX0FNRDY0LiBEZWNsYXJpbmcgaXQgdGhpcyB3YXkKKy8vIHNhdmVzIGEgbG90IG9mIHhvcidzIHRvIGRlbGV0ZSA2NGJpdCBnYXJiYWdlLgorCisjaWYgZGVmaW5lZChEQkxfUkVTSVpFKSB8fCBkZWZpbmVkKFVTRV9GT1JfRFNDQUxFUikKK2xvbmcJICAgIHNyY19waXRjaDIgPSBzcmNfcGl0Y2g7CQkJLy8gZXZlbiAmIG9kZCBsaW5lcyBhcmUgbm90IGludGVybGVhdmVkIGluIERTY2FsZXIKKyNlbHNlCitsb25nCSAgICBzcmNfcGl0Y2gyID0gMiAqIHNyY19waXRjaDsJCS8vIGV2ZW4gJiBvZGQgbGluZXMgYXJlIGludGVybGVhdmVkIGluIEF2aXN5bnRoCisjZW5kaWYKKworCitsb25nCSAgICBkc3RfcGl0Y2gyID0gMiAqIGRzdF9waXRjaDsKK2xvbmcgICAgICAgIHk7CisKK2xvbmcgICAgIExhc3Q4OworCisJcFNyYyAgPSBwV2VhdmVTcmM7CQkJLy8gcG9pbnRzIDEgd2VhdmUgbGluZSBhYm92ZQorCXBTcmNQID0gcFdlYXZlU3JjUDsJCQkvLyAiIAorCisjaWZkZWYgREJMX1JFU0laRQorCSAgICAgICAgCisjaWZkZWYgVVNFX1ZFUlRJQ0FMX0ZJTFRFUgorCXBEZXN0ID0gcFdlYXZlRGVzdCArIGRzdF9waXRjaDI7CisjZWxzZQorCXBEZXN0ID0gcFdlYXZlRGVzdCArIDMqZHN0X3BpdGNoOworI2VuZGlmCisKKyNlbHNlCisKKyNpZmRlZiBVU0VfVkVSVElDQUxfRklMVEVSCisJcERlc3QgPSBwV2VhdmVEZXN0ICsgZHN0X3BpdGNoOworI2Vsc2UKKwlwRGVzdCA9IHBXZWF2ZURlc3QgKyBkc3RfcGl0Y2gyOworI2VuZGlmCisKKyNlbmRpZgorCisJaWYgKFRvcEZpcnN0KQorCXsKKwkJcEJvYiA9IHBDb3B5U3JjICsgc3JjX3BpdGNoMjsgICAgICAvLyByZW1lbWJlciBvbmUgd2VhdmUgbGluZSBqdXN0IGNvcGllZCBwcmV2aW91c2x5CisJCXBCb2JQID0gcENvcHlTcmNQICsgc3JjX3BpdGNoMjsKKwl9CisJZWxzZQorCXsKKwkJcEJvYiA9ICBwQ29weVNyYzsKKwkJcEJvYlAgPSAgcENvcHlTcmNQOworCX0KKworI2lmbmRlZiBJU19DCisKKyNpZm5kZWYgX3BCb2IKKyNkZWZpbmUgX3BCb2IgICAgICAgIiUwIgorI2RlZmluZSBfc3JjX3BpdGNoMiAiJTEiCisjZGVmaW5lIF9TaGlmdE1hc2sgICIlMiIKKyNkZWZpbmUgX3BEZXN0ICAgICAgIiUzIgorI2RlZmluZSBfZHN0X3BpdGNodyAiJTQiCisjZGVmaW5lIF9MYXN0OCAgICAgICIlNSIKKyNkZWZpbmUgX3BTcmMgICAgICAgIiU2IgorI2RlZmluZSBfcFNyY1AgICAgICAiJTciCisjZGVmaW5lIF9wQm9iUCAgICAgICIlOCIKKyNkZWZpbmUgX0RpZmZUaHJlcyAgIiU5IgorI2RlZmluZSBfTWluX1ZhbHMgICAiJTEwIgorI2RlZmluZSBfTWF4X1ZhbHMgICAiJTExIgorI2RlZmluZSBfRk9VUlMgICAgICAiJTEyIgorI2RlZmluZSBfVEVOUyAgICAgICAiJTEzIgorI2RlZmluZSBfT05FUyAgICAgICAiJTE0IgorI2RlZmluZSBfVVZNYXNrICAgICAiJTE1IgorI2RlZmluZSBfTWF4X01vdiAgICAiJTE2IgorI2RlZmluZSBfWU1hc2sgICAgICAiJTE3IgorI2RlZmluZSBfb2xkYnggICAgICAiJTE4IgorI2VuZGlmCisgICAgICAgIExhc3Q4ID0gKHJvd3NpemUtOCk7CisKKwlmb3IgKHk9MTsgeSA8IEZsZEhlaWdodC0xOyB5KyspCQorCXsJCisgICAgICAgICAgbG9uZwlkc3RfcGl0Y2h3ID0gZHN0X3BpdGNoOyAvLyBsb2NhbCBzdG9yIHNvIGFzbSBjYW4gcmVmCisgICAgICAgICAgaW50NjRfdCBNYXhfTW92ICAgPSAweDA0MDQwNDA0MDQwNDA0MDR1bGw7IAorICAgICAgICAgIGludDY0X3QgRGlmZlRocmVzID0gMHgwZjBmMGYwZjBmMGYwZjBmdWxsOyAKKyAgICAgICAgICBpbnQ2NF90IFlNYXNrICAgICA9IDB4MDBmZjAwZmYwMGZmMDBmZnVsbDsgLy8ga2VlcHMgb25seSBsdW1hCisgICAgICAgICAgaW50NjRfdCBVVk1hc2sgICAgPSAweGZmMDBmZjAwZmYwMGZmMDB1bGw7IC8vIGtlZXBzIG9ubHkgY2hyb21hCisgICAgICAgICAgaW50NjRfdCBURU5TICAgICAgPSAweDBhMGEwYTBhMGEwYTBhMGF1bGw7IAorICAgICAgICAgIGludDY0X3QgRk9VUlMgICAgID0gMHgwNDA0MDQwNDA0MDQwNDA0dWxsOyAKKyAgICAgICAgICBpbnQ2NF90IE9ORVMgICAgICA9IDB4MDEwMTAxMDEwMTAxMDEwMXVsbDsgCisgICAgICAgICAgaW50NjRfdCBNaW5fVmFscyAgPSAweDAwMDAwMDAwMDAwMDAwMDB1bGw7CisgICAgICAgICAgaW50NjRfdCBNYXhfVmFscyAgPSAweDAwMDAwMDAwMDAwMDAwMDB1bGw7CisgICAgICAgICAgaW50NjRfdCBTaGlmdE1hc2sgPSAweGZlZmZmZWZmZmVmZmZlZmZ1bGw7CisKKyAgICAgICAgICBsb25nIG9sZGJ4ID0gMDsKKworCQkvLyBwcmV0ZW5kIGl0J3MgaW5kZW50ZWQgLS0+PgorICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICAgICAgICAgKAorICAgICAgICAgICAgIC8vIExvb3AgZ2VuZXJhbCByZWcgdXNhZ2UKKyAgICAgICAgICAgICAvLworICAgICAgICAgICAgIC8vIFhBWCAtIHBCb2JQLCB0aGVuIHBEZXN0IAorICAgICAgICAgICAgIC8vIFhCWCAtIHBCb2IKKyAgICAgICAgICAgICAvLyBYQ1ggLSBzcmNfcGl0Y2gyCisgICAgICAgICAgICAgLy8gWERYIC0gY3VycmVudCBvZmZzZXQKKyAgICAgICAgICAgICAvLyBYREkgLSBwcmV2IHdlYXZlIHBpeGVscywgMSBsaW5lIHVwCisgICAgICAgICAgICAgLy8gWFNJIC0gbmV4dCB3ZWF2ZSBwaXhlbHMsIDEgbGluZSB1cAorCisgICAgICAgICAgICAgLy8gU2F2ZSAiWEJYIiAoLWZQSUMpCisJICAgICBNT1ZYIiAlJSJYQlgiLCAiX29sZGJ4IlxuXHQiCisgICAgICAgICAgICAgCisgICAgICAgICAgICAgLy8gc2ltcGxlIGJvYiBmaXJzdCA4IGJ5dGVzCisgICAgICAgICAgICAgTU9WWCIJIl9wQm9iIiwgICAgICAgICUlIlhCWCJcblx0IgorICAgICAgICAgICAgIE1PVlgiCSJfc3JjX3BpdGNoMiIsICAlJSJYQ1giXG5cdCIKKworI2lmZGVmIFVTRV9WRVJUSUNBTF9GSUxURVIKKyAgICAgICAgICAgICAibW92cQkgICAgKCUlIlhCWCIpLCAgICAgICAgJSVtbTBcblx0IgorICAgICAgICAgICAgICJtb3ZxCSAgICAoJSUiWEJYIiwgJSUiWENYIiksICUlbW0xXG5cdCIgLy8sIHF3b3JkIHB0clsiWEJYIisiWENYIl0KKyAgICAgICAgICAgICAibW92cQkgICAgJSVtbTAsICAgICAgICAgICUlbW0yXG5cdCIKKyAgICAgICAgICAgICBWX1BBVkdCICgiJSVtbTIiLCAiJSVtbTEiLCAiJSVtbTMiLCBfU2hpZnRNYXNrKQkJLy8gaGFsZndheSBiZXR3ZWVuCisgICAgICAgICAgICAgVl9QQVZHQiAoIiUlbW0wIiwgIiUlbW0yIiwgIiUlbW0zIiwgX1NoaWZ0TWFzaykJCS8vIDEvNCB3YXkKKyAgICAgICAgICAgICBWX1BBVkdCICgiJSVtbTEiLCAiJSVtbTIiLCAiJSVtbTMiLCBfU2hpZnRNYXNrKQkJLy8gMy80IHdheQorICAgICAgICAgICAgIE1PVlgiCQkiX3BEZXN0IiwgICAgICAgJSUiWERJIlxuXHQiCisgICAgICAgICAgICAgTU9WWCIJCSJfZHN0X3BpdGNodyIsICAlJSJYQVgiXG5cdCIKKyAgICAgICAgICAgICBWX01PVk5UUQkoIiglJSJYREkiKSIsICIlJW1tMCIpCisgICAgICAgICAgICAgVl9NT1ZOVFEJKCIoJSUiWERJIiwgJSUiWEFYIikiLCAiJSVtbTEiKSAvLyBxd29yZCBwdHJbIlhESSIrIlhBWCJdLCBtbTEKKworICAgICAgICAgICAgIC8vIHNpbXBsZSBib2IgbGFzdCA4IGJ5dGVzCisgICAgICAgICAgICAgTU9WWCIJCSJfTGFzdDgiLCAlJSJYRFgiXG5cdCIKKyAgICAgICAgICAgICBMRUFYIgkJKCUlIlhCWCIsICUlIlhEWCIpLCAlJSJYU0kiXG5cdCIgIC8vIFsiWEJYIisiWERYIl0KKyAgICAgICAgICAgICAibW92cQkgICAgKCUlIlhTSSIpLCAlJW1tMFxuXHQiCisgICAgICAgICAgICAgIm1vdnEJICAgICglJSJYU0kiLCAlJSJYQ1giKSwgJSVtbTFcblx0IiAgICAvLyBxd29yZCBwdHJbIlhTSSIrIlhDWCJdCisgICAgICAgICAgICAgIm1vdnEJICAgICUlbW0wLCAlJW1tMlxuXHQiCisgICAgICAgICAgICAgVl9QQVZHQiAoIiUlbW0yIiwgIiUlbW0xIiwgIiUlbW0zIiwgX1NoaWZ0TWFzaykJCS8vIGhhbGZ3YXkgYmV0d2VlbgorICAgICAgICAgICAgIFZfUEFWR0IgKCIlJW1tMCIsICIlJW1tMiIsICIlJW1tMyIsIF9TaGlmdE1hc2spCQkvLyAxLzQgd2F5CisgICAgICAgICAgICAgVl9QQVZHQiAoIiUlbW0xIiwgIiUlbW0yIiwgIiUlbW0zIiwgX1NoaWZ0TWFzaykJCS8vIDMvNCB3YXkKKyAgICAgICAgICAgICBBRERYIgkJJSUiWERYIiwgJSUiWERJIlxuXHQiCQkJCQkJLy8gbGFzdCA4IGJ5dGVzIG9mIGRlc3QKKyAgICAgICAgICAgICBWX01PVk5UUQkoIiUlIlhESSIiLCAiJSVtbTAiKQorICAgICAgICAgICAgIFZfTU9WTlRRCSgiKCUlIlhESSIsICUlIlhBWCIpIiwgIiUlbW0xIikgLy8gcXdvcmQgcHRyWyJYREkiKyJYQVgiXSwgbW0xKQorCisjZWxzZQorICAgICAgICAgICAgICJtb3ZxCSglJSJYQlgiKSwgJSVtbTBcblx0IgorICAgICAgICAgICAgIC8vCQlwYXZnYgltbTAsIHF3b3JkIHB0clsiWEJYIisiWENYIl0KKyAgICAgICAgICAgICBWX1BBVkdCICgiJSVtbTAiLCAiKCUlIlhCWCIsICUlIlhDWCIpIiwgIiUlbW0yIiwgX1NoaWZ0TWFzaykgLy8gcXdvcmQgcHRyWyJYQlgiKyJYQ1giXSwgbW0yLCBTaGlmdE1hc2spCisgICAgICAgICAgICAgTU9WWCIJCSJfcERlc3QiLCAlJSJYREkiXG5cdCIKKyAgICAgICAgICAgICBWX01PVk5UUQkoIiglJSJYREkiKSIsICIlJW1tMCIpCisKKyAgICAgICAgICAgICAvLyBzaW1wbGUgYm9iIGxhc3QgOCBieXRlcworICAgICAgICAgICAgIE1PVlgiCQkiX0xhc3Q4IiwgJSUiWERYIlxuXHQiCisgICAgICAgICAgICAgTEVBWCIJCSglJSJYQlgiLCAlJSJYRFgiKSwgJSUiWFNJIlxuXHQiIC8vIlhTSSIsIFsiWEJYIisiWERYIl0KKyAgICAgICAgICAgICAibW92cQkgICAgKCUlIlhTSSIpLCAlJW1tMFxuXHQiCisgICAgICAgICAgICAgLy8JCXBhdmdiCW1tMCwgcXdvcmQgcHRyWyJYU0kiKyJYQ1giXQorICAgICAgICAgICAgIFZfUEFWR0IJKCIlJW1tMCIsICIoJSUiWFNJIiwgJSUiWENYIikiLCAiJSVtbTIiLCBfU2hpZnRNYXNrKSAvLyBxd29yZCBwdHJbIlhTSSIrIlhDWCJdLCBtbTIsIFNoaWZ0TWFzaykKKyAgICAgICAgICAgICBWX01PVk5UUQkoIiglJSJYREkiLCAlJSJYRFgiKSIsICIlJW1tMCIpIC8vIHF3b3JkIHB0clsiWERJIisiWERYIl0sIG1tMCkKKyNlbmRpZgorICAgICAgICAgICAgIC8vIG5vdyBsb29wIGFuZCBnZXQgdGhlIG1pZGRsZSBxd29yZHMKKyAgICAgICAgICAgICBNT1ZYIgkJIl9wU3JjIiwgJSUiWFNJIlxuXHQiCisgICAgICAgICAgICAgTU9WWCIJCSJfcFNyY1AiLCAlJSJYREkiXG5cdCIKKyAgICAgICAgICAgICBNT1ZYIgkJJDgsICUlIlhEWCJcblx0IgkJCQkvLyBjdXJyIG9mZnNldCBsb25nbyBhbGwgbGluZXMKKworICAgICAgICAgICAgICIxOlxuXHQiCQorICAgICAgICAgICAgIE1PVlgiCQkiX3BCb2JQIiwgJSUiWEFYIlxuXHQiCisgICAgICAgICAgICAgQUREWCIJCSQ4LCAlJSJYREkiXG5cdCIKKyAgICAgICAgICAgICBBRERYIgkJJDgsICUlIlhTSSJcblx0IgorICAgICAgICAgICAgIEFERFgiCQkkOCwgJSUiWEJYIlxuXHQiCisgICAgICAgICAgICAgQUREWCIJCSUlIlhEWCIsICUlIlhBWCJcblx0IgorCisjaWZkZWYgVVNFX1NUUkFOR0VfQk9CCisjaW5jbHVkZSAiU3RyYW5nZUJvYi5pbmMiCisjZWxzZQorI2luY2x1ZGUgIldpZXJkQm9iLmluYyIKKyNlbmRpZgorCisgICAgICAgICAgICAgLy8gRm9yIG5vbi1TU0UyOgorICAgICAgICAgICAgIC8vIHRocm91Z2ggb3V0IG1vc3Qgb2YgdGhlIHJlc3Qgb2YgdGhpcyBsb29wIHdlIHdpbGwgbWFpbnRhaW4KKyAgICAgICAgICAgICAvLwltbTQJCW91ciBtaW4gYm9iIHZhbHVlCisgICAgICAgICAgICAgLy8JbW01CQliZXN0IHdlYXZlIHBpeGVscyBzbyBmYXIKKyAgICAgICAgICAgICAvLyBtbTYJCW91ciBtYXggQm9iIHZhbHVlIAorICAgICAgICAgICAgIC8vCW1tNwkJYmVzdCB3ZWlnaHRlZCBwaXhlbCByYXRpbmdzIHNvIGZhcgorICAgICAgICAgICAgIAorICAgICAgICAgICAgIC8vIFdlIHdpbGwga2VlcCBhIHNsaWdodCBiaWFzIHRvIHVzaW5nIHRoZSB3ZWF2ZSBwaXhlbHMKKyAgICAgICAgICAgICAvLyBmcm9tIHRoZSBjdXJyZW50IGxvY2F0aW9uLCBieSByYXRpbmcgdGhlbSBieSB0aGUgbWluIGRpc3RhbmNlCisgICAgICAgICAgICAgLy8gZnJvbSB0aGUgQm9iIHZhbHVlIGluc3RlYWQgb2YgdGhlIGF2ZyBkaXN0YW5jZSBmcm9tIHRoYXQgdmFsdWUuCisgICAgICAgICAgICAgLy8gb3VyIGJlc3QgYW5kIG9ubHkgcmF0aW5nIHNvIGZhcgorICAgICAgICAgICAgICJwY21wZXFiCSUlbW03LCAlJW1tN1xuXHQiCQkJLy8gZmZmZiwgc2F5IHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nIGdvb2QgeWV0CisKKyNlbHNlCisgICAgICAgIExhc3Q4ID0gKHJvd3NpemUgLSA0KTsKKworCWZvciAoeT0xOyB5IDwgRmxkSGVpZ2h0LTE7IHkrKykKKwl7CisJICAjaWZkZWYgVVNFX1NUUkFOR0VfQk9CCisJICBsb25nIERpZmZUaHJlcyA9IDB4MGY7CisJICAjZW5kaWYKKworCSAgI2lmbmRlZiBTS0lQX1NFQVJDSAorCSAgbG9uZyB3ZWF2ZVsyXSwgTWF4VmFsc1syXSwgTWluVmFsc1syXTsKKwkgICNlbmRpZgorCisJICBsb25nIGRpZmZbMl0sIGJlc3RbMl0sIGF2Z1syXSwgZGlmZjJbMl0sIG91dFsyXSwgeDsKKworI2lmZGVmIFVTRV9WRVJUSUNBTF9GSUxURVIKKyAgICAgICAgICAgICBwRGVzdFswXSA9ICgzICogcEJvYlswXSArIHBCb2Jbc3JjX3BpdGNoMl0pIC8gNDsKKyAgICAgICAgICAgICBwRGVzdFsxXSA9ICgzICogcEJvYlsxXSArIHBCb2Jbc3JjX3BpdGNoMiArIDFdKSAvIDQ7CisgICAgICAgICAgICAgcERlc3RbMl0gPSAoMyAqIHBCb2JbMl0gKyBwQm9iW3NyY19waXRjaDIgKyAyXSkgLyA0OworICAgICAgICAgICAgIHBEZXN0WzNdID0gKDMgKiBwQm9iWzNdICsgcEJvYltzcmNfcGl0Y2gyICsgM10pIC8gNDsKKwkgICAgIHBEZXN0W2RzdF9waXRjaHddID0gKHBCb2JbMF0gKyAzICogcEJvYltzcmNfcGl0Y2gyXSkgLyA0OworCSAgICAgcERlc3RbZHN0X3BpdGNodyArIDFdID0gKHBCb2JbMV0gKyAzICogcEJvYltzcmNfcGl0Y2gyICsgMV0pIC8gNDsKKwkgICAgIHBEZXN0W2RzdF9waXRjaHcgKyAyXSA9IChwQm9iWzJdICsgMyAqIHBCb2Jbc3JjX3BpdGNoMiArIDJdKSAvIDQ7CisJICAgICBwRGVzdFtkc3RfcGl0Y2h3ICsgM10gPSAocEJvYlszXSArIDMgKiBwQm9iW3NyY19waXRjaDIgKyAzXSkgLyA0OworCisgICAgICAgICAgICAgLy8gc2ltcGxlIGJvYiBsYXN0IGJ5dGUKKwkgICAgIHBEZXN0W0xhc3Q4XSA9ICgzICogcEJvYltMYXN0OF0gKyBwQm9iW0xhc3Q4ICsgc3JjX3BpdGNoMl0pIC8gNDsKKwkgICAgIHBEZXN0W0xhc3Q4ICsgMV0gPSAoMyAqIHBCb2JbTGFzdDggKyAxXSArIHBCb2JbTGFzdDggKyBzcmNfcGl0Y2gyICsgMV0pIC8gNDsKKwkgICAgIHBEZXN0W0xhc3Q4ICsgMl0gPSAoMyAqIHBCb2JbTGFzdDggKyAyXSArIHBCb2JbTGFzdDggKyBzcmNfcGl0Y2gyICsgMl0pIC8gNDsKKwkgICAgIHBEZXN0W0xhc3Q4ICsgM10gPSAoMyAqIHBCb2JbTGFzdDggKyAzXSArIHBCb2JbTGFzdDggKyBzcmNfcGl0Y2gyICsgM10pIC8gNDsKKwkgICAgIHBEZXN0W0xhc3Q4ICsgc3JjX3BpdGNoMl0gPSAocEJvYltMYXN0OF0gKyAzICogcEJvYltMYXN0OCArIHNyY19waXRjaDJdKSAvIDQ7CisJICAgICBwRGVzdFtMYXN0OCArIHNyY19waXRjaDIgKyAxXSA9IChwQm9iW0xhc3Q4ICsgMV0gKyAzICogcEJvYltMYXN0OCArIHNyY19waXRjaDIgKyAxXSkgLyA0OworCSAgICAgcERlc3RbTGFzdDggKyBzcmNfcGl0Y2gyICsgMl0gPSAocEJvYltMYXN0OCArIDJdICsgMyAqIHBCb2JbTGFzdDggKyBzcmNfcGl0Y2gyICsgMl0pIC8gNDsKKwkgICAgIHBEZXN0W0xhc3Q4ICsgc3JjX3BpdGNoMiArIDNdID0gKHBCb2JbTGFzdDggKyAzXSArIDMgKiBwQm9iW0xhc3Q4ICsgc3JjX3BpdGNoMiArIDNdKSAvIDQ7CisjZWxzZQorICAgICAgICAgICAgIHBEZXN0WzBdID0gKHBCb2JbMF0gKyBwQm9iW3NyY19waXRjaDIgKyAxXSkgLyAyOworICAgICAgICAgICAgIHBEZXN0WzFdID0gKHBCb2JbMV0gKyBwQm9iW3NyY19waXRjaDIgKyAxXSkgLyAyOworICAgICAgICAgICAgIHBEZXN0WzJdID0gKHBCb2JbMl0gKyBwQm9iW3NyY19waXRjaDIgKyAyXSkgLyAyOworICAgICAgICAgICAgIHBEZXN0WzNdID0gKHBCb2JbM10gKyBwQm9iW3NyY19waXRjaDIgKyAzXSkgLyAyOworCisgICAgICAgICAgICAgLy8gc2ltcGxlIGJvYiBsYXN0IGJ5dGUKKwkgICAgIHBEZXN0W0xhc3Q4XSA9IChwQm9iW0xhc3Q4XSArIHBCb2JbTGFzdDggKyBzcmNfcGl0Y2gyXSkgLyAyOworCSAgICAgcERlc3RbTGFzdDggKyAxXSA9IChwQm9iW0xhc3Q4ICsgMV0gKyBwQm9iW0xhc3Q4ICsgc3JjX3BpdGNoMiArIDFdKSAvIDI7CisJICAgICBwRGVzdFtMYXN0OCArIDJdID0gKHBCb2JbTGFzdDggKyAyXSArIHBCb2JbTGFzdDggKyBzcmNfcGl0Y2gyICsgMl0pIC8gMjsKKwkgICAgIHBEZXN0W0xhc3Q4ICsgM10gPSAocEJvYltMYXN0OCArIDNdICsgcEJvYltMYXN0OCArIHNyY19waXRjaDIgKyAzXSkgLyAyOworI2VuZGlmCisKKyAgICAgICAgICAgICBwQm9iICs9IDQ7CisJICAgICBwQm9iUCArPSA0OworCSAgICAgcFNyYyArPSA0OworCSAgICAgcFNyY1AgKz0gNDsKKworICAgICAgICAgICAgIGZvciAoeD00OyB4IDwgTGFzdDg7IHggKz0gMikgeworCisjaWZkZWYgVVNFX1NUUkFOR0VfQk9CCisjaW5jbHVkZSAiU3RyYW5nZUJvYi5pbmMiCisjZWxzZQorI2luY2x1ZGUgIldpZXJkQm9iLmluYyIKKyNlbmRpZgorCisgICAgICAgICAgICAgLy8gV2Ugd2lsbCBrZWVwIGEgc2xpZ2h0IGJpYXMgdG8gdXNpbmcgdGhlIHdlYXZlIHBpeGVscworICAgICAgICAgICAgIC8vIGZyb20gdGhlIGN1cnJlbnQgbG9jYXRpb24sIGJ5IHJhdGluZyB0aGVtIGJ5IHRoZSBtaW4gZGlzdGFuY2UKKyAgICAgICAgICAgICAvLyBmcm9tIHRoZSBCb2IgdmFsdWUgaW5zdGVhZCBvZiB0aGUgYXZnIGRpc3RhbmNlIGZyb20gdGhhdCB2YWx1ZS4KKyAgICAgICAgICAgICAvLyBvdXIgYmVzdCBhbmQgb25seSByYXRpbmcgc28gZmFyCisgICAgICAgICAgICAgZGlmZlswXSA9IGRpZmZbMV0gPSAyNTU7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFZBLmluYyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wVkEuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlM2QxOWIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFZBLmluYwpAQCAtMCwwICsxLDYgQEAKKy8vIC0qLSBjKysgLSotCisKKy8vIFNlYXJjaGVzIHRoZSBjZW50ZXIgdmVydGljYWwgbGluZSBhYm92ZSBjZW50ZXIgYW5kIGJlbG93LCBpbiBib3RoIHRoZSBvbGQgCisvLyBhbmQgbmV3IGZpZWxkcywgYnV0IHRha2VzIGF2ZXJhZ2VzLiAgVGhlc2UgYXJlIGV2ZW4gcGl4ZWwgYWRkcmVzc2VzLgorICAgICAgICBNRVJHRTRQSVhhdmcoIiglJSJYREkiLCAlJSJYQ1giLCAyKSIsICIoJSUiWFNJIikiKQkvLyBkb3duLCB1cAorICAgICAgICBNRVJHRTRQSVhhdmcoIiglJSJYREkiKSIsICIoJSUiWFNJIiwgJSUiWENYIiwgMikiKQkvLyB1cCwgZG93bgpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BWQUguaW5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BWQUguaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMTU1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFZBSC5pbmMKQEAgLTAsMCArMSw2IEBACisvLyAtKi0gYysrIC0qLQorCisvLyBTZWFyY2hlcyB0aGUgY2VudGVyIHZlcnRpY2FsIGxpbmUgYWJvdmUgY2VudGVyIGFuZCBiZWxvdywgaW4gYm90aCB0aGUgb2xkIAorLy8gYW5kIG5ldyBmaWVsZHMsIGJ1dCB0YWtlcyBhdmVyYWdlcy4gIFRoZXNlIGFyZSBldmVuIHBpeGVsIGFkZHJlc3Nlcy4KKyAgICAgICAgTUVSR0U0UElYYXZnSCgiKCUlIlhESSIsICUlIlhDWCIsIDIpIiwgIiglJSJYREkiLCAlJSJYQ1giKSIsICIoJSUiWFNJIiwgJSUiWENYIikiLCAiKCUlIlhTSSIpIikJLy8gZG93biwgdXAKKyAgICAgICAgTUVSR0U0UElYYXZnSCgiKCUlIlhESSIpIiwgIiglJSJYREkiLCAlJSJYQ1giKSIsICIoJSUiWFNJIiwgJSUiWENYIikiLCAiKCUlIlhTSSIsICUlIlhDWCIsIDIpIikJLy8gdXAsIGRvd24KZGlmZiAtLWdpdCBhL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TdHJhbmdlQm9iLmluYyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TdHJhbmdlQm9iLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWI0Yzg2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1N0cmFuZ2VCb2IuaW5jCkBAIC0wLDAgKzEsNDM1IEBACisvLyAtKi0gYysrIC0qLQorCQkKKwkJLy8gRmlyc3QsIGdldCBhbmQgc2F2ZSBvdXIgcG9zc2libGUgQm9iIHZhbHVlcworCQkvLyBBc3N1bWUgb3VyIHBpeGVscyBhcmUgbGF5ZWQgb3V0IGFzIGZvbGxvd3Mgd2l0aCB4IHRoZSBjYWxjJ2QgYm9iIHZhbHVlCisJCS8vIGFuZCB0aGUgb3RoZXIgcGl4ZWxzIGFyZSBmcm9tIHRoZSBjdXJyZW50IGZpZWxkCisJCS8vICAKKwkJLy8JICBqIGEgYiBjIGsJCWN1cnJlbnQgZmllbGQKKwkJLy8gICAgICAgICAgICB4CQkJY2FsY3VsYXRlZCBsaW5lCisJCS8vICAgICAgICBtIGQgZSBmIG4JCWN1cnJlbnQgZmllbGQKKwkJLy8KKwkJLy8gd2UgY2FsYyB0aGUgYm9iIHZhbHVlIGx1bWEgdmFsdWUgYXM6CisgICAgICAgIC8vIGlmIHxqIC0gbnwgPCBUaHJlcyAmJiB8YSAtIG18ID4gVGhyZXMgCisgICAgICAgIC8vICBhdmcoaixuKQorICAgICAgICAvLyBlbmQgaWYKKyAgICAgICAgLy8gaWYgfGsgLSBtfCA8IFRocmVzICYmIHxjIC0gbnwgPiBUaHJlcyAKKyAgICAgICAgLy8gIGF2ZyhrLG0pCisgICAgICAgIC8vIGVuZCBpZgorICAgICAgICAvLyBpZiB8YyAtIGR8IDwgVGhyZXMgJiYgfGIgLSBmfCA+IFRocmVzIAorICAgICAgICAvLyAgYXZnKGMsZCkKKyAgICAgICAgLy8gZW5kIGlmCisgICAgICAgIC8vIGlmIHxhIC0gZnwgPCBUaHJlcyAmJiB8YiAtIGR8ID4gVGhyZXMgCisgICAgICAgIC8vICBhdmcoYSxmKQorICAgICAgICAvLyBlbmQgaWYKKyAgICAgICAgLy8gaWYgfGIgLSBlfCA8IFRocmVzCisgICAgICAgIC8vICBhdmcoYixlKQorICAgICAgICAvLyBlbmQgaWYKKyAgICAgICAgLy8gcGlja3VwIGFueSB0aGluZyBub3QgeWV0IHNldCB3aXRoIGF2ZyhiLGUpCisKKyNpZm5kZWYgSVNfQworCisJCS8vIGosIG4KKyAgICAgICAgInB4b3IgJSVtbTUsICUlbW01XG5cdCIKKyAgICAgICAgInB4b3IgJSVtbTYsICUlbW02XG5cdCIKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW03XG5cdCIKKworCQkibW92cSAgICAtMiglJSJYQlgiKSwgJSVtbTBcblx0IgkJLy8gdmFsdWUgYSBmcm9tIHRvcCBsZWZ0CQkKKwkJIm1vdnEgICAgLTQoJSUiWEJYIiwgJSUiWENYIiksICUlbW0xXG5cdCIJLy8gdmFsdWUgbSBmcm9tIGJvdHRvbSByaWdodAkJCQorICAgICAgICAKKwkJIm1vdnEJJSVtbTAsICUlbW0zXG5cdCIKKwkJInBzdWJ1c2IJJSVtbTEsICUlbW0zXG5cdCIKKwkJInBzdWJ1c2IgJSVtbTAsICUlbW0xXG5cdCIKKwkJInBvcgkJJSVtbTEsICUlbW0zXG5cdCIJCQkJCS8vIGFicyhhLG0pCisKKwkJInBzdWJ1c2IgIl9EaWZmVGhyZXMiLCAlJW1tM1xuXHQiCQkvLyBub256ZXJvIHdoZXJlIGFicyhhLG0pID4gVGhyZXMgZWxzZSAwCisJCSJweG9yCSUlbW00LCAlJW1tNFxuXHQiCisJCSJwY21wZXFiICUlbW00LCAlJW1tM1xuXHQiCQkJLy8gbm93IGZmIHdoZXJlIGFicyhhLG0pIDwgVGhyZXMsIGVsc2UgMDAJCisJCSJwY21wZXFiCSUlbW0zLCAlJW1tNFxuXHQiCQkJLy8gaGVyZSBmZiB3aGVyZSBhYnMoYSxtKSA+IFRocmVzLCBlbHNlIDAwCisKKworCQkibW92cSAgICAtNCglJSJYQlgiKSwgJSVtbTBcblx0IgkJLy8gdmFsdWUgagorCQkibW92cSAgICA0KCUlIlhCWCIsICUlIlhDWCIpLCAlJW1tMVxuXHQiCS8vIHZhbHVlIG4KKwkJIm1vdnEJJSVtbTAsICUlbW0yXG5cdCIJCQkJCQorCQlWX1BBVkdCICgiJSVtbTIiLCAiJSVtbTEiLCAiJSVtbTMiLCBfU2hpZnRNYXNrKQkvLyBhdmcoaixuKQorICAgICAgICAibW92cQklJW1tMCwgJSVtbTNcblx0IgorCQkicHN1YnVzYgklJW1tMSwgJSVtbTBcblx0IgorCQkicHN1YnVzYiAlJW1tMywgJSVtbTFcblx0IgorCQkicG9yCQklJW1tMSwgJSVtbTBcblx0IgkJCQkJLy8gYWJzKGosbikKKworICAgICAgICAibW92cSAgICAlJW1tMCwgJSVtbTFcblx0IgorCQkicHN1YnVzYiAiX0RpZmZUaHJlcyIsICUlbW0xXG5cdCIJCS8vIG5vbnplcm8gd2hlcmUgYWJzKGosbikgPiBUaHJlcyBlbHNlIDAKKwkJInB4b3IJJSVtbTMsICUlbW0zXG5cdCIKKwkJInBjbXBlcWIgJSVtbTMsICUlbW0xXG5cdCIJCQkvLyBub3cgZmYgd2hlcmUgYWJzKGosbikgPCBUaHJlcywgZWxzZSAwMAkKKworICAgICAgICAicGFuZCAgICAlJW1tNCwgJSVtbTFcblx0IgorICAgICAgICAicGFuZCAgICAlJW1tMSwgJSVtbTJcblx0IgorICAgICAgICAicGFuZCAgICAlJW1tMSwgJSVtbTBcblx0IgorCisgICAgICAgICJtb3ZxICAgICUlbW0xLCAlJW1tM1xuXHQiCisgICAgICAgICJweG9yICAgICUlbW01LCAlJW1tM1xuXHQiCisgICAgICAgICJwYW5kICAgICUlbW0zLCAlJW1tNlxuXHQiCisgICAgICAgICJwYW5kICAgICUlbW0zLCAlJW1tN1xuXHQiCisgICAgICAgICJwYW5kICAgICUlbW0zLCAlJW1tNVxuXHQiCisKKyAgICAgICAgInBvciAgICAgJSVtbTEsICUlbW01XG5cdCIKKyAgICAgICAgInBvciAgICAgJSVtbTIsICUlbW02XG5cdCIKKyAgICAgICAgInBvciAgICAgJSVtbTAsICUlbW03XG5cdCIKKyAgICAgICAgCisgICAgICAgIC8vIGsgJiBtCisJCSJtb3ZxICAgIDIoJSUiWEJYIiksICUlbW0wXG5cdCIJCS8vIHZhbHVlIGMgZnJvbSB0b3AgbGVmdAkJCisJCSJtb3ZxICAgIDQoJSUiWEJYIiwgJSUiWENYIiksICUlbW0xXG5cdCIJLy8gdmFsdWUgbiBmcm9tIGJvdHRvbSByaWdodAkJCQorCisJCSJtb3ZxCSUlbW0wLCAlJW1tM1xuXHQiCisJCSJwc3VidXNiCSUlbW0xLCAlJW1tM1xuXHQiCisJCSJwc3VidXNiICUlbW0wLCAlJW1tMVxuXHQiCisJCSJwb3IJCSUlbW0xLCAlJW1tM1xuXHQiCQkJCQkvLyBhYnMoYyxuKQorCisJCSJwc3VidXNiICJfRGlmZlRocmVzIiwgJSVtbTNcblx0IgkJLy8gbm9uemVybyB3aGVyZSBhYnMoYyxuKSA+IFRocmVzIGVsc2UgMAorCQkicHhvcgklJW1tNCwgJSVtbTRcblx0IgorCQkicGNtcGVxYiAlJW1tNCwgJSVtbTNcblx0IgkJCS8vIG5vdyBmZiB3aGVyZSBhYnMoYyxuKSA8IFRocmVzLCBlbHNlIDAwCQorCQkicGNtcGVxYgklJW1tMywgJSVtbTRcblx0IgkJCS8vIGhlcmUgZmYgd2hlcmUgYWJzKGMsbikgPiBUaHJlcywgZWxzZSAwMAorCisKKwkJIm1vdnEgICAgNCglJSJYQlgiKSwgJSVtbTBcblx0IgkJLy8gdmFsdWUgaworCQkibW92cSAgICAtNCglJSJYQlgiLCAlJSJYQ1giKSwgJSVtbTFcblx0IgkvLyB2YWx1ZSBtCisJCSJtb3ZxCSUlbW0wLCAlJW1tMlxuXHQiCQkJCQkKKwkJVl9QQVZHQiAoIiUlbW0yIiwgIiUlbW0xIiwgIiUlbW0zIiwgX1NoaWZ0TWFzaykJLy8gYXZnKGssbSkKKyAgICAgICAgIm1vdnEJJSVtbTAsICUlbW0zXG5cdCIKKwkJInBzdWJ1c2IJJSVtbTEsICUlbW0wXG5cdCIKKwkJInBzdWJ1c2IgJSVtbTMsICUlbW0xXG5cdCIKKwkJInBvcgkJJSVtbTEsICUlbW0wXG5cdCIJCQkJCS8vIGFicyhrLG0pCisKKyAgICAgICAgIm1vdnEgICAgJSVtbTAsICUlbW0xXG5cdCIKKwkJInBzdWJ1c2IgIl9EaWZmVGhyZXMiLCAlJW1tMVxuXHQiCQkvLyBub256ZXJvIHdoZXJlIGFicyhrLG0pID4gVGhyZXMgZWxzZSAwCisJCSJweG9yCSUlbW0zLCAlJW1tM1xuXHQiCisJCSJwY21wZXFiICUlbW0zLCAlJW1tMVxuXHQiCQkJLy8gbm93IGZmIHdoZXJlIGFicyhrLG0pIDwgVGhyZXMsIGVsc2UgMDAJCisKKyAgICAgICAgInBhbmQgICAgJSVtbTQsICUlbW0xXG5cdCIKKyAgICAgICAgCisgICAgICAgICJwYW5kICAgICUlbW0xLCAlJW1tMlxuXHQiCisgICAgICAgICJwYW5kICAgICUlbW0xLCAlJW1tMFxuXHQiCisKKyAgICAgICAgIm1vdnEgICAgJSVtbTEsICUlbW0zXG5cdCIKKyAgICAgICAgInB4b3IgICAgJSVtbTUsICUlbW0zXG5cdCIKKyAgICAgICAgInBhbmQgICAgJSVtbTMsICUlbW02XG5cdCIKKyAgICAgICAgInBhbmQgICAgJSVtbTMsICUlbW03XG5cdCIKKyAgICAgICAgInBhbmQgICAgJSVtbTMsICUlbW01XG5cdCIKKworICAgICAgICAicG9yICAgICAlJW1tMSwgJSVtbTVcblx0IgorICAgICAgICAicG9yICAgICAlJW1tMiwgJSVtbTZcblx0IgorICAgICAgICAicG9yICAgICAlJW1tMCwgJSVtbTdcblx0IgorCisKKyAgICAgICAgLy8gYyAmIGQKKwkJIm1vdnEgICAgKCUlIlhCWCIpLCAlJW1tMFxuXHQiCQkvLyB2YWx1ZSBiIGZyb20gdG9wIGxlZnQJCQorCQkibW92cSAgICAyKCUlIlhCWCIsICUlIlhDWCIpLCAlJW1tMVxuXHQiCS8vIHZhbHVlIGYgZnJvbSBib3R0b20gcmlnaHQJCQkKKworCQkibW92cQklJW1tMCwgJSVtbTNcblx0IgorCQkicHN1YnVzYgklJW1tMSwgJSVtbTNcblx0IgorCQkicHN1YnVzYiAlJW1tMCwgJSVtbTFcblx0IgorCQkicG9yCQklJW1tMSwgJSVtbTNcblx0IgkJCQkJLy8gYWJzKGIsZikKKworCQkicHN1YnVzYiAiX0RpZmZUaHJlcyIsICUlbW0zXG5cdCIJCS8vIG5vbnplcm8gd2hlcmUgYWJzKGIsZikgPiBUaHJlcyBlbHNlIDAKKwkJInB4b3IJJSVtbTQsICUlbW00XG5cdCIKKwkJInBjbXBlcWIgJSVtbTQsICUlbW0zXG5cdCIJCQkvLyBub3cgZmYgd2hlcmUgYWJzKGIsZikgPCBUaHJlcywgZWxzZSAwMAkKKwkJInBjbXBlcWIJJSVtbTMsICUlbW00XG5cdCIJCQkvLyBoZXJlIGZmIHdoZXJlIGFicyhiLGYpID4gVGhyZXMsIGVsc2UgMDAKKworCQkibW92cSAgICAyKCUlIlhCWCIpLCAlJW1tMFxuXHQiCQkvLyB2YWx1ZSBjCisJCSJtb3ZxICAgIC0yKCUlIlhCWCIsICUlIlhDWCIpLCAlJW1tMVxuXHQiCS8vIHZhbHVlIGQKKwkJIm1vdnEJJSVtbTAsICUlbW0yXG5cdCIJCQkJCQorCQlWX1BBVkdCICgiJSVtbTIiLCAiJSVtbTEiLCAiJSVtbTMiLCBfU2hpZnRNYXNrKQkvLyBhdmcoYyxkKQorICAgICAgICAibW92cQklJW1tMCwgJSVtbTNcblx0IgorCQkicHN1YnVzYgklJW1tMSwgJSVtbTBcblx0IgorCQkicHN1YnVzYiAlJW1tMywgJSVtbTFcblx0IgorCQkicG9yCQklJW1tMSwgJSVtbTBcblx0IgkJCQkJLy8gYWJzKGMsZCkKKworICAgICAgICAibW92cSAgICAlJW1tMCwgJSVtbTFcblx0IgorCQkicHN1YnVzYiAiX0RpZmZUaHJlcyIsICUlbW0xXG5cdCIJCS8vIG5vbnplcm8gd2hlcmUgYWJzKGMsZCkgPiBUaHJlcyBlbHNlIDAKKwkJInB4b3IJJSVtbTMsICUlbW0zXG5cdCIKKyAgICAgICAgInBjbXBlcWIgJSVtbTMsICUlbW0xXG5cdCIJCQkvLyBub3cgZmYgd2hlcmUgYWJzKGMsZCkgPCBUaHJlcywgZWxzZSAwMAkKKworICAgICAgICAicGFuZCAgICAlJW1tNCwgJSVtbTFcblx0IgorCisgICAgICAgICJwYW5kICAgICUlbW0xLCAlJW1tMlxuXHQiCisgICAgICAgICJwYW5kICAgICUlbW0xLCAlJW1tMFxuXHQiCisKKyAgICAgICAgIm1vdnEgICAgJSVtbTEsICUlbW0zXG5cdCIKKyAgICAgICAgInB4b3IgICAgJSVtbTUsICUlbW0zXG5cdCIKKyAgICAgICAgInBhbmQgICAgJSVtbTMsICUlbW02XG5cdCIKKyAgICAgICAgInBhbmQgICAgJSVtbTMsICUlbW03XG5cdCIKKyAgICAgICAgInBhbmQgICAgJSVtbTMsICUlbW01XG5cdCIKKworICAgICAgICAicG9yICAgICAlJW1tMSwgJSVtbTVcblx0IgorICAgICAgICAicG9yICAgICAlJW1tMiwgJSVtbTZcblx0IgorICAgICAgICAicG9yICAgICAlJW1tMCwgJSVtbTdcblx0IgorCisgICAgICAgIC8vIGEgJiBmCisJCSJtb3ZxICAgICglJSJYQlgiKSwgJSVtbTBcblx0IgkJLy8gdmFsdWUgYiBmcm9tIHRvcCBsZWZ0CQkKKwkJIm1vdnEgICAgLTIoJSUiWEJYIiwgJSUiWENYIiksICUlbW0xXG5cdCIJLy8gdmFsdWUgZCBmcm9tIGJvdHRvbSByaWdodAkJCQorCisJCSJtb3ZxCSUlbW0wLCAlJW1tM1xuXHQiCisJCSJwc3VidXNiCSUlbW0xLCAlJW1tM1xuXHQiCisJCSJwc3VidXNiICUlbW0wLCAlJW1tMVxuXHQiCisJCSJwb3IJCSUlbW0xLCAlJW1tM1xuXHQiCQkJCQkvLyBhYnMoYixkKQorCisJCSJwc3VidXNiICJfRGlmZlRocmVzIiwgJSVtbTNcblx0IgkvLyBub256ZXJvIHdoZXJlIGFicyhiLGQpID4gVGhyZXMgZWxzZSAwCisJCSJweG9yCSUlbW00LCAlJW1tNFxuXHQiCisJCSJwY21wZXFiICUlbW00LCAlJW1tM1xuXHQiCQkJLy8gbm93IGZmIHdoZXJlIGFicyhiLGQpIDwgVGhyZXMsIGVsc2UgMDAJCisJCSJwY21wZXFiCSUlbW0zLCAlJW1tNFxuXHQiCQkJLy8gaGVyZSBmZiB3aGVyZSBhYnMoYixkKSA+IFRocmVzLCBlbHNlIDAwCisKKwkJIm1vdnEgICAgLTIoJSUiWEJYIiksICUlbW0wXG5cdCIJCS8vIHZhbHVlIGEKKwkJIm1vdnEgICAgMiglJSJYQlgiLCAlJSJYQ1giKSwgJSVtbTFcblx0IgkvLyB2YWx1ZSBmCisJCSJtb3ZxCSUlbW0wLCAlJW1tMlxuXHQiCQkJCQkKKwkJVl9QQVZHQiAoIiUlbW0yIiwgIiUlbW0xIiwgIiUlbW0zIiwgX1NoaWZ0TWFzaykJLy8gYXZnKGEsZikKKyAgICAgICAgIm1vdnEJJSVtbTAsICUlbW0zXG5cdCIKKyAgICAgICAgInBzdWJ1c2IJJSVtbTEsICUlbW0wXG5cdCIKKwkJInBzdWJ1c2IgJSVtbTMsICUlbW0xXG5cdCIKKwkJInBvcgkJJSVtbTEsICUlbW0wXG5cdCIJCQkJCS8vIGFicyhhLGYpCisKKyAgICAgICAgIm1vdnEgICAgJSVtbTAsICUlbW0xXG5cdCIKKwkJInBzdWJ1c2IgIl9EaWZmVGhyZXMiLCAlJW1tMVxuXHQiCQkvLyBub256ZXJvIHdoZXJlIGFicyhhLGYpID4gVGhyZXMgZWxzZSAwCisJCSJweG9yCSUlbW0zLCAlJW1tM1xuXHQiCisJCSJwY21wZXFiICUlbW0zLCAlJW1tMVxuXHQiCQkJLy8gbm93IGZmIHdoZXJlIGFicyhhLGYpIDwgVGhyZXMsIGVsc2UgMDAJCisKKyAgICAgICAgInBhbmQgICAgJSVtbTQsICUlbW0xXG5cdCIKKworICAgICAgICAicGFuZCAgICAlJW1tMSwgJSVtbTJcblx0IgorICAgICAgICAicGFuZCAgICAlJW1tMSwgJSVtbTBcblx0IgorICAgICAgICAgICAgCisgICAgICAgICJtb3ZxICAgICUlbW0xLCAlJW1tM1xuXHQiCisgICAgICAgICJweG9yICAgICUlbW01LCAlJW1tM1xuXHQiCisgICAgICAgICJwYW5kICAgICUlbW0zLCAlJW1tNlxuXHQiCisgICAgICAgICJwYW5kICAgICUlbW0zLCAlJW1tN1xuXHQiCisgICAgICAgICJwYW5kICAgICUlbW0zLCAlJW1tNVxuXHQiCisKKyAgICAgICAgInBvciAgICAgJSVtbTEsICUlbW01XG5cdCIKKyAgICAgICAgInBvciAgICAgJSVtbTIsICUlbW02XG5cdCIKKyAgICAgICAgInBvciAgICAgJSVtbTAsICUlbW03XG5cdCIKKyAgICAgICAgICAgCisgCQkicGFuZAkiX1lNYXNrIiwgJSVtbTVcblx0IgkJLy8gbWFzayBvdXQgY2hyb21hIGZyb20gaGVyZQorIAkJInBhbmQJIl9ZTWFzayIsICUlbW02XG5cdCIJCQkvLyBtYXNrIG91dCBjaHJvbWEgZnJvbSBoZXJlCisgCQkicGFuZAkiX1lNYXNrIiwgJSVtbTdcblx0IgkJCS8vIG1hc2sgb3V0IGNocm9tYSBmcm9tIGhlcmUKKworCQkvLyBiLGUKKwkJIm1vdnEgICAgKCUlIlhCWCIpLCAlJW1tMFxuXHQiCQkvLyB2YWx1ZSBiIGZyb20gdG9wIAkJCisJCSJtb3ZxICAgICglJSJYQlgiLCAlJSJYQ1giKSwgJSVtbTFcblx0IgkvLyB2YWx1ZSBlIGZyb20gYm90dG9tIAorCQkibW92cQklJW1tMCwgJSVtbTJcblx0IgkJCQkJCisJCVZfUEFWR0IgKCIlJW1tMiIsICIlJW1tMSIsICIlJW1tMyIsIF9TaGlmdE1hc2spCS8vIGF2ZyhiLGUpCisgICAgICAgICJtb3ZxCSUlbW0wLCAlJW1tM1xuXHQiCisgICAgICAgICJwc3VidXNiCSUlbW0xLCAlJW1tMFxuXHQiCisJCSJwc3VidXNiICUlbW0zLCAlJW1tMVxuXHQiCisJCSJwb3IJCSUlbW0xLCAlJW1tMFxuXHQiCQkJCQkvLyBhYnMoYixlKQorCisgICAgICAgICJtb3ZxICAgICUlbW0wLCAlJW1tMVxuXHQiCisJCSJwc3VidXNiICJfRGlmZlRocmVzIiwgJSVtbTFcblx0IgkJLy8gbm9uemVybyB3aGVyZSBhYnMoYixlKSA+IFRocmVzIGVsc2UgMAorCQkicHhvcgklJW1tMywgJSVtbTNcblx0IgorCQkicGNtcGVxYiAlJW1tMywgJSVtbTFcblx0IgkJLy8gbm93IGZmIHdoZXJlIGFicyhiLGUpIDwgVGhyZXMsIGVsc2UgMDAJCisKKyAgICAgICAgInBhbmQgICAgJSVtbTEsICUlbW0yXG5cdCIKKyAgICAgICAgInBhbmQgICAgJSVtbTEsICUlbW0wXG5cdCIKKworICAgICAgICAibW92cSAgICAlJW1tMSwgJSVtbTNcblx0IgorICAgICAgICAicHhvciAgICAlJW1tNSwgJSVtbTNcblx0IgorICAgICAgICAicGFuZCAgICAlJW1tMywgJSVtbTZcblx0IgorICAgICAgICAicGFuZCAgICAlJW1tMywgJSVtbTdcblx0IgorICAgICAgICAicGFuZCAgICAlJW1tMywgJSVtbTVcblx0IgorCisgICAgICAgICJwb3IgICAgICUlbW0xLCAlJW1tNVxuXHQiCisgICAgICAgICJwb3IgICAgICUlbW0yLCAlJW1tNlxuXHQiCisgICAgICAgICJwb3IgICAgICUlbW0wLCAlJW1tN1xuXHQiCisKKwkJLy8gYm9iIGluIGFueSBsZWZ0b3ZlcnMKKwkJIm1vdnEgICAgKCUlIlhCWCIpLCAlJW1tMFxuXHQiCQkvLyB2YWx1ZSBiIGZyb20gdG9wIAkJCisJCSJtb3ZxICAgICglJSJYQlgiLCAlJSJYQ1giKSwgJSVtbTFcblx0IgkvLyB2YWx1ZSBlIGZyb20gYm90dG9tIAorCisKKy8vIFdlIHdpbGwgYWxzbyBjYWxjIGhlcmUgdGhlIG1heC9taW4gdmFsdWVzIHRvIGxhdGVyIGxpbWl0IGNvbWIKKy8vIHNvIHRoZSBtYXggZXhjdXJzaW9uIHdpbGwgbm90IGV4Y2VlZCB0aGUgTWF4X0NvbWIgY29uc3RhbnQKKworI2lmZGVmIFNLSVBfU0VBUkNICQkKKwkJIm1vdnEJJSVtbTAsICUlbW0yXG5cdCIKKy8vCQlwbWludWIJJSVtbTIsICUlbW0xCisJCVZfUE1JTlVCICgiJSVtbTIiLCAiJSVtbTEiLCAiJSVtbTQiKQorCisvLwkJcG1heHViCSUlbW02LCAlJW1tMgkJCS8vIGNsaXAgb3VyIGN1cnJlbnQgcmVzdWx0cyBzbyBmYXIgdG8gYmUgYWJvdmUgdGhpcworCQlWX1BNQVhVQiAoIiUlbW02IiwgIiUlbW0yIikKKyAgICAgICAgIm1vdnEJJSVtbTAsICUlbW0yXG5cdCIKKwkJVl9QTUFYVUIgKCIlJW1tMiIsICIlJW1tMSIpCisvLwkJcG1pbnViCSUlbW02LCAlJW1tMgkJCS8vIGNsaXAgb3VyIGN1cnJlbnQgcmVzdWx0cyBzbyBmYXIgdG8gYmUgYmVsb3cgdGhpcworCQlWX1BNSU5VQiAoIiUlbW02IiwgIiUlbW0yIiwgIiUlbW00IikKKworI2Vsc2UKKyAgICAgICAgIm1vdnEJJSVtbTAsICUlbW0yXG5cdCIKKwkJIm1vdnEJKCUlIlhBWCIpLCAlJW1tNFxuXHQiCisJCSJwc3VidXNiICUlbW00LCAlJW1tMlxuXHQiCisJCSJwc3VidXNiICUlbW0wLCAlJW1tNFxuXHQiCisJCSJwb3IJCSUlbW0yLCAlJW1tNFxuXHQiCQkJLy8gYWJzIGRpZmYKKwkJCisJCSJtb3ZxCSUlbW0xLCAlJW1tMlxuXHQiCisJCSJtb3ZxCSglJSJYQVgiLCAlJSJYQ1giKSwgJSVtbTNcblx0IgorCQkicHN1YnVzYiAlJW1tMywgJSVtbTJcblx0IgorCQkicHN1YnVzYiAlJW1tMSwgJSVtbTNcblx0IgorCQkicG9yCQklJW1tMiwgJSVtbTNcblx0IgkJCS8vIGFicyBkaWZmCisvLwkJcG1heHViICAlJW1tMywgJSVtbTQJCQkvLyB0b3Agb3IgYm90dG9tIHBpeGVsIG1vdmVkIG1vc3QKKwkJVl9QTUFYVUIgKCIlJW1tMyIsICIlJW1tNCIpCQkJLy8gdG9wIG9yIGJvdHRvbSBwaXhlbCBtb3ZlZCBtb3N0CisgICAgICAgICJwc3VidXNiICJfRGlmZlRocmVzIiwgJSVtbTNcblx0IgkJLy8gbW92ZWQgbW9yZSB0aGFuIGFsbG93ZWQ/IG9yIGdvZXMgdG8gMD8KKwkJInB4b3IJJSVtbTQsICUlbW00XG5cdCIKKwkJInBjbXBlcWIgJSVtbTQsICUlbW0zXG5cdCIJCQkvLyBub3cgZmYgd2hlcmUgbG93IG1vdGlvbiwgZWxzZSBoaWdoIG1vdGlvbgorCQkKKwkJIm1vdnEJJSVtbTAsICUlbW0yXG5cdCIKKy8vCQlwbWludWIJJSVtbTIsICUlbW0xCisJCVZfUE1JTlVCICgiJSVtbTIiLCAiJSVtbTEiLCAiJSVtbTQiKQorCisvLwkJcG1heHViCSUlbW02LCAlJW1tMgkJCS8vIGNsaXAgb3VyIGN1cnJlbnQgcmVzdWx0cyBzbyBmYXIgdG8gYmUgYWJvdmUgdGhpcworCQlWX1BNQVhVQiAoIiUlbW02IiwgIiUlbW0yIikKKworICAgICAgICAicHN1YnVzYiAlJW1tMywgJSVtbTJcblx0IgkJCS8vIG1heWJlIGRlY3JlYXNlIGl0IHRvIDAwMDAuLiBpZiBubyBzdXJyb3VuZCBtb3Rpb24KKwkJIm1vdnEJJSVtbTIsICJfTWluX1ZhbHMiXG5cdCIKKworCQkibW92cQklJW1tMCwgJSVtbTJcblx0IgorCQlWX1BNQVhVQiAoIiUlbW0yIiwgIiUlbW0xIikKKy8vCQlwbWludWIJJSVtbTYsICUlbW0yCQkJLy8gY2xpcCBvdXIgY3VycmVudCByZXN1bHRzIHNvIGZhciB0byBiZSBiZWxvdyB0aGlzCisJCVZfUE1JTlVCICgiJSVtbTYiLCAiJSVtbTIiLCAiJSVtbTQiKQorICAgICAgICAicGFkZHVzYiAlJW1tMywgJSVtbTJcblx0IgkJCS8vIG1heWJlIGluY3JlYXNlIGl0IHRvIGZmZmZmZiBpZiBubyBzdXJyb3VuZCBtb3Rpb24KKwkJIm1vdnEJJSVtbTIsICJfTWF4X1ZhbHMiXG5cdCIKKyNlbmRpZgorCQkJCisJCSJtb3ZxCSUlbW0wLCAlJW1tMlxuXHQiCQkJCQkJCisvLwkJcGF2Z2IJJSVtbTIsICUlbW0xCQkJCQkvLyBhdmcoYixlKQorCQlWX1BBVkdCICgiJSVtbTIiLCAiJSVtbTEiLCAiJSVtbTMiLCBfU2hpZnRNYXNrKQkvLyBhdmcoYixlKQorCQkJCQorICAgICAgICAibW92cQklJW1tMCwgJSVtbTNcblx0IgorCQkicHN1YnVzYgklJW1tMSwgJSVtbTNcblx0IgorCQkicHN1YnVzYiAlJW1tMCwgJSVtbTFcblx0IgorCQkicG9yCQklJW1tMSwgJSVtbTNcblx0IgkJCS8vIGFicyhiLGUpCisJCSJtb3ZxCSUlbW0zLCAlJW1tMVxuXHQiCQkJLy8ga2VlcCBjb3B5IG9mIGRpZmZzCisgICAgICAgICAgICAKKwkJInB4b3IJJSVtbTQsICUlbW00XG5cdCIJCQkKKwkJInBzdWJ1c2IgJSVtbTcsICUlbW0zXG5cdCIJCQkvLyBub256ZXJvIHdoZXJlIG5ldyB3ZWlnaHRzIGJpZ2dlciwgZWxzZSAwCisJCSJwY21wZXFiICUlbW00LCAlJW1tM1xuXHQiCQkJLy8gbm93IGZmIHdoZXJlIG5ldyBiZXR0ZXIsIGVsc2UgMDAJCisgICAgICAgICJwY21wZXFiICUlbW0wLCAlJW1tMFxuXHQiCisgICAgICAgICJwYW5kbiAgICUlbW0wLCAlJW1tNVxuXHQiCisgICAgICAgICJwb3IgICAgICUlbW01LCAlJW1tM1xuXHQiCisJCSJwY21wZXFiCSUlbW0zLCAlJW1tNFxuXHQiCQkJLy8gaGVyZSBmZiB3aGVyZSBvbGQgYmV0dGVyLCBlbHNlIDAwCisKKwkJInBhbmQJJSVtbTMsICUlbW0xXG5cdCIKKwkJInBhbmQJJSVtbTMsICUlbW0yXG5cdCIKKyAgICAgICAgCisJCSJwYW5kICAgICUlbW00LCAlJW1tNlxuXHQiCisJCSJwYW5kICAgICUlbW00LCAlJW1tN1xuXHQiCisKKwkJInBvcgkJJSVtbTIsICUlbW02XG5cdCIJCQkvLyBvdXIgeDIgdmFsdWUKKwkJInBvcgkJJSVtbTEsICUlbW03XG5cdCIJCQkvLyBvdXIgeDIgZGlmZnMKKwkJIm1vdnEJJSVtbTcsICUlbW00XG5cdCIJCQkvLyBzYXZlIGFzIGJvYiB1bmNlcnRhaW50eSBpbmRpY2F0b3IKKworI2Vsc2UKKworICAgICAgICBkaWZmWzBdID0gLTE7CisgICAgICAgIGRpZmZbMV0gPSAtMTsKKwliZXN0WzBdID0gMDsKKwliZXN0WzFdID0gMDsKKwkvLyBqLCBuCisgICAgICAgIGlmIChBQlMgKHBCb2JbLTJdIC0gcEJvYltzcmNfcGl0Y2gyIC0gNF0pIDwgRGlmZlRocmVzICYmCisJICAgIEFCUyAocEJvYlstNF0gLSBwQm9iW3NyY19waXRjaDIgKyA0XSkgPiBEaWZmVGhyZXMpIHsKKwkgICBiZXN0WzBdID0gKHBCb2JbLTJdICsgcEJvYltzcmNfcGl0Y2gyIC0gNF0pIC8gMjsKKwkgICBkaWZmWzBdID0gQUJTIChwQm9iWy0yXSAtIHBCb2Jbc3JjX3BpdGNoMiAtIDRdKTsKKwl9CisgICAgICAgIGlmIChBQlMgKHBCb2JbLTFdIC0gcEJvYltzcmNfcGl0Y2gyIC0gM10pIDwgRGlmZlRocmVzICYmCisJICAgIEFCUyAocEJvYlstM10gLSBwQm9iW3NyY19waXRjaDIgKyA1XSkgPiBEaWZmVGhyZXMpIHsKKwkgICBiZXN0WzFdID0gKHBCb2JbLTFdICsgcEJvYltzcmNfcGl0Y2gyIC0gM10pIC8gMjsKKwkgICBkaWZmWzFdID0gQUJTIChwQm9iWy0xXSAtIHBCb2Jbc3JjX3BpdGNoMiAtIDNdKTsKKwl9CisKKyAgICAgICAgLy8gayAmIG0KKyAgICAgICAgaWYgKEFCUyAocEJvYlsyXSAtIHBCb2Jbc3JjX3BpdGNoMiArIDRdKSA8IERpZmZUaHJlcyAmJgorCSAgICBBQlMgKHBCb2JbNF0gLSBwQm9iW3NyY19waXRjaDIgLSA0XSkgPiBEaWZmVGhyZXMpIHsKKwkgICBiZXN0WzBdID0gKHBCb2JbNF0gKyBwQm9iW3NyY19waXRjaDIgLSA0XSkgLyAyOworCSAgIGRpZmZbMF0gPSBBQlMgKHBCb2JbNF0gLSBwQm9iW3NyY19waXRjaDIgLSA0XSk7CisJfQorCisgICAgICAgIGlmIChBQlMgKHBCb2JbM10gLSBwQm9iW3NyY19waXRjaDIgKyA1XSkgPCBEaWZmVGhyZXMgJiYKKwkgICAgQUJTIChwQm9iWzVdIC0gcEJvYltzcmNfcGl0Y2gyIC0gM10pID4gRGlmZlRocmVzKSB7CisJICAgYmVzdFsxXSA9IChwQm9iWzVdICsgcEJvYltzcmNfcGl0Y2gyIC0gM10pIC8gMjsKKwkgICBkaWZmWzFdID0gQUJTIChwQm9iWzVdIC0gcEJvYltzcmNfcGl0Y2gyIC0gM10pOworCX0KKworICAgICAgICAvLyBjICYgZAorCWlmIChBQlMgKHBCb2JbMF0gLSBwQm9iW3NyY19waXRjaDIgKyAyXSkgPCBEaWZmVGhyZXMgJiYKKwkgICAgQUJTIChwQm9iWzJdIC0gcEJvYltzcmNfcGl0Y2gyIC0gMl0pID4gRGlmZlRocmVzKSB7CisJICAgYmVzdFswXSA9IChwQm9iWzJdICsgcEJvYltzcmNfcGl0Y2gyIC0gMl0pIC8gMjsKKwkgICBkaWZmWzBdID0gQUJTIChwQm9iWzJdIC0gcEJvYltzcmNfcGl0Y2gyIC0gMl0pOworCX0KKworCWlmIChBQlMgKHBCb2JbMV0gLSBwQm9iW3NyY19waXRjaDIgKyAzXSkgPCBEaWZmVGhyZXMgJiYKKwkgICAgQUJTIChwQm9iWzNdIC0gcEJvYltzcmNfcGl0Y2gyIC0gMV0pID4gRGlmZlRocmVzKSB7CisJICAgYmVzdFsxXSA9IChwQm9iWzNdICsgcEJvYltzcmNfcGl0Y2gyIC0gMV0pIC8gMjsKKwkgICBkaWZmWzFdID0gQUJTIChwQm9iWzNdIC0gcEJvYltzcmNfcGl0Y2gyIC0gMV0pOworCX0KKworICAgICAgICAvLyBhICYgZgorCWlmIChBQlMgKHBCb2JbMF0gLSBwQm9iW3NyY19waXRjaDIgLSAyXSkgPCBEaWZmVGhyZXMgJiYKKwkgICAgQUJTIChwQm9iWy0yXSAtIHBCb2Jbc3JjX3BpdGNoMiArIDJdKSA+IERpZmZUaHJlcykgeworCSAgIGJlc3RbMF0gPSAocEJvYlstMl0gKyBwQm9iW3NyY19waXRjaDIgKyAyXSkgLyAyOworCSAgIGRpZmZbMF0gPSBBQlMgKHBCb2JbLTJdIC0gcEJvYltzcmNfcGl0Y2gyICsgMl0pOworCX0KKworCWlmIChBQlMgKHBCb2JbMV0gLSBwQm9iW3NyY19waXRjaDIgLSAxXSkgPCBEaWZmVGhyZXMgJiYKKwkgICAgQUJTIChwQm9iWy0xXSAtIHBCb2Jbc3JjX3BpdGNoMiArIDNdKSA+IERpZmZUaHJlcykgeworCSAgIGJlc3RbMV0gPSAocEJvYlstMV0gKyBwQm9iW3NyY19waXRjaDIgKyAzXSkgLyAyOworCSAgIGRpZmZbMV0gPSBBQlMgKHBCb2JbLTFdIC0gcEJvYltzcmNfcGl0Y2gyICsgM10pOworCX0KKworCS8vIGIsZQorCWlmIChBQlMgKHBCb2JbMF0gLSBwQm9iW3NyY19waXRjaDJdKSA8IERpZmZUaHJlcykgeworCSAgIGJlc3RbMF0gPSAocEJvYlswXSArIHBCb2Jbc3JjX3BpdGNoMl0pIC8gMjsKKwkgICBkaWZmWzBdID0gQUJTIChwQm9iWzBdIC0gcEJvYltzcmNfcGl0Y2gyXSk7CisJfQorCisJaWYgKEFCUyAocEJvYlsxXSAtIHBCb2Jbc3JjX3BpdGNoMiArIDFdKSA8IERpZmZUaHJlcykgeworCSAgIGJlc3RbMV0gPSAocEJvYlsxXSArIHBCb2Jbc3JjX3BpdGNoMiArIDFdKSAvIDI7CisJICAgZGlmZlsxXSA9IEFCUyAocEJvYlsxXSAtIHBCb2Jbc3JjX3BpdGNoMiArIDFdKTsKKwl9CisKKworLy8gV2Ugd2lsbCBhbHNvIGNhbGMgaGVyZSB0aGUgbWF4L21pbiB2YWx1ZXMgdG8gbGF0ZXIgbGltaXQgY29tYgorLy8gc28gdGhlIG1heCBleGN1cnNpb24gd2lsbCBub3QgZXhjZWVkIHRoZSBNYXhfQ29tYiBjb25zdGFudAorCisjaWZkZWYgU0tJUF9TRUFSQ0gKKwkJYmVzdFswXSA9IENMQU1QIChiZXN0WzBdLCBNSU4gKHBCb2Jbc3JjX3BpdGNoMl0sIHBCb2JbMF0pLCBNQVggKHBCb2Jbc3JjX3BpdGNoMl0sIHBCb2JbMF0pKTsKKwkJYmVzdFsxXSA9IENMQU1QIChiZXN0WzFdLCBNSU4gKHBCb2Jbc3JjX3BpdGNoMiArIDFdLCBwQm9iWzFdKSwgTUFYIChwQm9iW3NyY19waXRjaDIgKyAxXSwgcEJvYlsxXSkpOworI2Vsc2UKKwkJbW92WzBdID0gTUFYIChBQlMgKHBCb2JbMF0gLSBwQm9iUFswXSksIEFCUyAocEJvYltzcmNfcGl0Y2gyXSAtIHBCb2JQW3NyY19waXRjaDJdKSk7CisJCW1vdlsxXSA9IE1BWCAoQUJTIChwQm9iWzFdIC0gcEJvYlBbMV0pLCBBQlMgKHBCb2Jbc3JjX3BpdGNoMiArIDFdIC0gcEJvYlBbc3JjX3BpdGNoMiArIDFdKSk7CisKKwkJTWluVmFsc1swXSA9IDA7CisJCU1pblZhbHNbMV0gPSAwOworCQlNYXhWYWxzWzBdID0gMjU1OworCQlNYXhWYWxzWzFdID0gMjU1OworCQlpZiAobW92WzBdID4gRGlmZlRocmVzKSB7CisJCSAgTWluVmFsc1swXSA9IE1BWCAoTUlOIChwQm9iWzBdLCBwQm9iW3NyY19waXRjaDJdKSwgYmVzdFswXSk7CisJCSAgTWF4VmFsc1swXSA9IE1JTiAoTUFYIChwQm9iWzBdLCBwQm9iW3NyY19waXRjaDJdKSwgYmVzdFswXSk7CisJCX0KKwkJCisJCWlmIChtb3ZbMV0gPiBEaWZmVGhyZXMpIHsKKwkJICBNaW5WYWxzWzFdID0gTUFYIChNSU4gKHBCb2JbMV0sIHBCb2Jbc3JjX3BpdGNoMisxXSksIGJlc3RbMV0pOworCQkgIE1heFZhbHNbMV0gPSBNSU4gKE1BWCAocEJvYlsxXSwgcEJvYltzcmNfcGl0Y2gyKzFdKSwgYmVzdFsxXSk7CisJCX0KKworCQliZXN0WzBdID0gQ0xBTVAgKGJlc3RbMF0sIE1JTiAocEJvYltzcmNfcGl0Y2gyXSwgcEJvYlswXSksIE1BWCAocEJvYltzcmNfcGl0Y2gyXSwgcEJvYlswXSkpOworCQliZXN0WzFdID0gQ0xBTVAgKGJlc3RbMV0sIE1JTiAocEJvYltzcmNfcGl0Y2gyICsgMV0sIHBCb2JbMV0pLCBNQVggKHBCb2Jbc3JjX3BpdGNoMiArIDFdLCBwQm9iWzFdKSk7CisjZW5kaWYKKwkJYXZnWzBdID0gKHBCb2Jbc3JjX3BpdGNoMl0gKyBwQm9iWzBdKSAvIDI7CisJCWF2Z1sxXSA9IChwQm9iW3NyY19waXRjaDIgKyAxXSArIHBCb2JbMV0pIC8gMjsKKwkJZGlmZjJbMF0gPSBBQlMgKHBCb2Jbc3JjX3BpdGNoMiArIDFdIC0gcEJvYlsxXSk7CisJCWRpZmYyWzFdID0gQUJTIChwQm9iW3NyY19waXRjaDIgKyAxXSAtIHBCb2JbMV0pOworCisJCWlmIChkaWZmWzBdID09IC0xIHx8IGRpZmYyWzBdIDwgZGlmZlswXSkgeworCQkgIGJlc3RbMF0gPSBhdmdbMF07CisJCSAgZGlmZlswXSA9IGRpZmYyWzBdOworCQl9CisKKwkJaWYgKGRpZmZbMV0gPT0gLTEgfHwgZGlmZjJbMV0gPCBkaWZmWzFdKSB7CisJCSAgYmVzdFsxXSA9IGF2Z1sxXTsKKwkJICBkaWZmWzFdID0gZGlmZjJbMV07CisJCX0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwuaW5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNThiYmEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvVG9tc01vQ29tcEFsbC5pbmMKQEAgLTAsMCArMSwyNjYgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUb20gQmFycnkgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIFJlbGljZW5zZWQgZm9yIEdTdHJlYW1lciBmcm9tIEdQTCB0byBMR1BMIHdpdGggcGVybWl0IGZyb20gVG9tIEJhcnJ5LgorICogU2VlOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjM1NzgKKyAqLworCisKKyNpZm5kZWYgVG9wRmlyc3QKKyNkZWZpbmUgVG9wRmlyc3QgSXNPZGQKKyNlbmRpZgorCisjaWZkZWYgU0VGVU5DCisjdW5kZWYgU0VGVU5DCisjZW5kaWYKKworI2lmIGRlZmluZWQoSVNfTU1YRVhUKQorI2RlZmluZSBTRUZVTkMoeCkgU2VhcmNoX0VmZm9ydF9NTVhFWFRfIyN4KGludCBzcmNfcGl0Y2gsIGludCBkc3RfcGl0Y2gsIGludCByb3dzaXplLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwV2VhdmVTcmMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBXZWF2ZVNyY1AsIHVuc2lnbmVkIGNoYXIgKnBXZWF2ZURlc3QsIGludCBJc09kZCwgY29uc3QgdW5zaWduZWQgY2hhciAqcENvcHlTcmMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBDb3B5U3JjUCwgaW50IEZsZEhlaWdodCkKKyNlbGlmIGRlZmluZWQoSVNfM0ROT1cpCisjZGVmaW5lIFNFRlVOQyh4KSBTZWFyY2hfRWZmb3J0XzNETk9XXyMjeChpbnQgc3JjX3BpdGNoLCBpbnQgZHN0X3BpdGNoLCBpbnQgcm93c2l6ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcFdlYXZlU3JjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwV2VhdmVTcmNQLCB1bnNpZ25lZCBjaGFyICpwV2VhdmVEZXN0LCBpbnQgSXNPZGQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBDb3B5U3JjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwQ29weVNyY1AsIGludCBGbGRIZWlnaHQpCisjZWxpZiBkZWZpbmVkKElTX01NWCkKKyNkZWZpbmUgU0VGVU5DKHgpIFNlYXJjaF9FZmZvcnRfTU1YXyMjeChpbnQgc3JjX3BpdGNoLCBpbnQgZHN0X3BpdGNoLCBpbnQgcm93c2l6ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcFdlYXZlU3JjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwV2VhdmVTcmNQLCB1bnNpZ25lZCBjaGFyICpwV2VhdmVEZXN0LCBpbnQgSXNPZGQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBDb3B5U3JjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwQ29weVNyY1AsIGludCBGbGRIZWlnaHQpCisjZWxzZQorI2RlZmluZSBTRUZVTkMoeCkgU2VhcmNoX0VmZm9ydF9DXyMjeChpbnQgc3JjX3BpdGNoLCBpbnQgZHN0X3BpdGNoLCBpbnQgcm93c2l6ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcFdlYXZlU3JjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwV2VhdmVTcmNQLCB1bnNpZ25lZCBjaGFyICpwV2VhdmVEZXN0LCBpbnQgSXNPZGQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBDb3B5U3JjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwQ29weVNyY1AsIGludCBGbGRIZWlnaHQpCisjZW5kaWYKKworI2luY2x1ZGUgIlRvbXNNb0NvbXBBbGwyLmluYyIKKworI2RlZmluZSBVU0VfU1RSQU5HRV9CT0IKKworI2luY2x1ZGUgIlRvbXNNb0NvbXBBbGwyLmluYyIKKworI3VuZGVmIFVTRV9TVFJBTkdFX0JPQgorCisjdW5kZWYgU0VGVU5DCisjaWYgZGVmaW5lZChJU19NTVhFWFQpCisjZGVmaW5lIFNFRlVOQyh4KSBTZWFyY2hfRWZmb3J0X01NWEVYVF8jI3goc3JjX3BpdGNoLCBkc3RfcGl0Y2gsIHJvd3NpemUsIHBXZWF2ZVNyYywgcFdlYXZlU3JjUCwgcFdlYXZlRGVzdCwgSXNPZGQsIHBDb3B5U3JjLCBwQ29weVNyY1AsIEZsZEhlaWdodCkKKyNlbGlmIGRlZmluZWQoSVNfM0ROT1cpCisjZGVmaW5lIFNFRlVOQyh4KSBTZWFyY2hfRWZmb3J0XzNETk9XXyMjeChzcmNfcGl0Y2gsIGRzdF9waXRjaCwgcm93c2l6ZSwgcFdlYXZlU3JjLCBwV2VhdmVTcmNQLCBwV2VhdmVEZXN0LCBJc09kZCwgcENvcHlTcmMsIHBDb3B5U3JjUCwgRmxkSGVpZ2h0KQorI2VsaWYgZGVmaW5lZChJU19NTVgpCisjZGVmaW5lIFNFRlVOQyh4KSBTZWFyY2hfRWZmb3J0X01NWF8jI3goc3JjX3BpdGNoLCBkc3RfcGl0Y2gsIHJvd3NpemUsIHBXZWF2ZVNyYywgcFdlYXZlU3JjUCwgcFdlYXZlRGVzdCwgSXNPZGQsIHBDb3B5U3JjLCBwQ29weVNyY1AsIEZsZEhlaWdodCkKKyNlbHNlCisjZGVmaW5lIFNFRlVOQyh4KSBTZWFyY2hfRWZmb3J0X0NfIyN4KHNyY19waXRjaCwgZHN0X3BpdGNoLCByb3dzaXplLCBwV2VhdmVTcmMsIHBXZWF2ZVNyY1AsIHBXZWF2ZURlc3QsIElzT2RkLCBwQ29weVNyYywgcENvcHlTcmNQLCBGbGRIZWlnaHQpCisjZW5kaWYKKworc3RhdGljIHZvaWQgRlVOQ1RfTkFNRShHc3REZWludGVybGFjZU1ldGhvZCAqZF9tZXRob2QsCisJY29uc3QgR3N0RGVpbnRlcmxhY2VGaWVsZCogaGlzdG9yeSwgZ3VpbnQgaGlzdG9yeV9jb3VudCwKKwlHc3RWaWRlb0ZyYW1lICpvdXRmcmFtZSwgaW50IGN1cl9maWVsZF9pZHgpCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kVG9tc01vQ29tcCAqc2VsZiA9IEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfVE9NU01PQ09NUCAoZF9tZXRob2QpOworICBnbG9uZyBTZWFyY2hFZmZvcnQgPSBzZWxmLT5zZWFyY2hfZWZmb3J0OworICBnaW50IFVzZVN0cmFuZ2VCb2IgPSBzZWxmLT5zdHJhbmdlX2JvYjsKKyAgZ2ludCBJc09kZDsKKyAgY29uc3QgZ3VpbnQ4ICpwV2VhdmVTcmM7CisgIGNvbnN0IGd1aW50OCAqcFdlYXZlU3JjUDsKKyAgZ3VpbnQ4ICpwV2VhdmVEZXN0OworICBjb25zdCBndWludDggKnBDb3B5U3JjOworICBjb25zdCBndWludDggKnBDb3B5U3JjUDsKKyAgZ3VpbnQ4ICpwQ29weURlc3Q7CisgIGdpbnQgc3JjX3BpdGNoOworICBnaW50IGRzdF9waXRjaDsKKyAgZ2ludCByb3dzaXplOworICBnaW50IEZsZEhlaWdodDsKKworICBpZiAoY3VyX2ZpZWxkX2lkeCArIDIgPiBoaXN0b3J5X2NvdW50IHx8IGN1cl9maWVsZF9pZHggPCAxKSB7CisgICAgR3N0RGVpbnRlcmxhY2VNZXRob2QgKmJhY2t1cF9tZXRob2Q7CisgICAgCisgICAgYmFja3VwX21ldGhvZCA9IGdfb2JqZWN0X25ldyAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9saW5lYXJfZ2V0X3R5cGUoKSwKKyAgICAgICAgTlVMTCk7CisKKyAgICBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3NldHVwIChiYWNrdXBfbWV0aG9kLCBkX21ldGhvZC0+dmluZm8pOworICAgIGdzdF9kZWludGVybGFjZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWUgKGJhY2t1cF9tZXRob2QsCisgICAgICAgIGhpc3RvcnksIGhpc3RvcnlfY291bnQsIG91dGZyYW1lLCBjdXJfZmllbGRfaWR4KTsKKworICAgIGdfb2JqZWN0X3VucmVmIChiYWNrdXBfbWV0aG9kKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBkb3VibGUgc3RyaWRlIGRvIGFkZHJlc3MganVzdCBldmVyeSBvZGQvZXZlbiBzY2FubGluZSAqLworICBzcmNfcGl0Y2ggPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChvdXRmcmFtZSwgMCkgKiAyOworICBkc3RfcGl0Y2ggPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChvdXRmcmFtZSwgMCk7CisgIHJvd3NpemUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChvdXRmcmFtZSwgMCk7CisKKyAgRmxkSGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChzZWxmLT5wYXJlbnQudmluZm8pIC8gMjsKKworICBwQ29weVNyYyAgID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGhpc3RvcnlbaGlzdG9yeV9jb3VudC0xXS5mcmFtZSwgMCk7CisgIGlmIChoaXN0b3J5W2hpc3RvcnlfY291bnQgLSAxXS5mbGFncyAmIFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00pCisgICAgcENvcHlTcmMgKz0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoaGlzdG9yeVtoaXN0b3J5X2NvdW50LTFdLmZyYW1lLCAwKTsKKyAgcENvcHlTcmNQICA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChoaXN0b3J5W2hpc3RvcnlfY291bnQtM10uZnJhbWUsIDApOworICBpZiAoaGlzdG9yeVtoaXN0b3J5X2NvdW50IC0gM10uZmxhZ3MgJiBQSUNUVVJFX0lOVEVSTEFDRURfQk9UVE9NKQorICAgIHBDb3B5U3JjUCArPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChoaXN0b3J5W2hpc3RvcnlfY291bnQtM10uZnJhbWUsIDApOworICBwV2VhdmVTcmMgID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGhpc3RvcnlbaGlzdG9yeV9jb3VudC0yXS5mcmFtZSwgMCk7CisgIGlmIChoaXN0b3J5W2hpc3RvcnlfY291bnQgLSAyXS5mbGFncyAmIFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00pCisgICAgcFdlYXZlU3JjICs9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGhpc3RvcnlbaGlzdG9yeV9jb3VudC0yXS5mcmFtZSwgMCk7CisgIHBXZWF2ZVNyY1AgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaGlzdG9yeVtoaXN0b3J5X2NvdW50LTRdLmZyYW1lLCAwKTsKKyAgaWYgKGhpc3RvcnlbaGlzdG9yeV9jb3VudCAtIDRdLmZsYWdzICYgUElDVFVSRV9JTlRFUkxBQ0VEX0JPVFRPTSkKKyAgICBwV2VhdmVTcmNQICs9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGhpc3RvcnlbaGlzdG9yeV9jb3VudC00XS5mcmFtZSwgMCk7CisKKyAgLyogdXNlIGJvdHRvbSBmaWVsZCBhbmQgaW50ZXJsYWNlIHRvcCBmaWVsZCAqLworICBpZiAoaGlzdG9yeVtoaXN0b3J5X2NvdW50LTJdLmZsYWdzID09IFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00pIHsKKyAgICBJc09kZCAgICAgID0gMTsKKworICAgIC8vIGlmIHdlIGhhdmUgYW4gb2RkIGZpZWxkIHdlIGNvcHkgYW4gZXZlbiBmaWVsZCBhbmQgd2VhdmUgYW4gb2RkIGZpZWxkCisgICAgcENvcHlEZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dGZyYW1lLCAwKTsKKyAgICBwV2VhdmVEZXN0ID0gcENvcHlEZXN0ICsgZHN0X3BpdGNoOworICB9CisgIC8qIGRvIGl0IHZpY2UgdmVyY2EgKi8KKyAgZWxzZSB7CisKKyAgICBJc09kZCAgICAgID0gMDsKKyAgICAvLyBpZiB3ZSBoYXZlIGFuIGV2ZW4gZmllbGQgd2UgY29weSBhbiBvZGQgZmllbGQgYW5kIHdlYXZlIGFuIGV2ZW4gZmllbGQKKyAgICBwQ29weURlc3QgPSAoZ3VpbnQ4ICopIEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRmcmFtZSwgMCkgKyBkc3RfcGl0Y2g7CisgICAgcFdlYXZlRGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRmcmFtZSwgMCk7CisgIH0KKworICAKKyAgLy8gY29weSAxc3QgYW5kIGxhc3Qgd2VhdmUgbGluZXMgCisgIEZpZWxkY29weShwV2VhdmVEZXN0LCBwQ29weVNyYywgcm93c2l6ZSwJCQorCSAgICAxLCBkc3RfcGl0Y2gqMiwgc3JjX3BpdGNoKTsKKyAgRmllbGRjb3B5KHBXZWF2ZURlc3QrKEZsZEhlaWdodC0xKSpkc3RfcGl0Y2gqMiwKKwkgICAgcENvcHlTcmMrKEZsZEhlaWdodC0xKSpzcmNfcGl0Y2gsIHJvd3NpemUsIAorCSAgICAxLCBkc3RfcGl0Y2gqMiwgc3JjX3BpdGNoKTsKKyAgCisjaWZkZWYgVVNFX1ZFUlRJQ0FMX0ZJTFRFUgorICAvLyBWZXJ0aWNhbCBGaWx0ZXIgY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZCBmb3IgRFNjYWxlciAhIQorICAvLyBjb3B5IDFzdCBhbmQgbGFzdCBsaW5lcyB0aGUgY29weSBmaWVsZAorICBGaWVsZGNvcHkocENvcHlEZXN0LCBwQ29weVNyYywgcm93c2l6ZSwgCisJICAgIDEsIGRzdF9waXRjaCoyLCBzcmNfcGl0Y2gpOworICBGaWVsZGNvcHkocENvcHlEZXN0KyhGbGRIZWlnaHQtMSkqZHN0X3BpdGNoKjIsCisJICAgIHBDb3B5U3JjKyhGbGRIZWlnaHQtMSkqc3JjX3BpdGNoLCByb3dzaXplLCAKKwkgICAgMSwgZHN0X3BpdGNoKjIsIHNyY19waXRjaCk7CisjZWxzZQorICAKKyAgLy8gY29weSBhbGwgb2YgdGhlIGNvcHkgZmllbGQKKyAgRmllbGRjb3B5KHBDb3B5RGVzdCwgcENvcHlTcmMsIHJvd3NpemUsIAorCSAgICBGbGRIZWlnaHQsIGRzdF9waXRjaCoyLCBzcmNfcGl0Y2gpOworI2VuZGlmCQorICAvLyB0aGVuIGdvIGZpbGwgaW4gdGhlIGhhcmQgcGFydCwgYmVpbmcgdmFyaW91c2x5IGxhenkgZGVwZW5kaW5nIHVwb24KKyAgLy8gU2VhcmNoRWZmb3J0CisKKyAgaWYoIVVzZVN0cmFuZ2VCb2IpIHsKKyAgICBpZiAoU2VhcmNoRWZmb3J0ID09IDApCisgICAgICB7CisJU0VGVU5DKDApOworICAgICAgfQorICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSAxKQorICAgICAgeworCVNFRlVOQygxKTsKKyAgICAgIH0KKyAgICAvKgllbHNlIGlmIChTZWFyY2hFZmZvcnQgPD0gMikKKwl7CisJU0VGVU5DKDIpOworCX0KKyAgICAqLworICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSAzKQorICAgICAgeworCVNFRlVOQygzKTsKKyAgICAgIH0KKyAgICBlbHNlIGlmIChTZWFyY2hFZmZvcnQgPD0gNSkKKyAgICAgIHsKKwlTRUZVTkMoNSk7CisgICAgICB9CisgICAgZWxzZSBpZiAoU2VhcmNoRWZmb3J0IDw9IDkpCisgICAgICB7CisJU0VGVU5DKDkpOworICAgICAgfQorICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSAxMSkKKyAgICAgIHsKKwlTRUZVTkMoMTEpOworICAgICAgfQorICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSAxMykKKyAgICAgIHsKKwlTRUZVTkMoMTMpOworICAgICAgfQorICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSAxNSkKKyAgICAgIHsKKwlTRUZVTkMoMTUpOworICAgICAgfQorICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSAxOSkKKyAgICAgIHsKKwlTRUZVTkMoMTkpOworICAgICAgfQorICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSAyMSkKKyAgICAgIHsKKwlTRUZVTkMoMjEpOworICAgICAgfQorICAgIGVsc2UgCisgICAgICB7CisJU0VGVU5DKE1heCk7CisgICAgICB9CisgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChTZWFyY2hFZmZvcnQgPT0gMCkKKwl7CisJICBTRUZVTkMoMFNCKTsKKwl9CisgICAgICBlbHNlIGlmIChTZWFyY2hFZmZvcnQgPD0gMSkKKwl7CisJICBTRUZVTkMoMVNCKTsKKwl9CisgICAgICAvKgllbHNlIGlmIChTZWFyY2hFZmZvcnQgPD0gMikKKwkJeworCQlTRUZVTkMoMlNCKTsKKwkJfQorICAgICAgKi8KKyAgICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSAzKQorCXsKKwkgIFNFRlVOQygzU0IpOworCX0KKyAgICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSA1KQorCXsKKwkgIFNFRlVOQyg1U0IpOworCX0KKyAgICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSA5KQorCXsKKwkgIFNFRlVOQyg5U0IpOworCX0KKyAgICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSAxMSkKKwl7CisJICBTRUZVTkMoMTFTQik7CisJfQorICAgICAgZWxzZSBpZiAoU2VhcmNoRWZmb3J0IDw9IDEzKQorCXsKKwkgIFNFRlVOQygxM1NCKTsKKwl9CisgICAgICBlbHNlIGlmIChTZWFyY2hFZmZvcnQgPD0gMTUpCisJeworCSAgU0VGVU5DKDE1U0IpOworCX0KKyAgICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSAxOSkKKwl7CisJICBTRUZVTkMoMTlTQik7CisJfQorICAgICAgZWxzZSBpZiAoU2VhcmNoRWZmb3J0IDw9IDIxKQorCXsKKwkgIFNFRlVOQygyMVNCKTsKKwl9CisgICAgICBlbHNlIAorCXsKKwkgIFNFRlVOQyhNYXhTQik7CisJfQorICAgIH0KKworI2lmIGRlZmluZWQoQlVJTERfWDg2X0FTTSkgJiYgIWRlZmluZWQoSVNfQykKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18oImVtbXMiKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwyLmluYyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9Ub21zTW9Db21wQWxsMi5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYzNDRlYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9Ub21zTW9Db21wQWxsMi5pbmMKQEAgLTAsMCArMSwyNDMgQEAKKy8vIC0qLSBjKysgLSotCisKKyNpZmRlZiBTRUFSQ0hfRUZGT1JUX0ZVTkMKKyN1bmRlZiBTRUFSQ0hfRUZGT1JUX0ZVTkMKKyNlbmRpZgorCisjaWZkZWYgVVNFX1NUUkFOR0VfQk9CCisjZGVmaW5lIFNFQVJDSF9FRkZPUlRfRlVOQyhuKSBTRUZVTkMobiMjU0IpCisjZWxzZQorI2RlZmluZSBTRUFSQ0hfRUZGT1JUX0ZVTkMobikgU0VGVU5DKG4pCisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgU0VBUkNIX0VGRk9SVF9GVU5DKDApCQkvLyB3ZSBkb24ndCB0cnkgYXQgYWxsIDstKQoreworCQkvL3NlZSBTZWFyY2hfRWZmb3J0X01heCgpIGZvciBjb21tZW50cworI2RlZmluZSBTS0lQX1NFQVJDSAorI2luY2x1ZGUgIlNlYXJjaExvb3BUb3AuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BCb3R0b20uaW5jIgorI3VuZGVmIFNLSVBfU0VBUkNICit9CisKK3N0YXRpYyBpbmxpbmUgaW50IFNFQVJDSF9FRkZPUlRfRlVOQygxKQoreworI2lmZGVmIElTX0MKKyNkZWZpbmUgU0tJUF9TRUFSQ0gKKyNpbmNsdWRlICJTZWFyY2hMb29wVG9wLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wQm90dG9tLmluYyIKKyN1bmRlZiBTS0lQX1NFQVJDSAorI2Vsc2UKKwkJLy9zZWUgU2VhcmNoX0VmZm9ydF9NYXgoKSBmb3IgY29tbWVudHMKKyNpbmNsdWRlICJTZWFyY2hMb29wVG9wLmluYyIKKwlSRVNFVF9DSFJPTUEJCS8vIHByZXRlbmQgY2hyb21hIGRpZmZzIHdhcyAyNTUgZWFjaAorI2luY2x1ZGUgIlNlYXJjaExvb3AwQS5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcEJvdHRvbS5pbmMiCisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBpbnQgU0VBUkNIX0VGRk9SVF9GVU5DKDMpCit7CisjaWZkZWYgSVNfQworI2RlZmluZSBTS0lQX1NFQVJDSAorI2luY2x1ZGUgIlNlYXJjaExvb3BUb3AuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BCb3R0b20uaW5jIgorI3VuZGVmIFNLSVBfU0VBUkNICisjZWxzZQorCQkvL3NlZSBTZWFyY2hfRWZmb3J0X01heCgpIGZvciBjb21tZW50cworI2luY2x1ZGUgIlNlYXJjaExvb3BUb3AuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BPZGRBMi5pbmMiCisJUkVTRVRfQ0hST01BCQkvLyBwcmV0ZW5kIGNocm9tYSBkaWZmcyB3YXMgMjU1IGVhY2gKKyNpbmNsdWRlICJTZWFyY2hMb29wMEEuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BCb3R0b20uaW5jIgorI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgaW50IFNFQVJDSF9FRkZPUlRfRlVOQyg1KQoreworI2lmZGVmIElTX0MKKyNkZWZpbmUgU0tJUF9TRUFSQ0gKKyNpbmNsdWRlICJTZWFyY2hMb29wVG9wLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wQm90dG9tLmluYyIKKyN1bmRlZiBTS0lQX1NFQVJDSAorI2Vsc2UKKwkJLy9zZWUgU2VhcmNoX0VmZm9ydF9NYXgoKSBmb3IgY29tbWVudHMKKyNpbmNsdWRlICJTZWFyY2hMb29wVG9wLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wT2RkQTIuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BPZGRBSDIuaW5jIgorCVJFU0VUX0NIUk9NQQkJLy8gcHJldGVuZCBjaHJvbWEgZGlmZnMgd2FzIDI1NSBlYWNoCisjaW5jbHVkZSAiU2VhcmNoTG9vcDBBLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wQm90dG9tLmluYyIKKyNlbmRpZgorfQorCisvLyAzeDMgc2VhcmNoCitzdGF0aWMgaW5saW5lIGludCBTRUFSQ0hfRUZGT1JUX0ZVTkMoOSkKK3sKKyNpZmRlZiBJU19DCisjZGVmaW5lIFNLSVBfU0VBUkNICisjaW5jbHVkZSAiU2VhcmNoTG9vcFRvcC5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcEJvdHRvbS5pbmMiCisjdW5kZWYgU0tJUF9TRUFSQ0gKKyNlbHNlCisJCS8vc2VlIFNlYXJjaEVmZm9ydE1heCgpIGZvciBjb21tZW50cworI2luY2x1ZGUgIlNlYXJjaExvb3BUb3AuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BPZGRBLmluYyIKKwlSRVNFVF9DSFJPTUEJCQkvLyBwcmV0ZW5kIGNocm9tYSBkaWZmcyB3YXMgMjU1IGVhY2gKKyNpbmNsdWRlICJTZWFyY2hMb29wVkEuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3AwQS5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcEJvdHRvbS5pbmMiCisjZW5kaWYKK30KKworLy8gU2VhcmNoIDkgd2l0aCAyIEgtaGFsZiBwZWxzIGFkZGVkCitzdGF0aWMgaW5saW5lIGludCBTRUFSQ0hfRUZGT1JUX0ZVTkMoMTEpCit7CisjaWZkZWYgSVNfQworI2RlZmluZSBTS0lQX1NFQVJDSAorI2luY2x1ZGUgIlNlYXJjaExvb3BUb3AuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BCb3R0b20uaW5jIgorI3VuZGVmIFNLSVBfU0VBUkNICisjZWxzZQorCQkvL3NlZSBTZWFyY2hFZmZvcnRNYXgoKSBmb3IgY29tbWVudHMKKyNpbmNsdWRlICJTZWFyY2hMb29wVG9wLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wT2RkQS5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcE9kZEFIMi5pbmMiCisJUkVTRVRfQ0hST01BCQkJLy8gcHJldGVuZCBjaHJvbWEgZGlmZnMgd2FzIDI1NSBlYWNoCisjaW5jbHVkZSAiU2VhcmNoTG9vcFZBLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wMEEuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BCb3R0b20uaW5jIgorI2VuZGlmCit9CisKKy8vIFNlYXJjaCAxMSB3aXRoIDIgVi1oYWxmIHBlbHMgYWRkZWQKK3N0YXRpYyBpbmxpbmUgaW50IFNFQVJDSF9FRkZPUlRfRlVOQygxMykKK3sKKyNpZmRlZiBJU19DCisjZGVmaW5lIFNLSVBfU0VBUkNICisjaW5jbHVkZSAiU2VhcmNoTG9vcFRvcC5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcEJvdHRvbS5pbmMiCisjdW5kZWYgU0tJUF9TRUFSQ0gKKyNlbHNlCisJCS8vc2VlIFNlYXJjaEVmZm9ydE1heCgpIGZvciBjb21tZW50cworI2luY2x1ZGUgIlNlYXJjaExvb3BUb3AuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BPZGRBLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wT2RkQUgyLmluYyIKKwlSRVNFVF9DSFJPTUEJCQkvLyBwcmV0ZW5kIGNocm9tYSBkaWZmcyB3YXMgMjU1IGVhY2gKKyNpbmNsdWRlICJTZWFyY2hMb29wVkFILmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wVkEuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3AwQS5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcEJvdHRvbS5pbmMiCisjZW5kaWYKK30KKworLy8gNXgzCitzdGF0aWMgaW5saW5lIGludCBTRUFSQ0hfRUZGT1JUX0ZVTkMoMTUpCit7CisjaWZkZWYgSVNfQworI2RlZmluZSBTS0lQX1NFQVJDSAorI2luY2x1ZGUgIlNlYXJjaExvb3BUb3AuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BCb3R0b20uaW5jIgorI3VuZGVmIFNLSVBfU0VBUkNICisjZWxzZQorCQkvL3NlZSBTZWFyY2hFZmZvcnRNYXgoKSBmb3IgY29tbWVudHMKKyNpbmNsdWRlICJTZWFyY2hMb29wVG9wLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wT2RkQS5pbmMiCisJUkVTRVRfQ0hST01BCQkJLy8gcHJldGVuZCBjaHJvbWEgZGlmZnMgd2FzIDI1NSBlYWNoCisjaW5jbHVkZSAiU2VhcmNoTG9vcEVkZ2VBLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wVkEuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3AwQS5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcEJvdHRvbS5pbmMiCisjZW5kaWYKK30KKworLy8gNXgzICsgNCBoYWxmIHBlbHMKK3N0YXRpYyBpbmxpbmUgaW50IFNFQVJDSF9FRkZPUlRfRlVOQygxOSkKK3sKKyNpZmRlZiBJU19DCisjZGVmaW5lIFNLSVBfU0VBUkNICisjaW5jbHVkZSAiU2VhcmNoTG9vcFRvcC5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcEJvdHRvbS5pbmMiCisjdW5kZWYgU0tJUF9TRUFSQ0gKKyNlbHNlCisJCS8vc2VlIFNlYXJjaEVmZm9ydE1heCgpIGZvciBjb21tZW50cworI2luY2x1ZGUgIlNlYXJjaExvb3BUb3AuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BPZGRBLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wT2RkQUgyLmluYyIKKwlSRVNFVF9DSFJPTUEJCQkvLyBwcmV0ZW5kIGNocm9tYSBkaWZmcyB3YXMgMjU1IGVhY2gKKyNpbmNsdWRlICJTZWFyY2hMb29wRWRnZUEuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BWQUguaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BWQS5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcDBBLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wQm90dG9tLmluYyIKKyNlbmRpZgorfQorCisvLyBIYW5kbGUgb25lIDR4MSBibG9jayBvZiBwaXhlbHMKKy8vIFNlYXJjaCBhIDd4MyBhcmVhLCBubyBoYWxmIHBlbHMKKworc3RhdGljIGlubGluZSBpbnQgU0VBUkNIX0VGRk9SVF9GVU5DKDIxKQoreworI2lmZGVmIElTX0MKKyNkZWZpbmUgU0tJUF9TRUFSQ0gKKyNpbmNsdWRlICJTZWFyY2hMb29wVG9wLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wQm90dG9tLmluYyIKKyN1bmRlZiBTS0lQX1NFQVJDSAorI2Vsc2UKKwkJLy9zZWUgU2VhcmNoTG9vcFRvcC5pbmMgZm9yIGNvbW1lbnRzCisjaW5jbHVkZSAiU2VhcmNoTG9vcFRvcC5pbmMiCisKKwkJLy8gb2RkIGFkZHJlc3NlcyAtLSB0aGUgcGl4ZWxzIGF0IG9kZCBhZGRyZXNzIHdvdWxkbid0IGdlbmVyYXRlCisJCS8vIGdvb2QgbHVtYSB2YWx1ZXMgYnV0IHdlIHdpbGwgbWFzayB0aG9zZSBvZmYKKworI2luY2x1ZGUgIlNlYXJjaExvb3BPZGRBNi5pbmMiICAvLyA0IG9kZCB2IGhhbGYgcGVscywgMyB0byBsZWZ0ICYgcmlnaHQKKyNpbmNsdWRlICJTZWFyY2hMb29wT2RkQS5pbmMiICAgLy8gNiBvZGQgcGVscywgMSB0byBsZWZ0ICYgcmlnaHQKKworCVJFU0VUX0NIUk9NQQkJLy8gcHJldGVuZCBjaHJvbWEgZGlmZnMgd2FzIDI1NSBlYWNoCisKKwkJLy8gZXZlbiBhZGRyZXNzZXMgLS0gdXNlIGJvdGggbHVtYSBhbmQgY2hyb21hIGZyb20gdGhlc2UKKwkJLy8gc2VhcmNoIGF2ZXJhZ2VzIG9mIDIgcGl4ZWxzIGxlZnQgYW5kIHJpZ2h0CisjaW5jbHVkZSAiU2VhcmNoTG9vcEVkZ2VBLmluYyIKKwkJLy8gc2VhcmNoIHZlcnRpY2FsIGxpbmUgYW5kIGF2ZXJhZ2VzLCAtMSwwLCsxCisjaW5jbHVkZSAiU2VhcmNoTG9vcFZBLmluYyIKKwkJLy8gYmxlbmQgb3VyIHJlc3VsdHMgYW5kIGxvb3AKKyNpbmNsdWRlICJTZWFyY2hMb29wMEEuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BCb3R0b20uaW5jIgorI2VuZGlmCit9CisKKy8vIEhhbmRsZSBvbmUgNHgxIGJsb2NrIG9mIHBpeGVscworLy8gU2VhcmNoIGEgOXgzIGFyZWEsIG5vIGhhbGYgcGVscworc3RhdGljIGlubGluZSBpbnQgU0VBUkNIX0VGRk9SVF9GVU5DKE1heCkKK3sKKyNpZmRlZiBJU19DCisjZGVmaW5lIFNLSVBfU0VBUkNICisjaW5jbHVkZSAiU2VhcmNoTG9vcFRvcC5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcEJvdHRvbS5pbmMiCisjdW5kZWYgU0tJUF9TRUFSQ0gKKyNlbHNlCisJCS8vc2VlIFNlYXJjaExvb3BUb3AuaW5jIGZvciBjb21tZW50cworI2luY2x1ZGUgIlNlYXJjaExvb3BUb3AuaW5jIgorCisJCS8vIG9kZCBhZGRyZXNzZXMgLS0gdGhlIHBpeGVscyBhdCBvZGQgYWRkcmVzcyB3b3VsZG4ndCBnZW5lcmF0ZQorCQkvLyBnb29kIGx1bWEgdmFsdWVzIGJ1dCB3ZSB3aWxsIG1hc2sgdGhvc2Ugb2ZmCisKKyNpbmNsdWRlICJTZWFyY2hMb29wT2RkQTYuaW5jIiAgLy8gNCBvZGQgdiBoYWxmIHBlbHMsIDMgdG8gbGVmdCAmIHJpZ2h0CisjaW5jbHVkZSAiU2VhcmNoTG9vcE9kZEEuaW5jIiAgIC8vIDYgb2RkIHBlbHMsIDEgdG8gbGVmdCAmIHJpZ2h0CisKKwlSRVNFVF9DSFJPTUEJCS8vIHByZXRlbmQgY2hyb21hIGRpZmZzIHdhcyAyNTUgZWFjaAorCisJCS8vIGV2ZW4gYWRkcmVzc2VzIC0tIHVzZSBib3RoIGx1bWEgYW5kIGNocm9tYSBmcm9tIHRoZXNlCisJCS8vIHNlYXJjaCBhdmVyYWdlcyBvZiA0IHBpeGVscyBsZWZ0IGFuZCByaWdodAorI2luY2x1ZGUgIlNlYXJjaExvb3BFZGdlQTguaW5jIgorCQkvLyBzZWFyY2ggYXZlcmFnZXMgb2YgMiBwaXhlbHMgbGVmdCBhbmQgcmlnaHQKKyNpbmNsdWRlICJTZWFyY2hMb29wRWRnZUEuaW5jIgorCQkvLyBzZWFyY2ggdmVydGljYWwgbGluZSBhbmQgYXZlcmFnZXMsIC0xLDAsKzEKKyNpbmNsdWRlICJTZWFyY2hMb29wVkEuaW5jIgorCQkvLyBibGVuZCBvdXIgcmVzdWx0cyBhbmQgbG9vcAorI2luY2x1ZGUgIlNlYXJjaExvb3AwQS5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcEJvdHRvbS5pbmMiCisjZW5kaWYKK30KKworI3VuZGVmIFNFQVJDSF9FRkZPUlRfRlVOQworCmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvV2llcmRCb2IuaW5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1dpZXJkQm9iLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGJiYjgzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1dpZXJkQm9iLmluYwpAQCAtMCwwICsxLDI4NiBAQAorLy8gLSotIGMrKyAtKi0KKworCQkvLyBGaXJzdCwgZ2V0IGFuZCBzYXZlIG91ciBwb3NzaWJsZSBCb2IgdmFsdWVzCisJCS8vIEFzc3VtZSBvdXIgcGl4ZWxzIGFyZSBsYXllZCBvdXQgYXMgZm9sbG93cyB3aXRoIHggdGhlIGNhbGMnZCBib2IgdmFsdWUKKwkJLy8gYW5kIHRoZSBvdGhlciBwaXhlbHMgYXJlIGZyb20gdGhlIGN1cnJlbnQgZmllbGQKKwkJLy8gIAorCQkvLyAgICAgICAgaiBhIGIgYyBrCQljdXJyZW50IGZpZWxkCisJCS8vICAgICAgICAgICAgeAkJCWNhbGN1bGF0ZWQgbGluZQorCQkvLyAgICAgICAgbSBkIGUgZiBuCQljdXJyZW50IGZpZWxkCisJCS8vCisJCS8vIHdlIGNhbGMgdGhlIGJvYiB2YWx1ZSBhczoKKwkJLy8JCXgyID0gZWl0aGVyIGF2ZyhhLGYpLCBhdmcoYyxkKSwgYXZnKGIsZSksIGF2ZyhqLG4pLCBvciBhdmcoayxtKQorCQkgCisJCS8vIHNlbGVjdGVkIGZvciB0aGUJc21hbGxlc3Qgb2YgYWJzKGEsZiksIGFicyhjLGQpLCBvciBhYnMoYixlKSwgZXRjLgorCisjaWZuZGVmIElTX0MKKwkJLy8gYSxmCisJCSJtb3ZxICAgIC0yKCUlIlhCWCIpLCAlJW1tMFxuXHQiCQkvLyB2YWx1ZSBhIGZyb20gdG9wIGxlZnQJCQorCQkibW92cSAgICAyKCUlIlhCWCIsICUlIlhDWCIpLCAlJW1tMVxuXHQiCS8vIHZhbHVlIGYgZnJvbSBib3R0b20gcmlnaHQJCQkKKwkJIm1vdnEJJSVtbTAsICUlbW02XG5cdCIJCQkJCQorLy8JCXBhdmdiCSUlbW02LCAlJW1tMQkJCQkJLy8gYXZnKGEsZiksIGFsc28gYmVzdCBzbyBmYXIKKwkJVl9QQVZHQiAoIiUlbW02IiwgIiUlbW0xIiwgIiUlbW03IiwgX1NoaWZ0TWFzaykJLy8gYXZnKGEsZiksIGFsc28gYmVzdCBzbyBmYXIKKyAgICAgICAgIm1vdnEJJSVtbTAsICUlbW03XG5cdCIKKwkJInBzdWJ1c2IJICUlbW0xLCAlJW1tN1xuXHQiCisJCSJwc3VidXNiICUlbW0wLCAlJW1tMVxuXHQiCisJCSJwb3IJCSUlbW0xLCAlJW1tN1xuXHQiCQkJCQkvLyBhYnMgZGlmZiwgYWxzbyBiZXN0IHNvIGZhcgorCisJCS8vIGMsZAorCQkibW92cSAgICAyKCUlIlhCWCIpLCAlJW1tMFxuXHQiCQkvLyB2YWx1ZSBhIGZyb20gdG9wIGxlZnQJCQorCQkibW92cSAgICAtMiglJSJYQlgiLCAlJSJYQ1giKSwgJSVtbTFcblx0IgkvLyB2YWx1ZSBmIGZyb20gYm90dG9tIHJpZ2h0CQkJCisJCSJtb3ZxCSUlbW0wLCAlJW1tMlxuXHQiCQkJCQkJCisvLwkJcGF2Z2IJJSVtbTIsICUlbW0xCQkJCQkvLyBhdmcoYyxkKQorCQlWX1BBVkdCICgiJSVtbTIiLCAiJSVtbTEiLCAiJSVtbTMiLCBfU2hpZnRNYXNrKQkvLyBhdmcoYyxkKQorICAgICAgICAibW92cQklJW1tMCwgJSVtbTNcblx0IgorCQkicHN1YnVzYgklJW1tMSwgJSVtbTNcblx0IgorCQkicHN1YnVzYiAlJW1tMCwgJSVtbTFcblx0IgorCQkicG9yCQklJW1tMSwgJSVtbTNcblx0IgkJCQkJLy8gYWJzKGMsZCkKKwkJIm1vdnEJJSVtbTMsICUlbW0xXG5cdCIJCQkJCS8vIGtlZXAgY29weQorCisJCSJwc3VidXNiICUlbW03LCAlJW1tM1xuXHQiCQkJLy8gbm9uemVybyB3aGVyZSBuZXcgd2VpZ2h0cyBiaWdnZXIsIGVsc2UgMAorCQkicHhvcgklJW1tNCwgJSVtbTRcblx0IgorCQkicGNtcGVxYiAlJW1tNCwgJSVtbTNcblx0IgkJCS8vIG5vdyBmZiB3aGVyZSBuZXcgYmV0dGVyLCBlbHNlIDAwCQorCQkicGNtcGVxYgklJW1tMywgJSVtbTRcblx0IgkJCS8vIGhlcmUgZmYgd2hlcmUgb2xkIGJldHRlciwgZWxzZSAwMAorCisJCSJwYW5kCSUlbW0zLCAlJW1tMVxuXHQiCQkJLy8ga2VlcCBvbmx5IGJldHRlciBuZXcgYXZnIGFuZCBhYnMKKwkJInBhbmQJJSVtbTMsICUlbW0yXG5cdCIKKworCQkicGFuZAklJW1tNCwgJSVtbTZcblx0IgorCQkicGFuZCAgICAlJW1tNCwgJSVtbTdcblx0IgorCisJCSJwb3IJCSUlbW0yLCAlJW1tNlxuXHQiCQkJLy8gYW5kIG1lcmdlIG5ldyAmIG9sZCB2YWxzIGtlZXBpbmcgYmVzdAorCQkicG9yCQklJW1tMSwgJSVtbTdcblx0IgorCQkicG9yCQkiX1VWTWFzayIsICUlbW03XG5cdCIJCQkvLyBidXQgd2Uga25vdyBjaHJvbWEgaXMgd29ydGhsZXNzIHNvIGZhcgorCQkicGFuZAkiX1lNYXNrIiwgJSVtbTVcblx0IgkJCS8vIG1hc2sgb3V0IGNocm9tYSBmcm9tIGhlcmUgYWxzbworCisJCS8vIGosbgorCQkibW92cSAgICAtNCglJSJYQlgiKSwgJSVtbTBcblx0IgkJLy8gdmFsdWUgaiBmcm9tIHRvcCBsZWZ0CQkKKwkJIm1vdnEgICAgNCglJSJYQlgiLCAlJSJYQ1giKSwgJSVtbTFcblx0IgkvLyB2YWx1ZSBuIGZyb20gYm90dG9tIHJpZ2h0CQkJCisJCSJtb3ZxCSUlbW0wLCAlJW1tMlxuXHQiCQkJCQkJCisvLwkJcGF2Z2IJJSVtbTIsICUlbW0xCQkJCQkvLyBhdmcoaixuKQorCQlWX1BBVkdCICgiJSVtbTIiLCAiJSVtbTEiLCAiJSVtbTMiLCBfU2hpZnRNYXNrKQkvLyBhdmcoaixuKQorICAgICAgICAibW92cQklJW1tMCwgJSVtbTNcblx0IgorCQkicHN1YnVzYgklJW1tMSwgJSVtbTNcblx0IgorCQkicHN1YnVzYiAlJW1tMCwgJSVtbTFcblx0IgorCQkicG9yCQklJW1tMSwgJSVtbTNcblx0IgkJCQkJLy8gYWJzKGotbikKKwkJIm1vdnEJJSVtbTMsICUlbW0xXG5cdCIJCQkJCS8vIGtlZXAgY29weQorCisJCSJwc3VidXNiICUlbW03LCAlJW1tM1xuXHQiCQkJLy8gbm9uemVybyB3aGVyZSBuZXcgd2VpZ2h0cyBiaWdnZXIsIGVsc2UgMAorCQkicHhvcgklJW1tNCwgJSVtbTRcblx0IgorCQkicGNtcGVxYiAlJW1tNCwgJSVtbTNcblx0IgkJCS8vIG5vdyBmZiB3aGVyZSBuZXcgYmV0dGVyLCBlbHNlIDAwCQorCQkicGNtcGVxYgklJW1tMywgJSVtbTRcblx0IgkJCS8vIGhlcmUgZmYgd2hlcmUgb2xkIGJldHRlciwgZWxzZSAwMAorCisJCSJwYW5kCSUlbW0zLCAlJW1tMVxuXHQiCQkJLy8ga2VlcCBvbmx5IGJldHRlciBuZXcgYXZnIGFuZCBhYnMKKwkJInBhbmQJJSVtbTIsICUlbW0zXG5cdCIKKworCQkicGFuZAklJW1tNCwgJSVtbTZcblx0IgorCQkicGFuZCAgICAlJW1tNCwgJSVtbTdcblx0IgorCisJCSJwb3IJCSUlbW0zLCAlJW1tNlxuXHQiCQkJLy8gYW5kIG1lcmdlIG5ldyAmIG9sZCB2YWxzIGtlZXBpbmcgYmVzdAorCQkicG9yCQklJW1tMSwgJSVtbTdcblx0IgkJCS8vICIKKworCQkvLyBrLCBtCisJCSJtb3ZxICAgIDQoJSUiWEJYIiksICUlbW0wXG5cdCIJCS8vIHZhbHVlIGsgZnJvbSB0b3AgcmlnaHQJCQorCQkibW92cSAgICAtNCglJSJYQlgiLCAlJSJYQ1giKSwgJSVtbTFcblx0IgkvLyB2YWx1ZSBuIGZyb20gYm90dG9tIGxlZnQJCQkKKwkJIm1vdnEJJSVtbTAsICUlbW00XG5cdCIJCQkJCQkKKy8vCQlwYXZnYgklJW1tNCwgJSVtbTEJCQkJCS8vIGF2ZyhrLG0pCisJCVZfUEFWR0IgKCIlJW1tNCIsICIlJW1tMSIsICIlJW1tMyIsIF9TaGlmdE1hc2spCS8vIGF2ZyhrLG0pCisKKyAgICAgICAgIm1vdnEJJSVtbTAsICUlbW0zXG5cdCIKKwkJInBzdWJ1c2IJJSVtbTEsICUlbW0zXG5cdCIKKwkJInBzdWJ1c2IgJSVtbTAsICUlbW0xXG5cdCIKKwkJInBvcgkJJSVtbTEsICUlbW0zXG5cdCIJCQkJCS8vIGFicyhrLG0pCisJCSJtb3ZxCSUlbW0zLCAlJW1tMVxuXHQiCQkJCQkvLyBrZWVwIGNvcHkKKyAgICAgICAgICAgIAorCQkibW92cQklJW1tNCwgJSVtbTJcblx0IgkJCS8vIGF2ZyhrLG0pCisKKwkJInBzdWJ1c2IgJSVtbTcsICUlbW0zXG5cdCIJCQkvLyBub256ZXJvIHdoZXJlIG5ldyB3ZWlnaHRzIGJpZ2dlciwgZWxzZSAwCisJCSJweG9yCSUlbW00LCAlJW1tNFxuXHQiCisJCSJwY21wZXFiICUlbW00LCAlJW1tM1xuXHQiCQkJLy8gbm93IGZmIHdoZXJlIG5ldyBiZXR0ZXIsIGVsc2UgMDAJCisJCSJwY21wZXFiCSUlbW0zLCAlJW1tNFxuXHQiCQkJLy8gaGVyZSBmZiB3aGVyZSBvbGQgYmV0dGVyLCBlbHNlIDAwCisKKwkJInBhbmQJJSVtbTMsICUlbW0xXG5cdCIJCQkvLyBrZWVwIG9ubHkgYmV0dGVyIG5ldyBhdmcgYW5kIGFicworCQkicGFuZAklJW1tMiwgJSVtbTNcblx0IgorICAgICAgICAgICAgCisJCSJwYW5kCSUlbW00LCAlJW1tNlxuXHQiCisJCSJwYW5kICAgICUlbW00LCAlJW1tN1xuXHQiCisKKwkJInBvcgkJJSVtbTMsICUlbW02XG5cdCIJCQkvLyBhbmQgbWVyZ2UgbmV3ICYgb2xkIHZhbHMga2VlcGluZyBiZXN0CisJCSJwb3IJCSUlbW0xLCAlJW1tN1xuXHQiCQkJLy8gIgorCisJCS8vIGIsZQorCQkibW92cSAgICAoJSUiWEJYIiksICUlbW0wXG5cdCIJCS8vIHZhbHVlIGIgZnJvbSB0b3AgCQkKKwkJIm1vdnEgICAgKCUlIlhCWCIsICUlIlhDWCIpLCAlJW1tMVxuXHQiCS8vIHZhbHVlIGUgZnJvbSBib3R0b20gCisKKy8vIFdlIHdpbGwgYWxzbyBjYWxjIGhlcmUgdGhlIG1heC9taW4gdmFsdWVzIHRvIGxhdGVyIGxpbWl0IGNvbWIKKy8vIHNvIHRoZSBtYXggZXhjdXJzaW9uIHdpbGwgbm90IGV4Y2VlZCB0aGUgTWF4X0NvbWIgY29uc3RhbnQKKworI2lmZGVmIFNLSVBfU0VBUkNICQkKKwkJIm1vdnEJJSVtbTAsICUlbW0yXG5cdCIKKy8vCQlwbWludWIJJSVtbTIsICUlbW0xCisJCVZfUE1JTlVCICgiJSVtbTIiLCAiJSVtbTEiLCAiJSVtbTQiKQorCisvLwkJcG1heHViCSUlbW02LCAlJW1tMgkJCS8vIGNsaXAgb3VyIGN1cnJlbnQgcmVzdWx0cyBzbyBmYXIgdG8gYmUgYWJvdmUgdGhpcworCQlWX1BNQVhVQiAoIiUlbW02IiwgIiUlbW0yIikKKwkJIm1vdnEJJSVtbTAsICUlbW0yXG5cdCIKKwkJVl9QTUFYVUIgKCIlJW1tMiIsICIlJW1tMSIpCisvLwkJcG1pbnViCSUlbW02LCAlJW1tMgkJCS8vIGNsaXAgb3VyIGN1cnJlbnQgcmVzdWx0cyBzbyBmYXIgdG8gYmUgYmVsb3cgdGhpcworCQlWX1BNSU5VQiAoIiUlbW02IiwgIiUlbW0yIiwgIiUlbW00IikKKworI2Vsc2UKKyAgICAgICAgIm1vdnEJJSVtbTAsICUlbW0yXG5cdCIKKwkJIm1vdnEJKCUlIlhBWCIpLCAlJW1tNFxuXHQiCisJCSJwc3VidXNiICUlbW00LCAlJW1tMlxuXHQiCisJCSJwc3VidXNiICUlbW0wLCAlJW1tNFxuXHQiCisJCSJwb3IJCSUlbW0yLCAlJW1tNFxuXHQiCQkJLy8gYWJzIGRpZmYKKwkJCisJCSJtb3ZxCSUlbW0xLCAlJW1tMlxuXHQiCisJCSJtb3ZxCSglJSJYQVgiLCAlJSJYQ1giKSwgJSVtbTNcblx0IgorCQkicHN1YnVzYiAlJW1tMywgJSVtbTJcblx0IgorCQkicHN1YnVzYiAlJW1tMSwgJSVtbTNcblx0IgorCQkicG9yCQklJW1tMiwgJSVtbTNcblx0IgkJCS8vIGFicyBkaWZmCisvLwkJcG1heHViICAlJW1tMywgJSVtbTQJCQkvLyB0b3Agb3IgYm90dG9tIHBpeGVsIG1vdmVkIG1vc3QKKwkJVl9QTUFYVUIgKCIlJW1tMyIsICIlJW1tNCIpCQkJLy8gdG9wIG9yIGJvdHRvbSBwaXhlbCBtb3ZlZCBtb3N0CisgICAgICAgICJwc3VidXNiICJfTWF4X01vdiIsICUlbW0zXG5cdCIJCS8vIG1vdmVkIG1vcmUgdGhhbiBhbGxvd2VkPyBvciBnb2VzIHRvIDA/CisJCSJweG9yCSUlbW00LCAlJW1tNFxuXHQiCisJCSJwY21wZXFiICUlbW00LCAlJW1tM1xuXHQiCQkJLy8gbm93IGZmIHdoZXJlIGxvdyBtb3Rpb24sIGVsc2UgaGlnaCBtb3Rpb24KKwkJCisJCSJtb3ZxCSUlbW0wLCAlJW1tMlxuXHQiCisvLwkJcG1pbnViCSUlbW0yLCAlJW1tMQorCQlWX1BNSU5VQiAoIiUlbW0yIiwgIiUlbW0xIiwgIiUlbW00IikKKworLy8JCXBtYXh1YgklJW1tNiwgJSVtbTIJCQkvLyBjbGlwIG91ciBjdXJyZW50IHJlc3VsdHMgc28gZmFyIHRvIGJlIGFib3ZlIHRoaXMKKwkJVl9QTUFYVUIgKCIlJW1tNiIsICIlJW1tMiIpCisKKwkJInBzdWJ1c2IgJSVtbTMsICUlbW0yXG5cdCIJCQkvLyBtYXliZSBkZWNyZWFzZSBpdCB0byAwMDAwLi4gaWYgbm8gc3Vycm91bmQgbW90aW9uCisJCSJtb3ZxCSUlbW0yLCAiX01pbl9WYWxzIlxuXHQiCisKKwkJIm1vdnEJJSVtbTAsICUlbW0yXG5cdCIKKwkJVl9QTUFYVUIgKCIlJW1tMiIsICIlJW1tMSIpCisvLwkJcG1pbnViCSUlbW02LCAlJW1tMgkJCS8vIGNsaXAgb3VyIGN1cnJlbnQgcmVzdWx0cyBzbyBmYXIgdG8gYmUgYmVsb3cgdGhpcworCQlWX1BNSU5VQiAoIiUlbW02IiwgIiUlbW0yIiwgIiUlbW00IikKKyAgICAgICAgInBhZGR1c2IgJSVtbTMsICUlbW0yXG5cdCIJCQkvLyBtYXliZSBpbmNyZWFzZSBpdCB0byBmZmZmZmYgaWYgbm8gc3Vycm91bmQgbW90aW9uCisJCSJtb3ZxCSUlbW0yLCAiX01heF9WYWxzIlxuXHQiCisjZW5kaWYKKyAgICAgICAgCisJCSJtb3ZxCSUlbW0wLCAlJW1tMlxuXHQiCQkJCQkJCisvLwkJcGF2Z2IJJSVtbTIsICUlbW0xCQkJCQkvLyBhdmcoYixlKQorCQlWX1BBVkdCICgiJSVtbTIiLCAiJSVtbTEiLCAiJSVtbTMiLCBfU2hpZnRNYXNrKQkvLyBhdmcoYixlKQorCQkJCQorICAgICAgICAibW92cQklJW1tMCwgJSVtbTNcblx0IgorCQkicHN1YnVzYgklJW1tMSwgJSVtbTNcblx0IgorCQkicHN1YnVzYiAlJW1tMCwgJSVtbTFcblx0IgorCQkicG9yCQklJW1tMSwgJSVtbTNcblx0IgkJCS8vIGFicyhjLGQpCisJCSJtb3ZxCSUlbW0zLCAlJW1tMVxuXHQiCQkJLy8ga2VlcCBjb3B5IG9mIGRpZmZzCisKKwkJInB4b3IJJSVtbTQsICUlbW00XG5cdCIJCQkKKwkJInBzdWJ1c2IgJSVtbTcsICUlbW0zXG5cdCIJCQkvLyBub256ZXJvIHdoZXJlIG5ldyB3ZWlnaHRzIGJpZ2dlciwgZWxzZSAwCisJCSJwY21wZXFiICUlbW00LCAlJW1tM1xuXHQiCQkJLy8gbm93IGZmIHdoZXJlIG5ldyBiZXR0ZXIsIGVsc2UgMDAJCisKKwkJInBjbXBlcWIJJSVtbTMsICUlbW00XG5cdCIJCQkvLyBoZXJlIGZmIHdoZXJlIG9sZCBiZXR0ZXIsIGVsc2UgMDAKKworCQkicGFuZAklJW1tMywgJSVtbTFcblx0IgorCQkicGFuZAklJW1tMywgJSVtbTJcblx0IgorCisJCSJwYW5kICAgICUlbW00LCAlJW1tNlxuXHQiCisJCSJwYW5kICAgICUlbW00LCAlJW1tN1xuXHQiCisKKwkJInBvcgkJJSVtbTIsICUlbW02XG5cdCIJCQkvLyBvdXIgeDIgdmFsdWUKKwkJInBvcgkJJSVtbTEsICUlbW03XG5cdCIJCQkvLyBvdXIgeDIgZGlmZnMKKwkJIm1vdnEJJSVtbTcsICUlbW00XG5cdCIJCQkvLyBzYXZlIGFzIGJvYiB1bmNlcnRhaW50eSBpbmRpY2F0b3IKKworI2Vsc2UKKworICAgICAgICAvLyBhLGYKKyAgICAgICAgYmVzdFswXSA9IChwQm9iWy0yXSArIHBCb2Jbc3JjX3BpdGNoMiArIDJdKSAvIDI7CisJZGlmZlswXSA9IEFCUyAocEJvYlstMl0gLSBwQm9iW3NyY19waXRjaDIgKyAyXSk7CisgICAgICAgIGJlc3RbMV0gPSAocEJvYlstMV0gKyBwQm9iW3NyY19waXRjaDIgKyAzXSkgLyAyOworCWRpZmZbMV0gPSBBQlMgKHBCb2JbLTFdIC0gcEJvYltzcmNfcGl0Y2gyICsgM10pOworCisgICAgICAgIC8vIGMsZAorCWlmIChBQlMgKHBCb2JbMl0gLSBwQm9iW3NyY19waXRjaDIgLSAyXSkgPCBkaWZmWzBdKSB7CisgICAgICAgICAgYmVzdFswXSA9IChwQm9iWzJdICsgcEJvYltzcmNfcGl0Y2gyIC0gMl0pIC8gMjsKKwkgIGRpZmZbMF0gPSBBQlMgKHBCb2JbMl0gLSBwQm9iW3NyY19waXRjaDIgLSAyXSk7CisJfQorCisJaWYgKEFCUyAocEJvYlszXSAtIHBCb2Jbc3JjX3BpdGNoMiAtIDFdKSA8IGRpZmZbMV0pIHsKKyAgICAgICAgICBiZXN0WzFdID0gKHBCb2JbM10gKyBwQm9iW3NyY19waXRjaDIgLSAxXSkgLyAyOworCSAgZGlmZlsxXSA9IEFCUyAocEJvYlszXSAtIHBCb2Jbc3JjX3BpdGNoMiAtIDFdKTsKKwl9CisKKwkvLyBqLG4KKwlpZiAoQUJTIChwQm9iWy00XSAtIHBCb2Jbc3JjX3BpdGNoMiArIDRdKSA8IGRpZmZbMF0pIHsKKyAgICAgICAgICBiZXN0WzBdID0gKHBCb2JbLTRdICsgcEJvYltzcmNfcGl0Y2gyICsgNF0pIC8gMjsKKwkgIGRpZmZbMF0gPSBBQlMgKHBCb2JbLTRdIC0gcEJvYltzcmNfcGl0Y2gyICsgNF0pOworCX0KKworCWlmIChBQlMgKHBCb2JbLTNdIC0gcEJvYltzcmNfcGl0Y2gyICsgNV0pIDwgZGlmZlsxXSkgeworICAgICAgICAgIGJlc3RbMV0gPSAocEJvYlstM10gKyBwQm9iW3NyY19waXRjaDIgKyA1XSkgLyAyOworCSAgZGlmZlsxXSA9IEFCUyAocEJvYlstM10gLSBwQm9iW3NyY19waXRjaDIgKyA1XSk7CisJfQorCisJLy8gayxtCisJaWYgKEFCUyAocEJvYls0XSAtIHBCb2Jbc3JjX3BpdGNoMiAtIDRdKSA8IGRpZmZbMF0pIHsKKyAgICAgICAgICBiZXN0WzBdID0gKHBCb2JbNF0gKyBwQm9iW3NyY19waXRjaDIgLSA0XSkgLyAyOworCSAgZGlmZlswXSA9IEFCUyAocEJvYlstNF0gLSBwQm9iW3NyY19waXRjaDIgLSA0XSk7CisJfQorCisJaWYgKEFCUyAocEJvYls1XSAtIHBCb2Jbc3JjX3BpdGNoMiAtIDNdKSA8IGRpZmZbMV0pIHsKKyAgICAgICAgICBiZXN0WzFdID0gKHBCb2JbNV0gKyBwQm9iW3NyY19waXRjaDIgLSAzXSkgLyAyOworCSAgZGlmZlsxXSA9IEFCUyAocEJvYlstM10gLSBwQm9iW3NyY19waXRjaDIgLSAzXSk7CisJfQorCS8vIGssbQorCWlmIChBQlMgKHBCb2JbNF0gLSBwQm9iW3NyY19waXRjaDIgLSA0XSkgPCBkaWZmWzBdKSB7CisgICAgICAgICAgYmVzdFswXSA9IChwQm9iWzRdICsgcEJvYltzcmNfcGl0Y2gyIC0gNF0pIC8gMjsKKwkgIGRpZmZbMF0gPSBBQlMgKHBCb2JbLTRdIC0gcEJvYltzcmNfcGl0Y2gyIC0gNF0pOworCX0KKwkKKwlpZiAoQUJTIChwQm9iWzVdIC0gcEJvYltzcmNfcGl0Y2gyIC0gM10pIDwgZGlmZlsxXSkgeworICAgICAgICAgIGJlc3RbMV0gPSAocEJvYls1XSArIHBCb2Jbc3JjX3BpdGNoMiAtIDNdKSAvIDI7CisJICBkaWZmWzFdID0gQUJTIChwQm9iWy0zXSAtIHBCb2Jbc3JjX3BpdGNoMiAtIDNdKTsKKwl9CisKKy8vIFdlIHdpbGwgYWxzbyBjYWxjIGhlcmUgdGhlIG1heC9taW4gdmFsdWVzIHRvIGxhdGVyIGxpbWl0IGNvbWIKKy8vIHNvIHRoZSBtYXggZXhjdXJzaW9uIHdpbGwgbm90IGV4Y2VlZCB0aGUgTWF4X0NvbWIgY29uc3RhbnQKKworI2lmZGVmIFNLSVBfU0VBUkNICisJCWJlc3RbMF0gPSBDTEFNUCAoYmVzdFswXSwgTUlOIChwQm9iW3NyY19waXRjaDJdLCBwQm9iWzBdKSwgTUFYIChwQm9iW3NyY19waXRjaDJdLCBwQm9iWzBdKSk7CisJCWJlc3RbMV0gPSBDTEFNUCAoYmVzdFsxXSwgTUlOIChwQm9iW3NyY19waXRjaDIgKyAxXSwgcEJvYlsxXSksIE1BWCAocEJvYltzcmNfcGl0Y2gyICsgMV0sIHBCb2JbMV0pKTsKKyNlbHNlCisJCW1vdlswXSA9IE1BWCAoQUJTIChwQm9iWzBdIC0gcEJvYlBbMF0pLCBBQlMgKHBCb2Jbc3JjX3BpdGNoMl0gLSBwQm9iUFtzcmNfcGl0Y2gyXSkpOworCQltb3ZbMV0gPSBNQVggKEFCUyAocEJvYlsxXSAtIHBCb2JQWzFdKSwgQUJTIChwQm9iW3NyY19waXRjaDIgKyAxXSAtIHBCb2JQW3NyY19waXRjaDIgKyAxXSkpOworCisJCU1pblZhbHNbMF0gPSAwOworCQlNaW5WYWxzWzFdID0gMDsKKwkJTWF4VmFsc1swXSA9IDI1NTsKKwkJTWF4VmFsc1sxXSA9IDI1NTsKKworCQlpZiAobW92WzBdID4gTWF4X01vdlswXSkgeworCQkgIE1pblZhbHNbMF0gPSBNQVggKE1JTiAocEJvYlswXSwgcEJvYltzcmNfcGl0Y2gyXSksIGJlc3RbMF0pOworCQkgIE1heFZhbHNbMF0gPSBNSU4gKE1BWCAocEJvYlswXSwgcEJvYltzcmNfcGl0Y2gyXSksIGJlc3RbMF0pOworCQl9CisJCQorCQlpZiAobW92WzFdID4gTWF4X01vdlsxXSkgeworCQkgIE1pblZhbHNbMV0gPSBNQVggKE1JTiAocEJvYlsxXSwgcEJvYltzcmNfcGl0Y2gyICsgMV0pLCBiZXN0WzFdKTsKKwkJICBNYXhWYWxzWzFdID0gTUlOIChNQVggKHBCb2JbMV0sIHBCb2Jbc3JjX3BpdGNoMiArIDFdKSwgYmVzdFsxXSk7CisJCX0KKworCQliZXN0WzBdID0gQ0xBTVAgKGJlc3RbMF0sIE1JTiAocEJvYltzcmNfcGl0Y2gyXSwgcEJvYlswXSksIE1BWCAocEJvYltzcmNfcGl0Y2gyXSwgcEJvYlswXSkpOworCQliZXN0WzFdID0gQ0xBTVAgKGJlc3RbMV0sIE1JTiAocEJvYltzcmNfcGl0Y2gyICsgMV0sIHBCb2JbMV0pLCBNQVggKHBCb2Jbc3JjX3BpdGNoMiArIDFdLCBwQm9iWzFdKSk7CisjZW5kaWYKKworCQlhdmdbMF0gPSAocEJvYltzcmNfcGl0Y2gyXSArIHBCb2JbMF0pIC8gMjsKKwkJYXZnWzFdID0gKHBCb2Jbc3JjX3BpdGNoMiArIDFdICsgcEJvYlsxXSkgLyAyOworCQlkaWZmMlswXSA9IEFCUyAocEJvYltzcmNfcGl0Y2gyXSAtIHBCb2JbMF0pOworCQlkaWZmMlsxXSA9IEFCUyAocEJvYltzcmNfcGl0Y2gyICsgMV0gLSBwQm9iWzFdKTsKKworCQlpZiAoZGlmZjJbMF0gPCBkaWZmWzBdKSB7CisJCSAgYmVzdFswXSA9IGF2Z1swXTsKKwkJICBkaWZmWzBdID0gZGlmZjJbMF07CisJCX0KKworCQlpZiAoZGlmZjJbMV0gPCBkaWZmWzFdKSB7CisJCSAgYmVzdFsxXSA9IGF2Z1sxXTsKKwkJICBkaWZmWzFdID0gZGlmZjJbMV07CisJCX0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL3RvbXNtb2NvbXBtYWNyb3MuaCBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC90b21zbW9jb21wbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U4MTQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC90b21zbW9jb21wbWFjcm9zLmgKQEAgLTAsMCArMSwxNjQgQEAKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKy8vIERlZmluZSBhIGZldyBtYWNyb3MgZm9yIENQVSBkZXBlbmRlbnQgaW5zdHJ1Y3Rpb25zLiAKKy8vIEkgc3VzcGVjdCBJIGRvbid0IHJlYWxseSB1bmRlcnN0YW5kIGhvdyB0aGUgQyBtYWNybyBwcmVwcm9jZXNzb3Igd29ya3MgYnV0CisvLyB0aGlzIHNlZW1zIHRvIGdldCB0aGUgam9iIGRvbmUuICAgICAgICAgIC8vIFRSQiA3LzAxCisKKy8vIEJFRk9SRSBVU0lORyBUSEVTRSBZT1UgTVVTVCBTRVQ6CisKKy8vICNkZWZpbmUgU0lNRF9UWVBFIE1NWEVYVCAgICAgICAgICAgIChvciBNTVggb3IgM0ROT1cpCisKKy8vIHNvbWUgbWFjcm9zIGZvciBwYXZnYiBpbnN0cnVjdGlvbgorLy8gICAgICBWX1BBVkdCKG1tcjEsIG1tcjIsIG1tciB3b3JrIHJlZ2lzdGVyLCBzbWFzaykgbW1yMiBtYXkgPSBtbXJ3IGlmIHlvdSBjYW4gdHJhc2ggaXQKKworI2RlZmluZSBWX1BBVkdCX01NWChtbXIxLCBtbXIyLCBtbXJ3LCBzbWFzaykgXAorCSJtb3ZxICAgICJtbXIyIiwgICJtbXJ3IlxuXHQiICAgICAgICAgICAgXAorCSJwYW5kICAgICJzbWFzayIsICJtbXJ3IlxuXHQiICAgICAgICAgICAgXAorCSJwc3JsdyAgICQxLCAgICAgICJtbXJ3IlxuXHQiICAgICAgICAgICAgXAorCSJwYW5kICAgICJzbWFzayIsICJtbXIxIlxuXHQiICAgICAgICAgICAgXAorCSJwc3JsdyAgICQxLCAgICAgICJtbXIxIlxuXHQiICAgICAgICAgICAgXAorCSJwYWRkdXNiICJtbXJ3IiwgICJtbXIxIlxuXHQiCisjZGVmaW5lIFZfUEFWR0JfTU1YRVhUKG1tcjEsIG1tcjIsIG1tcncsIHNtYXNrKSAgICAgICJwYXZnYiAgICJtbXIyIiwgIm1tcjEiXG5cdCIKKyNkZWZpbmUgVl9QQVZHQl8zRE5PVyhtbXIxLCBtbXIyLCBtbXJ3LCBzbWFzaykgICAgInBhdmd1c2IgIm1tcjIiLCAibW1yMSJcblx0IgorI2RlZmluZSBWX1BBVkdCKG1tcjEsIG1tcjIsIG1tcncsIHNtYXNrKSAgICAgICAgICBWX1BBVkdCMihtbXIxLCBtbXIyLCBtbXJ3LCBzbWFzaywgU0lNRF9UWVBFKSAKKyNkZWZpbmUgVl9QQVZHQjIobW1yMSwgbW1yMiwgbW1ydywgc21hc2ssIHNpbWRfdHlwZSkgVl9QQVZHQjMobW1yMSwgbW1yMiwgbW1ydywgc21hc2ssIHNpbWRfdHlwZSkgCisjZGVmaW5lIFZfUEFWR0IzKG1tcjEsIG1tcjIsIG1tcncsIHNtYXNrLCBzaW1kX3R5cGUpIFZfUEFWR0JfIyNzaW1kX3R5cGUobW1yMSwgbW1yMiwgbW1ydywgc21hc2spIAorCisvLyBzb21lIG1hY3JvcyBmb3IgcG1heHViIGluc3RydWN0aW9uCisjZGVmaW5lIFZfUE1BWFVCX01NWChtbXIxLCBtbXIyKSBcCisgICAgInBzdWJ1c2IgIm1tcjIiLCAibW1yMSJcblx0IiBcCisgICAgInBhZGR1c2IgIm1tcjIiLCAibW1yMSJcblx0IgorI2RlZmluZSBWX1BNQVhVQl9NTVhFWFQobW1yMSwgbW1yMikgICAgICAicG1heHViICJtbXIyIiwgIm1tcjEiXG5cdCIKKyNkZWZpbmUgVl9QTUFYVUJfM0ROT1cobW1yMSwgbW1yMikgICAgVl9QTUFYVUJfTU1YKG1tcjEsIG1tcjIpICAvLyB1c2UgTU1YIHZlcnNpb24KKyNkZWZpbmUgVl9QTUFYVUIobW1yMSwgbW1yMikgICAgICAgICAgVl9QTUFYVUIyKG1tcjEsIG1tcjIsIFNJTURfVFlQRSkgCisjZGVmaW5lIFZfUE1BWFVCMihtbXIxLCBtbXIyLCBzaW1kX3R5cGUpIFZfUE1BWFVCMyhtbXIxLCBtbXIyLCBzaW1kX3R5cGUpIAorI2RlZmluZSBWX1BNQVhVQjMobW1yMSwgbW1yMiwgc2ltZF90eXBlKSBWX1BNQVhVQl8jI3NpbWRfdHlwZShtbXIxLCBtbXIyKSAKKworLy8gc29tZSBtYWNyb3MgZm9yIHBtaW51YiBpbnN0cnVjdGlvbgorLy8gICAgICBWX1BNSU5VQihtbXIxLCBtbXIyLCBtbXIgd29yayByZWdpc3RlcikgICAgIG1tcjIgbWF5IE5PVCA9IG1tcncKKyNkZWZpbmUgVl9QTUlOVUJfTU1YKG1tcjEsIG1tcjIsIG1tcncpIFwKKyAgICAicGNtcGVxYiAibW1ydyIsICJtbXJ3IlxuXHQiICAgICAgIFwKKyAgICAicHN1YnVzYiAibW1yMiIsICJtbXJ3IlxuXHQiICAgICAgIFwKKyAgICAicGFkZHVzYiAibW1ydyIsICJtbXIxIlxuXHQiICAgICAgIFwKKyAgICAicHN1YnVzYiAibW1ydyIsICJtbXIxIlxuXHQiCisjZGVmaW5lIFZfUE1JTlVCX01NWEVYVChtbXIxLCBtbXIyLCBtbXJ3KSAgICAgICJwbWludWIgIm1tcjIiLCAibW1yMSJcblx0IgorI2RlZmluZSBWX1BNSU5VQl8zRE5PVyhtbXIxLCBtbXIyLCBtbXJ3KSAgICBWX1BNSU5VQl9NTVgobW1yMSwgbW1yMiwgbW1ydykgIC8vIHVzZSBNTVggdmVyc2lvbgorI2RlZmluZSBWX1BNSU5VQihtbXIxLCBtbXIyLCBtbXJ3KSAgICAgICAgICBWX1BNSU5VQjIobW1yMSwgbW1yMiwgbW1ydywgU0lNRF9UWVBFKSAKKyNkZWZpbmUgVl9QTUlOVUIyKG1tcjEsIG1tcjIsIG1tcncsIHNpbWRfdHlwZSkgVl9QTUlOVUIzKG1tcjEsIG1tcjIsIG1tcncsIHNpbWRfdHlwZSkgCisjZGVmaW5lIFZfUE1JTlVCMyhtbXIxLCBtbXIyLCBtbXJ3LCBzaW1kX3R5cGUpIFZfUE1JTlVCXyMjc2ltZF90eXBlKG1tcjEsIG1tcjIsIG1tcncpIAorCisvLyBzb21lIG1hY3JvcyBmb3IgbW92bnRxIGluc3RydWN0aW9uCisvLyAgICAgIFZfTU9WTlRRKG1tcjEsIG1tcjIpIAorI2RlZmluZSBWX01PVk5UUV9NTVgobW1yMSwgbW1yMikgICAgICAibW92cSAgICJtbXIyIiwgIm1tcjEiXG5cdCIKKyNkZWZpbmUgVl9NT1ZOVFFfM0ROT1cobW1yMSwgbW1yMikgICAgIm1vdnEgICAibW1yMiIsICJtbXIxIlxuXHQiCisjZGVmaW5lIFZfTU9WTlRRX01NWEVYVChtbXIxLCBtbXIyKSAgICAgICJtb3ZudHEgIm1tcjIiLCAibW1yMSJcblx0IgorI2RlZmluZSBWX01PVk5UUShtbXIxLCBtbXIyKSAgICAgICAgICBWX01PVk5UUTIobW1yMSwgbW1yMiwgU0lNRF9UWVBFKSAKKyNkZWZpbmUgVl9NT1ZOVFEyKG1tcjEsIG1tcjIsIHNpbWRfdHlwZSkgVl9NT1ZOVFEzKG1tcjEsIG1tcjIsIHNpbWRfdHlwZSkgCisjZGVmaW5lIFZfTU9WTlRRMyhtbXIxLCBtbXIyLCBzaW1kX3R5cGUpIFZfTU9WTlRRXyMjc2ltZF90eXBlKG1tcjEsIG1tcjIpCisKKy8vIGVuZCBvZiBtYWNyb3MKKworI2lmZGVmIElTX1NTRTIKKworI2RlZmluZSBNRVJHRTRQSVhhdmcoUEFERFIxLCBQQUREUjIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdmRxdSAgIlBBRERSMSIsICAgJSV4bW0wXG5cdCIgICAgICAgLyogb3VyIDQgcGl4ZWxzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92ZHF1ICAiUEFERFIyIiwgICAlJXhtbTFcblx0IiAgICAgICAvKiBvdXIgcGl4ZWwyIHZhbHVlICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZkcWEgICUleG1tMCwgICAgICUleG1tMlxuXHQiICAgICAgIC8qIGFub3RoZXIgY29weSBvZiBvdXIgcGl4ZWwxIHZhbHVlICovICAgICAgICBcCisgICAgIm1vdmRxYSAgJSV4bW0xLCAgICAgJSV4bW0zXG5cdCIgICAgICAgLyogYW5vdGhlciBjb3B5IG9mIG91ciBwaXhlbDEgdmFsdWUgKi8gICAgICAgIFwKKyAgICAicHN1YnVzYiAlJXhtbTEsICAgICAlJXhtbTJcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3VidXNiICUleG1tMCwgICAgICUleG1tM1xuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvciAgICAgJSV4bW0zLCAgICAgJSV4bW0yXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGF2Z2IgICAlJXhtbTEsICAgICAlJXhtbTBcblx0IiAgICAgICAvKiBhdmcgb2YgMiBwaXhlbHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZkcWEgICUleG1tMiwgICAgICUleG1tM1xuXHQiICAgICAgIC8qIGFub3RoZXIgY29weSBvZiBvdXIgb3VyIHdlaWdodHMgKi8gICAgICAgICBcCisgICAgInB4b3IgICAgJSV4bW0xLCAgICAgJSV4bW0xXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHN1YnVzYiAlJXhtbTcsICAgICAlJXhtbTNcblx0IiAgICAgICAvKiBub256ZXJvIHdoZXJlIG9sZCB3ZWlnaHRzIGxvd2VyLCBlbHNlIDAgKi8gXAorICAgICJwY21wZXFiICUleG1tMSwgICAgICUleG1tM1xuXHQiICAgICAgIC8qIG5vdyBmZiB3aGVyZSBuZXcgYmV0dGVyLCBlbHNlIDAwICovICAgICAgICBcCisgICAgInBjbXBlcWIgJSV4bW0zLCAgICAgJSV4bW0xXG5cdCIgICAgICAgLyogaGVyZSBmZiB3aGVyZSBvbGQgYmV0dGVyLCBlbHNlIDAwICovICAgICAgIFwKKyAgICAicGFuZCAgICAlJXhtbTMsICAgICAlJXhtbTBcblx0IiAgICAgICAvKiBrZWVwIG9ubHkgYmV0dGVyIG5ldyBwaXhlbHMgKi8gICAgICAgICAgICAgXAorICAgICJwYW5kICAgICUleG1tMywgICAgICUleG1tMlxuXHQiICAgICAgIC8qIGFuZCB3ZWlnaHRzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBhbmQgICAgJSV4bW0xLCAgICAgJSV4bW01XG5cdCIgICAgICAgLyoga2VlcCBvbmx5IGJldHRlciBvbGQgcGl4ZWxzICovICAgICAgICAgICAgIFwKKyAgICAicGFuZCAgICAlJXhtbTEsICAgICAlJXhtbTdcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3IgICAgICUleG1tMCwgICAgICUleG1tNVxuXHQiICAgICAgIC8qIGFuZCBtZXJnZSBuZXcgJiBvbGQgdmFscyAqLyAgICAgICAgICAgICAgICBcCisgICAgInBvciAgICAgJSV4bW0yLCAgICAgJSV4bW03XG5cdCIKKworI2RlZmluZSBNRVJHRTRQSVhhdmdIKFBBRERSMUEsIFBBRERSMUIsIFBBRERSMkEsIFBBRERSMkIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdmRxdSAgIlBBRERSMUEiLCAgICUleG1tMFxuXHQiICAgICAgLyogb3VyIDQgcGl4ZWxzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92ZHF1ICAiUEFERFIyQSIsICAgJSV4bW0xXG5cdCIgICAgICAvKiBvdXIgcGl4ZWwyIHZhbHVlICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZkcXUgICJQQUREUjFCIiwgICAlJXhtbTJcblx0IiAgICAgIC8qIG91ciA0IHBpeGVscyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdmRxdSAgIlBBRERSMkIiLCAgICUleG1tM1xuXHQiICAgICAgLyogb3VyIHBpeGVsMiB2YWx1ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGF2Z2IgICAlJXhtbTIsICAgICAgJSV4bW0wXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYXZnYiAgICUleG1tMywgICAgICAlJXhtbTFcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdmRxYSAgJSV4bW0wLCAgICAgICUleG1tMlxuXHQiICAgICAgLyogYW5vdGhlciBjb3B5IG9mIG91ciBwaXhlbDEgdmFsdWUgKi8gICAgICAgIFwKKyAgICAibW92ZHFhICAlJXhtbTEsICAgICAgJSV4bW0zXG5cdCIgICAgICAvKiBhbm90aGVyIGNvcHkgb2Ygb3VyIHBpeGVsMSB2YWx1ZSAqLyAgICAgICAgXAorICAgICJwc3VidXNiICUleG1tMSwgICAgICAlJXhtbTJcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBzdWJ1c2IgJSV4bW0wLCAgICAgICUleG1tM1xuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9yICAgICAlJXhtbTMsICAgICAgJSV4bW0yXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYXZnYiAgICUleG1tMSwgICAgICAlJXhtbTBcblx0IiAgICAgIC8qIGF2ZyBvZiAyIHBpeGVscyAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdmRxYSAgJSV4bW0yLCAgICAgICUleG1tM1xuXHQiICAgICAgLyogYW5vdGhlciBjb3B5IG9mIG91ciBvdXIgd2VpZ2h0cyAqLyAgICAgICAgIFwKKyAgICAicHhvciAgICAlJXhtbTEsICAgICAgJSV4bW0xXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3VidXNiICUleG1tNywgICAgICAlJXhtbTNcblx0IiAgICAgIC8qIG5vbnplcm8gd2hlcmUgb2xkIHdlaWdodHMgbG93ZXIsIGVsc2UgMCAqLyBcCisgICAgInBjbXBlcWIgJSV4bW0xLCAgICAgICUleG1tM1xuXHQiICAgICAgLyogbm93IGZmIHdoZXJlIG5ldyBiZXR0ZXIsIGVsc2UgMDAgKi8gICAgICAgIFwKKyAgICAicGNtcGVxYiAlJXhtbTMsICAgICAgJSV4bW0xXG5cdCIgICAgICAvKiBoZXJlIGZmIHdoZXJlIG9sZCBiZXR0ZXIsIGVsc2UgMDAgKi8gICAgICAgXAorICAgICJwYW5kICAgICUleG1tMywgICAgICAlJXhtbTBcblx0IiAgICAgIC8qIGtlZXAgb25seSBiZXR0ZXIgbmV3IHBpeGVscyAqLyAgICAgICAgICAgICBcCisgICAgInBhbmQgICAgJSV4bW0zLCAgICAgICUleG1tMlxuXHQiICAgICAgLyogYW5kIHdlaWdodHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFuZCAgICAlJXhtbTEsICAgICAgJSV4bW01XG5cdCIgICAgICAvKiBrZWVwIG9ubHkgYmV0dGVyIG9sZCBwaXhlbHMgKi8gICAgICAgICAgICAgXAorICAgICJwYW5kICAgICUleG1tMSwgICAgICAlJXhtbTdcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvciAgICAgJSV4bW0wLCAgICAgICUleG1tNVxuXHQiICAgICAgLyogYW5kIG1lcmdlIG5ldyAmIG9sZCB2YWxzICovICAgICAgICAgICAgICAgIFwKKyAgICAicG9yICAgICAlJXhtbTIsICAgICAgJSV4bW03XG5cdCIKKworI2RlZmluZSBSRVNFVF9DSFJPTUEgInBvciAiX1VWTWFzayIsICUleG1tN1xuXHQiCisKKyNlbHNlIC8vIGlmZGVmIElTX1NTRTIKKworI2RlZmluZSBNRVJHRTRQSVhhdmcoUEFERFIxLCBQQUREUjIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAgICAiUEFERFIxIiwgICAlJW1tMFxuXHQiICAgICAgIC8qIG91ciA0IHBpeGVscyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgIlBBRERSMiIsICAgJSVtbTFcblx0IiAgICAgICAvKiBvdXIgcGl4ZWwyIHZhbHVlICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICUlbW0wLCAgICAgICUlbW0yXG5cdCIgICAgICAgLyogYW5vdGhlciBjb3B5IG9mIG91ciBwaXhlbDEgdmFsdWUgKi8gICAgICAgIFwKKyAgICAibW92cSAgICAlJW1tMSwgICAgICAlJW1tM1xuXHQiICAgICAgIC8qIGFub3RoZXIgY29weSBvZiBvdXIgcGl4ZWwxIHZhbHVlICovICAgICAgICBcCisgICAgInBzdWJ1c2IgJSVtbTEsICAgICAgJSVtbTJcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3VidXNiICUlbW0wLCAgICAgICUlbW0zXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9yICAgICAlJW1tMywgICAgICAlJW1tMlxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVl9QQVZHQiAoIiUlbW0wIiwgIiUlbW0xIiwgIiUlbW0zIiwgX1NoaWZ0TWFzaykgLyogYXZnIG9mIDIgcGl4ZWxzICovICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICUlbW0yLCAgICAgICUlbW0zXG5cdCIgICAgICAgLyogYW5vdGhlciBjb3B5IG9mIG91ciBvdXIgd2VpZ2h0cyAqLyAgICAgICAgIFwKKyAgICAicHhvciAgICAlJW1tMSwgICAgICAlJW1tMVxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBzdWJ1c2IgJSVtbTcsICAgICAgJSVtbTNcblx0IiAgICAgICAvKiBub256ZXJvIHdoZXJlIG9sZCB3ZWlnaHRzIGxvd2VyLCBlbHNlIDAgKi8gXAorICAgICJwY21wZXFiICUlbW0xLCAgICAgICUlbW0zXG5cdCIgICAgICAgLyogbm93IGZmIHdoZXJlIG5ldyBiZXR0ZXIsIGVsc2UgMDAgKi8gICAgICAgIFwKKyAgICAicGNtcGVxYiAlJW1tMywgICAgICAlJW1tMVxuXHQiICAgICAgIC8qIGhlcmUgZmYgd2hlcmUgb2xkIGJldHRlciwgZWxzZSAwMCAqLyAgICAgICBcCisgICAgInBhbmQgICAgJSVtbTMsICAgICAgJSVtbTBcblx0IiAgICAgICAvKiBrZWVwIG9ubHkgYmV0dGVyIG5ldyBwaXhlbHMgKi8gICAgICAgICAgICAgXAorICAgICJwYW5kICAgICUlbW0zLCAgICAgICUlbW0yXG5cdCIgICAgICAgLyogYW5kIHdlaWdodHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFuZCAgICAlJW1tMSwgICAgICAlJW1tNVxuXHQiICAgICAgIC8qIGtlZXAgb25seSBiZXR0ZXIgb2xkIHBpeGVscyAqLyAgICAgICAgICAgICBcCisgICAgInBhbmQgICAgJSVtbTEsICAgICAgJSVtbTdcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3IgICAgICUlbW0wLCAgICAgICUlbW01XG5cdCIgICAgICAgLyogYW5kIG1lcmdlIG5ldyAmIG9sZCB2YWxzICovICAgICAgICAgICAgICAgIFwKKyAgICAicG9yICAgICAlJW1tMiwgICAgICAlJW1tN1xuXHQiCisKKyNkZWZpbmUgTUVSR0U0UElYYXZnSChQQUREUjFBLCBQQUREUjFCLCBQQUREUjJBLCBQQUREUjJCKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgIlBBRERSMUEiLCAgICUlbW0wXG5cdCIgICAgICAvKiBvdXIgNCBwaXhlbHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICJQQUREUjJBIiwgICAlJW1tMVxuXHQiICAgICAgLyogb3VyIHBpeGVsMiB2YWx1ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAgICAiUEFERFIxQiIsICAgJSVtbTJcblx0IiAgICAgIC8qIG91ciA0IHBpeGVscyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgIlBBRERSMkIiLCAgICUlbW0zXG5cdCIgICAgICAvKiBvdXIgcGl4ZWwyIHZhbHVlICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZfUEFWR0IoIiUlbW0wIiwgIiUlbW0yIiwgIiUlbW0yIiwgX1NoaWZ0TWFzaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWX1BBVkdCKCIlJW1tMSIsICIlJW1tMyIsICIlJW1tMyIsIF9TaGlmdE1hc2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgJSVtbTAsICAgICAgICUlbW0yXG5cdCIgICAgICAvKiBhbm90aGVyIGNvcHkgb2Ygb3VyIHBpeGVsMSB2YWx1ZSAqLyAgICAgICAgXAorICAgICJtb3ZxICAgICUlbW0xLCAgICAgICAlJW1tM1xuXHQiICAgICAgLyogYW5vdGhlciBjb3B5IG9mIG91ciBwaXhlbDEgdmFsdWUgKi8gICAgICAgIFwKKyAgICAicHN1YnVzYiAlJW1tMSwgICAgICAgJSVtbTJcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBzdWJ1c2IgJSVtbTAsICAgICAgICUlbW0zXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3IgICAgICUlbW0zLCAgICAgICAlJW1tMlxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWX1BBVkdCKCIlJW1tMCIsICIlJW1tMSIsICIlJW1tMyIsIF9TaGlmdE1hc2spICAgLyogYXZnIG9mIDIgcGl4ZWxzICovICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgJSVtbTIsICAgICAgICUlbW0zXG5cdCIgICAgICAvKiBhbm90aGVyIGNvcHkgb2Ygb3VyIG91ciB3ZWlnaHRzICovICAgICAgICAgXAorICAgICJweG9yICAgICUlbW0xLCAgICAgICAlJW1tMVxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHN1YnVzYiAlJW1tNywgICAgICAgJSVtbTNcblx0IiAgICAgIC8qIG5vbnplcm8gd2hlcmUgb2xkIHdlaWdodHMgbG93ZXIsIGVsc2UgMCAqLyBcCisgICAgInBjbXBlcWIgJSVtbTEsICAgICAgICUlbW0zXG5cdCIgICAgICAvKiBub3cgZmYgd2hlcmUgbmV3IGJldHRlciwgZWxzZSAwMCAqLyAgICAgICAgXAorICAgICJwY21wZXFiICUlbW0zLCAgICAgICAlJW1tMVxuXHQiICAgICAgLyogaGVyZSBmZiB3aGVyZSBvbGQgYmV0dGVyLCBlbHNlIDAwICovICAgICAgIFwKKyAgICAicGFuZCAgICAlJW1tMywgICAgICAgJSVtbTBcblx0IiAgICAgIC8qIGtlZXAgb25seSBiZXR0ZXIgbmV3IHBpeGVscyAqLyAgICAgICAgICAgICBcCisgICAgInBhbmQgICAgJSVtbTMsICAgICAgICUlbW0yXG5cdCIgICAgICAvKiBhbmQgd2VpZ2h0cyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYW5kICAgICUlbW0xLCAgICAgICAlJW1tNVxuXHQiICAgICAgLyoga2VlcCBvbmx5IGJldHRlciBvbGQgcGl4ZWxzICovICAgICAgICAgICAgIFwKKyAgICAicGFuZCAgICAlJW1tMSwgICAgICAgJSVtbTdcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvciAgICAgJSVtbTAsICAgICAgICUlbW01XG5cdCIgICAgICAvKiBhbmQgbWVyZ2UgbmV3ICYgb2xkIHZhbHMgKi8gICAgICAgICAgICAgICAgXAorICAgICJwb3IgICAgICUlbW0yLCAgICAgICAlJW1tN1xuXHQiCisKKyNkZWZpbmUgUkVTRVRfQ0hST01BICJwb3IgIl9VVk1hc2siLCAlJW1tN1xuXHQiCisKKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL2dzdC9kZWludGVybGFjZS90dnRpbWUvdmZpci5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS92ZmlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA2MTg5NQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvdmZpci5jCkBAIC0wLDAgKzEsMzE0IEBACisvKgorICoKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA0IEJpbGx5IEJpZ2dzIDx2ZWt0b3JAZHVtYnRlcm0ubmV0PgorICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyLCAyMDAzIEZhYnJpY2UgQmVsbGFyZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgZnJvbSBmZm1wZWcsIHNlZSBodHRwOi8vZmZtcGVnLm9yZy8gKExHUEwpCisgKiBhbmQgbW9kaWZpY2F0aW9ucyBieSBCaWxseSBCaWdncy4KKyAqCisgKiBSZWxpY2Vuc2VkIGZvciBHU3RyZWFtZXIgZnJvbSBHUEwgdG8gTEdQTCB3aXRoIHBlcm1pdCBmcm9tIEJpbGx5IEJpZ2dzLgorICogU2VlOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjM1NzgKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBIQVZFX09SQworI2luY2x1ZGUgPG9yYy9vcmMuaD4KKyNlbmRpZgorI2luY2x1ZGUgInR2dGltZS5oIgorCisjZGVmaW5lIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9WRklSCShnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3ZmaXJfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9JU19ERUlOVEVSTEFDRV9NRVRIT0RfVkZJUihvYmopCQkoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfVkZJUikpCisjZGVmaW5lIEdTVF9JU19ERUlOVEVSTEFDRV9NRVRIT0RfVkZJUl9DTEFTUyhrbGFzcykJKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfVkZJUikpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfVkZJUl9HRVRfQ0xBU1Mob2JqKQkoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9WRklSLCBHc3REZWludGVybGFjZU1ldGhvZFZGSVJDbGFzcykpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfVkZJUihvYmopCQkoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfVkZJUiwgR3N0RGVpbnRlcmxhY2VNZXRob2RWRklSKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9WRklSX0NMQVNTKGtsYXNzKQkoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9WRklSLCBHc3REZWludGVybGFjZU1ldGhvZFZGSVJDbGFzcykpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfVkZJUl9DQVNUKG9iaikJKChHc3REZWludGVybGFjZU1ldGhvZFZGSVIqKShvYmopKQorCitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3ZmaXJfZ2V0X3R5cGUgKHZvaWQpOworCit0eXBlZGVmIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kIEdzdERlaW50ZXJsYWNlTWV0aG9kVkZJUjsKKwordHlwZWRlZiBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzIEdzdERlaW50ZXJsYWNlTWV0aG9kVkZJUkNsYXNzOworCisvKgorICogVGhlIE1QRUcyIHNwZWMgdXNlcyBhIHNsaWdodGx5IGhhcnNoZXIgZmlsdGVyLCB0aGV5IHNwZWNpZnkKKyAqIFstMSA4IDIgOCAtMV0uICBmZm1wZWcgdXNlcyBhIHNpbWlsYXIgZmlsdGVyIGJ1dCB3aXRoIG1vcmUgb2YKKyAqIGEgdGVuZGFuY3kgdG8gYmx1ciB0aGFuIHRvIHVzZSB0aGUgbG9jYWwgaW5mb3JtYXRpb24uICBUaGUKKyAqIGZpbHRlciB0YXBzIGhlcmUgYXJlOiBbLTEgNCAyIDQgLTFdLgorICovCisKKyAvKgorICAqIEMgaW1wbGVtZW50YXRpb24uCisgICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2RlaW50ZXJsYWNlX2MgKGd1aW50OCAqIGRzdCwgY29uc3QgZ3VpbnQ4ICogbHVtX200LCBjb25zdCBndWludDggKiBsdW1fbTMsCisgICAgY29uc3QgZ3VpbnQ4ICogbHVtX20yLCBjb25zdCBndWludDggKiBsdW1fbTEsIGNvbnN0IGd1aW50OCAqIGx1bSwgZ2ludCBzaXplKQoreworICBpZiAobHVtX20yID09IE5VTEwpIHsKKyAgICBkZWludGVybGFjZV9saW5lX2xpbmVhciAoZHN0LCBsdW1fbTEsIGx1bV9tMywgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgZGVpbnRlcmxhY2VfbGluZV92ZmlyIChkc3QsIGx1bV9tNCwgbHVtX20zLCBsdW1fbTIsIGx1bV9tMSwgbHVtLCBzaXplKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfYyAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLCBndWludDggKiBkc3QsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIGNvbnN0IGd1aW50OCAqbHVtX200ID0gc2NhbmxpbmVzLT50dDE7CisgIGNvbnN0IGd1aW50OCAqbHVtX20zID0gc2NhbmxpbmVzLT50MDsKKyAgY29uc3QgZ3VpbnQ4ICpsdW1fbTIgPSBzY2FubGluZXMtPm0xOworICBjb25zdCBndWludDggKmx1bV9tMSA9IHNjYW5saW5lcy0+YjA7CisgIGNvbnN0IGd1aW50OCAqbHVtID0gc2NhbmxpbmVzLT5iYjE7CisKKyAgZGVpbnRlcmxhY2VfYyAoZHN0LCBsdW1fbTQsIGx1bV9tMywgbHVtX20yLCBsdW1fbTEsIGx1bSwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9saW5lX3BsYW5hcl95X2MgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwgZ3VpbnQ4ICogZHN0LAorICAgIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBjb25zdCBndWludDggKmx1bV9tNCA9IHNjYW5saW5lcy0+dHQxOworICBjb25zdCBndWludDggKmx1bV9tMyA9IHNjYW5saW5lcy0+dDA7CisgIGNvbnN0IGd1aW50OCAqbHVtX20yID0gc2NhbmxpbmVzLT5tMTsKKyAgY29uc3QgZ3VpbnQ4ICpsdW1fbTEgPSBzY2FubGluZXMtPmIwOworICBjb25zdCBndWludDggKmx1bSA9IHNjYW5saW5lcy0+YmIxOworCisgIGRlaW50ZXJsYWNlX2MgKGRzdCwgbHVtX200LCBsdW1fbTMsIGx1bV9tMiwgbHVtX20xLCBsdW0sIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2VfbGluZV9wbGFuYXJfdV9jIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsIGd1aW50OCAqIGRzdCwKKyAgICBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgY29uc3QgZ3VpbnQ4ICpsdW1fbTQgPSBzY2FubGluZXMtPnR0MTsKKyAgY29uc3QgZ3VpbnQ4ICpsdW1fbTMgPSBzY2FubGluZXMtPnQwOworICBjb25zdCBndWludDggKmx1bV9tMiA9IHNjYW5saW5lcy0+bTE7CisgIGNvbnN0IGd1aW50OCAqbHVtX20xID0gc2NhbmxpbmVzLT5iMDsKKyAgY29uc3QgZ3VpbnQ4ICpsdW0gPSBzY2FubGluZXMtPmJiMTsKKworICBkZWludGVybGFjZV9jIChkc3QsIGx1bV9tNCwgbHVtX20zLCBsdW1fbTIsIGx1bV9tMSwgbHVtLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX2xpbmVfcGxhbmFyX3ZfYyAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLCBndWludDggKiBkc3QsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIGNvbnN0IGd1aW50OCAqbHVtX200ID0gc2NhbmxpbmVzLT50dDE7CisgIGNvbnN0IGd1aW50OCAqbHVtX20zID0gc2NhbmxpbmVzLT50MDsKKyAgY29uc3QgZ3VpbnQ4ICpsdW1fbTIgPSBzY2FubGluZXMtPm0xOworICBjb25zdCBndWludDggKmx1bV9tMSA9IHNjYW5saW5lcy0+YjA7CisgIGNvbnN0IGd1aW50OCAqbHVtID0gc2NhbmxpbmVzLT5iYjE7CisKKyAgZGVpbnRlcmxhY2VfYyAoZHN0LCBsdW1fbTQsIGx1bV9tMywgbHVtX20yLCBsdW1fbTEsIGx1bSwgc2l6ZSk7Cit9CisKKyN1bmRlZiBCVUlMRF9YODZfQVNNCisKKyNpZmRlZiBCVUlMRF9YODZfQVNNCisjaW5jbHVkZSAibW14LmgiCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2VfbW14IChndWludDggKiBkc3QsIGNvbnN0IGd1aW50OCAqIGx1bV9tNCwgY29uc3QgZ3VpbnQ4ICogbHVtX20zLAorICAgIGNvbnN0IGd1aW50OCAqIGx1bV9tMiwgY29uc3QgZ3VpbnQ4ICogbHVtX20xLCBjb25zdCBndWludDggKiBsdW0sIGdpbnQgc2l6ZSkKK3sKKyAgbW14X3Qgcm91bmRlcjsKKworICByb3VuZGVyLnV3WzBdID0gNDsKKyAgcm91bmRlci51d1sxXSA9IDQ7CisgIHJvdW5kZXIudXdbMl0gPSA0OworICByb3VuZGVyLnV3WzNdID0gNDsKKyAgcHhvcl9yMnIgKG1tNywgbW03KTsKKyAgbW92cV9tMnIgKHJvdW5kZXIsIG1tNik7CisKKyAgZm9yICg7IHNpemUgPiAzOyBzaXplIC09IDQpIHsKKyAgICBtb3ZkX20yciAoKmx1bV9tNCwgbW0wKTsKKyAgICBtb3ZkX20yciAoKmx1bV9tMywgbW0xKTsKKyAgICBtb3ZkX20yciAoKmx1bV9tMiwgbW0yKTsKKyAgICBtb3ZkX20yciAoKmx1bV9tMSwgbW0zKTsKKyAgICBtb3ZkX20yciAoKmx1bSwgbW00KTsKKyAgICBwdW5wY2tsYndfcjJyIChtbTcsIG1tMCk7CisgICAgcHVucGNrbGJ3X3IyciAobW03LCBtbTEpOworICAgIHB1bnBja2xid19yMnIgKG1tNywgbW0yKTsKKyAgICBwdW5wY2tsYndfcjJyIChtbTcsIG1tMyk7CisgICAgcHVucGNrbGJ3X3IyciAobW03LCBtbTQpOworICAgIHBhZGR3X3IyciAobW0zLCBtbTEpOworICAgIHBzbGx3X2kyciAoMSwgbW0yKTsKKyAgICBwYWRkd19yMnIgKG1tNCwgbW0wKTsKKyAgICBwc2xsd19pMnIgKDIsIG1tMSk7ICAgICAgICAgLy8gMgorICAgIHBhZGR3X3IyciAobW02LCBtbTIpOworICAgIHBhZGR3X3IyciAobW0yLCBtbTEpOworICAgIHBzdWJ1c3dfcjJyIChtbTAsIG1tMSk7CisgICAgcHNybHdfaTJyICgzLCBtbTEpOyAgICAgICAgIC8vIDMKKyAgICBwYWNrdXN3Yl9yMnIgKG1tNywgbW0xKTsKKyAgICBtb3ZkX3IybSAobW0xLCAqZHN0KTsKKyAgICBsdW1fbTQgKz0gNDsKKyAgICBsdW1fbTMgKz0gNDsKKyAgICBsdW1fbTIgKz0gNDsKKyAgICBsdW1fbTEgKz0gNDsKKyAgICBsdW0gKz0gNDsKKyAgICBkc3QgKz0gNDsKKyAgfQorICBlbW1zICgpOworCisgIC8qIEhhbmRsZSBvZGQgd2lkdGhzICovCisgIGlmIChzaXplID4gMCkKKyAgICBkZWludGVybGFjZV9jIChkc3QsIGx1bV9tNCwgbHVtX20zLCBsdW1fbTIsIGx1bV9tMSwgbHVtLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX2xpbmVfcGFja2VkX21teCAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLCBndWludDggKiBkc3QsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMpCit7CisgIGNvbnN0IGd1aW50OCAqbHVtX200ID0gc2NhbmxpbmVzLT50dDE7CisgIGNvbnN0IGd1aW50OCAqbHVtX20zID0gc2NhbmxpbmVzLT50MDsKKyAgY29uc3QgZ3VpbnQ4ICpsdW1fbTIgPSBzY2FubGluZXMtPm0xOworICBjb25zdCBndWludDggKmx1bV9tMSA9IHNjYW5saW5lcy0+YjA7CisgIGNvbnN0IGd1aW50OCAqbHVtID0gc2NhbmxpbmVzLT5iYjE7CisgIGdpbnQgc2l6ZSA9IHNlbGYtPnBhcmVudC5yb3dfc3RyaWRlWzBdOworCisgIGRlaW50ZXJsYWNlX21teCAoZHN0LCBsdW1fbTQsIGx1bV9tMywgbHVtX20yLCBsdW1fbTEsIGx1bSwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9saW5lX3BsYW5hcl95X21teCAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLCBndWludDggKiBkc3QsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMpCit7CisgIGNvbnN0IGd1aW50OCAqbHVtX200ID0gc2NhbmxpbmVzLT50dDE7CisgIGNvbnN0IGd1aW50OCAqbHVtX20zID0gc2NhbmxpbmVzLT50MDsKKyAgY29uc3QgZ3VpbnQ4ICpsdW1fbTIgPSBzY2FubGluZXMtPm0xOworICBjb25zdCBndWludDggKmx1bV9tMSA9IHNjYW5saW5lcy0+YjA7CisgIGNvbnN0IGd1aW50OCAqbHVtID0gc2NhbmxpbmVzLT5iYjE7CisgIGdpbnQgc2l6ZSA9IHNlbGYtPnBhcmVudC5yb3dfc3RyaWRlWzBdOworCisgIGRlaW50ZXJsYWNlX21teCAoZHN0LCBsdW1fbTQsIGx1bV9tMywgbHVtX20yLCBsdW1fbTEsIGx1bSwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9saW5lX3BsYW5hcl91X21teCAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLCBndWludDggKiBkc3QsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMpCit7CisgIGNvbnN0IGd1aW50OCAqbHVtX200ID0gc2NhbmxpbmVzLT50dDE7CisgIGNvbnN0IGd1aW50OCAqbHVtX20zID0gc2NhbmxpbmVzLT50MDsKKyAgY29uc3QgZ3VpbnQ4ICpsdW1fbTIgPSBzY2FubGluZXMtPm0xOworICBjb25zdCBndWludDggKmx1bV9tMSA9IHNjYW5saW5lcy0+YjA7CisgIGNvbnN0IGd1aW50OCAqbHVtID0gc2NhbmxpbmVzLT5iYjE7CisgIGdpbnQgc2l6ZSA9IHNlbGYtPnBhcmVudC5yb3dfc3RyaWRlWzFdOworCisgIGRlaW50ZXJsYWNlX21teCAoZHN0LCBsdW1fbTQsIGx1bV9tMywgbHVtX20yLCBsdW1fbTEsIGx1bSwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9saW5lX3BsYW5hcl92X21teCAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLCBndWludDggKiBkc3QsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMpCit7CisgIGNvbnN0IGd1aW50OCAqbHVtX200ID0gc2NhbmxpbmVzLT50dDE7CisgIGNvbnN0IGd1aW50OCAqbHVtX20zID0gc2NhbmxpbmVzLT50MDsKKyAgY29uc3QgZ3VpbnQ4ICpsdW1fbTIgPSBzY2FubGluZXMtPm0xOworICBjb25zdCBndWludDggKmx1bV9tMSA9IHNjYW5saW5lcy0+YjA7CisgIGNvbnN0IGd1aW50OCAqbHVtID0gc2NhbmxpbmVzLT5iYjE7CisgIGdpbnQgc2l6ZSA9IHNlbGYtPnBhcmVudC5yb3dfc3RyaWRlWzJdOworCisgIGRlaW50ZXJsYWNlX21teCAoZHN0LCBsdW1fbTQsIGx1bV9tMywgbHVtX20yLCBsdW1fbTEsIGx1bSwgc2l6ZSk7Cit9CisjZW5kaWYKKworR19ERUZJTkVfVFlQRSAoR3N0RGVpbnRlcmxhY2VNZXRob2RWRklSLCBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3ZmaXIsCisgICAgR1NUX1RZUEVfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3ZmaXJfY2xhc3NfaW5pdCAoR3N0RGVpbnRlcmxhY2VNZXRob2RWRklSQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzcyAqZGltX2NsYXNzID0gKEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKikga2xhc3M7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgKmRpc21fY2xhc3MgPQorICAgICAgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgKikga2xhc3M7CisjaWZkZWYgQlVJTERfWDg2X0FTTQorICBndWludCBjcHVfZmxhZ3MgPQorICAgICAgb3JjX3RhcmdldF9nZXRfZGVmYXVsdF9mbGFncyAob3JjX3RhcmdldF9nZXRfYnlfbmFtZSAoIm1teCIpKTsKKyNlbmRpZgorCisgIGRpbV9jbGFzcy0+ZmllbGRzX3JlcXVpcmVkID0gMjsKKyAgZGltX2NsYXNzLT5uYW1lID0gIkJsdXIgVmVydGljYWwiOworICBkaW1fY2xhc3MtPm5pY2sgPSAidmZpciI7CisgIGRpbV9jbGFzcy0+bGF0ZW5jeSA9IDE7CisKKyNpZmRlZiBCVUlMRF9YODZfQVNNCisgIGlmIChjcHVfZmxhZ3MgJiBPUkNfVEFSR0VUX01NWF9NTVgpIHsKKyAgICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9heXV2ID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfbW14OworICAgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3l1eTIgPSBkZWludGVybGFjZV9saW5lX3BhY2tlZF9tbXg7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXZ5dSA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX21teDsKKyAgICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV91eXZ5ID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfbW14OworICAgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX252MTIgPSBkZWludGVybGFjZV9saW5lX3BhY2tlZF9tbXg7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYyMSA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX21teDsKKyAgICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9hcmdiID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfbW14OworICAgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2FiZ3IgPSBkZWludGVybGFjZV9saW5lX3BhY2tlZF9tbXg7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiYSA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX21teDsKKyAgICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3JhID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfbW14OworICAgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3JnYiA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX21teDsKKyAgICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3IgPSBkZWludGVybGFjZV9saW5lX3BhY2tlZF9tbXg7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3kgPSBkZWludGVybGFjZV9saW5lX3BsYW5hcl95X21teDsKKyAgICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdSA9IGRlaW50ZXJsYWNlX2xpbmVfcGxhbmFyX3VfbW14OworICAgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl92ID0gZGVpbnRlcmxhY2VfbGluZV9wbGFuYXJfdl9tbXg7CisgIH0gZWxzZSB7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXV5MiA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXZ5dSA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfdXl2eSA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYXl1diA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYxMiA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYyMSA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYXJnYiA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYWJnciA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiYSA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYmdyYSA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfYzsKKyAgICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3IgPSBkZWludGVybGFjZV9saW5lX3BhY2tlZF9jOworICAgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl95ID0gZGVpbnRlcmxhY2VfbGluZV9wbGFuYXJfeV9jOworICAgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl91ID0gZGVpbnRlcmxhY2VfbGluZV9wbGFuYXJfdV9jOworICAgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl92ID0gZGVpbnRlcmxhY2VfbGluZV9wbGFuYXJfdl9jOworICB9CisjZWxzZQorICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9heXV2ID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXV5MiA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3l2eXUgPSBkZWludGVybGFjZV9saW5lX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV91eXZ5ID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYxMiA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX252MjEgPSBkZWludGVybGFjZV9saW5lX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9hcmdiID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYWJnciA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3JnYmEgPSBkZWludGVybGFjZV9saW5lX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3JhID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYmdyID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3kgPSBkZWludGVybGFjZV9saW5lX3BsYW5hcl95X2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl91ID0gZGVpbnRlcmxhY2VfbGluZV9wbGFuYXJfdV9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdiA9IGRlaW50ZXJsYWNlX2xpbmVfcGxhbmFyX3ZfYzsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF92ZmlyX2luaXQgKEdzdERlaW50ZXJsYWNlTWV0aG9kVkZJUiAqIHNlbGYpCit7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlLmMgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA0Yzg4OQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmUuYwpAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqIFdlYXZlIGZyYW1lcworICogQ29weXJpZ2h0IChDKSAyMDAyIEJpbGx5IEJpZ2dzIDx2ZWt0b3JAZHVtYnRlcm0ubmV0Pi4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBSZWxpY2Vuc2VkIGZvciBHU3RyZWFtZXIgZnJvbSBHUEwgdG8gTEdQTCB3aXRoIHBlcm1pdCBmcm9tIEJpbGx5IEJpZ2dzLgorICogU2VlOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjM1NzgKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkUJKGdzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9JU19ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkUob2JqKQkJKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9XRUFWRV9DTEFTUyhrbGFzcykJKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkUpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFX0dFVF9DTEFTUyhvYmopCShHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFLCBHc3REZWludGVybGFjZU1ldGhvZFdlYXZlQ2xhc3MpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFKG9iaikJCShHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9XRUFWRSwgR3N0RGVpbnRlcmxhY2VNZXRob2RXZWF2ZSkpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkVfQ0xBU1Moa2xhc3MpCShHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFLCBHc3REZWludGVybGFjZU1ldGhvZFdlYXZlQ2xhc3MpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFX0NBU1Qob2JqKQkoKEdzdERlaW50ZXJsYWNlTWV0aG9kV2VhdmUqKShvYmopKQorCitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3dlYXZlX2dldF90eXBlICh2b2lkKTsKKwordHlwZWRlZiBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCBHc3REZWludGVybGFjZU1ldGhvZFdlYXZlOwordHlwZWRlZiBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzIEdzdERlaW50ZXJsYWNlTWV0aG9kV2VhdmVDbGFzczsKKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZCAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIGlmIChzY2FubGluZXMtPm0xID09IE5VTEwpIHsKKyAgICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT50MCwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTEsIHNpemUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wbGFuYXJfeSAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIGlmIChzY2FubGluZXMtPm0xID09IE5VTEwpIHsKKyAgICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT50MCwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTEsIHNpemUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wbGFuYXJfdSAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIGlmIChzY2FubGluZXMtPm0xID09IE5VTEwpIHsKKyAgICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT50MCwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTEsIHNpemUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wbGFuYXJfdiAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIGlmIChzY2FubGluZXMtPm0xID09IE5VTEwpIHsKKyAgICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT50MCwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTEsIHNpemUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5X3NjYW5saW5lX3BhY2tlZCAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLCBndWludDggKiBvdXQsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0wLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2NvcHlfc2NhbmxpbmVfcGxhbmFyX3kgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwgZ3VpbnQ4ICogb3V0LAorICAgIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMCwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5X3NjYW5saW5lX3BsYW5hcl91IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsIGd1aW50OCAqIG91dCwKKyAgICBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTAsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorY29weV9zY2FubGluZV9wbGFuYXJfdiAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLCBndWludDggKiBvdXQsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0wLCBzaXplKTsKK30KKworR19ERUZJTkVfVFlQRSAoR3N0RGVpbnRlcmxhY2VNZXRob2RXZWF2ZSwgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF93ZWF2ZSwKKyAgICBHU1RfVFlQRV9ERUlOVEVSTEFDRV9TSU1QTEVfTUVUSE9EKTsKKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfY2xhc3NfaW5pdCAoR3N0RGVpbnRlcmxhY2VNZXRob2RXZWF2ZUNsYXNzICoga2xhc3MpCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKmRpbV9jbGFzcyA9IChHc3REZWludGVybGFjZU1ldGhvZENsYXNzICopIGtsYXNzOworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzICpkaXNtX2NsYXNzID0KKyAgICAgIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzICopIGtsYXNzOworCisgIGRpbV9jbGFzcy0+ZmllbGRzX3JlcXVpcmVkID0gMjsKKyAgZGltX2NsYXNzLT5uYW1lID0gIldlYXZlIjsKKyAgZGltX2NsYXNzLT5uaWNrID0gIndlYXZlIjsKKyAgZGltX2NsYXNzLT5sYXRlbmN5ID0gMTsKKworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9heXV2ID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV95dXkyID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV95dnl1ID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV91eXZ5ID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9udjEyID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9udjIxID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9hcmdiID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9hYmdyID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9yZ2JhID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3JhID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9yZ2IgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2JnciA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3kgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGxhbmFyX3k7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl91ID0KKyAgICAgIGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BsYW5hcl91OworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdiA9CisgICAgICBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wbGFuYXJfdjsKKworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2F5dXYgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV95dXkyID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfeXZ5dSA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3V5dnkgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9udjEyID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfbnYyMSA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2FyZ2IgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9hYmdyID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfcmdiYSA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2JncmEgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9yZ2IgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9iZ3IgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9wbGFuYXJfeSA9IGNvcHlfc2NhbmxpbmVfcGxhbmFyX3k7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfcGxhbmFyX3UgPSBjb3B5X3NjYW5saW5lX3BsYW5hcl91OworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3BsYW5hcl92ID0gY29weV9zY2FubGluZV9wbGFuYXJfdjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfaW5pdCAoR3N0RGVpbnRlcmxhY2VNZXRob2RXZWF2ZSAqIHNlbGYpCit7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlYmZmLmMgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlYmZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQyNGU5NgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmViZmYuYwpAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIFdlYXZlIGZyYW1lcywgYm90dG9tLWZpZWxkLWZpcnN0LgorICogQ29weXJpZ2h0IChDKSAyMDAzIEJpbGx5IEJpZ2dzIDx2ZWt0b3JAZHVtYnRlcm0ubmV0Pi4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBSZWxpY2Vuc2VkIGZvciBHU3RyZWFtZXIgZnJvbSBHUEwgdG8gTEdQTCB3aXRoIHBlcm1pdCBmcm9tIEJpbGx5IEJpZ2dzLgorICogU2VlOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjM1NzgKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkVfQkZGCShnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3dlYXZlX2JmZl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9XRUFWRV9CRkYob2JqKQkJKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFX0JGRikpCisjZGVmaW5lIEdTVF9JU19ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkVfQkZGX0NMQVNTKGtsYXNzKQkoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9XRUFWRV9CRkYpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFX0JGRl9HRVRfQ0xBU1Mob2JqKQkoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9XRUFWRV9CRkYsIEdzdERlaW50ZXJsYWNlTWV0aG9kV2VhdmVCRkZDbGFzcykpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkVfQkZGKG9iaikJCShHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9XRUFWRV9CRkYsIEdzdERlaW50ZXJsYWNlTWV0aG9kV2VhdmVCRkYpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFX0JGRl9DTEFTUyhrbGFzcykJKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkVfQkZGLCBHc3REZWludGVybGFjZU1ldGhvZFdlYXZlQkZGQ2xhc3MpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFX0JGRl9DQVNUKG9iaikJKChHc3REZWludGVybGFjZU1ldGhvZFdlYXZlQkZGKikob2JqKSkKKworR1R5cGUgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF93ZWF2ZV9iZmZfZ2V0X3R5cGUgKHZvaWQpOworCit0eXBlZGVmIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kIEdzdERlaW50ZXJsYWNlTWV0aG9kV2VhdmVCRkY7Cit0eXBlZGVmIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgR3N0RGVpbnRlcmxhY2VNZXRob2RXZWF2ZUJGRkNsYXNzOworCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgaWYgKHNjYW5saW5lcy0+bTEgPT0gTlVMTCkgeworICAgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPmIwLCBzaXplKTsKKyAgfSBlbHNlIHsKKyAgICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMSwgc2l6ZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BsYW5hcl95IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgaWYgKHNjYW5saW5lcy0+bTEgPT0gTlVMTCkgeworICAgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPmIwLCBzaXplKTsKKyAgfSBlbHNlIHsKKyAgICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMSwgc2l6ZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BsYW5hcl91IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgaWYgKHNjYW5saW5lcy0+bTEgPT0gTlVMTCkgeworICAgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPmIwLCBzaXplKTsKKyAgfSBlbHNlIHsKKyAgICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMSwgc2l6ZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BsYW5hcl92IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgaWYgKHNjYW5saW5lcy0+bTEgPT0gTlVMTCkgeworICAgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPmIwLCBzaXplKTsKKyAgfSBlbHNlIHsKKyAgICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMSwgc2l6ZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NvcHlfc2NhbmxpbmVfcGFja2VkIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsIGd1aW50OCAqIG91dCwKKyAgICBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTAsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorY29weV9zY2FubGluZV9wbGFuYXJfeSAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLCBndWludDggKiBvdXQsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0wLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2NvcHlfc2NhbmxpbmVfcGxhbmFyX3UgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwgZ3VpbnQ4ICogb3V0LAorICAgIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMCwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5X3NjYW5saW5lX3BsYW5hcl92IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsIGd1aW50OCAqIG91dCwKKyAgICBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTAsIHNpemUpOworfQorCitHX0RFRklORV9UWVBFIChHc3REZWludGVybGFjZU1ldGhvZFdlYXZlQkZGLCBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3dlYXZlX2JmZiwKKyAgICBHU1RfVFlQRV9ERUlOVEVSTEFDRV9TSU1QTEVfTUVUSE9EKTsKKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfYmZmX2NsYXNzX2luaXQgKEdzdERlaW50ZXJsYWNlTWV0aG9kV2VhdmVCRkZDbGFzcyAqCisgICAga2xhc3MpCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKmRpbV9jbGFzcyA9IChHc3REZWludGVybGFjZU1ldGhvZENsYXNzICopIGtsYXNzOworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzICpkaXNtX2NsYXNzID0KKyAgICAgIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzICopIGtsYXNzOworCisgIGRpbV9jbGFzcy0+ZmllbGRzX3JlcXVpcmVkID0gMjsKKyAgZGltX2NsYXNzLT5uYW1lID0gIlByb2dyZXNzaXZlOiBCb3R0b20gRmllbGQgRmlyc3QiOworICBkaW1fY2xhc3MtPm5pY2sgPSAid2VhdmViZmYiOworICBkaW1fY2xhc3MtPmxhdGVuY3kgPSAxOworCisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2F5dXYgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3l1eTIgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3l2eXUgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3V5dnkgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX252MTIgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX252MjEgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2FyZ2IgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2FiZ3IgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3JnYmEgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2JncmEgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3JnYiA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYmdyID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfeSA9CisgICAgICBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wbGFuYXJfeTsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3UgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGxhbmFyX3U7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl92ID0KKyAgICAgIGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BsYW5hcl92OworCisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfYXl1diA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3l1eTIgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV95dnl1ID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfdXl2eSA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX252MTIgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9udjIxID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfYXJnYiA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2FiZ3IgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9yZ2JhID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfYmdyYSA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3JnYiA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2JnciA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3BsYW5hcl95ID0gY29weV9zY2FubGluZV9wbGFuYXJfeTsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9wbGFuYXJfdSA9IGNvcHlfc2NhbmxpbmVfcGxhbmFyX3U7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfcGxhbmFyX3YgPSBjb3B5X3NjYW5saW5lX3BsYW5hcl92OworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF93ZWF2ZV9iZmZfaW5pdCAoR3N0RGVpbnRlcmxhY2VNZXRob2RXZWF2ZUJGRiAqIHNlbGYpCit7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZldGZmLmMgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZldGZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzYmIyZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmV0ZmYuYwpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIFdlYXZlIGZyYW1lcywgdG9wLWZpZWxkLWZpcnN0LgorICogQ29weXJpZ2h0IChDKSAyMDAzIEJpbGx5IEJpZ2dzIDx2ZWt0b3JAZHVtYnRlcm0ubmV0Pi4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBSZWxpY2Vuc2VkIGZvciBHU3RyZWFtZXIgZnJvbSBHUEwgdG8gTEdQTCB3aXRoIHBlcm1pdCBmcm9tIEJpbGx5IEJpZ2dzLgorICogU2VlOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjM1NzgKKyAqLworCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RkZWludGVybGFjZW1ldGhvZC5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9XRUFWRV9URkYJKGdzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfdGZmX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfSVNfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFX1RGRihvYmopCQkoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkVfVEZGKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9XRUFWRV9URkZfQ0xBU1Moa2xhc3MpCShHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFX1RGRikpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkVfVEZGX0dFVF9DTEFTUyhvYmopCShHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFX1RGRiwgR3N0RGVpbnRlcmxhY2VNZXRob2RXZWF2ZVRGRkNsYXNzKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9XRUFWRV9URkYob2JqKQkJKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFX1RGRiwgR3N0RGVpbnRlcmxhY2VNZXRob2RXZWF2ZVRGRikpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkVfVEZGX0NMQVNTKGtsYXNzKQkoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9XRUFWRV9URkYsIEdzdERlaW50ZXJsYWNlTWV0aG9kV2VhdmVURkZDbGFzcykpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkVfVEZGX0NBU1Qob2JqKQkoKEdzdERlaW50ZXJsYWNlTWV0aG9kV2VhdmVURkYqKShvYmopKQorCitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3dlYXZlX3RmZl9nZXRfdHlwZSAodm9pZCk7CisKK3R5cGVkZWYgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgR3N0RGVpbnRlcmxhY2VNZXRob2RXZWF2ZVRGRjsKK3R5cGVkZWYgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RDbGFzcyBHc3REZWludGVybGFjZU1ldGhvZFdlYXZlVEZGQ2xhc3M7CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBpZiAoc2NhbmxpbmVzLT5tMSA9PSBOVUxMKSB7CisgICAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+dDAsIHNpemUpOworICB9IGVsc2UgeworICAgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0xLCBzaXplKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGxhbmFyX3kgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBpZiAoc2NhbmxpbmVzLT5tMSA9PSBOVUxMKSB7CisgICAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+dDAsIHNpemUpOworICB9IGVsc2UgeworICAgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0xLCBzaXplKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGxhbmFyX3UgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBpZiAoc2NhbmxpbmVzLT5tMSA9PSBOVUxMKSB7CisgICAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+dDAsIHNpemUpOworICB9IGVsc2UgeworICAgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0xLCBzaXplKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGxhbmFyX3YgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBpZiAoc2NhbmxpbmVzLT5tMSA9PSBOVUxMKSB7CisgICAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+dDAsIHNpemUpOworICB9IGVsc2UgeworICAgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0xLCBzaXplKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorY29weV9zY2FubGluZV9wYWNrZWQgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMCwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5X3NjYW5saW5lX3BsYW5hcl95IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTAsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorY29weV9zY2FubGluZV9wbGFuYXJfdSAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0wLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2NvcHlfc2NhbmxpbmVfcGxhbmFyX3YgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMCwgc2l6ZSk7Cit9CisKK0dfREVGSU5FX1RZUEUgKEdzdERlaW50ZXJsYWNlTWV0aG9kV2VhdmVURkYsIGdzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfdGZmLAorICAgIEdTVF9UWVBFX0RFSU5URVJMQUNFX1NJTVBMRV9NRVRIT0QpOworCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF93ZWF2ZV90ZmZfY2xhc3NfaW5pdCAoR3N0RGVpbnRlcmxhY2VNZXRob2RXZWF2ZVRGRkNsYXNzICoKKyAgICBrbGFzcykKK3sKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzcyAqZGltX2NsYXNzID0gKEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKikga2xhc3M7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgKmRpc21fY2xhc3MgPQorICAgICAgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgKikga2xhc3M7CisKKyAgZGltX2NsYXNzLT5maWVsZHNfcmVxdWlyZWQgPSAyOworICBkaW1fY2xhc3MtPm5hbWUgPSAiUHJvZ3Jlc3NpdmU6IFRvcCBGaWVsZCBGaXJzdCI7CisgIGRpbV9jbGFzcy0+bmljayA9ICJ3ZWF2ZXRmZiI7CisgIGRpbV9jbGFzcy0+bGF0ZW5jeSA9IDE7CisKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYXl1diA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXV5MiA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXZ5dSA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfdXl2eSA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYxMiA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYyMSA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYXJnYiA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYWJnciA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiYSA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYmdyYSA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3IgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl95ID0KKyAgICAgIGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BsYW5hcl95OworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdSA9CisgICAgICBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wbGFuYXJfdTsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3YgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGxhbmFyX3Y7CisKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9heXV2ID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfeXV5MiA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3l2eXUgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV91eXZ5ID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfbnYxMiA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX252MjEgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9hcmdiID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfYWJnciA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3JnYmEgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9iZ3JhID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfcmdiID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfYmdyID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfcGxhbmFyX3kgPSBjb3B5X3NjYW5saW5lX3BsYW5hcl95OworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3BsYW5hcl91ID0gY29weV9zY2FubGluZV9wbGFuYXJfdTsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9wbGFuYXJfdiA9IGNvcHlfc2NhbmxpbmVfcGxhbmFyX3Y7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3dlYXZlX3RmZl9pbml0IChHc3REZWludGVybGFjZU1ldGhvZFdlYXZlVEZGICogc2VsZikKK3sKK30KZGlmZiAtLWdpdCBhL2dzdC9kZWludGVybGFjZS90dnRpbWUveDg2LTY0X21hY3Jvcy5pbmMgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3g4Ni02NF9tYWNyb3MuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMmUzYzcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3g4Ni02NF9tYWNyb3MuaW5jCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgRGlyayBaaWVnZWxtZWllciA8ZHppZWdlbEBnbXguZGU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIAorICogU2VlOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjM1NzgKKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGNvcGllZCBmcm9tIFRWVElNRSdzIHNvdXJjZXMuCisgKiBPcmlnaW5hbCBhdXRob3I6IEFjaGltIFNjaG5laWRlciA8YmF0Y2hhbGxAbW9yZG9yLmNoPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmbmRlZiBYQVgKKworI2lmIGRlZmluZWQgKEhBVkVfQ1BVX0kzODYpICYmICFkZWZpbmVkKEhBVkVfQ1BVX1g4Nl82NCkKKworI2RlZmluZSBYQVggICAiZWF4IgorI2RlZmluZSBYQlggICAiZWJ4IgorI2RlZmluZSBYQ1ggICAiZWN4IgorI2RlZmluZSBYRFggICAiZWR4IgorI2RlZmluZSBYU0kgICAiZXNpIgorI2RlZmluZSBYREkgICAiZWRpIgorI2RlZmluZSBYU1AgICAiZXNwIgorI2RlZmluZSBNT1ZYICAibW92bCIKKyNkZWZpbmUgTEVBWCAgImxlYWwiCisjZGVmaW5lIERFQ1ggICJkZWNsIgorI2RlZmluZSBQVVNIWCAicHVzaGwiCisjZGVmaW5lIFBPUFggICJwb3BsIgorI2RlZmluZSBDTVBYICAiY21wbCIKKyNkZWZpbmUgQUREWCAgImFkZGwiCisjZGVmaW5lIFNITFggICJzaGxsIgorI2RlZmluZSBTSFJYICAic2hybCIKKyNkZWZpbmUgU1VCWCAgInN1YmwiCisKKyNlbGlmIGRlZmluZWQgKEhBVkVfQ1BVX1g4Nl82NCkKKworI2RlZmluZSBYQVggICAicmF4IgorI2RlZmluZSBYQlggICAicmJ4IgorI2RlZmluZSBYQ1ggICAicmN4IgorI2RlZmluZSBYRFggICAicmR4IgorI2RlZmluZSBYU0kgICAicnNpIgorI2RlZmluZSBYREkgICAicmRpIgorI2RlZmluZSBYU1AgICAicnNwIgorI2RlZmluZSBNT1ZYICAibW92cSIKKyNkZWZpbmUgTEVBWCAgImxlYXEiCisjZGVmaW5lIERFQ1ggICJkZWNxIgorI2RlZmluZSBQVVNIWCAicHVzaHEiCisjZGVmaW5lIFBPUFggICJwb3BxIgorI2RlZmluZSBDTVBYICAiY21wcSIKKyNkZWZpbmUgQUREWCAgImFkZHEiCisjZGVmaW5lIFNITFggICJzaGxxIgorI2RlZmluZSBTSFJYICAic2hycSIKKyNkZWZpbmUgU1VCWCAgInN1YnEiCisKKyNlbHNlCisjZXJyb3IgVW5kZWZpbmVkIGFyY2hpdGVjdHVyZS4gRGVmaW5lIGVpdGhlciBBUkNIX1g4NiBvciBBUkNIX1g4Nl82NC4KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC9kdG1mL01ha2VmaWxlLmFtIGIvZ3N0L2R0bWYvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhmOGNlOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kdG1mL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTYgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdGR0bWYubGEKKworbGliZ3N0ZHRtZl9sYV9TT1VSQ0VTID0gZ3N0ZHRtZnNyYy5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdzdHJ0cGR0bWZzcmMuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICBnc3RydHBkdG1mZGVwYXkuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICBnc3RkdG1mLmMKKworbm9pbnN0X0hFQURFUlMgPSBnc3RkdG1mc3JjLmggXAorICAgICAgICAgICAgICAgICBnc3RydHBkdG1mc3JjLmggXAorICAgICAgICAgICAgICAgICBnc3RydHBkdG1mZGVwYXkuaCBcCisgICAgICAgICAgICAgICAgIGdzdGR0bWZjb21tb24uaAorCitsaWJnc3RkdG1mX2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdGR0bWZfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0cnRwLUBHU1RfQVBJX1ZFUlNJT05AIFwKKwkkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoTElCTSkKK2xpYmdzdGR0bWZfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQpkaWZmIC0tZ2l0IGEvZ3N0L2R0bWYvZ3N0ZHRtZi5jIGIvZ3N0L2R0bWYvZ3N0ZHRtZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYzQwMDEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZHRtZi9nc3RkdG1mLmMKQEAgLTAsMCArMSw0NSBAQAorLyogR1N0cmVhbWVyIERUTUYgcGx1Z2luCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0ZHRtZnNyYy5oIgorI2luY2x1ZGUgImdzdHJ0cGR0bWZzcmMuaCIKKyNpbmNsdWRlICJnc3RydHBkdG1mZGVwYXkuaCIKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBpZiAoIWdzdF9kdG1mX3NyY19wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2R0bWZfc3JjX3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfZHRtZl9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBkdG1mLCAiRFRNRiBwbHVnaW5zIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC9kdG1mL2dzdGR0bWZjb21tb24uaCBiL2dzdC9kdG1mL2dzdGR0bWZjb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmYyNmNjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2R0bWYvZ3N0ZHRtZmNvbW1vbi5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIEdTdHJlYW1lciBEVE1GIHBsdWdpbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0RUTUZfQ09NTU9OX0hfXworI2RlZmluZSBfX0dTVF9SVFBfRFRNRl9DT01NT05fSF9fCisKKyNpbmNsdWRlIDxnc3QvbWF0aC1jb21wYXQuaD4KKworI2RlZmluZSBNSU5fSU5URVJfRElHSVRfSU5URVJWQUwgMTAwICAgICAvKiBtcyAqLworI2RlZmluZSBNSU5fUFVMU0VfRFVSQVRJT04gICAgICAgMjUwICAgICAvKiBtcyAqLworCisjZGVmaW5lIE1JTl9WT0xVTUUgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1BWF9WT0xVTUUgICAgICAgICAgICAgICAzNgorCisjZGVmaW5lIE1JTl9FVkVOVCAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1BWF9FVkVOVCAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBNSU5fRVZFTlRfU1RSSU5HICAgICAgICAgIjAiCisjZGVmaW5lIE1BWF9FVkVOVF9TVFJJTkcgICAgICAgICAiMTUiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGV2ZW50Ojg7ICAgICAgICAgICAgIC8qIEN1cnJlbnQgRFRNRiBldmVudCAqLworI2lmIEdfQllURV9PUkRFUiA9PSBHX0xJVFRMRV9FTkRJQU4KKyAgdW5zaWduZWQgdm9sdW1lOjY7ICAgICAgICAgICAgLyogcG93ZXIgbGV2ZWwgb2YgdGhlIHRvbmUsIGluIGRCbTAgKi8KKyAgdW5zaWduZWQgcjoxOyAgICAgICAgICAgICAgICAgLyogUmVzZXJ2ZWQtYml0ICovCisgIHVuc2lnbmVkIGU6MTsgICAgICAgICAgICAgICAgIC8qIEVuZC1iaXQgKi8KKyNlbGlmIEdfQllURV9PUkRFUiA9PSBHX0JJR19FTkRJQU4KKyAgdW5zaWduZWQgZToxOyAgICAgICAgICAgICAgICAgLyogRW5kLWJpdCAqLworICB1bnNpZ25lZCByOjE7ICAgICAgICAgICAgICAgICAvKiBSZXNlcnZlZC1iaXQgKi8KKyAgdW5zaWduZWQgdm9sdW1lOjY7ICAgICAgICAgICAgLyogcG93ZXIgbGV2ZWwgb2YgdGhlIHRvbmUsIGluIGRCbTAgKi8KKyNlbHNlCisjZXJyb3IgIkdfQllURV9PUkRFUiBzaG91bGQgYmUgYmlnIG9yIGxpdHRsZSBlbmRpYW4uIgorI2VuZGlmCisgIHVuc2lnbmVkIGR1cmF0aW9uOjE2OyAgICAgICAgIC8qIER1cmF0aW9uIG9mIGRpZ2l0LCBpbiB0aW1lc3RhbXAgdW5pdHMgKi8KK30gR3N0UlRQRFRNRlBheWxvYWQ7CisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfRFRNRl9DT01NT05fSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZHRtZi9nc3RkdG1mc3JjLmMgYi9nc3QvZHRtZi9nc3RkdG1mc3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhmMGYwOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kdG1mL2dzdGR0bWZzcmMuYwpAQCAtMCwwICsxLDk5OCBAQAorLyogR1N0cmVhbWVyIERUTUYgc291cmNlCisgKgorICogZ3N0ZHRtZnNyYy5jOgorICoKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IENvbGxhYm9yYS4KKyAqICAgQ29udGFjdDogWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IE5va2lhIENvcnBvcmF0aW9uLgorICogICBDb250YWN0OiBaZWVzaGFuIEFsaSA8emVlc2hhbi5hbGlAbm9raWEuY29tPgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgMjAwMCwyMDA1IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtZHRtZnNyYworICogQHNlZV9hbHNvOiBydHBkdG1zcmMsIHJ0cGR0bWZtdXh4CisgKgorICogVGhlIERUTUZTcmMgZWxlbWVudCBnZW5lcmF0ZXMgRFRNRiAoSVRVLVQgUS4yMyBTcGVjaWZpY2F0aW9uKSB0b25lIHBhY2tldHMgb24gcmVxdWVzdAorICogZnJvbSBhcHBsaWNhdGlvbi4gVGhlIGFwcGxpY2F0aW9uIGNvbW11bmljYXRlcyB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYQorICogRFRNRiBldmVudCB1c2luZyBjdXN0b20gdXBzdHJlYW0gZ3N0cmVhbWVyIGV2ZW50cy4gVG8gcmVwb3J0IGEgRFRNRiBldmVudCwgYW4KKyAqIGFwcGxpY2F0aW9uIG11c3Qgc2VuZCBhbiBldmVudCBvZiB0eXBlIEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU0sIGhhdmluZyBhCisgKiBzdHJ1Y3R1cmUgb2YgbmFtZSAiZHRtZi1ldmVudCIgd2l0aCBmaWVsZHMgc2V0IGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nCisgKiB0YWJsZToKKyAqCisgKiA8aW5mb3JtYWx0YWJsZT4KKyAqIDx0Z3JvdXAgY29scz0nNCc+CisgKiA8Y29sc3BlYyBjb2xuYW1lPSdOYW1lJyAvPgorICogPGNvbHNwZWMgY29sbmFtZT0nVHlwZScgLz4KKyAqIDxjb2xzcGVjIGNvbG5hbWU9J1Bvc3NpYmxlIHZhbHVlcycgLz4KKyAqIDxjb2xzcGVjIGNvbG5hbWU9J1B1cnBvc2UnIC8+CisgKiA8dGhlYWQ+CisgKiA8cm93PgorICogPGVudHJ5Pk5hbWU8L2VudHJ5PgorICogPGVudHJ5PkdUeXBlPC9lbnRyeT4KKyAqIDxlbnRyeT5Qb3NzaWJsZSB2YWx1ZXM8L2VudHJ5PgorICogPGVudHJ5PlB1cnBvc2U8L2VudHJ5PgorICogPC9yb3c+CisgKiA8L3RoZWFkPgorICogPHRib2R5PgorICogPHJvdz4KKyAqIDxlbnRyeT50eXBlPC9lbnRyeT4KKyAqIDxlbnRyeT5HX1RZUEVfSU5UPC9lbnRyeT4KKyAqIDxlbnRyeT4wLTE8L2VudHJ5PgorICogPGVudHJ5PlRoZSBhcHBsaWNhdGlvbiB1c2VzIHRoaXMgZmllbGQgdG8gc3BlY2lmeSB3aGljaCBvZiB0aGUgdHdvIG1ldGhvZHMKKyAqIHNwZWNpZmllZCBpbiBSRkMgMjgzMyB0byB1c2UuIFRoZSB2YWx1ZSBzaG91bGQgYmUgMCBmb3IgdG9uZXMgYW5kIDEgZm9yCisgKiBuYW1lZCBldmVudHMuIFRvbmVzIGFyZSBzcGVjaWZpZWQgYnkgdGhlaXIgZnJlcXVlbmNpZXMgYW5kIGV2ZW50cyBhcmUgc3BlY2llZAorICogYnkgdGhlaXIgbnVtYmVyLiBUaGlzIGVsZW1lbnQgY2FuIG9ubHkgdGFrZSBldmVudHMgYXMgaW5wdXQuIERvIG5vdCBjb25mdXNlCisgKiB3aXRoICJtZXRob2QiIHdoaWNoIHNwZWNpZmllZCB0aGUgb3V0cHV0LgorICogPC9lbnRyeT4KKyAqIDwvcm93PgorICogPHJvdz4KKyAqIDxlbnRyeT5udW1iZXI8L2VudHJ5PgorICogPGVudHJ5PkdfVFlQRV9JTlQ8L2VudHJ5PgorICogPGVudHJ5PjAtMTU8L2VudHJ5PgorICogPGVudHJ5PlRoZSBldmVudCBudW1iZXIuPC9lbnRyeT4KKyAqIDwvcm93PgorICogPHJvdz4KKyAqIDxlbnRyeT52b2x1bWU8L2VudHJ5PgorICogPGVudHJ5PkdfVFlQRV9JTlQ8L2VudHJ5PgorICogPGVudHJ5PjAtMzY8L2VudHJ5PgorICogPGVudHJ5PlRoaXMgZmllbGQgZGVzY3JpYmVzIHRoZSBwb3dlciBsZXZlbCBvZiB0aGUgdG9uZSwgZXhwcmVzc2VkIGluIGRCbTAKKyAqIGFmdGVyIGRyb3BwaW5nIHRoZSBzaWduLiBQb3dlciBsZXZlbHMgcmFuZ2UgZnJvbSAwIHRvIC02MyBkQm0wLiBUaGUgcmFuZ2Ugb2YKKyAqIHZhbGlkIERUTUYgaXMgZnJvbSAwIHRvIC0zNiBkQm0wLiBDYW4gYmUgb21pdHRlZCBpZiBzdGFydCBpcyBzZXQgdG8gRkFMU0UuCisgKiA8L2VudHJ5PgorICogPC9yb3c+CisgKiA8cm93PgorICogPGVudHJ5PnN0YXJ0PC9lbnRyeT4KKyAqIDxlbnRyeT5HX1RZUEVfQk9PTEVBTjwvZW50cnk+CisgKiA8ZW50cnk+VHJ1ZSBvciBGYWxzZTwvZW50cnk+CisgKiA8ZW50cnk+V2hldGhlciB0aGUgZXZlbnQgaXMgc3RhcnRpbmcgb3IgZW5kaW5nLjwvZW50cnk+CisgKiA8L3Jvdz4KKyAqIDxyb3c+CisgKiA8ZW50cnk+bWV0aG9kPC9lbnRyeT4KKyAqIDxlbnRyeT5HX1RZUEVfSU5UPC9lbnRyeT4KKyAqIDxlbnRyeT4yPC9lbnRyeT4KKyAqIDxlbnRyeT5UaGUgbWV0aG9kIHVzZWQgZm9yIHNlbmRpbmcgZXZlbnQsIHRoaXMgZWxlbWVudCB3aWxsIHJlYWN0IGlmIHRoaXMKKyAqIGZpZWxkIGlzIGFic2VudCBvciAyLgorICogPC9lbnRyeT4KKyAqIDwvcm93PgorICogPC90Ym9keT4KKyAqIDwvdGdyb3VwPgorICogPC9pbmZvcm1hbHRhYmxlPgorICoKKyAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgaW5mb3JtcyB0aGUgcGlwZWxpbmUgKGFuZCBpbiB0dXJuLCB0aGUKKyAqIERUTUZTcmMgZWxlbWVudCBpbnNpZGUgdGhlIHBpcGVsaW5lKSBhYm91dCB0aGUgc3RhcnQgb2YgYSBEVE1GIG5hbWVkCisgKiBldmVudCAnMScgb2Ygdm9sdW1lIC0yNSBkQm0wOgorICoKKyAqIDxwcm9ncmFtbGlzdGluZz4KKyAqIHN0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgiZHRtZi1ldmVudCIsCisgKiAgICAgICAgICAgICAgICAgICAgInR5cGUiLCBHX1RZUEVfSU5ULCAxLAorICogICAgICAgICAgICAgICAgICAgICJudW1iZXIiLCBHX1RZUEVfSU5ULCAxLAorICogICAgICAgICAgICAgICAgICAgICJ2b2x1bWUiLCBHX1RZUEVfSU5ULCAyNSwKKyAqICAgICAgICAgICAgICAgICAgICAic3RhcnQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisgKgorICogZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwgc3RydWN0dXJlKTsKKyAqIGdzdF9lbGVtZW50X3NlbmRfZXZlbnQgKHBpcGVsaW5lLCBldmVudCk7CisgKiA8L3Byb2dyYW1saXN0aW5nPgorICoKKyAqIFdoZW4gYSBEVE1GIHRvbmUgYWN0dWFsbHkgc3RhcnRzIG9yIHN0b3AsIGEgImR0bWYtZXZlbnQtcHJvY2Vzc2VkIgorICogZWxlbWVudCAjR3N0TWVzc2FnZSB3aXRoIHRoZSBzYW1lIGZpZWxkcyBhcyB0aGUgImR0bWYtZXZlbnQiCisgKiAjR3N0RXZlbnQgdGhhdCB3YXMgdXNlZCB0byByZXF1ZXN0IHRoZSBldmVudC4gQWxzbywgaWYgYW55IGV2ZW50CisgKiBoYXMgbm90IGJlZW4gcHJvY2Vzc2VkIHdoZW4gdGhlIGVsZW1lbnQgZ29lcyBmcm9tIHRoZSBQQVVTRUQgdG8gdGhlCisgKiBSRUFEWSBzdGF0ZSwgdGhlbiBhICJkdG1mLWV2ZW50LWRyb3BwZWQiIG1lc3NhZ2UgaXMgcG9zdGVkIG9uIHRoZQorICogI0dzdEJ1cyBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IHdlcmUgcmVjZWl2ZWQuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaW5jbHVkZSAiZ3N0ZHRtZmNvbW1vbi5oIgorCisjaW5jbHVkZSAiZ3N0ZHRtZnNyYy5oIgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNkZWZpbmUgR1NUX1RPTkVfRFRNRl9UWVBFX0VWRU5UIDEKKyNkZWZpbmUgREVGQVVMVF9QQUNLRVRfSU5URVJWQUwgIDUwICAgICAvKiBtcyAqLworI2RlZmluZSBNSU5fUEFDS0VUX0lOVEVSVkFMICAgICAgMTAgICAgIC8qIG1zICovCisjZGVmaW5lIE1BWF9QQUNLRVRfSU5URVJWQUwgICAgICA1MCAgICAgLyogbXMgKi8KKyNkZWZpbmUgREVGQVVMVF9TQU1QTEVfUkFURSAgICAgIDgwMDAKKyNkZWZpbmUgU0FNUExFX1NJWkUgICAgICAgICAgICAgIDE2CisjZGVmaW5lIENIQU5ORUxTICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1JTl9EVVRZX0NZQ0xFICAgICAgICAgICAoTUlOX0lOVEVSX0RJR0lUX0lOVEVSVkFMICsgTUlOX1BVTFNFX0RVUkFUSU9OKQorCisKK3R5cGVkZWYgc3RydWN0IHN0X2R0bWZfa2V5Cit7CisgIGNvbnN0IGNoYXIgKmV2ZW50X25hbWU7CisgIGludCBldmVudF9lbmNvZGluZzsKKyAgZmxvYXQgbG93X2ZyZXF1ZW5jeTsKKyAgZmxvYXQgaGlnaF9mcmVxdWVuY3k7Cit9IERUTUZfS0VZOworCitzdGF0aWMgY29uc3QgRFRNRl9LRVkgRFRNRl9LRVlTW10gPSB7CisgIHsiRFRNRl9LRVlfRVZFTlRfMCIsIDAsIDk0MSwgMTMzNn0sCisgIHsiRFRNRl9LRVlfRVZFTlRfMSIsIDEsIDY5NywgMTIwOX0sCisgIHsiRFRNRl9LRVlfRVZFTlRfMiIsIDIsIDY5NywgMTMzNn0sCisgIHsiRFRNRl9LRVlfRVZFTlRfMyIsIDMsIDY5NywgMTQ3N30sCisgIHsiRFRNRl9LRVlfRVZFTlRfNCIsIDQsIDc3MCwgMTIwOX0sCisgIHsiRFRNRl9LRVlfRVZFTlRfNSIsIDUsIDc3MCwgMTMzNn0sCisgIHsiRFRNRl9LRVlfRVZFTlRfNiIsIDYsIDc3MCwgMTQ3N30sCisgIHsiRFRNRl9LRVlfRVZFTlRfNyIsIDcsIDg1MiwgMTIwOX0sCisgIHsiRFRNRl9LRVlfRVZFTlRfOCIsIDgsIDg1MiwgMTMzNn0sCisgIHsiRFRNRl9LRVlfRVZFTlRfOSIsIDksIDg1MiwgMTQ3N30sCisgIHsiRFRNRl9LRVlfRVZFTlRfUyIsIDEwLCA5NDEsIDEyMDl9LAorICB7IkRUTUZfS0VZX0VWRU5UX1AiLCAxMSwgOTQxLCAxNDc3fSwKKyAgeyJEVE1GX0tFWV9FVkVOVF9BIiwgMTIsIDY5NywgMTYzM30sCisgIHsiRFRNRl9LRVlfRVZFTlRfQiIsIDEzLCA3NzAsIDE2MzN9LAorICB7IkRUTUZfS0VZX0VWRU5UX0MiLCAxNCwgODUyLCAxNjMzfSwKKyAgeyJEVE1GX0tFWV9FVkVOVF9EIiwgMTUsIDk0MSwgMTYzM30sCit9OworCisjZGVmaW5lIE1BWF9EVE1GX0VWRU5UUyAxNgorCitlbnVtCit7CisgIERUTUZfS0VZX0VWRU5UXzEgPSAxLAorICBEVE1GX0tFWV9FVkVOVF8yID0gMiwKKyAgRFRNRl9LRVlfRVZFTlRfMyA9IDMsCisgIERUTUZfS0VZX0VWRU5UXzQgPSA0LAorICBEVE1GX0tFWV9FVkVOVF81ID0gNSwKKyAgRFRNRl9LRVlfRVZFTlRfNiA9IDYsCisgIERUTUZfS0VZX0VWRU5UXzcgPSA3LAorICBEVE1GX0tFWV9FVkVOVF84ID0gOCwKKyAgRFRNRl9LRVlfRVZFTlRfOSA9IDksCisgIERUTUZfS0VZX0VWRU5UXzAgPSAwLAorICBEVE1GX0tFWV9FVkVOVF9TVEFSID0gMTAsCisgIERUTUZfS0VZX0VWRU5UX1BPVU5EID0gMTEsCisgIERUTUZfS0VZX0VWRU5UX0EgPSAxMiwKKyAgRFRNRl9LRVlfRVZFTlRfQiA9IDEzLAorICBEVE1GX0tFWV9FVkVOVF9DID0gMTQsCisgIERUTUZfS0VZX0VWRU5UX0QgPSAxNSwKK307CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9kdG1mX3NyY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfZHRtZl9zcmNfZGVidWcKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfSU5URVJWQUwsCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X2R0bWZfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgXCIiIEdTVF9BVURJT19ORSAoUzE2KSAiXCIsICIKKyAgICAgICAgInJhdGUgPSAiIEdTVF9BVURJT19SQVRFX1JBTkdFICIsICIgImNoYW5uZWxzID0gKGludCkgMSIpCisgICAgKTsKKworI2RlZmluZSBwYXJlbnRfY2xhc3MgZ3N0X2R0bWZfc3JjX3BhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0RFRNRlNyYywgZ3N0X2R0bWZfc3JjLCBHU1RfVFlQRV9CQVNFX1NSQyk7CisKK3N0YXRpYyB2b2lkIGdzdF9kdG1mX3NyY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyB2b2lkIGdzdF9kdG1mX3NyY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfZHRtZl9zcmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIGdib29sZWFuIGdzdF9kdG1mX3NyY19oYW5kbGVfZXZlbnQgKEdzdEJhc2VTcmMgKiBzcmMsIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9kdG1mX3NyY19zZW5kX2V2ZW50IChHc3RFbGVtZW50ICogc3JjLCBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfZHRtZl9zcmNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9kdG1mX3NyY19jcmVhdGUgKEdzdEJhc2VTcmMgKiBiYXNlc3JjLAorICAgIGd1aW50NjQgb2Zmc2V0LCBndWludCBsZW5ndGgsIEdzdEJ1ZmZlciAqKiBidWZmZXIpOworc3RhdGljIHZvaWQgZ3N0X2R0bWZfc3JjX2FkZF9zdGFydF9ldmVudCAoR3N0RFRNRlNyYyAqIGR0bWZzcmMsCisgICAgZ2ludCBldmVudF9udW1iZXIsIGdpbnQgZXZlbnRfdm9sdW1lKTsKK3N0YXRpYyB2b2lkIGdzdF9kdG1mX3NyY19hZGRfc3RvcF9ldmVudCAoR3N0RFRNRlNyYyAqIGR0bWZzcmMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2R0bWZfc3JjX3VubG9jayAoR3N0QmFzZVNyYyAqIHNyYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZHRtZl9zcmNfdW5sb2NrX3N0b3AgKEdzdEJhc2VTcmMgKiBzcmMpOworc3RhdGljIGdib29sZWFuIGdzdF9kdG1mX3NyY19uZWdvdGlhdGUgKEdzdEJhc2VTcmMgKiBiYXNlc3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZHRtZl9zcmNfcXVlcnkgKEdzdEJhc2VTcmMgKiBiYXNlc3JjLCBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworCitzdGF0aWMgdm9pZAorZ3N0X2R0bWZfc3JjX2NsYXNzX2luaXQgKEdzdERUTUZTcmNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEJhc2VTcmNDbGFzcyAqZ3N0YmFzZXNyY19jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBnc3RiYXNlc3JjX2NsYXNzID0gR1NUX0JBU0VfU1JDX0NMQVNTIChrbGFzcyk7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworCisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9kdG1mX3NyY19kZWJ1ZywgImR0bWZzcmMiLCAwLCAiZHRtZnNyYyBlbGVtZW50Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X2R0bWZfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIkRUTUYgdG9uZSBnZW5lcmF0b3IiLCAiU291cmNlL0F1ZGlvIiwgIkdlbmVyYXRlcyBEVE1GIHRvbmVzIiwKKyAgICAgICJZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPiIpOworCisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfZHRtZl9zcmNfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9kdG1mX3NyY19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9kdG1mX3NyY19nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9JTlRFUlZBTCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiaW50ZXJ2YWwiLCAiSW50ZXJ2YWwgYmV0d2VlbiB0b25lIHBhY2tldHMiLAorICAgICAgICAgICJJbnRlcnZhbCBpbiBtcyBiZXR3ZWVuIHR3byB0b25lIHBhY2tldHMiLCBNSU5fUEFDS0VUX0lOVEVSVkFMLAorICAgICAgICAgIE1BWF9QQUNLRVRfSU5URVJWQUwsIERFRkFVTFRfUEFDS0VUX0lOVEVSVkFMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2R0bWZfc3JjX2NoYW5nZV9zdGF0ZSk7CisgIGdzdGVsZW1lbnRfY2xhc3MtPnNlbmRfZXZlbnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2R0bWZfc3JjX3NlbmRfZXZlbnQpOworICBnc3RiYXNlc3JjX2NsYXNzLT51bmxvY2sgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2R0bWZfc3JjX3VubG9jayk7CisgIGdzdGJhc2VzcmNfY2xhc3MtPnVubG9ja19zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kdG1mX3NyY191bmxvY2tfc3RvcCk7CisKKyAgZ3N0YmFzZXNyY19jbGFzcy0+ZXZlbnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2R0bWZfc3JjX2hhbmRsZV9ldmVudCk7CisgIGdzdGJhc2VzcmNfY2xhc3MtPmNyZWF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZHRtZl9zcmNfY3JlYXRlKTsKKyAgZ3N0YmFzZXNyY19jbGFzcy0+bmVnb3RpYXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kdG1mX3NyY19uZWdvdGlhdGUpOworICBnc3RiYXNlc3JjX2NsYXNzLT5xdWVyeSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZHRtZl9zcmNfcXVlcnkpOworfQorCitzdGF0aWMgdm9pZAorZXZlbnRfZnJlZSAoR3N0RFRNRlNyY0V2ZW50ICogZXZlbnQpCit7CisgIGlmIChldmVudCkKKyAgICBnX3NsaWNlX2ZyZWUgKEdzdERUTUZTcmNFdmVudCwgZXZlbnQpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2R0bWZfc3JjX2luaXQgKEdzdERUTUZTcmMgKiBkdG1mc3JjKQoreworICAvKiB3ZSBvcGVyYXRlIGluIHRpbWUgKi8KKyAgZ3N0X2Jhc2Vfc3JjX3NldF9mb3JtYXQgKEdTVF9CQVNFX1NSQyAoZHRtZnNyYyksIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9iYXNlX3NyY19zZXRfbGl2ZSAoR1NUX0JBU0VfU1JDIChkdG1mc3JjKSwgVFJVRSk7CisKKyAgZHRtZnNyYy0+aW50ZXJ2YWwgPSBERUZBVUxUX1BBQ0tFVF9JTlRFUlZBTDsKKworICBkdG1mc3JjLT5ldmVudF9xdWV1ZSA9IGdfYXN5bmNfcXVldWVfbmV3X2Z1bGwgKChHRGVzdHJveU5vdGlmeSkgZXZlbnRfZnJlZSk7CisgIGR0bWZzcmMtPmxhc3RfZXZlbnQgPSBOVUxMOworCisgIGR0bWZzcmMtPnNhbXBsZV9yYXRlID0gREVGQVVMVF9TQU1QTEVfUkFURTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkdG1mc3JjLCAiaW5pdCBkb25lIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZHRtZl9zcmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdERUTUZTcmMgKmR0bWZzcmM7CisKKyAgZHRtZnNyYyA9IEdTVF9EVE1GX1NSQyAob2JqZWN0KTsKKworICBpZiAoZHRtZnNyYy0+ZXZlbnRfcXVldWUpIHsKKyAgICBnX2FzeW5jX3F1ZXVlX3VucmVmIChkdG1mc3JjLT5ldmVudF9xdWV1ZSk7CisgICAgZHRtZnNyYy0+ZXZlbnRfcXVldWUgPSBOVUxMOworICB9CisKKyAgR19PQkpFQ1RfQ0xBU1MgKGdzdF9kdG1mX3NyY19wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZHRtZl9zcmNfaGFuZGxlX2R0bWZfZXZlbnQgKEdzdERUTUZTcmMgKiBkdG1mc3JjLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBjb25zdCBHc3RTdHJ1Y3R1cmUgKmV2ZW50X3N0cnVjdHVyZTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3JldDsKKyAgR3N0U3RhdGUgc3RhdGU7CisgIGdpbnQgZXZlbnRfdHlwZTsKKyAgZ2Jvb2xlYW4gc3RhcnQ7CisgIGdpbnQgbWV0aG9kOworICBHc3RDbG9ja1RpbWUgbGFzdF9zdG9wOworICBnaW50IGV2ZW50X251bWJlcjsKKyAgZ2ludCBldmVudF92b2x1bWU7CisgIGdib29sZWFuIGNvcnJlY3Rfb3JkZXI7CisKKyAgc3JldCA9IGdzdF9lbGVtZW50X2dldF9zdGF0ZSAoR1NUX0VMRU1FTlQgKGR0bWZzcmMpLCAmc3RhdGUsIE5VTEwsIDApOworICBpZiAoc3JldCAhPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MgfHwgc3RhdGUgIT0gR1NUX1NUQVRFX1BMQVlJTkcpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkdG1mc3JjLCAiZHRtZi1ldmVudCwgYnV0IG5vdCBpbiBQTEFZSU5HIHN0YXRlIik7CisgICAgZ290byBmYWlsdXJlOworICB9CisKKyAgZXZlbnRfc3RydWN0dXJlID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUgKGV2ZW50KTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoZXZlbnRfc3RydWN0dXJlLCAidHlwZSIsICZldmVudF90eXBlKSB8fAorICAgICAgIWdzdF9zdHJ1Y3R1cmVfZ2V0X2Jvb2xlYW4gKGV2ZW50X3N0cnVjdHVyZSwgInN0YXJ0IiwgJnN0YXJ0KSB8fAorICAgICAgKHN0YXJ0ID09IFRSVUUgJiYgZXZlbnRfdHlwZSAhPSBHU1RfVE9ORV9EVE1GX1RZUEVfRVZFTlQpKQorICAgIGdvdG8gZmFpbHVyZTsKKworICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChldmVudF9zdHJ1Y3R1cmUsICJtZXRob2QiLCAmbWV0aG9kKSkgeworICAgIGlmIChtZXRob2QgIT0gMikgeworICAgICAgZ290byBmYWlsdXJlOworICAgIH0KKyAgfQorCisgIGlmIChzdGFydCkKKyAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoZXZlbnRfc3RydWN0dXJlLCAibnVtYmVyIiwgJmV2ZW50X251bWJlcikgfHwKKyAgICAgICAgIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoZXZlbnRfc3RydWN0dXJlLCAidm9sdW1lIiwgJmV2ZW50X3ZvbHVtZSkpCisgICAgICBnb3RvIGZhaWx1cmU7CisKKworICBHU1RfT0JKRUNUX0xPQ0sgKGR0bWZzcmMpOworICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfY2xvY2tfdGltZSAoZXZlbnRfc3RydWN0dXJlLCAibGFzdC1zdG9wIiwgJmxhc3Rfc3RvcCkpCisgICAgZHRtZnNyYy0+bGFzdF9zdG9wID0gbGFzdF9zdG9wOworICBlbHNlCisgICAgZHRtZnNyYy0+bGFzdF9zdG9wID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgY29ycmVjdF9vcmRlciA9IChzdGFydCAhPSBkdG1mc3JjLT5sYXN0X2V2ZW50X3dhc19zdGFydCk7CisgIGR0bWZzcmMtPmxhc3RfZXZlbnRfd2FzX3N0YXJ0ID0gc3RhcnQ7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdG1mc3JjKTsKKworICBpZiAoIWNvcnJlY3Rfb3JkZXIpCisgICAgZ290byBmYWlsdXJlOworCisgIGlmIChzdGFydCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJSZWNlaXZlZCBzdGFydCBldmVudCAlZCB3aXRoIHZvbHVtZSAlZCIsCisgICAgICAgIGV2ZW50X251bWJlciwgZXZlbnRfdm9sdW1lKTsKKyAgICBnc3RfZHRtZl9zcmNfYWRkX3N0YXJ0X2V2ZW50IChkdG1mc3JjLCBldmVudF9udW1iZXIsIGV2ZW50X3ZvbHVtZSk7CisgIH0KKworICBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkdG1mc3JjLCAiUmVjZWl2ZWQgc3RvcCBldmVudCIpOworICAgIGdzdF9kdG1mX3NyY19hZGRfc3RvcF9ldmVudCAoZHRtZnNyYyk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK2ZhaWx1cmU6CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZHRtZl9zcmNfaGFuZGxlX2V2ZW50IChHc3RCYXNlU3JjICogc3JjLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3REVE1GU3JjICpkdG1mc3JjOworICBnYm9vbGVhbiByZXN1bHQgPSBGQUxTRTsKKworICBkdG1mc3JjID0gR1NUX0RUTUZfU1JDIChzcmMpOworCisgIEdTVF9MT0dfT0JKRUNUIChkdG1mc3JjLCAiUmVjZWl2ZWQgYW4gJXMgZXZlbnQgb24gdGhlIHNyYyBwYWQiLAorICAgICAgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU06CisgICAgICBpZiAoZ3N0X2V2ZW50X2hhc19uYW1lIChldmVudCwgImR0bWYtZXZlbnQiKSkgeworICAgICAgICByZXN1bHQgPSBnc3RfZHRtZl9zcmNfaGFuZGxlX2R0bWZfZXZlbnQgKGR0bWZzcmMsIGV2ZW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBkZWZhdWx0OgorICAgICAgcmVzdWx0ID0gR1NUX0JBU0VfU1JDX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5ldmVudCAoc3JjLCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3RfZHRtZl9zcmNfc2VuZF9ldmVudCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdERUTUZTcmMgKmR0bWZzcmMgPSBHU1RfRFRNRl9TUkMgKGVsZW1lbnQpOworICBnYm9vbGVhbiByZXQ7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGR0bWZzcmMsICJSZWNlaXZlZCBhbiAlcyBldmVudCB2aWEgc2VuZF9ldmVudCIsCisgICAgICBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NVU1RPTV9CT1RIOgorICAgIGNhc2UgR1NUX0VWRU5UX0NVU1RPTV9CT1RIX09PQjoKKyAgICBjYXNlIEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU06CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX0RPV05TVFJFQU06CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX0RPV05TVFJFQU1fT09COgorICAgICAgaWYgKGdzdF9ldmVudF9oYXNfbmFtZSAoZXZlbnQsICJkdG1mLWV2ZW50IikpIHsKKyAgICAgICAgcmV0ID0gZ3N0X2R0bWZfc3JjX2hhbmRsZV9kdG1mX2V2ZW50IChkdG1mc3JjLCBldmVudCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zZW5kX2V2ZW50IChlbGVtZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZHRtZl9zcmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdERUTUZTcmMgKmR0bWZzcmM7CisKKyAgZHRtZnNyYyA9IEdTVF9EVE1GX1NSQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfSU5URVJWQUw6CisgICAgICBkdG1mc3JjLT5pbnRlcnZhbCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9kdG1mX3NyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0RFRNRlNyYyAqZHRtZnNyYzsKKworICBkdG1mc3JjID0gR1NUX0RUTUZfU1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9JTlRFUlZBTDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBkdG1mc3JjLT5pbnRlcnZhbCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZHRtZl9wcmVwYXJlX3RpbWVzdGFtcHMgKEdzdERUTUZTcmMgKiBkdG1mc3JjKQoreworICBHc3RDbG9ja1RpbWUgbGFzdF9zdG9wOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZHRtZnNyYyk7CisgIGxhc3Rfc3RvcCA9IGR0bWZzcmMtPmxhc3Rfc3RvcDsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGR0bWZzcmMpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAobGFzdF9zdG9wKSkgeworICAgIHRpbWVzdGFtcCA9IGxhc3Rfc3RvcDsKKyAgfSBlbHNlIHsKKyAgICBHc3RDbG9jayAqY2xvY2s7CisKKyAgICAvKiBJZiB0aGVyZSBpcyBubyB2YWxpZCBzdGFydCB0aW1lLCBsZXRzIHVzZSBub3cgYXMgdGhlIHN0YXJ0IHRpbWUgKi8KKworICAgIGNsb2NrID0gZ3N0X2VsZW1lbnRfZ2V0X2Nsb2NrIChHU1RfRUxFTUVOVCAoZHRtZnNyYykpOworICAgIGlmIChjbG9jayAhPSBOVUxMKSB7CisgICAgICB0aW1lc3RhbXAgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKGNsb2NrKQorICAgICAgICAgIC0gZ3N0X2VsZW1lbnRfZ2V0X2Jhc2VfdGltZSAoR1NUX0VMRU1FTlQgKGR0bWZzcmMpKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKGNsb2NrKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2NoYXIgKmR0bWZfbmFtZSA9IGdzdF9lbGVtZW50X2dldF9uYW1lIChkdG1mc3JjKTsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGR0bWZzcmMsICJObyBjbG9jayBzZXQgZm9yIGVsZW1lbnQgJXMiLCBkdG1mX25hbWUpOworICAgICAgZHRtZnNyYy0+dGltZXN0YW1wID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICAgIGdfZnJlZSAoZHRtZl9uYW1lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvKiBNYWtlIHN1cmUgdGhlIHRpbWVzdGFtcCBhbHdheXMgZ29lcyBmb3J3YXJkICovCisgIGlmICh0aW1lc3RhbXAgPiBkdG1mc3JjLT50aW1lc3RhbXApCisgICAgZHRtZnNyYy0+dGltZXN0YW1wID0gdGltZXN0YW1wOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2R0bWZfc3JjX2FkZF9zdGFydF9ldmVudCAoR3N0RFRNRlNyYyAqIGR0bWZzcmMsIGdpbnQgZXZlbnRfbnVtYmVyLAorICAgIGdpbnQgZXZlbnRfdm9sdW1lKQoreworCisgIEdzdERUTUZTcmNFdmVudCAqZXZlbnQgPSBnX3NsaWNlX25ldzAgKEdzdERUTUZTcmNFdmVudCk7CisgIGV2ZW50LT5ldmVudF90eXBlID0gRFRNRl9FVkVOVF9UWVBFX1NUQVJUOworICBldmVudC0+c2FtcGxlID0gMDsKKyAgZXZlbnQtPmV2ZW50X251bWJlciA9IENMQU1QIChldmVudF9udW1iZXIsIE1JTl9FVkVOVCwgTUFYX0VWRU5UKTsKKyAgZXZlbnQtPnZvbHVtZSA9IENMQU1QIChldmVudF92b2x1bWUsIE1JTl9WT0xVTUUsIE1BWF9WT0xVTUUpOworCisgIGdfYXN5bmNfcXVldWVfcHVzaCAoZHRtZnNyYy0+ZXZlbnRfcXVldWUsIGV2ZW50KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kdG1mX3NyY19hZGRfc3RvcF9ldmVudCAoR3N0RFRNRlNyYyAqIGR0bWZzcmMpCit7CisKKyAgR3N0RFRNRlNyY0V2ZW50ICpldmVudCA9IGdfc2xpY2VfbmV3MCAoR3N0RFRNRlNyY0V2ZW50KTsKKyAgZXZlbnQtPmV2ZW50X3R5cGUgPSBEVE1GX0VWRU5UX1RZUEVfU1RPUDsKKyAgZXZlbnQtPnNhbXBsZSA9IDA7CisgIGV2ZW50LT5ldmVudF9udW1iZXIgPSAwOworICBldmVudC0+dm9sdW1lID0gMDsKKworICBnX2FzeW5jX3F1ZXVlX3B1c2ggKGR0bWZzcmMtPmV2ZW50X3F1ZXVlLCBldmVudCk7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X2R0bWZfc3JjX2dlbmVyYXRlX3NpbGVuY2UgKGZsb2F0IGR1cmF0aW9uLCBnaW50IHNhbXBsZV9yYXRlKQoreworICBnaW50IGJ1Zl9zaXplOworCisgIC8qIENyZWF0ZSBhIGJ1ZmZlciB3aXRoIGRhdGEgc2V0IHRvIDAgKi8KKyAgYnVmX3NpemUgPSAoKGR1cmF0aW9uIC8gMTAwMCkgKiBzYW1wbGVfcmF0ZSAqIFNBTVBMRV9TSVpFICogQ0hBTk5FTFMpIC8gODsKKworICByZXR1cm4gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZ19tYWxsb2MwIChidWZfc2l6ZSksIGJ1Zl9zaXplKTsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfZHRtZl9zcmNfZ2VuZXJhdGVfdG9uZSAoR3N0RFRNRlNyY0V2ZW50ICogZXZlbnQsIERUTUZfS0VZIGtleSwKKyAgICBmbG9hdCBkdXJhdGlvbiwgZ2ludCBzYW1wbGVfcmF0ZSkKK3sKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIEdzdE1hcEluZm8gbWFwOworICBnaW50MTYgKnA7CisgIGdpbnQgdG9uZV9zaXplOworICBkb3VibGUgaSA9IDA7CisgIGRvdWJsZSBhbXBsaXR1ZGUsIGYxLCBmMjsKKyAgZG91YmxlIHZvbHVtZV9mYWN0b3I7CisgIHN0YXRpYyBHc3RBbGxvY2F0aW9uUGFyYW1zIHBhcmFtcyA9IHsgMCwgMSwgMCwgMCwgfTsKKworICAvKiBDcmVhdGUgYSBidWZmZXIgZm9yIHRoZSB0b25lICovCisgIHRvbmVfc2l6ZSA9ICgoZHVyYXRpb24gLyAxMDAwKSAqIHNhbXBsZV9yYXRlICogU0FNUExFX1NJWkUgKiBDSEFOTkVMUykgLyA4OworCisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCB0b25lX3NpemUsICZwYXJhbXMpOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgcCA9IChnaW50MTYgKikgbWFwLmRhdGE7CisKKyAgdm9sdW1lX2ZhY3RvciA9IHBvdyAoMTAsICgtZXZlbnQtPnZvbHVtZSkgLyAyMCk7CisKKyAgLyoKKyAgICogRm9yIGVhY2ggc2FtcGxlIHBvaW50IHdlIGNhbGN1bGF0ZSAneCcgYXMgdGhlCisgICAqIHRoZSBhbXBsaXR1ZGUgdmFsdWUuCisgICAqLworICBmb3IgKGkgPSAwOyBpIDwgKHRvbmVfc2l6ZSAvIChTQU1QTEVfU0laRSAvIDgpKTsgaSsrKSB7CisgICAgLyoKKyAgICAgKiBXZSBhZGQgdGhlIGZ1bmRhbWVudGFsIGZyZXF1ZW5jaWVzIHRvZ2V0aGVyLgorICAgICAqLworICAgIGYxID0gc2luICgyICogTV9QSSAqIGtleS5sb3dfZnJlcXVlbmN5ICogKGV2ZW50LT5zYW1wbGUgLyBzYW1wbGVfcmF0ZSkpOworICAgIGYyID0gc2luICgyICogTV9QSSAqIGtleS5oaWdoX2ZyZXF1ZW5jeSAqIChldmVudC0+c2FtcGxlIC8gc2FtcGxlX3JhdGUpKTsKKworICAgIGFtcGxpdHVkZSA9IChmMSArIGYyKSAvIDI7CisKKyAgICAvKiBBZGp1c3QgdGhlIHZvbHVtZSAqLworICAgIGFtcGxpdHVkZSAqPSB2b2x1bWVfZmFjdG9yOworCisgICAgLyogTWFrZSB0aGUgWy0xOjFdIGludGVydmFsIGludG8gYSBbLTMyNzY3OjMyNzY3XSBpbnRlcnZhbCAqLworICAgIGFtcGxpdHVkZSAqPSAzMjc2NzsKKworICAgIC8qIFN0b3JlIGl0IGluIHRoZSBkYXRhIGJ1ZmZlciAqLworICAgICoocCsrKSA9IChnaW50MTYpIGFtcGxpdHVkZTsKKworICAgIChldmVudC0+c2FtcGxlKSsrOworICB9CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICByZXR1cm4gYnVmZmVyOworfQorCisKKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfZHRtZl9zcmNfY3JlYXRlX25leHRfdG9uZV9wYWNrZXQgKEdzdERUTUZTcmMgKiBkdG1mc3JjLAorICAgIEdzdERUTUZTcmNFdmVudCAqIGV2ZW50KQoreworICBHc3RCdWZmZXIgKmJ1ZiA9IE5VTEw7CisgIGdib29sZWFuIHNlbmRfc2lsZW5jZSA9IEZBTFNFOworCisgIEdTVF9MT0dfT0JKRUNUIChkdG1mc3JjLCAiQ3JlYXRpbmcgYnVmZmVyIGZvciB0b25lICVzIiwKKyAgICAgIERUTUZfS0VZU1tldmVudC0+ZXZlbnRfbnVtYmVyXS5ldmVudF9uYW1lKTsKKworICBpZiAoZXZlbnQtPnBhY2tldF9jb3VudCAqIGR0bWZzcmMtPmludGVydmFsIDwgTUlOX0lOVEVSX0RJR0lUX0lOVEVSVkFMKSB7CisgICAgc2VuZF9zaWxlbmNlID0gVFJVRTsKKyAgfQorCisgIGlmIChzZW5kX3NpbGVuY2UpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoZHRtZnNyYywgIkdlbmVyYXRpbmcgc2lsZW5jZSIpOworICAgIGJ1ZiA9IGdzdF9kdG1mX3NyY19nZW5lcmF0ZV9zaWxlbmNlIChkdG1mc3JjLT5pbnRlcnZhbCwKKyAgICAgICAgZHRtZnNyYy0+c2FtcGxlX3JhdGUpOworICB9IGVsc2UgeworICAgIEdTVF9MT0dfT0JKRUNUIChkdG1mc3JjLCAiR2VuZXJhdGluZyB0b25lIik7CisgICAgYnVmID0gZ3N0X2R0bWZfc3JjX2dlbmVyYXRlX3RvbmUgKGV2ZW50LCBEVE1GX0tFWVNbZXZlbnQtPmV2ZW50X251bWJlcl0sCisgICAgICAgIGR0bWZzcmMtPmludGVydmFsLCBkdG1mc3JjLT5zYW1wbGVfcmF0ZSk7CisgIH0KKyAgZXZlbnQtPnBhY2tldF9jb3VudCsrOworCisKKyAgLyogdGltZXN0YW1wIGFuZCBkdXJhdGlvbiBvZiBHc3RCdWZmZXIgKi8KKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKSA9IGR0bWZzcmMtPmludGVydmFsICogR1NUX01TRUNPTkQ7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpID0gZHRtZnNyYy0+dGltZXN0YW1wOworCisgIEdTVF9MT0dfT0JKRUNUIChkdG1mc3JjLCAiQ3JlYXRpbmcgbmV3IGJ1ZmZlciB3aXRoIGV2ZW50ICV1IGR1cmF0aW9uICIKKyAgICAgICIgZ3N0OiAlIiBHU1RfVElNRV9GT1JNQVQgIiBhdCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBldmVudC0+ZXZlbnRfbnVtYmVyLCBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpKSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpKSk7CisKKyAgZHRtZnNyYy0+dGltZXN0YW1wICs9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1Zik7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kdG1mX3NyY19wb3N0X21lc3NhZ2UgKEdzdERUTUZTcmMgKiBkdG1mc3JjLCBjb25zdCBnY2hhciAqIG1lc3NhZ2VfbmFtZSwKKyAgICBHc3REVE1GU3JjRXZlbnQgKiBldmVudCkKK3sKKyAgR3N0U3RydWN0dXJlICpzID0gTlVMTDsKKworICBzd2l0Y2ggKGV2ZW50LT5ldmVudF90eXBlKSB7CisgICAgY2FzZSBEVE1GX0VWRU5UX1RZUEVfU1RBUlQ6CisgICAgICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKG1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAidHlwZSIsIEdfVFlQRV9JTlQsIDEsCisgICAgICAgICAgIm1ldGhvZCIsIEdfVFlQRV9JTlQsIDIsCisgICAgICAgICAgInN0YXJ0IiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsCisgICAgICAgICAgIm51bWJlciIsIEdfVFlQRV9JTlQsIGV2ZW50LT5ldmVudF9udW1iZXIsCisgICAgICAgICAgInZvbHVtZSIsIEdfVFlQRV9JTlQsIGV2ZW50LT52b2x1bWUsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEVE1GX0VWRU5UX1RZUEVfU1RPUDoKKyAgICAgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAobWVzc2FnZV9uYW1lLAorICAgICAgICAgICJ0eXBlIiwgR19UWVBFX0lOVCwgMSwgIm1ldGhvZCIsIEdfVFlQRV9JTlQsIDIsCisgICAgICAgICAgInN0YXJ0IiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFRNRl9FVkVOVF9UWVBFX1BBVVNFX1RBU0s6CisgICAgICByZXR1cm47CisgIH0KKworICBpZiAocykKKyAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UIChkdG1mc3JjKSwKKyAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2VsZW1lbnQgKEdTVF9PQkpFQ1QgKGR0bWZzcmMpLCBzKSk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZHRtZl9zcmNfY3JlYXRlIChHc3RCYXNlU3JjICogYmFzZXNyYywgZ3VpbnQ2NCBvZmZzZXQsCisgICAgZ3VpbnQgbGVuZ3RoLCBHc3RCdWZmZXIgKiogYnVmZmVyKQoreworICBHc3RCdWZmZXIgKmJ1ZiA9IE5VTEw7CisgIEdzdERUTUZTcmNFdmVudCAqZXZlbnQ7CisgIEdzdERUTUZTcmMgKmR0bWZzcmM7CisgIEdzdENsb2NrICpjbG9jazsKKyAgR3N0Q2xvY2tJRCAqY2xvY2tpZDsKKyAgR3N0Q2xvY2tSZXR1cm4gY2xvY2tyZXQ7CisKKyAgZHRtZnNyYyA9IEdTVF9EVE1GX1NSQyAoYmFzZXNyYyk7CisKKyAgZG8geworCisgICAgaWYgKGR0bWZzcmMtPmxhc3RfZXZlbnQgPT0gTlVMTCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgInBvcHBpbmciKTsKKyAgICAgIGV2ZW50ID0gZ19hc3luY19xdWV1ZV9wb3AgKGR0bWZzcmMtPmV2ZW50X3F1ZXVlKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgInBvcHBlZCAlZCIsIGV2ZW50LT5ldmVudF90eXBlKTsKKworICAgICAgc3dpdGNoIChldmVudC0+ZXZlbnRfdHlwZSkgeworICAgICAgICBjYXNlIERUTUZfRVZFTlRfVFlQRV9TVE9QOgorICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZHRtZnNyYywKKyAgICAgICAgICAgICAgIlJlY2VpdmVkIGEgRFRNRiBzdG9wIGV2ZW50IHdoZW4gYWxyZWFkeSBzdG9wcGVkIik7CisgICAgICAgICAgZ3N0X2R0bWZfc3JjX3Bvc3RfbWVzc2FnZSAoZHRtZnNyYywgImR0bWYtZXZlbnQtZHJvcHBlZCIsIGV2ZW50KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEVE1GX0VWRU5UX1RZUEVfU1RBUlQ6CisgICAgICAgICAgZ3N0X2R0bWZfcHJlcGFyZV90aW1lc3RhbXBzIChkdG1mc3JjKTsKKworICAgICAgICAgIGV2ZW50LT5wYWNrZXRfY291bnQgPSAwOworICAgICAgICAgIGR0bWZzcmMtPmxhc3RfZXZlbnQgPSBldmVudDsKKyAgICAgICAgICBldmVudCA9IE5VTEw7CisgICAgICAgICAgZ3N0X2R0bWZfc3JjX3Bvc3RfbWVzc2FnZSAoZHRtZnNyYywgImR0bWYtZXZlbnQtcHJvY2Vzc2VkIiwKKyAgICAgICAgICAgICAgZHRtZnNyYy0+bGFzdF9ldmVudCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRFRNRl9FVkVOVF9UWVBFX1BBVVNFX1RBU0s6CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBXZSdyZSBwdXNoaW5nIGl0IGJhY2sgYmVjYXVzZSBpdCBoYXMgdG8gc3RheSBpbiB0aGVyZSB1bnRpbAorICAgICAgICAgICAqIHRoZSB0YXNrIGlzIHJlYWxseSBwYXVzZWQgKGFuZCB0aGUgcXVldWUgd2lsbCB0aGVuIGJlIGZsdXNoZWQpCisgICAgICAgICAgICovCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgInB1c2hpbmcgcGF1c2VfdGFzay4uLiIpOworICAgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZHRtZnNyYyk7CisgICAgICAgICAgaWYgKGR0bWZzcmMtPnBhdXNlZCkgeworICAgICAgICAgICAgZ19hc3luY19xdWV1ZV9wdXNoIChkdG1mc3JjLT5ldmVudF9xdWV1ZSwgZXZlbnQpOworICAgICAgICAgICAgZ290byBwYXVzZWRfbG9ja2VkOworICAgICAgICAgIH0KKyAgICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZHRtZnNyYyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoZXZlbnQpCisgICAgICAgIGdfc2xpY2VfZnJlZSAoR3N0RFRNRlNyY0V2ZW50LCBldmVudCk7CisgICAgfSBlbHNlIGlmIChkdG1mc3JjLT5sYXN0X2V2ZW50LT5wYWNrZXRfY291bnQgKiBkdG1mc3JjLT5pbnRlcnZhbCA+PQorICAgICAgICBNSU5fRFVUWV9DWUNMRSkgeworICAgICAgZXZlbnQgPSBnX2FzeW5jX3F1ZXVlX3RyeV9wb3AgKGR0bWZzcmMtPmV2ZW50X3F1ZXVlKTsKKworICAgICAgaWYgKGV2ZW50ICE9IE5VTEwpIHsKKworICAgICAgICBzd2l0Y2ggKGV2ZW50LT5ldmVudF90eXBlKSB7CisgICAgICAgICAgY2FzZSBEVE1GX0VWRU5UX1RZUEVfU1RBUlQ6CisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGR0bWZzcmMsCisgICAgICAgICAgICAgICAgIlJlY2VpdmVkIHR3byBjb25zZWN1dGl2ZSBEVE1GIHN0YXJ0IGV2ZW50cyIpOworICAgICAgICAgICAgZ3N0X2R0bWZfc3JjX3Bvc3RfbWVzc2FnZSAoZHRtZnNyYywgImR0bWYtZXZlbnQtZHJvcHBlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRFRNRl9FVkVOVF9UWVBFX1NUT1A6CisgICAgICAgICAgICBnX3NsaWNlX2ZyZWUgKEdzdERUTUZTcmNFdmVudCwgZHRtZnNyYy0+bGFzdF9ldmVudCk7CisgICAgICAgICAgICBkdG1mc3JjLT5sYXN0X2V2ZW50ID0gTlVMTDsKKyAgICAgICAgICAgIGdzdF9kdG1mX3NyY19wb3N0X21lc3NhZ2UgKGR0bWZzcmMsICJkdG1mLWV2ZW50LXByb2Nlc3NlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRFRNRl9FVkVOVF9UWVBFX1BBVVNFX1RBU0s6CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogV2UncmUgcHVzaGluZyBpdCBiYWNrIGJlY2F1c2UgaXQgaGFzIHRvIHN0YXkgaW4gdGhlcmUgdW50aWwKKyAgICAgICAgICAgICAqIHRoZSB0YXNrIGlzIHJlYWxseSBwYXVzZWQgKGFuZCB0aGUgcXVldWUgd2lsbCB0aGVuIGJlIGZsdXNoZWQpCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJwdXNoaW5nIHBhdXNlX3Rhc2suLi4iKTsKKworICAgICAgICAgICAgR1NUX09CSkVDVF9MT0NLIChkdG1mc3JjKTsKKyAgICAgICAgICAgIGlmIChkdG1mc3JjLT5wYXVzZWQpIHsKKyAgICAgICAgICAgICAgZ19hc3luY19xdWV1ZV9wdXNoIChkdG1mc3JjLT5ldmVudF9xdWV1ZSwgZXZlbnQpOworICAgICAgICAgICAgICBnb3RvIHBhdXNlZF9sb2NrZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZHRtZnNyYyk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGdfc2xpY2VfZnJlZSAoR3N0RFRNRlNyY0V2ZW50LCBldmVudCk7CisgICAgICB9CisgICAgfQorICB9IHdoaWxlIChkdG1mc3JjLT5sYXN0X2V2ZW50ID09IE5VTEwpOworCisgIEdTVF9MT0dfT0JKRUNUIChkdG1mc3JjLCAiZW5kIGV2ZW50IGNoZWNrLCBub3cgd2FpdCBmb3IgdGhlIHByb3BlciB0aW1lIik7CisKKyAgY2xvY2sgPSBnc3RfZWxlbWVudF9nZXRfY2xvY2sgKEdTVF9FTEVNRU5UIChiYXNlc3JjKSk7CisKKyAgY2xvY2tpZCA9IGdzdF9jbG9ja19uZXdfc2luZ2xlX3Nob3RfaWQgKGNsb2NrLCBkdG1mc3JjLT50aW1lc3RhbXAgKworICAgICAgZ3N0X2VsZW1lbnRfZ2V0X2Jhc2VfdGltZSAoR1NUX0VMRU1FTlQgKGR0bWZzcmMpKSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGNsb2NrKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGR0bWZzcmMpOworICBpZiAoIWR0bWZzcmMtPnBhdXNlZCkgeworICAgIGR0bWZzcmMtPmNsb2NraWQgPSBjbG9ja2lkOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdG1mc3JjKTsKKworICAgIGNsb2NrcmV0ID0gZ3N0X2Nsb2NrX2lkX3dhaXQgKGNsb2NraWQsIE5VTEwpOworCisgICAgR1NUX09CSkVDVF9MT0NLIChkdG1mc3JjKTsKKyAgICBpZiAoZHRtZnNyYy0+cGF1c2VkKQorICAgICAgY2xvY2tyZXQgPSBHU1RfQ0xPQ0tfVU5TQ0hFRFVMRUQ7CisgIH0gZWxzZSB7CisgICAgY2xvY2tyZXQgPSBHU1RfQ0xPQ0tfVU5TQ0hFRFVMRUQ7CisgIH0KKyAgZ3N0X2Nsb2NrX2lkX3VucmVmIChjbG9ja2lkKTsKKyAgZHRtZnNyYy0+Y2xvY2tpZCA9IE5VTEw7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdG1mc3JjKTsKKworICBpZiAoY2xvY2tyZXQgPT0gR1NUX0NMT0NLX1VOU0NIRURVTEVEKSB7CisgICAgZ290byBwYXVzZWQ7CisgIH0KKworICBidWYgPSBnc3RfZHRtZl9zcmNfY3JlYXRlX25leHRfdG9uZV9wYWNrZXQgKGR0bWZzcmMsIGR0bWZzcmMtPmxhc3RfZXZlbnQpOworCisgIEdTVF9MT0dfT0JKRUNUIChkdG1mc3JjLCAiQ3JlYXRlZCBidWZmZXIgb2Ygc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikpOworICAqYnVmZmVyID0gYnVmOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworcGF1c2VkX2xvY2tlZDoKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGR0bWZzcmMpOworCitwYXVzZWQ6CisKKyAgaWYgKGR0bWZzcmMtPmxhc3RfZXZlbnQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkdG1mc3JjLCAiU3RvcHBpbmcgY3VycmVudCBldmVudCIpOworICAgIC8qIERvbid0IGZvcmdldCB0byByZWxlYXNlIHRoZSBzdHJlYW0gbG9jayAqLworICAgIGdfc2xpY2VfZnJlZSAoR3N0RFRNRlNyY0V2ZW50LCBkdG1mc3JjLT5sYXN0X2V2ZW50KTsKKyAgICBkdG1mc3JjLT5sYXN0X2V2ZW50ID0gTlVMTDsKKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19GTFVTSElORzsKKworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdG1mX3NyY191bmxvY2sgKEdzdEJhc2VTcmMgKiBzcmMpCit7CisgIEdzdERUTUZTcmMgKmR0bWZzcmMgPSBHU1RfRFRNRl9TUkMgKHNyYyk7CisgIEdzdERUTUZTcmNFdmVudCAqZXZlbnQgPSBOVUxMOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJDYWxsZWQgdW5sb2NrIik7CisKKyAgR1NUX09CSkVDVF9MT0NLIChkdG1mc3JjKTsKKyAgZHRtZnNyYy0+cGF1c2VkID0gVFJVRTsKKyAgaWYgKGR0bWZzcmMtPmNsb2NraWQpIHsKKyAgICBnc3RfY2xvY2tfaWRfdW5zY2hlZHVsZSAoZHRtZnNyYy0+Y2xvY2tpZCk7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGR0bWZzcmMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJQdXNoaW5nIHRoZSBQQVVTRV9UQVNLIGV2ZW50IG9uIHVubG9jayByZXF1ZXN0Iik7CisgIGV2ZW50ID0gZ19zbGljZV9uZXcwIChHc3REVE1GU3JjRXZlbnQpOworICBldmVudC0+ZXZlbnRfdHlwZSA9IERUTUZfRVZFTlRfVFlQRV9QQVVTRV9UQVNLOworICBnX2FzeW5jX3F1ZXVlX3B1c2ggKGR0bWZzcmMtPmV2ZW50X3F1ZXVlLCBldmVudCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3RfZHRtZl9zcmNfdW5sb2NrX3N0b3AgKEdzdEJhc2VTcmMgKiBzcmMpCit7CisgIEdzdERUTUZTcmMgKmR0bWZzcmMgPSBHU1RfRFRNRl9TUkMgKHNyYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgIlVubG9jayBzdG9wcGVkIik7CisKKyAgR1NUX09CSkVDVF9MT0NLIChkdG1mc3JjKTsKKyAgZHRtZnNyYy0+cGF1c2VkID0gRkFMU0U7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdG1mc3JjKTsKKworICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdG1mX3NyY19uZWdvdGlhdGUgKEdzdEJhc2VTcmMgKiBiYXNlc3JjKQoreworICBHc3REVE1GU3JjICpkdG1mc3JjID0gR1NUX0RUTUZfU1JDIChiYXNlc3JjKTsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0U3RydWN0dXJlICpzOworICBnYm9vbGVhbiByZXQ7CisKKyAgY2FwcyA9IGdzdF9wYWRfZ2V0X2FsbG93ZWRfY2FwcyAoR1NUX0JBU0VfU1JDX1BBRCAoYmFzZXNyYykpOworCisgIGlmICghY2FwcykKKyAgICBjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9CQVNFX1NSQ19QQUQgKGJhc2VzcmMpKTsKKworICBpZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKGNhcHMpKSB7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGNhcHMgPSBnc3RfY2Fwc190cnVuY2F0ZSAoY2Fwcyk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGNhcHMpOworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGRfbmVhcmVzdF9pbnQgKHMsICJyYXRlIiwgREVGQVVMVF9TQU1QTEVfUkFURSk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJyYXRlIiwgJmR0bWZzcmMtPnNhbXBsZV9yYXRlKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGR0bWZzcmMsICJDb3VsZCBub3QgZ2V0IHJhdGUiKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0ID0gZ3N0X3BhZF9zZXRfY2FwcyAoR1NUX0JBU0VfU1JDX1BBRCAoYmFzZXNyYyksIGNhcHMpOworCisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdG1mX3NyY19xdWVyeSAoR3N0QmFzZVNyYyAqIGJhc2VzcmMsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdERUTUZTcmMgKmR0bWZzcmMgPSBHU1RfRFRNRl9TUkMgKGJhc2VzcmMpOworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9MQVRFTkNZOgorICAgIHsKKyAgICAgIEdzdENsb2NrVGltZSBsYXRlbmN5OworCisgICAgICBsYXRlbmN5ID0gZHRtZnNyYy0+aW50ZXJ2YWwgKiBHU1RfTVNFQ09ORDsKKyAgICAgIGdzdF9xdWVyeV9zZXRfbGF0ZW5jeSAocXVlcnksIGdzdF9iYXNlX3NyY19pc19saXZlIChiYXNlc3JjKSwgbGF0ZW5jeSwKKyAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJSZXBvcnRpbmcgbGF0ZW5jeSBvZiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAobGF0ZW5jeSkpOworICAgICAgcmVzID0gVFJVRTsKKyAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gR1NUX0JBU0VfU1JDX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5xdWVyeSAoYmFzZXNyYywgcXVlcnkpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9kdG1mX3NyY19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3REVE1GU3JjICpkdG1mc3JjOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXN1bHQ7CisgIGdib29sZWFuIG5vX3ByZXJvbGwgPSBGQUxTRTsKKyAgR3N0RFRNRlNyY0V2ZW50ICpldmVudCA9IE5VTEw7CisKKyAgZHRtZnNyYyA9IEdTVF9EVE1GX1NSQyAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIC8qIEZsdXNoaW5nIHRoZSBldmVudCBxdWV1ZSAqLworICAgICAgZXZlbnQgPSBnX2FzeW5jX3F1ZXVlX3RyeV9wb3AgKGR0bWZzcmMtPmV2ZW50X3F1ZXVlKTsKKworICAgICAgd2hpbGUgKGV2ZW50ICE9IE5VTEwpIHsKKyAgICAgICAgZ3N0X2R0bWZfc3JjX3Bvc3RfbWVzc2FnZSAoZHRtZnNyYywgImR0bWYtZXZlbnQtZHJvcHBlZCIsIGV2ZW50KTsKKyAgICAgICAgZ19zbGljZV9mcmVlIChHc3REVE1GU3JjRXZlbnQsIGV2ZW50KTsKKyAgICAgICAgZXZlbnQgPSBnX2FzeW5jX3F1ZXVlX3RyeV9wb3AgKGR0bWZzcmMtPmV2ZW50X3F1ZXVlKTsKKyAgICAgIH0KKyAgICAgIGR0bWZzcmMtPmxhc3RfZXZlbnRfd2FzX3N0YXJ0ID0gRkFMU0U7CisgICAgICBkdG1mc3JjLT50aW1lc3RhbXAgPSAwOworICAgICAgbm9fcHJlcm9sbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoKHJlc3VsdCA9CisgICAgICAgICAgR1NUX0VMRU1FTlRfQ0xBU1MgKGdzdF9kdG1mX3NyY19wYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsCisgICAgICAgICAgICAgIHRyYW5zaXRpb24pKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpCisgICAgZ290byBmYWlsdXJlOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QTEFZSU5HX1RPX1BBVVNFRDoKKyAgICAgIG5vX3ByZXJvbGwgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJGbHVzaGluZyBldmVudCBxdWV1ZSIpOworICAgICAgLyogRmx1c2hpbmcgdGhlIGV2ZW50IHF1ZXVlICovCisgICAgICBldmVudCA9IGdfYXN5bmNfcXVldWVfdHJ5X3BvcCAoZHRtZnNyYy0+ZXZlbnRfcXVldWUpOworCisgICAgICB3aGlsZSAoZXZlbnQgIT0gTlVMTCkgeworICAgICAgICBnc3RfZHRtZl9zcmNfcG9zdF9tZXNzYWdlIChkdG1mc3JjLCAiZHRtZi1ldmVudC1kcm9wcGVkIiwgZXZlbnQpOworICAgICAgICBnX3NsaWNlX2ZyZWUgKEdzdERUTUZTcmNFdmVudCwgZXZlbnQpOworICAgICAgICBldmVudCA9IGdfYXN5bmNfcXVldWVfdHJ5X3BvcCAoZHRtZnNyYy0+ZXZlbnRfcXVldWUpOworICAgICAgfQorICAgICAgZHRtZnNyYy0+bGFzdF9ldmVudF93YXNfc3RhcnQgPSBGQUxTRTsKKworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKG5vX3ByZXJvbGwgJiYgcmVzdWx0ID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUykKKyAgICByZXN1bHQgPSBHU1RfU1RBVEVfQ0hBTkdFX05PX1BSRVJPTEw7CisKKyAgcmV0dXJuIHJlc3VsdDsKKworICAvKiBFUlJPUlMgKi8KK2ZhaWx1cmU6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkdG1mc3JjLCAicGFyZW50IGZhaWxlZCBzdGF0ZSBjaGFuZ2UiKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKK2dib29sZWFuCitnc3RfZHRtZl9zcmNfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJkdG1mc3JjIiwKKyAgICAgIEdTVF9SQU5LX05PTkUsIEdTVF9UWVBFX0RUTUZfU1JDKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9kdG1mL2dzdGR0bWZzcmMuaCBiL2dzdC9kdG1mL2dzdGR0bWZzcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDQ0MGJjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5oCkBAIC0wLDAgKzEsMTAxIEBACisvKiBHU3RyZWFtZXIgRFRNRiBzb3VyY2UKKyAqCisgKiBnc3RkdG1mc3JjLmg6CisgKgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gQ29sbGFib3JhLgorICogICBDb250YWN0OiBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gTm9raWEgQ29ycG9yYXRpb24uCisgKiAgIENvbnRhY3Q6IFplZXNoYW4gQWxpIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfRFRNRl9TUkNfSF9fCisjZGVmaW5lIF9fR1NUX0RUTUZfU1JDX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9nc3RidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNlc3JjLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfRFRNRl9TUkMgICAgICAgICAgICAgICAoZ3N0X2R0bWZfc3JjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9EVE1GX1NSQyhvYmopICAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0RUTUZfU1JDLEdzdERUTUZTcmMpKQorI2RlZmluZSBHU1RfRFRNRl9TUkNfQ0xBU1Moa2xhc3MpICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0RUTUZfU1JDLEdzdERUTUZTcmNDbGFzcykpCisjZGVmaW5lIEdTVF9EVE1GX1NSQ19HRVRfQ0xBU1Mob2JqKSAgICAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9EVE1GX1NSQywgR3N0RFRNRlNyY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0RUTUZfU1JDKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfRFRNRl9TUkMpKQorI2RlZmluZSBHU1RfSVNfRFRNRl9TUkNfQ0xBU1Moa2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0RUTUZfU1JDKSkKKyNkZWZpbmUgR1NUX0RUTUZfU1JDX0NBU1Qob2JqKSAgICAgICAgICAoKEdzdERUTUZTcmMgKikob2JqKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3REVE1GU3JjIEdzdERUTUZTcmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0RFRNRlNyY0NsYXNzIEdzdERUTUZTcmNDbGFzczsKKworZW51bSBfR3N0RFRNRkV2ZW50VHlwZQoreworICBEVE1GX0VWRU5UX1RZUEVfU1RBUlQsCisgIERUTUZfRVZFTlRfVFlQRV9TVE9QLAorICBEVE1GX0VWRU5UX1RZUEVfUEFVU0VfVEFTSworfTsKKwordHlwZWRlZiBlbnVtIF9Hc3REVE1GRXZlbnRUeXBlIEdzdERUTUZFdmVudFR5cGU7CisKK3N0cnVjdCBfR3N0RFRNRlNyY0V2ZW50Cit7CisgIEdzdERUTUZFdmVudFR5cGUgZXZlbnRfdHlwZTsKKyAgZG91YmxlIHNhbXBsZTsKKyAgZ3VpbnQxNiBldmVudF9udW1iZXI7CisgIGd1aW50MTYgdm9sdW1lOworICBndWludDMyIHBhY2tldF9jb3VudDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9Hc3REVE1GU3JjRXZlbnQgR3N0RFRNRlNyY0V2ZW50OworCisvKioKKyAqIEdzdERUTUZTcmM6CisgKiBAZWxlbWVudDogdGhlIHBhcmVudCBlbGVtZW50LgorICoKKyAqIFRoZSBvcGFxdWUgI0dzdERUTUZTcmMgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0RFRNRlNyYworeworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgR3N0QmFzZVNyYyBwYXJlbnQ7CisgIEdBc3luY1F1ZXVlICpldmVudF9xdWV1ZTsKKyAgR3N0RFRNRlNyY0V2ZW50ICpsYXN0X2V2ZW50OworICBnYm9vbGVhbiBsYXN0X2V2ZW50X3dhc19zdGFydDsKKworICBndWludDE2IGludGVydmFsOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworCisgIGdib29sZWFuIHBhdXNlZDsKKyAgR3N0Q2xvY2tJRCBjbG9ja2lkOworCisgIEdzdENsb2NrVGltZSBsYXN0X3N0b3A7CisKKyAgZ2ludCBzYW1wbGVfcmF0ZTsKK307CisKKworc3RydWN0IF9Hc3REVE1GU3JjQ2xhc3MKK3sKKyAgR3N0QmFzZVNyY0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9kdG1mX3NyY19nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9kdG1mX3NyY19wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9EVE1GX1NSQ19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5jIGIvZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc4MjdiZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5jCkBAIC0wLDAgKzEsNTM0IEBACisvKiBHc3RSdHBEdG1mRGVwYXkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQ29sbGFib3JhIExpbWl0ZWQKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbgorICogICBDb250YWN0OiBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1ydHBkdG1mZGVwYXkKKyAqIEBzZWVfYWxzbzogcnRwZHRtZnNyYywgcnRwZHRtZm11eAorICoKKyAqIFRoaXMgZWxlbWVudCB0YWtlcyBSVFAgRFRNRiBwYWNrZXRzIGFuZCBwcm9kdWNlcyBzb3VuZC4gSXQgYWxzbyBlbWl0cyBhCisgKiBtZXNzYWdlIG9uIHRoZSAjR3N0QnVzLgorICoKKyAqIFRoZSBtZXNzYWdlIGlzIGNhbGxlZCAiZHRtZi1ldmVudCIgYW5kIGhhcyB0aGUgZm9sbG93aW5nIGZpZWxkcworICogPGluZm9ybWFsdGFibGU+CisgKiA8dGdyb3VwIGNvbHM9JzQnPgorICogPGNvbHNwZWMgY29sbmFtZT0nTmFtZScgLz4KKyAqIDxjb2xzcGVjIGNvbG5hbWU9J1R5cGUnIC8+CisgKiA8Y29sc3BlYyBjb2xuYW1lPSdQb3NzaWJsZSB2YWx1ZXMnIC8+CisgKiA8Y29sc3BlYyBjb2xuYW1lPSdQdXJwb3NlJyAvPgorICogPHRoZWFkPgorICogPHJvdz4KKyAqIDxlbnRyeT5OYW1lPC9lbnRyeT4KKyAqIDxlbnRyeT5HVHlwZTwvZW50cnk+CisgKiA8ZW50cnk+UG9zc2libGUgdmFsdWVzPC9lbnRyeT4KKyAqIDxlbnRyeT5QdXJwb3NlPC9lbnRyeT4KKyAqIDwvcm93PgorICogPC90aGVhZD4KKyAqIDx0Ym9keT4KKyAqIDxyb3c+CisgKiA8ZW50cnk+dHlwZTwvZW50cnk+CisgKiA8ZW50cnk+R19UWVBFX0lOVDwvZW50cnk+CisgKiA8ZW50cnk+MC0xPC9lbnRyeT4KKyAqIDxlbnRyeT5XaGljaCBvZiB0aGUgdHdvIG1ldGhvZHMKKyAqIHNwZWNpZmllZCBpbiBSRkMgMjgzMyB0byB1c2UuIFRoZSB2YWx1ZSBzaG91bGQgYmUgMCBmb3IgdG9uZXMgYW5kIDEgZm9yCisgKiBuYW1lZCBldmVudHMuIFRvbmVzIGFyZSBzcGVjaWZpZWQgYnkgdGhlaXIgZnJlcXVlbmNpZXMgYW5kIGV2ZW50cyBhcmUgc3BlY2llZAorICogYnkgdGhlaXIgbnVtYmVyLiBUaGlzIGVsZW1lbnQgY3VycmVudGx5IG9ubHkgcmVjb2duaXplcyBldmVudHMuCisgKiBEbyBub3QgY29uZnVzZSB3aXRoICJtZXRob2QiIHdoaWNoIHNwZWNpZmllZCB0aGUgb3V0cHV0LgorICogPC9lbnRyeT4KKyAqIDwvcm93PgorICogPHJvdz4KKyAqIDxlbnRyeT5udW1iZXI8L2VudHJ5PgorICogPGVudHJ5PkdfVFlQRV9JTlQ8L2VudHJ5PgorICogPGVudHJ5PjAtMTY8L2VudHJ5PgorICogPGVudHJ5PlRoZSBldmVudCBudW1iZXIuPC9lbnRyeT4KKyAqIDwvcm93PgorICogPHJvdz4KKyAqIDxlbnRyeT52b2x1bWU8L2VudHJ5PgorICogPGVudHJ5PkdfVFlQRV9JTlQ8L2VudHJ5PgorICogPGVudHJ5PjAtMzY8L2VudHJ5PgorICogPGVudHJ5PlRoaXMgZmllbGQgZGVzY3JpYmVzIHRoZSBwb3dlciBsZXZlbCBvZiB0aGUgdG9uZSwgZXhwcmVzc2VkIGluIGRCbTAKKyAqIGFmdGVyIGRyb3BwaW5nIHRoZSBzaWduLiBQb3dlciBsZXZlbHMgcmFuZ2UgZnJvbSAwIHRvIC02MyBkQm0wLiBUaGUgcmFuZ2Ugb2YKKyAqIHZhbGlkIERUTUYgaXMgZnJvbSAwIHRvIC0zNiBkQm0wLgorICogPC9lbnRyeT4KKyAqIDwvcm93PgorICogPHJvdz4KKyAqIDxlbnRyeT5tZXRob2Q8L2VudHJ5PgorICogPGVudHJ5PkdfVFlQRV9JTlQ8L2VudHJ5PgorICogPGVudHJ5PjE8L2VudHJ5PgorICogPGVudHJ5PlRoaXMgZmllbGQgd2lsbCBhbHdheXMgYmVlbiAxIChpZSBSVFAgZXZlbnQpIGZyb20gdGhpcyBlbGVtZW50LgorICogPC9lbnRyeT4KKyAqIDwvcm93PgorICogPC90Ym9keT4KKyAqIDwvdGdyb3VwPgorICogPC9pbmZvcm1hbHRhYmxlPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdHJ0cGR0bWZkZXBheS5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworI2RlZmluZSBERUZBVUxUX1BBQ0tFVF9JTlRFUlZBTCAgNTAgICAgIC8qIG1zICovCisjZGVmaW5lIE1JTl9QQUNLRVRfSU5URVJWQUwgICAgICAxMCAgICAgLyogbXMgKi8KKyNkZWZpbmUgTUFYX1BBQ0tFVF9JTlRFUlZBTCAgICAgIDUwICAgICAvKiBtcyAqLworI2RlZmluZSBTQU1QTEVfUkFURSAgICAgICAgICAgICAgODAwMAorI2RlZmluZSBTQU1QTEVfU0laRSAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgQ0hBTk5FTFMgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUlOX0RVVFlfQ1lDTEUgICAgICAgICAgIChNSU5fSU5URVJfRElHSVRfSU5URVJWQUwgKyBNSU5fUFVMU0VfRFVSQVRJT04pCisKKyNkZWZpbmUgTUlOX1VOSVRfVElNRSAgICAgICAgICAgIDAKKyNkZWZpbmUgTUFYX1VOSVRfVElNRSAgICAgICAgICAgIDEwMDAKKyNkZWZpbmUgREVGQVVMVF9VTklUX1RJTUUgICAgICAgIDAKKworI2RlZmluZSBERUZBVUxUX01BWF9EVVJBVElPTiAgICAgMAorCit0eXBlZGVmIHN0cnVjdCBzdF9kdG1mX2tleQoreworICBmbG9hdCBsb3dfZnJlcXVlbmN5OworICBmbG9hdCBoaWdoX2ZyZXF1ZW5jeTsKK30gRFRNRl9LRVk7CisKK3N0YXRpYyBjb25zdCBEVE1GX0tFWSBEVE1GX0tFWVNbXSA9IHsKKyAgezk0MSwgMTMzNn0sCisgIHs2OTcsIDEyMDl9LAorICB7Njk3LCAxMzM2fSwKKyAgezY5NywgMTQ3N30sCisgIHs3NzAsIDEyMDl9LAorICB7NzcwLCAxMzM2fSwKKyAgezc3MCwgMTQ3N30sCisgIHs4NTIsIDEyMDl9LAorICB7ODUyLCAxMzM2fSwKKyAgezg1MiwgMTQ3N30sCisgIHs5NDEsIDEyMDl9LAorICB7OTQxLCAxNDc3fSwKKyAgezY5NywgMTYzM30sCisgIHs3NzAsIDE2MzN9LAorICB7ODUyLCAxNjMzfSwKKyAgezk0MSwgMTYzM30sCit9OworCisjZGVmaW5lIE1BWF9EVE1GX0VWRU5UUyAxNgorCitlbnVtCit7CisgIERUTUZfS0VZX0VWRU5UXzEgPSAxLAorICBEVE1GX0tFWV9FVkVOVF8yID0gMiwKKyAgRFRNRl9LRVlfRVZFTlRfMyA9IDMsCisgIERUTUZfS0VZX0VWRU5UXzQgPSA0LAorICBEVE1GX0tFWV9FVkVOVF81ID0gNSwKKyAgRFRNRl9LRVlfRVZFTlRfNiA9IDYsCisgIERUTUZfS0VZX0VWRU5UXzcgPSA3LAorICBEVE1GX0tFWV9FVkVOVF84ID0gOCwKKyAgRFRNRl9LRVlfRVZFTlRfOSA9IDksCisgIERUTUZfS0VZX0VWRU5UXzAgPSAwLAorICBEVE1GX0tFWV9FVkVOVF9TVEFSID0gMTAsCisgIERUTUZfS0VZX0VWRU5UX1BPVU5EID0gMTEsCisgIERUTUZfS0VZX0VWRU5UX0EgPSAxMiwKKyAgRFRNRl9LRVlfRVZFTlRfQiA9IDEzLAorICBEVE1GX0tFWV9FVkVOVF9DID0gMTQsCisgIERUTUZfS0VZX0VWRU5UX0QgPSAxNSwKK307CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9ydHBfZHRtZl9kZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfcnRwX2R0bWZfZGVwYXlfZGVidWcKKworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9VTklUX1RJTUUsCisgIFBST1BfTUFYX0RVUkFUSU9OCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9kdG1mX2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIFwiIiBHU1RfQVVESU9fTkUgKFMxNikgIlwiLCAiCisgICAgICAgICJyYXRlID0gIiBHU1RfQVVESU9fUkFURV9SQU5HRSAiLCAiICJjaGFubmVscyA9IChpbnQpIDEiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2R0bWZfZGVwYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgWyAwLCBNQVggXSwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiVEVMRVBIT05FLUVWRU5UXCIiKQorICAgICk7CisKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cERUTUZEZXBheSwgZ3N0X3J0cF9kdG1mX2RlcGF5LAorICAgIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfZHRtZl9kZXBheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX2R0bWZfZGVwYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9kdG1mX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmKTsKK2dib29sZWFuIGdzdF9ydHBfZHRtZl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZmlsdGVyLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHRtZl9kZXBheV9jbGFzc19pbml0IChHc3RSdHBEVE1GRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfQ0xBU1MgKGtsYXNzKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2R0bWZfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9kdG1mX2RlcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfcnRwX2R0bWZfZGVwYXlfZGVidWcsCisgICAgICAicnRwZHRtZmRlcGF5IiwgMCwgInJ0cGR0bWZkZXBheSBlbGVtZW50Iik7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIERUTUYgcGFja2V0IGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsiLAorICAgICAgIkdlbmVyYXRlcyBEVE1GIFNvdW5kIGZyb20gdGVsZXBob25lLWV2ZW50IFJUUCBwYWNrZXRzIiwKKyAgICAgICJZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPiIpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kdG1mX2RlcGF5X3NldF9wcm9wZXJ0eSk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kdG1mX2RlcGF5X2dldF9wcm9wZXJ0eSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9VTklUX1RJTUUsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInVuaXQtdGltZSIsICJEdXJhdGlvbiB1bml0dGltZSIsCisgICAgICAgICAgIlRoZSBzbWFsbGVzdCB1bml0IChtcykgdGhlIGR1cmF0aW9uIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAoMCBkaXNhYmxlcyBpdCkiLAorICAgICAgICAgIE1JTl9VTklUX1RJTUUsIE1BWF9VTklUX1RJTUUsIERFRkFVTFRfVU5JVF9USU1FLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfTUFYX0RVUkFUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJtYXgtZHVyYXRpb24iLCAiTWF4aW11bSBkdXJhdGlvbiIsCisgICAgICAgICAgIlRoZSBtYXh1bWltdW0gZHVyYXRpb24gKG1zKSBvZiB0aGUgb3V0Z29pbmcgc291bmRwYWNrZXQuICIKKyAgICAgICAgICAiKDAgPSBubyBsaW1pdCkiLCAwLCBHX01BWFVJTlQsIERFRkFVTFRfTUFYX0RVUkFUSU9OLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3MgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfZHRtZl9kZXBheV9wcm9jZXNzKTsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfZHRtZl9kZXBheV9zZXRjYXBzKTsKKworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9kdG1mX2RlcGF5X2luaXQgKEdzdFJ0cERUTUZEZXBheSAqIHJ0cGR0bWZkZXBheSkKK3sKKyAgcnRwZHRtZmRlcGF5LT51bml0X3RpbWUgPSBERUZBVUxUX1VOSVRfVElNRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHRtZl9kZXBheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwRFRNRkRlcGF5ICpydHBkdG1mZGVwYXk7CisKKyAgcnRwZHRtZmRlcGF5ID0gR1NUX1JUUF9EVE1GX0RFUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9VTklUX1RJTUU6CisgICAgICBydHBkdG1mZGVwYXktPnVuaXRfdGltZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfRFVSQVRJT046CisgICAgICBydHBkdG1mZGVwYXktPm1heF9kdXJhdGlvbiA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHRtZl9kZXBheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwRFRNRkRlcGF5ICpydHBkdG1mZGVwYXk7CisKKyAgcnRwZHRtZmRlcGF5ID0gR1NUX1JUUF9EVE1GX0RFUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9VTklUX1RJTUU6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnRwZHRtZmRlcGF5LT51bml0X3RpbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9EVVJBVElPTjoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBydHBkdG1mZGVwYXktPm1heF9kdXJhdGlvbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2R0bWZfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGZpbHRlciwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKmZpbHRlcmNhcHMsICpzcmNjYXBzOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBnaW50IGNsb2NrX3JhdGUgPSA4MDAwOyAgICAgICAvKiBkZWZhdWx0ICovCisKKyAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpOworICBmaWx0ZXItPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIGZpbHRlcmNhcHMgPQorICAgICAgZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChmaWx0ZXIpKTsKKworICBmaWx0ZXJjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoZmlsdGVyY2Fwcyk7CisgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGZpbHRlcmNhcHMsICJyYXRlIiwgR19UWVBFX0lOVCwgY2xvY2tfcmF0ZSwgTlVMTCk7CisKKyAgc3JjY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NSQ1BBRCAoZmlsdGVyKSwKKyAgICAgIGZpbHRlcmNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoZmlsdGVyY2Fwcyk7CisKKyAgZ3N0X3BhZF9zZXRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKGZpbHRlciksIHNyY2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X2R0bWZfc3JjX2dlbmVyYXRlX3RvbmUgKEdzdFJ0cERUTUZEZXBheSAqIHJ0cGR0bWZkZXBheSwKKyAgICBHc3RSVFBEVE1GUGF5bG9hZCBwYXlsb2FkKQoreworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdpbnQxNiAqcDsKKyAgZ2ludCB0b25lX3NpemU7CisgIGRvdWJsZSBpID0gMDsKKyAgZG91YmxlIGFtcGxpdHVkZSwgZjEsIGYyOworICBkb3VibGUgdm9sdW1lX2ZhY3RvcjsKKyAgRFRNRl9LRVkga2V5ID0gRFRNRl9LRVlTW3BheWxvYWQuZXZlbnRdOworICBndWludDMyIGNsb2NrX3JhdGU7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgKmRlcGF5bG9hZCA9IEdTVF9SVFBfQkFTRV9ERVBBWUxPQUQgKHJ0cGR0bWZkZXBheSk7CisgIGdpbnQgdm9sdW1lOworICBzdGF0aWMgR3N0QWxsb2NhdGlvblBhcmFtcyBwYXJhbXMgPSB7IDAsIDEsIDAsIDAsIH07CisKKyAgY2xvY2tfcmF0ZSA9IGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZTsKKworICAvKiBDcmVhdGUgYSBidWZmZXIgZm9yIHRoZSB0b25lICovCisgIHRvbmVfc2l6ZSA9IChwYXlsb2FkLmR1cmF0aW9uICogU0FNUExFX1NJWkUgKiBDSEFOTkVMUykgLyA4OworICBidWYgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgdG9uZV9zaXplLCAmcGFyYW1zKTsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKSA9IHBheWxvYWQuZHVyYXRpb24gKiBHU1RfU0VDT05EIC8gY2xvY2tfcmF0ZTsKKyAgdm9sdW1lID0gcGF5bG9hZC52b2x1bWU7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIHAgPSAoZ2ludDE2ICopIG1hcC5kYXRhOworCisgIHZvbHVtZV9mYWN0b3IgPSBwb3cgKDEwLCAoLXZvbHVtZSkgLyAyMCk7CisKKyAgLyoKKyAgICogRm9yIGVhY2ggc2FtcGxlIHBvaW50IHdlIGNhbGN1bGF0ZSAneCcgYXMgdGhlCisgICAqIHRoZSBhbXBsaXR1ZGUgdmFsdWUuCisgICAqLworICBmb3IgKGkgPSAwOyBpIDwgKHRvbmVfc2l6ZSAvIChTQU1QTEVfU0laRSAvIDgpKTsgaSsrKSB7CisgICAgLyoKKyAgICAgKiBXZSBhZGQgdGhlIGZ1bmRhbWVudGFsIGZyZXF1ZW5jaWVzIHRvZ2V0aGVyLgorICAgICAqLworICAgIGYxID0gc2luICgyICogTV9QSSAqIGtleS5sb3dfZnJlcXVlbmN5ICogKHJ0cGR0bWZkZXBheS0+c2FtcGxlIC8KKyAgICAgICAgICAgIGNsb2NrX3JhdGUpKTsKKyAgICBmMiA9IHNpbiAoMiAqIE1fUEkgKiBrZXkuaGlnaF9mcmVxdWVuY3kgKiAocnRwZHRtZmRlcGF5LT5zYW1wbGUgLworICAgICAgICAgICAgY2xvY2tfcmF0ZSkpOworCisgICAgYW1wbGl0dWRlID0gKGYxICsgZjIpIC8gMjsKKworICAgIC8qIEFkanVzdCB0aGUgdm9sdW1lICovCisgICAgYW1wbGl0dWRlICo9IHZvbHVtZV9mYWN0b3I7CisKKyAgICAvKiBNYWtlIHRoZSBbLTE6MV0gaW50ZXJ2YWwgaW50byBhIFstMzI3Njc6MzI3NjddIGludGVydmFsICovCisgICAgYW1wbGl0dWRlICo9IDMyNzY3OworCisgICAgLyogU3RvcmUgaXQgaW4gdGhlIGRhdGEgYnVmZmVyICovCisgICAgKihwKyspID0gKGdpbnQxNikgYW1wbGl0dWRlOworCisgICAgKHJ0cGR0bWZkZXBheS0+c2FtcGxlKSsrOworICB9CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICByZXR1cm4gYnVmOworfQorCisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9kdG1mX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKworICBHc3RSdHBEVE1GRGVwYXkgKnJ0cGR0bWZkZXBheSA9IE5VTEw7CisgIEdzdEJ1ZmZlciAqb3V0YnVmID0gTlVMTDsKKyAgZ2ludCBwYXlsb2FkX2xlbjsKKyAgZ3VpbnQ4ICpwYXlsb2FkID0gTlVMTDsKKyAgZ3VpbnQzMiB0aW1lc3RhbXA7CisgIEdzdFJUUERUTUZQYXlsb2FkIGR0bWZfcGF5bG9hZDsKKyAgZ2Jvb2xlYW4gbWFya2VyOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZSA9IE5VTEw7CisgIEdzdE1lc3NhZ2UgKmR0bWZfbWVzc2FnZSA9IE5VTEw7CisgIEdzdFJUUEJ1ZmZlciBydHBidWZmZXIgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworCisgIHJ0cGR0bWZkZXBheSA9IEdTVF9SVFBfRFRNRl9ERVBBWSAoZGVwYXlsb2FkKTsKKworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKGJ1ZiwgR1NUX01BUF9SRUFELCAmcnRwYnVmZmVyKTsKKworICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAoJnJ0cGJ1ZmZlcik7CisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cGJ1ZmZlcik7CisKKyAgaWYgKHBheWxvYWRfbGVuICE9IHNpemVvZiAoR3N0UlRQRFRNRlBheWxvYWQpKQorICAgIGdvdG8gYmFkX3BhY2tldDsKKworICBtZW1jcHkgKCZkdG1mX3BheWxvYWQsIHBheWxvYWQsIHNpemVvZiAoR3N0UlRQRFRNRlBheWxvYWQpKTsKKworICBpZiAoZHRtZl9wYXlsb2FkLmV2ZW50ID4gTUFYX0VWRU5UKQorICAgIGdvdG8gYmFkX3BhY2tldDsKKworICBtYXJrZXIgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyICgmcnRwYnVmZmVyKTsKKworICB0aW1lc3RhbXAgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wICgmcnRwYnVmZmVyKTsKKworICBkdG1mX3BheWxvYWQuZHVyYXRpb24gPSBnX250b2hzIChkdG1mX3BheWxvYWQuZHVyYXRpb24pOworCisgIC8qIGNsaXAgdG8gd2hvbGUgdW5pdHMgb2YgdW5pdF90aW1lICovCisgIGlmIChydHBkdG1mZGVwYXktPnVuaXRfdGltZSkgeworICAgIGd1aW50IHVuaXRfdGltZV9jbG9jayA9CisgICAgICAgIChydHBkdG1mZGVwYXktPnVuaXRfdGltZSAqIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSkgLyAxMDAwOworICAgIGlmIChkdG1mX3BheWxvYWQuZHVyYXRpb24gJSB1bml0X3RpbWVfY2xvY2spIHsKKyAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVyZmxvdyB0aGUgZHVyYXRpb24gKi8KKyAgICAgIGlmIChkdG1mX3BheWxvYWQuZHVyYXRpb24gPCBHX01BWFVJTlQxNiAtIHVuaXRfdGltZV9jbG9jaykKKyAgICAgICAgZHRtZl9wYXlsb2FkLmR1cmF0aW9uICs9IHVuaXRfdGltZV9jbG9jayAtCisgICAgICAgICAgICAoZHRtZl9wYXlsb2FkLmR1cmF0aW9uICUgdW5pdF90aW1lX2Nsb2NrKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZHRtZl9wYXlsb2FkLmR1cmF0aW9uIC09IGR0bWZfcGF5bG9hZC5kdXJhdGlvbiAlIHVuaXRfdGltZV9jbG9jazsKKyAgICB9CisgIH0KKworICAvKiBjbGlwIHRvIG1heCBkdXJhdGlvbiAqLworICBpZiAocnRwZHRtZmRlcGF5LT5tYXhfZHVyYXRpb24pIHsKKyAgICBndWludCBtYXhfZHVyYXRpb25fY2xvY2sgPQorICAgICAgICAocnRwZHRtZmRlcGF5LT5tYXhfZHVyYXRpb24gKiBkZXBheWxvYWQtPmNsb2NrX3JhdGUpIC8gMTAwMDsKKworICAgIGlmIChtYXhfZHVyYXRpb25fY2xvY2sgPCBHX01BWFVJTlQxNiAmJgorICAgICAgICBkdG1mX3BheWxvYWQuZHVyYXRpb24gPiBtYXhfZHVyYXRpb25fY2xvY2spCisgICAgICBkdG1mX3BheWxvYWQuZHVyYXRpb24gPSBtYXhfZHVyYXRpb25fY2xvY2s7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsICJSZWNlaXZlZCBuZXcgUlRQIERUTUYgcGFja2V0IDogIgorICAgICAgIm1hcmtlcj0lZCAtIHRpbWVzdGFtcD0ldSAtIGV2ZW50PSVkIC0gZHVyYXRpb249JWQiLAorICAgICAgbWFya2VyLCB0aW1lc3RhbXAsIGR0bWZfcGF5bG9hZC5ldmVudCwgZHRtZl9wYXlsb2FkLmR1cmF0aW9uKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsCisgICAgICAiUHJldmlvdXMgaW5mb3JtYXRpb24gOiB0aW1lc3RhbXA9JXUgLSBkdXJhdGlvbj0lZCIsCisgICAgICBydHBkdG1mZGVwYXktPnByZXZpb3VzX3RzLCBydHBkdG1mZGVwYXktPnByZXZpb3VzX2R1cmF0aW9uKTsKKworICAvKiBGaXJzdCBwYWNrZXQgKi8KKyAgaWYgKG1hcmtlciB8fCBydHBkdG1mZGVwYXktPnByZXZpb3VzX3RzICE9IHRpbWVzdGFtcCkgeworICAgIHJ0cGR0bWZkZXBheS0+c2FtcGxlID0gMDsKKyAgICBydHBkdG1mZGVwYXktPnByZXZpb3VzX3RzID0gdGltZXN0YW1wOworICAgIHJ0cGR0bWZkZXBheS0+cHJldmlvdXNfZHVyYXRpb24gPSBkdG1mX3BheWxvYWQuZHVyYXRpb247CisgICAgcnRwZHRtZmRlcGF5LT5maXJzdF9nc3RfdHMgPSBHU1RfQlVGRkVSX1BUUyAoYnVmKTsKKworICAgIHN0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgiZHRtZi1ldmVudCIsCisgICAgICAgICJudW1iZXIiLCBHX1RZUEVfSU5ULCBkdG1mX3BheWxvYWQuZXZlbnQsCisgICAgICAgICJ2b2x1bWUiLCBHX1RZUEVfSU5ULCBkdG1mX3BheWxvYWQudm9sdW1lLAorICAgICAgICAidHlwZSIsIEdfVFlQRV9JTlQsIDEsICJtZXRob2QiLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgICBpZiAoc3RydWN0dXJlKSB7CisgICAgICBkdG1mX21lc3NhZ2UgPQorICAgICAgICAgIGdzdF9tZXNzYWdlX25ld19lbGVtZW50IChHU1RfT0JKRUNUIChkZXBheWxvYWQpLCBzdHJ1Y3R1cmUpOworICAgICAgaWYgKGR0bWZfbWVzc2FnZSkgeworICAgICAgICBpZiAoIWdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKGRlcGF5bG9hZCksIGR0bWZfbWVzc2FnZSkpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChkZXBheWxvYWQsCisgICAgICAgICAgICAgICJVbmFibGUgdG8gc2VuZCBkdG1mLWV2ZW50IG1lc3NhZ2UgdG8gYnVzIik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlcGF5bG9hZCwgIlVuYWJsZSB0byBjcmVhdGUgZHRtZi1ldmVudCBtZXNzYWdlIik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlcGF5bG9hZCwgIlVuYWJsZSB0byBjcmVhdGUgZHRtZi1ldmVudCBzdHJ1Y3R1cmUiKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ3VpbnQxNiBkdXJhdGlvbiA9IGR0bWZfcGF5bG9hZC5kdXJhdGlvbjsKKyAgICBkdG1mX3BheWxvYWQuZHVyYXRpb24gLT0gcnRwZHRtZmRlcGF5LT5wcmV2aW91c19kdXJhdGlvbjsKKyAgICAvKiBJZiBsYXRlIGJ1ZmZlciwgaWdub3JlICovCisgICAgaWYgKGR1cmF0aW9uID4gcnRwZHRtZmRlcGF5LT5wcmV2aW91c19kdXJhdGlvbikKKyAgICAgIHJ0cGR0bWZkZXBheS0+cHJldmlvdXNfZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgIm5ldyBwcmV2aW91cyBkdXJhdGlvbiA6ICVkIC0gbmV3IGR1cmF0aW9uIDogJWQiCisgICAgICAiIC0gZGlmZiAgOiAlZCAtIGNsb2NrIHJhdGUgOiAlZCAtIHRpbWVzdGFtcCA6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBydHBkdG1mZGVwYXktPnByZXZpb3VzX2R1cmF0aW9uLCBkdG1mX3BheWxvYWQuZHVyYXRpb24sCisgICAgICAocnRwZHRtZmRlcGF5LT5wcmV2aW91c19kdXJhdGlvbiAtIGR0bWZfcGF5bG9hZC5kdXJhdGlvbiksCisgICAgICBkZXBheWxvYWQtPmNsb2NrX3JhdGUsIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpKTsKKworICAvKiBJZiBsYXRlIG9yIGR1cGxpY2F0ZSBwYWNrZXQgKGxpa2UgdGhlIHJlZHVuZGFudCBlbmQgcGFja2V0KS4gSWdub3JlICovCisgIGlmIChkdG1mX3BheWxvYWQuZHVyYXRpb24gPiAwKSB7CisgICAgb3V0YnVmID0gZ3N0X2R0bWZfc3JjX2dlbmVyYXRlX3RvbmUgKHJ0cGR0bWZkZXBheSwgZHRtZl9wYXlsb2FkKTsKKworCisgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSBydHBkdG1mZGVwYXktPmZpcnN0X2dzdF90cyArCisgICAgICAgIChydHBkdG1mZGVwYXktPnByZXZpb3VzX2R1cmF0aW9uIC0gZHRtZl9wYXlsb2FkLmR1cmF0aW9uKSAqCisgICAgICAgIEdTVF9TRUNPTkQgLyBkZXBheWxvYWQtPmNsb2NrX3JhdGU7CisgICAgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZikgPQorICAgICAgICAocnRwZHRtZmRlcGF5LT5wcmV2aW91c19kdXJhdGlvbiAtIGR0bWZfcGF5bG9hZC5kdXJhdGlvbikgKgorICAgICAgICBHU1RfU0VDT05EIC8gZGVwYXlsb2FkLT5jbG9ja19yYXRlOworICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAob3V0YnVmKSA9IHJ0cGR0bWZkZXBheS0+cHJldmlvdXNfZHVyYXRpb24gKgorICAgICAgICBHU1RfU0VDT05EIC8gZGVwYXlsb2FkLT5jbG9ja19yYXRlOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLAorICAgICAgICAidGltZXN0YW1wIDogJSIgR19HVUlOVDY0X0ZPUk1BVCAiIC0gdGltZSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpLCBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKSkpOworCisgIH0KKworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cGJ1ZmZlcik7CisKKyAgcmV0dXJuIG91dGJ1ZjsKKworYmFkX3BhY2tldDoKKyAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwZHRtZmRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICgiUGFja2V0IGRpZCBub3QgdmFsaWRhdGUiKSwgKE5VTEwpKTsKKworICBpZiAocnRwYnVmZmVyLmJ1ZmZlciAhPSBOVUxMKQorICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwYnVmZmVyKTsKKworICByZXR1cm4gTlVMTDsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfZHRtZl9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGR0bWZkZXBheSIsCisgICAgICBHU1RfUkFOS19NQVJHSU5BTCwgR1NUX1RZUEVfUlRQX0RUTUZfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmggYi9nc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWVkMTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmgKQEAgLTAsMCArMSw2OCBAQAorLyogR3N0UnRwRHRtZkRlcGF5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IENvbGxhYm9yYSBMaW1pdGVkCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24KKyAqICAgQ29udGFjdDogWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9EVE1GX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfRFRNRl9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKKyNpbmNsdWRlICJnc3RkdG1mY29tbW9uLmgiCisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0RUTUZfREVQQVkgXAorICAoZ3N0X3J0cF9kdG1mX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfRFRNRl9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9EVE1GX0RFUEFZLEdzdFJ0cERUTUZEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfRFRNRl9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfRFRNRl9ERVBBWSxHc3RSdHBEVE1GRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfRFRNRl9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9EVE1GX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9EVE1GX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9EVE1GX0RFUEFZKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBEVE1GRGVwYXkgR3N0UnRwRFRNRkRlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cERUTUZEZXBheUNsYXNzIEdzdFJ0cERUTUZEZXBheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cERUTUZEZXBheQoreworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7CisgIGRvdWJsZSBzYW1wbGU7CisgIGd1aW50MzIgcHJldmlvdXNfdHM7CisgIGd1aW50MTYgcHJldmlvdXNfZHVyYXRpb247CisgIEdzdENsb2NrVGltZSBmaXJzdF9nc3RfdHM7CisgIGd1aW50IHVuaXRfdGltZTsKKyAgZ3VpbnQgbWF4X2R1cmF0aW9uOworfTsKKworc3RydWN0IF9Hc3RSdHBEVE1GRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9kdG1mX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9kdG1mX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1JUUF9EVE1GX0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jIGIvZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNzgzZDMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZHRtZi9nc3RydHBkdG1mc3JjLmMKQEAgLTAsMCArMSwxMTg3IEBACisvKiBHU3RyZWFtZXIgUlRQIERUTUYgc291cmNlCisgKgorICogZ3N0cnRwZHRtZnNyYy5jOgorICoKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IE5va2lhIENvcnBvcmF0aW9uLgorICogICBDb250YWN0OiBaZWVzaGFuIEFsaSA8emVlc2hhbi5hbGlAbm9raWEuY29tPgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgMjAwMCwyMDA1IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwZHRtZnNyYworICogQHNlZV9hbHNvOiBkdG1mc3JjLCBydHBkdG1mZGVwYXksIHJ0cGR0bWZtdXgKKyAqCisgKiBUaGUgUlRQRFRNRlNyYyBlbGVtZW50IGdlbmVyYXRlcyBSVFAgRFRNRiAoUkZDIDI4MzMpIGV2ZW50IHBhY2tldHMgb24gcmVxdWVzdAorICogZnJvbSBhcHBsaWNhdGlvbi4gVGhlIGFwcGxpY2F0aW9uIGNvbW11bmljYXRlcyB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYQorICogRFRNRiBldmVudCB1c2luZyBjdXN0b20gdXBzdHJlYW0gZ3N0cmVhbWVyIGV2ZW50cy4gVG8gcmVwb3J0IGEgRFRNRiBldmVudCwgYW4KKyAqIGFwcGxpY2F0aW9uIG11c3Qgc2VuZCBhbiBldmVudCBvZiB0eXBlIEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU0sIGhhdmluZyBhCisgKiBzdHJ1Y3R1cmUgb2YgbmFtZSAiZHRtZi1ldmVudCIgd2l0aCBmaWVsZHMgc2V0IGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nCisgKiB0YWJsZToKKyAqCisgKiA8aW5mb3JtYWx0YWJsZT4KKyAqIDx0Z3JvdXAgY29scz0nNCc+CisgKiA8Y29sc3BlYyBjb2xuYW1lPSdOYW1lJyAvPgorICogPGNvbHNwZWMgY29sbmFtZT0nVHlwZScgLz4KKyAqIDxjb2xzcGVjIGNvbG5hbWU9J1Bvc3NpYmxlIHZhbHVlcycgLz4KKyAqIDxjb2xzcGVjIGNvbG5hbWU9J1B1cnBvc2UnIC8+CisgKiA8dGhlYWQ+CisgKiA8cm93PgorICogPGVudHJ5Pk5hbWU8L2VudHJ5PgorICogPGVudHJ5PkdUeXBlPC9lbnRyeT4KKyAqIDxlbnRyeT5Qb3NzaWJsZSB2YWx1ZXM8L2VudHJ5PgorICogPGVudHJ5PlB1cnBvc2U8L2VudHJ5PgorICogPC9yb3c+CisgKiA8L3RoZWFkPgorICogPHRib2R5PgorICogPHJvdz4KKyAqIDxlbnRyeT50eXBlPC9lbnRyeT4KKyAqIDxlbnRyeT5HX1RZUEVfSU5UPC9lbnRyeT4KKyAqIDxlbnRyeT4wLTE8L2VudHJ5PgorICogPGVudHJ5PlRoZSBhcHBsaWNhdGlvbiB1c2VzIHRoaXMgZmllbGQgdG8gc3BlY2lmeSB3aGljaCBvZiB0aGUgdHdvIG1ldGhvZHMKKyAqIHNwZWNpZmllZCBpbiBSRkMgMjgzMyB0byB1c2UuIFRoZSB2YWx1ZSBzaG91bGQgYmUgMCBmb3IgdG9uZXMgYW5kIDEgZm9yCisgKiBuYW1lZCBldmVudHMuIFRvbmVzIGFyZSBzcGVjaWZpZWQgYnkgdGhlaXIgZnJlcXVlbmNpZXMgYW5kIGV2ZW50cyBhcmUgc3BlY2llZAorICogYnkgdGhlaXIgbnVtYmVyLiBUaGlzIGVsZW1lbnQgY2FuIG9ubHkgdGFrZSBldmVudHMgYXMgaW5wdXQuIERvIG5vdCBjb25mdXNlCisgKiB3aXRoICJtZXRob2QiIHdoaWNoIHNwZWNpZmllZCB0aGUgb3V0cHV0LgorICogPC9lbnRyeT4KKyAqIDwvcm93PgorICogPHJvdz4KKyAqIDxlbnRyeT5udW1iZXI8L2VudHJ5PgorICogPGVudHJ5PkdfVFlQRV9JTlQ8L2VudHJ5PgorICogPGVudHJ5PjAtMTU8L2VudHJ5PgorICogPGVudHJ5PlRoZSBldmVudCBudW1iZXIuPC9lbnRyeT4KKyAqIDwvcm93PgorICogPHJvdz4KKyAqIDxlbnRyeT52b2x1bWU8L2VudHJ5PgorICogPGVudHJ5PkdfVFlQRV9JTlQ8L2VudHJ5PgorICogPGVudHJ5PjAtMzY8L2VudHJ5PgorICogPGVudHJ5PlRoaXMgZmllbGQgZGVzY3JpYmVzIHRoZSBwb3dlciBsZXZlbCBvZiB0aGUgdG9uZSwgZXhwcmVzc2VkIGluIGRCbTAKKyAqIGFmdGVyIGRyb3BwaW5nIHRoZSBzaWduLiBQb3dlciBsZXZlbHMgcmFuZ2UgZnJvbSAwIHRvIC02MyBkQm0wLiBUaGUgcmFuZ2Ugb2YKKyAqIHZhbGlkIERUTUYgaXMgZnJvbSAwIHRvIC0zNiBkQm0wLiBDYW4gYmUgb21pdHRlZCBpZiBzdGFydCBpcyBzZXQgdG8gRkFMU0UuCisgKiA8L2VudHJ5PgorICogPC9yb3c+CisgKiA8cm93PgorICogPGVudHJ5PnN0YXJ0PC9lbnRyeT4KKyAqIDxlbnRyeT5HX1RZUEVfQk9PTEVBTjwvZW50cnk+CisgKiA8ZW50cnk+VHJ1ZSBvciBGYWxzZTwvZW50cnk+CisgKiA8ZW50cnk+V2hldGhlciB0aGUgZXZlbnQgaXMgc3RhcnRpbmcgb3IgZW5kaW5nLjwvZW50cnk+CisgKiA8L3Jvdz4KKyAqIDxyb3c+CisgKiA8ZW50cnk+bWV0aG9kPC9lbnRyeT4KKyAqIDxlbnRyeT5HX1RZUEVfSU5UPC9lbnRyeT4KKyAqIDxlbnRyeT4xPC9lbnRyeT4KKyAqIDxlbnRyeT5UaGUgbWV0aG9kIHVzZWQgZm9yIHNlbmRpbmcgZXZlbnQsIHRoaXMgZWxlbWVudCB3aWxsIHJlYWN0IGlmIHRoaXMKKyAqIGZpZWxkIGlzIGFic2VudCBvciAxLgorICogPC9lbnRyeT4KKyAqIDwvcm93PgorICogPC90Ym9keT4KKyAqIDwvdGdyb3VwPgorICogPC9pbmZvcm1hbHRhYmxlPgorICoKKyAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgaW5mb3JtcyB0aGUgcGlwZWxpbmUgKGFuZCBpbiB0dXJuLCB0aGUKKyAqIFJUUERUTUZTcmMgZWxlbWVudCBpbnNpZGUgdGhlIHBpcGVsaW5lKSBhYm91dCB0aGUgc3RhcnQgb2YgYW4gUlRQIERUTUYgbmFtZWQKKyAqIGV2ZW50ICcxJyBvZiB2b2x1bWUgLTI1IGRCbTA6CisgKgorICogPHByb2dyYW1saXN0aW5nPgorICogc3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJkdG1mLWV2ZW50IiwKKyAqICAgICAgICAgICAgICAgICAgICAidHlwZSIsIEdfVFlQRV9JTlQsIDEsCisgKiAgICAgICAgICAgICAgICAgICAgIm51bWJlciIsIEdfVFlQRV9JTlQsIDEsCisgKiAgICAgICAgICAgICAgICAgICAgInZvbHVtZSIsIEdfVFlQRV9JTlQsIDI1LAorICogICAgICAgICAgICAgICAgICAgICJzdGFydCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKyAqCisgKiBldmVudCA9IGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNLCBzdHJ1Y3R1cmUpOworICogZ3N0X2VsZW1lbnRfc2VuZF9ldmVudCAocGlwZWxpbmUsIGV2ZW50KTsKKyAqIDwvcHJvZ3JhbWxpc3Rpbmc+CisgKgorICogV2hlbiBhIERUTUYgdG9uZSBhY3R1YWxseSBzdGFydHMgb3Igc3RvcCwgYSAiZHRtZi1ldmVudC1wcm9jZXNzZWQiCisgKiBlbGVtZW50ICNHc3RNZXNzYWdlIHdpdGggdGhlIHNhbWUgZmllbGRzIGFzIHRoZSAiZHRtZi1ldmVudCIKKyAqICNHc3RFdmVudCB0aGF0IHdhcyB1c2VkIHRvIHJlcXVlc3QgdGhlIGV2ZW50LiBBbHNvLCBpZiBhbnkgZXZlbnQKKyAqIGhhcyBub3QgYmVlbiBwcm9jZXNzZWQgd2hlbiB0aGUgZWxlbWVudCBnb2VzIGZyb20gdGhlIFBBVVNFRCB0byB0aGUKKyAqIFJFQURZIHN0YXRlLCB0aGVuIGEgImR0bWYtZXZlbnQtZHJvcHBlZCIgbWVzc2FnZSBpcyBwb3N0ZWQgb24gdGhlCisgKiAjR3N0QnVzIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgd2VyZSByZWNlaXZlZC4KKyAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlICJnc3RydHBkdG1mc3JjLmgiCisKKyNkZWZpbmUgR1NUX1JUUF9EVE1GX1RZUEVfRVZFTlQgIDEKKyNkZWZpbmUgREVGQVVMVF9QVElNRSAgICAgICAgICAgIDQwICAgICAvKiBtcyAqLworI2RlZmluZSBERUZBVUxUX1NTUkMgICAgICAgICAgICAgLTEKKyNkZWZpbmUgREVGQVVMVF9QVCAgICAgICAgICAgICAgIDk2CisjZGVmaW5lIERFRkFVTFRfVElNRVNUQU1QX09GRlNFVCAtMQorI2RlZmluZSBERUZBVUxUX1NFUU5VTV9PRkZTRVQgICAgLTEKKyNkZWZpbmUgREVGQVVMVF9DTE9DS19SQVRFICAgICAgIDgwMDAKKworI2RlZmluZSBERUZBVUxUX1BBQ0tFVF9SRURVTkRBTkNZIDEKKyNkZWZpbmUgTUlOX1BBQ0tFVF9SRURVTkRBTkNZIDEKKyNkZWZpbmUgTUFYX1BBQ0tFVF9SRURVTkRBTkNZIDUKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3J0cF9kdG1mX3NyY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfcnRwX2R0bWZfc3JjX2RlYnVnCisKKy8qIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfU1NSQywKKyAgUFJPUF9USU1FU1RBTVBfT0ZGU0VULAorICBQUk9QX1NFUU5VTV9PRkZTRVQsCisgIFBST1BfUFQsCisgIFBST1BfQ0xPQ0tfUkFURSwKKyAgUFJPUF9USU1FU1RBTVAsCisgIFBST1BfU0VRTlVNLAorICBQUk9QX1JFRFVOREFOQ1kKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2R0bWZfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSBbIDk2LCAxMjcgXSwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsgMCwgTUFYIF0sICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIlRFTEVQSE9ORS1FVkVOVFwiIikKKyAgICAvKiAgImV2ZW50cyA9IChzdHJpbmcpIFwiMC0xNVwiICovCisgICAgKTsKKworCitHX0RFRklORV9UWVBFIChHc3RSVFBEVE1GU3JjLCBnc3RfcnRwX2R0bWZfc3JjLCBHU1RfVFlQRV9CQVNFX1NSQyk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfZHRtZl9zcmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2R0bWZfc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfZHRtZl9zcmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfZHRtZl9zcmNfaGFuZGxlX2V2ZW50IChHc3RCYXNlU3JjICogYmFzZXNyYywKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX2R0bWZfc3JjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CitzdGF0aWMgdm9pZCBnc3RfcnRwX2R0bWZfc3JjX2FkZF9zdGFydF9ldmVudCAoR3N0UlRQRFRNRlNyYyAqIGR0bWZzcmMsCisgICAgZ2ludCBldmVudF9udW1iZXIsIGdpbnQgZXZlbnRfdm9sdW1lKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfZHRtZl9zcmNfYWRkX3N0b3BfZXZlbnQgKEdzdFJUUERUTUZTcmMgKiBkdG1mc3JjKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfZHRtZl9zcmNfdW5sb2NrIChHc3RCYXNlU3JjICogc3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2R0bWZfc3JjX3VubG9ja19zdG9wIChHc3RCYXNlU3JjICogc3JjKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfZHRtZl9zcmNfY3JlYXRlIChHc3RCYXNlU3JjICogYmFzZXNyYywKKyAgICBndWludDY0IG9mZnNldCwgZ3VpbnQgbGVuZ3RoLCBHc3RCdWZmZXIgKiogYnVmZmVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2R0bWZfc3JjX25lZ290aWF0ZSAoR3N0QmFzZVNyYyAqIGJhc2VzcmMpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfZHRtZl9zcmNfcXVlcnkgKEdzdEJhc2VTcmMgKiBiYXNlc3JjLCBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9kdG1mX3NyY19jbGFzc19pbml0IChHc3RSVFBEVE1GU3JjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RCYXNlU3JjQ2xhc3MgKmdzdGJhc2VzcmNfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgZ3N0YmFzZXNyY19jbGFzcyA9IEdTVF9CQVNFX1NSQ19DTEFTUyAoa2xhc3MpOworICBnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3J0cF9kdG1mX3NyY19kZWJ1ZywKKyAgICAgICJydHBkdG1mc3JjIiwgMCwgInJ0cGR0bWZzcmMgZWxlbWVudCIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZHRtZl9zcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIERUTUYgcGFja2V0IGdlbmVyYXRvciIsICJTb3VyY2UvTmV0d29yayIsCisgICAgICAiR2VuZXJhdGVzIFJUUCBEVE1GIHBhY2tldHMiLCAiWmVlc2hhbiBBbGkgPHplZXNoYW4uYWxpQG5va2lhLmNvbT4iKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2R0bWZfc3JjX2ZpbmFsaXplKTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2R0bWZfc3JjX3NldF9wcm9wZXJ0eSk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kdG1mX3NyY19nZXRfcHJvcGVydHkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfVElNRVNUQU1QLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJ0aW1lc3RhbXAiLCAiVGltZXN0YW1wIiwKKyAgICAgICAgICAiVGhlIFJUUCB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgcHJvY2Vzc2VkIHBhY2tldCIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCAwLCBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1NFUU5VTSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgic2VxbnVtIiwgIlNlcXVlbmNlIG51bWJlciIsCisgICAgICAgICAgIlRoZSBSVFAgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBsYXN0IHByb2Nlc3NlZCBwYWNrZXQiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVCwgMCwgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIFBST1BfVElNRVNUQU1QX09GRlNFVCwgZ19wYXJhbV9zcGVjX2ludCAoInRpbWVzdGFtcC1vZmZzZXQiLAorICAgICAgICAgICJUaW1lc3RhbXAgT2Zmc2V0IiwKKyAgICAgICAgICAiT2Zmc2V0IHRvIGFkZCB0byBhbGwgb3V0Z29pbmcgdGltZXN0YW1wcyAoLTEgPSByYW5kb20pIiwgLTEsCisgICAgICAgICAgR19NQVhJTlQsIERFRkFVTFRfVElNRVNUQU1QX09GRlNFVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9TRVFOVU1fT0ZGU0VULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInNlcW51bS1vZmZzZXQiLCAiU2VxdWVuY2UgbnVtYmVyIE9mZnNldCIsCisgICAgICAgICAgIk9mZnNldCB0byBhZGQgdG8gYWxsIG91dGdvaW5nIHNlcW51bSAoLTEgPSByYW5kb20pIiwgLTEsIEdfTUFYSU5ULAorICAgICAgICAgIERFRkFVTFRfU0VRTlVNX09GRlNFVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQ0xPQ0tfUkFURSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiY2xvY2stcmF0ZSIsICJjbG9ja3JhdGUiLAorICAgICAgICAgICJUaGUgY2xvY2stcmF0ZSBhdCB3aGljaCB0byBnZW5lcmF0ZSB0aGUgZHRtZiBwYWNrZXRzIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIERFRkFVTFRfQ0xPQ0tfUkFURSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9TU1JDLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJzc3JjIiwgIlNTUkMiLAorICAgICAgICAgICJUaGUgU1NSQyBvZiB0aGUgcGFja2V0cyAoLTEgPT0gcmFuZG9tKSIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCBERUZBVUxUX1NTUkMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfUFQsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInB0IiwgInBheWxvYWQgdHlwZSIsCisgICAgICAgICAgIlRoZSBwYXlsb2FkIHR5cGUgb2YgdGhlIHBhY2tldHMiLAorICAgICAgICAgIDAsIDB4ODAsIERFRkFVTFRfUFQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1JFRFVOREFOQ1ksCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInBhY2tldC1yZWR1bmRhbmN5IiwgIlBhY2tldCBSZWR1bmRhbmN5IiwKKyAgICAgICAgICAiTnVtYmVyIG9mIHBhY2tldHMgdG8gc2VuZCB0byBpbmRpY2F0ZSBzdGFydCBhbmQgc3RvcCBkdG1mIGV2ZW50cyIsCisgICAgICAgICAgTUlOX1BBQ0tFVF9SRURVTkRBTkNZLCBNQVhfUEFDS0VUX1JFRFVOREFOQ1ksCisgICAgICAgICAgREVGQVVMVF9QQUNLRVRfUkVEVU5EQU5DWSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfZHRtZl9zcmNfY2hhbmdlX3N0YXRlKTsKKworICBnc3RiYXNlc3JjX2NsYXNzLT51bmxvY2sgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kdG1mX3NyY191bmxvY2spOworICBnc3RiYXNlc3JjX2NsYXNzLT51bmxvY2tfc3RvcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kdG1mX3NyY191bmxvY2tfc3RvcCk7CisKKyAgZ3N0YmFzZXNyY19jbGFzcy0+ZXZlbnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kdG1mX3NyY19oYW5kbGVfZXZlbnQpOworICBnc3RiYXNlc3JjX2NsYXNzLT5jcmVhdGUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kdG1mX3NyY19jcmVhdGUpOworICBnc3RiYXNlc3JjX2NsYXNzLT5uZWdvdGlhdGUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kdG1mX3NyY19uZWdvdGlhdGUpOworICBnc3RiYXNlc3JjX2NsYXNzLT5xdWVyeSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2R0bWZfc3JjX3F1ZXJ5KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHRtZl9zcmNfZXZlbnRfZnJlZSAoR3N0UlRQRFRNRlNyY0V2ZW50ICogZXZlbnQpCit7CisgIGlmIChldmVudCkgeworICAgIGlmIChldmVudC0+cGF5bG9hZCkKKyAgICAgIGdfc2xpY2VfZnJlZSAoR3N0UlRQRFRNRlBheWxvYWQsIGV2ZW50LT5wYXlsb2FkKTsKKyAgICBnX3NsaWNlX2ZyZWUgKEdzdFJUUERUTUZTcmNFdmVudCwgZXZlbnQpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2R0bWZfc3JjX2luaXQgKEdzdFJUUERUTUZTcmMgKiBvYmplY3QpCit7CisgIGdzdF9iYXNlX3NyY19zZXRfZm9ybWF0IChHU1RfQkFTRV9TUkMgKG9iamVjdCksIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9iYXNlX3NyY19zZXRfbGl2ZSAoR1NUX0JBU0VfU1JDIChvYmplY3QpLCBUUlVFKTsKKworICBvYmplY3QtPnNzcmMgPSBERUZBVUxUX1NTUkM7CisgIG9iamVjdC0+c2VxbnVtX29mZnNldCA9IERFRkFVTFRfU0VRTlVNX09GRlNFVDsKKyAgb2JqZWN0LT50c19vZmZzZXQgPSBERUZBVUxUX1RJTUVTVEFNUF9PRkZTRVQ7CisgIG9iamVjdC0+cHQgPSBERUZBVUxUX1BUOworICBvYmplY3QtPmNsb2NrX3JhdGUgPSBERUZBVUxUX0NMT0NLX1JBVEU7CisgIG9iamVjdC0+cHRpbWUgPSBERUZBVUxUX1BUSU1FOworICBvYmplY3QtPnBhY2tldF9yZWR1bmRhbmN5ID0gREVGQVVMVF9QQUNLRVRfUkVEVU5EQU5DWTsKKworICBvYmplY3QtPmV2ZW50X3F1ZXVlID0KKyAgICAgIGdfYXN5bmNfcXVldWVfbmV3X2Z1bGwgKChHRGVzdHJveU5vdGlmeSkgZ3N0X3J0cF9kdG1mX3NyY19ldmVudF9mcmVlKTsKKyAgb2JqZWN0LT5wYXlsb2FkID0gTlVMTDsKKworICBHU1RfREVCVUdfT0JKRUNUIChvYmplY3QsICJpbml0IGRvbmUiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHRtZl9zcmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJUUERUTUZTcmMgKmR0bWZzcmM7CisKKyAgZHRtZnNyYyA9IEdTVF9SVFBfRFRNRl9TUkMgKG9iamVjdCk7CisKKyAgaWYgKGR0bWZzcmMtPmV2ZW50X3F1ZXVlKSB7CisgICAgZ19hc3luY19xdWV1ZV91bnJlZiAoZHRtZnNyYy0+ZXZlbnRfcXVldWUpOworICAgIGR0bWZzcmMtPmV2ZW50X3F1ZXVlID0gTlVMTDsKKyAgfQorCisKKyAgR19PQkpFQ1RfQ0xBU1MgKGdzdF9ydHBfZHRtZl9zcmNfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9kdG1mX3NyY19oYW5kbGVfZHRtZl9ldmVudCAoR3N0UlRQRFRNRlNyYyAqIGR0bWZzcmMsCisgICAgY29uc3QgR3N0U3RydWN0dXJlICogZXZlbnRfc3RydWN0dXJlKQoreworICBnaW50IGV2ZW50X3R5cGU7CisgIGdib29sZWFuIHN0YXJ0OworICBnaW50IG1ldGhvZDsKKyAgR3N0Q2xvY2tUaW1lIGxhc3Rfc3RvcDsKKyAgZ2ludCBldmVudF9udW1iZXI7CisgIGdpbnQgZXZlbnRfdm9sdW1lOworICBnYm9vbGVhbiBjb3JyZWN0X29yZGVyOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChldmVudF9zdHJ1Y3R1cmUsICJ0eXBlIiwgJmV2ZW50X3R5cGUpIHx8CisgICAgICAhZ3N0X3N0cnVjdHVyZV9nZXRfYm9vbGVhbiAoZXZlbnRfc3RydWN0dXJlLCAic3RhcnQiLCAmc3RhcnQpIHx8CisgICAgICBldmVudF90eXBlICE9IEdTVF9SVFBfRFRNRl9UWVBFX0VWRU5UKQorICAgIGdvdG8gZmFpbHVyZTsKKworICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChldmVudF9zdHJ1Y3R1cmUsICJtZXRob2QiLCAmbWV0aG9kKSkgeworICAgIGlmIChtZXRob2QgIT0gMSkgeworICAgICAgZ290byBmYWlsdXJlOworICAgIH0KKyAgfQorCisgIGlmIChzdGFydCkKKyAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoZXZlbnRfc3RydWN0dXJlLCAibnVtYmVyIiwgJmV2ZW50X251bWJlcikgfHwKKyAgICAgICAgIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoZXZlbnRfc3RydWN0dXJlLCAidm9sdW1lIiwgJmV2ZW50X3ZvbHVtZSkpCisgICAgICBnb3RvIGZhaWx1cmU7CisKKyAgR1NUX09CSkVDVF9MT0NLIChkdG1mc3JjKTsKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2Nsb2NrX3RpbWUgKGV2ZW50X3N0cnVjdHVyZSwgImxhc3Qtc3RvcCIsICZsYXN0X3N0b3ApKQorICAgIGR0bWZzcmMtPmxhc3Rfc3RvcCA9IGxhc3Rfc3RvcDsKKyAgZWxzZQorICAgIGR0bWZzcmMtPmxhc3Rfc3RvcCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGNvcnJlY3Rfb3JkZXIgPSAoc3RhcnQgIT0gZHRtZnNyYy0+bGFzdF9ldmVudF93YXNfc3RhcnQpOworICBkdG1mc3JjLT5sYXN0X2V2ZW50X3dhc19zdGFydCA9IHN0YXJ0OworICBHU1RfT0JKRUNUX1VOTE9DSyAoZHRtZnNyYyk7CisKKyAgaWYgKCFjb3JyZWN0X29yZGVyKQorICAgIGdvdG8gZmFpbHVyZTsKKworICBpZiAoc3RhcnQpIHsKKyAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoZXZlbnRfc3RydWN0dXJlLCAibnVtYmVyIiwgJmV2ZW50X251bWJlcikgfHwKKyAgICAgICAgIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoZXZlbnRfc3RydWN0dXJlLCAidm9sdW1lIiwgJmV2ZW50X3ZvbHVtZSkpCisgICAgICBnb3RvIGZhaWx1cmU7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkdG1mc3JjLCAiUmVjZWl2ZWQgc3RhcnQgZXZlbnQgJWQgd2l0aCB2b2x1bWUgJWQiLAorICAgICAgICBldmVudF9udW1iZXIsIGV2ZW50X3ZvbHVtZSk7CisgICAgZ3N0X3J0cF9kdG1mX3NyY19hZGRfc3RhcnRfZXZlbnQgKGR0bWZzcmMsIGV2ZW50X251bWJlciwgZXZlbnRfdm9sdW1lKTsKKyAgfQorCisgIGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJSZWNlaXZlZCBzdG9wIGV2ZW50Iik7CisgICAgZ3N0X3J0cF9kdG1mX3NyY19hZGRfc3RvcF9ldmVudCAoZHRtZnNyYyk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK2ZhaWx1cmU6CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2R0bWZfc3JjX2hhbmRsZV9jdXN0b21fdXBzdHJlYW0gKEdzdFJUUERUTUZTcmMgKiBkdG1mc3JjLAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJlc3VsdCA9IEZBTFNFOworICBnY2hhciAqc3RydWN0X3N0cjsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisKKyAgR3N0U3RhdGUgc3RhdGU7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICByZXQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKEdTVF9FTEVNRU5UIChkdG1mc3JjKSwgJnN0YXRlLCBOVUxMLCAwKTsKKyAgaWYgKHJldCAhPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MgfHwgc3RhdGUgIT0gR1NUX1NUQVRFX1BMQVlJTkcpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkdG1mc3JjLCAiUmVjZWl2ZWQgZXZlbnQgd2hpbGUgbm90IGluIFBMQVlJTkcgc3RhdGUiKTsKKyAgICBnb3RvIHJldDsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJSZWNlaXZlZCBldmVudCBpcyBvZiBvdXIgaW50ZXJlc3QiKTsKKyAgc3RydWN0dXJlID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUgKGV2ZW50KTsKKyAgc3RydWN0X3N0ciA9IGdzdF9zdHJ1Y3R1cmVfdG9fc3RyaW5nIChzdHJ1Y3R1cmUpOworICBHU1RfREVCVUdfT0JKRUNUIChkdG1mc3JjLCAiRXZlbnQgaGFzIHN0cnVjdHVyZSAlcyIsIHN0cnVjdF9zdHIpOworICBnX2ZyZWUgKHN0cnVjdF9zdHIpOworICBpZiAoc3RydWN0dXJlICYmIGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImR0bWYtZXZlbnQiKSkKKyAgICByZXN1bHQgPSBnc3RfcnRwX2R0bWZfc3JjX2hhbmRsZV9kdG1mX2V2ZW50IChkdG1mc3JjLCBzdHJ1Y3R1cmUpOworCityZXQ6CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9kdG1mX3NyY19oYW5kbGVfZXZlbnQgKEdzdEJhc2VTcmMgKiBiYXNlc3JjLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSVFBEVE1GU3JjICpkdG1mc3JjOworICBnYm9vbGVhbiByZXN1bHQgPSBGQUxTRTsKKworICBkdG1mc3JjID0gR1NUX1JUUF9EVE1GX1NSQyAoYmFzZXNyYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgIlJlY2VpdmVkIGFuIGV2ZW50IG9uIHRoZSBzcmMgcGFkIik7CisgIGlmIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID09IEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU0pIHsKKyAgICByZXN1bHQgPSBnc3RfcnRwX2R0bWZfc3JjX2hhbmRsZV9jdXN0b21fdXBzdHJlYW0gKGR0bWZzcmMsIGV2ZW50KTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2R0bWZfc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSVFBEVE1GU3JjICpkdG1mc3JjOworCisgIGR0bWZzcmMgPSBHU1RfUlRQX0RUTUZfU1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9USU1FU1RBTVBfT0ZGU0VUOgorICAgICAgZHRtZnNyYy0+dHNfb2Zmc2V0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0VRTlVNX09GRlNFVDoKKyAgICAgIGR0bWZzcmMtPnNlcW51bV9vZmZzZXQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTE9DS19SQVRFOgorICAgICAgZHRtZnNyYy0+Y2xvY2tfcmF0ZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGR0bWZzcmMtPmRpcnR5ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TU1JDOgorICAgICAgZHRtZnNyYy0+c3NyYyA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QVDoKKyAgICAgIGR0bWZzcmMtPnB0ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgZHRtZnNyYy0+ZGlydHkgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JFRFVOREFOQ1k6CisgICAgICBkdG1mc3JjLT5wYWNrZXRfcmVkdW5kYW5jeSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHRtZl9zcmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJUUERUTUZTcmMgKmR0bWZzcmM7CisKKyAgZHRtZnNyYyA9IEdTVF9SVFBfRFRNRl9TUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1RJTUVTVEFNUF9PRkZTRVQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBkdG1mc3JjLT50c19vZmZzZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NFUU5VTV9PRkZTRVQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBkdG1mc3JjLT5zZXFudW1fb2Zmc2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTE9DS19SQVRFOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIGR0bWZzcmMtPmNsb2NrX3JhdGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NTUkM6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgZHRtZnNyYy0+c3NyYyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUFQ6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgZHRtZnNyYy0+cHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RJTUVTVEFNUDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBkdG1mc3JjLT5ydHBfdGltZXN0YW1wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TRVFOVU06CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgZHRtZnNyYy0+c2VxbnVtKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRURVTkRBTkNZOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIGR0bWZzcmMtPnBhY2tldF9yZWR1bmRhbmN5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2R0bWZfcHJlcGFyZV90aW1lc3RhbXBzIChHc3RSVFBEVE1GU3JjICogZHRtZnNyYykKK3sKKyAgR3N0Q2xvY2tUaW1lIGxhc3Rfc3RvcDsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGR0bWZzcmMpOworICBsYXN0X3N0b3AgPSBkdG1mc3JjLT5sYXN0X3N0b3A7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdG1mc3JjKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGxhc3Rfc3RvcCkpIHsKKyAgICBkdG1mc3JjLT5zdGFydF90aW1lc3RhbXAgPSBsYXN0X3N0b3A7CisgIH0gZWxzZSB7CisgICAgR3N0Q2xvY2sgKmNsb2NrID0gZ3N0X2VsZW1lbnRfZ2V0X2Nsb2NrIChHU1RfRUxFTUVOVCAoZHRtZnNyYykpOworCisgICAgaWYgKGNsb2NrID09IE5VTEwpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBkdG1mc3JjLT5zdGFydF90aW1lc3RhbXAgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKGNsb2NrKQorICAgICAgICAtIGdzdF9lbGVtZW50X2dldF9iYXNlX3RpbWUgKEdTVF9FTEVNRU5UIChkdG1mc3JjKSk7CisgICAgZ3N0X29iamVjdF91bnJlZiAoY2xvY2spOworICB9CisKKyAgLyogSWYgdGhlIGxhc3Qgc3RvcCB3YXMgaW4gdGhlIHBhc3QsIHRoZW4gbGV0cyBhZGQgdGhlIGJ1ZmZlcnMgdG9nZXRoZXIgKi8KKyAgaWYgKGR0bWZzcmMtPnN0YXJ0X3RpbWVzdGFtcCA8IGR0bWZzcmMtPnRpbWVzdGFtcCkKKyAgICBkdG1mc3JjLT5zdGFydF90aW1lc3RhbXAgPSBkdG1mc3JjLT50aW1lc3RhbXA7CisKKyAgZHRtZnNyYy0+dGltZXN0YW1wID0gZHRtZnNyYy0+c3RhcnRfdGltZXN0YW1wOworCisgIGR0bWZzcmMtPnJ0cF90aW1lc3RhbXAgPSBkdG1mc3JjLT50c19iYXNlICsKKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJkdTVF9CQVNFX1NSQworICAgICAgICAgIChkdG1mc3JjKS0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLCBkdG1mc3JjLT50aW1lc3RhbXApLAorICAgICAgZHRtZnNyYy0+Y2xvY2tfcmF0ZSwgR1NUX1NFQ09ORCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHRtZl9zcmNfYWRkX3N0YXJ0X2V2ZW50IChHc3RSVFBEVE1GU3JjICogZHRtZnNyYywgZ2ludCBldmVudF9udW1iZXIsCisgICAgZ2ludCBldmVudF92b2x1bWUpCit7CisKKyAgR3N0UlRQRFRNRlNyY0V2ZW50ICpldmVudCA9IGdfc2xpY2VfbmV3MCAoR3N0UlRQRFRNRlNyY0V2ZW50KTsKKyAgZXZlbnQtPmV2ZW50X3R5cGUgPSBSVFBfRFRNRl9FVkVOVF9UWVBFX1NUQVJUOworCisgIGV2ZW50LT5wYXlsb2FkID0gZ19zbGljZV9uZXcwIChHc3RSVFBEVE1GUGF5bG9hZCk7CisgIGV2ZW50LT5wYXlsb2FkLT5ldmVudCA9IENMQU1QIChldmVudF9udW1iZXIsIE1JTl9FVkVOVCwgTUFYX0VWRU5UKTsKKyAgZXZlbnQtPnBheWxvYWQtPnZvbHVtZSA9IENMQU1QIChldmVudF92b2x1bWUsIE1JTl9WT0xVTUUsIE1BWF9WT0xVTUUpOworCisgIGdfYXN5bmNfcXVldWVfcHVzaCAoZHRtZnNyYy0+ZXZlbnRfcXVldWUsIGV2ZW50KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHRtZl9zcmNfYWRkX3N0b3BfZXZlbnQgKEdzdFJUUERUTUZTcmMgKiBkdG1mc3JjKQoreworCisgIEdzdFJUUERUTUZTcmNFdmVudCAqZXZlbnQgPSBnX3NsaWNlX25ldzAgKEdzdFJUUERUTUZTcmNFdmVudCk7CisgIGV2ZW50LT5ldmVudF90eXBlID0gUlRQX0RUTUZfRVZFTlRfVFlQRV9TVE9QOworCisgIGdfYXN5bmNfcXVldWVfcHVzaCAoZHRtZnNyYy0+ZXZlbnRfcXVldWUsIGV2ZW50KTsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9kdG1mX3ByZXBhcmVfcnRwX2hlYWRlcnMgKEdzdFJUUERUTUZTcmMgKiBkdG1mc3JjLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cGJ1ZikKK3sKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3NzcmMgKHJ0cGJ1ZiwgZHRtZnNyYy0+Y3VycmVudF9zc3JjKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3BheWxvYWRfdHlwZSAocnRwYnVmLCBkdG1mc3JjLT5wdCk7CisgIC8qIE9ubHkgdGhlIHZlcnkgZmlyc3QgcGFja2V0IGdldHMgYSBtYXJrZXIgKi8KKyAgaWYgKGR0bWZzcmMtPmZpcnN0X3BhY2tldCkgeworICAgIGdzdF9ydHBfYnVmZmVyX3NldF9tYXJrZXIgKHJ0cGJ1ZiwgVFJVRSk7CisgIH0gZWxzZSBpZiAoZHRtZnNyYy0+bGFzdF9wYWNrZXQpIHsKKyAgICBkdG1mc3JjLT5wYXlsb2FkLT5lID0gMTsKKyAgfQorCisgIGR0bWZzcmMtPnNlcW51bSsrOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfc2VxIChydHBidWYsIGR0bWZzcmMtPnNlcW51bSk7CisKKyAgLyogdGltZXN0YW1wIG9mIFJUUCBoZWFkZXIgKi8KKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3RpbWVzdGFtcCAocnRwYnVmLCBkdG1mc3JjLT5ydHBfdGltZXN0YW1wKTsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX2R0bWZfc3JjX2NyZWF0ZV9uZXh0X3J0cF9wYWNrZXQgKEdzdFJUUERUTUZTcmMgKiBkdG1mc3JjKQoreworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0UlRQRFRNRlBheWxvYWQgKnBheWxvYWQ7CisgIEdzdFJUUEJ1ZmZlciBydHBidWZmZXIgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworCisgIGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoc2l6ZW9mIChHc3RSVFBEVE1GUGF5bG9hZCksIDAsIDApOworCisgIGdzdF9ydHBfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1JFQURXUklURSwgJnJ0cGJ1ZmZlcik7CisKKyAgZ3N0X3J0cF9kdG1mX3ByZXBhcmVfcnRwX2hlYWRlcnMgKGR0bWZzcmMsICZydHBidWZmZXIpOworCisgIC8qIHRpbWVzdGFtcCBhbmQgZHVyYXRpb24gb2YgR3N0QnVmZmVyICovCisgIC8qIFJlZHVuZGFudCBidWZmZXIgaGF2ZSBubyBkdXJhdGlvbiAuLi4gKi8KKyAgaWYgKGR0bWZzcmMtPnJlZHVuZGFuY3lfY291bnQgPiAxKQorICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikgPSAwOworICBlbHNlCisgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKSA9IGR0bWZzcmMtPnB0aW1lICogR1NUX01TRUNPTkQ7CisgIEdTVF9CVUZGRVJfUFRTIChidWYpID0gZHRtZnNyYy0+dGltZXN0YW1wOworCisgIHBheWxvYWQgPSAoR3N0UlRQRFRNRlBheWxvYWQgKikgZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHBidWZmZXIpOworCisgIC8qIGNvcHkgcGF5bG9hZCBhbmQgY29udmVydCB0byBuZXR3b3JrLWJ5dGUgb3JkZXIgKi8KKyAgbWVtbW92ZSAocGF5bG9hZCwgZHRtZnNyYy0+cGF5bG9hZCwgc2l6ZW9mIChHc3RSVFBEVE1GUGF5bG9hZCkpOworCisgIHBheWxvYWQtPmR1cmF0aW9uID0gZ19odG9ucyAocGF5bG9hZC0+ZHVyYXRpb24pOworCisgIGlmIChkdG1mc3JjLT5yZWR1bmRhbmN5X2NvdW50IDw9IDEgJiYgZHRtZnNyYy0+bGFzdF9wYWNrZXQpIHsKKyAgICBHc3RDbG9ja1RpbWUgaW50ZXJfZGlnaXRfaW50ZXJ2YWwgPSBNSU5fSU5URVJfRElHSVRfSU5URVJWQUw7CisKKyAgICBpZiAoaW50ZXJfZGlnaXRfaW50ZXJ2YWwgJSBkdG1mc3JjLT5wdGltZSAhPSAwKQorICAgICAgaW50ZXJfZGlnaXRfaW50ZXJ2YWwgKz0gZHRtZnNyYy0+cHRpbWUgLQorICAgICAgICAgIChNSU5fSU5URVJfRElHSVRfSU5URVJWQUwgJSBkdG1mc3JjLT5wdGltZSk7CisKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpICs9IGludGVyX2RpZ2l0X2ludGVydmFsICogR1NUX01TRUNPTkQ7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAoZHRtZnNyYywgIkNyZWF0aW5nIG5ldyBidWZmZXIgd2l0aCBldmVudCAldSBkdXJhdGlvbiAiCisgICAgICAiIGdzdDogJSIgR1NUX1RJTUVfRk9STUFUICIgYXQgJSIgR1NUX1RJTUVfRk9STUFUICIocnRwIHRzOiV1IGR1cjoldSkiLAorICAgICAgZHRtZnNyYy0+cGF5bG9hZC0+ZXZlbnQsIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikpLCBkdG1mc3JjLT5ydHBfdGltZXN0YW1wLAorICAgICAgZHRtZnNyYy0+cGF5bG9hZC0+ZHVyYXRpb24pOworCisgIC8qIGR1cmF0aW9uIG9mIERUTUYgcGF5bG9hZGZvciB0aGUgTkVYVCBwYWNrZXQgKi8KKyAgLyogbm90IHVwZGF0ZWQgZm9yIHJlZHVuZGFudCBwYWNrZXRzICovCisgIGlmIChkdG1mc3JjLT5yZWR1bmRhbmN5X2NvdW50IDw9IDEpCisgICAgZHRtZnNyYy0+cGF5bG9hZC0+ZHVyYXRpb24gKz0gZHRtZnNyYy0+cHRpbWUgKiBkdG1mc3JjLT5jbG9ja19yYXRlIC8gMTAwMDsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGR0bWZzcmMtPnRpbWVzdGFtcCkpCisgICAgZHRtZnNyYy0+dGltZXN0YW1wICs9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1Zik7CisKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHBidWZmZXIpOworCisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBHc3RNZXNzYWdlICoKK2dzdF9kdG1mX3NyY19wcmVwYXJlX21lc3NhZ2UgKEdzdFJUUERUTUZTcmMgKiBkdG1mc3JjLAorICAgIGNvbnN0IGdjaGFyICogbWVzc2FnZV9uYW1lLCBHc3RSVFBEVE1GU3JjRXZlbnQgKiBldmVudCkKK3sKKyAgR3N0U3RydWN0dXJlICpzOworCisgIHN3aXRjaCAoZXZlbnQtPmV2ZW50X3R5cGUpIHsKKyAgICBjYXNlIFJUUF9EVE1GX0VWRU5UX1RZUEVfU1RBUlQ6CisgICAgICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKG1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAidHlwZSIsIEdfVFlQRV9JTlQsIDEsCisgICAgICAgICAgIm1ldGhvZCIsIEdfVFlQRV9JTlQsIDEsCisgICAgICAgICAgInN0YXJ0IiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsCisgICAgICAgICAgIm51bWJlciIsIEdfVFlQRV9JTlQsIGV2ZW50LT5wYXlsb2FkLT5ldmVudCwKKyAgICAgICAgICAidm9sdW1lIiwgR19UWVBFX0lOVCwgZXZlbnQtPnBheWxvYWQtPnZvbHVtZSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJUUF9EVE1GX0VWRU5UX1RZUEVfU1RPUDoKKyAgICAgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAobWVzc2FnZV9uYW1lLAorICAgICAgICAgICJ0eXBlIiwgR19UWVBFX0lOVCwgMSwgIm1ldGhvZCIsIEdfVFlQRV9JTlQsIDEsCisgICAgICAgICAgInN0YXJ0IiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUlRQX0RUTUZfRVZFTlRfVFlQRV9QQVVTRV9UQVNLOgorICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIGdzdF9tZXNzYWdlX25ld19lbGVtZW50IChHU1RfT0JKRUNUIChkdG1mc3JjKSwgcyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZHRtZl9zcmNfcG9zdF9tZXNzYWdlIChHc3RSVFBEVE1GU3JjICogZHRtZnNyYywgY29uc3QgZ2NoYXIgKiBtZXNzYWdlX25hbWUsCisgICAgR3N0UlRQRFRNRlNyY0V2ZW50ICogZXZlbnQpCit7CisgIEdzdE1lc3NhZ2UgKm0gPSBnc3RfZHRtZl9zcmNfcHJlcGFyZV9tZXNzYWdlIChkdG1mc3JjLCBtZXNzYWdlX25hbWUsIGV2ZW50KTsKKworCisgIGlmIChtKQorICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKGR0bWZzcmMpLCBtKTsKK30KKworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9kdG1mX3NyY19jcmVhdGUgKEdzdEJhc2VTcmMgKiBiYXNlc3JjLCBndWludDY0IG9mZnNldCwKKyAgICBndWludCBsZW5ndGgsIEdzdEJ1ZmZlciAqKiBidWZmZXIpCit7CisgIEdzdFJUUERUTUZTcmNFdmVudCAqZXZlbnQ7CisgIEdzdFJUUERUTUZTcmMgKmR0bWZzcmM7CisgIEdzdENsb2NrICpjbG9jazsKKyAgR3N0Q2xvY2tJRCAqY2xvY2tpZDsKKyAgR3N0Q2xvY2tSZXR1cm4gY2xvY2tyZXQ7CisgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisgIEdRdWV1ZSBtZXNzYWdlcyA9IEdfUVVFVUVfSU5JVDsKKworICBkdG1mc3JjID0gR1NUX1JUUF9EVE1GX1NSQyAoYmFzZXNyYyk7CisKKyAgZG8geworCisgICAgaWYgKGR0bWZzcmMtPnBheWxvYWQgPT0gTlVMTCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgInBvcHBpbmciKTsKKyAgICAgIGV2ZW50ID0gZ19hc3luY19xdWV1ZV9wb3AgKGR0bWZzcmMtPmV2ZW50X3F1ZXVlKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgInBvcHBlZCAlZCIsIGV2ZW50LT5ldmVudF90eXBlKTsKKworICAgICAgc3dpdGNoIChldmVudC0+ZXZlbnRfdHlwZSkgeworICAgICAgICBjYXNlIFJUUF9EVE1GX0VWRU5UX1RZUEVfU1RPUDoKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGR0bWZzcmMsCisgICAgICAgICAgICAgICJSZWNlaXZlZCBhIERUTUYgc3RvcCBldmVudCB3aGVuIGFscmVhZHkgc3RvcHBlZCIpOworICAgICAgICAgIGdzdF9kdG1mX3NyY19wb3N0X21lc3NhZ2UgKGR0bWZzcmMsICJkdG1mLWV2ZW50LWRyb3BwZWQiLCBldmVudCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSVFBfRFRNRl9FVkVOVF9UWVBFX1NUQVJUOgorICAgICAgICAgIGR0bWZzcmMtPmZpcnN0X3BhY2tldCA9IFRSVUU7CisgICAgICAgICAgZHRtZnNyYy0+bGFzdF9wYWNrZXQgPSBGQUxTRTsKKyAgICAgICAgICAvKiBTZXQgdGhlIHJlZHVuZGFuY3kgb24gdGhlIGZpcnN0IHBhY2tldCAqLworICAgICAgICAgIGR0bWZzcmMtPnJlZHVuZGFuY3lfY291bnQgPSBkdG1mc3JjLT5wYWNrZXRfcmVkdW5kYW5jeTsKKyAgICAgICAgICBpZiAoIWdzdF9ydHBfZHRtZl9wcmVwYXJlX3RpbWVzdGFtcHMgKGR0bWZzcmMpKQorICAgICAgICAgICAgZ290byBub19jbG9jazsKKworICAgICAgICAgIGdfcXVldWVfcHVzaF90YWlsICgmbWVzc2FnZXMsCisgICAgICAgICAgICAgIGdzdF9kdG1mX3NyY19wcmVwYXJlX21lc3NhZ2UgKGR0bWZzcmMsICJkdG1mLWV2ZW50LXByb2Nlc3NlZCIsCisgICAgICAgICAgICAgICAgICBldmVudCkpOworICAgICAgICAgIGR0bWZzcmMtPnBheWxvYWQgPSBldmVudC0+cGF5bG9hZDsKKyAgICAgICAgICBkdG1mc3JjLT5wYXlsb2FkLT5kdXJhdGlvbiA9CisgICAgICAgICAgICAgIGR0bWZzcmMtPnB0aW1lICogZHRtZnNyYy0+Y2xvY2tfcmF0ZSAvIDEwMDA7CisgICAgICAgICAgZXZlbnQtPnBheWxvYWQgPSBOVUxMOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUlRQX0RUTUZfRVZFTlRfVFlQRV9QQVVTRV9UQVNLOgorICAgICAgICAgIC8qCisgICAgICAgICAgICogV2UncmUgcHVzaGluZyBpdCBiYWNrIGJlY2F1c2UgaXQgaGFzIHRvIHN0YXkgaW4gdGhlcmUgdW50aWwKKyAgICAgICAgICAgKiB0aGUgdGFzayBpcyByZWFsbHkgcGF1c2VkIChhbmQgdGhlIHF1ZXVlIHdpbGwgdGhlbiBiZSBmbHVzaGVkCisgICAgICAgICAgICovCisgICAgICAgICAgR1NUX09CSkVDVF9MT0NLIChkdG1mc3JjKTsKKyAgICAgICAgICBpZiAoZHRtZnNyYy0+cGF1c2VkKSB7CisgICAgICAgICAgICBnX2FzeW5jX3F1ZXVlX3B1c2ggKGR0bWZzcmMtPmV2ZW50X3F1ZXVlLCBldmVudCk7CisgICAgICAgICAgICBnb3RvIHBhdXNlZF9sb2NrZWQ7CisgICAgICAgICAgfQorICAgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdG1mc3JjKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZ3N0X3J0cF9kdG1mX3NyY19ldmVudF9mcmVlIChldmVudCk7CisgICAgfSBlbHNlIGlmICghZHRtZnNyYy0+Zmlyc3RfcGFja2V0ICYmICFkdG1mc3JjLT5sYXN0X3BhY2tldCAmJgorICAgICAgICAoZHRtZnNyYy0+dGltZXN0YW1wIC0gZHRtZnNyYy0+c3RhcnRfdGltZXN0YW1wKSAvIEdTVF9NU0VDT05EID49CisgICAgICAgIE1JTl9QVUxTRV9EVVJBVElPTikgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgInRyeSBwb3BwaW5nIik7CisgICAgICBldmVudCA9IGdfYXN5bmNfcXVldWVfdHJ5X3BvcCAoZHRtZnNyYy0+ZXZlbnRfcXVldWUpOworCisKKyAgICAgIGlmIChldmVudCAhPSBOVUxMKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJ0cnkgcG9wcGVkICVkIiwgZXZlbnQtPmV2ZW50X3R5cGUpOworCisgICAgICAgIHN3aXRjaCAoZXZlbnQtPmV2ZW50X3R5cGUpIHsKKyAgICAgICAgICBjYXNlIFJUUF9EVE1GX0VWRU5UX1RZUEVfU1RBUlQ6CisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGR0bWZzcmMsCisgICAgICAgICAgICAgICAgIlJlY2VpdmVkIHR3byBjb25zZWN1dGl2ZSBEVE1GIHN0YXJ0IGV2ZW50cyIpOworICAgICAgICAgICAgZ3N0X2R0bWZfc3JjX3Bvc3RfbWVzc2FnZSAoZHRtZnNyYywgImR0bWYtZXZlbnQtZHJvcHBlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBSVFBfRFRNRl9FVkVOVF9UWVBFX1NUT1A6CisgICAgICAgICAgICBkdG1mc3JjLT5maXJzdF9wYWNrZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGR0bWZzcmMtPmxhc3RfcGFja2V0ID0gVFJVRTsKKyAgICAgICAgICAgIC8qIFNldCB0aGUgcmVkdW5kYW5jeSBvbiB0aGUgbGFzdCBwYWNrZXQgKi8KKyAgICAgICAgICAgIGR0bWZzcmMtPnJlZHVuZGFuY3lfY291bnQgPSBkdG1mc3JjLT5wYWNrZXRfcmVkdW5kYW5jeTsKKyAgICAgICAgICAgIGdfcXVldWVfcHVzaF90YWlsICgmbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgZ3N0X2R0bWZfc3JjX3ByZXBhcmVfbWVzc2FnZSAoZHRtZnNyYywgImR0bWYtZXZlbnQtcHJvY2Vzc2VkIiwKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBSVFBfRFRNRl9FVkVOVF9UWVBFX1BBVVNFX1RBU0s6CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogV2UncmUgcHVzaGluZyBpdCBiYWNrIGJlY2F1c2UgaXQgaGFzIHRvIHN0YXkgaW4gdGhlcmUgdW50aWwKKyAgICAgICAgICAgICAqIHRoZSB0YXNrIGlzIHJlYWxseSBwYXVzZWQgKGFuZCB0aGUgcXVldWUgd2lsbCB0aGVuIGJlIGZsdXNoZWQpCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJwdXNoaW5nIHBhdXNlX3Rhc2suLi4iKTsKKyAgICAgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZHRtZnNyYyk7CisgICAgICAgICAgICBpZiAoZHRtZnNyYy0+cGF1c2VkKSB7CisgICAgICAgICAgICAgIGdfYXN5bmNfcXVldWVfcHVzaCAoZHRtZnNyYy0+ZXZlbnRfcXVldWUsIGV2ZW50KTsKKyAgICAgICAgICAgICAgZ290byBwYXVzZWRfbG9ja2VkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGR0bWZzcmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZ3N0X3J0cF9kdG1mX3NyY19ldmVudF9mcmVlIChldmVudCk7CisgICAgICB9CisgICAgfQorICB9IHdoaWxlIChkdG1mc3JjLT5wYXlsb2FkID09IE5VTEwpOworCisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgIlByb2Nlc3NlZCBldmVudHMsIG5vdyBsZXRzIHdhaXQgb24gdGhlIGNsb2NrIik7CisKKyAgY2xvY2sgPSBnc3RfZWxlbWVudF9nZXRfY2xvY2sgKEdTVF9FTEVNRU5UIChiYXNlc3JjKSk7CisgIGlmICghY2xvY2spCisgICAgZ290byBub19jbG9jazsKKyAgY2xvY2tpZCA9IGdzdF9jbG9ja19uZXdfc2luZ2xlX3Nob3RfaWQgKGNsb2NrLCBkdG1mc3JjLT50aW1lc3RhbXAgKworICAgICAgZ3N0X2VsZW1lbnRfZ2V0X2Jhc2VfdGltZSAoR1NUX0VMRU1FTlQgKGR0bWZzcmMpKSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGNsb2NrKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGR0bWZzcmMpOworICBpZiAoIWR0bWZzcmMtPnBhdXNlZCkgeworICAgIGR0bWZzcmMtPmNsb2NraWQgPSBjbG9ja2lkOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdG1mc3JjKTsKKworICAgIGNsb2NrcmV0ID0gZ3N0X2Nsb2NrX2lkX3dhaXQgKGNsb2NraWQsIE5VTEwpOworCisgICAgR1NUX09CSkVDVF9MT0NLIChkdG1mc3JjKTsKKyAgICBpZiAoZHRtZnNyYy0+cGF1c2VkKQorICAgICAgY2xvY2tyZXQgPSBHU1RfQ0xPQ0tfVU5TQ0hFRFVMRUQ7CisgIH0gZWxzZSB7CisgICAgY2xvY2tyZXQgPSBHU1RfQ0xPQ0tfVU5TQ0hFRFVMRUQ7CisgIH0KKyAgZ3N0X2Nsb2NrX2lkX3VucmVmIChjbG9ja2lkKTsKKyAgZHRtZnNyYy0+Y2xvY2tpZCA9IE5VTEw7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdG1mc3JjKTsKKworICB3aGlsZSAoKG1lc3NhZ2UgPSBnX3F1ZXVlX3BvcF9oZWFkICgmbWVzc2FnZXMpKSAhPSBOVUxMKQorICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKGR0bWZzcmMpLCBtZXNzYWdlKTsKKworICBpZiAoY2xvY2tyZXQgPT0gR1NUX0NMT0NLX1VOU0NIRURVTEVEKSB7CisgICAgZ290byBwYXVzZWQ7CisgIH0KKworc2VuZF9sYXN0OgorCisgIGlmIChkdG1mc3JjLT5kaXJ0eSkKKyAgICBpZiAoIWdzdF9ydHBfZHRtZl9zcmNfbmVnb3RpYXRlIChiYXNlc3JjKSkKKyAgICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKworICAvKiBjcmVhdGUgYnVmZmVyIHRvIGhvbGQgdGhlIHBheWxvYWQgKi8KKyAgKmJ1ZmZlciA9IGdzdF9ydHBfZHRtZl9zcmNfY3JlYXRlX25leHRfcnRwX3BhY2tldCAoZHRtZnNyYyk7CisKKyAgaWYgKGR0bWZzcmMtPnJlZHVuZGFuY3lfY291bnQpCisgICAgZHRtZnNyYy0+cmVkdW5kYW5jeV9jb3VudC0tOworCisgIC8qIE9ubHkgdGhlIHZlcnkgZmlyc3Qgb25lIGhhcyBhIG1hcmtlciAqLworICBkdG1mc3JjLT5maXJzdF9wYWNrZXQgPSBGQUxTRTsKKworICAvKiBUaGlzIGlzIHRoZSBlbmQgb2YgdGhlIGV2ZW50ICovCisgIGlmIChkdG1mc3JjLT5sYXN0X3BhY2tldCA9PSBUUlVFICYmIGR0bWZzcmMtPnJlZHVuZGFuY3lfY291bnQgPT0gMCkgeworCisgICAgZ19zbGljZV9mcmVlIChHc3RSVFBEVE1GUGF5bG9hZCwgZHRtZnNyYy0+cGF5bG9hZCk7CisgICAgZHRtZnNyYy0+cGF5bG9hZCA9IE5VTEw7CisKKyAgICBkdG1mc3JjLT5sYXN0X3BhY2tldCA9IEZBTFNFOworICB9CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCitwYXVzZWRfbG9ja2VkOgorCisgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdG1mc3JjKTsKKworcGF1c2VkOgorCisgIGlmIChkdG1mc3JjLT5wYXlsb2FkKSB7CisgICAgZHRtZnNyYy0+Zmlyc3RfcGFja2V0ID0gRkFMU0U7CisgICAgZHRtZnNyYy0+bGFzdF9wYWNrZXQgPSBUUlVFOworICAgIC8qIFNldCB0aGUgcmVkdW5kYW5jIG9uIHRoZSBsYXN0IHBhY2tldCAqLworICAgIGR0bWZzcmMtPnJlZHVuZGFuY3lfY291bnQgPSBkdG1mc3JjLT5wYWNrZXRfcmVkdW5kYW5jeTsKKyAgICBnb3RvIHNlbmRfbGFzdDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRkxVU0hJTkc7CisgIH0KKworbm9fY2xvY2s6CisgIEdTVF9FTEVNRU5UX0VSUk9SIChkdG1mc3JjLCBTVFJFQU0sIE1VWCwgKCJObyBhdmFpbGFibGUgY2xvY2siKSwKKyAgICAgICgiTm8gYXZhaWxhYmxlIGNsb2NrIikpOworICBnc3RfcGFkX3BhdXNlX3Rhc2sgKEdTVF9CQVNFX1NSQ19QQUQgKGR0bWZzcmMpKTsKKyAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9kdG1mX3NyY19uZWdvdGlhdGUgKEdzdEJhc2VTcmMgKiBiYXNlc3JjKQoreworICBHc3RDYXBzICpzcmNjYXBzLCAqcGVlcmNhcHM7CisgIEdzdFJUUERUTUZTcmMgKmR0bWZzcmMgPSBHU1RfUlRQX0RUTUZfU1JDIChiYXNlc3JjKTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIC8qIGZpbGwgaW4gdGhlIGRlZmF1bHRzLCB0aGVyZSBwcm9wZXJ0aWVzIGNhbm5vdCBiZSBuZWdvdGlhdGVkLiAqLworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtcnRwIiwKKyAgICAgICJtZWRpYSIsIEdfVFlQRV9TVFJJTkcsICJhdWRpbyIsCisgICAgICAiZW5jb2RpbmctbmFtZSIsIEdfVFlQRV9TVFJJTkcsICJURUxFUEhPTkUtRVZFTlQiLCBOVUxMKTsKKworICAvKiB0aGUgcGVlciBjYXBzIGNhbiBvdmVycmlkZSBzb21lIG9mIHRoZSBkZWZhdWx0cyAqLworICBwZWVyY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChHU1RfQkFTRV9TUkNfUEFEIChiYXNlc3JjKSwgTlVMTCk7CisgIGlmIChwZWVyY2FwcyA9PSBOVUxMKSB7CisgICAgLyogbm8gcGVlciBjYXBzLCBqdXN0IGFkZCB0aGUgb3RoZXIgcHJvcGVydGllcyAqLworICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKHNyY2NhcHMsCisgICAgICAgICJwYXlsb2FkIiwgR19UWVBFX0lOVCwgZHRtZnNyYy0+cHQsCisgICAgICAgICJzc3JjIiwgR19UWVBFX1VJTlQsIGR0bWZzcmMtPmN1cnJlbnRfc3NyYywKKyAgICAgICAgInRpbWVzdGFtcC1vZmZzZXQiLCBHX1RZUEVfVUlOVCwgZHRtZnNyYy0+dHNfYmFzZSwKKyAgICAgICAgImNsb2NrLXJhdGUiLCBHX1RZUEVfSU5ULCBkdG1mc3JjLT5jbG9ja19yYXRlLAorICAgICAgICAic2VxbnVtLW9mZnNldCIsIEdfVFlQRV9VSU5ULCBkdG1mc3JjLT5zZXFudW1fYmFzZSwgTlVMTCk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkdG1mc3JjLCAibm8gcGVlciBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgc3JjY2Fwcyk7CisgIH0gZWxzZSB7CisgICAgR3N0Q2FwcyAqdGVtcDsKKyAgICBHc3RTdHJ1Y3R1cmUgKnM7CisgICAgY29uc3QgR1ZhbHVlICp2YWx1ZTsKKyAgICBnaW50IHB0OworICAgIGdpbnQgY2xvY2tfcmF0ZTsKKworICAgIC8qIHBlZXIgcHJvdmlkZXMgY2FwcyB3ZSBjYW4gdXNlIHRvIGZpeGF0ZSwgaW50ZXJzZWN0LiBUaGlzIGFsd2F5cyByZXR1cm5zIGEKKyAgICAgKiB3cml0YWJsZSBjYXBzLiAqLworICAgIHRlbXAgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHNyY2NhcHMsIHBlZXJjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKworICAgIGlmICghdGVtcCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgIkNvdWxkIG5vdCBnZXQgaW50ZXJzZWN0aW9uIHdpdGggcGVlciBjYXBzIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5ICh0ZW1wKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgIkludGVyc2VjdGlvbiB3aXRoIHBlZXIgY2FwcyBpcyBlbXB0eSIpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKHRlbXApOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIG5vdyBmaXhhdGUsIHN0YXJ0IGJ5IHRha2luZyB0aGUgZmlyc3QgY2FwcyAqLworICAgIHRlbXAgPSBnc3RfY2Fwc190cnVuY2F0ZSAodGVtcCk7CisgICAgdGVtcCA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKHRlbXApOworICAgIHNyY2NhcHMgPSB0ZW1wOworCisgICAgLyogZ2V0IGZpcnN0IHN0cnVjdHVyZSAqLworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChzcmNjYXBzLCAwKTsKKworICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJwYXlsb2FkIiwgJnB0KSkgeworICAgICAgLyogdXNlIHBlZXIgcHQgKi8KKyAgICAgIGR0bWZzcmMtPnB0ID0gcHQ7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZHRtZnNyYywgInVzaW5nIHBlZXIgcHQgJWQiLCBwdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgInBheWxvYWQiKSkgeworICAgICAgICAvKiBjYW4gb25seSBmaXhhdGUgaWYgdGhlcmUgaXMgYSBmaWVsZCAqLworICAgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ludCAocywgInBheWxvYWQiLCBkdG1mc3JjLT5wdCk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgInBheWxvYWQiLCAmcHQpOworICAgICAgICBHU1RfTE9HX09CSkVDVCAoZHRtZnNyYywgInVzaW5nIHBlZXIgcHQgJWQiLCBwdCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBubyBwdCBmaWVsZCwgdXNlIHRoZSBpbnRlcm5hbCBwdCAqLworICAgICAgICBwdCA9IGR0bWZzcmMtPnB0OworICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgInBheWxvYWQiLCBHX1RZUEVfSU5ULCBwdCwgTlVMTCk7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChkdG1mc3JjLCAidXNpbmcgaW50ZXJuYWwgcHQgJWQiLCBwdCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpIHsKKyAgICAgIGR0bWZzcmMtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworICAgICAgR1NUX0xPR19PQkpFQ1QgKGR0bWZzcmMsICJ1c2luZyBjbG9jay1yYXRlIGZyb20gY2FwcyAlZCIsCisgICAgICAgICAgZHRtZnNyYy0+Y2xvY2tfcmF0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChkdG1mc3JjLCAidXNpbmcgZXhpc3RpbmcgY2xvY2stcmF0ZSAlZCIsCisgICAgICAgICAgZHRtZnNyYy0+Y2xvY2tfcmF0ZSk7CisgICAgfQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiY2xvY2stcmF0ZSIsIEdfVFlQRV9JTlQsIGR0bWZzcmMtPmNsb2NrX3JhdGUsIE5VTEwpOworCisKKyAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGRfdHlwZWQgKHMsICJzc3JjIiwgR19UWVBFX1VJTlQpKSB7CisgICAgICB2YWx1ZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAic3NyYyIpOworICAgICAgZHRtZnNyYy0+Y3VycmVudF9zc3JjID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKGR0bWZzcmMsICJ1c2luZyBwZWVyIHNzcmMgJTA4eCIsIGR0bWZzcmMtPmN1cnJlbnRfc3NyYyk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEZJWE1FLCBmaXhhdGVfbmVhcmVzdF91aW50IHdvdWxkIGJlIGV2ZW4gYmV0dGVyICovCisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgInNzcmMiLCBHX1RZUEVfVUlOVCwgZHRtZnNyYy0+Y3VycmVudF9zc3JjLCBOVUxMKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChkdG1mc3JjLCAidXNpbmcgaW50ZXJuYWwgc3NyYyAlMDh4IiwKKyAgICAgICAgICBkdG1mc3JjLT5jdXJyZW50X3NzcmMpOworICAgIH0KKworICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZF90eXBlZCAocywgInRpbWVzdGFtcC1vZmZzZXQiLCBHX1RZUEVfVUlOVCkpIHsKKyAgICAgIHZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJ0aW1lc3RhbXAtb2Zmc2V0Iik7CisgICAgICBkdG1mc3JjLT50c19iYXNlID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKGR0bWZzcmMsICJ1c2luZyBwZWVyIHRpbWVzdGFtcC1vZmZzZXQgJXUiLAorICAgICAgICAgIGR0bWZzcmMtPnRzX2Jhc2UpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBGSVhNRSwgZml4YXRlX25lYXJlc3RfdWludCB3b3VsZCBiZSBldmVuIGJldHRlciAqLworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJ0aW1lc3RhbXAtb2Zmc2V0IiwgR19UWVBFX1VJTlQsIGR0bWZzcmMtPnRzX2Jhc2UsCisgICAgICAgICAgTlVMTCk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZHRtZnNyYywgInVzaW5nIGludGVybmFsIHRpbWVzdGFtcC1vZmZzZXQgJXUiLAorICAgICAgICAgIGR0bWZzcmMtPnRzX2Jhc2UpOworICAgIH0KKyAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGRfdHlwZWQgKHMsICJzZXFudW0tb2Zmc2V0IiwgR19UWVBFX1VJTlQpKSB7CisgICAgICB2YWx1ZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAic2VxbnVtLW9mZnNldCIpOworICAgICAgZHRtZnNyYy0+c2VxbnVtX2Jhc2UgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZHRtZnNyYywgInVzaW5nIHBlZXIgc2VxbnVtLW9mZnNldCAldSIsCisgICAgICAgICAgZHRtZnNyYy0+c2VxbnVtX2Jhc2UpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBGSVhNRSwgZml4YXRlX25lYXJlc3RfdWludCB3b3VsZCBiZSBldmVuIGJldHRlciAqLworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJzZXFudW0tb2Zmc2V0IiwgR19UWVBFX1VJTlQsIGR0bWZzcmMtPnNlcW51bV9iYXNlLAorICAgICAgICAgIE5VTEwpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKGR0bWZzcmMsICJ1c2luZyBpbnRlcm5hbCBzZXFudW0tb2Zmc2V0ICV1IiwKKyAgICAgICAgICBkdG1mc3JjLT5zZXFudW1fYmFzZSk7CisgICAgfQorCisgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkX3R5cGVkIChzLCAicHRpbWUiLCBHX1RZUEVfVUlOVCkpIHsKKyAgICAgIHZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJwdGltZSIpOworICAgICAgZHRtZnNyYy0+cHRpbWUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZHRtZnNyYywgInVzaW5nIHBlZXIgcHRpbWUgJXUiLCBkdG1mc3JjLT5wdGltZSk7CisgICAgfSBlbHNlIGlmIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZF90eXBlZCAocywgIm1heHB0aW1lIiwgR19UWVBFX1VJTlQpKSB7CisgICAgICB2YWx1ZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAibWF4cHRpbWUiKTsKKyAgICAgIGR0bWZzcmMtPnB0aW1lID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKGR0bWZzcmMsICJ1c2luZyBwZWVyIG1heHB0aW1lIGFzIHB0aW1lICV1IiwKKyAgICAgICAgICBkdG1mc3JjLT5wdGltZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEZJWE1FLCBmaXhhdGVfbmVhcmVzdF91aW50IHdvdWxkIGJlIGV2ZW4gYmV0dGVyICovCisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgInB0aW1lIiwgR19UWVBFX1VJTlQsIGR0bWZzcmMtPnB0aW1lLCBOVUxMKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChkdG1mc3JjLCAidXNpbmcgaW50ZXJuYWwgcHRpbWUgJXUiLCBkdG1mc3JjLT5wdGltZSk7CisgICAgfQorCisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkdG1mc3JjLCAid2l0aCBwZWVyIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBzcmNjYXBzKTsKKyAgfQorCisgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9CQVNFX1NSQ19QQUQgKGJhc2VzcmMpLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIGR0bWZzcmMtPmRpcnR5ID0gRkFMU0U7CisKKyAgcmV0dXJuIHJldDsKKworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfZHRtZl9zcmNfcXVlcnkgKEdzdEJhc2VTcmMgKiBiYXNlc3JjLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RSVFBEVE1GU3JjICpkdG1mc3JjID0gR1NUX1JUUF9EVE1GX1NSQyAoYmFzZXNyYyk7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0xBVEVOQ1k6CisgICAgeworICAgICAgR3N0Q2xvY2tUaW1lIGxhdGVuY3k7CisKKyAgICAgIGxhdGVuY3kgPSBkdG1mc3JjLT5wdGltZSAqIEdTVF9NU0VDT05EOworICAgICAgZ3N0X3F1ZXJ5X3NldF9sYXRlbmN5IChxdWVyeSwgZ3N0X2Jhc2Vfc3JjX2lzX2xpdmUgKGJhc2VzcmMpLCBsYXRlbmN5LAorICAgICAgICAgIEdTVF9DTE9DS19USU1FX05PTkUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgIlJlcG9ydGluZyBsYXRlbmN5IG9mICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChsYXRlbmN5KSk7CisgICAgICByZXMgPSBUUlVFOworICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBHU1RfQkFTRV9TUkNfQ0xBU1MgKGdzdF9ydHBfZHRtZl9zcmNfcGFyZW50X2NsYXNzKS0+cXVlcnkgKGJhc2VzcmMsCisgICAgICAgICAgcXVlcnkpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9kdG1mX3NyY19yZWFkeV90b19wYXVzZWQgKEdzdFJUUERUTUZTcmMgKiBkdG1mc3JjKQoreworICBpZiAoZHRtZnNyYy0+c3NyYyA9PSAtMSkKKyAgICBkdG1mc3JjLT5jdXJyZW50X3NzcmMgPSBnX3JhbmRvbV9pbnQgKCk7CisgIGVsc2UKKyAgICBkdG1mc3JjLT5jdXJyZW50X3NzcmMgPSBkdG1mc3JjLT5zc3JjOworCisgIGlmIChkdG1mc3JjLT5zZXFudW1fb2Zmc2V0ID09IC0xKQorICAgIGR0bWZzcmMtPnNlcW51bV9iYXNlID0gZ19yYW5kb21faW50X3JhbmdlICgwLCBHX01BWFVJTlQxNik7CisgIGVsc2UKKyAgICBkdG1mc3JjLT5zZXFudW1fYmFzZSA9IGR0bWZzcmMtPnNlcW51bV9vZmZzZXQ7CisgIGR0bWZzcmMtPnNlcW51bSA9IGR0bWZzcmMtPnNlcW51bV9iYXNlOworCisgIGlmIChkdG1mc3JjLT50c19vZmZzZXQgPT0gLTEpCisgICAgZHRtZnNyYy0+dHNfYmFzZSA9IGdfcmFuZG9tX2ludCAoKTsKKyAgZWxzZQorICAgIGR0bWZzcmMtPnRzX2Jhc2UgPSBkdG1mc3JjLT50c19vZmZzZXQ7CisKKyAgZHRtZnNyYy0+dGltZXN0YW1wID0gMDsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2R0bWZfc3JjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJUUERUTUZTcmMgKmR0bWZzcmM7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJlc3VsdDsKKyAgZ2Jvb2xlYW4gbm9fcHJlcm9sbCA9IEZBTFNFOworICBHc3RSVFBEVE1GU3JjRXZlbnQgKmV2ZW50ID0gTlVMTDsKKworICBkdG1mc3JjID0gR1NUX1JUUF9EVE1GX1NSQyAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGdzdF9ydHBfZHRtZl9zcmNfcmVhZHlfdG9fcGF1c2VkIChkdG1mc3JjKTsKKworICAgICAgLyogRmx1c2hpbmcgdGhlIGV2ZW50IHF1ZXVlICovCisgICAgICB3aGlsZSAoKGV2ZW50ID0gZ19hc3luY19xdWV1ZV90cnlfcG9wIChkdG1mc3JjLT5ldmVudF9xdWV1ZSkpICE9IE5VTEwpIHsKKyAgICAgICAgZ3N0X2R0bWZfc3JjX3Bvc3RfbWVzc2FnZSAoZHRtZnNyYywgImR0bWYtZXZlbnQtZHJvcHBlZCIsIGV2ZW50KTsKKyAgICAgICAgZ3N0X3J0cF9kdG1mX3NyY19ldmVudF9mcmVlIChldmVudCk7CisgICAgICB9CisgICAgICBkdG1mc3JjLT5sYXN0X2V2ZW50X3dhc19zdGFydCA9IEZBTFNFOworCisgICAgICBub19wcmVyb2xsID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmICgocmVzdWx0ID0KKyAgICAgICAgICBHU1RfRUxFTUVOVF9DTEFTUyAoZ3N0X3J0cF9kdG1mX3NyY19wYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUKKyAgICAgICAgICAoZWxlbWVudCwgdHJhbnNpdGlvbikpID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkKKyAgICBnb3RvIGZhaWx1cmU7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgbm9fcHJlcm9sbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorCisgICAgICAvKiBGbHVzaGluZyB0aGUgZXZlbnQgcXVldWUgKi8KKyAgICAgIHdoaWxlICgoZXZlbnQgPSBnX2FzeW5jX3F1ZXVlX3RyeV9wb3AgKGR0bWZzcmMtPmV2ZW50X3F1ZXVlKSkgIT0gTlVMTCkgeworICAgICAgICBnc3RfZHRtZl9zcmNfcG9zdF9tZXNzYWdlIChkdG1mc3JjLCAiZHRtZi1ldmVudC1kcm9wcGVkIiwgZXZlbnQpOworICAgICAgICBnc3RfcnRwX2R0bWZfc3JjX2V2ZW50X2ZyZWUgKGV2ZW50KTsKKyAgICAgIH0KKyAgICAgIGR0bWZzcmMtPmxhc3RfZXZlbnRfd2FzX3N0YXJ0ID0gRkFMU0U7CisKKyAgICAgIC8qIEluZGljYXRlIHRoYXQgd2UgZG9uJ3QgZG8gUFJFX1JPTEwgKi8KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKG5vX3ByZXJvbGwgJiYgcmVzdWx0ID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUykKKyAgICByZXN1bHQgPSBHU1RfU1RBVEVfQ0hBTkdFX05PX1BSRVJPTEw7CisKKyAgcmV0dXJuIHJlc3VsdDsKKworICAvKiBFUlJPUlMgKi8KK2ZhaWx1cmU6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkdG1mc3JjLCAicGFyZW50IGZhaWxlZCBzdGF0ZSBjaGFuZ2UiKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2R0bWZfc3JjX3VubG9jayAoR3N0QmFzZVNyYyAqIHNyYykKK3sKKyAgR3N0UlRQRFRNRlNyYyAqZHRtZnNyYyA9IEdTVF9SVFBfRFRNRl9TUkMgKHNyYyk7CisgIEdzdFJUUERUTUZTcmNFdmVudCAqZXZlbnQgPSBOVUxMOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJDYWxsZWQgdW5sb2NrIik7CisKKyAgR1NUX09CSkVDVF9MT0NLIChkdG1mc3JjKTsKKyAgZHRtZnNyYy0+cGF1c2VkID0gVFJVRTsKKyAgaWYgKGR0bWZzcmMtPmNsb2NraWQpIHsKKyAgICBnc3RfY2xvY2tfaWRfdW5zY2hlZHVsZSAoZHRtZnNyYy0+Y2xvY2tpZCk7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGR0bWZzcmMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJQdXNoaW5nIHRoZSBQQVVTRV9UQVNLIGV2ZW50IG9uIHVubG9jayByZXF1ZXN0Iik7CisgIGV2ZW50ID0gZ19zbGljZV9uZXcwIChHc3RSVFBEVE1GU3JjRXZlbnQpOworICBldmVudC0+ZXZlbnRfdHlwZSA9IFJUUF9EVE1GX0VWRU5UX1RZUEVfUEFVU0VfVEFTSzsKKyAgZ19hc3luY19xdWV1ZV9wdXNoIChkdG1mc3JjLT5ldmVudF9xdWV1ZSwgZXZlbnQpOworCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9kdG1mX3NyY191bmxvY2tfc3RvcCAoR3N0QmFzZVNyYyAqIHNyYykKK3sKKyAgR3N0UlRQRFRNRlNyYyAqZHRtZnNyYyA9IEdTVF9SVFBfRFRNRl9TUkMgKHNyYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgIlVubG9jayBzdG9wcGVkIik7CisKKyAgR1NUX09CSkVDVF9MT0NLIChkdG1mc3JjKTsKKyAgZHRtZnNyYy0+cGF1c2VkID0gRkFMU0U7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdG1mc3JjKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfZHRtZl9zcmNfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBkdG1mc3JjIiwKKyAgICAgIEdTVF9SQU5LX05PTkUsIEdTVF9UWVBFX1JUUF9EVE1GX1NSQyk7Cit9CmRpZmYgLS1naXQgYS9nc3QvZHRtZi9nc3RydHBkdG1mc3JjLmggYi9nc3QvZHRtZi9nc3RydHBkdG1mc3JjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U5MjU2YwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuaApAQCAtMCwwICsxLDExNSBAQAorLyogR1N0cmVhbWVyIFJUUCBEVE1GIHNvdXJjZQorICoKKyAqIGdzdHJ0cGR0bWZzcmMuaDoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqICAgQ29udGFjdDogWmVlc2hhbiBBbGkgPHplZXNoYW4uYWxpQG5va2lhLmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfRFRNRl9TUkNfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9EVE1GX1NSQ19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNlc3JjLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworI2luY2x1ZGUgImdzdGR0bWZjb21tb24uaCIKKworR19CRUdJTl9ERUNMUworI2RlZmluZSBHU1RfVFlQRV9SVFBfRFRNRl9TUkMJCShnc3RfcnRwX2R0bWZfc3JjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfRFRNRl9TUkMob2JqKQkJKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9EVE1GX1NSQyxHc3RSVFBEVE1GU3JjKSkKKyNkZWZpbmUgR1NUX1JUUF9EVE1GX1NSQ19DTEFTUyhrbGFzcykJKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0RUTUZfU1JDLEdzdFJUUERUTUZTcmNDbGFzcykpCisjZGVmaW5lIEdTVF9SVFBfRFRNRl9TUkNfR0VUX0NMQVNTKG9iaikgICAgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfUlRQX0RUTUZfU1JDLCBHc3RSVFBEVE1GU3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0RUTUZfU1JDKG9iaikJCShHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfRFRNRl9TUkMpKQorI2RlZmluZSBHU1RfSVNfUlRQX0RUTUZfU1JDX0NMQVNTKGtsYXNzKQkoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfRFRNRl9TUkMpKQorI2RlZmluZSBHU1RfUlRQX0RUTUZfU1JDX0NBU1Qob2JqKQkJKChHc3RSVFBEVE1GU3JjICopKG9iaikpCit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQRFRNRlNyYyBHc3RSVFBEVE1GU3JjOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUERUTUZTcmNDbGFzcyBHc3RSVFBEVE1GU3JjQ2xhc3M7CisKKworCitlbnVtIF9Hc3RSVFBEVE1GRXZlbnRUeXBlCit7CisgIFJUUF9EVE1GX0VWRU5UX1RZUEVfU1RBUlQsCisgIFJUUF9EVE1GX0VWRU5UX1RZUEVfU1RPUCwKKyAgUlRQX0RUTUZfRVZFTlRfVFlQRV9QQVVTRV9UQVNLCit9OworCit0eXBlZGVmIGVudW0gX0dzdFJUUERUTUZFdmVudFR5cGUgR3N0UlRQRFRNRkV2ZW50VHlwZTsKKworc3RydWN0IF9Hc3RSVFBEVE1GU3JjRXZlbnQKK3sKKyAgR3N0UlRQRFRNRkV2ZW50VHlwZSBldmVudF90eXBlOworICBHc3RSVFBEVE1GUGF5bG9hZCAqcGF5bG9hZDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBEVE1GU3JjRXZlbnQgR3N0UlRQRFRNRlNyY0V2ZW50OworCisvKioKKyAqIEdzdFJUUERUTUZTcmM6CisgKiBAZWxlbWVudDogdGhlIHBhcmVudCBlbGVtZW50LgorICoKKyAqIFRoZSBvcGFxdWUgI0dzdFJUUERUTUZTcmMgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0UlRQRFRNRlNyYworeworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgR3N0QmFzZVNyYyBiYXNlc3JjOworCisgIEdBc3luY1F1ZXVlICpldmVudF9xdWV1ZTsKKyAgR3N0Q2xvY2tJRCBjbG9ja2lkOworICBnYm9vbGVhbiBwYXVzZWQ7CisgIEdzdFJUUERUTUZQYXlsb2FkICpwYXlsb2FkOworCisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisgIEdzdENsb2NrVGltZSBzdGFydF90aW1lc3RhbXA7CisgIGdib29sZWFuIGZpcnN0X3BhY2tldDsKKyAgZ2Jvb2xlYW4gbGFzdF9wYWNrZXQ7CisgIGd1aW50MzIgdHNfYmFzZTsKKyAgZ3VpbnQxNiBzZXFudW1fYmFzZTsKKyAgZ2ludDE2IHNlcW51bV9vZmZzZXQ7CisgIGd1aW50MTYgc2VxbnVtOworICBnaW50MzIgdHNfb2Zmc2V0OworICBndWludDMyIHJ0cF90aW1lc3RhbXA7CisgIGd1aW50IHB0OworICBndWludCBzc3JjOworICBndWludCBjdXJyZW50X3NzcmM7CisgIGd1aW50MTYgcHRpbWU7CisgIGd1aW50MTYgcGFja2V0X3JlZHVuZGFuY3k7CisgIGd1aW50MzIgY2xvY2tfcmF0ZTsKKyAgZ2Jvb2xlYW4gbGFzdF9ldmVudF93YXNfc3RhcnQ7CisKKyAgR3N0Q2xvY2tUaW1lIGxhc3Rfc3RvcDsKKworICBnYm9vbGVhbiBkaXJ0eTsKKyAgZ3VpbnQxNiByZWR1bmRhbmN5X2NvdW50OworfTsKKworc3RydWN0IF9Hc3RSVFBEVE1GU3JjQ2xhc3MKK3sKKyAgR3N0QmFzZVNyY0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfZHRtZl9zcmNfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2R0bWZfc3JjX3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCisKK0dfRU5EX0RFQ0xTCisjZW5kaWYgLyogX19HU1RfUlRQX0RUTUZfU1JDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2R0bWYvbWVzb24uYnVpbGQgYi9nc3QvZHRtZi9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjcyMDFmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2R0bWYvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxNiBAQAorZHRtZl9zb3VyY2VzID0gWworICAnZ3N0ZHRtZnNyYy5jJywKKyAgJ2dzdHJ0cGR0bWZzcmMuYycsCisgICdnc3RydHBkdG1mZGVwYXkuYycsCisgICdnc3RkdG1mLmMnCitdCisKK2dzdGR0bWYgPSBsaWJyYXJ5KCdnc3RkdG1mJywKKyAgZHRtZl9zb3VyY2VzLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdGJhc2VfZGVwLCBnc3RydHBfZGVwLCBsaWJtXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKKwpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvTElDRU5TRSBiL2dzdC9lZmZlY3R2L0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlZGViZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L0xJQ0VOU0UKQEAgLTAsMCArMSwxNCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIEVmZmVjVFY6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgRlVLVUNISSBLZW50YXJvdQorICoKKyAqIEVmZmVjVFYgaXMgZnJlZSBzb2Z0d2FyZS4gV2UgcmVsZWFzZSB0aGlzIHByb2R1Y3QgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGUgbGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGUgZmlsZQorICogQ09QWUlORy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCisgKiBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KZGlmZiAtLWdpdCBhL2dzdC9lZmZlY3R2L01ha2VmaWxlLmFtIGIvZ3N0L2VmZmVjdHYvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjNzA3NgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjEgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdGVmZmVjdHYubGEKKworbGliZ3N0ZWZmZWN0dl9sYV9TT1VSQ0VTID0gXAorCWdzdGVmZmVjdHYuYyBnc3RlZGdlLmMgZ3N0YWdpbmcuYyBnc3RkaWNlLmMgZ3N0d2FycC5jIFwKKwlnc3RzaGFnYWRlbGljLmMgZ3N0dmVydGlnby5jIGdzdHJldi5jIGdzdHF1YXJrLmMgZ3N0b3AuYyBcCisJZ3N0cmFkaW9hYy5jIGdzdHN0cmVhay5jIGdzdHJpcHBsZS5jCitsaWJnc3RlZmZlY3R2X2xhX0NGTEFHUyA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9DRkxBR1MpIFwKKwktSSQodG9wX3NyY2RpcikvZ3N0L3ZpZGVvZmlsdGVyCitsaWJnc3RlZmZlY3R2X2xhX0xJQkFERCA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R2aWRlby1AR1NUX0FQSV9WRVJTSU9OQCBcCisJJChHU1RfQkFTRV9MSUJTKSBcCisJJChHU1RfTElCUykgXAorCSQoTElCTSkKK2xpYmdzdGVmZmVjdHZfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdGVmZmVjdHYuaCBnc3RhZ2luZy5oIGdzdGRpY2UuaCBnc3RlZGdlLmggXAorICAgICAgICBnc3RxdWFyay5oIGdzdHJldi5oIGdzdHNoYWdhZGVsaWMuaCBnc3R2ZXJ0aWdvLmggZ3N0d2FycC5oIGdzdG9wLmggXAorCWdzdHJhZGlvYWMuaCBnc3RzdHJlYWsuaCBnc3RyaXBwbGUuaApkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuYyBiL2dzdC9lZmZlY3R2L2dzdGFnaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxYjYzYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L2dzdGFnaW5nLmMKQEAgLTAsMCArMSw0MDIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogRWZmZWNUViAtIFJlYWx0aW1lIERpZ2l0YWwgVmlkZW8gRWZmZWN0b3IKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEZVS1VDSEkgS2VudGFyb3UKKyAqCisgKiBBZ2luZ1RWIC0gZmlsbS1hZ2luZyBlZmZlY3QuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYWdpbmd0dgorICoKKyAqIEFnaW5nVFYgYWdlcyBhIHZpZGVvIHN0cmVhbSBpbiByZWFsdGltZSwgY2hhbmdlcyB0aGUgY29sb3JzIGFuZCBhZGRzCisgKiBzY3JhdGNoZXMgYW5kIGR1c3QuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyAhIGFnaW5ndHYgISB2aWRlb2NvbnZlcnQgISBhdXRvdmlkZW9zaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIHNob3dzIHRoZSBlZmZlY3Qgb2YgYWdpbmd0diBvbiBhIHRlc3Qgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJnc3RhZ2luZy5oIgorI2luY2x1ZGUgImdzdGVmZmVjdHYuaCIKKworc3RhdGljIGNvbnN0IGdpbnQgZHhbOF0gPSB7IDEsIDEsIDAsIC0xLCAtMSwgLTEsIDAsIDEgfTsKK3N0YXRpYyBjb25zdCBnaW50IGR5WzhdID0geyAwLCAtMSwgLTEsIC0xLCAwLCAxLCAxLCAxIH07CisKK2VudW0KK3sKKyAgUFJPUF8wID0gMCwKKyAgUFJPUF9TQ1JBVENIX0xJTkVTLAorICBQUk9QX0NPTE9SX0FHSU5HLAorICBQUk9QX1BJVFMsCisgIFBST1BfRFVTVFMKK307CisKKyNkZWZpbmUgREVGQVVMVF9TQ1JBVENIX0xJTkVTIDcKKyNkZWZpbmUgREVGQVVMVF9DT0xPUl9BR0lORyBUUlVFCisjZGVmaW5lIERFRkFVTFRfUElUUyBUUlVFCisjZGVmaW5lIERFRkFVTFRfRFVTVFMgVFJVRQorCisjaWYgR19CWVRFX09SREVSID09IEdfTElUVExFX0VORElBTgorI2RlZmluZSBDQVBTX1NUUiBHU1RfVklERU9fQ0FQU19NQUtFICgieyBCR1J4LCBSR0J4IH0iKQorI2Vsc2UKKyNkZWZpbmUgQ0FQU19TVFIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgeFJHQiwgeEJHUiB9IikKKyNlbmRpZgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X2FnaW5ndHZfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKENBUFNfU1RSKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfYWdpbmd0dl9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoQ0FQU19TVFIpCisgICAgKTsKKworR19ERUZJTkVfVFlQRSAoR3N0QWdpbmdUViwgZ3N0X2FnaW5ndHYsIEdTVF9UWVBFX1ZJREVPX0ZJTFRFUik7CisKK3N0YXRpYyB2b2lkCitjb2xvcmFnaW5nIChndWludDMyICogc3JjLCBndWludDMyICogZGVzdCwgZ2ludCB2aWRlb19hcmVhLCBnaW50ICogYykKK3sKKyAgZ3VpbnQzMiBhLCBiOworICBnaW50IGk7CisgIGdpbnQgY190bXAgPSAqYzsKKworICBjX3RtcCAtPSAoZ2ludCkgKGZhc3RyYW5kICgpKSA+PiAyODsKKyAgaWYgKGNfdG1wIDwgMCkKKyAgICBjX3RtcCA9IDA7CisgIGlmIChjX3RtcCA+IDB4MTgpCisgICAgY190bXAgPSAweDE4OworCisgIGZvciAoaSA9IDA7IGkgPCB2aWRlb19hcmVhOyBpKyspIHsKKyAgICBhID0gKnNyYysrOworICAgIGIgPSAoYSAmIDB4ZmNmY2ZjKSA+PiAyOworICAgICpkZXN0KysgPQorICAgICAgICBhIC0gYiArIChjX3RtcCB8IChjX3RtcCA8PCA4KSB8IChjX3RtcCA8PCAxNikpICsKKyAgICAgICAgKChmYXN0cmFuZCAoKSA+PiA4KSAmIDB4MTAxMDEwKTsKKyAgfQorICAqYyA9IGNfdG1wOworfQorCisKK3N0YXRpYyB2b2lkCitzY3JhdGNoaW5nIChzY3JhdGNoICogc2NyYXRjaGVzLCBnaW50IHNjcmF0Y2hfbGluZXMsIGd1aW50MzIgKiBkZXN0LCBnaW50IHdpZHRoLAorICAgIGdpbnQgaGVpZ2h0KQoreworICBnaW50IGksIHksIHkxLCB5MjsKKyAgZ3VpbnQzMiAqcCwgYSwgYjsKKyAgc2NyYXRjaCAqc2NyYXRjaDsKKworICBmb3IgKGkgPSAwOyBpIDwgc2NyYXRjaF9saW5lczsgaSsrKSB7CisgICAgc2NyYXRjaCA9ICZzY3JhdGNoZXNbaV07CisKKyAgICBpZiAoc2NyYXRjaC0+bGlmZSkgeworICAgICAgc2NyYXRjaC0+eCA9IHNjcmF0Y2gtPnggKyBzY3JhdGNoLT5keDsKKworICAgICAgaWYgKHNjcmF0Y2gtPnggPCAwIHx8IHNjcmF0Y2gtPnggPiB3aWR0aCAqIDI1NikgeworICAgICAgICBzY3JhdGNoLT5saWZlID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBwID0gZGVzdCArIChzY3JhdGNoLT54ID4+IDgpOworICAgICAgaWYgKHNjcmF0Y2gtPmluaXQpIHsKKyAgICAgICAgeTEgPSBzY3JhdGNoLT5pbml0OworICAgICAgICBzY3JhdGNoLT5pbml0ID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHkxID0gMDsKKyAgICAgIH0KKyAgICAgIHNjcmF0Y2gtPmxpZmUtLTsKKyAgICAgIGlmIChzY3JhdGNoLT5saWZlKSB7CisgICAgICAgIHkyID0gaGVpZ2h0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgeTIgPSBmYXN0cmFuZCAoKSAlIGhlaWdodDsKKyAgICAgIH0KKyAgICAgIGZvciAoeSA9IHkxOyB5IDwgeTI7IHkrKykgeworICAgICAgICBhID0gKnAgJiAweGZlZmVmZjsKKyAgICAgICAgYSArPSAweDIwMjAyMDsKKyAgICAgICAgYiA9IGEgJiAweDEwMTAxMDA7CisgICAgICAgICpwID0gYSB8IChiIC0gKGIgPj4gOCkpOworICAgICAgICBwICs9IHdpZHRoOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoKGZhc3RyYW5kICgpICYgMHhmMDAwMDAwMCkgPT0gMCkgeworICAgICAgICBzY3JhdGNoLT5saWZlID0gMiArIChmYXN0cmFuZCAoKSA+PiAyNyk7CisgICAgICAgIHNjcmF0Y2gtPnggPSBmYXN0cmFuZCAoKSAlICh3aWR0aCAqIDI1Nik7CisgICAgICAgIHNjcmF0Y2gtPmR4ID0gKChpbnQpIGZhc3RyYW5kICgpKSA+PiAyMzsKKyAgICAgICAgc2NyYXRjaC0+aW5pdCA9IChmYXN0cmFuZCAoKSAlIChoZWlnaHQgLSAxKSkgKyAxOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZHVzdHMgKGd1aW50MzIgKiBkZXN0LCBnaW50IHdpZHRoLCBnaW50IGhlaWdodCwgZ2ludCAqIGR1c3RfaW50ZXJ2YWwsCisgICAgZ2ludCBhcmVhX3NjYWxlKQoreworICBnaW50IGksIGo7CisgIGdpbnQgZG51bTsKKyAgZ2ludCBkLCBsZW47CisgIGd1aW50IHgsIHk7CisKKyAgaWYgKCpkdXN0X2ludGVydmFsID09IDApIHsKKyAgICBpZiAoKGZhc3RyYW5kICgpICYgMHhmMDAwMDAwMCkgPT0gMCkgeworICAgICAgKmR1c3RfaW50ZXJ2YWwgPSBmYXN0cmFuZCAoKSA+PiAyOTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGRudW0gPSBhcmVhX3NjYWxlICogNCArIChmYXN0cmFuZCAoKSA+PiAyNyk7CisKKyAgZm9yIChpID0gMDsgaSA8IGRudW07IGkrKykgeworICAgIHggPSBmYXN0cmFuZCAoKSAlIHdpZHRoOworICAgIHkgPSBmYXN0cmFuZCAoKSAlIGhlaWdodDsKKyAgICBkID0gZmFzdHJhbmQgKCkgPj4gMjk7CisgICAgbGVuID0gZmFzdHJhbmQgKCkgJSBhcmVhX3NjYWxlICsgNTsKKyAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKyAgICAgIGRlc3RbeSAqIHdpZHRoICsgeF0gPSAweDEwMTAxMDsKKyAgICAgIHkgKz0gZHlbZF07CisgICAgICB4ICs9IGR4W2RdOworCisgICAgICBpZiAoeSA+PSBoZWlnaHQgfHwgeCA+PSB3aWR0aCkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGQgPSAoZCArIGZhc3RyYW5kICgpICUgMyAtIDEpICYgNzsKKyAgICB9CisgIH0KKyAgKmR1c3RfaW50ZXJ2YWwgPSAqZHVzdF9pbnRlcnZhbCAtIDE7Cit9CisKK3N0YXRpYyB2b2lkCitwaXRzIChndWludDMyICogZGVzdCwgZ2ludCB3aWR0aCwgZ2ludCBoZWlnaHQsIGdpbnQgYXJlYV9zY2FsZSwKKyAgICBnaW50ICogcGl0c19pbnRlcnZhbCkKK3sKKyAgZ2ludCBpLCBqOworICBnaW50IHBudW0sIHNpemUsIHBudW1zY2FsZTsKKyAgZ3VpbnQgeCwgeTsKKworICBwbnVtc2NhbGUgPSBhcmVhX3NjYWxlICogMjsKKyAgaWYgKCpwaXRzX2ludGVydmFsKSB7CisgICAgcG51bSA9IHBudW1zY2FsZSArIChmYXN0cmFuZCAoKSAlIHBudW1zY2FsZSk7CisKKyAgICAqcGl0c19pbnRlcnZhbCA9ICpwaXRzX2ludGVydmFsIC0gMTsKKyAgfSBlbHNlIHsKKyAgICBwbnVtID0gZmFzdHJhbmQgKCkgJSBwbnVtc2NhbGU7CisKKyAgICBpZiAoKGZhc3RyYW5kICgpICYgMHhmODAwMDAwMCkgPT0gMCkgeworICAgICAgKnBpdHNfaW50ZXJ2YWwgPSAoZmFzdHJhbmQgKCkgPj4gMjgpICsgMjA7CisgICAgfQorICB9CisgIGZvciAoaSA9IDA7IGkgPCBwbnVtOyBpKyspIHsKKyAgICB4ID0gZmFzdHJhbmQgKCkgJSAod2lkdGggLSAxKTsKKyAgICB5ID0gZmFzdHJhbmQgKCkgJSAoaGVpZ2h0IC0gMSk7CisKKyAgICBzaXplID0gZmFzdHJhbmQgKCkgPj4gMjg7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7CisgICAgICB4ID0geCArIGZhc3RyYW5kICgpICUgMyAtIDE7CisgICAgICB5ID0geSArIGZhc3RyYW5kICgpICUgMyAtIDE7CisKKyAgICAgIGlmICh5ID49IGhlaWdodCB8fCB4ID49IHdpZHRoKQorICAgICAgICBicmVhazsKKworICAgICAgZGVzdFt5ICogd2lkdGggKyB4XSA9IDB4YzBjMGMwOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2FnaW5ndHZfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEFnaW5nVFYgKmFnaW5ndHYgPSBHU1RfQUdJTkdUViAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGFnaW5ndHYpOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU0NSQVRDSF9MSU5FUzoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBhZ2luZ3R2LT5zY3JhdGNoX2xpbmVzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT0xPUl9BR0lORzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBhZ2luZ3R2LT5jb2xvcl9hZ2luZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUElUUzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBhZ2luZ3R2LT5waXRzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9EVVNUUzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBhZ2luZ3R2LT5kdXN0cyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoYWdpbmd0dik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYWdpbmd0dl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QWdpbmdUViAqYWdpbmd0diA9IEdTVF9BR0lOR1RWIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TQ1JBVENIX0xJTkVTOgorICAgICAgYWdpbmd0di0+c2NyYXRjaF9saW5lcyA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT0xPUl9BR0lORzoKKyAgICAgIGFnaW5ndHYtPmNvbG9yX2FnaW5nID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BJVFM6CisgICAgICBhZ2luZ3R2LT5waXRzID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RVU1RTOgorICAgICAgYWdpbmd0di0+ZHVzdHMgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hZ2luZ3R2X3N0YXJ0IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpCit7CisgIEdzdEFnaW5nVFYgKmFnaW5ndHYgPSBHU1RfQUdJTkdUViAodHJhbnMpOworCisgIGFnaW5ndHYtPmNvbG9yYWdpbmdfc3RhdGUgPSAweDE4OworICBhZ2luZ3R2LT5kdXN0X2ludGVydmFsID0gMDsKKyAgYWdpbmd0di0+cGl0c19pbnRlcnZhbCA9IDA7CisKKyAgbWVtc2V0IChhZ2luZ3R2LT5zY3JhdGNoZXMsIDAsIHNpemVvZiAoYWdpbmd0di0+c2NyYXRjaGVzKSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYWdpbmd0dl90cmFuc2Zvcm1fZnJhbWUgKEdzdFZpZGVvRmlsdGVyICogZmlsdGVyLCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSkKK3sKKyAgR3N0QWdpbmdUViAqYWdpbmd0diA9IEdTVF9BR0lOR1RWIChmaWx0ZXIpOworICBnaW50IGFyZWFfc2NhbGU7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIHN0cmVhbV90aW1lOworICBnaW50IHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgdmlkZW9fc2l6ZTsKKyAgZ3VpbnQzMiAqc3JjLCAqZGVzdDsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5fZnJhbWUtPmJ1ZmZlcik7CisgIHN0cmVhbV90aW1lID0KKyAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmR1NUX0JBU0VfVFJBTlNGT1JNIChmaWx0ZXIpLT5zZWdtZW50LAorICAgICAgR1NUX0ZPUk1BVF9USU1FLCB0aW1lc3RhbXApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGFnaW5ndHYsICJzeW5jIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtX3RpbWUpKQorICAgIGdzdF9vYmplY3Rfc3luY192YWx1ZXMgKEdTVF9PQkpFQ1QgKGFnaW5ndHYpLCBzdHJlYW1fdGltZSk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworICBzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChpbl9mcmFtZSwgMCk7CisgIHZpZGVvX3NpemUgPSBzdHJpZGUgKiBoZWlnaHQgLyA0OworCisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKworICBhcmVhX3NjYWxlID0gd2lkdGggKiBoZWlnaHQgLyA2NCAvIDQ4MDsKKyAgaWYgKGFyZWFfc2NhbGUgPD0gMCkKKyAgICBhcmVhX3NjYWxlID0gMTsKKworICBpZiAoYWdpbmd0di0+Y29sb3JfYWdpbmcpCisgICAgY29sb3JhZ2luZyAoc3JjLCBkZXN0LCB2aWRlb19zaXplLCAmYWdpbmd0di0+Y29sb3JhZ2luZ19zdGF0ZSk7CisgIGVsc2UKKyAgICBtZW1jcHkgKGRlc3QsIHNyYywgc3RyaWRlICogaGVpZ2h0KTsKKworICBzY3JhdGNoaW5nIChhZ2luZ3R2LT5zY3JhdGNoZXMsIGFnaW5ndHYtPnNjcmF0Y2hfbGluZXMsIGRlc3QsIHdpZHRoLCBoZWlnaHQpOworICBpZiAoYWdpbmd0di0+cGl0cykKKyAgICBwaXRzIChkZXN0LCB3aWR0aCwgaGVpZ2h0LCBhcmVhX3NjYWxlLCAmYWdpbmd0di0+cGl0c19pbnRlcnZhbCk7CisgIGlmIChhcmVhX3NjYWxlID4gMSAmJiBhZ2luZ3R2LT5kdXN0cykKKyAgICBkdXN0cyAoZGVzdCwgd2lkdGgsIGhlaWdodCwgJmFnaW5ndHYtPmR1c3RfaW50ZXJ2YWwsIGFyZWFfc2NhbGUpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hZ2luZ3R2X2NsYXNzX2luaXQgKEdzdEFnaW5nVFZDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKnRyYW5zX2NsYXNzID0gKEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqKSBrbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzcyA9IChHc3RWaWRlb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9hZ2luZ3R2X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2FnaW5ndHZfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU0NSQVRDSF9MSU5FUywKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgic2NyYXRjaC1saW5lcyIsICJTY3JhdGNoIExpbmVzIiwKKyAgICAgICAgICAiTnVtYmVyIG9mIHNjcmF0Y2ggbGluZXMiLCAwLCBTQ1JBVENIX01BWCwgREVGQVVMVF9TQ1JBVENIX0xJTkVTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NPTE9SX0FHSU5HLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJjb2xvci1hZ2luZyIsICJDb2xvciBBZ2luZyIsCisgICAgICAgICAgIkNvbG9yIEFnaW5nIiwgREVGQVVMVF9DT0xPUl9BR0lORywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QSVRTLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJwaXRzIiwgIlBpdHMiLAorICAgICAgICAgICJQaXRzIiwgREVGQVVMVF9QSVRTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RVU1RTLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJkdXN0cyIsICJEdXN0cyIsCisgICAgICAgICAgIkR1c3RzIiwgREVGQVVMVF9EVVNUUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkFnaW5nVFYgZWZmZWN0IiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1ZpZGVvIiwKKyAgICAgICJBZ2luZ1RWIGFkZHMgYWdlIHRvIHZpZGVvIGlucHV0IHVzaW5nIHNjcmF0Y2hlcyBhbmQgZHVzdCIsCisgICAgICAiU2FtIExhbnRpbmdhIDxzbG91a2VuQGRldm9sdXRpb24uY29tPiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9hZ2luZ3R2X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfYWdpbmd0dl9zcmNfdGVtcGxhdGUpOworCisgIHRyYW5zX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWdpbmd0dl9zdGFydCk7CisKKyAgdmZpbHRlcl9jbGFzcy0+dHJhbnNmb3JtX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWdpbmd0dl90cmFuc2Zvcm1fZnJhbWUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2FnaW5ndHZfaW5pdCAoR3N0QWdpbmdUViAqIGFnaW5ndHYpCit7CisgIGFnaW5ndHYtPnNjcmF0Y2hfbGluZXMgPSBERUZBVUxUX1NDUkFUQ0hfTElORVM7CisgIGFnaW5ndHYtPmNvbG9yX2FnaW5nID0gREVGQVVMVF9DT0xPUl9BR0lORzsKKyAgYWdpbmd0di0+cGl0cyA9IERFRkFVTFRfUElUUzsKKyAgYWdpbmd0di0+ZHVzdHMgPSBERUZBVUxUX0RVU1RTOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuaCBiL2dzdC9lZmZlY3R2L2dzdGFnaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI0NjZkMQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L2dzdGFnaW5nLmgKQEAgLTAsMCArMSw4OSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBFZmZlY1RWIC0gUmVhbHRpbWUgRGlnaXRhbCBWaWRlbyBFZmZlY3RvcgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgRlVLVUNISSBLZW50YXJvdQorICoKKyAqIEFnaW5nVFYgLSBmaWxtLWFnaW5nIGVmZmVjdC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0FHSU5HX0hfXworI2RlZmluZSBfX0dTVF9BR0lOR19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2ZpbHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQUdJTkdUViBcCisgIChnc3RfYWdpbmd0dl9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQUdJTkdUVihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0FHSU5HVFYsR3N0QWdpbmdUVikpCisjZGVmaW5lIEdTVF9BR0lOR1RWX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0FHSU5HVFYsR3N0QWdpbmdUVkNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FHSU5HVFYob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9BR0lOR1RWKSkKKyNkZWZpbmUgR1NUX0lTX0FHSU5HVFZfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfQUdJTkdUVikpCisKK3R5cGVkZWYgc3RydWN0IF9zY3JhdGNoCit7CisgIGdpbnQgbGlmZTsKKyAgZ2ludCB4OworICBnaW50IGR4OworICBnaW50IGluaXQ7Cit9IHNjcmF0Y2g7CisjZGVmaW5lIFNDUkFUQ0hfTUFYIDIwCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBZ2luZ1RWIEdzdEFnaW5nVFY7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QWdpbmdUVkNsYXNzIEdzdEFnaW5nVFZDbGFzczsKKworc3RydWN0IF9Hc3RBZ2luZ1RWCit7CisgIEdzdFZpZGVvRmlsdGVyIHZpZGVvZmlsdGVyOworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIGdib29sZWFuIGNvbG9yX2FnaW5nOworICBnYm9vbGVhbiBwaXRzOworICBnYm9vbGVhbiBkdXN0czsKKworICBnaW50IGNvbG9yYWdpbmdfc3RhdGU7CisKKyAgc2NyYXRjaCBzY3JhdGNoZXNbU0NSQVRDSF9NQVhdOworICBnaW50IHNjcmF0Y2hfbGluZXM7CisKKyAgZ2ludCBkdXN0X2ludGVydmFsOworICBnaW50IHBpdHNfaW50ZXJ2YWw7CisKK307CisKK3N0cnVjdCBfR3N0QWdpbmdUVkNsYXNzCit7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2FnaW5ndHZfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfQUdJTkdfSF9fICovCisKZGlmZiAtLWdpdCBhL2dzdC9lZmZlY3R2L2dzdGRpY2UuYyBiL2dzdC9lZmZlY3R2L2dzdGRpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzZlMTExCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jCkBAIC0wLDAgKzEsMzE1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBkaWNlLmM6IGEgJ2RpY2luZycgZWZmZWN0CisgKiAgY29weXJpZ2h0IChjKSAyMDAxIFNhbSBNZXJ0ZW5zLiAgVGhpcyBjb2RlIGlzIHN1YmplY3QgdG8gdGhlIHByb3Zpc2lvbnMgb2YKKyAqICB0aGUgR05VIExpYnJhcnkgUHVibGljIExpY2Vuc2UuCisgKgorICogSSBzdXBwb3NlIHRoaXMgbG9va3Mgc2ltaWxhciB0byBQdXp6bGVUViwgYnV0IGl0J3Mgbm90LiBUaGUgc2NyZWVuIGlzCisgKiBkaXZpZGVkIGludG8gc21hbGwgc3F1YXJlcywgZWFjaCBvZiB3aGljaCBpcyByb3RhdGVkIGVpdGhlciAwLCA5MCwgMTgwIG9yCisgKiAyNzAgZGVncmVlcy4gIFRoZSBhbW91bnQgb2Ygcm90YXRpb24gZm9yIGVhY2ggc3F1YXJlIGlzIGNob3NlbiBhdCByYW5kb20uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtZGljZXR2CisgKgorICogRGljZVRWICdkaWNlcycgdGhlIHNjcmVlbiB1cCBpbnRvIG1hbnkgc21hbGwgc3F1YXJlcywgZWFjaCBkZWZhdWx0aW5nCisgKiB0byBhIHNpemUgb2YgMTYgcGl4ZWxzIGJ5IDE2IHBpeGVscy4uIEVhY2ggc3F1YXJlIGlzIHJvdGF0ZWQgcmFuZG9tbHkKKyAqIGluIG9uZSBvZiBmb3VyIGRpcmVjdGlvbnM6IHVwIChubyBjaGFuZ2UpLCBkb3duICgxODAgZGVncmVlcywgb3IKKyAqIHVwc2lkZSBkb3duKSwgcmlnaHQgKDkwIGRlZ3JlZXMgY2xvY2t3aXNlKSwgb3IgbGVmdCAoOTAgZGVncmVlcworICogY291bnRlcmNsb2Nrd2lzZSkuIFRoZSBkaXJlY3Rpb24gb2YgZWFjaCBzcXVhcmUgbm9ybWFsbHkgcmVtYWlucworICogY29uc2lzdGVudCBiZXR3ZWVuIGVhY2ggZnJhbWUuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyAhIGRpY2V0diAhIHZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsKKyAqIF18IFRoaXMgcGlwZWxpbmUgc2hvd3MgdGhlIGVmZmVjdCBvZiBkaWNldHYgb24gYSB0ZXN0IHN0cmVhbS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RkaWNlLmgiCisjaW5jbHVkZSAiZ3N0ZWZmZWN0di5oIgorCisjZGVmaW5lIERFRkFVTFRfQ1VCRV9CSVRTICAgNAorI2RlZmluZSBNQVhfQ1VCRV9CSVRTICAgICAgIDUKKyNkZWZpbmUgTUlOX0NVQkVfQklUUyAgICAgICAwCisKK3R5cGVkZWYgZW51bSBfZGljZV9kaXIKK3sKKyAgRElDRV9VUCA9IDAsCisgIERJQ0VfUklHSFQgPSAxLAorICBESUNFX0RPV04gPSAyLAorICBESUNFX0xFRlQgPSAzCit9IERpY2VEaXI7CisKKyNkZWZpbmUgZ3N0X2RpY2V0dl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3REaWNlVFYsIGdzdF9kaWNldHYsIEdTVF9UWVBFX1ZJREVPX0ZJTFRFUik7CisKK3N0YXRpYyB2b2lkIGdzdF9kaWNldHZfY3JlYXRlX21hcCAoR3N0RGljZVRWICogZmlsdGVyLCBHc3RWaWRlb0luZm8gKiBpbmZvKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9kaWNldHZfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IFJHQngsIHhSR0IsIEJHUngsIHhCR1IgfSIpKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfZGljZXR2X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBSR0J4LCB4UkdCLCBCR1J4LCB4QkdSIH0iKSkKKyAgICApOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9DVUJFX0JJVFMKK307CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RpY2V0dl9zZXRfaW5mbyAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RDYXBzICogaW5jYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0RGljZVRWICpmaWx0ZXIgPSBHU1RfRElDRVRWICh2ZmlsdGVyKTsKKworICBnX2ZyZWUgKGZpbHRlci0+ZGljZW1hcCk7CisgIGZpbHRlci0+ZGljZW1hcCA9CisgICAgICAoZ3VpbnQ4ICopIGdfbWFsbG9jIChHU1RfVklERU9fSU5GT19XSURUSCAoaW5faW5mbykgKgorICAgICAgR1NUX1ZJREVPX0lORk9fV0lEVEggKGluX2luZm8pKTsKKyAgZ3N0X2RpY2V0dl9jcmVhdGVfbWFwIChmaWx0ZXIsIGluX2luZm8pOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2RpY2V0dl90cmFuc2Zvcm1fZnJhbWUgKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLAorICAgIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUpCit7CisgIEdzdERpY2VUViAqZmlsdGVyID0gR1NUX0RJQ0VUViAodmZpbHRlcik7CisgIGd1aW50MzIgKnNyYywgKmRlc3Q7CisgIGdpbnQgaSwgbWFwX3gsIG1hcF95LCBtYXBfaSwgYmFzZSwgZHgsIGR5LCBkaTsKKyAgZ2ludCB2aWRlb19zdHJpZGUsIGdfY3ViZV9iaXRzLCBnX2N1YmVfc2l6ZTsKKyAgZ2ludCBnX21hcF9oZWlnaHQsIGdfbWFwX3dpZHRoOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBzdHJlYW1fdGltZTsKKyAgY29uc3QgZ3VpbnQ4ICpkaWNlbWFwOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbl9mcmFtZS0+YnVmZmVyKTsKKyAgc3RyZWFtX3RpbWUgPQorICAgICAgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZHU1RfQkFTRV9UUkFOU0ZPUk0gKHZmaWx0ZXIpLT5zZWdtZW50LAorICAgICAgR1NUX0ZPUk1BVF9USU1FLCB0aW1lc3RhbXApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwgInN5bmMgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSk7CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdHJlYW1fdGltZSkpCisgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoZmlsdGVyKSwgc3RyZWFtX3RpbWUpOworCisgIHNyYyA9IChndWludDMyICopIEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIGRlc3QgPSAoZ3VpbnQzMiAqKSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKyAgdmlkZW9fc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoaW5fZnJhbWUsIDApOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZmlsdGVyKTsKKyAgZ19jdWJlX2JpdHMgPSBmaWx0ZXItPmdfY3ViZV9iaXRzOworICBnX2N1YmVfc2l6ZSA9IGZpbHRlci0+Z19jdWJlX3NpemU7CisgIGdfbWFwX2hlaWdodCA9IGZpbHRlci0+Z19tYXBfaGVpZ2h0OworICBnX21hcF93aWR0aCA9IGZpbHRlci0+Z19tYXBfd2lkdGg7CisKKyAgZGljZW1hcCA9IGZpbHRlci0+ZGljZW1hcDsKKyAgdmlkZW9fc3RyaWRlIC89IDQ7CisKKyAgbWFwX2kgPSAwOworICBmb3IgKG1hcF95ID0gMDsgbWFwX3kgPCBnX21hcF9oZWlnaHQ7IG1hcF95KyspIHsKKyAgICBmb3IgKG1hcF94ID0gMDsgbWFwX3ggPCBnX21hcF93aWR0aDsgbWFwX3grKykgeworICAgICAgYmFzZSA9IChtYXBfeSA8PCBnX2N1YmVfYml0cykgKiB2aWRlb19zdHJpZGUgKyAobWFwX3ggPDwgZ19jdWJlX2JpdHMpOworCisgICAgICBzd2l0Y2ggKGRpY2VtYXBbbWFwX2ldKSB7CisgICAgICAgIGNhc2UgRElDRV9VUDoKKyAgICAgICAgICBmb3IgKGR5ID0gMDsgZHkgPCBnX2N1YmVfc2l6ZTsgZHkrKykgeworICAgICAgICAgICAgaSA9IGJhc2UgKyBkeSAqIHZpZGVvX3N0cmlkZTsKKyAgICAgICAgICAgIGZvciAoZHggPSAwOyBkeCA8IGdfY3ViZV9zaXplOyBkeCsrKSB7CisgICAgICAgICAgICAgIGRlc3RbaV0gPSBzcmNbaV07CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRElDRV9MRUZUOgorICAgICAgICAgIGZvciAoZHkgPSAwOyBkeSA8IGdfY3ViZV9zaXplOyBkeSsrKSB7CisgICAgICAgICAgICBpID0gYmFzZSArIGR5ICogdmlkZW9fc3RyaWRlOworCisgICAgICAgICAgICBmb3IgKGR4ID0gMDsgZHggPCBnX2N1YmVfc2l6ZTsgZHgrKykgeworICAgICAgICAgICAgICBkaSA9IGJhc2UgKyAoZHggKiB2aWRlb19zdHJpZGUpICsgKGdfY3ViZV9zaXplIC0gZHkgLSAxKTsKKyAgICAgICAgICAgICAgZGVzdFtkaV0gPSBzcmNbaV07CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRElDRV9ET1dOOgorICAgICAgICAgIGZvciAoZHkgPSAwOyBkeSA8IGdfY3ViZV9zaXplOyBkeSsrKSB7CisgICAgICAgICAgICBkaSA9IGJhc2UgKyBkeSAqIHZpZGVvX3N0cmlkZTsKKyAgICAgICAgICAgIGkgPSBiYXNlICsgKGdfY3ViZV9zaXplIC0gZHkgLSAxKSAqIHZpZGVvX3N0cmlkZSArIGdfY3ViZV9zaXplOworICAgICAgICAgICAgZm9yIChkeCA9IDA7IGR4IDwgZ19jdWJlX3NpemU7IGR4KyspIHsKKyAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgICBkZXN0W2RpXSA9IHNyY1tpXTsKKyAgICAgICAgICAgICAgZGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRElDRV9SSUdIVDoKKyAgICAgICAgICBmb3IgKGR5ID0gMDsgZHkgPCBnX2N1YmVfc2l6ZTsgZHkrKykgeworICAgICAgICAgICAgaSA9IGJhc2UgKyAoZHkgKiB2aWRlb19zdHJpZGUpOworICAgICAgICAgICAgZm9yIChkeCA9IDA7IGR4IDwgZ19jdWJlX3NpemU7IGR4KyspIHsKKyAgICAgICAgICAgICAgZGkgPSBiYXNlICsgZHkgKyAoZ19jdWJlX3NpemUgLSBkeCAtIDEpICogdmlkZW9fc3RyaWRlOworICAgICAgICAgICAgICBkZXN0W2RpXSA9IHNyY1tpXTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIG1hcF9pKys7CisgICAgfQorICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kaWNldHZfY3JlYXRlX21hcCAoR3N0RGljZVRWICogZmlsdGVyLCBHc3RWaWRlb0luZm8gKiBpbmZvKQoreworICBnaW50IHgsIHksIGk7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKworICB3aWR0aCA9IEdTVF9WSURFT19JTkZPX1dJRFRIIChpbmZvKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbmZvKTsKKworICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkKKyAgICByZXR1cm47CisKKyAgZmlsdGVyLT5nX21hcF9oZWlnaHQgPSBoZWlnaHQgPj4gZmlsdGVyLT5nX2N1YmVfYml0czsKKyAgZmlsdGVyLT5nX21hcF93aWR0aCA9IHdpZHRoID4+IGZpbHRlci0+Z19jdWJlX2JpdHM7CisgIGZpbHRlci0+Z19jdWJlX3NpemUgPSAxIDw8IGZpbHRlci0+Z19jdWJlX2JpdHM7CisKKyAgaSA9IDA7CisKKyAgZm9yICh5ID0gMDsgeSA8IGZpbHRlci0+Z19tYXBfaGVpZ2h0OyB5KyspIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgZmlsdGVyLT5nX21hcF93aWR0aDsgeCsrKSB7CisgICAgICAvLyBkaWNlbWFwW2ldID0gKChpICsgeSkgJiAweDMpOyAvKiBVcCwgRG93biwgTGVmdCBvciBSaWdodCAqLworICAgICAgZmlsdGVyLT5kaWNlbWFwW2ldID0gKGZhc3RyYW5kICgpID4+IDI0KSAmIDB4MDM7CisgICAgICBpKys7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGljZXR2X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3REaWNlVFYgKmZpbHRlciA9IEdTVF9ESUNFVFYgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0NVQkVfQklUUzoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZmlsdGVyKTsKKyAgICAgIGZpbHRlci0+Z19jdWJlX2JpdHMgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGdzdF9kaWNldHZfY3JlYXRlX21hcCAoZmlsdGVyLCAmR1NUX1ZJREVPX0ZJTFRFUiAoZmlsdGVyKS0+aW5faW5mbyk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9kaWNldHZfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdERpY2VUViAqZmlsdGVyID0gR1NUX0RJQ0VUViAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ1VCRV9CSVRTOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZmlsdGVyLT5nX2N1YmVfYml0cyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGljZXR2X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3REaWNlVFYgKmZpbHRlciA9IEdTVF9ESUNFVFYgKG9iamVjdCk7CisKKyAgZ19mcmVlIChmaWx0ZXItPmRpY2VtYXApOworICBmaWx0ZXItPmRpY2VtYXAgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kaWNldHZfY2xhc3NfaW5pdCAoR3N0RGljZVRWQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzcyA9IChHc3RWaWRlb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9kaWNldHZfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfZGljZXR2X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfZGljZXR2X2ZpbmFsaXplOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ1VCRV9CSVRTLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInNxdWFyZS1iaXRzIiwgIlNxdWFyZSBCaXRzIiwgIlRoZSBzaXplIG9mIHRoZSBTcXVhcmVzIiwKKyAgICAgICAgICBNSU5fQ1VCRV9CSVRTLCBNQVhfQ1VCRV9CSVRTLCBERUZBVUxUX0NVQkVfQklUUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkRpY2VUViBlZmZlY3QiLAorICAgICAgIkZpbHRlci9FZmZlY3QvVmlkZW8iLAorICAgICAgIidEaWNlcycgdGhlIHNjcmVlbiB1cCBpbnRvIG1hbnkgc21hbGwgc3F1YXJlcyIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmJlPiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9kaWNldHZfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9kaWNldHZfc3JjX3RlbXBsYXRlKTsKKworICB2ZmlsdGVyX2NsYXNzLT5zZXRfaW5mbyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGljZXR2X3NldF9pbmZvKTsKKyAgdmZpbHRlcl9jbGFzcy0+dHJhbnNmb3JtX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGljZXR2X3RyYW5zZm9ybV9mcmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGljZXR2X2luaXQgKEdzdERpY2VUViAqIGZpbHRlcikKK3sKKyAgZmlsdGVyLT5kaWNlbWFwID0gTlVMTDsKKyAgZmlsdGVyLT5nX2N1YmVfYml0cyA9IERFRkFVTFRfQ1VCRV9CSVRTOworICBmaWx0ZXItPmdfY3ViZV9zaXplID0gMDsKKyAgZmlsdGVyLT5nX21hcF9oZWlnaHQgPSAwOworICBmaWx0ZXItPmdfbWFwX3dpZHRoID0gMDsKK30KZGlmZiAtLWdpdCBhL2dzdC9lZmZlY3R2L2dzdGRpY2UuaCBiL2dzdC9lZmZlY3R2L2dzdGRpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzE0Yzk3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VmZmVjdHYvZ3N0ZGljZS5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIGRpY2UuYzogYSAnZGljaW5nJyBlZmZlY3QKKyAqICBjb3B5cmlnaHQgKGMpIDIwMDEgU2FtIE1lcnRlbnMuICBUaGlzIGNvZGUgaXMgc3ViamVjdCB0byB0aGUgcHJvdmlzaW9ucyBvZgorICogIHRoZSBHTlUgTGlicmFyeSBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBJIHN1cHBvc2UgdGhpcyBsb29rcyBzaW1pbGFyIHRvIFB1enpsZVRWLCBidXQgaXQncyBub3QuIFRoZSBzY3JlZW4gaXMKKyAqIGRpdmlkZWQgaW50byBzbWFsbCBzcXVhcmVzLCBlYWNoIG9mIHdoaWNoIGlzIHJvdGF0ZWQgZWl0aGVyIDAsIDkwLCAxODAgb3IKKyAqIDI3MCBkZWdyZWVzLiAgVGhlIGFtb3VudCBvZiByb3RhdGlvbiBmb3IgZWFjaCBzcXVhcmUgaXMgY2hvc2VuIGF0IHJhbmRvbS4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0RJQ0VfSF9fCisjZGVmaW5lIF9fR1NUX0RJQ0VfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9maWx0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0RJQ0VUViBcCisgIChnc3RfZGljZXR2X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9ESUNFVFYob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9ESUNFVFYsR3N0RGljZVRWKSkKKyNkZWZpbmUgR1NUX0RJQ0VUVl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9ESUNFVFYsR3N0RGljZVRWQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfRElDRVRWKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfRElDRVRWKSkKKyNkZWZpbmUgR1NUX0lTX0RJQ0VUVl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9ESUNFVFYpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0RGljZVRWIEdzdERpY2VUVjsKK3R5cGVkZWYgc3RydWN0IF9Hc3REaWNlVFZDbGFzcyBHc3REaWNlVFZDbGFzczsKKworc3RydWN0IF9Hc3REaWNlVFYKK3sKKyAgR3N0VmlkZW9GaWx0ZXIgdmlkZW9maWx0ZXI7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKyAgZ3VpbnQ4ICpkaWNlbWFwOworCisgIGdpbnQgZ19jdWJlX2JpdHM7CisgIGdpbnQgZ19jdWJlX3NpemU7CisgIGdpbnQgZ19tYXBfaGVpZ2h0OworICBnaW50IGdfbWFwX3dpZHRoOworfTsKKworc3RydWN0IF9Hc3REaWNlVFZDbGFzcworeworICBHc3RWaWRlb0ZpbHRlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9kaWNldHZfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfRElDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9lZmZlY3R2L2dzdGVkZ2UuYyBiL2dzdC9lZmZlY3R2L2dzdGVkZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2ZlYjk5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5jCkBAIC0wLDAgKzEsMjU0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBFZmZlY1RWOgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgRlVLVUNISSBLZW50YXJvdQorICoKKyAqIEVkZ2VUViAtIGRldGVjdHMgZWRnZSBhbmQgZGlzcGxheSBpdCBpbiBnb29kIG9sZCBjb21wdXRlciB3YXkKKyAqCisgKiBFZmZlY1RWIGlzIGZyZWUgc29mdHdhcmUuIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWVkZ2V0dgorICoKKyAqIEVkZ2VUViBkZXRlY3RzIGVkZ2VzIGFuZCBkaXNwbGF5IGl0IGluIGdvb2Qgb2xkIGxvdyByZXNvbHV0aW9uCisgKiBjb21wdXRlciB3YXkuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyAhIGVkZ2V0diAhIHZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsKKyAqIF18IFRoaXMgcGlwZWxpbmUgc2hvd3MgdGhlIGVmZmVjdCBvZiBlZGdldHYgb24gYSB0ZXN0IHN0cmVhbS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RlZGdlLmgiCisKKyNkZWZpbmUgZ3N0X2VkZ2V0dl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RFZGdlVFYsIGdzdF9lZGdldHYsIEdTVF9UWVBFX1ZJREVPX0ZJTFRFUik7CisKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIENBUFNfU1RSIEdTVF9WSURFT19DQVBTX01BS0UgKCJ7ICBCR1J4LCBSR0J4IH0iKQorI2Vsc2UKKyNkZWZpbmUgQ0FQU19TVFIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgIHhCR1IsIHhSR0IgfSIpCisjZW5kaWYKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9lZGdldHZfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKENBUFNfU1RSKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfZWRnZXR2X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChDQVBTX1NUUikKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9lZGdldHZfc2V0X2luZm8gKEdzdFZpZGVvRmlsdGVyICogZmlsdGVyLCBHc3RDYXBzICogaW5jYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0RWRnZVRWICplZGdldHYgPSBHU1RfRURHRVRWIChmaWx0ZXIpOworICBndWludCBtYXBfc2l6ZTsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworCisgIHdpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKGluX2luZm8pOworICBoZWlnaHQgPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKGluX2luZm8pOworCisgIGVkZ2V0di0+bWFwX3dpZHRoID0gd2lkdGggLyA0OworICBlZGdldHYtPm1hcF9oZWlnaHQgPSBoZWlnaHQgLyA0OworICBlZGdldHYtPnZpZGVvX3dpZHRoX21hcmdpbiA9IHdpZHRoICUgNDsKKworICBtYXBfc2l6ZSA9IGVkZ2V0di0+bWFwX3dpZHRoICogZWRnZXR2LT5tYXBfaGVpZ2h0ICogc2l6ZW9mIChndWludDMyKSAqIDI7CisKKyAgZ19mcmVlIChlZGdldHYtPm1hcCk7CisgIGVkZ2V0di0+bWFwID0gKGd1aW50MzIgKikgZ19tYWxsb2MwIChtYXBfc2l6ZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZWRnZXR2X3RyYW5zZm9ybV9mcmFtZSAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSkKK3sKKyAgR3N0RWRnZVRWICpmaWx0ZXIgPSBHU1RfRURHRVRWICh2ZmlsdGVyKTsKKyAgZ2ludCB4LCB5LCByLCBnLCBiOworICBndWludDMyICpzcmMsICpkZXN0OworICBndWludDMyIHAsIHE7CisgIGd1aW50MzIgdjAsIHYxLCB2MiwgdjM7CisgIGdpbnQgd2lkdGgsIG1hcF9oZWlnaHQsIG1hcF93aWR0aDsKKyAgZ2ludCB2aWRlb193aWR0aF9tYXJnaW47CisgIGd1aW50MzIgKm1hcDsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKworICBtYXAgPSBmaWx0ZXItPm1hcDsKKyAgbWFwX2hlaWdodCA9IGZpbHRlci0+bWFwX2hlaWdodDsKKyAgbWFwX3dpZHRoID0gZmlsdGVyLT5tYXBfd2lkdGg7CisgIHZpZGVvX3dpZHRoX21hcmdpbiA9IGZpbHRlci0+dmlkZW9fd2lkdGhfbWFyZ2luOworCisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpOworCisgIHNyYyArPSB3aWR0aCAqIDQgKyA0OworICBkZXN0ICs9IHdpZHRoICogNCArIDQ7CisKKyAgZm9yICh5ID0gMTsgeSA8IG1hcF9oZWlnaHQgLSAxOyB5KyspIHsKKyAgICBmb3IgKHggPSAxOyB4IDwgbWFwX3dpZHRoIC0gMTsgeCsrKSB7CisgICAgICBwID0gKnNyYzsKKyAgICAgIHEgPSAqKHNyYyAtIDQpOworCisgICAgICAvKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgcGl4ZWwgYW5kIGxlZnQgbmVpZ2hib3IuICovCisgICAgICByID0gKChwICYgMHhmZjAwMDApIC0gKHEgJiAweGZmMDAwMCkpID4+IDE2OworICAgICAgZyA9ICgocCAmIDB4ZmYwMCkgLSAocSAmIDB4ZmYwMCkpID4+IDg7CisgICAgICBiID0gKHAgJiAweGZmKSAtIChxICYgMHhmZik7CisgICAgICByICo9IHI7CisgICAgICBnICo9IGc7CisgICAgICBiICo9IGI7CisgICAgICByID0gciA+PiA1OyAgICAgICAgICAgICAgIC8qIFRvIGxhY2sgdGhlIGxvd2VyIGJpdCBmb3Igc2F0dXJhdGVkIGFkZGl0aW9uLCAgKi8KKyAgICAgIGcgPSBnID4+IDU7ICAgICAgICAgICAgICAgLyogZGV2aWRlIHRoZSB2YWx1ZSB3aXRoIDMyLCBpbnN0ZWFkIG9mIDE2LiBJdCBpcyAqLworICAgICAgYiA9IGIgPj4gNDsgICAgICAgICAgICAgICAvKiBzYW1lIGFzIGB2MiAmPSAweGZlZmVmZicgKi8KKyAgICAgIGlmIChyID4gMTI3KQorICAgICAgICByID0gMTI3OworICAgICAgaWYgKGcgPiAxMjcpCisgICAgICAgIGcgPSAxMjc7CisgICAgICBpZiAoYiA+IDI1NSkKKyAgICAgICAgYiA9IDI1NTsKKyAgICAgIHYyID0gKHIgPDwgMTcpIHwgKGcgPDwgOSkgfCBiOworCisgICAgICAvKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgcGl4ZWwgYW5kIHVwcGVyIG5laWdoYm9yLiAqLworICAgICAgcSA9ICooc3JjIC0gd2lkdGggKiA0KTsKKyAgICAgIHIgPSAoKHAgJiAweGZmMDAwMCkgLSAocSAmIDB4ZmYwMDAwKSkgPj4gMTY7CisgICAgICBnID0gKChwICYgMHhmZjAwKSAtIChxICYgMHhmZjAwKSkgPj4gODsKKyAgICAgIGIgPSAocCAmIDB4ZmYpIC0gKHEgJiAweGZmKTsKKyAgICAgIHIgKj0gcjsKKyAgICAgIGcgKj0gZzsKKyAgICAgIGIgKj0gYjsKKyAgICAgIHIgPSByID4+IDU7CisgICAgICBnID0gZyA+PiA1OworICAgICAgYiA9IGIgPj4gNDsKKyAgICAgIGlmIChyID4gMTI3KQorICAgICAgICByID0gMTI3OworICAgICAgaWYgKGcgPiAxMjcpCisgICAgICAgIGcgPSAxMjc7CisgICAgICBpZiAoYiA+IDI1NSkKKyAgICAgICAgYiA9IDI1NTsKKyAgICAgIHYzID0gKHIgPDwgMTcpIHwgKGcgPDwgOSkgfCBiOworCisgICAgICB2MCA9IG1hcFsoeSAtIDEpICogbWFwX3dpZHRoICogMiArIHggKiAyXTsKKyAgICAgIHYxID0gbWFwW3kgKiBtYXBfd2lkdGggKiAyICsgKHggLSAxKSAqIDIgKyAxXTsKKyAgICAgIG1hcFt5ICogbWFwX3dpZHRoICogMiArIHggKiAyXSA9IHYyOworICAgICAgbWFwW3kgKiBtYXBfd2lkdGggKiAyICsgeCAqIDIgKyAxXSA9IHYzOworICAgICAgciA9IHYwICsgdjE7CisgICAgICBnID0gciAmIDB4MDEwMTAxMDA7CisgICAgICBkZXN0WzBdID0gciB8IChnIC0gKGcgPj4gOCkpOworICAgICAgciA9IHYwICsgdjM7CisgICAgICBnID0gciAmIDB4MDEwMTAxMDA7CisgICAgICBkZXN0WzFdID0gciB8IChnIC0gKGcgPj4gOCkpOworICAgICAgZGVzdFsyXSA9IHYzOworICAgICAgZGVzdFszXSA9IHYzOworICAgICAgciA9IHYyICsgdjE7CisgICAgICBnID0gciAmIDB4MDEwMTAxMDA7CisgICAgICBkZXN0W3dpZHRoXSA9IHIgfCAoZyAtIChnID4+IDgpKTsKKyAgICAgIHIgPSB2MiArIHYzOworICAgICAgZyA9IHIgJiAweDAxMDEwMTAwOworICAgICAgZGVzdFt3aWR0aCArIDFdID0gciB8IChnIC0gKGcgPj4gOCkpOworICAgICAgZGVzdFt3aWR0aCArIDJdID0gdjM7CisgICAgICBkZXN0W3dpZHRoICsgM10gPSB2MzsKKyAgICAgIGRlc3Rbd2lkdGggKiAyXSA9IHYyOworICAgICAgZGVzdFt3aWR0aCAqIDIgKyAxXSA9IHYyOworICAgICAgZGVzdFt3aWR0aCAqIDIgKyAyXSA9IDA7CisgICAgICBkZXN0W3dpZHRoICogMiArIDNdID0gMDsKKyAgICAgIGRlc3Rbd2lkdGggKiAzXSA9IHYyOworICAgICAgZGVzdFt3aWR0aCAqIDMgKyAxXSA9IHYyOworICAgICAgZGVzdFt3aWR0aCAqIDMgKyAyXSA9IDA7CisgICAgICBkZXN0W3dpZHRoICogMyArIDNdID0gMDsKKworICAgICAgc3JjICs9IDQ7CisgICAgICBkZXN0ICs9IDQ7CisgICAgfQorICAgIHNyYyArPSB3aWR0aCAqIDMgKyA4ICsgdmlkZW9fd2lkdGhfbWFyZ2luOworICAgIGRlc3QgKz0gd2lkdGggKiAzICsgOCArIHZpZGVvX3dpZHRoX21hcmdpbjsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2VkZ2V0dl9zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICBHc3RFZGdlVFYgKmVkZ2V0diA9IEdTVF9FREdFVFYgKHRyYW5zKTsKKworICBpZiAoZWRnZXR2LT5tYXApCisgICAgbWVtc2V0IChlZGdldHYtPm1hcCwgMCwKKyAgICAgICAgZWRnZXR2LT5tYXBfd2lkdGggKiBlZGdldHYtPm1hcF9oZWlnaHQgKiBzaXplb2YgKGd1aW50MzIpICogMik7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2VkZ2V0dl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0RWRnZVRWICplZGdldHYgPSBHU1RfRURHRVRWIChvYmplY3QpOworCisgIGdfZnJlZSAoZWRnZXR2LT5tYXApOworICBlZGdldHYtPm1hcCA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2VkZ2V0dl9jbGFzc19pbml0IChHc3RFZGdlVFZDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKnRyYW5zX2NsYXNzID0gKEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqKSBrbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzcyA9IChHc3RWaWRlb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2VkZ2V0dl9maW5hbGl6ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiRWRnZVRWIGVmZmVjdCIsCisgICAgICAiRmlsdGVyL0VmZmVjdC9WaWRlbyIsCisgICAgICAiQXBwbHkgZWRnZSBkZXRlY3Qgb24gdmlkZW8iLCAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNoZWxsby5iZT4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfZWRnZXR2X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfZWRnZXR2X3NyY190ZW1wbGF0ZSk7CisKKyAgdHJhbnNfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9lZGdldHZfc3RhcnQpOworCisgIHZmaWx0ZXJfY2xhc3MtPnNldF9pbmZvID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9lZGdldHZfc2V0X2luZm8pOworICB2ZmlsdGVyX2NsYXNzLT50cmFuc2Zvcm1fZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9lZGdldHZfdHJhbnNmb3JtX2ZyYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9lZGdldHZfaW5pdCAoR3N0RWRnZVRWICogZWRnZXR2KQoreworfQpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5oIGIvZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MGMzMTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZWZmZWN0di9nc3RlZGdlLmgKQEAgLTAsMCArMSw3MCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogRWZmZWNUVjoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEZVS1VDSEkgS2VudGFyb3UKKyAqCisgKiBFZGdlVFYgLSBkZXRlY3RzIGVkZ2UgYW5kIGRpc3BsYXkgaXQgaW4gZ29vZCBvbGQgY29tcHV0ZXIgd2F5CisgKgorICogRWZmZWNUViBpcyBmcmVlIHNvZnR3YXJlLiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0VER0VfSF9fCisjZGVmaW5lIF9fR1NUX0VER0VfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9maWx0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0VER0VUViBcCisgIChnc3RfZWRnZXR2X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9FREdFVFYob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9FREdFVFYsR3N0RWRnZVRWKSkKKyNkZWZpbmUgR1NUX0VER0VUVl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9FREdFVFYsR3N0RWRnZVRWQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfRURHRVRWKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfRURHRVRWKSkKKyNkZWZpbmUgR1NUX0lTX0VER0VUVl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9FREdFVFYpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0RWRnZVRWIEdzdEVkZ2VUVjsKK3R5cGVkZWYgc3RydWN0IF9Hc3RFZGdlVFZDbGFzcyBHc3RFZGdlVFZDbGFzczsKKworc3RydWN0IF9Hc3RFZGdlVFYKK3sKKyAgR3N0VmlkZW9GaWx0ZXIgdmlkZW9maWx0ZXI7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKyAgZ2ludCBtYXBfd2lkdGgsIG1hcF9oZWlnaHQ7CisgIGd1aW50MzIgKm1hcDsKKyAgZ2ludCB2aWRlb193aWR0aF9tYXJnaW47Cit9OworCitzdHJ1Y3QgX0dzdEVkZ2VUVkNsYXNzCit7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2VkZ2V0dl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9FREdFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0ZWZmZWN0di5jIGIvZ3N0L2VmZmVjdHYvZ3N0ZWZmZWN0di5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOWZmYzAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZWZmZWN0di9nc3RlZmZlY3R2LmMKQEAgLTAsMCArMSw4MyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIEVmZmVjVFY6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgRlVLVUNISSBLZW50YXJvdQorICoKKyAqIEVmZmVjVFYgaXMgZnJlZSBzb2Z0d2FyZS4gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0ZWZmZWN0di5oIgorI2luY2x1ZGUgImdzdGFnaW5nLmgiCisjaW5jbHVkZSAiZ3N0ZGljZS5oIgorI2luY2x1ZGUgImdzdGVkZ2UuaCIKKyNpbmNsdWRlICJnc3RxdWFyay5oIgorI2luY2x1ZGUgImdzdHJldi5oIgorI2luY2x1ZGUgImdzdHNoYWdhZGVsaWMuaCIKKyNpbmNsdWRlICJnc3R2ZXJ0aWdvLmgiCisjaW5jbHVkZSAiZ3N0d2FycC5oIgorI2luY2x1ZGUgImdzdG9wLmgiCisjaW5jbHVkZSAiZ3N0cmFkaW9hYy5oIgorI2luY2x1ZGUgImdzdHN0cmVhay5oIgorI2luY2x1ZGUgImdzdHJpcHBsZS5oIgorCitzdHJ1Y3QgX2VsZW1lbnRzX2VudHJ5Cit7CisgIGNvbnN0IGdjaGFyICpuYW1lOworICAgIEdUeXBlICgqdHlwZSkgKHZvaWQpOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBfZWxlbWVudHNfZW50cnkgX2VsZW1lbnRzW10gPSB7CisgIHsiZWRnZXR2IiwgZ3N0X2VkZ2V0dl9nZXRfdHlwZX0sCisgIHsiYWdpbmd0diIsIGdzdF9hZ2luZ3R2X2dldF90eXBlfSwKKyAgeyJkaWNldHYiLCBnc3RfZGljZXR2X2dldF90eXBlfSwKKyAgeyJ3YXJwdHYiLCBnc3Rfd2FycHR2X2dldF90eXBlfSwKKyAgeyJzaGFnYWRlbGljdHYiLCBnc3Rfc2hhZ2FkZWxpY3R2X2dldF90eXBlfSwKKyAgeyJ2ZXJ0aWdvdHYiLCBnc3RfdmVydGlnb3R2X2dldF90eXBlfSwKKyAgeyJyZXZ0diIsIGdzdF9yZXZ0dl9nZXRfdHlwZX0sCisgIHsicXVhcmt0diIsIGdzdF9xdWFya3R2X2dldF90eXBlfSwKKyAgeyJvcHR2IiwgZ3N0X29wdHZfZ2V0X3R5cGV9LAorICB7InJhZGlvYWN0diIsIGdzdF9yYWRpb2FjdHZfZ2V0X3R5cGV9LAorICB7InN0cmVha3R2IiwgZ3N0X3N0cmVha3R2X2dldF90eXBlfSwKKyAgeyJyaXBwbGV0diIsIGdzdF9yaXBwbGV0dl9nZXRfdHlwZX0sCisgIHtOVUxMLCAwfSwKK307CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgZ2ludCBpID0gMDsKKworICB3aGlsZSAoX2VsZW1lbnRzW2ldLm5hbWUpIHsKKyAgICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sIF9lbGVtZW50c1tpXS5uYW1lLAorICAgICAgICAgICAgR1NUX1JBTktfTk9ORSwgKF9lbGVtZW50c1tpXS50eXBlKSAoKSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgaSsrOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBlZmZlY3R2LAorICAgICJlZmZlY3QgcGx1Z2lucyBmcm9tIHRoZSBlZmZlY3R2IHByb2plY3QiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9nc3QvZWZmZWN0di9nc3RlZmZlY3R2LmggYi9nc3QvZWZmZWN0di9nc3RlZmZlY3R2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwMDc5OQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L2dzdGVmZmVjdHYuaApAQCAtMCwwICsxLDMzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogRWZmZWNUVjoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBGVUtVQ0hJIEtlbnRhcm91CisgKgorICogIEVmZmVjVFYgaXMgZnJlZSBzb2Z0d2FyZS4gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK3N0YXRpYyBpbmxpbmUgZ3VpbnQKK2Zhc3RyYW5kICh2b2lkKQoreworICBzdGF0aWMgZ3VpbnQgZmFzdHJhbmRfdmFsOworCisgIHJldHVybiAoZmFzdHJhbmRfdmFsID0gZmFzdHJhbmRfdmFsICogMTEwMzUxNTI0NSArIDEyMzQ1KTsKK30KKwpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0b3AuYyBiL2dzdC9lZmZlY3R2L2dzdG9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgzODc4ZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L2dzdG9wLmMKQEAgLTAsMCArMSw0MTggQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogRWZmZWNUViAtIFJlYWx0aW1lIERpZ2l0YWwgVmlkZW8gRWZmZWN0b3IKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IEZVS1VDSEkgS2VudGFybworICoKKyAqIE9wVFYgLSBPcHRpY2FsIGFydCBtZWV0cyByZWFsLXRpbWUgdmlkZW8gZWZmZWN0LgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgRlVLVUNISSBLZW50YXJvCisgKgorICogRWZmZWNUViBpcyBmcmVlIHNvZnR3YXJlLiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtb3B0dgorICoKKyAqIFRyYWRpdGlvbmFsIGJsYWNrLXdoaXRlIG9wdGljYWwgYW5pbWF0aW9uIGlzIG5vdyByZXN1cnJlY3RlZCBhcyBhCisgKiByZWFsLXRpbWUgdmlkZW8gZWZmZWN0LiBJbnB1dCBpbWFnZXMgYXJlIGJpbmFyaXplZCBhbmQgY29tYmluZWQgd2l0aAorICogdmFyaW91cyBvcHRpY2FsIHBhdHRlcm4uCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyAhIG9wdHYgISB2aWRlb2NvbnZlcnQgISBhdXRvdmlkZW9zaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIHNob3dzIHRoZSBlZmZlY3Qgb2Ygb3B0diBvbiBhIHRlc3Qgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RvcC5oIgorI2luY2x1ZGUgImdzdGVmZmVjdHYuaCIKKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCitlbnVtCit7CisgIE9QX1NQSVJBTDEgPSAwLAorICBPUF9TUElSQUwyLAorICBPUF9QQVJBQk9MQSwKKyAgT1BfSFNUUklQRQorfTsKKworI2RlZmluZSBHU1RfVFlQRV9PUFRWX01PREUgKGdzdF9vcHR2X21vZGVfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X29wdHZfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIHR5cGUgPSAwOworCisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIGVudW12YWx1ZVtdID0geworICAgIHtPUF9TUElSQUwxLCAiTWFlbHN0cm9tIiwgIm1hZWxzdHJvbSJ9LAorICAgIHtPUF9TUElSQUwyLCAiUmFkaWF0aW9uIiwgInJhZGlhdGlvbiJ9LAorICAgIHtPUF9QQVJBQk9MQSwgIkhvcml6b250YWwgU3RyaXBlcyIsCisgICAgICAgICJob3Jpem9udGFsLXN0cmlwZXMifSwKKyAgICB7T1BfSFNUUklQRSwgIlZlcnRpY2FsIFN0cmlwZXMiLCAidmVydGljYWwtc3RyaXBlcyJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIXR5cGUpIHsKKyAgICB0eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdE9wVFZNb2RlIiwgZW51bXZhbHVlKTsKKyAgfQorICByZXR1cm4gdHlwZTsKK30KKworI2RlZmluZSBERUZBVUxUX01PREUgT1BfU1BJUkFMMQorI2RlZmluZSBERUZBVUxUX1NQRUVEIDE2CisjZGVmaW5lIERFRkFVTFRfVEhSRVNIT0xEIDYwCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX01PREUsCisgIFBST1BfU1BFRUQsCisgIFBST1BfVEhSRVNIT0xECit9OworCitzdGF0aWMgZ3VpbnQzMiBwYWxldHRlWzI1Nl07CisKKyNkZWZpbmUgZ3N0X29wdHZfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0T3BUViwgZ3N0X29wdHYsIEdTVF9UWVBFX1ZJREVPX0ZJTFRFUik7CisKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIENBUFNfU1RSIEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IEJHUngsIFJHQnggfSIpCisjZWxzZQorI2RlZmluZSBDQVBTX1NUUiBHU1RfVklERU9fQ0FQU19NQUtFICgieyB4QkdSLCB4UkdCIH0iKQorI2VuZGlmCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3Rfb3B0dl9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoQ0FQU19TVFIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9vcHR2X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChDQVBTX1NUUikKKyAgICApOworCitzdGF0aWMgdm9pZAoraW5pdFBhbGV0dGUgKHZvaWQpCit7CisgIGdpbnQgaTsKKyAgZ3VpbnQ4IHY7CisKKyAgZm9yIChpID0gMDsgaSA8IDExMjsgaSsrKSB7CisgICAgcGFsZXR0ZVtpXSA9IDA7CisgICAgcGFsZXR0ZVtpICsgMTI4XSA9IDB4ZmZmZmZmOworICB9CisgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgdiA9IDE2ICogKGkgKyAxKSAtIDE7CisgICAgcGFsZXR0ZVtpICsgMTEyXSA9ICh2IDw8IDE2KSB8ICh2IDw8IDgpIHwgdjsKKyAgICB2ID0gMjU1IC0gdjsKKyAgICBwYWxldHRlW2kgKyAyNDBdID0gKHYgPDwgMTYpIHwgKHYgPDwgOCkgfCB2OworICB9Cit9CisKK3N0YXRpYyB2b2lkCitzZXRPcG1hcCAoZ2ludDggKiBvcG1hcFs0XSwgZ2ludCB3aWR0aCwgZ2ludCBoZWlnaHQpCit7CisgIGdpbnQgaSwgaiwgeCwgeTsKKyNpZm5kZWYgUFMyCisgIGdkb3VibGUgeHgsIHl5LCByLCBhdCwgcnI7CisjZWxzZQorICBnZmxvYXQgeHgsIHl5LCByLCBhdCwgcnI7CisjZW5kaWYKKyAgZ2ludCBzY2k7CisKKyAgc2NpID0gNjQwIC8gd2lkdGg7CisgIGkgPSAwOworICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICB5eSA9IChnZG91YmxlKSAoeSAtIGhlaWdodCAvIDIpIC8gd2lkdGg7CisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgIHh4ID0gKGdkb3VibGUpIHggLyB3aWR0aCAtIDAuNTsKKyNpZm5kZWYgUFMyCisgICAgICByID0gc3FydCAoeHggKiB4eCArIHl5ICogeXkpOworICAgICAgYXQgPSBhdGFuMiAoeHgsIHl5KTsKKyNlbHNlCisgICAgICByID0gc3FydGYgKHh4ICogeHggKyB5eSAqIHl5KTsKKyAgICAgIGF0ID0gYXRhbjJmICh4eCwgeXkpOworI2VuZGlmCisKKyAgICAgIG9wbWFwW09QX1NQSVJBTDFdW2ldID0gKChndWludCkKKyAgICAgICAgICAoKGF0IC8gR19QSSAqIDI1NikgKyAociAqIDQwMDApKSkgJiAyNTU7CisKKyAgICAgIGogPSByICogMzAwIC8gMzI7CisgICAgICByciA9IHIgKiAzMDAgLSBqICogMzI7CisgICAgICBqICo9IDY0OworICAgICAgaiArPSAocnIgPiAyOCkgPyAocnIgLSAyOCkgKiAxNiA6IDA7CisgICAgICBvcG1hcFtPUF9TUElSQUwyXVtpXSA9ICgoZ3VpbnQpCisgICAgICAgICAgKChhdCAvIEdfUEkgKiA0MDk2KSArIChyICogMTYwMCkgLSBqKSkgJiAyNTU7CisKKyAgICAgIG9wbWFwW09QX1BBUkFCT0xBXVtpXSA9CisgICAgICAgICAgKChndWludCkgKHl5IC8gKHh4ICogeHggKiAwLjMgKyAwLjEpICogNDAwKSkgJiAyNTU7CisgICAgICBvcG1hcFtPUF9IU1RSSVBFXVtpXSA9IHggKiA4ICogc2NpOworICAgICAgaSsrOworICAgIH0KKyAgfQorfQorCisvKiBUYWtlbiBmcm9tIGVmZmVjdHYvaW1hZ2UuYyAqLworLyogWSB2YWx1ZSBmaWx0ZXJzICovCitzdGF0aWMgdm9pZAoraW1hZ2VfeV9vdmVyIChndWludDMyICogc3JjLCBndWludDggKiBkaWZmLCBnaW50IHlfdGhyZXNob2xkLCBnaW50IHZpZGVvX2FyZWEpCit7CisgIGdpbnQgaTsKKyAgZ2ludCBSLCBHLCBCLCB2OworICBndWludDggKnAgPSBkaWZmOworCisgIGZvciAoaSA9IHZpZGVvX2FyZWE7IGkgPiAwOyBpLS0pIHsKKyAgICBSID0gKCgqc3JjKSAmIDB4ZmYwMDAwKSA+PiAoMTYgLSAxKTsKKyAgICBHID0gKCgqc3JjKSAmIDB4ZmYwMCkgPj4gKDggLSAyKTsKKyAgICBCID0gKCpzcmMpICYgMHhmZjsKKyAgICB2ID0geV90aHJlc2hvbGQgKiA3IC0gKFIgKyBHICsgQik7CisgICAgKnAgPSAoZ3VpbnQ4KSAodiA+PiAyNCk7CisgICAgc3JjKys7CisgICAgcCsrOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfb3B0dl90cmFuc2Zvcm1fZnJhbWUgKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLAorICAgIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUpCit7CisgIEdzdE9wVFYgKmZpbHRlciA9IEdTVF9PUFRWICh2ZmlsdGVyKTsKKyAgZ3VpbnQzMiAqc3JjLCAqZGVzdDsKKyAgZ2ludDggKnA7CisgIGd1aW50OCAqZGlmZjsKKyAgZ2ludCB4LCB5LCB3aWR0aCwgaGVpZ2h0OworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBzdHJlYW1fdGltZTsKKyAgZ3VpbnQ4IHBoYXNlOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbl9mcmFtZS0+YnVmZmVyKTsKKyAgc3RyZWFtX3RpbWUgPQorICAgICAgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZHU1RfQkFTRV9UUkFOU0ZPUk0gKHZmaWx0ZXIpLT5zZWdtZW50LAorICAgICAgR1NUX0ZPUk1BVF9USU1FLCB0aW1lc3RhbXApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwgInN5bmMgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSk7CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdHJlYW1fdGltZSkpCisgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoZmlsdGVyKSwgc3RyZWFtX3RpbWUpOworCisgIGlmIChHX1VOTElLRUxZIChmaWx0ZXItPm9wbWFwWzBdID09IE5VTEwpKQorICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZmlsdGVyKTsKKyAgc3dpdGNoIChmaWx0ZXItPm1vZGUpIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgMDoKKyAgICAgIHAgPSBmaWx0ZXItPm9wbWFwW09QX1NQSVJBTDFdOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgcCA9IGZpbHRlci0+b3BtYXBbT1BfU1BJUkFMMl07CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBwID0gZmlsdGVyLT5vcG1hcFtPUF9QQVJBQk9MQV07CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBwID0gZmlsdGVyLT5vcG1hcFtPUF9IU1RSSVBFXTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgZmlsdGVyLT5waGFzZSAtPSBmaWx0ZXItPnNwZWVkOworCisgIGRpZmYgPSBmaWx0ZXItPmRpZmY7CisgIGltYWdlX3lfb3ZlciAoc3JjLCBkaWZmLCBmaWx0ZXItPnRocmVzaG9sZCwgd2lkdGggKiBoZWlnaHQpOworICBwaGFzZSA9IGZpbHRlci0+cGhhc2U7CisKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICpkZXN0KysgPSBwYWxldHRlWygoKGd1aW50OCkgKCpwICsgcGhhc2UpKSBeICpkaWZmKyspICYgMjU1XTsKKyAgICAgIHArKzsKKyAgICB9CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGZpbHRlcik7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vcHR2X3NldF9pbmZvIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsIEdzdENhcHMgKiBpbmNhcHMsCisgICAgR3N0VmlkZW9JbmZvICogaW5faW5mbywgR3N0Q2FwcyAqIG91dGNhcHMsIEdzdFZpZGVvSW5mbyAqIG91dF9pbmZvKQoreworICBHc3RPcFRWICpmaWx0ZXIgPSBHU1RfT1BUViAodmZpbHRlcik7CisgIGdpbnQgaSwgd2lkdGgsIGhlaWdodDsKKworICB3aWR0aCA9IEdTVF9WSURFT19JTkZPX1dJRFRIIChpbl9pbmZvKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbl9pbmZvKTsKKworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgZ19mcmVlIChmaWx0ZXItPm9wbWFwW2ldKTsKKyAgICBmaWx0ZXItPm9wbWFwW2ldID0gZ19uZXcgKGdpbnQ4LCB3aWR0aCAqIGhlaWdodCk7CisgIH0KKyAgc2V0T3BtYXAgKGZpbHRlci0+b3BtYXAsIHdpZHRoLCBoZWlnaHQpOworCisgIGdfZnJlZSAoZmlsdGVyLT5kaWZmKTsKKyAgZmlsdGVyLT5kaWZmID0gZ19uZXcgKGd1aW50OCwgd2lkdGggKiBoZWlnaHQpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vcHR2X3N0YXJ0IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpCit7CisgIEdzdE9wVFYgKmZpbHRlciA9IEdTVF9PUFRWICh0cmFucyk7CisKKyAgZmlsdGVyLT5waGFzZSA9IDA7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3B0dl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0T3BUViAqZmlsdGVyID0gR1NUX09QVFYgKG9iamVjdCk7CisKKyAgaWYgKGZpbHRlci0+b3BtYXBbMF0pIHsKKyAgICBnaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICBnX2ZyZWUgKGZpbHRlci0+b3BtYXBbaV0pOworICAgICAgZmlsdGVyLT5vcG1hcFtpXSA9IE5VTEw7CisgICAgfQorICB9CisKKyAgZ19mcmVlIChmaWx0ZXItPmRpZmYpOworICBmaWx0ZXItPmRpZmYgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vcHR2X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RPcFRWICpmaWx0ZXIgPSBHU1RfT1BUViAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGZpbHRlcik7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZmlsdGVyLT5tb2RlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NQRUVEOgorICAgICAgZmlsdGVyLT5zcGVlZCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUkVTSE9MRDoKKyAgICAgIGZpbHRlci0+dGhyZXNob2xkID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vcHR2X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RPcFRWICpmaWx0ZXIgPSBHU1RfT1BUViAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTU9ERToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBmaWx0ZXItPm1vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NQRUVEOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZmlsdGVyLT5zcGVlZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSRVNIT0xEOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIGZpbHRlci0+dGhyZXNob2xkKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9vcHR2X2NsYXNzX2luaXQgKEdzdE9wVFZDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKnRyYW5zX2NsYXNzID0gKEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqKSBrbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzcyA9IChHc3RWaWRlb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9vcHR2X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X29wdHZfZ2V0X3Byb3BlcnR5OworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X29wdHZfZmluYWxpemU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJtb2RlIiwgIk1vZGUiLAorICAgICAgICAgICJNb2RlIiwgR1NUX1RZUEVfT1BUVl9NT0RFLCBERUZBVUxUX01PREUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TUEVFRCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJzcGVlZCIsICJTcGVlZCIsCisgICAgICAgICAgIkVmZmVjdCBzcGVlZCIsIEdfTUlOSU5ULCBHX01BWElOVCwgREVGQVVMVF9TUEVFRCwKKyAgICAgICAgICBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USFJFU0hPTEQsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInRocmVzaG9sZCIsICJUaHJlc2hvbGQiLAorICAgICAgICAgICJMdW1hIHRocmVzaG9sZCIsIDAsIEdfTUFYSU5ULCBERUZBVUxUX1RIUkVTSE9MRCwKKyAgICAgICAgICBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIk9wVFYgZWZmZWN0IiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1ZpZGVvIiwKKyAgICAgICJPcHRpY2FsIGFydCBtZWV0cyByZWFsLXRpbWUgdmlkZW8gZWZmZWN0IiwKKyAgICAgICJGVUtVQ0hJLCBLZW50YXJvdSA8ZnVrdWNoaUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+LCAiCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X29wdHZfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9vcHR2X3NyY190ZW1wbGF0ZSk7CisKKyAgdHJhbnNfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vcHR2X3N0YXJ0KTsKKworICB2ZmlsdGVyX2NsYXNzLT5zZXRfaW5mbyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3B0dl9zZXRfaW5mbyk7CisgIHZmaWx0ZXJfY2xhc3MtPnRyYW5zZm9ybV9mcmFtZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3B0dl90cmFuc2Zvcm1fZnJhbWUpOworCisgIGluaXRQYWxldHRlICgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29wdHZfaW5pdCAoR3N0T3BUViAqIGZpbHRlcikKK3sKKyAgZmlsdGVyLT5zcGVlZCA9IERFRkFVTFRfU1BFRUQ7CisgIGZpbHRlci0+bW9kZSA9IERFRkFVTFRfTU9ERTsKKyAgZmlsdGVyLT50aHJlc2hvbGQgPSBERUZBVUxUX1RIUkVTSE9MRDsKK30KZGlmZiAtLWdpdCBhL2dzdC9lZmZlY3R2L2dzdG9wLmggYi9nc3QvZWZmZWN0di9nc3RvcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NzI0MDIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZWZmZWN0di9nc3RvcC5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogRWZmZWNUViAtIFJlYWx0aW1lIERpZ2l0YWwgVmlkZW8gRWZmZWN0b3IKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IEZVS1VDSEkgS2VudGFybworICoKKyAqIE9wVFYgLSBPcHRpY2FsIGFydCBtZWV0cyByZWFsLXRpbWUgdmlkZW8gZWZmZWN0LgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgRlVLVUNISSBLZW50YXJvCisgKgorICogRWZmZWNUViBpcyBmcmVlIHNvZnR3YXJlLiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9PUF9IX18KKyNkZWZpbmUgX19HU1RfT1BfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9maWx0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX09QVFYgXAorICAoZ3N0X29wdHZfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX09QVFYob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9PUFRWLEdzdE9wVFYpKQorI2RlZmluZSBHU1RfT1BUVl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9PUFRWLEdzdE9wVFZDbGFzcykpCisjZGVmaW5lIEdTVF9JU19PUFRWKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfT1BUVikpCisjZGVmaW5lIEdTVF9JU19PUFRWX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX09QVFYpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0T3BUViBHc3RPcFRWOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9wVFZDbGFzcyBHc3RPcFRWQ2xhc3M7CisKK3N0cnVjdCBfR3N0T3BUVgoreworICBHc3RWaWRlb0ZpbHRlciBlbGVtZW50OworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIGdpbnQgbW9kZTsKKyAgZ2ludCBzcGVlZDsKKyAgZ3VpbnQgdGhyZXNob2xkOworCisgIGdpbnQ4ICpvcG1hcFs0XTsKKyAgZ3VpbnQ4ICpkaWZmOworICBndWludDggcGhhc2U7Cit9OworCitzdHJ1Y3QgX0dzdE9wVFZDbGFzcworeworICBHc3RWaWRlb0ZpbHRlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9vcHR2X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX09QX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYyBiL2dzdC9lZmZlY3R2L2dzdHF1YXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJhZGU3NQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L2dzdHF1YXJrLmMKQEAgLTAsMCArMSwyOTkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIEVmZmVjVFY6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBGVUtVQ0hJIEtlbnRhcm91CisgKgorICogUXVhcmtUViAtIG1vdGlvbiBkaXNvbHZlci4KKyAqCisgKiAgRWZmZWNUViBpcyBmcmVlIHNvZnR3YXJlLiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcXVhcmt0dgorICoKKyAqIFF1YXJrVFYgZGlzb2x2ZXMgbW92aW5nIG9iamVjdHMuIEl0IHBpY2tzIHVwIHBpeGVscyBmcm9tCisgKiB0aGUgbGFzdCBmcmFtZXMgcmFuZG9tbHkuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyAhIHF1YXJrdHYgISB2aWRlb2NvbnZlcnQgISBhdXRvdmlkZW9zaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIHNob3dzIHRoZSBlZmZlY3Qgb2YgcXVhcmt0diBvbiBhIHRlc3Qgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RxdWFyay5oIgorI2luY2x1ZGUgImdzdGVmZmVjdHYuaCIKKworLyogbnVtYmVyIG9mIGZyYW1lcyBvZiB0aW1lLWJ1ZmZlci4gSXQgc2hvdWxkIGJlIGFzIGEgY29uZmlndXJhYmxlIHBhcmFtYXRlciAqLworLyogVGhpcyBudW1iZXIgYWxzbyBtdXN0IGJlIDJebiBqdXN0IGZvciB0aGUgc3BlZWQuICovCisjZGVmaW5lIFBMQU5FUyAxNgorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9QTEFORVMKK307CisKKyNkZWZpbmUgZ3N0X3F1YXJrdHZfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UXVhcmtUViwgZ3N0X3F1YXJrdHYsIEdTVF9UWVBFX1ZJREVPX0ZJTFRFUik7CisKK3N0YXRpYyB2b2lkIGdzdF9xdWFya3R2X3BsYW5ldGFibGVfY2xlYXIgKEdzdFF1YXJrVFYgKiBmaWx0ZXIpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3F1YXJrdHZfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IHhSR0IsIHhCR1IsIEJHUngsIFJHQnggfSIpKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcXVhcmt0dl9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgeFJHQiwgeEJHUiwgQkdSeCwgUkdCeCB9IikpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuCitnc3RfcXVhcmt0dl9zZXRfaW5mbyAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RDYXBzICogaW5jYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0UXVhcmtUViAqZmlsdGVyID0gR1NUX1FVQVJLVFYgKHZmaWx0ZXIpOworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgd2lkdGggPSBHU1RfVklERU9fSU5GT19XSURUSCAoaW5faW5mbyk7CisgIGhlaWdodCA9IEdTVF9WSURFT19JTkZPX0hFSUdIVCAoaW5faW5mbyk7CisKKyAgZ3N0X3F1YXJrdHZfcGxhbmV0YWJsZV9jbGVhciAoZmlsdGVyKTsKKyAgZmlsdGVyLT5hcmVhID0gd2lkdGggKiBoZWlnaHQ7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcXVhcmt0dl90cmFuc2Zvcm1fZnJhbWUgKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLAorICAgIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUpCit7CisgIEdzdFF1YXJrVFYgKmZpbHRlciA9IEdTVF9RVUFSS1RWICh2ZmlsdGVyKTsKKyAgZ2ludCBhcmVhOworICBndWludDMyICpzcmMsICpkZXN0OworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworICBHc3RCdWZmZXIgKipwbGFuZXRhYmxlOworICBnaW50IHBsYW5lcywgY3VycmVudF9wbGFuZTsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5fZnJhbWUtPmJ1ZmZlcik7CisgIHRpbWVzdGFtcCA9CisgICAgICBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJkdTVF9CQVNFX1RSQU5TRk9STSAodmZpbHRlciktPnNlZ21lbnQsCisgICAgICBHU1RfRk9STUFUX1RJTUUsIHRpbWVzdGFtcCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAic3luYyB0byAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHRpbWVzdGFtcCkpCisgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoZmlsdGVyKSwgdGltZXN0YW1wKTsKKworICBpZiAoR19VTkxJS0VMWSAoZmlsdGVyLT5wbGFuZXRhYmxlID09IE5VTEwpKQorICAgIHJldHVybiBHU1RfRkxPV19GTFVTSElORzsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworICBhcmVhID0gZmlsdGVyLT5hcmVhOworICBwbGFuZXRhYmxlID0gZmlsdGVyLT5wbGFuZXRhYmxlOworICBwbGFuZXMgPSBmaWx0ZXItPnBsYW5lczsKKyAgY3VycmVudF9wbGFuZSA9IGZpbHRlci0+Y3VycmVudF9wbGFuZTsKKworICBpZiAocGxhbmV0YWJsZVtjdXJyZW50X3BsYW5lXSkKKyAgICBnc3RfYnVmZmVyX3VucmVmIChwbGFuZXRhYmxlW2N1cnJlbnRfcGxhbmVdKTsKKyAgcGxhbmV0YWJsZVtjdXJyZW50X3BsYW5lXSA9IGdzdF9idWZmZXJfcmVmIChpbl9mcmFtZS0+YnVmZmVyKTsKKworICAvKiBGb3IgZWFjaCBwaXhlbCAqLworICB3aGlsZSAoLS1hcmVhKSB7CisgICAgR3N0QnVmZmVyICpyYW5kOworCisgICAgLyogcGljayBhIHJhbmRvbSBidWZmZXIgKi8KKyAgICByYW5kID0gcGxhbmV0YWJsZVsoY3VycmVudF9wbGFuZSArIChmYXN0cmFuZCAoKSA+PiAyNCkpICUgcGxhbmVzXTsKKworICAgIC8qIENvcHkgdGhlIHBpeGVsIGZyb20gdGhlIHJhbmRvbSBidWZmZXIgdG8gZGVzdCwgRklYTUUsIHNsb3cgKi8KKyAgICBpZiAocmFuZCkKKyAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAocmFuZCwgYXJlYSAqIDQsICZkZXN0W2FyZWFdLCA0KTsKKyAgICBlbHNlCisgICAgICBkZXN0W2FyZWFdID0gc3JjW2FyZWFdOworICB9CisKKyAgZmlsdGVyLT5jdXJyZW50X3BsYW5lLS07CisgIGlmIChmaWx0ZXItPmN1cnJlbnRfcGxhbmUgPCAwKQorICAgIGZpbHRlci0+Y3VycmVudF9wbGFuZSA9IHBsYW5lcyAtIDE7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdWFya3R2X3BsYW5ldGFibGVfY2xlYXIgKEdzdFF1YXJrVFYgKiBmaWx0ZXIpCit7CisgIGdpbnQgaTsKKworICBpZiAoZmlsdGVyLT5wbGFuZXRhYmxlID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXItPnBsYW5lczsgaSsrKSB7CisgICAgaWYgKEdTVF9JU19CVUZGRVIgKGZpbHRlci0+cGxhbmV0YWJsZVtpXSkpIHsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGZpbHRlci0+cGxhbmV0YWJsZVtpXSk7CisgICAgfQorICAgIGZpbHRlci0+cGxhbmV0YWJsZVtpXSA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcXVhcmt0dl9zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICBHc3RRdWFya1RWICpmaWx0ZXIgPSBHU1RfUVVBUktUViAodHJhbnMpOworCisgIGlmIChmaWx0ZXItPnBsYW5ldGFibGUpIHsKKyAgICBnc3RfcXVhcmt0dl9wbGFuZXRhYmxlX2NsZWFyIChmaWx0ZXIpOworICAgIGdfZnJlZSAoZmlsdGVyLT5wbGFuZXRhYmxlKTsKKyAgfQorICBmaWx0ZXItPnBsYW5ldGFibGUgPQorICAgICAgKEdzdEJ1ZmZlciAqKikgZ19tYWxsb2MwIChmaWx0ZXItPnBsYW5lcyAqIHNpemVvZiAoR3N0QnVmZmVyICopKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdWFya3R2X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RRdWFya1RWICpmaWx0ZXIgPSBHU1RfUVVBUktUViAob2JqZWN0KTsKKworICBpZiAoZmlsdGVyLT5wbGFuZXRhYmxlKSB7CisgICAgZ3N0X3F1YXJrdHZfcGxhbmV0YWJsZV9jbGVhciAoZmlsdGVyKTsKKyAgICBnX2ZyZWUgKGZpbHRlci0+cGxhbmV0YWJsZSk7CisgICAgZmlsdGVyLT5wbGFuZXRhYmxlID0gTlVMTDsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdWFya3R2X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RRdWFya1RWICpmaWx0ZXIgPSBHU1RfUVVBUktUViAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGZpbHRlcik7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QTEFORVM6CisgICAgeworICAgICAgZ2ludCBuZXdfbl9wbGFuZXMgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIEdzdEJ1ZmZlciAqKm5ld19wbGFuZXRhYmxlOworICAgICAgZ2ludCBpOworCisgICAgICAvKiBJZiB0aGUgbnVtYmVyIG9mIHBsYW5lcyBjaGFuZ2VkLCBjb3B5IGFjcm9zcyBhbnkgZXhpc3RpbmcgcGxhbmVzICovCisgICAgICBpZiAobmV3X25fcGxhbmVzICE9IGZpbHRlci0+cGxhbmVzKSB7CisgICAgICAgIG5ld19wbGFuZXRhYmxlID0KKyAgICAgICAgICAgIChHc3RCdWZmZXIgKiopIGdfbWFsbG9jMCAobmV3X25fcGxhbmVzICogc2l6ZW9mIChHc3RCdWZmZXIgKikpOworCisgICAgICAgIGlmIChmaWx0ZXItPnBsYW5ldGFibGUpIHsKKyAgICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IG5ld19uX3BsYW5lcykgJiYgKGkgPCBmaWx0ZXItPnBsYW5lcyk7IGkrKykgeworICAgICAgICAgICAgbmV3X3BsYW5ldGFibGVbaV0gPSBmaWx0ZXItPnBsYW5ldGFibGVbaV07CisgICAgICAgICAgfQorICAgICAgICAgIGZvciAoOyBpIDwgZmlsdGVyLT5wbGFuZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKGZpbHRlci0+cGxhbmV0YWJsZVtpXSkKKyAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoZmlsdGVyLT5wbGFuZXRhYmxlW2ldKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ19mcmVlIChmaWx0ZXItPnBsYW5ldGFibGUpOworICAgICAgICB9CisKKyAgICAgICAgZmlsdGVyLT5wbGFuZXRhYmxlID0gbmV3X3BsYW5ldGFibGU7CisgICAgICAgIGZpbHRlci0+cGxhbmVzID0gbmV3X25fcGxhbmVzOworICAgICAgICBmaWx0ZXItPmN1cnJlbnRfcGxhbmUgPSBmaWx0ZXItPnBsYW5lcyAtIDE7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdWFya3R2X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RRdWFya1RWICpmaWx0ZXIgPSBHU1RfUVVBUktUViAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUExBTkVTOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZmlsdGVyLT5wbGFuZXMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3F1YXJrdHZfY2xhc3NfaW5pdCAoR3N0UXVhcmtUVkNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqdHJhbnNfY2xhc3MgPSAoR3N0QmFzZVRyYW5zZm9ybUNsYXNzICopIGtsYXNzOworICBHc3RWaWRlb0ZpbHRlckNsYXNzICp2ZmlsdGVyX2NsYXNzID0gKEdzdFZpZGVvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3F1YXJrdHZfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcXVhcmt0dl9nZXRfcHJvcGVydHk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcXVhcmt0dl9maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BMQU5FUywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJwbGFuZXMiLCAiUGxhbmVzIiwKKyAgICAgICAgICAiTnVtYmVyIG9mIHBsYW5lcyIsIDEsIDY0LCBQTEFORVMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSkpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJRdWFya1RWIGVmZmVjdCIsCisgICAgICAiRmlsdGVyL0VmZmVjdC9WaWRlbyIsCisgICAgICAiTW90aW9uIGRpc3NvbHZlciIsICJGVUtVQ0hJLCBLZW50YXJvdSA8ZnVrdWNoaUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3F1YXJrdHZfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9xdWFya3R2X3NyY190ZW1wbGF0ZSk7CisKKyAgdHJhbnNfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9xdWFya3R2X3N0YXJ0KTsKKworICB2ZmlsdGVyX2NsYXNzLT5zZXRfaW5mbyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcXVhcmt0dl9zZXRfaW5mbyk7CisgIHZmaWx0ZXJfY2xhc3MtPnRyYW5zZm9ybV9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3F1YXJrdHZfdHJhbnNmb3JtX2ZyYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdWFya3R2X2luaXQgKEdzdFF1YXJrVFYgKiBmaWx0ZXIpCit7CisgIGZpbHRlci0+cGxhbmVzID0gUExBTkVTOworICBmaWx0ZXItPmN1cnJlbnRfcGxhbmUgPSBmaWx0ZXItPnBsYW5lcyAtIDE7Cit9CmRpZmYgLS1naXQgYS9nc3QvZWZmZWN0di9nc3RxdWFyay5oIGIvZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTU3NzU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuaApAQCAtMCwwICsxLDcxIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBFZmZlY1RWOgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgRlVLVUNISSBLZW50YXJvdQorICoKKyAqIFF1YXJrVFYgLSBtb3Rpb24gZGlzb2x2ZXIuCisgKgorICogIEVmZmVjVFYgaXMgZnJlZSBzb2Z0d2FyZS4gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUVVBUktfSF9fCisjZGVmaW5lIF9fR1NUX1FVQVJLX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9RVUFSS1RWIFwKKyAgKGdzdF9xdWFya3R2X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9RVUFSS1RWKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUVVBUktUVixHc3RRdWFya1RWKSkKKyNkZWZpbmUgR1NUX1FVQVJLVFZfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUVVBUktUVixHc3RRdWFya1RWQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUVVBUktUVihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1FVQVJLVFYpKQorI2RlZmluZSBHU1RfSVNfUVVBUktUVl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9RVUFSS1RWKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFF1YXJrVFYgR3N0UXVhcmtUVjsKK3R5cGVkZWYgc3RydWN0IF9Hc3RRdWFya1RWQ2xhc3MgR3N0UXVhcmtUVkNsYXNzOworCitzdHJ1Y3QgX0dzdFF1YXJrVFYKK3sKKyAgR3N0VmlkZW9GaWx0ZXIgZWxlbWVudDsKKworICAvKiA8IHByaXZhdGUgPiAqLworICBnaW50IGFyZWE7CisgIGdpbnQgcGxhbmVzOworICBnaW50IGN1cnJlbnRfcGxhbmU7CisgIEdzdEJ1ZmZlciAqKnBsYW5ldGFibGU7Cit9OworCitzdHJ1Y3QgX0dzdFF1YXJrVFZDbGFzcworeworICBHc3RWaWRlb0ZpbHRlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9xdWFya3R2X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1FVQVJLX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5jIGIvZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NjM2ODQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZWZmZWN0di9nc3RyYWRpb2FjLmMKQEAgLTAsMCArMSw2MjIgQEAKKy8qIEdTdHJlYW1lcgorICogQ3JhZGlvYWN5cmlnaHQgKEMpIDwyMDA5PiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBFZmZlY1RWIC0gUmVhbHRpbWUgRGlnaXRhbCBWaWRlbyBFZmZlY3RvcgorICogQ3JhZGlvYWN5cmlnaHQgKEMpIDIwMDEtMjAwNiBGVUtVQ0hJIEtlbnRhcm8KKyAqCisgKiBSYWRpb2FjVFYgLSBtb3Rpb24tZW5saWdodG1lbnQgZWZmZWN0LgorICogQ3JhZGlvYWN5cmlnaHQgKEMpIDIwMDEtMjAwMiBGVUtVQ0hJIEtlbnRhcm8KKyAqCisgKiBFZmZlY1RWIGlzIGZyZWUgc29mdHdhcmUuIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIHJhZGlvYWN0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhyYWRpb2FjZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjcmFkaW9hY3kgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1yYWRpb2FjdHYKKyAqCisgKiBSYWRpb2FjVFYgZG9lcyAqTk9UKiBkZXRlY3QgYSByYWRpb2FjdGl2aXR5LiBJdCBkZXRlY3RzIGEgZGlmZmVyZW5jZQorICogZnJvbSBwcmV2aW91cyBmcmFtZSBhbmQgYmx1cnMgaXQuCisgKiAKKyAqIFJhZGlvYWNUViBoYXMgNCBtb2RlLCBub3JtYWwsIHN0cm9iZTEsIHN0cm9iZTIgYW5kIHRyaWdnZXIuCisgKiBJbiB0cmlnZ2VyIG1vZGUsIGVmZmVjdCBhcHBlYXJzIG9ubHkgd2hlbiB0aGUgdHJpZ2dlciBwcm9wZXJ0eSBpcyAlVFJVRS4KKyAqCisgKiBzdHJvYmUxIGFuZCBzdHJvYmUyIG1vZGUgZHJvcHMgc29tZSBmcmFtZXMuIHN0cm9iZTEgbW9kZSB1c2VzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKyAqIGN1cnJlbnQgZnJhbWUgYW5kIHByZXZpb3VzIGZyYW1lIGRyb3BwZWQsIHdoaWxlIHN0cm9iZTIgbW9kZSB1c2VzIHRoZSBkaWZmZXJlbmNlIGZyb20KKyAqIHByZXZpb3VzIGZyYW1lIGRpc3BsYXllZC4gVGhlIGVmZmVjdCBvZiBzdHJvYmUyIGlzIHN0cm9uZ2VyIHRoYW4gc3Ryb2JlMS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgdmlkZW90ZXN0c3JjICEgcmFkaW9hY3R2ICEgdmlkZW9jb252ZXJ0ICEgYXV0b3ZpZGVvc2luaworICogXXwgVGhpcyBwaXBlbGluZSBzaG93cyB0aGUgZWZmZWN0IG9mIHJhZGlvYWN0diBvbiBhIHRlc3Qgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RyYWRpb2FjLmgiCisjaW5jbHVkZSAiZ3N0ZWZmZWN0di5oIgorCitlbnVtCit7CisgIFJBRElPQUNfTk9STUFMID0gMCwKKyAgUkFESU9BQ19TVFJPQkUsCisgIFJBRElPQUNfU1RST0JFMiwKKyAgUkFESU9BQ19UUklHR0VSCit9OworCitlbnVtCit7CisgIENPTE9SX1JFRCA9IDAsCisgIENPTE9SX0dSRUVOLAorICBDT0xPUl9CTFVFLAorICBDT0xPUl9XSElURQorfTsKKworI2RlZmluZSBHU1RfVFlQRV9SQURJT0FDVFZfTU9ERSAoZ3N0X3JhZGlvYWN0dl9tb2RlX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9yYWRpb2FjdHZfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIHR5cGUgPSAwOworCisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIGVudW12YWx1ZVtdID0geworICAgIHtSQURJT0FDX05PUk1BTCwgIk5vcm1hbCIsICJub3JtYWwifSwKKyAgICB7UkFESU9BQ19TVFJPQkUsICJTdHJvYmUgMSIsICJzdHJvYmUxIn0sCisgICAge1JBRElPQUNfU1RST0JFMiwgIlN0cm9iZSAyIiwgInN0cm9iZTIifSwKKyAgICB7UkFESU9BQ19UUklHR0VSLCAiVHJpZ2dlciIsICJ0cmlnZ2VyIn0sCisgICAgezAsIE5VTEwsIE5VTEx9LAorICB9OworCisgIGlmICghdHlwZSkgeworICAgIHR5cGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0UmFkaW9hY1RWTW9kZSIsIGVudW12YWx1ZSk7CisgIH0KKyAgcmV0dXJuIHR5cGU7Cit9CisKKyNkZWZpbmUgR1NUX1RZUEVfUkFESU9BQ1RWX0NPTE9SIChnc3RfcmFkaW9hY3R2X2NvbG9yX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9yYWRpb2FjdHZfY29sb3JfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSB0eXBlID0gMDsKKworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSBlbnVtdmFsdWVbXSA9IHsKKyAgICB7Q09MT1JfUkVELCAiUmVkIiwgInJlZCJ9LAorICAgIHtDT0xPUl9HUkVFTiwgIkdyZWVuIiwgImdyZWVuIn0sCisgICAge0NPTE9SX0JMVUUsICJCbHVlIiwgImJsdWUifSwKKyAgICB7Q09MT1JfV0hJVEUsICJXaGl0ZSIsICJ3aGl0ZSJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIXR5cGUpIHsKKyAgICB0eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFJhZGlvYWNUVkNvbG9yIiwgZW51bXZhbHVlKTsKKyAgfQorICByZXR1cm4gdHlwZTsKK30KKworI2RlZmluZSBERUZBVUxUX01PREUgUkFESU9BQ19OT1JNQUwKKyNkZWZpbmUgREVGQVVMVF9DT0xPUiBDT0xPUl9XSElURQorI2RlZmluZSBERUZBVUxUX0lOVEVSVkFMIDMKKyNkZWZpbmUgREVGQVVMVF9UUklHR0VSIEZBTFNFCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX01PREUsCisgIFBST1BfQ09MT1IsCisgIFBST1BfSU5URVJWQUwsCisgIFBST1BfVFJJR0dFUgorfTsKKworI2RlZmluZSBDT0xPUlMgMzIKKyNkZWZpbmUgUEFUVEVSTiA0CisjZGVmaW5lIE1BR0lDX1RIUkVTSE9MRCA0MAorI2RlZmluZSBSQVRJTyAwLjk1CisKK3N0YXRpYyBndWludDMyIHBhbGV0dGVzW0NPTE9SUyAqIFBBVFRFUk5dOworc3RhdGljIGNvbnN0IGdpbnQgc3dhcF90YWJbXSA9IHsgMiwgMSwgMCwgMyB9OworCisjZGVmaW5lIGdzdF9yYWRpb2FjdHZfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UmFkaW9hY1RWLCBnc3RfcmFkaW9hY3R2LCBHU1RfVFlQRV9WSURFT19GSUxURVIpOworCisjaWYgR19CWVRFX09SREVSID09IEdfTElUVExFX0VORElBTgorI2RlZmluZSBDQVBTX1NUUiBHU1RfVklERU9fQ0FQU19NQUtFICgieyBSR0J4LCBCR1J4IH0iKQorI2Vsc2UKKyNkZWZpbmUgQ0FQU19TVFIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgeEJHUiwgeFJHQiB9IikKKyNlbmRpZgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3JhZGlvYWN0dl9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoQ0FQU19TVFIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9yYWRpb2FjdHZfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKENBUFNfU1RSKQorICAgICk7CisKK3N0YXRpYyB2b2lkCittYWtlUGFsZXR0ZSAodm9pZCkKK3sKKyAgZ2ludCBpOworCisjZGVmaW5lIERFTFRBICgyNTUvKENPTE9SUy8yLTEpKQorCisgIC8qIHJlZCwgZ3JlZSwgYmx1ZSAqLworICBmb3IgKGkgPSAwOyBpIDwgQ09MT1JTIC8gMjsgaSsrKSB7CisgICAgcGFsZXR0ZXNbaV0gPSBpICogREVMVEE7CisgICAgcGFsZXR0ZXNbQ09MT1JTICsgaV0gPSAoaSAqIERFTFRBKSA8PCA4OworICAgIHBhbGV0dGVzW0NPTE9SUyAqIDIgKyBpXSA9IChpICogREVMVEEpIDw8IDE2OworICB9CisgIGZvciAoaSA9IDA7IGkgPCBDT0xPUlMgLyAyOyBpKyspIHsKKyAgICBwYWxldHRlc1tpICsgQ09MT1JTIC8gMl0gPSAyNTUgfCAoaSAqIERFTFRBKSA8PCAxNiB8IChpICogREVMVEEpIDw8IDg7CisgICAgcGFsZXR0ZXNbQ09MT1JTICsgaSArIENPTE9SUyAvIDJdID0KKyAgICAgICAgKDI1NSA8PCA4KSB8IChpICogREVMVEEpIDw8IDE2IHwgaSAqIERFTFRBOworICAgIHBhbGV0dGVzW0NPTE9SUyAqIDIgKyBpICsgQ09MT1JTIC8gMl0gPQorICAgICAgICAoMjU1IDw8IDE2KSB8IChpICogREVMVEEpIDw8IDggfCBpICogREVMVEE7CisgIH0KKyAgLyogd2hpdGUgKi8KKyAgZm9yIChpID0gMDsgaSA8IENPTE9SUzsgaSsrKSB7CisgICAgcGFsZXR0ZXNbQ09MT1JTICogMyArIGldID0gKDI1NSAqIGkgLyBDT0xPUlMpICogMHgxMDEwMTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgQ09MT1JTICogUEFUVEVSTjsgaSsrKSB7CisgICAgcGFsZXR0ZXNbaV0gPSBwYWxldHRlc1tpXSAmIDB4ZmVmZWZmOworICB9CisjdW5kZWYgREVMVEEKK30KKworI2RlZmluZSBWSURFT19IV0lEVEggKGZpbHRlci0+YnVmX3dpZHRoLzIpCisjZGVmaW5lIFZJREVPX0hIRUlHSFQgKGZpbHRlci0+YnVmX2hlaWdodC8yKQorCisvKiB0aGlzIHRhYmxlIGFzc3VtZXMgdGhhdCB2aWRlb193aWR0aCBpcyB0aW1lcyBvZiAzMiAqLworc3RhdGljIHZvaWQKK3NldFRhYmxlIChHc3RSYWRpb2FjVFYgKiBmaWx0ZXIpCit7CisgIGd1aW50IGJpdHM7CisgIGdpbnQgeCwgeSwgdHgsIHR5LCB4eDsKKyAgZ2ludCBwdHIsIHByZXZwdHI7CisKKyAgcHJldnB0ciA9IChnaW50KSAoMC41ICsgUkFUSU8gKiAoLVZJREVPX0hXSURUSCkgKyBWSURFT19IV0lEVEgpOworICBmb3IgKHh4ID0gMDsgeHggPCAoZmlsdGVyLT5idWZfd2lkdGhfYmxvY2tzKTsgeHgrKykgeworICAgIGJpdHMgPSAwOworICAgIGZvciAoeCA9IDA7IHggPCAzMjsgeCsrKSB7CisgICAgICBwdHIgPSAoZ2ludCkgKDAuNSArIFJBVElPICogKHh4ICogMzIgKyB4IC0gVklERU9fSFdJRFRIKSArIFZJREVPX0hXSURUSCk7CisgICAgICBiaXRzID0gYml0cyA+PiAxOworICAgICAgaWYgKHB0ciAhPSBwcmV2cHRyKQorICAgICAgICBiaXRzIHw9IDB4ODAwMDAwMDA7CisgICAgICBwcmV2cHRyID0gcHRyOworICAgIH0KKyAgICBmaWx0ZXItPmJsdXJ6b29teFt4eF0gPSBiaXRzOworICB9CisKKyAgdHkgPSAoZ2ludCkgKDAuNSArIFJBVElPICogKC1WSURFT19ISEVJR0hUKSArIFZJREVPX0hIRUlHSFQpOworICB0eCA9IChnaW50KSAoMC41ICsgUkFUSU8gKiAoLVZJREVPX0hXSURUSCkgKyBWSURFT19IV0lEVEgpOworICB4eCA9IChnaW50KSAoMC41ICsgUkFUSU8gKiAoZmlsdGVyLT5idWZfd2lkdGggLSAxIC0gVklERU9fSFdJRFRIKSArCisgICAgICBWSURFT19IV0lEVEgpOworICBmaWx0ZXItPmJsdXJ6b29teVswXSA9IHR5ICogZmlsdGVyLT5idWZfd2lkdGggKyB0eDsKKyAgcHJldnB0ciA9IHR5ICogZmlsdGVyLT5idWZfd2lkdGggKyB4eDsKKyAgZm9yICh5ID0gMTsgeSA8IGZpbHRlci0+YnVmX2hlaWdodDsgeSsrKSB7CisgICAgdHkgPSAoZ2ludCkgKDAuNSArIFJBVElPICogKHkgLSBWSURFT19ISEVJR0hUKSArIFZJREVPX0hIRUlHSFQpOworICAgIGZpbHRlci0+Ymx1cnpvb215W3ldID0gdHkgKiBmaWx0ZXItPmJ1Zl93aWR0aCArIHR4IC0gcHJldnB0cjsKKyAgICBwcmV2cHRyID0gdHkgKiBmaWx0ZXItPmJ1Zl93aWR0aCArIHh4OworICB9Cit9CisKKyN1bmRlZiBWSURFT19IV0lEVEgKKyN1bmRlZiBWSURFT19ISEVJR0hUCisKK3N0YXRpYyB2b2lkCitibHVyIChHc3RSYWRpb2FjVFYgKiBmaWx0ZXIpCit7CisgIGdpbnQgeCwgeTsKKyAgZ2ludCB3aWR0aDsKKyAgZ3VpbnQ4ICpwLCAqcTsKKyAgZ3VpbnQ4IHY7CisgIEdzdFZpZGVvSW5mbyAqaW5mbzsKKworICBpbmZvID0gJkdTVF9WSURFT19GSUxURVIgKGZpbHRlciktPmluX2luZm87CisKKyAgd2lkdGggPSBmaWx0ZXItPmJ1Zl93aWR0aDsKKyAgcCA9IGZpbHRlci0+Ymx1cnpvb21idWYgKyBHU1RfVklERU9fSU5GT19XSURUSCAoaW5mbykgKyAxOworICBxID0gcCArIGZpbHRlci0+YnVmX2FyZWE7CisKKyAgZm9yICh5ID0gZmlsdGVyLT5idWZfaGVpZ2h0IC0gMjsgeSA+IDA7IHktLSkgeworICAgIGZvciAoeCA9IHdpZHRoIC0gMjsgeCA+IDA7IHgtLSkgeworICAgICAgdiA9ICgqKHAgLSB3aWR0aCkgKyAqKHAgLSAxKSArICoocCArIDEpICsgKihwICsgd2lkdGgpKSAvIDQgLSAxOworICAgICAgaWYgKHYgPT0gMjU1KQorICAgICAgICB2ID0gMDsKKyAgICAgICpxID0gdjsKKyAgICAgIHArKzsKKyAgICAgIHErKzsKKyAgICB9CisgICAgcCArPSAyOworICAgIHEgKz0gMjsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorem9vbSAoR3N0UmFkaW9hY1RWICogZmlsdGVyKQoreworICBnaW50IGIsIHgsIHk7CisgIGd1aW50OCAqcCwgKnE7CisgIGdpbnQgYmxvY2tzLCBoZWlnaHQ7CisgIGdpbnQgZHg7CisKKyAgcCA9IGZpbHRlci0+Ymx1cnpvb21idWYgKyBmaWx0ZXItPmJ1Zl9hcmVhOworICBxID0gZmlsdGVyLT5ibHVyem9vbWJ1ZjsKKyAgaGVpZ2h0ID0gZmlsdGVyLT5idWZfaGVpZ2h0OworICBibG9ja3MgPSBmaWx0ZXItPmJ1Zl93aWR0aF9ibG9ja3M7CisKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgcCArPSBmaWx0ZXItPmJsdXJ6b29teVt5XTsKKyAgICBmb3IgKGIgPSAwOyBiIDwgYmxvY2tzOyBiKyspIHsKKyAgICAgIGR4ID0gZmlsdGVyLT5ibHVyem9vbXhbYl07CisgICAgICBmb3IgKHggPSAwOyB4IDwgMzI7IHgrKykgeworICAgICAgICBwICs9IChkeCAmIDEpOworICAgICAgICAqcSsrID0gKnA7CisgICAgICAgIGR4ID0gZHggPj4gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2JsdXJ6b29tY29yZSAoR3N0UmFkaW9hY1RWICogZmlsdGVyKQoreworICBibHVyIChmaWx0ZXIpOworICB6b29tIChmaWx0ZXIpOworfQorCisvKiBCYWNrZ3JvdW5kIGltYWdlIGlzIHJlZnJlc2hlZCBldmVyeSBmcmFtZSAqLworc3RhdGljIHZvaWQKK2ltYWdlX2Jnc3VidHJhY3RfdXBkYXRlX3kgKGd1aW50MzIgKiBzcmMsIGdpbnQxNiAqIGJhY2tncm91bmQsIGd1aW50OCAqIGRpZmYsCisgICAgZ2ludCB2aWRlb19hcmVhLCBnaW50IHlfdGhyZXNob2xkKQoreworICBnaW50IGk7CisgIGdpbnQgUiwgRywgQjsKKyAgZ3VpbnQzMiAqcDsKKyAgZ2ludDE2ICpxOworICBndWludDggKnI7CisgIGdpbnQgdjsKKworICBwID0gc3JjOworICBxID0gYmFja2dyb3VuZDsKKyAgciA9IGRpZmY7CisgIGZvciAoaSA9IDA7IGkgPCB2aWRlb19hcmVhOyBpKyspIHsKKyAgICBSID0gKCgqcCkgJiAweGZmMDAwMCkgPj4gKDE2IC0gMSk7CisgICAgRyA9ICgoKnApICYgMHhmZjAwKSA+PiAoOCAtIDIpOworICAgIEIgPSAoKnApICYgMHhmZjsKKyAgICB2ID0gKFIgKyBHICsgQikgLSAoZ2ludCkgKCpxKTsKKyAgICAqcSA9IChnaW50MTYpIChSICsgRyArIEIpOworICAgICpyID0gKCh2ICsgeV90aHJlc2hvbGQpID4+IDI0KSB8ICgoeV90aHJlc2hvbGQgLSB2KSA+PiAyNCk7CisKKyAgICBwKys7CisgICAgcSsrOworICAgIHIrKzsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3JhZGlvYWN0dl90cmFuc2Zvcm1fZnJhbWUgKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwKKyAgICBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUpCit7CisgIEdzdFJhZGlvYWNUViAqZmlsdGVyID0gR1NUX1JBRElPQUNUViAodmZpbHRlcik7CisgIGd1aW50MzIgKnNyYywgKmRlc3Q7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIHN0cmVhbV90aW1lOworICBnaW50IHgsIHksIHdpZHRoLCBoZWlnaHQ7CisgIGd1aW50MzIgYSwgYjsKKyAgZ3VpbnQ4ICpkaWZmLCAqcDsKKyAgZ3VpbnQzMiAqcGFsZXR0ZTsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5fZnJhbWUtPmJ1ZmZlcik7CisgIHN0cmVhbV90aW1lID0KKyAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmR1NUX0JBU0VfVFJBTlNGT1JNIChmaWx0ZXIpLT5zZWdtZW50LAorICAgICAgR1NUX0ZPUk1BVF9USU1FLCB0aW1lc3RhbXApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwgInN5bmMgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSk7CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdHJlYW1fdGltZSkpCisgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoZmlsdGVyKSwgc3RyZWFtX3RpbWUpOworCisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworI2lmIEdfQllURV9PUkRFUiA9PSBHX0xJVFRMRV9FTkRJQU4KKyAgaWYgKEdTVF9WSURFT19GUkFNRV9GT1JNQVQgKGluX2ZyYW1lKSA9PSBHU1RfVklERU9fRk9STUFUX1JHQngpIHsKKyAgICBwYWxldHRlID0gJnBhbGV0dGVzW0NPTE9SUyAqIGZpbHRlci0+Y29sb3JdOworICB9IGVsc2UgeworICAgIHBhbGV0dGUgPSAmcGFsZXR0ZXNbQ09MT1JTICogc3dhcF90YWJbZmlsdGVyLT5jb2xvcl1dOworICB9CisjZWxzZQorICBpZiAoR1NUX1ZJREVPX0ZSQU1FX0ZPUk1BVCAoaW5fZnJhbWUpID09IEdTVF9WSURFT19GT1JNQVRfeEJHUikgeworICAgIHBhbGV0dGUgPSAmcGFsZXR0ZXNbQ09MT1JTICogZmlsdGVyLT5jb2xvcl07CisgIH0gZWxzZSB7CisgICAgcGFsZXR0ZSA9ICZwYWxldHRlc1tDT0xPUlMgKiBzd2FwX3RhYltmaWx0ZXItPmNvbG9yXV07CisgIH0KKyNlbmRpZgorICBkaWZmID0gZmlsdGVyLT5kaWZmOworCisgIGlmIChmaWx0ZXItPm1vZGUgPT0gMyAmJiBmaWx0ZXItPnRyaWdnZXIpCisgICAgZmlsdGVyLT5zbmFwdGltZSA9IDA7CisgIGVsc2UgaWYgKGZpbHRlci0+bW9kZSA9PSAzICYmICFmaWx0ZXItPnRyaWdnZXIpCisgICAgZmlsdGVyLT5zbmFwdGltZSA9IDE7CisKKyAgaWYgKGZpbHRlci0+bW9kZSAhPSAyIHx8IGZpbHRlci0+c25hcHRpbWUgPD0gMCkgeworICAgIGltYWdlX2Jnc3VidHJhY3RfdXBkYXRlX3kgKHNyYywgZmlsdGVyLT5iYWNrZ3JvdW5kLCBkaWZmLAorICAgICAgICB3aWR0aCAqIGhlaWdodCwgTUFHSUNfVEhSRVNIT0xEICogNyk7CisgICAgaWYgKGZpbHRlci0+bW9kZSA9PSAwIHx8IGZpbHRlci0+c25hcHRpbWUgPD0gMCkgeworICAgICAgZGlmZiArPSBmaWx0ZXItPmJ1Zl9tYXJnaW5fbGVmdDsKKyAgICAgIHAgPSBmaWx0ZXItPmJsdXJ6b29tYnVmOworICAgICAgZm9yICh5ID0gMDsgeSA8IGZpbHRlci0+YnVmX2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBmaWx0ZXItPmJ1Zl93aWR0aDsgeCsrKSB7CisgICAgICAgICAgcFt4XSB8PSBkaWZmW3hdID4+IDM7CisgICAgICAgIH0KKyAgICAgICAgZGlmZiArPSB3aWR0aDsKKyAgICAgICAgcCArPSBmaWx0ZXItPmJ1Zl93aWR0aDsKKyAgICAgIH0KKyAgICAgIGlmIChmaWx0ZXItPm1vZGUgPT0gMSB8fCBmaWx0ZXItPm1vZGUgPT0gMikgeworICAgICAgICBtZW1jcHkgKGZpbHRlci0+c25hcGZyYW1lLCBzcmMsIHdpZHRoICogaGVpZ2h0ICogNCk7CisgICAgICB9CisgICAgfQorICB9CisgIGJsdXJ6b29tY29yZSAoZmlsdGVyKTsKKworICBpZiAoZmlsdGVyLT5tb2RlID09IDEgfHwgZmlsdGVyLT5tb2RlID09IDIpIHsKKyAgICBzcmMgPSBmaWx0ZXItPnNuYXBmcmFtZTsKKyAgfQorICBwID0gZmlsdGVyLT5ibHVyem9vbWJ1ZjsKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgZm9yICh4ID0gMDsgeCA8IGZpbHRlci0+YnVmX21hcmdpbl9sZWZ0OyB4KyspIHsKKyAgICAgICpkZXN0KysgPSAqc3JjKys7CisgICAgfQorICAgIGZvciAoeCA9IDA7IHggPCBmaWx0ZXItPmJ1Zl93aWR0aDsgeCsrKSB7CisgICAgICBhID0gKnNyYysrICYgMHhmZWZlZmY7CisgICAgICBiID0gcGFsZXR0ZVsqcCsrXTsKKyAgICAgIGEgKz0gYjsKKyAgICAgIGIgPSBhICYgMHgxMDEwMTAwOworICAgICAgKmRlc3QrKyA9IGEgfCAoYiAtIChiID4+IDgpKTsKKyAgICB9CisgICAgZm9yICh4ID0gMDsgeCA8IGZpbHRlci0+YnVmX21hcmdpbl9yaWdodDsgeCsrKSB7CisgICAgICAqZGVzdCsrID0gKnNyYysrOworICAgIH0KKyAgfQorCisgIGlmIChmaWx0ZXItPm1vZGUgPT0gMSB8fCBmaWx0ZXItPm1vZGUgPT0gMikgeworICAgIGZpbHRlci0+c25hcHRpbWUtLTsKKyAgICBpZiAoZmlsdGVyLT5zbmFwdGltZSA8IDApIHsKKyAgICAgIGZpbHRlci0+c25hcHRpbWUgPSBmaWx0ZXItPmludGVydmFsOworICAgIH0KKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3JhZGlvYWN0dl9zZXRfaW5mbyAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RDYXBzICogaW5jYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0UmFkaW9hY1RWICpmaWx0ZXIgPSBHU1RfUkFESU9BQ1RWICh2ZmlsdGVyKTsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworCisgIHdpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKGluX2luZm8pOworICBoZWlnaHQgPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKGluX2luZm8pOworCisgIGZpbHRlci0+YnVmX3dpZHRoX2Jsb2NrcyA9IHdpZHRoIC8gMzI7CisgIGlmIChmaWx0ZXItPmJ1Zl93aWR0aF9ibG9ja3MgPiAyNTUpCisgICAgZ290byB0b29fd2lkZTsKKworICBmaWx0ZXItPmJ1Zl93aWR0aCA9IGZpbHRlci0+YnVmX3dpZHRoX2Jsb2NrcyAqIDMyOworICBmaWx0ZXItPmJ1Zl9oZWlnaHQgPSBoZWlnaHQ7CisgIGZpbHRlci0+YnVmX2FyZWEgPSBmaWx0ZXItPmJ1Zl9oZWlnaHQgKiBmaWx0ZXItPmJ1Zl93aWR0aDsKKyAgZmlsdGVyLT5idWZfbWFyZ2luX2xlZnQgPSAod2lkdGggLSBmaWx0ZXItPmJ1Zl93aWR0aCkgLyAyOworICBmaWx0ZXItPmJ1Zl9tYXJnaW5fcmlnaHQgPQorICAgICAgaGVpZ2h0IC0gZmlsdGVyLT5idWZfd2lkdGggLSBmaWx0ZXItPmJ1Zl9tYXJnaW5fbGVmdDsKKworICBnX2ZyZWUgKGZpbHRlci0+Ymx1cnpvb21idWYpOworICBmaWx0ZXItPmJsdXJ6b29tYnVmID0gZ19uZXcwIChndWludDgsIGZpbHRlci0+YnVmX2FyZWEgKiAyKTsKKworICBnX2ZyZWUgKGZpbHRlci0+Ymx1cnpvb214KTsKKyAgZmlsdGVyLT5ibHVyem9vbXggPSBnX25ldzAgKGdpbnQsIGZpbHRlci0+YnVmX3dpZHRoKTsKKworICBnX2ZyZWUgKGZpbHRlci0+Ymx1cnpvb215KTsKKyAgZmlsdGVyLT5ibHVyem9vbXkgPSBnX25ldzAgKGdpbnQsIGZpbHRlci0+YnVmX2hlaWdodCk7CisKKyAgZ19mcmVlIChmaWx0ZXItPnNuYXBmcmFtZSk7CisgIGZpbHRlci0+c25hcGZyYW1lID0gZ19uZXcgKGd1aW50MzIsIHdpZHRoICogaGVpZ2h0KTsKKworICBnX2ZyZWUgKGZpbHRlci0+ZGlmZik7CisgIGZpbHRlci0+ZGlmZiA9IGdfbmV3IChndWludDgsIHdpZHRoICogaGVpZ2h0KTsKKworICBnX2ZyZWUgKGZpbHRlci0+YmFja2dyb3VuZCk7CisgIGZpbHRlci0+YmFja2dyb3VuZCA9IGdfbmV3MCAoZ2ludDE2LCB3aWR0aCAqIGhlaWdodCk7CisKKyAgc2V0VGFibGUgKGZpbHRlcik7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCit0b29fd2lkZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwgImZyYW1lIHRvbyB3aWRlIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3JhZGlvYWN0dl9zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICBHc3RSYWRpb2FjVFYgKmZpbHRlciA9IEdTVF9SQURJT0FDVFYgKHRyYW5zKTsKKworICBmaWx0ZXItPnNuYXB0aW1lID0gMDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9yYWRpb2FjdHZfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJhZGlvYWNUViAqZmlsdGVyID0gR1NUX1JBRElPQUNUViAob2JqZWN0KTsKKworICBnX2ZyZWUgKGZpbHRlci0+c25hcGZyYW1lKTsKKyAgZmlsdGVyLT5zbmFwZnJhbWUgPSBOVUxMOworCisgIGdfZnJlZSAoZmlsdGVyLT5ibHVyem9vbWJ1Zik7CisgIGZpbHRlci0+Ymx1cnpvb21idWYgPSBOVUxMOworCisgIGdfZnJlZSAoZmlsdGVyLT5kaWZmKTsKKyAgZmlsdGVyLT5kaWZmID0gTlVMTDsKKworICBnX2ZyZWUgKGZpbHRlci0+YmFja2dyb3VuZCk7CisgIGZpbHRlci0+YmFja2dyb3VuZCA9IE5VTEw7CisKKyAgZ19mcmVlIChmaWx0ZXItPmJsdXJ6b29teCk7CisgIGZpbHRlci0+Ymx1cnpvb214ID0gTlVMTDsKKworICBnX2ZyZWUgKGZpbHRlci0+Ymx1cnpvb215KTsKKyAgZmlsdGVyLT5ibHVyem9vbXkgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9yYWRpb2FjdHZfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJhZGlvYWNUViAqZmlsdGVyID0gR1NUX1JBRElPQUNUViAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGZpbHRlcik7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZmlsdGVyLT5tb2RlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgaWYgKGZpbHRlci0+bW9kZSA9PSAzKQorICAgICAgICBmaWx0ZXItPnNuYXB0aW1lID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT0xPUjoKKyAgICAgIGZpbHRlci0+Y29sb3IgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSU5URVJWQUw6CisgICAgICBmaWx0ZXItPmludGVydmFsID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RSSUdHRVI6CisgICAgICBmaWx0ZXItPnRyaWdnZXIgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JhZGlvYWN0dl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UmFkaW9hY1RWICpmaWx0ZXIgPSBHU1RfUkFESU9BQ1RWIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGZpbHRlci0+bW9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ09MT1I6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgZmlsdGVyLT5jb2xvcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSU5URVJWQUw6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgZmlsdGVyLT5pbnRlcnZhbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVFJJR0dFUjoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBmaWx0ZXItPnRyaWdnZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3JhZGlvYWN0dl9jbGFzc19pbml0IChHc3RSYWRpb2FjVFZDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKnRyYW5zX2NsYXNzID0gKEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqKSBrbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzcyA9IChHc3RWaWRlb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9yYWRpb2FjdHZfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcmFkaW9hY3R2X2dldF9wcm9wZXJ0eTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9yYWRpb2FjdHZfZmluYWxpemU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJtb2RlIiwgIk1vZGUiLAorICAgICAgICAgICJNb2RlIiwgR1NUX1RZUEVfUkFESU9BQ1RWX01PREUsIERFRkFVTFRfTU9ERSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NPTE9SLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJjb2xvciIsICJDb2xvciIsCisgICAgICAgICAgIkNvbG9yIiwgR1NUX1RZUEVfUkFESU9BQ1RWX0NPTE9SLCBERUZBVUxUX0NPTE9SLAorICAgICAgICAgIEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0lOVEVSVkFMLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJpbnRlcnZhbCIsICJJbnRlcnZhbCIsCisgICAgICAgICAgIlNuYXBzaG90IGludGVydmFsIChpbiBzdHJvYmUgbW9kZSkiLCAwLCBHX01BWElOVCwgREVGQVVMVF9JTlRFUlZBTCwKKyAgICAgICAgICBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UUklHR0VSLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJ0cmlnZ2VyIiwgIlRyaWdnZXIiLAorICAgICAgICAgICJUcmlnZ2VyIChpbiB0cmlnZ2VyIG1vZGUpIiwgREVGQVVMVF9UUklHR0VSLAorICAgICAgICAgIEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUmFkaW9hY1RWIGVmZmVjdCIsCisgICAgICAiRmlsdGVyL0VmZmVjdC9WaWRlbyIsCisgICAgICAibW90aW9uLWVubGlnaHRtZW50IGVmZmVjdCIsCisgICAgICAiRlVLVUNISSwgS2VudGFyb3UgPGZ1a3VjaGlAdXNlcnMuc291cmNlZm9yZ2UubmV0PiwgIgorICAgICAgIlNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9yYWRpb2FjdHZfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9yYWRpb2FjdHZfc3JjX3RlbXBsYXRlKTsKKworICB0cmFuc19jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3JhZGlvYWN0dl9zdGFydCk7CisKKyAgdmZpbHRlcl9jbGFzcy0+c2V0X2luZm8gPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3JhZGlvYWN0dl9zZXRfaW5mbyk7CisgIHZmaWx0ZXJfY2xhc3MtPnRyYW5zZm9ybV9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3JhZGlvYWN0dl90cmFuc2Zvcm1fZnJhbWUpOworCisgIG1ha2VQYWxldHRlICgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JhZGlvYWN0dl9pbml0IChHc3RSYWRpb2FjVFYgKiBmaWx0ZXIpCit7CisgIGZpbHRlci0+bW9kZSA9IERFRkFVTFRfTU9ERTsKKyAgZmlsdGVyLT5jb2xvciA9IERFRkFVTFRfQ09MT1I7CisgIGZpbHRlci0+aW50ZXJ2YWwgPSBERUZBVUxUX0lOVEVSVkFMOworICBmaWx0ZXItPnRyaWdnZXIgPSBERUZBVUxUX1RSSUdHRVI7Cit9CmRpZmYgLS1naXQgYS9nc3QvZWZmZWN0di9nc3RyYWRpb2FjLmggYi9nc3QvZWZmZWN0di9nc3RyYWRpb2FjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhkN2M5OQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L2dzdHJhZGlvYWMuaApAQCAtMCwwICsxLDg3IEBACisvKiBHU3RyZWFtZXIKKyAqIENyYWRpb2FjeXJpZ2h0IChDKSA8MjAwOT4gU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogRWZmZWNUViAtIFJlYWx0aW1lIERpZ2l0YWwgVmlkZW8gRWZmZWN0b3IKKyAqIENyYWRpb2FjeXJpZ2h0IChDKSAyMDAxLTIwMDYgRlVLVUNISSBLZW50YXJvCisgKgorICogUmFkaW9hY1RWIC0gbW90aW9uLWVubGlnaHRtZW50IGVmZmVjdC4KKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEZVS1VDSEkgS2VudGFybworICoKKyAqIEVmZmVjVFYgaXMgZnJlZSBzb2Z0d2FyZS4gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgcmFkaW9hY3Rpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaHJhZGlvYWNlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNyYWRpb2FjeSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUkFESU9BQ19IX18KKyNkZWZpbmUgX19HU1RfUkFESU9BQ19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2ZpbHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUkFESU9BQ1RWIFwKKyAgKGdzdF9yYWRpb2FjdHZfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JBRElPQUNUVihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JBRElPQUNUVixHc3RSYWRpb2FjVFYpKQorI2RlZmluZSBHU1RfUkFESU9BQ1RWX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JBRElPQUNUVixHc3RSYWRpb2FjVFZDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SQURJT0FDVFYob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SQURJT0FDVFYpKQorI2RlZmluZSBHU1RfSVNfUkFESU9BQ1RWX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JBRElPQUNUVikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSYWRpb2FjVFYgR3N0UmFkaW9hY1RWOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJhZGlvYWNUVkNsYXNzIEdzdFJhZGlvYWNUVkNsYXNzOworCitzdHJ1Y3QgX0dzdFJhZGlvYWNUVgoreworICBHc3RWaWRlb0ZpbHRlciBlbGVtZW50OworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIGdpbnQgbW9kZTsKKyAgZ2ludCBjb2xvcjsKKyAgZ3VpbnQgaW50ZXJ2YWw7CisgIGdib29sZWFuIHRyaWdnZXI7CisKKyAgZ2ludCBzbmFwdGltZTsKKworICBndWludDMyICpzbmFwZnJhbWU7CisgIGd1aW50OCAqYmx1cnpvb21idWY7CisgIGd1aW50OCAqZGlmZjsKKyAgZ2ludDE2ICpiYWNrZ3JvdW5kOworICBnaW50ICpibHVyem9vbXg7CisgIGdpbnQgKmJsdXJ6b29teTsKKworICBnaW50IGJ1Zl93aWR0aF9ibG9ja3M7CisgIGdpbnQgYnVmX3dpZHRoOworICBnaW50IGJ1Zl9oZWlnaHQ7CisgIGdpbnQgYnVmX2FyZWE7CisgIGdpbnQgYnVmX21hcmdpbl9yaWdodDsKKyAgZ2ludCBidWZfbWFyZ2luX2xlZnQ7Cit9OworCitzdHJ1Y3QgX0dzdFJhZGlvYWNUVkNsYXNzCit7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3JhZGlvYWN0dl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SQURJT0FDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0cmV2LmMgYi9nc3QvZWZmZWN0di9nc3RyZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjk1OTUwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VmZmVjdHYvZ3N0cmV2LmMKQEAgLTAsMCArMSwyNDkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBFZmZlY1RWOgorICogQ29weXJpZ2h0IChDKSAyMDAxIEZVS1VDSEkgS2VudGFyb3UKKyAqCisgKiBFZmZlY1RWIC0gUmVhbHRpbWUgRGlnaXRhbCBWaWRlbyBFZmZlY3RvcgorICogQ29weXJpZ2h0IChDKSAyMDAxIEZVS1VDSEkgS2VudGFyb3UKKyAqCisgKiByZXZUViBiYXNlZCBvbiBSdXR0LUV0cmEgVmlkZW8gU3ludGhlc2l6ZXIgMTk3ND8KKworICogKGMpMjAwMiBFZCBUYW5uZW5iYXVtCisgKgorICogVGhpcyBlZmZlY3QgYWN0cyBsaWtlIGEgd2F2ZWZvcm0gbW9uaXRvciBvbiBlYWNoIGxpbmUuCisgKiBJdCB3YXMgb3JpZ2luYWxseSBkb25lIGJ5IGRlZmxlY3RpbmcgdGhlIGVsZWN0cm9uIGJlYW0gb24gYSBtb25pdG9yIHVzaW5nCisgKiBhZGRpdGlvbmFsIGVsZWN0cm9tYWduZXRzIG9uIHRoZSB5b2tlIG9mIGEgYi93IENSVC4gCisgKiBIZXJlIGl0IGlzIGVtdWxhdGVkIGRpZ2l0YWxseS4KKworICogRXhwZXJpbWFlbnRhbCB0YXBlcyB3ZXJlIG1hZGUgd2l0aCB0aGlzIHN5c3RlbSBieSBCaWxsIGFuZCAKKyAqIExvdWlzZSBFdHJhIGFuZCBXb29keSBhbmQgU3RlaW5hIFZhc3Vsa2EKKworICogVGhlIGxpbmUgc3BhY2luZyBjYW4gYmUgY29udHJvbGxlZCB1c2luZyB0aGUgMSBhbmQgMiBLZXlzLgorICogVGhlIGdhaW4gaXMgY29udHJvbGxlZCB1c2luZyB0aGUgMyBhbmQgNCBrZXlzLgorICogVGhlIHVwZGF0ZSByYXRlIGlzIGNvbnRyb2xsZWQgdXNpbmcgdGhlIDAgYW5kIC0ga2V5cy4KKyAKKyAqIEVmZmVjVFYgaXMgZnJlZSBzb2Z0d2FyZS4gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJldnR2CisgKgorICogUmV2VFYgYWN0cyBsaWtlIGEgdmlkZW8gd2F2ZWZvcm0gbW9uaXRvciBmb3IgZWFjaCBsaW5lIG9mIHZpZGVvCisgKiBwcm9jZXNzZWQuIFRoaXMgY3JlYXRlcyBhIHBzZXVkbyAzRCBlZmZlY3QgYmFzZWQgb24gdGhlIGJyaWdodG5lc3MKKyAqIG9mIHRoZSB2aWRlbyBhbG9uZyBlYWNoIGxpbmUuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyAhIHJldnR2ICEgdmlkZW9jb252ZXJ0ICEgYXV0b3ZpZGVvc2luaworICogXXwgVGhpcyBwaXBlbGluZSBzaG93cyB0aGUgZWZmZWN0IG9mIHJldnR2IG9uIGEgdGVzdCBzdHJlYW0uCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdHJldi5oIgorCisjZGVmaW5lIFRIRV9DT0xPUiAweGZmZmZmZmZmCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0RFTEFZLAorICBQUk9QX0xJTkVTUEFDRSwKKyAgUFJPUF9HQUlOCit9OworCisjZGVmaW5lIGdzdF9yZXZ0dl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSZXZUViwgZ3N0X3JldnR2LCBHU1RfVFlQRV9WSURFT19GSUxURVIpOworCisjaWYgR19CWVRFX09SREVSID09IEdfTElUVExFX0VORElBTgorI2RlZmluZSBDQVBTX1NUUiBHU1RfVklERU9fQ0FQU19NQUtFICgieyBCR1J4LCBSR0J4IH0iKQorI2Vsc2UKKyNkZWZpbmUgQ0FQU19TVFIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgeEJHUiwgeFJHQiB9IikKKyNlbmRpZgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3JldnR2X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChDQVBTX1NUUikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3JldnR2X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChDQVBTX1NUUikKKyAgICApOworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3JldnR2X3RyYW5zZm9ybV9mcmFtZSAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSkKK3sKKyAgR3N0UmV2VFYgKmZpbHRlciA9IEdTVF9SRVZUViAodmZpbHRlcik7CisgIGd1aW50MzIgKnNyYywgKmRlc3Q7CisgIGdpbnQgd2lkdGgsIGhlaWdodCwgc3N0cmlkZSwgZHN0cmlkZTsKKyAgZ3VpbnQzMiAqbnNyYzsKKyAgZ2ludCB5LCB4LCBSLCBHLCBCLCB5dmFsOworICBnaW50IGxpbmVzcGFjZSwgdnNjYWxlOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBzdHJlYW1fdGltZTsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5fZnJhbWUtPmJ1ZmZlcik7CisgIHN0cmVhbV90aW1lID0KKyAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmR1NUX0JBU0VfVFJBTlNGT1JNICh2ZmlsdGVyKS0+c2VnbWVudCwKKyAgICAgIEdTVF9GT1JNQVRfVElNRSwgdGltZXN0YW1wKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsICJzeW5jIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtX3RpbWUpKQorICAgIGdzdF9vYmplY3Rfc3luY192YWx1ZXMgKEdTVF9PQkpFQ1QgKGZpbHRlciksIHN0cmVhbV90aW1lKTsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBzc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisgIGRzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChvdXRfZnJhbWUsIDApOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKTsKKworICAvKiBDbGVhciBldmVyeXRoaW5nIHRvIGJsYWNrICovCisgIG1lbXNldCAoZGVzdCwgMCwgZHN0cmlkZSAqIGhlaWdodCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworICBsaW5lc3BhY2UgPSBmaWx0ZXItPmxpbmVzcGFjZTsKKyAgdnNjYWxlID0gZmlsdGVyLT52c2NhbGU7CisKKyAgLyogZHJhdyB0aGUgb2Zmc2V0IGxpbmVzICovCisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gbGluZXNwYWNlKSB7CisgICAgZm9yICh4ID0gMDsgeCA8PSB3aWR0aDsgeCsrKSB7CisgICAgICBuc3JjID0gc3JjICsgKHkgKiBzc3RyaWRlIC8gNCkgKyB4OworCisgICAgICAvKiBDYWxjIFkgVmFsdWUgZm9yIGN1cnBpeCAqLworICAgICAgUiA9ICgoKm5zcmMpICYgMHhmZjAwMDApID4+ICgxNiAtIDEpOworICAgICAgRyA9ICgoKm5zcmMpICYgMHhmZjAwKSA+PiAoOCAtIDIpOworICAgICAgQiA9ICgqbnNyYykgJiAweGZmOworCisgICAgICB5dmFsID0geSAtICgoc2hvcnQpIChSICsgRyArIEIpIC8gdnNjYWxlKTsKKworICAgICAgaWYgKHl2YWwgPiAwKSB7CisgICAgICAgIGRlc3RbeCArICh5dmFsICogZHN0cmlkZSAvIDQpXSA9IFRIRV9DT0xPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGZpbHRlcik7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JldnR2X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSZXZUViAqZmlsdGVyID0gR1NUX1JFVlRWIChvYmplY3QpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZmlsdGVyKTsKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RFTEFZOgorICAgICAgZmlsdGVyLT52Z3JhYnRpbWUgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9MSU5FU1BBQ0U6CisgICAgICBmaWx0ZXItPmxpbmVzcGFjZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0dBSU46CisgICAgICBmaWx0ZXItPnZzY2FsZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9yZXZ0dl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UmV2VFYgKmZpbHRlciA9IEdTVF9SRVZUViAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfREVMQVk6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBmaWx0ZXItPnZncmFidGltZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTElORVNQQUNFOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZmlsdGVyLT5saW5lc3BhY2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0dBSU46CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBmaWx0ZXItPnZzY2FsZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcmV2dHZfY2xhc3NfaW5pdCAoR3N0UmV2VFZDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RWaWRlb0ZpbHRlckNsYXNzICp2ZmlsdGVyX2NsYXNzID0gKEdzdFZpZGVvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3JldnR2X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3JldnR2X2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0RFTEFZLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImRlbGF5IiwgIkRlbGF5IiwgIkRlbGF5IGluIGZyYW1lcyBiZXR3ZWVuIHVwZGF0ZXMiLAorICAgICAgICAgIDEsIDEwMCwgMSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfTElORVNQQUNFLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImxpbmVzcGFjZSIsICJMaW5lc3BhY2UiLCAiQ29udHJvbCBsaW5lIHNwYWNpbmciLCAxLAorICAgICAgICAgIDEwMCwgNiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfR0FJTiwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJnYWluIiwgIkdhaW4iLCAiQ29udHJvbCBnYWluIiwgMSwgMjAwLCA1MCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlJldlRWIGVmZmVjdCIsCisgICAgICAiRmlsdGVyL0VmZmVjdC9WaWRlbyIsCisgICAgICAiQSB2aWRlbyB3YXZlZm9ybSBtb25pdG9yIGZvciBlYWNoIGxpbmUgb2YgdmlkZW8gcHJvY2Vzc2VkIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuYmU+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3JldnR2X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcmV2dHZfc3JjX3RlbXBsYXRlKTsKKworICB2ZmlsdGVyX2NsYXNzLT50cmFuc2Zvcm1fZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9yZXZ0dl90cmFuc2Zvcm1fZnJhbWUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JldnR2X2luaXQgKEdzdFJldlRWICogcmVzdHYpCit7CisgIHJlc3R2LT52Z3JhYnRpbWUgPSAxOworICByZXN0di0+dmdyYWIgPSAwOworICByZXN0di0+bGluZXNwYWNlID0gNjsKKyAgcmVzdHYtPnZzY2FsZSA9IDUwOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0cmV2LmggYi9nc3QvZWZmZWN0di9nc3RyZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTgzMTFiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VmZmVjdHYvZ3N0cmV2LmgKQEAgLTAsMCArMSw4NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIEVmZmVjVFY6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgRlVLVUNISSBLZW50YXJvdQorICoKKyAqIEVmZmVjVFYgLSBSZWFsdGltZSBEaWdpdGFsIFZpZGVvIEVmZmVjdG9yCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgRlVLVUNISSBLZW50YXJvdQorICoKKyAqIHJldlRWIGJhc2VkIG9uIFJ1dHQtRXRyYSBWaWRlbyBTeW50aGVzaXplciAxOTc0PworCisgKiAoYykyMDAyIEVkIFRhbm5lbmJhdW0KKyAqCisgKiBUaGlzIGVmZmVjdCBhY3RzIGxpa2UgYSB3YXZlZm9ybSBtb25pdG9yIG9uIGVhY2ggbGluZS4KKyAqIEl0IHdhcyBvcmlnaW5hbGx5IGRvbmUgYnkgZGVmbGVjdGluZyB0aGUgZWxlY3Ryb24gYmVhbSBvbiBhIG1vbml0b3IgdXNpbmcKKyAqIGFkZGl0aW9uYWwgZWxlY3Ryb21hZ25ldHMgb24gdGhlIHlva2Ugb2YgYSBiL3cgQ1JULiAKKyAqIEhlcmUgaXQgaXMgZW11bGF0ZWQgZGlnaXRhbGx5LgorCisgKiBFeHBlcmltYWVudGFsIHRhcGVzIHdlcmUgbWFkZSB3aXRoIHRoaXMgc3lzdGVtIGJ5IEJpbGwgYW5kIAorICogTG91aXNlIEV0cmEgYW5kIFdvb2R5IGFuZCBTdGVpbmEgVmFzdWxrYQorCisgKiBUaGUgbGluZSBzcGFjaW5nIGNhbiBiZSBjb250cm9sbGVkIHVzaW5nIHRoZSAxIGFuZCAyIEtleXMuCisgKiBUaGUgZ2FpbiBpcyBjb250cm9sbGVkIHVzaW5nIHRoZSAzIGFuZCA0IGtleXMuCisgKiBUaGUgdXBkYXRlIHJhdGUgaXMgY29udHJvbGxlZCB1c2luZyB0aGUgMCBhbmQgLSBrZXlzLgorIAorICogRWZmZWNUViBpcyBmcmVlIHNvZnR3YXJlLiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SRVZfSF9fCisjZGVmaW5lIF9fR1NUX1JFVl9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2ZpbHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUkVWVFYgXAorICAoZ3N0X3JldnR2X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SRVZUVihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JFVlRWLEdzdFJldlRWKSkKKyNkZWZpbmUgR1NUX1JFVlRWX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JFVlRWLEdzdFJldlRWQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUkVWVFYob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SRVZUVikpCisjZGVmaW5lIEdTVF9JU19SRVZUVl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SRVZUVikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSZXZUViBHc3RSZXZUVjsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSZXZUVkNsYXNzIEdzdFJldlRWQ2xhc3M7CisKK3N0cnVjdCBfR3N0UmV2VFYKK3sKKyAgR3N0VmlkZW9GaWx0ZXIgdmlkZW9maWx0ZXI7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKyAgZ2ludCB2Z3JhYnRpbWU7CisgIGdpbnQgdmdyYWI7CisgIGdpbnQgbGluZXNwYWNlOworICBnaW50IHZzY2FsZTsKK307CisKK3N0cnVjdCBfR3N0UmV2VFZDbGFzcworeworICBHc3RWaWRlb0ZpbHRlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9yZXZ0dl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SRVZfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZWZmZWN0di9nc3RyaXBwbGUuYyBiL2dzdC9lZmZlY3R2L2dzdHJpcHBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YWM2ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZWZmZWN0di9nc3RyaXBwbGUuYwpAQCAtMCwwICsxLDYxMSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBFZmZlY1RWIC0gUmVhbHRpbWUgRGlnaXRhbCBWaWRlbyBFZmZlY3RvcgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgRlVLVUNISSBLZW50YXJvCisgKgorICogUmlwcGxlVFYgLSBXYXRlciByaXBwbGUgZWZmZWN0LgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgRlVLVUNISSBLZW50YXJvCisgKgorICogVGhpcyBjb21iaW5lcyB0aGUgUmlwcGxlVFYgYW5kIEJhbHRhblRWIGVmZmVjdHMsIHdoaWNoIGFyZQorICogdmVyeSBzaW1pbGFyLiBCYWx0YW5UViBpcyB1c2VkIGlmIHRoZSBmZWVkYmFjayBwcm9wZXJ0eSBpcyBzZXQKKyAqIHRvIFRSVUUsIG90aGVyd2lzZSBSaXBwbGVUViBpcyB1c2VkLgorICoKKyAqIEVmZmVjVFYgaXMgZnJlZSBzb2Z0d2FyZS4gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJpcHBsZXR2CisgKgorICogUmlwcGxlVFYgZG9lcyByaXBwbGUgbWFyayBlZmZlY3Qgb24gdGhlIHZpZGVvIGlucHV0LiBUaGUgcmlwcGxlIGlzIGNhdXNlZAorICogYnkgbW90aW9uIG9yIHJhbmRvbSByYWluIGRyb3BzLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiB2aWRlb3Rlc3RzcmMgISByaXBwbGV0diAhIHZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsKKyAqIF18IFRoaXMgcGlwZWxpbmUgc2hvd3MgdGhlIGVmZmVjdCBvZiByaXBwbGV0diBvbiBhIHRlc3Qgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RyaXBwbGUuaCIKKyNpbmNsdWRlICJnc3RlZmZlY3R2LmgiCisKKyNkZWZpbmUgREVGQVVMVF9NT0RFIDAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUkVTRVQsCisgIFBST1BfTU9ERQorfTsKKworc3RhdGljIGdpbnQgc3FydGFibGVbMjU2XTsKKworI2RlZmluZSBHU1RfVFlQRV9SSVBQTEVUVl9NT0RFIChnc3RfcmlwcGxldHZfbW9kZV9nZXRfdHlwZSgpKQorc3RhdGljIEdUeXBlCitnc3RfcmlwcGxldHZfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIHR5cGUgPSAwOworCisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIGVudW12YWx1ZVtdID0geworICAgIHswLCAiTW90aW9uIERldGVjdGlvbiIsICJtb3Rpb24tZGV0ZWN0aW9uIn0sCisgICAgezEsICJSYWluIiwgInJhaW4ifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0sCisgIH07CisKKyAgaWYgKCF0eXBlKSB7CisgICAgdHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RSaXBwbGVUVk1vZGUiLCBlbnVtdmFsdWUpOworICB9CisgIHJldHVybiB0eXBlOworfQorCisjZGVmaW5lIGdzdF9yaXBwbGV0dl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSaXBwbGVUViwgZ3N0X3JpcHBsZXR2LCBHU1RfVFlQRV9WSURFT19GSUxURVIpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3JpcHBsZXR2X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBCR1J4LCBSR0J4LCB4QkdSLCB4UkdCIH0iKSkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3JpcHBsZXR2X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBCR1J4LCBSR0J4LCB4QkdSLCB4UkdCIH0iKSkKKyAgICApOworCitzdGF0aWMgY29uc3QgZ2ludCBwb2ludCA9IDE2Oworc3RhdGljIGNvbnN0IGdpbnQgaW1wYWN0ID0gMjsKK3N0YXRpYyBjb25zdCBnaW50IGRlY2F5ID0gODsKK3N0YXRpYyBjb25zdCBnaW50IGxvb3BudW0gPSAyOworCitzdGF0aWMgdm9pZAorc2V0VGFibGUgKHZvaWQpCit7CisgIGdpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKKyAgICBzcXJ0YWJsZVtpXSA9IGkgKiBpOworICB9CisgIGZvciAoaSA9IDE7IGkgPD0gMTI4OyBpKyspIHsKKyAgICBzcXJ0YWJsZVsyNTYgLSBpXSA9IC1pICogaTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAoraW1hZ2VfYmdzZXRfeSAoZ3VpbnQzMiAqIHNyYywgZ2ludDE2ICogYmFja2dyb3VuZCwgZ2ludCB2aWRlb19hcmVhKQoreworICBnaW50IGk7CisgIGdpbnQgUiwgRywgQjsKKyAgZ3VpbnQzMiAqcDsKKyAgZ2ludDE2ICpxOworCisgIHAgPSBzcmM7CisgIHEgPSBiYWNrZ3JvdW5kOworICBmb3IgKGkgPSAwOyBpIDwgdmlkZW9fYXJlYTsgaSsrKSB7CisgICAgUiA9ICgoKnApICYgMHhmZjAwMDApID4+ICgxNiAtIDEpOworICAgIEcgPSAoKCpwKSAmIDB4ZmYwMCkgPj4gKDggLSAyKTsKKyAgICBCID0gKCpwKSAmIDB4ZmY7CisgICAgKnEgPSAoZ2ludDE2KSAoUiArIEcgKyBCKTsKKyAgICBwKys7CisgICAgcSsrOworICB9Cit9CisKK3N0YXRpYyBnaW50CitzZXRCYWNrZ3JvdW5kIChHc3RSaXBwbGVUViAqIGZpbHRlciwgZ3VpbnQzMiAqIHNyYykKK3sKKyAgR3N0VmlkZW9JbmZvICppbmZvOworCisgIGluZm8gPSAmR1NUX1ZJREVPX0ZJTFRFUiAoZmlsdGVyKS0+aW5faW5mbzsKKworICBpbWFnZV9iZ3NldF95IChzcmMsIGZpbHRlci0+YmFja2dyb3VuZCwKKyAgICAgIEdTVF9WSURFT19JTkZPX1dJRFRIIChpbmZvKSAqIEdTVF9WSURFT19JTkZPX0hFSUdIVCAoaW5mbykpOworICBmaWx0ZXItPmJnX2lzX3NldCA9IFRSVUU7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitpbWFnZV9iZ3N1YnRyYWN0X3VwZGF0ZV95IChndWludDMyICogc3JjLCBnaW50MTYgKiBiYWNrZ3JvdW5kLCBndWludDggKiBkaWZmLAorICAgIGdpbnQgdmlkZW9fYXJlYSkKK3sKKyAgZ2ludCBpOworICBnaW50IFIsIEcsIEI7CisgIGd1aW50MzIgKnA7CisgIGdpbnQxNiAqcTsKKyAgZ3VpbnQ4ICpyOworICBnaW50IHY7CisKKyAgcCA9IHNyYzsKKyAgcSA9IGJhY2tncm91bmQ7CisgIHIgPSBkaWZmOworICBmb3IgKGkgPSAwOyBpIDwgdmlkZW9fYXJlYTsgaSsrKSB7CisgICAgUiA9ICgoKnApICYgMHhmZjAwMDApID4+ICgxNiAtIDEpOworICAgIEcgPSAoKCpwKSAmIDB4ZmYwMCkgPj4gKDggLSAyKTsKKyAgICBCID0gKCpwKSAmIDB4ZmY7CisgICAgdiA9IChSICsgRyArIEIpIC0gKGdpbnQpICgqcSk7CisgICAgKnEgPSAoZ2ludDE2KSAoUiArIEcgKyBCKTsKKyAgICAqciA9ICgodiArIDcwICogNykgPj4gMjQpIHwgKCg3MCAqIDcgLSB2KSA+PiAyNCk7CisKKyAgICBwKys7CisgICAgcSsrOworICAgIHIrKzsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorbW90aW9uZGV0ZWN0IChHc3RSaXBwbGVUViAqIGZpbHRlciwgZ3VpbnQzMiAqIHNyYykKK3sKKyAgZ3VpbnQ4ICpkaWZmID0gZmlsdGVyLT5kaWZmOworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgKnAsICpxOworICBnaW50IHgsIHksIGg7CisgIEdzdFZpZGVvSW5mbyAqaW5mbzsKKworICBpbmZvID0gJkdTVF9WSURFT19GSUxURVIgKGZpbHRlciktPmluX2luZm87CisKKyAgd2lkdGggPSBHU1RfVklERU9fSU5GT19XSURUSCAoaW5mbyk7CisgIGhlaWdodCA9IEdTVF9WSURFT19JTkZPX0hFSUdIVCAoaW5mbyk7CisKKyAgaWYgKCFmaWx0ZXItPmJnX2lzX3NldCkKKyAgICBzZXRCYWNrZ3JvdW5kIChmaWx0ZXIsIHNyYyk7CisKKyAgaW1hZ2VfYmdzdWJ0cmFjdF91cGRhdGVfeSAoc3JjLCBmaWx0ZXItPmJhY2tncm91bmQsIGZpbHRlci0+ZGlmZiwKKyAgICAgIHdpZHRoICogaGVpZ2h0KTsKKyAgcCA9IGZpbHRlci0+bWFwMSArIGZpbHRlci0+bWFwX3cgKyAxOworICBxID0gZmlsdGVyLT5tYXAyICsgZmlsdGVyLT5tYXBfdyArIDE7CisgIGRpZmYgKz0gd2lkdGggKyAyOworCisgIGZvciAoeSA9IGZpbHRlci0+bWFwX2ggLSAyOyB5ID4gMDsgeS0tKSB7CisgICAgZm9yICh4ID0gZmlsdGVyLT5tYXBfdyAtIDI7IHggPiAwOyB4LS0pIHsKKyAgICAgIGggPSAoZ2ludCkgKiBkaWZmICsgKGdpbnQpICogKGRpZmYgKyAxKSArIChnaW50KSAqIChkaWZmICsgd2lkdGgpICsKKyAgICAgICAgICAoZ2ludCkgKiAoZGlmZiArIHdpZHRoICsgMSk7CisgICAgICBpZiAoaCA+IDApIHsKKyAgICAgICAgKnAgPSBoIDw8IChwb2ludCArIGltcGFjdCAtIDgpOworICAgICAgICAqcSA9ICpwOworICAgICAgfQorICAgICAgcCsrOworICAgICAgcSsrOworICAgICAgZGlmZiArPSAyOworICAgIH0KKyAgICBkaWZmICs9IHdpZHRoICsgMjsKKyAgICBwICs9IDI7CisgICAgcSArPSAyOworICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZHJvcCAoZ2ludCBwb3dlciwgZ2ludCAqIG1hcDEsIGdpbnQgKiBtYXAyLCBnaW50IG1hcF93LCBnaW50IG1hcF9oKQoreworICBnaW50IHgsIHk7CisgIGdpbnQgKnAsICpxOworCisgIHggPSBmYXN0cmFuZCAoKSAlIChtYXBfdyAtIDQpICsgMjsKKyAgeSA9IGZhc3RyYW5kICgpICUgKG1hcF9oIC0gNCkgKyAyOworICBwID0gbWFwMSArIHkgKiBtYXBfdyArIHg7CisgIHEgPSBtYXAyICsgeSAqIG1hcF93ICsgeDsKKyAgKnAgPSBwb3dlcjsKKyAgKnEgPSBwb3dlcjsKKyAgKihwIC0gbWFwX3cpID0gKihwIC0gMSkgPSAqKHAgKyAxKSA9ICoocCArIG1hcF93KSA9IHBvd2VyIC8gMjsKKyAgKihwIC0gbWFwX3cgLSAxKSA9ICoocCAtIG1hcF93ICsgMSkgPSAqKHAgKyBtYXBfdyAtIDEpID0gKihwICsgbWFwX3cgKyAxKSA9CisgICAgICBwb3dlciAvIDQ7CisgICoocSAtIG1hcF93KSA9ICoocSAtIDEpID0gKihxICsgMSkgPSAqKHEgKyBtYXBfdykgPSBwb3dlciAvIDI7CisgICoocSAtIG1hcF93IC0gMSkgPSAqKHEgLSBtYXBfdyArIDEpID0gKihxICsgbWFwX3cgLSAxKSA9ICoocCArIG1hcF93ICsgMSkgPQorICAgICAgcG93ZXIgLyA0OworfQorCitzdGF0aWMgdm9pZAorcmFpbmRyb3AgKEdzdFJpcHBsZVRWICogZmlsdGVyKQoreworICBnaW50IGk7CisKKyAgaWYgKGZpbHRlci0+cGVyaW9kID09IDApIHsKKyAgICBzd2l0Y2ggKGZpbHRlci0+cmFpbl9zdGF0KSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIGZpbHRlci0+cGVyaW9kID0gKGZhc3RyYW5kICgpID4+IDIzKSArIDEwMDsKKyAgICAgICAgZmlsdGVyLT5kcm9wX3Byb2IgPSAwOworICAgICAgICBmaWx0ZXItPmRyb3BfcHJvYl9pbmNyZW1lbnQgPSAweDAwZmZmZmZmIC8gZmlsdGVyLT5wZXJpb2Q7CisgICAgICAgIGZpbHRlci0+ZHJvcF9wb3dlciA9ICgtKGZhc3RyYW5kICgpID4+IDI4KSAtIDIpIDw8IHBvaW50OworICAgICAgICBmaWx0ZXItPmRyb3BzX3Blcl9mcmFtZV9tYXggPSAyIDw8IChmYXN0cmFuZCAoKSA+PiAzMCk7IC8vIDIsNCw4IG9yIDE2CisgICAgICAgIGZpbHRlci0+cmFpbl9zdGF0ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE6CisgICAgICAgIGZpbHRlci0+ZHJvcF9wcm9iID0gMHgwMGZmZmZmZjsKKyAgICAgICAgZmlsdGVyLT5kcm9wc19wZXJfZnJhbWUgPSAxOworICAgICAgICBmaWx0ZXItPmRyb3BfcHJvYl9pbmNyZW1lbnQgPSAxOworICAgICAgICBmaWx0ZXItPnBlcmlvZCA9IChmaWx0ZXItPmRyb3BzX3Blcl9mcmFtZV9tYXggLSAxKSAqIDE2OworICAgICAgICBmaWx0ZXItPnJhaW5fc3RhdCA9IDI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBmaWx0ZXItPnBlcmlvZCA9IChmYXN0cmFuZCAoKSA+PiAyMikgKyAxMDAwOworICAgICAgICBmaWx0ZXItPmRyb3BfcHJvYl9pbmNyZW1lbnQgPSAwOworICAgICAgICBmaWx0ZXItPnJhaW5fc3RhdCA9IDM7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOgorICAgICAgICBmaWx0ZXItPnBlcmlvZCA9IChmaWx0ZXItPmRyb3BzX3Blcl9mcmFtZV9tYXggLSAxKSAqIDE2OworICAgICAgICBmaWx0ZXItPmRyb3BfcHJvYl9pbmNyZW1lbnQgPSAtMTsKKyAgICAgICAgZmlsdGVyLT5yYWluX3N0YXQgPSA0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgZmlsdGVyLT5wZXJpb2QgPSAoZmFzdHJhbmQgKCkgPj4gMjQpICsgNjA7CisgICAgICAgIGZpbHRlci0+ZHJvcF9wcm9iX2luY3JlbWVudCA9IC0oZmlsdGVyLT5kcm9wX3Byb2IgLyBmaWx0ZXItPnBlcmlvZCk7CisgICAgICAgIGZpbHRlci0+cmFpbl9zdGF0ID0gNTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDU6CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWx0ZXItPnBlcmlvZCA9IChmYXN0cmFuZCAoKSA+PiAyMykgKyA1MDA7CisgICAgICAgIGZpbHRlci0+ZHJvcF9wcm9iID0gMDsKKyAgICAgICAgZmlsdGVyLT5yYWluX3N0YXQgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgc3dpdGNoIChmaWx0ZXItPnJhaW5fc3RhdCkgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSAwOgorICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgIGNhc2UgNToKKyAgICAgIGlmICgoZmFzdHJhbmQgKCkgPj4gOCkgPCBmaWx0ZXItPmRyb3BfcHJvYikgeworICAgICAgICBkcm9wIChmaWx0ZXItPmRyb3BfcG93ZXIsIGZpbHRlci0+bWFwMSwgZmlsdGVyLT5tYXAyLCBmaWx0ZXItPm1hcF93LAorICAgICAgICAgICAgZmlsdGVyLT5tYXBfaCk7CisgICAgICB9CisgICAgICBmaWx0ZXItPmRyb3BfcHJvYiArPSBmaWx0ZXItPmRyb3BfcHJvYl9pbmNyZW1lbnQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgY2FzZSAzOgorICAgIGNhc2UgNDoKKyAgICAgIGZvciAoaSA9IGZpbHRlci0+ZHJvcHNfcGVyX2ZyYW1lIC8gMTY7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgZHJvcCAoZmlsdGVyLT5kcm9wX3Bvd2VyLCBmaWx0ZXItPm1hcDEsIGZpbHRlci0+bWFwMiwgZmlsdGVyLT5tYXBfdywKKyAgICAgICAgICAgIGZpbHRlci0+bWFwX2gpOworICAgICAgfQorICAgICAgZmlsdGVyLT5kcm9wc19wZXJfZnJhbWUgKz0gZmlsdGVyLT5kcm9wX3Byb2JfaW5jcmVtZW50OworICAgICAgYnJlYWs7CisgIH0KKyAgZmlsdGVyLT5wZXJpb2QtLTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9yaXBwbGV0dl90cmFuc2Zvcm1fZnJhbWUgKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwKKyAgICBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUpCit7CisgIEdzdFJpcHBsZVRWICpmaWx0ZXIgPSBHU1RfUklQUExFVFYgKHZmaWx0ZXIpOworICBndWludDMyICpzcmMsICpkZXN0OworICBnaW50IHgsIHksIGk7CisgIGdpbnQgZHgsIGR5LCBvX2R4OworICBnaW50IGgsIHY7CisgIGdpbnQgbV93LCBtX2gsIHZfdywgdl9oOworICBnaW50ICpwLCAqcSwgKnI7CisgIGdpbnQ4ICp2cDsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCwgc3RyZWFtX3RpbWU7CisKKyAgdGltZXN0YW1wID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluX2ZyYW1lLT5idWZmZXIpOworICBzdHJlYW1fdGltZSA9CisgICAgICBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJkdTVF9CQVNFX1RSQU5TRk9STSAodmZpbHRlciktPnNlZ21lbnQsCisgICAgICBHU1RfRk9STUFUX1RJTUUsIHRpbWVzdGFtcCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAic3luYyB0byAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHN0cmVhbV90aW1lKSkKKyAgICBnc3Rfb2JqZWN0X3N5bmNfdmFsdWVzIChHU1RfT0JKRUNUIChmaWx0ZXIpLCBzdHJlYW1fdGltZSk7CisKKyAgc3JjID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAwKTsKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZmlsdGVyKTsKKyAgLyogaW1wYWN0IGZyb20gdGhlIG1vdGlvbiBvciByYWluIGRyb3AgKi8KKyAgaWYgKGZpbHRlci0+bW9kZSkKKyAgICByYWluZHJvcCAoZmlsdGVyKTsKKyAgZWxzZQorICAgIG1vdGlvbmRldGVjdCAoZmlsdGVyLCBzcmMpOworCisgIG1fdyA9IGZpbHRlci0+bWFwX3c7CisgIG1faCA9IGZpbHRlci0+bWFwX2g7CisgIHZfdyA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpOworICB2X2ggPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSk7CisKKyAgLyogc2ltdWxhdGUgc3VyZmFjZSB3YXZlICovCisKKyAgLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSAzMCB0aW1lcyBwZXIgc2Vjb25kLiBUbyBpbmNyZWFzZSBhIHNwZWVkCisgICAqIG9mIHdhdmUsIGl0ZXJhdGVzIHRoaXMgbG9vcCBzZXZlcmFsIHRpbWVzLiAqLworICBmb3IgKGkgPSBsb29wbnVtOyBpID4gMDsgaS0tKSB7CisgICAgLyogd2F2ZSBzaW11bGF0aW9uICovCisgICAgcCA9IGZpbHRlci0+bWFwMSArIG1fdyArIDE7CisgICAgcSA9IGZpbHRlci0+bWFwMiArIG1fdyArIDE7CisgICAgciA9IGZpbHRlci0+bWFwMyArIG1fdyArIDE7CisgICAgZm9yICh5ID0gbV9oIC0gMjsgeSA+IDA7IHktLSkgeworICAgICAgZm9yICh4ID0gbV93IC0gMjsgeCA+IDA7IHgtLSkgeworICAgICAgICBoID0gKihwIC0gbV93IC0gMSkgKyAqKHAgLSBtX3cgKyAxKSArICoocCArIG1fdyAtIDEpICsgKihwICsgbV93ICsgMSkKKyAgICAgICAgICAgICsgKihwIC0gbV93KSArICoocCAtIDEpICsgKihwICsgMSkgKyAqKHAgKyBtX3cpIC0gKCpwKSAqIDk7CisgICAgICAgIGggPSBoID4+IDM7CisgICAgICAgIHYgPSAqcCAtICpxOworICAgICAgICB2ICs9IGggLSAodiA+PiBkZWNheSk7CisgICAgICAgICpyID0gdiArICpwOworICAgICAgICBwKys7CisgICAgICAgIHErKzsKKyAgICAgICAgcisrOworICAgICAgfQorICAgICAgcCArPSAyOworICAgICAgcSArPSAyOworICAgICAgciArPSAyOworICAgIH0KKworICAgIC8qIGxvdyBwYXNzIGZpbHRlciAqLworICAgIHAgPSBmaWx0ZXItPm1hcDMgKyBtX3cgKyAxOworICAgIHEgPSBmaWx0ZXItPm1hcDIgKyBtX3cgKyAxOworICAgIGZvciAoeSA9IG1faCAtIDI7IHkgPiAwOyB5LS0pIHsKKyAgICAgIGZvciAoeCA9IG1fdyAtIDI7IHggPiAwOyB4LS0pIHsKKyAgICAgICAgaCA9ICoocCAtIG1fdykgKyAqKHAgLSAxKSArICoocCArIDEpICsgKihwICsgbV93KSArICgqcCkgKiA2MDsKKyAgICAgICAgKnEgPSBoID4+IDY7CisgICAgICAgIHArKzsKKyAgICAgICAgcSsrOworICAgICAgfQorICAgICAgcCArPSAyOworICAgICAgcSArPSAyOworICAgIH0KKworICAgIHAgPSBmaWx0ZXItPm1hcDE7CisgICAgZmlsdGVyLT5tYXAxID0gZmlsdGVyLT5tYXAyOworICAgIGZpbHRlci0+bWFwMiA9IHA7CisgIH0KKworICB2cCA9IGZpbHRlci0+dnRhYmxlOworICBwID0gZmlsdGVyLT5tYXAxOworICBmb3IgKHkgPSBtX2ggLSAxOyB5ID4gMDsgeS0tKSB7CisgICAgZm9yICh4ID0gbV93IC0gMTsgeCA+IDA7IHgtLSkgeworICAgICAgLyogZGlmZmVyZW5jZSBvZiB0aGUgaGVpZ2h0IGJldHdlZW4gdHdvIHZveGVsLiBUaGV5IGFyZSB0d2ljZWQgdG8KKyAgICAgICAqIGVtcGhhc2lzZSB0aGUgd2F2ZS4gKi8KKyAgICAgIHZwWzBdID0gc3FydGFibGVbKChwWzBdIC0gcFsxXSkgPj4gKHBvaW50IC0gMSkpICYgMHhmZl07CisgICAgICB2cFsxXSA9IHNxcnRhYmxlWygocFswXSAtIHBbbV93XSkgPj4gKHBvaW50IC0gMSkpICYgMHhmZl07CisgICAgICBwKys7CisgICAgICB2cCArPSAyOworICAgIH0KKyAgICBwKys7CisgICAgdnAgKz0gMjsKKyAgfQorCisgIHZwID0gZmlsdGVyLT52dGFibGU7CisKKyAgLyogZHJhdyByZWZyYWN0ZWQgaW1hZ2UuIFRoZSB2ZWN0b3IgdGFibGUgaXMgc3RyZXRjaGVkLiAqLworICBmb3IgKHkgPSAwOyB5IDwgdl9oOyB5ICs9IDIpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgdl93OyB4ICs9IDIpIHsKKyAgICAgIGggPSAoZ2ludCkgdnBbMF07CisgICAgICB2ID0gKGdpbnQpIHZwWzFdOworICAgICAgZHggPSB4ICsgaDsKKyAgICAgIGR5ID0geSArIHY7CisgICAgICBkeCA9IENMQU1QIChkeCwgMCwgKHZfdyAtIDIpKTsKKyAgICAgIGR5ID0gQ0xBTVAgKGR5LCAwLCAodl9oIC0gMikpOworICAgICAgZGVzdFswXSA9IHNyY1tkeSAqIHZfdyArIGR4XTsKKworICAgICAgb19keCA9IGR4OworCisgICAgICBkeCA9IHggKyAxICsgKGggKyAoZ2ludCkgdnBbMl0pIC8gMjsKKyAgICAgIGR4ID0gQ0xBTVAgKGR4LCAwLCAodl93IC0gMikpOworICAgICAgZGVzdFsxXSA9IHNyY1tkeSAqIHZfdyArIGR4XTsKKworICAgICAgZHkgPSB5ICsgMSArICh2ICsgKGdpbnQpIHZwW21fdyAqIDIgKyAxXSkgLyAyOworICAgICAgZHkgPSBDTEFNUCAoZHksIDAsICh2X2ggLSAyKSk7CisgICAgICBkZXN0W3Zfd10gPSBzcmNbZHkgKiB2X3cgKyBvX2R4XTsKKworICAgICAgZGVzdFt2X3cgKyAxXSA9IHNyY1tkeSAqIHZfdyArIGR4XTsKKyAgICAgIGRlc3QgKz0gMjsKKyAgICAgIHZwICs9IDI7CisgICAgfQorICAgIGRlc3QgKz0gdl93OworICAgIHZwICs9IDI7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGZpbHRlcik7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9yaXBwbGV0dl9zZXRfaW5mbyAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RDYXBzICogaW5jYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0UmlwcGxlVFYgKmZpbHRlciA9IEdTVF9SSVBQTEVUViAodmZpbHRlcik7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKworICB3aWR0aCA9IEdTVF9WSURFT19JTkZPX1dJRFRIIChpbl9pbmZvKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbl9pbmZvKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGZpbHRlcik7CisgIGZpbHRlci0+bWFwX2ggPSBoZWlnaHQgLyAyICsgMTsKKyAgZmlsdGVyLT5tYXBfdyA9IHdpZHRoIC8gMiArIDE7CisKKyAgLyogd2Ugb3ZlciBhbGxvY2F0ZSB0aGUgYnVmZmVycywgYXMgdGhlIHJlbmRlciBjb2RlIGRvZXMgbm90IGhhbmRsZSBjbGlwcGluZworICAgKiB2ZXJ5IHdlbGwgKi8KKyAgZ19mcmVlIChmaWx0ZXItPm1hcCk7CisgIGZpbHRlci0+bWFwID0gZ19uZXcwIChnaW50LCAoMSArIGZpbHRlci0+bWFwX2gpICogZmlsdGVyLT5tYXBfdyAqIDMpOworCisgIGZpbHRlci0+bWFwMSA9IGZpbHRlci0+bWFwOworICBmaWx0ZXItPm1hcDIgPSBmaWx0ZXItPm1hcCArIGZpbHRlci0+bWFwX3cgKiBmaWx0ZXItPm1hcF9oOworICBmaWx0ZXItPm1hcDMgPSBmaWx0ZXItPm1hcCArIGZpbHRlci0+bWFwX3cgKiBmaWx0ZXItPm1hcF9oICogMjsKKworICBnX2ZyZWUgKGZpbHRlci0+dnRhYmxlKTsKKyAgZmlsdGVyLT52dGFibGUgPSBnX25ldzAgKGdpbnQ4LCAoMSArIGZpbHRlci0+bWFwX2gpICogZmlsdGVyLT5tYXBfdyAqIDIpOworCisgIGdfZnJlZSAoZmlsdGVyLT5iYWNrZ3JvdW5kKTsKKyAgZmlsdGVyLT5iYWNrZ3JvdW5kID0gZ19uZXcwIChnaW50MTYsIHdpZHRoICogKGhlaWdodCArIDEpKTsKKworICBnX2ZyZWUgKGZpbHRlci0+ZGlmZik7CisgIGZpbHRlci0+ZGlmZiA9IGdfbmV3MCAoZ3VpbnQ4LCB3aWR0aCAqIChoZWlnaHQgKyAxKSk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9yaXBwbGV0dl9zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICBHc3RSaXBwbGVUViAqZmlsdGVyID0gR1NUX1JJUFBMRVRWICh0cmFucyk7CisKKyAgZmlsdGVyLT5iZ19pc19zZXQgPSBGQUxTRTsKKworICBmaWx0ZXItPnBlcmlvZCA9IDA7CisgIGZpbHRlci0+cmFpbl9zdGF0ID0gMDsKKyAgZmlsdGVyLT5kcm9wX3Byb2IgPSAwOworICBmaWx0ZXItPmRyb3BfcHJvYl9pbmNyZW1lbnQgPSAwOworICBmaWx0ZXItPmRyb3BzX3Blcl9mcmFtZV9tYXggPSAwOworICBmaWx0ZXItPmRyb3BzX3Blcl9mcmFtZSA9IDA7CisgIGZpbHRlci0+ZHJvcF9wb3dlciA9IDA7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcmlwcGxldHZfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJpcHBsZVRWICpmaWx0ZXIgPSBHU1RfUklQUExFVFYgKG9iamVjdCk7CisKKyAgZ19mcmVlIChmaWx0ZXItPm1hcCk7CisgIGZpbHRlci0+bWFwID0gTlVMTDsKKworICBnX2ZyZWUgKGZpbHRlci0+dnRhYmxlKTsKKyAgZmlsdGVyLT52dGFibGUgPSBOVUxMOworCisgIGdfZnJlZSAoZmlsdGVyLT5iYWNrZ3JvdW5kKTsKKyAgZmlsdGVyLT5iYWNrZ3JvdW5kID0gTlVMTDsKKworICBnX2ZyZWUgKGZpbHRlci0+ZGlmZik7CisgIGZpbHRlci0+ZGlmZiA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JpcHBsZXR2X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSaXBwbGVUViAqZmlsdGVyID0gR1NUX1JJUFBMRVRWIChvYmplY3QpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZmlsdGVyKTsKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1JFU0VUOnsKKyAgICAgIG1lbXNldCAoZmlsdGVyLT5tYXAsIDAsCisgICAgICAgICAgZmlsdGVyLT5tYXBfaCAqIGZpbHRlci0+bWFwX3cgKiAyICogc2l6ZW9mIChnaW50KSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX01PREU6CisgICAgICBmaWx0ZXItPm1vZGUgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JpcHBsZXR2X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSaXBwbGVUViAqZmlsdGVyID0gR1NUX1JJUFBMRVRWIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGZpbHRlci0+bW9kZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcmlwcGxldHZfY2xhc3NfaW5pdCAoR3N0UmlwcGxlVFZDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKnRyYW5zX2NsYXNzID0gKEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqKSBrbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzcyA9IChHc3RWaWRlb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9yaXBwbGV0dl9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9yaXBwbGV0dl9nZXRfcHJvcGVydHk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcmlwcGxldHZfZmluYWxpemU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SRVNFVCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgicmVzZXQiLCAiUmVzZXQiLAorICAgICAgICAgICJSZXNldCBhbGwgY3VycmVudCByaXBwbGVzIiwgRkFMU0UsCisgICAgICAgICAgR19QQVJBTV9XUklUQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJtb2RlIiwgIk1vZGUiLAorICAgICAgICAgICJNb2RlIiwgR1NUX1RZUEVfUklQUExFVFZfTU9ERSwgREVGQVVMVF9NT0RFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUmlwcGxlVFYgZWZmZWN0IiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1ZpZGVvIiwKKyAgICAgICJSaXBwbGVUViBkb2VzIHJpcHBsZSBtYXJrIGVmZmVjdCBvbiB0aGUgdmlkZW8gaW5wdXQiLAorICAgICAgIkZVS1VDSEksIEtlbnRhcm91IDxmdWt1Y2hpQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4sICIKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcmlwcGxldHZfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9yaXBwbGV0dl9zcmNfdGVtcGxhdGUpOworCisgIHRyYW5zX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcmlwcGxldHZfc3RhcnQpOworCisgIHZmaWx0ZXJfY2xhc3MtPnNldF9pbmZvID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9yaXBwbGV0dl9zZXRfaW5mbyk7CisgIHZmaWx0ZXJfY2xhc3MtPnRyYW5zZm9ybV9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3JpcHBsZXR2X3RyYW5zZm9ybV9mcmFtZSk7CisKKyAgc2V0VGFibGUgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcmlwcGxldHZfaW5pdCAoR3N0UmlwcGxlVFYgKiBmaWx0ZXIpCit7CisgIGZpbHRlci0+bW9kZSA9IERFRkFVTFRfTU9ERTsKKworICAvKiBGSVhNRTogcmVtb3ZlIHRoaXMgd2hlbiBtZW1vcnkgY29ycnVwdGlvbiBhZnRlciByZXNpemVzIGFyZSBmaXhlZCAqLworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChHU1RfQkFTRV9UUkFOU0ZPUk1fU1JDX1BBRCAoZmlsdGVyKSk7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKEdTVF9CQVNFX1RSQU5TRk9STV9TSU5LX1BBRCAoZmlsdGVyKSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvZWZmZWN0di9nc3RyaXBwbGUuaCBiL2dzdC9lZmZlY3R2L2dzdHJpcHBsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyOWU1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZWZmZWN0di9nc3RyaXBwbGUuaApAQCAtMCwwICsxLDg2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIEVmZmVjVFYgLSBSZWFsdGltZSBEaWdpdGFsIFZpZGVvIEVmZmVjdG9yCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBGVUtVQ0hJIEtlbnRhcm8KKyAqCisgKiBSaXBwbGVUViAtIFdhdGVyIHJpcHBsZSBlZmZlY3QuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBGVUtVQ0hJIEtlbnRhcm8KKyAqCisgKiBFZmZlY1RWIGlzIGZyZWUgc29mdHdhcmUuIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JJUFBMRV9IX18KKyNkZWZpbmUgX19HU1RfUklQUExFX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SSVBQTEVUViBcCisgIChnc3RfcmlwcGxldHZfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JJUFBMRVRWKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUklQUExFVFYsR3N0UmlwcGxlVFYpKQorI2RlZmluZSBHU1RfUklQUExFVFZfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUklQUExFVFYsR3N0UmlwcGxlVFZDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SSVBQTEVUVihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JJUFBMRVRWKSkKKyNkZWZpbmUgR1NUX0lTX1JJUFBMRVRWX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JJUFBMRVRWKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJpcHBsZVRWIEdzdFJpcHBsZVRWOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJpcHBsZVRWQ2xhc3MgR3N0UmlwcGxlVFZDbGFzczsKKworc3RydWN0IF9Hc3RSaXBwbGVUVgoreworICBHc3RWaWRlb0ZpbHRlciBlbGVtZW50OworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIGdpbnQgbW9kZTsKKworICBnaW50MTYgKmJhY2tncm91bmQ7CisgIGd1aW50OCAqZGlmZjsKKworICBnaW50ICptYXAsICptYXAxLCAqbWFwMiwgKm1hcDM7CisgIGdpbnQgbWFwX2gsIG1hcF93OworCisgIGdpbnQ4ICp2dGFibGU7CisKKyAgZ2Jvb2xlYW4gYmdfaXNfc2V0OworCisgIGdpbnQgcGVyaW9kOworICBnaW50IHJhaW5fc3RhdDsKKyAgZ3VpbnQgZHJvcF9wcm9iOworICBnaW50IGRyb3BfcHJvYl9pbmNyZW1lbnQ7CisgIGdpbnQgZHJvcHNfcGVyX2ZyYW1lX21heDsKKyAgZ2ludCBkcm9wc19wZXJfZnJhbWU7CisgIGdpbnQgZHJvcF9wb3dlcjsKK307CisKK3N0cnVjdCBfR3N0UmlwcGxlVFZDbGFzcworeworICBHc3RWaWRlb0ZpbHRlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9yaXBwbGV0dl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SSVBQTEVfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmMgYi9nc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxYTE1MQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYwpAQCAtMCwwICsxLDI1NiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIEVmZmVjVFY6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgRlVLVUNISSBLZW50YXJvdQorICoKKyAqIEluc3BpcmVkIGJ5IEFkcmlhbiBMaWtpbidzIHNjcmlwdCBmb3IgdGhlIEdJTVAuCisgKiBFZmZlY1RWIGlzIGZyZWUgc29mdHdhcmUuICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXNoYWdhZGVsaWN0dgorICoKKyAqIE9oIGJlaGF2ZSwgU2hhZ2VkZWxpY1RWIG1ha2VzIGltYWdlcyBzaGFnYWRlbGljIQorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiB2aWRlb3Rlc3RzcmMgISBzaGFnYWRlbGljdHYgISB2aWRlb2NvbnZlcnQgISBhdXRvdmlkZW9zaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIHNob3dzIHRoZSBlZmZlY3Qgb2Ygc2hhZ2FkZWxpY3R2IG9uIGEgdGVzdCBzdHJlYW0uCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdHNoYWdhZGVsaWMuaCIKKyNpbmNsdWRlICJnc3RlZmZlY3R2LmgiCisKKyNpZm5kZWYgTV9QSQorI2RlZmluZSBNX1BJICAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CisjZW5kaWYKKworI2RlZmluZSBnc3Rfc2hhZ2FkZWxpY3R2X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFNoYWdhZGVsaWNUViwgZ3N0X3NoYWdhZGVsaWN0diwgR1NUX1RZUEVfVklERU9fRklMVEVSKTsKKworc3RhdGljIHZvaWQgZ3N0X3NoYWdhZGVsaWNfaW5pdGlhbGl6ZSAoR3N0U2hhZ2FkZWxpY1RWICogZmlsdGVyLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8pOworCisjaWYgR19CWVRFX09SREVSID09IEdfTElUVExFX0VORElBTgorI2RlZmluZSBDQVBTX1NUUiBHU1RfVklERU9fQ0FQU19NQUtFICgiQkdSeCIpCisjZWxzZQorI2RlZmluZSBDQVBTX1NUUiBHU1RfVklERU9fQ0FQU19NQUtFICgieFJHQiIpCisjZW5kaWYKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9zaGFnYWRlbGljdHZfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKENBUFNfU1RSKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3Rfc2hhZ2FkZWxpY3R2X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChDQVBTX1NUUikKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zaGFnYWRlbGljdHZfc2V0X2luZm8gKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwgR3N0Q2FwcyAqIGluY2FwcywKKyAgICBHc3RWaWRlb0luZm8gKiBpbl9pbmZvLCBHc3RDYXBzICogb3V0Y2FwcywgR3N0VmlkZW9JbmZvICogb3V0X2luZm8pCit7CisgIEdzdFNoYWdhZGVsaWNUViAqZmlsdGVyID0gR1NUX1NIQUdBREVMSUNUViAodmZpbHRlcik7CisgIGdpbnQgd2lkdGgsIGhlaWdodCwgYXJlYTsKKworICB3aWR0aCA9IEdTVF9WSURFT19JTkZPX1dJRFRIIChpbl9pbmZvKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbl9pbmZvKTsKKworICBhcmVhID0gd2lkdGggKiBoZWlnaHQ7CisKKyAgZ19mcmVlIChmaWx0ZXItPnJpcHBsZSk7CisgIGdfZnJlZSAoZmlsdGVyLT5zcGlyYWwpOworICBmaWx0ZXItPnJpcHBsZSA9IChndWludDggKikgZ19tYWxsb2MgKGFyZWEgKiA0KTsKKyAgZmlsdGVyLT5zcGlyYWwgPSAoZ3VpbnQ4ICopIGdfbWFsbG9jIChhcmVhKTsKKworICBnc3Rfc2hhZ2FkZWxpY19pbml0aWFsaXplIChmaWx0ZXIsIGluX2luZm8pOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NoYWdhZGVsaWNfaW5pdGlhbGl6ZSAoR3N0U2hhZ2FkZWxpY1RWICogZmlsdGVyLCBHc3RWaWRlb0luZm8gKiBpbmZvKQoreworICBpbnQgaSwgeCwgeTsKKyNpZmRlZiBQUzIKKyAgZmxvYXQgeHgsIHl5OworI2Vsc2UKKyAgZG91YmxlIHh4LCB5eTsKKyNlbmRpZgorICBnaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgd2lkdGggPSBHU1RfVklERU9fSU5GT19XSURUSCAoaW5mbyk7CisgIGhlaWdodCA9IEdTVF9WSURFT19JTkZPX0hFSUdIVCAoaW5mbyk7CisKKyAgaSA9IDA7CisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQgKiAyOyB5KyspIHsKKyAgICB5eSA9IHkgLSBoZWlnaHQ7CisgICAgeXkgKj0geXk7CisKKyAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGggKiAyOyB4KyspIHsKKyAgICAgIHh4ID0geCAtIHdpZHRoOworI2lmZGVmIFBTMgorICAgICAgZmlsdGVyLT5yaXBwbGVbaSsrXSA9ICgodW5zaWduZWQgaW50KSAoc3FydGYgKHh4ICogeHggKyB5eSkgKiA4KSkgJiAyNTU7CisjZWxzZQorICAgICAgZmlsdGVyLT5yaXBwbGVbaSsrXSA9ICgodW5zaWduZWQgaW50KSAoc3FydCAoeHggKiB4eCArIHl5KSAqIDgpKSAmIDI1NTsKKyNlbmRpZgorICAgIH0KKyAgfQorCisgIGkgPSAwOworICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICB5eSA9IHkgLSBoZWlnaHQgLyAyOworCisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgIHh4ID0geCAtIHdpZHRoIC8gMjsKKyNpZmRlZiBQUzIKKyAgICAgIGZpbHRlci0+c3BpcmFsW2krK10gPSAoKHVuc2lnbmVkIGludCkKKyAgICAgICAgICAoKGF0YW4yZiAoeHgsCisgICAgICAgICAgICAgICAgICAgICAgeXkpIC8gKChmbG9hdCkgTV9QSSkgKiAyNTYgKiA5KSArIChzcXJ0ZiAoeHggKiB4eCArCisgICAgICAgICAgICAgICAgICAgICAgeXkgKiB5eSkgKiA1KSkpICYgMjU1OworI2Vsc2UKKyAgICAgIGZpbHRlci0+c3BpcmFsW2krK10gPSAoKHVuc2lnbmVkIGludCkKKyAgICAgICAgICAoKGF0YW4yICh4eCwgeXkpIC8gTV9QSSAqIDI1NiAqIDkpICsgKHNxcnQgKHh4ICogeHggKworICAgICAgICAgICAgICAgICAgICAgIHl5ICogeXkpICogNSkpKSAmIDI1NTsKKyNlbmRpZgorLyogSGVyZSBpcyBhbm90aGVyIFN3aW5nZXIhCisgKiAoKGF0YW4yKHh4LCB5eSkvTV9QSSoyNTYpICsgKHNxcnQoeHgqeHgreXkqeXkpKjEwKSkmMjU1OworICovCisgICAgfQorICB9CisgIGZpbHRlci0+cnggPSBmYXN0cmFuZCAoKSAlIHdpZHRoOworICBmaWx0ZXItPnJ5ID0gZmFzdHJhbmQgKCkgJSBoZWlnaHQ7CisgIGZpbHRlci0+YnggPSBmYXN0cmFuZCAoKSAlIHdpZHRoOworICBmaWx0ZXItPmJ5ID0gZmFzdHJhbmQgKCkgJSBoZWlnaHQ7CisgIGZpbHRlci0+cnZ4ID0gLTI7CisgIGZpbHRlci0+cnZ5ID0gLTI7CisgIGZpbHRlci0+YnZ4ID0gMjsKKyAgZmlsdGVyLT5idnkgPSAyOworICBmaWx0ZXItPnBoYXNlID0gMDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9zaGFnYWRlbGljdHZfdHJhbnNmb3JtX2ZyYW1lIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsCisgICAgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLCBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lKQoreworICBHc3RTaGFnYWRlbGljVFYgKmZpbHRlciA9IEdTVF9TSEFHQURFTElDVFYgKHZmaWx0ZXIpOworICBndWludDMyICpzcmMsICpkZXN0OworICBnaW50IHgsIHk7CisgIGd1aW50MzIgdjsKKyAgZ3VpbnQ4IHIsIGcsIGI7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworCisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICB2ID0gKnNyYysrIHwgMHgxMDEwMTAwOworICAgICAgdiA9ICh2IC0gMHg3MDcwNjApICYgMHgxMDEwMTAwOworICAgICAgdiAtPSB2ID4+IDg7CisvKiBUcnkgYW5vdGhlciBCYWJlISAKKyAqIHYgPSAqc3JjKys7CisgKiAqZGVzdCsrID0gdiAmICgocjw8MTYpfChnPDw4KXxiKTsKKyAqLworICAgICAgciA9ICgoZ2ludDgpIChmaWx0ZXItPnJpcHBsZVsoZmlsdGVyLT5yeSArIHkpICogd2lkdGggKiAyICsgZmlsdGVyLT5yeCArCisgICAgICAgICAgICAgICAgICB4XSArIGZpbHRlci0+cGhhc2UgKiAyKSkgPj4gNzsKKyAgICAgIGcgPSAoKGdpbnQ4KSAoZmlsdGVyLT5zcGlyYWxbeSAqIHdpZHRoICsgeF0gKyBmaWx0ZXItPnBoYXNlICogMykpID4+IDc7CisgICAgICBiID0gKChnaW50OCkgKGZpbHRlci0+cmlwcGxlWyhmaWx0ZXItPmJ5ICsgeSkgKiB3aWR0aCAqIDIgKyBmaWx0ZXItPmJ4ICsKKyAgICAgICAgICAgICAgICAgIHhdIC0gZmlsdGVyLT5waGFzZSkpID4+IDc7CisgICAgICAqZGVzdCsrID0gdiAmICgociA8PCAxNikgfCAoZyA8PCA4KSB8IGIpOworICAgIH0KKyAgfQorCisgIGZpbHRlci0+cGhhc2UgLT0gODsKKyAgaWYgKChmaWx0ZXItPnJ4ICsgZmlsdGVyLT5ydngpIDwgMCB8fCAoZmlsdGVyLT5yeCArIGZpbHRlci0+cnZ4KSA+PSB3aWR0aCkKKyAgICBmaWx0ZXItPnJ2eCA9IC1maWx0ZXItPnJ2eDsKKyAgaWYgKChmaWx0ZXItPnJ5ICsgZmlsdGVyLT5ydnkpIDwgMCB8fCAoZmlsdGVyLT5yeSArIGZpbHRlci0+cnZ5KSA+PSBoZWlnaHQpCisgICAgZmlsdGVyLT5ydnkgPSAtZmlsdGVyLT5ydnk7CisgIGlmICgoZmlsdGVyLT5ieCArIGZpbHRlci0+YnZ4KSA8IDAgfHwgKGZpbHRlci0+YnggKyBmaWx0ZXItPmJ2eCkgPj0gd2lkdGgpCisgICAgZmlsdGVyLT5idnggPSAtZmlsdGVyLT5idng7CisgIGlmICgoZmlsdGVyLT5ieSArIGZpbHRlci0+YnZ5KSA8IDAgfHwgKGZpbHRlci0+YnkgKyBmaWx0ZXItPmJ2eSkgPj0gaGVpZ2h0KQorICAgIGZpbHRlci0+YnZ5ID0gLWZpbHRlci0+YnZ5OworICBmaWx0ZXItPnJ4ICs9IGZpbHRlci0+cnZ4OworICBmaWx0ZXItPnJ5ICs9IGZpbHRlci0+cnZ5OworICBmaWx0ZXItPmJ4ICs9IGZpbHRlci0+YnZ4OworICBmaWx0ZXItPmJ5ICs9IGZpbHRlci0+YnZ5OworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zaGFnYWRlbGljdHZfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFNoYWdhZGVsaWNUViAqZmlsdGVyID0gR1NUX1NIQUdBREVMSUNUViAob2JqZWN0KTsKKworICBnX2ZyZWUgKGZpbHRlci0+cmlwcGxlKTsKKyAgZmlsdGVyLT5yaXBwbGUgPSBOVUxMOworCisgIGdfZnJlZSAoZmlsdGVyLT5zcGlyYWwpOworICBmaWx0ZXItPnNwaXJhbCA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NoYWdhZGVsaWN0dl9jbGFzc19pbml0IChHc3RTaGFnYWRlbGljVFZDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RWaWRlb0ZpbHRlckNsYXNzICp2ZmlsdGVyX2NsYXNzID0gKEdzdFZpZGVvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3Rfc2hhZ2FkZWxpY3R2X2ZpbmFsaXplOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJTaGFnYWRlbGljVFYiLAorICAgICAgIkZpbHRlci9FZmZlY3QvVmlkZW8iLAorICAgICAgIk9oIGJlaGF2ZSwgU2hhZ2VkZWxpY1RWIG1ha2VzIGltYWdlcyBzaGFnYWRlbGljISIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNoZWxsby5iZT4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfc2hhZ2FkZWxpY3R2X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfc2hhZ2FkZWxpY3R2X3NyY190ZW1wbGF0ZSk7CisKKyAgdmZpbHRlcl9jbGFzcy0+c2V0X2luZm8gPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NoYWdhZGVsaWN0dl9zZXRfaW5mbyk7CisgIHZmaWx0ZXJfY2xhc3MtPnRyYW5zZm9ybV9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NoYWdhZGVsaWN0dl90cmFuc2Zvcm1fZnJhbWUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NoYWdhZGVsaWN0dl9pbml0IChHc3RTaGFnYWRlbGljVFYgKiBmaWx0ZXIpCit7CisgIGZpbHRlci0+cmlwcGxlID0gTlVMTDsKKyAgZmlsdGVyLT5zcGlyYWwgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5oIGIvZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4OWNiZjQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmgKQEAgLTAsMCArMSw3MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIEVmZmVjVFY6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgRlVLVUNISSBLZW50YXJvdQorICoKKyAqIEluc3BpcmVkIGJ5IEFkcmlhbiBMaWtpbidzIHNjcmlwdCBmb3IgdGhlIEdJTVAuCisgKiBFZmZlY1RWIGlzIGZyZWUgc29mdHdhcmUuICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfU0hBR0FERUxJQ19IX18KKyNkZWZpbmUgX19HU1RfU0hBR0FERUxJQ19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2ZpbHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfU0hBR0FERUxJQ1RWIFwKKyAgKGdzdF9zaGFnYWRlbGljdHZfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1NIQUdBREVMSUNUVihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1NIQUdBREVMSUNUVixHc3RTaGFnYWRlbGljVFYpKQorI2RlZmluZSBHU1RfU0hBR0FERUxJQ1RWX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1NIQUdBREVMSUNUVixHc3RTaGFnYWRlbGljVFZDbGFzcykpCisjZGVmaW5lIEdTVF9JU19TSEFHQURFTElDVFYob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9TSEFHQURFTElDVFYpKQorI2RlZmluZSBHU1RfSVNfU0hBR0FERUxJQ1RWX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1NIQUdBREVMSUNUVikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RTaGFnYWRlbGljVFYgR3N0U2hhZ2FkZWxpY1RWOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFNoYWdhZGVsaWNUVkNsYXNzIEdzdFNoYWdhZGVsaWNUVkNsYXNzOworCitzdHJ1Y3QgX0dzdFNoYWdhZGVsaWNUVgoreworICBHc3RWaWRlb0ZpbHRlciB2aWRlb2ZpbHRlcjsKKworICAvKiA8IHByaXZhdGUgPiAqLworICBndWludDggKnJpcHBsZTsKKyAgZ3VpbnQ4ICpzcGlyYWw7CisgIGd1aW50OCBwaGFzZTsKKyAgZ2ludCByeCwgcnk7CisgIGdpbnQgYngsIGJ5OworICBnaW50IHJ2eCwgcnZ5OworICBnaW50IGJ2eCwgYnZ5OworfTsKKworc3RydWN0IF9Hc3RTaGFnYWRlbGljVFZDbGFzcworeworICBHc3RWaWRlb0ZpbHRlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9zaGFnYWRlbGljdHZfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfU0hBR0FERUxJQ19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9lZmZlY3R2L2dzdHN0cmVhay5jIGIvZ3N0L2VmZmVjdHYvZ3N0c3RyZWFrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlZDE1MAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L2dzdHN0cmVhay5jCkBAIC0wLDAgKzEsMjY1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIEVmZmVjVFYgLSBSZWFsdGltZSBEaWdpdGFsIFZpZGVvIEVmZmVjdG9yCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBGVUtVQ0hJIEtlbnRhcm8KKyAqCisgKiBTdHJlYWtUViAtIGFmdGVyaW1hZ2UgZWZmZWN0b3IuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBGVUtVQ0hJIEtlbnRhcm8KKyAqCisgKiBUaGlzIGNvbWJpbmVzIHRoZSBTdHJlYWtUViBhbmQgQmFsdGFuVFYgZWZmZWN0cywgd2hpY2ggYXJlCisgKiB2ZXJ5IHNpbWlsYXIuIEJhbHRhblRWIGlzIHVzZWQgaWYgdGhlIGZlZWRiYWNrIHByb3BlcnR5IGlzIHNldAorICogdG8gVFJVRSwgb3RoZXJ3aXNlIFN0cmVha1RWIGlzIHVzZWQuCisgKgorICogRWZmZWNUViBpcyBmcmVlIHNvZnR3YXJlLiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtc3RyZWFrdHYKKyAqCisgKiBTdHJlYWtUViBtYWtlcyBhZnRlciBpbWFnZXMgb2YgbW92aW5nIG9iamVjdHMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyAhIHN0cmVha3R2ICEgdmlkZW9jb252ZXJ0ICEgYXV0b3ZpZGVvc2luaworICogXXwgVGhpcyBwaXBlbGluZSBzaG93cyB0aGUgZWZmZWN0IG9mIHN0cmVha3R2IG9uIGEgdGVzdCBzdHJlYW0uCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdHN0cmVhay5oIgorI2luY2x1ZGUgImdzdGVmZmVjdHYuaCIKKworI2RlZmluZSBERUZBVUxUX0ZFRURCQUNLIEZBTFNFCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0ZFRURCQUNLCit9OworCisjZGVmaW5lIGdzdF9zdHJlYWt0dl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RTdHJlYWtUViwgZ3N0X3N0cmVha3R2LCBHU1RfVFlQRV9WSURFT19GSUxURVIpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3N0cmVha3R2X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBCR1J4LCBSR0J4LCB4QkdSLCB4UkdCIH0iKSkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3N0cmVha3R2X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBCR1J4LCBSR0J4LCB4QkdSLCB4UkdCIH0iKSkKKyAgICApOworCisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfc3RyZWFrdHZfdHJhbnNmb3JtX2ZyYW1lIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsCisgICAgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLCBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lKQoreworICBHc3RTdHJlYWtUViAqZmlsdGVyID0gR1NUX1NUUkVBS1RWICh2ZmlsdGVyKTsKKyAgZ3VpbnQzMiAqc3JjLCAqZGVzdDsKKyAgZ2ludCBpLCBjZjsKKyAgZ2ludCB2aWRlb19hcmVhLCB3aWR0aCwgaGVpZ2h0OworICBndWludDMyICoqcGxhbmV0YWJsZSA9IGZpbHRlci0+cGxhbmV0YWJsZTsKKyAgZ2ludCBwbGFuZSA9IGZpbHRlci0+cGxhbmU7CisgIGd1aW50IHN0cmlkZV9tYXNrLCBzdHJpZGVfc2hpZnQsIHN0cmlkZTsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworCisgIHZpZGVvX2FyZWEgPSB3aWR0aCAqIGhlaWdodDsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGZpbHRlcik7CisgIGlmIChmaWx0ZXItPmZlZWRiYWNrKSB7CisgICAgc3RyaWRlX21hc2sgPSAweGZjZmNmY2ZjOworICAgIHN0cmlkZSA9IDg7CisgICAgc3RyaWRlX3NoaWZ0ID0gMjsKKyAgfSBlbHNlIHsKKyAgICBzdHJpZGVfbWFzayA9IDB4ZjhmOGY4Zjg7CisgICAgc3RyaWRlID0gNDsKKyAgICBzdHJpZGVfc2hpZnQgPSAzOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHZpZGVvX2FyZWE7IGkrKykgeworICAgIHBsYW5ldGFibGVbcGxhbmVdW2ldID0gKHNyY1tpXSAmIHN0cmlkZV9tYXNrKSA+PiBzdHJpZGVfc2hpZnQ7CisgIH0KKworICBjZiA9IHBsYW5lICYgKHN0cmlkZSAtIDEpOworICBpZiAoZmlsdGVyLT5mZWVkYmFjaykgeworICAgIGZvciAoaSA9IDA7IGkgPCB2aWRlb19hcmVhOyBpKyspIHsKKyAgICAgIGRlc3RbaV0gPSBwbGFuZXRhYmxlW2NmXVtpXQorICAgICAgICAgICsgcGxhbmV0YWJsZVtjZiArIHN0cmlkZV1baV0KKyAgICAgICAgICArIHBsYW5ldGFibGVbY2YgKyBzdHJpZGUgKiAyXVtpXQorICAgICAgICAgICsgcGxhbmV0YWJsZVtjZiArIHN0cmlkZSAqIDNdW2ldOworICAgICAgcGxhbmV0YWJsZVtwbGFuZV1baV0gPSAoZGVzdFtpXSAmIHN0cmlkZV9tYXNrKSA+PiBzdHJpZGVfc2hpZnQ7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCB2aWRlb19hcmVhOyBpKyspIHsKKyAgICAgIGRlc3RbaV0gPSBwbGFuZXRhYmxlW2NmXVtpXQorICAgICAgICAgICsgcGxhbmV0YWJsZVtjZiArIHN0cmlkZV1baV0KKyAgICAgICAgICArIHBsYW5ldGFibGVbY2YgKyBzdHJpZGUgKiAyXVtpXQorICAgICAgICAgICsgcGxhbmV0YWJsZVtjZiArIHN0cmlkZSAqIDNdW2ldCisgICAgICAgICAgKyBwbGFuZXRhYmxlW2NmICsgc3RyaWRlICogNF1baV0KKyAgICAgICAgICArIHBsYW5ldGFibGVbY2YgKyBzdHJpZGUgKiA1XVtpXQorICAgICAgICAgICsgcGxhbmV0YWJsZVtjZiArIHN0cmlkZSAqIDZdW2ldCisgICAgICAgICAgKyBwbGFuZXRhYmxlW2NmICsgc3RyaWRlICogN11baV07CisgICAgfQorICB9CisKKyAgcGxhbmUrKzsKKyAgZmlsdGVyLT5wbGFuZSA9IHBsYW5lICYgKFBMQU5FUyAtIDEpOworICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3N0cmVha3R2X3NldF9pbmZvIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsIEdzdENhcHMgKiBpbmNhcHMsCisgICAgR3N0VmlkZW9JbmZvICogaW5faW5mbywgR3N0Q2FwcyAqIG91dGNhcHMsIEdzdFZpZGVvSW5mbyAqIG91dF9pbmZvKQoreworICBHc3RTdHJlYWtUViAqZmlsdGVyID0gR1NUX1NUUkVBS1RWICh2ZmlsdGVyKTsKKyAgZ2ludCBpLCB3aWR0aCwgaGVpZ2h0OworCisgIHdpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKGluX2luZm8pOworICBoZWlnaHQgPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKGluX2luZm8pOworCisgIGdfZnJlZSAoZmlsdGVyLT5wbGFuZWJ1ZmZlcik7CisKKyAgZmlsdGVyLT5wbGFuZWJ1ZmZlciA9IGdfbmV3MCAoZ3VpbnQzMiwgd2lkdGggKiBoZWlnaHQgKiA0ICogUExBTkVTKTsKKworICBmb3IgKGkgPSAwOyBpIDwgUExBTkVTOyBpKyspCisgICAgZmlsdGVyLT5wbGFuZXRhYmxlW2ldID0gJmZpbHRlci0+cGxhbmVidWZmZXJbd2lkdGggKiBoZWlnaHQgKiBpXTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3RyZWFrdHZfc3RhcnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucykKK3sKKyAgR3N0U3RyZWFrVFYgKmZpbHRlciA9IEdTVF9TVFJFQUtUViAodHJhbnMpOworCisgIGZpbHRlci0+cGxhbmUgPSAwOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3N0cmVha3R2X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RTdHJlYWtUViAqZmlsdGVyID0gR1NUX1NUUkVBS1RWIChvYmplY3QpOworCisgIGlmIChmaWx0ZXItPnBsYW5lYnVmZmVyKSB7CisgICAgZ19mcmVlIChmaWx0ZXItPnBsYW5lYnVmZmVyKTsKKyAgICBmaWx0ZXItPnBsYW5lYnVmZmVyID0gTlVMTDsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zdHJlYWt0dl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0U3RyZWFrVFYgKmZpbHRlciA9IEdTVF9TVFJFQUtUViAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfRkVFREJBQ0s6CisgICAgICBpZiAoR19VTkxJS0VMWSAoR1NUX1NUQVRFIChmaWx0ZXIpID49IEdTVF9TVEFURV9QQVVTRUQpKSB7CisgICAgICAgIGdfd2FybmluZyAoIkNoYW5naW5nIHRoZSBcImZlZWRiYWNrXCIgcHJvcGVydHkgb25seSBhbGxvd2VkICIKKyAgICAgICAgICAgICJpbiBzdGF0ZSA8IFBMQVlJTkciKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBmaWx0ZXItPmZlZWRiYWNrID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3N0cmVha3R2X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTdHJlYWtUViAqZmlsdGVyID0gR1NUX1NUUkVBS1RWIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9GRUVEQkFDSzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBmaWx0ZXItPmZlZWRiYWNrKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9zdHJlYWt0dl9jbGFzc19pbml0IChHc3RTdHJlYWtUVkNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqdHJhbnNfY2xhc3MgPSAoR3N0QmFzZVRyYW5zZm9ybUNsYXNzICopIGtsYXNzOworICBHc3RWaWRlb0ZpbHRlckNsYXNzICp2ZmlsdGVyX2NsYXNzID0gKEdzdFZpZGVvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3N0cmVha3R2X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3N0cmVha3R2X2dldF9wcm9wZXJ0eTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9zdHJlYWt0dl9maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0ZFRURCQUNLLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJmZWVkYmFjayIsICJGZWVkYmFjayIsCisgICAgICAgICAgIkZlZWRiYWNrIiwgREVGQVVMVF9GRUVEQkFDSywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiU3RyZWFrVFYgZWZmZWN0IiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1ZpZGVvIiwKKyAgICAgICJTdHJlYWtUViBtYWtlcyBhZnRlciBpbWFnZXMgb2YgbW92aW5nIG9iamVjdHMiLAorICAgICAgIkZVS1VDSEksIEtlbnRhcm91IDxmdWt1Y2hpQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4sICIKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfc3RyZWFrdHZfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9zdHJlYWt0dl9zcmNfdGVtcGxhdGUpOworCisgIHRyYW5zX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3RyZWFrdHZfc3RhcnQpOworCisgIHZmaWx0ZXJfY2xhc3MtPnNldF9pbmZvID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zdHJlYWt0dl9zZXRfaW5mbyk7CisgIHZmaWx0ZXJfY2xhc3MtPnRyYW5zZm9ybV9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3N0cmVha3R2X3RyYW5zZm9ybV9mcmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3RyZWFrdHZfaW5pdCAoR3N0U3RyZWFrVFYgKiBmaWx0ZXIpCit7CisgIGZpbHRlci0+ZmVlZGJhY2sgPSBERUZBVUxUX0ZFRURCQUNLOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0c3RyZWFrLmggYi9nc3QvZWZmZWN0di9nc3RzdHJlYWsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDkzNjJkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VmZmVjdHYvZ3N0c3RyZWFrLmgKQEAgLTAsMCArMSw3NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBFZmZlY1RWIC0gUmVhbHRpbWUgRGlnaXRhbCBWaWRlbyBFZmZlY3RvcgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgRlVLVUNISSBLZW50YXJvCisgKgorICogU3RyZWFrVFYgLSBhZnRlcmltYWdlIGVmZmVjdG9yLgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgRlVLVUNISSBLZW50YXJvCisgKgorICogRWZmZWNUViBpcyBmcmVlIHNvZnR3YXJlLiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9TVFJFQUtfSF9fCisjZGVmaW5lIF9fR1NUX1NUUkVBS19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2ZpbHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfU1RSRUFLVFYgXAorICAoZ3N0X3N0cmVha3R2X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9TVFJFQUtUVihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1NUUkVBS1RWLEdzdFN0cmVha1RWKSkKKyNkZWZpbmUgR1NUX1NUUkVBS1RWX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1NUUkVBS1RWLEdzdFN0cmVha1RWQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfU1RSRUFLVFYob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9TVFJFQUtUVikpCisjZGVmaW5lIEdTVF9JU19TVFJFQUtUVl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9TVFJFQUtUVikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RTdHJlYWtUViBHc3RTdHJlYWtUVjsKK3R5cGVkZWYgc3RydWN0IF9Hc3RTdHJlYWtUVkNsYXNzIEdzdFN0cmVha1RWQ2xhc3M7CisKKyNkZWZpbmUgUExBTkVTIDMyCisKK3N0cnVjdCBfR3N0U3RyZWFrVFYKK3sKKyAgR3N0VmlkZW9GaWx0ZXIgZWxlbWVudDsKKworICAvKiA8IHByaXZhdGUgPiAqLworICBnYm9vbGVhbiBmZWVkYmFjazsKKworICBndWludDMyICpwbGFuZWJ1ZmZlcjsKKyAgZ3VpbnQzMiAqcGxhbmV0YWJsZVtQTEFORVNdOworICBnaW50IHBsYW5lOworfTsKKworc3RydWN0IF9Hc3RTdHJlYWtUVkNsYXNzCit7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3N0cmVha3R2X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1NUUkVBS19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYyBiL2dzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDlhN2QyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5jCkBAIC0wLDAgKzEsMzI3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogRWZmZWNUVjoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBGVUtVQ0hJIEtlbnRhcm91CisgKgorICogRWZmZWNUViBpcyBmcmVlIHNvZnR3YXJlLiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtdmVydGlnb3R2CisgKgorICogVmVydGlnb1RWIGlzIGEgbG9vcGJhY2sgYWxwaGEgYmxlbmRpbmcgZWZmZWN0b3Igd2l0aCByb3RhdGluZyBhbmQgc2NhbGluZy4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgdmlkZW90ZXN0c3JjICEgdmVydGlnb3R2ICEgdmlkZW9jb252ZXJ0ICEgYXV0b3ZpZGVvc2luaworICogXXwgVGhpcyBwaXBlbGluZSBzaG93cyB0aGUgZWZmZWN0IG9mIHZlcnRpZ290diBvbiBhIHRlc3Qgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3R2ZXJ0aWdvLmgiCisKKyNkZWZpbmUgZ3N0X3ZlcnRpZ290dl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RWZXJ0aWdvVFYsIGdzdF92ZXJ0aWdvdHYsIEdTVF9UWVBFX1ZJREVPX0ZJTFRFUik7CisKKy8qIEZpbHRlciBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9TUEVFRCwKKyAgUFJPUF9aT09NX1NQRUVECit9OworCisjaWYgR19CWVRFX09SREVSID09IEdfTElUVExFX0VORElBTgorI2RlZmluZSBDQVBTX1NUUiBHU1RfVklERU9fQ0FQU19NQUtFICgieyBSR0J4LCBCR1J4IH0iKQorI2Vsc2UKKyNkZWZpbmUgQ0FQU19TVFIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgeFJHQiwgeEJHUiB9IikKKyNlbmRpZgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3ZlcnRpZ290dl9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoQ0FQU19TVFIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF92ZXJ0aWdvdHZfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKENBUFNfU1RSKQorICAgICk7CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZlcnRpZ290dl9zZXRfaW5mbyAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RDYXBzICogaW5jYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0VmVydGlnb1RWICpmaWx0ZXIgPSBHU1RfVkVSVElHT1RWICh2ZmlsdGVyKTsKKyAgZ2ludCBhcmVhLCB3aWR0aCwgaGVpZ2h0OworCisgIHdpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKGluX2luZm8pOworICBoZWlnaHQgPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKGluX2luZm8pOworCisgIGFyZWEgPSB3aWR0aCAqIGhlaWdodDsKKworICBnX2ZyZWUgKGZpbHRlci0+YnVmZmVyKTsKKyAgZmlsdGVyLT5idWZmZXIgPSAoZ3VpbnQzMiAqKSBnX21hbGxvYzAgKGFyZWEgKiAyICogc2l6ZW9mIChndWludDMyKSk7CisKKyAgZmlsdGVyLT5jdXJyZW50X2J1ZmZlciA9IGZpbHRlci0+YnVmZmVyOworICBmaWx0ZXItPmFsdF9idWZmZXIgPSBmaWx0ZXItPmJ1ZmZlciArIGFyZWE7CisgIGZpbHRlci0+cGhhc2UgPSAwOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZlcnRpZ290dl9zZXRfcGFybXMgKEdzdFZlcnRpZ29UViAqIGZpbHRlcikKK3sKKyAgZG91YmxlIHZ4LCB2eTsKKyAgZG91YmxlIHQ7CisgIGRvdWJsZSB4LCB5OworICBkb3VibGUgZGl6ejsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBHc3RWaWRlb0luZm8gKmluZm87CisKKyAgZGl6eiA9IHNpbiAoZmlsdGVyLT5waGFzZSkgKiAxMCArIHNpbiAoZmlsdGVyLT5waGFzZSAqIDEuOSArIDUpICogNTsKKworICBpbmZvID0gJkdTVF9WSURFT19GSUxURVIgKGZpbHRlciktPmluX2luZm87CisKKyAgd2lkdGggPSBHU1RfVklERU9fSU5GT19XSURUSCAoaW5mbyk7CisgIGhlaWdodCA9IEdTVF9WSURFT19JTkZPX0hFSUdIVCAoaW5mbyk7CisKKyAgeCA9IHdpZHRoIC8gMjsKKyAgeSA9IGhlaWdodCAvIDI7CisKKyAgdCA9ICh4ICogeCArIHkgKiB5KSAqIGZpbHRlci0+em9vbXJhdGU7CisKKyAgaWYgKHdpZHRoID4gaGVpZ2h0KSB7CisgICAgaWYgKGRpenogPj0gMCkgeworICAgICAgaWYgKGRpenogPiB4KQorICAgICAgICBkaXp6ID0geDsKKyAgICAgIHZ4ID0gKHggKiAoeCAtIGRpenopICsgeSAqIHkpIC8gdDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGRpenogPCAteCkKKyAgICAgICAgZGl6eiA9IC14OworICAgICAgdnggPSAoeCAqICh4ICsgZGl6eikgKyB5ICogeSkgLyB0OworICAgIH0KKyAgICB2eSA9IChkaXp6ICogeSkgLyB0OworICB9IGVsc2UgeworICAgIGlmIChkaXp6ID49IDApIHsKKyAgICAgIGlmIChkaXp6ID4geSkKKyAgICAgICAgZGl6eiA9IHk7CisgICAgICB2eCA9ICh4ICogeCArIHkgKiAoeSAtIGRpenopKSAvIHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChkaXp6IDwgLXkpCisgICAgICAgIGRpenogPSAteTsKKyAgICAgIHZ4ID0gKHggKiB4ICsgeSAqICh5ICsgZGl6eikpIC8gdDsKKyAgICB9CisgICAgdnkgPSAoZGl6eiAqIHgpIC8gdDsKKyAgfQorICBmaWx0ZXItPmR4ID0gdnggKiA2NTUzNjsKKyAgZmlsdGVyLT5keSA9IHZ5ICogNjU1MzY7CisgIGZpbHRlci0+c3ggPSAoLXZ4ICogeCArIHZ5ICogeSArIHggKyBjb3MgKGZpbHRlci0+cGhhc2UgKiA1KSAqIDIpICogNjU1MzY7CisgIGZpbHRlci0+c3kgPSAoLXZ4ICogeSAtIHZ5ICogeCArIHkgKyBzaW4gKGZpbHRlci0+cGhhc2UgKiA2KSAqIDIpICogNjU1MzY7CisKKyAgZmlsdGVyLT5waGFzZSArPSBmaWx0ZXItPnBoYXNlX2luY3JlbWVudDsKKyAgaWYgKGZpbHRlci0+cGhhc2UgPiA1NzAwMDAwKQorICAgIGZpbHRlci0+cGhhc2UgPSAwOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3ZlcnRpZ290dl90cmFuc2Zvcm1fZnJhbWUgKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwKKyAgICBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUpCit7CisgIEdzdFZlcnRpZ29UViAqZmlsdGVyID0gR1NUX1ZFUlRJR09UViAodmZpbHRlcik7CisgIGd1aW50MzIgKnNyYywgKmRlc3QsICpwOworICBndWludDMyIHY7CisgIGdpbnQgeCwgeSwgb3gsIG95LCBpLCB3aWR0aCwgaGVpZ2h0LCBhcmVhLCBzc3RyaWRlLCBkc3RyaWRlOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBzdHJlYW1fdGltZTsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5fZnJhbWUtPmJ1ZmZlcik7CisgIHN0cmVhbV90aW1lID0KKyAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmR1NUX0JBU0VfVFJBTlNGT1JNIChmaWx0ZXIpLT5zZWdtZW50LAorICAgICAgR1NUX0ZPUk1BVF9USU1FLCB0aW1lc3RhbXApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwgInN5bmMgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSk7CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdHJlYW1fdGltZSkpCisgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoZmlsdGVyKSwgc3RyZWFtX3RpbWUpOworCisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIHNzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChpbl9mcmFtZSwgMCk7CisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKyAgZHN0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKG91dF9mcmFtZSwgMCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworCisgIGFyZWEgPSB3aWR0aCAqIGhlaWdodDsKKworICBzc3RyaWRlIC89IDQ7CisgIGRzdHJpZGUgLz0gNDsKKworICBnc3RfdmVydGlnb3R2X3NldF9wYXJtcyAoZmlsdGVyKTsKKyAgcCA9IGZpbHRlci0+YWx0X2J1ZmZlcjsKKworICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICBveCA9IGZpbHRlci0+c3g7CisgICAgb3kgPSBmaWx0ZXItPnN5OworCisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgIGkgPSAob3kgPj4gMTYpICogd2lkdGggKyAob3ggPj4gMTYpOworICAgICAgaWYgKGkgPCAwKQorICAgICAgICBpID0gMDsKKyAgICAgIGlmIChpID49IGFyZWEpCisgICAgICAgIGkgPSBhcmVhOworCisgICAgICB2ID0gZmlsdGVyLT5jdXJyZW50X2J1ZmZlcltpXSAmIDB4ZmNmY2ZmOworICAgICAgdiA9ICh2ICogMykgKyAoc3JjW3hdICYgMHhmY2ZjZmYpOworCisgICAgICAqcCsrID0gZGVzdFt4XSA9ICh2ID4+IDIpOworICAgICAgb3ggKz0gZmlsdGVyLT5keDsKKyAgICAgIG95ICs9IGZpbHRlci0+ZHk7CisgICAgfQorICAgIGZpbHRlci0+c3ggLT0gZmlsdGVyLT5keTsKKyAgICBmaWx0ZXItPnN5ICs9IGZpbHRlci0+ZHg7CisKKyAgICBzcmMgKz0gc3N0cmlkZTsKKyAgICBkZXN0ICs9IGRzdHJpZGU7CisgIH0KKworICBwID0gZmlsdGVyLT5jdXJyZW50X2J1ZmZlcjsKKyAgZmlsdGVyLT5jdXJyZW50X2J1ZmZlciA9IGZpbHRlci0+YWx0X2J1ZmZlcjsKKyAgZmlsdGVyLT5hbHRfYnVmZmVyID0gcDsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZlcnRpZ290dl9zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICBHc3RWZXJ0aWdvVFYgKmZpbHRlciA9IEdTVF9WRVJUSUdPVFYgKHRyYW5zKTsKKworICBmaWx0ZXItPnBoYXNlID0gMC4wOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZlcnRpZ290dl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VmVydGlnb1RWICpmaWx0ZXIgPSBHU1RfVkVSVElHT1RWIChvYmplY3QpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZmlsdGVyKTsKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1NQRUVEOgorICAgICAgZmlsdGVyLT5waGFzZV9pbmNyZW1lbnQgPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1pPT01fU1BFRUQ6CisgICAgICBmaWx0ZXItPnpvb21yYXRlID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92ZXJ0aWdvdHZfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFZlcnRpZ29UViAqZmlsdGVyID0gR1NUX1ZFUlRJR09UViAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU1BFRUQ6CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIGZpbHRlci0+cGhhc2VfaW5jcmVtZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9aT09NX1NQRUVEOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBmaWx0ZXItPnpvb21yYXRlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF92ZXJ0aWdvdHZfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFZlcnRpZ29UViAqZmlsdGVyID0gR1NUX1ZFUlRJR09UViAob2JqZWN0KTsKKworICBnX2ZyZWUgKGZpbHRlci0+YnVmZmVyKTsKKyAgZmlsdGVyLT5idWZmZXIgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92ZXJ0aWdvdHZfY2xhc3NfaW5pdCAoR3N0VmVydGlnb1RWQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzICp0cmFuc19jbGFzcyA9IChHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKikga2xhc3M7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgKnZmaWx0ZXJfY2xhc3MgPSAoR3N0VmlkZW9GaWx0ZXJDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdmVydGlnb3R2X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3ZlcnRpZ290dl9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3ZlcnRpZ290dl9maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1NQRUVELAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgic3BlZWQiLCAiU3BlZWQiLCAiQ29udHJvbCB0aGUgc3BlZWQgb2YgbW92ZW1lbnQiLAorICAgICAgICAgIDAuMDEsIDEwMC4wLCAwLjAyLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9aT09NX1NQRUVELAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgiem9vbS1zcGVlZCIsICJab29tIFNwZWVkIiwKKyAgICAgICAgICAiQ29udHJvbCB0aGUgcmF0ZSBvZiB6b29taW5nIiwgMS4wMSwgMS4xLCAxLjAxLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJWZXJ0aWdvVFYgZWZmZWN0IiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1ZpZGVvIiwKKyAgICAgICJBIGxvb3BiYWNrIGFscGhhIGJsZW5kaW5nIGVmZmVjdG9yIHdpdGggcm90YXRpbmcgYW5kIHNjYWxpbmciLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5iZT4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfdmVydGlnb3R2X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfdmVydGlnb3R2X3NyY190ZW1wbGF0ZSk7CisKKyAgdHJhbnNfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92ZXJ0aWdvdHZfc3RhcnQpOworCisgIHZmaWx0ZXJfY2xhc3MtPnNldF9pbmZvID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92ZXJ0aWdvdHZfc2V0X2luZm8pOworICB2ZmlsdGVyX2NsYXNzLT50cmFuc2Zvcm1fZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92ZXJ0aWdvdHZfdHJhbnNmb3JtX2ZyYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92ZXJ0aWdvdHZfaW5pdCAoR3N0VmVydGlnb1RWICogZmlsdGVyKQoreworICBmaWx0ZXItPmJ1ZmZlciA9IE5VTEw7CisgIGZpbHRlci0+cGhhc2UgPSAwLjA7CisgIGZpbHRlci0+cGhhc2VfaW5jcmVtZW50ID0gMC4wMjsKKyAgZmlsdGVyLT56b29tcmF0ZSA9IDEuMDE7Cit9CmRpZmYgLS1naXQgYS9nc3QvZWZmZWN0di9nc3R2ZXJ0aWdvLmggYi9nc3QvZWZmZWN0di9nc3R2ZXJ0aWdvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljMjI1YgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L2dzdHZlcnRpZ28uaApAQCAtMCwwICsxLDcxIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogRWZmZWNUVjoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBGVUtVQ0hJIEtlbnRhcm91CisgKgorICogRWZmZWNUViBpcyBmcmVlIHNvZnR3YXJlLiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9WRVJUSUdPX0hfXworI2RlZmluZSBfX0dTVF9WRVJUSUdPX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9WRVJUSUdPVFYgXAorICAoZ3N0X3ZlcnRpZ290dl9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfVkVSVElHT1RWKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVkVSVElHT1RWLEdzdFZlcnRpZ29UVikpCisjZGVmaW5lIEdTVF9WRVJUSUdPVFZfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfVkVSVElHT1RWLEdzdFZlcnRpZ29UVkNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1ZFUlRJR09UVihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1ZFUlRJR09UVikpCisjZGVmaW5lIEdTVF9JU19WRVJUSUdPVFZfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVkVSVElHT1RWKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZlcnRpZ29UViBHc3RWZXJ0aWdvVFY7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VmVydGlnb1RWQ2xhc3MgR3N0VmVydGlnb1RWQ2xhc3M7CisKK3N0cnVjdCBfR3N0VmVydGlnb1RWCit7CisgIEdzdFZpZGVvRmlsdGVyIHZpZGVvZmlsdGVyOworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIGd1aW50MzIgKmJ1ZmZlcjsKKyAgZ3VpbnQzMiAqY3VycmVudF9idWZmZXIsICphbHRfYnVmZmVyOworICBnaW50IGR4LCBkeTsKKyAgZ2ludCBzeCwgc3k7CisgIGdkb3VibGUgcGhhc2U7CisgIGdkb3VibGUgcGhhc2VfaW5jcmVtZW50OworICBnZG91YmxlIHpvb21yYXRlOworfTsKKworc3RydWN0IF9Hc3RWZXJ0aWdvVFZDbGFzcworeworICBHc3RWaWRlb0ZpbHRlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF92ZXJ0aWdvdHZfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfVkVSVElHT19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9lZmZlY3R2L2dzdHdhcnAuYyBiL2dzdC9lZmZlY3R2L2dzdHdhcnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDFlZDhjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VmZmVjdHYvZ3N0d2FycC5jCkBAIC0wLDAgKzEsMjY2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBFZmZlY1RWIC0gUmVhbHRpbWUgRGlnaXRhbCBWaWRlbyBFZmZlY3RvcgorICogQ29weXJpZ2h0IChDKSAyMDAxIEZVS1VDSEkgS2VudGFyb3UKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyAocHJvYmFibHkpIGdlbmVyYXRlZCBmcm9tIGdzdHZpZGVvdGVtcGxhdGUuYywKKyAqIGdzdHZpZGVvdGVtcGxhdGUuYyx2IDEuMTEgMjAwNC8wMS8wNyAwODo1Njo0NSBkcyBFeHAgCisgKi8KKworLyogRnJvbSBtYWluLmMgb2Ygd2FycC0xLjE6CisgKgorICogICAgICBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIgZGVtbworICogICAgICBSZWFsdGltZSBwaWN0dXJlICdnb29pbmcnCisgKiAgICAgIGJ5IHNhbSBsYW50aW5nYSBzbG91a2VuQGRldm9sdXRpb24uY29tCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtd2FycHR2CisgKgorICogV2FycFRWIGRvZXMgcmVhbHRpbWUgZ29vJ2luZyBvZiB0aGUgdmlkZW8gaW5wdXQuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyAhIHdhcnB0diAhIHZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsKKyAqIF18IFRoaXMgcGlwZWxpbmUgc2hvd3MgdGhlIGVmZmVjdCBvZiB3YXJwdHYgb24gYSB0ZXN0IHN0cmVhbS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZ3N0d2FycC5oIgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb21ldGEuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9wb29sLmg+CisKKyNpZm5kZWYgTV9QSQorI2RlZmluZSBNX1BJICAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKKyNlbmRpZgorCisjZGVmaW5lIGdzdF93YXJwdHZfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0V2FycFRWLCBnc3Rfd2FycHR2LCBHU1RfVFlQRV9WSURFT19GSUxURVIpOworCitzdGF0aWMgdm9pZCBpbml0U2luVGFibGUgKCk7CitzdGF0aWMgdm9pZCBpbml0RGlzdFRhYmxlIChHc3RXYXJwVFYgKiBmaWx0ZXIsIGdpbnQgd2lkdGgsIGdpbnQgaGVpZ2h0KTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF93YXJwdHZfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IFJHQngsIHhSR0IsIEJHUngsIHhCR1IgfSIpKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3Rfd2FycHR2X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBSR0J4LCB4UkdCLCBCR1J4LCB4QkdSIH0iKSkKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXJwdHZfc2V0X2luZm8gKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwgR3N0Q2FwcyAqIGluY2FwcywKKyAgICBHc3RWaWRlb0luZm8gKiBpbl9pbmZvLCBHc3RDYXBzICogb3V0Y2FwcywgR3N0VmlkZW9JbmZvICogb3V0X2luZm8pCit7CisgIEdzdFdhcnBUViAqZmlsdGVyID0gR1NUX1dBUlBUViAodmZpbHRlcik7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKworICB3aWR0aCA9IEdTVF9WSURFT19JTkZPX1dJRFRIIChpbl9pbmZvKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbl9pbmZvKTsKKworICBnX2ZyZWUgKGZpbHRlci0+ZGlzdHRhYmxlKTsKKyAgZmlsdGVyLT5kaXN0dGFibGUgPSBnX21hbGxvYyAod2lkdGggKiBoZWlnaHQgKiBzaXplb2YgKGd1aW50MzIpKTsKKyAgaW5pdERpc3RUYWJsZSAoZmlsdGVyLCB3aWR0aCwgaGVpZ2h0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdpbnQzMiBzaW50YWJsZVsxMDI0ICsgMjU2XTsKKworc3RhdGljIHZvaWQKK2luaXRTaW5UYWJsZSAodm9pZCkKK3sKKyAgZ2ludDMyICp0cHRyLCAqdHNpbnB0cjsKKyAgZ2ludCBpOworCisgIHRzaW5wdHIgPSB0cHRyID0gc2ludGFibGU7CisKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICAqdHB0cisrID0gKGludCkgKHNpbiAoaSAqIE1fUEkgLyA1MTIpICogMzI3NjcpOworCisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAqdHB0cisrID0gKnRzaW5wdHIrKzsKK30KKworc3RhdGljIHZvaWQKK2luaXREaXN0VGFibGUgKEdzdFdhcnBUViAqIGZpbHRlciwgZ2ludCB3aWR0aCwgZ2ludCBoZWlnaHQpCit7CisgIGdpbnQzMiBoYWxmdywgaGFsZmgsICpkaXN0cHRyOworICBnaW50IHgsIHk7CisgIGZsb2F0IG07CisKKyAgaGFsZncgPSB3aWR0aCA+PiAxOworICBoYWxmaCA9IGhlaWdodCA+PiAxOworCisgIGRpc3RwdHIgPSBmaWx0ZXItPmRpc3R0YWJsZTsKKworICBtID0gc3FydCAoKGRvdWJsZSkgKGhhbGZ3ICogaGFsZncgKyBoYWxmaCAqIGhhbGZoKSk7CisKKyAgZm9yICh5ID0gLWhhbGZoOyB5IDwgaGFsZmg7IHkrKykKKyAgICBmb3IgKHggPSAtaGFsZnc7IHggPCBoYWxmdzsgeCsrKQorI2lmZGVmIFBTMgorICAgICAgKmRpc3RwdHIrKyA9ICgoaW50KSAoKHNxcnRmICh4ICogeCArIHkgKiB5KSAqIDUxMS45OTk5KSAvIG0pKSA8PCAxOworI2Vsc2UKKyAgICAgICpkaXN0cHRyKysgPSAoKGludCkgKChzcXJ0ICh4ICogeCArIHkgKiB5KSAqIDUxMS45OTk5KSAvIG0pKSA8PCAxOworI2VuZGlmCit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfd2FycHR2X3RyYW5zZm9ybV9mcmFtZSAoR3N0VmlkZW9GaWx0ZXIgKiBmaWx0ZXIsIEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lKQoreworICBHc3RXYXJwVFYgKndhcnB0diA9IEdTVF9XQVJQVFYgKGZpbHRlcik7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCB4dywgeXcsIGN3OworICBnaW50MzIgYywgaSwgeCwgeSwgZHgsIGR5LCBtYXh4LCBtYXh5OworICBnaW50MzIgKmN0cHRyLCAqZGlzdHB0cjsKKyAgZ2ludDMyICpjdGFibGU7CisgIGd1aW50MzIgKnNyYywgKmRlc3Q7CisgIGdpbnQgc3N0cmlkZSwgZHN0cmlkZTsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgc3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGluX2ZyYW1lLCAwKTsKKyAgZHN0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKG91dF9mcmFtZSwgMCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAod2FycHR2KTsKKyAgeHcgPSAoZ2ludCkgKHNpbiAoKHdhcnB0di0+dHZhbCArIDEwMCkgKiBNX1BJIC8gMTI4KSAqIDMwKTsKKyAgeXcgPSAoZ2ludCkgKHNpbiAoKHdhcnB0di0+dHZhbCkgKiBNX1BJIC8gMjU2KSAqIC0zNSk7CisgIGN3ID0gKGdpbnQpIChzaW4gKCh3YXJwdHYtPnR2YWwgLSA3MCkgKiBNX1BJIC8gNjQpICogNTApOworICB4dyArPSAoZ2ludCkgKHNpbiAoKHdhcnB0di0+dHZhbCAtIDEwKSAqIE1fUEkgLyA1MTIpICogNDApOworICB5dyArPSAoZ2ludCkgKHNpbiAoKHdhcnB0di0+dHZhbCArIDMwKSAqIE1fUEkgLyA1MTIpICogNDApOworCisgIGN0cHRyID0gd2FycHR2LT5jdGFibGU7CisgIGRpc3RwdHIgPSB3YXJwdHYtPmRpc3R0YWJsZTsKKyAgY3RhYmxlID0gd2FycHR2LT5jdGFibGU7CisKKyAgYyA9IDA7CisKKyAgZm9yICh4ID0gMDsgeCA8IDUxMjsgeCsrKSB7CisgICAgaSA9IChjID4+IDMpICYgMHgzRkU7CisgICAgKmN0cHRyKysgPSAoKHNpbnRhYmxlW2ldICogeXcpID4+IDE1KTsKKyAgICAqY3RwdHIrKyA9ICgoc2ludGFibGVbaSArIDI1Nl0gKiB4dykgPj4gMTUpOworICAgIGMgKz0gY3c7CisgIH0KKyAgbWF4eCA9IHdpZHRoIC0gMjsKKyAgbWF4eSA9IGhlaWdodCAtIDI7CisKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodCAtIDE7IHkrKykgeworICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICBpID0gKmRpc3RwdHIrKzsKKyAgICAgIGR4ID0gY3RhYmxlW2kgKyAxXSArIHg7CisgICAgICBkeSA9IGN0YWJsZVtpXSArIHk7CisKKyAgICAgIGlmIChkeCA8IDApCisgICAgICAgIGR4ID0gMDsKKyAgICAgIGVsc2UgaWYgKGR4ID4gbWF4eCkKKyAgICAgICAgZHggPSBtYXh4OworCisgICAgICBpZiAoZHkgPCAwKQorICAgICAgICBkeSA9IDA7CisgICAgICBlbHNlIGlmIChkeSA+IG1heHkpCisgICAgICAgIGR5ID0gbWF4eTsKKworICAgICAgZGVzdFt4XSA9IHNyY1tkeSAqIHNzdHJpZGUgLyA0ICsgZHhdOworICAgIH0KKyAgICBkZXN0ICs9IGRzdHJpZGUgLyA0OworICB9CisKKyAgd2FycHR2LT50dmFsID0gKHdhcnB0di0+dHZhbCArIDEpICYgNTExOworICBHU1RfT0JKRUNUX1VOTE9DSyAod2FycHR2KTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhcnB0dl9zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICBHc3RXYXJwVFYgKndhcnB0diA9IEdTVF9XQVJQVFYgKHRyYW5zKTsKKworICB3YXJwdHYtPnR2YWwgPSAwOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3dhcnB0dl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0V2FycFRWICp3YXJwdHYgPSBHU1RfV0FSUFRWIChvYmplY3QpOworCisgIGdfZnJlZSAod2FycHR2LT5kaXN0dGFibGUpOworICB3YXJwdHYtPmRpc3R0YWJsZSA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3dhcnB0dl9jbGFzc19pbml0IChHc3RXYXJwVFZDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKnRyYW5zX2NsYXNzID0gKEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqKSBrbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzcyA9IChHc3RWaWRlb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3dhcnB0dl9maW5hbGl6ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiV2FycFRWIGVmZmVjdCIsCisgICAgICAiRmlsdGVyL0VmZmVjdC9WaWRlbyIsCisgICAgICAiV2FycFRWIGRvZXMgcmVhbHRpbWUgZ29vJ2luZyBvZiB0aGUgdmlkZW8gaW5wdXQiLAorICAgICAgIlNhbSBMYW50aW5nYSA8c2xvdWtlbkBkZXZvbHV0aW9uLmNvbT4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfd2FycHR2X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfd2FycHR2X3NyY190ZW1wbGF0ZSk7CisKKyAgdHJhbnNfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXJwdHZfc3RhcnQpOworCisgIHZmaWx0ZXJfY2xhc3MtPnNldF9pbmZvID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXJwdHZfc2V0X2luZm8pOworICB2ZmlsdGVyX2NsYXNzLT50cmFuc2Zvcm1fZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXJwdHZfdHJhbnNmb3JtX2ZyYW1lKTsKKworICBpbml0U2luVGFibGUgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2FycHR2X2luaXQgKEdzdFdhcnBUViAqIHdhcnB0dikKK3sKKyAgLyogbm90aGluZyB0byBkbyAqLworfQpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0d2FycC5oIGIvZ3N0L2VmZmVjdHYvZ3N0d2FycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZWVlYmMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZWZmZWN0di9nc3R3YXJwLmgKQEAgLTAsMCArMSw2NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogRWZmZWNUViAtIFJlYWx0aW1lIERpZ2l0YWwgVmlkZW8gRWZmZWN0b3IKKyAqIENvcHlyaWdodCAoQykgMjAwMSBGVUtVQ0hJIEtlbnRhcm91CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9XQVJQX0hfXworI2RlZmluZSBfX0dTVF9XQVJQX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9XQVJQVFYgXAorICAoZ3N0X3dhcnB0dl9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfV0FSUFRWKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfV0FSUFRWLEdzdFdhcnBUVikpCisjZGVmaW5lIEdTVF9XQVJQVFZfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfV0FSUFRWLEdzdFdhcnBUVkNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1dBUlBUVihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1dBUlBUVikpCisjZGVmaW5lIEdTVF9JU19XQVJQVFZfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfV0FSUFRWKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFdhcnBUViBHc3RXYXJwVFY7Cit0eXBlZGVmIHN0cnVjdCBfR3N0V2FycFRWQ2xhc3MgR3N0V2FycFRWQ2xhc3M7CisKK3N0cnVjdCBfR3N0V2FycFRWCit7CisgIEdzdFZpZGVvRmlsdGVyIHZpZGVvZmlsdGVyOworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIGdpbnQzMiAqZGlzdHRhYmxlOworICBnaW50MzIgY3RhYmxlWzEwMjRdOworICBnaW50IHR2YWw7Cit9OworCitzdHJ1Y3QgX0dzdFdhcnBUVkNsYXNzCit7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3dhcnB0dl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9XQVJQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvbWVzb24uYnVpbGQgYi9nc3QvZWZmZWN0di9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWQ5N2UwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VmZmVjdHYvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxNCBAQAorZWZmZWN0X3NvdXJjZXMgPSBbCisgICdnc3RlZmZlY3R2LmMnLCAnZ3N0ZWRnZS5jJywgJ2dzdGFnaW5nLmMnLCAnZ3N0ZGljZS5jJywgJ2dzdHdhcnAuYycsCisgICdnc3RzaGFnYWRlbGljLmMnLCAnZ3N0dmVydGlnby5jJywgJ2dzdHJldi5jJywgJ2dzdHF1YXJrLmMnLCAnZ3N0b3AuYycsCisgICdnc3RyYWRpb2FjLmMnLCAnZ3N0c3RyZWFrLmMnLCAnZ3N0cmlwcGxlLmMnCitdCisKK2dzdGVmZmVjdHYgPSBsaWJyYXJ5KCdnc3RlZmZlY3R2JywKKyAgZWZmZWN0X3NvdXJjZXMsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0X2RlcCwgZ3N0YmFzZV9kZXAsIGdzdHZpZGVvX2RlcCwgbGlibV0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvZXF1YWxpemVyLy5naXRpZ25vcmUgYi9nc3QvZXF1YWxpemVyLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0OWI2NwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lcXVhbGl6ZXIvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACitkZW1vCmRpZmYgLS1naXQgYS9nc3QvZXF1YWxpemVyL0dzdElpckVxdWFsaXplcjEwQmFuZHMucHJzIGIvZ3N0L2VxdWFsaXplci9Hc3RJaXJFcXVhbGl6ZXIxMEJhbmRzLnBycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjI2MWI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VxdWFsaXplci9Hc3RJaXJFcXVhbGl6ZXIxMEJhbmRzLnBycwpAQCAtMCwwICsxLDE3NCBAQAorW19wcmVzZXRzX10KK3ZlcnNpb249MC4xMAorZWxlbWVudC1uYW1lPUdzdElpckVxdWFsaXplcjEwQmFuZHMKKworW2JhbGxhZF0KK2JhbmQwPTQKK2JhbmQxPTMuNzUKK2JhbmQyPTIuNQorYmFuZDM9MAorYmFuZDQ9LTQKK2JhbmQ1PS02CitiYW5kNj0tMworYmFuZDc9MAorYmFuZDg9Mi41CitiYW5kOT05CisKK1tjbGFzc2ljXQorYmFuZDA9MAorYmFuZDE9MAorYmFuZDI9MAorYmFuZDM9MAorYmFuZDQ9MAorYmFuZDU9MAorYmFuZDY9LTYKK2JhbmQ3PS03CitiYW5kOD0tNworYmFuZDk9LTkuNQorCitbY2x1Yl0KK2JhbmQwPTAKK2JhbmQxPTAKK2JhbmQyPTgKK2JhbmQzPTYKK2JhbmQ0PTUuNQorYmFuZDU9NQorYmFuZDY9MworYmFuZDc9MAorYmFuZDg9MAorYmFuZDk9MAorCitbZGFuY2VdCitiYW5kMD05LjYKK2JhbmQxPTcKK2JhbmQyPTIuNQorYmFuZDM9MAorYmFuZDQ9MAorYmFuZDU9LTUuNgorYmFuZDY9LTcKK2JhbmQ3PS03CitiYW5kOD0wCitiYW5kOT0wCisKK1twb3BdCitiYW5kMD0tMS42CitiYW5kMT00LjUKK2JhbmQyPTcKK2JhbmQzPTgKK2JhbmQ0PTUuNgorYmFuZDU9MAorYmFuZDY9LTIuNQorYmFuZDc9LTIKK2JhbmQ4PS0xLjYKK2JhbmQ5PS0xLjUKKworW3JlZ2dhZV0KK2JhbmQwPTAKK2JhbmQxPTAKK2JhbmQyPTAKK2JhbmQzPS01LjUKK2JhbmQ0PTAKK2JhbmQ1PTYuNQorYmFuZDY9Ni41CitiYW5kNz0wCitiYW5kOD0wCitiYW5kOT0wCisKK1tyb2NrXQorYmFuZDA9OAorYmFuZDE9NQorYmFuZDI9LTUuNQorYmFuZDM9LTgKK2JhbmQ0PS0zCitiYW5kNT00CitiYW5kNj04CitiYW5kNz0xMQorYmFuZDg9MTEKK2JhbmQ5PTExLjUKKworW3NrYV0KK2JhbmQwPS0yLjUKK2JhbmQxPS01CitiYW5kMj0tNAorYmFuZDM9MAorYmFuZDQ9NAorYmFuZDU9NS41CitiYW5kNj04CitiYW5kNz05CitiYW5kOD0xMQorYmFuZDk9OQorCitbc29mdF0KK2JhbmQwPTUKK2JhbmQxPTEuNQorYmFuZDI9MAorYmFuZDM9LTIuNQorYmFuZDQ9MAorYmFuZDU9NAorYmFuZDY9OAorYmFuZDc9OQorYmFuZDg9MTEKK2JhbmQ5PTEyCisKK1t0ZWNobm9dCitiYW5kMD04CitiYW5kMT01LjUKK2JhbmQyPTAKK2JhbmQzPS01LjUKK2JhbmQ0PS01CitiYW5kNT0wCitiYW5kNj04CitiYW5kNz0xMAorYmFuZDg9MTAKK2JhbmQ5PTkKKworCitbcGFydHldCitiYW5kMD03CitiYW5kMT03CitiYW5kMj0wCitiYW5kMz0wCitiYW5kND0wCitiYW5kNT0wCitiYW5kNj0wCitiYW5kNz0wCitiYW5kOD03CitiYW5kOT03CisKKworW21vcmUgYmFzc10KK2JhbmQwPS04CitiYW5kMT0xMAorYmFuZDI9MTAKK2JhbmQzPTUuNQorYmFuZDQ9MS41CitiYW5kNT0tNAorYmFuZDY9LTgKK2JhbmQ3PS0xMAorYmFuZDg9LTExCitiYW5kOT0tMTEKKworW21vcmUgYmFzcyBhbmQgdHJlYmxlXQorYmFuZDA9OAorYmFuZDE9NS41CitiYW5kMj0wCitiYW5kMz0tNworYmFuZDQ9LTUKK2JhbmQ1PTEuNQorYmFuZDY9OAorYmFuZDc9MTEuMgorYmFuZDg9MTIKK2JhbmQ5PTEyCisKK1ttb3JlIHRyZWJsZV0KK2JhbmQwPS0xMAorYmFuZDE9LTEwCitiYW5kMj0tMTAKK2JhbmQzPS00CitiYW5kND0yLjUKK2JhbmQ1PTExCitiYW5kNj0xNgorYmFuZDc9MTYKK2JhbmQ4PTE2CitiYW5kOT0xOAorCmRpZmYgLS1naXQgYS9nc3QvZXF1YWxpemVyL0dzdElpckVxdWFsaXplcjNCYW5kcy5wcnMgYi9nc3QvZXF1YWxpemVyL0dzdElpckVxdWFsaXplcjNCYW5kcy5wcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI4ZWY1YQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lcXVhbGl6ZXIvR3N0SWlyRXF1YWxpemVyM0JhbmRzLnBycwpAQCAtMCwwICsxLDE0IEBACitbX3ByZXNldHNfXQordmVyc2lvbj0wLjEwCitlbGVtZW50LW5hbWU9R3N0SWlyRXF1YWxpemVyM0JhbmRzCisKK1ttb3JlIGJhc3NdCitiYW5kMD03Ljc1CitiYW5kMT0wCitiYW5kMj0wCisKK1ttb3JlIHRyZWJibGVdCitiYW5kMD0wCitiYW5kMT0wCitiYW5kMj02LjAKKwpkaWZmIC0tZ2l0IGEvZ3N0L2VxdWFsaXplci9NYWtlZmlsZS5hbSBiL2dzdC9lcXVhbGl6ZXIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1OWY3NAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lcXVhbGl6ZXIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyMSBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0ZXF1YWxpemVyLmxhCisKK2xpYmdzdGVxdWFsaXplcl9sYV9TT1VSQ0VTID0gXAorICAgICAgICBnc3RpaXJlcXVhbGl6ZXIuYyBnc3RpaXJlcXVhbGl6ZXIuaCBcCisgICAgICAgIGdzdGlpcmVxdWFsaXplcm5iYW5kcy5jIGdzdGlpcmVxdWFsaXplcm5iYW5kcy5oIFwKKyAgICAgICAgZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmMgZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmggXAorICAgICAgICBnc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmMgZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5oCisKK2xpYmdzdGVxdWFsaXplcl9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgXAorCSQoR1NUX0NGTEFHUykKK2xpYmdzdGVxdWFsaXplcl9sYV9MSUJBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgXAorCS1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pICQoR1NUX0JBU0VfTElCUykgXAorCSQoR1NUX0xJQlMpICQoTElCTSkKK2xpYmdzdGVxdWFsaXplcl9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gZ3N0aWlyZXF1YWxpemVyLmgKKworcHJlc2V0ZGlyID0gJChkYXRhZGlyKS9nc3RyZWFtZXItJChHU1RfQVBJX1ZFUlNJT04pL3ByZXNldHMKK3ByZXNldF9EQVRBID0gR3N0SWlyRXF1YWxpemVyM0JhbmRzLnBycyBHc3RJaXJFcXVhbGl6ZXIxMEJhbmRzLnBycworCitFWFRSQV9ESVNUID0gJChwcmVzZXRfREFUQSkKZGlmZiAtLWdpdCBhL2dzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmMgYi9nc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMDI5NmIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jCkBAIC0wLDAgKzEsOTE5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDQ+IEJlbmphbWluIE90dGUgPG90dGVAZ25vbWUub3JnPgorICogICAgICAgICAgICAgICA8MjAwNz4gU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICogICAgICAgICAgICAgICA8MjAwNz4gU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0aWlyZXF1YWxpemVyLmgiCisjaW5jbHVkZSAiZ3N0aWlyZXF1YWxpemVybmJhbmRzLmgiCisjaW5jbHVkZSAiZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmgiCisjaW5jbHVkZSAiZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5oIgorCisjaW5jbHVkZSAiZ3N0L2dsaWItY29tcGF0LXByaXZhdGUuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZIChlcXVhbGl6ZXJfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZXF1YWxpemVyX2RlYnVnCisKKyNkZWZpbmUgQkFORFNfTE9DSyhlcXUpIGdfbXV0ZXhfbG9jaygmZXF1LT5iYW5kc19sb2NrKQorI2RlZmluZSBCQU5EU19VTkxPQ0soZXF1KSBnX211dGV4X3VubG9jaygmZXF1LT5iYW5kc19sb2NrKQorCitzdGF0aWMgdm9pZCBnc3RfaWlyX2VxdWFsaXplcl9jaGlsZF9wcm94eV9pbnRlcmZhY2VfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwKKyAgICBncG9pbnRlciBpZmFjZV9kYXRhKTsKKworc3RhdGljIHZvaWQgZ3N0X2lpcl9lcXVhbGl6ZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2lpcl9lcXVhbGl6ZXJfc2V0dXAgKEdzdEF1ZGlvRmlsdGVyICogZmlsdGVyLAorICAgIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2lpcl9lcXVhbGl6ZXJfdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogYnRyYW5zLAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CitzdGF0aWMgdm9pZCBzZXRfcGFzc3Rocm91Z2ggKEdzdElpckVxdWFsaXplciAqIGVxdSk7CisKKyNkZWZpbmUgQUxMT1dFRF9DQVBTIFwKKyAgICAiYXVkaW8veC1yYXcsIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIGZvcm1hdD0oc3RyaW5nKSB7IkdTVF9BVURJT19ORShTMTYpIiwiR1NUX0FVRElPX05FKEYzMikiLCIgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdTVF9BVURJT19ORShGNjQpIiB9LCAiICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIHJhdGU9KGludClbMTAwMCxNQVhdLCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIGNoYW5uZWxzPShpbnQpWzEsTUFYXSwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkIgorCisjZGVmaW5lIGdzdF9paXJfZXF1YWxpemVyX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RJaXJFcXVhbGl6ZXIsIGdzdF9paXJfZXF1YWxpemVyLAorICAgIEdTVF9UWVBFX0FVRElPX0ZJTFRFUiwKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX0NISUxEX1BST1hZLAorICAgICAgICBnc3RfaWlyX2VxdWFsaXplcl9jaGlsZF9wcm94eV9pbnRlcmZhY2VfaW5pdCkKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1BSRVNFVCwgTlVMTCkpOworCisKKy8qIGNoaWxkIG9iamVjdCAqLworCitlbnVtCit7CisgIFBST1BfR0FJTiA9IDEsCisgIFBST1BfRlJFUSwKKyAgUFJPUF9CQU5EV0lEVEgsCisgIFBST1BfVFlQRQorfTsKKwordHlwZWRlZiBlbnVtCit7CisgIEJBTkRfVFlQRV9QRUFLID0gMCwKKyAgQkFORF9UWVBFX0xPV19TSEVMRiwKKyAgQkFORF9UWVBFX0hJR0hfU0hFTEYKK30gR3N0SWlyRXF1YWxpemVyQmFuZFR5cGU7CisKKyNkZWZpbmUgR1NUX1RZUEVfSUlSX0VRVUFMSVpFUl9CQU5EX1RZUEUgKGdzdF9paXJfZXF1YWxpemVyX2JhbmRfdHlwZV9nZXRfdHlwZSAoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF90eXBlX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgZ3R5cGUgPSAwOworCisgIGlmIChndHlwZSA9PSAwKSB7CisgICAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAgICB7QkFORF9UWVBFX1BFQUssICJQZWFrIGZpbHRlciAoZGVmYXVsdCBmb3IgaW5uZXIgYmFuZHMpIiwgInBlYWsifSwKKyAgICAgIHtCQU5EX1RZUEVfTE9XX1NIRUxGLCAiTG93IHNoZWxmIGZpbHRlciAoZGVmYXVsdCBmb3IgZmlyc3QgYmFuZCkiLAorICAgICAgICAgICJsb3ctc2hlbGYifSwKKyAgICAgIHtCQU5EX1RZUEVfSElHSF9TSEVMRiwgIkhpZ2ggc2hlbGYgZmlsdGVyIChkZWZhdWx0IGZvciBsYXN0IGJhbmQpIiwKKyAgICAgICAgICAiaGlnaC1zaGVsZiJ9LAorICAgICAgezAsIE5VTEwsIE5VTEx9CisgICAgfTsKKworICAgIGd0eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdElpckVxdWFsaXplckJhbmRUeXBlIiwgdmFsdWVzKTsKKyAgfQorICByZXR1cm4gZ3R5cGU7Cit9CisKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdElpckVxdWFsaXplckJhbmRDbGFzcyBHc3RJaXJFcXVhbGl6ZXJCYW5kQ2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfSUlSX0VRVUFMSVpFUl9CQU5EIFwKKyAgKGdzdF9paXJfZXF1YWxpemVyX2JhbmRfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0lJUl9FUVVBTElaRVJfQkFORChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfQkFORCxHc3RJaXJFcXVhbGl6ZXJCYW5kKSkKKyNkZWZpbmUgR1NUX0lJUl9FUVVBTElaRVJfQkFORF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9JSVJfRVFVQUxJWkVSX0JBTkQsR3N0SWlyRXF1YWxpemVyQmFuZENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0lJUl9FUVVBTElaRVJfQkFORChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfQkFORCkpCisjZGVmaW5lIEdTVF9JU19JSVJfRVFVQUxJWkVSX0JBTkRfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfSUlSX0VRVUFMSVpFUl9CQU5EKSkKKworc3RydWN0IF9Hc3RJaXJFcXVhbGl6ZXJCYW5kCit7CisgIEdzdE9iamVjdCBvYmplY3Q7CisKKyAgLyo8IHByaXZhdGUgPiAqLworICAvKiBjZW50ZXIgZnJlcXVlbmN5IGFuZCBnYWluICovCisgIGdkb3VibGUgZnJlcTsKKyAgZ2RvdWJsZSBnYWluOworICBnZG91YmxlIHdpZHRoOworICBHc3RJaXJFcXVhbGl6ZXJCYW5kVHlwZSB0eXBlOworCisgIC8qIHNlY29uZCBvcmRlciBpaXIgZmlsdGVyICovCisgIGdkb3VibGUgYjEsIGIyOyAgICAgICAgICAgICAgIC8qIElJUiBjb2VmZmljaWVudHMgZm9yIG91dHB1dHMgKi8KKyAgZ2RvdWJsZSBhMCwgYTEsIGEyOyAgICAgICAgICAgLyogSUlSIGNvZWZmaWNpZW50cyBmb3IgaW5wdXRzICovCit9OworCitzdHJ1Y3QgX0dzdElpckVxdWFsaXplckJhbmRDbGFzcworeworICBHc3RPYmplY3RDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitzdGF0aWMgR1R5cGUgZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9nZXRfdHlwZSAodm9pZCk7CisKK3N0YXRpYyB2b2lkCitnc3RfaWlyX2VxdWFsaXplcl9iYW5kX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RJaXJFcXVhbGl6ZXJCYW5kICpiYW5kID0gR1NUX0lJUl9FUVVBTElaRVJfQkFORCAob2JqZWN0KTsKKyAgR3N0SWlyRXF1YWxpemVyICplcXUgPQorICAgICAgR1NUX0lJUl9FUVVBTElaRVIgKGdzdF9vYmplY3RfZ2V0X3BhcmVudCAoR1NUX09CSkVDVCAoYmFuZCkpKTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfR0FJTjp7CisgICAgICBnZG91YmxlIGdhaW47CisKKyAgICAgIGdhaW4gPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhbmQsICJnYWluID0gJWxmIC0+ICVsZiIsIGJhbmQtPmdhaW4sIGdhaW4pOworICAgICAgaWYgKGdhaW4gIT0gYmFuZC0+Z2FpbikgeworICAgICAgICBCQU5EU19MT0NLIChlcXUpOworICAgICAgICBlcXUtPm5lZWRfbmV3X2NvZWZmaWNpZW50cyA9IFRSVUU7CisgICAgICAgIGJhbmQtPmdhaW4gPSBnYWluOworICAgICAgICBzZXRfcGFzc3Rocm91Z2ggKGVxdSk7CisgICAgICAgIEJBTkRTX1VOTE9DSyAoZXF1KTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFuZCwgImNoYW5nZWQgZ2FpbiA9ICVsZiAiLCBiYW5kLT5nYWluKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfRlJFUTp7CisgICAgICBnZG91YmxlIGZyZXE7CisKKyAgICAgIGZyZXEgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhbmQsICJmcmVxID0gJWxmIC0+ICVsZiIsIGJhbmQtPmZyZXEsIGZyZXEpOworICAgICAgaWYgKGZyZXEgIT0gYmFuZC0+ZnJlcSkgeworICAgICAgICBCQU5EU19MT0NLIChlcXUpOworICAgICAgICBlcXUtPm5lZWRfbmV3X2NvZWZmaWNpZW50cyA9IFRSVUU7CisgICAgICAgIGJhbmQtPmZyZXEgPSBmcmVxOworICAgICAgICBCQU5EU19VTkxPQ0sgKGVxdSk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhbmQsICJjaGFuZ2VkIGZyZXEgPSAlbGYgIiwgYmFuZC0+ZnJlcSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0JBTkRXSURUSDp7CisgICAgICBnZG91YmxlIHdpZHRoOworCisgICAgICB3aWR0aCA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFuZCwgIndpZHRoID0gJWxmIC0+ICVsZiIsIGJhbmQtPndpZHRoLCB3aWR0aCk7CisgICAgICBpZiAod2lkdGggIT0gYmFuZC0+d2lkdGgpIHsKKyAgICAgICAgQkFORFNfTE9DSyAoZXF1KTsKKyAgICAgICAgZXF1LT5uZWVkX25ld19jb2VmZmljaWVudHMgPSBUUlVFOworICAgICAgICBiYW5kLT53aWR0aCA9IHdpZHRoOworICAgICAgICBCQU5EU19VTkxPQ0sgKGVxdSk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhbmQsICJjaGFuZ2VkIHdpZHRoID0gJWxmICIsIGJhbmQtPndpZHRoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfVFlQRTp7CisgICAgICBHc3RJaXJFcXVhbGl6ZXJCYW5kVHlwZSB0eXBlOworCisgICAgICB0eXBlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFuZCwgInR5cGUgPSAlZCAtPiAlZCIsIGJhbmQtPnR5cGUsIHR5cGUpOworICAgICAgaWYgKHR5cGUgIT0gYmFuZC0+dHlwZSkgeworICAgICAgICBCQU5EU19MT0NLIChlcXUpOworICAgICAgICBlcXUtPm5lZWRfbmV3X2NvZWZmaWNpZW50cyA9IFRSVUU7CisgICAgICAgIGJhbmQtPnR5cGUgPSB0eXBlOworICAgICAgICBCQU5EU19VTkxPQ0sgKGVxdSk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhbmQsICJjaGFuZ2VkIHR5cGUgPSAlZCAiLCBiYW5kLT50eXBlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgZ3N0X29iamVjdF91bnJlZiAoZXF1KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9paXJfZXF1YWxpemVyX2JhbmRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdElpckVxdWFsaXplckJhbmQgKmJhbmQgPSBHU1RfSUlSX0VRVUFMSVpFUl9CQU5EIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9HQUlOOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgYmFuZC0+Z2Fpbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRlJFUToKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIGJhbmQtPmZyZXEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JBTkRXSURUSDoKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIGJhbmQtPndpZHRoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UWVBFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGJhbmQtPnR5cGUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9jbGFzc19pbml0IChHc3RJaXJFcXVhbGl6ZXJCYW5kQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfaWlyX2VxdWFsaXplcl9iYW5kX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9HQUlOLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoImdhaW4iLCAiZ2FpbiIsCisgICAgICAgICAgImdhaW4gZm9yIHRoZSBmcmVxdWVuY3kgYmFuZCByYW5naW5nIGZyb20gLTI0LjAgZEIgdG8gKzEyLjAgZEIiLAorICAgICAgICAgIC0yNC4wLCAxMi4wLCAwLjAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRlJFUSwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJmcmVxIiwgImZyZXEiLAorICAgICAgICAgICJjZW50ZXIgZnJlcXVlbmN5IG9mIHRoZSBiYW5kIiwKKyAgICAgICAgICAwLjAsIDEwMDAwMC4wLCAwLjAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFORFdJRFRILAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoImJhbmR3aWR0aCIsICJiYW5kd2lkdGgiLAorICAgICAgICAgICJkaWZmZXJlbmNlIGJldHdlZW4gYmFuZGVkZ2VzIGluIEh6IiwKKyAgICAgICAgICAwLjAsIDEwMDAwMC4wLCAxLjAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVFlQRSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgidHlwZSIsICJUeXBlIiwKKyAgICAgICAgICAiRmlsdGVyIHR5cGUiLCBHU1RfVFlQRV9JSVJfRVFVQUxJWkVSX0JBTkRfVFlQRSwKKyAgICAgICAgICBCQU5EX1RZUEVfUEVBSywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaWlyX2VxdWFsaXplcl9iYW5kX2luaXQgKEdzdElpckVxdWFsaXplckJhbmQgKiBiYW5kLAorICAgIEdzdElpckVxdWFsaXplckJhbmRDbGFzcyAqIGtsYXNzKQoreworICBiYW5kLT5mcmVxID0gMC4wOworICBiYW5kLT5nYWluID0gMC4wOworICBiYW5kLT53aWR0aCA9IDEuMDsKKyAgYmFuZC0+dHlwZSA9IEJBTkRfVFlQRV9QRUFLOworfQorCitzdGF0aWMgR1R5cGUKK2dzdF9paXJfZXF1YWxpemVyX2JhbmRfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSB0eXBlID0gMDsKKworICBpZiAoR19VTkxJS0VMWSAoIXR5cGUpKSB7CisgICAgY29uc3QgR1R5cGVJbmZvIHR5cGVfaW5mbyA9IHsKKyAgICAgIHNpemVvZiAoR3N0SWlyRXF1YWxpemVyQmFuZENsYXNzKSwKKyAgICAgIE5VTEwsCisgICAgICBOVUxMLAorICAgICAgKEdDbGFzc0luaXRGdW5jKSBnc3RfaWlyX2VxdWFsaXplcl9iYW5kX2NsYXNzX2luaXQsCisgICAgICBOVUxMLAorICAgICAgTlVMTCwKKyAgICAgIHNpemVvZiAoR3N0SWlyRXF1YWxpemVyQmFuZCksCisgICAgICAwLAorICAgICAgKEdJbnN0YW5jZUluaXRGdW5jKSBnc3RfaWlyX2VxdWFsaXplcl9iYW5kX2luaXQsCisgICAgfTsKKyAgICB0eXBlID0KKyAgICAgICAgZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyAoR1NUX1RZUEVfT0JKRUNULCAiR3N0SWlyRXF1YWxpemVyQmFuZCIsCisgICAgICAgICZ0eXBlX2luZm8sIDApOworICB9CisgIHJldHVybiAodHlwZSk7Cit9CisKKworLyogY2hpbGQgcHJveHkgaWZhY2UgKi8KK3N0YXRpYyBHT2JqZWN0ICoKK2dzdF9paXJfZXF1YWxpemVyX2NoaWxkX3Byb3h5X2dldF9jaGlsZF9ieV9pbmRleCAoR3N0Q2hpbGRQcm94eSAqIGNoaWxkX3Byb3h5LAorICAgIGd1aW50IGluZGV4KQoreworICBHc3RJaXJFcXVhbGl6ZXIgKmVxdSA9IEdTVF9JSVJfRVFVQUxJWkVSIChjaGlsZF9wcm94eSk7CisgIEdPYmplY3QgKnJldDsKKworICBCQU5EU19MT0NLIChlcXUpOworICBpZiAoR19VTkxJS0VMWSAoaW5kZXggPj0gZXF1LT5mcmVxX2JhbmRfY291bnQpKSB7CisgICAgQkFORFNfVU5MT0NLIChlcXUpOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChpbmRleCA8IGVxdS0+ZnJlcV9iYW5kX2NvdW50LCBOVUxMKTsKKyAgfQorCisgIHJldCA9IGdfb2JqZWN0X3JlZiAoR19PQkpFQ1QgKGVxdS0+YmFuZHNbaW5kZXhdKSk7CisgIEJBTkRTX1VOTE9DSyAoZXF1KTsKKworICBHU1RfTE9HX09CSkVDVCAoZXF1LCAicmV0dXJuIGNoaWxkWyVkXSAlIiBHU1RfUFRSX0ZPUk1BVCwgaW5kZXgsIHJldCk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBndWludAorZ3N0X2lpcl9lcXVhbGl6ZXJfY2hpbGRfcHJveHlfZ2V0X2NoaWxkcmVuX2NvdW50IChHc3RDaGlsZFByb3h5ICogY2hpbGRfcHJveHkpCit7CisgIEdzdElpckVxdWFsaXplciAqZXF1ID0gR1NUX0lJUl9FUVVBTElaRVIgKGNoaWxkX3Byb3h5KTsKKworICBHU1RfTE9HICgid2UgaGF2ZSAlZCBjaGlsZHJlbiIsIGVxdS0+ZnJlcV9iYW5kX2NvdW50KTsKKyAgcmV0dXJuIGVxdS0+ZnJlcV9iYW5kX2NvdW50OworfQorCitzdGF0aWMgdm9pZAorZ3N0X2lpcl9lcXVhbGl6ZXJfY2hpbGRfcHJveHlfaW50ZXJmYWNlX2luaXQgKGdwb2ludGVyIGdfaWZhY2UsCisgICAgZ3BvaW50ZXIgaWZhY2VfZGF0YSkKK3sKKyAgR3N0Q2hpbGRQcm94eUludGVyZmFjZSAqaWZhY2UgPSBnX2lmYWNlOworCisgIEdTVF9ERUJVRyAoImluaXRpYWxpemluZyBpZmFjZSIpOworCisgIGlmYWNlLT5nZXRfY2hpbGRfYnlfaW5kZXggPSBnc3RfaWlyX2VxdWFsaXplcl9jaGlsZF9wcm94eV9nZXRfY2hpbGRfYnlfaW5kZXg7CisgIGlmYWNlLT5nZXRfY2hpbGRyZW5fY291bnQgPSBnc3RfaWlyX2VxdWFsaXplcl9jaGlsZF9wcm94eV9nZXRfY2hpbGRyZW5fY291bnQ7Cit9CisKKy8qIGVxdWFsaXplciBpbXBsZW1lbnRhdGlvbiAqLworCitzdGF0aWMgdm9pZAorZ3N0X2lpcl9lcXVhbGl6ZXJfY2xhc3NfaW5pdCAoR3N0SWlyRXF1YWxpemVyQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyAqYXVkaW9fZmlsdGVyX2NsYXNzID0gKEdzdEF1ZGlvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqYnRyYW5zX2NsYXNzID0gKEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqKSBrbGFzczsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9paXJfZXF1YWxpemVyX2ZpbmFsaXplOworICBhdWRpb19maWx0ZXJfY2xhc3MtPnNldHVwID0gZ3N0X2lpcl9lcXVhbGl6ZXJfc2V0dXA7CisgIGJ0cmFuc19jbGFzcy0+dHJhbnNmb3JtX2lwID0gZ3N0X2lpcl9lcXVhbGl6ZXJfdHJhbnNmb3JtX2lwOworICBidHJhbnNfY2xhc3MtPnRyYW5zZm9ybV9pcF9vbl9wYXNzdGhyb3VnaCA9IEZBTFNFOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQUxMT1dFRF9DQVBTKTsKKyAgZ3N0X2F1ZGlvX2ZpbHRlcl9jbGFzc19hZGRfcGFkX3RlbXBsYXRlcyAoYXVkaW9fZmlsdGVyX2NsYXNzLCBjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2lpcl9lcXVhbGl6ZXJfaW5pdCAoR3N0SWlyRXF1YWxpemVyICogZXEpCit7CisgIGdfbXV0ZXhfaW5pdCAoJmVxLT5iYW5kc19sb2NrKTsKKyAgLyogQmFuZCBnYWlucyBhcmUgMCBieSBkZWZhdWx0LCBwYXNzdGhyb3VnaCB1bnRpbCB0aGV5IGFyZSBjaGFuZ2VkICovCisgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfcGFzc3Rocm91Z2ggKEdTVF9CQVNFX1RSQU5TRk9STSAoZXEpLCBUUlVFKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9paXJfZXF1YWxpemVyX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RJaXJFcXVhbGl6ZXIgKmVxdSA9IEdTVF9JSVJfRVFVQUxJWkVSIChvYmplY3QpOworICBnaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGVxdS0+ZnJlcV9iYW5kX2NvdW50OyBpKyspIHsKKyAgICBpZiAoZXF1LT5iYW5kc1tpXSkKKyAgICAgIGdzdF9vYmplY3RfdW5wYXJlbnQgKEdTVF9PQkpFQ1QgKGVxdS0+YmFuZHNbaV0pKTsKKyAgICBlcXUtPmJhbmRzW2ldID0gTlVMTDsKKyAgfQorICBlcXUtPmZyZXFfYmFuZF9jb3VudCA9IDA7CisKKyAgZ19mcmVlIChlcXUtPmJhbmRzKTsKKyAgZ19mcmVlIChlcXUtPmhpc3RvcnkpOworCisgIGdfbXV0ZXhfY2xlYXIgKCZlcXUtPmJhbmRzX2xvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworLyogRmlsdGVyIHRha2VuIGZyb20KKyAqCisgKiBUaGUgRXF1aXZhbGVuY2Ugb2YgVmFyaW91cyBNZXRob2RzIG9mIENvbXB1dGluZworICogQmlxdWFkIENvZWZmaWNpZW50cyBmb3IgQXVkaW8gUGFyYW1ldHJpYyBFcXVhbGl6ZXJzCisgKgorICogYnkgUm9iZXJ0IEJyaXN0b3ctSm9obnNvbgorICoKKyAqIGh0dHA6Ly93d3cuYWVzLm9yZy9lLWxpYi9icm93c2UuY2ZtP2VsaWI9NjMyNgorICogaHR0cDovL3d3dy5tdXNpY2RzcC5vcmcvZmlsZXMvRVEtQ29lZmZpY2llbnRzLnBkZgorICogaHR0cDovL3d3dy5tdXNpY2RzcC5vcmcvZmlsZXMvQXVkaW8tRVEtQ29va2Jvb2sudHh0CisgKgorICogVGhlIGJhbmR3aWR0aCBtZXRob2QgdGhhdCB3ZSB1c2UgaGVyZSBpcyB0aGUgcHJlZmVycmVkCisgKiBvbmUgZnJvbSB0aGlzIGFydGljbGUgdHJhbnNmb3JtZWQgZnJvbSBvY3RhdmVzIHRvIGZyZXF1ZW5jeQorICogaW4gSHouCisgKi8KK3N0YXRpYyBpbmxpbmUgZ2RvdWJsZQorYXJnX3RvX3NjYWxlIChnZG91YmxlIGFyZykKK3sKKyAgcmV0dXJuIChwb3cgKDEwLjAsIGFyZyAvIDQwLjApKTsKK30KKworc3RhdGljIGdkb3VibGUKK2NhbGN1bGF0ZV9vbWVnYSAoZ2RvdWJsZSBmcmVxLCBnaW50IHJhdGUpCit7CisgIGdkb3VibGUgb21lZ2E7CisKKyAgaWYgKGZyZXEgLyByYXRlID49IDAuNSkKKyAgICBvbWVnYSA9IEdfUEk7CisgIGVsc2UgaWYgKGZyZXEgPD0gMC4wKQorICAgIG9tZWdhID0gMC4wOworICBlbHNlCisgICAgb21lZ2EgPSAyLjAgKiBHX1BJICogKGZyZXEgLyByYXRlKTsKKworICByZXR1cm4gb21lZ2E7Cit9CisKK3N0YXRpYyBnZG91YmxlCitjYWxjdWxhdGVfYncgKEdzdElpckVxdWFsaXplckJhbmQgKiBiYW5kLCBnaW50IHJhdGUpCit7CisgIGdkb3VibGUgYncgPSAwLjA7CisKKyAgaWYgKGJhbmQtPndpZHRoIC8gcmF0ZSA+PSAwLjUpIHsKKyAgICAvKiBJZiBiYW5kd2lkdGggPT0gMC41IHRoZSBjYWxjdWxhdGlvbiBiZWxvdyBmYWlscyBhcyB0YW4oR19QSS8yKQorICAgICAqIGlzIHVuZGVmaW5lZC4gU28gc2V0IHRoZSBiYW5kd2lkdGggdG8gYSBzbGlnaHRseSBzbWFsbGVyIHZhbHVlLgorICAgICAqLworICAgIGJ3ID0gR19QSSAtIDAuMDAwMDAwMDE7CisgIH0gZWxzZSBpZiAoYmFuZC0+d2lkdGggPD0gMC4wKSB7CisgICAgLyogSWYgYmFuZHdpZHRoID09IDAgdGhpcyBiYW5kIHdvbid0IGNoYW5nZSBhbnl0aGluZyBzbyBzZXQKKyAgICAgKiB0aGUgY29lZmZpY2llbnRzIGFjY29yZGluZ2x5LiBUaGUgY29lZmZpY2llbnQgY2FsY3VsYXRpb24KKyAgICAgKiBiZWxvdyB3b3VsZCBjcmVhdGUgY29lZmZpY2llbnRzIHRoYXQgZm9yIHNvbWUgcmVhc29uIGFtcGxpZnkKKyAgICAgKiB0aGUgYmFuZC4KKyAgICAgKi8KKyAgICBiYW5kLT5hMCA9IDEuMDsKKyAgICBiYW5kLT5hMSA9IDAuMDsKKyAgICBiYW5kLT5hMiA9IDAuMDsKKyAgICBiYW5kLT5iMSA9IDAuMDsKKyAgICBiYW5kLT5iMiA9IDAuMDsKKyAgfSBlbHNlIHsKKyAgICBidyA9IDIuMCAqIEdfUEkgKiAoYmFuZC0+d2lkdGggLyByYXRlKTsKKyAgfQorICByZXR1cm4gYnc7Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cF9wZWFrX2ZpbHRlciAoR3N0SWlyRXF1YWxpemVyICogZXF1LCBHc3RJaXJFcXVhbGl6ZXJCYW5kICogYmFuZCkKK3sKKyAgZ2ludCByYXRlID0gR1NUX0FVRElPX0ZJTFRFUl9SQVRFIChlcXUpOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKHJhdGUpOworCisgIHsKKyAgICBnZG91YmxlIGdhaW4sIG9tZWdhLCBidzsKKyAgICBnZG91YmxlIGFscGhhLCBhbHBoYTEsIGFscGhhMiwgYjA7CisKKyAgICBnYWluID0gYXJnX3RvX3NjYWxlIChiYW5kLT5nYWluKTsKKyAgICBvbWVnYSA9IGNhbGN1bGF0ZV9vbWVnYSAoYmFuZC0+ZnJlcSwgcmF0ZSk7CisgICAgYncgPSBjYWxjdWxhdGVfYncgKGJhbmQsIHJhdGUpOworICAgIGlmIChidyA9PSAwLjApCisgICAgICBnb3RvIG91dDsKKworICAgIGFscGhhID0gdGFuIChidyAvIDIuMCk7CisKKyAgICBhbHBoYTEgPSBhbHBoYSAqIGdhaW47CisgICAgYWxwaGEyID0gYWxwaGEgLyBnYWluOworCisgICAgYjAgPSAoMS4wICsgYWxwaGEyKTsKKworICAgIGJhbmQtPmEwID0gKDEuMCArIGFscGhhMSkgLyBiMDsKKyAgICBiYW5kLT5hMSA9ICgtMi4wICogY29zIChvbWVnYSkpIC8gYjA7CisgICAgYmFuZC0+YTIgPSAoMS4wIC0gYWxwaGExKSAvIGIwOworICAgIGJhbmQtPmIxID0gKDIuMCAqIGNvcyAob21lZ2EpKSAvIGIwOworICAgIGJhbmQtPmIyID0gLSgxLjAgLSBhbHBoYTIpIC8gYjA7CisKKyAgb3V0OgorICAgIEdTVF9JTkZPCisgICAgICAgICgiZ2FpbiA9ICU1LjFmLCB3aWR0aD0gJTcuMmYsIGZyZXEgPSAlNy4yZiwgYTAgPSAlNy41ZywgYTEgPSAlNy41ZywgYTI9JTcuNWcgYjEgPSAlNy41ZywgYjIgPSAlNy41ZyIsCisgICAgICAgIGJhbmQtPmdhaW4sIGJhbmQtPndpZHRoLCBiYW5kLT5mcmVxLCBiYW5kLT5hMCwgYmFuZC0+YTEsIGJhbmQtPmEyLAorICAgICAgICBiYW5kLT5iMSwgYmFuZC0+YjIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cF9sb3dfc2hlbGZfZmlsdGVyIChHc3RJaXJFcXVhbGl6ZXIgKiBlcXUsIEdzdElpckVxdWFsaXplckJhbmQgKiBiYW5kKQoreworICBnaW50IHJhdGUgPSBHU1RfQVVESU9fRklMVEVSX1JBVEUgKGVxdSk7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAocmF0ZSk7CisKKyAgeworICAgIGdkb3VibGUgZ2Fpbiwgb21lZ2EsIGJ3OworICAgIGdkb3VibGUgYWxwaGEsIGRlbHRhLCBiMDsKKyAgICBnZG91YmxlIGVncCwgZWdtOworCisgICAgZ2FpbiA9IGFyZ190b19zY2FsZSAoYmFuZC0+Z2Fpbik7CisgICAgb21lZ2EgPSBjYWxjdWxhdGVfb21lZ2EgKGJhbmQtPmZyZXEsIHJhdGUpOworICAgIGJ3ID0gY2FsY3VsYXRlX2J3IChiYW5kLCByYXRlKTsKKyAgICBpZiAoYncgPT0gMC4wKQorICAgICAgZ290byBvdXQ7CisKKyAgICBlZ20gPSBnYWluIC0gMS4wOworICAgIGVncCA9IGdhaW4gKyAxLjA7CisgICAgYWxwaGEgPSB0YW4gKGJ3IC8gMi4wKTsKKworICAgIGRlbHRhID0gMi4wICogc3FydCAoZ2FpbikgKiBhbHBoYTsKKyAgICBiMCA9IGVncCArIGVnbSAqIGNvcyAob21lZ2EpICsgZGVsdGE7CisKKyAgICBiYW5kLT5hMCA9ICgoZWdwIC0gZWdtICogY29zIChvbWVnYSkgKyBkZWx0YSkgKiBnYWluKSAvIGIwOworICAgIGJhbmQtPmExID0gKChlZ20gLSBlZ3AgKiBjb3MgKG9tZWdhKSkgKiAyLjAgKiBnYWluKSAvIGIwOworICAgIGJhbmQtPmEyID0gKChlZ3AgLSBlZ20gKiBjb3MgKG9tZWdhKSAtIGRlbHRhKSAqIGdhaW4pIC8gYjA7CisgICAgYmFuZC0+YjEgPSAoKGVnbSArIGVncCAqIGNvcyAob21lZ2EpKSAqIDIuMCkgLyBiMDsKKyAgICBiYW5kLT5iMiA9IC0oKGVncCArIGVnbSAqIGNvcyAob21lZ2EpIC0gZGVsdGEpKSAvIGIwOworCisKKyAgb3V0OgorICAgIEdTVF9JTkZPCisgICAgICAgICgiZ2FpbiA9ICU1LjFmLCB3aWR0aD0gJTcuMmYsIGZyZXEgPSAlNy4yZiwgYTAgPSAlNy41ZywgYTEgPSAlNy41ZywgYTI9JTcuNWcgYjEgPSAlNy41ZywgYjIgPSAlNy41ZyIsCisgICAgICAgIGJhbmQtPmdhaW4sIGJhbmQtPndpZHRoLCBiYW5kLT5mcmVxLCBiYW5kLT5hMCwgYmFuZC0+YTEsIGJhbmQtPmEyLAorICAgICAgICBiYW5kLT5iMSwgYmFuZC0+YjIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cF9oaWdoX3NoZWxmX2ZpbHRlciAoR3N0SWlyRXF1YWxpemVyICogZXF1LCBHc3RJaXJFcXVhbGl6ZXJCYW5kICogYmFuZCkKK3sKKyAgZ2ludCByYXRlID0gR1NUX0FVRElPX0ZJTFRFUl9SQVRFIChlcXUpOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKHJhdGUpOworCisgIHsKKyAgICBnZG91YmxlIGdhaW4sIG9tZWdhLCBidzsKKyAgICBnZG91YmxlIGFscGhhLCBkZWx0YSwgYjA7CisgICAgZ2RvdWJsZSBlZ3AsIGVnbTsKKworICAgIGdhaW4gPSBhcmdfdG9fc2NhbGUgKGJhbmQtPmdhaW4pOworICAgIG9tZWdhID0gY2FsY3VsYXRlX29tZWdhIChiYW5kLT5mcmVxLCByYXRlKTsKKyAgICBidyA9IGNhbGN1bGF0ZV9idyAoYmFuZCwgcmF0ZSk7CisgICAgaWYgKGJ3ID09IDAuMCkKKyAgICAgIGdvdG8gb3V0OworCisgICAgZWdtID0gZ2FpbiAtIDEuMDsKKyAgICBlZ3AgPSBnYWluICsgMS4wOworICAgIGFscGhhID0gdGFuIChidyAvIDIuMCk7CisKKyAgICBkZWx0YSA9IDIuMCAqIHNxcnQgKGdhaW4pICogYWxwaGE7CisgICAgYjAgPSBlZ3AgLSBlZ20gKiBjb3MgKG9tZWdhKSArIGRlbHRhOworCisgICAgYmFuZC0+YTAgPSAoKGVncCArIGVnbSAqIGNvcyAob21lZ2EpICsgZGVsdGEpICogZ2FpbikgLyBiMDsKKyAgICBiYW5kLT5hMSA9ICgoZWdtICsgZWdwICogY29zIChvbWVnYSkpICogLTIuMCAqIGdhaW4pIC8gYjA7CisgICAgYmFuZC0+YTIgPSAoKGVncCArIGVnbSAqIGNvcyAob21lZ2EpIC0gZGVsdGEpICogZ2FpbikgLyBiMDsKKyAgICBiYW5kLT5iMSA9ICgoZWdtIC0gZWdwICogY29zIChvbWVnYSkpICogLTIuMCkgLyBiMDsKKyAgICBiYW5kLT5iMiA9IC0oKGVncCAtIGVnbSAqIGNvcyAob21lZ2EpIC0gZGVsdGEpKSAvIGIwOworCisKKyAgb3V0OgorICAgIEdTVF9JTkZPCisgICAgICAgICgiZ2FpbiA9ICU1LjFmLCB3aWR0aD0gJTcuMmYsIGZyZXEgPSAlNy4yZiwgYTAgPSAlNy41ZywgYTEgPSAlNy41ZywgYTI9JTcuNWcgYjEgPSAlNy41ZywgYjIgPSAlNy41ZyIsCisgICAgICAgIGJhbmQtPmdhaW4sIGJhbmQtPndpZHRoLCBiYW5kLT5mcmVxLCBiYW5kLT5hMCwgYmFuZC0+YTEsIGJhbmQtPmEyLAorICAgICAgICBiYW5kLT5iMSwgYmFuZC0+YjIpOworICB9Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggYmFuZHNfbG9jayBhbmQgdHJhbnNmb3JtIGxvY2shICovCitzdGF0aWMgdm9pZAorc2V0X3Bhc3N0aHJvdWdoIChHc3RJaXJFcXVhbGl6ZXIgKiBlcXUpCit7CisgIGdpbnQgaTsKKyAgZ2Jvb2xlYW4gcGFzc3Rocm91Z2ggPSBUUlVFOworCisgIGZvciAoaSA9IDA7IGkgPCBlcXUtPmZyZXFfYmFuZF9jb3VudDsgaSsrKSB7CisgICAgcGFzc3Rocm91Z2ggPSBwYXNzdGhyb3VnaCAmJiAoZXF1LT5iYW5kc1tpXS0+Z2FpbiA9PSAwLjApOworICB9CisKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9wYXNzdGhyb3VnaCAoR1NUX0JBU0VfVFJBTlNGT1JNIChlcXUpLCBwYXNzdGhyb3VnaCk7CisgIEdTVF9ERUJVRyAoIlBhc3N0aHJvdWdoIG1vZGU6ICVkXG4iLCBwYXNzdGhyb3VnaCk7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggYmFuZHNfbG9jayBhbmQgdHJhbnNmb3JtIGxvY2shICovCitzdGF0aWMgdm9pZAordXBkYXRlX2NvZWZmaWNpZW50cyAoR3N0SWlyRXF1YWxpemVyICogZXF1KQoreworICBnaW50IGksIG4gPSBlcXUtPmZyZXFfYmFuZF9jb3VudDsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgaWYgKGVxdS0+YmFuZHNbaV0tPnR5cGUgPT0gQkFORF9UWVBFX1BFQUspCisgICAgICBzZXR1cF9wZWFrX2ZpbHRlciAoZXF1LCBlcXUtPmJhbmRzW2ldKTsKKyAgICBlbHNlIGlmIChlcXUtPmJhbmRzW2ldLT50eXBlID09IEJBTkRfVFlQRV9MT1dfU0hFTEYpCisgICAgICBzZXR1cF9sb3dfc2hlbGZfZmlsdGVyIChlcXUsIGVxdS0+YmFuZHNbaV0pOworICAgIGVsc2UKKyAgICAgIHNldHVwX2hpZ2hfc2hlbGZfZmlsdGVyIChlcXUsIGVxdS0+YmFuZHNbaV0pOworICB9CisKKyAgZXF1LT5uZWVkX25ld19jb2VmZmljaWVudHMgPSBGQUxTRTsKK30KKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCB0cmFuc2Zvcm0gbG9jayEgKi8KK3N0YXRpYyB2b2lkCithbGxvY19oaXN0b3J5IChHc3RJaXJFcXVhbGl6ZXIgKiBlcXUsIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIC8qIGZyZWUgKyBhbGxvYyA9IG5vIG1lbWNweSAqLworICBnX2ZyZWUgKGVxdS0+aGlzdG9yeSk7CisgIGVxdS0+aGlzdG9yeSA9CisgICAgICBnX21hbGxvYzAgKGVxdS0+aGlzdG9yeV9zaXplICogR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKGluZm8pICoKKyAgICAgIGVxdS0+ZnJlcV9iYW5kX2NvdW50KTsKK30KKwordm9pZAorZ3N0X2lpcl9lcXVhbGl6ZXJfY29tcHV0ZV9mcmVxdWVuY2llcyAoR3N0SWlyRXF1YWxpemVyICogZXF1LCBndWludCBuZXdfY291bnQpCit7CisgIGd1aW50IG9sZF9jb3VudCwgaTsKKyAgZ2RvdWJsZSBmcmVxMCwgZnJlcTEsIHN0ZXA7CisgIGdjaGFyIG5hbWVbMjBdOworCisgIGlmIChlcXUtPmZyZXFfYmFuZF9jb3VudCA9PSBuZXdfY291bnQpCisgICAgcmV0dXJuOworCisgIEJBTkRTX0xPQ0sgKGVxdSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGVxdS0+ZnJlcV9iYW5kX2NvdW50ID09IG5ld19jb3VudCkpIHsKKyAgICBCQU5EU19VTkxPQ0sgKGVxdSk7CisgICAgcmV0dXJuOworICB9CisKKyAgb2xkX2NvdW50ID0gZXF1LT5mcmVxX2JhbmRfY291bnQ7CisgIGVxdS0+ZnJlcV9iYW5kX2NvdW50ID0gbmV3X2NvdW50OworICBHU1RfREVCVUcgKCJiYW5kcyAldSAtPiAldSIsIG9sZF9jb3VudCwgbmV3X2NvdW50KTsKKworICBpZiAob2xkX2NvdW50IDwgbmV3X2NvdW50KSB7CisgICAgLyogYWRkIG5ldyBiYW5kcyAqLworICAgIGVxdS0+YmFuZHMgPSBnX3JlYWxsb2MgKGVxdS0+YmFuZHMsIHNpemVvZiAoR3N0T2JqZWN0ICopICogbmV3X2NvdW50KTsKKyAgICBmb3IgKGkgPSBvbGRfY291bnQ7IGkgPCBuZXdfY291bnQ7IGkrKykgeworICAgICAgLyogb3RoZXJ3aXNlIHRoZXkgZ2V0IG5hbWVzIGxpa2UgJ2lpcmVxdWFsaXplcmJhbmQ1JyAqLworICAgICAgc3ByaW50ZiAobmFtZSwgImJhbmQldSIsIGkpOworICAgICAgZXF1LT5iYW5kc1tpXSA9IGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfSUlSX0VRVUFMSVpFUl9CQU5ELAorICAgICAgICAgICJuYW1lIiwgbmFtZSwgTlVMTCk7CisgICAgICBHU1RfREVCVUcgKCJhZGRpbmcgYmFuZFslZF09JXAiLCBpLCBlcXUtPmJhbmRzW2ldKTsKKworICAgICAgZ3N0X29iamVjdF9zZXRfcGFyZW50IChHU1RfT0JKRUNUIChlcXUtPmJhbmRzW2ldKSwgR1NUX09CSkVDVCAoZXF1KSk7CisgICAgICBnc3RfY2hpbGRfcHJveHlfY2hpbGRfYWRkZWQgKEdTVF9DSElMRF9QUk9YWSAoZXF1KSwKKyAgICAgICAgICBHX09CSkVDVCAoZXF1LT5iYW5kc1tpXSksIG5hbWUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBmcmVlIHVudXNlZCBiYW5kcyAqLworICAgIGZvciAoaSA9IG5ld19jb3VudDsgaSA8IG9sZF9jb3VudDsgaSsrKSB7CisgICAgICBHU1RfREVCVUcgKCJyZW1vdmluZyBiYW5kWyVkXT0lcCIsIGksIGVxdS0+YmFuZHNbaV0pOworICAgICAgZ3N0X2NoaWxkX3Byb3h5X2NoaWxkX3JlbW92ZWQgKEdTVF9DSElMRF9QUk9YWSAoZXF1KSwKKyAgICAgICAgICBHX09CSkVDVCAoZXF1LT5iYW5kc1tpXSksIEdTVF9PQkpFQ1RfTkFNRSAoZXF1LT5iYW5kc1tpXSkpOworICAgICAgZ3N0X29iamVjdF91bnBhcmVudCAoR1NUX09CSkVDVCAoZXF1LT5iYW5kc1tpXSkpOworICAgICAgZXF1LT5iYW5kc1tpXSA9IE5VTEw7CisgICAgfQorICB9CisKKyAgYWxsb2NfaGlzdG9yeSAoZXF1LCBHU1RfQVVESU9fRklMVEVSX0lORk8gKGVxdSkpOworCisgIC8qIHNldCBjZW50ZXIgZnJlcXVlbmNpZXMgYW5kIG5hbWUgYmFuZCBvYmplY3RzCisgICAqIEZJWE1FOiBhcmchIHdlIGNhbid0IGNoYW5nZSB0aGUgbmFtZSBvZiBwYXJlbnRlZCBvYmplY3RzIDooCisgICAqICAgYXBwbGljYXRpb24gc2hvdWxkIHJlYWQgYmFuZC0+ZnJlcSB0byBnZXQgdGhlIG5hbWUKKyAgICovCisKKyAgc3RlcCA9IHBvdyAoSElHSEVTVF9GUkVRIC8gTE9XRVNUX0ZSRVEsIDEuMCAvIG5ld19jb3VudCk7CisgIGZyZXEwID0gTE9XRVNUX0ZSRVE7CisgIGZvciAoaSA9IDA7IGkgPCBuZXdfY291bnQ7IGkrKykgeworICAgIGZyZXExID0gZnJlcTAgKiBzdGVwOworCisgICAgaWYgKGkgPT0gMCkKKyAgICAgIGVxdS0+YmFuZHNbaV0tPnR5cGUgPSBCQU5EX1RZUEVfTE9XX1NIRUxGOworICAgIGVsc2UgaWYgKGkgPT0gbmV3X2NvdW50IC0gMSkKKyAgICAgIGVxdS0+YmFuZHNbaV0tPnR5cGUgPSBCQU5EX1RZUEVfSElHSF9TSEVMRjsKKyAgICBlbHNlCisgICAgICBlcXUtPmJhbmRzW2ldLT50eXBlID0gQkFORF9UWVBFX1BFQUs7CisKKyAgICBlcXUtPmJhbmRzW2ldLT5mcmVxID0gZnJlcTAgKyAoKGZyZXExIC0gZnJlcTApIC8gMi4wKTsKKyAgICBlcXUtPmJhbmRzW2ldLT53aWR0aCA9IGZyZXExIC0gZnJlcTA7CisgICAgR1NUX0RFQlVHICgiYmFuZFslMmRdID0gJyVsZiciLCBpLCBlcXUtPmJhbmRzW2ldLT5mcmVxKTsKKworICAgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKGVxdS0+YmFuZHNbaV0pLCAiYmFuZHdpZHRoIik7CisgICAgZ19vYmplY3Rfbm90aWZ5IChHX09CSkVDVCAoZXF1LT5iYW5kc1tpXSksICJmcmVxIik7CisgICAgZ19vYmplY3Rfbm90aWZ5IChHX09CSkVDVCAoZXF1LT5iYW5kc1tpXSksICJ0eXBlIik7CisKKyAgICAvKgorICAgICAgIGlmKGVxdS0+YmFuZHNbaV0tPmZyZXE8MTAwMDAuMCkKKyAgICAgICBzcHJpbnRmIChuYW1lLCIlZEh6IiwoZ2ludCllcXUtPmJhbmRzW2ldLT5mcmVxKTsKKyAgICAgICBlbHNlCisgICAgICAgc3ByaW50ZiAobmFtZSwiJWRrSHoiLChnaW50KShlcXUtPmJhbmRzW2ldLT5mcmVxLzEwMDAuMCkpOworICAgICAgIGdzdF9vYmplY3Rfc2V0X25hbWUoIEdTVF9PQkpFQ1QgKGVxdS0+YmFuZHNbaV0pLCBuYW1lKTsKKyAgICAgICBHU1RfREVCVUcgKCJiYW5kWyUyZF0gPSAnJXMnIixpLG5hbWUpOworICAgICAqLworICAgIGZyZXEwID0gZnJlcTE7CisgIH0KKworICBlcXUtPm5lZWRfbmV3X2NvZWZmaWNpZW50cyA9IFRSVUU7CisgIEJBTkRTX1VOTE9DSyAoZXF1KTsKK30KKworLyogc3RhcnQgb2YgY29kZSB0aGF0IGlzIHR5cGUgc3BlY2lmaWMgKi8KKworI2RlZmluZSBDUkVBVEVfT1BUSU1JWkVEX0ZVTkNUSU9OU19JTlQoVFlQRSxCSUdfVFlQRSxNSU5fVkFMLE1BWF9WQUwpICAgXAordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCSUdfVFlQRSB4MSwgeDI7ICAgICAgICAgIC8qIGhpc3Rvcnkgb2YgaW5wdXQgdmFsdWVzIGZvciBhIGZpbHRlciAqLyAgXAorICBCSUdfVFlQRSB5MSwgeTI7ICAgICAgICAgIC8qIGhpc3Rvcnkgb2Ygb3V0cHV0IHZhbHVlcyBmb3IgYSBmaWx0ZXIgKi8gXAorfSBTZWNvbmRPcmRlckhpc3RvcnkgIyMgVFlQRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGlubGluZSBCSUdfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorb25lX3N0ZXBfICMjIFRZUEUgKEdzdElpckVxdWFsaXplckJhbmQgKmZpbHRlciwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNlY29uZE9yZGVySGlzdG9yeSAjIyBUWVBFICpoaXN0b3J5LCBCSUdfVFlQRSBpbnB1dCkgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBjYWxjdWxhdGUgb3V0cHV0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCSUdfVFlQRSBvdXRwdXQgPSBmaWx0ZXItPmEwICogaW5wdXQgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZmlsdGVyLT5hMSAqIGhpc3RvcnktPngxICsgZmlsdGVyLT5hMiAqIGhpc3RvcnktPngyICsgICAgICAgICAgICAgXAorICAgICAgZmlsdGVyLT5iMSAqIGhpc3RvcnktPnkxICsgZmlsdGVyLT5iMiAqIGhpc3RvcnktPnkyOyAgICAgICAgICAgICAgXAorICAvKiB1cGRhdGUgaGlzdG9yeSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBoaXN0b3J5LT55MiA9IGhpc3RvcnktPnkxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBoaXN0b3J5LT55MSA9IG91dHB1dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBoaXN0b3J5LT54MiA9IGhpc3RvcnktPngxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBoaXN0b3J5LT54MSA9IGlucHV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gb3V0cHV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGNvbnN0IGd1aW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraGlzdG9yeV9zaXplXyAjIyBUWVBFID0gc2l6ZW9mIChTZWNvbmRPcmRlckhpc3RvcnkgIyMgVFlQRSk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZ3N0X2lpcl9lcXVfcHJvY2Vzc18gIyMgVFlQRSAoR3N0SWlyRXF1YWxpemVyICplcXUsIGd1aW50OCAqZGF0YSwgICAgICAgXAorZ3VpbnQgc2l6ZSwgZ3VpbnQgY2hhbm5lbHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBndWludCBmcmFtZXMgPSBzaXplIC8gY2hhbm5lbHMgLyBzaXplb2YgKFRZUEUpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICBndWludCBpLCBjLCBmLCBuZiA9IGVxdS0+ZnJlcV9iYW5kX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCSUdfVFlQRSBjdXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHc3RJaXJFcXVhbGl6ZXJCYW5kICoqZmlsdGVycyA9IGVxdS0+YmFuZHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVzOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNlY29uZE9yZGVySGlzdG9yeSAjIyBUWVBFICpoaXN0b3J5ID0gZXF1LT5oaXN0b3J5OyAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoYyA9IDA7IGMgPCBjaGFubmVsczsgYysrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY3VyID0gKigoVFlQRSAqKSBkYXRhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZm9yIChmID0gMDsgZiA8IG5mOyBmKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjdXIgPSBvbmVfc3RlcF8gIyMgVFlQRSAoZmlsdGVyc1tmXSwgaGlzdG9yeSwgY3VyKTsgICAgICAgICAgICAgXAorICAgICAgICBoaXN0b3J5Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY3VyID0gQ0xBTVAgKGN1ciwgTUlOX1ZBTCwgTUFYX1ZBTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKigoVFlQRSAqKSBkYXRhKSA9IChUWVBFKSBmbG9vciAoY3VyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZGF0YSArPSBzaXplb2YgKFRZUEUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENSRUFURV9PUFRJTUlaRURfRlVOQ1RJT05TKFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRZUEUgeDEsIHgyOyAgICAgICAgICAvKiBoaXN0b3J5IG9mIGlucHV0IHZhbHVlcyBmb3IgYSBmaWx0ZXIgKi8gIFwKKyAgVFlQRSB5MSwgeTI7ICAgICAgICAgIC8qIGhpc3Rvcnkgb2Ygb3V0cHV0IHZhbHVlcyBmb3IgYSBmaWx0ZXIgKi8gXAorfSBTZWNvbmRPcmRlckhpc3RvcnkgIyMgVFlQRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGlubGluZSBUWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorb25lX3N0ZXBfICMjIFRZUEUgKEdzdElpckVxdWFsaXplckJhbmQgKmZpbHRlciwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNlY29uZE9yZGVySGlzdG9yeSAjIyBUWVBFICpoaXN0b3J5LCBUWVBFIGlucHV0KSAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBjYWxjdWxhdGUgb3V0cHV0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUWVBFIG91dHB1dCA9IGZpbHRlci0+YTAgKiBpbnB1dCArIGZpbHRlci0+YTEgKiBoaXN0b3J5LT54MSArICAgICAgICAgXAorICAgICAgZmlsdGVyLT5hMiAqIGhpc3RvcnktPngyICsgZmlsdGVyLT5iMSAqIGhpc3RvcnktPnkxICsgICAgICAgICAgICAgXAorICAgICAgZmlsdGVyLT5iMiAqIGhpc3RvcnktPnkyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiB1cGRhdGUgaGlzdG9yeSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBoaXN0b3J5LT55MiA9IGhpc3RvcnktPnkxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBoaXN0b3J5LT55MSA9IG91dHB1dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBoaXN0b3J5LT54MiA9IGhpc3RvcnktPngxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBoaXN0b3J5LT54MSA9IGlucHV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gb3V0cHV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGNvbnN0IGd1aW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraGlzdG9yeV9zaXplXyAjIyBUWVBFID0gc2l6ZW9mIChTZWNvbmRPcmRlckhpc3RvcnkgIyMgVFlQRSk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZ3N0X2lpcl9lcXVfcHJvY2Vzc18gIyMgVFlQRSAoR3N0SWlyRXF1YWxpemVyICplcXUsIGd1aW50OCAqZGF0YSwgICAgICAgXAorZ3VpbnQgc2l6ZSwgZ3VpbnQgY2hhbm5lbHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBndWludCBmcmFtZXMgPSBzaXplIC8gY2hhbm5lbHMgLyBzaXplb2YgKFRZUEUpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICBndWludCBpLCBjLCBmLCBuZiA9IGVxdS0+ZnJlcV9iYW5kX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUWVBFIGN1cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHc3RJaXJFcXVhbGl6ZXJCYW5kICoqZmlsdGVycyA9IGVxdS0+YmFuZHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVzOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNlY29uZE9yZGVySGlzdG9yeSAjIyBUWVBFICpoaXN0b3J5ID0gZXF1LT5oaXN0b3J5OyAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoYyA9IDA7IGMgPCBjaGFubmVsczsgYysrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY3VyID0gKigoVFlQRSAqKSBkYXRhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZm9yIChmID0gMDsgZiA8IG5mOyBmKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjdXIgPSBvbmVfc3RlcF8gIyMgVFlQRSAoZmlsdGVyc1tmXSwgaGlzdG9yeSwgY3VyKTsgICAgICAgICAgICAgXAorICAgICAgICBoaXN0b3J5Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKigoVFlQRSAqKSBkYXRhKSA9IChUWVBFKSBjdXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZGF0YSArPSBzaXplb2YgKFRZUEUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitDUkVBVEVfT1BUSU1JWkVEX0ZVTkNUSU9OU19JTlQgKGdpbnQxNiwgZ2Zsb2F0LCAtMzI3NjguMCwgMzI3NjcuMCk7CitDUkVBVEVfT1BUSU1JWkVEX0ZVTkNUSU9OUyAoZ2Zsb2F0KTsKK0NSRUFURV9PUFRJTUlaRURfRlVOQ1RJT05TIChnZG91YmxlKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9paXJfZXF1YWxpemVyX3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJ0cmFucywgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RBdWRpb0ZpbHRlciAqZmlsdGVyID0gR1NUX0FVRElPX0ZJTFRFUiAoYnRyYW5zKTsKKyAgR3N0SWlyRXF1YWxpemVyICplcXUgPSBHU1RfSUlSX0VRVUFMSVpFUiAoYnRyYW5zKTsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdpbnQgY2hhbm5lbHMgPSBHU1RfQVVESU9fRklMVEVSX0NIQU5ORUxTIChmaWx0ZXIpOworICBnYm9vbGVhbiBuZWVkX25ld19jb2VmZmljaWVudHM7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGNoYW5uZWxzIDwgMSB8fCBlcXUtPnByb2Nlc3MgPT0gTlVMTCkpCisgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworCisgIEJBTkRTX0xPQ0sgKGVxdSk7CisgIG5lZWRfbmV3X2NvZWZmaWNpZW50cyA9IGVxdS0+bmVlZF9uZXdfY29lZmZpY2llbnRzOworICBCQU5EU19VTkxPQ0sgKGVxdSk7CisKKyAgdGltZXN0YW1wID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1Zik7CisgIHRpbWVzdGFtcCA9CisgICAgICBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJmJ0cmFucy0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLCB0aW1lc3RhbXApOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAodGltZXN0YW1wKSkgeworICAgIEdzdElpckVxdWFsaXplckJhbmQgKipmaWx0ZXJzID0gZXF1LT5iYW5kczsKKyAgICBndWludCBmLCBuZiA9IGVxdS0+ZnJlcV9iYW5kX2NvdW50OworCisgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoZXF1KSwgdGltZXN0YW1wKTsKKworICAgIC8qIHN5bmMgdmFsdWVzIGZvciBiYW5kcyB0b28gKi8KKyAgICAvKiBGSVhNRTogaXRlcmF0aW5nIGVxdS0+YmFuZHMgaXMgbm90IHRocmVhZC1zYWZlIGhlcmUgKi8KKyAgICBmb3IgKGYgPSAwOyBmIDwgbmY7IGYrKykgeworICAgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoZmlsdGVyc1tmXSksIHRpbWVzdGFtcCk7CisgICAgfQorICB9CisKKyAgQkFORFNfTE9DSyAoZXF1KTsKKyAgaWYgKG5lZWRfbmV3X2NvZWZmaWNpZW50cykgeworICAgIHVwZGF0ZV9jb2VmZmljaWVudHMgKGVxdSk7CisgIH0KKyAgQkFORFNfVU5MT0NLIChlcXUpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgZXF1LT5wcm9jZXNzIChlcXUsIG1hcC5kYXRhLCBtYXAuc2l6ZSwgY2hhbm5lbHMpOworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfaWlyX2VxdWFsaXplcl9zZXR1cCAoR3N0QXVkaW9GaWx0ZXIgKiBhdWRpbywgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbykKK3sKKyAgR3N0SWlyRXF1YWxpemVyICplcXUgPSBHU1RfSUlSX0VRVUFMSVpFUiAoYXVkaW8pOworCisgIHN3aXRjaCAoR1NUX0FVRElPX0lORk9fRk9STUFUIChpbmZvKSkgeworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMTY6CisgICAgICBlcXUtPmhpc3Rvcnlfc2l6ZSA9IGhpc3Rvcnlfc2l6ZV9naW50MTY7CisgICAgICBlcXUtPnByb2Nlc3MgPSBnc3RfaWlyX2VxdV9wcm9jZXNzX2dpbnQxNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GMzI6CisgICAgICBlcXUtPmhpc3Rvcnlfc2l6ZSA9IGhpc3Rvcnlfc2l6ZV9nZmxvYXQ7CisgICAgICBlcXUtPnByb2Nlc3MgPSBnc3RfaWlyX2VxdV9wcm9jZXNzX2dmbG9hdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GNjQ6CisgICAgICBlcXUtPmhpc3Rvcnlfc2l6ZSA9IGhpc3Rvcnlfc2l6ZV9nZG91YmxlOworICAgICAgZXF1LT5wcm9jZXNzID0gZ3N0X2lpcl9lcXVfcHJvY2Vzc19nZG91YmxlOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGFsbG9jX2hpc3RvcnkgKGVxdSwgaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGVxdWFsaXplcl9kZWJ1ZywgImVxdWFsaXplciIsIDAsICJlcXVhbGl6ZXIiKTsKKworICBpZiAoIShnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiZXF1YWxpemVyLW5iYW5kcyIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgICAgIEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfTkJBTkRTKSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghKGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJlcXVhbGl6ZXItM2JhbmRzIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICAgICAgR1NUX1RZUEVfSUlSX0VRVUFMSVpFUl8zQkFORFMpKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCEoZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImVxdWFsaXplci0xMGJhbmRzIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICAgICAgR1NUX1RZUEVfSUlSX0VRVUFMSVpFUl8xMEJBTkRTKSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgZXF1YWxpemVyLAorICAgICJHU3RyZWFtZXIgYXVkaW8gZXF1YWxpemVycyIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sIEdTVF9MSUNFTlNFLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5oIGIvZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmE3MGVlZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmgKQEAgLTAsMCArMSw3NiBAQAorLyogR1N0cmVhbWVyIElJUiBlcXVhbGl6ZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDQ+IEJlbmphbWluIE90dGUgPG90dGVAZ25vbWUub3JnPgorICogICAgICAgICAgICAgICA8MjAwNz4gU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfSUlSX0VRVUFMSVpFUl9fCisjZGVmaW5lIF9fR1NUX0lJUl9FUVVBTElaRVJfXworCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RJaXJFcXVhbGl6ZXIgR3N0SWlyRXF1YWxpemVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdElpckVxdWFsaXplckNsYXNzIEdzdElpckVxdWFsaXplckNsYXNzOwordHlwZWRlZiBzdHJ1Y3QgX0dzdElpckVxdWFsaXplckJhbmQgR3N0SWlyRXF1YWxpemVyQmFuZDsKKworI2RlZmluZSBHU1RfVFlQRV9JSVJfRVFVQUxJWkVSIFwKKyAgKGdzdF9paXJfZXF1YWxpemVyX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9JSVJfRVFVQUxJWkVSKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfSUlSX0VRVUFMSVpFUixHc3RJaXJFcXVhbGl6ZXIpKQorI2RlZmluZSBHU1RfSUlSX0VRVUFMSVpFUl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9JSVJfRVFVQUxJWkVSLEdzdElpckVxdWFsaXplckNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0lJUl9FUVVBTElaRVIob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9JSVJfRVFVQUxJWkVSKSkKKyNkZWZpbmUgR1NUX0lTX0lJUl9FUVVBTElaRVJfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfSUlSX0VRVUFMSVpFUikpCisKKyNkZWZpbmUgTE9XRVNUX0ZSRVEgKDIwLjApCisjZGVmaW5lIEhJR0hFU1RfRlJFUSAoMjAwMDAuMCkKKwordHlwZWRlZiB2b2lkICgqUHJvY2Vzc0Z1bmMpIChHc3RJaXJFcXVhbGl6ZXIgKiBlcSwgZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgc2l6ZSwKKyAgICBndWludCBjaGFubmVscyk7CisKK3N0cnVjdCBfR3N0SWlyRXF1YWxpemVyCit7CisgIEdzdEF1ZGlvRmlsdGVyIGF1ZGlvZmlsdGVyOworCisgIC8qPCBwcml2YXRlID4qLworCisgIEdNdXRleCBiYW5kc19sb2NrOworICBHc3RJaXJFcXVhbGl6ZXJCYW5kICoqYmFuZHM7CisKKyAgLyogcHJvcGVydGllcyAqLworICBndWludCBmcmVxX2JhbmRfY291bnQ7CisgIC8qIGZvciBlYWNoIGJhbmQgYW5kIGNoYW5uZWwgKi8KKyAgZ3BvaW50ZXIgaGlzdG9yeTsKKyAgZ3VpbnQgaGlzdG9yeV9zaXplOworCisgIGdib29sZWFuIG5lZWRfbmV3X2NvZWZmaWNpZW50czsKKworICBQcm9jZXNzRnVuYyBwcm9jZXNzOworfTsKKworc3RydWN0IF9Hc3RJaXJFcXVhbGl6ZXJDbGFzcworeworICBHc3RBdWRpb0ZpbHRlckNsYXNzIGF1ZGlvZmlsdGVyX2NsYXNzOworfTsKKworZXh0ZXJuIHZvaWQgZ3N0X2lpcl9lcXVhbGl6ZXJfY29tcHV0ZV9mcmVxdWVuY2llcyAoR3N0SWlyRXF1YWxpemVyICogZXF1LCBndWludCBuZXdfY291bnQpOworCitleHRlcm4gR1R5cGUgZ3N0X2lpcl9lcXVhbGl6ZXJfZ2V0X3R5cGUodm9pZCk7CisKKyNlbmRpZiAvKiBfX0dTVF9JSVJfRVFVQUxJWkVSX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5jIGIvZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiYmY1MwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5jCkBAIC0wLDAgKzEsMjI5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1lcXVhbGl6ZXItMTBiYW5kcworICoKKyAqIFRoZSAxMCBiYW5kIGVxdWFsaXplciBlbGVtZW50IGFsbG93cyB0byBjaGFuZ2UgdGhlIGdhaW4gb2YgMTAgZXF1YWxseSBkaXN0cmlidXRlZAorICogZnJlcXVlbmN5IGJhbmRzIGJldHdlZW4gMzAgSHogYW5kIDE1IGtIei4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj1zb25nLm9nZyAhIG9nZ2RlbXV4ICEgdm9yYmlzZGVjICEgYXVkaW9jb252ZXJ0ICEgZXF1YWxpemVyLTEwYmFuZHMgYmFuZDI9My4wICEgYWxzYXNpbmsKKyAqIF18IFRoaXMgcmFpc2VzIHRoZSB2b2x1bWUgb2YgdGhlIDNyZCBiYW5kIHdoaWNoIGlzIGF0IDExOSBIeiBieSAzIGRiLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RpaXJlcXVhbGl6ZXIuaCIKKyNpbmNsdWRlICJnc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmgiCisKKworZW51bQoreworICBQUk9QX0JBTkQwID0gMSwKKyAgUFJPUF9CQU5EMSwKKyAgUFJPUF9CQU5EMiwKKyAgUFJPUF9CQU5EMywKKyAgUFJPUF9CQU5ENCwKKyAgUFJPUF9CQU5ENSwKKyAgUFJPUF9CQU5ENiwKKyAgUFJPUF9CQU5ENywKKyAgUFJPUF9CQU5EOCwKKyAgUFJPUF9CQU5EOSwKK307CisKK3N0YXRpYyB2b2lkIGdzdF9paXJfZXF1YWxpemVyXzEwYmFuZHNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2lpcl9lcXVhbGl6ZXJfMTBiYW5kc19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKGVxdWFsaXplcl9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBlcXVhbGl6ZXJfZGVidWcKKworCisjZGVmaW5lIGdzdF9paXJfZXF1YWxpemVyXzEwYmFuZHNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0SWlyRXF1YWxpemVyMTBCYW5kcywgZ3N0X2lpcl9lcXVhbGl6ZXJfMTBiYW5kcywKKyAgICBHU1RfVFlQRV9JSVJfRVFVQUxJWkVSKTsKKworLyogZXF1YWxpemVyIGltcGxlbWVudGF0aW9uICovCisKK3N0YXRpYyB2b2lkCitnc3RfaWlyX2VxdWFsaXplcl8xMGJhbmRzX2NsYXNzX2luaXQgKEdzdElpckVxdWFsaXplcjEwQmFuZHNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9paXJfZXF1YWxpemVyXzEwYmFuZHNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfaWlyX2VxdWFsaXplcl8xMGJhbmRzX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0JBTkQwLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoImJhbmQwIiwgIjI5IEh6IiwKKyAgICAgICAgICAiZ2FpbiBmb3IgdGhlIGZyZXF1ZW5jeSBiYW5kIDI5IEh6LCByYW5naW5nIGZyb20gLTI0IGRCIHRvICsxMiBkQiIsCisgICAgICAgICAgLTI0LjAsIDEyLjAsIDAuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFORDEsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYmFuZDEiLCAiNTkgSHoiLAorICAgICAgICAgICJnYWluIGZvciB0aGUgZnJlcXVlbmN5IGJhbmQgNTkgSHosIHJhbmdpbmcgZnJvbSAtMjQgZEIgdG8gKzEyIGRCIiwKKyAgICAgICAgICAtMjQuMCwgMTIuMCwgMC4wLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9CQU5EMiwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJiYW5kMiIsICIxMTkgSHoiLAorICAgICAgICAgICJnYWluIGZvciB0aGUgZnJlcXVlbmN5IGJhbmQgMTE5IEh6LCByYW5naW5nIGZyb20gLTI0IGRCIHRvICsxMiBkQiIsCisgICAgICAgICAgLTI0LjAsIDEyLjAsIDAuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFORDMsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYmFuZDMiLCAiMjM3IEh6IiwKKyAgICAgICAgICAiZ2FpbiBmb3IgdGhlIGZyZXF1ZW5jeSBiYW5kIDIzNyBIeiwgcmFuZ2luZyBmcm9tIC0yNCBkQiB0byArMTIgZEIiLAorICAgICAgICAgIC0yNC4wLCAxMi4wLCAwLjAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSkpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0JBTkQ0LAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoImJhbmQ0IiwgIjQ3NCBIeiIsCisgICAgICAgICAgImdhaW4gZm9yIHRoZSBmcmVxdWVuY3kgYmFuZCA0NzQgSHosIHJhbmdpbmcgZnJvbSAtMjQgZEIgdG8gKzEyIGRCIiwKKyAgICAgICAgICAtMjQuMCwgMTIuMCwgMC4wLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9CQU5ENSwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJiYW5kNSIsICI5NDcgSHoiLAorICAgICAgICAgICJnYWluIGZvciB0aGUgZnJlcXVlbmN5IGJhbmQgOTQ3IEh6LCByYW5naW5nIGZyb20gLTI0IGRCIHRvICsxMiBkQiIsCisgICAgICAgICAgLTI0LjAsIDEyLjAsIDAuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFORDYsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYmFuZDYiLCAiMTg4OSBIeiIsCisgICAgICAgICAgImdhaW4gZm9yIHRoZSBmcmVxdWVuY3kgYmFuZCAxODg5IEh6LCByYW5naW5nIGZyb20gLTI0IGRCIHRvICsxMiBkQiIsCisgICAgICAgICAgLTI0LjAsIDEyLjAsIDAuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFORDcsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYmFuZDciLCAiMzc3MCBIeiIsCisgICAgICAgICAgImdhaW4gZm9yIHRoZSBmcmVxdWVuY3kgYmFuZCAzNzcwIEh6LCByYW5naW5nIGZyb20gLTI0IGRCIHRvICsxMiBkQiIsCisgICAgICAgICAgLTI0LjAsIDEyLjAsIDAuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFORDgsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYmFuZDgiLCAiNzUyMyBIeiIsCisgICAgICAgICAgImdhaW4gZm9yIHRoZSBmcmVxdWVuY3kgYmFuZCA3NTIzIEh6LCByYW5naW5nIGZyb20gLTI0IGRCIHRvICsxMiBkQiIsCisgICAgICAgICAgLTI0LjAsIDEyLjAsIDAuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFORDksCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYmFuZDkiLCAiMTUwMTEgSHoiLAorICAgICAgICAgICJnYWluIGZvciB0aGUgZnJlcXVlbmN5IGJhbmQgMTUwMTEgSHosIHJhbmdpbmcgZnJvbSAtMjQgZEIgdG8gKzEyIGRCIiwKKyAgICAgICAgICAtMjQuMCwgMTIuMCwgMC4wLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiMTAgQmFuZCBFcXVhbGl6ZXIiLAorICAgICAgIkZpbHRlci9FZmZlY3QvQXVkaW8iLAorICAgICAgIkRpcmVjdCBGb3JtIDEwIGJhbmQgSUlSIGVxdWFsaXplciIsCisgICAgICAiU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2lpcl9lcXVhbGl6ZXJfMTBiYW5kc19pbml0IChHc3RJaXJFcXVhbGl6ZXIxMEJhbmRzICogZXF1X24pCit7CisgIEdzdElpckVxdWFsaXplciAqZXF1ID0gR1NUX0lJUl9FUVVBTElaRVIgKGVxdV9uKTsKKworICBnc3RfaWlyX2VxdWFsaXplcl9jb21wdXRlX2ZyZXF1ZW5jaWVzIChlcXUsIDEwKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9paXJfZXF1YWxpemVyXzEwYmFuZHNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdENoaWxkUHJveHkgKmVxdSA9IEdTVF9DSElMRF9QUk9YWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQkFORDA6CisgICAgICBnc3RfY2hpbGRfcHJveHlfc2V0X3Byb3BlcnR5IChlcXUsICJiYW5kMDo6Z2FpbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CQU5EMToKKyAgICAgIGdzdF9jaGlsZF9wcm94eV9zZXRfcHJvcGVydHkgKGVxdSwgImJhbmQxOjpnYWluIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JBTkQyOgorICAgICAgZ3N0X2NoaWxkX3Byb3h5X3NldF9wcm9wZXJ0eSAoZXF1LCAiYmFuZDI6OmdhaW4iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkFORDM6CisgICAgICBnc3RfY2hpbGRfcHJveHlfc2V0X3Byb3BlcnR5IChlcXUsICJiYW5kMzo6Z2FpbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CQU5ENDoKKyAgICAgIGdzdF9jaGlsZF9wcm94eV9zZXRfcHJvcGVydHkgKGVxdSwgImJhbmQ0OjpnYWluIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JBTkQ1OgorICAgICAgZ3N0X2NoaWxkX3Byb3h5X3NldF9wcm9wZXJ0eSAoZXF1LCAiYmFuZDU6OmdhaW4iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkFORDY6CisgICAgICBnc3RfY2hpbGRfcHJveHlfc2V0X3Byb3BlcnR5IChlcXUsICJiYW5kNjo6Z2FpbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CQU5ENzoKKyAgICAgIGdzdF9jaGlsZF9wcm94eV9zZXRfcHJvcGVydHkgKGVxdSwgImJhbmQ3OjpnYWluIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JBTkQ4OgorICAgICAgZ3N0X2NoaWxkX3Byb3h5X3NldF9wcm9wZXJ0eSAoZXF1LCAiYmFuZDg6OmdhaW4iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkFORDk6CisgICAgICBnc3RfY2hpbGRfcHJveHlfc2V0X3Byb3BlcnR5IChlcXUsICJiYW5kOTo6Z2FpbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9paXJfZXF1YWxpemVyXzEwYmFuZHNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdENoaWxkUHJveHkgKmVxdSA9IEdTVF9DSElMRF9QUk9YWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQkFORDA6CisgICAgICBnc3RfY2hpbGRfcHJveHlfZ2V0X3Byb3BlcnR5IChlcXUsICJiYW5kMDo6Z2FpbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CQU5EMToKKyAgICAgIGdzdF9jaGlsZF9wcm94eV9nZXRfcHJvcGVydHkgKGVxdSwgImJhbmQxOjpnYWluIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JBTkQyOgorICAgICAgZ3N0X2NoaWxkX3Byb3h5X2dldF9wcm9wZXJ0eSAoZXF1LCAiYmFuZDI6OmdhaW4iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkFORDM6CisgICAgICBnc3RfY2hpbGRfcHJveHlfZ2V0X3Byb3BlcnR5IChlcXUsICJiYW5kMzo6Z2FpbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CQU5ENDoKKyAgICAgIGdzdF9jaGlsZF9wcm94eV9nZXRfcHJvcGVydHkgKGVxdSwgImJhbmQ0OjpnYWluIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JBTkQ1OgorICAgICAgZ3N0X2NoaWxkX3Byb3h5X2dldF9wcm9wZXJ0eSAoZXF1LCAiYmFuZDU6OmdhaW4iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkFORDY6CisgICAgICBnc3RfY2hpbGRfcHJveHlfZ2V0X3Byb3BlcnR5IChlcXUsICJiYW5kNjo6Z2FpbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CQU5ENzoKKyAgICAgIGdzdF9jaGlsZF9wcm94eV9nZXRfcHJvcGVydHkgKGVxdSwgImJhbmQ3OjpnYWluIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JBTkQ4OgorICAgICAgZ3N0X2NoaWxkX3Byb3h5X2dldF9wcm9wZXJ0eSAoZXF1LCAiYmFuZDg6OmdhaW4iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkFORDk6CisgICAgICBnc3RfY2hpbGRfcHJveHlfZ2V0X3Byb3BlcnR5IChlcXUsICJiYW5kOTo6Z2FpbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5oIGIvZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2NjcyMQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfSUlSX0VRVUFMSVpFUl8xMEJBTkRTX18KKyNkZWZpbmUgX19HU1RfSUlSX0VRVUFMSVpFUl8xMEJBTkRTX18KKworI2luY2x1ZGUgImdzdGlpcmVxdWFsaXplci5oIgorCit0eXBlZGVmIHN0cnVjdCBfR3N0SWlyRXF1YWxpemVyMTBCYW5kcyBHc3RJaXJFcXVhbGl6ZXIxMEJhbmRzOwordHlwZWRlZiBzdHJ1Y3QgX0dzdElpckVxdWFsaXplcjEwQmFuZHNDbGFzcyBHc3RJaXJFcXVhbGl6ZXIxMEJhbmRzQ2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfSUlSX0VRVUFMSVpFUl8xMEJBTkRTIFwKKyAgKGdzdF9paXJfZXF1YWxpemVyXzEwYmFuZHNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0lJUl9FUVVBTElaRVJfMTBCQU5EUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfMTBCQU5EUyxHc3RJaXJFcXVhbGl6ZXIxMEJhbmRzKSkKKyNkZWZpbmUgR1NUX0lJUl9FUVVBTElaRVJfMTBCQU5EU19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9JSVJfRVFVQUxJWkVSXzEwQkFORFMsR3N0SWlyRXF1YWxpemVyMTBCYW5kc0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0lJUl9FUVVBTElaRVJfMTBCQU5EUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfMTBCQU5EUykpCisjZGVmaW5lIEdTVF9JU19JSVJfRVFVQUxJWkVSXzEwQkFORFNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfSUlSX0VRVUFMSVpFUl8xMEJBTkRTKSkKKworc3RydWN0IF9Hc3RJaXJFcXVhbGl6ZXIxMEJhbmRzCit7CisgIEdzdElpckVxdWFsaXplciBlcXVhbGl6ZXI7Cit9OworCitzdHJ1Y3QgX0dzdElpckVxdWFsaXplcjEwQmFuZHNDbGFzcworeworICBHc3RJaXJFcXVhbGl6ZXJDbGFzcyBlcXVhbGl6ZXJfY2xhc3M7Cit9OworCitleHRlcm4gR1R5cGUgZ3N0X2lpcl9lcXVhbGl6ZXJfMTBiYW5kc19nZXRfdHlwZSh2b2lkKTsKKworI2VuZGlmIC8qIF9fR1NUX0lJUl9FUVVBTElaRVJfMTBCQU5EU19fICovCmRpZmYgLS1naXQgYS9nc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5jIGIvZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIzYmFuZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmYxNGVkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIzYmFuZHMuYwpAQCAtMCwwICsxLDE0MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtZXF1YWxpemVyLTNiYW5kcworICoKKyAqIFRoZSAzLWJhbmQgZXF1YWxpemVyIGVsZW1lbnQgYWxsb3dzIHRvIGNoYW5nZSB0aGUgZ2FpbiBvZiBhIGxvdyBmcmVxdWVuY3ksCisgKiBtZWRpdW0gZnJlcXVlbmN5IGFuZCBoaWdoIGZyZXF1ZW5jeSBiYW5kLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPXNvbmcub2dnICEgb2dnZGVtdXggISB2b3JiaXNkZWMgISBhdWRpb2NvbnZlcnQgISBlcXVhbGl6ZXItM2JhbmRzIGJhbmQxPTYuMCAhIGFsc2FzaW5rCisgKiBdfCBUaGlzIHJhaXNlcyB0aGUgdm9sdW1lIG9mIHRoZSAybmQgYmFuZCwgd2hpY2ggaXMgYXQgMTExMCBIeiwgYnkgNiBkYi4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0aWlyZXF1YWxpemVyLmgiCisjaW5jbHVkZSAiZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmgiCisKK2VudW0KK3sKKyAgUFJPUF9CQU5EMCA9IDEsCisgIFBST1BfQkFORDEsCisgIFBST1BfQkFORDIsCit9OworCitzdGF0aWMgdm9pZCBnc3RfaWlyX2VxdWFsaXplcl8zYmFuZHNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2lpcl9lcXVhbGl6ZXJfM2JhbmRzX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworR1NUX0RFQlVHX0NBVEVHT1JZX0VYVEVSTiAoZXF1YWxpemVyX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGVxdWFsaXplcl9kZWJ1ZworCisjZGVmaW5lIGdzdF9paXJfZXF1YWxpemVyXzNiYW5kc19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RJaXJFcXVhbGl6ZXIzQmFuZHMsIGdzdF9paXJfZXF1YWxpemVyXzNiYW5kcywKKyAgICBHU1RfVFlQRV9JSVJfRVFVQUxJWkVSKTsKKworLyogZXF1YWxpemVyIGltcGxlbWVudGF0aW9uICovCisKK3N0YXRpYyB2b2lkCitnc3RfaWlyX2VxdWFsaXplcl8zYmFuZHNfY2xhc3NfaW5pdCAoR3N0SWlyRXF1YWxpemVyM0JhbmRzQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfaWlyX2VxdWFsaXplcl8zYmFuZHNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfaWlyX2VxdWFsaXplcl8zYmFuZHNfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFORDAsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYmFuZDAiLCAiMTEwIEh6IiwKKyAgICAgICAgICAiZ2FpbiBmb3IgdGhlIGZyZXF1ZW5jeSBiYW5kIDEwMCBIeiwgcmFuZ2luZyBmcm9tIC0yNC4wIHRvICsxMi4wIiwKKyAgICAgICAgICAtMjQuMCwgMTIuMCwgMC4wLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9CQU5EMSwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJiYW5kMSIsICIxMTAwIEh6IiwKKyAgICAgICAgICAiZ2FpbiBmb3IgdGhlIGZyZXF1ZW5jeSBiYW5kIDExMDAgSHosIHJhbmdpbmcgZnJvbSAtMjQuMCB0byArMTIuMCIsCisgICAgICAgICAgLTI0LjAsIDEyLjAsIDAuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFORDIsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYmFuZDIiLCAiMTEga0h6IiwKKyAgICAgICAgICAiZ2FpbiBmb3IgdGhlIGZyZXF1ZW5jeSBiYW5kIDExIGtIeiwgcmFuZ2luZyBmcm9tIC0yNC4wIHRvICsxMi4wIiwKKyAgICAgICAgICAtMjQuMCwgMTIuMCwgMC4wLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiMyBCYW5kIEVxdWFsaXplciIsCisgICAgICAiRmlsdGVyL0VmZmVjdC9BdWRpbyIsCisgICAgICAiRGlyZWN0IEZvcm0gMyBiYW5kIElJUiBlcXVhbGl6ZXIiLCAiU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2lpcl9lcXVhbGl6ZXJfM2JhbmRzX2luaXQgKEdzdElpckVxdWFsaXplcjNCYW5kcyAqIGVxdV9uKQoreworICBHc3RJaXJFcXVhbGl6ZXIgKmVxdSA9IEdTVF9JSVJfRVFVQUxJWkVSIChlcXVfbik7CisKKyAgZ3N0X2lpcl9lcXVhbGl6ZXJfY29tcHV0ZV9mcmVxdWVuY2llcyAoZXF1LCAzKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9paXJfZXF1YWxpemVyXzNiYW5kc19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0Q2hpbGRQcm94eSAqZXF1ID0gR1NUX0NISUxEX1BST1hZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9CQU5EMDoKKyAgICAgIGdzdF9jaGlsZF9wcm94eV9zZXRfcHJvcGVydHkgKGVxdSwgImJhbmQwOjpnYWluIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JBTkQxOgorICAgICAgZ3N0X2NoaWxkX3Byb3h5X3NldF9wcm9wZXJ0eSAoZXF1LCAiYmFuZDE6OmdhaW4iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkFORDI6CisgICAgICBnc3RfY2hpbGRfcHJveHlfc2V0X3Byb3BlcnR5IChlcXUsICJiYW5kMjo6Z2FpbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9paXJfZXF1YWxpemVyXzNiYW5kc19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0Q2hpbGRQcm94eSAqZXF1ID0gR1NUX0NISUxEX1BST1hZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9CQU5EMDoKKyAgICAgIGdzdF9jaGlsZF9wcm94eV9nZXRfcHJvcGVydHkgKGVxdSwgImJhbmQwOjpnYWluIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JBTkQxOgorICAgICAgZ3N0X2NoaWxkX3Byb3h5X2dldF9wcm9wZXJ0eSAoZXF1LCAiYmFuZDE6OmdhaW4iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkFORDI6CisgICAgICBnc3RfY2hpbGRfcHJveHlfZ2V0X3Byb3BlcnR5IChlcXUsICJiYW5kMjo6Z2FpbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmggYi9nc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OTBmY2EKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfSUlSX0VRVUFMSVpFUl8zQkFORFNfXworI2RlZmluZSBfX0dTVF9JSVJfRVFVQUxJWkVSXzNCQU5EU19fCisKKyNpbmNsdWRlICJnc3RpaXJlcXVhbGl6ZXIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdElpckVxdWFsaXplcjNCYW5kcyBHc3RJaXJFcXVhbGl6ZXIzQmFuZHM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0SWlyRXF1YWxpemVyM0JhbmRzQ2xhc3MgR3N0SWlyRXF1YWxpemVyM0JhbmRzQ2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfSUlSX0VRVUFMSVpFUl8zQkFORFMgXAorICAoZ3N0X2lpcl9lcXVhbGl6ZXJfM2JhbmRzX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9JSVJfRVFVQUxJWkVSXzNCQU5EUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfM0JBTkRTLEdzdElpckVxdWFsaXplcjNCYW5kcykpCisjZGVmaW5lIEdTVF9JSVJfRVFVQUxJWkVSXzNCQU5EU19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9JSVJfRVFVQUxJWkVSXzNCQU5EUyxHc3RJaXJFcXVhbGl6ZXIzQmFuZHNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19JSVJfRVFVQUxJWkVSXzNCQU5EUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfM0JBTkRTKSkKKyNkZWZpbmUgR1NUX0lTX0lJUl9FUVVBTElaRVJfM0JBTkRTX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfM0JBTkRTKSkKKworc3RydWN0IF9Hc3RJaXJFcXVhbGl6ZXIzQmFuZHMKK3sKKyAgR3N0SWlyRXF1YWxpemVyIGVxdWFsaXplcjsKK307CisKK3N0cnVjdCBfR3N0SWlyRXF1YWxpemVyM0JhbmRzQ2xhc3MKK3sKKyAgR3N0SWlyRXF1YWxpemVyQ2xhc3MgZXF1YWxpemVyX2NsYXNzOworfTsKKworZXh0ZXJuIEdUeXBlIGdzdF9paXJfZXF1YWxpemVyXzNiYW5kc19nZXRfdHlwZSh2b2lkKTsKKworI2VuZGlmIC8qIF9fR1NUX0lJUl9FUVVBTElaRVJfM0JBTkRTX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVybmJhbmRzLmMgYi9nc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MzI1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5jCkBAIC0wLDAgKzEsMTY0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDQ+IEJlbmphbWluIE90dGUgPG90dGVAZ25vbWUub3JnPgorICogICAgICAgICAgICAgICA8MjAwNz4gU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWVxdWFsaXplci1uYmFuZHMKKyAqCisgKiBUaGUgbi1iYW5kIGVxdWFsaXplciBlbGVtZW50IGlzIGEgZnVsbHkgcGFyYW1ldHJpYyBlcXVhbGl6ZXIuIEl0IGFsbG93cyB0bworICogc2VsZWN0IGJldHdlZW4gMSBhbmQgNjQgYmFuZHMgYW5kIGhhcyBwcm9wZXJ0aWVzIG9uIGVhY2ggYmFuZCB0byBjaGFuZ2UKKyAqIHRoZSBjZW50ZXIgZnJlcXVlbmN5LCBiYW5kIHdpZHRoIGFuZCBnYWluLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPXNvbmcub2dnICEgb2dnZGVtdXggISB2b3JiaXNkZWMgISBhdWRpb2NvbnZlcnQgISBlcXVhbGl6ZXItbmJhbmRzIG51bS1iYW5kcz0xNSBiYW5kNTo6Z2Fpbj02LjAgISBhbHNhc2luaworICogXXwgVGhpcyBtYWtlIHRoZSBlcXVhbGl6ZXIgdXNlIDE1IGJhbmRzIGFuZCByYWlzZXMgdGhlIHZvbHVtZSBvZiB0aGUgNXRoIGJhbmQgYnkgNiBkYi4KKyAqIDwvcmVmc2VjdDI+CisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBjb2RlPC90aXRsZT4KKyAqIHxbCisgKiAjaW5jbHVkZSAmbHQ7Z3N0L2dzdC5oJmd0OworICogCisgKiAuLi4KKyAqIHR5cGVkZWYgc3RydWN0IHsKKyAqICAgZ2Zsb2F0IGZyZXE7CisgKiAgIGdmbG9hdCB3aWR0aDsKKyAqICAgZ2Zsb2F0IGdhaW47CisgKiB9IEdzdEVxdWFsaXplckJhbmRTdGF0ZTsKKyAqIAorICogLi4uCisgKiAKKyAqICAgR3N0RWxlbWVudCAqZXF1YWxpemVyOworICogICBHT2JqZWN0ICpiYW5kOworICogICBnaW50IGk7CisgKiAgIEdzdEVxdWFsaXplckJhbmRTdGF0ZSBzdGF0ZVtdID0geworICogICAgIHsgMTIwLjAsICAgNTAuMCwgLSAzLjB9LAorICogICAgIHsgNTAwLjAsICAgMjAuMCwgIDEyLjB9LAorICogICAgIHsxNTAzLjAsICAgIDIuMCwgLTIwLjB9LAorICogICAgIHs2MDAwLjAsIDEwMDAuMCwgICA2LjB9LAorICogICAgIHszMDAwLjAsICAxMjAuMCwgICAyLjB9CisgKiAgIH07CisgKiAKKyAqIC4uLgorICogCisgKiAgIGVxdWFsaXplciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImVxdWFsaXplci1uYmFuZHMiLCAiZXF1YWxpemVyIik7CisgKiAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGVxdWFsaXplciksICJudW0tYmFuZHMiLCA1LCBOVUxMKTsKKyAqIAorICogLi4uCisgKiAKKyAqICAgZm9yIChpID0gMDsgaSAmbHQ7IDU7IGkrKykgeworICogICAgIGJhbmQgPSBnc3RfY2hpbGRfcHJveHlfZ2V0X2NoaWxkX2J5X2luZGV4IChHU1RfQ0hJTERfUFJPWFkgKGVxdWFsaXplciksIGkpOworICogICAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGJhbmQpLCAiZnJlcSIsIHN0YXRlW2ldLmZyZXEsCisgKiAgICAgICAgICJiYW5kd2lkdGgiLCBzdGF0ZVtpXS53aWR0aCwKKyAqIAkiZ2FpbiIsIHN0YXRlW2ldLmdhaW4pOworICogICAgIGdfb2JqZWN0X3VucmVmIChHX09CSkVDVCAoYmFuZCkpOworICogICB9CisgKiAKKyAqIC4uLgorICogXXwKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0aWlyZXF1YWxpemVyLmgiCisjaW5jbHVkZSAiZ3N0aWlyZXF1YWxpemVybmJhbmRzLmgiCisKKworZW51bQoreworICBQUk9QX05VTV9CQU5EUyA9IDEKK307CisKK3N0YXRpYyB2b2lkIGdzdF9paXJfZXF1YWxpemVyX25iYW5kc19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfaWlyX2VxdWFsaXplcl9uYmFuZHNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitHU1RfREVCVUdfQ0FURUdPUllfRVhURVJOIChlcXVhbGl6ZXJfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZXF1YWxpemVyX2RlYnVnCisKKyNkZWZpbmUgZ3N0X2lpcl9lcXVhbGl6ZXJfbmJhbmRzX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdElpckVxdWFsaXplck5CYW5kcywgZ3N0X2lpcl9lcXVhbGl6ZXJfbmJhbmRzLAorICAgIEdTVF9UWVBFX0lJUl9FUVVBTElaRVIpOworCisvKiBlcXVhbGl6ZXIgaW1wbGVtZW50YXRpb24gKi8KKworc3RhdGljIHZvaWQKK2dzdF9paXJfZXF1YWxpemVyX25iYW5kc19jbGFzc19pbml0IChHc3RJaXJFcXVhbGl6ZXJOQmFuZHNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9paXJfZXF1YWxpemVyX25iYW5kc19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9paXJfZXF1YWxpemVyX25iYW5kc19nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9OVU1fQkFORFMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm51bS1iYW5kcyIsICJudW0tYmFuZHMiLAorICAgICAgICAgICJudW1iZXIgb2YgZGlmZmVyZW50IGJhbmRzIHRvIHVzZSIsIDEsIDY0LCAxMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHX1BBUkFNX0NPTlNUUlVDVCkpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJOIEJhbmQgRXF1YWxpemVyIiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L0F1ZGlvIiwKKyAgICAgICJEaXJlY3QgRm9ybSBJSVIgZXF1YWxpemVyIiwKKyAgICAgICJCZW5qYW1pbiBPdHRlIDxvdHRlQGdub21lLm9yZz4sIiAiIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9paXJfZXF1YWxpemVyX25iYW5kc19pbml0IChHc3RJaXJFcXVhbGl6ZXJOQmFuZHMgKiBlcXVfbikKK3sKKyAgR3N0SWlyRXF1YWxpemVyICplcXUgPSBHU1RfSUlSX0VRVUFMSVpFUiAoZXF1X24pOworCisgIGdzdF9paXJfZXF1YWxpemVyX2NvbXB1dGVfZnJlcXVlbmNpZXMgKGVxdSwgMTApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2lpcl9lcXVhbGl6ZXJfbmJhbmRzX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RJaXJFcXVhbGl6ZXIgKmVxdSA9IEdTVF9JSVJfRVFVQUxJWkVSIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9OVU1fQkFORFM6CisgICAgICBnc3RfaWlyX2VxdWFsaXplcl9jb21wdXRlX2ZyZXF1ZW5jaWVzIChlcXUsIGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaWlyX2VxdWFsaXplcl9uYmFuZHNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdElpckVxdWFsaXplciAqZXF1ID0gR1NUX0lJUl9FUVVBTElaRVIgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX05VTV9CQU5EUzoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBlcXUtPmZyZXFfYmFuZF9jb3VudCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5oIGIvZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXJuYmFuZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTE5YTFmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXJuYmFuZHMuaApAQCAtMCwwICsxLDUyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDQ+IEJlbmphbWluIE90dGUgPG90dGVAZ25vbWUub3JnPgorICogICAgICAgICAgICAgICA8MjAwNz4gU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfSUlSX0VRVUFMSVpFUl9OQkFORFNfXworI2RlZmluZSBfX0dTVF9JSVJfRVFVQUxJWkVSX05CQU5EU19fCisKKyNpbmNsdWRlICJnc3RpaXJlcXVhbGl6ZXIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdElpckVxdWFsaXplck5CYW5kcyBHc3RJaXJFcXVhbGl6ZXJOQmFuZHM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0SWlyRXF1YWxpemVyTkJhbmRzQ2xhc3MgR3N0SWlyRXF1YWxpemVyTkJhbmRzQ2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfSUlSX0VRVUFMSVpFUl9OQkFORFMgXAorICAoZ3N0X2lpcl9lcXVhbGl6ZXJfbmJhbmRzX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9JSVJfRVFVQUxJWkVSX05CQU5EUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfTkJBTkRTLEdzdElpckVxdWFsaXplck5CYW5kcykpCisjZGVmaW5lIEdTVF9JSVJfRVFVQUxJWkVSX05CQU5EU19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9JSVJfRVFVQUxJWkVSX05CQU5EUyxHc3RJaXJFcXVhbGl6ZXJOQmFuZHNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19JSVJfRVFVQUxJWkVSX05CQU5EUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfTkJBTkRTKSkKKyNkZWZpbmUgR1NUX0lTX0lJUl9FUVVBTElaRVJfTkJBTkRTX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfTkJBTkRTKSkKKworc3RydWN0IF9Hc3RJaXJFcXVhbGl6ZXJOQmFuZHMKK3sKKyAgR3N0SWlyRXF1YWxpemVyIGVxdWFsaXplcjsKK307CisKK3N0cnVjdCBfR3N0SWlyRXF1YWxpemVyTkJhbmRzQ2xhc3MKK3sKKyAgR3N0SWlyRXF1YWxpemVyQ2xhc3MgZXF1YWxpemVyX2NsYXNzOworfTsKKworZXh0ZXJuIEdUeXBlIGdzdF9paXJfZXF1YWxpemVyX25iYW5kc19nZXRfdHlwZSh2b2lkKTsKKworI2VuZGlmIC8qIF9fR1NUX0lJUl9FUVVBTElaRVJfTkJBTkRTX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9lcXVhbGl6ZXIvbWVzb24uYnVpbGQgYi9nc3QvZXF1YWxpemVyL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3OTgxZmIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZXF1YWxpemVyL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMTggQEAKK2VxX3NvdXJjZXMgPSBbCisgICdnc3RpaXJlcXVhbGl6ZXIuYycsCisgICdnc3RpaXJlcXVhbGl6ZXJuYmFuZHMuYycsCisgICdnc3RpaXJlcXVhbGl6ZXIzYmFuZHMuYycsCisgICdnc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmMnLAorXQorCitnc3RlcXVhbGl6ZXIgPSBsaWJyYXJ5KCdnc3RlcXVhbGl6ZXInLAorICBlcV9zb3VyY2VzLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdGJhc2VfZGVwLCBnc3RhdWRpb19kZXAsIGxpYm1dLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQorCitpbnN0YWxsX2RhdGEoc291cmNlczogWydHc3RJaXJFcXVhbGl6ZXIzQmFuZHMucHJzJywKKyAgJ0dzdElpckVxdWFsaXplcjEwQmFuZHMucHJzJ10sIGluc3RhbGxfZGlyOiBwcmVzZXRkaXIpCmRpZmYgLS1naXQgYS9nc3QvZmx2L01ha2VmaWxlLmFtIGIvZ3N0L2Zsdi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGExMDE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2Zsdi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEyIEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RmbHYubGEKKworbGliZ3N0Zmx2X2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpCitsaWJnc3RmbHZfbGFfTElCQUREID0gLWxnc3RwYnV0aWxzLUBHU1RfQVBJX1ZFUlNJT05AIC1sZ3N0YXVkaW8tQEdTVF9BUElfVkVSU0lPTkAgXAorICAgICAgICAtbGdzdHZpZGVvLUBHU1RfQVBJX1ZFUlNJT05AIC1sZ3N0dGFnLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpICQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykKK2xpYmdzdGZsdl9sYV9MREZMQUdTID0gJHtHU1RfUExVR0lOX0xERkxBR1N9CitsaWJnc3RmbHZfbGFfU09VUkNFUyA9IGdzdGZsdmRlbXV4LmMgZ3N0Zmx2bXV4LmMKKworbm9pbnN0X0hFQURFUlMgPSBnc3RmbHZkZW11eC5oIGdzdGZsdm11eC5oIGFtZmRlZnMuaCBnc3RpbmRleC5oCisKK0VYVFJBX0RJU1QgPSBnc3RpbmRleC5jIGdzdG1lbWluZGV4LmMKZGlmZiAtLWdpdCBhL2dzdC9mbHYvYW1mZGVmcy5oIGIvZ3N0L2Zsdi9hbWZkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFlNzcyNQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9mbHYvYW1mZGVmcy5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0FNRkRFRlNfSF9fCisjZGVmaW5lIF9fQU1GREVGU19IX18KKworI2luY2x1ZGUgPGdsaWIuaD4KKworI2RlZmluZSBBTUYwX05VTUJFUl9NQVJLRVIgMHgwCisjZGVmaW5lIEFNRjBfQk9PTEVBTl9NQVJLRVIgMHgxCisjZGVmaW5lIEFNRjBfU1RSSU5HX01BUktFUiAweDIKKyNkZWZpbmUgQU1GMF9PQkpFQ1RfTUFSS0VSIDB4MworI2RlZmluZSBBTUYwX01PVklFQ0xJUF9NQVJLRVIgMHg0IC8qIFJlc2VydmVkLCBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIEFNRjBfTlVMTF9NQVJLRVIgMHg1CisjZGVmaW5lIEFNRjBfVU5ERUZJTkVEX01BUktFUiAweDYKKyNkZWZpbmUgQU1GMF9SRUZFUkVOQ0VfTUFSS0VSIDB4NworI2RlZmluZSBBTUYwX0VDTUFfQVJSQVlfTUFSS0VSIDB4OAorI2RlZmluZSBBTUYwX09CSkVDVF9FTkRfTUFSS0VSIDB4OQorI2RlZmluZSBBTUYwX1NUUklDVF9BUlJBWV9NQVJLRVIgMHhBCisjZGVmaW5lIEFNRjBfREFURV9NQVJLRVIgMHhCCisjZGVmaW5lIEFNRjBfTE9OR19TVFJJTkdfTUFSS0VSIDB4QworI2RlZmluZSBBTUYwX1VOU1VQUE9SVEVEX01BUktFUiAweEQKKyNkZWZpbmUgQU1GMF9SRUNPUkRTRVRfTUFSS0VSIDB4RSAvKiBSZXNlcnZlZCwgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBBTUYwX1hNTF9ET0NVTUVOVF9NQVJLRVIgMHhGCisjZGVmaW5lIEFNRjBfVFlQRURfT0JKRUNUX01BUktFUiAweDEwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2Zsdi9nc3RmbHZkZW11eC5jIGIvZ3N0L2Zsdi9nc3RmbHZkZW11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMGZhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZmx2L2dzdGZsdmRlbXV4LmMKQEAgLTAsMCArMSwzNjY3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWZsdmRlbXV4CisgKgorICogZmx2ZGVtdXggZGVtdXhlcyBhbiBGTFYgZmlsZSBpbnRvIHRoZSBkaWZmZXJlbnQgY29udGFpbmVkIHN0cmVhbXMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGZpbGVzcmMgbG9jYXRpb249L3BhdGgvdG8vZmx2ICEgZmx2ZGVtdXggISBhdWRpb2NvbnZlcnQgISBhdXRvYXVkaW9zaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIGRlbXV4ZXMgYW4gRkxWIGZpbGUgYW5kIG91dHB1dHMgdGhlIGNvbnRhaW5lZCByYXcgYXVkaW8gc3RyZWFtcy4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0Zmx2ZGVtdXguaCIKKyNpbmNsdWRlICJnc3RmbHZtdXguaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXJlYWRlci5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJ5dGV3cml0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvcGJ1dGlscy9kZXNjcmlwdGlvbnMuaD4KKyNpbmNsdWRlIDxnc3QvcGJ1dGlscy9wYnV0aWxzLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3RhZy90YWcuaD4KKworLyogRklYTUU6IGRvbid0IHJlbHkgb24gb3duIEdzdEluZGV4ICovCisjaW5jbHVkZSAiZ3N0aW5kZXguYyIKKyNpbmNsdWRlICJnc3RtZW1pbmRleC5jIgorI2RlZmluZSBHU1RfQVNTT0NJQVRJT05fRkxBR19OT05FIEdTVF9JTkRFWF9BU1NPQ0lBVElPTl9GTEFHX05PTkUKKyNkZWZpbmUgR1NUX0FTU09DSUFUSU9OX0ZMQUdfS0VZX1VOSVQgR1NUX0lOREVYX0FTU09DSUFUSU9OX0ZMQUdfS0VZX1VOSVQKKyNkZWZpbmUgR1NUX0FTU09DSUFUSU9OX0ZMQUdfREVMVEFfVU5JVCBHU1RfSU5ERVhfQVNTT0NJQVRJT05fRkxBR19ERUxUQV9VTklUCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBmbHZfc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtZmx2IikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgYXVkaW9fc3JjX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoImF1ZGlvIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFMKKyAgICAoImF1ZGlvL3gtYWRwY20sIGxheW91dCA9IChzdHJpbmcpIHN3ZiwgY2hhbm5lbHMgPSAoaW50KSB7IDEsIDIgfSwgcmF0ZSA9IChpbnQpIHsgNTUxMiwgMTEwMjUsIDIyMDUwLCA0NDEwMCB9OyAiCisgICAgICAgICJhdWRpby9tcGVnLCBtcGVndmVyc2lvbiA9IChpbnQpIDEsIGxheWVyID0gKGludCkgMywgY2hhbm5lbHMgPSAoaW50KSB7IDEsIDIgfSwgcmF0ZSA9IChpbnQpIHsgNTUxMiwgODAwMCwgMTEwMjUsIDIyMDUwLCA0NDEwMCB9LCBwYXJzZWQgPSAoYm9vbGVhbikgVFJVRTsgIgorICAgICAgICAiYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb24gPSAoaW50KSA0LCBzdHJlYW0tZm9ybWF0ID0gKHN0cmluZykgcmF3LCBmcmFtZWQgPSAoYm9vbGVhbikgVFJVRTsgIgorICAgICAgICAiYXVkaW8veC1uZWxseW1vc2VyLCBjaGFubmVscyA9IChpbnQpIHsgMSwgMiB9LCByYXRlID0gKGludCkgeyA1NTEyLCA4MDAwLCAxMTAyNSwgMTYwMDAsIDIyMDUwLCA0NDEwMCB9OyAiCisgICAgICAgICJhdWRpby94LXJhdywgZm9ybWF0ID0gKHN0cmluZykgeyBVOCwgUzE2TEUgfSwgbGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsIGNoYW5uZWxzID0gKGludCkgeyAxLCAyIH0sIHJhdGUgPSAoaW50KSB7IDU1MTIsIDExMDI1LCAyMjA1MCwgNDQxMDAgfTsgIgorICAgICAgICAiYXVkaW8veC1hbGF3LCBjaGFubmVscyA9IChpbnQpIHsgMSwgMiB9LCByYXRlID0gKGludCkgeyA1NTEyLCAxMTAyNSwgMjIwNTAsIDQ0MTAwIH07ICIKKyAgICAgICAgImF1ZGlvL3gtbXVsYXcsIGNoYW5uZWxzID0gKGludCkgeyAxLCAyIH0sIHJhdGUgPSAoaW50KSB7IDU1MTIsIDExMDI1LCAyMjA1MCwgNDQxMDAgfTsgIgorICAgICAgICAiYXVkaW8veC1zcGVleCwgY2hhbm5lbHMgPSAoaW50KSAxLCByYXRlID0gKGludCkgMTYwMDA7IikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgdmlkZW9fc3JjX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInZpZGVvIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LWZsYXNoLXZpZGVvLCBmbHZ2ZXJzaW9uPShpbnQpIDE7ICIKKyAgICAgICAgInZpZGVvL3gtZmxhc2gtc2NyZWVuOyAiCisgICAgICAgICJ2aWRlby94LXZwNi1mbGFzaDsgIiAidmlkZW8veC12cDYtYWxwaGE7ICIKKyAgICAgICAgInZpZGVvL3gtaDI2NCwgc3RyZWFtLWZvcm1hdD1hdmM7IikKKyAgICApOworCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChmbHZkZW11eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBmbHZkZW11eF9kZWJ1ZworCisjZGVmaW5lIGdzdF9mbHZfZGVtdXhfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0Rmx2RGVtdXgsIGdzdF9mbHZfZGVtdXgsIEdTVF9UWVBFX0VMRU1FTlQpOworCisvKiA5IGJ5dGVzIG9mIGhlYWRlciArIDQgYnl0ZXMgb2YgZmlyc3QgcHJldmlvdXMgdGFnIHNpemUgKi8KKyNkZWZpbmUgRkxWX0hFQURFUl9TSVpFIDEzCisvKiAxIGJ5dGUgb2YgdGFnIHR5cGUgKyAzIGJ5dGVzIG9mIHRhZyBkYXRhIHNpemUgKi8KKyNkZWZpbmUgRkxWX1RBR19UWVBFX1NJWkUgNAorCisvKiB0d28gc2Vjb25kcyAtIGNvbnNpZGVyIGR0cyBhcmUgcmVzeW5jZWQgdG8gYW5vdGhlciBiYXNlIGlmIHRoaXMgZGlmZmVyZW50ICovCisjZGVmaW5lIFJFU1lOQ19USFJFU0hPTEQgMjAwMAorCisvKiBob3cgbXVjaCBzdHJlYW0gdGltZSB0byB3YWl0IGZvciBhdWRpbyB0YWdzIHRvIGFwcGVhciBhZnRlciB3ZSBoYXZlIHZpZGVvLCBvciB2aWNlIHZlcnNhICovCisjZGVmaW5lIE5PX01PUkVfUEFEU19USFJFU0hPTEQgKDYgKiBHU1RfU0VDT05EKQorCitzdGF0aWMgZ2Jvb2xlYW4gZmx2X2RlbXV4X2hhbmRsZV9zZWVrX3B1c2ggKEdzdEZsdkRlbXV4ICogZGVtdXgsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2Zsdl9kZW11eF9oYW5kbGVfc2Vla19wdWxsIChHc3RGbHZEZW11eCAqIGRlbXV4LAorICAgIEdzdEV2ZW50ICogZXZlbnQsIGdib29sZWFuIHNlZWtpbmcpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2Zsdl9kZW11eF9xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0UXVlcnkgKiBxdWVyeSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2Zsdl9kZW11eF9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCitzdGF0aWMgR3N0SW5kZXggKmdzdF9mbHZfZGVtdXhfZ2V0X2luZGV4IChHc3RFbGVtZW50ICogZWxlbWVudCk7CisKK3N0YXRpYyB2b2lkIGdzdF9mbHZfZGVtdXhfcHVzaF90YWdzIChHc3RGbHZEZW11eCAqIGRlbXV4KTsKKworc3RhdGljIHZvaWQKK2dzdF9mbHZfZGVtdXhfcGFyc2VfYW5kX2FkZF9pbmRleF9lbnRyeSAoR3N0Rmx2RGVtdXggKiBkZW11eCwgR3N0Q2xvY2tUaW1lIHRzLAorICAgIGd1aW50NjQgcG9zLCBnYm9vbGVhbiBrZXlmcmFtZSkKK3sKKyAgR3N0SW5kZXhBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbnNbMl07CisgIEdzdEluZGV4ICppbmRleDsKKyAgR3N0SW5kZXhFbnRyeSAqZW50cnk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LAorICAgICAgImFkZGluZyBrZXk9JWQgYXNzb2NpYXRpb24gJSIgR1NUX1RJTUVfRk9STUFUICItPiAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAga2V5ZnJhbWUsIEdTVF9USU1FX0FSR1MgKHRzKSwgcG9zKTsKKworICAvKiBpZiB1cHN0cmVhbSBpcyBub3Qgc2Vla2FibGUgdGhlcmUgaXMgbm8gcG9pbnQgaW4gYnVpbGRpbmcgYW4gaW5kZXggKi8KKyAgaWYgKCFkZW11eC0+dXBzdHJlYW1fc2Vla2FibGUpCisgICAgcmV0dXJuOworCisgIGluZGV4ID0gZ3N0X2Zsdl9kZW11eF9nZXRfaW5kZXggKEdTVF9FTEVNRU5UIChkZW11eCkpOworCisgIGlmICghaW5kZXgpCisgICAgcmV0dXJuOworCisgIC8qIGVudHJ5IG1heSBhbHJlYWR5IGhhdmUgYmVlbiBhZGRlZCBiZWZvcmUsIGF2b2lkIGFkZGluZyBpbmRlZmluaXRlbHkgKi8KKyAgZW50cnkgPSBnc3RfaW5kZXhfZ2V0X2Fzc29jX2VudHJ5IChpbmRleCwgZGVtdXgtPmluZGV4X2lkLAorICAgICAgR1NUX0lOREVYX0xPT0tVUF9FWEFDVCwgR1NUX0FTU09DSUFUSU9OX0ZMQUdfTk9ORSwgR1NUX0ZPUk1BVF9CWVRFUywgcG9zKTsKKworICBpZiAoZW50cnkpIHsKKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgICAgZ2ludDY0IHRpbWUgPSAwOworICAgIGdib29sZWFuIGtleTsKKworICAgIGdzdF9pbmRleF9lbnRyeV9hc3NvY19tYXAgKGVudHJ5LCBHU1RfRk9STUFUX1RJTUUsICZ0aW1lKTsKKyAgICBrZXkgPSAhICEoR1NUX0lOREVYX0FTU09DX0ZMQUdTIChlbnRyeSkgJiBHU1RfQVNTT0NJQVRJT05fRkxBR19LRVlfVU5JVCk7CisgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAicG9zaXRpb24gYWxyZWFkeSBtYXBwZWQgdG8gdGltZSAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgIiwga2V5ZnJhbWUgJWQiLCBHU1RfVElNRV9BUkdTICh0aW1lKSwga2V5KTsKKyAgICAvKiB0aGVyZSBpcyBub3QgcmVhbGx5IGEgd2F5IHRvIGRlbGV0ZSB0aGUgZXhpc3Rpbmcgb25lICovCisgICAgaWYgKHRpbWUgIT0gdHMgfHwga2V5ICE9ICEgIWtleWZyYW1lKQorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJtZXRhZGF0YSBtaXNtYXRjaCIpOworI2VuZGlmCisgICAgZ3N0X29iamVjdF91bnJlZiAoaW5kZXgpOworICAgIHJldHVybjsKKyAgfQorCisgIGFzc29jaWF0aW9uc1swXS5mb3JtYXQgPSBHU1RfRk9STUFUX1RJTUU7CisgIGFzc29jaWF0aW9uc1swXS52YWx1ZSA9IHRzOworICBhc3NvY2lhdGlvbnNbMV0uZm9ybWF0ID0gR1NUX0ZPUk1BVF9CWVRFUzsKKyAgYXNzb2NpYXRpb25zWzFdLnZhbHVlID0gcG9zOworCisgIGdzdF9pbmRleF9hZGRfYXNzb2NpYXRpb252IChpbmRleCwgZGVtdXgtPmluZGV4X2lkLAorICAgICAgKGtleWZyYW1lKSA/IEdTVF9BU1NPQ0lBVElPTl9GTEFHX0tFWV9VTklUIDoKKyAgICAgIEdTVF9BU1NPQ0lBVElPTl9GTEFHX0RFTFRBX1VOSVQsIDIsCisgICAgICAoY29uc3QgR3N0SW5kZXhBc3NvY2lhdGlvbiAqKSAmYXNzb2NpYXRpb25zKTsKKworICBpZiAocG9zID4gZGVtdXgtPmluZGV4X21heF9wb3MpCisgICAgZGVtdXgtPmluZGV4X21heF9wb3MgPSBwb3M7CisgIGlmICh0cyA+IGRlbXV4LT5pbmRleF9tYXhfdGltZSkKKyAgICBkZW11eC0+aW5kZXhfbWF4X3RpbWUgPSB0czsKKworICBnc3Rfb2JqZWN0X3VucmVmIChpbmRleCk7Cit9CisKK3N0YXRpYyBnY2hhciAqCitGTFZfR0VUX1NUUklORyAoR3N0Qnl0ZVJlYWRlciAqIHJlYWRlcikKK3sKKyAgZ3VpbnQxNiBzdHJpbmdfc2l6ZSA9IDA7CisgIGdjaGFyICpzdHJpbmcgPSBOVUxMOworICBjb25zdCBndWludDggKnN0ciA9IE5VTEw7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlYWRlciAhPSBOVUxMLCBOVUxMKTsKKworICBpZiAoR19VTkxJS0VMWSAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2JlIChyZWFkZXIsICZzdHJpbmdfc2l6ZSkpKQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChHX1VOTElLRUxZIChzdHJpbmdfc2l6ZSA+IGdzdF9ieXRlX3JlYWRlcl9nZXRfcmVtYWluaW5nIChyZWFkZXIpKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBzdHJpbmcgPSBnX3RyeV9tYWxsb2MwIChzdHJpbmdfc2l6ZSArIDEpOworICBpZiAoR19VTkxJS0VMWSAoIXN0cmluZykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChHX1VOTElLRUxZICghZ3N0X2J5dGVfcmVhZGVyX2dldF9kYXRhIChyZWFkZXIsIHN0cmluZ19zaXplLCAmc3RyKSkpIHsKKyAgICBnX2ZyZWUgKHN0cmluZyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBtZW1jcHkgKHN0cmluZywgc3RyLCBzdHJpbmdfc2l6ZSk7CisgIGlmICghZ191dGY4X3ZhbGlkYXRlIChzdHJpbmcsIHN0cmluZ19zaXplLCBOVUxMKSkgeworICAgIGdfZnJlZSAoc3RyaW5nKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBzdHJpbmc7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X2RlbXV4X2NoZWNrX3NlZWthYmlsaXR5IChHc3RGbHZEZW11eCAqIGRlbXV4KQoreworICBHc3RRdWVyeSAqcXVlcnk7CisgIGdpbnQ2NCBzdGFydCA9IC0xLCBzdG9wID0gLTE7CisKKyAgZGVtdXgtPnVwc3RyZWFtX3NlZWthYmxlID0gRkFMU0U7CisKKyAgcXVlcnkgPSBnc3RfcXVlcnlfbmV3X3NlZWtpbmcgKEdTVF9GT1JNQVRfQllURVMpOworICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeSAoZGVtdXgtPnNpbmtwYWQsIHF1ZXJ5KSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAic2Vla2luZyBxdWVyeSBmYWlsZWQiKTsKKyAgICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKyAgICByZXR1cm47CisgIH0KKworICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksIE5VTEwsICZkZW11eC0+dXBzdHJlYW1fc2Vla2FibGUsCisgICAgICAmc3RhcnQsICZzdG9wKTsKKworICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKworICAvKiB0cnkgaGFyZGVyIHRvIHF1ZXJ5IHVwc3RyZWFtIHNpemUgaWYgd2UgZGlkbid0IGdldCBpdCB0aGUgZmlyc3QgdGltZSAqLworICBpZiAoZGVtdXgtPnVwc3RyZWFtX3NlZWthYmxlICYmIHN0b3AgPT0gLTEpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImRvaW5nIGR1cmF0aW9uIHF1ZXJ5IHRvIGZpeCB1cCB1bnNldCBzdG9wIik7CisgICAgZ3N0X3BhZF9wZWVyX3F1ZXJ5X2R1cmF0aW9uIChkZW11eC0+c2lua3BhZCwgR1NUX0ZPUk1BVF9CWVRFUywgJnN0b3ApOworICB9CisKKyAgLyogaWYgdXBzdHJlYW0gZG9lc24ndCBrbm93IHRoZSBzaXplLCBpdCdzIGxpa2VseSB0aGF0IGl0J3Mgbm90IHNlZWthYmxlIGluCisgICAqIHByYWN0aWNlIGV2ZW4gaWYgaXQgdGVjaG5pY2FsbHkgbWF5IGJlIHNlZWthYmxlICovCisgIGlmIChkZW11eC0+dXBzdHJlYW1fc2Vla2FibGUgJiYgKHN0YXJ0ICE9IDAgfHwgc3RvcCA8PSBzdGFydCkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInNlZWthYmxlIGJ1dCB1bmtub3duIHN0YXJ0L3N0b3AgLT4gZGlzYWJsZSIpOworICAgIGRlbXV4LT51cHN0cmVhbV9zZWVrYWJsZSA9IEZBTFNFOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJ1cHN0cmVhbSBzZWVrYWJsZTogJWQiLCBkZW11eC0+dXBzdHJlYW1fc2Vla2FibGUpOworfQorCitzdGF0aWMgR3N0RGF0ZVRpbWUgKgorcGFyc2VfZmx2X2RlbXV4X3BhcnNlX2RhdGVfc3RyaW5nIChjb25zdCBnY2hhciAqIHMpCit7CisgIHN0YXRpYyBjb25zdCBnY2hhciBtb250aHNbMTJdWzRdID0geworICAgICJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLAorICAgICJNYXkiLCAiSnVuIiwgIkp1bCIsICJBdWciLAorICAgICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiCisgIH07CisgIEdzdERhdGVUaW1lICpkdCA9IE5VTEw7CisgIGdjaGFyICoqdG9rZW5zOworICBndWludDY0IGQ7CisgIGdjaGFyICplbmRwdHIsICpzdHJpcHBlZDsKKyAgZ2ludCBpLCBoaCwgbW0sIHNzOworICBnaW50IHllYXIgPSAtMSwgbW9udGggPSAtMSwgZGF5ID0gLTE7CisgIGdpbnQgaG91ciA9IC0xLCBtaW51dGUgPSAtMSwgc2Vjb25kcyA9IC0xOworCisgIHN0cmlwcGVkID0gZ19zdHJzdHJpcCAoZ19zdHJkdXAgKHMpKTsKKworICAvKiAiRnJpIE9jdCAxNSAxNToxMzoxNiAyMDA0IiBuZWVkcyB0byBiZSBwYXJzZWQgKi8KKyAgdG9rZW5zID0gZ19zdHJzcGxpdCAoc3RyaXBwZWQsICIgIiwgLTEpOworCisgIGdfZnJlZSAoc3RyaXBwZWQpOworCisgIGlmIChnX3N0cnZfbGVuZ3RoICh0b2tlbnMpICE9IDUpCisgICAgZ290byBvdXQ7CisKKyAgLyogeWVhciAqLworICBkID0gZ19hc2NpaV9zdHJ0b3VsbCAodG9rZW5zWzRdLCAmZW5kcHRyLCAxMCk7CisgIGlmIChkID09IDAgJiYgKmVuZHB0ciAhPSAnXDAnKQorICAgIGdvdG8gb3V0OworCisgIHllYXIgPSBkOworCisgIC8qIG1vbnRoICovCisgIGlmIChzdHJsZW4gKHRva2Vuc1sxXSkgIT0gMykKKyAgICBnb3RvIG91dDsKKyAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHsKKyAgICBpZiAoIXN0cmNtcCAodG9rZW5zWzFdLCBtb250aHNbaV0pKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKGkgPT0gMTIpCisgICAgZ290byBvdXQ7CisKKyAgbW9udGggPSBpICsgMTsKKworICAvKiBkYXkgKi8KKyAgZCA9IGdfYXNjaWlfc3RydG91bGwgKHRva2Vuc1syXSwgJmVuZHB0ciwgMTApOworICBpZiAoZCA9PSAwICYmICplbmRwdHIgIT0gJ1wwJykKKyAgICBnb3RvIG91dDsKKworICBkYXkgPSBkOworCisgIC8qIHRpbWUgKi8KKyAgaGggPSBtbSA9IHNzID0gMDsKKyAgaWYgKHNzY2FuZiAodG9rZW5zWzNdLCAiJWQ6JWQ6JWQiLCAmaGgsICZtbSwgJnNzKSA8IDIpCisgICAgZ290byBvdXQ7CisgIGlmIChoaCA+PSAwICYmIGhoIDwgMjQgJiYgbW0gPj0gMCAmJiBtbSA8IDYwICYmIHNzID49IDAgJiYgc3MgPCA2MCkgeworICAgIGhvdXIgPSBoaDsKKyAgICBtaW51dGUgPSBtbTsKKyAgICBzZWNvbmRzID0gc3M7CisgIH0KKworb3V0OgorCisgIGlmICh0b2tlbnMpCisgICAgZ19zdHJmcmVldiAodG9rZW5zKTsKKworICBpZiAoeWVhciA+IDApCisgICAgZHQgPSBnc3RfZGF0ZV90aW1lX25ldyAoMC4wLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZHMpOworCisgIHJldHVybiBkdDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmx2X2RlbXV4X3BhcnNlX21ldGFkYXRhX2l0ZW0gKEdzdEZsdkRlbXV4ICogZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiByZWFkZXIsCisgICAgZ2Jvb2xlYW4gKiBlbmRfbWFya2VyKQoreworICBnY2hhciAqdGFnX25hbWUgPSBOVUxMOworICBndWludDggdGFnX3R5cGUgPSAwOworCisgIC8qIEluaXRpYWxpemUgdGhlIGVuZF9tYXJrZXIgZmxhZyB0byBGQUxTRSAqLworICAqZW5kX21hcmtlciA9IEZBTFNFOworCisgIC8qIE5hbWUgb2YgdGhlIHRhZyAqLworICB0YWdfbmFtZSA9IEZMVl9HRVRfU1RSSU5HIChyZWFkZXIpOworICBpZiAoR19VTkxJS0VMWSAoIXRhZ19uYW1lKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJmYWlsZWQgcmVhZGluZyB0YWcgbmFtZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIFdoYXQga2luZCBvZiBvYmplY3QgaXMgdGhhdCAqLworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKHJlYWRlciwgJnRhZ190eXBlKSkKKyAgICBnb3RvIGVycm9yOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAidGFnIG5hbWUgJXMsIHRhZyB0eXBlICVkIiwgdGFnX25hbWUsIHRhZ190eXBlKTsKKworICBzd2l0Y2ggKHRhZ190eXBlKSB7CisgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgLyogRG91YmxlICovCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZSBhIHVuaW9uIHRvIHJlYWQgdGhlIHVpbnQ2NCBhbmQgdGhlbiBhcyBhIGRvdWJsZSAqLworICAgICAgZ2RvdWJsZSBkID0gMDsKKworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2Zsb2F0NjRfYmUgKHJlYWRlciwgJmQpKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIiVzID0+IChkb3VibGUpICVmIiwgdGFnX25hbWUsIGQpOworCisgICAgICBpZiAoIXN0cmNtcCAodGFnX25hbWUsICJkdXJhdGlvbiIpKSB7CisgICAgICAgIGRlbXV4LT5kdXJhdGlvbiA9IGQgKiBHU1RfU0VDT05EOworCisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKGRlbXV4LT50YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgICBHU1RfVEFHX0RVUkFUSU9OLCBkZW11eC0+ZHVyYXRpb24sIE5VTEwpOworICAgICAgfSBlbHNlIGlmICghc3RyY21wICh0YWdfbmFtZSwgIkFzcGVjdFJhdGlvWCIpKSB7CisgICAgICAgIGRlbXV4LT5wYXJfeCA9IGQ7CisgICAgICAgIGRlbXV4LT5nb3RfcGFyID0gVFJVRTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCAodGFnX25hbWUsICJBc3BlY3RSYXRpb1kiKSkgeworICAgICAgICBkZW11eC0+cGFyX3kgPSBkOworICAgICAgICBkZW11eC0+Z290X3BhciA9IFRSVUU7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKHRhZ19uYW1lLCAid2lkdGgiKSkgeworICAgICAgICBkZW11eC0+dyA9IGQ7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKHRhZ19uYW1lLCAiaGVpZ2h0IikpIHsKKyAgICAgICAgZGVtdXgtPmggPSBkOworICAgICAgfSBlbHNlIGlmICghc3RyY21wICh0YWdfbmFtZSwgImZyYW1lcmF0ZSIpKSB7CisgICAgICAgIGRlbXV4LT5mcmFtZXJhdGUgPSBkOworICAgICAgfSBlbHNlIGlmICghc3RyY21wICh0YWdfbmFtZSwgImF1ZGlvZGF0YXJhdGUiKSkgeworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkIChkZW11eC0+YXVkaW9fdGFncywgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICAgICAgR1NUX1RBR19OT01JTkFMX0JJVFJBVEUsIChndWludCkgKGQgKiAxMDI0KSwgTlVMTCk7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKHRhZ19uYW1lLCAidmlkZW9kYXRhcmF0ZSIpKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKGRlbXV4LT52aWRlb190YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgICBHU1RfVEFHX05PTUlOQUxfQklUUkFURSwgKGd1aW50KSAoZCAqIDEwMjQpLCBOVUxMKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9JTkZPX09CSkVDVCAoZGVtdXgsICJUYWcgXCclc1wnIG5vdCBoYW5kbGVkIiwgdGFnX25hbWUpOworICAgICAgfQorCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgLyogQm9vbGVhbiAqLworICAgIHsKKyAgICAgIGd1aW50OCBiID0gMDsKKworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQ4IChyZWFkZXIsICZiKSkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICIlcyA9PiAoYm9vbGVhbikgJWQiLCB0YWdfbmFtZSwgYik7CisKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoZGVtdXgsICJUYWcgXCclc1wnIG5vdCBoYW5kbGVkIiwgdGFnX25hbWUpOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgLyogU3RyaW5nICovCisgICAgeworICAgICAgZ2NoYXIgKnMgPSBOVUxMOworCisgICAgICBzID0gRkxWX0dFVF9TVFJJTkcgKHJlYWRlcik7CisgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIiVzID0+IChzdHJpbmcpICVzIiwgdGFnX25hbWUsIHMpOworCisgICAgICBpZiAoIXN0cmNtcCAodGFnX25hbWUsICJjcmVhdGlvbmRhdGUiKSkgeworICAgICAgICBHc3REYXRlVGltZSAqZHQ7CisKKyAgICAgICAgZHQgPSBwYXJzZV9mbHZfZGVtdXhfcGFyc2VfZGF0ZV9zdHJpbmcgKHMpOworICAgICAgICBpZiAoZHQgPT0gTlVMTCkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiRmFpbGVkIHRvIHBhcnNlICclcycgaW50byBkYXRldGltZSIsIHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKGRlbXV4LT50YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgICAgIEdTVF9UQUdfREFURV9USU1FLCBkdCwgTlVMTCk7CisgICAgICAgICAgZ3N0X2RhdGVfdGltZV91bnJlZiAoZHQpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKHRhZ19uYW1lLCAiY3JlYXRvciIpKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKGRlbXV4LT50YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgICBHU1RfVEFHX0FSVElTVCwgcywgTlVMTCk7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKHRhZ19uYW1lLCAidGl0bGUiKSkgeworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkIChkZW11eC0+dGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICAgICAgR1NUX1RBR19USVRMRSwgcywgTlVMTCk7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKHRhZ19uYW1lLCAibWV0YWRhdGFjcmVhdG9yIikpIHsKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZCAoZGVtdXgtPnRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgICAgICAgIEdTVF9UQUdfRU5DT0RFUiwgcywgTlVMTCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKGRlbXV4LCAiVGFnIFwnJXNcJyBub3QgaGFuZGxlZCIsIHRhZ19uYW1lKTsKKyAgICAgIH0KKworICAgICAgZ19mcmVlIChzKTsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgIC8qIE9iamVjdCAqLworICAgIHsKKyAgICAgIGdib29sZWFuIGVuZF9vZl9vYmplY3RfbWFya2VyID0gRkFMU0U7CisKKyAgICAgIHdoaWxlICghZW5kX29mX29iamVjdF9tYXJrZXIpIHsKKyAgICAgICAgZ2Jvb2xlYW4gb2sgPSBnc3RfZmx2X2RlbXV4X3BhcnNlX21ldGFkYXRhX2l0ZW0gKGRlbXV4LCByZWFkZXIsCisgICAgICAgICAgICAmZW5kX29mX29iamVjdF9tYXJrZXIpOworCisgICAgICAgIGlmIChHX1VOTElLRUxZICghb2spKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgImZhaWxlZCByZWFkaW5nIGEgdGFnLCBza2lwcGluZyIpOworICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgODogICAgICAgICAgICAgICAgICAgIC8qIEVDTUEgYXJyYXkgKi8KKyAgICB7CisgICAgICBndWludDMyIG5iX2VsZW1zID0gMDsKKyAgICAgIGdib29sZWFuIGVuZF9vZl9vYmplY3RfbWFya2VyID0gRkFMU0U7CisKKyAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKHJlYWRlciwgJm5iX2VsZW1zKSkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJ0aGVyZSBhcmUgYXBwcm94LiAlZCBlbGVtZW50cyBpbiB0aGUgYXJyYXkiLAorICAgICAgICAgIG5iX2VsZW1zKTsKKworICAgICAgd2hpbGUgKCFlbmRfb2Zfb2JqZWN0X21hcmtlcikgeworICAgICAgICBnYm9vbGVhbiBvayA9IGdzdF9mbHZfZGVtdXhfcGFyc2VfbWV0YWRhdGFfaXRlbSAoZGVtdXgsIHJlYWRlciwKKyAgICAgICAgICAgICZlbmRfb2Zfb2JqZWN0X21hcmtlcik7CisKKyAgICAgICAgaWYgKEdfVU5MSUtFTFkgKCFvaykpIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiZmFpbGVkIHJlYWRpbmcgYSB0YWcsIHNraXBwaW5nIik7CisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA5OiAgICAgICAgICAgICAgICAgICAgLyogRW5kIG1hcmtlciAqLworICAgIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZW5kIG1hcmtlciA/Iik7CisgICAgICBpZiAodGFnX25hbWVbMF0gPT0gJ1wwJykgeworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZW5kIG1hcmtlciBkZXRlY3RlZCIpOworCisgICAgICAgICplbmRfbWFya2VyID0gVFJVRTsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMTA6ICAgICAgICAgICAgICAgICAgIC8qIEFycmF5ICovCisgICAgeworICAgICAgZ3VpbnQzMiBuYl9lbGVtcyA9IDA7CisKKyAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKHJlYWRlciwgJm5iX2VsZW1zKSkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJhcnJheSBoYXMgJWQgZWxlbWVudHMiLCBuYl9lbGVtcyk7CisKKyAgICAgIGlmICghc3RyY21wICh0YWdfbmFtZSwgInRpbWVzIikpIHsKKyAgICAgICAgaWYgKGRlbXV4LT50aW1lcykgeworICAgICAgICAgIGdfYXJyYXlfZnJlZSAoZGVtdXgtPnRpbWVzLCBUUlVFKTsKKyAgICAgICAgfQorICAgICAgICBkZW11eC0+dGltZXMgPSBnX2FycmF5X25ldyAoRkFMU0UsIFRSVUUsIHNpemVvZiAoZ2RvdWJsZSkpOworICAgICAgfSBlbHNlIGlmICghc3RyY21wICh0YWdfbmFtZSwgImZpbGVwb3NpdGlvbnMiKSkgeworICAgICAgICBpZiAoZGVtdXgtPmZpbGVwb3NpdGlvbnMpIHsKKyAgICAgICAgICBnX2FycmF5X2ZyZWUgKGRlbXV4LT5maWxlcG9zaXRpb25zLCBUUlVFKTsKKyAgICAgICAgfQorICAgICAgICBkZW11eC0+ZmlsZXBvc2l0aW9ucyA9IGdfYXJyYXlfbmV3IChGQUxTRSwgVFJVRSwgc2l6ZW9mIChnZG91YmxlKSk7CisgICAgICB9CisKKyAgICAgIHdoaWxlIChuYl9lbGVtcy0tKSB7CisgICAgICAgIGd1aW50OCBlbGVtX3R5cGUgPSAwOworCisgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAocmVhZGVyLCAmZWxlbV90eXBlKSkKKyAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAgIHN3aXRjaCAoZWxlbV90eXBlKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGdkb3VibGUgZDsKKworICAgICAgICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2Zsb2F0NjRfYmUgKHJlYWRlciwgJmQpKQorICAgICAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImVsZW1lbnQgaXMgYSBkb3VibGUgJWYiLCBkKTsKKworICAgICAgICAgICAgaWYgKCFzdHJjbXAgKHRhZ19uYW1lLCAidGltZXMiKSAmJiBkZW11eC0+dGltZXMpIHsKKyAgICAgICAgICAgICAgZ19hcnJheV9hcHBlbmRfdmFsIChkZW11eC0+dGltZXMsIGQpOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wICh0YWdfbmFtZSwgImZpbGVwb3NpdGlvbnMiKSAmJgorICAgICAgICAgICAgICAgIGRlbXV4LT5maWxlcG9zaXRpb25zKSB7CisgICAgICAgICAgICAgIGdfYXJyYXlfYXBwZW5kX3ZhbCAoZGVtdXgtPmZpbGVwb3NpdGlvbnMsIGQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAidW5zdXBwb3J0ZWQgYXJyYXkgZWxlbWVudCB0eXBlICVkIiwKKyAgICAgICAgICAgICAgICBlbGVtX3R5cGUpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDExOiAgICAgICAgICAgICAgICAgICAvKiBEYXRlICovCisgICAgeworICAgICAgZ2RvdWJsZSBkID0gMDsKKyAgICAgIGdpbnQxNiBpID0gMDsKKworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2Zsb2F0NjRfYmUgKHJlYWRlciwgJmQpKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfaW50MTZfYmUgKHJlYWRlciwgJmkpKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAiJXMgPT4gKGRhdGUgYXMgYSBkb3VibGUpICVmLCB0aW1lem9uZSBvZmZzZXQgJWQiLCB0YWdfbmFtZSwgZCwgaSk7CisKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoZGVtdXgsICJUYWcgXCclc1wnIG5vdCBoYW5kbGVkIiwgdGFnX25hbWUpOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJ1bnN1cHBvcnRlZCB0YWcgdHlwZSAlZCIsIHRhZ190eXBlKTsKKyAgfQorCisgIGdfZnJlZSAodGFnX25hbWUpOworCisgIHJldHVybiBUUlVFOworCitlcnJvcjoKKyAgZ19mcmVlICh0YWdfbmFtZSk7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2Zsdl9kZW11eF9jbGVhcl90YWdzIChHc3RGbHZEZW11eCAqIGRlbXV4KQoreworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImNsZWFyaW5nIHRhZ2xpc3QiKTsKKworICBpZiAoZGVtdXgtPnRhZ2xpc3QpIHsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKGRlbXV4LT50YWdsaXN0KTsKKyAgfQorICBkZW11eC0+dGFnbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIGdzdF90YWdfbGlzdF9zZXRfc2NvcGUgKGRlbXV4LT50YWdsaXN0LCBHU1RfVEFHX1NDT1BFX0dMT0JBTCk7CisKKyAgaWYgKGRlbXV4LT5hdWRpb190YWdzKSB7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmIChkZW11eC0+YXVkaW9fdGFncyk7CisgIH0KKyAgZGVtdXgtPmF1ZGlvX3RhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgIGlmIChkZW11eC0+dmlkZW9fdGFncykgeworICAgIGdzdF90YWdfbGlzdF91bnJlZiAoZGVtdXgtPnZpZGVvX3RhZ3MpOworICB9CisgIGRlbXV4LT52aWRlb190YWdzID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbHZfZGVtdXhfcGFyc2VfdGFnX3NjcmlwdCAoR3N0Rmx2RGVtdXggKiBkZW11eCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RCeXRlUmVhZGVyIHJlYWRlcjsKKyAgZ3VpbnQ4IHR5cGUgPSAwOworICBHc3RNYXBJbmZvIG1hcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSA+PSA3LCBHU1RfRkxPV19FUlJPUik7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZyZWFkZXIsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisKKyAgZ3N0X2J5dGVfcmVhZGVyX3NraXBfdW5jaGVja2VkICgmcmVhZGVyLCA3KTsKKworICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJwYXJzaW5nIGEgc2NyaXB0IHRhZyIpOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAoJnJlYWRlciwgJnR5cGUpKQorICAgIGdvdG8gY2xlYW51cDsKKworICAvKiBNdXN0IGJlIHN0cmluZyAqLworICBpZiAodHlwZSA9PSAyKSB7CisgICAgZ2NoYXIgKmZ1bmN0aW9uX25hbWU7CisgICAgZ3VpbnQgaTsKKworICAgIGZ1bmN0aW9uX25hbWUgPSBGTFZfR0VUX1NUUklORyAoJnJlYWRlcik7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJmdW5jdGlvbiBuYW1lIGlzICVzIiwgR1NUX1NUUl9OVUxMIChmdW5jdGlvbl9uYW1lKSk7CisKKyAgICBpZiAoZnVuY3Rpb25fbmFtZSAhPSBOVUxMICYmIHN0cmNtcCAoZnVuY3Rpb25fbmFtZSwgIm9uTWV0YURhdGEiKSA9PSAwKSB7CisgICAgICBnYm9vbGVhbiBlbmRfbWFya2VyID0gRkFMU0U7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIndlIGhhdmUgYSBtZXRhZGF0YSBzY3JpcHQgb2JqZWN0Iik7CisKKyAgICAgIGdzdF9mbHZfZGVtdXhfY2xlYXJfdGFncyAoZGVtdXgpOworCisgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZyZWFkZXIsICZ0eXBlKSkgeworICAgICAgICBnX2ZyZWUgKGZ1bmN0aW9uX25hbWUpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIDg6CisgICAgICAgIHsKKyAgICAgICAgICBndWludDMyIG5iX2VsZW1zID0gMDsKKworICAgICAgICAgIC8qIEVDTUEgYXJyYXkgKi8KKyAgICAgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmcmVhZGVyLCAmbmJfZWxlbXMpKSB7CisgICAgICAgICAgICBnX2ZyZWUgKGZ1bmN0aW9uX25hbWUpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaXMganVzdCBhIGhpbnQsIHNvbWUgZmlsZXMgaGF2ZQorICAgICAgICAgICAgIG5iX2VsZW1lbnRzID09IDAgYW5kIGFjdHVhbGx5IGNvbnRhaW4gaXRlbXMuICovCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJ0aGVyZSBhcmUgYXBwcm94LiAlZCBlbGVtZW50cyBpbiB0aGUgYXJyYXkiLAorICAgICAgICAgICAgICBuYl9lbGVtcyk7CisgICAgICAgIH0KKyAgICAgICAgICAvKiBmYWxsdGhyb3VnaCB0byByZWFkIGRhdGEgKi8KKyAgICAgICAgY2FzZSAzOgorICAgICAgICB7CisgICAgICAgICAgLyogT2JqZWN0ICovCisgICAgICAgICAgd2hpbGUgKCFlbmRfbWFya2VyKSB7CisgICAgICAgICAgICBnYm9vbGVhbiBvayA9CisgICAgICAgICAgICAgICAgZ3N0X2Zsdl9kZW11eF9wYXJzZV9tZXRhZGF0YV9pdGVtIChkZW11eCwgJnJlYWRlciwgJmVuZF9tYXJrZXIpOworCisgICAgICAgICAgICBpZiAoR19VTkxJS0VMWSAoIW9rKSkgeworICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiZmFpbGVkIHJlYWRpbmcgYSB0YWcsIHNraXBwaW5nIik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiVW5oYW5kbGVkIHNjcmlwdCBkYXRhIHR5cGUgOiAlZCIsIHR5cGUpOworICAgICAgICAgIGdfZnJlZSAoZnVuY3Rpb25fbmFtZSk7CisgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgfQorCisgICAgICBnc3RfZmx2X2RlbXV4X3B1c2hfdGFncyAoZGVtdXgpOworICAgIH0KKworICAgIGdfZnJlZSAoZnVuY3Rpb25fbmFtZSk7CisKKyAgICBpZiAoZGVtdXgtPnRpbWVzICYmIGRlbXV4LT5maWxlcG9zaXRpb25zKSB7CisgICAgICBndWludCBudW07CisKKyAgICAgIC8qIElmIGFuIGluZGV4IHdhcyBmb3VuZCwgaW5zZXJ0IGFzc29jaWF0aW9ucyAqLworICAgICAgbnVtID0gTUlOIChkZW11eC0+dGltZXMtPmxlbiwgZGVtdXgtPmZpbGVwb3NpdGlvbnMtPmxlbik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgICAgZ3VpbnQ2NCB0aW1lLCBmaWxlcG9zaXRpb247CisKKyAgICAgICAgdGltZSA9IGdfYXJyYXlfaW5kZXggKGRlbXV4LT50aW1lcywgZ2RvdWJsZSwgaSkgKiBHU1RfU0VDT05EOworICAgICAgICBmaWxlcG9zaXRpb24gPSBnX2FycmF5X2luZGV4IChkZW11eC0+ZmlsZXBvc2l0aW9ucywgZ2RvdWJsZSwgaSk7CisgICAgICAgIGdzdF9mbHZfZGVtdXhfcGFyc2VfYW5kX2FkZF9pbmRleF9lbnRyeSAoZGVtdXgsIHRpbWUsIGZpbGVwb3NpdGlvbiwKKyAgICAgICAgICAgIFRSVUUpOworICAgICAgfQorICAgICAgZGVtdXgtPmluZGV4ZWQgPSBUUlVFOworICAgIH0KKyAgfQorCitjbGVhbnVwOgorICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgoraGF2ZV9ncm91cF9pZCAoR3N0Rmx2RGVtdXggKiBkZW11eCkKK3sKKyAgR3N0RXZlbnQgKmV2ZW50OworCisgIGV2ZW50ID0gZ3N0X3BhZF9nZXRfc3RpY2t5X2V2ZW50IChkZW11eC0+c2lua3BhZCwgR1NUX0VWRU5UX1NUUkVBTV9TVEFSVCwgMCk7CisgIGlmIChldmVudCkgeworICAgIGlmIChnc3RfZXZlbnRfcGFyc2VfZ3JvdXBfaWQgKGV2ZW50LCAmZGVtdXgtPmdyb3VwX2lkKSkKKyAgICAgIGRlbXV4LT5oYXZlX2dyb3VwX2lkID0gVFJVRTsKKyAgICBlbHNlCisgICAgICBkZW11eC0+aGF2ZV9ncm91cF9pZCA9IEZBTFNFOworICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICB9IGVsc2UgaWYgKCFkZW11eC0+aGF2ZV9ncm91cF9pZCkgeworICAgIGRlbXV4LT5oYXZlX2dyb3VwX2lkID0gVFJVRTsKKyAgICBkZW11eC0+Z3JvdXBfaWQgPSBnc3RfdXRpbF9ncm91cF9pZF9uZXh0ICgpOworICB9CisKKyAgcmV0dXJuIGRlbXV4LT5oYXZlX2dyb3VwX2lkOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbHZfZGVtdXhfYXVkaW9fbmVnb3RpYXRlIChHc3RGbHZEZW11eCAqIGRlbXV4LCBndWludDMyIGNvZGVjX3RhZywKKyAgICBndWludDMyIHJhdGUsIGd1aW50MzIgY2hhbm5lbHMsIGd1aW50MzIgd2lkdGgpCit7CisgIEdzdENhcHMgKmNhcHMgPSBOVUxMLCAqb2xkX2NhcHM7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworICBndWludCBhZGp1c3RlZF9yYXRlID0gcmF0ZTsKKyAgR3N0RXZlbnQgKmV2ZW50OworICBnY2hhciAqc3RyZWFtX2lkOworCisgIHN3aXRjaCAoY29kZWNfdGFnKSB7CisgICAgY2FzZSAxOgorICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LWFkcGNtIiwgImxheW91dCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgICAgInN3ZiIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgIGNhc2UgMTQ6CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL21wZWciLAorICAgICAgICAgICJtcGVndmVyc2lvbiIsIEdfVFlQRV9JTlQsIDEsICJsYXllciIsIEdfVFlQRV9JTlQsIDMsCisgICAgICAgICAgInBhcnNlZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMDoKKyAgICBjYXNlIDM6CisgICAgeworICAgICAgR3N0QXVkaW9Gb3JtYXQgZm9ybWF0OworCisgICAgICAvKiBBc3N1bWluZyBsaXR0bGUgZW5kaWFuIGZvciAwIChha2EgZW5kaWFubmVzcyBvZiB0aGUKKyAgICAgICAqIHN5c3RlbSBvbiB3aGljaCB0aGUgZmlsZSB3YXMgY3JlYXRlZCkgYXMgbW9zdCBwZW9wbGUKKyAgICAgICAqIGFyZSBwcm9iYWJseSB1c2luZyBsaXR0bGUgZW5kaWFuIG1hY2hpbmVzICovCisgICAgICBmb3JtYXQgPSBnc3RfYXVkaW9fZm9ybWF0X2J1aWxkX2ludGVnZXIgKCh3aWR0aCA9PSA4KSA/IEZBTFNFIDogVFJVRSwKKyAgICAgICAgICBHX0xJVFRMRV9FTkRJQU4sIHdpZHRoLCB3aWR0aCk7CisKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLAorICAgICAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCBnc3RfYXVkaW9fZm9ybWF0X3RvX3N0cmluZyAoZm9ybWF0KSwKKyAgICAgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImludGVybGVhdmVkIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA0OgorICAgIGNhc2UgNToKKyAgICBjYXNlIDY6CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtbmVsbHltb3NlciIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICB7CisgICAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICAgIGlmICghZGVtdXgtPmF1ZGlvX2NvZGVjX2RhdGEpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJkb24ndCBoYXZlIEFBQyBjb2RlYyBkYXRhIHlldCIpOworICAgICAgICByZXQgPSBUUlVFOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisKKyAgICAgIGdzdF9idWZmZXJfbWFwIChkZW11eC0+YXVkaW9fY29kZWNfZGF0YSwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICAgICAgLyogdXNlIGNvZGVjLWRhdGEgdG8gZXh0cmFjdCBhbmQgdmVyaWZ5IHNhbXBsZXJhdGUgKi8KKyAgICAgIGlmIChtYXAuc2l6ZSA+PSAyKSB7CisgICAgICAgIGdpbnQgZnJlcV9pbmRleDsKKworICAgICAgICBmcmVxX2luZGV4ID0gR1NUX1JFQURfVUlOVDE2X0JFIChtYXAuZGF0YSk7CisgICAgICAgIGZyZXFfaW5kZXggPSAoZnJlcV9pbmRleCAmIDB4MDc4MCkgPj4gNzsKKyAgICAgICAgYWRqdXN0ZWRfcmF0ZSA9CisgICAgICAgICAgICBnc3RfY29kZWNfdXRpbHNfYWFjX2dldF9zYW1wbGVfcmF0ZV9mcm9tX2luZGV4IChmcmVxX2luZGV4KTsKKworICAgICAgICBpZiAoYWRqdXN0ZWRfcmF0ZSAmJiAocmF0ZSAhPSBhZGp1c3RlZF9yYXRlKSkgeworICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgIkFqdXN0aW5nIEFBQyBzYW1wbGUgcmF0ZSAlZCAtPiAlZCIsIHJhdGUsCisgICAgICAgICAgICAgIGFkanVzdGVkX3JhdGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGFkanVzdGVkX3JhdGUgPSByYXRlOworICAgICAgICB9CisgICAgICB9CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChkZW11eC0+YXVkaW9fY29kZWNfZGF0YSwgJm1hcCk7CisKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8vbXBlZyIsCisgICAgICAgICAgIm1wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgNCwgImZyYW1lZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLAorICAgICAgICAgICJzdHJlYW0tZm9ybWF0IiwgR19UWVBFX1NUUklORywgInJhdyIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgNzoKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8veC1hbGF3Iik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtbXVsYXciKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTE6CisgICAgeworICAgICAgR1ZhbHVlIHN0cmVhbWhlYWRlciA9IEdfVkFMVUVfSU5JVDsKKyAgICAgIEdWYWx1ZSB2YWx1ZSA9IEdfVkFMVUVfSU5JVDsKKyAgICAgIEdzdEJ5dGVXcml0ZXIgdzsKKyAgICAgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICAgICAgR3N0QnVmZmVyICpidWY7CisgICAgICBHc3RUYWdMaXN0ICp0YWdzOworCisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtc3BlZXgiKTsKKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImdlbmVyYXRpbmcgc3BlZXggaGVhZGVyIik7CisKKyAgICAgIC8qIFNwZWV4IGRlY29kZXIgZXhwZWN0cyBzdHJlYW1oZWFkZXIgdG8gYmUgeyBbaGVhZGVyXSwgW2NvbW1lbnRdIH0gKi8KKyAgICAgIGdfdmFsdWVfaW5pdCAoJnN0cmVhbWhlYWRlciwgR1NUX1RZUEVfQVJSQVkpOworCisgICAgICAvKiBoZWFkZXIgcGFydCAqLworICAgICAgZ3N0X2J5dGVfd3JpdGVyX2luaXRfd2l0aF9zaXplICgmdywgODAsIFRSVUUpOworICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICgmdywgKGd1aW50OCAqKSAiU3BlZXggICAiLCA4KTsKKyAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfZGF0YSAoJncsIChndWludDggKikgIjEuMS4xMiIsIDcpOworICAgICAgZ3N0X2J5dGVfd3JpdGVyX2ZpbGwgKCZ3LCAwLCAxMyk7CisgICAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJncsIDEpOyAgICAvKiB2ZXJzaW9uICovCisgICAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJncsIDgwKTsgICAvKiBoZWFkZXJfc2l6ZSAqLworICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZ3LCAxNjAwMCk7ICAgICAgICAvKiByYXRlICovCisgICAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJncsIDEpOyAgICAvKiBtb2RlOiBXaWRlYmFuZCAqLworICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZ3LCA0KTsgICAgLyogbW9kZV9iaXRzdHJlYW1fdmVyc2lvbiAqLworICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZ3LCAxKTsgICAgLyogbmJfY2hhbm5lbHM6IDEgKi8KKyAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmdywgLTEpOyAgIC8qIGJpdHJhdGUgKi8KKyAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmdywgMHg1MCk7IC8qIGZyYW1lX3NpemUgKi8KKyAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmdywgMCk7ICAgIC8qIFZCUiAqLworICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZ3LCAxKTsgICAgLyogZnJhbWVzX3Blcl9wYWNrZXQgKi8KKyAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmdywgMCk7ICAgIC8qIGV4dHJhX2hlYWRlcnMgKi8KKyAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmdywgMCk7ICAgIC8qIHJlc2VydmVkMSAqLworICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZ3LCAwKTsgICAgLyogcmVzZXJ2ZWQyICovCisgICAgICBnX2Fzc2VydCAoZ3N0X2J5dGVfd3JpdGVyX2dldF9zaXplICgmdykgPT0gODApOworCisgICAgICBnX3ZhbHVlX2luaXQgKCZ2YWx1ZSwgR1NUX1RZUEVfQlVGRkVSKTsKKyAgICAgIGdfdmFsdWVfdGFrZV9ib3hlZCAoJnZhbHVlLCBnc3RfYnl0ZV93cml0ZXJfcmVzZXRfYW5kX2dldF9idWZmZXIgKCZ3KSk7CisgICAgICBnc3RfdmFsdWVfYXJyYXlfYXBwZW5kX3ZhbHVlICgmc3RyZWFtaGVhZGVyLCAmdmFsdWUpOworICAgICAgZ192YWx1ZV91bnNldCAoJnZhbHVlKTsKKworICAgICAgLyogY29tbWVudCBwYXJ0ICovCisgICAgICBnX3ZhbHVlX2luaXQgKCZ2YWx1ZSwgR1NUX1RZUEVfQlVGRkVSKTsKKyAgICAgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAgICAgYnVmID0gZ3N0X3RhZ19saXN0X3RvX3ZvcmJpc2NvbW1lbnRfYnVmZmVyICh0YWdzLCBOVUxMLCAwLCAiTm8gY29tbWVudHMiKTsKKyAgICAgIGdzdF90YWdfbGlzdF91bnJlZiAodGFncyk7CisgICAgICBnX3ZhbHVlX3Rha2VfYm94ZWQgKCZ2YWx1ZSwgYnVmKTsKKyAgICAgIGdzdF92YWx1ZV9hcnJheV9hcHBlbmRfdmFsdWUgKCZzdHJlYW1oZWFkZXIsICZ2YWx1ZSk7CisgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdmFsdWUpOworCisgICAgICBnc3Rfc3RydWN0dXJlX3Rha2VfdmFsdWUgKHN0cnVjdHVyZSwgInN0cmVhbWhlYWRlciIsICZzdHJlYW1oZWFkZXIpOworCisgICAgICBjaGFubmVscyA9IDE7CisgICAgICBhZGp1c3RlZF9yYXRlID0gMTYwMDA7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJ1bnN1cHBvcnRlZCBhdWRpbyBjb2RlYyB0YWcgJXUiLCBjb2RlY190YWcpOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoIWNhcHMpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgImZhaWxlZCBjcmVhdGluZyBjYXBzIGZvciBhdWRpbyBwYWQiKTsKKyAgICBnb3RvIGJlYWNoOworICB9CisKKyAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgInJhdGUiLCBHX1RZUEVfSU5ULCBhZGp1c3RlZF9yYXRlLAorICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgY2hhbm5lbHMsIE5VTEwpOworCisgIGlmIChkZW11eC0+YXVkaW9fY29kZWNfZGF0YSkgeworICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLAorICAgICAgICBkZW11eC0+YXVkaW9fY29kZWNfZGF0YSwgTlVMTCk7CisgIH0KKworICBvbGRfY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoZGVtdXgtPmF1ZGlvX3BhZCk7CisgIGlmICghb2xkX2NhcHMpIHsKKyAgICBzdHJlYW1faWQgPQorICAgICAgICBnc3RfcGFkX2NyZWF0ZV9zdHJlYW1faWQgKGRlbXV4LT5hdWRpb19wYWQsIEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSwKKyAgICAgICAgImF1ZGlvIik7CisKKyAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0IChzdHJlYW1faWQpOworICAgIGlmIChoYXZlX2dyb3VwX2lkIChkZW11eCkpCisgICAgICBnc3RfZXZlbnRfc2V0X2dyb3VwX2lkIChldmVudCwgZGVtdXgtPmdyb3VwX2lkKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKGRlbXV4LT5hdWRpb19wYWQsIGV2ZW50KTsKKyAgICBnX2ZyZWUgKHN0cmVhbV9pZCk7CisgIH0KKyAgaWYgKCFvbGRfY2FwcyB8fCAhZ3N0X2NhcHNfaXNfZXF1YWwgKG9sZF9jYXBzLCBjYXBzKSkKKyAgICByZXQgPSBnc3RfcGFkX3NldF9jYXBzIChkZW11eC0+YXVkaW9fcGFkLCBjYXBzKTsKKyAgZWxzZQorICAgIHJldCA9IFRSVUU7CisKKyAgaWYgKG9sZF9jYXBzKQorICAgIGdzdF9jYXBzX3VucmVmIChvbGRfY2Fwcyk7CisKK2RvbmU6CisgIGlmIChHX0xJS0VMWSAocmV0KSkgeworICAgIC8qIFN0b3JlIHRoZSBjYXBzIHdlIGdvdCBmcm9tIHRhZ3MgKi8KKyAgICBkZW11eC0+YXVkaW9fY29kZWNfdGFnID0gY29kZWNfdGFnOworICAgIGRlbXV4LT5yYXRlID0gcmF0ZTsKKyAgICBkZW11eC0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICBkZW11eC0+d2lkdGggPSB3aWR0aDsKKworICAgIGlmIChjYXBzKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eC0+YXVkaW9fcGFkLCAic3VjY2Vzc2Z1bGx5IG5lZ290aWF0ZWQgY2FwcyAlIgorICAgICAgICAgIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICAgICAgZ3N0X2Zsdl9kZW11eF9wdXNoX3RhZ3MgKGRlbXV4KTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgtPmF1ZGlvX3BhZCwgImRlbGF5ZWQgc2V0dGluZyBjYXBzIik7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgtPmF1ZGlvX3BhZCwgImZhaWxlZCBuZWdvdGlhdGluZyBjYXBzICUiCisgICAgICAgIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKyAgfQorCisgIGlmIChjYXBzKQorICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworYmVhY2g6CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2Zsdl9kZW11eF9wdXNoX3NyY19ldmVudCAoR3N0Rmx2RGVtdXggKiBkZW11eCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKworICBpZiAoZGVtdXgtPmF1ZGlvX3BhZCkKKyAgICByZXQgfD0gZ3N0X3BhZF9wdXNoX2V2ZW50IChkZW11eC0+YXVkaW9fcGFkLCBnc3RfZXZlbnRfcmVmIChldmVudCkpOworCisgIGlmIChkZW11eC0+dmlkZW9fcGFkKQorICAgIHJldCB8PSBnc3RfcGFkX3B1c2hfZXZlbnQgKGRlbXV4LT52aWRlb19wYWQsIGdzdF9ldmVudF9yZWYgKGV2ZW50KSk7CisKKyAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9mbHZfZGVtdXhfYWRkX2NvZGVjX3RhZyAoR3N0Rmx2RGVtdXggKiBkZW11eCwgY29uc3QgZ2NoYXIgKiB0YWcsCisgICAgR3N0UGFkICogcGFkKQoreworICBpZiAocGFkKSB7CisgICAgR3N0Q2FwcyAqY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAocGFkKTsKKworICAgIGlmIChjYXBzKSB7CisgICAgICBnY2hhciAqY29kZWNfbmFtZSA9IGdzdF9wYl91dGlsc19nZXRfY29kZWNfZGVzY3JpcHRpb24gKGNhcHMpOworCisgICAgICBpZiAoY29kZWNfbmFtZSkgeworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkIChkZW11eC0+dGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICAgICAgdGFnLCBjb2RlY19uYW1lLCBOVUxMKTsKKyAgICAgICAgZ19mcmVlIChjb2RlY19uYW1lKTsKKyAgICAgIH0KKworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2Zsdl9kZW11eF9wdXNoX3RhZ3MgKEdzdEZsdkRlbXV4ICogZGVtdXgpCit7CisgIGdzdF9mbHZfZGVtdXhfYWRkX2NvZGVjX3RhZyAoZGVtdXgsIEdTVF9UQUdfQVVESU9fQ09ERUMsIGRlbXV4LT5hdWRpb19wYWQpOworICBnc3RfZmx2X2RlbXV4X2FkZF9jb2RlY190YWcgKGRlbXV4LCBHU1RfVEFHX1ZJREVPX0NPREVDLCBkZW11eC0+dmlkZW9fcGFkKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInB1c2hpbmcgJSIgR1NUX1BUUl9GT1JNQVQsIGRlbXV4LT50YWdsaXN0KTsKKworICBnc3RfZmx2X2RlbXV4X3B1c2hfc3JjX2V2ZW50IChkZW11eCwKKyAgICAgIGdzdF9ldmVudF9uZXdfdGFnIChnc3RfdGFnX2xpc3RfY29weSAoZGVtdXgtPnRhZ2xpc3QpKSk7CisKKyAgaWYgKGRlbXV4LT5hdWRpb19wYWQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eC0+YXVkaW9fcGFkLCAicHVzaGluZyBhdWRpbyAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgICAgZGVtdXgtPmF1ZGlvX3RhZ3MpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoZGVtdXgtPmF1ZGlvX3BhZCwKKyAgICAgICAgZ3N0X2V2ZW50X25ld190YWcgKGdzdF90YWdfbGlzdF9jb3B5IChkZW11eC0+YXVkaW9fdGFncykpKTsKKyAgfQorCisgIGlmIChkZW11eC0+dmlkZW9fcGFkKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgtPnZpZGVvX3BhZCwgInB1c2hpbmcgdmlkZW8gJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgIGRlbXV4LT52aWRlb190YWdzKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKGRlbXV4LT52aWRlb19wYWQsCisgICAgICAgIGdzdF9ldmVudF9uZXdfdGFnIChnc3RfdGFnX2xpc3RfY29weSAoZGVtdXgtPnZpZGVvX3RhZ3MpKSk7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmx2X2RlbXV4X3VwZGF0ZV9yZXN5bmMgKEdzdEZsdkRlbXV4ICogZGVtdXgsIGd1aW50MzIgZHRzLCBnYm9vbGVhbiBkaXNjb250LAorICAgIGd1aW50MzIgKiBsYXN0LCBHc3RDbG9ja1RpbWUgKiBvZmZzZXQpCit7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworICBnaW50MzIgZGR0cyA9IGR0cyAtICpsYXN0OworICBpZiAoIWRpc2NvbnQgJiYgZGR0cyA8PSAtUkVTWU5DX1RIUkVTSE9MRCkgeworICAgIC8qIFRoZW9yZXRpY2FsbHksIHdlIHNob3VsZCB1c2Ugc3Vic3RyYWN0IHRoZSBkdXJhdGlvbiBvZiB0aGUgbGFzdCBidWZmZXIsCisgICAgICAgYnV0IHRoaXMgZGVtdXhlciBzZW5kcyBubyBkdXJhdGlvbnMgb24gYnVmZmVycywgbm90IHN1cmUgaWYgaXQgY2Fubm90CisgICAgICAga25vdywgb3IganVzdCBkb2VzIG5vdCBjYXJlIHRvIGNhbGN1bGF0ZS4gKi8KKyAgICAqb2Zmc2V0IC09IGRkdHMgKiBHU1RfTVNFQ09ORDsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAiTGFyZ2UgZHRzIGdhcCAoJSIgR19HSU5UMzJfRk9STUFUICIgbXMpLCBhc3N1bWluZyByZXN5bmMsIG9mZnNldCBub3cgJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFUICIiLCBkZHRzLCBHU1RfVElNRV9BUkdTICgqb2Zmc2V0KSk7CisKKyAgICByZXQgPSBUUlVFOworICB9CisgICpsYXN0ID0gZHRzOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZmx2X2RlbXV4X3BhcnNlX3RhZ19hdWRpbyAoR3N0Rmx2RGVtdXggKiBkZW11eCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludDMyIHB0cyA9IDAsIGNvZGVjX3RhZyA9IDAsIHJhdGUgPSA1NTEyLCB3aWR0aCA9IDgsIGNoYW5uZWxzID0gMTsKKyAgZ3VpbnQzMiBjb2RlY19kYXRhID0gMCwgcHRzX2V4dCA9IDA7CisgIGd1aW50OCBmbGFncyA9IDA7CisgIEdzdE1hcEluZm8gbWFwOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ3VpbnQ4ICpkYXRhOworCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgInBhcnNpbmcgYW4gYXVkaW8gdGFnIik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFkZW11eC0+YXVkaW9fcGFkICYmIGRlbXV4LT5ub19tb3JlX3BhZHMpKSB7CisjaWZuZGVmIEdTVF9ESVNBQkxFX0RFQlVHCisgICAgaWYgKEdfVU5MSUtFTFkgKCFkZW11eC0+bm9fYXVkaW9fd2FybmVkKSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAiU2lnbmFsZWQgbm8tbW9yZS1wYWRzIGFscmVhZHkgYnV0IGhhZCBubyBhdWRpbyBwYWQgLS0gaWdub3JpbmciKTsKKyAgICAgIGRlbXV4LT5ub19hdWRpb193YXJuZWQgPSBUUlVFOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpID09IGRlbXV4LT50YWdfc2l6ZSwKKyAgICAgIEdTVF9GTE9XX0VSUk9SKTsKKworICAvKiBFcnJvciBvdXQgb24gdGFncyB3aXRoIHRvbyBzbWFsbCBoZWFkZXJzICovCisgIGlmIChnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpIDwgMTEpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkZW11eCwgIlRvbyBzbWFsbCB0YWcgc2l6ZSAoJSIgR19HU0laRV9GT1JNQVQgIikiLAorICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBkYXRhID0gbWFwLmRhdGE7CisKKyAgLyogR3JhYiBpbmZvcm1hdGlvbiBhYm91dCBhdWRpbyB0YWcgKi8KKyAgcHRzID0gR1NUX1JFQURfVUlOVDI0X0JFIChkYXRhKTsKKyAgLyogcmVhZCB0aGUgcHRzIGV4dGVuc2lvbiB0byAzMiBiaXRzIGludGVnZXIgKi8KKyAgcHRzX2V4dCA9IEdTVF9SRUFEX1VJTlQ4IChkYXRhICsgMyk7CisgIC8qIENvbWJpbmUgdGhlbSAqLworICBwdHMgfD0gcHRzX2V4dCA8PCAyNDsKKworICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJwdHMgYnl0ZXMgJTAyWCAlMDJYICUwMlggJTAyWCAoJWQpIiwgZGF0YVswXSwgZGF0YVsxXSwKKyAgICAgIGRhdGFbMl0sIGRhdGFbM10sIHB0cyk7CisKKyAgLyogU2tpcCB0aGUgc3RyZWFtIGlkIGFuZCBnbyBkaXJlY3RseSB0byB0aGUgZmxhZ3MgKi8KKyAgZmxhZ3MgPSBHU1RfUkVBRF9VSU5UOCAoZGF0YSArIDcpOworCisgIC8qIFNpbGVudGx5IHNraXAgYnVmZmVycyB3aXRoIG5vIGRhdGEgKi8KKyAgaWYgKG1hcC5zaXplID09IDExKQorICAgIGdvdG8gYmVhY2g7CisKKyAgLyogQ2hhbm5lbHMgKi8KKyAgaWYgKGZsYWdzICYgMHgwMSkgeworICAgIGNoYW5uZWxzID0gMjsKKyAgfQorICAvKiBXaWR0aCAqLworICBpZiAoZmxhZ3MgJiAweDAyKSB7CisgICAgd2lkdGggPSAxNjsKKyAgfQorICAvKiBTYW1wbGluZyByYXRlICovCisgIGlmICgoZmxhZ3MgJiAweDBDKSA9PSAweDBDKSB7CisgICAgcmF0ZSA9IDQ0MTAwOworICB9IGVsc2UgaWYgKChmbGFncyAmIDB4MEMpID09IDB4MDgpIHsKKyAgICByYXRlID0gMjIwNTA7CisgIH0gZWxzZSBpZiAoKGZsYWdzICYgMHgwQykgPT0gMHgwNCkgeworICAgIHJhdGUgPSAxMTAyNTsKKyAgfQorICAvKiBDb2RlYyB0YWcgKi8KKyAgY29kZWNfdGFnID0gZmxhZ3MgPj4gNDsKKyAgaWYgKGNvZGVjX3RhZyA9PSAxMCkgeyAgICAgICAgLyogQUFDIGhhcyBhbiBleHRyYSBieXRlIGZvciBwYWNrZXQgdHlwZSAqLworICAgIGNvZGVjX2RhdGEgPSAyOworICB9IGVsc2UgeworICAgIGNvZGVjX2RhdGEgPSAxOworICB9CisKKyAgLyogY29kZWMgdGFncyB3aXRoIHNwZWNpYWwgcmF0ZXMgKi8KKyAgaWYgKGNvZGVjX3RhZyA9PSA1IHx8IGNvZGVjX3RhZyA9PSAxNCkKKyAgICByYXRlID0gODAwMDsKKyAgZWxzZSBpZiAoKGNvZGVjX3RhZyA9PSA0KSB8fCAoY29kZWNfdGFnID09IDExKSkKKyAgICByYXRlID0gMTYwMDA7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiYXVkaW8gdGFnIHdpdGggJWQgY2hhbm5lbHMsICVkSHogc2FtcGxpbmcgcmF0ZSwgIgorICAgICAgIiVkIGJpdHMgd2lkdGgsIGNvZGVjIHRhZyAldSAoZmxhZ3MgJTAyWCkiLCBjaGFubmVscywgcmF0ZSwgd2lkdGgsCisgICAgICBjb2RlY190YWcsIGZsYWdzKTsKKworICBpZiAoY29kZWNfdGFnID09IDEwKSB7CisgICAgZ3VpbnQ4IGFhY19wYWNrZXRfdHlwZSA9IEdTVF9SRUFEX1VJTlQ4IChkYXRhICsgOCk7CisKKyAgICBzd2l0Y2ggKGFhY19wYWNrZXRfdHlwZSkgeworICAgICAgY2FzZSAwOgorICAgICAgeworICAgICAgICAvKiBBdWRpb1NwZWNpZmljQ29uZmlnIGRhdGEgKi8KKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiZ290IGFuIEFBQyBjb2RlYyBkYXRhIHBhY2tldCIpOworICAgICAgICBpZiAoZGVtdXgtPmF1ZGlvX2NvZGVjX2RhdGEpIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChkZW11eC0+YXVkaW9fY29kZWNfZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgZGVtdXgtPmF1ZGlvX2NvZGVjX2RhdGEgPQorICAgICAgICAgICAgZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAoYnVmZmVyLCBHU1RfQlVGRkVSX0NPUFlfTUVNT1JZLAorICAgICAgICAgICAgNyArIGNvZGVjX2RhdGEsIGRlbXV4LT50YWdfZGF0YV9zaXplIC0gY29kZWNfZGF0YSk7CisKKyAgICAgICAgLyogVXNlIHRoYXQgYnVmZmVyIGRhdGEgaW4gdGhlIGNhcHMgKi8KKyAgICAgICAgaWYgKGRlbXV4LT5hdWRpb19wYWQpCisgICAgICAgICAgZ3N0X2Zsdl9kZW11eF9hdWRpb19uZWdvdGlhdGUgKGRlbXV4LCBjb2RlY190YWcsIHJhdGUsIGNoYW5uZWxzLAorICAgICAgICAgICAgICB3aWR0aCk7CisgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICB9CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmICghZGVtdXgtPmF1ZGlvX2NvZGVjX2RhdGEpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChkZW11eCwgImdvdCBBQUMgYXVkaW8gcGFja2V0IGJlZm9yZSBjb2RlYyBkYXRhIik7CisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICAgICAgZ290byBiZWFjaDsKKyAgICAgICAgfQorICAgICAgICAvKiBBQUMgcmF3IHBhY2tldCAqLworICAgICAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJnb3QgYSByYXcgQUFDIGF1ZGlvIHBhY2tldCIpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJpbnZhbGlkIEFBQyBwYWNrZXQgdHlwZSAldSIsCisgICAgICAgICAgICBhYWNfcGFja2V0X3R5cGUpOworICAgIH0KKyAgfQorCisgIC8qIElmIHdlIGRvbid0IGhhdmUgb3VyIGF1ZGlvIHBhZCBjcmVhdGVkLCB0aGVuIGNyZWF0ZSBpdC4gKi8KKyAgaWYgKEdfVU5MSUtFTFkgKCFkZW11eC0+YXVkaW9fcGFkKSkgeworICAgIGRlbXV4LT5hdWRpb19wYWQgPQorICAgICAgICBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlCisgICAgICAgIChHU1RfRUxFTUVOVF9HRVRfQ0xBU1MgKGRlbXV4KSwgImF1ZGlvIiksICJhdWRpbyIpOworICAgIGlmIChHX1VOTElLRUxZICghZGVtdXgtPmF1ZGlvX3BhZCkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJmYWlsZWQgY3JlYXRpbmcgYXVkaW8gcGFkIik7CisgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgIGdvdG8gYmVhY2g7CisgICAgfQorCisgICAgLyogU2V0IGZ1bmN0aW9ucyBvbiB0aGUgcGFkICovCisgICAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKGRlbXV4LT5hdWRpb19wYWQsCisgICAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmx2X2RlbXV4X3F1ZXJ5KSk7CisgICAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKGRlbXV4LT5hdWRpb19wYWQsCisgICAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmx2X2RlbXV4X3NyY19ldmVudCkpOworCisgICAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoZGVtdXgtPmF1ZGlvX3BhZCk7CisKKyAgICAvKiBNYWtlIGl0IGFjdGl2ZSAqLworICAgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoZGVtdXgtPmF1ZGlvX3BhZCwgVFJVRSk7CisKKyAgICAvKiBOZWdvdGlhdGUgY2FwcyAqLworICAgIGlmICghZ3N0X2Zsdl9kZW11eF9hdWRpb19uZWdvdGlhdGUgKGRlbXV4LCBjb2RlY190YWcsIHJhdGUsIGNoYW5uZWxzLAorICAgICAgICAgICAgd2lkdGgpKSB7CisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChkZW11eC0+YXVkaW9fcGFkKTsKKyAgICAgIGRlbXV4LT5hdWRpb19wYWQgPSBOVUxMOworICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICBnb3RvIGJlYWNoOworICAgIH0KKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoZGVtdXgtPmF1ZGlvX3BhZCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImNyZWF0ZWQgYXVkaW8gcGFkIHdpdGggY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgICAgICBjYXBzKTsKKyAgICAgIGlmIChjYXBzKQorICAgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBXZSBuZWVkIHRvIHNldCBjYXBzIGJlZm9yZSBhZGRpbmcgKi8KKyAgICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoZGVtdXgpLAorICAgICAgICBnc3Rfb2JqZWN0X3JlZiAoZGVtdXgtPmF1ZGlvX3BhZCkpOworICAgIGdzdF9mbG93X2NvbWJpbmVyX2FkZF9wYWQgKGRlbXV4LT5mbG93Y29tYmluZXIsIGRlbXV4LT5hdWRpb19wYWQpOworCisgICAgLyogV2Ugb25seSBlbWl0IG5vIG1vcmUgcGFkcyB3aGVuIHdlIGhhdmUgYXVkaW8gYW5kIHZpZGVvLiBJbmRlZWQgd2UgY2FuCisgICAgICogbm90IHRydXN0IHRoZSBGTFYgaGVhZGVyIHRvIHRlbGwgdXMgaWYgdGhlcmUgd2lsbCBiZSBvbmx5IGF1ZGlvIG9yCisgICAgICogb25seSB2aWRlbyBhbmQgd2Ugd291bGQganVzdCBicmVhayBkaXNjb3Zlcnkgb2Ygc29tZSBmaWxlcyAqLworICAgIGlmIChkZW11eC0+YXVkaW9fcGFkICYmIGRlbXV4LT52aWRlb19wYWQpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZW1pdHRpbmcgbm8gbW9yZSBwYWRzIik7CisgICAgICBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgKEdTVF9FTEVNRU5UIChkZW11eCkpOworICAgICAgZGVtdXgtPm5vX21vcmVfcGFkcyA9IFRSVUU7CisgICAgfQorICB9CisKKyAgLyogQ2hlY2sgaWYgY2FwcyBoYXZlIGNoYW5nZWQgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKHJhdGUgIT0gZGVtdXgtPnJhdGUgfHwgY2hhbm5lbHMgIT0gZGVtdXgtPmNoYW5uZWxzIHx8CisgICAgICAgICAgY29kZWNfdGFnICE9IGRlbXV4LT5hdWRpb19jb2RlY190YWcgfHwgd2lkdGggIT0gZGVtdXgtPndpZHRoKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiYXVkaW8gc2V0dGluZ3MgaGF2ZSBjaGFuZ2VkLCBjaGFuZ2luZyBjYXBzIik7CisKKyAgICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZkZW11eC0+YXVkaW9fY29kZWNfZGF0YSwgTlVMTCk7CisKKyAgICAvKiBOZWdvdGlhdGUgY2FwcyAqLworICAgIGlmICghZ3N0X2Zsdl9kZW11eF9hdWRpb19uZWdvdGlhdGUgKGRlbXV4LCBjb2RlY190YWcsIHJhdGUsIGNoYW5uZWxzLAorICAgICAgICAgICAgd2lkdGgpKSB7CisgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgIGdvdG8gYmVhY2g7CisgICAgfQorICB9CisKKyAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhbnl0aGluZyB0byBwdXNoICovCisgIGlmIChkZW11eC0+dGFnX2RhdGFfc2l6ZSA8PSBjb2RlY19kYXRhKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiTm90aGluZyBsZWZ0IGluIHRoaXMgdGFnLCByZXR1cm5pbmciKTsKKyAgICBnb3RvIGJlYWNoOworICB9CisKKyAgLyogQ3JlYXRlIGJ1ZmZlciBmcm9tIHBhZCAqLworICBvdXRidWYgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9NRU1PUlksCisgICAgICA3ICsgY29kZWNfZGF0YSwgZGVtdXgtPnRhZ19kYXRhX3NpemUgLSBjb2RlY19kYXRhKTsKKworICAvKiBkZXRlY3QgKGFuZCBkZWVtIHRvIGJlIHJlc3luY3MpICBsYXJnZSBwdHMgZ2FwcyAqLworICBpZiAoZ3N0X2Zsdl9kZW11eF91cGRhdGVfcmVzeW5jIChkZW11eCwgcHRzLCBkZW11eC0+YXVkaW9fbmVlZF9kaXNjb250LAorICAgICAgICAgICZkZW11eC0+bGFzdF9hdWRpb19wdHMsICZkZW11eC0+YXVkaW9fdGltZV9vZmZzZXQpKSB7CisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfUkVTWU5DKTsKKyAgfQorCisgIC8qIEZpbGwgYnVmZmVyIHdpdGggZGF0YSAqLworICBHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSA9IHB0cyAqIEdTVF9NU0VDT05EICsgZGVtdXgtPmF1ZGlvX3RpbWVfb2Zmc2V0OworICBHU1RfQlVGRkVSX0RUUyAob3V0YnVmKSA9IEdTVF9CVUZGRVJfUFRTIChvdXRidWYpOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZikgPSBkZW11eC0+YXVkaW9fb2Zmc2V0Kys7CisgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAob3V0YnVmKSA9IGRlbXV4LT5hdWRpb19vZmZzZXQ7CisKKyAgaWYgKGRlbXV4LT5kdXJhdGlvbiA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FIHx8CisgICAgICBkZW11eC0+ZHVyYXRpb24gPCBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSkKKyAgICBkZW11eC0+ZHVyYXRpb24gPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKTsKKworICAvKiBPbmx5IGFkZCBhdWRpbyBmcmFtZXMgdG8gdGhlIGluZGV4IGlmIHdlIGhhdmUgbm8gdmlkZW8sCisgICAqIGFuZCBpZiB0aGUgaW5kZXggaXMgbm90IHlldCBjb21wbGV0ZSAqLworICBpZiAoIWRlbXV4LT5oYXNfdmlkZW8gJiYgIWRlbXV4LT5pbmRleGVkKSB7CisgICAgZ3N0X2Zsdl9kZW11eF9wYXJzZV9hbmRfYWRkX2luZGV4X2VudHJ5IChkZW11eCwKKyAgICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZiksIGRlbXV4LT5jdXJfdGFnX29mZnNldCwgVFJVRSk7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoZGVtdXgtPmF1ZGlvX25lZWRfZGlzY29udCkpIHsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICBkZW11eC0+YXVkaW9fbmVlZF9kaXNjb250ID0gRkFMU0U7CisgIH0KKworICBkZW11eC0+c2VnbWVudC5wb3NpdGlvbiA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpOworCisgIC8qIERvIHdlIG5lZWQgYSBuZXdzZWdtZW50IGV2ZW50ID8gKi8KKyAgaWYgKEdfVU5MSUtFTFkgKGRlbXV4LT5hdWRpb19uZWVkX3NlZ21lbnQpKSB7CisgICAgaWYgKCFkZW11eC0+bmV3X3NlZ19ldmVudCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJwdXNoaW5nIG5ld3NlZ21lbnQgZnJvbSAlIgorICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+c2VnbWVudC5wb3NpdGlvbiksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZGVtdXgtPnNlZ21lbnQuc3RvcCkpOworICAgICAgZGVtdXgtPnNlZ21lbnQuc3RhcnQgPSBkZW11eC0+c2VnbWVudC50aW1lID0gZGVtdXgtPnNlZ21lbnQucG9zaXRpb247CisgICAgICBkZW11eC0+bmV3X3NlZ19ldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJmRlbXV4LT5zZWdtZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJwdXNoaW5nIHByZS1nZW5lcmF0ZWQgbmV3c2VnbWVudCBldmVudCIpOworICAgIH0KKworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoZGVtdXgtPmF1ZGlvX3BhZCwgZ3N0X2V2ZW50X3JlZiAoZGVtdXgtPm5ld19zZWdfZXZlbnQpKTsKKworICAgIGRlbXV4LT5hdWRpb19uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwKKyAgICAgICJwdXNoaW5nICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMgYnVmZmVyIGF0IHB0cyAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIgd2l0aCBkdXJhdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQgIiwgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWYpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSksIEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpKTsKKworICBpZiAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChkZW11eC0+YXVkaW9fc3RhcnQpKSB7CisgICAgZGVtdXgtPmF1ZGlvX3N0YXJ0ID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1Zik7CisgIH0KKyAgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZGVtdXgtPmF1ZGlvX2ZpcnN0X3RzKSkgeworICAgIGRlbXV4LT5hdWRpb19maXJzdF90cyA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpOworICB9CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFkZW11eC0+bm9fbW9yZV9wYWRzCisgICAgICAgICAgJiYgKEdTVF9DTE9DS19ESUZGIChkZW11eC0+YXVkaW9fc3RhcnQsCisgICAgICAgICAgICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSkgPiBOT19NT1JFX1BBRFNfVEhSRVNIT0xEKSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgIlNpZ25hbGxpbmcgbm8tbW9yZS1wYWRzIGJlY2F1c2Ugbm8gdmlkZW8gc3RyZWFtIHdhcyBmb3VuZCIKKyAgICAgICAgIiBhZnRlciA2IHNlY29uZHMgb2YgYXVkaW8iKTsKKyAgICBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgKEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSk7CisgICAgZGVtdXgtPm5vX21vcmVfcGFkcyA9IFRSVUU7CisgIH0KKworICAvKiBQdXNoIGRvd25zdHJlYW0gKi8KKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChkZW11eC0+YXVkaW9fcGFkLCBvdXRidWYpOworCisgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spICYmCisgICAgICBkZW11eC0+c2VnbWVudC5yYXRlIDwgMC4wICYmIHJldCA9PSBHU1RfRkxPV19FT1MgJiYKKyAgICAgIGRlbXV4LT5zZWdtZW50LnBvc2l0aW9uID4gZGVtdXgtPnNlZ21lbnQuc3RvcCkgeworICAgIC8qIEluIHJldmVyc2UgcGxheWJhY2sgd2UgY2FuIGdldCBhIEdTVF9GTE9XX0VPUyB3aGVuCisgICAgICogd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHNlZ21lbnQsIHNvIHdlIGp1c3QgbmVlZCB0byBqdW1wCisgICAgICogYmFjayB0byB0aGUgcHJldmlvdXMgc2VjdGlvbi4gKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImRvd25zdHJlYW0gaGFzIHJlYWNoZWQgZW5kIG9mIHNlZ21lbnQiKTsKKyAgICBkZW11eC0+YXVkaW9fZG9uZSA9IFRSVUU7CisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIHJldCA9IGdzdF9mbG93X2NvbWJpbmVyX3VwZGF0ZV9wYWRfZmxvdyAoZGVtdXgtPmZsb3djb21iaW5lciwKKyAgICAgIGRlbXV4LT5hdWRpb19wYWQsIHJldCk7CisKK2JlYWNoOgorICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2Zsdl9kZW11eF92aWRlb19uZWdvdGlhdGUgKEdzdEZsdkRlbXV4ICogZGVtdXgsIGd1aW50MzIgY29kZWNfdGFnKQoreworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEwsICpvbGRfY2FwczsKKyAgR3N0RXZlbnQgKmV2ZW50OworICBnY2hhciAqc3RyZWFtX2lkOworCisgIC8qIEdlbmVyYXRlIGNhcHMgZm9yIHRoYXQgcGFkICovCisgIHN3aXRjaCAoY29kZWNfdGFnKSB7CisgICAgY2FzZSAyOgorICAgICAgY2FwcyA9CisgICAgICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtZmxhc2gtdmlkZW8iLCAiZmx2dmVyc2lvbiIsIEdfVFlQRV9JTlQsCisgICAgICAgICAgMSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtZmxhc2gtc2NyZWVuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtdnA2LWZsYXNoIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtdnA2LWFscGhhIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICBpZiAoIWRlbXV4LT52aWRlb19jb2RlY19kYXRhKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZG9uJ3QgaGF2ZSBoMjY0IGNvZGVjIGRhdGEgeWV0Iik7CisgICAgICAgIHJldCA9IFRSVUU7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICAgIGNhcHMgPQorICAgICAgICAgIGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWgyNjQiLCAic3RyZWFtLWZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgICAgImF2YyIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgICAvKiBUaGUgZm9sbG93aW5nIHR3byBhcmUgbm9uLXN0YW5kYXJkIGJ1dCBhcHBhcmVudGx5IHVzZWQsIHNlZSBpbiBmZm1wZWcKKyAgICAgICAqIGh0dHBzOi8vZ2l0LnZpZGVvbGFuLm9yZy8/cD1mZm1wZWcuZ2l0O2E9YmxvYjtmPWxpYmF2Zm9ybWF0L2ZsdmRlYy5jO2g9MmJmMWUwNTllMWNiZWViNzllNGFmOTU0MmRhMjNmNDU2MGUxY2Y1OTtoYj1iMThkNmM1ODAwMGJlZWQ4NzJkNmJiMWZlN2QwZmJlNzVhZTI2YWVmI2wyNTQKKyAgICAgICAqIGh0dHBzOi8vZ2l0LnZpZGVvbGFuLm9yZy8/cD1mZm1wZWcuZ2l0O2E9YmxvYjtmPWxpYmF2Zm9ybWF0L2ZsdmRlYy5jO2g9MmJmMWUwNTllMWNiZWViNzllNGFmOTU0MmRhMjNmNDU2MGUxY2Y1OTtoYj1iMThkNmM1ODAwMGJlZWQ4NzJkNmJiMWZlN2QwZmJlNzVhZTI2YWVmI2wyODIKKyAgICAgICAqLworICAgIGNhc2UgODoKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgidmlkZW8veC1oMjYzIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDk6CisgICAgICBjYXBzID0KKyAgICAgICAgICBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8vbXBlZyIsICJtcGVndmVyc2lvbiIsIEdfVFlQRV9JTlQsIDQsCisgICAgICAgICAgInN5c3RlbXN0cmVhbSIsIEdfVFlQRV9CT09MRUFOLCBGQUxTRSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgInVuc3VwcG9ydGVkIHZpZGVvIGNvZGVjIHRhZyAldSIsIGNvZGVjX3RhZyk7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoIWNhcHMpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgImZhaWxlZCBjcmVhdGluZyBjYXBzIGZvciB2aWRlbyBwYWQiKTsKKyAgICBnb3RvIGJlYWNoOworICB9CisKKyAgaWYgKGRlbXV4LT5nb3RfcGFyKSB7CisgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgInBpeGVsLWFzcGVjdC1yYXRpbyIsIEdTVF9UWVBFX0ZSQUNUSU9OLAorICAgICAgICBkZW11eC0+cGFyX3gsIGRlbXV4LT5wYXJfeSwgTlVMTCk7CisgIH0KKworICBpZiAoR19MSUtFTFkgKGRlbXV4LT53KSkgeworICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJ3aWR0aCIsIEdfVFlQRV9JTlQsIGRlbXV4LT53LCBOVUxMKTsKKyAgfQorCisgIGlmIChHX0xJS0VMWSAoZGVtdXgtPmgpKSB7CisgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgImhlaWdodCIsIEdfVFlQRV9JTlQsIGRlbXV4LT5oLCBOVUxMKTsKKyAgfQorCisgIGlmIChHX0xJS0VMWSAoZGVtdXgtPmZyYW1lcmF0ZSkpIHsKKyAgICBnaW50IG51bSA9IDAsIGRlbiA9IDA7CisKKyAgICBnc3RfdmlkZW9fZ3Vlc3NfZnJhbWVyYXRlIChHU1RfU0VDT05EIC8gZGVtdXgtPmZyYW1lcmF0ZSwgJm51bSwgJmRlbik7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgtPnZpZGVvX3BhZCwKKyAgICAgICAgImZwcyB0byBiZSB1c2VkIG9uIGNhcHMgJWYgKGFzIGEgZnJhY3Rpb24gPSAlZC8lZCkiLCBkZW11eC0+ZnJhbWVyYXRlLAorICAgICAgICBudW0sIGRlbik7CisKKyAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT04sIG51bSwgZGVuLCBOVUxMKTsKKyAgfQorCisgIGlmIChkZW11eC0+dmlkZW9fY29kZWNfZGF0YSkgeworICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLAorICAgICAgICBkZW11eC0+dmlkZW9fY29kZWNfZGF0YSwgTlVMTCk7CisgIH0KKworICBvbGRfY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoZGVtdXgtPnZpZGVvX3BhZCk7CisgIGlmICghb2xkX2NhcHMpIHsKKyAgICBzdHJlYW1faWQgPQorICAgICAgICBnc3RfcGFkX2NyZWF0ZV9zdHJlYW1faWQgKGRlbXV4LT52aWRlb19wYWQsIEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSwKKyAgICAgICAgInZpZGVvIik7CisgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoc3RyZWFtX2lkKTsKKyAgICBnX2ZyZWUgKHN0cmVhbV9pZCk7CisKKyAgICBpZiAoaGF2ZV9ncm91cF9pZCAoZGVtdXgpKQorICAgICAgZ3N0X2V2ZW50X3NldF9ncm91cF9pZCAoZXZlbnQsIGRlbXV4LT5ncm91cF9pZCk7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChkZW11eC0+dmlkZW9fcGFkLCBldmVudCk7CisgIH0KKworICBpZiAoIW9sZF9jYXBzIHx8ICFnc3RfY2Fwc19pc19lcXVhbCAob2xkX2NhcHMsIGNhcHMpKQorICAgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKGRlbXV4LT52aWRlb19wYWQsIGNhcHMpOworICBlbHNlCisgICAgcmV0ID0gVFJVRTsKKworICBpZiAob2xkX2NhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKG9sZF9jYXBzKTsKKworZG9uZToKKyAgaWYgKEdfTElLRUxZIChyZXQpKSB7CisgICAgLyogU3RvcmUgdGhlIGNhcHMgd2UgaGF2ZSBzZXQgKi8KKyAgICBkZW11eC0+dmlkZW9fY29kZWNfdGFnID0gY29kZWNfdGFnOworCisgICAgaWYgKGNhcHMpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LT52aWRlb19wYWQsICJzdWNjZXNzZnVsbHkgbmVnb3RpYXRlZCBjYXBzICUiCisgICAgICAgICAgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgICAgICBnc3RfZmx2X2RlbXV4X3B1c2hfdGFncyAoZGVtdXgpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eC0+dmlkZW9fcGFkLCAiZGVsYXllZCBzZXR0aW5nIGNhcHMiKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eC0+dmlkZW9fcGFkLCAiZmFpbGVkIG5lZ290aWF0aW5nIGNhcHMgJSIKKyAgICAgICAgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworICB9CisKKyAgaWYgKGNhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCitiZWFjaDoKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbHZfZGVtdXhfcGFyc2VfdGFnX3ZpZGVvIChHc3RGbHZEZW11eCAqIGRlbXV4LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGd1aW50MzIgZHRzID0gMCwgY29kZWNfZGF0YSA9IDEsIGR0c19leHQgPSAwOworICBnaW50MzIgY3RzID0gMDsKKyAgZ2Jvb2xlYW4ga2V5ZnJhbWUgPSBGQUxTRTsKKyAgZ3VpbnQ4IGZsYWdzID0gMCwgY29kZWNfdGFnID0gMDsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKmRhdGE7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcikgPT0gZGVtdXgtPnRhZ19zaXplLAorICAgICAgR1NUX0ZMT1dfRVJST1IpOworCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgInBhcnNpbmcgYSB2aWRlbyB0YWciKTsKKworICBpZiBHX1VOTElLRUxZCisgICAgKCFkZW11eC0+dmlkZW9fcGFkICYmIGRlbXV4LT5ub19tb3JlX3BhZHMpIHsKKyNpZm5kZWYgR1NUX0RJU0FCTEVfREVCVUcKKyAgICBpZiBHX1VOTElLRUxZCisgICAgICAoIWRlbXV4LT5ub192aWRlb193YXJuZWQpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgIlNpZ25hbGVkIG5vLW1vcmUtcGFkcyBhbHJlYWR5IGJ1dCBoYWQgbm8gdmlkZW8gcGFkIC0tIGlnbm9yaW5nIik7CisgICAgICBkZW11eC0+bm9fdmlkZW9fd2FybmVkID0gVFJVRTsKKyAgICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgICB9CisKKyAgaWYgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcikgPCAxMikgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlbXV4LCAiVG9vIHNtYWxsIHRhZyBzaXplIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworCisgIC8qIEdyYWIgaW5mb3JtYXRpb24gYWJvdXQgdmlkZW8gdGFnICovCisgIGR0cyA9IEdTVF9SRUFEX1VJTlQyNF9CRSAoZGF0YSk7CisgIC8qIHJlYWQgdGhlIGR0cyBleHRlbnNpb24gdG8gMzIgYml0cyBpbnRlZ2VyICovCisgIGR0c19leHQgPSBHU1RfUkVBRF9VSU5UOCAoZGF0YSArIDMpOworICAvKiBDb21iaW5lIHRoZW0gKi8KKyAgZHRzIHw9IGR0c19leHQgPDwgMjQ7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiZHRzIGJ5dGVzICUwMlggJTAyWCAlMDJYICUwMlggKCVkKSIsIGRhdGFbMF0sIGRhdGFbMV0sCisgICAgICBkYXRhWzJdLCBkYXRhWzNdLCBkdHMpOworCisgIC8qIFNraXAgdGhlIHN0cmVhbSBpZCBhbmQgZ28gZGlyZWN0bHkgdG8gdGhlIGZsYWdzICovCisgIGZsYWdzID0gR1NUX1JFQURfVUlOVDggKGRhdGEgKyA3KTsKKworICAvKiBLZXlmcmFtZSAqLworICBpZiAoKGZsYWdzID4+IDQpID09IDEpIHsKKyAgICBrZXlmcmFtZSA9IFRSVUU7CisgIH0KKyAgLyogQ29kZWMgdGFnICovCisgIGNvZGVjX3RhZyA9IGZsYWdzICYgMHgwRjsKKyAgaWYgKGNvZGVjX3RhZyA9PSA0IHx8IGNvZGVjX3RhZyA9PSA1KSB7CisgICAgY29kZWNfZGF0YSA9IDI7CisgIH0gZWxzZSBpZiAoY29kZWNfdGFnID09IDcpIHsKKyAgICBjb2RlY19kYXRhID0gNTsKKworICAgIGN0cyA9IEdTVF9SRUFEX1VJTlQyNF9CRSAoZGF0YSArIDkpOworICAgIGN0cyA9IChjdHMgKyAweGZmODAwMDAwKSBeIDB4ZmY4MDAwMDA7CisKKyAgICBpZiAoY3RzIDwgMCAmJiBBQlMgKGN0cykgPiBkdHMpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlbXV4LCAiRGV0ZWN0ZWQgYSBuZWdhdGl2ZSBjb21wb3NpdGlvbiB0aW1lIG9mZnNldCAiCisgICAgICAgICAgIiclZCcgdGhhdCB3b3VsZCBsZWFkIHRvIG5lZ2F0aXZlIFBUUywgZml4aW5nIiwgY3RzKTsKKyAgICAgIGN0cyArPSBBQlMgKGN0cykgLSBkdHM7CisgICAgfQorCisgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiZ290IGN0cyAlZCIsIGN0cyk7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJ2aWRlbyB0YWcgd2l0aCBjb2RlYyB0YWcgJXUsIGtleWZyYW1lICglZCkgIgorICAgICAgIihmbGFncyAlMDJYKSIsIGNvZGVjX3RhZywga2V5ZnJhbWUsIGZsYWdzKTsKKworICBpZiAoY29kZWNfdGFnID09IDcpIHsKKyAgICBndWludDggYXZjX3BhY2tldF90eXBlID0gR1NUX1JFQURfVUlOVDggKGRhdGEgKyA4KTsKKworICAgIHN3aXRjaCAoYXZjX3BhY2tldF90eXBlKSB7CisgICAgICBjYXNlIDA6CisgICAgICB7CisgICAgICAgIGlmIChkZW11eC0+dGFnX2RhdGFfc2l6ZSA8IGNvZGVjX2RhdGEpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChkZW11eCwgIkdvdCBpbnZhbGlkIEguMjY0IGNvZGVjLCBpZ25vcmluZy4iKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkIGRhdGEgKi8KKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiZ290IGFuIEguMjY0IGNvZGVjIGRhdGEgcGFja2V0Iik7CisgICAgICAgIGlmIChkZW11eC0+dmlkZW9fY29kZWNfZGF0YSkgeworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGRlbXV4LT52aWRlb19jb2RlY19kYXRhKTsKKyAgICAgICAgfQorICAgICAgICBkZW11eC0+dmlkZW9fY29kZWNfZGF0YSA9IGdzdF9idWZmZXJfY29weV9yZWdpb24gKGJ1ZmZlciwKKyAgICAgICAgICAgIEdTVF9CVUZGRVJfQ09QWV9NRU1PUlksIDcgKyBjb2RlY19kYXRhLAorICAgICAgICAgICAgZGVtdXgtPnRhZ19kYXRhX3NpemUgLSBjb2RlY19kYXRhKTs7CisgICAgICAgIC8qIFVzZSB0aGF0IGJ1ZmZlciBkYXRhIGluIHRoZSBjYXBzICovCisgICAgICAgIGlmIChkZW11eC0+dmlkZW9fcGFkKQorICAgICAgICAgIGdzdF9mbHZfZGVtdXhfdmlkZW9fbmVnb3RpYXRlIChkZW11eCwgY29kZWNfdGFnKTsKKyAgICAgICAgZ290byBiZWFjaDsKKyAgICAgIH0KKyAgICAgIGNhc2UgMToKKyAgICAgICAgLyogSC4yNjQgTkFMVSBwYWNrZXQgKi8KKyAgICAgICAgaWYgKCFkZW11eC0+dmlkZW9fY29kZWNfZGF0YSkgeworICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlbXV4LCAiZ290IEguMjY0IHZpZGVvIHBhY2tldCBiZWZvcmUgY29kZWMgZGF0YSIpOworICAgICAgICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICAgIH0KKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiZ290IGEgSC4yNjQgTkFMVSB2aWRlbyBwYWNrZXQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiaW52YWxpZCB2aWRlbyBwYWNrZXQgdHlwZSAldSIsCisgICAgICAgICAgICBhdmNfcGFja2V0X3R5cGUpOworICAgIH0KKyAgfQorCisgIC8qIElmIHdlIGRvbid0IGhhdmUgb3VyIHZpZGVvIHBhZCBjcmVhdGVkLCB0aGVuIGNyZWF0ZSBpdC4gKi8KKyAgaWYgKEdfVU5MSUtFTFkgKCFkZW11eC0+dmlkZW9fcGFkKSkgeworICAgIGRlbXV4LT52aWRlb19wYWQgPQorICAgICAgICBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlCisgICAgICAgIChHU1RfRUxFTUVOVF9HRVRfQ0xBU1MgKGRlbXV4KSwgInZpZGVvIiksICJ2aWRlbyIpOworICAgIGlmIChHX1VOTElLRUxZICghZGVtdXgtPnZpZGVvX3BhZCkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJmYWlsZWQgY3JlYXRpbmcgdmlkZW8gcGFkIik7CisgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgIGdvdG8gYmVhY2g7CisgICAgfQorCisgICAgLyogU2V0IGZ1bmN0aW9ucyBvbiB0aGUgcGFkICovCisgICAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKGRlbXV4LT52aWRlb19wYWQsCisgICAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmx2X2RlbXV4X3F1ZXJ5KSk7CisgICAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKGRlbXV4LT52aWRlb19wYWQsCisgICAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmx2X2RlbXV4X3NyY19ldmVudCkpOworCisgICAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoZGVtdXgtPnZpZGVvX3BhZCk7CisKKyAgICAvKiBNYWtlIGl0IGFjdGl2ZSAqLworICAgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoZGVtdXgtPnZpZGVvX3BhZCwgVFJVRSk7CisKKyAgICAvKiBOZWVkcyB0byBiZSBhY3RpdmUgYmVmb3JlIHNldHRpbmcgY2FwcyAqLworICAgIGlmICghZ3N0X2Zsdl9kZW11eF92aWRlb19uZWdvdGlhdGUgKGRlbXV4LCBjb2RlY190YWcpKSB7CisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChkZW11eC0+dmlkZW9fcGFkKTsKKyAgICAgIGRlbXV4LT52aWRlb19wYWQgPSBOVUxMOworICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICBnb3RvIGJlYWNoOworICAgIH0KKworICAgIC8qIFdoZW4gd2UgdmUgc2V0IHBpeGVsLWFzcGVjdC1yYXRpbyB3ZSB1c2UgdGhhdCBib29sZWFuIHRvIGRldGVjdCBhCisgICAgICogbWV0YWRhdGEgdGFnIHRoYXQgd291bGQgY29tZSBsYXRlciBhbmQgdHJpZ2dlciBhIGNhcHMgY2hhbmdlICovCisgICAgZGVtdXgtPmdvdF9wYXIgPSBGQUxTRTsKKworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgICB7CisgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChkZW11eC0+dmlkZW9fcGFkKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiY3JlYXRlZCB2aWRlbyBwYWQgd2l0aCBjYXBzICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICAgIGNhcHMpOworICAgICAgaWYgKGNhcHMpCisgICAgICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIFdlIG5lZWQgdG8gc2V0IGNhcHMgYmVmb3JlIGFkZGluZyAqLworICAgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChkZW11eCksCisgICAgICAgIGdzdF9vYmplY3RfcmVmIChkZW11eC0+dmlkZW9fcGFkKSk7CisgICAgZ3N0X2Zsb3dfY29tYmluZXJfYWRkX3BhZCAoZGVtdXgtPmZsb3djb21iaW5lciwgZGVtdXgtPnZpZGVvX3BhZCk7CisKKyAgICAvKiBXZSBvbmx5IGVtaXQgbm8gbW9yZSBwYWRzIHdoZW4gd2UgaGF2ZSBhdWRpbyBhbmQgdmlkZW8uIEluZGVlZCB3ZSBjYW4KKyAgICAgKiBub3QgdHJ1c3QgdGhlIEZMViBoZWFkZXIgdG8gdGVsbCB1cyBpZiB0aGVyZSB3aWxsIGJlIG9ubHkgYXVkaW8gb3IKKyAgICAgKiBvbmx5IHZpZGVvIGFuZCB3ZSB3b3VsZCBqdXN0IGJyZWFrIGRpc2NvdmVyeSBvZiBzb21lIGZpbGVzICovCisgICAgaWYgKGRlbXV4LT5hdWRpb19wYWQgJiYgZGVtdXgtPnZpZGVvX3BhZCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJlbWl0dGluZyBubyBtb3JlIHBhZHMiKTsKKyAgICAgIGdzdF9lbGVtZW50X25vX21vcmVfcGFkcyAoR1NUX0VMRU1FTlQgKGRlbXV4KSk7CisgICAgICBkZW11eC0+bm9fbW9yZV9wYWRzID0gVFJVRTsKKyAgICB9CisgIH0KKworICAvKiBDaGVjayBpZiBjYXBzIGhhdmUgY2hhbmdlZCAqLworICBpZiAoR19VTkxJS0VMWSAoY29kZWNfdGFnICE9IGRlbXV4LT52aWRlb19jb2RlY190YWcgfHwgZGVtdXgtPmdvdF9wYXIpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJ2aWRlbyBzZXR0aW5ncyBoYXZlIGNoYW5nZWQsIGNoYW5naW5nIGNhcHMiKTsKKyAgICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZkZW11eC0+dmlkZW9fY29kZWNfZGF0YSwgTlVMTCk7CisKKyAgICBpZiAoIWdzdF9mbHZfZGVtdXhfdmlkZW9fbmVnb3RpYXRlIChkZW11eCwgY29kZWNfdGFnKSkgeworICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICBnb3RvIGJlYWNoOworICAgIH0KKworICAgIC8qIFdoZW4gd2UgdmUgc2V0IHBpeGVsLWFzcGVjdC1yYXRpbyB3ZSB1c2UgdGhhdCBib29sZWFuIHRvIGRldGVjdCBhCisgICAgICogbWV0YWRhdGEgdGFnIHRoYXQgd291bGQgY29tZSBsYXRlciBhbmQgdHJpZ2dlciBhIGNhcHMgY2hhbmdlICovCisgICAgZGVtdXgtPmdvdF9wYXIgPSBGQUxTRTsKKyAgfQorCisgIC8qIENoZWNrIGlmIHdlIGhhdmUgYW55dGhpbmcgdG8gcHVzaCAqLworICBpZiAoZGVtdXgtPnRhZ19kYXRhX3NpemUgPD0gY29kZWNfZGF0YSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgIk5vdGhpbmcgbGVmdCBpbiB0aGlzIHRhZywgcmV0dXJuaW5nIik7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIC8qIENyZWF0ZSBidWZmZXIgZnJvbSBwYWQgKi8KKyAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAoYnVmZmVyLCBHU1RfQlVGRkVSX0NPUFlfTUVNT1JZLAorICAgICAgNyArIGNvZGVjX2RhdGEsIGRlbXV4LT50YWdfZGF0YV9zaXplIC0gY29kZWNfZGF0YSk7CisKKyAgLyogZGV0ZWN0IChhbmQgZGVlbSB0byBiZSByZXN5bmNzKSAgbGFyZ2UgZHRzIGdhcHMgKi8KKyAgaWYgKGdzdF9mbHZfZGVtdXhfdXBkYXRlX3Jlc3luYyAoZGVtdXgsIGR0cywgZGVtdXgtPnZpZGVvX25lZWRfZGlzY29udCwKKyAgICAgICAgICAmZGVtdXgtPmxhc3RfdmlkZW9fZHRzLCAmZGVtdXgtPnZpZGVvX3RpbWVfb2Zmc2V0KSkgeworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX1JFU1lOQyk7CisgIH0KKworICAvKiBGaWxsIGJ1ZmZlciB3aXRoIGRhdGEgKi8KKyAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiZHRzICV1IHB0cyAldSBjdHMgJWQiLCBkdHMsIGR0cyArIGN0cywgY3RzKTsKKworICBHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSA9CisgICAgICAoZHRzICsgY3RzKSAqIEdTVF9NU0VDT05EICsgZGVtdXgtPnZpZGVvX3RpbWVfb2Zmc2V0OworICBHU1RfQlVGRkVSX0RUUyAob3V0YnVmKSA9IGR0cyAqIEdTVF9NU0VDT05EICsgZGVtdXgtPnZpZGVvX3RpbWVfb2Zmc2V0OworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZikgPSBkZW11eC0+dmlkZW9fb2Zmc2V0Kys7CisgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAob3V0YnVmKSA9IGRlbXV4LT52aWRlb19vZmZzZXQ7CisKKyAgaWYgKGRlbXV4LT5kdXJhdGlvbiA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FIHx8CisgICAgICBkZW11eC0+ZHVyYXRpb24gPCBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSkKKyAgICBkZW11eC0+ZHVyYXRpb24gPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKTsKKworICBpZiAoIWtleWZyYW1lKQorICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgIGlmICghZGVtdXgtPmluZGV4ZWQpIHsKKyAgICBnc3RfZmx2X2RlbXV4X3BhcnNlX2FuZF9hZGRfaW5kZXhfZW50cnkgKGRlbXV4LAorICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSwgZGVtdXgtPmN1cl90YWdfb2Zmc2V0LCBrZXlmcmFtZSk7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoZGVtdXgtPnZpZGVvX25lZWRfZGlzY29udCkpIHsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICBkZW11eC0+dmlkZW9fbmVlZF9kaXNjb250ID0gRkFMU0U7CisgIH0KKworICBkZW11eC0+c2VnbWVudC5wb3NpdGlvbiA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpOworCisgIC8qIERvIHdlIG5lZWQgYSBuZXdzZWdtZW50IGV2ZW50ID8gKi8KKyAgaWYgKEdfVU5MSUtFTFkgKGRlbXV4LT52aWRlb19uZWVkX3NlZ21lbnQpKSB7CisgICAgaWYgKCFkZW11eC0+bmV3X3NlZ19ldmVudCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJwdXNoaW5nIG5ld3NlZ21lbnQgZnJvbSAlIgorICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+c2VnbWVudC5wb3NpdGlvbiksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZGVtdXgtPnNlZ21lbnQuc3RvcCkpOworICAgICAgZGVtdXgtPnNlZ21lbnQuc3RhcnQgPSBkZW11eC0+c2VnbWVudC50aW1lID0gZGVtdXgtPnNlZ21lbnQucG9zaXRpb247CisgICAgICBkZW11eC0+bmV3X3NlZ19ldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJmRlbXV4LT5zZWdtZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJwdXNoaW5nIHByZS1nZW5lcmF0ZWQgbmV3c2VnbWVudCBldmVudCIpOworICAgIH0KKworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoZGVtdXgtPnZpZGVvX3BhZCwgZ3N0X2V2ZW50X3JlZiAoZGVtdXgtPm5ld19zZWdfZXZlbnQpKTsKKworICAgIGRlbXV4LT52aWRlb19uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwKKyAgICAgICJwdXNoaW5nICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMgYnVmZmVyIGF0IGR0cyAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIgd2l0aCBkdXJhdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQgIiwgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICIsIGtleWZyYW1lICglZCkiLCBnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWYpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVFMgKG91dGJ1ZikpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSksIEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpLAorICAgICAga2V5ZnJhbWUpOworCisgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGRlbXV4LT52aWRlb19zdGFydCkpIHsKKyAgICBkZW11eC0+dmlkZW9fc3RhcnQgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKTsKKyAgfQorICBpZiAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChkZW11eC0+YXVkaW9fZmlyc3RfdHMpKSB7CisgICAgZGVtdXgtPnZpZGVvX2ZpcnN0X3RzID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1Zik7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoIWRlbXV4LT5ub19tb3JlX3BhZHMKKyAgICAgICAgICAmJiAoR1NUX0NMT0NLX0RJRkYgKGRlbXV4LT52aWRlb19zdGFydCwKKyAgICAgICAgICAgICAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpKSA+IE5PX01PUkVfUEFEU19USFJFU0hPTEQpKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAiU2lnbmFsbGluZyBuby1tb3JlLXBhZHMgYmVjYXVzZSBubyBhdWRpbyBzdHJlYW0gd2FzIGZvdW5kIgorICAgICAgICAiIGFmdGVyIDYgc2Vjb25kcyBvZiB2aWRlbyIpOworICAgIGdzdF9lbGVtZW50X25vX21vcmVfcGFkcyAoR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpKTsKKyAgICBkZW11eC0+bm9fbW9yZV9wYWRzID0gVFJVRTsKKyAgfQorCisgIC8qIFB1c2ggZG93bnN0cmVhbSAqLworICByZXQgPSBnc3RfcGFkX3B1c2ggKGRlbXV4LT52aWRlb19wYWQsIG91dGJ1Zik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSykgJiYKKyAgICAgIGRlbXV4LT5zZWdtZW50LnJhdGUgPCAwLjAgJiYgcmV0ID09IEdTVF9GTE9XX0VPUyAmJgorICAgICAgZGVtdXgtPnNlZ21lbnQucG9zaXRpb24gPiBkZW11eC0+c2VnbWVudC5zdG9wKSB7CisgICAgLyogSW4gcmV2ZXJzZSBwbGF5YmFjayB3ZSBjYW4gZ2V0IGEgR1NUX0ZMT1dfRU9TIHdoZW4KKyAgICAgKiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgc2VnbWVudCwgc28gd2UganVzdCBuZWVkIHRvIGp1bXAKKyAgICAgKiBiYWNrIHRvIHRoZSBwcmV2aW91cyBzZWN0aW9uLiAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZG93bnN0cmVhbSBoYXMgcmVhY2hlZCBlbmQgb2Ygc2VnbWVudCIpOworICAgIGRlbXV4LT52aWRlb19kb25lID0gVFJVRTsKKyAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICBnb3RvIGJlYWNoOworICB9CisKKyAgcmV0ID0gZ3N0X2Zsb3dfY29tYmluZXJfdXBkYXRlX3BhZF9mbG93IChkZW11eC0+Zmxvd2NvbWJpbmVyLAorICAgICAgZGVtdXgtPnZpZGVvX3BhZCwgcmV0KTsKKworYmVhY2g6CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2dzdF9mbHZfZGVtdXhfcGFyc2VfdGFnX3RpbWVzdGFtcCAoR3N0Rmx2RGVtdXggKiBkZW11eCwgZ2Jvb2xlYW4gaW5kZXgsCisgICAgR3N0QnVmZmVyICogYnVmZmVyLCBzaXplX3QgKiB0YWdfc2l6ZSkKK3sKKyAgZ3VpbnQzMiBkdHMgPSAwLCBkdHNfZXh0ID0gMDsKKyAgZ3VpbnQzMiB0YWdfZGF0YV9zaXplOworICBndWludDggdHlwZTsKKyAgZ2Jvb2xlYW4ga2V5ZnJhbWUgPSBUUlVFOworICBHc3RDbG9ja1RpbWUgcmV0ID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3NpemUgc2l6ZTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSA+PSAxMiwKKyAgICAgIEdTVF9DTE9DS19USU1FX05PTkUpOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKyAgc2l6ZSA9IG1hcC5zaXplOworCisgIHR5cGUgPSBkYXRhWzBdOworCisgIGlmICh0eXBlICE9IDkgJiYgdHlwZSAhPSA4ICYmIHR5cGUgIT0gMTgpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiVW5zdXBwb3J0ZWQgdGFnIHR5cGUgJXUiLCBkYXRhWzBdKTsKKyAgICBnb3RvIGV4aXQ7CisgIH0KKworICBpZiAodHlwZSA9PSA5KQorICAgIGRlbXV4LT5oYXNfdmlkZW8gPSBUUlVFOworICBlbHNlIGlmICh0eXBlID09IDgpCisgICAgZGVtdXgtPmhhc19hdWRpbyA9IFRSVUU7CisKKyAgdGFnX2RhdGFfc2l6ZSA9IEdTVF9SRUFEX1VJTlQyNF9CRSAoZGF0YSArIDEpOworCisgIGlmIChzaXplID49IHRhZ19kYXRhX3NpemUgKyAxMSArIDQpIHsKKyAgICBpZiAoR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhICsgdGFnX2RhdGFfc2l6ZSArIDExKSAhPSB0YWdfZGF0YV9zaXplICsgMTEpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJJbnZhbGlkIHRhZyBzaXplIik7CisgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICB9CisKKyAgaWYgKHRhZ19zaXplKQorICAgICp0YWdfc2l6ZSA9IHRhZ19kYXRhX3NpemUgKyAxMSArIDQ7CisKKyAgZGF0YSArPSA0OworCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgImR0cyBieXRlcyAlMDJYICUwMlggJTAyWCAlMDJYIiwgZGF0YVswXSwgZGF0YVsxXSwKKyAgICAgIGRhdGFbMl0sIGRhdGFbM10pOworCisgIC8qIEdyYWIgdGltZXN0YW1wIG9mIHRhZyB0YWcgKi8KKyAgZHRzID0gR1NUX1JFQURfVUlOVDI0X0JFIChkYXRhKTsKKyAgLyogcmVhZCB0aGUgZHRzIGV4dGVuc2lvbiB0byAzMiBiaXRzIGludGVnZXIgKi8KKyAgZHRzX2V4dCA9IEdTVF9SRUFEX1VJTlQ4IChkYXRhICsgMyk7CisgIC8qIENvbWJpbmUgdGhlbSAqLworICBkdHMgfD0gZHRzX2V4dCA8PCAyNDsKKworICBpZiAodHlwZSA9PSA5KSB7CisgICAgZGF0YSArPSA3OworCisgICAga2V5ZnJhbWUgPSAoKGRhdGFbMF0gPj4gNCkgPT0gMSk7CisgIH0KKworICByZXQgPSBkdHMgKiBHU1RfTVNFQ09ORDsKKyAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiZHRzOiAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHJldCkpOworCisgIGlmIChpbmRleCAmJiAhZGVtdXgtPmluZGV4ZWQgJiYgKHR5cGUgPT0gOSB8fCAodHlwZSA9PSA4CisgICAgICAgICAgICAgICYmICFkZW11eC0+aGFzX3ZpZGVvKSkpIHsKKyAgICBnc3RfZmx2X2RlbXV4X3BhcnNlX2FuZF9hZGRfaW5kZXhfZW50cnkgKGRlbXV4LCByZXQsIGRlbXV4LT5vZmZzZXQsCisgICAgICAgIGtleWZyYW1lKTsKKyAgfQorCisgIGlmIChkZW11eC0+ZHVyYXRpb24gPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSB8fCBkZW11eC0+ZHVyYXRpb24gPCByZXQpCisgICAgZGVtdXgtPmR1cmF0aW9uID0gcmV0OworCitleGl0OgorICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2Zsdl9kZW11eF9wYXJzZV90YWdfdHlwZSAoR3N0Rmx2RGVtdXggKiBkZW11eCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludDggdGFnX3R5cGUgPSAwOworICBHc3RNYXBJbmZvIG1hcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSA+PSA0LCBHU1RfRkxPV19FUlJPUik7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICB0YWdfdHlwZSA9IG1hcC5kYXRhWzBdOworCisgIC8qIFRhZyBzaXplIGlzIDEgYnl0ZSBvZiB0eXBlICsgMyBieXRlcyBvZiBzaXplICsgNyBieXRlcyArIHRhZyBkYXRhIHNpemUgKworICAgKiA0IGJ5dGVzIG9mIHByZXZpb3VzIHRhZyBzaXplICovCisgIGRlbXV4LT50YWdfZGF0YV9zaXplID0gR1NUX1JFQURfVUlOVDI0X0JFIChtYXAuZGF0YSArIDEpOworICBkZW11eC0+dGFnX3NpemUgPSBkZW11eC0+dGFnX2RhdGFfc2l6ZSArIDExOworCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgInRhZyBkYXRhIHNpemUgaXMgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgIGRlbXV4LT50YWdfZGF0YV9zaXplKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgIHN3aXRjaCAodGFnX3R5cGUpIHsKKyAgICBjYXNlIDk6CisgICAgICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfVEFHX1ZJREVPOworICAgICAgZGVtdXgtPmhhc192aWRlbyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfVEFHX0FVRElPOworICAgICAgZGVtdXgtPmhhc19hdWRpbyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE4OgorICAgICAgZGVtdXgtPnN0YXRlID0gRkxWX1NUQVRFX1RBR19TQ1JJUFQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgInVuc3VwcG9ydGVkIHRhZyB0eXBlICV1IiwgdGFnX3R5cGUpOworICAgICAgZGVtdXgtPnN0YXRlID0gRkxWX1NUQVRFX1NLSVA7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2Zsdl9kZW11eF9wYXJzZV9oZWFkZXIgKEdzdEZsdkRlbXV4ICogZGVtdXgsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcikgPj0gOSwgR1NUX0ZMT1dfRVJST1IpOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgLyogQ2hlY2sgZm9yIHRoZSBGTFYgdGFnICovCisgIGlmIChtYXAuZGF0YVswXSA9PSAnRicgJiYgbWFwLmRhdGFbMV0gPT0gJ0wnICYmIG1hcC5kYXRhWzJdID09ICdWJykgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiRkxWIGhlYWRlciBkZXRlY3RlZCIpOworICB9IGVsc2UgeworICAgIGlmIChHX1VOTElLRUxZIChkZW11eC0+c3RyaWN0KSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgImludmFsaWQgaGVhZGVyIHRhZyBkZXRlY3RlZCIpOworICAgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgICAgZ290byBiZWFjaDsKKyAgICB9CisgIH0KKworICBpZiAobWFwLmRhdGFbM10gPT0gJzEnKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJGTFYgdmVyc2lvbiAxIGRldGVjdGVkIik7CisgIH0gZWxzZSB7CisgICAgaWYgKEdfVU5MSUtFTFkgKGRlbXV4LT5zdHJpY3QpKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiaW52YWxpZCBoZWFkZXIgdmVyc2lvbiBkZXRlY3RlZCIpOworICAgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgICAgZ290byBiZWFjaDsKKyAgICB9CisKKyAgfQorCisgIC8qIE5vdyBsb29rIGF0IGF1ZGlvL3ZpZGVvIGZsYWdzICovCisgIHsKKyAgICBndWludDggZmxhZ3MgPSBtYXAuZGF0YVs0XTsKKworICAgIGRlbXV4LT5oYXNfdmlkZW8gPSBkZW11eC0+aGFzX2F1ZGlvID0gRkFMU0U7CisKKyAgICBpZiAoZmxhZ3MgJiAxKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInRoZXJlIGlzIGEgdmlkZW8gc3RyZWFtIik7CisgICAgICBkZW11eC0+aGFzX3ZpZGVvID0gVFJVRTsKKyAgICB9CisgICAgaWYgKGZsYWdzICYgNCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJ0aGVyZSBpcyBhbiBhdWRpbyBzdHJlYW0iKTsKKyAgICAgIGRlbXV4LT5oYXNfYXVkaW8gPSBUUlVFOworICAgIH0KKyAgfQorCisgIC8qIGRvIGEgb25lLXRpbWUgc2Vla2FiaWxpdHkgY2hlY2sgKi8KKyAgZ3N0X2Zsdl9kZW11eF9jaGVja19zZWVrYWJpbGl0eSAoZGVtdXgpOworCisgIC8qIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHJlc3QgKi8KKyAgZGVtdXgtPm5lZWRfaGVhZGVyID0gRkFMU0U7CisKK2JlYWNoOgorICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X2RlbXV4X2ZsdXNoIChHc3RGbHZEZW11eCAqIGRlbXV4LCBnYm9vbGVhbiBkaXNjb250KQoreworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImZsdXNoaW5nIHF1ZXVlZCBkYXRhIGluIHRoZSBGTFYgZGVtdXhlciIpOworCisgIGdzdF9hZGFwdGVyX2NsZWFyIChkZW11eC0+YWRhcHRlcik7CisKKyAgZGVtdXgtPmF1ZGlvX25lZWRfZGlzY29udCA9IFRSVUU7CisgIGRlbXV4LT52aWRlb19uZWVkX2Rpc2NvbnQgPSBUUlVFOworCisgIGRlbXV4LT5mbHVzaGluZyA9IEZBTFNFOworCisgIC8qIE9ubHkgaW4gcHVzaCBtb2RlIGFuZCBpZiB3ZSdyZSBub3QgZHVyaW5nIGEgc2VlayAqLworICBpZiAoIWRlbXV4LT5yYW5kb21fYWNjZXNzICYmIGRlbXV4LT5zdGF0ZSAhPSBGTFZfU1RBVEVfU0VFSykgeworICAgIC8qIEFmdGVyIGEgZmx1c2ggd2UgZXhwZWN0IGEgdGFnX3R5cGUgKi8KKyAgICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfVEFHX1RZUEU7CisgICAgLyogV2UgcmVzZXQgdGhlIG9mZnNldCBhbmQgd2lsbCBnZXQgb25lIGZyb20gZmlyc3QgcHVzaCAqLworICAgIGRlbXV4LT5vZmZzZXQgPSAwOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X2RlbXV4X2NsZWFudXAgKEdzdEZsdkRlbXV4ICogZGVtdXgpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiY2xlYW5pbmcgdXAgRkxWIGRlbXV4ZXIiKTsKKworICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfSEVBREVSOworCisgIGRlbXV4LT5oYXZlX2dyb3VwX2lkID0gRkFMU0U7CisgIGRlbXV4LT5ncm91cF9pZCA9IEdfTUFYVUlOVDsKKworICBkZW11eC0+Zmx1c2hpbmcgPSBGQUxTRTsKKyAgZGVtdXgtPm5lZWRfaGVhZGVyID0gVFJVRTsKKyAgZGVtdXgtPmF1ZGlvX25lZWRfc2VnbWVudCA9IFRSVUU7CisgIGRlbXV4LT52aWRlb19uZWVkX3NlZ21lbnQgPSBUUlVFOworICBkZW11eC0+YXVkaW9fbmVlZF9kaXNjb250ID0gVFJVRTsKKyAgZGVtdXgtPnZpZGVvX25lZWRfZGlzY29udCA9IFRSVUU7CisKKyAgZGVtdXgtPmhhc19hdWRpbyA9IEZBTFNFOworICBkZW11eC0+aGFzX3ZpZGVvID0gRkFMU0U7CisgIGRlbXV4LT5nb3RfcGFyID0gRkFMU0U7CisKKyAgZGVtdXgtPmluZGV4ZWQgPSBGQUxTRTsKKyAgZGVtdXgtPnVwc3RyZWFtX3NlZWthYmxlID0gRkFMU0U7CisgIGRlbXV4LT5maWxlX3NpemUgPSAwOworCisgIGRlbXV4LT5pbmRleF9tYXhfcG9zID0gMDsKKyAgZGVtdXgtPmluZGV4X21heF90aW1lID0gMDsKKworICBkZW11eC0+YXVkaW9fc3RhcnQgPSBkZW11eC0+dmlkZW9fc3RhcnQgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBkZW11eC0+bGFzdF9hdWRpb19wdHMgPSBkZW11eC0+bGFzdF92aWRlb19kdHMgPSAwOworICBkZW11eC0+YXVkaW9fdGltZV9vZmZzZXQgPSBkZW11eC0+dmlkZW9fdGltZV9vZmZzZXQgPSAwOworCisgIGRlbXV4LT5ub19tb3JlX3BhZHMgPSBGQUxTRTsKKworI2lmbmRlZiBHU1RfRElTQUJMRV9ERUJVRworICBkZW11eC0+bm9fYXVkaW9fd2FybmVkID0gRkFMU0U7CisgIGRlbXV4LT5ub192aWRlb193YXJuZWQgPSBGQUxTRTsKKyNlbmRpZgorCisgIGdzdF9zZWdtZW50X2luaXQgKCZkZW11eC0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKworICBkZW11eC0+dyA9IGRlbXV4LT5oID0gMDsKKyAgZGVtdXgtPmZyYW1lcmF0ZSA9IDAuMDsKKyAgZGVtdXgtPnBhcl94ID0gZGVtdXgtPnBhcl95ID0gMTsKKyAgZGVtdXgtPnZpZGVvX29mZnNldCA9IDA7CisgIGRlbXV4LT5hdWRpb19vZmZzZXQgPSAwOworICBkZW11eC0+b2Zmc2V0ID0gZGVtdXgtPmN1cl90YWdfb2Zmc2V0ID0gMDsKKyAgZGVtdXgtPnRhZ19zaXplID0gZGVtdXgtPnRhZ19kYXRhX3NpemUgPSAwOworICBkZW11eC0+ZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIGlmIChkZW11eC0+bmV3X3NlZ19ldmVudCkgeworICAgIGdzdF9ldmVudF91bnJlZiAoZGVtdXgtPm5ld19zZWdfZXZlbnQpOworICAgIGRlbXV4LT5uZXdfc2VnX2V2ZW50ID0gTlVMTDsKKyAgfQorCisgIGdzdF9hZGFwdGVyX2NsZWFyIChkZW11eC0+YWRhcHRlcik7CisKKyAgaWYgKGRlbXV4LT5hdWRpb19jb2RlY19kYXRhKSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoZGVtdXgtPmF1ZGlvX2NvZGVjX2RhdGEpOworICAgIGRlbXV4LT5hdWRpb19jb2RlY19kYXRhID0gTlVMTDsKKyAgfQorCisgIGlmIChkZW11eC0+dmlkZW9fY29kZWNfZGF0YSkgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKGRlbXV4LT52aWRlb19jb2RlY19kYXRhKTsKKyAgICBkZW11eC0+dmlkZW9fY29kZWNfZGF0YSA9IE5VTEw7CisgIH0KKworICBpZiAoZGVtdXgtPmF1ZGlvX3BhZCkgeworICAgIGdzdF9mbG93X2NvbWJpbmVyX3JlbW92ZV9wYWQgKGRlbXV4LT5mbG93Y29tYmluZXIsIGRlbXV4LT5hdWRpb19wYWQpOworICAgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKEdTVF9FTEVNRU5UIChkZW11eCksIGRlbXV4LT5hdWRpb19wYWQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKGRlbXV4LT5hdWRpb19wYWQpOworICAgIGRlbXV4LT5hdWRpb19wYWQgPSBOVUxMOworICB9CisKKyAgaWYgKGRlbXV4LT52aWRlb19wYWQpIHsKKyAgICBnc3RfZmxvd19jb21iaW5lcl9yZW1vdmVfcGFkIChkZW11eC0+Zmxvd2NvbWJpbmVyLCBkZW11eC0+dmlkZW9fcGFkKTsKKyAgICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChHU1RfRUxFTUVOVCAoZGVtdXgpLCBkZW11eC0+dmlkZW9fcGFkKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChkZW11eC0+dmlkZW9fcGFkKTsKKyAgICBkZW11eC0+dmlkZW9fcGFkID0gTlVMTDsKKyAgfQorCisgIGlmIChkZW11eC0+dGltZXMpIHsKKyAgICBnX2FycmF5X2ZyZWUgKGRlbXV4LT50aW1lcywgVFJVRSk7CisgICAgZGVtdXgtPnRpbWVzID0gTlVMTDsKKyAgfQorCisgIGlmIChkZW11eC0+ZmlsZXBvc2l0aW9ucykgeworICAgIGdfYXJyYXlfZnJlZSAoZGVtdXgtPmZpbGVwb3NpdGlvbnMsIFRSVUUpOworICAgIGRlbXV4LT5maWxlcG9zaXRpb25zID0gTlVMTDsKKyAgfQorCisgIGdzdF9mbHZfZGVtdXhfY2xlYXJfdGFncyAoZGVtdXgpOworfQorCisvKgorICogQ3JlYXRlIGFuZCBwdXNoIGEgZmx1c2hpbmcgc2VlayBldmVudCB1cHN0cmVhbQorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2Zsdl9kZW11eF9zZWVrX3RvX29mZnNldCAoR3N0Rmx2RGVtdXggKiBkZW11eCwgZ3VpbnQ2NCBvZmZzZXQpCit7CisgIEdzdEV2ZW50ICpldmVudDsKKyAgZ2Jvb2xlYW4gcmVzID0gMDsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlNlZWtpbmcgdG8gJSIgR19HVUlOVDY0X0ZPUk1BVCwgb2Zmc2V0KTsKKworICBldmVudCA9CisgICAgICBnc3RfZXZlbnRfbmV3X3NlZWsgKDEuMCwgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICAgIEdTVF9TRUVLX0ZMQUdfRkxVU0ggfCBHU1RfU0VFS19GTEFHX0FDQ1VSQVRFLCBHU1RfU0VFS19UWVBFX1NFVCwgb2Zmc2V0LAorICAgICAgR1NUX1NFRUtfVFlQRV9OT05FLCAtMSk7CisKKyAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChkZW11eC0+c2lua3BhZCwgZXZlbnQpOworCisgIGlmIChyZXMpCisgICAgZGVtdXgtPm9mZnNldCA9IG9mZnNldDsKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbHZfZGVtdXhfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdEZsdkRlbXV4ICpkZW11eCA9IE5VTEw7CisKKyAgZGVtdXggPSBHU1RfRkxWX0RFTVVYIChwYXJlbnQpOworCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwKKyAgICAgICJyZWNlaXZlZCBidWZmZXIgb2YgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyBhdCBvZmZzZXQgJSIKKyAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlciksCisgICAgICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpID09IDApKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJiZWdpbm5pbmcgb2YgZmlsZSwgZXhwZWN0IGhlYWRlciIpOworICAgIGRlbXV4LT5zdGF0ZSA9IEZMVl9TVEFURV9IRUFERVI7CisgICAgZGVtdXgtPm9mZnNldCA9IDA7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoZGVtdXgtPm9mZnNldCA9PSAwICYmIEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpICE9IDApKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJvZmZzZXQgd2FzIHplcm8sIHN5bmNocm9uaXppbmcgd2l0aCBidWZmZXIncyIpOworICAgIGRlbXV4LT5vZmZzZXQgPSBHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKTsKKyAgfQorCisgIGlmIChHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChidWZmZXIsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiRGlzY29udGludWl0eSIpOworICAgIGdzdF9hZGFwdGVyX2NsZWFyIChkZW11eC0+YWRhcHRlcik7CisgIH0KKworICBnc3RfYWRhcHRlcl9wdXNoIChkZW11eC0+YWRhcHRlciwgYnVmZmVyKTsKKworICBpZiAoZGVtdXgtPnNlZWtpbmcpIHsKKyAgICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfU0VFSzsKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgICBkZW11eC0+c2Vla2luZyA9IEZBTFNFOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgIH0KKworcGFyc2U6CisgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJnb3QgZmxvdyByZXR1cm4gJXMiLCBnc3RfZmxvd19nZXRfbmFtZSAocmV0KSk7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIGlmIChHX1VOTElLRUxZIChkZW11eC0+Zmx1c2hpbmcpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJ3ZSBhcmUgbm93IGZsdXNoaW5nLCBleGl0aW5nIHBhcnNlciBsb29wIik7CisgICAgcmV0ID0gR1NUX0ZMT1dfRkxVU0hJTkc7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIHN3aXRjaCAoZGVtdXgtPnN0YXRlKSB7CisgICAgY2FzZSBGTFZfU1RBVEVfSEVBREVSOgorICAgIHsKKyAgICAgIGlmIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGRlbXV4LT5hZGFwdGVyKSA+PSBGTFZfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgICAgICAgYnVmZmVyID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKGRlbXV4LT5hZGFwdGVyLCBGTFZfSEVBREVSX1NJWkUpOworCisgICAgICAgIHJldCA9IGdzdF9mbHZfZGVtdXhfcGFyc2VfaGVhZGVyIChkZW11eCwgYnVmZmVyKTsKKworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgICAgICBkZW11eC0+b2Zmc2V0ICs9IEZMVl9IRUFERVJfU0laRTsKKworICAgICAgICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfVEFHX1RZUEU7CisgICAgICAgIGdvdG8gcGFyc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBnb3RvIGJlYWNoOworICAgICAgfQorICAgIH0KKyAgICBjYXNlIEZMVl9TVEFURV9UQUdfVFlQRToKKyAgICB7CisgICAgICBpZiAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZW11eC0+YWRhcHRlcikgPj0gRkxWX1RBR19UWVBFX1NJWkUpIHsKKyAgICAgICAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgICAgICAgLyogUmVtZW1iZXIgdGhlIHRhZyBvZmZzZXQgaW4gYnl0ZXMgKi8KKyAgICAgICAgZGVtdXgtPmN1cl90YWdfb2Zmc2V0ID0gZGVtdXgtPm9mZnNldDsKKworICAgICAgICBidWZmZXIgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoZGVtdXgtPmFkYXB0ZXIsIEZMVl9UQUdfVFlQRV9TSVpFKTsKKworICAgICAgICByZXQgPSBnc3RfZmx2X2RlbXV4X3BhcnNlX3RhZ190eXBlIChkZW11eCwgYnVmZmVyKTsKKworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgICAgICBkZW11eC0+b2Zmc2V0ICs9IEZMVl9UQUdfVFlQRV9TSVpFOworCisgICAgICAgIC8qIGxhc3QgdGFnIGlzIG5vdCBhbiBpbmRleCA9PiBubyBpbmRleC9kb24ndCBrbm93IHdoZXJlIHRoZSBpbmRleCBpcworICAgICAgICAgKiBzZWVrIGJhY2sgdG8gdGhlIGJlZ2lubmluZyAqLworICAgICAgICBpZiAoZGVtdXgtPnNlZWtfZXZlbnQgJiYgZGVtdXgtPnN0YXRlICE9IEZMVl9TVEFURV9UQUdfU0NSSVBUKQorICAgICAgICAgIGdvdG8gbm9faW5kZXg7CisKKyAgICAgICAgZ290byBwYXJzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICB9CisgICAgfQorICAgIGNhc2UgRkxWX1NUQVRFX1RBR19WSURFTzoKKyAgICB7CisgICAgICBpZiAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZW11eC0+YWRhcHRlcikgPj0gZGVtdXgtPnRhZ19zaXplKSB7CisgICAgICAgIEdzdEJ1ZmZlciAqYnVmZmVyOworCisgICAgICAgIGJ1ZmZlciA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChkZW11eC0+YWRhcHRlciwgZGVtdXgtPnRhZ19zaXplKTsKKworICAgICAgICByZXQgPSBnc3RfZmx2X2RlbXV4X3BhcnNlX3RhZ192aWRlbyAoZGVtdXgsIGJ1ZmZlcik7CisKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICAgICAgZGVtdXgtPm9mZnNldCArPSBkZW11eC0+dGFnX3NpemU7CisKKyAgICAgICAgZGVtdXgtPnN0YXRlID0gRkxWX1NUQVRFX1RBR19UWVBFOworICAgICAgICBnb3RvIHBhcnNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ290byBiZWFjaDsKKyAgICAgIH0KKyAgICB9CisgICAgY2FzZSBGTFZfU1RBVEVfVEFHX0FVRElPOgorICAgIHsKKyAgICAgIGlmIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGRlbXV4LT5hZGFwdGVyKSA+PSBkZW11eC0+dGFnX3NpemUpIHsKKyAgICAgICAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgICAgICAgYnVmZmVyID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKGRlbXV4LT5hZGFwdGVyLCBkZW11eC0+dGFnX3NpemUpOworCisgICAgICAgIHJldCA9IGdzdF9mbHZfZGVtdXhfcGFyc2VfdGFnX2F1ZGlvIChkZW11eCwgYnVmZmVyKTsKKworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgICAgICBkZW11eC0+b2Zmc2V0ICs9IGRlbXV4LT50YWdfc2l6ZTsKKworICAgICAgICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfVEFHX1RZUEU7CisgICAgICAgIGdvdG8gcGFyc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBnb3RvIGJlYWNoOworICAgICAgfQorICAgIH0KKyAgICBjYXNlIEZMVl9TVEFURV9UQUdfU0NSSVBUOgorICAgIHsKKyAgICAgIGlmIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGRlbXV4LT5hZGFwdGVyKSA+PSBkZW11eC0+dGFnX3NpemUpIHsKKyAgICAgICAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgICAgICAgYnVmZmVyID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKGRlbXV4LT5hZGFwdGVyLCBkZW11eC0+dGFnX3NpemUpOworCisgICAgICAgIHJldCA9IGdzdF9mbHZfZGVtdXhfcGFyc2VfdGFnX3NjcmlwdCAoZGVtdXgsIGJ1ZmZlcik7CisKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICAgICAgZGVtdXgtPm9mZnNldCArPSBkZW11eC0+dGFnX3NpemU7CisKKyAgICAgICAgZGVtdXgtPnN0YXRlID0gRkxWX1NUQVRFX1RBR19UWVBFOworCisgICAgICAgIC8qIGlmIHRoZXJlJ3MgYSBzZWVrIGV2ZW50IHdlJ3JlIGhlcmUgZm9yIHRoZSBpbmRleCBzbyBpZiB3ZSBkb24ndCBoYXZlIGl0CisgICAgICAgICAqIHdlIHNlZWsgYmFjayB0byB0aGUgYmVnaW5uaW5nICovCisgICAgICAgIGlmIChkZW11eC0+c2Vla19ldmVudCkgeworICAgICAgICAgIGlmIChkZW11eC0+aW5kZXhlZCkKKyAgICAgICAgICAgIGRlbXV4LT5zdGF0ZSA9IEZMVl9TVEFURV9TRUVLOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdvdG8gbm9faW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBnb3RvIHBhcnNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ290byBiZWFjaDsKKyAgICAgIH0KKyAgICB9CisgICAgY2FzZSBGTFZfU1RBVEVfU0VFSzoKKyAgICB7CisgICAgICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgICAgIHJldCA9IEdTVF9GTE9XX09LOworCisgICAgICBpZiAoIWRlbXV4LT5pbmRleGVkKSB7CisgICAgICAgIGlmIChkZW11eC0+b2Zmc2V0ID09IGRlbXV4LT5maWxlX3NpemUgLSBzaXplb2YgKGd1aW50MzIpKSB7CisgICAgICAgICAgZ3VpbnQ2NCBzZWVrX29mZnNldDsKKyAgICAgICAgICBndWludDggKmRhdGE7CisKKyAgICAgICAgICBkYXRhID0gZ3N0X2FkYXB0ZXJfdGFrZSAoZGVtdXgtPmFkYXB0ZXIsIDQpOworICAgICAgICAgIGlmICghZGF0YSkKKyAgICAgICAgICAgIGdvdG8gbm9faW5kZXg7CisKKyAgICAgICAgICBzZWVrX29mZnNldCA9IGRlbXV4LT5maWxlX3NpemUgLSBzaXplb2YgKGd1aW50MzIpIC0KKyAgICAgICAgICAgICAgR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhKTsKKyAgICAgICAgICBnX2ZyZWUgKGRhdGEpOworCisgICAgICAgICAgR1NUX0lORk9fT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgIlNlZWtpbmcgdG8gYmVnaW5uaW5nIG9mIGxhc3QgdGFnIGF0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICAgIHNlZWtfb2Zmc2V0KTsKKyAgICAgICAgICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfVEFHX1RZUEU7CisgICAgICAgICAgZmx2X2RlbXV4X3NlZWtfdG9fb2Zmc2V0IChkZW11eCwgc2Vla19vZmZzZXQpOworICAgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gbm9faW5kZXg7CisgICAgICB9CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICAgICAgZXZlbnQgPSBkZW11eC0+c2Vla19ldmVudDsKKyAgICAgIGRlbXV4LT5zZWVrX2V2ZW50ID0gTlVMTDsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisKKyAgICAgIC8qIGNhbGN1bGF0ZSBhbmQgcGVyZm9ybSBzZWVrICovCisgICAgICBpZiAoIWZsdl9kZW11eF9oYW5kbGVfc2Vla19wdXNoIChkZW11eCwgZXZlbnQpKQorICAgICAgICBnb3RvIHNlZWtfZmFpbGVkOworCisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGRlbXV4LT5zdGF0ZSA9IEZMVl9TVEFURV9UQUdfVFlQRTsKKyAgICAgIGdvdG8gYmVhY2g7CisgICAgfQorICAgIGNhc2UgRkxWX1NUQVRFX1NLSVA6CisgICAgICAvKiBTa2lwIHVua25vd24gdGFncyAoc2V0IGluIF9wYXJzZV90YWdfdHlwZSgpKSAqLworICAgICAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoZGVtdXgtPmFkYXB0ZXIpID49IGRlbXV4LT50YWdfc2l6ZSkgeworICAgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAoZGVtdXgtPmFkYXB0ZXIsIGRlbXV4LT50YWdfc2l6ZSk7CisgICAgICAgIGRlbXV4LT5vZmZzZXQgKz0gZGVtdXgtPnRhZ19zaXplOworICAgICAgICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfVEFHX1RZUEU7CisgICAgICAgIGdvdG8gcGFyc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBnb3RvIGJlYWNoOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInVuZXhwZWN0ZWQgZGVtdXhlciBzdGF0ZSIpOworICB9CisKK2JlYWNoOgorICByZXR1cm4gcmV0OworCisvKiBFUlJPUlMgKi8KK25vX2luZGV4OgorICB7CisgICAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgICAgZGVtdXgtPnNlZWtpbmcgPSBGQUxTRTsKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGRlbXV4LT5zZWVrX2V2ZW50KTsKKyAgICBkZW11eC0+c2Vla19ldmVudCA9IE5VTEw7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAiZmFpbGVkIHRvIGZpbmQgYW4gaW5kZXgsIHNlZWtpbmcgYmFjayB0byBiZWdpbm5pbmciKTsKKyAgICBmbHZfZGVtdXhfc2Vla190b19vZmZzZXQgKGRlbXV4LCAwKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK3NlZWtfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlbXV4LCBTVFJFQU0sIERFTVVYLCAoTlVMTCksICgic2VlayBmYWlsZWQiKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbHZfZGVtdXhfcHVsbF9yYW5nZSAoR3N0Rmx2RGVtdXggKiBkZW11eCwgR3N0UGFkICogcGFkLCBndWludDY0IG9mZnNldCwKKyAgICBndWludCBzaXplLCBHc3RCdWZmZXIgKiogYnVmZmVyKQoreworICBHc3RGbG93UmV0dXJuIHJldDsKKworICByZXQgPSBnc3RfcGFkX3B1bGxfcmFuZ2UgKHBhZCwgb2Zmc2V0LCBzaXplLCBidWZmZXIpOworICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICJmYWlsZWQgd2hlbiBwdWxsaW5nICVkIGJ5dGVzIGZyb20gb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIjogJXMiLAorICAgICAgICBzaXplLCBvZmZzZXQsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgICAqYnVmZmVyID0gTlVMTDsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgaWYgKEdfVU5MSUtFTFkgKCpidWZmZXIgJiYgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoKmJ1ZmZlcikgIT0gc2l6ZSkpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAicGFydGlhbCBwdWxsIGdvdCAlIiBHX0dTSVpFX0ZPUk1BVCAiIHdoZW4gZXhwZWN0aW5nICVkIGZyb20gb2Zmc2V0ICUiCisgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIGdzdF9idWZmZXJfZ2V0X3NpemUgKCpidWZmZXIpLCBzaXplLCBvZmZzZXQpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKCpidWZmZXIpOworICAgIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgICAqYnVmZmVyID0gTlVMTDsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbHZfZGVtdXhfcHVsbF90YWcgKEdzdFBhZCAqIHBhZCwgR3N0Rmx2RGVtdXggKiBkZW11eCkKK3sKKyAgR3N0QnVmZmVyICpidWZmZXIgPSBOVUxMOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworCisgIC8qIFN0b3JlIHRhZyBvZmZzZXQgKi8KKyAgZGVtdXgtPmN1cl90YWdfb2Zmc2V0ID0gZGVtdXgtPm9mZnNldDsKKworICAvKiBHZXQgdGhlIGZpcnN0IDQgYnl0ZXMgdG8gaWRlbnRpZnkgdGFnIHR5cGUgYW5kIHNpemUgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKChyZXQgPSBnc3RfZmx2X2RlbXV4X3B1bGxfcmFuZ2UgKGRlbXV4LCBwYWQsIGRlbXV4LT5vZmZzZXQsCisgICAgICAgICAgICAgICAgICBGTFZfVEFHX1RZUEVfU0laRSwgJmJ1ZmZlcikpICE9IEdTVF9GTE9XX09LKSkKKyAgICBnb3RvIGJlYWNoOworCisgIC8qIElkZW50aWZ5IHRhZyB0eXBlICovCisgIHJldCA9IGdzdF9mbHZfZGVtdXhfcGFyc2VfdGFnX3R5cGUgKGRlbXV4LCBidWZmZXIpOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSykpCisgICAgZ290byBiZWFjaDsKKworICAvKiBKdW1wIG92ZXIgdGFnIHR5cGUgKyBzaXplICovCisgIGRlbXV4LT5vZmZzZXQgKz0gRkxWX1RBR19UWVBFX1NJWkU7CisKKyAgLyogUHVsbCB0aGUgd2hvbGUgdGFnICovCisgIGJ1ZmZlciA9IE5VTEw7CisgIGlmIChHX1VOTElLRUxZICgocmV0ID0gZ3N0X2Zsdl9kZW11eF9wdWxsX3JhbmdlIChkZW11eCwgcGFkLCBkZW11eC0+b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgZGVtdXgtPnRhZ19zaXplLCAmYnVmZmVyKSkgIT0gR1NUX0ZMT1dfT0spKQorICAgIGdvdG8gYmVhY2g7CisKKyAgc3dpdGNoIChkZW11eC0+c3RhdGUpIHsKKyAgICBjYXNlIEZMVl9TVEFURV9UQUdfVklERU86CisgICAgICByZXQgPSBnc3RfZmx2X2RlbXV4X3BhcnNlX3RhZ192aWRlbyAoZGVtdXgsIGJ1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZMVl9TVEFURV9UQUdfQVVESU86CisgICAgICByZXQgPSBnc3RfZmx2X2RlbXV4X3BhcnNlX3RhZ19hdWRpbyAoZGVtdXgsIGJ1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZMVl9TVEFURV9UQUdfU0NSSVBUOgorICAgICAgcmV0ID0gZ3N0X2Zsdl9kZW11eF9wYXJzZV90YWdfc2NyaXB0IChkZW11eCwgYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAidW5leHBlY3RlZCBzdGF0ZSAlZCIsIGRlbXV4LT5zdGF0ZSk7CisgIH0KKworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgIC8qIEp1bXAgb3ZlciB0aGF0IHBhcnQgd2UndmUganVzdCBwYXJzZWQgKi8KKyAgZGVtdXgtPm9mZnNldCArPSBkZW11eC0+dGFnX3NpemU7CisKKyAgLyogTWFrZSBzdXJlIHdlIHJlaW5pdGlhbGl6ZSB0aGUgdGFnIHNpemUgKi8KKyAgZGVtdXgtPnRhZ19zaXplID0gMDsKKworICAvKiBSZWFkeSBmb3IgdGhlIG5leHQgdGFnICovCisgIGRlbXV4LT5zdGF0ZSA9IEZMVl9TVEFURV9UQUdfVFlQRTsKKworICBpZiAoR19VTkxJS0VMWSAocmV0ID09IEdTVF9GTE9XX05PVF9MSU5LRUQpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgInBhcnNpbmcgdGhpcyB0YWcgcmV0dXJuZWQgbm90LWxpbmtlZCBhbmQgIgorICAgICAgICAibmVpdGhlciB2aWRlbyBub3IgYXVkaW8gYXJlIGxpbmtlZCIpOworICB9CisKK2JlYWNoOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2Zsdl9kZW11eF9wdWxsX2hlYWRlciAoR3N0UGFkICogcGFkLCBHc3RGbHZEZW11eCAqIGRlbXV4KQoreworICBHc3RCdWZmZXIgKmJ1ZmZlciA9IE5VTEw7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgLyogR2V0IHRoZSBmaXJzdCA5IGJ5dGVzICovCisgIGlmIChHX1VOTElLRUxZICgocmV0ID0gZ3N0X2Zsdl9kZW11eF9wdWxsX3JhbmdlIChkZW11eCwgcGFkLCBkZW11eC0+b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgRkxWX0hFQURFUl9TSVpFLCAmYnVmZmVyKSkgIT0gR1NUX0ZMT1dfT0spKQorICAgIGdvdG8gYmVhY2g7CisKKyAgcmV0ID0gZ3N0X2Zsdl9kZW11eF9wYXJzZV9oZWFkZXIgKGRlbXV4LCBidWZmZXIpOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgLyogSnVtcCBvdmVyIHRoZSBoZWFkZXIgbm93ICovCisgIGRlbXV4LT5vZmZzZXQgKz0gRkxWX0hFQURFUl9TSVpFOworICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfVEFHX1RZUEU7CisKK2JlYWNoOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X2Zsdl9kZW11eF9tb3ZlX3RvX29mZnNldCAoR3N0Rmx2RGVtdXggKiBkZW11eCwgZ2ludDY0IG9mZnNldCwKKyAgICBnYm9vbGVhbiByZXNldCkKK3sKKyAgZGVtdXgtPm9mZnNldCA9IG9mZnNldDsKKworICAvKiBUZWxsIGFsbCB0aGUgc3RyZWFtIHdlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHBvc2l0aW9uIChkaXNjb250KSAqLworICBkZW11eC0+YXVkaW9fbmVlZF9kaXNjb250ID0gVFJVRTsKKyAgZGVtdXgtPnZpZGVvX25lZWRfZGlzY29udCA9IFRSVUU7CisKKyAgLyogbmV4dCBzZWN0aW9uIHNldHVwICovCisgIGRlbXV4LT5mcm9tX29mZnNldCA9IC0xOworICBkZW11eC0+YXVkaW9fZG9uZSA9IGRlbXV4LT52aWRlb19kb25lID0gRkFMU0U7CisgIGRlbXV4LT5hdWRpb19maXJzdF90cyA9IGRlbXV4LT52aWRlb19maXJzdF90cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisKKyAgaWYgKHJlc2V0KSB7CisgICAgZGVtdXgtPmZyb21fb2Zmc2V0ID0gLTE7CisgICAgZGVtdXgtPnRvX29mZnNldCA9IEdfTUFYSU5UNjQ7CisgIH0KKworICAvKiBJZiB3ZSBzZWVrZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSBwYXJzZSB0aGUgaGVhZGVyIGFnYWluICovCisgIGlmIChHX1VOTElLRUxZICghZGVtdXgtPm9mZnNldCkpIHsKKyAgICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfSEVBREVSOworICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBvciBwYXJzZSBhIHRhZyAqLworICAgIGRlbXV4LT5zdGF0ZSA9IEZMVl9TVEFURV9UQUdfVFlQRTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2Zsdl9kZW11eF9zZWVrX3RvX3ByZXZfa2V5ZnJhbWUgKEdzdEZsdkRlbXV4ICogZGVtdXgpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfRU9TOworICBHc3RJbmRleCAqaW5kZXg7CisgIEdzdEluZGV4RW50cnkgKmVudHJ5ID0gTlVMTDsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICJ0ZXJtaW5hdGVkIHNlY3Rpb24gc3RhcnRlZCBhdCBvZmZzZXQgJSIgR19HSU5UNjRfRk9STUFULAorICAgICAgZGVtdXgtPmZyb21fb2Zmc2V0KTsKKworICAvKiB3ZSBhcmUgZG9uZSBpZiB3ZSBnb3QgYWxsIGF1ZGlvIGFuZCB2aWRlbyAqLworICBpZiAoKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZGVtdXgtPmF1ZGlvX2ZpcnN0X3RzKSB8fAorICAgICAgICAgIGRlbXV4LT5hdWRpb19maXJzdF90cyA8IGRlbXV4LT5zZWdtZW50LnN0YXJ0KSAmJgorICAgICAgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZGVtdXgtPnZpZGVvX2ZpcnN0X3RzKSB8fAorICAgICAgICAgIGRlbXV4LT52aWRlb19maXJzdF90cyA8IGRlbXV4LT5zZWdtZW50LnN0YXJ0KSkKKyAgICBnb3RvIGRvbmU7CisKKyAgaWYgKGRlbXV4LT5mcm9tX29mZnNldCA8PSAwKQorICAgIGdvdG8gZG9uZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImxvY2F0aW5nIHByZXZpb3VzIHBvc2l0aW9uIik7CisKKyAgaW5kZXggPSBnc3RfZmx2X2RlbXV4X2dldF9pbmRleCAoR1NUX0VMRU1FTlQgKGRlbXV4KSk7CisKKyAgLyogbG9jYXRlIGluZGV4IGVudHJ5IGJlZm9yZSBwcmV2aW91cyBzdGFydCBwb3NpdGlvbiAqLworICBpZiAoaW5kZXgpIHsKKyAgICBlbnRyeSA9IGdzdF9pbmRleF9nZXRfYXNzb2NfZW50cnkgKGluZGV4LCBkZW11eC0+aW5kZXhfaWQsCisgICAgICAgIEdTVF9JTkRFWF9MT09LVVBfQkVGT1JFLCBHU1RfQVNTT0NJQVRJT05fRkxBR19LRVlfVU5JVCwKKyAgICAgICAgR1NUX0ZPUk1BVF9CWVRFUywgZGVtdXgtPmZyb21fb2Zmc2V0IC0gMSk7CisKKyAgICBpZiAoZW50cnkpIHsKKyAgICAgIGdpbnQ2NCBieXRlcyA9IDAsIHRpbWUgPSAwOworCisgICAgICBnc3RfaW5kZXhfZW50cnlfYXNzb2NfbWFwIChlbnRyeSwgR1NUX0ZPUk1BVF9CWVRFUywgJmJ5dGVzKTsKKyAgICAgIGdzdF9pbmRleF9lbnRyeV9hc3NvY19tYXAgKGVudHJ5LCBHU1RfRk9STUFUX1RJTUUsICZ0aW1lKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJmb3VuZCBpbmRleCBlbnRyeSBmb3IgJSIgR19HSU5UNjRfRk9STUFUCisgICAgICAgICAgIiBhdCAlIiBHU1RfVElNRV9GT1JNQVQgIiwgc2Vla2luZyB0byAlIiBHX0dJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgZGVtdXgtPm9mZnNldCAtIDEsIEdTVF9USU1FX0FSR1MgKHRpbWUpLCBieXRlcyk7CisKKyAgICAgIC8qIHNldHVwIGZvciBuZXh0IHNlY3Rpb24gKi8KKyAgICAgIGRlbXV4LT50b19vZmZzZXQgPSBkZW11eC0+ZnJvbV9vZmZzZXQ7CisgICAgICBnc3RfZmx2X2RlbXV4X21vdmVfdG9fb2Zmc2V0IChkZW11eCwgYnl0ZXMsIEZBTFNFKTsKKyAgICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgIH0KKworICAgIGdzdF9vYmplY3RfdW5yZWYgKGluZGV4KTsKKyAgfQorCitkb25lOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2Zsdl9kZW11eF9jcmVhdGVfaW5kZXggKEdzdEZsdkRlbXV4ICogZGVtdXgsIGdpbnQ2NCBwb3MsIEdzdENsb2NrVGltZSB0cykKK3sKKyAgZ2ludDY0IHNpemU7CisgIHNpemVfdCB0YWdfc2l6ZTsKKyAgZ3VpbnQ2NCBvbGRfb2Zmc2V0OworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0Q2xvY2tUaW1lIHRhZ190aW1lOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworCisgIGlmICghZ3N0X3BhZF9wZWVyX3F1ZXJ5X2R1cmF0aW9uIChkZW11eC0+c2lua3BhZCwgR1NUX0ZPUk1BVF9CWVRFUywgJnNpemUpKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImJ1aWxkaW5nIGluZGV4IGF0ICUiIEdfR0lOVDY0X0ZPUk1BVAorICAgICAgIiBsb29raW5nIGZvciB0aW1lICUiIEdTVF9USU1FX0ZPUk1BVCwgcG9zLCBHU1RfVElNRV9BUkdTICh0cykpOworCisgIG9sZF9vZmZzZXQgPSBkZW11eC0+b2Zmc2V0OworICBkZW11eC0+b2Zmc2V0ID0gcG9zOworCisgIGJ1ZmZlciA9IE5VTEw7CisgIHdoaWxlICgocmV0ID0gZ3N0X2Zsdl9kZW11eF9wdWxsX3JhbmdlIChkZW11eCwgZGVtdXgtPnNpbmtwYWQsIGRlbXV4LT5vZmZzZXQsCisgICAgICAgICAgICAgIDEyLCAmYnVmZmVyKSkgPT0gR1NUX0ZMT1dfT0spIHsKKyAgICB0YWdfdGltZSA9CisgICAgICAgIGdzdF9mbHZfZGVtdXhfcGFyc2VfdGFnX3RpbWVzdGFtcCAoZGVtdXgsIFRSVUUsIGJ1ZmZlciwgJnRhZ19zaXplKTsKKworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgYnVmZmVyID0gTlVMTDsKKworICAgIGlmIChHX1VOTElLRUxZICh0YWdfdGltZSA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FIHx8IHRhZ190aW1lID4gdHMpKQorICAgICAgZ290byBleGl0OworCisgICAgZGVtdXgtPm9mZnNldCArPSB0YWdfc2l6ZTsKKyAgfQorCisgIGlmIChyZXQgPT0gR1NUX0ZMT1dfRU9TKSB7CisgICAgLyogZmlsZSByYW4gb3V0LCBzbyBtYXJrIHdlIGhhdmUgY29tcGxldGUgaW5kZXggKi8KKyAgICBkZW11eC0+aW5kZXhlZCA9IFRSVUU7CisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgIH0KKworZXhpdDoKKyAgZGVtdXgtPm9mZnNldCA9IG9sZF9vZmZzZXQ7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdpbnQ2NAorZ3N0X2Zsdl9kZW11eF9nZXRfbWV0YWRhdGEgKEdzdEZsdkRlbXV4ICogZGVtdXgpCit7CisgIGdpbnQ2NCByZXQgPSAwLCBvZmZzZXQ7CisgIHNpemVfdCB0YWdfc2l6ZSwgc2l6ZTsKKyAgR3N0QnVmZmVyICpidWZmZXIgPSBOVUxMOworICBHc3RNYXBJbmZvIG1hcDsKKworICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeV9kdXJhdGlvbiAoZGVtdXgtPnNpbmtwYWQsIEdTVF9GT1JNQVRfQllURVMsICZvZmZzZXQpKQorICAgIGdvdG8gZXhpdDsKKworICByZXQgPSBvZmZzZXQ7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAidXBzdHJlYW0gc2l6ZTogJSIgR19HSU5UNjRfRk9STUFULCBvZmZzZXQpOworICBpZiAoR19VTkxJS0VMWSAob2Zmc2V0IDwgNCkpCisgICAgZ290byBleGl0OworCisgIG9mZnNldCAtPSA0OworICBpZiAoR1NUX0ZMT1dfT0sgIT0gZ3N0X2Zsdl9kZW11eF9wdWxsX3JhbmdlIChkZW11eCwgZGVtdXgtPnNpbmtwYWQsIG9mZnNldCwKKyAgICAgICAgICA0LCAmYnVmZmVyKSkKKyAgICBnb3RvIGV4aXQ7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgdGFnX3NpemUgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKG1hcC5kYXRhKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJsYXN0IHRhZyBzaXplOiAlIiBHX0dTSVpFX0ZPUk1BVCwgdGFnX3NpemUpOworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICBidWZmZXIgPSBOVUxMOworCisgIGlmIChHX1VOTElLRUxZIChvZmZzZXQgPCB0YWdfc2l6ZSkpCisgICAgZ290byBleGl0OworCisgIG9mZnNldCAtPSB0YWdfc2l6ZTsKKyAgaWYgKEdTVF9GTE9XX09LICE9IGdzdF9mbHZfZGVtdXhfcHVsbF9yYW5nZSAoZGVtdXgsIGRlbXV4LT5zaW5rcGFkLCBvZmZzZXQsCisgICAgICAgICAgMTIsICZidWZmZXIpKQorICAgIGdvdG8gZXhpdDsKKworICAvKiBhIGNvbnNpc3RlbmN5IGNoZWNrICovCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHNpemUgPSBHU1RfUkVBRF9VSU5UMjRfQkUgKG1hcC5kYXRhICsgMSk7CisgIGlmIChzaXplICE9IHRhZ19zaXplIC0gMTEpIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAidGFnIHNpemUgJSIgR19HU0laRV9GT1JNQVQgIiwgZXhwZWN0ZWQgJSIgR19HU0laRV9GT1JNQVQKKyAgICAgICAgIiwgY29ycnVwdCBvciB0cnVuY2F0ZWQgZmlsZSIsIHNpemUsIHRhZ19zaXplIC0gMTEpOworICAgIGdvdG8gZXhpdDsKKyAgfQorCisgIC8qIHRyeSB0byB1cGRhdGUgZHVyYXRpb24gd2l0aCB0aW1lc3RhbXAgaW4gYW55IGNhc2UgKi8KKyAgZ3N0X2Zsdl9kZW11eF9wYXJzZV90YWdfdGltZXN0YW1wIChkZW11eCwgRkFMU0UsIGJ1ZmZlciwgJnNpemUpOworCisgIC8qIG1heWJlIGdldCBzb21lIG1vcmUgbWV0YWRhdGEgKi8KKyAgaWYgKG1hcC5kYXRhWzBdID09IDE4KSB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJzY3JpcHQgdGFnLCBwdWxsaW5nIGl0IHRvIHBhcnNlIik7CisgICAgb2Zmc2V0ICs9IDQ7CisgICAgaWYgKEdTVF9GTE9XX09LID09IGdzdF9mbHZfZGVtdXhfcHVsbF9yYW5nZSAoZGVtdXgsIGRlbXV4LT5zaW5rcGFkLCBvZmZzZXQsCisgICAgICAgICAgICB0YWdfc2l6ZSwgJmJ1ZmZlcikpCisgICAgICBnc3RfZmx2X2RlbXV4X3BhcnNlX3RhZ19zY3JpcHQgKGRlbXV4LCBidWZmZXIpOworICB9IGVsc2UgeworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIH0KKworZXhpdDoKKyAgaWYgKGJ1ZmZlcikKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X2RlbXV4X2xvb3AgKEdzdFBhZCAqIHBhZCkKK3sKKyAgR3N0Rmx2RGVtdXggKmRlbXV4ID0gTlVMTDsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKworICBkZW11eCA9IEdTVF9GTFZfREVNVVggKGdzdF9wYWRfZ2V0X3BhcmVudCAocGFkKSk7CisKKyAgLyogcHVsbCBpbiBkYXRhICovCisgIHN3aXRjaCAoZGVtdXgtPnN0YXRlKSB7CisgICAgY2FzZSBGTFZfU1RBVEVfVEFHX1RZUEU6CisgICAgICBpZiAoZGVtdXgtPmZyb21fb2Zmc2V0ID09IC0xKQorICAgICAgICBkZW11eC0+ZnJvbV9vZmZzZXQgPSBkZW11eC0+b2Zmc2V0OworICAgICAgcmV0ID0gZ3N0X2Zsdl9kZW11eF9wdWxsX3RhZyAocGFkLCBkZW11eCk7CisgICAgICAvKiBpZiB3ZSBoYXZlIHNlZW4gcmVhbCBkYXRhLCB3ZSBwcm9iYWJseSBwYXNzZWQgYSBwb3NzaWJsZSBtZXRhZGF0YQorICAgICAgICogaGVhZGVyIGxvY2F0ZWQgYXQgc3RhcnQuICBTbyBpZiB3ZSBkbyBub3QgeWV0IGhhdmUgYW4gaW5kZXgsCisgICAgICAgKiB0cnkgdG8gcGljayB1cCBtZXRhZGF0YSAoaW5kZXgsIGR1cmF0aW9uKSBhdCB0aGUgZW5kICovCisgICAgICBpZiAoR19VTkxJS0VMWSAoIWRlbXV4LT5maWxlX3NpemUgJiYgIWRlbXV4LT5pbmRleGVkICYmCisgICAgICAgICAgICAgIChkZW11eC0+aGFzX3ZpZGVvIHx8IGRlbXV4LT5oYXNfYXVkaW8pKSkKKyAgICAgICAgZGVtdXgtPmZpbGVfc2l6ZSA9IGdzdF9mbHZfZGVtdXhfZ2V0X21ldGFkYXRhIChkZW11eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZMVl9TVEFURV9ET05FOgorICAgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGTFZfU1RBVEVfU0VFSzoKKyAgICAgIC8qIHNlZWsgaXNzdWVkIHdpdGggaW5zdWZmaWNpZW50IGluZGV4OworICAgICAgICogc2NhbiBmb3IgaW5kZXggaW4gdGFzayB0aHJlYWQgZnJvbSBjdXJyZW50IG1heGltdW0gb2Zmc2V0IHRvCisgICAgICAgKiBkZXNpcmVkIHRpbWUgYW5kIHRoZW4gcGVyZm9ybSBzZWVrICovCisgICAgICAvKiBUT0RPIG1heWJlIHNvbWUgYnVmZmVyaW5nIG1lc3NhZ2Ugb3Igc28gdG8gaW5kaWNhdGUgc2NhbiBwcm9ncmVzcyAqLworICAgICAgcmV0ID0gZ3N0X2Zsdl9kZW11eF9jcmVhdGVfaW5kZXggKGRlbXV4LCBkZW11eC0+aW5kZXhfbWF4X3BvcywKKyAgICAgICAgICBkZW11eC0+c2Vla190aW1lKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gcGF1c2U7CisgICAgICAvKiBwb3NpdGlvbiBhbmQgc3RhdGUgYXJyYW5nZWQgYnkgc2VlaywKKyAgICAgICAqIGFsc28gdW5yZWZzIGV2ZW50ICovCisgICAgICBnc3RfZmx2X2RlbXV4X2hhbmRsZV9zZWVrX3B1bGwgKGRlbXV4LCBkZW11eC0+c2Vla19ldmVudCwgRkFMU0UpOworICAgICAgZGVtdXgtPnNlZWtfZXZlbnQgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IGdzdF9mbHZfZGVtdXhfcHVsbF9oZWFkZXIgKHBhZCwgZGVtdXgpOworICAgICAgLyogaW5kZXggc2NhbnMgc3RhcnQgYWZ0ZXIgaGVhZGVyICovCisgICAgICBkZW11eC0+aW5kZXhfbWF4X3BvcyA9IGRlbXV4LT5vZmZzZXQ7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChkZW11eC0+c2VnbWVudC5yYXRlIDwgMC4wKSB7CisgICAgLyogY2hlY2sgZW5kIG9mIHNlY3Rpb24gKi8KKyAgICBpZiAoKGdpbnQ2NCkgZGVtdXgtPm9mZnNldCA+PSBkZW11eC0+dG9fb2Zmc2V0IHx8CisgICAgICAgIGRlbXV4LT5zZWdtZW50LnBvc2l0aW9uID49IGRlbXV4LT5zZWdtZW50LnN0b3AgKyAyICogR1NUX1NFQ09ORCB8fAorICAgICAgICAoZGVtdXgtPmF1ZGlvX2RvbmUgJiYgZGVtdXgtPnZpZGVvX2RvbmUpKQorICAgICAgcmV0ID0gZ3N0X2Zsdl9kZW11eF9zZWVrX3RvX3ByZXZfa2V5ZnJhbWUgKGRlbXV4KTsKKyAgfSBlbHNlIHsKKyAgICAvKiBjaGVjayBFT1MgY29uZGl0aW9uICovCisgICAgaWYgKChkZW11eC0+c2VnbWVudC5zdG9wICE9IC0xKSAmJgorICAgICAgICAoZGVtdXgtPnNlZ21lbnQucG9zaXRpb24gPj0gZGVtdXgtPnNlZ21lbnQuc3RvcCkpIHsKKyAgICAgIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgICB9CisgIH0KKworICAvKiBwYXVzZSBpZiBzb21ldGhpbmcgd2VudCB3cm9uZyBvciBhdCBlbmQgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSykpCisgICAgZ290byBwYXVzZTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChkZW11eCk7CisKKyAgcmV0dXJuOworCitwYXVzZToKKyAgeworICAgIGNvbnN0IGdjaGFyICpyZWFzb24gPSBnc3RfZmxvd19nZXRfbmFtZSAocmV0KTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgInBhdXNpbmcgdGFzaywgcmVhc29uICVzIiwgcmVhc29uKTsKKyAgICBnc3RfcGFkX3BhdXNlX3Rhc2sgKHBhZCk7CisKKyAgICBpZiAocmV0ID09IEdTVF9GTE9XX0VPUykgeworICAgICAgLyogaGFuZGxlIGVuZC1vZi1zdHJlYW0vc2VnbWVudCAqLworICAgICAgLyogc28gYWxpZ24gb3VyIHBvc2l0aW9uIHdpdGggdGhlIGVuZCBvZiBpdCwgaWYgdGhlcmUgaXMgb25lCisgICAgICAgKiB0aGlzIGVuc3VyZXMgYSBzdWJzZXF1ZW50IHdpbGwgYXJyaXZlIGF0IGNvcnJlY3QgYmFzZS9hY2MgdGltZSAqLworICAgICAgaWYgKGRlbXV4LT5zZWdtZW50LnJhdGUgPiAwLjAgJiYKKyAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZGVtdXgtPnNlZ21lbnQuc3RvcCkpCisgICAgICAgIGRlbXV4LT5zZWdtZW50LnBvc2l0aW9uID0gZGVtdXgtPnNlZ21lbnQuc3RvcDsKKyAgICAgIGVsc2UgaWYgKGRlbXV4LT5zZWdtZW50LnJhdGUgPCAwLjApCisgICAgICAgIGRlbXV4LT5zZWdtZW50LnBvc2l0aW9uID0gZGVtdXgtPnNlZ21lbnQuc3RhcnQ7CisKKyAgICAgIC8qIHBlcmZvcm0gRU9TIGxvZ2ljICovCisgICAgICBpZiAoIWRlbXV4LT5ub19tb3JlX3BhZHMpIHsKKyAgICAgICAgZ3N0X2VsZW1lbnRfbm9fbW9yZV9wYWRzIChHU1RfRUxFTUVOVF9DQVNUIChkZW11eCkpOworICAgICAgICBkZW11eC0+bm9fbW9yZV9wYWRzID0gVFJVRTsKKyAgICAgIH0KKworICAgICAgaWYgKGRlbXV4LT5zZWdtZW50LmZsYWdzICYgR1NUX1NFR01FTlRfRkxBR19TRUdNRU5UKSB7CisgICAgICAgIGdpbnQ2NCBzdG9wOworCisgICAgICAgIC8qIGZvciBzZWdtZW50IHBsYXliYWNrIHdlIG5lZWQgdG8gcG9zdCB3aGVuIChpbiBzdHJlYW0gdGltZSkKKyAgICAgICAgICogd2Ugc3RvcHBlZCwgdGhpcyBpcyBlaXRoZXIgc3RvcCAod2hlbiBzZXQpIG9yIHRoZSBkdXJhdGlvbi4gKi8KKyAgICAgICAgaWYgKChzdG9wID0gZGVtdXgtPnNlZ21lbnQuc3RvcCkgPT0gLTEpCisgICAgICAgICAgc3RvcCA9IGRlbXV4LT5zZWdtZW50LmR1cmF0aW9uOworCisgICAgICAgIGlmIChkZW11eC0+c2VnbWVudC5yYXRlID49IDApIHsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJTZW5kaW5nIHNlZ21lbnQgZG9uZSwgYXQgZW5kIG9mIHNlZ21lbnQiKTsKKyAgICAgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSwKKyAgICAgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X3NlZ21lbnRfZG9uZSAoR1NUX09CSkVDVF9DQVNUIChkZW11eCksCisgICAgICAgICAgICAgICAgICBHU1RfRk9STUFUX1RJTUUsIHN0b3ApKTsKKyAgICAgICAgICBnc3RfZmx2X2RlbXV4X3B1c2hfc3JjX2V2ZW50IChkZW11eCwKKyAgICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19zZWdtZW50X2RvbmUgKEdTVF9GT1JNQVRfVElNRSwgc3RvcCkpOworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAvKiBSZXZlcnNlIHBsYXliYWNrICovCisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiU2VuZGluZyBzZWdtZW50IGRvbmUsIGF0IGJlZ2lubmluZyBvZiAiCisgICAgICAgICAgICAgICJzZWdtZW50Iik7CisgICAgICAgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChkZW11eCksCisgICAgICAgICAgICAgIGdzdF9tZXNzYWdlX25ld19zZWdtZW50X2RvbmUgKEdTVF9PQkpFQ1RfQ0FTVCAoZGVtdXgpLAorICAgICAgICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBkZW11eC0+c2VnbWVudC5zdGFydCkpOworICAgICAgICAgIGdzdF9mbHZfZGVtdXhfcHVzaF9zcmNfZXZlbnQgKGRlbXV4LAorICAgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X3NlZ21lbnRfZG9uZSAoR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICAgICAgICAgICAgZGVtdXgtPnNlZ21lbnQuc3RhcnQpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogbm9ybWFsIHBsYXliYWNrLCBzZW5kIEVPUyB0byBhbGwgbGlua2VkIHBhZHMgKi8KKyAgICAgICAgaWYgKCFkZW11eC0+bm9fbW9yZV9wYWRzKSB7CisgICAgICAgICAgZ3N0X2VsZW1lbnRfbm9fbW9yZV9wYWRzIChHU1RfRUxFTUVOVCAoZGVtdXgpKTsKKyAgICAgICAgICBkZW11eC0+bm9fbW9yZV9wYWRzID0gVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgIlNlbmRpbmcgRU9TLCBhdCBlbmQgb2Ygc3RyZWFtIik7CisgICAgICAgIGlmICghZGVtdXgtPmF1ZGlvX3BhZCAmJiAhZGVtdXgtPnZpZGVvX3BhZCkKKyAgICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgRkFJTEVELAorICAgICAgICAgICAgICAoIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIpLCAoIkdvdCBFT1MgYmVmb3JlIGFueSBkYXRhIikpOworICAgICAgICBlbHNlIGlmICghZ3N0X2Zsdl9kZW11eF9wdXNoX3NyY19ldmVudCAoZGVtdXgsIGdzdF9ldmVudF9uZXdfZW9zICgpKSkKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiZmFpbGVkIHB1c2hpbmcgRU9TIG9uIHN0cmVhbXMiKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHJldCA9PSBHU1RfRkxPV19OT1RfTElOS0VEIHx8IHJldCA8IEdTVF9GTE9XX0VPUykgeworICAgICAgR1NUX0VMRU1FTlRfRkxPV19FUlJPUiAoZGVtdXgsIHJldCk7CisgICAgICBnc3RfZmx2X2RlbXV4X3B1c2hfc3JjX2V2ZW50IChkZW11eCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworICAgIH0KKyAgICBnc3Rfb2JqZWN0X3VucmVmIChkZW11eCk7CisgICAgcmV0dXJuOworICB9Cit9CisKK3N0YXRpYyBndWludDY0Citnc3RfZmx2X2RlbXV4X2ZpbmRfb2Zmc2V0IChHc3RGbHZEZW11eCAqIGRlbXV4LCBHc3RTZWdtZW50ICogc2VnbWVudCwKKyAgICBHc3RTZWVrRmxhZ3Mgc2Vla19mbGFncykKK3sKKyAgZ2ludDY0IGJ5dGVzID0gMDsKKyAgZ2ludDY0IHRpbWUgPSAwOworICBHc3RJbmRleCAqaW5kZXg7CisgIEdzdEluZGV4RW50cnkgKmVudHJ5OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZWdtZW50ICE9IE5VTEwsIDApOworCisgIHRpbWUgPSBzZWdtZW50LT5wb3NpdGlvbjsKKworICBpbmRleCA9IGdzdF9mbHZfZGVtdXhfZ2V0X2luZGV4IChHU1RfRUxFTUVOVCAoZGVtdXgpKTsKKworICBpZiAoaW5kZXgpIHsKKyAgICAvKiBMZXQncyBjaGVjayBpZiB3ZSBoYXZlIGFuIGluZGV4IGVudHJ5IGZvciB0aGF0IHNlZWsgdGltZSAqLworICAgIGVudHJ5ID0gZ3N0X2luZGV4X2dldF9hc3NvY19lbnRyeSAoaW5kZXgsIGRlbXV4LT5pbmRleF9pZCwKKyAgICAgICAgc2Vla19mbGFncyAmIEdTVF9TRUVLX0ZMQUdfU05BUF9BRlRFUiA/CisgICAgICAgIEdTVF9JTkRFWF9MT09LVVBfQUZURVIgOiBHU1RfSU5ERVhfTE9PS1VQX0JFRk9SRSwKKyAgICAgICAgR1NUX0FTU09DSUFUSU9OX0ZMQUdfS0VZX1VOSVQsIEdTVF9GT1JNQVRfVElNRSwgdGltZSk7CisKKyAgICBpZiAoZW50cnkpIHsKKyAgICAgIGdzdF9pbmRleF9lbnRyeV9hc3NvY19tYXAgKGVudHJ5LCBHU1RfRk9STUFUX0JZVEVTLCAmYnl0ZXMpOworICAgICAgZ3N0X2luZGV4X2VudHJ5X2Fzc29jX21hcCAoZW50cnksIEdTVF9GT1JNQVRfVElNRSwgJnRpbWUpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImZvdW5kIGluZGV4IGVudHJ5IGZvciAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAiIGF0ICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBzZWVraW5nIHRvICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChzZWdtZW50LT5wb3NpdGlvbiksIEdTVF9USU1FX0FSR1MgKHRpbWUpLCBieXRlcyk7CisKKyAgICAgIC8qIEtleSBmcmFtZSBzZWVraW5nICovCisgICAgICBpZiAoc2Vla19mbGFncyAmIEdTVF9TRUVLX0ZMQUdfS0VZX1VOSVQpIHsKKyAgICAgICAgLyogQWRqdXN0IHRoZSBzZWdtZW50IHNvIHRoYXQgdGhlIGtleWZyYW1lIGZpdHMgaW4gKi8KKyAgICAgICAgc2VnbWVudC0+c3RhcnQgPSBzZWdtZW50LT50aW1lID0gdGltZTsKKyAgICAgICAgc2VnbWVudC0+cG9zaXRpb24gPSB0aW1lOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIm5vIGluZGV4IGVudHJ5IGZvdW5kIGZvciAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoc2VnbWVudC0+c3RhcnQpKTsKKyAgICB9CisKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChpbmRleCk7CisgIH0KKworICByZXR1cm4gYnl0ZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZmx2X2RlbXV4X2hhbmRsZV9zZWVrX3B1c2ggKEdzdEZsdkRlbXV4ICogZGVtdXgsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdEZvcm1hdCBmb3JtYXQ7CisgIEdzdFNlZWtGbGFncyBmbGFnczsKKyAgR3N0U2Vla1R5cGUgc3RhcnRfdHlwZSwgc3RvcF90eXBlOworICBnaW50NjQgc3RhcnQsIHN0b3A7CisgIGdkb3VibGUgcmF0ZTsKKyAgZ2Jvb2xlYW4gdXBkYXRlLCBmbHVzaCwgcmV0OworICBHc3RTZWdtZW50IHNlZWtzZWdtZW50OworCisgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgJnJhdGUsICZmb3JtYXQsICZmbGFncywKKyAgICAgICZzdGFydF90eXBlLCAmc3RhcnQsICZzdG9wX3R5cGUsICZzdG9wKTsKKworICBpZiAoZm9ybWF0ICE9IEdTVF9GT1JNQVRfVElNRSkKKyAgICBnb3RvIHdyb25nX2Zvcm1hdDsKKworICBmbHVzaCA9ICEgIShmbGFncyAmIEdTVF9TRUVLX0ZMQUdfRkxVU0gpOworCisgIC8qIFdvcmsgb24gYSBjb3B5IHVudGlsIHdlIGFyZSBzdXJlIHRoZSBzZWVrIHN1Y2NlZWRlZC4gKi8KKyAgbWVtY3B5ICgmc2Vla3NlZ21lbnQsICZkZW11eC0+c2VnbWVudCwgc2l6ZW9mIChHc3RTZWdtZW50KSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJzZWdtZW50IGJlZm9yZSBjb25maWd1cmUgJSIgR1NUX1NFR01FTlRfRk9STUFULAorICAgICAgJmRlbXV4LT5zZWdtZW50KTsKKworICAvKiBBcHBseSB0aGUgc2VlayB0byBvdXIgc2VnbWVudCAqLworICBnc3Rfc2VnbWVudF9kb19zZWVrICgmc2Vla3NlZ21lbnQsIHJhdGUsIGZvcm1hdCwgZmxhZ3MsCisgICAgICBzdGFydF90eXBlLCBzdGFydCwgc3RvcF90eXBlLCBzdG9wLCAmdXBkYXRlKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInNlZ21lbnQgY29uZmlndXJlZCAlIiBHU1RfU0VHTUVOVF9GT1JNQVQsCisgICAgICAmc2Vla3NlZ21lbnQpOworCisgIGlmIChmbHVzaCB8fCBzZWVrc2VnbWVudC5wb3NpdGlvbiAhPSBkZW11eC0+c2VnbWVudC5wb3NpdGlvbikgeworICAgIC8qIERvIHRoZSBhY3R1YWwgc2Vla2luZyAqLworICAgIGd1aW50NjQgb2Zmc2V0ID0gZ3N0X2Zsdl9kZW11eF9maW5kX29mZnNldCAoZGVtdXgsICZzZWVrc2VnbWVudCwgZmxhZ3MpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJnZW5lcmF0aW5nIGFuIHVwc3RyZWFtIHNlZWsgYXQgcG9zaXRpb24gJSIKKyAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgb2Zmc2V0KTsKKyAgICByZXQgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKGRlbXV4LT5zaW5rcGFkLAorICAgICAgICBnc3RfZXZlbnRfbmV3X3NlZWsgKHNlZWtzZWdtZW50LnJhdGUsIEdTVF9GT1JNQVRfQllURVMsCisgICAgICAgICAgICBmbGFncyB8IEdTVF9TRUVLX0ZMQUdfQUNDVVJBVEUsIEdTVF9TRUVLX1RZUEVfU0VULAorICAgICAgICAgICAgb2Zmc2V0LCBHU1RfU0VFS19UWVBFX05PTkUsIDApKTsKKyAgICBpZiAoR19VTkxJS0VMWSAoIXJldCkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJ1cHN0cmVhbSBzZWVrIGZhaWxlZCIpOworICAgIH0KKworICAgIGdzdF9mbG93X2NvbWJpbmVyX3Jlc2V0IChkZW11eC0+Zmxvd2NvbWJpbmVyKTsKKyAgICAvKiBUZWxsIGFsbCB0aGUgc3RyZWFtIHdlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHBvc2l0aW9uIChkaXNjb250KSAqLworICAgIGRlbXV4LT5hdWRpb19uZWVkX2Rpc2NvbnQgPSBUUlVFOworICAgIGRlbXV4LT52aWRlb19uZWVkX2Rpc2NvbnQgPSBUUlVFOworICB9IGVsc2UgeworICAgIHJldCA9IFRSVUU7CisgIH0KKworICBpZiAocmV0KSB7CisgICAgLyogT2sgc2VlayBzdWNjZWVkZWQsIHRha2UgdGhlIG5ld2x5IGNvbmZpZ3VyZWQgc2VnbWVudCAqLworICAgIG1lbWNweSAoJmRlbXV4LT5zZWdtZW50LCAmc2Vla3NlZ21lbnQsIHNpemVvZiAoR3N0U2VnbWVudCkpOworCisgICAgLyogVGVsbCBhbGwgdGhlIHN0cmVhbSBhIG5ldyBzZWdtZW50IGlzIG5lZWRlZCAqLworICAgIGRlbXV4LT5hdWRpb19uZWVkX3NlZ21lbnQgPSBUUlVFOworICAgIGRlbXV4LT52aWRlb19uZWVkX3NlZ21lbnQgPSBUUlVFOworICAgIC8qIENsZWFuIGFueSBwb3RlbnRpYWwgbmV3c2VnbWVudCBldmVudCBrZXB0IGZvciB0aGUgc3RyZWFtcy4gVGhlIGZpcnN0CisgICAgICogc3RyZWFtIG5lZWRpbmcgYSBuZXcgc2VnbWVudCB3aWxsIGNyZWF0ZSBhIG5ldyBvbmUuICovCisgICAgaWYgKEdfVU5MSUtFTFkgKGRlbXV4LT5uZXdfc2VnX2V2ZW50KSkgeworICAgICAgZ3N0X2V2ZW50X3VucmVmIChkZW11eC0+bmV3X3NlZ19ldmVudCk7CisgICAgICBkZW11eC0+bmV3X3NlZ19ldmVudCA9IE5VTEw7CisgICAgfQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAicHJlcGFyaW5nIG5ld3NlZ21lbnQgZnJvbSAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiB0byAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGRlbXV4LT5zZWdtZW50LnN0YXJ0KSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoZGVtdXgtPnNlZ21lbnQuc3RvcCkpOworICAgIGRlbXV4LT5uZXdfc2VnX2V2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmZGVtdXgtPnNlZ21lbnQpOworICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICB9IGVsc2UgeworICAgIHJldCA9IGdzdF9wYWRfcHVzaF9ldmVudCAoZGVtdXgtPnNpbmtwYWQsIGV2ZW50KTsKKyAgfQorCisgIHJldHVybiByZXQ7CisKKy8qIEVSUk9SUyAqLword3JvbmdfZm9ybWF0OgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIndlIG9ubHkgc3VwcG9ydCBzZWVraW5nIGluIFRJTUUgZm9ybWF0Iik7CisgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2Zsdl9kZW11eF9oYW5kbGVfc2Vla19wdXNoIChHc3RGbHZEZW11eCAqIGRlbXV4LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RGb3JtYXQgZm9ybWF0OworCisgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgTlVMTCwgJmZvcm1hdCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgaWYgKGZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAid2Ugb25seSBzdXBwb3J0IHNlZWtpbmcgaW4gVElNRSBmb3JtYXQiKTsKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBGaXJzdCB0cnkgdXBzdHJlYW0gKi8KKyAgaWYgKGdzdF9wYWRfcHVzaF9ldmVudCAoZGVtdXgtPnNpbmtwYWQsIGdzdF9ldmVudF9yZWYgKGV2ZW50KSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlVwc3RyZWFtIHN1Y2Nlc3NmdWxseSBzZWVrZWQiKTsKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGlmICghZGVtdXgtPmluZGV4ZWQpIHsKKyAgICBndWludDY0IHNlZWtfb2Zmc2V0ID0gMDsKKyAgICBnYm9vbGVhbiBidWlsZGluZ19pbmRleDsKKworICAgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICAgIC8qIGhhbmRsZSB0aGUgc2VlayBpbiB0aGUgY2hhaW4gZnVuY3Rpb24gKi8KKyAgICBkZW11eC0+c2Vla2luZyA9IFRSVUU7CisgICAgZGVtdXgtPnN0YXRlID0gRkxWX1NUQVRFX1NFRUs7CisKKyAgICAvKiBjb3B5IHRoZSBldmVudCAqLworICAgIGlmIChkZW11eC0+c2Vla19ldmVudCkKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZGVtdXgtPnNlZWtfZXZlbnQpOworICAgIGRlbXV4LT5zZWVrX2V2ZW50ID0gZ3N0X2V2ZW50X3JlZiAoZXZlbnQpOworCisgICAgLyogc2V0IHRoZSBidWlsZGluZ19pbmRleCBmbGFnIHNvIHRoYXQgb25seSBvbmUgdGhyZWFkIGNhbiBzZXR1cCB0aGUKKyAgICAgKiBzdHJ1Y3R1cmVzIGZvciBpbmRleCBzZWVraW5nLiAqLworICAgIGJ1aWxkaW5nX2luZGV4ID0gZGVtdXgtPmJ1aWxkaW5nX2luZGV4OworICAgIGlmICghYnVpbGRpbmdfaW5kZXgpIHsKKyAgICAgIGRlbXV4LT5idWlsZGluZ19pbmRleCA9IFRSVUU7CisgICAgICBpZiAoIWRlbXV4LT5maWxlX3NpemUKKyAgICAgICAgICAmJiAhZ3N0X3BhZF9wZWVyX3F1ZXJ5X2R1cmF0aW9uIChkZW11eC0+c2lua3BhZCwgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICAgICAgICAgICAgJmRlbXV4LT5maWxlX3NpemUpKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJGYWlsZWQgdG8gcXVlcnkgdXBzdHJlYW0gZmlsZSBzaXplIik7CisgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKworICAgICAgLyogd2UgaG9wZSB0aGUgbGFzdCB0YWcgaXMgYSBzY3JpcHRkYXRhb2JqZWN0IGNvbnRhaW5pbmcgYW4gaW5kZXgKKyAgICAgICAqIHRoZSBzaXplIG9mIHRoZSBsYXN0IHRhZyBpcyBnaXZlbiBpbiB0aGUgbGFzdCBndWludDMyIGJpdHMKKyAgICAgICAqIHRoZW4gd2Ugc2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0YWcsIHBhcnNlIGl0IGFuZCBob3BlZnVsbHkgb2J0YWluIGFuIGluZGV4ICovCisgICAgICBzZWVrX29mZnNldCA9IGRlbXV4LT5maWxlX3NpemUgLSBzaXplb2YgKGd1aW50MzIpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgIkZpbGUgc2l6ZSBvYnRhaW5lZCwgc2Vla2luZyB0byAlIiBHX0dVSU5UNjRfRk9STUFULCBzZWVrX29mZnNldCk7CisgICAgfQorICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisKKyAgICBpZiAoIWJ1aWxkaW5nX2luZGV4KSB7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGRlbXV4LCAiU2Vla2luZyB0byBsYXN0IDQgYnl0ZXMgYXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICBzZWVrX29mZnNldCk7CisgICAgICByZXR1cm4gZmx2X2RlbXV4X3NlZWtfdG9fb2Zmc2V0IChkZW11eCwgc2Vla19vZmZzZXQpOworICAgIH0KKworICAgIC8qIEZJWE1FOiB3ZSBoYXZlIHRvIGFsd2F5cyByZXR1cm4gdHJ1ZSBzbyB0aGF0IHdlIGRvbid0IGJsb2NrIHRoZSBzZWVrCisgICAgICogdGhyZWFkLgorICAgICAqIE5vdGU6IG1heWJlIGl0IGlzIE9LIHRvIHJldHVybiB0cnVlIGlmIHdlJ3JlIHN0aWxsIGJ1aWxkaW5nIHRoZSBpbmRleCAqLworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgcmV0dXJuIGZsdl9kZW11eF9oYW5kbGVfc2Vla19wdXNoIChkZW11eCwgZXZlbnQpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbHZfZGVtdXhfaGFuZGxlX3NlZWtfcHVsbCAoR3N0Rmx2RGVtdXggKiBkZW11eCwgR3N0RXZlbnQgKiBldmVudCwKKyAgICBnYm9vbGVhbiBzZWVraW5nKQoreworICBHc3RGb3JtYXQgZm9ybWF0OworICBHc3RTZWVrRmxhZ3MgZmxhZ3M7CisgIEdzdFNlZWtUeXBlIHN0YXJ0X3R5cGUsIHN0b3BfdHlwZTsKKyAgZ2ludDY0IHN0YXJ0LCBzdG9wOworICBnZG91YmxlIHJhdGU7CisgIGdib29sZWFuIHVwZGF0ZSwgZmx1c2gsIHJldCA9IEZBTFNFOworICBHc3RTZWdtZW50IHNlZWtzZWdtZW50OworCisgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgJnJhdGUsICZmb3JtYXQsICZmbGFncywKKyAgICAgICZzdGFydF90eXBlLCAmc3RhcnQsICZzdG9wX3R5cGUsICZzdG9wKTsKKworICBpZiAoZm9ybWF0ICE9IEdTVF9GT1JNQVRfVElNRSkKKyAgICBnb3RvIHdyb25nX2Zvcm1hdDsKKworICAvKiBtYXJrIHNlZWtpbmcgdGhyZWFkIGVudGVyaW5nIGZsdXNoaW5nL3BhdXNpbmcgKi8KKyAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgIGlmIChzZWVraW5nKQorICAgIGRlbXV4LT5zZWVraW5nID0gc2Vla2luZzsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKworICBmbHVzaCA9ICEgIShmbGFncyAmIEdTVF9TRUVLX0ZMQUdfRkxVU0gpOworCisgIGlmIChmbHVzaCkgeworICAgIC8qIEZsdXNoIHN0YXJ0IHVwIGFuZCBkb3duc3RyZWFtIHRvIG1ha2Ugc3VyZSBkYXRhIGZsb3cgYW5kIGxvb3BzIGFyZQorICAgICAgIGlkbGUgKi8KKyAgICBnc3RfZmx2X2RlbXV4X3B1c2hfc3JjX2V2ZW50IChkZW11eCwgZ3N0X2V2ZW50X25ld19mbHVzaF9zdGFydCAoKSk7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChkZW11eC0+c2lua3BhZCwgZ3N0X2V2ZW50X25ld19mbHVzaF9zdGFydCAoKSk7CisgIH0gZWxzZSB7CisgICAgLyogUGF1c2UgdGhlIHB1bGxpbmcgdGFzayAqLworICAgIGdzdF9wYWRfcGF1c2VfdGFzayAoZGVtdXgtPnNpbmtwYWQpOworICB9CisKKyAgLyogVGFrZSB0aGUgc3RyZWFtIGxvY2sgKi8KKyAgR1NUX1BBRF9TVFJFQU1fTE9DSyAoZGVtdXgtPnNpbmtwYWQpOworCisgIGlmIChmbHVzaCkgeworICAgIC8qIFN0b3AgZmx1c2hpbmcgdXBzdHJlYW0gd2UgbmVlZCB0byBwdWxsICovCisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChkZW11eC0+c2lua3BhZCwgZ3N0X2V2ZW50X25ld19mbHVzaF9zdG9wIChUUlVFKSk7CisgIH0KKworICAvKiBXb3JrIG9uIGEgY29weSB1bnRpbCB3ZSBhcmUgc3VyZSB0aGUgc2VlayBzdWNjZWVkZWQuICovCisgIG1lbWNweSAoJnNlZWtzZWdtZW50LCAmZGVtdXgtPnNlZ21lbnQsIHNpemVvZiAoR3N0U2VnbWVudCkpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAic2VnbWVudCBiZWZvcmUgY29uZmlndXJlICUiIEdTVF9TRUdNRU5UX0ZPUk1BVCwKKyAgICAgICZkZW11eC0+c2VnbWVudCk7CisKKyAgLyogQXBwbHkgdGhlIHNlZWsgdG8gb3VyIHNlZ21lbnQgKi8KKyAgZ3N0X3NlZ21lbnRfZG9fc2VlayAoJnNlZWtzZWdtZW50LCByYXRlLCBmb3JtYXQsIGZsYWdzLAorICAgICAgc3RhcnRfdHlwZSwgc3RhcnQsIHN0b3BfdHlwZSwgc3RvcCwgJnVwZGF0ZSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJzZWdtZW50IGNvbmZpZ3VyZWQgJSIgR1NUX1NFR01FTlRfRk9STUFULAorICAgICAgJnNlZWtzZWdtZW50KTsKKworICBpZiAoZmx1c2ggfHwgc2Vla3NlZ21lbnQucG9zaXRpb24gIT0gZGVtdXgtPnNlZ21lbnQucG9zaXRpb24pIHsKKyAgICAvKiBEbyB0aGUgYWN0dWFsIHNlZWtpbmcgKi8KKyAgICAvKiBpbmRleCBpcyByZWxpYWJsZSBpZiBpdCBpcyBjb21wbGV0ZSBvciB3ZSBkbyBub3QgZ28gdG8gZmFyIGFoZWFkICovCisgICAgaWYgKHNlZWtpbmcgJiYgIWRlbXV4LT5pbmRleGVkICYmCisgICAgICAgIHNlZWtzZWdtZW50LnBvc2l0aW9uID4gZGVtdXgtPmluZGV4X21heF90aW1lICsgMTAgKiBHU1RfU0VDT05EKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImRlbGF5aW5nIHNlZWsgdG8gcG9zdC1zY2FuOyAiCisgICAgICAgICAgIiBpbmRleCBvbmx5IHVwIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+aW5kZXhfbWF4X3RpbWUpKTsKKyAgICAgIC8qIHN0b3AgZmx1c2hpbmcgZm9yIG5vdyAqLworICAgICAgaWYgKGZsdXNoKQorICAgICAgICBnc3RfZmx2X2RlbXV4X3B1c2hfc3JjX2V2ZW50IChkZW11eCwgZ3N0X2V2ZW50X25ld19mbHVzaF9zdG9wIChUUlVFKSk7CisgICAgICAvKiBkZWxlZ2F0ZSBzY2FubmluZyBhbmQgaW5kZXggYnVpbGRpbmcgdG8gdGFzayB0aHJlYWQgdG8gYXZvaWQKKyAgICAgICAqIG9jY3VweWluZyBtYWluIChVSSkgbG9vcCAqLworICAgICAgaWYgKGRlbXV4LT5zZWVrX2V2ZW50KQorICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGRlbXV4LT5zZWVrX2V2ZW50KTsKKyAgICAgIGRlbXV4LT5zZWVrX2V2ZW50ID0gZ3N0X2V2ZW50X3JlZiAoZXZlbnQpOworICAgICAgZGVtdXgtPnNlZWtfdGltZSA9IHNlZWtzZWdtZW50LnBvc2l0aW9uOworICAgICAgZGVtdXgtPnN0YXRlID0gRkxWX1NUQVRFX1NFRUs7CisgICAgICAvKiBkbyBub3Qga25vdyBhYm91dCBzdWNjZXMgeWV0LCBidXQgd2UgZGlkIGNhcmUgYW5kIGhhbmRsZWQgaXQgKi8KKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgLyogbm93IGluZGV4IHNob3VsZCBiZSBhcyByZWxpYWJsZSBhcyBpdCBjYW4gYmUgZm9yIGN1cnJlbnQgcHVycG9zZSAqLworICAgIGdzdF9mbHZfZGVtdXhfbW92ZV90b19vZmZzZXQgKGRlbXV4LAorICAgICAgICBnc3RfZmx2X2RlbXV4X2ZpbmRfb2Zmc2V0IChkZW11eCwgJnNlZWtzZWdtZW50LCBmbGFncyksIFRSVUUpOworICAgIHJldCA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gVFJVRTsKKyAgfQorCisgIGlmIChmbHVzaCkgeworICAgIC8qIFN0b3AgZmx1c2hpbmcsIHRoZSBzaW5rcyBhcmUgYXQgdGltZSAwIG5vdyAqLworICAgIGdzdF9mbHZfZGVtdXhfcHVzaF9zcmNfZXZlbnQgKGRlbXV4LCBnc3RfZXZlbnRfbmV3X2ZsdXNoX3N0b3AgKFRSVUUpKTsKKyAgfQorCisgIGlmIChyZXQpIHsKKyAgICAvKiBPayBzZWVrIHN1Y2NlZWRlZCwgdGFrZSB0aGUgbmV3bHkgY29uZmlndXJlZCBzZWdtZW50ICovCisgICAgbWVtY3B5ICgmZGVtdXgtPnNlZ21lbnQsICZzZWVrc2VnbWVudCwgc2l6ZW9mIChHc3RTZWdtZW50KSk7CisKKyAgICAvKiBOb3RpZnkgYWJvdXQgdGhlIHN0YXJ0IG9mIGEgbmV3IHNlZ21lbnQgKi8KKyAgICBpZiAoZGVtdXgtPnNlZ21lbnQuZmxhZ3MgJiBHU1RfU0VHTUVOVF9GTEFHX1NFR01FTlQpIHsKKyAgICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKGRlbXV4KSwKKyAgICAgICAgICBnc3RfbWVzc2FnZV9uZXdfc2VnbWVudF9zdGFydCAoR1NUX09CSkVDVCAoZGVtdXgpLAorICAgICAgICAgICAgICBkZW11eC0+c2VnbWVudC5mb3JtYXQsIGRlbXV4LT5zZWdtZW50LnBvc2l0aW9uKSk7CisgICAgfQorCisgICAgZ3N0X2Zsb3dfY29tYmluZXJfcmVzZXQgKGRlbXV4LT5mbG93Y29tYmluZXIpOworICAgIC8qIFRlbGwgYWxsIHRoZSBzdHJlYW0gYSBuZXcgc2VnbWVudCBpcyBuZWVkZWQgKi8KKyAgICBkZW11eC0+YXVkaW9fbmVlZF9zZWdtZW50ID0gVFJVRTsKKyAgICBkZW11eC0+dmlkZW9fbmVlZF9zZWdtZW50ID0gVFJVRTsKKyAgICAvKiBDbGVhbiBhbnkgcG90ZW50aWFsIG5ld3NlZ21lbnQgZXZlbnQga2VwdCBmb3IgdGhlIHN0cmVhbXMuIFRoZSBmaXJzdAorICAgICAqIHN0cmVhbSBuZWVkaW5nIGEgbmV3IHNlZ21lbnQgd2lsbCBjcmVhdGUgYSBuZXcgb25lLiAqLworICAgIGlmIChHX1VOTElLRUxZIChkZW11eC0+bmV3X3NlZ19ldmVudCkpIHsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZGVtdXgtPm5ld19zZWdfZXZlbnQpOworICAgICAgZGVtdXgtPm5ld19zZWdfZXZlbnQgPSBOVUxMOworICAgIH0KKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInByZXBhcmluZyBuZXdzZWdtZW50IGZyb20gJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFUICIgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+c2VnbWVudC5zdGFydCksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGRlbXV4LT5zZWdtZW50LnN0b3ApKTsKKyAgICBkZW11eC0+bmV3X3NlZ19ldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJmRlbXV4LT5zZWdtZW50KTsKKyAgfQorCitleGl0OgorICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgc2Vla2luZyA9IGRlbXV4LT5zZWVraW5nICYmICFzZWVraW5nOworICBkZW11eC0+c2Vla2luZyA9IEZBTFNFOworICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworCisgIC8qIGlmIHdlIGRldGVjdCBhbiBleHRlcm5hbCBzZWVrIGhhdmluZyBzdGFydGVkIChhbmQgcG9zc2libHkgYWxyZWFkeSBoYXZpbmcKKyAgICogZmx1c2hlZCksIGRvIG5vdCByZXN0YXJ0IHRhc2sgdG8gZ2l2ZSBpdCBhIGNoYW5jZS4KKyAgICogT3RoZXJ3aXNlIGV4dGVybmFsIG9uZSdzIGZsdXNoaW5nIHdpbGwgdGFrZSBjYXJlIHRvIHBhdXNlIHRhc2sgKi8KKyAgaWYgKHNlZWtpbmcpIHsKKyAgICBnc3RfcGFkX3BhdXNlX3Rhc2sgKGRlbXV4LT5zaW5rcGFkKTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfcGFkX3N0YXJ0X3Rhc2sgKGRlbXV4LT5zaW5rcGFkLAorICAgICAgICAoR3N0VGFza0Z1bmN0aW9uKSBnc3RfZmx2X2RlbXV4X2xvb3AsIGRlbXV4LT5zaW5rcGFkLCBOVUxMKTsKKyAgfQorCisgIEdTVF9QQURfU1RSRUFNX1VOTE9DSyAoZGVtdXgtPnNpbmtwYWQpOworCisgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLword3JvbmdfZm9ybWF0OgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIndlIG9ubHkgc3VwcG9ydCBzZWVraW5nIGluIFRJTUUgZm9ybWF0Iik7CisgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorfQorCisvKiBJZiB3ZSBjYW4gcHVsbCB0aGF0J3MgcHJlZmVyZWQgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2Zsdl9kZW11eF9zaW5rX2FjdGl2YXRlIChHc3RQYWQgKiBzaW5rcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQpCit7CisgIEdzdFF1ZXJ5ICpxdWVyeTsKKyAgZ2Jvb2xlYW4gcHVsbF9tb2RlOworCisgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19zY2hlZHVsaW5nICgpOworCisgIGlmICghZ3N0X3BhZF9wZWVyX3F1ZXJ5IChzaW5rcGFkLCBxdWVyeSkpIHsKKyAgICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKyAgICBnb3RvIGFjdGl2YXRlX3B1c2g7CisgIH0KKworICBwdWxsX21vZGUgPSBnc3RfcXVlcnlfaGFzX3NjaGVkdWxpbmdfbW9kZV93aXRoX2ZsYWdzIChxdWVyeSwKKyAgICAgIEdTVF9QQURfTU9ERV9QVUxMLCBHU1RfU0NIRURVTElOR19GTEFHX1NFRUtBQkxFKTsKKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisKKyAgaWYgKCFwdWxsX21vZGUpCisgICAgZ290byBhY3RpdmF0ZV9wdXNoOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmtwYWQsICJhY3RpdmF0aW5nIHB1bGwiKTsKKyAgcmV0dXJuIGdzdF9wYWRfYWN0aXZhdGVfbW9kZSAoc2lua3BhZCwgR1NUX1BBRF9NT0RFX1BVTEwsIFRSVUUpOworCithY3RpdmF0ZV9wdXNoOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2lua3BhZCwgImFjdGl2YXRpbmcgcHVzaCIpOworICAgIHJldHVybiBnc3RfcGFkX2FjdGl2YXRlX21vZGUgKHNpbmtwYWQsIEdTVF9QQURfTU9ERV9QVVNILCBUUlVFKTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbHZfZGVtdXhfc2lua19hY3RpdmF0ZV9tb2RlIChHc3RQYWQgKiBzaW5rcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0UGFkTW9kZSBtb2RlLCBnYm9vbGVhbiBhY3RpdmUpCit7CisgIGdib29sZWFuIHJlczsKKyAgR3N0Rmx2RGVtdXggKmRlbXV4OworCisgIGRlbXV4ID0gR1NUX0ZMVl9ERU1VWCAocGFyZW50KTsKKworICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIEdTVF9QQURfTU9ERV9QVVNIOgorICAgICAgZGVtdXgtPnJhbmRvbV9hY2Nlc3MgPSBGQUxTRTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9QQURfTU9ERV9QVUxMOgorICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICBkZW11eC0+cmFuZG9tX2FjY2VzcyA9IFRSVUU7CisgICAgICAgIHJlcyA9IGdzdF9wYWRfc3RhcnRfdGFzayAoc2lua3BhZCwgKEdzdFRhc2tGdW5jdGlvbikgZ3N0X2Zsdl9kZW11eF9sb29wLAorICAgICAgICAgICAgc2lua3BhZCwgTlVMTCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkZW11eC0+cmFuZG9tX2FjY2VzcyA9IEZBTFNFOworICAgICAgICByZXMgPSBnc3RfcGFkX3N0b3BfdGFzayAoc2lua3BhZCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbHZfZGVtdXhfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdEZsdkRlbXV4ICpkZW11eDsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgZGVtdXggPSBHU1RfRkxWX0RFTVVYIChwYXJlbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiaGFuZGxpbmcgZXZlbnQgJXMiLCBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUQVJUOgorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJ0cnlpbmcgdG8gZm9yY2UgY2hhaW4gZnVuY3Rpb24gdG8gZXhpdCIpOworICAgICAgZGVtdXgtPmZsdXNoaW5nID0gVFJVRTsKKyAgICAgIHJldCA9IGdzdF9mbHZfZGVtdXhfcHVzaF9zcmNfZXZlbnQgKGRlbXV4LCBldmVudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJmbHVzaGluZyBGTFYgZGVtdXhlciIpOworICAgICAgZ3N0X2Zsdl9kZW11eF9mbHVzaCAoZGVtdXgsIFRSVUUpOworICAgICAgcmV0ID0gZ3N0X2Zsdl9kZW11eF9wdXNoX3NyY19ldmVudCAoZGVtdXgsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICB7CisgICAgICBHc3RJbmRleCAqaW5kZXg7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAicmVjZWl2ZWQgRU9TIik7CisKKyAgICAgIGluZGV4ID0gZ3N0X2Zsdl9kZW11eF9nZXRfaW5kZXggKEdTVF9FTEVNRU5UIChkZW11eCkpOworCisgICAgICBpZiAoaW5kZXgpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJjb21taXR0aW5nIGluZGV4Iik7CisgICAgICAgIGdzdF9pbmRleF9jb21taXQgKGluZGV4LCBkZW11eC0+aW5kZXhfaWQpOworICAgICAgICBnc3Rfb2JqZWN0X3VucmVmIChpbmRleCk7CisgICAgICB9CisKKyAgICAgIGlmICghZGVtdXgtPmF1ZGlvX3BhZCAmJiAhZGVtdXgtPnZpZGVvX3BhZCkgeworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgRkFJTEVELAorICAgICAgICAgICAgKCJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iKSwgKCJHb3QgRU9TIGJlZm9yZSBhbnkgZGF0YSIpKTsKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWRlbXV4LT5ub19tb3JlX3BhZHMpIHsKKyAgICAgICAgICBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgKEdTVF9FTEVNRU5UIChkZW11eCkpOworICAgICAgICAgIGRlbXV4LT5ub19tb3JlX3BhZHMgPSBUUlVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFnc3RfZmx2X2RlbXV4X3B1c2hfc3JjX2V2ZW50IChkZW11eCwgZXZlbnQpKQorICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJmYWlsZWQgcHVzaGluZyBFT1Mgb24gc3RyZWFtcyIpOworICAgICAgfQorICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgIHsKKyAgICAgIEdzdFNlZ21lbnQgaW5fc2VnbWVudDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJyZWNlaXZlZCBuZXcgc2VnbWVudCIpOworCisgICAgICBnc3RfZXZlbnRfY29weV9zZWdtZW50IChldmVudCwgJmluX3NlZ21lbnQpOworCisgICAgICBpZiAoaW5fc2VnbWVudC5mb3JtYXQgPT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICAgIC8qIHRpbWUgc2VnbWVudCwgdGhpcyBpcyBwZXJmZWN0LCBjb3B5IG92ZXIgdGhlIHZhbHVlcy4gKi8KKyAgICAgICAgbWVtY3B5ICgmZGVtdXgtPnNlZ21lbnQsICZpbl9zZWdtZW50LCBzaXplb2YgKGluX3NlZ21lbnQpKTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIk5FV1NFR01FTlQ6ICUiIEdTVF9TRUdNRU5UX0ZPUk1BVCwKKyAgICAgICAgICAgICZkZW11eC0+c2VnbWVudCk7CisKKyAgICAgICAgLyogYW5kIGZvcndhcmQgKi8KKyAgICAgICAgcmV0ID0gZ3N0X2Zsdl9kZW11eF9wdXNoX3NyY19ldmVudCAoZGVtdXgsIGV2ZW50KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIG5vbi10aW1lIGZvcm1hdCAqLworICAgICAgICBkZW11eC0+YXVkaW9fbmVlZF9zZWdtZW50ID0gVFJVRTsKKyAgICAgICAgZGVtdXgtPnZpZGVvX25lZWRfc2VnbWVudCA9IFRSVUU7CisgICAgICAgIHJldCA9IFRSVUU7CisgICAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgICBpZiAoZGVtdXgtPm5ld19zZWdfZXZlbnQpIHsKKyAgICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGRlbXV4LT5uZXdfc2VnX2V2ZW50KTsKKyAgICAgICAgICBkZW11eC0+bmV3X3NlZ19ldmVudCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdzdF9mbG93X2NvbWJpbmVyX3Jlc2V0IChkZW11eC0+Zmxvd2NvbWJpbmVyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbHZfZGVtdXhfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0Rmx2RGVtdXggKmRlbXV4OworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBkZW11eCA9IEdTVF9GTFZfREVNVVggKHBhcmVudCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJoYW5kbGluZyBldmVudCAlcyIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICAgIC8qIFRyeSB0byBwdXNoIHVwc3RyZWFtIGZpcnN0ICovCisgICAgICBnc3RfZXZlbnRfcmVmIChldmVudCk7CisgICAgICByZXQgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKGRlbXV4LT5zaW5rcGFkLCBldmVudCk7CisgICAgICBpZiAocmV0KSB7CisgICAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChkZW11eC0+cmFuZG9tX2FjY2VzcykgeworICAgICAgICByZXQgPSBnc3RfZmx2X2RlbXV4X2hhbmRsZV9zZWVrX3B1bGwgKGRlbXV4LCBldmVudCwgVFJVRSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBnc3RfZmx2X2RlbXV4X2hhbmRsZV9zZWVrX3B1c2ggKGRlbXV4LCBldmVudCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChkZW11eC0+c2lua3BhZCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbHZfZGVtdXhfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnYm9vbGVhbiByZXMgPSBUUlVFOworICBHc3RGbHZEZW11eCAqZGVtdXg7CisKKyAgZGVtdXggPSBHU1RfRkxWX0RFTVVYIChwYXJlbnQpOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0RVUkFUSU9OOgorICAgIHsKKyAgICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9kdXJhdGlvbiAocXVlcnksICZmb3JtYXQsIE5VTEwpOworCisgICAgICAvKiBkdXJhdGlvbiBpcyB0aW1lIG9ubHkgKi8KKyAgICAgIGlmIChmb3JtYXQgIT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZHVyYXRpb24gcXVlcnkgb25seSBzdXBwb3J0ZWQgZm9yIHRpbWUgIgorICAgICAgICAgICAgImZvcm1hdCIpOworICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgZ290byBiZWFjaDsKKyAgICAgIH0KKworICAgICAgLyogVHJ5IHRvIHB1c2ggdXBzdHJlYW0gZmlyc3QgKi8KKyAgICAgIHJlcyA9IGdzdF9wYWRfcGVlcl9xdWVyeSAoZGVtdXgtPnNpbmtwYWQsIHF1ZXJ5KTsKKyAgICAgIGlmIChyZXMpCisgICAgICAgIGdvdG8gYmVhY2g7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgImR1cmF0aW9uIHF1ZXJ5LCByZXBseWluZyAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZGVtdXgtPmR1cmF0aW9uKSk7CisKKyAgICAgIGdzdF9xdWVyeV9zZXRfZHVyYXRpb24gKHF1ZXJ5LCBHU1RfRk9STUFUX1RJTUUsIGRlbXV4LT5kdXJhdGlvbik7CisgICAgICByZXMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX1BPU0lUSU9OOgorICAgIHsKKyAgICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9wb3NpdGlvbiAocXVlcnksICZmb3JtYXQsIE5VTEwpOworCisgICAgICAvKiBwb3NpdGlvbiBpcyB0aW1lIG9ubHkgKi8KKyAgICAgIGlmIChmb3JtYXQgIT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAicG9zaXRpb24gcXVlcnkgb25seSBzdXBwb3J0ZWQgZm9yIHRpbWUgIgorICAgICAgICAgICAgImZvcm1hdCIpOworICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgZ290byBiZWFjaDsKKyAgICAgIH0KKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAicG9zaXRpb24gcXVlcnksIHJlcGx5aW5nICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+c2VnbWVudC5wb3NpdGlvbikpOworCisgICAgICBnc3RfcXVlcnlfc2V0X3Bvc2l0aW9uIChxdWVyeSwgR1NUX0ZPUk1BVF9USU1FLCBkZW11eC0+c2VnbWVudC5wb3NpdGlvbik7CisKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR1NUX1FVRVJZX1NFRUtJTkc6eworICAgICAgR3N0Rm9ybWF0IGZtdDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3NlZWtpbmcgKHF1ZXJ5LCAmZm10LCBOVUxMLCBOVUxMLCBOVUxMKTsKKworICAgICAgLyogRmlyc3QgYXNrIHVwc3RyZWFtICovCisgICAgICBpZiAoZm10ID09IEdTVF9GT1JNQVRfVElNRSAmJiBnc3RfcGFkX3BlZXJfcXVlcnkgKGRlbXV4LT5zaW5rcGFkLCBxdWVyeSkpIHsKKyAgICAgICAgZ2Jvb2xlYW4gc2Vla2FibGU7CisKKyAgICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3NlZWtpbmcgKHF1ZXJ5LCBOVUxMLCAmc2Vla2FibGUsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoc2Vla2FibGUpIHsKKyAgICAgICAgICByZXMgPSBUUlVFOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXMgPSBUUlVFOworICAgICAgLyogRklYTUUsIGNoZWNrIGluZGV4IHRoaXMgd2F5IGlzIG5vdCB0aHJlYWQgc2FmZSAqLworICAgICAgaWYgKGZtdCAhPSBHU1RfRk9STUFUX1RJTUUgfHwgIWRlbXV4LT5pbmRleCkgeworICAgICAgICBnc3RfcXVlcnlfc2V0X3NlZWtpbmcgKHF1ZXJ5LCBmbXQsIEZBTFNFLCAtMSwgLTEpOworICAgICAgfSBlbHNlIGlmIChkZW11eC0+cmFuZG9tX2FjY2VzcykgeworICAgICAgICBnc3RfcXVlcnlfc2V0X3NlZWtpbmcgKHF1ZXJ5LCBHU1RfRk9STUFUX1RJTUUsIFRSVUUsIDAsCisgICAgICAgICAgICBkZW11eC0+ZHVyYXRpb24pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR3N0UXVlcnkgKnBlZXJxdWVyeSA9IGdzdF9xdWVyeV9uZXdfc2Vla2luZyAoR1NUX0ZPUk1BVF9CWVRFUyk7CisgICAgICAgIGdib29sZWFuIHNlZWthYmxlID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5IChkZW11eC0+c2lua3BhZCwgcGVlcnF1ZXJ5KTsKKworICAgICAgICBpZiAoc2Vla2FibGUpCisgICAgICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3NlZWtpbmcgKHBlZXJxdWVyeSwgTlVMTCwgJnNlZWthYmxlLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgZ3N0X3F1ZXJ5X3VucmVmIChwZWVycXVlcnkpOworCisgICAgICAgIGlmIChzZWVrYWJsZSkKKyAgICAgICAgICBnc3RfcXVlcnlfc2V0X3NlZWtpbmcgKHF1ZXJ5LCBHU1RfRk9STUFUX1RJTUUsIHNlZWthYmxlLCAwLAorICAgICAgICAgICAgICBkZW11eC0+ZHVyYXRpb24pOworICAgICAgICBlbHNlCisgICAgICAgICAgZ3N0X3F1ZXJ5X3NldF9zZWVraW5nIChxdWVyeSwgR1NUX0ZPUk1BVF9USU1FLCBGQUxTRSwgLTEsIC0xKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9TRUdNRU5UOgorICAgIHsKKyAgICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisgICAgICBnaW50NjQgc3RhcnQsIHN0b3A7CisKKyAgICAgIGZvcm1hdCA9IGRlbXV4LT5zZWdtZW50LmZvcm1hdDsKKworICAgICAgc3RhcnQgPQorICAgICAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmZGVtdXgtPnNlZ21lbnQsIGZvcm1hdCwKKyAgICAgICAgICBkZW11eC0+c2VnbWVudC5zdGFydCk7CisgICAgICBpZiAoKHN0b3AgPSBkZW11eC0+c2VnbWVudC5zdG9wKSA9PSAtMSkKKyAgICAgICAgc3RvcCA9IGRlbXV4LT5zZWdtZW50LmR1cmF0aW9uOworICAgICAgZWxzZQorICAgICAgICBzdG9wID0gZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZkZW11eC0+c2VnbWVudCwgZm9ybWF0LCBzdG9wKTsKKworICAgICAgZ3N0X3F1ZXJ5X3NldF9zZWdtZW50IChxdWVyeSwgZGVtdXgtPnNlZ21lbnQucmF0ZSwgZm9ybWF0LCBzdGFydCwgc3RvcCk7CisgICAgICByZXMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX0xBVEVOQ1k6CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisKK2JlYWNoOgorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2Zsdl9kZW11eF9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RGbHZEZW11eCAqZGVtdXg7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBkZW11eCA9IEdTVF9GTFZfREVNVVggKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICAvKiBJZiB0aGlzIGlzIG91ciBvd24gaW5kZXggZGVzdHJveSBpdCBhcyB0aGUKKyAgICAgICAqIG9sZCBlbnRyaWVzIG1pZ2h0IGJlIHdyb25nIGZvciB0aGUgbmV3IHN0cmVhbSAqLworICAgICAgaWYgKGRlbXV4LT5vd25faW5kZXgpIHsKKyAgICAgICAgZ3N0X29iamVjdF91bnJlZiAoZGVtdXgtPmluZGV4KTsKKyAgICAgICAgZGVtdXgtPmluZGV4ID0gTlVMTDsKKyAgICAgICAgZGVtdXgtPm93bl9pbmRleCA9IEZBTFNFOworICAgICAgfQorCisgICAgICAvKiBJZiBubyBpbmRleCB3YXMgY3JlYXRlZCwgZ2VuZXJhdGUgb25lICovCisgICAgICBpZiAoR19VTkxJS0VMWSAoIWRlbXV4LT5pbmRleCkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJubyBpbmRleCBwcm92aWRlZCBjcmVhdGluZyBvdXIgb3duIik7CisKKyAgICAgICAgZGVtdXgtPmluZGV4ID0gZ19vYmplY3RfbmV3IChnc3RfbWVtX2luZGV4X2dldF90eXBlICgpLCBOVUxMKTsKKworICAgICAgICBnc3RfaW5kZXhfZ2V0X3dyaXRlcl9pZCAoZGVtdXgtPmluZGV4LCBHU1RfT0JKRUNUIChkZW11eCksCisgICAgICAgICAgICAmZGVtdXgtPmluZGV4X2lkKTsKKyAgICAgICAgZGVtdXgtPm93bl9pbmRleCA9IFRSVUU7CisgICAgICB9CisgICAgICBnc3RfZmx2X2RlbXV4X2NsZWFudXAgKGRlbXV4KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkKKyAgICByZXR1cm4gcmV0OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3RfZmx2X2RlbXV4X2NsZWFudXAgKGRlbXV4KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAorZ3N0X2Zsdl9kZW11eF9zZXRfaW5kZXggKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RJbmRleCAqIGluZGV4KQoreworICBHc3RGbHZEZW11eCAqZGVtdXggPSBHU1RfRkxWX0RFTVVYIChlbGVtZW50KTsKKyAgR3N0SW5kZXggKm9sZF9pbmRleDsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKworICBvbGRfaW5kZXggPSBkZW11eC0+aW5kZXg7CisKKyAgaWYgKGluZGV4KSB7CisgICAgZGVtdXgtPmluZGV4ID0gZ3N0X29iamVjdF9yZWYgKGluZGV4KTsKKyAgICBkZW11eC0+b3duX2luZGV4ID0gRkFMU0U7CisgIH0gZWxzZQorICAgIGRlbXV4LT5pbmRleCA9IE5VTEw7CisKKyAgaWYgKG9sZF9pbmRleCkKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChkZW11eC0+aW5kZXgpOworCisgIGdzdF9vYmplY3RfcmVmIChpbmRleCk7CisKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKworICAvKiBvYmplY3QgbG9jayBtaWdodCBiZSB0YWtlbiBhZ2FpbiAqLworICBpZiAoaW5kZXgpCisgICAgZ3N0X2luZGV4X2dldF93cml0ZXJfaWQgKGluZGV4LCBHU1RfT0JKRUNUIChlbGVtZW50KSwgJmRlbXV4LT5pbmRleF9pZCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJTZXQgaW5kZXggJSIgR1NUX1BUUl9GT1JNQVQsIGRlbXV4LT5pbmRleCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoaW5kZXgpOworfQorI2VuZGlmCisKK3N0YXRpYyBHc3RJbmRleCAqCitnc3RfZmx2X2RlbXV4X2dldF9pbmRleCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdEluZGV4ICpyZXN1bHQgPSBOVUxMOworCisgIEdzdEZsdkRlbXV4ICpkZW11eCA9IEdTVF9GTFZfREVNVVggKGVsZW1lbnQpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICBpZiAoZGVtdXgtPmluZGV4KQorICAgIHJlc3VsdCA9IGdzdF9vYmplY3RfcmVmIChkZW11eC0+aW5kZXgpOworICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X2RlbXV4X2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEZsdkRlbXV4ICpkZW11eCA9IEdTVF9GTFZfREVNVVggKG9iamVjdCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJkaXNwb3NpbmcgRkxWIGRlbXV4ZXIiKTsKKworICBpZiAoZGVtdXgtPmFkYXB0ZXIpIHsKKyAgICBnc3RfYWRhcHRlcl9jbGVhciAoZGVtdXgtPmFkYXB0ZXIpOworICAgIGdfb2JqZWN0X3VucmVmIChkZW11eC0+YWRhcHRlcik7CisgICAgZGVtdXgtPmFkYXB0ZXIgPSBOVUxMOworICB9CisKKyAgaWYgKGRlbXV4LT50YWdsaXN0KSB7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmIChkZW11eC0+dGFnbGlzdCk7CisgICAgZGVtdXgtPnRhZ2xpc3QgPSBOVUxMOworICB9CisKKyAgaWYgKGRlbXV4LT5hdWRpb190YWdzKSB7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmIChkZW11eC0+YXVkaW9fdGFncyk7CisgICAgZGVtdXgtPmF1ZGlvX3RhZ3MgPSBOVUxMOworICB9CisKKyAgaWYgKGRlbXV4LT52aWRlb190YWdzKSB7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmIChkZW11eC0+dmlkZW9fdGFncyk7CisgICAgZGVtdXgtPnZpZGVvX3RhZ3MgPSBOVUxMOworICB9CisKKyAgaWYgKGRlbXV4LT5mbG93Y29tYmluZXIpIHsKKyAgICBnc3RfZmxvd19jb21iaW5lcl9mcmVlIChkZW11eC0+Zmxvd2NvbWJpbmVyKTsKKyAgICBkZW11eC0+Zmxvd2NvbWJpbmVyID0gTlVMTDsKKyAgfQorCisgIGlmIChkZW11eC0+bmV3X3NlZ19ldmVudCkgeworICAgIGdzdF9ldmVudF91bnJlZiAoZGVtdXgtPm5ld19zZWdfZXZlbnQpOworICAgIGRlbXV4LT5uZXdfc2VnX2V2ZW50ID0gTlVMTDsKKyAgfQorCisgIGlmIChkZW11eC0+YXVkaW9fY29kZWNfZGF0YSkgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKGRlbXV4LT5hdWRpb19jb2RlY19kYXRhKTsKKyAgICBkZW11eC0+YXVkaW9fY29kZWNfZGF0YSA9IE5VTEw7CisgIH0KKworICBpZiAoZGVtdXgtPnZpZGVvX2NvZGVjX2RhdGEpIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChkZW11eC0+dmlkZW9fY29kZWNfZGF0YSk7CisgICAgZGVtdXgtPnZpZGVvX2NvZGVjX2RhdGEgPSBOVUxMOworICB9CisKKyAgaWYgKGRlbXV4LT5hdWRpb19wYWQpIHsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChkZW11eC0+YXVkaW9fcGFkKTsKKyAgICBkZW11eC0+YXVkaW9fcGFkID0gTlVMTDsKKyAgfQorCisgIGlmIChkZW11eC0+dmlkZW9fcGFkKSB7CisgICAgZ3N0X29iamVjdF91bnJlZiAoZGVtdXgtPnZpZGVvX3BhZCk7CisgICAgZGVtdXgtPnZpZGVvX3BhZCA9IE5VTEw7CisgIH0KKworICBpZiAoZGVtdXgtPmluZGV4KSB7CisgICAgZ3N0X29iamVjdF91bnJlZiAoZGVtdXgtPmluZGV4KTsKKyAgICBkZW11eC0+aW5kZXggPSBOVUxMOworICB9CisKKyAgaWYgKGRlbXV4LT50aW1lcykgeworICAgIGdfYXJyYXlfZnJlZSAoZGVtdXgtPnRpbWVzLCBUUlVFKTsKKyAgICBkZW11eC0+dGltZXMgPSBOVUxMOworICB9CisKKyAgaWYgKGRlbXV4LT5maWxlcG9zaXRpb25zKSB7CisgICAgZ19hcnJheV9mcmVlIChkZW11eC0+ZmlsZXBvc2l0aW9ucywgVFJVRSk7CisgICAgZGVtdXgtPmZpbGVwb3NpdGlvbnMgPSBOVUxMOworICB9CisKKyAgR1NUX0NBTExfUEFSRU5UIChHX09CSkVDVF9DTEFTUywgZGlzcG9zZSwgKG9iamVjdCkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2Zsdl9kZW11eF9jbGFzc19pbml0IChHc3RGbHZEZW11eENsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF9mbHZfZGVtdXhfZGlzcG9zZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbHZfZGVtdXhfY2hhbmdlX3N0YXRlKTsKKworI2lmIDAKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+c2V0X2luZGV4ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbHZfZGVtdXhfc2V0X2luZGV4KTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Z2V0X2luZGV4ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbHZfZGVtdXhfZ2V0X2luZGV4KTsKKyNlbmRpZgorCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmZsdl9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmYXVkaW9fc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmdmlkZW9fc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkZMViBEZW11eGVyIiwKKyAgICAgICJDb2RlYy9EZW11eGVyIiwgIkRlbXV4IEZMViBmZWVkcyBpbnRvIGRpZ2l0YWwgc3RyZWFtcyIsCisgICAgICAiSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X2RlbXV4X2luaXQgKEdzdEZsdkRlbXV4ICogZGVtdXgpCit7CisgIGRlbXV4LT5zaW5rcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmZmx2X3NpbmtfdGVtcGxhdGUsICJzaW5rIik7CisKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKGRlbXV4LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbHZfZGVtdXhfc2lua19ldmVudCkpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoZGVtdXgtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Zsdl9kZW11eF9jaGFpbikpOworICBnc3RfcGFkX3NldF9hY3RpdmF0ZV9mdW5jdGlvbiAoZGVtdXgtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Zsdl9kZW11eF9zaW5rX2FjdGl2YXRlKSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2YXRlbW9kZV9mdW5jdGlvbiAoZGVtdXgtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Zsdl9kZW11eF9zaW5rX2FjdGl2YXRlX21vZGUpKTsKKworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoZGVtdXgpLCBkZW11eC0+c2lua3BhZCk7CisKKyAgZGVtdXgtPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgIGRlbXV4LT5mbG93Y29tYmluZXIgPSBnc3RfZmxvd19jb21iaW5lcl9uZXcgKCk7CisKKyAgZGVtdXgtPm93bl9pbmRleCA9IEZBTFNFOworCisgIEdTVF9PQkpFQ1RfRkxBR19TRVQgKGRlbXV4LCBHU1RfRUxFTUVOVF9GTEFHX0lOREVYQUJMRSk7CisKKyAgZ3N0X2Zsdl9kZW11eF9jbGVhbnVwIChkZW11eCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGZsdmRlbXV4X2RlYnVnLCAiZmx2ZGVtdXgiLCAwLCAiRkxWIGRlbXV4ZXIiKTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJmbHZkZW11eCIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICAgICAgZ3N0X2Zsdl9kZW11eF9nZXRfdHlwZSAoKSkgfHwKKyAgICAgICFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiZmx2bXV4IiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgICAgICBnc3RfZmx2X211eF9nZXRfdHlwZSAoKSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGZsdiwgIkZMViBtdXhpbmcgYW5kIGRlbXV4aW5nIHBsdWdpbiIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L2Zsdi9nc3RmbHZkZW11eC5oIGIvZ3N0L2Zsdi9nc3RmbHZkZW11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYjE3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZmx2L2dzdGZsdmRlbXV4LmgKQEAgLTAsMCArMSwxNjkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0ZMVl9ERU1VWF9IX18KKyNkZWZpbmUgX19GTFZfREVNVVhfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGZsb3djb21iaW5lci5oPgorI2luY2x1ZGUgImdzdGluZGV4LmgiCisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfRkxWX0RFTVVYIFwKKyAgKGdzdF9mbHZfZGVtdXhfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0ZMVl9ERU1VWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0ZMVl9ERU1VWCxHc3RGbHZEZW11eCkpCisjZGVmaW5lIEdTVF9GTFZfREVNVVhfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfRkxWX0RFTVVYLEdzdEZsdkRlbXV4Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfRkxWX0RFTVVYKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfRkxWX0RFTVVYKSkKKyNkZWZpbmUgR1NUX0lTX0ZMVl9ERU1VWF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9GTFZfREVNVVgpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdEZsdkRlbXV4IEdzdEZsdkRlbXV4OwordHlwZWRlZiBzdHJ1Y3QgX0dzdEZsdkRlbXV4Q2xhc3MgR3N0Rmx2RGVtdXhDbGFzczsKKwordHlwZWRlZiBlbnVtCit7CisgIEZMVl9TVEFURV9IRUFERVIsCisgIEZMVl9TVEFURV9UQUdfVFlQRSwKKyAgRkxWX1NUQVRFX1RBR19WSURFTywKKyAgRkxWX1NUQVRFX1RBR19BVURJTywKKyAgRkxWX1NUQVRFX1RBR19TQ1JJUFQsCisgIEZMVl9TVEFURV9TRUVLLAorICBGTFZfU1RBVEVfRE9ORSwKKyAgRkxWX1NUQVRFX1NLSVAsCisgIEZMVl9TVEFURV9OT05FCit9IEdzdEZsdkRlbXV4U3RhdGU7CisKK3N0cnVjdCBfR3N0Rmx2RGVtdXgKK3sKKyAgR3N0RWxlbWVudCBlbGVtZW50OworCisgIEdzdFBhZCAqc2lua3BhZDsKKworICBHc3RQYWQgKmF1ZGlvX3BhZDsKKyAgR3N0UGFkICp2aWRlb19wYWQ7CisKKyAgZ2Jvb2xlYW4gaGF2ZV9ncm91cF9pZDsKKyAgZ3VpbnQgZ3JvdXBfaWQ7CisKKyAgLyogPHByaXZhdGU+ICovCisgIAorICBHc3RJbmRleCAqaW5kZXg7CisgIGdpbnQgaW5kZXhfaWQ7CisgIGdib29sZWFuIG93bl9pbmRleDsKKyAgCisgIEdBcnJheSAqIHRpbWVzOworICBHQXJyYXkgKiBmaWxlcG9zaXRpb25zOworCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisKKyAgR3N0Rmxvd0NvbWJpbmVyICpmbG93Y29tYmluZXI7CisKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIEdzdEV2ZW50ICpuZXdfc2VnX2V2ZW50OworCisgIEdzdFRhZ0xpc3QgKnRhZ2xpc3Q7CisgIEdzdFRhZ0xpc3QgKmF1ZGlvX3RhZ3M7CisgIEdzdFRhZ0xpc3QgKnZpZGVvX3RhZ3M7CisKKyAgR3N0Rmx2RGVtdXhTdGF0ZSBzdGF0ZTsKKworICBndWludDY0IG9mZnNldDsKKyAgZ3VpbnQ2NCBjdXJfdGFnX29mZnNldDsKKyAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uOworICBndWludDY0IHRhZ19zaXplOworICBndWludDY0IHRhZ19kYXRhX3NpemU7CisKKyAgLyogQXVkaW8gaW5mb3MgKi8KKyAgZ3VpbnQxNiByYXRlOworICBndWludDE2IGNoYW5uZWxzOworICBndWludDE2IHdpZHRoOworICBndWludDE2IGF1ZGlvX2NvZGVjX3RhZzsKKyAgZ3VpbnQ2NCBhdWRpb19vZmZzZXQ7CisgIGdib29sZWFuIGF1ZGlvX25lZWRfZGlzY29udDsKKyAgZ2Jvb2xlYW4gYXVkaW9fbmVlZF9zZWdtZW50OworICBnYm9vbGVhbiBhdWRpb19saW5rZWQ7CisgIEdzdEJ1ZmZlciAqIGF1ZGlvX2NvZGVjX2RhdGE7CisgIEdzdENsb2NrVGltZSBhdWRpb19zdGFydDsKKyAgZ3VpbnQzMiBsYXN0X2F1ZGlvX3B0czsKKyAgR3N0Q2xvY2tUaW1lIGF1ZGlvX3RpbWVfb2Zmc2V0OworCisgIC8qIFZpZGVvIGluZm9zICovCisgIGd1aW50MzIgdzsKKyAgZ3VpbnQzMiBoOworICBndWludDMyIHBhcl94OworICBndWludDMyIHBhcl95OworICBndWludDE2IHZpZGVvX2NvZGVjX3RhZzsKKyAgZ3VpbnQ2NCB2aWRlb19vZmZzZXQ7CisgIGdib29sZWFuIHZpZGVvX25lZWRfZGlzY29udDsKKyAgZ2Jvb2xlYW4gdmlkZW9fbmVlZF9zZWdtZW50OworICBnYm9vbGVhbiB2aWRlb19saW5rZWQ7CisgIGdib29sZWFuIGdvdF9wYXI7CisgIEdzdEJ1ZmZlciAqIHZpZGVvX2NvZGVjX2RhdGE7CisgIEdzdENsb2NrVGltZSB2aWRlb19zdGFydDsKKyAgZ3VpbnQzMiBsYXN0X3ZpZGVvX2R0czsKKyAgR3N0Q2xvY2tUaW1lIHZpZGVvX3RpbWVfb2Zmc2V0OworICBnZG91YmxlIGZyYW1lcmF0ZTsKKworICBnYm9vbGVhbiByYW5kb21fYWNjZXNzOworICBnYm9vbGVhbiBuZWVkX2hlYWRlcjsKKyAgZ2Jvb2xlYW4gaGFzX2F1ZGlvOworICBnYm9vbGVhbiBoYXNfdmlkZW87CisgIGdib29sZWFuIHN0cmljdDsKKyAgZ2Jvb2xlYW4gZmx1c2hpbmc7CisKKyAgZ2Jvb2xlYW4gbm9fbW9yZV9wYWRzOworCisjaWZuZGVmIEdTVF9ESVNBQkxFX0RFQlVHCisgIGdib29sZWFuIG5vX2F1ZGlvX3dhcm5lZDsKKyAgZ2Jvb2xlYW4gbm9fdmlkZW9fd2FybmVkOworI2VuZGlmCisKKyAgZ2Jvb2xlYW4gc2Vla2luZzsKKyAgZ2Jvb2xlYW4gYnVpbGRpbmdfaW5kZXg7CisgIGdib29sZWFuIGluZGV4ZWQ7IC8qIFRSVUUgaWYgaW5kZXggaXMgY29tcGxldGVseSBidWlsdCAqLworICBnYm9vbGVhbiB1cHN0cmVhbV9zZWVrYWJsZTsgLyogVFJVRSBpZiB1cHN0cmVhbSBpcyBzZWVrYWJsZSAqLworICBnaW50NjQgZmlsZV9zaXplOworICBHc3RFdmVudCAqc2Vla19ldmVudDsKKyAgZ2ludDY0IHNlZWtfdGltZTsKKworICBHc3RDbG9ja1RpbWUgaW5kZXhfbWF4X3RpbWU7CisgIGdpbnQ2NCBpbmRleF9tYXhfcG9zOworCisgIC8qIHJldmVyc2UgcGxheWJhY2sgKi8KKyAgR3N0Q2xvY2tUaW1lIHZpZGVvX2ZpcnN0X3RzOworICBHc3RDbG9ja1RpbWUgYXVkaW9fZmlyc3RfdHM7CisgIGdib29sZWFuIHZpZGVvX2RvbmU7CisgIGdib29sZWFuIGF1ZGlvX2RvbmU7CisgIGdpbnQ2NCBmcm9tX29mZnNldDsKKyAgZ2ludDY0IHRvX29mZnNldDsKK307CisKK3N0cnVjdCBfR3N0Rmx2RGVtdXhDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2Zsdl9kZW11eF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYgLyogX19GTFZfREVNVVhfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZmx2L2dzdGZsdm11eC5jIGIvZ3N0L2Zsdi9nc3RmbHZtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzkwN2UwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2Zsdi9nc3RmbHZtdXguYwpAQCAtMCwwICsxLDE4MDggQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCwyMDA5IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTcgQ29sbGFib3JhIEx0ZAorICogIEBhdXRob3I6IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICogIEBhdXRob3I6IFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1mbHZtdXgKKyAqCisgKiBmbHZtdXggbXV4ZXMgZGlmZmVyZW50IHN0cmVhbXMgaW50byBhbiBGTFYgZmlsZS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgZmx2bXV4IG5hbWU9bXV4ICEgZmlsZXNpbmsgbG9jYXRpb249dGVzdC5mbHYgIGF1ZGlvdGVzdHNyYyBzYW1wbGVzcGVyYnVmZmVyPTQ0MTAwIG51bS1idWZmZXJzPTEwICEgZmFhYyAhIG11eC4gIHZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz0yNTAgISB2aWRlby94LXJhdyxmcmFtZXJhdGU9MjUvMSAhIHgyNjRlbmMgISBtdXguCisgKiBdfCBUaGlzIHBpcGVsaW5lIGVuY29kZXMgYSB0ZXN0IGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW0gYW5kIG11eGVzIGJvdGggaW50byBhbiBGTFYgZmlsZS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJnc3RmbHZtdXguaCIKKyNpbmNsdWRlICJhbWZkZWZzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGZsdm11eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBmbHZtdXhfZGVidWcKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfU1RSRUFNQUJMRSwKKyAgUFJPUF9NRVRBREFUQUNSRUFUT1IKK307CisKKyNkZWZpbmUgREVGQVVMVF9TVFJFQU1BQkxFIEZBTFNFCisjZGVmaW5lIE1BWF9JTkRFWF9FTlRSSUVTIDEyOAorI2RlZmluZSBERUZBVUxUX01FVEFEQVRBQ1JFQVRPUiAiR1N0cmVhbWVyICIgUEFDS0FHRV9WRVJTSU9OICIgRkxWIG11eGVyIgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtZmx2IikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgdmlkZW9zaW5rX3RlbXBsID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJ2aWRlbyIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfUkVRVUVTVCwKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LWZsYXNoLXZpZGVvOyAiCisgICAgICAgICJ2aWRlby94LWZsYXNoLXNjcmVlbjsgIgorICAgICAgICAidmlkZW8veC12cDYtZmxhc2g7ICIgInZpZGVvL3gtdnA2LWFscGhhOyAiCisgICAgICAgICJ2aWRlby94LWgyNjQsIHN0cmVhbS1mb3JtYXQ9YXZjOyIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGF1ZGlvc2lua190ZW1wbCA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgiYXVkaW8iLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTCisgICAgKCJhdWRpby94LWFkcGNtLCBsYXlvdXQgPSAoc3RyaW5nKSBzd2YsIGNoYW5uZWxzID0gKGludCkgeyAxLCAyIH0sIHJhdGUgPSAoaW50KSB7IDU1MTIsIDExMDI1LCAyMjA1MCwgNDQxMDAgfTsgIgorICAgICAgICAiYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb24gPSAoaW50KSAxLCBsYXllciA9IChpbnQpIDMsIGNoYW5uZWxzID0gKGludCkgeyAxLCAyIH0sIHJhdGUgPSAoaW50KSB7IDU1MTIsIDgwMDAsIDExMDI1LCAyMjA1MCwgNDQxMDAgfSwgcGFyc2VkID0gKGJvb2xlYW4pIFRSVUU7ICIKKyAgICAgICAgImF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uID0gKGludCkgeyA0LCAyIH0sIHN0cmVhbS1mb3JtYXQgPSAoc3RyaW5nKSByYXc7ICIKKyAgICAgICAgImF1ZGlvL3gtbmVsbHltb3NlciwgY2hhbm5lbHMgPSAoaW50KSB7IDEsIDIgfSwgcmF0ZSA9IChpbnQpIHsgNTUxMiwgODAwMCwgMTEwMjUsIDE2MDAwLCAyMjA1MCwgNDQxMDAgfTsgIgorICAgICAgICAiYXVkaW8veC1yYXcsIGZvcm1hdCA9IChzdHJpbmcpIHsgVTgsIFMxNkxFfSwgbGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsIGNoYW5uZWxzID0gKGludCkgeyAxLCAyIH0sIHJhdGUgPSAoaW50KSB7IDU1MTIsIDExMDI1LCAyMjA1MCwgNDQxMDAgfTsgIgorICAgICAgICAiYXVkaW8veC1hbGF3LCBjaGFubmVscyA9IChpbnQpIHsgMSwgMiB9LCByYXRlID0gKGludCkgeyA1NTEyLCAxMTAyNSwgMjIwNTAsIDQ0MTAwIH07ICIKKyAgICAgICAgImF1ZGlvL3gtbXVsYXcsIGNoYW5uZWxzID0gKGludCkgeyAxLCAyIH0sIHJhdGUgPSAoaW50KSB7IDU1MTIsIDExMDI1LCAyMjA1MCwgNDQxMDAgfTsgIgorICAgICAgICAiYXVkaW8veC1zcGVleCwgY2hhbm5lbHMgPSAoaW50KSAxLCByYXRlID0gKGludCkgMTYwMDA7IikKKyAgICApOworCitHX0RFRklORV9UWVBFIChHc3RGbHZNdXhQYWQsIGdzdF9mbHZfbXV4X3BhZCwgR1NUX1RZUEVfQUdHUkVHQVRPUl9QQUQpOworCisjZGVmaW5lIGdzdF9mbHZfbXV4X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RGbHZNdXgsIGdzdF9mbHZfbXV4LCBHU1RfVFlQRV9BR0dSRUdBVE9SLAorICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfVEFHX1NFVFRFUiwgTlVMTCkpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2Zsdl9tdXhfYWdncmVnYXRlIChHc3RBZ2dyZWdhdG9yICogYWdncmVnYXRvciwgZ2Jvb2xlYW4gdGltZW91dCk7CitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbHZfbXV4X3NpbmtfZXZlbnQgKEdzdEFnZ3JlZ2F0b3IgKiBhZ2dyZWdhdG9yLCBHc3RBZ2dyZWdhdG9yUGFkICogcGFkLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCitzdGF0aWMgR3N0QWdncmVnYXRvclBhZCAqZ3N0X2Zsdl9tdXhfY3JlYXRlX25ld19wYWQgKEdzdEFnZ3JlZ2F0b3IgKiBhZ2csCisgICAgR3N0UGFkVGVtcGxhdGUgKiB0ZW1wbCwgY29uc3QgZ2NoYXIgKiByZXFfbmFtZSwgY29uc3QgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIHZvaWQgZ3N0X2Zsdl9tdXhfcmVsZWFzZV9wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RQYWQgKiBwYWQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2Zsdl9tdXhfdmlkZW9fcGFkX3NldGNhcHMgKEdzdEZsdk11eFBhZCAqIHBhZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2Zsdl9tdXhfYXVkaW9fcGFkX3NldGNhcHMgKEdzdEZsdk11eFBhZCAqIHBhZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CisKK3N0YXRpYyB2b2lkIGdzdF9mbHZfbXV4X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9mbHZfbXV4X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9mbHZfbXV4X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIHZvaWQgZ3N0X2Zsdl9tdXhfcmVzZXQgKEdzdEVsZW1lbnQgKiBlbGVtZW50KTsKK3N0YXRpYyB2b2lkIGdzdF9mbHZfbXV4X3Jlc2V0X3BhZCAoR3N0Rmx2TXV4UGFkICogcGFkKTsKKworc3RhdGljIHZvaWQgZ3N0X2Zsdl9tdXhfcGFkX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9mbHZfbXV4X3N0YXJ0IChHc3RBZ2dyZWdhdG9yICogYWdncmVnYXRvcik7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfZmx2X211eF9mbHVzaCAoR3N0QWdncmVnYXRvciAqIGFnZ3JlZ2F0b3IpOworc3RhdGljIEdzdENsb2NrVGltZSBnc3RfZmx2X211eF9nZXRfbmV4dF90aW1lIChHc3RBZ2dyZWdhdG9yICogYWdncmVnYXRvcik7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfZmx2X211eF93cml0ZV9lb3MgKEdzdEZsdk11eCAqIG11eCk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfZmx2X211eF93cml0ZV9oZWFkZXIgKEdzdEZsdk11eCAqIG11eCk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfZmx2X211eF9yZXdyaXRlX2hlYWRlciAoR3N0Rmx2TXV4ICogbXV4KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZmx2X211eF9hcmVfYWxsX3BhZHNfZW9zIChHc3RGbHZNdXggKiBtdXgpOworCisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZmx2X211eF9wYWRfZmx1c2ggKEdzdEFnZ3JlZ2F0b3JQYWQgKiBwYWQsIEdzdEFnZ3JlZ2F0b3IgKiBhZ2dyZWdhdG9yKQoreworICBHc3RGbHZNdXhQYWQgKmZsdnBhZCA9IEdTVF9GTFZfTVVYX1BBRCAocGFkKTsKKworICBmbHZwYWQtPmxhc3RfdGltZXN0YW1wID0gMDsKKyAgZmx2cGFkLT5wdHMgPSBHU1RfQ0xPQ0tfU1RJTUVfTk9ORTsKKyAgZmx2cGFkLT5kdHMgPSBHU1RfQ0xPQ0tfU1RJTUVfTk9ORTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X211eF9wYWRfY2xhc3NfaW5pdCAoR3N0Rmx2TXV4UGFkQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0QWdncmVnYXRvclBhZENsYXNzICphZ2dyZWdhdG9ycGFkX2NsYXNzID0gKEdzdEFnZ3JlZ2F0b3JQYWRDbGFzcyAqKSBrbGFzczsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9mbHZfbXV4X3BhZF9maW5hbGl6ZTsKKworICBhZ2dyZWdhdG9ycGFkX2NsYXNzLT5mbHVzaCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmx2X211eF9wYWRfZmx1c2gpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2Zsdl9tdXhfcGFkX2luaXQgKEdzdEZsdk11eFBhZCAqIHBhZCkKK3sKKyAgZ3N0X2Zsdl9tdXhfcmVzZXRfcGFkIChwYWQpOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBnZG91YmxlIHBvc2l0aW9uOworICBnZG91YmxlIHRpbWU7Cit9IEdzdEZsdk11eEluZGV4RW50cnk7CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X211eF9pbmRleF9lbnRyeV9mcmVlIChHc3RGbHZNdXhJbmRleEVudHJ5ICogZW50cnkpCit7CisgIGdfc2xpY2VfZnJlZSAoR3N0Rmx2TXV4SW5kZXhFbnRyeSwgZW50cnkpOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK19nc3RfYnVmZmVyX25ld193cmFwcGVkIChncG9pbnRlciBtZW0sIGdzaXplIHNpemUsIEdGcmVlRnVuYyBmcmVlX2Z1bmMpCit7CisgIEdzdEJ1ZmZlciAqYnVmOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3ICgpOworICBnc3RfYnVmZmVyX2FwcGVuZF9tZW1vcnkgKGJ1ZiwKKyAgICAgIGdzdF9tZW1vcnlfbmV3X3dyYXBwZWQgKGZyZWVfZnVuYyA/IDAgOiBHU1RfTUVNT1JZX0ZMQUdfUkVBRE9OTFksCisgICAgICAgICAgbWVtLCBzaXplLCAwLCBzaXplLCBtZW0sIGZyZWVfZnVuYykpOworCisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyB2b2lkCitfZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChnc2l6ZSBzaXplLCBHc3RCdWZmZXIgKiogYnVmZmVyLCBndWludDggKiogZGF0YSkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoZGF0YSAhPSBOVUxMKTsKKyAgZ19yZXR1cm5faWZfZmFpbCAoYnVmZmVyICE9IE5VTEwpOworCisgICpkYXRhID0gZ19tYWxsb2MgKHNpemUpOworICAqYnVmZmVyID0gX2dzdF9idWZmZXJfbmV3X3dyYXBwZWQgKCpkYXRhLCBzaXplLCBnX2ZyZWUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2Zsdl9tdXhfY2xhc3NfaW5pdCAoR3N0Rmx2TXV4Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEFnZ3JlZ2F0b3JDbGFzcyAqZ3N0YWdncmVnYXRvcl9jbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZmx2bXV4X2RlYnVnLCAiZmx2bXV4IiwgMCwgIkZMViBtdXhlciIpOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YWdncmVnYXRvcl9jbGFzcyA9IChHc3RBZ2dyZWdhdG9yQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2Zsdl9tdXhfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfZmx2X211eF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2Zsdl9tdXhfZmluYWxpemU7CisKKyAgLyogRklYTUU6IGlkZWFsbHkgdGhlIHJpZ2h0IG1vZGUgb2Ygb3BlcmF0aW9uIHNob3VsZCBiZSBkZXRlY3RlZAorICAgKiBhdXRvbWF0aWNhbGx5IHVzaW5nIHF1ZXJpZXMgd2hlbiBwYXJhbWV0ZXIgbm90IHNwZWNpZmllZC4gKi8KKyAgLyoqCisgICAqIEdzdEZsdk11eDpzdHJlYW1hYmxlCisgICAqCisgICAqIElmIFRydWUsIHRoZSBvdXRwdXQgd2lsbCBiZSBzdHJlYW1pbmcgZnJpZW5kbHkuIChpZSB3aXRob3V0IGluZGV4ZXMgYW5kCisgICAqIGR1cmF0aW9uKQorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TVFJFQU1BQkxFLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJzdHJlYW1hYmxlIiwgInN0cmVhbWFibGUiLAorICAgICAgICAgICJJZiBzZXQgdG8gdHJ1ZSwgdGhlIG91dHB1dCBzaG91bGQgYmUgYXMgaWYgaXQgaXMgdG8gYmUgc3RyZWFtZWQgIgorICAgICAgICAgICJhbmQgaGVuY2Ugbm8gaW5kZXhlcyB3cml0dGVuIG9yIGR1cmF0aW9uIHdyaXR0ZW4uIiwKKyAgICAgICAgICBERUZBVUxUX1NUUkVBTUFCTEUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01FVEFEQVRBQ1JFQVRPUiwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJtZXRhZGF0YWNyZWF0b3IiLCAibWV0YWRhdGFjcmVhdG9yIiwKKyAgICAgICAgICAiVGhlIHZhbHVlIG9mIG1ldGFkYXRhY3JlYXRvciBpbiB0aGUgbWV0YSBwYWNrZXQuIiwKKyAgICAgICAgICBOVUxMLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RhZ2dyZWdhdG9yX2NsYXNzLT5jcmVhdGVfbmV3X3BhZCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Zsdl9tdXhfY3JlYXRlX25ld19wYWQpOworICBnc3RlbGVtZW50X2NsYXNzLT5yZWxlYXNlX3BhZCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmx2X211eF9yZWxlYXNlX3BhZCk7CisKKyAgZ3N0YWdncmVnYXRvcl9jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Zsdl9tdXhfc3RhcnQpOworICBnc3RhZ2dyZWdhdG9yX2NsYXNzLT5hZ2dyZWdhdGUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Zsdl9tdXhfYWdncmVnYXRlKTsKKyAgZ3N0YWdncmVnYXRvcl9jbGFzcy0+c2lua19ldmVudCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmx2X211eF9zaW5rX2V2ZW50KTsKKyAgZ3N0YWdncmVnYXRvcl9jbGFzcy0+Zmx1c2ggPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Zsdl9tdXhfZmx1c2gpOworICBnc3RhZ2dyZWdhdG9yX2NsYXNzLT5nZXRfbmV4dF90aW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmx2X211eF9nZXRfbmV4dF90aW1lKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZV93aXRoX2d0eXBlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJnZpZGVvc2lua190ZW1wbCwgR1NUX1RZUEVfRkxWX01VWF9QQUQpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZV93aXRoX2d0eXBlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmF1ZGlvc2lua190ZW1wbCwgR1NUX1RZUEVfRkxWX01VWF9QQUQpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbCk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJGTFYgbXV4ZXIiLAorICAgICAgIkNvZGVjL011eGVyIiwKKyAgICAgICJNdXhlcyB2aWRlby9hdWRpbyBzdHJlYW1zIGludG8gYSBGTFYgc3RyZWFtIiwKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZmx2bXV4X2RlYnVnLCAiZmx2bXV4IiwgMCwgIkZMViBtdXhlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2Zsdl9tdXhfaW5pdCAoR3N0Rmx2TXV4ICogbXV4KQoreworICBtdXgtPnNyY3BhZCA9IEdTVF9BR0dSRUdBVE9SX0NBU1QgKG11eCktPnNyY3BhZDsKKworICAvKiBwcm9wZXJ0eSAqLworICBtdXgtPnN0cmVhbWFibGUgPSBERUZBVUxUX1NUUkVBTUFCTEU7CisgIG11eC0+bWV0YWRhdGFjcmVhdG9yID0gZ19zdHJkdXAgKERFRkFVTFRfTUVUQURBVEFDUkVBVE9SKTsKKworICBtdXgtPm5ld190YWdzID0gRkFMU0U7CisKKyAgZ3N0X2Zsdl9tdXhfcmVzZXQgKEdTVF9FTEVNRU5UIChtdXgpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9mbHZfbXV4X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RGbHZNdXggKm11eCA9IEdTVF9GTFZfTVVYIChvYmplY3QpOworCisgIGdzdF9mbHZfbXV4X3Jlc2V0IChHU1RfRUxFTUVOVCAob2JqZWN0KSk7CisgIGdfZnJlZSAobXV4LT5tZXRhZGF0YWNyZWF0b3IpOworCisgIEdfT0JKRUNUX0NMQVNTIChnc3RfZmx2X211eF9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9mbHZfbXV4X3BhZF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0Rmx2TXV4UGFkICpwYWQgPSBHU1RfRkxWX01VWF9QQUQgKG9iamVjdCk7CisKKyAgZ3N0X2Zsdl9tdXhfcmVzZXRfcGFkIChwYWQpOworCisgIEdfT0JKRUNUX0NMQVNTIChnc3RfZmx2X211eF9wYWRfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZmx2X211eF9mbHVzaCAoR3N0QWdncmVnYXRvciAqIGFnZ3JlZ2F0b3IpCit7CisgIC8qIFRPRE86IFdoYXQgaXMgdGhlIHJpZ2h0IGJlaGF2aW91ciBvbiBmbHVzaD8gU2hvdWxkIHdlIGp1c3QgaWdub3JlIGl0ID8KKyAgICogVGhpcyBzdGlsbCBuZWVkcyB0byBiZSBkZWZpbmVkLiAqLworCisgIGdzdF9mbHZfbXV4X3Jlc2V0IChHU1RfRUxFTUVOVCAoYWdncmVnYXRvcikpOworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2Zsdl9tdXhfc3RhcnQgKEdzdEFnZ3JlZ2F0b3IgKiBhZ2dyZWdhdG9yKQoreworICBnc3RfZmx2X211eF9yZXNldCAoR1NUX0VMRU1FTlQgKGFnZ3JlZ2F0b3IpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X211eF9yZXNldCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdEZsdk11eCAqbXV4ID0gR1NUX0ZMVl9NVVggKGVsZW1lbnQpOworCisgIGdfbGlzdF9mb3JlYWNoIChtdXgtPmluZGV4LCAoR0Z1bmMpIGdzdF9mbHZfbXV4X2luZGV4X2VudHJ5X2ZyZWUsIE5VTEwpOworICBnX2xpc3RfZnJlZSAobXV4LT5pbmRleCk7CisgIG11eC0+aW5kZXggPSBOVUxMOworICBtdXgtPmJ5dGVfY291bnQgPSAwOworCisgIG11eC0+ZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBtdXgtPm5ld190YWdzID0gRkFMU0U7CisgIG11eC0+Zmlyc3RfdGltZXN0YW1wID0gR1NUX0NMT0NLX1NUSU1FX05PTkU7CisKKyAgbXV4LT5zdGF0ZSA9IEdTVF9GTFZfTVVYX1NUQVRFX0hFQURFUjsKKworICAvKiB0YWdzICovCisgIGdzdF90YWdfc2V0dGVyX3Jlc2V0X3RhZ3MgKEdTVF9UQUdfU0VUVEVSIChtdXgpKTsKK30KKworLyogRXh0cmFjdCBwZXItY29kZWMgcmVsZXZhbnQgdGFncyBmb3IKKyAqIGluc2VydGlvbiBpbnRvIHRoZSBtZXRhZGF0YSBsYXRlciAtIGllIGJpdHJhdGUsCisgKiBidXQgbWF5YmUgb3RoZXJzIGluIHRoZSBmdXR1cmUgKi8KK3N0YXRpYyB2b2lkCitnc3RfZmx2X211eF9zdG9yZV9jb2RlY190YWdzIChHc3RGbHZNdXggKiBtdXgsCisgICAgR3N0Rmx2TXV4UGFkICogZmx2cGFkLCBHc3RUYWdMaXN0ICogbGlzdCkKK3sKKyAgLyogTG9vayBmb3IgYSBiaXRyYXRlIGFzIGVpdGhlciBub21pbmFsIG9yIGFjdHVhbCBiaXRyYXRlIHRhZyAqLworICBpZiAoZ3N0X3RhZ19saXN0X2dldF91aW50IChsaXN0LCBHU1RfVEFHX05PTUlOQUxfQklUUkFURSwgJmZsdnBhZC0+Yml0cmF0ZSkKKyAgICAgIHx8IGdzdF90YWdfbGlzdF9nZXRfdWludCAobGlzdCwgR1NUX1RBR19CSVRSQVRFLCAmZmx2cGFkLT5iaXRyYXRlKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgIlN0b3JlZCBiaXRyYXRlIGZvciBwYWQgJSIgR1NUX1BUUl9GT1JNQVQgIiA9ICV1IiwKKyAgICAgICAgZmx2cGFkLCBmbHZwYWQtPmJpdHJhdGUpOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2Zsdl9tdXhfc2lua19ldmVudCAoR3N0QWdncmVnYXRvciAqIGFnZ3JlZ2F0b3IsIEdzdEFnZ3JlZ2F0b3JQYWQgKiBwYWQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0Rmx2TXV4ICptdXggPSBHU1RfRkxWX01VWCAoYWdncmVnYXRvcik7CisgIEdzdEZsdk11eFBhZCAqZmx2cGFkID0gKEdzdEZsdk11eFBhZCAqKSBwYWQ7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfY2FwcyAoZXZlbnQsICZjYXBzKTsKKworICAgICAgaWYgKG11eC0+dmlkZW9fcGFkID09IGZsdnBhZCkgeworICAgICAgICByZXQgPSBnc3RfZmx2X211eF92aWRlb19wYWRfc2V0Y2FwcyAoZmx2cGFkLCBjYXBzKTsKKyAgICAgIH0gZWxzZSBpZiAobXV4LT5hdWRpb19wYWQgPT0gZmx2cGFkKSB7CisgICAgICAgIHJldCA9IGdzdF9mbHZfbXV4X2F1ZGlvX3BhZF9zZXRjYXBzIChmbHZwYWQsIGNhcHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfVEFHOnsKKyAgICAgIEdzdFRhZ0xpc3QgKmxpc3Q7CisgICAgICBHc3RUYWdTZXR0ZXIgKnNldHRlciA9IEdTVF9UQUdfU0VUVEVSIChtdXgpOworICAgICAgY29uc3QgR3N0VGFnTWVyZ2VNb2RlIG1vZGUgPSBnc3RfdGFnX3NldHRlcl9nZXRfdGFnX21lcmdlX21vZGUgKHNldHRlcik7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV90YWcgKGV2ZW50LCAmbGlzdCk7CisgICAgICBnc3RfdGFnX3NldHRlcl9tZXJnZV90YWdzIChzZXR0ZXIsIGxpc3QsIG1vZGUpOworICAgICAgZ3N0X2Zsdl9tdXhfc3RvcmVfY29kZWNfdGFncyAobXV4LCBmbHZwYWQsIGxpc3QpOworICAgICAgbXV4LT5uZXdfdGFncyA9IFRSVUU7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmICghcmV0KQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gR1NUX0FHR1JFR0FUT1JfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNpbmtfZXZlbnQgKGFnZ3JlZ2F0b3IsIHBhZCwKKyAgICAgIGV2ZW50KTs7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2Zsdl9tdXhfdmlkZW9fcGFkX3NldGNhcHMgKEdzdEZsdk11eFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdEZsdk11eCAqbXV4ID0gR1NUX0ZMVl9NVVggKGdzdF9wYWRfZ2V0X3BhcmVudCAocGFkKSk7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIEdzdFN0cnVjdHVyZSAqczsKKworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKHN0cmNtcCAoZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyksICJ2aWRlby94LWZsYXNoLXZpZGVvIikgPT0gMCkgeworICAgIHBhZC0+Y29kZWMgPSAyOworICB9IGVsc2UgaWYgKHN0cmNtcCAoZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyksICJ2aWRlby94LWZsYXNoLXNjcmVlbiIpID09IDApIHsKKyAgICBwYWQtPmNvZGVjID0gMzsKKyAgfSBlbHNlIGlmIChzdHJjbXAgKGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHMpLCAidmlkZW8veC12cDYtZmxhc2giKSA9PSAwKSB7CisgICAgcGFkLT5jb2RlYyA9IDQ7CisgIH0gZWxzZSBpZiAoc3RyY21wIChnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzKSwgInZpZGVvL3gtdnA2LWFscGhhIikgPT0gMCkgeworICAgIHBhZC0+Y29kZWMgPSA1OworICB9IGVsc2UgaWYgKHN0cmNtcCAoZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyksICJ2aWRlby94LWgyNjQiKSA9PSAwKSB7CisgICAgcGFkLT5jb2RlYyA9IDc7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gRkFMU0U7CisgIH0KKworICBpZiAocmV0ICYmIGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAiY29kZWNfZGF0YSIpKSB7CisgICAgY29uc3QgR1ZhbHVlICp2YWwgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgImNvZGVjX2RhdGEiKTsKKworICAgIGlmICh2YWwpCisgICAgICBwYWQtPmNvZGVjX2RhdGEgPSBnc3RfYnVmZmVyX3JlZiAoZ3N0X3ZhbHVlX2dldF9idWZmZXIgKHZhbCkpOworICB9CisKKyAgZ3N0X29iamVjdF91bnJlZiAobXV4KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbHZfbXV4X2F1ZGlvX3BhZF9zZXRjYXBzIChHc3RGbHZNdXhQYWQgKiBwYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RGbHZNdXggKm11eCA9IEdTVF9GTFZfTVVYIChnc3RfcGFkX2dldF9wYXJlbnQgKHBhZCkpOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIGlmIChzdHJjbXAgKGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHMpLCAiYXVkaW8veC1hZHBjbSIpID09IDApIHsKKyAgICBjb25zdCBnY2hhciAqbGF5b3V0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAibGF5b3V0Iik7CisgICAgaWYgKGxheW91dCAmJiBzdHJjbXAgKGxheW91dCwgInN3ZiIpID09IDApIHsKKyAgICAgIHBhZC0+Y29kZWMgPSAxOworICAgIH0gZWxzZSB7CisgICAgICByZXQgPSBGQUxTRTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyY21wIChnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzKSwgImF1ZGlvL21wZWciKSA9PSAwKSB7CisgICAgZ2ludCBtcGVndmVyc2lvbjsKKworICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJtcGVndmVyc2lvbiIsICZtcGVndmVyc2lvbikpIHsKKyAgICAgIGlmIChtcGVndmVyc2lvbiA9PSAxKSB7CisgICAgICAgIGdpbnQgbGF5ZXI7CisKKyAgICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImxheWVyIiwgJmxheWVyKSAmJiBsYXllciA9PSAzKSB7CisgICAgICAgICAgZ2ludCByYXRlOworCisgICAgICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgInJhdGUiLCAmcmF0ZSkgJiYgcmF0ZSA9PSA4MDAwKQorICAgICAgICAgICAgcGFkLT5jb2RlYyA9IDE0OworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBhZC0+Y29kZWMgPSAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldCA9IEZBTFNFOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKG1wZWd2ZXJzaW9uID09IDQgfHwgbXBlZ3ZlcnNpb24gPT0gMikgeworICAgICAgICBwYWQtPmNvZGVjID0gMTA7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBGQUxTRTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0ID0gRkFMU0U7CisgICAgfQorICB9IGVsc2UgaWYgKHN0cmNtcCAoZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyksICJhdWRpby94LW5lbGx5bW9zZXIiKSA9PSAwKSB7CisgICAgZ2ludCByYXRlLCBjaGFubmVsczsKKworICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJyYXRlIiwgJnJhdGUpCisgICAgICAgICYmIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImNoYW5uZWxzIiwgJmNoYW5uZWxzKSkgeworICAgICAgaWYgKGNoYW5uZWxzID09IDEgJiYgcmF0ZSA9PSAxNjAwMCkKKyAgICAgICAgcGFkLT5jb2RlYyA9IDQ7CisgICAgICBlbHNlIGlmIChjaGFubmVscyA9PSAxICYmIHJhdGUgPT0gODAwMCkKKyAgICAgICAgcGFkLT5jb2RlYyA9IDU7CisgICAgICBlbHNlCisgICAgICAgIHBhZC0+Y29kZWMgPSA2OworICAgIH0gZWxzZSB7CisgICAgICBwYWQtPmNvZGVjID0gNjsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyY21wIChnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzKSwgImF1ZGlvL3gtcmF3IikgPT0gMCkgeworICAgIEdzdEF1ZGlvSW5mbyBpbmZvOworCisgICAgaWYgKGdzdF9hdWRpb19pbmZvX2Zyb21fY2FwcyAoJmluZm8sIGNhcHMpKSB7CisgICAgICBwYWQtPmNvZGVjID0gMzsKKworICAgICAgaWYgKEdTVF9BVURJT19JTkZPX1dJRFRIICgmaW5mbykgPT0gOCkKKyAgICAgICAgcGFkLT53aWR0aCA9IDA7CisgICAgICBlbHNlIGlmIChHU1RfQVVESU9fSU5GT19XSURUSCAoJmluZm8pID09IDE2KQorICAgICAgICBwYWQtPndpZHRoID0gMTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgfSBlbHNlCisgICAgICByZXQgPSBGQUxTRTsKKyAgfSBlbHNlIGlmIChzdHJjbXAgKGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHMpLCAiYXVkaW8veC1hbGF3IikgPT0gMCkgeworICAgIHBhZC0+Y29kZWMgPSA3OworICB9IGVsc2UgaWYgKHN0cmNtcCAoZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyksICJhdWRpby94LW11bGF3IikgPT0gMCkgeworICAgIHBhZC0+Y29kZWMgPSA4OworICB9IGVsc2UgaWYgKHN0cmNtcCAoZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyksICJhdWRpby94LXNwZWV4IikgPT0gMCkgeworICAgIHBhZC0+Y29kZWMgPSAxMTsKKyAgfSBlbHNlIHsKKyAgICByZXQgPSBGQUxTRTsKKyAgfQorCisgIGlmIChyZXQpIHsKKyAgICBnaW50IHJhdGUsIGNoYW5uZWxzOworCisgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgInJhdGUiLCAmcmF0ZSkpIHsKKyAgICAgIGlmIChwYWQtPmNvZGVjID09IDEwKQorICAgICAgICBwYWQtPnJhdGUgPSAzOworICAgICAgZWxzZSBpZiAocmF0ZSA9PSA1NTEyKQorICAgICAgICBwYWQtPnJhdGUgPSAwOworICAgICAgZWxzZSBpZiAocmF0ZSA9PSAxMTAyNSkKKyAgICAgICAgcGFkLT5yYXRlID0gMTsKKyAgICAgIGVsc2UgaWYgKHJhdGUgPT0gMjIwNTApCisgICAgICAgIHBhZC0+cmF0ZSA9IDI7CisgICAgICBlbHNlIGlmIChyYXRlID09IDQ0MTAwKQorICAgICAgICBwYWQtPnJhdGUgPSAzOworICAgICAgZWxzZSBpZiAocmF0ZSA9PSA4MDAwICYmIChwYWQtPmNvZGVjID09IDUgfHwgcGFkLT5jb2RlYyA9PSAxNCkpCisgICAgICAgIHBhZC0+cmF0ZSA9IDA7CisgICAgICBlbHNlIGlmIChyYXRlID09IDE2MDAwICYmIChwYWQtPmNvZGVjID09IDQgfHwgcGFkLT5jb2RlYyA9PSAxMSkpCisgICAgICAgIHBhZC0+cmF0ZSA9IDA7CisgICAgICBlbHNlCisgICAgICAgIHJldCA9IEZBTFNFOworICAgIH0gZWxzZSBpZiAocGFkLT5jb2RlYyA9PSAxMCkgeworICAgICAgcGFkLT5yYXRlID0gMzsKKyAgICB9IGVsc2UgeworICAgICAgcmV0ID0gRkFMU0U7CisgICAgfQorCisgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImNoYW5uZWxzIiwgJmNoYW5uZWxzKSkgeworICAgICAgaWYgKHBhZC0+Y29kZWMgPT0gNCB8fCBwYWQtPmNvZGVjID09IDUKKyAgICAgICAgICB8fCBwYWQtPmNvZGVjID09IDYgfHwgcGFkLT5jb2RlYyA9PSAxMSkKKyAgICAgICAgcGFkLT5jaGFubmVscyA9IDA7CisgICAgICBlbHNlIGlmIChwYWQtPmNvZGVjID09IDEwKQorICAgICAgICBwYWQtPmNoYW5uZWxzID0gMTsKKyAgICAgIGVsc2UgaWYgKGNoYW5uZWxzID09IDEpCisgICAgICAgIHBhZC0+Y2hhbm5lbHMgPSAwOworICAgICAgZWxzZSBpZiAoY2hhbm5lbHMgPT0gMikKKyAgICAgICAgcGFkLT5jaGFubmVscyA9IDE7CisgICAgICBlbHNlCisgICAgICAgIHJldCA9IEZBTFNFOworICAgIH0gZWxzZSBpZiAocGFkLT5jb2RlYyA9PSA0IHx8IHBhZC0+Y29kZWMgPT0gNSB8fCBwYWQtPmNvZGVjID09IDYpIHsKKyAgICAgIHBhZC0+Y2hhbm5lbHMgPSAwOworICAgIH0gZWxzZSBpZiAocGFkLT5jb2RlYyA9PSAxMCkgeworICAgICAgcGFkLT5jaGFubmVscyA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldCA9IEZBTFNFOworICAgIH0KKworICAgIGlmIChwYWQtPmNvZGVjICE9IDMpCisgICAgICBwYWQtPndpZHRoID0gMTsKKyAgfQorCisgIGlmIChyZXQgJiYgZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHMsICJjb2RlY19kYXRhIikpIHsKKyAgICBjb25zdCBHVmFsdWUgKnZhbCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAiY29kZWNfZGF0YSIpOworCisgICAgaWYgKHZhbCkKKyAgICAgIHBhZC0+Y29kZWNfZGF0YSA9IGdzdF9idWZmZXJfcmVmIChnc3RfdmFsdWVfZ2V0X2J1ZmZlciAodmFsKSk7CisgIH0KKworICBnc3Rfb2JqZWN0X3VucmVmIChtdXgpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X211eF9yZXNldF9wYWQgKEdzdEZsdk11eFBhZCAqIHBhZCkKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAicmVzZXR0aW5nIHBhZCIpOworCisgIGlmIChwYWQtPmNvZGVjX2RhdGEpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAocGFkLT5jb2RlY19kYXRhKTsKKyAgcGFkLT5jb2RlY19kYXRhID0gTlVMTDsKKyAgcGFkLT5jb2RlYyA9IEdfTUFYVUlOVDsKKyAgcGFkLT5yYXRlID0gR19NQVhVSU5UOworICBwYWQtPndpZHRoID0gR19NQVhVSU5UOworICBwYWQtPmNoYW5uZWxzID0gR19NQVhVSU5UOworCisgIGdzdF9mbHZfbXV4X3BhZF9mbHVzaCAoR1NUX0FHR1JFR0FUT1JfUEFEX0NBU1QgKHBhZCksIE5VTEwpOworfQorCitzdGF0aWMgR3N0QWdncmVnYXRvclBhZCAqCitnc3RfZmx2X211eF9jcmVhdGVfbmV3X3BhZCAoR3N0QWdncmVnYXRvciAqIGFnZywKKyAgICBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLCBjb25zdCBnY2hhciAqIHJlcV9uYW1lLCBjb25zdCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICprbGFzcyA9IEdTVF9FTEVNRU5UX0dFVF9DTEFTUyAoYWdnKTsKKyAgR3N0QWdncmVnYXRvclBhZCAqYWdncGFkOworICBHc3RGbHZNdXggKm11eCA9IEdTVF9GTFZfTVVYIChhZ2cpOworICBHc3RGbHZNdXhQYWQgKnBhZCA9IE5VTEw7CisgIGNvbnN0IGdjaGFyICpuYW1lID0gTlVMTDsKKyAgZ2Jvb2xlYW4gdmlkZW87CisKKyAgaWYgKG11eC0+c3RhdGUgIT0gR1NUX0ZMVl9NVVhfU1RBVEVfSEVBREVSKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsICJDYW4ndCByZXF1ZXN0IHBhZHMgYWZ0ZXIgd3JpdGluZyBoZWFkZXIiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmICh0ZW1wbCA9PSBnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywgImF1ZGlvIikpIHsKKyAgICBpZiAobXV4LT5hdWRpb19wYWQpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXV4LCAiQWxyZWFkeSBoYXZlIGFuIGF1ZGlvIHBhZCIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG5hbWUgPSAiYXVkaW8iOworICAgIHZpZGVvID0gRkFMU0U7CisgIH0gZWxzZSBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJ2aWRlbyIpKSB7CisgICAgaWYgKG11eC0+dmlkZW9fcGFkKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgIkFscmVhZHkgaGF2ZSBhIHZpZGVvIHBhZCIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG5hbWUgPSAidmlkZW8iOworICAgIHZpZGVvID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgIkludmFsaWQgdGVtcGxhdGUiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGFnZ3BhZCA9CisgICAgICBHU1RfQUdHUkVHQVRPUl9DTEFTUyAoZ3N0X2Zsdl9tdXhfcGFyZW50X2NsYXNzKS0+Y3JlYXRlX25ld19wYWQgKGFnZywKKyAgICAgIHRlbXBsLCBuYW1lLCBjYXBzKTsKKyAgaWYgKGFnZ3BhZCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHBhZCA9IEdTVF9GTFZfTVVYX1BBRCAoYWdncGFkKTsKKworICBnc3RfZmx2X211eF9yZXNldF9wYWQgKHBhZCk7CisKKyAgaWYgKHZpZGVvKQorICAgIG11eC0+dmlkZW9fcGFkID0gcGFkOworICBlbHNlCisgICAgbXV4LT5hdWRpb19wYWQgPSBwYWQ7CisKKyAgcmV0dXJuIGFnZ3BhZDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9mbHZfbXV4X3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKQoreworICBHc3RGbHZNdXggKm11eCA9IEdTVF9GTFZfTVVYIChlbGVtZW50KTsKKyAgR3N0Rmx2TXV4UGFkICpmbHZwYWQgPSBHU1RfRkxWX01VWF9QQUQgKHBhZCk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChwYWQsIEZBTFNFKTsKKyAgZ3N0X2Zsdl9tdXhfcmVzZXRfcGFkIChmbHZwYWQpOworCisgIGlmIChmbHZwYWQgPT0gbXV4LT52aWRlb19wYWQpIHsKKyAgICBtdXgtPnZpZGVvX3BhZCA9IE5VTEw7CisgIH0gZWxzZSBpZiAoZmx2cGFkID09IG11eC0+YXVkaW9fcGFkKSB7CisgICAgbXV4LT5hdWRpb19wYWQgPSBOVUxMOworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFkLCAiUGFkIGlzIG5vdCBrbm93biBhdWRpbyBvciB2aWRlbyBwYWQiKTsKKyAgfQorCisgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKGVsZW1lbnQsIHBhZCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZmx2X211eF9wdXNoIChHc3RGbHZNdXggKiBtdXgsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgLyogcHVzaGluZyB0aGUgYnVmZmVyIHRoYXQgcmV3cml0ZXMgdGhlIGhlYWRlciB3aWxsIG1ha2UgaXQgbm8gbG9uZ2VyIGJlIHRoZQorICAgKiB0b3RhbCBvdXRwdXQgc2l6ZSBpbiBieXRlcywgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyIGF0IHRoYXQgcG9pbnQgKi8KKyAgbXV4LT5ieXRlX2NvdW50ICs9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcik7CisKKyAgcmV0dXJuIGdzdF9hZ2dyZWdhdG9yX2ZpbmlzaF9idWZmZXIgKEdTVF9BR0dSRUdBVE9SX0NBU1QgKG11eCksIGJ1ZmZlcik7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X2Zsdl9tdXhfY3JlYXRlX2hlYWRlciAoR3N0Rmx2TXV4ICogbXV4KQoreworICBHc3RCdWZmZXIgKmhlYWRlcjsKKyAgZ3VpbnQ4ICpkYXRhOworICBnYm9vbGVhbiBoYXZlX2F1ZGlvOworICBnYm9vbGVhbiBoYXZlX3ZpZGVvOworCisgIF9nc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDkgKyA0LCAmaGVhZGVyLCAmZGF0YSk7CisKKyAgZGF0YVswXSA9ICdGJzsKKyAgZGF0YVsxXSA9ICdMJzsKKyAgZGF0YVsyXSA9ICdWJzsKKyAgZGF0YVszXSA9IDB4MDE7ICAgICAgICAgICAgICAgLyogVmVyc2lvbiAqLworCisgIGhhdmVfYXVkaW8gPSAobXV4LT5hdWRpb19wYWQgJiYgbXV4LT5hdWRpb19wYWQtPmNvZGVjICE9IEdfTUFYVUlOVCk7CisgIGhhdmVfdmlkZW8gPSAobXV4LT52aWRlb19wYWQgJiYgbXV4LT52aWRlb19wYWQtPmNvZGVjICE9IEdfTUFYVUlOVCk7CisKKyAgZGF0YVs0XSA9IChoYXZlX2F1ZGlvIDw8IDIpIHwgaGF2ZV92aWRlbzsgICAgIC8qIGZsYWdzICovCisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEgKyA1LCA5KTsgICAgLyogZGF0YSBvZmZzZXQgKi8KKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDksIDApOyAgICAvKiBwcmV2aW91cyB0YWcgc2l6ZSAqLworCisgIHJldHVybiBoZWFkZXI7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X2Zsdl9tdXhfcHJlYWxsb2NhdGVfaW5kZXggKEdzdEZsdk11eCAqIG11eCkKK3sKKyAgR3N0QnVmZmVyICp0bXA7CisgIGd1aW50OCAqZGF0YTsKKyAgZ2ludCBwcmVhbGxvY2F0ZV9zaXplOworCisgIC8qIHByZWFsbG9jYXRlIGluZGV4IG9mIHNpemU6CisgICAqICAtICdrZXlmcmFtZXMnIEVDTUEgYXJyYXkga2V5OiAyICsgOSA9IDExIGJ5dGVzCisgICAqICAtIG5lc3RlZCBFQ01BIGFycmF5IGhlYWRlciwgbGVuZ3RoIGFuZCBlbmQgbWFya2VyOiA4IGJ5dGVzCisgICAqICAtICd0aW1lcycgYW5kICdmaWxlcG9zaXRpb25zJyBrZXlzOiAyMiBieXRlcworICAgKiAgLSB0d28gc3RyaWN0IGFycmF5cyBoZWFkZXJzIGFuZCBsZW5ndGhzOiAxMCBieXRlcworICAgKiAgLSBlYWNoIGluZGV4IGVudHJ5OiAxOCBieXRlcworICAgKi8KKyAgcHJlYWxsb2NhdGVfc2l6ZSA9IDExICsgOCArIDIyICsgMTAgKyBNQVhfSU5ERVhfRU5UUklFUyAqIDE4OworICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJwcmVhbGxvY2F0aW5nICVkIGJ5dGVzIGZvciB0aGUgaW5kZXgiLAorICAgICAgcHJlYWxsb2NhdGVfc2l6ZSk7CisKKyAgX2dzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAocHJlYWxsb2NhdGVfc2l6ZSwgJnRtcCwgJmRhdGEpOworCisgIC8qIHByZWZpbGwgdGhlIHNwYWNlIHdpdGggYSBnc3RmaWxsZXI6IDxzcGFjZXM+IHNjcmlwdCB0YWcgdmFyaWFibGUgKi8KKyAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoZGF0YSwgOSk7ICAgICAgICAvKiA5IGNoYXJhY3RlcnMgKi8KKyAgbWVtY3B5IChkYXRhICsgMiwgImdzdGZpbGxlciIsIDkpOworICBHU1RfV1JJVEVfVUlOVDggKGRhdGEgKyAxMSwgQU1GMF9TVFJJTkdfTUFSS0VSKTsgICAgICAvKiBhIHN0cmluZyB2YWx1ZSAqLworICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhICsgMTIsIHByZWFsbG9jYXRlX3NpemUgLSAxNCk7CisgIG1lbXNldCAoZGF0YSArIDE0LCAnICcsIHByZWFsbG9jYXRlX3NpemUgLSAxNCk7ICAgICAgIC8qIHRoZSByZXN0IGlzIHNwYWNlcyAqLworICByZXR1cm4gdG1wOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9mbHZfbXV4X2NyZWF0ZV9udW1iZXJfc2NyaXB0X3ZhbHVlIChjb25zdCBnY2hhciAqIG5hbWUsIGdkb3VibGUgdmFsdWUpCit7CisgIEdzdEJ1ZmZlciAqdG1wOworICBndWludDggKmRhdGE7CisgIGdzaXplIGxlbiA9IHN0cmxlbiAobmFtZSk7CisKKyAgX2dzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMiArIGxlbiArIDEgKyA4LCAmdG1wLCAmZGF0YSk7CisKKyAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoZGF0YSwgbGVuKTsKKyAgZGF0YSArPSAyOyAgICAgICAgICAgICAgICAgICAgLyogbmFtZSBsZW5ndGggKi8KKyAgbWVtY3B5IChkYXRhLCBuYW1lLCBsZW4pOworICBkYXRhICs9IGxlbjsKKyAgKmRhdGErKyA9IEFNRjBfTlVNQkVSX01BUktFUjsgLyogZG91YmxlIHR5cGUgKi8KKyAgR1NUX1dSSVRFX0RPVUJMRV9CRSAoZGF0YSwgdmFsdWUpOworCisgIHJldHVybiB0bXA7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X2Zsdl9tdXhfY3JlYXRlX21ldGFkYXRhIChHc3RGbHZNdXggKiBtdXgsIGdib29sZWFuIGZ1bGwpCit7CisgIGNvbnN0IEdzdFRhZ0xpc3QgKnRhZ3M7CisgIEdzdEJ1ZmZlciAqc2NyaXB0X3RhZywgKnRtcDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YTsKKyAgZ2ludCBpLCBuX3RhZ3MsIHRhZ3Nfd3JpdHRlbiA9IDA7CisKKyAgdGFncyA9IGdzdF90YWdfc2V0dGVyX2dldF90YWdfbGlzdCAoR1NUX1RBR19TRVRURVIgKG11eCkpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgInRhZ3MgPSAlIiBHU1RfUFRSX0ZPUk1BVCwgdGFncyk7CisKKyAgLyogRklYTUUgcGVyaGFwcyBzb21lIGJ5dGV3cml0ZXInaW5nIGhlcmUgLi4uICovCisKKyAgX2dzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTEsICZzY3JpcHRfdGFnLCAmZGF0YSk7CisKKyAgZGF0YVswXSA9IDE4OworCisgIC8qIERhdGEgc2l6ZSwgdW5rbm93biBmb3Igbm93ICovCisgIGRhdGFbMV0gPSAwOworICBkYXRhWzJdID0gMDsKKyAgZGF0YVszXSA9IDA7CisKKyAgLyogVGltZXN0YW1wICovCisgIGRhdGFbNF0gPSBkYXRhWzVdID0gZGF0YVs2XSA9IGRhdGFbN10gPSAwOworCisgIC8qIFN0cmVhbSBJRCAqLworICBkYXRhWzhdID0gZGF0YVs5XSA9IGRhdGFbMTBdID0gMDsKKworICBfZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMywgJnRtcCwgJmRhdGEpOworICBkYXRhWzBdID0gQU1GMF9TVFJJTkdfTUFSS0VSOyAvKiBzdHJpbmcgKi8KKyAgZGF0YVsxXSA9IDA7CisgIGRhdGFbMl0gPSAxMDsgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCAxMCAqLworICBtZW1jcHkgKCZkYXRhWzNdLCAib25NZXRhRGF0YSIsIDEwKTsKKworICBzY3JpcHRfdGFnID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKHNjcmlwdF90YWcsIHRtcCk7CisKKyAgbl90YWdzID0gKHRhZ3MpID8gZ3N0X3RhZ19saXN0X25fdGFncyAodGFncykgOiAwOworICBfZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg1LCAmdG1wLCAmZGF0YSk7CisgIGRhdGFbMF0gPSA4OyAgICAgICAgICAgICAgICAgIC8qIEVDTUEgYXJyYXkgKi8KKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDEsIG5fdGFncyk7CisgIHNjcmlwdF90YWcgPSBnc3RfYnVmZmVyX2FwcGVuZCAoc2NyaXB0X3RhZywgdG1wKTsKKworICBpZiAoIWZ1bGwpCisgICAgZ290byB0YWdzOworCisgIC8qIFNvbWUgcGxheWVycyBleHBlY3QgdGhlICdkdXJhdGlvbicgdG8gYmUgYWx3YXlzIHNldC4gRmlsbCBpdCBvdXQgbGF0ZXIsCisgICAgIGFmdGVyIHF1ZXJ5aW5nIHRoZSBwYWRzIG9yIGFmdGVyIGdldHRpbmcgRU9TICovCisgIGlmICghbXV4LT5zdHJlYW1hYmxlKSB7CisgICAgdG1wID0gZ3N0X2Zsdl9tdXhfY3JlYXRlX251bWJlcl9zY3JpcHRfdmFsdWUgKCJkdXJhdGlvbiIsIDg2NDAwKTsKKyAgICBzY3JpcHRfdGFnID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKHNjcmlwdF90YWcsIHRtcCk7CisgICAgdGFnc193cml0dGVuKys7CisKKyAgICAvKiBTb21ldGltZXMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0b3RhbCBmaWxlIHNpemUgaXMgdXNlZnVsIGZvciB0aGUKKyAgICAgICBwbGF5ZXIuIEl0IHdpbGwgYmUgZmlsbGVkIGxhdGVyLCBhZnRlciBnZXR0aW5nIEVPUyAqLworICAgIHRtcCA9IGdzdF9mbHZfbXV4X2NyZWF0ZV9udW1iZXJfc2NyaXB0X3ZhbHVlICgiZmlsZXNpemUiLCAwKTsKKyAgICBzY3JpcHRfdGFnID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKHNjcmlwdF90YWcsIHRtcCk7CisgICAgdGFnc193cml0dGVuKys7CisKKyAgICAvKiBQcmVhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGluZGV4IHRvIGJlIHdyaXR0ZW4gYXQgRU9TICovCisgICAgdG1wID0gZ3N0X2Zsdl9tdXhfcHJlYWxsb2NhdGVfaW5kZXggKG11eCk7CisgICAgc2NyaXB0X3RhZyA9IGdzdF9idWZmZXJfYXBwZW5kIChzY3JpcHRfdGFnLCB0bXApOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgIm5vdCBwcmVhbGxvY2F0aW5nIGluZGV4LCBzdHJlYW1hYmxlIG1vZGUiKTsKKyAgfQorCit0YWdzOgorICBmb3IgKGkgPSAwOyB0YWdzICYmIGkgPCBuX3RhZ3M7IGkrKykgeworICAgIGNvbnN0IGdjaGFyICp0YWdfbmFtZSA9IGdzdF90YWdfbGlzdF9udGhfdGFnX25hbWUgKHRhZ3MsIGkpOworICAgIGlmICghc3RyY21wICh0YWdfbmFtZSwgR1NUX1RBR19EVVJBVElPTikpIHsKKyAgICAgIGd1aW50NjQgZHVyOworCisgICAgICBpZiAoIWdzdF90YWdfbGlzdF9nZXRfdWludDY0ICh0YWdzLCBHU1RfVEFHX0RVUkFUSU9OLCAmZHVyKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBtdXgtPmR1cmF0aW9uID0gZHVyOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcCAodGFnX25hbWUsIEdTVF9UQUdfQVJUSVNUKSB8fAorICAgICAgICAhc3RyY21wICh0YWdfbmFtZSwgR1NUX1RBR19USVRMRSkpIHsKKyAgICAgIGdjaGFyICpzOworICAgICAgY29uc3QgZ2NoYXIgKnQgPSBOVUxMOworCisgICAgICBpZiAoIXN0cmNtcCAodGFnX25hbWUsIEdTVF9UQUdfQVJUSVNUKSkKKyAgICAgICAgdCA9ICJjcmVhdG9yIjsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKHRhZ19uYW1lLCBHU1RfVEFHX1RJVExFKSkKKyAgICAgICAgdCA9ICJ0aXRsZSI7CisKKyAgICAgIGlmICghZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ3MsIHRhZ19uYW1lLCAmcykpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBfZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgyICsgc3RybGVuICh0KSArIDEgKyAyICsgc3RybGVuIChzKSwKKyAgICAgICAgICAmdG1wLCAmZGF0YSk7CisgICAgICBkYXRhWzBdID0gMDsgICAgICAgICAgICAgIC8qIHRhZyBuYW1lIGxlbmd0aCAqLworICAgICAgZGF0YVsxXSA9IHN0cmxlbiAodCk7CisgICAgICBtZW1jcHkgKCZkYXRhWzJdLCB0LCBzdHJsZW4gKHQpKTsKKyAgICAgIGRhdGFbMiArIHN0cmxlbiAodCldID0gMjsgLyogc3RyaW5nICovCisgICAgICBkYXRhWzMgKyBzdHJsZW4gKHQpXSA9IChzdHJsZW4gKHMpID4+IDgpICYgMHhmZjsKKyAgICAgIGRhdGFbNCArIHN0cmxlbiAodCldID0gKHN0cmxlbiAocykpICYgMHhmZjsKKyAgICAgIG1lbWNweSAoJmRhdGFbNSArIHN0cmxlbiAodCldLCBzLCBzdHJsZW4gKHMpKTsKKyAgICAgIHNjcmlwdF90YWcgPSBnc3RfYnVmZmVyX2FwcGVuZCAoc2NyaXB0X3RhZywgdG1wKTsKKworICAgICAgZ19mcmVlIChzKTsKKyAgICAgIHRhZ3Nfd3JpdHRlbisrOworICAgIH0KKyAgfQorCisgIGlmICghZnVsbCkKKyAgICBnb3RvIGVuZDsKKworICBpZiAobXV4LT5kdXJhdGlvbiA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgR0xpc3QgKmw7CisgICAgZ3VpbnQ2NCBkdXI7CisKKyAgICBmb3IgKGwgPSBHU1RfRUxFTUVOVF9DQVNUIChtdXgpLT5zaW5rcGFkczsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICAgIEdzdEZsdk11eFBhZCAqcGFkID0gR1NUX0ZMVl9NVVhfUEFEIChsLT5kYXRhKTsKKworICAgICAgaWYgKGdzdF9wYWRfcGVlcl9xdWVyeV9kdXJhdGlvbiAoR1NUX1BBRCAocGFkKSwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICAgICAgICAoZ2ludDY0ICopICYgZHVyKSAmJiBkdXIgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgICAgICBpZiAobXV4LT5kdXJhdGlvbiA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgICAgICAgIG11eC0+ZHVyYXRpb24gPSBkdXI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtdXgtPmR1cmF0aW9uID0gTUFYIChkdXIsIG11eC0+ZHVyYXRpb24pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmICghbXV4LT5zdHJlYW1hYmxlICYmIG11eC0+ZHVyYXRpb24gIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgIGdkb3VibGUgZDsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgIGQgPSBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIChtdXgtPmR1cmF0aW9uKTsKKyAgICBkIC89IChnZG91YmxlKSBHU1RfU0VDT05EOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAiZGV0ZXJtaW5lZCB0aGUgZHVyYXRpb24gdG8gYmUgJWYiLCBkKTsKKyAgICBnc3RfYnVmZmVyX21hcCAoc2NyaXB0X3RhZywgJm1hcCwgR1NUX01BUF9XUklURSk7CisgICAgR1NUX1dSSVRFX0RPVUJMRV9CRSAobWFwLmRhdGEgKyAyOSArIDIgKyA4ICsgMSwgZCk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoc2NyaXB0X3RhZywgJm1hcCk7CisgIH0KKworICBpZiAobXV4LT52aWRlb19wYWQgJiYgbXV4LT52aWRlb19wYWQtPmNvZGVjICE9IEdfTUFYVUlOVCkgeworICAgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworCisgICAgaWYgKG11eC0+dmlkZW9fcGFkKQorICAgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX1BBRCAobXV4LT52aWRlb19wYWQpKTsKKworICAgIGlmIChjYXBzICE9IE5VTEwpIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqczsKKyAgICAgIGdpbnQgc2l6ZTsKKyAgICAgIGdpbnQgbnVtLCBkZW47CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgInB1dHRpbmcgdmlkZW9jb2RlY2lkICVkIGluIHRoZSBtZXRhZGF0YSIsCisgICAgICAgICAgbXV4LT52aWRlb19wYWQtPmNvZGVjKTsKKworICAgICAgdG1wID0gZ3N0X2Zsdl9tdXhfY3JlYXRlX251bWJlcl9zY3JpcHRfdmFsdWUgKCJ2aWRlb2NvZGVjaWQiLAorICAgICAgICAgIG11eC0+dmlkZW9fcGFkLT5jb2RlYyk7CisgICAgICBzY3JpcHRfdGFnID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKHNjcmlwdF90YWcsIHRtcCk7CisgICAgICB0YWdzX3dyaXR0ZW4rKzsKKworICAgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzLCAid2lkdGgiLCAmc2l6ZSkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAicHV0dGluZyB3aWR0aCAlZCBpbiB0aGUgbWV0YWRhdGEiLCBzaXplKTsKKworICAgICAgICB0bXAgPSBnc3RfZmx2X211eF9jcmVhdGVfbnVtYmVyX3NjcmlwdF92YWx1ZSAoIndpZHRoIiwgc2l6ZSk7CisgICAgICAgIHNjcmlwdF90YWcgPSBnc3RfYnVmZmVyX2FwcGVuZCAoc2NyaXB0X3RhZywgdG1wKTsKKyAgICAgICAgdGFnc193cml0dGVuKys7CisgICAgICB9CisKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJoZWlnaHQiLCAmc2l6ZSkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAicHV0dGluZyBoZWlnaHQgJWQgaW4gdGhlIG1ldGFkYXRhIiwgc2l6ZSk7CisKKyAgICAgICAgdG1wID0gZ3N0X2Zsdl9tdXhfY3JlYXRlX251bWJlcl9zY3JpcHRfdmFsdWUgKCJoZWlnaHQiLCBzaXplKTsKKyAgICAgICAgc2NyaXB0X3RhZyA9IGdzdF9idWZmZXJfYXBwZW5kIChzY3JpcHRfdGFnLCB0bXApOworICAgICAgICB0YWdzX3dyaXR0ZW4rKzsKKyAgICAgIH0KKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ZyYWN0aW9uIChzLCAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgJm51bSwgJmRlbikpIHsKKyAgICAgICAgZ2RvdWJsZSBkOworCisgICAgICAgIGQgPSBudW07CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgInB1dHRpbmcgQXNwZWN0UmF0aW9YICVmIGluIHRoZSBtZXRhZGF0YSIsIGQpOworCisgICAgICAgIHRtcCA9IGdzdF9mbHZfbXV4X2NyZWF0ZV9udW1iZXJfc2NyaXB0X3ZhbHVlICgiQXNwZWN0UmF0aW9YIiwgZCk7CisgICAgICAgIHNjcmlwdF90YWcgPSBnc3RfYnVmZmVyX2FwcGVuZCAoc2NyaXB0X3RhZywgdG1wKTsKKyAgICAgICAgdGFnc193cml0dGVuKys7CisKKyAgICAgICAgZCA9IGRlbjsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAicHV0dGluZyBBc3BlY3RSYXRpb1kgJWYgaW4gdGhlIG1ldGFkYXRhIiwgZCk7CisKKyAgICAgICAgdG1wID0gZ3N0X2Zsdl9tdXhfY3JlYXRlX251bWJlcl9zY3JpcHRfdmFsdWUgKCJBc3BlY3RSYXRpb1kiLCBkKTsKKyAgICAgICAgc2NyaXB0X3RhZyA9IGdzdF9idWZmZXJfYXBwZW5kIChzY3JpcHRfdGFnLCB0bXApOworICAgICAgICB0YWdzX3dyaXR0ZW4rKzsKKyAgICAgIH0KKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ZyYWN0aW9uIChzLCAiZnJhbWVyYXRlIiwgJm51bSwgJmRlbikpIHsKKyAgICAgICAgZ2RvdWJsZSBkOworCisgICAgICAgIGdzdF91dGlsX2ZyYWN0aW9uX3RvX2RvdWJsZSAobnVtLCBkZW4sICZkKTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAicHV0dGluZyBmcmFtZXJhdGUgJWYgaW4gdGhlIG1ldGFkYXRhIiwgZCk7CisKKyAgICAgICAgdG1wID0gZ3N0X2Zsdl9tdXhfY3JlYXRlX251bWJlcl9zY3JpcHRfdmFsdWUgKCJmcmFtZXJhdGUiLCBkKTsKKyAgICAgICAgc2NyaXB0X3RhZyA9IGdzdF9idWZmZXJfYXBwZW5kIChzY3JpcHRfdGFnLCB0bXApOworICAgICAgICB0YWdzX3dyaXR0ZW4rKzsKKyAgICAgIH0KKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAicHV0dGluZyB2aWRlb2RhdGFyYXRlICV1IEtCL3MgaW4gdGhlIG1ldGFkYXRhIiwKKyAgICAgICAgICBtdXgtPnZpZGVvX3BhZC0+Yml0cmF0ZSAvIDEwMjQpOworICAgICAgdG1wID0gZ3N0X2Zsdl9tdXhfY3JlYXRlX251bWJlcl9zY3JpcHRfdmFsdWUgKCJ2aWRlb2RhdGFyYXRlIiwKKyAgICAgICAgICBtdXgtPnZpZGVvX3BhZC0+Yml0cmF0ZSAvIDEwMjQpOworICAgICAgc2NyaXB0X3RhZyA9IGdzdF9idWZmZXJfYXBwZW5kIChzY3JpcHRfdGFnLCB0bXApOworICAgICAgdGFnc193cml0dGVuKys7CisgICAgfQorICB9CisKKyAgaWYgKG11eC0+YXVkaW9fcGFkICYmIG11eC0+YXVkaW9fcGFkLT5jb2RlYyAhPSBHX01BWFVJTlQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJwdXR0aW5nIGF1ZGlvY29kZWNpZCAlZCBpbiB0aGUgbWV0YWRhdGEiLAorICAgICAgICBtdXgtPmF1ZGlvX3BhZC0+Y29kZWMpOworCisgICAgdG1wID0gZ3N0X2Zsdl9tdXhfY3JlYXRlX251bWJlcl9zY3JpcHRfdmFsdWUgKCJhdWRpb2NvZGVjaWQiLAorICAgICAgICBtdXgtPmF1ZGlvX3BhZC0+Y29kZWMpOworICAgIHNjcmlwdF90YWcgPSBnc3RfYnVmZmVyX2FwcGVuZCAoc2NyaXB0X3RhZywgdG1wKTsKKyAgICB0YWdzX3dyaXR0ZW4rKzsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgInB1dHRpbmcgYXVkaW9kYXRhcmF0ZSAldSBLQi9zIGluIHRoZSBtZXRhZGF0YSIsCisgICAgICAgIG11eC0+YXVkaW9fcGFkLT5iaXRyYXRlIC8gMTAyNCk7CisgICAgdG1wID0gZ3N0X2Zsdl9tdXhfY3JlYXRlX251bWJlcl9zY3JpcHRfdmFsdWUgKCJhdWRpb2RhdGFyYXRlIiwKKyAgICAgICAgbXV4LT5hdWRpb19wYWQtPmJpdHJhdGUgLyAxMDI0KTsKKyAgICBzY3JpcHRfdGFnID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKHNjcmlwdF90YWcsIHRtcCk7CisgICAgdGFnc193cml0dGVuKys7CisgIH0KKworICBfZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgyICsgMTUgKyAxICsgMiArIHN0cmxlbiAobXV4LT5tZXRhZGF0YWNyZWF0b3IpLAorICAgICAgJnRtcCwgJmRhdGEpOworICBkYXRhWzBdID0gMDsgICAgICAgICAgICAgICAgICAvKiAxNSBieXRlcyBuYW1lICovCisgIGRhdGFbMV0gPSAxNTsKKyAgbWVtY3B5ICgmZGF0YVsyXSwgIm1ldGFkYXRhY3JlYXRvciIsIDE1KTsKKyAgZGF0YVsxN10gPSAyOyAgICAgICAgICAgICAgICAgLyogc3RyaW5nICovCisgIGRhdGFbMThdID0gKHN0cmxlbiAobXV4LT5tZXRhZGF0YWNyZWF0b3IpID4+IDgpICYgMHhmZjsKKyAgZGF0YVsxOV0gPSAoc3RybGVuIChtdXgtPm1ldGFkYXRhY3JlYXRvcikpICYgMHhmZjsKKyAgbWVtY3B5ICgmZGF0YVsyMF0sIG11eC0+bWV0YWRhdGFjcmVhdG9yLCBzdHJsZW4gKG11eC0+bWV0YWRhdGFjcmVhdG9yKSk7CisgIHNjcmlwdF90YWcgPSBnc3RfYnVmZmVyX2FwcGVuZCAoc2NyaXB0X3RhZywgdG1wKTsKKworICB0YWdzX3dyaXR0ZW4rKzsKKworICB7CisgICAgR1RpbWVWYWwgdHYgPSB7IDAsIH07CisgICAgdGltZV90IHNlY3M7CisgICAgc3RydWN0IHRtICp0bTsKKyAgICBnY2hhciAqczsKKyAgICBzdGF0aWMgY29uc3QgZ2NoYXIgKndlZWtkYXlzW10gPSB7CisgICAgICAiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0IgorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGdjaGFyICptb250aHNbXSA9IHsKKyAgICAgICJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsICJKdWwiLAorICAgICAgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiCisgICAgfTsKKworICAgIGdfZ2V0X2N1cnJlbnRfdGltZSAoJnR2KTsKKyAgICBzZWNzID0gdHYudHZfc2VjOworICAgIHRtID0gZ210aW1lICgmc2Vjcyk7CisKKyAgICBzID0gZ19zdHJkdXBfcHJpbnRmICgiJXMgJXMgJWQgJTAyZDolMDJkOiUwMmQgJWQiLCB3ZWVrZGF5c1t0bS0+dG1fd2RheV0sCisgICAgICAgIG1vbnRoc1t0bS0+dG1fbW9uXSwgdG0tPnRtX21kYXksIHRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjLAorICAgICAgICB0bS0+dG1feWVhciArIDE5MDApOworCisgICAgX2dzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMiArIDEyICsgMSArIDIgKyBzdHJsZW4gKHMpLCAmdG1wLCAmZGF0YSk7CisgICAgZGF0YVswXSA9IDA7ICAgICAgICAgICAgICAgIC8qIDEyIGJ5dGVzIG5hbWUgKi8KKyAgICBkYXRhWzFdID0gMTI7CisgICAgbWVtY3B5ICgmZGF0YVsyXSwgImNyZWF0aW9uZGF0ZSIsIDEyKTsKKyAgICBkYXRhWzE0XSA9IDI7ICAgICAgICAgICAgICAgLyogc3RyaW5nICovCisgICAgZGF0YVsxNV0gPSAoc3RybGVuIChzKSA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVsxNl0gPSAoc3RybGVuIChzKSkgJiAweGZmOworICAgIG1lbWNweSAoJmRhdGFbMTddLCBzLCBzdHJsZW4gKHMpKTsKKyAgICBzY3JpcHRfdGFnID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKHNjcmlwdF90YWcsIHRtcCk7CisKKyAgICBnX2ZyZWUgKHMpOworICAgIHRhZ3Nfd3JpdHRlbisrOworICB9CisKK2VuZDoKKworICBpZiAoIXRhZ3Nfd3JpdHRlbikgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKHNjcmlwdF90YWcpOworICAgIHNjcmlwdF90YWcgPSBOVUxMOworICAgIGdvdG8gZXhpdDsKKyAgfQorCisgIF9nc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDIgKyAwICsgMSwgJnRtcCwgJmRhdGEpOworICBkYXRhWzBdID0gMDsgICAgICAgICAgICAgICAgICAvKiAwIGJ5dGUgc2l6ZSAqLworICBkYXRhWzFdID0gMDsKKyAgZGF0YVsyXSA9IDk7ICAgICAgICAgICAgICAgICAgLyogZW5kIG1hcmtlciAqLworICBzY3JpcHRfdGFnID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKHNjcmlwdF90YWcsIHRtcCk7CisKKworICBfZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg0LCAmdG1wLCAmZGF0YSk7CisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEsIGdzdF9idWZmZXJfZ2V0X3NpemUgKHNjcmlwdF90YWcpKTsKKyAgc2NyaXB0X3RhZyA9IGdzdF9idWZmZXJfYXBwZW5kIChzY3JpcHRfdGFnLCB0bXApOworCisgIGdzdF9idWZmZXJfbWFwIChzY3JpcHRfdGFnLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgbWFwLmRhdGFbMV0gPSAoKGdzdF9idWZmZXJfZ2V0X3NpemUgKHNjcmlwdF90YWcpIC0gMTEgLSA0KSA+PiAxNikgJiAweGZmOworICBtYXAuZGF0YVsyXSA9ICgoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoc2NyaXB0X3RhZykgLSAxMSAtIDQpID4+IDgpICYgMHhmZjsKKyAgbWFwLmRhdGFbM10gPSAoKGdzdF9idWZmZXJfZ2V0X3NpemUgKHNjcmlwdF90YWcpIC0gMTEgLSA0KSA+PiAwKSAmIDB4ZmY7CisKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAobWFwLmRhdGEgKyAxMSArIDEzICsgMSwgdGFnc193cml0dGVuKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoc2NyaXB0X3RhZywgJm1hcCk7CisKK2V4aXQ6CisgIHJldHVybiBzY3JpcHRfdGFnOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9mbHZfbXV4X2J1ZmZlcl90b190YWdfaW50ZXJuYWwgKEdzdEZsdk11eCAqIG11eCwgR3N0QnVmZmVyICogYnVmZmVyLAorICAgIEdzdEZsdk11eFBhZCAqIHBhZCwgZ2Jvb2xlYW4gaXNfY29kZWNfZGF0YSkKK3sKKyAgR3N0QnVmZmVyICp0YWc7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludCBzaXplOworICBndWludDMyIHB0cywgZHRzLCBjdHM7CisgIGd1aW50OCAqZGF0YSwgKmJkYXRhID0gTlVMTDsKKyAgZ3NpemUgYnNpemUgPSAwOworCisgIGlmICghR1NUX0NMT0NLX1NUSU1FX0lTX1ZBTElEIChwYWQtPmR0cykpIHsKKyAgICBwdHMgPSBkdHMgPSBwYWQtPmxhc3RfdGltZXN0YW1wIC8gR1NUX01TRUNPTkQ7CisgIH0gZWxzZSB7CisgICAgcHRzID0gcGFkLT5wdHMgLyBHU1RfTVNFQ09ORDsKKyAgICBkdHMgPSBwYWQtPmR0cyAvIEdTVF9NU0VDT05EOworICB9CisKKyAgLyogQmUgc2FmZSBpbiBjYXNlIFRTIGFyZSBidWdneSAqLworICBpZiAocHRzID4gZHRzKQorICAgIGN0cyA9IHB0cyAtIGR0czsKKyAgZWxzZQorICAgIGN0cyA9IDA7CisKKyAgLyogVGltZXN0YW1wIG11c3Qgc3RhcnQgYXQgemVybyAqLworICBpZiAoR1NUX0NMT0NLX1NUSU1FX0lTX1ZBTElEIChtdXgtPmZpcnN0X3RpbWVzdGFtcCkpIHsKKyAgICBkdHMgLT0gbXV4LT5maXJzdF90aW1lc3RhbXAgLyBHU1RfTVNFQ09ORDsKKyAgICBwdHMgPSBkdHMgKyBjdHM7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAobXV4LCAiZ290IHB0cyAlaSBkdHMgJWkgY3RzICVpIiwgcHRzLCBkdHMsIGN0cyk7CisKKyAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBiZGF0YSA9IG1hcC5kYXRhOworICAgIGJzaXplID0gbWFwLnNpemU7CisgIH0KKworICBzaXplID0gMTE7CisgIGlmIChtdXgtPnZpZGVvX3BhZCA9PSBwYWQpIHsKKyAgICBzaXplICs9IDE7CisgICAgaWYgKHBhZC0+Y29kZWMgPT0gNykKKyAgICAgIHNpemUgKz0gNCArIGJzaXplOworICAgIGVsc2UKKyAgICAgIHNpemUgKz0gYnNpemU7CisgIH0gZWxzZSB7CisgICAgc2l6ZSArPSAxOworICAgIGlmIChwYWQtPmNvZGVjID09IDEwKQorICAgICAgc2l6ZSArPSAxICsgYnNpemU7CisgICAgZWxzZQorICAgICAgc2l6ZSArPSBic2l6ZTsKKyAgfQorICBzaXplICs9IDQ7CisKKyAgX2dzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZSwgJnRhZywgJmRhdGEpOworICBtZW1zZXQgKGRhdGEsIDAsIHNpemUpOworCisgIGRhdGFbMF0gPSAobXV4LT52aWRlb19wYWQgPT0gcGFkKSA/IDkgOiA4OworCisgIGRhdGFbMV0gPSAoKHNpemUgLSAxMSAtIDQpID4+IDE2KSAmIDB4ZmY7CisgIGRhdGFbMl0gPSAoKHNpemUgLSAxMSAtIDQpID4+IDgpICYgMHhmZjsKKyAgZGF0YVszXSA9ICgoc2l6ZSAtIDExIC0gNCkgPj4gMCkgJiAweGZmOworCisgIEdTVF9XUklURV9VSU5UMjRfQkUgKGRhdGEgKyA0LCBkdHMpOworICBkYXRhWzddID0gKCgoZ3VpbnQpIGR0cykgPj4gMjQpICYgMHhmZjsKKworICBkYXRhWzhdID0gZGF0YVs5XSA9IGRhdGFbMTBdID0gMDsKKworICBpZiAobXV4LT52aWRlb19wYWQgPT0gcGFkKSB7CisgICAgaWYgKGJ1ZmZlciAmJiBHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChidWZmZXIsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKSkKKyAgICAgIGRhdGFbMTFdIHw9IDIgPDwgNDsKKyAgICBlbHNlCisgICAgICBkYXRhWzExXSB8PSAxIDw8IDQ7CisKKyAgICBkYXRhWzExXSB8PSBwYWQtPmNvZGVjICYgMHgwZjsKKworICAgIGlmIChwYWQtPmNvZGVjID09IDcpIHsKKyAgICAgIGlmIChpc19jb2RlY19kYXRhKSB7CisgICAgICAgIGRhdGFbMTJdID0gMDsKKyAgICAgICAgR1NUX1dSSVRFX1VJTlQyNF9CRSAoZGF0YSArIDEzLCAwKTsKKyAgICAgIH0gZWxzZSBpZiAoYnNpemUgPT0gMCkgeworICAgICAgICAvKiBBVkMgZW5kIG9mIHNlcXVlbmNlICovCisgICAgICAgIGRhdGFbMTJdID0gMjsKKyAgICAgICAgR1NUX1dSSVRFX1VJTlQyNF9CRSAoZGF0YSArIDEzLCAwKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEFDViBOQUxVICovCisgICAgICAgIGRhdGFbMTJdID0gMTsKKyAgICAgICAgR1NUX1dSSVRFX1VJTlQyNF9CRSAoZGF0YSArIDEzLCBjdHMpOworICAgICAgfQorICAgICAgbWVtY3B5IChkYXRhICsgMTEgKyAxICsgNCwgYmRhdGEsIGJzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVtY3B5IChkYXRhICsgMTEgKyAxLCBiZGF0YSwgYnNpemUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBkYXRhWzExXSB8PSAocGFkLT5jb2RlYyA8PCA0KSAmIDB4ZjA7CisgICAgZGF0YVsxMV0gfD0gKHBhZC0+cmF0ZSA8PCAyKSAmIDB4MGM7CisgICAgZGF0YVsxMV0gfD0gKHBhZC0+d2lkdGggPDwgMSkgJiAweDAyOworICAgIGRhdGFbMTFdIHw9IChwYWQtPmNoYW5uZWxzIDw8IDApICYgMHgwMTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgIkNyZWF0aW5nIGJ5dGUgJTAyeCB3aXRoICIKKyAgICAgICAgImNvZGVjOiVkLCByYXRlOiVkLCB3aWR0aDolZCwgY2hhbm5lbHM6JWQiLAorICAgICAgICBkYXRhWzExXSwgcGFkLT5jb2RlYywgcGFkLT5yYXRlLCBwYWQtPndpZHRoLCBwYWQtPmNoYW5uZWxzKTsKKworICAgIGlmIChwYWQtPmNvZGVjID09IDEwKSB7CisgICAgICBkYXRhWzEyXSA9IGlzX2NvZGVjX2RhdGEgPyAwIDogMTsKKworICAgICAgbWVtY3B5IChkYXRhICsgMTEgKyAxICsgMSwgYmRhdGEsIGJzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVtY3B5IChkYXRhICsgMTEgKyAxLCBiZGF0YSwgYnNpemUpOworICAgIH0KKyAgfQorCisgIGlmIChidWZmZXIpCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgc2l6ZSAtIDQsIHNpemUgLSA0KTsKKworICBHU1RfQlVGRkVSX1BUUyAodGFnKSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIEdTVF9CVUZGRVJfRFRTICh0YWcpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAodGFnKSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisKKyAgaWYgKGJ1ZmZlcikgeworICAgIC8qIGlmIHdlIGFyZSBzdHJlYW1hYmxlIHdlIGNvcHkgb3ZlciB0aW1lc3RhbXBzIGFuZCBvZmZzZXRzLAorICAgICAgIGlmIG5vdCBqdXN0IGNvcHkgdGhlIG9mZnNldHMgKi8KKyAgICBpZiAobXV4LT5zdHJlYW1hYmxlKSB7CisgICAgICBnc3RfYnVmZmVyX2NvcHlfaW50byAodGFnLCBidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9USU1FU1RBTVBTLCAwLCAtMSk7CisgICAgICBHU1RfQlVGRkVSX09GRlNFVCAodGFnKSA9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkU7CisgICAgICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKHRhZykgPSBHU1RfQlVGRkVSX09GRlNFVF9OT05FOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfQlVGRkVSX09GRlNFVCAodGFnKSA9IEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpOworICAgICAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EICh0YWcpID0gR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWZmZXIpOworICAgIH0KKworICAgIC8qIG1hcmsgdGhlIGJ1ZmZlciBpZiBpdCdzIGFuIGF1ZGlvIGJ1ZmZlciBhbmQgdGhlcmUncyBhbHNvIHZpZGVvIGJlaW5nIG11eGVkCisgICAgICogb3IgaXQncyBhIHZpZGVvIGludGVyZnJhbWUgKi8KKyAgICBpZiAobXV4LT52aWRlb19wYWQgPT0gcGFkICYmCisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpKQorICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAodGFnLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAodGFnLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgICAgR1NUX0JVRkZFUl9PRkZTRVQgKHRhZykgPSBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKHRhZykgPQorICAgICAgICBHU1RfQlVGRkVSX09GRlNFVF9OT05FOworICB9CisKKyAgcmV0dXJuIHRhZzsKK30KKworc3RhdGljIGlubGluZSBHc3RCdWZmZXIgKgorZ3N0X2Zsdl9tdXhfYnVmZmVyX3RvX3RhZyAoR3N0Rmx2TXV4ICogbXV4LCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgR3N0Rmx2TXV4UGFkICogcGFkKQoreworICByZXR1cm4gZ3N0X2Zsdl9tdXhfYnVmZmVyX3RvX3RhZ19pbnRlcm5hbCAobXV4LCBidWZmZXIsIHBhZCwgRkFMU0UpOworfQorCitzdGF0aWMgaW5saW5lIEdzdEJ1ZmZlciAqCitnc3RfZmx2X211eF9jb2RlY19kYXRhX2J1ZmZlcl90b190YWcgKEdzdEZsdk11eCAqIG11eCwgR3N0QnVmZmVyICogYnVmZmVyLAorICAgIEdzdEZsdk11eFBhZCAqIHBhZCkKK3sKKyAgcmV0dXJuIGdzdF9mbHZfbXV4X2J1ZmZlcl90b190YWdfaW50ZXJuYWwgKG11eCwgYnVmZmVyLCBwYWQsIFRSVUUpOworfQorCitzdGF0aWMgaW5saW5lIEdzdEJ1ZmZlciAqCitnc3RfZmx2X211eF9lb3NfdG9fdGFnIChHc3RGbHZNdXggKiBtdXgsIEdzdEZsdk11eFBhZCAqIHBhZCkKK3sKKyAgcmV0dXJuIGdzdF9mbHZfbXV4X2J1ZmZlcl90b190YWdfaW50ZXJuYWwgKG11eCwgTlVMTCwgcGFkLCBGQUxTRSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X211eF9wdXRfYnVmZmVyX2luX3N0cmVhbWhlYWRlciAoR1ZhbHVlICogc3RyZWFtaGVhZGVyLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR1ZhbHVlIHZhbHVlID0geyAwIH07CisgIEdzdEJ1ZmZlciAqYnVmOworCisgIGdfdmFsdWVfaW5pdCAoJnZhbHVlLCBHU1RfVFlQRV9CVUZGRVIpOworICBidWYgPSBnc3RfYnVmZmVyX2NvcHkgKGJ1ZmZlcik7CisgIGdzdF92YWx1ZV9zZXRfYnVmZmVyICgmdmFsdWUsIGJ1Zik7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIGdzdF92YWx1ZV9hcnJheV9hcHBlbmRfdmFsdWUgKHN0cmVhbWhlYWRlciwgJnZhbHVlKTsKKyAgZ192YWx1ZV91bnNldCAoJnZhbHVlKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbHZfbXV4X3dyaXRlX2hlYWRlciAoR3N0Rmx2TXV4ICogbXV4KQoreworICBHc3RCdWZmZXIgKmhlYWRlciwgKm1ldGFkYXRhOworICBHc3RCdWZmZXIgKnZpZGVvX2NvZGVjX2RhdGEsICphdWRpb19jb2RlY19kYXRhOworICBHc3RDYXBzICpjYXBzOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgR1ZhbHVlIHN0cmVhbWhlYWRlciA9IHsgMCB9OworICBHTGlzdCAqbDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgLyogaWYgbm90IHN0cmVhbWluZywgY2hlY2sgaWYgZG93bnN0cmVhbSBpcyBzZWVrYWJsZSAqLworICBpZiAoIW11eC0+c3RyZWFtYWJsZSkgeworICAgIGdib29sZWFuIHNlZWthYmxlOworICAgIEdzdFF1ZXJ5ICpxdWVyeTsKKworICAgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19zZWVraW5nIChHU1RfRk9STUFUX0JZVEVTKTsKKyAgICBpZiAoZ3N0X3BhZF9wZWVyX3F1ZXJ5IChtdXgtPnNyY3BhZCwgcXVlcnkpKSB7CisgICAgICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksIE5VTEwsICZzZWVrYWJsZSwgTlVMTCwgTlVMTCk7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKG11eCwgImRvd25zdHJlYW0gaXMgJXNzZWVrYWJsZSIsIHNlZWthYmxlID8gIiIgOiAibm90ICIpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBoYXZlIHRvIGFzc3VtZSBzZWVraW5nIGlzIHN1cHBvcnRlZCBpZiBxdWVyeSBub3QgaGFuZGxlZCBkb3duc3RyZWFtICovCisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgImRvd25zdHJlYW0gZGlkIG5vdCBoYW5kbGUgc2Vla2luZyBxdWVyeSIpOworICAgICAgc2Vla2FibGUgPSBGQUxTRTsKKyAgICB9CisgICAgaWYgKCFzZWVrYWJsZSkgeworICAgICAgbXV4LT5zdHJlYW1hYmxlID0gVFJVRTsKKyAgICAgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKG11eCksICJzdHJlYW1hYmxlIik7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgImRvd25zdHJlYW0gaXMgbm90IHNlZWthYmxlLCBidXQgIgorICAgICAgICAgICJzdHJlYW1hYmxlPWZhbHNlLiBXaWxsIGlnbm9yZSB0aGF0IGFuZCBjcmVhdGUgc3RyZWFtYWJsZSBvdXRwdXQgIgorICAgICAgICAgICJpbnN0ZWFkIik7CisgICAgfQorICAgIGdzdF9xdWVyeV91bnJlZiAocXVlcnkpOworICB9CisKKyAgaGVhZGVyID0gZ3N0X2Zsdl9tdXhfY3JlYXRlX2hlYWRlciAobXV4KTsKKyAgbWV0YWRhdGEgPSBnc3RfZmx2X211eF9jcmVhdGVfbWV0YWRhdGEgKG11eCwgVFJVRSk7CisgIHZpZGVvX2NvZGVjX2RhdGEgPSBOVUxMOworICBhdWRpb19jb2RlY19kYXRhID0gTlVMTDsKKworICBmb3IgKGwgPSBHU1RfRUxFTUVOVF9DQVNUIChtdXgpLT5zaW5rcGFkczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgeworICAgIEdzdEZsdk11eFBhZCAqcGFkID0gbC0+ZGF0YTsKKworICAgIC8qIEdldCBILjI2NCBhbmQgQUFDIGNvZGVjIGRhdGEsIGlmIHByZXNlbnQgKi8KKyAgICBpZiAocGFkICYmIG11eC0+dmlkZW9fcGFkID09IHBhZCAmJiBwYWQtPmNvZGVjID09IDcpIHsKKyAgICAgIGlmIChwYWQtPmNvZGVjX2RhdGEgPT0gTlVMTCkKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsICJDb2RlYyBkYXRhIGZvciB2aWRlbyBzdHJlYW0gbm90IGZvdW5kLCAiCisgICAgICAgICAgICAib3V0cHV0IG1pZ2h0IG5vdCBiZSBwbGF5YWJsZSIpOworICAgICAgZWxzZQorICAgICAgICB2aWRlb19jb2RlY19kYXRhID0KKyAgICAgICAgICAgIGdzdF9mbHZfbXV4X2NvZGVjX2RhdGFfYnVmZmVyX3RvX3RhZyAobXV4LCBwYWQtPmNvZGVjX2RhdGEsIHBhZCk7CisgICAgfSBlbHNlIGlmIChwYWQgJiYgbXV4LT5hdWRpb19wYWQgPT0gcGFkICYmIHBhZC0+Y29kZWMgPT0gMTApIHsKKyAgICAgIGlmIChwYWQtPmNvZGVjX2RhdGEgPT0gTlVMTCkKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsICJDb2RlYyBkYXRhIGZvciBhdWRpbyBzdHJlYW0gbm90IGZvdW5kLCAiCisgICAgICAgICAgICAib3V0cHV0IG1pZ2h0IG5vdCBiZSBwbGF5YWJsZSIpOworICAgICAgZWxzZQorICAgICAgICBhdWRpb19jb2RlY19kYXRhID0KKyAgICAgICAgICAgIGdzdF9mbHZfbXV4X2NvZGVjX2RhdGFfYnVmZmVyX3RvX3RhZyAobXV4LCBwYWQtPmNvZGVjX2RhdGEsIHBhZCk7CisgICAgfQorICB9CisKKyAgLyogbWFyayBidWZmZXJzIHRoYXQgd2lsbCBnbyBpbiB0aGUgc3RyZWFtaGVhZGVyICovCisgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGhlYWRlciwgR1NUX0JVRkZFUl9GTEFHX0hFQURFUik7CisgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG1ldGFkYXRhLCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSKTsKKyAgaWYgKHZpZGVvX2NvZGVjX2RhdGEgIT0gTlVMTCkgeworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKHZpZGVvX2NvZGVjX2RhdGEsIEdTVF9CVUZGRVJfRkxBR19IRUFERVIpOworICAgIC8qIG1hcmsgYXMgYSBkZWx0YSB1bml0LCBzbyBkb3duc3RyZWFtIHdpbGwgbm90IHRyeSB0byBzeW5jaHJvbml6ZSBvbiB0aGF0CisgICAgICogYnVmZmVyIC0gdG8gYWN0dWFsbHkgc3RhcnQgcGxheWJhY2sgeW91IG5lZWQgYSByZWFsIHZpZGVvIGtleWZyYW1lICovCisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAodmlkZW9fY29kZWNfZGF0YSwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworICB9CisgIGlmIChhdWRpb19jb2RlY19kYXRhICE9IE5VTEwpIHsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChhdWRpb19jb2RlY19kYXRhLCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSKTsKKyAgfQorCisgIC8qIHB1dCBidWZmZXJzIGluIHN0cmVhbWhlYWRlciAqLworICBnX3ZhbHVlX2luaXQgKCZzdHJlYW1oZWFkZXIsIEdTVF9UWVBFX0FSUkFZKTsKKyAgZ3N0X2Zsdl9tdXhfcHV0X2J1ZmZlcl9pbl9zdHJlYW1oZWFkZXIgKCZzdHJlYW1oZWFkZXIsIGhlYWRlcik7CisgIGdzdF9mbHZfbXV4X3B1dF9idWZmZXJfaW5fc3RyZWFtaGVhZGVyICgmc3RyZWFtaGVhZGVyLCBtZXRhZGF0YSk7CisgIGlmICh2aWRlb19jb2RlY19kYXRhICE9IE5VTEwpCisgICAgZ3N0X2Zsdl9tdXhfcHV0X2J1ZmZlcl9pbl9zdHJlYW1oZWFkZXIgKCZzdHJlYW1oZWFkZXIsIHZpZGVvX2NvZGVjX2RhdGEpOworICBpZiAoYXVkaW9fY29kZWNfZGF0YSAhPSBOVUxMKQorICAgIGdzdF9mbHZfbXV4X3B1dF9idWZmZXJfaW5fc3RyZWFtaGVhZGVyICgmc3RyZWFtaGVhZGVyLCBhdWRpb19jb2RlY19kYXRhKTsKKworICAvKiBjcmVhdGUgdGhlIGNhcHMgYW5kIHB1dCB0aGUgc3RyZWFtaGVhZGVyIGluIHRoZW0gKi8KKyAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJ2aWRlby94LWZsdiIpOworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKHN0cnVjdHVyZSwgInN0cmVhbWhlYWRlciIsICZzdHJlYW1oZWFkZXIpOworICBnX3ZhbHVlX3Vuc2V0ICgmc3RyZWFtaGVhZGVyKTsKKworICBnc3RfYWdncmVnYXRvcl9zZXRfc3JjX2NhcHMgKEdTVF9BR0dSRUdBVE9SX0NBU1QgKG11eCksIGNhcHMpOworCisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAvKiBwdXNoIHRoZSBoZWFkZXIgYnVmZmVyLCB0aGUgbWV0YWRhdGEgYW5kIHRoZSBjb2RlYyBpbmZvLCBpZiBhbnkgKi8KKyAgcmV0ID0gZ3N0X2Zsdl9tdXhfcHVzaCAobXV4LCBoZWFkZXIpOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gZmFpbHVyZV9oZWFkZXI7CisgIHJldCA9IGdzdF9mbHZfbXV4X3B1c2ggKG11eCwgbWV0YWRhdGEpOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gZmFpbHVyZV9tZXRhZGF0YTsKKyAgaWYgKHZpZGVvX2NvZGVjX2RhdGEgIT0gTlVMTCkgeworICAgIHJldCA9IGdzdF9mbHZfbXV4X3B1c2ggKG11eCwgdmlkZW9fY29kZWNfZGF0YSk7CisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgIGdvdG8gZmFpbHVyZV92aWRlb19jb2RlY19kYXRhOworICB9CisgIGlmIChhdWRpb19jb2RlY19kYXRhICE9IE5VTEwpIHsKKyAgICByZXQgPSBnc3RfZmx2X211eF9wdXNoIChtdXgsIGF1ZGlvX2NvZGVjX2RhdGEpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIGZhaWx1cmVfYXVkaW9fY29kZWNfZGF0YTsKKyAgfQorICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKK2ZhaWx1cmVfaGVhZGVyOgorICBnc3RfYnVmZmVyX3VucmVmIChtZXRhZGF0YSk7CisKK2ZhaWx1cmVfbWV0YWRhdGE6CisgIGlmICh2aWRlb19jb2RlY19kYXRhICE9IE5VTEwpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAodmlkZW9fY29kZWNfZGF0YSk7CisKK2ZhaWx1cmVfdmlkZW9fY29kZWNfZGF0YToKKyAgaWYgKGF1ZGlvX2NvZGVjX2RhdGEgIT0gTlVMTCkKKyAgICBnc3RfYnVmZmVyX3VucmVmIChhdWRpb19jb2RlY19kYXRhKTsKKworZmFpbHVyZV9hdWRpb19jb2RlY19kYXRhOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Q2xvY2tUaW1lCitnc3RfZmx2X211eF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoY29uc3QgR3N0U2VnbWVudCAqIHNlZ21lbnQsIEdzdENsb2NrVGltZSB0KQoreworICAvKiB3ZSBjYW4gZ2V0IGEgZHRzIGJlZm9yZSB0aGUgc2VnbWVudCwgaWYgZHRzIDwgcHRzIGFuZCBwdHMgaXMgaW5zaWRlCisgICAqIHRoZSBzZWdtZW50LCBzbyB3ZSBjb25zaWRlciBlYXJseSB0aW1lcyBhcyAwICovCisgIGlmICh0IDwgc2VnbWVudC0+c3RhcnQpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKHNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X211eF91cGRhdGVfaW5kZXggKEdzdEZsdk11eCAqIG11eCwgR3N0QnVmZmVyICogYnVmZmVyLAorICAgIEdzdEZsdk11eFBhZCAqIHBhZCkKK3sKKyAgLyoKKyAgICogQWRkIHRoZSB0YWcgYnl0ZSBvZmZzZXQgYW5kIHRvIHRoZSBpbmRleCBpZiBpdCdzIGEgdmFsaWQgc2VlayBwb2ludCwgd2hpY2gKKyAgICogbWVhbnMgaXQncyBlaXRoZXIgYSB2aWRlbyBrZXlmcmFtZSBvciBpZiB0aGVyZSBpcyBubyB2aWRlbyBwYWQgKGluIHRoYXQKKyAgICogY2FzZSBldmVyeSBGTFYgdGFnIGlzIGEgdmFsaWQgc2VlayBwb2ludCkKKyAgICovCisgIGlmIChtdXgtPnZpZGVvX3BhZCA9PSBwYWQgJiYKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpKQorICAgIHJldHVybjsKKworICBpZiAoR1NUX0JVRkZFUl9QVFNfSVNfVkFMSUQgKGJ1ZmZlcikpIHsKKyAgICBHc3RGbHZNdXhJbmRleEVudHJ5ICplbnRyeSA9IGdfc2xpY2VfbmV3IChHc3RGbHZNdXhJbmRleEVudHJ5KTsKKyAgICBHc3RDbG9ja1RpbWUgcHRzID0KKyAgICAgICAgZ3N0X2Zsdl9tdXhfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZHU1RfQUdHUkVHQVRPUl9QQUQKKyAgICAgICAgKHBhZCktPnNlZ21lbnQsIEdTVF9CVUZGRVJfUFRTIChidWZmZXIpKTsKKyAgICBlbnRyeS0+cG9zaXRpb24gPSBtdXgtPmJ5dGVfY291bnQ7CisgICAgZW50cnktPnRpbWUgPSBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIChwdHMpIC8gR1NUX1NFQ09ORDsKKyAgICBtdXgtPmluZGV4ID0gZ19saXN0X3ByZXBlbmQgKG11eC0+aW5kZXgsIGVudHJ5KTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2Zsdl9tdXhfd3JpdGVfYnVmZmVyIChHc3RGbHZNdXggKiBtdXgsIEdzdEZsdk11eFBhZCAqIHBhZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdEJ1ZmZlciAqdGFnOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0Q2xvY2tUaW1lIGR0cyA9CisgICAgICBnc3RfZmx2X211eF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJkdTVF9BR0dSRUdBVE9SX1BBRCAocGFkKS0+c2VnbWVudCwKKyAgICAgIEdTVF9CVUZGRVJfRFRTIChidWZmZXIpKTsKKworICAvKiBjbGlwcGluZyBmdW5jdGlvbiBhcnJhbmdlZCBmb3IgcnVubmluZ190aW1lICovCisKKyAgaWYgKCFtdXgtPnN0cmVhbWFibGUpCisgICAgZ3N0X2Zsdl9tdXhfdXBkYXRlX2luZGV4IChtdXgsIGJ1ZmZlciwgcGFkKTsKKworICB0YWcgPSBnc3RfZmx2X211eF9idWZmZXJfdG9fdGFnIChtdXgsIGJ1ZmZlciwgcGFkKTsKKworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgIHJldCA9IGdzdF9mbHZfbXV4X3B1c2ggKG11eCwgdGFnKTsKKworICBpZiAocmV0ID09IEdTVF9GTE9XX09LICYmIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChkdHMpKQorICAgIHBhZC0+bGFzdF90aW1lc3RhbXAgPSBkdHM7CisKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorZ3N0X2Zsdl9tdXhfZGV0ZXJtaW5lX2R1cmF0aW9uIChHc3RGbHZNdXggKiBtdXgpCit7CisgIEdMaXN0ICpsOworICBHc3RDbG9ja1RpbWUgZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgInRyeWluZyB0byBkZXRlcm1pbmUgdGhlIGR1cmF0aW9uICIKKyAgICAgICJmcm9tIHBhZCB0aW1lc3RhbXBzIik7CisKKyAgZm9yIChsID0gR1NUX0VMRU1FTlRfQ0FTVCAobXV4KS0+c2lua3BhZHM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpIHsKKyAgICBHc3RGbHZNdXhQYWQgKnBhZCA9IEdTVF9GTFZfTVVYX1BBRCAobC0+ZGF0YSk7CisKKyAgICBpZiAocGFkICYmIChwYWQtPmxhc3RfdGltZXN0YW1wICE9IEdTVF9DTE9DS19USU1FX05PTkUpKSB7CisgICAgICBpZiAoZHVyYXRpb24gPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICAgICAgZHVyYXRpb24gPSBwYWQtPmxhc3RfdGltZXN0YW1wOworICAgICAgZWxzZQorICAgICAgICBkdXJhdGlvbiA9IE1BWCAoZHVyYXRpb24sIHBhZC0+bGFzdF90aW1lc3RhbXApOworICAgIH0KKyAgfQorCisgIHJldHVybiBkdXJhdGlvbjsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmx2X211eF9hcmVfYWxsX3BhZHNfZW9zIChHc3RGbHZNdXggKiBtdXgpCit7CisgIEdMaXN0ICpsOworCisgIGZvciAobCA9IEdTVF9FTEVNRU5UX0NBU1QgKG11eCktPnNpbmtwYWRzOyBsOyBsID0gbC0+bmV4dCkgeworICAgIEdzdEZsdk11eFBhZCAqcGFkID0gR1NUX0ZMVl9NVVhfUEFEIChsLT5kYXRhKTsKKworICAgIGlmICghZ3N0X2FnZ3JlZ2F0b3JfcGFkX2lzX2VvcyAoR1NUX0FHR1JFR0FUT1JfUEFEIChwYWQpKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbHZfbXV4X3dyaXRlX2VvcyAoR3N0Rmx2TXV4ICogbXV4KQoreworICBHc3RCdWZmZXIgKnRhZzsKKworICBpZiAobXV4LT52aWRlb19wYWQgPT0gTlVMTCkKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgdGFnID0gZ3N0X2Zsdl9tdXhfZW9zX3RvX3RhZyAobXV4LCBtdXgtPnZpZGVvX3BhZCk7CisKKyAgcmV0dXJuIGdzdF9mbHZfbXV4X3B1c2ggKG11eCwgdGFnKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbHZfbXV4X3Jld3JpdGVfaGVhZGVyIChHc3RGbHZNdXggKiBtdXgpCit7CisgIEdzdEJ1ZmZlciAqcmV3cml0ZSwgKmluZGV4LCAqdG1wOworICBHc3RFdmVudCAqZXZlbnQ7CisgIGd1aW50OCAqZGF0YTsKKyAgZ2RvdWJsZSBkOworICBHTGlzdCAqbDsKKyAgZ3VpbnQzMiBpbmRleF9sZW4sIGFsbG9jYXRlX3NpemU7CisgIGd1aW50MzIgaSwgaW5kZXhfc2tpcDsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworICBHc3RDbG9ja1RpbWUgZHVyOworCisgIGlmIChtdXgtPnN0cmVhbWFibGUpCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIC8qIHNlZWsgYmFjayB0byB0aGUgcHJlYWxsb2NhdGVkIGluZGV4IHNwYWNlICovCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX0JZVEVTKTsKKyAgc2VnbWVudC5zdGFydCA9IHNlZ21lbnQudGltZSA9IDEzICsgMjk7CisgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCk7CisgIGlmICghZ3N0X3BhZF9wdXNoX2V2ZW50IChtdXgtPnNyY3BhZCwgZXZlbnQpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsICJTZWVrIHRvIHJld3JpdGUgaGVhZGVyIGZhaWxlZCIpOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorCisgIC8qIGRldGVybWluZSBkdXJhdGlvbiBub3cgYmFzZWQgb24gb3VyIG93biB0aW1lc3RhbXBpbmcsCisgICAqIHNvIHRoYXQgaXQgaXMgbGlrZWx5IG1hbnkgdGltZXMgYmV0dGVyIGFuZCBjb25zaXN0ZW50CisgICAqIHRoYW4gd2hhdGV2ZXIgb2J0YWluZWQgYnkgc29tZSBxdWVyeSAqLworICBkdXIgPSBnc3RfZmx2X211eF9kZXRlcm1pbmVfZHVyYXRpb24gKG11eCk7CisgIGlmIChkdXIgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICBtdXgtPmR1cmF0aW9uID0gZHVyOworCisgIC8qIHJld3JpdGUgdGhlIGR1cmF0aW9uIHRhZyAqLworICBkID0gZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSAobXV4LT5kdXJhdGlvbik7CisgIGQgLz0gKGdkb3VibGUpIEdTVF9TRUNPTkQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAiZGV0ZXJtaW5lZCB0aGUgZmluYWwgZHVyYXRpb24gdG8gYmUgJWYiLCBkKTsKKworICByZXdyaXRlID0gZ3N0X2Zsdl9tdXhfY3JlYXRlX251bWJlcl9zY3JpcHRfdmFsdWUgKCJkdXJhdGlvbiIsIGQpOworCisgIC8qIHJld3JpdGUgdGhlIGZpbGVzaXplIHRhZyAqLworICBkID0gZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSAobXV4LT5ieXRlX2NvdW50KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJwdXR0aW5nIHRvdGFsIGZpbGVzaXplICVmIGluIHRoZSBtZXRhZGF0YSIsIGQpOworCisgIHRtcCA9IGdzdF9mbHZfbXV4X2NyZWF0ZV9udW1iZXJfc2NyaXB0X3ZhbHVlICgiZmlsZXNpemUiLCBkKTsKKyAgcmV3cml0ZSA9IGdzdF9idWZmZXJfYXBwZW5kIChyZXdyaXRlLCB0bXApOworCisgIGlmICghbXV4LT5pbmRleCkgeworICAgIC8qIG5vIGluZGV4LCBzbyBwdXNoIGJ1ZmZlciBhbmQgcmV0dXJuICovCisgICAgcmV0dXJuIGdzdF9mbHZfbXV4X3B1c2ggKG11eCwgcmV3cml0ZSk7CisgIH0KKworICAvKiByZXdyaXRlIHRoZSBpbmRleCAqLworICBtdXgtPmluZGV4ID0gZ19saXN0X3JldmVyc2UgKG11eC0+aW5kZXgpOworICBpbmRleF9sZW4gPSBnX2xpc3RfbGVuZ3RoIChtdXgtPmluZGV4KTsKKworICAvKiBXZSB3cml0ZSBhdCBtb3N0IE1BWF9JTkRFWF9FTlRSSUVTIGVsZW1lbnRzICovCisgIGlmIChpbmRleF9sZW4gPiBNQVhfSU5ERVhfRU5UUklFUykgeworICAgIGluZGV4X3NraXAgPSAxICsgaW5kZXhfbGVuIC8gTUFYX0lOREVYX0VOVFJJRVM7CisgICAgaW5kZXhfbGVuID0gKGluZGV4X2xlbiArIGluZGV4X3NraXAgLSAxKSAvIGluZGV4X3NraXA7CisgIH0gZWxzZSB7CisgICAgaW5kZXhfc2tpcCA9IDE7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJJbmRleCBsZW5ndGggaXMgJWQiLCBpbmRleF9sZW4pOworICAvKiBzZWUgc2l6ZSBjYWxjdWxhdGlvbiBpbiBnc3RfZmx2X211eF9wcmVhbGxvY2F0ZV9pbmRleCAqLworICBhbGxvY2F0ZV9zaXplID0gMTEgKyA4ICsgMjIgKyAxMCArIGluZGV4X2xlbiAqIDE4OworICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJBbGxvY2F0aW5nICVkIGJ5dGVzIGZvciBpbmRleCIsIGFsbG9jYXRlX3NpemUpOworICBfZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChhbGxvY2F0ZV9zaXplLCAmaW5kZXgsICZkYXRhKTsKKworICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhLCA5KTsgICAgICAgIC8qIHRoZSAna2V5ZnJhbWVzJyBrZXkgKi8KKyAgbWVtY3B5IChkYXRhICsgMiwgImtleWZyYW1lcyIsIDkpOworICBHU1RfV1JJVEVfVUlOVDggKGRhdGEgKyAxMSwgOCk7ICAgICAgIC8qIG5lc3RlZCBFQ01BIGFycmF5ICovCisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEgKyAxMiwgMik7ICAgLyogdHdvIGVsZW1lbnRzICovCisgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEgKyAxNiwgNSk7ICAgLyogZmlyc3Qgc3RyaW5nIGtleTogJ3RpbWVzJyAqLworICBtZW1jcHkgKGRhdGEgKyAxOCwgInRpbWVzIiwgNSk7CisgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDIzLCAxMCk7ICAgICAgLyogc3RyaWN0IGFycmF5ICovCisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEgKyAyNCwgaW5kZXhfbGVuKTsKKyAgZGF0YSArPSAyODsKKworICAvKiB0aGUga2V5ZnJhbWVzJyB0aW1lcyAqLworICBmb3IgKGkgPSAwLCBsID0gbXV4LT5pbmRleDsgbDsgbCA9IGwtPm5leHQsIGkrKykgeworICAgIEdzdEZsdk11eEluZGV4RW50cnkgKmVudHJ5ID0gbC0+ZGF0YTsKKworICAgIGlmIChpICUgaW5kZXhfc2tpcCAhPSAwKQorICAgICAgY29udGludWU7CisgICAgR1NUX1dSSVRFX1VJTlQ4IChkYXRhLCAwKTsgIC8qIG51bWVyaWMgKGFrYSBkb3VibGUpICovCisgICAgR1NUX1dSSVRFX0RPVUJMRV9CRSAoZGF0YSArIDEsIGVudHJ5LT50aW1lKTsKKyAgICBkYXRhICs9IDk7CisgIH0KKworICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhLCAxMyk7ICAgICAgIC8qIHNlY29uZCBzdHJpbmcga2V5OiAnZmlsZXBvc2l0aW9ucycgKi8KKyAgbWVtY3B5IChkYXRhICsgMiwgImZpbGVwb3NpdGlvbnMiLCAxMyk7CisgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDE1LCAxMCk7ICAgICAgLyogc3RyaWN0IGFycmF5ICovCisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEgKyAxNiwgaW5kZXhfbGVuKTsKKyAgZGF0YSArPSAyMDsKKworICAvKiB0aGUga2V5ZnJhbWVzJyBmaWxlIHBvc2l0aW9ucyAqLworICBmb3IgKGkgPSAwLCBsID0gbXV4LT5pbmRleDsgbDsgbCA9IGwtPm5leHQsIGkrKykgeworICAgIEdzdEZsdk11eEluZGV4RW50cnkgKmVudHJ5ID0gbC0+ZGF0YTsKKworICAgIGlmIChpICUgaW5kZXhfc2tpcCAhPSAwKQorICAgICAgY29udGludWU7CisgICAgR1NUX1dSSVRFX1VJTlQ4IChkYXRhLCAwKTsKKyAgICBHU1RfV1JJVEVfRE9VQkxFX0JFIChkYXRhICsgMSwgZW50cnktPnBvc2l0aW9uKTsKKyAgICBkYXRhICs9IDk7CisgIH0KKworICBHU1RfV1JJVEVfVUlOVDI0X0JFIChkYXRhLCA5KTsgICAgICAgIC8qIGZpbmlzaCB0aGUgRUNNQSBhcnJheSAqLworCisgIC8qIElmIHRoZXJlIGlzIHNwYWNlIGxlZnQgaW4gdGhlIHByZWZpbGxlZCBhcmVhLCByZWluc2VydCB0aGUgZmlsbGVyLgorICAgICBUaGVyZSBpcyBhdCBsZWFzdCAxOCAgYnl0ZXMgZnJlZSwgc28gaXQgd2lsbCBhbHdheXMgZml0LiAqLworICBpZiAoaW5kZXhfbGVuIDwgTUFYX0lOREVYX0VOVFJJRVMpIHsKKyAgICBHc3RCdWZmZXIgKnRtcDsKKyAgICBndWludDggKmRhdGE7CisgICAgZ3VpbnQzMiByZW1haW5pbmdfZmlsbGVyX3NpemU7CisKKyAgICBfZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxNCwgJnRtcCwgJmRhdGEpOworICAgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEsIDkpOworICAgIG1lbWNweSAoZGF0YSArIDIsICJnc3RmaWxsZXIiLCA5KTsKKyAgICBHU1RfV1JJVEVfVUlOVDggKGRhdGEgKyAxMSwgMik7ICAgICAvKiBzdHJpbmcgKi8KKworICAgIC8qIFRoZXJlIGlzIDE4IGJ5dGVzIHBlciByZW1haW5pbmcgaW5kZXggZW50cnkgbWludXMgd2hhdCBpcyB1c2VkIGZvcgorICAgICAqIHRoZSdnc3RmaWxsZXInIGtleS4gVGhlIHJlc3QgaXMgYWxyZWFkeSBmaWxsZWQgd2l0aCBzcGFjZXMsIHNvIGp1c3QgbmVlZAorICAgICAqIHRvIHVwZGF0ZSBsZW5ndGguICovCisgICAgcmVtYWluaW5nX2ZpbGxlcl9zaXplID0gKE1BWF9JTkRFWF9FTlRSSUVTIC0gaW5kZXhfbGVuKSAqIDE4IC0gMTQ7CisgICAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAiUmVtYWluaW5nIGZpbGxlciBzaXplIGlzICVkIGJ5dGVzIiwKKyAgICAgICAgcmVtYWluaW5nX2ZpbGxlcl9zaXplKTsKKyAgICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhICsgMTIsIHJlbWFpbmluZ19maWxsZXJfc2l6ZSk7CisgICAgaW5kZXggPSBnc3RfYnVmZmVyX2FwcGVuZCAoaW5kZXgsIHRtcCk7CisgIH0KKworICByZXdyaXRlID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKHJld3JpdGUsIGluZGV4KTsKKworICByZXR1cm4gZ3N0X2Zsdl9tdXhfcHVzaCAobXV4LCByZXdyaXRlKTsKK30KKworc3RhdGljIEdzdEZsdk11eFBhZCAqCitnc3RfZmx2X211eF9maW5kX2Jlc3RfcGFkIChHc3RBZ2dyZWdhdG9yICogYWdncmVnYXRvciwgR3N0Q2xvY2tUaW1lICogdHMpCit7CisgIEdzdEFnZ3JlZ2F0b3JQYWQgKmFwYWQ7CisgIEdzdEZsdk11eFBhZCAqcGFkLCAqYmVzdCA9IE5VTEw7CisgIEdMaXN0ICpsOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0Q2xvY2tUaW1lIGJlc3RfdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIGZvciAobCA9IEdTVF9FTEVNRU5UX0NBU1QgKGFnZ3JlZ2F0b3IpLT5zaW5rcGFkczsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICBhcGFkID0gR1NUX0FHR1JFR0FUT1JfUEFEIChsLT5kYXRhKTsKKyAgICBwYWQgPSBHU1RfRkxWX01VWF9QQUQgKGwtPmRhdGEpOworICAgIGJ1ZmZlciA9IGdzdF9hZ2dyZWdhdG9yX3BhZF9wZWVrX2J1ZmZlciAoR1NUX0FHR1JFR0FUT1JfUEFEIChwYWQpKTsKKyAgICBpZiAoIWJ1ZmZlcikKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChiZXN0X3RzID09IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICAgIGJlc3QgPSBwYWQ7CisgICAgICBiZXN0X3RzID0gZ3N0X2Zsdl9tdXhfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZhcGFkLT5zZWdtZW50LAorICAgICAgICAgIEdTVF9CVUZGRVJfRFRTX09SX1BUUyAoYnVmZmVyKSk7CisgICAgfSBlbHNlIGlmIChHU1RfQlVGRkVSX0RUU19PUl9QVFMgKGJ1ZmZlcikgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgICAgZ2ludDY0IHQgPSBnc3RfZmx2X211eF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJmFwYWQtPnNlZ21lbnQsCisgICAgICAgICAgR1NUX0JVRkZFUl9EVFNfT1JfUFRTIChidWZmZXIpKTsKKyAgICAgIGlmICh0IDwgYmVzdF90cykgeworICAgICAgICBiZXN0ID0gcGFkOworICAgICAgICBiZXN0X3RzID0gdDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgR1NUX0RFQlVHX09CSkVDVCAoYWdncmVnYXRvciwKKyAgICAgICJCZXN0IHBhZCBmb3VuZCB3aXRoICUiIEdTVF9USU1FX0ZPUk1BVCAiOiAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKGJlc3RfdHMpLCBiZXN0KTsKKyAgaWYgKHRzKQorICAgICp0cyA9IGJlc3RfdHM7CisgIHJldHVybiBiZXN0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2Zsdl9tdXhfYWdncmVnYXRlIChHc3RBZ2dyZWdhdG9yICogYWdncmVnYXRvciwgZ2Jvb2xlYW4gdGltZW91dCkKK3sKKyAgR3N0Rmx2TXV4ICptdXggPSBHU1RfRkxWX01VWCAoYWdncmVnYXRvcik7CisgIEdzdEZsdk11eFBhZCAqYmVzdDsKKyAgZ2ludDY0IGJlc3RfdGltZSA9IEdTVF9DTE9DS19TVElNRV9OT05FOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0Q2xvY2tUaW1lIHRzOworICBHc3RCdWZmZXIgKmJ1ZmZlciA9IE5VTEw7CisKKyAgaWYgKG11eC0+c3RhdGUgPT0gR1NUX0ZMVl9NVVhfU1RBVEVfSEVBREVSKSB7CisgICAgaWYgKEdTVF9FTEVNRU5UX0NBU1QgKG11eCktPnNpbmtwYWRzID09IE5VTEwpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtdXgsIFNUUkVBTSwgTVVYLCAoTlVMTCksCisgICAgICAgICAgKCJObyBpbnB1dCBzdHJlYW1zIGNvbmZpZ3VyZWQiKSk7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgfQorCisgICAgcmV0ID0gZ3N0X2Zsdl9tdXhfd3JpdGVfaGVhZGVyIChtdXgpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICByZXR1cm4gcmV0OworICAgIG11eC0+c3RhdGUgPSBHU1RfRkxWX01VWF9TVEFURV9EQVRBOworCisgICAgYmVzdCA9IGdzdF9mbHZfbXV4X2ZpbmRfYmVzdF9wYWQgKGFnZ3JlZ2F0b3IsICZ0cyk7CisgICAgaWYgKGJlc3QgJiYgR1NUX0NMT0NLX1NUSU1FX0lTX1ZBTElEICh0cykpCisgICAgICBtdXgtPmZpcnN0X3RpbWVzdGFtcCA9IHRzOworICAgIGVsc2UKKyAgICAgIG11eC0+Zmlyc3RfdGltZXN0YW1wID0gMDsKKyAgfSBlbHNlIHsKKyAgICBiZXN0ID0gZ3N0X2Zsdl9tdXhfZmluZF9iZXN0X3BhZCAoYWdncmVnYXRvciwgJnRzKTsKKyAgfQorCisgIGlmIChtdXgtPm5ld190YWdzKSB7CisgICAgR3N0QnVmZmVyICpidWYgPSBnc3RfZmx2X211eF9jcmVhdGVfbWV0YWRhdGEgKG11eCwgRkFMU0UpOworICAgIGlmIChidWYpCisgICAgICBnc3RfZmx2X211eF9wdXNoIChtdXgsIGJ1Zik7CisgICAgbXV4LT5uZXdfdGFncyA9IEZBTFNFOworICB9CisKKyAgaWYgKGJlc3QpIHsKKyAgICBidWZmZXIgPSBnc3RfYWdncmVnYXRvcl9wYWRfcG9wX2J1ZmZlciAoR1NUX0FHR1JFR0FUT1JfUEFEIChiZXN0KSk7CisgICAgZ19hc3NlcnQgKGJ1ZmZlcik7CisgICAgYmVzdC0+ZHRzID0KKyAgICAgICAgZ3N0X2Zsdl9tdXhfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZHU1RfQUdHUkVHQVRPUl9QQUQKKyAgICAgICAgKGJlc3QpLT5zZWdtZW50LCBHU1RfQlVGRkVSX0RUU19PUl9QVFMgKGJ1ZmZlcikpOworCisgICAgaWYgKEdTVF9DTE9DS19TVElNRV9JU19WQUxJRCAoYmVzdC0+ZHRzKSkKKyAgICAgIGJlc3RfdGltZSA9IGJlc3QtPmR0cyAtIG11eC0+Zmlyc3RfdGltZXN0YW1wOworCisgICAgaWYgKEdTVF9CVUZGRVJfUFRTX0lTX1ZBTElEIChidWZmZXIpKQorICAgICAgYmVzdC0+cHRzID0KKyAgICAgICAgICBnc3RfZmx2X211eF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJkdTVF9BR0dSRUdBVE9SX1BBRAorICAgICAgICAgIChiZXN0KS0+c2VnbWVudCwgR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcikpOworICAgIGVsc2UKKyAgICAgIGJlc3QtPnB0cyA9IGJlc3QtPmR0czsKKworICAgIEdTVF9MT0dfT0JKRUNUIChiZXN0LCAiZ290IGJ1ZmZlciBQVFMgJSIgR1NUX1RJTUVfRk9STUFUICIgRFRTICUiCisgICAgICAgIEdTVF9TVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGJlc3QtPnB0cyksCisgICAgICAgIEdTVF9TVElNRV9BUkdTIChiZXN0LT5kdHMpKTsKKyAgfSBlbHNlIHsKKyAgICBiZXN0X3RpbWUgPSBHU1RfQ0xPQ0tfU1RJTUVfTk9ORTsKKyAgfQorCisgIC8qIFRoZSBGTFYgdGltZXN0YW1wIGlzIGFuIGludDMyIGZpZWxkLiBGb3Igbm9uLWxpdmUgc3RyZWFtcyBlcnJvciBvdXQgaWYgYQorICAgICBiaWdnZXIgdGltZXN0YW1wIGlzIHNlZW4sIGZvciBsaXZlIHRoZSB0aW1lc3RhbXAgd2lsbCBnZXQgd3JhcHBlZCBpbgorICAgICBnc3RfZmx2X211eF9idWZmZXJfdG9fdGFnICovCisgIGlmICghbXV4LT5zdHJlYW1hYmxlICYmIChHU1RfQ0xPQ0tfU1RJTUVfSVNfVkFMSUQgKGJlc3RfdGltZSkpCisgICAgICAmJiBiZXN0X3RpbWUgLyBHU1RfTVNFQ09ORCA+IEdfTUFYSU5UMzIpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgIlRpbWVzdGFtcCBsYXJnZXIgdGhhbiBGTFYgc3VwcG9ydHMgLSBFT1MiKTsKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICB9CisgICAgYmVzdCA9IE5VTEw7CisgIH0KKworICBpZiAoYmVzdCkgeworICAgIHJldHVybiBnc3RfZmx2X211eF93cml0ZV9idWZmZXIgKG11eCwgYmVzdCwgYnVmZmVyKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZ3N0X2Zsdl9tdXhfYXJlX2FsbF9wYWRzX2VvcyAobXV4KSkgeworICAgICAgZ3N0X2Zsdl9tdXhfd3JpdGVfZW9zIChtdXgpOworICAgICAgZ3N0X2Zsdl9tdXhfcmV3cml0ZV9oZWFkZXIgKG11eCk7CisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKG11eC0+c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisgICAgfQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2Zsdl9tdXhfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEZsdk11eCAqbXV4ID0gR1NUX0ZMVl9NVVggKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1NUUkVBTUFCTEU6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgbXV4LT5zdHJlYW1hYmxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NRVRBREFUQUNSRUFUT1I6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBtdXgtPm1ldGFkYXRhY3JlYXRvcik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X211eF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0Rmx2TXV4ICptdXggPSBHU1RfRkxWX01VWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU1RSRUFNQUJMRToKKyAgICAgIG11eC0+c3RyZWFtYWJsZSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGlmIChtdXgtPnN0cmVhbWFibGUpCisgICAgICAgIGdzdF90YWdfc2V0dGVyX3NldF90YWdfbWVyZ2VfbW9kZSAoR1NUX1RBR19TRVRURVIgKG11eCksCisgICAgICAgICAgICBHU1RfVEFHX01FUkdFX1JFUExBQ0UpOworICAgICAgZWxzZQorICAgICAgICBnc3RfdGFnX3NldHRlcl9zZXRfdGFnX21lcmdlX21vZGUgKEdTVF9UQUdfU0VUVEVSIChtdXgpLAorICAgICAgICAgICAgR1NUX1RBR19NRVJHRV9LRUVQKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NRVRBREFUQUNSRUFUT1I6CisgICAgICBnX2ZyZWUgKG11eC0+bWV0YWRhdGFjcmVhdG9yKTsKKyAgICAgIGlmICghZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSkpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsICJtZXRhZGF0YWNyZWF0b3IgcHJvcGVydHkgY2FuIG5vdCBiZSBOVUxMIik7CisgICAgICAgIG11eC0+bWV0YWRhdGFjcmVhdG9yID0gZ19zdHJkdXAgKERFRkFVTFRfTUVUQURBVEFDUkVBVE9SKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG11eC0+bWV0YWRhdGFjcmVhdG9yID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2dzdF9mbHZfbXV4X2dldF9uZXh0X3RpbWVfZm9yX3NlZ21lbnQgKEdzdEFnZ3JlZ2F0b3IgKiBhZ2dyZWdhdG9yLAorICAgIGNvbnN0IEdzdFNlZ21lbnQgKiBzZWdtZW50KQoreworICBHc3RDbG9ja1RpbWUgbmV4dF90aW1lOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoYWdncmVnYXRvcik7CisgIGlmIChzZWdtZW50LT5wb3NpdGlvbiA9PSAtMSB8fCBzZWdtZW50LT5wb3NpdGlvbiA8IHNlZ21lbnQtPnN0YXJ0KQorICAgIG5leHRfdGltZSA9IHNlZ21lbnQtPnN0YXJ0OworICBlbHNlCisgICAgbmV4dF90aW1lID0gc2VnbWVudC0+cG9zaXRpb247CisKKyAgaWYgKHNlZ21lbnQtPnN0b3AgIT0gLTEgJiYgbmV4dF90aW1lID4gc2VnbWVudC0+c3RvcCkKKyAgICBuZXh0X3RpbWUgPSBzZWdtZW50LT5zdG9wOworCisgIG5leHRfdGltZSA9IGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLCBuZXh0X3RpbWUpOworICBHU1RfT0JKRUNUX1VOTE9DSyAoYWdncmVnYXRvcik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYWdncmVnYXRvciwgIm5leHRfdGltZTogJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAobmV4dF90aW1lKSk7CisgIHJldHVybiBuZXh0X3RpbWU7Cit9CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2dzdF9mbHZfbXV4X2dldF9uZXh0X3RpbWUgKEdzdEFnZ3JlZ2F0b3IgKiBhZ2dyZWdhdG9yKQoreworICByZXR1cm4gZ3N0X2Zsdl9tdXhfZ2V0X25leHRfdGltZV9mb3Jfc2VnbWVudCAoYWdncmVnYXRvciwKKyAgICAgICZhZ2dyZWdhdG9yLT5zZWdtZW50KTsKK30KZGlmZiAtLWdpdCBhL2dzdC9mbHYvZ3N0Zmx2bXV4LmggYi9nc3QvZmx2L2dzdGZsdm11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYjUwOTMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZmx2L2dzdGZsdm11eC5oCkBAIC0wLDAgKzEsMTEwIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsMjAwOSBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDE3IENvbGxhYm9yYSBMdGQKKyAqICBAYXV0aG9yOiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqICBAYXV0aG9yOiBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9GTFZfTVVYX0hfXworI2RlZmluZSBfX0dTVF9GTFZfTVVYX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFnZ3JlZ2F0b3IuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0ZMVl9NVVhfUEFEIChnc3RfZmx2X211eF9wYWRfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0ZMVl9NVVhfUEFEKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0ZMVl9NVVhfUEFELCBHc3RGbHZNdXhQYWQpKQorI2RlZmluZSBHU1RfRkxWX01VWF9QQURfQ0FTVChvYmopICgoR3N0Rmx2TXV4UGFkICopKG9iaikpCisjZGVmaW5lIEdTVF9GTFZfTVVYX1BBRF9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfRkxWX01VWF9QQUQsIEdzdEZsdk11eFBhZCkpCisjZGVmaW5lIEdTVF9JU19GTFZfTVVYX1BBRChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9GTFZfTVVYX1BBRCkpCisjZGVmaW5lIEdTVF9JU19GTFZfTVVYX1BBRF9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfRkxWX01VWF9QQUQpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0Rmx2TXV4UGFkIEdzdEZsdk11eFBhZDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RGbHZNdXhQYWRDbGFzcyBHc3RGbHZNdXhQYWRDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9GTFZfTVVYIFwKKyAgKGdzdF9mbHZfbXV4X2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfRkxWX01VWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfRkxWX01VWCwgR3N0Rmx2TXV4KSkKKyNkZWZpbmUgR1NUX0ZMVl9NVVhfQ0FTVChvYmopICgoR3N0Rmx2TXV4ICopb2JqKQorI2RlZmluZSBHU1RfRkxWX01VWF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIEdTVF9UWVBFX0ZMVl9NVVgsIEdzdEZsdk11eENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0ZMVl9NVVgob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX0ZMVl9NVVgpKQorI2RlZmluZSBHU1RfSVNfRkxWX01VWF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX0ZMVl9NVVgpKQorCitzdHJ1Y3QgX0dzdEZsdk11eFBhZAoreworICBHc3RBZ2dyZWdhdG9yUGFkIGFnZ3JlZ2F0b3JfcGFkOworCisgIGd1aW50IGNvZGVjOworICBndWludCByYXRlOworICBndWludCB3aWR0aDsKKyAgZ3VpbnQgY2hhbm5lbHM7CisgIEdzdEJ1ZmZlciAqY29kZWNfZGF0YTsKKworICBndWludCBiaXRyYXRlOworCisgIEdzdENsb2NrVGltZSBsYXN0X3RpbWVzdGFtcDsKKyAgZ2ludDY0IHB0czsKKyAgZ2ludDY0IGR0czsKK307CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RGbHZNdXhQYWRDbGFzcyB7CisgIEdzdEFnZ3JlZ2F0b3JQYWRDbGFzcyBwYXJlbnQ7Cit9IEdzdEZsdk11eFBhZENsYXNzOworCit0eXBlZGVmIGVudW0KK3sKKyAgR1NUX0ZMVl9NVVhfU1RBVEVfSEVBREVSLAorICBHU1RfRkxWX01VWF9TVEFURV9EQVRBCit9IEdzdEZsdk11eFN0YXRlOworCit0eXBlZGVmIHN0cnVjdCBfR3N0Rmx2TXV4IHsKKyAgR3N0QWdncmVnYXRvciAgIGFnZ3JlZ2F0b3I7CisKKyAgR3N0UGFkICAgICAgICAgKnNyY3BhZDsKKworICAvKiA8cHJpdmF0ZT4gKi8KKyAgR3N0Rmx2TXV4U3RhdGUgc3RhdGU7CisgIEdzdEZsdk11eFBhZCAqYXVkaW9fcGFkOworICBHc3RGbHZNdXhQYWQgKnZpZGVvX3BhZDsKKyAgZ2Jvb2xlYW4gc3RyZWFtYWJsZTsKKyAgZ2NoYXIgKm1ldGFkYXRhY3JlYXRvcjsKKworICBHc3RUYWdMaXN0ICp0YWdzOworICBnYm9vbGVhbiBuZXdfdGFnczsKKyAgR0xpc3QgKmluZGV4OworICBndWludDY0IGJ5dGVfY291bnQ7CisgIGd1aW50NjQgZHVyYXRpb247CisgIGdpbnQ2NCBmaXJzdF90aW1lc3RhbXA7Cit9IEdzdEZsdk11eDsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEZsdk11eENsYXNzIHsKKyAgR3N0QWdncmVnYXRvckNsYXNzIHBhcmVudDsKK30gR3N0Rmx2TXV4Q2xhc3M7CisKK0dUeXBlICAgIGdzdF9mbHZfbXV4X3BhZF9nZXRfdHlwZSh2b2lkKTsKK0dUeXBlICAgIGdzdF9mbHZfbXV4X2dldF90eXBlICAgICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0ZMVl9NVVhfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZmx2L2dzdGluZGV4LmMgYi9nc3QvZmx2L2dzdGluZGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkN2ZhMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9mbHYvZ3N0aW5kZXguYwpAQCAtMCwwICsxLDEwMTkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDAxIFJpZGdlUnVuIChodHRwOi8vd3d3LnJpZGdlcnVuLmNvbS8pCisgKiBXcml0dGVuIGJ5IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAcmlkZ2VydW4uY29tPgorICoKKyAqIGdzdGluZGV4LmM6IEluZGV4IGZvciBtYXBwaW5ncyBhbmQgb3RoZXIgZGF0YQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjpnc3RpbmRleAorICogQHNob3J0X2Rlc2NyaXB0aW9uOiBHZW5lcmF0ZSBpbmRleGVzIG9uIG9iamVjdHMKKyAqIEBzZWVfYWxzbzogI0dzdEluZGV4RmFjdG9yeQorICoKKyAqIEdzdEluZGV4IGlzIHVzZWQgdG8gZ2VuZXJhdGUgYSBzdHJlYW0gaW5kZXggb2Ygb25lIG9yIG1vcmUgZWxlbWVudHMKKyAqIGluIGEgcGlwZWxpbmUuCisgKgorICogRWxlbWVudHMgd2lsbCBvdmVybG9hZCB0aGUgc2V0X2luZGV4IGFuZCBnZXRfaW5kZXggdmlydHVhbCBtZXRob2RzIGluCisgKiAjR3N0RWxlbWVudC4gV2hlbiBzdHJlYW1pbmcgZGF0YSwgdGhlIGVsZW1lbnQgd2lsbCBhZGQgaW5kZXggZW50cmllcyBpZiBpdAorICogaGFzIGFuIGluZGV4IHNldC4KKyAqCisgKiBFYWNoIGVsZW1lbnQgdGhhdCBhZGRzIHRvIHRoZSBpbmRleCB3aWxsIGRvIHRoYXQgdXNpbmcgYSB3cml0ZXJfaWQuIFRoZQorICogd3JpdGVyX2lkIGlzIG9idGFpbmVkIGZyb20gZ3N0X2luZGV4X2dldF93cml0ZXJfaWQoKS4KKyAqCisgKiBUaGUgYXBwbGljYXRpb24gdGhhdCB3YW50cyB0byBpbmRleCB0aGUgc3RyZWFtIHdpbGwgY3JlYXRlIGEgbmV3IGluZGV4IG9iamVjdAorICogdXNpbmcgZ3N0X2luZGV4X25ldygpIG9yIGdzdF9pbmRleF9mYWN0b3J5X21ha2UoKS4gVGhlIGluZGV4IGlzIGFzc2lnbmVkIHRvIGEKKyAqIHNwZWNpZmljIGVsZW1lbnQsIGEgYmluIG9yIHRoZSB3aG9sZSBwaXBlbGluZS4gVGhpcyB3aWxsIGNhdXNlIGluZGV4YWJsZQorICogZWxlbWVudHMgdG8gYWRkIGVudGlyZXMgdG8gdGhlIGluZGV4IHdoaWxlIHBsYXlpbmcuCisgKi8KKworLyogRklYTUU6IGNvbXBsZXRlIGdvYmplY3QgYW5ub3RhdGlvbnMgKi8KKy8qIEZJWE1FLTAuMTE6IGNsZWFudXAgQVBJCisgKiAtIG5vIG9uZSBzZWVtcyB0byB1c2UgR3N0SW5kZXhHcm91cCwgR3N0SW5kZXhDZXJ0YWludHkKKyAqCisgKiAtIHRoZSBBUEkgZm9yIGFwcGxpY2F0aW9uIHRvIHVzZSB0aGUgaW5kZXggaXMgbW9zdGx5IG1pc3NpbmcKKyAqICAgLSBhcHBzIG5lZWQgdG8gZ2V0IGEgbGlzdCBvZiB3cml0ZXJzCisgKiAgIC0gYXBwcyBuZWVkIHRvIGJlIGFibGUgdG8gaXRlcmF0ZSBvdmVyIGVhY2ggd3JpdGVycyBpbmRleCBlbnRyeSBjb2xsZWN0aW9uCisgKiAtIGdzdF9pbmRleF9nZXRfYXNzb2NfZW50cnkoKSBzaG91bGQgcGFzcyBvd25lcnNoaXAKKyAqICAgLSB0aGUgR3N0SW5kZXhFbnRyeSBzdHJ1Y3R1cmUgaXMgbGFyZ2UgYW5kIGNvbnRhaW5zIHJlcGV0aXRpdmUgaW5mb3JtYXRpb24KKyAqICAgLSB3ZSB3YW50IHRvIGFsbG93IEluZGV4ZXJzIHRvIGltcGxlbWVudCBhIHNhbmVyIHN0b3JhZ2UgYW5kIGNyZWF0ZQorICogICAgIEdzdEluZGV4RW50cmllcyBvbiBkZW1hbmQgKHRoZSBhcHAgaGFzIHRvIGZyZWUgdGhlbSksIG1pZ2h0IGV2ZW4gbWFrZQorICogICAgIHNlbnNlIHRvIGFzayB0aGUgYXBwIHRvIHByb3ZpZGUgYSBwdHIgYW5kIGZpbGwgaXQuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisvKiBJbmRleCBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIEVOVFJZX0FEREVELAorICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUkVTT0xWRVIKKyAgICAgIC8qIEZJTEwgTUUgKi8KK307CisKKyNpZiAwCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChpbmRleF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBpbmRleF9kZWJ1ZworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGdzdF9pbmRleF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyB2b2lkIGdzdF9pbmRleF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfaW5kZXhfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0SW5kZXhHcm91cCAqZ3N0X2luZGV4X2dyb3VwX25ldyAoZ3VpbnQgZ3JvdXBudW0pOworc3RhdGljIHZvaWQgZ3N0X2luZGV4X2dyb3VwX2ZyZWUgKEdzdEluZGV4R3JvdXAgKiBncm91cCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfaW5kZXhfcGF0aF9yZXNvbHZlciAoR3N0SW5kZXggKiBpbmRleCwgR3N0T2JqZWN0ICogd3JpdGVyLAorICAgIGdjaGFyICoqIHdyaXRlcl9zdHJpbmcsIGdwb2ludGVyIGRhdGEpOworc3RhdGljIGdib29sZWFuIGdzdF9pbmRleF9ndHlwZV9yZXNvbHZlciAoR3N0SW5kZXggKiBpbmRleCwgR3N0T2JqZWN0ICogd3JpdGVyLAorICAgIGdjaGFyICoqIHdyaXRlcl9zdHJpbmcsIGdwb2ludGVyIGRhdGEpOworc3RhdGljIHZvaWQgZ3N0X2luZGV4X2FkZF9lbnRyeSAoR3N0SW5kZXggKiBpbmRleCwgR3N0SW5kZXhFbnRyeSAqIGVudHJ5KTsKKworc3RhdGljIGd1aW50IGdzdF9pbmRleF9zaWduYWxzW0xBU1RfU0lHTkFMXSA9IHsgMCB9OworCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RJbmRleFJlc29sdmVyTWV0aG9kIG1ldGhvZDsKKyAgR3N0SW5kZXhSZXNvbHZlciByZXNvbHZlcjsKKyAgZ3BvaW50ZXIgdXNlcl9kYXRhOworfQorUmVzb2x2ZXJFbnRyeTsKKworc3RhdGljIGNvbnN0IFJlc29sdmVyRW50cnkgcmVzb2x2ZXJzW10gPSB7CisgIHtHU1RfSU5ERVhfUkVTT0xWRVJfQ1VTVE9NLCBOVUxMLCBOVUxMfSwKKyAge0dTVF9JTkRFWF9SRVNPTFZFUl9HVFlQRSwgZ3N0X2luZGV4X2d0eXBlX3Jlc29sdmVyLCBOVUxMfSwKKyAge0dTVF9JTkRFWF9SRVNPTFZFUl9QQVRILCBnc3RfaW5kZXhfcGF0aF9yZXNvbHZlciwgTlVMTH0sCit9OworCisjZGVmaW5lIEdTVF9UWVBFX0lOREVYX1JFU09MVkVSIChnc3RfaW5kZXhfcmVzb2x2ZXJfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X2luZGV4X3Jlc29sdmVyX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgaW5kZXhfcmVzb2x2ZXJfdHlwZSA9IDA7CisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIGluZGV4X3Jlc29sdmVyW10gPSB7CisgICAge0dTVF9JTkRFWF9SRVNPTFZFUl9DVVNUT00sICJHU1RfSU5ERVhfUkVTT0xWRVJfQ1VTVE9NIiwgImN1c3RvbSJ9LAorICAgIHtHU1RfSU5ERVhfUkVTT0xWRVJfR1RZUEUsICJHU1RfSU5ERVhfUkVTT0xWRVJfR1RZUEUiLCAiZ3R5cGUifSwKKyAgICB7R1NUX0lOREVYX1JFU09MVkVSX1BBVEgsICJHU1RfSU5ERVhfUkVTT0xWRVJfUEFUSCIsICJwYXRoIn0sCisgICAgezAsIE5VTEwsIE5VTEx9LAorICB9OworCisgIGlmICghaW5kZXhfcmVzb2x2ZXJfdHlwZSkgeworICAgIGluZGV4X3Jlc29sdmVyX3R5cGUgPQorICAgICAgICBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0Rmx2RGVtdXhJbmRleFJlc29sdmVyIiwgaW5kZXhfcmVzb2x2ZXIpOworICB9CisgIHJldHVybiBpbmRleF9yZXNvbHZlcl90eXBlOworfQorCitHVHlwZQorZ3N0X2luZGV4X2VudHJ5X2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgaW5kZXhfZW50cnlfdHlwZSA9IDA7CisKKyAgaWYgKCFpbmRleF9lbnRyeV90eXBlKSB7CisgICAgaW5kZXhfZW50cnlfdHlwZSA9IGdfYm94ZWRfdHlwZV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RGbHZEZW11eEluZGV4RW50cnkiLAorICAgICAgICAoR0JveGVkQ29weUZ1bmMpIGdzdF9pbmRleF9lbnRyeV9jb3B5LAorICAgICAgICAoR0JveGVkRnJlZUZ1bmMpIGdzdF9pbmRleF9lbnRyeV9mcmVlKTsKKyAgfQorICByZXR1cm4gaW5kZXhfZW50cnlfdHlwZTsKK30KKworI2lmIDAKKyNkZWZpbmUgX2RvX2luaXQgXAoreyBcCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChpbmRleF9kZWJ1ZywgIkdTVF9JTkRFWCIsIEdTVF9ERUJVR19CT0xELCBcCisgICAgICAiR2VuZXJpYyBpbmRleGluZyBzdXBwb3J0Iik7IFwKK30KKyNlbmRpZgorCit0eXBlZGVmIEdzdEluZGV4IEdzdEZsdkRlbXV4SW5kZXg7Cit0eXBlZGVmIEdzdEluZGV4Q2xhc3MgR3N0Rmx2RGVtdXhJbmRleENsYXNzOworLy90eXBlZGVmIEdzdEluZGV4RW50cnkgR3N0Rmx2RGVtdXhJbmRleEVudHJ5OworR19ERUZJTkVfVFlQRSAoR3N0Rmx2RGVtdXhJbmRleCwgZ3N0X2luZGV4LCBHU1RfVFlQRV9PQkpFQ1QpOworCitzdGF0aWMgdm9pZAorZ3N0X2luZGV4X2NsYXNzX2luaXQgKEdzdEluZGV4Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICAvKioKKyAgICogR3N0SW5kZXg6OmVudHJ5LWFkZGVkCisgICAqIEBnc3RpbmRleDogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsLgorICAgKiBAYXJnMTogVGhlIGVudHJ5IGFkZGVkIHRvIHRoZSBpbmRleC4KKyAgICoKKyAgICogSXMgZW1pdHRlZCB3aGVuIGEgbmV3IGVudHJ5IGlzIGFkZGVkIHRvIHRoZSBpbmRleC4KKyAgICovCisgIGdzdF9pbmRleF9zaWduYWxzW0VOVFJZX0FEREVEXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJlbnRyeS1hZGRlZCIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksIEdfU0lHTkFMX1JVTl9MQVNULAorICAgICAgR19TVFJVQ1RfT0ZGU0VUIChHc3RJbmRleENsYXNzLCBlbnRyeV9hZGRlZCksIE5VTEwsIE5VTEwsCisgICAgICBOVUxMLCBHX1RZUEVfTk9ORSwgMSwgR1NUX1RZUEVfSU5ERVhfRU5UUlkpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9pbmRleF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9pbmRleF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2luZGV4X2ZpbmFsaXplOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkVTT0xWRVIsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoInJlc29sdmVyIiwgIlJlc29sdmVyIiwKKyAgICAgICAgICAiU2VsZWN0IGEgcHJlZGVmaW5lZCBvYmplY3QgdG8gc3RyaW5nIG1hcHBlciIsCisgICAgICAgICAgR1NUX1RZUEVfSU5ERVhfUkVTT0xWRVIsIEdTVF9JTkRFWF9SRVNPTFZFUl9QQVRILAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2luZGV4X2luaXQgKEdzdEluZGV4ICogaW5kZXgpCit7CisgIGluZGV4LT5jdXJncm91cCA9IGdzdF9pbmRleF9ncm91cF9uZXcgKDApOworICBpbmRleC0+bWF4Z3JvdXAgPSAwOworICBpbmRleC0+Z3JvdXBzID0gZ19saXN0X3ByZXBlbmQgKE5VTEwsIGluZGV4LT5jdXJncm91cCk7CisKKyAgaW5kZXgtPndyaXRlcnMgPSBnX2hhc2hfdGFibGVfbmV3IChOVUxMLCBOVUxMKTsKKyAgaW5kZXgtPmxhc3RfaWQgPSAwOworCisgIGluZGV4LT5tZXRob2QgPSBHU1RfSU5ERVhfUkVTT0xWRVJfUEFUSDsKKyAgaW5kZXgtPnJlc29sdmVyID0gcmVzb2x2ZXJzW2luZGV4LT5tZXRob2RdLnJlc29sdmVyOworICBpbmRleC0+cmVzb2x2ZXJfdXNlcl9kYXRhID0gcmVzb2x2ZXJzW2luZGV4LT5tZXRob2RdLnVzZXJfZGF0YTsKKworICBHU1RfT0JKRUNUX0ZMQUdfU0VUIChpbmRleCwgR1NUX0lOREVYX1dSSVRBQkxFKTsKKyAgR1NUX09CSkVDVF9GTEFHX1NFVCAoaW5kZXgsIEdTVF9JTkRFWF9SRUFEQUJMRSk7CisKKyAgR1NUX0RFQlVHICgiY3JlYXRlZCBuZXcgaW5kZXgiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9pbmRleF9mcmVlX3dyaXRlciAoZ3BvaW50ZXIga2V5LCBncG9pbnRlciB2YWx1ZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RJbmRleEVudHJ5ICplbnRyeSA9IChHc3RJbmRleEVudHJ5ICopIHZhbHVlOworCisgIGlmIChlbnRyeSkgeworICAgIGdzdF9pbmRleF9lbnRyeV9mcmVlIChlbnRyeSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9pbmRleF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0SW5kZXggKmluZGV4ID0gR1NUX0lOREVYIChvYmplY3QpOworCisgIGlmIChpbmRleC0+Z3JvdXBzKSB7CisgICAgZ19saXN0X2ZvcmVhY2ggKGluZGV4LT5ncm91cHMsIChHRnVuYykgZ3N0X2luZGV4X2dyb3VwX2ZyZWUsIE5VTEwpOworICAgIGdfbGlzdF9mcmVlIChpbmRleC0+Z3JvdXBzKTsKKyAgICBpbmRleC0+Z3JvdXBzID0gTlVMTDsKKyAgfQorCisgIGlmIChpbmRleC0+d3JpdGVycykgeworICAgIGdfaGFzaF90YWJsZV9mb3JlYWNoIChpbmRleC0+d3JpdGVycywgZ3N0X2luZGV4X2ZyZWVfd3JpdGVyLCBOVUxMKTsKKyAgICBnX2hhc2hfdGFibGVfZGVzdHJveSAoaW5kZXgtPndyaXRlcnMpOworICAgIGluZGV4LT53cml0ZXJzID0gTlVMTDsKKyAgfQorCisgIGlmIChpbmRleC0+ZmlsdGVyX3VzZXJfZGF0YSAmJiBpbmRleC0+ZmlsdGVyX3VzZXJfZGF0YV9kZXN0cm95KQorICAgIGluZGV4LT5maWx0ZXJfdXNlcl9kYXRhX2Rlc3Ryb3kgKGluZGV4LT5maWx0ZXJfdXNlcl9kYXRhKTsKKworICBpZiAoaW5kZXgtPnJlc29sdmVyX3VzZXJfZGF0YSAmJiBpbmRleC0+cmVzb2x2ZXJfdXNlcl9kYXRhX2Rlc3Ryb3kpCisgICAgaW5kZXgtPnJlc29sdmVyX3VzZXJfZGF0YV9kZXN0cm95IChpbmRleC0+cmVzb2x2ZXJfdXNlcl9kYXRhKTsKKworICBHX09CSkVDVF9DTEFTUyAoZ3N0X2luZGV4X3BhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2luZGV4X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RJbmRleCAqaW5kZXg7CisKKyAgaW5kZXggPSBHU1RfSU5ERVggKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1JFU09MVkVSOgorICAgICAgaW5kZXgtPm1ldGhvZCA9IChHc3RJbmRleFJlc29sdmVyTWV0aG9kKSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBpbmRleC0+cmVzb2x2ZXIgPSByZXNvbHZlcnNbaW5kZXgtPm1ldGhvZF0ucmVzb2x2ZXI7CisgICAgICBpbmRleC0+cmVzb2x2ZXJfdXNlcl9kYXRhID0gcmVzb2x2ZXJzW2luZGV4LT5tZXRob2RdLnVzZXJfZGF0YTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9pbmRleF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0SW5kZXggKmluZGV4OworCisgIGluZGV4ID0gR1NUX0lOREVYIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9SRVNPTFZFUjoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBpbmRleC0+bWV0aG9kKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdEluZGV4R3JvdXAgKgorZ3N0X2luZGV4X2dyb3VwX25ldyAoZ3VpbnQgZ3JvdXBudW0pCit7CisgIEdzdEluZGV4R3JvdXAgKmluZGV4Z3JvdXAgPSBnX3NsaWNlX25ldyAoR3N0SW5kZXhHcm91cCk7CisKKyAgaW5kZXhncm91cC0+Z3JvdXBudW0gPSBncm91cG51bTsKKyAgaW5kZXhncm91cC0+ZW50cmllcyA9IE5VTEw7CisgIGluZGV4Z3JvdXAtPmNlcnRhaW50eSA9IEdTVF9JTkRFWF9VTktOT1dOOworICBpbmRleGdyb3VwLT5wZWVyZ3JvdXAgPSAtMTsKKworICBHU1RfREVCVUcgKCJjcmVhdGVkIG5ldyBpbmRleCBncm91cCAlZCIsIGdyb3VwbnVtKTsKKworICByZXR1cm4gaW5kZXhncm91cDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9pbmRleF9ncm91cF9mcmVlIChHc3RJbmRleEdyb3VwICogZ3JvdXApCit7CisgIGdfc2xpY2VfZnJlZSAoR3N0SW5kZXhHcm91cCwgZ3JvdXApOworfQorCisvKiBkbyBub3QgcmVzdXJyZWN0IHRoaXMsIGFkZCBhIGRlcml2ZWQgZHVtbXkgaW5kZXggY2xhc3MgaW5zdGVhZCAqLworI2lmIDAKKy8qKgorICogZ3N0X2luZGV4X25ldzoKKyAqCisgKiBDcmVhdGUgYSBuZXcgZHVtbXkgaW5kZXggb2JqZWN0LiBVc2UgZ3N0X2VsZW1lbnRfc2V0X2luZGV4KCkgdG8gYXNzaWduIHRoYXQKKyAqIHRvIGFuIGVsZW1lbnQgb3IgcGlwZWxpbmUuIFRoaXMgaW5kZXggaXMgbm90IHN0b3JpbmcgYW55dGhpbmcsIGJ1dCB3aWxsCisgKiBzdGlsbCBlbWl0IGUuZy4gdGhlICNHc3RJbmRleDo6ZW50cnktYWRkZWQgc2lnbmFsLgorICoKKyAqIFJldHVybnM6ICh0cmFuc2ZlciBmdWxsKTogYSBuZXcgaW5kZXggb2JqZWN0CisgKi8KK0dzdEluZGV4ICoKK2dzdF9pbmRleF9uZXcgKHZvaWQpCit7CisgIEdzdEluZGV4ICppbmRleDsKKworICBpbmRleCA9IGdfb2JqZWN0X25ld3YgKGdzdF9pbmRleF9nZXRfdHlwZSAoKSwgMCwgTlVMTCk7CisKKyAgcmV0dXJuIGluZGV4OworfQorI2VuZGlmCisKKy8qKgorICogZ3N0X2luZGV4X2NvbW1pdDoKKyAqIEBpbmRleDogdGhlIGluZGV4IHRvIGNvbW1pdAorICogQGlkOiB0aGUgd3JpdGVyIHRoYXQgY29tbWl0ZWQgdGhlIGluZGV4CisgKgorICogVGVsbCB0aGUgaW5kZXggdGhhdCB0aGUgd3JpdGVyIHdpdGggdGhlIGdpdmVuIGlkIGlzIGRvbmUKKyAqIHdpdGggdGhpcyBpbmRleCBhbmQgaXMgbm90IGdvaW5nIHRvIHdyaXRlIGFueSBtb3JlIGVudHJpZXMKKyAqIHRvIGl0LgorICovCit2b2lkCitnc3RfaW5kZXhfY29tbWl0IChHc3RJbmRleCAqIGluZGV4LCBnaW50IGlkKQoreworICBHc3RJbmRleENsYXNzICppY2xhc3M7CisKKyAgaWNsYXNzID0gR1NUX0lOREVYX0dFVF9DTEFTUyAoaW5kZXgpOworCisgIGlmIChpY2xhc3MtPmNvbW1pdCkKKyAgICBpY2xhc3MtPmNvbW1pdCAoaW5kZXgsIGlkKTsKK30KKworI2lmIDAKKy8qKgorICogZ3N0X2luZGV4X2dldF9ncm91cDoKKyAqIEBpbmRleDogdGhlIGluZGV4IHRvIGdldCB0aGUgY3VycmVudCBncm91cCBmcm9tCisgKgorICogR2V0IHRoZSBpZCBvZiB0aGUgY3VycmVudCBncm91cC4KKyAqCisgKiBSZXR1cm5zOiB0aGUgaWQgb2YgdGhlIGN1cnJlbnQgZ3JvdXAuCisgKi8KK2dpbnQKK2dzdF9pbmRleF9nZXRfZ3JvdXAgKEdzdEluZGV4ICogaW5kZXgpCit7CisgIHJldHVybiBpbmRleC0+Y3VyZ3JvdXAtPmdyb3VwbnVtOworfQorCisvKioKKyAqIGdzdF9pbmRleF9uZXdfZ3JvdXA6CisgKiBAaW5kZXg6IHRoZSBpbmRleCB0byBjcmVhdGUgdGhlIG5ldyBncm91cCBpbgorICoKKyAqIENyZWF0ZSBhIG5ldyBncm91cCBmb3IgdGhlIGdpdmVuIGluZGV4LiBJdCB3aWxsIGJlCisgKiBzZXQgYXMgdGhlIGN1cnJlbnQgZ3JvdXAuCisgKgorICogUmV0dXJuczogdGhlIGlkIG9mIHRoZSBuZXdseSBjcmVhdGVkIGdyb3VwLgorICovCitnaW50Citnc3RfaW5kZXhfbmV3X2dyb3VwIChHc3RJbmRleCAqIGluZGV4KQoreworICBpbmRleC0+Y3VyZ3JvdXAgPSBnc3RfaW5kZXhfZ3JvdXBfbmV3ICgrK2luZGV4LT5tYXhncm91cCk7CisgIGluZGV4LT5ncm91cHMgPSBnX2xpc3RfYXBwZW5kIChpbmRleC0+Z3JvdXBzLCBpbmRleC0+Y3VyZ3JvdXApOworICBHU1RfREVCVUcgKCJjcmVhdGVkIG5ldyBncm91cCAlZCBpbiBpbmRleCIsIGluZGV4LT5tYXhncm91cCk7CisgIHJldHVybiBpbmRleC0+bWF4Z3JvdXA7Cit9CisKKy8qKgorICogZ3N0X2luZGV4X3NldF9ncm91cDoKKyAqIEBpbmRleDogdGhlIGluZGV4IHRvIHNldCB0aGUgbmV3IGdyb3VwIGluCisgKiBAZ3JvdXBudW06IHRoZSBncm91cG51bWJlciB0byBzZXQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZ3JvdXBudW1iZXIgdG8gdGhlIGdpdmVuIGFyZ3VtZW50LgorICoKKyAqIFJldHVybnM6IFRSVUUgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQsIEZBTFNFIGlmIHRoZSBncm91cAorICogZGlkIG5vdCBleGlzdC4KKyAqLworZ2Jvb2xlYW4KK2dzdF9pbmRleF9zZXRfZ3JvdXAgKEdzdEluZGV4ICogaW5kZXgsIGdpbnQgZ3JvdXBudW0pCit7CisgIEdMaXN0ICpsaXN0OworICBHc3RJbmRleEdyb3VwICppbmRleGdyb3VwOworCisgIC8qIGZpcnN0IGNoZWNrIGZvciBudWxsIGNoYW5nZSAqLworICBpZiAoZ3JvdXBudW0gPT0gaW5kZXgtPmN1cmdyb3VwLT5ncm91cG51bSkKKyAgICByZXR1cm4gVFJVRTsKKworICAvKiBlbHNlIHNlYXJjaCBmb3IgdGhlIHByb3BlciBncm91cCAqLworICBsaXN0ID0gaW5kZXgtPmdyb3VwczsKKyAgd2hpbGUgKGxpc3QpIHsKKyAgICBpbmRleGdyb3VwID0gKEdzdEluZGV4R3JvdXAgKikgKGxpc3QtPmRhdGEpOworICAgIGxpc3QgPSBnX2xpc3RfbmV4dCAobGlzdCk7CisgICAgaWYgKGluZGV4Z3JvdXAtPmdyb3VwbnVtID09IGdyb3VwbnVtKSB7CisgICAgICBpbmRleC0+Y3VyZ3JvdXAgPSBpbmRleGdyb3VwOworICAgICAgR1NUX0RFQlVHICgic3dpdGNoZWQgdG8gaW5kZXggZ3JvdXAgJWQiLCBpbmRleGdyb3VwLT5ncm91cG51bSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKworICAvKiBjb3VsZG4ndCBmaW5kIHRoZSBncm91cCBpbiBxdWVzdGlvbiAqLworICBHU1RfREVCVUcgKCJjb3VsZG4ndCBmaW5kIGluZGV4IGdyb3VwICVkIiwgZ3JvdXBudW0pOworICByZXR1cm4gRkFMU0U7Cit9CisjZW5kaWYKKworI2lmIDAKKy8qKgorICogZ3N0X2luZGV4X3NldF9jZXJ0YWludHk6CisgKiBAaW5kZXg6IHRoZSBpbmRleCB0byBzZXQgdGhlIGNlcnRhaW50eSBvbgorICogQGNlcnRhaW50eTogdGhlIGNlcnRhaW50eSB0byBzZXQKKyAqCisgKiBTZXQgdGhlIGNlcnRhaW50eSBvZiB0aGUgZ2l2ZW4gaW5kZXguCisgKi8KK3ZvaWQKK2dzdF9pbmRleF9zZXRfY2VydGFpbnR5IChHc3RJbmRleCAqIGluZGV4LCBHc3RJbmRleENlcnRhaW50eSBjZXJ0YWludHkpCit7CisgIGluZGV4LT5jdXJncm91cC0+Y2VydGFpbnR5ID0gY2VydGFpbnR5OworfQorCisvKioKKyAqIGdzdF9pbmRleF9nZXRfY2VydGFpbnR5OgorICogQGluZGV4OiB0aGUgaW5kZXggdG8gZ2V0IHRoZSBjZXJ0YWludHkgb2YKKyAqCisgKiBHZXQgdGhlIGNlcnRhaW50eSBvZiB0aGUgZ2l2ZW4gaW5kZXguCisgKgorICogUmV0dXJuczogdGhlIGNlcnRhaW50eSBvZiB0aGUgaW5kZXguCisgKi8KK0dzdEluZGV4Q2VydGFpbnR5Citnc3RfaW5kZXhfZ2V0X2NlcnRhaW50eSAoR3N0SW5kZXggKiBpbmRleCkKK3sKKyAgcmV0dXJuIGluZGV4LT5jdXJncm91cC0+Y2VydGFpbnR5OworfQorI2VuZGlmCisKKyNpZiAwCisvKioKKyAqIGdzdF9pbmRleF9zZXRfZmlsdGVyOgorICogQGluZGV4OiB0aGUgaW5kZXggdG8gcmVnaXN0ZXIgdGhlIGZpbHRlciBvbgorICogQGZpbHRlcjogdGhlIGZpbHRlciB0byByZWdpc3RlcgorICogQHVzZXJfZGF0YTogZGF0YSBwYXNzZWQgdG8gdGhlIGZpbHRlciBmdW5jdGlvbgorICoKKyAqIExldHMgdGhlIGFwcCByZWdpc3RlciBhIGN1c3RvbSBmaWx0ZXIgZnVuY3Rpb24gc28gdGhhdAorICogaXQgY2FuIHNlbGVjdCB3aGF0IGVudHJpZXMgc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgaW5kZXguCisgKi8KK3ZvaWQKK2dzdF9pbmRleF9zZXRfZmlsdGVyIChHc3RJbmRleCAqIGluZGV4LAorICAgIEdzdEluZGV4RmlsdGVyIGZpbHRlciwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfSU5ERVggKGluZGV4KSk7CisKKyAgZ3N0X2luZGV4X3NldF9maWx0ZXJfZnVsbCAoaW5kZXgsIGZpbHRlciwgdXNlcl9kYXRhLCBOVUxMKTsKK30KKworLyoqCisgKiBnc3RfaW5kZXhfc2V0X2ZpbHRlcl9mdWxsOgorICogQGluZGV4OiB0aGUgaW5kZXggdG8gcmVnaXN0ZXIgdGhlIGZpbHRlciBvbgorICogQGZpbHRlcjogdGhlIGZpbHRlciB0byByZWdpc3RlcgorICogQHVzZXJfZGF0YTogZGF0YSBwYXNzZWQgdG8gdGhlIGZpbHRlciBmdW5jdGlvbgorICogQHVzZXJfZGF0YV9kZXN0cm95OiBmdW5jdGlvbiB0byBjYWxsIHdoZW4gQHVzZXJfZGF0YSBpcyB1bnNldAorICoKKyAqIExldHMgdGhlIGFwcCByZWdpc3RlciBhIGN1c3RvbSBmaWx0ZXIgZnVuY3Rpb24gc28gdGhhdAorICogaXQgY2FuIHNlbGVjdCB3aGF0IGVudHJpZXMgc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgaW5kZXguCisgKi8KK3ZvaWQKK2dzdF9pbmRleF9zZXRfZmlsdGVyX2Z1bGwgKEdzdEluZGV4ICogaW5kZXgsCisgICAgR3N0SW5kZXhGaWx0ZXIgZmlsdGVyLCBncG9pbnRlciB1c2VyX2RhdGEsIEdEZXN0cm95Tm90aWZ5IHVzZXJfZGF0YV9kZXN0cm95KQoreworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfSU5ERVggKGluZGV4KSk7CisKKyAgaWYgKGluZGV4LT5maWx0ZXJfdXNlcl9kYXRhICYmIGluZGV4LT5maWx0ZXJfdXNlcl9kYXRhX2Rlc3Ryb3kpCisgICAgaW5kZXgtPmZpbHRlcl91c2VyX2RhdGFfZGVzdHJveSAoaW5kZXgtPmZpbHRlcl91c2VyX2RhdGEpOworCisgIGluZGV4LT5maWx0ZXIgPSBmaWx0ZXI7CisgIGluZGV4LT5maWx0ZXJfdXNlcl9kYXRhID0gdXNlcl9kYXRhOworICBpbmRleC0+ZmlsdGVyX3VzZXJfZGF0YV9kZXN0cm95ID0gdXNlcl9kYXRhX2Rlc3Ryb3k7Cit9CisKKy8qKgorICogZ3N0X2luZGV4X3NldF9yZXNvbHZlcjoKKyAqIEBpbmRleDogdGhlIGluZGV4IHRvIHJlZ2lzdGVyIHRoZSByZXNvbHZlciBvbgorICogQHJlc29sdmVyOiB0aGUgcmVzb2x2ZXIgdG8gcmVnaXN0ZXIKKyAqIEB1c2VyX2RhdGE6IGRhdGEgcGFzc2VkIHRvIHRoZSByZXNvbHZlciBmdW5jdGlvbgorICoKKyAqIExldHMgdGhlIGFwcCByZWdpc3RlciBhIGN1c3RvbSBmdW5jdGlvbiB0byBtYXAgaW5kZXgKKyAqIGlkcyB0byB3cml0ZXIgZGVzY3JpcHRpb25zLgorICovCit2b2lkCitnc3RfaW5kZXhfc2V0X3Jlc29sdmVyIChHc3RJbmRleCAqIGluZGV4LAorICAgIEdzdEluZGV4UmVzb2x2ZXIgcmVzb2x2ZXIsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZ3N0X2luZGV4X3NldF9yZXNvbHZlcl9mdWxsIChpbmRleCwgcmVzb2x2ZXIsIHVzZXJfZGF0YSwgTlVMTCk7Cit9CisKKy8qKgorICogZ3N0X2luZGV4X3NldF9yZXNvbHZlcl9mdWxsOgorICogQGluZGV4OiB0aGUgaW5kZXggdG8gcmVnaXN0ZXIgdGhlIHJlc29sdmVyIG9uCisgKiBAcmVzb2x2ZXI6IHRoZSByZXNvbHZlciB0byByZWdpc3RlcgorICogQHVzZXJfZGF0YTogZGF0YSBwYXNzZWQgdG8gdGhlIHJlc29sdmVyIGZ1bmN0aW9uCisgKiBAdXNlcl9kYXRhX2Rlc3Ryb3k6IGRlc3Ryb3kgZnVuY3Rpb24gZm9yIEB1c2VyX2RhdGEKKyAqCisgKiBMZXRzIHRoZSBhcHAgcmVnaXN0ZXIgYSBjdXN0b20gZnVuY3Rpb24gdG8gbWFwIGluZGV4CisgKiBpZHMgdG8gd3JpdGVyIGRlc2NyaXB0aW9ucy4KKyAqCisgKiBTaW5jZTogMC4xMC4xOAorICovCit2b2lkCitnc3RfaW5kZXhfc2V0X3Jlc29sdmVyX2Z1bGwgKEdzdEluZGV4ICogaW5kZXgsIEdzdEluZGV4UmVzb2x2ZXIgcmVzb2x2ZXIsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhLCBHRGVzdHJveU5vdGlmeSB1c2VyX2RhdGFfZGVzdHJveSkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX0lOREVYIChpbmRleCkpOworCisgIGlmIChpbmRleC0+cmVzb2x2ZXJfdXNlcl9kYXRhICYmIGluZGV4LT5yZXNvbHZlcl91c2VyX2RhdGFfZGVzdHJveSkKKyAgICBpbmRleC0+cmVzb2x2ZXJfdXNlcl9kYXRhX2Rlc3Ryb3kgKGluZGV4LT5yZXNvbHZlcl91c2VyX2RhdGEpOworCisgIGluZGV4LT5yZXNvbHZlciA9IHJlc29sdmVyOworICBpbmRleC0+cmVzb2x2ZXJfdXNlcl9kYXRhID0gdXNlcl9kYXRhOworICBpbmRleC0+cmVzb2x2ZXJfdXNlcl9kYXRhX2Rlc3Ryb3kgPSB1c2VyX2RhdGFfZGVzdHJveTsKKyAgaW5kZXgtPm1ldGhvZCA9IEdTVF9JTkRFWF9SRVNPTFZFUl9DVVNUT007Cit9CisjZW5kaWYKKworLyoqCisgKiBnc3RfaW5kZXhfZW50cnlfY29weToKKyAqIEBlbnRyeTogdGhlIGVudHJ5IHRvIGNvcHkKKyAqCisgKiBDb3BpZXMgYW4gZW50cnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKyAqCisgKiBGcmVlLWZ1bmN0aW9uOiBnc3RfaW5kZXhfZW50cnlfZnJlZQorICoKKyAqIFJldHVybnM6ICh0cmFuc2ZlciBmdWxsKTogYSBuZXdseSBhbGxvY2F0ZWQgI0dzdEluZGV4RW50cnkuCisgKi8KK0dzdEluZGV4RW50cnkgKgorZ3N0X2luZGV4X2VudHJ5X2NvcHkgKEdzdEluZGV4RW50cnkgKiBlbnRyeSkKK3sKKyAgR3N0SW5kZXhFbnRyeSAqbmV3X2VudHJ5ID0gZ19zbGljZV9uZXcgKEdzdEluZGV4RW50cnkpOworCisgIG1lbWNweSAobmV3X2VudHJ5LCBlbnRyeSwgc2l6ZW9mIChHc3RJbmRleEVudHJ5KSk7CisgIHJldHVybiBuZXdfZW50cnk7Cit9CisKKy8qKgorICogZ3N0X2luZGV4X2VudHJ5X2ZyZWU6CisgKiBAZW50cnk6ICh0cmFuc2ZlciBmdWxsKTogdGhlIGVudHJ5IHRvIGZyZWUKKyAqCisgKiBGcmVlIHRoZSBtZW1vcnkgdXNlZCBieSB0aGUgZ2l2ZW4gZW50cnkuCisgKi8KK3ZvaWQKK2dzdF9pbmRleF9lbnRyeV9mcmVlIChHc3RJbmRleEVudHJ5ICogZW50cnkpCit7CisgIHN3aXRjaCAoZW50cnktPnR5cGUpIHsKKyAgICBjYXNlIEdTVF9JTkRFWF9FTlRSWV9JRDoKKyAgICAgIGlmIChlbnRyeS0+ZGF0YS5pZC5kZXNjcmlwdGlvbikgeworICAgICAgICBnX2ZyZWUgKGVudHJ5LT5kYXRhLmlkLmRlc2NyaXB0aW9uKTsKKyAgICAgICAgZW50cnktPmRhdGEuaWQuZGVzY3JpcHRpb24gPSBOVUxMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfSU5ERVhfRU5UUllfQVNTT0NJQVRJT046CisgICAgICBpZiAoZW50cnktPmRhdGEuYXNzb2MuYXNzb2NzKSB7CisgICAgICAgIGdfZnJlZSAoZW50cnktPmRhdGEuYXNzb2MuYXNzb2NzKTsKKyAgICAgICAgZW50cnktPmRhdGEuYXNzb2MuYXNzb2NzID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0lOREVYX0VOVFJZX09CSkVDVDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0lOREVYX0VOVFJZX0ZPUk1BVDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgZ19zbGljZV9mcmVlIChHc3RJbmRleEVudHJ5LCBlbnRyeSk7Cit9CisKKyNpZiAwCisvKioKKyAqIGdzdF9pbmRleF9hZGRfZm9ybWF0OgorICogQGluZGV4OiB0aGUgaW5kZXggdG8gYWRkIHRoZSBlbnRyeSB0bworICogQGlkOiB0aGUgaWQgb2YgdGhlIGluZGV4IHdyaXRlcgorICogQGZvcm1hdDogdGhlIGZvcm1hdCB0byBhZGQgdG8gdGhlIGluZGV4CisgKgorICogQWRkcyBhIGZvcm1hdCBlbnRyeSBpbnRvIHRoZSBpbmRleC4gVGhpcyBmdW5jdGlvbiBpcworICogdXNlZCB0byBtYXAgZHluYW1pYyBHc3RGb3JtYXQgaWRzIHRvIHRoZWlyIG9yaWdpbmFsCisgKiBmb3JtYXQga2V5LgorICoKKyAqIEZyZWUtZnVuY3Rpb246IGdzdF9pbmRleF9lbnRyeV9mcmVlCisgKgorICogUmV0dXJuczogKHRyYW5zZmVyIGZ1bGwpOiBhIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGFkZGVkIGVudHJ5IGluIHRoZSBpbmRleC4KKyAqLworR3N0SW5kZXhFbnRyeSAqCitnc3RfaW5kZXhfYWRkX2Zvcm1hdCAoR3N0SW5kZXggKiBpbmRleCwgZ2ludCBpZCwgR3N0Rm9ybWF0IGZvcm1hdCkKK3sKKyAgR3N0SW5kZXhFbnRyeSAqZW50cnk7CisgIGNvbnN0IEdzdEZvcm1hdERlZmluaXRpb24gKmRlZjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX0lOREVYIChpbmRleCksIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZm9ybWF0ICE9IDAsIE5VTEwpOworCisgIGlmICghR1NUX0lOREVYX0lTX1dSSVRBQkxFIChpbmRleCkgfHwgaWQgPT0gLTEpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZW50cnkgPSBnX3NsaWNlX25ldyAoR3N0SW5kZXhFbnRyeSk7CisgIGVudHJ5LT50eXBlID0gR1NUX0lOREVYX0VOVFJZX0ZPUk1BVDsKKyAgZW50cnktPmlkID0gaWQ7CisgIGVudHJ5LT5kYXRhLmZvcm1hdC5mb3JtYXQgPSBmb3JtYXQ7CisKKyAgZGVmID0gZ3N0X2Zvcm1hdF9nZXRfZGV0YWlscyAoZm9ybWF0KTsKKyAgZW50cnktPmRhdGEuZm9ybWF0LmtleSA9IGRlZi0+bmljazsKKworICBnc3RfaW5kZXhfYWRkX2VudHJ5IChpbmRleCwgZW50cnkpOworCisgIHJldHVybiBlbnRyeTsKK30KKyNlbmRpZgorCisvKioKKyAqIGdzdF9pbmRleF9hZGRfaWQ6CisgKiBAaW5kZXg6IHRoZSBpbmRleCB0byBhZGQgdGhlIGVudHJ5IHRvCisgKiBAaWQ6IHRoZSBpZCBvZiB0aGUgaW5kZXggd3JpdGVyCisgKiBAZGVzY3JpcHRpb246IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgaW5kZXggd3JpdGVyCisgKgorICogQWRkIGFuIGlkIGVudHJ5IGludG8gdGhlIGluZGV4LgorICoKKyAqIFJldHVybnM6IGEgcG9pbnRlciB0byB0aGUgbmV3bHkgYWRkZWQgZW50cnkgaW4gdGhlIGluZGV4LgorICovCitHc3RJbmRleEVudHJ5ICoKK2dzdF9pbmRleF9hZGRfaWQgKEdzdEluZGV4ICogaW5kZXgsIGdpbnQgaWQsIGdjaGFyICogZGVzY3JpcHRpb24pCit7CisgIEdzdEluZGV4RW50cnkgKmVudHJ5OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfSU5ERVggKGluZGV4KSwgTlVMTCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChkZXNjcmlwdGlvbiAhPSBOVUxMLCBOVUxMKTsKKworICBpZiAoIUdTVF9JTkRFWF9JU19XUklUQUJMRSAoaW5kZXgpIHx8IGlkID09IC0xKQorICAgIHJldHVybiBOVUxMOworCisgIGVudHJ5ID0gZ19zbGljZV9uZXcgKEdzdEluZGV4RW50cnkpOworICBlbnRyeS0+dHlwZSA9IEdTVF9JTkRFWF9FTlRSWV9JRDsKKyAgZW50cnktPmlkID0gaWQ7CisgIGVudHJ5LT5kYXRhLmlkLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisKKyAgZ3N0X2luZGV4X2FkZF9lbnRyeSAoaW5kZXgsIGVudHJ5KTsKKworICByZXR1cm4gZW50cnk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2luZGV4X3BhdGhfcmVzb2x2ZXIgKEdzdEluZGV4ICogaW5kZXgsIEdzdE9iamVjdCAqIHdyaXRlciwKKyAgICBnY2hhciAqKiB3cml0ZXJfc3RyaW5nLCBncG9pbnRlciBkYXRhKQoreworICAqd3JpdGVyX3N0cmluZyA9IGdzdF9vYmplY3RfZ2V0X3BhdGhfc3RyaW5nICh3cml0ZXIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9pbmRleF9ndHlwZV9yZXNvbHZlciAoR3N0SW5kZXggKiBpbmRleCwgR3N0T2JqZWN0ICogd3JpdGVyLAorICAgIGdjaGFyICoqIHdyaXRlcl9zdHJpbmcsIGdwb2ludGVyIGRhdGEpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsICh3cml0ZXIgIT0gTlVMTCwgRkFMU0UpOworCisgIGlmIChHU1RfSVNfUEFEICh3cml0ZXIpKSB7CisgICAgR3N0T2JqZWN0ICplbGVtZW50ID0gZ3N0X29iamVjdF9nZXRfcGFyZW50IChHU1RfT0JKRUNUICh3cml0ZXIpKTsKKyAgICBnY2hhciAqbmFtZTsKKworICAgIG5hbWUgPSBnc3Rfb2JqZWN0X2dldF9uYW1lICh3cml0ZXIpOworICAgIGlmIChlbGVtZW50KSB7CisgICAgICAqd3JpdGVyX3N0cmluZyA9IGdfc3RyZHVwX3ByaW50ZiAoIiVzLiVzIiwKKyAgICAgICAgICBHX09CSkVDVF9UWVBFX05BTUUgKGVsZW1lbnQpLCBuYW1lKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKGVsZW1lbnQpOworICAgIH0gZWxzZSB7CisgICAgICAqd3JpdGVyX3N0cmluZyA9IG5hbWU7CisgICAgICBuYW1lID0gTlVMTDsKKyAgICB9CisKKyAgICBnX2ZyZWUgKG5hbWUpOworCisgIH0gZWxzZSB7CisgICAgKndyaXRlcl9zdHJpbmcgPSBnX3N0cmR1cCAoR19PQkpFQ1RfVFlQRV9OQU1FICh3cml0ZXIpKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIGdzdF9pbmRleF9nZXRfd3JpdGVyX2lkOgorICogQGluZGV4OiB0aGUgaW5kZXggdG8gZ2V0IGEgdW5pcXVlIHdyaXRlIGlkIGZvcgorICogQHdyaXRlcjogdGhlIEdzdE9iamVjdCB0byBhbGxvY2F0ZSBhbiBpZCBmb3IKKyAqIEBpZDogYSBwb2ludGVyIHRvIGEgZ2ludCB0byBob2xkIHRoZSBpZAorICoKKyAqIEJlZm9yZSBlbnRyaWVzIGNhbiBiZSBhZGRlZCB0byB0aGUgaW5kZXgsIGEgd3JpdGVyCisgKiBzaG91bGQgb2J0YWluIGEgdW5pcXVlIGlkLiBUaGUgbWV0aG9kcyB0byBhZGQgbmV3IGVudHJpZXMKKyAqIHRvIHRoZSBpbmRleCByZXF1aXJlIHRoaXMgaWQgYXMgYW4gYXJndW1lbnQuCisgKgorICogVGhlIGFwcGxpY2F0aW9uIGNhbiBpbXBsZW1lbnQgYSBjdXN0b20gZnVuY3Rpb24gdG8gbWFwIHRoZSB3cml0ZXIgb2JqZWN0CisgKiB0byBhIHN0cmluZy4gVGhhdCBzdHJpbmcgd2lsbCBiZSB1c2VkIHRvIHJlZ2lzdGVyIG9yIGxvb2sgdXAgYW4gaWQKKyAqIGluIHRoZSBpbmRleC4KKyAqCisgKiA8bm90ZT4KKyAqIFRoZSBjYWxsZXIgbXVzdCBub3QgaG9sZCBAd3JpdGVyJ3MgI0dTVF9PQkpFQ1RfTE9DSywgYXMgdGhlIGRlZmF1bHQKKyAqIHJlc29sdmVyIG1heSBjYWxsIGZ1bmN0aW9ucyB0aGF0IHRha2UgdGhlIG9iamVjdCBsb2NrIGFzIHdlbGwsIGFuZAorICogdGhlIGxvY2sgaXMgbm90IHJlY3Vyc2l2ZS4KKyAqIDwvbm90ZT4KKyAqCisgKiBSZXR1cm5zOiBUUlVFIGlmIHRoZSB3cml0ZXIgd291bGQgYmUgbWFwcGVkIHRvIGFuIGlkLgorICovCitnYm9vbGVhbgorZ3N0X2luZGV4X2dldF93cml0ZXJfaWQgKEdzdEluZGV4ICogaW5kZXgsIEdzdE9iamVjdCAqIHdyaXRlciwgZ2ludCAqIGlkKQoreworICBnY2hhciAqd3JpdGVyX3N0cmluZyA9IE5VTEw7CisgIEdzdEluZGV4RW50cnkgKmVudHJ5OworICBHc3RJbmRleENsYXNzICppY2xhc3M7CisgIGdib29sZWFuIHN1Y2Nlc3MgPSBGQUxTRTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX0lOREVYIChpbmRleCksIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9JU19PQkpFQ1QgKHdyaXRlciksIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGlkLCBGQUxTRSk7CisKKyAgKmlkID0gLTE7CisKKyAgLyogZmlyc3QgdHJ5IHRvIGdldCBhIHByZXZpb3VzbHkgY2FjaGVkIGlkICovCisgIGVudHJ5ID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAoaW5kZXgtPndyaXRlcnMsIHdyaXRlcik7CisgIGlmIChlbnRyeSA9PSBOVUxMKSB7CisKKyAgICBpY2xhc3MgPSBHU1RfSU5ERVhfR0VUX0NMQVNTIChpbmRleCk7CisKKyAgICAvKiBsZXQgdGhlIGFwcCBtYWtlIGEgc3RyaW5nICovCisgICAgaWYgKGluZGV4LT5yZXNvbHZlcikgeworICAgICAgZ2Jvb2xlYW4gcmVzOworCisgICAgICByZXMgPQorICAgICAgICAgIGluZGV4LT5yZXNvbHZlciAoaW5kZXgsIHdyaXRlciwgJndyaXRlcl9zdHJpbmcsCisgICAgICAgICAgaW5kZXgtPnJlc29sdmVyX3VzZXJfZGF0YSk7CisgICAgICBpZiAoIXJlcykKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICBnX3dhcm5pbmcgKCJubyByZXNvbHZlciBmb3VuZCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIGlmIHRoZSBpbmRleCBoYXMgYSByZXNvbHZlciwgbWFrZSBpdCBtYXAgdGhpcyBzdHJpbmcgdG8gYW4gaWQgKi8KKyAgICBpZiAoaWNsYXNzLT5nZXRfd3JpdGVyX2lkKSB7CisgICAgICBzdWNjZXNzID0gaWNsYXNzLT5nZXRfd3JpdGVyX2lkIChpbmRleCwgaWQsIHdyaXRlcl9zdHJpbmcpOworICAgIH0KKyAgICAvKiBpZiB0aGUgaW5kZXggY291bGQgbm90IHJlc29sdmUsIHdlIGFsbG9jYXRlIG9uZSBvdXJzZWx2ZXMgKi8KKyAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICppZCA9ICsraW5kZXgtPmxhc3RfaWQ7CisgICAgfQorCisgICAgZW50cnkgPSBnc3RfaW5kZXhfYWRkX2lkIChpbmRleCwgKmlkLCB3cml0ZXJfc3RyaW5nKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAvKiBpbmRleCBpcyBwcm9iYWJseSBub3Qgd3JpdGFibGUsIG1ha2UgYW4gZW50cnkgYW55d2F5CisgICAgICAgKiB0byBrZWVwIGl0IGluIG91ciBjYWNoZSAqLworICAgICAgZW50cnkgPSBnX3NsaWNlX25ldyAoR3N0SW5kZXhFbnRyeSk7CisgICAgICBlbnRyeS0+dHlwZSA9IEdTVF9JTkRFWF9FTlRSWV9JRDsKKyAgICAgIGVudHJ5LT5pZCA9ICppZDsKKyAgICAgIGVudHJ5LT5kYXRhLmlkLmRlc2NyaXB0aW9uID0gd3JpdGVyX3N0cmluZzsKKyAgICB9CisgICAgZ19oYXNoX3RhYmxlX2luc2VydCAoaW5kZXgtPndyaXRlcnMsIHdyaXRlciwgZW50cnkpOworICB9IGVsc2UgeworICAgICppZCA9IGVudHJ5LT5pZDsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2luZGV4X2FkZF9lbnRyeSAoR3N0SW5kZXggKiBpbmRleCwgR3N0SW5kZXhFbnRyeSAqIGVudHJ5KQoreworICBHc3RJbmRleENsYXNzICppY2xhc3M7CisKKyAgaWNsYXNzID0gR1NUX0lOREVYX0dFVF9DTEFTUyAoaW5kZXgpOworCisgIGlmIChpY2xhc3MtPmFkZF9lbnRyeSkgeworICAgIGljbGFzcy0+YWRkX2VudHJ5IChpbmRleCwgZW50cnkpOworICB9CisKKyAgZ19zaWduYWxfZW1pdCAoaW5kZXgsIGdzdF9pbmRleF9zaWduYWxzW0VOVFJZX0FEREVEXSwgMCwgZW50cnkpOworfQorCisvKioKKyAqIGdzdF9pbmRleF9hZGRfYXNzb2NpYXRpb252OgorICogQGluZGV4OiB0aGUgaW5kZXggdG8gYWRkIHRoZSBlbnRyeSB0bworICogQGlkOiB0aGUgaWQgb2YgdGhlIGluZGV4IHdyaXRlcgorICogQGZsYWdzOiBvcHRpbmFsIGZsYWdzIGZvciB0aGlzIGVudHJ5CisgKiBAbjogbnVtYmVyIG9mIGFzc29jaWF0aW9ucworICogQGxpc3Q6IGxpc3Qgb2YgYXNzb2NpYXRpb25zCisgKgorICogQXNzb2NpYXRlIGdpdmVuIGZvcm1hdC92YWx1ZSBwYWlycyB3aXRoIGVhY2ggb3RoZXIuCisgKgorICogUmV0dXJuczogYSBwb2ludGVyIHRvIHRoZSBuZXdseSBhZGRlZCBlbnRyeSBpbiB0aGUgaW5kZXguCisgKi8KK0dzdEluZGV4RW50cnkgKgorZ3N0X2luZGV4X2FkZF9hc3NvY2lhdGlvbnYgKEdzdEluZGV4ICogaW5kZXgsIGdpbnQgaWQsCisgICAgR3N0SW5kZXhBc3NvY2lhdGlvbkZsYWdzIGZsYWdzLCBnaW50IG4sIGNvbnN0IEdzdEluZGV4QXNzb2NpYXRpb24gKiBsaXN0KQoreworICBHc3RJbmRleEVudHJ5ICplbnRyeTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAobiA+IDAsIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAobGlzdCAhPSBOVUxMLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9JU19JTkRFWCAoaW5kZXgpLCBOVUxMKTsKKworICBpZiAoIUdTVF9JTkRFWF9JU19XUklUQUJMRSAoaW5kZXgpIHx8IGlkID09IC0xKQorICAgIHJldHVybiBOVUxMOworCisgIGVudHJ5ID0gZ19zbGljZV9uZXcgKEdzdEluZGV4RW50cnkpOworCisgIGVudHJ5LT50eXBlID0gR1NUX0lOREVYX0VOVFJZX0FTU09DSUFUSU9OOworICBlbnRyeS0+aWQgPSBpZDsKKyAgZW50cnktPmRhdGEuYXNzb2MuZmxhZ3MgPSBmbGFnczsKKyAgZW50cnktPmRhdGEuYXNzb2MuYXNzb2NzID0gZ19tZW1kdXAgKGxpc3QsIHNpemVvZiAoR3N0SW5kZXhBc3NvY2lhdGlvbikgKiBuKTsKKyAgZW50cnktPmRhdGEuYXNzb2MubmFzc29jcyA9IG47CisKKyAgZ3N0X2luZGV4X2FkZF9lbnRyeSAoaW5kZXgsIGVudHJ5KTsKKworICByZXR1cm4gZW50cnk7Cit9CisKKyNpZiAwCisvKioKKyAqIGdzdF9pbmRleF9hZGRfYXNzb2NpYXRpb246CisgKiBAaW5kZXg6IHRoZSBpbmRleCB0byBhZGQgdGhlIGVudHJ5IHRvCisgKiBAaWQ6IHRoZSBpZCBvZiB0aGUgaW5kZXggd3JpdGVyCisgKiBAZmxhZ3M6IG9wdGluYWwgZmxhZ3MgZm9yIHRoaXMgZW50cnkKKyAqIEBmb3JtYXQ6IHRoZSBmb3JtYXQgb2YgdGhlIHZhbHVlCisgKiBAdmFsdWU6IHRoZSB2YWx1ZQorICogQC4uLjogb3RoZXIgZm9ybWF0L3ZhbHVlIHBhaXJzIG9yIDAgdG8gZW5kIHRoZSBsaXN0CisgKgorICogQXNzb2NpYXRlIGdpdmVuIGZvcm1hdC92YWx1ZSBwYWlycyB3aXRoIGVhY2ggb3RoZXIuCisgKiBCZSBzdXJlIHRvIHBhc3MgZ2ludDY0IHZhbHVlcyB0byB0aGlzIGZ1bmN0aW9ucyB2YXJhcmdzLAorICogeW91IG1pZ2h0IHdhbnQgdG8gdXNlIGEgZ2ludDY0IGNhc3QgdG8gYmUgc3VyZS4KKyAqCisgKiBSZXR1cm5zOiBhIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGFkZGVkIGVudHJ5IGluIHRoZSBpbmRleC4KKyAqLworR3N0SW5kZXhFbnRyeSAqCitnc3RfaW5kZXhfYWRkX2Fzc29jaWF0aW9uIChHc3RJbmRleCAqIGluZGV4LCBnaW50IGlkLAorICAgIEdzdEluZGV4QXNzb2NpYXRpb25GbGFncyBmbGFncywgR3N0Rm9ybWF0IGZvcm1hdCwgZ2ludDY0IHZhbHVlLCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgR3N0SW5kZXhFbnRyeSAqZW50cnk7CisgIEdzdEluZGV4QXNzb2NpYXRpb24gKmxpc3Q7CisgIGdpbnQgbl9hc3NvY3MgPSAwOworICBHc3RGb3JtYXQgY3VyX2Zvcm1hdDsKKyAgR0FycmF5ICphcnJheTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX0lOREVYIChpbmRleCksIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZm9ybWF0ICE9IDAsIE5VTEwpOworCisgIGlmICghR1NUX0lOREVYX0lTX1dSSVRBQkxFIChpbmRleCkgfHwgaWQgPT0gLTEpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgYXJyYXkgPSBnX2FycmF5X25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKEdzdEluZGV4QXNzb2NpYXRpb24pKTsKKworICB7CisgICAgR3N0SW5kZXhBc3NvY2lhdGlvbiBhOworCisgICAgYS5mb3JtYXQgPSBmb3JtYXQ7CisgICAgYS52YWx1ZSA9IHZhbHVlOworICAgIG5fYXNzb2NzID0gMTsKKyAgICBnX2FycmF5X2FwcGVuZF92YWwgKGFycmF5LCBhKTsKKyAgfQorCisgIHZhX3N0YXJ0IChhcmdzLCB2YWx1ZSk7CisKKyAgd2hpbGUgKChjdXJfZm9ybWF0ID0gdmFfYXJnIChhcmdzLCBHc3RGb3JtYXQpKSkgeworICAgIEdzdEluZGV4QXNzb2NpYXRpb24gYTsKKworICAgIGEuZm9ybWF0ID0gY3VyX2Zvcm1hdDsKKyAgICBhLnZhbHVlID0gdmFfYXJnIChhcmdzLCBnaW50NjQpOworICAgIG5fYXNzb2NzKys7CisgICAgZ19hcnJheV9hcHBlbmRfdmFsIChhcnJheSwgYSk7CisgIH0KKworICB2YV9lbmQgKGFyZ3MpOworCisgIGxpc3QgPSAoR3N0SW5kZXhBc3NvY2lhdGlvbiAqKSBnX2FycmF5X2ZyZWUgKGFycmF5LCBGQUxTRSk7CisKKyAgZW50cnkgPSBnc3RfaW5kZXhfYWRkX2Fzc29jaWF0aW9udiAoaW5kZXgsIGlkLCBmbGFncywgbl9hc3NvY3MsIGxpc3QpOworICBnX2ZyZWUgKGxpc3QpOworCisgIHJldHVybiBlbnRyeTsKK30KKworLyoqCisgKiBnc3RfaW5kZXhfYWRkX29iamVjdDoKKyAqIEBpbmRleDogdGhlIGluZGV4IHRvIGFkZCB0aGUgb2JqZWN0IHRvCisgKiBAaWQ6IHRoZSBpZCBvZiB0aGUgaW5kZXggd3JpdGVyCisgKiBAa2V5OiBhIGtleSBmb3IgdGhlIG9iamVjdAorICogQHR5cGU6IHRoZSBHVHlwZSBvZiB0aGUgb2JqZWN0CisgKiBAb2JqZWN0OiBhIHBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBhZGQKKyAqCisgKiBBZGQgdGhlIGdpdmVuIG9iamVjdCB0byB0aGUgaW5kZXggd2l0aCB0aGUgZ2l2ZW4ga2V5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKyAqCisgKiBSZXR1cm5zOiBhIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGFkZGVkIGVudHJ5IGluIHRoZSBpbmRleC4KKyAqLworR3N0SW5kZXhFbnRyeSAqCitnc3RfaW5kZXhfYWRkX29iamVjdCAoR3N0SW5kZXggKiBpbmRleCwgZ2ludCBpZCwgZ2NoYXIgKiBrZXksCisgICAgR1R5cGUgdHlwZSwgZ3BvaW50ZXIgb2JqZWN0KQoreworICBpZiAoIUdTVF9JTkRFWF9JU19XUklUQUJMRSAoaW5kZXgpIHx8IGlkID09IC0xKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKK3N0YXRpYyBnaW50Citnc3RfaW5kZXhfY29tcGFyZV9mdW5jIChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBpZiAoYSA8IGIpCisgICAgcmV0dXJuIC0xOworICBpZiAoYSA+IGIpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCisvKioKKyAqIGdzdF9pbmRleF9nZXRfYXNzb2NfZW50cnk6CisgKiBAaW5kZXg6IHRoZSBpbmRleCB0byBzZWFyY2gKKyAqIEBpZDogdGhlIGlkIG9mIHRoZSBpbmRleCB3cml0ZXIKKyAqIEBtZXRob2Q6IFRoZSBsb29rdXAgbWV0aG9kIHRvIHVzZQorICogQGZsYWdzOiBGbGFncyBmb3IgdGhlIGVudHJ5CisgKiBAZm9ybWF0OiB0aGUgZm9ybWF0IG9mIHRoZSB2YWx1ZQorICogQHZhbHVlOiB0aGUgdmFsdWUgdG8gZmluZAorICoKKyAqIEZpbmRzIHRoZSBnaXZlbiBmb3JtYXQvdmFsdWUgaW4gdGhlIGluZGV4CisgKgorICogUmV0dXJuczogdGhlIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsdWUgb3IgTlVMTCBpZiB0aGUKKyAqICAgdmFsdWUgd2FzIG5vdCBmb3VuZC4KKyAqLworR3N0SW5kZXhFbnRyeSAqCitnc3RfaW5kZXhfZ2V0X2Fzc29jX2VudHJ5IChHc3RJbmRleCAqIGluZGV4LCBnaW50IGlkLAorICAgIEdzdEluZGV4TG9va3VwTWV0aG9kIG1ldGhvZCwgR3N0SW5kZXhBc3NvY2lhdGlvbkZsYWdzIGZsYWdzLAorICAgIEdzdEZvcm1hdCBmb3JtYXQsIGdpbnQ2NCB2YWx1ZSkKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9JU19JTkRFWCAoaW5kZXgpLCBOVUxMKTsKKworICBpZiAoaWQgPT0gLTEpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIGdzdF9pbmRleF9nZXRfYXNzb2NfZW50cnlfZnVsbCAoaW5kZXgsIGlkLCBtZXRob2QsIGZsYWdzLCBmb3JtYXQsCisgICAgICB2YWx1ZSwgZ3N0X2luZGV4X2NvbXBhcmVfZnVuYywgTlVMTCk7Cit9CisKKy8qKgorICogZ3N0X2luZGV4X2dldF9hc3NvY19lbnRyeV9mdWxsOgorICogQGluZGV4OiB0aGUgaW5kZXggdG8gc2VhcmNoCisgKiBAaWQ6IHRoZSBpZCBvZiB0aGUgaW5kZXggd3JpdGVyCisgKiBAbWV0aG9kOiBUaGUgbG9va3VwIG1ldGhvZCB0byB1c2UKKyAqIEBmbGFnczogRmxhZ3MgZm9yIHRoZSBlbnRyeQorICogQGZvcm1hdDogdGhlIGZvcm1hdCBvZiB0aGUgdmFsdWUKKyAqIEB2YWx1ZTogdGhlIHZhbHVlIHRvIGZpbmQKKyAqIEBmdW5jOiB0aGUgZnVuY3Rpb24gdXNlZCB0byBjb21wYXJlIGVudHJpZXMKKyAqIEB1c2VyX2RhdGE6IHVzZXIgZGF0YSBwYXNzZWQgdG8gdGhlIGNvbXBhcmUgZnVuY3Rpb24KKyAqCisgKiBGaW5kcyB0aGUgZ2l2ZW4gZm9ybWF0L3ZhbHVlIGluIHRoZSBpbmRleCB3aXRoIHRoZSBnaXZlbgorICogY29tcGFyZSBmdW5jdGlvbiBhbmQgdXNlcl9kYXRhLgorICoKKyAqIFJldHVybnM6IHRoZSBlbnRyeSBhc3NvY2lhdGVkIHdpdGggdGhlIHZhbHVlIG9yIE5VTEwgaWYgdGhlCisgKiAgIHZhbHVlIHdhcyBub3QgZm91bmQuCisgKi8KK0dzdEluZGV4RW50cnkgKgorZ3N0X2luZGV4X2dldF9hc3NvY19lbnRyeV9mdWxsIChHc3RJbmRleCAqIGluZGV4LCBnaW50IGlkLAorICAgIEdzdEluZGV4TG9va3VwTWV0aG9kIG1ldGhvZCwgR3N0SW5kZXhBc3NvY2lhdGlvbkZsYWdzIGZsYWdzLAorICAgIEdzdEZvcm1hdCBmb3JtYXQsIGdpbnQ2NCB2YWx1ZSwgR0NvbXBhcmVEYXRhRnVuYyBmdW5jLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdEluZGV4Q2xhc3MgKmljbGFzczsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX0lOREVYIChpbmRleCksIE5VTEwpOworCisgIGlmIChpZCA9PSAtMSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpY2xhc3MgPSBHU1RfSU5ERVhfR0VUX0NMQVNTIChpbmRleCk7CisKKyAgaWYgKGljbGFzcy0+Z2V0X2Fzc29jX2VudHJ5KQorICAgIHJldHVybiBpY2xhc3MtPmdldF9hc3NvY19lbnRyeSAoaW5kZXgsIGlkLCBtZXRob2QsIGZsYWdzLCBmb3JtYXQsIHZhbHVlLAorICAgICAgICBmdW5jLCB1c2VyX2RhdGEpOworCisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIGdzdF9pbmRleF9lbnRyeV9hc3NvY19tYXA6CisgKiBAZW50cnk6IHRoZSBpbmRleCB0byBzZWFyY2gKKyAqIEBmb3JtYXQ6IHRoZSBmb3JtYXQgb2YgdGhlIHZhbHVlIHRoZSBmaW5kCisgKiBAdmFsdWU6IGEgcG9pbnRlciB0byBzdG9yZSB0aGUgdmFsdWUKKyAqCisgKiBHZXRzIGFsdGVybmF0aXZlIGZvcm1hdHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbmRleGVudHJ5LgorICoKKyAqIFJldHVybnM6IFRSVUUgaWYgdGhlcmUgd2FzIGEgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbgorICogZm9ybWF0LgorICovCitnYm9vbGVhbgorZ3N0X2luZGV4X2VudHJ5X2Fzc29jX21hcCAoR3N0SW5kZXhFbnRyeSAqIGVudHJ5LAorICAgIEdzdEZvcm1hdCBmb3JtYXQsIGdpbnQ2NCAqIHZhbHVlKQoreworICBnaW50IGk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGVudHJ5ICE9IE5VTEwsIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHZhbHVlICE9IE5VTEwsIEZBTFNFKTsKKworICBmb3IgKGkgPSAwOyBpIDwgR1NUX0lOREVYX05BU1NPQ1MgKGVudHJ5KTsgaSsrKSB7CisgICAgaWYgKEdTVF9JTkRFWF9BU1NPQ19GT1JNQVQgKGVudHJ5LCBpKSA9PSBmb3JtYXQpIHsKKyAgICAgICp2YWx1ZSA9IEdTVF9JTkRFWF9BU1NPQ19WQUxVRSAoZW50cnksIGkpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKK30KZGlmZiAtLWdpdCBhL2dzdC9mbHYvZ3N0aW5kZXguaCBiL2dzdC9mbHYvZ3N0aW5kZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTUxZjljCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2Zsdi9nc3RpbmRleC5oCkBAIC0wLDAgKzEsNDQ4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwMCBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY2hlbGxvLmJlPgorICoKKyAqIGdzdGluZGV4Lmg6IEhlYWRlciBmb3IgR3N0SW5kZXgsIGJhc2UgY2xhc3MgdG8gaGFuZGxlIGVmZmljaWVudAorICogICAgICAgICAgICAgc3RvcmFnZSBvciBjYWNoaW5nIG9mIHNlZWtpbmcgaW5mb3JtYXRpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9JTkRFWF9IX18KKyNkZWZpbmUgX19HU1RfSU5ERVhfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0b2JqZWN0Lmg+CisjaW5jbHVkZSA8Z3N0L2dzdGZvcm1hdC5oPgorI2luY2x1ZGUgPGdzdC9nc3RwbHVnaW5mZWF0dXJlLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9JTkRFWCAgICAgICAgICAgICAgICAgIChnc3RfaW5kZXhfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9JTkRFWChvYmopICAgICAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfSU5ERVgsIEdzdEluZGV4KSkKKyNkZWZpbmUgR1NUX0lTX0lOREVYKG9iaikgICAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9JTkRFWCkpCisjZGVmaW5lIEdTVF9JTkRFWF9DTEFTUyhrbGFzcykgICAgICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9JTkRFWCwgR3N0SW5kZXhDbGFzcykpCisjZGVmaW5lIEdTVF9JU19JTkRFWF9DTEFTUyhrbGFzcykgICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9JTkRFWCkpCisjZGVmaW5lIEdTVF9JTkRFWF9HRVRfQ0xBU1Mob2JqKSAgICAgICAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9JTkRFWCwgR3N0SW5kZXhDbGFzcykpCisKKyNkZWZpbmUgR1NUX1RZUEVfSU5ERVhfRU5UUlkgICAgICAgICAgICAoZ3N0X2luZGV4X2VudHJ5X2dldF90eXBlKCkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RJbmRleEVudHJ5IEdzdEluZGV4RW50cnk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0SW5kZXhHcm91cCBHc3RJbmRleEdyb3VwOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEluZGV4IEdzdEluZGV4OwordHlwZWRlZiBzdHJ1Y3QgX0dzdEluZGV4Q2xhc3MgR3N0SW5kZXhDbGFzczsKKworLyoqCisgKiBHc3RJbmRleENlcnRhaW50eToKKyAqIEBHU1RfSU5ERVhfVU5LTk9XTjogYWNjdXJhY3kgaXMgbm90IGtub3duCisgKiBAR1NUX0lOREVYX0NFUlRBSU46IGFjY3VyYWN5IGlzIHBlcmZlY3QKKyAqIEBHU1RfSU5ERVhfRlVaWlk6IGFjY3VyYWN5IGlzIGZ1enp5CisgKgorICogVGhlIGNlcnRhaW50eSBvZiBhIGdyb3VwIGluIHRoZSBpbmRleC4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX0lOREVYX1VOS05PV04sCisgIEdTVF9JTkRFWF9DRVJUQUlOLAorICBHU1RfSU5ERVhfRlVaWlkKK30gR3N0SW5kZXhDZXJ0YWludHk7CisKKy8qKgorICogR3N0SW5kZXhFbnRyeVR5cGU6CisgKiBAR1NUX0lOREVYX0VOVFJZX0lEOiBUaGlzIGVudHJ5IGlzIGFuIGlkIHRoYXQgbWFwcyBhbiBpbmRleCBpZCB0byBpdHMgb3duZXIgb2JqZWN0CisgKiBAR1NUX0lOREVYX0VOVFJZX0FTU09DSUFUSU9OOiBUaGlzIGVudHJ5IGlzIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gZm9ybWF0cworICogQEdTVF9JTkRFWF9FTlRSWV9PQkpFQ1Q6IEFuIG9iamVjdAorICogQEdTVF9JTkRFWF9FTlRSWV9GT1JNQVQ6IEEgZm9ybWF0IGRlZmluaXRpb24KKyAqCisgKiBUaGUgZGlmZmVyZW50IHR5cGVzIG9mIGVudHJpZXMgaW4gdGhlIGluZGV4LgorICovCit0eXBlZGVmIGVudW0geworICBHU1RfSU5ERVhfRU5UUllfSUQsCisgIEdTVF9JTkRFWF9FTlRSWV9BU1NPQ0lBVElPTiwKKyAgR1NUX0lOREVYX0VOVFJZX09CSkVDVCwKKyAgR1NUX0lOREVYX0VOVFJZX0ZPUk1BVAorfSBHc3RJbmRleEVudHJ5VHlwZTsKKworLyoqCisgKiBHc3RJbmRleExvb2t1cE1ldGhvZDoKKyAqIEBHU1RfSU5ERVhfTE9PS1VQX0VYQUNUOiBUaGVyZSBoYXMgdG8gYmUgYW4gZXhhY3QgaW5kZXhlbnRyeSB3aXRoIHRoZSBnaXZlbiBmb3JtYXQvdmFsdWUKKyAqIEBHU1RfSU5ERVhfTE9PS1VQX0JFRk9SRTogVGhlIGV4YWN0IGVudHJ5IG9yIHRoZSBvbmUgYmVmb3JlIGl0CisgKiBAR1NUX0lOREVYX0xPT0tVUF9BRlRFUjogVGhlIGV4YWN0IGVudHJ5IG9yIHRoZSBvbmUgYWZ0ZXIgaXQKKyAqCisgKiBTcGVjaWZ5IHRoZSBtZXRob2QgdG8gZmluZCBhbiBpbmRleCBlbnRyeSBpbiB0aGUgaW5kZXguCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEdTVF9JTkRFWF9MT09LVVBfRVhBQ1QsCisgIEdTVF9JTkRFWF9MT09LVVBfQkVGT1JFLAorICBHU1RfSU5ERVhfTE9PS1VQX0FGVEVSCit9IEdzdEluZGV4TG9va3VwTWV0aG9kOworCisvKioKKyAqIEdTVF9JTkRFWF9OQVNTT0NTOgorICogQGVudHJ5OiBUaGUgZW50cnkgdG8gcXVlcnkKKyAqCisgKiBHZXQgdGhlIG51bWJlciBvZiBhc3NvY2lhdGlvbnMgaW4gdGhlIGVudHJ5LgorICovCisjZGVmaW5lIEdTVF9JTkRFWF9OQVNTT0NTKGVudHJ5KSAgICAgICAgICAgICAgICAoKGVudHJ5KS0+ZGF0YS5hc3NvYy5uYXNzb2NzKQorCisvKioKKyAqIEdTVF9JTkRFWF9BU1NPQ19GTEFHUzoKKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHF1ZXJ5CisgKgorICogIEdldCB0aGUgZmxhZ3MgZm9yIHRoaXMgZW50cnkuCisgKi8KKyNkZWZpbmUgR1NUX0lOREVYX0FTU09DX0ZMQUdTKGVudHJ5KSAgICAgICAgICAgICgoZW50cnkpLT5kYXRhLmFzc29jLmZsYWdzKQorCisvKioKKyAqIEdTVF9JTkRFWF9BU1NPQ19GT1JNQVQ6CisgKiBAZW50cnk6IFRoZSBlbnRyeSB0byBxdWVyeQorICogQGk6IFRoZSBmb3JtYXQgaW5kZXgKKyAqCisgKiBHZXQgdGhlIGktdGggZm9ybWF0IG9mIHRoZSBlbnRyeS4KKyAqLworI2RlZmluZSBHU1RfSU5ERVhfQVNTT0NfRk9STUFUKGVudHJ5LGkpICAgICAgICAgKChlbnRyeSktPmRhdGEuYXNzb2MuYXNzb2NzWyhpKV0uZm9ybWF0KQorCisvKioKKyAqIEdTVF9JTkRFWF9BU1NPQ19WQUxVRToKKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHF1ZXJ5CisgKiBAaTogVGhlIHZhbHVlIGluZGV4CisgKgorICogR2V0IHRoZSBpLXRoIHZhbHVlIG9mIHRoZSBlbnRyeS4KKyAqLworI2RlZmluZSBHU1RfSU5ERVhfQVNTT0NfVkFMVUUoZW50cnksaSkgICAgICAgICAgKChlbnRyeSktPmRhdGEuYXNzb2MuYXNzb2NzWyhpKV0udmFsdWUpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RJbmRleEFzc29jaWF0aW9uIEdzdEluZGV4QXNzb2NpYXRpb247CisKKy8qKgorICogR3N0SW5kZXhBc3NvY2lhdGlvbjoKKyAqIEBmb3JtYXQ6IHRoZSBmb3JtYXQgb2YgdGhlIGFzc29jaWF0aW9uCisgKiBAdmFsdWU6IHRoZSB2YWx1ZSBvZiB0aGUgYXNzb2NpYXRpb24KKyAqCisgKiBBbiBhc3NvY2lhdGlvbiBpbiBhbiBlbnRyeS4KKyAqLworc3RydWN0IF9Hc3RJbmRleEFzc29jaWF0aW9uIHsKKyAgR3N0Rm9ybWF0ICAgICBmb3JtYXQ7CisgIGdpbnQ2NCAgICAgICAgdmFsdWU7Cit9OworCisvKioKKyAqIEdzdEluZGV4QXNzb2NpYXRpb25GbGFnczoKKyAqIEBHU1RfSU5ERVhfQVNTT0NJQVRJT05fRkxBR19OT05FOiBubyBleHRyYSBmbGFncworICogQEdTVF9JTkRFWF9BU1NPQ0lBVElPTl9GTEFHX0tFWV9VTklUOiB0aGUgZW50cnkgbWFya3MgYSBrZXkgdW5pdCwgYSBrZXkgdW5pdCBpcyBvbmUKKyAqICB0aGF0IG1hcmtzIGEgcGxhY2Ugd2hlcmUgb25lIGNhbiByYW5kb21seSBzZWVrIHRvLgorICogQEdTVF9JTkRFWF9BU1NPQ0lBVElPTl9GTEFHX0RFTFRBX1VOSVQ6IHRoZSBlbnRyeSBtYXJrcyBhIGRlbHRhIHVuaXQsIGEgZGVsdGEgdW5pdAorICogIGlzIG9uZSB0aGF0IG1hcmtzIGEgcGxhY2Ugd2hlcmUgb25lIGNhbiByZWxhdGl2ZWx5IHNlZWsgdG8uCisgKiBAR1NUX0lOREVYX0FTU09DSUFUSU9OX0ZMQUdfTEFTVDogZXh0cmEgdXNlciBkZWZpbmVkIGZsYWdzIHNob3VsZCBzdGFydCBoZXJlLgorICoKKyAqIEZsYWdzIGZvciBhbiBhc3NvY2lhdGlvbiBlbnRyeS4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX0lOREVYX0FTU09DSUFUSU9OX0ZMQUdfTk9ORSAgICAgICA9IDAsCisgIEdTVF9JTkRFWF9BU1NPQ0lBVElPTl9GTEFHX0tFWV9VTklUICAgPSAoMSA8PCAwKSwKKyAgR1NUX0lOREVYX0FTU09DSUFUSU9OX0ZMQUdfREVMVEFfVU5JVCA9ICgxIDw8IDEpLAorCisgIC8qIG5ldyBmbGFncyBzaG91bGQgc3RhcnQgaGVyZSAqLworICBHU1RfSU5ERVhfQVNTT0NJQVRJT05fRkxBR19MQVNUICAgICA9ICgxIDw8IDgpCit9IEdzdEluZGV4QXNzb2NpYXRpb25GbGFnczsKKworLyoqCisgKiBHU1RfSU5ERVhfRk9STUFUX0ZPUk1BVDoKKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHF1ZXJ5CisgKgorICogR2V0IHRoZSBmb3JtYXQgb2YgdGhlIGZvcm1hdCBlbnRyeQorICovCisjZGVmaW5lIEdTVF9JTkRFWF9GT1JNQVRfRk9STUFUKGVudHJ5KSAgICAgICAgICAoKGVudHJ5KS0+ZGF0YS5mb3JtYXQuZm9ybWF0KQorCisvKioKKyAqIEdTVF9JTkRFWF9GT1JNQVRfS0VZOgorICogQGVudHJ5OiBUaGUgZW50cnkgdG8gcXVlcnkKKyAqCisgKiBHZXQgdGhlIGtleSBvZiB0aGUgZm9ybWF0IGVudHJ5CisgKi8KKyNkZWZpbmUgR1NUX0lOREVYX0ZPUk1BVF9LRVkoZW50cnkpICAgICAgICAgICAgICgoZW50cnkpLT5kYXRhLmZvcm1hdC5rZXkpCisKKy8qKgorICogR1NUX0lOREVYX0lEX0lOVkFMSUQ6CisgKgorICogQ29uc3RhbnQgZm9yIGFuIGludmFsaWQgaW5kZXggaWQKKyAqLworI2RlZmluZSBHU1RfSU5ERVhfSURfSU5WQUxJRCAgICAgICAgICAgICAgICAgICAgKC0xKQorCisvKioKKyAqIEdTVF9JTkRFWF9JRF9ERVNDUklQVElPTjoKKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHF1ZXJ5CisgKgorICogR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgaWQgZW50cnkKKyAqLworI2RlZmluZSBHU1RfSU5ERVhfSURfREVTQ1JJUFRJT04oZW50cnkpICAgICAgICAgKChlbnRyeSktPmRhdGEuaWQuZGVzY3JpcHRpb24pCisKKy8qKgorICogR3N0SW5kZXhFbnRyeToKKyAqCisgKiBUaGUgYmFzaWMgZWxlbWVudCBvZiBhbiBpbmRleC4KKyAqLworc3RydWN0IF9Hc3RJbmRleEVudHJ5IHsKKyAgLyo8IHByaXZhdGUgPiovCisgIEdzdEluZGV4RW50cnlUeXBlICAgICAgdHlwZTsKKyAgZ2ludCAgICAgICAgICAgICAgICAgICBpZDsKKworICB1bmlvbiB7CisgICAgc3RydWN0IHsKKyAgICAgIGdjaGFyICAgICAgICAgICAgICpkZXNjcmlwdGlvbjsKKyAgICB9IGlkOworICAgIHN0cnVjdCB7CisgICAgICBnaW50ICAgICAgICAgICAgICAgbmFzc29jczsKKyAgICAgIEdzdEluZGV4QXNzb2NpYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICphc3NvY3M7CisgICAgICBHc3RJbmRleEFzc29jaWF0aW9uRmxhZ3MgICAgICBmbGFnczsKKyAgICB9IGFzc29jOworICAgIHN0cnVjdCB7CisgICAgICBnY2hhciAgICAgICAgICAgICAqa2V5OworICAgICAgR1R5cGUgICAgICAgICAgICAgIHR5cGU7CisgICAgICBncG9pbnRlciAgICAgICAgICAgb2JqZWN0OworICAgIH0gb2JqZWN0OworICAgIHN0cnVjdCB7CisgICAgICBHc3RGb3JtYXQgICAgICAgICAgZm9ybWF0OworICAgICAgY29uc3QgZ2NoYXIgICAgICAgKmtleTsKKyAgICB9IGZvcm1hdDsKKyAgfSBkYXRhOworfTsKKworLyoqCisgKiBHc3RJbmRleEdyb3VwOgorICoKKyAqIEEgZ3JvdXAgb2YgcmVsYXRlZCBlbnRyaWVzIGluIGFuIGluZGV4LgorICovCisKK3N0cnVjdCBfR3N0SW5kZXhHcm91cCB7CisgIC8qPCBwcml2YXRlID4qLworICAvKiB1bmlxdWUgSUQgb2YgZ3JvdXAgaW4gaW5kZXggKi8KKyAgZ2ludCBncm91cG51bTsKKworICAvKiBsaXN0IG9mIGVudHJpZXMgKi8KKyAgR0xpc3QgKmVudHJpZXM7CisKKyAgLyogdGhlIGNlcnRhaW50eSBsZXZlbCBvZiB0aGUgZ3JvdXAgKi8KKyAgR3N0SW5kZXhDZXJ0YWludHkgY2VydGFpbnR5OworCisgIC8qIHBlZXIgZ3JvdXAgdGhhdCBjb250YWlucyBtb3JlIGNlcnRhaW4gZW50cmllcyAqLworICBnaW50IHBlZXJncm91cDsKK307CisKKy8qKgorICogR3N0SW5kZXhGaWx0ZXI6CisgKiBAaW5kZXg6IFRoZSBpbmRleCBiZWluZyBxdWVyaWVkCisgKiBAZW50cnk6IFRoZSBlbnRyeSB0byBiZSBhZGRlZC4KKyAqIEB1c2VyX2RhdGE6IFVzZXIgZGF0YSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLgorICoKKyAqIEZ1bmN0aW9uIHRvIGZpbHRlciBvdXQgZW50cmllcyBpbiB0aGUgaW5kZXguCisgKgorICogUmV0dXJuczogVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuICVUUlVFIGlmIHRoZSBlbnRyeSBpcyB0byBiZSBhZGRlZAorICogdG8gdGhlIGluZGV4LCAlRkFMU0Ugb3RoZXJ3aXNlLgorICoKKyAqLwordHlwZWRlZiBnYm9vbGVhbiAgICAgICAgKCpHc3RJbmRleEZpbHRlcikgICAgICAgICAgICAgICAoR3N0SW5kZXggKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0SW5kZXhFbnRyeSAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciB1c2VyX2RhdGEpOworLyoqCisgKiBHc3RJbmRleFJlc29sdmVyTWV0aG9kOgorICogQEdTVF9JTkRFWF9SRVNPTFZFUl9DVVNUT006IFVzZSBhIGN1c3RvbSByZXNvbHZlcgorICogQEdTVF9JTkRFWF9SRVNPTFZFUl9HVFlQRTogUmVzb2x2ZSBiYXNlZCBvbiB0aGUgR1R5cGUgb2YgdGhlIG9iamVjdAorICogQEdTVF9JTkRFWF9SRVNPTFZFUl9QQVRIOiBSZXNvbHZlIG9uIHRoZSBwYXRoIGluIGdyYXBoCisgKgorICogVGhlIG1ldGhvZCB1c2VkIHRvIHJlc29sdmUgaW5kZXggd3JpdGVycworICovCit0eXBlZGVmIGVudW0geworICBHU1RfSU5ERVhfUkVTT0xWRVJfQ1VTVE9NLAorICBHU1RfSU5ERVhfUkVTT0xWRVJfR1RZUEUsCisgIEdTVF9JTkRFWF9SRVNPTFZFUl9QQVRICit9IEdzdEluZGV4UmVzb2x2ZXJNZXRob2Q7CisKKy8qKgorICogR3N0SW5kZXhSZXNvbHZlcjoKKyAqIEBpbmRleDogdGhlIGluZGV4IGJlaW5nIHF1ZXJpZWQuCisgKiBAd3JpdGVyOiBUaGUgb2JqZWN0IHRoYXQgd2FudHMgdG8gd3JpdGUKKyAqIEB3cml0ZXJfc3RyaW5nOiBBIGRlc2NyaXB0aW9uIG9mIHRoZSB3cml0ZXIuCisgKiBAdXNlcl9kYXRhOiB1c2VyX2RhdGEgYXMgcmVnaXN0ZXJlZAorICoKKyAqIEZ1bmN0aW9uIHRvIHJlc29sdmUgaWRzIHRvIHdyaXRlciBkZXNjcmlwdGlvbnMuCisgKgorICogUmV0dXJuczogJVRSVUUgaWYgYW4gaWQgY291bGQgYmUgYXNzaWduZWQgdG8gdGhlIHdyaXRlci4KKyAqLwordHlwZWRlZiBnYm9vbGVhbiAgICAgICAgKCpHc3RJbmRleFJlc29sdmVyKSAgICAgICAgICAgICAoR3N0SW5kZXggKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0T2JqZWN0ICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKndyaXRlcl9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciB1c2VyX2RhdGEpOworCisvKioKKyAqIEdzdEluZGV4RmxhZ3M6CisgKiBAR1NUX0lOREVYX1dSSVRBQkxFOiBUaGUgaW5kZXggaXMgd3JpdGFibGUKKyAqIEBHU1RfSU5ERVhfUkVBREFCTEU6IFRoZSBpbmRleCBpcyByZWFkYWJsZQorICogQEdTVF9JTkRFWF9GTEFHX0xBU1Q6IEZpcnN0IGZsYWcgdGhhdCBjYW4gYmUgdXNlZCBieSBzdWJjbGFzc2VzCisgKgorICogRmxhZ3MgZm9yIHRoaXMgaW5kZXgKKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX0lOREVYX1dSSVRBQkxFICAgID0gKEdTVF9PQkpFQ1RfRkxBR19MQVNUIDw8IDApLAorICBHU1RfSU5ERVhfUkVBREFCTEUgICAgPSAoR1NUX09CSkVDVF9GTEFHX0xBU1QgPDwgMSksCisKKyAgR1NUX0lOREVYX0ZMQUdfTEFTVCAgID0gKEdTVF9PQkpFQ1RfRkxBR19MQVNUIDw8IDgpCit9IEdzdEluZGV4RmxhZ3M7CisKKy8qKgorICogR1NUX0lOREVYX0lTX1JFQURBQkxFOgorICogQG9iajogVGhlIGluZGV4IHRvIGNoZWNrCisgKgorICogQ2hlY2sgaWYgdGhlIGluZGV4IGNhbiBiZSByZWFkIGZyb20KKyAqLworI2RlZmluZSBHU1RfSU5ERVhfSVNfUkVBREFCTEUob2JqKSAgICAoR1NUX09CSkVDVF9GTEFHX0lTX1NFVCAob2JqLCBHU1RfSU5ERVhfUkVBREFCTEUpKQorCisvKioKKyAqIEdTVF9JTkRFWF9JU19XUklUQUJMRToKKyAqIEBvYmo6IFRoZSBpbmRleCB0byBjaGVjaworICoKKyAqIENoZWNrIGlmIHRoZSBpbmRleCBjYW4gYmUgd3JpdHRlbiB0bworICovCisjZGVmaW5lIEdTVF9JTkRFWF9JU19XUklUQUJMRShvYmopICAgIChHU1RfT0JKRUNUX0ZMQUdfSVNfU0VUIChvYmosIEdTVF9JTkRFWF9XUklUQUJMRSkpCisKKy8qKgorICogR3N0SW5kZXg6CisgKgorICogT3BhcXVlICNHc3RJbmRleCBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0SW5kZXggeworICBHc3RPYmplY3QgICAgICAgICAgICAgIG9iamVjdDsKKworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgR0xpc3QgICAgICAgICAgICAgICAgICpncm91cHM7CisgIEdzdEluZGV4R3JvdXAgICAgICAgICAqY3VyZ3JvdXA7CisgIGdpbnQgICAgICAgICAgICAgICAgICAgbWF4Z3JvdXA7CisKKyAgR3N0SW5kZXhSZXNvbHZlck1ldGhvZCBtZXRob2Q7CisgIEdzdEluZGV4UmVzb2x2ZXIgICAgICAgcmVzb2x2ZXI7CisgIGdwb2ludGVyICAgICAgICAgICAgICAgcmVzb2x2ZXJfdXNlcl9kYXRhOworICBHRGVzdHJveU5vdGlmeSAgICAgICAgIHJlc29sdmVyX3VzZXJfZGF0YV9kZXN0cm95OworCisgIEdzdEluZGV4RmlsdGVyICAgICAgICAgZmlsdGVyOworICBncG9pbnRlciAgICAgICAgICAgICAgIGZpbHRlcl91c2VyX2RhdGE7CisgIEdEZXN0cm95Tm90aWZ5ICAgICAgICAgZmlsdGVyX3VzZXJfZGF0YV9kZXN0cm95OworCisgIEdIYXNoVGFibGUgICAgICAgICAgICAqd3JpdGVyczsKKyAgZ2ludCAgICAgICAgICAgICAgICAgICBsYXN0X2lkOworCisgIC8qPCBwcml2YXRlID4qLworICBncG9pbnRlciBfZ3N0X3Jlc2VydmVkW0dTVF9QQURESU5HXTsKK307CisKK3N0cnVjdCBfR3N0SW5kZXhDbGFzcyB7CisgIEdzdE9iamVjdENsYXNzIHBhcmVudF9jbGFzczsKKworICAvKjwgcHJvdGVjdGVkID4qLworICBnYm9vbGVhbiAgICAgICgqZ2V0X3dyaXRlcl9pZCkgICAgICAgIChHc3RJbmRleCAqaW5kZXgsIGdpbnQgKmlkLCBnY2hhciAqd3JpdGVyKTsKKworICB2b2lkICAgICAgICAgICgqY29tbWl0KSAgICAgICAgICAgICAgIChHc3RJbmRleCAqaW5kZXgsIGdpbnQgaWQpOworCisgIC8qIGFic3RyYWN0IG1ldGhvZHMgKi8KKyAgdm9pZCAgICAgICAgICAoKmFkZF9lbnRyeSkgICAgICAgICAgICAoR3N0SW5kZXggKmluZGV4LCBHc3RJbmRleEVudHJ5ICplbnRyeSk7CisKKyAgR3N0SW5kZXhFbnRyeSogKCpnZXRfYXNzb2NfZW50cnkpICAgICAoR3N0SW5kZXggKmluZGV4LCBnaW50IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RJbmRleExvb2t1cE1ldGhvZCBtZXRob2QsIEdzdEluZGV4QXNzb2NpYXRpb25GbGFncyBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0Rm9ybWF0IGZvcm1hdCwgZ2ludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ29tcGFyZURhdGFGdW5jIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyIHVzZXJfZGF0YSk7CisgIC8qIHNpZ25hbHMgKi8KKyAgdm9pZCAgICAgICAgICAoKmVudHJ5X2FkZGVkKSAgICAgICAgICAoR3N0SW5kZXggKmluZGV4LCBHc3RJbmRleEVudHJ5ICplbnRyeSk7CisKKyAgLyo8IHByaXZhdGUgPiovCisgIGdwb2ludGVyIF9nc3RfcmVzZXJ2ZWRbR1NUX1BBRERJTkddOworfTsKKworc3RhdGljCitHVHlwZSAgICAgICAgICAgICAgICAgICBnc3RfaW5kZXhfZ2V0X3R5cGUgICAgICAgICAgICAgICh2b2lkKTsKKworI2lmIDAKK0dzdEluZGV4KiAgICAgICAgICAgICAgIGdzdF9pbmRleF9uZXcgICAgICAgICAgICAgICAgICAgKHZvaWQpOworI2VuZGlmCit2b2lkICAgICAgICAgICAgICAgICAgICBnc3RfaW5kZXhfY29tbWl0ICAgICAgICAgICAgICAgIChHc3RJbmRleCAqaW5kZXgsIGdpbnQgaWQpOworCisjaWYgMAorZ2ludCAgICAgICAgICAgICAgICAgICAgZ3N0X2luZGV4X2dldF9ncm91cCAgICAgICAgICAgICAoR3N0SW5kZXggKmluZGV4KTsKK2dpbnQgICAgICAgICAgICAgICAgICAgIGdzdF9pbmRleF9uZXdfZ3JvdXAgICAgICAgICAgICAgKEdzdEluZGV4ICppbmRleCk7CitnYm9vbGVhbiAgICAgICAgICAgICAgICBnc3RfaW5kZXhfc2V0X2dyb3VwICAgICAgICAgICAgIChHc3RJbmRleCAqaW5kZXgsIGdpbnQgZ3JvdXBudW0pOworCit2b2lkICAgICAgICAgICAgICAgICAgICBnc3RfaW5kZXhfc2V0X2NlcnRhaW50eSAgICAgICAgIChHc3RJbmRleCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RJbmRleENlcnRhaW50eSBjZXJ0YWludHkpOworR3N0SW5kZXhDZXJ0YWludHkgICAgICAgZ3N0X2luZGV4X2dldF9jZXJ0YWludHkgICAgICAgICAoR3N0SW5kZXggKmluZGV4KTsKKworc3RhdGljCit2b2lkICAgICAgICAgICAgICAgICAgICBnc3RfaW5kZXhfc2V0X2ZpbHRlciAgICAgICAgICAgIChHc3RJbmRleCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RJbmRleEZpbHRlciBmaWx0ZXIsIGdwb2ludGVyIHVzZXJfZGF0YSk7CitzdGF0aWMKK3ZvaWQgICAgICAgICAgICAgICAgICAgIGdzdF9pbmRleF9zZXRfZmlsdGVyX2Z1bGwgICAgICAgKEdzdEluZGV4ICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdEluZGV4RmlsdGVyIGZpbHRlciwgZ3BvaW50ZXIgdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Rlc3Ryb3lOb3RpZnkgdXNlcl9kYXRhX2Rlc3Ryb3kpOworCit2b2lkICAgICAgICAgICAgICAgICAgICBnc3RfaW5kZXhfc2V0X3Jlc29sdmVyICAgICAgICAgIChHc3RJbmRleCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RJbmRleFJlc29sdmVyIHJlc29sdmVyLCBncG9pbnRlciB1c2VyX2RhdGEpOwordm9pZCAgICAgICAgICAgICAgICAgICAgZ3N0X2luZGV4X3NldF9yZXNvbHZlcl9mdWxsICAgICAoR3N0SW5kZXggKmluZGV4LCBHc3RJbmRleFJlc29sdmVyIHJlc29sdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Rlc3Ryb3lOb3RpZnkgdXNlcl9kYXRhX2Rlc3Ryb3kpOworI2VuZGlmCisKK3N0YXRpYworZ2Jvb2xlYW4gICAgICAgICAgICAgICAgZ3N0X2luZGV4X2dldF93cml0ZXJfaWQgICAgICAgICAoR3N0SW5kZXggKmluZGV4LCBHc3RPYmplY3QgKndyaXRlciwgZ2ludCAqaWQpOworCisjaWYgMAorR3N0SW5kZXhFbnRyeSogICAgICAgICAgZ3N0X2luZGV4X2FkZF9mb3JtYXQgICAgICAgICAgICAoR3N0SW5kZXggKmluZGV4LCBnaW50IGlkLCBHc3RGb3JtYXQgZm9ybWF0KTsKKyNlbmRpZgorCitzdGF0aWMKK0dzdEluZGV4RW50cnkqICAgICAgICAgIGdzdF9pbmRleF9hZGRfYXNzb2NpYXRpb252ICAgICAgKEdzdEluZGV4ICogaW5kZXgsIGdpbnQgaWQsIEdzdEluZGV4QXNzb2NpYXRpb25GbGFncyBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgbiwgY29uc3QgR3N0SW5kZXhBc3NvY2lhdGlvbiAqIGxpc3QpOworI2lmIDAKK0dzdEluZGV4RW50cnkqICAgICAgICAgIGdzdF9pbmRleF9hZGRfYXNzb2NpYXRpb24gICAgICAgKEdzdEluZGV4ICppbmRleCwgZ2ludCBpZCwgR3N0SW5kZXhBc3NvY2lhdGlvbkZsYWdzIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0Rm9ybWF0IGZvcm1hdCwgZ2ludDY0IHZhbHVlLCAuLi4pCitHc3RJbmRleEVudHJ5KiAgICAgICAgICBnc3RfaW5kZXhfYWRkX29iamVjdCAgICAgICAgICAgIChHc3RJbmRleCAqaW5kZXgsIGdpbnQgaWQsIGdjaGFyICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVHlwZSB0eXBlLCBncG9pbnRlciBvYmplY3QpOworI2VuZGlmCisKK3N0YXRpYworR3N0SW5kZXhFbnRyeSogICAgICAgICAgZ3N0X2luZGV4X2FkZF9pZCAgICAgICAgICAgICAgICAoR3N0SW5kZXggKmluZGV4LCBnaW50IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKmRlc2NyaXB0aW9uKTsKKworc3RhdGljCitHc3RJbmRleEVudHJ5KiAgICAgICAgICBnc3RfaW5kZXhfZ2V0X2Fzc29jX2VudHJ5ICAgICAgIChHc3RJbmRleCAqaW5kZXgsIGdpbnQgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RJbmRleExvb2t1cE1ldGhvZCBtZXRob2QsIEdzdEluZGV4QXNzb2NpYXRpb25GbGFncyBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdEZvcm1hdCBmb3JtYXQsIGdpbnQ2NCB2YWx1ZSk7CitzdGF0aWMKK0dzdEluZGV4RW50cnkqICAgICAgICAgIGdzdF9pbmRleF9nZXRfYXNzb2NfZW50cnlfZnVsbCAgKEdzdEluZGV4ICppbmRleCwgZ2ludCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdEluZGV4TG9va3VwTWV0aG9kIG1ldGhvZCwgR3N0SW5kZXhBc3NvY2lhdGlvbkZsYWdzIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0Rm9ybWF0IGZvcm1hdCwgZ2ludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NvbXBhcmVEYXRhRnVuYyBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKworLyogd29ya2luZyB3aXRoIGluZGV4IGVudHJpZXMgKi8KK3N0YXRpYworR1R5cGUgZ3N0X2luZGV4X2VudHJ5X2dldF90eXBlICh2b2lkKTsKK3N0YXRpYworR3N0SW5kZXhFbnRyeSAqICAgICAgICAgZ3N0X2luZGV4X2VudHJ5X2NvcHkgICAgICAgICAgICAoR3N0SW5kZXhFbnRyeSAqZW50cnkpOworc3RhdGljCit2b2lkICAgICAgICAgICAgICAgICAgICBnc3RfaW5kZXhfZW50cnlfZnJlZSAgICAgICAgICAgIChHc3RJbmRleEVudHJ5ICplbnRyeSk7CitzdGF0aWMKK2dib29sZWFuICAgICAgICAgICAgICAgIGdzdF9pbmRleF9lbnRyeV9hc3NvY19tYXAgICAgICAgKEdzdEluZGV4RW50cnkgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0Rm9ybWF0IGZvcm1hdCwgZ2ludDY0ICp2YWx1ZSk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9JTkRFWF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9mbHYvZ3N0bWVtaW5kZXguYyBiL2dzdC9mbHYvZ3N0bWVtaW5kZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWY5OWMyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2Zsdi9nc3RtZW1pbmRleC5jCkBAIC0wLDAgKzEsNDMyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2RlZmluZSBHU1RfVFlQRV9NRU1fSU5ERVggICAgICAgICAgICAgIFwKKyAgKGdzdF9pbmRleF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX01FTV9JTkRFWChvYmopICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX01FTV9JTkRFWCwgR3N0TWVtSW5kZXgpKQorI2RlZmluZSBHU1RfTUVNX0lOREVYX0NMQVNTKGtsYXNzKSAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9NRU1fSU5ERVgsIEdzdE1lbUluZGV4Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfTUVNX0lOREVYKG9iaikgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfTUVNX0lOREVYKSkKKyNkZWZpbmUgR1NUX0lTX01FTV9JTkRFWF9DTEFTUyhrbGFzcykgICAgIFwKKyAgKEdTVF9UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX01FTV9JTkRFWCkpCisKKy8qCisgKiBPYmplY3QgbW9kZWw6CisgKgorICogQWxsIGVudHJpZXMgYXJlIHNpbXBseSBhZGRlZCB0byBhIEdMaXN0IGZpcnN0LiBUaGVuIHdlIGJ1aWxkCisgKiBhbiBpbmRleCB0byBlYWNoIGVudHJ5IGZvciBlYWNoIGlkL2Zvcm1hdAorICoKKyAqCisgKiAgbWVtaW5kZXgKKyAqICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLi4uCisgKiAgICAhICAgICAgICAgICAgICAgICAgIQorICogICBpZDEgICAgICAgICAgICAgICAgIGlkMgorICogICAgLS0tLS0tLS0tLS0tCisgKiAgICAhICAgICAgICAgICEKKyAqICAgZm9ybWF0MSAgZm9ybWF0MgorICogICAgISAgICAgICAgICAhCisgKiAgIEdUcmVlICAgICAgR1RyZWUKKyAqCisgKgorICogVGhlIG1lbWluZGV4IGNyZWF0ZXMgYSBNZW1JbmRleElkIG9iamVjdCBmb3IgZWFjaCB3cml0ZXIgaWQsIGEKKyAqIEhhc2h0YWJsZSBpcyBrZXB0IHRvIG1hcCB0aGUgaWQgdG8gdGhlIE1lbUluZGV4SWQKKyAqCisgKiBUaGUgTWVtSW5kZXhJZCBrZWVwcyBhIE1lbUluZGV4Rm9ybWF0SW5kZXggZm9yIGVhY2ggZm9ybWF0IHRoZQorICogc3BlY2lmaWMgd3JpdGVyIHdhbnRzIGluZGV4ZWQuCisgKgorICogVGhlIE1lbUluZGV4Rm9ybWF0SW5kZXgga2VlcHMgYWxsIHRoZSB2YWx1ZXMgb2YgdGhlIHBhcnRpY3VsYXIKKyAqIGZvcm1hdCBpbiBhIEdUcmVlLCBUaGUgdmFsdWVzIG9mIHRoZSBHVHJlZSBwb2ludCBiYWNrIHRvIHRoZSBlbnRyeS4KKyAqCisgKiBGaW5kaW5nIGEgdmFsdWUgZm9yIGFuIGlkL2Zvcm1hdCByZXF1aXJlcyBsb2NhdGluZyB0aGUgY29ycmVjdCBHVHJlZSwKKyAqIHRoZW4gZG8gYSBsb29rdXAgaW4gdGhlIFRyZWUgdG8gZ2V0IHRoZSByZXF1aXJlZCB2YWx1ZS4KKyAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RGb3JtYXQgZm9ybWF0OworICBnaW50IG9mZnNldDsKKyAgR1RyZWUgKnRyZWU7Cit9CitHc3RNZW1JbmRleEZvcm1hdEluZGV4OworCit0eXBlZGVmIHN0cnVjdAoreworICBnaW50IGlkOworICBHSGFzaFRhYmxlICpmb3JtYXRfaW5kZXg7Cit9CitHc3RNZW1JbmRleElkOworCit0eXBlZGVmIHN0cnVjdCBfR3N0TWVtSW5kZXggR3N0TWVtSW5kZXg7Cit0eXBlZGVmIHN0cnVjdCBfR3N0TWVtSW5kZXhDbGFzcyBHc3RNZW1JbmRleENsYXNzOworCitzdHJ1Y3QgX0dzdE1lbUluZGV4Cit7CisgIEdzdEluZGV4IHBhcmVudDsKKworICBHTGlzdCAqYXNzb2NpYXRpb25zOworCisgIEdIYXNoVGFibGUgKmlkX2luZGV4OworfTsKKworc3RydWN0IF9Hc3RNZW1JbmRleENsYXNzCit7CisgIEdzdEluZGV4Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworc3RhdGljIHZvaWQgZ3N0X21lbV9pbmRleF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyB2b2lkIGdzdF9tZW1faW5kZXhfYWRkX2VudHJ5IChHc3RJbmRleCAqIGluZGV4LCBHc3RJbmRleEVudHJ5ICogZW50cnkpOworc3RhdGljIEdzdEluZGV4RW50cnkgKmdzdF9tZW1faW5kZXhfZ2V0X2Fzc29jX2VudHJ5IChHc3RJbmRleCAqIGluZGV4LCBnaW50IGlkLAorICAgIEdzdEluZGV4TG9va3VwTWV0aG9kIG1ldGhvZCwgR3N0SW5kZXhBc3NvY2lhdGlvbkZsYWdzIGZsYWdzLAorICAgIEdzdEZvcm1hdCBmb3JtYXQsIGdpbnQ2NCB2YWx1ZSwgR0NvbXBhcmVEYXRhRnVuYyBmdW5jLCBncG9pbnRlciB1c2VyX2RhdGEpOworCisjZGVmaW5lIENMQVNTKG1lbV9pbmRleCkgIEdTVF9NRU1fSU5ERVhfQ0xBU1MgKEdfT0JKRUNUX0dFVF9DTEFTUyAobWVtX2luZGV4KSkKKworc3RhdGljIEdUeXBlIGdzdF9tZW1faW5kZXhfZ2V0X3R5cGUgKHZvaWQpOworCit0eXBlZGVmIEdzdE1lbUluZGV4IEdzdEZsdkRlbXV4TWVtSW5kZXg7Cit0eXBlZGVmIEdzdE1lbUluZGV4Q2xhc3MgR3N0Rmx2RGVtdXhNZW1JbmRleENsYXNzOworR19ERUZJTkVfVFlQRSAoR3N0Rmx2RGVtdXhNZW1JbmRleCwgZ3N0X21lbV9pbmRleCwgR1NUX1RZUEVfSU5ERVgpOworCitzdGF0aWMgdm9pZAorZ3N0X21lbV9pbmRleF9jbGFzc19pbml0IChHc3RNZW1JbmRleENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0SW5kZXhDbGFzcyAqZ3N0aW5kZXhfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGluZGV4X2NsYXNzID0gKEdzdEluZGV4Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfbWVtX2luZGV4X2ZpbmFsaXplOworCisgIGdzdGluZGV4X2NsYXNzLT5hZGRfZW50cnkgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21lbV9pbmRleF9hZGRfZW50cnkpOworICBnc3RpbmRleF9jbGFzcy0+Z2V0X2Fzc29jX2VudHJ5ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbWVtX2luZGV4X2dldF9hc3NvY19lbnRyeSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWVtX2luZGV4X2luaXQgKEdzdE1lbUluZGV4ICogaW5kZXgpCit7CisgIEdTVF9ERUJVRyAoImNyZWF0ZWQgbmV3IG1lbSBpbmRleCIpOworCisgIGluZGV4LT5hc3NvY2lhdGlvbnMgPSBOVUxMOworICBpbmRleC0+aWRfaW5kZXggPSBnX2hhc2hfdGFibGVfbmV3IChnX2ludF9oYXNoLCBnX2ludF9lcXVhbCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWVtX2luZGV4X2ZyZWVfZm9ybWF0IChncG9pbnRlciBrZXksIGdwb2ludGVyIHZhbHVlLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdE1lbUluZGV4Rm9ybWF0SW5kZXggKmluZGV4ID0gKEdzdE1lbUluZGV4Rm9ybWF0SW5kZXggKikgdmFsdWU7CisKKyAgaWYgKGluZGV4LT50cmVlKSB7CisgICAgZ190cmVlX2Rlc3Ryb3kgKGluZGV4LT50cmVlKTsKKyAgfQorCisgIGdfc2xpY2VfZnJlZSAoR3N0TWVtSW5kZXhGb3JtYXRJbmRleCwgaW5kZXgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X21lbV9pbmRleF9mcmVlX2lkIChncG9pbnRlciBrZXksIGdwb2ludGVyIHZhbHVlLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdE1lbUluZGV4SWQgKmlkX2luZGV4ID0gKEdzdE1lbUluZGV4SWQgKikgdmFsdWU7CisKKyAgaWYgKGlkX2luZGV4LT5mb3JtYXRfaW5kZXgpIHsKKyAgICBnX2hhc2hfdGFibGVfZm9yZWFjaCAoaWRfaW5kZXgtPmZvcm1hdF9pbmRleCwgZ3N0X21lbV9pbmRleF9mcmVlX2Zvcm1hdCwKKyAgICAgICAgTlVMTCk7CisgICAgZ19oYXNoX3RhYmxlX2Rlc3Ryb3kgKGlkX2luZGV4LT5mb3JtYXRfaW5kZXgpOworICAgIGlkX2luZGV4LT5mb3JtYXRfaW5kZXggPSBOVUxMOworICB9CisKKyAgZ19zbGljZV9mcmVlIChHc3RNZW1JbmRleElkLCBpZF9pbmRleCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWVtX2luZGV4X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RNZW1JbmRleCAqbWVtaW5kZXggPSBHU1RfTUVNX0lOREVYIChvYmplY3QpOworCisgIC8qIERlbGV0ZSB0aGUgdHJlZXMgcmVmZXJlbmNpbmcgdGhlIGFzc29jaWF0aW9ucyBmaXJzdCAqLworICBpZiAobWVtaW5kZXgtPmlkX2luZGV4KSB7CisgICAgZ19oYXNoX3RhYmxlX2ZvcmVhY2ggKG1lbWluZGV4LT5pZF9pbmRleCwgZ3N0X21lbV9pbmRleF9mcmVlX2lkLCBOVUxMKTsKKyAgICBnX2hhc2hfdGFibGVfZGVzdHJveSAobWVtaW5kZXgtPmlkX2luZGV4KTsKKyAgICBtZW1pbmRleC0+aWRfaW5kZXggPSBOVUxMOworICB9CisKKyAgLyogVGhlbiBkZWxldGUgdGhlIGFzc29jaWF0aW9ucyB0aGVtc2VsdmVzICovCisgIGlmIChtZW1pbmRleC0+YXNzb2NpYXRpb25zKSB7CisgICAgZ19saXN0X2ZvcmVhY2ggKG1lbWluZGV4LT5hc3NvY2lhdGlvbnMsIChHRnVuYykgZ3N0X2luZGV4X2VudHJ5X2ZyZWUsIE5VTEwpOworICAgIGdfbGlzdF9mcmVlIChtZW1pbmRleC0+YXNzb2NpYXRpb25zKTsKKyAgICBtZW1pbmRleC0+YXNzb2NpYXRpb25zID0gTlVMTDsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChnc3RfbWVtX2luZGV4X3BhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X21lbV9pbmRleF9hZGRfaWQgKEdzdEluZGV4ICogaW5kZXgsIEdzdEluZGV4RW50cnkgKiBlbnRyeSkKK3sKKyAgR3N0TWVtSW5kZXggKm1lbWluZGV4ID0gR1NUX01FTV9JTkRFWCAoaW5kZXgpOworICBHc3RNZW1JbmRleElkICppZF9pbmRleDsKKworICBpZF9pbmRleCA9IGdfaGFzaF90YWJsZV9sb29rdXAgKG1lbWluZGV4LT5pZF9pbmRleCwgJmVudHJ5LT5pZCk7CisKKyAgaWYgKCFpZF9pbmRleCkgeworICAgIGlkX2luZGV4ID0gZ19zbGljZV9uZXcwIChHc3RNZW1JbmRleElkKTsKKworICAgIGlkX2luZGV4LT5pZCA9IGVudHJ5LT5pZDsKKyAgICBpZF9pbmRleC0+Zm9ybWF0X2luZGV4ID0gZ19oYXNoX3RhYmxlX25ldyAoZ19pbnRfaGFzaCwgZ19pbnRfZXF1YWwpOworICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKG1lbWluZGV4LT5pZF9pbmRleCwgJmlkX2luZGV4LT5pZCwgaWRfaW5kZXgpOworICB9Cit9CisKK3N0YXRpYyBnaW50CittZW1faW5kZXhfY29tcGFyZSAoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0TWVtSW5kZXhGb3JtYXRJbmRleCAqaW5kZXggPSB1c2VyX2RhdGE7CisgIGdpbnQ2NCB2YWwxLCB2YWwyOworICBnaW50NjQgZGlmZjsKKworICB2YWwxID0gR1NUX0lOREVYX0FTU09DX1ZBTFVFICgoKEdzdEluZGV4RW50cnkgKikgYSksIGluZGV4LT5vZmZzZXQpOworICB2YWwyID0gR1NUX0lOREVYX0FTU09DX1ZBTFVFICgoKEdzdEluZGV4RW50cnkgKikgYiksIGluZGV4LT5vZmZzZXQpOworCisgIGRpZmYgPSAodmFsMiAtIHZhbDEpOworCisgIHJldHVybiAoZGlmZiA9PSAwID8gMCA6IChkaWZmID4gMCA/IDEgOiAtMSkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X21lbV9pbmRleF9pbmRleF9mb3JtYXQgKEdzdE1lbUluZGV4SWQgKiBpZF9pbmRleCwgR3N0SW5kZXhFbnRyeSAqIGVudHJ5LAorICAgIGdpbnQgYXNzb2MpCit7CisgIEdzdE1lbUluZGV4Rm9ybWF0SW5kZXggKmluZGV4OworICBHc3RGb3JtYXQgKmZvcm1hdDsKKworICBmb3JtYXQgPSAmR1NUX0lOREVYX0FTU09DX0ZPUk1BVCAoZW50cnksIGFzc29jKTsKKworICBpbmRleCA9IGdfaGFzaF90YWJsZV9sb29rdXAgKGlkX2luZGV4LT5mb3JtYXRfaW5kZXgsIGZvcm1hdCk7CisKKyAgaWYgKCFpbmRleCkgeworICAgIGluZGV4ID0gZ19zbGljZV9uZXcwIChHc3RNZW1JbmRleEZvcm1hdEluZGV4KTsKKworICAgIGluZGV4LT5mb3JtYXQgPSAqZm9ybWF0OworICAgIGluZGV4LT5vZmZzZXQgPSBhc3NvYzsKKyAgICBpbmRleC0+dHJlZSA9IGdfdHJlZV9uZXdfd2l0aF9kYXRhIChtZW1faW5kZXhfY29tcGFyZSwgaW5kZXgpOworCisgICAgZ19oYXNoX3RhYmxlX2luc2VydCAoaWRfaW5kZXgtPmZvcm1hdF9pbmRleCwgJmluZGV4LT5mb3JtYXQsIGluZGV4KTsKKyAgfQorCisgIGdfdHJlZV9pbnNlcnQgKGluZGV4LT50cmVlLCBlbnRyeSwgZW50cnkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X21lbV9pbmRleF9hZGRfYXNzb2NpYXRpb24gKEdzdEluZGV4ICogaW5kZXgsIEdzdEluZGV4RW50cnkgKiBlbnRyeSkKK3sKKyAgR3N0TWVtSW5kZXggKm1lbWluZGV4ID0gR1NUX01FTV9JTkRFWCAoaW5kZXgpOworICBHc3RNZW1JbmRleElkICppZF9pbmRleDsKKworICBtZW1pbmRleC0+YXNzb2NpYXRpb25zID0gZ19saXN0X3ByZXBlbmQgKG1lbWluZGV4LT5hc3NvY2lhdGlvbnMsIGVudHJ5KTsKKworICBpZF9pbmRleCA9IGdfaGFzaF90YWJsZV9sb29rdXAgKG1lbWluZGV4LT5pZF9pbmRleCwgJmVudHJ5LT5pZCk7CisgIGlmIChpZF9pbmRleCkgeworICAgIGdpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBHU1RfSU5ERVhfTkFTU09DUyAoZW50cnkpOyBpKyspIHsKKyAgICAgIGdzdF9tZW1faW5kZXhfaW5kZXhfZm9ybWF0IChpZF9pbmRleCwgZW50cnksIGkpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X21lbV9pbmRleF9hZGRfb2JqZWN0IChHc3RJbmRleCAqIGluZGV4LCBHc3RJbmRleEVudHJ5ICogZW50cnkpCit7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWVtX2luZGV4X2FkZF9mb3JtYXQgKEdzdEluZGV4ICogaW5kZXgsIEdzdEluZGV4RW50cnkgKiBlbnRyeSkKK3sKK30KKworc3RhdGljIHZvaWQKK2dzdF9tZW1faW5kZXhfYWRkX2VudHJ5IChHc3RJbmRleCAqIGluZGV4LCBHc3RJbmRleEVudHJ5ICogZW50cnkpCit7CisgIEdTVF9MT0dfT0JKRUNUIChpbmRleCwgImFkZGVkIHRoaXMgZW50cnkiKTsKKworICBzd2l0Y2ggKGVudHJ5LT50eXBlKSB7CisgICAgY2FzZSBHU1RfSU5ERVhfRU5UUllfSUQ6CisgICAgICBnc3RfbWVtX2luZGV4X2FkZF9pZCAoaW5kZXgsIGVudHJ5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0lOREVYX0VOVFJZX0FTU09DSUFUSU9OOgorICAgICAgZ3N0X21lbV9pbmRleF9hZGRfYXNzb2NpYXRpb24gKGluZGV4LCBlbnRyeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9JTkRFWF9FTlRSWV9PQkpFQ1Q6CisgICAgICBnc3RfbWVtX2luZGV4X2FkZF9vYmplY3QgKGluZGV4LCBlbnRyeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9JTkRFWF9FTlRSWV9GT1JNQVQ6CisgICAgICBnc3RfbWVtX2luZGV4X2FkZF9mb3JtYXQgKGluZGV4LCBlbnRyeSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ2ludDY0IHZhbHVlOworICBHc3RNZW1JbmRleEZvcm1hdEluZGV4ICppbmRleDsKKyAgZ2Jvb2xlYW4gZXhhY3Q7CisgIEdzdEluZGV4RW50cnkgKmxvd2VyOworICBnaW50NjQgbG93X2RpZmY7CisgIEdzdEluZGV4RW50cnkgKmhpZ2hlcjsKKyAgZ2ludDY0IGhpZ2hfZGlmZjsKK30KK0dzdE1lbUluZGV4U2VhcmNoRGF0YTsKKworc3RhdGljIGdpbnQKK21lbV9pbmRleF9zZWFyY2ggKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKQoreworICBHc3RNZW1JbmRleFNlYXJjaERhdGEgKmRhdGEgPSAoR3N0TWVtSW5kZXhTZWFyY2hEYXRhICopIGI7CisgIEdzdE1lbUluZGV4Rm9ybWF0SW5kZXggKmluZGV4ID0gZGF0YS0+aW5kZXg7CisgIGdpbnQ2NCB2YWwxLCB2YWwyOworICBnaW50NjQgZGlmZjsKKworICB2YWwxID0gR1NUX0lOREVYX0FTU09DX1ZBTFVFICgoKEdzdEluZGV4RW50cnkgKikgYSksIGluZGV4LT5vZmZzZXQpOworICB2YWwyID0gZGF0YS0+dmFsdWU7CisKKyAgZGlmZiA9ICh2YWwxIC0gdmFsMik7CisgIGlmIChkaWZmID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgLyogZXhhY3QgbWF0Y2hpbmcsIGRvbid0IHVwZGF0ZSBsb3cvaGlnaCAqLworICBpZiAoZGF0YS0+ZXhhY3QpCisgICAgcmV0dXJuIChkaWZmID4gMCA/IDEgOiAtMSk7CisKKyAgaWYgKGRpZmYgPCAwKSB7CisgICAgaWYgKGRpZmYgPiBkYXRhLT5sb3dfZGlmZikgeworICAgICAgZGF0YS0+bG93X2RpZmYgPSBkaWZmOworICAgICAgZGF0YS0+bG93ZXIgPSAoR3N0SW5kZXhFbnRyeSAqKSBhOworICAgIH0KKyAgICBkaWZmID0gLTE7CisgIH0gZWxzZSB7CisgICAgaWYgKGRpZmYgPCBkYXRhLT5oaWdoX2RpZmYpIHsKKyAgICAgIGRhdGEtPmhpZ2hfZGlmZiA9IGRpZmY7CisgICAgICBkYXRhLT5oaWdoZXIgPSAoR3N0SW5kZXhFbnRyeSAqKSBhOworICAgIH0KKyAgICBkaWZmID0gMTsKKyAgfQorCisgIHJldHVybiBkaWZmOworfQorCitzdGF0aWMgR3N0SW5kZXhFbnRyeSAqCitnc3RfbWVtX2luZGV4X2dldF9hc3NvY19lbnRyeSAoR3N0SW5kZXggKiBpbmRleCwgZ2ludCBpZCwKKyAgICBHc3RJbmRleExvb2t1cE1ldGhvZCBtZXRob2QsCisgICAgR3N0SW5kZXhBc3NvY2lhdGlvbkZsYWdzIGZsYWdzLAorICAgIEdzdEZvcm1hdCBmb3JtYXQsIGdpbnQ2NCB2YWx1ZSwgR0NvbXBhcmVEYXRhRnVuYyBmdW5jLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdE1lbUluZGV4ICptZW1pbmRleCA9IEdTVF9NRU1fSU5ERVggKGluZGV4KTsKKyAgR3N0TWVtSW5kZXhJZCAqaWRfaW5kZXg7CisgIEdzdE1lbUluZGV4Rm9ybWF0SW5kZXggKmZvcm1hdF9pbmRleDsKKyAgR3N0SW5kZXhFbnRyeSAqZW50cnk7CisgIEdzdE1lbUluZGV4U2VhcmNoRGF0YSBkYXRhOworCisgIGlkX2luZGV4ID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAobWVtaW5kZXgtPmlkX2luZGV4LCAmaWQpOworICBpZiAoIWlkX2luZGV4KQorICAgIHJldHVybiBOVUxMOworCisgIGZvcm1hdF9pbmRleCA9IGdfaGFzaF90YWJsZV9sb29rdXAgKGlkX2luZGV4LT5mb3JtYXRfaW5kZXgsICZmb3JtYXQpOworICBpZiAoIWZvcm1hdF9pbmRleCkKKyAgICByZXR1cm4gTlVMTDsKKworICBkYXRhLnZhbHVlID0gdmFsdWU7CisgIGRhdGEuaW5kZXggPSBmb3JtYXRfaW5kZXg7CisgIGRhdGEuZXhhY3QgPSAobWV0aG9kID09IEdTVF9JTkRFWF9MT09LVVBfRVhBQ1QpOworCisgIC8qIHNldHVwIGRhdGEgZm9yIGxvdy9oaWdoIGNoZWNrcyBpZiB3ZSBhcmUgbm90IGxvb2tpbmcKKyAgICogZm9yIGFuIGV4YWN0IG1hdGNoICovCisgIGlmICghZGF0YS5leGFjdCkgeworICAgIGRhdGEubG93X2RpZmYgPSBHX01JTklOVDY0OworICAgIGRhdGEubG93ZXIgPSBOVUxMOworICAgIGRhdGEuaGlnaF9kaWZmID0gR19NQVhJTlQ2NDsKKyAgICBkYXRhLmhpZ2hlciA9IE5VTEw7CisgIH0KKworICBlbnRyeSA9IGdfdHJlZV9zZWFyY2ggKGZvcm1hdF9pbmRleC0+dHJlZSwgbWVtX2luZGV4X3NlYXJjaCwgJmRhdGEpOworCisgIC8qIGdldCB0aGUgbG93L2hpZ2ggdmFsdWVzIGlmIHdlJ3JlIG5vdCBleGFjdCAqLworICBpZiAoZW50cnkgPT0gTlVMTCAmJiAhZGF0YS5leGFjdCkgeworICAgIGlmIChtZXRob2QgPT0gR1NUX0lOREVYX0xPT0tVUF9CRUZPUkUpCisgICAgICBlbnRyeSA9IGRhdGEubG93ZXI7CisgICAgZWxzZSBpZiAobWV0aG9kID09IEdTVF9JTkRFWF9MT09LVVBfQUZURVIpIHsKKyAgICAgIGVudHJ5ID0gZGF0YS5oaWdoZXI7CisgICAgfQorICB9CisKKyAgaWYgKGVudHJ5ICYmICgoR1NUX0lOREVYX0FTU09DX0ZMQUdTIChlbnRyeSkgJiBmbGFncykgIT0gZmxhZ3MpKSB7CisgICAgaWYgKG1ldGhvZCAhPSBHU1RfSU5ERVhfTE9PS1VQX0VYQUNUKSB7CisgICAgICBHTGlzdCAqbF9lbnRyeSA9IGdfbGlzdF9maW5kIChtZW1pbmRleC0+YXNzb2NpYXRpb25zLCBlbnRyeSk7CisKKyAgICAgIGVudHJ5ID0gTlVMTDsKKworICAgICAgd2hpbGUgKGxfZW50cnkpIHsKKyAgICAgICAgZW50cnkgPSAoR3N0SW5kZXhFbnRyeSAqKSBsX2VudHJ5LT5kYXRhOworCisgICAgICAgIGlmIChlbnRyeS0+aWQgPT0gaWQgJiYgKEdTVF9JTkRFWF9BU1NPQ19GTEFHUyAoZW50cnkpICYgZmxhZ3MpID09IGZsYWdzKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChtZXRob2QgPT0gR1NUX0lOREVYX0xPT0tVUF9CRUZPUkUpCisgICAgICAgICAgbF9lbnRyeSA9IGdfbGlzdF9uZXh0IChsX2VudHJ5KTsKKyAgICAgICAgZWxzZSBpZiAobWV0aG9kID09IEdTVF9JTkRFWF9MT09LVVBfQUZURVIpIHsKKyAgICAgICAgICBsX2VudHJ5ID0gZ19saXN0X3ByZXZpb3VzIChsX2VudHJ5KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBlbnRyeSA9IE5VTEw7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGVudHJ5OworfQorCisjaWYgMAorZ2Jvb2xlYW4KK2dzdF9tZW1faW5kZXhfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR3N0SW5kZXhGYWN0b3J5ICpmYWN0b3J5OworCisgIGZhY3RvcnkgPSBnc3RfaW5kZXhfZmFjdG9yeV9uZXcgKCJtZW1pbmRleCIsCisgICAgICAiQSBpbmRleCB0aGF0IHN0b3JlcyBlbnRyaWVzIGluIG1lbW9yeSIsIGdzdF9tZW1faW5kZXhfZ2V0X3R5cGUgKCkpOworCisgIGlmIChmYWN0b3J5ID09IE5VTEwpIHsKKyAgICBnX3dhcm5pbmcgKCJmYWlsZWQgdG8gY3JlYXRlIG1lbWluZGV4IGZhY3RvcnkiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBHU1RfUExVR0lOX0ZFQVRVUkUgKGZhY3RvcnkpLT5wbHVnaW5fbmFtZSA9IHBsdWdpbi0+ZGVzYy5uYW1lOworICBHU1RfUExVR0lOX0ZFQVRVUkUgKGZhY3RvcnkpLT5sb2FkZWQgPSBUUlVFOworCisgIGdzdF9yZWdpc3RyeV9hZGRfZmVhdHVyZSAoZ3N0X3JlZ2lzdHJ5X2dldF9kZWZhdWx0ICgpLAorICAgICAgR1NUX1BMVUdJTl9GRUFUVVJFIChmYWN0b3J5KSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC9mbHYvbWVzb24uYnVpbGQgYi9nc3QvZmx2L21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MTkwZDMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZmx2L21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsOCBAQAorZ3N0Zmx2ID0gbGlicmFyeSgnZ3N0Zmx2JywKKyAgJ2dzdGZsdmRlbXV4LmMnLCAnZ3N0Zmx2bXV4LmMnLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdHBidXRpbHNfZGVwLCBnc3R2aWRlb19kZXAsIGdzdHRhZ19kZXAsIGdzdGF1ZGlvX2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvZmx4L01ha2VmaWxlLmFtIGIvZ3N0L2ZseC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODkzNGVhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2ZseC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDggQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdGZseGRlYy5sYQorCitsaWJnc3RmbHhkZWNfbGFfU09VUkNFUyA9IGdzdGZseGRlYy5jIGZseF9jb2xvci5jCitsaWJnc3RmbHhkZWNfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdGZseGRlY19sYV9MSUJBREQgPSAkKEdTVF9CQVNFX0xJQlMpICAkKEdTVF9MSUJTKQorbGliZ3N0Zmx4ZGVjX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBmbHhfZm10LmggZmx4X2NvbG9yLmggZ3N0Zmx4ZGVjLmgKZGlmZiAtLWdpdCBhL2dzdC9mbHgvZmx4X2NvbG9yLmMgYi9nc3QvZmx4L2ZseF9jb2xvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNTgxMzUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZmx4L2ZseF9jb2xvci5jCkBAIC0wLDAgKzEsMTE3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAdGVtcGxlLWJhcHRpc3QuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImZseF9jb2xvci5oIgorCitGbHhDb2xvclNwYWNlQ29udmVydGVyICoKK2ZseF9jb2xvcnNwYWNlX2NvbnZlcnRlcl9uZXcgKGdpbnQgd2lkdGgsIGdpbnQgaGVpZ2h0KQoreworICBGbHhDb2xvclNwYWNlQ29udmVydGVyICpuZXcgPSBnX21hbGxvYyAoc2l6ZW9mIChGbHhDb2xvclNwYWNlQ29udmVydGVyKSk7CisKKyAgbmV3LT53aWR0aCA9IHdpZHRoOworICBuZXctPmhlaWdodCA9IGhlaWdodDsKKworICBtZW1zZXQgKG5ldy0+cGFsdmVjLCAwLCBzaXplb2YgKG5ldy0+cGFsdmVjKSk7CisgIHJldHVybiBuZXc7Cit9CisKK3ZvaWQKK2ZseF9jb2xvcnNwYWNlX2NvbnZlcnRlcl9kZXN0cm95IChGbHhDb2xvclNwYWNlQ29udmVydGVyICogZmx4cGFsKQoreworICBnX3JldHVybl9pZl9mYWlsIChmbHhwYWwgIT0gTlVMTCk7CisKKyAgZ19mcmVlIChmbHhwYWwpOworfQorCit2b2lkCitmbHhfY29sb3JzcGFjZV9jb252ZXJ0IChGbHhDb2xvclNwYWNlQ29udmVydGVyICogZmx4cGFsLCBndWNoYXIgKiBzcmMsCisgICAgZ3VjaGFyICogZGVzdCkKK3sKKyAgZ3VpbnQgc2l6ZSwgY29sOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKGZseHBhbCAhPSBOVUxMKTsKKyAgZ19yZXR1cm5faWZfZmFpbCAoc3JjICE9IGRlc3QpOworCisKKyAgc2l6ZSA9IGZseHBhbC0+d2lkdGggKiBmbHhwYWwtPmhlaWdodDsKKworICB3aGlsZSAoc2l6ZS0tKSB7CisgICAgY29sID0gKCpzcmMrKyAqIDMpOworCisjaWYgR19CWVRFX09SREVSID09IEdfQklHX0VORElBTgorICAgICpkZXN0KysgPSAwOworICAgICpkZXN0KysgPSBmbHhwYWwtPnBhbHZlY1tjb2xdOworICAgICpkZXN0KysgPSBmbHhwYWwtPnBhbHZlY1tjb2wgKyAxXTsKKyAgICAqZGVzdCsrID0gZmx4cGFsLT5wYWx2ZWNbY29sICsgMl07CisjZWxzZQorICAgICpkZXN0KysgPSBmbHhwYWwtPnBhbHZlY1tjb2wgKyAyXTsKKyAgICAqZGVzdCsrID0gZmx4cGFsLT5wYWx2ZWNbY29sICsgMV07CisgICAgKmRlc3QrKyA9IGZseHBhbC0+cGFsdmVjW2NvbF07CisgICAgKmRlc3QrKyA9IDA7CisjZW5kaWYKKyAgfQorCit9CisKKwordm9pZAorZmx4X3NldF9wYWxldHRlX3ZlY3RvciAoRmx4Q29sb3JTcGFjZUNvbnZlcnRlciAqIGZseHBhbCwgZ3VpbnQgc3RhcnQsIGd1aW50IG51bSwKKyAgICBndWNoYXIgKiBuZXdwYWwsIGdpbnQgc2NhbGUpCit7CisgIGd1aW50IGdyYWI7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoZmx4cGFsICE9IE5VTEwpOworICBnX3JldHVybl9pZl9mYWlsIChzdGFydCA8IDB4MTAwKTsKKworICBncmFiID0gKChzdGFydCArIG51bSkgPiAweDEwMCA/IDB4MTAwIC0gc3RhcnQgOiBudW0pOworCisgIGlmIChzY2FsZSkgeworICAgIGdpbnQgaSA9IDA7CisKKyAgICBzdGFydCAqPSAzOworICAgIHdoaWxlIChncmFiKSB7CisgICAgICBmbHhwYWwtPnBhbHZlY1tzdGFydCsrXSA9IG5ld3BhbFtpKytdIDw8IHNjYWxlOworICAgICAgZmx4cGFsLT5wYWx2ZWNbc3RhcnQrK10gPSBuZXdwYWxbaSsrXSA8PCBzY2FsZTsKKyAgICAgIGZseHBhbC0+cGFsdmVjW3N0YXJ0KytdID0gbmV3cGFsW2krK10gPDwgc2NhbGU7CisgICAgICBncmFiLS07CisgICAgfQorICB9IGVsc2UgeworICAgIG1lbWNweSAoJmZseHBhbC0+cGFsdmVjW3N0YXJ0ICogM10sIG5ld3BhbCwgZ3JhYiAqIDMpOworICB9Cit9CisKK3ZvaWQKK2ZseF9zZXRfY29sb3IgKEZseENvbG9yU3BhY2VDb252ZXJ0ZXIgKiBmbHhwYWwsIGd1aW50IGNvbHIsIGd1aW50IHJlZCwKKyAgICBndWludCBncmVlbiwgZ3VpbnQgYmx1ZSwgZ2ludCBzY2FsZSkKK3sKKworICBnX3JldHVybl9pZl9mYWlsIChmbHhwYWwgIT0gTlVMTCk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKGNvbHIgPCAweDEwMCk7CisKKyAgZmx4cGFsLT5wYWx2ZWNbKGNvbHIgKiAzKV0gPSByZWQgPDwgc2NhbGU7CisgIGZseHBhbC0+cGFsdmVjWyhjb2xyICogMykgKyAxXSA9IGdyZWVuIDw8IHNjYWxlOworICBmbHhwYWwtPnBhbHZlY1soY29sciAqIDMpICsgMl0gPSBibHVlIDw8IHNjYWxlOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2ZseC9mbHhfY29sb3IuaCBiL2dzdC9mbHgvZmx4X2NvbG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQzNmFiNwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9mbHgvZmx4X2NvbG9yLmgKQEAgLTAsMCArMSw1MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19GTFhfQ09MT1JfSF9fCisjZGVmaW5lIF9fRkxYX0NPTE9SX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitHX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgZW51bSB7CisgIEZMWF9DT0xPUlNQQUNFX1JHQjgsCisgIEZMWF9DT0xPUlNQQUNFX1JHQjMyLAorfSBGbHhDb2xvclNwYWNlVHlwZTsKKworCit0eXBlZGVmIHN0cnVjdCBfRmx4Q29sb3JTcGFjZUNvbnZlcnRlciBGbHhDb2xvclNwYWNlQ29udmVydGVyOworCitzdHJ1Y3QgX0ZseENvbG9yU3BhY2VDb252ZXJ0ZXIgeworICBndWludCAgICAgIHdpZHRoOworICBndWludCAgICAgIGhlaWdodDsKKyAgZ3VjaGFyICAgICAgcGFsdmVjWzc2OF07Cit9OworCit2b2lkIGZseF9jb2xvcnNwYWNlX2NvbnZlcnRlcl9kZXN0cm95KEZseENvbG9yU3BhY2VDb252ZXJ0ZXIgKmZseHBhbCk7Cit2b2lkIGZseF9jb2xvcnNwYWNlX2NvbnZlcnQoRmx4Q29sb3JTcGFjZUNvbnZlcnRlciAqZmx4cGFsLCBndWNoYXIgKnNyYywgZ3VjaGFyICpkZXN0KTsKK0ZseENvbG9yU3BhY2VDb252ZXJ0ZXIgKiBmbHhfY29sb3JzcGFjZV9jb252ZXJ0ZXJfbmV3KGdpbnQgd2lkdGgsIGdpbnQgaGVpZ2h0KTsKKwordm9pZCBmbHhfc2V0X3BhbGV0dGVfdmVjdG9yKEZseENvbG9yU3BhY2VDb252ZXJ0ZXIgKmZseHBhbCwgZ3VpbnQgc3RhcnQsIGd1aW50IG51bSwgCisgICAgICAgICAgZ3VjaGFyICpuZXdwYWwsIGdpbnQgc2NhbGUpOwordm9pZCBmbHhfc2V0X2NvbG9yKEZseENvbG9yU3BhY2VDb252ZXJ0ZXIgKmZseHBhbCwgZ3VpbnQgY29sciwgZ3VpbnQgcmVkLCBndWludCBncmVlbiwKKyAgICAgICAgICBndWludCBibHVlLCBnaW50IHNjYWxlKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fRkxYX0NPTE9SX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2ZseC9mbHhfZm10LmggYi9nc3QvZmx4L2ZseF9mbXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmZmMjAwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2ZseC9mbHhfZm10LmgKQEAgLTAsMCArMSwxMjggQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfRkxYX0ZNVF9IX18KKyNkZWZpbmUgX19HU1RfRkxYX0ZNVF9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworR19CRUdJTl9ERUNMUworCitlbnVtIEZseF9UeXBlQ2h1bmsKK3sKKwkvKiBmcmFtZSBjaHVua3MgKi8KKwlGTFhfUFJFRklYX1RZUEUJCT0gMHhmMTAwLAorCUZMWF9TQ1JJUFRfQ0hVTksJPSAweGYxZTAsCisJRkxYX0ZSQU1FX1RZUEUJCT0gMHhmMWZhLAorCUZMWF9TRUdNRU5UX1RBQkxFCT0gMHhmMWZiLAorCUZMWF9IVUZGTUFOX1RBQkxFCT0gMHhmMWZjLAorCisJLyogc3ViIGNodW5rcyAqLworCUZMWF9DRUxfREFUQQkJPSAzLAorCUZMWF9DT0xPUjI1NgkJPSA0LAorCUZMWF9TUzIJCQk9IDcsCisgICAgICAgIEZMWF9DT0xPUjY0CQk9IDExLAorICAgICAgICBGTFhfTEMJCQk9IDEyLAorICAgICAgICBGTFhfQkxBQ0sJCT0gMTMsCisgICAgICAgIEZMWF9CUlVOCQk9IDE1LAorICAgICAgICBGTFhfQ09QWQkJPSAxNiwKKyAgICAgICAgRkxYX01JTkkJCT0gMTgsCisJRkxYX0RUQV9SVU4JCT0gMjUsCisJRkxYX0RUQV9DT1BZCQk9IDI2LAorCUZMWF9EVEFfTEMJCT0gMjcsCisJRkxYX0xBQkVMCQk9IDMxLAorCUZMWF9CTVBfTUFTSwkJPSAzMiwKKwlGTFhfTUxFVl9NQVNLCQk9IDMzLAorCUZMWF9TRUdNRU5UCQk9IDM0LAorCUZMWF9LRVlfSU1BR0UJCT0gMzUsCisJRkxYX0tFWV9QQUwJCT0gMzYsCisJRkxYX1JFR0lPTgkJPSAzNywKKwlGTFhfV0FWRQkJPSAzOCwKKwlGTFhfVVNFUlNUUklORwkJPSAzOSwKKwlGTFhfUkdOX01BU0sJCT0gNDAKKworfTsKKworZW51bSBGbHhfTWFnaWNIZHIKK3sKKwlGTFhfTUFHSUNIRFJfRkxJCT0gMHhhZjExLAorCUZMWF9NQUdJQ0hEUl9GTEMJPSAweGFmMTIsCisJRkxYX01BR0lDSERSX0ZMWAk9IDB4YWY0NCwKKwlGTFhfTUFHSUNIRFJfSFVGRkJXVAk9IDB4YWYzMAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgX0ZseEhlYWRlciAKK3sKKwlndWludDMyCXNpemU7CisJZ3VpbnQxNiB0eXBlOworCWd1aW50MTYJZnJhbWVzOworCWd1aW50MTYgd2lkdGgsaGVpZ2h0LGRlcHRoLGZsYWdzOworCWd1aW50MzIgc3BlZWQ7CisJZ3VpbnQxNiByZXNlcnZlZDE7CisJLyogRkxDICovIAorCWd1aW50MzIgY3JlYXRlZCxjcmVhdG9yLHVwZGF0ZWQsdXBkYXRlcjsKKwlndWludDE2IGFzcGVjdF9keCwgYXNwZWN0X2R5OworCS8qIEVHSSAqLworCWd1aW50MTYgZXh0X2ZsYWdzLGtleWZyYW1lcyx0b3RhbGZyYW1lczsKKwlndWludDMyIHJlcV9tZW1vcnk7CisJZ3VpbnQxNiBtYXhfcmVnaW9ucyx0cmFuc3BfbnVtOworCWd1Y2hhcglyZXNlcnZlZDJbMjRdOworCS8qIEZMQyAqLworCWd1aW50MzIgb2ZyYW1lMSxvZnJhbWUyOworCWd1Y2hhcglyZXNlcnZlZDNbNDBdOworfSBGbHhIZWFkZXI7CisjZGVmaW5lIEZseEhlYWRlclNpemUgMTI4CisKK3R5cGVkZWYgc3RydWN0IF9GbHhGcmFtZUNodW5rCit7CisJZ3VpbnQzMglzaXplOworCWd1aW50MTYJaWQ7Cit9IEZseEZyYW1lQ2h1bms7CisjZGVmaW5lIEZseEZyYW1lQ2h1bmtTaXplIDYKKwordHlwZWRlZiBzdHJ1Y3QgX0ZseFByZWZpeENodW5rCit7CisJZ3VpbnQxNiBjaHVua3M7CisJZ3VjaGFyICByZXNlcnZlZFs4XTsKK30gRmx4UHJlZml4Q2h1bms7CisKK3R5cGVkZWYgc3RydWN0IF9GbHhTZWdtZW50VGFibGUKK3sKKwlndWludDE2IHNlZ21lbnRzOworfSBGbHhTZWdtZW50VGFibGU7CisKK3R5cGVkZWYgc3RydWN0IF9GbHhIdWZmbWFuVGFibGUKK3sKKwlndWludDE2IGNvZGVsZW5ndGg7CisJZ3VpbnQxNiBudW1jb2RlczsKKwlndWNoYXIJcmVzZXJ2ZWRbNl07Cit9IEZseEh1ZmZtYW5UYWJsZTsKKwordHlwZWRlZiBzdHJ1Y3QgX0ZseEZyYW1lVHlwZQoreworCWd1aW50MTYgY2h1bmtzOworCWd1aW50MTYgZGVsYXk7CisJZ3VjaGFyCXJlc2VydmVkWzZdOworfSBGbHhGcmFtZVR5cGU7CisjZGVmaW5lIEZseEZyYW1lVHlwZVNpemUgMTAKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0ZMWF9GTVRfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZmx4L2dzdGZseGRlYy5jIGIvZ3N0L2ZseC9nc3RmbHhkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2Q1NTJhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2ZseC9nc3RmbHhkZWMuYwpAQCAtMCwwICsxLDk5OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQHRlbXBsZS1iYXB0aXN0LmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMTY+IE1hdHRoZXcgV2F0ZXJzIDxtYXR0aGV3QGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtZmx4ZGVjCisgKgorICogVGhpcyBlbGVtZW50IGRlY29kZXMgZmxpL2ZsYy9mbHgtdmlkZW8gaW50byByYXcgdmlkZW8KKyAqLworLyoKKyAqIGh0dHA6Ly93d3cuY29vbHV0aWxzLmNvbS9Gb3JtYXRzL0ZMSQorICogaHR0cDovL3dvb2RzaG9sZS5lci51c2dzLmdvdi9vcGVyYXRpb25zL21vZGVsaW5nL2ZsYy5odG1sCisgKiBodHRwOi8vd3d3LmNvbXB1cGhhc2UuY29tL2ZsaWMuaHRtCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZmx4X2ZtdC5oIgorI2luY2x1ZGUgImdzdGZseGRlYy5oIgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjZGVmaW5lIEpJRkZJRSAgKEdTVF9TRUNPTkQvNzApCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGZseGRlY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBmbHhkZWNfZGVidWcKKworLyogaW5wdXQgKi8KK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LWZsaSIpCisgICAgKTsKKworI2lmIEdfQllURV9PUkRFUiA9PSBHX0JJR19FTkRJQU4KKyNkZWZpbmUgUkdCX09SREVSICJ4UkdCIgorI2Vsc2UKKyNkZWZpbmUgUkdCX09SREVSICJCR1J4IgorI2VuZGlmCisKKy8qIG91dHB1dCAqLworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY192aWRlb19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoUkdCX09SREVSKSkKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfZmx4ZGVjX2Rpc3Bvc2UgKEdzdEZseERlYyAqIGZseGRlYyk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9mbHhkZWNfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ZseGRlY19zaW5rX2V2ZW50X2hhbmRsZXIgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X2ZseGRlY19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ZseGRlY19zcmNfcXVlcnlfaGFuZGxlciAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0UXVlcnkgKiBxdWVyeSk7CisKK3N0YXRpYyBnYm9vbGVhbiBmbHhfZGVjb2RlX2NvbG9yIChHc3RGbHhEZWMgKiBmbHhkZWMsIEdzdEJ5dGVSZWFkZXIgKiByZWFkZXIsCisgICAgR3N0Qnl0ZVdyaXRlciAqIHdyaXRlciwgZ2ludCBzY2FsZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZmx4X2RlY29kZV9icnVuIChHc3RGbHhEZWMgKiBmbHhkZWMsCisgICAgR3N0Qnl0ZVJlYWRlciAqIHJlYWRlciwgR3N0Qnl0ZVdyaXRlciAqIHdyaXRlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZmx4X2RlY29kZV9kZWx0YV9mbGkgKEdzdEZseERlYyAqIGZseGRlYywKKyAgICBHc3RCeXRlUmVhZGVyICogcmVhZGVyLCBHc3RCeXRlV3JpdGVyICogd3JpdGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBmbHhfZGVjb2RlX2RlbHRhX2ZsYyAoR3N0Rmx4RGVjICogZmx4ZGVjLAorICAgIEdzdEJ5dGVSZWFkZXIgKiByZWFkZXIsIEdzdEJ5dGVXcml0ZXIgKiB3cml0ZXIpOworCisjZGVmaW5lIHJuZGFsaWduKG9mZikgKChvZmYpICsgKChvZmYpICYgMSkpCisKKyNkZWZpbmUgZ3N0X2ZseGRlY19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RGbHhEZWMsIGdzdF9mbHhkZWMsIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgdm9pZAorZ3N0X2ZseGRlY19jbGFzc19pbml0IChHc3RGbHhEZWNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IChHT2JqZWN0RmluYWxpemVGdW5jKSBnc3RfZmx4ZGVjX2Rpc3Bvc2U7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGZseGRlY19kZWJ1ZywgImZseGRlYyIsIDAsICJGTFggdmlkZW8gZGVjb2RlciIpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmx4ZGVjX2NoYW5nZV9zdGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkZMWCB2aWRlbyBkZWNvZGVyIiwKKyAgICAgICJDb2RlYy9EZWNvZGVyL1ZpZGVvIiwKKyAgICAgICJGTEMvRkxJL0ZMWCB2aWRlbyBkZWNvZGVyIiwKKyAgICAgICJTZXBwIFdpam5hbmRzIDxtcnJhenpAZ2FyYmFnZS1jb2RlcnoubmV0PiwgWmVlc2hhbiBBbGkgPHplZW5peEBnbWFpbC5jb20+Iik7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICBnc3Rfc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXQgKCZzaW5rX2ZhY3RvcnkpKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgIGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldCAoJnNyY192aWRlb19mYWN0b3J5KSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx4ZGVjX2luaXQgKEdzdEZseERlYyAqIGZseGRlYykKK3sKKyAgZmx4ZGVjLT5zaW5rcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzaW5rX2ZhY3RvcnksICJzaW5rIik7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChmbHhkZWMpLCBmbHhkZWMtPnNpbmtwYWQpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoZmx4ZGVjLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbHhkZWNfY2hhaW4pKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKGZseGRlYy0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmx4ZGVjX3NpbmtfZXZlbnRfaGFuZGxlcikpOworCisgIGZseGRlYy0+c3JjcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzcmNfdmlkZW9fZmFjdG9yeSwgInNyYyIpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoZmx4ZGVjKSwgZmx4ZGVjLT5zcmNwYWQpOworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAoZmx4ZGVjLT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ZseGRlY19zcmNfcXVlcnlfaGFuZGxlcikpOworCisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKGZseGRlYy0+c3JjcGFkKTsKKworICBmbHhkZWMtPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx4ZGVjX2Rpc3Bvc2UgKEdzdEZseERlYyAqIGZseGRlYykKK3sKKyAgaWYgKGZseGRlYy0+YWRhcHRlcikgeworICAgIGdfb2JqZWN0X3VucmVmIChmbHhkZWMtPmFkYXB0ZXIpOworICAgIGZseGRlYy0+YWRhcHRlciA9IE5VTEw7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAoKEdPYmplY3QgKikgZmx4ZGVjKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmx4ZGVjX3NyY19xdWVyeV9oYW5kbGVyIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RGbHhEZWMgKmZseGRlYyA9IChHc3RGbHhEZWMgKikgcGFyZW50OworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9EVVJBVElPTjoKKyAgICB7CisgICAgICBHc3RGb3JtYXQgZm9ybWF0OworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfZHVyYXRpb24gKHF1ZXJ5LCAmZm9ybWF0LCBOVUxMKTsKKworICAgICAgaWYgKGZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUpCisgICAgICAgIGdvdG8gZG9uZTsKKworICAgICAgZ3N0X3F1ZXJ5X3NldF9kdXJhdGlvbiAocXVlcnksIGZvcm1hdCwgZmx4ZGVjLT5kdXJhdGlvbik7CisKKyAgICAgIHJldCA9IFRSVUU7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorZG9uZToKKyAgaWYgKCFyZXQpCisgICAgcmV0ID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ZseGRlY19zaW5rX2V2ZW50X2hhbmRsZXIgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdEZseERlYyAqZmx4ZGVjOworICBnYm9vbGVhbiByZXQ7CisKKyAgZmx4ZGVjID0gR1NUX0ZMWERFQyAocGFyZW50KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgIHsKKyAgICAgIGdzdF9ldmVudF9jb3B5X3NlZ21lbnQgKGV2ZW50LCAmZmx4ZGVjLT5zZWdtZW50KTsKKyAgICAgIGlmIChmbHhkZWMtPnNlZ21lbnQuZm9ybWF0ICE9IEdTVF9GT1JNQVRfVElNRSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChmbHhkZWMsICJnZW5lcmF0aW5nIFRJTUUgc2VnbWVudCIpOworICAgICAgICBnc3Rfc2VnbWVudF9pbml0ICgmZmx4ZGVjLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZmbHhkZWMtPnNlZ21lbnQpOworICAgICAgfQorCisgICAgICBpZiAoZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChmbHhkZWMtPnNyY3BhZCkpIHsKKyAgICAgICAgcmV0ID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmx4ZGVjLT5uZWVkX3NlZ21lbnQgPSBUUlVFOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJmZseGRlYy0+c2VnbWVudCwgR1NUX0ZPUk1BVF9VTkRFRklORUQpOworICAgICAgcmV0ID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitmbHhfZGVjb2RlX2NodW5rcyAoR3N0Rmx4RGVjICogZmx4ZGVjLCBndWxvbmcgbl9jaHVua3MsIEdzdEJ5dGVSZWFkZXIgKiByZWFkZXIsCisgICAgR3N0Qnl0ZVdyaXRlciAqIHdyaXRlcikKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKworICB3aGlsZSAobl9jaHVua3MtLSkgeworICAgIEdzdEJ5dGVSZWFkZXIgY2h1bms7CisgICAgZ3VpbnQzMiBzaXplOworICAgIGd1aW50MTYgdHlwZTsKKworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKHJlYWRlciwgJnNpemUpKQorICAgICAgZ290byBwYXJzZV9lcnJvcjsKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2xlIChyZWFkZXIsICZ0eXBlKSkKKyAgICAgIGdvdG8gcGFyc2VfZXJyb3I7CisgICAgR1NUX0xPR19PQkpFQ1QgKGZseGRlYywgImNodW5rIGhhcyB0eXBlIDB4JTAyeCBzaXplICVkIiwgdHlwZSwgc2l6ZSk7CisKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfc3ViX3JlYWRlciAocmVhZGVyLCAmY2h1bmssCisgICAgICAgICAgICBzaXplIC0gRmx4RnJhbWVDaHVua1NpemUpKSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChmbHhkZWMsICJJbmNvcnJlY3Qgc2l6ZSBpbiB0aGUgY2h1bmsgaGVhZGVyIik7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBGTFhfQ09MT1I2NDoKKyAgICAgICAgcmV0ID0gZmx4X2RlY29kZV9jb2xvciAoZmx4ZGVjLCAmY2h1bmssIHdyaXRlciwgMik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZMWF9DT0xPUjI1NjoKKyAgICAgICAgcmV0ID0gZmx4X2RlY29kZV9jb2xvciAoZmx4ZGVjLCAmY2h1bmssIHdyaXRlciwgMCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZMWF9CUlVOOgorICAgICAgICByZXQgPSBmbHhfZGVjb2RlX2JydW4gKGZseGRlYywgJmNodW5rLCB3cml0ZXIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGTFhfTEM6CisgICAgICAgIHJldCA9IGZseF9kZWNvZGVfZGVsdGFfZmxpIChmbHhkZWMsICZjaHVuaywgd3JpdGVyKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRkxYX1NTMjoKKyAgICAgICAgcmV0ID0gZmx4X2RlY29kZV9kZWx0YV9mbGMgKGZseGRlYywgJmNodW5rLCB3cml0ZXIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGTFhfQkxBQ0s6CisgICAgICAgIHJldCA9IGdzdF9ieXRlX3dyaXRlcl9maWxsICh3cml0ZXIsIDAsIGZseGRlYy0+c2l6ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZMWF9NSU5JOgorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJVbmltcGxlbWVudGVkIGNodW5rIHR5cGU6IDB4JTAyeCBzaXplOiAlZCAtIHNraXBwaW5nIiwKKyAgICAgICAgICAgIHR5cGUsIHNpemUpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIXJldCkKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKKworcGFyc2VfZXJyb3I6CisgIEdTVF9FUlJPUl9PQkpFQ1QgKGZseGRlYywgIkZhaWxlZCB0byBkZWNvZGUgY2h1bmsiKTsKK2Vycm9yOgorICByZXR1cm4gRkFMU0U7Cit9CisKKworc3RhdGljIGdib29sZWFuCitmbHhfZGVjb2RlX2NvbG9yIChHc3RGbHhEZWMgKiBmbHhkZWMsIEdzdEJ5dGVSZWFkZXIgKiByZWFkZXIsCisgICAgR3N0Qnl0ZVdyaXRlciAqIHdyaXRlciwgZ2ludCBzY2FsZSkKK3sKKyAgZ3VpbnQ4IGNvdW50LCBpbmR4OworICBndWludDE2IHBhY2tzOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKHJlYWRlciwgJnBhY2tzKSkKKyAgICBnb3RvIGVycm9yOworICBpbmR4ID0gMDsKKworICBHU1RfTE9HICgiR3N0Rmx4RGVjOiBjbWFwIHBhY2tzOiAlZCIsIChndWludCkgcGFja3MpOworICB3aGlsZSAocGFja3MtLSkgeworICAgIGNvbnN0IGd1aW50OCAqZGF0YTsKKyAgICBndWludDE2IGFjdHVhbF9jb3VudDsKKworICAgIC8qIGNvbG9yIG1hcCBpbmRleCArIHNraXAgY291bnQgKi8KKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKHJlYWRlciwgJmluZHgpKQorICAgICAgZ290byBlcnJvcjsKKworICAgIC8qIG51bWJlciBvZiByZ2IgdHJpcGxldHMgKi8KKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKHJlYWRlciwgJmNvdW50KSkKKyAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBhY3R1YWxfY291bnQgPSBjb3VudCA9PSAwID8gMjU2IDogY291bnQ7CisKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfZGF0YSAocmVhZGVyLCBjb3VudCAqIDMsICZkYXRhKSkKKyAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoZmx4ZGVjLCAiY21hcCBjb3VudDogJWQgKGluZHg6ICVkKSIsIGFjdHVhbF9jb3VudCwgaW5keCk7CisgICAgZmx4X3NldF9wYWxldHRlX3ZlY3RvciAoZmx4ZGVjLT5jb252ZXJ0ZXIsIGluZHgsIGFjdHVhbF9jb3VudCwKKyAgICAgICAgKGd1Y2hhciAqKSBkYXRhLCBzY2FsZSk7CisgIH0KKworICByZXR1cm4gVFJVRTsKKworZXJyb3I6CisgIEdTVF9FUlJPUl9PQkpFQ1QgKGZseGRlYywgIkVycm9yIGRlY29kaW5nIGNvbG9yIHBhbGV0dGUiKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2ZseF9kZWNvZGVfYnJ1biAoR3N0Rmx4RGVjICogZmx4ZGVjLCBHc3RCeXRlUmVhZGVyICogcmVhZGVyLAorICAgIEdzdEJ5dGVXcml0ZXIgKiB3cml0ZXIpCit7CisgIGd1bG9uZyBsaW5lcywgcm93OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChmbHhkZWMgIT0gTlVMTCwgRkFMU0UpOworCisgIGxpbmVzID0gZmx4ZGVjLT5oZHIuaGVpZ2h0OworICB3aGlsZSAobGluZXMtLSkgeworICAgIC8qIHBhY2tldCBjb3VudC4gIAorICAgICAqIHNob3VsZCBub3QgYmUgdXNlZCBhbnltb3JlLCBzaW5jZSB0aGUgZmxjIGZvcm1hdCBjYW4KKyAgICAgKiBjb250YWluIG1vcmUgdGhlbiAyNTUgUkxFIHBhY2tldHMuIHdlIHVzZSB0aGUgZnJhbWUgCisgICAgICogd2lkdGggaW5zdGVhZC4gCisgICAgICovCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAocmVhZGVyLCAxKSkKKyAgICAgIGdvdG8gZXJyb3I7CisKKyAgICByb3cgPSBmbHhkZWMtPmhkci53aWR0aDsKKyAgICB3aGlsZSAocm93KSB7CisgICAgICBnaW50OCBjb3VudDsKKworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2ludDggKHJlYWRlciwgJmNvdW50KSkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgaWYgKGNvdW50IDw9IDApIHsKKyAgICAgICAgY29uc3QgZ3VpbnQ4ICpkYXRhOworCisgICAgICAgIC8qIGxpdGVyYWwgcnVuICovCisgICAgICAgIGNvdW50ID0gQUJTIChjb3VudCk7CisKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGZseGRlYywgImhhdmUgbGl0ZXJhbCBydW4gb2Ygc2l6ZSAlZCIsIGNvdW50KTsKKworICAgICAgICBpZiAoY291bnQgPiByb3cpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChmbHhkZWMsICJJbnZhbGlkIEJSVU4gbGluZSBkZXRlY3RlZC4gIgorICAgICAgICAgICAgICAiYnl0ZXMgdG8gd3JpdGUgZXhjZWVkcyB0aGUgZW5kIG9mIHRoZSByb3ciKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgcm93IC09IGNvdW50OworCisgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF9kYXRhIChyZWFkZXIsIGNvdW50LCAmZGF0YSkpCisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKCFnc3RfYnl0ZV93cml0ZXJfcHV0X2RhdGEgKHdyaXRlciwgZGF0YSwgY291bnQpKQorICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICB9IGVsc2UgeworICAgICAgICBndWludDggeDsKKworICAgICAgICBHU1RfTE9HX09CSkVDVCAoZmx4ZGVjLCAiaGF2ZSByZXBsaWNhdGUgcnVuIG9mIHNpemUgJWQiLCBjb3VudCk7CisKKyAgICAgICAgaWYgKGNvdW50ID4gcm93KSB7CisgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoZmx4ZGVjLCAiSW52YWxpZCBCUlVOIHBhY2tldCBkZXRlY3RlZC4iCisgICAgICAgICAgICAgICJieXRlcyB0byB3cml0ZSBleGNlZWRzIHRoZSBlbmQgb2YgdGhlIHJvdyIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHJlcGxpY2F0ZSBydW4gKi8KKyAgICAgICAgcm93IC09IGNvdW50OworCisgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAocmVhZGVyLCAmeCkpCisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKCFnc3RfYnl0ZV93cml0ZXJfZmlsbCAod3JpdGVyLCB4LCBjb3VudCkpCisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gVFJVRTsKKworZXJyb3I6CisgIEdTVF9FUlJPUl9PQkpFQ1QgKGZseGRlYywgIkZhaWxlZCB0byBkZWNvZGUgQlJVTiBwYWNrZXQiKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2ZseF9kZWNvZGVfZGVsdGFfZmxpIChHc3RGbHhEZWMgKiBmbHhkZWMsIEdzdEJ5dGVSZWFkZXIgKiByZWFkZXIsCisgICAgR3N0Qnl0ZVdyaXRlciAqIHdyaXRlcikKK3sKKyAgZ3VpbnQxNiBzdGFydF9saW5lLCBsaW5lczsKKyAgZ3VpbnQgbGluZV9zdGFydF9pOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChmbHhkZWMgIT0gTlVMTCwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZmx4ZGVjLT5kZWx0YV9kYXRhICE9IE5VTEwsIEZBTFNFKTsKKworICAvKiB1c2UgbGFzdCBmcmFtZSBmb3IgZGVsdGEgKi8KKyAgaWYgKCFnc3RfYnl0ZV93cml0ZXJfcHV0X2RhdGEgKHdyaXRlciwgZmx4ZGVjLT5kZWx0YV9kYXRhLCBmbHhkZWMtPnNpemUpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAocmVhZGVyLCAmc3RhcnRfbGluZSkpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAocmVhZGVyLCAmbGluZXMpKQorICAgIGdvdG8gZXJyb3I7CisgIEdTVF9MT0dfT0JKRUNUIChmbHhkZWMsICJoZWlnaHQgJWQgc3RhcnQgbGluZSAlZCBsaW5lIGNvdW50ICVkIiwKKyAgICAgIGZseGRlYy0+aGRyLmhlaWdodCwgc3RhcnRfbGluZSwgbGluZXMpOworCisgIGlmIChzdGFydF9saW5lICsgbGluZXMgPiBmbHhkZWMtPmhkci5oZWlnaHQpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChmbHhkZWMsICJJbnZhbGlkIEZMSSBwYWNrZXQgZGV0ZWN0ZWQuIHRvbyBtYW55IGxpbmVzLiIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGxpbmVfc3RhcnRfaSA9IGZseGRlYy0+aGRyLndpZHRoICogc3RhcnRfbGluZTsKKyAgaWYgKCFnc3RfYnl0ZV93cml0ZXJfc2V0X3BvcyAod3JpdGVyLCBsaW5lX3N0YXJ0X2kpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgd2hpbGUgKGxpbmVzLS0pIHsKKyAgICBndWludDggcGFja2V0czsKKworICAgIC8qIHBhY2tldCBjb3VudCAqLworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAocmVhZGVyLCAmcGFja2V0cykpCisgICAgICBnb3RvIGVycm9yOworICAgIEdTVF9MT0dfT0JKRUNUIChmbHhkZWMsICJoYXZlICVkIHBhY2tldHMiLCBwYWNrZXRzKTsKKworICAgIHdoaWxlIChwYWNrZXRzLS0pIHsKKyAgICAgIC8qIHNraXAgY291bnQgKi8KKyAgICAgIGd1aW50OCBza2lwOworICAgICAgZ2ludDggY291bnQ7CisgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKHJlYWRlciwgJnNraXApKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAvKiBza2lwIGJ5dGVzICovCisgICAgICBpZiAoIWdzdF9ieXRlX3dyaXRlcl9zZXRfcG9zICh3cml0ZXIsCisgICAgICAgICAgICAgIGdzdF9ieXRlX3dyaXRlcl9nZXRfcG9zICh3cml0ZXIpICsgc2tpcCkpCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgIC8qIFJMRSBjb3VudCAqLworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2ludDggKHJlYWRlciwgJmNvdW50KSkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgaWYgKGNvdW50IDwgMCkgeworICAgICAgICBndWludDggeDsKKworICAgICAgICAvKiBsaXRlcmFsIHJ1biAqLworICAgICAgICBjb3VudCA9IEFCUyAoY291bnQpOworICAgICAgICBHU1RfTE9HX09CSkVDVCAoZmx4ZGVjLCAiaGF2ZSBsaXRlcmFsIHJ1biBvZiBzaXplICVkIGF0IG9mZnNldCAlZCIsCisgICAgICAgICAgICBjb3VudCwgc2tpcCk7CisKKyAgICAgICAgaWYgKHNraXAgKyBjb3VudCA+IGZseGRlYy0+aGRyLndpZHRoKSB7CisgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoZmx4ZGVjLCAiSW52YWxpZCBGTEkgcGFja2V0IGRldGVjdGVkLiAiCisgICAgICAgICAgICAgICJsaW5lIHRvbyBsb25nLiIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAocmVhZGVyLCAmeCkpCisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKCFnc3RfYnl0ZV93cml0ZXJfZmlsbCAod3JpdGVyLCB4LCBjb3VudCkpCisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGd1aW50OCAqZGF0YTsKKworICAgICAgICBHU1RfTE9HX09CSkVDVCAoZmx4ZGVjLCAiaGF2ZSByZXBsaWNhdGUgcnVuIG9mIHNpemUgJWQgYXQgb2Zmc2V0ICVkIiwKKyAgICAgICAgICAgIGNvdW50LCBza2lwKTsKKworICAgICAgICBpZiAoc2tpcCArIGNvdW50ID4gZmx4ZGVjLT5oZHIud2lkdGgpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChmbHhkZWMsICJJbnZhbGlkIEZMSSBwYWNrZXQgZGV0ZWN0ZWQuICIKKyAgICAgICAgICAgICAgImxpbmUgdG9vIGxvbmcuIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLyogcmVwbGljYXRlIHJ1biAqLworICAgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfZGF0YSAocmVhZGVyLCBjb3VudCwgJmRhdGEpKQorICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGlmICghZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICh3cml0ZXIsIGRhdGEsIGNvdW50KSkKKyAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgfQorICAgIH0KKyAgICBsaW5lX3N0YXJ0X2kgKz0gZmx4ZGVjLT5oZHIud2lkdGg7CisgICAgaWYgKCFnc3RfYnl0ZV93cml0ZXJfc2V0X3BvcyAod3JpdGVyLCBsaW5lX3N0YXJ0X2kpKQorICAgICAgZ290byBlcnJvcjsKKyAgfQorCisgIHJldHVybiBUUlVFOworCitlcnJvcjoKKyAgR1NUX0VSUk9SX09CSkVDVCAoZmx4ZGVjLCAiRmFpbGVkIHRvIGRlY29kZSBGTEkgcGFja2V0Iik7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitmbHhfZGVjb2RlX2RlbHRhX2ZsYyAoR3N0Rmx4RGVjICogZmx4ZGVjLCBHc3RCeXRlUmVhZGVyICogcmVhZGVyLAorICAgIEdzdEJ5dGVXcml0ZXIgKiB3cml0ZXIpCit7CisgIGd1aW50MTYgbGluZXMsIHN0YXJ0X2w7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGZseGRlYyAhPSBOVUxMLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChmbHhkZWMtPmRlbHRhX2RhdGEgIT0gTlVMTCwgRkFMU0UpOworCisgIC8qIHVzZSBsYXN0IGZyYW1lIGZvciBkZWx0YSAqLworICBpZiAoIWdzdF9ieXRlX3dyaXRlcl9wdXRfZGF0YSAod3JpdGVyLCBmbHhkZWMtPmRlbHRhX2RhdGEsIGZseGRlYy0+c2l6ZSkpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAocmVhZGVyLCAmbGluZXMpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKGxpbmVzID4gZmx4ZGVjLT5oZHIuaGVpZ2h0KSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZmx4ZGVjLCAiSW52YWxpZCBGTEMgcGFja2V0IGRldGVjdGVkLiB0b28gbWFueSBsaW5lcy4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBzdGFydF9sID0gbGluZXM7CisKKyAgd2hpbGUgKGxpbmVzKSB7CisgICAgZ3VpbnQxNiBvcGNvZGU7CisKKyAgICBpZiAoIWdzdF9ieXRlX3dyaXRlcl9zZXRfcG9zICh3cml0ZXIsCisgICAgICAgICAgICBmbHhkZWMtPmhkci53aWR0aCAqIChzdGFydF9sIC0gbGluZXMpKSkKKyAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAvKiBwcm9jZXNzIG9wY29kZShzKSAqLworICAgIHdoaWxlIChUUlVFKSB7CisgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2xlIChyZWFkZXIsICZvcGNvZGUpKQorICAgICAgICBnb3RvIGVycm9yOworICAgICAgaWYgKChvcGNvZGUgJiAweGMwMDApID09IDApCisgICAgICAgIGJyZWFrOworCisgICAgICBpZiAoKG9wY29kZSAmIDB4YzAwMCkgPT0gMHhjMDAwKSB7CisgICAgICAgIC8qIGxpbmUgc2tpcCBjb3VudCAqLworICAgICAgICBndWxvbmcgc2tpcCA9ICgweDEwMDAwIC0gb3Bjb2RlKTsKKyAgICAgICAgaWYgKHNraXAgPiBmbHhkZWMtPmhkci5oZWlnaHQpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChmbHhkZWMsICJJbnZhbGlkIEZMQyBwYWNrZXQgZGV0ZWN0ZWQuICIKKyAgICAgICAgICAgICAgInNraXAgbGluZSBjb3VudCB0b28gYmlnLiIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBzdGFydF9sICs9IHNraXA7CisgICAgICAgIGlmICghZ3N0X2J5dGVfd3JpdGVyX3NldF9wb3MgKHdyaXRlciwKKyAgICAgICAgICAgICAgICBnc3RfYnl0ZV93cml0ZXJfZ2V0X3BvcyAod3JpdGVyKSArIGZseGRlYy0+aGRyLndpZHRoICogc2tpcCkpCisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGxhc3QgcGl4ZWwgKi8KKyAgICAgICAgaWYgKCFnc3RfYnl0ZV93cml0ZXJfc2V0X3BvcyAod3JpdGVyLAorICAgICAgICAgICAgICAgIGdzdF9ieXRlX3dyaXRlcl9nZXRfcG9zICh3cml0ZXIpICsgZmx4ZGVjLT5oZHIud2lkdGgpKQorICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGlmICghZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50OCAod3JpdGVyLCBvcGNvZGUgJiAweGZmKSkKKyAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgfQorICAgIH0KKworICAgIC8qIGxhc3Qgb3Bjb2RlIGlzIHRoZSBwYWNrZXQgY291bnQgKi8KKyAgICBHU1RfTE9HX09CSkVDVCAoZmx4ZGVjLCAiaGF2ZSAlZCBwYWNrZXRzIiwgb3Bjb2RlKTsKKyAgICB3aGlsZSAob3Bjb2RlLS0pIHsKKyAgICAgIC8qIHNraXAgY291bnQgKi8KKyAgICAgIGd1aW50OCBza2lwOworICAgICAgZ2ludDggY291bnQ7CisKKyAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAocmVhZGVyLCAmc2tpcCkpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICBpZiAoIWdzdF9ieXRlX3dyaXRlcl9zZXRfcG9zICh3cml0ZXIsCisgICAgICAgICAgICAgIGdzdF9ieXRlX3dyaXRlcl9nZXRfcG9zICh3cml0ZXIpICsgc2tpcCkpCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgIC8qIFJMRSBjb3VudCAqLworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2ludDggKHJlYWRlciwgJmNvdW50KSkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgaWYgKGNvdW50IDwgMCkgeworICAgICAgICBndWludDE2IHg7CisKKyAgICAgICAgLyogcmVwbGljYXRlIHdvcmQgcnVuICovCisgICAgICAgIGNvdW50ID0gQUJTIChjb3VudCk7CisKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGZseGRlYywgImhhdmUgcmVwbGljYXRlIHJ1biBvZiBzaXplICVkIGF0IG9mZnNldCAlZCIsCisgICAgICAgICAgICBjb3VudCwgc2tpcCk7CisKKyAgICAgICAgaWYgKHNraXAgKyBjb3VudCA+IGZseGRlYy0+aGRyLndpZHRoKSB7CisgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoZmx4ZGVjLCAiSW52YWxpZCBGTEMgcGFja2V0IGRldGVjdGVkLiAiCisgICAgICAgICAgICAgICJsaW5lIHRvbyBsb25nLiIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKHJlYWRlciwgJngpKQorICAgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgICAgd2hpbGUgKGNvdW50LS0pIHsKKyAgICAgICAgICBpZiAoIWdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDE2X2xlICh3cml0ZXIsIHgpKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGZseGRlYywgImhhdmUgbGl0ZXJhbCBydW4gb2Ygc2l6ZSAlZCBhdCBvZmZzZXQgJWQiLAorICAgICAgICAgICAgY291bnQsIHNraXApOworCisgICAgICAgIGlmIChza2lwICsgY291bnQgPiBmbHhkZWMtPmhkci53aWR0aCkgeworICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGZseGRlYywgIkludmFsaWQgRkxDIHBhY2tldCBkZXRlY3RlZC4gIgorICAgICAgICAgICAgICAibGluZSB0b28gbG9uZy4iKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoY291bnQtLSkgeworICAgICAgICAgIGd1aW50MTYgeDsKKworICAgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKHJlYWRlciwgJngpKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICBpZiAoIWdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDE2X2xlICh3cml0ZXIsIHgpKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBsaW5lcy0tOworICB9CisKKyAgcmV0dXJuIFRSVUU7CisKK2Vycm9yOgorICBHU1RfRVJST1JfT0JKRUNUIChmbHhkZWMsICJGYWlsZWQgdG8gZGVjb2RlIEZMSSBwYWNrZXQiKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK19yZWFkX2ZseF9oZWFkZXIgKEdzdEZseERlYyAqIGZseGRlYywgR3N0Qnl0ZVJlYWRlciAqIHJlYWRlciwgRmx4SGVhZGVyICogZmx4aCkKK3sKKyAgbWVtc2V0IChmbHhoLCAwLCBzaXplb2YgKCpmbHhoKSk7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9sZSAocmVhZGVyLCAmZmx4aC0+c2l6ZSkpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKGZseGgtPnNpemUgPCBGbHhIZWFkZXJTaXplKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZmx4ZGVjLCAiSW52YWxpZCBmaWxlIHNpemUgaW4gdGhlIGhlYWRlciIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKHJlYWRlciwgJmZseGgtPnR5cGUpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKHJlYWRlciwgJmZseGgtPmZyYW1lcykpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAocmVhZGVyLCAmZmx4aC0+d2lkdGgpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKHJlYWRlciwgJmZseGgtPmhlaWdodCkpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAocmVhZGVyLCAmZmx4aC0+ZGVwdGgpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKHJlYWRlciwgJmZseGgtPmZsYWdzKSkKKyAgICBnb3RvIGVycm9yOworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2xlIChyZWFkZXIsICZmbHhoLT5zcGVlZCkpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAocmVhZGVyLCAyKSkgICAgICAgIC8qIHJlc2VydmVkICovCisgICAgZ290byBlcnJvcjsKKyAgLyogRkxDICovCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKHJlYWRlciwgJmZseGgtPmNyZWF0ZWQpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKHJlYWRlciwgJmZseGgtPmNyZWF0b3IpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKHJlYWRlciwgJmZseGgtPnVwZGF0ZWQpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKHJlYWRlciwgJmZseGgtPnVwZGF0ZXIpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKHJlYWRlciwgJmZseGgtPmFzcGVjdF9keCkpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAocmVhZGVyLCAmZmx4aC0+YXNwZWN0X2R5KSkKKyAgICBnb3RvIGVycm9yOworICAvKiBFR0kgKi8KKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAocmVhZGVyLCAmZmx4aC0+ZXh0X2ZsYWdzKSkKKyAgICBnb3RvIGVycm9yOworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2xlIChyZWFkZXIsICZmbHhoLT5rZXlmcmFtZXMpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKHJlYWRlciwgJmZseGgtPnRvdGFsZnJhbWVzKSkKKyAgICBnb3RvIGVycm9yOworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2xlIChyZWFkZXIsICZmbHhoLT5yZXFfbWVtb3J5KSkKKyAgICBnb3RvIGVycm9yOworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2xlIChyZWFkZXIsICZmbHhoLT5tYXhfcmVnaW9ucykpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAocmVhZGVyLCAmZmx4aC0+dHJhbnNwX251bSkpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAocmVhZGVyLCAyNCkpICAgICAgIC8qIHJlc2VydmVkICovCisgICAgZ290byBlcnJvcjsKKyAgLyogRkxDICovCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKHJlYWRlciwgJmZseGgtPm9mcmFtZTEpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKHJlYWRlciwgJmZseGgtPm9mcmFtZTIpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKHJlYWRlciwgNDApKSAgICAgICAvKiByZXNlcnZlZCAqLworICAgIGdvdG8gZXJyb3I7CisKKyAgcmV0dXJuIFRSVUU7CisKK2Vycm9yOgorICBHU1RfRVJST1JfT0JKRUNUIChmbHhkZWMsICJFcnJvciByZWFkaW5nIGZpbGUgaGVhZGVyIik7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbHhkZWNfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdEJ5dGVSZWFkZXIgcmVhZGVyOworICBHc3RCdWZmZXIgKmlucHV0OworICBHc3RNYXBJbmZvIG1hcF9pbmZvOworICBHc3RDYXBzICpjYXBzOworICBndWludCBhdmFpbGFibGU7CisgIEdzdEZsb3dSZXR1cm4gcmVzID0gR1NUX0ZMT1dfT0s7CisKKyAgR3N0Rmx4RGVjICpmbHhkZWM7CisgIEZseEhlYWRlciAqZmx4aDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoYnVmICE9IE5VTEwsIEdTVF9GTE9XX0VSUk9SKTsKKyAgZmx4ZGVjID0gKEdzdEZseERlYyAqKSBwYXJlbnQ7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChmbHhkZWMgIT0gTlVMTCwgR1NUX0ZMT1dfRVJST1IpOworCisgIGdzdF9hZGFwdGVyX3B1c2ggKGZseGRlYy0+YWRhcHRlciwgYnVmKTsKKyAgYXZhaWxhYmxlID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChmbHhkZWMtPmFkYXB0ZXIpOworICBpbnB1dCA9IGdzdF9hZGFwdGVyX2dldF9idWZmZXIgKGZseGRlYy0+YWRhcHRlciwgYXZhaWxhYmxlKTsKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAoaW5wdXQsICZtYXBfaW5mbywgR1NUX01BUF9SRUFEKSkgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChmbHhkZWMsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIiVzIiwgIkZhaWxlZCB0byBtYXAgYnVmZmVyIiksIChOVUxMKSk7CisgICAgZ290byBlcnJvcjsKKyAgfQorICBnc3RfYnl0ZV9yZWFkZXJfaW5pdCAoJnJlYWRlciwgbWFwX2luZm8uZGF0YSwgbWFwX2luZm8uc2l6ZSk7CisKKyAgaWYgKGZseGRlYy0+c3RhdGUgPT0gR1NUX0ZMWERFQ19SRUFEX0hFQURFUikgeworICAgIGlmIChhdmFpbGFibGUgPj0gRmx4SGVhZGVyU2l6ZSkgeworICAgICAgR3N0Qnl0ZVJlYWRlciBoZWFkZXI7CisgICAgICBHc3RDYXBzICp0ZW1wbDsKKworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3N1Yl9yZWFkZXIgKCZyZWFkZXIsICZoZWFkZXIsIEZseEhlYWRlclNpemUpKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChmbHhkZWMsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAgICAgKCIlcyIsICJDb3VsZCBub3QgcmVhZCBoZWFkZXIiKSwgKE5VTEwpKTsKKyAgICAgICAgZ290byB1bm1hcF9pbnB1dF9lcnJvcjsKKyAgICAgIH0KKyAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChmbHhkZWMtPmFkYXB0ZXIsIEZseEhlYWRlclNpemUpOworICAgICAgYXZhaWxhYmxlIC09IEZseEhlYWRlclNpemU7CisKKyAgICAgIGlmICghX3JlYWRfZmx4X2hlYWRlciAoZmx4ZGVjLCAmaGVhZGVyLCAmZmx4ZGVjLT5oZHIpKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChmbHhkZWMsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAgICAgKCIlcyIsICJGYWlsZWQgdG8gcGFyc2UgaGVhZGVyIiksIChOVUxMKSk7CisgICAgICAgIGdvdG8gdW5tYXBfaW5wdXRfZXJyb3I7CisgICAgICB9CisKKyAgICAgIGZseGggPSAmZmx4ZGVjLT5oZHI7CisKKyAgICAgIC8qIGNoZWNrIGhlYWRlciAqLworICAgICAgaWYgKGZseGgtPnR5cGUgIT0gRkxYX01BR0lDSERSX0ZMSSAmJgorICAgICAgICAgIGZseGgtPnR5cGUgIT0gRkxYX01BR0lDSERSX0ZMQyAmJiBmbHhoLT50eXBlICE9IEZMWF9NQUdJQ0hEUl9GTFgpIHsKKyAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGZseGRlYywgU1RSRUFNLCBXUk9OR19UWVBFLCAoTlVMTCksCisgICAgICAgICAgICAoIm5vdCBhIGZseCBmaWxlICh0eXBlICV4KSIsIGZseGgtPnR5cGUpKTsKKyAgICAgICAgZ290byB1bm1hcF9pbnB1dF9lcnJvcjsKKyAgICAgIH0KKworICAgICAgR1NUX0lORk9fT0JKRUNUIChmbHhkZWMsICJzaXplICAgICAgOiAgJWQiLCBmbHhoLT5zaXplKTsKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoZmx4ZGVjLCAiZnJhbWVzICAgIDogICVkIiwgZmx4aC0+ZnJhbWVzKTsKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoZmx4ZGVjLCAid2lkdGggICAgIDogICVkIiwgZmx4aC0+d2lkdGgpOworICAgICAgR1NUX0lORk9fT0JKRUNUIChmbHhkZWMsICJoZWlnaHQgICAgOiAgJWQiLCBmbHhoLT5oZWlnaHQpOworICAgICAgR1NUX0lORk9fT0JKRUNUIChmbHhkZWMsICJkZXB0aCAgICAgOiAgJWQiLCBmbHhoLT5kZXB0aCk7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGZseGRlYywgInNwZWVkICAgICA6ICAlZCIsIGZseGgtPnNwZWVkKTsKKworICAgICAgZmx4ZGVjLT5uZXh0X3RpbWUgPSAwOworCisgICAgICBpZiAoZmx4aC0+dHlwZSA9PSBGTFhfTUFHSUNIRFJfRkxJKSB7CisgICAgICAgIGZseGRlYy0+ZnJhbWVfdGltZSA9IEpJRkZJRSAqIGZseGgtPnNwZWVkOworICAgICAgfSBlbHNlIGlmIChmbHhoLT5zcGVlZCA9PSAwKSB7CisgICAgICAgIGZseGRlYy0+ZnJhbWVfdGltZSA9IEdTVF9TRUNPTkQgLyA3MDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZseGRlYy0+ZnJhbWVfdGltZSA9IGZseGgtPnNwZWVkICogR1NUX01TRUNPTkQ7CisgICAgICB9CisKKyAgICAgIGZseGRlYy0+ZHVyYXRpb24gPSBmbHhoLT5mcmFtZXMgKiBmbHhkZWMtPmZyYW1lX3RpbWU7CisgICAgICBHU1RfTE9HICgiZHVyYXRpb24gICA6ICAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZmx4ZGVjLT5kdXJhdGlvbikpOworCisgICAgICB0ZW1wbCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChmbHhkZWMtPnNyY3BhZCk7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfY29weSAodGVtcGwpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKHRlbXBsKTsKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsCisgICAgICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgZmx4aC0+d2lkdGgsCisgICAgICAgICAgImhlaWdodCIsIEdfVFlQRV9JTlQsIGZseGgtPmhlaWdodCwKKyAgICAgICAgICAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT04sIChnaW50KSBHU1RfTVNFQ09ORCwKKyAgICAgICAgICAoZ2ludCkgZmx4ZGVjLT5mcmFtZV90aW1lIC8gMTAwMCwgTlVMTCk7CisKKyAgICAgIGdzdF9wYWRfc2V0X2NhcHMgKGZseGRlYy0+c3JjcGFkLCBjYXBzKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAgICAgaWYgKGZseGRlYy0+bmVlZF9zZWdtZW50KSB7CisgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoZmx4ZGVjLT5zcmNwYWQsCisgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZmbHhkZWMtPnNlZ21lbnQpKTsKKyAgICAgICAgZmx4ZGVjLT5uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKyAgICAgIH0KKworICAgICAgLyogemVybyBtZWFucyA4ICovCisgICAgICBpZiAoZmx4aC0+ZGVwdGggPT0gMCkKKyAgICAgICAgZmx4aC0+ZGVwdGggPSA4OworCisgICAgICBpZiAoZmx4aC0+ZGVwdGggIT0gOCkgeworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZmx4ZGVjLCBTVFJFQU0sIFdST05HX1RZUEUsCisgICAgICAgICAgICAoIiVzIiwgIkRvbid0IGtub3cgaG93IHRvIGRlY29kZSBub24gOCBiaXQgZGVwdGggc3RyZWFtcyIpLCAoTlVMTCkpOworICAgICAgICBnb3RvIHVubWFwX2lucHV0X2Vycm9yOworICAgICAgfQorCisgICAgICBmbHhkZWMtPmNvbnZlcnRlciA9CisgICAgICAgICAgZmx4X2NvbG9yc3BhY2VfY29udmVydGVyX25ldyAoZmx4aC0+d2lkdGgsIGZseGgtPmhlaWdodCk7CisKKyAgICAgIGlmIChmbHhoLT50eXBlID09IEZMWF9NQUdJQ0hEUl9GTEMgfHwgZmx4aC0+dHlwZSA9PSBGTFhfTUFHSUNIRFJfRkxYKSB7CisgICAgICAgIEdTVF9JTkZPX09CSkVDVCAoZmx4ZGVjLCAiKEZMQykgYXNwZWN0X2R4IDogICVkIiwgZmx4aC0+YXNwZWN0X2R4KTsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChmbHhkZWMsICIoRkxDKSBhc3BlY3RfZHkgOiAgJWQiLCBmbHhoLT5hc3BlY3RfZHkpOworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKGZseGRlYywgIihGTEMpIG9mcmFtZTEgICA6ICAweCUwOHgiLCBmbHhoLT5vZnJhbWUxKTsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChmbHhkZWMsICIoRkxDKSBvZnJhbWUyICAgOiAgMHglMDh4IiwgZmx4aC0+b2ZyYW1lMik7CisgICAgICB9CisKKyAgICAgIGZseGRlYy0+c2l6ZSA9ICgoZ3VpbnQpIGZseGgtPndpZHRoICogKGd1aW50KSBmbHhoLT5oZWlnaHQpOworICAgICAgaWYgKGZseGRlYy0+c2l6ZSA+PSBHX01BWFNJWkUgLyA0KSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChmbHhkZWMsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAgICAgKCIlcyIsICJDYW5ub3QgYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5IiksIChOVUxMKSk7CisgICAgICAgIGdvdG8gdW5tYXBfaW5wdXRfZXJyb3I7CisgICAgICB9CisKKyAgICAgIC8qIGNyZWF0ZSBkZWx0YSBhbmQgb3V0cHV0IGZyYW1lICovCisgICAgICBmbHhkZWMtPmZyYW1lX2RhdGEgPSBnX21hbGxvYzAgKGZseGRlYy0+c2l6ZSk7CisgICAgICBmbHhkZWMtPmRlbHRhX2RhdGEgPSBnX21hbGxvYzAgKGZseGRlYy0+c2l6ZSk7CisKKyAgICAgIGZseGRlYy0+c3RhdGUgPSBHU1RfRkxYREVDX1BMQVlJTkc7CisgICAgfQorICB9IGVsc2UgaWYgKGZseGRlYy0+c3RhdGUgPT0gR1NUX0ZMWERFQ19QTEFZSU5HKSB7CisgICAgR3N0QnVmZmVyICpvdXQ7CisKKyAgICAvKiB3aGlsZSB3ZSBoYXZlIGVub3VnaCBkYXRhIGluIHRoZSBhZGFwdGVyICovCisgICAgd2hpbGUgKGF2YWlsYWJsZSA+PSBGbHhGcmFtZUNodW5rU2l6ZSAmJiByZXMgPT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgIGd1aW50MzIgc2l6ZTsKKyAgICAgIGd1aW50MTYgdHlwZTsKKworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9sZSAoJnJlYWRlciwgJnNpemUpKQorICAgICAgICBnb3RvIHBhcnNlX2Vycm9yOworICAgICAgaWYgKGF2YWlsYWJsZSA8IHNpemUpCisgICAgICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisKKyAgICAgIGF2YWlsYWJsZSAtPSBzaXplOworICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGZseGRlYy0+YWRhcHRlciwgc2l6ZSk7CisKKyAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKCZyZWFkZXIsICZ0eXBlKSkKKyAgICAgICAgZ290byBwYXJzZV9lcnJvcjsKKworICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgRkxYX0ZSQU1FX1RZUEU6eworICAgICAgICAgIEdzdEJ5dGVSZWFkZXIgY2h1bmtzOworICAgICAgICAgIEdzdEJ5dGVXcml0ZXIgd3JpdGVyOworICAgICAgICAgIGd1aW50MTYgbl9jaHVua3M7CisgICAgICAgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAoZmx4ZGVjLCAiSGF2ZSBmcmFtZSB0eXBlIDB4JTAyeCBvZiBzaXplICVkIiwgdHlwZSwKKyAgICAgICAgICAgICAgc2l6ZSk7CisKKyAgICAgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfc3ViX3JlYWRlciAoJnJlYWRlciwgJmNodW5rcywKKyAgICAgICAgICAgICAgICAgIHNpemUgLSBGbHhGcmFtZUNodW5rU2l6ZSkpCisgICAgICAgICAgICBnb3RvIHBhcnNlX2Vycm9yOworCisgICAgICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAoJmNodW5rcywgJm5fY2h1bmtzKSkKKyAgICAgICAgICAgIGdvdG8gcGFyc2VfZXJyb3I7CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGZseGRlYywgIkhhdmUgJWQgY2h1bmtzIiwgbl9jaHVua3MpOworCisgICAgICAgICAgaWYgKG5fY2h1bmtzID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmY2h1bmtzLCA4KSkgICAgICAgLyogcmVzZXJ2ZWQgKi8KKyAgICAgICAgICAgIGdvdG8gcGFyc2VfZXJyb3I7CisKKyAgICAgICAgICBnc3RfYnl0ZV93cml0ZXJfaW5pdF93aXRoX2RhdGEgKCZ3cml0ZXIsIGZseGRlYy0+ZnJhbWVfZGF0YSwKKyAgICAgICAgICAgICAgZmx4ZGVjLT5zaXplLCBUUlVFKTsKKworICAgICAgICAgIC8qIGRlY29kZSBjaHVua3MgKi8KKyAgICAgICAgICBpZiAoIWZseF9kZWNvZGVfY2h1bmtzIChmbHhkZWMsIG5fY2h1bmtzLCAmY2h1bmtzLCAmd3JpdGVyKSkgeworICAgICAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGZseGRlYywgU1RSRUFNLCBERUNPREUsCisgICAgICAgICAgICAgICAgKCIlcyIsICJDb3VsZCBub3QgZGVjb2RlIGNodW5rIiksIE5VTEwpOworICAgICAgICAgICAgZ290byB1bm1hcF9pbnB1dF9lcnJvcjsKKyAgICAgICAgICB9CisgICAgICAgICAgZ3N0X2J5dGVfd3JpdGVyX3Jlc2V0ICgmd3JpdGVyKTsKKworICAgICAgICAgIC8qIHNhdmUgY29weSBvZiB0aGUgY3VycmVudCBmcmFtZSBmb3IgcG9zc2libGUgZGVsdGEuICovCisgICAgICAgICAgbWVtY3B5IChmbHhkZWMtPmRlbHRhX2RhdGEsIGZseGRlYy0+ZnJhbWVfZGF0YSwgZmx4ZGVjLT5zaXplKTsKKworICAgICAgICAgIG91dCA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoZmx4ZGVjLT5zaXplICogNCk7CisgICAgICAgICAgaWYgKCFnc3RfYnVmZmVyX21hcCAob3V0LCAmbWFwLCBHU1RfTUFQX1dSSVRFKSkgeworICAgICAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGZseGRlYywgU1RSRUFNLCBERUNPREUsCisgICAgICAgICAgICAgICAgKCIlcyIsICJDb3VsZCBub3QgbWFwIG91dHB1dCBidWZmZXIiKSwgTlVMTCk7CisgICAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChvdXQpOworICAgICAgICAgICAgZ290byB1bm1hcF9pbnB1dF9lcnJvcjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBjb252ZXJ0IGN1cnJlbnQgZnJhbWUuICovCisgICAgICAgICAgZmx4X2NvbG9yc3BhY2VfY29udmVydCAoZmx4ZGVjLT5jb252ZXJ0ZXIsIGZseGRlYy0+ZnJhbWVfZGF0YSwKKyAgICAgICAgICAgICAgbWFwLmRhdGEpOworICAgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dCwgJm1hcCk7CisKKyAgICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0KSA9IGZseGRlYy0+bmV4dF90aW1lOworICAgICAgICAgIGZseGRlYy0+bmV4dF90aW1lICs9IGZseGRlYy0+ZnJhbWVfdGltZTsKKworICAgICAgICAgIHJlcyA9IGdzdF9wYWRfcHVzaCAoZmx4ZGVjLT5zcmNwYWQsIG91dCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChmbHhkZWMsICJVbmtub3duIGZyYW1lIHR5cGUgMHglMDJ4LCBza2lwcGluZyAlZCIsCisgICAgICAgICAgICAgIHR5cGUsIHNpemUpOworICAgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZyZWFkZXIsIHNpemUgLSBGbHhGcmFtZUNodW5rU2l6ZSkpCisgICAgICAgICAgICBnb3RvIHBhcnNlX2Vycm9yOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCituZWVkX21vcmVfZGF0YToKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5wdXQsICZtYXBfaW5mbyk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGlucHV0KTsKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK3BhcnNlX2Vycm9yOgorICBHU1RfRUxFTUVOVF9FUlJPUiAoZmx4ZGVjLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICgiJXMiLCAiRmFpbGVkIHRvIHBhcnNlIHN0cmVhbSIpLCAoTlVMTCkpOwordW5tYXBfaW5wdXRfZXJyb3I6CisgIGdzdF9idWZmZXJfdW5tYXAgKGlucHV0LCAmbWFwX2luZm8pOworZXJyb3I6CisgIGdzdF9idWZmZXJfdW5yZWYgKGlucHV0KTsKKyAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9mbHhkZWNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0Rmx4RGVjICpmbHhkZWM7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBmbHhkZWMgPSBHU1RfRkxYREVDIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfYWRhcHRlcl9jbGVhciAoZmx4ZGVjLT5hZGFwdGVyKTsKKyAgICAgIGZseGRlYy0+c3RhdGUgPSBHU1RfRkxYREVDX1JFQURfSEVBREVSOworICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJmZseGRlYy0+c2VnbWVudCwgR1NUX0ZPUk1BVF9VTkRFRklORUQpOworICAgICAgZmx4ZGVjLT5uZWVkX3NlZ21lbnQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19QTEFZSU5HOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGlmIChmbHhkZWMtPmZyYW1lX2RhdGEpIHsKKyAgICAgICAgZ19mcmVlIChmbHhkZWMtPmZyYW1lX2RhdGEpOworICAgICAgICBmbHhkZWMtPmZyYW1lX2RhdGEgPSBOVUxMOworICAgICAgfQorICAgICAgaWYgKGZseGRlYy0+ZGVsdGFfZGF0YSkgeworICAgICAgICBnX2ZyZWUgKGZseGRlYy0+ZGVsdGFfZGF0YSk7CisgICAgICAgIGZseGRlYy0+ZGVsdGFfZGF0YSA9IE5VTEw7CisgICAgICB9CisgICAgICBpZiAoZmx4ZGVjLT5jb252ZXJ0ZXIpIHsKKyAgICAgICAgZmx4X2NvbG9yc3BhY2VfY29udmVydGVyX2Rlc3Ryb3kgKGZseGRlYy0+Y29udmVydGVyKTsKKyAgICAgICAgZmx4ZGVjLT5jb252ZXJ0ZXIgPSBOVUxMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImZseGRlYyIsCisgICAgICBHU1RfUkFOS19QUklNQVJZLCBHU1RfVFlQRV9GTFhERUMpOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgZmx4ZGVjLAorICAgICJGTEMvRkxJL0ZMWCB2aWRlbyBkZWNvZGVyIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC9mbHgvZ3N0Zmx4ZGVjLmggYi9nc3QvZmx4L2dzdGZseGRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NDg2YTAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZmx4L2dzdGZseGRlYy5oCkBAIC0wLDAgKzEsODcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0ZMWF9ERUNPREVSX0hfXworI2RlZmluZSBfX0dTVF9GTFhfREVDT0RFUl9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RieXRlcmVhZGVyLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXdyaXRlci5oPgorI2luY2x1ZGUgImZseF9jb2xvci5oIgorCitHX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgZW51bSB7CisgIEdTVF9GTFhERUNfUkVBRF9IRUFERVIsCisgIEdTVF9GTFhERUNfUExBWUlORywKK30gR3N0Rmx4RGVjU3RhdGU7CisJCisKKy8qIERlZmluaXRpb24gb2Ygc3RydWN0dXJlIHN0b3JpbmcgZGF0YSBmb3IgdGhpcyBlbGVtZW50LiAqLwordHlwZWRlZiBzdHJ1Y3QgX0dzdEZseERlYyAgR3N0Rmx4RGVjOworCitzdHJ1Y3QgX0dzdEZseERlYyB7CisgIEdzdEVsZW1lbnQgZWxlbWVudDsKKworICBHc3RQYWQgKnNpbmtwYWQsICpzcmNwYWQ7CisKKyAgR3N0U2VnbWVudCBzZWdtZW50OworICBnYm9vbGVhbiBuZWVkX3NlZ21lbnQ7CisKKyAgZ2Jvb2xlYW4gYWN0aXZlLCBuZXdfbWV0YTsKKworICBndWludDggKmRlbHRhX2RhdGEsICpmcmFtZV9kYXRhOworICBHc3RBZGFwdGVyICphZGFwdGVyOworICBnc2l6ZSBzaXplOworICBHc3RGbHhEZWNTdGF0ZSBzdGF0ZTsKKyAgZ2ludDY0IGZyYW1lX3RpbWU7CisgIGdpbnQ2NCBuZXh0X3RpbWU7CisgIGdpbnQ2NCBkdXJhdGlvbjsKKworICBGbHhDb2xvclNwYWNlQ29udmVydGVyICpjb252ZXJ0ZXI7CisKKyAgRmx4SGVhZGVyIGhkcjsKK307CisKKy8qIFN0YW5kYXJkIGRlZmluaXRpb24gZGVmaW5pbmcgYSBjbGFzcyBmb3IgdGhpcyBlbGVtZW50LiAqLwordHlwZWRlZiBzdHJ1Y3QgX0dzdEZseERlY0NsYXNzIEdzdEZseERlY0NsYXNzOworc3RydWN0IF9Hc3RGbHhEZWNDbGFzcyB7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCisvKiBTdGFuZGFyZCBtYWNyb3MgZm9yIGRlZmluaW5nIHR5cGVzIGZvciB0aGlzIGVsZW1lbnQuICAqLworI2RlZmluZSBHU1RfVFlQRV9GTFhERUMgXAorICAoZ3N0X2ZseGRlY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfRkxYREVDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfRkxYREVDLEdzdEZseERlYykpCisjZGVmaW5lIEdTVF9GTFhERUNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfRkxYREVDLEdzdEZseERlY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0ZMWERFQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0ZMWERFQykpCisjZGVmaW5lIEdTVF9JU19GTFhERUNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfRkxYREVDKSkKKworLyogU3RhbmRhcmQgZnVuY3Rpb24gcmV0dXJuaW5nIHR5cGUgaW5mb3JtYXRpb24uICovCitHVHlwZSBnc3RfZmx4ZGVjX2dldF90eXBlKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfRkxYX0RFQ09ERVJfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZmx4L21lc29uLmJ1aWxkIGIvZ3N0L2ZseC9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjdjOWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2ZseC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDggQEAKK2ZseGRlYyA9IGxpYnJhcnkoJ2dzdGZseGRlYycsCisgICdnc3RmbHhkZWMuYycsICdmbHhfY29sb3IuYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0YmFzZV9kZXAsIGdzdHZpZGVvX2RlcCwgZ3N0X2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvZ29vbS8uZ2l0aWdub3JlIGIvZ3N0L2dvb20vLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjA5MDUwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vLmdpdGlnbm9yZQpAQCAtMCwwICsxLDExIEBACitNYWtlZmlsZQorTWFrZWZpbGUuaW4KKyoubworKi5sbworKi5sYQorLmRlcHMKKy5saWJzCitnb29tc2xfbGV4LmMKK2dvb21zbF95YWNjLmMKK2dvb21zbF95YWNjLmgKKwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vTWFrZWZpbGUuYW0gYi9nc3QvZ29vbS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzAxYjEwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NiBAQAorCitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3Rnb29tLmxhCisKK1BQQ19GSUxFUz1wcGNfem9vbV91bHRpbWF0ZS5zIHBwY19kcmF3aW5ncy5zIHBwY19kcmF3aW5ncy5oIHBwY196b29tX3VsdGltYXRlLmgKK01NWF9GSUxFUz1tbXguYyB4bW14LmMgbW14LmggeG1teC5oCisKK2lmIEhBVkVfQ1BVX1BQQworIyBkaXNhYmxlIHVudGlsIHNvbWVvbmUgZmlndXJlcyBvdXQgaG93IHRvIGJ1aWxkIHRoZXNlIGNvcnJlY3RseSBvbiBwcGMKKyNBUkNIX0ZJTEVTID0gJChQUENfRklMRVMpCitBUkNIX0ZJTEVTID0KK2VuZGlmCitpZiBIQVZFX0NQVV9QUEM2NAorIyBkaXNhYmxlIHVudGlsIHNvbWVvbmUgZmlndXJlcyBvdXQgaG93IHRvIGJ1aWxkIHRoZXNlIGNvcnJlY3RseSBvbiBwcGMKKyNBUkNIX0ZJTEVTID0gJChQUENfRklMRVMpCitBUkNIX0ZJTEVTID0KK2VuZGlmCitpZiBIQVZFX0NQVV9JMzg2CitBUkNIX0ZJTEVTID0gJChNTVhfRklMRVMpCitBUkNIX0NGTEFHUyA9IC1EQlVJTERfTU1YCitlbmRpZgorCQkJCQorbGliZ3N0Z29vbV9sYV9TT1VSQ0VTID0JCQkJCQlcCisJZ3N0Z29vbS5jIGdzdGdvb20uaAkJCQkJXAorCWRyYXdtZXRob2RzLmMgZHJhd21ldGhvZHMuaAkJCQlcCisJc291bmRfdGVzdGVyLmMgc291bmRfdGVzdGVyLmgJCQkJXAorCW1hdGh0b29scy5jIG1hdGh0b29scy5oCQkJCQlcCisJbGluZXMuYyBsaW5lcy5oIGlmcy5jIGlmcy5oIHN1cmYzZC5jIHN1cmYzZC5oCQlcCisJdGVudGFjbGUzZC5jIHRlbnRhY2xlM2QuaCB2M2QuYyB2M2QuaAkJCVwKKwljb252b2x2ZV9meC5jIGZseWluZ19zdGFyc19meC5jCQkJCVwKKwlnb29tX2Z4LmggZ29vbV92aXN1YWxfZnguaAkJCQlcCisJbW90aWZfZ29vbTEuaCBtb3RpZl9nb29tMi5oCQkJCVwKKwlwbHVnaW5faW5mby5jIGdvb21fcGx1Z2luX2luZm8uaAkJCVwKKwlnb29tX3Rvb2xzLmMJCQkJCQlcCisJY29uZmlnX3BhcmFtLmMgZmlsdGVycy5jIGdvb21fY29yZS5jIGdyYXBoaWMuYwkJXAorCWdvb20uaCBnb29tX3R5cGVkZWZzLmggZ29vbV9ncmFwaGljLmgJCQlcCisJZ29vbV9jb25maWdfcGFyYW0uaCBnb29tX3Zpc3VhbF9meC5oIGdvb21fZmlsdGVycy5oCVwKKwlnb29tX3Rvb2xzLmggZ29vbV90b29scy5oIGdvb21fY29uZmlnLmgJCQlcCisJJChBUkNIX0ZJTEVTKQorCitsaWJnc3Rnb29tX2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpICQoR09PTV9GSUxURVJfQ0ZMQUdTKSAkKEFSQ0hfQ0ZMQUdTKSAkKE9SQ19DRkxBR1MpCitsaWJnc3Rnb29tX2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHBidXRpbHMtJChHU1RfQVBJX1ZFUlNJT04pICQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykgJChMSUJNKSAkKE9SQ19MSUJTKQorbGliZ3N0Z29vbV9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK0VYVFJBX0RJU1QgPSAkKFBQQ19GSUxFUykgJChNTVhfRklMRVMpCisKKy5OT1RQQVJBTExFTDoKZGlmZiAtLWdpdCBhL2dzdC9nb29tL1JFQURNRSBiL2dzdC9nb29tL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGFmMmJhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vUkVBRE1FCkBAIC0wLDAgKzEsMTMgQEAKK1RoZSBHb29tIHBsdWdpbiBpcyBiYXNlZCBvbiB0aGUgR29vbSB2aXN1YWxpemF0aW9uIGNvZGUgZnJvbQordGhlIEdvb20gaG9tZXBhZ2UgZm91bmQgYXQ6IAoraHR0cDovL2lvcy5mcmVlLmZyLz9wYWdlPXByb2pldCZxdW9pPTEgCisKK0xpa2UgdGhlIG9yaWdpbmFsIGxpYnJhcnkgc28gaXMgdGhlIEdvb20gcGx1Z2luIGF2YWlsYWJsZSB1bmRlciB0aGUgTEdQTCBsaWNlbnNlCisKK1RoaXMgaXMgYmFzZWQgb24gZ29vbTJrNCB3aXRoIGNoYW5nZXMgdG8gcGx1Z2luX2luZm8uYyBhbmQgbW14LmggdG8gdXNlIE9yYyBmb3IgQ1BVCitkZXRlY3Rpb24gYW5kIEdTdHJlYW1lci1zcGVjaWZpYyBpZmRlZidzIGZvciBhcmNoaXRlY3R1cmUgZGV0ZWN0aW9uLgorCitUaGVzZSBmaWxlcyBhcmUgbm90IGluIHVzZSByaWdodCBub3c6CitmaWx0ZXJzX21teC5zCitnb29tc2wqCitzdXJmM2QucwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vY29uZmlnX3BhcmFtLmMgYi9nc3QvZ29vbS9jb25maWdfcGFyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTEyNzdmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vY29uZmlnX3BhcmFtLmMKQEAgLTAsMCArMSwxNDIgQEAKKy8qIEdvb20gUHJvamVjdAorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gSmVhbi1DaHJpc3RvcGhlIEhvZWx0IDxqZWtvQGZyZWUuZnI+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImdvb21fY29uZmlnX3BhcmFtLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyB2b2lkCitlbXB0eV9mY3QgKFBsdWdpblBhcmFtICogZHVtbXkpCit7Cit9CisKK3ZvaWQKK2dvb21fc2VjdXJlX3BhcmFtIChQbHVnaW5QYXJhbSAqIHApCit7CisgIHAtPmNoYW5nZWQgPSBlbXB0eV9mY3Q7CisgIHAtPmNoYW5nZV9saXN0ZW5lciA9IGVtcHR5X2ZjdDsKKyAgcC0+dXNlcl9kYXRhID0gMDsKKyAgcC0+bmFtZSA9IHAtPmRlc2MgPSAwOworICBwLT5ydyA9IDE7Cit9CisKK3ZvaWQKK2dvb21fc2VjdXJlX2ZfcGFyYW0gKFBsdWdpblBhcmFtICogcCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgc2VjdXJlX3BhcmFtIChwKTsKKworICBwLT5uYW1lID0gbmFtZTsKKyAgcC0+dHlwZSA9IFBBUkFNX0ZMT0FUVkFMOworICBGVkFMICgqcCkgPSAwLjVmOworICBGTUlOICgqcCkgPSAwLjBmOworICBGTUFYICgqcCkgPSAxLjBmOworICBGU1RFUCAoKnApID0gMC4wMWY7Cit9CisKK3ZvaWQKK2dvb21fc2VjdXJlX2ZfZmVlZGJhY2sgKFBsdWdpblBhcmFtICogcCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgc2VjdXJlX2ZfcGFyYW0gKHAsIG5hbWUpOworCisgIHAtPnJ3ID0gMDsKK30KKwordm9pZAorZ29vbV9zZWN1cmVfc19wYXJhbSAoUGx1Z2luUGFyYW0gKiBwLCBjb25zdCBjaGFyICpuYW1lKQoreworICBzZWN1cmVfcGFyYW0gKHApOworCisgIHAtPm5hbWUgPSBuYW1lOworICBwLT50eXBlID0gUEFSQU1fU1RSVkFMOworICBTVkFMICgqcCkgPSAwOworfQorCit2b2lkCitnb29tX3NlY3VyZV9iX3BhcmFtIChQbHVnaW5QYXJhbSAqIHAsIGNvbnN0IGNoYXIgKm5hbWUsIGludCB2YWx1ZSkKK3sKKyAgc2VjdXJlX3BhcmFtIChwKTsKKworICBwLT5uYW1lID0gbmFtZTsKKyAgcC0+dHlwZSA9IFBBUkFNX0JPT0xWQUw7CisgIEJWQUwgKCpwKSA9IHZhbHVlOworfQorCit2b2lkCitnb29tX3NlY3VyZV9pX3BhcmFtIChQbHVnaW5QYXJhbSAqIHAsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIHNlY3VyZV9wYXJhbSAocCk7CisKKyAgcC0+bmFtZSA9IG5hbWU7CisgIHAtPnR5cGUgPSBQQVJBTV9JTlRWQUw7CisgIElWQUwgKCpwKSA9IDUwOworICBJTUlOICgqcCkgPSAwOworICBJTUFYICgqcCkgPSAxMDA7CisgIElTVEVQICgqcCkgPSAxOworfQorCit2b2lkCitnb29tX3NlY3VyZV9pX2ZlZWRiYWNrIChQbHVnaW5QYXJhbSAqIHAsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIHNlY3VyZV9pX3BhcmFtIChwLCBuYW1lKTsKKworICBwLT5ydyA9IDA7Cit9CisKK3ZvaWQKK2dvb21fcGx1Z2luX3BhcmFtZXRlcnMgKFBsdWdpblBhcmFtZXRlcnMgKiBwLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmIpCit7CisgIHAtPm5hbWUgPSBuYW1lOworICBwLT5kZXNjID0gIiI7CisgIHAtPm5iUGFyYW1zID0gbmI7CisgIHAtPnBhcmFtcyA9IG1hbGxvYyAobmIgKiBzaXplb2YgKFBsdWdpblBhcmFtICopKTsKK30KKwordm9pZAorZ29vbV9wbHVnaW5fcGFyYW1ldGVyc19mcmVlIChQbHVnaW5QYXJhbWV0ZXJzICogcCkKK3sKKyAgZnJlZSAocC0+cGFyYW1zKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkCitnb29tX3NldF9zdHJfcGFyYW1fdmFsdWUgKFBsdWdpblBhcmFtICogcCwgY29uc3QgY2hhciAqc3RyKQoreworICBpbnQgbGVuID0gc3RybGVuIChzdHIpOworCisgIGlmIChTVkFMICgqcCkpCisgICAgU1ZBTCAoKnApID0gKGNoYXIgKikgcmVhbGxvYyAoU1ZBTCAoKnApLCBsZW4gKyAxKTsKKyAgZWxzZQorICAgIFNWQUwgKCpwKSA9IChjaGFyICopIG1hbGxvYyAobGVuICsgMSk7CisgIG1lbWNweSAoU1ZBTCAoKnApLCBzdHIsIGxlbiArIDEpOworfQorCit2b2lkCitnb29tX3NldF9saXN0X3BhcmFtX3ZhbHVlIChQbHVnaW5QYXJhbSAqIHAsIGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgaW50IGxlbiA9IHN0cmxlbiAoc3RyKTsKKworI2lmZGVmIFZFUkJPU0UKKyAgcHJpbnRmICgiJXM6ICVkXG4iLCBzdHIsIGxlbik7CisjZW5kaWYKKyAgaWYgKExWQUwgKCpwKSkKKyAgICBMVkFMICgqcCkgPSAoY2hhciAqKSByZWFsbG9jIChMVkFMICgqcCksIGxlbiArIDEpOworICBlbHNlCisgICAgTFZBTCAoKnApID0gKGNoYXIgKikgbWFsbG9jIChsZW4gKyAxKTsKKyAgbWVtY3B5IChMVkFMICgqcCksIHN0ciwgbGVuICsgMSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvZ29vbS9jb252b2x2ZV9meC5jIGIvZ3N0L2dvb20vY29udm9sdmVfZnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODBlMTEzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vY29udm9sdmVfZnguYwpAQCAtMCwwICsxLDM2OCBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgImdvb21fZnguaCIKKyNpbmNsdWRlICJnb29tX3BsdWdpbl9pbmZvLmgiCisjaW5jbHVkZSAiZ29vbV9jb25maWcuaCIKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLy8jZGVmaW5lIENPTlZfTU9USUZfVyAzMgorLy8jZGVmaW5lIENPTlZfTU9USUZfV01BU0sgMHgxZgorCisvKiBEZWZpbmUgaWYgeW91IGxpa2UgdGhlIHdhY2t5IEdPT00gbG9nbzogKi8KKyN1bmRlZiBEUkFXX01PVElGCisKKyNkZWZpbmUgQ09OVl9NT1RJRl9XIDEyOAorI2RlZmluZSBDT05WX01PVElGX1dNQVNLIDB4N2YKKwordHlwZWRlZiBjaGFyIE1vdGlmW0NPTlZfTU9USUZfV11bQ09OVl9NT1RJRl9XXTsKKworI2luY2x1ZGUgIm1vdGlmX2dvb20xLmgiCisjaW5jbHVkZSAibW90aWZfZ29vbTIuaCIKKworI2RlZmluZSBOQl9USEVUQSA1MTIKKwordHlwZWRlZiBzdHJ1Y3QgX0NPTlZfREFUQQoreworICBQbHVnaW5QYXJhbSBsaWdodDsKKyAgUGx1Z2luUGFyYW0gZmFjdG9yX2Fkal9wOworICBQbHVnaW5QYXJhbSBmYWN0b3JfcDsKKyAgUGx1Z2luUGFyYW1ldGVycyBwYXJhbXM7CisKKyAgLyogcm90b3pvb20gKi8KKyAgaW50IHRoZXRhOworICBmbG9hdCBmdGhldGE7CisgIGludCBoX3NpbltOQl9USEVUQV07CisgIGludCBoX2Nvc1tOQl9USEVUQV07CisgIGludCBoX2hlaWdodDsKKyAgZmxvYXQgdmlzaWJpbGl0eTsKKyAgTW90aWYgY29udl9tb3RpZjsKKyAgaW50IGludmVyc2VfbW90aWY7CisKK30gQ29udkRhdGE7CisKKy8qIGluaXQgcm90b3pvb20gdGFibGVzICovCitzdGF0aWMgdm9pZAorY29tcHV0ZV90YWJsZXMgKFZpc3VhbEZYICogX3RoaXMsIFBsdWdpbkluZm8gKiBpbmZvKQoreworICBDb252RGF0YSAqZGF0YSA9IChDb252RGF0YSAqKSBfdGhpcy0+ZnhfZGF0YTsKKyAgZG91YmxlIHNjcmVlbl9jb2VmOworICBpbnQgaTsKKyAgZG91YmxlIGg7CisgIGRvdWJsZSByYWRpYW47CisKKyAgaWYgKGRhdGEtPmhfaGVpZ2h0ID09IGluZm8tPnNjcmVlbi5oZWlnaHQpCisgICAgcmV0dXJuOworCisgIHNjcmVlbl9jb2VmID0gMi4wICogMzAwLjAgLyAoZG91YmxlKSBpbmZvLT5zY3JlZW4uaGVpZ2h0OworICBkYXRhLT5oX2hlaWdodCA9IGluZm8tPnNjcmVlbi5oZWlnaHQ7CisKKyAgZm9yIChpID0gMDsgaSA8IE5CX1RIRVRBOyBpKyspIHsKKyAgICByYWRpYW4gPSAyICogaSAqIEdfUEkgLyBOQl9USEVUQTsKKyAgICBoID0gKDAuMiArIGNvcyAocmFkaWFuKSAvIDE1LjAgKiBzaW4gKHJhZGlhbiAqIDIuMCArIDEyLjEyMykpICogc2NyZWVuX2NvZWY7CisgICAgZGF0YS0+aF9jb3NbaV0gPSAweDEwMDAwICogKC1oICogY29zIChyYWRpYW4pICogY29zIChyYWRpYW4pKTsKKyAgICBkYXRhLT5oX3NpbltpXSA9IDB4MTAwMDAgKiAoaCAqIHNpbiAocmFkaWFuICsgMS41NykgKiBzaW4gKHJhZGlhbikpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfbW90aWYgKENvbnZEYXRhICogZGF0YSwgTW90aWYgbW90aWYpCit7CisgIGludCBpLCBqOworCisgIGZvciAoaSA9IDA7IGkgPCBDT05WX01PVElGX1c7ICsraSkKKyAgICBmb3IgKGogPSAwOyBqIDwgQ09OVl9NT1RJRl9XOyArK2opCisgICAgICBkYXRhLT5jb252X21vdGlmW2ldW2pdID0KKyAgICAgICAgICBtb3RpZltDT05WX01PVElGX1cgLSBpIC0gMV1bQ09OVl9NT1RJRl9XIC0gaiAtIDFdOworfQorCitzdGF0aWMgdm9pZAorY29udm9sdmVfaW5pdCAoVmlzdWFsRlggKiBfdGhpcywgUGx1Z2luSW5mbyAqIGluZm8pCit7CisgIENvbnZEYXRhICpkYXRhOworCisgIGRhdGEgPSAoQ29udkRhdGEgKikgbWFsbG9jIChzaXplb2YgKENvbnZEYXRhKSk7CisgIF90aGlzLT5meF9kYXRhID0gKHZvaWQgKikgZGF0YTsKKworICBzZWN1cmVfZl9wYXJhbSAoJmRhdGEtPmxpZ2h0LCAiU2NyZWVuIEJyaWdodG5lc3MiKTsKKyAgZGF0YS0+bGlnaHQucGFyYW0uZnZhbC5tYXggPSAzMDAuMGY7CisgIGRhdGEtPmxpZ2h0LnBhcmFtLmZ2YWwuc3RlcCA9IDEuMGY7CisgIGRhdGEtPmxpZ2h0LnBhcmFtLmZ2YWwudmFsdWUgPSAxMDAuMGY7CisKKyAgc2VjdXJlX2ZfcGFyYW0gKCZkYXRhLT5mYWN0b3JfYWRqX3AsICJGbGFzaCBJbnRlbnNpdHkiKTsKKyAgZGF0YS0+ZmFjdG9yX2Fkal9wLnBhcmFtLmZ2YWwubWF4ID0gMjAwLjBmOworICBkYXRhLT5mYWN0b3JfYWRqX3AucGFyYW0uZnZhbC5zdGVwID0gMS4wZjsKKyAgZGF0YS0+ZmFjdG9yX2Fkal9wLnBhcmFtLmZ2YWwudmFsdWUgPSA3MC4wZjsKKworICBzZWN1cmVfZl9mZWVkYmFjayAoJmRhdGEtPmZhY3Rvcl9wLCAiRmFjdG9yIik7CisKKyAgcGx1Z2luX3BhcmFtZXRlcnMgKCZkYXRhLT5wYXJhbXMsICJCcmlnaHQgRmxhc2giLCA1KTsKKyAgZGF0YS0+cGFyYW1zLnBhcmFtc1swXSA9ICZkYXRhLT5saWdodDsKKyAgZGF0YS0+cGFyYW1zLnBhcmFtc1sxXSA9ICZkYXRhLT5mYWN0b3JfYWRqX3A7CisgIGRhdGEtPnBhcmFtcy5wYXJhbXNbMl0gPSAwOworICBkYXRhLT5wYXJhbXMucGFyYW1zWzNdID0gJmRhdGEtPmZhY3Rvcl9wOworICBkYXRhLT5wYXJhbXMucGFyYW1zWzRdID0gMDsKKworICBkYXRhLT5oX2hlaWdodCA9IDA7CisKKyAgLyogaW5pdCByb3Rvem9vbSB0YWJsZXMgKi8KKyAgY29tcHV0ZV90YWJsZXMgKF90aGlzLCBpbmZvKTsKKyAgZGF0YS0+dGhldGEgPSAwOworICBkYXRhLT5mdGhldGEgPSAwLjA7CisgIGRhdGEtPnZpc2liaWxpdHkgPSAxLjA7CisgIHNldF9tb3RpZiAoZGF0YSwgQ09OVl9NT1RJRjIpOworICBkYXRhLT5pbnZlcnNlX21vdGlmID0gMDsKKworICBfdGhpcy0+cGFyYW1zID0gJmRhdGEtPnBhcmFtczsKK30KKworc3RhdGljIHZvaWQKK2NvbnZvbHZlX2ZyZWUgKFZpc3VhbEZYICogX3RoaXMpCit7CisgIENvbnZEYXRhICpkYXRhID0gKENvbnZEYXRhICopIF90aGlzLT5meF9kYXRhOworCisgIGdvb21fcGx1Z2luX3BhcmFtZXRlcnNfZnJlZSAoJmRhdGEtPnBhcmFtcyk7CisKKyAgZnJlZSAoX3RoaXMtPmZ4X2RhdGEpOworfQorCisjaWZkZWYgRFJBV19NT1RJRgorc3RhdGljIHZvaWQKK2NyZWF0ZV9vdXRwdXRfd2l0aF9icmlnaHRuZXNzIChWaXN1YWxGWCAqIF90aGlzLCBQaXhlbCAqIHNyYywgUGl4ZWwgKiBkZXN0LAorICAgIFBsdWdpbkluZm8gKiBpbmZvLCBpbnQgaWZmKQoreworICBDb252RGF0YSAqZGF0YSA9IChDb252RGF0YSAqKSBfdGhpcy0+ZnhfZGF0YTsKKworICBpbnQgeCwgeTsKKyAgaW50IGkgPSAwOyAgICAgICAgICAgICAgICAgICAgLy9pbmZvLT5zY3JlZW4uaGVpZ2h0ICogaW5mby0+c2NyZWVuLndpZHRoIC0gMTsKKworICBjb25zdCBpbnQgYyA9IGRhdGEtPmhfY29zW2RhdGEtPnRoZXRhXTsKKyAgY29uc3QgaW50IHMgPSBkYXRhLT5oX3NpbltkYXRhLT50aGV0YV07CisKKyAgY29uc3QgaW50IHhpID0gLShpbmZvLT5zY3JlZW4ud2lkdGggLyAyKSAqIGM7CisgIGNvbnN0IGludCB5aSA9IChpbmZvLT5zY3JlZW4ud2lkdGggLyAyKSAqIHM7CisKKyAgY29uc3QgaW50IHhqID0gLShpbmZvLT5zY3JlZW4uaGVpZ2h0IC8gMikgKiBzOworICBjb25zdCBpbnQgeWogPSAtKGluZm8tPnNjcmVlbi5oZWlnaHQgLyAyKSAqIGM7CisKKyAgaW50IHhwcmltZSA9IHhqOworICBpbnQgeXByaW1lID0geWo7CisKKyAgaW50IGlmZnRhYlsxNl07CisKKyAgaWYgKGRhdGEtPmludmVyc2VfbW90aWYpIHsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKQorICAgICAgaWZmdGFiW2ldID0gKGRvdWJsZSkgaWZmICooMS4wICsgZGF0YS0+dmlzaWJpbGl0eSAqICgxNS4wIC0gaSkgLyAxNS4wKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKQorICAgICAgaWZmdGFiW2ldID0gKGRvdWJsZSkgaWZmIC8gKDEuMCArIGRhdGEtPnZpc2liaWxpdHkgKiAoMTUuMCAtIGkpIC8gMTUuMCk7CisgIH0KKworICBmb3IgKHkgPSBpbmZvLT5zY3JlZW4uaGVpZ2h0OyB5LS07KSB7CisgICAgaW50IHh0ZXgsIHl0ZXg7CisKKyAgICB4dGV4ID0geHByaW1lICsgeGkgKyBDT05WX01PVElGX1cgKiAweDEwMDAwIC8gMjsKKyAgICB4cHJpbWUgKz0gczsKKworICAgIHl0ZXggPSB5cHJpbWUgKyB5aSArIENPTlZfTU9USUZfVyAqIDB4MTAwMDAgLyAyOworICAgIHlwcmltZSArPSBjOworCisjaWZkZWYgSEFWRV9NTVgKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIlxuXHQgcHhvciAgJSVtbTcsICAlJW1tNyIgICAgLyogbW03ID0gMCAgICovCisgICAgICAgICJcblx0IG1vdmQgJVt4dGV4XSwgICUlbW0yIiAiXG5cdCBtb3ZkICVbeXRleF0sICAlJW1tMyIgIlxuXHQgcHVucGNrbGRxICUlbW0zLCAlJW1tMiIgICAvKiBtbTIgPSBbIHl0ZXggfCB4dGV4IF0gKi8KKyAgICAgICAgIlxuXHQgbW92ZCAlW2NdLCAgICAgJSVtbTQiICJcblx0IG1vdmQgJVtzXSwgICAgICUlbW02IiAiXG5cdCBweG9yICAlJW1tNSwgICAlJW1tNSIgIlxuXHQgcHN1YmQgJSVtbTYsICAgJSVtbTUiICJcblx0IHB1bnBja2xkcSAlJW1tNSwgJSVtbTQiICAgLyogbW00ID0gWyAtcyB8IGMgXSAgICAgICovCisgICAgICAgICJcblx0IG1vdmQgJVttb3RpZl0sICUlbW02IiAgICAgLyogbW02ID0gbW90aWYgICAgICAgICAgICovCisgICAgICAgIDo6W3h0ZXhdICJnIiAoeHRleCksW3l0ZXhdICJnIiAoeXRleCkKKyAgICAgICAgLFtjXSAiZyIgKGMpLFtzXSAiZyIgKHMpCisgICAgICAgICxbbW90aWZdICJnIiAoJmRhdGEtPmNvbnZfbW90aWZbMF1bMF0pKTsKKworICAgIGZvciAoeCA9IGluZm8tPnNjcmVlbi53aWR0aDsgeC0tOykgeworICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJcblx0IG1vdmQgICVbc3JjXSwgJSVtbTAiICAvKiBtbTAgPSBzcmMgKi8KKyAgICAgICAgICAiXG5cdCBwYWRkZCAlJW1tNCwgJSVtbTIiICAgICAvKiBbIHl0ZXggfCB4dGV4IF0gKz0gWyAtcyB8IHMgXSAqLworICAgICAgICAgICJcblx0IG1vdmQgICUlZXNpLCAlJW1tNSIgICAgIC8qIHNhdmUgZXNpIGludG8gbW01ICovCisgICAgICAgICAgIlxuXHQgbW92cSAgJSVtbTIsICUlbW0zIiAiXG5cdCBwc3JsZCAgJDE2LCAgJSVtbTMiICAgLyogbW0zID0gWyAoeXRleD4+MTYpIHwgKHh0ZXg+PjE2KSBdICovCisgICAgICAgICAgIlxuXHQgbW92ZCAgJSVtbTMsICUlZWF4IiAgICAgLyogZWF4ID0geHRleCcgKi8KKyAgICAgICAgICAiXG5cdCBwc3JscSAkMjUsICAgJSVtbTMiICJcblx0IG1vdmQgICUlbW0zLCAlJWVjeCIgICAvKiBlY3ggPSB5dGV4JyA8PCA3ICovCisgICAgICAgICAgIlxuXHQgYW5kbCAgJDEyNywgJSVlYXgiICJcblx0IGFuZGwgICQxNjI1NiwgJSVlY3giICJcblx0IGFkZGwgICUlZWN4LCAlJWVheCIgIlxuXHQgbW92ZCAgJSVtbTYsICUlZXNpIiAgICAgICAvKiBlc2kgPSBtb3RpZiAqLworICAgICAgICAgICJcblx0IHhvcmwgICUlZWN4LCAlJWVjeCIgIlxuXHQgbW92YiAgKCUlZWF4LCUlZXNpKSwgJSVjbCIgIlxuXHQgbW92bCAgJVtpZmZ0YWJdLCAlJWVheCIgIlxuXHQgbW92ZCAgJSVtbTUsICUlZXNpIiAgICAvKiByZXN0b3JlIGVzaSBmcm9tIG1tNSAqLworICAgICAgICAgICJcblx0IG1vdmQgICglJWVheCwlJWVjeCw0KSwgJSVtbTEiICAgLyogbW0xID0gWzB8MHwwfGlmZjJdICovCisgICAgICAgICAgIlxuXHQgcHVucGNrbHdkICUlbW0xLCAlJW1tMSIKKyAgICAgICAgICAiXG5cdCBwdW5wY2tsYncgJSVtbTcsICUlbW0wIgorICAgICAgICAgICJcblx0IHB1bnBja2xkcSAlJW1tMSwgJSVtbTEiCisgICAgICAgICAgIlxuXHQgcHNybHcgICAgICQxLCAgICAlJW1tMCIKKyAgICAgICAgICAiXG5cdCBwc3JsdyAgICAgJDIsICAgICUlbW0xIgorICAgICAgICAgICJcblx0IHBtdWxsdyAgICAlJW1tMSwgJSVtbTAiCisgICAgICAgICAgIlxuXHQgcHNybHcgICAgICQ1LCAgICAlJW1tMCIKKyAgICAgICAgICAiXG5cdCBwYWNrdXN3YiAgJSVtbTcsICUlbW0wIgorICAgICAgICAgICJcblx0IG1vdmQgICAgICAlJW1tMCwgJVtkZXN0XSI6W2Rlc3RdICI9ZyIgKGRlc3RbaV0udmFsKQorICAgICAgICAgIDpbc3JjXSAiZyIgKHNyY1tpXS52YWwpCisgICAgICAgICAgLFtpZmZ0YWJdICJnIiAoJmlmZnRhYlswXSkKKyAgICAgICAgICA6ImVheCIsICJlY3giKTsKKworICAgICAgaSsrOworICAgIH0KKyNlbHNlCisgICAgZm9yICh4ID0gaW5mby0+c2NyZWVuLndpZHRoOyB4LS07KSB7CisKKyAgICAgIGludCBpZmYyOworICAgICAgdW5zaWduZWQgaW50IGYwLCBmMSwgZjIsIGYzOworCisgICAgICB4dGV4ICs9IGM7CisgICAgICB5dGV4IC09IHM7CisKKyAgICAgIGlmZjIgPQorICAgICAgICAgIGlmZnRhYlsoaW50KSBkYXRhLT5jb252X21vdGlmWyh5dGV4ID4+IDE2KSAmIENPTlZfTU9USUZfV01BU0tdWyh4dGV4CisgICAgICAgICAgICAgICAgICA+PiAxNikgJiBDT05WX01PVElGX1dNQVNLXV07CisKKyNkZWZpbmUgc2F0KGEpICgoYSk+MHhGRj8weEZGOihhKSkKKyAgICAgIGYwID0gc3JjW2ldLnZhbDsKKyAgICAgIGYxID0gKChmMCA+PiBSX09GRlNFVCkgJiAweEZGKSAqIGlmZjIgPj4gODsKKyAgICAgIGYyID0gKChmMCA+PiBHX09GRlNFVCkgJiAweEZGKSAqIGlmZjIgPj4gODsKKyAgICAgIGYzID0gKChmMCA+PiBCX09GRlNFVCkgJiAweEZGKSAqIGlmZjIgPj4gODsKKyAgICAgIGRlc3RbaV0udmFsID0KKyAgICAgICAgICAoc2F0IChmMSkgPDwgUl9PRkZTRVQpIHwgKHNhdCAoZjIpIDw8IEdfT0ZGU0VUKSB8IChzYXQgKGYzKSA8PAorICAgICAgICAgIEJfT0ZGU0VUKTsKKy8qCisgICAgICBmMCA9IChzcmNbaV0uY29wWzBdICogaWZmMikgPj4gODsKKyAgICAgIGYxID0gKHNyY1tpXS5jb3BbMV0gKiBpZmYyKSA+PiA4OworICAgICAgZjIgPSAoc3JjW2ldLmNvcFsyXSAqIGlmZjIpID4+IDg7CisgICAgICBmMyA9IChzcmNbaV0uY29wWzNdICogaWZmMikgPj4gODsKKworICAgICAgZGVzdFtpXS5jb3BbMF0gPSAoZjAgJiAweGZmZmZmZjAwKSA/IDB4ZmYgOiAodW5zaWduZWQgY2hhcilmMDsKKyAgICAgIGRlc3RbaV0uY29wWzFdID0gKGYxICYgMHhmZmZmZmYwMCkgPyAweGZmIDogKHVuc2lnbmVkIGNoYXIpZjE7CisgICAgICBkZXN0W2ldLmNvcFsyXSA9IChmMiAmIDB4ZmZmZmZmMDApID8gMHhmZiA6ICh1bnNpZ25lZCBjaGFyKWYyOworICAgICAgZGVzdFtpXS5jb3BbM10gPSAoZjMgJiAweGZmZmZmZjAwKSA/IDB4ZmYgOiAodW5zaWduZWQgY2hhcilmMzsKKyovCisgICAgICBpKys7CisgICAgfQorI2VuZGlmCisgIH0KKyNpZmRlZiBIQVZFX01NWAorICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIlxuXHQgZW1tcyIpOworI2VuZGlmCisKKyAgY29tcHV0ZV90YWJsZXMgKF90aGlzLCBpbmZvKTsKK30KKyNlbmRpZgorCisvKiNpbmNsdWRlIDxzdGRpbnQuaD4KKworc3RhdGljIHVpbnQ2NF90IEdldFRpY2soKQoreworICB1aW50NjRfdCB4OworICBhc20gdm9sYXRpbGUgKCJSRFRTQyIgOiAiPUEiICh4KSk7CisgIHJldHVybiB4OworfSovCisKKworc3RhdGljIHZvaWQKK2NvbnZvbHZlX2FwcGx5IChWaXN1YWxGWCAqIF90aGlzLCBQaXhlbCAqIHNyYywgUGl4ZWwgKiBkZXN0LCBQbHVnaW5JbmZvICogaW5mbykKK3sKKworICBDb252RGF0YSAqZGF0YSA9IChDb252RGF0YSAqKSBfdGhpcy0+ZnhfZGF0YTsKKyNpZmRlZiBEUkFXX01PVElGCisgIGZsb2F0IGZmOworICBpbnQgaWZmOworCisgIGZmID0gKEZWQUwgKGRhdGEtPmZhY3Rvcl9wKSAqIEZWQUwgKGRhdGEtPmZhY3Rvcl9hZGpfcCkgKworICAgICAgRlZBTCAoZGF0YS0+bGlnaHQpKSAvIDEwMC4wZjsKKyAgaWZmID0gKHVuc2lnbmVkIGludCkgKGZmICogMjU2KTsKKyNlbmRpZgorCisgIHsKKyAgICBkb3VibGUgZmN5Y2xlID0gKGRvdWJsZSkgaW5mby0+Y3ljbGU7CisgICAgZG91YmxlIHJvdGF0ZV9wYXJhbSwgcm90YXRlX2NvZWY7CisgICAgZmxvYXQgSU5DUkVBU0VfUkFURSA9IDEuNTsKKyAgICBmbG9hdCBERUNBWV9SQVRFID0gMC45NTU7CisKKyAgICBpZiAoRlZBTCAoaW5mby0+c291bmQubGFzdF9nb29tX3ApID4gMC44KQorICAgICAgRlZBTCAoZGF0YS0+ZmFjdG9yX3ApICs9IEZWQUwgKGluZm8tPnNvdW5kLmdvb21fcG93ZXJfcCkgKiBJTkNSRUFTRV9SQVRFOworICAgIEZWQUwgKGRhdGEtPmZhY3Rvcl9wKSAqPSBERUNBWV9SQVRFOworCisgICAgcm90YXRlX3BhcmFtID0gRlZBTCAoaW5mby0+c291bmQubGFzdF9nb29tX3ApOworICAgIGlmIChyb3RhdGVfcGFyYW0gPCAwLjApCisgICAgICByb3RhdGVfcGFyYW0gPSAwLjA7CisgICAgcm90YXRlX3BhcmFtICs9IEZWQUwgKGluZm8tPnNvdW5kLmdvb21fcG93ZXJfcCk7CisKKyAgICByb3RhdGVfY29lZiA9IDQuMCArIEZWQUwgKGluZm8tPnNvdW5kLmdvb21fcG93ZXJfcCkgKiA2LjA7CisgICAgZGF0YS0+ZnRoZXRhID0gKGRhdGEtPmZ0aGV0YSArIHJvdGF0ZV9jb2VmICogc2luIChyb3RhdGVfcGFyYW0gKiA2LjMpKTsKKyAgICBkYXRhLT50aGV0YSA9ICgodW5zaWduZWQgaW50KSBkYXRhLT5mdGhldGEpICUgTkJfVEhFVEE7CisgICAgZGF0YS0+dmlzaWJpbGl0eSA9CisgICAgICAgIChjb3MgKGZjeWNsZSAqIDAuMDAxICsgMS41KSAqIHNpbiAoZmN5Y2xlICogMC4wMDgpICsKKyAgICAgICAgY29zIChmY3ljbGUgKiAwLjAxMSArIDUuMCkgLSAwLjggKyBpbmZvLT5zb3VuZC5zcGVlZHZhcikgKiAxLjU7CisgICAgaWYgKGRhdGEtPnZpc2liaWxpdHkgPCAwLjApCisgICAgICBkYXRhLT52aXNpYmlsaXR5ID0gMC4wOworICAgIGRhdGEtPmZhY3Rvcl9wLmNoYW5nZV9saXN0ZW5lciAoJmRhdGEtPmZhY3Rvcl9wKTsKKyAgfQorCisgIGlmIChkYXRhLT52aXNpYmlsaXR5IDwgMC4wMSkgeworICAgIHN3aXRjaCAoZ29vbV9pcmFuZCAoaW5mby0+Z1JhbmRvbSwgMzAwKSkgeworICAgICAgY2FzZSAxOgorICAgICAgICBzZXRfbW90aWYgKGRhdGEsIENPTlZfTU9USUYxKTsKKyAgICAgICAgZGF0YS0+aW52ZXJzZV9tb3RpZiA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBzZXRfbW90aWYgKGRhdGEsIENPTlZfTU9USUYyKTsKKyAgICAgICAgZGF0YS0+aW52ZXJzZV9tb3RpZiA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorI2lmZGVmIERSQVdfTU9USUYKKyAgaWYgKChmZiA+IDAuOThmKSAmJiAoZmYgPCAxLjAyZikpCisgICAgbWVtY3B5IChkZXN0LCBzcmMsIGluZm8tPnNjcmVlbi5zaXplICogc2l6ZW9mIChQaXhlbCkpOworICBlbHNlCisgICAgY3JlYXRlX291dHB1dF93aXRoX2JyaWdodG5lc3MgKF90aGlzLCBzcmMsIGRlc3QsIGluZm8sIGlmZik7CisjZWxzZQorICBtZW1jcHkgKGRlc3QsIHNyYywgaW5mby0+c2NyZWVuLnNpemUgKiBzaXplb2YgKFBpeGVsKSk7CisjZW5kaWYKKworLyoKKy8vICAgQmVuY2hpbmcgc3VpdGUuLi4KKyAgIHsKKyAgICB1aW50NjRfdCBiZWZvcmUsIGFmdGVyOworICAgIGRvdWJsZSAgIHRpbWVkOworICAgIHN0YXRpYyBkb3VibGUgc3RpbWVkID0gMTAwMDAuMDsKKyAgICBiZWZvcmUgPSBHZXRUaWNrKCk7CisgICAgZGF0YS0+dmlzaWJpbGl0eSA9IDEuMDsKKyAgICBjcmVhdGVfb3V0cHV0X3dpdGhfYnJpZ2h0bmVzcyhfdGhpcyxzcmMsZGVzdCxpbmZvLGlmZik7CisgICAgYWZ0ZXIgID0gR2V0VGljaygpOworICAgIHRpbWVkID0gKGRvdWJsZSkoKGFmdGVyLWJlZm9yZSkgLyBpbmZvLT5zY3JlZW4uc2l6ZSk7CisgICAgaWYgKHRpbWVkIDwgc3RpbWVkKSB7CisgICAgICBzdGltZWQgPSB0aW1lZDsKKyAgICAgIHByaW50ZiAoIkNMSyA9ICUzLjBmIENQUFxuIiwgc3RpbWVkKTsKKyAgICB9CisgIH0KKyovCit9CisKK3ZvaWQKK2NvbnZvbHZlX2NyZWF0ZSAoVmlzdWFsRlggKiB2ZngpCit7CisgIHZmeC0+aW5pdCA9IGNvbnZvbHZlX2luaXQ7CisgIHZmeC0+ZnJlZSA9IGNvbnZvbHZlX2ZyZWU7CisgIHZmeC0+YXBwbHkgPSBjb252b2x2ZV9hcHBseTsKKyAgdmZ4LT5meF9kYXRhID0gTlVMTDsKKyAgdmZ4LT5wYXJhbXMgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vZHJhd21ldGhvZHMuYyBiL2dzdC9nb29tL2RyYXdtZXRob2RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdmMGNmMQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL2RyYXdtZXRob2RzLmMKQEAgLTAsMCArMSwyMjIgQEAKKy8qIEdvb20gUHJvamVjdAorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gaU9TLVNvZnR3YXJlCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpbmNsdWRlICJkcmF3bWV0aG9kcy5oIgorCisjZGVmaW5lIERSQVdNRVRIT0RfUExVUyhfb3V0LF9iYWNrYnVmLF9jb2wpIFwKK3tcCisgICAgICBpbnQgdHJhPTAsaT0wO1wKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmJyYSA9ICh1bnNpZ25lZCBjaGFyKikmKF9iYWNrYnVmKTtcCisgICAgICB1bnNpZ25lZCBjaGFyICpkcmEgPSAodW5zaWduZWQgY2hhciopJihfb3V0KTtcCisgICAgICB1bnNpZ25lZCBjaGFyICpjcmEgPSAodW5zaWduZWQgY2hhciopJihfY29sKTtcCisgICAgICBmb3IgKDtpPDQ7aSsrKSB7XAorCQkJCXRyYSA9ICpjcmE7XAorCQkJCXRyYSArPSAqYnJhO1wKKwkJCQlpZiAodHJhPjI1NSkgdHJhPTI1NTtcCisJCQkJKmRyYSA9IHRyYTtcCisJCQkJKytkcmE7KytjcmE7KyticmE7XAorCQkJfVwKK30KKworI2RlZmluZSBEUkFXTUVUSE9EIERSQVdNRVRIT0RfUExVUygqcCwqcCxjb2wpCisKK3ZvaWQKK2RyYXdfbGluZSAoUGl4ZWwgKiBkYXRhLCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIsIGludCBjb2wsIGludCBzY3JlZW54LAorICAgIGludCBzY3JlZW55KQoreworICBpbnQgeCwgeSwgZHgsIGR5LCB5eSwgeHg7CisgIFBpeGVsICpwOworCisgIGlmICgoeTEgPCAwKSB8fCAoeTIgPCAwKSB8fCAoeDEgPCAwKSB8fCAoeDIgPCAwKSB8fCAoeTEgPj0gc2NyZWVueSkKKyAgICAgIHx8ICh5MiA+PSBzY3JlZW55KSB8fCAoeDEgPj0gc2NyZWVueCkgfHwgKHgyID49IHNjcmVlbngpKQorICAgIHJldHVybjsKKworICAvKiBjbGlwIHRvIHRvcCBlZGdlIAorICAgICBpZiAoKHkxIDwgMCkgJiYgKHkyIDwgMCkpCisgICAgIHJldHVybjsKKworICAgICBpZiAoeTEgPCAwKSB7CisgICAgIHgxICs9ICh5MSAqICh4MSAtIHgyKSkgLyAoeTIgLSB5MSk7CisgICAgIHkxID0gMDsKKyAgICAgfQorICAgICBpZiAoeTIgPCAwKSB7CisgICAgIHgyICs9ICh5MiAqICh4MSAtIHgyKSkgLyAoeTIgLSB5MSk7CisgICAgIHkyID0gMDsKKyAgICAgfQorCisgICAgIGNsaXAgdG8gYm90dG9tIGVkZ2UgCisgICAgIGlmICgoeTEgPj0gc2NyZWVueSkgJiYgKHkyID49IHNjcmVlbnkpKQorICAgICByZXR1cm47CisgICAgIGlmICh5MSA+PSBzY3JlZW55KSB7CisgICAgIHgxIC09ICgoc2NyZWVueSAtIHkxKSAqICh4MSAtIHgyKSkgLyAoeTIgLSB5MSk7CisgICAgIHkxID0gc2NyZWVueSAtIDE7CisgICAgIH0KKyAgICAgaWYgKHkyID49IHNjcmVlbnkpIHsKKyAgICAgeDIgLT0gKChzY3JlZW55IC0geTIpICogKHgxIC0geDIpKSAvICh5MiAtIHkxKTsKKyAgICAgeTIgPSBzY3JlZW55IC0gMTsKKyAgICAgfQorICAgICBjbGlwIHRvIGxlZnQgZWRnZSAKKyAgICAgaWYgKCh4MSA8IDApICYmICh4MiA8IDApKQorICAgICByZXR1cm47CisgICAgIGlmICh4MSA8IDApIHsKKyAgICAgeTEgKz0gKHgxICogKHkxIC0geTIpKSAvICh4MiAtIHgxKTsKKyAgICAgeDEgPSAwOworICAgICB9CisgICAgIGlmICh4MiA8IDApIHsKKyAgICAgeTIgKz0gKHgyICogKHkxIC0geTIpKSAvICh4MiAtIHgxKTsKKyAgICAgeDIgPSAwOworICAgICB9CisgICAgIGNsaXAgdG8gcmlnaHQgZWRnZSAKKyAgICAgaWYgKCh4MSA+PSBzY3JlZW54KSAmJiAoeDIgPj0gc2NyZWVueCkpCisgICAgIHJldHVybjsKKyAgICAgaWYgKHgxID49IHNjcmVlbngpIHsKKyAgICAgeTEgLT0gKChzY3JlZW54IC0geDEpICogKHkxIC0geTIpKSAvICh4MiAtIHgxKTsKKyAgICAgeDEgPSBzY3JlZW54IC0gMTsKKyAgICAgfQorICAgICBpZiAoeDIgPj0gc2NyZWVueCkgeworICAgICB5MiAtPSAoKHNjcmVlbnggLSB4MikgKiAoeTEgLSB5MikpIC8gKHgyIC0geDEpOworICAgICB4MiA9IHNjcmVlbnggLSAxOworICAgICB9CisgICAqLworCisgIGR4ID0geDIgLSB4MTsKKyAgZHkgPSB5MiAtIHkxOworICBpZiAoeDEgPiB4MikgeworICAgIGludCB0bXA7CisKKyAgICB0bXAgPSB4MTsKKyAgICB4MSA9IHgyOworICAgIHgyID0gdG1wOworICAgIHRtcCA9IHkxOworICAgIHkxID0geTI7CisgICAgeTIgPSB0bXA7CisgICAgZHggPSB4MiAtIHgxOworICAgIGR5ID0geTIgLSB5MTsKKyAgfQorCisgIC8qIHZlcnRpY2FsIGxpbmUgKi8KKyAgaWYgKGR4ID09IDApIHsKKyAgICBpZiAoeTEgPCB5MikgeworICAgICAgcCA9ICYoZGF0YVsoc2NyZWVueCAqIHkxKSArIHgxXSk7CisgICAgICBmb3IgKHkgPSB5MTsgeSA8PSB5MjsgeSsrKSB7CisgICAgICAgIERSQVdNRVRIT0Q7CisgICAgICAgIHAgKz0gc2NyZWVueDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcCA9ICYoZGF0YVsoc2NyZWVueCAqIHkyKSArIHgxXSk7CisgICAgICBmb3IgKHkgPSB5MjsgeSA8PSB5MTsgeSsrKSB7CisgICAgICAgIERSQVdNRVRIT0Q7CisgICAgICAgIHAgKz0gc2NyZWVueDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIC8qIGhvcml6b250YWwgbGluZSAqLworICBpZiAoZHkgPT0gMCkgeworICAgIGlmICh4MSA8IHgyKSB7CisgICAgICBwID0gJihkYXRhWyhzY3JlZW54ICogeTEpICsgeDFdKTsKKyAgICAgIGZvciAoeCA9IHgxOyB4IDw9IHgyOyB4KyspIHsKKyAgICAgICAgRFJBV01FVEhPRDsKKyAgICAgICAgcCsrOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICBwID0gJihkYXRhWyhzY3JlZW54ICogeTEpICsgeDJdKTsKKyAgICAgIGZvciAoeCA9IHgyOyB4IDw9IHgxOyB4KyspIHsKKyAgICAgICAgRFJBV01FVEhPRDsKKyAgICAgICAgcCsrOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICAvKiAxICAgICovCisgIC8qIFwgICAqLworICAvKiBcICAqLworICAvKiAyICovCisgIGlmICh5MiA+IHkxKSB7CisgICAgLyogc3RlZXAgKi8KKyAgICBpZiAoZHkgPiBkeCkgeworICAgICAgZHggPSAoKGR4IDw8IDE2KSAvIGR5KTsKKyAgICAgIHggPSB4MSA8PCAxNjsKKyAgICAgIGZvciAoeSA9IHkxOyB5IDw9IHkyOyB5KyspIHsKKyAgICAgICAgeHggPSB4ID4+IDE2OworICAgICAgICBwID0gJihkYXRhWyhzY3JlZW54ICogeSkgKyB4eF0pOworICAgICAgICBEUkFXTUVUSE9EOworICAgICAgICBpZiAoeHggPCAoc2NyZWVueCAtIDEpKSB7CisgICAgICAgICAgcCsrOworICAgICAgICAgIC8qIERSQVdNRVRIT0Q7ICovCisgICAgICAgIH0KKyAgICAgICAgeCArPSBkeDsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogc2hhbGxvdyAqLworICAgIGVsc2UgeworICAgICAgZHkgPSAoKGR5IDw8IDE2KSAvIGR4KTsKKyAgICAgIHkgPSB5MSA8PCAxNjsKKyAgICAgIGZvciAoeCA9IHgxOyB4IDw9IHgyOyB4KyspIHsKKyAgICAgICAgeXkgPSB5ID4+IDE2OworICAgICAgICBwID0gJihkYXRhWyhzY3JlZW54ICogeXkpICsgeF0pOworICAgICAgICBEUkFXTUVUSE9EOworICAgICAgICBpZiAoeXkgPCAoc2NyZWVueSAtIDEpKSB7CisgICAgICAgICAgcCArPSBzY3JlZW55OworICAgICAgICAgIC8qIERSQVdNRVRIT0Q7ICovCisgICAgICAgIH0KKyAgICAgICAgeSArPSBkeTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogMiAqLworICAvKiAvICAqLworICAvKiAvICAgKi8KKyAgLyogMSAgICAqLworICBlbHNlIHsKKyAgICAvKiBzdGVlcCAqLworICAgIGlmICgtZHkgPiBkeCkgeworICAgICAgZHggPSAoKGR4IDw8IDE2KSAvIC1keSk7CisgICAgICB4ID0gKHgxICsgMSkgPDwgMTY7CisgICAgICBmb3IgKHkgPSB5MTsgeSA+PSB5MjsgeS0tKSB7CisgICAgICAgIHh4ID0geCA+PiAxNjsKKyAgICAgICAgcCA9ICYoZGF0YVsoc2NyZWVueCAqIHkpICsgeHhdKTsKKyAgICAgICAgRFJBV01FVEhPRDsKKyAgICAgICAgaWYgKHh4IDwgKHNjcmVlbnggLSAxKSkgeworICAgICAgICAgIHAtLTsKKyAgICAgICAgICAvKiBEUkFXTUVUSE9EOyAqLworICAgICAgICB9CisgICAgICAgIHggKz0gZHg7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIHNoYWxsb3cgKi8KKyAgICBlbHNlIHsKKyAgICAgIGR5ID0gKChkeSA8PCAxNikgLyBkeCk7CisgICAgICB5ID0geTEgPDwgMTY7CisgICAgICBmb3IgKHggPSB4MTsgeCA8PSB4MjsgeCsrKSB7CisgICAgICAgIHl5ID0geSA+PiAxNjsKKyAgICAgICAgcCA9ICYoZGF0YVsoc2NyZWVueCAqIHl5KSArIHhdKTsKKyAgICAgICAgRFJBV01FVEhPRDsKKyAgICAgICAgaWYgKHl5IDwgKHNjcmVlbnkgLSAxKSkgeworICAgICAgICAgIHAgKz0gc2NyZWVueTsKKyAgICAgICAgICAvKiBEUkFXTUVUSE9EOyAqLworICAgICAgICB9CisgICAgICAgIHkgKz0gZHk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvZ29vbS9kcmF3bWV0aG9kcy5oIGIvZ3N0L2dvb20vZHJhd21ldGhvZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjg2Mjc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vZHJhd21ldGhvZHMuaApAQCAtMCwwICsxLDI3IEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZuZGVmIF9EUkFXTUVUSE9EU19ICisjZGVmaW5lIF9EUkFXTUVUSE9EU19ICisKKyNpbmNsdWRlICJnb29tX2NvbmZpZy5oIgorI2luY2x1ZGUgImdvb21fZ3JhcGhpYy5oIgorCit2b2lkIGRyYXdfbGluZSAoUGl4ZWwgKmRhdGEsIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiwgaW50IGNvbCwgaW50IHNjcmVlbngsIGludCBzY3JlZW55KTsKKworI2VuZGlmIC8qIF9EUkFXTUVUSE9EU19IICovCmRpZmYgLS1naXQgYS9nc3QvZ29vbS9maWx0ZXJzLmMgYi9nc3QvZ29vbS9maWx0ZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAzZDIwMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL2ZpbHRlcnMuYwpAQCAtMCwwICsxLDg2MiBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLy8gLS0tIENIVUkgRU4gVFJBSU4gREUgU1VQUFJJTUVSIExFUyBFWFRFUk4gUkVTT0xYIEVUIENfUkVTT0xZIC0tLQorCisvKiBmaWx0ZXIuYyB2ZXJzaW9uIDAuNworKiBjb250aWVudCBsZXMgZmlsdHJlcyBhcHBsaWNhYmxlIGEgdW4gYnVmZmVyCisqIGNyZWF0aW9uIDogMDEvMTAvMjAwMAorKiAgLWFqb3V0IGRlIHNpbkZpbHRlcigpCisqICAtYWpvdXQgZGUgem9vbUZpbHRlcigpCisqICAtY29waWUgZGUgem9vbUZpbHRlcigpIGVuIHpvb21GaWx0ZXJSR0IoKSwgZ2VyYW50IGxlcyAzIGNvdWxldXJzCisqICAtb3B0aW1pc2F0aW9uIGRlIHNpbkZpbHRlciAodXRpbGlzYW50IHVuZSB0YWJsZSBkZSBzaW4pCisqCS1hc20KKyoJLW9wdGltaXNhdGlvbiBkZSBsYSBwcm9jZWR1cmUgZGUgZ2VuZXJhdGlvbiBkdSBidWZmZXIgZGUgdHJhbnNmb3JtYXRpb24KKyoJCWxhIHZpdGVzc2UgZXN0IG1haW50ZW5hbnQgY29tcHJpc2UgZGFucyBbMC4uMTI4XSBhdSBsaWV1IGRlIFswLi4xMDBdCisqLworCisvKiAjZGVmaW5lIF9ERUJVR19QSVhFTCAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImdvb21fZmlsdGVycy5oIgorI2luY2x1ZGUgImdvb21fZ3JhcGhpYy5oIgorI2luY2x1ZGUgImdvb21fdG9vbHMuaCIKKyNpbmNsdWRlICJnb29tX3BsdWdpbl9pbmZvLmgiCisjaW5jbHVkZSAiZ29vbV9meC5oIgorI2luY2x1ZGUgInYzZC5oIgorCisvKiBUT0RPIDogTU9WRSBUSElTIEFXQVkgISEhICovCisvKiBqZWtvOiBqJ2FpIGVzc2F5ZXIgZGUgbGUgdmlyZXIsIG1haXMgc2kgb24gdmV1dCBsZXMgbGFpc3NlciBpbmxpbmUgYydlc3QgdW4gcGV1IGxvdXJkby4uLiAqLworc3RhdGljIGlubGluZSB2b2lkCitzZXRQaXhlbFJHQiAoUGx1Z2luSW5mbyAqIGdvb21JbmZvLCBQaXhlbCAqIGJ1ZmZlciwgVWludCB4LCBVaW50IHksIENvbG9yIGMpCit7CisgIFBpeGVsIGk7CisKKyAgaS5jaGFubmVscy5iID0gYy5iOworICBpLmNoYW5uZWxzLmcgPSBjLnY7CisgIGkuY2hhbm5lbHMuciA9IGMucjsKKyAgKihidWZmZXIgKyAoeCArIHkgKiBnb29tSW5mby0+c2NyZWVuLndpZHRoKSkgPSBpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NldFBpeGVsUkdCXyAoUGl4ZWwgKiBidWZmZXIsIFVpbnQgeCwgQ29sb3IgYykKK3sKKyAgYnVmZmVyW3hdLmNoYW5uZWxzLnIgPSBjLnI7CisgIGJ1ZmZlclt4XS5jaGFubmVscy5nID0gYy52OworICBidWZmZXJbeF0uY2hhbm5lbHMuYiA9IGMuYjsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitnZXRQaXhlbFJHQl8gKFBpeGVsICogYnVmZmVyLCBVaW50IHgsIENvbG9yICogYykKK3sKKyAgUGl4ZWwgaSA9ICooYnVmZmVyICsgeCk7CisKKyAgYy0+YiA9IGkuY2hhbm5lbHMuYjsKKyAgYy0+diA9IGkuY2hhbm5lbHMuZzsKKyAgYy0+ciA9IGkuY2hhbm5lbHMucjsKK30KKworLyogRU5EIFRPRE8gKi8KKworCisvKiBERVBSRUNBVEVEICovCisvLyByZXRvdXJuZSB4Pj5zICwgZW4gdGVzdGFudCBsZSBzaWduZSBkZSB4CisvLyNkZWZpbmUgU2hpZnRSaWdodChfeCxfcykgKCgoX3gpPDApID8gLSgtKF94KT4+KF9zKSkgOiAoKF94KT4+KF9zKSkpCisvLyNkZWZpbmUgRUZGRUNUX0RJU1RPUlMgNAorLy8jZGVmaW5lIEVGRkVDVF9ESVNUT1JTX1NMIDIKKy8vI2RlZmluZSBJTlRFUkxBQ0VfQUREIDkKKy8vI2RlZmluZSBJTlRFUkxBQ0VfQU5EIDB4ZgorLyogRU5EIERFUFJFQ0FURUQgKi8KKworI2RlZmluZSBCVUZGUE9JTlROQiAxNgorI2RlZmluZSBCVUZGUE9JTlROQkYgMTYuMGYKKyNkZWZpbmUgQlVGRlBPSU5UTUFTSyAweGZmZmYKKworI2RlZmluZSBzcXJ0cGVydGUgMTYKKy8qIGZhaXJlIDogYSAlIHNxcnRwZXJ0ZSA8PT4gYSAmIHBlcnRlbWFzayAqLworI2RlZmluZSBQRVJURU1BU0sgMHhmCisvKiBmYWlyZSA6IGEgLyBzcXJ0cGVydGUgPD0+IGEgPj4gUEVSVEVERUMgKi8KKyNkZWZpbmUgUEVSVEVERUMgNAorCisvKiBwdXJlIGMgdmVyc2lvbiBvZiB0aGUgem9vbSBmaWx0ZXIgKi8KK3N0YXRpYyB2b2lkIGNfem9vbSAoUGl4ZWwgKiBleHBpeDEsIFBpeGVsICogZXhwaXgyLCB1bnNpZ25lZCBpbnQgcHJldlgsCisgICAgdW5zaWduZWQgaW50IHByZXZZLCBzaWduZWQgaW50ICpicnV0Uywgc2lnbmVkIGludCAqYnJ1dEQsIGludCBidWZmcmF0aW8sCisgICAgaW50IHByZWNhbENvZWZbQlVGRlBPSU5UTkJdW0JVRkZQT0lOVE5CXSk7CisKKy8qIHNpbXBsZSB3cmFwcGVyIHRvIGdpdmUgaXQgdGhlIHNhbWUgcHJvdG8gdGhhbiB0aGUgb3RoZXJzICovCit2b2lkCit6b29tX2ZpbHRlcl9jIChpbnQgc2l6ZVgsIGludCBzaXplWSwgUGl4ZWwgKiBzcmMsIFBpeGVsICogZGVzdCwgaW50ICpicnV0UywKKyAgICBpbnQgKmJydXRELCBpbnQgYnVmZnJhdGlvLCBpbnQgcHJlY2FsQ29lZlsxNl1bMTZdKQoreworICBjX3pvb20gKHNyYywgZGVzdCwgc2l6ZVgsIHNpemVZLCBicnV0UywgYnJ1dEQsIGJ1ZmZyYXRpbywgcHJlY2FsQ29lZik7Cit9CisKK3N0YXRpYyB2b2lkIGdlbmVyYXRlUHJlY2FsQ29lZiAoaW50IHByZWNhbENvZWZbQlVGRlBPSU5UTkJdW0JVRkZQT0lOVE5CXSk7CisKKwordHlwZWRlZiBzdHJ1Y3QgX1pPT01fRklMVEVSX0ZYX1dSQVBQRVJfREFUQQoreworCisgIFBsdWdpblBhcmFtIGVuYWJsZWRfYnA7CisgIFBsdWdpblBhcmFtZXRlcnMgcGFyYW1zOworCisgIHVuc2lnbmVkIGludCAqY29lZmZzLCAqZnJlZWNvZWZmczsKKworICBzaWduZWQgaW50ICpicnV0UywgKmZyZWVicnV0UzsgICAgICAgIC8qIHNvdXJjZSAqLworICBzaWduZWQgaW50ICpicnV0RCwgKmZyZWVicnV0RDsgICAgICAgIC8qIGRlc3QgKi8KKyAgc2lnbmVkIGludCAqYnJ1dFQsICpmcmVlYnJ1dFQ7ICAgICAgICAvKiB0ZW1wIChlbiBjb3VycyBkZSBnZW5lcmF0aW9uKSAqLworCisgIGd1aW50MzIgem9vbV93aWR0aDsKKworICB1bnNpZ25lZCBpbnQgcHJldlgsIHByZXZZOworCisgIGZsb2F0IGdlbmVyYWxfc3BlZWQ7CisgIGludCByZXZlcnNlOyAgICAgICAgICAgICAgICAgIC8qIHJldmVyc2UgdGhlIHNwZWVkICovCisgIGNoYXIgdGhlTW9kZTsKKyAgaW50IHdhdmVFZmZlY3Q7CisgIGludCBoeXBlcmNvc0VmZmVjdDsKKyAgaW50IHZQbGFuZUVmZmVjdDsKKyAgaW50IGhQbGFuZUVmZmVjdDsKKyAgY2hhciBub2lzaWZ5OworICBpbnQgbWlkZGxlWCwgbWlkZGxlWTsKKworICBpbnQgbXVzdEluaXRCdWZmZXJzOworICBpbnQgaW50ZXJsYWNlX3N0YXJ0OworCisgICAgLyoqIG1vZGlmIGJ5IGpla28gOiBmaXhlZHBvaW50IDogYnVmZnJhdGlvbiA9ICgxNjoxNikgKGRvbmMgMDw9YnVmZnJhdGlvbjw9Ml4xNikgKi8KKyAgaW50IGJ1ZmZyYXRpbzsKKyAgaW50ICpmaXJlZGVjOworCisgICAgLyoqIG1vZGlmIGQnb3B0aW0gYnkgSmVrbyA6IHByZWNhbGN1bCBkZXMgNCBjb2VmcyByZXN1bHRhbnQgZGVzIDIgcG9zICovCisgIGludCBwcmVjYWxDb2VmW0JVRkZQT0lOVE5CXVtCVUZGUE9JTlROQl07CisKKyAgICAvKiogY2FsY3VsYXRlUFhhbmRQWSBzdGF0aWNzICovCisgIGludCB3YXZlOworICBpbnQgd2F2ZXNwOworCit9IFpvb21GaWx0ZXJGWFdyYXBwZXJEYXRhOworCisKKworCitzdGF0aWMgaW5saW5lIHZvaWQKK3pvb21WZWN0b3IgKHYyZyAqIHZlY3RldXIsIFpvb21GaWx0ZXJGWFdyYXBwZXJEYXRhICogZGF0YSwgZmxvYXQgWCwgZmxvYXQgWSkKK3sKKyAgZmxvYXQgdngsIHZ5OworICBmbG9hdCBzcV9kaXN0ID0gWCAqIFggKyBZICogWTsKKworICAvKiAgICBzeCA9IChYIDwgMC4wZikgPyAtMS4wZiA6IDEuMGY7CisgICAgIHN5ID0gKFkgPCAwLjBmKSA/IC0xLjBmIDogMS4wZjsKKyAgICovCisgIGZsb2F0IGNvZWZWaXRlc3NlID0gKDEuMGYgKyBkYXRhLT5nZW5lcmFsX3NwZWVkKSAvIDUwLjBmOworCisgIC8vIEVmZmVjdHMKKworICAvKiBDZW50cmFsaXplZCBGWCAqLworCisgIHN3aXRjaCAoZGF0YS0+dGhlTW9kZSkgeworICAgIGNhc2UgQ1JZU1RBTF9CQUxMX01PREU6CisgICAgICBjb2VmVml0ZXNzZSAtPSAoc3FfZGlzdCAtIDAuM2YpIC8gMTUuMGY7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFNVUxFVFRFX01PREU6CisgICAgICBjb2VmVml0ZXNzZSArPSBzcV9kaXN0ICogMy41ZjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV0FWRV9NT0RFOgorICAgICAgY29lZlZpdGVzc2UgKz0gc2luIChzcV9kaXN0ICogMjAuMGYpIC8gMTAwLjBmOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTQ1JVTkNIX01PREU6CisgICAgICBjb2VmVml0ZXNzZSArPSBzcV9kaXN0IC8gMTAuMGY7CisgICAgICBicmVhazsKKyAgICAgIC8vY2FzZSBIWVBFUkNPUzFfTU9ERToKKyAgICAgIGJyZWFrOworICAgICAgLy9jYXNlIEhZUEVSQ09TMl9NT0RFOgorICAgICAgYnJlYWs7CisgICAgICAvL2Nhc2UgWU9OTFlfTU9ERToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1BFRURXQVlfTU9ERToKKyAgICAgIGNvZWZWaXRlc3NlICo9IDQuMGYgKiBZOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKGNvZWZWaXRlc3NlIDwgLTIuMDFmKQorICAgIGNvZWZWaXRlc3NlID0gLTIuMDFmOworICBpZiAoY29lZlZpdGVzc2UgPiAyLjAxZikKKyAgICBjb2VmVml0ZXNzZSA9IDIuMDFmOworCisgIHZ4ID0gY29lZlZpdGVzc2UgKiBYOworICB2eSA9IGNvZWZWaXRlc3NlICogWTsKKworICAvKiBBbXVsZXR0ZSAyICovCisgIC8vIHZ4ID0gWCAqIHRhbihkaXN0KTsKKyAgLy8gdnkgPSBZICogdGFuKGRpc3QpOworCisgIC8qIFJvdGF0ZSAqLworICAvL3Z4ID0gKFgrWSkqMC4xOworICAvL3Z5ID0gKFktWCkqMC4xOworCisKKyAgLy8gRWZmZWN0cyBhZGRzLW9uCisKKyAgLyogTm9pc2UgKi8KKyAgaWYgKGRhdGEtPm5vaXNpZnkpIHsKKyAgICB2eCArPSAoKChmbG9hdCkgcmFuZCAoKSkgLyAoKGZsb2F0KSBSQU5EX01BWCkgLSAwLjVmKSAvIDUwLjBmOworICAgIHZ5ICs9ICgoKGZsb2F0KSByYW5kICgpKSAvICgoZmxvYXQpIFJBTkRfTUFYKSAtIDAuNWYpIC8gNTAuMGY7CisgIH0KKworICAvKiBIeXBlcmNvcyAqLworICBpZiAoZGF0YS0+aHlwZXJjb3NFZmZlY3QpIHsKKyAgICB2eCArPSBzaW4gKFkgKiAxMC4wZikgLyAxMjAuMGY7CisgICAgdnkgKz0gc2luIChYICogMTAuMGYpIC8gMTIwLjBmOworICB9CisKKyAgLyogSCBQbGFuZSAqLworICBpZiAoZGF0YS0+aFBsYW5lRWZmZWN0KQorICAgIHZ4ICs9IFkgKiAwLjAwMjVmICogZGF0YS0+aFBsYW5lRWZmZWN0OworCisgIC8qIFYgUGxhbmUgKi8KKyAgaWYgKGRhdGEtPnZQbGFuZUVmZmVjdCkKKyAgICB2eSArPSBYICogMC4wMDI1ZiAqIGRhdGEtPnZQbGFuZUVmZmVjdDsKKworICAvKiBUT0RPIDogV2F0ZXIgTW9kZSAqLworICAvLyAgICBpZiAoZGF0YS0+d2F2ZUVmZmVjdCkKKworICB2ZWN0ZXVyLT54ID0gdng7CisgIHZlY3RldXItPnkgPSB2eTsKK30KKworCisvKgorICogTWFrZXMgYSBzdHJpcGUgb2YgYSB0cmFuc2Zvcm0gYnVmZmVyIChicnV0VCkKKyAqCisgKiBUaGUgdHJhbnNmb3JtIGlzIChpbiBvcmRlcikgOgorICogVHJhbnNsYXRpb24gKC1kYXRhLT5taWRkbGVYLCAtZGF0YS0+bWlkZGxlWSkKKyAqIEhvbW90aGV0aWUgKENlbnRlciA6IDAsMCAgIENvZWZmIDogMi9kYXRhLT5wcmV2WCkKKyAqLworc3RhdGljIHZvaWQKK21ha2Vab29tQnVmZmVyU3RyaXBlIChab29tRmlsdGVyRlhXcmFwcGVyRGF0YSAqIGRhdGEsIGludCBJTlRFUkxBQ0VfSU5DUikKK3sKKyAgLy8gUG9zaXRpb24gb2YgdGhlIHBpeGVsIHRvIGNvbXB1dGUgaW4gcGl4bWFwIGNvb3JkaW5hdGVzCisgIFVpbnQgeCwgeTsKKworICAvLyBXaGVyZSAodmVydGljYWx5KSB0byBzdG9wIGdlbmVyYXRpbmcgdGhlIGJ1ZmZlciBzdHJpcGUKKyAgaW50IG1heEVuZDsKKworICAvLyBSYXRpbyBmcm9tIHBpeG1hcCB0byBub3JtYWxpemVkIGNvb3JkaW5hdGVzCisgIGZsb2F0IHJhdGlvID0gMi4wZiAvICgoZmxvYXQpIGRhdGEtPnByZXZYKTsKKworICAvLyBSYXRpbyBmcm9tIG5vcm1hbGl6ZWQgdG8gdmlydHVhbCBwaXhtYXAgY29vcmRpbmF0ZXMKKyAgZmxvYXQgaW52X3JhdGlvID0gQlVGRlBPSU5UTkJGIC8gcmF0aW87CisgIGZsb2F0IG1pbiA9IHJhdGlvIC8gQlVGRlBPSU5UTkJGOworCisgIC8vIFkgcG9zaXRpb24gb2YgdGhlIHBpeGVsIHRvIGNvbXB1dGUgaW4gbm9ybWFsaXplZCBjb29yZGluYXRlcworICBmbG9hdCBZID0gKChmbG9hdCkgKGRhdGEtPmludGVybGFjZV9zdGFydCAtIGRhdGEtPm1pZGRsZVkpKSAqIHJhdGlvOworCisgIG1heEVuZCA9IGRhdGEtPnByZXZZOworICBpZiAobWF4RW5kID4gKGRhdGEtPmludGVybGFjZV9zdGFydCArIElOVEVSTEFDRV9JTkNSKSkKKyAgICBtYXhFbmQgPSAoZGF0YS0+aW50ZXJsYWNlX3N0YXJ0ICsgSU5URVJMQUNFX0lOQ1IpOworCisgIGZvciAoeSA9IGRhdGEtPmludGVybGFjZV9zdGFydDsKKyAgICAgICh5IDwgZGF0YS0+cHJldlkpICYmICgoc2lnbmVkIGludCkgeSA8IG1heEVuZCk7IHkrKykgeworICAgIFVpbnQgcHJlbXVsX3lfcHJldlggPSB5ICogZGF0YS0+cHJldlggKiAyOworICAgIGZsb2F0IFggPSAtKChmbG9hdCkgZGF0YS0+bWlkZGxlWCkgKiByYXRpbzsKKworICAgIGZvciAoeCA9IDA7IHggPCBkYXRhLT5wcmV2WDsgeCsrKSB7CisgICAgICB2MmcgdmVjdG9yOworCisgICAgICB6b29tVmVjdG9yICgmdmVjdG9yLCBkYXRhLCBYLCBZKTsKKworICAgICAgLyogRmluaXNoIGFuZCBhdm9pZCBudWxsIGRpc3BsYWNlbWVudCAqLworICAgICAgaWYgKGZhYnMgKHZlY3Rvci54KSA8IG1pbikKKyAgICAgICAgdmVjdG9yLnggPSAodmVjdG9yLnggPCAwLjBmKSA/IC1taW4gOiBtaW47CisgICAgICBpZiAoZmFicyAodmVjdG9yLnkpIDwgbWluKQorICAgICAgICB2ZWN0b3IueSA9ICh2ZWN0b3IueSA8IDAuMGYpID8gLW1pbiA6IG1pbjsKKworICAgICAgZGF0YS0+YnJ1dFRbcHJlbXVsX3lfcHJldlhdID0KKyAgICAgICAgICAoKGludCkgKChYIC0gdmVjdG9yLngpICogaW52X3JhdGlvKSArCisgICAgICAgICAgKChpbnQpIChkYXRhLT5taWRkbGVYICogQlVGRlBPSU5UTkIpKSk7CisgICAgICBkYXRhLT5icnV0VFtwcmVtdWxfeV9wcmV2WCArIDFdID0KKyAgICAgICAgICAoKGludCkgKChZIC0gdmVjdG9yLnkpICogaW52X3JhdGlvKSArCisgICAgICAgICAgKChpbnQpIChkYXRhLT5taWRkbGVZICogQlVGRlBPSU5UTkIpKSk7CisgICAgICBwcmVtdWxfeV9wcmV2WCArPSAyOworICAgICAgWCArPSByYXRpbzsKKyAgICB9CisgICAgWSArPSByYXRpbzsKKyAgfQorICBkYXRhLT5pbnRlcmxhY2Vfc3RhcnQgKz0gSU5URVJMQUNFX0lOQ1I7CisgIGlmICh5ID49IGRhdGEtPnByZXZZIC0gMSkKKyAgICBkYXRhLT5pbnRlcmxhY2Vfc3RhcnQgPSAtMTsKK30KKworCisvKgorICogY2FsY3VsZXIgcHggZXQgcHkgZW4gZm9uY3Rpb24gZGUgeCx5LG1pZGRsZVgsbWlkZGxlWSBldCB0aGVNb2RlCisgKiBweCBldCBweSBpbmRpcXVlIGxhIG5vdXZlbGxlIHBvc2l0aW9uIChlbiBzcXJ0cGVydGUgaWVtZSBkZSBwaXhlbCkKKyAqICh2YWxldXIgKiAxNikKKyAKKyBpbmxpbmUgdm9pZCBjYWxjdWxhdGVQWGFuZFBZIChQbHVnaW5JbmZvICpnb29tSW5mbywgWm9vbUZpbHRlckZYV3JhcHBlckRhdGEgKmRhdGEsIGludCB4LCBpbnQgeSwgaW50ICpweCwgaW50ICpweSkKKyB7CisgICAgIGlmIChkYXRhLT50aGVNb2RlID09IFdBVEVSX01PREUpIHsKKyAgICAgICAgIGludCB5eTsKKyAgICAgICAgIAorICAgICAgICAgeXkgPSB5ICsgZ29vbV9pcmFuZChnb29tSW5mby0+Z1JhbmRvbSwgNCkgLSBnb29tX2lyYW5kKGdvb21JbmZvLT5nUmFuZG9tLCA0KSArIGRhdGEtPndhdmUgLyAxMDsKKyAgICAgICAgIGlmICh5eSA8IDApCisgICAgICAgICAgICAgeXkgPSAwOworICAgICAgICAgaWYgKHl5ID49IChzaWduZWQgaW50KWdvb21JbmZvLT5zY3JlZW4uaGVpZ2h0KQorICAgICAgICAgICAgIHl5ID0gZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQgLSAxOworICAgICAgICAgCisgICAgICAgICAqcHggPSAoeCA8PCA0KSArIGRhdGEtPmZpcmVkZWNbeXldICsgKGRhdGEtPndhdmUgLyAxMCk7CisgICAgICAgICAqcHkgPSAoeSA8PCA0KSArIDEzMiAtICgoZGF0YS0+dml0ZXNzZSA8IDEzMSkgPyBkYXRhLT52aXRlc3NlIDogMTMwKTsKKyAgICAgICAgIAorICAgICAgICAgZGF0YS0+d2F2ZXNwICs9IGdvb21faXJhbmQoZ29vbUluZm8tPmdSYW5kb20sIDMpIC0gZ29vbV9pcmFuZChnb29tSW5mby0+Z1JhbmRvbSwgMyk7CisgICAgICAgICBpZiAoZGF0YS0+d2F2ZSA8IC0xMCkKKyAgICAgICAgICAgICBkYXRhLT53YXZlc3AgKz0gMjsKKyAgICAgICAgIGlmIChkYXRhLT53YXZlID4gMTApCisgICAgICAgICAgICAgZGF0YS0+d2F2ZXNwIC09IDI7CisgICAgICAgICBkYXRhLT53YXZlICs9IChkYXRhLT53YXZlc3AgLyAxMCkgKyBnb29tX2lyYW5kKGdvb21JbmZvLT5nUmFuZG9tLCAzKSAtIGdvb21faXJhbmQoZ29vbUluZm8tPmdSYW5kb20sIDMpOworICAgICAgICAgaWYgKGRhdGEtPndhdmVzcCA+IDEwMCkKKyAgICAgICAgICAgICBkYXRhLT53YXZlc3AgPSAoZGF0YS0+d2F2ZXNwICogOSkgLyAxMDsKKyAgICAgfQorICAgICBlbHNlIHsKKyAgICAgICAgIGludCAgICAgZGlzdCA9IDAsIHZ4OSwgdnk5OworICAgICAgICAgaW50ICAgICB2eCwgdnk7CisgICAgICAgICBpbnQgICAgIHBweCwgcHB5OworICAgICAgICAgaW50ICAgICBmdml0ZXNzZSA9IGRhdGEtPnZpdGVzc2UgPDwgNDsKKyAgICAgICAgIAorICAgICAgICAgaWYgKGRhdGEtPm5vaXNpZnkpIHsKKyAgICAgICAgICAgICB4ICs9IGdvb21faXJhbmQoZ29vbUluZm8tPmdSYW5kb20sIGRhdGEtPm5vaXNpZnkpIC0gZ29vbV9pcmFuZChnb29tSW5mby0+Z1JhbmRvbSwgZGF0YS0+bm9pc2lmeSk7CisgICAgICAgICAgICAgeSArPSBnb29tX2lyYW5kKGdvb21JbmZvLT5nUmFuZG9tLCBkYXRhLT5ub2lzaWZ5KSAtIGdvb21faXJhbmQoZ29vbUluZm8tPmdSYW5kb20sIGRhdGEtPm5vaXNpZnkpOworICAgICAgICAgfQorICAgICAgICAgdnggPSAoeCAtIGRhdGEtPm1pZGRsZVgpIDw8IDk7CisgICAgICAgICB2eSA9ICh5IC0gZGF0YS0+bWlkZGxlWSkgPDwgOTsKKyAgICAgICAgIAorICAgICAgICAgaWYgKGRhdGEtPmhQbGFuZUVmZmVjdCkKKyAgICAgICAgICAgICB2eCArPSBkYXRhLT5oUGxhbmVFZmZlY3QgKiAoeSAtIGRhdGEtPm1pZGRsZVkpOworICAgICAgICAgCisgICAgICAgICBpZiAoZGF0YS0+dlBsYW5lRWZmZWN0KQorICAgICAgICAgICAgIHZ5ICs9IGRhdGEtPnZQbGFuZUVmZmVjdCAqICh4IC0gZGF0YS0+bWlkZGxlWCk7CisgICAgICAgICAKKyAgICAgICAgIGlmIChkYXRhLT53YXZlRWZmZWN0KSB7CisgICAgICAgICAgICAgZnZpdGVzc2UgKj0KKyAgICAgICAgICAgICAxMDI0ICsKKyAgICAgICAgICAgICBTaGlmdFJpZ2h0IChnb29tSW5mby0+c2ludGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHVuc2lnbmVkIHNob3J0KSAoZGlzdCAqIDB4ZmZmZiArIEVGRkVDVF9ESVNUT1JTKV0sIDYpOworICAgICAgICAgICAgIGZ2aXRlc3NlIC89IDEwMjQ7CisgICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgIGlmIChkYXRhLT5oeXBlcmNvc0VmZmVjdCkgeworICAgICAgICAgICAgIHZ4ICs9IFNoaWZ0UmlnaHQgKGdvb21JbmZvLT5zaW50YWJsZVsoLXZ5ICsgZGlzdCkgJiAweGZmZmZdLCAxKTsKKyAgICAgICAgICAgICB2eSArPSBTaGlmdFJpZ2h0IChnb29tSW5mby0+c2ludGFibGVbKHZ4ICsgZGlzdCkgJiAweGZmZmZdLCAxKTsKKyAgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgdng5ID0gU2hpZnRSaWdodCAodngsIDkpOworICAgICAgICAgdnk5ID0gU2hpZnRSaWdodCAodnksIDkpOworICAgICAgICAgZGlzdCA9IHZ4OSAqIHZ4OSArIHZ5OSAqIHZ5OTsKKyAgICAgICAgIAorICAgICAgICAgc3dpdGNoIChkYXRhLT50aGVNb2RlKSB7CisgICAgICAgICAgICAgY2FzZSBXQVZFX01PREU6CisgICAgICAgICAgICAgICAgIGZ2aXRlc3NlICo9CisgICAgICAgICAgICAgICAgIDEwMjQgKworICAgICAgICAgICAgICAgICBTaGlmdFJpZ2h0IChnb29tSW5mby0+c2ludGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyh1bnNpZ25lZCBzaG9ydCkgKGRpc3QgKiAweGZmZmYgKiBFRkZFQ1RfRElTVE9SUyldLCA2KTsKKyAgICAgICAgICAgICAgICAgZnZpdGVzc2U+Pj0xMDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgY2FzZSBDUllTVEFMX0JBTExfTU9ERToKKyAgICAgICAgICAgICAgICAgZnZpdGVzc2UgKz0gKGRpc3QgPj4gKDEwLUVGRkVDVF9ESVNUT1JTX1NMKSk7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIGNhc2UgQU1VTEVUVEVfTU9ERToKKyAgICAgICAgICAgICAgICAgZnZpdGVzc2UgLT0gKGRpc3QgPj4gKDQgLSBFRkZFQ1RfRElTVE9SU19TTCkpOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICBjYXNlIFNDUlVOQ0hfTU9ERToKKyAgICAgICAgICAgICAgICAgZnZpdGVzc2UgLT0gKGRpc3QgPj4gKDEwIC0gRUZGRUNUX0RJU1RPUlNfU0wpKTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgY2FzZSBIWVBFUkNPUzFfTU9ERToKKyAgICAgICAgICAgICAgICAgdnggPSB2eCArIFNoaWZ0UmlnaHQgKGdvb21JbmZvLT5zaW50YWJsZVsoLXZ5ICsgZGlzdCkgJiAweGZmZmZdLCAxKTsKKyAgICAgICAgICAgICAgICAgdnkgPSB2eSArIFNoaWZ0UmlnaHQgKGdvb21JbmZvLT5zaW50YWJsZVsodnggKyBkaXN0KSAmIDB4ZmZmZl0sIDEpOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICBjYXNlIEhZUEVSQ09TMl9NT0RFOgorICAgICAgICAgICAgICAgICB2eCA9CisgICAgICAgICAgICAgICAgIHZ4ICsgU2hpZnRSaWdodCAoZ29vbUluZm8tPnNpbnRhYmxlWygtU2hpZnRSaWdodCAodnksIDEpICsgZGlzdCkgJiAweGZmZmZdLCAwKTsKKyAgICAgICAgICAgICAgICAgdnkgPQorICAgICAgICAgICAgICAgICAgICAgdnkgKyBTaGlmdFJpZ2h0IChnb29tSW5mby0+c2ludGFibGVbKFNoaWZ0UmlnaHQgKHZ4LCAxKSArIGRpc3QpICYgMHhmZmZmXSwgMCk7CisgICAgICAgICAgICAgICAgIGZ2aXRlc3NlID0gMTI4IDw8IDQ7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIGNhc2UgWU9OTFlfTU9ERToKKyAgICAgICAgICAgICAgICAgZnZpdGVzc2UgKj0gMTAyNCArIFNoaWZ0UmlnaHQgKGdvb21JbmZvLT5zaW50YWJsZVt2eSAmIDB4ZmZmZl0sIDYpOworICAgICAgICAgICAgICAgICBmdml0ZXNzZSA+Pj0gMTA7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIGNhc2UgU1BFRURXQVlfTU9ERToKKyAgICAgICAgICAgICAgICAgZnZpdGVzc2UgLT0gKFNoaWZ0UmlnaHQodnksMTAtRUZGRUNUX0RJU1RPUlNfU0wpKTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgIGlmIChmdml0ZXNzZSA8IC0zMDI0KQorICAgICAgICAgICAgIGZ2aXRlc3NlID0gLTMwMjQ7CisgICAgICAgICAKKyAgICAgICAgIGlmICh2eCA8IDApCQkJCQkJCQkJLy8gcGIgYXZlYyBkZWNhbGFnZSBzdXIgbmIgbmVnYXRpZgorICAgICAgICAgICAgIHBweCA9IC0oLSh2eCAqIGZ2aXRlc3NlKSA+PiAxNik7CisgICAgICAgICAvLyAxNiA9IDkgKyA3ICg3ID0gbmIgY2hpZmZyZSB2aXJndWxlIGRlIHZpdGVzc2UgKiAodiA9IDEyOCA9PiBpbW1vYmlsZSkKKyAgICAgICAgIC8vICAgICogKiAqICogKiA5ID0gbmIgY2hpZmZyZSB2aXJndWxlIGRlIHZ4KSAKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICBwcHggPSAoKHZ4ICogZnZpdGVzc2UpID4+IDE2KTsKKyAgICAgICAgIAorICAgICAgICAgaWYgKHZ5IDwgMCkKKyAgICAgICAgICAgICBwcHkgPSAtKC0odnkgKiBmdml0ZXNzZSkgPj4gMTYpOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgIHBweSA9ICgodnkgKiBmdml0ZXNzZSkgPj4gMTYpOworICAgICAgICAgCisgICAgICAgICAqcHggPSAoZGF0YS0+bWlkZGxlWCA8PCA0KSArIHBweDsKKyAgICAgICAgICpweSA9IChkYXRhLT5taWRkbGVZIDw8IDQpICsgcHB5OworICAgICB9CisgfQorICovCisKKworCitzdGF0aWMgdm9pZAorY196b29tIChQaXhlbCAqIGV4cGl4MSwgUGl4ZWwgKiBleHBpeDIsIHVuc2lnbmVkIGludCBwcmV2WCwgdW5zaWduZWQgaW50IHByZXZZLAorICAgIHNpZ25lZCBpbnQgKmJydXRTLCBzaWduZWQgaW50ICpicnV0RCwgaW50IGJ1ZmZyYXRpbywgaW50IHByZWNhbENvZWZbMTZdWzE2XSkKK3sKKyAgaW50IG15UG9zLCBteVBvczI7CisgIENvbG9yIGNvdWxldXI7CisKKyAgdW5zaWduZWQgaW50IGF4ID0gKHByZXZYIC0gMSkgPDwgUEVSVEVERUMsIGF5ID0gKHByZXZZIC0gMSkgPDwgUEVSVEVERUM7CisKKyAgaW50IGJ1ZnNpemUgPSBwcmV2WCAqIHByZXZZICogMjsKKyAgaW50IGJ1ZndpZHRoID0gcHJldlg7CisKKyAgZXhwaXgxWzBdLnZhbCA9IGV4cGl4MVtwcmV2WCAtIDFdLnZhbCA9IGV4cGl4MVtwcmV2WCAqIHByZXZZIC0gMV0udmFsID0KKyAgICAgIGV4cGl4MVtwcmV2WCAqIHByZXZZIC0gcHJldlhdLnZhbCA9IDA7CisKKyAgZm9yIChteVBvcyA9IDA7IG15UG9zIDwgYnVmc2l6ZTsgbXlQb3MgKz0gMikgeworICAgIENvbG9yIGNvbDEsIGNvbDIsIGNvbDMsIGNvbDQ7CisgICAgaW50IGMxLCBjMiwgYzMsIGM0LCBweCwgcHk7CisgICAgaW50IHBvczsKKyAgICBpbnQgY29lZmZzOworCisgICAgaW50IGJydXRTbXlwb3MgPSBicnV0U1tteVBvc107CisKKyAgICBteVBvczIgPSBteVBvcyArIDE7CisKKyAgICBweCA9IGJydXRTbXlwb3MgKyAoKChicnV0RFtteVBvc10gLQorICAgICAgICAgICAgICAgIGJydXRTbXlwb3MpICogYnVmZnJhdGlvKSA+PiBCVUZGUE9JTlROQik7CisgICAgYnJ1dFNteXBvcyA9IGJydXRTW215UG9zMl07CisgICAgcHkgPSBicnV0U215cG9zICsgKCgoYnJ1dERbbXlQb3MyXSAtCisgICAgICAgICAgICAgICAgYnJ1dFNteXBvcykgKiBidWZmcmF0aW8pID4+IEJVRkZQT0lOVE5CKTsKKworICAgIGlmICgocHkgPj0gYXkpIHx8IChweCA+PSBheCkpIHsKKyAgICAgIHBvcyA9IGNvZWZmcyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHBvcyA9ICgocHggPj4gUEVSVEVERUMpICsgcHJldlggKiAocHkgPj4gUEVSVEVERUMpKTsKKyAgICAgIC8qIGNvZWYgZW4gbW9kdWxvIDE1ICovCisgICAgICBjb2VmZnMgPSBwcmVjYWxDb2VmW3B4ICYgUEVSVEVNQVNLXVtweSAmIFBFUlRFTUFTS107CisgICAgfQorICAgIGdldFBpeGVsUkdCXyAoZXhwaXgxLCBwb3MsICZjb2wxKTsKKyAgICBnZXRQaXhlbFJHQl8gKGV4cGl4MSwgcG9zICsgMSwgJmNvbDIpOworICAgIGdldFBpeGVsUkdCXyAoZXhwaXgxLCBwb3MgKyBidWZ3aWR0aCwgJmNvbDMpOworICAgIGdldFBpeGVsUkdCXyAoZXhwaXgxLCBwb3MgKyBidWZ3aWR0aCArIDEsICZjb2w0KTsKKworICAgIGMxID0gY29lZmZzOworICAgIGMyID0gKGMxID4+IDgpICYgMHhGRjsKKyAgICBjMyA9IChjMSA+PiAxNikgJiAweEZGOworICAgIGM0ID0gKGMxID4+IDI0KSAmIDB4RkY7CisgICAgYzEgPSBjMSAmIDB4ZmY7CisKKyAgICBjb3VsZXVyLnIgPSBjb2wxLnIgKiBjMSArIGNvbDIuciAqIGMyICsgY29sMy5yICogYzMgKyBjb2w0LnIgKiBjNDsKKyAgICBpZiAoY291bGV1ci5yID4gNSkKKyAgICAgIGNvdWxldXIuciAtPSA1OworICAgIGNvdWxldXIuciA+Pj0gODsKKworICAgIGNvdWxldXIudiA9IGNvbDEudiAqIGMxICsgY29sMi52ICogYzIgKyBjb2wzLnYgKiBjMyArIGNvbDQudiAqIGM0OworICAgIGlmIChjb3VsZXVyLnYgPiA1KQorICAgICAgY291bGV1ci52IC09IDU7CisgICAgY291bGV1ci52ID4+PSA4OworCisgICAgY291bGV1ci5iID0gY29sMS5iICogYzEgKyBjb2wyLmIgKiBjMiArIGNvbDMuYiAqIGMzICsgY29sNC5iICogYzQ7CisgICAgaWYgKGNvdWxldXIuYiA+IDUpCisgICAgICBjb3VsZXVyLmIgLT0gNTsKKyAgICBjb3VsZXVyLmIgPj49IDg7CisKKyAgICBzZXRQaXhlbFJHQl8gKGV4cGl4MiwgbXlQb3MgPj4gMSwgY291bGV1cik7CisgIH0KK30KKworLyoqIGdlbmVyYXRlIHRoZSB3YXRlciBmeCBob3Jpem9udGFsIGRpcmVjdGlvbiBidWZmZXIgKi8KK3N0YXRpYyB2b2lkCitnZW5lcmF0ZVRoZVdhdGVyRlhIb3Jpem9udGFsRGlyZWN0aW9uQnVmZmVyIChQbHVnaW5JbmZvICogZ29vbUluZm8sCisgICAgWm9vbUZpbHRlckZYV3JhcHBlckRhdGEgKiBkYXRhKQoreworCisgIGludCBsb29wdjsKKyAgaW50IGRlY2MgPSBnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgOCkgLSA0OworICBpbnQgc3BkYyA9IGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCA4KSAtIDQ7CisgIGludCBhY2NlbCA9IGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCA4KSAtIDQ7CisKKyAgZm9yIChsb29wdiA9IGRhdGEtPnByZXZZOyBsb29wdiAhPSAwOykgeworCisgICAgbG9vcHYtLTsKKyAgICBkYXRhLT5maXJlZGVjW2xvb3B2XSA9IGRlY2M7CisgICAgZGVjYyArPSBzcGRjIC8gMTA7CisgICAgc3BkYyArPQorICAgICAgICBnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMykgLSBnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMyk7CisKKyAgICBpZiAoZGVjYyA+IDQpCisgICAgICBzcGRjIC09IDE7CisgICAgaWYgKGRlY2MgPCAtNCkKKyAgICAgIHNwZGMgKz0gMTsKKworICAgIGlmIChzcGRjID4gMzApCisgICAgICBzcGRjID0gc3BkYyAtIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAzKSArIGFjY2VsIC8gMTA7CisgICAgaWYgKHNwZGMgPCAtMzApCisgICAgICBzcGRjID0gc3BkYyArIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAzKSArIGFjY2VsIC8gMTA7CisKKyAgICBpZiAoZGVjYyA+IDggJiYgc3BkYyA+IDEpCisgICAgICBzcGRjIC09IGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAzKSAtIDI7CisKKyAgICBpZiAoZGVjYyA8IC04ICYmIHNwZGMgPCAtMSkKKyAgICAgIHNwZGMgKz0gZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDMpICsgMjsKKworICAgIGlmIChkZWNjID4gOCB8fCBkZWNjIDwgLTgpCisgICAgICBkZWNjID0gZGVjYyAqIDggLyA5OworCisgICAgYWNjZWwgKz0KKyAgICAgICAgZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDIpIC0gZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDIpOworICAgIGlmIChhY2NlbCA+IDIwKQorICAgICAgYWNjZWwgLT0gMjsKKyAgICBpZiAoYWNjZWwgPCAtMjApCisgICAgICBhY2NlbCArPSAyOworICB9Cit9CisKKworCisvKioKKyogTWFpbiB3b3JrIGZvciB0aGUgZHluYW1pYyBkaXNwbGFjZW1lbnQgbWFwLgorICogCisgKiBSZWFkcyBkYXRhIGZyb20gcGl4MSwgd3JpdGUgdG8gcGl4Mi4KKyAqCisgKiBVc2VmdWwgZGF0YXMgZm9yIHRoaXMgRlggYXJlIHN0b3JlZCBpbiBab29tRmlsdGVyRGF0YS4KKyAqIAorICogSWYgeW91IHRoaW5rIHRoYXQgdGhpcyBpcyBhIHN0cmFuZ2UgZnVuY3Rpb24gbmFtZSwgbGV0IG1lIHNheSB0aGF0IGEgbG9uZyB0aW1lIGFnbywKKyAqICB0aGVyZSBoYXMgYmVlbiBhIHNsb3cgdmVyc2lvbiBhbmQgYSBncmF5LWxldmVsIG9ubHkgb25lLiBUaGVuIGNhbWUgdGhlc2UgZnVuY3Rpb24sCisgKiAgZmFzdCBhbmQgd29ya2luIGluIFJHQiBjb2xvcnNwYWNlICEgbmljZSBidXQgaXQgb25seSB3YXMgYXBwbHlpbmcgYSB6b29tIHRvIHRoZSBpbWFnZS4KKyAqICBTbyB0aGF0IGlzIHdoeSB5b3UgaGF2ZSB0aGlzIG5hbWUsIGZvciB0aGUgbm9zdGFsZ3kgb2YgdGhlIGZpcnN0IGRheXMgb2YgZ29vbQorICogIHdoZW4gaXQgd2FzIGp1c3QgYSB0aW55IHByb2dyYW0gd3JpdGVuIGluIFR1cmJvIFBhc2NhbCBvbiBteSBpNDg2Li4uCisgKi8KK3ZvaWQKK3pvb21GaWx0ZXJGYXN0UkdCIChQbHVnaW5JbmZvICogZ29vbUluZm8sIFBpeGVsICogcGl4MSwgUGl4ZWwgKiBwaXgyLAorICAgIFpvb21GaWx0ZXJEYXRhICogemYsIFVpbnQgcmVzeCwgVWludCByZXN5LCBpbnQgc3dpdGNoSW5jciwgZmxvYXQgc3dpdGNoTXVsdCkKK3sKKyAgVWludCB4LCB5OworCisgIFpvb21GaWx0ZXJGWFdyYXBwZXJEYXRhICpkYXRhID0KKyAgICAgIChab29tRmlsdGVyRlhXcmFwcGVyRGF0YSAqKSBnb29tSW5mby0+em9vbUZpbHRlcl9meC5meF9kYXRhOworCisgIGlmICghQlZBTCAoZGF0YS0+ZW5hYmxlZF9icCkpCisgICAgcmV0dXJuOworCisgICAgLyoqIGNoYW5nZW1lbnQgZGUgdGFpbGxlICoqLworICBpZiAoKGRhdGEtPnByZXZYICE9IHJlc3gpIHx8IChkYXRhLT5wcmV2WSAhPSByZXN5KSkgeworICAgIGRhdGEtPnByZXZYID0gcmVzeDsKKyAgICBkYXRhLT5wcmV2WSA9IHJlc3k7CisKKyAgICBpZiAoZGF0YS0+YnJ1dFMpCisgICAgICBmcmVlIChkYXRhLT5mcmVlYnJ1dFMpOworICAgIGRhdGEtPmJydXRTID0gMDsKKyAgICBpZiAoZGF0YS0+YnJ1dEQpCisgICAgICBmcmVlIChkYXRhLT5mcmVlYnJ1dEQpOworICAgIGRhdGEtPmJydXREID0gMDsKKyAgICBpZiAoZGF0YS0+YnJ1dFQpCisgICAgICBmcmVlIChkYXRhLT5mcmVlYnJ1dFQpOworICAgIGRhdGEtPmJydXRUID0gMDsKKworICAgIGRhdGEtPm1pZGRsZVggPSByZXN4IC8gMjsKKyAgICBkYXRhLT5taWRkbGVZID0gcmVzeSAvIDI7CisgICAgZGF0YS0+bXVzdEluaXRCdWZmZXJzID0gMTsKKyAgICBpZiAoZGF0YS0+ZmlyZWRlYykKKyAgICAgIGZyZWUgKGRhdGEtPmZpcmVkZWMpOworICAgIGRhdGEtPmZpcmVkZWMgPSAwOworICB9CisKKyAgaWYgKGRhdGEtPmludGVybGFjZV9zdGFydCAhPSAtMikKKyAgICB6ZiA9IE5VTEw7CisKKyAgICAvKiogY2hhbmdlbWVudCBkZSBjb25maWcgKiovCisgIGlmICh6ZikgeworICAgIGRhdGEtPnJldmVyc2UgPSB6Zi0+cmV2ZXJzZTsKKyAgICBkYXRhLT5nZW5lcmFsX3NwZWVkID0gKGZsb2F0KSAoemYtPnZpdGVzc2UgLSAxMjgpIC8gMTI4LjBmOworICAgIGlmIChkYXRhLT5yZXZlcnNlKQorICAgICAgZGF0YS0+Z2VuZXJhbF9zcGVlZCA9IC1kYXRhLT5nZW5lcmFsX3NwZWVkOworICAgIGRhdGEtPm1pZGRsZVggPSB6Zi0+bWlkZGxlWDsKKyAgICBkYXRhLT5taWRkbGVZID0gemYtPm1pZGRsZVk7CisgICAgZGF0YS0+dGhlTW9kZSA9IHpmLT5tb2RlOworICAgIGRhdGEtPmhQbGFuZUVmZmVjdCA9IHpmLT5oUGxhbmVFZmZlY3Q7CisgICAgZGF0YS0+dlBsYW5lRWZmZWN0ID0gemYtPnZQbGFuZUVmZmVjdDsKKyAgICBkYXRhLT53YXZlRWZmZWN0ID0gemYtPndhdmVFZmZlY3Q7CisgICAgZGF0YS0+aHlwZXJjb3NFZmZlY3QgPSB6Zi0+aHlwZXJjb3NFZmZlY3Q7CisgICAgZGF0YS0+bm9pc2lmeSA9IHpmLT5ub2lzaWZ5OworICAgIGRhdGEtPmludGVybGFjZV9zdGFydCA9IDA7CisgIH0KKworCisgIGlmIChkYXRhLT5tdXN0SW5pdEJ1ZmZlcnMpIHsKKworICAgIGRhdGEtPm11c3RJbml0QnVmZmVycyA9IDA7CisgICAgZGF0YS0+ZnJlZWJydXRTID0KKyAgICAgICAgKHNpZ25lZCBpbnQgKikgY2FsbG9jIChyZXN4ICogcmVzeSAqIDIgKyAxMjgsIHNpemVvZiAodW5zaWduZWQgaW50KSk7CisgICAgZGF0YS0+YnJ1dFMgPQorICAgICAgICAoZ2ludDMyICopICgoMSArICgodWludHB0cl90KSAoZGF0YS0+ZnJlZWJydXRTKSkgLyAxMjgpICogMTI4KTsKKworICAgIGRhdGEtPmZyZWVicnV0RCA9CisgICAgICAgIChzaWduZWQgaW50ICopIGNhbGxvYyAocmVzeCAqIHJlc3kgKiAyICsgMTI4LCBzaXplb2YgKHVuc2lnbmVkIGludCkpOworICAgIGRhdGEtPmJydXREID0KKyAgICAgICAgKGdpbnQzMiAqKSAoKDEgKyAoKHVpbnRwdHJfdCkgKGRhdGEtPmZyZWVicnV0RCkpIC8gMTI4KSAqIDEyOCk7CisKKyAgICBkYXRhLT5mcmVlYnJ1dFQgPQorICAgICAgICAoc2lnbmVkIGludCAqKSBjYWxsb2MgKHJlc3ggKiByZXN5ICogMiArIDEyOCwgc2l6ZW9mICh1bnNpZ25lZCBpbnQpKTsKKyAgICBkYXRhLT5icnV0VCA9CisgICAgICAgIChnaW50MzIgKikgKCgxICsgKCh1aW50cHRyX3QpIChkYXRhLT5mcmVlYnJ1dFQpKSAvIDEyOCkgKiAxMjgpOworCisgICAgZGF0YS0+YnVmZnJhdGlvID0gMDsKKworICAgIGRhdGEtPmZpcmVkZWMgPSAoaW50ICopIG1hbGxvYyAoZGF0YS0+cHJldlkgKiBzaXplb2YgKGludCkpOworICAgIGdlbmVyYXRlVGhlV2F0ZXJGWEhvcml6b250YWxEaXJlY3Rpb25CdWZmZXIgKGdvb21JbmZvLCBkYXRhKTsKKworICAgIGRhdGEtPmludGVybGFjZV9zdGFydCA9IDA7CisgICAgbWFrZVpvb21CdWZmZXJTdHJpcGUgKGRhdGEsIHJlc3kpOworCisgICAgLyogQ29weSB0aGUgZGF0YSBmcm9tIHRlbXAgdG8gZGVzdCBhbmQgc291cmNlICovCisgICAgbWVtY3B5IChkYXRhLT5icnV0UywgZGF0YS0+YnJ1dFQsIHJlc3ggKiByZXN5ICogMiAqIHNpemVvZiAoaW50KSk7CisgICAgbWVtY3B5IChkYXRhLT5icnV0RCwgZGF0YS0+YnJ1dFQsIHJlc3ggKiByZXN5ICogMiAqIHNpemVvZiAoaW50KSk7CisgIH0KKworICAvKiBnZW5lcmF0aW9uIGR1IGJ1ZmZlciBkZSB0cmFucyAqLworICBpZiAoZGF0YS0+aW50ZXJsYWNlX3N0YXJ0ID09IC0xKSB7CisKKyAgICAvKiBzYXV2ZWdhcmRlIGRlIGwnZXRhdCBhY3R1ZWwgZGFucyBsYSBub3V2ZWxsZSBzb3VyY2UKKyAgICAgKiBUT0RPOiB3cml0ZSB0aGF0IGluIE1NWCAoaGFzIGJlZW4gZG9uZSBpbiBwcmV2aW91cyB2ZXJzaW9uLCBidXQgZGlkIG5vdCBmb2xsb3cgc29tZSBuZXcgZm9uY3Rpb25uYWxpdGllcykgKi8KKyAgICB5ID0gZGF0YS0+cHJldlggKiBkYXRhLT5wcmV2WSAqIDI7CisgICAgZm9yICh4ID0gMDsgeCA8IHk7IHggKz0gMikgeworICAgICAgaW50IGJydXRTbXlwb3MgPSBkYXRhLT5icnV0U1t4XTsKKyAgICAgIGludCB4MiA9IHggKyAxOworCisgICAgICBkYXRhLT5icnV0U1t4XSA9CisgICAgICAgICAgYnJ1dFNteXBvcyArICgoKGRhdGEtPmJydXREW3hdIC0KKyAgICAgICAgICAgICAgICAgIGJydXRTbXlwb3MpICogZGF0YS0+YnVmZnJhdGlvKSA+PiBCVUZGUE9JTlROQik7CisgICAgICBicnV0U215cG9zID0gZGF0YS0+YnJ1dFNbeDJdOworICAgICAgZGF0YS0+YnJ1dFNbeDJdID0KKyAgICAgICAgICBicnV0U215cG9zICsgKCgoZGF0YS0+YnJ1dERbeDJdIC0KKyAgICAgICAgICAgICAgICAgIGJydXRTbXlwb3MpICogZGF0YS0+YnVmZnJhdGlvKSA+PiBCVUZGUE9JTlROQik7CisgICAgfQorICAgIGRhdGEtPmJ1ZmZyYXRpbyA9IDA7CisgIH0KKworICBpZiAoZGF0YS0+aW50ZXJsYWNlX3N0YXJ0ID09IC0xKSB7CisgICAgc2lnbmVkIGludCAqdG1wOworCisgICAgdG1wID0gZGF0YS0+YnJ1dEQ7CisgICAgZGF0YS0+YnJ1dEQgPSBkYXRhLT5icnV0VDsKKyAgICBkYXRhLT5icnV0VCA9IHRtcDsKKyAgICB0bXAgPSBkYXRhLT5mcmVlYnJ1dEQ7CisgICAgZGF0YS0+ZnJlZWJydXREID0gZGF0YS0+ZnJlZWJydXRUOworICAgIGRhdGEtPmZyZWVicnV0VCA9IHRtcDsKKyAgICBkYXRhLT5pbnRlcmxhY2Vfc3RhcnQgPSAtMjsKKyAgfQorCisgIGlmIChkYXRhLT5pbnRlcmxhY2Vfc3RhcnQgPj0gMCkgeworICAgIC8qIGNyZWF0aW9uIGRlIGxhIG5vdXZlbGxlIGRlc3RpbmF0aW9uICovCisgICAgbWFrZVpvb21CdWZmZXJTdHJpcGUgKGRhdGEsIHJlc3kgLyAxNik7CisgIH0KKworICBpZiAoc3dpdGNoSW5jciAhPSAwKSB7CisgICAgZGF0YS0+YnVmZnJhdGlvICs9IHN3aXRjaEluY3I7CisgICAgaWYgKGRhdGEtPmJ1ZmZyYXRpbyA+IEJVRkZQT0lOVE1BU0spCisgICAgICBkYXRhLT5idWZmcmF0aW8gPSBCVUZGUE9JTlRNQVNLOworICB9CisKKyAgaWYgKHN3aXRjaE11bHQgIT0gMS4wZikgeworICAgIGRhdGEtPmJ1ZmZyYXRpbyA9IChpbnQpICgoZmxvYXQpIEJVRkZQT0lOVE1BU0sgKiAoMS4wZiAtIHN3aXRjaE11bHQpICsKKyAgICAgICAgKGZsb2F0KSBkYXRhLT5idWZmcmF0aW8gKiBzd2l0Y2hNdWx0KTsKKyAgfQorCisgIGRhdGEtPnpvb21fd2lkdGggPSBkYXRhLT5wcmV2WDsKKworICBnb29tSW5mby0+bWV0aG9kcy56b29tX2ZpbHRlciAoZGF0YS0+cHJldlgsIGRhdGEtPnByZXZZLCBwaXgxLCBwaXgyLAorICAgICAgZGF0YS0+YnJ1dFMsIGRhdGEtPmJydXRELCBkYXRhLT5idWZmcmF0aW8sIGRhdGEtPnByZWNhbENvZWYpOworfQorCitzdGF0aWMgdm9pZAorZ2VuZXJhdGVQcmVjYWxDb2VmIChpbnQgcHJlY2FsQ29lZlsxNl1bMTZdKQoreworICBpbnQgY29lZmgsIGNvZWZ2OworCisgIGZvciAoY29lZmggPSAwOyBjb2VmaCA8IDE2OyBjb2VmaCsrKSB7CisgICAgZm9yIChjb2VmdiA9IDA7IGNvZWZ2IDwgMTY7IGNvZWZ2KyspIHsKKworICAgICAgaW50IGk7CisgICAgICBpbnQgZGlmZmNvZWZmaDsKKyAgICAgIGludCBkaWZmY29lZmZ2OworCisgICAgICBkaWZmY29lZmZoID0gc3FydHBlcnRlIC0gY29lZmg7CisgICAgICBkaWZmY29lZmZ2ID0gc3FydHBlcnRlIC0gY29lZnY7CisKKyAgICAgIGlmICghKGNvZWZoIHx8IGNvZWZ2KSkgeworICAgICAgICBpID0gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgVWludCBpMSwgaTIsIGkzLCBpNDsKKworICAgICAgICBpMSA9IGRpZmZjb2VmZmggKiBkaWZmY29lZmZ2OworICAgICAgICBpMiA9IGNvZWZoICogZGlmZmNvZWZmdjsKKyAgICAgICAgaTMgPSBkaWZmY29lZmZoICogY29lZnY7CisgICAgICAgIGk0ID0gY29lZmggKiBjb2VmdjsKKworICAgICAgICAvLyBUT0RPOiBmYWlyZSBtaWV1eC4uLgorICAgICAgICBpZiAoaTEpCisgICAgICAgICAgaTEtLTsKKyAgICAgICAgaWYgKGkyKQorICAgICAgICAgIGkyLS07CisgICAgICAgIGlmIChpMykKKyAgICAgICAgICBpMy0tOworICAgICAgICBpZiAoaTQpCisgICAgICAgICAgaTQtLTsKKworICAgICAgICBpID0gKGkxKSB8IChpMiA8PCA4KSB8IChpMyA8PCAxNikgfCAoaTQgPDwgMjQpOworICAgICAgfQorICAgICAgcHJlY2FsQ29lZltjb2VmaF1bY29lZnZdID0gaTsKKyAgICB9CisgIH0KK30KKworLyogVmlzdWFsRlggV3JhcHBlciAqLworCitzdGF0aWMgdm9pZAorem9vbUZpbHRlclZpc3VhbEZYV3JhcHBlcl9pbml0IChzdHJ1Y3QgX1ZJU1VBTF9GWCAqX3RoaXMsIFBsdWdpbkluZm8gKiBpbmZvKQoreworICBab29tRmlsdGVyRlhXcmFwcGVyRGF0YSAqZGF0YSA9CisgICAgICAoWm9vbUZpbHRlckZYV3JhcHBlckRhdGEgKikgbWFsbG9jIChzaXplb2YgKFpvb21GaWx0ZXJGWFdyYXBwZXJEYXRhKSk7CisKKyAgZGF0YS0+Y29lZmZzID0gMDsKKyAgZGF0YS0+ZnJlZWNvZWZmcyA9IDA7CisgIGRhdGEtPmJydXRTID0gMDsKKyAgZGF0YS0+ZnJlZWJydXRTID0gMDsKKyAgZGF0YS0+YnJ1dEQgPSAwOworICBkYXRhLT5mcmVlYnJ1dEQgPSAwOworICBkYXRhLT5icnV0VCA9IDA7CisgIGRhdGEtPmZyZWVicnV0VCA9IDA7CisgIGRhdGEtPnByZXZYID0gMDsKKyAgZGF0YS0+cHJldlkgPSAwOworCisgIGRhdGEtPm11c3RJbml0QnVmZmVycyA9IDE7CisgIGRhdGEtPmludGVybGFjZV9zdGFydCA9IC0yOworCisgIGRhdGEtPmdlbmVyYWxfc3BlZWQgPSAwLjBmOworICBkYXRhLT5yZXZlcnNlID0gMDsKKyAgZGF0YS0+dGhlTW9kZSA9IEFNVUxFVFRFX01PREU7CisgIGRhdGEtPndhdmVFZmZlY3QgPSAwOworICBkYXRhLT5oeXBlcmNvc0VmZmVjdCA9IDA7CisgIGRhdGEtPnZQbGFuZUVmZmVjdCA9IDA7CisgIGRhdGEtPmhQbGFuZUVmZmVjdCA9IDA7CisgIGRhdGEtPm5vaXNpZnkgPSAyOworCisgICAgLyoqIG1vZGlmIGJ5IGpla28gOiBmaXhlZHBvaW50IDogYnVmZnJhdGlvbiA9ICgxNjoxNikgKGRvbmMgMDw9YnVmZnJhdGlvbjw9Ml4xNikgKi8KKyAgZGF0YS0+YnVmZnJhdGlvID0gMDsKKyAgZGF0YS0+ZmlyZWRlYyA9IDA7CisKKyAgZGF0YS0+d2F2ZSA9IGRhdGEtPndhdmVzcCA9IDA7CisKKyAgc2VjdXJlX2JfcGFyYW0gKCZkYXRhLT5lbmFibGVkX2JwLCAiRW5hYmxlZCIsIDEpOworCisgIHBsdWdpbl9wYXJhbWV0ZXJzICgmZGF0YS0+cGFyYW1zLCAiWm9vbSBGaWx0ZXIiLCAxKTsKKyAgZGF0YS0+cGFyYW1zLnBhcmFtc1swXSA9ICZkYXRhLT5lbmFibGVkX2JwOworCisgIF90aGlzLT5wYXJhbXMgPSAmZGF0YS0+cGFyYW1zOworICBfdGhpcy0+ZnhfZGF0YSA9ICh2b2lkICopIGRhdGE7CisKKyAgICAvKiogbW9kaWYgZCdvcHRpbSBieSBKZWtvIDogcHJlY2FsY3VsIGRlcyA0IGNvZWZzIHJlc3VsdGFudCBkZXMgMiBwb3MgKi8KKyAgZ2VuZXJhdGVQcmVjYWxDb2VmIChkYXRhLT5wcmVjYWxDb2VmKTsKK30KKworc3RhdGljIHZvaWQKK3pvb21GaWx0ZXJWaXN1YWxGWFdyYXBwZXJfZnJlZSAoc3RydWN0IF9WSVNVQUxfRlggKl90aGlzKQoreworICBab29tRmlsdGVyRlhXcmFwcGVyRGF0YSAqZGF0YSA9IChab29tRmlsdGVyRlhXcmFwcGVyRGF0YSAqKSBfdGhpcy0+ZnhfZGF0YTsKKworICBpZiAoZGF0YS0+ZnJlZWJydXRUKQorICAgIGZyZWUgKGRhdGEtPmZyZWVicnV0VCk7CisgIGlmIChkYXRhLT5mcmVlYnJ1dFMpCisgICAgZnJlZSAoZGF0YS0+ZnJlZWJydXRTKTsKKyAgaWYgKGRhdGEtPmZyZWVicnV0RCkKKyAgICBmcmVlIChkYXRhLT5mcmVlYnJ1dEQpOworICBpZiAoZGF0YS0+ZmlyZWRlYykKKyAgICBmcmVlIChkYXRhLT5maXJlZGVjKTsKKworICBnb29tX3BsdWdpbl9wYXJhbWV0ZXJzX2ZyZWUgKF90aGlzLT5wYXJhbXMpOworCisgIGZyZWUgKF90aGlzLT5meF9kYXRhKTsKK30KKworc3RhdGljIHZvaWQKK3pvb21GaWx0ZXJWaXN1YWxGWFdyYXBwZXJfYXBwbHkgKHN0cnVjdCBfVklTVUFMX0ZYICpfdGhpcywgUGl4ZWwgKiBzcmMsCisgICAgUGl4ZWwgKiBkZXN0LCBQbHVnaW5JbmZvICogaW5mbykKK3sKK30KKwordm9pZAorem9vbUZpbHRlclZpc3VhbEZYV3JhcHBlcl9jcmVhdGUgKFZpc3VhbEZYICogZngpCit7CisgIGZ4LT5pbml0ID0gem9vbUZpbHRlclZpc3VhbEZYV3JhcHBlcl9pbml0OworICBmeC0+ZnJlZSA9IHpvb21GaWx0ZXJWaXN1YWxGWFdyYXBwZXJfZnJlZTsKKyAgZngtPmFwcGx5ID0gem9vbUZpbHRlclZpc3VhbEZYV3JhcHBlcl9hcHBseTsKKyAgZngtPnBhcmFtcyA9IE5VTEw7CisgIGZ4LT5meF9kYXRhID0gTlVMTDsKK30KKworCisvKiBUT0RPIDogTU9WRSBUSElTIEFXQVkgKi8KKwordm9pZAorcG9pbnRGaWx0ZXIgKFBsdWdpbkluZm8gKiBnb29tSW5mbywgUGl4ZWwgKiBwaXgxLCBDb2xvciBjLCBmbG9hdCB0MSwgZmxvYXQgdDIsCisgICAgZmxvYXQgdDMsIGZsb2F0IHQ0LCBVaW50IGN5Y2xlKQoreworICBVaW50IHggPSAoVWludCkgKChpbnQpIChnb29tSW5mby0+c2NyZWVuLndpZHRoIC8gMikKKyAgICAgICsgKGludCkgKHQxICogY29zICgoZmxvYXQpIGN5Y2xlIC8gdDMpKSk7CisgIFVpbnQgeSA9IChVaW50KSAoKGludCkgKGdvb21JbmZvLT5zY3JlZW4uaGVpZ2h0IC8gMikKKyAgICAgICsgKGludCkgKHQyICogc2luICgoZmxvYXQpIGN5Y2xlIC8gdDQpKSk7CisKKyAgaWYgKCh4ID4gMSkgJiYgKHkgPiAxKSAmJiAoeCA8IGdvb21JbmZvLT5zY3JlZW4ud2lkdGggLSAyKQorICAgICAgJiYgKHkgPCBnb29tSW5mby0+c2NyZWVuLmhlaWdodCAtIDIpKSB7CisgICAgc2V0UGl4ZWxSR0IgKGdvb21JbmZvLCBwaXgxLCB4ICsgMSwgeSwgYyk7CisgICAgc2V0UGl4ZWxSR0IgKGdvb21JbmZvLCBwaXgxLCB4LCB5ICsgMSwgYyk7CisgICAgc2V0UGl4ZWxSR0IgKGdvb21JbmZvLCBwaXgxLCB4ICsgMSwgeSArIDEsIFdISVRFKTsKKyAgICBzZXRQaXhlbFJHQiAoZ29vbUluZm8sIHBpeDEsIHggKyAyLCB5ICsgMSwgYyk7CisgICAgc2V0UGl4ZWxSR0IgKGdvb21JbmZvLCBwaXgxLCB4ICsgMSwgeSArIDIsIGMpOworICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvZ29vbS9maWx0ZXJzX21teC5zIGIvZ3N0L2dvb20vZmlsdGVyc19tbXgucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzIwZDA1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vZmlsdGVyc19tbXgucwpAQCAtMCwwICsxLDIxNiBAQAorOyBHb29tIFByb2plY3QKKzsgQ29weXJpZ2h0IChDKSA8MjAwMT4gSmVhbi1DaHJpc3RvcGhlIEhvZWx0IDxqZWtvQGZyZWUuZnI+Cis7Cis7IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKzsgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsKKzsgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOworOyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworOyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorOyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKzsgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCis7Cis7Ly8KKzsvLyBoaXN0b3J5Cis7Ly8gMDcvMDEvMjAwMSA6IENoYW5naW5nIEZFTU1TIHRvIEVNTVMgOiBzbG93ZXIuLi4gYnV0IHJ1biBvbiBpbnRlbCBtYWNoaW5lcworOy8vCTAzLzAxLzIwMDEgOiBXSURUSCBhbmQgSEVJR0hUIGFyZSBub3cgdmFyaWFibGUKKzsvLwkyOC8xMi8yMDAwIDogYWRkaW5nIGNvbW1lbnRzIHRvIHRoZSBjb2RlLCBzdXBwcmVzcyBzb21lIHVzZWxlc3MgbGluZXMKKzsvLwkyNy8xMi8yMDAwIDogcmVkdWNpbmcgbWVtb3J5IGFjY2Vzcy4uLiBpbXByb3ZpbmcgcGVyZm9ybWFuY2UgYnkgMjAlCis7Ly8JCWNvZWZmaWNpZW50cyBhcmUgbm93IG9uIDEgYnl0ZQorOy8vCTIyLzEyLzIwMDAgOiBDaGFuZ2luZyBkYXRhIHN0cnVjdHVyZQorOy8vCTE2LzEyLzIwMDAgOiBBVCZUIHZlcnNpb24KKzsvLwkxNC8xMi8yMDAwIDogdW5yb2xsaW5nIGxvb3AKKzsvLwkxMi8xMi8yMDAwIDogNjQgYml0cyBtZW1vcnkgYWNjZXNzCisKKworLmRhdGEKKworY2hhaW5lOgorCS5zdHJpbmcJInBvcyA9ICVkXG5cMCIKKwkubG9uZyAweDAKKwkJCit0aGV6ZXJvOgorCS5sb25nIDB4MDAwMDAwMDAKKwkubG9uZyAweDAwMDAwMDAwCisKKy50ZXh0CisKKy5nbG9ibCBtbXhfem9vbQkJOy8vIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgYnkgQyBwcm9ncmFtCisvKiAuZXh0ZXJuIGNvZWZmcwkJOy8vIHRoZSB0cmFuc2Zvcm1hdGlvbiBidWZmZXIgKi8KKy5leHRlcm4gZXhwaXgxLGV4cGl4MiA7Ly8gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYnVmZmVyCisuZXh0ZXJuIG1teF96b29tX3NpemUsIHpvb21fd2lkdGggOy8vIHNpemUgb2YgdGhlIGJ1ZmZlcnMKKworLmV4dGVybiBicnV0UyxicnV0RCxidWZmcmF0aW8scHJlY2FsQ29lZixwcmV2WCxwcmV2WQorCisjZGVmaW5lIFBFUlRFTUFTSyAxNQorLyogZmFpcmUgOiBhIC8gc3FydHBlcnRlIDw9PiBhID4+IFBFUlRFREVDKi8KKyNkZWZpbmUgUEVSVEVERUMgNAorCisuYWxpZ24gMTYKK21teF96b29tOgorCisJCXB1c2hsICVlYnAKKwkJbW92bCAlZXNwLCVlYnAKKwkJc3VibCAkMTIsJWVzcAorCisJCW1vdmwgcHJldlgsJWVheAorCQlkZWNsICVlYXgKKwkJc2FybCAkNCwlZWF4CisJCW1vdmwgJWVheCwtNCglZWJwKQorCisJCW1vdmwgcHJldlksJWVheAorCQlkZWNsICVlYXgKKwkJc2FybCAkNCwlZWF4CisJCW1vdmwgJWVheCwtOCglZWJwKQorCis7Ly8gaW5pdGlhbGlzYXRpb24gZHUgbW03IO+/vSB6ZXJvCisJCW1vdnEgKHRoZXplcm8pLCAlbW03CisKK21vdmwgbW14X3pvb21fc2l6ZSwgJWVjeAorZGVjbCAlZWN4CisKKy53aGlsZToKKwk7Ly8gZXNpIDwtIG5vdXZlbGxlIHBvc2l0aW9uCisJbW92bCBicnV0UywgJWVheAorCWxlYWwgKCVlYXgsICVlY3gsIDgpLCVlYXgKKworCW1vdmwgKCVlYXgpLCVlZHggLyogPSBicnV0Uy5weCAoYnJ1dFNteXBvcykgKi8KKwltb3ZsIDQoJWVheCksJWVheCAvKiA9IGJydXRTLnB5ICovCisKKwltb3ZsIGJydXRELCVlYngKKwlsZWFsICglZWJ4LCAlZWN4LCA4KSwlZWJ4CisJbW92bCAoJWVieCksJWVzaQorCXN1YmwgJWVkeCwgJWVzaQorCWltdWxsIGJ1ZmZyYXRpbywlZXNpCisJc2FybCAkMTYsJWVzaQorCWFkZGwgJWVkeCwlZXNpIC8qIGVzaSA9IHB4ICovCisKKwkvKiBlYXggY29udGllbnQgZGVqYSBicnV0Uy5weSA9IGxlIG5vdXZlYXUgYnJ1dFNteXBvcyovCisJLyogZWJ4IHBvaW50ZSBzdXIgYnJ1dERbbXlQb3NdICovCisJbW92bCA0KCVlYngpLCVlZGkKKwlzdWJsICVlYXgsJWVkaQorCWltdWxsIGJ1ZmZyYXRpbywlZWRpCisJc2FybCAkMTYsJWVkaQorCWFkZGwgJWVheCwlZWRpIC8qIGVkaSA9IHB5ICovCisKKy8qCQlwdXNobCAlZWF4CisJCXB1c2hsICVlYngqLworLyoJCXBvcGwgJWVieAorCQlwb3BsICVlYXgqLworCQkKKwltb3ZsICVlc2ksJWVheAorCWFuZGwgJDE1LCVlYXggLyogZWF4ID0gY29lZmggKi8KKwltb3ZsICVlZGksJWVieAorCWFuZGwgJDE1LCVlYnggLyogZWJ4ID0gY29lZnYgKi8KKworCWxlYWwgMCgsJWVieCw0KSwlZWJ4CisJc2FsbCAkNiwlZWF4CisJYWRkbCAlZWJ4LCVlYXgKKwltb3ZsICRwcmVjYWxDb2VmLCVlYngKKy8qCW1vdmQgKCVlYXgsJWVieCksJW1tNiovIC8qIG1tNiA9IGNvZWZmcyAqLworCisJY21wbCAtOCglZWJwKSwlZWRpCisJamdlIC50aGVuMQorCWNtcGwgLTQoJWVicCksJWVzaQorCWpnZSAudGhlbjEKKworCXNhcmwgJDQsJWVzaQorCXNhcmwgJDQsJWVkaQorCWltdWxsIHpvb21fd2lkdGgsJWVkaQorCWxlYWwgKCVlc2ksJWVkaSksJWVzaQorCWptcCAuZmluc2kxCisKKy50aGVuMToKKwltb3ZsICQwLCVlc2kKKy5maW5zaTE6CisKKwkvKiogYXByZXMgY2UgY2FsY3VsLCAlZXNpID0gcG9zLCAlbW02ID0gY29lZmZzICoqLworLyoJcHVzaGwgJWVzaQorCXB1c2hsICRjaGFpbmUKKwljYWxsIHByaW50ZgorCWFkZGwgJDgsJWVzcCovCisKKwltb3ZsIGV4cGl4MSwlZWF4CisKKwk7Ly8gcmVjdXBlcmF0aW9uIGRlcyBkZXV4IHByZW1pZXJzIHBpeGVscyBkYW5zIG1tMCBldCBtbTEKKy8qCW1vdnEgKCVlYXgsJWVzaSw0KSwgJW1tMAkJLyogYjEtdjEtcjEtYTEtYjItdjItcjItYTIgKi8KKwltb3ZxICVtbTAsICVtbTEJCQkJLyogYjEtdjEtcjEtYTEtYjItdjItcjItYTIgKi8KKworCTsvLyBkZXBhY2thZ2UgZHUgcHJlbWllciBwaXhlbAorCXB1bnBja2xidyAlbW03LCAlbW0wCS8qIDAwLWIyLTAwLXYyLTAwLXIyLTAwLWEyICovCisKKwltb3ZxICVtbTYsICVtbTUJCQkvKiA/Py0/Py0/Py0/Py1jNC1jMy1jMi1jMSAqLworCTsvLyBkZXBhY2thZ2UgZHUgMmllbWUgcGl4ZWwKKwlwdW5wY2toYncgJW1tNywgJW1tMQkvKiAwMC1iMS0wMC12MS0wMC1yMS0wMC1hMSAqLworCisJOy8vIGV4dHJhY3Rpb24gZGVzIGNvZWZmaWNpZW50cy4uLgorCXB1bnBja2xidyAlbW01LCAlbW02CS8qIGM0LWM0LWMzLWMzLWMyLWMyLWMxLWMxICovCisJbW92cSAlbW02LCAlbW00CQkJLyogYzQtYzQtYzMtYzMtYzItYzItYzEtYzEgKi8KKwltb3ZxICVtbTYsICVtbTUJCQkvKiBjNC1jNC1jMy1jMy1jMi1jMi1jMS1jMSAqLworCisJcHVucGNrbGJ3ICVtbTUsICVtbTYJLyogYzItYzItYzItYzItYzEtYzEtYzEtYzEgKi8KKwlwdW5wY2toYncgJW1tNSwgJW1tNAkvKiBjNC1jNC1jNC1jNC1jMy1jMy1jMy1jMyAqLworCisJbW92cSAlbW02LCAlbW0zCQkJLyogYzItYzItYzItYzItYzEtYzEtYzEtYzEgKi8KKwlwdW5wY2tsYncgJW1tNywgJW1tNgkvKiAwMC1jMS0wMC1jMS0wMC1jMS0wMC1jMSAqLworCXB1bnBja2hidyAlbW03LCAlbW0zCS8qIDAwLWMyLTAwLWMyLTAwLWMyLTAwLWMyICovCisJCisJOy8vIG11bHRpcGxpY2F0aW9uIGRlcyBwaXhlbHMgcGFyIGxlcyBjb2VmZmljaWVudHMKKwlwbXVsbHcgJW1tNiwgJW1tMAkJLyogYzEqYjItYzEqdjItYzEqcjItYzEqYTIgKi8KKwlwbXVsbHcgJW1tMywgJW1tMQkJLyogYzIqYjEtYzIqdjEtYzIqcjEtYzIqYTEgKi8KKwlwYWRkdyAlbW0xLCAlbW0wCisJCisJOy8vIC4uLmV4dHJhY3Rpb24gZGVzIDIgZGVybmllcnMgY29lZmZpY2llbnRzCisJbW92cSAlbW00LCAlbW01CQkJLyogYzQtYzQtYzQtYzQtYzMtYzMtYzMtYzMgKi8KKwlwdW5wY2tsYncgJW1tNywgJW1tNAkvKiAwMC1jMy0wMC1jMy0wMC1jMy0wMC1jMyAqLworCXB1bnBja2hidyAlbW03LCAlbW01CS8qIDAwLWM0LTAwLWM0LTAwLWM0LTAwLWM0ICovCisKKwkvKiBham91dGVyIGxhIGxvbmd1ZXVyIGRlIGxpZ25lIGEgZXNpICovCisJYWRkbCBwcmV2WCwlZXNpCisJCQorCTsvLyByZWN1cGVyYXRpb24gZGVzIDIgZGVybmllcnMgcGl4ZWxzCisvKgltb3ZxICglZWF4LCVlc2ksNCksICVtbTEqLworCW1vdnEgJW1tMSwgJW1tMgorCQorCTsvLyBkZXBhY2thZ2UgZGVzIHBpeGVscworCXB1bnBja2xidyAlbW03LCAlbW0xCisJcHVucGNraGJ3ICVtbTcsICVtbTIKKwkKKwk7Ly8gbXVsdGlwbGljYXRpb24gcGFzIGxlcyBjb2VmZnMKKwlwbXVsbHcgJW1tNCwgJW1tMQorCXBtdWxsdyAlbW01LCAlbW0yCisJCisJOy8vIGFqb3V0IGRlcyB2YWxldXJzIG9idGVudWVzIO+/vSBsYSB2YWxldXIgZmluYWxlCisJcGFkZHcgJW1tMSwgJW1tMAorCXBhZGR3ICVtbTIsICVtbTAKKworCTsvLyBkaXZpc2lvbiBwYXIgMjU2ID0gMTYrMTYrMTYrMTYsIHB1aXMgcmVwYWNrYWdlIGR1IHBpeGVsIGZpbmFsCisJcHNybHcgJDgsICVtbTAKKwlwYWNrdXN3YiAlbW03LCAlbW0wCisJCisJOy8vIHBhc3NhZ2UgYXUgc3VpdmFudAorCisJOy8vIGVucmVnaXN0cmVtZW50IGR1IHJlc3VsdGF0CisJbW92bCBleHBpeDIsJWVheAorLyoJbW92ZCAlbW0wLCglZWF4LCVlY3gsNCkqLworCisJZGVjbCAlZWN4CisJOy8vIHRlc3QgZGUgZmluIGR1IHRhbnRxdWUKKwljbXBsICQwLCAlZWN4CQkJCTsvLyA0MDB4MzAwCisKKwlqeiAuZmluX3doaWxlCisJam1wIC53aGlsZQorCisuZmluX3doaWxlOgorCWVtbXMKKworCW1vdmwgJWVicCwlZXNwCisJcG9wbCAlZWJwCisKKwlyZXQgICAgICAgICAgICAgICAgICA7Ly9UaGUgRW5kCmRpZmYgLS1naXQgYS9nc3QvZ29vbS9mbHlpbmdfc3RhcnNfZnguYyBiL2dzdC9nb29tL2ZseWluZ19zdGFyc19meC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMzVlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9mbHlpbmdfc3RhcnNfZnguYwpAQCAtMCwwICsxLDM2MSBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgImdvb21fZnguaCIKKyNpbmNsdWRlICJnb29tX3BsdWdpbl9pbmZvLmgiCisjaW5jbHVkZSAiZ29vbV90b29scy5oIgorCisjaW5jbHVkZSAibWF0aHRvb2xzLmgiCisKKy8qIFRPRE86LS0gRkFJUkUgUFJPUFJFTUVOVC4uLiBCT0FILi4uICovCisjZGVmaW5lIE5DT0wgMTUKKworLypzdGF0aWMgY29uc3QgaW50IGNvbHZhbFtdID0geworMHhmZGY2ZjUsCisweGZhZTRlNCwKKzB4ZjdkMWQxLAorMHhmM2I2YjUsCisweGVmYTJhMiwKKzB4ZWM5MTkwLAorMHhlYTgyODIsCisweGU4NzU3NSwKKzB4ZTQ2MDYwLAorMHhlMTRiNGMsCisweGRlM2IzYiwKKzB4ZGMyZDJmLAorMHhkOTI3MjYsCisweGQ4MTYxOSwKKzB4ZDUwYzA5LAorMAorfTsKKyovCitzdGF0aWMgY29uc3QgaW50IGNvbHZhbFtdID0geworICAweDE0MTYxODFhLAorICAweDE0MTkxODFhLAorICAweDE0MWYxODFhLAorICAweDE0MjYxODFhLAorICAweDE0MmExODFhLAorICAweDE0MmYxODFhLAorICAweDE0MzYxODFhLAorICAweDE0MmYxODE5LAorICAweDE0MjYxNjE1LAorICAweDEzMjAxNDExLAorICAweDExMWExMDBhLAorICAweDBjMTgwNTA4LAorICAweDA4MTAwMzA0LAorICAweDAwMDUwMTAxLAorICAweDAKK307CisKKworLyogVGhlIGRpZmZlcmVudCBtb2RlcyBvZiB0aGUgdmlzdWFsIEZYLgorICogUHV0IHRoaXMgdmFsdWVzIG9uIGZ4X21vZGUgKi8KKyNkZWZpbmUgRklSRVdPUktTX0ZYIDAKKyNkZWZpbmUgUkFJTl9GWCAxCisjZGVmaW5lIEZPVU5UQUlOX0ZYIDIKKyNkZWZpbmUgTEFTVF9GWCAzCisKK3R5cGVkZWYgc3RydWN0IF9GU19TVEFSCit7CisgIGZsb2F0IHgsIHk7CisgIGZsb2F0IHZ4LCB2eTsKKyAgZmxvYXQgYXgsIGF5OworICBmbG9hdCBhZ2UsIHZhZ2U7Cit9IFN0YXI7CisKK3R5cGVkZWYgc3RydWN0IF9GU19EQVRBCit7CisKKyAgaW50IGZ4X21vZGU7CisgIGludCBuYlN0YXJzOworCisgIGludCBtYXhTdGFyczsKKyAgU3RhciAqc3RhcnM7CisKKyAgZmxvYXQgbWluX2FnZTsKKyAgZmxvYXQgbWF4X2FnZTsKKworICBQbHVnaW5QYXJhbSBtaW5fYWdlX3A7CisgIFBsdWdpblBhcmFtIG1heF9hZ2VfcDsKKyAgUGx1Z2luUGFyYW0gbmJTdGFyc19wOworICBQbHVnaW5QYXJhbSBuYlN0YXJzX2xpbWl0X3A7CisgIFBsdWdpblBhcmFtIGZ4X21vZGVfcDsKKworICBQbHVnaW5QYXJhbWV0ZXJzIHBhcmFtczsKK30gRlNEYXRhOworCitzdGF0aWMgdm9pZAorZnNfaW5pdCAoVmlzdWFsRlggKiBfdGhpcywgUGx1Z2luSW5mbyAqIGluZm8pCit7CisKKyAgRlNEYXRhICpkYXRhOworCisgIGRhdGEgPSAoRlNEYXRhICopIG1hbGxvYyAoc2l6ZW9mIChGU0RhdGEpKTsKKworICBkYXRhLT5meF9tb2RlID0gRklSRVdPUktTX0ZYOworICBkYXRhLT5tYXhTdGFycyA9IDQwOTY7CisgIGRhdGEtPnN0YXJzID0gKFN0YXIgKikgbWFsbG9jIChkYXRhLT5tYXhTdGFycyAqIHNpemVvZiAoU3RhcikpOworICBkYXRhLT5uYlN0YXJzID0gMDsKKworICBzZWN1cmVfaV9wYXJhbSAoJmRhdGEtPm1heF9hZ2VfcCwgIkZpcmV3b3JrcyBTbWFsbGVzdCBCb21icyIpOworICBJVkFMIChkYXRhLT5tYXhfYWdlX3ApID0gODA7CisgIElNSU4gKGRhdGEtPm1heF9hZ2VfcCkgPSAwOworICBJTUFYIChkYXRhLT5tYXhfYWdlX3ApID0gMTAwOworICBJU1RFUCAoZGF0YS0+bWF4X2FnZV9wKSA9IDE7CisKKyAgc2VjdXJlX2lfcGFyYW0gKCZkYXRhLT5taW5fYWdlX3AsICJGaXJld29ya3MgTGFyZ2VzdCBCb21icyIpOworICBJVkFMIChkYXRhLT5taW5fYWdlX3ApID0gOTk7CisgIElNSU4gKGRhdGEtPm1pbl9hZ2VfcCkgPSAwOworICBJTUFYIChkYXRhLT5taW5fYWdlX3ApID0gMTAwOworICBJU1RFUCAoZGF0YS0+bWluX2FnZV9wKSA9IDE7CisKKyAgc2VjdXJlX2lfcGFyYW0gKCZkYXRhLT5uYlN0YXJzX2xpbWl0X3AsICJNYXggTnVtYmVyIG9mIFBhcnRpY3VsZXMiKTsKKyAgSVZBTCAoZGF0YS0+bmJTdGFyc19saW1pdF9wKSA9IDUxMjsKKyAgSU1JTiAoZGF0YS0+bmJTdGFyc19saW1pdF9wKSA9IDA7CisgIElNQVggKGRhdGEtPm5iU3RhcnNfbGltaXRfcCkgPSBkYXRhLT5tYXhTdGFyczsKKyAgSVNURVAgKGRhdGEtPm5iU3RhcnNfbGltaXRfcCkgPSA2NDsKKworICBzZWN1cmVfaV9wYXJhbSAoJmRhdGEtPmZ4X21vZGVfcCwgIkZYIE1vZGUiKTsKKyAgSVZBTCAoZGF0YS0+ZnhfbW9kZV9wKSA9IGRhdGEtPmZ4X21vZGU7CisgIElNSU4gKGRhdGEtPmZ4X21vZGVfcCkgPSAxOworICBJTUFYIChkYXRhLT5meF9tb2RlX3ApID0gMzsKKyAgSVNURVAgKGRhdGEtPmZ4X21vZGVfcCkgPSAxOworCisgIHNlY3VyZV9mX2ZlZWRiYWNrICgmZGF0YS0+bmJTdGFyc19wLCAiTnVtYmVyIG9mIFBhcnRpY3VsZXMgKCUgb2YgTWF4KSIpOworCisgIHBsdWdpbl9wYXJhbWV0ZXJzICgmZGF0YS0+cGFyYW1zLCAiUGFydGljdWxlIFN5c3RlbSIsIDcpOworICBkYXRhLT5wYXJhbXMucGFyYW1zWzBdID0gJmRhdGEtPmZ4X21vZGVfcDsKKyAgZGF0YS0+cGFyYW1zLnBhcmFtc1sxXSA9ICZkYXRhLT5uYlN0YXJzX2xpbWl0X3A7CisgIGRhdGEtPnBhcmFtcy5wYXJhbXNbMl0gPSAwOworICBkYXRhLT5wYXJhbXMucGFyYW1zWzNdID0gJmRhdGEtPm1pbl9hZ2VfcDsKKyAgZGF0YS0+cGFyYW1zLnBhcmFtc1s0XSA9ICZkYXRhLT5tYXhfYWdlX3A7CisgIGRhdGEtPnBhcmFtcy5wYXJhbXNbNV0gPSAwOworICBkYXRhLT5wYXJhbXMucGFyYW1zWzZdID0gJmRhdGEtPm5iU3RhcnNfcDsKKworICBfdGhpcy0+cGFyYW1zID0gJmRhdGEtPnBhcmFtczsKKyAgX3RoaXMtPmZ4X2RhdGEgPSAodm9pZCAqKSBkYXRhOworfQorCitzdGF0aWMgdm9pZAorZnNfZnJlZSAoVmlzdWFsRlggKiBfdGhpcykKK3sKKyAgRlNEYXRhICpkYXRhID0gKEZTRGF0YSAqKSBfdGhpcy0+ZnhfZGF0YTsKKworICBnb29tX3BsdWdpbl9wYXJhbWV0ZXJzX2ZyZWUgKCZkYXRhLT5wYXJhbXMpOworCisgIGZyZWUgKGRhdGEtPnN0YXJzKTsKKyAgZnJlZSAoX3RoaXMtPmZ4X2RhdGEpOworfQorCisKKy8qKgorICogQ3JlZSB1bmUgbm91dmVsbGUgJ2JvbWJlJywgYydlc3QgYSBkaXJlIHVuZSBwYXJ0aWN1bGUgYXBwYXJ0ZW5hbnQgYSB1bmUgZnVzZWUgZCdhcnRpZmljZS4KKyAqLworc3RhdGljIHZvaWQKK2FkZEFCb21iIChGU0RhdGEgKiBmcywgaW50IG14LCBpbnQgbXksIGZsb2F0IHJhZGl1cywgZmxvYXQgdmFnZSwgZmxvYXQgZ3Jhdml0eSwKKyAgICBQbHVnaW5JbmZvICogaW5mbykKK3sKKworICBpbnQgaSA9IGZzLT5uYlN0YXJzOworICBmbG9hdCBybzsKKyAgaW50IHRoZXRhOworCisgIGlmIChmcy0+bmJTdGFycyA+PSBmcy0+bWF4U3RhcnMpCisgICAgcmV0dXJuOworICBmcy0+bmJTdGFycysrOworCisgIGZzLT5zdGFyc1tpXS54ID0gbXg7CisgIGZzLT5zdGFyc1tpXS55ID0gbXk7CisKKyAgcm8gPSByYWRpdXMgKiAoZmxvYXQpIGdvb21faXJhbmQgKGluZm8tPmdSYW5kb20sIDEwMCkgLyAxMDAuMGY7CisgIHJvICo9IChmbG9hdCkgZ29vbV9pcmFuZCAoaW5mby0+Z1JhbmRvbSwgMTAwKSAvIDEwMC4wZiArIDEuMGY7CisgIHRoZXRhID0gZ29vbV9pcmFuZCAoaW5mby0+Z1JhbmRvbSwgMjU2KTsKKworICBmcy0+c3RhcnNbaV0udnggPSBybyAqIGNvczI1Nlt0aGV0YV07CisgIGZzLT5zdGFyc1tpXS52eSA9IC0wLjJmICsgcm8gKiBzaW4yNTZbdGhldGFdOworCisgIGZzLT5zdGFyc1tpXS5heCA9IDA7CisgIGZzLT5zdGFyc1tpXS5heSA9IGdyYXZpdHk7CisKKyAgZnMtPnN0YXJzW2ldLmFnZSA9IDA7CisgIGlmICh2YWdlIDwgZnMtPm1pbl9hZ2UpCisgICAgdmFnZSA9IGZzLT5taW5fYWdlOworICBmcy0+c3RhcnNbaV0udmFnZSA9IHZhZ2U7Cit9CisKKworLyoqCisgKiBNZXQgYSBqb3VyIGxhIHBvc2l0aW9uIGV0IHZpdGVzc2UgZCd1bmUgcGFydGljdWxlLgorICovCitzdGF0aWMgdm9pZAordXBkYXRlU3RhciAoU3RhciAqIHMpCit7CisgIHMtPnggKz0gcy0+dng7CisgIHMtPnkgKz0gcy0+dnk7CisgIHMtPnZ4ICs9IHMtPmF4OworICBzLT52eSArPSBzLT5heTsKKyAgcy0+YWdlICs9IHMtPnZhZ2U7Cit9CisKKworLyoqCisgKiBBam91dGUgZGUgbm91dmVsbGVzIHBhcnRpY3VsZXMgYXUgbW9tZW50IGQndW4gZXZlbmVtZW50IHNvbm9yZS4KKyAqLworc3RhdGljIHZvaWQKK2ZzX3NvdW5kX2V2ZW50X29jY3VyZWQgKFZpc3VhbEZYICogX3RoaXMsIFBsdWdpbkluZm8gKiBpbmZvKQoreworCisgIEZTRGF0YSAqZGF0YSA9IChGU0RhdGEgKikgX3RoaXMtPmZ4X2RhdGE7CisgIGludCBpOworCisgIGludCBtYXggPSAoaW50KSAoKDEuMGYgKyBpbmZvLT5zb3VuZC5nb29tUG93ZXIpICogZ29vbV9pcmFuZCAoaW5mby0+Z1JhbmRvbSwKKyAgICAgICAgICAxNTApKSArIDEwMDsKKyAgZmxvYXQgcmFkaXVzID0KKyAgICAgICgxLjBmICsgaW5mby0+c291bmQuZ29vbVBvd2VyKSAqIChmbG9hdCkgKGdvb21faXJhbmQgKGluZm8tPmdSYW5kb20sCisgICAgICAgICAgMTUwKSArIDUwKSAvIDMwMDsKKyAgaW50IG14OworICBpbnQgbXk7CisgIGZsb2F0IHZhZ2UsIGdyYXZpdHkgPSAwLjAyZjsKKworICBzd2l0Y2ggKGRhdGEtPmZ4X21vZGUpIHsKKyAgICBjYXNlIEZJUkVXT1JLU19GWDoKKyAgICB7CisgICAgICBkb3VibGUgZHgsIGR5OworCisgICAgICBkbyB7CisgICAgICAgIG14ID0gZ29vbV9pcmFuZCAoaW5mby0+Z1JhbmRvbSwgaW5mby0+c2NyZWVuLndpZHRoKTsKKyAgICAgICAgbXkgPSBnb29tX2lyYW5kIChpbmZvLT5nUmFuZG9tLCBpbmZvLT5zY3JlZW4uaGVpZ2h0KTsKKyAgICAgICAgZHggPSAobXggLSBpbmZvLT5zY3JlZW4ud2lkdGggLyAyKTsKKyAgICAgICAgZHkgPSAobXkgLSBpbmZvLT5zY3JlZW4uaGVpZ2h0IC8gMik7CisgICAgICB9IHdoaWxlIChkeCAqIGR4ICsgZHkgKiBkeSA8CisgICAgICAgICAgKGluZm8tPnNjcmVlbi5oZWlnaHQgLyAyKSAqIChpbmZvLT5zY3JlZW4uaGVpZ2h0IC8gMikpOworICAgICAgdmFnZSA9IGRhdGEtPm1heF9hZ2UgKiAoMS4wZiAtIGluZm8tPnNvdW5kLmdvb21Qb3dlcik7CisgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBSQUlOX0ZYOgorICAgICAgbXggPSBnb29tX2lyYW5kIChpbmZvLT5nUmFuZG9tLCBpbmZvLT5zY3JlZW4ud2lkdGgpOworICAgICAgaWYgKG14ID4gaW5mby0+c2NyZWVuLndpZHRoIC8gMikKKyAgICAgICAgbXggPSBpbmZvLT5zY3JlZW4ud2lkdGg7CisgICAgICBlbHNlCisgICAgICAgIG14ID0gMDsKKyAgICAgIG15ID0gLShpbmZvLT5zY3JlZW4uaGVpZ2h0IC8gMykgLSBnb29tX2lyYW5kIChpbmZvLT5nUmFuZG9tLAorICAgICAgICAgIGluZm8tPnNjcmVlbi53aWR0aCAvIDMpOworICAgICAgcmFkaXVzICo9IDEuNTsKKyAgICAgIHZhZ2UgPSAwLjAwMmY7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVU5UQUlOX0ZYOgorICAgICAgbXkgPSBpbmZvLT5zY3JlZW4uaGVpZ2h0ICsgMjsKKyAgICAgIHZhZ2UgPSAwLjAwMWY7CisgICAgICByYWRpdXMgKz0gMS4wZjsKKyAgICAgIG14ID0gaW5mby0+c2NyZWVuLndpZHRoIC8gMjsKKyAgICAgIGdyYXZpdHkgPSAwLjA0ZjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm47CisgICAgICAvKiBteSA9IGkgUiBBIE4gRCAoaW5mby0+c2NyZWVuLmhlaWdodCk7IHZhZ2UgPSAwLjAxZjsgKi8KKyAgfQorCisgIHJhZGl1cyAqPSBpbmZvLT5zY3JlZW4uaGVpZ2h0IC8gMjAwLjBmOyAgICAgICAvKiB3aHkgMjAwID8gYmVjYXVzZSB0aGUgRlggd2FzIGRldmVsb3BwZWQgb24gMzIweDIwMCAqLworICBtYXggKj0gaW5mby0+c2NyZWVuLmhlaWdodCAvIDIwMC4wZjsKKworICBpZiAoaW5mby0+c291bmQudGltZVNpbmNlTGFzdEJpZ0dvb20gPCAxKSB7CisgICAgcmFkaXVzICo9IDEuNTsKKyAgICBtYXggKj0gMjsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgbWF4OyArK2kpCisgICAgYWRkQUJvbWIgKGRhdGEsIG14LCBteSwgcmFkaXVzLCB2YWdlLCBncmF2aXR5LCBpbmZvKTsKK30KKworCisvKioKKyAqIE1haW4gbWV0aG9kZSBvZiB0aGUgRlguCisgKi8KK3N0YXRpYyB2b2lkCitmc19hcHBseSAoVmlzdWFsRlggKiBfdGhpcywgUGl4ZWwgKiBzcmMsIFBpeGVsICogZGVzdCwgUGx1Z2luSW5mbyAqIGluZm8pCit7CisKKyAgaW50IGk7CisgIGludCBjb2w7CisgIEZTRGF0YSAqZGF0YSA9IChGU0RhdGEgKikgX3RoaXMtPmZ4X2RhdGE7CisKKyAgLyogR2V0IHRoZSBuZXcgcGFyYW1ldGVycyB2YWx1ZXMgKi8KKyAgZGF0YS0+bWluX2FnZSA9IDEuMGYgLSAoZmxvYXQpIElWQUwgKGRhdGEtPm1pbl9hZ2VfcCkgLyAxMDAuMGY7CisgIGRhdGEtPm1heF9hZ2UgPSAxLjBmIC0gKGZsb2F0KSBJVkFMIChkYXRhLT5tYXhfYWdlX3ApIC8gMTAwLjBmOworICBGVkFMIChkYXRhLT5uYlN0YXJzX3ApID0gKGZsb2F0KSBkYXRhLT5uYlN0YXJzIC8gKGZsb2F0KSBkYXRhLT5tYXhTdGFyczsKKyAgZGF0YS0+bmJTdGFyc19wLmNoYW5nZV9saXN0ZW5lciAoJmRhdGEtPm5iU3RhcnNfcCk7CisgIGRhdGEtPm1heFN0YXJzID0gSVZBTCAoZGF0YS0+bmJTdGFyc19saW1pdF9wKTsKKyAgZGF0YS0+ZnhfbW9kZSA9IElWQUwgKGRhdGEtPmZ4X21vZGVfcCk7CisKKyAgLyogbG9vayBmb3IgZXZlbnRzICovCisgIGlmIChpbmZvLT5zb3VuZC50aW1lU2luY2VMYXN0R29vbSA8IDEpIHsKKyAgICBmc19zb3VuZF9ldmVudF9vY2N1cmVkIChfdGhpcywgaW5mbyk7CisgICAgaWYgKGdvb21faXJhbmQgKGluZm8tPmdSYW5kb20sIDIwKSA9PSAxKSB7CisgICAgICBJVkFMIChkYXRhLT5meF9tb2RlX3ApID0gZ29vbV9pcmFuZCAoaW5mby0+Z1JhbmRvbSwgKExBU1RfRlggKiAzKSk7CisgICAgICBkYXRhLT5meF9tb2RlX3AuY2hhbmdlX2xpc3RlbmVyICgmZGF0YS0+ZnhfbW9kZV9wKTsKKyAgICB9CisgIH0KKworICAvKiB1cGRhdGUgcGFydGljdWxlcyAqLworICBmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bmJTdGFyczsgKytpKSB7CisgICAgdXBkYXRlU3RhciAoJmRhdGEtPnN0YXJzW2ldKTsKKworICAgIC8qIGRlYWQgcGFydGljdWxlICovCisgICAgaWYgKGRhdGEtPnN0YXJzW2ldLmFnZSA+PSBOQ09MKQorICAgICAgY29udGludWU7CisKKyAgICAvKiBjaG9vc2UgdGhlIGNvbG9yIG9mIHRoZSBwYXJ0aWN1bGUgKi8KKyAgICBjb2wgPSBjb2x2YWxbKGludCkgZGF0YS0+c3RhcnNbaV0uYWdlXTsKKworICAgIC8qIGRyYXdzIHRoZSBwYXJ0aWN1bGUgKi8KKyAgICBpbmZvLT5tZXRob2RzLmRyYXdfbGluZSAoZGVzdCwgKGludCkgZGF0YS0+c3RhcnNbaV0ueCwKKyAgICAgICAgKGludCkgZGF0YS0+c3RhcnNbaV0ueSwKKyAgICAgICAgKGludCkgKGRhdGEtPnN0YXJzW2ldLnggLSBkYXRhLT5zdGFyc1tpXS52eCAqIDYpLAorICAgICAgICAoaW50KSAoZGF0YS0+c3RhcnNbaV0ueSAtIGRhdGEtPnN0YXJzW2ldLnZ5ICogNiksIGNvbCwKKyAgICAgICAgKGludCkgaW5mby0+c2NyZWVuLndpZHRoLCAoaW50KSBpbmZvLT5zY3JlZW4uaGVpZ2h0KTsKKyAgICBpbmZvLT5tZXRob2RzLmRyYXdfbGluZSAoZGVzdCwgKGludCkgZGF0YS0+c3RhcnNbaV0ueCwKKyAgICAgICAgKGludCkgZGF0YS0+c3RhcnNbaV0ueSwKKyAgICAgICAgKGludCkgKGRhdGEtPnN0YXJzW2ldLnggLSBkYXRhLT5zdGFyc1tpXS52eCAqIDIpLAorICAgICAgICAoaW50KSAoZGF0YS0+c3RhcnNbaV0ueSAtIGRhdGEtPnN0YXJzW2ldLnZ5ICogMiksIGNvbCwKKyAgICAgICAgKGludCkgaW5mby0+c2NyZWVuLndpZHRoLCAoaW50KSBpbmZvLT5zY3JlZW4uaGVpZ2h0KTsKKyAgfQorCisgIC8qIGxvb2sgZm9yIGRlYWQgcGFydGljdWxlcyAqLworICBmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bmJTdGFyczspIHsKKworICAgIGlmICgoZGF0YS0+c3RhcnNbaV0ueCA+IGluZm8tPnNjcmVlbi53aWR0aCArIDY0KQorICAgICAgICB8fCAoKGRhdGEtPnN0YXJzW2ldLnZ5ID49IDApCisgICAgICAgICAgICAmJiAoZGF0YS0+c3RhcnNbaV0ueSAtIDE2ICogZGF0YS0+c3RhcnNbaV0udnkgPgorICAgICAgICAgICAgICAgIGluZm8tPnNjcmVlbi5oZWlnaHQpKQorICAgICAgICB8fCAoZGF0YS0+c3RhcnNbaV0ueCA8IC02NCkKKyAgICAgICAgfHwgKGRhdGEtPnN0YXJzW2ldLmFnZSA+PSBOQ09MKSkgeworICAgICAgZGF0YS0+c3RhcnNbaV0gPSBkYXRhLT5zdGFyc1tkYXRhLT5uYlN0YXJzIC0gMV07CisgICAgICBkYXRhLT5uYlN0YXJzLS07CisgICAgfSBlbHNlCisgICAgICArK2k7CisgIH0KK30KKwordm9pZAorZmx5aW5nX3N0YXJfY3JlYXRlIChWaXN1YWxGWCAqIHZmeCkKK3sKKyAgdmZ4LT5pbml0ID0gZnNfaW5pdDsKKyAgdmZ4LT5mcmVlID0gZnNfZnJlZTsKKyAgdmZ4LT5hcHBseSA9IGZzX2FwcGx5OworICB2ZngtPmZ4X2RhdGEgPSBOVUxMOworICB2ZngtPnBhcmFtcyA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9nc3QvZ29vbS9nb29tLmggYi9nc3QvZ29vbS9nb29tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJhMDkzNgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL2dvb20uaApAQCAtMCwwICsxLDQyIEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZuZGVmIF9HT09NQ09SRV9ICisjZGVmaW5lIF9HT09NQ09SRV9ICisKKyNpbmNsdWRlICJnb29tX2NvbmZpZy5oIgorI2luY2x1ZGUgImdvb21fcGx1Z2luX2luZm8uaCIKKworI2RlZmluZSBOQl9GWCAxMAorCitQbHVnaW5JbmZvICpnb29tX2luaXQgKGd1aW50MzIgcmVzeCwgZ3VpbnQzMiByZXN5KTsKK3ZvaWQgZ29vbV9zZXRfcmVzb2x1dGlvbiAoUGx1Z2luSW5mbyAqZ29vbUluZm8sIGd1aW50MzIgcmVzeCwgZ3VpbnQzMiByZXN5KTsKKworLyoKKyAqIGZvcmNlTW9kZSA9PSAwIDogZG8gbm90aGluZworICogZm9yY2VNb2RlID09IC0xIDogbG9jayB0aGUgRlgKKyAqIGZvcmNlTW9kZSA9PSAxLi5OQl9GWCA6IGZvcmNlIGEgc3dpdGNoIHRvIEZYIG4jIGZvcmNlTW9kZQorICovCitndWludDMyICpnb29tX3VwZGF0ZSAoUGx1Z2luSW5mbyAqZ29vbUluZm8sIGdpbnQxNiBkYXRhWzJdWzUxMl0sIGludCBmb3JjZU1vZGUsIGZsb2F0IGZwcyk7CisKKy8qIHJldHVybnMgMCBpZiB0aGUgYnVmZmVyIHdhc24ndCBhY2NlcHRlZCAqLworaW50IGdvb21fc2V0X3NjcmVlbmJ1ZmZlcihQbHVnaW5JbmZvICpnb29tSW5mbywgdm9pZCAqYnVmZmVyKTsKKwordm9pZCBnb29tX2Nsb3NlIChQbHVnaW5JbmZvICpnb29tSW5mbyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vZ29vbV9jb25maWcuaCBiL2dzdC9nb29tL2dvb21fY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI2NGJmZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL2dvb21fY29uZmlnLmgKQEAgLTAsMCArMSw0NSBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgPGdsaWIuaD4KKworI2lmIEdfQllURV9PUkRFUiA9PSBHX0JJR19FTkRJQU4KKyNkZWZpbmUgQ09MT1JfQVJHQgorI2Vsc2UKKyNkZWZpbmUgQ09MT1JfQkdSQQorI2VuZGlmCisKKyNpZiAxCisvKiBuZGVmIENPTE9SX0JHUkEgKi8KKy8qKiBwb3NpdGlvbiBkZXMgY29tcG9zYW50ZXMgKiovCisgICAgI2RlZmluZSBCTEVVIDAKKyAgICAjZGVmaW5lIFZFUlQgMQorICAgICNkZWZpbmUgUk9VR0UgMgorICAgICNkZWZpbmUgQUxQSEEgMworI2Vsc2UKKyAgICAjZGVmaW5lIFJPVUdFIDEKKyAgICAjZGVmaW5lIEJMRVUgMworICAgICNkZWZpbmUgVkVSVCAyCisgICAgI2RlZmluZSBBTFBIQSAwCisjZW5kaWYKKworI2lmIGRlZmluZWQgKEJVSUxEX01NWCkgJiYgZGVmaW5lZCAoSEFWRV9HQ0NfQVNNKQorCisjZGVmaW5lIEhBVkVfTU1YCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vZ29vbV9jb25maWdfcGFyYW0uaCBiL2dzdC9nb29tL2dvb21fY29uZmlnX3BhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwOGRhOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL2dvb21fY29uZmlnX3BhcmFtLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qIEdvb20gUHJvamVjdAorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gaU9TLVNvZnR3YXJlCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpZm5kZWYgX0NPTkZJR19QQVJBTV9ICisjZGVmaW5lIF9DT05GSUdfUEFSQU1fSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qCisgKiBGaWxlIGNyZWF0ZWQgb24gMjAwMy0wNS0yNCBieSBKZWtvLgorICogKGMpMjAwMywgSkMgSG9lbHQgZm9yIGlPUy1zb2Z0d2FyZS4KKyAqCisgKiBMR1BMIExpY2VuY2UuCisgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgUEFSQU1fSU5UVkFMLAorICBQQVJBTV9GTE9BVFZBTCwKKyAgUEFSQU1fQk9PTFZBTCwKKyAgUEFSQU1fU1RSVkFMLAorICBQQVJBTV9MSVNUVkFMLAorfSBQYXJhbVR5cGU7CisKK3N0cnVjdCBJbnRWYWwgeworICBpbnQgdmFsdWU7CisgIGludCBtaW47CisgIGludCBtYXg7CisgIGludCBzdGVwOworfTsKK3N0cnVjdCBGbG9hdFZhbCB7CisgIGZsb2F0IHZhbHVlOworICBmbG9hdCBtaW47CisgIGZsb2F0IG1heDsKKyAgZmxvYXQgc3RlcDsKK307CitzdHJ1Y3QgU3RyVmFsIHsKKyAgY2hhciAqdmFsdWU7Cit9Oworc3RydWN0IExpc3RWYWwgeworICBjaGFyICp2YWx1ZTsKKyAgaW50IG5iQ2hvaWNlczsKKyAgY2hhciAqKmNob2ljZXM7Cit9Oworc3RydWN0IEJvb2xWYWwgeworICBpbnQgdmFsdWU7Cit9OworCisKK3R5cGVkZWYgc3RydWN0IF9QQVJBTSB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGNvbnN0IGNoYXIgKmRlc2M7CisgIGNoYXIgcnc7CisgIFBhcmFtVHlwZSB0eXBlOworICB1bmlvbiB7CisgICAgc3RydWN0IEludFZhbCBpdmFsOworICAgIHN0cnVjdCBGbG9hdFZhbCBmdmFsOworICAgIHN0cnVjdCBTdHJWYWwgc3ZhbDsKKyAgICBzdHJ1Y3QgTGlzdFZhbCBzbGlzdDsKKyAgICBzdHJ1Y3QgQm9vbFZhbCBidmFsOworICB9IHBhcmFtOworICAKKyAgLyogdXNlZCBieSB0aGUgY29yZSB0byBpbmZvcm0gdGhlIEdVSSBvZiBhIGNoYW5nZSAqLworICB2b2lkICgqY2hhbmdlX2xpc3RlbmVyKShzdHJ1Y3QgX1BBUkFNICpfdGhpcyk7CisKKyAgLyogdXNlZCBieSB0aGUgR1VJIHRvIGluZm9ybSB0aGUgY29yZSBvZiBhIGNoYW5nZSAqLworICB2b2lkICgqY2hhbmdlZCkoc3RydWN0IF9QQVJBTSAqX3RoaXMpOworICAKKyAgdm9pZCAqdXNlcl9kYXRhOyAvKiBjYW4gYmUgdXNlZCBieSB0aGUgR1VJICovCit9IFBsdWdpblBhcmFtOworCisjZGVmaW5lIElWQUwocCkgKChwKS5wYXJhbS5pdmFsLnZhbHVlKQorI2RlZmluZSBTVkFMKHApICgocCkucGFyYW0uc3ZhbC52YWx1ZSkKKyNkZWZpbmUgRlZBTChwKSAoKHApLnBhcmFtLmZ2YWwudmFsdWUpCisjZGVmaW5lIEJWQUwocCkgKChwKS5wYXJhbS5idmFsLnZhbHVlKQorI2RlZmluZSBMVkFMKHApICgocCkucGFyYW0uc2xpc3QudmFsdWUpCisKKyNkZWZpbmUgRk1JTihwKSAoKHApLnBhcmFtLmZ2YWwubWluKQorI2RlZmluZSBGTUFYKHApICgocCkucGFyYW0uZnZhbC5tYXgpCisjZGVmaW5lIEZTVEVQKHApICgocCkucGFyYW0uZnZhbC5zdGVwKQorCisjZGVmaW5lIElNSU4ocCkgKChwKS5wYXJhbS5pdmFsLm1pbikKKyNkZWZpbmUgSU1BWChwKSAoKHApLnBhcmFtLml2YWwubWF4KQorI2RlZmluZSBJU1RFUChwKSAoKHApLnBhcmFtLml2YWwuc3RlcCkKKwordm9pZCBnb29tX3NlY3VyZV9wYXJhbShQbHVnaW5QYXJhbSAqcCk7CisKK3ZvaWQgZ29vbV9zZWN1cmVfZl9wYXJhbShQbHVnaW5QYXJhbSAqcCwgY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIGdvb21fc2VjdXJlX2lfcGFyYW0oUGx1Z2luUGFyYW0gKnAsIGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBnb29tX3NlY3VyZV9iX3BhcmFtKFBsdWdpblBhcmFtICpwLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgdmFsdWUpOwordm9pZCBnb29tX3NlY3VyZV9zX3BhcmFtKFBsdWdpblBhcmFtICpwLCBjb25zdCBjaGFyICpuYW1lKTsKKwordm9pZCBnb29tX3NlY3VyZV9mX2ZlZWRiYWNrKFBsdWdpblBhcmFtICpwLCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgZ29vbV9zZWN1cmVfaV9mZWVkYmFjayhQbHVnaW5QYXJhbSAqcCwgY29uc3QgY2hhciAqbmFtZSk7CisKK3ZvaWQgZ29vbV9zZXRfc3RyX3BhcmFtX3ZhbHVlKFBsdWdpblBhcmFtICpwLCBjb25zdCBjaGFyICpzdHIpOwordm9pZCBnb29tX3NldF9saXN0X3BhcmFtX3ZhbHVlKFBsdWdpblBhcmFtICpwLCBjb25zdCBjaGFyICpzdHIpOworICAgIAordHlwZWRlZiBzdHJ1Y3QgX1BBUkFNRVRFUlMgeworICBjb25zdCBjaGFyICpuYW1lOworICBjb25zdCBjaGFyICpkZXNjOworICBpbnQgbmJQYXJhbXM7CisgIFBsdWdpblBhcmFtICoqcGFyYW1zOworfSBQbHVnaW5QYXJhbWV0ZXJzOworCit2b2lkIGdvb21fcGx1Z2luX3BhcmFtZXRlcnMoUGx1Z2luUGFyYW1ldGVycyAqcCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5iKTsKK3ZvaWQgZ29vbV9wbHVnaW5fcGFyYW1ldGVyc19mcmVlKFBsdWdpblBhcmFtZXRlcnMgKnApOworCisjZGVmaW5lIHNlY3VyZV9wYXJhbSBnb29tX3NlY3VyZV9wYXJhbQorI2RlZmluZSBzZWN1cmVfZl9wYXJhbSBnb29tX3NlY3VyZV9mX3BhcmFtCisjZGVmaW5lIHNlY3VyZV9pX3BhcmFtIGdvb21fc2VjdXJlX2lfcGFyYW0KKyNkZWZpbmUgc2VjdXJlX2JfcGFyYW0gZ29vbV9zZWN1cmVfYl9wYXJhbQorI2RlZmluZSBzZWN1cmVfc19wYXJhbSBnb29tX3NlY3VyZV9zX3BhcmFtCisjZGVmaW5lIHNlY3VyZV9mX2ZlZWRiYWNrIGdvb21fc2VjdXJlX2ZfZmVlZGJhY2sKKyNkZWZpbmUgc2VjdXJlX2lfZmVlZGJhY2sgZ29vbV9zZWN1cmVfaV9mZWVkYmFjaworI2RlZmluZSBzZXRfbGlzdF9wYXJhbV92YWx1ZSBnb29tX3NldF9saXN0X3BhcmFtX3ZhbHVlCisjZGVmaW5lIHNldF9zdHJfcGFyYW1fdmFsdWUgZ29vbV9zZXRfc3RyX3BhcmFtX3ZhbHVlCisjZGVmaW5lIHBsdWdpbl9wYXJhbWV0ZXJzIGdvb21fcGx1Z2luX3BhcmFtZXRlcnMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvZ29vbS9nb29tX2NvcmUuYyBiL2dzdC9nb29tL2dvb21fY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMWQ0ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9nb29tX2NvcmUuYwpAQCAtMCwwICsxLDg1NiBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBKZWFuLUNocmlzdG9waGUgSG9lbHQgPGpla29AZnJlZS5mcj4KKyAqCisgKiBnb29tX2NvcmUuYzpDb250YWlucyB0aGUgY29yZSBvZiBnb29tJ3Mgd29yay4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImdvb20uaCIKKyNpbmNsdWRlICJnb29tX3Rvb2xzLmgiCisjaW5jbHVkZSAiZ29vbV9maWx0ZXJzLmgiCisjaW5jbHVkZSAibGluZXMuaCIKKyNpbmNsdWRlICJpZnMuaCIKKyNpbmNsdWRlICJ0ZW50YWNsZTNkLmgiCisKKyNpbmNsdWRlICJzb3VuZF90ZXN0ZXIuaCIKKyNpbmNsdWRlICJnb29tX3BsdWdpbl9pbmZvLmgiCisjaW5jbHVkZSAiZ29vbV9meC5oIgorCisvKiAjZGVmaW5lIFZFUkJPU0UgKi8KKworI2RlZmluZSBTVE9QX1NQRUVEIDEyOAorLyogVE9ETzogcHV0IHRoYXQgYXMgdmFyaWFibGUgaW4gUGx1Z2luSW5mbyAqLworI2RlZmluZSBUSU1FX0JUV19DSEcgMzAwCisKK3N0YXRpYyB2b2lkIGNob29zZV9hX2dvb21fbGluZSAoUGx1Z2luSW5mbyAqIGdvb21JbmZvLCBmbG9hdCAqcGFyYW0xLAorICAgIGZsb2F0ICpwYXJhbTIsIGludCAqY291bGV1ciwgaW50ICptb2RlLCBmbG9hdCAqYW1wbGl0dWRlLCBpbnQgZmFyKTsKKworc3RhdGljIHZvaWQKK2luaXRfYnVmZmVycyAoUGx1Z2luSW5mbyAqIGdvb21JbmZvLCBpbnQgYnVmZnNpemUpCit7CisgIGdvb21JbmZvLT5waXhlbCA9IChndWludDMyICopIG1hbGxvYyAoYnVmZnNpemUgKiBzaXplb2YgKGd1aW50MzIpICsgMTI4KTsKKyAgbWVtc2V0IChnb29tSW5mby0+cGl4ZWwsIDAsIGJ1ZmZzaXplICogc2l6ZW9mIChndWludDMyKSArIDEyOCk7CisgIGdvb21JbmZvLT5iYWNrID0gKGd1aW50MzIgKikgbWFsbG9jIChidWZmc2l6ZSAqIHNpemVvZiAoZ3VpbnQzMikgKyAxMjgpOworICBtZW1zZXQgKGdvb21JbmZvLT5iYWNrLCAwLCBidWZmc2l6ZSAqIHNpemVvZiAoZ3VpbnQzMikgKyAxMjgpOworICBnb29tSW5mby0+Y29udiA9IChQaXhlbCAqKSBtYWxsb2MgKGJ1ZmZzaXplICogc2l6ZW9mIChndWludDMyKSArIDEyOCk7CisgIG1lbXNldCAoZ29vbUluZm8tPmNvbnYsIDAsIGJ1ZmZzaXplICogc2l6ZW9mIChndWludDMyKSArIDEyOCk7CisKKyAgZ29vbUluZm8tPm91dHB1dEJ1ZiA9IGdvb21JbmZvLT5jb252OworCisgIGdvb21JbmZvLT5wMSA9IChQaXhlbCAqKSAoKDEgKyAoKHVpbnRwdHJfdCkgKGdvb21JbmZvLT5waXhlbCkpIC8gMTI4KSAqIDEyOCk7CisgIGdvb21JbmZvLT5wMiA9IChQaXhlbCAqKSAoKDEgKyAoKHVpbnRwdHJfdCkgKGdvb21JbmZvLT5iYWNrKSkgLyAxMjgpICogMTI4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgSU5JVCAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKiovCitQbHVnaW5JbmZvICoKK2dvb21faW5pdCAoZ3VpbnQzMiByZXN4LCBndWludDMyIHJlc3kpCit7CisgIFBsdWdpbkluZm8gKmdvb21JbmZvID0gKFBsdWdpbkluZm8gKikgbWFsbG9jIChzaXplb2YgKFBsdWdpbkluZm8pKTsKKworI2lmZGVmIFZFUkJPU0UKKyAgcHJpbnRmICgiR09PTTogaW5pdCAoJWQsICVkKTtcbiIsIHJlc3gsIHJlc3kpOworI2VuZGlmCisKKyAgcGx1Z2luX2luZm9faW5pdCAoZ29vbUluZm8sIDQpOworCisgIGdvb21JbmZvLT5zY3JlZW4ud2lkdGggPSByZXN4OworICBnb29tSW5mby0+c2NyZWVuLmhlaWdodCA9IHJlc3k7CisgIGdvb21JbmZvLT5zY3JlZW4uc2l6ZSA9IHJlc3ggKiByZXN5OworCisgIGluaXRfYnVmZmVycyAoZ29vbUluZm8sIGdvb21JbmZvLT5zY3JlZW4uc2l6ZSk7CisgIGdvb21JbmZvLT5nUmFuZG9tID0gZ29vbV9yYW5kb21faW5pdCAoKHVpbnRwdHJfdCkgZ29vbUluZm8tPnBpeGVsKTsKKworICBnb29tSW5mby0+Y3ljbGUgPSAwOworCisgIGZseWluZ19zdGFyX2NyZWF0ZSAoJmdvb21JbmZvLT5zdGFyX2Z4KTsKKyAgZ29vbUluZm8tPnN0YXJfZnguaW5pdCAoJmdvb21JbmZvLT5zdGFyX2Z4LCBnb29tSW5mbyk7CisKKyAgem9vbUZpbHRlclZpc3VhbEZYV3JhcHBlcl9jcmVhdGUgKCZnb29tSW5mby0+em9vbUZpbHRlcl9meCk7CisgIGdvb21JbmZvLT56b29tRmlsdGVyX2Z4LmluaXQgKCZnb29tSW5mby0+em9vbUZpbHRlcl9meCwgZ29vbUluZm8pOworCisgIHRlbnRhY2xlX2Z4X2NyZWF0ZSAoJmdvb21JbmZvLT50ZW50YWNsZXNfZngpOworICBnb29tSW5mby0+dGVudGFjbGVzX2Z4LmluaXQgKCZnb29tSW5mby0+dGVudGFjbGVzX2Z4LCBnb29tSW5mbyk7CisKKyAgY29udm9sdmVfY3JlYXRlICgmZ29vbUluZm8tPmNvbnZvbHZlX2Z4KTsKKyAgZ29vbUluZm8tPmNvbnZvbHZlX2Z4LmluaXQgKCZnb29tSW5mby0+Y29udm9sdmVfZngsIGdvb21JbmZvKTsKKworICBwbHVnaW5faW5mb19hZGRfdmlzdWFsIChnb29tSW5mbywgMCwgJmdvb21JbmZvLT56b29tRmlsdGVyX2Z4KTsKKyAgcGx1Z2luX2luZm9fYWRkX3Zpc3VhbCAoZ29vbUluZm8sIDEsICZnb29tSW5mby0+dGVudGFjbGVzX2Z4KTsKKyAgcGx1Z2luX2luZm9fYWRkX3Zpc3VhbCAoZ29vbUluZm8sIDIsICZnb29tSW5mby0+c3Rhcl9meCk7CisgIHBsdWdpbl9pbmZvX2FkZF92aXN1YWwgKGdvb21JbmZvLCAzLCAmZ29vbUluZm8tPmNvbnZvbHZlX2Z4KTsKKworICBpZnNfdmlzdWFsZnhfY3JlYXRlICgmZ29vbUluZm8tPmlmc19meCk7CisgIGdvb21JbmZvLT5pZnNfZnguaW5pdCAoJmdvb21JbmZvLT5pZnNfZngsIGdvb21JbmZvKTsKKworICBnb29tSW5mby0+Z21saW5lMSA9IGdvb21fbGluZXNfaW5pdCAoZ29vbUluZm8sIHJlc3gsIGdvb21JbmZvLT5zY3JlZW4uaGVpZ2h0LAorICAgICAgR01MX0hMSU5FLCBnb29tSW5mby0+c2NyZWVuLmhlaWdodCwgR01MX0JMQUNLLAorICAgICAgR01MX0NJUkNMRSwgMC40ZiAqIChmbG9hdCkgZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQsIEdNTF9WRVJUKTsKKyAgZ29vbUluZm8tPmdtbGluZTIgPSBnb29tX2xpbmVzX2luaXQgKGdvb21JbmZvLCByZXN4LCBnb29tSW5mby0+c2NyZWVuLmhlaWdodCwKKyAgICAgIEdNTF9ITElORSwgMCwgR01MX0JMQUNLLAorICAgICAgR01MX0NJUkNMRSwgMC4yZiAqIChmbG9hdCkgZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQsIEdNTF9SRUQpOworCisgIC8qIGdvb21fc2V0X21haW5fc2NyaXB0KGdvb21JbmZvLCBnb29tSW5mby0+bWFpbl9zY3JpcHRfc3RyKTsgKi8KKworICByZXR1cm4gZ29vbUluZm87Cit9CisKKworCit2b2lkCitnb29tX3NldF9yZXNvbHV0aW9uIChQbHVnaW5JbmZvICogZ29vbUluZm8sIGd1aW50MzIgcmVzeCwgZ3VpbnQzMiByZXN5KQoreworICBmcmVlIChnb29tSW5mby0+cGl4ZWwpOworICBmcmVlIChnb29tSW5mby0+YmFjayk7CisgIGZyZWUgKGdvb21JbmZvLT5jb252KTsKKworICBnb29tSW5mby0+c2NyZWVuLndpZHRoID0gcmVzeDsKKyAgZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQgPSByZXN5OworICBnb29tSW5mby0+c2NyZWVuLnNpemUgPSByZXN4ICogcmVzeTsKKworICBpbml0X2J1ZmZlcnMgKGdvb21JbmZvLCBnb29tSW5mby0+c2NyZWVuLnNpemUpOworCisgIC8qIGluaXRfaWZzIChnb29tSW5mbywgcmVzeCwgZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQpOyAqLworICBnb29tSW5mby0+aWZzX2Z4LmZyZWUgKCZnb29tSW5mby0+aWZzX2Z4KTsKKyAgZ29vbUluZm8tPmlmc19meC5pbml0ICgmZ29vbUluZm8tPmlmc19meCwgZ29vbUluZm8pOworCisgIGdvb21fbGluZXNfc2V0X3JlcyAoZ29vbUluZm8tPmdtbGluZTEsIHJlc3gsIGdvb21JbmZvLT5zY3JlZW4uaGVpZ2h0KTsKKyAgZ29vbV9saW5lc19zZXRfcmVzIChnb29tSW5mby0+Z21saW5lMiwgcmVzeCwgZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQpOworfQorCitpbnQKK2dvb21fc2V0X3NjcmVlbmJ1ZmZlciAoUGx1Z2luSW5mbyAqIGdvb21JbmZvLCB2b2lkICpidWZmZXIpCit7CisgIGdvb21JbmZvLT5vdXRwdXRCdWYgPSAoUGl4ZWwgKikgYnVmZmVyOworICByZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgVVBEQVRFICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworKiBXQVJOSU5HOiB0aGlzIGlzIGEgNjAwIGxpbmVzIGZ1bmN0aW9uICEgKDIxLTExLTIwMDMpCisqLworZ3VpbnQzMiAqCitnb29tX3VwZGF0ZSAoUGx1Z2luSW5mbyAqIGdvb21JbmZvLCBnaW50MTYgZGF0YVsyXVs1MTJdLCBpbnQgZm9yY2VNb2RlLAorICAgIGZsb2F0IGZwcykKK3sKKyAgUGl4ZWwgKnJldHVybl92YWw7CisgIGd1aW50MzIgcG9pbnRXaWR0aDsKKyAgZ3VpbnQzMiBwb2ludEhlaWdodDsKKyAgaW50IGk7CisgIGZsb2F0IGxhcmdmYWN0b3I7ICAgICAgICAgICAgIC8qIGVsYXJnaXNzZW1lbnQgZGUgbCdpbnRlcnZhbGxlIGQn77+9dm9sdXRpb24gZGVzIHBvaW50cyAqLworICBQaXhlbCAqdG1wOworCisgIFpvb21GaWx0ZXJEYXRhICpwemZkOworCisgIC8qIHRlc3QgaWYgdGhlIGNvbmZpZyBoYXMgY2hhbmdlZCwgdXBkYXRlIGl0IGlmIHNvICovCisgIHBvaW50V2lkdGggPSAoZ29vbUluZm8tPnNjcmVlbi53aWR0aCAqIDIpIC8gNTsKKyAgcG9pbnRIZWlnaHQgPSAoKGdvb21JbmZvLT5zY3JlZW4uaGVpZ2h0KSAqIDIpIC8gNTsKKworICAvKiAhIGV0dWRlIGR1IHNpZ25hbCAuLi4gKi8KKyAgZXZhbHVhdGVfc291bmQgKGRhdGEsICYoZ29vbUluZm8tPnNvdW5kKSk7CisKKyAgLyogZ29vbV9leGVjdXRlX21haW5fc2NyaXB0KGdvb21JbmZvKTsgKi8KKworICAvKiAhIGNhbGN1bCBkdSBkZXBsYWNlbWVudCBkZXMgcGV0aXRzIHBvaW50cyAuLi4gKi8KKyAgbGFyZ2ZhY3RvciA9CisgICAgICBnb29tSW5mby0+c291bmQuc3BlZWR2YXIgLyAxNTAuMGYgKyBnb29tSW5mby0+c291bmQudm9sdW1lIC8gMS41ZjsKKworICBpZiAobGFyZ2ZhY3RvciA+IDEuNWYpCisgICAgbGFyZ2ZhY3RvciA9IDEuNWY7CisKKyAgZ29vbUluZm8tPnVwZGF0ZS5kZWNheV9pZnMtLTsKKyAgaWYgKGdvb21JbmZvLT51cGRhdGUuZGVjYXlfaWZzID4gMCkKKyAgICBnb29tSW5mby0+dXBkYXRlLmlmc19pbmNyICs9IDI7CisgIGlmIChnb29tSW5mby0+dXBkYXRlLmRlY2F5X2lmcyA9PSAwKQorICAgIGdvb21JbmZvLT51cGRhdGUuaWZzX2luY3IgPSAwOworCisgIGlmIChnb29tSW5mby0+dXBkYXRlLnJlY2F5X2lmcykgeworICAgIGdvb21JbmZvLT51cGRhdGUuaWZzX2luY3IgLT0gMjsKKyAgICBnb29tSW5mby0+dXBkYXRlLnJlY2F5X2lmcy0tOworICAgIGlmICgoZ29vbUluZm8tPnVwZGF0ZS5yZWNheV9pZnMgPT0gMCkgJiYgKGdvb21JbmZvLT51cGRhdGUuaWZzX2luY3IgPD0gMCkpCisgICAgICBnb29tSW5mby0+dXBkYXRlLmlmc19pbmNyID0gMTsKKyAgfQorCisgIGlmIChnb29tSW5mby0+dXBkYXRlLmlmc19pbmNyID4gMCkKKyAgICBnb29tSW5mby0+aWZzX2Z4LmFwcGx5ICgmZ29vbUluZm8tPmlmc19meCwgZ29vbUluZm8tPnAyLCBnb29tSW5mby0+cDEsCisgICAgICAgIGdvb21JbmZvKTsKKworICBpZiAoZ29vbUluZm8tPmN1ckdTdGF0ZS0+ZHJhd1BvaW50cykgeworICAgIGZvciAoaSA9IDE7IGkgKiAxNSA8PSBnb29tSW5mby0+c291bmQuc3BlZWR2YXIgKiA4MC4wZiArIDE1OyBpKyspIHsKKyAgICAgIGdvb21JbmZvLT51cGRhdGUubG9vcHZhciArPSBnb29tSW5mby0+c291bmQuc3BlZWR2YXIgKiA1MCArIDE7CisKKyAgICAgIHBvaW50RmlsdGVyIChnb29tSW5mbywgZ29vbUluZm8tPnAxLAorICAgICAgICAgIFlFTExPVywKKyAgICAgICAgICAoKHBvaW50V2lkdGggLSA2LjBmKSAqIGxhcmdmYWN0b3IgKyA1LjBmKSwKKyAgICAgICAgICAoKHBvaW50SGVpZ2h0IC0gNi4wZikgKiBsYXJnZmFjdG9yICsgNS4wZiksCisgICAgICAgICAgaSAqIDE1Mi4wZiwgMTI4LjBmLCBnb29tSW5mby0+dXBkYXRlLmxvb3B2YXIgKyBpICogMjAzMik7CisgICAgICBwb2ludEZpbHRlciAoZ29vbUluZm8sIGdvb21JbmZvLT5wMSwgT1JBTkdFLAorICAgICAgICAgICgocG9pbnRXaWR0aCAvIDIpICogbGFyZ2ZhY3RvcikgLyBpICsgMTAuMGYgKiBpLAorICAgICAgICAgICgocG9pbnRIZWlnaHQgLyAyKSAqIGxhcmdmYWN0b3IpIC8gaSArIDEwLjBmICogaSwKKyAgICAgICAgICA5Ni4wZiwgaSAqIDgwLjBmLCBnb29tSW5mby0+dXBkYXRlLmxvb3B2YXIgLyBpKTsKKyAgICAgIHBvaW50RmlsdGVyIChnb29tSW5mbywgZ29vbUluZm8tPnAxLCBWSU9MRVQsCisgICAgICAgICAgKChwb2ludEhlaWdodCAvIDMgKyA1LjBmKSAqIGxhcmdmYWN0b3IpIC8gaSArIDEwLjBmICogaSwKKyAgICAgICAgICAoKHBvaW50SGVpZ2h0IC8gMyArIDUuMGYpICogbGFyZ2ZhY3RvcikgLyBpICsgMTAuMGYgKiBpLAorICAgICAgICAgIGkgKyAxMjIuMGYsIDEzNC4wZiwgZ29vbUluZm8tPnVwZGF0ZS5sb29wdmFyIC8gaSk7CisgICAgICBwb2ludEZpbHRlciAoZ29vbUluZm8sIGdvb21JbmZvLT5wMSwgQkxBQ0ssCisgICAgICAgICAgKChwb2ludEhlaWdodCAvIDMpICogbGFyZ2ZhY3RvciArIDIwLjBmKSwKKyAgICAgICAgICAoKHBvaW50SGVpZ2h0IC8gMykgKiBsYXJnZmFjdG9yICsgMjAuMGYpLAorICAgICAgICAgIDU4LjBmLCBpICogNjYuMGYsIGdvb21JbmZvLT51cGRhdGUubG9vcHZhciAvIGkpOworICAgICAgcG9pbnRGaWx0ZXIgKGdvb21JbmZvLCBnb29tSW5mby0+cDEsIFdISVRFLAorICAgICAgICAgIChwb2ludEhlaWdodCAqIGxhcmdmYWN0b3IgKyAxMC4wZiAqIGkpIC8gaSwKKyAgICAgICAgICAocG9pbnRIZWlnaHQgKiBsYXJnZmFjdG9yICsgMTAuMGYgKiBpKSAvIGksCisgICAgICAgICAgNjYuMGYsIDc0LjBmLCBnb29tSW5mby0+dXBkYXRlLmxvb3B2YXIgKyBpICogNTAwKTsKKyAgICB9CisgIH0KKworICAvKiBwYXIgZO+/vWZhdXQgcGFzIGRlIGNoYW5nZW1lbnQgZGUgem9vbSAqLworICBwemZkID0gTlVMTDsKKworICAvKiAKKyAgICogVGVzdCBmb3JjZU1vZGUKKyAgICovCisjaWZkZWYgVkVSQk9TRQorICBpZiAoZm9yY2VNb2RlICE9IDApIHsKKyAgICBwcmludGYgKCJmb3JjZW1vZGUgPSAlZFxuIiwgZm9yY2VNb2RlKTsKKyAgfQorI2VuZGlmCisKKworICAvKiBkaW1pbnVlciBkZSAxIGxlIHRlbXBzIGRlIGxvY2thZ2UgKi8KKyAgLyogbm90ZSBwb3VyIGNldXggcXVpIG4nb250IHBhcyBzdWl2aXMgOiBsZSBsb2NrdmFyIHBlcm1ldCBkJ2VtcGVjaGVyIHVuICovCisgIC8qIGNoYW5nZW1lbnQgZCdldGF0IGR1IHBsdWdpbiBqdXN0ZSBhcHJlcyB1biBhdXRyZSBjaGFuZ2VtZW50IGQnZXRhdC4gb2tpICovCisgIGlmICgtLWdvb21JbmZvLT51cGRhdGUubG9ja3ZhciA8IDApCisgICAgZ29vbUluZm8tPnVwZGF0ZS5sb2NrdmFyID0gMDsKKworICAvKiBvbiB2ZXJpZmllIHF1J2lsIG5lIHNlIHBhcyB1biB0cnVjIGludGVycmVzc2FudCBhdmVjIGxlIHNvbi4gKi8KKyAgaWYgKChnb29tSW5mby0+c291bmQudGltZVNpbmNlTGFzdEdvb20gPT0gMCkKKyAgICAgIHx8IChmb3JjZU1vZGUgPiAwKQorICAgICAgfHwgKGdvb21JbmZvLT51cGRhdGUuY3ljbGVzU2luY2VMYXN0Q2hhbmdlID4gVElNRV9CVFdfQ0hHKSkgeworCisgICAgLyogY2hhbmdlbWVudCBldmVudHVlbCBkZSBtb2RlICovCisgICAgaWYgKGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAxNikgPT0gMCkKKyAgICAgIHN3aXRjaCAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDM0KSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5oeXBlcmNvc0VmZmVjdCA9CisgICAgICAgICAgICAgIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAyKTsKKyAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLm1vZGUgPSBXQVZFX01PREU7CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5yZXZlcnNlID0gMDsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLndhdmVFZmZlY3QgPQorICAgICAgICAgICAgICAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDMpID09IDApOworICAgICAgICAgIGlmIChnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMikpCisgICAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLnZpdGVzc2UgPQorICAgICAgICAgICAgICAgIChnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLnZpdGVzc2UgKyAxMjcpID4+IDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLm1vZGUgPSBDUllTVEFMX0JBTExfTU9ERTsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLndhdmVFZmZlY3QgPSAwOworICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEuaHlwZXJjb3NFZmZlY3QgPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5tb2RlID0gQU1VTEVUVEVfTU9ERTsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLndhdmVFZmZlY3QgPSAwOworICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEuaHlwZXJjb3NFZmZlY3QgPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5tb2RlID0gV0FURVJfTU9ERTsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLndhdmVFZmZlY3QgPSAwOworICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEuaHlwZXJjb3NFZmZlY3QgPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5tb2RlID0gU0NSVU5DSF9NT0RFOworICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEud2F2ZUVmZmVjdCA9IDA7CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5oeXBlcmNvc0VmZmVjdCA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgY2FzZSAxNToKKyAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLm1vZGUgPSBIWVBFUkNPUzFfTU9ERTsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLndhdmVFZmZlY3QgPSAwOworICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEuaHlwZXJjb3NFZmZlY3QgPQorICAgICAgICAgICAgICAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDMpID09IDApOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5tb2RlID0gSFlQRVJDT1MyX01PREU7CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS53YXZlRWZmZWN0ID0gMDsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLmh5cGVyY29zRWZmZWN0ID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICBjYXNlIDE3OgorICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEubW9kZSA9IENSWVNUQUxfQkFMTF9NT0RFOworICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEud2F2ZUVmZmVjdCA9CisgICAgICAgICAgICAgIChnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgNCkgPT0gMCk7CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5oeXBlcmNvc0VmZmVjdCA9CisgICAgICAgICAgICAgIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAyKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICBjYXNlIDE4OgorICAgICAgICBjYXNlIDE5OgorICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEubW9kZSA9IFNDUlVOQ0hfTU9ERTsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLndhdmVFZmZlY3QgPSAxOworICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEuaHlwZXJjb3NFZmZlY3QgPSAxOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI5OgorICAgICAgICBjYXNlIDMwOgorICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEubW9kZSA9IFlPTkxZX01PREU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzE6CisgICAgICAgIGNhc2UgMzI6CisgICAgICAgIGNhc2UgMzM6CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5tb2RlID0gU1BFRURXQVlfTU9ERTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLm1vZGUgPSBOT1JNQUxfTU9ERTsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLndhdmVFZmZlY3QgPSAwOworICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEuaHlwZXJjb3NFZmZlY3QgPSAwOworICAgICAgfQorICB9CisKKyAgLyogdG91dCBjZWNpIG5lIHNlcmEgZmFpdCBxdSdlbiBjYXMgZGUgbm9uLWJsb2NhZ2UgKi8KKyAgaWYgKGdvb21JbmZvLT51cGRhdGUubG9ja3ZhciA9PSAwKSB7CisgICAgLyogcmVwZXJhZ2UgZGUgZ29vbSAoYWNjZWxlcmF0aW9uIGZvcnRlIGRlIGwnYWNjZWxlcmF0aW9uIGR1IHZvbHVtZSkgKi8KKyAgICAvKiAtPiBjb3VwIGRlIGJvb3N0IGRlIGxhIHZpdGVzc2Ugc2kgYmVzb2luLi4gKi8KKyAgICBpZiAoZ29vbUluZm8tPnNvdW5kLnRpbWVTaW5jZUxhc3RHb29tID09IDApIHsKKworICAgICAgaW50IGk7CisKKyAgICAgIGdvb21JbmZvLT51cGRhdGUuZ29vbXZhcisrOworCisgICAgICAvKiBTRUxFQ1RJT04gT0YgVEhFIEdPT00gU1RBVEUgKi8KKyAgICAgIGlmICgoIWdvb21JbmZvLT51cGRhdGUuc3RhdGVTZWxlY3Rpb25CbG9ja2VyKQorICAgICAgICAgICYmIChnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMykpKSB7CisgICAgICAgIGdvb21JbmZvLT51cGRhdGUuc3RhdGVTZWxlY3Rpb25SbmQgPQorICAgICAgICAgICAgZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIGdvb21JbmZvLT5zdGF0ZXNSYW5nZU1heCk7CisgICAgICAgIGdvb21JbmZvLT51cGRhdGUuc3RhdGVTZWxlY3Rpb25CbG9ja2VyID0gMzsKKyAgICAgIH0gZWxzZSBpZiAoZ29vbUluZm8tPnVwZGF0ZS5zdGF0ZVNlbGVjdGlvbkJsb2NrZXIpCisgICAgICAgIGdvb21JbmZvLT51cGRhdGUuc3RhdGVTZWxlY3Rpb25CbG9ja2VyLS07CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBnb29tSW5mby0+c3RhdGVzTnVtYmVyOyBpKyspCisgICAgICAgIGlmICgoZ29vbUluZm8tPnVwZGF0ZS5zdGF0ZVNlbGVjdGlvblJuZCA+PSBnb29tSW5mby0+c3RhdGVzW2ldLnJhbmdlbWluKQorICAgICAgICAgICAgJiYgKGdvb21JbmZvLT51cGRhdGUuc3RhdGVTZWxlY3Rpb25SbmQgPD0KKyAgICAgICAgICAgICAgICBnb29tSW5mby0+c3RhdGVzW2ldLnJhbmdlbWF4KSkKKyAgICAgICAgICBnb29tSW5mby0+Y3VyR1N0YXRlID0gJihnb29tSW5mby0+c3RhdGVzW2ldKTsKKworICAgICAgaWYgKChnb29tSW5mby0+Y3VyR1N0YXRlLT5kcmF3SUZTKSAmJiAoZ29vbUluZm8tPnVwZGF0ZS5pZnNfaW5jciA8PSAwKSkgeworICAgICAgICBnb29tSW5mby0+dXBkYXRlLnJlY2F5X2lmcyA9IDU7CisgICAgICAgIGdvb21JbmZvLT51cGRhdGUuaWZzX2luY3IgPSAxMTsKKyAgICAgIH0KKworICAgICAgaWYgKCghZ29vbUluZm8tPmN1ckdTdGF0ZS0+ZHJhd0lGUykgJiYgKGdvb21JbmZvLT51cGRhdGUuaWZzX2luY3IgPiAwKQorICAgICAgICAgICYmIChnb29tSW5mby0+dXBkYXRlLmRlY2F5X2lmcyA8PSAwKSkKKyAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS5kZWNheV9pZnMgPSAxMDA7CisKKyAgICAgIGlmICghZ29vbUluZm8tPmN1ckdTdGF0ZS0+ZHJhd1Njb3BlKQorICAgICAgICBnb29tSW5mby0+dXBkYXRlLnN0b3BfbGluZXMgPSAweGYwMDAgJiA1OworCisgICAgICBpZiAoIWdvb21JbmZvLT5jdXJHU3RhdGUtPmRyYXdTY29wZSkgeworICAgICAgICBnb29tSW5mby0+dXBkYXRlLnN0b3BfbGluZXMgPSAwOworICAgICAgICBnb29tSW5mby0+dXBkYXRlLmxpbmVNb2RlID0gZ29vbUluZm8tPnVwZGF0ZS5kcmF3TGluZXNEdXJhdGlvbjsKKyAgICAgIH0KKworICAgICAgLyogaWYgKGdvb21JbmZvLT51cGRhdGUuZ29vbXZhciAlIDEgPT0gMCkgKi8KKyAgICAgIHsKKyAgICAgICAgZ3VpbnQzMiB2dG1wOworICAgICAgICBndWludDMyIG5ld3ZpdDsKKworICAgICAgICBnb29tSW5mby0+dXBkYXRlLmxvY2t2YXIgPSA1MDsKKyAgICAgICAgbmV3dml0ID0KKyAgICAgICAgICAgIFNUT1BfU1BFRUQgKyAxIC0KKyAgICAgICAgICAgICgoZmxvYXQpIDMuNWYgKiBsb2cxMCAoZ29vbUluZm8tPnNvdW5kLnNwZWVkdmFyICogNjAgKyAxKSk7CisgICAgICAgIC8qIHJldGFibGlyIGxlIHpvb20gYXZhbnQuLiAqLworICAgICAgICBpZiAoKGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEucmV2ZXJzZSkKKyAgICAgICAgICAgICYmICghKGdvb21JbmZvLT5jeWNsZSAlIDEzKSkgJiYgKHJhbmQgKCkgJSA1ID09IDApKSB7CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5yZXZlcnNlID0gMDsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLnZpdGVzc2UgPSBTVE9QX1NQRUVEIC0gMjsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLmxvY2t2YXIgPSA3NTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDEwKSA9PSAwKSB7CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5yZXZlcnNlID0gMTsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLmxvY2t2YXIgPSAxMDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDEwKSA9PSAwKQorICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudml0ZXNzZSA9IFNUT1BfU1BFRUQgLSAxOworICAgICAgICBpZiAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDEyKSA9PSAwKQorICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudml0ZXNzZSA9IFNUT1BfU1BFRUQgKyAxOworCisgICAgICAgIC8qIGNoYW5nZW1lbnQgZGUgbWlsaWV1Li4gKi8KKyAgICAgICAgc3dpdGNoIChnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMjUpKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLm1pZGRsZVkgPQorICAgICAgICAgICAgICAgIGdvb21JbmZvLT5zY3JlZW4uaGVpZ2h0IC0gMTsKKyAgICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEubWlkZGxlWCA9CisgICAgICAgICAgICAgICAgZ29vbUluZm8tPnNjcmVlbi53aWR0aCAvIDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5taWRkbGVYID0KKyAgICAgICAgICAgICAgICBnb29tSW5mby0+c2NyZWVuLndpZHRoIC0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLm1pZGRsZVggPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEubWlkZGxlWSA9CisgICAgICAgICAgICAgICAgZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQgLyAyOworICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5taWRkbGVYID0KKyAgICAgICAgICAgICAgICBnb29tSW5mby0+c2NyZWVuLndpZHRoIC8gMjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5tb2RlID09IFdBVEVSX01PREUpCisgICAgICAgICAgICB8fCAoZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5tb2RlID09IFlPTkxZX01PREUpCisgICAgICAgICAgICB8fCAoZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5tb2RlID09IEFNVUxFVFRFX01PREUpKSB7CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5taWRkbGVYID0gZ29vbUluZm8tPnNjcmVlbi53aWR0aCAvIDI7CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5taWRkbGVZID0gZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQgLyAyOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoICh2dG1wID0gKGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAxNSkpKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS52UGxhbmVFZmZlY3QgPQorICAgICAgICAgICAgICAgIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAzKQorICAgICAgICAgICAgICAgIC0gZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDMpOworICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5oUGxhbmVFZmZlY3QgPQorICAgICAgICAgICAgICAgIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAzKQorICAgICAgICAgICAgICAgIC0gZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS52UGxhbmVFZmZlY3QgPSAwOworICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5oUGxhbmVFZmZlY3QgPQorICAgICAgICAgICAgICAgIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCA4KQorICAgICAgICAgICAgICAgIC0gZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS52UGxhbmVFZmZlY3QgPQorICAgICAgICAgICAgICAgIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCA1KQorICAgICAgICAgICAgICAgIC0gZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDUpOworICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5oUGxhbmVFZmZlY3QgPQorICAgICAgICAgICAgICAgIC1nb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLnZQbGFuZUVmZmVjdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEuaFBsYW5lRWZmZWN0ID0KKyAgICAgICAgICAgICAgICA1ICsgZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDgpOworICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS52UGxhbmVFZmZlY3QgPQorICAgICAgICAgICAgICAgIC1nb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLmhQbGFuZUVmZmVjdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudlBsYW5lRWZmZWN0ID0KKyAgICAgICAgICAgICAgICA1ICsgZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDgpOworICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5oUGxhbmVFZmZlY3QgPQorICAgICAgICAgICAgICAgIC1nb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLmhQbGFuZUVmZmVjdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLmhQbGFuZUVmZmVjdCA9IDA7CisgICAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLnZQbGFuZUVmZmVjdCA9CisgICAgICAgICAgICAgICAgZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDEwKQorICAgICAgICAgICAgICAgIC0gZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDEwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLmhQbGFuZUVmZmVjdCA9CisgICAgICAgICAgICAgICAgZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDEwKQorICAgICAgICAgICAgICAgIC0gZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDEwKTsKKyAgICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudlBsYW5lRWZmZWN0ID0KKyAgICAgICAgICAgICAgICBnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMTApCisgICAgICAgICAgICAgICAgLSBnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMTApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICh2dG1wIDwgMTApIHsKKyAgICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS52UGxhbmVFZmZlY3QgPSAwOworICAgICAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLmhQbGFuZUVmZmVjdCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDUpICE9IDApCisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5ub2lzaWZ5ID0gMDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5ub2lzaWZ5ID0KKyAgICAgICAgICAgICAgZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDIpICsgMTsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLmxvY2t2YXIgKj0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLm1vZGUgPT0gQU1VTEVUVEVfTU9ERSkgeworICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudlBsYW5lRWZmZWN0ID0gMDsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLmhQbGFuZUVmZmVjdCA9IDA7CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5ub2lzaWZ5ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5taWRkbGVYID09IDEpCisgICAgICAgICAgICB8fCAoZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5taWRkbGVYID09CisgICAgICAgICAgICAgICAgKHNpZ25lZCBpbnQpIGdvb21JbmZvLT5zY3JlZW4ud2lkdGggLSAxKSkgeworICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudlBsYW5lRWZmZWN0ID0gMDsKKyAgICAgICAgICBpZiAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDIpKQorICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5oUGxhbmVFZmZlY3QgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChzaWduZWQgaW50KSBuZXd2aXQgPCBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLnZpdGVzc2UpIHsgICAgLyogb24gYWNjZWxlcmUgKi8KKyAgICAgICAgICBwemZkID0gJmdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGE7CisgICAgICAgICAgaWYgKCgobmV3dml0IDwgU1RPUF9TUEVFRCAtIDcpICYmCisgICAgICAgICAgICAgICAgICAoZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS52aXRlc3NlIDwgU1RPUF9TUEVFRCAtIDYpICYmCisgICAgICAgICAgICAgICAgICAoZ29vbUluZm8tPmN5Y2xlICUgMyA9PSAwKSkKKyAgICAgICAgICAgICAgfHwgKGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCA0MCkgPT0gMCkpIHsKKyAgICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudml0ZXNzZSA9CisgICAgICAgICAgICAgICAgU1RPUF9TUEVFRCAtIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAyKQorICAgICAgICAgICAgICAgICsgZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDIpOworICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5yZXZlcnNlID0KKyAgICAgICAgICAgICAgICAhZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5yZXZlcnNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLnZpdGVzc2UgPQorICAgICAgICAgICAgICAgIChuZXd2aXQgKyBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLnZpdGVzc2UgKiA3KSAvIDg7CisgICAgICAgICAgfQorICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUubG9ja3ZhciArPSA1MDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoZ29vbUluZm8tPnVwZGF0ZS5sb2NrdmFyID4gMTUwKSB7CisgICAgICAgIGdvb21JbmZvLT51cGRhdGUuc3dpdGNoSW5jciA9IGdvb21JbmZvLT51cGRhdGUuc3dpdGNoSW5jckFtb3VudDsKKyAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS5zd2l0Y2hNdWx0ID0gMS4wZjsKKyAgICAgIH0KKyAgICB9CisgICAgLyogbW9kZSBtZWdhLWxlbnQgKi8KKyAgICBpZiAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDcwMCkgPT0gMCkgeworICAgICAgLyogCisgICAgICAgKiBwcmludGYgKCJjb3VwIGR1IHNvcnQuLi5cbiIpIDsKKyAgICAgICAqLworICAgICAgcHpmZCA9ICZnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhOworICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS52aXRlc3NlID0gU1RPUF9TUEVFRCAtIDE7CisgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLnBlcnRlZGVjID0gODsKKyAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEuc3FydHBlcnRlID0gMTY7CisgICAgICBnb29tSW5mby0+dXBkYXRlLmdvb212YXIgPSAxOworICAgICAgZ29vbUluZm8tPnVwZGF0ZS5sb2NrdmFyICs9IDUwOworICAgICAgZ29vbUluZm8tPnVwZGF0ZS5zd2l0Y2hJbmNyID0gZ29vbUluZm8tPnVwZGF0ZS5zd2l0Y2hJbmNyQW1vdW50OworICAgICAgZ29vbUluZm8tPnVwZGF0ZS5zd2l0Y2hNdWx0ID0gMS4wZjsKKyAgICB9CisgIH0KKworICAvKgorICAgKiBncm9zIGZyZWluIHNpIGxhIG11c2lxdWUgZXN0IGNhbG1lCisgICAqLworICBpZiAoKGdvb21JbmZvLT5zb3VuZC5zcGVlZHZhciA8IDAuMDFmKQorICAgICAgJiYgKGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudml0ZXNzZSA8IFNUT1BfU1BFRUQgLSA0KQorICAgICAgJiYgKGdvb21JbmZvLT5jeWNsZSAlIDE2ID09IDApKSB7CisgICAgcHpmZCA9ICZnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhOworICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudml0ZXNzZSArPSAzOworICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEucGVydGVkZWMgPSA4OworICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEuc3FydHBlcnRlID0gMTY7CisgICAgZ29vbUluZm8tPnVwZGF0ZS5nb29tdmFyID0gMDsKKyAgfQorCisgIC8qCisgICAqIGJhaXNzZXIgcmVndWxpZXJlbWVudCBsYSB2aXRlc3NlLi4uCisgICAqLworICBpZiAoKGdvb21JbmZvLT5jeWNsZSAlIDczID09IDApCisgICAgICAmJiAoZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS52aXRlc3NlIDwgU1RPUF9TUEVFRCAtIDUpKSB7CisgICAgcHpmZCA9ICZnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhOworICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudml0ZXNzZSsrOworICB9CisKKyAgLyoKKyAgICogYXJyZXRlciBkZSBkZWNy77+9bWVudGVyIGF1IGJvdXQgZCd1biBjZXJ0YWluIHRlbXBzCisgICAqLworICBpZiAoKGdvb21JbmZvLT5jeWNsZSAlIDEwMSA9PSAwKQorICAgICAgJiYgKGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEucGVydGVkZWMgPT0gNykpIHsKKyAgICBwemZkID0gJmdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGE7CisgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5wZXJ0ZWRlYyA9IDg7CisgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5zcXJ0cGVydGUgPSAxNjsKKyAgfQorCisgIC8qCisgICAqIFBlcm1ldCBkZSBmb3JjZXIgdW4gZWZmZXQuCisgICAqLworICBpZiAoKGZvcmNlTW9kZSA+IDApICYmIChmb3JjZU1vZGUgPD0gTkJfRlgpKSB7CisgICAgcHpmZCA9ICZnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhOworICAgIHB6ZmQtPm1vZGUgPSBmb3JjZU1vZGUgLSAxOworICB9CisKKyAgaWYgKGZvcmNlTW9kZSA9PSAtMSkgeworICAgIHB6ZmQgPSBOVUxMOworICB9CisKKyAgLyoKKyAgICogQ2hhbmdlbWVudCBkJ2VmZmV0IGRlIHpvb20gIQorICAgKi8KKyAgaWYgKHB6ZmQgIT0gTlVMTCkgeworICAgIGludCBkaWY7CisKKyAgICBnb29tSW5mby0+dXBkYXRlLmN5Y2xlc1NpbmNlTGFzdENoYW5nZSA9IDA7CisKKyAgICBnb29tSW5mby0+dXBkYXRlLnN3aXRjaEluY3IgPSBnb29tSW5mby0+dXBkYXRlLnN3aXRjaEluY3JBbW91bnQ7CisKKyAgICBkaWYgPQorICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLnZpdGVzc2UgLQorICAgICAgICBnb29tSW5mby0+dXBkYXRlLnByZXZpb3VzWm9vbVNwZWVkOworICAgIGlmIChkaWYgPCAwKQorICAgICAgZGlmID0gLWRpZjsKKworICAgIGlmIChkaWYgPiAyKSB7CisgICAgICBnb29tSW5mby0+dXBkYXRlLnN3aXRjaEluY3IgKj0gKGRpZiArIDIpIC8gMjsKKyAgICB9CisgICAgZ29vbUluZm8tPnVwZGF0ZS5wcmV2aW91c1pvb21TcGVlZCA9CisgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudml0ZXNzZTsKKyAgICBnb29tSW5mby0+dXBkYXRlLnN3aXRjaE11bHQgPSAxLjBmOworCisgICAgaWYgKCgoZ29vbUluZm8tPnNvdW5kLnRpbWVTaW5jZUxhc3RHb29tID09IDApCisgICAgICAgICAgICAmJiAoZ29vbUluZm8tPnNvdW5kLnRvdGFsZ29vbSA8IDIpKSB8fCAoZm9yY2VNb2RlID4gMCkpIHsKKyAgICAgIGdvb21JbmZvLT51cGRhdGUuc3dpdGNoSW5jciA9IDA7CisgICAgICBnb29tSW5mby0+dXBkYXRlLnN3aXRjaE11bHQgPSBnb29tSW5mby0+dXBkYXRlLnN3aXRjaE11bHRBbW91bnQ7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChnb29tSW5mby0+dXBkYXRlLmN5Y2xlc1NpbmNlTGFzdENoYW5nZSA+IFRJTUVfQlRXX0NIRykgeworICAgICAgcHpmZCA9ICZnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhOworICAgICAgZ29vbUluZm8tPnVwZGF0ZS5jeWNsZXNTaW5jZUxhc3RDaGFuZ2UgPSAwOworICAgIH0gZWxzZQorICAgICAgZ29vbUluZm8tPnVwZGF0ZS5jeWNsZXNTaW5jZUxhc3RDaGFuZ2UrKzsKKyAgfQorCisjaWZkZWYgVkVSQk9TRQorICBpZiAocHpmZCkgeworICAgIHByaW50ZiAoIkdPT006IHB6ZmQtPm1vZGUgPSAlZFxuIiwgcHpmZC0+bW9kZSk7CisgIH0KKyNlbmRpZgorCisgIC8qIFpvb20gaGVyZSAhICovCisgIHpvb21GaWx0ZXJGYXN0UkdCIChnb29tSW5mbywgZ29vbUluZm8tPnAxLCBnb29tSW5mby0+cDIsIHB6ZmQsCisgICAgICBnb29tSW5mby0+c2NyZWVuLndpZHRoLCBnb29tSW5mby0+c2NyZWVuLmhlaWdodCwKKyAgICAgIGdvb21JbmZvLT51cGRhdGUuc3dpdGNoSW5jciwgZ29vbUluZm8tPnVwZGF0ZS5zd2l0Y2hNdWx0KTsKKworICAvKgorICAgKiBBZmZpY2hhZ2UgdGVudGFjdWxlCisgICAqLworCisgIGdvb21JbmZvLT50ZW50YWNsZXNfZnguYXBwbHkgKCZnb29tSW5mby0+dGVudGFjbGVzX2Z4LCBnb29tSW5mby0+cDEsCisgICAgICBnb29tSW5mby0+cDIsIGdvb21JbmZvKTsKKyAgZ29vbUluZm8tPnN0YXJfZnguYXBwbHkgKCZnb29tSW5mby0+c3Rhcl9meCwgZ29vbUluZm8tPnAyLCBnb29tSW5mby0+cDEsCisgICAgICBnb29tSW5mbyk7CisKKyAgLyoKKyAgICogR2VzdGlvbiBkdSBTY29wZQorICAgKi8KKworICAvKgorICAgKiBhcnJldCBkZW1hbmRlCisgICAqLworICBpZiAoKGdvb21JbmZvLT51cGRhdGUuc3RvcF9saW5lcyAmIDB4ZjAwMCkKKyAgICAgIHx8ICghZ29vbUluZm8tPmN1ckdTdGF0ZS0+ZHJhd1Njb3BlKSkgeworICAgIGZsb2F0IHBhcmFtMSA9IDAsIHBhcmFtMiA9IDAsIGFtcGxpdHVkZTsKKyAgICBpbnQgY291bGV1cjsKKyAgICBpbnQgbW9kZTsKKworICAgIGNob29zZV9hX2dvb21fbGluZSAoZ29vbUluZm8sICZwYXJhbTEsICZwYXJhbTIsICZjb3VsZXVyLCAmbW9kZSwgJmFtcGxpdHVkZSwKKyAgICAgICAgMSk7CisgICAgY291bGV1ciA9IEdNTF9CTEFDSzsKKworICAgIGdvb21fbGluZXNfc3dpdGNoX3RvIChnb29tSW5mby0+Z21saW5lMSwgbW9kZSwgcGFyYW0xLCBhbXBsaXR1ZGUsIGNvdWxldXIpOworICAgIGdvb21fbGluZXNfc3dpdGNoX3RvIChnb29tSW5mby0+Z21saW5lMiwgbW9kZSwgcGFyYW0yLCBhbXBsaXR1ZGUsIGNvdWxldXIpOworICAgIGdvb21JbmZvLT51cGRhdGUuc3RvcF9saW5lcyAmPSAweDBmZmY7CisgIH0KKworICAvKgorICAgKiBhcnJldCBhbGVhdG9yZS4uIGNoYW5nZW1lbnQgZGUgbW9kZSBkZSBsaWduZS4uCisgICAqLworICBpZiAoZ29vbUluZm8tPnVwZGF0ZS5saW5lTW9kZSAhPSBnb29tSW5mby0+dXBkYXRlLmRyYXdMaW5lc0R1cmF0aW9uKSB7CisgICAgZ29vbUluZm8tPnVwZGF0ZS5saW5lTW9kZS0tOworICAgIGlmIChnb29tSW5mby0+dXBkYXRlLmxpbmVNb2RlID09IC0xKQorICAgICAgZ29vbUluZm8tPnVwZGF0ZS5saW5lTW9kZSA9IDA7CisgIH0gZWxzZSBpZiAoKGdvb21JbmZvLT5jeWNsZSAlIDgwID09IDApCisgICAgICAmJiAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDUpID09IDApICYmIGdvb21JbmZvLT51cGRhdGUubGluZU1vZGUpCisgICAgZ29vbUluZm8tPnVwZGF0ZS5saW5lTW9kZS0tOworCisgIGlmICgoZ29vbUluZm8tPmN5Y2xlICUgMTIwID09IDApCisgICAgICAmJiAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDQpID09IDApCisgICAgICAmJiAoZ29vbUluZm8tPmN1ckdTdGF0ZS0+ZHJhd1Njb3BlKSkgeworICAgIGlmIChnb29tSW5mby0+dXBkYXRlLmxpbmVNb2RlID09IDApCisgICAgICBnb29tSW5mby0+dXBkYXRlLmxpbmVNb2RlID0gZ29vbUluZm8tPnVwZGF0ZS5kcmF3TGluZXNEdXJhdGlvbjsKKyAgICBlbHNlIGlmIChnb29tSW5mby0+dXBkYXRlLmxpbmVNb2RlID09IGdvb21JbmZvLT51cGRhdGUuZHJhd0xpbmVzRHVyYXRpb24pIHsKKyAgICAgIGZsb2F0IHBhcmFtMSwgcGFyYW0yLCBhbXBsaXR1ZGU7CisgICAgICBpbnQgY291bGV1cjEsIGNvdWxldXIyOworICAgICAgaW50IG1vZGU7CisKKyAgICAgIGdvb21JbmZvLT51cGRhdGUubGluZU1vZGUtLTsKKyAgICAgIGNob29zZV9hX2dvb21fbGluZSAoZ29vbUluZm8sICZwYXJhbTEsICZwYXJhbTIsICZjb3VsZXVyMSwKKyAgICAgICAgICAmbW9kZSwgJmFtcGxpdHVkZSwgZ29vbUluZm8tPnVwZGF0ZS5zdG9wX2xpbmVzKTsKKworICAgICAgY291bGV1cjIgPSA1IC0gY291bGV1cjE7CisgICAgICBpZiAoZ29vbUluZm8tPnVwZGF0ZS5zdG9wX2xpbmVzKSB7CisgICAgICAgIGdvb21JbmZvLT51cGRhdGUuc3RvcF9saW5lcy0tOworICAgICAgICBpZiAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDIpKQorICAgICAgICAgIGNvdWxldXIyID0gY291bGV1cjEgPSBHTUxfQkxBQ0s7CisgICAgICB9CisKKyAgICAgIGdvb21fbGluZXNfc3dpdGNoX3RvIChnb29tSW5mby0+Z21saW5lMSwgbW9kZSwgcGFyYW0xLCBhbXBsaXR1ZGUsCisgICAgICAgICAgY291bGV1cjEpOworICAgICAgZ29vbV9saW5lc19zd2l0Y2hfdG8gKGdvb21JbmZvLT5nbWxpbmUyLCBtb2RlLCBwYXJhbTIsIGFtcGxpdHVkZSwKKyAgICAgICAgICBjb3VsZXVyMik7CisgICAgfQorICB9CisKKyAgLyoKKyAgICogc2kgb24gZXN0IGRhbnMgdW4gZ29vbSA6IGFmZmljaGVyIGxlcyBsaWduZXMuLi4KKyAgICovCisgIGlmICgoZ29vbUluZm8tPnVwZGF0ZS5saW5lTW9kZSAhPSAwKQorICAgICAgfHwgKGdvb21JbmZvLT5zb3VuZC50aW1lU2luY2VMYXN0R29vbSA8IDUpKSB7CisgICAgZ29vbUluZm8tPmdtbGluZTItPnBvd2VyID0gZ29vbUluZm8tPmdtbGluZTEtPnBvd2VyOworCisgICAgZ29vbV9saW5lc19kcmF3IChnb29tSW5mbywgZ29vbUluZm8tPmdtbGluZTEsIGRhdGFbMF0sIGdvb21JbmZvLT5wMik7CisgICAgZ29vbV9saW5lc19kcmF3IChnb29tSW5mbywgZ29vbUluZm8tPmdtbGluZTIsIGRhdGFbMV0sIGdvb21JbmZvLT5wMik7CisKKyAgICBpZiAoKChnb29tSW5mby0+Y3ljbGUgJSAxMjEpID09IDkpCisgICAgICAgICYmIChnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMykgPT0gMSkKKyAgICAgICAgJiYgKChnb29tSW5mby0+dXBkYXRlLmxpbmVNb2RlID09IDApCisgICAgICAgICAgICB8fCAoZ29vbUluZm8tPnVwZGF0ZS5saW5lTW9kZSA9PQorICAgICAgICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuZHJhd0xpbmVzRHVyYXRpb24pKSkgeworICAgICAgZmxvYXQgcGFyYW0xLCBwYXJhbTIsIGFtcGxpdHVkZTsKKyAgICAgIGludCBjb3VsZXVyMSwgY291bGV1cjI7CisgICAgICBpbnQgbW9kZTsKKworICAgICAgY2hvb3NlX2FfZ29vbV9saW5lIChnb29tSW5mbywgJnBhcmFtMSwgJnBhcmFtMiwgJmNvdWxldXIxLAorICAgICAgICAgICZtb2RlLCAmYW1wbGl0dWRlLCBnb29tSW5mby0+dXBkYXRlLnN0b3BfbGluZXMpOworICAgICAgY291bGV1cjIgPSA1IC0gY291bGV1cjE7CisKKyAgICAgIGlmIChnb29tSW5mby0+dXBkYXRlLnN0b3BfbGluZXMpIHsKKyAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS5zdG9wX2xpbmVzLS07CisgICAgICAgIGlmIChnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMikpCisgICAgICAgICAgY291bGV1cjIgPSBjb3VsZXVyMSA9IEdNTF9CTEFDSzsKKyAgICAgIH0KKyAgICAgIGdvb21fbGluZXNfc3dpdGNoX3RvIChnb29tSW5mby0+Z21saW5lMSwgbW9kZSwgcGFyYW0xLCBhbXBsaXR1ZGUsCisgICAgICAgICAgY291bGV1cjEpOworICAgICAgZ29vbV9saW5lc19zd2l0Y2hfdG8gKGdvb21JbmZvLT5nbWxpbmUyLCBtb2RlLCBwYXJhbTIsIGFtcGxpdHVkZSwKKyAgICAgICAgICBjb3VsZXVyMik7CisgICAgfQorICB9CisKKyAgcmV0dXJuX3ZhbCA9IGdvb21JbmZvLT5wMTsKKyAgdG1wID0gZ29vbUluZm8tPnAxOworICBnb29tSW5mby0+cDEgPSBnb29tSW5mby0+cDI7CisgIGdvb21JbmZvLT5wMiA9IHRtcDsKKworICAvKiBhZmZpY2hhZ2UgZXQgc3dhcHBhZ2UgZGVzIGJ1ZmZlcnMuLiAqLworICBnb29tSW5mby0+Y3ljbGUrKzsKKworICBnb29tSW5mby0+Y29udm9sdmVfZnguYXBwbHkgKCZnb29tSW5mby0+Y29udm9sdmVfZngsIHJldHVybl92YWwsCisgICAgICBnb29tSW5mby0+b3V0cHV0QnVmLCBnb29tSW5mbyk7CisKKyAgcmV0dXJuIChndWludDMyICopIGdvb21JbmZvLT5vdXRwdXRCdWY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgIENMT1NFICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZ29vbV9jbG9zZSAoUGx1Z2luSW5mbyAqIGdvb21JbmZvKQoreworICBpZiAoZ29vbUluZm8tPnBpeGVsICE9IE5VTEwpCisgICAgZnJlZSAoZ29vbUluZm8tPnBpeGVsKTsKKyAgaWYgKGdvb21JbmZvLT5iYWNrICE9IE5VTEwpCisgICAgZnJlZSAoZ29vbUluZm8tPmJhY2spOworICBpZiAoZ29vbUluZm8tPmNvbnYgIT0gTlVMTCkKKyAgICBmcmVlIChnb29tSW5mby0+Y29udik7CisKKyAgZ29vbUluZm8tPnBpeGVsID0gZ29vbUluZm8tPmJhY2sgPSBOVUxMOworICBnb29tSW5mby0+Y29udiA9IE5VTEw7CisgIGdvb21fcmFuZG9tX2ZyZWUgKGdvb21JbmZvLT5nUmFuZG9tKTsKKyAgZ29vbV9saW5lc19mcmVlICgmZ29vbUluZm8tPmdtbGluZTEpOworICBnb29tX2xpbmVzX2ZyZWUgKCZnb29tSW5mby0+Z21saW5lMik7CisKKyAgLyogcmVsZWFzZV9pZnMgKCk7ICovCisgIGdvb21JbmZvLT5pZnNfZnguZnJlZSAoJmdvb21JbmZvLT5pZnNfZngpOworICBnb29tSW5mby0+Y29udm9sdmVfZnguZnJlZSAoJmdvb21JbmZvLT5jb252b2x2ZV9meCk7CisgIGdvb21JbmZvLT5zdGFyX2Z4LmZyZWUgKCZnb29tSW5mby0+c3Rhcl9meCk7CisgIGdvb21JbmZvLT50ZW50YWNsZXNfZnguZnJlZSAoJmdvb21JbmZvLT50ZW50YWNsZXNfZngpOworICBnb29tSW5mby0+em9vbUZpbHRlcl9meC5mcmVlICgmZ29vbUluZm8tPnpvb21GaWx0ZXJfZngpOworCisgIHBsdWdpbl9pbmZvX2ZyZWUgKGdvb21JbmZvKTsKKyAgZnJlZSAoZ29vbUluZm8pOworfQorCisKKy8qICoqKiAqLwordm9pZAorY2hvb3NlX2FfZ29vbV9saW5lIChQbHVnaW5JbmZvICogZ29vbUluZm8sIGZsb2F0ICpwYXJhbTEsIGZsb2F0ICpwYXJhbTIsCisgICAgaW50ICpjb3VsZXVyLCBpbnQgKm1vZGUsIGZsb2F0ICphbXBsaXR1ZGUsIGludCBmYXIpCit7CisgICptb2RlID0gZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDMpOworICAqYW1wbGl0dWRlID0gMS4wZjsKKyAgc3dpdGNoICgqbW9kZSkgeworICAgIGNhc2UgR01MX0NJUkNMRToKKyAgICAgIGlmIChmYXIpIHsKKyAgICAgICAgKnBhcmFtMSA9ICpwYXJhbTIgPSAwLjQ3ZjsKKyAgICAgICAgKmFtcGxpdHVkZSA9IDAuOGY7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAzKSA9PSAwKSB7CisgICAgICAgICpwYXJhbTEgPSAqcGFyYW0yID0gMDsKKyAgICAgICAgKmFtcGxpdHVkZSA9IDMuMGY7CisgICAgICB9IGVsc2UgaWYgKGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAyKSkgeworICAgICAgICAqcGFyYW0xID0gMC40MGYgKiBnb29tSW5mby0+c2NyZWVuLmhlaWdodDsKKyAgICAgICAgKnBhcmFtMiA9IDAuMjJmICogZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAqcGFyYW0xID0gKnBhcmFtMiA9IGdvb21JbmZvLT5zY3JlZW4uaGVpZ2h0ICogMC4zNTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR01MX0hMSU5FOgorICAgICAgaWYgKGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCA0KSB8fCBmYXIpIHsKKyAgICAgICAgKnBhcmFtMSA9IGdvb21JbmZvLT5zY3JlZW4uaGVpZ2h0IC8gNzsKKyAgICAgICAgKnBhcmFtMiA9IDYuMGYgKiBnb29tSW5mby0+c2NyZWVuLmhlaWdodCAvIDcuMGY7CisgICAgICB9IGVsc2UgeworICAgICAgICAqcGFyYW0xID0gKnBhcmFtMiA9IGdvb21JbmZvLT5zY3JlZW4uaGVpZ2h0IC8gMi4wZjsKKyAgICAgICAgKmFtcGxpdHVkZSA9IDIuMGY7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdNTF9WTElORToKKyAgICAgIGlmIChnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMykgfHwgZmFyKSB7CisgICAgICAgICpwYXJhbTEgPSBnb29tSW5mby0+c2NyZWVuLndpZHRoIC8gNy4wZjsKKyAgICAgICAgKnBhcmFtMiA9IDYuMGYgKiBnb29tSW5mby0+c2NyZWVuLndpZHRoIC8gNy4wZjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpwYXJhbTEgPSAqcGFyYW0yID0gZ29vbUluZm8tPnNjcmVlbi53aWR0aCAvIDIuMGY7CisgICAgICAgICphbXBsaXR1ZGUgPSAxLjVmOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICpwYXJhbTEgPSAqcGFyYW0yID0gMDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgKmNvdWxldXIgPSBnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgNik7Cit9CmRpZmYgLS1naXQgYS9nc3QvZ29vbS9nb29tX2ZpbHRlcnMuaCBiL2dzdC9nb29tL2dvb21fZmlsdGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMDk2ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9nb29tX2ZpbHRlcnMuaApAQCAtMCwwICsxLDcwIEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZuZGVmIEZJTFRFUlNfSAorI2RlZmluZSBGSUxURVJTX0gKKworI2luY2x1ZGUgImdvb21fY29uZmlnLmgiCisjaW5jbHVkZSAiZ29vbV90eXBlZGVmcy5oIgorI2luY2x1ZGUgImdvb21fdmlzdWFsX2Z4LmgiCisjaW5jbHVkZSAiZ29vbV9ncmFwaGljLmgiCisKK3ZvaWQgem9vbUZpbHRlclZpc3VhbEZYV3JhcHBlcl9jcmVhdGUoVmlzdWFsRlggKmZ4KTsKKworc3RydWN0IF9aT09NX0ZJTFRFUl9EQVRBCit7CisJaW50ICAgICB2aXRlc3NlOyAgICAgICAgICAgLyogMTI4ID0gdml0ZXNzZSBudWxlLi4uICogKiAyNTYgPSBlbiBhcnJpZXJlIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGh5cGVyIHZpdGUuLiAqICogMCA9IGVuIGF2YW50IGh5cGUgdml0ZS4gKi8KKwl1bnNpZ25lZCBjaGFyIHBlcnRlZGVjOworCXVuc2lnbmVkIGNoYXIgc3FydHBlcnRlOworCWludCAgICAgbWlkZGxlWCwgbWlkZGxlWTsgIC8qIG1pbGlldSBkZSBsJ2VmZmV0ICovCisJY2hhciAgICByZXZlcnNlOyAgICAgICAgICAgLyogaW52ZXJzZSBsYSB2aXRlc3NlICovCisJY2hhciAgICBtb2RlOyAgICAgICAgICAgICAgLyogdHlwZSBkJ2VmZmV0IO+/vSBhcHBsaXF1ZXIgKGNmIGxlcyAjZGVmaW5lKSAqLworCS8qKiBAc2luY2UgSnVuZSAyMDAxICovCisJaW50ICAgICBoUGxhbmVFZmZlY3Q7ICAgICAgLyogZGV2aWF0aW9uIGhvcml0b250YWxlICovCisJaW50ICAgICB2UGxhbmVFZmZlY3Q7ICAgICAgLyogZGV2aWF0aW9uIHZlcnRpY2FsZSAqLworCS8qKiBAc2luY2UgQXByaWwgMjAwMiAqLworCWludCAgICAgd2F2ZUVmZmVjdDsgICAgICAgIC8qIGFwcGxpcXVlIHVuZSAic3VyY291Y2hlIiBkZSB3YXZlIGVmZmVjdCAqLworCWludCAgICAgaHlwZXJjb3NFZmZlY3Q7ICAgIC8qIGFwcGxpcXVlIHVuZSAic3VyY291Y2hlIGRlIGh5cGVyY29zIGVmZmVjdCAqLworCisJY2hhciAgICBub2lzaWZ5OyAgICAgICAgICAgLyogYWpvdXRlIHVuIGJydWl0IGEgbGEgdHJhbnNmb3JtYXRpb24gKi8KK307CisKKyNkZWZpbmUgTk9STUFMX01PREUgMAorI2RlZmluZSBXQVZFX01PREUgMQorI2RlZmluZSBDUllTVEFMX0JBTExfTU9ERSAyCisjZGVmaW5lIFNDUlVOQ0hfTU9ERSAzCisjZGVmaW5lIEFNVUxFVFRFX01PREUgNAorI2RlZmluZSBXQVRFUl9NT0RFIDUKKyNkZWZpbmUgSFlQRVJDT1MxX01PREUgNgorI2RlZmluZSBIWVBFUkNPUzJfTU9ERSA3CisjZGVmaW5lIFlPTkxZX01PREUgOAorI2RlZmluZSBTUEVFRFdBWV9NT0RFIDkKKwordm9pZCBwb2ludEZpbHRlciAoUGx1Z2luSW5mbyAqZ29vbUluZm8sIFBpeGVsICogcGl4MSwgQ29sb3IgYywKKyAgICAgICAgICAgICAgICAgIGZsb2F0IHQxLCBmbG9hdCB0MiwgZmxvYXQgdDMsIGZsb2F0IHQ0LCBndWludDMyIGN5Y2xlKTsKKworLyogZmlsdHJlIGRlIHpvb20gOgorICogbGUgY29udGVudSBkZSBwaXgxIGVzdCBjb3BpZSBkYW5zIHBpeDIuCisgKiB6ZiA6IHNpIG5vbiBOVUxMLCBjb25maWd1cmUgbCdlZmZldC4KKyAqIHJlc3gscmVzeSA6IHRhaWxsZSBkZXMgYnVmZmVycy4KKyAqLwordm9pZCB6b29tRmlsdGVyRmFzdFJHQiAoUGx1Z2luSW5mbyAqZ29vbUluZm8sIFBpeGVsICogcGl4MSwgUGl4ZWwgKiBwaXgyLCBab29tRmlsdGVyRGF0YSAqIHpmLCBndWludDMyIHJlc3gsCisgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIHJlc3ksIGludCBzd2l0Y2hJbmNyLCBmbG9hdCBzd2l0Y2hNdWx0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvZ29vbS9nb29tX2Z4LmggYi9nc3QvZ29vbS9nb29tX2Z4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M4MmQ2YwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL2dvb21fZnguaApAQCAtMCwwICsxLDMwIEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZuZGVmIF9HT09NX0ZYX0gKKyNkZWZpbmUgX0dPT01fRlhfSAorCisjaW5jbHVkZSAiZ29vbV92aXN1YWxfZnguaCIKKyNpbmNsdWRlICJnb29tX3BsdWdpbl9pbmZvLmgiCisKK3ZvaWQgY29udm9sdmVfY3JlYXRlIChWaXN1YWxGWCAqdmZ4KTsKK3ZvaWQgZmx5aW5nX3N0YXJfY3JlYXRlIChWaXN1YWxGWCAqdmZ4KTsKKwordm9pZCB6b29tX2ZpbHRlcl9jKGludCBzaXplWCwgaW50IHNpemVZLCBQaXhlbCAqc3JjLCBQaXhlbCAqZGVzdCwgaW50ICpicnV0UywgaW50ICpicnV0RCwgaW50IGJ1ZmZyYXRpbywgaW50IHByZWNhbENvZWZbMTZdWzE2XSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vZ29vbV9ncmFwaGljLmggYi9nc3QvZ29vbS9nb29tX2dyYXBoaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGRkZTM3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vZ29vbV9ncmFwaGljLmgKQEAgLTAsMCArMSw5MiBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmbmRlZiBHUkFQSElDX0gKKyNkZWZpbmUgR1JBUEhJQ19ICisKK3R5cGVkZWYgdW5zaWduZWQgaW50IFVpbnQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIHNob3J0IHIsIHYsIGI7Cit9CitDb2xvcjsKKworZXh0ZXJuIGNvbnN0IENvbG9yIEJMQUNLOworZXh0ZXJuIGNvbnN0IENvbG9yIFdISVRFOworZXh0ZXJuIGNvbnN0IENvbG9yIFJFRDsKK2V4dGVybiBjb25zdCBDb2xvciBCTFVFOworZXh0ZXJuIGNvbnN0IENvbG9yIEdSRUVOOworZXh0ZXJuIGNvbnN0IENvbG9yIFlFTExPVzsKK2V4dGVybiBjb25zdCBDb2xvciBPUkFOR0U7CitleHRlcm4gY29uc3QgQ29sb3IgVklPTEVUOworCisKKyNpZmRlZiBDT0xPUl9CR1JBCisKKyNkZWZpbmUgQl9DSEFOTkVMIDB4RkYwMDAwMDAKKyNkZWZpbmUgR19DSEFOTkVMIDB4MDBGRjAwMDAKKyNkZWZpbmUgUl9DSEFOTkVMIDB4MDAwMEZGMDAKKyNkZWZpbmUgQV9DSEFOTkVMIDB4MDAwMDAwRkYKKyNkZWZpbmUgQl9PRkZTRVQgIDI0CisjZGVmaW5lIEdfT0ZGU0VUICAxNgorI2RlZmluZSBSX09GRlNFVCAgOAorI2RlZmluZSBBX09GRlNFVCAgMAorCit0eXBlZGVmIHVuaW9uIF9QSVhFTCB7CisgIHN0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciBiOworICAgIHVuc2lnbmVkIGNoYXIgZzsKKyAgICB1bnNpZ25lZCBjaGFyIHI7CisgICAgdW5zaWduZWQgY2hhciBhOworICB9IGNoYW5uZWxzOworICB1bnNpZ25lZCBpbnQgdmFsOworICB1bnNpZ25lZCBjaGFyIGNvcFs0XTsKK30gUGl4ZWw7CisKKyNlbHNlCisKKyNkZWZpbmUgQV9DSEFOTkVMIDB4RkYwMDAwMDAKKyNkZWZpbmUgUl9DSEFOTkVMIDB4MDBGRjAwMDAKKyNkZWZpbmUgR19DSEFOTkVMIDB4MDAwMEZGMDAKKyNkZWZpbmUgQl9DSEFOTkVMIDB4MDAwMDAwRkYKKyNkZWZpbmUgQV9PRkZTRVQgIDI0CisjZGVmaW5lIFJfT0ZGU0VUICAxNgorI2RlZmluZSBHX09GRlNFVCAgOAorI2RlZmluZSBCX09GRlNFVCAgMAorCit0eXBlZGVmIHVuaW9uIF9QSVhFTCB7CisgIHN0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciBhOworICAgIHVuc2lnbmVkIGNoYXIgcjsKKyAgICB1bnNpZ25lZCBjaGFyIGc7CisgICAgdW5zaWduZWQgY2hhciBiOworICB9IGNoYW5uZWxzOworICB1bnNpZ25lZCBpbnQgdmFsOworICB1bnNpZ25lZCBjaGFyIGNvcFs0XTsKK30gUGl4ZWw7CisKKyNlbmRpZiAvKiBDT0xPUl9CR1JBICovCisKKy8qCitpbmxpbmUgdm9pZCBzZXRQaXhlbFJHQiAoUGl4ZWwgKiBidWZmZXIsIFVpbnQgeCwgVWludCB5LCBDb2xvciBjKTsKK2lubGluZSB2b2lkIGdldFBpeGVsUkdCIChQaXhlbCAqIGJ1ZmZlciwgVWludCB4LCBVaW50IHksIENvbG9yICogYyk7CisqLworCisKKyNlbmRpZiAvKiBHUkFQSElDX0ggKi8KZGlmZiAtLWdpdCBhL2dzdC9nb29tL2dvb21fcGx1Z2luX2luZm8uaCBiL2dzdC9nb29tL2dvb21fcGx1Z2luX2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTBlOTZlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vZ29vbV9wbHVnaW5faW5mby5oCkBAIC0wLDAgKzEsMTgxIEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZuZGVmIF9QTFVHSU5fSU5GT19ICisjZGVmaW5lIF9QTFVHSU5fSU5GT19ICisKKyNpbmNsdWRlICJnb29tX3R5cGVkZWZzLmgiCisKKyNpbmNsdWRlICJnb29tX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiZ29vbV9ncmFwaGljLmgiCisjaW5jbHVkZSAiZ29vbV9jb25maWdfcGFyYW0uaCIKKyNpbmNsdWRlICJnb29tX3Zpc3VhbF9meC5oIgorI2luY2x1ZGUgImdvb21fZmlsdGVycy5oIgorI2luY2x1ZGUgImdvb21fdG9vbHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIgZHJhd0lGUzsKKwljaGFyIGRyYXdQb2ludHM7CisJY2hhciBkcmF3VGVudGFjbGU7CisKKwljaGFyIGRyYXdTY29wZTsKKwlpbnQgZmFyU2NvcGU7CisKKwlpbnQgcmFuZ2VtaW47CisJaW50IHJhbmdlbWF4OworfSBHb29tU3RhdGU7CisKKyNkZWZpbmUgU1RBVEVTX01BWF9OQiAxMjgKKworLyoqCisgKiBHaXZlcyBpbmZvcm1hdGlvbnMgYWJvdXQgdGhlIHNvdW5kLgorICovCitzdHJ1Y3QgX1NPVU5EX0lORk8geworCisJLyogbm90YSA6IGEgR29vbSBpcyBqdXN0IGEgc291bmQgZXZlbnQuLi4gKi8KKworCWludCB0aW1lU2luY2VMYXN0R29vbTsgICAvKiA+PSAwICovCisJZmxvYXQgZ29vbVBvd2VyOyAgICAgICAgIC8qIHBvd2VyIG9mIHRoZSBsYXN0IEdvb20gWzAuLjFdICovCisKKwlpbnQgdGltZVNpbmNlTGFzdEJpZ0dvb207ICAgLyogPj0gMCAqLworCisJZmxvYXQgdm9sdW1lOyAgICAgLyogWzAuLjFdICovCisJc2hvcnQgc2FtcGxlc1syXVs1MTJdOworCisJLyogb3RoZXIgImludGVybmFsIiBkYXRhcyBmb3IgdGhlIHNvdW5kX3Rlc3RlciAqLworCWZsb2F0IGdvb21fbGltaXQ7IC8qIGF1dG8tdXBkYXRlZCBsaW1pdCBvZiBnb29tX2RldGVjdGlvbiAqLworCWZsb2F0IGJpZ0dvb21MaW1pdDsKKwlmbG9hdCBhY2NlbHZhcjsgICAvKiBhY2NlbGVyYXRpb24gb2YgdGhlIHNvdW5kIC0gWzAuLjFdICovCisJZmxvYXQgc3BlZWR2YXI7ICAgLyogc3BlZWQgb2YgdGhlIHNvdW5kIC0gWzAuLjEwMF0gKi8KKwlpbnQgYWxsVGltZXNNYXg7CisJaW50IHRvdGFsZ29vbTsgICAgLyogbnVtYmVyIG9mIGdvb20gc2luY2UgbGFzdCByZXNldAorCQkJICAgKiAoYSByZXNldCBldmVyeSA2NCBjeWNsZXMpICovCisKKwlmbG9hdCBwcm92X21heDsgICAvKiBhY2NlbCBtYXggc2luY2UgbGFzdCByZXNldCAqLworCisJaW50IGN5Y2xlOworCisJLyogcHJpdmF0ZSAqLworCVBsdWdpblBhcmFtIHZvbHVtZV9wOworCVBsdWdpblBhcmFtIHNwZWVkX3A7CisJUGx1Z2luUGFyYW0gYWNjZWxfcDsKKwlQbHVnaW5QYXJhbSBnb29tX2xpbWl0X3A7CisgICAgICAgIFBsdWdpblBhcmFtIGdvb21fcG93ZXJfcDsKKwlQbHVnaW5QYXJhbSBsYXN0X2dvb21fcDsKKwlQbHVnaW5QYXJhbSBsYXN0X2JpZ2dvb21fcDsKKwlQbHVnaW5QYXJhbSBiaWdnb29tX3NwZWVkX2xpbWl0X3A7CisJUGx1Z2luUGFyYW0gYmlnZ29vbV9mYWN0b3JfcDsKKworCVBsdWdpblBhcmFtZXRlcnMgcGFyYW1zOyAvKiBjb250YWlucyB0aGUgcHJldmlvdXNseSBkZWZpbmVkIHBhcmFtZXRlcnMuICovCit9OworCisKKy8qKgorICogQWxsb3dzIEZYcyB0byBrbm93IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwbHVnaW4uCisgKi8KK3N0cnVjdCBfUExVR0lOX0lORk8geworCisJLyogcHVibGljIGRhdGFzICovCisKKwlpbnQgbmJQYXJhbXM7CisJUGx1Z2luUGFyYW1ldGVycyAqcGFyYW1zOworCisJLyogcHJpdmF0ZSBkYXRhcyAqLworCisJc3RydWN0IF9TSVpFX1RZUEUgeworCQlpbnQgd2lkdGg7CisJCWludCBoZWlnaHQ7CisJCWludCBzaXplOyAgIC8qID09IHNjcmVlbi5oZWlnaHQgKiBzY3JlZW4ud2lkdGguICovCisJfSBzY3JlZW47CisKKwlTb3VuZEluZm8gc291bmQ7CisKKwlpbnQgbmJWaXN1YWxzOworCVZpc3VhbEZYICoqdmlzdWFsczsgLyogcG9pbnRlcnMgb24gYWxsIHRoZSB2aXN1YWwgZnggKi8KKworCS8qKiBUaGUga25vd24gRlggKi8KKwlWaXN1YWxGWCBjb252b2x2ZV9meDsKKwlWaXN1YWxGWCBzdGFyX2Z4OworCVZpc3VhbEZYIHpvb21GaWx0ZXJfZng7CisJVmlzdWFsRlggdGVudGFjbGVzX2Z4OworCVZpc3VhbEZYIGlmc19meDsKKworCS8qKiBpbWFnZSBidWZmZXJzICovCisJZ3VpbnQzMiAqcGl4ZWw7CisJZ3VpbnQzMiAqYmFjazsKKwlQaXhlbCAqcDEsICpwMjsKKwlQaXhlbCAqY29udjsKKyAgUGl4ZWwgKm91dHB1dEJ1ZjsKKworCS8qKiBzdGF0ZSBvZiBnb29tICovCisJZ3VpbnQzMiBjeWNsZTsKKwlHb29tU3RhdGUgc3RhdGVzW1NUQVRFU19NQVhfTkJdOworCWludCBzdGF0ZXNOdW1iZXI7CisJaW50IHN0YXRlc1JhbmdlTWF4OworCisJR29vbVN0YXRlICpjdXJHU3RhdGU7CisKKwkvKiogZWZmZXQgZGUgbGlnbmUuLiAqLworCUdNTGluZSAqZ21saW5lMTsKKwlHTUxpbmUgKmdtbGluZTI7CisKKwkvKiogc2ludXMgdGFibGUgKi8KKwlpbnQgc2ludGFibGVbMHgxMDAwMF07CisKKwkvKiBJTlRFUk5BTFMgKi8KKwkKKwkvKiogZ29vbV91cGRhdGUgaW50ZXJuYWxzLgorCSAqIEkgdG9vayBhbGwgc3RhdGljIHZhcmlhYmxlcyBmcm9tIGdvb21fdXBkYXRlIGFuZCBwdXQgdGhlbSBoZXJlLi4gZm9yIHRoZSBtb21lbnQuCisJICovCisJc3RydWN0IHsKKwkJaW50IGxvY2t2YXI7ICAgICAgICAgICAgICAgLyogcG91ciBlbXBlY2hlciBkZSBub3V2ZWF1eCBjaGFuZ2VtZW50cyAqLworCQlpbnQgZ29vbXZhcjsgICAgICAgICAgICAgICAvKiBib3VjbGUgZGVzIGdvb21zICovCisJCWludCBsb29wdmFyOyAgICAgICAgICAgICAgIC8qIG1vdXZlbWVudCBkZXMgcG9pbnRzICovCisJCWludCBzdG9wX2xpbmVzOworCQlpbnQgaWZzX2luY3I7ICAgICAgICAgICAgICAvKiBkZXNzaW5lciBsJ2lmcyAoMCA9IG5vbjogPiA9IGluY3JlbWVudCkgKi8KKwkJaW50IGRlY2F5X2lmczsgICAgICAgICAgICAgLyogZGlzcGFyaXRpb24gZGUgbCdpZnMgKi8KKwkJaW50IHJlY2F5X2lmczsgICAgICAgICAgICAgLyogZGVkaXNwYXJpdGlvbiBkZSBsJ2lmcyAqLworCQlpbnQgY3ljbGVzU2luY2VMYXN0Q2hhbmdlOyAvKiBub21icmUgZGUgQ3ljbGUgRGVwdWlzIERlcm5pZXIgQ2hhbmdlbWVudCAqLworCQlpbnQgZHJhd0xpbmVzRHVyYXRpb247ICAgICAvKiBkdXJlZSBkZSBsYSB0cmFuc2l0aW9uIGVudHJlIGFmZmljaGVyIGxlcyBsaWduZXMgb3UgcGFzICovCisJCWludCBsaW5lTW9kZTsgICAgICAgICAgICAgIC8qIGwnZWZmZXQgbGluZWFpcmUgYSBkZXNzaW5lciAqLworCQlmbG9hdCBzd2l0Y2hNdWx0QW1vdW50OyAgICAvKiBTV0lUQ0hNVUxUICgyOS4wZi8zMC4wZikgKi8KKwkJaW50IHN3aXRjaEluY3JBbW91bnQ7ICAgICAgLyogMHg3ZiAqLworCQlmbG9hdCBzd2l0Y2hNdWx0OyAgICAgICAgICAvKiAxLjBmICovCisJCWludCBzd2l0Y2hJbmNyOyAgICAgICAgICAgIC8qICA9IFNXSVRDSElOQ1I7ICovCisJCWludCBzdGF0ZVNlbGVjdGlvblJuZDsKKwkJaW50IHN0YXRlU2VsZWN0aW9uQmxvY2tlcjsKKwkJaW50IHByZXZpb3VzWm9vbVNwZWVkOworCQlab29tRmlsdGVyRGF0YSB6b29tRmlsdGVyRGF0YTsgICAgICAgICAgICAgICAgCisJfSB1cGRhdGU7CisKKwlzdHJ1Y3QgeworCQl2b2lkICgqZHJhd19saW5lKSAoUGl4ZWwgKmRhdGEsIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiwgaW50IGNvbCwgaW50IHNjcmVlbngsIGludCBzY3JlZW55KTsKKwkJdm9pZCAoKnpvb21fZmlsdGVyKSAoaW50IHNpemVYLCBpbnQgc2l6ZVksIFBpeGVsICpzcmMsIFBpeGVsICpkZXN0LCBpbnQgKmJydXRTLCBpbnQgKmJydXRELCBpbnQgYnVmZnJhdGlvLCBpbnQgcHJlY2FsQ29lZlsxNl1bMTZdKTsKKwl9IG1ldGhvZHM7CisJCisJR29vbVJhbmRvbSAqZ1JhbmRvbTsKK307CisKK3ZvaWQgcGx1Z2luX2luZm9faW5pdChQbHVnaW5JbmZvICpwLCBpbnQgbmJWaXN1YWwpOyAKK3ZvaWQgcGx1Z2luX2luZm9fZnJlZShQbHVnaW5JbmZvICpwKTsKKworLyogaSA9IFswLi5wLT5uYlZpc3VhbC0xXSAqLwordm9pZCBwbHVnaW5faW5mb19hZGRfdmlzdWFsKFBsdWdpbkluZm8gKnAsIGludCBpLCBWaXN1YWxGWCAqdmlzdWFsKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvZ29vbS9nb29tX3Rvb2xzLmMgYi9nc3QvZ29vbS9nb29tX3Rvb2xzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3NThmZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL2dvb21fdG9vbHMuYwpAQCAtMCwwICsxLDUwIEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaW5jbHVkZSAiZ29vbV90b29scy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitHb29tUmFuZG9tICoKK2dvb21fcmFuZG9tX2luaXQgKGludCBpKQoreworICBHb29tUmFuZG9tICpncmFuZG9tID0gKEdvb21SYW5kb20gKikgbWFsbG9jIChzaXplb2YgKEdvb21SYW5kb20pKTsKKworICBzcmFuZCAoaSk7CisgIGdyYW5kb20tPnBvcyA9IDE7CisgIGdvb21fcmFuZG9tX3VwZGF0ZV9hcnJheSAoZ3JhbmRvbSwgR09PTV9OQl9SQU5EKTsKKyAgcmV0dXJuIGdyYW5kb207Cit9CisKK3ZvaWQKK2dvb21fcmFuZG9tX2ZyZWUgKEdvb21SYW5kb20gKiBncmFuZG9tKQoreworICBmcmVlIChncmFuZG9tKTsKK30KKwordm9pZAorZ29vbV9yYW5kb21fdXBkYXRlX2FycmF5IChHb29tUmFuZG9tICogZ3JhbmRvbSwgaW50IG51bWJlck9mVmFsdWVzVG9DaGFuZ2UpCit7CisgIHdoaWxlIChudW1iZXJPZlZhbHVlc1RvQ2hhbmdlID4gMCkgeworI2lmIFJBTkRfTUFYIDwgMHgxMDAwMAorICAgIGdyYW5kb20tPmFycmF5W2dyYW5kb20tPnBvcysrXSA9ICgocmFuZCAoKSA8PCAxNikgKyByYW5kICgpKSAvIDEyNzsKKyNlbHNlCisgICAgZ3JhbmRvbS0+YXJyYXlbZ3JhbmRvbS0+cG9zKytdID0gcmFuZCAoKSAvIDEyNzsKKyNlbmRpZgorICAgIG51bWJlck9mVmFsdWVzVG9DaGFuZ2UtLTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vZ29vbV90b29scy5oIGIvZ3N0L2dvb20vZ29vbV90b29scy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZjUyNDAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9nb29tX3Rvb2xzLmgKQEAgLTAsMCArMSw1MyBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmbmRlZiBfR09PTVRPT0xTX0gKKyNkZWZpbmUgX0dPT01UT09MU19ICisKKyNpbmNsdWRlICJnb29tX2NvbmZpZy5oIgorCisvKioKKyAqIFJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHdyYXBwZXIgZm9yIGZhc3RlciByYW5kb20gbnVtYmVyLgorICovCisKKyNkZWZpbmUgR09PTV9OQl9SQU5EIDB4MTAwMDAKKwordHlwZWRlZiBzdHJ1Y3QgX0dPT01fUkFORE9NIHsKKwlpbnQgYXJyYXlbR09PTV9OQl9SQU5EXTsKKwl1bnNpZ25lZCBzaG9ydCBwb3M7Cit9IEdvb21SYW5kb207CisKK0dvb21SYW5kb20gKmdvb21fcmFuZG9tX2luaXQoaW50IGkpOwordm9pZCBnb29tX3JhbmRvbV9mcmVlKEdvb21SYW5kb20gKmdyYW5kb20pOworCitpbmxpbmUgc3RhdGljIGludCBnb29tX3JhbmRvbShHb29tUmFuZG9tICpncmFuZG9tKSB7CisJCisJZ3JhbmRvbS0+cG9zKys7IC8qIHdvcmtzIGJlY2F1c2UgcG9zIGlzIGFuIHVuc2lnbmVkIHNob3J0ICovCisJcmV0dXJuIGdyYW5kb20tPmFycmF5W2dyYW5kb20tPnBvc107Cit9CisKK2lubGluZSBzdGF0aWMgaW50IGdvb21faXJhbmQoR29vbVJhbmRvbSAqZ3JhbmRvbSwgaW50IGkpIHsKKworCWdyYW5kb20tPnBvcysrOworCXJldHVybiBncmFuZG9tLT5hcnJheVtncmFuZG9tLT5wb3NdICUgaTsKK30KKworLyogY2FsbGVkIHRvIGNoYW5nZSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB2YWx1ZSBpbiB0aGUgYXJyYXksIHNvIHRoYXQgdGhlIGFycmF5IGRvZXMgbm90IHJlbWFpbiB0aGUgc2FtZSovCit2b2lkIGdvb21fcmFuZG9tX3VwZGF0ZV9hcnJheShHb29tUmFuZG9tICpncmFuZG9tLCBpbnQgbnVtYmVyT2ZWYWx1ZXNUb0NoYW5nZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vZ29vbV90eXBlZGVmcy5oIGIvZ3N0L2dvb20vZ29vbV90eXBlZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYTMzYTkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9nb29tX3R5cGVkZWZzLmgKQEAgLTAsMCArMSwyOSBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmbmRlZiBfR09PTV9UWVBFREVGU19ICisjZGVmaW5lIF9HT09NX1RZUEVERUZTX0gKKwordHlwZWRlZiBzdHJ1Y3QgX1BMVUdJTl9JTkZPIFBsdWdpbkluZm87Cit0eXBlZGVmIHN0cnVjdCBfU09VTkRfSU5GTyBTb3VuZEluZm87Cit0eXBlZGVmIHN0cnVjdCBfR01MSU5FIEdNTGluZTsKK3R5cGVkZWYgc3RydWN0IF9HTVVOSVRQT0lOVEVSIEdNVW5pdFBvaW50ZXI7Cit0eXBlZGVmIHN0cnVjdCBfWk9PTV9GSUxURVJfREFUQSBab29tRmlsdGVyRGF0YTsKK3R5cGVkZWYgc3RydWN0IF9WSVNVQUxfRlggVmlzdWFsRlg7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vZ29vbV92aXN1YWxfZnguaCBiL2dzdC9nb29tL2dvb21fdmlzdWFsX2Z4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiNWE0OQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL2dvb21fdmlzdWFsX2Z4LmgKQEAgLTAsMCArMSwzNSBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBKZWFuLUNocmlzdG9waGUgSG9lbHQgPGpla29AZnJlZS5mcj4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmbmRlZiBfVklTVUFMX0ZYX0gKKyNkZWZpbmUgX1ZJU1VBTF9GWF9ICisKKyNpbmNsdWRlICJnb29tX2NvbmZpZ19wYXJhbS5oIgorI2luY2x1ZGUgImdvb21fZ3JhcGhpYy5oIgorI2luY2x1ZGUgImdvb21fdHlwZWRlZnMuaCIKKworc3RydWN0IF9WSVNVQUxfRlggeworICB2b2lkICgqaW5pdCkgKHN0cnVjdCBfVklTVUFMX0ZYICpfdGhpcywgUGx1Z2luSW5mbyAqaW5mbyk7CisgIHZvaWQgKCpmcmVlKSAoc3RydWN0IF9WSVNVQUxfRlggKl90aGlzKTsKKyAgdm9pZCAoKmFwcGx5KSAoc3RydWN0IF9WSVNVQUxfRlggKl90aGlzLCBQaXhlbCAqc3JjLCBQaXhlbCAqZGVzdCwgUGx1Z2luSW5mbyAqaW5mbyk7CisgIHZvaWQgKmZ4X2RhdGE7CisKKyAgUGx1Z2luUGFyYW1ldGVycyAqcGFyYW1zOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvZ29vbS9nb29tc2xfbGV4LmwgYi9nc3QvZ29vbS9nb29tc2xfbGV4LmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E3ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL2dvb21zbF9sZXgubApAQCAtMCwwICsxLDk0IEBACisleworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdvb21zbC5oIgorI2luY2x1ZGUgImdvb21zbF9wcml2YXRlLmgiCisjaW5jbHVkZSAiZ29vbXNsX3lhY2MuaCIKK3ZvaWQgeXllcnJvcihjaGFyICopOwordm9pZCB5eXBhcnNlKHZvaWQpOworCitHb29tU0wgKmN1cnJlbnRHb29tU0w7CitzdGF0aWMgaW50ICBzdHJpbmdfc2l6ZTsKK3N0YXRpYyBjaGFyIHN0cmluZ1sxMDI0XTsKKyV9CisKK0RJR0lUICAgIFswLTldCitYRElHSVQgICBbMC05YS1mXQorSUQgICAgICAgW2EtekEtWl9AJl1bYS16QS1aMC05X1wuXSoKKworJVMgQ19DT01NRU5UCislUyBMSU5FX0NPTU1FTlQKKyVTIFNUUklORworCislJQorCis8TElORV9DT01NRU5ULENfQ09NTUVOVCxJTklUSUFMPl5bIFx0XSpcbiAgICAgICAgICAgeyArK2N1cnJlbnRHb29tU0wtPm51bV9saW5lczsgLyogSWdub3JlIGVtcHR5IGxpbmVzICovIH0KKzxMSU5FX0NPTU1FTlQsQ19DT01NRU5ULElOSVRJQUw+XlsgXHRdKiIvLyJbXlxuXSpcbiB7ICsrY3VycmVudEdvb21TTC0+bnVtX2xpbmVzOyAvKiBJZ25vcmUgZW1wdHkgbGluZXMgKi8gfQorCis8TElORV9DT01NRU5UPlxuICAgIHsgKytjdXJyZW50R29vbVNMLT5udW1fbGluZXM7IHl5bHZhbC5jaGFyVmFsdWU9Knl5dGV4dDsgQkVHSU4gSU5JVElBTDsgcmV0dXJuICdcbic7IH0KKzxJTklUSUFMPlxuICAgICAgICAgeyArK2N1cnJlbnRHb29tU0wtPm51bV9saW5lczsgeXlsdmFsLmNoYXJWYWx1ZT0qeXl0ZXh0OyByZXR1cm4gJ1xuJzsgfQorCis8Q19DT01NRU5UPiIqLyIgICAgICAgICAgICAgICAgeyBCRUdJTiBJTklUSUFMOyB9Cis8Q19DT01NRU5UPlxuICAgICAgICAgICAgICAgICAgeyArK2N1cnJlbnRHb29tU0wtPm51bV9saW5lczsgfQorPENfQ09NTUVOVCxMSU5FX0NPTU1FTlQ+LiAgICAgIHsgLyogZWF0IHVwIGNvbW1lbnQgKi8gfQorCis8SU5JVElBTD4iI1JTVF9MSU5FIyIgICAgICAgICAgICAgeyBjdXJyZW50R29vbVNMLT5udW1fbGluZXMgPSAwOyB9Cis8SU5JVElBTD4iI0ZJTEUgIi4qIiMiICAgICAgICAgICAgeyBjdXJyZW50R29vbVNMLT5udW1fbGluZXMgPSAwOyAvKiBwcmludGYoIiVzXG4iLCB5eXRleHQpOyAqLyB9Cis8SU5JVElBTD4iIyJbXlxuXSogICAgICAgICAgICAgICAgeyAvKiBpZ25vcmUgcHJlcHJvY2Vzc29yIGxpbmVzICovIH0KKworPElOSVRJQUw+Ii8qIiAgICAgICAgICAgICAgICB7IEJFR0lOIENfQ09NTUVOVDsgfQorPElOSVRJQUw+Ii8vIiAgICAgICAgICAgICAgICB7IEJFR0lOIExJTkVfQ09NTUVOVDsgfQorPElOSVRJQUw+XCIgICAgICAgICAgICAgICAgICB7IEJFR0lOIFNUUklORzsgc3RyaW5nX3NpemU9MDsgfQorCis8U1RSSU5HPiJcXG4iICAgICAgICAgICAgICAgIHsgc3RyaW5nW3N0cmluZ19zaXplKytdID0gJ1xuJzsgfQorPFNUUklORz4iXFxcIiIgICAgICAgICAgICAgICB7IHN0cmluZ1tzdHJpbmdfc2l6ZSsrXSA9ICdcIic7IH0KKzxTVFJJTkc+XCIgICAgICAgICAgICAgICAgICAgeyAvKiBmaW4gZGUgbGEgY2hhaW5lOiBvbiBjcmVlIGxlIHBvaW50ZXVyIHF1aSB2YSBiaWVuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTiBJTklUSUFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1tzdHJpbmdfc2l6ZV09MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBnc2xfbWFsbG9jKGN1cnJlbnRHb29tU0wsIHN0cmluZ19zaXplKzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSgoY2hhciopY3VycmVudEdvb21TTC0+cHRyQXJyYXlbdG1wXSxzdHJpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoeXlsdmFsLnN0clZhbHVlLCAiMHglMDh4IiwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTFRZUEVfUFRSOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Cis8U1RSSU5HPi4gICAgICAgICAgICAgICAgICAgIHsgc3RyaW5nW3N0cmluZ19zaXplKytdID0gKnl5dGV4dDsgfQorCis8SU5JVElBTD4iZmxvYXQiICAgICAgICAgICAgICAgICB7IHJldHVybiBGTE9BVF9USzsgfQorPElOSVRJQUw+ImludCIgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gSU5UX1RLOyAgIH0KKzxJTklUSUFMPiJib29sZWFuIiAgICAgICAgICAgICAgIHsgcmV0dXJuIElOVF9USzsgICB9Cis8SU5JVElBTD4icHRyIiAgICAgICAgICAgICAgICAgICB7IHJldHVybiBQVFJfVEs7ICAgfQorPElOSVRJQUw+InN0cmluZyIgICAgICAgICAgICAgICAgeyByZXR1cm4gUFRSX1RLOyAgIH0KKzxJTklUSUFMPiJkZWNsYXJlIiAgICAgICAgICAgICAgIHsgcmV0dXJuIERFQ0xBUkU7ICB9Cis8SU5JVElBTD4iZXh0ZXJuYWwiICAgICAgICAgICAgICB7IHJldHVybiBFWFRFUk5BTDsgfQorPElOSVRJQUw+InN0cnVjdCIgICAgICAgICAgICAgICAgeyByZXR1cm4gU1RSVUNUOyAgIH0KKzxJTklUSUFMPiJub3QiICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIE5PVDsgICAgICB9Cis8SU5JVElBTD4id2hpbGUiICAgICAgICAgICAgICAgICB7IHJldHVybiBXSElMRTsgICAgfSAKKzxJTklUSUFMPiJkbyIgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIERPOyAgICAgICB9Cis8SU5JVElBTD4iZm9yIiAgICAgICAgICAgICAgICAgICB7IHJldHVybiBGT1I7ICAgICAgfQorPElOSVRJQUw+ImluIiAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gSU47ICAgICAgIH0KKzxJTklUSUFMPiJ0cnVlIiAgICAgICAgICAgICAgICAgIHsgc3RybmNweSh5eWx2YWwuc3RyVmFsdWUsICIxIiwgMjA0Nyk7ICAgIHJldHVybiBMVFlQRV9JTlRFR0VSOyB9Cis8SU5JVElBTD4iZmFsc2UiICAgICAgICAgICAgICAgICB7IHN0cm5jcHkoeXlsdmFsLnN0clZhbHVlLCAiMCIsIDIwNDcpOyAgICByZXR1cm4gTFRZUEVfSU5URUdFUjsgfQorPElOSVRJQUw+e0lEfSAgICAgICAgICAgICAgICAgICAgeyBzdHJuY3B5KHl5bHZhbC5zdHJWYWx1ZSwgeXl0ZXh0LCAyMDQ3KTsgcmV0dXJuIExUWVBFX1ZBUjsgICAgIH0KKzxJTklUSUFMPntESUdJVH0rICAgICAgICAgICAgICAgIHsgc3RybmNweSh5eWx2YWwuc3RyVmFsdWUsIHl5dGV4dCwgMjA0Nyk7IHJldHVybiBMVFlQRV9JTlRFR0VSOyB9Cis8SU5JVElBTD5cJy5cJyAgICAgICAgICAgICAgICAgICB7IHNwcmludGYoeXlsdmFsLnN0clZhbHVlLCAiJWQiLCAoaW50KXl5dGV4dFsxXSk7IHJldHVybiBMVFlQRV9JTlRFR0VSOyB9Cis8SU5JVElBTD4iMHgie1hESUdJVH0rICAgICAgICAgICB7IHN0cm5jcHkoeXlsdmFsLnN0clZhbHVlLCB5eXRleHQsIDIwNDcpOyByZXR1cm4gTFRZUEVfSU5URUdFUjsgfQorPElOSVRJQUw+e0RJR0lUfSsiLiJ7RElHSVR9KiAgICAgeyBzdHJuY3B5KHl5bHZhbC5zdHJWYWx1ZSwgeXl0ZXh0LCAyMDQ3KTsgcmV0dXJuIExUWVBFX0ZMT0FUOyAgIH0KKzxJTklUSUFMPntESUdJVH0rIiUiICAgICAgICAgICAgIHsgc3ByaW50Zih5eWx2YWwuc3RyVmFsdWUsICIlMy4yZiIsIGF0b2YoeXl0ZXh0KS8xMDAuMGYpOyByZXR1cm4gTFRZUEVfRkxPQVQ7IH0KKzxJTklUSUFMPiIrPSIgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIFBMVVNfRVE7IH0KKzxJTklUSUFMPiIqPSIgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIE1VTF9FUTsgfQorPElOSVRJQUw+Ii09IiAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gU1VCX0VROyB9Cis8SU5JVElBTD4iLz0iICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBESVZfRVE7IH0KKzxJTklUSUFMPiI8PSIgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIExPV19FUTsgIH0KKzxJTklUSUFMPiI+PSIgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIFNVUF9FUTsgIH0KKzxJTklUSUFMPiIhPSIgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIE5PVF9FUTsgIH0KKzxJTklUSUFMPiI8PiIgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIE5PVF9FUTsgIH0KKzxJTklUSUFMPlsgXHRdKyAgICAgICAgICAgICAgICAgIC8qIGVhdCB1cCB3aGl0ZXNwYWNlICovCis8SU5JVElBTD4uICAgICAgICAgICAgICAgICAgICAgICB7IHl5bHZhbC5jaGFyVmFsdWUgPSAqeXl0ZXh0OyByZXR1cm4gKnl5dGV4dDsgICAgfQorCislJQorCisKK2ludCB5eXdyYXAodm9pZCkgeyByZXR1cm4gMTsgeXl1bnB1dCgwLDApOyB9CisKZGlmZiAtLWdpdCBhL2dzdC9nb29tL2dvb21zbF95YWNjLnkgYi9nc3QvZ29vbS9nb29tc2xfeWFjYy55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ODkzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9nb29tc2xfeWFjYy55CkBAIC0wLDAgKzEsMTQzOCBAQAorLyoqCisgKiBjb3B5cmlnaHQgMjAwNCwgSmVhbi1DaHJpc3RvcGhlIEhvZWx0IDxqZWtvQGlvcy1zb2Z0d2FyZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlLgorICovCisleworICAgICNpbmNsdWRlIDxzdGRpby5oPgorICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAjaW5jbHVkZSA8c3RyaW5nLmg+CisgICAgI2luY2x1ZGUgPGdsaWIuaD4KKyAgICAjaW5jbHVkZSAiZ29vbXNsLmgiCisgICAgI2luY2x1ZGUgImdvb21zbF9wcml2YXRlLmgiCisKKyNkZWZpbmUgU1RSVUNUX0FMSUdOTUVOVCAxNgorLyogI2RlZmluZSBWRVJCT1NFICAqLworCisgICAgaW50IHl5bGV4KHZvaWQpOworICAgIHZvaWQgeXllcnJvcihjaGFyICopOworICAgIGV4dGVybiBHb29tU0wgKmN1cnJlbnRHb29tU0w7CisKKyAgICBzdGF0aWMgTm9kZVR5cGUgKm5vZGVOZXcoY29uc3QgY2hhciAqc3RyLCBpbnQgdHlwZSwgaW50IGxpbmVfbnVtYmVyKTsKKyAgICBzdGF0aWMgTm9kZVR5cGUgKm5vZGVDbG9uZShOb2RlVHlwZSAqbm9kZSk7CisgICAgc3RhdGljIHZvaWQgbm9kZUZyZWVJbnRlcm5hbHMoTm9kZVR5cGUgKm5vZGUpOworICAgIHN0YXRpYyB2b2lkIG5vZGVGcmVlKE5vZGVUeXBlICpub2RlKTsKKworICAgIHN0YXRpYyB2b2lkIGNvbW1pdF9ub2RlKE5vZGVUeXBlICpub2RlLCBpbnQgcmVsZWFzZUlmVGVtcCk7CisgICAgc3RhdGljIHZvaWQgcHJlY29tbWl0X25vZGUoTm9kZVR5cGUgKm5vZGUpOworCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfY29uc3RJbnQoY29uc3QgY2hhciAqc3RyLCBpbnQgbGluZV9udW1iZXIpOworICAgIHN0YXRpYyBOb2RlVHlwZSAqbmV3X2NvbnN0RmxvYXQoY29uc3QgY2hhciAqc3RyLCBpbnQgbGluZV9udW1iZXIpOworICAgIHN0YXRpYyBOb2RlVHlwZSAqbmV3X2NvbnN0UHRyKGNvbnN0IGNoYXIgKnN0ciwgaW50IGxpbmVfbnVtYmVyKTsKKyAgICBzdGF0aWMgTm9kZVR5cGUgKm5ld192YXIoY29uc3QgY2hhciAqc3RyLCBpbnQgbGluZV9udW1iZXIpOworICAgIHN0YXRpYyBOb2RlVHlwZSAqbmV3X25vcChjb25zdCBjaGFyICpzdHIpOworICAgIHN0YXRpYyBOb2RlVHlwZSAqbmV3X29wKGNvbnN0IGNoYXIgKnN0ciwgaW50IHR5cGUsIGludCBuYk9wKTsKKworICAgIHN0YXRpYyBpbnQgIGFsbG9jYXRlTGFiZWwoKTsKKyAgICBzdGF0aWMgaW50ICBhbGxvY2F0ZVRlbXAoKTsKKyAgICBzdGF0aWMgdm9pZCByZWxlYXNlVGVtcChpbnQgbik7CisgICAgc3RhdGljIHZvaWQgcmVsZWFzZUFsbFRlbXBzKCk7CisKKyAgICBzdGF0aWMgaW50IGlzX3RtcF9leHByKE5vZGVUeXBlICpub2RlKSB7CisgICAgICAgIGlmIChub2RlLT5zdHIpIHsKKyAgICAgICAgICAgIHJldHVybiAoIXN0cm5jbXAobm9kZS0+c3RyLCJfaV90bXBfIiw3KSkKKyAgICAgICAgICAgICAgfHwgKCFzdHJuY21wKG5vZGUtPnN0ciwiX2ZfdG1wXyIsNykpCisgICAgICAgICAgICAgIHx8ICghc3RybmNtcChub2RlLT5zdHIsIl9wX3RtcCIsNykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvKiBwcmU6IGlzX3RtcF9leHByKG5vZGUpOyAqLworICAgIHN0YXRpYyBpbnQgZ2V0X3RtcF9pZChOb2RlVHlwZSAqbm9kZSkgIHsgcmV0dXJuIGF0b2koKG5vZGUtPnN0cikrNSk7IH0KKworICAgIHN0YXRpYyBpbnQgaXNfY29tbXV0YXRpdmVfZXhwcihpbnQgaXR5cGUpCisgICAgeyAvKiB7e3sgKi8KKyAgICAgICAgcmV0dXJuIChpdHlwZSA9PSBJTlNUUl9BREQpCisgICAgICAgICAgICB8fCAoaXR5cGUgPT0gSU5TVFJfTVVMKQorICAgICAgICAgICAgfHwgKGl0eXBlID09IElOU1RSX0lTRVFVQUwpOworICAgIH0gLyogfX19ICovCisKKyAgICBzdGF0aWMgdm9pZCBHU0xfUFVUX0xBQkVMKGNoYXIgKm5hbWUsIGludCBsaW5lX251bWJlcikKKyAgICB7IC8qIHt7eyAqLworI2lmZGVmIFZFUkJPU0UKKyAgICAgIHByaW50ZigibGFiZWwgJXNcbiIsIG5hbWUpOworI2VuZGlmCisgICAgICBjdXJyZW50R29vbVNMLT5pbnN0ciA9IGdzbF9pbnN0cl9pbml0KGN1cnJlbnRHb29tU0wsICJsYWJlbCIsIElOU1RSX0xBQkVMLCAxLCBsaW5lX251bWJlcik7CisgICAgICBnc2xfaW5zdHJfYWRkX3BhcmFtKGN1cnJlbnRHb29tU0wtPmluc3RyLCBuYW1lLCBUWVBFX0xBQkVMKTsKKyAgICB9IC8qIH19fSAqLworICAgIHN0YXRpYyB2b2lkIEdTTF9QVVRfSlVNUChjaGFyICpuYW1lLCBpbnQgbGluZV9udW1iZXIpCisgICAgeyAvKiB7e3sgKi8KKyNpZmRlZiBWRVJCT1NFCisgICAgICBwcmludGYoImp1bXAgJXNcbiIsIG5hbWUpOworI2VuZGlmCisgICAgICBjdXJyZW50R29vbVNMLT5pbnN0ciA9IGdzbF9pbnN0cl9pbml0KGN1cnJlbnRHb29tU0wsICJqdW1wIiwgSU5TVFJfSlVNUCwgMSwgbGluZV9udW1iZXIpOworICAgICAgZ3NsX2luc3RyX2FkZF9wYXJhbShjdXJyZW50R29vbVNMLT5pbnN0ciwgbmFtZSwgVFlQRV9MQUJFTCk7CisgICAgfSAvKiB9fX0gKi8KKworICAgIHN0YXRpYyB2b2lkIEdTTF9QVVRfSlhYWChjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgaW50IGluc3RyX2lkLCBpbnQgbGluZV9udW1iZXIpCisgICAgeyAvKiB7e3sgKi8KKyNpZmRlZiBWRVJCT1NFCisgICAgICBwcmludGYoIiVzICVzXG4iLCBpbmFtZSwgbmFtZSk7CisjZW5kaWYKKyAgICAgIGN1cnJlbnRHb29tU0wtPmluc3RyID0gZ3NsX2luc3RyX2luaXQoY3VycmVudEdvb21TTCwgaW5hbWUsIGluc3RyX2lkLCAxLCBsaW5lX251bWJlcik7CisgICAgICBnc2xfaW5zdHJfYWRkX3BhcmFtKGN1cnJlbnRHb29tU0wtPmluc3RyLCBuYW1lLCBUWVBFX0xBQkVMKTsKKyAgICB9IC8qIH19fSAqLworICAgIHN0YXRpYyB2b2lkIEdTTF9QVVRfSlpFUk8oY2hhciAqbmFtZSxpbnQgbGluZV9udW1iZXIpCisgICAgeyAvKiB7e3sgKi8KKyAgICAgIEdTTF9QVVRfSlhYWChuYW1lLCJqemVyby5pIixJTlNUUl9KWkVSTyxsaW5lX251bWJlcik7CisgICAgfSAvKiB9fX0gKi8KKyAgICBzdGF0aWMgdm9pZCBHU0xfUFVUX0pOWkVSTyhjaGFyICpuYW1lLCBpbnQgbGluZV9udW1iZXIpCisgICAgeyAvKiB7e3sgKi8KKyAgICAgIEdTTF9QVVRfSlhYWChuYW1lLCJqbnplcm8uaSIsSU5TVFJfSk5aRVJPLGxpbmVfbnVtYmVyKTsKKyAgICB9IC8qIH19fSAqLworCisgICAgLyogU3RydWN0dXJlcyBNYW5hZ2VtZW50ICovCisKKyNkZWZpbmUgQUxJR05fQUREUihfYWRkcixfYWxpZ24pIHtcCisgICBpZiAoX2FsaWduPjEpIHtcCisgICAgICAgaW50IF9kZWMgPSAoX2FkZHIlX2FsaWduKTtcCisgICAgICAgaWYgKF9kZWMgIT0gMCkgX2FkZHIgKz0gX2FsaWduIC0gX2RlYztcCisgICB9fQorCisgICAgLyogKi8KKyAgICB2b2lkIGdzbF9wcmVwYXJlX3N0cnVjdChHU0xfU3RydWN0ICpzLCBpbnQgc19hbGlnbiwgaW50IGlfYWxpZ24sIGludCBmX2FsaWduKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgaW50IGNvbnN1bWVkID0gMDsKKyAgICAgIGludCBpYmxrPTAsIGZibGs9MDsKKworICAgICAgcy0+aUJsb2NrWzBdLnNpemUgPSAwOworICAgICAgcy0+aUJsb2NrWzBdLmRhdGEgPSAwOworICAgICAgcy0+ZkJsb2NrWzBdLnNpemUgPSAwOworICAgICAgcy0+ZkJsb2NrWzBdLmRhdGEgPSAwOworCisgICAgICAvKiBQcmVwYXJlIHN1Yi1zdHJ1Y3QgYW5kIGNhbGN1bGF0ZSBzcGFjZSBuZWVkZWQgZm9yIHRoZWlyIHN0b3JhZ2UgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYkZpZWxkczsgKytpKQorICAgICAgeworICAgICAgICBpZiAocy0+ZmllbGRzW2ldLT50eXBlIDwgRklSU1RfUkVTRVJWRUQpCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgaj0wOworICAgICAgICAgIEdTTF9TdHJ1Y3QgKnN1YnN0cnVjdCA9IGN1cnJlbnRHb29tU0wtPmdzbF9zdHJ1Y3Rbcy0+ZmllbGRzW2ldLT50eXBlXTsKKyAgICAgICAgICBjb25zdW1lZCArPSBzaXplb2YoaW50KTsgLyogc3RvY2tlIGxlIHByZWZpeCAqLworICAgICAgICAgIEFMSUdOX0FERFIoY29uc3VtZWQsIHNfYWxpZ24pOworICAgICAgICAgIHMtPmZpZWxkc1tpXS0+b2Zmc2V0SW5TdHJ1Y3QgPSBjb25zdW1lZDsKKyAgICAgICAgICBnc2xfcHJlcGFyZV9zdHJ1Y3Qoc3Vic3RydWN0LCBzX2FsaWduLCBpX2FsaWduLCBmX2FsaWduKTsKKyAgICAgICAgICBmb3Ioaj0wO3N1YnN0cnVjdC0+aUJsb2NrW2pdLnNpemU+MDsrK2opIHsKKyAgICAgICAgICAgIHMtPmlCbG9ja1tpYmxrXS5kYXRhID0gY29uc3VtZWQgKyBzdWJzdHJ1Y3QtPmlCbG9ja1tqXS5kYXRhOworICAgICAgICAgICAgcy0+aUJsb2NrW2libGtdLnNpemUgPSBzdWJzdHJ1Y3QtPmlCbG9ja1tqXS5zaXplOworICAgICAgICAgICAgaWJsaysrOworICAgICAgICAgIH0KKyAgICAgICAgICBmb3Ioaj0wO3N1YnN0cnVjdC0+ZkJsb2NrW2pdLnNpemU+MDsrK2opIHsKKyAgICAgICAgICAgIHMtPmZCbG9ja1tmYmxrXS5kYXRhID0gY29uc3VtZWQgKyBzdWJzdHJ1Y3QtPmZCbG9ja1tqXS5kYXRhOworICAgICAgICAgICAgcy0+ZkJsb2NrW2ZibGtdLnNpemUgPSBzdWJzdHJ1Y3QtPmZCbG9ja1tqXS5zaXplOworICAgICAgICAgICAgZmJsaysrOworICAgICAgICAgIH0KKyAgICAgICAgICBjb25zdW1lZCArPSBzdWJzdHJ1Y3QtPnNpemU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogVGhlbiBwcmVwYXJlIGludGVnZXJzICovCisgICAgICBBTElHTl9BRERSKGNvbnN1bWVkLCBpX2FsaWduKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYkZpZWxkczsgKytpKQorICAgICAgeworICAgICAgICBpZiAocy0+ZmllbGRzW2ldLT50eXBlID09IElOU1RSX0lOVCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChzLT5pQmxvY2tbaWJsa10uc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBzLT5pQmxvY2tbaWJsa10uc2l6ZSA9IDE7CisgICAgICAgICAgICBzLT5pQmxvY2tbaWJsa10uZGF0YSA9IGNvbnN1bWVkOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5pQmxvY2tbaWJsa10uc2l6ZSArPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICBzLT5maWVsZHNbaV0tPm9mZnNldEluU3RydWN0ID0gY29uc3VtZWQ7CisgICAgICAgICAgY29uc3VtZWQgKz0gc2l6ZW9mKGludCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWJsaysrOworICAgICAgcy0+aUJsb2NrW2libGtdLnNpemUgPSAwOworICAgICAgcy0+aUJsb2NrW2libGtdLmRhdGEgPSAwOworCisgICAgICAvKiBUaGVuIHByZXBhcmUgZmxvYXRzICovCisgICAgICBBTElHTl9BRERSKGNvbnN1bWVkLCBmX2FsaWduKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYkZpZWxkczsgKytpKQorICAgICAgeworICAgICAgICBpZiAocy0+ZmllbGRzW2ldLT50eXBlID09IElOU1RSX0ZMT0FUKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHMtPmZCbG9ja1tmYmxrXS5zaXplID09IDApIHsKKyAgICAgICAgICAgIHMtPmZCbG9ja1tmYmxrXS5zaXplID0gMTsKKyAgICAgICAgICAgIHMtPmZCbG9ja1tmYmxrXS5kYXRhID0gY29uc3VtZWQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPmZCbG9ja1tmYmxrXS5zaXplICs9IDE7CisgICAgICAgICAgfQorICAgICAgICAgIHMtPmZpZWxkc1tpXS0+b2Zmc2V0SW5TdHJ1Y3QgPSBjb25zdW1lZDsKKyAgICAgICAgICBjb25zdW1lZCArPSBzaXplb2YoaW50KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmYmxrKys7CisgICAgICBzLT5mQmxvY2tbZmJsa10uc2l6ZSA9IDA7CisgICAgICBzLT5mQmxvY2tbZmJsa10uZGF0YSA9IDA7CisgICAgICAKKyAgICAgIC8qIEZpbmFsbHkgcHJlcGFyZSBwb2ludGVycyAqLworICAgICAgQUxJR05fQUREUihjb25zdW1lZCwgaV9hbGlnbik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJGaWVsZHM7ICsraSkKKyAgICAgIHsKKyAgICAgICAgaWYgKHMtPmZpZWxkc1tpXS0+dHlwZSA9PSBJTlNUUl9QVFIpCisgICAgICAgIHsKKyAgICAgICAgICBzLT5maWVsZHNbaV0tPm9mZnNldEluU3RydWN0ID0gY29uc3VtZWQ7CisgICAgICAgICAgY29uc3VtZWQgKz0gc2l6ZW9mKGludCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHMtPnNpemUgPSBjb25zdW1lZDsKKyAgICB9CisKKyAgICAvKiBSZXR1cm5zIHRoZSBJRCBvZiBhIHN0cnVjdCBmcm9tIGl0cyBuYW1lICovCisgICAgaW50IGdzbF9nZXRfc3RydWN0X2lkKGNvbnN0IGNoYXIgKm5hbWUpIC8qIHt7eyAqLworICAgIHsKKyAgICAgIEhhc2hWYWx1ZSAqcmV0ID0gZ29vbV9oYXNoX2dldChjdXJyZW50R29vbVNMLT5zdHJ1Y3RJRFMsIG5hbWUpOworICAgICAgaWYgKHJldCAhPSBOVUxMKSByZXR1cm4gcmV0LT5pOworICAgICAgcmV0dXJuIC0xOworICAgIH0gLyogfX19ICovCisKKyAgICAvKiBBZGRzIHRoZSBkZWZpbml0aW9uIG9mIGEgc3RydWN0ICovCisgICAgdm9pZCBnc2xfYWRkX3N0cnVjdChjb25zdCBjaGFyICpuYW1lLCBHU0xfU3RydWN0ICpnc2xfc3RydWN0KSAvKiB7e3sgKi8KKyAgICB7CisgICAgICAvKiBQcmVwYXJlIHRoZSBzdHJ1Y3Q6IGllIGNhbGN1bGF0ZSBpbnRlcm5hbCBzdG9yYWdlIGZvcm1hdCAqLworICAgICAgZ3NsX3ByZXBhcmVfc3RydWN0KGdzbF9zdHJ1Y3QsIFNUUlVDVF9BTElHTk1FTlQsIFNUUlVDVF9BTElHTk1FTlQsIFNUUlVDVF9BTElHTk1FTlQpOworICAgICAgCisgICAgICAvKiBJZiB0aGUgc3RydWN0IGRvZXMgbm90IGFscmVhZHkgZXhpc3RzICovCisgICAgICBpZiAoZ3NsX2dldF9zdHJ1Y3RfaWQobmFtZSkgPCAwKQorICAgICAgeworICAgICAgICAvKiBhZGRzIGl0ICovCisgICAgICAgIGludCBpZCA9IGN1cnJlbnRHb29tU0wtPm5iU3RydWN0SUQrKzsKKyAgICAgICAgZ29vbV9oYXNoX3B1dF9pbnQoY3VycmVudEdvb21TTC0+c3RydWN0SURTLCBuYW1lLCBpZCk7CisgICAgICAgIGlmIChjdXJyZW50R29vbVNMLT5nc2xfc3RydWN0X3NpemUgPD0gaWQpIHsKKyAgICAgICAgICBjdXJyZW50R29vbVNMLT5nc2xfc3RydWN0X3NpemUgKj0gMjsKKyAgICAgICAgICBjdXJyZW50R29vbVNMLT5nc2xfc3RydWN0ID0gKEdTTF9TdHJ1Y3QqKilyZWFsbG9jKGN1cnJlbnRHb29tU0wtPmdzbF9zdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoR1NMX1N0cnVjdCopICogY3VycmVudEdvb21TTC0+Z3NsX3N0cnVjdF9zaXplKTsKKyAgICAgICAgfQorICAgICAgICBjdXJyZW50R29vbVNMLT5nc2xfc3RydWN0W2lkXSA9IGdzbF9zdHJ1Y3Q7CisgICAgICB9CisgICAgfSAvKiB9fX0gKi8KKyAgICAKKyAgICAvKiBDcmVhdGVzIGEgZmllbGQgZm9yIGEgc3RydWN0ICovCisgICAgR1NMX1N0cnVjdEZpZWxkICpnc2xfbmV3X3N0cnVjdF9maWVsZChjb25zdCBjaGFyICpuYW1lLCBpbnQgdHlwZSkKKyAgICB7CisgICAgICBHU0xfU3RydWN0RmllbGQgKmZpZWxkID0gKEdTTF9TdHJ1Y3RGaWVsZCopbWFsbG9jKHNpemVvZihHU0xfU3RydWN0RmllbGQpKTsKKyAgICAgIHN0cmNweShmaWVsZC0+bmFtZSwgbmFtZSk7CisgICAgICBmaWVsZC0+dHlwZSA9IHR5cGU7CisgICAgICByZXR1cm4gZmllbGQ7CisgICAgfQorICAgIAorICAgIC8qIENyZWF0ZSBhcyBmaWVsZCBmb3IgYSBzdHJ1Y3Qgd2hpY2ggd2lsbCBiZSBhIHN0cnVjdCBpdHNlbGYgKi8KKyAgICBHU0xfU3RydWN0RmllbGQgKmdzbF9uZXdfc3RydWN0X2ZpZWxkX3N0cnVjdChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp0eXBlKQorICAgIHsKKyAgICAgIEdTTF9TdHJ1Y3RGaWVsZCAqZmllbGQgPSBnc2xfbmV3X3N0cnVjdF9maWVsZChuYW1lLCBnc2xfZ2V0X3N0cnVjdF9pZCh0eXBlKSk7CisgICAgICBpZiAoZmllbGQtPnR5cGUgPCAwKSB7CisgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworI2lmIDAKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogTGluZSAlZCwgVW5rbm93biBzdHJ1Y3R1cmU6ICclcydcbiIsCisgICAgICAgICAgICAgICAgY3VycmVudEdvb21TTC0+bnVtX2xpbmVzLCB0eXBlKTsKKyAgICAgICAgZXhpdCgxKTsKKyNlbmRpZgorICAgICAgfQorICAgICAgcmV0dXJuIGZpZWxkOworICAgIH0KKworICAgIC8qIENyZWF0ZXMgYSBTdHJ1Y3QgKi8KKyAgICBHU0xfU3RydWN0ICpnc2xfbmV3X3N0cnVjdChHU0xfU3RydWN0RmllbGQgKmZpZWxkKQorICAgIHsKKyAgICAgIEdTTF9TdHJ1Y3QgKnMgPSAoR1NMX1N0cnVjdCopbWFsbG9jKHNpemVvZihHU0xfU3RydWN0KSk7CisgICAgICBzLT5uYkZpZWxkcyA9IDE7CisgICAgICBzLT5maWVsZHNbMF0gPSBmaWVsZDsKKyAgICAgIHJldHVybiBzOworICAgIH0KKworICAgIC8qIEFkZHMgYSBmaWVsZCB0byBhIHN0cnVjdCAqLworICAgIHZvaWQgZ3NsX2FkZF9zdHJ1Y3RfZmllbGQoR1NMX1N0cnVjdCAqcywgR1NMX1N0cnVjdEZpZWxkICpmaWVsZCkKKyAgICB7CisgICAgICBzLT5maWVsZHNbcy0+bmJGaWVsZHMrK10gPSBmaWVsZDsKKyAgICB9CisKKyAgICBpbnQgZ3NsX3R5cGVfb2ZfdmFyKEdvb21IYXNoICpucywgY29uc3QgY2hhciAqbmFtZSkKKyAgICB7CisgICAgICAgIGNoYXIgdHlwZV9vZlsyNTZdOworICAgICAgICBIYXNoVmFsdWUgKmh2OworICAgICAgICBzcHJpbnRmKHR5cGVfb2YsICJfX3R5cGVfb2ZfJXMiLCBuYW1lKTsKKyAgICAgICAgaHYgPSBnb29tX2hhc2hfZ2V0KG5zLCB0eXBlX29mKTsKKyAgICAgICAgaWYgKGh2ICE9IE5VTEwpCisgICAgICAgICAgcmV0dXJuIGh2LT5pOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBVbmtub3duIHZhcmlhYmxlIHR5cGU6ICclcydcbiIsIG5hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgZ3NsX2RlY2xhcmVfdmFyKEdvb21IYXNoICpucywgY29uc3QgY2hhciAqbmFtZSwgaW50IHR5cGUsIHZvaWQgKnNwYWNlKQorICAgIHsKKyAgICAgICAgY2hhciB0eXBlX29mWzI1Nl07CisgICAgICAgIGlmIChuYW1lWzBdID09ICdAJykgeyBucyA9IGN1cnJlbnRHb29tU0wtPnZhcnM7IH0KKworICAgICAgICBpZiAoc3BhY2UgPT0gTlVMTCkgeworICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBJTlNUUl9JTlQ6CisgICAgICAgICAgICBjYXNlIElOU1RSX0ZMT0FUOgorICAgICAgICAgICAgY2FzZSBJTlNUUl9QVFI6CisgICAgICAgICAgICAgIHNwYWNlID0gZ29vbV9oZWFwX21hbGxvY193aXRoX2FsaWdubWVudChjdXJyZW50R29vbVNMLT5kYXRhX2hlYXAsCisgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSwgc2l6ZW9mKGludCkpOworICAgICAgICAgICAgYnJlYWs7CisjaWYgMAorICAgICAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJXaGF0IHRoZSBmdWNrIVxuIik7CisgICAgICAgICAgICAgIGV4aXQoMSk7CisjZW5kaWYKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8qIE9uIGEgdW4gc3RydWN0X2lkICovCisgICAgICAgICAgICAgIHNwYWNlID0gZ29vbV9oZWFwX21hbGxvY193aXRoX2FsaWdubWVudF9wcmVmaXhlZChjdXJyZW50R29vbVNMLT5kYXRhX2hlYXAsCisgICAgICAgICAgICAgICAgICBjdXJyZW50R29vbVNMLT5nc2xfc3RydWN0W3R5cGVdLT5zaXplLCBTVFJVQ1RfQUxJR05NRU5ULCBzaXplb2YoaW50KSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdvb21faGFzaF9wdXRfcHRyKG5zLCBuYW1lLCAodm9pZCopc3BhY2UpOworICAgICAgICBzcHJpbnRmKHR5cGVfb2YsICJfX3R5cGVfb2ZfJXMiLCBuYW1lKTsKKyAgICAgICAgZ29vbV9oYXNoX3B1dF9pbnQobnMsIHR5cGVfb2YsIHR5cGUpOworCisgICAgICAgIC8qIEVuc3VpdGUgbGUgaGFjazogb24gYWpvdXRlIGxlcyBjaGFtcHMgZW4gdGFudCBxdWUgdmFyaWFibGVzLiAqLworICAgICAgICBpZiAodHlwZSA8IEZJUlNUX1JFU0VSVkVEKQorICAgICAgICB7CisgICAgICAgICAgaW50IGk7CisgICAgICAgICAgR1NMX1N0cnVjdCAqZ3NsX3N0cnVjdCA9IGN1cnJlbnRHb29tU0wtPmdzbF9zdHJ1Y3RbdHlwZV07CisgICAgICAgICAgKChpbnQqKXNwYWNlKVstMV0gPSB0eXBlOyAvKiBzdG9ja2FnZSBkdSB0eXBlIGRhbnMgbGUgcHJlZml4ZSBkZSBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ3NsX3N0cnVjdC0+bmJGaWVsZHM7ICsraSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBjaGFyIGZ1bGxfbmFtZVsyNTZdOworICAgICAgICAgICAgY2hhciAqY3NwYWNlID0gKGNoYXIqKXNwYWNlICsgZ3NsX3N0cnVjdC0+ZmllbGRzW2ldLT5vZmZzZXRJblN0cnVjdDsKKyAgICAgICAgICAgIHNwcmludGYoZnVsbF9uYW1lLCAiJXMuJXMiLCBuYW1lLCBnc2xfc3RydWN0LT5maWVsZHNbaV0tPm5hbWUpOworICAgICAgICAgICAgZ3NsX2RlY2xhcmVfdmFyKG5zLCBmdWxsX25hbWUsIGdzbF9zdHJ1Y3QtPmZpZWxkc1tpXS0+dHlwZSwgY3NwYWNlKTsKKyAgICAgICAgICB9CisgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBEZWNsYXJlIGEgdmFyaWFibGUgd2hpY2ggd2lsbCBiZSBhIHN0cnVjdCAqLworICAgIHN0YXRpYyB2b2lkIGdzbF9zdHJ1Y3RfZGVjbChHb29tSGFzaCAqbmFtZXNwYWNlLCBjb25zdCBjaGFyICpzdHJ1Y3RfbmFtZSwgY29uc3QgY2hhciAqbmFtZSkKKyAgICB7CisgICAgICAgIGludCAgc3RydWN0X2lkID0gZ3NsX2dldF9zdHJ1Y3RfaWQoc3RydWN0X25hbWUpOworICAgICAgICBnc2xfZGVjbGFyZV92YXIobmFtZXNwYWNlLCBuYW1lLCBzdHJ1Y3RfaWQsIE5VTEwpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGdzbF9mbG9hdF9kZWNsX2dsb2JhbChjb25zdCBjaGFyICpuYW1lKQorICAgIHsKKyAgICAgICAgZ3NsX2RlY2xhcmVfdmFyKGN1cnJlbnRHb29tU0wtPnZhcnMsIG5hbWUsIElOU1RSX0ZMT0FULCBOVUxMKTsKKyAgICB9CisgICAgc3RhdGljIHZvaWQgZ3NsX2ludF9kZWNsX2dsb2JhbChjb25zdCBjaGFyICpuYW1lKQorICAgIHsKKyAgICAgICAgZ3NsX2RlY2xhcmVfdmFyKGN1cnJlbnRHb29tU0wtPnZhcnMsIG5hbWUsIElOU1RSX0lOVCwgTlVMTCk7CisgICAgfQorICAgIHN0YXRpYyB2b2lkIGdzbF9wdHJfZGVjbF9nbG9iYWwoY29uc3QgY2hhciAqbmFtZSkKKyAgICB7CisgICAgICAgIGdzbF9kZWNsYXJlX3ZhcihjdXJyZW50R29vbVNMLT52YXJzLCBuYW1lLCBJTlNUUl9QVFIsIE5VTEwpOworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBnc2xfc3RydWN0X2RlY2xfZ2xvYmFsX2Zyb21faWQoY29uc3QgY2hhciAqbmFtZSwgaW50IGlkKQorICAgIHsKKyAgICAgICAgZ3NsX2RlY2xhcmVfdmFyKGN1cnJlbnRHb29tU0wtPnZhcnMsIG5hbWUsIGlkLCBOVUxMKTsKKyAgICB9CisgICAgCisgICAgLyogRkxPQVQgKi8KKyAgICBzdGF0aWMgdm9pZCBnc2xfZmxvYXRfZGVjbF9sb2NhbChjb25zdCBjaGFyICpuYW1lKQorICAgIHsKKyAgICAgICAgZ3NsX2RlY2xhcmVfdmFyKGN1cnJlbnRHb29tU0wtPm5hbWVzcGFjZXNbY3VycmVudEdvb21TTC0+Y3VycmVudE5TXSwgbmFtZSwgSU5TVFJfRkxPQVQsIE5VTEwpOworICAgIH0KKyAgICAvKiBJTlQgKi8KKyAgICBzdGF0aWMgdm9pZCBnc2xfaW50X2RlY2xfbG9jYWwoY29uc3QgY2hhciAqbmFtZSkKKyAgICB7CisgICAgICAgIGdzbF9kZWNsYXJlX3ZhcihjdXJyZW50R29vbVNMLT5uYW1lc3BhY2VzW2N1cnJlbnRHb29tU0wtPmN1cnJlbnROU10sIG5hbWUsIElOU1RSX0lOVCwgTlVMTCk7CisgICAgfQorICAgIC8qIFBUUiAqLworICAgIHN0YXRpYyB2b2lkIGdzbF9wdHJfZGVjbF9sb2NhbChjb25zdCBjaGFyICpuYW1lKQorICAgIHsKKyAgICAgICAgZ3NsX2RlY2xhcmVfdmFyKGN1cnJlbnRHb29tU0wtPm5hbWVzcGFjZXNbY3VycmVudEdvb21TTC0+Y3VycmVudE5TXSwgbmFtZSwgSU5TVFJfUFRSLCBOVUxMKTsKKyAgICB9CisgICAgLyogU1RSVUNUICovCisgICAgc3RhdGljIHZvaWQgZ3NsX3N0cnVjdF9kZWNsX2xvY2FsKGNvbnN0IGNoYXIgKnN0cnVjdF9uYW1lLCBjb25zdCBjaGFyICpuYW1lKQorICAgIHsKKyAgICAgICAgZ3NsX3N0cnVjdF9kZWNsKGN1cnJlbnRHb29tU0wtPm5hbWVzcGFjZXNbY3VycmVudEdvb21TTC0+Y3VycmVudE5TXSxzdHJ1Y3RfbmFtZSxuYW1lKTsKKyAgICB9CisKKworICAgIHN0YXRpYyB2b2lkIGNvbW1pdF90ZXN0MihOb2RlVHlwZSAqc2V0LGNvbnN0IGNoYXIgKnR5cGUsIGludCBpbnN0cik7CisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfY2FsbChjb25zdCBjaGFyICpuYW1lLCBOb2RlVHlwZSAqYWZmZWN0X2xpc3QpOworCisgICAgLyogU0VUVEVSICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfc2V0KE5vZGVUeXBlICpsdmFsdWUsIE5vZGVUeXBlICpleHByZXNzaW9uKQorICAgIHsgLyoge3t7ICovCisgICAgICAgIE5vZGVUeXBlICpzZXQgPSBuZXdfb3AoInNldCIsIE9QUl9TRVQsIDIpOworICAgICAgICBzZXQtPnVub2RlLm9wci5vcFswXSA9IGx2YWx1ZTsKKyAgICAgICAgc2V0LT51bm9kZS5vcHIub3BbMV0gPSBleHByZXNzaW9uOworICAgICAgICByZXR1cm4gc2V0OworICAgIH0gLyogfX19ICovCisgICAgc3RhdGljIHZvaWQgY29tbWl0X3NldChOb2RlVHlwZSAqc2V0KQorICAgIHsgLyoge3t7ICovCisgICAgICBjb21taXRfdGVzdDIoc2V0LCJzZXQiLElOU1RSX1NFVCk7CisgICAgfSAvKiB9fX0gKi8KKworICAgIC8qIFBMVVNfRVEgKi8KKyAgICBzdGF0aWMgTm9kZVR5cGUgKm5ld19wbHVzX2VxKE5vZGVUeXBlICpsdmFsdWUsIE5vZGVUeXBlICpleHByZXNzaW9uKSAvKiB7e3sgKi8KKyAgICB7CisgICAgICAgIE5vZGVUeXBlICpzZXQgPSBuZXdfb3AoInBsdXNfZXEiLCBPUFJfUExVU19FUSwgMik7CisgICAgICAgIHNldC0+dW5vZGUub3ByLm9wWzBdID0gbHZhbHVlOworICAgICAgICBzZXQtPnVub2RlLm9wci5vcFsxXSA9IGV4cHJlc3Npb247CisgICAgICAgIHJldHVybiBzZXQ7CisgICAgfQorICAgIHN0YXRpYyB2b2lkIGNvbW1pdF9wbHVzX2VxKE5vZGVUeXBlICpzZXQpCisgICAgeworICAgICAgICBwcmVjb21taXRfbm9kZShzZXQtPnVub2RlLm9wci5vcFsxXSk7CisjaWZkZWYgVkVSQk9TRQorICAgICAgICBwcmludGYoImFkZCAlcyAlc1xuIiwgc2V0LT51bm9kZS5vcHIub3BbMF0tPnN0ciwgc2V0LT51bm9kZS5vcHIub3BbMV0tPnN0cik7CisjZW5kaWYKKyAgICAgICAgY3VycmVudEdvb21TTC0+aW5zdHIgPSBnc2xfaW5zdHJfaW5pdChjdXJyZW50R29vbVNMLCAiYWRkIiwgSU5TVFJfQURELCAyLCBzZXQtPmxpbmVfbnVtYmVyKTsKKyAgICAgICAgY29tbWl0X25vZGUoc2V0LT51bm9kZS5vcHIub3BbMF0sMCk7CisgICAgICAgIGNvbW1pdF9ub2RlKHNldC0+dW5vZGUub3ByLm9wWzFdLDEpOworICAgIH0gLyogfX19ICovCisKKyAgICAvKiBTVUJfRVEgKi8KKyAgICBzdGF0aWMgTm9kZVR5cGUgKm5ld19zdWJfZXEoTm9kZVR5cGUgKmx2YWx1ZSwgTm9kZVR5cGUgKmV4cHJlc3Npb24pIC8qIHt7eyAqLworICAgIHsKKyAgICAgICAgTm9kZVR5cGUgKnNldCA9IG5ld19vcCgic3ViX2VxIiwgT1BSX1NVQl9FUSwgMik7CisgICAgICAgIHNldC0+dW5vZGUub3ByLm9wWzBdID0gbHZhbHVlOworICAgICAgICBzZXQtPnVub2RlLm9wci5vcFsxXSA9IGV4cHJlc3Npb247CisgICAgICAgIHJldHVybiBzZXQ7CisgICAgfQorICAgIHN0YXRpYyB2b2lkIGNvbW1pdF9zdWJfZXEoTm9kZVR5cGUgKnNldCkKKyAgICB7CisgICAgICAgIHByZWNvbW1pdF9ub2RlKHNldC0+dW5vZGUub3ByLm9wWzFdKTsKKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIHByaW50Zigic3ViICVzICVzXG4iLCBzZXQtPnVub2RlLm9wci5vcFswXS0+c3RyLCBzZXQtPnVub2RlLm9wci5vcFsxXS0+c3RyKTsKKyNlbmRpZgorICAgICAgICBjdXJyZW50R29vbVNMLT5pbnN0ciA9IGdzbF9pbnN0cl9pbml0KGN1cnJlbnRHb29tU0wsICJzdWIiLCBJTlNUUl9TVUIsIDIsIHNldC0+bGluZV9udW1iZXIpOworICAgICAgICBjb21taXRfbm9kZShzZXQtPnVub2RlLm9wci5vcFswXSwwKTsKKyAgICAgICAgY29tbWl0X25vZGUoc2V0LT51bm9kZS5vcHIub3BbMV0sMSk7CisgICAgfSAvKiB9fX0gKi8KKworICAgIC8qIE1VTF9FUSAqLworICAgIHN0YXRpYyBOb2RlVHlwZSAqbmV3X211bF9lcShOb2RlVHlwZSAqbHZhbHVlLCBOb2RlVHlwZSAqZXhwcmVzc2lvbikgLyoge3t7ICovCisgICAgeworICAgICAgICBOb2RlVHlwZSAqc2V0ID0gbmV3X29wKCJtdWxfZXEiLCBPUFJfTVVMX0VRLCAyKTsKKyAgICAgICAgc2V0LT51bm9kZS5vcHIub3BbMF0gPSBsdmFsdWU7CisgICAgICAgIHNldC0+dW5vZGUub3ByLm9wWzFdID0gZXhwcmVzc2lvbjsKKyAgICAgICAgcmV0dXJuIHNldDsKKyAgICB9CisgICAgc3RhdGljIHZvaWQgY29tbWl0X211bF9lcShOb2RlVHlwZSAqc2V0KQorICAgIHsKKyAgICAgICAgcHJlY29tbWl0X25vZGUoc2V0LT51bm9kZS5vcHIub3BbMV0pOworI2lmZGVmIFZFUkJPU0UKKyAgICAgICAgcHJpbnRmKCJtdWwgJXMgJXNcbiIsIHNldC0+dW5vZGUub3ByLm9wWzBdLT5zdHIsIHNldC0+dW5vZGUub3ByLm9wWzFdLT5zdHIpOworI2VuZGlmCisgICAgICAgIGN1cnJlbnRHb29tU0wtPmluc3RyID0gZ3NsX2luc3RyX2luaXQoY3VycmVudEdvb21TTCwgIm11bCIsIElOU1RSX01VTCwgMiwgc2V0LT5saW5lX251bWJlcik7CisgICAgICAgIGNvbW1pdF9ub2RlKHNldC0+dW5vZGUub3ByLm9wWzBdLDApOworICAgICAgICBjb21taXRfbm9kZShzZXQtPnVub2RlLm9wci5vcFsxXSwxKTsKKyAgICB9IC8qIH19fSAqLworCisgICAgLyogRElWX0VRICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfZGl2X2VxKE5vZGVUeXBlICpsdmFsdWUsIE5vZGVUeXBlICpleHByZXNzaW9uKSAvKiB7e3sgKi8KKyAgICB7CisgICAgICAgIE5vZGVUeXBlICpzZXQgPSBuZXdfb3AoImRpdl9lcSIsIE9QUl9ESVZfRVEsIDIpOworICAgICAgICBzZXQtPnVub2RlLm9wci5vcFswXSA9IGx2YWx1ZTsKKyAgICAgICAgc2V0LT51bm9kZS5vcHIub3BbMV0gPSBleHByZXNzaW9uOworICAgICAgICByZXR1cm4gc2V0OworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBjb21taXRfZGl2X2VxKE5vZGVUeXBlICpzZXQpCisgICAgeworICAgICAgICBwcmVjb21taXRfbm9kZShzZXQtPnVub2RlLm9wci5vcFsxXSk7CisjaWZkZWYgVkVSQk9TRQorICAgICAgICBwcmludGYoImRpdiAlcyAlc1xuIiwgc2V0LT51bm9kZS5vcHIub3BbMF0tPnN0ciwgc2V0LT51bm9kZS5vcHIub3BbMV0tPnN0cik7CisjZW5kaWYKKyAgICAgICAgY3VycmVudEdvb21TTC0+aW5zdHIgPSBnc2xfaW5zdHJfaW5pdChjdXJyZW50R29vbVNMLCAiZGl2IiwgSU5TVFJfRElWLCAyLCBzZXQtPmxpbmVfbnVtYmVyKTsKKyAgICAgICAgY29tbWl0X25vZGUoc2V0LT51bm9kZS5vcHIub3BbMF0sMCk7CisgICAgICAgIGNvbW1pdF9ub2RlKHNldC0+dW5vZGUub3ByLm9wWzFdLDEpOworICAgIH0gLyogfX19ICovCisKKyAgICAvKiBjb21tb2RpdHkgbWV0aG9kIGZvciBhZGQsIG11bHQsIC4uLiAqLworCisgICAgc3RhdGljIHZvaWQgcHJlY29tbWl0X2V4cHIoTm9kZVR5cGUgKmV4cHIsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBpbnN0cl9pZCkKKyAgICB7IC8qIHt7eyAqLworICAgICAgICBOb2RlVHlwZSAqdG1wLCAqdG1wY3B5OworICAgICAgICBpbnQgdG9BZGQ7CisKKyAgICAgICAgLyogY29tcHV0ZSAibGVmdCIgYW5kICJyaWdodCIgKi8KKyAgICAgICAgc3dpdGNoIChleHByLT51bm9kZS5vcHIubmJPcCkgeworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgcHJlY29tbWl0X25vZGUoZXhwci0+dW5vZGUub3ByLm9wWzFdKTsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIHByZWNvbW1pdF9ub2RlKGV4cHItPnVub2RlLm9wci5vcFswXSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNfdG1wX2V4cHIoZXhwci0+dW5vZGUub3ByLm9wWzBdKSkgeworICAgICAgICAgICAgdG1wID0gZXhwci0+dW5vZGUub3ByLm9wWzBdOworICAgICAgICAgICAgdG9BZGQgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGlzX2NvbW11dGF0aXZlX2V4cHIoaW5zdHJfaWQpICYmIChleHByLT51bm9kZS5vcHIubmJPcD09MikgJiYgaXNfdG1wX2V4cHIoZXhwci0+dW5vZGUub3ByLm9wWzFdKSkgeworICAgICAgICAgICAgdG1wID0gZXhwci0+dW5vZGUub3ByLm9wWzFdOworICAgICAgICAgICAgdG9BZGQgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY2hhciBzdG1wWzI1Nl07CisgICAgICAgICAgICAvKiBkZWNsYXJlIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIHRvIHN0b3JlIHRoZSByZXN1bHQgKi8KKyAgICAgICAgICAgIGlmIChleHByLT51bm9kZS5vcHIub3BbMF0tPnR5cGUgPT0gQ09OU1RfSU5UX05PREUpIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHN0bXAsIl9pX3RtcF8laSIsYWxsb2NhdGVUZW1wKCkpOworICAgICAgICAgICAgICAgIGdzbF9pbnRfZGVjbF9nbG9iYWwoc3RtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChleHByLT51bm9kZS5vcHIub3BbMF0tPnR5cGUgPT0gQ09OU1RfRkxPQVRfTk9ERSkgeworICAgICAgICAgICAgICAgIHNwcmludGYoc3RtcCwiX2ZfdG1wJWkiLGFsbG9jYXRlVGVtcCgpKTsKKyAgICAgICAgICAgICAgICBnc2xfZmxvYXRfZGVjbF9nbG9iYWwoc3RtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChleHByLT51bm9kZS5vcHIub3BbMF0tPnR5cGUgPT0gQ09OU1RfUFRSX05PREUpIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHN0bXAsIl9wX3RtcCVpIixhbGxvY2F0ZVRlbXAoKSk7CisgICAgICAgICAgICAgICAgZ3NsX3B0cl9kZWNsX2dsb2JhbChzdG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGludCB0eXBlID0gZ3NsX3R5cGVfb2ZfdmFyKGV4cHItPnVub2RlLm9wci5vcFswXS0+dm5hbWVzcGFjZSwgZXhwci0+dW5vZGUub3ByLm9wWzBdLT5zdHIpOworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IElOU1RSX0ZMT0FUKSB7CisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RtcCwiX2ZfdG1wXyVpIixhbGxvY2F0ZVRlbXAoKSk7CisgICAgICAgICAgICAgICAgICAgIGdzbF9mbG9hdF9kZWNsX2dsb2JhbChzdG1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBJTlNUUl9QVFIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdG1wLCJfcF90bXBfJWkiLGFsbG9jYXRlVGVtcCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZ3NsX3B0cl9kZWNsX2dsb2JhbChzdG1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBJTlNUUl9JTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdG1wLCJfaV90bXBfJWkiLGFsbG9jYXRlVGVtcCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZ3NsX2ludF9kZWNsX2dsb2JhbChzdG1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyNpZiAwCisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IExpbmUgJWQsIENvdWxkIG5vdCBmaW5kIHZhcmlhYmxlICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwci0+bGluZV9udW1iZXIsIGV4cHItPnVub2RlLm9wci5vcFswXS0+c3RyKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsgLyogdHlwZSBpcyBhIHN0cnVjdF9pZCAqLworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0bXAsIl9zX3RtcF8laSIsYWxsb2NhdGVUZW1wKCkpOworICAgICAgICAgICAgICAgICAgICBnc2xfc3RydWN0X2RlY2xfZ2xvYmFsX2Zyb21faWQoc3RtcCx0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0bXAgPSBuZXdfdmFyKHN0bXAsZXhwci0+bGluZV9udW1iZXIpOworCisgICAgICAgICAgICAvKiBzZXQgdGhlIHRtcCB0byB0aGUgdmFsdWUgb2YgIm9wMSIgKi8KKyAgICAgICAgICAgIHRtcGNweSA9IG5vZGVDbG9uZSh0bXApOworICAgICAgICAgICAgY29tbWl0X25vZGUobmV3X3NldCh0bXAsZXhwci0+dW5vZGUub3ByLm9wWzBdKSwwKTsKKyAgICAgICAgICAgIHRvQWRkID0gMTsKKworICAgICAgICAgICAgdG1wID0gdG1wY3B5OworICAgICAgICB9CisKKyAgICAgICAgLyogYWRkIG9wMiB0byB0bXAgKi8KKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIGlmIChleHByLT51bm9kZS5vcHIubmJPcCA9PSAyKQorICAgICAgICAgIHByaW50ZigiJXMgJXMgJXNcbiIsIHR5cGUsIHRtcC0+c3RyLCBleHByLT51bm9kZS5vcHIub3BbdG9BZGRdLT5zdHIpOworICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRmKCIlcyAlc1xuIiwgdHlwZSwgdG1wLT5zdHIpOworI2VuZGlmCisgICAgICAgIGN1cnJlbnRHb29tU0wtPmluc3RyID0gZ3NsX2luc3RyX2luaXQoY3VycmVudEdvb21TTCwgdHlwZSwgaW5zdHJfaWQsIGV4cHItPnVub2RlLm9wci5uYk9wLCBleHByLT5saW5lX251bWJlcik7CisgICAgICAgIHRtcGNweSA9IG5vZGVDbG9uZSh0bXApOworICAgICAgICBjb21taXRfbm9kZSh0bXAsMCk7CisgICAgICAgIGlmIChleHByLT51bm9kZS5vcHIubmJPcCA9PSAyKSB7CisgICAgICAgICAgY29tbWl0X25vZGUoZXhwci0+dW5vZGUub3ByLm9wW3RvQWRkXSwxKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAvKiByZWRlZmluZSB0aGUgQUREIG5vZGUgbm93IGFzIHRoZSBjb21wdXRlZCB2YXJpYWJsZSAqLworICAgICAgICBub2RlRnJlZUludGVybmFscyhleHByKTsKKyAgICAgICAgKmV4cHIgPSAqdG1wY3B5OworICAgICAgICBmcmVlKHRtcGNweSk7CisgICAgfSAvKiB9fX0gKi8KKworICAgIHN0YXRpYyBOb2RlVHlwZSAqbmV3X2V4cHIxKGNvbnN0IGNoYXIgKm5hbWUsIGludCBpZCwgTm9kZVR5cGUgKmV4cHIxKQorICAgIHsgLyoge3t7ICovCisgICAgICAgIE5vZGVUeXBlICphZGQgPSBuZXdfb3AobmFtZSwgaWQsIDEpOworICAgICAgICBhZGQtPnVub2RlLm9wci5vcFswXSA9IGV4cHIxOworICAgICAgICByZXR1cm4gYWRkOworICAgIH0gLyogfX19ICovCisKKyAgICBzdGF0aWMgTm9kZVR5cGUgKm5ld19leHByMihjb25zdCBjaGFyICpuYW1lLCBpbnQgaWQsIE5vZGVUeXBlICpleHByMSwgTm9kZVR5cGUgKmV4cHIyKQorICAgIHsgLyoge3t7ICovCisgICAgICAgIE5vZGVUeXBlICphZGQgPSBuZXdfb3AobmFtZSwgaWQsIDIpOworICAgICAgICBhZGQtPnVub2RlLm9wci5vcFswXSA9IGV4cHIxOworICAgICAgICBhZGQtPnVub2RlLm9wci5vcFsxXSA9IGV4cHIyOworICAgICAgICByZXR1cm4gYWRkOworICAgIH0gLyogfX19ICovCisKKyAgICAvKiBBREQgKi8KKyAgICBzdGF0aWMgTm9kZVR5cGUgKm5ld19hZGQoTm9kZVR5cGUgKmV4cHIxLCBOb2RlVHlwZSAqZXhwcjIpIHsgLyoge3t7ICovCisgICAgICAgIHJldHVybiBuZXdfZXhwcjIoImFkZCIsIE9QUl9BREQsIGV4cHIxLCBleHByMik7CisgICAgfQorICAgIHN0YXRpYyB2b2lkIHByZWNvbW1pdF9hZGQoTm9kZVR5cGUgKmFkZCkgeworICAgICAgICBwcmVjb21taXRfZXhwcihhZGQsImFkZCIsSU5TVFJfQUREKTsKKyAgICB9IC8qIH19fSAqLworCisgICAgLyogU1VCICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfc3ViKE5vZGVUeXBlICpleHByMSwgTm9kZVR5cGUgKmV4cHIyKSB7IC8qIHt7eyAqLworICAgICAgICByZXR1cm4gbmV3X2V4cHIyKCJzdWIiLCBPUFJfU1VCLCBleHByMSwgZXhwcjIpOworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBwcmVjb21taXRfc3ViKE5vZGVUeXBlICpzdWIpIHsKKyAgICAgICAgcHJlY29tbWl0X2V4cHIoc3ViLCJzdWIiLElOU1RSX1NVQik7CisgICAgfSAvKiB9fX0gKi8KKworICAgIC8qIE5FRyAqLworICAgIHN0YXRpYyBOb2RlVHlwZSAqbmV3X25lZyhOb2RlVHlwZSAqZXhwcikgeyAvKiB7e3sgKi8KKyAgICAgICAgTm9kZVR5cGUgKnplcm9Db25zdCA9IE5VTEw7CisgICAgICAgIGlmIChleHByLT50eXBlID09IENPTlNUX0lOVF9OT0RFKQorICAgICAgICAgIHplcm9Db25zdCA9IG5ld19jb25zdEludCgiMCIsIGN1cnJlbnRHb29tU0wtPm51bV9saW5lcyk7CisgICAgICAgIGVsc2UgaWYgKGV4cHItPnR5cGUgPT0gQ09OU1RfRkxPQVRfTk9ERSkKKyAgICAgICAgICB6ZXJvQ29uc3QgPSBuZXdfY29uc3RGbG9hdCgiMC4wIiwgY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKTsKKyAgICAgICAgZWxzZSBpZiAoZXhwci0+dHlwZSA9PSBDT05TVF9QVFJfTk9ERSkgeworICAgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworI2lmIDAKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBMaW5lICVkLCBDb3VsZCBub3QgbmVnYXRlIGNvbnN0IHBvaW50ZXIuXG4iLAorICAgICAgICAgICAgY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKTsKKyAgICAgICAgICBleGl0KDEpOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgdHlwZSA9IGdzbF90eXBlX29mX3ZhcihleHByLT52bmFtZXNwYWNlLCBleHByLT5zdHIpOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gSU5TVFJfRkxPQVQpCisgICAgICAgICAgICAgIHplcm9Db25zdCA9IG5ld19jb25zdEZsb2F0KCIwLjAiLCBjdXJyZW50R29vbVNMLT5udW1fbGluZXMpOworICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBJTlNUUl9QVFIpIHsKKyAgICAgICAgICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisjaWYgMAorICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBMaW5lICVkLCBDb3VsZCBub3QgbmVnYXRlIHBvaW50ZXIuXG4iLAorICAgICAgICAgICAgICAgIGN1cnJlbnRHb29tU0wtPm51bV9saW5lcyk7CisgICAgICAgICAgICAgIGV4aXQoMSk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gSU5TVFJfSU5UKQorICAgICAgICAgICAgICB6ZXJvQ29uc3QgPSBuZXdfY29uc3RJbnQoIjAiLCBjdXJyZW50R29vbVNMLT5udW1fbGluZXMpOworICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAtMSkgeworICAgICAgICAgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworI2lmIDAKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBMaW5lICVkLCBDb3VsZCBub3QgZmluZCB2YXJpYWJsZSAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwci0+bGluZV9udW1iZXIsIGV4cHItPnVub2RlLm9wci5vcFswXS0+c3RyKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsgLyogdHlwZSBpcyBhIHN0cnVjdF9pZCAqLworICAgICAgICAgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworI2lmIDAKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBMaW5lICVkLCBDb3VsZCBub3QgbmVnYXRlIHN0cnVjdCAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwci0+bGluZV9udW1iZXIsIGV4cHItPnN0cik7CisgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXdfZXhwcjIoInN1YiIsIE9QUl9TVUIsIHplcm9Db25zdCwgZXhwcik7CisgICAgfQorICAgIC8qIH19fSAqLworCisgICAgLyogTVVMICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfbXVsKE5vZGVUeXBlICpleHByMSwgTm9kZVR5cGUgKmV4cHIyKSB7IC8qIHt7eyAqLworICAgICAgICByZXR1cm4gbmV3X2V4cHIyKCJtdWwiLCBPUFJfTVVMLCBleHByMSwgZXhwcjIpOworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBwcmVjb21taXRfbXVsKE5vZGVUeXBlICptdWwpIHsKKyAgICAgICAgcHJlY29tbWl0X2V4cHIobXVsLCJtdWwiLElOU1RSX01VTCk7CisgICAgfSAvKiB9fX0gKi8KKyAgICAKKyAgICAvKiBESVYgKi8KKyAgICBzdGF0aWMgTm9kZVR5cGUgKm5ld19kaXYoTm9kZVR5cGUgKmV4cHIxLCBOb2RlVHlwZSAqZXhwcjIpIHsgLyoge3t7ICovCisgICAgICAgIHJldHVybiBuZXdfZXhwcjIoImRpdiIsIE9QUl9ESVYsIGV4cHIxLCBleHByMik7CisgICAgfQorICAgIHN0YXRpYyB2b2lkIHByZWNvbW1pdF9kaXYoTm9kZVR5cGUgKm11bCkgeworICAgICAgICBwcmVjb21taXRfZXhwcihtdWwsImRpdiIsSU5TVFJfRElWKTsKKyAgICB9IC8qIH19fSAqLworCisgICAgLyogQ0FMTCBFWFBSRVNTSU9OICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfY2FsbF9leHByKGNvbnN0IGNoYXIgKm5hbWUsIE5vZGVUeXBlICphZmZlY3RfbGlzdCkgeyAvKiB7e3sgKi8KKyAgICAgICAgTm9kZVR5cGUgKmNhbGwgPSBuZXdfY2FsbChuYW1lLGFmZmVjdF9saXN0KTsKKyAgICAgICAgTm9kZVR5cGUgKm5vZGUgPSBuZXdfZXhwcjEobmFtZSwgT1BSX0NBTExfRVhQUiwgY2FsbCk7CisgICAgICAgIG5vZGUtPnZuYW1lc3BhY2UgPSBnc2xfZmluZF9uYW1lc3BhY2UobmFtZSk7CisgICAgICAgIGlmIChub2RlLT52bmFtZXNwYWNlID09IE5VTEwpCisgICAgICAgICAgLyogZnByaW50ZihzdGRlcnIsICJFUlJPUjogTGluZSAlZCwgTm8gcmV0dXJuIHR5cGUgZm9yOiAnJXMnXG4iLCBjdXJyZW50R29vbVNMLT5udW1fbGluZXMsIG5hbWUpOyAqLworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisgICAgc3RhdGljIHZvaWQgcHJlY29tbWl0X2NhbGxfZXhwcihOb2RlVHlwZSAqY2FsbCkgeworICAgICAgICBjaGFyIHN0bXBbMjU2XTsKKyAgICAgICAgTm9kZVR5cGUgKnRtcCwqdG1wY3B5OworICAgICAgICBpbnQgdHlwZSA9IGdzbF90eXBlX29mX3ZhcihjYWxsLT52bmFtZXNwYWNlLCBjYWxsLT5zdHIpOworICAgICAgICBpZiAodHlwZSA9PSBJTlNUUl9GTE9BVCkgeworICAgICAgICAgIHNwcmludGYoc3RtcCwiX2ZfdG1wXyVpIixhbGxvY2F0ZVRlbXAoKSk7CisgICAgICAgICAgZ3NsX2Zsb2F0X2RlY2xfZ2xvYmFsKHN0bXApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gSU5TVFJfUFRSKSB7CisgICAgICAgICAgc3ByaW50ZihzdG1wLCJfcF90bXBfJWkiLGFsbG9jYXRlVGVtcCgpKTsKKyAgICAgICAgICBnc2xfcHRyX2RlY2xfZ2xvYmFsKHN0bXApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gSU5TVFJfSU5UKSB7CisgICAgICAgICAgc3ByaW50ZihzdG1wLCJfaV90bXBfJWkiLGFsbG9jYXRlVGVtcCgpKTsKKyAgICAgICAgICBnc2xfaW50X2RlY2xfZ2xvYmFsKHN0bXApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gLTEpIHsKKyAgICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyNpZiAwCisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogTGluZSAlZCwgQ291bGQgbm90IGZpbmQgdmFyaWFibGUgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgIGNhbGwtPmxpbmVfbnVtYmVyLCBjYWxsLT5zdHIpOworICAgICAgICAgIGV4aXQoMSk7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLyogdHlwZSBpcyBhIHN0cnVjdF9pZCAqLworICAgICAgICAgIHNwcmludGYoc3RtcCwiX3NfdG1wXyVpIixhbGxvY2F0ZVRlbXAoKSk7CisgICAgICAgICAgZ3NsX3N0cnVjdF9kZWNsX2dsb2JhbF9mcm9tX2lkKHN0bXAsdHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgdG1wID0gbmV3X3ZhcihzdG1wLGNhbGwtPmxpbmVfbnVtYmVyKTsKKyAgICAgICAgY29tbWl0X25vZGUoY2FsbC0+dW5vZGUub3ByLm9wWzBdLDApOworICAgICAgICB0bXBjcHkgPSBub2RlQ2xvbmUodG1wKTsKKyAgICAgICAgY29tbWl0X25vZGUobmV3X3NldCh0bXAsbmV3X3ZhcihjYWxsLT5zdHIsY2FsbC0+bGluZV9udW1iZXIpKSwwKTsKKyAgICAgICAgCisgICAgICAgIG5vZGVGcmVlSW50ZXJuYWxzKGNhbGwpOworICAgICAgICAqY2FsbCA9ICp0bXBjcHk7CisgICAgICAgIGZyZWUodG1wY3B5KTsKKyAgICB9IC8qIH19fSAqLworCisgICAgc3RhdGljIHZvaWQgY29tbWl0X3Rlc3QyKE5vZGVUeXBlICpzZXQsY29uc3QgY2hhciAqdHlwZSwgaW50IGluc3RyKQorICAgIHsgLyoge3t7ICovCisgICAgICAgIE5vZGVUeXBlICp0bXA7CisgICAgICAgIGNoYXIgc3RtcFsyNTZdOworICAgICAgICBwcmVjb21taXRfbm9kZShzZXQtPnVub2RlLm9wci5vcFswXSk7CisgICAgICAgIHByZWNvbW1pdF9ub2RlKHNldC0+dW5vZGUub3ByLm9wWzFdKTsKKyAgICAgICAgdG1wID0gc2V0LT51bm9kZS5vcHIub3BbMF07CisgICAgICAgIAorICAgICAgICBzdG1wWzBdID0gMDsKKyAgICAgICAgaWYgKHNldC0+dW5vZGUub3ByLm9wWzBdLT50eXBlID09IENPTlNUX0lOVF9OT0RFKSB7CisgICAgICAgICAgICBzcHJpbnRmKHN0bXAsIl9pX3RtcF8laSIsYWxsb2NhdGVUZW1wKCkpOworICAgICAgICAgICAgZ3NsX2ludF9kZWNsX2dsb2JhbChzdG1wKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzZXQtPnVub2RlLm9wci5vcFswXS0+dHlwZSA9PSBDT05TVF9GTE9BVF9OT0RFKSB7CisgICAgICAgICAgICBzcHJpbnRmKHN0bXAsIl9mX3RtcCVpIixhbGxvY2F0ZVRlbXAoKSk7CisgICAgICAgICAgICBnc2xfZmxvYXRfZGVjbF9nbG9iYWwoc3RtcCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc2V0LT51bm9kZS5vcHIub3BbMF0tPnR5cGUgPT0gQ09OU1RfUFRSX05PREUpIHsKKyAgICAgICAgICAgIHNwcmludGYoc3RtcCwiX3BfdG1wJWkiLGFsbG9jYXRlVGVtcCgpKTsKKyAgICAgICAgICAgIGdzbF9wdHJfZGVjbF9nbG9iYWwoc3RtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0bXBbMF0pIHsKKyAgICAgICAgICAgIE5vZGVUeXBlICp0bXBjcHk7CisgICAgICAgICAgICB0bXAgPSBuZXdfdmFyKHN0bXAsIHNldC0+bGluZV9udW1iZXIpOworICAgICAgICAgICAgdG1wY3B5ID0gbm9kZUNsb25lKHRtcCk7CisgICAgICAgICAgICBjb21taXRfbm9kZShuZXdfc2V0KHRtcCxzZXQtPnVub2RlLm9wci5vcFswXSksMCk7CisgICAgICAgICAgICB0bXAgPSB0bXBjcHk7CisgICAgICAgIH0KKworI2lmZGVmIFZFUkJPU0UKKyAgICAgICAgcHJpbnRmKCIlcyAlcyAlc1xuIiwgdHlwZSwgdG1wLT5zdHIsIHNldC0+dW5vZGUub3ByLm9wWzFdLT5zdHIpOworI2VuZGlmCisgICAgICAgIGN1cnJlbnRHb29tU0wtPmluc3RyID0gZ3NsX2luc3RyX2luaXQoY3VycmVudEdvb21TTCwgdHlwZSwgaW5zdHIsIDIsIHNldC0+bGluZV9udW1iZXIpOworICAgICAgICBjb21taXRfbm9kZSh0bXAsaW5zdHIhPUlOU1RSX1NFVCk7CisgICAgICAgIGNvbW1pdF9ub2RlKHNldC0+dW5vZGUub3ByLm9wWzFdLDEpOworICAgIH0gLyogfX19ICovCisgICAgCisgICAgLyogTk9UICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfbm90KE5vZGVUeXBlICpleHByMSkgeyAvKiB7e3sgKi8KKyAgICAgICAgcmV0dXJuIG5ld19leHByMSgibm90IiwgT1BSX05PVCwgZXhwcjEpOworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBjb21taXRfbm90KE5vZGVUeXBlICpzZXQpCisgICAgeworICAgICAgICBjb21taXRfbm9kZShzZXQtPnVub2RlLm9wci5vcFswXSwwKTsKKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIHByaW50Zigibm90XG4iKTsKKyNlbmRpZgorICAgICAgICBjdXJyZW50R29vbVNMLT5pbnN0ciA9IGdzbF9pbnN0cl9pbml0KGN1cnJlbnRHb29tU0wsICJub3QiLCBJTlNUUl9OT1QsIDEsIHNldC0+bGluZV9udW1iZXIpOworICAgICAgICBnc2xfaW5zdHJfYWRkX3BhcmFtKGN1cnJlbnRHb29tU0wtPmluc3RyLCAifGR1bW15fCIsIFRZUEVfTEFCRUwpOworICAgIH0gLyogfX19ICovCisgICAgCisgICAgLyogRVFVICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfZXF1KE5vZGVUeXBlICpleHByMSwgTm9kZVR5cGUgKmV4cHIyKSB7IC8qIHt7eyAqLworICAgICAgICByZXR1cm4gbmV3X2V4cHIyKCJpc2VxdWFsIiwgT1BSX0VRVSwgZXhwcjEsIGV4cHIyKTsKKyAgICB9CisgICAgc3RhdGljIHZvaWQgY29tbWl0X2VxdShOb2RlVHlwZSAqbXVsKSB7CisgICAgICAgIGNvbW1pdF90ZXN0MihtdWwsImlzZXF1YWwiLElOU1RSX0lTRVFVQUwpOworICAgIH0gLyogfX19ICovCisgICAgCisgICAgLyogSU5GICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfbG93KE5vZGVUeXBlICpleHByMSwgTm9kZVR5cGUgKmV4cHIyKSB7IC8qIHt7eyAqLworICAgICAgICByZXR1cm4gbmV3X2V4cHIyKCJpc2xvd2VyIiwgT1BSX0xPVywgZXhwcjEsIGV4cHIyKTsKKyAgICB9CisgICAgc3RhdGljIHZvaWQgY29tbWl0X2xvdyhOb2RlVHlwZSAqbXVsKSB7CisgICAgICAgIGNvbW1pdF90ZXN0MihtdWwsImlzbG93ZXIiLElOU1RSX0lTTE9XRVIpOworICAgIH0gLyogfX19ICovCisKKyAgICAvKiBXSElMRSAqLworICAgIHN0YXRpYyBOb2RlVHlwZSAqbmV3X3doaWxlKE5vZGVUeXBlICpleHByZXNzaW9uLCBOb2RlVHlwZSAqaW5zdHIpIHsgLyoge3t7ICovCisgICAgICAgIE5vZGVUeXBlICpub2RlID0gbmV3X29wKCJ3aGlsZSIsIE9QUl9XSElMRSwgMik7CisgICAgICAgIG5vZGUtPnVub2RlLm9wci5vcFswXSA9IGV4cHJlc3Npb247CisgICAgICAgIG5vZGUtPnVub2RlLm9wci5vcFsxXSA9IGluc3RyOworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBjb21taXRfd2hpbGUoTm9kZVR5cGUgKm5vZGUpCisgICAgeworICAgICAgICBpbnQgbGJsID0gYWxsb2NhdGVMYWJlbCgpOworICAgICAgICBjaGFyIHN0YXJ0X3doaWxlWzEwMjRdLCB0ZXN0X3doaWxlWzEwMjRdOworICAgICAgICBzcHJpbnRmKHN0YXJ0X3doaWxlLCAifHN0YXJ0X3doaWxlXyVkfCIsIGxibCk7CisgICAgICAgIHNwcmludGYodGVzdF93aGlsZSwgInx0ZXN0X3doaWxlXyVkfCIsIGxibCk7CisgICAgICAgCisgICAgICAgIEdTTF9QVVRfSlVNUCh0ZXN0X3doaWxlLG5vZGUtPmxpbmVfbnVtYmVyKTsKKyAgICAgICAgR1NMX1BVVF9MQUJFTChzdGFydF93aGlsZSxub2RlLT5saW5lX251bWJlcik7CisKKyAgICAgICAgLyogY29kZSAqLworICAgICAgICBjb21taXRfbm9kZShub2RlLT51bm9kZS5vcHIub3BbMV0sMCk7CisKKyAgICAgICAgR1NMX1BVVF9MQUJFTCh0ZXN0X3doaWxlLG5vZGUtPmxpbmVfbnVtYmVyKTsKKyAgICAgICAgY29tbWl0X25vZGUobm9kZS0+dW5vZGUub3ByLm9wWzBdLDApOworICAgICAgICBHU0xfUFVUX0pOWkVSTyhzdGFydF93aGlsZSxub2RlLT5saW5lX251bWJlcik7CisgICAgfSAvKiB9fX0gKi8KKworICAgIC8qIEZPUiBFQUNIICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfc3RhdGljX2ZvcmVhY2goTm9kZVR5cGUgKnZhciwgTm9kZVR5cGUgKnZhcl9saXN0LCBOb2RlVHlwZSAqaW5zdHIpIHsgLyoge3t7ICovCisgICAgICAgIE5vZGVUeXBlICpub2RlID0gbmV3X29wKCJmb3IiLCBPUFJfRk9SRUFDSCwgMyk7CisgICAgICAgIG5vZGUtPnVub2RlLm9wci5vcFswXSA9IHZhcjsKKyAgICAgICAgbm9kZS0+dW5vZGUub3ByLm9wWzFdID0gdmFyX2xpc3Q7CisgICAgICAgIG5vZGUtPnVub2RlLm9wci5vcFsyXSA9IGluc3RyOworICAgICAgICBub2RlLT5saW5lX251bWJlciA9IGN1cnJlbnRHb29tU0wtPm51bV9saW5lczsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorICAgIHN0YXRpYyB2b2lkIGNvbW1pdF9mb3JlYWNoKE5vZGVUeXBlICpub2RlKQorICAgIHsKKyAgICAgICAgTm9kZVR5cGUgKmN1ciA9IG5vZGUtPnVub2RlLm9wci5vcFsxXTsKKyAgICAgICAgY2hhciB0bXBfZnVuY1syNTZdLCB0bXBfbG9vcFsyNTZdOworICAgICAgICBpbnQgbGJsID0gYWxsb2NhdGVMYWJlbCgpOworICAgICAgICBzcHJpbnRmKHRtcF9mdW5jLCAifGZvcmVhY2hfZnVuY18lZHwiLCBsYmwpOworICAgICAgICBzcHJpbnRmKHRtcF9sb29wLCAifGZvcmVhY2hfbG9vcF8lZHwiLCBsYmwpOworCisgICAgICAgIEdTTF9QVVRfSlVNUCh0bXBfbG9vcCwgbm9kZS0+bGluZV9udW1iZXIpOworICAgICAgICBHU0xfUFVUX0xBQkVMKHRtcF9mdW5jLCBub2RlLT5saW5lX251bWJlcik7CisKKyAgICAgICAgcHJlY29tbWl0X25vZGUobm9kZS0+dW5vZGUub3ByLm9wWzJdKTsKKyAgICAgICAgY29tbWl0X25vZGUobm9kZS0+dW5vZGUub3ByLm9wWzJdLCAwKTsKKworICAgICAgICBjdXJyZW50R29vbVNMLT5pbnN0ciA9IGdzbF9pbnN0cl9pbml0KGN1cnJlbnRHb29tU0wsICJyZXQiLCBJTlNUUl9SRVQsIDEsIG5vZGUtPmxpbmVfbnVtYmVyKTsKKyAgICAgICAgZ3NsX2luc3RyX2FkZF9wYXJhbShjdXJyZW50R29vbVNMLT5pbnN0ciwgInxkdW1teXwiLCBUWVBFX0xBQkVMKTsKKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIHByaW50ZigicmV0XG4iKTsKKyNlbmRpZgorICAgICAgICAKKyAgICAgICAgR1NMX1BVVF9MQUJFTCh0bXBfbG9vcCwgbm9kZS0+bGluZV9udW1iZXIpOworICAgICAgICAKKyAgICAgICAgd2hpbGUgKGN1ciAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgTm9kZVR5cGUgKngsICp2YXI7CisKKyAgICAgICAgICAvKiAxOiB4PXZhciAqLworICAgICAgICAgIHggICA9IG5vZGVDbG9uZShub2RlLT51bm9kZS5vcHIub3BbMF0pOworICAgICAgICAgIHZhciA9IG5vZGVDbG9uZShjdXItPnVub2RlLm9wci5vcFswXSk7CisgICAgICAgICAgY29tbWl0X25vZGUobmV3X3NldCh4LCB2YXIpLDApOworICAgICAgICAgIAorICAgICAgICAgIC8qIDI6IGluc3RyICovCisgICAgICAgICAgY3VycmVudEdvb21TTC0+aW5zdHIgPSBnc2xfaW5zdHJfaW5pdChjdXJyZW50R29vbVNMLCAiY2FsbCIsIElOU1RSX0NBTEwsIDEsIG5vZGUtPmxpbmVfbnVtYmVyKTsKKyAgICAgICAgICBnc2xfaW5zdHJfYWRkX3BhcmFtKGN1cnJlbnRHb29tU0wtPmluc3RyLCB0bXBfZnVuYywgVFlQRV9MQUJFTCk7CisjaWZkZWYgVkVSQk9TRQorICAgICAgICAgIHByaW50ZigiY2FsbCAlc1xuIiwgdG1wX2Z1bmMpOworI2VuZGlmCisgICAgICAgICAgCisgICAgICAgICAgLyogMzogdmFyPXggKi8KKyAgICAgICAgICB4ICAgPSBub2RlQ2xvbmUobm9kZS0+dW5vZGUub3ByLm9wWzBdKTsKKyAgICAgICAgICB2YXIgPSBjdXItPnVub2RlLm9wci5vcFswXTsKKyAgICAgICAgICBjb21taXRfbm9kZShuZXdfc2V0KHZhciwgeCksMCk7CisgICAgICAgICAgY3VyID0gY3VyLT51bm9kZS5vcHIub3BbMV07CisgICAgICAgIH0KKyAgICAgICAgbm9kZUZyZWUobm9kZS0+dW5vZGUub3ByLm9wWzBdKTsKKyAgICB9IC8qIH19fSAqLworCisgICAgLyogSUYgKi8KKyAgICBzdGF0aWMgTm9kZVR5cGUgKm5ld19pZihOb2RlVHlwZSAqZXhwcmVzc2lvbiwgTm9kZVR5cGUgKmluc3RyKSB7IC8qIHt7eyAqLworICAgICAgICBOb2RlVHlwZSAqbm9kZSA9IG5ld19vcCgiaWYiLCBPUFJfSUYsIDIpOworICAgICAgICBub2RlLT51bm9kZS5vcHIub3BbMF0gPSBleHByZXNzaW9uOworICAgICAgICBub2RlLT51bm9kZS5vcHIub3BbMV0gPSBpbnN0cjsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorICAgIHN0YXRpYyB2b2lkIGNvbW1pdF9pZihOb2RlVHlwZSAqbm9kZSkgeworCisgICAgICAgIGNoYXIgc2xhYlsxMDI0XTsKKyAgICAgICAgc3ByaW50ZihzbGFiLCAifGVpZiVkfCIsIGFsbG9jYXRlTGFiZWwoKSk7CisgICAgICAgIGNvbW1pdF9ub2RlKG5vZGUtPnVub2RlLm9wci5vcFswXSwwKTsKKyAgICAgICAgR1NMX1BVVF9KWkVSTyhzbGFiLG5vZGUtPmxpbmVfbnVtYmVyKTsKKyAgICAgICAgLyogY29kZSAqLworICAgICAgICBjb21taXRfbm9kZShub2RlLT51bm9kZS5vcHIub3BbMV0sMCk7CisgICAgICAgIEdTTF9QVVRfTEFCRUwoc2xhYixub2RlLT5saW5lX251bWJlcik7CisgICAgfSAvKiB9fX0gKi8KKworICAgIC8qIEJMT0NLICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfYmxvY2soTm9kZVR5cGUgKmxhc3ROb2RlKSB7IC8qIHt7eyAqLworICAgICAgICBOb2RlVHlwZSAqYmxrID0gbmV3X29wKCJibG9jayIsIE9QUl9CTE9DSywgMik7CisgICAgICAgIGJsay0+dW5vZGUub3ByLm9wWzBdID0gbmV3X25vcCgic3RhcnRfb2ZfYmxvY2siKTsKKyAgICAgICAgYmxrLT51bm9kZS5vcHIub3BbMV0gPSBsYXN0Tm9kZTsgICAgICAgIAorICAgICAgICByZXR1cm4gYmxrOworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBjb21taXRfYmxvY2soTm9kZVR5cGUgKm5vZGUpIHsKKyAgICAgICAgY29tbWl0X25vZGUobm9kZS0+dW5vZGUub3ByLm9wWzBdLT51bm9kZS5vcHIubmV4dCwwKTsKKyAgICB9IC8qIH19fSAqLworCisgICAgLyogRlVOQ1RJT04gSU5UUk8gKi8KKyAgICBzdGF0aWMgTm9kZVR5cGUgKm5ld19mdW5jdGlvbl9pbnRybyhjb25zdCBjaGFyICpuYW1lKSB7IC8qIHt7eyAqLworICAgICAgICBjaGFyIHN0bXBbMjU2XTsKKyAgICAgICAgaWYgKHN0cmxlbihuYW1lKSA8IDIwMCkgeworICAgICAgICAgICBzcHJpbnRmKHN0bXAsICJ8X19mdW5jXyVzfCIsIG5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXdfb3Aoc3RtcCwgT1BSX0ZVTkNfSU5UUk8sIDApOworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBjb21taXRfZnVuY3Rpb25faW50cm8oTm9kZVR5cGUgKm5vZGUpIHsKKyAgICAgICAgY3VycmVudEdvb21TTC0+aW5zdHIgPSBnc2xfaW5zdHJfaW5pdChjdXJyZW50R29vbVNMLCAibGFiZWwiLCBJTlNUUl9MQUJFTCwgMSwgbm9kZS0+bGluZV9udW1iZXIpOworICAgICAgICBnc2xfaW5zdHJfYWRkX3BhcmFtKGN1cnJlbnRHb29tU0wtPmluc3RyLCBub2RlLT5zdHIsIFRZUEVfTEFCRUwpOworI2lmZGVmIFZFUkJPU0UKKyAgICAgICAgcHJpbnRmKCJsYWJlbCAlc1xuIiwgbm9kZS0+c3RyKTsKKyNlbmRpZgorICAgIH0gLyogfX19ICovCisKKyAgICAvKiBGVU5DVElPTiBPVVRSTyAqLworICAgIHN0YXRpYyBOb2RlVHlwZSAqbmV3X2Z1bmN0aW9uX291dHJvKCkgeyAvKiB7e3sgKi8KKyAgICAgICAgcmV0dXJuIG5ld19vcCgicmV0IiwgT1BSX0ZVTkNfT1VUUk8sIDApOworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBjb21taXRfZnVuY3Rpb25fb3V0cm8oTm9kZVR5cGUgKm5vZGUpIHsKKyAgICAgICAgY3VycmVudEdvb21TTC0+aW5zdHIgPSBnc2xfaW5zdHJfaW5pdChjdXJyZW50R29vbVNMLCAicmV0IiwgSU5TVFJfUkVULCAxLCBub2RlLT5saW5lX251bWJlcik7CisgICAgICAgIGdzbF9pbnN0cl9hZGRfcGFyYW0oY3VycmVudEdvb21TTC0+aW5zdHIsICJ8ZHVtbXl8IiwgVFlQRV9MQUJFTCk7CisgICAgICAgIHJlbGVhc2VBbGxUZW1wcygpOworI2lmZGVmIFZFUkJPU0UKKyAgICAgICAgcHJpbnRmKCJyZXRcbiIpOworI2VuZGlmCisgICAgfSAvKiB9fX0gKi8KKyAgICAKKyAgICAvKiBBRkZFQ1RBVElPTiBMSVNUICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfYWZmZWNfbGlzdChOb2RlVHlwZSAqc2V0LCBOb2RlVHlwZSAqbmV4dCkgLyoge3t7ICovCisgICAgeworICAgICAgTm9kZVR5cGUgKm5vZGUgPSBuZXdfb3AoImFmZmVjdF9saXN0IiwgT1BSX0FGRkVDVF9MSVNULCAyKTsKKyAgICAgIG5vZGUtPnVub2RlLm9wci5vcFswXSA9IHNldDsKKyAgICAgIG5vZGUtPnVub2RlLm9wci5vcFsxXSA9IG5leHQ7CisgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfYWZmZWN0X2xpc3RfYWZ0ZXIoTm9kZVR5cGUgKmFmZmVjdF9saXN0KQorICAgIHsKKyAgICAgIE5vZGVUeXBlICpyZXQgID0gTlVMTDsKKyAgICAgIE5vZGVUeXBlICpjdXIgID0gIGFmZmVjdF9saXN0OworICAgICAgd2hpbGUoY3VyICE9IE5VTEwpIHsKKyAgICAgICAgTm9kZVR5cGUgKnNldCAgPSBjdXItPnVub2RlLm9wci5vcFswXTsKKyAgICAgICAgTm9kZVR5cGUgKm5leHQgPSBjdXItPnVub2RlLm9wci5vcFsxXTsKKyAgICAgICAgTm9kZVR5cGUgKmx2YWx1ZSAgICAgPSBzZXQtPnVub2RlLm9wci5vcFswXTsKKyAgICAgICAgTm9kZVR5cGUgKmV4cHJlc3Npb24gPSBzZXQtPnVub2RlLm9wci5vcFsxXTsKKyAgICAgICAgaWYgKChsdmFsdWUtPnN0clswXSA9PSAnJicpICYmIChleHByZXNzaW9uLT50eXBlID09IFZBUl9OT0RFKSkgeworICAgICAgICAgIE5vZGVUeXBlICpuc2V0ID0gbmV3X3NldChub2RlQ2xvbmUoZXhwcmVzc2lvbiksIG5vZGVDbG9uZShsdmFsdWUpKTsKKyAgICAgICAgICByZXQgID0gbmV3X2FmZmVjX2xpc3QobnNldCwgcmV0KTsKKyAgICAgICAgfQorICAgICAgICBjdXIgPSBuZXh0OworICAgICAgfQorICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgc3RhdGljIHZvaWQgY29tbWl0X2FmZmVjdF9saXN0KE5vZGVUeXBlICpub2RlKQorICAgIHsKKyAgICAgIE5vZGVUeXBlICpjdXIgPSBub2RlOworICAgICAgd2hpbGUoY3VyICE9IE5VTEwpIHsKKyAgICAgICAgTm9kZVR5cGUgKnNldCA9IGN1ci0+dW5vZGUub3ByLm9wWzBdOworICAgICAgICBwcmVjb21taXRfbm9kZShzZXQtPnVub2RlLm9wci5vcFswXSk7CisgICAgICAgIHByZWNvbW1pdF9ub2RlKHNldC0+dW5vZGUub3ByLm9wWzFdKTsKKyAgICAgICAgY3VyID0gY3VyLT51bm9kZS5vcHIub3BbMV07CisgICAgICB9CisgICAgICBjdXIgPSBub2RlOworICAgICAgd2hpbGUoY3VyICE9IE5VTEwpIHsKKyAgICAgICAgTm9kZVR5cGUgKnNldCA9IGN1ci0+dW5vZGUub3ByLm9wWzBdOworICAgICAgICBjb21taXRfbm9kZShzZXQsMCk7CisgICAgICAgIGN1ciA9IGN1ci0+dW5vZGUub3ByLm9wWzFdOworICAgICAgfQorICAgIH0gLyogfX19ICovCisKKyAgICAvKiBWQVIgTElTVCAqLworICAgIHN0YXRpYyBOb2RlVHlwZSAqbmV3X3Zhcl9saXN0KE5vZGVUeXBlICp2YXIsIE5vZGVUeXBlICpuZXh0KSAvKiB7e3sgKi8KKyAgICB7CisgICAgICBOb2RlVHlwZSAqbm9kZSA9IG5ld19vcCgidmFyX2xpc3QiLCBPUFJfVkFSX0xJU1QsIDIpOworICAgICAgbm9kZS0+dW5vZGUub3ByLm9wWzBdID0gdmFyOworICAgICAgbm9kZS0+dW5vZGUub3ByLm9wWzFdID0gbmV4dDsKKyAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBjb21taXRfdmFyX2xpc3QoTm9kZVR5cGUgKm5vZGUpCisgICAgeworICAgIH0gLyogfX19ICovCisKKyAgICAvKiBGVU5DVElPTiBDQUxMICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfY2FsbChjb25zdCBjaGFyICpuYW1lLCBOb2RlVHlwZSAqYWZmZWN0X2xpc3QpIHsgLyoge3t7ICovCisgICAgICAgIEhhc2hWYWx1ZSAqZnZhbDsKKyAgICAgICAgZnZhbCA9IGdvb21faGFzaF9nZXQoY3VycmVudEdvb21TTC0+ZnVuY3Rpb25zLCBuYW1lKTsKKyAgICAgICAgaWYgKCFmdmFsKSB7CisgICAgICAgICAgICBnc2xfZGVjbGFyZV90YXNrKG5hbWUpOworICAgICAgICAgICAgZnZhbCA9IGdvb21faGFzaF9nZXQoY3VycmVudEdvb21TTC0+ZnVuY3Rpb25zLCBuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZ2YWwpIHsKKyAgICAgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworI2lmIDAKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IExpbmUgJWQsIENvdWxkIG5vdCBmaW5kIGZ1bmN0aW9uICVzXG4iLCBjdXJyZW50R29vbVNMLT5udW1fbGluZXMsIG5hbWUpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBFeHRlcm5hbEZ1bmN0aW9uU3RydWN0ICpnZWYgPSAoRXh0ZXJuYWxGdW5jdGlvblN0cnVjdCopZnZhbC0+cHRyOworICAgICAgICAgICAgaWYgKGdlZi0+aXNfZXh0ZXJuKSB7CisgICAgICAgICAgICAgICAgTm9kZVR5cGUgKm5vZGUgPSAgbmV3X29wKG5hbWUsIE9QUl9FWFRfQ0FMTCwgMSk7CisgICAgICAgICAgICAgICAgbm9kZS0+dW5vZGUub3ByLm9wWzBdID0gYWZmZWN0X2xpc3Q7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBOb2RlVHlwZSAqbm9kZTsKKyAgICAgICAgICAgICAgICBjaGFyIHN0bXBbMjU2XTsKKyAgICAgICAgICAgICAgICBpZiAoc3RybGVuKG5hbWUpIDwgMjAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RtcCwgInxfX2Z1bmNfJXN8IiwgbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vZGUgPSBuZXdfb3Aoc3RtcCwgT1BSX0NBTEwsIDEpOworICAgICAgICAgICAgICAgIG5vZGUtPnVub2RlLm9wci5vcFswXSA9IGFmZmVjdF9saXN0OworICAgICAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHN0YXRpYyB2b2lkIGNvbW1pdF9leHRfY2FsbChOb2RlVHlwZSAqbm9kZSkgeworICAgICAgICBOb2RlVHlwZSAqYWxhZnRlciA9IG5ld19hZmZlY3RfbGlzdF9hZnRlcihub2RlLT51bm9kZS5vcHIub3BbMF0pOworICAgICAgICBjb21taXRfbm9kZShub2RlLT51bm9kZS5vcHIub3BbMF0sMCk7CisgICAgICAgIGN1cnJlbnRHb29tU0wtPmluc3RyID0gZ3NsX2luc3RyX2luaXQoY3VycmVudEdvb21TTCwgImV4dGNhbGwiLCBJTlNUUl9FWFRfQ0FMTCwgMSwgbm9kZS0+bGluZV9udW1iZXIpOworICAgICAgICBnc2xfaW5zdHJfYWRkX3BhcmFtKGN1cnJlbnRHb29tU0wtPmluc3RyLCBub2RlLT5zdHIsIFRZUEVfVkFSKTsKKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIHByaW50ZigiZXh0Y2FsbCAlc1xuIiwgbm9kZS0+c3RyKTsKKyNlbmRpZgorICAgICAgICBjb21taXRfbm9kZShhbGFmdGVyLDApOworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBjb21taXRfY2FsbChOb2RlVHlwZSAqbm9kZSkgeworICAgICAgICBOb2RlVHlwZSAqYWxhZnRlciA9IG5ld19hZmZlY3RfbGlzdF9hZnRlcihub2RlLT51bm9kZS5vcHIub3BbMF0pOworICAgICAgICBjb21taXRfbm9kZShub2RlLT51bm9kZS5vcHIub3BbMF0sMCk7CisgICAgICAgIGN1cnJlbnRHb29tU0wtPmluc3RyID0gZ3NsX2luc3RyX2luaXQoY3VycmVudEdvb21TTCwgImNhbGwiLCBJTlNUUl9DQUxMLCAxLCBub2RlLT5saW5lX251bWJlcik7CisgICAgICAgIGdzbF9pbnN0cl9hZGRfcGFyYW0oY3VycmVudEdvb21TTC0+aW5zdHIsIG5vZGUtPnN0ciwgVFlQRV9MQUJFTCk7CisjaWZkZWYgVkVSQk9TRQorICAgICAgICBwcmludGYoImNhbGwgJXNcbiIsIG5vZGUtPnN0cik7CisjZW5kaWYKKyAgICAgICAgY29tbWl0X25vZGUoYWxhZnRlciwwKTsKKyAgICB9IC8qIH19fSAqLworCisgICAgLyoqICoqLworCisgICAgc3RhdGljIE5vZGVUeXBlICpyb290Tm9kZSA9IDA7IC8qIFRPRE86IHJlaW5pdGlhbGlzZXIgYSBjaGFxdWUgY29tcGlsYXRpb24uICovCisgICAgc3RhdGljIE5vZGVUeXBlICpsYXN0Tm9kZSA9IDA7CisgICAgc3RhdGljIE5vZGVUeXBlICpnc2xfYXBwZW5kKE5vZGVUeXBlICpjdXJOb2RlKSB7CisgICAgICAgIGlmIChjdXJOb2RlID09IDApIHJldHVybiAwOyAvKiB7e3sgKi8KKyAgICAgICAgaWYgKGxhc3ROb2RlKQorICAgICAgICAgICAgbGFzdE5vZGUtPnVub2RlLm9wci5uZXh0ID0gY3VyTm9kZTsKKyAgICAgICAgbGFzdE5vZGUgPSBjdXJOb2RlOworICAgICAgICB3aGlsZShsYXN0Tm9kZS0+dW5vZGUub3ByLm5leHQpIGxhc3ROb2RlID0gbGFzdE5vZGUtPnVub2RlLm9wci5uZXh0OworICAgICAgICBpZiAocm9vdE5vZGUgPT0gMCkKKyAgICAgICAgICAgIHJvb3ROb2RlID0gY3VyTm9kZTsKKyAgICAgICAgcmV0dXJuIGN1ck5vZGU7CisgICAgfSAvKiB9fX0gKi8KKworI2lmIDEKKyAgICBpbnQgYWxsb2NhdGVUZW1wKCkgeworICAgICAgcmV0dXJuIGFsbG9jYXRlTGFiZWwoKTsKKyAgICB9CisgICAgdm9pZCByZWxlYXNlQWxsVGVtcHMoKSB7fQorICAgIHZvaWQgcmVsZWFzZVRlbXAoaW50IG4pIHt9CisjZWxzZQorICAgIHN0YXRpYyBpbnQgbmJUZW1wID0gMDsKKyAgICBzdGF0aWMgaW50ICp0ZW1wQXJyYXkgPSAwOworICAgIHN0YXRpYyBpbnQgdGVtcEFycmF5U2l6ZSA9IDA7CisgICAgaW50IGFsbG9jYXRlVGVtcCgpIHsgLyogVE9ETzogYWxsb2NhdGVJVGVtcCwgYWxsb2NhdGVGVGVtcCAqLworICAgICAgICBpbnQgaSA9IDA7IC8qIHt7eyAqLworICAgICAgICBpZiAodGVtcEFycmF5ID09IDApIHsKKyAgICAgICAgICB0ZW1wQXJyYXlTaXplID0gMjU2OworICAgICAgICAgIHRlbXBBcnJheSA9IChpbnQqKW1hbGxvYyh0ZW1wQXJyYXlTaXplICogc2l6ZW9mKGludCkpOworICAgICAgICB9CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgaW50IGo7CisgICAgICAgICAgZm9yIChqPTA7ajxuYlRlbXA7KytqKSB7CisgICAgICAgICAgICBpZiAodGVtcEFycmF5W2pdID09IGkpIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoaiA9PSBuYlRlbXApIHsKKyAgICAgICAgICAgIGlmIChuYlRlbXAgPT0gdGVtcEFycmF5U2l6ZSkgeworICAgICAgICAgICAgICB0ZW1wQXJyYXlTaXplICo9IDI7CisgICAgICAgICAgICAgIHRlbXBBcnJheSA9IChpbnQqKXJlYWxsb2ModGVtcEFycmF5LHRlbXBBcnJheVNpemUgKiBzaXplb2YoaW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ZW1wQXJyYXlbbmJUZW1wKytdID0gaTsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgIH0KKyAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9IC8qIH19fSAqLworICAgIHZvaWQgcmVsZWFzZUFsbFRlbXBzKCkgeworICAgICAgbmJUZW1wID0gMDsgLyoge3t7ICovCisgICAgfSAvKiB9fX0gKi8KKyAgICB2b2lkIHJlbGVhc2VUZW1wKGludCBuKSB7CisgICAgICBpbnQgajsgLyoge3t7ICovCisgICAgICBmb3IgKGo9MDtqPG5iVGVtcDsrK2opIHsKKyAgICAgICAgaWYgKHRlbXBBcnJheVtqXSA9PSBuKSB7CisgICAgICAgICAgdGVtcEFycmF5W2pdID0gdGVtcEFycmF5Wy0tbmJUZW1wXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gLyogfX19ICovCisjZW5kaWYKKworICAgIHN0YXRpYyBpbnQgbGFzdExhYmVsID0gMDsKKyAgICBpbnQgYWxsb2NhdGVMYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuICsrbGFzdExhYmVsOyAvKiB7e3sgKi8KKyAgICB9IC8qIH19fSAqLworCisgICAgdm9pZCBnc2xfY29tbWl0X2NvbXBpbGF0aW9uKCkKKyAgICB7IC8qIHt7eyAqLworICAgICAgICBjb21taXRfbm9kZShyb290Tm9kZSwwKTsKKyAgICAgICAgcm9vdE5vZGUgPSAwOworICAgICAgICBsYXN0Tm9kZSA9IDA7CisgICAgfSAvKiB9fX0gKi8KKyAgICAKKyAgICB2b2lkIHByZWNvbW1pdF9ub2RlKE5vZGVUeXBlICpub2RlKQorICAgIHsgLyoge3t7ICovCisgICAgICAgIC8qIGRvIGhlcmUgc3R1ZmYgZm9yIGV4cHJlc3Npb24uLiBmb3IgZXhlbXBsZSAqLworICAgICAgICBpZiAobm9kZS0+dHlwZSA9PSBPUFJfTk9ERSkKKyAgICAgICAgICAgIHN3aXRjaChub2RlLT51bm9kZS5vcHIudHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgT1BSX0FERDogcHJlY29tbWl0X2FkZChub2RlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUFJfU1VCOiBwcmVjb21taXRfc3ViKG5vZGUpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QUl9NVUw6IHByZWNvbW1pdF9tdWwobm9kZSk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BSX0RJVjogcHJlY29tbWl0X2Rpdihub2RlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUFJfQ0FMTF9FWFBSOiBwcmVjb21taXRfY2FsbF9leHByKG5vZGUpOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICB9IC8qIH19fSAqLworICAgIAorICAgIHZvaWQgY29tbWl0X25vZGUoTm9kZVR5cGUgKm5vZGUsIGludCByZWxlYXNlSWZUbXApCisgICAgeyAvKiB7e3sgKi8KKyAgICAgICAgaWYgKG5vZGUgPT0gMCkgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgc3dpdGNoKG5vZGUtPnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgT1BSX05PREU6CisgICAgICAgICAgICAgICAgc3dpdGNoKG5vZGUtPnVub2RlLm9wci50eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BSX1NFVDogICAgICAgICAgIGNvbW1pdF9zZXQobm9kZSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE9QUl9QTFVTX0VROiAgICAgICBjb21taXRfcGx1c19lcShub2RlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BSX1NVQl9FUTogICAgICAgIGNvbW1pdF9zdWJfZXEobm9kZSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE9QUl9NVUxfRVE6ICAgICAgICBjb21taXRfbXVsX2VxKG5vZGUpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUFJfRElWX0VROiAgICAgICAgY29tbWl0X2Rpdl9lcShub2RlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BSX0lGOiAgICAgICAgICAgIGNvbW1pdF9pZihub2RlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BSX1dISUxFOiAgICAgICAgIGNvbW1pdF93aGlsZShub2RlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BSX0JMT0NLOiAgICAgICAgIGNvbW1pdF9ibG9jayhub2RlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BSX0ZVTkNfSU5UUk86ICAgIGNvbW1pdF9mdW5jdGlvbl9pbnRybyhub2RlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BSX0ZVTkNfT1VUUk86ICAgIGNvbW1pdF9mdW5jdGlvbl9vdXRybyhub2RlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BSX0NBTEw6ICAgICAgICAgIGNvbW1pdF9jYWxsKG5vZGUpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUFJfRVhUX0NBTEw6ICAgICAgY29tbWl0X2V4dF9jYWxsKG5vZGUpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUFJfRVFVOiAgICAgICAgICAgY29tbWl0X2VxdShub2RlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BSX0xPVzogICAgICAgICAgIGNvbW1pdF9sb3cobm9kZSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE9QUl9OT1Q6ICAgICAgICAgICBjb21taXRfbm90KG5vZGUpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUFJfQUZGRUNUX0xJU1Q6ICAgY29tbWl0X2FmZmVjdF9saXN0KG5vZGUpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUFJfRk9SRUFDSDogICAgICAgY29tbWl0X2ZvcmVhY2gobm9kZSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE9QUl9WQVJfTElTVDogICAgICBjb21taXRfdmFyX2xpc3Qobm9kZSk7IGJyZWFrOworI2lmZGVmIFZFUkJPU0UKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFTVBUWV9OT0RFOiAgICAgICAgcHJpbnRmKCJOT1BcbiIpOyBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbW1pdF9ub2RlKG5vZGUtPnVub2RlLm9wci5uZXh0LDApOyAvKiByZWN1cnNpdmUgZm9yIHRoZSBtb21lbnQsIG1heWJlIGJldHRlciB0byBkbyBzb21ldGhpbmcgaXRlcmF0aXZlPyAqLworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFZBUl9OT0RFOiAgICAgICAgIGdzbF9pbnN0cl9zZXRfbmFtZXNwYWNlKGN1cnJlbnRHb29tU0wtPmluc3RyLCBub2RlLT52bmFtZXNwYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NsX2luc3RyX2FkZF9wYXJhbShjdXJyZW50R29vbVNMLT5pbnN0ciwgbm9kZS0+c3RyLCBUWVBFX1ZBUik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT05TVF9JTlRfTk9ERTogICBnc2xfaW5zdHJfYWRkX3BhcmFtKGN1cnJlbnRHb29tU0wtPmluc3RyLCBub2RlLT5zdHIsIFRZUEVfSU5URUdFUik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT05TVF9GTE9BVF9OT0RFOiBnc2xfaW5zdHJfYWRkX3BhcmFtKGN1cnJlbnRHb29tU0wtPmluc3RyLCBub2RlLT5zdHIsIFRZUEVfRkxPQVQpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ09OU1RfUFRSX05PREU6ICAgZ3NsX2luc3RyX2FkZF9wYXJhbShjdXJyZW50R29vbVNMLT5pbnN0ciwgbm9kZS0+c3RyLCBUWVBFX1BUUik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChyZWxlYXNlSWZUbXAgJiYgaXNfdG1wX2V4cHIobm9kZSkpCisgICAgICAgICAgcmVsZWFzZVRlbXAoZ2V0X3RtcF9pZChub2RlKSk7CisgICAgICAgIAorICAgICAgICBub2RlRnJlZShub2RlKTsKKyAgICB9IC8qIH19fSAqLworCisgICAgTm9kZVR5cGUgKm5vZGVOZXcoY29uc3QgY2hhciAqc3RyLCBpbnQgdHlwZSwgaW50IGxpbmVfbnVtYmVyKSB7CisgICAgICAgIE5vZGVUeXBlICpub2RlID0gKE5vZGVUeXBlKiltYWxsb2Moc2l6ZW9mKE5vZGVUeXBlKSk7IC8qIHt7eyAqLworICAgICAgICBub2RlLT50eXBlID0gdHlwZTsKKyAgICAgICAgbm9kZS0+c3RyICA9IChjaGFyKiltYWxsb2Moc3RybGVuKHN0cikrMSk7CisgICAgICAgIG5vZGUtPnZuYW1lc3BhY2UgPSBOVUxMOworICAgICAgICBub2RlLT5saW5lX251bWJlciA9IGxpbmVfbnVtYmVyOworICAgICAgICBzdHJjcHkobm9kZS0+c3RyLCBzdHIpOworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9IC8qIH19fSAqLworICAgIHN0YXRpYyBOb2RlVHlwZSAqbm9kZUNsb25lKE5vZGVUeXBlICpub2RlKSB7CisgICAgICAgIE5vZGVUeXBlICpyZXQgPSBub2RlTmV3KG5vZGUtPnN0ciwgbm9kZS0+dHlwZSwgbm9kZS0+bGluZV9udW1iZXIpOyAvKiB7e3sgKi8KKyAgICAgICAgcmV0LT52bmFtZXNwYWNlID0gbm9kZS0+dm5hbWVzcGFjZTsKKyAgICAgICAgcmV0LT51bm9kZSA9IG5vZGUtPnVub2RlOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0gLyogfX19ICovCisKKyAgICB2b2lkIG5vZGVGcmVlSW50ZXJuYWxzKE5vZGVUeXBlICpub2RlKSB7CisgICAgICAgIGZyZWUobm9kZS0+c3RyKTsgLyoge3t7ICovCisgICAgfSAvKiB9fX0gKi8KKyAgICAKKyAgICB2b2lkIG5vZGVGcmVlKE5vZGVUeXBlICpub2RlKSB7CisgICAgICAgIG5vZGVGcmVlSW50ZXJuYWxzKG5vZGUpOyAvKiB7e3sgKi8KKyAgICAgICAgZnJlZShub2RlKTsKKyAgICB9IC8qIH19fSAqLworCisgICAgTm9kZVR5cGUgKm5ld19jb25zdEludChjb25zdCBjaGFyICpzdHIsIGludCBsaW5lX251bWJlcikgeworICAgICAgICBOb2RlVHlwZSAqbm9kZSA9IG5vZGVOZXcoc3RyLCBDT05TVF9JTlRfTk9ERSwgbGluZV9udW1iZXIpOyAvKiB7e3sgKi8KKyAgICAgICAgbm9kZS0+dW5vZGUuY29uc3RJbnQudmFsID0gYXRvaShzdHIpOworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9IC8qIH19fSAqLworCisgICAgTm9kZVR5cGUgKm5ld19jb25zdFB0cihjb25zdCBjaGFyICpzdHIsIGludCBsaW5lX251bWJlcikgeworICAgICAgICBOb2RlVHlwZSAqbm9kZSA9IG5vZGVOZXcoc3RyLCBDT05TVF9QVFJfTk9ERSwgbGluZV9udW1iZXIpOyAvKiB7e3sgKi8KKyAgICAgICAgbm9kZS0+dW5vZGUuY29uc3RQdHIuaWQgPSBzdHJ0b2woc3RyLE5VTEwsMCk7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0gLyogfX19ICovCisKKyAgICBOb2RlVHlwZSAqbmV3X2NvbnN0RmxvYXQoY29uc3QgY2hhciAqc3RyLCBpbnQgbGluZV9udW1iZXIpIHsKKyAgICAgICAgTm9kZVR5cGUgKm5vZGUgPSBub2RlTmV3KHN0ciwgQ09OU1RfRkxPQVRfTk9ERSwgbGluZV9udW1iZXIpOyAvKiB7e3sgKi8KKyAgICAgICAgbm9kZS0+dW5vZGUuY29uc3RGbG9hdC52YWwgPSBhdG9mKHN0cik7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0gLyogfX19ICovCisKKyAgICBOb2RlVHlwZSAqbmV3X3Zhcihjb25zdCBjaGFyICpzdHIsIGludCBsaW5lX251bWJlcikgeworICAgICAgICBOb2RlVHlwZSAqbm9kZSA9IG5vZGVOZXcoc3RyLCBWQVJfTk9ERSwgbGluZV9udW1iZXIpOyAvKiB7e3sgKi8KKyAgICAgICAgbm9kZS0+dm5hbWVzcGFjZSA9IGdzbF9maW5kX25hbWVzcGFjZShzdHIpOworICAgICAgICBpZiAobm9kZS0+dm5hbWVzcGFjZSA9PSAwKSB7CisgICAgICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyNpZiAwCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBMaW5lICVkLCBWYXJpYWJsZSBub3QgZm91bmQ6ICclcydcbiIsIGxpbmVfbnVtYmVyLCBzdHIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0gLyogfX19ICovCisgICAgCisgICAgTm9kZVR5cGUgKm5ld19ub3AoY29uc3QgY2hhciAqc3RyKSB7CisgICAgICAgIE5vZGVUeXBlICpub2RlID0gbmV3X29wKHN0ciwgRU1QVFlfTk9ERSwgMCk7IC8qIHt7eyAqLworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9IC8qIH19fSAqLworICAgIAorICAgIE5vZGVUeXBlICpuZXdfb3AoY29uc3QgY2hhciAqc3RyLCBpbnQgdHlwZSwgaW50IG5iT3ApIHsKKyAgICAgICAgaW50IGk7IC8qIHt7eyAqLworICAgICAgICBOb2RlVHlwZSAqbm9kZSA9IG5vZGVOZXcoc3RyLCBPUFJfTk9ERSwgY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKTsKKyAgICAgICAgbm9kZS0+dW5vZGUub3ByLm5leHQgPSAwOworICAgICAgICBub2RlLT51bm9kZS5vcHIudHlwZSA9IHR5cGU7CisgICAgICAgIG5vZGUtPnVub2RlLm9wci5uYk9wID0gbmJPcDsKKyAgICAgICAgZm9yIChpPTA7aTxuYk9wOysraSkgbm9kZS0+dW5vZGUub3ByLm9wW2ldID0gMDsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfSAvKiB9fX0gKi8KKworCisgICAgdm9pZCBnc2xfZGVjbGFyZV9nbG9iYWxfdmFyaWFibGUoaW50IHR5cGUsIGNoYXIgKm5hbWUpIHsKKyAgICAgIHN3aXRjaCh0eXBlKXsKKyAgICAgICAgY2FzZSAtMTogYnJlYWs7CisgICAgICAgIGNhc2UgRkxPQVRfVEs6Z3NsX2Zsb2F0X2RlY2xfZ2xvYmFsKG5hbWUpO2JyZWFrOworICAgICAgICBjYXNlIElOVF9USzogIGdzbF9pbnRfZGVjbF9nbG9iYWwobmFtZSk7YnJlYWs7CisgICAgICAgIGNhc2UgUFRSX1RLOiAgZ3NsX3B0cl9kZWNsX2dsb2JhbChuYW1lKTticmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgIGludCBpZCA9IHR5cGUgLSAxMDAwOworICAgICAgICAgIGdzbF9zdHJ1Y3RfZGVjbF9nbG9iYWxfZnJvbV9pZChuYW1lLGlkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworJX0KKworJXVuaW9uIHsKKyAgICBpbnQgaW50VmFsdWU7CisgICAgZmxvYXQgZmxvYXRWYWx1ZTsKKyAgICBjaGFyIGNoYXJWYWx1ZTsKKyAgICBjaGFyIHN0clZhbHVlWzIwNDhdOworICAgIE5vZGVUeXBlICpuUHRyOworICAgIEdvb21IYXNoICpuYW1lc3BhY2U7CisgICAgR1NMX1N0cnVjdCAqZ3NsX3N0cnVjdDsKKyAgICBHU0xfU3RydWN0RmllbGQgKmdzbF9zdHJ1Y3RfZmllbGQ7CisgIH07CisgIAorJXRva2VuIDxzdHJWYWx1ZT4gICBMVFlQRV9JTlRFR0VSCisldG9rZW4gPHN0clZhbHVlPiAgIExUWVBFX0ZMT0FUCisldG9rZW4gPHN0clZhbHVlPiAgIExUWVBFX1ZBUgorJXRva2VuIDxzdHJWYWx1ZT4gICBMVFlQRV9QVFIKKworJXRva2VuIFBUUl9USyBJTlRfVEsgRkxPQVRfVEsgREVDTEFSRSBFWFRFUk5BTCBXSElMRSBETyBOT1QgUExVU19FUSBTVUJfRVEgRElWX0VRIE1VTF9FUSBTVVBfRVEgTE9XX0VRIE5PVF9FUSBTVFJVQ1QgRk9SIElOCisKKyV0eXBlIDxpbnRWYWx1ZT4gcmV0dXJuX3R5cGUKKyV0eXBlIDxuUHRyPiBleHByZXNzaW9uIGNvbnN0VmFsdWUgaW5zdHJ1Y3Rpb24gdGVzdCBmdW5jX2NhbGwgZnVuY19jYWxsX2V4cHJlc3Npb24KKyV0eXBlIDxuUHRyPiBzdGFydF9ibG9jayBhZmZlY3RhdGlvbl9saXN0IGFmZmVjdGF0aW9uX2luX2xpc3QgYWZmZWN0YXRpb24gZGVjbGFyYXRpb24KKyV0eXBlIDxuUHRyPiB2YXJfbGlzdF9jb250ZW50IHZhcl9saXN0CisldHlwZSA8c3RyVmFsdWU+IHRhc2tfbmFtZSBleHRfdGFza19uYW1lIAorJXR5cGUgPG5hbWVzcGFjZT4gbGVhdmVfbmFtZXNwYWNlCisldHlwZSA8Z3NsX3N0cnVjdD4gc3RydWN0X21lbWJlcnMKKyV0eXBlIDxnc2xfc3RydWN0X2ZpZWxkPiBzdHJ1Y3RfbWVtYmVyCislbGVmdCAnXG4nCislbGVmdCBQTFVTX0VRIFNVQl9FUSBNVUxfRVEgRElWX0VRCislbGVmdCBOT1QKKyVsZWZ0ICc9JyAnPCcgJz4nCislbGVmdCAnKycgJy0nCislbGVmdCAnLycgJyonCisKKyUlCisKKy8qIC0tLS0tLS0tLS0tLS0tIEdsb2JhbCBhcmNoaXRlY2h0dXJlIG9mIGEgR1NMIHByb2dyYW0gLS0tLS0tLS0tLS0tKi8KKworZ3NsOiBnc2xfY29kZSBmdW5jdGlvbl9vdXRybyBnc2xfZGVmX2Z1bmN0aW9ucyA7CisKK2dzbF9jb2RlOiBnc2xfY29kZSBpbnN0cnVjdGlvbiAgICAgICAgICAgICAgeyBnc2xfYXBwZW5kKCQyKTsgfQorICAgfCBnc2xfY29kZSBFWFRFUk5BTCAnPCcgZXh0X3Rhc2tfbmFtZSAnPicgcmV0dXJuX3R5cGUgJ1xuJyBsZWF2ZV9uYW1lc3BhY2UgICAgICAgICAgICAgeyBnc2xfZGVjbGFyZV9nbG9iYWxfdmFyaWFibGUoJDYsJDQpOyB9CisgICB8IGdzbF9jb2RlIEVYVEVSTkFMICc8JyBleHRfdGFza19uYW1lICc6JyBhcmdsaXN0ICc+JyByZXR1cm5fdHlwZSAnXG4nIGxlYXZlX25hbWVzcGFjZSB7IGdzbF9kZWNsYXJlX2dsb2JhbF92YXJpYWJsZSgkOCwkNCk7IH0KKyAgIHwgZ3NsX2NvZGUgREVDTEFSRSAnPCcgdGFza19uYW1lICc+JyByZXR1cm5fdHlwZSAgJ1xuJyBsZWF2ZV9uYW1lc3BhY2UgICAgICAgICAgICAgICAgIHsgZ3NsX2RlY2xhcmVfZ2xvYmFsX3ZhcmlhYmxlKCQ2LCQ0KTsgfQorICAgfCBnc2xfY29kZSBERUNMQVJFICc8JyB0YXNrX25hbWUgJzonIGFyZ2xpc3QgJz4nIHJldHVybl90eXBlICdcbicgbGVhdmVfbmFtZXNwYWNlICAgICAgeyBnc2xfZGVjbGFyZV9nbG9iYWxfdmFyaWFibGUoJDgsJDQpOyB9CisgICB8IGdzbF9jb2RlIHN0cnVjdF9kZWNsYXJhdGlvbgorICAgfCBnc2xfY29kZSAnXG4nCisgICB8CisgICA7CisKKy8qIC0tLS0tLS0tLS0tLS0gRGVjbGFyYXRpb24gb2YgYSBzdHJ1Y3R1cmUgLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdF9kZWNsYXJhdGlvbjogU1RSVUNUICAnPCcgTFRZUEVfVkFSICAnOicgc3RydWN0X21lbWJlcnMgJz4nICdcbicgeyBnc2xfYWRkX3N0cnVjdCgkMywgJDUpOyB9CisgICAgICAgICAgICAgICAgICA7CisKK3N0cnVjdF9tZW1iZXJzOiBvcHRfbmwgc3RydWN0X21lbWJlciAgICAgICAgICAgICAgICAgICAgeyAkJCA9IGdzbF9uZXdfc3RydWN0KCQyKTsgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHwgc3RydWN0X21lbWJlcnMgJywnIG9wdF9ubCBzdHJ1Y3RfbWVtYmVyIHsgJCQgPSAkMTsgZ3NsX2FkZF9zdHJ1Y3RfZmllbGQoJDEsICQ0KTsgfQorICAgICAgICAgICAgICA7CisKK3N0cnVjdF9tZW1iZXI6IElOVF9USyAgICBMVFlQRV9WQVIgeyAkJCA9IGdzbF9uZXdfc3RydWN0X2ZpZWxkKCQyLCBJTlNUUl9JTlQpOyB9CisgICAgICAgICAgICAgfCBGTE9BVF9USyAgTFRZUEVfVkFSIHsgJCQgPSBnc2xfbmV3X3N0cnVjdF9maWVsZCgkMiwgSU5TVFJfRkxPQVQpOyB9CisgICAgICAgICAgICAgfCBQVFJfVEsgICAgTFRZUEVfVkFSIHsgJCQgPSBnc2xfbmV3X3N0cnVjdF9maWVsZCgkMiwgSU5TVFJfUFRSKTsgfQorICAgICAgICAgICAgIHwgTFRZUEVfVkFSIExUWVBFX1ZBUiB7ICQkID0gZ3NsX25ld19zdHJ1Y3RfZmllbGRfc3RydWN0KCQyLCAkMSk7IH0KKyAgICAgICAgICAgICA7CisKKy8qIC0tLS0tLS0tLS0tLS0gRm9uY3Rpb24gZGVjbGFyYXRpb25zIC0tLS0tLS0tLS0tLS0tICovCisKK2V4dF90YXNrX25hbWU6IExUWVBFX1ZBUiB7IGdzbF9kZWNsYXJlX2V4dGVybmFsX3Rhc2soJDEpOyBnc2xfZW50ZXJuYW1lc3BhY2UoJDEpOyBzdHJjcHkoJCQsJDEpOyB9CisgICAgICAgICAgICAgOwordGFza19uYW1lOiAgICAgTFRZUEVfVkFSIHsgZ3NsX2RlY2xhcmVfdGFzaygkMSk7IGdzbF9lbnRlcm5hbWVzcGFjZSgkMSk7IHN0cmNweSgkJCwkMSk7IHN0cmNweSgkJCwkMSk7IH0KKyAgICAgICAgIDsKKworcmV0dXJuX3R5cGU6ICAgICAgeyAkJD0tMTsgfQorICB8ICc6JyBJTlRfVEsgICAgeyAkJD1JTlRfVEs7IH0KKyAgfCAnOicgRkxPQVRfVEsgIHsgJCQ9RkxPQVRfVEs7IH0KKyAgfCAnOicgUFRSX1RLICAgIHsgJCQ9UFRSX1RLOyB9CisgIHwgJzonIExUWVBFX1ZBUiB7ICQkPSAxMDAwICsgZ3NsX2dldF9zdHJ1Y3RfaWQoJDIpOyB9CisgIDsKKworYXJnbGlzdDogZW1wdHlfZGVjbGFyYXRpb24KKyAgICAgICB8IGVtcHR5X2RlY2xhcmF0aW9uICcsJyBhcmdsaXN0CisgICAgICAgOworCisvKiAtLS0tLS0tLS0tLS0tIEZvbmN0aW9uIGRlZmluaXRpb24gLS0tLS0tLS0tLS0tLS0gKi8KKworZ3NsX2RlZl9mdW5jdGlvbnM6IGdzbF9kZWZfZnVuY3Rpb25zIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgOworCitmdW5jdGlvbjogZnVuY3Rpb25faW50cm8gZ3NsX2NvZGUgZnVuY3Rpb25fb3V0cm8geyBnc2xfbGVhdmVuYW1lc3BhY2UoKTsgfQorCitmdW5jdGlvbl9pbnRybzogJzwnIHRhc2tfbmFtZSAnPicgcmV0dXJuX3R5cGUgJ1xuJyAgICAgICAgICAgICB7IGdzbF9hcHBlbmQobmV3X2Z1bmN0aW9uX2ludHJvKCQyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzbF9kZWNsYXJlX2dsb2JhbF92YXJpYWJsZSgkNCwkMik7IH0KKyAgICAgICAgICAgICAgfCAnPCcgdGFza19uYW1lICc6JyBhcmdsaXN0ICc+JyByZXR1cm5fdHlwZSAnXG4nIHsgZ3NsX2FwcGVuZChuZXdfZnVuY3Rpb25faW50cm8oJDIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NsX2RlY2xhcmVfZ2xvYmFsX3ZhcmlhYmxlKCQ2LCQyKTsgfQorICAgICAgICAgICAgICA7CitmdW5jdGlvbl9vdXRybzogeyBnc2xfYXBwZW5kKG5ld19mdW5jdGlvbl9vdXRybygpKTsgfSA7CisKK2xlYXZlX25hbWVzcGFjZTogICAgICB7ICQkID0gZ3NsX2xlYXZlbmFtZXNwYWNlKCk7ICAgfTsKKworLyogLS0tLS0tLS0tLS0tIFZhcmlhYmxlIGRlY2xhcmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0gKi8KKworZGVjbGFyYXRpb246IEZMT0FUX1RLIExUWVBFX1ZBUiAnPScgZXhwcmVzc2lvbiB7IGdzbF9mbG9hdF9kZWNsX2xvY2FsKCQyKTsgJCQgPSBuZXdfc2V0KG5ld192YXIoJDIsY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKSwgJDQpOyB9CisgICAgICAgICAgIHwgSU5UX1RLICAgTFRZUEVfVkFSICc9JyBleHByZXNzaW9uIHsgZ3NsX2ludF9kZWNsX2xvY2FsKCQyKTsgICAkJCA9IG5ld19zZXQobmV3X3ZhcigkMixjdXJyZW50R29vbVNMLT5udW1fbGluZXMpLCAkNCk7IH0KKyAgICAgICAgICAgfCBQVFJfVEsgICBMVFlQRV9WQVIgJz0nIGV4cHJlc3Npb24geyBnc2xfcHRyX2RlY2xfbG9jYWwoJDIpOyAgICQkID0gbmV3X3NldChuZXdfdmFyKCQyLGN1cnJlbnRHb29tU0wtPm51bV9saW5lcyksICQ0KTsgfQorICAgICAgICAgICB8IExUWVBFX1ZBUiBMVFlQRV9WQVIgJz0nIGV4cHJlc3Npb24geyBnc2xfc3RydWN0X2RlY2xfbG9jYWwoJDEsJDIpOyAkJCA9IG5ld19zZXQobmV3X3ZhcigkMixjdXJyZW50R29vbVNMLT5udW1fbGluZXMpLCAkNCk7IH0KKyAgICAgICAgICAgfCBlbXB0eV9kZWNsYXJhdGlvbiAgICAgICAgICAgICAgICB7ICQkID0gMDsgfQorICAgICAgICAgICA7CisKK2VtcHR5X2RlY2xhcmF0aW9uOiBGTE9BVF9USyAgTFRZUEVfVkFSIHsgZ3NsX2Zsb2F0X2RlY2xfbG9jYWwoJDIpOyAgICAgICB9CisgICAgICAgICAgICAgICAgIHwgSU5UX1RLICAgIExUWVBFX1ZBUiB7IGdzbF9pbnRfZGVjbF9sb2NhbCgkMik7ICAgICAgICAgfQorICAgICAgICAgICAgICAgICB8IFBUUl9USyAgICBMVFlQRV9WQVIgeyBnc2xfcHRyX2RlY2xfbG9jYWwoJDIpOyAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgfCBMVFlQRV9WQVIgTFRZUEVfVkFSIHsgZ3NsX3N0cnVjdF9kZWNsX2xvY2FsKCQxLCQyKTsgICB9CisgICAgICAgICAgICAgICAgIDsKKworLyogLS0tLS0tLS0tLS0tLS0gSW5zdHJ1Y3Rpb25zIGFuZCBFeHByZXNzaW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW5zdHJ1Y3Rpb246IGFmZmVjdGF0aW9uICdcbicgeyAkJCA9ICQxOyB9CisgICAgICAgICAgIHwgZGVjbGFyYXRpb24gJ1xuJyB7ICQkID0gJDE7IH0KKyAgICAgICAgICAgfCAnKCcgdGVzdCAnKScgJz8nIG9wdF9ubCBpbnN0cnVjdGlvbiAgICAgeyAkJCA9IG5ld19pZigkMiwkNik7IH0KKyAgICAgICAgICAgfCBXSElMRSB0ZXN0IG9wdF9ubCBETyBvcHRfbmwgaW5zdHJ1Y3Rpb24geyAkJCA9IG5ld193aGlsZSgkMiwkNik7IH0KKyAgICAgICAgICAgfCAneycgJ1xuJyBzdGFydF9ibG9jayBnc2xfY29kZSAnfScgJ1xuJyAgeyBsYXN0Tm9kZSA9ICQzLT51bm9kZS5vcHIub3BbMV07ICQkPSQzOyB9CisgICAgICAgICAgIHwgZnVuY19jYWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgJCQgPSAkMTsgfQorICAgICAgICAgICB8IExUWVBFX1ZBUiBQTFVTX0VRIGV4cHJlc3Npb24geyAkJCA9IG5ld19wbHVzX2VxKG5ld192YXIoJDEsY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKSwkMyk7IH0KKyAgICAgICAgICAgfCBMVFlQRV9WQVIgU1VCX0VRIGV4cHJlc3Npb24gIHsgJCQgPSBuZXdfc3ViX2VxKG5ld192YXIoJDEsY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKSwkMyk7IH0KKyAgICAgICAgICAgfCBMVFlQRV9WQVIgTVVMX0VRIGV4cHJlc3Npb24gIHsgJCQgPSBuZXdfbXVsX2VxKG5ld192YXIoJDEsY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKSwkMyk7IH0KKyAgICAgICAgICAgfCBMVFlQRV9WQVIgRElWX0VRIGV4cHJlc3Npb24gIHsgJCQgPSBuZXdfZGl2X2VxKG5ld192YXIoJDEsY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKSwkMyk7IH0KKyAgICAgICAgICAgfCBGT1IgTFRZUEVfVkFSIElOIHZhcl9saXN0IERPIGluc3RydWN0aW9uIHsgJCQgPSBuZXdfc3RhdGljX2ZvcmVhY2gobmV3X3ZhcigkMiwgY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKSwgJDQsICQ2KTsgfQorICAgICAgICAgICA7CisKK3Zhcl9saXN0OiAnKCcgdmFyX2xpc3RfY29udGVudCAnKScgICAgICB7ICQkID0gJDI7IH0KKyAgICAgICAgOwordmFyX2xpc3RfY29udGVudDogTFRZUEVfVkFSICAgICAgICAgICAgIHsgJCQgPSBuZXdfdmFyX2xpc3QobmV3X3ZhcigkMSxjdXJyZW50R29vbVNMLT5udW1fbGluZXMpLCBOVUxMKTsgfQorICAgICAgICAgICB8IExUWVBFX1ZBUiB2YXJfbGlzdF9jb250ZW50IHsgJCQgPSBuZXdfdmFyX2xpc3QobmV3X3ZhcigkMSxjdXJyZW50R29vbVNMLT5udW1fbGluZXMpLCAkMik7ICAgfQorICAgICAgICAgICA7CisKK2FmZmVjdGF0aW9uOiBMVFlQRV9WQVIgJz0nIGV4cHJlc3Npb24geyAkJCA9IG5ld19zZXQobmV3X3ZhcigkMSxjdXJyZW50R29vbVNMLT5udW1fbGluZXMpLCQzKTsgfSA7CisKK3N0YXJ0X2Jsb2NrOiB7ICQkID0gbmV3X2Jsb2NrKGxhc3ROb2RlKTsgbGFzdE5vZGUgPSAkJC0+dW5vZGUub3ByLm9wWzBdOyB9CisgICAgICAgICAgIDsKKworZXhwcmVzc2lvbjogTFRZUEVfVkFSICAgeyAkJCA9IG5ld192YXIoJDEsY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKTsgfQorICAgICAgICAgIHwgY29uc3RWYWx1ZSAgeyAkJCA9ICQxOyB9CisgICAgICAgICAgfCBleHByZXNzaW9uICcqJyBleHByZXNzaW9uIHsgJCQgPSBuZXdfbXVsKCQxLCQzKTsgfSAKKyAgICAgICAgICB8IGV4cHJlc3Npb24gJy8nIGV4cHJlc3Npb24geyAkJCA9IG5ld19kaXYoJDEsJDMpOyB9IAorICAgICAgICAgIHwgZXhwcmVzc2lvbiAnKycgZXhwcmVzc2lvbiB7ICQkID0gbmV3X2FkZCgkMSwkMyk7IH0gCisgICAgICAgICAgfCBleHByZXNzaW9uICctJyBleHByZXNzaW9uIHsgJCQgPSBuZXdfc3ViKCQxLCQzKTsgfSAKKyAgICAgICAgICB8ICctJyBleHByZXNzaW9uICAgICAgICAgICAgeyAkJCA9IG5ld19uZWcoJDIpOyAgICB9CisgICAgICAgICAgfCAnKCcgZXhwcmVzc2lvbiAnKScgICAgICAgIHsgJCQgPSAkMjsgfQorICAgICAgICAgIHwgZnVuY19jYWxsX2V4cHJlc3Npb24gICAgICB7ICQkID0gJDE7IH0KKyAgICAgICAgICA7CisKK3Rlc3Q6IGV4cHJlc3Npb24gJz0nIGV4cHJlc3Npb24geyAkJCA9IG5ld19lcXUoJDEsJDMpOyB9IAorICAgIHwgZXhwcmVzc2lvbiAnPCcgZXhwcmVzc2lvbiB7ICQkID0gbmV3X2xvdygkMSwkMyk7IH0gCisgICAgfCBleHByZXNzaW9uICc+JyBleHByZXNzaW9uIHsgJCQgPSBuZXdfbG93KCQzLCQxKTsgfQorICAgIHwgZXhwcmVzc2lvbiBTVVBfRVEgZXhwcmVzc2lvbiB7ICQkID0gbmV3X25vdChuZXdfbG93KCQxLCQzKSk7IH0KKyAgICB8IGV4cHJlc3Npb24gTE9XX0VRIGV4cHJlc3Npb24geyAkJCA9IG5ld19ub3QobmV3X2xvdygkMywkMSkpOyB9CisgICAgfCBleHByZXNzaW9uIE5PVF9FUSBleHByZXNzaW9uIHsgJCQgPSBuZXdfbm90KG5ld19lcXUoJDEsJDMpKTsgfQorICAgIHwgTk9UIHRlc3QgICAgICAgICAgICAgICAgICB7ICQkID0gbmV3X25vdCgkMik7ICAgIH0KKyAgICA7CisKK2NvbnN0VmFsdWU6IExUWVBFX0ZMT0FUICAgeyAkJCA9IG5ld19jb25zdEZsb2F0KCQxLGN1cnJlbnRHb29tU0wtPm51bV9saW5lcyk7IH0KKyAgICAgICAgICB8IExUWVBFX0lOVEVHRVIgeyAkJCA9IG5ld19jb25zdEludCgkMSxjdXJyZW50R29vbVNMLT5udW1fbGluZXMpOyB9IAorICAgICAgICAgIHwgTFRZUEVfUFRSICAgICB7ICQkID0gbmV3X2NvbnN0UHRyKCQxLGN1cnJlbnRHb29tU0wtPm51bV9saW5lcyk7IH0gCisgICAgICAgICAgOworCisvKiAtLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIENhbGxzIC0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitmdW5jX2NhbGw6ICAgdGFza19uYW1lICdcbicgbGVhdmVfbmFtZXNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICB7ICQkID0gbmV3X2NhbGwoJDEsTlVMTCk7IH0KKyAgICAgICAgICAgfCB0YXNrX25hbWUgJzonIGFmZmVjdGF0aW9uX2xpc3QgJ1xuJyBsZWF2ZV9uYW1lc3BhY2UgICAgICAgICB7ICQkID0gbmV3X2NhbGwoJDEsJDMpOyB9CisgICAgICAgICAgIHwgJ1snIHRhc2tfbmFtZSAnXScgJ1xuJyBsZWF2ZV9uYW1lc3BhY2UgICAgICAgICAgICAgICAgICB7ICQkID0gbmV3X2NhbGwoJDIsTlVMTCk7IH0KKyAgICAgICAgICAgfCAnWycgdGFza19uYW1lICc6JyBhZmZlY3RhdGlvbl9saXN0ICddJyAnXG4nIGxlYXZlX25hbWVzcGFjZSB7ICQkID0gbmV3X2NhbGwoJDIsJDQpOyB9CisgICAgICAgICAgIDsKKworZnVuY19jYWxsX2V4cHJlc3Npb246CisgICAgICAgICAgICAnWycgdGFza19uYW1lIGxlYXZlX25hbWVzcGFjZSAnXScgICAgICAgICAgICAgICAgICAgICAgeyAkJCA9IG5ld19jYWxsX2V4cHIoJDIsTlVMTCk7IH0KKyAgICAgICAgICB8ICdbJyB0YXNrX25hbWUgJzonIGFmZmVjdGF0aW9uX2xpc3QgJ10nIGxlYXZlX25hbWVzcGFjZSB7ICQkID0gbmV3X2NhbGxfZXhwcigkMiwkNCk7IH0KKyAgICAgICAgICA7CisgICAgICAgICAgICAgCithZmZlY3RhdGlvbl9saXN0OiBhZmZlY3RhdGlvbl9pbl9saXN0IGFmZmVjdGF0aW9uX2xpc3QgICAgIHsgJCQgPSBuZXdfYWZmZWNfbGlzdCgkMSwkMik7ICAgfQorICAgICAgICAgICAgfCBhZmZlY3RhdGlvbl9pbl9saXN0ICAgICAgICAgICAgICAgICAgICAgICAgICB7ICQkID0gbmV3X2FmZmVjX2xpc3QoJDEsTlVMTCk7IH0KKworYWZmZWN0YXRpb25faW5fbGlzdDogTFRZUEVfVkFSICc9JyBsZWF2ZV9uYW1lc3BhY2UgZXhwcmVzc2lvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc2xfcmVlbnRlcm5hbWVzcGFjZSgkMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkJCA9IG5ld19zZXQobmV3X3ZhcigkMSxjdXJyZW50R29vbVNMLT5udW1fbGluZXMpLCQ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgfCAnOicgbGVhdmVfbmFtZXNwYWNlIGV4cHJlc3Npb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NsX3JlZW50ZXJuYW1lc3BhY2UoJDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCQgPSBuZXdfc2V0KG5ld192YXIoIiZ0aGlzIiwgY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKSwkMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIDsKKworCisvKiAtLS0tLS0tLS0tLS0gTWlzYyAtLS0tLS0tLS0tICovCisKK29wdF9ubDogJ1xuJyB8IDsKKyAgICAgICAgICAgCisKKyUlCisKKwordm9pZCB5eWVycm9yKGNoYXIgKnN0cikKK3sgLyoge3t7ICovCisgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisjaWYgMAorICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IExpbmUgJWQsICVzXG4iLCBjdXJyZW50R29vbVNMLT5udW1fbGluZXMsIHN0cik7CisgICAgY3VycmVudEdvb21TTC0+Y29tcGlsYXRpb25PSyA9IDA7CisgICAgZXhpdCgxKTsKKyNlbmRpZgorfSAvKiB9fX0gKi8KKwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vZ3JhcGhpYy5jIGIvZ3N0L2dvb20vZ3JhcGhpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMzA0NDgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9ncmFwaGljLmMKQEAgLTAsMCArMSwyOCBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgImdvb21fZ3JhcGhpYy5oIgorCitjb25zdCBDb2xvciBCTEFDSyA9IHsgMCwgMCwgMCB9OworY29uc3QgQ29sb3IgV0hJVEUgPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKK2NvbnN0IENvbG9yIFJFRCA9IHsgMHhmZiwgMHgwNSwgMHgwNSB9OworY29uc3QgQ29sb3IgR1JFRU4gPSB7IDB4MDUsIDB4ZmYsIDB4MDUgfTsKK2NvbnN0IENvbG9yIEJMVUUgPSB7IDB4MDUsIDB4MDUsIDB4ZmYgfTsKK2NvbnN0IENvbG9yIFlFTExPVyA9IHsgMHhmZiwgMHhmZiwgMHgzMyB9OworY29uc3QgQ29sb3IgT1JBTkdFID0geyAweGZmLCAweGNjLCAweDA1IH07Citjb25zdCBDb2xvciBWSU9MRVQgPSB7IDB4NTUsIDB4MDUsIDB4ZmYgfTsKZGlmZiAtLWdpdCBhL2dzdC9nb29tL2dzdGdvb20uYyBiL2dzdC9nb29tL2dzdGdvb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmJlOTQxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vZ3N0Z29vbS5jCkBAIC0wLDAgKzEsMjEwIEBACisvKiBnc3Rnb29tLmM6IGltcGxlbWVudGF0aW9uIG9mIGdvb20gZHJhd2luZyBlbGVtZW50CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAxPiBSaWNoYXJkIEJvdWx0b24gPHJpY2hhcmRAdGFydGFydXMub3JnPgorICogICAgICAgICAgIChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbSBhdCBmbHVlbmRvIGRvdCBjb20+CisgKiAgICAgICAgICAgKEMpIDwyMDExPiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnMgYXQgZ21haWwgZG90IGNvbT4KKyAqICAgICAgICAgICAoQykgPDIwMTU+IEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNAZGViZXRoZW5jb3VydC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtZ29vbQorICogQHNlZV9hbHNvOiBzeW5hZXN0aGVzaWEKKyAqCisgKiBHb29tIGlzIGFuIGF1ZGlvIHZpc3VhbGlzYXRpb24gZWxlbWVudC4gSXQgY3JlYXRlcyB3YXJwaW5nIHN0cnVjdHVyZXMKKyAqIGJhc2VkIG9uIHRoZSBpbmNvbWluZyBhdWRpbyBzaWduYWwuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyAhIGdvb20gISB2aWRlb2NvbnZlcnQgISB4dmltYWdlc2luaworICogXXwKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0Z29vbS5oIgorI2luY2x1ZGUgImdvb20uaCIKKworI2lmIEhBVkVfT1JDCisjaW5jbHVkZSA8b3JjL29yYy5oPgorI2VuZGlmCisKK0dTVF9ERUJVR19DQVRFR09SWSAoZ29vbV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnb29tX2RlYnVnCisKKyNkZWZpbmUgREVGQVVMVF9XSURUSCAgMzIwCisjZGVmaW5lIERFRkFVTFRfSEVJR0hUIDI0MAorCisvKiBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKK2VudW0KK3sKKyAgQVJHXzAKKyAgICAgIC8qIEZJTEwgTUUgKi8KK307CisKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19CSUdfRU5ESUFOCisjZGVmaW5lIFJHQl9PUkRFUiAieFJHQiIKKyNlbHNlCisjZGVmaW5lIFJHQl9PUkRFUiAiQkdSeCIKKyNlbmRpZgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoUkdCX09SREVSKSkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsICAgIC8qIHRoZSBuYW1lIG9mIHRoZSBwYWRzICovCisgICAgR1NUX1BBRF9TSU5LLCAgICAgICAgICAgICAgIC8qIHR5cGUgb2YgdGhlIHBhZCAqLworICAgIEdTVF9QQURfQUxXQVlTLCAgICAgICAgICAgICAvKiBBTFdBWVMvU09NRVRJTUVTICovCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChTMTYpICIsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDgwMDAsIDk2MDAwIF0sICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQ7ICIKKyAgICAgICAgImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoUzE2KSAiLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyA4MDAwLCA5NjAwMCBdLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDIsICIKKyAgICAgICAgImNoYW5uZWwtbWFzayA9IChiaXRtYXNrKSAweDMsICIgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkIikKKyAgICApOworCisKK3N0YXRpYyB2b2lkIGdzdF9nb29tX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9nb29tX3NldHVwIChHc3RBdWRpb1Zpc3VhbGl6ZXIgKiBiYXNlKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZ29vbV9yZW5kZXIgKEdzdEF1ZGlvVmlzdWFsaXplciAqIGJhc2UsIEdzdEJ1ZmZlciAqIGF1ZGlvLAorICAgIEdzdFZpZGVvRnJhbWUgKiB2aWRlbyk7CisKK0dfREVGSU5FX1RZUEUgKEdzdEdvb20sIGdzdF9nb29tLCBHU1RfVFlQRV9BVURJT19WSVNVQUxJWkVSKTsKKworc3RhdGljIHZvaWQKK2dzdF9nb29tX2NsYXNzX2luaXQgKEdzdEdvb21DbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0QXVkaW9WaXN1YWxpemVyQ2xhc3MgKnZpc3VhbGl6ZXJfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICB2aXN1YWxpemVyX2NsYXNzID0gKEdzdEF1ZGlvVmlzdWFsaXplckNsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2dvb21fZmluYWxpemU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkdPT006IHdoYXQgYSBHT09NISIsCisgICAgICAiVmlzdWFsaXphdGlvbiIsCisgICAgICAiVGFrZXMgZnJhbWVzIG9mIGRhdGEgYW5kIG91dHB1dHMgdmlkZW8gZnJhbWVzIHVzaW5nIHRoZSBHT09NIGZpbHRlciIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4iKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworCisgIHZpc3VhbGl6ZXJfY2xhc3MtPnNldHVwID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9nb29tX3NldHVwKTsKKyAgdmlzdWFsaXplcl9jbGFzcy0+cmVuZGVyID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9nb29tX3JlbmRlcik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZ29vbV9pbml0IChHc3RHb29tICogZ29vbSkKK3sKKyAgZ29vbS0+d2lkdGggPSBERUZBVUxUX1dJRFRIOworICBnb29tLT5oZWlnaHQgPSBERUZBVUxUX0hFSUdIVDsKKyAgZ29vbS0+Y2hhbm5lbHMgPSAwOworCisgIGdvb20tPnBsdWdpbiA9IGdvb21faW5pdCAoZ29vbS0+d2lkdGgsIGdvb20tPmhlaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZ29vbV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0R29vbSAqZ29vbSA9IEdTVF9HT09NIChvYmplY3QpOworCisgIGdvb21fY2xvc2UgKGdvb20tPnBsdWdpbik7CisgIGdvb20tPnBsdWdpbiA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKGdzdF9nb29tX3BhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9nb29tX3NldHVwIChHc3RBdWRpb1Zpc3VhbGl6ZXIgKiBiYXNlKQoreworICBHc3RHb29tICpnb29tID0gR1NUX0dPT00gKGJhc2UpOworCisgIGdvb20tPndpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKCZiYXNlLT52aW5mbyk7CisgIGdvb20tPmhlaWdodCA9IEdTVF9WSURFT19JTkZPX0hFSUdIVCAoJmJhc2UtPnZpbmZvKTsKKyAgZ29vbV9zZXRfcmVzb2x1dGlvbiAoZ29vbS0+cGx1Z2luLCBnb29tLT53aWR0aCwgZ29vbS0+aGVpZ2h0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZ29vbV9yZW5kZXIgKEdzdEF1ZGlvVmlzdWFsaXplciAqIGJhc2UsIEdzdEJ1ZmZlciAqIGF1ZGlvLAorICAgIEdzdFZpZGVvRnJhbWUgKiB2aWRlbykKK3sKKyAgR3N0R29vbSAqZ29vbSA9IEdTVF9HT09NIChiYXNlKTsKKyAgR3N0TWFwSW5mbyBhbWFwOworICBnaW50MTYgZGF0YWluWzJdW0dPT01fU0FNUExFU107CisgIGdpbnQxNiAqYWRhdGE7CisgIGdpbnQgaTsKKworICAvKiBnZXQgbmV4dCBHT09NX1NBTVBMRVMsIHdlIGhhdmUgYXQgbGVhc3QgdGhpcyBhbW91bnQgb2Ygc2FtcGxlcyAqLworICBnc3RfYnVmZmVyX21hcCAoYXVkaW8sICZhbWFwLCBHU1RfTUFQX1JFQUQpOworICBhZGF0YSA9IChnaW50MTYgKikgYW1hcC5kYXRhOworCisgIGlmIChnb29tLT5jaGFubmVscyA9PSAyKSB7CisgICAgZm9yIChpID0gMDsgaSA8IEdPT01fU0FNUExFUzsgaSsrKSB7CisgICAgICBkYXRhaW5bMF1baV0gPSAqYWRhdGErKzsKKyAgICAgIGRhdGFpblsxXVtpXSA9ICphZGF0YSsrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgR09PTV9TQU1QTEVTOyBpKyspIHsKKyAgICAgIGRhdGFpblswXVtpXSA9ICphZGF0YTsKKyAgICAgIGRhdGFpblsxXVtpXSA9ICphZGF0YSsrOworICAgIH0KKyAgfQorCisgIHZpZGVvLT5kYXRhWzBdID0gZ29vbV91cGRhdGUgKGdvb20tPnBsdWdpbiwgZGF0YWluLCAwLCAwKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYXVkaW8sICZhbWFwKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ29vbV9kZWJ1ZywgImdvb20iLCAwLCAiZ29vbSB2aXN1YWxpc2F0aW9uIGVsZW1lbnQiKTsKKworI2lmIEhBVkVfT1JDCisgIG9yY19pbml0ICgpOworI2VuZGlmCisKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJnb29tIiwgR1NUX1JBTktfTk9ORSwgR1NUX1RZUEVfR09PTSk7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBnb29tLAorICAgICJHT09NIHZpc3VhbGl6YXRpb24gZmlsdGVyIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC9nb29tL2dzdGdvb20uaCBiL2dzdC9nb29tL2dzdGdvb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTk3NWRkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vZ3N0Z29vbS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qIGdzdGdvb20uYzogaW1wbGVtZW50YXRpb24gb2YgZ29vbSBkcmF3aW5nIGVsZW1lbnQKKyAqIENvcHlyaWdodCAoQykgPDIwMDE+IFJpY2hhcmQgQm91bHRvbiA8cmljaGFyZEB0YXJ0YXJ1cy5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDE1PiBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzQGRlYmV0aGVuY291cnQuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfR09PTV9IX18KKyNkZWZpbmUgX19HU1RfR09PTV9IX18KKworI2luY2x1ZGUgPGdzdC9wYnV0aWxzL2dzdGF1ZGlvdmlzdWFsaXplci5oPgorCisjaW5jbHVkZSAiZ29vbS5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR09PTV9TQU1QTEVTIDUxMgorCisjZGVmaW5lIEdTVF9UWVBFX0dPT00gICAgICAgICAgICAoZ3N0X2dvb21fZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0dPT00ob2JqKSAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9HT09NLEdzdEdvb20pKQorI2RlZmluZSBHU1RfR09PTV9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfR09PTSxHc3RHb29tQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfR09PTShvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0dPT00pKQorI2RlZmluZSBHU1RfSVNfR09PTV9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfR09PTSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RHb29tIEdzdEdvb207Cit0eXBlZGVmIHN0cnVjdCBfR3N0R29vbUNsYXNzIEdzdEdvb21DbGFzczsKKworc3RydWN0IF9Hc3RHb29tCit7CisgIEdzdEF1ZGlvVmlzdWFsaXplciBwYXJlbnQ7CisKKyAgLyogaW5wdXQgdHJhY2tpbmcgKi8KKyAgZ2ludCBjaGFubmVsczsKKworICAvKiB2aWRlbyBzdGF0ZSAqLworICBnaW50IHdpZHRoOworICBnaW50IGhlaWdodDsKKworICAvKiBnb29tIHN0dWZmICovCisgIFBsdWdpbkluZm8gKnBsdWdpbjsKK307CisKK3N0cnVjdCBfR3N0R29vbUNsYXNzCit7CisgIEdzdEF1ZGlvVmlzdWFsaXplckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9nb29tX2dldF90eXBlICh2b2lkKTsKK2dib29sZWFuIGdzdF9nb29tX3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfR09PTV9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vaWZzLmMgYi9nc3QvZ29vbS9pZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDM4ZTMxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vaWZzLmMKQEAgLTAsMCArMSw3NzQgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTk3IGJ5IE1hc3NpbWlubyBQYXNjYWwgPFBhc2NhbC5NYXNzaW1vbkBlbnMuZnI+CisgKgorICogaWZzLmM6IG1vZGlmaWVkIGl0ZXJhdGVkIGZ1bmN0aW9ucyBzeXN0ZW0gZm9yIGdvb20uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisgKiBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgQVMgSVMgd2l0aCBubyB3YXJyYW50aWVzIG9mIGFueSBraW5kLiAgVGhlIGF1dGhvcgorICogc2hhbGwgaGF2ZSBubyBsaWFiaWxpdHkgd2l0aCByZXNwZWN0IHRvIHRoZSBpbmZyaW5nZW1lbnQgb2YgY29weXJpZ2h0cywKKyAqIHRyYWRlIHNlY3JldHMgb3IgYW55IHBhdGVudHMgYnkgdGhpcyBmaWxlIG9yIGFueSBwYXJ0IHRoZXJlb2YuICBJbiBubworICogZXZlbnQgd2lsbCB0aGUgYXV0aG9yIGJlIGxpYWJsZSBmb3IgYW55IGxvc3QgcmV2ZW51ZSBvciBwcm9maXRzIG9yCisgKiBvdGhlciBzcGVjaWFsLCBpbmRpcmVjdCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLgorICoKKyAqIElmIHRoaXMgbW9kZSBpcyB3ZWlyZCBhbmQgeW91IGhhdmUgYW4gb2xkIE1ldHJvWCBzZXJ2ZXIsIGl0IGlzIGJ1Z2d5LgorICogVGhlcmUgaXMgYSBmcmVlIFN1U0UtZW5oYW5jZWQgTWV0cm9YIFggc2VydmVyIHRoYXQgaXMgZmluZS4KKyAqCisgKiBXaGVuIHNob3duIGlmcywgRGlhbmEgUm9zZSAoNCB5ZWFycyBvbGQpIHNhaWQsICJJdCBsb29rcyBsaWtlIGRhbmNpbmcuIgorICoKKyAqIFJldmlzaW9uIEhpc3Rvcnk6CisgKiAxMy1EZWMtMjAwMzogQWRkZWQgc29tZSBnb29tIHNwZWNpZmljIHN0dWZmcyAodG8gbWFrZSBpZnMgYSBWaXN1YWxGWCkuCisgKiAxMS1BcHItMjAwMjogamVrb0Bpb3Mtc29mdHdhcmUuY29tOiBNYWtlIGlmcy5jIHN5c3RlbS1pbmRlbmRhbnQuIChpZnMuaCBhZGRlZCkKKyAqIDAxLU5vdi0yMDAwOiBBbGxvY2F0aW9uIGNoZWNrcworICogMTAtTWF5LTE5OTc6IGp3ekBqd3oub3JnOiB0dXJuZWQgaW50byBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KKyAqICAgICAgICAgICAgICBNYWRlIGl0IHJlbmRlciBpbnRvIGFuIG9mZnNjcmVlbiBiaXRtYXAgYW5kIHRoZW4gY29weQorICogICAgICAgICAgICAgIHRoYXQgb250byB0aGUgc2NyZWVuLCB0byByZWR1Y2UgZmxpY2tlci4KKyAqLworCisvKiAjaWZkZWYgU1RBTkRBTE9ORSAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJnb29tX2NvbmZpZy5oIgorCisjaWZkZWYgSEFWRV9NTVgKKyNpbmNsdWRlICJtbXguaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ29vbV9ncmFwaGljLmgiCisjaW5jbHVkZSAiaWZzLmgiCisjaW5jbHVkZSAiZ29vbV90b29scy5oIgorCit0eXBlZGVmIHN0cnVjdCBfaWZzUG9pbnQKK3sKKyAgZ2ludDMyIHgsIHk7Cit9CitJRlNQb2ludDsKKworCisjZGVmaW5lIE1PREVfaWZzCisKKyNkZWZpbmUgUFJPR0NMQVNTICJJRlMiCisKKyNkZWZpbmUgSEFDS19JTklUIGluaXRfaWZzCisjZGVmaW5lIEhBQ0tfRFJBVyBkcmF3X2lmcworCisjZGVmaW5lIGlmc19vcHRzIHhsb2NrbW9yZV9vcHRzCisKKyNkZWZpbmUgREVGQVVMVFMgIipkZWxheTogMjAwMDAgXG4iIFwKKyIqbmNvbG9yczogMTAwIFxuIgorCisjZGVmaW5lIFNNT09USF9DT0xPUlMKKworI2RlZmluZSBMUkFORCgpICAgICAgICAgICAgKChsb25nKSAoZ29vbV9yYW5kb20oZ29vbUluZm8tPmdSYW5kb20pICYgMHg3ZmZmZmZmZikpCisjZGVmaW5lIE5SQU5EKG4pICAgICAgICAgICAoKGludCkgKExSQU5EKCkgJSAobikpKQorCisjaWYgUkFORF9NQVggPCAweDEwMDAwCisjZGVmaW5lIE1BWFJBTkQgKCgoZmxvYXQpKFJBTkRfTUFYPDE2KSsoKGZsb2F0KVJBTkRfTUFYKSsxLjBmKS8xMjcuMGYpCisjZWxzZQorI2RlZmluZSBNQVhSQU5EICAgICAgICAgICAgKDIxNDc0ODM2NDguMC8xMjcuMCkgLyogdW5zaWduZWQgMTw8MzEgLyAxMjcuMCAoY2YgZ29vbV90b29scykgYXMgYSBmbG9hdCAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBmbG9hdCBEQkw7Cit0eXBlZGVmIGludCBGX1BUOworCisvKiB0eXBlZGVmIGZsb2F0ICAgICAgICAgICAgICAgRl9QVDsgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEZJWCAxMgorI2RlZmluZSBVTklUICAgKCAxPDxGSVggKQorI2RlZmluZSBNQVhfU0lNSSAgNgorCisjZGVmaW5lIE1BWF9ERVBUSF8yICAxMAorI2RlZmluZSBNQVhfREVQVEhfMyAgNgorI2RlZmluZSBNQVhfREVQVEhfNCAgNAorI2RlZmluZSBNQVhfREVQVEhfNSAgMgorCisvKiBQUkVWSU9VUyBWQUxVRSAKKyNkZWZpbmUgTUFYX1NJTUkgIDYKKworICogc2V0dGluZ3MgZm9yIGEgUEMgMTIwTWh6Li4uICoKKyNkZWZpbmUgTUFYX0RFUFRIXzIgIDEwCisjZGVmaW5lIE1BWF9ERVBUSF8zICA2CisjZGVmaW5lIE1BWF9ERVBUSF80ICA0CisjZGVmaW5lIE1BWF9ERVBUSF81ICAzCisqLworCisjZGVmaW5lIERCTF9Ub19GX1BUKHgpICAoRl9QVCkoIChEQkwpKFVOSVQpKih4KSApCisKK3R5cGVkZWYgc3RydWN0IFNpbWlsaXR1ZGVfU3RydWN0IFNJTUk7Cit0eXBlZGVmIHN0cnVjdCBGcmFjdGFsX1N0cnVjdCBGUkFDVEFMOworCitzdHJ1Y3QgU2ltaWxpdHVkZV9TdHJ1Y3QKK3sKKworICBEQkwgY194LCBjX3k7CisgIERCTCByLCByMiwgQSwgQTI7CisgIEZfUFQgQ3QsIFN0LCBDdDIsIFN0MjsKKyAgRl9QVCBDeCwgQ3k7CisgIEZfUFQgUiwgUjI7Cit9OworCisKK3N0cnVjdCBGcmFjdGFsX1N0cnVjdAoreworCisgIGludCBOYl9TaW1pOworICBTSU1JIENvbXBvbmVudHNbNSAqIE1BWF9TSU1JXTsKKyAgaW50IERlcHRoLCBDb2w7CisgIGludCBDb3VudCwgU3BlZWQ7CisgIGludCBXaWR0aCwgSGVpZ2h0LCBMeCwgTHk7CisgIERCTCByX21lYW4sIGRyX21lYW4sIGRyMl9tZWFuOworICBpbnQgQ3VyX1B0LCBNYXhfUHQ7CisKKyAgSUZTUG9pbnQgKkJ1ZmZlcjEsICpCdWZmZXIyOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX0lGU19EQVRBCit7CisgIEZSQUNUQUwgKlJvb3Q7CisgIEZSQUNUQUwgKkN1cl9GOworCisgIC8qIFVzZWQgYnkgdGhlIFRyYWNlIHJlY3Vyc2l2ZSBtZXRob2QgKi8KKyAgSUZTUG9pbnQgKkJ1ZjsKKyAgaW50IEN1cl9QdDsKKyAgaW50IGluaXRhbGl6ZWQ7Cit9IElmc0RhdGE7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgREJMCitHYXVzc19SYW5kIChQbHVnaW5JbmZvICogZ29vbUluZm8sIERCTCBjLCBEQkwgQSwgREJMIFMpCit7CisgIERCTCB5OworCisgIHkgPSAoREJMKSBMUkFORCAoKSAvIE1BWFJBTkQ7CisgIHkgPSBBICogKDEuMCAtIGV4cCAoLXkgKiB5ICogUykpIC8gKDEuMCAtIGV4cCAoLVMpKTsKKyAgaWYgKE5SQU5EICgyKSkKKyAgICByZXR1cm4gKGMgKyB5KTsKKyAgcmV0dXJuIChjIC0geSk7Cit9CisKK3N0YXRpYyBEQkwKK0hhbGZfR2F1c3NfUmFuZCAoUGx1Z2luSW5mbyAqIGdvb21JbmZvLCBEQkwgYywgREJMIEEsIERCTCBTKQoreworICBEQkwgeTsKKworICB5ID0gKERCTCkgTFJBTkQgKCkgLyBNQVhSQU5EOworICB5ID0gQSAqICgxLjAgLSBleHAgKC15ICogeSAqIFMpKSAvICgxLjAgLSBleHAgKC1TKSk7CisgIHJldHVybiAoYyArIHkpOworfQorCitzdGF0aWMgdm9pZAorUmFuZG9tX1NpbWlzIChQbHVnaW5JbmZvICogZ29vbUluZm8sIEZSQUNUQUwgKiBGLCBTSU1JICogQ3VyLCBpbnQgaSkKK3sKKyAgd2hpbGUgKGktLSkgeworICAgIEN1ci0+Y194ID0gR2F1c3NfUmFuZCAoZ29vbUluZm8sIDAuMCwgLjgsIDQuMCk7CisgICAgQ3VyLT5jX3kgPSBHYXVzc19SYW5kIChnb29tSW5mbywgMC4wLCAuOCwgNC4wKTsKKyAgICBDdXItPnIgPSBHYXVzc19SYW5kIChnb29tSW5mbywgRi0+cl9tZWFuLCBGLT5kcl9tZWFuLCAzLjApOworICAgIEN1ci0+cjIgPSBIYWxmX0dhdXNzX1JhbmQgKGdvb21JbmZvLCAwLjAsIEYtPmRyMl9tZWFuLCAyLjApOworICAgIEN1ci0+QSA9IEdhdXNzX1JhbmQgKGdvb21JbmZvLCAwLjAsIDM2MC4wLCA0LjApICogKEdfUEkgLyAxODAuMCk7CisgICAgQ3VyLT5BMiA9IEdhdXNzX1JhbmQgKGdvb21JbmZvLCAwLjAsIDM2MC4wLCA0LjApICogKEdfUEkgLyAxODAuMCk7CisgICAgQ3VyKys7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2ZyZWVfaWZzX2J1ZmZlcnMgKEZSQUNUQUwgKiBGcmFjdGFsKQoreworICBpZiAoRnJhY3RhbC0+QnVmZmVyMSAhPSBOVUxMKSB7CisgICAgKHZvaWQpIGZyZWUgKCh2b2lkICopIEZyYWN0YWwtPkJ1ZmZlcjEpOworICAgIEZyYWN0YWwtPkJ1ZmZlcjEgPSAoSUZTUG9pbnQgKikgTlVMTDsKKyAgfQorICBpZiAoRnJhY3RhbC0+QnVmZmVyMiAhPSBOVUxMKSB7CisgICAgKHZvaWQpIGZyZWUgKCh2b2lkICopIEZyYWN0YWwtPkJ1ZmZlcjIpOworICAgIEZyYWN0YWwtPkJ1ZmZlcjIgPSAoSUZTUG9pbnQgKikgTlVMTDsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCitmcmVlX2lmcyAoRlJBQ1RBTCAqIEZyYWN0YWwpCit7CisgIGZyZWVfaWZzX2J1ZmZlcnMgKEZyYWN0YWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAoraW5pdF9pZnMgKFBsdWdpbkluZm8gKiBnb29tSW5mbywgSWZzRGF0YSAqIGRhdGEpCit7CisgIGludCBpOworICBGUkFDVEFMICpGcmFjdGFsOworICBpbnQgd2lkdGggPSBnb29tSW5mby0+c2NyZWVuLndpZHRoOworICBpbnQgaGVpZ2h0ID0gZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQ7CisKKyAgaWYgKGRhdGEtPlJvb3QgPT0gTlVMTCkgeworICAgIGRhdGEtPlJvb3QgPSAoRlJBQ1RBTCAqKSBtYWxsb2MgKHNpemVvZiAoRlJBQ1RBTCkpOworICAgIGlmIChkYXRhLT5Sb290ID09IE5VTEwpCisgICAgICByZXR1cm47CisgICAgZGF0YS0+Um9vdC0+QnVmZmVyMSA9IChJRlNQb2ludCAqKSBOVUxMOworICAgIGRhdGEtPlJvb3QtPkJ1ZmZlcjIgPSAoSUZTUG9pbnQgKikgTlVMTDsKKyAgfQorICBGcmFjdGFsID0gZGF0YS0+Um9vdDsKKworICBmcmVlX2lmc19idWZmZXJzIChGcmFjdGFsKTsKKworICBpID0gKE5SQU5EICg0KSkgKyAyOyAgICAgICAgICAvKiBOdW1iZXIgb2YgY2VudGVycyAqLworICBzd2l0Y2ggKGkpIHsKKyAgICBjYXNlIDM6CisgICAgICBGcmFjdGFsLT5EZXB0aCA9IE1BWF9ERVBUSF8zOworICAgICAgRnJhY3RhbC0+cl9tZWFuID0gLjY7CisgICAgICBGcmFjdGFsLT5kcl9tZWFuID0gLjQ7CisgICAgICBGcmFjdGFsLT5kcjJfbWVhbiA9IC4zOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDQ6CisgICAgICBGcmFjdGFsLT5EZXB0aCA9IE1BWF9ERVBUSF80OworICAgICAgRnJhY3RhbC0+cl9tZWFuID0gLjU7CisgICAgICBGcmFjdGFsLT5kcl9tZWFuID0gLjQ7CisgICAgICBGcmFjdGFsLT5kcjJfbWVhbiA9IC4zOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDU6CisgICAgICBGcmFjdGFsLT5EZXB0aCA9IE1BWF9ERVBUSF81OworICAgICAgRnJhY3RhbC0+cl9tZWFuID0gLjU7CisgICAgICBGcmFjdGFsLT5kcl9tZWFuID0gLjQ7CisgICAgICBGcmFjdGFsLT5kcjJfbWVhbiA9IC4zOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgMjoKKyAgICAgIEZyYWN0YWwtPkRlcHRoID0gTUFYX0RFUFRIXzI7CisgICAgICBGcmFjdGFsLT5yX21lYW4gPSAuNzsKKyAgICAgIEZyYWN0YWwtPmRyX21lYW4gPSAuMzsKKyAgICAgIEZyYWN0YWwtPmRyMl9tZWFuID0gLjQ7CisgICAgICBicmVhazsKKyAgfQorICBGcmFjdGFsLT5OYl9TaW1pID0gaTsKKyAgRnJhY3RhbC0+TWF4X1B0ID0gRnJhY3RhbC0+TmJfU2ltaSAtIDE7CisgIGZvciAoaSA9IDA7IGkgPD0gRnJhY3RhbC0+RGVwdGggKyAyOyArK2kpCisgICAgRnJhY3RhbC0+TWF4X1B0ICo9IEZyYWN0YWwtPk5iX1NpbWk7CisKKyAgaWYgKChGcmFjdGFsLT5CdWZmZXIxID0gKElGU1BvaW50ICopIGNhbGxvYyAoRnJhY3RhbC0+TWF4X1B0LAorICAgICAgICAgICAgICBzaXplb2YgKElGU1BvaW50KSkpID09IE5VTEwpIHsKKyAgICBmcmVlX2lmcyAoRnJhY3RhbCk7CisgICAgcmV0dXJuOworICB9CisgIGlmICgoRnJhY3RhbC0+QnVmZmVyMiA9IChJRlNQb2ludCAqKSBjYWxsb2MgKEZyYWN0YWwtPk1heF9QdCwKKyAgICAgICAgICAgICAgc2l6ZW9mIChJRlNQb2ludCkpKSA9PSBOVUxMKSB7CisgICAgZnJlZV9pZnMgKEZyYWN0YWwpOworICAgIHJldHVybjsKKyAgfQorCisgIEZyYWN0YWwtPlNwZWVkID0gNjsKKyAgRnJhY3RhbC0+V2lkdGggPSB3aWR0aDsgICAgICAgLyogbW9kaWYgYnkgSmVLbyAqLworICBGcmFjdGFsLT5IZWlnaHQgPSBoZWlnaHQ7ICAgICAvKiBtb2RpZiBieSBKZUtvICovCisgIEZyYWN0YWwtPkN1cl9QdCA9IDA7CisgIEZyYWN0YWwtPkNvdW50ID0gMDsKKyAgRnJhY3RhbC0+THggPSAoRnJhY3RhbC0+V2lkdGggLSAxKSAvIDI7CisgIEZyYWN0YWwtPkx5ID0gKEZyYWN0YWwtPkhlaWdodCAtIDEpIC8gMjsKKyAgRnJhY3RhbC0+Q29sID0gcmFuZCAoKSAlICh3aWR0aCAqIGhlaWdodCk7ICAgIC8qIG1vZGlmIGJ5IEplS28gKi8KKworICBSYW5kb21fU2ltaXMgKGdvb21JbmZvLCBGcmFjdGFsLCBGcmFjdGFsLT5Db21wb25lbnRzLCA1ICogTUFYX1NJTUkpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorVHJhbnNmb3JtIChTSU1JICogU2ltaSwgRl9QVCB4bywgRl9QVCB5bywgRl9QVCAqIHgsIEZfUFQgKiB5KQoreworICBGX1BUIHh4LCB5eTsKKworICB4byA9IHhvIC0gU2ltaS0+Q3g7CisgIHhvID0gKHhvICogU2ltaS0+UikgPj4gRklYOyAgIC8qIC8gVU5JVDsgKi8KKyAgeW8gPSB5byAtIFNpbWktPkN5OworICB5byA9ICh5byAqIFNpbWktPlIpID4+IEZJWDsgICAvKiAvIFVOSVQ7ICovCisKKyAgeHggPSB4byAtIFNpbWktPkN4OworICB4eCA9ICh4eCAqIFNpbWktPlIyKSA+PiBGSVg7ICAvKiAvIFVOSVQ7ICovCisgIHl5ID0gLXlvIC0gU2ltaS0+Q3k7CisgIHl5ID0gKHl5ICogU2ltaS0+UjIpID4+IEZJWDsgIC8qIC8gVU5JVDsgKi8KKworICAqeCA9ICgoeG8gKiBTaW1pLT5DdCAtIHlvICogU2ltaS0+U3QgKyB4eCAqIFNpbWktPkN0MiAtIHl5ICogU2ltaS0+U3QyKQorICAgICAgPj4gRklYIC8qIC8gVU5JVCAqLyApICsgU2ltaS0+Q3g7CisgICp5ID0gKCh4byAqIFNpbWktPlN0ICsgeW8gKiBTaW1pLT5DdCArIHh4ICogU2ltaS0+U3QyICsgeXkgKiBTaW1pLT5DdDIpCisgICAgICA+PiBGSVggLyogLyBVTklUICovICkgKyBTaW1pLT5DeTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK1RyYWNlIChGUkFDVEFMICogRiwgRl9QVCB4bywgRl9QVCB5bywgSWZzRGF0YSAqIGRhdGEpCit7CisgIEZfUFQgeCwgeSwgaTsKKyAgU0lNSSAqQ3VyOworCisgIEN1ciA9IGRhdGEtPkN1cl9GLT5Db21wb25lbnRzOworICBmb3IgKGkgPSBkYXRhLT5DdXJfRi0+TmJfU2ltaTsgaTsgLS1pLCBDdXIrKykgeworICAgIFRyYW5zZm9ybSAoQ3VyLCB4bywgeW8sICZ4LCAmeSk7CisKKyAgICBkYXRhLT5CdWYtPnggPSBGLT5MeCArICgoeCAqIEYtPkx4KSA+PiAoRklYICsgMSkgLyogLyhVTklUKjIpICovICk7CisgICAgZGF0YS0+QnVmLT55ID0gRi0+THkgLSAoKHkgKiBGLT5MeSkgPj4gKEZJWCArIDEpIC8qIC8oVU5JVCoyKSAqLyApOworICAgIGRhdGEtPkJ1ZisrOworCisgICAgZGF0YS0+Q3VyX1B0Kys7CisKKyAgICBpZiAoRi0+RGVwdGggJiYgKCh4IC0geG8pID4+IDQpICYmICgoeSAtIHlvKSA+PiA0KSkgeworICAgICAgRi0+RGVwdGgtLTsKKyAgICAgIFRyYWNlIChGLCB4LCB5LCBkYXRhKTsKKyAgICAgIEYtPkRlcHRoKys7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitEcmF3X0ZyYWN0YWwgKElmc0RhdGEgKiBkYXRhKQoreworICBGUkFDVEFMICpGID0gZGF0YS0+Um9vdDsKKyAgaW50IGksIGo7CisgIEZfUFQgeCwgeSwgeG8sIHlvOworICBTSU1JICpDdXIsICpTaW1pOworCisgIGZvciAoQ3VyID0gRi0+Q29tcG9uZW50cywgaSA9IEYtPk5iX1NpbWk7IGk7IC0taSwgQ3VyKyspIHsKKyAgICBDdXItPkN4ID0gREJMX1RvX0ZfUFQgKEN1ci0+Y194KTsKKyAgICBDdXItPkN5ID0gREJMX1RvX0ZfUFQgKEN1ci0+Y195KTsKKworICAgIEN1ci0+Q3QgPSBEQkxfVG9fRl9QVCAoY29zIChDdXItPkEpKTsKKyAgICBDdXItPlN0ID0gREJMX1RvX0ZfUFQgKHNpbiAoQ3VyLT5BKSk7CisgICAgQ3VyLT5DdDIgPSBEQkxfVG9fRl9QVCAoY29zIChDdXItPkEyKSk7CisgICAgQ3VyLT5TdDIgPSBEQkxfVG9fRl9QVCAoc2luIChDdXItPkEyKSk7CisKKyAgICBDdXItPlIgPSBEQkxfVG9fRl9QVCAoQ3VyLT5yKTsKKyAgICBDdXItPlIyID0gREJMX1RvX0ZfUFQgKEN1ci0+cjIpOworICB9CisKKworICBkYXRhLT5DdXJfUHQgPSAwOworICBkYXRhLT5DdXJfRiA9IEY7CisgIGRhdGEtPkJ1ZiA9IEYtPkJ1ZmZlcjI7CisgIGZvciAoQ3VyID0gRi0+Q29tcG9uZW50cywgaSA9IEYtPk5iX1NpbWk7IGk7IC0taSwgQ3VyKyspIHsKKyAgICB4byA9IEN1ci0+Q3g7CisgICAgeW8gPSBDdXItPkN5OworICAgIGZvciAoU2ltaSA9IEYtPkNvbXBvbmVudHMsIGogPSBGLT5OYl9TaW1pOyBqOyAtLWosIFNpbWkrKykgeworICAgICAgaWYgKFNpbWkgPT0gQ3VyKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIFRyYW5zZm9ybSAoU2ltaSwgeG8sIHlvLCAmeCwgJnkpOworICAgICAgVHJhY2UgKEYsIHgsIHksIGRhdGEpOworICAgIH0KKyAgfQorCisgIC8qIEVyYXNlIHByZXZpb3VzICovCisKKyAgRi0+Q3VyX1B0ID0gZGF0YS0+Q3VyX1B0OworICBkYXRhLT5CdWYgPSBGLT5CdWZmZXIxOworICBGLT5CdWZmZXIxID0gRi0+QnVmZmVyMjsKKyAgRi0+QnVmZmVyMiA9IGRhdGEtPkJ1ZjsKK30KKworCitzdGF0aWMgSUZTUG9pbnQgKgorZHJhd19pZnMgKFBsdWdpbkluZm8gKiBnb29tSW5mbywgaW50ICpuYnB0LCBJZnNEYXRhICogZGF0YSkKK3sKKyAgaW50IGk7CisgIERCTCB1LCB1dSwgdiwgdnYsIHUwLCB1MSwgdTIsIHUzOworICBTSU1JICpTLCAqUzEsICpTMiwgKlMzLCAqUzQ7CisgIEZSQUNUQUwgKkY7CisKKyAgaWYgKGRhdGEtPlJvb3QgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgRiA9IGRhdGEtPlJvb3Q7CisgIGlmIChGLT5CdWZmZXIxID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgdSA9IChEQkwpIChGLT5Db3VudCkgKiAoREJMKSAoRi0+U3BlZWQpIC8gMTAwMC4wOworICB1dSA9IHUgKiB1OworICB2ID0gMS4wIC0gdTsKKyAgdnYgPSB2ICogdjsKKyAgdTAgPSB2diAqIHY7CisgIHUxID0gMy4wICogdnYgKiB1OworICB1MiA9IDMuMCAqIHYgKiB1dTsKKyAgdTMgPSB1ICogdXU7CisKKyAgUyA9IEYtPkNvbXBvbmVudHM7CisgIFMxID0gUyArIEYtPk5iX1NpbWk7CisgIFMyID0gUzEgKyBGLT5OYl9TaW1pOworICBTMyA9IFMyICsgRi0+TmJfU2ltaTsKKyAgUzQgPSBTMyArIEYtPk5iX1NpbWk7CisKKyAgZm9yIChpID0gRi0+TmJfU2ltaTsgaTsgLS1pLCBTKyssIFMxKyssIFMyKyssIFMzKyssIFM0KyspIHsKKyAgICBTLT5jX3ggPSB1MCAqIFMxLT5jX3ggKyB1MSAqIFMyLT5jX3ggKyB1MiAqIFMzLT5jX3ggKyB1MyAqIFM0LT5jX3g7CisgICAgUy0+Y195ID0gdTAgKiBTMS0+Y195ICsgdTEgKiBTMi0+Y195ICsgdTIgKiBTMy0+Y195ICsgdTMgKiBTNC0+Y195OworICAgIFMtPnIgPSB1MCAqIFMxLT5yICsgdTEgKiBTMi0+ciArIHUyICogUzMtPnIgKyB1MyAqIFM0LT5yOworICAgIFMtPnIyID0gdTAgKiBTMS0+cjIgKyB1MSAqIFMyLT5yMiArIHUyICogUzMtPnIyICsgdTMgKiBTNC0+cjI7CisgICAgUy0+QSA9IHUwICogUzEtPkEgKyB1MSAqIFMyLT5BICsgdTIgKiBTMy0+QSArIHUzICogUzQtPkE7CisgICAgUy0+QTIgPSB1MCAqIFMxLT5BMiArIHUxICogUzItPkEyICsgdTIgKiBTMy0+QTIgKyB1MyAqIFM0LT5BMjsKKyAgfQorCisgIERyYXdfRnJhY3RhbCAoZGF0YSk7CisKKyAgaWYgKEYtPkNvdW50ID49IDEwMDAgLyBGLT5TcGVlZCkgeworICAgIFMgPSBGLT5Db21wb25lbnRzOworICAgIFMxID0gUyArIEYtPk5iX1NpbWk7CisgICAgUzIgPSBTMSArIEYtPk5iX1NpbWk7CisgICAgUzMgPSBTMiArIEYtPk5iX1NpbWk7CisgICAgUzQgPSBTMyArIEYtPk5iX1NpbWk7CisKKyAgICBmb3IgKGkgPSBGLT5OYl9TaW1pOyBpOyAtLWksIFMrKywgUzErKywgUzIrKywgUzMrKywgUzQrKykgeworICAgICAgUzItPmNfeCA9IDIuMCAqIFM0LT5jX3ggLSBTMy0+Y194OworICAgICAgUzItPmNfeSA9IDIuMCAqIFM0LT5jX3kgLSBTMy0+Y195OworICAgICAgUzItPnIgPSAyLjAgKiBTNC0+ciAtIFMzLT5yOworICAgICAgUzItPnIyID0gMi4wICogUzQtPnIyIC0gUzMtPnIyOworICAgICAgUzItPkEgPSAyLjAgKiBTNC0+QSAtIFMzLT5BOworICAgICAgUzItPkEyID0gMi4wICogUzQtPkEyIC0gUzMtPkEyOworCisgICAgICAqUzEgPSAqUzQ7CisgICAgfQorICAgIFJhbmRvbV9TaW1pcyAoZ29vbUluZm8sIEYsIEYtPkNvbXBvbmVudHMgKyAzICogRi0+TmJfU2ltaSwgRi0+TmJfU2ltaSk7CisKKyAgICBSYW5kb21fU2ltaXMgKGdvb21JbmZvLCBGLCBGLT5Db21wb25lbnRzICsgNCAqIEYtPk5iX1NpbWksIEYtPk5iX1NpbWkpOworCisgICAgRi0+Q291bnQgPSAwOworICB9IGVsc2UKKyAgICBGLT5Db3VudCsrOworCisgIEYtPkNvbCsrOworCisgICgqbmJwdCkgPSBkYXRhLT5DdXJfUHQ7CisgIHJldHVybiBGLT5CdWZmZXIyOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCityZWxlYXNlX2lmcyAoSWZzRGF0YSAqIGRhdGEpCit7CisgIGlmIChkYXRhLT5Sb290ICE9IE5VTEwpIHsKKyAgICBmcmVlX2lmcyAoZGF0YS0+Um9vdCk7CisgICAgKHZvaWQpIGZyZWUgKCh2b2lkICopIGRhdGEtPlJvb3QpOworICAgIGRhdGEtPlJvb3QgPSAoRlJBQ1RBTCAqKSBOVUxMOworICB9Cit9CisKKyNkZWZpbmUgUkFORCgpIGdvb21fcmFuZG9tKGdvb21JbmZvLT5nUmFuZG9tKQorCitzdGF0aWMgdm9pZAoraWZzX3VwZGF0ZSAoUGx1Z2luSW5mbyAqIGdvb21JbmZvLCBQaXhlbCAqIGRhdGEsIFBpeGVsICogYmFjaywgaW50IGluY3JlbWVudCwKKyAgICBJZnNEYXRhICogZnhfZGF0YSkKK3sKKyAgc3RhdGljIHVuc2lnbmVkIGludCBjb3VsZXVyID0gMHhjMGMwYzBjMDsKKyAgc3RhdGljIGludCB2WzRdID0geyAyLCA0LCAzLCAyIH07CisgIHN0YXRpYyBpbnQgY29sWzRdID0geyAyLCA0LCAzLCAyIH07CisKKyNkZWZpbmUgTU9EX01FUiAwCisjZGVmaW5lIE1PRF9GRVUgMQorI2RlZmluZSBNT0RfTUVSVkVSIDIKKyAgc3RhdGljIGludCBtb2RlID0gTU9EX01FUlZFUjsKKyAgc3RhdGljIGludCBqdXN0Q2hhbmdlZCA9IDA7CisgIHN0YXRpYyBpbnQgY3ljbGUgPSAwOworICBpbnQgY3ljbGUxMDsKKworICBpbnQgbmJwdCA9IDA7CisgIElGU1BvaW50ICpwb2ludHM7CisgIGludCBpOworCisgIHVuc2lnbmVkIGludCBjb3VsZXVyc2wgPSBjb3VsZXVyOworICBpbnQgd2lkdGggPSBnb29tSW5mby0+c2NyZWVuLndpZHRoOworICBpbnQgaGVpZ2h0ID0gZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQ7CisKKyAgY3ljbGUrKzsKKyAgaWYgKGN5Y2xlID49IDgwKQorICAgIGN5Y2xlID0gMDsKKworICBpZiAoY3ljbGUgPCA0MCkKKyAgICBjeWNsZTEwID0gY3ljbGUgLyAxMDsKKyAgZWxzZQorICAgIGN5Y2xlMTAgPSA3IC0gY3ljbGUgLyAxMDsKKworICB7CisgICAgdW5zaWduZWQgY2hhciAqdG1wID0gKHVuc2lnbmVkIGNoYXIgKikgJmNvdWxldXJzbDsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICp0bXAgPSAoKnRtcCkgPj4gY3ljbGUxMDsKKyAgICAgIHRtcCsrOworICAgIH0KKyAgfQorCisgIHBvaW50cyA9IGRyYXdfaWZzIChnb29tSW5mbywgJm5icHQsIGZ4X2RhdGEpOworICBuYnB0LS07CisKKyNpZmRlZiBIQVZFX01NWAorICBtb3ZkX20yciAoY291bGV1cnNsLCBtbTEpOworICBwdW5wY2tsZHFfcjJyIChtbTEsIG1tMSk7CisgIGZvciAoaSA9IDA7IGkgPCBuYnB0OyBpICs9IGluY3JlbWVudCkgeworICAgIGludCB4ID0gcG9pbnRzW2ldLng7CisgICAgaW50IHkgPSBwb2ludHNbaV0ueTsKKworICAgIGlmICgoeCA8IHdpZHRoKSAmJiAoeSA8IGhlaWdodCkgJiYgKHggPiAwKSAmJiAoeSA+IDApKSB7CisgICAgICBpbnQgcG9zID0geCArICh5ICogd2lkdGgpOworCisgICAgICBtb3ZkX20yciAoYmFja1twb3NdLCBtbTApOworICAgICAgcGFkZHVzYl9yMnIgKG1tMSwgbW0wKTsKKyAgICAgIG1vdmRfcjJtIChtbTAsIGRhdGFbcG9zXSk7CisgICAgfQorICB9CisgIGVtbXMgKCk7ICAgICAvKl9fYXNtX18gX192b2xhdGlsZV9fICgiZW1tcyIpOyovCisjZWxzZQorICBmb3IgKGkgPSAwOyBpIDwgbmJwdDsgaSArPSBpbmNyZW1lbnQpIHsKKyAgICBpbnQgeCA9IChpbnQpIHBvaW50c1tpXS54ICYgMHg3ZmZmZmZmZjsKKyAgICBpbnQgeSA9IChpbnQpIHBvaW50c1tpXS55ICYgMHg3ZmZmZmZmZjsKKworICAgIGlmICgoeCA8IHdpZHRoKSAmJiAoeSA8IGhlaWdodCkpIHsKKyAgICAgIGludCBwb3MgPSB4ICsgKGludCkgKHkgKiB3aWR0aCk7CisgICAgICBpbnQgdHJhID0gMCwgaSA9IDA7CisgICAgICB1bnNpZ25lZCBjaGFyICpicmEgPSAodW5zaWduZWQgY2hhciAqKSAmYmFja1twb3NdOworICAgICAgdW5zaWduZWQgY2hhciAqZHJhID0gKHVuc2lnbmVkIGNoYXIgKikgJmRhdGFbcG9zXTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmNyYSA9ICh1bnNpZ25lZCBjaGFyICopICZjb3VsZXVyc2w7CisKKyAgICAgIGZvciAoOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIHRyYSA9ICpjcmE7CisgICAgICAgIHRyYSArPSAqYnJhOworICAgICAgICBpZiAodHJhID4gMjU1KQorICAgICAgICAgIHRyYSA9IDI1NTsKKyAgICAgICAgKmRyYSA9IHRyYTsKKyAgICAgICAgKytkcmE7CisgICAgICAgICsrY3JhOworICAgICAgICArK2JyYTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZiAvKk1NWCovCisgICAgICBqdXN0Q2hhbmdlZC0tOworCisgIGNvbFtBTFBIQV0gPSBjb3VsZXVyID4+IChBTFBIQSAqIDgpICYgMHhmZjsKKyAgY29sW0JMRVVdID0gY291bGV1ciA+PiAoQkxFVSAqIDgpICYgMHhmZjsKKyAgY29sW1ZFUlRdID0gY291bGV1ciA+PiAoVkVSVCAqIDgpICYgMHhmZjsKKyAgY29sW1JPVUdFXSA9IGNvdWxldXIgPj4gKFJPVUdFICogOCkgJiAweGZmOworCisgIGlmIChtb2RlID09IE1PRF9NRVIpIHsKKyAgICBjb2xbQkxFVV0gKz0gdltCTEVVXTsKKyAgICBpZiAoY29sW0JMRVVdID4gMjU1KSB7CisgICAgICBjb2xbQkxFVV0gPSAyNTU7CisgICAgICB2W0JMRVVdID0gLShSQU5EICgpICUgNCkgLSAxOworICAgIH0KKyAgICBpZiAoY29sW0JMRVVdIDwgMzIpIHsKKyAgICAgIGNvbFtCTEVVXSA9IDMyOworICAgICAgdltCTEVVXSA9IChSQU5EICgpICUgNCkgKyAxOworICAgIH0KKworICAgIGNvbFtWRVJUXSArPSB2W1ZFUlRdOworICAgIGlmIChjb2xbVkVSVF0gPiAyMDApIHsKKyAgICAgIGNvbFtWRVJUXSA9IDIwMDsKKyAgICAgIHZbVkVSVF0gPSAtKFJBTkQgKCkgJSAzKSAtIDI7CisgICAgfQorICAgIGlmIChjb2xbVkVSVF0gPiBjb2xbQkxFVV0pIHsKKyAgICAgIGNvbFtWRVJUXSA9IGNvbFtCTEVVXTsKKyAgICAgIHZbVkVSVF0gPSB2W0JMRVVdOworICAgIH0KKyAgICBpZiAoY29sW1ZFUlRdIDwgMzIpIHsKKyAgICAgIGNvbFtWRVJUXSA9IDMyOworICAgICAgdltWRVJUXSA9IChSQU5EICgpICUgMykgKyAyOworICAgIH0KKworICAgIGNvbFtST1VHRV0gKz0gdltST1VHRV07CisgICAgaWYgKGNvbFtST1VHRV0gPiA2NCkgeworICAgICAgY29sW1JPVUdFXSA9IDY0OworICAgICAgdltST1VHRV0gPSAtKFJBTkQgKCkgJSA0KSAtIDE7CisgICAgfQorICAgIGlmIChjb2xbUk9VR0VdIDwgMCkgeworICAgICAgY29sW1JPVUdFXSA9IDA7CisgICAgICB2W1JPVUdFXSA9IChSQU5EICgpICUgNCkgKyAxOworICAgIH0KKworICAgIGNvbFtBTFBIQV0gKz0gdltBTFBIQV07CisgICAgaWYgKGNvbFtBTFBIQV0gPiAwKSB7CisgICAgICBjb2xbQUxQSEFdID0gMDsKKyAgICAgIHZbQUxQSEFdID0gLShSQU5EICgpICUgNCkgLSAxOworICAgIH0KKyAgICBpZiAoY29sW0FMUEhBXSA8IDApIHsKKyAgICAgIGNvbFtBTFBIQV0gPSAwOworICAgICAgdltBTFBIQV0gPSAoUkFORCAoKSAlIDQpICsgMTsKKyAgICB9CisKKyAgICBpZiAoKChjb2xbVkVSVF0gPiAzMikgJiYgKGNvbFtST1VHRV0gPCBjb2xbVkVSVF0gKyA0MCkKKyAgICAgICAgICAgICYmIChjb2xbVkVSVF0gPCBjb2xbUk9VR0VdICsgMjApICYmIChjb2xbQkxFVV0gPCA2NCkKKyAgICAgICAgICAgICYmIChSQU5EICgpICUgMjAgPT0gMCkpICYmIChqdXN0Q2hhbmdlZCA8IDApKSB7CisgICAgICBtb2RlID0gKFJBTkQgKCkgJSAzKSA/IE1PRF9GRVUgOiBNT0RfTUVSVkVSOworICAgICAganVzdENoYW5nZWQgPSAyNTA7CisgICAgfQorICB9IGVsc2UgaWYgKG1vZGUgPT0gTU9EX01FUlZFUikgeworICAgIGNvbFtCTEVVXSArPSB2W0JMRVVdOworICAgIGlmIChjb2xbQkxFVV0gPiAxMjgpIHsKKyAgICAgIGNvbFtCTEVVXSA9IDEyODsKKyAgICAgIHZbQkxFVV0gPSAtKFJBTkQgKCkgJSA0KSAtIDE7CisgICAgfQorICAgIGlmIChjb2xbQkxFVV0gPCAxNikgeworICAgICAgY29sW0JMRVVdID0gMTY7CisgICAgICB2W0JMRVVdID0gKFJBTkQgKCkgJSA0KSArIDE7CisgICAgfQorCisgICAgY29sW1ZFUlRdICs9IHZbVkVSVF07CisgICAgaWYgKGNvbFtWRVJUXSA+IDIwMCkgeworICAgICAgY29sW1ZFUlRdID0gMjAwOworICAgICAgdltWRVJUXSA9IC0oUkFORCAoKSAlIDMpIC0gMjsKKyAgICB9CisgICAgaWYgKGNvbFtWRVJUXSA+IGNvbFtBTFBIQV0pIHsKKyAgICAgIGNvbFtWRVJUXSA9IGNvbFtBTFBIQV07CisgICAgICB2W1ZFUlRdID0gdltBTFBIQV07CisgICAgfQorICAgIGlmIChjb2xbVkVSVF0gPCAzMikgeworICAgICAgY29sW1ZFUlRdID0gMzI7CisgICAgICB2W1ZFUlRdID0gKFJBTkQgKCkgJSAzKSArIDI7CisgICAgfQorCisgICAgY29sW1JPVUdFXSArPSB2W1JPVUdFXTsKKyAgICBpZiAoY29sW1JPVUdFXSA+IDEyOCkgeworICAgICAgY29sW1JPVUdFXSA9IDEyODsKKyAgICAgIHZbUk9VR0VdID0gLShSQU5EICgpICUgNCkgLSAxOworICAgIH0KKyAgICBpZiAoY29sW1JPVUdFXSA8IDApIHsKKyAgICAgIGNvbFtST1VHRV0gPSAwOworICAgICAgdltST1VHRV0gPSAoUkFORCAoKSAlIDQpICsgMTsKKyAgICB9CisKKyAgICBjb2xbQUxQSEFdICs9IHZbQUxQSEFdOworICAgIGlmIChjb2xbQUxQSEFdID4gMjU1KSB7CisgICAgICBjb2xbQUxQSEFdID0gMjU1OworICAgICAgdltBTFBIQV0gPSAtKFJBTkQgKCkgJSA0KSAtIDE7CisgICAgfQorICAgIGlmIChjb2xbQUxQSEFdIDwgMCkgeworICAgICAgY29sW0FMUEhBXSA9IDA7CisgICAgICB2W0FMUEhBXSA9IChSQU5EICgpICUgNCkgKyAxOworICAgIH0KKworICAgIGlmICgoKGNvbFtWRVJUXSA+IDMyKSAmJiAoY29sW1JPVUdFXSA8IGNvbFtWRVJUXSArIDQwKQorICAgICAgICAgICAgJiYgKGNvbFtWRVJUXSA8IGNvbFtST1VHRV0gKyAyMCkgJiYgKGNvbFtCTEVVXSA8IDY0KQorICAgICAgICAgICAgJiYgKFJBTkQgKCkgJSAyMCA9PSAwKSkgJiYgKGp1c3RDaGFuZ2VkIDwgMCkpIHsKKyAgICAgIG1vZGUgPSAoUkFORCAoKSAlIDMpID8gTU9EX0ZFVSA6IE1PRF9NRVI7CisgICAgICBqdXN0Q2hhbmdlZCA9IDI1MDsKKyAgICB9CisgIH0gZWxzZSBpZiAobW9kZSA9PSBNT0RfRkVVKSB7CisKKyAgICBjb2xbQkxFVV0gKz0gdltCTEVVXTsKKyAgICBpZiAoY29sW0JMRVVdID4gNjQpIHsKKyAgICAgIGNvbFtCTEVVXSA9IDY0OworICAgICAgdltCTEVVXSA9IC0oUkFORCAoKSAlIDQpIC0gMTsKKyAgICB9CisgICAgaWYgKGNvbFtCTEVVXSA8IDApIHsKKyAgICAgIGNvbFtCTEVVXSA9IDA7CisgICAgICB2W0JMRVVdID0gKFJBTkQgKCkgJSA0KSArIDE7CisgICAgfQorCisgICAgY29sW1ZFUlRdICs9IHZbVkVSVF07CisgICAgaWYgKGNvbFtWRVJUXSA+IDIwMCkgeworICAgICAgY29sW1ZFUlRdID0gMjAwOworICAgICAgdltWRVJUXSA9IC0oUkFORCAoKSAlIDMpIC0gMjsKKyAgICB9CisgICAgaWYgKGNvbFtWRVJUXSA+IGNvbFtST1VHRV0gKyAyMCkgeworICAgICAgY29sW1ZFUlRdID0gY29sW1JPVUdFXSArIDIwOworICAgICAgdltWRVJUXSA9IC0oUkFORCAoKSAlIDMpIC0gMjsKKyAgICAgIHZbUk9VR0VdID0gKFJBTkQgKCkgJSA0KSArIDE7CisgICAgICB2W0JMRVVdID0gKFJBTkQgKCkgJSA0KSArIDE7CisgICAgfQorICAgIGlmIChjb2xbVkVSVF0gPCAwKSB7CisgICAgICBjb2xbVkVSVF0gPSAwOworICAgICAgdltWRVJUXSA9IChSQU5EICgpICUgMykgKyAyOworICAgIH0KKworICAgIGNvbFtST1VHRV0gKz0gdltST1VHRV07CisgICAgaWYgKGNvbFtST1VHRV0gPiAyNTUpIHsKKyAgICAgIGNvbFtST1VHRV0gPSAyNTU7CisgICAgICB2W1JPVUdFXSA9IC0oUkFORCAoKSAlIDQpIC0gMTsKKyAgICB9CisgICAgaWYgKGNvbFtST1VHRV0gPiBjb2xbVkVSVF0gKyA0MCkgeworICAgICAgY29sW1JPVUdFXSA9IGNvbFtWRVJUXSArIDQwOworICAgICAgdltST1VHRV0gPSAtKFJBTkQgKCkgJSA0KSAtIDE7CisgICAgfQorICAgIGlmIChjb2xbUk9VR0VdIDwgMCkgeworICAgICAgY29sW1JPVUdFXSA9IDA7CisgICAgICB2W1JPVUdFXSA9IChSQU5EICgpICUgNCkgKyAxOworICAgIH0KKworICAgIGNvbFtBTFBIQV0gKz0gdltBTFBIQV07CisgICAgaWYgKGNvbFtBTFBIQV0gPiAwKSB7CisgICAgICBjb2xbQUxQSEFdID0gMDsKKyAgICAgIHZbQUxQSEFdID0gLShSQU5EICgpICUgNCkgLSAxOworICAgIH0KKyAgICBpZiAoY29sW0FMUEhBXSA8IDApIHsKKyAgICAgIGNvbFtBTFBIQV0gPSAwOworICAgICAgdltBTFBIQV0gPSAoUkFORCAoKSAlIDQpICsgMTsKKyAgICB9CisKKyAgICBpZiAoKChjb2xbUk9VR0VdIDwgNjQpICYmIChjb2xbVkVSVF0gPiAzMikgJiYgKGNvbFtWRVJUXSA8IGNvbFtCTEVVXSkKKyAgICAgICAgICAgICYmIChjb2xbQkxFVV0gPiAzMikKKyAgICAgICAgICAgICYmIChSQU5EICgpICUgMjAgPT0gMCkpICYmIChqdXN0Q2hhbmdlZCA8IDApKSB7CisgICAgICBtb2RlID0gKFJBTkQgKCkgJSAyKSA/IE1PRF9NRVIgOiBNT0RfTUVSVkVSOworICAgICAganVzdENoYW5nZWQgPSAyNTA7CisgICAgfQorICB9CisKKyAgY291bGV1ciA9IChjb2xbQUxQSEFdIDw8IChBTFBIQSAqIDgpKQorICAgICAgfCAoY29sW0JMRVVdIDw8IChCTEVVICogOCkpCisgICAgICB8IChjb2xbVkVSVF0gPDwgKFZFUlQgKiA4KSkKKyAgICAgIHwgKGNvbFtST1VHRV0gPDwgKFJPVUdFICogOCkpOworfQorCisvKiogVklTVUFMX0ZYIFdSQVBQRVIgRk9SIElGUyAqLworCitzdGF0aWMgdm9pZAoraWZzX3ZmeF9hcHBseSAoVmlzdWFsRlggKiBfdGhpcywgUGl4ZWwgKiBzcmMsIFBpeGVsICogZGVzdCwKKyAgICBQbHVnaW5JbmZvICogZ29vbUluZm8pCit7CisKKyAgSWZzRGF0YSAqZGF0YSA9IChJZnNEYXRhICopIF90aGlzLT5meF9kYXRhOworCisgIGlmICghZGF0YS0+aW5pdGFsaXplZCkgeworICAgIGRhdGEtPmluaXRhbGl6ZWQgPSAxOworICAgIGluaXRfaWZzIChnb29tSW5mbywgZGF0YSk7CisgIH0KKyAgaWZzX3VwZGF0ZSAoZ29vbUluZm8sIGRlc3QsIHNyYywgZ29vbUluZm8tPnVwZGF0ZS5pZnNfaW5jciwgZGF0YSk7CisgIC8qVE9ETzogdHJvdXZlciBtZWlsbGV1ciBzb2x1Y2UgcG91ciBpbmNyZW1lbnQgKG1ldHRyZSBsZSBjb2RlIGRlIGdlc3Rpb24gZGUgbCdpZnMgZGFucyBjZSBmaWNoaWVyOiBpZnNfdmZ4X2FwcGx5KSAqLworfQorCitzdGF0aWMgdm9pZAoraWZzX3ZmeF9pbml0IChWaXN1YWxGWCAqIF90aGlzLCBQbHVnaW5JbmZvICogaW5mbykKK3sKKworICBJZnNEYXRhICpkYXRhID0gKElmc0RhdGEgKikgbWFsbG9jIChzaXplb2YgKElmc0RhdGEpKTsKKworICBkYXRhLT5Sb290ID0gKEZSQUNUQUwgKikgTlVMTDsKKyAgZGF0YS0+aW5pdGFsaXplZCA9IDA7CisgIF90aGlzLT5meF9kYXRhID0gZGF0YTsKK30KKworc3RhdGljIHZvaWQKK2lmc192ZnhfZnJlZSAoVmlzdWFsRlggKiBfdGhpcykKK3sKKyAgSWZzRGF0YSAqZGF0YSA9IChJZnNEYXRhICopIF90aGlzLT5meF9kYXRhOworCisgIHJlbGVhc2VfaWZzIChkYXRhKTsKKyAgZnJlZSAoZGF0YSk7Cit9CisKK3ZvaWQKK2lmc192aXN1YWxmeF9jcmVhdGUgKFZpc3VhbEZYICogdmZ4KQoreworCisgIHZmeC0+aW5pdCA9IGlmc192ZnhfaW5pdDsKKyAgdmZ4LT5mcmVlID0gaWZzX3ZmeF9mcmVlOworICB2ZngtPmFwcGx5ID0gaWZzX3ZmeF9hcHBseTsKKyAgdmZ4LT5meF9kYXRhID0gTlVMTDsKKyAgdmZ4LT5wYXJhbXMgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vaWZzLmggYi9nc3QvZ29vbS9pZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDAzNzczCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vaWZzLmgKQEAgLTAsMCArMSw1NCBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcgYnkgTWFzc2ltaW5vIFBhc2NhbCA8UGFzY2FsLk1hc3NpbW9uQGVucy5mcj4KKyAqCisgKiBpZnMuaDogbW9kaWZpZWQgaXRlcmF0ZWQgZnVuY3Rpb25zIHN5c3RlbSBmb3IgZ29vbS4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyAqIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCBBUyBJUyB3aXRoIG5vIHdhcnJhbnRpZXMgb2YgYW55IGtpbmQuICBUaGUgYXV0aG9yCisgKiBzaGFsbCBoYXZlIG5vIGxpYWJpbGl0eSB3aXRoIHJlc3BlY3QgdG8gdGhlIGluZnJpbmdlbWVudCBvZiBjb3B5cmlnaHRzLAorICogdHJhZGUgc2VjcmV0cyBvciBhbnkgcGF0ZW50cyBieSB0aGlzIGZpbGUgb3IgYW55IHBhcnQgdGhlcmVvZi4gIEluIG5vCisgKiBldmVudCB3aWxsIHRoZSBhdXRob3IgYmUgbGlhYmxlIGZvciBhbnkgbG9zdCByZXZlbnVlIG9yIHByb2ZpdHMgb3IKKyAqIG90aGVyIHNwZWNpYWwsIGluZGlyZWN0IGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMuCisgKgorICogSWYgdGhpcyBtb2RlIGlzIHdlaXJkIGFuZCB5b3UgaGF2ZSBhbiBvbGQgTWV0cm9YIHNlcnZlciwgaXQgaXMgYnVnZ3kuCisgKiBUaGVyZSBpcyBhIGZyZWUgU3VTRS1lbmhhbmNlZCBNZXRyb1ggWCBzZXJ2ZXIgdGhhdCBpcyBmaW5lLgorICoKKyAqIFdoZW4gc2hvd24gaWZzLCBEaWFuYSBSb3NlICg0IHllYXJzIG9sZCkgc2FpZCwgIkl0IGxvb2tzIGxpa2UgZGFuY2luZy4iCisgKgorICogUmV2aXNpb24gSGlzdG9yeToKKyAqIDEzLURlYy0yMDAzOiBBZGRlZCBzb21lIGdvb20gc3BlY2lmaWMgc3R1ZmZzICh0byBtYWtlIGlmcyBhIFZpc3VhbEZYKS4KKyAqIDExLUFwci0yMDAyOiBqZWtvQGlvcy1zb2Z0d2FyZS5jb206IE1ha2UgaWZzLmMgc3lzdGVtLWluZGVuZGFudC4gKGlmcy5oIGFkZGVkKQorICogMDEtTm92LTIwMDA6IEFsbG9jYXRpb24gY2hlY2tzCisgKiAxMC1NYXktMTk5Nzogand6QGp3ei5vcmc6IHR1cm5lZCBpbnRvIGEgc3RhbmRhbG9uZSBwcm9ncmFtLgorICogICAgICAgICAgICAgIE1hZGUgaXQgcmVuZGVyIGludG8gYW4gb2Zmc2NyZWVuIGJpdG1hcCBhbmQgdGhlbiBjb3B5CisgKiAgICAgICAgICAgICAgdGhhdCBvbnRvIHRoZSBzY3JlZW4sIHRvIHJlZHVjZSBmbGlja2VyLgorICovCisKKyNpZm5kZWYgSUZTX0gKKyNkZWZpbmUgSUZTX0gKKworI2luY2x1ZGUgImdvb21fY29uZmlnLmgiCisjaW5jbHVkZSAiZ29vbV9ncmFwaGljLmgiCisjaW5jbHVkZSAiZ29vbV9wbHVnaW5faW5mby5oIgorI2luY2x1ZGUgImdvb21fdmlzdWFsX2Z4LmgiCisKK3ZvaWQgaWZzX3Zpc3VhbGZ4X2NyZWF0ZShWaXN1YWxGWCAqdmZ4KTsKKworLyogaW5pdCBpZnMgZm9yIGEgKHdpZHRoKXgoaGVpZ2h0KSBvdXRwdXQuICogLwordm9pZCBpbml0X2lmcyAoUGx1Z2luSW5mbyAqZ29vbUluZm8sIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKy8gKiBkcmF3IGFuIGlmcyBvbiB0aGUgYnVmZmVyICh3aGljaCBzaXplIGlzIHdpZHRoICogaGVpZ2h0KQorICAgaW5jcmVtZW50IG1lYW5zIHRoYXQgd2UgZHJhdyAxL2luY3JlbWVudCBvZiB0aGUgaWZzJ3MgcG9pbnRzICogLwordm9pZCBpZnNfdXBkYXRlIChQbHVnaW5JbmZvICpnb29tSW5mbywgUGl4ZWwgKiBidWZmZXIsIFBpeGVsICogYmFjaywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgaW5jcmVtZW50KTsKKworLyAqIGZyZWUgYWxsIGlmcydzIGRhdGEuICogLwordm9pZCByZWxlYXNlX2lmcyAodm9pZCk7CisqLworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vbGluZXMuYyBiL2dzdC9nb29tL2xpbmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjMWVkYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL2xpbmVzLmMKQEAgLTAsMCArMSwyNTcgQEAKKy8qIEdvb20gUHJvamVjdAorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gaU9TLVNvZnR3YXJlCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImxpbmVzLmgiCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiZ29vbV90b29scy5oIgorI2luY2x1ZGUgImRyYXdtZXRob2RzLmgiCisjaW5jbHVkZSAiZ29vbV9wbHVnaW5faW5mby5oIgorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIKK2xpZ2h0ZW4gKHVuc2lnbmVkIGNoYXIgdmFsdWUsIGZsb2F0IHBvd2VyKQoreworICBpbnQgdmFsID0gdmFsdWU7CisgIGZsb2F0IHQgPSAoZmxvYXQpIHZhbCAqIGxvZzEwIChwb3dlcikgLyAyLjA7CisKKyAgaWYgKHQgPiAwKSB7CisgICAgdmFsID0gKGludCkgdDsgICAgICAgICAgICAgIC8qICgzMi4wZiAqIGxvZyAodCkpOyAqLworICAgIGlmICh2YWwgPiAyNTUpCisgICAgICB2YWwgPSAyNTU7CisgICAgaWYgKHZhbCA8IDApCisgICAgICB2YWwgPSAwOworICAgIHJldHVybiB2YWw7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2xpZ2h0ZW5jb2xvciAoZ3VpbnQzMiAqIGNvbCwgZmxvYXQgcG93ZXIpCit7CisgIHVuc2lnbmVkIGNoYXIgKmNvbG9yOworCisgIGNvbG9yID0gKHVuc2lnbmVkIGNoYXIgKikgY29sOworICAqY29sb3IgPSBsaWdodGVuICgqY29sb3IsIHBvd2VyKTsKKyAgY29sb3IrKzsKKyAgKmNvbG9yID0gbGlnaHRlbiAoKmNvbG9yLCBwb3dlcik7CisgIGNvbG9yKys7CisgICpjb2xvciA9IGxpZ2h0ZW4gKCpjb2xvciwgcG93ZXIpOworICBjb2xvcisrOworICAqY29sb3IgPSBsaWdodGVuICgqY29sb3IsIHBvd2VyKTsKK30KKworCisKK3N0YXRpYyB2b2lkCitnZW5saW5lIChpbnQgaWQsIGZsb2F0IHBhcmFtLCBHTVVuaXRQb2ludGVyICogbCwgaW50IHJ4LCBpbnQgcnkpCit7CisgIGludCBpOworCisgIHN3aXRjaCAoaWQpIHsKKyAgICBjYXNlIEdNTF9ITElORToKKyAgICAgIGZvciAoaSA9IDA7IGkgPCA1MTI7IGkrKykgeworICAgICAgICBsW2ldLnggPSAoKGZsb2F0KSBpICogcngpIC8gNTEyLjBmOworICAgICAgICBsW2ldLnkgPSBwYXJhbTsKKyAgICAgICAgbFtpXS5hbmdsZSA9IEdfUEkgLyAyLjBmOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIGNhc2UgR01MX1ZMSU5FOgorICAgICAgZm9yIChpID0gMDsgaSA8IDUxMjsgaSsrKSB7CisgICAgICAgIGxbaV0ueSA9ICgoZmxvYXQpIGkgKiByeSkgLyA1MTIuMGY7CisgICAgICAgIGxbaV0ueCA9IHBhcmFtOworICAgICAgICBsW2ldLmFuZ2xlID0gMC4wZjsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICBjYXNlIEdNTF9DSVJDTEU6CisgICAgICBmb3IgKGkgPSAwOyBpIDwgNTEyOyBpKyspIHsKKyAgICAgICAgZmxvYXQgY29zYSwgc2luYTsKKworICAgICAgICBsW2ldLmFuZ2xlID0gMi4wZiAqIEdfUEkgKiAoZmxvYXQpIGkgLyA1MTIuMGY7CisgICAgICAgIGNvc2EgPSBwYXJhbSAqIGNvcyAobFtpXS5hbmdsZSk7CisgICAgICAgIHNpbmEgPSBwYXJhbSAqIHNpbiAobFtpXS5hbmdsZSk7CisgICAgICAgIGxbaV0ueCA9ICgoZmxvYXQpIHJ4IC8gMi4wZikgKyBjb3NhOworICAgICAgICBsW2ldLnkgPSAoZmxvYXQpIHJ5IC8gMi4wZiArIHNpbmE7CisgICAgICB9CisgICAgICByZXR1cm47CisgIH0KK30KKworc3RhdGljIGd1aW50MzIKK2dldGNvdWxldXIgKGludCBtb2RlKQoreworICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIEdNTF9SRUQ6CisgICAgICByZXR1cm4gKDIzMCA8PCAoUk9VR0UgKiA4KSkgfCAoMTIwIDw8IChWRVJUICogOCkpIHwgKDE4IDw8IChCTEVVICogOCkpOworICAgIGNhc2UgR01MX09SQU5HRV9KOgorICAgICAgcmV0dXJuICgxMjAgPDwgKFZFUlQgKiA4KSkgfCAoMjUyIDw8IChST1VHRSAqIDgpKSB8ICgxOCA8PCAoQkxFVSAqIDgpKTsKKyAgICBjYXNlIEdNTF9PUkFOR0VfVjoKKyAgICAgIHJldHVybiAoMTYwIDw8IChWRVJUICogOCkpIHwgKDIzNiA8PCAoUk9VR0UgKiA4KSkgfCAoNDAgPDwgKEJMRVUgKiA4KSk7CisgICAgY2FzZSBHTUxfQkxFVUJMQU5DOgorICAgICAgcmV0dXJuICg0MCA8PCAoQkxFVSAqIDgpKSB8ICgyMjAgPDwgKFJPVUdFICogOCkpIHwgKDE0MCA8PCAoVkVSVCAqIDgpKTsKKyAgICBjYXNlIEdNTF9WRVJUOgorICAgICAgcmV0dXJuICgyMDAgPDwgKFZFUlQgKiA4KSkgfCAoODAgPDwgKFJPVUdFICogOCkpIHwgKDE4IDw8IChCTEVVICogOCkpOworICAgIGNhc2UgR01MX0JMRVU6CisgICAgICByZXR1cm4gKDI1MCA8PCAoQkxFVSAqIDgpKSB8ICgzMCA8PCAoVkVSVCAqIDgpKSB8ICg4MCA8PCAoUk9VR0UgKiA4KSk7CisgICAgY2FzZSBHTUxfQkxBQ0s6CisgICAgICByZXR1cm4gKDE2IDw8IChCTEVVICogOCkpIHwgKDE2IDw8IChWRVJUICogOCkpIHwgKDE2IDw8IChST1VHRSAqIDgpKTsKKyAgfQorICByZXR1cm4gMDsKK30KKwordm9pZAorZ29vbV9saW5lc19zZXRfcmVzIChHTUxpbmUgKiBnbWwsIGludCByeCwgaW50IHJ5KQoreworICBpZiAoZ21sICE9IE5VTEwpIHsKKyAgICBnbWwtPnNjcmVlblggPSByeDsKKyAgICBnbWwtPnNjcmVlblkgPSByeTsKKworICAgIGdlbmxpbmUgKGdtbC0+SURkZXN0LCBnbWwtPnBhcmFtLCBnbWwtPnBvaW50czIsIHJ4LCByeSk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAorZ29vbV9saW5lc19tb3ZlIChHTUxpbmUgKiBsKQoreworICBpbnQgaTsKKyAgdW5zaWduZWQgY2hhciAqYzEsICpjMjsKKworICBmb3IgKGkgPSAwOyBpIDwgNTEyOyBpKyspIHsKKyAgICBsLT5wb2ludHNbaV0ueCA9IChsLT5wb2ludHMyW2ldLnggKyAzOS4wZiAqIGwtPnBvaW50c1tpXS54KSAvIDQwLjBmOworICAgIGwtPnBvaW50c1tpXS55ID0gKGwtPnBvaW50czJbaV0ueSArIDM5LjBmICogbC0+cG9pbnRzW2ldLnkpIC8gNDAuMGY7CisgICAgbC0+cG9pbnRzW2ldLmFuZ2xlID0KKyAgICAgICAgKGwtPnBvaW50czJbaV0uYW5nbGUgKyAzOS4wZiAqIGwtPnBvaW50c1tpXS5hbmdsZSkgLyA0MC4wZjsKKyAgfQorCisgIGMxID0gKHVuc2lnbmVkIGNoYXIgKikgJmwtPmNvbG9yOworICBjMiA9ICh1bnNpZ25lZCBjaGFyICopICZsLT5jb2xvcjI7CisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICBpbnQgY2MxLCBjYzI7CisKKyAgICBjYzEgPSAqYzE7CisgICAgY2MyID0gKmMyOworICAgICpjMSA9ICh1bnNpZ25lZCBjaGFyKSAoKGNjMSAqIDYzICsgY2MyKSA+PiA2KTsKKyAgICArK2MxOworICAgICsrYzI7CisgIH0KKworICBsLT5wb3dlciArPSBsLT5wb3dpbmM7CisgIGlmIChsLT5wb3dlciA8IDEuMWYpIHsKKyAgICBsLT5wb3dlciA9IDEuMWY7CisgICAgbC0+cG93aW5jID0gKGZsb2F0KSAoZ29vbV9pcmFuZCAobC0+Z29vbUluZm8tPmdSYW5kb20sIDIwKSArIDEwKSAvIDMwMC4wZjsKKyAgfQorICBpZiAobC0+cG93ZXIgPiAxNy41ZikgeworICAgIGwtPnBvd2VyID0gMTcuNWY7CisgICAgbC0+cG93aW5jID0gLShmbG9hdCkgKGdvb21faXJhbmQgKGwtPmdvb21JbmZvLT5nUmFuZG9tLCAyMCkgKyAxMCkgLyAzMDAuMGY7CisgIH0KKworICBsLT5hbXBsaXR1ZGUgPSAoOTkuMGYgKiBsLT5hbXBsaXR1ZGUgKyBsLT5hbXBsaXR1ZGVGKSAvIDEwMC4wZjsKK30KKwordm9pZAorZ29vbV9saW5lc19zd2l0Y2hfdG8gKEdNTGluZSAqIGdtbCwgaW50IElEZGVzdCwKKyAgICBmbG9hdCBwYXJhbSwgZmxvYXQgYW1wbGl0dWRlLCBpbnQgY29sKQoreworICBnZW5saW5lIChJRGRlc3QsIHBhcmFtLCBnbWwtPnBvaW50czIsIGdtbC0+c2NyZWVuWCwgZ21sLT5zY3JlZW5ZKTsKKyAgZ21sLT5JRGRlc3QgPSBJRGRlc3Q7CisgIGdtbC0+cGFyYW0gPSBwYXJhbTsKKyAgZ21sLT5hbXBsaXR1ZGVGID0gYW1wbGl0dWRlOworICBnbWwtPmNvbG9yMiA9IGdldGNvdWxldXIgKGNvbCk7Cit9CisKK0dNTGluZSAqCitnb29tX2xpbmVzX2luaXQgKFBsdWdpbkluZm8gKiBnb29tSW5mbywgaW50IHJ4LCBpbnQgcnksCisgICAgaW50IElEc3JjLCBmbG9hdCBwYXJhbVMsIGludCBjb3VsUywgaW50IElEZGVzdCwgZmxvYXQgcGFyYW1ELCBpbnQgY291bEQpCit7CisgIEdNTGluZSAqbCA9IChHTUxpbmUgKikgbWFsbG9jIChzaXplb2YgKEdNTGluZSkpOworCisgIGwtPmdvb21JbmZvID0gZ29vbUluZm87CisKKyAgbC0+cG9pbnRzID0gKEdNVW5pdFBvaW50ZXIgKikgbWFsbG9jICg1MTIgKiBzaXplb2YgKEdNVW5pdFBvaW50ZXIpKTsKKyAgbC0+cG9pbnRzMiA9IChHTVVuaXRQb2ludGVyICopIG1hbGxvYyAoNTEyICogc2l6ZW9mIChHTVVuaXRQb2ludGVyKSk7CisgIGwtPm5iUG9pbnRzID0gNTEyOworCisgIGwtPklEZGVzdCA9IElEZGVzdDsKKyAgbC0+cGFyYW0gPSBwYXJhbUQ7CisKKyAgbC0+YW1wbGl0dWRlID0gbC0+YW1wbGl0dWRlRiA9IDEuMGY7CisKKyAgZ2VubGluZSAoSURzcmMsIHBhcmFtUywgbC0+cG9pbnRzLCByeCwgcnkpOworICBnZW5saW5lIChJRGRlc3QsIHBhcmFtRCwgbC0+cG9pbnRzMiwgcngsIHJ5KTsKKworICBsLT5jb2xvciA9IGdldGNvdWxldXIgKGNvdWxTKTsKKyAgbC0+Y29sb3IyID0gZ2V0Y291bGV1ciAoY291bEQpOworCisgIGwtPnNjcmVlblggPSByeDsKKyAgbC0+c2NyZWVuWSA9IHJ5OworCisgIGwtPnBvd2VyID0gMC4wZjsKKyAgbC0+cG93aW5jID0gMC4wMWY7CisKKyAgZ29vbV9saW5lc19zd2l0Y2hfdG8gKGwsIElEZGVzdCwgcGFyYW1ELCAxLjBmLCBjb3VsRCk7CisKKyAgcmV0dXJuIGw7Cit9CisKK3ZvaWQKK2dvb21fbGluZXNfZnJlZSAoR01MaW5lICoqIGwpCit7CisgIGZyZWUgKCgqbCktPnBvaW50czIpOworICBmcmVlICgoKmwpLT5wb2ludHMpOworICBmcmVlICgqbCk7CisgIGwgPSBOVUxMOworfQorCit2b2lkCitnb29tX2xpbmVzX2RyYXcgKFBsdWdpbkluZm8gKiBwbHVnLCBHTUxpbmUgKiBsaW5lLCBnaW50MTYgZGF0YVs1MTJdLCBQaXhlbCAqIHApCit7CisgIGlmIChsaW5lICE9IE5VTEwpIHsKKyAgICBpbnQgaSwgeDEsIHkxOworICAgIGd1aW50MzIgY29sb3IgPSBsaW5lLT5jb2xvcjsKKyAgICBHTVVuaXRQb2ludGVyICpwdCA9ICYobGluZS0+cG9pbnRzWzBdKTsKKworICAgIGZsb2F0IGNvc2EgPSBjb3MgKHB0LT5hbmdsZSkgLyAxMDAwLjBmOworICAgIGZsb2F0IHNpbmEgPSBzaW4gKHB0LT5hbmdsZSkgLyAxMDAwLjBmOworCisgICAgbGlnaHRlbmNvbG9yICgmY29sb3IsIGxpbmUtPnBvd2VyKTsKKworICAgIHgxID0gKGludCkgKHB0LT54ICsgY29zYSAqIGxpbmUtPmFtcGxpdHVkZSAqIGRhdGFbMF0pOworICAgIHkxID0gKGludCkgKHB0LT55ICsgc2luYSAqIGxpbmUtPmFtcGxpdHVkZSAqIGRhdGFbMF0pOworCisgICAgZm9yIChpID0gMTsgaSA8IDUxMjsgaSsrKSB7CisgICAgICBpbnQgeDIsIHkyOworICAgICAgR01Vbml0UG9pbnRlciAqcHQgPSAmKGxpbmUtPnBvaW50c1tpXSk7CisKKyAgICAgIGZsb2F0IGNvc2EgPSBjb3MgKHB0LT5hbmdsZSkgLyAxMDAwLjBmOworICAgICAgZmxvYXQgc2luYSA9IHNpbiAocHQtPmFuZ2xlKSAvIDEwMDAuMGY7CisKKyAgICAgIHgyID0gKGludCkgKHB0LT54ICsgY29zYSAqIGxpbmUtPmFtcGxpdHVkZSAqIGRhdGFbaV0pOworICAgICAgeTIgPSAoaW50KSAocHQtPnkgKyBzaW5hICogbGluZS0+YW1wbGl0dWRlICogZGF0YVtpXSk7CisKKyAgICAgIHBsdWctPm1ldGhvZHMuZHJhd19saW5lIChwLCB4MSwgeTEsIHgyLCB5MiwgY29sb3IsIGxpbmUtPnNjcmVlblgsCisgICAgICAgICAgbGluZS0+c2NyZWVuWSk7CisKKyAgICAgIHgxID0geDI7CisgICAgICB5MSA9IHkyOworICAgIH0KKyAgICBnb29tX2xpbmVzX21vdmUgKGxpbmUpOworICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvZ29vbS9saW5lcy5oIGIvZ3N0L2dvb20vbGluZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2Q1MGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vbGluZXMuaApAQCAtMCwwICsxLDk0IEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0xJTkVTX0gKKyNkZWZpbmUgX0xJTkVTX0gKKworI2luY2x1ZGUgImdvb21fdHlwZWRlZnMuaCIKKyNpbmNsdWRlICJnb29tX2dyYXBoaWMuaCIKKyNpbmNsdWRlICJnb29tX2NvbmZpZy5oIgorCitzdHJ1Y3QgX0dNVU5JVFBPSU5URVIKK3sKKwlmbG9hdCAgIHg7CisJZmxvYXQgICB5OworCWZsb2F0ICAgYW5nbGU7Cit9OworCisvKiB0YWJsZWF1IGRlIHBvaW50cyAqLworc3RydWN0IF9HTUxJTkUKK3sKKworCUdNVW5pdFBvaW50ZXIgKnBvaW50czsKKwlHTVVuaXRQb2ludGVyICpwb2ludHMyOworCWludCAgICAgSURkZXN0OworCWZsb2F0ICAgcGFyYW07CisJZmxvYXQgICBhbXBsaXR1ZGVGOworCWZsb2F0ICAgYW1wbGl0dWRlOworCisJaW50ICAgICBuYlBvaW50czsKKwlndWludDMyIGNvbG9yOyAgICAgLyogcG91ciBsJ2luc3RhbnQgamUgc3RvY2tlIGxhIGNvdWxldXIgYSB0ZXJtZSwgb24gc3RvY2tlcmEgbGUgbW9kZSBjb3VsZXVyIGV0IGwnb24gYW5pbWVyYSAqLworCWd1aW50MzIgY29sb3IyOworCisJaW50ICAgICBzY3JlZW5YOworCWludCAgICAgc2NyZWVuWTsKKworCWZsb2F0ICAgcG93ZXI7CisJZmxvYXQgICBwb3dpbmM7CisKKwlQbHVnaW5JbmZvICpnb29tSW5mbzsKK307CisKKy8qIGxlcyBJRCBwb3NzaWJsZXMgKi8KKworI2RlZmluZSBHTUxfQ0lSQ0xFIDAKKy8qIChwYXJhbSA9IHJhZGl1cykgKi8KKworI2RlZmluZSBHTUxfSExJTkUgMQorLyogKHBhcmFtID0geSkgKi8KKworI2RlZmluZSBHTUxfVkxJTkUgMgorLyogKHBhcmFtID0geCkgKi8KKworLyogbGVzIG1vZGVzIGNvdWxldXIgcG9zc2libGUgKHNpIHR1IG1ldHMgdW4gYXV0cmUgYydlc3Qgbm9pcikgKi8KKworI2RlZmluZSBHTUxfQkxFVUJMQU5DIDAKKyNkZWZpbmUgR01MX1JFRCAxCisjZGVmaW5lIEdNTF9PUkFOR0VfViAyCisjZGVmaW5lIEdNTF9PUkFOR0VfSiAzCisjZGVmaW5lIEdNTF9WRVJUIDQKKyNkZWZpbmUgR01MX0JMRVUgNQorI2RlZmluZSBHTUxfQkxBQ0sgNgorCisvKiBjb25zdHJ1aXQgdW4gZWZmZXQgZGUgbGluZSAodW5lIGxpZ25lIGhvcml0b250YWxlIHBvdXIgY29tbWVuY2VyKSAqLworR01MaW5lICpnb29tX2xpbmVzX2luaXQgKFBsdWdpbkluZm8gKmdvb21JbmZvLCBpbnQgcngsIGludCByeSwKKwkJCSBpbnQgSURzcmMsIGZsb2F0IHBhcmFtUywgaW50IG1vZGVDb3VsU3JjLAorCQkJIGludCBJRGRlc3QsIGZsb2F0IHBhcmFtRCwgaW50IG1vZGVDb3VsRGVzdCk7CisKK3ZvaWQgICAgZ29vbV9saW5lc19zd2l0Y2hfdG8gKEdNTGluZSAqIGdtbCwgaW50IElEZGVzdCwgZmxvYXQgcGFyYW0sCisJCQlmbG9hdCBhbXBsaXR1ZGUsCisJCQlpbnQgbW9kZUNvdWwpOworCit2b2lkICAgIGdvb21fbGluZXNfc2V0X3JlcyAoR01MaW5lICogZ21sLCBpbnQgcngsIGludCByeSk7CisKK3ZvaWQgICAgZ29vbV9saW5lc19mcmVlIChHTUxpbmUgKiogZ21sKTsKKwordm9pZCAgICBnb29tX2xpbmVzX2RyYXcgKFBsdWdpbkluZm8gKnBsdWdJbmZvLCBHTUxpbmUgKiBnbWwsIGdpbnQxNiBkYXRhWzUxMl0sIFBpeGVsICpwKTsKKworI2VuZGlmIC8qIF9MSU5FU19IICovCmRpZmYgLS1naXQgYS9nc3QvZ29vbS9tYXRodG9vbHMuYyBiL2dzdC9nb29tL21hdGh0b29scy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMTkwYmYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9tYXRodG9vbHMuYwpAQCAtMCwwICsxLDEwNiBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBKZWFuLUNocmlzdG9waGUgSG9lbHQgPGpla29AZnJlZS5mcj4KKyAqCisgKiBnb29tX2NvcmUuYzpDb250YWlucyB0aGUgY29yZSBvZiBnb29tJ3Mgd29yay4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAibWF0aHRvb2xzLmgiCisKK2Zsb2F0IHNpbjI1NlsyNTZdID0geworICAwLCAwLjAyNDU0MTIsIDAuMDQ5MDY3NywgMC4wNzM1NjQ2LCAwLjA5ODAxNzEsIDAuMTIyNDExLCAwLjE0NjczLCAwLjE3MDk2MiwKKyAgMC4xOTUwOSwgMC4yMTkxMDEsIDAuMjQyOTgsIDAuMjY2NzEzLCAwLjI5MDI4NSwgMC4zMTM2ODIsIDAuMzM2ODksCisgIDAuMzU5ODk1LCAwLjM4MjY4MywgMC40MDUyNDEsIDAuNDI3NTU1LCAwLjQ0OTYxMSwgMC40NzEzOTcsIDAuNDkyODk4LAorICAwLjUxNDEwMywgMC41MzQ5OTgsIDAuNTU1NTcsIDAuNTc1ODA4LCAwLjU5NTY5OSwgMC42MTUyMzIsIDAuNjM0MzkzLAorICAwLjY1MzE3MywgMC42NzE1NTksIDAuNjg5NTQxLCAwLjcwNzEwNywgMC43MjQyNDcsIDAuNzQwOTUxLCAwLjc1NzIwOSwKKyAgMC43NzMwMSwgMC43ODgzNDYsIDAuODAzMjA4LCAwLjgxNzU4NSwgMC44MzE0NywgMC44NDQ4NTQsIDAuODU3NzI5LAorICAwLjg3MDA4NywgMC44ODE5MjEsIDAuODkzMjI0LCAwLjkwMzk4OSwgMC45MTQyMSwgMC45MjM4OCwgMC45MzI5OTMsCisgIDAuOTQxNTQ0LCAwLjk0OTUyOCwgMC45NTY5NCwgMC45NjM3NzYsIDAuOTcwMDMxLCAwLjk3NTcwMiwgMC45ODA3ODUsCisgIDAuOTg1Mjc4LCAwLjk4OTE3NywgMC45OTI0OCwgMC45OTUxODUsIDAuOTk3MjksIDAuOTk4Nzk1LCAwLjk5OTY5OSwgMSwKKyAgMC45OTk2OTksIDAuOTk4Nzk1LCAwLjk5NzI5LCAwLjk5NTE4NSwgMC45OTI0OCwgMC45ODkxNzcsIDAuOTg1Mjc4LAorICAwLjk4MDc4NSwgMC45NzU3MDIsIDAuOTcwMDMxLCAwLjk2Mzc3NiwgMC45NTY5NCwgMC45NDk1MjgsIDAuOTQxNTQ0LAorICAwLjkzMjk5MywgMC45MjM4OCwgMC45MTQyMSwgMC45MDM5ODksIDAuODkzMjI0LCAwLjg4MTkyMSwgMC44NzAwODcsCisgIDAuODU3NzI5LCAwLjg0NDg1NCwgMC44MzE0NywgMC44MTc1ODUsIDAuODAzMjA4LCAwLjc4ODM0NiwgMC43NzMwMSwKKyAgMC43NTcyMDksIDAuNzQwOTUxLCAwLjcyNDI0NywgMC43MDcxMDcsIDAuNjg5NTQxLCAwLjY3MTU1OSwgMC42NTMxNzMsCisgIDAuNjM0MzkzLCAwLjYxNTIzMiwgMC41OTU2OTksIDAuNTc1ODA4LCAwLjU1NTU3LCAwLjUzNDk5OCwgMC41MTQxMDMsCisgIDAuNDkyODk4LCAwLjQ3MTM5NywgMC40NDk2MTEsIDAuNDI3NTU1LCAwLjQwNTI0MSwgMC4zODI2ODMsIDAuMzU5ODk1LAorICAwLjMzNjg5LCAwLjMxMzY4MiwgMC4yOTAyODUsIDAuMjY2NzEzLCAwLjI0Mjk4LCAwLjIxOTEwMSwgMC4xOTUwOSwKKyAgMC4xNzA5NjIsIDAuMTQ2NzMsIDAuMTIyNDExLCAwLjA5ODAxNzEsIDAuMDczNTY0NiwgMC4wNDkwNjc3LCAwLjAyNDU0MTIsCisgIDEuMjI0NjVlLTE2LCAtMC4wMjQ1NDEyLCAtMC4wNDkwNjc3LCAtMC4wNzM1NjQ2LCAtMC4wOTgwMTcxLCAtMC4xMjI0MTEsCisgIC0wLjE0NjczLCAtMC4xNzA5NjIsIC0wLjE5NTA5LCAtMC4yMTkxMDEsIC0wLjI0Mjk4LCAtMC4yNjY3MTMsIC0wLjI5MDI4NSwKKyAgLTAuMzEzNjgyLCAtMC4zMzY4OSwgLTAuMzU5ODk1LCAtMC4zODI2ODMsIC0wLjQwNTI0MSwgLTAuNDI3NTU1LAorICAtMC40NDk2MTEsIC0wLjQ3MTM5NywgLTAuNDkyODk4LCAtMC41MTQxMDMsIC0wLjUzNDk5OCwgLTAuNTU1NTcsCisgIC0wLjU3NTgwOCwgLTAuNTk1Njk5LCAtMC42MTUyMzIsIC0wLjYzNDM5MywgLTAuNjUzMTczLCAtMC42NzE1NTksCisgIC0wLjY4OTU0MSwgLTAuNzA3MTA3LCAtMC43MjQyNDcsIC0wLjc0MDk1MSwgLTAuNzU3MjA5LCAtMC43NzMwMSwKKyAgLTAuNzg4MzQ2LCAtMC44MDMyMDgsIC0wLjgxNzU4NSwgLTAuODMxNDcsIC0wLjg0NDg1NCwgLTAuODU3NzI5LAorICAtMC44NzAwODcsIC0wLjg4MTkyMSwgLTAuODkzMjI0LCAtMC45MDM5ODksIC0wLjkxNDIxLCAtMC45MjM4OCwgLTAuOTMyOTkzLAorICAtMC45NDE1NDQsIC0wLjk0OTUyOCwgLTAuOTU2OTQsIC0wLjk2Mzc3NiwgLTAuOTcwMDMxLCAtMC45NzU3MDIsCisgIC0wLjk4MDc4NSwgLTAuOTg1Mjc4LCAtMC45ODkxNzcsIC0wLjk5MjQ4LCAtMC45OTUxODUsIC0wLjk5NzI5LCAtMC45OTg3OTUsCisgIC0wLjk5OTY5OSwgLTEsIC0wLjk5OTY5OSwgLTAuOTk4Nzk1LCAtMC45OTcyOSwgLTAuOTk1MTg1LCAtMC45OTI0OCwKKyAgLTAuOTg5MTc3LCAtMC45ODUyNzgsIC0wLjk4MDc4NSwgLTAuOTc1NzAyLCAtMC45NzAwMzEsIC0wLjk2Mzc3NiwKKyAgLTAuOTU2OTQsIC0wLjk0OTUyOCwgLTAuOTQxNTQ0LCAtMC45MzI5OTMsIC0wLjkyMzg4LCAtMC45MTQyMSwgLTAuOTAzOTg5LAorICAtMC44OTMyMjQsIC0wLjg4MTkyMSwgLTAuODcwMDg3LCAtMC44NTc3MjksIC0wLjg0NDg1NCwgLTAuODMxNDcsCisgIC0wLjgxNzU4NSwgLTAuODAzMjA4LCAtMC43ODgzNDYsIC0wLjc3MzAxLCAtMC43NTcyMDksIC0wLjc0MDk1MSwKKyAgLTAuNzI0MjQ3LCAtMC43MDcxMDcsIC0wLjY4OTU0MSwgLTAuNjcxNTU5LCAtMC42NTMxNzMsIC0wLjYzNDM5MywKKyAgLTAuNjE1MjMyLCAtMC41OTU2OTksIC0wLjU3NTgwOCwgLTAuNTU1NTcsIC0wLjUzNDk5OCwgLTAuNTE0MTAzLAorICAtMC40OTI4OTgsIC0wLjQ3MTM5NywgLTAuNDQ5NjExLCAtMC40Mjc1NTUsIC0wLjQwNTI0MSwgLTAuMzgyNjgzLAorICAtMC4zNTk4OTUsIC0wLjMzNjg5LCAtMC4zMTM2ODIsIC0wLjI5MDI4NSwgLTAuMjY2NzEzLCAtMC4yNDI5OCwgLTAuMjE5MTAxLAorICAtMC4xOTUwOSwgLTAuMTcwOTYyLCAtMC4xNDY3MywgLTAuMTIyNDExLCAtMC4wOTgwMTcxLCAtMC4wNzM1NjQ2LAorICAtMC4wNDkwNjc3LCAtMC4wMjQ1NDEyCit9OworCitmbG9hdCBjb3MyNTZbMjU2XSA9IHsKKyAgMCwgMC45OTk2OTksIDAuOTk4Nzk1LCAwLjk5NzI5LCAwLjk5NTE4NSwgMC45OTI0OCwgMC45ODkxNzcsIDAuOTg1Mjc4LAorICAwLjk4MDc4NSwgMC45NzU3MDIsIDAuOTcwMDMxLCAwLjk2Mzc3NiwgMC45NTY5NCwgMC45NDk1MjgsIDAuOTQxNTQ0LAorICAwLjkzMjk5MywgMC45MjM4OCwgMC45MTQyMSwgMC45MDM5ODksIDAuODkzMjI0LCAwLjg4MTkyMSwgMC44NzAwODcsCisgIDAuODU3NzI5LCAwLjg0NDg1NCwgMC44MzE0NywgMC44MTc1ODUsIDAuODAzMjA4LCAwLjc4ODM0NiwgMC43NzMwMSwKKyAgMC43NTcyMDksIDAuNzQwOTUxLCAwLjcyNDI0NywgMC43MDcxMDcsIDAuNjg5NTQxLCAwLjY3MTU1OSwgMC42NTMxNzMsCisgIDAuNjM0MzkzLCAwLjYxNTIzMiwgMC41OTU2OTksIDAuNTc1ODA4LCAwLjU1NTU3LCAwLjUzNDk5OCwgMC41MTQxMDMsCisgIDAuNDkyODk4LCAwLjQ3MTM5NywgMC40NDk2MTEsIDAuNDI3NTU1LCAwLjQwNTI0MSwgMC4zODI2ODMsIDAuMzU5ODk1LAorICAwLjMzNjg5LCAwLjMxMzY4MiwgMC4yOTAyODUsIDAuMjY2NzEzLCAwLjI0Mjk4LCAwLjIxOTEwMSwgMC4xOTUwOSwKKyAgMC4xNzA5NjIsIDAuMTQ2NzMsIDAuMTIyNDExLCAwLjA5ODAxNzEsIDAuMDczNTY0NiwgMC4wNDkwNjc3LCAwLjAyNDU0MTIsCisgIDYuMTIzMjNlLTE3LCAtMC4wMjQ1NDEyLCAtMC4wNDkwNjc3LCAtMC4wNzM1NjQ2LCAtMC4wOTgwMTcxLCAtMC4xMjI0MTEsCisgIC0wLjE0NjczLCAtMC4xNzA5NjIsIC0wLjE5NTA5LCAtMC4yMTkxMDEsIC0wLjI0Mjk4LCAtMC4yNjY3MTMsIC0wLjI5MDI4NSwKKyAgLTAuMzEzNjgyLCAtMC4zMzY4OSwgLTAuMzU5ODk1LCAtMC4zODI2ODMsIC0wLjQwNTI0MSwgLTAuNDI3NTU1LAorICAtMC40NDk2MTEsIC0wLjQ3MTM5NywgLTAuNDkyODk4LCAtMC41MTQxMDMsIC0wLjUzNDk5OCwgLTAuNTU1NTcsCisgIC0wLjU3NTgwOCwgLTAuNTk1Njk5LCAtMC42MTUyMzIsIC0wLjYzNDM5MywgLTAuNjUzMTczLCAtMC42NzE1NTksCisgIC0wLjY4OTU0MSwgLTAuNzA3MTA3LCAtMC43MjQyNDcsIC0wLjc0MDk1MSwgLTAuNzU3MjA5LCAtMC43NzMwMSwKKyAgLTAuNzg4MzQ2LCAtMC44MDMyMDgsIC0wLjgxNzU4NSwgLTAuODMxNDcsIC0wLjg0NDg1NCwgLTAuODU3NzI5LAorICAtMC44NzAwODcsIC0wLjg4MTkyMSwgLTAuODkzMjI0LCAtMC45MDM5ODksIC0wLjkxNDIxLCAtMC45MjM4OCwgLTAuOTMyOTkzLAorICAtMC45NDE1NDQsIC0wLjk0OTUyOCwgLTAuOTU2OTQsIC0wLjk2Mzc3NiwgLTAuOTcwMDMxLCAtMC45NzU3MDIsCisgIC0wLjk4MDc4NSwgLTAuOTg1Mjc4LCAtMC45ODkxNzcsIC0wLjk5MjQ4LCAtMC45OTUxODUsIC0wLjk5NzI5LCAtMC45OTg3OTUsCisgIC0wLjk5OTY5OSwgLTEsIC0wLjk5OTY5OSwgLTAuOTk4Nzk1LCAtMC45OTcyOSwgLTAuOTk1MTg1LCAtMC45OTI0OCwKKyAgLTAuOTg5MTc3LCAtMC45ODUyNzgsIC0wLjk4MDc4NSwgLTAuOTc1NzAyLCAtMC45NzAwMzEsIC0wLjk2Mzc3NiwKKyAgLTAuOTU2OTQsIC0wLjk0OTUyOCwgLTAuOTQxNTQ0LCAtMC45MzI5OTMsIC0wLjkyMzg4LCAtMC45MTQyMSwgLTAuOTAzOTg5LAorICAtMC44OTMyMjQsIC0wLjg4MTkyMSwgLTAuODcwMDg3LCAtMC44NTc3MjksIC0wLjg0NDg1NCwgLTAuODMxNDcsCisgIC0wLjgxNzU4NSwgLTAuODAzMjA4LCAtMC43ODgzNDYsIC0wLjc3MzAxLCAtMC43NTcyMDksIC0wLjc0MDk1MSwKKyAgLTAuNzI0MjQ3LCAtMC43MDcxMDcsIC0wLjY4OTU0MSwgLTAuNjcxNTU5LCAtMC42NTMxNzMsIC0wLjYzNDM5MywKKyAgLTAuNjE1MjMyLCAtMC41OTU2OTksIC0wLjU3NTgwOCwgLTAuNTU1NTcsIC0wLjUzNDk5OCwgLTAuNTE0MTAzLAorICAtMC40OTI4OTgsIC0wLjQ3MTM5NywgLTAuNDQ5NjExLCAtMC40Mjc1NTUsIC0wLjQwNTI0MSwgLTAuMzgyNjgzLAorICAtMC4zNTk4OTUsIC0wLjMzNjg5LCAtMC4zMTM2ODIsIC0wLjI5MDI4NSwgLTAuMjY2NzEzLCAtMC4yNDI5OCwgLTAuMjE5MTAxLAorICAtMC4xOTUwOSwgLTAuMTcwOTYyLCAtMC4xNDY3MywgLTAuMTIyNDExLCAtMC4wOTgwMTcxLCAtMC4wNzM1NjQ2LAorICAtMC4wNDkwNjc3LCAtMC4wMjQ1NDEyLCAtMS44MzY5N2UtMTYsIDAuMDI0NTQxMiwgMC4wNDkwNjc3LCAwLjA3MzU2NDYsCisgIDAuMDk4MDE3MSwgMC4xMjI0MTEsIDAuMTQ2NzMsIDAuMTcwOTYyLCAwLjE5NTA5LCAwLjIxOTEwMSwgMC4yNDI5OCwKKyAgMC4yNjY3MTMsIDAuMjkwMjg1LCAwLjMxMzY4MiwgMC4zMzY4OSwgMC4zNTk4OTUsIDAuMzgyNjgzLCAwLjQwNTI0MSwKKyAgMC40Mjc1NTUsIDAuNDQ5NjExLCAwLjQ3MTM5NywgMC40OTI4OTgsIDAuNTE0MTAzLCAwLjUzNDk5OCwgMC41NTU1NywKKyAgMC41NzU4MDgsIDAuNTk1Njk5LCAwLjYxNTIzMiwgMC42MzQzOTMsIDAuNjUzMTczLCAwLjY3MTU1OSwgMC42ODk1NDEsCisgIDAuNzA3MTA3LCAwLjcyNDI0NywgMC43NDA5NTEsIDAuNzU3MjA5LCAwLjc3MzAxLCAwLjc4ODM0NiwgMC44MDMyMDgsCisgIDAuODE3NTg1LCAwLjgzMTQ3LCAwLjg0NDg1NCwgMC44NTc3MjksIDAuODcwMDg3LCAwLjg4MTkyMSwgMC44OTMyMjQsCisgIDAuOTAzOTg5LCAwLjkxNDIxLCAwLjkyMzg4LCAwLjkzMjk5MywgMC45NDE1NDQsIDAuOTQ5NTI4LCAwLjk1Njk0LAorICAwLjk2Mzc3NiwgMC45NzAwMzEsIDAuOTc1NzAyLCAwLjk4MDc4NSwgMC45ODUyNzgsIDAuOTg5MTc3LCAwLjk5MjQ4LAorICAwLjk5NTE4NSwgMC45OTcyOSwgMC45OTg3OTUsIDAuOTk5Njk5Cit9OwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vbWF0aHRvb2xzLmggYi9nc3QvZ29vbS9tYXRodG9vbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzQwZGFiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vbWF0aHRvb2xzLmgKQEAgLTAsMCArMSw1OCBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBKZWFuLUNocmlzdG9waGUgSG9lbHQgPGpla29AZnJlZS5mcj4KKyAqCisgKiBnb29tX2NvcmUuYzpDb250YWlucyB0aGUgY29yZSBvZiBnb29tJ3Mgd29yay4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisgI2lmbmRlZiBNQVRIVE9PTFNfSAorI2RlZmluZSBNQVRIVE9PTFNfSAorCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjZGVmaW5lIF9kb3VibGUyZml4bWFnaWMgKDY4NzE5NDc2NzM2LjAqMS41KQorLyogMl4zNiAqIDEuNSwgICg1Mi1fc2hpZnRhbXQ9MzYpIHVzZXMgbGltaXRlZCBwcmVjaXNpY2lvbiB0byBmbG9vciAqLworI2RlZmluZSBfc2hpZnRhbXQgMTYKKy8qIDE2LjE2IGZpeGVkIHBvaW50IHJlcHJlc2VudGF0aW9uICovCisKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19CSUdfRU5ESUFOCisjZGVmaW5lIGlleHBfCQkJCTAKKyNkZWZpbmUgaW1hbl8JCQkJMQorI2Vsc2UKKyNkZWZpbmUgaWV4cF8JCQkJMQorI2RlZmluZSBpbWFuXwkJCQkwCisjZW5kaWYgLyogQmlnRW5kaWFuXyAqLworCisvKiBUT0RPOiB0aGlzIG9wdGltaXphdGlvbiBpcyB2ZXJ5IGVmZmljaWVudDogcHV0IGl0IGFnYWluIHdoZW4gYWxsIHdvcmtzCisjaWZkZWYgSEFWRV9NTVgKKyNkZWZpbmUgRjJJKGRibCxpKSB7ZG91YmxlIGQgPSBkYmwgKyBfZG91YmxlMmZpeG1hZ2ljOyBpID0gKChpbnQqKSZkKVtpbWFuX10gPj4gX3NoaWZ0YW10O30KKyNlbHNlKi8KKyNkZWZpbmUgRjJJKGRibCxpKSBpPShpbnQpZGJsOworLyojZW5kaWYqLworCisjaWYgMAorI2RlZmluZSBTSU5DT1MoZixzLGMpIFwKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJmc2luY29zIiA6ICI9dCIgKGMpLCAiPXUiIChzKSA6ICIwIiAoZikpCisjZWxzZQorI2RlZmluZSBTSU5DT1MoZixzLGMpIHtzPXNpbihmKTtjPWNvcyhmKTt9CisjZW5kaWYKKworZXh0ZXJuIGZsb2F0IHNpbjI1NlsyNTZdOworZXh0ZXJuIGZsb2F0IGNvczI1NlsyNTZdOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vbWVzb24uYnVpbGQgYi9nc3QvZ29vbS9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2Q4M2EzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vbWVzb24uYnVpbGQKQEAgLTAsMCArMSwyOSBAQAorZ29vbV9zb3VyY2VzID0gWworICAnZ3N0Z29vbS5jJywKKyAgJ2RyYXdtZXRob2RzLmMnLAorICAnc291bmRfdGVzdGVyLmMnLAorICAnbWF0aHRvb2xzLmMnLAorICAnbGluZXMuYycsCisgICdpZnMuYycsCisgICdzdXJmM2QuYycsCisgICd0ZW50YWNsZTNkLmMnLAorICAndjNkLmMnLAorICAnY29udm9sdmVfZnguYycsCisgICdmbHlpbmdfc3RhcnNfZnguYycsCisgICdwbHVnaW5faW5mby5jJywKKyAgJ2dvb21fdG9vbHMuYycsCisgICdjb25maWdfcGFyYW0uYycsCisgICdmaWx0ZXJzLmMnLAorICAnZ29vbV9jb3JlLmMnLAorICAnZ3JhcGhpYy5jJywKK10KKworCitnc3Rnb29tID0gbGlicmFyeSgnZ3N0Z29vbScsCisgIGdvb21fc291cmNlcywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgIGRlcGVuZGVuY2llcyA6IFtnc3RfZGVwLCBnc3RwYnV0aWxzX2RlcCwgZ3N0YmFzZV9kZXAsIG9yY19kZXAsIGxpYm1dLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vbW14LmMgYi9nc3QvZ29vbS9tbXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzJhNmM0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vbW14LmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qCW1teC5jCisKKwlNdWx0aU1lZGlhIGVYdGVuc2lvbnMgR0NDIGludGVyZmFjZSBsaWJyYXJ5IGZvciBJQTMyLgorCisJVG8gdXNlIHRoaXMgbGlicmFyeSwgc2ltcGx5IGluY2x1ZGUgdGhpcyBoZWFkZXIgZmlsZQorCWFuZCBjb21waWxlIHdpdGggR0NDLiAgWW91IE1VU1QgaGF2ZSBpbmxpbmluZyBlbmFibGVkCisJaW4gb3JkZXIgZm9yIG1teF9vaygpIHRvIHdvcms7IHRoaXMgY2FuIGJlIGRvbmUgYnkKKwlzaW1wbHkgdXNpbmcgLU8gb24gdGhlIEdDQyBjb21tYW5kIGxpbmUuCisKKwlDb21waWxpbmcgd2l0aCAtRE1NWF9UUkFDRSB3aWxsIGNhdXNlIGRldGFpbGVkIHRyYWNlCisJb3V0cHV0IHRvIGJlIHNlbnQgdG8gc3RkZXJyIGZvciBlYWNoIG1teCBvcGVyYXRpb24uCisJVGhpcyBhZGRzIGxvdHMgb2YgY29kZSwgYW5kIG9idmlvdXNseSBzbG93cyBleGVjdXRpb24gdG8KKwlhIGNyYXdsLCBidXQgY2FuIGJlIHZlcnkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuCisKKwlUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkKKwlFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUCisJTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKKwlBTkQgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworCTE5OTctOTkgYnkgSC4gRGlldHogYW5kIFIuIEZpc2hlcgorCisgTm90ZXM6CisJSXQgYXBwZWFycyB0aGF0IHRoZSBsYXRlc3QgZ2FzIGhhcyB0aGUgcGFuZCBwcm9ibGVtIGZpeGVkLCB0aGVyZWZvcmUKKwkgIEknbGwgdW5kZWZpbmUgQlJPS0VOX1BBTkQgYnkgZGVmYXVsdC4KKyovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdvb21fY29uZmlnLmgiCisKKyNpZmRlZiBIQVZFX01NWAorCisjZGVmaW5lIEJVRkZQT0lOVE5CIDE2CisjZGVmaW5lIEJVRkZQT0lOVE1BU0sgMHhmZmZmCisjZGVmaW5lIEJVRkZJTkNSIDB4ZmYKKworI2luY2x1ZGUgIm1teC5oIgorI2luY2x1ZGUgImdvb21fZ3JhcGhpYy5oIgorCisjZGVmaW5lIHNxcnRwZXJ0ZSAxNgorLy8gZmFpcmUgOiBhICUgc3FydHBlcnRlIDw9PiBhICYgcGVydGVtYXNrCisjZGVmaW5lIFBFUlRFTUFTSyAweGYKKy8vIGZhaXJlIDogYSAvIHNxcnRwZXJ0ZSA8PT4gYSA+PiBQRVJURURFQworI2RlZmluZSBQRVJURURFQyA0CisKK2ludAorbW14X3N1cHBvcnRlZCAodm9pZCkKK3sKKyAgcmV0dXJuIChtbV9zdXBwb3J0ICgpICYgMHgxKTsKK30KKwordm9pZAorem9vbV9maWx0ZXJfbW14IChpbnQgcHJldlgsIGludCBwcmV2WSwKKyAgICBQaXhlbCAqIGV4cGl4MSwgUGl4ZWwgKiBleHBpeDIsCisgICAgaW50ICpicnV0UywgaW50ICpicnV0RCwgaW50IGJ1ZmZyYXRpbywgaW50IHByZWNhbENvZWZbMTZdWzE2XSkKK3sKKyAgdW5zaWduZWQgaW50IGF4ID0gKHByZXZYIC0gMSkgPDwgUEVSVEVERUMsIGF5ID0gKHByZXZZIC0gMSkgPDwgUEVSVEVERUM7CisKKyAgaW50IGJ1ZnNpemUgPSBwcmV2WCAqIHByZXZZOworICBpbnQgbG9vcDsKKworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInB4b3IgJW1tNywlbW03Iik7CisKKyAgZm9yIChsb29wID0gMDsgbG9vcCA8IGJ1ZnNpemU7IGxvb3ArKykgeworICAgIC8qICAgICAgaW50IGNvdWxldXI7ICovCisgICAgaW50IHB4LCBweTsKKyAgICBpbnQgcG9zOworICAgIGludCBjb2VmZnM7CisKKyAgICBpbnQgbXlQb3MgPSBsb29wIDw8IDEsIG15UG9zMiA9IG15UG9zICsgMTsKKyAgICBpbnQgYnJ1dFNteXBvcyA9IGJydXRTW215UG9zXTsKKworICAgIHB4ID0gYnJ1dFNteXBvcyArICgoKGJydXREW215UG9zXSAtCisgICAgICAgICAgICAgICAgYnJ1dFNteXBvcykgKiBidWZmcmF0aW8pID4+IEJVRkZQT0lOVE5CKTsKKyAgICBicnV0U215cG9zID0gYnJ1dFNbbXlQb3MyXTsKKyAgICBweSA9IGJydXRTbXlwb3MgKyAoKChicnV0RFtteVBvczJdIC0KKyAgICAgICAgICAgICAgICBicnV0U215cG9zKSAqIGJ1ZmZyYXRpbykgPj4gQlVGRlBPSU5UTkIpOworCisgICAgaWYgKChweSA+PSBheSkgfHwgKHB4ID49IGF4KSkgeworICAgICAgcG9zID0gY29lZmZzID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgcG9zID0gKChweCA+PiBQRVJURURFQykgKyBwcmV2WCAqIChweSA+PiBQRVJURURFQykpOworICAgICAgLy8gY29lZiBlbiBtb2R1bG8gMTUKKyAgICAgIGNvZWZmcyA9IHByZWNhbENvZWZbcHggJiBQRVJURU1BU0tdW3B5ICYgUEVSVEVNQVNLXTsKKyAgICB9CisKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmQgJTIsICUlbW02IFxuXHQiCisgICAgICAgIC8qIHJlY3VwZXJhdGlvbiBkZXMgZGV1eCBwcmVtaWVycyBwaXhlbHMgZGFucyBtbTAgZXQgbW0xICovCisgICAgICAgICJtb3ZxICglMywlMSw0KSwgJSVtbTAgXG5cdCIgICAgLyogYjEtdjEtcjEtYTEtYjItdjItcjItYTIgKi8KKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0xIFxuXHQiICAgICAgICAvKiBiMS12MS1yMS1hMS1iMi12Mi1yMi1hMiAqLworICAgICAgICAvKiBkZXBhY2thZ2UgZHUgcHJlbWllciBwaXhlbCAqLworICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMCBcblx0IiAgIC8qIDAwLWIyLTAwLXYyLTAwLXIyLTAwLWEyICovCisgICAgICAgICJtb3ZxICUlbW02LCAlJW1tNSBcblx0IiAgICAgICAgLyogPz8tPz8tPz8tPz8tYzQtYzMtYzItYzEgKi8KKyAgICAgICAgLyogZGVwYWNrYWdlIGR1IDJpZW1lIHBpeGVsICovCisgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW0xIFxuXHQiICAgLyogMDAtYjEtMDAtdjEtMDAtcjEtMDAtYTEgKi8KKyAgICAgICAgLyogZXh0cmFjdGlvbiBkZXMgY29lZmZpY2llbnRzLi4uICovCisgICAgICAgICJwdW5wY2tsYncgJSVtbTUsICUlbW02IFxuXHQiICAgLyogYzQtYzQtYzMtYzMtYzItYzItYzEtYzEgKi8KKyAgICAgICAgIm1vdnEgJSVtbTYsICUlbW00IFxuXHQiICAgICAgICAvKiBjNC1jNC1jMy1jMy1jMi1jMi1jMS1jMSAqLworICAgICAgICAibW92cSAlJW1tNiwgJSVtbTUgXG5cdCIgICAgICAgIC8qIGM0LWM0LWMzLWMzLWMyLWMyLWMxLWMxICovCisgICAgICAgICJwdW5wY2tsYncgJSVtbTUsICUlbW02IFxuXHQiICAgLyogYzItYzItYzItYzItYzEtYzEtYzEtYzEgKi8KKyAgICAgICAgInB1bnBja2hidyAlJW1tNSwgJSVtbTQgXG5cdCIgICAvKiBjNC1jNC1jNC1jNC1jMy1jMy1jMy1jMyAqLworICAgICAgICAibW92cSAlJW1tNiwgJSVtbTMgXG5cdCIgICAgICAgIC8qIGMyLWMyLWMyLWMyLWMxLWMxLWMxLWMxICovCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW02IFxuXHQiICAgLyogMDAtYzEtMDAtYzEtMDAtYzEtMDAtYzEgKi8KKyAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTMgXG5cdCIgICAvKiAwMC1jMi0wMC1jMi0wMC1jMi0wMC1jMiAqLworICAgICAgICAvKiBtdWx0aXBsaWNhdGlvbiBkZXMgcGl4ZWxzIHBhciBsZXMgY29lZmZpY2llbnRzICovCisgICAgICAgICJwbXVsbHcgJSVtbTYsICUlbW0wIFxuXHQiICAgICAgLyogYzEqYjItYzEqdjItYzEqcjItYzEqYTIgKi8KKyAgICAgICAgInBtdWxsdyAlJW1tMywgJSVtbTEgXG5cdCIgICAgICAvKiBjMipiMS1jMip2MS1jMipyMS1jMiphMSAqLworICAgICAgICAicGFkZHcgJSVtbTEsICUlbW0wIFxuXHQiCisgICAgICAgIC8qIC4uLmV4dHJhY3Rpb24gZGVzIDIgZGVybmllcnMgY29lZmZpY2llbnRzICovCisgICAgICAgICJtb3ZxICUlbW00LCAlJW1tNSBcblx0IiAgICAgICAgLyogYzQtYzQtYzQtYzQtYzMtYzMtYzMtYzMgKi8KKyAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTQgXG5cdCIgICAvKiAwMC1jMy0wMC1jMy0wMC1jMy0wMC1jMyAqLworICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tNSBcblx0IiAgIC8qIDAwLWM0LTAwLWM0LTAwLWM0LTAwLWM0ICovCisgICAgICAgIC8qIGFqb3V0ZXIgbGEgbG9uZ3VldXIgZGUgbGlnbmUgYSBlc2kgKi8KKyAgICAgICAgImFkZGwgOCglJWVicCksJTEgXG5cdCIKKyAgICAgICAgLyogcmVjdXBlcmF0aW9uIGRlcyAyIGRlcm5pZXJzIHBpeGVscyAqLworICAgICAgICAibW92cSAoJTMsJTEsNCksICUlbW0xIFxuXHQiICJtb3ZxICUlbW0xLCAlJW1tMiBcblx0IgorICAgICAgICAvKiBkZXBhY2thZ2UgZGVzIHBpeGVscyAqLworICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMSBcblx0IiAicHVucGNraGJ3ICUlbW03LCAlJW1tMiBcblx0IgorICAgICAgICAvKiBtdWx0aXBsaWNhdGlvbiBwYXMgbGVzIGNvZWZmcyAqLworICAgICAgICAicG11bGx3ICUlbW00LCAlJW1tMSBcblx0IiAicG11bGx3ICUlbW01LCAlJW1tMiBcblx0IgorICAgICAgICAvKiBham91dCBkZXMgdmFsZXVycyBvYnRlbnVlcyA/IGxhIHZhbGV1ciBmaW5hbGUgKi8KKyAgICAgICAgInBhZGR3ICUlbW0xLCAlJW1tMCBcblx0IiAicGFkZHcgJSVtbTIsICUlbW0wIFxuXHQiCisgICAgICAgIC8qIGRpdmlzaW9uIHBhciAyNTYgPSAxNisxNisxNisxNiwgcHVpcyByZXBhY2thZ2UgZHUgcGl4ZWwgZmluYWwgKi8KKyAgICAgICAgInBzcmx3ICQ4LCAlJW1tMCBcblx0IgorICAgICAgICAicGFja3Vzd2IgJSVtbTcsICUlbW0wIFxuXHQiICJtb3ZkICUlbW0wLCUwIFxuXHQiOiI9ZyIgKGV4cGl4Mltsb29wXSkKKyAgICAgICAgOiJyIiAocG9zKSwgInIiIChjb2VmZnMpLCAiciIgKGV4cGl4MSkKKworICAgICAgICApOworCisgICAgZW1tcyAoKTsKKyAgfQorfQorCisjZGVmaW5lIERSQVdNRVRIT0RfUExVU19NTVgoX291dCxfYmFja2J1ZixfY29sKSBcCit7IFwKKwltb3ZkX20ycihfYmFja2J1ZiwgbW0wKTsgXAorCXBhZGR1c2JfbTJyKF9jb2wsIG1tMCk7IFwKKwltb3ZkX3IybShtbTAsIF9vdXQpOyBcCit9CisKKyNkZWZpbmUgRFJBV01FVEhPRCBEUkFXTUVUSE9EX1BMVVNfTU1YKCpwLCpwLGNvbCkKKwordm9pZAorZHJhd19saW5lX21teCAoUGl4ZWwgKiBkYXRhLCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIsIGludCBjb2wsCisgICAgaW50IHNjcmVlbngsIGludCBzY3JlZW55KQoreworICBpbnQgeCwgeSwgZHgsIGR5LCB5eSwgeHg7CisgIFBpeGVsICpwOworCisgIGlmICgoeTEgPCAwKSB8fCAoeTIgPCAwKSB8fCAoeDEgPCAwKSB8fCAoeDIgPCAwKSB8fCAoeTEgPj0gc2NyZWVueSkKKyAgICAgIHx8ICh5MiA+PSBzY3JlZW55KSB8fCAoeDEgPj0gc2NyZWVueCkgfHwgKHgyID49IHNjcmVlbngpKQorICAgIGdvdG8gZW5kX29mX2xpbmU7CisKKyAgZHggPSB4MiAtIHgxOworICBkeSA9IHkyIC0geTE7CisgIGlmICh4MSA+PSB4MikgeworICAgIGludCB0bXA7CisKKyAgICB0bXAgPSB4MTsKKyAgICB4MSA9IHgyOworICAgIHgyID0gdG1wOworICAgIHRtcCA9IHkxOworICAgIHkxID0geTI7CisgICAgeTIgPSB0bXA7CisgICAgZHggPSB4MiAtIHgxOworICAgIGR5ID0geTIgLSB5MTsKKyAgfQorCisgIC8qIHZlcnRpY2FsIGxpbmUgKi8KKyAgaWYgKGR4ID09IDApIHsKKyAgICBpZiAoeTEgPCB5MikgeworICAgICAgcCA9ICYoZGF0YVsoc2NyZWVueCAqIHkxKSArIHgxXSk7CisgICAgICBmb3IgKHkgPSB5MTsgeSA8PSB5MjsgeSsrKSB7CisgICAgICAgIERSQVdNRVRIT0Q7CisgICAgICAgIHAgKz0gc2NyZWVueDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcCA9ICYoZGF0YVsoc2NyZWVueCAqIHkyKSArIHgxXSk7CisgICAgICBmb3IgKHkgPSB5MjsgeSA8PSB5MTsgeSsrKSB7CisgICAgICAgIERSQVdNRVRIT0Q7CisgICAgICAgIHAgKz0gc2NyZWVueDsKKyAgICAgIH0KKyAgICB9CisgICAgZ290byBlbmRfb2ZfbGluZTsKKyAgfQorICAvKiBob3Jpem9udGFsIGxpbmUgKi8KKyAgaWYgKGR5ID09IDApIHsKKyAgICBpZiAoeDEgPCB4MikgeworICAgICAgcCA9ICYoZGF0YVsoc2NyZWVueCAqIHkxKSArIHgxXSk7CisgICAgICBmb3IgKHggPSB4MTsgeCA8PSB4MjsgeCsrKSB7CisgICAgICAgIERSQVdNRVRIT0Q7CisgICAgICAgIHArKzsKKyAgICAgIH0KKyAgICAgIGdvdG8gZW5kX29mX2xpbmU7CisgICAgfSBlbHNlIHsKKyAgICAgIHAgPSAmKGRhdGFbKHNjcmVlbnggKiB5MSkgKyB4Ml0pOworICAgICAgZm9yICh4ID0geDI7IHggPD0geDE7IHgrKykgeworICAgICAgICBEUkFXTUVUSE9EOworICAgICAgICBwKys7CisgICAgICB9CisgICAgICBnb3RvIGVuZF9vZl9saW5lOworICAgIH0KKyAgfQorICAvKiAxICAgICovCisgIC8qICBcICAgKi8KKyAgLyogICBcICAqLworICAvKiAgICAyICovCisgIGlmICh5MiA+IHkxKSB7CisgICAgLyogc3RlZXAgKi8KKyAgICBpZiAoZHkgPiBkeCkgeworICAgICAgZHggPSAoKGR4IDw8IDE2KSAvIGR5KTsKKyAgICAgIHggPSB4MSA8PCAxNjsKKyAgICAgIGZvciAoeSA9IHkxOyB5IDw9IHkyOyB5KyspIHsKKyAgICAgICAgeHggPSB4ID4+IDE2OworICAgICAgICBwID0gJihkYXRhWyhzY3JlZW54ICogeSkgKyB4eF0pOworICAgICAgICBEUkFXTUVUSE9EOworICAgICAgICBpZiAoeHggPCAoc2NyZWVueCAtIDEpKSB7CisgICAgICAgICAgcCsrOworICAgICAgICAgIC8qIERSQVdNRVRIT0Q7ICovCisgICAgICAgIH0KKyAgICAgICAgeCArPSBkeDsKKyAgICAgIH0KKyAgICAgIGdvdG8gZW5kX29mX2xpbmU7CisgICAgfQorICAgIC8qIHNoYWxsb3cgKi8KKyAgICBlbHNlIHsKKyAgICAgIGR5ID0gKChkeSA8PCAxNikgLyBkeCk7CisgICAgICB5ID0geTEgPDwgMTY7CisgICAgICBmb3IgKHggPSB4MTsgeCA8PSB4MjsgeCsrKSB7CisgICAgICAgIHl5ID0geSA+PiAxNjsKKyAgICAgICAgcCA9ICYoZGF0YVsoc2NyZWVueCAqIHl5KSArIHhdKTsKKyAgICAgICAgRFJBV01FVEhPRDsKKyAgICAgICAgaWYgKHl5IDwgKHNjcmVlbnkgLSAxKSkgeworICAgICAgICAgIHAgKz0gc2NyZWVueTsKKyAgICAgICAgICAvKiBEUkFXTUVUSE9EOyAqLworICAgICAgICB9CisgICAgICAgIHkgKz0gZHk7CisgICAgICB9CisgICAgfQorICB9CisgIC8qICAgIDIgKi8KKyAgLyogICAvICAqLworICAvKiAgLyAgICovCisgIC8qIDEgICAgKi8KKyAgZWxzZSB7CisgICAgLyogc3RlZXAgKi8KKyAgICBpZiAoLWR5ID4gZHgpIHsKKyAgICAgIGR4ID0gKChkeCA8PCAxNikgLyAtZHkpOworICAgICAgeCA9ICh4MSArIDEpIDw8IDE2OworICAgICAgZm9yICh5ID0geTE7IHkgPj0geTI7IHktLSkgeworICAgICAgICB4eCA9IHggPj4gMTY7CisgICAgICAgIHAgPSAmKGRhdGFbKHNjcmVlbnggKiB5KSArIHh4XSk7CisgICAgICAgIERSQVdNRVRIT0Q7CisgICAgICAgIGlmICh4eCA8IChzY3JlZW54IC0gMSkpIHsKKyAgICAgICAgICBwLS07CisgICAgICAgICAgLyogRFJBV01FVEhPRDsgKi8KKyAgICAgICAgfQorICAgICAgICB4ICs9IGR4OworICAgICAgfQorICAgICAgZ290byBlbmRfb2ZfbGluZTsKKyAgICB9CisgICAgLyogc2hhbGxvdyAqLworICAgIGVsc2UgeworICAgICAgZHkgPSAoKGR5IDw8IDE2KSAvIGR4KTsKKyAgICAgIHkgPSB5MSA8PCAxNjsKKyAgICAgIGZvciAoeCA9IHgxOyB4IDw9IHgyOyB4KyspIHsKKyAgICAgICAgeXkgPSB5ID4+IDE2OworICAgICAgICBwID0gJihkYXRhWyhzY3JlZW54ICogeXkpICsgeF0pOworICAgICAgICBEUkFXTUVUSE9EOworICAgICAgICBpZiAoeXkgPCAoc2NyZWVueSAtIDEpKSB7CisgICAgICAgICAgcCArPSBzY3JlZW55OworICAgICAgICAgIC8qIERSQVdNRVRIT0Q7ICovCisgICAgICAgIH0KKyAgICAgICAgeSArPSBkeTsKKyAgICAgIH0KKyAgICAgIGdvdG8gZW5kX29mX2xpbmU7CisgICAgfQorICB9CitlbmRfb2ZfbGluZToKKyAgZW1tcyAoKTsKKyAgLyogX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlbW1zIik7ICovCit9CisjZWxzZQoraW50CittbXhfc3VwcG9ydGVkICh2b2lkKQoreworICByZXR1cm4gKDApOworfQorI2VuZGlmIC8qIEhBVkVfTU1YICovCmRpZmYgLS1naXQgYS9nc3QvZ29vbS9tbXguaCBiL2dzdC9nb29tL21teC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NDllMTAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9tbXguaApAQCAtMCwwICsxLDc0MSBAQAorLyoJbW14LmgKKworCU11bHRpTWVkaWEgZVh0ZW5zaW9ucyBHQ0MgaW50ZXJmYWNlIGxpYnJhcnkgZm9yIElBMzIuCisKKwlUbyB1c2UgdGhpcyBsaWJyYXJ5LCBzaW1wbHkgaW5jbHVkZSB0aGlzIGhlYWRlciBmaWxlCisJYW5kIGNvbXBpbGUgd2l0aCBHQ0MuICBZb3UgTVVTVCBoYXZlIGlubGluaW5nIGVuYWJsZWQKKwlpbiBvcmRlciBmb3IgbW14X29rKCkgdG8gd29yazsgdGhpcyBjYW4gYmUgZG9uZSBieQorCXNpbXBseSB1c2luZyAtTyBvbiB0aGUgR0NDIGNvbW1hbmQgbGluZS4KKworCUNvbXBpbGluZyB3aXRoIC1ETU1YX1RSQUNFIHdpbGwgY2F1c2UgZGV0YWlsZWQgdHJhY2UKKwlvdXRwdXQgdG8gYmUgc2VudCB0byBzdGRlcnIgZm9yIGVhY2ggbW14IG9wZXJhdGlvbi4KKwlUaGlzIGFkZHMgbG90cyBvZiBjb2RlLCBhbmQgb2J2aW91c2x5IHNsb3dzIGV4ZWN1dGlvbiB0bworCWEgY3Jhd2wsIGJ1dCBjYW4gYmUgdmVyeSB1c2VmdWwgZm9yIGRlYnVnZ2luZy4KKworCVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWQorCUVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKKwlMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQorCUFORCBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFLgorCisJMTk5Ny05OSBieSBILiBEaWV0eiBhbmQgUi4gRmlzaGVyCisKKyBOb3RlczoKKwlJdCBhcHBlYXJzIHRoYXQgdGhlIGxhdGVzdCBnYXMgaGFzIHRoZSBwYW5kIHByb2JsZW0gZml4ZWQsIHRoZXJlZm9yZQorCSAgSSdsbCB1bmRlZmluZSBCUk9LRU5fUEFORCBieSBkZWZhdWx0LgorKi8KKworI2lmbmRlZiBfTU1YX0gKKyNkZWZpbmUgX01NWF9ICisKKyNpbmNsdWRlICJnb29tX2dyYXBoaWMuaCIKKworLyoJV2FybmluZzogIGF0IHRoaXMgd3JpdGluZywgdGhlIHZlcnNpb24gb2YgR0FTIHBhY2thZ2VkCisJd2l0aCBtb3N0IExpbnV4IGRpc3RyaWJ1dGlvbnMgZG9lcyBub3QgaGFuZGxlIHRoZQorCXBhcmFsbGVsIEFORCBvcGVyYXRpb24gbW5lbW9uaWMgY29ycmVjdGx5LiAgSWYgdGhlCisJc3ltYm9sIEJST0tFTl9QQU5EIGlzIGRlZmluZWQsIGEgc2xvd2VyIGFsdGVybmF0aXZlCisJY29kaW5nIHdpbGwgYmUgdXNlZC4gIElmIGV4ZWN1dGlvbiBvZiBtbXh0ZXN0IHJlc3VsdHMKKwlpbiBhbiBpbGxlZ2FsIGluc3RydWN0aW9uIGZhdWx0LCBkZWZpbmUgdGhpcyBzeW1ib2wuCisqLworI3VuZGVmCUJST0tFTl9QQU5ECisKKworLyoJVGhlIHR5cGUgb2YgYW4gdmFsdWUgdGhhdCBmaXRzIGluIGFuIE1NWCByZWdpc3RlcgorCShub3RlIHRoYXQgbG9uZyBsb25nIGNvbnN0YW50IHZhbHVlcyBNVVNUIGJlIHN1ZmZpeGVkCisJIGJ5IExMIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWVzIGJ5IFVMTCwgbGVzdAorCSB0aGV5IGJlIHRydW5jYXRlZCBieSB0aGUgY29tcGlsZXIpCisqLwordHlwZWRlZgl1bmlvbiB7CisJbG9uZyBsb25nCQlxOwkvKiBRdWFkd29yZCAoNjQtYml0KSB2YWx1ZSAqLworCXVuc2lnbmVkIGxvbmcgbG9uZwl1cTsJLyogVW5zaWduZWQgUXVhZHdvcmQgKi8KKwlpbnQJCQlkWzJdOwkvKiAyIERvdWJsZXdvcmQgKDMyLWJpdCkgdmFsdWVzICovCisJdW5zaWduZWQgaW50CQl1ZFsyXTsJLyogMiBVbnNpZ25lZCBEb3VibGV3b3JkICovCisJc2hvcnQJCQl3WzRdOwkvKiA0IFdvcmQgKDE2LWJpdCkgdmFsdWVzICovCisJdW5zaWduZWQgc2hvcnQJCXV3WzRdOwkvKiA0IFVuc2lnbmVkIFdvcmQgKi8KKwljaGFyCQkJYls4XTsJLyogOCBCeXRlICg4LWJpdCkgdmFsdWVzICovCisJdW5zaWduZWQgY2hhcgkJdWJbOF07CS8qIDggVW5zaWduZWQgQnl0ZSAqLworCWZsb2F0CQkJc1syXTsJLyogU2luZ2xlLXByZWNpc2lvbiAoMzItYml0KSB2YWx1ZSAqLworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoOCkpKSBtbXhfdDsJLyogT24gYW4gOC1ieXRlICg2NC1iaXQpIGJvdW5kYXJ5ICovCisKKworCisvKglGdW5jdGlvbiB0byB0ZXN0IGlmIG11bHRpbWVkaWEgaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQuLi4KKyovCitzdGF0aWMgaW50CittbV9zdXBwb3J0KHZvaWQpCit7CisJLyogUmV0dXJucyAxIGlmIE1NWCBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZCwKKwkgICAzIGlmIEN5cml4IE1NWCBhbmQgRXh0ZW5kZWQgTU1YIGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkCisJICAgNSBpZiBBTUQgTU1YIGFuZCAzRE5vdyEgaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQKKwkJIDEzIGlmIEFNRCBFeHRlbmRlZCBNTVgsICYzZE5vdyBzdXBwb3J0ZWQKKwkgICAwIGlmIGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgYW55IG9mIHRoZXNlCisJKi8KKwlyZWdpc3RlciBpbnQgcnZhbCA9IDA7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCS8qIFNlZSBpZiBDUFVJRCBpbnN0cnVjdGlvbiBpcyBzdXBwb3J0ZWQgLi4uICovCisJCS8qIC4uLiBHZXQgY29waWVzIG9mIEVGTEFHUyBpbnRvIGVheCBhbmQgZWN4ICovCisgICAgInB1c2hsICUlZWJ4XG5cdCIKKwkJInB1c2hmXG5cdCIKKwkJInBvcGwgJSVlYXhcblx0IgorCQkibW92bCAlJWVheCwgJSVlY3hcblx0IgorCisJCS8qIC4uLiBUb2dnbGUgdGhlIElEIGJpdCBpbiBvbmUgY29weSBhbmQgc3RvcmUgKi8KKwkJLyogICAgIHRvIHRoZSBFRkxBR1MgcmVnICovCisJCSJ4b3JsICQweDIwMDAwMCwgJSVlYXhcblx0IgorCQkicHVzaCAlJWVheFxuXHQiCisJCSJwb3BmXG5cdCIKKworCQkvKiAuLi4gR2V0IHRoZSAoaG9wZWZ1bGx5IG1vZGlmaWVkKSBFRkxBR1MgKi8KKwkJInB1c2hmXG5cdCIKKwkJInBvcGwgJSVlYXhcblx0IgorCisJCS8qIC4uLiBDb21wYXJlIGFuZCB0ZXN0IHJlc3VsdCAqLworCQkieG9ybCAlJWVheCwgJSVlY3hcblx0IgorCQkidGVzdGwgJDB4MjAwMDAwLCAlJWVjeFxuXHQiCisJCSJqeiBOb3RTdXBwb3J0ZWQxXG5cdCIJCS8qIENQVUlEIG5vdCBzdXBwb3J0ZWQgKi8KKworCisJCS8qIEdldCBzdGFuZGFyZCBDUFVJRCBpbmZvcm1hdGlvbiwgYW5kCisJCSAgICAgICBnbyB0byBhIHNwZWNpZmljIHZlbmRvciBzZWN0aW9uICovCisJCSJtb3ZsICQwLCAlJWVheFxuXHQiCisJCSJjcHVpZFxuXHQiCisKKwkJLyogQ2hlY2sgZm9yIEludGVsICovCisJCSJjbXBsICQweDc1NmU2NTQ3LCAlJWVieFxuXHQiCisJCSJqbmUgVHJ5QU1EXG5cdCIKKwkJImNtcGwgJDB4NDk2NTZlNjksICUlZWR4XG5cdCIKKwkJImpuZSBUcnlBTURcblx0IgorCQkiY21wbCAkMHg2YzY1NzQ2ZSwgJSVlY3hcbiIKKwkJImpuZSBUcnlBTURcblx0IgorCQkiam1wIEludGVsXG5cdCIKKworCQkvKiBDaGVjayBmb3IgQU1EICovCisJCSJcblRyeUFNRDpcblx0IgorCQkiY21wbCAkMHg2ODc0NzU0MSwgJSVlYnhcblx0IgorCQkiam5lIFRyeUN5cml4XG5cdCIKKwkJImNtcGwgJDB4Njk3NDZlNjUsICUlZWR4XG5cdCIKKwkJImpuZSBUcnlDeXJpeFxuXHQiCisJCSJjbXBsICQweDQ0NGQ0MTYzLCAlJWVjeFxuIgorCQkiam5lIFRyeUN5cml4XG5cdCIKKwkJImptcCBBTURcblx0IgorCisJCS8qIENoZWNrIGZvciBDeXJpeCAqLworCQkiXG5UcnlDeXJpeDpcblx0IgorCQkiY21wbCAkMHg2OTcyNzk0MywgJSVlYnhcblx0IgorCQkiam5lIE5vdFN1cHBvcnRlZDJcblx0IgorCQkiY21wbCAkMHg3MzZlNDk3OCwgJSVlZHhcblx0IgorCQkiam5lIE5vdFN1cHBvcnRlZDNcblx0IgorCQkiY21wbCAkMHg2NDYxNjU3NCwgJSVlY3hcblx0IgorCQkiam5lIE5vdFN1cHBvcnRlZDRcblx0IgorCQkvKiBEcm9wIHRocm91Z2ggdG8gQ3lyaXguLi4gKi8KKworCisJCS8qIEN5cml4IFNlY3Rpb24gKi8KKwkJLyogU2VlIGlmIGV4dGVuZGVkIENQVUlEIGxldmVsIDgwMDAwMDAxIGlzIHN1cHBvcnRlZCAqLworCQkvKiBUaGUgdmFsdWUgb2YgQ1BVSUQvODAwMDAwMDEgZm9yIHRoZSA2eDg2TVggaXMgdW5kZWZpbmVkCisJCSAgIGFjY29yZGluZyB0byB0aGUgQ3lyaXggQ1BVIERldGVjdGlvbiBHdWlkZSAoUHJlbGltaW5hcnkKKwkJICAgUmV2LiAxLjAxIHRhYmxlIDEpLCBzbyB3ZSdsbCBjaGVjayB0aGUgdmFsdWUgb2YgZWF4IGZvcgorCQkgICBDUFVJRC8wIHRvIHNlZSBpZiBzdGFuZGFyZCBDUFVJRCBsZXZlbCAyIGlzIHN1cHBvcnRlZC4KKwkJICAgQWNjb3JkaW5nIHRvIHRoZSB0YWJsZSwgdGhlIG9ubHkgQ1BVIHdoaWNoIHN1cHBvcnRzIGxldmVsCisJCSAgIDIgaXMgYWxzbyB0aGUgb25seSBvbmUgd2hpY2ggc3VwcG9ydHMgZXh0ZW5kZWQgQ1BVSUQgbGV2ZWxzLgorCQkqLworCQkiY21wbCAkMHgyLCAlJWVheFxuXHQiCisJCSJqbmUgTU1YdGVzdFxuXHQiCS8qIFVzZSBzdGFuZGFyZCBDUFVJRCBpbnN0ZWFkICovCisKKwkJLyogRXh0ZW5kZWQgQ1BVSUQgc3VwcG9ydGVkIChpbiB0aGVvcnkpLCBzbyBnZXQgZXh0ZW5kZWQKKwkJICAgZmVhdHVyZXMgKi8KKwkJIm1vdmwgJDB4ODAwMDAwMDEsICUlZWF4XG5cdCIKKwkJImNwdWlkXG5cdCIKKwkJInRlc3RsICQweDAwODAwMDAwLCAlJWVheFxuXHQiCS8qIFRlc3QgZm9yIE1NWCAqLworCQkianogTm90U3VwcG9ydGVkNVxuXHQiCQkvKiBNTVggbm90IHN1cHBvcnRlZCAqLworCQkidGVzdGwgJDB4MDEwMDAwMDAsICUlZWF4XG5cdCIJLyogVGVzdCBmb3IgRXh0J2QgTU1YICovCisJCSJqbnogRU1NWFN1cHBvcnRlZFxuXHQiCisJCSJtb3ZsICQxLCAlMFxuXG5cdCIJCS8qIE1NWCBTdXBwb3J0ZWQgKi8KKwkJImptcCBSZXR1cm5cblxuIgorCQkiRU1NWFN1cHBvcnRlZDpcblx0IgorCQkibW92bCAkMywgJTBcblxuXHQiCQkvKiBFTU1YIGFuZCBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cdCIKKworCisJCS8qIEFNRCBTZWN0aW9uICovCisJCSJBTUQ6XG5cdCIKKworCQkvKiBTZWUgaWYgZXh0ZW5kZWQgQ1BVSUQgaXMgc3VwcG9ydGVkICovCisJCSJtb3ZsICQweDgwMDAwMDAwLCAlJWVheFxuXHQiCisJCSJjcHVpZFxuXHQiCisJCSJjbXBsICQweDgwMDAwMDAwLCAlJWVheFxuXHQiCisJCSJqbCBNTVh0ZXN0XG5cdCIJLyogVXNlIHN0YW5kYXJkIENQVUlEIGluc3RlYWQgKi8KKworCQkvKiBFeHRlbmRlZCBDUFVJRCBzdXBwb3J0ZWQsIHNvIGdldCBleHRlbmRlZCBmZWF0dXJlcyAqLworCQkibW92bCAkMHg4MDAwMDAwMSwgJSVlYXhcblx0IgorCQkiY3B1aWRcblx0IgorCQkidGVzdGwgJDB4MDA4MDAwMDAsICUlZWR4XG5cdCIJLyogVGVzdCBmb3IgTU1YICovCisJCSJqeiBOb3RTdXBwb3J0ZWQ2XG5cdCIJCS8qIE1NWCBub3Qgc3VwcG9ydGVkICovCisJCSJ0ZXN0bCAkMHg4MDAwMDAwMCwgJSVlZHhcblx0IgkvKiBUZXN0IGZvciAzRE5vdyEgKi8KKwkJImpueiBUaHJlZUROb3dTdXBwb3J0ZWRcblx0IgorCQkibW92bCAkMSwgJTBcblxuXHQiCQkvKiBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cbiIKKwkJIlRocmVlRE5vd1N1cHBvcnRlZDpcblx0IgorCQkidGVzdGwgJDB4NDAwMDAwMDAsICUlZWR4XG5cdCIgLyogVGVzdCBBTUQgRXh0ZW5kZWQgTU1YICovCisJCSJqbnogQU1EWE1NWFN1cHBvcnRlZFxuXHQiCisJCSJtb3ZsICQ1LCAlMFxuXG5cdCIJCS8qIDNETm93ISBhbmQgTU1YIFN1cHBvcnRlZCAqLworCQkiam1wIFJldHVyblxuXHQiCisJCSJBTURYTU1YU3VwcG9ydGVkOlxuXHQiCisJCSJtb3ZsICQxMywgJTBcblxuXHQiCQkvKiBYTU1YLCAzRE5vdyEgYW5kIE1NWCBTdXBwb3J0ZWQgKi8KKwkJImptcCBSZXR1cm5cblx0IgorCisKKwkJLyogSW50ZWwgU2VjdGlvbiAqLworCQkiSW50ZWw6XG5cdCIKKworCQkvKiBDaGVjayBmb3IgTU1YICovCisJCSJNTVh0ZXN0OlxuXHQiCisJCSJtb3ZsICQxLCAlJWVheFxuXHQiCisJCSJjcHVpZFxuXHQiCisJCSJ0ZXN0bCAkMHgwMDgwMDAwMCwgJSVlZHhcblx0IgkvKiBUZXN0IGZvciBNTVggKi8KKwkJImp6IE5vdFN1cHBvcnRlZDdcblx0IgkJLyogTU1YIE5vdCBzdXBwb3J0ZWQgKi8KKwkJIm1vdmwgJDEsICUwXG5cblx0IgkJLyogTU1YIFN1cHBvcnRlZCAqLworCQkiam1wIFJldHVyblxuXHQiCisKKwkJLyogTm90aGluZyBzdXBwb3J0ZWQgKi8KKwkJIlxuTm90U3VwcG9ydGVkMTpcblx0IgorCQkiI21vdmwgJDEwMSwgJTBcblxuXHQiCisJCSJcbk5vdFN1cHBvcnRlZDI6XG5cdCIKKwkJIiNtb3ZsICQxMDIsICUwXG5cblx0IgorCQkiXG5Ob3RTdXBwb3J0ZWQzOlxuXHQiCisJCSIjbW92bCAkMTAzLCAlMFxuXG5cdCIKKwkJIlxuTm90U3VwcG9ydGVkNDpcblx0IgorCQkiI21vdmwgJDEwNCwgJTBcblxuXHQiCisJCSJcbk5vdFN1cHBvcnRlZDU6XG5cdCIKKwkJIiNtb3ZsICQxMDUsICUwXG5cblx0IgorCQkiXG5Ob3RTdXBwb3J0ZWQ2OlxuXHQiCisJCSIjbW92bCAkMTA2LCAlMFxuXG5cdCIKKwkJIlxuTm90U3VwcG9ydGVkNzpcblx0IgorCQkiI21vdmwgJDEwNywgJTBcblxuXHQiCisJCSJtb3ZsICQwLCAlMFxuXG5cdCIKKworCQkiUmV0dXJuOlxuXHQiCisgICAgInBvcGwgJSVlYnhcblx0IgorCQk6ICI9WCIgKHJ2YWwpCisJCTogLyogbm8gaW5wdXQgKi8KKwkJOiAiZWF4IiwgImVjeCIsICJlZHgiCisJKTsKKworCS8qIFJldHVybiAqLworCXJldHVybihydmFsKTsKK30KKworLyoJRnVuY3Rpb24gdG8gdGVzdCBpZiBtbXggaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQuLi4KKyovCitzdGF0aWMgaW5saW5lIGludAorbW14X29rKHZvaWQpCit7CisJLyogUmV0dXJucyAxIGlmIE1NWCBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZCwgMCBvdGhlcndpc2UgKi8KKwlyZXR1cm4gKCBtbV9zdXBwb3J0KCkgJiAweDEgKTsKK30KKworaW50IG1teF9zdXBwb3J0ZWQgKHZvaWQpOworaW50IHhtbXhfc3VwcG9ydGVkICh2b2lkKTsKKworCisvKiBNTVggb3B0aW1pemVkIGltcGxlbWVudGF0aW9ucyAqLwordm9pZCBkcmF3X2xpbmVfbW14IChQaXhlbCAqZGF0YSwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyLCBpbnQgY29sLCBpbnQgc2NyZWVueCwgaW50IHNjcmVlbnkpOwordm9pZCBkcmF3X2xpbmVfeG1teCAoUGl4ZWwgKmRhdGEsIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiwgaW50IGNvbCwgaW50IHNjcmVlbngsIGludCBzY3JlZW55KTsKK3ZvaWQgem9vbV9maWx0ZXJfbW14IChpbnQgcHJldlgsIGludCBwcmV2WSwgUGl4ZWwgKmV4cGl4MSwgUGl4ZWwgKmV4cGl4MiwKKwkJICAgICAgaW50ICpicnV0UywgaW50ICpicnV0RCwgaW50IGJ1ZmZyYXRpbywgaW50IHByZWNhbENvZWZbMTZdWzE2XSk7Cit2b2lkIHpvb21fZmlsdGVyX3htbXggKGludCBwcmV2WCwgaW50IHByZXZZLCBQaXhlbCAqZXhwaXgxLCBQaXhlbCAqZXhwaXgyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmxicnVTLCBpbnQgKmxicnVELCBpbnQgYnVmZnJhdGlvLCBpbnQgcHJlY2FsQ29lZlsxNl1bMTZdKTsKKworCisvKglIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgaW5zdHJ1Y3Rpb24gbWFjcm9zIHRoYXQgZm9sbG93Li4uCisJKG5vdGUgdGhhdCBtZW1vcnktdG8tcmVnaXN0ZXIsIG0yciwgaW5zdHJ1Y3Rpb25zIGFyZSBuZWFybHkKKwkgYXMgZWZmaWNpZW50IGFzIHJlZ2lzdGVyLXRvLXJlZ2lzdGVyLCByMnIsIGluc3RydWN0aW9uczsKKwkgaG93ZXZlciwgbWVtb3J5LXRvLW1lbW9yeSBpbnN0cnVjdGlvbnMgYXJlIHJlYWxseSBzaW11bGF0ZWQKKwkgYXMgYSBjb252ZW5pZW5jZSwgYW5kIGFyZSBvbmx5IDEvMyBhcyBlZmZpY2llbnQpCisqLworI2lmZGVmCU1NWF9UUkFDRQorCisvKglJbmNsdWRlIHRoZSBzdHVmZiBmb3IgcHJpbnRpbmcgYSB0cmFjZSB0byBzdGRlcnIuLi4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lCW1teF9pMnIob3AsIGltbSwgcmVnKSBcCisJeyBcCisJCW1teF90IG1teF90cmFjZTsgXAorCQltbXhfdHJhY2UudXEgPSAoaW1tKTsgXAorCQlwcmludGYoI29wICJfaTJyKCIgI2ltbSAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlwcmludGYoI3JlZyAiPTB4JTA4eCUwOHgpID0+ICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUwLCAlJSIgI3JlZyBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCQkgICAgICA6ICJYIiAoaW1tKSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlwcmludGYoI3JlZyAiPTB4JTA4eCUwOHhcbiIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwl9CisKKyNkZWZpbmUJbW14X20ycihvcCwgbWVtLCByZWcpIFwKKwl7IFwKKwkJbW14X3QgbW14X3RyYWNlOyBcCisJCW1teF90cmFjZSA9IChtZW0pOyBcCisJCXByaW50Zigjb3AgIl9tMnIoIiAjbWVtICI9MHglMDh4JTA4eCwgIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWcgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCXByaW50ZigjcmVnICI9MHglMDh4JTA4eCkgPT4gIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gXAorCQkJCSAgICAgIDogIm0iIChtZW0pKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWcgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCXByaW50ZigjcmVnICI9MHglMDh4JTA4eFxuIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCX0KKworI2RlZmluZQltbXhfcjJtKG9wLCByZWcsIG1lbSkgXAorCXsgXAorCQltbXhfdCBtbXhfdHJhY2U7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlwcmludGYoI29wICJfcjJtKCIgI3JlZyAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJbW14X3RyYWNlID0gKG1lbSk7IFwKKwkJcHJpbnRmKCNtZW0gIj0weCUwOHglMDh4KSA9PiAiLCBcCisJCQltbXhfdHJhY2UuZFsxXSwgbW14X3RyYWNlLmRbMF0pOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlJSIgI3JlZyAiLCAlMCIgXAorCQkJCSAgICAgIDogIj1tIiAobWVtKSBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKKwkJbW14X3RyYWNlID0gKG1lbSk7IFwKKwkJcHJpbnRmKCNtZW0gIj0weCUwOHglMDh4XG4iLCBcCisJCQltbXhfdHJhY2UuZFsxXSwgbW14X3RyYWNlLmRbMF0pOyBcCisJfQorCisjZGVmaW5lCW1teF9yMnIob3AsIHJlZ3MsIHJlZ2QpIFwKKwl7IFwKKwkJbW14X3QgbW14X3RyYWNlOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZ3MgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCXByaW50Zigjb3AgIl9yMnIoIiAjcmVncyAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnZCAiLCAlMCIgXAorCQkJCSAgICAgIDogIj1YIiAobW14X3RyYWNlKSBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKKwkJcHJpbnRmKCNyZWdkICI9MHglMDh4JTA4eCkgPT4gIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJSIgI3JlZ3MgIiwgJSIgI3JlZ2QpOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZ2QgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCXByaW50ZigjcmVnZCAiPTB4JTA4eCUwOHhcbiIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwl9CisKKyNkZWZpbmUJbW14X20ybShvcCwgbWVtcywgbWVtZCkgXAorCXsgXAorCQltbXhfdCBtbXhfdHJhY2U7IFwKKwkJbW14X3RyYWNlID0gKG1lbXMpOyBcCisJCXByaW50Zigjb3AgIl9tMm0oIiAjbWVtcyAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJbW14X3RyYWNlID0gKG1lbWQpOyBcCisJCXByaW50ZigjbWVtZCAiPTB4JTA4eCUwOHgpID0+ICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUwLCAlJW1tMFxuXHQiIFwKKwkJCQkgICAgICAjb3AgIiAlMSwgJSVtbTBcblx0IiBcCisJCQkJICAgICAgIm1vdnEgJSVtbTAsICUwIiBcCisJCQkJICAgICAgOiAiPW0iIChtZW1kKSBcCisJCQkJICAgICAgOiAibSIgKG1lbXMpKTsgXAorCQltbXhfdHJhY2UgPSAobWVtZCk7IFwKKwkJcHJpbnRmKCNtZW1kICI9MHglMDh4JTA4eFxuIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCX0KKworI2Vsc2UKKworLyoJVGhlc2UgbWFjcm9zIGFyZSBhIGxvdCBzaW1wbGVyIHdpdGhvdXQgdGhlIHRyYWNpbmcuLi4KKyovCisKKyNkZWZpbmUJbW14X2kycihvcCwgaW1tLCByZWcpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCisJCQkgICAgICA6ICJYIiAoaW1tKSApCisKKyNkZWZpbmUJbW14X20ycihvcCwgbWVtLCByZWcpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCisJCQkgICAgICA6ICJtIiAobWVtKSkKKworI2RlZmluZQltbXhfcjJtKG9wLCByZWcsIG1lbSkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlJSIgI3JlZyAiLCAlMCIgXAorCQkJICAgICAgOiAiPW0iIChtZW0pIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyApCisKKyNkZWZpbmUJbW14X3IycihvcCwgcmVncywgcmVnZCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlIiAjcmVncyAiLCAlIiAjcmVnZCkKKworI2RlZmluZQltbXhfbTJtKG9wLCBtZW1zLCBtZW1kKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUwLCAlJW1tMFxuXHQiIFwKKwkJCSAgICAgICNvcCAiICUxLCAlJW1tMFxuXHQiIFwKKwkJCSAgICAgICJtb3ZxICUlbW0wLCAlMCIgXAorCQkJICAgICAgOiAiPW0iIChtZW1kKSBcCisJCQkgICAgICA6ICJtIiAobWVtcykpCisKKyNlbmRpZgorCisKKy8qCTF4NjQgTU9WZSBRdWFkd29yZAorCSh0aGlzIGlzIGJvdGggYSBsb2FkIGFuZCBhIHN0b3JlLi4uCisJIGluIGZhY3QsIGl0IGlzIHRoZSBvbmx5IHdheSB0byBzdG9yZSkKKyovCisjZGVmaW5lCW1vdnFfbTJyKHZhciwgcmVnKQltbXhfbTJyKG1vdnEsIHZhciwgcmVnKQorI2RlZmluZQltb3ZxX3IybShyZWcsIHZhcikJbW14X3IybShtb3ZxLCByZWcsIHZhcikKKyNkZWZpbmUJbW92cV9yMnIocmVncywgcmVnZCkJbW14X3Iycihtb3ZxLCByZWdzLCByZWdkKQorI2RlZmluZQltb3ZxKHZhcnMsIHZhcmQpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJTEsICUlbW0wXG5cdCIgXAorCQkJICAgICAgIm1vdnEgJSVtbTAsICUwIiBcCisJCQkgICAgICA6ICI9WCIgKHZhcmQpIFwKKwkJCSAgICAgIDogIlgiICh2YXJzKSkKKworCisvKgkxeDMyIE1PVmUgRG91Ymxld29yZAorCShsaWtlIG1vdnEsIHRoaXMgaXMgYm90aCBsb2FkIGFuZCBzdG9yZS4uLgorCSBidXQgaXMgbW9zdCB1c2VmdWwgZm9yIG1vdmluZyB0aGluZ3MgYmV0d2VlbgorCSBtbXggcmVnaXN0ZXJzIGFuZCBvcmRpbmFyeSByZWdpc3RlcnMpCisqLworI2RlZmluZQltb3ZkX20ycih2YXIsIHJlZykJbW14X20ycihtb3ZkLCB2YXIsIHJlZykKKyNkZWZpbmUJbW92ZF9yMm0ocmVnLCB2YXIpCW1teF9yMm0obW92ZCwgcmVnLCB2YXIpCisjZGVmaW5lCW1vdmRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIobW92ZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJbW92ZCh2YXJzLCB2YXJkKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZkICUxLCAlJW1tMFxuXHQiIFwKKwkJCSAgICAgICJtb3ZkICUlbW0wLCAlMCIgXAorCQkJICAgICAgOiAiPVgiICh2YXJkKSBcCisJCQkgICAgICA6ICJYIiAodmFycykpCisKKworLyoJMngzMiwgNHgxNiwgYW5kIDh4OCBQYXJhbGxlbCBBRERzCisqLworI2RlZmluZQlwYWRkZF9tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZGQsIHZhciwgcmVnKQorI2RlZmluZQlwYWRkZF9yMnIocmVncywgcmVnZCkJbW14X3IycihwYWRkZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZGQodmFycywgdmFyZCkJbW14X20ybShwYWRkZCwgdmFycywgdmFyZCkKKworI2RlZmluZQlwYWRkd19tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHcsIHZhciwgcmVnKQorI2RlZmluZQlwYWRkd19yMnIocmVncywgcmVnZCkJbW14X3IycihwYWRkdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZHcodmFycywgdmFyZCkJbW14X20ybShwYWRkdywgdmFycywgdmFyZCkKKworI2RlZmluZQlwYWRkYl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZGIsIHZhciwgcmVnKQorI2RlZmluZQlwYWRkYl9yMnIocmVncywgcmVnZCkJbW14X3IycihwYWRkYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZGIodmFycywgdmFyZCkJbW14X20ybShwYWRkYiwgdmFycywgdmFyZCkKKworCisvKgk0eDE2IGFuZCA4eDggUGFyYWxsZWwgQUREcyB1c2luZyBTYXR1cmF0aW9uIGFyaXRobWV0aWMKKyovCisjZGVmaW5lCXBhZGRzd19tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHN3LCB2YXIsIHJlZykKKyNkZWZpbmUJcGFkZHN3X3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBhZGRzdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZHN3KHZhcnMsIHZhcmQpCW1teF9tMm0ocGFkZHN3LCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBhZGRzYl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHNiLCB2YXIsIHJlZykKKyNkZWZpbmUJcGFkZHNiX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBhZGRzYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZHNiKHZhcnMsIHZhcmQpCW1teF9tMm0ocGFkZHNiLCB2YXJzLCB2YXJkKQorCisKKy8qCTR4MTYgYW5kIDh4OCBQYXJhbGxlbCBBRERzIHVzaW5nIFVuc2lnbmVkIFNhdHVyYXRpb24gYXJpdGhtZXRpYworKi8KKyNkZWZpbmUJcGFkZHVzd19tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHVzdywgdmFyLCByZWcpCisjZGVmaW5lCXBhZGR1c3dfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGFkZHVzdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZHVzdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBhZGR1c3csIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcGFkZHVzYl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHVzYiwgdmFyLCByZWcpCisjZGVmaW5lCXBhZGR1c2JfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGFkZHVzYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZHVzYih2YXJzLCB2YXJkKQltbXhfbTJtKHBhZGR1c2IsIHZhcnMsIHZhcmQpCisKKworLyoJMngzMiwgNHgxNiwgYW5kIDh4OCBQYXJhbGxlbCBTVUJzCisqLworI2RlZmluZQlwc3ViZF9tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YmQsIHZhciwgcmVnKQorI2RlZmluZQlwc3ViZF9yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3ViZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YmQodmFycywgdmFyZCkJbW14X20ybShwc3ViZCwgdmFycywgdmFyZCkKKworI2RlZmluZQlwc3Vid19tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YncsIHZhciwgcmVnKQorI2RlZmluZQlwc3Vid19yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3VidywgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YncodmFycywgdmFyZCkJbW14X20ybShwc3VidywgdmFycywgdmFyZCkKKworI2RlZmluZQlwc3ViYl9tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YmIsIHZhciwgcmVnKQorI2RlZmluZQlwc3ViYl9yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3ViYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YmIodmFycywgdmFyZCkJbW14X20ybShwc3ViYiwgdmFycywgdmFyZCkKKworCisvKgk0eDE2IGFuZCA4eDggUGFyYWxsZWwgU1VCcyB1c2luZyBTYXR1cmF0aW9uIGFyaXRobWV0aWMKKyovCisjZGVmaW5lCXBzdWJzd19tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YnN3LCB2YXIsIHJlZykKKyNkZWZpbmUJcHN1YnN3X3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzdWJzdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YnN3KHZhcnMsIHZhcmQpCW1teF9tMm0ocHN1YnN3LCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBzdWJzYl9tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YnNiLCB2YXIsIHJlZykKKyNkZWZpbmUJcHN1YnNiX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzdWJzYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YnNiKHZhcnMsIHZhcmQpCW1teF9tMm0ocHN1YnNiLCB2YXJzLCB2YXJkKQorCisKKy8qCTR4MTYgYW5kIDh4OCBQYXJhbGxlbCBTVUJzIHVzaW5nIFVuc2lnbmVkIFNhdHVyYXRpb24gYXJpdGhtZXRpYworKi8KKyNkZWZpbmUJcHN1YnVzd19tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YnVzdywgdmFyLCByZWcpCisjZGVmaW5lCXBzdWJ1c3dfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHN1YnVzdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YnVzdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBzdWJ1c3csIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHN1YnVzYl9tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YnVzYiwgdmFyLCByZWcpCisjZGVmaW5lCXBzdWJ1c2JfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHN1YnVzYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YnVzYih2YXJzLCB2YXJkKQltbXhfbTJtKHBzdWJ1c2IsIHZhcnMsIHZhcmQpCisKKworLyoJNHgxNiBQYXJhbGxlbCBNVUxzIGdpdmluZyBMb3cgNHgxNiBwb3J0aW9ucyBvZiByZXN1bHRzCisqLworI2RlZmluZQlwbXVsbHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBtdWxsdywgdmFyLCByZWcpCisjZGVmaW5lCXBtdWxsd19yMnIocmVncywgcmVnZCkJbW14X3IycihwbXVsbHcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBtdWxsdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBtdWxsdywgdmFycywgdmFyZCkKKworCisvKgk0eDE2IFBhcmFsbGVsIE1VTHMgZ2l2aW5nIEhpZ2ggNHgxNiBwb3J0aW9ucyBvZiByZXN1bHRzCisqLworI2RlZmluZQlwbXVsaHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBtdWxodywgdmFyLCByZWcpCisjZGVmaW5lCXBtdWxod19yMnIocmVncywgcmVnZCkJbW14X3IycihwbXVsaHcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBtdWxodyh2YXJzLCB2YXJkKQltbXhfbTJtKHBtdWxodywgdmFycywgdmFyZCkKKworCisvKgk0eDE2LT4yeDMyIFBhcmFsbGVsIE11bC1BREQKKwkobXVscyBsaWtlIHBtdWxsdywgdGhlbiBhZGRzIGFkamFjZW50IDE2LWJpdCBmaWVsZHMKKwkgaW4gdGhlIG11bHRpcGx5IHJlc3VsdCB0byBtYWtlIHRoZSBmaW5hbCAyeDMyIHJlc3VsdCkKKyovCisjZGVmaW5lCXBtYWRkd2RfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBtYWRkd2QsIHZhciwgcmVnKQorI2RlZmluZQlwbWFkZHdkX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBtYWRkd2QsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBtYWRkd2QodmFycywgdmFyZCkJbW14X20ybShwbWFkZHdkLCB2YXJzLCB2YXJkKQorCisKKy8qCTF4NjQgYml0d2lzZSBBTkQKKyovCisjaWZkZWYJQlJPS0VOX1BBTkQKKyNkZWZpbmUJcGFuZF9tMnIodmFyLCByZWcpIFwKKwl7IFwKKwkJbW14X20ycihwYW5kbiwgKG1teF90KSAtMUxMLCByZWcpOyBcCisJCW1teF9tMnIocGFuZG4sIHZhciwgcmVnKTsgXAorCX0KKyNkZWZpbmUJcGFuZF9yMnIocmVncywgcmVnZCkgXAorCXsgXAorCQltbXhfbTJyKHBhbmRuLCAobW14X3QpIC0xTEwsIHJlZ2QpOyBcCisJCW1teF9yMnIocGFuZG4sIHJlZ3MsIHJlZ2QpIFwKKwl9CisjZGVmaW5lCXBhbmQodmFycywgdmFyZCkgXAorCXsgXAorCQltb3ZxX20ycih2YXJkLCBtbTApOyBcCisJCW1teF9tMnIocGFuZG4sIChtbXhfdCkgLTFMTCwgbW0wKTsgXAorCQltbXhfbTJyKHBhbmRuLCB2YXJzLCBtbTApOyBcCisJCW1vdnFfcjJtKG1tMCwgdmFyZCk7IFwKKwl9CisjZWxzZQorI2RlZmluZQlwYW5kX20ycih2YXIsIHJlZykJbW14X20ycihwYW5kLCB2YXIsIHJlZykKKyNkZWZpbmUJcGFuZF9yMnIocmVncywgcmVnZCkJbW14X3IycihwYW5kLCByZWdzLCByZWdkKQorI2RlZmluZQlwYW5kKHZhcnMsIHZhcmQpCW1teF9tMm0ocGFuZCwgdmFycywgdmFyZCkKKyNlbmRpZgorCisKKy8qCTF4NjQgYml0d2lzZSBBTkQgd2l0aCBOb3QgdGhlIGRlc3RpbmF0aW9uCisqLworI2RlZmluZQlwYW5kbl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFuZG4sIHZhciwgcmVnKQorI2RlZmluZQlwYW5kbl9yMnIocmVncywgcmVnZCkJbW14X3IycihwYW5kbiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFuZG4odmFycywgdmFyZCkJbW14X20ybShwYW5kbiwgdmFycywgdmFyZCkKKworCisvKgkxeDY0IGJpdHdpc2UgT1IKKyovCisjZGVmaW5lCXBvcl9tMnIodmFyLCByZWcpCW1teF9tMnIocG9yLCB2YXIsIHJlZykKKyNkZWZpbmUJcG9yX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBvciwgcmVncywgcmVnZCkKKyNkZWZpbmUJcG9yKHZhcnMsIHZhcmQpCW1teF9tMm0ocG9yLCB2YXJzLCB2YXJkKQorCisKKy8qCTF4NjQgYml0d2lzZSBlWGNsdXNpdmUgT1IKKyovCisjZGVmaW5lCXB4b3JfbTJyKHZhciwgcmVnKQltbXhfbTJyKHB4b3IsIHZhciwgcmVnKQorI2RlZmluZQlweG9yX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHB4b3IsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXB4b3IodmFycywgdmFyZCkJbW14X20ybShweG9yLCB2YXJzLCB2YXJkKQorCisKKy8qCTJ4MzIsIDR4MTYsIGFuZCA4eDggUGFyYWxsZWwgQ29NUGFyZSBmb3IgRVF1YWxpdHkKKwkocmVzdWx0aW5nIGZpZWxkcyBhcmUgZWl0aGVyIDAgb3IgLTEpCisqLworI2RlZmluZQlwY21wZXFkX20ycih2YXIsIHJlZykJbW14X20ycihwY21wZXFkLCB2YXIsIHJlZykKKyNkZWZpbmUJcGNtcGVxZF9yMnIocmVncywgcmVnZCkJbW14X3IycihwY21wZXFkLCByZWdzLCByZWdkKQorI2RlZmluZQlwY21wZXFkKHZhcnMsIHZhcmQpCW1teF9tMm0ocGNtcGVxZCwgdmFycywgdmFyZCkKKworI2RlZmluZQlwY21wZXF3X20ycih2YXIsIHJlZykJbW14X20ycihwY21wZXF3LCB2YXIsIHJlZykKKyNkZWZpbmUJcGNtcGVxd19yMnIocmVncywgcmVnZCkJbW14X3IycihwY21wZXF3LCByZWdzLCByZWdkKQorI2RlZmluZQlwY21wZXF3KHZhcnMsIHZhcmQpCW1teF9tMm0ocGNtcGVxdywgdmFycywgdmFyZCkKKworI2RlZmluZQlwY21wZXFiX20ycih2YXIsIHJlZykJbW14X20ycihwY21wZXFiLCB2YXIsIHJlZykKKyNkZWZpbmUJcGNtcGVxYl9yMnIocmVncywgcmVnZCkJbW14X3IycihwY21wZXFiLCByZWdzLCByZWdkKQorI2RlZmluZQlwY21wZXFiKHZhcnMsIHZhcmQpCW1teF9tMm0ocGNtcGVxYiwgdmFycywgdmFyZCkKKworCisvKgkyeDMyLCA0eDE2LCBhbmQgOHg4IFBhcmFsbGVsIENvTVBhcmUgZm9yIEdyZWF0ZXIgVGhhbgorCShyZXN1bHRpbmcgZmllbGRzIGFyZSBlaXRoZXIgMCBvciAtMSkKKyovCisjZGVmaW5lCXBjbXBndGRfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBjbXBndGQsIHZhciwgcmVnKQorI2RlZmluZQlwY21wZ3RkX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBjbXBndGQsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBjbXBndGQodmFycywgdmFyZCkJbW14X20ybShwY21wZ3RkLCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBjbXBndHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBjbXBndHcsIHZhciwgcmVnKQorI2RlZmluZQlwY21wZ3R3X3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBjbXBndHcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBjbXBndHcodmFycywgdmFyZCkJbW14X20ybShwY21wZ3R3LCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBjbXBndGJfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBjbXBndGIsIHZhciwgcmVnKQorI2RlZmluZQlwY21wZ3RiX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBjbXBndGIsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBjbXBndGIodmFycywgdmFyZCkJbW14X20ybShwY21wZ3RiLCB2YXJzLCB2YXJkKQorCisKKy8qCTF4NjQsIDJ4MzIsIGFuZCA0eDE2IFBhcmFsbGVsIFNoaWZ0IExlZnQgTG9naWNhbAorKi8KKyNkZWZpbmUJcHNsbHFfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzbGxxLCBpbW0sIHJlZykKKyNkZWZpbmUJcHNsbHFfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzbGxxLCB2YXIsIHJlZykKKyNkZWZpbmUJcHNsbHFfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNsbHEsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzbGxxKHZhcnMsIHZhcmQpCW1teF9tMm0ocHNsbHEsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHNsbGRfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzbGxkLCBpbW0sIHJlZykKKyNkZWZpbmUJcHNsbGRfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzbGxkLCB2YXIsIHJlZykKKyNkZWZpbmUJcHNsbGRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNsbGQsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzbGxkKHZhcnMsIHZhcmQpCW1teF9tMm0ocHNsbGQsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHNsbHdfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzbGx3LCBpbW0sIHJlZykKKyNkZWZpbmUJcHNsbHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzbGx3LCB2YXIsIHJlZykKKyNkZWZpbmUJcHNsbHdfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNsbHcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzbGx3KHZhcnMsIHZhcmQpCW1teF9tMm0ocHNsbHcsIHZhcnMsIHZhcmQpCisKKworLyoJMXg2NCwgMngzMiwgYW5kIDR4MTYgUGFyYWxsZWwgU2hpZnQgUmlnaHQgTG9naWNhbAorKi8KKyNkZWZpbmUJcHNybHFfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzcmxxLCBpbW0sIHJlZykKKyNkZWZpbmUJcHNybHFfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzcmxxLCB2YXIsIHJlZykKKyNkZWZpbmUJcHNybHFfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNybHEsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzcmxxKHZhcnMsIHZhcmQpCW1teF9tMm0ocHNybHEsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHNybGRfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzcmxkLCBpbW0sIHJlZykKKyNkZWZpbmUJcHNybGRfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzcmxkLCB2YXIsIHJlZykKKyNkZWZpbmUJcHNybGRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNybGQsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzcmxkKHZhcnMsIHZhcmQpCW1teF9tMm0ocHNybGQsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHNybHdfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzcmx3LCBpbW0sIHJlZykKKyNkZWZpbmUJcHNybHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzcmx3LCB2YXIsIHJlZykKKyNkZWZpbmUJcHNybHdfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNybHcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzcmx3KHZhcnMsIHZhcmQpCW1teF9tMm0ocHNybHcsIHZhcnMsIHZhcmQpCisKKworLyoJMngzMiBhbmQgNHgxNiBQYXJhbGxlbCBTaGlmdCBSaWdodCBBcml0aG1ldGljCisqLworI2RlZmluZQlwc3JhZF9pMnIoaW1tLCByZWcpCW1teF9pMnIocHNyYWQsIGltbSwgcmVnKQorI2RlZmluZQlwc3JhZF9tMnIodmFyLCByZWcpCW1teF9tMnIocHNyYWQsIHZhciwgcmVnKQorI2RlZmluZQlwc3JhZF9yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3JhZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHNyYWQodmFycywgdmFyZCkJbW14X20ybShwc3JhZCwgdmFycywgdmFyZCkKKworI2RlZmluZQlwc3Jhd19pMnIoaW1tLCByZWcpCW1teF9pMnIocHNyYXcsIGltbSwgcmVnKQorI2RlZmluZQlwc3Jhd19tMnIodmFyLCByZWcpCW1teF9tMnIocHNyYXcsIHZhciwgcmVnKQorI2RlZmluZQlwc3Jhd19yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3JhdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcHNyYXcodmFycywgdmFyZCkJbW14X20ybShwc3JhdywgdmFycywgdmFyZCkKKworCisvKgkyeDMyLT40eDE2IGFuZCA0eDE2LT44eDggUEFDSyBhbmQgU2lnbmVkIFNhdHVyYXRlCisJKHBhY2tzIHNvdXJjZSBhbmQgZGVzdCBmaWVsZHMgaW50byBkZXN0IGluIHRoYXQgb3JkZXIpCisqLworI2RlZmluZQlwYWNrc3Nkd19tMnIodmFyLCByZWcpCW1teF9tMnIocGFja3NzZHcsIHZhciwgcmVnKQorI2RlZmluZQlwYWNrc3Nkd19yMnIocmVncywgcmVnZCkgbW14X3IycihwYWNrc3NkdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFja3NzZHcodmFycywgdmFyZCkJbW14X20ybShwYWNrc3NkdywgdmFycywgdmFyZCkKKworI2RlZmluZQlwYWNrc3N3Yl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFja3Nzd2IsIHZhciwgcmVnKQorI2RlZmluZQlwYWNrc3N3Yl9yMnIocmVncywgcmVnZCkgbW14X3IycihwYWNrc3N3YiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFja3Nzd2IodmFycywgdmFyZCkJbW14X20ybShwYWNrc3N3YiwgdmFycywgdmFyZCkKKworCisvKgk0eDE2LT44eDggUEFDSyBhbmQgVW5zaWduZWQgU2F0dXJhdGUKKwkocGFja3Mgc291cmNlIGFuZCBkZXN0IGZpZWxkcyBpbnRvIGRlc3QgaW4gdGhhdCBvcmRlcikKKyovCisjZGVmaW5lCXBhY2t1c3diX20ycih2YXIsIHJlZykJbW14X20ycihwYWNrdXN3YiwgdmFyLCByZWcpCisjZGVmaW5lCXBhY2t1c3diX3IycihyZWdzLCByZWdkKSBtbXhfcjJyKHBhY2t1c3diLCByZWdzLCByZWdkKQorI2RlZmluZQlwYWNrdXN3Yih2YXJzLCB2YXJkKQltbXhfbTJtKHBhY2t1c3diLCB2YXJzLCB2YXJkKQorCisKKy8qCTJ4MzItPjF4NjQsIDR4MTYtPjJ4MzIsIGFuZCA4eDgtPjR4MTYgVU5QYUNLIExvdworCShpbnRlcmxlYXZlcyBsb3cgaGFsZiBvZiBkZXN0IHdpdGggbG93IGhhbGYgb2Ygc291cmNlCisJIGFzIHBhZGRpbmcgaW4gZWFjaCByZXN1bHQgZmllbGQpCisqLworI2RlZmluZQlwdW5wY2tsZHFfbTJyKHZhciwgcmVnKQltbXhfbTJyKHB1bnBja2xkcSwgdmFyLCByZWcpCisjZGVmaW5lCXB1bnBja2xkcV9yMnIocmVncywgcmVnZCkgbW14X3IycihwdW5wY2tsZHEsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXB1bnBja2xkcSh2YXJzLCB2YXJkKQltbXhfbTJtKHB1bnBja2xkcSwgdmFycywgdmFyZCkKKworI2RlZmluZQlwdW5wY2tsd2RfbTJyKHZhciwgcmVnKQltbXhfbTJyKHB1bnBja2x3ZCwgdmFyLCByZWcpCisjZGVmaW5lCXB1bnBja2x3ZF9yMnIocmVncywgcmVnZCkgbW14X3IycihwdW5wY2tsd2QsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXB1bnBja2x3ZCh2YXJzLCB2YXJkKQltbXhfbTJtKHB1bnBja2x3ZCwgdmFycywgdmFyZCkKKworI2RlZmluZQlwdW5wY2tsYndfbTJyKHZhciwgcmVnKQltbXhfbTJyKHB1bnBja2xidywgdmFyLCByZWcpCisjZGVmaW5lCXB1bnBja2xid19yMnIocmVncywgcmVnZCkgbW14X3IycihwdW5wY2tsYncsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXB1bnBja2xidyh2YXJzLCB2YXJkKQltbXhfbTJtKHB1bnBja2xidywgdmFycywgdmFyZCkKKworCisvKgkyeDMyLT4xeDY0LCA0eDE2LT4yeDMyLCBhbmQgOHg4LT40eDE2IFVOUGFDSyBIaWdoCisJKGludGVybGVhdmVzIGhpZ2ggaGFsZiBvZiBkZXN0IHdpdGggaGlnaCBoYWxmIG9mIHNvdXJjZQorCSBhcyBwYWRkaW5nIGluIGVhY2ggcmVzdWx0IGZpZWxkKQorKi8KKyNkZWZpbmUJcHVucGNraGRxX20ycih2YXIsIHJlZykJbW14X20ycihwdW5wY2toZHEsIHZhciwgcmVnKQorI2RlZmluZQlwdW5wY2toZHFfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocHVucGNraGRxLCByZWdzLCByZWdkKQorI2RlZmluZQlwdW5wY2toZHEodmFycywgdmFyZCkJbW14X20ybShwdW5wY2toZHEsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHVucGNraHdkX20ycih2YXIsIHJlZykJbW14X20ycihwdW5wY2tod2QsIHZhciwgcmVnKQorI2RlZmluZQlwdW5wY2tod2RfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocHVucGNraHdkLCByZWdzLCByZWdkKQorI2RlZmluZQlwdW5wY2tod2QodmFycywgdmFyZCkJbW14X20ybShwdW5wY2tod2QsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHVucGNraGJ3X20ycih2YXIsIHJlZykJbW14X20ycihwdW5wY2toYncsIHZhciwgcmVnKQorI2RlZmluZQlwdW5wY2toYndfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocHVucGNraGJ3LCByZWdzLCByZWdkKQorI2RlZmluZQlwdW5wY2toYncodmFycywgdmFyZCkJbW14X20ybShwdW5wY2toYncsIHZhcnMsIHZhcmQpCisKKworLyoJRW1wdHkgTU14IFN0YXRlCisJKHVzZWQgdG8gY2xlYW4tdXAgd2hlbiBnb2luZyBmcm9tIG1teCB0byBmbG9hdCB1c2UKKwkgb2YgdGhlIHJlZ2lzdGVycyB0aGF0IGFyZSBzaGFyZWQgYnkgYm90aDsgbm90ZSB0aGF0CisJIHRoZXJlIGlzIG5vIGZsb2F0LXRvLW1teCBvcGVyYXRpb24gbmVlZGVkLCBiZWNhdXNlCisJIG9ubHkgdGhlIGZsb2F0IHRhZyB3b3JkIGluZm8gaXMgY29ycnVwdGlibGUpCisqLworI2lmZGVmCU1NWF9UUkFDRQorCisjaWZkZWYgX19jbGFuZ19fCisjZGVmaW5lIGVtbXMoKSBcCisJeyBcCisJCXByaW50ZigiZW1tcygpXG4iKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVtbXMiKTsgXAorCX0KKyNlbHNlCisjZGVmaW5lCWVtbXMoKSBcCisJeyBcCisJCXByaW50ZigiZW1tcygpXG4iKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVtbXMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdCgxKSIsInN0KDIpIiwic3QoMykiLCJzdCg0KSIsInN0KDUpIiwic3QoNikiLCJzdCg3KSIpOyBcCisJfQorI2VuZGlmCisKKyNlbHNlCisKKyNpZmRlZiBfX2NsYW5nX18KKyNkZWZpbmUJZW1tcygpIF9fYXNtX18gX192b2xhdGlsZV9fICgiZW1tcyIpCisjZWxzZQorI2RlZmluZQllbW1zKCkgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlbW1zIjo6OiBcCisgICAgICAgICAgICAgICAgICAgICAgInN0KDEpIiwic3QoMikiLCJzdCgzKSIsInN0KDQpIiwic3QoNSkiLCJzdCg2KSIsInN0KDcpIikKKyNlbmRpZgorCisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2dzdC9nb29tL21vdGlmX2dvb20xLmggYi9nc3QvZ29vbS9tb3RpZl9nb29tMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZjM4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9tb3RpZl9nb29tMS5oCkBAIC0wLDAgKzEsMTA0NCBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworc3RhdGljIE1vdGlmIENPTlZfTU9USUYxID0geworCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNCwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDEzLDksOSw3LDIsMiw5LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDExLAorCTExLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTIsNyw0LDAsMCwwLDIsMCwwLDMsMTQsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTIsMTAsOSw5LDQsMSwwLAorCTEsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxMCwzLDAsMCwwLDEsMSwzLDUsMCwwLDEsMTQsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsNiwzLDEsMSw0LDksMSwKKwkxLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTAsMywwLDAsMiw3LDEzLDE0LDE0LDE0LDcsMCwwLDIsMTQsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTIsMSw5LDE1LDE1LDE1LDE1LDMsCisJMCwxMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEyLDQsCisJMCwwLDIsMTAsMTUsMTUsMTUsMTUsMTUsMTUsMSwwLDAsMTAsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsOSwwLDIsMTQsMTUsMTUsMTUsNywKKwkwLDksMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNCw2LDAsMCwKKwkyLDksMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTMsMCwwLDMsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTEsMCwwLDEwLDE1LDE1LDE1LDksCisJMCw5LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTMsMywwLDEsNSwKKwk1LDQsNCw0LDYsMTIsMTUsMTUsMTUsMTMsMCwwLDcsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMCwwLDUsMTUsMTUsMTUsMTAsCisJMCw3LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTEsMSwwLDMsMywxLAorCTAsMCwwLDAsMCwwLDUsMTMsMTUsMTIsMCwwLDEzLDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEzLDE0LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE0LDAsMCwxLDE1LDE1LDE1LDEyLAorCTAsMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEwLDEsMiw0LDAsMCwxLAorCTksMTIsMTIsMTIsOSwzLDAsMiwxNCw1LDAsNywxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNCw3LDQsNCwxLDEsMTIsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMSwwLDAsMTIsMTUsMTUsMTUsCisJMSwwLDEyLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTAsMCwzLDIsMCwwLDMsMTIsCisJMTUsMTUsMTUsMTUsMTUsMTQsMiwxLDEzLDIsMCwxMiwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNCwzLDAsMCwwLDAsMCwyLAorCTEzLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE0LDEsMCwwLDgsMTUsMTUsMTUsCisJMSwwLDksMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMiwyLDEsMCwwLDAsOSwxNCwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNCwxLDEsMTEsMCwzLDE0LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDcsNCwxMSwxMiwxMCwxLDAsCisJMywxMiwxNSwxNSwxNSwxNSwxNSwxNSwxMywxLDEsMCw0LDE1LDE1LDE1LAorCTIsMCwxMCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE0LDIsMSwwLDAsMywxMiwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxMSwwLDUsOSwxLDEyLDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDUsMSwxMywxNSwxNSwxMiwxLAorCTAsMSw5LDE1LDE1LDE1LDE1LDE1LDE0LDIsNSwwLDEsMTQsMTUsMTUsCisJMiwwLDcsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNCwzLDAsMCwwLDcsMTQsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsOSwwLDgsNyw0LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDcsMCw3LDgsMTEsMTUsMTMsCisJMiwwLDAsMywxMCwxNSwxNSwxNSwxNSw1LDExLDAsMCwxMSwxNSwxNSwKKwk2LDAsMiwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDYsMCwwLDAsOCwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSw2LDAsNCwwLDYsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTQsOSwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMSwwLDMsMywwLDgsMTUsCisJMTQsNSwwLDAsMCw0LDEyLDE1LDE1LDUsMTMsMiwwLDYsMTUsMTUsCisJMTIsMCwwLDExLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTAsMCwwLDAsOCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxMCwxLDcsNiw0LDEzLDE1LDE1LDE1LDE1LDEzLDExLAorCTYsMCw4LDExLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEsMSwxMSwyLDAsNSwKKwkxNCwxNSw4LDAsMCwwLDAsNywxNSw1LDE0LDYsMCwyLDE1LDE1LAorCTE1LDMsMCw1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTMsMSwwLDAsNywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSw3LDksMTUsMTUsMTUsMTUsMTUsMTUsMTIsNiwyLDEsCisJMSwxLDgsNiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw0LDAsNiwxMiwxLDAsCisJMywxMywxNSwxMSwyLDAsMCwwLDgsNCwxNCwxMCwwLDAsMTMsMTUsCisJMTUsNywwLDEsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSw1LDAsMCw1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDEzLDE1LDE1LDE1LDE1LDE0LDgsMywxLDIsNywxMSwKKwk1LDQsNSw2LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDgsMCwxLDE0LDExLDAsCisJMCwxLDksMTUsMTQsNSwwLDAsMiw0LDE0LDEzLDAsMCwxMCwxNSwKKwkxNSwxMiwwLDAsMTIsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxMCwwLDAsMSwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNCwxMyw3LDIsMCw1LDksMTUsMTUsMTUsCisJNSwzLDYsOSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywwLDAsOSwxNSwxMiwKKwkyLDAsMCw0LDEzLDE0LDQsMCwzLDIsMTIsMTUsMSwwLDUsMTUsCisJMTUsMTQsMSwwLDgsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwyLDAsMCw5LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDEyLDExLDYsMSwwLDIsMywxMCwxNSwxNSwxNSwxNSw3LAorCTEsMiw0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDUsMCwzLDE0LDE1LAorCTksMiwwLDAsMSw2LDEyLDEzLDEzLDEsOSwxMiwwLDAsMiwxNCwKKwkxNSwxNSw0LDAsNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDEwLDAsMCwyLDE0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTEzLDksNiwwLDEsMiw5LDEwLDE1LDE1LDE1LDE1LDE0LDcsMSwwLAorCTYsMiw0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDExLDAsMCw5LDE1LAorCTQsNCwxMSw2LDEsMCwwLDEsMSwwLDEwLDQsMCwwLDAsMTIsCisJMTUsMTUsOSwwLDEsMTQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwzLDAsMCw4LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEzLDEyLDQsNCwKKwkxLDEsMywxMCwxMiwxNSwxNSwxNSwxNSwxNSw5LDIsMSwwLDEsNiwKKwk2LDAsMTAsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsNCwwLDMsMTQsCisJNCwzLDE1LDE1LDE0LDksNyw5LDEsMCwwLDAsMCwxLDAsNywKKwkxNSwxNSwxMywwLDAsOSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTEzLDAsMCwxLDE0LDE1LDE1LDE1LDE1LDE1LDEyLDksMSwwLDEsNCwKKwk3LDE1LDE1LDE1LDE1LDE1LDE1LDE0LDgsMiwwLDAsMCwyLDEzLDksCisJMCw0LDE0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDExLDAsMCw5LAorCTMsMCw4LDE0LDE1LDE1LDE1LDE1LDEwLDUsNCw0LDcsNCwwLDMsCisJMTUsMTUsMTUsNCwwLDMsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwk1LDAsMCw1LDE1LDE1LDE1LDE1LDE0LDgsNyw4LDEwLDEyLDE0LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDExLDEsMCwwLDAsNSwxMSwxNSwxMywxLAorCTEsMTMsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMywwLDQsCisJNCwwLDAsMiw2LDEwLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEwLDAsMCwKKwkxMiwxNSwxNSw5LDAsMCwxMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTEsMCwwLDEwLDE1LDE1LDE1LDE1LDE1LDEzLDE0LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE0LDcsMSwwLDAsMywxMiwxNSwxNSwxNSw2LDAsCisJNywxNSwxNSwxNSwxMiwxMCw5LDEwLDEyLDE0LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDksMCwwLAorCTgsMywxLDQsMSwwLDEsMTIsMTUsMTUsMTUsMTUsMTUsMTQsMiwwLAorCTYsMTUsMTUsMTUsMiwwLDYsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkwLDAsMSwxNCwxNSwxNSwxNSwxNSwxNCw1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDcsMiwwLDAsMSw4LDE1LDE1LDE1LDE1LDEyLDAsMiwKKwkxNCwxNSwxMiw0LDAsMCwwLDAsMCwxLDUsMTAsMTQsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMCwwLAorCTUsNCwxLDE0LDE1LDEwLDcsMTMsMTUsMTUsMTUsMTUsMTUsMTUsOCwwLAorCTEsMTQsMTUsMTUsNywwLDEsMTQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywKKwkwLDAsNCwxNSwxNSwxNSwxNSwxNSwxMywyLDEzLDE1LDE1LDE1LDE1LDE1LAorCTEyLDcsMCwwLDAsMCw1LDEyLDE1LDE1LDE1LDE1LDE0LDMsMCw5LAorCTExLDEsMCwwLDEsMSwwLDEsMCwwLDAsMCwyLDEyLDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE0LDE1LDE1LDE1LDE1LDE1LDE1LDIsMCwKKwk1LDIsMSwxNCwxNSwxNCwxMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMiwwLAorCTAsMTAsMTUsMTUsMTMsMCwwLDksMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMiwKKwkwLDAsNCwxNSwxNSwxNSwxNSwxNSwxMiwwLDEyLDE1LDE1LDE1LDEyLDYsCisJMCwwLDAsMCw2LDE0LDE1LDE1LDE1LDE1LDE1LDE1LDcsMCwwLDEyLAorCTEsMCwwLDIsMiwxLDEsNywxMiw4LDMsMCwwLDEsMTMsMTUsCisJMTUsMTUsMTUsMTUsMTUsOCw0LDgsMTIsMTUsMTUsMTUsMTUsMTUsOCwwLAorCTQsMiwwLDE0LDE1LDExLDksMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMywKKwkwLDUsMTUsMTUsMTUsNSwwLDMsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMiwKKwkwLDAsNCwxNSwxNSwxNSwxNSwxNSwxMiwwLDEyLDE1LDEzLDMsMSwwLAorCTAsMCw1LDEyLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEyLDAsMCw3LDcsCisJMCwwLDAsMCwwLDAsMCwxLDEyLDE1LDE1LDEyLDMsMCw1LDE1LAorCTE1LDE1LDE1LDE0LDUsMCwwLDAsMCwyLDIsMyw3LDE0LDksOCwKKwkxNCwyLDEsMTQsMTUsMiwxMiwxMywxNSwxNSwxNSwxNSwxNSwxNSwxNSw5LAorCTAsMCwxMywxNSwxNSwxMCwwLDAsMTIsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywKKwkwLDAsNSwxNSwxNSwxNSwxNSwxNSwxMiwwLDExLDEwLDEsMCwwLDEsCisJNSwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw2LDAsMiw3LDAsCisJMCwwLDAsMSwyLDcsNCwwLDMsMTQsMTUsMTUsMTQsMiwwLDEyLAorCTE1LDE1LDE1LDksMCwxLDIsMSwwLDAsMCwwLDAsMSwzLDcsCisJMTUsMywwLDE0LDE1LDQsMTIsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsCisJMSwwLDgsMTUsMTUsMTQsMSwwLDgsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywKKwkwLDAsNCwxNSwxNSwxNSwxNSwxNSwxMiwwLDIsMCwwLDEsMTAsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTIsMCwwLDYsMCwwLAorCTAsMSwxMCwxNCwxNSwxNSwxMSwxLDAsOSwxNSwxNSwxNSw4LDAsOSwKKwkxNSwxNSwxMiw0LDgsMTQsMTUsOCwxLDAsMCwwLDAsMCwxLDksCisJMTUsMiwwLDEzLDE1LDEsOSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwk2LDAsMSwxNCwxNSwxNCwxLDAsMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE0LAorCTEsMCwxLDE0LDE1LDE1LDE1LDE1LDEyLDEsMyw3LDksMTMsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMywwLDIsMywwLDQsCisJMCw4LDE1LDE1LDE1LDE1LDE1LDEzLDEsMiwxNCwxNSwxNSwxMCwwLDYsCisJMTUsMTQsMiw2LDE1LDE1LDE1LDEsMyw3LDMsMCwwLDAsMCwxLAorCTExLDEsMCwxMSwxMiwwLDEyLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTExLDAsMCw5LDE1LDE1LDQsMCwwLDEyLDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJNiwwLDAsOSwxNSwxNSwxNSwxNSwxNSwxMiwxNCwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMSwwLDAsMywwLDgsMTQsCisJMiw1LDE1LDE1LDE1LDE1LDE1LDE1LDUsMCw4LDE1LDE1LDEyLDAsNCwKKwkxNSw1LDIsMTQsMTUsMTUsMTAsMCwxMywxNSwxMywyLDQsNSw1LDAsCisJOSwxLDAsMTAsOSwxLDE0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTEzLDAsMCwzLDE1LDE1LDksMCwwLDgsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxMiwwLDAsMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwzLDAsMSwxLDUsMTQsMTUsCisJMTEsMCwxMiwxNSwxNSwxNSwxNSwxNSwxNCwxLDEsMTQsMTUsMTIsMCw0LAorCTEwLDAsOSwxNSwxNSwxMSwxLDgsMTUsMTUsOCwxLDE0LDE1LDE0LDIsCisJNSwwLDAsMTAsNiwyLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDMsMCwwLDEyLDE1LDEzLDAsMCwyLDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMywwLDAsMTAsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTAsMCwwLDEsMCwxMSwxNSwxNSwKKwkxNSwyLDYsMTUsMTUsMTUsMTUsMTUsMTUsNiwwLDksMTUsMTMsMCw2LAorCTMsMCwxMywxNSwxNCwyLDYsMTUsMTUsMTMsMSw4LDE1LDE1LDE1LDQsCisJMywxLDAsMTAsNywyLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDksMCwwLDYsMTUsMTUsMywwLDAsMTMsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSw5LDAsMCwyLDE0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDExLDEwLDIsMCwzLDAsMywxNSwxNSwxNSwKKwkxNSw4LDEsMTQsMTUsMTUsMTUsMTUsMTUsMTMsMCwyLDE1LDksMSwxMCwKKwkwLDMsMTUsMTUsNiwyLDE0LDE1LDE0LDMsMSwxNCwxNSwxNSwxNSwyLAorCTQsMCwwLDEyLDUsMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNCwxLDAsMSwxNCwxNSw1LDAsMCwxMiwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDQsMCwwLDYsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMTIsCisJMTIsOSw1LDQsNCwzLDAsMCwwLDAsNCwwLDgsMTUsMTUsMTUsCisJMTUsMTMsMSwxMCwxNSwxNSwxNSwxNSwxNSwxNSwyLDAsMTEsMyw1LDEwLAorCTAsNywxNSw5LDEsMTEsMTUsMTUsOCwwLDYsMTUsMTUsMTUsMTAsMCwKKwkzLDAsMCwxMywzLDYsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsNiwwLDAsMTIsMTUsNSwwLDAsNywxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDEzLDEsMCwwLDgsMTQsMTUsMTUsMTMsNiw0LDQsMSwwLAorCTAsMCwwLDAsMCwwLDIsMCwwLDQsMywwLDEyLDE1LDE1LDE1LAorCTE1LDE1LDUsMywxNSwxNSwxNSwxNSwxNCw4LDAsMCwxLDEsMTIsOSwKKwkwLDksMTAsMCw2LDE1LDE1LDE1LDIsMiwxNCwxNSwxNSwxMywyLDAsCisJNCwwLDEsMTMsMCwxMCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxMywxLDAsMTAsMTUsMTAsMCwwLDUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSw5LDAsMCwwLDMsMiwyLDEsMCwwLDAsMSw0LAorCTQsNSwxMCwxMiwxMiwxMiwxMSwwLDAsMTEsNCwwLDEyLDE1LDE1LDE1LAorCTE1LDE1LDEyLDAsNywxMywxNSwxNSw1LDAsMCwwLDEsNiwxNSw5LAorCTAsMywwLDAsMSw2LDE0LDEwLDAsMTIsMTUsMTUsMTEsMiwwLDIsCisJMywwLDMsMTIsMSwxMSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwzLDAsNiw4LDcsMCwwLDUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSw5LDEsMCwwLDAsMiw2LDEwLDEyLDEyLDE0LDE1LAorCTE1LDE1LDE1LDE1LDExLDUsNCwwLDIsMTQsNCwwLDEyLDE1LDE1LDE1LAorCTE1LDE1LDE1LDQsMCwzLDEzLDYsMCwwLDAsMSwyLDE0LDE1LDEyLAorCTAsMCwwLDAsMCwwLDIsMiw2LDE1LDE0LDgsMCwwLDAsNywKKwk0LDAsNCwxMiwwLDEyLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDEyLDAsMCwwLDAsMCwwLDEsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxMiwyLDAsMCwwLDEsNiwxMSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwyLDEsMCwwLDksMTUsNiwwLDcsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTMsMiwwLDAsMCwwLDAsMCwxLDEyLDE1LDE1LDE1LAorCTQsMCwwLDAsMCwwLDAsNiwxMyw2LDEsMCwwLDQsMTMsMTUsCisJNiwwLDYsMTIsMCwxMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNCw1LDAsMCwwLDAsMCw1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTQsNSwwLDAsMCwwLDAsMiw0LDUsCisJNywzLDYsMywwLDIsMCwyLDE1LDE1LDExLDAsMCw5LDE1LDE1LAorCTE1LDE1LDE1LDE1LDExLDAsMCwwLDAsMCwyLDExLDE1LDE1LDE1LDE1LAorCTEyLDEsMCwwLDEsNCw2LDEwLDIsMCwwLDAsNywxNCwxNSwxNSwKKwk5LDAsOSw5LDAsMTIsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTMsOSw4LDksNywxMywxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEyLDYsMSwwLDAsMCwwLDAsCisJMCwwLDAsMiw4LDAsMCw5LDE1LDE1LDE0LDQsMCwwLDMsMTAsCisJMTQsMTUsMTUsMTUsMTUsMTMsMywwLDAsNCwxNCwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxMSwyLDAsMCwxLDEsMCwwLDAsMSwxMSwxNSwxNSwxNSwxNSwKKwk5LDAsMTAsNSwzLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMTIsMTAsNSw0LDYsCisJMiw0LDEwLDE0LDgsMCwxLDE0LDE1LDE1LDE1LDE0LDUsMCwwLDAsCisJMSwyLDQsNCw0LDMsMSwyLDksMTQsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTEsMTEsMTMsMTAsOSw5LDExLDE1LDE1LDE1LDE1LDE1LDE1LAorCTEwLDAsOCwyLDQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkyLDcsMTUsMTQsMSwwLDYsMTUsMTUsMTUsMTUsMTUsMTUsMTAsNiw0LAorCTIsMiw0LDQsNCwzLDksMTQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTEsMCwzLDEsNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDExLAorCTEsMTAsMTUsOSwwLDAsMTMsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTEsMCwxMSwxMSwxMSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDIsCisJNSwxNSwxNCwyLDAsNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNCwxLDEzLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTAsMSwKKwkxMywxNSwxMSwwLDAsMTIsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDgsMSwKKwkxNSwxNSw1LDAsMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxMCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEyLDIsMywKKwkxNSwxNCwxLDAsNywxNSwxNSwxNSwxNSwxNSwxMywxNSwxNSwxNSwxNSwxNCwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywxMiwxMiwxMSw5LDQsNywxNCwxNSwKKwkxNCwxMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE0LDMsMCwxMCwKKwkxNSw5LDAsMCw4LDcsNCwyLDIsMSwwLDMsNCwzLDQsOSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNCwxMywxMSw3LDQsMiwwLDAsMCwwLDAsMCwxLDEyLDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE0LDEzLDExLDcsNCwyLDIsMTMsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMiwwLDMsMTEsCisJNywxLDAsMCwwLDAsMCwxLDQsOSwxMSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNCwxMiwxMSw5LDcsNCwKKwkzLDEsMCwwLDAsMCwwLDAsMCwwLDAsMiwxMSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywxMSw4LAorCTQsMywxLDAsMCwwLDAsMyw4LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMTEsMywwLDAsMCwKKwkwLDAsMCwyLDYsOSwxMiwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxMyw5LDYsMywxLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMSw0LDcsMTEsMTIsMTIsMTIsMTQsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMTIsMTEsNyw0LDIsMCwwLDAsCisJMCwwLDAsMSw1LDEwLDEzLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTQsMTIsNywzLDEsMCwwLDAsMiw1LAorCTIsMCwyLDE0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE0LDEzLDEyLAorCTExLDksNiw0LDIsMCwwLDAsMCwwLDAsMCwwLDEsMiw0LAorCTUsOSwxMSwxMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNCwxMiwxMSw3LDQsMywxLDAsMCwwLDAsMCwwLDAsMSwKKwk0LDUsMTAsMTQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxMywxMCw1LDEsMCwwLDAsMSwwLDAsMiwxMywxNCwKKwkxLDAsOCwxNSwxNSwxNCwxMiwxMSw5LDgsNCwzLDIsMSwwLDAsCisJMCwwLDAsMCwxLDMsMiwzLDUsOSwxMCwxMiwxMywxNCwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywxMSwxMCw2LDQsCisJMywxLDAsMCwwLDAsMCwwLDAsMCwxLDQsNywxMSwxMywxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDExLDQsMCwwLDAsMSw0LDksMTMsMTMsMSwwLDAsMSw3LAorCTAsMCw3LDgsNSwyLDAsMCwwLDAsMCwwLDEsMiwzLDQsCisJNSw5LDEwLDEyLDE0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE0LDExLDgsNCwzLDEsMCwwLDAsMCwwLAorCTAsMCwwLDAsMSw0LDUsOSwxMiwxMywxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNCwxMiw5LDgsOCw3LDQsMiw1LDQsNSw1LDEyLDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMTAsNSwKKwkxLDAsMSwzLDYsMTEsMTQsMTUsMTUsMTUsMTUsMTMsMTIsOCwzLDIsCisJMCwwLDEsMSwzLDMsNCw1LDgsMTAsMTIsMTMsMTQsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTMsCisJMTEsOSw2LDQsMiwxLDAsMCwwLDAsMCwwLDAsMSwyLDQsCisJNiwxMCwxMSwxMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywxMSw5LDcsCisJNCwyLDEsMCwwLDAsMCwyLDQsNywxMiwxNCwxNCwxNCwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEwLDUsMSwxLDMsCisJOCwxMiwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw5LAorCTMsMTEsMTQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsOCw2LDksOSw5LDksOSw4LDUsNCw0LDMsMSwwLAorCTAsMCwwLDAsMSwyLDMsMiw0LDUsOSwxMSwxMiwxNCwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNCwxMiw5LDUsMiwwLDAsMCwwLAorCTAsMSwyLDQsNywxMCwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE0LDksNCwxLDMsOSwxMywxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywKKwkxMSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxMywzLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwyLDMsCisJNSw4LDEwLDEyLDE0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDEyLDUsMiwwLDAsMCwxLDMsNCw3LDEwLAorCTEyLDEzLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTMsMTEsMTMsMTMsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMTIsMTIsMTIsMTMsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsOCwxLDAsMSw0LDcsMTEsMTMsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxMyw3LDgsMTEsMTQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0KKwl9OwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vbW90aWZfZ29vbTIuaCBiL2dzdC9nb29tL21vdGlmX2dvb20yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRlOTJhZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL21vdGlmX2dvb20yLmgKQEAgLTAsMCArMSwxMDQ0IEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCitzdGF0aWMgTW90aWYgQ09OVl9NT1RJRjIgPSB7CisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTIsNSwxNCwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDEyLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEwLDEsMTQsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxMCwwLDEyLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDYsMCwxMiwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDcsMCw4LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEzLDIsMCwxMCwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDYsMCwyLDE0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDUsMCwwLDEwLAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsOSwwLDAsMTIsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsOSwwLDAsMSwxNCwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDgsMCwwLDgsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsOCwzLDAsMCwwLDksMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxMSwwLDAsMiwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxMyw5LDUsMyw0LDEsMCwwLDAsMCw3LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTQsNCwwLDAsNCwxMSwxMywxMywxNSwxNSwxNCwxMiwxMCw4LDUsCisJNiw0LDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxNCwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDEyLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsOSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTEzLDksMTAsMTMsMTQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTIsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDIsNSw2LDAsMCwwLDAsMTIsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwk1LDAsMCwwLDMsMTAsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTQsOSwyLDEsMCwwLDAsMSw0LDYsNiwxLAorCTAsMCwwLDgsMTMsMTUsMTUsMTUsMTIsMSwwLDIsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNCwKKwkyLDAsMCwwLDAsMCw0LDEyLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDMsMCwwLDEwLDE1LDE1LDE1LDEwLAorCTAsMCw0LDE1LDE1LDE1LDE1LDE1LDE1LDIsMCw2LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsNSwKKwkzLDExLDUsMCwwLDAsMCwwLDQsMTEsMTQsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsNywwLDAsMTMsMTUsMTUsMTUsMTEsCisJMCwwLDcsMTUsMTUsMTUsMTUsMTUsMTUsMSwwLDksMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw5LDAsCisJMTMsMTUsMTUsMTIsNSwwLDAsMCwwLDAsMSw4LDE0LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDcsMCwxLDE0LDE1LDE1LDE1LDExLAorCTAsMCw3LDE1LDE1LDE1LDE1LDE1LDE0LDAsMCw5LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTEsMSwxMCwKKwkxNSwxNSwxNSwxNSwxNSwxMSw1LDAsMCwwLDAsMCwxLDYsMTMsMTUsCisJMTUsMTUsMTUsMTUsMTQsOCwxMSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw2LDAsMiwxNSwxNSwxNSwxNSwxMSwKKwkwLDAsNiwxNSwxNSwxNSwxNSwxNSwxMywwLDAsMTEsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMSwxLDYsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsNSwwLDAsMCwwLDAsMCw2LAorCTE0LDE1LDE1LDE1LDYsMCw0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDcsMCw1LDE1LDE1LDE1LDE1LDExLAorCTAsMCw1LDE1LDE1LDE1LDE1LDE1LDEyLDAsMCwxMiwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEzLDIsMSwxMywxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMiwyLDAsMCwwLDAsMCwKKwkxLDYsMTEsNywwLDAsNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw3LDAsNywxNSwxNSwxNSwxNSwxMSwKKwkwLDAsNiwxNSwxNSwxNSwxNSwxNSwxMiwwLDAsMTIsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw1LDAsNywxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMSw1LDAsMCwwLAorCTAsMCwwLDAsMCwxLDExLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDcsMCwxMCwxNSwxNSwxNSwxNSwxMSwKKwkwLDAsNiwxNSwxNSwxNSwxNSwxNSwxMiwwLDAsMTIsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMCwwLDQsMTQsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTMsNywwLAorCTAsMCwwLDAsMCwxLDYsMTIsMTQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsNywwLDEwLDE1LDE1LDE1LDE1LDExLAorCTAsMCw3LDE1LDE1LDE1LDE1LDE1LDEyLDAsMCwxMiwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEzLDEsMSwxMiwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywKKwk1LDAsMCwwLDAsMCwwLDAsMywxMCwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw3LDAsMTAsMTUsMTUsMTUsMTUsMTEsCisJMCwwLDcsMTUsMTUsMTUsMTUsMTUsMTEsMCwwLDEzLDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsNCwwLDgsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTMsMCwwLDAsMSwwLDAsMCwwLDEsMTMsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsNywwLDEwLDE1LDE1LDE1LDE1LDExLAorCTAsMCw4LDE1LDE1LDE1LDE1LDE1LDgsMCwyLDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsOSwwLDQsMTQsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsCisJNCwwLDAsNSwxMywxMiw2LDIsMCwyLDEzLDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDcsMCwxMCwxNSwxNSwxNSwxNSwxMSwKKwkwLDAsNywxNSwxNSwxNSwxNSwxNSw0LDAsNCwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDEzLDEsMSwxMywxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMSwKKwkwLDAsMSwxMywxNSwxNSwxNSwxNCw5LDEzLDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDUsMCw2LDE1LDE1LDE1LDE1LDExLAorCTAsMCw4LDE1LDE1LDE1LDE1LDE1LDIsMCw4LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsNSwwLDksMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTQsMTEsMTUsMTUsMTUsMTUsMTUsMTUsMTUsOSwKKwkwLDAsMTAsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsNCwwLDQsMTUsMTUsMTUsMTUsMTEsCisJMCwwLDcsMTUsMTUsMTUsMTUsMTMsMCwwLDExLDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTAsMCwzLDE0LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE0LDMsMCwxMywxNSwxNSwxNSwxNSwxNSwxNSwxNCwKKwk5LDExLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDQsMCw0LDE1LDE1LDE1LDE1LDExLAorCTAsMCw4LDE1LDE1LDE1LDE1LDEyLDAsMCwxMiwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE0LDIsMSwxMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNCwzLDAsMCw5LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDYsMCwzLDE1LDE1LDE1LDE1LDEzLAorCTEsMCw4LDE1LDE1LDE1LDE1LDEyLDAsMCwxMiwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDksMCw1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE0LDQsMCwwLDAsMTAsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsOCwwLDIsMTUsMTUsMTUsMTUsMTUsCisJMywwLDEzLDE1LDE1LDE1LDE1LDEyLDAsMCwxMiwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDEzLDIsMSwxMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSw3LDAsMCwwLDAsOCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMCwwLDEsMTQsMTUsMTUsMTUsMTUsCisJMTEsNSwxNSwxNSwxNSwxNSwxNSwxMiwwLDAsMTEsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSw2LDAsNywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSw4LDAsMCwwLDAsMCwwLDksMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTIsMCwwLDEyLDE1LDE1LDE1LDE1LAorCTE1LDE0LDE1LDE1LDE1LDE1LDE1LDEwLDAsMCwxMiwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDEzLDEsMiwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxMCwwLDAsMCw2LDYsMCwwLDAsNSwxMiwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMiwxMiwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywwLDAsMTEsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsOSwwLDEsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSw3LDAsOCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSw5LDAsMCw0LDE1LDE1LDgsMCwwLDAsMSw1LDEzLDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEyLDgsNyw2LDUsMywKKwkzLDMsNCwxMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw3LDAsNiwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNCwxLDAsMTAsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsNiwwLDMsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxMywxLDAsMTMsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTQsNyw4LDEzLDE1LDE1LDE1LDExLDIsMCwwLDAsMCw1LDExLAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEzLDMsMCwwLDAsMCwwLDAsCisJMCwwLDAsNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMiwxLDAsMCwKKwkzLDExLDE1LDE1LDE1LDE1LDE1LDE1LDEzLDEsMCwxMCwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwzLDAsNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDksMCw1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE0LDgsMSwwLDAsMCwwLAorCTQsMTIsMTUsMTUsMTUsMTUsMTUsMTUsNCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDIsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsNCwwLDAsMCwKKwkwLDAsOSwxNSwxNSwxNSwxNSwxNSwxNCwxLDAsMTAsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMiwwLDksMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNCw0LDAsMTEsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsOCwyLDAsMCwKKwkwLDAsNCwxMCwxNCwxNSwxNSwxNSw0LDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMywxNSwxNSwxNSwxNSwxNSwxNSwxNSw2LDAsMCwwLDIsCisJMywwLDAsOCwxNSwxNSwxNSwxNSwxNCwxLDAsMTAsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMSwwLDksMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNCw1LDAsNCwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNCw5LDMsCisJMCwwLDAsMCwyLDUsMTAsMTUsNSwwLDEsMTEsMTEsMTIsMTMsMTUsCisJMTEsMCwwLDcsMTUsMTUsMTUsMTUsMTUsMTUsOCwwLDAsMCwxLDEyLAorCTE0LDYsMCwwLDcsMTQsMTUsMTUsMTQsMSwwLDksMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMiwwLDEwLDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJOSwwLDEsMTMsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsCisJMTAsMiwwLDAsMCwwLDEsMTQsNCwwLDEsMTQsMTUsMTUsMTUsMTUsCisJOSwwLDAsOSwxNSwxNSwxNSwxNSwxNSw5LDAsMCwwLDAsOSwxNSwKKwkxNSwxNSw3LDAsMCw2LDE0LDE1LDE1LDMsMCw2LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDEsMCw5LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsOSwKKwkwLDAsMSwxMCwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxMywxLDAsMCwwLDEsMTQsMywwLDAsMTQsMTUsMTUsMTUsMTUsCisJNSwwLDAsMTEsMTUsMTUsMTUsMTUsMTMsMSwwLDAsMCw2LDE1LDE1LAorCTE1LDE1LDE1LDgsMCwwLDIsMTAsMTUsNiwwLDMsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMiwwLDEwLDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTMsMSwKKwkwLDAsMCwwLDMsOSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSw2LDEsMCwwLDAsOCwxNSwxLDAsMCwxNCwxNSwxNSwxNSwxNSwKKwk0LDAsMCwxMywxNSwxNSwxNSwxNCw0LDAsMCwwLDMsMTQsMTUsMTUsCisJMTUsMTUsMTUsMTUsNSwwLDAsMSwxNCw5LDAsMSwxNCwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxLDAsOSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEzLDEsCisJMCwwLDAsMCwwLDAsNCwxMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwk5LDAsMCwwLDAsNywxNSwxNSwxLDAsMCwxNCwxNSwxNSwxNSwxNCwKKwkyLDAsMSwxNCwxNSwxNSwxNSwxMiwwLDAsMCwzLDEzLDE1LDE1LDE1LAorCTE1LDE1LDE1LDksMCwwLDAsMSwxNCwxMiwwLDAsMTIsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTQsMSwwLDEwLDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTIsCisJMywwLDAsMCwwLDAsMCwxLDgsMTQsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsOSwKKwkwLDAsMCwwLDcsMTUsMTUsMTUsMSwwLDAsMTQsMTUsMTUsMTUsMTMsCisJMCwwLDEsMTUsMTUsMTUsMTUsMTIsMCwwLDAsNiwxNCwxNSwxNSwxNSwKKwkxNSwxNSwxMiwwLDAsMCwwLDMsMTQsMTIsMCwwLDEyLDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDEyLDAsMCwxMiwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDEzLDMsMCwwLDAsMCwwLDAsMSw2LDEzLDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEyLDAsCisJMCwwLDAsMywxNSwxNSwxNSwxMiwwLDAsMCwxNCwxNSwxNSwxNSwxMSwKKwkwLDAsMywxNSwxNSwxNSwxNSwxNSwxMiw3LDAsMCw0LDE0LDE1LDE1LAorCTE1LDExLDEsMCwwLDAsNCwxMywxNSwxMiwwLDAsMTIsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTAsMCwxLDE0LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTIsNywwLDAsMCwwLDAsMCwwLDMsOCwxMiwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw0LDAsCisJMCwwLDEsMTMsMTUsMTUsMTUsNiwwLDAsMCwxNCwxNSwxNSwxNSw4LAorCTAsMCw3LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDgsMSwwLDIsMTMsMTUsCisJMTQsMiwwLDAsMCw0LDE0LDE1LDE1LDEzLDEsMCwxMCwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSw5LDAsMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDExLDYsMiwwLDAsMCwwLDAsMCwwLDEsCisJMTAsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsOCwwLDAsCisJMCwwLDEwLDE1LDE1LDE1LDE1LDQsMCwwLDEsMTUsMTUsMTUsMTUsNCwKKwkwLDAsOCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMCwxLDAsMSw4LAorCTIsMCwwLDAsNSwxNSwxNSwxNSwxNSwxNSwyLDAsNiwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSw5LDAsMSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDksMSwwLDAsMCwwLDAsMCwKKwkwLDEsNywxMywxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSw5LDAsMCwwLAorCTAsNiwxNSwxNSwxNSwxNSwxNSw0LDAsMCw0LDE1LDE1LDE1LDE0LDEsCisJMCwwLDksMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTIsMiwwLDAsCisJMCwwLDAsNCwxNCwxNSwxNSwxNSwxNSwxNSw0LDAsNCwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSw3LDAsMCwxNCwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE0LDExLDYsMiwwLDAsMCwKKwkwLDAsMCwwLDEsOSwxMiwxNSwxNSwxNSwxNSwxNCwzLDAsMCwwLAorCTQsMTUsMTUsMTUsMTUsMTUsMTUsNCwwLDAsMyw2LDQsNCwyLDAsCisJMCwwLDEzLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEyLDEsMCwKKwkwLDAsMywxNCwxNSwxNSwxNSwxNSwxNSwxNSw0LDAsNCwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSw1LDAsMCwxMiwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDgsMiwwLAorCTAsMCwwLDAsMCwwLDAsMSw5LDE1LDE1LDUsMCwwLDAsMCwKKwkxMiwxNSwxNSwxNSwxNSwxNSwxNSw0LDAsMCwwLDAsMCwwLDAsMCwKKwkwLDMsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsNCwwLAorCTAsMSwxMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSw2LDAsMSwxNCwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSw1LDAsMCwxMywxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEyLAorCTcsMSwwLDAsMCwwLDAsMCwwLDUsNywwLDAsMCwwLDEwLAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDcsMCwwLDAsMCwwLDAsMCwwLAorCTEsMTAsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMywwLAorCTMsMTIsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTIsMCwwLDEyLDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDUsMCwwLDEsMSw0LDExLDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTEsNiwxLDAsMCwwLDAsMCwwLDAsMCwwLDcsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsNyw0LDQsNCw1LDksMTIsMTMsCisJMTQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTEsOSwKKwkxNCwxNSwxNSwxNCwxMiwxMSwxMSwxMSwxMCw5LDcsMCwwLDUsMTMsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTIsMSwwLDAsMCwwLDAsMCwxMCwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE0LDcsMSwwLDAsMCwwLDAsMywxNCwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxMywyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4LAorCTE1LDE1LDE1LDE1LDE1LDExLDAsMCwwLDAsMCwwLDAsOSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDEzLDUsMCwwLDAsMCwxMiwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSw4LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTAsNSw2LDcsNyw3LDksMTQsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSw4LDMsMiwyLDIsMiw1LDE0LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEwLDMsMCw2LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDEzLDMsMSwwLDEsMCwxLDEsMiw0LDQsMyw5LDE0LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTIsNCwwLDEsNiw3LDcsNCwxLDMsMTMsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMTAsMTMsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTEsMTEsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNCwyLDAsNCwxMywxNSwxNSwxNSwxNSwxMCwwLDEyLAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE0LDEzLDE0LDEyLDEyLDEyLDEyLDEyLDEyLDEyLAorCTEyLDE0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDQsMTQsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSw3LDEsNSwxNCwxNSwxNSwxNSwxNSwxNSwxMiwxLDExLAorCTE1LDE1LDE1LDEzLDEyLDEzLDE1LDE1LDE0LDExLDEzLDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDExLDYsMywxLDEsMSwwLDAsMCwwLDAsMCwwLAorCTAsMSw0LDcsMTEsMTQsMTUsMTUsMTUsMTQsNCwxNSwxMywxMCwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNCw3LDQsNSwKKwkxMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDEzLDEsMSwxNCwxNSwxNSwxNCwxMCwxMiwxNSwxMSwxLDEyLAorCTE1LDE1LDExLDEsMCw0LDE1LDE1LDYsMCwyLDE0LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE0LDgsNiwzLDMsMiwyLDEsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDMsMTEsMTUsMTUsMTEsOCwxNSwxMiw2LDE1LDksCisJOCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMCw0LDQsMSwKKwk0LDE1LDE1LDE1LDE1LDExLDYsMiw4LDE0LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTIsMCw0LDE1LDE1LDE1LDExLDIsMTAsMTUsOSwxLDEzLAorCTE1LDEzLDEsNyw2LDIsMTQsMTQsMSwyLDEsMTQsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTMsMTIsMTIsMTIsMTIsMTIsMTIsCisJMTEsMTEsMTEsMTAsOSwxMCwxMiwxNSwxNSw2LDcsMTUsOSw0LDE1LDQsCisJMSwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwyLDExLDE1LDQsCisJNCwxNSwxNSwxNSwxNSwzLDksNCwwLDksMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxMiwwLDQsMTUsMTUsMTUsNSwwLDYsNiwxLDksMTUsCisJMTUsNCwxLDEzLDEwLDEsMTMsOSwyLDcsMSwxNCwxNCwxNCwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwzLDUsMTUsMyw1LDE0LDEsCisJMCwxMiwxMyw5LDE0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDIsMiw0LDEsCisJNiwxNSwxNSwxNSwxNCwxLDUsNiwwLDksMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxMiwwLDQsMTUsMTUsMTUsMTIsNCwyLDIsMTAsMTUsMTUsCisJMTEsMCw2LDE1LDEyLDAsMTAsNyw5LDEwLDEsMTQsNywxNCwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxMywxMiwxMSwxMSwxMCw5LDksMTAsMTEsMTMsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMSw5LDE1LDIsNywxNCwxLAorCTAsMTAsNywwLDgsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTEsNCw0LDQsCisJMTMsMTUsMTUsMTUsMTUsMTAsMiwyLDQsMTQsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxMiwwLDQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJNCwyLDE0LDE1LDE1LDEsOSw1LDE0LDksMSwxNCw4LDE0LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDEwLDMsMCwxLDAsMCwwLDAsMCwwLDUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMSw5LDE0LDEsOCwxNCwxLAorCTAsMTEsMTMsNiwxMSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDEyLDAsNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMSwKKwkwLDYsMTUsMTUsMTUsMSw1LDMsMTMsMTAsMCw2LDgsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTMsMTIsMTIsMTEsMTAsOSw5LDEwLDExLDEzLAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEsOSwxMiwxLDExLDE1LDQsCisJMSwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNCwxMCw0LDIsMTIsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxMiwxLDMsMTQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsNCwKKwkzLDE0LDE1LDE1LDE1LDUsMSw4LDE1LDE0LDUsMiw5LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDExLDksMTMsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMSw5LDEyLDEsMTIsMTUsMTMsCisJMTEsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTAsMiw5LDIsMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE0LDQsMCw1LDE0LDE1LDE1LDE1LDE1LDE1LDE1LDExLDAsCisJNiwxNSwxNSwxNSwxNSwxNSwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw4LDEsMCwzLDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEsOSwxNSwxMSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwk3LDEsMTIsNiwxLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTEsMSwwLDMsOCw5LDksMTAsMTEsOSw1LDQsCisJMTMsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTIsOSwxMywxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw1LDExLDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTEwLDMsNCwxLDUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxMiwyLDAsMCwwLDAsMCwwLDEsOCwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNCwxMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDEzLDgsOCwxMCw5LDEwLDExLDE0LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9CisJfTsKZGlmZiAtLWdpdCBhL2dzdC9nb29tL3BsdWdpbl9pbmZvLmMgYi9nc3QvZ29vbS9wbHVnaW5faW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZDU3MGMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9wbHVnaW5faW5mby5jCkBAIC0wLDAgKzEsMjYyIEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJnb29tX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiZ29vbV9wbHVnaW5faW5mby5oIgorI2luY2x1ZGUgImdvb21fZnguaCIKKyNpbmNsdWRlICJkcmF3bWV0aG9kcy5oIgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEhBVkVfT1JDCisjaW5jbHVkZSA8b3JjL29yYy5oPgorI2VuZGlmCisKKworI2lmIGRlZmluZWQgKEhBVkVfQ1BVX1BQQzY0KSB8fCBkZWZpbmVkIChIQVZFX0NQVV9QUEMpCisjaW5jbHVkZSAicHBjX3pvb21fdWx0aW1hdGUuaCIKKyNpbmNsdWRlICJwcGNfZHJhd2luZ3MuaCIKKyNlbmRpZiAvKiBIQVZFX0NQVV9QUEM2NCB8fCBIQVZFX0NQVV9QUEMgKi8KKworCisjaWZkZWYgSEFWRV9NTVgKKyNpbmNsdWRlICJtbXguaCIKKyNlbmRpZiAvKiBIQVZFX01NWCAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKGdvb21fZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ29vbV9kZWJ1ZworCitzdGF0aWMgdm9pZAorc2V0T3B0aW1pemVkTWV0aG9kcyAoUGx1Z2luSW5mbyAqIHApCit7CisjaWZkZWYgSEFWRV9PUkMKKyAgdW5zaWduZWQgaW50IGNwdUZsYXZvdXIgPQorICAgICAgb3JjX3RhcmdldF9nZXRfZGVmYXVsdF9mbGFncyAob3JjX3RhcmdldF9nZXRfYnlfbmFtZSAoIm1teCIpKTsKKyNlbHNlCisgIHVuc2lnbmVkIGludCBjcHVGbGF2b3VyID0gMDsKKyNlbmRpZgorCisgIC8qIHNldCBkZWZhdWx0IG1ldGhvZHMgKi8KKyAgcC0+bWV0aG9kcy5kcmF3X2xpbmUgPSBkcmF3X2xpbmU7CisgIHAtPm1ldGhvZHMuem9vbV9maWx0ZXIgPSB6b29tX2ZpbHRlcl9jOworLyogICAgcC0+bWV0aG9kcy5jcmVhdGVfb3V0cHV0X3dpdGhfYnJpZ2h0bmVzcyA9IGNyZWF0ZV9vdXRwdXRfd2l0aF9icmlnaHRuZXNzOyovCisKKyAgR1NUX0lORk8gKCJvcmMgY3B1IGZsYWdzOiAweCUwOHgiLCBjcHVGbGF2b3VyKTsKKworLyogRklYTUU6IHdoYXQgYWJvdXQgSEFWRV9DUFVfWDg2XzY0ID8gKi8KKyNpZmRlZiBIQVZFX0NQVV9JMzg2CisjaWZkZWYgSEFWRV9NTVgKKyNpZmRlZiBIQVZFX09SQworICBHU1RfSU5GTyAoImhhdmUgYW4geDg2Iik7CisgIGlmIChjcHVGbGF2b3VyICYgT1JDX1RBUkdFVF9NTVhfTU1YRVhUKSB7CisgICAgR1NUX0lORk8gKCJFeHRlbmRlZCBNTVggZGV0ZWN0ZWQuIFVzaW5nIHRoZSBmYXN0ZXN0IG1ldGhvZHMhIik7CisgICAgcC0+bWV0aG9kcy5kcmF3X2xpbmUgPSBkcmF3X2xpbmVfeG1teDsKKyAgICBwLT5tZXRob2RzLnpvb21fZmlsdGVyID0gem9vbV9maWx0ZXJfeG1teDsKKyAgfSBlbHNlIGlmIChjcHVGbGF2b3VyICYgT1JDX1RBUkdFVF9NTVhfTU1YKSB7CisgICAgR1NUX0lORk8gKCJNTVggZGV0ZWN0ZWQuIFVzaW5nIGZhc3QgbWV0aG9kcyEiKTsKKyAgICBwLT5tZXRob2RzLmRyYXdfbGluZSA9IGRyYXdfbGluZV9tbXg7CisgICAgcC0+bWV0aG9kcy56b29tX2ZpbHRlciA9IHpvb21fZmlsdGVyX21teDsKKyAgfSBlbHNlIHsKKyAgICBHU1RfSU5GTyAoIlRvbyBiYWQgISBObyBTSU1EIG9wdGltaXphdGlvbiBhdmFpbGFibGUgZm9yIHlvdXIgQ1BVLiIpOworICB9CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmIC8qIEhBVkVfQ1BVX0kzODYgKi8KKworLyogZGlzYWJsZSBhbGwgUFBDIHN0dWZmIHVudGlsIHNvbWVvbmUgZmluZHMgb3V0IHdoYXQgdG8gdXNlIGhlcmUgaW5zdGVhZCBvZgorICogQ1BVX09QVElPTl82NF9CSVRTLCBhbmQgdW50aWwgc29tZW9uZSBmaXhlcyB0aGUgYXNzZW1ibHkgYnVpbGQgZm9yIHBwYyAqLworI2lmIDAKKyNpZmRlZiBIQVZFX0NQVV9QUEM2NAorICBpZiAoKGNwdUZsYXZvdXIgJiBDUFVfT1BUSU9OXzY0X0JJVFMpICE9IDApIHsKKy8qICAgICAgICAgICAgcC0+bWV0aG9kcy5jcmVhdGVfb3V0cHV0X3dpdGhfYnJpZ2h0bmVzcyA9IHBwY19icmlnaHRuZXNzX0c1OyAgICAgICAgKi8KKyAgICBwLT5tZXRob2RzLnpvb21fZmlsdGVyID0gcHBjX3pvb21fZ2VuZXJpYzsKKyAgfQorI2VuZGlmIC8qIEhBVkVfQ1BVX1BQQzY0ICovCisKKyNpZmRlZiBIQVZFX0NQVV9QUEMKKyAgaWYgKChjcHVGbGF2b3VyICYgT1JDX1RBUkdFVF9BTFRJVkVDX0FMVElWRUMpICE9IDApIHsKKy8qICAgICAgICAgICAgcC0+bWV0aG9kcy5jcmVhdGVfb3V0cHV0X3dpdGhfYnJpZ2h0bmVzcyA9IHBwY19icmlnaHRuZXNzX0c0OyAgICAgICAgKi8KKyAgICBwLT5tZXRob2RzLnpvb21fZmlsdGVyID0gcHBjX3pvb21fRzQ7CisgIH0gZWxzZSB7CisvKiAgICAgICAgICAgIHAtPm1ldGhvZHMuY3JlYXRlX291dHB1dF93aXRoX2JyaWdodG5lc3MgPSBwcGNfYnJpZ2h0bmVzc19nZW5lcmljOyovCisgICAgcC0+bWV0aG9kcy56b29tX2ZpbHRlciA9IHBwY196b29tX2dlbmVyaWM7CisgIH0KKyNlbmRpZiAvKiBIQVZFX0NQVV9QUEMgKi8KKyNlbmRpZgorfQorCit2b2lkCitwbHVnaW5faW5mb19pbml0IChQbHVnaW5JbmZvICogcHAsIGludCBuYlZpc3VhbHMpCit7CisKKyAgaW50IGk7CisKKyAgbWVtc2V0IChwcCwgMCwgc2l6ZW9mIChQbHVnaW5JbmZvKSk7CisKKyAgcHAtPnNvdW5kLnNwZWVkdmFyID0gcHAtPnNvdW5kLmFjY2VsdmFyID0gcHAtPnNvdW5kLnRvdGFsZ29vbSA9IDA7CisgIHBwLT5zb3VuZC5wcm92X21heCA9IDA7CisgIHBwLT5zb3VuZC5nb29tX2xpbWl0ID0gMTsKKyAgcHAtPnNvdW5kLmFsbFRpbWVzTWF4ID0gMTsKKyAgcHAtPnNvdW5kLnRpbWVTaW5jZUxhc3RHb29tID0gMTsKKyAgcHAtPnNvdW5kLnRpbWVTaW5jZUxhc3RCaWdHb29tID0gMTsKKyAgcHAtPnNvdW5kLmN5Y2xlID0gMDsKKworICBzZWN1cmVfZl9mZWVkYmFjayAoJnBwLT5zb3VuZC52b2x1bWVfcCwgIlNvdW5kIFZvbHVtZSIpOworICBzZWN1cmVfZl9mZWVkYmFjayAoJnBwLT5zb3VuZC5hY2NlbF9wLCAiU291bmQgQWNjZWxlcmF0aW9uIik7CisgIHNlY3VyZV9mX2ZlZWRiYWNrICgmcHAtPnNvdW5kLnNwZWVkX3AsICJTb3VuZCBTcGVlZCIpOworICBzZWN1cmVfZl9mZWVkYmFjayAoJnBwLT5zb3VuZC5nb29tX2xpbWl0X3AsICJHb29tIExpbWl0Iik7CisgIHNlY3VyZV9mX2ZlZWRiYWNrICgmcHAtPnNvdW5kLmxhc3RfZ29vbV9wLCAiR29vbSBEZXRlY3Rpb24iKTsKKyAgc2VjdXJlX2ZfZmVlZGJhY2sgKCZwcC0+c291bmQubGFzdF9iaWdnb29tX3AsICJCaWcgR29vbSBEZXRlY3Rpb24iKTsKKyAgc2VjdXJlX2ZfZmVlZGJhY2sgKCZwcC0+c291bmQuZ29vbV9wb3dlcl9wLCAiR29vbSBQb3dlciIpOworCisgIHNlY3VyZV9pX3BhcmFtICgmcHAtPnNvdW5kLmJpZ2dvb21fc3BlZWRfbGltaXRfcCwgIkJpZyBHb29tIFNwZWVkIExpbWl0Iik7CisgIElWQUwgKHBwLT5zb3VuZC5iaWdnb29tX3NwZWVkX2xpbWl0X3ApID0gMTA7CisgIElNSU4gKHBwLT5zb3VuZC5iaWdnb29tX3NwZWVkX2xpbWl0X3ApID0gMDsKKyAgSU1BWCAocHAtPnNvdW5kLmJpZ2dvb21fc3BlZWRfbGltaXRfcCkgPSAxMDA7CisgIElTVEVQIChwcC0+c291bmQuYmlnZ29vbV9zcGVlZF9saW1pdF9wKSA9IDE7CisKKyAgc2VjdXJlX2lfcGFyYW0gKCZwcC0+c291bmQuYmlnZ29vbV9mYWN0b3JfcCwgIkJpZyBHb29tIEZhY3RvciIpOworICBJVkFMIChwcC0+c291bmQuYmlnZ29vbV9mYWN0b3JfcCkgPSAxMDsKKyAgSU1JTiAocHAtPnNvdW5kLmJpZ2dvb21fZmFjdG9yX3ApID0gMDsKKyAgSU1BWCAocHAtPnNvdW5kLmJpZ2dvb21fZmFjdG9yX3ApID0gMTAwOworICBJU1RFUCAocHAtPnNvdW5kLmJpZ2dvb21fZmFjdG9yX3ApID0gMTsKKworICBwbHVnaW5fcGFyYW1ldGVycyAoJnBwLT5zb3VuZC5wYXJhbXMsICJTb3VuZCIsIDExKTsKKworICBwcC0+bmJQYXJhbXMgPSAwOworICBwcC0+cGFyYW1zID0gTlVMTDsKKyAgcHAtPm5iVmlzdWFscyA9IG5iVmlzdWFsczsKKyAgcHAtPnZpc3VhbHMgPSAoVmlzdWFsRlggKiopIG1hbGxvYyAoc2l6ZW9mIChWaXN1YWxGWCAqKSAqIG5iVmlzdWFscyk7CisKKyAgcHAtPnNvdW5kLnBhcmFtcy5wYXJhbXNbMF0gPSAmcHAtPnNvdW5kLmJpZ2dvb21fc3BlZWRfbGltaXRfcDsKKyAgcHAtPnNvdW5kLnBhcmFtcy5wYXJhbXNbMV0gPSAmcHAtPnNvdW5kLmJpZ2dvb21fZmFjdG9yX3A7CisgIHBwLT5zb3VuZC5wYXJhbXMucGFyYW1zWzJdID0gMDsKKyAgcHAtPnNvdW5kLnBhcmFtcy5wYXJhbXNbM10gPSAmcHAtPnNvdW5kLnZvbHVtZV9wOworICBwcC0+c291bmQucGFyYW1zLnBhcmFtc1s0XSA9ICZwcC0+c291bmQuYWNjZWxfcDsKKyAgcHAtPnNvdW5kLnBhcmFtcy5wYXJhbXNbNV0gPSAmcHAtPnNvdW5kLnNwZWVkX3A7CisgIHBwLT5zb3VuZC5wYXJhbXMucGFyYW1zWzZdID0gMDsKKyAgcHAtPnNvdW5kLnBhcmFtcy5wYXJhbXNbN10gPSAmcHAtPnNvdW5kLmdvb21fbGltaXRfcDsKKyAgcHAtPnNvdW5kLnBhcmFtcy5wYXJhbXNbOF0gPSAmcHAtPnNvdW5kLmdvb21fcG93ZXJfcDsKKyAgcHAtPnNvdW5kLnBhcmFtcy5wYXJhbXNbOV0gPSAmcHAtPnNvdW5kLmxhc3RfZ29vbV9wOworICBwcC0+c291bmQucGFyYW1zLnBhcmFtc1sxMF0gPSAmcHAtPnNvdW5kLmxhc3RfYmlnZ29vbV9wOworCisgIHBwLT5zdGF0ZXNOdW1iZXIgPSA4OworICBwcC0+c3RhdGVzUmFuZ2VNYXggPSA1MTA7CisgIHsKKyAgICBHb29tU3RhdGUgc3RhdGVzWzhdID0geworICAgICAgezEsIDAsIDAsIDEsIDQsIDAsIDEwMH0KKyAgICAgICwKKyAgICAgIHsxLCAwLCAwLCAwLCAxLCAxMDEsIDE0MH0KKyAgICAgICwKKyAgICAgIHsxLCAwLCAwLCAxLCAyLCAxNDEsIDIwMH0KKyAgICAgICwKKyAgICAgIHswLCAxLCAwLCAxLCAyLCAyMDEsIDI2MH0KKyAgICAgICwKKyAgICAgIHswLCAxLCAwLCAxLCAwLCAyNjEsIDMzMH0KKyAgICAgICwKKyAgICAgIHswLCAxLCAxLCAxLCA0LCAzMzEsIDQwMH0KKyAgICAgICwKKyAgICAgIHswLCAwLCAxLCAwLCA1LCA0MDEsIDQ1MH0KKyAgICAgICwKKyAgICAgIHswLCAwLCAxLCAxLCAxLCA0NTEsIDUxMH0KKyAgICB9OworICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpCisgICAgICBwcC0+c3RhdGVzW2ldID0gc3RhdGVzW2ldOworICB9CisgIHBwLT5jdXJHU3RhdGUgPSAmKHBwLT5zdGF0ZXNbNl0pOworCisgIC8qIGRhdGFzIGZvciB0aGUgdXBkYXRlIGxvb3AgKi8KKyAgcHAtPnVwZGF0ZS5sb2NrdmFyID0gMDsKKyAgcHAtPnVwZGF0ZS5nb29tdmFyID0gMDsKKyAgcHAtPnVwZGF0ZS5sb29wdmFyID0gMDsKKyAgcHAtPnVwZGF0ZS5zdG9wX2xpbmVzID0gMDsKKyAgcHAtPnVwZGF0ZS5pZnNfaW5jciA9IDE7ICAgICAgLyogZGVzc2luZXIgbCdpZnMgKDAgPSBub246ID4gPSBpbmNyZW1lbnQpICovCisgIHBwLT51cGRhdGUuZGVjYXlfaWZzID0gMDsgICAgIC8qIGRpc3Bhcml0aW9uIGRlIGwnaWZzICovCisgIHBwLT51cGRhdGUucmVjYXlfaWZzID0gMDsgICAgIC8qIGRlZGlzcGFyaXRpb24gZGUgbCdpZnMgKi8KKyAgcHAtPnVwZGF0ZS5jeWNsZXNTaW5jZUxhc3RDaGFuZ2UgPSAwOworICBwcC0+dXBkYXRlLmRyYXdMaW5lc0R1cmF0aW9uID0gODA7CisgIHBwLT51cGRhdGUubGluZU1vZGUgPSBwcC0+dXBkYXRlLmRyYXdMaW5lc0R1cmF0aW9uOworCisgIHBwLT51cGRhdGUuc3dpdGNoTXVsdEFtb3VudCA9ICgyOS4wZiAvIDMwLjBmKTsKKyAgcHAtPnVwZGF0ZS5zd2l0Y2hJbmNyQW1vdW50ID0gMHg3ZjsKKyAgcHAtPnVwZGF0ZS5zd2l0Y2hNdWx0ID0gMS4wZjsKKyAgcHAtPnVwZGF0ZS5zd2l0Y2hJbmNyID0gcHAtPnVwZGF0ZS5zd2l0Y2hJbmNyQW1vdW50OworCisgIHBwLT51cGRhdGUuc3RhdGVTZWxlY3Rpb25SbmQgPSAwOworICBwcC0+dXBkYXRlLnN0YXRlU2VsZWN0aW9uQmxvY2tlciA9IDA7CisgIHBwLT51cGRhdGUucHJldmlvdXNab29tU3BlZWQgPSAxMjg7CisKKyAgeworICAgIFpvb21GaWx0ZXJEYXRhIHpmZCA9IHsKKyAgICAgIDEyNywgOCwgMTYsCisgICAgICAxLCAxLCAwLCBOT1JNQUxfTU9ERSwKKyAgICAgIDAsIDAsIDAsIDAsIDAKKyAgICB9OworICAgIHBwLT51cGRhdGUuem9vbUZpbHRlckRhdGEgPSB6ZmQ7CisgIH0KKworICBzZXRPcHRpbWl6ZWRNZXRob2RzIChwcCk7CisKKyAgZm9yIChpID0gMDsgaSA8IDB4ZmZmZjsgaSsrKSB7CisgICAgcHAtPnNpbnRhYmxlW2ldID0KKyAgICAgICAgKGludCkgKDEwMjQgKiBzaW4gKChkb3VibGUpIGkgKiAzNjAgLyAoc2l6ZW9mIChwcC0+c2ludGFibGUpIC8KKyAgICAgICAgICAgICAgICBzaXplb2YgKHBwLT5zaW50YWJsZVswXSkgLSAxKSAqIDMuMTQxNTkyIC8gMTgwKSArIC41KTsKKyAgICAvKiBzaW50YWJsZSBbdXNdID0gKGludCkoMTAyNC4wZiAqIHNpbiAodXMqMiozLjMxNDE1Zi8weGZmZmYpKSA7ICovCisgIH0KK30KKwordm9pZAorcGx1Z2luX2luZm9fYWRkX3Zpc3VhbCAoUGx1Z2luSW5mbyAqIHAsIGludCBpLCBWaXN1YWxGWCAqIHZpc3VhbCkKK3sKKyAgcC0+dmlzdWFsc1tpXSA9IHZpc3VhbDsKKyAgaWYgKGkgPT0gcC0+bmJWaXN1YWxzIC0gMSkgeworICAgICsraTsKKyAgICBwLT5uYlBhcmFtcyA9IDE7CisgICAgd2hpbGUgKGktLSkgeworICAgICAgaWYgKHAtPnZpc3VhbHNbaV0tPnBhcmFtcykKKyAgICAgICAgcC0+bmJQYXJhbXMrKzsKKyAgICB9CisgICAgcC0+cGFyYW1zID0KKyAgICAgICAgKFBsdWdpblBhcmFtZXRlcnMgKikgbWFsbG9jIChzaXplb2YgKFBsdWdpblBhcmFtZXRlcnMpICogcC0+bmJQYXJhbXMpOworICAgIGkgPSBwLT5uYlZpc3VhbHM7CisgICAgcC0+bmJQYXJhbXMgPSAxOworICAgIHAtPnBhcmFtc1swXSA9IHAtPnNvdW5kLnBhcmFtczsKKyAgICB3aGlsZSAoaS0tKSB7CisgICAgICBpZiAocC0+dmlzdWFsc1tpXS0+cGFyYW1zKQorICAgICAgICBwLT5wYXJhbXNbcC0+bmJQYXJhbXMrK10gPSAqKHAtPnZpc3VhbHNbaV0tPnBhcmFtcyk7CisgICAgfQorICB9Cit9CisKK3ZvaWQKK3BsdWdpbl9pbmZvX2ZyZWUgKFBsdWdpbkluZm8gKiBwKQoreworICBnb29tX3BsdWdpbl9wYXJhbWV0ZXJzX2ZyZWUgKCZwLT5zb3VuZC5wYXJhbXMpOworCisgIGlmIChwLT5wYXJhbXMpCisgICAgZnJlZSAocC0+cGFyYW1zKTsKKyAgZnJlZSAocC0+dmlzdWFscyk7Cit9CmRpZmYgLS1naXQgYS9nc3QvZ29vbS9wcGNfZHJhd2luZ3MuaCBiL2dzdC9nb29tL3BwY19kcmF3aW5ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNWFkZjYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9wcGNfZHJhd2luZ3MuaApAQCAtMCwwICsxLDI4IEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IEd1aWxsYXVtZSBCb3Jpb3MsIGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qIEdlbmVyaWMgUG93ZXJQQyBDb2RlICovCit2b2lkIHBwY19icmlnaHRuZXNzX2dlbmVyaWMoUGl4ZWwgKnNyYywgUGl4ZWwgKmRlc3QsIGludCBzaXplLCBpbnQgY29lZmYpOworCisvKiBHNCBTcGVjaWZpYyBQb3dlclBDIENvZGUgKFBvc3NpYmxlIHVzZSBvZiBBbHRpdmVjIGFuZCBEYXRhIFN0cmVhbXMpICovCit2b2lkIHBwY19icmlnaHRuZXNzX0c0KFBpeGVsICpzcmMsIFBpeGVsICpkZXN0LCBpbnQgc2l6ZSwgaW50IGNvZWZmKTsKKworLyogRzUgU3BlY2lmaWMgUG93ZXJQQyBDb2RlIChQb3NzaWJsZSB1c2Ugb2YgQWx0aXZlYykgKi8KK3ZvaWQgcHBjX2JyaWdodG5lc3NfRzUoUGl4ZWwgKnNyYywgUGl4ZWwgKmRlc3QsIGludCBzaXplLCBpbnQgY29lZmYpOworCmRpZmYgLS1naXQgYS9nc3QvZ29vbS9wcGNfZHJhd2luZ3MucyBiL2dzdC9nb29tL3BwY19kcmF3aW5ncy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0M2NjZTcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9wcGNfZHJhd2luZ3MucwpAQCAtMCwwICsxLDM5NCBAQAorOyBQb3dlclBDIG9wdGltaXplZCBkcmF3aW5nIG1ldGhvZHMgZm9yIEdvb20KKzsgwqkgMjAwMyBHdWlsbGF1bWUgQm9yaW9zCis7IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKzsgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsKKzsgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOworOyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworOyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorOyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKzsgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKzsgQ2hhbmdlIGxvZyA6Cis7IDMwIE1heSAyMDAzIDogRmlsZSBjcmVhdGlvbgorCis7IFNlY3Rpb24gZGVmaW5pdGlvbiA6IFdlIHVzZSBhIHJlYWQgb25seSBjb2RlIHNlY3Rpb24gZm9yIHRoZSB3aG9sZSBmaWxlCisuc2VjdGlvbiBfX1RFWFQsX190ZXh0LHJlZ3VsYXIscHVyZV9pbnN0cnVjdGlvbnMKKworCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFNpbmdsZSAzMmIgcGl4ZWwgZHJhd2luZyBtYWNyb3MKKzsgVXNhZ2UgOgorOyAJRFJBV01FVEhPRF9YWFhYX01BQ1JPICpwaXhlbElOLCAqcGl4ZWxPVVQsIENPTE9SLCBXUjEsIFdSMiwgV1IzLCBXUjQKKzsJT25seSB0aGUgd29yayByZWdpc3RlcnMgKFdSKSBjYW4gYmUgdG91Y2hlZCBieSB0aGUgbWFjcm9zCis7Cis7IEF2YWlsYWJsZSBtZXRob2RzIDoKKzsJRFJBV01FVEhPRF9ERkxUX01BQ1JPIDogRGVmYXVsdCBkcmF3aW5nIG1ldGhvZCAoQWN0dWFsbHkgT1ZSVykKKzsJRFJBV01FVEhPRF9QTFVTX01BQ1JPIDogUlZCIFNhdHVyYXRlZCBwZXIgY2hhbm5lbCBhZGRpdGlvbiAoU0xPV0VTVCkKKzsJRFJBV01FVEhPRF9IQUxGX01BQ1JPIDogNTAlIFRyYW5zcGFyZW5jeSBjb2xvciBkcmF3aW5nCis7CURSQVdNRVRIT0RfT1ZSV19NQUNSTyA6IERpcmVjdCBDT0xPUiBkcmF3aW5nIChGQVNURVNUKQorOwlEUkFXTUVUSE9EX0JfT1JfTUFDUk8gOiBCaXR3aXNlIE9SCis7CURSQVdNRVRIT0RfQkFORF9NQUNSTyA6IEJpdHdpc2UgQU5ECis7CURSQVdNRVRIT0RfQlhPUl9NQUNSTyA6IEJpdHdpc2UgWE9SCis7CURSQVdNRVRIT0RfQk5PVF9NQUNSTyA6IEJpdHdpc2UgTk9UCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy5tYWNybyBEUkFXTUVUSE9EX09WUldfTUFDUk8KKyAgICBzdHcJCSQyLDAoJDEpCTs7ICokMSA8LSAkMgorLmVuZG1hY3JvCisKKy5tYWNybyBEUkFXTUVUSE9EX0JfT1JfTUFDUk8KKyAgICBsd3oJCSQzLDAoJDApCTs7ICQzIDwtICokMAorICAgIG9yCQkkMywkMywkMgk7OyAkMyA8LSAkMyB8ICQyCisgICAgc3R3CQkkMywwKCQxKQk7OyAqJDEgPC0gJDMKKy5lbmRtYWNybworCisubWFjcm8gRFJBV01FVEhPRF9CQU5EX01BQ1JPCisgICAgbHd6CQkkMywwKCQwKQk7OyAkMyA8LSAqJDAKKyAgICBhbmQJCSQzLCQzLCQyCTs7ICQzIDwtICQzICYgJDIKKyAgICBzdHcJCSQzLDAoJDEpCTs7ICokMSA8LSAkMworLmVuZG1hY3JvCisKKy5tYWNybyBEUkFXTUVUSE9EX0JYT1JfTUFDUk8KKyAgICBsd3oJCSQzLDAoJDApCTs7ICQzIDwtICokMAorICAgIHhvcgkJJDMsJDMsJDIJOzsgJDMgPC0gJDMgXiAkMgorICAgIHN0dwkJJDMsMCgkMSkJOzsgKiQxIDwtICQzCisuZW5kbWFjcm8KKworLm1hY3JvIERSQVdNRVRIT0RfQk5PVF9NQUNSTworICAgIGx3egkJJDMsMCgkMCkJOzsgJDMgPC0gKiQwCisgICAgbmFuZAkkMywkMywkMwk7OyAkMyA8LSB+JDMKKyAgICBzdHcJCSQzLDAoJDEpCTs7ICokMSA8LSAkMworLmVuZG1hY3JvCisKKy5tYWNybyBEUkFXTUVUSE9EX1BMVVNfTUFDUk8KKyAgICBsd3oJCSQ0LDAoJDApCTs7ICQ0IDwtICokMAorICAgIGFuZGkuCSQzLCQ0LDB4RkYwMAk7OyAkMyA8LSAkNCAmIDB4MDAwMEZGMDAKKyAgICBhbmRpLgkkNSwkMiwweEZGMDAJOzsgJDUgPC0gJDIgJiAweDAwMDBGRjAwCisgICAgYWRkCQkkMywkMywkNQk7OyAkMyA8LSAkMyArICQ1CisgICAgcmx3aW5tCSQ1LCQzLDE1LDAsMAk7OyAkNSA8LSAwIHwgKCQzWzE1XSA8PCAxNSkKKyAgICBzcmF3aQkkNSwkNSwyMwk7OyAkNSA8LSAkNSA+PiAyMyAoYWxnZWJyYWljIGZvciBzaWduIGV4dGVuc2lvbikKKyAgICBvcgkJJDMsJDMsJDUJOzsgJDMgPC0gJDMgfCAkNQorICAgIGxpcwkJJDUsMHhGRgkJOzsgJDUgPC0gMHgwMEZGMDBGRgorICAgIGFkZGkJJDUsJDUsMHhGRgorICAgIGFuZAkJJDQsJDQsJDUJOzsgJDQgPC0gJDQgJiAkNQorICAgIGFuZAkJJDYsJDIsJDUJOzsgJDYgPC0gJDIgJiAkNQorICAgIGFkZAkJJDQsJDQsJDYJOzsgJDQgPC0gJDQgKyAkNgorICAgIHJsd2lubQkkNiwkNCw3LDAsMAk7OyAkNiA8LSAwIHwgKCQ0WzddIDw8IDcpCisgICAgc3Jhd2kJJDYsJDYsMTUJOzsgJDYgPC0gJDYgPj4gMTUgKGFsZ2VicmFpYyBmb3Igc2lnbiBleHRlbnNpb24pCisgICAgcmx3aW5tCSQ1LCQ0LDIzLDAsMAk7OyAkNSA8LSAwIHwgKCQ0WzIzXSA8PCAyMykKKyAgICBzcmF3aQkkNSwkNSwzMQk7OyAkNSA8LSAkNSA+PiAzMSAoYWxnZWJyYWljIGZvciBzaWduIGV4dGVuc2lvbikKKyAgICBybHdpbWkJJDYsJDUsMCwyNCwzMQk7OyAkNlsyNC4uMzFdIDwtICQ1WzI0Li4zMV0KKyAgICBvcgkJJDQsJDQsJDYJOzsgJDQgPC0gJDQgfCAkNgorICAgIHJsd2ltaQkkNCwkMywwLDE2LDIzCTs7ICQ0WzE2Li4yM10gPC0gJDNbMTYuLjIzXQorICAgIHN0dwkJJDQsMCgkMSkJOzsgKiQxIDwtICQ0CisuZW5kbWFjcm8KKworLm1hY3JvCURSQVdNRVRIT0RfSEFMRl9NQUNSTworICAgIGx3egkJJDQsMCgkMCkJOzsgJDQgPC0gKiQwCisgICAgYW5kaS4JJDMsJDQsMHhGRjAwCTs7ICQzIDwtICQ0ICYgMHgwMDAwRkYwMAorICAgIGFuZGkuCSQ1LCQyLDB4RkYwMAk7OyAkNSA8LSAkMiAmIDB4MDAwMEZGMDAKKyAgICBhZGQJCSQzLCQzLCQ1CTs7ICQzIDwtICQzICsgJDUKKyAgICBsaXMJCSQ1LDB4RkYJCTs7ICQ1IDwtIDB4MDBGRjAwRkYKKyAgICBhZGRpCSQ1LCQ1LDB4RkYKKyAgICBhbmQJCSQ0LCQ0LCQ1CTs7ICQ0IDwtICQ0ICYgJDUKKyAgICBhbmQJCSQ1LCQyLCQ1CTs7ICQ1IDwtICQyICYgJDUKKyAgICBhZGQJCSQ0LCQ0LCQ1CTs7ICQ0IDwtICQ0ICsgJDUKKyAgICBzcndpCSQ0LCQ0LDEJCTs7ICQ0IDwtICQ0ID4+IDEKKyAgICBybHdpbWkJJDQsJDMsMzEsMTYsMjMJOzsgJDRbMTYuLjIzXSA8LSAkM1sxNS4uMjJdCisgICAgc3R3CQkkNCwwKCQxKQk7OyAqJDEgPC0gJDQKKy5lbmRtYWNybworCisubWFjcm8gRFJBV01FVEhPRF9ERkxUX01BQ1JPCisgICAgRFJBV01FVEhPRF9QTFVTX01BQ1JPCisuZW5kbWFjcm8KKworOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKworOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyB2b2lkIERSQVdNRVRIT0RfUExVU19QUEModW5zaWduZWQgaW50ICogYnVmLCB1bnNpZ25lZCBpbnQgX2NvbCk7Cis7IHZvaWQgRFJBV01FVEhPRF9QTFVTXzJfUFBDKHVuc2lnbmVkICogaW4sIHVuc2lnbmVkIGludCAqIG91dCwgdW5zaWduZWQgaW50IF9jb2wpOworOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLmdsb2JsIF9EUkFXTUVUSE9EX1BMVVNfMl9QUEMKKy5hbGlnbiAzCitfRFJBV01FVEhPRF9QTFVTXzJfUFBDOgorICAgIERSQVdNRVRIT0RfUExVU19NQUNSTwlyMyxyNCxyNSxyNixyNyxyOCxyOQorICAgIGJscgkJCQk7OyByZXR1cm4KKworLmdsb2JsIF9EUkFXTUVUSE9EX1BMVVNfUFBDCisuYWxpZ24gMworX0RSQVdNRVRIT0RfUExVU19QUEM6CisgICAgRFJBV01FVEhPRF9QTFVTX01BQ1JPCXIzLHIzLHI0LHI1LHI2LHI3LHI5CisgICAgYmxyCQkJCTs7IHJldHVybgorCisKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsgdm9pZCBEUkFXTUVUSE9EX0hBTEZfUFBDKHVuc2lnbmVkIGludCAqIGJ1ZiwgdW5zaWduZWQgaW50IF9jb2wpOworOyB2b2lkIERSQVdNRVRIT0RfSEFMRl8yX1BQQyh1bnNpZ25lZCAqIGluLCB1bnNpZ25lZCBpbnQgKiBvdXQsIHVuc2lnbmVkIGludCBfY29sKTsKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy5nbG9ibCBfRFJBV01FVEhPRF9IQUxGXzJfUFBDCisuYWxpZ24gMworX0RSQVdNRVRIT0RfSEFMRl8yX1BQQzoKKyAgICBEUkFXTUVUSE9EX0hBTEZfTUFDUk8JcjMscjQscjUscjYscjcscjgKKyAgICBibHIJCQkJOzsgcmV0dXJuCisKKy5nbG9ibCBfRFJBV01FVEhPRF9IQUxGX1BQQworLmFsaWduIDMKK19EUkFXTUVUSE9EX0hBTEZfUFBDOgorICAgIERSQVdNRVRIT0RfSEFMRl9NQUNSTwlyMyxyMyxyNCxyNSxyNixyNworICAgIGJscgkJCQk7OyByZXR1cm4KKworCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7IHZvaWQgRFJBV19MSU5FX1BQQyh1bnNpZ25lZCBpbnQgKmRhdGEsIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiwgdW5zaWduZWQgaW50IGNvbCwKKzsgCQkJdW5zaWduZWQgaW50IHNjcmVlbngsIHVuc2lnbmVkIGludCBzY3JlZW55KQorOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLmdsb2JsIF9EUkFXX0xJTkVfUFBDCisuYWxpZ24gMworX0RSQVdfTElORV9QUEM6CisgICAgOzsgTk9UIElNUExFTUVOVEVEIFlFVAorICAgIGJscgkJCQk7OyByZXR1cm4KKworCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7IHZvaWQgX3BwY19icmlnaHRuZXNzKFBpeGVsICogc3JjLCBQaXhlbCAqIGRlc3QsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBpbnQgY29lZmYpCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKworLmNvbnN0CisuYWxpZ24gNAordmVjdG9yWkVSTzoKKyAgICAubG9uZyAwLDAsMCwwCisgICAgLmxvbmcgMHgxMDEwMTAwMCwgMHgxMDEwMTAwMSwgMHgxMDEwMTAwMiwgMHgxMDEwMTAwMworICAgIC5sb25nIDB4MTAxMDEwMDQsIDB4MTAxMDEwMDUsIDB4MTAxMDEwMDYsIDB4MTAxMDEwMDcKKyAgICAubG9uZyAweDEwMTAxMDA4LCAweDEwMTAxMDA5LCAweDEwMTAxMDBBLCAweDEwMTAxMDBCCisgICAgLmxvbmcgMHgxMDEwMTAwQywgMHgxMDEwMTAwRCwgMHgxMDEwMTAwRSwgMHgxMDEwMTAwRgorCisKKy5zZWN0aW9uIF9fVEVYVCxfX3RleHQscmVndWxhcixwdXJlX2luc3RydWN0aW9ucworCisuZ2xvYmwgX3BwY19icmlnaHRuZXNzX0c0CisuYWxpZ24gMworX3BwY19icmlnaHRuZXNzX0c0OgorCisKKzs7IFBvd2VyUEMgQWx0aXZlYyBjb2RlCisgICAgc3J3aSAgICByNSxyNSwyCisgICAgbXRjdHIgICByNQorCis7O3Zyc2F2ZQorICAgIG1mc3ByICAgcjExLDI1NgorICAgIGxpcyAgICAgcjEyLDB4Q0ZGQworICAgIG10c3ByICAgMjU2LHIxMgorCisgICAgICAgIG1mbHIgcjAKKyAgICAgICAgYmNsIDIwLDMxLCJMMDAwMDAwMDAwMDEkcGIiCisiTDAwMDAwMDAwMDAxJHBiIjoKKyAgICAgICAgbWZsciByMTAKKyAgICAgICAgbXRsciByMAorCisgICAgYWRkaXMgICByOSxyMTAsaGExNih2ZWN0b3JaRVJPLSJMMDAwMDAwMDAwMDEkcGIiKQorICAgIGFkZGkgICAgcjkscjksbG8xNih2ZWN0b3JaRVJPLSJMMDAwMDAwMDAwMDEkcGIiKQorICAgIAorICAgIHZ4b3IgICAgdjAsdjAsdjAgOzsgVjAgPSBOVUxMIHZlY3RvcgorCisgICAgYWRkaSAgICByOSxyOSwxNgorICAgIGx2eCAgICAgdjEwLDAscjkKKyAgICBhZGRpICAgIHI5LHI5LDE2CisgICAgbHZ4ICAgICB2MTEsMCxyOQorICAgIGFkZGkgICAgcjkscjksMTYKKyAgICBsdnggICAgIHYxMiwwLHI5CisgICAgYWRkaSAgICByOSxyOSwxNgorICAgIGx2eCAgICAgdjEzLDAscjkKKworICAgIGFkZGlzICAgcjkscjEwLGhhMTYodmVjdG9ydG1wd29yay0iTDAwMDAwMDAwMDAxJHBiIikKKyAgICBhZGRpICAgIHI5LHI5LGxvMTYodmVjdG9ydG1wd29yay0iTDAwMDAwMDAwMDAxJHBiIikKKyAgICBzdHcgICAgIHI2LDAocjkpCisgICAgbGkgICAgICByNiw4CisgICAgc3R3ICAgICByNiw0KHI5KQorICAgIGx2eCAgICAgdjksMCxyOQorICAgIGxpICAgICAgcjksMTI4CisgICAgdnNwbHR3ICB2OCx2OSwwCisgICAgdnNwbHR3ICB2OSx2OSwxCisKKzs7IGVsdCBjb3VudGVyCisgICAgbGkgICAgICByOSwwCisgICAgbGlzICAgICByNywweDBGMDEKKyAgICBiIEw3CisuYWxpZ24gNAorTDc6CisgICAgbHZ4ICAgICB2MSxyOSxyMworCisgICAgdnBlcm0gICB2NCx2MSx2MCx2MTAKKyAgICA7KioqKioqKioqKioqKioqKioqKioqCisgICAgIGFkZCByMTAscjkscjMKKyAgICA7KioqKioqKioqKioqKioqKioqKioqCisgICAgdnBlcm0gICB2NSx2MSx2MCx2MTEKKyAgICB2cGVybSAgIHY2LHYxLHYwLHYxMgorICAgIHZwZXJtICAgdjcsdjEsdjAsdjEzCisKKyAgICB2bXVsb3VoICB2NCx2NCx2OAorICAgIDsqKioqKioqKioqKioqKioqKioqKioKKyAgICAgZHN0ICAgICByMTAscjcsMworICAgIDsqKioqKioqKioqKioqKioqKioqKioKKyAgICB2bXVsb3VoICB2NSx2NSx2OAorICAgIHZtdWxvdWggIHY2LHY2LHY4CisgICAgdm11bG91aCAgdjcsdjcsdjgKKyAgICB2c3J3ICAgICB2NCx2NCx2OQorICAgIHZzcncgICAgIHY1LHY1LHY5CisgICAgdnNydyAgICAgdjYsdjYsdjkKKyAgICB2c3J3ICAgICB2Nyx2Nyx2OSAKKyAgICAKKyAgICB2cGt1d3VzIHY0LHY0LHY1CisgICAgdnBrdXd1cyB2Nix2Nix2NworICAgIHZwa3VodXMgdjEsdjQsdjYKKworICAgIHN0dnggICAgdjEscjkscjQKKyAgICBhZGRpICAgIHI5LHI5LDE2CisKKyAgICBiZG56IEw3CisKKyAgICBtdHNwciAgIDI1NixyMTEKKyAgICBibHIKKworCisuZ2xvYmwgX3BwY19icmlnaHRuZXNzX0c1CisuYWxpZ24gMworX3BwY19icmlnaHRuZXNzX0c1OgorCis7OyBQb3dlclBDIEFsdGl2ZWMgRzUgY29kZQorICAgIHNyd2kgICAgcjUscjUsMgorICAgIG10Y3RyICAgcjUKKworOzt2cnNhdmUKKyAgICBtZnNwciAgIHIxMSwyNTYKKyAgICBsaXMgICAgIHIxMiwweENGRkMKKyAgICBtdHNwciAgIDI1NixyMTIKKworICAgICAgICBtZmxyIHIwCisgICAgICAgIGJjbCAyMCwzMSwiTDAwMDAwMDAwMDAyJHBiIgorIkwwMDAwMDAwMDAwMiRwYiI6CisgICAgICAgIG1mbHIgcjEwCisgICAgICAgIG10bHIgcjAKKworICAgIGFkZGlzICAgcjkscjEwLGhhMTYodmVjdG9yWkVSTy0iTDAwMDAwMDAwMDAyJHBiIikKKyAgICBhZGRpICAgIHI5LHI5LGxvMTYodmVjdG9yWkVSTy0iTDAwMDAwMDAwMDAyJHBiIikKKyAgICAKKyAgICB2eG9yICAgIHYwLHYwLHYwIDs7IFYwID0gTlVMTCB2ZWN0b3IKKworICAgIGFkZGkgICAgcjkscjksMTYKKyAgICBsdnggICAgIHYxMCwwLHI5CisgICAgYWRkaSAgICByOSxyOSwxNgorICAgIGx2eCAgICAgdjExLDAscjkKKyAgICBhZGRpICAgIHI5LHI5LDE2CisgICAgbHZ4ICAgICB2MTIsMCxyOQorICAgIGFkZGkgICAgcjkscjksMTYKKyAgICBsdnggICAgIHYxMywwLHI5CisKKyAgICBhZGRpcyAgIHI5LHIxMCxoYTE2KHZlY3RvcnRtcHdvcmstIkwwMDAwMDAwMDAwMiRwYiIpCisgICAgYWRkaSAgICByOSxyOSxsbzE2KHZlY3RvcnRtcHdvcmstIkwwMDAwMDAwMDAwMiRwYiIpCisgICAgc3R3ICAgICByNiwwKHI5KQorICAgIGxpICAgICAgcjYsOAorICAgIHN0dyAgICAgcjYsNChyOSkKKyAgICBsdnggICAgIHY5LDAscjkKKyAgICBsaSAgICAgIHI5LDEyOAorICAgIHZzcGx0dyAgdjgsdjksMAorICAgIHZzcGx0dyAgdjksdjksMQorCis7OyBlbHQgY291bnRlcgorICAgIGxpICAgICAgcjksMAorICAgIGxpcyAgICAgcjcsMHgwRjAxCisgICAgYiBMNgorLmFsaWduIDQKK0w2OgorICAgIGx2eCAgICAgdjEscjkscjMKKworICAgIHZwZXJtICAgdjQsdjEsdjAsdjEwCisgICAgOyoqKioqKioqKioqKioqKioqKioqKgorICAgIGFkZCByMTAscjkscjMKKyAgICA7KioqKioqKioqKioqKioqKioqKioqCisgICAgdnBlcm0gICB2NSx2MSx2MCx2MTEKKyAgICB2cGVybSAgIHY2LHYxLHYwLHYxMgorICAgIHZwZXJtICAgdjcsdjEsdjAsdjEzCisKKyAgICB2bXVsb3VoICB2NCx2NCx2OAorICAgIHZtdWxvdWggIHY1LHY1LHY4CisgICAgdm11bG91aCAgdjYsdjYsdjgKKyAgICB2bXVsb3VoICB2Nyx2Nyx2OAorICAgIHZzcncgICAgIHY0LHY0LHY5CisgICAgdnNydyAgICAgdjUsdjUsdjkKKyAgICB2c3J3ICAgICB2Nix2Nix2OQorICAgIHZzcncgICAgIHY3LHY3LHY5IAorICAgIAorICAgIHZwa3V3dXMgdjQsdjQsdjUKKyAgICB2cGt1d3VzIHY2LHY2LHY3CisgICAgdnBrdWh1cyB2MSx2NCx2NgorCisgICAgc3R2eCAgICB2MSxyOSxyNAorICAgIGFkZGkgICAgcjkscjksMTYKKworICAgIGJkbnogTDYKKworICAgIG10c3ByICAgMjU2LHIxMQorICAgIGJscgorCisKKy5nbG9ibCBfcHBjX2JyaWdodG5lc3NfZ2VuZXJpYworLmFsaWduIDMKK19wcGNfYnJpZ2h0bmVzc19nZW5lcmljOgorICAgIGxpcyAgIHIxMiwweDAwRkYKKyAgICBvcmkgICByMTIscjEyLDB4MDBGRgorICAgIHN1YmkgIHIzLHIzLDQKKyAgICBzdWJpICByNCxyNCw0CisgICAgbXRjdHIgcjUKKyAgICBiIEwxCisuYWxpZ24gNAorTDE6CisgICAgbHd6dSAgcjcsNChyMykKKworICAgIHJsd2lubSAgcjgscjcsMTYsMjQsMzEKKyAgICBybHdpbm0gIHI5LHI3LDI0LDI0LDMxCisgICAgbXVsbHcgICByOCxyOCxyNgorICAgIHJsd2lubSAgcjEwLHI3LDAsMjQsMzEKKyAgICBtdWxsdyAgIHI5LHI5LHI2CisgICAgc3J3aSAgICByOCxyOCw4CisgICAgbXVsbHcgICByMTAscjEwLHI2CisgICAgc3J3aSAgICByOSxyOSw4CisKKyAgICBybHdpbm0uIHIxMSxyOCwwLDAsMjMKKyAgICBiZXEgICAgIEwyCisgICAgbGkgICAgICByOCwweEZGCitMMjoKKyAgICBzcndpICAgIHIxMCxyMTAsOAorICAgIHJsd2lubS4gcjExLHI5LDAsMCwyMworICAgIGJlcSAgICAgTDMKKyAgICBsaSAgICAgIHI5LDB4RkYKK0wzOgorICAgIHJsd2lubSAgcjcscjgsMTYsOCwxNQorICAgIHJsd2lubS4gcjExLHIxMCwwLDAsMjMKKyAgICBiZXEgICAgIEw0CisgICAgbGkgICAgICByMTAsMHhGRgorTDQ6CisgICAgcmx3aW1pICByNyxyOSw4LDE2LDIzCisgICAgcmx3aW1pICByNyxyMTAsMCwyNCwzMQorCisgICAgc3R3dSAgICByNyw0KHI0KQorICAgIGJkbnogTDEKKworICAgIGJscgorCisKKworLnN0YXRpY19kYXRhCisuYWxpZ24gNAordmVjdG9ydG1wd29yazoKKyAgICAubG9uZyAwLDAsMCwwCisKZGlmZiAtLWdpdCBhL2dzdC9nb29tL3BwY196b29tX3VsdGltYXRlLmggYi9nc3QvZ29vbS9wcGNfem9vbV91bHRpbWF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMmM4YTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9wcGNfem9vbV91bHRpbWF0ZS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qIEdvb20gUHJvamVjdAorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gR3VpbGxhdW1lIEJvcmlvcywgaU9TLVNvZnR3YXJlCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyogR2VuZXJpYyBQb3dlclBDIENvZGUgKi8KK3ZvaWQgcHBjX3pvb21fZ2VuZXJpYyAoaW50IHNpemVYLCBpbnQgc2l6ZVksIFBpeGVsICpzcmMsIFBpeGVsICpkZXN0LCBpbnQgKmJydXRTLCBpbnQgKmJydXRELCBpbnQgYnVmZnJhdGlvLCBpbnQgcHJlY2FsQ29lZlsxNl1bMTZdKTsKKworLyogRzQgU3BlY2lmaWMgUG93ZXJQQyBDb2RlIChQb3NzaWJsZSB1c2Ugb2YgQWx0aXZlYyBhbmQgRGF0YSBTdHJlYW1zKSAqLwordm9pZCBwcGNfem9vbV9HNCAoaW50IHNpemVYLCBpbnQgc2l6ZVksIFBpeGVsICpzcmMsIFBpeGVsICpkZXN0LCBpbnQgKmJydXRTLCBpbnQgKmJydXRELCBpbnQgYnVmZnJhdGlvLCBpbnQgcHJlY2FsQ29lZlsxNl1bMTZdKTsKKwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vcHBjX3pvb21fdWx0aW1hdGUucyBiL2dzdC9nb29tL3BwY196b29tX3VsdGltYXRlLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3ZWM1MAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL3BwY196b29tX3VsdGltYXRlLnMKQEAgLTAsMCArMSwzMzYgQEAKKzsgUG93ZXJQQyBvcHRpbWl6ZWQgem9vbSBmb3IgR29vbQorOyDCqSAyMDAxLTIwMDMgR3VpbGxhdW1lIEJvcmlvcworOyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCis7IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7Cis7IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsKKzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKzsgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKzsgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCis7IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCis7IENoYW5nZSBsb2cgOgorOyAyMSBEZWMgMjAwMyA6IFVzZSBvZiBhbHRpdmVjIGlzIG5vdyBkZXRlcm1pbmVkIHdpdGggYSBwYXJhbWV0ZXIKKworOyBTZWN0aW9uIGRlZmluaXRpb24gOiBXZSB1c2UgYSByZWFkIG9ubHkgc2VjdGlvbgorLnRleHQKKworOyBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBjYWxsIGJ5IEMgcHJvZ3JhbSA6IHBwY196b29tCis7IFdlIGRlY2xhcmUgdGhpcyBsYWJlbCBhcyBhIGdsb2JhbCB0byBleHRlbmQgaXRzIHNjb3BlIG91dHNpZGUgdGhpcyBmaWxlCisuZ2xvYmwgX3BwY196b29tX2dlbmVyaWMKKy5nbG9ibCBfcHBjX3pvb21fRzQKKworOyBEZXNjcmlwdGlvbiA6Cis7IFRoaXMgcm91dGluZSBkeW5hbWljYWxseSBjb21wdXRlcyBhbmQgYXBwbGllcyBhIHpvb20gZmlsdGVyCisKKzsgcGFyYW1ldGVycyA6Cis7IHIzICA8PT4gdW5zaWduZWQgaW50IHNpemVYIChpbiBwaXhlbHMpCis7IHI0ICA8PT4gdW5zaWduZWQgaW50IHNpemVZIChpbiBwaXhlbHMpCis7IHI1ICA8PT4gdW5zaWduZWQgaW50ICogZnJvbXBpeG1hcAorOyByNiAgPD0+IHVuc2lnbmVkIGludCAqIHRvcGl4bWFwCis7IHI3ICA8PT4gdW5zaWduZWQgaW50ICogYnJ1dFMKKzsgcjggIDw9PiB1bnNpZ25lZCBpbnQgKiBicnV0RAorOyByOSAgPD0+IHVuc2lnbmVkIGludCBidWZmcmF0aW8KKzsgcjEwIDw9PiBpbnQgWzE2XVsxNl0gcHJlY2FsY2NvZWZmcworCis7IGdsb2JhbHMgYWZ0ZXIgaW5pdAorOyByNSAgPD0+IGZyb21waXhtYXAgLSAxIGJ5dGUgbmVlZGVkIGZvciBwcmVpbmNyZW1lbnRhbCBmZXRjaCAocmVwbGFjZXMgcjUpCis7IHI2ICA8PT4gdG9waXhtYXAgLSAxIGJ5dGUgbmVlZGVkIGZvciBwcmVpbmNyZW1lbnRhbCBmZXRjaCAocmVwbGFjZXMgcjYpCis7IHIzIDw9PiBheCA9IHggbWF4IGluIDE2dGggb2YgcGl4ZWxzIChyZXBsYWNlcyBvbGQgcjMpCis7IHI0IDw9PiBheSA9IHkgbWF4IGluIDE2dGggb2YgcGl4ZWxzIChyZXBsYWNlcyBvbGQgcjQpCis7IHIyMCA8PT4gcm93IHNpemUgaW4gYnl0ZXMKKzsgcjEyIDw9PiAweEZGMDBGRiAobWFzayBmb3IgcGFyYWxsZWwgMzIgYml0cyBwaXhzIGNvbXB1dGluZykKKzsgcjMwIDw9PiBicnV0UyAtIDEgYnl0ZSBuZWVkZWQgZm9yIHByZWluY3JlbWVudGFsIGZldGNoIChyZXBsYWNlcyByNykKKzsgcjMxIDw9PiBicnV0RCAtIDEgYnl0ZSBuZWVkZWQgZm9yIHByZWluY3JlbWVudGFsIGZldGNoIChyZXBsYWNlcyByOCkKKworOyBBQkkgbm90ZXMgOgorOyByMSBpcyB0aGUgU3RhY2sgUG9pbnRlciAoU1ApID0+IERvIG5vdCB1c2UKKzsgcjEzLi5yMzEgYXJlIG5vbi12b2xhdGlsZXMgPT4gRG8gbm90IHVzZQorCitfcHBjX3pvb21fZ2VuZXJpYzoKKworOyBTYXZlcyB0aGUgdXNlZCBub24gdm9sYXRpbGUgcmVnaXN0ZXJzIGluIHRoZSBNYWNoLU8gc3RhY2sgcyBSZWQtWm9uZQorc3RtdyAJcjE4LC01NihyMSkKKworOyBpbml0CitsaSAgICAgIHIxOCwwCQk7IERlZmF1bHQgdmFsdWUgaWYgb3V0IG9mIHJhbmdlIDogMCAoQmxhY2spCittciAgICAgIHIxMSxyMTAKK2xpcyAgICAgcjEyLDB4RkYKK211bGx3ICAgcjIscjMscjQJOyBOdW1iZXIgb2YgcGl4ZWxzIHRvIGNvbXB1dGUKK3N1YmkgICAgcjMwLHI4LDAKK3Nsd2kJcjIwLHIzLDIKK3NyYXdpICAgcjE5LHIyMCwyCitvcmkgICAgIHIxMixyMTIsMHhGRgorc3ViaSAgICByMyxyMywxCitzdWJpICAgIHI0LHI0LDEKK210c3ByCWN0cixyMgkJOyBJbml0IHRoZSBsb29wIGNvdW50IChvbmUgbG9vcCBwZXIgcGl4ZWwgY29tcHV0ZWQpCitzdWJpICAgIHIzMSxyNywwCitzdWJpICAgIHI2LHI2LDQKK3Nsd2kJcjMscjMsNAorc2x3aQlyNCxyNCw0CisKKztwcmUgaW5pdCBmb3IgbG9vcAorbHd6CXIyLDAocjMxKSAgICA7IHB4Citsd3oJcjI5LDQocjMxKSAgIDsgcHkKK2x3eglyOCwwKHIzMCkgICAgOyBweDIKK2x3eglyMTAsNChyMzApICAgOyBweTIKKworYiAgICAgICBMMQorLmFsaWduICA1CitMMToKKworOyBjb21wdXRlcyBkeW5hbWljYWxseSB0aGUgcG9zaXRpb24gdG8gZmV0Y2gKK3N1YiAgICAgcjgscjgscjIKK3N1YiAgICAgcjEwLHIxMCxyMjkKK211bGx3ICAgcjgscjgscjkKK2FkZGkgICAgcjMxLHIzMSw4CittdWxsdyAgIHIxMCxyMTAscjkKK2FkZGkgICAgcjMwLHIzMCw4CisKK3NyYXdpICAgcjgscjgsMTYKK3NyYXdpICAgcjEwLHIxMCwxNgorYWRkICAgICByMixyMixyOAorYWRkICAgICByMjkscjI5LHIxMAorCis7IGlmIHB4PmF4IG9yIHB5PmF5IGdvdG8gb3V0b2ZyYW5nZQorOyBjb21wdXRlcyB0aGUgYXR0ZW51YXRpb24gY29lZmZzIGFuZCB0aGUgb3JpZ2luYWwgcG9pbnQgYWRkcmVzcworcmx3aW5tICByMTAscjIsNiwyOC02LDMxLTYgOyByMTAgPC0gKHIyIDw8IDIpICYgMHgwMDAwMDJEMCAgIChyMTA9KHIyJTE2KSo0KjE2KQorY21wbCAgICBjcjQsMCxyMixyMworcmx3aW1pICByMTAsIHIyOSwgMiwgMjgtMiwgMzEtMiA7IHIxMCA8LSAoKHIyOSA8PCAyKSAmIDB4MDAwMDAwMkQpIHwgKHIxMCAmICEweDAwMDAwMDJEKSAgICAgIChyMTA9KHIxMCUxNikqNCB8IHIxMCkKK2NtcGwgICAgY3I3LDAscjI5LHI0CitzcmF3aSAgIHIyOSxyMjksNCAgICAgOyBwb3MgY29tcHV0aW5nCitiZ2UtCWNyNCxMNAorc3Jhd2kgICByMixyMiw0ICAgICAgIDsgcG9zIGNvbXB1dGluZworbXVsbHcgICByMjksIHIyOSxyMTkgIDsgcG9zIGNvbXB1dGluZworYmdlLQljcjcsTDQKKworOyBDaGFubmVscyBub3RhdGlvbiA6IDAwMTEyMjMzIChBQVJSVlZCQikKKworYWRkICAgICByMixyMixyMjkgICAgCQk7IHBvcyBjb21wdXRpbmcKK2x3enggICAgcjEwLHIxMSxyMTAJCTsgTG9hZHMgY29lZnMKK3Nsd2kgICAgcjIscjIsMiAgICAgIAkJOyBwb3MgY29tcHV0aW5nCithZGQJcjIscjIscjUgICAgIAkJOyBwb3MgY29tcHV0aW5nCitybHdpbm0gIHIyMSxyMTAsMCwyNCwzMQkgICAgICAgIDsgSXNvbGF0ZXMgY29lZjEgKD8/Pz8/PzExIC0+IDAwMDAwMDExKQorbHd6CXIyNSwwKHIyKQkJOyBMb2FkcyBjb2wxIC0+IHIyNQorbHd6CXIyNiw0KHIyKQkJOyBMb2FkcyBjb2wyIC0+IHIyNgorcmx3aW5tICByMjIscjEwLDI0LDI0LDMxCTsgSXNvbGF0ZXMgY29lZjIgKD8/Pz8yMj8/IC0+IDAwMDAwMDIyKQorcmx3aW5tICByMjMscjEwLDE2LDI0LDMxCTsgSXNvbGF0ZXMgY29lZjMgKD8/MzM/Pz8/IC0+IDAwMDAwMDMzKQorYWRkCXIyLHIyLHIyMAkJOyBBZGRzIG9uZSBsaW5lIGZvciBmdXR1cmUgbG9hZCBvZiBjb2wzIGFuZCBjb2w0CithbmQJcjgsIHIyNSxyMTIJCTsgTWFza3MgY29sMSBjaGFubmVscyAxICYgMyA6IDB4MDBYWDAwWFgKK3Jsd2lubSAgcjI0LHIxMCw4LDI0LDMxCQk7IElzb2xhdGVzIGNvZWY0ICg0ND8/Pz8/PyAtPiAwMDAwMDA0NCkKK2FuZGkuCXIyNSxyMjUsMHhGRjAwCQk7IE1hc2tzIGNvbDEgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorbXVsbHcJcjgsIHI4LCByMjEJCTsgQXBwbGllcyBjb2VmMSBvbiBjb2wxIGNoYW5uZWxzIDEgJiAzCisKKworOyBjb21wdXRlcyBmaW5hbCBwaXhlbCBjb2xvcgorYW5kCXIxMCxyMjYscjEyCQk7IE1hc2tzIGNvbDIgY2hhbm5lbHMgMSAmIDMgOiAweDAwWFgwMFhYCitsd3oJcjI3LDAocjIpCQk7IExvYWRzIGNvbDMgLT4gcjI3CittdWxsdwlyMTAscjEwLHIyMgkJOyBBcHBsaWVzIGNvZWYyIG9uIGNvbDIgY2hhbm5lbHMgMSAmIDMKK211bGx3CXIyNSxyMjUscjIxCQk7IEFwcGxpZXMgY29lZjEgb24gY29sMSBjaGFubmVsIDIKK2FuZGkuCXIyOSxyMjYsMHhGRjAwCQk7IE1hc2tzIGNvbDIgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorbXVsbHcJcjI5LHIyOSxyMjIJCTsgQXBwbGllcyBjb2VmMiBvbiBjb2wyIGNoYW5uZWwgMgorbHd6CXIyOCw0KHIyKQkJOyBMb2FkcyBjb2w0IC0+IHIyOAorYWRkCXI4ICxyOCAscjEwCQk7IEFkZHMgY29sMSAmIGNvbDIgY2hhbm5lbHMgMSAmIDMKK2FuZAlyMTAscjI3LHIxMgkJOyBNYXNrcyBjb2wzIGNoYW5uZWxzIDEgJiAzIDogMHgwMFhYMDBYWAorYWRkCXIyNSxyMjUscjI5CQk7IEFkZHMgY29sMSAmIGNvbDIgY2hhbm5lbCAyCittdWxsdwlyMTAscjEwLHIyMwkJOyBBcHBsaWVzIGNvZWYzIG9uIGNvbDMgY2hhbm5lbHMgMSAmIDMKK2FuZGkuCXIyOSxyMjcsMHhGRjAwCQk7IE1hc2tzIGNvbDMgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorbXVsbHcJcjI5LHIyOSxyMjMJCTsgQXBwbGllcyBjb2VmMyBvbiBjb2wzIGNoYW5uZWwgMgorbHd6CXIyLDAocjMxKQkJOyBweAorYWRkCXI3ICxyOCAscjEwCQk7IEFkZHMgY29sMyB0byAoY29sMSArIGNvbDIpIGNoYW5uZWxzIDEgJiAzCithbmQJcjEwLHIyOCxyMTIJCTsgTWFza3MgY29sNCBjaGFubmVscyAxICYgMyA6IDB4MDBYWDAwWFgKK211bGx3CXIxMCxyMTAscjI0CQk7IEFwcGxpZXMgY29lZjQgb24gY29sNCBjaGFubmVscyAxICYgMworYWRkCXIyNSxyMjUscjI5CQk7IEFkZHMgY29sIDMgdG8gKGNvbDEgKyBjb2wyKSBjaGFubmVsIDIKK2x3eiAJcjgsMChyMzApICAgIAkJOyBweDIKK2FuZGkuCXIyOCxyMjgsMHhGRjAwCQk7IE1hc2tzIGNvbDQgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorYWRkCXI3ICxyNyAscjEwCQk7IEFkZHMgY29sNCB0byAoY29sMSArIGNvbDIgKyBjb2wzKSBjaGFubmVscyAxICYgMworbHd6CXIxMCw0KHIzMCkgICAJCTsgcHkyCittdWxsdwlyMjgscjI4LHIyNAkJOyBBcHBsaWVzIGNvZWY0IG9uIGNvbDQgY2hhbm5lbCAyCitzcmF3aQlyNywgcjcsIDgJCTsgKHN1bSBvZiBjaGFubmVscyAxICYgMykgPj4gOAorbHd6CXIyOSw0KHIzMSkgICAgICAgICAgICAgIDsgcHkKK2FkZAlyMjUscjI1LHIyOAkJOyBBZGRzIGNvbCA0IHRvIChjb2wxICsgY29sMiArIGNvbDMpIGNoYW5uZWwgMgorcmx3aW1pICByNywgcjI1LCAyNCwgMTYsIDIzCTsgKCgoc3VtIG9mIGNoYW5uZWxzIDIpID4+IDggKSAmIDB4MDAwMEZGMDApIHwgKChzdW0gb2YgY2hhbm5lbHMgMSBhbmQgMykgJiAweEZGRkYwMEZGKQorc3R3dQlyNyw0KHI2KQkJOyBTdG9yZXMgdGhlIGNvbXB1dGVkIHBpeGVsCitiZG56CUwxCQkJOyBJdGVyYXRlIGFnYWluIGlmIG5lZWRlZAorYiAgICAgICBMMwk7Z290byBlbmQJOyBJZiBub3QsIHJldHVybnMgZnJvbSB0aGUgZnVuY3Rpb24KKworCis7IGlmIG91dCBvZiByYW5nZQorTDQ6CitzdHd1CXIxOCw0KHI2KQorbHd6CXI4LDAocjMwKSAgICA7IHB4MgorbHd6CXIxMCw0KHIzMCkgICA7IHB5MgorbHd6CXIyLDAocjMxKSAgICA7IHB4Citsd3oJcjI5LDQocjMxKSAgIDsgcHkKK2JkbnoJTDEKKworCitMMzoKKworOyBSZXN0b3JlIHNhdmVkIHJlZ2lzdGVycyBhbmQgcmV0dXJuCitsbXcJcjE4LC01NihyMSkKK2JscgorCisKKworCisKKworCisKK19wcGNfem9vbV9HNDoKKworOyBTYXZlcyB0aGUgdXNlZCBub24gdm9sYXRpbGUgcmVnaXN0ZXJzIGluIHRoZSBNYWNoLU8gc3RhY2sgcyBSZWQtWm9uZQorc3RtdyAJcjE3LC02MChyMSkKKworOyBpbml0CitsaSAgICAgIHIxOCwwCQk7IERlZmF1bHQgdmFsdWUgaWYgb3V0IG9mIHJhbmdlIDogMCAoQmxhY2spCittciAgICAgIHIxMSxyMTAKK2xpcyAgICAgcjEyLDB4RkYKK211bGx3ICAgcjIscjMscjQJOyBOdW1iZXIgb2YgcGl4ZWxzIHRvIGNvbXB1dGUKK3N1YmkgICAgcjMwLHI4LDAKK3Nsd2kJcjIwLHIzLDIKK3NyYXdpICAgcjE5LHIyMCwyCitvcmkgICAgIHIxMixyMTIsMHhGRgorc3ViaSAgICByMyxyMywxCitzdWJpICAgIHI0LHI0LDEKK210c3ByCWN0cixyMgkJOyBJbml0IHRoZSBsb29wIGNvdW50IChvbmUgbG9vcCBwZXIgcGl4ZWwgY29tcHV0ZWQpCitzdWJpICAgIHIzMSxyNywwCitzdWJpICAgIHI2LHI2LDQKK3Nsd2kJcjMscjMsNAorc2x3aQlyNCxyNCw0CisKKztwcmUgaW5pdCBmb3IgbG9vcAorbHd6CXIyLDAocjMxKSAgICA7IHB4Citsd3oJcjI5LDQocjMxKSAgIDsgcHkKK2x3eglyOCwwKHIzMCkgICAgOyBweDIKK2x3eglyMTAsNChyMzApICAgOyBweTIKKworOyoqKioqKioqKioqKioqKioqKioqKgorbGlzICAgICByMTcsMHgwRjAxCisKK2IgICAgICAgTDEwMAorLmFsaWduICA1CitMMTAwOgorCithZGRpICAgIHI2LHI2LDQKKworOyBPcHRpbWl6YXRpb24gdG8gZW5zdXJlIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKzsgd29uJ3QgYmUgbG9hZGVkIGludG8gdGhlIGRhdGEgY2FjaGUKK3Jsd2lubS4gcjAscjYsMCwyNywzMQorYm5lKyAgICBMNTAwCitkY2J6ICAgIDAscjYKKztkY2JhICAgIDAscjYKK0w1MDA6CisKKzsgY29tcHV0ZXMgZHluYW1pY2FsbHkgdGhlIHBvc2l0aW9uIHRvIGZldGNoCis7bXVsbHcgICByOCxyOCxyMjkKKzttdWxsdyAgIHIyLHIyLHIyOQorO2FkZCAgICAgcjIscjgscjIKKztzcmF3aSAgIHIyLHIyLDE3CisKK3N1YiAgICAgcjgscjgscjIKK3N1YiAgICAgcjEwLHIxMCxyMjkKK211bGx3ICAgcjgscjgscjkKK2FkZGkgICAgcjMxLHIzMSw4CittdWxsdyAgIHIxMCxyMTAscjkKK2FkZGkgICAgcjMwLHIzMCw4CisKK2RzdCAgICAgcjMwLHIxNywwCisKK3NyYXdpICAgIHI4LHI4LDE2CitzcmF3aSAgICByMTAscjEwLDE2CithZGQgICAgIHIyLHIyLHI4CithZGQgICAgIHIyOSxyMjkscjEwCisKK2RzdCAgICAgcjMxLHIxNywxCisKKzsgaWYgcHg+YXggb3IgcHk+YXkgZ290byBvdXRvZnJhbmdlCis7IGNvbXB1dGVzIHRoZSBhdHRlbnVhdGlvbiBjb2VmZnMgYW5kIHRoZSBvcmlnaW5hbCBwb2ludCBhZGRyZXNzCitybHdpbm0gIHIxMCxyMiw2LDI4LTYsMzEtNiA7IHIxMCA8LSAocjIgPDwgMikgJiAweDAwMDAwMkQwICAgKHIxMD0ocjIlMTYpKjQqMTYpCitjbXBsICAgIGNyNCwwLHIyLHIzCitybHdpbWkgIHIxMCwgcjI5LCAyLCAyOC0yLCAzMS0yIDsgcjEwIDwtICgocjI5IDw8IDIpICYgMHgwMDAwMDAyRCkgfCAocjEwICYgITB4MDAwMDAwMkQpICAgICAgKHIxMD0ocjI5JTE2KSo0IHwgcjEwKQorY21wbCAgICBjcjcsMCxyMjkscjQKK3NyYXdpICAgcjI5LHIyOSw0ICAgICA7IHBvcyBjb21wdXRpbmcKK2JnZS0JY3I0LEw0MDAKK3NyYXdpICAgcjIscjIsNCAgICAgICA7IHBvcyBjb21wdXRpbmcKK211bGx3ICAgcjI5LCByMjkscjE5ICA7IHBvcyBjb21wdXRpbmcKK2JnZS0JY3I3LEw0MDAKKworOyBDaGFubmVscyBub3RhdGlvbiA6IDAwMTEyMjMzIChBQVJSVlZCQikKKworYWRkICAgICByMixyMixyMjkgICAgCQk7IHBvcyBjb21wdXRpbmcKK2x3enggICAgcjEwLHIxMSxyMTAJCTsgTG9hZHMgY29lZnMKK3Nsd2kgICAgcjIscjIsMiAgICAgIAkJOyBwb3MgY29tcHV0aW5nCithZGQJcjIscjIscjUgICAgIAkJOyBwb3MgY29tcHV0aW5nCitybHdpbm0gIHIyMSxyMTAsMCwyNCwzMQkgICAgICAgIDsgSXNvbGF0ZXMgY29lZjEgKD8/Pz8/PzExIC0+IDAwMDAwMDExKQorbHd6CXIyNSwwKHIyKQkJOyBMb2FkcyBjb2wxIC0+IHIyNQorbHd6CXIyNiw0KHIyKQkJOyBMb2FkcyBjb2wyIC0+IHIyNgorcmx3aW5tICByMjIscjEwLDI0LDI0LDMxCTsgSXNvbGF0ZXMgY29lZjIgKD8/Pz8yMj8/IC0+IDAwMDAwMDIyKQorcmx3aW5tICByMjMscjEwLDE2LDI0LDMxCTsgSXNvbGF0ZXMgY29lZjMgKD8/MzM/Pz8/IC0+IDAwMDAwMDMzKQorYWRkCXIyLHIyLHIyMAkJOyBBZGRzIG9uZSBsaW5lIGZvciBmdXR1cmUgbG9hZCBvZiBjb2wzIGFuZCBjb2w0CithbmQJcjgsIHIyNSxyMTIJCTsgTWFza3MgY29sMSBjaGFubmVscyAxICYgMyA6IDB4MDBYWDAwWFgKK3Jsd2lubSAgcjI0LHIxMCw4LDI0LDMxCQk7IElzb2xhdGVzIGNvZWY0ICg0ND8/Pz8/PyAtPiAwMDAwMDA0NCkKK2RzdCAgICAgcjIscjE3LDIKK3Jsd2lubSAgcjI1LHIyNSwwLDE2LDIzCQk7IE1hc2tzIGNvbDEgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorO2FuZGkuCXIyNSxyMjUsMHhGRjAwCQk7IE1hc2tzIGNvbDEgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorbXVsbHcJcjgsIHI4LCByMjEJCTsgQXBwbGllcyBjb2VmMSBvbiBjb2wxIGNoYW5uZWxzIDEgJiAzCisKKworOyBjb21wdXRlcyBmaW5hbCBwaXhlbCBjb2xvcgorYW5kCXIxMCxyMjYscjEyCQk7IE1hc2tzIGNvbDIgY2hhbm5lbHMgMSAmIDMgOiAweDAwWFgwMFhYCitsd3oJcjI3LDAocjIpCQk7IExvYWRzIGNvbDMgLT4gcjI3CittdWxsdwlyMTAscjEwLHIyMgkJOyBBcHBsaWVzIGNvZWYyIG9uIGNvbDIgY2hhbm5lbHMgMSAmIDMKK211bGx3CXIyNSxyMjUscjIxCQk7IEFwcGxpZXMgY29lZjEgb24gY29sMSBjaGFubmVsIDIKK3Jsd2lubSAgcjI5LHIyNiwwLDE2LDIzCQk7IE1hc2tzIGNvbDIgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorO2FuZGkuCXIyOSxyMjYsMHhGRjAwCQk7IE1hc2tzIGNvbDIgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorbXVsbHcJcjI5LHIyOSxyMjIJCTsgQXBwbGllcyBjb2VmMiBvbiBjb2wyIGNoYW5uZWwgMgorbHd6CXIyOCw0KHIyKQkJOyBMb2FkcyBjb2w0IC0+IHIyOAorYWRkCXI4ICxyOCAscjEwCQk7IEFkZHMgY29sMSAmIGNvbDIgY2hhbm5lbHMgMSAmIDMKK2FuZAlyMTAscjI3LHIxMgkJOyBNYXNrcyBjb2wzIGNoYW5uZWxzIDEgJiAzIDogMHgwMFhYMDBYWAorYWRkCXIyNSxyMjUscjI5CQk7IEFkZHMgY29sMSAmIGNvbDIgY2hhbm5lbCAyCittdWxsdwlyMTAscjEwLHIyMwkJOyBBcHBsaWVzIGNvZWYzIG9uIGNvbDMgY2hhbm5lbHMgMSAmIDMKK3Jsd2lubSAgcjI5LHIyNywwLDE2LDIzCQk7IE1hc2tzIGNvbDMgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorO2FuZGkuCXIyOSxyMjcsMHhGRjAwCQk7IE1hc2tzIGNvbDMgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorbXVsbHcJcjI5LHIyOSxyMjMJCTsgQXBwbGllcyBjb2VmMyBvbiBjb2wzIGNoYW5uZWwgMgorbHd6CXIyLDAocjMxKQkJOyBweAorYWRkCXI3ICxyOCAscjEwCQk7IEFkZHMgY29sMyB0byAoY29sMSArIGNvbDIpIGNoYW5uZWxzIDEgJiAzCithbmQJcjEwLHIyOCxyMTIJCTsgTWFza3MgY29sNCBjaGFubmVscyAxICYgMyA6IDB4MDBYWDAwWFgKK211bGx3CXIxMCxyMTAscjI0CQk7IEFwcGxpZXMgY29lZjQgb24gY29sNCBjaGFubmVscyAxICYgMworYWRkCXIyNSxyMjUscjI5CQk7IEFkZHMgY29sIDMgdG8gKGNvbDEgKyBjb2wyKSBjaGFubmVsIDIKK2x3eiAJcjgsMChyMzApICAgIAkJOyBweDIKK3Jsd2lubSAgcjI4LHIyOCwwLDE2LDIzCQk7IE1hc2tzIGNvbDQgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorO2FuZGkuCXIyOCxyMjgsMHhGRjAwCQk7IE1hc2tzIGNvbDQgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorYWRkCXI3ICxyNyAscjEwCQk7IEFkZHMgY29sNCB0byAoY29sMSArIGNvbDIgKyBjb2wzKSBjaGFubmVscyAxICYgMworbHd6CXIxMCw0KHIzMCkgICAJCTsgcHkyCittdWxsdwlyMjgscjI4LHIyNAkJOyBBcHBsaWVzIGNvZWY0IG9uIGNvbDQgY2hhbm5lbCAyCitzcmF3aQlyNywgcjcsIDgJCTsgKHN1bSBvZiBjaGFubmVscyAxICYgMykgPj4gOAorbHd6CXIyOSw0KHIzMSkgICAgICAgICAgICAgIDsgcHkKK2FkZAlyMjUscjI1LHIyOAkJOyBBZGRzIGNvbCA0IHRvIChjb2wxICsgY29sMiArIGNvbDMpIGNoYW5uZWwgMgorcmx3aW1pICByNywgcjI1LCAyNCwgMTYsIDIzCTsgKCgoc3VtIG9mIGNoYW5uZWxzIDIpID4+IDggKSAmIDB4MDAwMEZGMDApIHwgKChzdW0gb2YgY2hhbm5lbHMgMSBhbmQgMykgJiAweEZGRkYwMEZGKQorc3R3CXI3LDAocjYpCQk7IFN0b3JlcyB0aGUgY29tcHV0ZWQgcGl4ZWwKK2JkbnoJTDEwMAkJCTsgSXRlcmF0ZSBhZ2FpbiBpZiBuZWVkZWQKK2IgICAgICAgTDMwMAk7Z290byBlbmQJOyBJZiBub3QsIHJldHVybnMgZnJvbSB0aGUgZnVuY3Rpb24KKworCis7IGlmIG91dCBvZiByYW5nZQorTDQwMDoKK3N0dwlyMTgsMChyNikKK2x3eglyOCwwKHIzMCkgICAgOyBweDIKK2x3eglyMTAsNChyMzApICAgOyBweTIKK2x3eglyMiwwKHIzMSkgICAgOyBweAorbHd6CXIyOSw0KHIzMSkgICA7IHB5CitiZG56CUwxMDAKKworCitMMzAwOgorCis7IFJlc3RvcmUgc2F2ZWQgcmVnaXN0ZXJzIGFuZCByZXR1cm4KK2xtdwlyMTcsLTYwKHIxKQorYmxyCmRpZmYgLS1naXQgYS9nc3QvZ29vbS9zb3VuZF90ZXN0ZXIuYyBiL2dzdC9nb29tL3NvdW5kX3Rlc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMmYwYjUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9zb3VuZF90ZXN0ZXIuYwpAQCAtMCwwICsxLDE2MSBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgInNvdW5kX3Rlc3Rlci5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIHNvbWUgY29uc3RhbnRzICovCisjZGVmaW5lIEJJR19HT09NX0RVUkFUSU9OIDEwMAorI2RlZmluZSBCSUdfR09PTV9TUEVFRF9MSU1JVCAwLjFmCisKKyNkZWZpbmUgQUNDRUxfTVVMVCAwLjk1ZgorI2RlZmluZSBTUEVFRF9NVUxUIDAuOTlmCisKKwordm9pZAorZXZhbHVhdGVfc291bmQgKGdpbnQxNiBkYXRhWzJdWzUxMl0sIFNvdW5kSW5mbyAqIGluZm8pCit7CisKKyAgaW50IGk7CisgIGZsb2F0IGRpZmFjY2VsOworICBmbG9hdCBwcmV2c3BlZWQ7CisKKyAgLyogZmluZCB0aGUgbWF4ICovCisgIGludCBpbmN2YXIgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCA1MTI7IGkgKz0gMikgeworICAgIGlmIChpbmN2YXIgPCBkYXRhWzBdW2ldKQorICAgICAgaW5jdmFyID0gZGF0YVswXVtpXTsKKyAgfQorCisgIGlmIChpbmN2YXIgPiBpbmZvLT5hbGxUaW1lc01heCkKKyAgICBpbmZvLT5hbGxUaW1lc01heCA9IGluY3ZhcjsKKworICAvKiB2b2x1bWUgc29ub3JlICovCisgIGluZm8tPnZvbHVtZSA9IChmbG9hdCkgaW5jdmFyIC8gKGZsb2F0KSBpbmZvLT5hbGxUaW1lc01heDsKKyAgbWVtY3B5IChpbmZvLT5zYW1wbGVzWzBdLCBkYXRhWzBdLCA1MTIgKiBzaXplb2YgKHNob3J0KSk7CisgIG1lbWNweSAoaW5mby0+c2FtcGxlc1sxXSwgZGF0YVsxXSwgNTEyICogc2l6ZW9mIChzaG9ydCkpOworCisgIGRpZmFjY2VsID0gaW5mby0+YWNjZWx2YXI7CisgIGluZm8tPmFjY2VsdmFyID0gaW5mby0+dm9sdW1lOyAgICAgICAgLyogYWNjZWwgZW50cmUgMCBldCAxICovCisKKyAgLyogdHJhbnNmb3JtYXRpb25zIHN1ciBsYSB2aXRlc3NlIGR1IHNvbiAqLworICBpZiAoaW5mby0+c3BlZWR2YXIgPiAxLjBmKQorICAgIGluZm8tPnNwZWVkdmFyID0gMS4wZjsKKworICBpZiAoaW5mby0+c3BlZWR2YXIgPCAwLjFmKQorICAgIGluZm8tPmFjY2VsdmFyICo9ICgxLjBmIC0gKGZsb2F0KSBpbmZvLT5zcGVlZHZhcik7CisgIGVsc2UgaWYgKGluZm8tPnNwZWVkdmFyIDwgMC4zZikKKyAgICBpbmZvLT5hY2NlbHZhciAqPSAoMC45ZiAtIChmbG9hdCkgKGluZm8tPnNwZWVkdmFyIC0gMC4xZikgLyAyLjBmKTsKKyAgZWxzZQorICAgIGluZm8tPmFjY2VsdmFyICo9ICgwLjhmIC0gKGZsb2F0KSAoaW5mby0+c3BlZWR2YXIgLSAwLjNmKSAvIDQuMGYpOworCisgIC8qIGFkb3VjaXNzZW1lbnQgZGUgbCdhY2NlbGVyYXRpb24gKi8KKyAgaW5mby0+YWNjZWx2YXIgKj0gQUNDRUxfTVVMVDsKKyAgaWYgKGluZm8tPmFjY2VsdmFyIDwgMCkKKyAgICBpbmZvLT5hY2NlbHZhciA9IDA7CisKKyAgZGlmYWNjZWwgPSBpbmZvLT5hY2NlbHZhciAtIGRpZmFjY2VsOworICBpZiAoZGlmYWNjZWwgPCAwKQorICAgIGRpZmFjY2VsID0gLWRpZmFjY2VsOworCisgIC8qIG1pc2UgYSBqb3VyIGRlIGxhIHZpdGVzc2UgKi8KKyAgcHJldnNwZWVkID0gaW5mby0+c3BlZWR2YXI7CisgIGluZm8tPnNwZWVkdmFyID0gKGluZm8tPnNwZWVkdmFyICsgZGlmYWNjZWwgKiAwLjVmKSAvIDI7CisgIGluZm8tPnNwZWVkdmFyICo9IFNQRUVEX01VTFQ7CisgIGluZm8tPnNwZWVkdmFyID0gKGluZm8tPnNwZWVkdmFyICsgMy4wZiAqIHByZXZzcGVlZCkgLyA0LjBmOworICBpZiAoaW5mby0+c3BlZWR2YXIgPCAwKQorICAgIGluZm8tPnNwZWVkdmFyID0gMDsKKyAgaWYgKGluZm8tPnNwZWVkdmFyID4gMSkKKyAgICBpbmZvLT5zcGVlZHZhciA9IDE7CisKKyAgLyogdGVtcHMgZHUgZ29vbSAqLworICBpbmZvLT50aW1lU2luY2VMYXN0R29vbSsrOworICBpbmZvLT50aW1lU2luY2VMYXN0QmlnR29vbSsrOworICBpbmZvLT5jeWNsZSsrOworCisgIC8qIGRldGVjdGlvbiBkZXMgbm91dmVhdXggZ29vbXMgKi8KKyAgaWYgKChpbmZvLT5zcGVlZHZhciA+IChmbG9hdCkgSVZBTCAoaW5mby0+YmlnZ29vbV9zcGVlZF9saW1pdF9wKSAvIDEwMC4wZikKKyAgICAgICYmIChpbmZvLT5hY2NlbHZhciA+IGluZm8tPmJpZ0dvb21MaW1pdCkKKyAgICAgICYmIChpbmZvLT50aW1lU2luY2VMYXN0QmlnR29vbSA+IEJJR19HT09NX0RVUkFUSU9OKSkgeworICAgIGluZm8tPnRpbWVTaW5jZUxhc3RCaWdHb29tID0gMDsKKyAgfQorCisgIGlmIChpbmZvLT5hY2NlbHZhciA+IGluZm8tPmdvb21fbGltaXQpIHsKKyAgICAvKiBUT0RPOiB0ZXN0ZXIgJiYgKGluZm8tPnRpbWVTaW5jZUxhc3RHb29tID4gMjApKSB7ICovCisgICAgaW5mby0+dG90YWxnb29tKys7CisgICAgaW5mby0+dGltZVNpbmNlTGFzdEdvb20gPSAwOworICAgIGluZm8tPmdvb21Qb3dlciA9IGluZm8tPmFjY2VsdmFyIC0gaW5mby0+Z29vbV9saW1pdDsKKyAgfQorCisgIGlmIChpbmZvLT5hY2NlbHZhciA+IGluZm8tPnByb3ZfbWF4KQorICAgIGluZm8tPnByb3ZfbWF4ID0gaW5mby0+YWNjZWx2YXI7CisKKyAgaWYgKGluZm8tPmdvb21fbGltaXQgPiAxKQorICAgIGluZm8tPmdvb21fbGltaXQgPSAxOworCisgIC8qIHRvdXRlIGxlcyAyIHNlY29uZGVzIDogdu+/vXJpZmllciBzaSBsZSB0YXV4IGRlIGdvb20gZXN0IGNvcnJlY3QKKyAgICogZXQgbGUgbW9kaWZpZXIgc2lub24uLiAqLworICBpZiAoaW5mby0+Y3ljbGUgJSA2NCA9PSAwKSB7CisgICAgaWYgKGluZm8tPnNwZWVkdmFyIDwgMC4wMWYpCisgICAgICBpbmZvLT5nb29tX2xpbWl0ICo9IDAuOTE7CisgICAgaWYgKGluZm8tPnRvdGFsZ29vbSA+IDQpIHsKKyAgICAgIGluZm8tPmdvb21fbGltaXQgKz0gMC4wMjsKKyAgICB9CisgICAgaWYgKGluZm8tPnRvdGFsZ29vbSA+IDcpIHsKKyAgICAgIGluZm8tPmdvb21fbGltaXQgKj0gMS4wM2Y7CisgICAgICBpbmZvLT5nb29tX2xpbWl0ICs9IDAuMDM7CisgICAgfQorICAgIGlmIChpbmZvLT50b3RhbGdvb20gPiAxNikgeworICAgICAgaW5mby0+Z29vbV9saW1pdCAqPSAxLjA1ZjsKKyAgICAgIGluZm8tPmdvb21fbGltaXQgKz0gMC4wNDsKKyAgICB9CisgICAgaWYgKGluZm8tPnRvdGFsZ29vbSA9PSAwKSB7CisgICAgICBpbmZvLT5nb29tX2xpbWl0ID0gaW5mby0+cHJvdl9tYXggLSAwLjAyOworICAgIH0KKyAgICBpZiAoKGluZm8tPnRvdGFsZ29vbSA9PSAxKSAmJiAoaW5mby0+Z29vbV9saW1pdCA+IDAuMDIpKQorICAgICAgaW5mby0+Z29vbV9saW1pdCAtPSAwLjAxOworICAgIGluZm8tPnRvdGFsZ29vbSA9IDA7CisgICAgaW5mby0+YmlnR29vbUxpbWl0ID0KKyAgICAgICAgaW5mby0+Z29vbV9saW1pdCAqICgxLjBmICsKKyAgICAgICAgKGZsb2F0KSBJVkFMIChpbmZvLT5iaWdnb29tX2ZhY3Rvcl9wKSAvIDUwMC4wZik7CisgICAgaW5mby0+cHJvdl9tYXggPSAwOworICB9CisKKyAgLyogbWlzZSBhIGpvdXIgZGVzIHBhcmFtZXRyZXMgcG91ciBsYSBHVUkgKi8KKyAgRlZBTCAoaW5mby0+dm9sdW1lX3ApID0gaW5mby0+dm9sdW1lOworICBpbmZvLT52b2x1bWVfcC5jaGFuZ2VfbGlzdGVuZXIgKCZpbmZvLT52b2x1bWVfcCk7CisgIEZWQUwgKGluZm8tPnNwZWVkX3ApID0gaW5mby0+c3BlZWR2YXIgKiA0OworICBpbmZvLT5zcGVlZF9wLmNoYW5nZV9saXN0ZW5lciAoJmluZm8tPnNwZWVkX3ApOworICBGVkFMIChpbmZvLT5hY2NlbF9wKSA9IGluZm8tPmFjY2VsdmFyOworICBpbmZvLT5hY2NlbF9wLmNoYW5nZV9saXN0ZW5lciAoJmluZm8tPmFjY2VsX3ApOworCisgIEZWQUwgKGluZm8tPmdvb21fbGltaXRfcCkgPSBpbmZvLT5nb29tX2xpbWl0OworICBpbmZvLT5nb29tX2xpbWl0X3AuY2hhbmdlX2xpc3RlbmVyICgmaW5mby0+Z29vbV9saW1pdF9wKTsKKyAgRlZBTCAoaW5mby0+Z29vbV9wb3dlcl9wKSA9IGluZm8tPmdvb21Qb3dlcjsKKyAgaW5mby0+Z29vbV9wb3dlcl9wLmNoYW5nZV9saXN0ZW5lciAoJmluZm8tPmdvb21fcG93ZXJfcCk7CisgIEZWQUwgKGluZm8tPmxhc3RfZ29vbV9wKSA9IDEuMCAtICgoZmxvYXQpIGluZm8tPnRpbWVTaW5jZUxhc3RHb29tIC8gMjAuMGYpOworICBpbmZvLT5sYXN0X2dvb21fcC5jaGFuZ2VfbGlzdGVuZXIgKCZpbmZvLT5sYXN0X2dvb21fcCk7CisgIEZWQUwgKGluZm8tPmxhc3RfYmlnZ29vbV9wKSA9CisgICAgICAxLjAgLSAoKGZsb2F0KSBpbmZvLT50aW1lU2luY2VMYXN0QmlnR29vbSAvIDQwLjBmKTsKKyAgaW5mby0+bGFzdF9iaWdnb29tX3AuY2hhbmdlX2xpc3RlbmVyICgmaW5mby0+bGFzdF9iaWdnb29tX3ApOworCisgIC8qIGJpZ0dvb21MaW1pdCA9PWdvb21MaW1pdCo5LzgrNyA/ICovCit9CmRpZmYgLS1naXQgYS9nc3QvZ29vbS9zb3VuZF90ZXN0ZXIuaCBiL2dzdC9nb29tL3NvdW5kX3Rlc3Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NTFkNWYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9zb3VuZF90ZXN0ZXIuaApAQCAtMCwwICsxLDI5IEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZuZGVmIF9TT1VORF9URVNURVJfSAorI2RlZmluZSBfU09VTkRfVEVTVEVSX0gKKworI2luY2x1ZGUgImdvb21fcGx1Z2luX2luZm8uaCIKKyNpbmNsdWRlICJnb29tX2NvbmZpZy5oIgorCisvKiogY2hhbmdlIGxlcyBkb25uZWVzIGR1IFNvdW5kSW5mbyAqLwordm9pZCBldmFsdWF0ZV9zb3VuZChnaW50MTYgZGF0YVsyXVs1MTJdLCBTb3VuZEluZm8gKnNuZEluZm8pOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vc3VyZjNkLmMgYi9nc3QvZ29vbS9zdXJmM2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDcyODRiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vc3VyZjNkLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qIEdvb20gUHJvamVjdAorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gaU9TLVNvZnR3YXJlCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpbmNsdWRlICJzdXJmM2QuaCIKKyNpbmNsdWRlICJnb29tX3BsdWdpbl9pbmZvLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZ3JpZDNkICoKK2dyaWQzZF9uZXcgKGludCBzaXpleCwgaW50IGRlZngsIGludCBzaXpleiwgaW50IGRlZnosIHYzZCBjZW50ZXIpCit7CisgIGludCB4ID0gZGVmeDsKKyAgaW50IHkgPSBkZWZ6OworICBncmlkM2QgKmcgPSBtYWxsb2MgKHNpemVvZiAoZ3JpZDNkKSk7CisgIHN1cmYzZCAqcyA9ICYoZy0+c3VyZik7CisKKyAgcy0+bmJ2ZXJ0ZXggPSB4ICogeTsKKyAgcy0+dmVydGV4ID0gbWFsbG9jICh4ICogeSAqIHNpemVvZiAodjNkKSk7CisgIHMtPnN2ZXJ0ZXggPSBtYWxsb2MgKHggKiB5ICogc2l6ZW9mICh2M2QpKTsKKyAgcy0+Y2VudGVyID0gY2VudGVyOworCisgIGctPmRlZnggPSBkZWZ4OworICBnLT5zaXpleCA9IHNpemV4OworICBnLT5kZWZ6ID0gZGVmejsKKyAgZy0+c2l6ZXogPSBzaXplejsKKyAgZy0+bW9kZSA9IDA7CisKKyAgd2hpbGUgKHkpIHsKKyAgICAtLXk7CisgICAgeCA9IGRlZng7CisgICAgd2hpbGUgKHgpIHsKKyAgICAgIC0teDsKKyAgICAgIHMtPnZlcnRleFt4ICsgZGVmeCAqIHldLnggPSAoZmxvYXQpICh4IC0gZGVmeCAvIDIpICogc2l6ZXggLyBkZWZ4OworICAgICAgcy0+dmVydGV4W3ggKyBkZWZ4ICogeV0ueSA9IDA7CisgICAgICBzLT52ZXJ0ZXhbeCArIGRlZnggKiB5XS56ID0gKGZsb2F0KSAoeSAtIGRlZnogLyAyKSAqIHNpemV6IC8gZGVmejsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGc7Cit9CisKK3ZvaWQKK2dyaWQzZF9mcmVlIChncmlkM2QgKiBnKQoreworICBzdXJmM2QgKnMgPSAmKGctPnN1cmYpOworCisgIGZyZWUgKHMtPnZlcnRleCk7CisgIGZyZWUgKHMtPnN2ZXJ0ZXgpOworCisgIGZyZWUgKGcpOworfQorCit2b2lkCitncmlkM2RfZHJhdyAoUGx1Z2luSW5mbyAqIHBsdWcsIGdyaWQzZCAqIGcsIGludCBjb2xvciwgaW50IGNvbG9ybG93LAorICAgIGludCBkaXN0LCBQaXhlbCAqIGJ1ZiwgUGl4ZWwgKiBiYWNrLCBpbnQgVywgaW50IEgpCit7CisKKyAgaW50IHg7CisgIHYyZCB2MiwgdjJ4OworCisgIHYyZCAqdjJfYXJyYXkgPSBtYWxsb2MgKGctPnN1cmYubmJ2ZXJ0ZXggKiBzaXplb2YgKHYyZCkpOworCisgIHYzZF90b192MmQgKGctPnN1cmYuc3ZlcnRleCwgZy0+c3VyZi5uYnZlcnRleCwgVywgSCwgZGlzdCwgdjJfYXJyYXkpOworCisgIGZvciAoeCA9IDA7IHggPCBnLT5kZWZ4OyB4KyspIHsKKyAgICBpbnQgejsKKworICAgIHYyeCA9IHYyX2FycmF5W3hdOworCisgICAgZm9yICh6ID0gMTsgeiA8IGctPmRlZno7IHorKykgeworICAgICAgdjIgPSB2Ml9hcnJheVt6ICogZy0+ZGVmeCArIHhdOworICAgICAgaWYgKCgodjIueCAhPSAtNjY2KSB8fCAodjIueSAhPSAtNjY2KSkKKyAgICAgICAgICAmJiAoKHYyeC54ICE9IC02NjYpIHx8ICh2MngueSAhPSAtNjY2KSkpIHsKKyAgICAgICAgcGx1Zy0+bWV0aG9kcy5kcmF3X2xpbmUgKGJ1ZiwgdjJ4LngsIHYyeC55LCB2Mi54LCB2Mi55LCBjb2xvcmxvdywgVywgSCk7CisgICAgICAgIHBsdWctPm1ldGhvZHMuZHJhd19saW5lIChiYWNrLCB2MngueCwgdjJ4LnksIHYyLngsIHYyLnksIGNvbG9yLCBXLCBIKTsKKyAgICAgIH0KKyAgICAgIHYyeCA9IHYyOworICAgIH0KKyAgfQorCisgIGZyZWUgKHYyX2FycmF5KTsKK30KKwordm9pZAorc3VyZjNkX3JvdGF0ZSAoc3VyZjNkICogcywgZmxvYXQgYW5nbGUpCit7CisgIGludCBpOworICBmbG9hdCBjb3NhOworICBmbG9hdCBzaW5hOworCisgIFNJTkNPUyAoYW5nbGUsIHNpbmEsIGNvc2EpOworICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJ2ZXJ0ZXg7IGkrKykgeworICAgIFlfUk9UQVRFX1YzRCAocy0+dmVydGV4W2ldLCBzLT5zdmVydGV4W2ldLCBjb3NhLCBzaW5hKTsKKyAgfQorfQorCit2b2lkCitzdXJmM2RfdHJhbnNsYXRlIChzdXJmM2QgKiBzKQoreworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJ2ZXJ0ZXg7IGkrKykgeworICAgIFRSQU5TTEFURV9WM0QgKHMtPmNlbnRlciwgcy0+c3ZlcnRleFtpXSk7CisgIH0KK30KKwordm9pZAorZ3JpZDNkX3VwZGF0ZSAoZ3JpZDNkICogZywgZmxvYXQgYW5nbGUsIGZsb2F0ICp2YWxzLCBmbG9hdCBkaXN0KQoreworICBpbnQgaTsKKyAgZmxvYXQgY29zYTsKKyAgZmxvYXQgc2luYTsKKyAgc3VyZjNkICpzID0gJihnLT5zdXJmKTsKKyAgdjNkIGNhbSA9IHMtPmNlbnRlcjsKKworICBjYW0ueiArPSBkaXN0OworCisgIFNJTkNPUyAoKGFuZ2xlIC8gNC4zZiksIHNpbmEsIGNvc2EpOworICBjYW0ueSArPSBzaW5hICogMi4wZjsKKyAgU0lOQ09TIChhbmdsZSwgc2luYSwgY29zYSk7CisKKyAgaWYgKGctPm1vZGUgPT0gMCkgeworICAgIGlmICh2YWxzKQorICAgICAgZm9yIChpID0gMDsgaSA8IGctPmRlZng7IGkrKykKKyAgICAgICAgcy0+dmVydGV4W2ldLnkgPSBzLT52ZXJ0ZXhbaV0ueSAqIDAuMiArIHZhbHNbaV0gKiAwLjg7CisKKyAgICBmb3IgKGkgPSBnLT5kZWZ4OyBpIDwgcy0+bmJ2ZXJ0ZXg7IGkrKykgeworICAgICAgcy0+dmVydGV4W2ldLnkgKj0gMC4yNTVmOworICAgICAgcy0+dmVydGV4W2ldLnkgKz0gKHMtPnZlcnRleFtpIC0gZy0+ZGVmeF0ueSAqIDAuNzc3Zik7CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHMtPm5idmVydGV4OyBpKyspIHsKKyAgICBZX1JPVEFURV9WM0QgKHMtPnZlcnRleFtpXSwgcy0+c3ZlcnRleFtpXSwgY29zYSwgc2luYSk7CisgICAgVFJBTlNMQVRFX1YzRCAoY2FtLCBzLT5zdmVydGV4W2ldKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vc3VyZjNkLmggYi9nc3QvZ29vbS9zdXJmM2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGEyMTgwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vc3VyZjNkLmgKQEAgLTAsMCArMSw1NyBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmbmRlZiBfU1VSRjNEX0gKKyNkZWZpbmUgX1NVUkYzRF9ICisKKyNpbmNsdWRlICJ2M2QuaCIKKyNpbmNsdWRlICJnb29tX2dyYXBoaWMuaCIKKyNpbmNsdWRlICJnb29tX3R5cGVkZWZzLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKwl2M2QgKnZlcnRleDsKKwl2M2QgKnN2ZXJ0ZXg7CisJaW50IG5idmVydGV4OworCisJdjNkIGNlbnRlcjsKK30gc3VyZjNkOworCit0eXBlZGVmIHN0cnVjdCB7CisJc3VyZjNkIHN1cmY7CisJCisJaW50IGRlZng7CisJaW50IHNpemV4OworCWludCBkZWZ6OworCWludCBzaXplejsKKwlpbnQgbW9kZTsKK30gZ3JpZDNkOworCisvKiBoaS1sZXZlbCAqLworCisvKiB3b3JrcyBvbiBncmlkM2QgKi8KK2dyaWQzZCAqZ3JpZDNkX25ldyAoaW50IHNpemV4LCBpbnQgZGVmeCwgaW50IHNpemV6LCBpbnQgZGVmeiwgdjNkIGNlbnRlcik7Cit2b2lkIGdyaWQzZF9mcmVlIChncmlkM2QgKmcpOwordm9pZCBncmlkM2RfdXBkYXRlIChncmlkM2QgKnMsIGZsb2F0IGFuZ2xlLCBmbG9hdCAqdmFscywgZmxvYXQgZGlzdCk7CisKKy8qIGxvdyBsZXZlbCAqLwordm9pZCBzdXJmM2RfZHJhdyAoc3VyZjNkICpzLCBpbnQgY29sb3IsIGludCBkaXN0LCBpbnQgKmJ1ZiwgaW50ICpiYWNrLCBpbnQgVyxpbnQgSCk7Cit2b2lkIGdyaWQzZF9kcmF3IChQbHVnaW5JbmZvICpwbHVnLCBncmlkM2QgKmcsIGludCBjb2xvciwgaW50IGNvbG9ybG93LCBpbnQgZGlzdCwgUGl4ZWwgKmJ1ZiwgUGl4ZWwgKmJhY2ssIGludCBXLGludCBIKTsKK3ZvaWQgc3VyZjNkX3JvdGF0ZSAoc3VyZjNkICpzLCBmbG9hdCBhbmdsZSk7Cit2b2lkIHN1cmYzZF90cmFuc2xhdGUgKHN1cmYzZCAqcyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vc3VyZjNkLnMgYi9nc3QvZ29vbS9zdXJmM2QucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGM4YzVkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vc3VyZjNkLnMKQEAgLTAsMCArMSw0ODQgQEAKKwkuZmlsZQkic3VyZjNkLmMiCisJLnZlcnNpb24JIjAxLjAxIgorZ2NjMl9jb21waWxlZC46CisudGV4dAorCS5hbGlnbiA0CisuZ2xvYmwgZ3JpZDNkX25ldworCS50eXBlCSBncmlkM2RfbmV3LEBmdW5jdGlvbgorZ3JpZDNkX25ldzoKKwlwdXNobCAlZWJwCisJbW92bCAlZXNwLCVlYnAKKwlzdWJsICQ0NCwlZXNwCisJcHVzaGwgJWVkaQorCXB1c2hsICVlc2kKKwlwdXNobCAlZWJ4CisJbW92bCAyMCglZWJwKSwlZWF4CisJbW92bCAxMiglZWJwKSwlZXNpCisJbW92bCAlZWF4LC04KCVlYnApCisJYWRkbCAkLTEyLCVlc3AKKwlwdXNobCAkNDQKKwljYWxsIG1hbGxvYworCW1vdmwgJWVzaSwlZWR4CisJaW11bGwgLTgoJWVicCksJWVkeAorCW1vdmwgJWVheCwlZWRpCisJbW92bCAlZWR4LC0xMiglZWJwKQorCWxlYWwgKCVlZHgsJWVkeCwyKSwlZWJ4CisJbW92bCAlZWR4LDgoJWVkaSkKKwlhZGRsICQtMTIsJWVzcAorCXNhbGwgJDIsJWVieAorCXB1c2hsICVlYngKKwljYWxsIG1hbGxvYworCWFkZGwgJDMyLCVlc3AKKwltb3ZsICVlYXgsKCVlZGkpCisJYWRkbCAkLTEyLCVlc3AKKwlwdXNobCAlZWJ4CisJY2FsbCBtYWxsb2MKKwltb3ZsICVlYXgsNCglZWRpKQorCW1vdmwgMjQoJWVicCksJWVheAorCW1vdmwgJWVheCwxMiglZWRpKQorCW1vdmwgMjgoJWVicCksJWVheAorCW1vdmwgJWVheCwxNiglZWRpKQorCW1vdmwgMzIoJWVicCksJWVheAorCW1vdmwgJWVheCwyMCglZWRpKQorCW1vdmwgOCglZWJwKSwlZWF4CisJbW92bCAlZWF4LDI4KCVlZGkpCisJbW92bCAlZXNpLDI0KCVlZGkpCisJbW92bCAtOCglZWJwKSwlZWR4CisJbW92bCAxNiglZWJwKSwlZWF4CisJbW92bCAlZWR4LDMyKCVlZGkpCisJbW92bCAlZWF4LDM2KCVlZGkpCisJbW92bCAkMCw0MCglZWRpKQorCXRlc3RsICVlZHgsJWVkeAorCWplIC5MNDgwCisJbW92bCAlZXNpLCVlYXgKKwltb3ZsICVlc2ksLTI4KCVlYnApCisJc2hybCAkMzEsJWVheAorCWFkZGwgJWVheCwlZXNpCisJbW92bCAtOCglZWJwKSwlZWF4CisJc2hybCAkMzEsJWVheAorCWFkZGwgLTgoJWVicCksJWVheAorCW1vdmwgLTEyKCVlYnApLCVlZHgKKwlzYXJsICQxLCVlYXgKKwltb3ZsICVlZHgsLTI0KCVlYnApCisJbmVnbCAtMjgoJWVicCkKKwltb3ZsICVlc2ksLTE2KCVlYnApCisJbW92bCAlZWF4LC0yMCglZWJwKQorCS5wMmFsaWduIDQsLDcKKy5MNDgxOgorCW1vdmwgLTI4KCVlYnApLCVlYXgKKwlhZGRsICVlYXgsLTI0KCVlYnApCisJZGVjbCAtOCglZWJwKQorCW1vdmwgMTIoJWVicCksJWVzaQorCXRlc3RsICVlc2ksJWVzaQorCWplIC5MNDc5CisJbW92bCAtOCglZWJwKSwlZWF4CisJc3VibCAtMjAoJWVicCksJWVheAorCW1vdmwgJWVheCwtNCglZWJwKQorCWZpbGRsIC00KCVlYnApCisJbW92bCAlZXNpLC00KCVlYnApCisJbW92bCAtMjQoJWVicCksJWVkeAorCWxlYWwgKCVlZHgsJWVzaSksJWVheAorCW1vdmwgLTE2KCVlYnApLCVlYngKKwlmaWxkbCAxNiglZWJwKQorCWxlYWwgKCVlYXgsJWVheCwyKSwlZWF4CisJc2FybCAkMSwlZWJ4CisJbGVhbCAwKCwlZWF4LDQpLCVlY3gKKwlmbXVscCAlc3QsJXN0KDEpCisJZmlsZGwgMjAoJWVicCkKKwlmZGl2cnAgJXN0LCVzdCgxKQorCWZpbGRsIDgoJWVicCkKKwlmaWxkbCAtNCglZWJwKQorCWptcCAuTDQ4NAorLkw0ODc6CisJZnhjaCAlc3QoMikKKwkucDJhbGlnbiA0LCw3CisuTDQ4NDoKKwlkZWNsICVlc2kKKwltb3ZsICVlc2ksJWVheAorCW1vdmwgKCVlZGkpLCVlZHgKKwlzdWJsICVlYngsJWVheAorCW1vdmwgJWVheCwtNCglZWJwKQorCWZpbGRsIC00KCVlYnApCisJYWRkbCAkLTEyLCVlY3gKKwlmbXVsICVzdCgyKSwlc3QKKwlmZGl2ICVzdCgxKSwlc3QKKwlmc3RwcyAoJWVkeCwlZWN4KQorCWZ4Y2ggJXN0KDIpCisJbW92bCAoJWVkaSksJWVheAorCW1vdmwgJDAsNCglZWF4LCVlY3gpCisJbW92bCAoJWVkaSksJWVheAorCWZzdHMgOCglZWF4LCVlY3gpCisJdGVzdGwgJWVzaSwlZXNpCisJam5lIC5MNDg3CisJZnN0cCAlc3QoMCkKKwlmc3RwICVzdCgwKQorCWZzdHAgJXN0KDApCisuTDQ3OToKKwljbXBsICQwLC04KCVlYnApCisJam5lIC5MNDgxCisuTDQ4MDoKKwlsZWFsIC01NiglZWJwKSwlZXNwCisJcG9wbCAlZWJ4CisJbW92bCAlZWRpLCVlYXgKKwlwb3BsICVlc2kKKwlwb3BsICVlZGkKKwlsZWF2ZQorCXJldAorLkxmZTE6CisJLnNpemUJIGdyaWQzZF9uZXcsLkxmZTEtZ3JpZDNkX25ldworLnNlY3Rpb24JLnJvZGF0YQorCS5hbGlnbiA4CisuTEM0ODoKKwkubG9uZyAweDAsMHgzZmUwMDAwMAorCS5hbGlnbiA0CisuTEM0OToKKwkubG9uZyAweDNmMTk5OTlhCisJLmFsaWduIDQKKy5MQzUwOgorCS5sb25nIDB4M2VlM2Q3MGEKKy50ZXh0CisJLmFsaWduIDQKKy5nbG9ibCBncmlkM2RfdXBkYXRlCisJLnR5cGUJIGdyaWQzZF91cGRhdGUsQGZ1bmN0aW9uCitncmlkM2RfdXBkYXRlOgorCXB1c2hsICVlYnAKKwltb3ZsICVlc3AsJWVicAorCXN1YmwgJDMyLCVlc3AKKwlwdXNobCAlZXNpCisJcHVzaGwgJWVieAorCWZsZHMgMTIoJWVicCkKKwltb3ZsIDgoJWVicCksJWVieAorCW1vdmwgMTYoJWVicCksJWVjeAorCWZsZCAlc3QoMCkKKyNBUFAKKwlmc2luCisjTk9fQVBQCisJZnN0cHMgLTQoJWVicCkKKwlmbGRzIC00KCVlYnApCisJZnhjaCAlc3QoMSkKKyNBUFAKKwlmY29zCisjTk9fQVBQCisJZnN0cHMgLTQoJWVicCkKKwlmbGRzIC00KCVlYnApCisJY21wbCAkMCw0MCglZWJ4KQorCWpuZSAuTDUxOQorCXRlc3RsICVlY3gsJWVjeAorCWplIC5MNTIwCisJeG9ybCAlZXNpLCVlc2kKKwljbXBsIDI0KCVlYngpLCVlc2kKKwlqZ2UgLkw1MjAKKwlmbGRsIC5MQzQ4CisJeG9ybCAlZWR4LCVlZHgKKwkucDJhbGlnbiA0LCw3CisuTDUyNDoKKwltb3ZsICglZWJ4KSwlZWF4CisJZmxkICVzdCgwKQorCWZsZCAlc3QoMSkKKwlmeGNoICVzdCgxKQorCWZtdWxzIDQoJWVheCwlZWR4KQorCWZ4Y2ggJXN0KDEpCisJZm11bHMgKCVlY3gsJWVzaSw0KQorCWZhZGRwICVzdCwlc3QoMSkKKwlpbmNsICVlc2kKKwlmc3RwcyA0KCVlYXgsJWVkeCkKKwlhZGRsICQxMiwlZWR4CisJY21wbCAyNCglZWJ4KSwlZXNpCisJamwgLkw1MjQKKwlmc3RwICVzdCgwKQorLkw1MjA6CisJbW92bCAyNCglZWJ4KSwlZXNpCisJY21wbCA4KCVlYngpLCVlc2kKKwlqZ2UgLkw1MTkKKwlsZWFsICglZXNpLCVlc2ksMiksJWVheAorCWZsZHMgLkxDNDkKKwlmbGRzIC5MQzUwCisJbGVhbCAwKCwlZWF4LDQpLCVlY3gKKwkucDJhbGlnbiA0LCw3CisuTDUyOToKKwltb3ZsICglZWJ4KSwlZWF4CisJZmxkcyA0KCVlYXgsJWVjeCkKKwlmbXVsICVzdCgyKSwlc3QKKwlmc3RwcyA0KCVlYXgsJWVjeCkKKwltb3ZsICVlc2ksJWVheAorCXN1YmwgMjQoJWVieCksJWVheAorCW1vdmwgKCVlYngpLCVlZHgKKwlsZWFsICglZWF4LCVlYXgsMiksJWVheAorCWZsZHMgNCglZWR4LCVlYXgsNCkKKwlmbXVsICVzdCgxKSwlc3QKKwlmYWRkcyA0KCVlZHgsJWVjeCkKKwlpbmNsICVlc2kKKwlmc3RwcyA0KCVlZHgsJWVjeCkKKwlhZGRsICQxMiwlZWN4CisJY21wbCA4KCVlYngpLCVlc2kKKwlqbCAuTDUyOQorCWZzdHAgJXN0KDApCisJZnN0cCAlc3QoMCkKKy5MNTE5OgorCXhvcmwgJWVzaSwlZXNpCisJY21wbCA4KCVlYngpLCVlc2kKKwlqZ2UgLkw1MzYKKwl4b3JsICVlY3gsJWVjeAorCS5wMmFsaWduIDQsLDcKKy5MNTM0OgorCW1vdmwgKCVlYngpLCVlYXgKKwlmbGRzICglZWF4LCVlY3gpCisJZmxkcyA4KCVlYXgsJWVjeCkKKwlmbXVsICVzdCgyKSwlc3QKKwlmeGNoICVzdCgxKQorCWZtdWwgJXN0KDMpLCVzdAorCWZzdWJwICVzdCwlc3QoMSkKKwltb3ZsIDQoJWVieCksJWVkeAorCWluY2wgJWVzaQorCWZzdHBzICglZWR4LCVlY3gpCisJbW92bCAoJWVieCksJWVheAorCWZsZHMgKCVlYXgsJWVjeCkKKwlmbGRzIDgoJWVheCwlZWN4KQorCWZ4Y2ggJXN0KDEpCisJZm11bCAlc3QoMiksJXN0CisJZnhjaCAlc3QoMSkKKwlmbXVsICVzdCgzKSwlc3QKKwlmYWRkcCAlc3QsJXN0KDEpCisJbW92bCA0KCVlYngpLCVlZHgKKwlmc3RwcyA4KCVlZHgsJWVjeCkKKwltb3ZsICglZWJ4KSwlZWF4CisJZmxkcyA0KCVlYXgsJWVjeCkKKwltb3ZsIDQoJWVieCksJWVkeAorCWZzdHBzIDQoJWVkeCwlZWN4KQorCW1vdmwgNCglZWJ4KSwlZWF4CisJZmxkcyAoJWVheCwlZWN4KQorCWZhZGRzIDEyKCVlYngpCisJZnN0cHMgKCVlYXgsJWVjeCkKKwltb3ZsIDQoJWVieCksJWVheAorCWZsZHMgNCglZWF4LCVlY3gpCisJZmFkZHMgMTYoJWVieCkKKwlmc3RwcyA0KCVlYXgsJWVjeCkKKwltb3ZsIDQoJWVieCksJWVheAorCWZsZHMgOCglZWF4LCVlY3gpCisJZmFkZHMgMjAoJWVieCkKKwlmc3RwcyA4KCVlYXgsJWVjeCkKKwlhZGRsICQxMiwlZWN4CisJY21wbCA4KCVlYngpLCVlc2kKKwlqbCAuTDUzNAorLkw1MzY6CisJZnN0cCAlc3QoMCkKKwlmc3RwICVzdCgwKQorCXBvcGwgJWVieAorCXBvcGwgJWVzaQorCWxlYXZlCisJcmV0CisuTGZlMjoKKwkuc2l6ZQkgZ3JpZDNkX3VwZGF0ZSwuTGZlMi1ncmlkM2RfdXBkYXRlCisuc2VjdGlvbgkucm9kYXRhCisJLmFsaWduIDQKKy5MQzUxOgorCS5sb25nIDB4NDAwMDAwMDAKKwkuYWxpZ24gOAorLkxDNTI6CisJLmxvbmcgMHgwLDB4NDIzODAwMDAKKy50ZXh0CisJLmFsaWduIDQKKy5nbG9ibCBzdXJmM2RfZHJhdworCS50eXBlCSBzdXJmM2RfZHJhdyxAZnVuY3Rpb24KK3N1cmYzZF9kcmF3OgorCXB1c2hsICVlYnAKKwltb3ZsICVlc3AsJWVicAorCXN1YmwgJDYwLCVlc3AKKwlwdXNobCAlZWRpCisJcHVzaGwgJWVzaQorCXB1c2hsICVlYngKKwltb3ZsICQwLC0yMCglZWJwKQorCW1vdmwgLTIwKCVlYnApLCVlZHgKKwltb3ZsIDgoJWVicCksJWVheAorCWNtcGwgOCglZWF4KSwlZWR4CisJamdlIC5MNDkzCisJZmxkbCAuTEM1MgorCWZsZHMgLkxDNTEKKwl4b3JsICVlZGksJWVkaQorCS5wMmFsaWduIDQsLDcKKy5MNDk1OgorCW1vdmwgOCglZWJwKSwlZWF4CisJbW92bCA0KCVlYXgpLCVlYXgKKwltb3ZsICVlYXgsLTM2KCVlYnApCisJZmNvbXMgOCglZWF4LCVlZGkpCisJZm5zdHN3ICVheAorCWFuZGIgJDY5LCVhaAorCWNtcGIgJDEsJWFoCisJam5lIC5MNDk2CisJZmlsZGwgMTYoJWVicCkKKwltb3ZsIC0zNiglZWJwKSwlZWR4CisJZmxkICVzdCgwKQorCWZtdWxzICglZWR4LCVlZGkpCisJZmRpdnMgOCglZWR4LCVlZGkpCisJZmxkICVzdCgzKQorCWZhZGRwICVzdCwlc3QoMSkKKwlmc3RwbCAtMzIoJWVicCkKKwltb3ZsIC0zMiglZWJwKSwlZWF4CisJbW92bCAtMjgoJWVicCksJWVkeAorCW1vdmwgJWVheCwtNDAoJWVicCkKKwlzYXJsICQxNiwtNDAoJWVicCkKKwltb3ZsIC0zNiglZWJwKSwlZWR4CisJZm11bHMgNCglZWR4LCVlZGkpCisJZmRpdnMgOCglZWR4LCVlZGkpCisJbW92bCAtNDAoJWVicCksJWVjeAorCWZsZCAlc3QoMikKKwlmYWRkcCAlc3QsJXN0KDEpCisJZnN0cGwgLTMyKCVlYnApCisJbW92bCAtMzIoJWVicCksJWVheAorCW1vdmwgLTI4KCVlYnApLCVlZHgKKwltb3ZsICVlYXgsLTQ0KCVlYnApCisJbW92bCAyOCglZWJwKSwlZWF4CisJc2FybCAkMSwlZWF4CisJYWRkbCAlZWF4LCVlY3gKKwltb3ZsIDMyKCVlYnApLCVlYXgKKwlzYXJsICQxNiwtNDQoJWVicCkKKwlzYXJsICQxLCVlYXgKKwltb3ZsICVlY3gsJWVieAorCXN1YmwgLTQ0KCVlYnApLCVlYXgKKwltb3ZsICVlYXgsJWVzaQorCWNtcGwgMjgoJWVicCksJWVieAorCWpnZSAuTDQ5NgorCXRlc3RsICVlY3gsJWVjeAorCWpsIC5MNDk2CisJY21wbCAzMiglZWJwKSwlZXNpCisJamdlIC5MNDk2CisJdGVzdGwgJWVheCwlZWF4CisJamdlIC5MNDk5CisuTDQ5NjoKKwl4b3JsICVlc2ksJWVzaQorCXhvcmwgJWVieCwlZWJ4CisuTDQ5OToKKwltb3ZsIDIwKCVlYnApLCVlYXgKKwltb3ZsICVlYngsJWVkeAorCWxlYWwgKCVlYXgsJWVkeCw0KSwlZWR4CisJbW92bCAyOCglZWJwKSwlZWF4CisJaW11bGwgJWVzaSwlZWF4CisJbGVhbCAoJWVkeCwlZWF4LDQpLCVlYXgKKwl0ZXN0bCAlZWJ4LCVlYngKKwlqZSAuTDQ5NAorCXRlc3RsICVlc2ksJWVzaQorCWplIC5MNDk0CisjQVBQCisJbW92ZCAoJWVheCksICVtbTAKKwlwYWRkdXNiIDEyKCVlYnApLCAlbW0wCisJbW92ZCAlbW0wLCAoJWVheCkKKyNOT19BUFAKKy5MNDk0OgorCWluY2wgLTIwKCVlYnApCisJYWRkbCAkMTIsJWVkaQorCW1vdmwgLTIwKCVlYnApLCVlYXgKKwltb3ZsIDgoJWVicCksJWVkeAorCWNtcGwgOCglZWR4KSwlZWF4CisJamwgLkw0OTUKKwlmc3RwICVzdCgwKQorCWZzdHAgJXN0KDApCisuTDQ5MzoKKwlwb3BsICVlYngKKwlwb3BsICVlc2kKKwlwb3BsICVlZGkKKwlsZWF2ZQorCXJldAorLkxmZTM6CisJLnNpemUJIHN1cmYzZF9kcmF3LC5MZmUzLXN1cmYzZF9kcmF3CisJLmFsaWduIDQKKy5nbG9ibCBzdXJmM2Rfcm90YXRlCisJLnR5cGUJIHN1cmYzZF9yb3RhdGUsQGZ1bmN0aW9uCitzdXJmM2Rfcm90YXRlOgorCXB1c2hsICVlYnAKKwltb3ZsICVlc3AsJWVicAorCXN1YmwgJDMyLCVlc3AKKwlwdXNobCAlZXNpCisJcHVzaGwgJWVieAorCWZsZHMgMTIoJWVicCkKKwltb3ZsIDgoJWVicCksJWVieAorCWZsZCAlc3QoMCkKKyNBUFAKKwlmc2luCisjTk9fQVBQCisJZnN0cHMgLTQoJWVicCkKKwlmbGRzIC00KCVlYnApCisJZnhjaCAlc3QoMSkKKyNBUFAKKwlmY29zCisjTk9fQVBQCisJZnN0cHMgLTQoJWVicCkKKwl4b3JsICVlc2ksJWVzaQorCWZsZHMgLTQoJWVicCkKKwljbXBsIDgoJWVieCksJWVzaQorCWpnZSAuTDUzNworCXhvcmwgJWVjeCwlZWN4CisJLnAyYWxpZ24gNCwsNworLkw1MDg6CisJbW92bCAoJWVieCksJWVheAorCWZsZHMgKCVlYXgsJWVjeCkKKwlmbGRzIDgoJWVheCwlZWN4KQorCWZtdWwgJXN0KDIpLCVzdAorCWZ4Y2ggJXN0KDEpCisJZm11bCAlc3QoMyksJXN0CisJZnN1YnAgJXN0LCVzdCgxKQorCW1vdmwgNCglZWJ4KSwlZWR4CisJaW5jbCAlZXNpCisJZnN0cHMgKCVlZHgsJWVjeCkKKwltb3ZsICglZWJ4KSwlZWF4CisJZmxkcyAoJWVheCwlZWN4KQorCWZsZHMgOCglZWF4LCVlY3gpCisJZnhjaCAlc3QoMSkKKwlmbXVsICVzdCgyKSwlc3QKKwlmeGNoICVzdCgxKQorCWZtdWwgJXN0KDMpLCVzdAorCWZhZGRwICVzdCwlc3QoMSkKKwltb3ZsIDQoJWVieCksJWVkeAorCWZzdHBzIDgoJWVkeCwlZWN4KQorCW1vdmwgKCVlYngpLCVlYXgKKwlmbGRzIDQoJWVheCwlZWN4KQorCW1vdmwgNCglZWJ4KSwlZWR4CisJZnN0cHMgNCglZWR4LCVlY3gpCisJYWRkbCAkMTIsJWVjeAorCWNtcGwgOCglZWJ4KSwlZXNpCisJamwgLkw1MDgKKy5MNTM3OgorCWZzdHAgJXN0KDApCisJZnN0cCAlc3QoMCkKKwlwb3BsICVlYngKKwlwb3BsICVlc2kKKwlsZWF2ZQorCXJldAorLkxmZTQ6CisJLnNpemUJIHN1cmYzZF9yb3RhdGUsLkxmZTQtc3VyZjNkX3JvdGF0ZQorCS5hbGlnbiA0CisuZ2xvYmwgc3VyZjNkX3RyYW5zbGF0ZQorCS50eXBlCSBzdXJmM2RfdHJhbnNsYXRlLEBmdW5jdGlvbgorc3VyZjNkX3RyYW5zbGF0ZToKKwlwdXNobCAlZWJwCisJbW92bCAlZXNwLCVlYnAKKwlwdXNobCAlZWJ4CisJbW92bCA4KCVlYnApLCVlY3gKKwl4b3JsICVlYngsJWVieAorCWNtcGwgOCglZWN4KSwlZWJ4CisJamdlIC5MNTEyCisJeG9ybCAlZWR4LCVlZHgKKwkucDJhbGlnbiA0LCw3CisuTDUxNDoKKwltb3ZsIDQoJWVjeCksJWVheAorCWZsZHMgKCVlYXgsJWVkeCkKKwlmYWRkcyAxMiglZWN4KQorCWluY2wgJWVieAorCWZzdHBzICglZWF4LCVlZHgpCisJbW92bCA0KCVlY3gpLCVlYXgKKwlmbGRzIDQoJWVheCwlZWR4KQorCWZhZGRzIDE2KCVlY3gpCisJZnN0cHMgNCglZWF4LCVlZHgpCisJbW92bCA0KCVlY3gpLCVlYXgKKwlmbGRzIDgoJWVheCwlZWR4KQorCWZhZGRzIDIwKCVlY3gpCisJZnN0cHMgOCglZWF4LCVlZHgpCisJYWRkbCAkMTIsJWVkeAorCWNtcGwgOCglZWN4KSwlZWJ4CisJamwgLkw1MTQKKy5MNTEyOgorCXBvcGwgJWVieAorCWxlYXZlCisJcmV0CisuTGZlNToKKwkuc2l6ZQkgc3VyZjNkX3RyYW5zbGF0ZSwuTGZlNS1zdXJmM2RfdHJhbnNsYXRlCisJLmlkZW50CSJHQ0M6IChHTlUpIDIuOTUuMyAxOTk5MTAzMCAocHJlcmVsZWFzZSkiCmRpZmYgLS1naXQgYS9nc3QvZ29vbS90ZW50YWNsZTNkLmMgYi9nc3QvZ29vbS90ZW50YWNsZTNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyZmZiYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL3RlbnRhY2xlM2QuYwpAQCAtMCwwICsxLDM1OCBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAidjNkLmgiCisjaW5jbHVkZSAic3VyZjNkLmgiCisjaW5jbHVkZSAiZ29vbV90b29scy5oIgorI2luY2x1ZGUgImdvb21fY29uZmlnLmgiCisjaW5jbHVkZSAiZ29vbV9wbHVnaW5faW5mby5oIgorI2luY2x1ZGUgInRlbnRhY2xlM2QuaCIKKworI2RlZmluZSBEIDI1Ni4wZgorCisjZGVmaW5lIG5iZ3JpZCA2CisjZGVmaW5lIGRlZmluaXRpb254IDE1CisjZGVmaW5lIGRlZmluaXRpb256IDQ1CisKK3R5cGVkZWYgc3RydWN0IF9URU5UQUNMRV9GWF9EQVRBCit7CisgIFBsdWdpblBhcmFtIGVuYWJsZWRfYnA7CisgIFBsdWdpblBhcmFtZXRlcnMgcGFyYW1zOworCisgIGZsb2F0IGN5Y2xlOworICBncmlkM2QgKmdyaWxsZVtuYmdyaWRdOworICBmbG9hdCAqdmFsczsKKworI2RlZmluZSBOQl9URU5UQUNMRV9DT0xPUlMgNAorICBpbnQgY29sb3JzW05CX1RFTlRBQ0xFX0NPTE9SU107CisKKyAgaW50IGNvbDsKKyAgaW50IGRzdGNvbDsKKyAgZmxvYXQgbGlnOworICBmbG9hdCBsaWdzOworCisgIC8qIHN0YXRpY3MgZnJvbSBwcmV0dHlfbW92ZSAqLworICBmbG9hdCBkaXN0dDsKKyAgZmxvYXQgZGlzdHQyOworICBmbG9hdCByb3Q7ICAgICAgICAgICAgICAgICAgICAvKiBlbnRyZSAwIGV0IDIgKiBHX1BJICovCisgIGludCBoYXBwZW5zOworICBpbnQgcm90YXRpb247CisgIGludCBsb2NrOworfSBUZW50YWNsZUZYRGF0YTsKKworc3RhdGljIHZvaWQgdGVudGFjbGVfbmV3IChUZW50YWNsZUZYRGF0YSAqIGRhdGEpOworc3RhdGljIHZvaWQgdGVudGFjbGVfdXBkYXRlIChQbHVnaW5JbmZvICogZ29vbUluZm8sIFBpeGVsICogYnVmLCBQaXhlbCAqIGJhY2ssCisgICAgaW50IFcsIGludCBILCBzaG9ydFsyXVs1MTJdLCBmbG9hdCwgaW50IGRyYXdpdCwgVGVudGFjbGVGWERhdGEgKiBkYXRhKTsKK3N0YXRpYyB2b2lkIHRlbnRhY2xlX2ZyZWUgKFRlbnRhY2xlRlhEYXRhICogZGF0YSk7CisKKy8qIAorICogVmlzdWFsRlggd3JhcHBlciBmb3IgdGhlIHRlbnRhY2xlcworICovCisKK3N0YXRpYyB2b2lkCit0ZW50YWNsZV9meF9pbml0IChWaXN1YWxGWCAqIF90aGlzLCBQbHVnaW5JbmZvICogaW5mbykKK3sKKworICBUZW50YWNsZUZYRGF0YSAqZGF0YSA9IChUZW50YWNsZUZYRGF0YSAqKSBtYWxsb2MgKHNpemVvZiAoVGVudGFjbGVGWERhdGEpKTsKKworICBzZWN1cmVfYl9wYXJhbSAoJmRhdGEtPmVuYWJsZWRfYnAsICJFbmFibGVkIiwgMSk7CisgIHBsdWdpbl9wYXJhbWV0ZXJzICgmZGF0YS0+cGFyYW1zLCAiM0QgVGVudGFjbGVzIiwgMSk7CisgIGRhdGEtPnBhcmFtcy5wYXJhbXNbMF0gPSAmZGF0YS0+ZW5hYmxlZF9icDsKKworICBkYXRhLT5jeWNsZSA9IDAuMGY7CisgIGRhdGEtPmNvbCA9CisgICAgICAoMHgyOCA8PCAoUk9VR0UgKiA4KSkgfCAoMHgyYyA8PCAoVkVSVCAqIDgpKSB8ICgweDVmIDw8IChCTEVVICogOCkpOworICBkYXRhLT5kc3Rjb2wgPSAwOworICBkYXRhLT5saWcgPSAxLjE1ZjsKKyAgZGF0YS0+bGlncyA9IDAuMWY7CisKKyAgZGF0YS0+ZGlzdHQgPSAxMC4wZjsKKyAgZGF0YS0+ZGlzdHQyID0gMC4wZjsKKyAgZGF0YS0+cm90ID0gMC4wZjsgICAgICAgICAgICAgLyogZW50cmUgMCBldCAyICogR19QSSAqLworICBkYXRhLT5oYXBwZW5zID0gMDsKKworICBkYXRhLT5yb3RhdGlvbiA9IDA7CisgIGRhdGEtPmxvY2sgPSAwOworICBkYXRhLT5jb2xvcnNbMF0gPQorICAgICAgKDB4MTggPDwgKFJPVUdFICogOCkpIHwgKDB4NGMgPDwgKFZFUlQgKiA4KSkgfCAoMHgyZiA8PCAoQkxFVSAqIDgpKTsKKyAgZGF0YS0+Y29sb3JzWzFdID0KKyAgICAgICgweDQ4IDw8IChST1VHRSAqIDgpKSB8ICgweDJjIDw8IChWRVJUICogOCkpIHwgKDB4NmYgPDwgKEJMRVUgKiA4KSk7CisgIGRhdGEtPmNvbG9yc1syXSA9CisgICAgICAoMHg1OCA8PCAoUk9VR0UgKiA4KSkgfCAoMHgzYyA8PCAoVkVSVCAqIDgpKSB8ICgweDBmIDw8IChCTEVVICogOCkpOworICBkYXRhLT5jb2xvcnNbM10gPQorICAgICAgKDB4ODcgPDwgKFJPVUdFICogOCkpIHwgKDB4NTUgPDwgKFZFUlQgKiA4KSkgfCAoMHg3NCA8PCAoQkxFVSAqIDgpKTsKKyAgdGVudGFjbGVfbmV3IChkYXRhKTsKKworICBfdGhpcy0+cGFyYW1zID0gJmRhdGEtPnBhcmFtczsKKyAgX3RoaXMtPmZ4X2RhdGEgPSAodm9pZCAqKSBkYXRhOworfQorCitzdGF0aWMgdm9pZAordGVudGFjbGVfZnhfYXBwbHkgKFZpc3VhbEZYICogX3RoaXMsIFBpeGVsICogc3JjLCBQaXhlbCAqIGRlc3QsCisgICAgUGx1Z2luSW5mbyAqIGdvb21JbmZvKQoreworICBUZW50YWNsZUZYRGF0YSAqZGF0YSA9IChUZW50YWNsZUZYRGF0YSAqKSBfdGhpcy0+ZnhfZGF0YTsKKworICBpZiAoQlZBTCAoZGF0YS0+ZW5hYmxlZF9icCkpIHsKKyAgICB0ZW50YWNsZV91cGRhdGUgKGdvb21JbmZvLCBkZXN0LCBzcmMsIGdvb21JbmZvLT5zY3JlZW4ud2lkdGgsCisgICAgICAgIGdvb21JbmZvLT5zY3JlZW4uaGVpZ2h0LCBnb29tSW5mby0+c291bmQuc2FtcGxlcywKKyAgICAgICAgKGZsb2F0KSBnb29tSW5mby0+c291bmQuYWNjZWx2YXIsCisgICAgICAgIGdvb21JbmZvLT5jdXJHU3RhdGUtPmRyYXdUZW50YWNsZSwgZGF0YSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RlbnRhY2xlX2Z4X2ZyZWUgKFZpc3VhbEZYICogX3RoaXMpCit7CisgIHRlbnRhY2xlX2ZyZWUgKChUZW50YWNsZUZYRGF0YSAqKSBfdGhpcy0+ZnhfZGF0YSk7CisgIGZyZWUgKF90aGlzLT5meF9kYXRhKTsKK30KKwordm9pZAordGVudGFjbGVfZnhfY3JlYXRlIChWaXN1YWxGWCAqIGZ4KQoreworICBmeC0+aW5pdCA9IHRlbnRhY2xlX2Z4X2luaXQ7CisgIGZ4LT5hcHBseSA9IHRlbnRhY2xlX2Z4X2FwcGx5OworICBmeC0+ZnJlZSA9IHRlbnRhY2xlX2Z4X2ZyZWU7CisgIGZ4LT5meF9kYXRhID0gTlVMTDsKKyAgZngtPnBhcmFtcyA9IE5VTEw7Cit9CisKKy8qIC0tLS0tICovCisKK3N0YXRpYyB2b2lkCit0ZW50YWNsZV9mcmVlIChUZW50YWNsZUZYRGF0YSAqIGRhdGEpCit7CisgIGludCB0bXA7CisKKyAgLyogRlJFRSBHUklEICovCisgIGZvciAodG1wID0gMDsgdG1wIDwgbmJncmlkOyB0bXArKykKKyAgICBncmlkM2RfZnJlZSAoZGF0YS0+Z3JpbGxlW3RtcF0pOworICBmcmVlIChkYXRhLT52YWxzKTsKKworICBnb29tX3BsdWdpbl9wYXJhbWV0ZXJzX2ZyZWUgKCZkYXRhLT5wYXJhbXMpOworfQorCitzdGF0aWMgdm9pZAordGVudGFjbGVfbmV3IChUZW50YWNsZUZYRGF0YSAqIGRhdGEpCit7CisgIGludCB0bXA7CisKKyAgdjNkIGNlbnRlciA9IHsgMCwgLTE3LjAsIDAgfTsKKyAgZGF0YS0+dmFscyA9IChmbG9hdCAqKSBtYWxsb2MgKChkZWZpbml0aW9ueCArIDIwKSAqIHNpemVvZiAoZmxvYXQpKTsKKworICBmb3IgKHRtcCA9IDA7IHRtcCA8IG5iZ3JpZDsgdG1wKyspIHsKKyAgICBpbnQgeCwgejsKKworICAgIHogPSA0NSArIHJhbmQgKCkgJSAzMDsKKyAgICB4ID0gODUgKyByYW5kICgpICUgNTsKKyAgICBjZW50ZXIueiA9IHo7CisgICAgZGF0YS0+Z3JpbGxlW3RtcF0gPQorICAgICAgICBncmlkM2RfbmV3ICh4LCBkZWZpbml0aW9ueCwgeiwgZGVmaW5pdGlvbnogKyByYW5kICgpICUgMTAsIGNlbnRlcik7CisgICAgY2VudGVyLnkgKz0gODsKKyAgfQorfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIKK2xpZ2h0ZW4gKHVuc2lnbmVkIGNoYXIgdmFsdWUsIGZsb2F0IHBvd2VyKQoreworICBpbnQgdmFsID0gdmFsdWU7CisgIGZsb2F0IHQgPSAoZmxvYXQpIHZhbCAqIGxvZzEwIChwb3dlcikgLyAyLjA7CisKKyAgaWYgKHQgPiAwKSB7CisgICAgdmFsID0gKGludCkgdDsgICAgICAgICAgICAgIC8qICgzMi4wZiAqIGxvZyAodCkpOyAqLworICAgIGlmICh2YWwgPiAyNTUpCisgICAgICB2YWwgPSAyNTU7CisgICAgaWYgKHZhbCA8IDApCisgICAgICB2YWwgPSAwOworICAgIHJldHVybiB2YWw7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2xpZ2h0ZW5jb2xvciAoaW50ICpjb2wsIGZsb2F0IHBvd2VyKQoreworICB1bnNpZ25lZCBjaGFyICpjb2xvcjsKKworICBjb2xvciA9ICh1bnNpZ25lZCBjaGFyICopIGNvbDsKKyAgKmNvbG9yID0gbGlnaHRlbiAoKmNvbG9yLCBwb3dlcik7CisgIGNvbG9yKys7CisgICpjb2xvciA9IGxpZ2h0ZW4gKCpjb2xvciwgcG93ZXIpOworICBjb2xvcisrOworICAqY29sb3IgPSBsaWdodGVuICgqY29sb3IsIHBvd2VyKTsKKyAgY29sb3IrKzsKKyAgKmNvbG9yID0gbGlnaHRlbiAoKmNvbG9yLCBwb3dlcik7Cit9CisKKy8qIHJldG91cm5lIHg+PnMgLCBlbiB0ZXN0YW50IGxlIHNpZ25lIGRlIHggKi8KKyNkZWZpbmUgU2hpZnRSaWdodChfeCxfcykgKChfeDwwKSA/IC0oLV94Pj5fcykgOiAoX3g+Pl9zKSkKKworc3RhdGljIGludAorZXZvbHV0ZWNvbG9yICh1bnNpZ25lZCBpbnQgc3JjLCB1bnNpZ25lZCBpbnQgZGVzdCwKKyAgICB1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGluY3IpCit7CisKKyAgaW50IGNvbG9yID0gc3JjICYgKH5tYXNrKTsKKworICBzcmMgJj0gbWFzazsKKyAgZGVzdCAmPSBtYXNrOworCisgIGlmICgoc3JjICE9IG1hc2spCisgICAgICAmJiAoc3JjIDwgZGVzdCkpCisgICAgc3JjICs9IGluY3I7CisKKyAgaWYgKHNyYyA+IGRlc3QpCisgICAgc3JjIC09IGluY3I7CisgIHJldHVybiAoc3JjICYgbWFzaykgfCBjb2xvcjsKK30KKworc3RhdGljIHZvaWQKK3ByZXR0eV9tb3ZlIChQbHVnaW5JbmZvICogZ29vbUluZm8sIGZsb2F0IGN5Y2xlLCBmbG9hdCAqZGlzdCwgZmxvYXQgKmRpc3QyLAorICAgIGZsb2F0ICpyb3RhbmdsZSwgVGVudGFjbGVGWERhdGEgKiBmeF9kYXRhKQoreworCisgIGZsb2F0IHRtcDsKKworICAvKiBtYW55IG1hZ2ljIG51bWJlcnMgaGVyZS4uLiBJIGRvbid0IHJlYWxseSBsaWtlIHRoYXQuICovCisgIGlmIChmeF9kYXRhLT5oYXBwZW5zKQorICAgIGZ4X2RhdGEtPmhhcHBlbnMgLT0gMTsKKyAgZWxzZSBpZiAoZnhfZGF0YS0+bG9jayA9PSAwKSB7CisgICAgZnhfZGF0YS0+aGFwcGVucyA9CisgICAgICAgIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLAorICAgICAgICAyMDApID8gMCA6IDEwMCArIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCA2MCk7CisgICAgZnhfZGF0YS0+bG9jayA9IGZ4X2RhdGEtPmhhcHBlbnMgKiAzIC8gMjsKKyAgfSBlbHNlCisgICAgZnhfZGF0YS0+bG9jay0tOworCisgIHRtcCA9IGZ4X2RhdGEtPmhhcHBlbnMgPyA4LjBmIDogMDsKKyAgKmRpc3QyID0gZnhfZGF0YS0+ZGlzdHQyID0gKHRtcCArIDE1LjBmICogZnhfZGF0YS0+ZGlzdHQyKSAvIDE2LjBmOworCisgIHRtcCA9IDMwICsgRCAtIDkwLjBmICogKDEuMGYgKyBzaW4gKGN5Y2xlICogMTkgLyAyMCkpOworICBpZiAoZnhfZGF0YS0+aGFwcGVucykKKyAgICB0bXAgKj0gMC42ZjsKKworICAqZGlzdCA9IGZ4X2RhdGEtPmRpc3R0ID0gKHRtcCArIDMuMGYgKiBmeF9kYXRhLT5kaXN0dCkgLyA0LjBmOworCisgIGlmICghZnhfZGF0YS0+aGFwcGVucykgeworICAgIHRtcCA9IEdfUEkgKiBzaW4gKGN5Y2xlKSAvIDMyICsgMyAqIEdfUEkgLyAyOworICB9IGVsc2UgeworICAgIGZ4X2RhdGEtPnJvdGF0aW9uID0KKyAgICAgICAgZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sCisgICAgICAgIDUwMCkgPyBmeF9kYXRhLT5yb3RhdGlvbiA6IGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAyKTsKKyAgICBpZiAoZnhfZGF0YS0+cm90YXRpb24pCisgICAgICBjeWNsZSAqPSAyLjBmICogR19QSTsKKyAgICBlbHNlCisgICAgICBjeWNsZSAqPSAtMS4wZiAqIEdfUEk7CisgICAgdG1wID0gY3ljbGUgLSAoR19QSSAqIDIuMCkgKiBmbG9vciAoY3ljbGUgLyAoR19QSSAqIDIuMCkpOworICB9CisKKyAgaWYgKGZhYnMgKHRtcCAtIGZ4X2RhdGEtPnJvdCkgPiBmYWJzICh0bXAgLSAoZnhfZGF0YS0+cm90ICsgMi4wICogR19QSSkpKSB7CisgICAgZnhfZGF0YS0+cm90ID0gKHRtcCArIDE1LjBmICogKGZ4X2RhdGEtPnJvdCArIDIgKiBHX1BJKSkgLyAxNi4wZjsKKyAgICBpZiAoZnhfZGF0YS0+cm90ID4gMi4wICogR19QSSkKKyAgICAgIGZ4X2RhdGEtPnJvdCAtPSAyLjAgKiBHX1BJOworICAgICpyb3RhbmdsZSA9IGZ4X2RhdGEtPnJvdDsKKyAgfSBlbHNlIGlmIChmYWJzICh0bXAgLSBmeF9kYXRhLT5yb3QpID4KKyAgICAgIGZhYnMgKHRtcCAtIChmeF9kYXRhLT5yb3QgLSAyLjAgKiBHX1BJKSkpIHsKKyAgICBmeF9kYXRhLT5yb3QgPSAodG1wICsgMTUuMGYgKiAoZnhfZGF0YS0+cm90IC0gMi4wICogR19QSSkpIC8gMTYuMGY7CisgICAgaWYgKGZ4X2RhdGEtPnJvdCA8IDAuMGYpCisgICAgICBmeF9kYXRhLT5yb3QgKz0gMi4wICogR19QSTsKKyAgICAqcm90YW5nbGUgPSBmeF9kYXRhLT5yb3Q7CisgIH0gZWxzZQorICAgICpyb3RhbmdsZSA9IGZ4X2RhdGEtPnJvdCA9ICh0bXAgKyAxNS4wZiAqIGZ4X2RhdGEtPnJvdCkgLyAxNi4wZjsKK30KKworc3RhdGljIHZvaWQKK3RlbnRhY2xlX3VwZGF0ZSAoUGx1Z2luSW5mbyAqIGdvb21JbmZvLCBQaXhlbCAqIGJ1ZiwgUGl4ZWwgKiBiYWNrLCBpbnQgVywgaW50IEgsCisgICAgc2hvcnQgZGF0YVsyXVs1MTJdLCBmbG9hdCByYXBwb3J0LCBpbnQgZHJhd2l0LCBUZW50YWNsZUZYRGF0YSAqIGZ4X2RhdGEpCit7CisKKyAgaW50IHRtcDsKKyAgaW50IHRtcDI7CisKKyAgaW50IGNvbG9yOworICBpbnQgY29sb3Jsb3c7CisKKyAgZmxvYXQgZGlzdCwgZGlzdDIsIHJvdGFuZ2xlOworCisgIGlmICgoIWRyYXdpdCkgJiYgKGZ4X2RhdGEtPmxpZ3MgPiAwLjBmKSkKKyAgICBmeF9kYXRhLT5saWdzID0gLWZ4X2RhdGEtPmxpZ3M7CisKKyAgZnhfZGF0YS0+bGlnICs9IGZ4X2RhdGEtPmxpZ3M7CisKKyAgaWYgKGZ4X2RhdGEtPmxpZyA+IDEuMDFmKSB7CisgICAgaWYgKChmeF9kYXRhLT5saWcgPiAxMC4wZikgfCAoZnhfZGF0YS0+bGlnIDwgMS4xZikpCisgICAgICBmeF9kYXRhLT5saWdzID0gLWZ4X2RhdGEtPmxpZ3M7CisKKyAgICBpZiAoKGZ4X2RhdGEtPmxpZyA8IDYuM2YpICYmIChnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMzApID09IDApKQorICAgICAgZnhfZGF0YS0+ZHN0Y29sID0gZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIE5CX1RFTlRBQ0xFX0NPTE9SUyk7CisKKyAgICBmeF9kYXRhLT5jb2wgPQorICAgICAgICBldm9sdXRlY29sb3IgKGZ4X2RhdGEtPmNvbCwgZnhfZGF0YS0+Y29sb3JzW2Z4X2RhdGEtPmRzdGNvbF0sIDB4ZmYsCisgICAgICAgIDB4MDEpOworICAgIGZ4X2RhdGEtPmNvbCA9CisgICAgICAgIGV2b2x1dGVjb2xvciAoZnhfZGF0YS0+Y29sLCBmeF9kYXRhLT5jb2xvcnNbZnhfZGF0YS0+ZHN0Y29sXSwgMHhmZjAwLAorICAgICAgICAweDAxMDApOworICAgIGZ4X2RhdGEtPmNvbCA9CisgICAgICAgIGV2b2x1dGVjb2xvciAoZnhfZGF0YS0+Y29sLCBmeF9kYXRhLT5jb2xvcnNbZnhfZGF0YS0+ZHN0Y29sXSwgMHhmZjAwMDAsCisgICAgICAgIDB4MDEwMDAwKTsKKyAgICBmeF9kYXRhLT5jb2wgPQorICAgICAgICBldm9sdXRlY29sb3IgKGZ4X2RhdGEtPmNvbCwgZnhfZGF0YS0+Y29sb3JzW2Z4X2RhdGEtPmRzdGNvbF0sCisgICAgICAgIDB4ZmYwMDAwMDAsIDB4MDEwMDAwMDApOworCisgICAgY29sb3IgPSBmeF9kYXRhLT5jb2w7CisgICAgY29sb3Jsb3cgPSBmeF9kYXRhLT5jb2w7CisKKyAgICBsaWdodGVuY29sb3IgKCZjb2xvciwgZnhfZGF0YS0+bGlnICogMi4wZiArIDIuMGYpOworICAgIGxpZ2h0ZW5jb2xvciAoJmNvbG9ybG93LCAoZnhfZGF0YS0+bGlnIC8gMy4wZikgKyAwLjY3Zik7CisKKyAgICByYXBwb3J0ID0gMS4wZiArIDIuMGYgKiAocmFwcG9ydCAtIDEuMGYpOworICAgIHJhcHBvcnQgKj0gMS4yZjsKKyAgICBpZiAocmFwcG9ydCA+IDEuMTJmKQorICAgICAgcmFwcG9ydCA9IDEuMTJmOworCisgICAgcHJldHR5X21vdmUgKGdvb21JbmZvLCBmeF9kYXRhLT5jeWNsZSwgJmRpc3QsICZkaXN0MiwgJnJvdGFuZ2xlLCBmeF9kYXRhKTsKKworICAgIGZvciAodG1wID0gMDsgdG1wIDwgbmJncmlkOyB0bXArKykgeworICAgICAgZm9yICh0bXAyID0gMDsgdG1wMiA8IGRlZmluaXRpb254OyB0bXAyKyspIHsKKyAgICAgICAgZmxvYXQgdmFsID0KKyAgICAgICAgICAgIChmbG9hdCkgKFNoaWZ0UmlnaHQgKGRhdGFbMF1bZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDUxMSldLAorICAgICAgICAgICAgICAgIDEwKSkgKiByYXBwb3J0OworCisgICAgICAgIGZ4X2RhdGEtPnZhbHNbdG1wMl0gPSB2YWw7CisgICAgICB9CisKKyAgICAgIGdyaWQzZF91cGRhdGUgKGZ4X2RhdGEtPmdyaWxsZVt0bXBdLCByb3RhbmdsZSwgZnhfZGF0YS0+dmFscywgZGlzdDIpOworICAgIH0KKyAgICBmeF9kYXRhLT5jeWNsZSArPSAwLjAxZjsKKyAgICBmb3IgKHRtcCA9IDA7IHRtcCA8IG5iZ3JpZDsgdG1wKyspCisgICAgICBncmlkM2RfZHJhdyAoZ29vbUluZm8sIGZ4X2RhdGEtPmdyaWxsZVt0bXBdLCBjb2xvciwgY29sb3Jsb3csIGRpc3QsIGJ1ZiwKKyAgICAgICAgICBiYWNrLCBXLCBIKTsKKyAgfSBlbHNlIHsKKyAgICBmeF9kYXRhLT5saWcgPSAxLjA1ZjsKKyAgICBpZiAoZnhfZGF0YS0+bGlncyA8IDAuMGYpCisgICAgICBmeF9kYXRhLT5saWdzID0gLWZ4X2RhdGEtPmxpZ3M7CisgICAgcHJldHR5X21vdmUgKGdvb21JbmZvLCBmeF9kYXRhLT5jeWNsZSwgJmRpc3QsICZkaXN0MiwgJnJvdGFuZ2xlLCBmeF9kYXRhKTsKKyAgICBmeF9kYXRhLT5jeWNsZSArPSAwLjFmOworICAgIGlmIChmeF9kYXRhLT5jeWNsZSA+IDEwMDApCisgICAgICBmeF9kYXRhLT5jeWNsZSA9IDA7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9nb29tL3RlbnRhY2xlM2QuaCBiL2dzdC9nb29tL3RlbnRhY2xlM2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjNiYTkyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vdGVudGFjbGUzZC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qIEdvb20gUHJvamVjdAorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gaU9TLVNvZnR3YXJlCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpZm5kZWYgX1RFTlRBQ0xFM0RfSAorI2RlZmluZSBfVEVOVEFDTEUzRF9ICisKKyNpbmNsdWRlICJnb29tX3Zpc3VhbF9meC5oIgorCit2b2lkIHRlbnRhY2xlX2Z4X2NyZWF0ZShWaXN1YWxGWCAqZngpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC9nb29tL3YzZC5jIGIvZ3N0L2dvb20vdjNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmNGYxMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL3YzZC5jCkBAIC0wLDAgKzEsMzggQEAKKy8qIEdvb20gUHJvamVjdAorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gaU9TLVNvZnR3YXJlCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpbmNsdWRlICJ2M2QuaCIKKwordm9pZAordjNkX3RvX3YyZCAodjNkICogdjMsIGludCBuYnZlcnRleCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBmbG9hdCBkaXN0YW5jZSwKKyAgICB2MmQgKiB2MikKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG5idmVydGV4OyArK2kpIHsKKyAgICBpZiAodjNbaV0ueiA+IDIpIHsKKyAgICAgIGludCBYcCwgWXA7CisKKyAgICAgIEYySSAoKGRpc3RhbmNlICogdjNbaV0ueCAvIHYzW2ldLnopLCBYcCk7CisgICAgICBGMkkgKChkaXN0YW5jZSAqIHYzW2ldLnkgLyB2M1tpXS56KSwgWXApOworICAgICAgdjJbaV0ueCA9IFhwICsgKHdpZHRoID4+IDEpOworICAgICAgdjJbaV0ueSA9IC1ZcCArIChoZWlnaHQgPj4gMSk7CisgICAgfSBlbHNlCisgICAgICB2MltpXS54ID0gdjJbaV0ueSA9IC02NjY7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9nb29tL3YzZC5oIGIvZ3N0L2dvb20vdjNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1ZjkzOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL3YzZC5oCkBAIC0wLDAgKzEsODMgQEAKKy8qIEdvb20gUHJvamVjdAorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gaU9TLVNvZnR3YXJlCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpZm5kZWYgX1YzRF9ICisjZGVmaW5lIF9WM0RfSAorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJtYXRodG9vbHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGZsb2F0IHgseSx6OworfSB2M2Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgeCx5OworfSB2MmQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBkb3VibGUgeCx5OworfSB2Mmc7CisKKy8qIAorICogcHJvamV0ZSBsZSB2ZXJ0ZXggM0Qgc3VyIGxlIHBsYW4gZCdhZmZpY2hhZ2UKKyAqIHJldG91cm5lICgwLDApIHNpIGxlIHBvaW50IG5lIGRvaXQgcGFzIGV0cmUgYWZmaWNoZS4KKyAqCisgKiBib25uZSB2YWxldXIgcG91ciBkaXN0YW5jZSA6IDI1NgorICovCisjZGVmaW5lIFYzRF9UT19WMkQodjMsdjIsd2lkdGgsaGVpZ2h0LGRpc3RhbmNlKSBcCit7IFwKKyAgaW50IFhwLCBZcDsgXAorICBpZiAodjMueiA+IDIpIHsgXAorCSBGMkkoKGRpc3RhbmNlICogdjMueCAvIHYzLnopLFhwKSA7IFwKKyAJIEYySSgoZGlzdGFuY2UgKiB2My55IC8gdjMueiksWXApIDsgXAorIAkgdjIueCA9IFhwICsgKHdpZHRoPj4xKTsgXAorCSB2Mi55ID0gLVlwICsgKGhlaWdodD4+MSk7IFwKKyAgfSBcCisgIGVsc2UgdjIueD12Mi55PS02NjY7IFwKK30KKwordm9pZCB2M2RfdG9fdjJkKHYzZCAqc3JjLCBpbnQgbmJ2ZXJ0ZXgsIGludCB3aWR0aCwgaW50IGhlaWdodCwgZmxvYXQgZGlzdGFuY2UsIHYyZCAqdjJfYXJyYXkpOworCisvKgorICogcm90YXRpb24gc2Vsb24gWSBkdSB2M2QgdmkgZCdhbmdsZSBhIChjb3NhPWNvcyhhKSwgc2luYT1zaW4oYSkpCisgKiBjZW50ZXJ6ID0gY2VudHJlIGRlIHJvdGF0aW9uIGVuIHoKKyAqLworI2RlZmluZSBZX1JPVEFURV9WM0QodmksdmYsc2luYSxjb3NhKVwKK3tcCisgdmYueCA9IHZpLnggKiBjb3NhIC0gdmkueiAqIHNpbmE7XAorIHZmLnogPSB2aS54ICogc2luYSArIHZpLnogKiBjb3NhO1wKKyB2Zi55ID0gdmkueTtcCit9CisKKy8qCisgKiB0cmFuc2xhdGlvbgorICovCisjZGVmaW5lIFRSQU5TTEFURV9WM0QodnNyYyx2ZGVzdClcCit7XAorIHZkZXN0LnggKz0gdnNyYy54O1wKKyB2ZGVzdC55ICs9IHZzcmMueTtcCisgdmRlc3QueiArPSB2c3JjLno7XAorfQorCisjZGVmaW5lIE1VTF9WM0QobGYsdikge3YueCo9bGY7di55Kj1sZjt2LnoqPWxmO30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvZ29vbS94bW14LmMgYi9nc3QvZ29vbS94bW14LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE4N2NmOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL3htbXguYwpAQCAtMCwwICsxLDQwMiBAQAorLyoJeG1teC5jCisKKwllWHRlbmRlZCBNdWx0aU1lZGlhIGVYdGVuc2lvbnMgR0NDIGludGVyZmFjZSBsaWJyYXJ5IGZvciBJQTMyLgorCisJVG8gdXNlIHRoaXMgbGlicmFyeSwgc2ltcGx5IGluY2x1ZGUgdGhpcyBoZWFkZXIgZmlsZQorCWFuZCBjb21waWxlIHdpdGggR0NDLiAgWW91IE1VU1QgaGF2ZSBpbmxpbmluZyBlbmFibGVkCisJaW4gb3JkZXIgZm9yIHhtbXhfb2soKSB0byB3b3JrOyB0aGlzIGNhbiBiZSBkb25lIGJ5CisJc2ltcGx5IHVzaW5nIC1PIG9uIHRoZSBHQ0MgY29tbWFuZCBsaW5lLgorCisJQ29tcGlsaW5nIHdpdGggLURYTU1YX1RSQUNFIHdpbGwgY2F1c2UgZGV0YWlsZWQgdHJhY2UKKwlvdXRwdXQgdG8gYmUgc2VudCB0byBzdGRlcnIgZm9yIGVhY2ggbW14IG9wZXJhdGlvbi4KKwlUaGlzIGFkZHMgbG90cyBvZiBjb2RlLCBhbmQgb2J2aW91c2x5IHNsb3dzIGV4ZWN1dGlvbiB0bworCWEgY3Jhd2wsIGJ1dCBjYW4gYmUgdmVyeSB1c2VmdWwgZm9yIGRlYnVnZ2luZy4KKworCVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWQorCUVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKKwlMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQorCUFORCBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFLgorCisJMTk5OSBieSBSLiBGaXNoZXIKKwlCYXNlZCBvbiBsaWJtbXgsIDE5OTctOTkgYnkgSC4gRGlldHogYW5kIFIuIEZpc2hlcgorCisgTm90ZXM6CisJSXQgYXBwZWFycyB0aGF0IHRoZSBsYXRlc3QgZ2FzIGhhcyB0aGUgcGFuZCBwcm9ibGVtIGZpeGVkLCB0aGVyZWZvcmUKKwkgIEknbGwgdW5kZWZpbmUgQlJPS0VOX1BBTkQgYnkgZGVmYXVsdC4KKyovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnb29tX2NvbmZpZy5oIgorCisjaWZkZWYgSEFWRV9NTVgKKworLyogYSBkZWZpbmlyIHBvdXIgYXZvaXIgZXhhY3RlbWVudCBsZSBtZW1lIHJlc3VsdGF0IHF1ZSBsYSBmb25jdGlvbiBDCisgKiAodW4gY2hvdWlsbGF0IHBsdXMgbGVudCkuLiBtYWlzIGxhIGRpZmZlcmVuY2UgZXN0IGFzc2V6IHBldSBub3RhYmxlLgorICovCisvLyAjZGVmaW5lIFNUUklDVF9DT01QQVQKKworI2RlZmluZSBCVUZGUE9JTlROQiAxNgorI2RlZmluZSBCVUZGUE9JTlRNQVNLIDB4ZmZmZgorI2RlZmluZSBCVUZGSU5DUiAweGZmCisKKyNkZWZpbmUgc3FydHBlcnRlIDE2CisvKiBmYWlyZSA6IGEgJSBzcXJ0cGVydGUgPD0+IGEgJiBwZXJ0ZW1hc2sqLworI2RlZmluZSBQRVJURU1BU0sgMHhmCisvKiBmYWlyZSA6IGEgLyBzcXJ0cGVydGUgPD0+IGEgPj4gUEVSVEVERUMqLworI2RlZmluZSBQRVJURURFQyA0CisKKworLyojZGVmaW5lIE1NWF9UUkFDRSovCisjaW5jbHVkZSAibW14LmgiCisvKiNpbmNsdWRlICJ4bW14LmgiKi8KKyNpbmNsdWRlICJnb29tX2dyYXBoaWMuaCIKKworaW50Cit4bW14X3N1cHBvcnRlZCAodm9pZCkKK3sKKyAgcmV0dXJuIChtbV9zdXBwb3J0ICgpICYgMHg4KSA+PiAzOworfQorCit2b2lkCit6b29tX2ZpbHRlcl94bW14IChpbnQgcHJldlgsIGludCBwcmV2WSwKKyAgICBQaXhlbCAqIGV4cGl4MSwgUGl4ZWwgKiBleHBpeDIsCisgICAgaW50ICpsYnJ1UywgaW50ICpsYnJ1RCwgaW50IGJ1ZmZyYXRpbywgaW50IHByZWNhbENvZWZbMTZdWzE2XSkKK3sKKyAgaW50IGJ1ZnNpemUgPSBwcmV2WCAqIHByZXZZOyAgLyogdGFpbGxlIGR1IGJ1ZmZlciAqLworICB2b2xhdGlsZSBpbnQgbG9vcDsgICAgICAgICAgICAvKiB2YXJpYWJsZSBkZSBib3VjbGUgKi8KKworICBtbXhfdCAqYnJ1dFMgPSAobW14X3QgKikgbGJydVM7ICAgICAgIC8qIGJ1ZmZlciBkZSB0cmFuc2Zvcm1hdGlvbiBzb3VyY2UgKi8KKyAgbW14X3QgKmJydXREID0gKG1teF90ICopIGxicnVEOyAgICAgICAvKiBidWZmZXIgZGUgdHJhbnNmb3JtYXRpb24gZGVzdCAqLworCisgIHZvbGF0aWxlIG1teF90IHByZXZYWTsKKyAgdm9sYXRpbGUgbW14X3QgcmF0aW94OworCisgIC8qICAgICAgdm9sYXRpbGUgbW14X3QgaW50ZXJwaXg7ICovCisKKyAgZXhwaXgxWzBdLnZhbCA9IGV4cGl4MVtwcmV2WCAtIDFdLnZhbCA9IGV4cGl4MVtwcmV2WCAqIHByZXZZIC0gMV0udmFsID0KKyAgICAgIGV4cGl4MVtwcmV2WCAqIHByZXZZIC0gcHJldlhdLnZhbCA9IDA7CisKKyAgcHJldlhZLnVkWzBdID0gKHByZXZYIC0gMSkgPDwgUEVSVEVERUM7CisgIHByZXZYWS51ZFsxXSA9IChwcmV2WSAtIDEpIDw8IFBFUlRFREVDOworCisgIHJhdGlveC5kWzBdID0gYnVmZnJhdGlvOworICByYXRpb3guZFsxXSA9IGJ1ZmZyYXRpbzsKKworICBhc20gdm9sYXRpbGUgKCJcblx0IG1vdnEgICVbcmF0aW9dLCAlJW1tNiIgIlxuXHQgcHNsbGQgJDE2LCAgICAgICUlbW02IiAgICAgICAvKiBtbTYgPSBbcmF0MTY9YnVmZnJhdGlvPDwxNiB8IHJhdDE2PWJ1ZmZyYXRpbzw8MTZdICovCisgICAgICAiXG5cdCBweG9yICAlJW1tNywgICAgJSVtbTciICAgICAgLyogbW03ID0gMCAqLworICAgICAgOjpbcmF0aW9dICJtIiAocmF0aW94KSk7CisKKyAgbG9vcCA9IDA7CisKKyAgLyoKKyAgICogTk9URSA6IG1tNiBldCBtbTcgbmUgc29udCBwYXMgbW9kaWZpZXMgZGFucyBsYSBib3VjbGUuCisgICAqLworICB3aGlsZSAobG9vcCA8IGJ1ZnNpemUpIHsKKyAgICAvKiBUaHJlYWQgIzEKKyAgICAgKiBwcmUgOiAgbW02ID0gW3JhdDE2fHJhdDE2XQorICAgICAqIHBvc3QgOiBtbTAgPSBTICsgKChELVMpKnJhdDE2IGZvcm1hdCBbWHxZXQorICAgICAqIG1vZGlmaWVkID0gbW0wLG1tMSxtbTIKKyAgICAgKi8KKworICAgIGFzbSB2b2xhdGlsZSAoIiMxIFxuXHQgbW92cSAwKCVbYnJ1dFNdKSwgJSVtbTAiICIjMSBcblx0IG1vdnEgMCglW2JydXREXSksICUlbW0xIiAiIzEgXG5cdCBwc3ViZCAgICUlbW0wLCAlJW1tMSIgICAgLyogbW0xID0gRCAtIFMgKi8KKyAgICAgICAgIiMxIFxuXHQgbW92cSAgICAlJW1tMSwgJSVtbTIiICAvKiBtbTIgPSBEIC0gUyAqLworICAgICAgICAiIzEgXG5cdCBwc2xsZCAgICAgJDE2LCAlJW1tMSIgIiMxIFxuXHQgcG11bGx3ICAlJW1tNiwgJSVtbTIiICIjMSBcblx0IHBtdWxodXcgJSVtbTYsICUlbW0xIiAiIzEgXG5cdCBwc2xsZCAgICQxNiwgICAlJW1tMCIgIiMxIFxuXHQgcGFkZGQgICAlJW1tMiwgJSVtbTEiICAgICAgLyogbW0xID0gKEQgLSBTKSAqIGJ1ZmZyYXRpbyA+PiAxNiAqLworICAgICAgICAiIzEgXG5cdCBwYWRkZCAgICUlbW0xLCAlJW1tMCIgIC8qIG1tMCA9IFMgKyBtbTEgKi8KKyAgICAgICAgIiMxIFxuXHQgcHNybGQgICAkMTYsICAgJSVtbTAiOjpbYnJ1dFNdICJyIiAoJmJydXRTW2xvb3BdKSwKKyAgICAgICAgW2JydXREXSAiciIgKCZicnV0RFtsb29wXSkKKyAgICAgICAgKTsgICAgICAgICAgICAgICAgICAgICAgLyogbW0wID0gUyAqLworCisgICAgLyoKKyAgICAgKiBwcmUgOiBtbTAgOiBwb3NpdGlvbiB2ZWN0b3Igb24gc2NyZWVuCisgICAgICogICAgICAgcHJldlhZIDogY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXItcmlnaHQgcG9pbnQgb24gc2NyZWVuCisgICAgICogcG9zdCA6IGNsaXBwZWQgbW0wCisgICAgICogbW9kaWZpZWQgOiBtbTAsbW0xLG1tMgorICAgICAqLworICAgIGFzbSB2b2xhdGlsZQorICAgICAgICAoIiMxIFxuXHQgbW92cSAlW3ByZXZYWV0sICUlbW0xIiAiIzEgXG5cdCBwY21wZ3RkICUlbW0wLCAgJSVtbTEiCisgICAgICAgIC8qIG1tMCBlbiBYIGNvbnRpZW50IChpZGVtIHBvdXIgWSkgOgorICAgICAgICAgKiAgIDExMTEgc2kgcHJldlhZID4gcHgKKyAgICAgICAgICogICAwMDAwIHNpIHByZXZYWSA8PSBweCAqLworI2lmZGVmIFNUUklDVF9DT01QQVQKKyAgICAgICAgIiMxIFxuXHQgbW92cSAgICAgICUlbW0xLCAlJW1tMiIKKyAgICAgICAgIiMxIFxuXHQgcHVucGNraGRxICUlbW0yLCAlJW1tMiIKKyAgICAgICAgIiMxIFxuXHQgcHVucGNrbGRxICUlbW0xLCAlJW1tMSIgIiMxIFxuXHQgcGFuZCAgICAgICUlbW0yLCAlJW1tMCIKKyNlbmRpZgorICAgICAgICAiIzEgXG5cdCBwYW5kICUlbW0xLCAlJW1tMCIgICAgIC8qIG9uIG1ldCBhIHplcm8gbGEgcGFydGllIHF1aSBkZWJvcmRlICovCisgICAgICAgIDo6W3ByZXZYWV0gIm0iIChwcmV2WFkpKTsKKworICAgIC8qIFRocmVhZCAjMgorICAgICAqIHByZSA6ICBtbTAgOiBjbGlwcGVkIHBvc2l0aW9uIG9uIHNjcmVlbgorICAgICAqCisgICAgICogcG9zdCA6IG1tMyA6IGNvZWZzIGZvciB0aGlzIHBvc2l0aW9uCisgICAgICogICAgICAgIG1tMSA6IFggdmVjdG9yIFswfFhdCisgICAgICoKKyAgICAgKiBtb2RpZiA6IGVheCxlc2kKKyAgICAgKi8KKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIiMyIFxuXHQgbW92ZCAlJW1tMCwlJWVzaSIKKyAgICAgICAgIiMyIFxuXHQgbW92cSAlJW1tMCwlJW1tMSIKKyAgICAgICAgIiMyIFxuXHQgYW5kbCAkMTUsJSVlc2kiCisgICAgICAgICIjMiBcblx0IHBzcmxxICQzMiwlJW1tMSIKKyAgICAgICAgIiMyIFxuXHQgc2hsbCAkNiwlJWVzaSIKKyAgICAgICAgIiMyIFxuXHQgbW92ZCAlJW1tMSwlJWVheCIKKyAgICAgICAgIiMyIFxuXHQgYWRkbCAlW3ByZWNhbENvZWZdLCUlZXNpIgorICAgICAgICAiIzIgXG5cdCBhbmRsICQxNSwlJWVheCIKKyAgICAgICAgIiMyIFxuXHQgbW92ZCAoJSVlc2ksJSVlYXgsNCksJSVtbTMiOjpbcHJlY2FsQ29lZl0KKyAgICAgICAgImciIChwcmVjYWxDb2VmKToiZWF4IiwgImVzaSIpOworCisgICAgLyoKKyAgICAgKiBleHRyYWN0aW9uIGRlcyBjb2VmZmljaWVudHMuLi4gKFRocmVhZCAjMykKKyAgICAgKgorICAgICAqIHByZSA6IGNvZWYgZGFucyBtbTMKKyAgICAgKgorICAgICAqIHBvc3QgOiBjb2VmIGV4dHJhaXRzIGRhbnMgbW0zIChjMSAmIGMyKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgZXQgbW00IChjMyAmIGM0KQorICAgICAqCisgICAgICogbW9kaWYgOiBtbTUKKyAgICAgKi8KKworICAgIC8qIChUaHJlYWQgIzQpCisgICAgICogcHJlIDogbW0wIDogWSBwb3MgWyp8WV0KKyAgICAgKiAgICAgICBtbTEgOiBYIHBvcyBbKnxYXQorICAgICAqCisgICAgICogcG9zdCA6IG1tMCA6IGV4cGl4MVtwb3NpdGlvbl0KKyAgICAgKiAgICAgICAgbW0yIDogZXhwaXgxW3Bvc2l0aW9uK2xhcmdldXJdCisgICAgICoKKyAgICAgKiBtb2RpZiA6IGVheCwgZXNpCisgICAgICovCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCIjMiBcblx0IHBzcmxkICQ0LCAlJW1tMCIgIiMyIFxuXHQgcHNybGQgJDQsICUlbW0xIiAgIC8qIFBFUlRFREVDID0gJDQgKi8KKyAgICAgICAgIiM0IFxuXHQgbW92ZCAlJW1tMSwlJWVheCIKKyAgICAgICAgIiMzIFxuXHQgbW92cSAlJW1tMywlJW1tNSIKKyAgICAgICAgIiM0IFxuXHQgbXVsbCAlW3ByZXZYXSIKKyAgICAgICAgIiM0IFxuXHQgbW92ZCAlJW1tMCwlJWVzaSIKKyAgICAgICAgIiMzIFxuXHQgcHVucGNrbGJ3ICUlbW01LCAlJW1tMyIKKyAgICAgICAgIiM0IFxuXHQgYWRkbCAlJWVzaSwgJSVlYXgiCisgICAgICAgICIjMyBcblx0IG1vdnEgJSVtbTMsICUlbW00IgorICAgICAgICAiIzMgXG5cdCBtb3ZxICUlbW0zLCAlJW1tNSIKKyAgICAgICAgIiM0IFxuXHQgbW92bCAlW2V4cGl4MV0sICUlZXNpIgorICAgICAgICAiIzMgXG5cdCBwdW5wY2tsYncgJSVtbTUsICUlbW0zIgorICAgICAgICAiIzQgXG5cdCBtb3ZxICglJWVzaSwlJWVheCw0KSwlJW1tMCIKKyAgICAgICAgIiMzIFxuXHQgcHVucGNraGJ3ICUlbW01LCAlJW1tNCIKKyAgICAgICAgIiM0IFxuXHQgYWRkbCAlW3ByZXZYXSwlJWVheCIKKyAgICAgICAgIiM0IFxuXHQgbW92cSAoJSVlc2ksJSVlYXgsNCksJSVtbTIiOjpbZXhwaXgxXSAiZyIgKGV4cGl4MSkKKyAgICAgICAgLFtwcmV2WF0gImciIChwcmV2WCkKKyAgICAgICAgOiJlYXgiLCAiZXNpIiwgImVkeCIpOworCisgICAgLyoKKyAgICAgKiBwcmUgOiAgICAgICBtbTAgOiBleHBpeDFbcG9zaXRpb25dCisgICAgICogICAgICAgICAgICAgbW0yIDogZXhwaXgxW3Bvc2l0aW9uK2xhcmdldXJdCisgICAgICogICAgICAgbW0zICYgbW00IDogY29lZnMKKyAgICAgKi8KKworICAgIC8qIHJlY29waWUgZGVzIGRldXggcHJlbWllcnMgcGl4ZWxzIGRhbnMgbW0wIGV0IG1tMSAqLworICAgIG1vdnFfcjJyIChtbTAsIG1tMSk7ICAgICAgICAvKiBiMS12MS1yMS1hMS1iMi12Mi1yMi1hMiAqLworCisgICAgLyogZGVwYWNrYWdlIGR1IHByZW1pZXIgcGl4ZWwgKi8KKyAgICBwdW5wY2tsYndfcjJyIChtbTcsIG1tMCk7ICAgLyogMDAtYjItMDAtdjItMDAtcjItMDAtYTIgKi8KKworICAgIC8qIGV4dHJhY3Rpb24gZGVzIGNvZWZmaWNpZW50cy4uLiAqLworCisgICAgbW92cV9yMnIgKG1tMywgbW01KTsgICAgICAgIC8qIGMyLWMyLWMyLWMyLWMxLWMxLWMxLWMxICovCisKKyAgICAvKl5lbiBwYXJyYWxsZWxlXiAqLy8qIGRlcGFja2FnZSBkdSAyaWVtZSBwaXhlbCAqLworICAgIC8qXiAqLyBwdW5wY2toYndfcjJyIChtbTcsIG1tMSk7CisgICAgLyogMDAtYjEtMDAtdjEtMDAtcjEtMDAtYTEgKi8KKworICAgIHB1bnBja2xid19yMnIgKG1tNywgbW01KTsgICAvKiAwMC1jMS0wMC1jMS0wMC1jMS0wMC1jMSAqLworICAgIHB1bnBja2hid19yMnIgKG1tNywgbW0zKTsgICAvKiAwMC1jMi0wMC1jMi0wMC1jMi0wMC1jMiAqLworCisgICAgLyogbXVsdGlwbGljYXRpb24gZGVzIHBpeGVscyBwYXIgbGVzIGNvZWZmaWNpZW50cyAqLworICAgIHBtdWxsd19yMnIgKG1tNSwgbW0wKTsgICAgICAvKiBjMSpiMi1jMSp2Mi1jMSpyMi1jMSphMiAqLworICAgIHBtdWxsd19yMnIgKG1tMywgbW0xKTsgICAgICAvKiBjMipiMS1jMip2MS1jMipyMS1jMiphMSAqLworICAgIHBhZGR3X3IyciAobW0xLCBtbTApOworCisgICAgLyogLi4uZXh0cmFjdGlvbiBkZXMgMiBkZXJuaWVycyBjb2VmZmljaWVudHMgKi8KKyAgICBtb3ZxX3IyciAobW00LCBtbTUpOyAgICAgICAgLyogYzQtYzQtYzQtYzQtYzMtYzMtYzMtYzMgKi8KKyAgICBwdW5wY2tsYndfcjJyIChtbTcsIG1tNCk7ICAgLyogMDAtYzMtMDAtYzMtMDAtYzMtMDAtYzMgKi8KKyAgICBwdW5wY2toYndfcjJyIChtbTcsIG1tNSk7ICAgLyogMDAtYzQtMDAtYzQtMDAtYzQtMDAtYzQgKi8KKworICAgIC8qIHJlY3VwZXJhdGlvbiBkZXMgMiBkZXJuaWVycyBwaXhlbHMgKi8KKyAgICBtb3ZxX3IyciAobW0yLCBtbTEpOworCisgICAgLyogZGVwYWNrYWdlIGRlcyBwaXhlbHMgKi8KKyAgICBwdW5wY2tsYndfcjJyIChtbTcsIG1tMSk7CisgICAgcHVucGNraGJ3X3IyciAobW03LCBtbTIpOworCisgICAgLyogbXVsdGlwbGljYXRpb24gcGFzIGxlcyBjb2VmZnMgKi8KKyAgICBwbXVsbHdfcjJyIChtbTQsIG1tMSk7CisgICAgcG11bGx3X3IyciAobW01LCBtbTIpOworCisgICAgLyogYWpvdXQgZGVzIHZhbGV1cnMgb2J0ZW51ZXMg77+9IGxhIHZhbGV1ciBmaW5hbGUgKi8KKyAgICBwYWRkd19yMnIgKG1tMSwgbW0wKTsKKyAgICBwYWRkd19yMnIgKG1tMiwgbW0wKTsKKworICAgIC8qIGRpdmlzaW9uIHBhciAyNTYgPSAxNisxNisxNisxNiwgcHVpcyByZXBhY2thZ2UgZHUgcGl4ZWwgZmluYWwgKi8KKyAgICBwc3Jsd19pMnIgKDgsIG1tMCk7CisgICAgcGFja3Vzd2JfcjJyIChtbTcsIG1tMCk7CisKKyAgICBtb3ZkX3IybSAobW0wLCBleHBpeDJbbG9vcF0pOworCisgICAgKytsb29wOworICB9CisgIC8qIHRoaXMgd2FzIGZlbW1zLCB3aGljaCBpcyBBTUQgM2Rub3cgKi8KKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlbW1zXG4iKTsKK30KKworI2RlZmluZSBEUkFXTUVUSE9EX1BMVVNfWE1NWChfb3V0LF9iYWNrYnVmLF9jb2wpIFwKK3sgXAorCW1vdmRfbTJyKF9iYWNrYnVmLCBtbTApOyBcCisJcGFkZHVzYl9tMnIoX2NvbCwgbW0wKTsgXAorCW1vdmRfcjJtKG1tMCwgX291dCk7IFwKK30KKworI2RlZmluZSBEUkFXTUVUSE9EIERSQVdNRVRIT0RfUExVU19YTU1YKCpwLCpwLGNvbCkKKwordm9pZAorZHJhd19saW5lX3htbXggKFBpeGVsICogZGF0YSwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyLCBpbnQgY29sLAorICAgIGludCBzY3JlZW54LCBpbnQgc2NyZWVueSkKK3sKKyAgaW50IHgsIHksIGR4LCBkeSwgeXksIHh4OworICBQaXhlbCAqcDsKKworICBpZiAoKHkxIDwgMCkgfHwgKHkyIDwgMCkgfHwgKHgxIDwgMCkgfHwgKHgyIDwgMCkgfHwgKHkxID49IHNjcmVlbnkpCisgICAgICB8fCAoeTIgPj0gc2NyZWVueSkgfHwgKHgxID49IHNjcmVlbngpIHx8ICh4MiA+PSBzY3JlZW54KSkKKyAgICBnb3RvIGVuZF9vZl9saW5lOworCisgIGR4ID0geDIgLSB4MTsKKyAgZHkgPSB5MiAtIHkxOworICBpZiAoeDEgPj0geDIpIHsKKyAgICBpbnQgdG1wOworCisgICAgdG1wID0geDE7CisgICAgeDEgPSB4MjsKKyAgICB4MiA9IHRtcDsKKyAgICB0bXAgPSB5MTsKKyAgICB5MSA9IHkyOworICAgIHkyID0gdG1wOworICAgIGR4ID0geDIgLSB4MTsKKyAgICBkeSA9IHkyIC0geTE7CisgIH0KKworICAvKiB2ZXJ0aWNhbCBsaW5lICovCisgIGlmIChkeCA9PSAwKSB7CisgICAgaWYgKHkxIDwgeTIpIHsKKyAgICAgIHAgPSAmKGRhdGFbKHNjcmVlbnggKiB5MSkgKyB4MV0pOworICAgICAgZm9yICh5ID0geTE7IHkgPD0geTI7IHkrKykgeworICAgICAgICBEUkFXTUVUSE9EOworICAgICAgICBwICs9IHNjcmVlbng7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHAgPSAmKGRhdGFbKHNjcmVlbnggKiB5MikgKyB4MV0pOworICAgICAgZm9yICh5ID0geTI7IHkgPD0geTE7IHkrKykgeworICAgICAgICBEUkFXTUVUSE9EOworICAgICAgICBwICs9IHNjcmVlbng7CisgICAgICB9CisgICAgfQorICAgIGdvdG8gZW5kX29mX2xpbmU7CisgIH0KKyAgLyogaG9yaXpvbnRhbCBsaW5lICovCisgIGlmIChkeSA9PSAwKSB7CisgICAgaWYgKHgxIDwgeDIpIHsKKyAgICAgIHAgPSAmKGRhdGFbKHNjcmVlbnggKiB5MSkgKyB4MV0pOworICAgICAgZm9yICh4ID0geDE7IHggPD0geDI7IHgrKykgeworICAgICAgICBEUkFXTUVUSE9EOworICAgICAgICBwKys7CisgICAgICB9CisgICAgICBnb3RvIGVuZF9vZl9saW5lOworICAgIH0gZWxzZSB7CisgICAgICBwID0gJihkYXRhWyhzY3JlZW54ICogeTEpICsgeDJdKTsKKyAgICAgIGZvciAoeCA9IHgyOyB4IDw9IHgxOyB4KyspIHsKKyAgICAgICAgRFJBV01FVEhPRDsKKyAgICAgICAgcCsrOworICAgICAgfQorICAgICAgZ290byBlbmRfb2ZfbGluZTsKKyAgICB9CisgIH0KKyAgLyogMSAgICAqLworICAvKiAgXCAgICovCisgIC8qICAgXCAgKi8KKyAgLyogICAgMiAqLworICBpZiAoeTIgPiB5MSkgeworICAgIC8qIHN0ZWVwICovCisgICAgaWYgKGR5ID4gZHgpIHsKKyAgICAgIGR4ID0gKChkeCA8PCAxNikgLyBkeSk7CisgICAgICB4ID0geDEgPDwgMTY7CisgICAgICBmb3IgKHkgPSB5MTsgeSA8PSB5MjsgeSsrKSB7CisgICAgICAgIHh4ID0geCA+PiAxNjsKKyAgICAgICAgcCA9ICYoZGF0YVsoc2NyZWVueCAqIHkpICsgeHhdKTsKKyAgICAgICAgRFJBV01FVEhPRDsKKyAgICAgICAgaWYgKHh4IDwgKHNjcmVlbnggLSAxKSkgeworICAgICAgICAgIHArKzsKKyAgICAgICAgICAvKiBEUkFXTUVUSE9EOyAqLworICAgICAgICB9CisgICAgICAgIHggKz0gZHg7CisgICAgICB9CisgICAgICBnb3RvIGVuZF9vZl9saW5lOworICAgIH0KKyAgICAvKiBzaGFsbG93ICovCisgICAgZWxzZSB7CisgICAgICBkeSA9ICgoZHkgPDwgMTYpIC8gZHgpOworICAgICAgeSA9IHkxIDw8IDE2OworICAgICAgZm9yICh4ID0geDE7IHggPD0geDI7IHgrKykgeworICAgICAgICB5eSA9IHkgPj4gMTY7CisgICAgICAgIHAgPSAmKGRhdGFbKHNjcmVlbnggKiB5eSkgKyB4XSk7CisgICAgICAgIERSQVdNRVRIT0Q7CisgICAgICAgIGlmICh5eSA8IChzY3JlZW55IC0gMSkpIHsKKyAgICAgICAgICBwICs9IHNjcmVlbnk7CisgICAgICAgICAgLyogRFJBV01FVEhPRDsgKi8KKyAgICAgICAgfQorICAgICAgICB5ICs9IGR5OworICAgICAgfQorICAgIH0KKyAgfQorICAvKiAgICAyICovCisgIC8qICAgLyAgKi8KKyAgLyogIC8gICAqLworICAvKiAxICAgICovCisgIGVsc2UgeworICAgIC8qIHN0ZWVwICovCisgICAgaWYgKC1keSA+IGR4KSB7CisgICAgICBkeCA9ICgoZHggPDwgMTYpIC8gLWR5KTsKKyAgICAgIHggPSAoeDEgKyAxKSA8PCAxNjsKKyAgICAgIGZvciAoeSA9IHkxOyB5ID49IHkyOyB5LS0pIHsKKyAgICAgICAgeHggPSB4ID4+IDE2OworICAgICAgICBwID0gJihkYXRhWyhzY3JlZW54ICogeSkgKyB4eF0pOworICAgICAgICBEUkFXTUVUSE9EOworICAgICAgICBpZiAoeHggPCAoc2NyZWVueCAtIDEpKSB7CisgICAgICAgICAgcC0tOworICAgICAgICAgIC8qIERSQVdNRVRIT0Q7ICovCisgICAgICAgIH0KKyAgICAgICAgeCArPSBkeDsKKyAgICAgIH0KKyAgICAgIGdvdG8gZW5kX29mX2xpbmU7CisgICAgfQorICAgIC8qIHNoYWxsb3cgKi8KKyAgICBlbHNlIHsKKyAgICAgIGR5ID0gKChkeSA8PCAxNikgLyBkeCk7CisgICAgICB5ID0geTEgPDwgMTY7CisgICAgICBmb3IgKHggPSB4MTsgeCA8PSB4MjsgeCsrKSB7CisgICAgICAgIHl5ID0geSA+PiAxNjsKKyAgICAgICAgcCA9ICYoZGF0YVsoc2NyZWVueCAqIHl5KSArIHhdKTsKKyAgICAgICAgRFJBV01FVEhPRDsKKyAgICAgICAgaWYgKHl5IDwgKHNjcmVlbnkgLSAxKSkgeworICAgICAgICAgIHAgKz0gc2NyZWVueTsKKyAgICAgICAgICAvKiBEUkFXTUVUSE9EOyAqLworICAgICAgICB9CisgICAgICAgIHkgKz0gZHk7CisgICAgICB9CisgICAgICBnb3RvIGVuZF9vZl9saW5lOworICAgIH0KKyAgfQorZW5kX29mX2xpbmU6CisgIC8qIHRoaXMgd2FzIGZlbW1zLCB3aGljaCBpcyBBTUQgM2Rub3cgKi8KKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlbW1zXG4iKTsKK30KKyNlbHNlCitpbnQKK3htbXhfc3VwcG9ydGVkICh2b2lkKQoreworICByZXR1cm4gKDApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvZ29vbS94bW14LmggYi9nc3QvZ29vbS94bW14LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBlZjM2MQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL3htbXguaApAQCAtMCwwICsxLDUzNyBAQAorLyoJeG1teC5oCisKKwllWHRlbmRlZCBNdWx0aU1lZGlhIGVYdGVuc2lvbnMgR0NDIGludGVyZmFjZSBsaWJyYXJ5IGZvciBJQTMyLgorCisJVG8gdXNlIHRoaXMgbGlicmFyeSwgc2ltcGx5IGluY2x1ZGUgdGhpcyBoZWFkZXIgZmlsZQorCWFuZCBjb21waWxlIHdpdGggR0NDLiAgWW91IE1VU1QgaGF2ZSBpbmxpbmluZyBlbmFibGVkCisJaW4gb3JkZXIgZm9yIHhtbXhfb2soKSB0byB3b3JrOyB0aGlzIGNhbiBiZSBkb25lIGJ5CisJc2ltcGx5IHVzaW5nIC1PIG9uIHRoZSBHQ0MgY29tbWFuZCBsaW5lLgorCisJQ29tcGlsaW5nIHdpdGggLURYTU1YX1RSQUNFIHdpbGwgY2F1c2UgZGV0YWlsZWQgdHJhY2UKKwlvdXRwdXQgdG8gYmUgc2VudCB0byBzdGRlcnIgZm9yIGVhY2ggbW14IG9wZXJhdGlvbi4KKwlUaGlzIGFkZHMgbG90cyBvZiBjb2RlLCBhbmQgb2J2aW91c2x5IHNsb3dzIGV4ZWN1dGlvbiB0bworCWEgY3Jhd2wsIGJ1dCBjYW4gYmUgdmVyeSB1c2VmdWwgZm9yIGRlYnVnZ2luZy4KKworCVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWQorCUVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKKwlMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQorCUFORCBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFLgorCisJMTk5OSBieSBSLiBGaXNoZXIKKwlCYXNlZCBvbiBsaWJtbXgsIDE5OTctOTkgYnkgSC4gRGlldHogYW5kIFIuIEZpc2hlcgorCisgTm90ZXM6CisJSXQgYXBwZWFycyB0aGF0IHRoZSBsYXRlc3QgZ2FzIGhhcyB0aGUgcGFuZCBwcm9ibGVtIGZpeGVkLCB0aGVyZWZvcmUKKwkgIEknbGwgdW5kZWZpbmUgQlJPS0VOX1BBTkQgYnkgZGVmYXVsdC4KKyovCisKKyNpZm5kZWYgX1hNTVhfSAorI2RlZmluZSBfWE1NWF9ICisKKworLyoJV2FybmluZzogIGF0IHRoaXMgd3JpdGluZywgdGhlIHZlcnNpb24gb2YgR0FTIHBhY2thZ2VkCisJd2l0aCBtb3N0IExpbnV4IGRpc3RyaWJ1dGlvbnMgZG9lcyBub3QgaGFuZGxlIHRoZQorCXBhcmFsbGVsIEFORCBvcGVyYXRpb24gbW5lbW9uaWMgY29ycmVjdGx5LiAgSWYgdGhlCisJc3ltYm9sIEJST0tFTl9QQU5EIGlzIGRlZmluZWQsIGEgc2xvd2VyIGFsdGVybmF0aXZlCisJY29kaW5nIHdpbGwgYmUgdXNlZC4gIElmIGV4ZWN1dGlvbiBvZiBtbXh0ZXN0IHJlc3VsdHMKKwlpbiBhbiBpbGxlZ2FsIGluc3RydWN0aW9uIGZhdWx0LCBkZWZpbmUgdGhpcyBzeW1ib2wuCisqLworI3VuZGVmCUJST0tFTl9QQU5ECisKKworLyoJVGhlIHR5cGUgb2YgYW4gdmFsdWUgdGhhdCBmaXRzIGluIGFuIChFeHRlbmRlZCkgTU1YIHJlZ2lzdGVyCisJKG5vdGUgdGhhdCBsb25nIGxvbmcgY29uc3RhbnQgdmFsdWVzIE1VU1QgYmUgc3VmZml4ZWQKKwkgYnkgTEwgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZXMgYnkgVUxMLCBsZXN0CisJIHRoZXkgYmUgdHJ1bmNhdGVkIGJ5IHRoZSBjb21waWxlcikKKyovCisjaWZuZGVmIF9NTVhfSAordHlwZWRlZgl1bmlvbiB7CisJbG9uZyBsb25nCQlxOwkvKiBRdWFkd29yZCAoNjQtYml0KSB2YWx1ZSAqLworCXVuc2lnbmVkIGxvbmcgbG9uZwl1cTsJLyogVW5zaWduZWQgUXVhZHdvcmQgKi8KKwlpbnQJCQlkWzJdOwkvKiAyIERvdWJsZXdvcmQgKDMyLWJpdCkgdmFsdWVzICovCisJdW5zaWduZWQgaW50CQl1ZFsyXTsJLyogMiBVbnNpZ25lZCBEb3VibGV3b3JkICovCisJc2hvcnQJCQl3WzRdOwkvKiA0IFdvcmQgKDE2LWJpdCkgdmFsdWVzICovCisJdW5zaWduZWQgc2hvcnQJCXV3WzRdOwkvKiA0IFVuc2lnbmVkIFdvcmQgKi8KKwljaGFyCQkJYls4XTsJLyogOCBCeXRlICg4LWJpdCkgdmFsdWVzICovCisJdW5zaWduZWQgY2hhcgkJdWJbOF07CS8qIDggVW5zaWduZWQgQnl0ZSAqLworCWZsb2F0CQkJc1syXTsJLyogU2luZ2xlLXByZWNpc2lvbiAoMzItYml0KSB2YWx1ZSAqLworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoOCkpKSBtbXhfdDsJLyogT24gYW4gOC1ieXRlICg2NC1iaXQpIGJvdW5kYXJ5ICovCisjZW5kaWYKKworCisKKy8qCUZ1bmN0aW9uIHRvIHRlc3QgaWYgbXVsdGltZWRpYSBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZC4uLgorKi8KK3N0YXRpYyBpbnQKK21tX3N1cHBvcnQodm9pZCkKK3sKKwkvKiBSZXR1cm5zIDEgaWYgTU1YIGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkLAorCSAgIDMgaWYgQ3lyaXggTU1YIGFuZCBFeHRlbmRlZCBNTVggaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQKKwkgICA1IGlmIEFNRCBNTVggYW5kIDNETm93ISBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZAorCSAgIDAgaWYgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBhbnkgb2YgdGhlc2UKKwkqLworCXJlZ2lzdGVyIGludCBydmFsID0gMDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJLyogU2VlIGlmIENQVUlEIGluc3RydWN0aW9uIGlzIHN1cHBvcnRlZCAuLi4gKi8KKwkJLyogLi4uIEdldCBjb3BpZXMgb2YgRUZMQUdTIGludG8gZWF4IGFuZCBlY3ggKi8KKwkJInB1c2hmXG5cdCIKKwkJInBvcGwgJSVlYXhcblx0IgorCQkibW92bCAlJWVheCwgJSVlY3hcblx0IgorCisJCS8qIC4uLiBUb2dnbGUgdGhlIElEIGJpdCBpbiBvbmUgY29weSBhbmQgc3RvcmUgKi8KKwkJLyogICAgIHRvIHRoZSBFRkxBR1MgcmVnICovCisJCSJ4b3JsICQweDIwMDAwMCwgJSVlYXhcblx0IgorCQkicHVzaCAlJWVheFxuXHQiCisJCSJwb3BmXG5cdCIKKworCQkvKiAuLi4gR2V0IHRoZSAoaG9wZWZ1bGx5IG1vZGlmaWVkKSBFRkxBR1MgKi8KKwkJInB1c2hmXG5cdCIKKwkJInBvcGwgJSVlYXhcblx0IgorCisJCS8qIC4uLiBDb21wYXJlIGFuZCB0ZXN0IHJlc3VsdCAqLworCQkieG9ybCAlJWVheCwgJSVlY3hcblx0IgorCQkidGVzdGwgJDB4MjAwMDAwLCAlJWVjeFxuXHQiCisJCSJqeiBOb3RTdXBwb3J0ZWQxXG5cdCIJCS8qIENQVUlEIG5vdCBzdXBwb3J0ZWQgKi8KKworCisJCS8qIEdldCBzdGFuZGFyZCBDUFVJRCBpbmZvcm1hdGlvbiwgYW5kCisJCSAgICAgICBnbyB0byBhIHNwZWNpZmljIHZlbmRvciBzZWN0aW9uICovCisJCSJtb3ZsICQwLCAlJWVheFxuXHQiCisJCSJjcHVpZFxuXHQiCisKKwkJLyogQ2hlY2sgZm9yIEludGVsICovCisJCSJjbXBsICQweDc1NmU2NTQ3LCAlJWVieFxuXHQiCisJCSJqbmUgVHJ5QU1EXG5cdCIKKwkJImNtcGwgJDB4NDk2NTZlNjksICUlZWR4XG5cdCIKKwkJImpuZSBUcnlBTURcblx0IgorCQkiY21wbCAkMHg2YzY1NzQ2ZSwgJSVlY3hcbiIKKwkJImpuZSBUcnlBTURcblx0IgorCQkiam1wIEludGVsXG5cdCIKKworCQkvKiBDaGVjayBmb3IgQU1EICovCisJCSJcblRyeUFNRDpcblx0IgorCQkiY21wbCAkMHg2ODc0NzU0MSwgJSVlYnhcblx0IgorCQkiam5lIFRyeUN5cml4XG5cdCIKKwkJImNtcGwgJDB4Njk3NDZlNjUsICUlZWR4XG5cdCIKKwkJImpuZSBUcnlDeXJpeFxuXHQiCisJCSJjbXBsICQweDQ0NGQ0MTYzLCAlJWVjeFxuIgorCQkiam5lIFRyeUN5cml4XG5cdCIKKwkJImptcCBBTURcblx0IgorCisJCS8qIENoZWNrIGZvciBDeXJpeCAqLworCQkiXG5UcnlDeXJpeDpcblx0IgorCQkiY21wbCAkMHg2OTcyNzk0MywgJSVlYnhcblx0IgorCQkiam5lIE5vdFN1cHBvcnRlZDJcblx0IgorCQkiY21wbCAkMHg3MzZlNDk3OCwgJSVlZHhcblx0IgorCQkiam5lIE5vdFN1cHBvcnRlZDNcblx0IgorCQkiY21wbCAkMHg2NDYxNjU3NCwgJSVlY3hcblx0IgorCQkiam5lIE5vdFN1cHBvcnRlZDRcblx0IgorCQkvKiBEcm9wIHRocm91Z2ggdG8gQ3lyaXguLi4gKi8KKworCisJCS8qIEN5cml4IFNlY3Rpb24gKi8KKwkJLyogU2VlIGlmIGV4dGVuZGVkIENQVUlEIGxldmVsIDgwMDAwMDAxIGlzIHN1cHBvcnRlZCAqLworCQkvKiBUaGUgdmFsdWUgb2YgQ1BVSUQvODAwMDAwMDEgZm9yIHRoZSA2eDg2TVggaXMgdW5kZWZpbmVkCisJCSAgIGFjY29yZGluZyB0byB0aGUgQ3lyaXggQ1BVIERldGVjdGlvbiBHdWlkZSAoUHJlbGltaW5hcnkKKwkJICAgUmV2LiAxLjAxIHRhYmxlIDEpLCBzbyB3ZSdsbCBjaGVjayB0aGUgdmFsdWUgb2YgZWF4IGZvcgorCQkgICBDUFVJRC8wIHRvIHNlZSBpZiBzdGFuZGFyZCBDUFVJRCBsZXZlbCAyIGlzIHN1cHBvcnRlZC4KKwkJICAgQWNjb3JkaW5nIHRvIHRoZSB0YWJsZSwgdGhlIG9ubHkgQ1BVIHdoaWNoIHN1cHBvcnRzIGxldmVsCisJCSAgIDIgaXMgYWxzbyB0aGUgb25seSBvbmUgd2hpY2ggc3VwcG9ydHMgZXh0ZW5kZWQgQ1BVSUQgbGV2ZWxzLgorCQkqLworCQkiY21wbCAkMHgyLCAlJWVheFxuXHQiCisJCSJqbmUgTU1YdGVzdFxuXHQiCS8qIFVzZSBzdGFuZGFyZCBDUFVJRCBpbnN0ZWFkICovCisKKwkJLyogRXh0ZW5kZWQgQ1BVSUQgc3VwcG9ydGVkIChpbiB0aGVvcnkpLCBzbyBnZXQgZXh0ZW5kZWQKKwkJICAgZmVhdHVyZXMgKi8KKwkJIm1vdmwgJDB4ODAwMDAwMDEsICUlZWF4XG5cdCIKKwkJImNwdWlkXG5cdCIKKwkJInRlc3RsICQweDAwODAwMDAwLCAlJWVheFxuXHQiCS8qIFRlc3QgZm9yIE1NWCAqLworCQkianogTm90U3VwcG9ydGVkNVxuXHQiCQkvKiBNTVggbm90IHN1cHBvcnRlZCAqLworCQkidGVzdGwgJDB4MDEwMDAwMDAsICUlZWF4XG5cdCIJLyogVGVzdCBmb3IgRXh0J2QgTU1YICovCisJCSJqbnogRU1NWFN1cHBvcnRlZFxuXHQiCisJCSJtb3ZsICQxLCAlMDpcblxuXHQiCQkvKiBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cbiIKKwkJIkVNTVhTdXBwb3J0ZWQ6XG5cdCIKKwkJIm1vdmwgJDMsICUwOlxuXG5cdCIJCS8qIEVNTVggYW5kIE1NWCBTdXBwb3J0ZWQgKi8KKwkJImptcCBSZXR1cm5cblx0IgorCisKKwkJLyogQU1EIFNlY3Rpb24gKi8KKwkJIkFNRDpcblx0IgorCisJCS8qIFNlZSBpZiBleHRlbmRlZCBDUFVJRCBpcyBzdXBwb3J0ZWQgKi8KKwkJIm1vdmwgJDB4ODAwMDAwMDAsICUlZWF4XG5cdCIKKwkJImNwdWlkXG5cdCIKKwkJImNtcGwgJDB4ODAwMDAwMDAsICUlZWF4XG5cdCIKKwkJImpsIE1NWHRlc3Rcblx0IgkvKiBVc2Ugc3RhbmRhcmQgQ1BVSUQgaW5zdGVhZCAqLworCisJCS8qIEV4dGVuZGVkIENQVUlEIHN1cHBvcnRlZCwgc28gZ2V0IGV4dGVuZGVkIGZlYXR1cmVzICovCisJCSJtb3ZsICQweDgwMDAwMDAxLCAlJWVheFxuXHQiCisJCSJjcHVpZFxuXHQiCisJCSJ0ZXN0bCAkMHgwMDgwMDAwMCwgJSVlZHhcblx0IgkvKiBUZXN0IGZvciBNTVggKi8KKwkJImp6IE5vdFN1cHBvcnRlZDZcblx0IgkJLyogTU1YIG5vdCBzdXBwb3J0ZWQgKi8KKwkJInRlc3RsICQweDgwMDAwMDAwLCAlJWVkeFxuXHQiCS8qIFRlc3QgZm9yIDNETm93ISAqLworCQkiam56IFRocmVlRE5vd1N1cHBvcnRlZFxuXHQiCisJCSJtb3ZsICQxLCAlMDpcblxuXHQiCQkvKiBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cbiIKKwkJIlRocmVlRE5vd1N1cHBvcnRlZDpcblx0IgorCQkibW92bCAkNSwgJTA6XG5cblx0IgkJLyogM0ROb3chIGFuZCBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cdCIKKworCisJCS8qIEludGVsIFNlY3Rpb24gKi8KKwkJIkludGVsOlxuXHQiCisKKwkJLyogQ2hlY2sgZm9yIE1NWCAqLworCQkiTU1YdGVzdDpcblx0IgorCQkibW92bCAkMSwgJSVlYXhcblx0IgorCQkiY3B1aWRcblx0IgorCQkidGVzdGwgJDB4MDA4MDAwMDAsICUlZWR4XG5cdCIJLyogVGVzdCBmb3IgTU1YICovCisJCSJqeiBOb3RTdXBwb3J0ZWQ3XG5cdCIJCS8qIE1NWCBOb3Qgc3VwcG9ydGVkICovCisJCSJtb3ZsICQxLCAlMDpcblxuXHQiCQkvKiBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cdCIKKworCQkvKiBOb3RoaW5nIHN1cHBvcnRlZCAqLworCQkiXG5Ob3RTdXBwb3J0ZWQxOlxuXHQiCisJCSIjbW92bCAkMTAxLCAlMDpcblxuXHQiCisJCSJcbk5vdFN1cHBvcnRlZDI6XG5cdCIKKwkJIiNtb3ZsICQxMDIsICUwOlxuXG5cdCIKKwkJIlxuTm90U3VwcG9ydGVkMzpcblx0IgorCQkiI21vdmwgJDEwMywgJTA6XG5cblx0IgorCQkiXG5Ob3RTdXBwb3J0ZWQ0OlxuXHQiCisJCSIjbW92bCAkMTA0LCAlMDpcblxuXHQiCisJCSJcbk5vdFN1cHBvcnRlZDU6XG5cdCIKKwkJIiNtb3ZsICQxMDUsICUwOlxuXG5cdCIKKwkJIlxuTm90U3VwcG9ydGVkNjpcblx0IgorCQkiI21vdmwgJDEwNiwgJTA6XG5cblx0IgorCQkiXG5Ob3RTdXBwb3J0ZWQ3OlxuXHQiCisJCSIjbW92bCAkMTA3LCAlMDpcblxuXHQiCisJCSJtb3ZsICQwLCAlMDpcblxuXHQiCisKKwkJIlJldHVybjpcblx0IgorCQk6ICI9YSIgKHJ2YWwpCisJCTogLyogbm8gaW5wdXQgKi8KKwkJOiAiZWF4IiwgImVieCIsICJlY3giLCAiZWR4IgorCSk7CisKKwkvKiBSZXR1cm4gKi8KKwlyZXR1cm4ocnZhbCk7Cit9CisKKy8qCUZ1bmN0aW9uIHRvIHRlc3QgaWYgbW14IGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkLi4uCisqLworI2lmbmRlZiBfWE1NWF9ICitpbmxpbmUgZXh0ZXJuIGludAorbW14X29rKHZvaWQpCit7CisJLyogUmV0dXJucyAxIGlmIE1NWCBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZCwgMCBvdGhlcndpc2UgKi8KKwlyZXR1cm4gKCBtbV9zdXBwb3J0KCkgJiAweDEgKTsKK30KKyNlbmRpZgorCisvKglGdW5jdGlvbiB0byB0ZXN0IGlmIHhtbXggaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQuLi4KKyovCitpbmxpbmUgZXh0ZXJuIGludAoreG1teF9vayh2b2lkKQoreworCS8qIFJldHVybnMgMSBpZiBFeHRlbmRlZCBNTVggaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQsIDAgb3RoZXJ3aXNlICovCisJcmV0dXJuICggKG1tX3N1cHBvcnQoKSAmIDB4MikgPj4gMSApOworfQorCisKKy8qCUhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBpbnN0cnVjdGlvbiBtYWNyb3MgdGhhdCBmb2xsb3cuLi4KKwkobm90ZSB0aGF0IG1lbW9yeS10by1yZWdpc3RlciwgbTJyLCBpbnN0cnVjdGlvbnMgYXJlIG5lYXJseQorCSBhcyBlZmZpY2llbnQgYXMgcmVnaXN0ZXItdG8tcmVnaXN0ZXIsIHIyciwgaW5zdHJ1Y3Rpb25zOworCSBob3dldmVyLCBtZW1vcnktdG8tbWVtb3J5IGluc3RydWN0aW9ucyBhcmUgcmVhbGx5IHNpbXVsYXRlZAorCSBhcyBhIGNvbnZlbmllbmNlLCBhbmQgYXJlIG9ubHkgMS8zIGFzIGVmZmljaWVudCkKKyovCisjaWZkZWYJWE1NWF9UUkFDRQorCisvKglJbmNsdWRlIHRoZSBzdHVmZiBmb3IgcHJpbnRpbmcgYSB0cmFjZSB0byBzdGRlcnIuLi4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lCW1teF9pMnIob3AsIGltbSwgcmVnKSBcCisJeyBcCisJCW1teF90IG1teF90cmFjZTsgXAorCQltbXhfdHJhY2UudXEgPSAoaW1tKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI29wICJfaTJyKCIgI2ltbSAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI3JlZyAiPTB4JTA4eCUwOHgpID0+ICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUwLCAlJSIgI3JlZyBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCQkgICAgICA6ICJYIiAoaW1tKSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI3JlZyAiPTB4JTA4eCUwOHhcbiIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwl9CisKKyNkZWZpbmUJbW14X20ycihvcCwgbWVtLCByZWcpIFwKKwl7IFwKKwkJbW14X3QgbW14X3RyYWNlOyBcCisJCW1teF90cmFjZSA9IChtZW0pOyBcCisJCWZwcmludGYoc3RkZXJyLCAjb3AgIl9tMnIoIiAjbWVtICI9MHglMDh4JTA4eCwgIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWcgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjcmVnICI9MHglMDh4JTA4eCkgPT4gIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gXAorCQkJCSAgICAgIDogIlgiIChtZW0pKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWcgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjcmVnICI9MHglMDh4JTA4eFxuIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCX0KKworI2RlZmluZQltbXhfcjJtKG9wLCByZWcsIG1lbSkgXAorCXsgXAorCQltbXhfdCBtbXhfdHJhY2U7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI29wICJfcjJtKCIgI3JlZyAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJbW14X3RyYWNlID0gKG1lbSk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNtZW0gIj0weCUwOHglMDh4KSA9PiAiLCBcCisJCQltbXhfdHJhY2UuZFsxXSwgbW14X3RyYWNlLmRbMF0pOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlJSIgI3JlZyAiLCAlMCIgXAorCQkJCSAgICAgIDogIj1YIiAobWVtKSBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKKwkJbW14X3RyYWNlID0gKG1lbSk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNtZW0gIj0weCUwOHglMDh4XG4iLCBcCisJCQltbXhfdHJhY2UuZFsxXSwgbW14X3RyYWNlLmRbMF0pOyBcCisJfQorCisjZGVmaW5lCW1teF9yMnIob3AsIHJlZ3MsIHJlZ2QpIFwKKwl7IFwKKwkJbW14X3QgbW14X3RyYWNlOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZ3MgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjb3AgIl9yMnIoIiAjcmVncyAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnZCAiLCAlMCIgXAorCQkJCSAgICAgIDogIj1YIiAobW14X3RyYWNlKSBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNyZWdkICI9MHglMDh4JTA4eCkgPT4gIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJSIgI3JlZ3MgIiwgJSIgI3JlZ2QpOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZ2QgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjcmVnZCAiPTB4JTA4eCUwOHhcbiIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwl9CisKKyNkZWZpbmUJbW14X20ybShvcCwgbWVtcywgbWVtZCkgXAorCXsgXAorCQltbXhfdCBtbXhfdHJhY2U7IFwKKwkJbW14X3RyYWNlID0gKG1lbXMpOyBcCisJCWZwcmludGYoc3RkZXJyLCAjb3AgIl9tMm0oIiAjbWVtcyAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJbW14X3RyYWNlID0gKG1lbWQpOyBcCisJCWZwcmludGYoc3RkZXJyLCAjbWVtZCAiPTB4JTA4eCUwOHgpID0+ICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUwLCAlJW1tMFxuXHQiIFwKKwkJCQkgICAgICAjb3AgIiAlMSwgJSVtbTBcblx0IiBcCisJCQkJICAgICAgIm1vdnEgJSVtbTAsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtZW1kKSBcCisJCQkJICAgICAgOiAiWCIgKG1lbXMpKTsgXAorCQltbXhfdHJhY2UgPSAobWVtZCk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNtZW1kICI9MHglMDh4JTA4eFxuIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCX0KKworI2Vsc2UKKworLyoJVGhlc2UgbWFjcm9zIGFyZSBhIGxvdCBzaW1wbGVyIHdpdGhvdXQgdGhlIHRyYWNpbmcuLi4KKyovCisKKyNkZWZpbmUJbW14X2kycihvcCwgaW1tLCByZWcpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCisJCQkgICAgICA6ICJYIiAoaW1tKSApCisKKyNkZWZpbmUJbW14X20ycihvcCwgbWVtLCByZWcpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCisJCQkgICAgICA6ICJYIiAobWVtKSkKKworI2RlZmluZQltbXhfbTJpcihvcCwgbWVtLCBycykgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlMCwgJSUiICNycyBcCisJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gXAorCQkJICAgICAgOiAiWCIgKG1lbSkgKQorCisjZGVmaW5lCW1teF9yMm0ob3AsIHJlZywgbWVtKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUlIiAjcmVnICIsICUwIiBcCisJCQkgICAgICA6ICI9WCIgKG1lbSkgXAorCQkJICAgICAgOiAvKiBub3RoaW5nICovICkKKworI2RlZmluZQltbXhfcjJyKG9wLCByZWdzLCByZWdkKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUiICNyZWdzICIsICUiICNyZWdkKQorCisjZGVmaW5lCW1teF9yMmlyKG9wLCByczEsIHJzMikgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlJSIgI3JzMSAiLCAlJSIgI3JzMiBcCisJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gXAorCQkJICAgICAgOiAvKiBub3RoaW5nICovICkKKworI2RlZmluZQltbXhfbTJtKG9wLCBtZW1zLCBtZW1kKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUwLCAlJW1tMFxuXHQiIFwKKwkJCSAgICAgICNvcCAiICUxLCAlJW1tMFxuXHQiIFwKKwkJCSAgICAgICJtb3ZxICUlbW0wLCAlMCIgXAorCQkJICAgICAgOiAiPVgiIChtZW1kKSBcCisJCQkgICAgICA6ICJYIiAobWVtcykpCisKKyNlbmRpZgorCisKKworLyoJMXg2NCBNT1ZlIFF1YWR3b3JkCisJKHRoaXMgaXMgYm90aCBhIGxvYWQgYW5kIGEgc3RvcmUuLi4KKwkgaW4gZmFjdCwgaXQgaXMgdGhlIG9ubHkgd2F5IHRvIHN0b3JlKQorKi8KKyNkZWZpbmUJbW92cV9tMnIodmFyLCByZWcpCW1teF9tMnIobW92cSwgdmFyLCByZWcpCisjZGVmaW5lCW1vdnFfcjJtKHJlZywgdmFyKQltbXhfcjJtKG1vdnEsIHJlZywgdmFyKQorI2RlZmluZQltb3ZxX3IycihyZWdzLCByZWdkKQltbXhfcjJyKG1vdnEsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCW1vdnEodmFycywgdmFyZCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlMSwgJSVtbTBcblx0IiBcCisJCQkgICAgICAibW92cSAlJW1tMCwgJTAiIFwKKwkJCSAgICAgIDogIj1YIiAodmFyZCkgXAorCQkJICAgICAgOiAiWCIgKHZhcnMpKQorCisKKy8qCTF4MzIgTU9WZSBEb3VibGV3b3JkCisJKGxpa2UgbW92cSwgdGhpcyBpcyBib3RoIGxvYWQgYW5kIHN0b3JlLi4uCisJIGJ1dCBpcyBtb3N0IHVzZWZ1bCBmb3IgbW92aW5nIHRoaW5ncyBiZXR3ZWVuCisJIG1teCByZWdpc3RlcnMgYW5kIG9yZGluYXJ5IHJlZ2lzdGVycykKKyovCisjZGVmaW5lCW1vdmRfbTJyKHZhciwgcmVnKQltbXhfbTJyKG1vdmQsIHZhciwgcmVnKQorI2RlZmluZQltb3ZkX3IybShyZWcsIHZhcikJbW14X3IybShtb3ZkLCByZWcsIHZhcikKKyNkZWZpbmUJbW92ZF9yMnIocmVncywgcmVnZCkJbW14X3Iycihtb3ZkLCByZWdzLCByZWdkKQorI2RlZmluZQltb3ZkKHZhcnMsIHZhcmQpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmQgJTEsICUlbW0wXG5cdCIgXAorCQkJICAgICAgIm1vdmQgJSVtbTAsICUwIiBcCisJCQkgICAgICA6ICI9WCIgKHZhcmQpIFwKKwkJCSAgICAgIDogIlgiICh2YXJzKSkKKworCisKKy8qCTR4MTYgUGFyYWxsZWwgTUFHbml0dWRlCisqLworI2RlZmluZQlwbWFnd19tMnIodmFyLCByZWcpCW1teF9tMnIocG1hZ3csIHZhciwgcmVnKQorI2RlZmluZQlwbWFnd19yMnIocmVncywgcmVnZCkJbW14X3IycihwbWFndywgcmVncywgcmVnZCkKKyNkZWZpbmUJcG1hZ3codmFycywgdmFyZCkJbW14X20ybShwbWFndywgdmFycywgdmFyZCkKKworCisvKgk0eDE2IFBhcmFsbGVsIEFERHMgdXNpbmcgU2F0dXJhdGlvbiBhcml0aG1ldGljCisJYW5kIEltcGxpZWQgZGVzdGluYXRpb24KKyovCisjZGVmaW5lCXBhZGRzaXdfbTJpcih2YXIsIHJzKQkJbW14X20yaXIocGFkZHNpdywgdmFyLCBycykKKyNkZWZpbmUJcGFkZHNpd19yMmlyKHJzMSwgcnMyKQkJbW14X3IyaXIocGFkZHNpdywgcnMxLCByczIpCisjZGVmaW5lCXBhZGRzaXcodmFycywgdmFyZCkJCW1teF9tMm0ocGFkZHNpdywgdmFycywgdmFyZCkKKworCisvKgk0eDE2IFBhcmFsbGVsIFNVQnMgdXNpbmcgU2F0dXJhdGlvbiBhcml0aG1ldGljCisJYW5kIEltcGxpZWQgZGVzdGluYXRpb24KKyovCisjZGVmaW5lCXBzdWJzaXdfbTJpcih2YXIsIHJzKQkJbW14X20yaXIocHN1YnNpdywgdmFyLCBycykKKyNkZWZpbmUJcHN1YnNpd19yMmlyKHJzMSwgcnMyKQkJbW14X3IyaXIocHN1YnNpdywgcnMxLCByczIpCisjZGVmaW5lCXBzdWJzaXcodmFycywgdmFyZCkJCW1teF9tMm0ocHN1YnNpdywgdmFycywgdmFyZCkKKworCisvKgk0eDE2IFBhcmFsbGVsIE1VTHMgZ2l2aW5nIEhpZ2ggNHgxNiBwb3J0aW9ucyBvZiByZXN1bHRzCisJUm91bmRlZCB3aXRoIDEvMiBiaXQgMTUuCisqLworI2RlZmluZQlwbXVsaHJ3X20ycih2YXIsIHJlZykJbW14X20ycihwbXVsaHJ3LCB2YXIsIHJlZykKKyNkZWZpbmUJcG11bGhyd19yMnIocmVncywgcmVnZCkJbW14X3IycihwbXVsaHJ3LCByZWdzLCByZWdkKQorI2RlZmluZQlwbXVsaHJ3KHZhcnMsIHZhcmQpCW1teF9tMm0ocG11bGhydywgdmFycywgdmFyZCkKKworCisvKgk0eDE2IFBhcmFsbGVsIE1VTHMgZ2l2aW5nIEhpZ2ggNHgxNiBwb3J0aW9ucyBvZiByZXN1bHRzCisJUm91bmRlZCB3aXRoIDEvMiBiaXQgMTUsIHN0b3JpbmcgdG8gSW1wbGllZCByZWdpc3RlcgorKi8KKyNkZWZpbmUJcG11bGhyaXdfbTJpcih2YXIsIHJzKQkJbW14X20yaXIocG11bGhyaXcsIHZhciwgcnMpCisjZGVmaW5lCXBtdWxocml3X3IyaXIocnMxLCByczIpCQltbXhfcjJpcihwbXVsaHJpdywgcnMxLCByczIpCisjZGVmaW5lCXBtdWxocml3KHZhcnMsIHZhcmQpCQltbXhfbTJtKHBtdWxocml3LCB2YXJzLCB2YXJkKQorCisKKy8qCTR4MTYgUGFyYWxsZWwgTXVscyAoYW5kIEFDY3VtdWxhdGUpIGdpdmluZyBIaWdoIDR4MTYgcG9ydGlvbnMKKwlvZiByZXN1bHRzIFJvdW5kZWQgd2l0aCAxLzIgYml0IDE1LCBhY2N1bXVsYXRpbmcgd2l0aCBJbXBsaWVkIHJlZ2lzdGVyCisqLworI2RlZmluZQlwbWFjaHJpd19tMmlyKHZhciwgcnMpCQltbXhfbTJpcihwbWFjaHJpdywgdmFyLCBycykKKyNkZWZpbmUJcG1hY2hyaXdfcjJpcihyczEsIHJzMikJCW1teF9yMmlyKHBtYWNocml3LCByczEsIHJzMikKKyNkZWZpbmUJcG1hY2hyaXcodmFycywgdmFyZCkJCW1teF9tMm0ocG1hY2hyaXcsIHZhcnMsIHZhcmQpCisKKworLyoJOHg4dSBQYXJhbGxlbCBBVkVyYWdlCisqLworI2RlZmluZQlwYXZlYl9tMnIodmFyLCByZWcpCW1teF9tMnIocGF2ZWIsIHZhciwgcmVnKQorI2RlZmluZQlwYXZlYl9yMnIocmVncywgcmVnZCkJbW14X3IycihwYXZlYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGF2ZWIodmFycywgdmFyZCkJbW14X20ybShwYXZlYiwgdmFycywgdmFyZCkKKworCisvKgk4eDh1IFBhcmFsbGVsIERJU1RhbmNlIGFuZCBhY2N1bXVsYXRlIHdpdGgKKwl1bnNpZ25lZCBzYXR1cmF0aW9uIHRvIEltcGxpZWQgcmVnaXN0ZXIKKyovCisjZGVmaW5lCXBkaXN0aWJfbTJpcih2YXIsIHJzKQkJbW14X20yaXIocGRpc3RpYiwgdmFyLCBycykKKyNkZWZpbmUJcGRpc3RpYih2YXJzLCB2YXJkKQkJbW14X20ybShwZGlzdGliLCB2YXJzLCB2YXJkKQorCisKKy8qCTh4OCBQYXJhbGxlbCBjb25kaXRpb25hbCBNb1ZlCisJaWYgaW1wbGllZCByZWdpc3RlciBmaWVsZCBpcyBaZXJvCisqLworI2RlZmluZQlwbXZ6Yl9tMmlyKHZhciwgcnMpCQltbXhfbTJpcihwbXZ6YiwgdmFyLCBycykKKworCisvKgk4eDggUGFyYWxsZWwgY29uZGl0aW9uYWwgTW9WZQorCWlmIGltcGxpZWQgcmVnaXN0ZXIgZmllbGQgaXMgTm90IFplcm8KKyovCisjZGVmaW5lCXBtdm56Yl9tMmlyKHZhciwgcnMpCQltbXhfbTJpcihwbXZuemIsIHZhciwgcnMpCisKKworLyoJOHg4IFBhcmFsbGVsIGNvbmRpdGlvbmFsIE1vVmUKKwlpZiBpbXBsaWVkIHJlZ2lzdGVyIGZpZWxkIGlzIExlc3MgdGhhbiBaZXJvCisqLworI2RlZmluZQlwbXZsemJfbTJpcih2YXIsIHJzKQkJbW14X20yaXIocG12bHpiLCB2YXIsIHJzKQorCisKKy8qCTh4OCBQYXJhbGxlbCBjb25kaXRpb25hbCBNb1ZlCisJaWYgaW1wbGllZCByZWdpc3RlciBmaWVsZCBpcyBHcmVhdGVyIHRoYW4gb3IgRXF1YWwgdG8gWmVybworKi8KKyNkZWZpbmUJcG12Z2V6Yl9tMmlyKHZhciwgcnMpCQltbXhfbTJpcihwbXZnZXpiLCB2YXIsIHJzKQorCisKKy8qCUZhc3QgRW1wdHkgTU14IFN0YXRlCisJKHVzZWQgdG8gY2xlYW4tdXAgd2hlbiBnb2luZyBmcm9tIG1teCB0byBmbG9hdCB1c2UKKwkgb2YgdGhlIHJlZ2lzdGVycyB0aGF0IGFyZSBzaGFyZWQgYnkgYm90aDsgbm90ZSB0aGF0CisJIHRoZXJlIGlzIG5vIGZsb2F0LXRvLXhtbXggb3BlcmF0aW9uIG5lZWRlZCwgYmVjYXVzZQorCSBvbmx5IHRoZSBmbG9hdCB0YWcgd29yZCBpbmZvIGlzIGNvcnJ1cHRpYmxlKQorKi8KKyNpZmRlZglYTU1YX1RSQUNFCisKKyNkZWZpbmUJZmVtbXMoKSBcCisJeyBcCisJCWZwcmludGYoc3RkZXJyLCAiZmVtbXMoKVxuIik7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJmZW1tcyIpOyBcCisJfQorCisjZWxzZQorCisjZGVmaW5lCWZlbW1zKCkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImZlbW1zIikKKworI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9nc3QvZ29vbTJrMS8uZ2l0aWdub3JlIGIvZ3N0L2dvb20yazEvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDFkNzgwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20yazEvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDggQEAKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorKi5vCisqLmxvCisqLmxhCisuZGVwcworLmxpYnMKKwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20yazEvTWFrZWZpbGUuYW0gYi9nc3QvZ29vbTJrMS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzViYjcxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20yazEvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyOSBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0Z29vbTJrMS5sYQorCitHT09NX0ZJTFRFUl9GSUxFUyA9IGZpbHRlcnMuYworR09PTV9GSUxURVJfQ0ZMQUdTID0gLVVNTVggLVVVU0VfQVNNCisKK25vaW5zdF9IRUFERVJTID0gZ3N0Z29vbS5oIGZpbHRlcnMuaCBnb29tX2NvcmUuaCBnb29tX3Rvb2xzLmggZ3JhcGhpYy5oIGxpbmVzLmgKKworbGliZ3N0Z29vbTJrMV9sYV9TT1VSQ0VTID0gZ3N0Z29vbS5jIGdvb21fY29yZS5jICQoR09PTV9GSUxURVJfRklMRVMpIGdyYXBoaWMuYyBcCisgICAgICAgICBsaW5lcy5jCisKK2xpYmdzdGdvb20yazFfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykgJChHT09NX0ZJTFRFUl9DRkxBR1MpIFwKKwktRGdzdF9nb29tX2dldF90eXBlPWdzdF9nb29tMmsxX2dldF90eXBlCQlcCisJLURnb29tX2luaXQ9Z29vbTJrMV9pbml0CQkJCVwKKwktRGdvb21fY2xvc2U9Z29vbTJrMV9jbG9zZSAtRGdvb21fdXBkYXRlPWdvb20yazFfdXBkYXRlCVwKKwktRGdvb21fc2V0X3Jlc29sdXRpb249Z29vbTJrMV9zZXRfcmVzb2x1dGlvbgkJXAorCS1EZ29vbV9saW5lcz1nb29tMmsxX2xpbmVzCQkJCVwKKwktREJMQUNLPUdPT00ySzFfQkxBQ0sgLURXSElURT1HT09NMksxX1dISVRFCQlcCisJLURSRUQ9R09PTTJLMV9SRUQgLURCTFVFPUdPT00ySzFfQkxVRQkJCVwKKwktREdSRUVOPUdPT00ySzFfR1JFRU4gLURZRUxMT1c9R09PTTJLMV9ZRUxMT1cJCVwKKwktRE9SQU5HRT1HT09NMksxX09SQU5HRSAtRFZJT0xFVD1HT09NMksxX1ZJT0xFVAkJXAorCS1Eem9vbUZpbHRlckZhc3RSR0I9em9vbUZpbHRlckZhc3RSR0IyazEJCVwKKwktRHBvaW50RmlsdGVyPXBvaW50RmlsdGVyMmsxCQkJCVwKKwktRHpvb21GaWx0ZXJEZXN0cm95PXpvb21GaWx0ZXJEZXN0cm95MmsxCQlcCisJLUR6b29tRmlsdGVyTmV3PXpvb21GaWx0ZXJOZXcyazEKKworbGliZ3N0Z29vbTJrMV9sYV9MSUJBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RwYnV0aWxzLSQoR1NUX0FQSV9WRVJTSU9OKSAkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoTElCTSkKK2xpYmdzdGdvb20yazFfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitFWFRSQV9ESVNUID0gZmlsdGVycy5jCmRpZmYgLS1naXQgYS9nc3QvZ29vbTJrMS9SRUFETUUgYi9nc3QvZ29vbTJrMS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEyY2YxYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tMmsxL1JFQURNRQpAQCAtMCwwICsxLDUgQEAKK1RoZSBHb29tIHBsdWdpbiBpcyBiYXNlZCBvbiB0aGUgR29vbSB2aXN1YWxpemF0aW9uIGNvZGUgZnJvbQordGhlIEdvb20gaG9tZXBhZ2UgZm91bmQgYXQ6IAoraHR0cDovL2lvcy5mcmVlLmZyLz9wYWdlPXByb2pldCZxdW9pPTEgCisKK0xpa2UgdGhlIG9yaWdpbmFsIGxpYnJhcnkgc28gaXMgdGhlIEdvb20gcGx1Z2luIGF2YWlsYWJsZSB1bmRlciB0aGUgTEdQTCBsaWNlbnNlCmRpZmYgLS1naXQgYS9nc3QvZ29vbTJrMS9maWx0ZXJzLmMgYi9nc3QvZ29vbTJrMS9maWx0ZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QxYjkyYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tMmsxL2ZpbHRlcnMuYwpAQCAtMCwwICsxLDUzMSBAQAorLyogZmlsdGVyLmMgdmVyc2lvbiAwLjcKKyAqIGNvbnRpZW50IGxlcyBmaWx0cmVzIGFwcGxpY2FibGUgYSB1biBidWZmZXIKKyAqIGNyZWF0aW9uIDogMDEvMTAvMjAwMAorICogIC1ham91dCBkZSBzaW5GaWx0ZXIoKQorICogIC1ham91dCBkZSB6b29tRmlsdGVyKCkKKyAqICAtY29waWUgZGUgem9vbUZpbHRlcigpIGVuIHpvb21GaWx0ZXJSR0IoKSwgZ8OpcmFudCBsZXMgMyBjb3VsZXVycworICogIC1vcHRpbWlzYXRpb24gZGUgc2luRmlsdGVyICh1dGlsaXNhbnQgdW5lIHRhYmxlIGRlIHNpbikKKyAqICAgICAgLWFzbQorICogICAgICAtb3B0aW1pc2F0aW9uIGRlIGxhIHByb2NlZHVyZSBkZSBnw6luw6lyYXRpb24gZHUgYnVmZmVyIGRlIHRyYW5zZm9ybWF0aW9uCisgKiAgICAgICAgICAgICAgbGEgdml0ZXNzZSBlc3QgbWFpbnRlbmFudCBjb21wcmlzZSBkYW5zIFswLi4xMjhdIGF1IGxpZXUgZGUgWzAuLjEwMF0KKyovCisKKy8qI2RlZmluZSBfREVCVUdfUElYRUw7ICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImZpbHRlcnMuaCIKKyNpbmNsdWRlICJncmFwaGljLmgiCisjaW5jbHVkZSAiZ29vbV90b29scy5oIgorI2luY2x1ZGUgImdvb21fY29yZS5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgTU1YCisjZGVmaW5lIFVTRV9BU00KKyNlbmRpZgorI2lmZGVmIFBPV0VSUEMKKyNkZWZpbmUgVVNFX0FTTQorI2VuZGlmCisKKyNpZmRlZiBVU0VfQVNNCisjZGVmaW5lIEVGRkVDVF9ESVNUT1JTIDQKKyNlbHNlCisjZGVmaW5lIEVGRkVDVF9ESVNUT1JTIDEwCisjZW5kaWYKKworCisjaWZkZWYgVVNFX0FTTQorCisjaWZkZWYgTU1YCitpbnQgbW14X3pvb20gKCk7CitndWludDMyIG1teF96b29tX3NpemU7CisjZW5kaWYgLyogTU1YICovCisKKyNpZmRlZiBQT1dFUlBDCitleHRlcm4gdW5zaWduZWQgaW50IHVzZUFsdGl2ZWM7CitleHRlcm4gdm9pZCBwcGNfem9vbSAodm9pZCk7CitleHRlcm4gdm9pZCBwcGNfem9vbV9hbHRpdmVjICh2b2lkKTsKK3Vuc2lnbmVkIGludCBwcGNzaXplNDsKKyNlbmRpZiAvKiBQb3dlclBDICovCisKKwordW5zaWduZWQgaW50ICpjb2VmZnMgPSAwLCAqZnJlZWNvZWZmcyA9IDA7CitndWludDMyICpleHBpeDEgPSAwOyAgICAgICAgICAgIC8qIHBvaW50ZXVyIGV4cG9ydGUgdmVycyBwMSAqLworZ3VpbnQzMiAqZXhwaXgyID0gMDsgICAgICAgICAgICAvKiBwb2ludGV1ciBleHBvcnRlIHZlcnMgcDIgKi8KK2d1aW50MzIgem9vbV93aWR0aDsKKyNlbmRpZiAvKiBBU00gKi8KKworCitzdGF0aWMgaW50IGZpcnN0VGltZSA9IDE7CitzdGF0aWMgaW50IHNpbnRhYmxlWzB4ZmZmZl07CisKK1pvb21GaWx0ZXJEYXRhICoKK3pvb21GaWx0ZXJOZXcgKHZvaWQpCit7CisgIFpvb21GaWx0ZXJEYXRhICp6ZiA9IG1hbGxvYyAoc2l6ZW9mIChab29tRmlsdGVyRGF0YSkpOworCisgIHpmLT52aXRlc3NlID0gMTI4OworICB6Zi0+cGVydGVkZWMgPSA4OworICB6Zi0+c3FydHBlcnRlID0gMTY7CisgIHpmLT5taWRkbGVYID0gMTsKKyAgemYtPm1pZGRsZVkgPSAxOworICB6Zi0+cmV2ZXJzZSA9IDA7CisgIHpmLT5tb2RlID0gV0FWRV9NT0RFOworICB6Zi0+aFBsYW5lRWZmZWN0ID0gMDsKKyAgemYtPnZQbGFuZUVmZmVjdCA9IDA7CisgIHpmLT5ub2lzaWZ5ID0gMDsKKyAgemYtPmJ1ZmZzaXplID0gMDsKKyAgemYtPnJlc194ID0gMDsKKyAgemYtPnJlc195ID0gMDsKKworICB6Zi0+YnVmZmVyID0gTlVMTDsKKyAgemYtPmZpcmVkZWMgPSBOVUxMOworCisgIHpmLT53YXZlID0gMDsKKyAgemYtPndhdmVzcCA9IDA7CisKKyAgcmV0dXJuIHpmOworfQorCisvKiByZXRvdXJuZSB4Pj5zICwgZW4gdGVzdGFudCBsZSBzaWduZSBkZSB4ICovCitzdGF0aWMgaW5saW5lIGludAorU2hpZnRSaWdodCAoaW50IHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgcykKK3sKKyAgaWYgKHggPCAwKQorICAgIHJldHVybiAtKC14ID4+IHMpOworICBlbHNlCisgICAgcmV0dXJuIHggPj4gczsKK30KKworLyoKKyAgY2FsY3VsZXIgcHggZXQgcHkgZW4gZm9uY3Rpb24gZGUgeCx5LG1pZGRsZVgsbWlkZGxlWSBldCB0aGVNb2RlCisgIHB4IGV0IHB5IGluZGlxdWUgbGEgbm91dmVsbGUgcG9zaXRpb24gKGVuIHNxcnRwZXJ0ZSBpZW1lIGRlIHBpeGVsKQorICAodmFsZXVyICogMTYpCisqLworc3RhdGljIHZvaWQKK2NhbGN1bGF0ZVBYYW5kUFkgKEdvb21EYXRhICogZ2QsIGludCB4LCBpbnQgeSwgaW50ICpweCwgaW50ICpweSkKK3sKKyAgWm9vbUZpbHRlckRhdGEgKnpmID0gZ2QtPnpmZDsKKyAgaW50IG1pZGRsZVgsIG1pZGRsZVk7CisgIGd1aW50MzIgcmVzb2x5ID0gemYtPnJlc195OworICBpbnQgdlBsYW5lRWZmZWN0ID0gemYtPnZQbGFuZUVmZmVjdDsKKyAgaW50IGhQbGFuZUVmZmVjdCA9IHpmLT5oUGxhbmVFZmZlY3Q7CisgIGludCB2aXRlc3NlID0gemYtPnZpdGVzc2U7CisgIGNoYXIgdGhlTW9kZSA9IHpmLT5tb2RlOworCisgIGlmICh0aGVNb2RlID09IFdBVEVSX01PREUpIHsKKyAgICBpbnQgd2F2ZXNwID0gemYtPndhdmVzcDsKKyAgICBpbnQgd2F2ZSA9IHpmLT53YXZlOworICAgIGludCB5eSA9IHkgKyBSQU5EIChnZCkgJSA0ICsgd2F2ZSAvIDEwOworCisgICAgeXkgLT0gUkFORCAoZ2QpICUgNDsKKyAgICBpZiAoeXkgPCAwKQorICAgICAgeXkgPSAwOworICAgIGlmICh5eSA+PSByZXNvbHkpCisgICAgICB5eSA9IHJlc29seSAtIDE7CisKKyAgICAqcHggPSAoeCA8PCA0KSArIHpmLT5maXJlZGVjW3l5XSArICh3YXZlIC8gMTApOworICAgICpweSA9ICh5IDw8IDQpICsgMTMyIC0gKCh2aXRlc3NlIDwgMTMyKSA/IHZpdGVzc2UgOiAxMzEpOworCisgICAgd2F2ZXNwICs9IFJBTkQgKGdkKSAlIDM7CisgICAgd2F2ZXNwIC09IFJBTkQgKGdkKSAlIDM7CisgICAgaWYgKHdhdmUgPCAtMTApCisgICAgICB3YXZlc3AgKz0gMjsKKyAgICBpZiAod2F2ZSA+IDEwKQorICAgICAgd2F2ZXNwIC09IDI7CisgICAgd2F2ZSArPSAod2F2ZXNwIC8gMTApICsgUkFORCAoZ2QpICUgMzsKKyAgICB3YXZlIC09IFJBTkQgKGdkKSAlIDM7CisgICAgaWYgKHdhdmVzcCA+IDEwMCkKKyAgICAgIHdhdmVzcCA9ICh3YXZlc3AgKiA5KSAvIDEwOworCisgICAgemYtPndhdmVzcCA9IHdhdmVzcDsKKyAgICB6Zi0+d2F2ZSA9IHdhdmU7CisgIH0gZWxzZSB7CisgICAgaW50IGRpc3Q7CisgICAgcmVnaXN0ZXIgaW50IHZ4LCB2eTsKKyAgICBpbnQgZnZpdGVzc2UgPSB2aXRlc3NlIDw8IDQ7CisKKyAgICBtaWRkbGVYID0gemYtPm1pZGRsZVg7CisgICAgbWlkZGxlWSA9IHpmLT5taWRkbGVZOworCisgICAgaWYgKHpmLT5ub2lzaWZ5KSB7CisgICAgICB4ICs9IFJBTkQgKGdkKSAlIHpmLT5ub2lzaWZ5OworICAgICAgeCAtPSBSQU5EIChnZCkgJSB6Zi0+bm9pc2lmeTsKKyAgICAgIHkgKz0gUkFORCAoZ2QpICUgemYtPm5vaXNpZnk7CisgICAgICB5IC09IFJBTkQgKGdkKSAlIHpmLT5ub2lzaWZ5OworICAgIH0KKworICAgIGlmIChoUGxhbmVFZmZlY3QpCisgICAgICB2eCA9ICgoeCAtIG1pZGRsZVgpIDw8IDkpICsgaFBsYW5lRWZmZWN0ICogKHkgLSBtaWRkbGVZKTsKKyAgICBlbHNlCisgICAgICB2eCA9ICh4IC0gbWlkZGxlWCkgPDwgOTsKKworICAgIGlmICh2UGxhbmVFZmZlY3QpCisgICAgICB2eSA9ICgoeSAtIG1pZGRsZVkpIDw8IDkpICsgdlBsYW5lRWZmZWN0ICogKHggLSBtaWRkbGVYKTsKKyAgICBlbHNlCisgICAgICB2eSA9ICh5IC0gbWlkZGxlWSkgPDwgOTsKKworICAgIHN3aXRjaCAodGhlTW9kZSkgeworICAgICAgY2FzZSBXQVZFX01PREU6CisgICAgICAgIGRpc3QgPQorICAgICAgICAgICAgU2hpZnRSaWdodCAodngsIDkpICogU2hpZnRSaWdodCAodngsIDkpICsgU2hpZnRSaWdodCAodnksCisgICAgICAgICAgICA5KSAqIFNoaWZ0UmlnaHQgKHZ5LCA5KTsKKyAgICAgICAgZnZpdGVzc2UgKj0KKyAgICAgICAgICAgIDEwMjQgKworICAgICAgICAgICAgU2hpZnRSaWdodCAoc2ludGFibGVbKHVuc2lnbmVkIHNob3J0KSAoMHhmZmZmICogZGlzdCAqCisgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9ESVNUT1JTKV0sIDYpOworICAgICAgICBmdml0ZXNzZSAvPSAxMDI0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ1JZU1RBTF9CQUxMX01PREU6CisgICAgICAgIGRpc3QgPQorICAgICAgICAgICAgU2hpZnRSaWdodCAodngsIDkpICogU2hpZnRSaWdodCAodngsIDkpICsgU2hpZnRSaWdodCAodnksCisgICAgICAgICAgICA5KSAqIFNoaWZ0UmlnaHQgKHZ5LCA5KTsKKyAgICAgICAgZnZpdGVzc2UgKz0gKGRpc3QgKiBFRkZFQ1RfRElTVE9SUyA+PiAxMCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBTVVMRVRURV9NT0RFOgorICAgICAgICBkaXN0ID0KKyAgICAgICAgICAgIFNoaWZ0UmlnaHQgKHZ4LCA5KSAqIFNoaWZ0UmlnaHQgKHZ4LCA5KSArIFNoaWZ0UmlnaHQgKHZ5LAorICAgICAgICAgICAgOSkgKiBTaGlmdFJpZ2h0ICh2eSwgOSk7CisgICAgICAgIGZ2aXRlc3NlIC09IChkaXN0ICogRUZGRUNUX0RJU1RPUlMgPj4gNCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTQ1JVTkNIX01PREU6CisgICAgICAgIGRpc3QgPQorICAgICAgICAgICAgU2hpZnRSaWdodCAodngsIDkpICogU2hpZnRSaWdodCAodngsIDkpICsgU2hpZnRSaWdodCAodnksCisgICAgICAgICAgICA5KSAqIFNoaWZ0UmlnaHQgKHZ5LCA5KTsKKyAgICAgICAgZnZpdGVzc2UgLT0gKGRpc3QgKiBFRkZFQ1RfRElTVE9SUyA+PiA5KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICh2eCA8IDApCisgICAgICAqcHggPSAobWlkZGxlWCA8PCA0KSAtICgtKHZ4ICogZnZpdGVzc2UpID4+IDE2KTsKKyAgICBlbHNlCisgICAgICAqcHggPSAobWlkZGxlWCA8PCA0KSArICgodnggKiBmdml0ZXNzZSkgPj4gMTYpOworICAgIGlmICh2eSA8IDApCisgICAgICAqcHkgPSAobWlkZGxlWSA8PCA0KSAtICgtKHZ5ICogZnZpdGVzc2UpID4+IDE2KTsKKyAgICBlbHNlCisgICAgICAqcHkgPSAobWlkZGxlWSA8PCA0KSArICgodnkgKiBmdml0ZXNzZSkgPj4gMTYpOworICB9Cit9CisKKy8qI2RlZmluZSBfREVCVUcgKi8KKworc3RhdGljIGlubGluZSB2b2lkCitzZXRQaXhlbFJHQiAoVWludCAqIGJ1ZmZlciwgVWludCB4LCBVaW50IHksIENvbG9yIGMsCisgICAgZ3VpbnQzMiByZXNvbHgsIGd1aW50MzIgcmVzb2x5KQoreworLyogICAgICAgICAgICAgIGJ1ZmZlclsgeSpXSURUSCArIHggXSA9IChjLnI8PDE2KXwoYy52PDw4KXxjLmIgKi8KKyNpZmRlZiBfREVCVUdfUElYRUwKKyAgaWYgKHggKyB5ICogcmVzb2x4ID49IHJlc29seCAqIHJlc29seSkgeworICAgIGZwcmludGYgKHN0ZGVyciwgInNldFBpeGVsIEVSUk9SIDogaG9ycyBkdSB0YWJsZWF1Li4uICVpLCAlaVxuIiwgeCwgeSk7CisgICAgLypleGl0ICgxKSA7ICovCisgIH0KKyNlbmRpZgorCisjaWZkZWYgVVNFX0RHQQorICBidWZmZXJbeSAqIHJlc29seCArIHhdID0gKGMuYiA8PCAxNikgfCAoYy52IDw8IDgpIHwgYy5yOworI2Vsc2UKKyAgYnVmZmVyW3kgKiByZXNvbHggKyB4XSA9IChjLnIgPDwgMTYpIHwgKGMudiA8PCA4KSB8IGMuYjsKKyNlbmRpZgorfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2V0UGl4ZWxSR0JfIChVaW50ICogYnVmZmVyLCBVaW50IHgsIENvbG9yIGMsIGd1aW50MzIgcmVzb2x4LCBndWludDMyIHJlc29seSkKK3sKKyNpZmRlZiBfREVCVUcKKyAgaWYgKHggPj0gcmVzb2x4ICogcmVzb2x5KSB7CisgICAgcHJpbnRmICgic2V0UGl4ZWwgRVJST1IgOiBob3JzIGR1IHRhYmxlYXUuLi4gJWkgPj0gJWkqJWkgKCVpKVxuIiwgeCwgcmVzb2x4LAorICAgICAgICByZXNvbHksIHJlc29seCAqIHJlc29seSk7CisgICAgZXhpdCAoMSk7CisgIH0KKyNlbmRpZgorCisjaWZkZWYgVVNFX0RHQQorICBidWZmZXJbeF0gPSAoYy5iIDw8IDE2KSB8IChjLnYgPDwgOCkgfCBjLnI7CisjZWxzZQorICBidWZmZXJbeF0gPSAoYy5yIDw8IDE2KSB8IChjLnYgPDwgOCkgfCBjLmI7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkCitnZXRQaXhlbFJHQl8gKFVpbnQgKiBidWZmZXIsIFVpbnQgeCwgQ29sb3IgKiBjLCBndWludDMyIHJlc29seCwgZ3VpbnQzMiByZXNvbHkpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnRtcDg7CisKKyNpZmRlZiBfREVCVUcKKyAgaWYgKHggPj0gcmVzb2x4ICogcmVzb2x5KSB7CisgICAgcHJpbnRmICgiZ2V0UGl4ZWwgRVJST1IgOiBob3JzIGR1IHRhYmxlYXUuLi4gJWlcbiIsIHgpOworICAgIGV4aXQgKDEpOworICB9CisjZW5kaWYKKworI2lmZGVmIF9fQklHX0VORElBTl9fCisgIGMtPmIgPSAqKHVuc2lnbmVkIGNoYXIgKikgKHRtcDggPSAodW5zaWduZWQgY2hhciAqKSAoYnVmZmVyICsgeCkpOworICBjLT5yID0gKih1bnNpZ25lZCBjaGFyICopICgrK3RtcDgpOworICBjLT52ID0gKih1bnNpZ25lZCBjaGFyICopICgrK3RtcDgpOworICBjLT5iID0gKih1bnNpZ25lZCBjaGFyICopICgrK3RtcDgpOworCisjZWxzZQorICAvKiBBVFRFTlRJT04gQVUgUEVUSVQgSU5ESUVOICAqLworICB0bXA4ID0gKHVuc2lnbmVkIGNoYXIgKikgKGJ1ZmZlciArIHgpOworICBjLT5iID0gKih1bnNpZ25lZCBjaGFyICopICh0bXA4KyspOworICBjLT52ID0gKih1bnNpZ25lZCBjaGFyICopICh0bXA4KyspOworICBjLT5yID0gKih1bnNpZ25lZCBjaGFyICopICh0bXA4KTsKKy8qICAgICAgKmMgPSAoQ29sb3IpIGJ1ZmZlclt4K3kqV0lEVEhdIDsgKi8KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorem9vbUZpbHRlclNldFJlc29sdXRpb24gKEdvb21EYXRhICogZ2QsIFpvb21GaWx0ZXJEYXRhICogemYpCit7CisgIHVuc2lnbmVkIHNob3J0IHVzOworCisgIGlmICh6Zi0+YnVmZnNpemUgPj0gZ2QtPmJ1ZmZzaXplKSB7CisgICAgemYtPnJlc194ID0gZ2QtPnJlc29seDsKKyAgICB6Zi0+cmVzX3kgPSBnZC0+cmVzb2x5OworICAgIHpmLT5taWRkbGVYID0gZ2QtPnJlc29seCAvIDI7CisgICAgemYtPm1pZGRsZVkgPSBnZC0+cmVzb2x5IC0gMTsKKworICAgIHJldHVybjsKKyAgfQorI2lmbmRlZiBVU0VfQVNNCisgIGlmICh6Zi0+YnVmZmVyKQorICAgIGZyZWUgKHpmLT5idWZmZXIpOworICB6Zi0+YnVmZmVyID0gMDsKKyNlbHNlCisgIGlmIChjb2VmZnMpCisgICAgZnJlZSAoZnJlZWNvZWZmcyk7CisgIGNvZWZmcyA9IDA7CisjZW5kaWYKKyAgemYtPm1pZGRsZVggPSBnZC0+cmVzb2x4IC8gMjsKKyAgemYtPm1pZGRsZVkgPSBnZC0+cmVzb2x5IC0gMTsKKyAgemYtPnJlc194ID0gZ2QtPnJlc29seDsKKyAgemYtPnJlc195ID0gZ2QtPnJlc29seTsKKworICBpZiAoemYtPmZpcmVkZWMpCisgICAgZnJlZSAoemYtPmZpcmVkZWMpOworICB6Zi0+ZmlyZWRlYyA9IDA7CisKKyAgemYtPmJ1ZmZzaXplID0gZ2QtPnJlc29seCAqIGdkLT5yZXNvbHkgKiBzaXplb2YgKHVuc2lnbmVkIGludCk7CisKKyNpZmRlZiBVU0VfQVNNCisgIGZyZWVjb2VmZnMgPSAodW5zaWduZWQgaW50ICopCisgICAgICBtYWxsb2MgKHJlc3ggKiByZXN5ICogMiAqIHNpemVvZiAodW5zaWduZWQgaW50KSArIDEyOCk7CisgIGNvZWZmcyA9IChndWludDMyICopICgoMSArICgodW5zaWduZWQgaW50KSAoZnJlZWNvZWZmcykpIC8gMTI4KSAqIDEyOCk7CisKKyNlbHNlCisgIHpmLT5idWZmZXIgPSBjYWxsb2MgKHNpemVvZiAoZ3VpbnQzMiksIHpmLT5idWZmc2l6ZSAqIDUpOworICB6Zi0+cG9zMTAgPSB6Zi0+YnVmZmVyOworICB6Zi0+Y1swXSA9IHpmLT5wb3MxMCArIHpmLT5idWZmc2l6ZTsKKyAgemYtPmNbMV0gPSB6Zi0+Y1swXSArIHpmLT5idWZmc2l6ZTsKKyAgemYtPmNbMl0gPSB6Zi0+Y1sxXSArIHpmLT5idWZmc2l6ZTsKKyAgemYtPmNbM10gPSB6Zi0+Y1syXSArIHpmLT5idWZmc2l6ZTsKKyNlbmRpZgorICB6Zi0+ZmlyZWRlYyA9IChpbnQgKikgbWFsbG9jICh6Zi0+cmVzX3kgKiBzaXplb2YgKGludCkpOworCisgIGlmIChmaXJzdFRpbWUpIHsKKyAgICBmaXJzdFRpbWUgPSAwOworCisgICAgLyogZ2VuZXJhdGlvbiBkJ3VuZSB0YWJsZSBkZSBzaW51cyAqLworICAgIGZvciAodXMgPSAwOyB1cyA8IDB4ZmZmZjsgdXMrKykgeworICAgICAgc2ludGFibGVbdXNdID0gKGludCkgKDEwMjQuMGYgKiBzaW4gKHVzICogMiAqIDMuMzE0MTVmIC8gMHhmZmZmKSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQKK3pvb21GaWx0ZXJEZXN0cm95IChab29tRmlsdGVyRGF0YSAqIHpmKQoreworICBpZiAoemYpIHsKKyAgICBpZiAoemYtPmZpcmVkZWMpCisgICAgICBmcmVlICh6Zi0+ZmlyZWRlYyk7CisgICAgaWYgKHpmLT5idWZmZXIpCisgICAgICBmcmVlICh6Zi0+YnVmZmVyKTsKKyAgICBmcmVlICh6Zik7CisgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZAorem9vbUZpbHRlckZhc3RSR0IgKEdvb21EYXRhICogZ29vbWRhdGEsIFpvb21GaWx0ZXJEYXRhICogemYsIGludCB6ZmRfdXBkYXRlKQoreworICBndWludDMyIHByZXZYID0gZ29vbWRhdGEtPnJlc29seDsKKyAgZ3VpbnQzMiBwcmV2WSA9IGdvb21kYXRhLT5yZXNvbHk7CisKKyAgZ3VpbnQzMiAqcGl4MSA9IGdvb21kYXRhLT5wMTsKKyAgZ3VpbnQzMiAqcGl4MiA9IGdvb21kYXRhLT5wMjsKKyAgdW5zaWduZWQgaW50ICpwb3MxMDsKKyAgdW5zaWduZWQgaW50ICoqYzsKKworICBVaW50IHgsIHk7CisKKy8qICBzdGF0aWMgdW5zaWduZWQgaW50IHByZXZYID0gMCwgcHJldlkgPSAwOyAqLworCisjaWZkZWYgVVNFX0FTTQorICBleHBpeDEgPSBwaXgxOworICBleHBpeDIgPSBwaXgyOworI2Vsc2UKKyAgQ29sb3IgY291bGV1cjsKKyAgQ29sb3IgY29sMSwgY29sMiwgY29sMywgY29sNDsKKyAgVWludCBwb3NpdGlvbjsKKyNlbmRpZgorCisgIGlmICgoZ29vbWRhdGEtPnJlc29seCAhPSB6Zi0+cmVzX3gpIHx8IChnb29tZGF0YS0+cmVzb2x5ICE9IHpmLT5yZXNfeSkpIHsKKyAgICB6b29tRmlsdGVyU2V0UmVzb2x1dGlvbiAoZ29vbWRhdGEsIHpmKTsKKyAgfQorCisgIHBvczEwID0gemYtPnBvczEwOworICBjID0gemYtPmM7CisKKyAgaWYgKHpmZF91cGRhdGUpIHsKKyAgICBndWNoYXIgc3FydHBlcnRlID0gemYtPnNxcnRwZXJ0ZTsKKyAgICBnaW50IHN0YXJ0X3kgPSAwOworCisgICAgaWYgKHpmLT5yZXZlcnNlKQorICAgICAgemYtPnZpdGVzc2UgPSAyNTYgLSB6Zi0+dml0ZXNzZTsKKworICAgIC8qIGdlbmVyYXRpb24gZHUgYnVmZmVyICovCisgICAgZm9yICh5ID0gMDsgeSA8IHpmLT5yZXNfeTsgeSsrKSB7CisgICAgICBnaW50IHlfMTYgPSB5IDw8IDQ7CisgICAgICBnaW50IG1heF9weCA9IChwcmV2WCAtIDEpICogc3FydHBlcnRlOworICAgICAgZ2ludCBtYXhfcHkgPSAocHJldlkgLSAxKSAqIHNxcnRwZXJ0ZTsKKworICAgICAgZm9yICh4ID0gMDsgeCA8IHpmLT5yZXNfeDsgeCsrKSB7CisgICAgICAgIGdpbnQgcHgsIHB5OworICAgICAgICBndWNoYXIgY29lZnYsIGNvZWZoOworCisgICAgICAgIC8qIGNhbGN1bGVyIHB4IGV0IHB5IGVuIGZvbmN0aW9uIGRlICovCisgICAgICAgIC8qICAgeCx5LG1pZGRsZVgsbWlkZGxlWSBldCB0aGVNb2RlICovCisgICAgICAgIGNhbGN1bGF0ZVBYYW5kUFkgKGdvb21kYXRhLCB4LCB5LCAmcHgsICZweSk7CisKKyAgICAgICAgaWYgKChweCA9PSB4IDw8IDQpICYmIChweSA9PSB5XzE2KSkKKyAgICAgICAgICBweSArPSA4OworCisgICAgICAgIGlmICgocHkgPCAwKSB8fCAocHggPCAwKSB8fCAocHkgPj0gbWF4X3B5KSB8fCAocHggPj0gbWF4X3B4KSkgeworI2lmZGVmIFVTRV9BU00KKyAgICAgICAgICBjb2VmZnNbKHkgKiBwcmV2WCArIHgpICogMl0gPSAwOworICAgICAgICAgIGNvZWZmc1soeSAqIHByZXZYICsgeCkgKiAyICsgMV0gPSAwOworI2Vsc2UKKyAgICAgICAgICBwb3MxMFtzdGFydF95ICsgeF0gPSAwOworICAgICAgICAgIGNbMF1bc3RhcnRfeSArIHhdID0gMDsKKyAgICAgICAgICBjWzFdW3N0YXJ0X3kgKyB4XSA9IDA7CisgICAgICAgICAgY1syXVtzdGFydF95ICsgeF0gPSAwOworICAgICAgICAgIGNbM11bc3RhcnRfeSArIHhdID0gMDsKKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGludCBucHgxMDsKKyAgICAgICAgICBpbnQgbnB5MTA7CisgICAgICAgICAgaW50IHBvczsKKworICAgICAgICAgIG5weDEwID0gKHB4IC8gc3FydHBlcnRlKTsKKyAgICAgICAgICBucHkxMCA9IChweSAvIHNxcnRwZXJ0ZSk7CisKKy8qICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5weDEwID49IHByZXZYKSBmcHJpbnRmKHN0ZGVyciwiZXJyb3IgbnB4OiVkIixucHgxMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChucHkxMCA+PSBwcmV2WSkgZnByaW50ZihzdGRlcnIsImVycm9yIG5weTolZCIsbnB5MTApOworKi8KKyAgICAgICAgICBjb2VmaCA9IHB4ICUgc3FydHBlcnRlOworICAgICAgICAgIGNvZWZ2ID0gcHkgJSBzcXJ0cGVydGU7CisjaWZkZWYgVVNFX0FTTQorICAgICAgICAgIHBvcyA9ICh5ICogcHJldlggKyB4KSAqIDI7CisgICAgICAgICAgY29lZmZzW3Bvc10gPSAobnB4MTAgKyBwcmV2WCAqIG5weTEwKSAqIDQ7CisKKyAgICAgICAgICBpZiAoIShjb2VmaCB8fCBjb2VmdikpCisgICAgICAgICAgICBjb2VmZnNbcG9zICsgMV0gPSAoc3FydHBlcnRlICogc3FydHBlcnRlIC0gMSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgY29lZmZzW3BvcyArIDFdID0gKChzcXJ0cGVydGUgLSBjb2VmaCkgKiAoc3FydHBlcnRlIC0gY29lZnYpKTsKKworICAgICAgICAgIGNvZWZmc1twb3MgKyAxXSB8PSAoY29lZmggKiAoc3FydHBlcnRlIC0gY29lZnYpKSA8PCA4OworICAgICAgICAgIGNvZWZmc1twb3MgKyAxXSB8PSAoKHNxcnRwZXJ0ZSAtIGNvZWZoKSAqIGNvZWZ2KSA8PCAxNjsKKyAgICAgICAgICBjb2VmZnNbcG9zICsgMV0gfD0gKGNvZWZoICogY29lZnYpIDw8IDI0OworI2Vsc2UKKyAgICAgICAgICBwb3MgPSBzdGFydF95ICsgeDsKKyAgICAgICAgICBwb3MxMFtwb3NdID0gbnB4MTAgKyBwcmV2WCAqIG5weTEwOworCisgICAgICAgICAgaWYgKCEoY29lZmggfHwgY29lZnYpKQorICAgICAgICAgICAgY1swXVtwb3NdID0gc3FydHBlcnRlICogc3FydHBlcnRlIC0gMTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBjWzBdW3Bvc10gPSAoc3FydHBlcnRlIC0gY29lZmgpICogKHNxcnRwZXJ0ZSAtIGNvZWZ2KTsKKworICAgICAgICAgIGNbMV1bcG9zXSA9IGNvZWZoICogKHNxcnRwZXJ0ZSAtIGNvZWZ2KTsKKyAgICAgICAgICBjWzJdW3Bvc10gPSAoc3FydHBlcnRlIC0gY29lZmgpICogY29lZnY7CisgICAgICAgICAgY1szXVtwb3NdID0gY29lZmggKiBjb2VmdjsKKyNlbmRpZgorICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBBZHZhbmNlIHN0YXJ0IG9mIGxpbmUgaW5kZXggKi8KKyAgICAgIHN0YXJ0X3kgKz0gcHJldlg7CisgICAgfQorICB9CisjaWZkZWYgVVNFX0FTTQorI2lmZGVmIE1NWAorICB6b29tX3dpZHRoID0gcHJldlg7CisgIG1teF96b29tX3NpemUgPSBwcmV2WCAqIHByZXZZOworICBtbXhfem9vbSAoKTsKKyNlbmRpZgorCisjaWZkZWYgUE9XRVJQQworICB6b29tX3dpZHRoID0gcHJldlg7CisgIGlmICh1c2VBbHRpdmVjKSB7CisgICAgcHBjc2l6ZTQgPSAoKHVuc2lnbmVkIGludCkgKHByZXZYICogcHJldlkpKSAvIDQ7CisgICAgcHBjX3pvb21fYWx0aXZlYyAoKTsKKyAgfSBlbHNlIHsKKyAgICBwcGNzaXplNCA9ICgodW5zaWduZWQgaW50KSAocHJldlggKiBwcmV2WSkpOworICAgIHBwY196b29tICgpOworICB9CisjZW5kaWYKKyNlbHNlCisgIGZvciAocG9zaXRpb24gPSAwOyBwb3NpdGlvbiA8IHByZXZYICogcHJldlk7IHBvc2l0aW9uKyspIHsKKyAgICBnZXRQaXhlbFJHQl8gKHBpeDEsIHBvczEwW3Bvc2l0aW9uXSwgJmNvbDEsIGdvb21kYXRhLT5yZXNvbHgsCisgICAgICAgIGdvb21kYXRhLT5yZXNvbHkpOworICAgIGdldFBpeGVsUkdCXyAocGl4MSwgcG9zMTBbcG9zaXRpb25dICsgMSwgJmNvbDIsIGdvb21kYXRhLT5yZXNvbHgsCisgICAgICAgIGdvb21kYXRhLT5yZXNvbHkpOworICAgIGdldFBpeGVsUkdCXyAocGl4MSwgcG9zMTBbcG9zaXRpb25dICsgcHJldlgsICZjb2wzLCBnb29tZGF0YS0+cmVzb2x4LAorICAgICAgICBnb29tZGF0YS0+cmVzb2x5KTsKKyAgICBnZXRQaXhlbFJHQl8gKHBpeDEsIHBvczEwW3Bvc2l0aW9uXSArIHByZXZYICsgMSwgJmNvbDQsIGdvb21kYXRhLT5yZXNvbHgsCisgICAgICAgIGdvb21kYXRhLT5yZXNvbHkpOworCisgICAgY291bGV1ci5yID0gY29sMS5yICogY1swXVtwb3NpdGlvbl0KKyAgICAgICAgKyBjb2wyLnIgKiBjWzFdW3Bvc2l0aW9uXQorICAgICAgICArIGNvbDMuciAqIGNbMl1bcG9zaXRpb25dCisgICAgICAgICsgY29sNC5yICogY1szXVtwb3NpdGlvbl07CisgICAgY291bGV1ci5yID4+PSB6Zi0+cGVydGVkZWM7CisKKyAgICBjb3VsZXVyLnYgPSBjb2wxLnYgKiBjWzBdW3Bvc2l0aW9uXQorICAgICAgICArIGNvbDIudiAqIGNbMV1bcG9zaXRpb25dCisgICAgICAgICsgY29sMy52ICogY1syXVtwb3NpdGlvbl0KKyAgICAgICAgKyBjb2w0LnYgKiBjWzNdW3Bvc2l0aW9uXTsKKyAgICBjb3VsZXVyLnYgPj49IHpmLT5wZXJ0ZWRlYzsKKworICAgIGNvdWxldXIuYiA9IGNvbDEuYiAqIGNbMF1bcG9zaXRpb25dCisgICAgICAgICsgY29sMi5iICogY1sxXVtwb3NpdGlvbl0KKyAgICAgICAgKyBjb2wzLmIgKiBjWzJdW3Bvc2l0aW9uXQorICAgICAgICArIGNvbDQuYiAqIGNbM11bcG9zaXRpb25dOworICAgIGNvdWxldXIuYiA+Pj0gemYtPnBlcnRlZGVjOworCisgICAgc2V0UGl4ZWxSR0JfIChwaXgyLCBwb3NpdGlvbiwgY291bGV1ciwgZ29vbWRhdGEtPnJlc29seCwgZ29vbWRhdGEtPnJlc29seSk7CisgIH0KKyNlbmRpZgorfQorCisKK3ZvaWQKK3BvaW50RmlsdGVyIChHb29tRGF0YSAqIGdvb21kYXRhLCBDb2xvciBjLAorICAgIGZsb2F0IHQxLCBmbG9hdCB0MiwgZmxvYXQgdDMsIGZsb2F0IHQ0LCBVaW50IGN5Y2xlKQoreworICBVaW50ICpwaXgxID0gZ29vbWRhdGEtPnAxOworICBab29tRmlsdGVyRGF0YSAqemYgPSBnb29tZGF0YS0+emZkOworICBVaW50IHggPSAoVWludCkgKHpmLT5taWRkbGVYICsgKGludCkgKHQxICogY29zICgoZmxvYXQpIGN5Y2xlIC8gdDMpKSk7CisgIFVpbnQgeSA9IChVaW50KSAoemYtPm1pZGRsZVkgKyAoaW50KSAodDIgKiBzaW4gKChmbG9hdCkgY3ljbGUgLyB0NCkpKTsKKworICBpZiAoKHggPiAxKSAmJiAoeSA+IDEpICYmICh4IDwgZ29vbWRhdGEtPnJlc29seCAtIDIpCisgICAgICAmJiAoeSA8IGdvb21kYXRhLT5yZXNvbHkgLSAyKSkgeworICAgIHNldFBpeGVsUkdCIChwaXgxLCB4ICsgMSwgeSwgYywgZ29vbWRhdGEtPnJlc29seCwgZ29vbWRhdGEtPnJlc29seSk7CisgICAgc2V0UGl4ZWxSR0IgKHBpeDEsIHgsIHkgKyAxLCBjLCBnb29tZGF0YS0+cmVzb2x4LCBnb29tZGF0YS0+cmVzb2x5KTsKKyAgICBzZXRQaXhlbFJHQiAocGl4MSwgeCArIDEsIHkgKyAxLCBXSElURSwgZ29vbWRhdGEtPnJlc29seCwgZ29vbWRhdGEtPnJlc29seSk7CisgICAgc2V0UGl4ZWxSR0IgKHBpeDEsIHggKyAyLCB5ICsgMSwgYywgZ29vbWRhdGEtPnJlc29seCwgZ29vbWRhdGEtPnJlc29seSk7CisgICAgc2V0UGl4ZWxSR0IgKHBpeDEsIHggKyAxLCB5ICsgMiwgYywgZ29vbWRhdGEtPnJlc29seCwgZ29vbWRhdGEtPnJlc29seSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9nb29tMmsxL2ZpbHRlcnMuaCBiL2dzdC9nb29tMmsxL2ZpbHRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDIwMDRiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20yazEvZmlsdGVycy5oCkBAIC0wLDAgKzEsODMgQEAKKyNpZm5kZWYgRklMVEVSU19ICisjZGVmaW5lIEZJTFRFUlNfSAorCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaW5jbHVkZSAiZ3JhcGhpYy5oIgorI2luY2x1ZGUgImdvb21fY29yZS5oIgorCisjZGVmaW5lIE5PUk1BTF9NT0RFIDAKKyNkZWZpbmUgV0FWRV9NT0RFIDEKKyNkZWZpbmUgQ1JZU1RBTF9CQUxMX01PREUgMgorI2RlZmluZSBTQ1JVTkNIX01PREUgMworI2RlZmluZSBBTVVMRVRURV9NT0RFIDQKKyNkZWZpbmUgV0FURVJfTU9ERSA1CisKK3N0cnVjdCBab29tRmlsdGVyRGF0YQoreworICBpbnQgdml0ZXNzZTsKKyAgdW5zaWduZWQgY2hhciBwZXJ0ZWRlYzsKKyAgdW5zaWduZWQgY2hhciBzcXJ0cGVydGU7CisgIGludCBtaWRkbGVYOworICBpbnQgbWlkZGxlWTsKKyAgY2hhciByZXZlcnNlOworICBjaGFyIG1vZGU7CisgICAgICAgIC8qKiBAc2luY2UgSnVuZSAyMDAxICovCisgIGludCBoUGxhbmVFZmZlY3Q7CisgIGludCB2UGxhbmVFZmZlY3Q7CisgIGNoYXIgbm9pc2lmeTsKKworICBndWludDMyIHJlc194OworICBndWludDMyIHJlc195OworICBndWludDMyIGJ1ZmZzaXplOworCisgIGd1aW50MzIgKmJ1ZmZlcjsKKyAgZ3VpbnQzMiAqcG9zMTA7CisgIGd1aW50MzIgKmNbNF07CisgIGludCAgICAgKmZpcmVkZWM7CisKKyAgaW50ICAgICB3YXZlOworICBpbnQgICAgIHdhdmVzcDsKK307CisKK3ZvaWQgcG9pbnRGaWx0ZXIoR29vbURhdGEgKmdvb21kYXRhLCBDb2xvciBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdDEsIGZsb2F0IHQyLCBmbG9hdCB0MywgZmxvYXQgdDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGN5Y2xlKTsKKworLyogZmlsdHJlIGRlIHpvb20gOgorIGxlIGNvbnRlbnUgZGUgcGl4MSBlc3QgY29waWUgZGFucyBwaXgyLCBhdmVjIGwnZWZmZXQgYXBwbGlxdcOpCisgbWlkeCBldCBtaWR5IHJlcHJlc2VudGUgbGUgY2VudHJlIGR1IHpvb20KKwordm9pZCB6b29tRmlsdGVyKFVpbnQgKnBpeDEsIFVpbnQgKnBpeDIsIFVpbnQgbWlkZGxlWCwgVWludCBtaWRkbGVZKTsKK3ZvaWQgem9vbUZpbHRlclJHQihVaW50ICpwaXgxLAorVWludCAqcGl4MiwKK1VpbnQgbWlkZGxlWCwKK1VpbnQgbWlkZGxlWSk7CisqLworCitab29tRmlsdGVyRGF0YSAqem9vbUZpbHRlck5ldyAodm9pZCk7Cit2b2lkIHpvb21GaWx0ZXJEZXN0cm95IChab29tRmlsdGVyRGF0YSAqemYpOwordm9pZCB6b29tRmlsdGVyRmFzdFJHQiAoR29vbURhdGEgKmdvb21kYXRhLCBab29tRmlsdGVyRGF0YSAqemYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgemZkX3VwZGF0ZSk7CisKKy8qIGZpbHRyZSBzaW4gOgorIGxlIGNvbnRlbnUgZGUgcGl4MSBlc3QgY29waWUgZGFucyBwaXgyLCBhdmVjIGwnZWZmZXQgYXBwbGlxdcOpCisgY3ljbGUgZXN0IGxhIHZhcmlhYmxlIGRlIHRlbXBzLgorIG1vZGUgdmF1dCBTSU5fTVVMIG91IFNJTl9BREQKKyByYXRlIGVzdCBsZSBwb3VyY2VudGFnZSBkZSBsJ2VmZmV0IGFwcGxpcXXDqQorIGxlbmdodCA6IGxhIGxvbmd1ZXVyIGQnb25kZSAoMS4uMTApIFs1XQorIHNwZWVkIDogbGEgdml0ZXNzZSAoMS4uMTAwKSBbMTBdCisqLworLyoKK3ZvaWQgc2luRmlsdGVyKFVpbnQgKnBpeDEsVWludCAqcGl4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVpbnQgY3ljbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50IG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50IHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGxlbmdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVpbnQgc3BlZWQpOworKi8KKworI2RlZmluZSBTSU5fTVVMIDEKKyNkZWZpbmUgU0lOX0FERCAyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20yazEvZmlsdGVyc19tbXgucyBiL2dzdC9nb29tMmsxL2ZpbHRlcnNfbW14LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM3ZGU1NgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tMmsxL2ZpbHRlcnNfbW14LnMKQEAgLTAsMCArMSwxMzAgQEAKKzsvLyBmaWxlIDogbW14X3pvb20ucworOy8vIGF1dGhvciA6IEpDIEhvZWx0IDxqZWtvQGZyZWUuZnI+Cis7Ly8KKzsvLyBoaXN0b3J5Cis7Ly8gMDcvMDEvMjAwMSA6IENoYW5naW5nIEZFTU1TIHRvIEVNTVMgOiBzbG93ZXIuLi4gYnV0IHJ1biBvbiBpbnRlbCBtYWNoaW5lcworOy8vCTAzLzAxLzIwMDEgOiBXSURUSCBhbmQgSEVJR0hUIGFyZSBub3cgdmFyaWFibGUKKzsvLwkyOC8xMi8yMDAwIDogYWRkaW5nIGNvbW1lbnRzIHRvIHRoZSBjb2RlLCBzdXBwcmVzcyBzb21lIHVzZWxlc3MgbGluZXMKKzsvLwkyNy8xMi8yMDAwIDogcmVkdWNpbmcgbWVtb3J5IGFjY2Vzcy4uLiBpbXByb3ZpbmcgcGVyZm9ybWFuY2UgYnkgMjAlCis7Ly8JCWNvZWZmaWNpZW50cyBhcmUgbm93IG9uIDEgYnl0ZQorOy8vCTIyLzEyLzIwMDAgOiBDaGFuZ2luZyBkYXRhIHN0cnVjdHVyZQorOy8vCTE2LzEyLzIwMDAgOiBBVCZUIHZlcnNpb24KKzsvLwkxNC8xMi8yMDAwIDogdW5yb2xsaW5nIGxvb3AKKzsvLwkxMi8xMi8yMDAwIDogNjQgYml0cyBtZW1vcnkgYWNjZXNzCisKKworLmRhdGEKKwordGhlemVybzoKKwkubG9uZyAweDAwMDAwMDAwCisJLmxvbmcgMHgwMDAwMDAwMAorCisKKy50ZXh0CisKKy5nbG9ibCBtbXhfem9vbQkJOy8vIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgYnkgQyBwcm9ncmFtCisuZXh0ZXJuIGNvZWZmcwkJOy8vIHRoZSB0cmFuc2Zvcm1hdGlvbiBidWZmZXIKKy5leHRlcm4gZXhwaXgxLGV4cGl4MiA7Ly8gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYnVmZmVyCisuZXh0ZXJuIG1teF96b29tX3NpemUsIHpvb21fd2lkdGggOy8vIHNpemUgb2YgdGhlIGJ1ZmZlcnMKKworLmFsaWduIDE2CittbXhfem9vbToKKworcHVzaCAlZWJwCitwdXNoICVlc3AKKworOy8vIGluaXRpYWxpc2F0aW9uIGR1IG1tNyDgIHplcm8KK21vdnEgKHRoZXplcm8pLCAlbW03CisKK21vdmwgem9vbV93aWR0aCwgJWVheAorbW92bCAkNCwgJWVieAorbXVsbCAlZWJ4Cittb3ZsICVlYXgsICVlYnAKKworbW92bCAoY29lZmZzKSwgJWVheAorbW92bCAoZXhwaXgxKSwgJWVkeAorbW92bCAoZXhwaXgyKSwgJWVieAorbW92bCAkMTAsICVlZGkKK21vdmwgbW14X3pvb21fc2l6ZSwgJWVjeAorCisud2hpbGU6CisJOy8vIGVzaSA8LSBub3V2ZWxsZSBwb3NpdGlvbgorCW1vdmwgKCVlYXgpLCAlZXNpCisJbGVhbCAoJWVkeCwgJWVzaSksICVlc2kKKworCTsvLyByZWN1cGVyYXRpb24gZGVzIGRldXggcHJlbWllcnMgcGl4ZWxzIGRhbnMgbW0wIGV0IG1tMQorCW1vdnEgKCVlc2kpLCAlbW0wCQkvKiBiMS12MS1yMS1hMS1iMi12Mi1yMi1hMiAqLworCW1vdnEgJW1tMCwgJW1tMQkJCS8qIGIxLXYxLXIxLWExLWIyLXYyLXIyLWEyICovCisKKwk7Ly8gcmVjdXBlcmF0aW9uIGRlcyA0IGNvZWZmaWNpZW50cworCW1vdmQgNCglZWF4KSwgJW1tNgkJLyogPz8tPz8tPz8tPz8tYzQtYzMtYzItYzEgKi8KKwk7Ly8gZGVwYWNrYWdlIGR1IHByZW1pZXIgcGl4ZWwKKwlwdW5wY2tsYncgJW1tNywgJW1tMAkvKiAwMC1iMi0wMC12Mi0wMC1yMi0wMC1hMiAqLworCisJbW92cSAlbW02LCAlbW01CQkJLyogPz8tPz8tPz8tPz8tYzQtYzMtYzItYzEgKi8KKwk7Ly8gZGVwYWNrYWdlIGR1IDJpZW1lIHBpeGVsCisJcHVucGNraGJ3ICVtbTcsICVtbTEJLyogMDAtYjEtMDAtdjEtMDAtcjEtMDAtYTEgKi8KKworCTsvLyBleHRyYWN0aW9uIGRlcyBjb2VmZmljaWVudHMuLi4KKwlwdW5wY2tsYncgJW1tNSwgJW1tNgkvKiBjNC1jNC1jMy1jMy1jMi1jMi1jMS1jMSAqLworCW1vdnEgJW1tNiwgJW1tNAkJCS8qIGM0LWM0LWMzLWMzLWMyLWMyLWMxLWMxICovCisJbW92cSAlbW02LCAlbW01CQkJLyogYzQtYzQtYzMtYzMtYzItYzItYzEtYzEgKi8KKworCXB1bnBja2xidyAlbW01LCAlbW02CS8qIGMyLWMyLWMyLWMyLWMxLWMxLWMxLWMxICovCisJcHVucGNraGJ3ICVtbTUsICVtbTQJLyogYzQtYzQtYzQtYzQtYzMtYzMtYzMtYzMgKi8KKworCW1vdnEgJW1tNiwgJW1tMwkJCS8qIGMyLWMyLWMyLWMyLWMxLWMxLWMxLWMxICovCisJcHVucGNrbGJ3ICVtbTcsICVtbTYJLyogMDAtYzEtMDAtYzEtMDAtYzEtMDAtYzEgKi8KKwlwdW5wY2toYncgJW1tNywgJW1tMwkvKiAwMC1jMi0wMC1jMi0wMC1jMi0wMC1jMiAqLworCQorCTsvLyBtdWx0aXBsaWNhdGlvbiBkZXMgcGl4ZWxzIHBhciBsZXMgY29lZmZpY2llbnRzCisJcG11bGx3ICVtbTYsICVtbTAJCS8qIGMxKmIyLWMxKnYyLWMxKnIyLWMxKmEyICovCisJcG11bGx3ICVtbTMsICVtbTEJCS8qIGMyKmIxLWMyKnYxLWMyKnIxLWMyKmExICovCisJcGFkZHcgJW1tMSwgJW1tMAorCQorCTsvLyAuLi5leHRyYWN0aW9uIGRlcyAyIGRlcm5pZXJzIGNvZWZmaWNpZW50cworCW1vdnEgJW1tNCwgJW1tNQkJCS8qIGM0LWM0LWM0LWM0LWMzLWMzLWMzLWMzICovCisJcHVucGNrbGJ3ICVtbTcsICVtbTQJLyogMDAtYzMtMDAtYzMtMDAtYzMtMDAtYzMgKi8KKwlwdW5wY2toYncgJW1tNywgJW1tNQkvKiAwMC1jNC0wMC1jNC0wMC1jNC0wMC1jNCAqLworCisJOy8vIHJlY3VwZXJhdGlvbiBkZXMgMiBkZXJuaWVycyBwaXhlbHMKKwltb3ZxICglZXNpLCVlYnApLCAlbW0xCisJbW92cSAlbW0xLCAlbW0yCisJCisJOy8vIGRlcGFja2FnZSBkZXMgcGl4ZWxzCisJcHVucGNrbGJ3ICVtbTcsICVtbTEKKwlwdW5wY2toYncgJW1tNywgJW1tMgorCQorCTsvLyBtdWx0aXBsaWNhdGlvbiBwYXMgbGVzIGNvZWZmcworCXBtdWxsdyAlbW00LCAlbW0xCisJcG11bGx3ICVtbTUsICVtbTIKKwkKKwk7Ly8gYWpvdXQgZGVzIHZhbGV1cnMgb2J0ZW51ZXMg4CBsYSB2YWxldXIgZmluYWxlCisJcGFkZHcgJW1tMSwgJW1tMAorCXBhZGR3ICVtbTIsICVtbTAKKworCTsvLyBkaXZpc2lvbiBwYXIgMjU2ID0gMTYrMTYrMTYrMTYsIHB1aXMgcmVwYWNrYWdlIGR1IHBpeGVsIGZpbmFsCisJcHNybHcgJDgsICVtbTAKKwlwYWNrdXN3YiAlbW03LCAlbW0wCisJCisJOy8vIHBhc3NhZ2UgYXUgc3VpdmFudAorCWxlYWwgOCglZWF4KSwgJWVheAorCisJZGVjbCAlZWN4CisJOy8vIGVucmVnaXN0cmVtZW50IGR1IHJlc3VsdGF0CisJbW92ZCAlbW0wLCAoJWVieCkKKwlsZWFsIDQoJWVieCksICVlYngKKworCTsvLyB0ZXN0IGRlIGZpbiBkdSB0YW50cXVlCisJY21wbCAkMCwgJWVjeAkJCQk7Ly8gNDAweDMwMAorCitqeiAuZmluX3doaWxlCitqbXAgLndoaWxlCisKKy5maW5fd2hpbGU6CitlbW1zCisKK3BvcCAlZXNwCitwb3AgJWVicAorCityZXQgICAgICAgICAgICAgICAgICA7Ly9UaGUgRW5kCmRpZmYgLS1naXQgYS9nc3QvZ29vbTJrMS9nb29tX2NvcmUuYyBiL2dzdC9nb29tMmsxL2dvb21fY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZTY0NzAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbTJrMS9nb29tX2NvcmUuYwpAQCAtMCwwICsxLDQxMSBAQAorI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPGdsaWIuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdvb21fY29yZS5oIgorI2luY2x1ZGUgImdvb21fdG9vbHMuaCIKKyNpbmNsdWRlICJmaWx0ZXJzLmgiCisjaW5jbHVkZSAibGluZXMuaCIKKworLyojZGVmaW5lIFZFUkJPU0UgKi8KKworI2lmZGVmIFZFUkJPU0UKKyNpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisKKyNkZWZpbmUgU1RPUF9TUEVFRCAxMjgKKwordm9pZAorZ29vbV9pbml0IChHb29tRGF0YSAqIGdvb21kYXRhLCBndWludDMyIHJlc3gsIGd1aW50MzIgcmVzeSkKK3sKKyNpZmRlZiBWRVJCT1NFCisgIHByaW50ZiAoIkdPT006IGluaXQgKCVkLCAlZCk7XG4iLCByZXN4LCByZXN5KTsKKyNlbmRpZgorICBnb29tZGF0YS0+cmVzb2x4ID0gMDsKKyAgZ29vbWRhdGEtPnJlc29seSA9IDA7CisgIGdvb21kYXRhLT5idWZmc2l6ZSA9IDA7CisKKyAgZ29vbWRhdGEtPnBpeGVsID0gTlVMTDsKKyAgZ29vbWRhdGEtPmJhY2sgPSBOVUxMOworICBnb29tZGF0YS0+cDEgPSBOVUxMOworICBnb29tZGF0YS0+cDIgPSBOVUxMOworCisgIGdvb21fc2V0X3Jlc29sdXRpb24gKGdvb21kYXRhLCByZXN4LCByZXN5KTsKKyAgUkFORF9JTklUIChnb29tZGF0YSwgR1BPSU5URVJfVE9fSU5UIChnb29tZGF0YS0+cGl4ZWwpKTsKKyAgZ29vbWRhdGEtPmN5Y2xlID0gMDsKKworCisgIGdvb21kYXRhLT5nb29tbGltaXQgPSAyOyAgICAgIC8qIHNlbnNpYmlsaXTDqSBkdSBnb29tICovCisgIGdvb21kYXRhLT56ZmQgPSB6b29tRmlsdGVyTmV3ICgpOworICBnb29tZGF0YS0+bG9ja3ZhciA9IDA7ICAgICAgICAvKiBwb3VyIGVtcGVjaGVyIGRlIG5vdXZlYXV4IGNoYW5nZW1lbnRzICovCisgIGdvb21kYXRhLT5nb29tdmFyID0gMDsgICAgICAgIC8qIGJvdWNsZSBkZXMgZ29vbXMgKi8KKyAgZ29vbWRhdGEtPnRvdGFsZ29vbSA9IDA7ICAgICAgLyogbm9tYnJlIGRlIGdvb21zIHBhciBzZWNvbmRzICovCisgIGdvb21kYXRhLT5hZ29vbSA9IDA7ICAgICAgICAgIC8qIHVuIGdvb20gYSBldSBsaWV1Li4gICAgICAgKi8KKyAgZ29vbWRhdGEtPmxvb3B2YXIgPSAwOyAgICAgICAgLyogbW91dmVtZW50IGRlcyBwb2ludHMgKi8KKyAgZ29vbWRhdGEtPnNwZWVkdmFyID0gMDsgICAgICAgLyogdml0ZXNzZSBkZXMgcGFydGljdWxlcyAqLworICBnb29tZGF0YS0+bGluZU1vZGUgPSAwOyAgICAgICAvKiBsJ2VmZmV0IGxpbmVhaXJlIGEgZGVzc2luZXIgKi8KK30KKwordm9pZAorZ29vbV9zZXRfcmVzb2x1dGlvbiAoR29vbURhdGEgKiBnb29tZGF0YSwgZ3VpbnQzMiByZXN4LCBndWludDMyIHJlc3kpCit7CisgIGd1aW50MzIgYnVmZnNpemUgPSByZXN4ICogcmVzeTsKKworICBpZiAoKGdvb21kYXRhLT5yZXNvbHggPT0gcmVzeCkgJiYgKGdvb21kYXRhLT5yZXNvbHkgPT0gcmVzeSkpCisgICAgcmV0dXJuOworCisgIGlmIChnb29tZGF0YS0+YnVmZnNpemUgPCBidWZmc2l6ZSkgeworICAgIGlmIChnb29tZGF0YS0+cGl4ZWwpCisgICAgICBmcmVlIChnb29tZGF0YS0+cGl4ZWwpOworICAgIGlmIChnb29tZGF0YS0+YmFjaykKKyAgICAgIGZyZWUgKGdvb21kYXRhLT5iYWNrKTsKKyAgICBnb29tZGF0YS0+cGl4ZWwgPSAoZ3VpbnQzMiAqKSBtYWxsb2MgKGJ1ZmZzaXplICogc2l6ZW9mIChndWludDMyKSArIDEyOCk7CisgICAgZ29vbWRhdGEtPmJhY2sgPSAoZ3VpbnQzMiAqKSBtYWxsb2MgKGJ1ZmZzaXplICogc2l6ZW9mIChndWludDMyKSArIDEyOCk7CisgICAgZ29vbWRhdGEtPmJ1ZmZzaXplID0gYnVmZnNpemU7CisKKyAgICBnb29tZGF0YS0+cDEgPSAodm9pZCAqKSAoKChndWludHB0cikgZ29vbWRhdGEtPnBpeGVsICsgMHg3ZikgJiAofjB4N2YpKTsKKyAgICBnb29tZGF0YS0+cDIgPSAodm9pZCAqKSAoKChndWludHB0cikgZ29vbWRhdGEtPmJhY2sgKyAweDdmKSAmICh+MHg3ZikpOworICB9CisKKyAgZ29vbWRhdGEtPnJlc29seCA9IHJlc3g7CisgIGdvb21kYXRhLT5yZXNvbHkgPSByZXN5OworCisgIG1lbXNldCAoZ29vbWRhdGEtPnBpeGVsLCAwLCBidWZmc2l6ZSAqIHNpemVvZiAoZ3VpbnQzMikgKyAxMjgpOworICBtZW1zZXQgKGdvb21kYXRhLT5iYWNrLCAwLCBidWZmc2l6ZSAqIHNpemVvZiAoZ3VpbnQzMikgKyAxMjgpOworfQorCitndWludDMyICoKK2dvb21fdXBkYXRlIChHb29tRGF0YSAqIGdvb21kYXRhLCBnaW50MTYgZGF0YVsyXVs1MTJdKQoreworICBndWludDMyICpyZXR1cm5fdmFsOworICBndWludDMyIHBvaW50V2lkdGg7CisgIGd1aW50MzIgcG9pbnRIZWlnaHQ7CisgIGludCBpbmN2YXI7ICAgICAgICAgICAgICAgICAgIC8qIHZvbHVtZSBkdSBzb24gKi8KKyAgaW50IGFjY2VsdmFyOyAgICAgICAgICAgICAgICAgLyogYWNjZWxlcmF0aW9uIGRlcyBwYXJ0aWN1bGVzICovCisgIGludCBpOworICBmbG9hdCBsYXJnZmFjdG9yOyAgICAgICAgICAgICAvKiBlbGFyZ2lzc2VtZW50IGRlIGwnaW50ZXJ2YWxsZSBkJ8Opdm9sdXRpb24gZGVzIHBvaW50cyAqLworICBpbnQgemZkX3VwZGF0ZSA9IDA7CisgIGludCByZXNvbHggPSBnb29tZGF0YS0+cmVzb2x4OworICBpbnQgcmVzb2x5ID0gZ29vbWRhdGEtPnJlc29seTsKKyAgWm9vbUZpbHRlckRhdGEgKnB6ZmQgPSBnb29tZGF0YS0+emZkOworICBndWludDMyICp0bXA7CisKKyAgLyogdGVzdCBpZiB0aGUgY29uZmlnIGhhcyBjaGFuZ2VkLCB1cGRhdGUgaXQgaWYgc28gKi8KKworICBwb2ludFdpZHRoID0gKHJlc29seCAqIDIpIC8gNTsKKyAgcG9pbnRIZWlnaHQgPSAocmVzb2x5ICogMikgLyA1OworCisgIC8qICEgZXR1ZGUgZHUgc2lnbmFsIC4uLiAqLworICBpbmN2YXIgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgNTEyOyBpKyspIHsKKyAgICBpZiAoaW5jdmFyIDwgZGF0YVswXVtpXSkKKyAgICAgIGluY3ZhciA9IGRhdGFbMF1baV07CisgIH0KKworICBhY2NlbHZhciA9IGluY3ZhciAvIDUwMDA7CisgIGlmIChnb29tZGF0YS0+c3BlZWR2YXIgPiA1KSB7CisgICAgYWNjZWx2YXItLTsKKyAgICBpZiAoZ29vbWRhdGEtPnNwZWVkdmFyID4gMjApCisgICAgICBhY2NlbHZhci0tOworICAgIGlmIChnb29tZGF0YS0+c3BlZWR2YXIgPiA0MCkKKyAgICAgIGdvb21kYXRhLT5zcGVlZHZhciA9IDQwOworICB9CisgIGFjY2VsdmFyLS07CisgIGdvb21kYXRhLT5zcGVlZHZhciArPSBhY2NlbHZhcjsKKworICBpZiAoZ29vbWRhdGEtPnNwZWVkdmFyIDwgMCkKKyAgICBnb29tZGF0YS0+c3BlZWR2YXIgPSAwOworICBpZiAoZ29vbWRhdGEtPnNwZWVkdmFyID4gNDApCisgICAgZ29vbWRhdGEtPnNwZWVkdmFyID0gNDA7CisKKworICAvKiAhIGNhbGN1bCBkdSBkZXBsYWNlbWVudCBkZXMgcGV0aXRzIHBvaW50cyAuLi4gKi8KKworICBsYXJnZmFjdG9yID0KKyAgICAgICgoZmxvYXQpIGdvb21kYXRhLT5zcGVlZHZhciAvIDQwLjBmICsgKGZsb2F0KSBpbmN2YXIgLyA1MDAwMC4wZikgLyAxLjVmOworICBpZiAobGFyZ2ZhY3RvciA+IDEuNWYpCisgICAgbGFyZ2ZhY3RvciA9IDEuNWY7CisKKyAgZm9yIChpID0gMTsgaSAqIDE1IDw9IGdvb21kYXRhLT5zcGVlZHZhciArIDE1OyBpKyspIHsKKyAgICBnb29tZGF0YS0+bG9vcHZhciArPSBnb29tZGF0YS0+c3BlZWR2YXIgKyAxOworCisgICAgcG9pbnRGaWx0ZXIgKGdvb21kYXRhLAorICAgICAgICBZRUxMT1csCisgICAgICAgICgocG9pbnRXaWR0aCAtIDYuMGYpICogbGFyZ2ZhY3RvciArIDUuMGYpLAorICAgICAgICAoKHBvaW50SGVpZ2h0IC0gNi4wZikgKiBsYXJnZmFjdG9yICsgNS4wZiksCisgICAgICAgIGkgKiAxNTIuMGYsIDEyOC4wZiwgZ29vbWRhdGEtPmxvb3B2YXIgKyBpICogMjAzMik7CisgICAgcG9pbnRGaWx0ZXIgKGdvb21kYXRhLCBPUkFOR0UsCisgICAgICAgICgocG9pbnRXaWR0aCAvIDIpICogbGFyZ2ZhY3RvcikgLyBpICsgMTAuMGYgKiBpLAorICAgICAgICAoKHBvaW50SGVpZ2h0IC8gMikgKiBsYXJnZmFjdG9yKSAvIGkgKyAxMC4wZiAqIGksCisgICAgICAgIDk2LjBmLCBpICogODAuMGYsIGdvb21kYXRhLT5sb29wdmFyIC8gaSk7CisgICAgcG9pbnRGaWx0ZXIgKGdvb21kYXRhLCBWSU9MRVQsCisgICAgICAgICgocG9pbnRIZWlnaHQgLyAzICsgNS4wZikgKiBsYXJnZmFjdG9yKSAvIGkgKyAxMC4wZiAqIGksCisgICAgICAgICgocG9pbnRIZWlnaHQgLyAzICsgNS4wZikgKiBsYXJnZmFjdG9yKSAvIGkgKyAxMC4wZiAqIGksCisgICAgICAgIGkgKyAxMjIuMGYsIDEzNC4wZiwgZ29vbWRhdGEtPmxvb3B2YXIgLyBpKTsKKyAgICBwb2ludEZpbHRlciAoZ29vbWRhdGEsIEJMQUNLLAorICAgICAgICAoKHBvaW50SGVpZ2h0IC8gMykgKiBsYXJnZmFjdG9yICsgMjAuMGYpLAorICAgICAgICAoKHBvaW50SGVpZ2h0IC8gMykgKiBsYXJnZmFjdG9yICsgMjAuMGYpLAorICAgICAgICA1OC4wZiwgaSAqIDY2LjBmLCBnb29tZGF0YS0+bG9vcHZhciAvIGkpOworICAgIHBvaW50RmlsdGVyIChnb29tZGF0YSwgV0hJVEUsCisgICAgICAgIChwb2ludEhlaWdodCAqIGxhcmdmYWN0b3IgKyAxMC4wZiAqIGkpIC8gaSwKKyAgICAgICAgKHBvaW50SGVpZ2h0ICogbGFyZ2ZhY3RvciArIDEwLjBmICogaSkgLyBpLAorICAgICAgICA2Ni4wZiwgNzQuMGYsIGdvb21kYXRhLT5sb29wdmFyICsgaSAqIDUwMCk7CisgIH0KKworICAvKiBkaW1pbnVlciBkZSAxIGxlIHRlbXBzIGRlIGxvY2thZ2UgKi8KKyAgLyogbm90ZSBwb3VyIGNldXggcXVpIG4nb250IHBhcyBzdWl2aXMgOiBsZSBsb2NrdmFyIHBlcm1ldCBkJ2VtcGVjaGVyIHVuICovCisgIC8qIGNoYW5nZW1lbnQgZCdldGF0IGR1IHBsdWdpbnMganVzdGUgYXByZXMgdW4gYXV0cmUgY2hhbmdlbWVudCBkJ2V0YXQuIG9raSA/ICovCisgIGlmICgtLWdvb21kYXRhLT5sb2NrdmFyIDwgMCkKKyAgICBnb29tZGF0YS0+bG9ja3ZhciA9IDA7CisKKyAgLyogdGVtcHMgZHUgZ29vbSAqLworICBpZiAoLS1nb29tZGF0YS0+YWdvb20gPCAwKQorICAgIGdvb21kYXRhLT5hZ29vbSA9IDA7CisKKyAgLyogb24gdmVyaWZpZSBxdSdpbCBuZSBzZSBwYXMgdW4gdHJ1YyBpbnRlcnJlc3NhbnQgYXZlYyBsZSBzb24uICovCisgIGlmICgoYWNjZWx2YXIgPiBnb29tZGF0YS0+Z29vbWxpbWl0KSB8fCAoYWNjZWx2YXIgPCAtZ29vbWRhdGEtPmdvb21saW1pdCkpIHsKKyAgICAvKiBVTiBHT09NICEhISBZQUhPTyAhICovCisgICAgZ29vbWRhdGEtPnRvdGFsZ29vbSsrOworICAgIGdvb21kYXRhLT5hZ29vbSA9IDIwOyAgICAgICAvKiBtYWlzIHBkdCAyMCBjeWNsZXMsIGlsIG4neSBlbiBhdXJhIHBsdXMuICovCisgICAgZ29vbWRhdGEtPmxpbmVNb2RlID0gKGdvb21kYXRhLT5saW5lTW9kZSArIDEpICUgMjA7IC8qIFRvdXMgbGVzIDEwIGdvb21zIG9uIGNoYW5nZSBkZSBtb2RlIGxpbmVhaXJlICovCisKKyAgICAvKiBjaGFuZ2VtZW50IGV2ZW50dWVsIGRlIG1vZGUgKi8KKyAgICBzd2l0Y2ggKGlSQU5EIChnb29tZGF0YSwgMTApKSB7CisgICAgICBjYXNlIDA6CisgICAgICBjYXNlIDE6CisgICAgICBjYXNlIDI6CisgICAgICAgIHB6ZmQtPm1vZGUgPSBXQVZFX01PREU7CisgICAgICAgIHB6ZmQtPnZpdGVzc2UgPSBTVE9QX1NQRUVEIC0gMTsKKyAgICAgICAgcHpmZC0+cmV2ZXJzZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOgorICAgICAgY2FzZSA0OgorICAgICAgICBwemZkLT5tb2RlID0gQ1JZU1RBTF9CQUxMX01PREU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1OgorICAgICAgICBwemZkLT5tb2RlID0gQU1VTEVUVEVfTU9ERTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDY6CisgICAgICAgIHB6ZmQtPm1vZGUgPSBXQVRFUl9NT0RFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNzoKKyAgICAgICAgcHpmZC0+bW9kZSA9IFNDUlVOQ0hfTU9ERTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBwemZkLT5tb2RlID0gTk9STUFMX01PREU7CisgICAgfQorICB9CisKKyAgLyogdG91dCBjZWNpIG5lIHNlcmEgZmFpdCBxdSdlbiBjYXMgZGUgbm9uLWJsb2NhZ2UgKi8KKyAgaWYgKGdvb21kYXRhLT5sb2NrdmFyID09IDApIHsKKyAgICAvKiByZXBlcmFnZSBkZSBnb29tIChhY2NlbGVyYXRpb24gZm9ydGUgZGUgbCdhY2NlbGVyYXRpb24gZHUgdm9sdW1lKSAqLworICAgIC8qIC0+IGNvdXAgZGUgYm9vc3QgZGUgbGEgdml0ZXNzZSBzaSBiZXNvaW4uLiAqLworICAgIGlmICgoYWNjZWx2YXIgPiBnb29tZGF0YS0+Z29vbWxpbWl0KSB8fCAoYWNjZWx2YXIgPCAtZ29vbWRhdGEtPmdvb21saW1pdCkpIHsKKyAgICAgIGdvb21kYXRhLT5nb29tdmFyKys7CisgICAgICAvKmlmIChnb29tdmFyICUgMSA9PSAwKSAqLworICAgICAgeworICAgICAgICBndWludDMyIHZ0bXA7CisgICAgICAgIGd1aW50MzIgbmV3dml0OworCisgICAgICAgIG5ld3ZpdCA9IFNUT1BfU1BFRUQgLSBnb29tZGF0YS0+c3BlZWR2YXIgLyAyOworICAgICAgICAvKiByZXRhYmxpciBsZSB6b29tIGF2YW50Li4gKi8KKyAgICAgICAgaWYgKChwemZkLT5yZXZlcnNlKSAmJiAoIShnb29tZGF0YS0+Y3ljbGUgJSAxMikpICYmIChyYW5kICgpICUgMyA9PSAwKSkgeworICAgICAgICAgIHB6ZmQtPnJldmVyc2UgPSAwOworICAgICAgICAgIHB6ZmQtPnZpdGVzc2UgPSBTVE9QX1NQRUVEIC0gMjsKKyAgICAgICAgICBnb29tZGF0YS0+bG9ja3ZhciA9IDUwOworICAgICAgICB9CisgICAgICAgIGlmIChpUkFORCAoZ29vbWRhdGEsIDEwKSA9PSAwKSB7CisgICAgICAgICAgcHpmZC0+cmV2ZXJzZSA9IDE7CisgICAgICAgICAgZ29vbWRhdGEtPmxvY2t2YXIgPSAxMDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBjaGFuZ2VtZW50IGRlIG1pbGlldS4uICovCisgICAgICAgIHN3aXRjaCAoaVJBTkQgKGdvb21kYXRhLCAyMCkpIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBwemZkLT5taWRkbGVZID0gcmVzb2x5IC0gMTsKKyAgICAgICAgICAgIHB6ZmQtPm1pZGRsZVggPSByZXNvbHggLyAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcHpmZC0+bWlkZGxlWCA9IHJlc29seCAtIDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBwemZkLT5taWRkbGVYID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwemZkLT5taWRkbGVZID0gcmVzb2x5IC8gMjsKKyAgICAgICAgICAgIHB6ZmQtPm1pZGRsZVggPSByZXNvbHggLyAyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHB6ZmQtPm1vZGUgPT0gV0FURVJfTU9ERSkgeworICAgICAgICAgIHB6ZmQtPm1pZGRsZVggPSByZXNvbHggLyAyOworICAgICAgICAgIHB6ZmQtPm1pZGRsZVkgPSByZXNvbHkgLyAyOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoICh2dG1wID0gKGlSQU5EIChnb29tZGF0YSwgMjcpKSkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHB6ZmQtPnZQbGFuZUVmZmVjdCA9IGlSQU5EIChnb29tZGF0YSwgMyk7CisgICAgICAgICAgICBwemZkLT52UGxhbmVFZmZlY3QgLT0gaVJBTkQgKGdvb21kYXRhLCAzKTsKKyAgICAgICAgICAgIHB6ZmQtPmhQbGFuZUVmZmVjdCA9IGlSQU5EIChnb29tZGF0YSwgMyk7CisgICAgICAgICAgICBwemZkLT5oUGxhbmVFZmZlY3QgLT0gaVJBTkQgKGdvb21kYXRhLCAzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHB6ZmQtPnZQbGFuZUVmZmVjdCA9IDA7CisgICAgICAgICAgICBwemZkLT5oUGxhbmVFZmZlY3QgPSBpUkFORCAoZ29vbWRhdGEsIDgpOworICAgICAgICAgICAgcHpmZC0+aFBsYW5lRWZmZWN0IC09IGlSQU5EIChnb29tZGF0YSwgOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBwemZkLT52UGxhbmVFZmZlY3QgPSBpUkFORCAoZ29vbWRhdGEsIDUpOworICAgICAgICAgICAgcHpmZC0+dlBsYW5lRWZmZWN0IC09IGlSQU5EIChnb29tZGF0YSwgNSk7CisgICAgICAgICAgICBwemZkLT5oUGxhbmVFZmZlY3QgPSAtcHpmZC0+dlBsYW5lRWZmZWN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgcHpmZC0+aFBsYW5lRWZmZWN0ID0gNSArIGlSQU5EIChnb29tZGF0YSwgOCk7CisgICAgICAgICAgICBwemZkLT52UGxhbmVFZmZlY3QgPSAtcHpmZC0+aFBsYW5lRWZmZWN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgcHpmZC0+dlBsYW5lRWZmZWN0ID0gNSArIGlSQU5EIChnb29tZGF0YSwgOCk7CisgICAgICAgICAgICBwemZkLT5oUGxhbmVFZmZlY3QgPSAtcHpmZC0+aFBsYW5lRWZmZWN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgIHB6ZmQtPmhQbGFuZUVmZmVjdCA9IDA7CisgICAgICAgICAgICBwemZkLT52UGxhbmVFZmZlY3QgPSBpUkFORCAoZ29vbWRhdGEsIDEwKTsKKyAgICAgICAgICAgIHB6ZmQtPnZQbGFuZUVmZmVjdCAtPSBpUkFORCAoZ29vbWRhdGEsIDEwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAodnRtcCA8IDEwKSB7CisgICAgICAgICAgICAgIHB6ZmQtPnZQbGFuZUVmZmVjdCA9IDA7CisgICAgICAgICAgICAgIHB6ZmQtPmhQbGFuZUVmZmVjdCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaVJBTkQgKGdvb21kYXRhLCAzKSAhPSAwKQorICAgICAgICAgIHB6ZmQtPm5vaXNpZnkgPSAwOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBwemZkLT5ub2lzaWZ5ID0gaVJBTkQgKGdvb21kYXRhLCAzKSArIDI7CisgICAgICAgICAgZ29vbWRhdGEtPmxvY2t2YXIgKj0gMzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwemZkLT5tb2RlID09IEFNVUxFVFRFX01PREUpIHsKKyAgICAgICAgICBwemZkLT52UGxhbmVFZmZlY3QgPSAwOworICAgICAgICAgIHB6ZmQtPmhQbGFuZUVmZmVjdCA9IDA7CisgICAgICAgICAgcHpmZC0+bm9pc2lmeSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHB6ZmQtPm1pZGRsZVggPT0gMSkgfHwgKHB6ZmQtPm1pZGRsZVggPT0gcmVzb2x4IC0gMSkpIHsKKyAgICAgICAgICBwemZkLT52UGxhbmVFZmZlY3QgPSAwOworICAgICAgICAgIHB6ZmQtPmhQbGFuZUVmZmVjdCA9IGlSQU5EIChnb29tZGF0YSwgMikgPyAwIDogcHpmZC0+aFBsYW5lRWZmZWN0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld3ZpdCA8IHB6ZmQtPnZpdGVzc2UpIHsgICAvKiBvbiBhY2NlbGVyZSAqLworICAgICAgICAgIHpmZF91cGRhdGUgPSAxOworICAgICAgICAgIGlmICgoKG5ld3ZpdCA8IFNUT1BfU1BFRUQgLSA3KSAmJgorICAgICAgICAgICAgICAgICAgKHB6ZmQtPnZpdGVzc2UgPCBTVE9QX1NQRUVEIC0gNikgJiYKKyAgICAgICAgICAgICAgICAgIChnb29tZGF0YS0+Y3ljbGUgJSAzID09IDApKSB8fCAoaVJBTkQgKGdvb21kYXRhLCA0MCkgPT0gMCkpIHsKKyAgICAgICAgICAgIHB6ZmQtPnZpdGVzc2UgPSBTVE9QX1NQRUVEIC0gMTsKKyAgICAgICAgICAgIHB6ZmQtPnJldmVyc2UgPSAhcHpmZC0+cmV2ZXJzZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHpmZC0+dml0ZXNzZSA9IChuZXd2aXQgKyBwemZkLT52aXRlc3NlICogNCkgLyA1OworICAgICAgICAgIH0KKyAgICAgICAgICBnb29tZGF0YS0+bG9ja3ZhciArPSA1MDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvKiBtb2RlIG1lZ2EtbGVudCAqLworICAgIGlmIChpUkFORCAoZ29vbWRhdGEsIDEwMDApID09IDApIHsKKyAgICAgIC8qIAorICAgICAgICAgcHJpbnRmICgiY291cCBkdSBzb3J0Li4uXG4iKSA7CisgICAgICAgKi8KKyAgICAgIHpmZF91cGRhdGUgPSAxOworICAgICAgcHpmZC0+dml0ZXNzZSA9IFNUT1BfU1BFRUQgLSAxOworICAgICAgcHpmZC0+cGVydGVkZWMgPSA4OworICAgICAgcHpmZC0+c3FydHBlcnRlID0gMTY7CisgICAgICBnb29tZGF0YS0+Z29vbXZhciA9IDE7CisgICAgICBnb29tZGF0YS0+bG9ja3ZhciArPSA3MDsKKyAgICB9CisgIH0KKworICAvKiBncm9zIGZyZWluIHNpIGxhIG11c2lxdWUgZXN0IGNhbG1lICovCisgIGlmICgoZ29vbWRhdGEtPnNwZWVkdmFyIDwgMSkgJiYgKHB6ZmQtPnZpdGVzc2UgPCBTVE9QX1NQRUVEIC0gNCkKKyAgICAgICYmIChnb29tZGF0YS0+Y3ljbGUgJSAxNiA9PSAwKSkgeworICAgIC8qCisgICAgICAgcHJpbnRmICgiKytzbG93IHBhcnQuLi4gJWlcbiIsIHpmZC52aXRlc3NlKSA7CisgICAgICovCisgICAgemZkX3VwZGF0ZSA9IDE7CisgICAgcHpmZC0+dml0ZXNzZSArPSAzOworICAgIHB6ZmQtPnBlcnRlZGVjID0gODsKKyAgICBwemZkLT5zcXJ0cGVydGUgPSAxNjsKKyAgICBnb29tZGF0YS0+Z29vbXZhciA9IDA7CisgICAgLyoKKyAgICAgICBwcmludGYgKCItLXNsb3cgcGFydC4uLiAlaVxuIiwgemZkLnZpdGVzc2UpIDsKKyAgICAgKi8KKyAgfQorCisgIC8qIGJhaXNzZXIgcmVndWxpZXJlbWVudCBsYSB2aXRlc3NlLi4uICovCisgIGlmICgoZ29vbWRhdGEtPmN5Y2xlICUgNzMgPT0gMCkgJiYgKHB6ZmQtPnZpdGVzc2UgPCBTVE9QX1NQRUVEIC0gNSkpIHsKKyAgICAvKgorICAgICAgIHByaW50ZiAoInNsb3cgZG93bi4uLlxuIikgOworICAgICAqLworICAgIHpmZF91cGRhdGUgPSAxOworICAgIHB6ZmQtPnZpdGVzc2UrKzsKKyAgfQorCisgIC8qIGFycmV0ZXIgZGUgZGVjcsOpbWVudGVyIGF1IGJvdXQgZCd1biBjZXJ0YWluIHRlbXBzICovCisgIGlmICgoZ29vbWRhdGEtPmN5Y2xlICUgMTAxID09IDApICYmIChwemZkLT5wZXJ0ZWRlYyA9PSA3KSkgeworICAgIHpmZF91cGRhdGUgPSAxOworICAgIHB6ZmQtPnBlcnRlZGVjID0gODsKKyAgICBwemZkLT5zcXJ0cGVydGUgPSAxNjsKKyAgfQorCisgIC8qIFpvb20gaGVyZSAhICovCisgIHpvb21GaWx0ZXJGYXN0UkdCIChnb29tZGF0YSwgcHpmZCwgemZkX3VwZGF0ZSk7CisKKyAgLyogc2kgb24gZXN0IGRhbnMgdW4gZ29vbSA6IGFmZmljaGVyIGxlcyBsaWduZXMuLi4gKi8KKyAgaWYgKGdvb21kYXRhLT5hZ29vbSA+IDE1KQorICAgIGdvb21fbGluZXMgKGdvb21kYXRhLCBkYXRhLCAoKHB6ZmQtPm1pZGRsZVggPT0gcmVzb2x4IC8gMikKKyAgICAgICAgICAgICYmIChwemZkLT5taWRkbGVZID09IHJlc29seSAvIDIpCisgICAgICAgICAgICAmJiAocHpmZC0+bW9kZSAhPSBXQVRFUl9NT0RFKSkKKyAgICAgICAgPyAoZ29vbWRhdGEtPmxpbmVNb2RlIC8gMTApIDogMCwgZ29vbWRhdGEtPnAyLCBnb29tZGF0YS0+YWdvb20gLSAxNSk7CisKKyAgcmV0dXJuX3ZhbCA9IGdvb21kYXRhLT5wMjsKKyAgdG1wID0gZ29vbWRhdGEtPnAxOworICBnb29tZGF0YS0+cDEgPSBnb29tZGF0YS0+cDI7CisgIGdvb21kYXRhLT5wMiA9IHRtcDsKKworICAvKiBhZmZpY2hhZ2UgZXQgc3dhcHBhZ2UgZGVzIGJ1ZmZlcnMuLiAqLworICBnb29tZGF0YS0+Y3ljbGUrKzsKKworICAvKiB0b3VzIGxlcyAxMDAgY3ljbGVzIDogdsOpcmlmaWVyIHNpIGxlIHRhdXggZGUgZ29vbSBlc3QgY29ycmVjdCAqLworICAvKiBldCBsZSBtb2RpZmllciBzaW5vbi4uICovCisgIGlmICghKGdvb21kYXRhLT5jeWNsZSAlIDEwMCkpIHsKKyAgICBpZiAoZ29vbWRhdGEtPnRvdGFsZ29vbSA+IDE1KSB7CisgICAgICAvKiAgcHJpbnRmICgibGVzcyBnb29tc1xuIikgOyAqLworICAgICAgZ29vbWRhdGEtPmdvb21saW1pdCsrOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoKGdvb21kYXRhLT50b3RhbGdvb20gPT0gMCkgJiYgKGdvb21kYXRhLT5nb29tbGltaXQgPiAxKSkKKyAgICAgICAgZ29vbWRhdGEtPmdvb21saW1pdC0tOworICAgIH0KKyAgICBnb29tZGF0YS0+dG90YWxnb29tID0gMDsKKyAgfQorICByZXR1cm4gcmV0dXJuX3ZhbDsKK30KKwordm9pZAorZ29vbV9jbG9zZSAoR29vbURhdGEgKiBnb29tZGF0YSkKK3sKKyAgaWYgKGdvb21kYXRhLT5waXhlbCAhPSBOVUxMKQorICAgIGZyZWUgKGdvb21kYXRhLT5waXhlbCk7CisgIGlmIChnb29tZGF0YS0+YmFjayAhPSBOVUxMKQorICAgIGZyZWUgKGdvb21kYXRhLT5iYWNrKTsKKyAgaWYgKGdvb21kYXRhLT56ZmQgIT0gTlVMTCkgeworICAgIHpvb21GaWx0ZXJEZXN0cm95IChnb29tZGF0YS0+emZkKTsKKyAgICBnb29tZGF0YS0+emZkID0gTlVMTDsKKyAgfQorICBnb29tZGF0YS0+cGl4ZWwgPSBnb29tZGF0YS0+YmFjayA9IE5VTEw7CisgIFJBTkRfQ0xPU0UgKGdvb21kYXRhKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9nb29tMmsxL2dvb21fY29yZS5oIGIvZ3N0L2dvb20yazEvZ29vbV9jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiYzBlZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tMmsxL2dvb21fY29yZS5oCkBAIC0wLDAgKzEsNDMgQEAKKyNpZm5kZWYgX0dPT01DT1JFX0gKKyNkZWZpbmUgX0dPT01DT1JFX0gKKworI2luY2x1ZGUgPGdsaWIuaD4KKwordHlwZWRlZiBzdHJ1Y3QgWm9vbUZpbHRlckRhdGEgWm9vbUZpbHRlckRhdGE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgKiogIFNIQVJFRCBEQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqLworICBndWludDMyICpwaXhlbDsKKyAgZ3VpbnQzMiAqYmFjazsKKyAgZ3VpbnQzMiAqcDEsICpwMjsKKyAgZ3VpbnQzMiBjeWNsZTsKKworICBndWludDMyIHJlc29seCwgcmVzb2x5LCBidWZmc2l6ZTsKKworICBpbnQgbG9ja3ZhcjsgICAgICAgLyogcG91ciBlbXBlY2hlciBkZSBub3V2ZWF1eCBjaGFuZ2VtZW50cyAqLworICBpbnQgZ29vbXZhcjsgICAgICAgLyogYm91Y2xlIGRlcyBnb29tcyAqLworICBpbnQgdG90YWxnb29tOyAgICAgLyogbm9tYnJlIGRlIGdvb21zIHBhciBzZWNvbmRzICovCisgIGludCBhZ29vbTsgICAgICAgICAvKiB1biBnb29tIGEgZXUgbGlldS4uICAgICAgICovCisgIGludCBsb29wdmFyOyAgICAgICAvKiBtb3V2ZW1lbnQgZGVzIHBvaW50cyAqLworICBpbnQgc3BlZWR2YXI7ICAgICAgLyogdml0ZXNzZSBkZXMgcGFydGljdWxlcyAqLworICBpbnQgbGluZU1vZGU7ICAgICAgLyogbCdlZmZldCBsaW5lYWlyZSBhIGRlc3NpbmVyICovCisgIGNoYXIgZ29vbWxpbWl0OyAgICAvKiBzZW5zaWJpbGl0w6kgZHUgZ29vbSAqLworCisgIFpvb21GaWx0ZXJEYXRhICp6ZmQ7CisgIAorICAvKiBSYW5kb20gdGFibGUgKi8KKyAgZ2ludCAgKnJhbmRfdGFiOworICBndWludCAgcmFuZF9wb3M7Cit9IEdvb21EYXRhOworCit2b2lkIGdvb21faW5pdCAoR29vbURhdGEgKmdvb21kYXRhLCBndWludDMyIHJlc3gsIGd1aW50MzIgcmVzeSk7Cit2b2lkIGdvb21fc2V0X3Jlc29sdXRpb24gKEdvb21EYXRhICpnb29tZGF0YSwgZ3VpbnQzMiByZXN4LCBndWludDMyIHJlc3kpOworCitndWludDMyICpnb29tX3VwZGF0ZSAoR29vbURhdGEgKmdvb21kYXRhLCBnaW50MTYgZGF0YSBbMl1bNTEyXSk7CisKK3ZvaWQgZ29vbV9jbG9zZSAoR29vbURhdGEgKmdvb21kYXRhKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvZ29vbTJrMS9nb29tX3Rvb2xzLmggYi9nc3QvZ29vbTJrMS9nb29tX3Rvb2xzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE3OGRiYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tMmsxL2dvb21fdG9vbHMuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIF9HT09NVE9PTFNfSAorI2RlZmluZSBfR09PTVRPT0xTX0gKKworI2RlZmluZSBOQl9SQU5EIDB4MTAwMDAKKworI2RlZmluZSBSQU5EX0lOSVQoZ2QsaSkgXAorICAgICAgICBzcmFuZCAoaSk7IFwKKyAgICAgICAgaWYgKGdkLT5yYW5kX3RhYiA9PSBOVUxMKSBcCisgICAgICAgICAgICAgICAgZ2QtPnJhbmRfdGFiID0gZ19tYWxsb2MgKE5CX1JBTkQgKiBzaXplb2YoZ2ludCkpIDtcCisgICAgICAgIGdkLT5yYW5kX3BvcyA9IDA7IFwKKyAgICAgICAgd2hpbGUgKGdkLT5yYW5kX3BvcyA8IE5CX1JBTkQpIFwKKyAgICAgICAgICAgICAgICBnZC0+cmFuZF90YWIgW2dkLT5yYW5kX3BvcysrXSA9IHJhbmQgKCk7CisKKyNkZWZpbmUgUkFORChnZCkgXAorICAgICAgICAoZ2QtPnJhbmRfdGFiW2dkLT5yYW5kX3BvcyA9ICgoZ2QtPnJhbmRfcG9zICsgMSkgJSBOQl9SQU5EKV0pCisKKyNkZWZpbmUgUkFORF9DTE9TRShnZCkgXAorICAgICAgICBnX2ZyZWUgKGdkLT5yYW5kX3RhYik7IFwKKyAgICAgICAgZ2QtPnJhbmRfdGFiID0gTlVMTDsKKworLyojZGVmaW5lIGlSQU5EKGkpICgoZ3VpbnQzMikoKGZsb2F0KWkgKiBSQU5EKCkvUkFORF9NQVgpKSAqLworI2RlZmluZSBpUkFORChnZCxpKSAoUkFORChnZCkgJSBpKQorICAgICAgICAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20yazEvZ3JhcGhpYy5jIGIvZ3N0L2dvb20yazEvZ3JhcGhpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMGY5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbTJrMS9ncmFwaGljLmMKQEAgLTAsMCArMSwxNCBAQAorI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3JhcGhpYy5oIgorCitjb25zdCBDb2xvciBCTEFDSyA9IHsgMCwgMCwgMCB9OworY29uc3QgQ29sb3IgV0hJVEUgPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKK2NvbnN0IENvbG9yIFJFRCA9IHsgMHhmZiwgMCwgMCB9OworY29uc3QgQ29sb3IgR1JFRU4gPSB7IDAsIDB4ZmYsIDAgfTsKK2NvbnN0IENvbG9yIEJMVUUgPSB7IDAsIDAsIDB4ZmYgfTsKK2NvbnN0IENvbG9yIFlFTExPVyA9IHsgMHhmZiwgMHhmZiwgMHgzMyB9OworY29uc3QgQ29sb3IgT1JBTkdFID0geyAweGZmLCAweGNjLCAweDAwIH07Citjb25zdCBDb2xvciBWSU9MRVQgPSB7IDB4NTUsIDB4MDAsIDB4ZmYgfTsKZGlmZiAtLWdpdCBhL2dzdC9nb29tMmsxL2dyYXBoaWMuaCBiL2dzdC9nb29tMmsxL2dyYXBoaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTU0ZDdmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20yazEvZ3JhcGhpYy5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgR1JBUEhJQ19ICisjZGVmaW5lIEdSQVBISUNfSAorCisjaW5jbHVkZSA8Z2xpYi5oPiAgLyogZGVmaW5lcyBpbmxpbmUgZm9yIGJldHRlciBwb3J0YWJpbGl0eSAqLworCit0eXBlZGVmIHVuc2lnbmVkIGludCBVaW50OworCit0eXBlZGVmIHN0cnVjdAoreworICB1bnNpZ25lZCBzaG9ydCByLHYsYjsKK30KK0NvbG9yOworCitleHRlcm4gY29uc3QgQ29sb3IgQkxBQ0s7CitleHRlcm4gY29uc3QgQ29sb3IgV0hJVEU7CitleHRlcm4gY29uc3QgQ29sb3IgUkVEOworZXh0ZXJuIGNvbnN0IENvbG9yIEJMVUU7CitleHRlcm4gY29uc3QgQ29sb3IgR1JFRU47CitleHRlcm4gY29uc3QgQ29sb3IgWUVMTE9XOworZXh0ZXJuIGNvbnN0IENvbG9yIE9SQU5HRTsKK2V4dGVybiBjb25zdCBDb2xvciBWSU9MRVQ7CisKKyNlbmRpZiAvKkdSQVBISUNfSCovCmRpZmYgLS1naXQgYS9nc3QvZ29vbTJrMS9nc3Rnb29tLmMgYi9nc3QvZ29vbTJrMS9nc3Rnb29tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZiZmNiYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tMmsxL2dzdGdvb20uYwpAQCAtMCwwICsxLDE5MyBAQAorLyogZ3N0Z29vbS5jOiBpbXBsZW1lbnRhdGlvbiBvZiBnb29tIGRyYXdpbmcgZWxlbWVudAorICogQ29weXJpZ2h0IChDKSA8MjAwMT4gUmljaGFyZCBCb3VsdG9uIDxyaWNoYXJkQHRhcnRhcnVzLm9yZz4KKyAqICAgICAgICAgICAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW0gYXQgZmx1ZW5kbyBkb3QgY29tPgorICogICAgICAgICAgIChDKSA8MjAxNT4gTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc0BkZWJldGhlbmNvdXJ0LmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1nb29tMmsxCisgKiBAc2VlX2Fsc286IGdvb20sIHN5bmFlc3RoZXNpYQorICoKKyAqIEdvb20yazEgaXMgYW4gYXVkaW8gdmlzdWFsaXNhdGlvbiBlbGVtZW50LiBJdCBjcmVhdGVzIHdhcnBpbmcgc3RydWN0dXJlcworICogYmFzZWQgb24gdGhlIGluY29tbWluZyBhdWRpbyBzaWduYWwuIEdvb20yazEgaXMgdGhlIG9sZGVyIHZlcnNpb24gb2YgdGhlCisgKiB2aXN1YWxpc2F0aW9uLiBBbHNvIGF2YWlsYWJsZSBpcyBnb29tMms0LCB3aXRoIGEgZGlmZmVyZW50IGxvb2suCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyAhIGdvb20yazEgISB2aWRlb2NvbnZlcnQgISB4dmltYWdlc2luaworICogXXwKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0Z29vbS5oIgorI2luY2x1ZGUgImdvb21fY29yZS5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnb29tMmsxX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdvb20yazFfZGVidWcKKworI2RlZmluZSBERUZBVUxUX1dJRFRIICAzMjAKKyNkZWZpbmUgREVGQVVMVF9IRUlHSFQgMjQwCisjZGVmaW5lIERFRkFVTFRfRlBTX04gIDI1CisjZGVmaW5lIERFRkFVTFRfRlBTX0QgIDEKKworI2lmIEdfQllURV9PUkRFUiA9PSBHX0JJR19FTkRJQU4KKyNkZWZpbmUgUkdCX09SREVSICJ4UkdCIgorI2Vsc2UKKyNkZWZpbmUgUkdCX09SREVSICJCR1J4IgorI2VuZGlmCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFIChSR0JfT1JERVIpKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwgICAgLyogdGhlIG5hbWUgb2YgdGhlIHBhZHMgKi8KKyAgICBHU1RfUEFEX1NJTkssICAgICAgICAgICAgICAgLyogdHlwZSBvZiB0aGUgcGFkICovCisgICAgR1NUX1BBRF9BTFdBWVMsICAgICAgICAgICAgIC8qIEFMV0FZUy9TT01FVElNRVMgKi8KKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKFMxNikgIiwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgODAwMCwgOTYwMDAgXSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZDsgIgorICAgICAgICAiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChTMTYpICIsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDgwMDAsIDk2MDAwIF0sICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMiwgIgorICAgICAgICAiY2hhbm5lbC1tYXNrID0gKGJpdG1hc2spIDB4MywgIiAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQiKQorICAgICk7CisKK3N0YXRpYyB2b2lkIGdzdF9nb29tMmsxX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9nb29tMmsxX3NldHVwIChHc3RBdWRpb1Zpc3VhbGl6ZXIgKiBiYXNlKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZ29vbTJrMV9yZW5kZXIgKEdzdEF1ZGlvVmlzdWFsaXplciAqIGJhc2UsCisgICAgR3N0QnVmZmVyICogYXVkaW8sIEdzdFZpZGVvRnJhbWUgKiB2aWRlbyk7CisKKworR19ERUZJTkVfVFlQRSAoR3N0R29vbTJrMSwgZ3N0X2dvb20yazEsIEdTVF9UWVBFX0FVRElPX1ZJU1VBTElaRVIpOworCitzdGF0aWMgdm9pZAorZ3N0X2dvb20yazFfY2xhc3NfaW5pdCAoR3N0R29vbTJrMUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RBdWRpb1Zpc3VhbGl6ZXJDbGFzcyAqdmlzdWFsaXplcl9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIHZpc3VhbGl6ZXJfY2xhc3MgPSAoR3N0QXVkaW9WaXN1YWxpemVyQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfZ29vbTJrMV9maW5hbGl6ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIkdPT006IHdoYXQgYSBHT09NISAyazEgZWRpdGlvbiIsICJWaXN1YWxpemF0aW9uIiwKKyAgICAgICJUYWtlcyBmcmFtZXMgb2YgZGF0YSBhbmQgb3V0cHV0cyB2aWRlbyBmcmFtZXMgdXNpbmcgdGhlIEdPT00gMmsxIGZpbHRlciIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4iKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnb29tMmsxX2RlYnVnLCAiZ29vbTJrMSIsIDAsCisgICAgICAiZ29vbTJrMSB2aXN1YWxpc2F0aW9uIGVsZW1lbnQiKTsKKworICB2aXN1YWxpemVyX2NsYXNzLT5zZXR1cCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZ29vbTJrMV9zZXR1cCk7CisgIHZpc3VhbGl6ZXJfY2xhc3MtPnJlbmRlciA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZ29vbTJrMV9yZW5kZXIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2dvb20yazFfaW5pdCAoR3N0R29vbTJrMSAqIGdvb20pCit7CisgIGdvb20tPndpZHRoID0gREVGQVVMVF9XSURUSDsKKyAgZ29vbS0+aGVpZ2h0ID0gREVGQVVMVF9IRUlHSFQ7CisgIGdvb20tPmNoYW5uZWxzID0gMDsKKworICBnb29tX2luaXQgKCYoZ29vbS0+Z29vbWRhdGEpLCBnb29tLT53aWR0aCwgZ29vbS0+aGVpZ2h0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9nb29tMmsxX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RHb29tMmsxICpnb29tID0gR1NUX0dPT00ySzEgKG9iamVjdCk7CisKKyAgZ29vbV9jbG9zZSAoJihnb29tLT5nb29tZGF0YSkpOworCisgIEdfT0JKRUNUX0NMQVNTIChnc3RfZ29vbTJrMV9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZ29vbTJrMV9zZXR1cCAoR3N0QXVkaW9WaXN1YWxpemVyICogYmFzZSkKK3sKKyAgR3N0R29vbTJrMSAqZ29vbSA9IEdTVF9HT09NMksxIChiYXNlKTsKKworICBnb29tLT53aWR0aCA9IEdTVF9WSURFT19JTkZPX1dJRFRIICgmYmFzZS0+dmluZm8pOworICBnb29tLT5oZWlnaHQgPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZiYXNlLT52aW5mbyk7CisKKyAgZ29vbV9zZXRfcmVzb2x1dGlvbiAoJihnb29tLT5nb29tZGF0YSksIGdvb20tPndpZHRoLCBnb29tLT5oZWlnaHQpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9nb29tMmsxX3JlbmRlciAoR3N0QXVkaW9WaXN1YWxpemVyICogYmFzZSwgR3N0QnVmZmVyICogYXVkaW8sCisgICAgR3N0VmlkZW9GcmFtZSAqIHZpZGVvKQoreworICBHc3RHb29tMmsxICpnb29tID0gR1NUX0dPT00ySzEgKGJhc2UpOworICBHc3RNYXBJbmZvIGFtYXA7CisgIGdpbnQxNiBkYXRhaW5bMl1bR09PTTJLMV9TQU1QTEVTXTsKKyAgZ2ludDE2ICphZGF0YTsKKyAgZ2ludCBpOworCisgIC8qIGdldCBuZXh0IEdPT00ySzFfU0FNUExFUywgd2UgaGF2ZSBhdCBsZWFzdCB0aGlzIGFtb3VudCBvZiBzYW1wbGVzICovCisgIGdzdF9idWZmZXJfbWFwIChhdWRpbywgJmFtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGFkYXRhID0gKGdpbnQxNiAqKSBhbWFwLmRhdGE7CisKKyAgaWYgKGdvb20tPmNoYW5uZWxzID09IDIpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgR09PTTJLMV9TQU1QTEVTOyBpKyspIHsKKyAgICAgIGRhdGFpblswXVtpXSA9ICphZGF0YSsrOworICAgICAgZGF0YWluWzFdW2ldID0gKmFkYXRhKys7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCBHT09NMksxX1NBTVBMRVM7IGkrKykgeworICAgICAgZGF0YWluWzBdW2ldID0gKmFkYXRhOworICAgICAgZGF0YWluWzFdW2ldID0gKmFkYXRhKys7CisgICAgfQorICB9CisKKyAgdmlkZW8tPmRhdGFbMF0gPSBnb29tX3VwZGF0ZSAoJihnb29tLT5nb29tZGF0YSksIGRhdGFpbik7CisgIGdzdF9idWZmZXJfdW5tYXAgKGF1ZGlvLCAmYW1hcCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJnb29tMmsxIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgIEdTVF9UWVBFX0dPT00ySzEpOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgZ29vbTJrMSwKKyAgICAiR09PTSAyazEgdmlzdWFsaXphdGlvbiBmaWx0ZXIiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20yazEvZ3N0Z29vbS5oIGIvZ3N0L2dvb20yazEvZ3N0Z29vbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYjgxOGIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbTJrMS9nc3Rnb29tLmgKQEAgLTAsMCArMSw2OCBAQAorLyogZ3N0Z29vbS5jOiBpbXBsZW1lbnRhdGlvbiBvZiBnb29tIGRyYXdpbmcgZWxlbWVudAorICogQ29weXJpZ2h0IChDKSA8MjAwMT4gUmljaGFyZCBCb3VsdG9uIDxyaWNoYXJkQHRhcnRhcnVzLm9yZz4KKyAqICAgICAgICAgICAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW0gYXQgZmx1ZW5kbyBkb3QgY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAxNT4gTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc0BkZWJldGhlbmNvdXJ0LmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0dPT01fSF9fCisjZGVmaW5lIF9fR1NUX0dPT01fSF9fCisKKyNpbmNsdWRlIDxnc3QvcGJ1dGlscy9nc3RhdWRpb3Zpc3VhbGl6ZXIuaD4KKworI2luY2x1ZGUgImdvb21fY29yZS5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR09PTTJLMV9TQU1QTEVTIDUxMgorCisjZGVmaW5lIEdTVF9UWVBFX0dPT00ySzEgICAgICAgICAgICAoZ3N0X2dvb20yazFfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0dPT00ySzEob2JqKSAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9HT09NMksxLEdzdEdvb20yazEpKQorI2RlZmluZSBHU1RfR09PTTJLMV9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfR09PTTJLMSxHc3RHb29tMmsxQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfR09PTTJLMShvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0dPT00ySzEpKQorI2RlZmluZSBHU1RfSVNfR09PTTJLMV9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfR09PTTJLMSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RHb29tMmsxIEdzdEdvb20yazE7Cit0eXBlZGVmIHN0cnVjdCBfR3N0R29vbTJrMUNsYXNzIEdzdEdvb20yazFDbGFzczsKKworc3RydWN0IF9Hc3RHb29tMmsxCit7CisgIEdzdEF1ZGlvVmlzdWFsaXplciBwYXJlbnQ7CisKKyAgLyogaW5wdXQgdHJhY2tpbmcgKi8KKyAgZ2ludCBjaGFubmVsczsKKworICAvKiB2aWRlbyBzdGF0ZSAqLworICBnaW50IHdpZHRoOworICBnaW50IGhlaWdodDsKKworICAvKiBnb29tIHN0dWZmICovCisgIEdvb21EYXRhIGdvb21kYXRhOworfTsKKworc3RydWN0IF9Hc3RHb29tMmsxQ2xhc3MKK3sKKyAgR3N0QXVkaW9WaXN1YWxpemVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2dvb20yazFfZ2V0X3R5cGUgKHZvaWQpOworZ2Jvb2xlYW4gZ3N0X2dvb20yazFfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9HT09NX0hfXyAqLworCmRpZmYgLS1naXQgYS9nc3QvZ29vbTJrMS9saW5lcy5jIGIvZ3N0L2dvb20yazEvbGluZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDRiNjhlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20yazEvbGluZXMuYwpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqICBsaW5lcy5jCisgKiAgaVR1bmVzWFBsdWdJbgorICoKKyAqICBDcmVhdGVkIGJ5IGd1aWxsYXVtIG9uIFR1ZSBBdWcgMTQgMjAwMS4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDEgX19Db21wYW55TmFtZV9fLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJsaW5lcy5oIgorI2luY2x1ZGUgPG1hdGguaD4KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyCitsaWdodGVuICh1bnNpZ25lZCBjaGFyIHZhbHVlLCB1bnNpZ25lZCBjaGFyIHBvd2VyKQoreworICB1bnNpZ25lZCBjaGFyIGk7CisKKyAgZm9yIChpID0gMDsgaSA8IHBvd2VyOyBpKyspCisgICAgdmFsdWUgKz0gKDI1NSAtIHZhbHVlKSAvIDU7CisgIHJldHVybiB2YWx1ZTsKK30KKwordm9pZAorZ29vbV9saW5lcyAoR29vbURhdGEgKiBnb29tZGF0YSwgZ2ludDE2IGRhdGFbMl1bNTEyXSwgdW5zaWduZWQgaW50IElELAorICAgIHVuc2lnbmVkIGludCAqcCwgZ3VpbnQzMiBwb3dlcikKK3sKKyAgZ3VpbnQzMiBjb2xvcjE7CisgIGd1aW50MzIgY29sb3IyOworICBndWludDMyIHJlc29seCA9IGdvb21kYXRhLT5yZXNvbHg7CisgIGd1aW50MzIgcmVzb2x5ID0gZ29vbWRhdGEtPnJlc29seTsKKyAgdW5zaWduZWQgY2hhciAqY29sb3IgPSAxICsgKHVuc2lnbmVkIGNoYXIgKikgJmNvbG9yMTsKKworICBzd2l0Y2ggKElEKSB7CisgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgLyogSG9yaXpvbnRhbCBzdGVyZW8gbGluZXMgKi8KKyAgICB7CisgICAgICBjb2xvcjEgPSAweDAwMDBBQTAwOworICAgICAgY29sb3IyID0gMHgwMEFBMDAwMDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgIC8qIFN0ZXJlbyBjaXJjbGVzICovCisgICAgeworICAgICAgY29sb3IxID0gMHgwMEFBMzNERDsKKyAgICAgIGNvbG9yMiA9IDB4MDBBQTMzREQ7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDp7CisgICAgICBjb2xvcjEgPSBjb2xvcjIgPSAwOworICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgKmNvbG9yID0gbGlnaHRlbiAoKmNvbG9yLCBwb3dlcik7CisgIGNvbG9yKys7CisgICpjb2xvciA9IGxpZ2h0ZW4gKCpjb2xvciwgcG93ZXIpOworICBjb2xvcisrOworICAqY29sb3IgPSBsaWdodGVuICgqY29sb3IsIHBvd2VyKTsKKyAgY29sb3IgPSAxICsgKHVuc2lnbmVkIGNoYXIgKikgJmNvbG9yMjsKKyAgKmNvbG9yID0gbGlnaHRlbiAoKmNvbG9yLCBwb3dlcik7CisgIGNvbG9yKys7CisgICpjb2xvciA9IGxpZ2h0ZW4gKCpjb2xvciwgcG93ZXIpOworICBjb2xvcisrOworICAqY29sb3IgPSBsaWdodGVuICgqY29sb3IsIHBvd2VyKTsKKworICBzd2l0Y2ggKElEKSB7CisgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgLyogSG9yaXpvbnRhbCBzdGVyZW8gbGluZXMgKi8KKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IDUxMjsgaSsrKSB7CisgICAgICAgIGd1aW50MzIgcGxvdDsKKworICAgICAgICBwbG90ID0gaSAqIHJlc29seCAvIDUxMiArIChyZXNvbHkgLyA0ICsgZGF0YVswXVtpXSAvIDE2MDApICogcmVzb2x4OworICAgICAgICBwW3Bsb3RdID0gY29sb3IxOworICAgICAgICBwW3Bsb3QgKyAxXSA9IGNvbG9yMTsKKyAgICAgICAgcGxvdCA9IGkgKiByZXNvbHggLyA1MTIgKyAocmVzb2x5ICogMyAvIDQgLSBkYXRhWzFdW2ldIC8gMTYwMCkgKiByZXNvbHg7CisgICAgICAgIHBbcGxvdF0gPSBjb2xvcjI7CisgICAgICAgIHBbcGxvdCArIDFdID0gY29sb3IyOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgLyogU3RlcmVvIGNpcmNsZXMgKi8KKyAgICB7CisgICAgICBmbG9hdCB6OworICAgICAgdW5zaWduZWQgaW50IG1vblggPSByZXNvbHggLyAyOworICAgICAgZmxvYXQgbW9uWSA9IChmbG9hdCkgcmVzb2x5IC8gNDsKKyAgICAgIGZsb2F0IG1vblkyID0gKGZsb2F0KSByZXNvbHkgLyAyOworCisgICAgICBmb3IgKHogPSAwOyB6IDwgNi4yODMyZjsgeiArPSAxLjBmIC8gbW9uWSkgeworICAgICAgICAvKiBmbG9hdCBvZmZzZXQxID0gMTI4K2RhdGFbMV1bKHVuc2lnbmVkIGludCkoeio4MS4zM2YpXSkvMjAwMDAwOyAqLworICAgICAgICBwW21vblggKyAodW5zaWduZWQgaW50KSAoKG1vblkgKyAoKGZsb2F0KSByZXNvbHkpICogKDEyOCArCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdWyh1bnNpZ25lZCBpbnQpICh6ICogODEuMzNmKV0pIC8gMjAwMDAwKSAqCisgICAgICAgICAgICAgICAgY29zICh6KSArIHJlc29seCAqICh1bnNpZ25lZCBpbnQpIChtb25ZMiArIChtb25ZICsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoZmxvYXQpIHJlc29seSkgKiAoMTI4ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdWyh1bnNpZ25lZCBpbnQpICh6ICogODEuMzNmKV0pIC8gNDAwMDAwKSAqCisgICAgICAgICAgICAgICAgICAgIHNpbiAoeikpKV0gPSBjb2xvcjE7CisgICAgICAgIHBbbW9uWCArICh1bnNpZ25lZCBpbnQpICgobW9uWSAtICgoZmxvYXQpIHJlc29seSkgKiAoMTI4ICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMF1bKHVuc2lnbmVkIGludCkgKHogKiA4MS4zM2YpXSkgLyAyMDAwMDApICoKKyAgICAgICAgICAgICAgICBjb3MgKHopICsgcmVzb2x4ICogKHVuc2lnbmVkIGludCkgKG1vblkyICsgKG1vblkgLQorICAgICAgICAgICAgICAgICAgICAgICAgKChmbG9hdCkgcmVzb2x5KSAqICgxMjggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMF1bKHVuc2lnbmVkIGludCkgKHogKiA4MS4zM2YpXSkgLyA0MDAwMDApICoKKyAgICAgICAgICAgICAgICAgICAgc2luICh6KSkpXSA9IGNvbG9yMjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20yazEvbGluZXMuaCBiL2dzdC9nb29tMmsxL2xpbmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4ZjMzOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tMmsxL2xpbmVzLmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqICBsaW5lcy5oCisgKiAgaUdvb20KKyAqCisgKiAgQ3JlYXRlZCBieSBndWlsbGF1bSBvbiBUdWUgQXVnIDE0IDIwMDEuCisgKiAgQ29weXJpZ2h0IChjKSAyMDAxIGlvcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKi8KKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlICJncmFwaGljLmgiCisjaW5jbHVkZSAiZ29vbV9jb3JlLmgiCisKK3ZvaWQgZ29vbV9saW5lcyhHb29tRGF0YSAqZ29vbWRhdGEsIGdpbnQxNiBkYXRhIFsyXVs1MTJdLCB1bnNpZ25lZCBpbnQgSUQsdW5zaWduZWQgaW50KiBwLCBndWludDMyIHBvd2VyKTsKKworCmRpZmYgLS1naXQgYS9nc3QvZ29vbTJrMS9tZXNvbi5idWlsZCBiL2dzdC9nb29tMmsxL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NjBiZDgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbTJrMS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDM5IEBACitnb29tMmsxX2FyZ3MgPSBbCisgICctRGdzdF9nb29tX2dldF90eXBlPWdzdF9nb29tMmsxX2dldF90eXBlJywKKyAgJy1EZ29vbV9pbml0PWdvb20yazFfaW5pdCcsCisgICctRGdvb21fY2xvc2U9Z29vbTJrMV9jbG9zZScsCisgICctRGdvb21fdXBkYXRlPWdvb20yazFfdXBkYXRlJywKKyAgJy1EZ29vbV9zZXRfcmVzb2x1dGlvbj1nb29tMmsxX3NldF9yZXNvbHV0aW9uJywKKyAgJy1EZ29vbV9saW5lcz1nb29tMmsxX2xpbmVzJywKKyAgJy1EQkxBQ0s9R09PTTJLMV9CTEFDSycsCisgICctRFdISVRFPUdPT00ySzFfV0hJVEUnLAorICAnLURSRUQ9R09PTTJLMV9SRUQnLAorICAnLURCTFVFPUdPT00ySzFfQkxVRScsCisgICctREdSRUVOPUdPT00ySzFfR1JFRU4nLAorICAnLURZRUxMT1c9R09PTTJLMV9ZRUxMT1cnLAorICAnLURPUkFOR0U9R09PTTJLMV9PUkFOR0UnLAorICAnLURWSU9MRVQ9R09PTTJLMV9WSU9MRVQnLAorICAnLUR6b29tRmlsdGVyRmFzdFJHQj16b29tRmlsdGVyRmFzdFJHQjJrMScsCisgICctRHBvaW50RmlsdGVyPXBvaW50RmlsdGVyMmsxJywKKyAgJy1Eem9vbUZpbHRlckRlc3Ryb3k9em9vbUZpbHRlckRlc3Ryb3kyazEnLAorICAnLUR6b29tRmlsdGVyTmV3PXpvb21GaWx0ZXJOZXcyazEnCitdCisKK2ZpbHRlcl9hcmdzID0gWyctVU1NWCcsICctVVVTRV9BU00nXQorCitnb29tMmsxX3NvdXJjZXMgPSBbCisgICdnc3Rnb29tLmMnLAorICAnZ29vbV9jb3JlLmMnLAorICAnZmlsdGVycy5jJywKKyAgJ2dyYXBoaWMuYycsCisgICdsaW5lcy5jJworXQorCitnc3Rnb29tMmsxID0gbGlicmFyeSgnZ3N0Z29vbTJrMScsCisgIGdvb20yazFfc291cmNlcywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzICsgZ29vbTJrMV9hcmdzICsgZmlsdGVyX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdHBidXRpbHNfZGVwLCBnc3RiYXNlX2RlcCwgbGlibV0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvaWN5ZGVtdXgvTWFrZWZpbGUuYW0gYi9nc3QvaWN5ZGVtdXgvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljMDIxZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pY3lkZW11eC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDggQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdGljeWRlbXV4LmxhCisKK2xpYmdzdGljeWRlbXV4X2xhX1NPVVJDRVMgPSBnc3RpY3lkZW11eC5jCitsaWJnc3RpY3lkZW11eF9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKQorbGliZ3N0aWN5ZGVtdXhfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0dGFnLUBHU1RfQVBJX1ZFUlNJT05AICQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykKK2xpYmdzdGljeWRlbXV4X2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3RpY3lkZW11eC5oCmRpZmYgLS1naXQgYS9nc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYyBiL2dzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZmRhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYwpAQCAtMCwwICsxLDY3NyBAQAorLyogLSotIE1vZGU6IEM7IHRhYi13aWR0aDogMjsgaW5kZW50LXRhYnMtbW9kZTogdDsgYy1iYXNpYy1vZmZzZXQ6IDIgLSotICovCisvKiBDb3B5cmlnaHQgMjAwNSBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKyAqICAgICAgICAgICAyMDA2IE1pY2hhZWwgU21pdGggPG1zbWl0aEBmbHVlbmRvLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IEJlbmphbWluIE90dGUgPG90dGVAZ25vbWUub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWljeWRlbXV4CisgKgorICogaWN5ZGVtdXggYWNjZXB0cyBkYXRhIHN0cmVhbXMgd2l0aCBJQ1kgbWV0YWRhdGEgYXQga25vd24gaW50ZXJ2YWxzLCBhcworICogdHJhbnNtaXR0ZWQgZnJvbSBhbiB1cHN0cmVhbSBlbGVtZW50ICh1c3VhbGx5IHJlYWQgYXMgcmVzcG9uc2UgaGVhZGVycyBmcm9tCisgKiBhbiBIVFRQIHN0cmVhbSkuIFRoZSBtaW1lIHR5cGUgb2YgdGhlIGRhdGEgYmV0d2VlbiB0aGUgdGFnIGJsb2NrcyBpcworICogZGV0ZWN0ZWQgdXNpbmcgdHlwZWZpbmQgZnVuY3Rpb25zLCBhbmQgdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBtaW1lIHR5cGUgc2V0CisgKiBvbiBvdXRnb2luZyBidWZmZXJzLiAKKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgc291cGh0dHBzcmMgbG9jYXRpb249aHR0cDovL3NvbWUuc2VydmVyLyBpcmFkaW8tbW9kZT10cnVlICEgaWN5ZGVtdXggISBmYWtlc2luayAtdAorICogXXwgVGhpcyBwaXBlbGluZSBzaG91bGQgcmVhZCBhbnkgYXZhaWxhYmxlIElDWSB0YWcgaW5mb3JtYXRpb24gYW5kIG91dHB1dCBpdC4KKyAqIFRoZSBjb250ZW50cyBvZiB0aGUgc3RyZWFtIHNob3VsZCBiZSBkZXRlY3RlZCwgYW5kIHRoZSBhcHByb3ByaWF0ZSBtaW1lCisgKiB0eXBlIHNldCBvbiBidWZmZXJzIHByb2R1Y2VkIGZyb20gaWN5ZGVtdXguIChVc2luZyBnbm9tZXZmc3NyYywgbmVvbmh0dHBzcmMKKyAqIG9yIGdpb3NyYyBpbnN0ZWFkIG9mIHNvdXBodHRwc3JjIHNob3VsZCBhbHNvIHdvcmsuKQorICogPC9yZWZzZWN0Mj4KKyAqLworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0LWkxOG4tcGx1Z2luLmg+CisjaW5jbHVkZSA8Z3N0L3RhZy90YWcuaD4KKworI2luY2x1ZGUgImdzdGljeWRlbXV4LmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBJQ1lfVFlQRV9GSU5EX01BWF9TSVpFICg0MCoxMDI0KQorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChpY3lkZW11eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAoaWN5ZGVtdXhfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LWljeSwgbWV0YWRhdGEtaW50ZXJ2YWwgPSAoaW50KVswLCBNQVhdIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9TT01FVElNRVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiQU5ZIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfaWN5ZGVtdXhfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9pY3lkZW11eF9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyICogYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfaWN5ZGVtdXhfaGFuZGxlX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9pY3lkZW11eF9hZGRfc3JjcGFkIChHc3RJQ1lEZW11eCAqIGljeWRlbXV4LAorICAgIEdzdENhcHMgKiBuZXdfY2Fwcyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ljeWRlbXV4X3JlbW92ZV9zcmNwYWQgKEdzdElDWURlbXV4ICogaWN5ZGVtdXgpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X2ljeWRlbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ljeWRlbXV4X3Npbmtfc2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RDYXBzICogY2Fwcyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfaWN5ZGVtdXhfc2VuZF90YWdfZXZlbnQgKEdzdElDWURlbXV4ICogaWN5ZGVtdXgsCisgICAgR3N0VGFnTGlzdCAqIHRhZ2xpc3QpOworCisKKyNkZWZpbmUgZ3N0X2ljeWRlbXV4X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdElDWURlbXV4LCBnc3RfaWN5ZGVtdXgsIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgdm9pZAorZ3N0X2ljeWRlbXV4X2NsYXNzX2luaXQgKEdzdElDWURlbXV4Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIHBhcmVudF9jbGFzcyA9IGdfdHlwZV9jbGFzc19yZWYgKEdTVF9UWVBFX0VMRU1FTlQpOworCisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3RfaWN5ZGVtdXhfZGlzcG9zZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfaWN5ZGVtdXhfY2hhbmdlX3N0YXRlOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc3JjX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfZmFjdG9yeSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIklDWSB0YWcgZGVtdXhlciIsCisgICAgICAiQ29kZWMvRGVtdXhlci9NZXRhZGF0YSIsCisgICAgICAiUmVhZCBhbmQgb3V0cHV0IElDWSB0YWdzIHdoaWxlIGRlbXV4aW5nIHRoZSBjb250ZW50cyIsCisgICAgICAiSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+LCAiCisgICAgICAiTWljaGFlbCBTbWl0aCA8bXNtaXRoQGZsdWVuZG8uY29tPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2ljeWRlbXV4X3Jlc2V0IChHc3RJQ1lEZW11eCAqIGljeWRlbXV4KQoreworICAvKiBVbmtub3duIGF0IHRoZSBtb21lbnQgKHRoaXMgaXMgYSBmYXRhbCBlcnJvciBpZiBkb24ndCBoYXZlIGEgdmFsdWUgYnkgdGhlCisgICAqIHRpbWUgd2UgZ2V0IHRvIG91ciBjaGFpbiBmdW5jdGlvbikKKyAgICovCisgIGljeWRlbXV4LT5tZXRhX2ludGVydmFsID0gLTE7CisgIGljeWRlbXV4LT5yZW1haW5pbmcgPSAwOworCisgIGljeWRlbXV4LT50eXBlZmluZGluZyA9IFRSVUU7CisKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJihpY3lkZW11eC0+c3JjX2NhcHMpLCBOVUxMKTsKKworICBnc3RfaWN5ZGVtdXhfcmVtb3ZlX3NyY3BhZCAoaWN5ZGVtdXgpOworCisgIGlmIChpY3lkZW11eC0+Y2FjaGVkX3RhZ3MpIHsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKGljeWRlbXV4LT5jYWNoZWRfdGFncyk7CisgICAgaWN5ZGVtdXgtPmNhY2hlZF90YWdzID0gTlVMTDsKKyAgfQorCisgIGlmIChpY3lkZW11eC0+Y2FjaGVkX2V2ZW50cykgeworICAgIGdfbGlzdF9mb3JlYWNoIChpY3lkZW11eC0+Y2FjaGVkX2V2ZW50cywKKyAgICAgICAgKEdGdW5jKSBnc3RfbWluaV9vYmplY3RfdW5yZWYsIE5VTEwpOworICAgIGdfbGlzdF9mcmVlIChpY3lkZW11eC0+Y2FjaGVkX2V2ZW50cyk7CisgICAgaWN5ZGVtdXgtPmNhY2hlZF9ldmVudHMgPSBOVUxMOworICB9CisKKyAgaWYgKGljeWRlbXV4LT5tZXRhX2FkYXB0ZXIpIHsKKyAgICBnc3RfYWRhcHRlcl9jbGVhciAoaWN5ZGVtdXgtPm1ldGFfYWRhcHRlcik7CisgICAgZ19vYmplY3RfdW5yZWYgKGljeWRlbXV4LT5tZXRhX2FkYXB0ZXIpOworICAgIGljeWRlbXV4LT5tZXRhX2FkYXB0ZXIgPSBOVUxMOworICB9CisKKyAgaWYgKGljeWRlbXV4LT50eXBlZmluZF9idWYpIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChpY3lkZW11eC0+dHlwZWZpbmRfYnVmKTsKKyAgICBpY3lkZW11eC0+dHlwZWZpbmRfYnVmID0gTlVMTDsKKyAgfQorCisgIGlmIChpY3lkZW11eC0+Y29udGVudF90eXBlKSB7CisgICAgZ19mcmVlIChpY3lkZW11eC0+Y29udGVudF90eXBlKTsKKyAgICBpY3lkZW11eC0+Y29udGVudF90eXBlID0gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2ljeWRlbXV4X2luaXQgKEdzdElDWURlbXV4ICogaWN5ZGVtdXgpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqa2xhc3MgPSBHU1RfRUxFTUVOVF9HRVRfQ0xBU1MgKGljeWRlbXV4KTsKKworICBpY3lkZW11eC0+c2lua3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywKKyAgICAgICAgICAic2luayIpLCAic2luayIpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoaWN5ZGVtdXgtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ljeWRlbXV4X2NoYWluKSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChpY3lkZW11eC0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfaWN5ZGVtdXhfaGFuZGxlX2V2ZW50KSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChpY3lkZW11eCksIGljeWRlbXV4LT5zaW5rcGFkKTsKKworICBnc3RfaWN5ZGVtdXhfcmVzZXQgKGljeWRlbXV4KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfaWN5ZGVtdXhfc2lua19zZXRjYXBzIChHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RJQ1lEZW11eCAqaWN5ZGVtdXggPSBHU1RfSUNZREVNVVggKEdTVF9QQURfUEFSRU5UIChwYWQpKTsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgY29uc3QgZ2NoYXIgKnRtcDsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAibWV0YWRhdGEtaW50ZXJ2YWwiLAorICAgICAgICAgICZpY3lkZW11eC0+bWV0YV9pbnRlcnZhbCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIElmIGluY29taW5nIGNhcHMgaGF2ZSB0aGUgSFRUUCBDb250ZW50LVR5cGUsIGNvcHkgdGhhdCBvdmVyICovCisgIGlmICgodG1wID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJjb250ZW50LXR5cGUiKSkpCisgICAgaWN5ZGVtdXgtPmNvbnRlbnRfdHlwZSA9IGdfc3RyZHVwICh0bXApOworCisgIC8qIFdlIGhhdmUgYSBtZXRhIGludGVydmFsLCBzbyBpbml0aWFsaXNlIHRoZSByZXN0ICovCisgIGljeWRlbXV4LT5yZW1haW5pbmcgPSBpY3lkZW11eC0+bWV0YV9pbnRlcnZhbDsKKyAgaWN5ZGVtdXgtPm1ldGFfcmVtYWluaW5nID0gMDsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaWN5ZGVtdXhfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0SUNZRGVtdXggKmljeWRlbXV4ID0gR1NUX0lDWURFTVVYIChvYmplY3QpOworCisgIGdzdF9pY3lkZW11eF9yZXNldCAoaWN5ZGVtdXgpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RDYXBzICpjYXBzOworICBHc3RQYWQgKnBhZDsKK30gQ29weVN0aWNreUV2ZW50c0RhdGE7CisKK3N0YXRpYyBnYm9vbGVhbgorY29weV9zdGlja3lfZXZlbnRzIChHc3RQYWQgKiBwYWQsIEdzdEV2ZW50ICoqIGV2ZW50LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIENvcHlTdGlja3lFdmVudHNEYXRhICpkYXRhID0gdXNlcl9kYXRhOworCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoKmV2ZW50KSA+PSBHU1RfRVZFTlRfQ0FQUyAmJiBkYXRhLT5jYXBzKSB7CisgICAgZ3N0X3BhZF9zZXRfY2FwcyAoZGF0YS0+cGFkLCBkYXRhLT5jYXBzKTsKKyAgICBkYXRhLT5jYXBzID0gTlVMTDsKKyAgfQorCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoKmV2ZW50KSAhPSBHU1RfRVZFTlRfQ0FQUykKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKGRhdGEtPnBhZCwgZ3N0X2V2ZW50X3JlZiAoKmV2ZW50KSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ljeWRlbXV4X2FkZF9zcmNwYWQgKEdzdElDWURlbXV4ICogaWN5ZGVtdXgsIEdzdENhcHMgKiBuZXdfY2FwcykKK3sKKyAgaWYgKGljeWRlbXV4LT5zcmNfY2FwcyA9PSBOVUxMIHx8CisgICAgICAhZ3N0X2NhcHNfaXNfZXF1YWwgKG5ld19jYXBzLCBpY3lkZW11eC0+c3JjX2NhcHMpKSB7CisgICAgZ3N0X2NhcHNfcmVwbGFjZSAoJihpY3lkZW11eC0+c3JjX2NhcHMpLCBuZXdfY2Fwcyk7CisgICAgaWYgKGljeWRlbXV4LT5zcmNwYWQgIT0gTlVMTCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaWN5ZGVtdXgsICJDaGFuZ2luZyBzcmMgcGFkIGNhcHMgdG8gJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgICAgaWN5ZGVtdXgtPnNyY19jYXBzKTsKKworICAgICAgZ3N0X3BhZF9zZXRfY2FwcyAoaWN5ZGVtdXgtPnNyY3BhZCwgaWN5ZGVtdXgtPnNyY19jYXBzKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogQ2FwcyBuZXZlciBjaGFuZ2VkICovCisgICAgZ3N0X2NhcHNfdW5yZWYgKG5ld19jYXBzKTsKKyAgfQorCisgIGlmIChpY3lkZW11eC0+c3JjcGFkID09IE5VTEwpIHsKKyAgICBDb3B5U3RpY2t5RXZlbnRzRGF0YSBkYXRhOworCisgICAgaWN5ZGVtdXgtPnNyY3BhZCA9CisgICAgICAgIGdzdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUKKyAgICAgICAgKEdTVF9FTEVNRU5UX0dFVF9DTEFTUyAoaWN5ZGVtdXgpLCAic3JjIiksICJzcmMiKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCAoaWN5ZGVtdXgtPnNyY3BhZCAhPSBOVUxMLCBGQUxTRSk7CisKKyAgICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChpY3lkZW11eC0+c3JjcGFkKTsKKyAgICBnc3RfcGFkX3NldF9hY3RpdmUgKGljeWRlbXV4LT5zcmNwYWQsIFRSVUUpOworCisgICAgZGF0YS5wYWQgPSBpY3lkZW11eC0+c3JjcGFkOworICAgIGRhdGEuY2FwcyA9IGljeWRlbXV4LT5zcmNfY2FwczsKKyAgICBnc3RfcGFkX3N0aWNreV9ldmVudHNfZm9yZWFjaCAoaWN5ZGVtdXgtPnNpbmtwYWQsIGNvcHlfc3RpY2t5X2V2ZW50cywKKyAgICAgICAgJmRhdGEpOworICAgIGlmIChkYXRhLmNhcHMpCisgICAgICBnc3RfcGFkX3NldF9jYXBzIChkYXRhLnBhZCwgZGF0YS5jYXBzKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGljeWRlbXV4LCAiQWRkaW5nIHNyYyBwYWQgd2l0aCBjYXBzICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICBpY3lkZW11eC0+c3JjX2NhcHMpOworCisgICAgaWYgKCEoZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKGljeWRlbXV4KSwgaWN5ZGVtdXgtPnNyY3BhZCkpKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIGdzdF9lbGVtZW50X25vX21vcmVfcGFkcyAoR1NUX0VMRU1FTlQgKGljeWRlbXV4KSk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfaWN5ZGVtdXhfcmVtb3ZlX3NyY3BhZCAoR3N0SUNZRGVtdXggKiBpY3lkZW11eCkKK3sKKyAgZ2Jvb2xlYW4gcmVzID0gVFJVRTsKKworICBpZiAoaWN5ZGVtdXgtPnNyY3BhZCAhPSBOVUxMKSB7CisgICAgcmVzID0gZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlQgKGljeWRlbXV4KSwgaWN5ZGVtdXgtPnNyY3BhZCk7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlcyAhPSBGQUxTRSwgRkFMU0UpOworICAgIGljeWRlbXV4LT5zcmNwYWQgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIHJlczsKK307CisKK3N0YXRpYyBnY2hhciAqCitnc3RfaWN5ZGVtdXhfdW5pY29kaWZ5IChjb25zdCBnY2hhciAqIHN0cikKK3sKKyAgY29uc3QgZ2NoYXIgKmVudl92YXJzW10gPSB7ICJHU1RfSUNZX1RBR19FTkNPRElORyIsCisgICAgIkdTVF9UQUdfRU5DT0RJTkciLCBOVUxMCisgIH07CisKKyAgcmV0dXJuIGdzdF90YWdfZnJlZWZvcm1fc3RyaW5nX3RvX3V0ZjggKHN0ciwgLTEsIGVudl92YXJzKTsKK30KKworLyogdGFrZXMgb3duZXJzaGlwIG9mIHRhZyBsaXN0ICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9pY3lkZW11eF90YWdfZm91bmQgKEdzdElDWURlbXV4ICogaWN5ZGVtdXgsIEdzdFRhZ0xpc3QgKiB0YWdzKQoreworICAvKiBzZW5kIHRoZSB0YWcgZXZlbnQgaWYgd2UgaGF2ZSBmaW5pc2hlZCB0eXBlZmluZGluZyBhbmQgaGF2ZSBhIHNyYyBwYWQgKi8KKyAgaWYgKGljeWRlbXV4LT5zcmNwYWQpCisgICAgcmV0dXJuIGdzdF9pY3lkZW11eF9zZW5kX3RhZ19ldmVudCAoaWN5ZGVtdXgsIHRhZ3MpOworCisgIC8qIGlmIHdlIGhhdmVuJ3QgYSBzb3VyY2UgcGFkIHlldCwgY2FjaGUgdGhlIHRhZ3MgKi8KKyAgaWYgKCFpY3lkZW11eC0+Y2FjaGVkX3RhZ3MpIHsKKyAgICBpY3lkZW11eC0+Y2FjaGVkX3RhZ3MgPSB0YWdzOworICB9IGVsc2UgeworICAgIGdzdF90YWdfbGlzdF9pbnNlcnQgKGljeWRlbXV4LT5jYWNoZWRfdGFncywgdGFncywKKyAgICAgICAgR1NUX1RBR19NRVJHRV9SRVBMQUNFX0FMTCk7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdzKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2ljeWRlbXV4X3BhcnNlX2FuZF9zZW5kX3RhZ3MgKEdzdElDWURlbXV4ICogaWN5ZGVtdXgpCit7CisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisgIGNvbnN0IGd1aW50OCAqZGF0YTsKKyAgaW50IGxlbmd0aCwgaTsKKyAgZ2Jvb2xlYW4gdGFnc19mb3VuZCA9IEZBTFNFOworICBnY2hhciAqYnVmZmVyOworICBnY2hhciAqKnN0cmluZ3M7CisKKyAgbGVuZ3RoID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChpY3lkZW11eC0+bWV0YV9hZGFwdGVyKTsKKworICBkYXRhID0gZ3N0X2FkYXB0ZXJfbWFwIChpY3lkZW11eC0+bWV0YV9hZGFwdGVyLCBsZW5ndGgpOworCisgIC8qIE5vdywgY29weSB0aGlzIHRvIGEgYnVmZmVyIHdoZXJlIHdlIGNhbiBOVUxMLXRlcm1pbmF0ZSBpdCB0byBtYWtlIHRoaW5ncworICAgKiBhIGJpdCBlYXNpZXIsIHRoZW4gZG8gdGhhdCBwYXJzaW5nLiAqLworICBidWZmZXIgPSBnX3N0cm5kdXAgKChjb25zdCBnY2hhciAqKSBkYXRhLCBsZW5ndGgpOworCisgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBzdHJpbmdzID0gZ19zdHJzcGxpdCAoYnVmZmVyLCAiJzsiLCAwKTsKKworICBmb3IgKGkgPSAwOyBzdHJpbmdzW2ldOyBpKyspIHsKKyAgICBpZiAoIWdfYXNjaWlfc3RybmNhc2VjbXAgKHN0cmluZ3NbaV0sICJTdHJlYW1UaXRsZT0iLCAxMikpIHsKKyAgICAgIGNoYXIgKnRpdGxlID0gZ3N0X2ljeWRlbXV4X3VuaWNvZGlmeSAoc3RyaW5nc1tpXSArIDEzKTsKKyAgICAgIHRhZ3NfZm91bmQgPSBUUlVFOworCisgICAgICBpZiAodGl0bGUgJiYgKnRpdGxlKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwgR1NUX1RBR19USVRMRSwKKyAgICAgICAgICAgIHRpdGxlLCBOVUxMKTsKKyAgICAgICAgZ19mcmVlICh0aXRsZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghZ19hc2NpaV9zdHJuY2FzZWNtcCAoc3RyaW5nc1tpXSwgIlN0cmVhbVVybD0iLCAxMCkpIHsKKyAgICAgIGNoYXIgKnVybCA9IGdzdF9pY3lkZW11eF91bmljb2RpZnkgKHN0cmluZ3NbaV0gKyAxMSk7CisgICAgICB0YWdzX2ZvdW5kID0gVFJVRTsKKworICAgICAgaWYgKHVybCAmJiAqdXJsKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwgR1NUX1RBR19IT01FUEFHRSwKKyAgICAgICAgICAgIHVybCwgTlVMTCk7CisgICAgICAgIGdfZnJlZSAodXJsKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBnX3N0cmZyZWV2IChzdHJpbmdzKTsKKyAgZ19mcmVlIChidWZmZXIpOworICBnc3RfYWRhcHRlcl91bm1hcCAoaWN5ZGVtdXgtPm1ldGFfYWRhcHRlcik7CisgIGdzdF9hZGFwdGVyX2ZsdXNoIChpY3lkZW11eC0+bWV0YV9hZGFwdGVyLCBsZW5ndGgpOworCisgIGlmICh0YWdzX2ZvdW5kKQorICAgIGdzdF9pY3lkZW11eF90YWdfZm91bmQgKGljeWRlbXV4LCB0YWdzKTsKKyAgZWxzZQorICAgIGdzdF90YWdfbGlzdF91bnJlZiAodGFncyk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ljeWRlbXV4X2hhbmRsZV9ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdElDWURlbXV4ICppY3lkZW11eCA9IEdTVF9JQ1lERU1VWCAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmVzdWx0OworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1RBRzoKKyAgICB7CisgICAgICBHc3RUYWdMaXN0ICp0YWdzOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfdGFnIChldmVudCwgJnRhZ3MpOworICAgICAgcmVzdWx0ID0gZ3N0X2ljeWRlbXV4X3RhZ19mb3VuZCAoaWN5ZGVtdXgsIGdzdF90YWdfbGlzdF9jb3B5ICh0YWdzKSk7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICByZXN1bHQgPSBnc3RfaWN5ZGVtdXhfc2lua19zZXRjYXBzIChwYWQsIGNhcHMpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoaWN5ZGVtdXgtPnR5cGVmaW5kaW5nKSB7CisgICAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgICBnX2xpc3RfZm9yZWFjaCAoaWN5ZGVtdXgtPmNhY2hlZF9ldmVudHMsCisgICAgICAgICAgICAoR0Z1bmMpIGdzdF9taW5pX29iamVjdF91bnJlZiwgTlVMTCk7CisgICAgICAgIGdfbGlzdF9mcmVlIChpY3lkZW11eC0+Y2FjaGVkX2V2ZW50cyk7CisgICAgICAgIGljeWRlbXV4LT5jYWNoZWRfZXZlbnRzID0gTlVMTDsKKworICAgICAgICByZXR1cm4gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKCFHU1RfRVZFTlRfSVNfU1RJQ0tZIChldmVudCkpIHsKKyAgICAgICAgICBpY3lkZW11eC0+Y2FjaGVkX2V2ZW50cyA9CisgICAgICAgICAgICAgIGdfbGlzdF9hcHBlbmQgKGljeWRlbXV4LT5jYWNoZWRfZXZlbnRzLCBldmVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9pY3lkZW11eF9zZW5kX2NhY2hlZF9ldmVudHMgKEdzdElDWURlbXV4ICogaWN5ZGVtdXgpCit7CisgIEdMaXN0ICpsOworCisgIGZvciAobCA9IGljeWRlbXV4LT5jYWNoZWRfZXZlbnRzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KSB7CisgICAgR3N0RXZlbnQgKmV2ZW50ID0gR1NUX0VWRU5UIChsLT5kYXRhKTsKKworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoaWN5ZGVtdXgtPnNyY3BhZCwgZXZlbnQpOworICB9CisgIGdfbGlzdF9mcmVlIChpY3lkZW11eC0+Y2FjaGVkX2V2ZW50cyk7CisgIGljeWRlbXV4LT5jYWNoZWRfZXZlbnRzID0gTlVMTDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9pY3lkZW11eF90eXBlZmluZF9vcl9mb3J3YXJkIChHc3RJQ1lEZW11eCAqIGljeWRlbXV4LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIGlmIChpY3lkZW11eC0+dHlwZWZpbmRpbmcpIHsKKyAgICBHc3RCdWZmZXIgKnRmX2J1ZjsKKyAgICBHc3RDYXBzICpjYXBzID0gTlVMTDsKKyAgICBHc3RUeXBlRmluZFByb2JhYmlsaXR5IHByb2I7CisKKyAgICAvKiBJZiB3ZSBoYXZlIGEgY29udGVudC10eXBlIGZyb20gdXBzdHJlYW0sIGxldCdzIHNlZSBpZiB3ZSBjYW4gc2hvcnRjdXQKKyAgICAgKiB0eXBlZmluZGluZyAqLworICAgIGlmIChHX1VOTElLRUxZIChpY3lkZW11eC0+Y29udGVudF90eXBlKSkgeworICAgICAgaWYgKCFnX2FzY2lpX3N0cmNhc2VjbXAgKGljeWRlbXV4LT5jb250ZW50X3R5cGUsICJ2aWRlby9uc3YiKSkgeworICAgICAgICBHU1RfREVCVUcgKCJXZSBoYXZlIGEgTlNWIHN0cmVhbSIpOworICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtbnN2Iik7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUcgKCJVcHN0cmVhbSBDb250ZW50LVR5cGUgaXNuJ3Qgc3VwcG9ydGVkIik7CisgICAgICAgIGdfZnJlZSAoaWN5ZGVtdXgtPmNvbnRlbnRfdHlwZSk7CisgICAgICAgIGljeWRlbXV4LT5jb250ZW50X3R5cGUgPSBOVUxMOworICAgICAgfQorICAgIH0KKworICAgIGlmIChpY3lkZW11eC0+dHlwZWZpbmRfYnVmKSB7CisgICAgICBpY3lkZW11eC0+dHlwZWZpbmRfYnVmID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKGljeWRlbXV4LT50eXBlZmluZF9idWYsIGJ1Zik7CisgICAgfSBlbHNlIHsKKyAgICAgIGljeWRlbXV4LT50eXBlZmluZF9idWYgPSBidWY7CisgICAgfQorCisgICAgLyogT25seSB0eXBlZmluZCBpZiB3ZSBoYXZlbid0IGFscmVhZHkgZ290IHNvbWUgY2FwcyAqLworICAgIGlmIChjYXBzID09IE5VTEwpIHsKKyAgICAgIGNhcHMgPSBnc3RfdHlwZV9maW5kX2hlbHBlcl9mb3JfYnVmZmVyIChHU1RfT0JKRUNUIChpY3lkZW11eCksCisgICAgICAgICAgaWN5ZGVtdXgtPnR5cGVmaW5kX2J1ZiwgJnByb2IpOworCisgICAgICBpZiAoY2FwcyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChnc3RfYnVmZmVyX2dldF9zaXplIChpY3lkZW11eC0+dHlwZWZpbmRfYnVmKSA8CisgICAgICAgICAgICBJQ1lfVFlQRV9GSU5EX01BWF9TSVpFKSB7CisgICAgICAgICAgLyogSnVzdCBicmVhayBmb3IgbW9yZSBkYXRhICovCisgICAgICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgICAgICB9CisKKyAgICAgICAgLyogV2UgZmFpbGVkIHR5cGVmaW5kICovCisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChpY3lkZW11eCwgU1RSRUFNLCBUWVBFX05PVF9GT1VORCwgKE5VTEwpLAorICAgICAgICAgICAgKCJObyBjYXBzIGZvdW5kIGZvciBjb250ZW50cyB3aXRoaW4gYW4gSUNZIHN0cmVhbSIpKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoaWN5ZGVtdXgtPnR5cGVmaW5kX2J1Zik7CisgICAgICAgIGljeWRlbXV4LT50eXBlZmluZF9idWYgPSBOVUxMOworICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFnc3RfaWN5ZGVtdXhfYWRkX3NyY3BhZCAoaWN5ZGVtdXgsIGNhcHMpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChpY3lkZW11eCwgIkZhaWxlZCB0byBhZGQgc3JjcGFkIik7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChpY3lkZW11eC0+dHlwZWZpbmRfYnVmKTsKKyAgICAgIGljeWRlbXV4LT50eXBlZmluZF9idWYgPSBOVUxMOworICAgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICAgIH0KKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgICBpZiAoaWN5ZGVtdXgtPmNhY2hlZF9ldmVudHMpIHsKKyAgICAgIGdzdF9pY3lkZW11eF9zZW5kX2NhY2hlZF9ldmVudHMgKGljeWRlbXV4KTsKKyAgICB9CisKKyAgICBpZiAoaWN5ZGVtdXgtPmNhY2hlZF90YWdzKSB7CisgICAgICBnc3RfaWN5ZGVtdXhfc2VuZF90YWdfZXZlbnQgKGljeWRlbXV4LCBpY3lkZW11eC0+Y2FjaGVkX3RhZ3MpOworICAgICAgaWN5ZGVtdXgtPmNhY2hlZF90YWdzID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBNb3ZlIG9udG8gc3RyZWFtaW5nOiBjYWxsIG91cnNlbHZlcyByZWN1cnNpdmVseSB3aXRoIHRoZSB0eXBlZmluZCBidWZmZXIKKyAgICAgKiB0byBnZXQgdGhhdCBmb3J3YXJkZWQuICovCisgICAgaWN5ZGVtdXgtPnR5cGVmaW5kaW5nID0gRkFMU0U7CisKKyAgICB0Zl9idWYgPSBpY3lkZW11eC0+dHlwZWZpbmRfYnVmOworICAgIGljeWRlbXV4LT50eXBlZmluZF9idWYgPSBOVUxMOworICAgIHJldHVybiBnc3RfaWN5ZGVtdXhfdHlwZWZpbmRfb3JfZm9yd2FyZCAoaWN5ZGVtdXgsIHRmX2J1Zik7CisgIH0gZWxzZSB7CisgICAgaWYgKEdfVU5MSUtFTFkgKGljeWRlbXV4LT5zcmNwYWQgPT0gTlVMTCkpIHsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgfQorCisgICAgYnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChidWYpOworCisgICAgLyogTW9zdCB0aGluZ3MgZG9uJ3QgY2FyZSwgYW5kIGl0J3MgYSBwYWluIHRvIHRyYWNrICh3ZSBzaG91bGQgcHJlc2VydmUgYQorICAgICAqIDAgb2Zmc2V0IG9uIHRoZSBmaXJzdCBidWZmZXIgdGhvdWdoIGlmIGl0J3MgdGhlcmUsIGZvciBpZDNkZW11eCBldGMuKSAqLworICAgIGlmIChHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSAhPSAwKSB7CisgICAgICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSA9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkU7CisgICAgfQorCisgICAgcmV0dXJuIGdzdF9wYWRfcHVzaCAoaWN5ZGVtdXgtPnNyY3BhZCwgYnVmKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2ljeWRlbXV4X2FkZF9tZXRhIChHc3RJQ1lEZW11eCAqIGljeWRlbXV4LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIGlmICghaWN5ZGVtdXgtPm1ldGFfYWRhcHRlcikKKyAgICBpY3lkZW11eC0+bWV0YV9hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworCisgIGdzdF9hZGFwdGVyX3B1c2ggKGljeWRlbXV4LT5tZXRhX2FkYXB0ZXIsIGJ1Zik7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfaWN5ZGVtdXhfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdElDWURlbXV4ICppY3lkZW11eDsKKyAgZ3VpbnQgc2l6ZSwgY2h1bmssIG9mZnNldDsKKyAgR3N0QnVmZmVyICpzdWI7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgaWN5ZGVtdXggPSBHU1RfSUNZREVNVVggKHBhcmVudCk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGljeWRlbXV4LT5tZXRhX2ludGVydmFsIDwgMCkpCisgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKworICBpZiAoaWN5ZGVtdXgtPm1ldGFfaW50ZXJ2YWwgPT0gMCkgeworICAgIHJldCA9IGdzdF9pY3lkZW11eF90eXBlZmluZF9vcl9mb3J3YXJkIChpY3lkZW11eCwgYnVmKTsKKyAgICBidWYgPSBOVUxMOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIC8qIEdvIHRocm91Z2ggdGhlIGJ1ZmZlciwgY2hvcHBpbmcgaXQgaW50byBhcHByb3ByaWF0ZSBjaHVua3MuIEZvcndhcmQgYXMKKyAgICogdGFncyBvciBidWZmZXJzLCBhcyBhcHByb3ByaWF0ZQorICAgKi8KKyAgc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisgIG9mZnNldCA9IDA7CisgIHdoaWxlIChzaXplKSB7CisgICAgaWYgKGljeWRlbXV4LT5yZW1haW5pbmcpIHsKKyAgICAgIGNodW5rID0gKHNpemUgPD0gaWN5ZGVtdXgtPnJlbWFpbmluZykgPyBzaXplIDogaWN5ZGVtdXgtPnJlbWFpbmluZzsKKyAgICAgIGlmIChvZmZzZXQgPT0gMCAmJiBjaHVuayA9PSBzaXplKSB7CisgICAgICAgIHN1YiA9IGJ1ZjsKKyAgICAgICAgYnVmID0gTlVMTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN1YiA9IGdzdF9idWZmZXJfY29weV9yZWdpb24gKGJ1ZiwgR1NUX0JVRkZFUl9DT1BZX0FMTCwgb2Zmc2V0LCBjaHVuayk7CisgICAgICB9CisgICAgICBvZmZzZXQgKz0gY2h1bms7CisgICAgICBpY3lkZW11eC0+cmVtYWluaW5nIC09IGNodW5rOworICAgICAgc2l6ZSAtPSBjaHVuazsKKworICAgICAgLyogVGhpcyBidWZmZXIgZ29lcyBvbnRvIHR5cGVmaW5kaW5nLCBhbmQvb3IgZGlyZWN0bHkgcHVzaGVkIG91dCAqLworICAgICAgcmV0ID0gZ3N0X2ljeWRlbXV4X3R5cGVmaW5kX29yX2ZvcndhcmQgKGljeWRlbXV4LCBzdWIpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBkb25lOworICAgIH0gZWxzZSBpZiAoaWN5ZGVtdXgtPm1ldGFfcmVtYWluaW5nKSB7CisgICAgICBjaHVuayA9IChzaXplIDw9IGljeWRlbXV4LT5tZXRhX3JlbWFpbmluZykgPworICAgICAgICAgIHNpemUgOiBpY3lkZW11eC0+bWV0YV9yZW1haW5pbmc7CisgICAgICBzdWIgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWYsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIG9mZnNldCwgY2h1bmspOworICAgICAgZ3N0X2ljeWRlbXV4X2FkZF9tZXRhIChpY3lkZW11eCwgc3ViKTsKKworICAgICAgb2Zmc2V0ICs9IGNodW5rOworICAgICAgaWN5ZGVtdXgtPm1ldGFfcmVtYWluaW5nIC09IGNodW5rOworICAgICAgc2l6ZSAtPSBjaHVuazsKKworICAgICAgaWYgKGljeWRlbXV4LT5tZXRhX3JlbWFpbmluZyA9PSAwKSB7CisgICAgICAgIC8qIFBhcnNlIHRhZ3MgZnJvbSBtZXRhX2FkYXB0ZXIsIHNlbmQgb2ZmIGFzIHRhZyBtZXNzYWdlcyAqLworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChpY3lkZW11eCwgIk5vIHJlbWFpbmluZyBtZXRhZGF0YSwgcGFyc2luZyBmb3IgdGFncyIpOworICAgICAgICBnc3RfaWN5ZGVtdXhfcGFyc2VfYW5kX3NlbmRfdGFncyAoaWN5ZGVtdXgpOworCisgICAgICAgIGljeWRlbXV4LT5yZW1haW5pbmcgPSBpY3lkZW11eC0+bWV0YV9pbnRlcnZhbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZ3VpbnQ4IGJ5dGU7CisgICAgICAvKiBXZSBuZWVkIHRvIHJlYWQgYSBzaW5nbGUgYnl0ZSAoYWx3YXlzIHNhZmUgYXQgdGhpcyBwb2ludCBpbiB0aGUgbG9vcCkKKyAgICAgICAqIHRvIGZpZ3VyZSBvdXQgaG93IG1hbnkgYnl0ZXMgb2YgbWV0YWRhdGEgZXhpc3QuIAorICAgICAgICogVGhlICdzcGVjJyB0ZWxscyB1cyB0byByZWFkIDE2ICogKGJ5dGVfdmFsdWUpIGJ5dGVzIG9mIG1ldGFkYXRhIGFmdGVyCisgICAgICAgKiB0aGlzICh6ZXJvIGlzIGNvbW1vbiwgYW5kIG1lYW5zIHRoZSBtZXRhZGF0YSBoYXNuJ3QgY2hhbmdlZCkuCisgICAgICAgKi8KKyAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoYnVmLCBvZmZzZXQsICZieXRlLCAxKTsKKyAgICAgIGljeWRlbXV4LT5tZXRhX3JlbWFpbmluZyA9IDE2ICogYnl0ZTsKKyAgICAgIGlmIChpY3lkZW11eC0+bWV0YV9yZW1haW5pbmcgPT0gMCkKKyAgICAgICAgaWN5ZGVtdXgtPnJlbWFpbmluZyA9IGljeWRlbXV4LT5tZXRhX2ludGVydmFsOworCisgICAgICBvZmZzZXQgKz0gMTsKKyAgICAgIHNpemUgLT0gMTsKKyAgICB9CisgIH0KKworZG9uZToKKyAgaWYgKGJ1ZikKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCitub3RfbmVnb3RpYXRlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoaWN5ZGVtdXgsICJtZXRhX2ludGVydmFsIG5vdCBzZXQsIGJ1ZmZlciBwcm9iYWJseSBoYWQgIgorICAgICAgICAibm8gY2FwcyBzZXQuIFRyeSBlbmFibGluZyBpcmFkaW8tbW9kZSBvbiB0aGUgaHR0cCBzb3VyY2UgZWxlbWVudCIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2ljeWRlbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0SUNZRGVtdXggKmljeWRlbXV4ID0gR1NUX0lDWURFTVVYIChlbGVtZW50KTsKKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X2ljeWRlbXV4X3Jlc2V0IChpY3lkZW11eCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworLyogdGFrZXMgb3duZXJzaGlwIG9mIHRhZyBsaXN0ICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9pY3lkZW11eF9zZW5kX3RhZ19ldmVudCAoR3N0SUNZRGVtdXggKiBpY3lkZW11eCwgR3N0VGFnTGlzdCAqIHRhZ3MpCit7CisgIEdzdEV2ZW50ICpldmVudDsKKworICBldmVudCA9IGdzdF9ldmVudF9uZXdfdGFnICh0YWdzKTsKKyAgR1NUX0VWRU5UX1RJTUVTVEFNUCAoZXZlbnQpID0gMDsKKworICBHU1RfREVCVUdfT0JKRUNUIChpY3lkZW11eCwgIlNlbmRpbmcgdGFnIGV2ZW50IG9uIHNyYyBwYWQiKTsKKyAgcmV0dXJuIGdzdF9wYWRfcHVzaF9ldmVudCAoaWN5ZGVtdXgtPnNyY3BhZCwgZXZlbnQpOworCit9CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGljeWRlbXV4X2RlYnVnLCAiaWN5ZGVtdXgiLCAwLAorICAgICAgIkdTdHJlYW1lciBJQ1kgdGFnIGRlbXV4ZXIiKTsKKworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImljeWRlbXV4IiwKKyAgICAgIEdTVF9SQU5LX1BSSU1BUlksIEdTVF9UWVBFX0lDWURFTVVYKTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGljeWRlbXV4LAorICAgICJEZW11eCBJQ1kgdGFncyBmcm9tIGEgc3RyZWFtIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5oIGIvZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YwNTIxOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5oCkBAIC0wLDAgKzEsODcgQEAKKy8qIENvcHlyaWdodCAyMDA1IEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorICogICAgICAgICAgIDIwMDYgTWljaGFlbCBTbWl0aCA8bXNtaXRoQGZsdWVuZG8uY29tPgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgQmVuamFtaW4gT3R0ZSA8b3R0ZUBnbm9tZS5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9JQ1lERU1VWF9IX18KKyNkZWZpbmUgX19HU1RfSUNZREVNVVhfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdHR5cGVmaW5kaGVscGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9JQ1lERU1VWCBcCisgIChnc3RfaWN5ZGVtdXhfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0lDWURFTVVYKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfSUNZREVNVVgsR3N0SUNZRGVtdXgpKQorI2RlZmluZSBHU1RfSUNZREVNVVhfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfSUNZREVNVVgsR3N0SUNZRGVtdXhDbGFzcykpCisjZGVmaW5lIEdTVF9JU19JQ1lERU1VWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0lDWURFTVVYKSkKKyNkZWZpbmUgR1NUX0lTX0lDWURFTVVYX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0lDWURFTVVYKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdElDWURlbXV4ICAgICAgR3N0SUNZRGVtdXg7Cit0eXBlZGVmIHN0cnVjdCBfR3N0SUNZRGVtdXhDbGFzcyBHc3RJQ1lEZW11eENsYXNzOworCitzdHJ1Y3QgX0dzdElDWURlbXV4Cit7CisgIEdzdEVsZW1lbnQgZWxlbWVudDsKKworICBHc3RQYWQgKnNpbmtwYWQsICpzcmNwYWQ7CisKKyAgLyogSW50ZXJ2YWwgYmV0d2VlbiBtZXRhZGF0YSB1cGRhdGVzICovCisgIGdpbnQgbWV0YV9pbnRlcnZhbDsKKworICAvKiBSZW1haW5pbmcgYnl0ZXMgdW50aWwgdGhlIG5leHQgbWV0YWRhdGEgdXBkYXRlICovCisgIGdpbnQgcmVtYWluaW5nOworCisgIC8qIFdoZW4gJ3JlbWFpbmluZycgaXMgemVybywgdGhpcyBob2xkcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIG1ldGFkYXRhIHdlCisgICAqIHN0aWxsIG5lZWQgdG8gcmVhZCwgb3IgemVybyBpZiB3ZSBkb24ndCB5ZXQga25vdyAod2hpY2ggbWVhbnMgd2UgbmVlZCB0bworICAgKiByZWFkIG9uZSBieXRlLCBhZnRlciB3aGljaCB3ZSBjYW4gaW5pdGlhbGlzZSB0aGlzIHByb3Blcmx5KSAqLworICBnaW50IG1ldGFfcmVtYWluaW5nOworCisgIC8qIENhcHMgZm9yIHRoZSBkYXRhIGVuY2xvc2VkICovCisgIEdzdENhcHMgKnNyY19jYXBzOworCisgIC8qIFRydWUgaWYgd2UncmUgc3RpbGwgdHlwZWZpbmRpbmcgKi8KKyAgZ2Jvb2xlYW4gdHlwZWZpbmRpbmc7CisKKyAgR3N0VGFnTGlzdCAqY2FjaGVkX3RhZ3M7CisgIEdMaXN0ICpjYWNoZWRfZXZlbnRzOworCisgIEdzdEFkYXB0ZXIgKm1ldGFfYWRhcHRlcjsKKworICBHc3RCdWZmZXIgKnR5cGVmaW5kX2J1ZjsKKworICAvKiB1cHN0cmVhbSBIVFRQIENvbnRlbnQtVHlwZSAqLworICBnY2hhciAqY29udGVudF90eXBlOworfTsKKworc3RydWN0IF9Hc3RJQ1lEZW11eENsYXNzIAoreworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2ljeWRlbXV4X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0lDWURFTVVYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2ljeWRlbXV4L21lc29uLmJ1aWxkIGIvZ3N0L2ljeWRlbXV4L21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNWY4NTcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaWN5ZGVtdXgvbWVzb24uYnVpbGQKQEAgLTAsMCArMSw4IEBACitnc3RpY3lkZW11eCA9IGxpYnJhcnkoJ2dzdGljeWRlbXV4JywKKyAgJ2dzdGljeWRlbXV4LmMnLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdF9kZXAsIGdzdGJhc2VfZGVwLCBnc3R0YWdfZGVwLCB6bGliX2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvaWQzZGVtdXgvTWFrZWZpbGUuYW0gYi9nc3QvaWQzZGVtdXgvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0YTFhYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pZDNkZW11eC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDkgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdGlkM2RlbXV4LmxhCisKK2xpYmdzdGlkM2RlbXV4X2xhX1NPVVJDRVMgPSBnc3RpZDNkZW11eC5jCitsaWJnc3RpZDNkZW11eF9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAKK2xpYmdzdGlkM2RlbXV4X2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHRhZy1AR1NUX0FQSV9WRVJTSU9OQCBcCisJLWxnc3RwYnV0aWxzLUBHU1RfQVBJX1ZFUlNJT05AICQoR1NUX0JBU0VfTElCUykKK2xpYmdzdGlkM2RlbXV4X2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3RpZDNkZW11eC5oCmRpZmYgLS1naXQgYS9nc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYyBiL2dzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0OTFiYjgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYwpAQCAtMCwwICsxLDI4OSBAQAorLyogLSotIE1vZGU6IEM7IHRhYi13aWR0aDogMjsgaW5kZW50LXRhYnMtbW9kZTogdDsgYy1iYXNpYy1vZmZzZXQ6IDIgLSotICovCisvKiBHU3RyZWFtZXIgSUQzIHRhZyBkZW11eGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBCZW5qYW1pbiBPdHRlIDxvdHRlQGdub21lLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1pZDNkZW11eAorICoKKyAqIGlkM2RlbXV4IGFjY2VwdHMgZGF0YSBzdHJlYW1zIHdpdGggZWl0aGVyIChvciBib3RoKSBJRDN2MiByZWdpb25zIGF0IHRoZQorICogc3RhcnQsIG9yIElEM3YxIGF0IHRoZSBlbmQuIFRoZSBtaW1lIHR5cGUgb2YgdGhlIGRhdGEgYmV0d2VlbiB0aGUgdGFnIGJsb2NrcworICogaXMgZGV0ZWN0ZWQgdXNpbmcgdHlwZWZpbmQgZnVuY3Rpb25zLCBhbmQgdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBtaW1lIHR5cGUKKyAqIHNldCBvbiBvdXRnb2luZyBidWZmZXJzLiAKKyAqCisgKiBUaGUgZWxlbWVudCBpcyBvbmx5IGFibGUgdG8gcmVhZCBJRDN2MSB0YWdzIGZyb20gYSBzZWVrYWJsZSBzdHJlYW0sIGJlY2F1c2UKKyAqIHRoZXkgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gVGhhdCBpcywgd2hlbiBnZXRfcmFuZ2UgbW9kZSBpcyBzdXBwb3J0ZWQKKyAqIGJ5IHRoZSB1cHN0cmVhbSBlbGVtZW50cy4gSWYgZ2V0X3JhbmdlIG9wZXJhdGlvbiBpcyBhdmFpbGFibGUsIGlkM2RlbXV4IG1ha2VzCisgKiBpdCBhdmFpbGFibGUgZG93bnN0cmVhbS4gVGhpcyBtZWFucyB0aGF0IGVsZW1lbnRzIHdoaWNoIHJlcXVpcmUgZ2V0X3JhbmdlCisgKiBtb2RlLCBzdWNoIGFzIHdhdnBhcnNlLCBjYW4gb3BlcmF0ZSBvbiBmaWxlcyBjb250YWluaW5nIElEMyB0YWcgaW5mb3JtYXRpb24uCisgKgorICogVGhpcyBpZDNkZW11eCBlbGVtZW50IHJlcGxhY2VkIGFuIG9sZGVyIGVsZW1lbnQgd2l0aCB0aGUgc2FtZSBuYW1lIHdoaWNoCisgKiByZWxpZWQgb24gbGliaWQzdGFnIGZyb20gdGhlIE1BRCBwcm9qZWN0LgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPWZpbGUubXAzICEgaWQzZGVtdXggISBmYWtlc2luayAtdAorICogXXwgVGhpcyBwaXBlbGluZSBzaG91bGQgcmVhZCBhbnkgYXZhaWxhYmxlIElEMyB0YWcgaW5mb3JtYXRpb24gYW5kIG91dHB1dCBpdC4KKyAqIFRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBpbnNpZGUgdGhlIElEMyB0YWcgcmVnaW9ucyBzaG91bGQgYmUgZGV0ZWN0ZWQsIGFuZAorICogdGhlIGFwcHJvcHJpYXRlIG1pbWUgdHlwZSBzZXQgb24gYnVmZmVycyBwcm9kdWNlZCBmcm9tIGlkM2RlbXV4LgorICogPC9yZWZzZWN0Mj4KKyAqLworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0LWkxOG4tcGx1Z2luLmg+CisjaW5jbHVkZSA8Z3N0L3RhZy90YWcuaD4KKyNpbmNsdWRlIDxnc3QvcGJ1dGlscy9wYnV0aWxzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RpZDNkZW11eC5oIgorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9QUkVGRVJfVjEKK307CisKKyNkZWZpbmUgREVGQVVMVF9QUkVGRVJfVjEgIEZBTFNFCisKK0dTVF9ERUJVR19DQVRFR09SWSAoaWQzZGVtdXhfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKGlkM2RlbXV4X2RlYnVnKQorCisjZGVmaW5lIElEM1YxX1RBR19TSVpFIDEyOAorI2RlZmluZSBJRDNWMl9IRFJfU0laRSBHU1RfVEFHX0lEM1YyX0hFQURFUl9TSVpFCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LWlkMyIpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9pZDNkZW11eF9pZGVudGlmeV90YWcgKEdzdFRhZ0RlbXV4ICogZGVtdXgsCisgICAgR3N0QnVmZmVyICogYnVmZmVyLCBnYm9vbGVhbiBzdGFydF90YWcsIGd1aW50ICogdGFnX3NpemUpOworc3RhdGljIEdzdFRhZ0RlbXV4UmVzdWx0IGdzdF9pZDNkZW11eF9wYXJzZV90YWcgKEdzdFRhZ0RlbXV4ICogZGVtdXgsCisgICAgR3N0QnVmZmVyICogYnVmZmVyLCBnYm9vbGVhbiBzdGFydF90YWcsIGd1aW50ICogdGFnX3NpemUsCisgICAgR3N0VGFnTGlzdCAqKiB0YWdzKTsKK3N0YXRpYyBHc3RUYWdMaXN0ICpnc3RfaWQzZGVtdXhfbWVyZ2VfdGFncyAoR3N0VGFnRGVtdXggKiB0YWdkZW11eCwKKyAgICBjb25zdCBHc3RUYWdMaXN0ICogc3RhcnRfdGFncywgY29uc3QgR3N0VGFnTGlzdCAqIGVuZF90YWdzKTsKKworc3RhdGljIHZvaWQgZ3N0X2lkM2RlbXV4X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9pZDNkZW11eF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKKyNkZWZpbmUgZ3N0X2lkM2RlbXV4X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdElEM0RlbXV4LCBnc3RfaWQzZGVtdXgsIEdTVF9UWVBFX1RBR19ERU1VWCk7CisKK3N0YXRpYyB2b2lkCitnc3RfaWQzZGVtdXhfY2xhc3NfaW5pdCAoR3N0SUQzRGVtdXhDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RUYWdEZW11eENsYXNzICp0YWdkZW11eF9jbGFzcyA9IChHc3RUYWdEZW11eENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9pZDNkZW11eF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9pZDNkZW11eF9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QUkVGRVJfVjEsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInByZWZlci12MSIsICJQcmVmZXIgdmVyc2lvbiAxIHRhZyIsCisgICAgICAgICAgIlByZWZlciB0YWdzIGZyb20gSUQzdjEgdGFnIGF0IGVuZCBvZiBmaWxlIHdoZW4gYm90aCBJRDN2MSAiCisgICAgICAgICAgImFuZCBJRDN2MiB0YWdzIGFyZSBwcmVzZW50IiwgREVGQVVMVF9QUkVGRVJfVjEsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfZmFjdG9yeSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIklEMyB0YWcgZGVtdXhlciIsCisgICAgICAiQ29kZWMvRGVtdXhlci9NZXRhZGF0YSIsCisgICAgICAiUmVhZCBhbmQgb3V0cHV0IElEM3YxIGFuZCBJRDN2MiB0YWdzIHdoaWxlIGRlbXV4aW5nIHRoZSBjb250ZW50cyIsCisgICAgICAiSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+Iik7CisKKyAgdGFnZGVtdXhfY2xhc3MtPmlkZW50aWZ5X3RhZyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfaWQzZGVtdXhfaWRlbnRpZnlfdGFnKTsKKyAgdGFnZGVtdXhfY2xhc3MtPnBhcnNlX3RhZyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfaWQzZGVtdXhfcGFyc2VfdGFnKTsKKyAgdGFnZGVtdXhfY2xhc3MtPm1lcmdlX3RhZ3MgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2lkM2RlbXV4X21lcmdlX3RhZ3MpOworCisgIHRhZ2RlbXV4X2NsYXNzLT5taW5fc3RhcnRfc2l6ZSA9IElEM1YyX0hEUl9TSVpFOworICB0YWdkZW11eF9jbGFzcy0+bWluX2VuZF9zaXplID0gSUQzVjFfVEFHX1NJWkU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaWQzZGVtdXhfaW5pdCAoR3N0SUQzRGVtdXggKiBpZDNkZW11eCkKK3sKKyAgaWQzZGVtdXgtPnByZWZlcl92MSA9IERFRkFVTFRfUFJFRkVSX1YxOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9pZDNkZW11eF9pZGVudGlmeV90YWcgKEdzdFRhZ0RlbXV4ICogZGVtdXgsIEdzdEJ1ZmZlciAqIGJ1ZiwKKyAgICBnYm9vbGVhbiBzdGFydF90YWcsIGd1aW50ICogdGFnX3NpemUpCit7CisgIGd1aW50OCBkYXRhWzNdOworCisgIGdzdF9idWZmZXJfZXh0cmFjdCAoYnVmLCAwLCBkYXRhLCAzKTsKKworICBpZiAoc3RhcnRfdGFnKSB7CisgICAgaWYgKGRhdGFbMF0gIT0gJ0knIHx8IGRhdGFbMV0gIT0gJ0QnIHx8IGRhdGFbMl0gIT0gJzMnKQorICAgICAgZ290byBub19tYXJrZXI7CisKKyAgICAqdGFnX3NpemUgPSBnc3RfdGFnX2dldF9pZDN2Ml90YWdfc2l6ZSAoYnVmKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZGF0YVswXSAhPSAnVCcgfHwgZGF0YVsxXSAhPSAnQScgfHwgZGF0YVsyXSAhPSAnRycpCisgICAgICBnb3RvIG5vX21hcmtlcjsKKworICAgICp0YWdfc2l6ZSA9IElEM1YxX1RBR19TSVpFOworICB9CisKKyAgR1NUX0lORk9fT0JKRUNUIChkZW11eCwgIkZvdW5kIElEM3YldSBtYXJrZXIsIHRhZ19zaXplID0gJXUiLAorICAgICAgKHN0YXJ0X3RhZykgPyAyIDogMSwgKnRhZ19zaXplKTsKKworICByZXR1cm4gVFJVRTsKKworbm9fbWFya2VyOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJObyBJRDN2JXUgbWFya2VyIGZvdW5kIiwgKHN0YXJ0X3RhZykgPyAyIDogMSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaWQzZGVtdXhfYWRkX2NvbnRhaW5lcl9mb3JtYXQgKEdzdFRhZ0xpc3QgKiB0YWdzKQoreworICBHc3RDYXBzICpzaW5rX2NhcHM7CisKKyAgc2lua19jYXBzID0gZ3N0X3N0YXRpY19wYWRfdGVtcGxhdGVfZ2V0X2NhcHMgKCZzaW5rX2ZhY3RvcnkpOworICBnc3RfcGJfdXRpbHNfYWRkX2NvZGVjX2Rlc2NyaXB0aW9uX3RvX3RhZ19saXN0ICh0YWdzLAorICAgICAgR1NUX1RBR19DT05UQUlORVJfRk9STUFULCBzaW5rX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc2lua19jYXBzKTsKK30KKworc3RhdGljIEdzdFRhZ0RlbXV4UmVzdWx0Citnc3RfaWQzZGVtdXhfcGFyc2VfdGFnIChHc3RUYWdEZW11eCAqIGRlbXV4LCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgZ2Jvb2xlYW4gc3RhcnRfdGFnLCBndWludCAqIHRhZ19zaXplLCBHc3RUYWdMaXN0ICoqIHRhZ3MpCit7CisgIGlmIChzdGFydF90YWcpIHsKKyAgICAqdGFnX3NpemUgPSBnc3RfdGFnX2dldF9pZDN2Ml90YWdfc2l6ZSAoYnVmZmVyKTsKKyAgICAqdGFncyA9IGdzdF90YWdfbGlzdF9mcm9tX2lkM3YyX3RhZyAoYnVmZmVyKTsKKworICAgIGlmIChHX0xJS0VMWSAoKnRhZ3MgIT0gTlVMTCkpIHsKKyAgICAgIGdzdF9pZDNkZW11eF9hZGRfY29udGFpbmVyX2Zvcm1hdCAoKnRhZ3MpOworICAgICAgcmV0dXJuIEdTVF9UQUdfREVNVVhfUkVTVUxUX09LOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gR1NUX1RBR19ERU1VWF9SRVNVTFRfQlJPS0VOX1RBRzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICp0YWdzID0gZ3N0X3RhZ19saXN0X25ld19mcm9tX2lkM3YxIChtYXAuZGF0YSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICAgIGlmIChHX1VOTElLRUxZICgqdGFncyA9PSBOVUxMKSkKKyAgICAgIHJldHVybiBHU1RfVEFHX0RFTVVYX1JFU1VMVF9CUk9LRU5fVEFHOworCisgICAgZ3N0X2lkM2RlbXV4X2FkZF9jb250YWluZXJfZm9ybWF0ICgqdGFncyk7CisgICAgKnRhZ19zaXplID0gSUQzVjFfVEFHX1NJWkU7CisgICAgcmV0dXJuIEdTVF9UQUdfREVNVVhfUkVTVUxUX09LOworICB9Cit9CisKK3N0YXRpYyBHc3RUYWdMaXN0ICoKK2dzdF9pZDNkZW11eF9tZXJnZV90YWdzIChHc3RUYWdEZW11eCAqIHRhZ2RlbXV4LCBjb25zdCBHc3RUYWdMaXN0ICogc3RhcnRfdGFncywKKyAgICBjb25zdCBHc3RUYWdMaXN0ICogZW5kX3RhZ3MpCit7CisgIEdzdElEM0RlbXV4ICppZDNkZW11eDsKKyAgR3N0VGFnTGlzdCAqbWVyZ2VkOworICBnYm9vbGVhbiBwcmVmZXJfdjE7CisKKyAgaWQzZGVtdXggPSBHU1RfSUQzREVNVVggKHRhZ2RlbXV4KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGlkM2RlbXV4KTsKKyAgcHJlZmVyX3YxID0gaWQzZGVtdXgtPnByZWZlcl92MTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGlkM2RlbXV4KTsKKworICAvKiB3ZSBtZXJnZSBpbiBSRVBMQUNFIG1vZGUsIHNvIHB1dCB0aGUgbGVzcyBpbXBvcnRhbnQgdGFncyBmaXJzdCAqLworICBpZiAocHJlZmVyX3YxKQorICAgIG1lcmdlZCA9IGdzdF90YWdfbGlzdF9tZXJnZSAoc3RhcnRfdGFncywgZW5kX3RhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSk7CisgIGVsc2UKKyAgICBtZXJnZWQgPSBnc3RfdGFnX2xpc3RfbWVyZ2UgKGVuZF90YWdzLCBzdGFydF90YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UpOworCisgIEdTVF9MT0dfT0JKRUNUIChpZDNkZW11eCwgInN0YXJ0ICB0YWdzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgc3RhcnRfdGFncyk7CisgIEdTVF9MT0dfT0JKRUNUIChpZDNkZW11eCwgImVuZCAgICB0YWdzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgZW5kX3RhZ3MpOworICBHU1RfTE9HX09CSkVDVCAoaWQzZGVtdXgsICJtZXJnZWQgdGFnczogJSIgR1NUX1BUUl9GT1JNQVQsIG1lcmdlZCk7CisKKyAgcmV0dXJuIG1lcmdlZDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9pZDNkZW11eF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0SUQzRGVtdXggKmlkM2RlbXV4OworCisgIGlkM2RlbXV4ID0gR1NUX0lEM0RFTVVYIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QUkVGRVJfVjE6eworICAgICAgR1NUX09CSkVDVF9MT0NLIChpZDNkZW11eCk7CisgICAgICBpZDNkZW11eC0+cHJlZmVyX3YxID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGlkM2RlbXV4KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaWQzZGVtdXhfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdElEM0RlbXV4ICppZDNkZW11eDsKKworICBpZDNkZW11eCA9IEdTVF9JRDNERU1VWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUFJFRkVSX1YxOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChpZDNkZW11eCk7CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgaWQzZGVtdXgtPnByZWZlcl92MSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoaWQzZGVtdXgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChpZDNkZW11eF9kZWJ1ZywgImlkM2RlbXV4IiwgMCwKKyAgICAgICJHU3RyZWFtZXIgSUQzIHRhZyBkZW11eGVyIik7CisKKyAgZ3N0X3RhZ19yZWdpc3Rlcl9tdXNpY2JyYWluel90YWdzICgpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiaWQzZGVtdXgiLAorICAgICAgR1NUX1JBTktfUFJJTUFSWSwgR1NUX1RZUEVfSUQzREVNVVgpOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgaWQzZGVtdXgsCisgICAgIkRlbXV4IElEM3YxIGFuZCBJRDN2MiB0YWdzIGZyb20gYSBmaWxlIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5oIGIvZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU2MWRmZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIEdTdHJlYW1lciBJRDMgdGFnIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNSBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IEJlbmphbWluIE90dGUgPG90dGVAZ25vbWUub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfSUQzREVNVVhfSF9fCisjZGVmaW5lIF9fR1NUX0lEM0RFTVVYX0hfXworCisjaW5jbHVkZSA8Z3N0L3RhZy9nc3R0YWdkZW11eC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfSUQzREVNVVggXAorICAoZ3N0X2lkM2RlbXV4X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9JRDNERU1VWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0lEM0RFTVVYLEdzdElEM0RlbXV4KSkKKyNkZWZpbmUgR1NUX0lEM0RFTVVYX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0lEM0RFTVVYLEdzdElEM0RlbXV4Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfSUQzREVNVVgob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9JRDNERU1VWCkpCisjZGVmaW5lIEdTVF9JU19JRDNERU1VWF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9JRDNERU1VWCkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RJRDNEZW11eCAgICAgIEdzdElEM0RlbXV4OwordHlwZWRlZiBzdHJ1Y3QgX0dzdElEM0RlbXV4Q2xhc3MgR3N0SUQzRGVtdXhDbGFzczsKKworc3RydWN0IF9Hc3RJRDNEZW11eAoreworICBHc3RUYWdEZW11eCB0YWdkZW11eDsKKworICBnYm9vbGVhbiBwcmVmZXJfdjE7ICAgICAvKiBwcmVmZXIgSUQzdjEgdGFncyBvdmVyIElEM3YyIHRhZ3M/ICovCit9OworCitzdHJ1Y3QgX0dzdElEM0RlbXV4Q2xhc3MgCit7CisgIEdzdFRhZ0RlbXV4Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2lkM2RlbXV4X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0lEM0RFTVVYX0hfXyAqLworCmRpZmYgLS1naXQgYS9nc3QvaWQzZGVtdXgvbWVzb24uYnVpbGQgYi9nc3QvaWQzZGVtdXgvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhlYTU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pZDNkZW11eC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDggQEAKK2dzdGlkM2RlbXV4ID0gbGlicmFyeSgnZ3N0aWQzZGVtdXgnLAorICAnZ3N0aWQzZGVtdXguYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0X2RlcCwgZ3N0YmFzZV9kZXAsIGdzdHRhZ19kZXAsIGdzdHBidXRpbHNfZGVwXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKZGlmZiAtLWdpdCBhL2dzdC9pbWFnZWZyZWV6ZS9NYWtlZmlsZS5hbSBiL2dzdC9pbWFnZWZyZWV6ZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTZkMDM0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2ltYWdlZnJlZXplL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOSBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0aW1hZ2VmcmVlemUubGEKKworbGliZ3N0aW1hZ2VmcmVlemVfbGFfU09VUkNFUyA9IGdzdGltYWdlZnJlZXplLmMKKworbGliZ3N0aW1hZ2VmcmVlemVfbGFfQ0ZMQUdTID0gJChHU1RfQ0ZMQUdTKQorbGliZ3N0aW1hZ2VmcmVlemVfbGFfTElCQUREID0gJChHU1RfTElCUykKK2xpYmdzdGltYWdlZnJlZXplX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3RpbWFnZWZyZWV6ZS5oCmRpZmYgLS1naXQgYS9nc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYyBiL2dzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZTM4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYwpAQCAtMCwwICsxLDkwOCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1pbWFnZWZyZWV6ZQorICoKKyAqIFRoZSBpbWFnZWZyZWV6ZSBlbGVtZW50IGdlbmVyYXRlcyBhIHN0aWxsIGZyYW1lIHZpZGVvIHN0cmVhbSBmcm9tCisgKiB0aGUgaW5wdXQuIEl0IGR1cGxpY2F0ZXMgdGhlIGZpcnN0IGZyYW1lIHdpdGggdGhlIGZyYW1lcmF0ZSByZXF1ZXN0ZWQKKyAqIGJ5IGRvd25zdHJlYW0sIGFsbG93cyBzZWVraW5nIGFuZCBhbnN3ZXJzIHF1ZXJpZXMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGZpbGVzcmMgbG9jYXRpb249c29tZS5wbmcgISBkZWNvZGViaW4gISBpbWFnZWZyZWV6ZSAhIGF1dG92aWRlb3NpbmsKKyAqIF18IFRoaXMgcGlwZWxpbmUgc2hvd3MgYSBzdGlsbCBmcmFtZSBzdHJlYW0gb2YgYSBQTkcgZmlsZS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworLyogVGhpcyBpcyBiYXNlZCBvbiB0aGUgaW1hZ2VmcmVlemUgZWxlbWVudCBmcm9tIFBpVGlWaToKKyAqIGh0dHA6Ly9naXQuZ25vbWUub3JnL2Jyb3dzZS9waXRpdmkvdHJlZS9waXRpdmkvZWxlbWVudHMvaW1hZ2VmcmVlemUucHkKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oPgorCisjaW5jbHVkZSAiZ3N0aW1hZ2VmcmVlemUuaCIKKworc3RhdGljIHZvaWQgZ3N0X2ltYWdlX2ZyZWV6ZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyB2b2lkIGdzdF9pbWFnZV9mcmVlemVfcmVzZXQgKEdzdEltYWdlRnJlZXplICogc2VsZik7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfaW1hZ2VfZnJlZXplX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9pbWFnZV9mcmVlemVfc2lua19jaGFpbiAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmZmVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfaW1hZ2VfZnJlZXplX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9pbWFnZV9mcmVlemVfc2lua19zZXRjYXBzIChHc3RJbWFnZUZyZWV6ZSAqIHNlbGYsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdENhcHMgKmdzdF9pbWFnZV9mcmVlemVfc2lua19nZXRjYXBzIChHc3RJbWFnZUZyZWV6ZSAqIHNlbGYsCisgICAgR3N0Q2FwcyAqIGZpbHRlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ltYWdlX2ZyZWV6ZV9zaW5rX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKK3N0YXRpYyB2b2lkIGdzdF9pbWFnZV9mcmVlemVfc3JjX2xvb3AgKEdzdFBhZCAqIHBhZCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ltYWdlX2ZyZWV6ZV9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9pbWFnZV9mcmVlemVfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfcGFkX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1yYXciKSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfcGFkX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwgR1NUX1BBRF9TUkMsIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtcmF3IikpOworCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfaW1hZ2VfZnJlZXplX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9pbWFnZV9mcmVlemVfZGVidWcKKworI2RlZmluZSBnc3RfaW1hZ2VfZnJlZXplX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdEltYWdlRnJlZXplLCBnc3RfaW1hZ2VfZnJlZXplLCBHU1RfVFlQRV9FTEVNRU5UKTsKKworCitzdGF0aWMgdm9pZAorZ3N0X2ltYWdlX2ZyZWV6ZV9jbGFzc19pbml0IChHc3RJbWFnZUZyZWV6ZUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfaW1hZ2VfZnJlZXplX2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ltYWdlX2ZyZWV6ZV9jaGFuZ2Vfc3RhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiU3RpbGwgZnJhbWUgc3RyZWFtIGdlbmVyYXRvciIsCisgICAgICAiRmlsdGVyL1ZpZGVvIiwKKyAgICAgICJHZW5lcmF0ZXMgYSBzdGlsbCBmcmFtZSBzdHJlYW0gZnJvbSBhbiBpbWFnZSIsCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmc2lua19wYWRfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZzcmNfcGFkX3RlbXBsYXRlKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9pbWFnZV9mcmVlemVfaW5pdCAoR3N0SW1hZ2VGcmVlemUgKiBzZWxmKQoreworICBzZWxmLT5zaW5rcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzaW5rX3BhZF90ZW1wbGF0ZSwgInNpbmsiKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHNlbGYtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ltYWdlX2ZyZWV6ZV9zaW5rX2NoYWluKSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChzZWxmLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9pbWFnZV9mcmVlemVfc2lua19ldmVudCkpOworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAoc2VsZi0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfaW1hZ2VfZnJlZXplX3NpbmtfcXVlcnkpKTsKKyAgR1NUX1BBRF9TRVRfUFJPWFlfQUxMT0NBVElPTiAoc2VsZi0+c2lua3BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzZWxmKSwgc2VsZi0+c2lua3BhZCk7CisKKyAgc2VsZi0+c3JjcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzcmNfcGFkX3RlbXBsYXRlLCAic3JjIik7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChzZWxmLT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ltYWdlX2ZyZWV6ZV9zcmNfZXZlbnQpKTsKKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKHNlbGYtPnNyY3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfaW1hZ2VfZnJlZXplX3NyY19xdWVyeSkpOworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChzZWxmLT5zcmNwYWQpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoc2VsZiksIHNlbGYtPnNyY3BhZCk7CisKKyAgZ19tdXRleF9pbml0ICgmc2VsZi0+bG9jayk7CisKKyAgZ3N0X2ltYWdlX2ZyZWV6ZV9yZXNldCAoc2VsZik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaW1hZ2VfZnJlZXplX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RJbWFnZUZyZWV6ZSAqc2VsZiA9IEdTVF9JTUFHRV9GUkVFWkUgKG9iamVjdCk7CisKKyAgZ3N0X2ltYWdlX2ZyZWV6ZV9yZXNldCAoc2VsZik7CisKKyAgZ19tdXRleF9jbGVhciAoJnNlbGYtPmxvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9pbWFnZV9mcmVlemVfcmVzZXQgKEdzdEltYWdlRnJlZXplICogc2VsZikKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlJlc2V0dGluZyBpbnRlcm5hbCBzdGF0ZSIpOworCisgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZzZWxmLT5idWZmZXIsIE5VTEwpOworCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWxmLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBzZWxmLT5uZWVkX3NlZ21lbnQgPSBUUlVFOworCisgIHNlbGYtPmZwc19uID0gc2VsZi0+ZnBzX2QgPSAwOworICBzZWxmLT5vZmZzZXQgPSAwOworICBzZWxmLT5zZXFudW0gPSAwOworICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworCisgIGdfYXRvbWljX2ludF9zZXQgKCZzZWxmLT5zZWVraW5nLCAwKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfaW1hZ2VfZnJlZXplX3Npbmtfc2V0Y2FwcyAoR3N0SW1hZ2VGcmVlemUgKiBzZWxmLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgZ2ludCBmcHNfbiwgZnBzX2Q7CisgIEdzdENhcHMgKm90aGVyY2FwcywgKmludGVyc2VjdGlvbjsKKyAgZ3VpbnQgaSwgbjsKKyAgR3N0UGFkICpwYWQ7CisKKyAgcGFkID0gc2VsZi0+c2lua3BhZDsKKyAgY2FwcyA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgIlNldHRpbmcgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICAvKiAxLiBSZW1vdmUgZnJhbWVyYXRlICovCisgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzLCAiZnJhbWVyYXRlIik7CisgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT05fUkFOR0UsIDAsIDEsIEdfTUFYSU5ULCAxLAorICAgICAgTlVMTCk7CisKKyAgLyogMi4gSW50ZXJzZWN0IHdpdGggdGVtcGxhdGUgY2FwcyAqLworICBvdGhlcmNhcHMgPSAoR3N0Q2FwcyAqKSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAocGFkKTsKKyAgaW50ZXJzZWN0aW9uID0gZ3N0X2NhcHNfaW50ZXJzZWN0IChjYXBzLCBvdGhlcmNhcHMpOworICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJJbnRlcnNlY3Rpbmc6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAid2l0aDogJSIgR1NUX1BUUl9GT1JNQVQsIG90aGVyY2Fwcyk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgImdhdmU6ICUiIEdTVF9QVFJfRk9STUFULCBpbnRlcnNlY3Rpb24pOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChvdGhlcmNhcHMpOworICBjYXBzID0gaW50ZXJzZWN0aW9uOworICBpbnRlcnNlY3Rpb24gPSBvdGhlcmNhcHMgPSBOVUxMOworCisgIC8qIDMuIEludGVyc2VjdCB3aXRoIGRvd25zdHJlYW0gcGVlciBjYXBzICovCisgIG90aGVyY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChzZWxmLT5zcmNwYWQsIGNhcHMpOworICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJQZWVyIHF1ZXJ5IHJlc3VsdGVkOiAlIiBHU1RfUFRSX0ZPUk1BVCwgb3RoZXJjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBjYXBzID0gb3RoZXJjYXBzOworICBvdGhlcmNhcHMgPSBOVUxMOworCisgIC8qIDQuIEZvciBldmVyeSBjYW5kaWRhdGUgdHJ5IHRvIHVzZSBpdCBkb3duc3RyZWFtIHdpdGggZnJhbWVyYXRlIGFzCisgICAqIG5lYXIgYXMgcG9zc2libGUgdG8gMjUvMSAqLworICBuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpOworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgR3N0Q2FwcyAqY2FuZGlkYXRlID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9zdHJ1Y3R1cmVfY29weSAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSkpOworCisgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoY2FuZGlkYXRlLCBzKTsKKyAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGRfdHlwZWQgKHMsICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTikgfHwKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGRfbmVhcmVzdF9mcmFjdGlvbiAocywgImZyYW1lcmF0ZSIsIDI1LCAxKSkgeworICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfZnJhY3Rpb24gKHMsICJmcmFtZXJhdGUiLCAmZnBzX24sICZmcHNfZCk7CisgICAgICBpZiAoZnBzX2QgIT0gMCkgeworICAgICAgICBpZiAoZ3N0X3BhZF9zZXRfY2FwcyAoc2VsZi0+c3JjcGFkLCBjYW5kaWRhdGUpKSB7CisgICAgICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICAgICAgc2VsZi0+ZnBzX24gPSBmcHNfbjsKKyAgICAgICAgICBzZWxmLT5mcHNfZCA9IGZwc19kOworICAgICAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiU2V0dGluZyBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBjYW5kaWRhdGUpOworICAgICAgICAgIHJldCA9IFRSVUU7CisgICAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhbmRpZGF0ZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFkLCAiSW52YWxpZCBjYXBzIHdpdGggZnJhbWVyYXRlICVkLyVkIiwgZnBzX24sCisgICAgICAgICAgICBmcHNfZCk7CisgICAgICB9CisgICAgfQorICAgIGdzdF9jYXBzX3VucmVmIChjYW5kaWRhdGUpOworICB9CisKKyAgaWYgKCFyZXQpCisgICAgR1NUX0VSUk9SX09CSkVDVCAocGFkLCAiTm8gdXNhYmxlIGNhcHMgZm91bmQiKTsKKworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogcmVtb3ZlIGZyYW1lcmF0ZSBpbiB3cml0YWJsZSBAY2FwcyAqLworc3RhdGljIHZvaWQKK2dzdF9pbWFnZV9mcmVlemVfcmVtb3ZlX2ZwcyAoR3N0SW1hZ2VGcmVlemUgKiBzZWxmLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2ludCBpLCBuOworCisgIG4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCBpKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzLCAiZnJhbWVyYXRlIik7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTl9SQU5HRSwgMCwgMSwgR19NQVhJTlQsCisgICAgICAgIDEsIE5VTEwpOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9pbWFnZV9mcmVlemVfc2lua19nZXRjYXBzIChHc3RJbWFnZUZyZWV6ZSAqIHNlbGYsIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKnJldCwgKnRtcCwgKnRlbXBsOworICBHc3RQYWQgKnBhZDsKKworICBwYWQgPSBzZWxmLT5zaW5rcGFkOworCisgIGlmIChmaWx0ZXIpIHsKKyAgICBmaWx0ZXIgPSBnc3RfY2Fwc19jb3B5IChmaWx0ZXIpOworICAgIGdzdF9pbWFnZV9mcmVlemVfcmVtb3ZlX2ZwcyAoc2VsZiwgZmlsdGVyKTsKKyAgfQorICB0ZW1wbCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChwYWQpOworICB0bXAgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAoc2VsZi0+c3JjcGFkLCBmaWx0ZXIpOworICBpZiAodG1wKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNlbGYsICJwZWVyIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIHRtcCk7CisgICAgcmV0ID0gZ3N0X2NhcHNfaW50ZXJzZWN0ICh0bXAsIHRlbXBsKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoc2VsZiwgImdvaW5nIHRvIGNvcHkiKTsKKyAgICByZXQgPSBnc3RfY2Fwc19jb3B5ICh0ZW1wbCk7CisgIH0KKyAgaWYgKHRlbXBsKQorICAgIGdzdF9jYXBzX3VucmVmICh0ZW1wbCk7CisgIGlmIChmaWx0ZXIpCisgICAgZ3N0X2NhcHNfdW5yZWYgKGZpbHRlcik7CisKKyAgcmV0ID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAocmV0KTsKKyAgZ3N0X2ltYWdlX2ZyZWV6ZV9yZW1vdmVfZnBzIChzZWxmLCByZXQpOworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJSZXR1cm5pbmcgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIHJldCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfaW1hZ2VfZnJlZXplX3NpbmtfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RJbWFnZUZyZWV6ZSAqc2VsZiA9IEdTVF9JTUFHRV9GUkVFWkUgKHBhcmVudCk7CisgIGdib29sZWFuIHJldDsKKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiSGFuZGxpbmcgcXVlcnkgb2YgdHlwZSAnJXMnIiwKKyAgICAgIGdzdF9xdWVyeV90eXBlX2dldF9uYW1lIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY2FwcyAocXVlcnksICZjYXBzKTsKKyAgICAgIGNhcHMgPSBnc3RfaW1hZ2VfZnJlZXplX3NpbmtfZ2V0Y2FwcyAoc2VsZiwgY2Fwcyk7CisgICAgICBnc3RfcXVlcnlfc2V0X2NhcHNfcmVzdWx0IChxdWVyeSwgY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBnc3RfcGFkX3F1ZXJ5X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBxdWVyeSk7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9pbWFnZV9mcmVlemVfY29udmVydCAoR3N0SW1hZ2VGcmVlemUgKiBzZWxmLAorICAgIEdzdEZvcm1hdCBzcmNfZm9ybWF0LCBnaW50NjQgc3JjX3ZhbHVlLAorICAgIEdzdEZvcm1hdCAqIGRlc3RfZm9ybWF0LCBnaW50NjQgKiBkZXN0X3ZhbHVlKQoreworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBpZiAoc3JjX2Zvcm1hdCA9PSAqZGVzdF9mb3JtYXQpIHsKKyAgICAqZGVzdF92YWx1ZSA9IHNyY192YWx1ZTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGlmIChzcmNfdmFsdWUgPT0gLTEpIHsKKyAgICAqZGVzdF92YWx1ZSA9IC0xOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgc3dpdGNoIChzcmNfZm9ybWF0KSB7CisgICAgY2FzZSBHU1RfRk9STUFUX0RFRkFVTFQ6eworICAgICAgc3dpdGNoICgqZGVzdF9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6CisgICAgICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICAgICAgaWYgKHNlbGYtPmZwc19uID09IDApCisgICAgICAgICAgICAqZGVzdF92YWx1ZSA9IC0xOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpkZXN0X3ZhbHVlID0KKyAgICAgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHNyY192YWx1ZSwgR1NUX1NFQ09ORCAqIHNlbGYtPmZwc19kLAorICAgICAgICAgICAgICAgIHNlbGYtPmZwc19uKTsKKyAgICAgICAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgICAgICAgIHJldCA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6eworICAgICAgc3dpdGNoICgqZGVzdF9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0RFRkFVTFQ6CisgICAgICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICAgICAgKmRlc3RfdmFsdWUgPQorICAgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHNyY192YWx1ZSwgc2VsZi0+ZnBzX24sCisgICAgICAgICAgICAgIHNlbGYtPmZwc19kICogR1NUX1NFQ09ORCk7CisgICAgICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgICAgICByZXQgPSBUUlVFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ltYWdlX2ZyZWV6ZV9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RJbWFnZUZyZWV6ZSAqc2VsZiA9IEdTVF9JTUFHRV9GUkVFWkUgKHBhcmVudCk7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJIYW5kbGluZyBxdWVyeSBvZiB0eXBlICclcyciLAorICAgICAgZ3N0X3F1ZXJ5X3R5cGVfZ2V0X25hbWUgKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpKTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9DT05WRVJUOnsKKyAgICAgIEdzdEZvcm1hdCBzcmNfZm9ybWF0LCBkZXN0X2Zvcm1hdDsKKyAgICAgIGdpbnQ2NCBzcmNfdmFsdWUsIGRlc3RfdmFsdWU7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9jb252ZXJ0IChxdWVyeSwgJnNyY19mb3JtYXQsICZzcmNfdmFsdWUsICZkZXN0X2Zvcm1hdCwKKyAgICAgICAgICAmZGVzdF92YWx1ZSk7CisgICAgICByZXQgPQorICAgICAgICAgIGdzdF9pbWFnZV9mcmVlemVfY29udmVydCAoc2VsZiwgc3JjX2Zvcm1hdCwgc3JjX3ZhbHVlLCAmZGVzdF9mb3JtYXQsCisgICAgICAgICAgJmRlc3RfdmFsdWUpOworICAgICAgaWYgKHJldCkKKyAgICAgICAgZ3N0X3F1ZXJ5X3NldF9jb252ZXJ0IChxdWVyeSwgc3JjX2Zvcm1hdCwgc3JjX3ZhbHVlLCBkZXN0X2Zvcm1hdCwKKyAgICAgICAgICAgIGRlc3RfdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX1BPU0lUSU9OOnsKKyAgICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisgICAgICBnaW50NjQgcG9zaXRpb247CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9wb3NpdGlvbiAocXVlcnksICZmb3JtYXQsIE5VTEwpOworICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0RFRkFVTFQ6eworICAgICAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgICAgIHBvc2l0aW9uID0gc2VsZi0+b2Zmc2V0OworICAgICAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICAgICAgcmV0ID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEdTVF9GT1JNQVRfVElNRTp7CisgICAgICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICAgICAgcG9zaXRpb24gPSBzZWxmLT5zZWdtZW50LnBvc2l0aW9uOworICAgICAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICAgICAgcmV0ID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAocmV0KSB7CisgICAgICAgIGdzdF9xdWVyeV9zZXRfcG9zaXRpb24gKHF1ZXJ5LCBmb3JtYXQsIHBvc2l0aW9uKTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLAorICAgICAgICAgICAgIlJldHVybmluZyBwb3NpdGlvbiAlIiBHX0dJTlQ2NF9GT1JNQVQgIiBpbiBmb3JtYXQgJXMiLCBwb3NpdGlvbiwKKyAgICAgICAgICAgIGdzdF9mb3JtYXRfZ2V0X25hbWUgKGZvcm1hdCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiUG9zaXRpb24gcXVlcnkgZmFpbGVkIik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfRFVSQVRJT046eworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgICAgIGdpbnQ2NCBkdXJhdGlvbjsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2R1cmF0aW9uIChxdWVyeSwgJmZvcm1hdCwgTlVMTCk7CisgICAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfVElNRTp7CisgICAgICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICAgICAgZHVyYXRpb24gPSBzZWxmLT5zZWdtZW50LnN0b3A7CisgICAgICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgICAgICByZXQgPSBUUlVFOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9ERUZBVUxUOnsKKyAgICAgICAgICBnX211dGV4X2xvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgICAgICBkdXJhdGlvbiA9IHNlbGYtPnNlZ21lbnQuc3RvcDsKKyAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gLTEpCisgICAgICAgICAgICBkdXJhdGlvbiA9CisgICAgICAgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChkdXJhdGlvbiwgc2VsZi0+ZnBzX24sCisgICAgICAgICAgICAgICAgR1NUX1NFQ09ORCAqIHNlbGYtPmZwc19kKTsKKyAgICAgICAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgICAgICAgIHJldCA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKHJldCkgeworICAgICAgICBnc3RfcXVlcnlfc2V0X2R1cmF0aW9uIChxdWVyeSwgZm9ybWF0LCBkdXJhdGlvbik7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwKKyAgICAgICAgICAgICJSZXR1cm5pbmcgZHVyYXRpb24gJSIgR19HSU5UNjRfRk9STUFUICIgaW4gZm9ybWF0ICVzIiwgZHVyYXRpb24sCisgICAgICAgICAgICBnc3RfZm9ybWF0X2dldF9uYW1lIChmb3JtYXQpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgIkR1cmF0aW9uIHF1ZXJ5IGZhaWxlZCIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX1NFRUtJTkc6eworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgICAgIGdib29sZWFuIHNlZWthYmxlOworCisgICAgICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksICZmb3JtYXQsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgc2Vla2FibGUgPSAoZm9ybWF0ID09IEdTVF9GT1JNQVRfVElNRSB8fCBmb3JtYXQgPT0gR1NUX0ZPUk1BVF9ERUZBVUxUKTsKKworICAgICAgZ3N0X3F1ZXJ5X3NldF9zZWVraW5nIChxdWVyeSwgZm9ybWF0LCBzZWVrYWJsZSwgKHNlZWthYmxlID8gMCA6IC0xKSwgLTEpOworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9MQVRFTkNZOgorICAgICAgLyogVGhpcyB3aWxsIG9ubHkgcmV0dXJuIGFuIGFjY3VyYXRlIGxhdGVuY3kgZm9yIHRoZSBmaXJzdCBidWZmZXIgc2luY2UKKyAgICAgICAqIGFsbCBmdXJ0aGVyIGJ1ZmZlcnMgb3V0cHV0dGVkIGJ5IHVzIGFyZSBqdXN0IGNvcGllcyBvZiB0aGF0IG9uZSwgYW5kCisgICAgICAgKiB0aGUgbGF0ZW5jeSBpcyAwIGluIHRoYXQgY2FzZS4gSG93ZXZlciwgbGF0ZW5jeSBjaGFuZ2VzIGFyZSBub3QKKyAgICAgICAqIHN0cmFpZ2h0Zm9yd2FyZCwgc28gbGV0J3MgZG8gdGhlIGNvbnNlcnZhdGl2ZSBmaXggZm9yIG5vdy4gKi8KKyAgICAgIHJldCA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9pbWFnZV9mcmVlemVfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdEltYWdlRnJlZXplICpzZWxmID0gR1NUX0lNQUdFX0ZSRUVaRSAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJHb3QgJXMgZXZlbnQiLCBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICBnc3RfaW1hZ2VfZnJlZXplX3Npbmtfc2V0Y2FwcyAoc2VsZiwgY2Fwcyk7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRU9TOgorICAgICAgaWYgKCFzZWxmLT5idWZmZXIpIHsKKyAgICAgICAgLyogaWYgd2UgcmVjZWl2ZSBFT1MgYmVmb3JlIGEgYnVmZmVyIGFycml2ZXMsIHRoZW4gbGV0IGl0IHBhc3MgKi8KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkVPUyB3aXRob3V0IGlucHV0IGJ1ZmZlciwgcGFzc2luZyBvbiIpOworICAgICAgICByZXQgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNyY3BhZCwgZXZlbnQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJEcm9wcGluZyBldmVudCIpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RBUlQ6CisgICAgICBnc3RfaW1hZ2VfZnJlZXplX3Jlc2V0IChzZWxmKTsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNyY3BhZCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9pbWFnZV9mcmVlemVfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0SW1hZ2VGcmVlemUgKnNlbGYgPSBHU1RfSU1BR0VfRlJFRVpFIChwYXJlbnQpOworICBnYm9vbGVhbiByZXQ7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgIkdvdCAlcyBldmVudCIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfTkFWSUdBVElPTjoKKyAgICBjYXNlIEdTVF9FVkVOVF9RT1M6CisgICAgY2FzZSBHU1RfRVZFTlRfTEFURU5DWToKKyAgICBjYXNlIEdTVF9FVkVOVF9TVEVQOgorICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiRHJvcHBpbmcgZXZlbnQiKTsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX1NFRUs6eworICAgICAgZ2RvdWJsZSByYXRlOworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgICAgIEdzdFNlZWtGbGFncyBmbGFnczsKKyAgICAgIEdzdFNlZWtUeXBlIHN0YXJ0X3R5cGUsIHN0b3BfdHlwZTsKKyAgICAgIGdpbnQ2NCBzdGFydCwgc3RvcDsKKyAgICAgIGdpbnQ2NCBsYXN0X3N0b3A7CisgICAgICBnYm9vbGVhbiBzdGFydF90YXNrOworICAgICAgZ2Jvb2xlYW4gZmx1c2g7CisgICAgICBndWludDMyIHNlcW51bTsKKworICAgICAgc2VxbnVtID0gZ3N0X2V2ZW50X2dldF9zZXFudW0gKGV2ZW50KTsKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgJnJhdGUsICZmb3JtYXQsICZmbGFncywgJnN0YXJ0X3R5cGUsICZzdGFydCwKKyAgICAgICAgICAmc3RvcF90eXBlLCAmc3RvcCk7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKworICAgICAgZmx1c2ggPSAhICEoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX0ZMVVNIKTsKKworICAgICAgaWYgKGZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUgJiYgZm9ybWF0ICE9IEdTVF9GT1JNQVRfREVGQVVMVCkgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChwYWQsICJTZWVrIGluIGludmFsaWQgZm9ybWF0OiAlcyIsCisgICAgICAgICAgICBnc3RfZm9ybWF0X2dldF9uYW1lIChmb3JtYXQpKTsKKyAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoZm9ybWF0ID09IEdTVF9GT1JNQVRfREVGQVVMVCkgeworICAgICAgICBmb3JtYXQgPSBHU1RfRk9STUFUX1RJTUU7CisgICAgICAgIGlmICghZ3N0X2ltYWdlX2ZyZWV6ZV9jb252ZXJ0IChzZWxmLCBHU1RfRk9STUFUX0RFRkFVTFQsIHN0YXJ0LCAmZm9ybWF0LAorICAgICAgICAgICAgICAgICZzdGFydCkKKyAgICAgICAgICAgIHx8ICFnc3RfaW1hZ2VfZnJlZXplX2NvbnZlcnQgKHNlbGYsIEdTVF9GT1JNQVRfREVGQVVMVCwgc3RvcCwKKyAgICAgICAgICAgICAgICAmZm9ybWF0LCAmc3RvcCkKKyAgICAgICAgICAgIHx8IHN0YXJ0ID09IC0xIHx8IHN0b3AgPT0gLTEpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChwYWQsCisgICAgICAgICAgICAgICJGYWlsZWQgdG8gY29udmVydCBzZWVrIGZyb20gREVGQVVMVCBmb3JtYXQgaW50byBUSU1FIGZvcm1hdCIpOworICAgICAgICAgIHJldCA9IEZBTFNFOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChmbHVzaCkgeworICAgICAgICBHc3RFdmVudCAqZTsKKworICAgICAgICBnX2F0b21pY19pbnRfc2V0ICgmc2VsZi0+c2Vla2luZywgMSk7CisgICAgICAgIGUgPSBnc3RfZXZlbnRfbmV3X2ZsdXNoX3N0YXJ0ICgpOworICAgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZSwgc2VxbnVtKTsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzZWxmLT5zcmNwYWQsIGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ3N0X3BhZF9wYXVzZV90YXNrIChzZWxmLT5zcmNwYWQpOworICAgICAgfQorCisgICAgICBHU1RfUEFEX1NUUkVBTV9MT0NLIChzZWxmLT5zcmNwYWQpOworCisgICAgICBnX211dGV4X2xvY2sgKCZzZWxmLT5sb2NrKTsKKworICAgICAgZ3N0X3NlZ21lbnRfZG9fc2VlayAoJnNlbGYtPnNlZ21lbnQsIHJhdGUsIGZvcm1hdCwgZmxhZ3MsIHN0YXJ0X3R5cGUsCisgICAgICAgICAgc3RhcnQsIHN0b3BfdHlwZSwgc3RvcCwgTlVMTCk7CisgICAgICBzZWxmLT5uZWVkX3NlZ21lbnQgPSBUUlVFOworICAgICAgbGFzdF9zdG9wID0gc2VsZi0+c2VnbWVudC5wb3NpdGlvbjsKKworICAgICAgc3RhcnRfdGFzayA9IHNlbGYtPmJ1ZmZlciAhPSBOVUxMOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKworICAgICAgaWYgKGZsdXNoKSB7CisgICAgICAgIEdzdEV2ZW50ICplOworCisgICAgICAgIGUgPSBnc3RfZXZlbnRfbmV3X2ZsdXNoX3N0b3AgKFRSVUUpOworICAgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZSwgc2VxbnVtKTsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzZWxmLT5zcmNwYWQsIGUpOworICAgICAgICBnX2F0b21pY19pbnRfc2V0ICgmc2VsZi0+c2Vla2luZywgMCk7CisgICAgICB9CisKKyAgICAgIGlmIChmbGFncyAmIEdTVF9TRUVLX0ZMQUdfU0VHTUVOVCkgeworICAgICAgICBHc3RNZXNzYWdlICptOworCisgICAgICAgIG0gPSBnc3RfbWVzc2FnZV9uZXdfc2VnbWVudF9zdGFydCAoR1NUX09CSkVDVCAoc2VsZiksCisgICAgICAgICAgICBmb3JtYXQsIGxhc3Rfc3RvcCk7CisgICAgICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKHNlbGYpLCBtKTsKKyAgICAgIH0KKworICAgICAgc2VsZi0+c2VxbnVtID0gc2VxbnVtOworICAgICAgR1NUX1BBRF9TVFJFQU1fVU5MT0NLIChzZWxmLT5zcmNwYWQpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJTZWVrIHN1Y2Nlc3NmdWwiKTsKKworICAgICAgaWYgKHN0YXJ0X3Rhc2spIHsKKyAgICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisKKyAgICAgICAgaWYgKHNlbGYtPmJ1ZmZlciAhPSBOVUxMKQorICAgICAgICAgIGdzdF9wYWRfc3RhcnRfdGFzayAoc2VsZi0+c3JjcGFkLAorICAgICAgICAgICAgICAoR3N0VGFza0Z1bmN0aW9uKSBnc3RfaW1hZ2VfZnJlZXplX3NyY19sb29wLCBzZWxmLT5zcmNwYWQsIE5VTEwpOworCisgICAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICB9CisKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RBUlQ6CisgICAgICBnc3RfaW1hZ2VfZnJlZXplX3Jlc2V0IChzZWxmKTsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNpbmtwYWQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9pbWFnZV9mcmVlemVfc2lua19jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RJbWFnZUZyZWV6ZSAqc2VsZiA9IEdTVF9JTUFHRV9GUkVFWkUgKHBhcmVudCk7CisKKyAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgIGlmIChzZWxmLT5idWZmZXIpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJBbHJlYWR5IGhhdmUgYSBidWZmZXIsIGRyb3BwaW5nIik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisgIH0KKworICBzZWxmLT5idWZmZXIgPSBidWZmZXI7CisKKyAgZ3N0X3BhZF9zdGFydF90YXNrIChzZWxmLT5zcmNwYWQsIChHc3RUYXNrRnVuY3Rpb24pIGdzdF9pbWFnZV9mcmVlemVfc3JjX2xvb3AsCisgICAgICBzZWxmLT5zcmNwYWQsIE5VTEwpOworICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICByZXR1cm4gR1NUX0ZMT1dfRU9TOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2ltYWdlX2ZyZWV6ZV9zcmNfbG9vcCAoR3N0UGFkICogcGFkKQoreworICBHc3RJbWFnZUZyZWV6ZSAqc2VsZiA9IEdTVF9JTUFHRV9GUkVFWkUgKEdTVF9QQURfUEFSRU5UIChwYWQpKTsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIGd1aW50NjQgb2Zmc2V0OworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCB0aW1lc3RhbXBfZW5kOworICBndWludDY0IGNzdGFydCwgY3N0b3A7CisgIGdib29sZWFuIGluX3NlZywgZW9zOworICBHc3RGbG93UmV0dXJuIGZsb3dfcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgIGlmICghZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChzZWxmLT5zcmNwYWQpKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocGFkLCAiTm90IG5lZ290aWF0ZWQgeWV0Iik7CisgICAgZmxvd19yZXQgPSBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgIGdvdG8gcGF1c2VfdGFzazsKKyAgfQorCisgIGlmICghc2VsZi0+YnVmZmVyKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocGFkLCAiSGF2ZSBubyBidWZmZXIgeWV0Iik7CisgICAgZmxvd19yZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgIGdvdG8gcGF1c2VfdGFzazsKKyAgfQorICBidWZmZXIgPSBnc3RfYnVmZmVyX2NvcHkgKHNlbGYtPmJ1ZmZlcik7CisKKyAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKworICBpZiAoc2VsZi0+bmVlZF9zZWdtZW50KSB7CisgICAgR3N0RXZlbnQgKmU7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJQdXNoaW5nIFNFR01FTlQgZXZlbnQ6ICUiIEdTVF9TRUdNRU5UX0ZPUk1BVCwKKyAgICAgICAgJnNlbGYtPnNlZ21lbnQpOworICAgIGUgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWxmLT5zZWdtZW50KTsKKworICAgIGlmIChzZWxmLT5zZXFudW0pCisgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZSwgc2VsZi0+c2VxbnVtKTsKKworICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgIGlmIChzZWxmLT5zZWdtZW50LnJhdGUgPj0gMCkgeworICAgICAgc2VsZi0+b2Zmc2V0ID0KKyAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHNlbGYtPnNlZ21lbnQuc3RhcnQsIHNlbGYtPmZwc19uLAorICAgICAgICAgIHNlbGYtPmZwc19kICogR1NUX1NFQ09ORCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNlbGYtPm9mZnNldCA9CisgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzZWxmLT5zZWdtZW50LnN0b3AsIHNlbGYtPmZwc19uLAorICAgICAgICAgIHNlbGYtPmZwc19kICogR1NUX1NFQ09ORCk7CisgICAgfQorICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisKKyAgICBzZWxmLT5uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc2VsZi0+c3JjcGFkLCBlKTsKKyAgfQorCisgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICBvZmZzZXQgPSBzZWxmLT5vZmZzZXQ7CisKKyAgaWYgKHNlbGYtPmZwc19uICE9IDApIHsKKyAgICB0aW1lc3RhbXAgPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKG9mZnNldCwgc2VsZi0+ZnBzX2QgKiBHU1RfU0VDT05ELCBzZWxmLT5mcHNfbik7CisgICAgdGltZXN0YW1wX2VuZCA9CisgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAob2Zmc2V0ICsgMSwgc2VsZi0+ZnBzX2QgKiBHU1RfU0VDT05ELAorICAgICAgICBzZWxmLT5mcHNfbik7CisgIH0gZWxzZSB7CisgICAgdGltZXN0YW1wID0gc2VsZi0+c2VnbWVudC5zdGFydDsKKyAgICB0aW1lc3RhbXBfZW5kID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgfQorCisgIGVvcyA9IChzZWxmLT5mcHNfbiA9PSAwICYmIG9mZnNldCA+IDApIHx8CisgICAgICAoc2VsZi0+c2VnbWVudC5yYXRlID49IDAgJiYgc2VsZi0+c2VnbWVudC5zdG9wICE9IC0xCisgICAgICAmJiB0aW1lc3RhbXAgPiBzZWxmLT5zZWdtZW50LnN0b3ApIHx8IChzZWxmLT5zZWdtZW50LnJhdGUgPCAwCisgICAgICAmJiBvZmZzZXQgPT0gMCkgfHwgKHNlbGYtPnNlZ21lbnQucmF0ZSA8IDAKKyAgICAgICYmIHNlbGYtPnNlZ21lbnQuc3RhcnQgIT0gLTEgJiYgdGltZXN0YW1wX2VuZCA8IHNlbGYtPnNlZ21lbnQuc3RhcnQpOworCisgIGlmIChzZWxmLT5mcHNfbiA9PSAwICYmIG9mZnNldCA+IDApCisgICAgaW5fc2VnID0gRkFMU0U7CisgIGVsc2UKKyAgICBpbl9zZWcgPQorICAgICAgICBnc3Rfc2VnbWVudF9jbGlwICgmc2VsZi0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLCB0aW1lc3RhbXAsCisgICAgICAgIHRpbWVzdGFtcF9lbmQsICZjc3RhcnQsICZjc3RvcCk7CisKKyAgaWYgKGluX3NlZykgeworICAgIHNlbGYtPnNlZ21lbnQucG9zaXRpb24gPSBjc3RhcnQ7CisgICAgaWYgKHNlbGYtPnNlZ21lbnQucmF0ZSA+PSAwKQorICAgICAgc2VsZi0+c2VnbWVudC5wb3NpdGlvbiA9IGNzdG9wOworICB9CisKKyAgaWYgKHNlbGYtPnNlZ21lbnQucmF0ZSA+PSAwKQorICAgIHNlbGYtPm9mZnNldCsrOworICBlbHNlCisgICAgc2VsZi0+b2Zmc2V0LS07CisgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiSGFuZGxpbmcgYnVmZmVyIHdpdGggdGltZXN0YW1wICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIGlmIChpbl9zZWcpIHsKKyAgICBHU1RfQlVGRkVSX0RUUyAoYnVmZmVyKSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcikgPSBjc3RhcnQ7CisgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSA9IGNzdG9wIC0gY3N0YXJ0OworICAgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpID0gb2Zmc2V0OworICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmZmVyKSA9IG9mZnNldCArIDE7CisgICAgZmxvd19yZXQgPSBnc3RfcGFkX3B1c2ggKHNlbGYtPnNyY3BhZCwgYnVmZmVyKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJQdXNoaW5nIGJ1ZmZlciByZXN1bHRlZCBpbiAlcyIsCisgICAgICAgIGdzdF9mbG93X2dldF9uYW1lIChmbG93X3JldCkpOworICAgIGlmIChmbG93X3JldCAhPSBHU1RfRkxPV19PSykKKyAgICAgIGdvdG8gcGF1c2VfdGFzazsKKyAgfSBlbHNlIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICB9CisKKyAgaWYgKGVvcykgeworICAgIGZsb3dfcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgIGdvdG8gcGF1c2VfdGFzazsKKyAgfQorCisgIHJldHVybjsKKworcGF1c2VfdGFzazoKKyAgeworICAgIGNvbnN0IGdjaGFyICpyZWFzb24gPSBnc3RfZmxvd19nZXRfbmFtZSAoZmxvd19yZXQpOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHNlbGYsICJwYXVzaW5nIHRhc2ssIHJlYXNvbiAlcyIsIHJlYXNvbik7CisgICAgZ3N0X3BhZF9wYXVzZV90YXNrIChwYWQpOworCisgICAgaWYgKGZsb3dfcmV0ID09IEdTVF9GTE9XX0VPUykgeworICAgICAgaWYgKChzZWxmLT5zZWdtZW50LmZsYWdzICYgR1NUX1NFRUtfRkxBR19TRUdNRU5UKSkgeworICAgICAgICBHc3RNZXNzYWdlICptOworICAgICAgICBHc3RFdmVudCAqZTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJTZW5kaW5nIHNlZ21lbnQgZG9uZSBhdCBlbmQgb2Ygc2VnbWVudCIpOworICAgICAgICBpZiAoc2VsZi0+c2VnbWVudC5yYXRlID49IDApIHsKKyAgICAgICAgICBtID0gZ3N0X21lc3NhZ2VfbmV3X3NlZ21lbnRfZG9uZSAoR1NUX09CSkVDVF9DQVNUIChzZWxmKSwKKyAgICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBzZWxmLT5zZWdtZW50LnN0b3ApOworICAgICAgICAgIGUgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnRfZG9uZSAoR1NUX0ZPUk1BVF9USU1FLCBzZWxmLT5zZWdtZW50LnN0b3ApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG0gPSBnc3RfbWVzc2FnZV9uZXdfc2VnbWVudF9kb25lIChHU1RfT0JKRUNUX0NBU1QgKHNlbGYpLAorICAgICAgICAgICAgICBHU1RfRk9STUFUX1RJTUUsIHNlbGYtPnNlZ21lbnQuc3RhcnQpOworICAgICAgICAgIGUgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnRfZG9uZSAoR1NUX0ZPUk1BVF9USU1FLCBzZWxmLT5zZWdtZW50LnN0YXJ0KTsKKyAgICAgICAgfQorICAgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHNlbGYpLCBtKTsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzZWxmLT5zcmNwYWQsIGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR3N0RXZlbnQgKmUgPSBnc3RfZXZlbnRfbmV3X2VvcyAoKTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJTZW5kaW5nIEVPUyBhdCBlbmQgb2Ygc2VnbWVudCIpOworCisgICAgICAgIGlmIChzZWxmLT5zZXFudW0pCisgICAgICAgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGUsIHNlbGYtPnNlcW51bSk7CisgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc2VsZi0+c3JjcGFkLCBlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGZsb3dfcmV0ID09IEdTVF9GTE9XX05PVF9MSU5LRUQgfHwgZmxvd19yZXQgPCBHU1RfRkxPV19FT1MpIHsKKyAgICAgIEdzdEV2ZW50ICplID0gZ3N0X2V2ZW50X25ld19lb3MgKCk7CisKKyAgICAgIEdTVF9FTEVNRU5UX0ZMT1dfRVJST1IgKHNlbGYsIGZsb3dfcmV0KTsKKworICAgICAgaWYgKHNlbGYtPnNlcW51bSkKKyAgICAgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGUsIHNlbGYtPnNlcW51bSk7CisKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc2VsZi0+c3JjcGFkLCBlKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2ltYWdlX2ZyZWV6ZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RJbWFnZUZyZWV6ZSAqc2VsZiA9IEdTVF9JTUFHRV9GUkVFWkUgKGVsZW1lbnQpOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1M7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGdzdF9pbWFnZV9mcmVlemVfcmVzZXQgKHNlbGYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9wYWRfc3RvcF90YXNrIChzZWxmLT5zcmNwYWQpOworICAgICAgZ3N0X2ltYWdlX2ZyZWV6ZV9yZXNldCAoc2VsZik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSkKKyAgICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfaW1hZ2VfZnJlZXplX2RlYnVnLCAiaW1hZ2VmcmVlemUiLCAwLAorICAgICAgImltYWdlZnJlZXplIGVsZW1lbnQiKTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJpbWFnZWZyZWV6ZSIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfSU1BR0VfRlJFRVpFKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBpbWFnZWZyZWV6ZSwKKyAgICAiU3RpbGwgZnJhbWUgc3RyZWFtIGdlbmVyYXRvciIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmggYi9nc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWU4MDNiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmgKQEAgLTAsMCArMSw3NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9JTUFHRV9GUkVFWkVfSF9fCisjZGVmaW5lIF9fR1NUX0lNQUdFX0ZSRUVaRV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0lNQUdFX0ZSRUVaRSBcCisgIChnc3RfaW1hZ2VfZnJlZXplX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9JTUFHRV9GUkVFWkUob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9JTUFHRV9GUkVFWkUsR3N0SW1hZ2VGcmVlemUpKQorI2RlZmluZSBHU1RfSU1BR0VfRlJFRVpFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0lNQUdFX0ZSRUVaRSxHc3RJbWFnZUZyZWV6ZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lNQUdFX0ZSRUVaRV9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksR1NUX1RZUEVfSU1BR0VfRlJFRVpFLEdzdEltYWdlRnJlZXplQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfSU1BR0VfRlJFRVpFKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfSU1BR0VfRlJFRVpFKSkKKyNkZWZpbmUgR1NUX0lTX0lNQUdFX0ZSRUVaRV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9JTUFHRV9GUkVFWkUpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0SW1hZ2VGcmVlemUgR3N0SW1hZ2VGcmVlemU7Cit0eXBlZGVmIHN0cnVjdCBfR3N0SW1hZ2VGcmVlemVDbGFzcyBHc3RJbWFnZUZyZWV6ZUNsYXNzOworCitzdHJ1Y3QgX0dzdEltYWdlRnJlZXplCit7CisgIEdzdEVsZW1lbnQgcGFyZW50OworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIEdzdFBhZCAqc2lua3BhZDsKKyAgR3N0UGFkICpzcmNwYWQ7CisKKyAgR011dGV4IGxvY2s7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBnaW50IGZwc19uLCBmcHNfZDsKKworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgIGdib29sZWFuIG5lZWRfc2VnbWVudDsKKyAgZ3VpbnQgc2VxbnVtOworCisgIGd1aW50NjQgb2Zmc2V0OworCisgIC8qIFRSVUUgaWYgY3VycmVudGx5IGRvaW5nIGEgZmx1c2hpbmcgc2VlaywgcHJvdGVjdGVkCisgICAqIGJ5IHNyY3BhZCdzIHN0cmVhbSBsb2NrICovCisgIGdpbnQgc2Vla2luZzsKK307CisKK3N0cnVjdCBfR3N0SW1hZ2VGcmVlemVDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2ltYWdlX2ZyZWV6ZV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9JTUFHRV9GUkVFWkVfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvaW1hZ2VmcmVlemUvbWVzb24uYnVpbGQgYi9nc3QvaW1hZ2VmcmVlemUvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FmNmEwMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pbWFnZWZyZWV6ZS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDggQEAKK2dzdGltYWdlZnJlZXplID0gbGlicmFyeSgnZ3N0aW1hZ2VmcmVlemUnLAorICAnZ3N0aW1hZ2VmcmVlemUuYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBnbGliX2RlcHMgKyBbZ3N0X2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvaW50ZXJsZWF2ZS9NYWtlZmlsZS5hbSBiL2dzdC9pbnRlcmxlYXZlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMjhkM2UKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaW50ZXJsZWF2ZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDkgQEAKKworcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0aW50ZXJsZWF2ZS5sYQorCitsaWJnc3RpbnRlcmxlYXZlX2xhX1NPVVJDRVMgPSBwbHVnaW4uYyBpbnRlcmxlYXZlLmMgZGVpbnRlcmxlYXZlLmMKK2xpYmdzdGludGVybGVhdmVfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdGludGVybGVhdmVfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pICQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykKK2xpYmdzdGludGVybGVhdmVfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IHBsdWdpbi5oIGludGVybGVhdmUuaCBkZWludGVybGVhdmUuaApkaWZmIC0tZ2l0IGEvZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmMgYi9nc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODk3NDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmMKQEAgLTAsMCArMSwxMDE5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwMCBXaW0gVGF5bWFucyA8d3RheUBjaGVsbG8uYmU+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwNSBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICogICAgICAgICAgICAgICAgICAgIDIwMDcgQW5keSBXaW5nbyA8d2luZ28gYXQgcG9ib3guY29tPgorICogICAgICAgICAgICAgICAgICAgIDIwMDggU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIGRlaW50ZXJsZWF2ZS5jOiBkZWludGVybGVhdmUgc2FtcGxlcworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qIFRPRE86IAorICogICAgICAgLSBoYW5kbGUgY2hhbmdlcyBpbiBudW1iZXIgb2YgY2hhbm5lbHMKKyAqICAgICAgIC0gaGFuZGxlIGNoYW5nZXMgaW4gY2hhbm5lbCBwb3NpdGlvbnMKKyAqICAgICAgIC0gYmV0dGVyIGNhcHNuZWdvIGJ5IHVzaW5nIGEgYnVmZmVyIGFsbG9jIGZ1bmN0aW9uCisgKiAgICAgICAgIGFuZCBwYXNzaW5nIGRvd25zdHJlYW0gY2FwcyBjaGFuZ2VzIHVwc3RyZWFtIHRoZXJlCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtZGVpbnRlcmxlYXZlCisgKiBAc2VlX2Fsc286IGludGVybGVhdmUKKyAqCisgKiBTcGxpdHMgb25lIGludGVybGVhdmVkIG11bHRpY2hhbm5lbCBhdWRpbyBzdHJlYW0gaW50byBtYW55IG1vbm8gYXVkaW8gc3RyZWFtcy4KKyAqIAorICogVGhpcyBlbGVtZW50IGhhbmRsZXMgYWxsIHJhdyBhdWRpbyBmb3JtYXRzIGFuZCBzdXBwb3J0cyBjaGFuZ2luZyB0aGUgaW5wdXQgY2FwcyBhcyBsb25nIGFzCisgKiBhbGwgZG93bnN0cmVhbSBlbGVtZW50cyBjYW4gaGFuZGxlIHRoZSBuZXcgY2FwcyBhbmQgdGhlIG51bWJlciBvZiBjaGFubmVscyBhbmQgdGhlIGNoYW5uZWwKKyAqIHBvc2l0aW9ucyBzdGF5IHRoZSBzYW1lLiBUaGlzIHJlc3RyaWN0aW9uIHdpbGwgYmUgcmVtb3ZlZCBpbiBsYXRlciB2ZXJzaW9ucyBieSBhZGRpbmcgb3IKKyAqIHJlbW92aW5nIHNvbWUgc291cmNlIHBhZHMgYXMgcmVxdWlyZWQuCisgKiAKKyAqIEluIG1vc3QgY2FzZXMgYSBxdWV1ZSBhbmQgYW4gYXVkaW9jb252ZXJ0IGVsZW1lbnQgc2hvdWxkIGJlIGFkZGVkIGFmdGVyIGVhY2ggc291cmNlIHBhZAorICogYmVmb3JlIGZ1cnRoZXIgcHJvY2Vzc2luZyBvZiB0aGUgYXVkaW8gZGF0YS4KKyAqIAorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGZpbGVzcmMgbG9jYXRpb249L3BhdGgvdG8vZmlsZS5tcDMgISBkZWNvZGViaW4gISBhdWRpb2NvbnZlcnQgISAiYXVkaW8veC1yYXcsY2hhbm5lbHM9MiAhIGRlaW50ZXJsZWF2ZSBuYW1lPWQgIGQuc3JjXzAgISBxdWV1ZSAhIGF1ZGlvY29udmVydCAhIHZvcmJpc2VuYyAhIG9nZ211eCAhIGZpbGVzaW5rIGxvY2F0aW9uPWNoYW5uZWwxLm9nZyAgZC5zcmNfMSAhIHF1ZXVlICEgYXVkaW9jb252ZXJ0ICEgdm9yYmlzZW5jICEgb2dnbXV4ICEgZmlsZXNpbmsgbG9jYXRpb249Y2hhbm5lbDIub2dnCisgKiBdfCBEZWNvZGVzIGFuIE1QMyBmaWxlIGFuZCBlbmNvZGVzIHRoZSBsZWZ0IGFuZCByaWdodCBjaGFubmVsIGludG8gc2VwYXJhdGUKKyAqIE9nZyBWb3JiaXMgZmlsZXMuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj1maWxlLm1wMyAhIGRlY29kZWJpbiAhIGF1ZGlvY29udmVydCAhICJhdWRpby94LXJhdyxjaGFubmVscz0yIiAhIGRlaW50ZXJsZWF2ZSBuYW1lPWQgIGludGVybGVhdmUgbmFtZT1pICEgYXVkaW9jb252ZXJ0ICEgd2F2ZW5jICEgZmlsZXNpbmsgbG9jYXRpb249dGVzdC53YXYgICAgZC5zcmNfMCAhIHF1ZXVlICEgYXVkaW9jb252ZXJ0ICEgaS5zaW5rXzEgICAgZC5zcmNfMSAhIHF1ZXVlICEgYXVkaW9jb252ZXJ0ICEgaS5zaW5rXzAKKyAqIF18IERlY29kZXMgYW5kIGRlaW50ZXJsZWF2ZXMgYSBTdGVyZW8gTVAzIGZpbGUgaW50byBzZXBhcmF0ZSBjaGFubmVscyBhbmQKKyAqIHRoZW4gaW50ZXJsZWF2ZXMgdGhlIGNoYW5uZWxzIGFnYWluIHRvIGEgV0FWIGZpbGUgd2l0aCB0aGUgY2hhbm5lbCB3aXRoIHRoZQorICogY2hhbm5lbHMgZXhjaGFuZ2VkLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJkZWludGVybGVhdmUuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X2RlaW50ZXJsZWF2ZV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfZGVpbnRlcmxlYXZlX2RlYnVnCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyY18ldSIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9TT01FVElNRVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX0ZPUk1BVFNfQUxMICIsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsIGxheW91dCA9IChzdHJpbmcpIHtub24taW50ZXJsZWF2ZWQsIGludGVybGVhdmVkfSIpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fRk9STUFUU19BTEwgIiwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgWyAxLCBNQVggXSwgbGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQiKSk7CisKKyNkZWZpbmUgTUFLRV9GVU5DKHR5cGUpIFwKK3N0YXRpYyB2b2lkIGRlaW50ZXJsZWF2ZV8jI3R5cGUgKGd1aW50IyN0eXBlICpvdXQsIGd1aW50IyN0eXBlICppbiwgXAorICAgIGd1aW50IHN0cmlkZSwgZ3VpbnQgbmZyYW1lcykgXAoreyBcCisgIGdpbnQgaTsgXAorICBcCisgIGZvciAoaSA9IDA7IGkgPCBuZnJhbWVzOyBpKyspIHsgXAorICAgIG91dFtpXSA9ICppbjsgXAorICAgIGluICs9IHN0cmlkZTsgXAorICB9IFwKK30KKworTUFLRV9GVU5DICg4KTsKK01BS0VfRlVOQyAoMTYpOworTUFLRV9GVU5DICgzMik7CitNQUtFX0ZVTkMgKDY0KTsKKworc3RhdGljIHZvaWQKK2RlaW50ZXJsZWF2ZV8yNCAoZ3VpbnQ4ICogb3V0LCBndWludDggKiBpbiwgZ3VpbnQgc3RyaWRlLCBndWludCBuZnJhbWVzKQoreworICBnaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG5mcmFtZXM7IGkrKykgeworICAgIG1lbWNweSAob3V0LCBpbiwgMyk7CisgICAgb3V0ICs9IDM7CisgICAgaW4gKz0gc3RyaWRlICogMzsKKyAgfQorfQorCisjZGVmaW5lIGdzdF9kZWludGVybGVhdmVfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0RGVpbnRlcmxlYXZlLCBnc3RfZGVpbnRlcmxlYXZlLCBHU1RfVFlQRV9FTEVNRU5UKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfS0VFUF9QT1NJVElPTlMKK307CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9kZWludGVybGVhdmVfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZGVpbnRlcmxlYXZlX3Npbmtfc2V0Y2FwcyAoR3N0RGVpbnRlcmxlYXZlICogc2VsZiwKKyAgICBHc3RDYXBzICogY2Fwcyk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2RlaW50ZXJsZWF2ZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9kZWludGVybGVhdmVfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2RlaW50ZXJsZWF2ZV9zaW5rX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9kZWludGVybGVhdmVfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworc3RhdGljIHZvaWQgZ3N0X2RlaW50ZXJsZWF2ZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfZGVpbnRlcmxlYXZlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsZWF2ZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iaikKK3sKKyAgR3N0RGVpbnRlcmxlYXZlICpzZWxmID0gR1NUX0RFSU5URVJMRUFWRSAob2JqKTsKKworICBpZiAoc2VsZi0+cGVuZGluZ19ldmVudHMpIHsKKyAgICBnX2xpc3RfZm9yZWFjaCAoc2VsZi0+cGVuZGluZ19ldmVudHMsIChHRnVuYykgZ3N0X21pbmlfb2JqZWN0X3VucmVmLCBOVUxMKTsKKyAgICBnX2xpc3RfZnJlZSAoc2VsZi0+cGVuZGluZ19ldmVudHMpOworICAgIHNlbGYtPnBlbmRpbmdfZXZlbnRzID0gTlVMTDsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGVhdmVfY2xhc3NfaW5pdCAoR3N0RGVpbnRlcmxlYXZlQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X2RlaW50ZXJsZWF2ZV9kZWJ1ZywgImRlaW50ZXJsZWF2ZSIsIDAsCisgICAgICAiZGVpbnRlcmxlYXZlIGVsZW1lbnQiKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIkF1ZGlvIGRlaW50ZXJsZWF2ZXIiLCAiRmlsdGVyL0NvbnZlcnRlci9BdWRpbyIsCisgICAgICAiU3BsaXRzIG9uZSBpbnRlcmxlYXZlZCBtdWx0aWNoYW5uZWwgYXVkaW8gc3RyZWFtIGludG8gbWFueSBtb25vIGF1ZGlvIHN0cmVhbXMiLAorICAgICAgIkFuZHkgV2luZ28gPHdpbmdvIGF0IHBvYm94LmNvbT4sICIgIklhaW4gPGlhaW5AcHJldHR5cGVvcGxlLm9yZz4sICIKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9kZWludGVybGVhdmVfY2hhbmdlX3N0YXRlOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2RlaW50ZXJsZWF2ZV9maW5hbGl6ZTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2RlaW50ZXJsZWF2ZV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9kZWludGVybGVhdmVfZ2V0X3Byb3BlcnR5OworCisgIC8qKgorICAgKiBHc3REZWludGVybGVhdmU6a2VlcC1wb3NpdGlvbnMKKyAgICogCisgICAqIEtlZXAgcG9zaXRpb25zOiBXaGVuIGVuYWJsZSB0aGUgY2FwcyBvbiB0aGUgb3V0cHV0IGJ1ZmZlcnMgd2lsbAorICAgKiBjb250YWluIHRoZSBvcmlnaW5hbCBjaGFubmVsIHBvc2l0aW9ucy4gVGhpcyBjYW4gYmUgdXNlZCB0byBjb3JyZWN0bHkKKyAgICogaW50ZXJsZWF2ZSB0aGUgb3V0cHV0IGFnYWluIGxhdGVyIGJ1dCBjYW4gYWxzbyBsZWFkIHRvIHVud2FudGVkIGVmZmVjdHMKKyAgICogaWYgdGhlIG91dHB1dCBzaG91bGQgYmUgaGFuZGxlZCBhcyBNb25vLgorICAgKgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9LRUVQX1BPU0lUSU9OUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgia2VlcC1wb3NpdGlvbnMiLCAiS2VlcCBwb3NpdGlvbnMiLAorICAgICAgICAgICJLZWVwIHRoZSBvcmlnaW5hbCBjaGFubmVsIHBvc2l0aW9ucyBvbiB0aGUgb3V0cHV0IGJ1ZmZlcnMiLAorICAgICAgICAgIEZBTFNFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGVhdmVfaW5pdCAoR3N0RGVpbnRlcmxlYXZlICogc2VsZikKK3sKKyAgc2VsZi0+a2VlcF9wb3NpdGlvbnMgPSBGQUxTRTsKKyAgc2VsZi0+ZnVuYyA9IE5VTEw7CisgIGdzdF9hdWRpb19pbmZvX2luaXQgKCZzZWxmLT5hdWRpb19pbmZvKTsKKworICAvKiBBZGQgc2luayBwYWQgKi8KKyAgc2VsZi0+c2luayA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc2lua190ZW1wbGF0ZSwgInNpbmsiKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHNlbGYtPnNpbmssCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2RlaW50ZXJsZWF2ZV9jaGFpbikpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoc2VsZi0+c2luaywKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGVpbnRlcmxlYXZlX3NpbmtfZXZlbnQpKTsKKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKHNlbGYtPnNpbmssCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2RlaW50ZXJsZWF2ZV9zaW5rX3F1ZXJ5KSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzZWxmKSwgc2VsZi0+c2luayk7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdFBhZCAqcGFkOworfSBDb3B5U3RpY2t5RXZlbnRzRGF0YTsKKworc3RhdGljIGdib29sZWFuCitjb3B5X3N0aWNreV9ldmVudHMgKEdzdFBhZCAqIHBhZCwgR3N0RXZlbnQgKiogZXZlbnQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgQ29weVN0aWNreUV2ZW50c0RhdGEgKmRhdGEgPSB1c2VyX2RhdGE7CisKKyAgaWYgKEdTVF9FVkVOVF9UWVBFICgqZXZlbnQpID49IEdTVF9FVkVOVF9DQVBTICYmIGRhdGEtPmNhcHMpIHsKKyAgICBnc3RfcGFkX3NldF9jYXBzIChkYXRhLT5wYWQsIGRhdGEtPmNhcHMpOworICAgIGRhdGEtPmNhcHMgPSBOVUxMOworICB9CisKKyAgaWYgKEdTVF9FVkVOVF9UWVBFICgqZXZlbnQpICE9IEdTVF9FVkVOVF9DQVBTKQorICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoZGF0YS0+cGFkLCBnc3RfZXZlbnRfcmVmICgqZXZlbnQpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGVhdmVfYWRkX25ld19wYWRzIChHc3REZWludGVybGVhdmUgKiBzZWxmLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UGFkICpwYWQ7CisgIGd1aW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTICgmc2VsZi0+YXVkaW9faW5mbyk7IGkrKykgeworICAgIGdjaGFyICpuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgic3JjXyV1IiwgaSk7CisgICAgR3N0Q2FwcyAqc3JjY2FwczsKKyAgICBHc3RBdWRpb0luZm8gaW5mbzsKKyAgICBHc3RBdWRpb0Zvcm1hdCBmb3JtYXQgPSBHU1RfQVVESU9fSU5GT19GT1JNQVQgKCZzZWxmLT5hdWRpb19pbmZvKTsKKyAgICBnaW50IHJhdGUgPSBHU1RfQVVESU9fSU5GT19SQVRFICgmc2VsZi0+YXVkaW9faW5mbyk7CisgICAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zaXRpb24gPSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9NT05POworICAgIENvcHlTdGlja3lFdmVudHNEYXRhIGRhdGE7CisKKyAgICAvKiBTZXQgY2hhbm5lbCBwb3NpdGlvbiBpZiB3ZSBrbm93IGl0ICovCisgICAgaWYgKHNlbGYtPmtlZXBfcG9zaXRpb25zKQorICAgICAgcG9zaXRpb24gPSBHU1RfQVVESU9fSU5GT19QT1NJVElPTiAoJnNlbGYtPmF1ZGlvX2luZm8sIGkpOworCisgICAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoJmluZm8pOworICAgIGdzdF9hdWRpb19pbmZvX3NldF9mb3JtYXQgKCZpbmZvLCBmb3JtYXQsIHJhdGUsIDEsICZwb3NpdGlvbik7CisKKyAgICBzcmNjYXBzID0gZ3N0X2F1ZGlvX2luZm9fdG9fY2FwcyAoJmluZm8pOworCisgICAgcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzcmNfdGVtcGxhdGUsIG5hbWUpOworICAgIGdfZnJlZSAobmFtZSk7CisKKyAgICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChwYWQpOworICAgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChwYWQsCisgICAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGVpbnRlcmxlYXZlX3NyY19xdWVyeSkpOworICAgIGdzdF9wYWRfc2V0X2FjdGl2ZSAocGFkLCBUUlVFKTsKKworICAgIGRhdGEucGFkID0gcGFkOworICAgIGRhdGEuY2FwcyA9IHNyY2NhcHM7CisgICAgZ3N0X3BhZF9zdGlja3lfZXZlbnRzX2ZvcmVhY2ggKHNlbGYtPnNpbmssIGNvcHlfc3RpY2t5X2V2ZW50cywgJmRhdGEpOworICAgIGlmIChkYXRhLmNhcHMpCisgICAgICBnc3RfcGFkX3NldF9jYXBzIChwYWQsIGRhdGEuY2Fwcyk7CisgICAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKHNlbGYpLCBwYWQpOworICAgIHNlbGYtPnNyY3BhZHMgPSBnX2xpc3RfcHJlcGVuZCAoc2VsZi0+c3JjcGFkcywgZ3N0X29iamVjdF9yZWYgKHBhZCkpOworCisgICAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworICB9CisKKyAgZ3N0X2VsZW1lbnRfbm9fbW9yZV9wYWRzIChHU1RfRUxFTUVOVCAoc2VsZikpOworICBzZWxmLT5zcmNwYWRzID0gZ19saXN0X3JldmVyc2UgKHNlbGYtPnNyY3BhZHMpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGVhdmVfc2V0X3BhZHNfY2FwcyAoR3N0RGVpbnRlcmxlYXZlICogc2VsZiwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdMaXN0ICpsOworICBnaW50IGk7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgZm9yIChsID0gc2VsZi0+c3JjcGFkcywgaSA9IDA7IGw7IGwgPSBsLT5uZXh0LCBpKyspIHsKKyAgICBHc3RQYWQgKnBhZCA9IEdTVF9QQUQgKGwtPmRhdGEpOworICAgIEdzdENhcHMgKnNyY2NhcHM7CisgICAgR3N0QXVkaW9JbmZvIGluZm87CisKKyAgICBpZiAoIWdzdF9hdWRpb19pbmZvX2Zyb21fY2FwcyAoJmluZm8sIGNhcHMpKSB7CisgICAgICByZXQgPSBGQUxTRTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc2VsZi0+a2VlcF9wb3NpdGlvbnMpCisgICAgICBHU1RfQVVESU9fSU5GT19QT1NJVElPTiAoJmluZm8sIDApID0KKyAgICAgICAgICBHU1RfQVVESU9fSU5GT19QT1NJVElPTiAoJnNlbGYtPmF1ZGlvX2luZm8sIGkpOworCisgICAgc3JjY2FwcyA9IGdzdF9hdWRpb19pbmZvX3RvX2NhcHMgKCZpbmZvKTsKKworICAgIGdzdF9wYWRfc2V0X2NhcHMgKHBhZCwgc3JjY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxlYXZlX3JlbW92ZV9wYWRzIChHc3REZWludGVybGVhdmUgKiBzZWxmKQoreworICBHTGlzdCAqbDsKKworICBHU1RfSU5GT19PQkpFQ1QgKHNlbGYsICJyZW1vdmluZyBwYWRzIik7CisKKyAgZm9yIChsID0gc2VsZi0+c3JjcGFkczsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICBHc3RQYWQgKnBhZCA9IEdTVF9QQUQgKGwtPmRhdGEpOworCisgICAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAoc2VsZiksIHBhZCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocGFkKTsKKyAgfQorICBnX2xpc3RfZnJlZSAoc2VsZi0+c3JjcGFkcyk7CisgIHNlbGYtPnNyY3BhZHMgPSBOVUxMOworCisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzZWxmLT5zaW5rY2FwcywgTlVMTCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RlaW50ZXJsZWF2ZV9zZXRfcHJvY2Vzc19mdW5jdGlvbiAoR3N0RGVpbnRlcmxlYXZlICogc2VsZikKK3sKKyAgc3dpdGNoIChHU1RfQVVESU9fSU5GT19XSURUSCAoJnNlbGYtPmF1ZGlvX2luZm8pKSB7CisgICAgY2FzZSA4OgorICAgICAgc2VsZi0+ZnVuYyA9IChHc3REZWludGVybGVhdmVGdW5jKSBkZWludGVybGVhdmVfODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6CisgICAgICBzZWxmLT5mdW5jID0gKEdzdERlaW50ZXJsZWF2ZUZ1bmMpIGRlaW50ZXJsZWF2ZV8xNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjQ6CisgICAgICBzZWxmLT5mdW5jID0gKEdzdERlaW50ZXJsZWF2ZUZ1bmMpIGRlaW50ZXJsZWF2ZV8yNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzI6CisgICAgICBzZWxmLT5mdW5jID0gKEdzdERlaW50ZXJsZWF2ZUZ1bmMpIGRlaW50ZXJsZWF2ZV8zMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjQ6CisgICAgICBzZWxmLT5mdW5jID0gKEdzdERlaW50ZXJsZWF2ZUZ1bmMpIGRlaW50ZXJsZWF2ZV82NDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RlaW50ZXJsZWF2ZV9jaGVja19jYXBzX2NoYW5nZSAoR3N0RGVpbnRlcmxlYXZlICogc2VsZiwKKyAgICBHc3RBdWRpb0luZm8gKiBvbGRfaW5mbywgR3N0QXVkaW9JbmZvICogbmV3X2luZm8pCit7CisgIGdpbnQgaTsKKyAgZ2Jvb2xlYW4gc2FtZV9sYXlvdXQgPSBUUlVFOworICBnYm9vbGVhbiB3YXNfdW5wb3NpdGlvbmVkOworICBnYm9vbGVhbiBpc191bnBvc2l0aW9uZWQgPSBHU1RfQVVESU9fSU5GT19JU19VTlBPU0lUSU9ORUQgKG5ld19pbmZvKTsKKyAgZ2ludCBuZXdfY2hhbm5lbHMgPSBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAobmV3X2luZm8pOworICBnaW50IG9sZF9jaGFubmVsczsKKworICB3YXNfdW5wb3NpdGlvbmVkID0gR1NUX0FVRElPX0lORk9fSVNfVU5QT1NJVElPTkVEIChvbGRfaW5mbyk7CisgIG9sZF9jaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTIChvbGRfaW5mbyk7CisKKyAgLyogV2UgYWxsb3cgY2FwcyBjaGFuZ2VzIGFzIGxvbmcgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscyBkb2Vzbid0IGNoYW5nZQorICAgKiBhbmQgdGhlIGNoYW5uZWwgcG9zaXRpb25zIHN0YXkgdGhlIHNhbWUuIF9nZXRjYXBzKCkgc2hvdWxkJ3ZlIGNhcmVkCisgICAqIGZvciB0aGlzIGFscmVhZHkgYnV0IGJldHRlciBiZSBzYWZlLgorICAgKi8KKyAgaWYgKG5ld19jaGFubmVscyAhPSBvbGRfY2hhbm5lbHMpCisgICAgZ290byBjYW5ub3RfY2hhbmdlX2NhcHM7CisKKyAgLyogTm93IGNoZWNrIHRoZSBjaGFubmVsIHBvc2l0aW9ucy4gSWYgd2UgaGFkIG5vIGNoYW5uZWwgcG9zaXRpb25zCisgICAqIGFuZCBnZXQgdGhlbSBvciB0aGUgb3RoZXIgd2F5IGFyb3VuZCB0aGluZ3MgaGF2ZSBjaGFuZ2VkLgorICAgKiBJZiB3ZSBoYWQgY2hhbm5lbCBwb3NpdGlvbnMgYW5kIGdldCBkaWZmZXJlbnQgb25lcyB0aGluZ3MgaGF2ZQorICAgKiBjaGFuZ2VkIHRvbyBvZiBjb3Vyc2UKKyAgICovCisgIGlmICgoIXdhc191bnBvc2l0aW9uZWQgJiYgaXNfdW5wb3NpdGlvbmVkKSB8fCAod2FzX3VucG9zaXRpb25lZAorICAgICAgICAgICYmICFpc191bnBvc2l0aW9uZWQpKQorICAgIGdvdG8gY2Fubm90X2NoYW5nZV9jYXBzOworCisgIGlmICghaXNfdW5wb3NpdGlvbmVkKSB7CisgICAgaWYgKEdTVF9BVURJT19JTkZPX0NIQU5ORUxTIChvbGRfaW5mbykgIT0KKyAgICAgICAgR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKG5ld19pbmZvKSkKKyAgICAgIGdvdG8gY2Fubm90X2NoYW5nZV9jYXBzOworICAgIGZvciAoaSA9IDA7IGkgPCBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAob2xkX2luZm8pOyBpKyspIHsKKyAgICAgIGlmIChuZXdfaW5mby0+cG9zaXRpb25baV0gIT0gb2xkX2luZm8tPnBvc2l0aW9uW2ldKSB7CisgICAgICAgIHNhbWVfbGF5b3V0ID0gRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIXNhbWVfbGF5b3V0KQorICAgICAgZ290byBjYW5ub3RfY2hhbmdlX2NhcHM7CisgIH0KKworICByZXR1cm4gVFJVRTsKKworY2Fubm90X2NoYW5nZV9jYXBzOgorICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RlaW50ZXJsZWF2ZV9zaW5rX3NldGNhcHMgKEdzdERlaW50ZXJsZWF2ZSAqIHNlbGYsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RDYXBzICpzcmNjYXBzOworICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImdvdCBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgaWYgKCFnc3RfYXVkaW9faW5mb19mcm9tX2NhcHMgKCZzZWxmLT5hdWRpb19pbmZvLCBjYXBzKSkKKyAgICBnb3RvIGludmFsaWRfY2FwczsKKworICBpZiAoIWdzdF9kZWludGVybGVhdmVfc2V0X3Byb2Nlc3NfZnVuY3Rpb24gKHNlbGYpKQorICAgIGdvdG8gdW5zdXBwb3J0ZWRfY2FwczsKKworICBpZiAoc2VsZi0+c2lua2NhcHMgJiYgIWdzdF9jYXBzX2lzX2VxdWFsIChjYXBzLCBzZWxmLT5zaW5rY2FwcykpIHsKKyAgICBHc3RBdWRpb0luZm8gb2xkX2luZm87CisKKyAgICBnc3RfYXVkaW9faW5mb19pbml0ICgmb2xkX2luZm8pOworICAgIGlmICghZ3N0X2F1ZGlvX2luZm9fZnJvbV9jYXBzICgmb2xkX2luZm8sIHNlbGYtPnNpbmtjYXBzKSkKKyAgICAgIGdvdG8gaW5mb19mcm9tX2NhcHNfZmFpbGVkOworCisgICAgaWYgKGdzdF9kZWludGVybGVhdmVfY2hlY2tfY2Fwc19jaGFuZ2UgKHNlbGYsICZvbGRfaW5mbywgJnNlbGYtPmF1ZGlvX2luZm8pKSB7CisgICAgICBpZiAoIWdzdF9kZWludGVybGVhdmVfc2V0X3Byb2Nlc3NfZnVuY3Rpb24gKHNlbGYpKQorICAgICAgICBnb3RvIGNhbm5vdF9jaGFuZ2VfY2FwczsKKyAgICB9IGVsc2UKKyAgICAgIGdvdG8gY2Fubm90X2NoYW5nZV9jYXBzOworCisgIH0KKworICBnc3RfY2Fwc19yZXBsYWNlICgmc2VsZi0+c2lua2NhcHMsIGNhcHMpOworCisgIC8qIEdldCBzcmNwYWQgY2FwcyAqLworICBzcmNjYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChzcmNjYXBzLCAwKTsKKyAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDEsIE5VTEwpOworICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAocywgImNoYW5uZWwtbWFzayIpOworCisgIC8qIElmIHdlIGFscmVhZHkgaGF2ZSBwYWRzLCB1cGRhdGUgdGhlIGNhcHMgb3RoZXJ3aXNlCisgICAqIGFkZCBuZXcgcGFkcyAqLworICBpZiAoc2VsZi0+c3JjcGFkcykgeworICAgIGlmICghZ3N0X2RlaW50ZXJsZWF2ZV9zZXRfcGFkc19jYXBzIChzZWxmLCBzcmNjYXBzKSkKKyAgICAgIGdvdG8gc2V0X2NhcHNfZmFpbGVkOworICB9IGVsc2UgeworICAgIGdzdF9kZWludGVybGVhdmVfYWRkX25ld19wYWRzIChzZWxmLCBzcmNjYXBzKTsKKyAgfQorCisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICByZXR1cm4gVFJVRTsKKworY2Fubm90X2NoYW5nZV9jYXBzOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzZWxmLCAiY2FwcyBjaGFuZ2UgZnJvbSAlIiBHU1RfUFRSX0ZPUk1BVAorICAgICAgICAiIHRvICUiIEdTVF9QVFJfRk9STUFUICIgbm90IHN1cHBvcnRlZDogY2hhbm5lbCBudW1iZXIgb3IgY2hhbm5lbCAiCisgICAgICAgICJwb3NpdGlvbnMgY2hhbmdlIiwgc2VsZi0+c2lua2NhcHMsIGNhcHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQordW5zdXBwb3J0ZWRfY2FwczoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsICJjYXBzIG5vdCBzdXBwb3J0ZWQ6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfY2FwczoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsICJpbnZhbGlkIGNhcHMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3NldF9jYXBzX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsICJzZXRfY2FwcyBmYWlsZWQiKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbmZvX2Zyb21fY2Fwc19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiY291ZCBub3QgZ2V0IGluZm8gZnJvbSBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX3JlbW92ZV9jaGFubmVscyAoR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgZ2ludCBpLCBzaXplOworCisgIHNpemUgPSBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSk7CisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJjaGFubmVsLW1hc2siKTsKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAocywgImNoYW5uZWxzIik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK19fc2V0X2NoYW5uZWxzIChHc3RDYXBzICogY2FwcywgZ2ludCBjaGFubmVscykKK3sKKyAgR3N0U3RydWN0dXJlICpzOworICBnaW50IGksIHNpemU7CisKKyAgc2l6ZSA9IGdzdF9jYXBzX2dldF9zaXplIChjYXBzKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCBpKTsKKyAgICBpZiAoY2hhbm5lbHMgPiAwKQorICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIGNoYW5uZWxzLCBOVUxMKTsKKyAgICBlbHNlCisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgImNoYW5uZWxzIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCBHX01BWElOVCwgTlVMTCk7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZGVpbnRlcmxlYXZlX3NpbmtfYWNjZXB0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdERlaW50ZXJsZWF2ZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEVBVkUgKHBhcmVudCk7CisgIEdzdENhcHMgKnRlbXBsX2NhcHMgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAocGFkKTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIHJldCA9IGdzdF9jYXBzX2Nhbl9pbnRlcnNlY3QgKHRlbXBsX2NhcHMsIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAodGVtcGxfY2Fwcyk7CisgIGlmIChyZXQgJiYgc2VsZi0+c2lua2NhcHMpIHsKKyAgICBHc3RBdWRpb0luZm8gbmV3X2luZm87CisKKyAgICBnc3RfYXVkaW9faW5mb19pbml0ICgmbmV3X2luZm8pOworICAgIGlmICghZ3N0X2F1ZGlvX2luZm9fZnJvbV9jYXBzICgmbmV3X2luZm8sIGNhcHMpKQorICAgICAgZ290byBpbmZvX2Zyb21fY2Fwc19mYWlsZWQ7CisgICAgcmV0ID0KKyAgICAgICAgZ3N0X2RlaW50ZXJsZWF2ZV9jaGVja19jYXBzX2NoYW5nZSAoc2VsZiwgJnNlbGYtPmF1ZGlvX2luZm8sICZuZXdfaW5mbyk7CisgIH0KKworICByZXR1cm4gcmV0OworCitpbmZvX2Zyb21fY2Fwc19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiY291ZCBub3QgZ2V0IGluZm8gZnJvbSBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9kZWludGVybGVhdmVfZ2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdERlaW50ZXJsZWF2ZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEVBVkUgKHBhcmVudCk7CisgIEdzdENhcHMgKnJldDsKKyAgR3N0SXRlcmF0b3IgKml0OworICBHc3RJdGVyYXRvclJlc3VsdCByZXM7CisgIEdWYWx1ZSB2ID0gR19WQUxVRV9JTklUOworCisgIGlmIChwYWQgIT0gc2VsZi0+c2luaykgeworICAgIHJldCA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAocGFkKTsKKyAgICBpZiAocmV0KSB7CisgICAgICBpZiAoZmlsdGVyKSB7CisgICAgICAgIEdzdENhcHMgKnRtcCA9CisgICAgICAgICAgICBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCByZXQsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgICAgIGdzdF9jYXBzX3VucmVmIChyZXQpOworICAgICAgICByZXQgPSB0bXA7CisgICAgICB9CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgfQorCisgIC8qIEludGVyc2VjdCBhbGwgb2Ygb3VyIHBhZCB0ZW1wbGF0ZSBjYXBzIHdpdGggdGhlIHBlZXIgY2FwcyBvZiB0aGUgcGFkCisgICAqIHRvIGdldCBhbGwgZm9ybWF0cyB0aGF0IGFyZSBwb3NzaWJsZSB1cC0gYW5kIGRvd25zdHJlYW0uCisgICAqCisgICAqIEZvciB0aGUgcGFkIGZvciB3aGljaCB0aGUgY2FwcyBhcmUgcmVxdWVzdGVkIHdlIGRvbid0IHJlbW92ZSB0aGUgY2hhbm5lbAorICAgKiBpbmZvcm1hdGlvbnMgYXMgdGhleSBtdXN0IGJlIGluIHRoZSByZXR1cm5lZCBjYXBzIGFuZCBpbmNvbXBhdGliaWxpdGllcworICAgKiB3aWxsIGJlIGRldGVjdGVkIGhlcmUgYWxyZWFkeQorICAgKi8KKyAgcmV0ID0gZ3N0X2NhcHNfbmV3X2FueSAoKTsKKyAgaXQgPSBnc3RfZWxlbWVudF9pdGVyYXRlX3BhZHMgKEdTVF9FTEVNRU5UX0NBU1QgKHNlbGYpKTsKKworICBkbyB7CisgICAgcmVzID0gZ3N0X2l0ZXJhdG9yX25leHQgKGl0LCAmdik7CisgICAgc3dpdGNoIChyZXMpIHsKKyAgICAgIGNhc2UgR1NUX0lURVJBVE9SX09LOnsKKyAgICAgICAgR3N0UGFkICpvdXJwYWQgPSBHU1RfUEFEIChnX3ZhbHVlX2dldF9vYmplY3QgKCZ2KSk7CisgICAgICAgIEdzdENhcHMgKnBlZXJjYXBzID0gTlVMTCwgKm91cmNhcHM7CisgICAgICAgIEdzdENhcHMgKnRlbXBsX2NhcHMgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAob3VycGFkKTsKKworICAgICAgICBvdXJjYXBzID0gZ3N0X2NhcHNfY29weSAodGVtcGxfY2Fwcyk7CisgICAgICAgIGdzdF9jYXBzX3VucmVmICh0ZW1wbF9jYXBzKTsKKworICAgICAgICBpZiAocGFkID09IG91cnBhZCkgeworICAgICAgICAgIGlmIChHU1RfUEFEX0RJUkVDVElPTiAocGFkKSA9PSBHU1RfUEFEX1NJTkspCisgICAgICAgICAgICBfX3NldF9jaGFubmVscyAob3VyY2FwcywKKyAgICAgICAgICAgICAgICBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJnNlbGYtPmF1ZGlvX2luZm8pKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBfX3NldF9jaGFubmVscyAob3VyY2FwcywgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgX19yZW1vdmVfY2hhbm5lbHMgKG91cmNhcHMpOworICAgICAgICAgIC8qIE9ubHkgYXNrIGZvciBwZWVyIGNhcHMgZm9yIG90aGVyIHBhZHMgdGhhbiBwYWQKKyAgICAgICAgICAgKiBhcyBvdGhlcndpc2UgZ3N0X3BhZF9wZWVyX2dldF9jYXBzKCkgbWlnaHQgY2FsbAorICAgICAgICAgICAqIGJhY2sgaW50byB0aGlzIGZ1bmN0aW9uIGFuZCBkZWFkbG9jaworICAgICAgICAgICAqLworICAgICAgICAgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKG91cnBhZCwgTlVMTCk7CisgICAgICAgICAgcGVlcmNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChwZWVyY2Fwcyk7CisgICAgICAgIH0KKworICAgICAgICAvKiBJZiB0aGUgcGVlciBleGlzdHMgYW5kIGhhcyBjYXBzIGFkZCB0aGVtIHRvIHRoZSBpbnRlcnNlY3Rpb24sCisgICAgICAgICAqIG90aGVyd2lzZSBhc3N1bWUgdGhhdCB0aGUgcGVlciBhY2NlcHRzIGV2ZXJ5dGhpbmcgKi8KKyAgICAgICAgaWYgKHBlZXJjYXBzKSB7CisgICAgICAgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uOworICAgICAgICAgIEdzdENhcHMgKm9sZHJldCA9IHJldDsKKworICAgICAgICAgIF9fcmVtb3ZlX2NoYW5uZWxzIChwZWVyY2Fwcyk7CisKKyAgICAgICAgICBpbnRlcnNlY3Rpb24gPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHBlZXJjYXBzLCBvdXJjYXBzKTsKKworICAgICAgICAgIHJldCA9IGdzdF9jYXBzX2ludGVyc2VjdCAocmV0LCBpbnRlcnNlY3Rpb24pOworICAgICAgICAgIGdzdF9jYXBzX3VucmVmIChpbnRlcnNlY3Rpb24pOworICAgICAgICAgIGdzdF9jYXBzX3VucmVmIChwZWVyY2Fwcyk7CisgICAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKG9sZHJldCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR3N0Q2FwcyAqb2xkcmV0ID0gcmV0OworCisgICAgICAgICAgcmV0ID0gZ3N0X2NhcHNfaW50ZXJzZWN0IChyZXQsIG91cmNhcHMpOworICAgICAgICAgIGdzdF9jYXBzX3VucmVmIChvbGRyZXQpOworICAgICAgICB9CisgICAgICAgIGdzdF9jYXBzX3VucmVmIChvdXJjYXBzKTsKKyAgICAgICAgZ192YWx1ZV9yZXNldCAoJnYpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgR1NUX0lURVJBVE9SX0RPTkU6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfSVRFUkFUT1JfRVJST1I6CisgICAgICAgIGdzdF9jYXBzX3VucmVmIChyZXQpOworICAgICAgICByZXQgPSBnc3RfY2Fwc19uZXdfZW1wdHkgKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfSVRFUkFUT1JfUkVTWU5DOgorICAgICAgICBnc3RfY2Fwc191bnJlZiAocmV0KTsKKyAgICAgICAgcmV0ID0gZ3N0X2NhcHNfbmV3X2FueSAoKTsKKyAgICAgICAgZ3N0X2l0ZXJhdG9yX3Jlc3luYyAoaXQpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKHJlcyAhPSBHU1RfSVRFUkFUT1JfRE9ORSAmJiByZXMgIT0gR1NUX0lURVJBVE9SX0VSUk9SKTsKKyAgZ192YWx1ZV91bnNldCAoJnYpOworICBnc3RfaXRlcmF0b3JfZnJlZSAoaXQpOworCisgIGlmIChmaWx0ZXIpIHsKKyAgICBHc3RDYXBzICphdXg7CisKKyAgICBhdXggPSBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCByZXQsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHJldCk7CisgICAgcmV0ID0gYXV4OworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiSW50ZXJzZWN0ZWQgY2FwcyB0byAlIiBHU1RfUFRSX0ZPUk1BVCwgcmV0KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGVhdmVfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdERlaW50ZXJsZWF2ZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEVBVkUgKHBhcmVudCk7CisgIGdib29sZWFuIHJldDsKKworICBHU1RfREVCVUcgKCJHb3QgJXMgZXZlbnQgb24gcGFkICVzOiVzIiwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpLAorICAgICAgR1NUX0RFQlVHX1BBRF9OQU1FIChwYWQpKTsKKworICAvKiBTZW5kIEZMVVNIX1NUT1AsIEZMVVNIX1NUQVJUIGFuZCBFT1MgaW1tZWRpYXRlbHksIG5vIG1hdHRlciBpZgorICAgKiB3ZSBoYXZlIHNyYyBwYWRzIGFscmVhZHkgb3Igbm90LiBRdWV1ZSBhbGwgb3RoZXIgZXZlbnRzIGFuZAorICAgKiBwdXNoIHRoZW0gYWZ0ZXIgd2UgaGF2ZSBzcmMgcGFkcworICAgKi8KKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVEFSVDoKKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgICByZXQgPSBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9jYXBzIChldmVudCwgJmNhcHMpOworICAgICAgcmV0ID0gZ3N0X2RlaW50ZXJsZWF2ZV9zaW5rX3NldGNhcHMgKHNlbGYsIGNhcHMpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKCFzZWxmLT5zcmNwYWRzICYmICFHU1RfRVZFTlRfSVNfU1RJQ0tZIChldmVudCkpIHsKKyAgICAgICAgLyogU3RpY2t5IGV2ZW50cyBhcmUgY29waWVkIHdoZW4gY3JlYXRpbmcgYSBuZXcgcGFkICovCisgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc2VsZik7CisgICAgICAgIHNlbGYtPnBlbmRpbmdfZXZlbnRzID0gZ19saXN0X2FwcGVuZCAoc2VsZi0+cGVuZGluZ19ldmVudHMsIGV2ZW50KTsKKyAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNlbGYpOworICAgICAgICByZXQgPSBUUlVFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGVhdmVfc2lua19xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIGdib29sZWFuIHJlczsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9DQVBTOnsKKyAgICAgIEdzdENhcHMgKmZpbHRlcjsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9jYXBzIChxdWVyeSwgJmZpbHRlcik7CisgICAgICBjYXBzID0gZ3N0X2RlaW50ZXJsZWF2ZV9nZXRjYXBzIChwYWQsIHBhcmVudCwgZmlsdGVyKTsKKyAgICAgIGdzdF9xdWVyeV9zZXRfY2Fwc19yZXN1bHQgKHF1ZXJ5LCBjYXBzKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfQUNDRVBUX0NBUFM6eworICAgICAgR3N0Q2FwcyAqY2FwczsKKyAgICAgIGdib29sZWFuIHJldDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2FjY2VwdF9jYXBzIChxdWVyeSwgJmNhcHMpOworICAgICAgcmV0ID0gZ3N0X2RlaW50ZXJsZWF2ZV9zaW5rX2FjY2VwdGNhcHMgKHBhZCwgcGFyZW50LCBjYXBzKTsKKyAgICAgIGdzdF9xdWVyeV9zZXRfYWNjZXB0X2NhcHNfcmVzdWx0IChxdWVyeSwgcmV0KTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZGVpbnRlcmxlYXZlX3NyY19xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdERlaW50ZXJsZWF2ZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEVBVkUgKHBhcmVudCk7CisgIGdib29sZWFuIHJlczsKKworICByZXMgPSBnc3RfcGFkX3F1ZXJ5X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBxdWVyeSk7CisKKyAgaWYgKHJlcyAmJiBHU1RfUVVFUllfVFlQRSAocXVlcnkpID09IEdTVF9RVUVSWV9EVVJBVElPTikgeworICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisgICAgZ2ludDY0IGR1cjsKKworICAgIGdzdF9xdWVyeV9wYXJzZV9kdXJhdGlvbiAocXVlcnksICZmb3JtYXQsICZkdXIpOworCisgICAgLyogTmVlZCB0byBkaXZpZGUgYnkgdGhlIG51bWJlciBvZiBjaGFubmVscyBpbiBieXRlIGZvcm1hdAorICAgICAqIHRvIGdldCB0aGUgY29ycmVjdCB2YWx1ZS4gQWxsIG90aGVyIGZvcm1hdHMgc2hvdWxkIGJlIGZpbmUKKyAgICAgKi8KKyAgICBpZiAoZm9ybWF0ID09IEdTVF9GT1JNQVRfQllURVMgJiYgZHVyICE9IC0xKQorICAgICAgZ3N0X3F1ZXJ5X3NldF9kdXJhdGlvbiAocXVlcnksIGZvcm1hdCwKKyAgICAgICAgICBkdXIgLyBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJnNlbGYtPmF1ZGlvX2luZm8pKTsKKyAgfSBlbHNlIGlmIChyZXMgJiYgR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSA9PSBHU1RfUVVFUllfUE9TSVRJT04pIHsKKyAgICBHc3RGb3JtYXQgZm9ybWF0OworICAgIGdpbnQ2NCBwb3M7CisKKyAgICBnc3RfcXVlcnlfcGFyc2VfcG9zaXRpb24gKHF1ZXJ5LCAmZm9ybWF0LCAmcG9zKTsKKworICAgIC8qIE5lZWQgdG8gZGl2aWRlIGJ5IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaW4gYnl0ZSBmb3JtYXQKKyAgICAgKiB0byBnZXQgdGhlIGNvcnJlY3QgdmFsdWUuIEFsbCBvdGhlciBmb3JtYXRzIHNob3VsZCBiZSBmaW5lCisgICAgICovCisgICAgaWYgKGZvcm1hdCA9PSBHU1RfRk9STUFUX0JZVEVTICYmIHBvcyAhPSAtMSkKKyAgICAgIGdzdF9xdWVyeV9zZXRfcG9zaXRpb24gKHF1ZXJ5LCBmb3JtYXQsCisgICAgICAgICAgcG9zIC8gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKCZzZWxmLT5hdWRpb19pbmZvKSk7CisgIH0gZWxzZSBpZiAocmVzICYmIEdTVF9RVUVSWV9UWVBFIChxdWVyeSkgPT0gR1NUX1FVRVJZX0NBUFMpIHsKKyAgICBHc3RDYXBzICpmaWx0ZXIsICpjYXBzOworCisgICAgZ3N0X3F1ZXJ5X3BhcnNlX2NhcHMgKHF1ZXJ5LCAmZmlsdGVyKTsKKyAgICBjYXBzID0gZ3N0X2RlaW50ZXJsZWF2ZV9nZXRjYXBzIChwYWQsIHBhcmVudCwgZmlsdGVyKTsKKyAgICBnc3RfcXVlcnlfc2V0X2NhcHNfcmVzdWx0IChxdWVyeSwgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGVhdmVfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdERlaW50ZXJsZWF2ZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEVBVkUgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0tFRVBfUE9TSVRJT05TOgorICAgICAgc2VsZi0+a2VlcF9wb3NpdGlvbnMgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxlYXZlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3REZWludGVybGVhdmUgKnNlbGYgPSBHU1RfREVJTlRFUkxFQVZFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9LRUVQX1BPU0lUSU9OUzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBzZWxmLT5rZWVwX3Bvc2l0aW9ucyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZGVpbnRlcmxlYXZlX3Byb2Nlc3MgKEdzdERlaW50ZXJsZWF2ZSAqIHNlbGYsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ3VpbnQgY2hhbm5lbHMgPSBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJnNlbGYtPmF1ZGlvX2luZm8pOworICBndWludCBwYWRzX3B1c2hlZCA9IDAsIGJ1ZmZlcnNfYWxsb2NhdGVkID0gMDsKKyAgZ3VpbnQgbmZyYW1lcyA9CisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpIC8gY2hhbm5lbHMgLworICAgICAgKEdTVF9BVURJT19JTkZPX1dJRFRIICgmc2VsZi0+YXVkaW9faW5mbykgLyA4KTsKKyAgZ3VpbnQgYnVmc2l6ZSA9IG5mcmFtZXMgKiAoR1NUX0FVRElPX0lORk9fV0lEVEggKCZzZWxmLT5hdWRpb19pbmZvKSAvIDgpOworICBndWludCBpOworICBHTGlzdCAqc3JjczsKKyAgR3N0QnVmZmVyICoqYnVmZmVyc19vdXQgPSBnX25ldzAgKEdzdEJ1ZmZlciAqLCBjaGFubmVscyk7CisgIGd1aW50OCAqaW4sICpvdXQ7CisgIEdzdE1hcEluZm8gcmVhZF9pbmZvOworICBHTGlzdCAqcGVuZGluZ19ldmVudHMsICpsOworCisgIC8qIFNlbmQgYW55IHBlbmRpbmcgZXZlbnRzIHRvIGFsbCBzcmMgcGFkcyAqLworICBHU1RfT0JKRUNUX0xPQ0sgKHNlbGYpOworICBwZW5kaW5nX2V2ZW50cyA9IHNlbGYtPnBlbmRpbmdfZXZlbnRzOworICBzZWxmLT5wZW5kaW5nX2V2ZW50cyA9IE5VTEw7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChzZWxmKTsKKworICBpZiAocGVuZGluZ19ldmVudHMpIHsKKyAgICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiU2VuZGluZyBwZW5kaW5nIGV2ZW50cyB0byBhbGwgc3JjIHBhZHMiKTsKKyAgICBmb3IgKGwgPSBwZW5kaW5nX2V2ZW50czsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICAgIGV2ZW50ID0gbC0+ZGF0YTsKKyAgICAgIGZvciAoc3JjcyA9IHNlbGYtPnNyY3BhZHM7IHNyY3MgIT0gTlVMTDsgc3JjcyA9IHNyY3MtPm5leHQpCisgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoR1NUX1BBRCAoc3Jjcy0+ZGF0YSksIGdzdF9ldmVudF9yZWYgKGV2ZW50KSk7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICB9CisgICAgZ19saXN0X2ZyZWUgKHBlbmRpbmdfZXZlbnRzKTsKKyAgfQorCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZyZWFkX2luZm8sIEdTVF9NQVBfUkVBRCk7CisKKyAgLyogQWxsb2NhdGUgYnVmZmVycyAqLworICBmb3IgKHNyY3MgPSBzZWxmLT5zcmNwYWRzLCBpID0gMDsgc3Jjczsgc3JjcyA9IHNyY3MtPm5leHQsIGkrKykgeworICAgIGJ1ZmZlcnNfb3V0W2ldID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIGJ1ZnNpemUsIE5VTEwpOworCisgICAgLyogTWFrZSBzdXJlIHdlIGdvdCBhIGNvcnJlY3QgYnVmZmVyLiBUaGUgb25seSBvdGhlciBjYXNlIHdlIGFsbG93CisgICAgICogaGVyZSBpcyBhbiB1bmxpa2VkIHBhZCAqLworICAgIGlmICghYnVmZmVyc19vdXRbaV0pCisgICAgICBnb3RvIGFsbG9jX2J1ZmZlcl9mYWlsZWQ7CisgICAgZWxzZSBpZiAoYnVmZmVyc19vdXRbaV0KKyAgICAgICAgJiYgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyc19vdXRbaV0pICE9IGJ1ZnNpemUpCisgICAgICBnb3RvIGFsbG9jX2J1ZmZlcl9iYWRfc2l6ZTsKKworICAgIGlmIChidWZmZXJzX291dFtpXSkgeworICAgICAgZ3N0X2J1ZmZlcl9jb3B5X2ludG8gKGJ1ZmZlcnNfb3V0W2ldLCBidWYsIEdTVF9CVUZGRVJfQ09QWV9NRVRBREFUQSwgMCwKKyAgICAgICAgICAtMSk7CisgICAgICBidWZmZXJzX2FsbG9jYXRlZCsrOworICAgIH0KKyAgfQorCisgIC8qIFJldHVybiBOT1RfTElOS0VEIGlmIG5vIHBhZCB3YXMgbGlua2VkICovCisgIGlmICghYnVmZmVyc19hbGxvY2F0ZWQpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICJDb3VsZG4ndCBhbGxvY2F0ZSBhbnkgYnVmZmVycyBiZWNhdXNlIG5vIHBhZCB3YXMgbGlua2VkIik7CisgICAgcmV0ID0gR1NUX0ZMT1dfTk9UX0xJTktFRDsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICAvKiBkZWludGVybGVhdmUgKi8KKyAgZm9yIChzcmNzID0gc2VsZi0+c3JjcGFkcywgaSA9IDA7IHNyY3M7IHNyY3MgPSBzcmNzLT5uZXh0LCBpKyspIHsKKyAgICBHc3RQYWQgKnBhZCA9IChHc3RQYWQgKikgc3Jjcy0+ZGF0YTsKKyAgICBHc3RNYXBJbmZvIHdyaXRlX2luZm87CisKKyAgICBpbiA9IChndWludDggKikgcmVhZF9pbmZvLmRhdGE7CisgICAgaW4gKz0gaSAqIChHU1RfQVVESU9fSU5GT19XSURUSCAoJnNlbGYtPmF1ZGlvX2luZm8pIC8gOCk7CisgICAgaWYgKGJ1ZmZlcnNfb3V0W2ldKSB7CisgICAgICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyc19vdXRbaV0sICZ3cml0ZV9pbmZvLCBHU1RfTUFQX1dSSVRFKTsKKyAgICAgIG91dCA9IChndWludDggKikgd3JpdGVfaW5mby5kYXRhOworICAgICAgc2VsZi0+ZnVuYyAob3V0LCBpbiwgY2hhbm5lbHMsIG5mcmFtZXMpOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyc19vdXRbaV0sICZ3cml0ZV9pbmZvKTsKKworICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoIChwYWQsIGJ1ZmZlcnNfb3V0W2ldKTsKKyAgICAgIGJ1ZmZlcnNfb3V0W2ldID0gTlVMTDsKKyAgICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfT0spCisgICAgICAgIHBhZHNfcHVzaGVkKys7CisgICAgICBlbHNlIGlmIChyZXQgPT0gR1NUX0ZMT1dfTk9UX0xJTktFRCkKKyAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICBlbHNlCisgICAgICAgIGdvdG8gcHVzaF9mYWlsZWQ7CisgICAgfQorICB9CisKKyAgLyogUmV0dXJuIE5PVF9MSU5LRUQgaWYgbm8gcGFkIHdhcyBsaW5rZWQgKi8KKyAgaWYgKCFwYWRzX3B1c2hlZCkKKyAgICByZXQgPSBHU1RfRkxPV19OT1RfTElOS0VEOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJQdXNoZWQgb24gJWQgcGFkcyIsIHBhZHNfcHVzaGVkKTsKKworZG9uZToKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmcmVhZF9pbmZvKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgZ19mcmVlIChidWZmZXJzX291dCk7CisgIHJldHVybiByZXQ7CisKK2FsbG9jX2J1ZmZlcl9mYWlsZWQ6CisgIHsKKyAgICBHU1RfV0FSTklORyAoImdzdF9wYWRfYWxsb2NfYnVmZmVyKCkgcmV0dXJuZWQgJXMiLCBnc3RfZmxvd19nZXRfbmFtZSAocmV0KSk7CisgICAgZ290byBjbGVhbl9idWZmZXJzOworCisgIH0KK2FsbG9jX2J1ZmZlcl9iYWRfc2l6ZToKKyAgeworICAgIEdTVF9XQVJOSU5HICgiY2FsbGVkIGFsbG9jX2J1ZmZlcigpLCBidXQgZGlkbid0IGdldCByZXF1ZXN0ZWQgYnl0ZXMiKTsKKyAgICByZXQgPSBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICBnb3RvIGNsZWFuX2J1ZmZlcnM7CisgIH0KK3B1c2hfZmFpbGVkOgorICB7CisgICAgR1NUX0RFQlVHICgicHVzaCgpIGZhaWxlZCwgZmxvdyA9ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworICAgIGdvdG8gY2xlYW5fYnVmZmVyczsKKyAgfQorY2xlYW5fYnVmZmVyczoKKyAgeworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJnJlYWRfaW5mbyk7CisgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKKyAgICAgIGlmIChidWZmZXJzX291dFtpXSkKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyc19vdXRbaV0pOworICAgIH0KKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIGdfZnJlZSAoYnVmZmVyc19vdXQpOworICAgIHJldHVybiByZXQ7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9kZWludGVybGVhdmVfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdERlaW50ZXJsZWF2ZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEVBVkUgKHBhcmVudCk7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZWxmLT5mdW5jICE9IE5VTEwsIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9BVURJT19JTkZPX1dJRFRIICgmc2VsZi0+YXVkaW9faW5mbykgPiAwLAorICAgICAgR1NUX0ZMT1dfTk9UX05FR09USUFURUQpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKCZzZWxmLT5hdWRpb19pbmZvKSA+IDAsCisgICAgICBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRCk7CisKKyAgcmV0ID0gZ3N0X2RlaW50ZXJsZWF2ZV9wcm9jZXNzIChzZWxmLCBidWZmZXIpOworCisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImZsb3cgcmV0dXJuOiAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9kZWludGVybGVhdmVfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3REZWludGVybGVhdmUgKnNlbGYgPSBHU1RfREVJTlRFUkxFQVZFIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfZGVpbnRlcmxlYXZlX3JlbW92ZV9wYWRzIChzZWxmKTsKKworICAgICAgc2VsZi0+ZnVuYyA9IE5VTEw7CisKKyAgICAgIGlmIChzZWxmLT5wZW5kaW5nX2V2ZW50cykgeworICAgICAgICBnX2xpc3RfZm9yZWFjaCAoc2VsZi0+cGVuZGluZ19ldmVudHMsIChHRnVuYykgZ3N0X21pbmlfb2JqZWN0X3VucmVmLAorICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIGdfbGlzdF9mcmVlIChzZWxmLT5wZW5kaW5nX2V2ZW50cyk7CisgICAgICAgIHNlbGYtPnBlbmRpbmdfZXZlbnRzID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUExBWUlORzoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QTEFZSU5HX1RPX1BBVVNFRDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3RfZGVpbnRlcmxlYXZlX3JlbW92ZV9wYWRzIChzZWxmKTsKKworICAgICAgc2VsZi0+ZnVuYyA9IE5VTEw7CisKKyAgICAgIGlmIChzZWxmLT5wZW5kaW5nX2V2ZW50cykgeworICAgICAgICBnX2xpc3RfZm9yZWFjaCAoc2VsZi0+cGVuZGluZ19ldmVudHMsIChHRnVuYykgZ3N0X21pbmlfb2JqZWN0X3VucmVmLAorICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIGdfbGlzdF9mcmVlIChzZWxmLT5wZW5kaW5nX2V2ZW50cyk7CisgICAgICAgIHNlbGYtPnBlbmRpbmdfZXZlbnRzID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9nc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuaCBiL2dzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YzE4ODUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuaApAQCAtMCwwICsxLDczIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwMCBXaW0gVGF5bWFucyA8d3RheUBjaGVsbG8uYmU+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwNSBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICogICAgICAgICAgICAgICAgICAgIDIwMDcgQW5keSBXaW5nbyA8d2luZ28gYXQgcG9ib3guY29tPgorICogICAgICAgICAgICAgICAgICAgIDIwMDggU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIGRlaW50ZXJsZWF2ZS5jOiBkZWludGVybGVhdmUgc2FtcGxlcworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19ERUlOVEVSTEVBVkVfSF9fCisjZGVmaW5lIF9fREVJTlRFUkxFQVZFX0hfXworCitHX0JFR0lOX0RFQ0xTCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxFQVZFICAgICAgICAgICAgKGdzdF9kZWludGVybGVhdmVfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMRUFWRShvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0RFSU5URVJMRUFWRSxHc3REZWludGVybGVhdmUpKQorI2RlZmluZSBHU1RfREVJTlRFUkxFQVZFX0NMQVNTKGtsYXNzKSAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9ERUlOVEVSTEVBVkUsR3N0RGVpbnRlcmxlYXZlQ2xhc3MpKQorI2RlZmluZSBHU1RfREVJTlRFUkxFQVZFX0dFVF9DTEFTUyhvYmopIFwKKyAgICAgICAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLEdTVF9UWVBFX0RFSU5URVJMRUFWRSxHc3REZWludGVybGVhdmVDbGFzcykpCisjZGVmaW5lIEdTVF9JU19ERUlOVEVSTEVBVkUob2JqKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9ERUlOVEVSTEVBVkUpKQorI2RlZmluZSBHU1RfSVNfREVJTlRFUkxFQVZFX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9ERUlOVEVSTEVBVkUpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0RGVpbnRlcmxlYXZlIEdzdERlaW50ZXJsZWF2ZTsKK3R5cGVkZWYgc3RydWN0IF9Hc3REZWludGVybGVhdmVDbGFzcyBHc3REZWludGVybGVhdmVDbGFzczsKKwordHlwZWRlZiB2b2lkICgqR3N0RGVpbnRlcmxlYXZlRnVuYykgKGdwb2ludGVyIG91dCwgZ3BvaW50ZXIgaW4sIGd1aW50IHN0cmlkZSwgZ3VpbnQgbmZyYW1lcyk7CisKK3N0cnVjdCBfR3N0RGVpbnRlcmxlYXZlCit7CisgIEdzdEVsZW1lbnQgZWxlbWVudDsKKworICAvKjwgcHJpdmF0ZSA+ICovCisgIEdMaXN0ICpzcmNwYWRzOworICBHc3RDYXBzICpzaW5rY2FwczsKKyAgR3N0QXVkaW9JbmZvIGF1ZGlvX2luZm87CisgIGdib29sZWFuIGtlZXBfcG9zaXRpb25zOworCisgIEdzdFBhZCAqc2luazsKKworICBHc3REZWludGVybGVhdmVGdW5jIGZ1bmM7CisKKyAgR0xpc3QgKnBlbmRpbmdfZXZlbnRzOworfTsKKworc3RydWN0IF9Hc3REZWludGVybGVhdmVDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2RlaW50ZXJsZWF2ZV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0RFSU5URVJMRUFWRV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYyBiL2dzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDhkMGZmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jCkBAIC0wLDAgKzEsMTMzOCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICAgICAgIDIwMDAgV2ltIFRheW1hbnMgPHd0YXlAY2hlbGxvLmJlPgorICogICAgICAgICAgICAgICAgICAgIDIwMDUgV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAyMDA3IEFuZHkgV2luZ28gPHdpbmdvIGF0IHBvYm94LmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAyMDA4IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLnJnPgorICoKKyAqIGludGVybGVhdmUuYzogaW50ZXJsZWF2ZSBzYW1wbGVzLCBtb3N0bHkgYmFzZWQgb24gYWRkZXIuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyogVE9ETzoKKyAqICAgICAgIC0gaGFuZGxlIGNhcHMgY2hhbmdlcworICogICAgICAgLSBoYW5kbGUgbW9yZSBxdWVyaWVzL2V2ZW50cworICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWludGVybGVhdmUKKyAqIEBzZWVfYWxzbzogZGVpbnRlcmxlYXZlCisgKgorICogTWVyZ2VzIHNlcGFyYXRlIG1vbm8gaW5wdXRzIGludG8gb25lIGludGVybGVhdmVkIHN0cmVhbS4KKyAqIAorICogVGhpcyBlbGVtZW50IGhhbmRsZXMgYWxsIHJhdyBmbG9hdGluZyBwb2ludCBzYW1wbGUgZm9ybWF0cyBhbmQgYWxsIHNpZ25lZCBpbnRlZ2VyIHNhbXBsZSBmb3JtYXRzLiBUaGUgZmlyc3QKKyAqIGNhcHMgb24gb25lIG9mIHRoZSBzaW5rcGFkcyB3aWxsIHNldCB0aGUgY2FwcyBvZiB0aGUgb3V0cHV0IHNvIHVzdWFsbHkgYW4gYXVkaW9jb252ZXJ0IGVsZW1lbnQgc2hvdWxkIGJlCisgKiBwbGFjZWQgYmVmb3JlIGV2ZXJ5IHNpbmtwYWQgb2YgaW50ZXJsZWF2ZS4KKyAqIAorICogSXQncyBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIG51bWJlciBvZiBjaGFubmVscyB3aGlsZSB0aGUgcGlwZWxpbmUgaXMgcnVubmluZyBieSBhZGRpbmcgb3IgcmVtb3ZpbmcKKyAqIHNvbWUgb2YgdGhlIHJlcXVlc3QgcGFkcyBidXQgdGhpcyB3aWxsIGNoYW5nZSB0aGUgY2FwcyBvZiB0aGUgb3V0cHV0IGJ1ZmZlcnMuIENoYW5naW5nIHRoZSBpbnB1dAorICogY2FwcyBpcyBfbm90XyBzdXBwb3J0ZWQgeWV0LgorICogCisgKiBUaGUgY2hhbm5lbCBudW1iZXIgb2YgZXZlcnkgc2lua3BhZCBpbiB0aGUgb3V0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgImNoYW5uZWwiIHByb3BlcnR5IG9mIHRoZSBwYWQuCisgKiAKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPWZpbGUubXAzICEgZGVjb2RlYmluICEgYXVkaW9jb252ZXJ0ICEgImF1ZGlvL3gtcmF3LGNoYW5uZWxzPTIiICEgZGVpbnRlcmxlYXZlIG5hbWU9ZCAgaW50ZXJsZWF2ZSBuYW1lPWkgISBhdWRpb2NvbnZlcnQgISB3YXZlbmMgISBmaWxlc2luayBsb2NhdGlvbj10ZXN0LndhdiAgICBkLnNyY18wICEgcXVldWUgISBhdWRpb2NvbnZlcnQgISBpLnNpbmtfMSAgICBkLnNyY18xICEgcXVldWUgISBhdWRpb2NvbnZlcnQgISBpLnNpbmtfMAorICogXXwgRGVjb2RlcyBhbmQgZGVpbnRlcmxlYXZlcyBhIFN0ZXJlbyBNUDMgZmlsZSBpbnRvIHNlcGFyYXRlIGNoYW5uZWxzIGFuZAorICogdGhlbiBpbnRlcmxlYXZlcyB0aGUgY2hhbm5lbHMgYWdhaW4gdG8gYSBXQVYgZmlsZSB3aXRoIHRoZSBjaGFubmVscworICogZXhjaGFuZ2VkLgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGludGVybGVhdmUgbmFtZT1pICEgYXVkaW9jb252ZXJ0ICEgd2F2ZW5jICEgZmlsZXNpbmsgbG9jYXRpb249ZmlsZS53YXYgIGZpbGVzcmMgbG9jYXRpb249ZmlsZTEud2F2ICEgZGVjb2RlYmluICEgYXVkaW9jb252ZXJ0ICEgImF1ZGlvL3gtcmF3LGNoYW5uZWxzPTEsY2hhbm5lbC1tYXNrPShiaXRtYXNrKTB4MSIgISBxdWV1ZSAhIGkuc2lua18wICAgZmlsZXNyYyBsb2NhdGlvbj1maWxlMi53YXYgISBkZWNvZGViaW4gISBhdWRpb2NvbnZlcnQgISAiYXVkaW8veC1yYXcsY2hhbm5lbHM9MSxjaGFubmVsLW1hc2s9KGJpdG1hc2spMHgyIiAhIHF1ZXVlICEgaS5zaW5rXzEKKyAqIF18IEludGVybGVhdmVzIHR3byBNb25vIFdBViBmaWxlcyB0byBhIHNpbmdsZSBTdGVyZW8gV0FWIGZpbGUuIEhhdmluZworICogY2hhbm5lbC1tYXNrcyBkZWZpbmVkIGluIHRoZSBzaW5rIHBhZHMgZW5zdXJlcyBhIHNhbmUgbWFwcGluZyBvZiB0aGUgbW9ubworICogc3RyZWFtcyBpbnRvIHRoZSBzdGVyZW8gc3RyZWFtLiBOT1RFOiB0aGUgcHJvcGVyIHdheSB0byBtYXAgY2hhbm5lbHMgaW4KKyAqIGNvZGUgaXMgYnkgdXNpbmcgdGhlIGNoYW5uZWwtcG9zaXRpb25zIHByb3BlcnR5IG9mIHRoZSBpbnRlcmxlYXZlIGVsZW1lbnQuCisgKiA8L3JlZnNlY3QyPgorICovCisKKy8qIEZJWE1FIDAuMTE6IHN1cHByZXNzIHdhcm5pbmdzIGZvciBkZXByZWNhdGVkIEFQSSBzdWNoIGFzIEdWYWx1ZUFycmF5CisgKiB3aXRoIG5ld2VyIEdMaWIgdmVyc2lvbnMgKD49IDIuMzEuMCkgKi8KKyNkZWZpbmUgR0xJQl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImludGVybGVhdmUuaCIKKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby1lbnVtdHlwZXMuaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X2ludGVybGVhdmVfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X2ludGVybGVhdmVfZGVidWcKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmtfJXUiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX0ZPUk1BVFNfQUxMICIsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIHtub24taW50ZXJsZWF2ZWQsIGludGVybGVhdmVkfSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgWyAxLCBNQVggXSwgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fRk9STUFUU19BTEwgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQiKQorICAgICk7CisKKyNkZWZpbmUgTUFLRV9GVU5DKHR5cGUpIFwKK3N0YXRpYyB2b2lkIGludGVybGVhdmVfIyN0eXBlIChndWludCMjdHlwZSAqb3V0LCBndWludCMjdHlwZSAqaW4sIFwKKyAgICBndWludCBzdHJpZGUsIGd1aW50IG5mcmFtZXMpIFwKK3sgXAorICBnaW50IGk7IFwKKyAgXAorICBmb3IgKGkgPSAwOyBpIDwgbmZyYW1lczsgaSsrKSB7IFwKKyAgICAqb3V0ID0gaW5baV07IFwKKyAgICBvdXQgKz0gc3RyaWRlOyBcCisgIH0gXAorfQorCitNQUtFX0ZVTkMgKDgpOworTUFLRV9GVU5DICgxNik7CitNQUtFX0ZVTkMgKDMyKTsKK01BS0VfRlVOQyAoNjQpOworCitzdGF0aWMgdm9pZAoraW50ZXJsZWF2ZV8yNCAoZ3VpbnQ4ICogb3V0LCBndWludDggKiBpbiwgZ3VpbnQgc3RyaWRlLCBndWludCBuZnJhbWVzKQoreworICBnaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG5mcmFtZXM7IGkrKykgeworICAgIG1lbWNweSAob3V0LCBpbiwgMyk7CisgICAgb3V0ICs9IHN0cmlkZSAqIDM7CisgICAgaW4gKz0gMzsKKyAgfQorfQorCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RQYWQgcGFyZW50OworICBndWludCBjaGFubmVsOworfSBHc3RJbnRlcmxlYXZlUGFkOworCitlbnVtCit7CisgIFBST1BfUEFEXzAsCisgIFBST1BfUEFEX0NIQU5ORUwKK307CisKK3N0YXRpYyB2b2lkIGdzdF9pbnRlcmxlYXZlX3BhZF9jbGFzc19pbml0IChHc3RQYWRDbGFzcyAqIGtsYXNzKTsKKworI2RlZmluZSBHU1RfVFlQRV9JTlRFUkxFQVZFX1BBRCAoZ3N0X2ludGVybGVhdmVfcGFkX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9JTlRFUkxFQVZFX1BBRChwYWQpIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgocGFkKSxHU1RfVFlQRV9JTlRFUkxFQVZFX1BBRCxHc3RJbnRlcmxlYXZlUGFkKSkKKyNkZWZpbmUgR1NUX0lOVEVSTEVBVkVfUEFEX0NBU1QocGFkKSAoKEdzdEludGVybGVhdmVQYWQgKikgcGFkKQorI2RlZmluZSBHU1RfSVNfSU5URVJMRUFWRV9QQUQocGFkKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKHBhZCksR1NUX1RZUEVfSU5URVJMRUFWRV9QQUQpKQorc3RhdGljIEdUeXBlCitnc3RfaW50ZXJsZWF2ZV9wYWRfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSB0eXBlID0gMDsKKworICBpZiAoR19VTkxJS0VMWSAodHlwZSA9PSAwKSkgeworICAgIHR5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljX3NpbXBsZSAoR1NUX1RZUEVfUEFELAorICAgICAgICBnX2ludGVybl9zdGF0aWNfc3RyaW5nICgiR3N0SW50ZXJsZWF2ZVBhZCIpLCBzaXplb2YgKEdzdFBhZENsYXNzKSwKKyAgICAgICAgKEdDbGFzc0luaXRGdW5jKSBnc3RfaW50ZXJsZWF2ZV9wYWRfY2xhc3NfaW5pdCwKKyAgICAgICAgc2l6ZW9mIChHc3RJbnRlcmxlYXZlUGFkKSwgTlVMTCwgMCk7CisgIH0KKyAgcmV0dXJuIHR5cGU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaW50ZXJsZWF2ZV9wYWRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEludGVybGVhdmVQYWQgKnNlbGYgPSBHU1RfSU5URVJMRUFWRV9QQUQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BBRF9DSEFOTkVMOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNlbGYtPmNoYW5uZWwpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2ludGVybGVhdmVfcGFkX2NsYXNzX2luaXQgKEdzdFBhZENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2ludGVybGVhdmVfcGFkX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9QQURfQ0hBTk5FTCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiY2hhbm5lbCIsCisgICAgICAgICAgIkNoYW5uZWwgbnVtYmVyIiwKKyAgICAgICAgICAiTnVtYmVyIG9mIHRoZSBjaGFubmVsIG9mIHRoaXMgcGFkIGluIHRoZSBvdXRwdXQiLCAwLCBHX01BWFVJTlQsIDAsCisgICAgICAgICAgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKK30KKworI2RlZmluZSBnc3RfaW50ZXJsZWF2ZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RJbnRlcmxlYXZlLCBnc3RfaW50ZXJsZWF2ZSwgR1NUX1RZUEVfRUxFTUVOVCk7CisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0NIQU5ORUxfUE9TSVRJT05TLAorICBQUk9QX0NIQU5ORUxfUE9TSVRJT05TX0ZST01fSU5QVVQKK307CisKK3N0YXRpYyB2b2lkIGdzdF9pbnRlcmxlYXZlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9pbnRlcmxlYXZlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIEdzdFBhZCAqZ3N0X2ludGVybGVhdmVfcmVxdWVzdF9uZXdfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLCBjb25zdCBnY2hhciAqIG5hbWUsIGNvbnN0IEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyB2b2lkIGdzdF9pbnRlcmxlYXZlX3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9pbnRlcmxlYXZlX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfaW50ZXJsZWF2ZV9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ludGVybGVhdmVfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9pbnRlcmxlYXZlX3NpbmtfZXZlbnQgKEdzdENvbGxlY3RQYWRzICogcGFkcywKKyAgICBHc3RDb2xsZWN0RGF0YSAqIGRhdGEsIEdzdEV2ZW50ICogZXZlbnQsIGdwb2ludGVyIHVzZXJfZGF0YSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ludGVybGVhdmVfc2lua19xdWVyeSAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLAorICAgIEdzdENvbGxlY3REYXRhICogZGF0YSwgR3N0UXVlcnkgKiBxdWVyeSwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9pbnRlcmxlYXZlX3Npbmtfc2V0Y2FwcyAoR3N0SW50ZXJsZWF2ZSAqIHNlbGYsCisgICAgR3N0UGFkICogcGFkLCBjb25zdCBHc3RDYXBzICogY2FwcywgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbyk7CisKK3N0YXRpYyBHc3RDYXBzICpnc3RfaW50ZXJsZWF2ZV9zaW5rX2dldGNhcHMgKEdzdFBhZCAqIHBhZCwgR3N0SW50ZXJsZWF2ZSAqIHNlbGYsCisgICAgR3N0Q2FwcyAqIGZpbHRlcik7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9pbnRlcmxlYXZlX2NvbGxlY3RlZCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLAorICAgIEdzdEludGVybGVhdmUgKiBzZWxmKTsKKworc3RhdGljIHZvaWQKK2dzdF9pbnRlcmxlYXZlX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RJbnRlcmxlYXZlICpzZWxmID0gR1NUX0lOVEVSTEVBVkUgKG9iamVjdCk7CisKKyAgaWYgKHNlbGYtPmNvbGxlY3QpIHsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzZWxmLT5jb2xsZWN0KTsKKyAgICBzZWxmLT5jb2xsZWN0ID0gTlVMTDsKKyAgfQorCisgIGlmIChzZWxmLT5jaGFubmVsX3Bvc2l0aW9ucworICAgICAgJiYgc2VsZi0+Y2hhbm5lbF9wb3NpdGlvbnMgIT0gc2VsZi0+aW5wdXRfY2hhbm5lbF9wb3NpdGlvbnMpIHsKKyAgICBnX3ZhbHVlX2FycmF5X2ZyZWUgKHNlbGYtPmNoYW5uZWxfcG9zaXRpb25zKTsKKyAgICBzZWxmLT5jaGFubmVsX3Bvc2l0aW9ucyA9IE5VTEw7CisgIH0KKworICBpZiAoc2VsZi0+aW5wdXRfY2hhbm5lbF9wb3NpdGlvbnMpIHsKKyAgICBnX3ZhbHVlX2FycmF5X2ZyZWUgKHNlbGYtPmlucHV0X2NoYW5uZWxfcG9zaXRpb25zKTsKKyAgICBzZWxmLT5pbnB1dF9jaGFubmVsX3Bvc2l0aW9ucyA9IE5VTEw7CisgIH0KKworICBnc3RfY2Fwc19yZXBsYWNlICgmc2VsZi0+c2lua2NhcHMsIE5VTEwpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIGdpbnQKK2NvbXBhcmVfcG9zaXRpb25zIChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBjb25zdCBnaW50IGkgPSAqKGNvbnN0IGdpbnQgKikgYTsKKyAgY29uc3QgZ2ludCBqID0gKihjb25zdCBnaW50ICopIGI7CisgIGNvbnN0IGdpbnQgKnBvcyA9IChjb25zdCBnaW50ICopIHVzZXJfZGF0YTsKKworICBpZiAocG9zW2ldIDwgcG9zW2pdKQorICAgIHJldHVybiAtMTsKKyAgZWxzZSBpZiAocG9zW2ldID4gcG9zW2pdKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ludGVybGVhdmVfY2hhbm5lbF9wb3NpdGlvbnNfdG9fbWFzayAoR1ZhbHVlQXJyYXkgKiBwb3NpdGlvbnMsCisgICAgZ2ludCBkZWZhdWx0X29yZGVyaW5nX21hcFs2NF0sIGd1aW50NjQgKiBtYXNrKQoreworICBnaW50IGk7CisgIGd1aW50IGNoYW5uZWxzOworICBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiAqcG9zOworICBnYm9vbGVhbiByZXQ7CisKKyAgY2hhbm5lbHMgPSBwb3NpdGlvbnMtPm5fdmFsdWVzOworICBwb3MgPSBnX25ldyAoR3N0QXVkaW9DaGFubmVsUG9zaXRpb24sIGNoYW5uZWxzKTsKKworICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgeworICAgIEdWYWx1ZSAqdmFsOworCisgICAgdmFsID0gZ192YWx1ZV9hcnJheV9nZXRfbnRoIChwb3NpdGlvbnMsIGkpOworICAgIHBvc1tpXSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbCk7CisgIH0KKworICAvKiBzb3J0IHRoZSBkZWZhdWx0IG9yZGVyaW5nIG1hcCBhY2NvcmRpbmcgdG8gdGhlIHBvc2l0aW9uIG9yZGVyICovCisgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CisgICAgZGVmYXVsdF9vcmRlcmluZ19tYXBbaV0gPSBpOworICB9CisgIGdfcXNvcnRfd2l0aF9kYXRhIChkZWZhdWx0X29yZGVyaW5nX21hcCwgY2hhbm5lbHMsCisgICAgICBzaXplb2YgKCpkZWZhdWx0X29yZGVyaW5nX21hcCksIGNvbXBhcmVfcG9zaXRpb25zLCBwb3MpOworCisgIHJldCA9IGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uc190b19tYXNrIChwb3MsIGNoYW5uZWxzLCBGQUxTRSwgbWFzayk7CisgIGdfZnJlZSAocG9zKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X2ludGVybGVhdmVfc2V0X2NoYW5uZWxfcG9zaXRpb25zIChHc3RJbnRlcmxlYXZlICogc2VsZiwgR3N0U3RydWN0dXJlICogcykKK3sKKyAgaWYgKHNlbGYtPmNoYW5uZWxzIDw9IDY0ICYmCisgICAgICBzZWxmLT5jaGFubmVsX3Bvc2l0aW9ucyAhPSBOVUxMICYmCisgICAgICBzZWxmLT5jaGFubmVscyA9PSBzZWxmLT5jaGFubmVsX3Bvc2l0aW9ucy0+bl92YWx1ZXMpIHsKKyAgICBpZiAoIWdzdF9pbnRlcmxlYXZlX2NoYW5uZWxfcG9zaXRpb25zX3RvX21hc2sgKHNlbGYtPmNoYW5uZWxfcG9zaXRpb25zLAorICAgICAgICAgICAgc2VsZi0+ZGVmYXVsdF9jaGFubmVsc19vcmRlcmluZ19tYXAsICZzZWxmLT5jaGFubmVsX21hc2spKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNlbGYsICJJbnZhbGlkIGNoYW5uZWwgcG9zaXRpb25zLCB1c2luZyBOT05FIik7CisgICAgICBzZWxmLT5jaGFubmVsX21hc2sgPSAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzZWxmLT5jaGFubmVsX21hc2sgPSAwOworICAgIGlmIChzZWxmLT5jaGFubmVscyA8PSA2NCkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzZWxmLCAiVXNpbmcgTk9ORSBjaGFubmVsIHBvc2l0aW9ucyIpOworICAgIH0KKyAgfQorICBnc3Rfc3RydWN0dXJlX3NldCAocywgImNoYW5uZWwtbWFzayIsIEdTVF9UWVBFX0JJVE1BU0ssIHNlbGYtPmNoYW5uZWxfbWFzaywKKyAgICAgIE5VTEwpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2ludGVybGVhdmVfc2VuZF9zdHJlYW1fc3RhcnQgKEdzdEludGVybGVhdmUgKiBzZWxmKQoreworICBHU1RfT0JKRUNUX0xPQ0sgKHNlbGYpOworICBpZiAoc2VsZi0+c2VuZF9zdHJlYW1fc3RhcnQpIHsKKyAgICBnY2hhciBzX2lkWzMyXTsKKworICAgIHNlbGYtPnNlbmRfc3RyZWFtX3N0YXJ0ID0gRkFMU0U7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNlbGYpOworCisgICAgLyogc3RyZWFtLXN0YXJ0IChGSVhNRTogY3JlYXRlIGlkIGJhc2VkIG9uIGlucHV0IGlkcykgKi8KKyAgICBnX3NucHJpbnRmIChzX2lkLCBzaXplb2YgKHNfaWQpLCAiaW50ZXJsZWF2ZS0lMDh4IiwgZ19yYW5kb21faW50ICgpKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNyYywgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKHNfaWQpKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc2VsZik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9pbnRlcmxlYXZlX2NsYXNzX2luaXQgKEdzdEludGVybGVhdmVDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9pbnRlcmxlYXZlX2RlYnVnLCAiaW50ZXJsZWF2ZSIsIDAsCisgICAgICAiaW50ZXJsZWF2ZSBlbGVtZW50Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkF1ZGlvIGludGVybGVhdmVyIiwKKyAgICAgICJGaWx0ZXIvQ29udmVydGVyL0F1ZGlvIiwKKyAgICAgICJGb2xkcyBtYW55IG1vbm8gY2hhbm5lbHMgaW50byBvbmUgaW50ZXJsZWF2ZWQgYXVkaW8gc3RyZWFtIiwKKyAgICAgICJBbmR5IFdpbmdvIDx3aW5nbyBhdCBwb2JveC5jb20+LCAiCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc3JjX3RlbXBsYXRlKTsKKworICAvKiBSZWZlcmVuY2UgR3N0SW50ZXJsZWF2ZVBhZCBjbGFzcyB0byBoYXZlIHRoZSB0eXBlIHJlZ2lzdGVyZWQgZnJvbQorICAgKiBhIHRocmVhZHNhZmUgY29udGV4dAorICAgKi8KKyAgZ190eXBlX2NsYXNzX3JlZiAoR1NUX1RZUEVfSU5URVJMRUFWRV9QQUQpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2ludGVybGVhdmVfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9pbnRlcmxlYXZlX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2ludGVybGVhdmVfZ2V0X3Byb3BlcnR5OworCisgIC8qKgorICAgKiBHc3RJbnRlcmxlYXZlOmNoYW5uZWwtcG9zaXRpb25zCisgICAqIAorICAgKiBDaGFubmVsIHBvc2l0aW9uczogVGhpcyBwcm9wZXJ0eSBjb250cm9scyB0aGUgY2hhbm5lbCBwb3NpdGlvbnMKKyAgICogdGhhdCBhcmUgdXNlZCBvbiB0aGUgc3JjIGNhcHMuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgc2hvdWxkIGJlCisgICAqIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2Ygc2luayBwYWRzIGFuZCB0aGUgYXJyYXkgc2hvdWxkIGNvbnRhaW4KKyAgICogYSB2YWxpZCBsaXN0IG9mIGNoYW5uZWwgcG9zaXRpb25zLiBUaGUgbi10aCBlbGVtZW50IG9mIHRoZSBhcnJheQorICAgKiBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIG4tdGggc2luayBwYWQuCisgICAqCisgICAqIFRoZXNlIGNoYW5uZWwgcG9zaXRpb25zIHdpbGwgb25seSBiZSB1c2VkIGlmIHRoZXkncmUgdmFsaWQgYW5kIHRoZQorICAgKiBudW1iZXIgb2YgZWxlbWVudHMgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscy4gSWYgdGhpcworICAgKiBpcyBub3QgZ2l2ZW4gYSBOT05FIGxheW91dCB3aWxsIGJlIHVzZWQuCisgICAqCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NIQU5ORUxfUE9TSVRJT05TLAorICAgICAgZ19wYXJhbV9zcGVjX3ZhbHVlX2FycmF5ICgiY2hhbm5lbC1wb3NpdGlvbnMiLCAiQ2hhbm5lbCBwb3NpdGlvbnMiLAorICAgICAgICAgICJDaGFubmVsIHBvc2l0aW9ucyB1c2VkIG9uIHRoZSBvdXRwdXQiLAorICAgICAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgiY2hhbm5lbC1wb3NpdGlvbiIsICJDaGFubmVsIHBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgIkNoYW5uZWwgcG9zaXRpb24gb2YgdGhlIG4tdGggaW5wdXQiLAorICAgICAgICAgICAgICBHU1RfVFlQRV9BVURJT19DSEFOTkVMX1BPU0lUSU9OLAorICAgICAgICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FLAorICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RJbnRlcmxlYXZlOmNoYW5uZWwtcG9zaXRpb25zLWZyb20taW5wdXQKKyAgICogCisgICAqIENoYW5uZWwgcG9zaXRpb25zIGZyb20gaW5wdXQ6IElmIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvICVUUlVFIHRoZSBjaGFubmVsCisgICAqIHBvc2l0aW9ucyB3aWxsIGJlIHRha2VuIGZyb20gdGhlIGlucHV0IGNhcHMgaWYgdmFsaWQgY2hhbm5lbCBwb3NpdGlvbnMgZm9yCisgICAqIHRoZSBvdXRwdXQgY2FuIGJlIGNvbnN0cnVjdGVkIGZyb20gdGhlbS4gSWYgdGhpcyBpcyBzZXQgdG8gJVRSVUUgc2V0dGluZyB0aGUKKyAgICogY2hhbm5lbC1wb3NpdGlvbnMgcHJvcGVydHkgb3ZlcndyaXRlcyB0aGlzIHByb3BlcnR5IGFnYWluLgorICAgKgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfQ0hBTk5FTF9QT1NJVElPTlNfRlJPTV9JTlBVVCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiY2hhbm5lbC1wb3NpdGlvbnMtZnJvbS1pbnB1dCIsCisgICAgICAgICAgIkNoYW5uZWwgcG9zaXRpb25zIGZyb20gaW5wdXQiLAorICAgICAgICAgICJUYWtlIGNoYW5uZWwgcG9zaXRpb25zIGZyb20gdGhlIGlucHV0IiwgVFJVRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5yZXF1ZXN0X25ld19wYWQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9pbnRlcmxlYXZlX3JlcXVlc3RfbmV3X3BhZCk7CisgIGdzdGVsZW1lbnRfY2xhc3MtPnJlbGVhc2VfcGFkID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfaW50ZXJsZWF2ZV9yZWxlYXNlX3BhZCk7CisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ludGVybGVhdmVfY2hhbmdlX3N0YXRlKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9pbnRlcmxlYXZlX2luaXQgKEdzdEludGVybGVhdmUgKiBzZWxmKQoreworICBzZWxmLT5zcmMgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNyY190ZW1wbGF0ZSwgInNyYyIpOworCisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChzZWxmLT5zcmMsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ludGVybGVhdmVfc3JjX3F1ZXJ5KSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChzZWxmLT5zcmMsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ludGVybGVhdmVfc3JjX2V2ZW50KSk7CisKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKHNlbGYpLCBzZWxmLT5zcmMpOworCisgIHNlbGYtPmNvbGxlY3QgPSBnc3RfY29sbGVjdF9wYWRzX25ldyAoKTsKKyAgZ3N0X2NvbGxlY3RfcGFkc19zZXRfZnVuY3Rpb24gKHNlbGYtPmNvbGxlY3QsCisgICAgICAoR3N0Q29sbGVjdFBhZHNGdW5jdGlvbikgZ3N0X2ludGVybGVhdmVfY29sbGVjdGVkLCBzZWxmKTsKKworICBzZWxmLT5pbnB1dF9jaGFubmVsX3Bvc2l0aW9ucyA9IGdfdmFsdWVfYXJyYXlfbmV3ICgwKTsKKyAgc2VsZi0+Y2hhbm5lbF9wb3NpdGlvbnNfZnJvbV9pbnB1dCA9IFRSVUU7CisgIHNlbGYtPmNoYW5uZWxfcG9zaXRpb25zID0gc2VsZi0+aW5wdXRfY2hhbm5lbF9wb3NpdGlvbnM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaW50ZXJsZWF2ZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0SW50ZXJsZWF2ZSAqc2VsZiA9IEdTVF9JTlRFUkxFQVZFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DSEFOTkVMX1BPU0lUSU9OUzoKKyAgICAgIGlmIChzZWxmLT5jaGFubmVsX3Bvc2l0aW9ucyAmJgorICAgICAgICAgIHNlbGYtPmNoYW5uZWxfcG9zaXRpb25zICE9IHNlbGYtPmlucHV0X2NoYW5uZWxfcG9zaXRpb25zKQorICAgICAgICBnX3ZhbHVlX2FycmF5X2ZyZWUgKHNlbGYtPmNoYW5uZWxfcG9zaXRpb25zKTsKKworICAgICAgc2VsZi0+Y2hhbm5lbF9wb3NpdGlvbnMgPSBnX3ZhbHVlX2R1cF9ib3hlZCAodmFsdWUpOworICAgICAgc2VsZi0+Y2hhbm5lbF9wb3NpdGlvbnNfZnJvbV9pbnB1dCA9IEZBTFNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NIQU5ORUxfUE9TSVRJT05TX0ZST01fSU5QVVQ6CisgICAgICBzZWxmLT5jaGFubmVsX3Bvc2l0aW9uc19mcm9tX2lucHV0ID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworCisgICAgICBpZiAoc2VsZi0+Y2hhbm5lbF9wb3NpdGlvbnNfZnJvbV9pbnB1dCkgeworICAgICAgICBpZiAoc2VsZi0+Y2hhbm5lbF9wb3NpdGlvbnMgJiYKKyAgICAgICAgICAgIHNlbGYtPmNoYW5uZWxfcG9zaXRpb25zICE9IHNlbGYtPmlucHV0X2NoYW5uZWxfcG9zaXRpb25zKQorICAgICAgICAgIGdfdmFsdWVfYXJyYXlfZnJlZSAoc2VsZi0+Y2hhbm5lbF9wb3NpdGlvbnMpOworICAgICAgICBzZWxmLT5jaGFubmVsX3Bvc2l0aW9ucyA9IHNlbGYtPmlucHV0X2NoYW5uZWxfcG9zaXRpb25zOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2ludGVybGVhdmVfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEludGVybGVhdmUgKnNlbGYgPSBHU1RfSU5URVJMRUFWRSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ0hBTk5FTF9QT1NJVElPTlM6CisgICAgICBnX3ZhbHVlX3NldF9ib3hlZCAodmFsdWUsIHNlbGYtPmNoYW5uZWxfcG9zaXRpb25zKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DSEFOTkVMX1BPU0lUSU9OU19GUk9NX0lOUFVUOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNlbGYtPmNoYW5uZWxfcG9zaXRpb25zX2Zyb21faW5wdXQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgR3N0UGFkICoKK2dzdF9pbnRlcmxlYXZlX3JlcXVlc3RfbmV3X3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsCisgICAgY29uc3QgZ2NoYXIgKiByZXFfbmFtZSwgY29uc3QgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdEludGVybGVhdmUgKnNlbGYgPSBHU1RfSU5URVJMRUFWRSAoZWxlbWVudCk7CisgIEdzdFBhZCAqbmV3X3BhZDsKKyAgZ2NoYXIgKnBhZF9uYW1lOworICBnaW50IGNoYW5uZWwsIHBhZG51bWJlcjsKKyAgR1ZhbHVlIHZhbCA9IHsgMCwgfTsKKworICBpZiAodGVtcGwtPmRpcmVjdGlvbiAhPSBHU1RfUEFEX1NJTkspCisgICAgZ290byBub3Rfc2lua19wYWQ7CisKKyAgcGFkbnVtYmVyID0gZ19hdG9taWNfaW50X2FkZCAoJnNlbGYtPnBhZGNvdW50ZXIsIDEpOworCisgIGNoYW5uZWwgPSBnX2F0b21pY19pbnRfYWRkICgmc2VsZi0+Y2hhbm5lbHMsIDEpOworICBpZiAoIXNlbGYtPmNoYW5uZWxfcG9zaXRpb25zX2Zyb21faW5wdXQpCisgICAgY2hhbm5lbCA9IHBhZG51bWJlcjsKKworICBwYWRfbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInNpbmtfJXUiLCBwYWRudW1iZXIpOworICBuZXdfcGFkID0gR1NUX1BBRF9DQVNUIChnX29iamVjdF9uZXcgKEdTVF9UWVBFX0lOVEVSTEVBVkVfUEFELAorICAgICAgICAgICJuYW1lIiwgcGFkX25hbWUsICJkaXJlY3Rpb24iLCB0ZW1wbC0+ZGlyZWN0aW9uLAorICAgICAgICAgICJ0ZW1wbGF0ZSIsIHRlbXBsLCBOVUxMKSk7CisgIEdTVF9JTlRFUkxFQVZFX1BBRF9DQVNUIChuZXdfcGFkKS0+Y2hhbm5lbCA9IGNoYW5uZWw7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJyZXF1ZXN0ZWQgbmV3IHBhZCAlcyIsIHBhZF9uYW1lKTsKKyAgZ19mcmVlIChwYWRfbmFtZSk7CisKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAobmV3X3BhZCk7CisKKyAgZ3N0X2NvbGxlY3RfcGFkc19hZGRfcGFkIChzZWxmLT5jb2xsZWN0LCBuZXdfcGFkLCBzaXplb2YgKEdzdENvbGxlY3REYXRhKSwKKyAgICAgIE5VTEwsIFRSVUUpOworCisgIGdzdF9jb2xsZWN0X3BhZHNfc2V0X2V2ZW50X2Z1bmN0aW9uIChzZWxmLT5jb2xsZWN0LAorICAgICAgKEdzdENvbGxlY3RQYWRzRXZlbnRGdW5jdGlvbikKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfaW50ZXJsZWF2ZV9zaW5rX2V2ZW50KSwgc2VsZik7CisKKyAgZ3N0X2NvbGxlY3RfcGFkc19zZXRfcXVlcnlfZnVuY3Rpb24gKHNlbGYtPmNvbGxlY3QsCisgICAgICAoR3N0Q29sbGVjdFBhZHNRdWVyeUZ1bmN0aW9uKQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9pbnRlcmxlYXZlX3NpbmtfcXVlcnkpLCBzZWxmKTsKKworICBpZiAoIWdzdF9lbGVtZW50X2FkZF9wYWQgKGVsZW1lbnQsIG5ld19wYWQpKQorICAgIGdvdG8gY291bGRfbm90X2FkZDsKKworICBnX3ZhbHVlX2luaXQgKCZ2YWwsIEdTVF9UWVBFX0FVRElPX0NIQU5ORUxfUE9TSVRJT04pOworICBnX3ZhbHVlX3NldF9lbnVtICgmdmFsLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FKTsKKyAgc2VsZi0+aW5wdXRfY2hhbm5lbF9wb3NpdGlvbnMgPQorICAgICAgZ192YWx1ZV9hcnJheV9hcHBlbmQgKHNlbGYtPmlucHV0X2NoYW5uZWxfcG9zaXRpb25zLCAmdmFsKTsKKyAgZ192YWx1ZV91bnNldCAoJnZhbCk7CisKKyAgLyogVXBkYXRlIHRoZSBzcmMgY2FwcyBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlbSAqLworICBpZiAoc2VsZi0+c2lua2NhcHMpIHsKKyAgICBHc3RDYXBzICpzcmNjYXBzOworICAgIEdzdFN0cnVjdHVyZSAqczsKKworICAgIC8qIFRha2UgbG9jayB0byBtYWtlIHN1cmUgcHJvY2Vzc2luZyBmaW5pc2hlcyBmaXJzdCAqLworICAgIEdTVF9PQkpFQ1RfTE9DSyAoc2VsZi0+Y29sbGVjdCk7CisKKyAgICBzcmNjYXBzID0gZ3N0X2NhcHNfY29weSAoc2VsZi0+c2lua2NhcHMpOworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChzcmNjYXBzLCAwKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBzZWxmLT5jaGFubmVscywgTlVMTCk7CisgICAgZ3N0X2ludGVybGVhdmVfc2V0X2NoYW5uZWxfcG9zaXRpb25zIChzZWxmLCBzKTsKKworICAgIGdzdF9pbnRlcmxlYXZlX3NlbmRfc3RyZWFtX3N0YXJ0IChzZWxmKTsKKyAgICBnc3RfcGFkX3NldF9jYXBzIChzZWxmLT5zcmMsIHNyY2NhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzZWxmLT5jb2xsZWN0KTsKKyAgfQorCisgIHJldHVybiBuZXdfcGFkOworCisgIC8qIGVycm9ycyAqLworbm90X3NpbmtfcGFkOgorICB7CisgICAgZ193YXJuaW5nICgiaW50ZXJsZWF2ZTogcmVxdWVzdGVkIG5ldyBwYWQgdGhhdCBpcyBub3QgYSBTSU5LIHBhZFxuIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2NvdWxkX25vdF9hZGQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiY291bGQgbm90IGFkZCBwYWQgJXMiLCBHU1RfUEFEX05BTUUgKG5ld19wYWQpKTsKKyAgICBnc3RfY29sbGVjdF9wYWRzX3JlbW92ZV9wYWQgKHNlbGYtPmNvbGxlY3QsIG5ld19wYWQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKG5ld19wYWQpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaW50ZXJsZWF2ZV9yZWxlYXNlX3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZCAqIHBhZCkKK3sKKyAgR3N0SW50ZXJsZWF2ZSAqc2VsZiA9IEdTVF9JTlRFUkxFQVZFIChlbGVtZW50KTsKKyAgR0xpc3QgKmw7CisgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHBvc2l0aW9uOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19JTlRFUkxFQVZFX1BBRCAocGFkKSk7CisKKyAgLyogVGFrZSBsb2NrIHRvIG1ha2Ugc3VyZSB3ZSdyZSBub3QgY2hhbmdpbmcgdGhpcyB3aGVuIHByb2Nlc3NpbmcgYnVmZmVycyAqLworICBHU1RfT0JKRUNUX0xPQ0sgKHNlbGYtPmNvbGxlY3QpOworCisgIGdfYXRvbWljX2ludF9hZGQgKCZzZWxmLT5jaGFubmVscywgLTEpOworCisgIGlmIChnc3RfcGFkX2hhc19jdXJyZW50X2NhcHMgKHBhZCkpCisgICAgZ19hdG9taWNfaW50X2FkZCAoJnNlbGYtPmNvbmZpZ3VyZWRfc2lua3BhZHNfY291bnRlciwgLTEpOworCisgIHBvc2l0aW9uID0gR1NUX0lOVEVSTEVBVkVfUEFEX0NBU1QgKHBhZCktPmNoYW5uZWw7CisgIGdfdmFsdWVfYXJyYXlfcmVtb3ZlIChzZWxmLT5pbnB1dF9jaGFubmVsX3Bvc2l0aW9ucywgcG9zaXRpb24pOworCisgIC8qIFVwZGF0ZSBjaGFubmVsIG51bWJlcnMgKi8KKyAgR1NUX09CSkVDVF9MT0NLIChzZWxmKTsKKyAgZm9yIChsID0gR1NUX0VMRU1FTlRfQ0FTVCAoc2VsZiktPnNpbmtwYWRzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KSB7CisgICAgR3N0SW50ZXJsZWF2ZVBhZCAqaXBhZCA9IEdTVF9JTlRFUkxFQVZFX1BBRCAobC0+ZGF0YSk7CisKKyAgICBpZiAoR1NUX0lOVEVSTEVBVkVfUEFEX0NBU1QgKHBhZCktPmNoYW5uZWwgPCBpcGFkLT5jaGFubmVsKQorICAgICAgaXBhZC0+Y2hhbm5lbC0tOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChzZWxmKTsKKworICAvKiBVcGRhdGUgdGhlIHNyYyBjYXBzIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGVtICovCisgIGlmIChzZWxmLT5zaW5rY2FwcykgeworICAgIGlmIChzZWxmLT5jaGFubmVscyA+IDApIHsKKyAgICAgIEdzdENhcHMgKnNyY2NhcHM7CisgICAgICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgICAgIHNyY2NhcHMgPSBnc3RfY2Fwc19jb3B5IChzZWxmLT5zaW5rY2Fwcyk7CisgICAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoc3JjY2FwcywgMCk7CisKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBzZWxmLT5jaGFubmVscywgTlVMTCk7CisgICAgICBnc3RfaW50ZXJsZWF2ZV9zZXRfY2hhbm5lbF9wb3NpdGlvbnMgKHNlbGYsIHMpOworCisgICAgICBnc3RfaW50ZXJsZWF2ZV9zZW5kX3N0cmVhbV9zdGFydCAoc2VsZik7CisgICAgICBnc3RfcGFkX3NldF9jYXBzIChzZWxmLT5zcmMsIHNyY2NhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworICAgIH0gZWxzZSB7CisgICAgICBnc3RfY2Fwc19yZXBsYWNlICgmc2VsZi0+c2lua2NhcHMsIE5VTEwpOworICAgIH0KKyAgfQorCisgIEdTVF9PQkpFQ1RfVU5MT0NLIChzZWxmLT5jb2xsZWN0KTsKKworICBnc3RfY29sbGVjdF9wYWRzX3JlbW92ZV9wYWQgKHNlbGYtPmNvbGxlY3QsIHBhZCk7CisgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKGVsZW1lbnQsIHBhZCk7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2ludGVybGVhdmVfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0SW50ZXJsZWF2ZSAqc2VsZjsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHNlbGYgPSBHU1RfSU5URVJMRUFWRSAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgc2VsZi0+dGltZXN0YW1wID0gMDsKKyAgICAgIHNlbGYtPm9mZnNldCA9IDA7CisgICAgICBnc3RfZXZlbnRfcmVwbGFjZSAoJnNlbGYtPnBlbmRpbmdfc2VnbWVudCwgTlVMTCk7CisgICAgICBzZWxmLT5zZW5kX3N0cmVhbV9zdGFydCA9IFRSVUU7CisgICAgICBnc3RfY29sbGVjdF9wYWRzX3N0YXJ0IChzZWxmLT5jb2xsZWN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUExBWUlORzoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIFN0b3AgYmVmb3JlIGNhbGxpbmcgdGhlIHBhcmVudCdzIHN0YXRlIGNoYW5nZSBmdW5jdGlvbiBhcworICAgKiBHc3RDb2xsZWN0UGFkcyBtaWdodCB0YWtlIGxvY2tzIGFuZCB3ZSB3b3VsZCBkZWFkbG9jayBpbiB0aGF0CisgICAqIGNhc2UKKyAgICovCisgIGlmICh0cmFuc2l0aW9uID09IEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZKQorICAgIGdzdF9jb2xsZWN0X3BhZHNfc3RvcCAoc2VsZi0+Y29sbGVjdCk7CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9jYXBzX3JlcGxhY2UgKCZzZWxmLT5zaW5rY2FwcywgTlVMTCk7CisgICAgICBnc3RfZXZlbnRfcmVwbGFjZSAoJnNlbGYtPnBlbmRpbmdfc2VnbWVudCwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitfX3JlbW92ZV9jaGFubmVscyAoR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgZ2ludCBpLCBzaXplOworCisgIHNpemUgPSBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSk7CisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJjaGFubmVsLW1hc2siKTsKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAocywgImNoYW5uZWxzIik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK19fc2V0X2NoYW5uZWxzIChHc3RDYXBzICogY2FwcywgZ2ludCBjaGFubmVscykKK3sKKyAgR3N0U3RydWN0dXJlICpzOworICBnaW50IGksIHNpemU7CisKKyAgc2l6ZSA9IGdzdF9jYXBzX2dldF9zaXplIChjYXBzKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCBpKTsKKyAgICBpZiAoY2hhbm5lbHMgPiAwKQorICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIGNoYW5uZWxzLCBOVUxMKTsKKyAgICBlbHNlCisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgImNoYW5uZWxzIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCBHX01BWElOVCwgTlVMTCk7CisgIH0KK30KKworLyogd2UgY2FuIG9ubHkgYWNjZXB0IGNhcHMgdGhhdCB3ZSBhbmQgZG93bnN0cmVhbSBjYW4gaGFuZGxlLiAqLworc3RhdGljIEdzdENhcHMgKgorZ3N0X2ludGVybGVhdmVfc2lua19nZXRjYXBzIChHc3RQYWQgKiBwYWQsIEdzdEludGVybGVhdmUgKiBzZWxmLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKnJlc3VsdCwgKnBlZXJjYXBzLCAqc2lua2NhcHM7CisKKyAgR1NUX09CSkVDVF9MT0NLIChzZWxmKTsKKworICAvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgY2FwcyBvbiBvbmUgb2YgdGhlIHNpbmsgcGFkcyByZXR1cm4gdGhlbSAqLworICBpZiAoc2VsZi0+c2lua2NhcHMpIHsKKyAgICByZXN1bHQgPSBnc3RfY2Fwc19jb3B5IChzZWxmLT5zaW5rY2Fwcyk7CisgIH0gZWxzZSB7CisgICAgLyogZ2V0IHRoZSBkb3duc3RyZWFtIHBvc3NpYmxlIGNhcHMgKi8KKyAgICBwZWVyY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChzZWxmLT5zcmMsIE5VTEwpOworCisgICAgLyogZ2V0IHRoZSBhbGxvd2VkIGNhcHMgb24gdGhpcyBzaW5rcGFkICovCisgICAgc2lua2NhcHMgPSBnc3RfY2Fwc19jb3B5IChnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAocGFkKSk7CisgICAgX19yZW1vdmVfY2hhbm5lbHMgKHNpbmtjYXBzKTsKKyAgICBpZiAocGVlcmNhcHMpIHsKKyAgICAgIHBlZXJjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAocGVlcmNhcHMpOworICAgICAgX19yZW1vdmVfY2hhbm5lbHMgKHBlZXJjYXBzKTsKKyAgICAgIC8qIGlmIHRoZSBwZWVyIGhhcyBjYXBzLCBpbnRlcnNlY3QgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgImludGVyc2VjdGluZyBwZWVyIGFuZCB0ZW1wbGF0ZSBjYXBzIik7CisgICAgICByZXN1bHQgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHBlZXJjYXBzLCBzaW5rY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAocGVlcmNhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKHNpbmtjYXBzKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogdGhlIHBlZXIgaGFzIG5vIGNhcHMgKG9yIHRoZXJlIGlzIG5vIHBlZXIpLCBqdXN0IHVzZSB0aGUgYWxsb3dlZCBjYXBzCisgICAgICAgKiBvZiB0aGlzIHNpbmtwYWQuICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJubyBwZWVyIGNhcHMsIHVzaW5nIHNpbmtjYXBzIik7CisgICAgICByZXN1bHQgPSBzaW5rY2FwczsKKyAgICB9CisgICAgX19zZXRfY2hhbm5lbHMgKHJlc3VsdCwgMSk7CisgIH0KKworICBHU1RfT0JKRUNUX1VOTE9DSyAoc2VsZik7CisKKyAgaWYgKGZpbHRlciAhPSBOVUxMKSB7CisgICAgR3N0Q2FwcyAqY2FwcyA9IHJlc3VsdDsKKworICAgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJpbnRlcnNlY3RpbmcgZmlsdGVyIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQgIiB3aXRoICIKKyAgICAgICAgInByZWxpbWluYXJ5IHJlc3VsdCAlIiBHU1RfUFRSX0ZPUk1BVCwgZmlsdGVyLCBjYXBzKTsKKworICAgIHJlc3VsdCA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIGNhcHMsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiUmV0dXJuaW5nIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIHJlc3VsdCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9pbnRlcmxlYXZlX3NldF9wcm9jZXNzX2Z1bmN0aW9uIChHc3RJbnRlcmxlYXZlICogc2VsZikKK3sKKyAgc3dpdGNoIChzZWxmLT53aWR0aCkgeworICAgIGNhc2UgODoKKyAgICAgIHNlbGYtPmZ1bmMgPSAoR3N0SW50ZXJsZWF2ZUZ1bmMpIGludGVybGVhdmVfODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6CisgICAgICBzZWxmLT5mdW5jID0gKEdzdEludGVybGVhdmVGdW5jKSBpbnRlcmxlYXZlXzE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDoKKyAgICAgIHNlbGYtPmZ1bmMgPSAoR3N0SW50ZXJsZWF2ZUZ1bmMpIGludGVybGVhdmVfMjQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDMyOgorICAgICAgc2VsZi0+ZnVuYyA9IChHc3RJbnRlcmxlYXZlRnVuYykgaW50ZXJsZWF2ZV8zMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjQ6CisgICAgICBzZWxmLT5mdW5jID0gKEdzdEludGVybGVhdmVGdW5jKSBpbnRlcmxlYXZlXzY0OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfaW50ZXJsZWF2ZV9zaW5rX3NldGNhcHMgKEdzdEludGVybGVhdmUgKiBzZWxmLCBHc3RQYWQgKiBwYWQsCisgICAgY29uc3QgR3N0Q2FwcyAqIGNhcHMsIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfSU5URVJMRUFWRV9QQUQgKHBhZCksIEZBTFNFKTsKKworICAvKiBUT0RPOiBoYW5kbGUgY2FwcyBjaGFuZ2VzICovCisgIGlmIChzZWxmLT5zaW5rY2FwcyAmJiAhZ3N0X2NhcHNfaXNfc3Vic2V0IChjYXBzLCBzZWxmLT5zaW5rY2FwcykpIHsKKyAgICBnb3RvIGNhbm5vdF9jaGFuZ2VfY2FwczsKKyAgfSBlbHNlIHsKKyAgICBHc3RDYXBzICpzcmNjYXBzOworICAgIEdzdFN0cnVjdHVyZSAqczsKKyAgICBnYm9vbGVhbiByZXM7CisKKyAgICBzZWxmLT53aWR0aCA9IEdTVF9BVURJT19JTkZPX1dJRFRIIChpbmZvKTsKKyAgICBzZWxmLT5yYXRlID0gR1NUX0FVRElPX0lORk9fUkFURSAoaW5mbyk7CisKKyAgICBnc3RfaW50ZXJsZWF2ZV9zZXRfcHJvY2Vzc19mdW5jdGlvbiAoc2VsZik7CisKKyAgICBzcmNjYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHNyY2NhcHMsIDApOworCisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJjaGFubmVsLW1hc2siKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBzZWxmLT5jaGFubmVscywgImxheW91dCIsCisgICAgICAgIEdfVFlQRV9TVFJJTkcsICJpbnRlcmxlYXZlZCIsIE5VTEwpOworICAgIGdzdF9pbnRlcmxlYXZlX3NldF9jaGFubmVsX3Bvc2l0aW9ucyAoc2VsZiwgcyk7CisKKyAgICBnc3RfaW50ZXJsZWF2ZV9zZW5kX3N0cmVhbV9zdGFydCAoc2VsZik7CisgICAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoc2VsZi0+c3JjLCBzcmNjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgICBpZiAoIXJlcykKKyAgICAgIGdvdG8gc3JjX2RpZF9ub3RfYWNjZXB0OworICB9CisKKyAgaWYgKCFzZWxmLT5zaW5rY2FwcykgeworICAgIEdzdENhcHMgKnNpbmtjYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgICAgR3N0U3RydWN0dXJlICpzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoc2lua2NhcHMsIDApOworCisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJjaGFubmVsLW1hc2siKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJzZXR0aW5nIHNpbmtjYXBzICUiIEdTVF9QVFJfRk9STUFULCBzaW5rY2Fwcyk7CisKKyAgICBnc3RfY2Fwc19yZXBsYWNlICgmc2VsZi0+c2lua2NhcHMsIHNpbmtjYXBzKTsKKworICAgIGdzdF9jYXBzX3VucmVmIChzaW5rY2Fwcyk7CisgIH0KKworICByZXR1cm4gVFJVRTsKKworY2Fubm90X2NoYW5nZV9jYXBzOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzZWxmLCAiY2FwcyBvZiAlIiBHU1RfUFRSX0ZPUk1BVCAiIGFscmVhZHkgc2V0LCBjYW4ndCAiCisgICAgICAgICJjaGFuZ2UiLCBzZWxmLT5zaW5rY2Fwcyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitzcmNfZGlkX25vdF9hY2NlcHQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNlbGYsICJzcmMgZGlkIG5vdCBhY2NlcHQgc2V0Y2FwcygpIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ludGVybGVhdmVfc2lua19ldmVudCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLCBHc3RDb2xsZWN0RGF0YSAqIGRhdGEsCisgICAgR3N0RXZlbnQgKiBldmVudCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RJbnRlcmxlYXZlICpzZWxmID0gR1NUX0lOVEVSTEVBVkUgKHVzZXJfZGF0YSk7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgR1NUX0RFQlVHICgiR290ICVzIGV2ZW50IG9uIHBhZCAlczolcyIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSwKKyAgICAgIEdTVF9ERUJVR19QQURfTkFNRSAoZGF0YS0+cGFkKSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc2VsZik7CisgICAgICBnc3RfZXZlbnRfcmVwbGFjZSAoJnNlbGYtPnBlbmRpbmdfc2VnbWVudCwgTlVMTCk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc2VsZik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgIHsKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc2VsZik7CisgICAgICBnc3RfZXZlbnRfcmVwbGFjZSAoJnNlbGYtPnBlbmRpbmdfc2VnbWVudCwgZXZlbnQpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNlbGYpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKyAgICAgIEdzdEF1ZGlvSW5mbyBpbmZvOworICAgICAgR1ZhbHVlICp2YWw7CisgICAgICBndWludCBjaGFubmVsOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfY2FwcyAoZXZlbnQsICZjYXBzKTsKKworICAgICAgaWYgKCFnc3RfYXVkaW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBjYXBzKSkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNlbGYsICJpbnZhbGlkIHNpbmsgY2FwcyIpOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgZXZlbnQgPSBOVUxMOworICAgICAgICByZXQgPSBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChzZWxmLT5jaGFubmVsX3Bvc2l0aW9uc19mcm9tX2lucHV0CisgICAgICAgICAgJiYgR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKCZpbmZvKSA9PSAxKSB7CisgICAgICAgIGNoYW5uZWwgPSBHU1RfSU5URVJMRUFWRV9QQURfQ0FTVCAoZGF0YS0+cGFkKS0+Y2hhbm5lbDsKKyAgICAgICAgdmFsID0gZ192YWx1ZV9hcnJheV9nZXRfbnRoIChzZWxmLT5pbnB1dF9jaGFubmVsX3Bvc2l0aW9ucywgY2hhbm5lbCk7CisgICAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbCwgR1NUX0FVRElPX0lORk9fUE9TSVRJT04gKCZpbmZvLCAwKSk7CisgICAgICB9CisKKyAgICAgIGlmICghZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChkYXRhLT5wYWQpKQorICAgICAgICBnX2F0b21pY19pbnRfYWRkICgmc2VsZi0+Y29uZmlndXJlZF9zaW5rcGFkc19jb3VudGVyLCAxKTsKKworICAgICAgLyogTGFzdCBjYXBzIHRoYXQgYXJlIHNldCBvbiBhIHNpbmsgcGFkIGFyZSB1c2VkIGFzIG91dHB1dCBjYXBzICovCisgICAgICBpZiAoZ19hdG9taWNfaW50X2dldCAoJnNlbGYtPmNvbmZpZ3VyZWRfc2lua3BhZHNfY291bnRlcikgPT0KKyAgICAgICAgICBzZWxmLT5jaGFubmVscykgeworICAgICAgICByZXQgPSBnc3RfaW50ZXJsZWF2ZV9zaW5rX3NldGNhcHMgKHNlbGYsIGRhdGEtPnBhZCwgY2FwcywgJmluZm8pOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgZXZlbnQgPSBOVUxMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX1RBRzoKKyAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKHNlbGYsICJGSVhNRTogbWVyZ2UgdGFncyBhbmQgc2VuZCBhZnRlciBzdHJlYW0tc3RhcnQiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIG5vdyBHc3RDb2xsZWN0UGFkcyBjYW4gdGFrZSBjYXJlIG9mIHRoZSByZXN0LCBlLmcuIEVPUyAqLworICBpZiAoZXZlbnQgIT0gTlVMTCkKKyAgICByZXR1cm4gZ3N0X2NvbGxlY3RfcGFkc19ldmVudF9kZWZhdWx0IChwYWRzLCBkYXRhLCBldmVudCwgRkFMU0UpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ludGVybGVhdmVfc2lua19xdWVyeSAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLAorICAgIEdzdENvbGxlY3REYXRhICogZGF0YSwgR3N0UXVlcnkgKiBxdWVyeSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RJbnRlcmxlYXZlICpzZWxmID0gR1NUX0lOVEVSTEVBVkUgKHVzZXJfZGF0YSk7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgR1NUX0RFQlVHICgiR290ICVzIHF1ZXJ5IG9uIHBhZCAlczolcyIsIEdTVF9RVUVSWV9UWVBFX05BTUUgKHF1ZXJ5KSwKKyAgICAgIEdTVF9ERUJVR19QQURfTkFNRSAoZGF0YS0+cGFkKSk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpmaWx0ZXIsICpjYXBzOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY2FwcyAocXVlcnksICZmaWx0ZXIpOworICAgICAgY2FwcyA9IGdzdF9pbnRlcmxlYXZlX3NpbmtfZ2V0Y2FwcyAoZGF0YS0+cGFkLCBzZWxmLCBmaWx0ZXIpOworICAgICAgZ3N0X3F1ZXJ5X3NldF9jYXBzX3Jlc3VsdCAocXVlcnksIGNhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gZ3N0X2NvbGxlY3RfcGFkc19xdWVyeV9kZWZhdWx0IChwYWRzLCBkYXRhLCBxdWVyeSwgRkFMU0UpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9pbnRlcmxlYXZlX3NyY19xdWVyeV9kdXJhdGlvbiAoR3N0SW50ZXJsZWF2ZSAqIHNlbGYsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIGdpbnQ2NCBtYXg7CisgIGdib29sZWFuIHJlczsKKyAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgR3N0SXRlcmF0b3IgKml0OworICBnYm9vbGVhbiBkb25lOworCisgIC8qIHBhcnNlIGZvcm1hdCAqLworICBnc3RfcXVlcnlfcGFyc2VfZHVyYXRpb24gKHF1ZXJ5LCAmZm9ybWF0LCBOVUxMKTsKKworICBtYXggPSAtMTsKKyAgcmVzID0gVFJVRTsKKyAgZG9uZSA9IEZBTFNFOworCisgIC8qIFRha2UgbWF4aW11bSBvZiBhbGwgZHVyYXRpb25zICovCisgIGl0ID0gZ3N0X2VsZW1lbnRfaXRlcmF0ZV9zaW5rX3BhZHMgKEdTVF9FTEVNRU5UX0NBU1QgKHNlbGYpKTsKKyAgd2hpbGUgKCFkb25lKSB7CisgICAgR3N0SXRlcmF0b3JSZXN1bHQgaXJlczsKKworICAgIEdWYWx1ZSBpdGVtID0geyAwLCB9OworCisgICAgaXJlcyA9IGdzdF9pdGVyYXRvcl9uZXh0IChpdCwgJml0ZW0pOworICAgIHN3aXRjaCAoaXJlcykgeworICAgICAgY2FzZSBHU1RfSVRFUkFUT1JfRE9ORToKKyAgICAgICAgZG9uZSA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfSVRFUkFUT1JfT0s6CisgICAgICB7CisgICAgICAgIEdzdFBhZCAqcGFkID0gR1NUX1BBRF9DQVNUIChnX3ZhbHVlX2R1cF9vYmplY3QgKCZpdGVtKSk7CisKKyAgICAgICAgZ2ludDY0IGR1cmF0aW9uOworCisgICAgICAgIC8qIGFzayBzaW5rIHBlZXIgZm9yIGR1cmF0aW9uICovCisgICAgICAgIHJlcyAmPSBnc3RfcGFkX3BlZXJfcXVlcnlfZHVyYXRpb24gKHBhZCwgZm9ybWF0LCAmZHVyYXRpb24pOworICAgICAgICAvKiB0YWtlIG1heCBmcm9tIGFsbCB2YWxpZCByZXR1cm4gdmFsdWVzICovCisgICAgICAgIGlmIChyZXMpIHsKKyAgICAgICAgICAvKiB2YWxpZCB1bmtub3duIGxlbmd0aCwgc3RvcCBzZWFyY2hpbmcgKi8KKyAgICAgICAgICBpZiAoZHVyYXRpb24gPT0gLTEpIHsKKyAgICAgICAgICAgIG1heCA9IGR1cmF0aW9uOworICAgICAgICAgICAgZG9uZSA9IFRSVUU7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIGVsc2Ugc2VlIGlmIGJpZ2dlciB0aGFuIGN1cnJlbnQgbWF4ICovCisgICAgICAgICAgZWxzZSBpZiAoZHVyYXRpb24gPiBtYXgpCisgICAgICAgICAgICBtYXggPSBkdXJhdGlvbjsKKyAgICAgICAgfQorICAgICAgICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmaXRlbSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBHU1RfSVRFUkFUT1JfUkVTWU5DOgorICAgICAgICBtYXggPSAtMTsKKyAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgICAgZ3N0X2l0ZXJhdG9yX3Jlc3luYyAoaXQpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgICBkb25lID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGdzdF9pdGVyYXRvcl9mcmVlIChpdCk7CisKKyAgaWYgKHJlcykgeworICAgIC8qIElmIGluIGJ5dGVzIGZvcm1hdCB3ZSBoYXZlIHRvIG11bHRpcGx5IHdpdGggdGhlIG51bWJlciBvZiBjaGFubmVscworICAgICAqIHRvIGdldCB0aGUgY29ycmVjdCByZXN1bHRzLiBBbGwgb3RoZXIgZm9ybWF0cyBzaG91bGQgYmUgZmluZSAqLworICAgIGlmIChmb3JtYXQgPT0gR1NUX0ZPUk1BVF9CWVRFUyAmJiBtYXggIT0gLTEpCisgICAgICBtYXggKj0gc2VsZi0+Y2hhbm5lbHM7CisKKyAgICAvKiBhbmQgc3RvcmUgdGhlIG1heCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJUb3RhbCBkdXJhdGlvbiBpbiBmb3JtYXQgJXM6ICUiCisgICAgICAgIEdTVF9USU1FX0ZPUk1BVCwgZ3N0X2Zvcm1hdF9nZXRfbmFtZSAoZm9ybWF0KSwgR1NUX1RJTUVfQVJHUyAobWF4KSk7CisgICAgZ3N0X3F1ZXJ5X3NldF9kdXJhdGlvbiAocXVlcnksIGZvcm1hdCwgbWF4KTsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ludGVybGVhdmVfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0SW50ZXJsZWF2ZSAqc2VsZiA9IEdTVF9JTlRFUkxFQVZFIChwYXJlbnQpOworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9QT1NJVElPTjoKKyAgICB7CisgICAgICBHc3RGb3JtYXQgZm9ybWF0OworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfcG9zaXRpb24gKHF1ZXJ5LCAmZm9ybWF0LCBOVUxMKTsKKworICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6CisgICAgICAgICAgLyogRklYTUUsIGJyaW5nIHRvIHN0cmVhbSB0aW1lLCBtaWdodCBiZSB0cmlja3kgKi8KKyAgICAgICAgICBnc3RfcXVlcnlfc2V0X3Bvc2l0aW9uIChxdWVyeSwgZm9ybWF0LCBzZWxmLT50aW1lc3RhbXApOworICAgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9CWVRFUzoKKyAgICAgICAgICBnc3RfcXVlcnlfc2V0X3Bvc2l0aW9uIChxdWVyeSwgZm9ybWF0LAorICAgICAgICAgICAgICBzZWxmLT5vZmZzZXQgKiBzZWxmLT5jaGFubmVscyAqIHNlbGYtPndpZHRoKTsKKyAgICAgICAgICByZXMgPSBUUlVFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfREVGQVVMVDoKKyAgICAgICAgICBnc3RfcXVlcnlfc2V0X3Bvc2l0aW9uIChxdWVyeSwgZm9ybWF0LCBzZWxmLT5vZmZzZXQpOworICAgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfRFVSQVRJT046CisgICAgICByZXMgPSBnc3RfaW50ZXJsZWF2ZV9zcmNfcXVlcnlfZHVyYXRpb24gKHNlbGYsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiBGSVhNRSwgbmVlZHMgYSBjdXN0b20gcXVlcnkgaGFuZGxlciBiZWNhdXNlIHdlIGhhdmUgbXVsdGlwbGUKKyAgICAgICAqIHNpbmtwYWRzICovCisgICAgICByZXMgPSBnc3RfcGFkX3F1ZXJ5X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZm9yd2FyZF9ldmVudF9mdW5jIChjb25zdCBHVmFsdWUgKiBpdGVtLCBHVmFsdWUgKiByZXQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFBhZCAqcGFkID0gR1NUX1BBRF9DQVNUIChnX3ZhbHVlX2R1cF9vYmplY3QgKGl0ZW0pKTsKKyAgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpOworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiQWJvdXQgdG8gc2VuZCBldmVudCAlcyIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisgIGlmICghZ3N0X3BhZF9wdXNoX2V2ZW50IChwYWQsIGV2ZW50KSkgeworICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHJldCwgRkFMU0UpOworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFkLCAiU2VuZGluZyBldmVudCAgJXAgKCVzKSBmYWlsZWQuIiwKKyAgICAgICAgZXZlbnQsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisgIH0gZWxzZSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgIlNlbnQgZXZlbnQgICVwICglcykuIiwKKyAgICAgICAgZXZlbnQsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisgIH0KKyAgZ3N0X29iamVjdF91bnJlZiAocGFkKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZm9yd2FyZF9ldmVudCAoR3N0SW50ZXJsZWF2ZSAqIHNlbGYsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdEl0ZXJhdG9yICppdDsKKyAgR1ZhbHVlIHZyZXQgPSB7IDAgfTsKKworICBHU1RfTE9HX09CSkVDVCAoc2VsZiwgIkZvcndhcmRpbmcgZXZlbnQgJXAgKCVzKSIsIGV2ZW50LAorICAgICAgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBnX3ZhbHVlX2luaXQgKCZ2cmV0LCBHX1RZUEVfQk9PTEVBTik7CisgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKCZ2cmV0LCBUUlVFKTsKKyAgaXQgPSBnc3RfZWxlbWVudF9pdGVyYXRlX3NpbmtfcGFkcyAoR1NUX0VMRU1FTlRfQ0FTVCAoc2VsZikpOworICBnc3RfaXRlcmF0b3JfZm9sZCAoaXQsIChHc3RJdGVyYXRvckZvbGRGdW5jdGlvbikgZm9yd2FyZF9ldmVudF9mdW5jLCAmdnJldCwKKyAgICAgIGV2ZW50KTsKKyAgZ3N0X2l0ZXJhdG9yX2ZyZWUgKGl0KTsKKyAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisKKyAgcmV0dXJuIGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKCZ2cmV0KTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9pbnRlcmxlYXZlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdEludGVybGVhdmUgKnNlbGYgPSBHU1RfSU5URVJMRUFWRSAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmVzdWx0OworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1FPUzoKKyAgICAgIC8qIFFvUyBtaWdodCBiZSB0cmlja3kgKi8KKyAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICB7CisgICAgICBHc3RTZWVrRmxhZ3MgZmxhZ3M7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgTlVMTCwgTlVMTCwgJmZsYWdzLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworICAgICAgLyogY2hlY2sgaWYgd2UgYXJlIGZsdXNoaW5nICovCisgICAgICBpZiAoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX0ZMVVNIKSB7CisgICAgICAgIC8qIG1ha2Ugc3VyZSB3ZSBhY2NlcHQgbm90aGluZyBhbnltb3JlIGFuZCByZXR1cm4gV1JPTkdfU1RBVEUgKi8KKyAgICAgICAgZ3N0X2NvbGxlY3RfcGFkc19zZXRfZmx1c2hpbmcgKHNlbGYtPmNvbGxlY3QsIFRSVUUpOworCisgICAgICAgIC8qIGZsdXNoaW5nIHNlZWssIHN0YXJ0IGZsdXNoIGRvd25zdHJlYW0sIHRoZSBmbHVzaCB3aWxsIGJlIGRvbmUKKyAgICAgICAgICogd2hlbiBhbGwgcGFkcyByZWNlaXZlZCBhIEZMVVNIX1NUT1AuICovCisgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc2VsZi0+c3JjLCBnc3RfZXZlbnRfbmV3X2ZsdXNoX3N0YXJ0ICgpKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCA9IGZvcndhcmRfZXZlbnQgKHNlbGYsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9OQVZJR0FUSU9OOgorICAgICAgLyogbmF2aWdhdGlvbiBpcyByYXRoZXIgcG9pbnRsZXNzLiAqLworICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyoganVzdCBmb3J3YXJkIHRoZSByZXN0IGZvciBub3cgKi8KKyAgICAgIHJlc3VsdCA9IGZvcndhcmRfZXZlbnQgKHNlbGYsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9pbnRlcmxlYXZlX2NvbGxlY3RlZCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLCBHc3RJbnRlcmxlYXZlICogc2VsZikKK3sKKyAgZ3VpbnQgc2l6ZTsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHU0xpc3QgKmNvbGxlY3RlZDsKKyAgZ3VpbnQgbnNhbXBsZXM7CisgIGd1aW50IG5jb2xsZWN0ZWQgPSAwOworICBnYm9vbGVhbiBlbXB0eSA9IFRSVUU7CisgIGdpbnQgd2lkdGggPSBzZWxmLT53aWR0aCAvIDg7CisgIEdzdE1hcEluZm8gd3JpdGVfaW5mbzsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCA9IC0xOworCisgIHNpemUgPSBnc3RfY29sbGVjdF9wYWRzX2F2YWlsYWJsZSAocGFkcyk7CisgIGlmIChzaXplID09IDApCisgICAgZ290byBlb3M7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNlbGYtPmZ1bmMgIT0gTlVMTCwgR1NUX0ZMT1dfTk9UX05FR09USUFURUQpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc2VsZi0+d2lkdGggPiAwLCBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZWxmLT5jaGFubmVscyA+IDAsIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNlbGYtPnJhdGUgPiAwLCBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRCk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNpemUgJSB3aWR0aCA9PSAwLCBHU1RfRkxPV19FUlJPUik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlN0YXJ0aW5nIHRvIGNvbGxlY3QgJXUgYnl0ZXMgZnJvbSAlZCBjaGFubmVscyIsIHNpemUsCisgICAgICBzZWxmLT5jaGFubmVscyk7CisKKyAgbnNhbXBsZXMgPSBzaXplIC8gd2lkdGg7CisKKyAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIHNpemUgKiBzZWxmLT5jaGFubmVscywgTlVMTCk7CisKKyAgaWYgKG91dGJ1ZiA9PSBOVUxMIHx8IGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZikgPCBzaXplICogc2VsZi0+Y2hhbm5lbHMpIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWYpOworICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgfQorCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZ3cml0ZV9pbmZvLCBHU1RfTUFQX1dSSVRFKTsKKyAgbWVtc2V0ICh3cml0ZV9pbmZvLmRhdGEsIDAsIHNpemUgKiBzZWxmLT5jaGFubmVscyk7CisKKyAgZm9yIChjb2xsZWN0ZWQgPSBwYWRzLT5kYXRhOyBjb2xsZWN0ZWQgIT0gTlVMTDsgY29sbGVjdGVkID0gY29sbGVjdGVkLT5uZXh0KSB7CisgICAgR3N0Q29sbGVjdERhdGEgKmNkYXRhOworICAgIEdzdEJ1ZmZlciAqaW5idWY7CisgICAgZ3VpbnQ4ICpvdXRkYXRhOworICAgIEdzdE1hcEluZm8gaW5wdXRfaW5mbzsKKyAgICBnaW50IGNoYW5uZWw7CisKKyAgICBjZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSBjb2xsZWN0ZWQtPmRhdGE7CisKKyAgICBpbmJ1ZiA9IGdzdF9jb2xsZWN0X3BhZHNfdGFrZV9idWZmZXIgKHBhZHMsIGNkYXRhLCBzaXplKTsKKyAgICBpZiAoaW5idWYgPT0gTlVMTCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoY2RhdGEtPnBhZCwgIk5vIGJ1ZmZlciBhdmFpbGFibGUiKTsKKyAgICAgIGdvdG8gbmV4dDsKKyAgICB9CisgICAgbmNvbGxlY3RlZCsrOworCisgICAgaWYgKHRpbWVzdGFtcCA9PSAtMSkKKyAgICAgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1Zik7CisKKyAgICBpZiAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoaW5idWYsIEdTVF9CVUZGRVJfRkxBR19HQVApKQorICAgICAgZ290byBuZXh0OworCisgICAgZW1wdHkgPSBGQUxTRTsKKyAgICBjaGFubmVsID0gR1NUX0lOVEVSTEVBVkVfUEFEX0NBU1QgKGNkYXRhLT5wYWQpLT5jaGFubmVsOworICAgIGlmIChzZWxmLT5jaGFubmVscyA8PSA2NCAmJiBzZWxmLT5jaGFubmVsX21hc2spIHsKKyAgICAgIGNoYW5uZWwgPSBzZWxmLT5kZWZhdWx0X2NoYW5uZWxzX29yZGVyaW5nX21hcFtjaGFubmVsXTsKKyAgICB9CisgICAgb3V0ZGF0YSA9IHdyaXRlX2luZm8uZGF0YSArIHdpZHRoICogY2hhbm5lbDsKKworICAgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZiwgJmlucHV0X2luZm8sIEdTVF9NQVBfUkVBRCk7CisgICAgc2VsZi0+ZnVuYyAob3V0ZGF0YSwgaW5wdXRfaW5mby5kYXRhLCBzZWxmLT5jaGFubmVscywgbnNhbXBsZXMpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmLCAmaW5wdXRfaW5mbyk7CisKKyAgbmV4dDoKKyAgICBpZiAoaW5idWYpCisgICAgICBnc3RfYnVmZmVyX3VucmVmIChpbmJ1Zik7CisgIH0KKworICBpZiAobmNvbGxlY3RlZCA9PSAwKSB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmd3JpdGVfaW5mbyk7CisgICAgZ290byBlb3M7CisgIH0KKworICBHU1RfT0JKRUNUX0xPQ0sgKHNlbGYpOworICBpZiAoc2VsZi0+cGVuZGluZ19zZWdtZW50KSB7CisgICAgR3N0RXZlbnQgKmV2ZW50OworICAgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICAgIGV2ZW50ID0gc2VsZi0+cGVuZGluZ19zZWdtZW50OworICAgIHNlbGYtPnBlbmRpbmdfc2VnbWVudCA9IE5VTEw7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNlbGYpOworCisgICAgLyogY29udmVydCB0aGUgaW5wdXQgc2VnbWVudCB0byB0aW1lIG5vdyAqLworICAgIGdzdF9ldmVudF9jb3B5X3NlZ21lbnQgKGV2ZW50LCAmc2VnbWVudCk7CisKKyAgICBpZiAoc2VnbWVudC5mb3JtYXQgIT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKworICAgICAgLyogbm90IHRpbWUsIGNvbnZlcnQgKi8KKyAgICAgIHN3aXRjaCAoc2VnbWVudC5mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0JZVEVTOgorICAgICAgICAgIHNlZ21lbnQuc3RhcnQgKj0gd2lkdGg7CisgICAgICAgICAgaWYgKHNlZ21lbnQuc3RvcCAhPSAtMSkKKyAgICAgICAgICAgIHNlZ21lbnQuc3RvcCAqPSB3aWR0aDsKKyAgICAgICAgICBpZiAoc2VnbWVudC5wb3NpdGlvbiAhPSAtMSkKKyAgICAgICAgICAgIHNlZ21lbnQucG9zaXRpb24gKj0gd2lkdGg7CisgICAgICAgICAgLyogZmFsbHRocm91Z2ggZm9yIHRoZSBzYW1wbGVzIGNhc2UgKi8KKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0RFRkFVTFQ6CisgICAgICAgICAgc2VnbWVudC5zdGFydCA9CisgICAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHNlZ21lbnQuc3RhcnQsIEdTVF9TRUNPTkQsIHNlbGYtPnJhdGUpOworICAgICAgICAgIGlmIChzZWdtZW50LnN0b3AgIT0gLTEpCisgICAgICAgICAgICBzZWdtZW50LnN0b3AgPQorICAgICAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHNlZ21lbnQuc3RvcCwgR1NUX1NFQ09ORCwKKyAgICAgICAgICAgICAgICBzZWxmLT5yYXRlKTsKKyAgICAgICAgICBpZiAoc2VnbWVudC5wb3NpdGlvbiAhPSAtMSkKKyAgICAgICAgICAgIHNlZ21lbnQucG9zaXRpb24gPQorICAgICAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHNlZ21lbnQucG9zaXRpb24sIEdTVF9TRUNPTkQsCisgICAgICAgICAgICAgICAgc2VsZi0+cmF0ZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgR1NUX1dBUk5JTkcgKCJjYW4ndCBjb252ZXJ0IHNlZ21lbnQgdmFsdWVzIik7CisgICAgICAgICAgc2VnbWVudC5zdGFydCA9IDA7CisgICAgICAgICAgc2VnbWVudC5zdG9wID0gLTE7CisgICAgICAgICAgc2VnbWVudC5wb3NpdGlvbiA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpOworICAgIH0KKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNyYywgZXZlbnQpOworCisgICAgR1NUX09CSkVDVF9MT0NLIChzZWxmKTsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoc2VsZik7CisKKyAgaWYgKHRpbWVzdGFtcCAhPSAtMSkgeworICAgIHNlbGYtPm9mZnNldCA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHRpbWVzdGFtcCwgc2VsZi0+cmF0ZSwKKyAgICAgICAgR1NUX1NFQ09ORCk7CisgICAgc2VsZi0+dGltZXN0YW1wID0gdGltZXN0YW1wOworICB9CisKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgPSBzZWxmLT50aW1lc3RhbXA7CisgIEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpID0gc2VsZi0+b2Zmc2V0OworCisgIHNlbGYtPm9mZnNldCArPSBuc2FtcGxlczsKKyAgc2VsZi0+dGltZXN0YW1wID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoc2VsZi0+b2Zmc2V0LAorICAgICAgR1NUX1NFQ09ORCwgc2VsZi0+cmF0ZSk7CisKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9CisgICAgICBzZWxmLT50aW1lc3RhbXAgLSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKTsKKworICBpZiAoZW1wdHkpCisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfR0FQKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWYsICZ3cml0ZV9pbmZvKTsKKworICBHU1RfTE9HX09CSkVDVCAoc2VsZiwgInB1c2hpbmcgb3V0YnVmLCB0aW1lc3RhbXAgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikpKTsKKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChzZWxmLT5zcmMsIG91dGJ1Zik7CisKKyAgcmV0dXJuIHJldDsKKworZW9zOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIm5vIGRhdGEgYXZhaWxhYmxlLCBtdXN0IGJlIEVPUyIpOworICAgIGlmIChvdXRidWYpCisgICAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWYpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc2VsZi0+c3JjLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VPUzsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5oIGIvZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZWJlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmgKQEAgLTAsMCArMSw5MCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICAgICAgIDIwMDAgV2ltIFRheW1hbnMgPHd0YXlAY2hlbGxvLmJlPgorICogICAgICAgICAgICAgICAgICAgIDIwMDUgV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAyMDA3IEFuZHkgV2luZ28gPHdpbmdvIGF0IHBvYm94LmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAyMDA4IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBpbnRlcmxlYXZlLmM6IGludGVybGVhdmUgc2FtcGxlcywgbW9zdGx5IGJhc2VkIG9uIGFkZGVyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0lOVEVSTEVBVkVfSF9fCisjZGVmaW5lIF9fSU5URVJMRUFWRV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3Rjb2xsZWN0cGFkcy5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfSU5URVJMRUFWRSAgICAgICAgICAgIChnc3RfaW50ZXJsZWF2ZV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfSU5URVJMRUFWRShvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0lOVEVSTEVBVkUsR3N0SW50ZXJsZWF2ZSkpCisjZGVmaW5lIEdTVF9JTlRFUkxFQVZFX0NMQVNTKGtsYXNzKSAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9JTlRFUkxFQVZFLEdzdEludGVybGVhdmVDbGFzcykpCisjZGVmaW5lIEdTVF9JTlRFUkxFQVZFX0dFVF9DTEFTUyhvYmopIFwKKyAgICAgICAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLEdTVF9UWVBFX0lOVEVSTEVBVkUsR3N0SW50ZXJsZWF2ZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0lOVEVSTEVBVkUob2JqKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9JTlRFUkxFQVZFKSkKKyNkZWZpbmUgR1NUX0lTX0lOVEVSTEVBVkVfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0lOVEVSTEVBVkUpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0SW50ZXJsZWF2ZSBHc3RJbnRlcmxlYXZlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEludGVybGVhdmVDbGFzcyBHc3RJbnRlcmxlYXZlQ2xhc3M7CisKK3R5cGVkZWYgdm9pZCAoKkdzdEludGVybGVhdmVGdW5jKSAoZ3BvaW50ZXIgb3V0LCBncG9pbnRlciBpbiwgZ3VpbnQgc3RyaWRlLCBndWludCBuZnJhbWVzKTsKKworc3RydWN0IF9Hc3RJbnRlcmxlYXZlCit7CisgIEdzdEVsZW1lbnQgZWxlbWVudDsKKworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgR3N0Q29sbGVjdFBhZHMgKmNvbGxlY3Q7CisKKyAgZ2ludCBjaGFubmVsczsKKyAgZ2ludCBwYWRjb3VudGVyOworICBnaW50IHJhdGU7CisgIGdpbnQgd2lkdGg7CisKKyAgR1ZhbHVlQXJyYXkgKmNoYW5uZWxfcG9zaXRpb25zOworICBHVmFsdWVBcnJheSAqaW5wdXRfY2hhbm5lbF9wb3NpdGlvbnM7CisgIGdib29sZWFuIGNoYW5uZWxfcG9zaXRpb25zX2Zyb21faW5wdXQ7CisKKyAgZ2ludCBkZWZhdWx0X2NoYW5uZWxzX29yZGVyaW5nX21hcFs2NF07CisgIGd1aW50NjQgY2hhbm5lbF9tYXNrOworCisgIEdzdENhcHMgKnNpbmtjYXBzOworICBnaW50IGNvbmZpZ3VyZWRfc2lua3BhZHNfY291bnRlcjsKKworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworICBndWludDY0IG9mZnNldDsKKworICBHc3RFdmVudCAqcGVuZGluZ19zZWdtZW50OworCisgIEdzdEludGVybGVhdmVGdW5jIGZ1bmM7CisKKyAgR3N0UGFkICpzcmM7CisKKyAgZ2Jvb2xlYW4gc2VuZF9zdHJlYW1fc3RhcnQ7Cit9OworCitzdHJ1Y3QgX0dzdEludGVybGVhdmVDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2ludGVybGVhdmVfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19JTlRFUkxFQVZFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2ludGVybGVhdmUvbWVzb24uYnVpbGQgYi9nc3QvaW50ZXJsZWF2ZS9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjhiMzZhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2ludGVybGVhdmUvbWVzb24uYnVpbGQKQEAgLTAsMCArMSw4IEBACitnc3RpbnRlcmxlYXZlID0gbGlicmFyeSgnZ3N0aW50ZXJsZWF2ZScsCisgICdwbHVnaW4uYycsICdpbnRlcmxlYXZlLmMnLCAnZGVpbnRlcmxlYXZlLmMnLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdGJhc2VfZGVwLCBnc3RhdWRpb19kZXBdLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L2ludGVybGVhdmUvcGx1Z2luLmMgYi9nc3QvaW50ZXJsZWF2ZS9wbHVnaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWI3MjkwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2ludGVybGVhdmUvcGx1Z2luLmMKQEAgLTAsMCArMSw0MyBAQAorLyogR1N0cmVhbWVyIGludGVybGVhdmUgcGx1Z2luCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsMjAwNyBBbmR5IFdpbmdvIDx3aW5nbyBhdCBwb2JveC5jb20+CisgKgorICogcGx1Z2luLmM6IHRoZSBzdHVicyBmb3IgdGhlIGludGVybGVhdmUgcGx1Z2luCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAicGx1Z2luLmgiCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiaW50ZXJsZWF2ZSIsCisgICAgICAgICAgR1NUX1JBTktfTk9ORSwgZ3N0X2ludGVybGVhdmVfZ2V0X3R5cGUgKCkpIHx8CisgICAgICAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImRlaW50ZXJsZWF2ZSIsCisgICAgICAgICAgR1NUX1JBTktfTk9ORSwgZ3N0X2RlaW50ZXJsZWF2ZV9nZXRfdHlwZSAoKSkpCisgICAgcmV0dXJuIEZBTFNFOworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGludGVybGVhdmUsCisgICAgIkF1ZGlvIGludGVybGVhdmVyL2RlaW50ZXJsZWF2ZXIiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9nc3QvaW50ZXJsZWF2ZS9wbHVnaW4uaCBiL2dzdC9pbnRlcmxlYXZlL3BsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NTY4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaW50ZXJsZWF2ZS9wbHVnaW4uaApAQCAtMCwwICsxLDMxIEBACisvKiBHU3RyZWFtZXIgaW50ZXJsZWF2ZSBwbHVnaW4KKyAqIENvcHlyaWdodCAoQykgMjAwNCwyMDA3IEFuZHkgV2luZ28gPHdpbmdvIGF0IHBvYm94LmNvbT4KKyAqCisgKiBwbHVnaW4uaDogdGhlIHN0dWJzIGZvciB0aGUgaW50ZXJsZWF2ZSBwbHVnaW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfUExVR0lOX0lOVEVSTEVBVkVfSF9fCisjZGVmaW5lIF9fR1NUX1BMVUdJTl9JTlRFUkxFQVZFX0hfXworCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSAiaW50ZXJsZWF2ZS5oIgorI2luY2x1ZGUgImRlaW50ZXJsZWF2ZS5oIgorCisjZW5kaWYgLyogX19HU1RfUExVR0lOX0lOVEVSTEVBVkVfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L0dzdFFUTXV4LnBycyBiL2dzdC9pc29tcDQvR3N0UVRNdXgucHJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMWU2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L0dzdFFUTXV4LnBycwpAQCAtMCwwICsxLDYgQEAKK1tfcHJlc2V0c19dCit2ZXJzaW9uPTEuNi4wCitlbGVtZW50LW5hbWU9R3N0UVRNdXgKKworW1Byb2ZpbGUgWW91VHViZV0KK2Zhc3RzdGFydD10cnVlCmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L0xFR0FMIGIvZ3N0L2lzb21wNC9MRUdBTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWY2ZThmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9MRUdBTApAQCAtMCwwICsxLDEwIEBACitUaGlzIGlzIGEgZGVtdXhlciBzdXBwb3J0aW5nIGEgc3Vic2V0IG9mIHRoZSBRdWlja3RpbWUgdmlkZW8gY29udGFpbmVyCitmb3JtYXQgZGV2ZWxvcGVkIGJ5IEFwcGxlLiBBcHBsZSBhbmQgb3RoZXJzIGhhdmUgc29tZSBwYXRlbnRzIG9uCitzb21lIGZlYXR1cmVzIG9mIHRoZSBRdWlja3RpbWUgY29udGFpbmVyIGZvcm1hdCBpbiByZWdhcmRzIHRvIHRlY2hub2xvZ2llcworc3VjaCBhcyBRdWlja3RpbWVWUiBhbmQgUlRQIGhpbnRpbmcuIER1ZSB0byB0aGF0IGJlIGF3YXJlIHRoYXQgaWYgZXZlcgorc3VjaCBmZWF0dXJlcyBhcmUgYWRkZWQgdG8gdGhpcyBkZW11eGVyIGl0IHdvdWxkIG5lZWQgdG8gYmUgbW92ZWQgdG8gdGhlCistdWdseSBtb2R1bGUgb3IgdGhvc2UgZmVhdHVyZXMgbmVlZCB0byBjb21lIGFzIGFkZC1pbiBmdW5jdGlvbmFsaXR5IHN0b3JlZCBpbiAKK2Fub3RoZXIgbW9kdWxlLgorCitBcyB0aGUgcGx1Z2luIGlzIGFzIG9mIHRvZGF5J3MgZGF0ZSAoMTl0aCBvZiBKdW5lIDIwMDcpIGl0IGRvZXMgbm90IAordmlvbGF0ZSBhbnkgc29mdHdhcmUgcGF0ZW50cyB3ZSBrbm93IG9mLgpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9NYWtlZmlsZS5hbSBiL2dzdC9pc29tcDQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc2Y2I0MgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NSBAQAorCitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3Rpc29tcDQubGEKKworbGliZ3N0aXNvbXA0X2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpCitsaWJnc3Rpc29tcDRfbGFfTElCQUREID0gXAorICAgICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSBcCisgICAgLWxnc3RyaWZmLUBHU1RfQVBJX1ZFUlNJT05AIFwKKyAgICAtbGdzdGF1ZGlvLUBHU1RfQVBJX1ZFUlNJT05AIFwKKyAgICAtbGdzdHZpZGVvLUBHU1RfQVBJX1ZFUlNJT05AIFwKKyAgICAtbGdzdHJ0cC1AR1NUX0FQSV9WRVJTSU9OQCBcCisgICAgLWxnc3R0YWctQEdTVF9BUElfVkVSU0lPTkAgXAorICAgIC1sZ3N0cGJ1dGlscy1AR1NUX0FQSV9WRVJTSU9OQCBcCisgICAgJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKFpMSUJfTElCUykKK2xpYmdzdGlzb21wNF9sYV9MREZMQUdTID0gJHtHU1RfUExVR0lOX0xERkxBR1N9CitsaWJnc3Rpc29tcDRfbGFfU09VUkNFUyA9IGlzb21wNC1wbHVnaW4uYyBnc3RydHB4cXRkZXBheS5jIFwKKwlxdGRlbXV4LmMgcXRkZW11eF90eXBlcy5jIHF0ZGVtdXhfZHVtcC5jIHF0ZGVtdXhfbGFuZy5jIFwKKwlnc3RxdG11eC5jIGdzdHF0bW9vdnJlY292ZXIuYyBhdG9tcy5jIGF0b21zcmVjb3ZlcnkuYyBkZXNjcmlwdG9ycy5jIFwKKwlwcm9wZXJ0aWVzLmMgZ3N0cXRtdXhtYXAuYyBnc3Rpc29mZi5jCisKK3ByZXNldGRpciA9ICQoZGF0YWRpcikvZ3N0cmVhbWVyLSQoR1NUX0FQSV9WRVJTSU9OKS9wcmVzZXRzCitwcmVzZXRfREFUQSA9IEdzdFFUTXV4LnBycworCitub2luc3RfSEVBREVSUyA9IFwKKwlxdGF0b21wYXJzZXIuaCAgIFwKKwlxdGRlbXV4LmggICAgICAgIFwKKwlxdGRlbXV4X3R5cGVzLmggIFwKKwlxdGRlbXV4X2RlYnVnLmggIFwKKwlxdGRlbXV4X2R1bXAuaCAgIFwKKwlxdGRlbXV4X2xhbmcuaCAgIFwKKwlxdHBhbGV0dGUuaCAgICAgIFwKKwlnc3RydHB4cXRkZXBheS5oIFwKKwlnc3RxdG11eC5oICAgICAgIFwKKwlnc3RxdG1vb3ZyZWNvdmVyLmggXAorCWF0b21zLmggICAgICAgICAgXAorCWF0b21zcmVjb3ZlcnkuaCAgXAorCWRlc2NyaXB0b3JzLmggICAgXAorCXByb3BlcnRpZXMuaCAgICAgXAorCWZvdXJjYy5oICAgICAgICAgXAorCWdzdGlzb2ZmLmggICAgICAgXAorCWdzdHF0bXV4bWFwLmgKKworRVhUUkFfRElTVCA9IFwKKwlnc3RxdG11eC1kb2MuYyBcCisJZ3N0cXRtdXgtZG9jLmggXAorCSQocHJlc2V0X0RBVEEpCmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L2F0b21zLmMgYi9nc3QvaXNvbXA0L2F0b21zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhNjkyNwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvYXRvbXMuYwpAQCAtMCwwICsxLDU1OTUgQEAKKy8qIFF1aWNrdGltZSBtdXhlciBwbHVnaW4gZm9yIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnI+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKgorICogVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIFNvdXJjZSBDb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlLgorICogU2VlIGZ1cnRoZXIgZXhwbGFuYXRpb24gYXR0YWNoZWQgaW4gTGljZW5zZSBTdGF0ZW1lbnQgKGRpc3RyaWJ1dGVkIGluIHRoZSBmaWxlCisgKiBMSUNFTlNFKS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImF0b21zLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJ5dGV3cml0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisvKgorICogQ3JlYXRlcyBhIG5ldyBBdG9tc0NvbnRleHQgZm9yIHRoZSBnaXZlbiBmbGF2b3IuCisgKi8KK0F0b21zQ29udGV4dCAqCithdG9tc19jb250ZXh0X25ldyAoQXRvbXNUcmVlRmxhdm9yIGZsYXZvcikKK3sKKyAgQXRvbXNDb250ZXh0ICpjb250ZXh0ID0gZ19uZXcwIChBdG9tc0NvbnRleHQsIDEpOworICBjb250ZXh0LT5mbGF2b3IgPSBmbGF2b3I7CisgIHJldHVybiBjb250ZXh0OworfQorCisvKgorICogRnJlZXMgYW4gQXRvbXNDb250ZXh0IGFuZCBhbGwgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBpdAorICovCit2b2lkCithdG9tc19jb250ZXh0X2ZyZWUgKEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIGdfZnJlZSAoY29udGV4dCk7Cit9CisKKy8qIC0tIGNyZWF0aW9uLCBpbml0aWFsaXphdGlvbiwgY2xlYXIgYW5kIGZyZWUgZnVuY3Rpb25zIC0tICovCisKKyNkZWZpbmUgU0VDU19QRVJfREFZICgyNCAqIDYwICogNjApCisjZGVmaW5lIExFQVBfWUVBUlNfRlJPTV8xOTA0X1RPXzE5NzAgMTcKKworZ3VpbnQ2NAorYXRvbXNfZ2V0X2N1cnJlbnRfcXRfdGltZSAodm9pZCkKK3sKKyAgR1RpbWVWYWwgdGltZXZhbDsKKworICBnX2dldF9jdXJyZW50X3RpbWUgKCZ0aW1ldmFsKTsKKyAgLyogRklYTUUgdGhpcyBzaG91bGQgdXNlIFVUQyBjb29yZGluYXRlZCB0aW1lICovCisgIHJldHVybiB0aW1ldmFsLnR2X3NlYyArICgoKDE5NzAgLSAxOTA0KSAqIChndWludDY0KSAzNjUpICsKKyAgICAgIExFQVBfWUVBUlNfRlJPTV8xOTA0X1RPXzE5NzApICogU0VDU19QRVJfREFZOworfQorCitzdGF0aWMgdm9pZAorY29tbW9uX3RpbWVfaW5mb19pbml0IChUaW1lSW5mbyAqIHRpKQoreworICB0aS0+Y3JlYXRpb25fdGltZSA9IHRpLT5tb2RpZmljYXRpb25fdGltZSA9IGF0b21zX2dldF9jdXJyZW50X3F0X3RpbWUgKCk7CisgIHRpLT50aW1lc2NhbGUgPSAwOworICB0aS0+ZHVyYXRpb24gPSAwOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9oZWFkZXJfc2V0IChBdG9tICogaGVhZGVyLCBndWludDMyIGZvdXJjYywgZ2ludDMyIHNpemUsIGdpbnQ2NCBleHRfc2l6ZSkKK3sKKyAgaGVhZGVyLT50eXBlID0gZm91cmNjOworICBoZWFkZXItPnNpemUgPSBzaXplOworICBoZWFkZXItPmV4dGVuZGVkX3NpemUgPSBleHRfc2l6ZTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fY2xlYXIgKEF0b20gKiBhdG9tKQoreworfQorCitzdGF0aWMgdm9pZAorYXRvbV9mdWxsX2luaXQgKEF0b21GdWxsICogZnVsbCwgZ3VpbnQzMiBmb3VyY2MsIGdpbnQzMiBzaXplLCBnaW50NjQgZXh0X3NpemUsCisgICAgZ3VpbnQ4IHZlcnNpb24sIGd1aW50OCBmbGFnc1szXSkKK3sKKyAgYXRvbV9oZWFkZXJfc2V0ICgmKGZ1bGwtPmhlYWRlciksIGZvdXJjYywgc2l6ZSwgZXh0X3NpemUpOworICBmdWxsLT52ZXJzaW9uID0gdmVyc2lvbjsKKyAgZnVsbC0+ZmxhZ3NbMF0gPSBmbGFnc1swXTsKKyAgZnVsbC0+ZmxhZ3NbMV0gPSBmbGFnc1sxXTsKKyAgZnVsbC0+ZmxhZ3NbMl0gPSBmbGFnc1syXTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fZnVsbF9jbGVhciAoQXRvbUZ1bGwgKiBmdWxsKQoreworICBhdG9tX2NsZWFyICgmZnVsbC0+aGVhZGVyKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fZnVsbF9mcmVlIChBdG9tRnVsbCAqIGZ1bGwpCit7CisgIGF0b21fZnVsbF9jbGVhciAoZnVsbCk7CisgIGdfZnJlZSAoZnVsbCk7Cit9CisKK3N0YXRpYyBndWludDMyCithdG9tX2Z1bGxfZ2V0X2ZsYWdzX2FzX3VpbnQgKEF0b21GdWxsICogZnVsbCkKK3sKKyAgcmV0dXJuIGZ1bGwtPmZsYWdzWzBdIDw8IDE2IHwgZnVsbC0+ZmxhZ3NbMV0gPDwgOCB8IGZ1bGwtPmZsYWdzWzJdOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9mdWxsX3NldF9mbGFnc19hc191aW50IChBdG9tRnVsbCAqIGZ1bGwsIGd1aW50MzIgZmxhZ3NfYXNfdWludCkKK3sKKyAgZnVsbC0+ZmxhZ3NbMl0gPSBmbGFnc19hc191aW50ICYgMHhGRjsKKyAgZnVsbC0+ZmxhZ3NbMV0gPSAoZmxhZ3NfYXNfdWludCAmIDB4RkYwMCkgPj4gODsKKyAgZnVsbC0+ZmxhZ3NbMF0gPSAoZmxhZ3NfYXNfdWludCAmIDB4RkYwMDAwKSA+PiAxNjsKK30KKworc3RhdGljIEF0b21JbmZvICoKK2J1aWxkX2F0b21faW5mb193cmFwcGVyIChBdG9tICogYXRvbSwgZ3BvaW50ZXIgY29weV9mdW5jLCBncG9pbnRlciBmcmVlX2Z1bmMpCit7CisgIEF0b21JbmZvICppbmZvID0gTlVMTDsKKworICBpZiAoYXRvbSkgeworICAgIGluZm8gPSBnX25ldzAgKEF0b21JbmZvLCAxKTsKKworICAgIGluZm8tPmF0b20gPSBhdG9tOworICAgIGluZm8tPmNvcHlfZGF0YV9mdW5jID0gY29weV9mdW5jOworICAgIGluZm8tPmZyZWVfZnVuYyA9IGZyZWVfZnVuYzsKKyAgfQorCisgIHJldHVybiBpbmZvOworfQorCitzdGF0aWMgR0xpc3QgKgorYXRvbV9pbmZvX2xpc3RfcHJlcGVuZF9hdG9tIChHTGlzdCAqIGFpLCBBdG9tICogYXRvbSwKKyAgICBBdG9tQ29weURhdGFGdW5jIGNvcHlfZnVuYywgQXRvbUZyZWVGdW5jIGZyZWVfZnVuYykKK3sKKyAgaWYgKGF0b20pCisgICAgcmV0dXJuIGdfbGlzdF9wcmVwZW5kIChhaSwKKyAgICAgICAgYnVpbGRfYXRvbV9pbmZvX3dyYXBwZXIgKGF0b20sIGNvcHlfZnVuYywgZnJlZV9mdW5jKSk7CisgIGVsc2UKKyAgICByZXR1cm4gYWk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2luZm9fbGlzdF9mcmVlIChHTGlzdCAqIGFpKQoreworICB3aGlsZSAoYWkpIHsKKyAgICBBdG9tSW5mbyAqaW5mbyA9IChBdG9tSW5mbyAqKSBhaS0+ZGF0YTsKKworICAgIGluZm8tPmZyZWVfZnVuYyAoaW5mby0+YXRvbSk7CisgICAgZ19mcmVlIChpbmZvKTsKKyAgICBhaSA9IGdfbGlzdF9kZWxldGVfbGluayAoYWksIGFpKTsKKyAgfQorfQorCitzdGF0aWMgQXRvbURhdGEgKgorYXRvbV9kYXRhX25ldyAoZ3VpbnQzMiBmb3VyY2MpCit7CisgIEF0b21EYXRhICpkYXRhID0gZ19uZXcwIChBdG9tRGF0YSwgMSk7CisKKyAgYXRvbV9oZWFkZXJfc2V0ICgmZGF0YS0+aGVhZGVyLCBmb3VyY2MsIDAsIDApOworICByZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fZGF0YV9hbGxvY19tZW0gKEF0b21EYXRhICogZGF0YSwgZ3VpbnQzMiBzaXplKQoreworICBnX2ZyZWUgKGRhdGEtPmRhdGEpOworICBkYXRhLT5kYXRhID0gZ19uZXcwIChndWludDgsIHNpemUpOworICBkYXRhLT5kYXRhbGVuID0gc2l6ZTsKK30KKworc3RhdGljIEF0b21EYXRhICoKK2F0b21fZGF0YV9uZXdfZnJvbV9kYXRhIChndWludDMyIGZvdXJjYywgY29uc3QgZ3VpbnQ4ICogbWVtLCBnc2l6ZSBzaXplKQoreworICBBdG9tRGF0YSAqZGF0YSA9IGF0b21fZGF0YV9uZXcgKGZvdXJjYyk7CisKKyAgYXRvbV9kYXRhX2FsbG9jX21lbSAoZGF0YSwgc2l6ZSk7CisgIG1lbWNweSAoZGF0YS0+ZGF0YSwgbWVtLCBzaXplKTsKKyAgcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBBdG9tRGF0YSAqCithdG9tX2RhdGFfbmV3X2Zyb21fZ3N0X2J1ZmZlciAoZ3VpbnQzMiBmb3VyY2MsIGNvbnN0IEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgQXRvbURhdGEgKmRhdGEgPSBhdG9tX2RhdGFfbmV3IChmb3VyY2MpOworICBnc2l6ZSBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoKEdzdEJ1ZmZlciAqKSBidWYpOworCisgIGF0b21fZGF0YV9hbGxvY19tZW0gKGRhdGEsIHNpemUpOworICBnc3RfYnVmZmVyX2V4dHJhY3QgKChHc3RCdWZmZXIgKikgYnVmLCAwLCBkYXRhLT5kYXRhLCBzaXplKTsKKyAgcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2RhdGFfZnJlZSAoQXRvbURhdGEgKiBkYXRhKQoreworICBhdG9tX2NsZWFyICgmZGF0YS0+aGVhZGVyKTsKKyAgZ19mcmVlIChkYXRhLT5kYXRhKTsKKyAgZ19mcmVlIChkYXRhKTsKK30KKworc3RhdGljIEF0b21VVUlEICoKK2F0b21fdXVpZF9uZXcgKHZvaWQpCit7CisgIEF0b21VVUlEICp1dWlkID0gZ19uZXcwIChBdG9tVVVJRCwgMSk7CisKKyAgYXRvbV9oZWFkZXJfc2V0ICgmdXVpZC0+aGVhZGVyLCBGT1VSQ0NfdXVpZCwgMCwgMCk7CisgIHJldHVybiB1dWlkOworfQorCitzdGF0aWMgdm9pZAorYXRvbV91dWlkX2ZyZWUgKEF0b21VVUlEICogZGF0YSkKK3sKKyAgYXRvbV9jbGVhciAoJmRhdGEtPmhlYWRlcik7CisgIGdfZnJlZSAoZGF0YS0+ZGF0YSk7CisgIGdfZnJlZSAoZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2Z0eXBfaW5pdCAoQXRvbUZUWVAgKiBmdHlwLCBndWludDMyIG1ham9yLCBndWludDMyIHZlcnNpb24sIEdMaXN0ICogYnJhbmRzKQoreworICBnaW50IGluZGV4OworICBHTGlzdCAqaXQgPSBOVUxMOworCisgIGF0b21faGVhZGVyX3NldCAoJmZ0eXAtPmhlYWRlciwgRk9VUkNDX2Z0eXAsIDE2LCAwKTsKKyAgZnR5cC0+bWFqb3JfYnJhbmQgPSBtYWpvcjsKKyAgZnR5cC0+dmVyc2lvbiA9IHZlcnNpb247CisKKyAgLyogYWx3YXlzIGluY2x1ZGUgbWFqb3IgYnJhbmQgYXMgY29tcGF0aWJsZSBicmFuZCAqLworICBmdHlwLT5jb21wYXRpYmxlX2JyYW5kc19zaXplID0gZ19saXN0X2xlbmd0aCAoYnJhbmRzKSArIDE7CisgIGZ0eXAtPmNvbXBhdGlibGVfYnJhbmRzID0gZ19uZXcgKGd1aW50MzIsIGZ0eXAtPmNvbXBhdGlibGVfYnJhbmRzX3NpemUpOworCisgIGZ0eXAtPmNvbXBhdGlibGVfYnJhbmRzWzBdID0gbWFqb3I7CisgIGluZGV4ID0gMTsKKyAgZm9yIChpdCA9IGJyYW5kczsgaXQgIT0gTlVMTDsgaXQgPSBnX2xpc3RfbmV4dCAoaXQpKSB7CisgICAgZnR5cC0+Y29tcGF0aWJsZV9icmFuZHNbaW5kZXgrK10gPSBHUE9JTlRFUl9UT19VSU5UIChpdC0+ZGF0YSk7CisgIH0KK30KKworQXRvbUZUWVAgKgorYXRvbV9mdHlwX25ldyAoQXRvbXNDb250ZXh0ICogY29udGV4dCwgZ3VpbnQzMiBtYWpvciwgZ3VpbnQzMiB2ZXJzaW9uLAorICAgIEdMaXN0ICogYnJhbmRzKQoreworICBBdG9tRlRZUCAqZnR5cCA9IGdfbmV3MCAoQXRvbUZUWVAsIDEpOworCisgIGF0b21fZnR5cF9pbml0IChmdHlwLCBtYWpvciwgdmVyc2lvbiwgYnJhbmRzKTsKKyAgcmV0dXJuIGZ0eXA7Cit9CisKK3ZvaWQKK2F0b21fZnR5cF9mcmVlIChBdG9tRlRZUCAqIGZ0eXApCit7CisgIGF0b21fY2xlYXIgKCZmdHlwLT5oZWFkZXIpOworICBnX2ZyZWUgKGZ0eXAtPmNvbXBhdGlibGVfYnJhbmRzKTsKKyAgZnR5cC0+Y29tcGF0aWJsZV9icmFuZHMgPSBOVUxMOworICBnX2ZyZWUgKGZ0eXApOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9lc2RzX2luaXQgKEF0b21FU0RTICogZXNkcykKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZlc2RzLT5oZWFkZXIsIEZPVVJDQ19lc2RzLCAwLCAwLCAwLCBmbGFncyk7CisgIGRlc2NfZXNfaW5pdCAoJmVzZHMtPmVzKTsKK30KKworc3RhdGljIEF0b21FU0RTICoKK2F0b21fZXNkc19uZXcgKHZvaWQpCit7CisgIEF0b21FU0RTICplc2RzID0gZ19uZXcwIChBdG9tRVNEUywgMSk7CisKKyAgYXRvbV9lc2RzX2luaXQgKGVzZHMpOworICByZXR1cm4gZXNkczsKK30KKworc3RhdGljIHZvaWQKK2F0b21fZXNkc19mcmVlIChBdG9tRVNEUyAqIGVzZHMpCit7CisgIGF0b21fZnVsbF9jbGVhciAoJmVzZHMtPmhlYWRlcik7CisgIGRlc2NfZXNfZGVzY3JpcHRvcl9jbGVhciAoJmVzZHMtPmVzKTsKKyAgZ19mcmVlIChlc2RzKTsKK30KKworc3RhdGljIEF0b21GUk1BICoKK2F0b21fZnJtYV9uZXcgKHZvaWQpCit7CisgIEF0b21GUk1BICpmcm1hID0gZ19uZXcwIChBdG9tRlJNQSwgMSk7CisKKyAgYXRvbV9oZWFkZXJfc2V0ICgmZnJtYS0+aGVhZGVyLCBGT1VSQ0NfZnJtYSwgMCwgMCk7CisgIHJldHVybiBmcm1hOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9mcm1hX2ZyZWUgKEF0b21GUk1BICogZnJtYSkKK3sKKyAgYXRvbV9jbGVhciAoJmZybWEtPmhlYWRlcik7CisgIGdfZnJlZSAoZnJtYSk7Cit9CisKK3N0YXRpYyBBdG9tV0FWRSAqCithdG9tX3dhdmVfbmV3ICh2b2lkKQoreworICBBdG9tV0FWRSAqd2F2ZSA9IGdfbmV3MCAoQXRvbVdBVkUsIDEpOworCisgIGF0b21faGVhZGVyX3NldCAoJndhdmUtPmhlYWRlciwgRk9VUkNDX3dhdmUsIDAsIDApOworICByZXR1cm4gd2F2ZTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fd2F2ZV9mcmVlIChBdG9tV0FWRSAqIHdhdmUpCit7CisgIGF0b21fY2xlYXIgKCZ3YXZlLT5oZWFkZXIpOworICBhdG9tX2luZm9fbGlzdF9mcmVlICh3YXZlLT5leHRlbnNpb25fYXRvbXMpOworICBnX2ZyZWUgKHdhdmUpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9lbHN0X2luaXQgKEF0b21FTFNUICogZWxzdCkKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisgIGF0b21fZnVsbF9pbml0ICgmZWxzdC0+aGVhZGVyLCBGT1VSQ0NfZWxzdCwgMCwgMCwgMCwgZmxhZ3MpOworICBlbHN0LT5lbnRyaWVzID0gMDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fZWxzdF9jbGVhciAoQXRvbUVMU1QgKiBlbHN0KQoreworICBHU0xpc3QgKndhbGtlcjsKKworICBhdG9tX2Z1bGxfY2xlYXIgKCZlbHN0LT5oZWFkZXIpOworICB3YWxrZXIgPSBlbHN0LT5lbnRyaWVzOworICB3aGlsZSAod2Fsa2VyKSB7CisgICAgZ19mcmVlICgoRWRpdExpc3RFbnRyeSAqKSB3YWxrZXItPmRhdGEpOworICAgIHdhbGtlciA9IGdfc2xpc3RfbmV4dCAod2Fsa2VyKTsKKyAgfQorICBnX3NsaXN0X2ZyZWUgKGVsc3QtPmVudHJpZXMpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9lZHRzX2luaXQgKEF0b21FRFRTICogZWR0cykKK3sKKyAgYXRvbV9oZWFkZXJfc2V0ICgmZWR0cy0+aGVhZGVyLCBGT1VSQ0NfZWR0cywgMCwgMCk7CisgIGF0b21fZWxzdF9pbml0ICgmZWR0cy0+ZWxzdCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2VkdHNfY2xlYXIgKEF0b21FRFRTICogZWR0cykKK3sKKyAgYXRvbV9jbGVhciAoJmVkdHMtPmhlYWRlcik7CisgIGF0b21fZWxzdF9jbGVhciAoJmVkdHMtPmVsc3QpOworfQorCitzdGF0aWMgQXRvbUVEVFMgKgorYXRvbV9lZHRzX25ldyAodm9pZCkKK3sKKyAgQXRvbUVEVFMgKmVkdHMgPSBnX25ldzAgKEF0b21FRFRTLCAxKTsKKyAgYXRvbV9lZHRzX2luaXQgKGVkdHMpOworICByZXR1cm4gZWR0czsKK30KKworc3RhdGljIHZvaWQKK2F0b21fZWR0c19mcmVlIChBdG9tRURUUyAqIGVkdHMpCit7CisgIGF0b21fZWR0c19jbGVhciAoZWR0cyk7CisgIGdfZnJlZSAoZWR0cyk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3RjbWlfaW5pdCAoQXRvbVRDTUkgKiB0Y21pKQoreworICBndWludDggZmxhZ3NbM10gPSB7IDAsIDAsIDAgfTsKKworICBhdG9tX2Z1bGxfaW5pdCAoJnRjbWktPmhlYWRlciwgRk9VUkNDX3RjbWksIDAsIDAsIDAsIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdGNtaV9jbGVhciAoQXRvbVRDTUkgKiB0Y21pKQoreworICBhdG9tX2Z1bGxfY2xlYXIgKCZ0Y21pLT5oZWFkZXIpOworICB0Y21pLT50ZXh0X2ZvbnQgPSAwOworICB0Y21pLT50ZXh0X2ZhY2UgPSAwOworICB0Y21pLT50ZXh0X3NpemUgPSAwOworICB0Y21pLT50ZXh0X2NvbG9yWzBdID0gMDsKKyAgdGNtaS0+dGV4dF9jb2xvclsxXSA9IDA7CisgIHRjbWktPnRleHRfY29sb3JbMl0gPSAwOworICB0Y21pLT5iZ19jb2xvclswXSA9IDA7CisgIHRjbWktPmJnX2NvbG9yWzFdID0gMDsKKyAgdGNtaS0+YmdfY29sb3JbMl0gPSAwOworICBnX2ZyZWUgKHRjbWktPmZvbnRfbmFtZSk7CisgIHRjbWktPmZvbnRfbmFtZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3RtY2RfaW5pdCAoQXRvbVRNQ0QgKiB0bWNkKQoreworICBhdG9tX2hlYWRlcl9zZXQgKCZ0bWNkLT5oZWFkZXIsIEZPVVJDQ190bWNkLCAwLCAwKTsKKyAgYXRvbV90Y21pX2luaXQgKCZ0bWNkLT50Y21pKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdG1jZF9jbGVhciAoQXRvbVRNQ0QgKiB0bWNkKQoreworICBhdG9tX2NsZWFyICgmdG1jZC0+aGVhZGVyKTsKKyAgYXRvbV90Y21pX2NsZWFyICgmdG1jZC0+dGNtaSk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2dtaW5faW5pdCAoQXRvbUdNSU4gKiBnbWluKQoreworICBndWludDggZmxhZ3NbM10gPSB7IDAsIDAsIDAgfTsKKworICBhdG9tX2Z1bGxfaW5pdCAoJmdtaW4tPmhlYWRlciwgRk9VUkNDX2dtaW4sIDAsIDAsIDAsIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fZ21pbl9jbGVhciAoQXRvbUdNSU4gKiBnbWluKQoreworICBhdG9tX2Z1bGxfY2xlYXIgKCZnbWluLT5oZWFkZXIpOworICBnbWluLT5ncmFwaGljc19tb2RlID0gMDsKKyAgZ21pbi0+b3Bjb2xvclswXSA9IDA7CisgIGdtaW4tPm9wY29sb3JbMV0gPSAwOworICBnbWluLT5vcGNvbG9yWzJdID0gMDsKKyAgZ21pbi0+YmFsYW5jZSA9IDA7CisgIGdtaW4tPnJlc2VydmVkID0gMDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fZ21oZF9pbml0IChBdG9tR01IRCAqIGdtaGQpCit7CisgIGF0b21faGVhZGVyX3NldCAoJmdtaGQtPmhlYWRlciwgRk9VUkNDX2dtaGQsIDAsIDApOworICBhdG9tX2dtaW5faW5pdCAoJmdtaGQtPmdtaW4pOworICBhdG9tX3RtY2RfaW5pdCAoJmdtaGQtPnRtY2QpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9nbWhkX2NsZWFyIChBdG9tR01IRCAqIGdtaGQpCit7CisgIGF0b21fY2xlYXIgKCZnbWhkLT5oZWFkZXIpOworICBhdG9tX2dtaW5fY2xlYXIgKCZnbWhkLT5nbWluKTsKKyAgYXRvbV90bWNkX2NsZWFyICgmZ21oZC0+dG1jZCk7Cit9CisKK3N0YXRpYyBBdG9tR01IRCAqCithdG9tX2dtaGRfbmV3ICh2b2lkKQoreworICBBdG9tR01IRCAqZ21oZCA9IGdfbmV3MCAoQXRvbUdNSEQsIDEpOworICBhdG9tX2dtaGRfaW5pdCAoZ21oZCk7CisgIHJldHVybiBnbWhkOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9nbWhkX2ZyZWUgKEF0b21HTUhEICogZ21oZCkKK3sKKyAgYXRvbV9nbWhkX2NsZWFyIChnbWhkKTsKKyAgZ19mcmVlIChnbWhkKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fc2FtcGxlX2VudHJ5X2luaXQgKFNhbXBsZVRhYmxlRW50cnkgKiBzZSwgZ3VpbnQzMiB0eXBlKQoreworICBhdG9tX2hlYWRlcl9zZXQgKCZzZS0+aGVhZGVyLCB0eXBlLCAwLCAwKTsKKworICBtZW1zZXQgKHNlLT5yZXNlcnZlZCwgMCwgc2l6ZW9mIChndWludDgpICogNik7CisgIHNlLT5kYXRhX3JlZmVyZW5jZV9pbmRleCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3NhbXBsZV9lbnRyeV9mcmVlIChTYW1wbGVUYWJsZUVudHJ5ICogc2UpCit7CisgIGF0b21fY2xlYXIgKCZzZS0+aGVhZGVyKTsKK30KKworc3RhdGljIHZvaWQKK3NhbXBsZV9lbnRyeV9tcDRhX2luaXQgKFNhbXBsZVRhYmxlRW50cnlNUDRBICogbXA0YSkKK3sKKyAgYXRvbV9zYW1wbGVfZW50cnlfaW5pdCAoJm1wNGEtPnNlLCBGT1VSQ0NfbXA0YSk7CisKKyAgbXA0YS0+dmVyc2lvbiA9IDA7CisgIG1wNGEtPnJldmlzaW9uX2xldmVsID0gMDsKKyAgbXA0YS0+dmVuZG9yID0gMDsKKyAgbXA0YS0+Y2hhbm5lbHMgPSAyOworICBtcDRhLT5zYW1wbGVfc2l6ZSA9IDE2OworICBtcDRhLT5jb21wcmVzc2lvbl9pZCA9IDA7CisgIG1wNGEtPnBhY2tldF9zaXplID0gMDsKKyAgbXA0YS0+c2FtcGxlX3JhdGUgPSAwOworICAvKiBmb2xsb3dpbmcgb25seSB1c2VkIGlmIHZlcnNpb24gaXMgMSAqLworICBtcDRhLT5zYW1wbGVzX3Blcl9wYWNrZXQgPSAwOworICBtcDRhLT5ieXRlc19wZXJfcGFja2V0ID0gMDsKKyAgbXA0YS0+Ynl0ZXNfcGVyX2ZyYW1lID0gMDsKKyAgbXA0YS0+Ynl0ZXNfcGVyX3NhbXBsZSA9IDA7CisKKyAgbXA0YS0+ZXh0ZW5zaW9uX2F0b21zID0gTlVMTDsKK30KKworc3RhdGljIFNhbXBsZVRhYmxlRW50cnlNUDRBICoKK3NhbXBsZV9lbnRyeV9tcDRhX25ldyAodm9pZCkKK3sKKyAgU2FtcGxlVGFibGVFbnRyeU1QNEEgKm1wNGEgPSBnX25ldzAgKFNhbXBsZVRhYmxlRW50cnlNUDRBLCAxKTsKKworICBzYW1wbGVfZW50cnlfbXA0YV9pbml0IChtcDRhKTsKKyAgcmV0dXJuIG1wNGE7Cit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfZW50cnlfbXA0YV9mcmVlIChTYW1wbGVUYWJsZUVudHJ5TVA0QSAqIG1wNGEpCit7CisgIGF0b21fc2FtcGxlX2VudHJ5X2ZyZWUgKCZtcDRhLT5zZSk7CisgIGF0b21faW5mb19saXN0X2ZyZWUgKG1wNGEtPmV4dGVuc2lvbl9hdG9tcyk7CisgIGdfZnJlZSAobXA0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfZW50cnlfdG1jZF9pbml0IChTYW1wbGVUYWJsZUVudHJ5VE1DRCAqIHRtY2QpCit7CisgIGF0b21fc2FtcGxlX2VudHJ5X2luaXQgKCZ0bWNkLT5zZSwgRk9VUkNDX3RtY2QpOworCisgIHRtY2QtPnRjX2ZsYWdzID0gMDsKKyAgdG1jZC0+dGltZXNjYWxlID0gMDsKKyAgdG1jZC0+ZnJhbWVfZHVyYXRpb24gPSAwOworICB0bWNkLT5uX2ZyYW1lcyA9IDA7CisKKyAgdG1jZC0+bmFtZS5sYW5ndWFnZV9jb2RlID0gMDsKKyAgZ19mcmVlICh0bWNkLT5uYW1lLm5hbWUpOworICB0bWNkLT5uYW1lLm5hbWUgPSBOVUxMOworfQorCitzdGF0aWMgU2FtcGxlVGFibGVFbnRyeVRNQ0QgKgorc2FtcGxlX2VudHJ5X3RtY2RfbmV3ICh2b2lkKQoreworICBTYW1wbGVUYWJsZUVudHJ5VE1DRCAqdG1jZCA9IGdfbmV3MCAoU2FtcGxlVGFibGVFbnRyeVRNQ0QsIDEpOworCisgIHNhbXBsZV9lbnRyeV90bWNkX2luaXQgKHRtY2QpOworICByZXR1cm4gdG1jZDsKK30KKworc3RhdGljIHZvaWQKK3NhbXBsZV9lbnRyeV90bWNkX2ZyZWUgKFNhbXBsZVRhYmxlRW50cnlUTUNEICogdG1jZCkKK3sKKyAgYXRvbV9zYW1wbGVfZW50cnlfZnJlZSAoJnRtY2QtPnNlKTsKKyAgZ19mcmVlICh0bWNkLT5uYW1lLm5hbWUpOworICBnX2ZyZWUgKHRtY2QpOworfQorCitzdGF0aWMgdm9pZAorc2FtcGxlX2VudHJ5X21wNHZfaW5pdCAoU2FtcGxlVGFibGVFbnRyeU1QNFYgKiBtcDR2LCBBdG9tc0NvbnRleHQgKiBjb250ZXh0KQoreworICBhdG9tX3NhbXBsZV9lbnRyeV9pbml0ICgmbXA0di0+c2UsIEZPVVJDQ19tcDR2KTsKKworICBtcDR2LT52ZXJzaW9uID0gMDsKKyAgbXA0di0+cmV2aXNpb25fbGV2ZWwgPSAwOworICBtcDR2LT52ZW5kb3IgPSAwOworCisgIG1wNHYtPnRlbXBvcmFsX3F1YWxpdHkgPSAwOworICBtcDR2LT5zcGF0aWFsX3F1YWxpdHkgPSAwOworCisgIC8qIHF0IGFuZCBJU08gYmFzZSBtZWRpYSBkbyBub3QgY29udHJhZGljdCwgYW5kIGV4YW1wbGVzIGFncmVlICovCisgIG1wNHYtPmhvcml6b250YWxfcmVzb2x1dGlvbiA9IDB4MDA0ODAwMDA7CisgIG1wNHYtPnZlcnRpY2FsX3Jlc29sdXRpb24gPSAweDAwNDgwMDAwOworCisgIG1wNHYtPmRhdGFzaXplID0gMDsKKyAgbXA0di0+ZnJhbWVfY291bnQgPSAxOworCisgIG1lbXNldCAobXA0di0+Y29tcHJlc3NvciwgMCwgc2l6ZW9mIChndWludDgpICogMzIpOworCisgIG1wNHYtPmRlcHRoID0gMDsKKyAgbXA0di0+Y29sb3JfdGFibGVfaWQgPSAwOworCisgIG1wNHYtPmV4dGVuc2lvbl9hdG9tcyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfZW50cnlfbXA0dl9mcmVlIChTYW1wbGVUYWJsZUVudHJ5TVA0ViAqIG1wNHYpCit7CisgIGF0b21fc2FtcGxlX2VudHJ5X2ZyZWUgKCZtcDR2LT5zZSk7CisgIGF0b21faW5mb19saXN0X2ZyZWUgKG1wNHYtPmV4dGVuc2lvbl9hdG9tcyk7CisgIGdfZnJlZSAobXA0dik7Cit9CisKK3N0YXRpYyBTYW1wbGVUYWJsZUVudHJ5TVA0ViAqCitzYW1wbGVfZW50cnlfbXA0dl9uZXcgKEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIFNhbXBsZVRhYmxlRW50cnlNUDRWICptcDR2ID0gZ19uZXcwIChTYW1wbGVUYWJsZUVudHJ5TVA0ViwgMSk7CisKKyAgc2FtcGxlX2VudHJ5X21wNHZfaW5pdCAobXA0diwgY29udGV4dCk7CisgIHJldHVybiBtcDR2OworfQorCitzdGF0aWMgdm9pZAorc2FtcGxlX2VudHJ5X3R4M2dfaW5pdCAoU2FtcGxlVGFibGVFbnRyeVRYM0cgKiB0eDNnKQoreworICBhdG9tX3NhbXBsZV9lbnRyeV9pbml0ICgmdHgzZy0+c2UsIEZPVVJDQ190eDNnKTsKKworICB0eDNnLT5kaXNwbGF5X2ZsYWdzID0gMDsKKyAgdHgzZy0+Zm9udF9pZCA9IDE7ICAgICAgICAgICAgLyogbXVzdCBiZSAxIGFzIHRoZXJlIGlzIGEgc2luZ2xlIGZvbnQgKi8KKyAgdHgzZy0+Zm9udF9mYWNlID0gMDsKKyAgdHgzZy0+Zm9yZWdyb3VuZF9jb2xvcl9yZ2JhID0gMHhGRkZGRkZGRjsgICAgIC8qIHdoaXRlLCBvcGFxdWUgKi8KKworICAvKiBjYW4ndCBzZXQgdGhpcyBub3cgKi8KKyAgdHgzZy0+ZGVmYXVsdF90ZXh0X2JveCA9IDA7CisgIHR4M2ctPmZvbnRfc2l6ZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfZW50cnlfdHgzZ19mcmVlIChTYW1wbGVUYWJsZUVudHJ5VFgzRyAqIHR4M2cpCit7CisgIGF0b21fc2FtcGxlX2VudHJ5X2ZyZWUgKCZ0eDNnLT5zZSk7CisgIGdfZnJlZSAodHgzZyk7Cit9CisKK3N0YXRpYyBTYW1wbGVUYWJsZUVudHJ5VFgzRyAqCitzYW1wbGVfZW50cnlfdHgzZ19uZXcgKHZvaWQpCit7CisgIFNhbXBsZVRhYmxlRW50cnlUWDNHICp0eDNnID0gZ19uZXcwIChTYW1wbGVUYWJsZUVudHJ5VFgzRywgMSk7CisKKyAgc2FtcGxlX2VudHJ5X3R4M2dfaW5pdCAodHgzZyk7CisgIHJldHVybiB0eDNnOworfQorCisKK3N0YXRpYyB2b2lkCithdG9tX3N0c2RfaW5pdCAoQXRvbVNUU0QgKiBzdHNkKQoreworICBndWludDggZmxhZ3NbM10gPSB7IDAsIDAsIDAgfTsKKworICBhdG9tX2Z1bGxfaW5pdCAoJnN0c2QtPmhlYWRlciwgRk9VUkNDX3N0c2QsIDAsIDAsIDAsIGZsYWdzKTsKKyAgc3RzZC0+ZW50cmllcyA9IE5VTEw7CisgIHN0c2QtPm5fZW50cmllcyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3N0c2RfcmVtb3ZlX2VudHJpZXMgKEF0b21TVFNEICogc3RzZCkKK3sKKyAgR0xpc3QgKndhbGtlcjsKKworICB3YWxrZXIgPSBzdHNkLT5lbnRyaWVzOworICB3aGlsZSAod2Fsa2VyKSB7CisgICAgR0xpc3QgKmF1eCA9IHdhbGtlcjsKKyAgICBTYW1wbGVUYWJsZUVudHJ5ICpzZSA9IChTYW1wbGVUYWJsZUVudHJ5ICopIGF1eC0+ZGF0YTsKKworICAgIHdhbGtlciA9IGdfbGlzdF9uZXh0ICh3YWxrZXIpOworICAgIHN0c2QtPmVudHJpZXMgPSBnX2xpc3RfcmVtb3ZlX2xpbmsgKHN0c2QtPmVudHJpZXMsIGF1eCk7CisKKyAgICBzd2l0Y2ggKHNlLT5raW5kKSB7CisgICAgICBjYXNlIEFVRElPOgorICAgICAgICBzYW1wbGVfZW50cnlfbXA0YV9mcmVlICgoU2FtcGxlVGFibGVFbnRyeU1QNEEgKikgc2UpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVklERU86CisgICAgICAgIHNhbXBsZV9lbnRyeV9tcDR2X2ZyZWUgKChTYW1wbGVUYWJsZUVudHJ5TVA0ViAqKSBzZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTVUJUSVRMRToKKyAgICAgICAgc2FtcGxlX2VudHJ5X3R4M2dfZnJlZSAoKFNhbXBsZVRhYmxlRW50cnlUWDNHICopIHNlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRJTUVDT0RFOgorICAgICAgICBzYW1wbGVfZW50cnlfdG1jZF9mcmVlICgoU2FtcGxlVGFibGVFbnRyeVRNQ0QgKikgc2UpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIGJlc3QgcG9zc2libGUgY2xlYW51cCAqLworICAgICAgICBhdG9tX3NhbXBsZV9lbnRyeV9mcmVlIChzZSk7CisgICAgfQorICAgIGdfbGlzdF9mcmVlIChhdXgpOworICB9CisgIHN0c2QtPm5fZW50cmllcyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3N0c2RfY2xlYXIgKEF0b21TVFNEICogc3RzZCkKK3sKKyAgYXRvbV9zdHNkX3JlbW92ZV9lbnRyaWVzIChzdHNkKTsKKyAgYXRvbV9mdWxsX2NsZWFyICgmc3RzZC0+aGVhZGVyKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fY3R0c19pbml0IChBdG9tQ1RUUyAqIGN0dHMpCit7CisgIGd1aW50OCBmbGFnc1szXSA9IHsgMCwgMCwgMCB9OworCisgIGF0b21fZnVsbF9pbml0ICgmY3R0cy0+aGVhZGVyLCBGT1VSQ0NfY3R0cywgMCwgMCwgMCwgZmxhZ3MpOworICBhdG9tX2FycmF5X2luaXQgKCZjdHRzLT5lbnRyaWVzLCAxMjgpOworICBjdHRzLT5kb19wdHMgPSBGQUxTRTsKK30KKworc3RhdGljIEF0b21DVFRTICoKK2F0b21fY3R0c19uZXcgKHZvaWQpCit7CisgIEF0b21DVFRTICpjdHRzID0gZ19uZXcwIChBdG9tQ1RUUywgMSk7CisKKyAgYXRvbV9jdHRzX2luaXQgKGN0dHMpOworICByZXR1cm4gY3R0czsKK30KKworc3RhdGljIHZvaWQKK2F0b21fY3R0c19mcmVlIChBdG9tQ1RUUyAqIGN0dHMpCit7CisgIGF0b21fZnVsbF9jbGVhciAoJmN0dHMtPmhlYWRlcik7CisgIGF0b21fYXJyYXlfY2xlYXIgKCZjdHRzLT5lbnRyaWVzKTsKKyAgZ19mcmVlIChjdHRzKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fc3ZtaV9pbml0IChBdG9tU1ZNSSAqIHN2bWkpCit7CisgIGd1aW50OCBmbGFnc1szXSA9IHsgMCwgMCwgMCB9OworCisgIGF0b21fZnVsbF9pbml0ICgmc3ZtaS0+aGVhZGVyLCBGT1VSQ0Nfc3ZtaSwgMCwgMCwgMCwgZmxhZ3MpOworICBzdm1pLT5zdGVyZW9zY29waWNfY29tcG9zaXRpb25fdHlwZSA9IDB4MDA7CisgIHN2bWktPmlzX2xlZnRfZmlyc3QgPSBGQUxTRTsKK30KKworQXRvbVNWTUkgKgorYXRvbV9zdm1pX25ldyAoZ3VpbnQ4IHN0ZXJlb3Njb3BpY19jb21wb3NpdGlvbl90eXBlLCBnYm9vbGVhbiBpc19sZWZ0X2ZpcnN0KQoreworICBBdG9tU1ZNSSAqc3ZtaSA9IGdfbmV3MCAoQXRvbVNWTUksIDEpOworCisgIGF0b21fc3ZtaV9pbml0IChzdm1pKTsKKyAgc3ZtaS0+c3RlcmVvc2NvcGljX2NvbXBvc2l0aW9uX3R5cGUgPSBzdGVyZW9zY29waWNfY29tcG9zaXRpb25fdHlwZTsKKyAgc3ZtaS0+aXNfbGVmdF9maXJzdCA9IGlzX2xlZnRfZmlyc3Q7CisgIHJldHVybiBzdm1pOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9zdm1pX2ZyZWUgKEF0b21TVk1JICogc3ZtaSkKK3sKKyAgZ19mcmVlIChzdm1pKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fc3R0c19pbml0IChBdG9tU1RUUyAqIHN0dHMpCit7CisgIGd1aW50OCBmbGFnc1szXSA9IHsgMCwgMCwgMCB9OworCisgIGF0b21fZnVsbF9pbml0ICgmc3R0cy0+aGVhZGVyLCBGT1VSQ0Nfc3R0cywgMCwgMCwgMCwgZmxhZ3MpOworICBhdG9tX2FycmF5X2luaXQgKCZzdHRzLT5lbnRyaWVzLCA1MTIpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9zdHRzX2NsZWFyIChBdG9tU1RUUyAqIHN0dHMpCit7CisgIGF0b21fZnVsbF9jbGVhciAoJnN0dHMtPmhlYWRlcik7CisgIGF0b21fYXJyYXlfY2xlYXIgKCZzdHRzLT5lbnRyaWVzKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fc3Rzel9pbml0IChBdG9tU1RTWiAqIHN0c3opCit7CisgIGd1aW50OCBmbGFnc1szXSA9IHsgMCwgMCwgMCB9OworCisgIGF0b21fZnVsbF9pbml0ICgmc3Rzei0+aGVhZGVyLCBGT1VSQ0Nfc3RzeiwgMCwgMCwgMCwgZmxhZ3MpOworICBhdG9tX2FycmF5X2luaXQgKCZzdHN6LT5lbnRyaWVzLCAxMDI0KTsKKyAgc3Rzei0+c2FtcGxlX3NpemUgPSAwOworICBzdHN6LT50YWJsZV9zaXplID0gMDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fc3Rzel9jbGVhciAoQXRvbVNUU1ogKiBzdHN6KQoreworICBhdG9tX2Z1bGxfY2xlYXIgKCZzdHN6LT5oZWFkZXIpOworICBhdG9tX2FycmF5X2NsZWFyICgmc3Rzei0+ZW50cmllcyk7CisgIHN0c3otPnRhYmxlX3NpemUgPSAwOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9zdHNjX2luaXQgKEF0b21TVFNDICogc3RzYykKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZzdHNjLT5oZWFkZXIsIEZPVVJDQ19zdHNjLCAwLCAwLCAwLCBmbGFncyk7CisgIGF0b21fYXJyYXlfaW5pdCAoJnN0c2MtPmVudHJpZXMsIDEyOCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3N0c2NfY2xlYXIgKEF0b21TVFNDICogc3RzYykKK3sKKyAgYXRvbV9mdWxsX2NsZWFyICgmc3RzYy0+aGVhZGVyKTsKKyAgYXRvbV9hcnJheV9jbGVhciAoJnN0c2MtPmVudHJpZXMpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9jbzY0X2luaXQgKEF0b21TVENPNjQgKiBjbzY0KQoreworICBndWludDggZmxhZ3NbM10gPSB7IDAsIDAsIDAgfTsKKworICBhdG9tX2Z1bGxfaW5pdCAoJmNvNjQtPmhlYWRlciwgRk9VUkNDX3N0Y28sIDAsIDAsIDAsIGZsYWdzKTsKKyAgYXRvbV9hcnJheV9pbml0ICgmY282NC0+ZW50cmllcywgMjU2KTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fc3RjbzY0X2NsZWFyIChBdG9tU1RDTzY0ICogc3RjbzY0KQoreworICBhdG9tX2Z1bGxfY2xlYXIgKCZzdGNvNjQtPmhlYWRlcik7CisgIGF0b21fYXJyYXlfY2xlYXIgKCZzdGNvNjQtPmVudHJpZXMpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9zdHNzX2luaXQgKEF0b21TVFNTICogc3RzcykKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZzdHNzLT5oZWFkZXIsIEZPVVJDQ19zdHNzLCAwLCAwLCAwLCBmbGFncyk7CisgIGF0b21fYXJyYXlfaW5pdCAoJnN0c3MtPmVudHJpZXMsIDEyOCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3N0c3NfY2xlYXIgKEF0b21TVFNTICogc3RzcykKK3sKKyAgYXRvbV9mdWxsX2NsZWFyICgmc3Rzcy0+aGVhZGVyKTsKKyAgYXRvbV9hcnJheV9jbGVhciAoJnN0c3MtPmVudHJpZXMpOworfQorCit2b2lkCithdG9tX3N0YmxfaW5pdCAoQXRvbVNUQkwgKiBzdGJsKQoreworICBhdG9tX2hlYWRlcl9zZXQgKCZzdGJsLT5oZWFkZXIsIEZPVVJDQ19zdGJsLCAwLCAwKTsKKworICBhdG9tX3N0dHNfaW5pdCAoJnN0YmwtPnN0dHMpOworICBhdG9tX3N0c3NfaW5pdCAoJnN0YmwtPnN0c3MpOworICBhdG9tX3N0c2RfaW5pdCAoJnN0YmwtPnN0c2QpOworICBhdG9tX3N0c3pfaW5pdCAoJnN0YmwtPnN0c3opOworICBhdG9tX3N0c2NfaW5pdCAoJnN0YmwtPnN0c2MpOworICBzdGJsLT5jdHRzID0gTlVMTDsKKyAgc3RibC0+c3ZtaSA9IE5VTEw7CisKKyAgYXRvbV9jbzY0X2luaXQgKCZzdGJsLT5zdGNvNjQpOworfQorCit2b2lkCithdG9tX3N0YmxfY2xlYXIgKEF0b21TVEJMICogc3RibCkKK3sKKyAgYXRvbV9jbGVhciAoJnN0YmwtPmhlYWRlcik7CisgIGF0b21fc3RzZF9jbGVhciAoJnN0YmwtPnN0c2QpOworICBhdG9tX3N0dHNfY2xlYXIgKCZzdGJsLT5zdHRzKTsKKyAgYXRvbV9zdHNzX2NsZWFyICgmc3RibC0+c3Rzcyk7CisgIGF0b21fc3RzY19jbGVhciAoJnN0YmwtPnN0c2MpOworICBhdG9tX3N0c3pfY2xlYXIgKCZzdGJsLT5zdHN6KTsKKyAgaWYgKHN0YmwtPmN0dHMpIHsKKyAgICBhdG9tX2N0dHNfZnJlZSAoc3RibC0+Y3R0cyk7CisgIH0KKyAgaWYgKHN0YmwtPnN2bWkpIHsKKyAgICBhdG9tX3N2bWlfZnJlZSAoc3RibC0+c3ZtaSk7CisgIH0KKyAgYXRvbV9zdGNvNjRfY2xlYXIgKCZzdGJsLT5zdGNvNjQpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV92bWhkX2luaXQgKEF0b21WTUhEICogdm1oZCwgQXRvbXNDb250ZXh0ICogY29udGV4dCkKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAxIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZ2bWhkLT5oZWFkZXIsIEZPVVJDQ192bWhkLCAwLCAwLCAwLCBmbGFncyk7CisgIHZtaGQtPmdyYXBoaWNzX21vZGUgPSAweDA7CisgIG1lbXNldCAodm1oZC0+b3Bjb2xvciwgMCwgc2l6ZW9mIChndWludDE2KSAqIDMpOworCisgIGlmIChjb250ZXh0LT5mbGF2b3IgPT0gQVRPTVNfVFJFRV9GTEFWT1JfTU9WKSB7CisgICAgdm1oZC0+Z3JhcGhpY3NfbW9kZSA9IDB4NDA7CisgICAgdm1oZC0+b3Bjb2xvclswXSA9IDMyNzY4OworICAgIHZtaGQtPm9wY29sb3JbMV0gPSAzMjc2ODsKKyAgICB2bWhkLT5vcGNvbG9yWzJdID0gMzI3Njg7CisgIH0KK30KKworc3RhdGljIEF0b21WTUhEICoKK2F0b21fdm1oZF9uZXcgKEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIEF0b21WTUhEICp2bWhkID0gZ19uZXcwIChBdG9tVk1IRCwgMSk7CisKKyAgYXRvbV92bWhkX2luaXQgKHZtaGQsIGNvbnRleHQpOworICByZXR1cm4gdm1oZDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdm1oZF9mcmVlIChBdG9tVk1IRCAqIHZtaGQpCit7CisgIGF0b21fZnVsbF9jbGVhciAoJnZtaGQtPmhlYWRlcik7CisgIGdfZnJlZSAodm1oZCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3NtaGRfaW5pdCAoQXRvbVNNSEQgKiBzbWhkKQoreworICBndWludDggZmxhZ3NbM10gPSB7IDAsIDAsIDAgfTsKKworICBhdG9tX2Z1bGxfaW5pdCAoJnNtaGQtPmhlYWRlciwgRk9VUkNDX3NtaGQsIDAsIDAsIDAsIGZsYWdzKTsKKyAgc21oZC0+YmFsYW5jZSA9IDA7CisgIHNtaGQtPnJlc2VydmVkID0gMDsKK30KKworc3RhdGljIEF0b21TTUhEICoKK2F0b21fc21oZF9uZXcgKHZvaWQpCit7CisgIEF0b21TTUhEICpzbWhkID0gZ19uZXcwIChBdG9tU01IRCwgMSk7CisKKyAgYXRvbV9zbWhkX2luaXQgKHNtaGQpOworICByZXR1cm4gc21oZDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fc21oZF9mcmVlIChBdG9tU01IRCAqIHNtaGQpCit7CisgIGF0b21fZnVsbF9jbGVhciAoJnNtaGQtPmhlYWRlcik7CisgIGdfZnJlZSAoc21oZCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2htaGRfZnJlZSAoQXRvbUhNSEQgKiBobWhkKQoreworICBhdG9tX2Z1bGxfY2xlYXIgKCZobWhkLT5oZWFkZXIpOworICBnX2ZyZWUgKGhtaGQpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9oZGxyX2luaXQgKEF0b21IRExSICogaGRsciwgQXRvbXNDb250ZXh0ICogY29udGV4dCkKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZoZGxyLT5oZWFkZXIsIEZPVVJDQ19oZGxyLCAwLCAwLCAwLCBmbGFncyk7CisKKyAgaGRsci0+Y29tcG9uZW50X3R5cGUgPSAwOworICBoZGxyLT5oYW5kbGVyX3R5cGUgPSAwOworICBoZGxyLT5tYW51ZmFjdHVyZXIgPSAwOworICBoZGxyLT5mbGFncyA9IDA7CisgIGhkbHItPmZsYWdzX21hc2sgPSAwOworICBoZGxyLT5uYW1lID0gZ19zdHJkdXAgKCIiKTsKKworICAvKiBTdG9yZSB0aGUgZmxhdm9yIHRvIGtub3cgaG93IHRvIHNlcmlhbGl6ZSB0aGUgJ25hbWUnIHN0cmluZyAqLworICBoZGxyLT5mbGF2b3IgPSBjb250ZXh0LT5mbGF2b3I7Cit9CisKK3N0YXRpYyBBdG9tSERMUiAqCithdG9tX2hkbHJfbmV3IChBdG9tc0NvbnRleHQgKiBjb250ZXh0KQoreworICBBdG9tSERMUiAqaGRsciA9IGdfbmV3MCAoQXRvbUhETFIsIDEpOworCisgIGF0b21faGRscl9pbml0IChoZGxyLCBjb250ZXh0KTsKKyAgcmV0dXJuIGhkbHI7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2hkbHJfY2xlYXIgKEF0b21IRExSICogaGRscikKK3sKKyAgYXRvbV9mdWxsX2NsZWFyICgmaGRsci0+aGVhZGVyKTsKKyAgaWYgKGhkbHItPm5hbWUpIHsKKyAgICBnX2ZyZWUgKGhkbHItPm5hbWUpOworICAgIGhkbHItPm5hbWUgPSBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2hkbHJfZnJlZSAoQXRvbUhETFIgKiBoZGxyKQoreworICBhdG9tX2hkbHJfY2xlYXIgKGhkbHIpOworICBnX2ZyZWUgKGhkbHIpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV91cmxfaW5pdCAoQXRvbVVSTCAqIHVybCkKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAxIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZ1cmwtPmhlYWRlciwgRk9VUkNDX3VybF8sIDAsIDAsIDAsIGZsYWdzKTsKKyAgdXJsLT5sb2NhdGlvbiA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3VybF9mcmVlIChBdG9tVVJMICogdXJsKQoreworICBhdG9tX2Z1bGxfY2xlYXIgKCZ1cmwtPmhlYWRlcik7CisgIGlmICh1cmwtPmxvY2F0aW9uKSB7CisgICAgZ19mcmVlICh1cmwtPmxvY2F0aW9uKTsKKyAgICB1cmwtPmxvY2F0aW9uID0gTlVMTDsKKyAgfQorICBnX2ZyZWUgKHVybCk7Cit9CisKK3N0YXRpYyBBdG9tVVJMICoKK2F0b21fdXJsX25ldyAodm9pZCkKK3sKKyAgQXRvbVVSTCAqdXJsID0gZ19uZXcwIChBdG9tVVJMLCAxKTsKKworICBhdG9tX3VybF9pbml0ICh1cmwpOworICByZXR1cm4gdXJsOworfQorCitzdGF0aWMgQXRvbUZ1bGwgKgorYXRvbV9hbGlzX25ldyAodm9pZCkKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAxIH07CisgIEF0b21GdWxsICphbGlzID0gZ19uZXcwIChBdG9tRnVsbCwgMSk7CisKKyAgYXRvbV9mdWxsX2luaXQgKGFsaXMsIEZPVVJDQ19hbGlzLCAwLCAwLCAwLCBmbGFncyk7CisgIHJldHVybiBhbGlzOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9kcmVmX2luaXQgKEF0b21EUkVGICogZHJlZiwgQXRvbXNDb250ZXh0ICogY29udGV4dCkKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZkcmVmLT5oZWFkZXIsIEZPVVJDQ19kcmVmLCAwLCAwLCAwLCBmbGFncyk7CisKKyAgLyogaW4gZWl0aGVyIGNhc2UsIGFsaXMgb3IgdXJsIGluaXQgYXJyYW5nZXMgdG8gc2V0IHNlbGYtY29udGFpbmVkIGZsYWcgKi8KKyAgaWYgKGNvbnRleHQtPmZsYXZvciA9PSBBVE9NU19UUkVFX0ZMQVZPUl9NT1YpIHsKKyAgICAvKiBhbGlzIGRyZWYgZm9yIHF0ICovCisgICAgQXRvbUZ1bGwgKmFsaXMgPSBhdG9tX2FsaXNfbmV3ICgpOworICAgIGRyZWYtPmVudHJpZXMgPSBnX2xpc3RfYXBwZW5kIChkcmVmLT5lbnRyaWVzLCBhbGlzKTsKKyAgfSBlbHNlIHsKKyAgICAvKiB1cmwgZm9yIGlzbyBzcGVjLCBhcyAnYWxpcycgbm90IHNwZWNpZmllZCB0aGVyZSAqLworICAgIEF0b21VUkwgKnVybCA9IGF0b21fdXJsX25ldyAoKTsKKyAgICBkcmVmLT5lbnRyaWVzID0gZ19saXN0X2FwcGVuZCAoZHJlZi0+ZW50cmllcywgdXJsKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorYXRvbV9kcmVmX2NsZWFyIChBdG9tRFJFRiAqIGRyZWYpCit7CisgIEdMaXN0ICp3YWxrZXI7CisKKyAgYXRvbV9mdWxsX2NsZWFyICgmZHJlZi0+aGVhZGVyKTsKKyAgd2Fsa2VyID0gZHJlZi0+ZW50cmllczsKKyAgd2hpbGUgKHdhbGtlcikgeworICAgIEdMaXN0ICphdXggPSB3YWxrZXI7CisgICAgQXRvbSAqYXRvbSA9IChBdG9tICopIGF1eC0+ZGF0YTsKKworICAgIHdhbGtlciA9IGdfbGlzdF9uZXh0ICh3YWxrZXIpOworICAgIGRyZWYtPmVudHJpZXMgPSBnX2xpc3RfcmVtb3ZlX2xpbmsgKGRyZWYtPmVudHJpZXMsIGF1eCk7CisgICAgc3dpdGNoIChhdG9tLT50eXBlKSB7CisgICAgICBjYXNlIEZPVVJDQ19hbGlzOgorICAgICAgICBhdG9tX2Z1bGxfZnJlZSAoKEF0b21GdWxsICopIGF0b20pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk9VUkNDX3VybF86CisgICAgICAgIGF0b21fdXJsX2ZyZWUgKChBdG9tVVJMICopIGF0b20pOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIHdlIGRvIG5vdGhpbmcsIGJldHRlciBsZWFrIHRoYW4gY3Jhc2ggKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGdfbGlzdF9mcmVlIChhdXgpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2RpbmZfaW5pdCAoQXRvbURJTkYgKiBkaW5mLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0KQoreworICBhdG9tX2hlYWRlcl9zZXQgKCZkaW5mLT5oZWFkZXIsIEZPVVJDQ19kaW5mLCAwLCAwKTsKKyAgYXRvbV9kcmVmX2luaXQgKCZkaW5mLT5kcmVmLCBjb250ZXh0KTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fZGluZl9jbGVhciAoQXRvbURJTkYgKiBkaW5mKQoreworICBhdG9tX2NsZWFyICgmZGluZi0+aGVhZGVyKTsKKyAgYXRvbV9kcmVmX2NsZWFyICgmZGluZi0+ZHJlZik7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX21pbmZfaW5pdCAoQXRvbU1JTkYgKiBtaW5mLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0KQoreworICBhdG9tX2hlYWRlcl9zZXQgKCZtaW5mLT5oZWFkZXIsIEZPVVJDQ19taW5mLCAwLCAwKTsKKworICBtaW5mLT52bWhkID0gTlVMTDsKKyAgbWluZi0+c21oZCA9IE5VTEw7CisgIG1pbmYtPmhtaGQgPSBOVUxMOworICBtaW5mLT5nbWhkID0gTlVMTDsKKworICBpZiAoY29udGV4dC0+Zmxhdm9yID09IEFUT01TX1RSRUVfRkxBVk9SX01PVikgeworICAgIG1pbmYtPmhkbHIgPSBhdG9tX2hkbHJfbmV3IChjb250ZXh0KTsKKyAgICBtaW5mLT5oZGxyLT5jb21wb25lbnRfdHlwZSA9IEZPVVJDQ19kaGxyOworICAgIG1pbmYtPmhkbHItPmhhbmRsZXJfdHlwZSA9IEZPVVJDQ19hbGlzOworICB9IGVsc2UgeworICAgIG1pbmYtPmhkbHIgPSBOVUxMOworICB9CisgIGF0b21fZGluZl9pbml0ICgmbWluZi0+ZGluZiwgY29udGV4dCk7CisgIGF0b21fc3RibF9pbml0ICgmbWluZi0+c3RibCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX21pbmZfY2xlYXJfaGFuZGxlcnMgKEF0b21NSU5GICogbWluZikKK3sKKyAgaWYgKG1pbmYtPnZtaGQpIHsKKyAgICBhdG9tX3ZtaGRfZnJlZSAobWluZi0+dm1oZCk7CisgICAgbWluZi0+dm1oZCA9IE5VTEw7CisgIH0KKyAgaWYgKG1pbmYtPnNtaGQpIHsKKyAgICBhdG9tX3NtaGRfZnJlZSAobWluZi0+c21oZCk7CisgICAgbWluZi0+c21oZCA9IE5VTEw7CisgIH0KKyAgaWYgKG1pbmYtPmhtaGQpIHsKKyAgICBhdG9tX2htaGRfZnJlZSAobWluZi0+aG1oZCk7CisgICAgbWluZi0+aG1oZCA9IE5VTEw7CisgIH0KKyAgaWYgKG1pbmYtPmdtaGQpIHsKKyAgICBhdG9tX2dtaGRfZnJlZSAobWluZi0+Z21oZCk7CisgICAgbWluZi0+Z21oZCA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2F0b21fbWluZl9jbGVhciAoQXRvbU1JTkYgKiBtaW5mKQoreworICBhdG9tX2NsZWFyICgmbWluZi0+aGVhZGVyKTsKKyAgYXRvbV9taW5mX2NsZWFyX2hhbmRsZXJzIChtaW5mKTsKKyAgaWYgKG1pbmYtPmhkbHIpIHsKKyAgICBhdG9tX2hkbHJfZnJlZSAobWluZi0+aGRscik7CisgIH0KKyAgYXRvbV9kaW5mX2NsZWFyICgmbWluZi0+ZGluZik7CisgIGF0b21fc3RibF9jbGVhciAoJm1pbmYtPnN0YmwpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9tZGhkX2luaXQgKEF0b21NREhEICogbWRoZCkKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZtZGhkLT5oZWFkZXIsIEZPVVJDQ19tZGhkLCAwLCAwLCAwLCBmbGFncyk7CisgIGNvbW1vbl90aW1lX2luZm9faW5pdCAoJm1kaGQtPnRpbWVfaW5mbyk7CisgIC8qIHRlbXB0aW5nIGFzIGl0IG1heSBiZSB0byBzaW1wbHkgMC1pbml0aWFsaXplLAorICAgKiB0aGF0IHdpbGwgaGF2ZSB0aGUgZGVtdXhlciAoY29ycmVjdGx5KSBjb21lIHVwIHdpdGggJ2VuZycgYXMgbGFuZ3VhZ2UKKyAgICogc28gZXhwbGljaXRseSBzcGVjaWZ5IHVuZGVmaW5lZCBpbnN0ZWFkICovCisgIG1kaGQtPmxhbmd1YWdlX2NvZGUgPQorICAgICAgKCd1JyAtIDB4NjApICogMHg0MDAgKyAoJ24nIC0gMHg2MCkgKiAweDIwICsgKCdkJyAtIDB4NjApOworICBtZGhkLT5xdWFsaXR5ID0gMDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fbWRoZF9jbGVhciAoQXRvbU1ESEQgKiBtZGhkKQoreworICBhdG9tX2Z1bGxfY2xlYXIgKCZtZGhkLT5oZWFkZXIpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9tZGlhX2luaXQgKEF0b21NRElBICogbWRpYSwgQXRvbXNDb250ZXh0ICogY29udGV4dCkKK3sKKyAgYXRvbV9oZWFkZXJfc2V0ICgmbWRpYS0+aGVhZGVyLCBGT1VSQ0NfbWRpYSwgMCwgMCk7CisKKyAgYXRvbV9tZGhkX2luaXQgKCZtZGlhLT5tZGhkKTsKKyAgYXRvbV9oZGxyX2luaXQgKCZtZGlhLT5oZGxyLCBjb250ZXh0KTsKKyAgYXRvbV9taW5mX2luaXQgKCZtZGlhLT5taW5mLCBjb250ZXh0KTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fbWRpYV9jbGVhciAoQXRvbU1ESUEgKiBtZGlhKQoreworICBhdG9tX2NsZWFyICgmbWRpYS0+aGVhZGVyKTsKKyAgYXRvbV9tZGhkX2NsZWFyICgmbWRpYS0+bWRoZCk7CisgIGF0b21faGRscl9jbGVhciAoJm1kaWEtPmhkbHIpOworICBhdG9tX21pbmZfY2xlYXIgKCZtZGlhLT5taW5mKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdGtoZF9pbml0IChBdG9tVEtIRCAqIHRraGQsIEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIC8qCisgICAqIGZsYWdzIGluZm8KKyAgICogMSAtPiB0cmFjayBlbmFibGVkCisgICAqIDIgLT4gdHJhY2sgaW4gbW92aWUKKyAgICogNCAtPiB0cmFjayBpbiBwcmV2aWV3CisgICAqLworICBndWludDggZmxhZ3NbM10gPSB7IDAsIDAsIDcgfTsKKworICBhdG9tX2Z1bGxfaW5pdCAoJnRraGQtPmhlYWRlciwgRk9VUkNDX3RraGQsIDAsIDAsIDAsIGZsYWdzKTsKKworICB0a2hkLT5jcmVhdGlvbl90aW1lID0gdGtoZC0+bW9kaWZpY2F0aW9uX3RpbWUgPSBhdG9tc19nZXRfY3VycmVudF9xdF90aW1lICgpOworICB0a2hkLT5kdXJhdGlvbiA9IDA7CisgIHRraGQtPnRyYWNrX0lEID0gMDsKKyAgdGtoZC0+cmVzZXJ2ZWQgPSAwOworCisgIHRraGQtPnJlc2VydmVkMlswXSA9IHRraGQtPnJlc2VydmVkMlsxXSA9IDA7CisgIHRraGQtPmxheWVyID0gMDsKKyAgdGtoZC0+YWx0ZXJuYXRlX2dyb3VwID0gMDsKKyAgdGtoZC0+dm9sdW1lID0gMDsKKyAgdGtoZC0+cmVzZXJ2ZWQzID0gMDsKKyAgbWVtc2V0ICh0a2hkLT5tYXRyaXgsIDAsIHNpemVvZiAoZ3VpbnQzMikgKiA5KTsKKyAgdGtoZC0+bWF0cml4WzBdID0gMSA8PCAxNjsKKyAgdGtoZC0+bWF0cml4WzRdID0gMSA8PCAxNjsKKyAgdGtoZC0+bWF0cml4WzhdID0gMTYzODQgPDwgMTY7CisgIHRraGQtPndpZHRoID0gMDsKKyAgdGtoZC0+aGVpZ2h0ID0gMDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdGtoZF9jbGVhciAoQXRvbVRLSEQgKiB0a2hkKQoreworICBhdG9tX2Z1bGxfY2xlYXIgKCZ0a2hkLT5oZWFkZXIpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9pbHN0X2luaXQgKEF0b21JTFNUICogaWxzdCkKK3sKKyAgYXRvbV9oZWFkZXJfc2V0ICgmaWxzdC0+aGVhZGVyLCBGT1VSQ0NfaWxzdCwgMCwgMCk7CisgIGlsc3QtPmVudHJpZXMgPSBOVUxMOworfQorCitzdGF0aWMgQXRvbUlMU1QgKgorYXRvbV9pbHN0X25ldyAodm9pZCkKK3sKKyAgQXRvbUlMU1QgKmlsc3QgPSBnX25ldzAgKEF0b21JTFNULCAxKTsKKworICBhdG9tX2lsc3RfaW5pdCAoaWxzdCk7CisgIHJldHVybiBpbHN0OworfQorCitzdGF0aWMgdm9pZAorYXRvbV9pbHN0X2ZyZWUgKEF0b21JTFNUICogaWxzdCkKK3sKKyAgaWYgKGlsc3QtPmVudHJpZXMpCisgICAgYXRvbV9pbmZvX2xpc3RfZnJlZSAoaWxzdC0+ZW50cmllcyk7CisgIGF0b21fY2xlYXIgKCZpbHN0LT5oZWFkZXIpOworICBnX2ZyZWUgKGlsc3QpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9tZXRhX2luaXQgKEF0b21NRVRBICogbWV0YSwgQXRvbXNDb250ZXh0ICogY29udGV4dCkKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZtZXRhLT5oZWFkZXIsIEZPVVJDQ19tZXRhLCAwLCAwLCAwLCBmbGFncyk7CisgIGF0b21faGRscl9pbml0ICgmbWV0YS0+aGRsciwgY29udGV4dCk7CisgIC8qIEZJWE1FIChJU09NIHNheXMgdGhpcyBpcyBhbHdheXMgMCkgKi8KKyAgbWV0YS0+aGRsci5jb21wb25lbnRfdHlwZSA9IEZPVVJDQ19taGxyOworICBtZXRhLT5oZGxyLmhhbmRsZXJfdHlwZSA9IEZPVVJDQ19tZGlyOworICBtZXRhLT5pbHN0ID0gTlVMTDsKK30KKworc3RhdGljIEF0b21NRVRBICoKK2F0b21fbWV0YV9uZXcgKEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIEF0b21NRVRBICptZXRhID0gZ19uZXcwIChBdG9tTUVUQSwgMSk7CisKKyAgYXRvbV9tZXRhX2luaXQgKG1ldGEsIGNvbnRleHQpOworICByZXR1cm4gbWV0YTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fbWV0YV9mcmVlIChBdG9tTUVUQSAqIG1ldGEpCit7CisgIGF0b21fZnVsbF9jbGVhciAoJm1ldGEtPmhlYWRlcik7CisgIGF0b21faGRscl9jbGVhciAoJm1ldGEtPmhkbHIpOworICBpZiAobWV0YS0+aWxzdCkKKyAgICBhdG9tX2lsc3RfZnJlZSAobWV0YS0+aWxzdCk7CisgIG1ldGEtPmlsc3QgPSBOVUxMOworICBnX2ZyZWUgKG1ldGEpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV91ZHRhX2luaXRfbWV0YXRhZ3MgKEF0b21VRFRBICogdWR0YSwgQXRvbXNDb250ZXh0ICogY29udGV4dCkKK3sKKyAgaWYgKGNvbnRleHQtPmZsYXZvciAhPSBBVE9NU19UUkVFX0ZMQVZPUl8zR1ApIHsKKyAgICBpZiAoIXVkdGEtPm1ldGEpIHsKKyAgICAgIHVkdGEtPm1ldGEgPSBhdG9tX21ldGFfbmV3IChjb250ZXh0KTsKKyAgICB9CisgICAgaWYgKCF1ZHRhLT5tZXRhLT5pbHN0KSB7CisgICAgICB1ZHRhLT5tZXRhLT5pbHN0ID0gYXRvbV9pbHN0X25ldyAoKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2F0b21fdWR0YV9pbml0IChBdG9tVURUQSAqIHVkdGEsIEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIGF0b21faGVhZGVyX3NldCAoJnVkdGEtPmhlYWRlciwgRk9VUkNDX3VkdGEsIDAsIDApOworICB1ZHRhLT5tZXRhID0gTlVMTDsKKyAgdWR0YS0+Y29udGV4dCA9IGNvbnRleHQ7CisKKyAgYXRvbV91ZHRhX2luaXRfbWV0YXRhZ3MgKHVkdGEsIGNvbnRleHQpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV91ZHRhX2NsZWFyIChBdG9tVURUQSAqIHVkdGEpCit7CisgIGF0b21fY2xlYXIgKCZ1ZHRhLT5oZWFkZXIpOworICBpZiAodWR0YS0+bWV0YSkKKyAgICBhdG9tX21ldGFfZnJlZSAodWR0YS0+bWV0YSk7CisgIHVkdGEtPm1ldGEgPSBOVUxMOworICBpZiAodWR0YS0+ZW50cmllcykKKyAgICBhdG9tX2luZm9fbGlzdF9mcmVlICh1ZHRhLT5lbnRyaWVzKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdHJlZl9pbml0IChBdG9tVFJFRiAqIHRyZWYsIGd1aW50MzIgcmVmdHlwZSkKK3sKKyAgYXRvbV9oZWFkZXJfc2V0ICgmdHJlZi0+aGVhZGVyLCBGT1VSQ0NfdHJlZiwgMCwgMCk7CisgIHRyZWYtPnJlZnR5cGUgPSByZWZ0eXBlOworICBhdG9tX2FycmF5X2luaXQgKCZ0cmVmLT5lbnRyaWVzLCAxMjgpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90cmVmX2NsZWFyIChBdG9tVFJFRiAqIHRyZWYpCit7CisgIGF0b21fY2xlYXIgKCZ0cmVmLT5oZWFkZXIpOworICB0cmVmLT5yZWZ0eXBlID0gMDsKKyAgYXRvbV9hcnJheV9jbGVhciAoJnRyZWYtPmVudHJpZXMpOworfQorCitBdG9tVFJFRiAqCithdG9tX3RyZWZfbmV3IChndWludDMyIHJlZnR5cGUpCit7CisgIEF0b21UUkVGICp0cmVmOworCisgIHRyZWYgPSBnX25ldzAgKEF0b21UUkVGLCAxKTsKKyAgYXRvbV90cmVmX2luaXQgKHRyZWYsIHJlZnR5cGUpOworCisgIHJldHVybiB0cmVmOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90cmVmX2ZyZWUgKEF0b21UUkVGICogdHJlZikKK3sKKyAgYXRvbV90cmVmX2NsZWFyICh0cmVmKTsKKyAgZ19mcmVlICh0cmVmKTsKK30KKworLyogQ2xlYXIgYWRkZWQgdGFncywgYnV0IGtlZXAgdGhlIGNvbnRleHQvZmxhdm9yIHRoZSBzYW1lICovCit2b2lkCithdG9tX3VkdGFfY2xlYXJfdGFncyAoQXRvbVVEVEEgKiB1ZHRhKQoreworICBpZiAodWR0YS0+ZW50cmllcykgeworICAgIGF0b21faW5mb19saXN0X2ZyZWUgKHVkdGEtPmVudHJpZXMpOworICAgIHVkdGEtPmVudHJpZXMgPSBOVUxMOworICB9CisgIGlmICh1ZHRhLT5tZXRhICYmIHVkdGEtPm1ldGEtPmlsc3QtPmVudHJpZXMpIHsKKyAgICBhdG9tX2luZm9fbGlzdF9mcmVlICh1ZHRhLT5tZXRhLT5pbHN0LT5lbnRyaWVzKTsKKyAgICB1ZHRhLT5tZXRhLT5pbHN0LT5lbnRyaWVzID0gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorYXRvbV90YWdfZGF0YV9pbml0IChBdG9tVGFnRGF0YSAqIGRhdGEpCit7CisgIGd1aW50OCBmbGFnc1tdID0geyAwLCAwLCAwIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZkYXRhLT5oZWFkZXIsIEZPVVJDQ19kYXRhLCAwLCAwLCAwLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3RhZ19kYXRhX2NsZWFyIChBdG9tVGFnRGF0YSAqIGRhdGEpCit7CisgIGF0b21fZnVsbF9jbGVhciAoJmRhdGEtPmhlYWRlcik7CisgIGdfZnJlZSAoZGF0YS0+ZGF0YSk7CisgIGRhdGEtPmRhdGFsZW4gPSAwOworfQorCisvKgorICogRm91cmNjIGlzIHRoZSB0YWcgZm91cmNjCisgKiBmbGFncyB3aWxsIGJlIHRydW5jYXRlZCB0byAyNGJpdHMKKyAqLworc3RhdGljIEF0b21UYWcgKgorYXRvbV90YWdfbmV3IChndWludDMyIGZvdXJjYywgZ3VpbnQzMiBmbGFnc19hc191aW50KQoreworICBBdG9tVGFnICp0YWcgPSBnX25ldzAgKEF0b21UYWcsIDEpOworCisgIHRhZy0+aGVhZGVyLnR5cGUgPSBmb3VyY2M7CisgIGF0b21fdGFnX2RhdGFfaW5pdCAoJnRhZy0+ZGF0YSk7CisgIGF0b21fZnVsbF9zZXRfZmxhZ3NfYXNfdWludCAoJnRhZy0+ZGF0YS5oZWFkZXIsIGZsYWdzX2FzX3VpbnQpOworICByZXR1cm4gdGFnOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90YWdfZnJlZSAoQXRvbVRhZyAqIHRhZykKK3sKKyAgYXRvbV9jbGVhciAoJnRhZy0+aGVhZGVyKTsKKyAgYXRvbV90YWdfZGF0YV9jbGVhciAoJnRhZy0+ZGF0YSk7CisgIGdfZnJlZSAodGFnKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fbXZoZF9pbml0IChBdG9tTVZIRCAqIG12aGQpCit7CisgIGd1aW50OCBmbGFnc1szXSA9IHsgMCwgMCwgMCB9OworCisgIGF0b21fZnVsbF9pbml0ICgmKG12aGQtPmhlYWRlciksIEZPVVJDQ19tdmhkLCBzaXplb2YgKEF0b21NVkhEKSwgMCwgMCwgZmxhZ3MpOworCisgIGNvbW1vbl90aW1lX2luZm9faW5pdCAoJm12aGQtPnRpbWVfaW5mbyk7CisKKyAgbXZoZC0+cHJlZmVyZWRfcmF0ZSA9IDEgPDwgMTY7CisgIG12aGQtPnZvbHVtZSA9IDEgPDwgODsKKyAgbXZoZC0+cmVzZXJ2ZWQzID0gMDsKKyAgbWVtc2V0IChtdmhkLT5yZXNlcnZlZDQsIDAsIHNpemVvZiAoZ3VpbnQzMlsyXSkpOworCisgIG1lbXNldCAobXZoZC0+bWF0cml4LCAwLCBzaXplb2YgKGd1aW50MzJbOV0pKTsKKyAgbXZoZC0+bWF0cml4WzBdID0gMSA8PCAxNjsKKyAgbXZoZC0+bWF0cml4WzRdID0gMSA8PCAxNjsKKyAgbXZoZC0+bWF0cml4WzhdID0gMTYzODQgPDwgMTY7CisKKyAgbXZoZC0+cHJldmlld190aW1lID0gMDsKKyAgbXZoZC0+cHJldmlld19kdXJhdGlvbiA9IDA7CisgIG12aGQtPnBvc3Rlcl90aW1lID0gMDsKKyAgbXZoZC0+c2VsZWN0aW9uX3RpbWUgPSAwOworICBtdmhkLT5zZWxlY3Rpb25fZHVyYXRpb24gPSAwOworICBtdmhkLT5jdXJyZW50X3RpbWUgPSAwOworCisgIG12aGQtPm5leHRfdHJhY2tfaWQgPSAxOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9tdmhkX2NsZWFyIChBdG9tTVZIRCAqIG12aGQpCit7CisgIGF0b21fZnVsbF9jbGVhciAoJm12aGQtPmhlYWRlcik7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX21laGRfaW5pdCAoQXRvbU1FSEQgKiBtZWhkKQoreworICBndWludDggZmxhZ3NbM10gPSB7IDAsIDAsIDAgfTsKKworICBhdG9tX2Z1bGxfaW5pdCAoJm1laGQtPmhlYWRlciwgRk9VUkNDX21laGQsIDAsIDAsIDEsIGZsYWdzKTsKKyAgbWVoZC0+ZnJhZ21lbnRfZHVyYXRpb24gPSAwOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9tdmV4X2luaXQgKEF0b21NVkVYICogbXZleCkKK3sKKyAgYXRvbV9oZWFkZXJfc2V0ICgmbXZleC0+aGVhZGVyLCBGT1VSQ0NfbXZleCwgMCwgMCk7CisgIGF0b21fbWVoZF9pbml0ICgmbXZleC0+bWVoZCk7CisgIG12ZXgtPnRyZXhzID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdHJha19pbml0IChBdG9tVFJBSyAqIHRyYWssIEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIGF0b21faGVhZGVyX3NldCAoJnRyYWstPmhlYWRlciwgRk9VUkNDX3RyYWssIDAsIDApOworCisgIGF0b21fdGtoZF9pbml0ICgmdHJhay0+dGtoZCwgY29udGV4dCk7CisgIHRyYWstPmNvbnRleHQgPSBjb250ZXh0OworICBhdG9tX3VkdGFfaW5pdCAoJnRyYWstPnVkdGEsIGNvbnRleHQpOworICB0cmFrLT5lZHRzID0gTlVMTDsKKyAgYXRvbV9tZGlhX2luaXQgKCZ0cmFrLT5tZGlhLCBjb250ZXh0KTsKKyAgdHJhay0+dHJlZiA9IE5VTEw7Cit9CisKK0F0b21UUkFLICoKK2F0b21fdHJha19uZXcgKEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIEF0b21UUkFLICp0cmFrID0gZ19uZXcwIChBdG9tVFJBSywgMSk7CisKKyAgYXRvbV90cmFrX2luaXQgKHRyYWssIGNvbnRleHQpOworICByZXR1cm4gdHJhazsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdHJha19jbGVhciAoQXRvbVRSQUsgKiB0cmFrKQoreworICBhdG9tX2NsZWFyICgmdHJhay0+aGVhZGVyKTsKKyAgYXRvbV90a2hkX2NsZWFyICgmdHJhay0+dGtoZCk7CisgIGlmICh0cmFrLT5lZHRzKQorICAgIGF0b21fZWR0c19mcmVlICh0cmFrLT5lZHRzKTsKKyAgYXRvbV91ZHRhX2NsZWFyICgmdHJhay0+dWR0YSk7CisgIGF0b21fbWRpYV9jbGVhciAoJnRyYWstPm1kaWEpOworICBpZiAodHJhay0+dHJlZikKKyAgICBhdG9tX3RyZWZfZnJlZSAodHJhay0+dHJlZik7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3RyYWtfZnJlZSAoQXRvbVRSQUsgKiB0cmFrKQoreworICBhdG9tX3RyYWtfY2xlYXIgKHRyYWspOworICBnX2ZyZWUgKHRyYWspOworfQorCisKK3N0YXRpYyB2b2lkCithdG9tX21vb3ZfaW5pdCAoQXRvbU1PT1YgKiBtb292LCBBdG9tc0NvbnRleHQgKiBjb250ZXh0KQoreworICBhdG9tX2hlYWRlcl9zZXQgKCYobW9vdi0+aGVhZGVyKSwgRk9VUkNDX21vb3YsIDAsIDApOworICBhdG9tX212aGRfaW5pdCAoJihtb292LT5tdmhkKSk7CisgIGF0b21fbXZleF9pbml0ICgmKG1vb3YtPm12ZXgpKTsKKyAgYXRvbV91ZHRhX2luaXQgKCZtb292LT51ZHRhLCBjb250ZXh0KTsKKyAgbW9vdi0+dHJha3MgPSBOVUxMOworICBtb292LT5jb250ZXh0ID0gKmNvbnRleHQ7Cit9CisKK0F0b21NT09WICoKK2F0b21fbW9vdl9uZXcgKEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIEF0b21NT09WICptb292ID0gZ19uZXcwIChBdG9tTU9PViwgMSk7CisKKyAgYXRvbV9tb292X2luaXQgKG1vb3YsIGNvbnRleHQpOworICByZXR1cm4gbW9vdjsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdHJleF9mcmVlIChBdG9tVFJFWCAqIHRyZXgpCit7CisgIGF0b21fZnVsbF9jbGVhciAoJnRyZXgtPmhlYWRlcik7CisgIGdfZnJlZSAodHJleCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX212ZXhfY2xlYXIgKEF0b21NVkVYICogbXZleCkKK3sKKyAgR0xpc3QgKndhbGtlcjsKKworICBhdG9tX2NsZWFyICgmbXZleC0+aGVhZGVyKTsKKyAgd2Fsa2VyID0gbXZleC0+dHJleHM7CisgIHdoaWxlICh3YWxrZXIpIHsKKyAgICBhdG9tX3RyZXhfZnJlZSAoKEF0b21UUkVYICopIHdhbGtlci0+ZGF0YSk7CisgICAgd2Fsa2VyID0gZ19saXN0X25leHQgKHdhbGtlcik7CisgIH0KKyAgZ19saXN0X2ZyZWUgKG12ZXgtPnRyZXhzKTsKKyAgbXZleC0+dHJleHMgPSBOVUxMOworfQorCit2b2lkCithdG9tX21vb3ZfZnJlZSAoQXRvbU1PT1YgKiBtb292KQoreworICBHTGlzdCAqd2Fsa2VyOworCisgIGF0b21fY2xlYXIgKCZtb292LT5oZWFkZXIpOworICBhdG9tX212aGRfY2xlYXIgKCZtb292LT5tdmhkKTsKKworICB3YWxrZXIgPSBtb292LT50cmFrczsKKyAgd2hpbGUgKHdhbGtlcikgeworICAgIGF0b21fdHJha19mcmVlICgoQXRvbVRSQUsgKikgd2Fsa2VyLT5kYXRhKTsKKyAgICB3YWxrZXIgPSBnX2xpc3RfbmV4dCAod2Fsa2VyKTsKKyAgfQorICBnX2xpc3RfZnJlZSAobW9vdi0+dHJha3MpOworICBtb292LT50cmFrcyA9IE5VTEw7CisKKyAgYXRvbV91ZHRhX2NsZWFyICgmbW9vdi0+dWR0YSk7CisgIGF0b21fbXZleF9jbGVhciAoJm1vb3YtPm12ZXgpOworCisgIGdfZnJlZSAobW9vdik7Cit9CisKKy8qIC0tIGVuZCBvZiBpbml0IC8gZnJlZSAtLSAqLworCisvKiAtLSBjb3B5IGRhdGEgZnVuY3Rpb25zIC0tICovCisKK3N0YXRpYyBndWludDgKK2F0b21fZnVsbF9nZXRfdmVyc2lvbiAoQXRvbUZ1bGwgKiBmdWxsKQoreworICByZXR1cm4gZnVsbC0+dmVyc2lvbjsKK30KKworc3RhdGljIGd1aW50NjQKK2NvbW1vbl90aW1lX2luZm9fY29weV9kYXRhIChUaW1lSW5mbyAqIHRpLCBnYm9vbGVhbiB0cnVuY190b18zMiwKKyAgICBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICh0cnVuY190b18zMikgeworICAgIHByb3BfY29weV91aW50MzIgKChndWludDMyKSB0aS0+Y3JlYXRpb25fdGltZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIHByb3BfY29weV91aW50MzIgKChndWludDMyKSB0aS0+bW9kaWZpY2F0aW9uX3RpbWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgICBwcm9wX2NvcHlfdWludDMyICh0aS0+dGltZXNjYWxlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgcHJvcF9jb3B5X3VpbnQzMiAoKGd1aW50MzIpIHRpLT5kdXJhdGlvbiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICB9IGVsc2UgeworICAgIHByb3BfY29weV91aW50NjQgKHRpLT5jcmVhdGlvbl90aW1lLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgcHJvcF9jb3B5X3VpbnQ2NCAodGktPm1vZGlmaWNhdGlvbl90aW1lLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgcHJvcF9jb3B5X3VpbnQzMiAodGktPnRpbWVzY2FsZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIHByb3BfY29weV91aW50NjQgKHRpLT5kdXJhdGlvbiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICB9CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgdm9pZAorYXRvbV93cml0ZV9zaXplIChndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCwKKyAgICBndWludDY0IGF0b21fcG9zKQoreworICAvKiB0aGlzIG9ubHkgd29ya3MgZm9yIG5vbi1leHRlbmRlZCBhdG9tIHNpemUsIHdoaWNoIGlzIE9LCisgICAqICh0aG91Z2ggaXQgY291bGQgYmUgbWFkZSB0byBkbyBtZW1fbW92ZSwgZXRjIGFuZCB3cml0ZSBleHRlbmRlZCBzaXplKSAqLworICBwcm9wX2NvcHlfdWludDMyICgqb2Zmc2V0IC0gYXRvbV9wb3MsIGJ1ZmZlciwgc2l6ZSwgJmF0b21fcG9zKTsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fY29weV9lbXB0eSAoQXRvbSAqIGF0b20sIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBwcm9wX2NvcHlfdWludDMyICgwLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK2d1aW50NjQKK2F0b21fY29weV9kYXRhIChBdG9tICogYXRvbSwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICAvKiBjb3BpZXMgdHlwZSBhbmQgc2l6ZSAqLworICBwcm9wX2NvcHlfdWludDMyIChhdG9tLT5zaXplLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV9mb3VyY2MgKGF0b20tPnR5cGUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICAvKiBleHRlbmRlZCBzaXplIG5lZWRlZCAqLworICBpZiAoYXRvbS0+c2l6ZSA9PSAxKSB7CisgICAgLyogcmVhbGx5IHNob3VsZCBub3QgaGFwcGVuIG90aGVyIHRoYW4gd2l0aCBtZGF0IGF0b207CisgICAgICogd291bGQgYmUgYSBwcm9ibGVtIGZvciBzaXplIChyZSl3cml0ZSBjb2RlLCBub3QgdG8gbWVudGlvbiBtZW1vcnkgKi8KKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCAoYXRvbS0+dHlwZSA9PSBGT1VSQ0NfbWRhdCwgMCk7CisgICAgcHJvcF9jb3B5X3VpbnQ2NCAoYXRvbS0+ZXh0ZW5kZWRfc2l6ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICB9CisKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX2Z1bGxfY29weV9kYXRhIChBdG9tRnVsbCAqIGF0b20sIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fY29weV9kYXRhICgmYXRvbS0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHByb3BfY29weV91aW50OCAoYXRvbS0+dmVyc2lvbiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDhfYXJyYXkgKGF0b20tPmZsYWdzLCAzLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX2luZm9fbGlzdF9jb3B5X2RhdGEgKEdMaXN0ICogYWksIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICB3aGlsZSAoYWkpIHsKKyAgICBBdG9tSW5mbyAqaW5mbyA9IChBdG9tSW5mbyAqKSBhaS0+ZGF0YTsKKworICAgIGlmICghaW5mby0+Y29weV9kYXRhX2Z1bmMgKGluZm8tPmF0b20sIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFpID0gZ19saXN0X25leHQgKGFpKTsKKyAgfQorCisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV9kYXRhX2NvcHlfZGF0YSAoQXRvbURhdGEgKiBkYXRhLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFhdG9tX2NvcHlfZGF0YSAoJmRhdGEtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGRhdGEtPmRhdGFsZW4pCisgICAgcHJvcF9jb3B5X3VpbnQ4X2FycmF5IChkYXRhLT5kYXRhLCBkYXRhLT5kYXRhbGVuLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX3V1aWRfY29weV9kYXRhIChBdG9tVVVJRCAqIHV1aWQsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fY29weV9kYXRhICgmdXVpZC0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBwcm9wX2NvcHlfdWludDhfYXJyYXkgKHV1aWQtPnV1aWQsIDE2LCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIGlmICh1dWlkLT5kYXRhbGVuKQorICAgIHByb3BfY29weV91aW50OF9hcnJheSAodXVpZC0+ZGF0YSwgdXVpZC0+ZGF0YWxlbiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitndWludDY0CithdG9tX2Z0eXBfY29weV9kYXRhIChBdG9tRlRZUCAqIGZ0eXAsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fY29weV9kYXRhICgmZnR5cC0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBwcm9wX2NvcHlfZm91cmNjIChmdHlwLT5tYWpvcl9icmFuZCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyIChmdHlwLT52ZXJzaW9uLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgcHJvcF9jb3B5X2ZvdXJjY19hcnJheSAoZnR5cC0+Y29tcGF0aWJsZV9icmFuZHMsIGZ0eXAtPmNvbXBhdGlibGVfYnJhbmRzX3NpemUsCisgICAgICBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK2d1aW50NjQKK2F0b21fbXZoZF9jb3B5X2RhdGEgKEF0b21NVkhEICogYXRvbSwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ4IHZlcnNpb247CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fZnVsbF9jb3B5X2RhdGEgKCYoYXRvbS0+aGVhZGVyKSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB2ZXJzaW9uID0gYXRvbV9mdWxsX2dldF92ZXJzaW9uICgmKGF0b20tPmhlYWRlcikpOworICBpZiAodmVyc2lvbiA9PSAwKSB7CisgICAgY29tbW9uX3RpbWVfaW5mb19jb3B5X2RhdGEgKCZhdG9tLT50aW1lX2luZm8sIFRSVUUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDEpIHsKKyAgICBjb21tb25fdGltZV9pbmZvX2NvcHlfZGF0YSAoJmF0b20tPnRpbWVfaW5mbywgRkFMU0UsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgfSBlbHNlIHsKKyAgICAqb2Zmc2V0ID0gb3JpZ2luYWxfb2Zmc2V0OworICAgIHJldHVybiAwOworICB9CisKKyAgcHJvcF9jb3B5X3VpbnQzMiAoYXRvbS0+cHJlZmVyZWRfcmF0ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDE2IChhdG9tLT52b2x1bWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQxNiAoYXRvbS0+cmVzZXJ2ZWQzLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MzJfYXJyYXkgKGF0b20tPnJlc2VydmVkNCwgMiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyX2FycmF5IChhdG9tLT5tYXRyaXgsIDksIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQzMiAoYXRvbS0+cHJldmlld190aW1lLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MzIgKGF0b20tPnByZXZpZXdfZHVyYXRpb24sIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQzMiAoYXRvbS0+cG9zdGVyX3RpbWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQzMiAoYXRvbS0+c2VsZWN0aW9uX3RpbWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQzMiAoYXRvbS0+c2VsZWN0aW9uX2R1cmF0aW9uLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MzIgKGF0b20tPmN1cnJlbnRfdGltZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIHByb3BfY29weV91aW50MzIgKGF0b20tPm5leHRfdHJhY2tfaWQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fdGtoZF9jb3B5X2RhdGEgKEF0b21US0hEICogdGtoZCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJnRraGQtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoYXRvbV9mdWxsX2dldF92ZXJzaW9uICgmdGtoZC0+aGVhZGVyKSA9PSAwKSB7CisgICAgcHJvcF9jb3B5X3VpbnQzMiAoKGd1aW50MzIpIHRraGQtPmNyZWF0aW9uX3RpbWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgICBwcm9wX2NvcHlfdWludDMyICgoZ3VpbnQzMikgdGtoZC0+bW9kaWZpY2F0aW9uX3RpbWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgICBwcm9wX2NvcHlfdWludDMyICh0a2hkLT50cmFja19JRCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIHByb3BfY29weV91aW50MzIgKHRraGQtPnJlc2VydmVkLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgcHJvcF9jb3B5X3VpbnQzMiAoKGd1aW50MzIpIHRraGQtPmR1cmF0aW9uLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIH0gZWxzZSB7CisgICAgcHJvcF9jb3B5X3VpbnQ2NCAodGtoZC0+Y3JlYXRpb25fdGltZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIHByb3BfY29weV91aW50NjQgKHRraGQtPm1vZGlmaWNhdGlvbl90aW1lLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgcHJvcF9jb3B5X3VpbnQzMiAodGtoZC0+dHJhY2tfSUQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgICBwcm9wX2NvcHlfdWludDMyICh0a2hkLT5yZXNlcnZlZCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIHByb3BfY29weV91aW50NjQgKHRraGQtPmR1cmF0aW9uLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyX2FycmF5ICh0a2hkLT5yZXNlcnZlZDIsIDIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQxNiAodGtoZC0+bGF5ZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQxNiAodGtoZC0+YWx0ZXJuYXRlX2dyb3VwLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKHRraGQtPnZvbHVtZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDE2ICh0a2hkLT5yZXNlcnZlZDMsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQzMl9hcnJheSAodGtoZC0+bWF0cml4LCA5LCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgcHJvcF9jb3B5X3VpbnQzMiAodGtoZC0+d2lkdGgsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQzMiAodGtoZC0+aGVpZ2h0LCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX2hkbHJfY29weV9kYXRhIChBdG9tSERMUiAqIGhkbHIsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fZnVsbF9jb3B5X2RhdGEgKCZoZGxyLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcHJvcF9jb3B5X2ZvdXJjYyAoaGRsci0+Y29tcG9uZW50X3R5cGUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X2ZvdXJjYyAoaGRsci0+aGFuZGxlcl90eXBlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV9mb3VyY2MgKGhkbHItPm1hbnVmYWN0dXJlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyIChoZGxyLT5mbGFncywgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyIChoZGxyLT5mbGFnc19tYXNrLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgaWYgKGhkbHItPmZsYXZvciA9PSBBVE9NU19UUkVFX0ZMQVZPUl9NT1YpIHsKKyAgICBwcm9wX2NvcHlfc2l6ZV9zdHJpbmcgKChndWludDggKikgaGRsci0+bmFtZSwgc3RybGVuIChoZGxyLT5uYW1lKSwgYnVmZmVyLAorICAgICAgICBzaXplLCBvZmZzZXQpOworICB9IGVsc2UgeworICAgIC8qIGFzc3VtZSBpc29tZWRpYSBiYXNlIGlzIG1vcmUgZ2VuZXJpYyBhbmQgdXNlIG51bGwgdGVybWluYXRlZCAqLworICAgIHByb3BfY29weV9udWxsX3Rlcm1pbmF0ZWRfc3RyaW5nIChoZGxyLT5uYW1lLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fdm1oZF9jb3B5X2RhdGEgKEF0b21WTUhEICogdm1oZCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJnZtaGQtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcHJvcF9jb3B5X3VpbnQxNiAodm1oZC0+Z3JhcGhpY3NfbW9kZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDE2X2FycmF5ICh2bWhkLT5vcGNvbG9yLCAzLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuIG9yaWdpbmFsX29mZnNldCAtICpvZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX3NtaGRfY29weV9kYXRhIChBdG9tU01IRCAqIHNtaGQsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fZnVsbF9jb3B5X2RhdGEgKCZzbWhkLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisgIHByb3BfY29weV91aW50MTYgKHNtaGQtPmJhbGFuY2UsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQxNiAoc21oZC0+cmVzZXJ2ZWQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gb3JpZ2luYWxfb2Zmc2V0IC0gKm9mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21faG1oZF9jb3B5X2RhdGEgKEF0b21ITUhEICogaG1oZCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJmhtaGQtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcHJvcF9jb3B5X3VpbnQxNiAoaG1oZC0+bWF4X3BkdV9zaXplLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKGhtaGQtPmF2Z19wZHVfc2l6ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyIChobWhkLT5tYXhfYml0cmF0ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyIChobWhkLT5hdmdfYml0cmF0ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyIChobWhkLT5zbGlkaW5nX2F2Z19iaXRyYXRlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuIG9yaWdpbmFsX29mZnNldCAtICpvZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX3RjbWlfY29weV9kYXRhIChBdG9tVENNSSAqIHRjbWksIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fZnVsbF9jb3B5X2RhdGEgKCZ0Y21pLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisgIHByb3BfY29weV91aW50MTYgKHRjbWktPnRleHRfZm9udCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDE2ICh0Y21pLT50ZXh0X2ZhY2UsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQxNiAodGNtaS0+dGV4dF9zaXplLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKHRjbWktPnRleHRfY29sb3JbMF0sIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQxNiAodGNtaS0+dGV4dF9jb2xvclsxXSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDE2ICh0Y21pLT50ZXh0X2NvbG9yWzJdLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKHRjbWktPmJnX2NvbG9yWzBdLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKHRjbWktPmJnX2NvbG9yWzFdLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKHRjbWktPmJnX2NvbG9yWzJdLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIC8qIHJlc2VydmVkICovCisgIHByb3BfY29weV91aW50MTYgKDAsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3NpemVfc3RyaW5nICgoZ3VpbnQ4ICopIHRjbWktPmZvbnRfbmFtZSwgc3RybGVuICh0Y21pLT5mb250X25hbWUpLAorICAgICAgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiBvcmlnaW5hbF9vZmZzZXQgLSAqb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV90bWNkX2NvcHlfZGF0YSAoQXRvbVRNQ0QgKiB0bWNkLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFhdG9tX2NvcHlfZGF0YSAoJnRtY2QtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFhdG9tX3RjbWlfY29weV9kYXRhICgmdG1jZC0+dGNtaSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gb3JpZ2luYWxfb2Zmc2V0IC0gKm9mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fZ21pbl9jb3B5X2RhdGEgKEF0b21HTUlOICogZ21pbiwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJmdtaW4tPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcHJvcF9jb3B5X3VpbnQxNiAoZ21pbi0+Z3JhcGhpY3NfbW9kZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDE2IChnbWluLT5vcGNvbG9yWzBdLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKGdtaW4tPm9wY29sb3JbMV0sIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQxNiAoZ21pbi0+b3Bjb2xvclsyXSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDggKGdtaW4tPmJhbGFuY2UsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgLyogcmVzZXJ2ZWQgKi8KKyAgcHJvcF9jb3B5X3VpbnQ4ICgwLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuIG9yaWdpbmFsX29mZnNldCAtICpvZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX2dtaGRfY29weV9kYXRhIChBdG9tR01IRCAqIGdtaGQsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fY29weV9kYXRhICgmZ21oZC0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIWF0b21fZ21pbl9jb3B5X2RhdGEgKCZnbWhkLT5nbWluLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIWF0b21fdG1jZF9jb3B5X2RhdGEgKCZnbWhkLT50bWNkLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiBvcmlnaW5hbF9vZmZzZXQgLSAqb2Zmc2V0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2F0b21fdXJsX3NhbWVfZmlsZV9mbGFnIChBdG9tVVJMICogdXJsKQoreworICByZXR1cm4gKHVybC0+aGVhZGVyLmZsYWdzWzJdICYgMHgxKSA9PSAxOworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV91cmxfY29weV9kYXRhIChBdG9tVVJMICogdXJsLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFhdG9tX2Z1bGxfY29weV9kYXRhICgmdXJsLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFhdG9tX3VybF9zYW1lX2ZpbGVfZmxhZyAodXJsKSkgeworICAgIHByb3BfY29weV9udWxsX3Rlcm1pbmF0ZWRfc3RyaW5nICh1cmwtPmxvY2F0aW9uLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gb3JpZ2luYWxfb2Zmc2V0IC0gKm9mZnNldDsKK30KKworZ3VpbnQ2NAorYXRvbV9zdHRzX2NvcHlfZGF0YSAoQXRvbVNUVFMgKiBzdHRzLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisgIGd1aW50IGk7CisKKyAgaWYgKCFhdG9tX2Z1bGxfY29weV9kYXRhICgmc3R0cy0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHByb3BfY29weV91aW50MzIgKGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0dHMtPmVudHJpZXMpLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIC8qIG1pbmltaXplIHJlYWxsb2MgKi8KKyAgcHJvcF9jb3B5X2Vuc3VyZV9idWZmZXIgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LAorICAgICAgOCAqIGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0dHMtPmVudHJpZXMpKTsKKyAgZm9yIChpID0gMDsgaSA8IGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0dHMtPmVudHJpZXMpOyBpKyspIHsKKyAgICBTVFRTRW50cnkgKmVudHJ5ID0gJmF0b21fYXJyYXlfaW5kZXggKCZzdHRzLT5lbnRyaWVzLCBpKTsKKworICAgIHByb3BfY29weV91aW50MzIgKGVudHJ5LT5zYW1wbGVfY291bnQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgICBwcm9wX2NvcHlfaW50MzIgKGVudHJ5LT5zYW1wbGVfZGVsdGEsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgfQorCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV9zYW1wbGVfZW50cnlfY29weV9kYXRhIChTYW1wbGVUYWJsZUVudHJ5ICogc2UsIGd1aW50OCAqKiBidWZmZXIsCisgICAgZ3VpbnQ2NCAqIHNpemUsIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fY29weV9kYXRhICgmc2UtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDhfYXJyYXkgKHNlLT5yZXNlcnZlZCwgNiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDE2IChzZS0+ZGF0YV9yZWZlcmVuY2VfaW5kZXgsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fZXNkc19jb3B5X2RhdGEgKEF0b21FU0RTICogZXNkcywgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJmVzZHMtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFkZXNjX2VzX2Rlc2NyaXB0b3JfY29weV9kYXRhICgmZXNkcy0+ZXMsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX2ZybWFfY29weV9kYXRhIChBdG9tRlJNQSAqIGZybWEsIGd1aW50OCAqKiBidWZmZXIsCisgICAgZ3VpbnQ2NCAqIHNpemUsIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fY29weV9kYXRhICgmKGZybWEtPmhlYWRlciksIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkKKyAgICByZXR1cm4gMDsKKworICBwcm9wX2NvcHlfZm91cmNjIChmcm1hLT5tZWRpYV90eXBlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX2hpbnRfc2FtcGxlX2VudHJ5X2NvcHlfZGF0YSAoQXRvbUhpbnRTYW1wbGVFbnRyeSAqIGhzZSwgZ3VpbnQ4ICoqIGJ1ZmZlciwKKyAgICBndWludDY0ICogc2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9zYW1wbGVfZW50cnlfY29weV9kYXRhICgmaHNlLT5zZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyIChoc2UtPnNpemUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQ4X2FycmF5IChoc2UtPmRhdGEsIGhzZS0+c2l6ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorc2FtcGxlX2VudHJ5X21wNGFfY29weV9kYXRhIChTYW1wbGVUYWJsZUVudHJ5TVA0QSAqIG1wNGEsIGd1aW50OCAqKiBidWZmZXIsCisgICAgZ3VpbnQ2NCAqIHNpemUsIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fc2FtcGxlX2VudHJ5X2NvcHlfZGF0YSAoJm1wNGEtPnNlLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHByb3BfY29weV91aW50MTYgKG1wNGEtPnZlcnNpb24sIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQxNiAobXA0YS0+cmV2aXNpb25fbGV2ZWwsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQzMiAobXA0YS0+dmVuZG9yLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKG1wNGEtPmNoYW5uZWxzLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKG1wNGEtPnNhbXBsZV9zaXplLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKG1wNGEtPmNvbXByZXNzaW9uX2lkLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKG1wNGEtPnBhY2tldF9zaXplLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MzIgKG1wNGEtPnNhbXBsZV9yYXRlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgLyogdGhpcyBzaG91bGQgYWx3YXlzIGJlIDAgZm9yIG1wNCBmbGF2b3IgKi8KKyAgaWYgKG1wNGEtPnZlcnNpb24gPT0gMSkgeworICAgIHByb3BfY29weV91aW50MzIgKG1wNGEtPnNhbXBsZXNfcGVyX3BhY2tldCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIHByb3BfY29weV91aW50MzIgKG1wNGEtPmJ5dGVzX3Blcl9wYWNrZXQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgICBwcm9wX2NvcHlfdWludDMyIChtcDRhLT5ieXRlc19wZXJfZnJhbWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgICBwcm9wX2NvcHlfdWludDMyIChtcDRhLT5ieXRlc19wZXJfc2FtcGxlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIH0KKworICBpZiAobXA0YS0+ZXh0ZW5zaW9uX2F0b21zKSB7CisgICAgaWYgKCFhdG9tX2luZm9fbGlzdF9jb3B5X2RhdGEgKG1wNGEtPmV4dGVuc2lvbl9hdG9tcywgYnVmZmVyLCBzaXplLCBvZmZzZXQpKQorICAgICAgcmV0dXJuIDA7CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK3NhbXBsZV9lbnRyeV9tcDR2X2NvcHlfZGF0YSAoU2FtcGxlVGFibGVFbnRyeU1QNFYgKiBtcDR2LCBndWludDggKiogYnVmZmVyLAorICAgIGd1aW50NjQgKiBzaXplLCBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFhdG9tX3NhbXBsZV9lbnRyeV9jb3B5X2RhdGEgKCZtcDR2LT5zZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDE2IChtcDR2LT52ZXJzaW9uLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKG1wNHYtPnJldmlzaW9uX2xldmVsLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV9mb3VyY2MgKG1wNHYtPnZlbmRvciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyIChtcDR2LT50ZW1wb3JhbF9xdWFsaXR5LCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MzIgKG1wNHYtPnNwYXRpYWxfcXVhbGl0eSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIHByb3BfY29weV91aW50MTYgKG1wNHYtPndpZHRoLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKG1wNHYtPmhlaWdodCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIHByb3BfY29weV91aW50MzIgKG1wNHYtPmhvcml6b250YWxfcmVzb2x1dGlvbiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyIChtcDR2LT52ZXJ0aWNhbF9yZXNvbHV0aW9uLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MzIgKG1wNHYtPmRhdGFzaXplLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgcHJvcF9jb3B5X3VpbnQxNiAobXA0di0+ZnJhbWVfY291bnQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICBwcm9wX2NvcHlfZml4ZWRfc2l6ZV9zdHJpbmcgKChndWludDggKikgbXA0di0+Y29tcHJlc3NvciwgMzIsIGJ1ZmZlciwgc2l6ZSwKKyAgICAgIG9mZnNldCk7CisKKyAgcHJvcF9jb3B5X3VpbnQxNiAobXA0di0+ZGVwdGgsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQxNiAobXA0di0+Y29sb3JfdGFibGVfaWQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICAvKiBleHRyYSBhdG9tcyAqLworICBpZiAobXA0di0+ZXh0ZW5zaW9uX2F0b21zICYmCisgICAgICAhYXRvbV9pbmZvX2xpc3RfY29weV9kYXRhIChtcDR2LT5leHRlbnNpb25fYXRvbXMsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkKKyAgICByZXR1cm4gMDsKKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK3NhbXBsZV9lbnRyeV90eDNnX2NvcHlfZGF0YSAoU2FtcGxlVGFibGVFbnRyeVRYM0cgKiB0eDNnLCBndWludDggKiogYnVmZmVyLAorICAgIGd1aW50NjQgKiBzaXplLCBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFhdG9tX3NhbXBsZV9lbnRyeV9jb3B5X2RhdGEgKCZ0eDNnLT5zZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyICh0eDNnLT5kaXNwbGF5X2ZsYWdzLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgLyogcmVzZXJ2ZWQgKi8KKyAgcHJvcF9jb3B5X3VpbnQ4ICgxLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50OCAoLTEsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQzMiAoMCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIHByb3BfY29weV91aW50NjQgKHR4M2ctPmRlZmF1bHRfdGV4dF9ib3gsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICAvKiByZXNlcnZlZCAqLworICBwcm9wX2NvcHlfdWludDMyICgwLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgcHJvcF9jb3B5X3VpbnQxNiAodHgzZy0+Zm9udF9pZCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDggKHR4M2ctPmZvbnRfZmFjZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDggKHR4M2ctPmZvbnRfc2l6ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyICh0eDNnLT5mb3JlZ3JvdW5kX2NvbG9yX3JnYmEsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICAvKiBpdCBtdXN0IGhhdmUgYSBmb250dGFibGUgYXRvbSAqLworICB7CisgICAgQXRvbSBhdG9tOworCisgICAgYXRvbV9oZWFkZXJfc2V0ICgmYXRvbSwgRk9VUkNDX2Z0YWIsIDE4LCAwKTsKKyAgICBpZiAoIWF0b21fY29weV9kYXRhICgmYXRvbSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKQorICAgICAgcmV0dXJuIDA7CisgICAgcHJvcF9jb3B5X3VpbnQxNiAoMSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOyAvKiBDb3VudCBtdXN0IGJlIDEgKi8KKyAgICBwcm9wX2NvcHlfdWludDE2ICgxLCBidWZmZXIsIHNpemUsIG9mZnNldCk7IC8qIEZvbnQgaWQ6IDEgKi8KKyAgICBwcm9wX2NvcHlfc2l6ZV9zdHJpbmcgKChndWludDggKikgIlNlcmlmIiwgNSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CitzYW1wbGVfZW50cnlfdG1jZF9jb3B5X2RhdGEgKFNhbXBsZVRhYmxlRW50cnlUTUNEICogdG1jZCwgZ3VpbnQ4ICoqIGJ1ZmZlciwKKyAgICBndWludDY0ICogc2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9zYW1wbGVfZW50cnlfY29weV9kYXRhICgmdG1jZC0+c2UsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgLyogcmVzZXJ2ZWQgKi8KKyAgcHJvcF9jb3B5X3VpbnQzMiAoMCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIHByb3BfY29weV91aW50MzIgKHRtY2QtPnRjX2ZsYWdzLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MzIgKHRtY2QtPnRpbWVzY2FsZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyICh0bWNkLT5mcmFtZV9kdXJhdGlvbiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDggKHRtY2QtPm5fZnJhbWVzLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgLyogcmVzZXJ2ZWQgKi8KKyAgcHJvcF9jb3B5X3VpbnQ4ICgwLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHsKKyAgICBBdG9tIGF0b207CisgICAgZ3VpbnQ2NCBuYW1lX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgICBhdG9tX2hlYWRlcl9zZXQgKCZhdG9tLCBGT1VSQ0NfbmFtZSwgMCwgMCk7CisgICAgaWYgKCFhdG9tX2NvcHlfZGF0YSAoJmF0b20sIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkKKyAgICAgIHJldHVybiAwOworICAgIHByb3BfY29weV91aW50MTYgKHN0cmxlbiAodG1jZC0+bmFtZS5uYW1lKSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIHByb3BfY29weV91aW50MTYgKHRtY2QtPm5hbWUubGFuZ3VhZ2VfY29kZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIHByb3BfY29weV9maXhlZF9zaXplX3N0cmluZyAoKGd1aW50OCAqKSB0bWNkLT5uYW1lLm5hbWUsCisgICAgICAgIHN0cmxlbiAodG1jZC0+bmFtZS5uYW1lKSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgICAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgbmFtZV9vZmZzZXQpOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK2d1aW50NjQKK2F0b21fc3Rzel9jb3B5X2RhdGEgKEF0b21TVFNaICogc3RzeiwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworICBndWludCBpOworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJnN0c3otPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyIChzdHN6LT5zYW1wbGVfc2l6ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyIChzdHN6LT50YWJsZV9zaXplLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIGlmIChzdHN6LT5zYW1wbGVfc2l6ZSA9PSAwKSB7CisgICAgLyogbWluaW1pemUgcmVhbGxvYyAqLworICAgIHByb3BfY29weV9lbnN1cmVfYnVmZmVyIChidWZmZXIsIHNpemUsIG9mZnNldCwgNCAqIHN0c3otPnRhYmxlX3NpemUpOworICAgIC8qIGVudHJ5IGNvdW50IG11c3QgbWF0Y2ggc2FtcGxlIGNvdW50ICovCisgICAgZ19hc3NlcnQgKGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0c3otPmVudHJpZXMpID09IHN0c3otPnRhYmxlX3NpemUpOworICAgIGZvciAoaSA9IDA7IGkgPCBhdG9tX2FycmF5X2dldF9sZW4gKCZzdHN6LT5lbnRyaWVzKTsgaSsrKSB7CisgICAgICBwcm9wX2NvcHlfdWludDMyIChhdG9tX2FycmF5X2luZGV4ICgmc3Rzei0+ZW50cmllcywgaSksIGJ1ZmZlciwgc2l6ZSwKKyAgICAgICAgICBvZmZzZXQpOworICAgIH0KKyAgfQorCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitndWludDY0CithdG9tX3N0c2NfY29weV9kYXRhIChBdG9tU1RTQyAqIHN0c2MsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKyAgZ3VpbnQgaSwgbGVuOworICBnYm9vbGVhbiBsYXN0X2VudHJpZXNfbWVyZ2VkID0gRkFMU0U7CisKKyAgaWYgKCFhdG9tX2Z1bGxfY29weV9kYXRhICgmc3RzYy0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qIExhc3QgdHdvIGVudHJpZXMgbWlnaHQgYmUgdGhlIHNhbWUgc2l6ZSBoZXJlIGFzIHdlIG9ubHkgbWVyZ2Ugb25jZSB0aGUKKyAgICogbmV4dCBjaHVuayBpcyBzdGFydGVkICovCisgIGlmICgobGVuID0gYXRvbV9hcnJheV9nZXRfbGVuICgmc3RzYy0+ZW50cmllcykpID4gMSAmJgorICAgICAgKChhdG9tX2FycmF5X2luZGV4ICgmc3RzYy0+ZW50cmllcywgbGVuIC0gMSkpLnNhbXBsZXNfcGVyX2NodW5rID09CisgICAgICAgICAgKGF0b21fYXJyYXlfaW5kZXggKCZzdHNjLT5lbnRyaWVzLCBsZW4gLSAyKSkuc2FtcGxlc19wZXJfY2h1bmspKSB7CisgICAgc3RzYy0+ZW50cmllcy5sZW4tLTsKKyAgICBsYXN0X2VudHJpZXNfbWVyZ2VkID0gVFJVRTsKKyAgfQorCisgIHByb3BfY29weV91aW50MzIgKGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0c2MtPmVudHJpZXMpLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIC8qIG1pbmltaXplIHJlYWxsb2MgKi8KKyAgcHJvcF9jb3B5X2Vuc3VyZV9idWZmZXIgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LAorICAgICAgMTIgKiBhdG9tX2FycmF5X2dldF9sZW4gKCZzdHNjLT5lbnRyaWVzKSk7CisKKyAgZm9yIChpID0gMDsgaSA8IGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0c2MtPmVudHJpZXMpOyBpKyspIHsKKyAgICBTVFNDRW50cnkgKmVudHJ5ID0gJmF0b21fYXJyYXlfaW5kZXggKCZzdHNjLT5lbnRyaWVzLCBpKTsKKworICAgIHByb3BfY29weV91aW50MzIgKGVudHJ5LT5maXJzdF9jaHVuaywgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIHByb3BfY29weV91aW50MzIgKGVudHJ5LT5zYW1wbGVzX3Blcl9jaHVuaywgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIHByb3BfY29weV91aW50MzIgKGVudHJ5LT5zYW1wbGVfZGVzY3JpcHRpb25faW5kZXgsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgfQorCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisKKyAgLyogTmVlZCB0byBhZGQgdGhlIGxhc3QgZW50cnkgYWdhaW4gYXMgaW4gInJvYnVzdCIgbXV4aW5nIG1vZGUgd2Ugd2lsbCBtb3N0CisgICAqIGxpa2VseSBhZGQgbmV3IHNhbXBsZXMgdG8gdGhlIGxhc3QgY2h1bmssIHRodXMgbWFraW5nIHRoZQorICAgKiBzYW1wbGVzX3Blcl9jaHVuayBpbiB0aGUgbGFzdCBvbmUgZGlmZmVyZW50IHRvIHRoZSBzZWNvbmQgdG8gbGFzdCBvbmUsCisgICAqIGFuZCB0aHVzIG1ha2luZyBpdCB3cm9uZyB0byBrZWVwIHRoZW0gbWVyZ2VkCisgICAqLworICBpZiAobGFzdF9lbnRyaWVzX21lcmdlZCkKKyAgICBzdHNjLT5lbnRyaWVzLmxlbisrOworCisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitndWludDY0CithdG9tX2N0dHNfY29weV9kYXRhIChBdG9tQ1RUUyAqIGN0dHMsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKyAgZ3VpbnQgaTsKKworICBpZiAoIWF0b21fZnVsbF9jb3B5X2RhdGEgKCZjdHRzLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcHJvcF9jb3B5X3VpbnQzMiAoYXRvbV9hcnJheV9nZXRfbGVuICgmY3R0cy0+ZW50cmllcyksIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgLyogbWluaW1pemUgcmVhbGxvYyAqLworICBwcm9wX2NvcHlfZW5zdXJlX2J1ZmZlciAoYnVmZmVyLCBzaXplLCBvZmZzZXQsCisgICAgICA4ICogYXRvbV9hcnJheV9nZXRfbGVuICgmY3R0cy0+ZW50cmllcykpOworICBmb3IgKGkgPSAwOyBpIDwgYXRvbV9hcnJheV9nZXRfbGVuICgmY3R0cy0+ZW50cmllcyk7IGkrKykgeworICAgIENUVFNFbnRyeSAqZW50cnkgPSAmYXRvbV9hcnJheV9pbmRleCAoJmN0dHMtPmVudHJpZXMsIGkpOworCisgICAgcHJvcF9jb3B5X3VpbnQzMiAoZW50cnktPnNhbXBsZWNvdW50LCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgcHJvcF9jb3B5X3VpbnQzMiAoZW50cnktPnNhbXBsZW9mZnNldCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK2d1aW50NjQKK2F0b21fc3ZtaV9jb3B5X2RhdGEgKEF0b21TVk1JICogc3ZtaSwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJnN2bWktPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDggKHN2bWktPnN0ZXJlb3Njb3BpY19jb21wb3NpdGlvbl90eXBlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50OCAoc3ZtaS0+aXNfbGVmdF9maXJzdCA/IDEgOiAwLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIC8qIHN0ZXJlby1tb25vIGNoYW5nZSBjb3VudCAqLworICBwcm9wX2NvcHlfdWludDMyICgwLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK2d1aW50NjQKK2F0b21fc3RjbzY0X2NvcHlfZGF0YSAoQXRvbVNUQ082NCAqIHN0Y282NCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworICBndWludCBpOworICBnYm9vbGVhbiB0cnVuY190b18zMiA9IHN0Y282NC0+aGVhZGVyLmhlYWRlci50eXBlID09IEZPVVJDQ19zdGNvOworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJnN0Y282NC0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHByb3BfY29weV91aW50MzIgKGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0Y282NC0+ZW50cmllcyksIGJ1ZmZlciwgc2l6ZSwKKyAgICAgIG9mZnNldCk7CisKKyAgLyogbWluaW1pemUgcmVhbGxvYyAqLworICBwcm9wX2NvcHlfZW5zdXJlX2J1ZmZlciAoYnVmZmVyLCBzaXplLCBvZmZzZXQsCisgICAgICA4ICogYXRvbV9hcnJheV9nZXRfbGVuICgmc3RjbzY0LT5lbnRyaWVzKSk7CisgIGZvciAoaSA9IDA7IGkgPCBhdG9tX2FycmF5X2dldF9sZW4gKCZzdGNvNjQtPmVudHJpZXMpOyBpKyspIHsKKyAgICBndWludDY0IHZhbHVlID0KKyAgICAgICAgYXRvbV9hcnJheV9pbmRleCAoJnN0Y282NC0+ZW50cmllcywgaSkgKyBzdGNvNjQtPmNodW5rX29mZnNldDsKKworICAgIGlmICh0cnVuY190b18zMikgeworICAgICAgcHJvcF9jb3B5X3VpbnQzMiAoKGd1aW50MzIpIHZhbHVlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb3BfY29weV91aW50NjQgKHZhbHVlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgfQorICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK2d1aW50NjQKK2F0b21fc3Rzc19jb3B5X2RhdGEgKEF0b21TVFNTICogc3RzcywgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworICBndWludCBpOworCisgIGlmIChhdG9tX2FycmF5X2dldF9sZW4gKCZzdHNzLT5lbnRyaWVzKSA9PSAwKSB7CisgICAgLyogRklYTUUgbm90IG5lZWRpbmcgdGhpcyBhdG9tIG1pZ2h0IGJlIGNvbmZ1c2VkIHdpdGggZXJyb3Igd2hpbGUgY29weWluZyAqLworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFhdG9tX2Z1bGxfY29weV9kYXRhICgmc3Rzcy0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHByb3BfY29weV91aW50MzIgKGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0c3MtPmVudHJpZXMpLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIC8qIG1pbmltaXplIHJlYWxsb2MgKi8KKyAgcHJvcF9jb3B5X2Vuc3VyZV9idWZmZXIgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LAorICAgICAgNCAqIGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0c3MtPmVudHJpZXMpKTsKKyAgZm9yIChpID0gMDsgaSA8IGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0c3MtPmVudHJpZXMpOyBpKyspIHsKKyAgICBwcm9wX2NvcHlfdWludDMyIChhdG9tX2FycmF5X2luZGV4ICgmc3Rzcy0+ZW50cmllcywgaSksIGJ1ZmZlciwgc2l6ZSwKKyAgICAgICAgb2Zmc2V0KTsKKyAgfQorCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV9zdHNkX2NvcHlfZGF0YSAoQXRvbVNUU0QgKiBzdHNkLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisgIEdMaXN0ICp3YWxrZXI7CisKKyAgaWYgKCFhdG9tX2Z1bGxfY29weV9kYXRhICgmc3RzZC0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHByb3BfY29weV91aW50MzIgKHN0c2QtPm5fZW50cmllcywgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGZvciAod2Fsa2VyID0gZ19saXN0X2xhc3QgKHN0c2QtPmVudHJpZXMpOyB3YWxrZXIgIT0gTlVMTDsKKyAgICAgIHdhbGtlciA9IGdfbGlzdF9wcmV2aW91cyAod2Fsa2VyKSkgeworICAgIFNhbXBsZVRhYmxlRW50cnkgKnNlID0gKFNhbXBsZVRhYmxlRW50cnkgKikgd2Fsa2VyLT5kYXRhOworCisgICAgc3dpdGNoICgoKEF0b20gKikgd2Fsa2VyLT5kYXRhKS0+dHlwZSkgeworICAgICAgY2FzZSBGT1VSQ0NfbXA0YToKKyAgICAgICAgaWYgKCFzYW1wbGVfZW50cnlfbXA0YV9jb3B5X2RhdGEgKChTYW1wbGVUYWJsZUVudHJ5TVA0QSAqKSB3YWxrZXItPmRhdGEsCisgICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZPVVJDQ19tcDR2OgorICAgICAgICBpZiAoIXNhbXBsZV9lbnRyeV9tcDR2X2NvcHlfZGF0YSAoKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIHdhbGtlci0+ZGF0YSwKKyAgICAgICAgICAgICAgICBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChzZS0+a2luZCA9PSBWSURFTykgeworICAgICAgICAgIGlmICghc2FtcGxlX2VudHJ5X21wNHZfY29weV9kYXRhICgoU2FtcGxlVGFibGVFbnRyeU1QNFYgKikKKyAgICAgICAgICAgICAgICAgIHdhbGtlci0+ZGF0YSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc2UtPmtpbmQgPT0gQVVESU8pIHsKKyAgICAgICAgICBpZiAoIXNhbXBsZV9lbnRyeV9tcDRhX2NvcHlfZGF0YSAoKFNhbXBsZVRhYmxlRW50cnlNUDRBICopCisgICAgICAgICAgICAgICAgICB3YWxrZXItPmRhdGEsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHNlLT5raW5kID09IFNVQlRJVExFKSB7CisgICAgICAgICAgaWYgKCFzYW1wbGVfZW50cnlfdHgzZ19jb3B5X2RhdGEgKChTYW1wbGVUYWJsZUVudHJ5VFgzRyAqKQorICAgICAgICAgICAgICAgICAgd2Fsa2VyLT5kYXRhLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzZS0+a2luZCA9PSBUSU1FQ09ERSkgeworICAgICAgICAgIGlmICghc2FtcGxlX2VudHJ5X3RtY2RfY29weV9kYXRhICgoU2FtcGxlVGFibGVFbnRyeVRNQ0QgKikKKyAgICAgICAgICAgICAgICAgIHdhbGtlci0+ZGF0YSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKCFhdG9tX2hpbnRfc2FtcGxlX2VudHJ5X2NvcHlfZGF0YSAoCisgICAgICAgICAgICAgICAgICAoQXRvbUhpbnRTYW1wbGVFbnRyeSAqKSB3YWxrZXItPmRhdGEsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV9zdGJsX2NvcHlfZGF0YSAoQXRvbVNUQkwgKiBzdGJsLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFhdG9tX2NvcHlfZGF0YSAoJnN0YmwtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIWF0b21fc3RzZF9jb3B5X2RhdGEgKCZzdGJsLT5zdHNkLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIWF0b21fc3R0c19jb3B5X2RhdGEgKCZzdGJsLT5zdHRzLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvKiB0aGlzIGF0b20gaXMgb3B0aW9uYWwsIHNvIGxldCdzIGNoZWNrIGlmIHdlIG5lZWQgaXQKKyAgICogKHRvIGF2b2lkIGZhbHNlIGVycm9yKSAqLworICBpZiAoYXRvbV9hcnJheV9nZXRfbGVuICgmc3RibC0+c3Rzcy5lbnRyaWVzKSkgeworICAgIGlmICghYXRvbV9zdHNzX2NvcHlfZGF0YSAoJnN0YmwtPnN0c3MsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaWYgKCFhdG9tX3N0c2NfY29weV9kYXRhICgmc3RibC0+c3RzYywgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFhdG9tX3N0c3pfY29weV9kYXRhICgmc3RibC0+c3RzeiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHN0YmwtPmN0dHMgJiYgc3RibC0+Y3R0cy0+ZG9fcHRzKSB7CisgICAgaWYgKCFhdG9tX2N0dHNfY29weV9kYXRhIChzdGJsLT5jdHRzLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICBpZiAoc3RibC0+c3ZtaSkgeworICAgIGlmICghYXRvbV9zdm1pX2NvcHlfZGF0YSAoc3RibC0+c3ZtaSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgaWYgKCFhdG9tX3N0Y282NF9jb3B5X2RhdGEgKCZzdGJsLT5zdGNvNjQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuIG9yaWdpbmFsX29mZnNldCAtICpvZmZzZXQ7Cit9CisKKworc3RhdGljIGd1aW50NjQKK2F0b21fZHJlZl9jb3B5X2RhdGEgKEF0b21EUkVGICogZHJlZiwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworICBHTGlzdCAqd2Fsa2VyOworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJmRyZWYtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyIChnX2xpc3RfbGVuZ3RoIChkcmVmLT5lbnRyaWVzKSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIHdhbGtlciA9IGRyZWYtPmVudHJpZXM7CisgIHdoaWxlICh3YWxrZXIgIT0gTlVMTCkgeworICAgIEF0b20gKmF0b20gPSAoQXRvbSAqKSB3YWxrZXItPmRhdGE7CisKKyAgICBpZiAoYXRvbS0+dHlwZSA9PSBGT1VSQ0NfdXJsXykgeworICAgICAgaWYgKCFhdG9tX3VybF9jb3B5X2RhdGEgKChBdG9tVVJMICopIGF0b20sIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmIChhdG9tLT50eXBlID09IEZPVVJDQ19hbGlzKSB7CisgICAgICBpZiAoIWF0b21fZnVsbF9jb3B5X2RhdGEgKChBdG9tRnVsbCAqKSBhdG9tLCBidWZmZXIsIHNpemUsIG9mZnNldCkpCisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICBnX2Vycm9yICgiVW5zdXBwb3J0ZWQgYXRvbSB1c2VkIGluc2lkZSBkcmVmIGF0b20iKTsKKyAgICB9CisgICAgd2Fsa2VyID0gZ19saXN0X25leHQgKHdhbGtlcik7CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fZGluZl9jb3B5X2RhdGEgKEF0b21ESU5GICogZGluZiwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9jb3B5X2RhdGEgKCZkaW5mLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFhdG9tX2RyZWZfY29weV9kYXRhICgmZGluZi0+ZHJlZiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gb3JpZ2luYWxfb2Zmc2V0IC0gKm9mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fbWluZl9jb3B5X2RhdGEgKEF0b21NSU5GICogbWluZiwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9jb3B5X2RhdGEgKCZtaW5mLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKG1pbmYtPnZtaGQpIHsKKyAgICBpZiAoIWF0b21fdm1oZF9jb3B5X2RhdGEgKG1pbmYtPnZtaGQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9IGVsc2UgaWYgKG1pbmYtPnNtaGQpIHsKKyAgICBpZiAoIWF0b21fc21oZF9jb3B5X2RhdGEgKG1pbmYtPnNtaGQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9IGVsc2UgaWYgKG1pbmYtPmhtaGQpIHsKKyAgICBpZiAoIWF0b21faG1oZF9jb3B5X2RhdGEgKG1pbmYtPmhtaGQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9IGVsc2UgaWYgKG1pbmYtPmdtaGQpIHsKKyAgICBpZiAoIWF0b21fZ21oZF9jb3B5X2RhdGEgKG1pbmYtPmdtaGQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaWYgKG1pbmYtPmhkbHIpIHsKKyAgICBpZiAoIWF0b21faGRscl9jb3B5X2RhdGEgKG1pbmYtPmhkbHIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaWYgKCFhdG9tX2RpbmZfY29weV9kYXRhICgmbWluZi0+ZGluZiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFhdG9tX3N0YmxfY29weV9kYXRhICgmbWluZi0+c3RibCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fbWRoZF9jb3B5X2RhdGEgKEF0b21NREhEICogbWRoZCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJm1kaGQtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIWNvbW1vbl90aW1lX2luZm9fY29weV9kYXRhICgmbWRoZC0+dGltZV9pbmZvLAorICAgICAgICAgIGF0b21fZnVsbF9nZXRfdmVyc2lvbiAoJm1kaGQtPmhlYWRlcikgPT0gMCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDE2IChtZGhkLT5sYW5ndWFnZV9jb2RlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKG1kaGQtPnF1YWxpdHksIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fbWRpYV9jb3B5X2RhdGEgKEF0b21NRElBICogbWRpYSwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9jb3B5X2RhdGEgKCZtZGlhLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICghYXRvbV9tZGhkX2NvcHlfZGF0YSAoJm1kaWEtPm1kaGQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICghYXRvbV9oZGxyX2NvcHlfZGF0YSAoJm1kaWEtPmhkbHIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFhdG9tX21pbmZfY29weV9kYXRhICgmbWRpYS0+bWluZiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fZWxzdF9jb3B5X2RhdGEgKEF0b21FTFNUICogZWxzdCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworICBHU0xpc3QgKndhbGtlcjsKKworICBpZiAoIWF0b21fZnVsbF9jb3B5X2RhdGEgKCZlbHN0LT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcHJvcF9jb3B5X3VpbnQzMiAoZ19zbGlzdF9sZW5ndGggKGVsc3QtPmVudHJpZXMpLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgZm9yICh3YWxrZXIgPSBlbHN0LT5lbnRyaWVzOyB3YWxrZXIgIT0gTlVMTDsgd2Fsa2VyID0gZ19zbGlzdF9uZXh0ICh3YWxrZXIpKSB7CisgICAgRWRpdExpc3RFbnRyeSAqZW50cnkgPSAoRWRpdExpc3RFbnRyeSAqKSB3YWxrZXItPmRhdGE7CisgICAgcHJvcF9jb3B5X3VpbnQzMiAoZW50cnktPmR1cmF0aW9uLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgcHJvcF9jb3B5X3VpbnQzMiAoZW50cnktPm1lZGlhX3RpbWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgICBwcm9wX2NvcHlfdWludDMyIChlbnRyeS0+bWVkaWFfcmF0ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICB9CisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV90cmVmX2NvcHlfZGF0YSAoQXRvbVRSRUYgKiB0cmVmLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisgIGd1aW50IGk7CisKKyAgZ19hc3NlcnQgKGF0b21fYXJyYXlfZ2V0X2xlbiAoJnRyZWYtPmVudHJpZXMpID4gMCk7CisKKyAgaWYgKCFhdG9tX2NvcHlfZGF0YSAoJnRyZWYtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyICg4ICsgNCAqIGF0b21fYXJyYXlfZ2V0X2xlbiAoJnRyZWYtPmVudHJpZXMpLCBidWZmZXIsIHNpemUsCisgICAgICBvZmZzZXQpOworICBwcm9wX2NvcHlfZm91cmNjICh0cmVmLT5yZWZ0eXBlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIC8qIG1pbmltaXplIHJlYWxsb2MgKi8KKyAgcHJvcF9jb3B5X2Vuc3VyZV9idWZmZXIgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LAorICAgICAgNCAqIGF0b21fYXJyYXlfZ2V0X2xlbiAoJnRyZWYtPmVudHJpZXMpKTsKKyAgZm9yIChpID0gMDsgaSA8IGF0b21fYXJyYXlfZ2V0X2xlbiAoJnRyZWYtPmVudHJpZXMpOyBpKyspIHsKKyAgICBwcm9wX2NvcHlfdWludDMyIChhdG9tX2FycmF5X2luZGV4ICgmdHJlZi0+ZW50cmllcywgaSksIGJ1ZmZlciwgc2l6ZSwKKyAgICAgICAgb2Zmc2V0KTsKKyAgfQorCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV9lZHRzX2NvcHlfZGF0YSAoQXRvbUVEVFMgKiBlZHRzLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFhdG9tX2NvcHlfZGF0YSAoJihlZHRzLT5oZWFkZXIpLCBidWZmZXIsIHNpemUsIG9mZnNldCkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCFhdG9tX2Vsc3RfY29weV9kYXRhICgmKGVkdHMtPmVsc3QpLCBidWZmZXIsIHNpemUsIG9mZnNldCkpCisgICAgcmV0dXJuIDA7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX3RhZ19kYXRhX2NvcHlfZGF0YSAoQXRvbVRhZ0RhdGEgKiBkYXRhLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFhdG9tX2Z1bGxfY29weV9kYXRhICgmZGF0YS0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHByb3BfY29weV91aW50MzIgKGRhdGEtPnJlc2VydmVkLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50OF9hcnJheSAoZGF0YS0+ZGF0YSwgZGF0YS0+ZGF0YWxlbiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV90YWdfY29weV9kYXRhIChBdG9tVGFnICogdGFnLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFhdG9tX2NvcHlfZGF0YSAoJnRhZy0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICghYXRvbV90YWdfZGF0YV9jb3B5X2RhdGEgKCZ0YWctPmRhdGEsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX2lsc3RfY29weV9kYXRhIChBdG9tSUxTVCAqIGlsc3QsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fY29weV9kYXRhICgmaWxzdC0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvKiBleHRyYSBhdG9tcyAqLworICBpZiAoaWxzdC0+ZW50cmllcyAmJgorICAgICAgIWF0b21faW5mb19saXN0X2NvcHlfZGF0YSAoaWxzdC0+ZW50cmllcywgYnVmZmVyLCBzaXplLCBvZmZzZXQpKQorICAgIHJldHVybiAwOworCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV9tZXRhX2NvcHlfZGF0YSAoQXRvbU1FVEEgKiBtZXRhLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFhdG9tX2Z1bGxfY29weV9kYXRhICgmbWV0YS0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIWF0b21faGRscl9jb3B5X2RhdGEgKCZtZXRhLT5oZGxyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAobWV0YS0+aWxzdCkgeworICAgIGlmICghYXRvbV9pbHN0X2NvcHlfZGF0YSAobWV0YS0+aWxzdCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fdWR0YV9jb3B5X2RhdGEgKEF0b21VRFRBICogdWR0YSwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9jb3B5X2RhdGEgKCZ1ZHRhLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICh1ZHRhLT5tZXRhKSB7CisgICAgaWYgKCFhdG9tX21ldGFfY29weV9kYXRhICh1ZHRhLT5tZXRhLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICBpZiAodWR0YS0+ZW50cmllcykgeworICAgIC8qIGV4dHJhIGF0b21zICovCisgICAgaWYgKCFhdG9tX2luZm9fbGlzdF9jb3B5X2RhdGEgKHVkdGEtPmVudHJpZXMsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkKKyAgICAgIHJldHVybiAwOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX21laGRfY29weV9kYXRhIChBdG9tTUVIRCAqIG1laGQsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fZnVsbF9jb3B5X2RhdGEgKCZtZWhkLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcHJvcF9jb3B5X3VpbnQ2NCAobWVoZC0+ZnJhZ21lbnRfZHVyYXRpb24sIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fdHJleF9jb3B5X2RhdGEgKEF0b21UUkVYICogdHJleCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJnRyZXgtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyICh0cmV4LT50cmFja19JRCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyICh0cmV4LT5kZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCwgYnVmZmVyLCBzaXplLAorICAgICAgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQzMiAodHJleC0+ZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24sIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQzMiAodHJleC0+ZGVmYXVsdF9zYW1wbGVfc2l6ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyICh0cmV4LT5kZWZhdWx0X3NhbXBsZV9mbGFncywgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV9tdmV4X2NvcHlfZGF0YSAoQXRvbU1WRVggKiBtdmV4LCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisgIEdMaXN0ICp3YWxrZXI7CisKKyAgaWYgKCFhdG9tX2NvcHlfZGF0YSAoJm12ZXgtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIWF0b21fbWVoZF9jb3B5X2RhdGEgKCZtdmV4LT5tZWhkLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHdhbGtlciA9IGdfbGlzdF9maXJzdCAobXZleC0+dHJleHMpOworICB3aGlsZSAod2Fsa2VyICE9IE5VTEwpIHsKKyAgICBpZiAoIWF0b21fdHJleF9jb3B5X2RhdGEgKChBdG9tVFJFWCAqKSB3YWxrZXItPmRhdGEsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHdhbGtlciA9IGdfbGlzdF9uZXh0ICh3YWxrZXIpOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK2d1aW50NjQKK2F0b21fdHJha19jb3B5X2RhdGEgKEF0b21UUkFLICogdHJhaywgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9jb3B5X2RhdGEgKCZ0cmFrLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICghYXRvbV90a2hkX2NvcHlfZGF0YSAoJnRyYWstPnRraGQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICh0cmFrLT50YXB0KSB7CisgICAgaWYgKCF0cmFrLT50YXB0LT5jb3B5X2RhdGFfZnVuYyAodHJhay0+dGFwdC0+YXRvbSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgaWYgKHRyYWstPmVkdHMpIHsKKyAgICBpZiAoIWF0b21fZWR0c19jb3B5X2RhdGEgKHRyYWstPmVkdHMsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIGlmICh0cmFrLT50cmVmKSB7CisgICAgLyogTWFrZSBzdXJlIHdlIG5lZWQgdGhpcyBhdG9tICh0aGVyZSBpcyBhIHJlZmVyZW5jZWQgdHJhY2sgKi8KKyAgICBpZiAoYXRvbV9hcnJheV9nZXRfbGVuICgmdHJhay0+dHJlZi0+ZW50cmllcykgPiAwKSB7CisgICAgICBpZiAoIWF0b21fdHJlZl9jb3B5X2RhdGEgKHRyYWstPnRyZWYsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoIWF0b21fbWRpYV9jb3B5X2RhdGEgKCZ0cmFrLT5tZGlhLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICghYXRvbV91ZHRhX2NvcHlfZGF0YSAoJnRyYWstPnVkdGEsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKKworZ3VpbnQ2NAorYXRvbV9tb292X2NvcHlfZGF0YSAoQXRvbU1PT1YgKiBhdG9tLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisgIEdMaXN0ICp3YWxrZXI7CisKKyAgaWYgKCFhdG9tX2NvcHlfZGF0YSAoJihhdG9tLT5oZWFkZXIpLCBidWZmZXIsIHNpemUsIG9mZnNldCkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCFhdG9tX212aGRfY29weV9kYXRhICgmKGF0b20tPm12aGQpLCBidWZmZXIsIHNpemUsIG9mZnNldCkpCisgICAgcmV0dXJuIDA7CisKKyAgd2Fsa2VyID0gZ19saXN0X2ZpcnN0IChhdG9tLT50cmFrcyk7CisgIHdoaWxlICh3YWxrZXIgIT0gTlVMTCkgeworICAgIGlmICghYXRvbV90cmFrX2NvcHlfZGF0YSAoKEF0b21UUkFLICopIHdhbGtlci0+ZGF0YSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgd2Fsa2VyID0gZ19saXN0X25leHQgKHdhbGtlcik7CisgIH0KKworICBpZiAoIWF0b21fdWR0YV9jb3B5X2RhdGEgKCZhdG9tLT51ZHRhLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChhdG9tLT5mcmFnbWVudGVkKSB7CisgICAgaWYgKCFhdG9tX212ZXhfY29weV9kYXRhICgmYXRvbS0+bXZleCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fd2F2ZV9jb3B5X2RhdGEgKEF0b21XQVZFICogd2F2ZSwgZ3VpbnQ4ICoqIGJ1ZmZlciwKKyAgICBndWludDY0ICogc2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9jb3B5X2RhdGEgKCYod2F2ZS0+aGVhZGVyKSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKQorICAgIHJldHVybiAwOworCisgIGlmICh3YXZlLT5leHRlbnNpb25fYXRvbXMpIHsKKyAgICBpZiAoIWF0b21faW5mb19saXN0X2NvcHlfZGF0YSAod2F2ZS0+ZXh0ZW5zaW9uX2F0b21zLCBidWZmZXIsIHNpemUsIG9mZnNldCkpCisgICAgICByZXR1cm4gMDsKKyAgfQorCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCisvKiAtLSBlbmQgb2YgY29weSBkYXRhIGZ1bmN0aW9ucyAtLSAqLworCisvKiAtLSBnZW5lcmFsIGZ1bmN0aW9ucywgQVBJIGFuZCBzdXBwb3J0IGZ1bmN0aW9ucyAqLworCisvKiBhZGQgc2FtcGxlcyB0byB0YWJsZXMgKi8KKwordm9pZAorYXRvbV9zdHNjX2FkZF9uZXdfZW50cnkgKEF0b21TVFNDICogc3RzYywgZ3VpbnQzMiBmaXJzdF9jaHVuaywgZ3VpbnQzMiBuc2FtcGxlcykKK3sKKyAgZ2ludCBsZW47CisKKyAgaWYgKChsZW4gPSBhdG9tX2FycmF5X2dldF9sZW4gKCZzdHNjLT5lbnRyaWVzKSkgPiAxICYmCisgICAgICAoKGF0b21fYXJyYXlfaW5kZXggKCZzdHNjLT5lbnRyaWVzLCBsZW4gLSAxKSkuc2FtcGxlc19wZXJfY2h1bmsgPT0KKyAgICAgICAgICAoYXRvbV9hcnJheV9pbmRleCAoJnN0c2MtPmVudHJpZXMsIGxlbiAtIDIpKS5zYW1wbGVzX3Blcl9jaHVuaykpIHsKKyAgICBTVFNDRW50cnkgKm5lbnRyeTsKKworICAgIC8qIE1lcmdlIGxhc3QgdHdvIGVudHJpZXMgYXMgdGhleSBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBzYW1wbGVzIHBlciBjaHVuayAqLworICAgIG5lbnRyeSA9ICZhdG9tX2FycmF5X2luZGV4ICgmc3RzYy0+ZW50cmllcywgbGVuIC0gMSk7CisgICAgbmVudHJ5LT5maXJzdF9jaHVuayA9IGZpcnN0X2NodW5rOworICAgIG5lbnRyeS0+c2FtcGxlc19wZXJfY2h1bmsgPSBuc2FtcGxlczsKKyAgICBuZW50cnktPnNhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCA9IDE7CisgIH0gZWxzZSB7CisgICAgU1RTQ0VudHJ5IG5lbnRyeTsKKworICAgIG5lbnRyeS5maXJzdF9jaHVuayA9IGZpcnN0X2NodW5rOworICAgIG5lbnRyeS5zYW1wbGVzX3Blcl9jaHVuayA9IG5zYW1wbGVzOworICAgIG5lbnRyeS5zYW1wbGVfZGVzY3JpcHRpb25faW5kZXggPSAxOworICAgIGF0b21fYXJyYXlfYXBwZW5kICgmc3RzYy0+ZW50cmllcywgbmVudHJ5LCAxMjgpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3N0c2NfdXBkYXRlX2VudHJ5IChBdG9tU1RTQyAqIHN0c2MsIGd1aW50MzIgZmlyc3RfY2h1bmssIGd1aW50MzIgbnNhbXBsZXMpCit7CisgIGdpbnQgbGVuOworCisgIGxlbiA9IGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0c2MtPmVudHJpZXMpOworICBnX2Fzc2VydCAobGVuICE9IDApOworICBnX2Fzc2VydCAoYXRvbV9hcnJheV9pbmRleCAoJnN0c2MtPmVudHJpZXMsCisgICAgICAgICAgbGVuIC0gMSkuZmlyc3RfY2h1bmsgPT0gZmlyc3RfY2h1bmspOworCisgIGF0b21fYXJyYXlfaW5kZXggKCZzdHNjLT5lbnRyaWVzLCBsZW4gLSAxKS5zYW1wbGVzX3Blcl9jaHVuayArPSBuc2FtcGxlczsKK30KKworc3RhdGljIHZvaWQKK2F0b21fc3R0c19hZGRfZW50cnkgKEF0b21TVFRTICogc3R0cywgZ3VpbnQzMiBzYW1wbGVfY291bnQsIGdpbnQzMiBzYW1wbGVfZGVsdGEpCit7CisgIFNUVFNFbnRyeSAqZW50cnkgPSBOVUxMOworCisgIGlmIChHX0xJS0VMWSAoYXRvbV9hcnJheV9nZXRfbGVuICgmc3R0cy0+ZW50cmllcykgIT0gMCkpCisgICAgZW50cnkgPSAmYXRvbV9hcnJheV9pbmRleCAoJnN0dHMtPmVudHJpZXMsCisgICAgICAgIGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0dHMtPmVudHJpZXMpIC0gMSk7CisKKyAgaWYgKGVudHJ5ICYmIGVudHJ5LT5zYW1wbGVfZGVsdGEgPT0gc2FtcGxlX2RlbHRhKSB7CisgICAgZW50cnktPnNhbXBsZV9jb3VudCArPSBzYW1wbGVfY291bnQ7CisgIH0gZWxzZSB7CisgICAgU1RUU0VudHJ5IG5lbnRyeTsKKworICAgIG5lbnRyeS5zYW1wbGVfY291bnQgPSBzYW1wbGVfY291bnQ7CisgICAgbmVudHJ5LnNhbXBsZV9kZWx0YSA9IHNhbXBsZV9kZWx0YTsKKyAgICBhdG9tX2FycmF5X2FwcGVuZCAoJnN0dHMtPmVudHJpZXMsIG5lbnRyeSwgMjU2KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorYXRvbV9zdHN6X2FkZF9lbnRyeSAoQXRvbVNUU1ogKiBzdHN6LCBndWludDMyIG5zYW1wbGVzLCBndWludDMyIHNpemUpCit7CisgIGd1aW50MzIgaTsKKworICBzdHN6LT50YWJsZV9zaXplICs9IG5zYW1wbGVzOworICBpZiAoc3Rzei0+c2FtcGxlX3NpemUgIT0gMCkgeworICAgIC8qIGl0IGlzIGNvbnN0YW50IHNpemUsIHdlIGRvbid0IG5lZWQgZW50cmllcyAqLworICAgIHJldHVybjsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgbnNhbXBsZXM7IGkrKykgeworICAgIGF0b21fYXJyYXlfYXBwZW5kICgmc3Rzei0+ZW50cmllcywgc2l6ZSwgMTAyNCk7CisgIH0KK30KKworc3RhdGljIGd1aW50MzIKK2F0b21fc3RjbzY0X2dldF9lbnRyeV9jb3VudCAoQXRvbVNUQ082NCAqIHN0Y282NCkKK3sKKyAgcmV0dXJuIGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0Y282NC0+ZW50cmllcyk7Cit9CisKKy8qIHJldHVybnMgVFJVRSBpZiBhIG5ldyBlbnRyeSB3YXMgYWRkZWQgKi8KK3N0YXRpYyBnYm9vbGVhbgorYXRvbV9zdGNvNjRfYWRkX2VudHJ5IChBdG9tU1RDTzY0ICogc3RjbzY0LCBndWludDY0IGVudHJ5KQoreworICBndWludDMyIGxlbjsKKworICAvKiBPbmx5IGFkZCBhIG5ldyBlbnRyeSBpZiB0aGUgY2h1bmsgb2Zmc2V0IGNoYW5nZWQgKi8KKyAgaWYgKChsZW4gPSBhdG9tX2FycmF5X2dldF9sZW4gKCZzdGNvNjQtPmVudHJpZXMpKSAmJgorICAgICAgKChhdG9tX2FycmF5X2luZGV4ICgmc3RjbzY0LT5lbnRyaWVzLCBsZW4gLSAxKSkgPT0gZW50cnkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBhdG9tX2FycmF5X2FwcGVuZCAoJnN0Y282NC0+ZW50cmllcywgZW50cnksIDI1Nik7CisgIGlmIChlbnRyeSA+IEdfTUFYVUlOVDMyKQorICAgIHN0Y282NC0+aGVhZGVyLmhlYWRlci50eXBlID0gRk9VUkNDX2NvNjQ7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK2F0b21fdHJlZl9hZGRfZW50cnkgKEF0b21UUkVGICogdHJlZiwgZ3VpbnQzMiBzYW1wbGUpCit7CisgIGF0b21fYXJyYXlfYXBwZW5kICgmdHJlZi0+ZW50cmllcywgc2FtcGxlLCA1MTIpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9zdHNzX2FkZF9lbnRyeSAoQXRvbVNUU1MgKiBzdHNzLCBndWludDMyIHNhbXBsZSkKK3sKKyAgYXRvbV9hcnJheV9hcHBlbmQgKCZzdHNzLT5lbnRyaWVzLCBzYW1wbGUsIDUxMik7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3N0YmxfYWRkX3N0c3NfZW50cnkgKEF0b21TVEJMICogc3RibCkKK3sKKyAgZ3VpbnQzMiBzYW1wbGVfaW5kZXggPSBzdGJsLT5zdHN6LnRhYmxlX3NpemU7CisKKyAgYXRvbV9zdHNzX2FkZF9lbnRyeSAoJnN0YmwtPnN0c3MsIHNhbXBsZV9pbmRleCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2N0dHNfYWRkX2VudHJ5IChBdG9tQ1RUUyAqIGN0dHMsIGd1aW50MzIgbnNhbXBsZXMsIGd1aW50MzIgb2Zmc2V0KQoreworICBDVFRTRW50cnkgKmVudHJ5ID0gTlVMTDsKKworICBpZiAoR19MSUtFTFkgKGF0b21fYXJyYXlfZ2V0X2xlbiAoJmN0dHMtPmVudHJpZXMpICE9IDApKQorICAgIGVudHJ5ID0gJmF0b21fYXJyYXlfaW5kZXggKCZjdHRzLT5lbnRyaWVzLAorICAgICAgICBhdG9tX2FycmF5X2dldF9sZW4gKCZjdHRzLT5lbnRyaWVzKSAtIDEpOworCisgIGlmIChlbnRyeSA9PSBOVUxMIHx8IGVudHJ5LT5zYW1wbGVvZmZzZXQgIT0gb2Zmc2V0KSB7CisgICAgQ1RUU0VudHJ5IG5lbnRyeTsKKworICAgIG5lbnRyeS5zYW1wbGVjb3VudCA9IG5zYW1wbGVzOworICAgIG5lbnRyeS5zYW1wbGVvZmZzZXQgPSBvZmZzZXQ7CisgICAgYXRvbV9hcnJheV9hcHBlbmQgKCZjdHRzLT5lbnRyaWVzLCBuZW50cnksIDI1Nik7CisgICAgaWYgKG9mZnNldCAhPSAwKQorICAgICAgY3R0cy0+ZG9fcHRzID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBlbnRyeS0+c2FtcGxlY291bnQgKz0gbnNhbXBsZXM7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2F0b21fc3RibF9hZGRfY3R0c19lbnRyeSAoQXRvbVNUQkwgKiBzdGJsLCBndWludDMyIG5zYW1wbGVzLCBndWludDMyIG9mZnNldCkKK3sKKyAgaWYgKHN0YmwtPmN0dHMgPT0gTlVMTCkgeworICAgIHN0YmwtPmN0dHMgPSBhdG9tX2N0dHNfbmV3ICgpOworICB9CisgIGF0b21fY3R0c19hZGRfZW50cnkgKHN0YmwtPmN0dHMsIG5zYW1wbGVzLCBvZmZzZXQpOworfQorCit2b2lkCithdG9tX3N0YmxfYWRkX3NhbXBsZXMgKEF0b21TVEJMICogc3RibCwgZ3VpbnQzMiBuc2FtcGxlcywgZ3VpbnQzMiBkZWx0YSwKKyAgICBndWludDMyIHNpemUsIGd1aW50NjQgY2h1bmtfb2Zmc2V0LCBnYm9vbGVhbiBzeW5jLCBnaW50NjQgcHRzX29mZnNldCkKK3sKKyAgYXRvbV9zdHRzX2FkZF9lbnRyeSAoJnN0YmwtPnN0dHMsIG5zYW1wbGVzLCBkZWx0YSk7CisgIGF0b21fc3Rzel9hZGRfZW50cnkgKCZzdGJsLT5zdHN6LCBuc2FtcGxlcywgc2l6ZSk7CisgIGlmIChhdG9tX3N0Y282NF9hZGRfZW50cnkgKCZzdGJsLT5zdGNvNjQsIGNodW5rX29mZnNldCkpIHsKKyAgICBhdG9tX3N0c2NfYWRkX25ld19lbnRyeSAoJnN0YmwtPnN0c2MsCisgICAgICAgIGF0b21fc3RjbzY0X2dldF9lbnRyeV9jb3VudCAoJnN0YmwtPnN0Y282NCksIG5zYW1wbGVzKTsKKyAgfSBlbHNlIHsKKyAgICBhdG9tX3N0c2NfdXBkYXRlX2VudHJ5ICgmc3RibC0+c3RzYywKKyAgICAgICAgYXRvbV9zdGNvNjRfZ2V0X2VudHJ5X2NvdW50ICgmc3RibC0+c3RjbzY0KSwgbnNhbXBsZXMpOworICB9CisKKyAgaWYgKHN5bmMpCisgICAgYXRvbV9zdGJsX2FkZF9zdHNzX2VudHJ5IChzdGJsKTsKKyAgLyogYWx3YXlzIHN0b3JlIHRvIGFycmFuZ2UgZm9yIGNvbnNpc3RlbnQgY29udGVudCAqLworICBhdG9tX3N0YmxfYWRkX2N0dHNfZW50cnkgKHN0YmwsIG5zYW1wbGVzLCBwdHNfb2Zmc2V0KTsKK30KKwordm9pZAorYXRvbV90cmFrX2FkZF9zYW1wbGVzIChBdG9tVFJBSyAqIHRyYWssIGd1aW50MzIgbnNhbXBsZXMsIGd1aW50MzIgZGVsdGEsCisgICAgZ3VpbnQzMiBzaXplLCBndWludDY0IGNodW5rX29mZnNldCwgZ2Jvb2xlYW4gc3luYywgZ2ludDY0IHB0c19vZmZzZXQpCit7CisgIEF0b21TVEJMICpzdGJsID0gJnRyYWstPm1kaWEubWluZi5zdGJsOworICBhdG9tX3N0YmxfYWRkX3NhbXBsZXMgKHN0YmwsIG5zYW1wbGVzLCBkZWx0YSwgc2l6ZSwgY2h1bmtfb2Zmc2V0LCBzeW5jLAorICAgICAgcHRzX29mZnNldCk7Cit9CisKKy8qIHRyYWsgYW5kIG1vb3YgbW9sZGluZyAqLworCitndWludDMyCithdG9tX3RyYWtfZ2V0X3RpbWVzY2FsZSAoQXRvbVRSQUsgKiB0cmFrKQoreworICByZXR1cm4gdHJhay0+bWRpYS5tZGhkLnRpbWVfaW5mby50aW1lc2NhbGU7Cit9CisKK2d1aW50MzIKK2F0b21fdHJha19nZXRfaWQgKEF0b21UUkFLICogdHJhaykKK3sKKyAgcmV0dXJuIHRyYWstPnRraGQudHJhY2tfSUQ7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3RyYWtfc2V0X2lkIChBdG9tVFJBSyAqIHRyYWssIGd1aW50MzIgaWQpCit7CisgIHRyYWstPnRraGQudHJhY2tfSUQgPSBpZDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fbW9vdl9hZGRfdHJleCAoQXRvbU1PT1YgKiBtb292LCBBdG9tVFJFWCAqIHRyZXgpCit7CisgIG1vb3YtPm12ZXgudHJleHMgPSBnX2xpc3RfYXBwZW5kIChtb292LT5tdmV4LnRyZXhzLCB0cmV4KTsKK30KKworc3RhdGljIEF0b21UUkVYICoKK2F0b21fdHJleF9uZXcgKEF0b21UUkFLICogdHJhaykKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisgIEF0b21UUkVYICp0cmV4ID0gZ19uZXcwIChBdG9tVFJFWCwgMSk7CisKKyAgYXRvbV9mdWxsX2luaXQgKCZ0cmV4LT5oZWFkZXIsIEZPVVJDQ190cmV4LCAwLCAwLCAwLCBmbGFncyk7CisKKyAgdHJleC0+dHJhY2tfSUQgPSB0cmFrLT50a2hkLnRyYWNrX0lEOworICB0cmV4LT5kZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCA9IDE7CisgIHRyZXgtPmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uID0gMDsKKyAgdHJleC0+ZGVmYXVsdF9zYW1wbGVfc2l6ZSA9IDA7CisgIHRyZXgtPmRlZmF1bHRfc2FtcGxlX2ZsYWdzID0gMDsKKworICByZXR1cm4gdHJleDsKK30KKwordm9pZAorYXRvbV9tb292X2FkZF90cmFrIChBdG9tTU9PViAqIG1vb3YsIEF0b21UUkFLICogdHJhaykKK3sKKyAgYXRvbV90cmFrX3NldF9pZCAodHJhaywgbW9vdi0+bXZoZC5uZXh0X3RyYWNrX2lkKyspOworICBtb292LT50cmFrcyA9IGdfbGlzdF9hcHBlbmQgKG1vb3YtPnRyYWtzLCB0cmFrKTsKKyAgLyogYWRkaXRpb25hbCB0cmFrIG1lYW5zIGFsc28gbmV3IHRyZXggKi8KKyAgYXRvbV9tb292X2FkZF90cmV4IChtb292LCBhdG9tX3RyZXhfbmV3ICh0cmFrKSk7Cit9CisKK2d1aW50CithdG9tX21vb3ZfZ2V0X3RyYWtfY291bnQgKEF0b21NT09WICogbW9vdikKK3sKKyAgcmV0dXJuIGdfbGlzdF9sZW5ndGggKG1vb3YtPnRyYWtzKTsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fdHJha19nZXRfZHVyYXRpb24gKEF0b21UUkFLICogdHJhaykKK3sKKyAgcmV0dXJuIHRyYWstPnRraGQuZHVyYXRpb247Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX3N0dHNfZ2V0X3RvdGFsX2R1cmF0aW9uIChBdG9tU1RUUyAqIHN0dHMpCit7CisgIGd1aW50IGk7CisgIGd1aW50NjQgc3VtID0gMDsKKworICBmb3IgKGkgPSAwOyBpIDwgYXRvbV9hcnJheV9nZXRfbGVuICgmc3R0cy0+ZW50cmllcyk7IGkrKykgeworICAgIFNUVFNFbnRyeSAqZW50cnkgPSAmYXRvbV9hcnJheV9pbmRleCAoJnN0dHMtPmVudHJpZXMsIGkpOworCisgICAgc3VtICs9IChndWludDY0KSAoZW50cnktPnNhbXBsZV9jb3VudCkgKiBlbnRyeS0+c2FtcGxlX2RlbHRhOworICB9CisgIHJldHVybiBzdW07Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3RyYWtfdXBkYXRlX2R1cmF0aW9uIChBdG9tVFJBSyAqIHRyYWssIGd1aW50NjQgbW9vdl90aW1lc2NhbGUpCit7CisgIHRyYWstPm1kaWEubWRoZC50aW1lX2luZm8uZHVyYXRpb24gPQorICAgICAgYXRvbV9zdHRzX2dldF90b3RhbF9kdXJhdGlvbiAoJnRyYWstPm1kaWEubWluZi5zdGJsLnN0dHMpOworICBpZiAodHJhay0+bWRpYS5tZGhkLnRpbWVfaW5mby50aW1lc2NhbGUgIT0gMCkgeworICAgIHRyYWstPnRraGQuZHVyYXRpb24gPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHRyYWstPm1kaWEubWRoZC50aW1lX2luZm8uZHVyYXRpb24sCisgICAgICAgIG1vb3ZfdGltZXNjYWxlLCB0cmFrLT5tZGlhLm1kaGQudGltZV9pbmZvLnRpbWVzY2FsZSk7CisgIH0gZWxzZSB7CisgICAgdHJhay0+dGtoZC5kdXJhdGlvbiA9IDA7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RpbWVjb2RlX2F0b21fdHJha19zZXRfZHVyYXRpb24gKEF0b21UUkFLICogdHJhaywgZ3VpbnQ2NCBkdXJhdGlvbiwKKyAgICBndWludDY0IHRpbWVzY2FsZSkKK3sKKyAgU1RUU0VudHJ5ICplbnRyeTsKKyAgR0xpc3QgKml0ZXI7CisKKyAgLyogU2FuaXR5IGNoZWNrcyB0byBlbnN1cmUgd2UgaGF2ZSBhIHRpbWVjb2RlICovCisgIGdfYXNzZXJ0ICh0cmFrLT5tZGlhLm1pbmYuZ21oZCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKGF0b21fYXJyYXlfZ2V0X2xlbiAoJnRyYWstPm1kaWEubWluZi5zdGJsLnN0dHMuZW50cmllcykgPT0gMSk7CisKKyAgZm9yIChpdGVyID0gdHJhay0+bWRpYS5taW5mLnN0Ymwuc3RzZC5lbnRyaWVzOyBpdGVyOworICAgICAgaXRlciA9IGdfbGlzdF9uZXh0IChpdGVyKSkgeworICAgIFNhbXBsZVRhYmxlRW50cnkgKmVudHJ5ID0gaXRlci0+ZGF0YTsKKyAgICBpZiAoZW50cnktPmtpbmQgPT0gVElNRUNPREUpIHsKKyAgICAgIFNhbXBsZVRhYmxlRW50cnlUTUNEICp0bWNkID0gKFNhbXBsZVRhYmxlRW50cnlUTUNEICopIGVudHJ5OworCisgICAgICBkdXJhdGlvbiA9IGR1cmF0aW9uICogdG1jZC0+dGltZXNjYWxlIC8gdGltZXNjYWxlOworICAgICAgdGltZXNjYWxlID0gdG1jZC0+dGltZXNjYWxlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgdHJhay0+dGtoZC5kdXJhdGlvbiA9IGR1cmF0aW9uOworICB0cmFrLT5tZGlhLm1kaGQudGltZV9pbmZvLmR1cmF0aW9uID0gZHVyYXRpb247CisgIHRyYWstPm1kaWEubWRoZC50aW1lX2luZm8udGltZXNjYWxlID0gdGltZXNjYWxlOworCisgIGVudHJ5ID0gJmF0b21fYXJyYXlfaW5kZXggKCZ0cmFrLT5tZGlhLm1pbmYuc3RibC5zdHRzLmVudHJpZXMsIDApOworICBlbnRyeS0+c2FtcGxlX2RlbHRhID0gZHVyYXRpb247Cit9CisKK3N0YXRpYyBndWludDMyCithdG9tX21vb3ZfZ2V0X3RpbWVzY2FsZSAoQXRvbU1PT1YgKiBtb292KQoreworICByZXR1cm4gbW9vdi0+bXZoZC50aW1lX2luZm8udGltZXNjYWxlOworfQorCit2b2lkCithdG9tX21vb3ZfdXBkYXRlX3RpbWVzY2FsZSAoQXRvbU1PT1YgKiBtb292LCBndWludDMyIHRpbWVzY2FsZSkKK3sKKyAgbW9vdi0+bXZoZC50aW1lX2luZm8udGltZXNjYWxlID0gdGltZXNjYWxlOworfQorCit2b2lkCithdG9tX21vb3ZfdXBkYXRlX2R1cmF0aW9uIChBdG9tTU9PViAqIG1vb3YpCit7CisgIEdMaXN0ICp0cmFrcyA9IG1vb3YtPnRyYWtzOworICBndWludDY0IGR1ciwgZHVyYXRpb24gPSAwOworCisgIHdoaWxlICh0cmFrcykgeworICAgIEF0b21UUkFLICp0cmFrID0gKEF0b21UUkFLICopIHRyYWtzLT5kYXRhOworCisgICAgLyogU2tpcCB0aW1lY29kZXMgZm9yIG5vdzogdGhleSBoYXZlIGEgcGxhY2Vob2xkZXIgZHVyYXRpb24gKi8KKyAgICBpZiAodHJhay0+bWRpYS5taW5mLmdtaGQgPT0gTlVMTCkgeworICAgICAgYXRvbV90cmFrX3VwZGF0ZV9kdXJhdGlvbiAodHJhaywgYXRvbV9tb292X2dldF90aW1lc2NhbGUgKG1vb3YpKTsKKyAgICAgIGR1ciA9IGF0b21fdHJha19nZXRfZHVyYXRpb24gKHRyYWspOworICAgICAgaWYgKGR1ciA+IGR1cmF0aW9uKQorICAgICAgICBkdXJhdGlvbiA9IGR1cjsKKyAgICB9CisgICAgdHJha3MgPSBnX2xpc3RfbmV4dCAodHJha3MpOworICB9CisgIC8qIE5vdyB1cGRhdGUgdGhlIGR1cmF0aW9uIG9mIHRoZSB0aW1lY29kZXMgKi8KKyAgdHJha3MgPSBtb292LT50cmFrczsKKyAgd2hpbGUgKHRyYWtzKSB7CisgICAgQXRvbVRSQUsgKnRyYWsgPSAoQXRvbVRSQUsgKikgdHJha3MtPmRhdGE7CisKKyAgICBpZiAodHJhay0+bWRpYS5taW5mLmdtaGQgIT0gTlVMTCkKKyAgICAgIHRpbWVjb2RlX2F0b21fdHJha19zZXRfZHVyYXRpb24gKHRyYWssIGR1cmF0aW9uLAorICAgICAgICAgIGF0b21fbW9vdl9nZXRfdGltZXNjYWxlIChtb292KSk7CisgICAgdHJha3MgPSBnX2xpc3RfbmV4dCAodHJha3MpOworICB9CisgIG1vb3YtPm12aGQudGltZV9pbmZvLmR1cmF0aW9uID0gZHVyYXRpb247CisgIG1vb3YtPm12ZXgubWVoZC5mcmFnbWVudF9kdXJhdGlvbiA9IGR1cmF0aW9uOworfQorCit2b2lkCithdG9tX21vb3Zfc2V0X2ZyYWdtZW50ZWQgKEF0b21NT09WICogbW9vdiwgZ2Jvb2xlYW4gZnJhZ21lbnRlZCkKK3sKKyAgbW9vdi0+ZnJhZ21lbnRlZCA9IGZyYWdtZW50ZWQ7Cit9CisKK3ZvaWQKK2F0b21fc3RjbzY0X2NodW5rc19zZXRfb2Zmc2V0IChBdG9tU1RDTzY0ICogc3RjbzY0LCBndWludDMyIG9mZnNldCkKK3sKKyAgc3RjbzY0LT5jaHVua19vZmZzZXQgPSBvZmZzZXQ7Cit9CisKK3ZvaWQKK2F0b21fbW9vdl9jaHVua3Nfc2V0X29mZnNldCAoQXRvbU1PT1YgKiBtb292LCBndWludDMyIG9mZnNldCkKK3sKKyAgR0xpc3QgKnRyYWtzID0gbW9vdi0+dHJha3M7CisKKyAgaWYgKG9mZnNldCA9PSBtb292LT5jaHVua3Nfb2Zmc2V0KQorICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisKKyAgd2hpbGUgKHRyYWtzKSB7CisgICAgQXRvbVRSQUsgKnRyYWsgPSAoQXRvbVRSQUsgKikgdHJha3MtPmRhdGE7CisKKyAgICBhdG9tX3N0Y282NF9jaHVua3Nfc2V0X29mZnNldCAoJnRyYWstPm1kaWEubWluZi5zdGJsLnN0Y282NCwgb2Zmc2V0KTsKKyAgICB0cmFrcyA9IGdfbGlzdF9uZXh0ICh0cmFrcyk7CisgIH0KKworICBtb292LT5jaHVua3Nfb2Zmc2V0ID0gb2Zmc2V0OworfQorCit2b2lkCithdG9tX3RyYWtfdXBkYXRlX2JpdHJhdGVzIChBdG9tVFJBSyAqIHRyYWssIGd1aW50MzIgYXZnX2JpdHJhdGUsCisgICAgZ3VpbnQzMiBtYXhfYml0cmF0ZSkKK3sKKyAgQXRvbUVTRFMgKmVzZHMgPSBOVUxMOworICBBdG9tRGF0YSAqYnRydCA9IE5VTEw7CisgIEF0b21XQVZFICp3YXZlID0gTlVMTDsKKyAgQXRvbVNUU0QgKnN0c2Q7CisgIEdMaXN0ICppdGVyOworICBHTGlzdCAqZXh0ZW5zaW9uaXRlciA9IE5VTEw7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAodHJhayAhPSBOVUxMKTsKKworICBpZiAoYXZnX2JpdHJhdGUgPT0gMCAmJiBtYXhfYml0cmF0ZSA9PSAwKQorICAgIHJldHVybjsKKworICBzdHNkID0gJnRyYWstPm1kaWEubWluZi5zdGJsLnN0c2Q7CisgIGZvciAoaXRlciA9IHN0c2QtPmVudHJpZXM7IGl0ZXI7IGl0ZXIgPSBnX2xpc3RfbmV4dCAoaXRlcikpIHsKKyAgICBTYW1wbGVUYWJsZUVudHJ5ICplbnRyeSA9IGl0ZXItPmRhdGE7CisKKyAgICBzd2l0Y2ggKGVudHJ5LT5raW5kKSB7CisgICAgICBjYXNlIEFVRElPOnsKKyAgICAgICAgU2FtcGxlVGFibGVFbnRyeU1QNEEgKmF1ZGlvZW50cnkgPSAoU2FtcGxlVGFibGVFbnRyeU1QNEEgKikgZW50cnk7CisgICAgICAgIGV4dGVuc2lvbml0ZXIgPSBhdWRpb2VudHJ5LT5leHRlbnNpb25fYXRvbXM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBWSURFTzp7CisgICAgICAgIFNhbXBsZVRhYmxlRW50cnlNUDRWICp2aWRlb2VudHJ5ID0gKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIGVudHJ5OworICAgICAgICBleHRlbnNpb25pdGVyID0gdmlkZW9lbnRyeS0+ZXh0ZW5zaW9uX2F0b21zOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGZvciAoOyBleHRlbnNpb25pdGVyOyBleHRlbnNpb25pdGVyID0gZ19saXN0X25leHQgKGV4dGVuc2lvbml0ZXIpKSB7CisgICAgQXRvbUluZm8gKmF0b21pbmZvID0gZXh0ZW5zaW9uaXRlci0+ZGF0YTsKKyAgICBpZiAoYXRvbWluZm8tPmF0b20tPnR5cGUgPT0gRk9VUkNDX2VzZHMpIHsKKyAgICAgIGVzZHMgPSAoQXRvbUVTRFMgKikgYXRvbWluZm8tPmF0b207CisgICAgfSBlbHNlIGlmIChhdG9taW5mby0+YXRvbS0+dHlwZSA9PSBGT1VSQ0NfYnRydCkgeworICAgICAgYnRydCA9IChBdG9tRGF0YSAqKSBhdG9taW5mby0+YXRvbTsKKyAgICB9IGVsc2UgaWYgKGF0b21pbmZvLT5hdG9tLT50eXBlID09IEZPVVJDQ193YXZlKSB7CisgICAgICB3YXZlID0gKEF0b21XQVZFICopIGF0b21pbmZvLT5hdG9tOworICAgIH0KKyAgfQorCisgIC8qIHdhdmUgbWlnaHQgaGF2ZSBhbiBlc2RzIGludGVybmFsbHkgKi8KKyAgaWYgKHdhdmUpIHsKKyAgICBmb3IgKGV4dGVuc2lvbml0ZXIgPSB3YXZlLT5leHRlbnNpb25fYXRvbXM7IGV4dGVuc2lvbml0ZXI7CisgICAgICAgIGV4dGVuc2lvbml0ZXIgPSBnX2xpc3RfbmV4dCAoZXh0ZW5zaW9uaXRlcikpIHsKKyAgICAgIEF0b21JbmZvICphdG9taW5mbyA9IGV4dGVuc2lvbml0ZXItPmRhdGE7CisgICAgICBpZiAoYXRvbWluZm8tPmF0b20tPnR5cGUgPT0gRk9VUkNDX2VzZHMpIHsKKyAgICAgICAgZXNkcyA9IChBdG9tRVNEUyAqKSBhdG9taW5mby0+YXRvbTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGVzZHMpIHsKKyAgICBpZiAoYXZnX2JpdHJhdGUgJiYgZXNkcy0+ZXMuZGVjX2NvbmZfZGVzYy5hdmdfYml0cmF0ZSA9PSAwKQorICAgICAgZXNkcy0+ZXMuZGVjX2NvbmZfZGVzYy5hdmdfYml0cmF0ZSA9IGF2Z19iaXRyYXRlOworICAgIGlmIChtYXhfYml0cmF0ZSAmJiBlc2RzLT5lcy5kZWNfY29uZl9kZXNjLm1heF9iaXRyYXRlID09IDApCisgICAgICBlc2RzLT5lcy5kZWNfY29uZl9kZXNjLm1heF9iaXRyYXRlID0gbWF4X2JpdHJhdGU7CisgIH0KKyAgaWYgKGJ0cnQpIHsKKyAgICAvKiB0eXBlKDRieXRlcykgKyBzaXplKDRieXRlcykgKyBidWZmZXJzaXplKDRieXRlcykgKworICAgICAqIG1heGJpdHJhdGUoYnl0ZXMpICsgYXZnYml0cmF0ZShieXRlcykgKi8KKyAgICBpZiAobWF4X2JpdHJhdGUgJiYgR1NUX1JFQURfVUlOVDMyX0JFIChidHJ0LT5kYXRhICsgNCkgPT0gMCkKKyAgICAgIEdTVF9XUklURV9VSU5UMzJfQkUgKGJ0cnQtPmRhdGEgKyA0LCBtYXhfYml0cmF0ZSk7CisgICAgaWYgKGF2Z19iaXRyYXRlICYmIEdTVF9SRUFEX1VJTlQzMl9CRSAoYnRydC0+ZGF0YSArIDgpID09IDApCisgICAgICBHU1RfV1JJVEVfVUlOVDMyX0JFIChidHJ0LT5kYXRhICsgOCwgYXZnX2JpdHJhdGUpOworICB9Cit9CisKK3ZvaWQKK2F0b21fdHJha190eDNnX3VwZGF0ZV9kaW1lbnNpb24gKEF0b21UUkFLICogdHJhaywgZ3VpbnQzMiB3aWR0aCwgZ3VpbnQzMiBoZWlnaHQpCit7CisgIEF0b21TVFNEICpzdHNkOworICBHTGlzdCAqaXRlcjsKKyAgU2FtcGxlVGFibGVFbnRyeVRYM0cgKnR4M2cgPSBOVUxMOworCisgIHN0c2QgPSAmdHJhay0+bWRpYS5taW5mLnN0Ymwuc3RzZDsKKyAgZm9yIChpdGVyID0gc3RzZC0+ZW50cmllczsgaXRlciAmJiB0eDNnID09IE5VTEw7IGl0ZXIgPSBnX2xpc3RfbmV4dCAoaXRlcikpIHsKKyAgICBTYW1wbGVUYWJsZUVudHJ5ICplbnRyeSA9IGl0ZXItPmRhdGE7CisKKyAgICBzd2l0Y2ggKGVudHJ5LT5raW5kKSB7CisgICAgICBjYXNlIFNVQlRJVExFOnsKKyAgICAgICAgdHgzZyA9IChTYW1wbGVUYWJsZUVudHJ5VFgzRyAqKSBlbnRyeTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBDdXJyZW50bHkgd2UgbmV2ZXIgc2V0IHRoZSB2ZXJ0aWNhbCBwbGFjZW1lbnQgZmxhZywgc28gd2UgZG9uJ3QKKyAgICogY2hlY2sgZm9yIGl0IHRvIHNldCB0aGUgZGltZW5zaW9ucyBkaWZmZXJlbnRseSBhcyB0aGUgc3BlYyBzYXlzLgorICAgKiBBbHdheXMgZG8gaXQgZm9yIHRoZSBub3Qgc2V0IGNhc2UgKi8KKyAgaWYgKHR4M2cpIHsKKyAgICB0eDNnLT5mb250X3NpemUgPSAwLjA1ICogaGVpZ2h0OworCisgICAgaGVpZ2h0ID0gMC4xNSAqIGhlaWdodDsKKyAgICB0cmFrLT50a2hkLndpZHRoID0gd2lkdGggPDwgMTY7CisgICAgdHJhay0+dGtoZC5oZWlnaHQgPSBoZWlnaHQgPDwgMTY7CisgICAgdHgzZy0+ZGVmYXVsdF90ZXh0X2JveCA9IHdpZHRoIHwgKGhlaWdodCA8PCAxNik7CisgIH0KK30KKworLyoKKyAqIE1ldGEgdGFncyBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQKK2F0b21fdGFnX2RhdGFfYWxsb2NfZGF0YSAoQXRvbVRhZ0RhdGEgKiBkYXRhLCBndWludCBzaXplKQoreworICBnX2ZyZWUgKGRhdGEtPmRhdGEpOworICBkYXRhLT5kYXRhID0gZ19uZXcwIChndWludDgsIHNpemUpOworICBkYXRhLT5kYXRhbGVuID0gc2l6ZTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdWR0YV9hcHBlbmRfdGFnIChBdG9tVURUQSAqIHVkdGEsIEF0b21JbmZvICogdGFnKQoreworICBHTGlzdCAqKmVudHJpZXM7CisKKyAgaWYgKHVkdGEtPm1ldGEpCisgICAgZW50cmllcyA9ICZ1ZHRhLT5tZXRhLT5pbHN0LT5lbnRyaWVzOworICBlbHNlCisgICAgZW50cmllcyA9ICZ1ZHRhLT5lbnRyaWVzOworICAqZW50cmllcyA9IGdfbGlzdF9hcHBlbmQgKCplbnRyaWVzLCB0YWcpOworfQorCit2b2lkCithdG9tX3VkdGFfYWRkX3RhZyAoQXRvbVVEVEEgKiB1ZHRhLCBndWludDMyIGZvdXJjYywgZ3VpbnQzMiBmbGFncywKKyAgICBjb25zdCBndWludDggKiBkYXRhLCBndWludCBzaXplKQoreworICBBdG9tVGFnICp0YWc7CisgIEF0b21UYWdEYXRhICp0ZGF0YTsKKworICB0YWcgPSBhdG9tX3RhZ19uZXcgKGZvdXJjYywgZmxhZ3MpOworICB0ZGF0YSA9ICZ0YWctPmRhdGE7CisgIGF0b21fdGFnX2RhdGFfYWxsb2NfZGF0YSAodGRhdGEsIHNpemUpOworICBtZW1tb3ZlICh0ZGF0YS0+ZGF0YSwgZGF0YSwgc2l6ZSk7CisKKyAgYXRvbV91ZHRhX2FwcGVuZF90YWcgKHVkdGEsCisgICAgICBidWlsZF9hdG9tX2luZm9fd3JhcHBlciAoKEF0b20gKikgdGFnLCBhdG9tX3RhZ19jb3B5X2RhdGEsCisgICAgICAgICAgYXRvbV90YWdfZnJlZSkpOworfQorCit2b2lkCithdG9tX3VkdGFfYWRkX3N0cl90YWcgKEF0b21VRFRBICogdWR0YSwgZ3VpbnQzMiBmb3VyY2MsIGNvbnN0IGdjaGFyICogdmFsdWUpCit7CisgIGdpbnQgbGVuID0gc3RybGVuICh2YWx1ZSk7CisKKyAgaWYgKGxlbiA+IDApCisgICAgYXRvbV91ZHRhX2FkZF90YWcgKHVkdGEsIGZvdXJjYywgTUVUQURBVEFfVEVYVF9GTEFHLCAoZ3VpbnQ4ICopIHZhbHVlLCBsZW4pOworfQorCit2b2lkCithdG9tX3VkdGFfYWRkX3VpbnRfdGFnIChBdG9tVURUQSAqIHVkdGEsIGd1aW50MzIgZm91cmNjLCBndWludDMyIGZsYWdzLAorICAgIGd1aW50MzIgdmFsdWUpCit7CisgIGd1aW50OCBkYXRhWzhdID0geyAwLCB9OworCisgIGlmIChmbGFncykgeworICAgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEsIHZhbHVlKTsKKyAgICBhdG9tX3VkdGFfYWRkX3RhZyAodWR0YSwgZm91cmNjLCBmbGFncywgZGF0YSwgMik7CisgIH0gZWxzZSB7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDIsIHZhbHVlKTsKKyAgICBhdG9tX3VkdGFfYWRkX3RhZyAodWR0YSwgZm91cmNjLCBmbGFncywgZGF0YSwgOCk7CisgIH0KK30KKworI2RlZmluZSBHU1RfQlVGRkVSX05FV19SRUFET05MWShtZW0sIHNpemUpIFwKKyAgICBnc3RfYnVmZmVyX25ld193cmFwcGVkX2Z1bGwgKEdTVF9NRU1PUllfRkxBR19SRUFET05MWSwgbWVtLCBzaXplLCBcCisgICAgMCwgc2l6ZSwgbWVtLCBOVUxMKQorCit2b2lkCithdG9tX3VkdGFfYWRkX2Jsb2JfdGFnIChBdG9tVURUQSAqIHVkdGEsIGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUpCit7CisgIEF0b21EYXRhICpkYXRhX2F0b207CisgIGd1aW50IGxlbjsKKyAgZ3VpbnQzMiBmb3VyY2M7CisKKyAgaWYgKHNpemUgPCA4KQorICAgIHJldHVybjsKKworICAvKiBibG9iIGlzIHVucGFyc2VkIGF0b207CisgICAqIGV4dHJhY3Qgc2l6ZSBhbmQgZm91cmNjLCBhbmQgd3JhcCByZW1haW5kZXIgaW4gZGF0YSBhdG9tICovCisgIGxlbiA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoZGF0YSk7CisgIGZvdXJjYyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDQpOworICBpZiAobGVuID4gc2l6ZSkKKyAgICByZXR1cm47CisKKyAgZGF0YV9hdG9tID0gYXRvbV9kYXRhX25ld19mcm9tX2RhdGEgKGZvdXJjYywgZGF0YSArIDgsIGxlbiAtIDgpOworCisgIGF0b21fdWR0YV9hcHBlbmRfdGFnICh1ZHRhLAorICAgICAgYnVpbGRfYXRvbV9pbmZvX3dyYXBwZXIgKChBdG9tICopIGRhdGFfYXRvbSwgYXRvbV9kYXRhX2NvcHlfZGF0YSwKKyAgICAgICAgICBhdG9tX2RhdGFfZnJlZSkpOworfQorCit2b2lkCithdG9tX3VkdGFfYWRkXzNncF90YWcgKEF0b21VRFRBICogdWR0YSwgZ3VpbnQzMiBmb3VyY2MsIGd1aW50OCAqIGRhdGEsCisgICAgZ3VpbnQgc2l6ZSkKK3sKKyAgQXRvbURhdGEgKmRhdGFfYXRvbTsKKworICBkYXRhX2F0b20gPSBhdG9tX2RhdGFfbmV3IChmb3VyY2MpOworCisgIC8qIG5lZWQgZnVsbCBhdG9tICovCisgIGF0b21fZGF0YV9hbGxvY19tZW0gKGRhdGFfYXRvbSwgc2l6ZSArIDQpOworCisgIC8qIGZ1bGwgYXRvbTogdmVyc2lvbiBhbmQgZmxhZ3MgKi8KKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YV9hdG9tLT5kYXRhLCAwKTsKKyAgbWVtY3B5IChkYXRhX2F0b20tPmRhdGEgKyA0LCBkYXRhLCBzaXplKTsKKworICBhdG9tX3VkdGFfYXBwZW5kX3RhZyAodWR0YSwKKyAgICAgIGJ1aWxkX2F0b21faW5mb193cmFwcGVyICgoQXRvbSAqKSBkYXRhX2F0b20sIGF0b21fZGF0YV9jb3B5X2RhdGEsCisgICAgICAgICAgYXRvbV9kYXRhX2ZyZWUpKTsKK30KKworZ3VpbnQxNgorbGFuZ3VhZ2VfY29kZSAoY29uc3QgY2hhciAqbGFuZykKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGxhbmcgIT0gTlVMTCwgMCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzdHJsZW4gKGxhbmcpID09IDMsIDApOworCisgIHJldHVybiAoKChsYW5nWzBdIC0gMHg2MCkgJiAweDFGKSA8PCAxMCkgKyAoKChsYW5nWzFdIC0gMHg2MCkgJiAweDFGKSA8PCA1KSArCisgICAgICAoKGxhbmdbMl0gLSAweDYwKSAmIDB4MUYpOworfQorCit2b2lkCithdG9tX3VkdGFfYWRkXzNncF9zdHJfaW50X3RhZyAoQXRvbVVEVEEgKiB1ZHRhLCBndWludDMyIGZvdXJjYywKKyAgICBjb25zdCBnY2hhciAqIHZhbHVlLCBnaW50MTYgaXZhbHVlKQoreworICBnaW50IGxlbiA9IDAsIHNpemUgPSAwOworICBndWludDggKmRhdGE7CisKKyAgaWYgKHZhbHVlKSB7CisgICAgbGVuID0gc3RybGVuICh2YWx1ZSk7CisgICAgc2l6ZSA9IGxlbiArIDM7CisgIH0KKworICBpZiAoaXZhbHVlID49IDApCisgICAgc2l6ZSArPSAyOworCisgIGRhdGEgPSBnX21hbGxvYyAoc2l6ZSArIDMpOworICAvKiBsYW5ndWFnZSB0YWcgYW5kIG51bGwtdGVybWluYXRlZCBVVEYtOCBzdHJpbmcgKi8KKyAgaWYgKHZhbHVlKSB7CisgICAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoZGF0YSwgbGFuZ3VhZ2VfY29kZSAoR1NUX1FUX01VWF9ERUZBVUxUX1RBR19MQU5HVUFHRSkpOworICAgIC8qIGluY2x1ZGUgMCB0ZXJtaW5hdG9yICovCisgICAgbWVtY3B5IChkYXRhICsgMiwgdmFsdWUsIGxlbiArIDEpOworICB9CisgIC8qIDE2LWJpdCB1bnNpZ25lZCBpbnQgaWYgc3RhbmRhbG9uZSwgb3RoZXJ3aXNlIDgtYml0ICovCisgIGlmIChpdmFsdWUgPj0gMCkgeworICAgIGlmIChzaXplID09IDIpCisgICAgICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhICsgc2l6ZSAtIDIsIGl2YWx1ZSk7CisgICAgZWxzZSB7CisgICAgICBHU1RfV1JJVEVfVUlOVDggKGRhdGEgKyBzaXplIC0gMiwgaXZhbHVlICYgMHhGRik7CisgICAgICBzaXplLS07CisgICAgfQorICB9CisKKyAgYXRvbV91ZHRhX2FkZF8zZ3BfdGFnICh1ZHRhLCBmb3VyY2MsIGRhdGEsIHNpemUpOworICBnX2ZyZWUgKGRhdGEpOworfQorCit2b2lkCithdG9tX3VkdGFfYWRkXzNncF9zdHJfdGFnIChBdG9tVURUQSAqIHVkdGEsIGd1aW50MzIgZm91cmNjLCBjb25zdCBnY2hhciAqIHZhbHVlKQoreworICBhdG9tX3VkdGFfYWRkXzNncF9zdHJfaW50X3RhZyAodWR0YSwgZm91cmNjLCB2YWx1ZSwgLTEpOworfQorCit2b2lkCithdG9tX3VkdGFfYWRkXzNncF91aW50X3RhZyAoQXRvbVVEVEEgKiB1ZHRhLCBndWludDMyIGZvdXJjYywgZ3VpbnQxNiB2YWx1ZSkKK3sKKyAgYXRvbV91ZHRhX2FkZF8zZ3Bfc3RyX2ludF90YWcgKHVkdGEsIGZvdXJjYywgTlVMTCwgdmFsdWUpOworfQorCit2b2lkCithdG9tX3VkdGFfYWRkX3htcF90YWdzIChBdG9tVURUQSAqIHVkdGEsIEdzdEJ1ZmZlciAqIHhtcGJ1ZmZlcikKK3sKKyAgQXRvbURhdGEgKmRhdGFfYXRvbSA9IE5VTEw7CisKKyAgaWYgKHVkdGEtPmNvbnRleHQtPmZsYXZvciA9PSBBVE9NU19UUkVFX0ZMQVZPUl9NT1YpIHsKKyAgICBpZiAoeG1wYnVmZmVyKSB7CisgICAgICBkYXRhX2F0b20gPSBhdG9tX2RhdGFfbmV3X2Zyb21fZ3N0X2J1ZmZlciAoRk9VUkNDX1hNUF8sIHhtcGJ1ZmZlcik7CisgICAgICB1ZHRhLT5lbnRyaWVzID0gZ19saXN0X2FwcGVuZCAodWR0YS0+ZW50cmllcywKKyAgICAgICAgICBidWlsZF9hdG9tX2luZm9fd3JhcHBlciAoKEF0b20gKikgZGF0YV9hdG9tLCBhdG9tX2RhdGFfY29weV9kYXRhLAorICAgICAgICAgICAgICBhdG9tX2RhdGFfZnJlZSkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUcgKCJOb3QgYWRkaW5nIHhtcCB0byBtb292IGF0b20sIGl0IGlzIG9ubHkgdXNlZCBpbiAnbW92JyBmb3JtYXQiKTsKKyAgfQorfQorCisvKgorICogRnVuY3Rpb25zIGZvciBzcGVjaWZ5aW5nIG1lZGlhIHR5cGVzCisgKi8KKworc3RhdGljIHZvaWQKK2F0b21fbWluZl9zZXRfYXVkaW8gKEF0b21NSU5GICogbWluZikKK3sKKyAgYXRvbV9taW5mX2NsZWFyX2hhbmRsZXJzIChtaW5mKTsKKyAgbWluZi0+c21oZCA9IGF0b21fc21oZF9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX21pbmZfc2V0X3ZpZGVvIChBdG9tTUlORiAqIG1pbmYsIEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIGF0b21fbWluZl9jbGVhcl9oYW5kbGVycyAobWluZik7CisgIG1pbmYtPnZtaGQgPSBhdG9tX3ZtaGRfbmV3IChjb250ZXh0KTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fbWluZl9zZXRfc3VidGl0bGUgKEF0b21NSU5GICogbWluZikKK3sKKyAgYXRvbV9taW5mX2NsZWFyX2hhbmRsZXJzIChtaW5mKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21faGRscl9zZXRfdHlwZSAoQXRvbUhETFIgKiBoZGxyLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0LCBndWludDMyIGNvbXBfdHlwZSwKKyAgICBndWludDMyIGhkbHJfdHlwZSkKK3sKKyAgaWYgKGNvbnRleHQtPmZsYXZvciA9PSBBVE9NU19UUkVFX0ZMQVZPUl9NT1YpIHsKKyAgICBoZGxyLT5jb21wb25lbnRfdHlwZSA9IGNvbXBfdHlwZTsKKyAgfQorICBoZGxyLT5oYW5kbGVyX3R5cGUgPSBoZGxyX3R5cGU7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2hkbHJfc2V0X25hbWUgKEF0b21IRExSICogaGRsciwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgZ19mcmVlIChoZGxyLT5uYW1lKTsKKyAgaGRsci0+bmFtZSA9IGdfc3RyZHVwIChuYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fbWRpYV9zZXRfaGRscl90eXBlX2F1ZGlvIChBdG9tTURJQSAqIG1kaWEsIEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIGF0b21faGRscl9zZXRfdHlwZSAoJm1kaWEtPmhkbHIsIGNvbnRleHQsIEZPVVJDQ19taGxyLCBGT1VSQ0Nfc291bik7CisgIC8qIFNvbWUgcGxheWVycyAobG93LWVuZCBoYXJkd2FyZSkgY2hlY2sgZm9yIHRoaXMgbmFtZSwgd2hpY2ggaXMgd2hhdAorICAgKiBRdWlja1RpbWUgaXRzZWxmIHNldHMgKi8KKyAgYXRvbV9oZGxyX3NldF9uYW1lICgmbWRpYS0+aGRsciwgIlNvdW5kSGFuZGxlciIpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9tZGlhX3NldF9oZGxyX3R5cGVfdmlkZW8gKEF0b21NRElBICogbWRpYSwgQXRvbXNDb250ZXh0ICogY29udGV4dCkKK3sKKyAgYXRvbV9oZGxyX3NldF90eXBlICgmbWRpYS0+aGRsciwgY29udGV4dCwgRk9VUkNDX21obHIsIEZPVVJDQ192aWRlKTsKKyAgLyogU29tZSBwbGF5ZXJzIChsb3ctZW5kIGhhcmR3YXJlKSBjaGVjayBmb3IgdGhpcyBuYW1lLCB3aGljaCBpcyB3aGF0CisgICAqIFF1aWNrVGltZSBpdHNlbGYgc2V0cyAqLworICBhdG9tX2hkbHJfc2V0X25hbWUgKCZtZGlhLT5oZGxyLCAiVmlkZW9IYW5kbGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX21kaWFfc2V0X2hkbHJfdHlwZV9zdWJ0aXRsZSAoQXRvbU1ESUEgKiBtZGlhLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0KQoreworICBhdG9tX2hkbHJfc2V0X3R5cGUgKCZtZGlhLT5oZGxyLCBjb250ZXh0LCBGT1VSQ0NfbWhsciwgRk9VUkNDX3NidGwpOworCisgIC8qIEp1c3QgZm9sbG93cyB0aGUgcGF0dGVybiBmcm9tIHZpZGVvIGFuZCBhdWRpbyBhYm92ZSAqLworICBhdG9tX2hkbHJfc2V0X25hbWUgKCZtZGlhLT5oZGxyLCAiU3VidGl0bGVIYW5kbGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX21kaWFfc2V0X2F1ZGlvIChBdG9tTURJQSAqIG1kaWEsIEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIGF0b21fbWRpYV9zZXRfaGRscl90eXBlX2F1ZGlvIChtZGlhLCBjb250ZXh0KTsKKyAgYXRvbV9taW5mX3NldF9hdWRpbyAoJm1kaWEtPm1pbmYpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9tZGlhX3NldF92aWRlbyAoQXRvbU1ESUEgKiBtZGlhLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0KQoreworICBhdG9tX21kaWFfc2V0X2hkbHJfdHlwZV92aWRlbyAobWRpYSwgY29udGV4dCk7CisgIGF0b21fbWluZl9zZXRfdmlkZW8gKCZtZGlhLT5taW5mLCBjb250ZXh0KTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fbWRpYV9zZXRfc3VidGl0bGUgKEF0b21NRElBICogbWRpYSwgQXRvbXNDb250ZXh0ICogY29udGV4dCkKK3sKKyAgYXRvbV9tZGlhX3NldF9oZGxyX3R5cGVfc3VidGl0bGUgKG1kaWEsIGNvbnRleHQpOworICBhdG9tX21pbmZfc2V0X3N1YnRpdGxlICgmbWRpYS0+bWluZik7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3RraGRfc2V0X2F1ZGlvIChBdG9tVEtIRCAqIHRraGQpCit7CisgIHRraGQtPnZvbHVtZSA9IDB4MDEwMDsKKyAgdGtoZC0+d2lkdGggPSB0a2hkLT5oZWlnaHQgPSAwOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90a2hkX3NldF92aWRlbyAoQXRvbVRLSEQgKiB0a2hkLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0LCBndWludDMyIHdpZHRoLAorICAgIGd1aW50MzIgaGVpZ2h0KQoreworICB0a2hkLT52b2x1bWUgPSAwOworCisgIC8qIHF0IGFuZCBJU08gYmFzZSBtZWRpYSBkbyBub3QgY29udHJhZGljdCwgYW5kIGV4YW1wbGVzIGFncmVlICovCisgIHRraGQtPndpZHRoID0gd2lkdGg7CisgIHRraGQtPmhlaWdodCA9IGhlaWdodDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdGtoZF9zZXRfc3VidGl0bGUgKEF0b21US0hEICogdGtoZCwgQXRvbXNDb250ZXh0ICogY29udGV4dCwgZ3VpbnQzMiB3aWR0aCwKKyAgICBndWludDMyIGhlaWdodCkKK3sKKyAgdGtoZC0+dm9sdW1lID0gMDsKKworICAvKiBxdCBhbmQgSVNPIGJhc2UgbWVkaWEgZG8gbm90IGNvbnRyYWRpY3QsIGFuZCBleGFtcGxlcyBhZ3JlZSAqLworICB0a2hkLT53aWR0aCA9IHdpZHRoOworICB0a2hkLT5oZWlnaHQgPSBoZWlnaHQ7Cit9CisKKworc3RhdGljIHZvaWQKK2F0b21fZWR0c19hZGRfZW50cnkgKEF0b21FRFRTICogZWR0cywgZ2ludCBpbmRleCwgRWRpdExpc3RFbnRyeSAqIGVudHJ5KQoreworICBFZGl0TGlzdEVudHJ5ICplID0KKyAgICAgIChFZGl0TGlzdEVudHJ5ICopIGdfc2xpc3RfbnRoX2RhdGEgKGVkdHMtPmVsc3QuZW50cmllcywgaW5kZXgpOworICAvKiBDcmVhdGUgYSBuZXcgZW50cnkgaWYgbWlzc2luZyAoYXBwZW5kcyB0byB0aGUgbGlzdCBpZiBpbmRleCBpcyBsYXJnZXIpICovCisgIGlmIChlID09IE5VTEwpIHsKKyAgICBlID0gZ19uZXcgKEVkaXRMaXN0RW50cnksIDEpOworICAgIGVkdHMtPmVsc3QuZW50cmllcyA9IGdfc2xpc3RfaW5zZXJ0IChlZHRzLT5lbHN0LmVudHJpZXMsIGUsIGluZGV4KTsKKyAgfQorCisgIC8qIFVwZGF0ZSB0aGUgZW50cnkgKi8KKyAgKmUgPSAqZW50cnk7Cit9CisKK3ZvaWQKK2F0b21fdHJha19lZHRzX2NsZWFyIChBdG9tVFJBSyAqIHRyYWspCit7CisgIGlmICh0cmFrLT5lZHRzKSB7CisgICAgYXRvbV9lZHRzX2ZyZWUgKHRyYWstPmVkdHMpOworICAgIHRyYWstPmVkdHMgPSBOVUxMOworICB9Cit9CisKKy8qCisgKiBVcGRhdGUgYW4gZW50cnkgaW4gdGhpcyB0cmFrIGVkaXRzIGxpc3QsIGNyZWF0aW5nIGl0IGlmIG5lZWRlZC4KKyAqIGluZGV4IGlzIHRoZSBpbmRleCBvZiB0aGUgZW50cnkgdG8gdXBkYXRlLCBvciBjcmVhdGUgaWYgaXQncyBwYXN0IHRoZSBlbmQuCisgKiBkdXJhdGlvbiBpcyBpbiB0aGUgbW9vdidzIHRpbWVzY2FsZQorICogbWVkaWFfdGltZSBpcyB0aGUgb2Zmc2V0IGluIHRoZSBtZWRpYSB0aW1lIHRvIHN0YXJ0IGZyb20gKG1lZGlhJ3MgdGltZXNjYWxlKQorICogcmF0ZSBpcyBhIDMyIGJpdHMgZml4ZWQtcG9pbnQKKyAqLwordm9pZAorYXRvbV90cmFrX3NldF9lbHN0X2VudHJ5IChBdG9tVFJBSyAqIHRyYWssIGdpbnQgaW5kZXgsCisgICAgZ3VpbnQzMiBkdXJhdGlvbiwgZ3VpbnQzMiBtZWRpYV90aW1lLCBndWludDMyIHJhdGUpCit7CisgIEVkaXRMaXN0RW50cnkgZW50cnk7CisKKyAgZW50cnkuZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgZW50cnkubWVkaWFfdGltZSA9IG1lZGlhX3RpbWU7CisgIGVudHJ5Lm1lZGlhX3JhdGUgPSByYXRlOworCisgIGlmICh0cmFrLT5lZHRzID09IE5VTEwpCisgICAgdHJhay0+ZWR0cyA9IGF0b21fZWR0c19uZXcgKCk7CisKKyAgYXRvbV9lZHRzX2FkZF9lbnRyeSAodHJhay0+ZWR0cywgaW5kZXgsICZlbnRyeSk7Cit9CisKKy8qIHJlLW5lZ290aWF0aW9uIGlzIHByZXZlbnRlZCBhdCB0b3AtbGV2ZWwsIHNvIG9ubHkgMSBlbnRyeSBleHBlY3RlZC4KKyAqIFF1aXRlIHNvbWUgbW9yZSBjYXJlIGhlcmUgYW5kIGVsc2V3aGVyZSBtYXkgYmUgbmVlZGVkIHRvCisgKiBzdXBwb3J0IHNldmVyYWwgZW50cmllcyAqLworc3RhdGljIFNhbXBsZVRhYmxlRW50cnlNUDRBICoKK2F0b21fdHJha19hZGRfYXVkaW9fZW50cnkgKEF0b21UUkFLICogdHJhaywgQXRvbXNDb250ZXh0ICogY29udGV4dCwKKyAgICBndWludDMyIHR5cGUpCit7CisgIEF0b21TVFNEICpzdHNkID0gJnRyYWstPm1kaWEubWluZi5zdGJsLnN0c2Q7CisgIFNhbXBsZVRhYmxlRW50cnlNUDRBICptcDRhID0gc2FtcGxlX2VudHJ5X21wNGFfbmV3ICgpOworCisgIG1wNGEtPnNlLmhlYWRlci50eXBlID0gdHlwZTsKKyAgbXA0YS0+c2Uua2luZCA9IEFVRElPOworICBtcDRhLT5jb21wcmVzc2lvbl9pZCA9IC0xOworICBtcDRhLT5zZS5kYXRhX3JlZmVyZW5jZV9pbmRleCA9IDE7CisKKyAgc3RzZC0+ZW50cmllcyA9IGdfbGlzdF9wcmVwZW5kIChzdHNkLT5lbnRyaWVzLCBtcDRhKTsKKyAgc3RzZC0+bl9lbnRyaWVzKys7CisgIHJldHVybiBtcDRhOworfQorCisvKiByZXR1cm4gbnVtYmVyIG9mIGNlbnRpZnJhbWVzIHBlciBzZWNvbmQgKi8KK2d1aW50CithdG9tX2ZyYW1lcmF0ZV90b190aW1lc2NhbGUgKGdpbnQgbiwgZ2ludCBkKQoreworICBpZiAobiA9PSAwKQorICAgIHJldHVybiAxMDAwMDsKKworICBpZiAoZCAhPSAxICYmIGQgIT0gMTAwMSkgeworICAgIC8qIG90aGVyd2lzZSB0aGVyZSBhcmUgcHJvYmFibHkgcm91bmRpbmcgZXJyb3JzIGFuZCB3ZSBzaG91bGQgcmF0aGVyIGd1ZXNzCisgICAgICogaWYgaXQncyBjbG9zZSBlbm91Z2ggdG8gYSB3ZWxsIGtub3duIGZyYW1lcmF0ZSAqLworICAgIGdzdF92aWRlb19ndWVzc19mcmFtZXJhdGUgKGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoZCwgR1NUX1NFQ09ORCwgbiksICZuLAorICAgICAgICAmZCk7CisgIH0KKworICByZXR1cm4gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChuLCAxMDAsIGQpOworfQorCitzdGF0aWMgU2FtcGxlVGFibGVFbnRyeVRNQ0QgKgorYXRvbV90cmFrX2FkZF90aW1lY29kZV9lbnRyeSAoQXRvbVRSQUsgKiB0cmFrLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0LAorICAgIGd1aW50MzIgdHJha190aW1lc2NhbGUsIEdzdFZpZGVvVGltZUNvZGUgKiB0YykKK3sKKyAgQXRvbVNUU0QgKnN0c2QgPSAmdHJhay0+bWRpYS5taW5mLnN0Ymwuc3RzZDsKKyAgU2FtcGxlVGFibGVFbnRyeVRNQ0QgKnRtY2QgPSBzYW1wbGVfZW50cnlfdG1jZF9uZXcgKCk7CisKKyAgZ19hc3NlcnQgKHRyYWtfdGltZXNjYWxlICE9IDApOworCisgIHRyYWstPm1kaWEuaGRsci5jb21wb25lbnRfdHlwZSA9IEZPVVJDQ19taGxyOworICB0cmFrLT5tZGlhLmhkbHIuaGFuZGxlcl90eXBlID0gRk9VUkNDX3RtY2Q7CisgIGdfZnJlZSAodHJhay0+bWRpYS5oZGxyLm5hbWUpOworICB0cmFrLT5tZGlhLmhkbHIubmFtZSA9IGdfc3RyZHVwICgiVGltZSBDb2RlIE1lZGlhIEhhbmRsZXIiKTsKKyAgdHJhay0+bWRpYS5tZGhkLnRpbWVfaW5mby50aW1lc2NhbGUgPSB0cmFrX3RpbWVzY2FsZTsKKworICB0bWNkLT5zZS5raW5kID0gVElNRUNPREU7CisgIHRtY2QtPnNlLmRhdGFfcmVmZXJlbmNlX2luZGV4ID0gMTsKKyAgdG1jZC0+dGNfZmxhZ3MgPSBUQ18yNEhfTUFYOworICBpZiAodGMtPmNvbmZpZy5mbGFncyAmPSBHU1RfVklERU9fVElNRV9DT0RFX0ZMQUdTX0RST1BfRlJBTUUpCisgICAgdG1jZC0+dGNfZmxhZ3MgfD0gVENfRFJPUF9GUkFNRTsKKyAgdG1jZC0+bmFtZS5sYW5ndWFnZV9jb2RlID0gMDsKKyAgdG1jZC0+bmFtZS5uYW1lID0gZ19zdHJkdXAgKCJUYXBlIik7CisgIHRtY2QtPnRpbWVzY2FsZSA9IHRyYWtfdGltZXNjYWxlOworICB0bWNkLT5mcmFtZV9kdXJhdGlvbiA9CisgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHRtY2QtPnRpbWVzY2FsZSwgdGMtPmNvbmZpZy5mcHNfZCwKKyAgICAgIHRjLT5jb25maWcuZnBzX24pOworICBpZiAodGMtPmNvbmZpZy5mcHNfZCA9PSAxMDAxKQorICAgIHRtY2QtPm5fZnJhbWVzID0gdGMtPmNvbmZpZy5mcHNfbiAvIDEwMDA7CisgIGVsc2UKKyAgICB0bWNkLT5uX2ZyYW1lcyA9IHRjLT5jb25maWcuZnBzX24gLyB0Yy0+Y29uZmlnLmZwc19kOworCisgIHN0c2QtPmVudHJpZXMgPSBnX2xpc3RfcHJlcGVuZCAoc3RzZC0+ZW50cmllcywgdG1jZCk7CisgIHN0c2QtPm5fZW50cmllcysrOworICByZXR1cm4gdG1jZDsKK30KKworc3RhdGljIFNhbXBsZVRhYmxlRW50cnlNUDRWICoKK2F0b21fdHJha19hZGRfdmlkZW9fZW50cnkgKEF0b21UUkFLICogdHJhaywgQXRvbXNDb250ZXh0ICogY29udGV4dCwKKyAgICBndWludDMyIHR5cGUpCit7CisgIFNhbXBsZVRhYmxlRW50cnlNUDRWICptcDR2ID0gc2FtcGxlX2VudHJ5X21wNHZfbmV3IChjb250ZXh0KTsKKyAgQXRvbVNUU0QgKnN0c2QgPSAmdHJhay0+bWRpYS5taW5mLnN0Ymwuc3RzZDsKKworICBtcDR2LT5zZS5oZWFkZXIudHlwZSA9IHR5cGU7CisgIG1wNHYtPnNlLmtpbmQgPSBWSURFTzsKKyAgbXA0di0+c2UuZGF0YV9yZWZlcmVuY2VfaW5kZXggPSAxOworICBtcDR2LT5ob3Jpem9udGFsX3Jlc29sdXRpb24gPSA3MiA8PCAxNjsKKyAgbXA0di0+dmVydGljYWxfcmVzb2x1dGlvbiA9IDcyIDw8IDE2OworICBpZiAoY29udGV4dC0+Zmxhdm9yID09IEFUT01TX1RSRUVfRkxBVk9SX01PVikgeworICAgIG1wNHYtPnNwYXRpYWxfcXVhbGl0eSA9IDUxMjsKKyAgICBtcDR2LT50ZW1wb3JhbF9xdWFsaXR5ID0gNTEyOworICB9CisKKyAgc3RzZC0+ZW50cmllcyA9IGdfbGlzdF9wcmVwZW5kIChzdHNkLT5lbnRyaWVzLCBtcDR2KTsKKyAgc3RzZC0+bl9lbnRyaWVzKys7CisgIHJldHVybiBtcDR2OworfQorCitzdGF0aWMgU2FtcGxlVGFibGVFbnRyeVRYM0cgKgorYXRvbV90cmFrX2FkZF9zdWJ0aXRsZV9lbnRyeSAoQXRvbVRSQUsgKiB0cmFrLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0LAorICAgIGd1aW50MzIgdHlwZSkKK3sKKyAgU2FtcGxlVGFibGVFbnRyeVRYM0cgKnR4M2cgPSBzYW1wbGVfZW50cnlfdHgzZ19uZXcgKCk7CisgIEF0b21TVFNEICpzdHNkID0gJnRyYWstPm1kaWEubWluZi5zdGJsLnN0c2Q7CisKKyAgdHgzZy0+c2UuaGVhZGVyLnR5cGUgPSB0eXBlOworICB0eDNnLT5zZS5raW5kID0gU1VCVElUTEU7CisgIHR4M2ctPnNlLmRhdGFfcmVmZXJlbmNlX2luZGV4ID0gMTsKKworICBzdHNkLT5lbnRyaWVzID0gZ19saXN0X3ByZXBlbmQgKHN0c2QtPmVudHJpZXMsIHR4M2cpOworICBzdHNkLT5uX2VudHJpZXMrKzsKKyAgcmV0dXJuIHR4M2c7Cit9CisKKwordm9pZAorYXRvbV90cmFrX3NldF9jb25zdGFudF9zaXplX3NhbXBsZXMgKEF0b21UUkFLICogdHJhaywgZ3VpbnQzMiBzYW1wbGVfc2l6ZSkKK3sKKyAgdHJhay0+bWRpYS5taW5mLnN0Ymwuc3Rzei5zYW1wbGVfc2l6ZSA9IHNhbXBsZV9zaXplOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90cmFrX3NldF9hdWRpbyAoQXRvbVRSQUsgKiB0cmFrLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0KQoreworICBhdG9tX3RraGRfc2V0X2F1ZGlvICgmdHJhay0+dGtoZCk7CisgIGF0b21fbWRpYV9zZXRfYXVkaW8gKCZ0cmFrLT5tZGlhLCBjb250ZXh0KTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdHJha19zZXRfdmlkZW8gKEF0b21UUkFLICogdHJhaywgQXRvbXNDb250ZXh0ICogY29udGV4dCwgZ3VpbnQzMiB3aWR0aCwKKyAgICBndWludDMyIGhlaWdodCkKK3sKKyAgYXRvbV90a2hkX3NldF92aWRlbyAoJnRyYWstPnRraGQsIGNvbnRleHQsIHdpZHRoLCBoZWlnaHQpOworICBhdG9tX21kaWFfc2V0X3ZpZGVvICgmdHJhay0+bWRpYSwgY29udGV4dCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3RyYWtfc2V0X3N1YnRpdGxlIChBdG9tVFJBSyAqIHRyYWssIEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIGF0b21fdGtoZF9zZXRfc3VidGl0bGUgKCZ0cmFrLT50a2hkLCBjb250ZXh0LCAwLCAwKTsKKyAgYXRvbV9tZGlhX3NldF9zdWJ0aXRsZSAoJnRyYWstPm1kaWEsIGNvbnRleHQpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90cmFrX3NldF9hdWRpb19jb21tb25zIChBdG9tVFJBSyAqIHRyYWssIEF0b21zQ29udGV4dCAqIGNvbnRleHQsCisgICAgZ3VpbnQzMiByYXRlKQoreworICBhdG9tX3RyYWtfc2V0X2F1ZGlvICh0cmFrLCBjb250ZXh0KTsKKyAgdHJhay0+bWRpYS5tZGhkLnRpbWVfaW5mby50aW1lc2NhbGUgPSByYXRlOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90cmFrX3NldF92aWRlb19jb21tb25zIChBdG9tVFJBSyAqIHRyYWssIEF0b21zQ29udGV4dCAqIGNvbnRleHQsCisgICAgZ3VpbnQzMiByYXRlLCBndWludDMyIHdpZHRoLCBndWludDMyIGhlaWdodCkKK3sKKyAgYXRvbV90cmFrX3NldF92aWRlbyAodHJhaywgY29udGV4dCwgd2lkdGgsIGhlaWdodCk7CisgIHRyYWstPm1kaWEubWRoZC50aW1lX2luZm8udGltZXNjYWxlID0gcmF0ZTsKKyAgdHJhay0+dGtoZC53aWR0aCA9IHdpZHRoIDw8IDE2OworICB0cmFrLT50a2hkLmhlaWdodCA9IGhlaWdodCA8PCAxNjsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdHJha19zZXRfc3VidGl0bGVfY29tbW9ucyAoQXRvbVRSQUsgKiB0cmFrLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0KQoreworICBhdG9tX3RyYWtfc2V0X3N1YnRpdGxlICh0cmFrLCBjb250ZXh0KTsKKyAgdHJhay0+bWRpYS5tZGhkLnRpbWVfaW5mby50aW1lc2NhbGUgPSAxMDAwOworCisgIHRyYWstPnRraGQuYWx0ZXJuYXRlX2dyb3VwID0gMjsgICAgICAgLyogc2FtZSBmb3IgYWxsIHN1YnRpdGxlcyAqLworICB0cmFrLT50a2hkLmxheWVyID0gLTE7ICAgICAgICAvKiBhYm92ZSB2aWRlbyAobGF5ZXIgMCkgKi8KK30KKwordm9pZAorc2FtcGxlX3RhYmxlX2VudHJ5X2FkZF9leHRfYXRvbSAoU2FtcGxlVGFibGVFbnRyeSAqIHN0ZSwgQXRvbUluZm8gKiBleHQpCit7CisgIEdMaXN0ICoqbGlzdCA9IE5VTEw7CisgIGlmIChzdGUtPmtpbmQgPT0gQVVESU8pIHsKKyAgICBsaXN0ID0gJigoKFNhbXBsZVRhYmxlRW50cnlNUDRBICopIHN0ZSktPmV4dGVuc2lvbl9hdG9tcyk7CisgIH0gZWxzZSBpZiAoc3RlLT5raW5kID09IFZJREVPKSB7CisgICAgbGlzdCA9ICYoKChTYW1wbGVUYWJsZUVudHJ5TVA0ViAqKSBzdGUpLT5leHRlbnNpb25fYXRvbXMpOworICB9IGVsc2UgeworICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgIHJldHVybjsKKyAgfQorCisgICpsaXN0ID0gZ19saXN0X3ByZXBlbmQgKCpsaXN0LCBleHQpOworfQorCitTYW1wbGVUYWJsZUVudHJ5TVA0QSAqCithdG9tX3RyYWtfc2V0X2F1ZGlvX3R5cGUgKEF0b21UUkFLICogdHJhaywgQXRvbXNDb250ZXh0ICogY29udGV4dCwKKyAgICBBdWRpb1NhbXBsZUVudHJ5ICogZW50cnksIGd1aW50MzIgc2NhbGUsIEF0b21JbmZvICogZXh0LCBnaW50IHNhbXBsZV9zaXplKQoreworICBTYW1wbGVUYWJsZUVudHJ5TVA0QSAqc3RlOworCisgIGF0b21fdHJha19zZXRfYXVkaW9fY29tbW9ucyAodHJhaywgY29udGV4dCwgc2NhbGUpOworICBhdG9tX3N0c2RfcmVtb3ZlX2VudHJpZXMgKCZ0cmFrLT5tZGlhLm1pbmYuc3RibC5zdHNkKTsKKyAgc3RlID0gYXRvbV90cmFrX2FkZF9hdWRpb19lbnRyeSAodHJhaywgY29udGV4dCwgZW50cnktPmZvdXJjYyk7CisKKyAgdHJhay0+aXNfdmlkZW8gPSBGQUxTRTsKKyAgdHJhay0+aXNfaDI2NCA9IEZBTFNFOworCisgIHN0ZS0+dmVyc2lvbiA9IGVudHJ5LT52ZXJzaW9uOworICBzdGUtPmNvbXByZXNzaW9uX2lkID0gZW50cnktPmNvbXByZXNzaW9uX2lkOworICBzdGUtPnNhbXBsZV9zaXplID0gZW50cnktPnNhbXBsZV9zaXplOworICBzdGUtPnNhbXBsZV9yYXRlID0gZW50cnktPnNhbXBsZV9yYXRlIDw8IDE2OworICBzdGUtPmNoYW5uZWxzID0gZW50cnktPmNoYW5uZWxzOworCisgIHN0ZS0+c2FtcGxlc19wZXJfcGFja2V0ID0gZW50cnktPnNhbXBsZXNfcGVyX3BhY2tldDsKKyAgc3RlLT5ieXRlc19wZXJfc2FtcGxlID0gZW50cnktPmJ5dGVzX3Blcl9zYW1wbGU7CisgIHN0ZS0+Ynl0ZXNfcGVyX3BhY2tldCA9IGVudHJ5LT5ieXRlc19wZXJfcGFja2V0OworICBzdGUtPmJ5dGVzX3Blcl9mcmFtZSA9IGVudHJ5LT5ieXRlc19wZXJfZnJhbWU7CisKKyAgaWYgKGV4dCkKKyAgICBzdGUtPmV4dGVuc2lvbl9hdG9tcyA9IGdfbGlzdF9wcmVwZW5kIChzdGUtPmV4dGVuc2lvbl9hdG9tcywgZXh0KTsKKworICAvKiAwIHNpemUgbWVhbnMgdmFyaWFibGUgc2l6ZSAqLworICBhdG9tX3RyYWtfc2V0X2NvbnN0YW50X3NpemVfc2FtcGxlcyAodHJhaywgc2FtcGxlX3NpemUpOworCisgIHJldHVybiBzdGU7Cit9CisKK1NhbXBsZVRhYmxlRW50cnlUTUNEICoKK2F0b21fdHJha19zZXRfdGltZWNvZGVfdHlwZSAoQXRvbVRSQUsgKiB0cmFrLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0LAorICAgIGd1aW50MzIgdHJha190aW1lc2NhbGUsIEdzdFZpZGVvVGltZUNvZGUgKiB0YykKK3sKKyAgU2FtcGxlVGFibGVFbnRyeVRNQ0QgKnN0ZTsKKyAgQXRvbUdNSEQgKmdtaGQgPSB0cmFrLT5tZGlhLm1pbmYuZ21oZDsKKworICBpZiAoY29udGV4dC0+Zmxhdm9yICE9IEFUT01TX1RSRUVfRkxBVk9SX01PVikgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgc3RlID0gYXRvbV90cmFrX2FkZF90aW1lY29kZV9lbnRyeSAodHJhaywgY29udGV4dCwgdHJha190aW1lc2NhbGUsIHRjKTsKKworICBnbWhkID0gYXRvbV9nbWhkX25ldyAoKTsKKyAgZ21oZC0+Z21pbi5ncmFwaGljc19tb2RlID0gMHgwMDQwOworICBnbWhkLT5nbWluLm9wY29sb3JbMF0gPSAweDgwMDA7CisgIGdtaGQtPmdtaW4ub3Bjb2xvclsxXSA9IDB4ODAwMDsKKyAgZ21oZC0+Z21pbi5vcGNvbG9yWzJdID0gMHg4MDAwOworICBnbWhkLT50bWNkLnRjbWkudGV4dF9zaXplID0gMTI7CisgIGdtaGQtPnRtY2QudGNtaS5mb250X25hbWUgPSBnX3N0cmR1cCAoIkNoaWNhZ28iKTsgICAgIC8qIFBhc2NhbCBzdHJpbmcgKi8KKworICB0cmFrLT5tZGlhLm1pbmYuZ21oZCA9IGdtaGQ7CisgIHRyYWstPmlzX3ZpZGVvID0gRkFMU0U7CisgIHRyYWstPmlzX2gyNjQgPSBGQUxTRTsKKworICByZXR1cm4gc3RlOworfQorCitzdGF0aWMgQXRvbUluZm8gKgorYnVpbGRfcGFzcF9leHRlbnNpb24gKGdpbnQgcGFyX3dpZHRoLCBnaW50IHBhcl9oZWlnaHQpCit7CisgIEF0b21EYXRhICphdG9tX2RhdGEgPSBhdG9tX2RhdGFfbmV3IChGT1VSQ0NfcGFzcCk7CisgIGd1aW50OCAqZGF0YTsKKworICBhdG9tX2RhdGFfYWxsb2NfbWVtIChhdG9tX2RhdGEsIDgpOworICBkYXRhID0gYXRvbV9kYXRhLT5kYXRhOworCisgIC8qIGloZHIgPSBpbWFnZSBoZWFkZXIgYm94ICovCisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEsIHBhcl93aWR0aCk7CisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEgKyA0LCBwYXJfaGVpZ2h0KTsKKworICByZXR1cm4gYnVpbGRfYXRvbV9pbmZvX3dyYXBwZXIgKChBdG9tICopIGF0b21fZGF0YSwgYXRvbV9kYXRhX2NvcHlfZGF0YSwKKyAgICAgIGF0b21fZGF0YV9mcmVlKTsKK30KKworQXRvbUluZm8gKgorYnVpbGRfZmllbF9leHRlbnNpb24gKEdzdFZpZGVvSW50ZXJsYWNlTW9kZSBtb2RlLCBHc3RWaWRlb0ZpZWxkT3JkZXIgb3JkZXIpCit7CisgIEF0b21EYXRhICphdG9tX2RhdGEgPSBhdG9tX2RhdGFfbmV3IChGT1VSQ0NfZmllbCk7CisgIGd1aW50OCAqZGF0YTsKKyAgZ2ludCBmaWVsZF9vcmRlcjsKKyAgZ2ludCBpbnRlcmxhY2U7CisKKyAgYXRvbV9kYXRhX2FsbG9jX21lbSAoYXRvbV9kYXRhLCAyKTsKKyAgZGF0YSA9IGF0b21fZGF0YS0+ZGF0YTsKKworICBpZiAobW9kZSA9PSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfUFJPR1JFU1NJVkUpIHsKKyAgICBpbnRlcmxhY2UgPSAxOworICAgIGZpZWxkX29yZGVyID0gMDsKKyAgfSBlbHNlIGlmIChtb2RlID09IEdTVF9WSURFT19JTlRFUkxBQ0VfTU9ERV9JTlRFUkxFQVZFRCkgeworICAgIGludGVybGFjZSA9IDI7CisgICAgZmllbGRfb3JkZXIgPSBvcmRlciA9PSBHU1RfVklERU9fRklFTERfT1JERVJfVE9QX0ZJRUxEX0ZJUlNUID8gOSA6IDE0OworICB9IGVsc2UgeworICAgIGludGVybGFjZSA9IDA7CisgICAgZmllbGRfb3JkZXIgPSAwOworICB9CisKKyAgR1NUX1dSSVRFX1VJTlQ4IChkYXRhLCBpbnRlcmxhY2UpOworICBHU1RfV1JJVEVfVUlOVDggKGRhdGEgKyAxLCBmaWVsZF9vcmRlcik7CisKKyAgcmV0dXJuIGJ1aWxkX2F0b21faW5mb193cmFwcGVyICgoQXRvbSAqKSBhdG9tX2RhdGEsIGF0b21fZGF0YV9jb3B5X2RhdGEsCisgICAgICBhdG9tX2RhdGFfZnJlZSk7Cit9CisKK0F0b21JbmZvICoKK2J1aWxkX2NvbHJfZXh0ZW5zaW9uIChjb25zdCBHc3RWaWRlb0NvbG9yaW1ldHJ5ICogY29sb3JpbWV0cnksIGdib29sZWFuIGlzX21wNCkKK3sKKyAgQXRvbURhdGEgKmF0b21fZGF0YSA9IGF0b21fZGF0YV9uZXcgKEZPVVJDQ19jb2xyKTsKKyAgZ3VpbnQ4ICpkYXRhOworICBndWludDE2IHByaW1hcmllczsKKyAgZ3VpbnQxNiB0cmFuc2Zlcl9mdW5jdGlvbjsKKyAgZ3VpbnQxNiBtYXRyaXg7CisKKyAgc3dpdGNoIChjb2xvcmltZXRyeS0+cHJpbWFyaWVzKSB7CisgICAgY2FzZSBHU1RfVklERU9fQ09MT1JfUFJJTUFSSUVTX0JUNzA5OgorICAgICAgcHJpbWFyaWVzID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19CVDQ3MEJHOgorICAgICAgcHJpbWFyaWVzID0gNTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19TTVBURTE3ME06CisgICAgY2FzZSBHU1RfVklERU9fQ09MT1JfUFJJTUFSSUVTX1NNUFRFMjQwTToKKyAgICAgIHByaW1hcmllcyA9IDY7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfQlQyMDIwOgorICAgICAgcHJpbWFyaWVzID0gOTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19VTktOT1dOOgorICAgIGRlZmF1bHQ6CisgICAgICBwcmltYXJpZXMgPSAyOworICAgICAgYnJlYWs7CisgIH0KKworICBzd2l0Y2ggKGNvbG9yaW1ldHJ5LT50cmFuc2ZlcikgeworICAgIGNhc2UgR1NUX1ZJREVPX1RSQU5TRkVSX0JUNzA5OgorICAgICAgdHJhbnNmZXJfZnVuY3Rpb24gPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fVFJBTlNGRVJfU01QVEUyNDBNOgorICAgICAgdHJhbnNmZXJfZnVuY3Rpb24gPSA3OworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fVFJBTlNGRVJfVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgdHJhbnNmZXJfZnVuY3Rpb24gPSAyOworICAgICAgYnJlYWs7CisgIH0KKworICBzd2l0Y2ggKGNvbG9yaW1ldHJ5LT5tYXRyaXgpIHsKKyAgICBjYXNlIEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQ3MDk6CisgICAgICBtYXRyaXggPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fQ09MT1JfTUFUUklYX0JUNjAxOgorICAgICAgbWF0cml4ID0gNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9TTVBURTI0ME06CisgICAgICBtYXRyaXggPSA3OworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fQ09MT1JfTUFUUklYX0JUMjAyMDoKKyAgICAgIG1hdHJpeCA9IDk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19DT0xPUl9NQVRSSVhfVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgbWF0cml4ID0gMjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgYXRvbV9kYXRhX2FsbG9jX21lbSAoYXRvbV9kYXRhLCAxMCArIChpc19tcDQgPyAxIDogMCkpOworICBkYXRhID0gYXRvbV9kYXRhLT5kYXRhOworCisgIC8qIGNvbG91ciBzcGVjaWZpY2F0aW9uIGJveCAqLworICBpZiAoaXNfbXA0KQorICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGRhdGEsIEZPVVJDQ19uY2x4KTsKKyAgZWxzZQorICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGRhdGEsIEZPVVJDQ19uY2xjKTsKKworICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhICsgNCwgcHJpbWFyaWVzKTsKKyAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoZGF0YSArIDYsIHRyYW5zZmVyX2Z1bmN0aW9uKTsKKyAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoZGF0YSArIDgsIG1hdHJpeCk7CisKKyAgaWYgKGlzX21wNCkgeworICAgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDEwLAorICAgICAgICBjb2xvcmltZXRyeS0+cmFuZ2UgPT0gR1NUX1ZJREVPX0NPTE9SX1JBTkdFXzBfMjU1ID8gMHg4MCA6IDB4MDApOworICB9CisKKyAgcmV0dXJuIGJ1aWxkX2F0b21faW5mb193cmFwcGVyICgoQXRvbSAqKSBhdG9tX2RhdGEsIGF0b21fZGF0YV9jb3B5X2RhdGEsCisgICAgICBhdG9tX2RhdGFfZnJlZSk7Cit9CisKK0F0b21JbmZvICoKK2J1aWxkX2NsYXBfZXh0ZW5zaW9uIChnaW50IHdpZHRoX24sIGdpbnQgd2lkdGhfZCwgZ2ludCBoZWlnaHRfbiwgZ2ludCBoZWlnaHRfZCwKKyAgICBnaW50IGhfb2ZmX24sIGdpbnQgaF9vZmZfZCwgZ2ludCB2X29mZl9uLCBnaW50IHZfb2ZmX2QpCit7CisgIEF0b21EYXRhICphdG9tX2RhdGEgPSBhdG9tX2RhdGFfbmV3IChGT1VSQ0NfY2xhcCk7CisgIGd1aW50OCAqZGF0YTsKKworICBhdG9tX2RhdGFfYWxsb2NfbWVtIChhdG9tX2RhdGEsIDMyKTsKKyAgZGF0YSA9IGF0b21fZGF0YS0+ZGF0YTsKKworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhLCB3aWR0aF9uKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDQsIHdpZHRoX2QpOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgOCwgaGVpZ2h0X24pOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgMTIsIGhlaWdodF9kKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDE2LCBoX29mZl9uKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDIwLCBoX29mZl9kKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDI0LCB2X29mZl9uKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDI4LCB2X29mZl9kKTsKKworICByZXR1cm4gYnVpbGRfYXRvbV9pbmZvX3dyYXBwZXIgKChBdG9tICopIGF0b21fZGF0YSwgYXRvbV9kYXRhX2NvcHlfZGF0YSwKKyAgICAgIGF0b21fZGF0YV9mcmVlKTsKK30KKworQXRvbUluZm8gKgorYnVpbGRfdGFwdF9leHRlbnNpb24gKGdpbnQgY2xlZl93aWR0aCwgZ2ludCBjbGVmX2hlaWdodCwgZ2ludCBwcm9mX3dpZHRoLAorICAgIGdpbnQgcHJvZl9oZWlnaHQsIGdpbnQgZW5vZl93aWR0aCwgZ2ludCBlbm9mX2hlaWdodCkKK3sKKyAgQXRvbURhdGEgKmF0b21fZGF0YSA9IGF0b21fZGF0YV9uZXcgKEZPVVJDQ190YXB0KTsKKyAgZ3VpbnQ4ICpkYXRhOworCisgIGF0b21fZGF0YV9hbGxvY19tZW0gKGF0b21fZGF0YSwgNjApOworICBkYXRhID0gYXRvbV9kYXRhLT5kYXRhOworCisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEsIDIwKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoZGF0YSArIDQsIEZPVVJDQ19jbGVmKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDgsIDApOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgMTIsIGNsZWZfd2lkdGgpOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgMTYsIGNsZWZfaGVpZ2h0KTsKKworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgMjAsIDIwKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoZGF0YSArIDI0LCBGT1VSQ0NfcHJvZik7CisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEgKyAyOCwgMCk7CisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEgKyAzMiwgcHJvZl93aWR0aCk7CisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEgKyAzNiwgcHJvZl9oZWlnaHQpOworCisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEgKyA0MCwgMjApOworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhICsgNDQsIEZPVVJDQ19lbm9mKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDQ4LCAwKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDUyLCBlbm9mX3dpZHRoKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDU2LCBlbm9mX2hlaWdodCk7CisKKworICByZXR1cm4gYnVpbGRfYXRvbV9pbmZvX3dyYXBwZXIgKChBdG9tICopIGF0b21fZGF0YSwgYXRvbV9kYXRhX2NvcHlfZGF0YSwKKyAgICAgIGF0b21fZGF0YV9mcmVlKTsKK30KKworc3RhdGljIEF0b21JbmZvICoKK2J1aWxkX21vdl92aWRlb19zYW1wbGVfZGVzY3JpcHRpb25fcGFkZGluZ19leHRlbnNpb24gKHZvaWQpCit7CisgIEF0b21EYXRhICphdG9tX2RhdGEgPSBhdG9tX2RhdGFfbmV3IChGT1VSQ0NfY2xhcCk7CisKKyAgcmV0dXJuIGJ1aWxkX2F0b21faW5mb193cmFwcGVyICgoQXRvbSAqKSBhdG9tX2RhdGEsIGF0b21fY29weV9lbXB0eSwKKyAgICAgIGF0b21fZGF0YV9mcmVlKTsKK30KKworU2FtcGxlVGFibGVFbnRyeU1QNFYgKgorYXRvbV90cmFrX3NldF92aWRlb190eXBlIChBdG9tVFJBSyAqIHRyYWssIEF0b21zQ29udGV4dCAqIGNvbnRleHQsCisgICAgVmlzdWFsU2FtcGxlRW50cnkgKiBlbnRyeSwgZ3VpbnQzMiBzY2FsZSwgR0xpc3QgKiBleHRfYXRvbXNfbGlzdCkKK3sKKyAgU2FtcGxlVGFibGVFbnRyeU1QNFYgKnN0ZTsKKyAgZ3VpbnQgZHdpZHRoLCBkaGVpZ2h0OworICBnaW50IHBhcl9uID0gMCwgcGFyX2QgPSAwOworCisgIHBhcl9uID0gZW50cnktPnBhcl9uOworICBwYXJfZCA9IGVudHJ5LT5wYXJfZDsKKworICBkd2lkdGggPSBlbnRyeS0+d2lkdGg7CisgIGRoZWlnaHQgPSBlbnRyeS0+aGVpZ2h0OworICAvKiBJU08gZmlsZSBzcGVjIHNheXMgdHJhY2sgaGVhZGVyIHcvaCBpbmRpY2F0ZXMgdHJhY2sncyB2aXN1YWwgcHJlc2VudGF0aW9uCisgICAqIChzbyB0aGlzIHRvZ2V0aGVyIHdpdGggcGl4ZWxzIHcvaCBpbXBsaWNpdGx5IGRlZmluZXMgUEFSKSAqLworICBpZiAocGFyX24gJiYgKGNvbnRleHQtPmZsYXZvciAhPSBBVE9NU19UUkVFX0ZMQVZPUl9NT1YpKSB7CisgICAgLyogQXNzdW1lcyBzcXVhcmUgcGl4ZWxzIGRpc3BsYXkgKi8KKyAgICBpZiAoIWdzdF92aWRlb19jYWxjdWxhdGVfZGlzcGxheV9yYXRpbyAoJmR3aWR0aCwgJmRoZWlnaHQsIGVudHJ5LT53aWR0aCwKKyAgICAgICAgICAgIGVudHJ5LT5oZWlnaHQsIHBhcl9uLCBwYXJfZCwgMSwgMSkpIHsKKyAgICAgIEdTVF9XQVJOSU5HICgiQ291bGQgbm90IGNhbGN1bGF0ZSBkaXNwbGF5IHJhdGlvIik7CisgICAgfQorICB9CisKKyAgYXRvbV90cmFrX3NldF92aWRlb19jb21tb25zICh0cmFrLCBjb250ZXh0LCBzY2FsZSwgZHdpZHRoLCBkaGVpZ2h0KTsKKyAgYXRvbV9zdHNkX3JlbW92ZV9lbnRyaWVzICgmdHJhay0+bWRpYS5taW5mLnN0Ymwuc3RzZCk7CisgIHN0ZSA9IGF0b21fdHJha19hZGRfdmlkZW9fZW50cnkgKHRyYWssIGNvbnRleHQsIGVudHJ5LT5mb3VyY2MpOworCisgIHRyYWstPmlzX3ZpZGVvID0gVFJVRTsKKyAgdHJhay0+aXNfaDI2NCA9IChlbnRyeS0+Zm91cmNjID09IEZPVVJDQ19hdmMxCisgICAgICB8fCBlbnRyeS0+Zm91cmNjID09IEZPVVJDQ19hdmMzKTsKKworICBzdGUtPnZlcnNpb24gPSBlbnRyeS0+dmVyc2lvbjsKKyAgc3RlLT53aWR0aCA9IGVudHJ5LT53aWR0aDsKKyAgc3RlLT5oZWlnaHQgPSBlbnRyeS0+aGVpZ2h0OworICBzdGUtPmRlcHRoID0gZW50cnktPmRlcHRoOworICBzdGUtPmNvbG9yX3RhYmxlX2lkID0gZW50cnktPmNvbG9yX3RhYmxlX2lkOworICBzdGUtPmZyYW1lX2NvdW50ID0gZW50cnktPmZyYW1lX2NvdW50OworCisgIGlmIChleHRfYXRvbXNfbGlzdCkKKyAgICBzdGUtPmV4dGVuc2lvbl9hdG9tcyA9IGdfbGlzdF9jb25jYXQgKHN0ZS0+ZXh0ZW5zaW9uX2F0b21zLCBleHRfYXRvbXNfbGlzdCk7CisKKyAgc3RlLT5leHRlbnNpb25fYXRvbXMgPSBnX2xpc3RfYXBwZW5kIChzdGUtPmV4dGVuc2lvbl9hdG9tcywKKyAgICAgIGJ1aWxkX3Bhc3BfZXh0ZW5zaW9uIChwYXJfbiwgcGFyX2QpKTsKKworICBpZiAoY29udGV4dC0+Zmxhdm9yID09IEFUT01TX1RSRUVfRkxBVk9SX01PVikgeworICAgIC8qIGFwcGVuZCAwIGFzIGEgdGVybWluYXRvciAibGVuZ3RoIiB0byB3b3JrIGFyb3VuZCBzb21lIGJyb2tlbiBzb2Z0d2FyZSAqLworICAgIHN0ZS0+ZXh0ZW5zaW9uX2F0b21zID0KKyAgICAgICAgZ19saXN0X2FwcGVuZCAoc3RlLT5leHRlbnNpb25fYXRvbXMsCisgICAgICAgIGJ1aWxkX21vdl92aWRlb19zYW1wbGVfZGVzY3JpcHRpb25fcGFkZGluZ19leHRlbnNpb24gKCkpOworICB9CisKKyAgcmV0dXJuIHN0ZTsKK30KKwordm9pZAorc3VidGl0bGVfc2FtcGxlX2VudHJ5X2luaXQgKFN1YnRpdGxlU2FtcGxlRW50cnkgKiBlbnRyeSkKK3sKKyAgZW50cnktPmZvbnRfc2l6ZSA9IDA7CisgIGVudHJ5LT5mb250X2ZhY2UgPSAwOworICBlbnRyeS0+Zm9yZWdyb3VuZF9jb2xvcl9yZ2JhID0gMHhGRkZGRkZGRjsgICAgLyogYWxsIHdoaXRlLCBvcGFxdWUgKi8KK30KKworU2FtcGxlVGFibGVFbnRyeVRYM0cgKgorYXRvbV90cmFrX3NldF9zdWJ0aXRsZV90eXBlIChBdG9tVFJBSyAqIHRyYWssIEF0b21zQ29udGV4dCAqIGNvbnRleHQsCisgICAgU3VidGl0bGVTYW1wbGVFbnRyeSAqIGVudHJ5KQoreworICBTYW1wbGVUYWJsZUVudHJ5VFgzRyAqdHgzZzsKKworICBhdG9tX3RyYWtfc2V0X3N1YnRpdGxlX2NvbW1vbnMgKHRyYWssIGNvbnRleHQpOworICBhdG9tX3N0c2RfcmVtb3ZlX2VudHJpZXMgKCZ0cmFrLT5tZGlhLm1pbmYuc3RibC5zdHNkKTsKKyAgdHgzZyA9IGF0b21fdHJha19hZGRfc3VidGl0bGVfZW50cnkgKHRyYWssIGNvbnRleHQsIGVudHJ5LT5mb3VyY2MpOworCisgIHR4M2ctPmZvbnRfZmFjZSA9IGVudHJ5LT5mb250X2ZhY2U7CisgIHR4M2ctPmZvbnRfc2l6ZSA9IGVudHJ5LT5mb250X3NpemU7CisgIHR4M2ctPmZvcmVncm91bmRfY29sb3JfcmdiYSA9IGVudHJ5LT5mb3JlZ3JvdW5kX2NvbG9yX3JnYmE7CisKKyAgdHJhay0+aXNfdmlkZW8gPSBGQUxTRTsKKyAgdHJhay0+aXNfaDI2NCA9IEZBTFNFOworCisgIHJldHVybiB0eDNnOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9tZmhkX2luaXQgKEF0b21NRkhEICogbWZoZCwgZ3VpbnQzMiBzZXF1ZW5jZV9udW1iZXIpCit7CisgIGd1aW50OCBmbGFnc1szXSA9IHsgMCwgMCwgMCB9OworCisgIGF0b21fZnVsbF9pbml0ICgmKG1maGQtPmhlYWRlciksIEZPVVJDQ19tZmhkLCAwLCAwLCAwLCBmbGFncyk7CisgIG1maGQtPnNlcXVlbmNlX251bWJlciA9IHNlcXVlbmNlX251bWJlcjsKK30KKworc3RhdGljIHZvaWQKK2F0b21fbW9vZl9pbml0IChBdG9tTU9PRiAqIG1vb2YsIEF0b21zQ29udGV4dCAqIGNvbnRleHQsCisgICAgZ3VpbnQzMiBzZXF1ZW5jZV9udW1iZXIpCit7CisgIGF0b21faGVhZGVyX3NldCAoJm1vb2YtPmhlYWRlciwgRk9VUkNDX21vb2YsIDAsIDApOworICBhdG9tX21maGRfaW5pdCAoJm1vb2YtPm1maGQsIHNlcXVlbmNlX251bWJlcik7CisgIG1vb2YtPnRyYWZzID0gTlVMTDsKK30KKworQXRvbU1PT0YgKgorYXRvbV9tb29mX25ldyAoQXRvbXNDb250ZXh0ICogY29udGV4dCwgZ3VpbnQzMiBzZXF1ZW5jZV9udW1iZXIpCit7CisgIEF0b21NT09GICptb29mID0gZ19uZXcwIChBdG9tTU9PRiwgMSk7CisKKyAgYXRvbV9tb29mX2luaXQgKG1vb2YsIGNvbnRleHQsIHNlcXVlbmNlX251bWJlcik7CisgIHJldHVybiBtb29mOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90cnVuX2ZyZWUgKEF0b21UUlVOICogdHJ1bikKK3sKKyAgYXRvbV9mdWxsX2NsZWFyICgmdHJ1bi0+aGVhZGVyKTsKKyAgYXRvbV9hcnJheV9jbGVhciAoJnRydW4tPmVudHJpZXMpOworICBnX2ZyZWUgKHRydW4pOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9zZHRwX2ZyZWUgKEF0b21TRFRQICogc2R0cCkKK3sKKyAgYXRvbV9mdWxsX2NsZWFyICgmc2R0cC0+aGVhZGVyKTsKKyAgYXRvbV9hcnJheV9jbGVhciAoJnNkdHAtPmVudHJpZXMpOworICBnX2ZyZWUgKHNkdHApOworfQorCit2b2lkCithdG9tX3RyYWZfZnJlZSAoQXRvbVRSQUYgKiB0cmFmKQoreworICBHTGlzdCAqd2Fsa2VyOworCisgIHdhbGtlciA9IHRyYWYtPnRydW5zOworICB3aGlsZSAod2Fsa2VyKSB7CisgICAgYXRvbV90cnVuX2ZyZWUgKChBdG9tVFJVTiAqKSB3YWxrZXItPmRhdGEpOworICAgIHdhbGtlciA9IGdfbGlzdF9uZXh0ICh3YWxrZXIpOworICB9CisgIGdfbGlzdF9mcmVlICh0cmFmLT50cnVucyk7CisgIHRyYWYtPnRydW5zID0gTlVMTDsKKworICB3YWxrZXIgPSB0cmFmLT5zZHRwczsKKyAgd2hpbGUgKHdhbGtlcikgeworICAgIGF0b21fc2R0cF9mcmVlICgoQXRvbVNEVFAgKikgd2Fsa2VyLT5kYXRhKTsKKyAgICB3YWxrZXIgPSBnX2xpc3RfbmV4dCAod2Fsa2VyKTsKKyAgfQorICBnX2xpc3RfZnJlZSAodHJhZi0+c2R0cHMpOworICB0cmFmLT5zZHRwcyA9IE5VTEw7CisKKyAgZ19mcmVlICh0cmFmKTsKK30KKwordm9pZAorYXRvbV9tb29mX2ZyZWUgKEF0b21NT09GICogbW9vZikKK3sKKyAgR0xpc3QgKndhbGtlcjsKKworICB3YWxrZXIgPSBtb29mLT50cmFmczsKKyAgd2hpbGUgKHdhbGtlcikgeworICAgIGF0b21fdHJhZl9mcmVlICgoQXRvbVRSQUYgKikgd2Fsa2VyLT5kYXRhKTsKKyAgICB3YWxrZXIgPSBnX2xpc3RfbmV4dCAod2Fsa2VyKTsKKyAgfQorICBnX2xpc3RfZnJlZSAobW9vZi0+dHJhZnMpOworICBtb29mLT50cmFmcyA9IE5VTEw7CisKKyAgZ19mcmVlIChtb29mKTsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fbWZoZF9jb3B5X2RhdGEgKEF0b21NRkhEICogbWZoZCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJm1maGQtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyIChtZmhkLT5zZXF1ZW5jZV9udW1iZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fdGZoZF9jb3B5X2RhdGEgKEF0b21URkhEICogdGZoZCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworICBndWludDMyIGZsYWdzOworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJnRmaGQtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyICh0ZmhkLT50cmFja19JRCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGZsYWdzID0gYXRvbV9mdWxsX2dldF9mbGFnc19hc191aW50ICgmdGZoZC0+aGVhZGVyKTsKKworICBpZiAoZmxhZ3MgJiBURl9CQVNFX0RBVEFfT0ZGU0VUKQorICAgIHByb3BfY29weV91aW50NjQgKHRmaGQtPmJhc2VfZGF0YV9vZmZzZXQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgaWYgKGZsYWdzICYgVEZfU0FNUExFX0RFU0NSSVBUSU9OX0lOREVYKQorICAgIHByb3BfY29weV91aW50MzIgKHRmaGQtPnNhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBpZiAoZmxhZ3MgJiBURl9ERUZBVUxUX1NBTVBMRV9EVVJBVElPTikKKyAgICBwcm9wX2NvcHlfdWludDMyICh0ZmhkLT5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBpZiAoZmxhZ3MgJiBURl9ERUZBVUxUX1NBTVBMRV9TSVpFKQorICAgIHByb3BfY29weV91aW50MzIgKHRmaGQtPmRlZmF1bHRfc2FtcGxlX3NpemUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgaWYgKGZsYWdzICYgVEZfREVGQVVMVF9TQU1QTEVfRkxBR1MpCisgICAgcHJvcF9jb3B5X3VpbnQzMiAodGZoZC0+ZGVmYXVsdF9zYW1wbGVfZmxhZ3MsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fdGZkdF9jb3B5X2RhdGEgKEF0b21URkRUICogdGZkdCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJnRmZHQtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiAzMi1iaXQgdGltZSBpZiB2ZXJzaW9uID09IDAgZWxzZSA2NC1iaXQ6ICovCisgIGlmICh0ZmR0LT5oZWFkZXIudmVyc2lvbiA9PSAwKQorICAgIHByb3BfY29weV91aW50MzIgKHRmZHQtPmJhc2VfbWVkaWFfZGVjb2RlX3RpbWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgZWxzZQorICAgIHByb3BfY29weV91aW50NjQgKHRmZHQtPmJhc2VfbWVkaWFfZGVjb2RlX3RpbWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fdHJ1bl9jb3B5X2RhdGEgKEF0b21UUlVOICogdHJ1biwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCwgZ3VpbnQzMiAqIGRhdGFfb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisgIGd1aW50MzIgZmxhZ3MsIGk7CisKKyAgZmxhZ3MgPSBhdG9tX2Z1bGxfZ2V0X2ZsYWdzX2FzX3VpbnQgKCZ0cnVuLT5oZWFkZXIpOworCisgIC8qIGlmIGZpcnN0IHRydW4gaW4gbW9vZiwgZm9yY2libHkgYWRkIGRhdGFfb2Zmc2V0IGFuZCByZWNvcmQKKyAgICogd2hlcmUgaXQgbXVzdCBiZSB3cml0dGVuIGxhdGVyIG9uICovCisgIGlmIChkYXRhX29mZnNldCAmJiAhKmRhdGFfb2Zmc2V0KSB7CisgICAgZmxhZ3MgfD0gVFJfREFUQV9PRkZTRVQ7CisgIH0gZWxzZSB7CisgICAgZmxhZ3MgJj0gflRSX0RBVEFfT0ZGU0VUOworICB9CisKKyAgYXRvbV9mdWxsX3NldF9mbGFnc19hc191aW50ICgmdHJ1bi0+aGVhZGVyLCBmbGFncyk7CisKKyAgaWYgKCFhdG9tX2Z1bGxfY29weV9kYXRhICgmdHJ1bi0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHByb3BfY29weV91aW50MzIgKHRydW4tPnNhbXBsZV9jb3VudCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGlmIChmbGFncyAmIFRSX0RBVEFfT0ZGU0VUKSB7CisgICAgKmRhdGFfb2Zmc2V0ID0gKm9mZnNldDsKKyAgICBwcm9wX2NvcHlfaW50MzIgKHRydW4tPmRhdGFfb2Zmc2V0LCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIH0KKyAgaWYgKGZsYWdzICYgVFJfRklSU1RfU0FNUExFX0ZMQUdTKQorICAgIHByb3BfY29weV91aW50MzIgKHRydW4tPmZpcnN0X3NhbXBsZV9mbGFncywgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGZvciAoaSA9IDA7IGkgPCBhdG9tX2FycmF5X2dldF9sZW4gKCZ0cnVuLT5lbnRyaWVzKTsgaSsrKSB7CisgICAgVFJVTlNhbXBsZUVudHJ5ICplbnRyeSA9ICZhdG9tX2FycmF5X2luZGV4ICgmdHJ1bi0+ZW50cmllcywgaSk7CisKKyAgICBpZiAoZmxhZ3MgJiBUUl9TQU1QTEVfRFVSQVRJT04pCisgICAgICBwcm9wX2NvcHlfdWludDMyIChlbnRyeS0+c2FtcGxlX2R1cmF0aW9uLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgaWYgKGZsYWdzICYgVFJfU0FNUExFX1NJWkUpCisgICAgICBwcm9wX2NvcHlfdWludDMyIChlbnRyeS0+c2FtcGxlX3NpemUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgICBpZiAoZmxhZ3MgJiBUUl9TQU1QTEVfRkxBR1MpCisgICAgICBwcm9wX2NvcHlfdWludDMyIChlbnRyeS0+c2FtcGxlX2ZsYWdzLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgaWYgKGZsYWdzICYgVFJfQ09NUE9TSVRJT05fVElNRV9PRkZTRVRTKQorICAgICAgcHJvcF9jb3B5X3VpbnQzMiAoZW50cnktPnNhbXBsZV9jb21wb3NpdGlvbl90aW1lX29mZnNldCwKKyAgICAgICAgICBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fc2R0cF9jb3B5X2RhdGEgKEF0b21TRFRQICogc2R0cCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJnNkdHAtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBhbGwgZW50cmllcyBhdCBvbmNlICovCisgIHByb3BfY29weV9maXhlZF9zaXplX3N0cmluZyAoJmF0b21fYXJyYXlfaW5kZXggKCZzZHRwLT5lbnRyaWVzLCAwKSwKKyAgICAgIGF0b21fYXJyYXlfZ2V0X2xlbiAoJnNkdHAtPmVudHJpZXMpLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX3RyYWZfY29weV9kYXRhIChBdG9tVFJBRiAqIHRyYWYsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQsIGd1aW50MzIgKiBkYXRhX29mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworICBHTGlzdCAqd2Fsa2VyOworCisgIGlmICghYXRvbV9jb3B5X2RhdGEgKCZ0cmFmLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICghYXRvbV90ZmhkX2NvcHlfZGF0YSAoJnRyYWYtPnRmaGQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICghYXRvbV90ZmR0X2NvcHlfZGF0YSAoJnRyYWYtPnRmZHQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgd2Fsa2VyID0gZ19saXN0X2ZpcnN0ICh0cmFmLT50cnVucyk7CisgIHdoaWxlICh3YWxrZXIgIT0gTlVMTCkgeworICAgIGlmICghYXRvbV90cnVuX2NvcHlfZGF0YSAoKEF0b21UUlVOICopIHdhbGtlci0+ZGF0YSwgYnVmZmVyLCBzaXplLCBvZmZzZXQsCisgICAgICAgICAgICBkYXRhX29mZnNldCkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB3YWxrZXIgPSBnX2xpc3RfbmV4dCAod2Fsa2VyKTsKKyAgfQorCisgIHdhbGtlciA9IGdfbGlzdF9maXJzdCAodHJhZi0+c2R0cHMpOworICB3aGlsZSAod2Fsa2VyICE9IE5VTEwpIHsKKyAgICBpZiAoIWF0b21fc2R0cF9jb3B5X2RhdGEgKChBdG9tU0RUUCAqKSB3YWxrZXItPmRhdGEsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHdhbGtlciA9IGdfbGlzdF9uZXh0ICh3YWxrZXIpOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKKy8qIGNyZWF0ZXMgbW9vZiBhdG9tOyBtZXRhZGF0YSBpcyB3cml0dGVuIGV4cGVjdGluZyBhY3R1YWwgYnVmZmVyIGRhdGEKKyAqIGlzIGluIG1kYXRhIGRpcmVjdGx5IGFmdGVyIG1vb2YsIGFuZCBpcyBjb25zZWN1dGl2ZWx5IHdyaXR0ZW4gcGVyIHRyYWsgKi8KK2d1aW50NjQKK2F0b21fbW9vZl9jb3B5X2RhdGEgKEF0b21NT09GICogbW9vZiwgZ3VpbnQ4ICoqIGJ1ZmZlciwKKyAgICBndWludDY0ICogc2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworICBHTGlzdCAqd2Fsa2VyOworICBndWludDMyIGRhdGFfb2Zmc2V0ID0gMDsKKworICBpZiAoIWF0b21fY29weV9kYXRhICgmbW9vZi0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCFhdG9tX21maGRfY29weV9kYXRhICgmbW9vZi0+bWZoZCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKQorICAgIHJldHVybiAwOworCisgIHdhbGtlciA9IGdfbGlzdF9maXJzdCAobW9vZi0+dHJhZnMpOworICB3aGlsZSAod2Fsa2VyICE9IE5VTEwpIHsKKyAgICBpZiAoIWF0b21fdHJhZl9jb3B5X2RhdGEgKChBdG9tVFJBRiAqKSB3YWxrZXItPmRhdGEsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LAorICAgICAgICAgICAgJmRhdGFfb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHdhbGtlciA9IGdfbGlzdF9uZXh0ICh3YWxrZXIpOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKworICBpZiAoKmJ1ZmZlciAmJiBkYXRhX29mZnNldCkgeworICAgIC8qIGZpcnN0IHRydW4gbmVlZHMgYSBkYXRhLW9mZnNldCByZWxhdGl2ZSB0byBtb29mIHN0YXJ0CisgICAgICogICA9IG1vb2Ygc2l6ZSArIG1kYXQgcHJlZml4ICovCisgICAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoKmJ1ZmZlciArIGRhdGFfb2Zmc2V0LCAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0ICsgOCk7CisgIH0KKworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdGZoZF9pbml0IChBdG9tVEZIRCAqIHRmaGQsIGd1aW50MzIgdHJhY2tfSUQpCit7CisgIGd1aW50OCBmbGFnc1szXSA9IHsgMCwgMCwgMCB9OworCisgIGF0b21fZnVsbF9pbml0ICgmdGZoZC0+aGVhZGVyLCBGT1VSQ0NfdGZoZCwgMCwgMCwgMCwgZmxhZ3MpOworICB0ZmhkLT50cmFja19JRCA9IHRyYWNrX0lEOworICB0ZmhkLT5iYXNlX2RhdGFfb2Zmc2V0ID0gMDsKKyAgdGZoZC0+c2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4ID0gMTsKKyAgdGZoZC0+ZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24gPSAwOworICB0ZmhkLT5kZWZhdWx0X3NhbXBsZV9zaXplID0gMDsKKyAgdGZoZC0+ZGVmYXVsdF9zYW1wbGVfZmxhZ3MgPSAwOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90ZmR0X2luaXQgKEF0b21URkRUICogdGZkdCkKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisgIGF0b21fZnVsbF9pbml0ICgmdGZkdC0+aGVhZGVyLCBGT1VSQ0NfdGZkdCwgMCwgMCwgMCwgZmxhZ3MpOworCisgIHRmZHQtPmJhc2VfbWVkaWFfZGVjb2RlX3RpbWUgPSAwOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90cnVuX2luaXQgKEF0b21UUlVOICogdHJ1bikKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZ0cnVuLT5oZWFkZXIsIEZPVVJDQ190cnVuLCAwLCAwLCAwLCBmbGFncyk7CisgIHRydW4tPnNhbXBsZV9jb3VudCA9IDA7CisgIHRydW4tPmRhdGFfb2Zmc2V0ID0gMDsKKyAgdHJ1bi0+Zmlyc3Rfc2FtcGxlX2ZsYWdzID0gMDsKKyAgYXRvbV9hcnJheV9pbml0ICgmdHJ1bi0+ZW50cmllcywgNTEyKTsKK30KKworc3RhdGljIEF0b21UUlVOICoKK2F0b21fdHJ1bl9uZXcgKHZvaWQpCit7CisgIEF0b21UUlVOICp0cnVuID0gZ19uZXcwIChBdG9tVFJVTiwgMSk7CisKKyAgYXRvbV90cnVuX2luaXQgKHRydW4pOworICByZXR1cm4gdHJ1bjsKK30KKworc3RhdGljIHZvaWQKK2F0b21fc2R0cF9pbml0IChBdG9tU0RUUCAqIHNkdHApCit7CisgIGd1aW50OCBmbGFnc1szXSA9IHsgMCwgMCwgMCB9OworCisgIGF0b21fZnVsbF9pbml0ICgmc2R0cC0+aGVhZGVyLCBGT1VSQ0Nfc2R0cCwgMCwgMCwgMCwgZmxhZ3MpOworICBhdG9tX2FycmF5X2luaXQgKCZzZHRwLT5lbnRyaWVzLCA1MTIpOworfQorCitzdGF0aWMgQXRvbVNEVFAgKgorYXRvbV9zZHRwX25ldyAoQXRvbXNDb250ZXh0ICogY29udGV4dCkKK3sKKyAgQXRvbVNEVFAgKnNkdHAgPSBnX25ldzAgKEF0b21TRFRQLCAxKTsKKworICBhdG9tX3NkdHBfaW5pdCAoc2R0cCk7CisgIHJldHVybiBzZHRwOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90cmFmX2FkZF9zZHRwIChBdG9tVFJBRiAqIHRyYWYsIEF0b21TRFRQICogc2R0cCkKK3sKKyAgdHJhZi0+c2R0cHMgPSBnX2xpc3RfYXBwZW5kICh0cmFmLT5zZHRwcywgc2R0cCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3NkdHBfYWRkX3NhbXBsZXMgKEF0b21TRFRQICogc2R0cCwgZ3VpbnQ4IHZhbCkKK3sKKyAgLyogaXQgZG9lcyBub3QgbWFrZSBtdWNoL2FueSBzZW5zZSBhY2NvcmRpbmcgdG8gc3BlY3MsCisgICAqIGJ1dCB0aGF0J3MgaG93IE1TIGlzbWwgc2FtcGxlcyBzZWVtIHRvIGRvIGl0ICovCisgIGF0b21fYXJyYXlfYXBwZW5kICgmc2R0cC0+ZW50cmllcywgdmFsLCAyNTYpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90cnVuX2FkZF9zYW1wbGVzIChBdG9tVFJVTiAqIHRydW4sIGd1aW50MzIgZGVsdGEsIGd1aW50MzIgc2l6ZSwKKyAgICBndWludDMyIGZsYWdzLCBnaW50NjQgcHRzX29mZnNldCkKK3sKKyAgVFJVTlNhbXBsZUVudHJ5IG5lbnRyeTsKKworICBpZiAocHRzX29mZnNldCAhPSAwKQorICAgIHRydW4tPmhlYWRlci5mbGFnc1sxXSB8PSAoVFJfQ09NUE9TSVRJT05fVElNRV9PRkZTRVRTID4+IDgpOworCisgIG5lbnRyeS5zYW1wbGVfZHVyYXRpb24gPSBkZWx0YTsKKyAgbmVudHJ5LnNhbXBsZV9zaXplID0gc2l6ZTsKKyAgbmVudHJ5LnNhbXBsZV9mbGFncyA9IGZsYWdzOworICBuZW50cnkuc2FtcGxlX2NvbXBvc2l0aW9uX3RpbWVfb2Zmc2V0ID0gcHRzX29mZnNldDsKKyAgYXRvbV9hcnJheV9hcHBlbmQgKCZ0cnVuLT5lbnRyaWVzLCBuZW50cnksIDI1Nik7CisgIHRydW4tPnNhbXBsZV9jb3VudCsrOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90cmFmX2luaXQgKEF0b21UUkFGICogdHJhZiwgQXRvbXNDb250ZXh0ICogY29udGV4dCwgZ3VpbnQzMiB0cmFja19JRCkKK3sKKyAgYXRvbV9oZWFkZXJfc2V0ICgmdHJhZi0+aGVhZGVyLCBGT1VSQ0NfdHJhZiwgMCwgMCk7CisgIGF0b21fdGZkdF9pbml0ICgmdHJhZi0+dGZkdCk7CisgIGF0b21fdGZoZF9pbml0ICgmdHJhZi0+dGZoZCwgdHJhY2tfSUQpOworICB0cmFmLT50cnVucyA9IE5VTEw7CisKKyAgaWYgKGNvbnRleHQtPmZsYXZvciA9PSBBVE9NU19UUkVFX0ZMQVZPUl9JU01MKQorICAgIGF0b21fdHJhZl9hZGRfc2R0cCAodHJhZiwgYXRvbV9zZHRwX25ldyAoY29udGV4dCkpOworfQorCitBdG9tVFJBRiAqCithdG9tX3RyYWZfbmV3IChBdG9tc0NvbnRleHQgKiBjb250ZXh0LCBndWludDMyIHRyYWNrX0lEKQoreworICBBdG9tVFJBRiAqdHJhZiA9IGdfbmV3MCAoQXRvbVRSQUYsIDEpOworCisgIGF0b21fdHJhZl9pbml0ICh0cmFmLCBjb250ZXh0LCB0cmFja19JRCk7CisgIHJldHVybiB0cmFmOworfQorCit2b2lkCithdG9tX3RyYWZfc2V0X2Jhc2VfZGVjb2RlX3RpbWUgKEF0b21UUkFGICogdHJhZiwgZ3VpbnQ2NCBiYXNlX2RlY29kZV90aW1lKQoreworICB0cmFmLT50ZmR0LmJhc2VfbWVkaWFfZGVjb2RlX3RpbWUgPSBiYXNlX2RlY29kZV90aW1lOworICAvKiBJZiB3ZSBuZWVkIHRvIHdyaXRlIGEgNjQtYml0IHRmZHQsIHNldCB0aGUgYXRvbSB2ZXJzaW9uICovCisgIGlmIChiYXNlX2RlY29kZV90aW1lID4gR19NQVhVSU5UMzIpCisgICAgdHJhZi0+dGZkdC5oZWFkZXIudmVyc2lvbiA9IDE7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3RyYWZfYWRkX3RydW4gKEF0b21UUkFGICogdHJhZiwgQXRvbVRSVU4gKiB0cnVuKQoreworICB0cmFmLT50cnVucyA9IGdfbGlzdF9hcHBlbmQgKHRyYWYtPnRydW5zLCB0cnVuKTsKK30KKwordm9pZAorYXRvbV90cmFmX2FkZF9zYW1wbGVzIChBdG9tVFJBRiAqIHRyYWYsIGd1aW50MzIgZGVsdGEsIGd1aW50MzIgc2l6ZSwKKyAgICBnYm9vbGVhbiBzeW5jLCBnaW50NjQgcHRzX29mZnNldCwgZ2Jvb2xlYW4gc2R0cF9zeW5jKQoreworICBBdG9tVFJVTiAqdHJ1bjsKKyAgZ3VpbnQzMiBmbGFnczsKKworICAvKiAweDEwMDAwIGlzIHNhbXBsZS1pcy1kaWZmZXJlbmNlLXNhbXBsZSBmbGFnCisgICAqIGxvdyBieXRlIHN0dWZmIGlzIHdoYXQgaXNtdiB1c2VzICovCisgIGZsYWdzID0gKHN5bmMgPyAweDAgOiAweDEwMDAwKSB8IChzZHRwX3N5bmMgPyAweDQwIDogMHhjMCk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCF0cmFmLT50cnVucykpIHsKKyAgICB0cnVuID0gYXRvbV90cnVuX25ldyAoKTsKKyAgICBhdG9tX3RyYWZfYWRkX3RydW4gKHRyYWYsIHRydW4pOworICAgIC8qIG9wdGltaXN0aWM7IGluZGljYXRlIGFsbCBkZWZhdWx0cyBwcmVzZW50IGluIHRmaGQgKi8KKyAgICB0cmFmLT50ZmhkLmhlYWRlci5mbGFnc1syXSA9IFRGX0RFRkFVTFRfU0FNUExFX0RVUkFUSU9OIHwKKyAgICAgICAgVEZfREVGQVVMVF9TQU1QTEVfU0laRSB8IFRGX0RFRkFVTFRfU0FNUExFX0ZMQUdTOworICAgIHRyYWYtPnRmaGQuZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24gPSBkZWx0YTsKKyAgICB0cmFmLT50ZmhkLmRlZmF1bHRfc2FtcGxlX3NpemUgPSBzaXplOworICAgIHRyYWYtPnRmaGQuZGVmYXVsdF9zYW1wbGVfZmxhZ3MgPSBmbGFnczsKKyAgICB0cnVuLT5maXJzdF9zYW1wbGVfZmxhZ3MgPSBmbGFnczsKKyAgfQorCisgIHRydW4gPSB0cmFmLT50cnVucy0+ZGF0YTsKKworICAvKiBjaGVjayBpZiBzdGlsbCBtYXRjaGluZyBkZWZhdWx0cywKKyAgICogaWYgbm90LCBhYmFuZG9uIGRlZmF1bHQgYW5kIG5lZWQgZW50cnkgZm9yIGVhY2ggc2FtcGxlICovCisgIGlmICh0cmFmLT50ZmhkLmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uICE9IGRlbHRhKSB7CisgICAgdHJhZi0+dGZoZC5oZWFkZXIuZmxhZ3NbMl0gJj0gflRGX0RFRkFVTFRfU0FNUExFX0RVUkFUSU9OOworICAgIHRydW4tPmhlYWRlci5mbGFnc1sxXSB8PSAoVFJfU0FNUExFX0RVUkFUSU9OID4+IDgpOworICB9CisgIGlmICh0cmFmLT50ZmhkLmRlZmF1bHRfc2FtcGxlX3NpemUgIT0gc2l6ZSkgeworICAgIHRyYWYtPnRmaGQuaGVhZGVyLmZsYWdzWzJdICY9IH5URl9ERUZBVUxUX1NBTVBMRV9TSVpFOworICAgIHRydW4tPmhlYWRlci5mbGFnc1sxXSB8PSAoVFJfU0FNUExFX1NJWkUgPj4gOCk7CisgIH0KKyAgaWYgKHRyYWYtPnRmaGQuZGVmYXVsdF9zYW1wbGVfZmxhZ3MgIT0gZmxhZ3MpIHsKKyAgICBpZiAodHJ1bi0+c2FtcGxlX2NvdW50ID09IDEpIHsKKyAgICAgIC8qIGF0IGxlYXN0IHdpbGwgbmVlZCBmaXJzdCBzYW1wbGUgZmxhZyAqLworICAgICAgdHJhZi0+dGZoZC5kZWZhdWx0X3NhbXBsZV9mbGFncyA9IGZsYWdzOworICAgICAgdHJ1bi0+aGVhZGVyLmZsYWdzWzJdIHw9IFRSX0ZJUlNUX1NBTVBMRV9GTEFHUzsKKyAgICB9IGVsc2UgeworICAgICAgLyogbm93IHdlIG5lZWQgc2FtcGxlIGZsYWdzIGZvciBlYWNoIHNhbXBsZSAqLworICAgICAgdHJhZi0+dGZoZC5oZWFkZXIuZmxhZ3NbMl0gJj0gflRGX0RFRkFVTFRfU0FNUExFX0ZMQUdTOworICAgICAgdHJ1bi0+aGVhZGVyLmZsYWdzWzFdIHw9IChUUl9TQU1QTEVfRkxBR1MgPj4gOCk7CisgICAgICB0cnVuLT5oZWFkZXIuZmxhZ3NbMl0gJj0gflRSX0ZJUlNUX1NBTVBMRV9GTEFHUzsKKyAgICB9CisgIH0KKworICBhdG9tX3RydW5fYWRkX3NhbXBsZXMgKHRyYWYtPnRydW5zLT5kYXRhLCBkZWx0YSwgc2l6ZSwgZmxhZ3MsIHB0c19vZmZzZXQpOworCisgIGlmICh0cmFmLT5zZHRwcykKKyAgICBhdG9tX3NkdHBfYWRkX3NhbXBsZXMgKHRyYWYtPnNkdHBzLT5kYXRhLCAweDEwIHwgKChmbGFncyAmIDB4ZmYpID4+IDQpKTsKK30KKworZ3VpbnQzMgorYXRvbV90cmFmX2dldF9zYW1wbGVfbnVtIChBdG9tVFJBRiAqIHRyYWYpCit7CisgIEF0b21UUlVOICp0cnVuOworCisgIGlmIChHX1VOTElLRUxZICghdHJhZi0+dHJ1bnMpKQorICAgIHJldHVybiAwOworCisgIHRydW4gPSB0cmFmLT50cnVucy0+ZGF0YTsKKyAgcmV0dXJuIGF0b21fYXJyYXlfZ2V0X2xlbiAoJnRydW4tPmVudHJpZXMpOworfQorCit2b2lkCithdG9tX21vb2ZfYWRkX3RyYWYgKEF0b21NT09GICogbW9vZiwgQXRvbVRSQUYgKiB0cmFmKQoreworICBtb29mLT50cmFmcyA9IGdfbGlzdF9hcHBlbmQgKG1vb2YtPnRyYWZzLCB0cmFmKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdGZyYV9mcmVlIChBdG9tVEZSQSAqIHRmcmEpCit7CisgIGF0b21fZnVsbF9jbGVhciAoJnRmcmEtPmhlYWRlcik7CisgIGF0b21fYXJyYXlfY2xlYXIgKCZ0ZnJhLT5lbnRyaWVzKTsKKyAgZ19mcmVlICh0ZnJhKTsKK30KKworQXRvbU1GUkEgKgorYXRvbV9tZnJhX25ldyAoQXRvbXNDb250ZXh0ICogY29udGV4dCkKK3sKKyAgQXRvbU1GUkEgKm1mcmEgPSBnX25ldzAgKEF0b21NRlJBLCAxKTsKKworICBhdG9tX2hlYWRlcl9zZXQgKCZtZnJhLT5oZWFkZXIsIEZPVVJDQ19tZnJhLCAwLCAwKTsKKyAgcmV0dXJuIG1mcmE7Cit9CisKK3ZvaWQKK2F0b21fbWZyYV9hZGRfdGZyYSAoQXRvbU1GUkEgKiBtZnJhLCBBdG9tVEZSQSAqIHRmcmEpCit7CisgIG1mcmEtPnRmcmFzID0gZ19saXN0X2FwcGVuZCAobWZyYS0+dGZyYXMsIHRmcmEpOworfQorCit2b2lkCithdG9tX21mcmFfZnJlZSAoQXRvbU1GUkEgKiBtZnJhKQoreworICBHTGlzdCAqd2Fsa2VyOworCisgIHdhbGtlciA9IG1mcmEtPnRmcmFzOworICB3aGlsZSAod2Fsa2VyKSB7CisgICAgYXRvbV90ZnJhX2ZyZWUgKChBdG9tVEZSQSAqKSB3YWxrZXItPmRhdGEpOworICAgIHdhbGtlciA9IGdfbGlzdF9uZXh0ICh3YWxrZXIpOworICB9CisgIGdfbGlzdF9mcmVlIChtZnJhLT50ZnJhcyk7CisgIG1mcmEtPnRmcmFzID0gTlVMTDsKKworICBhdG9tX2NsZWFyICgmbWZyYS0+aGVhZGVyKTsKKyAgZ19mcmVlIChtZnJhKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdGZyYV9pbml0IChBdG9tVEZSQSAqIHRmcmEsIGd1aW50MzIgdHJhY2tfSUQpCit7CisgIGd1aW50OCBmbGFnc1szXSA9IHsgMCwgMCwgMCB9OworCisgIGF0b21fZnVsbF9pbml0ICgmdGZyYS0+aGVhZGVyLCBGT1VSQ0NfdGZyYSwgMCwgMCwgMCwgZmxhZ3MpOworICB0ZnJhLT50cmFja19JRCA9IHRyYWNrX0lEOworICBhdG9tX2FycmF5X2luaXQgKCZ0ZnJhLT5lbnRyaWVzLCA1MTIpOworfQorCitBdG9tVEZSQSAqCithdG9tX3RmcmFfbmV3IChBdG9tc0NvbnRleHQgKiBjb250ZXh0LCBndWludDMyIHRyYWNrX0lEKQoreworICBBdG9tVEZSQSAqdGZyYSA9IGdfbmV3MCAoQXRvbVRGUkEsIDEpOworCisgIGF0b21fdGZyYV9pbml0ICh0ZnJhLCB0cmFja19JRCk7CisgIHJldHVybiB0ZnJhOworCit9CisKK3N0YXRpYyBpbmxpbmUgZ2ludAorbmVlZF9ieXRlcyAoZ3VpbnQzMiBudW0pCit7CisgIGdpbnQgbiA9IDA7CisKKyAgd2hpbGUgKG51bSA+Pj0gOCkKKyAgICBuKys7CisKKyAgcmV0dXJuIG47Cit9CisKK3ZvaWQKK2F0b21fdGZyYV9hZGRfZW50cnkgKEF0b21URlJBICogdGZyYSwgZ3VpbnQ2NCBkdHMsIGd1aW50MzIgc2FtcGxlX251bSkKK3sKKyAgVEZSQUVudHJ5IGVudHJ5OworCisgIGVudHJ5LnRpbWUgPSBkdHM7CisgIC8qIGZpbGwgaW4gbGF0ZXIgKi8KKyAgZW50cnkubW9vZl9vZmZzZXQgPSAwOworICAvKiBhbHdheXMgd3JpdGUgYSBzaW5nbGUgdHJ1biBpbiBhIHNpbmdsZSB0cmFmICovCisgIGVudHJ5LnRyYWZfbnVtYmVyID0gMTsKKyAgZW50cnkudHJ1bl9udW1iZXIgPSAxOworICBlbnRyeS5zYW1wbGVfbnVtYmVyID0gc2FtcGxlX251bTsKKworICAvKiBhdXRvLXVzZSA2NCBiaXRzIGlmIG5lZWRlZCAqLworICBpZiAoZHRzID4gR19NQVhVSU5UMzIpCisgICAgdGZyYS0+aGVhZGVyLnZlcnNpb24gPSAxOworCisgIC8qIDEgYnl0ZSB3aWxsIGFsd2F5cyBkbyBmb3IgdHJhZiBhbmQgdHJ1biBudW1iZXIsCisgICAqIGNoZWNrIGhvdyBtdWNoIHNhbXBsZV9udW0gbmVlZHMgKi8KKyAgdGZyYS0+bGVuZ3RocyA9ICh0ZnJhLT5sZW5ndGhzICYgMHhmYykgfHwKKyAgICAgIE1BWCAodGZyYS0+bGVuZ3RocywgbmVlZF9ieXRlcyAoc2FtcGxlX251bSkpOworCisgIGF0b21fYXJyYXlfYXBwZW5kICgmdGZyYS0+ZW50cmllcywgZW50cnksIDI1Nik7Cit9CisKK3ZvaWQKK2F0b21fdGZyYV91cGRhdGVfb2Zmc2V0IChBdG9tVEZSQSAqIHRmcmEsIGd1aW50NjQgb2Zmc2V0KQoreworICBnaW50IGk7CisKKyAgLyogYXV0by11c2UgNjQgYml0cyBpZiBuZWVkZWQgKi8KKyAgaWYgKG9mZnNldCA+IEdfTUFYVUlOVDMyKQorICAgIHRmcmEtPmhlYWRlci52ZXJzaW9uID0gMTsKKworICBmb3IgKGkgPSBhdG9tX2FycmF5X2dldF9sZW4gKCZ0ZnJhLT5lbnRyaWVzKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgVEZSQUVudHJ5ICplbnRyeSA9ICZhdG9tX2FycmF5X2luZGV4ICgmdGZyYS0+ZW50cmllcywgaSk7CisKKyAgICBpZiAoZW50cnktPm1vb2Zfb2Zmc2V0KQorICAgICAgYnJlYWs7CisgICAgZW50cnktPm1vb2Zfb2Zmc2V0ID0gb2Zmc2V0OworICB9Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX3RmcmFfY29weV9kYXRhIChBdG9tVEZSQSAqIHRmcmEsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKyAgZ3VpbnQzMiBpOworICBURlJBRW50cnkgKmVudHJ5OworICBndWludDMyIGRhdGE7CisgIGd1aW50IGJ5dGVzOworICBndWludCB2ZXJzaW9uOworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJnRmcmEtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyICh0ZnJhLT50cmFja19JRCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyICh0ZnJhLT5sZW5ndGhzLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MzIgKGF0b21fYXJyYXlfZ2V0X2xlbiAoJnRmcmEtPmVudHJpZXMpLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgdmVyc2lvbiA9IHRmcmEtPmhlYWRlci52ZXJzaW9uOworICBmb3IgKGkgPSAwOyBpIDwgYXRvbV9hcnJheV9nZXRfbGVuICgmdGZyYS0+ZW50cmllcyk7ICsraSkgeworICAgIGVudHJ5ID0gJmF0b21fYXJyYXlfaW5kZXggKCZ0ZnJhLT5lbnRyaWVzLCBpKTsKKyAgICBpZiAodmVyc2lvbikgeworICAgICAgcHJvcF9jb3B5X3VpbnQ2NCAoZW50cnktPnRpbWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgICAgIHByb3BfY29weV91aW50NjQgKGVudHJ5LT5tb29mX29mZnNldCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICBwcm9wX2NvcHlfdWludDMyIChlbnRyeS0+dGltZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgICAgcHJvcF9jb3B5X3VpbnQzMiAoZW50cnktPm1vb2Zfb2Zmc2V0LCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgfQorCisgICAgYnl0ZXMgPSAodGZyYS0+bGVuZ3RocyAmICgweDMgPDwgNCkpICsgMTsKKyAgICBkYXRhID0gR1VJTlQzMl9UT19CRSAoZW50cnktPnRyYWZfbnVtYmVyKTsKKyAgICBwcm9wX2NvcHlfZml4ZWRfc2l6ZV9zdHJpbmcgKCgoZ3VpbnQ4ICopICYgZGF0YSkgKyA0IC0gYnl0ZXMsIGJ5dGVzLAorICAgICAgICBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgICBieXRlcyA9ICh0ZnJhLT5sZW5ndGhzICYgKDB4MyA8PCAyKSkgKyAxOworICAgIGRhdGEgPSBHVUlOVDMyX1RPX0JFIChlbnRyeS0+dHJ1bl9udW1iZXIpOworICAgIHByb3BfY29weV9maXhlZF9zaXplX3N0cmluZyAoKChndWludDggKikgJiBkYXRhKSArIDQgLSBieXRlcywgYnl0ZXMsCisgICAgICAgIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICAgIGJ5dGVzID0gKHRmcmEtPmxlbmd0aHMgJiAoMHgzKSkgKyAxOworICAgIGRhdGEgPSBHVUlOVDMyX1RPX0JFIChlbnRyeS0+c2FtcGxlX251bWJlcik7CisgICAgcHJvcF9jb3B5X2ZpeGVkX3NpemVfc3RyaW5nICgoKGd1aW50OCAqKSAmIGRhdGEpICsgNCAtIGJ5dGVzLCBieXRlcywKKyAgICAgICAgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fbWZyb19jb3B5X2RhdGEgKGd1aW50MzIgcywgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworICBndWludDggZmxhZ3NbM10gPSB7IDAsIDAsIDAgfTsKKyAgQXRvbUZ1bGwgbWZybzsKKworICBhdG9tX2Z1bGxfaW5pdCAoJm1mcm8sIEZPVVJDQ19tZnJvLCAwLCAwLCAwLCBmbGFncyk7CisKKyAgaWYgKCFhdG9tX2Z1bGxfY29weV9kYXRhICgmbWZybywgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyIChzLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworCitndWludDY0CithdG9tX21mcmFfY29weV9kYXRhIChBdG9tTUZSQSAqIG1mcmEsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKyAgR0xpc3QgKndhbGtlcjsKKworICBpZiAoIWF0b21fY29weV9kYXRhICgmbWZyYS0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpCisgICAgcmV0dXJuIDA7CisKKyAgd2Fsa2VyID0gZ19saXN0X2ZpcnN0IChtZnJhLT50ZnJhcyk7CisgIHdoaWxlICh3YWxrZXIgIT0gTlVMTCkgeworICAgIGlmICghYXRvbV90ZnJhX2NvcHlfZGF0YSAoKEF0b21URlJBICopIHdhbGtlci0+ZGF0YSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgd2Fsa2VyID0gZ19saXN0X25leHQgKHdhbGtlcik7CisgIH0KKworICAvKiAxNiBpcyB0aGUgc2l6ZSBvZiB0aGUgbWZybyBhdG9tICovCisgIGlmICghYXRvbV9tZnJvX2NvcHlfZGF0YSAoKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldCArIDE2LCBidWZmZXIsCisgICAgICAgICAgc2l6ZSwgb2Zmc2V0KSkKKyAgICByZXR1cm4gMDsKKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworLyogc29tZSBzYW1wbGUgZGVzY3JpcHRpb24gY29uc3RydWN0aW9uIGhlbHBlcnMgKi8KKworQXRvbUluZm8gKgorYnVpbGRfZXNkc19leHRlbnNpb24gKEF0b21UUkFLICogdHJhaywgZ3VpbnQ4IG9iamVjdF90eXBlLCBndWludDggc3RyZWFtX3R5cGUsCisgICAgY29uc3QgR3N0QnVmZmVyICogY29kZWNfZGF0YSwgZ3VpbnQzMiBhdmdfYml0cmF0ZSwgZ3VpbnQzMiBtYXhfYml0cmF0ZSkKK3sKKyAgZ3VpbnQzMiB0cmFja19pZDsKKyAgQXRvbUVTRFMgKmVzZHM7CisKKyAgdHJhY2tfaWQgPSB0cmFrLT50a2hkLnRyYWNrX0lEOworCisgIGVzZHMgPSBhdG9tX2VzZHNfbmV3ICgpOworICBlc2RzLT5lcy5pZCA9IHRyYWNrX2lkICYgMHhGRkZGOworICBlc2RzLT5lcy5kZWNfY29uZl9kZXNjLm9iamVjdF90eXBlID0gb2JqZWN0X3R5cGU7CisgIGVzZHMtPmVzLmRlY19jb25mX2Rlc2Muc3RyZWFtX3R5cGUgPSBzdHJlYW1fdHlwZSA8PCAyIHwgMHgwMTsKKworICBpZiAoYXZnX2JpdHJhdGUgPiAwKQorICAgIGVzZHMtPmVzLmRlY19jb25mX2Rlc2MuYXZnX2JpdHJhdGUgPSBhdmdfYml0cmF0ZTsKKyAgaWYgKG1heF9iaXRyYXRlID4gMCkKKyAgICBlc2RzLT5lcy5kZWNfY29uZl9kZXNjLm1heF9iaXRyYXRlID0gbWF4X2JpdHJhdGU7CisKKyAgLyogb3B0aW9uYWwgRGVjb2RlclNwZWNpZmljSW5mbyAqLworICBpZiAoY29kZWNfZGF0YSkgeworICAgIERlY29kZXJTcGVjaWZpY0luZm9EZXNjcmlwdG9yICpkZXNjOworICAgIGdzaXplIHNpemU7CisKKyAgICBlc2RzLT5lcy5kZWNfY29uZl9kZXNjLmRlY19zcGVjaWZpY19pbmZvID0gZGVzYyA9CisgICAgICAgIGRlc2NfZGVjX3NwZWNpZmljX2luZm9fbmV3ICgpOworICAgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplICgoR3N0QnVmZmVyICopIGNvZGVjX2RhdGEpOworICAgIGRlc2NfZGVjX3NwZWNpZmljX2luZm9fYWxsb2NfZGF0YSAoZGVzYywgc2l6ZSk7CisgICAgZ3N0X2J1ZmZlcl9leHRyYWN0ICgoR3N0QnVmZmVyICopIGNvZGVjX2RhdGEsIDAsIGRlc2MtPmRhdGEsIHNpemUpOworICB9CisKKyAgcmV0dXJuIGJ1aWxkX2F0b21faW5mb193cmFwcGVyICgoQXRvbSAqKSBlc2RzLCBhdG9tX2VzZHNfY29weV9kYXRhLAorICAgICAgYXRvbV9lc2RzX2ZyZWUpOworfQorCitBdG9tSW5mbyAqCitidWlsZF9idHJ0X2V4dGVuc2lvbiAoZ3VpbnQzMiBidWZmZXJfc2l6ZV9kYiwgZ3VpbnQzMiBhdmdfYml0cmF0ZSwKKyAgICBndWludDMyIG1heF9iaXRyYXRlKQoreworICBBdG9tRGF0YSAqYXRvbV9kYXRhID0gYXRvbV9kYXRhX25ldyAoRk9VUkNDX2J0cnQpOworICBndWludDggKmRhdGE7CisKKyAgYXRvbV9kYXRhX2FsbG9jX21lbSAoYXRvbV9kYXRhLCAxMik7CisgIGRhdGEgPSBhdG9tX2RhdGEtPmRhdGE7CisKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSwgYnVmZmVyX3NpemVfZGIpOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgNCwgbWF4X2JpdHJhdGUpOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgOCwgYXZnX2JpdHJhdGUpOworCisgIHJldHVybiBidWlsZF9hdG9tX2luZm9fd3JhcHBlciAoKEF0b20gKikgYXRvbV9kYXRhLCBhdG9tX2RhdGFfY29weV9kYXRhLAorICAgICAgYXRvbV9kYXRhX2ZyZWUpOworfQorCitzdGF0aWMgQXRvbUluZm8gKgorYnVpbGRfbW92X3dhdmVfZXh0ZW5zaW9uIChndWludDMyIGZvdXJjYywgQXRvbUluZm8gKiBhdG9tMSwgQXRvbUluZm8gKiBhdG9tMiwKKyAgICBnYm9vbGVhbiB0ZXJtaW5hdG9yKQoreworICBBdG9tV0FWRSAqd2F2ZTsKKyAgQXRvbUZSTUEgKmZybWE7CisgIEF0b20gKmV4dF9hdG9tOworCisgIC8qIEJ1aWxkIFdBVkUgYXRvbSBmb3Igc2FtcGxlIHRhYmxlIGVudHJ5ICovCisgIHdhdmUgPSBhdG9tX3dhdmVfbmV3ICgpOworCisgIC8qIFByZXBlbmQgVGVybWluYXRvciBhdG9tIHRvIHRoZSBXQVZFIGxpc3QgZmlyc3QsIHNvIGl0IGVuZHMgdXAgbGFzdCAqLworICBpZiAodGVybWluYXRvcikgeworICAgIGV4dF9hdG9tID0gKEF0b20gKikgYXRvbV9kYXRhX25ldyAoRk9VUkNDX251bGwpOworICAgIHdhdmUtPmV4dGVuc2lvbl9hdG9tcyA9CisgICAgICAgIGF0b21faW5mb19saXN0X3ByZXBlbmRfYXRvbSAod2F2ZS0+ZXh0ZW5zaW9uX2F0b21zLCAoQXRvbSAqKSBleHRfYXRvbSwKKyAgICAgICAgKEF0b21Db3B5RGF0YUZ1bmMpIGF0b21fZGF0YV9jb3B5X2RhdGEsIChBdG9tRnJlZUZ1bmMpIGF0b21fZGF0YV9mcmVlKTsKKyAgfQorCisgIC8qIEFkZCBzdXBwbGllZCBhdG9tcyB0byBXQVZFICovCisgIGlmIChhdG9tMikKKyAgICB3YXZlLT5leHRlbnNpb25fYXRvbXMgPSBnX2xpc3RfcHJlcGVuZCAod2F2ZS0+ZXh0ZW5zaW9uX2F0b21zLCBhdG9tMik7CisgIGlmIChhdG9tMSkKKyAgICB3YXZlLT5leHRlbnNpb25fYXRvbXMgPSBnX2xpc3RfcHJlcGVuZCAod2F2ZS0+ZXh0ZW5zaW9uX2F0b21zLCBhdG9tMSk7CisKKyAgLyogQWRkIEZSTUEgdG8gdGhlIFdBVkUgKi8KKyAgZnJtYSA9IGF0b21fZnJtYV9uZXcgKCk7CisgIGZybWEtPm1lZGlhX3R5cGUgPSBmb3VyY2M7CisKKyAgd2F2ZS0+ZXh0ZW5zaW9uX2F0b21zID0KKyAgICAgIGF0b21faW5mb19saXN0X3ByZXBlbmRfYXRvbSAod2F2ZS0+ZXh0ZW5zaW9uX2F0b21zLCAoQXRvbSAqKSBmcm1hLAorICAgICAgKEF0b21Db3B5RGF0YUZ1bmMpIGF0b21fZnJtYV9jb3B5X2RhdGEsIChBdG9tRnJlZUZ1bmMpIGF0b21fZnJtYV9mcmVlKTsKKworICByZXR1cm4gYnVpbGRfYXRvbV9pbmZvX3dyYXBwZXIgKChBdG9tICopIHdhdmUsIGF0b21fd2F2ZV9jb3B5X2RhdGEsCisgICAgICBhdG9tX3dhdmVfZnJlZSk7Cit9CisKK0F0b21JbmZvICoKK2J1aWxkX21vdl9hYWNfZXh0ZW5zaW9uIChBdG9tVFJBSyAqIHRyYWssIGNvbnN0IEdzdEJ1ZmZlciAqIGNvZGVjX2RhdGEsCisgICAgZ3VpbnQzMiBhdmdfYml0cmF0ZSwgZ3VpbnQzMiBtYXhfYml0cmF0ZSkKK3sKKyAgQXRvbUluZm8gKmVzZHMsICptcDRhOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgZ3VpbnQzMiB0bXAgPSAwOworCisgIC8qIEFkZCBFU0RTIGF0b20gdG8gV0FWRSAqLworICBlc2RzID0gYnVpbGRfZXNkc19leHRlbnNpb24gKHRyYWssIEVTRFNfT0JKRUNUX1RZUEVfTVBFRzRfUDMsCisgICAgICBFU0RTX1NUUkVBTV9UWVBFX0FVRElPLCBjb2RlY19kYXRhLCBhdmdfYml0cmF0ZSwgbWF4X2JpdHJhdGUpOworCisgIC8qIEFkZCBNUDRBIGF0b20gdG8gdGhlIFdBVkU6CisgICAqIG5vdCByZWFsbHkgaW4gc3BlYywgYnV0IG1ha2VzIG9mZnNldCBiYXNlZCBwbGF5ZXJzIGhhcHB5ICovCisgIGJ1ZiA9IEdTVF9CVUZGRVJfTkVXX1JFQURPTkxZICgmdG1wLCA0KTsKKyAgbXA0YSA9IGJ1aWxkX2NvZGVjX2RhdGFfZXh0ZW5zaW9uIChGT1VSQ0NfbXA0YSwgYnVmKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICByZXR1cm4gYnVpbGRfbW92X3dhdmVfZXh0ZW5zaW9uIChGT1VSQ0NfbXA0YSwgbXA0YSwgZXNkcywgVFJVRSk7Cit9CisKK0F0b21JbmZvICoKK2J1aWxkX21vdl9hbGFjX2V4dGVuc2lvbiAoY29uc3QgR3N0QnVmZmVyICogY29kZWNfZGF0YSkKK3sKKyAgQXRvbUluZm8gKmFsYWM7CisKKyAgYWxhYyA9IGJ1aWxkX2NvZGVjX2RhdGFfZXh0ZW5zaW9uIChGT1VSQ0NfYWxhYywgY29kZWNfZGF0YSk7CisKKyAgcmV0dXJuIGJ1aWxkX21vdl93YXZlX2V4dGVuc2lvbiAoRk9VUkNDX2FsYWMsIE5VTEwsIGFsYWMsIFRSVUUpOworfQorCitBdG9tSW5mbyAqCitidWlsZF9qcDJ4X2V4dGVuc2lvbiAoY29uc3QgR3N0QnVmZmVyICogcHJlZml4KQoreworICBBdG9tRGF0YSAqYXRvbV9kYXRhOworCisgIGlmICghcHJlZml4KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBhdG9tX2RhdGEgPSBhdG9tX2RhdGFfbmV3X2Zyb21fZ3N0X2J1ZmZlciAoRk9VUkNDX2pwMngsIHByZWZpeCk7CisKKyAgcmV0dXJuIGJ1aWxkX2F0b21faW5mb193cmFwcGVyICgoQXRvbSAqKSBhdG9tX2RhdGEsIGF0b21fZGF0YV9jb3B5X2RhdGEsCisgICAgICBhdG9tX2RhdGFfZnJlZSk7Cit9CisKK0F0b21JbmZvICoKK2J1aWxkX2pwMmhfZXh0ZW5zaW9uIChnaW50IHdpZHRoLCBnaW50IGhlaWdodCwgY29uc3QgZ2NoYXIgKiBjb2xvcnNwYWNlLAorICAgIGdpbnQgbmNvbXAsIGNvbnN0IEdWYWx1ZSAqIGNtYXBfYXJyYXksIGNvbnN0IEdWYWx1ZSAqIGNkZWZfYXJyYXkpCit7CisgIEF0b21EYXRhICphdG9tX2RhdGE7CisgIEdzdEJ1ZmZlciAqYnVmOworICBndWludDggY2VudW07CisgIGdpbnQgaTsKKyAgZ2ludCBpZGhyX3NpemUgPSAyMjsKKyAgZ2ludCBjb2xyX3NpemUgPSAxNTsKKyAgZ2ludCBjbWFwX3NpemUgPSAwLCBjZGVmX3NpemUgPSAwOworICBnaW50IGNtYXBfYXJyYXlfc2l6ZSA9IDA7CisgIGdpbnQgY2RlZl9hcnJheV9zaXplID0gMDsKKyAgR3N0Qnl0ZVdyaXRlciB3cml0ZXI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNtYXBfYXJyYXkgPT0gTlVMTCB8fAorICAgICAgR1NUX1ZBTFVFX0hPTERTX0FSUkFZIChjbWFwX2FycmF5KSwgTlVMTCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChjZGVmX2FycmF5ID09IE5VTEwgfHwKKyAgICAgIEdTVF9WQUxVRV9IT0xEU19BUlJBWSAoY2RlZl9hcnJheSksIE5VTEwpOworCisgIGlmIChnX3N0cl9lcXVhbCAoY29sb3JzcGFjZSwgInNSR0IiKSkgeworICAgIGNlbnVtID0gMHgxMDsKKyAgICBpZiAobmNvbXAgPT0gMCkKKyAgICAgIG5jb21wID0gMzsKKyAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAoY29sb3JzcGFjZSwgIkdSQVkiKSkgeworICAgIGNlbnVtID0gMHgxMTsKKyAgICBpZiAobmNvbXAgPT0gMCkKKyAgICAgIG5jb21wID0gMTsKKyAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAoY29sb3JzcGFjZSwgInNZVVYiKSkgeworICAgIGNlbnVtID0gMHgxMjsKKyAgICBpZiAobmNvbXAgPT0gMCkKKyAgICAgIG5jb21wID0gMzsKKyAgfSBlbHNlCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKGNtYXBfYXJyYXkpIHsKKyAgICBjbWFwX2FycmF5X3NpemUgPSBnc3RfdmFsdWVfYXJyYXlfZ2V0X3NpemUgKGNtYXBfYXJyYXkpOworICAgIGNtYXBfc2l6ZSA9IDggKyBjbWFwX2FycmF5X3NpemUgKiA0OworICB9CisgIGlmIChjZGVmX2FycmF5KSB7CisgICAgY2RlZl9hcnJheV9zaXplID0gZ3N0X3ZhbHVlX2FycmF5X2dldF9zaXplIChjZGVmX2FycmF5KTsKKyAgICBjZGVmX3NpemUgPSA4ICsgMiArIGNkZWZfYXJyYXlfc2l6ZSAqIDY7CisgIH0KKworICBnc3RfYnl0ZV93cml0ZXJfaW5pdF93aXRoX3NpemUgKCZ3cml0ZXIsCisgICAgICBpZGhyX3NpemUgKyBjb2xyX3NpemUgKyBjbWFwX3NpemUgKyBjZGVmX3NpemUsIFRSVUUpOworCisgIC8qIGloZHIgPSBpbWFnZSBoZWFkZXIgYm94ICovCisgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2JlX3VuY2hlY2tlZCAoJndyaXRlciwgMjIpOworICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZV91bmNoZWNrZWQgKCZ3cml0ZXIsIEZPVVJDQ19paGRyKTsKKyAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfYmVfdW5jaGVja2VkICgmd3JpdGVyLCBoZWlnaHQpOworICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9iZV91bmNoZWNrZWQgKCZ3cml0ZXIsIHdpZHRoKTsKKyAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MTZfYmVfdW5jaGVja2VkICgmd3JpdGVyLCBuY29tcCk7CisgIC8qIDggYml0cyBwZXIgY29tcG9uZW50LCB1bnNpZ25lZCAqLworICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQ4X3VuY2hlY2tlZCAoJndyaXRlciwgMHg3KTsKKyAgLyogY29tcHJlc3Npb24gdHlwZTsgcmVzZXJ2ZWQgKi8KKyAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50OF91bmNoZWNrZWQgKCZ3cml0ZXIsIDB4Nyk7CisgIC8qIGNvbG91ciBzcGFjZSAodW4pa25vd24gKi8KKyAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50OF91bmNoZWNrZWQgKCZ3cml0ZXIsIDB4MCk7CisgIC8qIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodCAoYm94IHByZXNlbnQpICovCisgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDhfdW5jaGVja2VkICgmd3JpdGVyLCAweDApOworCisgIC8qIGNvbG91ciBzcGVjaWZpY2F0aW9uIGJveCAqLworICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9iZV91bmNoZWNrZWQgKCZ3cml0ZXIsIDE1KTsKKyAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGVfdW5jaGVja2VkICgmd3JpdGVyLCBGT1VSQ0NfY29scik7CisKKyAgLyogc3BlY2lmaWNhdGlvbiBtZXRob2Q6IGVudW1lcmF0ZWQgKi8KKyAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50OF91bmNoZWNrZWQgKCZ3cml0ZXIsIDB4MSk7CisgIC8qIHByZWNlZGVuY2U7IHJlc2VydmVkICovCisgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDhfdW5jaGVja2VkICgmd3JpdGVyLCAweDApOworICAvKiBhcHByb3hpbWF0aW9uOyByZXNlcnZlZCAqLworICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQ4X3VuY2hlY2tlZCAoJndyaXRlciwgMHgwKTsKKyAgLyogZW51bWVyYXRlZCBjb2xvdXJzcGFjZSAqLworICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9iZV91bmNoZWNrZWQgKCZ3cml0ZXIsIGNlbnVtKTsKKworICBpZiAoY21hcF9hcnJheSkgeworICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2JlX3VuY2hlY2tlZCAoJndyaXRlciwgY21hcF9zaXplKTsKKyAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZV91bmNoZWNrZWQgKCZ3cml0ZXIsIEZPVVJDQ19jbWFwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY21hcF9hcnJheV9zaXplOyBpKyspIHsKKyAgICAgIGNvbnN0IEdWYWx1ZSAqaXRlbTsKKyAgICAgIGdpbnQgdmFsdWU7CisgICAgICBndWludDE2IGNtcDsKKyAgICAgIGd1aW50OCBtdHlwOworICAgICAgZ3VpbnQ4IHBjb2w7CisgICAgICBpdGVtID0gZ3N0X3ZhbHVlX2FycmF5X2dldF92YWx1ZSAoY21hcF9hcnJheSwgaSk7CisgICAgICB2YWx1ZSA9IGdfdmFsdWVfZ2V0X2ludCAoaXRlbSk7CisKKyAgICAgIC8qIHZhbHVlIGlzICcobXR5cCA8PCAyNCkgfCAocGNvbCA8PCAxNikgfCBjbXAnICovCisgICAgICBjbXAgPSB2YWx1ZSAmIDB4RkZGRjsKKyAgICAgIG10eXAgPSB2YWx1ZSA+PiAyNDsKKyAgICAgIHBjb2wgPSAodmFsdWUgPj4gMTYpICYgMHhGRjsKKworICAgICAgaWYgKG10eXAgPT0gMSkKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJNVFlQIG9mIGNtYXAgYXRvbSBzaWduYWxzIFBhbGxldGUgTWFwcGluZywgYnV0IHdlIGRvbid0ICIKKyAgICAgICAgICAgICJoYW5kbGUgUGFsbGV0ZSBtYXBwaW5nIGF0b21zIHlldCIpOworCisgICAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQxNl9iZV91bmNoZWNrZWQgKCZ3cml0ZXIsIGNtcCk7CisgICAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQ4X3VuY2hlY2tlZCAoJndyaXRlciwgbXR5cCk7CisgICAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQ4X3VuY2hlY2tlZCAoJndyaXRlciwgcGNvbCk7CisgICAgfQorICB9CisKKyAgaWYgKGNkZWZfYXJyYXkpIHsKKyAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9iZV91bmNoZWNrZWQgKCZ3cml0ZXIsIGNkZWZfc2l6ZSk7CisgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGVfdW5jaGVja2VkICgmd3JpdGVyLCBGT1VSQ0NfY2RlZik7CisgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MTZfYmVfdW5jaGVja2VkICgmd3JpdGVyLCBjZGVmX2FycmF5X3NpemUpOworICAgIGZvciAoaSA9IDA7IGkgPCBjZGVmX2FycmF5X3NpemU7IGkrKykgeworICAgICAgY29uc3QgR1ZhbHVlICppdGVtOworICAgICAgZ2ludCB2YWx1ZTsKKyAgICAgIGl0ZW0gPSBnc3RfdmFsdWVfYXJyYXlfZ2V0X3ZhbHVlIChjZGVmX2FycmF5LCBpKTsKKyAgICAgIHZhbHVlID0gZ192YWx1ZV9nZXRfaW50IChpdGVtKTsKKworICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MTZfYmVfdW5jaGVja2VkICgmd3JpdGVyLCBpKTsKKyAgICAgIGlmICh2YWx1ZSA+IDApIHsKKyAgICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MTZfYmVfdW5jaGVja2VkICgmd3JpdGVyLCAwKTsKKyAgICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MTZfYmVfdW5jaGVja2VkICgmd3JpdGVyLCB2YWx1ZSk7CisgICAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMCkgeworICAgICAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQxNl9iZV91bmNoZWNrZWQgKCZ3cml0ZXIsIC12YWx1ZSk7CisgICAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDE2X2JlX3VuY2hlY2tlZCAoJndyaXRlciwgMCk7ICAgLyogVE9ETyB3aGF0IGhlcmU/ICovCisgICAgICB9IGVsc2UgeworICAgICAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQxNl9iZV91bmNoZWNrZWQgKCZ3cml0ZXIsIDEpOworICAgICAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQxNl9iZV91bmNoZWNrZWQgKCZ3cml0ZXIsIDApOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGdfYXNzZXJ0IChnc3RfYnl0ZV93cml0ZXJfZ2V0X3JlbWFpbmluZyAoJndyaXRlcikgPT0gMCk7CisgIGJ1ZiA9IGdzdF9ieXRlX3dyaXRlcl9yZXNldF9hbmRfZ2V0X2J1ZmZlciAoJndyaXRlcik7CisKKyAgYXRvbV9kYXRhID0gYXRvbV9kYXRhX25ld19mcm9tX2dzdF9idWZmZXIgKEZPVVJDQ19qcDJoLCBidWYpOworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgIHJldHVybiBidWlsZF9hdG9tX2luZm9fd3JhcHBlciAoKEF0b20gKikgYXRvbV9kYXRhLCBhdG9tX2RhdGFfY29weV9kYXRhLAorICAgICAgYXRvbV9kYXRhX2ZyZWUpOworfQorCitBdG9tSW5mbyAqCitidWlsZF9jb2RlY19kYXRhX2V4dGVuc2lvbiAoZ3VpbnQzMiBmb3VyY2MsIGNvbnN0IEdzdEJ1ZmZlciAqIGNvZGVjX2RhdGEpCit7CisgIEF0b21EYXRhICpkYXRhOworICBBdG9tSW5mbyAqcmVzdWx0ID0gTlVMTDsKKworICBpZiAoY29kZWNfZGF0YSkgeworICAgIGRhdGEgPSBhdG9tX2RhdGFfbmV3X2Zyb21fZ3N0X2J1ZmZlciAoZm91cmNjLCBjb2RlY19kYXRhKTsKKyAgICByZXN1bHQgPSBidWlsZF9hdG9tX2luZm9fd3JhcHBlciAoKEF0b20gKikgZGF0YSwgYXRvbV9kYXRhX2NvcHlfZGF0YSwKKyAgICAgICAgYXRvbV9kYXRhX2ZyZWUpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworQXRvbUluZm8gKgorYnVpbGRfYW1yX2V4dGVuc2lvbiAodm9pZCkKK3sKKyAgZ3VpbnQ4IGV4dFs5XTsKKyAgR3N0QnVmZmVyICpidWY7CisgIEF0b21JbmZvICpyZXM7CisKKyAgLyogdmVuZG9yICovCisgIEdTVF9XUklURV9VSU5UMzJfTEUgKGV4dCwgMCk7CisgIC8qIGRlY29kZXIgdmVyc2lvbiAqLworICBHU1RfV1JJVEVfVUlOVDggKGV4dCArIDQsIDApOworICAvKiBtb2RlIHNldCAoYWxsIG1vZGVzKSAqLworICBHU1RfV1JJVEVfVUlOVDE2X0JFIChleHQgKyA1LCAweDgxRkYpOworICAvKiBtb2RlIGNoYW5nZSBwZXJpb2QgKG5vIHJlc3RyaWN0aW9uKSAqLworICBHU1RfV1JJVEVfVUlOVDggKGV4dCArIDcsIDApOworICAvKiBmcmFtZXMgcGVyIHNhbXBsZSAqLworICBHU1RfV1JJVEVfVUlOVDggKGV4dCArIDgsIDEpOworCisgIGJ1ZiA9IEdTVF9CVUZGRVJfTkVXX1JFQURPTkxZIChleHQsIHNpemVvZiAoZXh0KSk7CisgIHJlcyA9IGJ1aWxkX2NvZGVjX2RhdGFfZXh0ZW5zaW9uIChGT1VSQ0NfZGFtciwgYnVmKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgcmV0dXJuIHJlczsKK30KKworQXRvbUluZm8gKgorYnVpbGRfaDI2M19leHRlbnNpb24gKHZvaWQpCit7CisgIGd1aW50OCBleHRbN107CisgIEdzdEJ1ZmZlciAqYnVmOworICBBdG9tSW5mbyAqcmVzOworCisgIC8qIHZlbmRvciAqLworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChleHQsIDApOworICAvKiBkZWNvZGVyIHZlcnNpb24gKi8KKyAgR1NUX1dSSVRFX1VJTlQ4IChleHQgKyA0LCAwKTsKKyAgLyogbGV2ZWwgLyBwcm9maWxlICovCisgIC8qIEZJWE1FID8gbWF5YmUgPyBvYnRhaW4gc29tZXdoZXJlOyBiYXNlbGluZSBmb3Igbm93ICovCisgIEdTVF9XUklURV9VSU5UOCAoZXh0ICsgNSwgMTApOworICBHU1RfV1JJVEVfVUlOVDggKGV4dCArIDYsIDApOworCisgIGJ1ZiA9IEdTVF9CVUZGRVJfTkVXX1JFQURPTkxZIChleHQsIHNpemVvZiAoZXh0KSk7CisgIHJlcyA9IGJ1aWxkX2NvZGVjX2RhdGFfZXh0ZW5zaW9uIChGT1VSQ0NfZDI2MywgYnVmKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgcmV0dXJuIHJlczsKK30KKworQXRvbUluZm8gKgorYnVpbGRfZ2FtYV9hdG9tIChnZG91YmxlIGdhbW1hKQoreworICBBdG9tSW5mbyAqcmVzOworICBndWludDMyIGdhbW1hX2ZwOworICBHc3RCdWZmZXIgKmJ1ZjsKKworICAvKiBjb252ZXJ0IHRvIHVpbnQzMiBmcm9tIGZpeGVkIHBvaW50ICovCisgIGdhbW1hX2ZwID0gKGd1aW50MzIpIDY1NTM2ICpnYW1tYTsKKworICBnYW1tYV9mcCA9IEdVSU5UMzJfVE9fQkUgKGdhbW1hX2ZwKTsKKyAgYnVmID0gR1NUX0JVRkZFUl9ORVdfUkVBRE9OTFkgKCZnYW1tYV9mcCwgNCk7CisgIHJlcyA9IGJ1aWxkX2NvZGVjX2RhdGFfZXh0ZW5zaW9uIChGT1VSQ0NfZ2FtYSwgYnVmKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgcmV0dXJuIHJlczsKK30KKworQXRvbUluZm8gKgorYnVpbGRfU01JX2F0b20gKGNvbnN0IEdzdEJ1ZmZlciAqIHNlcWgpCit7CisgIEF0b21JbmZvICpyZXM7CisgIEdzdEJ1ZmZlciAqYnVmOworICBnc2l6ZSBzaXplOworICBndWludDggKmRhdGE7CisKKyAgLyogdGhlIHNlcWggcGx1cyBpdHMgc2l6ZSBhbmQgZm91cmNjICovCisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplICgoR3N0QnVmZmVyICopIHNlcWgpOworICBkYXRhID0gZ19tYWxsb2MgKHNpemUgKyA4KTsKKworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhLCBGT1VSQ0NfU0VRSCk7CisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEgKyA0LCBzaXplICsgOCk7CisgIGdzdF9idWZmZXJfZXh0cmFjdCAoKEdzdEJ1ZmZlciAqKSBzZXFoLCAwLCBkYXRhICsgOCwgc2l6ZSk7CisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGRhdGEsIHNpemUgKyA4KTsKKyAgcmVzID0gYnVpbGRfY29kZWNfZGF0YV9leHRlbnNpb24gKEZPVVJDQ19TTUlfLCBidWYpOworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgQXRvbUluZm8gKgorYnVpbGRfaW1hX2FkcGNtX2F0b20gKGdpbnQgY2hhbm5lbHMsIGdpbnQgcmF0ZSwgZ2ludCBibG9ja3NpemUpCit7CisjZGVmaW5lIElNQV9BRFBDTV9BVE9NX1NJWkUgMjAKKyAgQXRvbURhdGEgKmF0b21fZGF0YTsKKyAgZ3VpbnQ4ICpkYXRhOworICBndWludDMyIGZvdXJjYzsKKyAgZ2ludCBzYW1wbGVzcGVyYmxvY2s7CisgIGdpbnQgYnl0ZXNwZXJzZWM7CisKKyAgLyogVGhlIEZPVVJDQyBmb3IgV0FWIGNvZGVjcyBpbiBRVCBpcyAnbXMnIGZvbGxvd2VkIGJ5IHRoZSAxNiBiaXQgd2F2ZSBjb2RlYworICAgICBpZGVudGlmaWVyLiBOb3RlIHRoYXQgdGhlIGlkZW50aWZpZXIgaGVyZSBpcyBiaWctZW5kaWFuLCBidXQgd2hlbiB1c2VkCisgICAgIHdpdGhpbiB0aGUgV0FWRSBoZWFkZXIgKGJlbG93KSwgaXQncyBsaXR0bGUgZW5kaWFuLiAqLworICBmb3VyY2MgPSBNU19XQVZFX0ZPVVJDQyAoMHgxMSk7CisKKyAgYXRvbV9kYXRhID0gYXRvbV9kYXRhX25ldyAoZm91cmNjKTsKKyAgYXRvbV9kYXRhX2FsbG9jX21lbSAoYXRvbV9kYXRhLCBJTUFfQURQQ01fQVRPTV9TSVpFKTsKKyAgZGF0YSA9IGF0b21fZGF0YS0+ZGF0YTsKKworICAvKiBUaGlzIGF0b20ncyBjb250ZW50IGlzIGEgV0FWRSBoZWFkZXIsIGluY2x1ZGluZyAyIGJ5dGVzIG9mIGV4dHJhIGRhdGEuCisgICAgIE5vdGUgdGhhdCBhbGwgb2YgdGhpcyBpcyBsaXR0bGUtZW5kaWFuLCB1bmxpa2UgbW9zdCBzdHVmZiBpbiBxdC4gKi8KKyAgLyogNCBieXRlcyBoZWFkZXIgcGVyIGNoYW5uZWwgKGluY2x1ZGluZyAxIHNhbXBsZSkuIFRoZW4gMiBzYW1wbGVzIHBlciBieXRlCisgICAgIGZvciB0aGUgcmVzdC4gU2ltcGxpZmllcyB0byB0aGlzLiAqLworICBzYW1wbGVzcGVyYmxvY2sgPSAyICogYmxvY2tzaXplIC8gY2hhbm5lbHMgLSA3OworICBieXRlc3BlcnNlYyA9IHJhdGUgKiBibG9ja3NpemUgLyBzYW1wbGVzcGVyYmxvY2s7CisgIEdTVF9XUklURV9VSU5UMTZfTEUgKGRhdGEsIDB4MTEpOworICBHU1RfV1JJVEVfVUlOVDE2X0xFIChkYXRhICsgMiwgY2hhbm5lbHMpOworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhICsgNCwgcmF0ZSk7CisgIEdTVF9XUklURV9VSU5UMzJfTEUgKGRhdGEgKyA4LCBieXRlc3BlcnNlYyk7CisgIEdTVF9XUklURV9VSU5UMTZfTEUgKGRhdGEgKyAxMiwgYmxvY2tzaXplKTsKKyAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoZGF0YSArIDE0LCA0KTsKKyAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoZGF0YSArIDE2LCAyKTsgICAvKiBUd28gZXh0cmEgYnl0ZXMgKi8KKyAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoZGF0YSArIDE4LCBzYW1wbGVzcGVyYmxvY2spOworCisgIHJldHVybiBidWlsZF9hdG9tX2luZm9fd3JhcHBlciAoKEF0b20gKikgYXRvbV9kYXRhLCBhdG9tX2RhdGFfY29weV9kYXRhLAorICAgICAgYXRvbV9kYXRhX2ZyZWUpOworfQorCitBdG9tSW5mbyAqCitidWlsZF9pbWFfYWRwY21fZXh0ZW5zaW9uIChnaW50IGNoYW5uZWxzLCBnaW50IHJhdGUsIGdpbnQgYmxvY2tzaXplKQoreworICBBdG9tV0FWRSAqd2F2ZTsKKyAgQXRvbUZSTUEgKmZybWE7CisgIEF0b20gKmV4dF9hdG9tOworCisgIC8qIEFkZCBXQVZFIGF0b20gKi8KKyAgd2F2ZSA9IGF0b21fd2F2ZV9uZXcgKCk7CisKKyAgLyogUHJlcGVuZCBUZXJtaW5hdG9yIGF0b20gdG8gdGhlIFdBVkUgbGlzdCBmaXJzdCwgc28gaXQgZW5kcyB1cCBsYXN0ICovCisgIGV4dF9hdG9tID0gKEF0b20gKikgYXRvbV9kYXRhX25ldyAoRk9VUkNDX251bGwpOworICB3YXZlLT5leHRlbnNpb25fYXRvbXMgPQorICAgICAgYXRvbV9pbmZvX2xpc3RfcHJlcGVuZF9hdG9tICh3YXZlLT5leHRlbnNpb25fYXRvbXMsIChBdG9tICopIGV4dF9hdG9tLAorICAgICAgKEF0b21Db3B5RGF0YUZ1bmMpIGF0b21fZGF0YV9jb3B5X2RhdGEsIChBdG9tRnJlZUZ1bmMpIGF0b21fZGF0YV9mcmVlKTsKKworICAvKiBBZGQgd2F2ZSBpbWEgYWRwY20gYXRvbSB0byBXQVZFICovCisgIHdhdmUtPmV4dGVuc2lvbl9hdG9tcyA9IGdfbGlzdF9wcmVwZW5kICh3YXZlLT5leHRlbnNpb25fYXRvbXMsCisgICAgICBidWlsZF9pbWFfYWRwY21fYXRvbSAoY2hhbm5lbHMsIHJhdGUsIGJsb2Nrc2l6ZSkpOworCisgIC8qIEFkZCBGUk1BIHRvIHRoZSBXQVZFICovCisgIGZybWEgPSBhdG9tX2ZybWFfbmV3ICgpOworICBmcm1hLT5tZWRpYV90eXBlID0gTVNfV0FWRV9GT1VSQ0MgKDB4MTEpOworCisgIHdhdmUtPmV4dGVuc2lvbl9hdG9tcyA9CisgICAgICBhdG9tX2luZm9fbGlzdF9wcmVwZW5kX2F0b20gKHdhdmUtPmV4dGVuc2lvbl9hdG9tcywgKEF0b20gKikgZnJtYSwKKyAgICAgIChBdG9tQ29weURhdGFGdW5jKSBhdG9tX2ZybWFfY29weV9kYXRhLCAoQXRvbUZyZWVGdW5jKSBhdG9tX2ZybWFfZnJlZSk7CisKKyAgcmV0dXJuIGJ1aWxkX2F0b21faW5mb193cmFwcGVyICgoQXRvbSAqKSB3YXZlLCBhdG9tX3dhdmVfY29weV9kYXRhLAorICAgICAgYXRvbV93YXZlX2ZyZWUpOworfQorCitBdG9tSW5mbyAqCitidWlsZF9hYzNfZXh0ZW5zaW9uIChndWludDggZnNjb2QsIGd1aW50OCBic2lkLCBndWludDggYnNtb2QsIGd1aW50OCBhY21vZCwKKyAgICBndWludDggbGZlX29uLCBndWludDggYml0cmF0ZV9jb2RlKQoreworICBBdG9tRGF0YSAqYXRvbV9kYXRhID0gYXRvbV9kYXRhX25ldyAoRk9VUkNDX2RhYzMpOworICBndWludDggKmRhdGE7CisKKyAgYXRvbV9kYXRhX2FsbG9jX21lbSAoYXRvbV9kYXRhLCAzKTsKKyAgZGF0YSA9IGF0b21fZGF0YS0+ZGF0YTsKKworICAvKiBCaXRzIGZyb20gdGhlIHNwZWMKKyAgICogZnNjb2QgMgorICAgKiBic2lkICA1CisgICAqIGJzbW9kIDMKKyAgICogYWNtb2QgMworICAgKiBsZmVvbiAxCisgICAqIGJpdF9yYXRlX2NvZGUgNQorICAgKiByZXNlcnZlZCA1CisgICAqLworCisgIC8qIFNvbWUgYml0IG1hbmlwdWxhdGlvbiBtYWdpYy4gTmVlZCBiaXR3cml0ZXIgKi8KKyAgZGF0YVswXSA9IChmc2NvZCA8PCA2KSB8IChic2lkIDw8IDEpIHwgKChic21vZCA+PiAyKSAmIDEpOworICBkYXRhWzFdID0KKyAgICAgICgoYnNtb2QgJiAweDMpIDw8IDYpIHwgKGFjbW9kIDw8IDMpIHwgKChsZmVfb24gJiAxKSA8PCAyKSB8ICgoYml0cmF0ZV9jb2RlCisgICAgICAgICAgPj4gMykgJiAweDMpOworICBkYXRhWzJdID0gKChiaXRyYXRlX2NvZGUgJiAweDcpIDw8IDUpOworCisgIHJldHVybiBidWlsZF9hdG9tX2luZm9fd3JhcHBlciAoKEF0b20gKikgYXRvbV9kYXRhLCBhdG9tX2RhdGFfY29weV9kYXRhLAorICAgICAgYXRvbV9kYXRhX2ZyZWUpOworfQorCitBdG9tSW5mbyAqCitidWlsZF9vcHVzX2V4dGVuc2lvbiAoZ3VpbnQzMiByYXRlLCBndWludDggY2hhbm5lbHMsIGd1aW50OCBtYXBwaW5nX2ZhbWlseSwKKyAgICBndWludDggc3RyZWFtX2NvdW50LCBndWludDggY291cGxlZF9jb3VudCwgZ3VpbnQ4IGNoYW5uZWxfbWFwcGluZ1syNTZdLAorICAgIGd1aW50MTYgcHJlX3NraXAsIGd1aW50MTYgb3V0cHV0X2dhaW4pCit7CisgIEF0b21EYXRhICphdG9tX2RhdGE7CisgIGd1aW50OCAqZGF0YV9ibG9jazsKKyAgR3N0Qnl0ZVdyaXRlciBidzsKKyAgZ2Jvb2xlYW4gaGRsID0gVFJVRTsKKyAgZ3VpbnQgZGF0YV9ibG9ja19sZW47CisKKyAgZ3N0X2J5dGVfd3JpdGVyX2luaXQgKCZidyk7CisgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQ4ICgmYncsIDB4MDApOyAvKiB2ZXJzaW9uIG51bWJlciAqLworICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50OCAoJmJ3LCBjaGFubmVscyk7CisgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQxNl9sZSAoJmJ3LCBwcmVfc2tpcCk7CisgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCByYXRlKTsKKyAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDE2X2xlICgmYncsIG91dHB1dF9nYWluKTsKKyAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDggKCZidywgbWFwcGluZ19mYW1pbHkpOworICBpZiAobWFwcGluZ19mYW1pbHkgPiAwKSB7CisgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDggKCZidywgc3RyZWFtX2NvdW50KTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50OCAoJmJ3LCBjb3VwbGVkX2NvdW50KTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICgmYncsIGNoYW5uZWxfbWFwcGluZywgY2hhbm5lbHMpOworICB9CisKKyAgaWYgKCFoZGwpIHsKKyAgICBHU1RfV0FSTklORyAoIkVycm9yIGNyZWF0aW5nIGhlYWRlciIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgZGF0YV9ibG9ja19sZW4gPSBnc3RfYnl0ZV93cml0ZXJfZ2V0X3NpemUgKCZidyk7CisgIGRhdGFfYmxvY2sgPSBnc3RfYnl0ZV93cml0ZXJfcmVzZXRfYW5kX2dldF9kYXRhICgmYncpOworICBhdG9tX2RhdGEgPSBhdG9tX2RhdGFfbmV3X2Zyb21fZGF0YSAoRk9VUkNDX2RvcHMsIGRhdGFfYmxvY2ssIGRhdGFfYmxvY2tfbGVuKTsKKyAgZ19mcmVlIChkYXRhX2Jsb2NrKTsKKworICByZXR1cm4gYnVpbGRfYXRvbV9pbmZvX3dyYXBwZXIgKChBdG9tICopIGF0b21fZGF0YSwgYXRvbV9kYXRhX2NvcHlfZGF0YSwKKyAgICAgIGF0b21fZGF0YV9mcmVlKTsKK30KKworQXRvbUluZm8gKgorYnVpbGRfdXVpZF94bXBfYXRvbSAoR3N0QnVmZmVyICogeG1wX2RhdGEpCit7CisgIEF0b21VVUlEICp1dWlkOworICBnc2l6ZSBzaXplOworICBzdGF0aWMgY29uc3QgZ3VpbnQ4IHhtcF91dWlkW10gPSB7IDB4QkUsIDB4N0EsIDB4Q0YsIDB4Q0IsCisgICAgMHg5NywgMHhBOSwgMHg0MiwgMHhFOCwKKyAgICAweDlDLCAweDcxLCAweDk5LCAweDk0LAorICAgIDB4OTEsIDB4RTMsIDB4QUYsIDB4QUMKKyAgfTsKKworICBpZiAoeG1wX2RhdGEgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICB1dWlkID0gYXRvbV91dWlkX25ldyAoKTsKKyAgbWVtY3B5ICh1dWlkLT51dWlkLCB4bXBfdXVpZCwgMTYpOworCisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplICh4bXBfZGF0YSk7CisgIHV1aWQtPmRhdGEgPSBnX21hbGxvYyAoc2l6ZSk7CisgIHV1aWQtPmRhdGFsZW4gPSBzaXplOworICBnc3RfYnVmZmVyX2V4dHJhY3QgKHhtcF9kYXRhLCAwLCB1dWlkLT5kYXRhLCBzaXplKTsKKworICByZXR1cm4gYnVpbGRfYXRvbV9pbmZvX3dyYXBwZXIgKChBdG9tICopIHV1aWQsIGF0b21fdXVpZF9jb3B5X2RhdGEsCisgICAgICBhdG9tX3V1aWRfZnJlZSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L2F0b21zLmggYi9nc3QvaXNvbXA0L2F0b21zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdkMjQ5NAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvYXRvbXMuaApAQCAtMCwwICsxLDExMjggQEAKKy8qIFF1aWNrdGltZSBtdXhlciBwbHVnaW4gZm9yIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnI+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qCisgKiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgU291cmNlIENvZGUgaXMgbGljZW5zZWQgdW5kZXIgTUlUIGxpY2Vuc2UuCisgKiBTZWUgZnVydGhlciBleHBsYW5hdGlvbiBhdHRhY2hlZCBpbiBMaWNlbnNlIFN0YXRlbWVudCAoZGlzdHJpYnV0ZWQgaW4gdGhlIGZpbGUKKyAqIExJQ0VOU0UpLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fQVRPTVNfSF9fCisjZGVmaW5lIF9fQVRPTVNfSF9fCisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpbmNsdWRlICJkZXNjcmlwdG9ycy5oIgorI2luY2x1ZGUgInByb3BlcnRpZXMuaCIKKyNpbmNsdWRlICJmb3VyY2MuaCIKKworLyogaGVscGVyIHN0b3JhZ2Ugc3RydWN0ICovCisjZGVmaW5lIEFUT01fQVJSQVkoc3RydWN0X3R5cGUpIFwKK3N0cnVjdCB7IFwKKyAgZ3VpbnQgc2l6ZTsgXAorICBndWludCBsZW47IFwKKyAgc3RydWN0X3R5cGUgKmRhdGE7IFwKK30KKworLyogc3RvcmFnZSBoZWxwZXJzICovCisKKyNkZWZpbmUgYXRvbV9hcnJheV9pbml0KGFycmF5LCByZXNlcnZlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0dfU1RNVF9TVEFSVCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGFycmF5KS0+bGVuID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGFycmF5KS0+c2l6ZSA9IHJlc2VydmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGFycmF5KS0+ZGF0YSA9IGdfbWFsbG9jIChzaXplb2YgKCooYXJyYXkpLT5kYXRhKSAqIHJlc2VydmUpOyAgICAgICAgICAgICAgIFwKK30gR19TVE1UX0VORAorCisjZGVmaW5lIGF0b21fYXJyYXlfYXBwZW5kKGFycmF5LCBlbG10LCBpbmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdfYXNzZXJ0ICgoYXJyYXkpLT5kYXRhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdfYXNzZXJ0IChpbmMgPiAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChHX1VOTElLRUxZICgoYXJyYXkpLT5sZW4gPT0gKGFycmF5KS0+c2l6ZSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGFycmF5KS0+c2l6ZSArPSBpbmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGFycmF5KS0+ZGF0YSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGdfcmVhbGxvYyAoKGFycmF5KS0+ZGF0YSwgc2l6ZW9mICgqKChhcnJheSktPmRhdGEpKSAqIChhcnJheSktPnNpemUpOyBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChhcnJheSktPmRhdGFbKGFycmF5KS0+bGVuXSA9IGVsbXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChhcnJheSktPmxlbisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IEdfU1RNVF9FTkQKKworI2RlZmluZSBhdG9tX2FycmF5X2dldF9sZW4oYXJyYXkpICAgICAgICAgICAgICAgICAgKChhcnJheSktPmxlbikKKyNkZWZpbmUgYXRvbV9hcnJheV9pbmRleChhcnJheSwgaW5kZXgpICAgICAgICAgICAgICgoYXJyYXkpLT5kYXRhW2luZGV4XSkKKworI2RlZmluZSBhdG9tX2FycmF5X2NsZWFyKGFycmF5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorR19TVE1UX1NUQVJUIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoYXJyYXkpLT5zaXplID0gKGFycmF5KS0+bGVuID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnX2ZyZWUgKChhcnJheSktPmRhdGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoYXJyYXkpLT5kYXRhID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSBHX1NUTVRfRU5ECisKKy8qIGxpZ2h0LXdlaWdodCBjb250ZXh0IHRoYXQgbWF5IGluZmx1ZW5jZSBoZWFkZXIgYXRvbSB0cmVlIGNvbnN0cnVjdGlvbiAqLwordHlwZWRlZiBlbnVtIF9BdG9tc1RyZWVGbGF2b3IKK3sKKyAgQVRPTVNfVFJFRV9GTEFWT1JfTU9WLAorICBBVE9NU19UUkVFX0ZMQVZPUl9JU09NLAorICBBVE9NU19UUkVFX0ZMQVZPUl8zR1AsCisgIEFUT01TX1RSRUVfRkxBVk9SX0lTTUwKK30gQXRvbXNUcmVlRmxhdm9yOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbXNDb250ZXh0Cit7CisgIEF0b21zVHJlZUZsYXZvciBmbGF2b3I7Cit9IEF0b21zQ29udGV4dDsKKworQXRvbXNDb250ZXh0KiBhdG9tc19jb250ZXh0X25ldyAgKEF0b21zVHJlZUZsYXZvciBmbGF2b3IpOwordm9pZCAgICAgICAgICBhdG9tc19jb250ZXh0X2ZyZWUgKEF0b21zQ29udGV4dCAqY29udGV4dCk7CisKKyNkZWZpbmUgTUVUQURBVEFfREFUQV9GTEFHIDB4MAorI2RlZmluZSBNRVRBREFUQV9URVhUX0ZMQUcgMHgxCisKKy8qIGF0b20gZGVmcyBhbmQgZnVuY3Rpb25zICovCisKK3R5cGVkZWYgc3RydWN0IF9BdG9tSW5mbyBBdG9tSW5mbzsKKworLyoKKyAqIFVzZWQgZm9yIHN0b3JpbmcgdGltZSByZWxhdGVkIHZhbHVlcyBmb3Igc29tZSBhdG9tcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX1RpbWVJbmZvCit7CisgIGd1aW50NjQgY3JlYXRpb25fdGltZTsKKyAgZ3VpbnQ2NCBtb2RpZmljYXRpb25fdGltZTsKKyAgZ3VpbnQzMiB0aW1lc2NhbGU7CisgIGd1aW50NjQgZHVyYXRpb247Cit9IFRpbWVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbQoreworICBndWludDMyIHNpemU7CisgIGd1aW50MzIgdHlwZTsKKyAgZ3VpbnQ2NCBleHRlbmRlZF9zaXplOworfSBBdG9tOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbUZ1bGwKK3sKKyAgQXRvbSBoZWFkZXI7CisKKyAgZ3VpbnQ4IHZlcnNpb247CisgIGd1aW50OCBmbGFnc1szXTsKK30gQXRvbUZ1bGw7CisKKy8qCisgKiBHZW5lcmljIGV4dGVuc2lvbiBhdG9tCisgKi8KK3R5cGVkZWYgc3RydWN0IF9BdG9tRGF0YQoreworICBBdG9tIGhlYWRlcjsKKworICAvKiBub3Qgd3JpdHRlbiAqLworICBndWludDMyIGRhdGFsZW47CisKKyAgZ3VpbnQ4ICpkYXRhOworfSBBdG9tRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21VVUlECit7CisgIEF0b20gaGVhZGVyOworCisgIGd1aW50OCB1dWlkWzE2XTsKKworICAvKiBub3Qgd3JpdHRlbiAqLworICBndWludDMyIGRhdGFsZW47CisKKyAgZ3VpbnQ4ICpkYXRhOworfSBBdG9tVVVJRDsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21GVFlQCit7CisgIEF0b20gaGVhZGVyOworICBndWludDMyIG1ham9yX2JyYW5kOworICBndWludDMyIHZlcnNpb247CisgIGd1aW50MzIgKmNvbXBhdGlibGVfYnJhbmRzOworCisgIC8qIG5vdCB3cml0dGVuICovCisgIGd1aW50MzIgY29tcGF0aWJsZV9icmFuZHNfc2l6ZTsKK30gQXRvbUZUWVA7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tTVZIRAoreworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgLyogdmVyc2lvbiAwOiAzMiBiaXRzICovCisgIFRpbWVJbmZvIHRpbWVfaW5mbzsKKworICBndWludDMyIHByZWZlcmVkX3JhdGU7ICAgICAgLyogSVNPOiAweDAwMDEwMDAwICovCisgIGd1aW50MTYgdm9sdW1lOyAgICAgICAgICAgICAvKiBJU086IDB4MDEwMCAqLworICBndWludDE2IHJlc2VydmVkMzsgICAgICAgICAgLyogSVNPOiAweDAgKi8KKyAgZ3VpbnQzMiByZXNlcnZlZDRbMl07ICAgICAgIC8qIElTTzogMCwgMCAqLworICAvKiBJU086IGlkZW50aXR5IG1hdHJpeCA9CisgICAqIHsgMHgwMDAxMDAwMCwgMCwgMCwgMCwgMHgwMDAxMDAwMCwgMCwgMCwgMCwgMHg0MDAwMDAwMCB9ICovCisgIGd1aW50MzIgbWF0cml4WzldOworCisgIC8qIElTTzogYWxsIDAgKi8KKyAgZ3VpbnQzMiBwcmV2aWV3X3RpbWU7CisgIGd1aW50MzIgcHJldmlld19kdXJhdGlvbjsKKyAgZ3VpbnQzMiBwb3N0ZXJfdGltZTsKKyAgZ3VpbnQzMiBzZWxlY3Rpb25fdGltZTsKKyAgZ3VpbnQzMiBzZWxlY3Rpb25fZHVyYXRpb247CisgIGd1aW50MzIgY3VycmVudF90aW1lOworCisgIGd1aW50MzIgbmV4dF90cmFja19pZDsKK30gQXRvbU1WSEQ7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tVEtIRAoreworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgLyogdmVyc2lvbiAwOiAzMiBiaXRzICovCisgIC8qIGxpa2UgdGhlIFRpbWVJbmZvIHN0cnVjdCwgYnV0IGl0IGhhcyB0aGlzIHRyYWNrX0lEIGluc2lkZSAqLworICBndWludDY0IGNyZWF0aW9uX3RpbWU7CisgIGd1aW50NjQgbW9kaWZpY2F0aW9uX3RpbWU7CisgIGd1aW50MzIgdHJhY2tfSUQ7CisgIGd1aW50MzIgcmVzZXJ2ZWQ7CisgIGd1aW50NjQgZHVyYXRpb247CisKKyAgZ3VpbnQzMiByZXNlcnZlZDJbMl07CisgIGd1aW50MTYgbGF5ZXI7CisgIGd1aW50MTYgYWx0ZXJuYXRlX2dyb3VwOworICBndWludDE2IHZvbHVtZTsKKyAgZ3VpbnQxNiByZXNlcnZlZDM7CisKKyAgLyogSVNPOiBpZGVudGl0eSBtYXRyaXggPQorICAgKiB7IDB4MDAwMTAwMDAsIDAsIDAsIDAsIDB4MDAwMTAwMDAsIDAsIDAsIDAsIDB4NDAwMDAwMDAgfSAqLworICBndWludDMyIG1hdHJpeFs5XTsKKyAgZ3VpbnQzMiB3aWR0aDsKKyAgZ3VpbnQzMiBoZWlnaHQ7Cit9IEF0b21US0hEOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbU1ESEQKK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworCisgIC8qIHZlcnNpb24gMDogMzIgYml0cyAqLworICBUaW1lSW5mbyB0aW1lX2luZm87CisKKyAgLyogSVNPOiBwYWNrZWQgSVNPLTYzOS0yL1QgbGFuZ3VhZ2UgY29kZSAoZmlyc3QgYml0IG11c3QgYmUgMCkgKi8KKyAgZ3VpbnQxNiBsYW5ndWFnZV9jb2RlOworICAvKiBJU086IDAgKi8KKyAgZ3VpbnQxNiBxdWFsaXR5OworfSBBdG9tTURIRDsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21IRExSCit7CisgIEF0b21GdWxsIGhlYWRlcjsKKworICAvKiBJU086IDAgKi8KKyAgZ3VpbnQzMiBjb21wb25lbnRfdHlwZTsKKyAgZ3VpbnQzMiBoYW5kbGVyX3R5cGU7CisgIGd1aW50MzIgbWFudWZhY3R1cmVyOworICBndWludDMyIGZsYWdzOworICBndWludDMyIGZsYWdzX21hc2s7CisgIGdjaGFyICpuYW1lOworCisgIEF0b21zVHJlZUZsYXZvciBmbGF2b3I7Cit9IEF0b21IRExSOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVZNSEQKK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOyAgICAgICAgICAvKiBJU086IGZsYWdzID0gMSAqLworCisgIGd1aW50MTYgZ3JhcGhpY3NfbW9kZTsKKyAgLyogUkdCICovCisgIGd1aW50MTYgb3Bjb2xvclszXTsKK30gQXRvbVZNSEQ7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tU01IRAoreworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgZ3VpbnQxNiBiYWxhbmNlOworICBndWludDE2IHJlc2VydmVkOworfSBBdG9tU01IRDsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21ITUhECit7CisgIEF0b21GdWxsIGhlYWRlcjsKKworICBndWludDE2IG1heF9wZHVfc2l6ZTsKKyAgZ3VpbnQxNiBhdmdfcGR1X3NpemU7CisgIGd1aW50MzIgbWF4X2JpdHJhdGU7CisgIGd1aW50MzIgYXZnX2JpdHJhdGU7CisgIGd1aW50MzIgc2xpZGluZ19hdmdfYml0cmF0ZTsKK30gQXRvbUhNSEQ7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tVENNSQoreworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgZ3VpbnQxNiB0ZXh0X2ZvbnQ7CisgIGd1aW50MTYgdGV4dF9mYWNlOworICBndWludDE2IHRleHRfc2l6ZTsKKyAgZ3VpbnQxNiB0ZXh0X2NvbG9yWzNdOworICBndWludDE2IGJnX2NvbG9yWzNdOworICBnY2hhciAqZm9udF9uYW1lOworfSBBdG9tVENNSTsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21UTUNECit7CisgIEF0b20gaGVhZGVyOworCisgIEF0b21UQ01JIHRjbWk7Cit9IEF0b21UTUNEOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbUdNSU4KK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworCisgIGd1aW50MTYgZ3JhcGhpY3NfbW9kZTsKKyAgZ3VpbnQxNiBvcGNvbG9yWzNdOworICBndWludDggYmFsYW5jZTsKKyAgZ3VpbnQ4IHJlc2VydmVkOworCit9IEF0b21HTUlOOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbUdNSEQKK3sKKyAgQXRvbSBoZWFkZXI7CisKKyAgQXRvbUdNSU4gZ21pbjsKKyAgQXRvbVRNQ0QgdG1jZDsKKworfSBBdG9tR01IRDsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21VUkwKK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworCisgIGdjaGFyICpsb2NhdGlvbjsKK30gQXRvbVVSTDsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21EUkVGCit7CisgIEF0b21GdWxsIGhlYWRlcjsKKworICBHTGlzdCAqZW50cmllczsKK30gQXRvbURSRUY7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tRElORgoreworICBBdG9tIGhlYWRlcjsKKworICBBdG9tRFJFRiBkcmVmOworfSBBdG9tRElORjsKKwordHlwZWRlZiBzdHJ1Y3QgX1NUVFNFbnRyeQoreworICBndWludDMyIHNhbXBsZV9jb3VudDsKKyAgZ2ludDMyIHNhbXBsZV9kZWx0YTsKK30gU1RUU0VudHJ5OworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVNUVFMKK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworCisgIEFUT01fQVJSQVkgKFNUVFNFbnRyeSkgZW50cmllczsKK30gQXRvbVNUVFM7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tU1RTUworeworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgQVRPTV9BUlJBWSAoZ3VpbnQzMikgZW50cmllczsKK30gQXRvbVNUU1M7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tRVNEUworeworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgRVNEZXNjcmlwdG9yIGVzOworfSBBdG9tRVNEUzsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21GUk1BCit7CisgIEF0b20gaGVhZGVyOworCisgIGd1aW50MzIgbWVkaWFfdHlwZTsKK30gQXRvbUZSTUE7CisKK3R5cGVkZWYgZW51bSBfU2FtcGxlRW50cnlLaW5kCit7CisgIFVOS05PV04sCisgIEFVRElPLAorICBWSURFTywKKyAgU1VCVElUTEUsCisgIFRJTUVDT0RFCit9IFNhbXBsZUVudHJ5S2luZDsKKwordHlwZWRlZiBzdHJ1Y3QgX1NhbXBsZVRhYmxlRW50cnkKK3sKKyAgQXRvbSBoZWFkZXI7CisKKyAgZ3VpbnQ4IHJlc2VydmVkWzZdOworICBndWludDE2IGRhdGFfcmVmZXJlbmNlX2luZGV4OworCisgIC8qIHR5cGUgb2YgZW50cnkgKi8KKyAgU2FtcGxlRW50cnlLaW5kIGtpbmQ7Cit9IFNhbXBsZVRhYmxlRW50cnk7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tSGludFNhbXBsZUVudHJ5Cit7CisgIFNhbXBsZVRhYmxlRW50cnkgc2U7CisgIGd1aW50MzIgc2l6ZTsKKyAgZ3VpbnQ4ICpkYXRhOworfSBBdG9tSGludFNhbXBsZUVudHJ5OworCit0eXBlZGVmIHN0cnVjdCBfU2FtcGxlVGFibGVFbnRyeU1QNFYKK3sKKyAgU2FtcGxlVGFibGVFbnRyeSBzZTsKKworICBndWludDE2IHZlcnNpb247CisgIGd1aW50MTYgcmV2aXNpb25fbGV2ZWw7CisKKyAgZ3VpbnQzMiB2ZW5kb3I7ICAgICAgICAgICAgICAgICAvKiBmb3VyY2MgY29kZSAqLworICBndWludDMyIHRlbXBvcmFsX3F1YWxpdHk7CisgIGd1aW50MzIgc3BhdGlhbF9xdWFsaXR5OworCisgIGd1aW50MTYgd2lkdGg7CisgIGd1aW50MTYgaGVpZ2h0OworCisgIGd1aW50MzIgaG9yaXpvbnRhbF9yZXNvbHV0aW9uOworICBndWludDMyIHZlcnRpY2FsX3Jlc29sdXRpb247CisgIGd1aW50MzIgZGF0YXNpemU7CisKKyAgZ3VpbnQxNiBmcmFtZV9jb3VudDsgICAgICAgICAgICAvKiB1c3VhbGx5IDEgKi8KKworICBndWludDggY29tcHJlc3NvclszMl07ICAgICAgICAgLyogcGFzY2FsIHN0cmluZywgaS5lLiBmaXJzdCBieXRlID0gbGVuZ3RoICovCisKKyAgZ3VpbnQxNiBkZXB0aDsKKyAgZ3VpbnQxNiBjb2xvcl90YWJsZV9pZDsKKworICAvKiAob3B0aW9uYWwpIGxpc3Qgb2YgQXRvbUluZm8gKi8KKyAgR0xpc3QgKmV4dGVuc2lvbl9hdG9tczsKK30gU2FtcGxlVGFibGVFbnRyeU1QNFY7CisKK3R5cGVkZWYgc3RydWN0IF9TYW1wbGVUYWJsZUVudHJ5TVA0QQoreworICBTYW1wbGVUYWJsZUVudHJ5IHNlOworCisgIGd1aW50MTYgdmVyc2lvbjsKKyAgZ3VpbnQxNiByZXZpc2lvbl9sZXZlbDsKKyAgZ3VpbnQzMiB2ZW5kb3I7CisKKyAgZ3VpbnQxNiBjaGFubmVsczsKKyAgZ3VpbnQxNiBzYW1wbGVfc2l6ZTsKKyAgZ3VpbnQxNiBjb21wcmVzc2lvbl9pZDsKKyAgZ3VpbnQxNiBwYWNrZXRfc2l6ZTsKKworICBndWludDMyIHNhbXBsZV9yYXRlOyAgICAgICAgICAgIC8qIGZpeGVkIHBvaW50IDE2LjE2ICovCisKKyAgZ3VpbnQzMiBzYW1wbGVzX3Blcl9wYWNrZXQ7CisgIGd1aW50MzIgYnl0ZXNfcGVyX3BhY2tldDsKKyAgZ3VpbnQzMiBieXRlc19wZXJfZnJhbWU7CisgIGd1aW50MzIgYnl0ZXNfcGVyX3NhbXBsZTsKKworICAvKiAob3B0aW9uYWwpIGxpc3Qgb2YgQXRvbUluZm8gKi8KKyAgR0xpc3QgKmV4dGVuc2lvbl9hdG9tczsKK30gU2FtcGxlVGFibGVFbnRyeU1QNEE7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tTkFNRQoreworICBBdG9tIGhlYWRlcjsKKworICBndWludDggbGFuZ3VhZ2VfY29kZTsKKyAgZ2NoYXIgKm5hbWU7Cit9IEF0b21OQU1FOworCit0eXBlZGVmIHN0cnVjdCBfU2FtcGxlVGFibGVFbnRyeVRNQ0QKK3sKKyAgU2FtcGxlVGFibGVFbnRyeSBzZTsKKworICBndWludDMyIHRjX2ZsYWdzOworICBndWludDMyIHRpbWVzY2FsZTsKKyAgZ3VpbnQzMiBmcmFtZV9kdXJhdGlvbjsKKyAgZ3VpbnQ4IG5fZnJhbWVzOworCisgIEF0b21OQU1FIG5hbWU7CisKK30gU2FtcGxlVGFibGVFbnRyeVRNQ0Q7CisKK3R5cGVkZWYgc3RydWN0IF9TYW1wbGVUYWJsZUVudHJ5VFgzRworeworICBTYW1wbGVUYWJsZUVudHJ5IHNlOworCisgIGd1aW50MzIgZGlzcGxheV9mbGFnczsKKyAgZ3VpbnQ2NCBkZWZhdWx0X3RleHRfYm94OworICBndWludDE2IGZvbnRfaWQ7CisgIGd1aW50OCAgZm9udF9mYWNlOyAvKiBib2xkPTB4MSwgaXRhbGljPTB4MiwgdW5kZXJsaW5lPTB4NCAqLworICBndWludDggIGZvbnRfc2l6ZTsgLyogc2hvdWxkIGFsd2F5cyBiZSAwLjA1IG11bHRpcGxpZWQgYnkgdGhlIHZpZGVvIHRyYWNrIGhlYWRlciBoZWlnaHQgKi8KKyAgZ3VpbnQzMiBmb3JlZ3JvdW5kX2NvbG9yX3JnYmE7CisKK30gU2FtcGxlVGFibGVFbnRyeVRYM0c7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tU1RTRAoreworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgZ3VpbnQgbl9lbnRyaWVzOworICAvKiBsaXN0IG9mIHN1YmNsYXNzZXMgb2YgU2FtcGxlVGFibGVFbnRyeSAqLworICBHTGlzdCAqZW50cmllczsKK30gQXRvbVNUU0Q7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tU1RTWgoreworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgZ3VpbnQzMiBzYW1wbGVfc2l6ZTsKKworICAvKiBuZWVkIHRoZSBzaXplIGhlcmUgYmVjYXVzZSB3aGVuIHNhbXBsZV9zaXplIGlzIGNvbnN0YW50LAorICAgKiB0aGUgbGlzdCBpcyBlbXB0eSAqLworICBndWludDMyIHRhYmxlX3NpemU7CisgIEFUT01fQVJSQVkgKGd1aW50MzIpIGVudHJpZXM7Cit9IEF0b21TVFNaOworCit0eXBlZGVmIHN0cnVjdCBfU1RTQ0VudHJ5Cit7CisgIGd1aW50MzIgZmlyc3RfY2h1bms7CisgIGd1aW50MzIgc2FtcGxlc19wZXJfY2h1bms7CisgIGd1aW50MzIgc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4OworfSBTVFNDRW50cnk7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tU1RTQworeworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgQVRPTV9BUlJBWSAoU1RTQ0VudHJ5KSBlbnRyaWVzOworfSBBdG9tU1RTQzsKKworLyogRklYTUU6IHRoaXMgY2FuIHN1cHBvcnQgbXVsdGlwbGUgdHJhY2tzICovCit0eXBlZGVmIHN0cnVjdCBfQXRvbVRSRUYKK3sKKyAgQXRvbSBoZWFkZXI7CisKKyAgZ3VpbnQzMiByZWZ0eXBlOworICBBVE9NX0FSUkFZIChndWludDMyKSBlbnRyaWVzOworfSBBdG9tVFJFRjsKKworLyoKKyAqIHVzZWQgZm9yIGJvdGggU1RDTyBhbmQgQ082NAorICogaWYgdXNlZCBhcyBTVENPLCBlbnRyaWVzIHNob3VsZCBiZSB0cnVuY2F0ZWQgdG8gdXNlIG9ubHkgMzJiaXRzCisgKi8KK3R5cGVkZWYgc3RydWN0IF9BdG9tU1RDTzY0Cit7CisgIEF0b21GdWxsIGhlYWRlcjsKKyAgLyogR2xvYmFsIG9mZnNldCB0byBhZGQgdG8gZW50cmllcyB3aGVuIHNlcmlhbGlzaW5nICovCisgIGd1aW50MzIgY2h1bmtfb2Zmc2V0OworICBBVE9NX0FSUkFZIChndWludDY0KSBlbnRyaWVzOworfSBBdG9tU1RDTzY0OworCit0eXBlZGVmIHN0cnVjdCBfQ1RUU0VudHJ5Cit7CisgIGd1aW50MzIgc2FtcGxlY291bnQ7CisgIGd1aW50MzIgc2FtcGxlb2Zmc2V0OworfSBDVFRTRW50cnk7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tQ1RUUworeworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgLyogYWxzbyBlbnRyeSBjb3VudCBoZXJlICovCisgIEFUT01fQVJSQVkgKENUVFNFbnRyeSkgZW50cmllczsKKyAgZ2Jvb2xlYW4gZG9fcHRzOworfSBBdG9tQ1RUUzsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21TVk1JCit7CisgIEF0b21GdWxsIGhlYWRlcjsKKworICBndWludDggc3RlcmVvc2NvcGljX2NvbXBvc2l0aW9uX3R5cGU7CisgIGdib29sZWFuIGlzX2xlZnRfZmlyc3Q7Cit9IEF0b21TVk1JOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVNUQkwKK3sKKyAgQXRvbSBoZWFkZXI7CisKKyAgQXRvbVNUU0Qgc3RzZDsKKyAgQXRvbVNUVFMgc3R0czsKKyAgQXRvbVNUU1Mgc3RzczsKKyAgQXRvbVNUU0Mgc3RzYzsKKyAgQXRvbVNUU1ogc3RzejsKKyAgLyogTlVMTCBpZiBub3QgcHJlc2VudCAqLworICBBdG9tQ1RUUyAqY3R0czsKKyAgLyogTlVMTCBpZiBub3QgcHJlc2VudCAqLworICBBdG9tU1ZNSSAqc3ZtaTsKKworICBBdG9tU1RDTzY0IHN0Y282NDsKK30gQXRvbVNUQkw7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tTUlORgoreworICBBdG9tIGhlYWRlcjsKKworICAvKiBvbmx5IChleGFjdGx5KSBvbmUgb2YgdGhvc2UgbXVzdCBiZSBwcmVzZW50ICovCisgIEF0b21WTUhEICp2bWhkOworICBBdG9tU01IRCAqc21oZDsKKyAgQXRvbUhNSEQgKmhtaGQ7CisgIEF0b21HTUhEICpnbWhkOworCisgIEF0b21IRExSICpoZGxyOworICBBdG9tRElORiBkaW5mOworICBBdG9tU1RCTCBzdGJsOworfSBBdG9tTUlORjsKKwordHlwZWRlZiBzdHJ1Y3QgX0VkaXRMaXN0RW50cnkKK3sKKyAgLyogZHVyYXRpb24gaW4gbW92aWUncyB0aW1lc2NhbGUgKi8KKyAgZ3VpbnQzMiBkdXJhdGlvbjsKKyAgLyogc3RhcnQgdGltZSBpbiBtZWRpYSdzIHRpbWVzY2FsZSwgLTEgZm9yIGVtcHR5ICovCisgIGd1aW50MzIgbWVkaWFfdGltZTsKKyAgZ3VpbnQzMiBtZWRpYV9yYXRlOyAgLyogZml4ZWQgcG9pbnQgMzIgYml0ICovCit9IEVkaXRMaXN0RW50cnk7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tRUxTVAoreworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgLyogbnVtYmVyIG9mIGVudHJpZXMgaXMgaW1wbGljaXQgKi8KKyAgR1NMaXN0ICplbnRyaWVzOworfSBBdG9tRUxTVDsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21FRFRTCit7CisgIEF0b20gaGVhZGVyOworICBBdG9tRUxTVCBlbHN0OworfSBBdG9tRURUUzsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21NRElBCit7CisgIEF0b20gaGVhZGVyOworCisgIEF0b21NREhEIG1kaGQ7CisgIEF0b21IRExSIGhkbHI7CisgIEF0b21NSU5GIG1pbmY7Cit9IEF0b21NRElBOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbUlMU1QKK3sKKyAgQXRvbSBoZWFkZXI7CisKKyAgLyogbGlzdCBvZiBBdG9tSW5mbyAqLworICBHTGlzdCogZW50cmllczsKK30gQXRvbUlMU1Q7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tVGFnRGF0YQoreworICBBdG9tRnVsbCBoZWFkZXI7CisgIGd1aW50MzIgcmVzZXJ2ZWQ7CisKKyAgZ3VpbnQzMiBkYXRhbGVuOworICBndWludDgqIGRhdGE7Cit9IEF0b21UYWdEYXRhOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVRhZworeworICBBdG9tIGhlYWRlcjsKKworICBBdG9tVGFnRGF0YSBkYXRhOworfSBBdG9tVGFnOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbU1FVEEKK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworICBBdG9tSERMUiBoZGxyOworICBBdG9tSUxTVCAqaWxzdDsKK30gQXRvbU1FVEE7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tVURUQQoreworICBBdG9tIGhlYWRlcjsKKworICAvKiBsaXN0IG9mIEF0b21JbmZvICovCisgIEdMaXN0KiBlbnRyaWVzOworICAvKiBvciBsaXN0IGlzIGZ1cnRoZXIgZG93biAqLworICBBdG9tTUVUQSAqbWV0YTsKKworICBBdG9tc0NvbnRleHQgKmNvbnRleHQ7Cit9IEF0b21VRFRBOworCitlbnVtIFRyRmxhZ3MKK3sKKyAgVFJfREFUQV9PRkZTRVQgICAgICAgICAgICAgID0gMHgwMSwgICAgIC8qIGRhdGEtb2Zmc2V0LXByZXNlbnQgKi8KKyAgVFJfRklSU1RfU0FNUExFX0ZMQUdTICAgICAgID0gMHgwNCwgICAgIC8qIGZpcnN0LXNhbXBsZS1mbGFncy1wcmVzZW50ICovCisgIFRSX1NBTVBMRV9EVVJBVElPTiAgICAgICAgICA9IDB4MDEwMCwgICAvKiBzYW1wbGUtZHVyYXRpb24tcHJlc2VudCAqLworICBUUl9TQU1QTEVfU0laRSAgICAgICAgICAgICAgPSAweDAyMDAsICAgLyogc2FtcGxlLXNpemUtcHJlc2VudCAqLworICBUUl9TQU1QTEVfRkxBR1MgICAgICAgICAgICAgPSAweDA0MDAsICAgLyogc2FtcGxlLWZsYWdzLXByZXNlbnQgKi8KKyAgVFJfQ09NUE9TSVRJT05fVElNRV9PRkZTRVRTID0gMHgwODAwICAgIC8qIHNhbXBsZS1jb21wb3NpdGlvbi10aW1lLW9mZnNldHMtcHJlc2VudHMgKi8KK307CisKK2VudW0gVGZGbGFncworeworICBURl9CQVNFX0RBVEFfT0ZGU0VUICAgICAgICAgPSAweDAxLCAgICAgLyogYmFzZS1kYXRhLW9mZnNldC1wcmVzZW50ICovCisgIFRGX1NBTVBMRV9ERVNDUklQVElPTl9JTkRFWCA9IDB4MDIsICAgICAvKiBzYW1wbGUtZGVzY3JpcHRpb24taW5kZXgtcHJlc2VudCAqLworICBURl9ERUZBVUxUX1NBTVBMRV9EVVJBVElPTiAgPSAweDA4LCAgICAgLyogZGVmYXVsdC1zYW1wbGUtZHVyYXRpb24tcHJlc2VudCAqLworICBURl9ERUZBVUxUX1NBTVBMRV9TSVpFICAgICAgPSAweDAxMCwgICAgLyogZGVmYXVsdC1zYW1wbGUtc2l6ZS1wcmVzZW50ICovCisgIFRGX0RFRkFVTFRfU0FNUExFX0ZMQUdTICAgICA9IDB4MDIwLCAgICAvKiBkZWZhdWx0LXNhbXBsZS1mbGFncy1wcmVzZW50ICovCisgIFRGX0RVUkFUSU9OX0lTX0VNUFRZICAgICAgICA9IDB4MDEwMDAwLCAvKiBzYW1wbGUtY29tcG9zaXRpb24tdGltZS1vZmZzZXRzLXByZXNlbnRzICovCisgIFRGX0RFRkFVTFRfQkFTRV9JU19NT09GICAgICA9IDB4MDIwMDAwICAvKiBkZWZhdWx0LWJhc2UtaXMtbW9vZiAqLworfTsKKworLyogVGltZWNvZGUgZmxhZ3MgKi8KK2VudW0gVGNGbGFncworeworICBUQ19EUk9QX0ZSQU1FID0gMHgwMDAxLCAgIC8qIERyb3AtZnJhbWUgdGltZWNvZGUgKi8KKyAgVENfMjRIX01BWCA9IDB4MDAwMiwgICAgICAvKiBXaGV0aGVyIHRoZSB0aW1lY29kZSB3cmFwcyBhZnRlciAyNCBob3VycyAqLworICBUQ19ORUdBVElWRV9PSyA9IDB4MDAwNCwgIC8qIFdoZXRoZXIgbmVnYXRpdmUgdGltZSB2YWx1ZXMgYXJlIE9LICovCisgIFRDX0NPVU5URVIgPSAweDAwMDggICAgICAgLyogV2hldGhlciB0aGUgdGltZSB2YWx1ZSBjb3JyZXNwb25kcyB0byBhIHRhcGUgY291bnRlciB2YWx1ZSAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21UUkFLCit7CisgIEF0b20gaGVhZGVyOworCisgIEF0b21US0hEIHRraGQ7CisgIEF0b21JbmZvICp0YXB0OworICBBdG9tRURUUyAqZWR0czsKKyAgQXRvbU1ESUEgbWRpYTsKKyAgQXRvbVVEVEEgdWR0YTsKKyAgQXRvbVRSRUYgKnRyZWY7CisKKyAgLyogc29tZSBoZWxwZXIgaW5mbyBmb3Igc3RydWN0dXJhbCBjb25mb3JtaXR5IGNoZWNrcyAqLworICBnYm9vbGVhbiBpc192aWRlbzsKKyAgZ2Jvb2xlYW4gaXNfaDI2NDsKKworICBBdG9tc0NvbnRleHQgKmNvbnRleHQ7Cit9IEF0b21UUkFLOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVRSRVgKK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworCisgIGd1aW50MzIgdHJhY2tfSUQ7CisgIGd1aW50MzIgZGVmYXVsdF9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXg7CisgIGd1aW50MzIgZGVmYXVsdF9zYW1wbGVfZHVyYXRpb247CisgIGd1aW50MzIgZGVmYXVsdF9zYW1wbGVfc2l6ZTsKKyAgZ3VpbnQzMiBkZWZhdWx0X3NhbXBsZV9mbGFnczsKK30gQXRvbVRSRVg7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tTUVIRAoreworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgZ3VpbnQ2NCBmcmFnbWVudF9kdXJhdGlvbjsKK30gQXRvbU1FSEQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21NVkVYCit7CisgIEF0b20gaGVhZGVyOworCisgIEF0b21NRUhEIG1laGQ7CisKKyAgLyogbGlzdCBvZiBBdG9tVFJFWCAqLworICBHTGlzdCAqdHJleHM7Cit9IEF0b21NVkVYOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbU1GSEQKK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworCisgIGd1aW50MzIgc2VxdWVuY2VfbnVtYmVyOworfSBBdG9tTUZIRDsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21URkhECit7CisgIEF0b21GdWxsIGhlYWRlcjsKKworICBndWludDMyIHRyYWNrX0lEOworICBndWludDY0IGJhc2VfZGF0YV9vZmZzZXQ7CisgIGd1aW50MzIgc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4OworICBndWludDMyIGRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uOworICBndWludDMyIGRlZmF1bHRfc2FtcGxlX3NpemU7CisgIGd1aW50MzIgZGVmYXVsdF9zYW1wbGVfZmxhZ3M7Cit9IEF0b21URkhEOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVRGRFQKK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworCisgIGd1aW50NjQgYmFzZV9tZWRpYV9kZWNvZGVfdGltZTsKK30gQXRvbVRGRFQ7CisKK3R5cGVkZWYgc3RydWN0IF9UUlVOU2FtcGxlRW50cnkKK3sKKyAgZ3VpbnQzMiBzYW1wbGVfZHVyYXRpb247CisgIGd1aW50MzIgc2FtcGxlX3NpemU7CisgIGd1aW50MzIgc2FtcGxlX2ZsYWdzOworICBndWludDMyIHNhbXBsZV9jb21wb3NpdGlvbl90aW1lX29mZnNldDsKK30gVFJVTlNhbXBsZUVudHJ5OworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVRSVU4KK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworCisgIGd1aW50MzIgc2FtcGxlX2NvdW50OworICBnaW50MzIgZGF0YV9vZmZzZXQ7CisgIGd1aW50MzIgZmlyc3Rfc2FtcGxlX2ZsYWdzOworCisgIC8qIGFycmF5IG9mIGZpZWxkcyAqLworICBBVE9NX0FSUkFZIChUUlVOU2FtcGxlRW50cnkpIGVudHJpZXM7Cit9IEF0b21UUlVOOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVNEVFAKK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworCisgIC8qIG5vdCBzZXJpYWxpemVkICovCisgIGd1aW50MzIgc2FtcGxlX2NvdW50OworCisgIC8qIGFycmF5IG9mIGZpZWxkcyAqLworICBBVE9NX0FSUkFZIChndWludDgpIGVudHJpZXM7Cit9IEF0b21TRFRQOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVRSQUYKK3sKKyAgQXRvbSBoZWFkZXI7CisKKyAgQXRvbVRGSEQgdGZoZDsKKworICBBdG9tVEZEVCB0ZmR0OworCisgIC8qIGxpc3Qgb2YgQXRvbVRSVU4gKi8KKyAgR0xpc3QgKnRydW5zOworICAvKiBsaXN0IG9mIEF0b21TRFRQICovCisgIEdMaXN0ICpzZHRwczsKK30gQXRvbVRSQUY7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tTU9PRgoreworICBBdG9tIGhlYWRlcjsKKworICBBdG9tTUZIRCBtZmhkOworCisgIC8qIGxpc3Qgb2YgQXRvbVRSQUYgKi8KKyAgR0xpc3QgKnRyYWZzOworfSBBdG9tTU9PRjsKKworCit0eXBlZGVmIHN0cnVjdCBfQXRvbU1PT1YKK3sKKyAgLyogc3R5bGUgKi8KKyAgQXRvbXNDb250ZXh0IGNvbnRleHQ7CisKKyAgQXRvbSBoZWFkZXI7CisKKyAgQXRvbU1WSEQgbXZoZDsKKyAgQXRvbU1WRVggbXZleDsKKworICAvKiBsaXN0IG9mIEF0b21UUkFLICovCisgIEdMaXN0ICp0cmFrczsKKyAgQXRvbVVEVEEgdWR0YTsKKworICBnYm9vbGVhbiBmcmFnbWVudGVkOworICBndWludDMyIGNodW5rc19vZmZzZXQ7Cit9IEF0b21NT09WOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVdBVkUKK3sKKyAgQXRvbSBoZWFkZXI7CisKKyAgLyogbGlzdCBvZiBBdG9tSW5mbyAqLworICBHTGlzdCAqZXh0ZW5zaW9uX2F0b21zOworfSBBdG9tV0FWRTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RGUkFFbnRyeQoreworICBndWludDY0IHRpbWU7CisgIGd1aW50NjQgbW9vZl9vZmZzZXQ7CisgIGd1aW50MzIgdHJhZl9udW1iZXI7CisgIGd1aW50MzIgdHJ1bl9udW1iZXI7CisgIGd1aW50MzIgc2FtcGxlX251bWJlcjsKK30gVEZSQUVudHJ5OworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVRGUkEKK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworCisgIGd1aW50MzIgdHJhY2tfSUQ7CisgIGd1aW50MzIgbGVuZ3RoczsKKyAgLyogYXJyYXkgb2YgZW50cmllcyAqLworICBBVE9NX0FSUkFZIChURlJBRW50cnkpIGVudHJpZXM7Cit9IEF0b21URlJBOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbU1GUkEKK3sKKyAgQXRvbSBoZWFkZXI7CisKKyAgLyogbGlzdCBvZiB0ZnJhICovCisgIEdMaXN0ICp0ZnJhczsKK30gQXRvbU1GUkE7CisKKy8qCisgKiBGdW5jdGlvbiB0byBzZXJpYWxpemUgYW4gYXRvbQorICovCit0eXBlZGVmIGd1aW50NjQgKCpBdG9tQ29weURhdGFGdW5jKSAoQXRvbSAqYXRvbSwgZ3VpbnQ4ICoqYnVmZmVyLCBndWludDY0ICpzaXplLCBndWludDY0ICpvZmZzZXQpOworCisvKgorICogUmVsZWFzZXMgbWVtb3J5IGFsbG9jYXRlZCBieSBhbiBhdG9tCisgKi8KK3R5cGVkZWYgZ3VpbnQ2NCAoKkF0b21GcmVlRnVuYykgKEF0b20gKmF0b20pOworCisvKgorICogU29tZSBhdG9tcyBtaWdodCBoYXZlIG1hbnkgb3B0aW9uYWwgZGlmZmVyZW50IGtpbmRzIG9mIGNoaWxkIGF0b21zLCBzbyB0aGlzCisgKiBpcyB1c2VmdWwgZm9yIGVuYWJsaW5nIGdlbmVyaWMgaGFuZGxpbmcgb2YgYW55IGF0b20uCisgKiBBbGwgd2UgbmVlZCBhcmUgdGhlIHR3byBmdW5jdGlvbnMgKGNvcHlpbmcgaXQgdG8gYW4gYXJyYXkKKyAqIGZvciBzZXJpYWxpemF0aW9uIGFuZCB0aGUgbWVtb3J5IHJlbGVhc2luZyBmdW5jdGlvbikuCisgKi8KK3N0cnVjdCBfQXRvbUluZm8KK3sKKyAgQXRvbSAqYXRvbTsKKyAgQXRvbUNvcHlEYXRhRnVuYyBjb3B5X2RhdGFfZnVuYzsKKyAgQXRvbUZyZWVGdW5jIGZyZWVfZnVuYzsKK307CisKK2d1aW50NjQgICAgYXRvbXNfZ2V0X2N1cnJlbnRfcXRfdGltZSAgICh2b2lkKTsKKworZ3VpbnQ2NCAgICBhdG9tX2NvcHlfZGF0YSAgICAgICAgICAgICAgKEF0b20gKmF0b20sIGd1aW50OCAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDY0ICpzaXplLCBndWludDY0KiBvZmZzZXQpOworCitBdG9tRlRZUCogIGF0b21fZnR5cF9uZXcgICAgICAgICAgICAgICAoQXRvbXNDb250ZXh0ICpjb250ZXh0LCBndWludDMyIG1ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgdmVyc2lvbiwgR0xpc3QgKmJyYW5kcyk7CitndWludDY0ICAgIGF0b21fZnR5cF9jb3B5X2RhdGEgICAgICAgICAoQXRvbUZUWVAgKmZ0eXAsIGd1aW50OCAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDY0ICpzaXplLCBndWludDY0ICpvZmZzZXQpOwordm9pZCAgICAgICBhdG9tX2Z0eXBfZnJlZSAgICAgICAgICAgICAgKEF0b21GVFlQICpmdHlwKTsKKworQXRvbVRSQUsqICBhdG9tX3RyYWtfbmV3ICAgICAgICAgICAgICAgKEF0b21zQ29udGV4dCAqY29udGV4dCk7Cit2b2lkICAgICAgIGF0b21fdHJha19hZGRfc2FtcGxlcyAgICAgICAoQXRvbVRSQUsgKiB0cmFrLCBndWludDMyIG5zYW1wbGVzLCBndWludDMyIGRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgc2l6ZSwgZ3VpbnQ2NCBjaHVua19vZmZzZXQsIGdib29sZWFuIHN5bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDY0IHB0c19vZmZzZXQpOwordm9pZCAgICAgICBhdG9tX3RyYWtfc2V0X2Vsc3RfZW50cnkgICAgKEF0b21UUkFLICogdHJhaywgZ2ludCBpbmRleCwgZ3VpbnQzMiBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIG1lZGlhX3RpbWUsIGd1aW50MzIgcmF0ZSk7Cit2b2lkICAgICAgIGF0b21fdHJha19lZHRzX2NsZWFyICAgICAgICAoQXRvbVRSQUsgKiB0cmFrKTsKK2d1aW50MzIgICAgYXRvbV90cmFrX2dldF90aW1lc2NhbGUgICAgIChBdG9tVFJBSyAqdHJhayk7CitndWludDMyICAgIGF0b21fdHJha19nZXRfaWQgICAgICAgICAgICAoQXRvbVRSQUsgKiB0cmFrKTsKK3ZvaWQgICAgICAgYXRvbV90cmFrX3NldF9jb25zdGFudF9zaXplX3NhbXBsZXMgKEF0b21UUkFLICogdHJhaywgZ3VpbnQzMiBzYW1wbGVfc2l6ZSk7Cit2b2lkICAgICAgIGF0b21fc3RibF9hZGRfc2FtcGxlcyAgICAgICAoQXRvbVNUQkwgKiBzdGJsLCBndWludDMyIG5zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgZGVsdGEsIGd1aW50MzIgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDY0IGNodW5rX29mZnNldCwgZ2Jvb2xlYW4gc3luYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50NjQgcHRzX29mZnNldCk7Cit2b2lkICAgICAgIGF0b21fc3RzY19hZGRfbmV3X2VudHJ5ICAgICAoQXRvbVNUU0MgKiBzdHNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgZmlyc3RfY2h1bmssIGd1aW50MzIgbnNhbXBsZXMpOworCitBdG9tTU9PViogIGF0b21fbW9vdl9uZXcgICAgICAgICAgICAgICAoQXRvbXNDb250ZXh0ICpjb250ZXh0KTsKK3ZvaWQgICAgICAgYXRvbV9tb292X2ZyZWUgICAgICAgICAgICAgIChBdG9tTU9PViAqbW9vdik7CitndWludDY0ICAgIGF0b21fbW9vdl9jb3B5X2RhdGEgICAgICAgICAoQXRvbU1PT1YgKmF0b20sIGd1aW50OCAqKmJ1ZmZlciwgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCogb2Zmc2V0KTsKK3ZvaWQgICAgICAgYXRvbV9tb292X3VwZGF0ZV90aW1lc2NhbGUgIChBdG9tTU9PViAqbW9vdiwgZ3VpbnQzMiB0aW1lc2NhbGUpOwordm9pZCAgICAgICBhdG9tX21vb3ZfdXBkYXRlX2R1cmF0aW9uICAgKEF0b21NT09WICptb292KTsKK3ZvaWQgICAgICAgYXRvbV9tb292X3NldF9mcmFnbWVudGVkICAgIChBdG9tTU9PViAqbW9vdiwgZ2Jvb2xlYW4gZnJhZ21lbnRlZCk7Cit2b2lkICAgICAgIGF0b21fbW9vdl9jaHVua3Nfc2V0X29mZnNldCAoQXRvbU1PT1YgKm1vb3YsIGd1aW50MzIgb2Zmc2V0KTsKK3ZvaWQgICAgICAgYXRvbV9tb292X2FkZF90cmFrICAgICAgICAgIChBdG9tTU9PViAqbW9vdiwgQXRvbVRSQUsgKnRyYWspOworZ3VpbnQgICAgICBhdG9tX21vb3ZfZ2V0X3RyYWtfY291bnQgICAgKEF0b21NT09WICptb292KTsKKworZ3VpbnQgICAgICBhdG9tX2ZyYW1lcmF0ZV90b190aW1lc2NhbGUgKGdpbnQgZnBzX24sIGdpbnQgZnBzX2QpOworCitndWludDY0ICAgIGF0b21fbXZoZF9jb3B5X2RhdGEgICAgICAgICAoQXRvbU1WSEQgKiBhdG9tLCBndWludDggKiogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50NjQgKiBzaXplLCBndWludDY0ICogb2Zmc2V0KTsKK3ZvaWQgICAgICAgYXRvbV9zdGNvNjRfY2h1bmtzX3NldF9vZmZzZXQgKEF0b21TVENPNjQgKiBzdGNvNjQsIGd1aW50MzIgb2Zmc2V0KTsKK2d1aW50NjQgICAgYXRvbV90cmFrX2NvcHlfZGF0YSAgICAgICAgIChBdG9tVFJBSyAqIGF0b20sIGd1aW50OCAqKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCAqIHNpemUsIGd1aW50NjQgKiBvZmZzZXQpOwordm9pZCAgICAgICBhdG9tX3N0YmxfY2xlYXIgICAgICAgICAgICAgKEF0b21TVEJMICogc3RibCk7Cit2b2lkICAgICAgIGF0b21fc3RibF9pbml0ICAgICAgICAgICAgICAoQXRvbVNUQkwgKiBzdGJsKTsKK2d1aW50NjQgICAgYXRvbV9zdHNzX2NvcHlfZGF0YSAgICAgICAgIChBdG9tU1RTUyAqYXRvbSwgZ3VpbnQ4ICoqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50NjQgKnNpemUsIGd1aW50NjQqIG9mZnNldCk7CitndWludDY0ICAgIGF0b21fc3R0c19jb3B5X2RhdGEgICAgICAgICAoQXRvbVNUVFMgKmF0b20sIGd1aW50OCAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDY0ICpzaXplLCBndWludDY0KiBvZmZzZXQpOworZ3VpbnQ2NCAgICBhdG9tX3N0c2NfY29weV9kYXRhICAgICAgICAgKEF0b21TVFNDICphdG9tLCBndWludDggKipidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCogb2Zmc2V0KTsKK2d1aW50NjQgICAgYXRvbV9zdHN6X2NvcHlfZGF0YSAgICAgICAgIChBdG9tU1RTWiAqYXRvbSwgZ3VpbnQ4ICoqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50NjQgKnNpemUsIGd1aW50NjQqIG9mZnNldCk7CitndWludDY0ICAgIGF0b21fY3R0c19jb3B5X2RhdGEgICAgICAgICAoQXRvbUNUVFMgKmF0b20sIGd1aW50OCAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDY0ICpzaXplLCBndWludDY0KiBvZmZzZXQpOworZ3VpbnQ2NCAgICBhdG9tX3N2bWlfY29weV9kYXRhICAgICAgICAgKEF0b21TVk1JICphdG9tLCBndWludDggKipidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCogb2Zmc2V0KTsKK0F0b21TVk1JICogYXRvbV9zdm1pX25ldyAoZ3VpbnQ4IHN0ZXJlb3Njb3BpY19jb21wb3NpdGlvbl90eXBlLCBnYm9vbGVhbiBpc19sZWZ0X2ZpcnN0KTsKK2d1aW50NjQgICAgYXRvbV9zdGNvNjRfY29weV9kYXRhICAgICAgIChBdG9tU1RDTzY0ICphdG9tLCBndWludDggKipidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCogb2Zmc2V0KTsKK0F0b21NT09GKiAgYXRvbV9tb29mX25ldyAgICAgICAgICAgICAgIChBdG9tc0NvbnRleHQgKmNvbnRleHQsIGd1aW50MzIgc2VxdWVuY2VfbnVtYmVyKTsKK3ZvaWQgICAgICAgYXRvbV9tb29mX2ZyZWUgICAgICAgICAgICAgIChBdG9tTU9PRiAqbW9vZik7CitndWludDY0ICAgIGF0b21fbW9vZl9jb3B5X2RhdGEgICAgICAgICAoQXRvbU1PT0YgKm1vb2YsIGd1aW50OCAqKmJ1ZmZlciwgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCogb2Zmc2V0KTsKK0F0b21UUkFGICogYXRvbV90cmFmX25ldyAgICAgICAgICAgICAgIChBdG9tc0NvbnRleHQgKiBjb250ZXh0LCBndWludDMyIHRyYWNrX0lEKTsKK3ZvaWQgICAgICAgYXRvbV90cmFmX2ZyZWUgICAgICAgICAgICAgIChBdG9tVFJBRiAqIHRyYWYpOwordm9pZCAgICAgICBhdG9tX3RyYWZfc2V0X2Jhc2VfZGVjb2RlX3RpbWUgKEF0b21UUkFGICogdHJhZiwgZ3VpbnQ2NCBiYXNlX2RlY29kZV90aW1lKTsKK3ZvaWQgICAgICAgYXRvbV90cmFmX2FkZF9zYW1wbGVzICAgICAgIChBdG9tVFJBRiAqIHRyYWYsIGd1aW50MzIgZGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBzaXplLCBnYm9vbGVhbiBzeW5jLCBnaW50NjQgcHRzX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYm9vbGVhbiBzZHRwX3N5bmMpOworZ3VpbnQzMiAgICBhdG9tX3RyYWZfZ2V0X3NhbXBsZV9udW0gICAgKEF0b21UUkFGICogdHJhZik7Cit2b2lkICAgICAgIGF0b21fbW9vZl9hZGRfdHJhZiAgICAgICAgICAoQXRvbU1PT0YgKm1vb2YsIEF0b21UUkFGICp0cmFmKTsKKworQXRvbU1GUkEqICBhdG9tX21mcmFfbmV3ICAgICAgICAgICAgICAgKEF0b21zQ29udGV4dCAqY29udGV4dCk7Cit2b2lkICAgICAgIGF0b21fbWZyYV9mcmVlICAgICAgICAgICAgICAoQXRvbU1GUkEgKm1mcmEpOworQXRvbVRGUkEqICBhdG9tX3RmcmFfbmV3ICAgICAgICAgICAgICAgKEF0b21zQ29udGV4dCAqY29udGV4dCwgZ3VpbnQzMiB0cmFja19JRCk7Cit2b2lkICAgICAgIGF0b21fdGZyYV9hZGRfZW50cnkgICAgICAgICAoQXRvbVRGUkEgKnRmcmEsIGd1aW50NjQgZHRzLCBndWludDMyIHNhbXBsZV9udW0pOwordm9pZCAgICAgICBhdG9tX3RmcmFfdXBkYXRlX29mZnNldCAgICAgKEF0b21URlJBICogdGZyYSwgZ3VpbnQ2NCBvZmZzZXQpOwordm9pZCAgICAgICBhdG9tX21mcmFfYWRkX3RmcmEgICAgICAgICAgKEF0b21NRlJBICptZnJhLCBBdG9tVEZSQSAqdGZyYSk7CitndWludDY0ICAgIGF0b21fbWZyYV9jb3B5X2RhdGEgICAgICAgICAoQXRvbU1GUkEgKm1mcmEsIGd1aW50OCAqKmJ1ZmZlciwgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCogb2Zmc2V0KTsKKworCisvKiBtZWRpYSBzYW1wbGUgZGVzY3JpcHRpb24gcmVsYXRlZCBoZWxwZXJzICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGd1aW50MTYgdmVyc2lvbjsKKyAgZ3VpbnQzMiBmb3VyY2M7CisgIGd1aW50IHdpZHRoOworICBndWludCBoZWlnaHQ7CisgIGd1aW50IGRlcHRoOworICBndWludCBmcmFtZV9jb3VudDsKKyAgZ2ludCBjb2xvcl90YWJsZV9pZDsKKyAgZ3VpbnQgcGFyX247CisgIGd1aW50IHBhcl9kOworCisgIEdzdEJ1ZmZlciAqY29kZWNfZGF0YTsKK30gVmlzdWFsU2FtcGxlRW50cnk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGd1aW50MzIgZm91cmNjOworICBndWludCB2ZXJzaW9uOworICBnaW50IGNvbXByZXNzaW9uX2lkOworICBndWludCBzYW1wbGVfcmF0ZTsKKyAgZ3VpbnQgY2hhbm5lbHM7CisgIGd1aW50IHNhbXBsZV9zaXplOworICBndWludCBieXRlc19wZXJfcGFja2V0OworICBndWludCBzYW1wbGVzX3Blcl9wYWNrZXQ7CisgIGd1aW50IGJ5dGVzX3Blcl9zYW1wbGU7CisgIGd1aW50IGJ5dGVzX3Blcl9mcmFtZTsKKworICBHc3RCdWZmZXIgKmNvZGVjX2RhdGE7Cit9IEF1ZGlvU2FtcGxlRW50cnk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGd1aW50MzIgZm91cmNjOworCisgIGd1aW50OCAgZm9udF9mYWNlOyAvKiBib2xkPTB4MSwgaXRhbGljPTB4MiwgdW5kZXJsaW5lPTB4NCAqLworICBndWludDggIGZvbnRfc2l6ZTsKKyAgZ3VpbnQzMiBmb3JlZ3JvdW5kX2NvbG9yX3JnYmE7Cit9IFN1YnRpdGxlU2FtcGxlRW50cnk7CisKK3ZvaWQgc3VidGl0bGVfc2FtcGxlX2VudHJ5X2luaXQgKFN1YnRpdGxlU2FtcGxlRW50cnkgKiBlbnRyeSk7CisKK1NhbXBsZVRhYmxlRW50cnlNUDRBICogYXRvbV90cmFrX3NldF9hdWRpb190eXBlIChBdG9tVFJBSyAqIHRyYWssIEF0b21zQ29udGV4dCAqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TYW1wbGVFbnRyeSAqIGVudHJ5LCBndWludDMyIHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21JbmZvICogZXh0LCBnaW50IHNhbXBsZV9zaXplKTsKKworU2FtcGxlVGFibGVFbnRyeU1QNFYgKiBhdG9tX3RyYWtfc2V0X3ZpZGVvX3R5cGUgKEF0b21UUkFLICogdHJhaywgQXRvbXNDb250ZXh0ICogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXN1YWxTYW1wbGVFbnRyeSAqIGVudHJ5LCBndWludDMyIHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpc3QgKiBleHRfYXRvbXNfbGlzdCk7CisKK1NhbXBsZVRhYmxlRW50cnlUWDNHICogYXRvbV90cmFrX3NldF9zdWJ0aXRsZV90eXBlIChBdG9tVFJBSyAqIHRyYWssIEF0b21zQ29udGV4dCAqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VidGl0bGVTYW1wbGVFbnRyeSAqIGVudHJ5KTsKKworU2FtcGxlVGFibGVFbnRyeVRNQ0QgKgorYXRvbV90cmFrX3NldF90aW1lY29kZV90eXBlIChBdG9tVFJBSyAqIHRyYWssIEF0b21zQ29udGV4dCAqIGNvbnRleHQsIGd1aW50IHRyYWtfdGltZXNjYWxlLCBHc3RWaWRlb1RpbWVDb2RlICogdGMpOworCit2b2lkIGF0b21fdHJha191cGRhdGVfYml0cmF0ZXMgKEF0b21UUkFLICogdHJhaywgZ3VpbnQzMiBhdmdfYml0cmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBtYXhfYml0cmF0ZSk7CisKK3ZvaWQgYXRvbV90cmFrX3R4M2dfdXBkYXRlX2RpbWVuc2lvbiAoQXRvbVRSQUsgKiB0cmFrLCBndWludDMyIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGhlaWdodCk7CisKK3ZvaWQgc2FtcGxlX3RhYmxlX2VudHJ5X2FkZF9leHRfYXRvbSAoU2FtcGxlVGFibGVFbnRyeSAqIHN0ZSwgQXRvbUluZm8gKiBleHQpOworCitBdG9tSW5mbyAqICAgYnVpbGRfY29kZWNfZGF0YV9leHRlbnNpb24gIChndWludDMyIGZvdXJjYywgY29uc3QgR3N0QnVmZmVyICogY29kZWNfZGF0YSk7CitBdG9tSW5mbyAqICAgYnVpbGRfbW92X2FhY19leHRlbnNpb24gICAgIChBdG9tVFJBSyAqIHRyYWssIGNvbnN0IEdzdEJ1ZmZlciAqIGNvZGVjX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGF2Z19iaXRyYXRlLCBndWludDMyIG1heF9iaXRyYXRlKTsKK0F0b21JbmZvICogICBidWlsZF9tb3ZfYWxhY19leHRlbnNpb24gICAgKGNvbnN0IEdzdEJ1ZmZlciAqIGNvZGVjX2RhdGEpOworQXRvbUluZm8gKiAgIGJ1aWxkX2VzZHNfZXh0ZW5zaW9uICAgICAgICAoQXRvbVRSQUsgKiB0cmFrLCBndWludDggb2JqZWN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDggc3RyZWFtX3R5cGUsIGNvbnN0IEdzdEJ1ZmZlciAqIGNvZGVjX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGF2Z19iaXRyYXRlLCBndWludDMyIG1heF9iaXRyYXRlKTsKK0F0b21JbmZvICogICBidWlsZF9idHJ0X2V4dGVuc2lvbiAgICAgICAgKGd1aW50MzIgYnVmZmVyX3NpemVfZGIsIGd1aW50MzIgYXZnX2JpdHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIG1heF9iaXRyYXRlKTsKK0F0b21JbmZvICogICBidWlsZF9qcDJoX2V4dGVuc2lvbiAgICAgICAgKGdpbnQgd2lkdGgsIGdpbnQgaGVpZ2h0LCBjb25zdCBnY2hhciAqY29sb3JzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgbmNvbXAsIGNvbnN0IEdWYWx1ZSAqIGNtYXBfYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKiBjZGVmX2FycmF5KTsKKworQXRvbUluZm8gKiAgIGJ1aWxkX2pwMnhfZXh0ZW5zaW9uICAgICAgICAoY29uc3QgR3N0QnVmZmVyICogcHJlZml4KTsKK0F0b21JbmZvICogICBidWlsZF9maWVsX2V4dGVuc2lvbiAgICAgICAgKEdzdFZpZGVvSW50ZXJsYWNlTW9kZSBtb2RlLCBHc3RWaWRlb0ZpZWxkT3JkZXIgb3JkZXIpOworQXRvbUluZm8gKiAgIGJ1aWxkX2NvbHJfZXh0ZW5zaW9uICAgICAgICAoY29uc3QgR3N0VmlkZW9Db2xvcmltZXRyeSAqY29sb3JpbWV0cnksIGdib29sZWFuIGlzX21wNCk7CitBdG9tSW5mbyAqICAgYnVpbGRfY2xhcF9leHRlbnNpb24gICAgICAgIChnaW50IHdpZHRoX24sIGdpbnQgd2lkdGhfZCwgZ2ludCBoZWlnaHRfbiwgZ2ludCBoZWlnaHRfZCwgZ2ludCBoX29mZl9uLCBnaW50IGhfb2ZmX2QsIGdpbnQgdl9vZmZfbiwgZ2ludCB2X29mZl9kKTsKK0F0b21JbmZvICogICBidWlsZF90YXB0X2V4dGVuc2lvbiAgICAgICAgKGdpbnQgY2xlZl93aWR0aCwgZ2ludCBjbGVmX2hlaWdodCwgZ2ludCBwcm9mX3dpZHRoLCBnaW50IHByb2ZfaGVpZ2h0LCBnaW50IGVub2Zfd2lkdGgsIGdpbnQgZW5vZl9oZWlnaHQpOworCisKK0F0b21JbmZvICogICBidWlsZF9hYzNfZXh0ZW5zaW9uICAgICAgICAgKGd1aW50OCBmc2NvZCwgZ3VpbnQ4IGJzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDggYnNtb2QsIGd1aW50OCBhY21vZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50OCBsZmVfb24sIGd1aW50OCBiaXRyYXRlX2NvZGUpOworQXRvbUluZm8gKiAgIGJ1aWxkX29wdXNfZXh0ZW5zaW9uICAgICAgICAoZ3VpbnQzMiByYXRlLCBndWludDggY2hhbm5lbHMsIGd1aW50OCBtYXBwaW5nX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50OCBzdHJlYW1fY291bnQsIGd1aW50OCBjb3VwbGVkX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ4IGNoYW5uZWxfbWFwcGluZ1syNTZdLCBndWludDE2IHByZV9za2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQxNiBvdXRwdXRfZ2Fpbik7CisKK0F0b21JbmZvICogICBidWlsZF9hbXJfZXh0ZW5zaW9uICAgICAgICAgKHZvaWQpOworQXRvbUluZm8gKiAgIGJ1aWxkX2gyNjNfZXh0ZW5zaW9uICAgICAgICAodm9pZCk7CitBdG9tSW5mbyAqICAgYnVpbGRfZ2FtYV9hdG9tICAgICAgICAgICAgIChnZG91YmxlIGdhbW1hKTsKK0F0b21JbmZvICogICBidWlsZF9TTUlfYXRvbSAgICAgICAgICAgICAgKGNvbnN0IEdzdEJ1ZmZlciAqc2VxaCk7CitBdG9tSW5mbyAqICAgYnVpbGRfaW1hX2FkcGNtX2V4dGVuc2lvbiAgIChnaW50IGNoYW5uZWxzLCBnaW50IHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50IGJsb2Nrc2l6ZSk7CitBdG9tSW5mbyAqICAgYnVpbGRfdXVpZF94bXBfYXRvbSAgICAgICAgIChHc3RCdWZmZXIgKiB4bXApOworCisKKy8qCisgKiBNZXRhIHRhZ3MgZnVuY3Rpb25zCisgKi8KK3ZvaWQgYXRvbV91ZHRhX2NsZWFyX3RhZ3MgKEF0b21VRFRBICp1ZHRhKTsKK3ZvaWQgYXRvbV91ZHRhX2FkZF9zdHJfdGFnICAgIChBdG9tVURUQSAqdWR0YSwgZ3VpbnQzMiBmb3VyY2MsIGNvbnN0IGdjaGFyICp2YWx1ZSk7Cit2b2lkIGF0b21fdWR0YV9hZGRfdWludF90YWcgICAoQXRvbVVEVEEgKnVkdGEsIGd1aW50MzIgZm91cmNjLCBndWludDMyIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgdmFsdWUpOwordm9pZCBhdG9tX3VkdGFfYWRkX3RhZyAgICAgICAgKEF0b21VRFRBICp1ZHRhLCBndWludDMyIGZvdXJjYywgZ3VpbnQzMiBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDggKiBkYXRhLCBndWludCBzaXplKTsKK3ZvaWQgYXRvbV91ZHRhX2FkZF9ibG9iX3RhZyAgIChBdG9tVURUQSAqdWR0YSwgZ3VpbnQ4ICpkYXRhLCBndWludCBzaXplKTsKKwordm9pZCBhdG9tX3VkdGFfYWRkXzNncF9zdHJfdGFnICAgICAgIChBdG9tVURUQSAqdWR0YSwgZ3VpbnQzMiBmb3VyY2MsIGNvbnN0IGdjaGFyICogdmFsdWUpOwordm9pZCBhdG9tX3VkdGFfYWRkXzNncF91aW50X3RhZyAgICAgIChBdG9tVURUQSAqdWR0YSwgZ3VpbnQzMiBmb3VyY2MsIGd1aW50MTYgdmFsdWUpOwordm9pZCBhdG9tX3VkdGFfYWRkXzNncF9zdHJfaW50X3RhZyAgIChBdG9tVURUQSAqdWR0YSwgZ3VpbnQzMiBmb3VyY2MsIGNvbnN0IGdjaGFyICogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQxNiBpdmFsdWUpOwordm9pZCBhdG9tX3VkdGFfYWRkXzNncF90YWcgICAgICAgICAgIChBdG9tVURUQSAqdWR0YSwgZ3VpbnQzMiBmb3VyY2MsIGd1aW50OCAqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50IHNpemUpOworCit2b2lkIGF0b21fdWR0YV9hZGRfeG1wX3RhZ3MgICAgICAgICAgKEF0b21VRFRBICp1ZHRhLCBHc3RCdWZmZXIgKiB4bXApOworCitBdG9tVFJFRiAqIGF0b21fdHJlZl9uZXcgKGd1aW50MzIgcmVmdHlwZSk7Cit2b2lkIGF0b21fdHJlZl9hZGRfZW50cnkgKEF0b21UUkVGICogdHJlZiwgZ3VpbnQzMiBzYW1wbGUpOworCisjZGVmaW5lIEdTVF9RVF9NVVhfREVGQVVMVF9UQUdfTEFOR1VBR0UgICAidW5kIiAvKiB1bmRlZmluZWQvdW5rbm93biAqLworZ3VpbnQxNiAgbGFuZ3VhZ2VfY29kZSAgICAgICAgICAgICAgIChjb25zdCBjaGFyICogbGFuZyk7CisKKyNlbmRpZiAvKiBfX0FUT01TX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9hdG9tc3JlY292ZXJ5LmMgYi9nc3QvaXNvbXA0L2F0b21zcmVjb3ZlcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGM0NDM0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9hdG9tc3JlY292ZXJ5LmMKQEAgLTAsMCArMSwxMjA2IEBACisvKiBRdWlja3RpbWUgbXV4ZXIgcGx1Z2luIGZvciBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIG1vZHVsZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIHNlcmlhbGl6aW5nIHBhcnRpYWwgaW5mb3JtYXRpb24gZnJvbQorICogYSBtdXggaW4gcHJvZ3Jlc3MgKGJ5IHF0bXV4IGVsZW1lbnRzKS4gVGhpcyBlbmFibGVzIHJlY29uc3RydWN0aW9uIG9mIHRoZQorICogbW9vdiBib3ggaWYgYSBjcmFzaCBoYXBwZW5zIGFuZCB0aHVzIHJlY292ZXJpbmcgdGhlIG1vdmllIGZpbGUuCisgKgorICogVXNhZ2U6CisgKiAxKSBwaXBlbGluZTogLi4ueW91cmVsZW1lbnRzICEgcXRtdXggbW9vdi1yZWNvdmVyeS1maWxlPXBhdGgubXJmICEgXAorICogZmlsZXNpbmsgbG9jYXRpb249bW9vdmllLm1vdgorICoKKyAqIDIpIENSQVNIIQorICoKKyAqIDMpIGdzdC1sYXVuY2gtMS4wIHF0bW9vdnJlY292ZXIgcmVjb3ZlcnktaW5wdXQ9cGF0aC5tcmYgYnJva2VuLWlucHV0PW1vb3ZpZS5tb3YgXAorICAgICAgICBmaXhlZC1vdXRwdXQ9cmVjb3ZlcmVkLm1vdgorICoKKyAqIDQpIChIb3BlZnVsbHkpIGVuam95IHJlY292ZXJlZC5tb3YuCisgKgorICogLS0tIFJlY292ZXJ5IGZpbGUgbGF5b3V0IC0tLQorICogMSkgVmVyc2lvbiAoYSBndWludDE2KQorICogMikgUHJlZml4IGF0b20gKGlmIHByZXNlbnQpCisgKiAzKSBmdHlwIGF0b20KKyAqIDQpIE1WSEQgYXRvbSAod2l0aG91dCB0aW1lc2NhbGUvZHVyYXRpb24gc2V0KQorICogNSkgbW9vdmllIHRpbWVzY2FsZQorICogNikgbnVtYmVyIG9mIHRyYWtzCisgKiA3KSBsaXN0IG9mIHRyYWsgYXRvbXMgKHN0YmwgZGF0YSBpcyBpZ25vcmVkLCBleGNlcHQgZm9yIHRoZSBzdHNkIGF0b20pCisgKiA4KSBCdWZmZXJzIG1ldGFkYXRhIChtZXRhZGF0YSB0aGF0IGlzIHJlbGV2YW50IHRvIHRoZSBjb250YWluZXIpCisgKiAgICBCdWZmZXJzIG1ldGFkYXRhIGFyZSBzdG9yZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGFkZGVkIHRvIHRoZSBtZGF0LAorICogICAgZWFjaCBlbnRyZSBoYXMgYSBmaXhlZCBzaXplIGFuZCBpcyBzdG9yZWQgaW4gQkUuIGJvb2xlYW5zIGFyZSBzdG9yZWQKKyAqICAgIGFzIGEgc2luZ2xlIGJ5dGUgd2hlcmUgMCBtZWFucyBmYWxzZSwgb3RoZXJ3aXNlIGlzIHRydWUuCisgKiAgIE1ldGFkYXRhOgorICogICAtIGd1aW50MzIgICB0cmFja19pZDsKKyAqICAgLSBndWludDMyICAgbnNhbXBsZXM7CisgKiAgIC0gZ3VpbnQzMiAgIGRlbHRhOworICogICAtIGd1aW50MzIgICBzaXplOworICogICAtIGd1aW50NjQgICBjaHVua19vZmZzZXQ7CisgKiAgIC0gZ2Jvb2xlYW4gIHN5bmM7CisgKiAgIC0gZ2Jvb2xlYW4gIGRvX3B0czsKKyAqICAgLSBndWludDY0ICAgcHRzX29mZnNldDsgKGFsd2F5cyBwcmVzZW50LCBpZ25vcmVkIGlmIGRvX3B0cyBpcyBmYWxzZSkKKyAqCisgKiBUaGUgbWRhdCBmaWxlIG1pZ2h0IGNvbnRhaW4gZnR5cCBhbmQgdGhlbiBtZGF0LCBpbiBjYXNlIHRoaXMgaXMgdGhlIGZhc3RzdGFydAorICogdGVtcG9yYXJ5IGZpbGUgdGhlcmUgaXMgbm8gZnR5cCBhbmQgbm8gbWRhdCBoZWFkZXIsIG9ubHkgdGhlIGJ1ZmZlcnMgZGF0YS4KKyAqCisgKiBOb3RlcyBhYm91dCByZWNvdmVyeSBmaWxlIGxheW91dDogV2Ugc3RpbGwgZG9uJ3Qgc3RvcmUgdGFncyBub3IgRURUUyBkYXRhLgorICoKKyAqIElNUE9SVEFOVDogdGhpcyBpcyBzdGlsbCBhdCBhIGV4cGVyaW1lbnRhbCBzdGF0ZS4KKyAqLworCisjaW5jbHVkZSAiYXRvbXNyZWNvdmVyeS5oIgorCisjZGVmaW5lIE1BWF9DSFVOS19TSVpFICgxMDI0ICogMTAyNCkgICAgLyogMU1CICovCisKKyNkZWZpbmUgQVRPTVNfUkVDT1ZfT1VUUFVUX1dSSVRFX0VSUk9SKGVycikgXAorICAgIGdfc2V0X2Vycm9yIChlcnIsIEFUT01TX1JFQ09WX1FVQVJLLCBBVE9NU19SRUNPVl9FUlJfRklMRSwgXAorICAgICAgICAiRmFpbGVkIHRvIHdyaXRlIHRvIG91dHB1dCBmaWxlOiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSkKKworc3RhdGljIGdib29sZWFuCithdG9tc19yZWNvdl93cml0ZV92ZXJzaW9uIChGSUxFICogZikKK3sKKyAgZ3VpbnQ4IGRhdGFbMl07CisgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEsIEFUT01TX1JFQ09WX0ZJTEVfVkVSU0lPTik7CisgIHJldHVybiBmd3JpdGUgKGRhdGEsIDIsIDEsIGYpID09IDE7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorYXRvbXNfcmVjb3Zfd3JpdGVfZnR5cF9pbmZvIChGSUxFICogZiwgQXRvbUZUWVAgKiBmdHlwLCBHc3RCdWZmZXIgKiBwcmVmaXgpCit7CisgIGd1aW50OCAqZGF0YSA9IE5VTEw7CisgIGd1aW50NjQgb2Zmc2V0ID0gMDsKKyAgZ3VpbnQ2NCBzaXplID0gMDsKKworICBpZiAocHJlZml4KSB7CisgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICBpZiAoIWdzdF9idWZmZXJfbWFwIChwcmVmaXgsICZtYXAsIEdTVF9NQVBfUkVBRCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKGZ3cml0ZSAobWFwLmRhdGEsIDEsIG1hcC5zaXplLCBmKSAhPSBtYXAuc2l6ZSkgeworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAocHJlZml4LCAmbWFwKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAocHJlZml4LCAmbWFwKTsKKyAgfQorICBpZiAoIWF0b21fZnR5cF9jb3B5X2RhdGEgKGZ0eXAsICZkYXRhLCAmc2l6ZSwgJm9mZnNldCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKGZ3cml0ZSAoZGF0YSwgMSwgb2Zmc2V0LCBmKSAhPSBvZmZzZXQpIHsKKyAgICBnX2ZyZWUgKGRhdGEpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBnX2ZyZWUgKGRhdGEpOworICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIFdyaXRlcyBpbXBvcnRhbnQgaW5mbyBvbiB0aGUgJ21vb3YnIGF0b20gKG5vbi10cmFrIHJlbGF0ZWQpCisgKiB0byBiZSBhYmxlIHRvIHJlY292ZXIgdGhlIG1vb3Ygc3RydWN0dXJlIGFmdGVyIGEgY3Jhc2guCisgKgorICogQ3VycmVudGx5LCBpdCB3cml0ZXMgdGhlIE1WSEQgYXRvbS4KKyAqLworc3RhdGljIGdib29sZWFuCithdG9tc19yZWNvdl93cml0ZV9tb292X2luZm8gKEZJTEUgKiBmLCBBdG9tTU9PViAqIG1vb3YpCit7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQ2NCBzaXplOworICBndWludDY0IG9mZnNldCA9IDA7CisgIGd1aW50NjQgYXRvbV9zaXplID0gMDsKKyAgZ2ludCB3cml0ZW4gPSAwOworCisgIC8qIGxpa2VseSBlbm91Z2ggKi8KKyAgc2l6ZSA9IDI1NjsKKyAgZGF0YSA9IGdfbWFsbG9jIChzaXplKTsKKyAgYXRvbV9zaXplID0gYXRvbV9tdmhkX2NvcHlfZGF0YSAoJm1vb3YtPm12aGQsICZkYXRhLCAmc2l6ZSwgJm9mZnNldCk7CisgIGlmIChhdG9tX3NpemUgPiAwKQorICAgIHdyaXRlbiA9IGZ3cml0ZSAoZGF0YSwgMSwgYXRvbV9zaXplLCBmKTsKKyAgZ19mcmVlIChkYXRhKTsKKyAgcmV0dXJuIGF0b21fc2l6ZSA+IDAgJiYgd3JpdGVuID09IGF0b21fc2l6ZTsKK30KKworLyoKKyAqIFdyaXRlcyB0aGUgbnVtYmVyIG9mIHRyYWtzIHRvIHRoZSBmaWxlLgorICogVGhpcyBzaW1wbHkgd3JpdGVzIGEgZ3VpbnQzMiBpbiBCRS4KKyAqLworc3RhdGljIGdib29sZWFuCithdG9tc19yZWNvdl93cml0ZV90cmFrc19udW1iZXIgKEZJTEUgKiBmLCBndWludDMyIHRyYWtzKQoreworICBndWludDggZGF0YVs0XTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSwgdHJha3MpOworICByZXR1cm4gZndyaXRlIChkYXRhLCA0LCAxLCBmKSA9PSAxOworfQorCisvKgorICogV3JpdGVzIHRoZSBtb292J3MgdGltZXNjYWxlIHRvIHRoZSBmaWxlCisgKiBUaGlzIHNpbXBseSB3cml0ZXMgYSBndWludDMyIGluIEJFLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2F0b21zX3JlY292X3dyaXRlX21vb3ZfdGltZXNjYWxlIChGSUxFICogZiwgZ3VpbnQzMiB0aW1lc2NhbGUpCit7CisgIGd1aW50OCBkYXRhWzRdOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhLCB0aW1lc2NhbGUpOworICByZXR1cm4gZndyaXRlIChkYXRhLCA0LCAxLCBmKSA9PSAxOworfQorCisvKgorICogV3JpdGVzIHRoZSB0cmFrIGF0b20gdG8gdGhlIGZpbGUuCisgKi8KK2dib29sZWFuCithdG9tc19yZWNvdl93cml0ZV90cmFrX2luZm8gKEZJTEUgKiBmLCBBdG9tVFJBSyAqIHRyYWspCit7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQ2NCBzaXplOworICBndWludDY0IG9mZnNldCA9IDA7CisgIGd1aW50NjQgYXRvbV9zaXplID0gMDsKKyAgZ2ludCB3cml0ZW4gPSAwOworCisgIC8qIGJ1ZmZlciBpcyByZWFsbG9jZWQgdG8gYSBsYXJnZXIgc2l6ZSBpZiBuZWVkZWQgKi8KKyAgc2l6ZSA9IDQgKiAxMDI0OworICBkYXRhID0gZ19tYWxsb2MgKHNpemUpOworICBhdG9tX3NpemUgPSBhdG9tX3RyYWtfY29weV9kYXRhICh0cmFrLCAmZGF0YSwgJnNpemUsICZvZmZzZXQpOworICBpZiAoYXRvbV9zaXplID4gMCkKKyAgICB3cml0ZW4gPSBmd3JpdGUgKGRhdGEsIGF0b21fc2l6ZSwgMSwgZik7CisgIGdfZnJlZSAoZGF0YSk7CisgIHJldHVybiBhdG9tX3NpemUgPiAwICYmIHdyaXRlbiA9PSBhdG9tX3NpemU7Cit9CisKK2dib29sZWFuCithdG9tc19yZWNvdl93cml0ZV90cmFrX3NhbXBsZXMgKEZJTEUgKiBmLCBBdG9tVFJBSyAqIHRyYWssIGd1aW50MzIgbnNhbXBsZXMsCisgICAgZ3VpbnQzMiBkZWx0YSwgZ3VpbnQzMiBzaXplLCBndWludDY0IGNodW5rX29mZnNldCwgZ2Jvb2xlYW4gc3luYywKKyAgICBnYm9vbGVhbiBkb19wdHMsIGdpbnQ2NCBwdHNfb2Zmc2V0KQoreworICBndWludDggZGF0YVtUUkFLX0JVRkZFUl9FTlRSWV9JTkZPX1NJWkVdOworICAvKgorICAgKiBXZSBoYXZlIHRvIHdyaXRlIGEgVHJha0J1ZmZlckVudHJ5SW5mbworICAgKi8KKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDAsIHRyYWstPnRraGQudHJhY2tfSUQpOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgNCwgbnNhbXBsZXMpOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgOCwgZGVsdGEpOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgMTIsIHNpemUpOworICBHU1RfV1JJVEVfVUlOVDY0X0JFIChkYXRhICsgMTYsIGNodW5rX29mZnNldCk7CisgIGlmIChzeW5jKQorICAgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDI0LCAxKTsKKyAgZWxzZQorICAgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDI0LCAwKTsKKyAgaWYgKGRvX3B0cykgeworICAgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDI1LCAxKTsKKyAgICBHU1RfV1JJVEVfVUlOVDY0X0JFIChkYXRhICsgMjYsIHB0c19vZmZzZXQpOworICB9IGVsc2UgeworICAgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDI1LCAwKTsKKyAgICBHU1RfV1JJVEVfVUlOVDY0X0JFIChkYXRhICsgMjYsIDApOworICB9CisKKyAgcmV0dXJuIGZ3cml0ZSAoZGF0YSwgMSwgVFJBS19CVUZGRVJfRU5UUllfSU5GT19TSVpFLCBmKSA9PQorICAgICAgVFJBS19CVUZGRVJfRU5UUllfSU5GT19TSVpFOworfQorCitnYm9vbGVhbgorYXRvbXNfcmVjb3Zfd3JpdGVfaGVhZGVycyAoRklMRSAqIGYsIEF0b21GVFlQICogZnR5cCwgR3N0QnVmZmVyICogcHJlZml4LAorICAgIEF0b21NT09WICogbW9vdiwgZ3VpbnQzMiB0aW1lc2NhbGUsIGd1aW50MzIgdHJha3NfbnVtYmVyKQoreworICBpZiAoIWF0b21zX3JlY292X3dyaXRlX3ZlcnNpb24gKGYpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKCFhdG9tc19yZWNvdl93cml0ZV9mdHlwX2luZm8gKGYsIGZ0eXAsIHByZWZpeCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoIWF0b21zX3JlY292X3dyaXRlX21vb3ZfaW5mbyAoZiwgbW9vdikpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoIWF0b21zX3JlY292X3dyaXRlX21vb3ZfdGltZXNjYWxlIChmLCB0aW1lc2NhbGUpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKCFhdG9tc19yZWNvdl93cml0ZV90cmFrc19udW1iZXIgKGYsIHRyYWtzX251bWJlcikpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCityZWFkX2F0b21faGVhZGVyIChGSUxFICogZiwgZ3VpbnQzMiAqIGZvdXJjYywgZ3VpbnQzMiAqIHNpemUpCit7CisgIGd1aW50OCBhdXhbOF07CisKKyAgaWYgKGZyZWFkIChhdXgsIDEsIDgsIGYpICE9IDgpCisgICAgcmV0dXJuIEZBTFNFOworICAqc2l6ZSA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoYXV4KTsKKyAgKmZvdXJjYyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoYXV4ICsgNCk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK21vb3ZfcmVjb3ZfZmlsZV9wYXJzZV9wcmVmaXggKE1vb3ZSZWNvdkZpbGUgKiBtb292cmYpCit7CisgIGd1aW50MzIgZm91cmNjOworICBndWludDMyIHNpemU7CisgIGd1aW50MzIgdG90YWxfc2l6ZSA9IDA7CisgIGlmIChmc2VlayAobW9vdnJmLT5maWxlLCAyLCBTRUVLX1NFVCkgIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghcmVhZF9hdG9tX2hlYWRlciAobW9vdnJmLT5maWxlLCAmZm91cmNjLCAmc2l6ZSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoZm91cmNjICE9IEZPVVJDQ19mdHlwKSB7CisgICAgLyogd2UgbWlnaHQgaGF2ZSBhIHByZWZpeCBoZXJlICovCisgICAgaWYgKGZzZWVrIChtb292cmYtPmZpbGUsIHNpemUgLSA4LCBTRUVLX0NVUikgIT0gMCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHRvdGFsX3NpemUgKz0gc2l6ZTsKKworICAgIC8qIG5vdyByZWFkIHRoZSBmdHlwICovCisgICAgaWYgKCFyZWFkX2F0b21faGVhZGVyIChtb292cmYtPmZpbGUsICZmb3VyY2MsICZzaXplKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIHRoaXMgaGFzIHRvIGJlIHRoZSBmdHlwICovCisgIGlmIChmb3VyY2MgIT0gRk9VUkNDX2Z0eXApCisgICAgcmV0dXJuIEZBTFNFOworICB0b3RhbF9zaXplICs9IHNpemU7CisgIG1vb3ZyZi0+cHJlZml4X3NpemUgPSB0b3RhbF9zaXplOworICByZXR1cm4gZnNlZWsgKG1vb3ZyZi0+ZmlsZSwgc2l6ZSAtIDgsIFNFRUtfQ1VSKSA9PSAwOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK21vb3ZfcmVjb3ZfZmlsZV9wYXJzZV9tdmhkIChNb292UmVjb3ZGaWxlICogbW9vdnJmKQoreworICBndWludDMyIGZvdXJjYzsKKyAgZ3VpbnQzMiBzaXplOworICBpZiAoIXJlYWRfYXRvbV9oZWFkZXIgKG1vb3ZyZi0+ZmlsZSwgJmZvdXJjYywgJnNpemUpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIC8qIGNoZWNrIGZvciBzYW5pdHkgKi8KKyAgaWYgKGZvdXJjYyAhPSBGT1VSQ0NfbXZoZCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbW9vdnJmLT5tdmhkX3NpemUgPSBzaXplOworICBtb292cmYtPm12aGRfcG9zID0gZnRlbGwgKG1vb3ZyZi0+ZmlsZSkgLSA4OworCisgIC8qIHNraXAgdGhlIHJlbWFpbmluZyBvZiB0aGUgbXZoZCBpbiB0aGUgZmlsZSAqLworICByZXR1cm4gZnNlZWsgKG1vb3ZyZi0+ZmlsZSwgc2l6ZSAtIDgsIFNFRUtfQ1VSKSA9PSAwOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK21kYXRfcmVjb3ZfZmlsZV9wYXJzZV9tZGF0X3N0YXJ0IChNZGF0UmVjb3ZGaWxlICogbWRhdHJmKQoreworICBndWludDMyIGZvdXJjYywgc2l6ZTsKKworICBpZiAoIXJlYWRfYXRvbV9oZWFkZXIgKG1kYXRyZi0+ZmlsZSwgJmZvdXJjYywgJnNpemUpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChzaXplID09IDEpIHsKKyAgICBtZGF0cmYtPm1kYXRfaGVhZGVyX3NpemUgPSAxNjsKKyAgICBtZGF0cmYtPm1kYXRfc2l6ZSA9IDE2OworICB9IGVsc2UgeworICAgIG1kYXRyZi0+bWRhdF9oZWFkZXJfc2l6ZSA9IDg7CisgICAgbWRhdHJmLT5tZGF0X3NpemUgPSA4OworICB9CisgIG1kYXRyZi0+bWRhdF9zdGFydCA9IGZ0ZWxsIChtZGF0cmYtPmZpbGUpIC0gODsKKworICByZXR1cm4gZm91cmNjID09IEZPVVJDQ19tZGF0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK21kYXRfcmVjb3ZfZmlsZV9maW5kX21kYXQgKEZJTEUgKiBmaWxlLCBHRXJyb3IgKiogZXJyKQoreworICBndWludDMyIGZvdXJjYyA9IDAsIHNpemUgPSAwOworICBnYm9vbGVhbiBmYWlsdXJlID0gRkFMU0U7CisgIHdoaWxlIChmb3VyY2MgIT0gRk9VUkNDX21kYXQgJiYgIWZhaWx1cmUpIHsKKyAgICBpZiAoIXJlYWRfYXRvbV9oZWFkZXIgKGZpbGUsICZmb3VyY2MsICZzaXplKSkgeworICAgICAgZ290byBwYXJzZV9lcnJvcjsKKyAgICB9CisgICAgc3dpdGNoIChmb3VyY2MpIHsKKyAgICAgICAgLyogc2tpcCB0aGVzZSBhdG9tcyAqLworICAgICAgY2FzZSBGT1VSQ0NfZnR5cDoKKyAgICAgIGNhc2UgRk9VUkNDX2ZyZWU6CisgICAgICBjYXNlIEZPVVJDQ191ZHRhOgorICAgICAgICBpZiAoZnNlZWsgKGZpbGUsIHNpemUgLSA4LCBTRUVLX0NVUikgIT0gMCkgeworICAgICAgICAgIGdvdG8gZmlsZV9zZWVrX2Vycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGT1VSQ0NfbWRhdDoKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfRVJST1IgKCJVbmV4cGVjdGVkIGF0b20gaW4gaGVhZGVycyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSk7CisgICAgICAgIGZhaWx1cmUgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoIWZhaWx1cmUpIHsKKyAgICAvKiBSZXZlcnNlIHRvIG1kYXQgc3RhcnQgKi8KKyAgICBpZiAoZnNlZWsgKGZpbGUsIC04LCBTRUVLX0NVUikgIT0gMCkKKyAgICAgIGdvdG8gZmlsZV9zZWVrX2Vycm9yOworICB9CisKKyAgcmV0dXJuICFmYWlsdXJlOworCitwYXJzZV9lcnJvcjoKKyAgZ19zZXRfZXJyb3IgKGVyciwgQVRPTVNfUkVDT1ZfUVVBUkssIEFUT01TX1JFQ09WX0VSUl9GSUxFLAorICAgICAgIkZhaWxlZCB0byBwYXJzZSBhdG9tIik7CisgIHJldHVybiBGQUxTRTsKKworZmlsZV9zZWVrX2Vycm9yOgorICBnX3NldF9lcnJvciAoZXJyLCBBVE9NU19SRUNPVl9RVUFSSywgQVRPTVNfUkVDT1ZfRVJSX0ZJTEUsCisgICAgICAiRmFpbGVkIHRvIHNlZWsgdG8gc3RhcnQgb2YgdGhlIGZpbGUiKTsKKyAgcmV0dXJuIEZBTFNFOworCit9CisKK01kYXRSZWNvdkZpbGUgKgorbWRhdF9yZWNvdl9maWxlX2NyZWF0ZSAoRklMRSAqIGZpbGUsIGdib29sZWFuIGRhdGFmaWxlLCBHRXJyb3IgKiogZXJyKQoreworICBNZGF0UmVjb3ZGaWxlICptcmYgPSBnX25ldzAgKE1kYXRSZWNvdkZpbGUsIDEpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChmaWxlICE9IE5VTEwsIE5VTEwpOworCisgIG1yZi0+ZmlsZSA9IGZpbGU7CisgIG1yZi0+cmF3ZmlsZSA9IGRhdGFmaWxlOworCisgIC8qIGdldCB0aGUgZmlsZS9kYXRhIGxlbmd0aCAqLworICBpZiAoZnNlZWsgKGZpbGUsIDAsIFNFRUtfRU5EKSAhPSAwKQorICAgIGdvdG8gZmlsZV9sZW5ndGhfZXJyb3I7CisgIC8qIHN0aWxsIG5lZWRzIHRvIGRlZHVjZSB0aGUgbWRhdCBoZWFkZXIgYW5kIGZ0eXAgc2l6ZSAqLworICBtcmYtPmRhdGFfc2l6ZSA9IGZ0ZWxsIChmaWxlKTsKKyAgaWYgKG1yZi0+ZGF0YV9zaXplID09IC0xTCkKKyAgICBnb3RvIGZpbGVfbGVuZ3RoX2Vycm9yOworCisgIGlmIChmc2VlayAoZmlsZSwgMCwgU0VFS19TRVQpICE9IDApCisgICAgZ290byBmaWxlX3NlZWtfZXJyb3I7CisKKyAgaWYgKGRhdGFmaWxlKSB7CisgICAgLyogdGhpcyBmaWxlIGNvbnRhaW5zIG5vIGF0b21zLCBvbmx5IHJhdyBkYXRhIHRvIGJlIHBsYWNlZCBvbiB0aGUgbWRhdAorICAgICAqIHRoaXMgaGFwcGVucyB3aGVuIGZhc3RzdGFydCBtb2RlIGlzIHVzZWQgKi8KKyAgICBtcmYtPm1kYXRfc3RhcnQgPSAwOworICAgIG1yZi0+bWRhdF9oZWFkZXJfc2l6ZSA9IDE2OworICAgIG1yZi0+bWRhdF9zaXplID0gMTY7CisgICAgcmV0dXJuIG1yZjsKKyAgfQorCisgIGlmICghbWRhdF9yZWNvdl9maWxlX2ZpbmRfbWRhdCAoZmlsZSwgZXJyKSkgeworICAgIGdvdG8gZmFpbDsKKyAgfQorCisgIC8qIHdlIGRvbid0IHBhcnNlIHRoaXMgaWYgd2UgaGF2ZSBhIHRtcGRhdGFmaWxlICovCisgIGlmICghbWRhdF9yZWNvdl9maWxlX3BhcnNlX21kYXRfc3RhcnQgKG1yZikpIHsKKyAgICBnX3NldF9lcnJvciAoZXJyLCBBVE9NU19SRUNPVl9RVUFSSywgQVRPTVNfUkVDT1ZfRVJSX1BBUlNJTkcsCisgICAgICAgICJFcnJvciB3aGlsZSBwYXJzaW5nIG1kYXQgYXRvbSIpOworICAgIGdvdG8gZmFpbDsKKyAgfQorCisgIHJldHVybiBtcmY7CisKK2ZpbGVfc2Vla19lcnJvcjoKKyAgZ19zZXRfZXJyb3IgKGVyciwgQVRPTVNfUkVDT1ZfUVVBUkssIEFUT01TX1JFQ09WX0VSUl9GSUxFLAorICAgICAgIkZhaWxlZCB0byBzZWVrIHRvIHN0YXJ0IG9mIHRoZSBmaWxlIik7CisgIGdvdG8gZmFpbDsKKworZmlsZV9sZW5ndGhfZXJyb3I6CisgIGdfc2V0X2Vycm9yIChlcnIsIEFUT01TX1JFQ09WX1FVQVJLLCBBVE9NU19SRUNPVl9FUlJfRklMRSwKKyAgICAgICJGYWlsZWQgdG8gZGV0ZXJtaW5lIGZpbGUgc2l6ZSIpOworICBnb3RvIGZhaWw7CisKK2ZhaWw6CisgIG1kYXRfcmVjb3ZfZmlsZV9mcmVlIChtcmYpOworICByZXR1cm4gTlVMTDsKK30KKwordm9pZAorbWRhdF9yZWNvdl9maWxlX2ZyZWUgKE1kYXRSZWNvdkZpbGUgKiBtcmYpCit7CisgIGZjbG9zZSAobXJmLT5maWxlKTsKKyAgZ19mcmVlIChtcmYpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK21vb3ZfcmVjb3ZfcGFyc2VfbnVtX3RyYWtzIChNb292UmVjb3ZGaWxlICogbW9vdnJmKQoreworICBndWludDggdHJha3NbNF07CisgIGlmIChmcmVhZCAodHJha3MsIDEsIDQsIG1vb3ZyZi0+ZmlsZSkgIT0gNCkKKyAgICByZXR1cm4gRkFMU0U7CisgIG1vb3ZyZi0+bnVtX3RyYWtzID0gR1NUX1JFQURfVUlOVDMyX0JFICh0cmFrcyk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK21vb3ZfcmVjb3ZfcGFyc2VfbW9vdl90aW1lc2NhbGUgKE1vb3ZSZWNvdkZpbGUgKiBtb292cmYpCit7CisgIGd1aW50OCB0c1s0XTsKKyAgaWYgKGZyZWFkICh0cywgMSwgNCwgbW9vdnJmLT5maWxlKSAhPSA0KQorICAgIHJldHVybiBGQUxTRTsKKyAgbW9vdnJmLT50aW1lc2NhbGUgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKHRzKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorc2tpcF9hdG9tIChNb292UmVjb3ZGaWxlICogbW9vdnJmLCBndWludDMyIGV4cGVjdGVkX2ZvdXJjYykKK3sKKyAgZ3VpbnQzMiBzaXplOworICBndWludDMyIGZvdXJjYzsKKworICBpZiAoIXJlYWRfYXRvbV9oZWFkZXIgKG1vb3ZyZi0+ZmlsZSwgJmZvdXJjYywgJnNpemUpKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKGZvdXJjYyAhPSBleHBlY3RlZF9mb3VyY2MpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiAoZnNlZWsgKG1vb3ZyZi0+ZmlsZSwgc2l6ZSAtIDgsIFNFRUtfQ1VSKSA9PSAwKTsKK30KKworc3RhdGljIGdib29sZWFuCittb292X3JlY292X3BhcnNlX3RraGQgKE1vb3ZSZWNvdkZpbGUgKiBtb292cmYsIFRyYWtSZWNvdkRhdGEgKiB0cmFrcmQpCit7CisgIGd1aW50MzIgc2l6ZTsKKyAgZ3VpbnQzMiBmb3VyY2M7CisgIGd1aW50OCBkYXRhWzRdOworCisgIC8qIG1ha2Ugc3VyZSB3ZSBhcmUgb24gYSB0a2hkIGF0b20gKi8KKyAgaWYgKCFyZWFkX2F0b21faGVhZGVyIChtb292cmYtPmZpbGUsICZmb3VyY2MsICZzaXplKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChmb3VyY2MgIT0gRk9VUkNDX3RraGQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHRyYWtyZC0+dGtoZF9maWxlX29mZnNldCA9IGZ0ZWxsIChtb292cmYtPmZpbGUpIC0gODsKKworICAvKiBtb3ZlIDggYnl0ZXMgZm9yd2FyZCB0byB0aGUgdHJha19pZCBwb3MgKi8KKyAgaWYgKGZzZWVrIChtb292cmYtPmZpbGUsIDEyLCBTRUVLX0NVUikgIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChmcmVhZCAoZGF0YSwgMSwgNCwgbW9vdnJmLT5maWxlKSAhPSA0KQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBhZHZhbmNlIHRoZSByZXN0IG9mIHRraGQgKi8KKyAgaWYgKGZzZWVrIChtb292cmYtPmZpbGUsIDY4LCBTRUVLX0NVUikgIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgdHJha3JkLT50cmFrX2lkID0gR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorbW9vdl9yZWNvdl9wYXJzZV9zdGJsIChNb292UmVjb3ZGaWxlICogbW9vdnJmLCBUcmFrUmVjb3ZEYXRhICogdHJha3JkKQoreworICBndWludDMyIHNpemU7CisgIGd1aW50MzIgZm91cmNjOworICBndWludDMyIGF1eHNpemU7CisKKyAgaWYgKCFyZWFkX2F0b21faGVhZGVyIChtb292cmYtPmZpbGUsICZmb3VyY2MsICZzaXplKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChmb3VyY2MgIT0gRk9VUkNDX3N0YmwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHRyYWtyZC0+c3RibF9maWxlX29mZnNldCA9IGZ0ZWxsIChtb292cmYtPmZpbGUpIC0gODsKKyAgdHJha3JkLT5zdGJsX3NpemUgPSBzaXplOworCisgIC8qIHNraXAgdGhlIHN0c2QgKi8KKyAgaWYgKCFyZWFkX2F0b21faGVhZGVyIChtb292cmYtPmZpbGUsICZmb3VyY2MsICZhdXhzaXplKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChmb3VyY2MgIT0gRk9VUkNDX3N0c2QpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoZnNlZWsgKG1vb3ZyZi0+ZmlsZSwgYXV4c2l6ZSAtIDgsIFNFRUtfQ1VSKSAhPSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICB0cmFrcmQtPnN0c2Rfc2l6ZSA9IGF1eHNpemU7CisgIHRyYWtyZC0+cG9zdF9zdHNkX29mZnNldCA9IGZ0ZWxsIChtb292cmYtPmZpbGUpOworCisgIC8qIGFzIHRoaXMgaXMgdGhlIGxhc3QgYXRvbSB3ZSBwYXJzZSwgd2UgZG9uJ3Qgc2tpcCBmb3J3YXJkICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorbW9vdl9yZWNvdl9wYXJzZV9taW5mIChNb292UmVjb3ZGaWxlICogbW9vdnJmLCBUcmFrUmVjb3ZEYXRhICogdHJha3JkKQoreworICBndWludDMyIHNpemU7CisgIGd1aW50MzIgZm91cmNjOworICBndWludDMyIGF1eHNpemU7CisKKyAgaWYgKCFyZWFkX2F0b21faGVhZGVyIChtb292cmYtPmZpbGUsICZmb3VyY2MsICZzaXplKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChmb3VyY2MgIT0gRk9VUkNDX21pbmYpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHRyYWtyZC0+bWluZl9maWxlX29mZnNldCA9IGZ0ZWxsIChtb292cmYtPmZpbGUpIC0gODsKKyAgdHJha3JkLT5taW5mX3NpemUgPSBzaXplOworCisgIC8qIHNraXAgZWl0aGVyIG9mIHZtaGQsIHNtaGQsIGhtaGQgdGhhdCBtaWdodCBmb2xsb3cgKi8KKyAgaWYgKCFyZWFkX2F0b21faGVhZGVyIChtb292cmYtPmZpbGUsICZmb3VyY2MsICZhdXhzaXplKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChmb3VyY2MgIT0gRk9VUkNDX3ZtaGQgJiYgZm91cmNjICE9IEZPVVJDQ19zbWhkICYmIGZvdXJjYyAhPSBGT1VSQ0NfaG1oZCAmJgorICAgICAgZm91cmNjICE9IEZPVVJDQ19nbWhkKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKGZzZWVrIChtb292cmYtPmZpbGUsIGF1eHNpemUgLSA4LCBTRUVLX0NVUikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIHNraXAgYSBwb3NzaWJsZSBoZGxyIGFuZCB0aGUgZm9sbG93aW5nIGRpbmYgKi8KKyAgaWYgKCFyZWFkX2F0b21faGVhZGVyIChtb292cmYtPmZpbGUsICZmb3VyY2MsICZhdXhzaXplKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChmb3VyY2MgPT0gRk9VUkNDX2hkbHIpIHsKKyAgICBpZiAoZnNlZWsgKG1vb3ZyZi0+ZmlsZSwgYXV4c2l6ZSAtIDgsIFNFRUtfQ1VSKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIXJlYWRfYXRvbV9oZWFkZXIgKG1vb3ZyZi0+ZmlsZSwgJmZvdXJjYywgJmF1eHNpemUpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChmb3VyY2MgIT0gRk9VUkNDX2RpbmYpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoZnNlZWsgKG1vb3ZyZi0+ZmlsZSwgYXV4c2l6ZSAtIDgsIFNFRUtfQ1VSKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogbm93IHdlIGFyZSByZWFkeSB0byByZWFkIHRoZSBzdGJsICovCisgIGlmICghbW9vdl9yZWNvdl9wYXJzZV9zdGJsIChtb292cmYsIHRyYWtyZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK21vb3ZfcmVjb3ZfcGFyc2VfbWRoZCAoTW9vdlJlY292RmlsZSAqIG1vb3ZyZiwgVHJha1JlY292RGF0YSAqIHRyYWtyZCkKK3sKKyAgZ3VpbnQzMiBzaXplOworICBndWludDMyIGZvdXJjYzsKKyAgZ3VpbnQ4IGRhdGFbNF07CisKKyAgLyogbWFrZSBzdXJlIHdlIGFyZSBvbiBhIHRraGQgYXRvbSAqLworICBpZiAoIXJlYWRfYXRvbV9oZWFkZXIgKG1vb3ZyZi0+ZmlsZSwgJmZvdXJjYywgJnNpemUpKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKGZvdXJjYyAhPSBGT1VSQ0NfbWRoZCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgdHJha3JkLT5tZGhkX2ZpbGVfb2Zmc2V0ID0gZnRlbGwgKG1vb3ZyZi0+ZmlsZSkgLSA4OworCisgIC8qIGdldCB0aGUgdGltZXNjYWxlICovCisgIGlmIChmc2VlayAobW9vdnJmLT5maWxlLCAxMiwgU0VFS19DVVIpICE9IDApCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoZnJlYWQgKGRhdGEsIDEsIDQsIG1vb3ZyZi0+ZmlsZSkgIT0gNCkKKyAgICByZXR1cm4gRkFMU0U7CisgIHRyYWtyZC0+dGltZXNjYWxlID0gR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhKTsKKyAgaWYgKGZzZWVrIChtb292cmYtPmZpbGUsIDgsIFNFRUtfQ1VSKSAhPSAwKQorICAgIHJldHVybiBGQUxTRTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorbW9vdl9yZWNvdl9wYXJzZV9tZGlhIChNb292UmVjb3ZGaWxlICogbW9vdnJmLCBUcmFrUmVjb3ZEYXRhICogdHJha3JkKQoreworICBndWludDMyIHNpemU7CisgIGd1aW50MzIgZm91cmNjOworCisgIC8qIG1ha2Ugc3VyZSB3ZSBhcmUgb24gYSB0a2hkIGF0b20gKi8KKyAgaWYgKCFyZWFkX2F0b21faGVhZGVyIChtb292cmYtPmZpbGUsICZmb3VyY2MsICZzaXplKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChmb3VyY2MgIT0gRk9VUkNDX21kaWEpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHRyYWtyZC0+bWRpYV9maWxlX29mZnNldCA9IGZ0ZWxsIChtb292cmYtPmZpbGUpIC0gODsKKyAgdHJha3JkLT5tZGlhX3NpemUgPSBzaXplOworCisgIGlmICghbW9vdl9yZWNvdl9wYXJzZV9tZGhkIChtb292cmYsIHRyYWtyZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghc2tpcF9hdG9tIChtb292cmYsIEZPVVJDQ19oZGxyKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghbW9vdl9yZWNvdl9wYXJzZV9taW5mIChtb292cmYsIHRyYWtyZCkpCisgICAgcmV0dXJuIEZBTFNFOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCittb292X3JlY292X3BhcnNlX3RyYWsgKE1vb3ZSZWNvdkZpbGUgKiBtb292cmYsIFRyYWtSZWNvdkRhdGEgKiB0cmFrcmQpCit7CisgIGd1aW50NjQgb2Zmc2V0OworICBndWludDMyIHNpemU7CisgIGd1aW50MzIgZm91cmNjOworCisgIG9mZnNldCA9IGZ0ZWxsIChtb292cmYtPmZpbGUpOworICBpZiAob2Zmc2V0ID09IC0xKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogbWFrZSBzdXJlIHdlIGFyZSBvbiBhIHRyYWsgYXRvbSAqLworICBpZiAoIXJlYWRfYXRvbV9oZWFkZXIgKG1vb3ZyZi0+ZmlsZSwgJmZvdXJjYywgJnNpemUpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChmb3VyY2MgIT0gRk9VUkNDX3RyYWspIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgdHJha3JkLT50cmFrX3NpemUgPSBzaXplOworCisgIC8qIG5vdyB3ZSBzaG91bGQgaGF2ZSBhIHRyYWsgaGVhZGVyICd0a2hkJyAqLworICBpZiAoIW1vb3ZfcmVjb3ZfcGFyc2VfdGtoZCAobW9vdnJmLCB0cmFrcmQpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBGSVhNRSBhZGQgZWR0cyBoYW5kbGluZyBoZXJlIGFuZCBpbiBxdG11eCwgYXMgdGhpcyBpcyBvbmx5IGRldGVjdGVkCisgICAqIGFmdGVyIGJ1ZmZlcnMgc3RhcnQgZmxvd2luZyAqLworCisgIGlmICghbW9vdl9yZWNvdl9wYXJzZV9tZGlhIChtb292cmYsIHRyYWtyZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChmc2VlayAobW9vdnJmLT5maWxlLAorICAgICAgICAgIChsb25nIGludCkgdHJha3JkLT5tZGlhX2ZpbGVfb2Zmc2V0ICsgdHJha3JkLT5tZGlhX3NpemUsCisgICAgICAgICAgU0VFS19TRVQpICE9IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIHRyYWtyZC0+ZXh0cmFfYXRvbXNfb2Zmc2V0ID0gZnRlbGwgKG1vb3ZyZi0+ZmlsZSk7CisgIHRyYWtyZC0+ZXh0cmFfYXRvbXNfc2l6ZSA9IHNpemUgLSAodHJha3JkLT5leHRyYV9hdG9tc19vZmZzZXQgLSBvZmZzZXQpOworCisgIHRyYWtyZC0+ZmlsZV9vZmZzZXQgPSBvZmZzZXQ7CisgIC8qIHBvc2l0aW9uIGFmdGVyIHRoZSB0cmFrICovCisgIHJldHVybiBmc2VlayAobW9vdnJmLT5maWxlLCAobG9uZyBpbnQpIG9mZnNldCArIHNpemUsIFNFRUtfU0VUKSA9PSAwOworfQorCitNb292UmVjb3ZGaWxlICoKK21vb3ZfcmVjb3ZfZmlsZV9jcmVhdGUgKEZJTEUgKiBmaWxlLCBHRXJyb3IgKiogZXJyKQoreworICBnaW50IGk7CisgIE1vb3ZSZWNvdkZpbGUgKm1vb3ZyZiA9IGdfbmV3MCAoTW9vdlJlY292RmlsZSwgMSk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGZpbGUgIT0gTlVMTCwgTlVMTCk7CisKKyAgbW9vdnJmLT5maWxlID0gZmlsZTsKKworICAvKiBsb29rIGZvciBmdHlwIGFuZCBwcmVmaXggYXQgdGhlIHN0YXJ0ICovCisgIGlmICghbW9vdl9yZWNvdl9maWxlX3BhcnNlX3ByZWZpeCAobW9vdnJmKSkgeworICAgIGdfc2V0X2Vycm9yIChlcnIsIEFUT01TX1JFQ09WX1FVQVJLLCBBVE9NU19SRUNPVl9FUlJfUEFSU0lORywKKyAgICAgICAgIkVycm9yIHdoaWxlIHBhcnNpbmcgcHJlZml4IGF0b21zIik7CisgICAgZ290byBmYWlsOworICB9CisKKyAgLyogcGFyc2UgdGhlIG12aGQgKi8KKyAgaWYgKCFtb292X3JlY292X2ZpbGVfcGFyc2VfbXZoZCAobW9vdnJmKSkgeworICAgIGdfc2V0X2Vycm9yIChlcnIsIEFUT01TX1JFQ09WX1FVQVJLLCBBVE9NU19SRUNPVl9FUlJfUEFSU0lORywKKyAgICAgICAgIkVycm9yIHdoaWxlIHBhcnNpbmcgbXZoZCBhdG9tIik7CisgICAgZ290byBmYWlsOworICB9CisKKyAgaWYgKCFtb292X3JlY292X3BhcnNlX21vb3ZfdGltZXNjYWxlIChtb292cmYpKSB7CisgICAgZ19zZXRfZXJyb3IgKGVyciwgQVRPTVNfUkVDT1ZfUVVBUkssIEFUT01TX1JFQ09WX0VSUl9QQVJTSU5HLAorICAgICAgICAiRXJyb3Igd2hpbGUgcGFyc2luZyB0aW1lc2NhbGUiKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KKyAgaWYgKCFtb292X3JlY292X3BhcnNlX251bV90cmFrcyAobW9vdnJmKSkgeworICAgIGdfc2V0X2Vycm9yIChlcnIsIEFUT01TX1JFQ09WX1FVQVJLLCBBVE9NU19SRUNPVl9FUlJfUEFSU0lORywKKyAgICAgICAgIkVycm9yIHdoaWxlIHBhcnNpbmcgcGFyc2luZyBudW1iZXIgb2YgdHJha3MiKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KKworICAvKiBzYW5pdHkgY2hlY2sgKi8KKyAgaWYgKG1vb3ZyZi0+bnVtX3RyYWtzID4gMTAyNCkgeworICAgIGdfc2V0X2Vycm9yIChlcnIsIEFUT01TX1JFQ09WX1FVQVJLLCBBVE9NU19SRUNPVl9FUlJfUEFSU0lORywKKyAgICAgICAgIlVuc3VwcG9ydGVkIG51bWJlciBvZiB0cmFrcyIpOworICAgIGdvdG8gZmFpbDsKKyAgfQorCisgIC8qIGluaXQgdGhlIHRyYWtzICovCisgIG1vb3ZyZi0+dHJha3NfcmQgPSBnX25ldzAgKFRyYWtSZWNvdkRhdGEsIG1vb3ZyZi0+bnVtX3RyYWtzKTsKKyAgZm9yIChpID0gMDsgaSA8IG1vb3ZyZi0+bnVtX3RyYWtzOyBpKyspIHsKKyAgICBhdG9tX3N0YmxfaW5pdCAoJihtb292cmYtPnRyYWtzX3JkW2ldLnN0YmwpKTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgbW9vdnJmLT5udW1fdHJha3M7IGkrKykgeworICAgIGlmICghbW9vdl9yZWNvdl9wYXJzZV90cmFrIChtb292cmYsICYobW9vdnJmLT50cmFrc19yZFtpXSkpKSB7CisgICAgICBnX3NldF9lcnJvciAoZXJyLCBBVE9NU19SRUNPVl9RVUFSSywgQVRPTVNfUkVDT1ZfRVJSX1BBUlNJTkcsCisgICAgICAgICAgIkVycm9yIHdoaWxlIHBhcnNpbmcgdHJhayBhdG9tIik7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorICB9CisKKyAgcmV0dXJuIG1vb3ZyZjsKKworZmFpbDoKKyAgbW9vdl9yZWNvdl9maWxlX2ZyZWUgKG1vb3ZyZik7CisgIHJldHVybiBOVUxMOworfQorCit2b2lkCittb292X3JlY292X2ZpbGVfZnJlZSAoTW9vdlJlY292RmlsZSAqIG1vb3ZyZikKK3sKKyAgZ2ludCBpOworICBmY2xvc2UgKG1vb3ZyZi0+ZmlsZSk7CisgIGlmIChtb292cmYtPnRyYWtzX3JkKSB7CisgICAgZm9yIChpID0gMDsgaSA8IG1vb3ZyZi0+bnVtX3RyYWtzOyBpKyspIHsKKyAgICAgIGF0b21fc3RibF9jbGVhciAoJihtb292cmYtPnRyYWtzX3JkW2ldLnN0YmwpKTsKKyAgICB9CisgICAgZ19mcmVlIChtb292cmYtPnRyYWtzX3JkKTsKKyAgfQorICBnX2ZyZWUgKG1vb3ZyZik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorbW9vdl9yZWNvdl9wYXJzZV9idWZmZXJfZW50cnkgKE1vb3ZSZWNvdkZpbGUgKiBtb292cmYsIFRyYWtCdWZmZXJFbnRyeUluZm8gKiBiKQoreworICBndWludDggZGF0YVtUUkFLX0JVRkZFUl9FTlRSWV9JTkZPX1NJWkVdOworICBnaW50IHJlYWQ7CisKKyAgcmVhZCA9IGZyZWFkIChkYXRhLCAxLCBUUkFLX0JVRkZFUl9FTlRSWV9JTkZPX1NJWkUsIG1vb3ZyZi0+ZmlsZSk7CisgIGlmIChyZWFkICE9IFRSQUtfQlVGRkVSX0VOVFJZX0lORk9fU0laRSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgYi0+dHJhY2tfaWQgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEpOworICBiLT5uc2FtcGxlcyA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoZGF0YSArIDQpOworICBiLT5kZWx0YSA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoZGF0YSArIDgpOworICBiLT5zaXplID0gR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhICsgMTIpOworICBiLT5jaHVua19vZmZzZXQgPSBHU1RfUkVBRF9VSU5UNjRfQkUgKGRhdGEgKyAxNik7CisgIGItPnN5bmMgPSBkYXRhWzI0XSAhPSAwOworICBiLT5kb19wdHMgPSBkYXRhWzI1XSAhPSAwOworICBiLT5wdHNfb2Zmc2V0ID0gR1NUX1JFQURfVUlOVDY0X0JFIChkYXRhICsgMjYpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCittZGF0X3JlY292X2FkZF9zYW1wbGUgKE1kYXRSZWNvdkZpbGUgKiBtZGF0cmYsIGd1aW50MzIgc2l6ZSkKK3sKKyAgLyogdGVzdCBpZiB0aGlzIGRhdGEgZXhpc3RzICovCisgIGlmIChtZGF0cmYtPm1kYXRfc2l6ZSAtIG1kYXRyZi0+bWRhdF9oZWFkZXJfc2l6ZSArIHNpemUgPiBtZGF0cmYtPmRhdGFfc2l6ZSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbWRhdHJmLT5tZGF0X3NpemUgKz0gc2l6ZTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBUcmFrUmVjb3ZEYXRhICoKK21vb3ZfcmVjb3ZfZ2V0X3RyYWsgKE1vb3ZSZWNvdkZpbGUgKiBtb292cmYsIGd1aW50MzIgaWQpCit7CisgIGdpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG1vb3ZyZi0+bnVtX3RyYWtzOyBpKyspIHsKKyAgICBpZiAobW9vdnJmLT50cmFrc19yZFtpXS50cmFrX2lkID09IGlkKQorICAgICAgcmV0dXJuICYobW9vdnJmLT50cmFrc19yZFtpXSk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCit0cmFrX3JlY292X2RhdGFfYWRkX3NhbXBsZSAoVHJha1JlY292RGF0YSAqIHRyYWssIFRyYWtCdWZmZXJFbnRyeUluZm8gKiBiKQoreworICB0cmFrLT5kdXJhdGlvbiArPSBiLT5uc2FtcGxlcyAqIGItPmRlbHRhOworICBhdG9tX3N0YmxfYWRkX3NhbXBsZXMgKCZ0cmFrLT5zdGJsLCBiLT5uc2FtcGxlcywgYi0+ZGVsdGEsIGItPnNpemUsCisgICAgICBiLT5jaHVua19vZmZzZXQsIGItPnN5bmMsIGItPnB0c19vZmZzZXQpOworfQorCisvKgorICogUGFyc2VzIHRoZSBidWZmZXIgZW50cmllcyBpbiB0aGUgTW9vdlJlY292RmlsZSBhbmQgbWF0Y2hlcyB0aGUgaW5wdXRzCisgKiB3aXRoIHRoZSBkYXRhIGluIHRoZSBNZGF0UmVjb3ZGaWxlLiBXaGVuZXZlciBhIGJ1ZmZlciBlbnRyeSBvZiB0aGF0CisgKiByZXByZXNlbnRzICd4JyBieXRlcyBvZiBkYXRhLCB0aGUgc2FtZSBhbW91bnQgb2YgZGF0YSBpcyAndmFsaWRhdGVkJyBpbgorICogdGhlIE1kYXRSZWNvdkZpbGUgYW5kIHdpbGwgYmUgaW5sdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIG1vb3ZpZSBmaWxlLgorICovCitnYm9vbGVhbgorbW9vdl9yZWNvdl9wYXJzZV9idWZmZXJzIChNb292UmVjb3ZGaWxlICogbW9vdnJmLCBNZGF0UmVjb3ZGaWxlICogbWRhdHJmLAorICAgIEdFcnJvciAqKiBlcnIpCit7CisgIFRyYWtCdWZmZXJFbnRyeUluZm8gZW50cnk7CisgIFRyYWtSZWNvdkRhdGEgKnRyYWs7CisKKyAgLyogd2UgYXNzdW1lIGJvdGggbW9vdnJmIGFuZCBtZGF0cmYgYXJlIGF0IHRoZSBzdGFydGluZyBwb2ludHMgb2YgdGhlaXIKKyAgICogZGF0YSByZWFkaW5nICovCisgIHdoaWxlIChtb292X3JlY292X3BhcnNlX2J1ZmZlcl9lbnRyeSAobW9vdnJmLCAmZW50cnkpKSB7CisgICAgLyogYmUgc3VyZSB3ZSBzdGlsbCBoYXZlIHRoaXMgZGF0YSBpbiBtZGF0ICovCisgICAgdHJhayA9IG1vb3ZfcmVjb3ZfZ2V0X3RyYWsgKG1vb3ZyZiwgZW50cnkudHJhY2tfaWQpOworICAgIGlmICh0cmFrID09IE5VTEwpIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnIsIEFUT01TX1JFQ09WX1FVQVJLLCBBVE9NU19SRUNPVl9FUlJfUEFSU0lORywKKyAgICAgICAgICAiSW52YWxpZCB0cmFrIGlkIGZvdW5kIGluIGJ1ZmZlciBlbnRyeSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAoIW1kYXRfcmVjb3ZfYWRkX3NhbXBsZSAobWRhdHJmLCBlbnRyeS5zaXplKSkKKyAgICAgIGJyZWFrOworICAgIHRyYWtfcmVjb3ZfZGF0YV9hZGRfc2FtcGxlICh0cmFrLCAmZW50cnkpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ3VpbnQzMgordHJha19yZWNvdl9kYXRhX2dldF90cmFrX2F0b21fc2l6ZSAoVHJha1JlY292RGF0YSAqIHRyYWspCit7CisgIEF0b21TVEJMICpzdGJsID0gJnRyYWstPnN0Ymw7CisgIGd1aW50NjQgb2Zmc2V0OworCisgIC8qIHdyaXRlIG91dCBvdXIgc3RibCBjaGlsZCBhdG9tcyAqLworICBvZmZzZXQgPSAwOworCisgIGlmICghYXRvbV9zdHRzX2NvcHlfZGF0YSAoJnN0YmwtPnN0dHMsIE5VTEwsIE5VTEwsICZvZmZzZXQpKSB7CisgICAgZ290byBmYWlsOworICB9CisgIGlmIChhdG9tX2FycmF5X2dldF9sZW4gKCZzdGJsLT5zdHNzLmVudHJpZXMpID4gMCkgeworICAgIGlmICghYXRvbV9zdHNzX2NvcHlfZGF0YSAoJnN0YmwtPnN0c3MsIE5VTEwsIE5VTEwsICZvZmZzZXQpKSB7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorICB9CisgIGlmICghYXRvbV9zdHNjX2NvcHlfZGF0YSAoJnN0YmwtPnN0c2MsIE5VTEwsIE5VTEwsICZvZmZzZXQpKSB7CisgICAgZ290byBmYWlsOworICB9CisgIGlmICghYXRvbV9zdHN6X2NvcHlfZGF0YSAoJnN0YmwtPnN0c3osIE5VTEwsIE5VTEwsICZvZmZzZXQpKSB7CisgICAgZ290byBmYWlsOworICB9CisgIGlmIChzdGJsLT5jdHRzKSB7CisgICAgaWYgKCFhdG9tX2N0dHNfY29weV9kYXRhIChzdGJsLT5jdHRzLCBOVUxMLCBOVUxMLCAmb2Zmc2V0KSkgeworICAgICAgZ290byBmYWlsOworICAgIH0KKyAgfQorICBpZiAoIWF0b21fc3RjbzY0X2NvcHlfZGF0YSAoJnN0YmwtPnN0Y282NCwgTlVMTCwgTlVMTCwgJm9mZnNldCkpIHsKKyAgICBnb3RvIGZhaWw7CisgIH0KKworICByZXR1cm4gdHJhay0+dHJha19zaXplICsgKCh0cmFrLT5zdHNkX3NpemUgKyBvZmZzZXQgKyA4KSAtIHRyYWstPnN0Ymxfc2l6ZSk7CisKK2ZhaWw6CisgIHJldHVybiAwOworfQorCitzdGF0aWMgZ3VpbnQ4ICoKK21vb3ZfcmVjb3ZfZ2V0X3N0YmxfY2hpbGRyZW5fZGF0YSAoTW9vdlJlY292RmlsZSAqIG1vb3ZyZiwgVHJha1JlY292RGF0YSAqIHRyYWssCisgICAgZ3VpbnQ2NCAqIHBfc2l6ZSkKK3sKKyAgQXRvbVNUQkwgKnN0YmwgPSAmdHJhay0+c3RibDsKKyAgZ3VpbnQ4ICpidWZmZXI7CisgIGd1aW50NjQgc2l6ZTsKKyAgZ3VpbnQ2NCBvZmZzZXQ7CisKKyAgLyogd3JpdGUgb3V0IG91ciBzdGJsIGNoaWxkIGF0b21zCisgICAqCisgICAqIFVzZSAxTUIgYXMgYSBzdGFydGluZyBzaXplLCAqX2NvcHlfZGF0YSBmdW5jdGlvbnMKKyAgICogd2lsbCBncm93IHRoZSBidWZmZXIgaWYgbmVlZGVkLgorICAgKi8KKyAgc2l6ZSA9IDEwMjQgKiAxMDI0OworICBidWZmZXIgPSBnX21hbGxvYzAgKHNpemUpOworICBvZmZzZXQgPSAwOworCisgIGlmICghYXRvbV9zdHRzX2NvcHlfZGF0YSAoJnN0YmwtPnN0dHMsICZidWZmZXIsICZzaXplLCAmb2Zmc2V0KSkgeworICAgIGdvdG8gZmFpbDsKKyAgfQorICBpZiAoYXRvbV9hcnJheV9nZXRfbGVuICgmc3RibC0+c3Rzcy5lbnRyaWVzKSA+IDApIHsKKyAgICBpZiAoIWF0b21fc3Rzc19jb3B5X2RhdGEgKCZzdGJsLT5zdHNzLCAmYnVmZmVyLCAmc2l6ZSwgJm9mZnNldCkpIHsKKyAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgIH0KKyAgaWYgKCFhdG9tX3N0c2NfY29weV9kYXRhICgmc3RibC0+c3RzYywgJmJ1ZmZlciwgJnNpemUsICZvZmZzZXQpKSB7CisgICAgZ290byBmYWlsOworICB9CisgIGlmICghYXRvbV9zdHN6X2NvcHlfZGF0YSAoJnN0YmwtPnN0c3osICZidWZmZXIsICZzaXplLCAmb2Zmc2V0KSkgeworICAgIGdvdG8gZmFpbDsKKyAgfQorICBpZiAoc3RibC0+Y3R0cykgeworICAgIGlmICghYXRvbV9jdHRzX2NvcHlfZGF0YSAoc3RibC0+Y3R0cywgJmJ1ZmZlciwgJnNpemUsICZvZmZzZXQpKSB7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorICB9CisgIGlmICghYXRvbV9zdGNvNjRfY29weV9kYXRhICgmc3RibC0+c3RjbzY0LCAmYnVmZmVyLCAmc2l6ZSwgJm9mZnNldCkpIHsKKyAgICBnb3RvIGZhaWw7CisgIH0KKyAgKnBfc2l6ZSA9IG9mZnNldDsKKyAgcmV0dXJuIGJ1ZmZlcjsKKworZmFpbDoKKyAgZ19mcmVlIChidWZmZXIpOworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGdib29sZWFuCitjb3B5X2RhdGFfZnJvbV9maWxlX3RvX2ZpbGUgKEZJTEUgKiBmcm9tLCBndWludCBwb3NpdGlvbiwgZ3VpbnQgc2l6ZSwgRklMRSAqIHRvLAorICAgIEdFcnJvciAqKiBlcnIpCit7CisgIGd1aW50OCAqZGF0YSA9IE5VTEw7CisKKyAgaWYgKGZzZWVrIChmcm9tLCBwb3NpdGlvbiwgU0VFS19TRVQpICE9IDApCisgICAgZ290byBmYWlsOworICBkYXRhID0gZ19tYWxsb2MgKHNpemUpOworICBpZiAoZnJlYWQgKGRhdGEsIDEsIHNpemUsIGZyb20pICE9IHNpemUpIHsKKyAgICBnb3RvIGZhaWw7CisgIH0KKyAgaWYgKGZ3cml0ZSAoZGF0YSwgMSwgc2l6ZSwgdG8pICE9IHNpemUpIHsKKyAgICBBVE9NU19SRUNPVl9PVVRQVVRfV1JJVEVfRVJST1IgKGVycik7CisgICAgZ290byBmYWlsOworICB9CisKKyAgZ19mcmVlIChkYXRhKTsKKyAgcmV0dXJuIFRSVUU7CisKK2ZhaWw6CisgIGdfZnJlZSAoZGF0YSk7CisgIHJldHVybiBGQUxTRTsKK30KKworZ2Jvb2xlYW4KK21vb3ZfcmVjb3Zfd3JpdGVfZmlsZSAoTW9vdlJlY292RmlsZSAqIG1vb3ZyZiwgTWRhdFJlY292RmlsZSAqIG1kYXRyZiwKKyAgICBGSUxFICogb3V0ZiwgR0Vycm9yICoqIGVyciwgR0Vycm9yICoqIHdhcm4pCit7CisgIGd1aW50OCBhdXhkYXRhWzE2XTsKKyAgZ3VpbnQ4ICpkYXRhID0gTlVMTDsKKyAgZ3VpbnQ4ICpwcmVmaXhfZGF0YSA9IE5VTEw7CisgIGd1aW50OCAqbXZoZF9kYXRhID0gTlVMTDsKKyAgZ3VpbnQ4ICp0cmFrX2RhdGEgPSBOVUxMOworICBndWludDMyIG1vb3Zfc2l6ZSA9IDA7CisgIGdpbnQgaTsKKyAgZ3VpbnQ2NCBzdGJsX2NoaWxkcmVuX3NpemUgPSAwOworICBndWludDggKnN0YmxfY2hpbGRyZW4gPSBOVUxMOworICBndWludDMyIGxvbmdlc3RfZHVyYXRpb24gPSAwOworICBndWludDE2IHZlcnNpb247CisgIGd1aW50IHJlbWFpbmluZzsKKworICAvKiBjaGVjayB0aGUgdmVyc2lvbiAqLworICBpZiAoZnNlZWsgKG1vb3ZyZi0+ZmlsZSwgMCwgU0VFS19TRVQpICE9IDApIHsKKyAgICBnX3NldF9lcnJvciAoZXJyLCBBVE9NU19SRUNPVl9RVUFSSywgQVRPTVNfUkVDT1ZfRVJSX0ZJTEUsCisgICAgICAgICJGYWlsZWQgdG8gc2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIG1vb3YgcmVjb3ZlcnkgZmlsZSIpOworICAgIGdvdG8gZmFpbDsKKyAgfQorICBpZiAoZnJlYWQgKGF1eGRhdGEsIDEsIDIsIG1vb3ZyZi0+ZmlsZSkgIT0gMikgeworICAgIGdfc2V0X2Vycm9yIChlcnIsIEFUT01TX1JFQ09WX1FVQVJLLCBBVE9NU19SRUNPVl9FUlJfRklMRSwKKyAgICAgICAgIkZhaWxlZCB0byByZWFkIHZlcnNpb24gZnJvbSBmaWxlIik7CisgIH0KKworICB2ZXJzaW9uID0gR1NUX1JFQURfVUlOVDE2X0JFIChhdXhkYXRhKTsKKyAgaWYgKHZlcnNpb24gIT0gQVRPTVNfUkVDT1ZfRklMRV9WRVJTSU9OKSB7CisgICAgZ19zZXRfZXJyb3IgKGVyciwgQVRPTVNfUkVDT1ZfUVVBUkssIEFUT01TX1JFQ09WX0VSUl9WRVJTSU9OLAorICAgICAgICAiSW5wdXQgZmlsZSB2ZXJzaW9uICgldSkgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24gKCV1KSIsCisgICAgICAgIHZlcnNpb24sIEFUT01TX1JFQ09WX0ZJTEVfVkVSU0lPTik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogd3JpdGUgdGhlIGZ0eXAgKi8KKyAgcHJlZml4X2RhdGEgPSBnX21hbGxvYyAobW9vdnJmLT5wcmVmaXhfc2l6ZSk7CisgIGlmIChmcmVhZCAocHJlZml4X2RhdGEsIDEsIG1vb3ZyZi0+cHJlZml4X3NpemUsCisgICAgICAgICAgbW9vdnJmLT5maWxlKSAhPSBtb292cmYtPnByZWZpeF9zaXplKSB7CisgICAgZ19zZXRfZXJyb3IgKGVyciwgQVRPTVNfUkVDT1ZfUVVBUkssIEFUT01TX1JFQ09WX0VSUl9GSUxFLAorICAgICAgICAiRmFpbGVkIHRvIHJlYWQgdGhlIGZ0eXAgYXRvbSBmcm9tIGZpbGUiKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KKyAgaWYgKGZ3cml0ZSAocHJlZml4X2RhdGEsIDEsIG1vb3ZyZi0+cHJlZml4X3NpemUsIG91dGYpICE9IG1vb3ZyZi0+cHJlZml4X3NpemUpIHsKKyAgICBBVE9NU19SRUNPVl9PVVRQVVRfV1JJVEVfRVJST1IgKGVycik7CisgICAgZ290byBmYWlsOworICB9CisgIGdfZnJlZSAocHJlZml4X2RhdGEpOworICBwcmVmaXhfZGF0YSA9IE5VTEw7CisKKyAgLyogbmVlZCB0byBjYWxjdWxhdGUgdGhlIG1vb3Ygc2l6ZSBiZWZvcmVoYW5kIHRvIGFkZCB0aGUgb2Zmc2V0IHRvCisgICAqIGNodW5rIG9mZnNldCBlbnRyaWVzICovCisgIG1vb3Zfc2l6ZSArPSBtb292cmYtPm12aGRfc2l6ZSArIDg7ICAgLyogbXZoZCArIG1vb3Ygc2l6ZSArIGZvdXJjYyAqLworICBmb3IgKGkgPSAwOyBpIDwgbW9vdnJmLT5udW1fdHJha3M7IGkrKykgeworICAgIFRyYWtSZWNvdkRhdGEgKnRyYWsgPSAmKG1vb3ZyZi0+dHJha3NfcmRbaV0pOworICAgIGd1aW50MzIgZHVyYXRpb247ICAgICAgICAgICAvKiBpbiBtb292J3MgdGltZXNjYWxlICovCisgICAgZ3VpbnQzMiB0cmFrX3NpemU7CisKKyAgICAvKiBjb252ZXJ0IHRyYWsgZHVyYXRpb24gdG8gbW9vdidzIGR1cmF0aW9uICovCisgICAgZHVyYXRpb24gPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKHRyYWstPmR1cmF0aW9uLCBtb292cmYtPnRpbWVzY2FsZSwKKyAgICAgICAgdHJhay0+dGltZXNjYWxlKTsKKworICAgIGlmIChkdXJhdGlvbiA+IGxvbmdlc3RfZHVyYXRpb24pCisgICAgICBsb25nZXN0X2R1cmF0aW9uID0gZHVyYXRpb247CisgICAgdHJha19zaXplID0gdHJha19yZWNvdl9kYXRhX2dldF90cmFrX2F0b21fc2l6ZSAodHJhayk7CisgICAgaWYgKHRyYWtfc2l6ZSA9PSAwKSB7CisgICAgICBnX3NldF9lcnJvciAoZXJyLCBBVE9NU19SRUNPVl9RVUFSSywgQVRPTVNfUkVDT1ZfRVJSX0dFTkVSSUMsCisgICAgICAgICAgIkZhaWxlZCB0byBlc3RpbWF0ZSB0cmFrIGF0b20gc2l6ZSIpOworICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBtb292X3NpemUgKz0gdHJha19zaXplOworICB9CisKKyAgLyogYWRkIGNodW5rcyBvZmZzZXRzICovCisgIGZvciAoaSA9IDA7IGkgPCBtb292cmYtPm51bV90cmFrczsgaSsrKSB7CisgICAgVHJha1JlY292RGF0YSAqdHJhayA9ICYobW9vdnJmLT50cmFrc19yZFtpXSk7CisgICAgLyogOCBvciAxNiBmb3IgdGhlIG1kYXQgaGVhZGVyICovCisgICAgZ2ludDY0IG9mZnNldCA9IG1vb3Zfc2l6ZSArIGZ0ZWxsIChvdXRmKSArIG1kYXRyZi0+bWRhdF9oZWFkZXJfc2l6ZTsKKyAgICBhdG9tX3N0Y282NF9jaHVua3Nfc2V0X29mZnNldCAoJnRyYWstPnN0Ymwuc3RjbzY0LCBvZmZzZXQpOworICB9CisKKyAgLyogd3JpdGUgdGhlIG1vb3YgKi8KKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoYXV4ZGF0YSwgbW9vdl9zaXplKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoYXV4ZGF0YSArIDQsIEZPVVJDQ19tb292KTsKKyAgaWYgKGZ3cml0ZSAoYXV4ZGF0YSwgMSwgOCwgb3V0ZikgIT0gOCkgeworICAgIEFUT01TX1JFQ09WX09VVFBVVF9XUklURV9FUlJPUiAoZXJyKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KKworICAvKiB3cml0ZSB0aGUgbXZoZCAqLworICBtdmhkX2RhdGEgPSBnX21hbGxvYyAobW9vdnJmLT5tdmhkX3NpemUpOworICBpZiAoZnNlZWsgKG1vb3ZyZi0+ZmlsZSwgbW9vdnJmLT5tdmhkX3BvcywgU0VFS19TRVQpICE9IDApCisgICAgZ290byBmYWlsOworICBpZiAoZnJlYWQgKG12aGRfZGF0YSwgMSwgbW9vdnJmLT5tdmhkX3NpemUsCisgICAgICAgICAgbW9vdnJmLT5maWxlKSAhPSBtb292cmYtPm12aGRfc2l6ZSkKKyAgICBnb3RvIGZhaWw7CisgIEdTVF9XUklURV9VSU5UMzJfQkUgKG12aGRfZGF0YSArIDIwLCBtb292cmYtPnRpbWVzY2FsZSk7CisgIEdTVF9XUklURV9VSU5UMzJfQkUgKG12aGRfZGF0YSArIDI0LCBsb25nZXN0X2R1cmF0aW9uKTsKKyAgaWYgKGZ3cml0ZSAobXZoZF9kYXRhLCAxLCBtb292cmYtPm12aGRfc2l6ZSwgb3V0ZikgIT0gbW9vdnJmLT5tdmhkX3NpemUpIHsKKyAgICBBVE9NU19SRUNPVl9PVVRQVVRfV1JJVEVfRVJST1IgKGVycik7CisgICAgZ290byBmYWlsOworICB9CisgIGdfZnJlZSAobXZoZF9kYXRhKTsKKyAgbXZoZF9kYXRhID0gTlVMTDsKKworICAvKiB3cml0ZSB0aGUgdHJha3MsIHRoaXMgaXMgdGhlIHRvdWdoIHBhcnQgYmVjYXVzZSB3ZSBuZWVkIHRvIHVwZGF0ZToKKyAgICogLSBzdGJsIGF0b20KKyAgICogLSBzaXplcyBvZiBhdG9tcyBmcm9tIHN0YmwgdG8gdHJhaworICAgKiAtIHRyYWsgZHVyYXRpb24KKyAgICovCisgIGZvciAoaSA9IDA7IGkgPCBtb292cmYtPm51bV90cmFrczsgaSsrKSB7CisgICAgVHJha1JlY292RGF0YSAqdHJhayA9ICYobW9vdnJmLT50cmFrc19yZFtpXSk7CisgICAgZ3VpbnQgdHJha19kYXRhX3NpemU7CisgICAgZ3VpbnQzMiBzdGJsX25ld19zaXplOworICAgIGd1aW50MzIgbWluZl9uZXdfc2l6ZTsKKyAgICBndWludDMyIG1kaWFfbmV3X3NpemU7CisgICAgZ3VpbnQzMiB0cmFrX25ld19zaXplOworICAgIGd1aW50MzIgc2l6ZV9kaWZmOworICAgIGd1aW50MzIgZHVyYXRpb247ICAgICAgICAgICAvKiBpbiBtb292J3MgdGltZXNjYWxlICovCisKKyAgICAvKiBjb252ZXJ0IHRyYWsgZHVyYXRpb24gdG8gbW9vdidzIGR1cmF0aW9uICovCisgICAgZHVyYXRpb24gPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKHRyYWstPmR1cmF0aW9uLCBtb292cmYtPnRpbWVzY2FsZSwKKyAgICAgICAgdHJhay0+dGltZXNjYWxlKTsKKworICAgIHN0YmxfY2hpbGRyZW4gPSBtb292X3JlY292X2dldF9zdGJsX2NoaWxkcmVuX2RhdGEgKG1vb3ZyZiwgdHJhaywKKyAgICAgICAgJnN0YmxfY2hpbGRyZW5fc2l6ZSk7CisgICAgaWYgKHN0YmxfY2hpbGRyZW4gPT0gTlVMTCkKKyAgICAgIGdvdG8gZmFpbDsKKworICAgIC8qIGNhbGMgdGhlIG5ldyBzaXplIG9mIHRoZSBhdG9tcyBmcm9tIHN0YmwgdG8gdHJhayBpbiB0aGUgYXRvbXMgdHJlZSAqLworICAgIHN0YmxfbmV3X3NpemUgPSB0cmFrLT5zdHNkX3NpemUgKyBzdGJsX2NoaWxkcmVuX3NpemUgKyA4OworICAgIHNpemVfZGlmZiA9IHN0YmxfbmV3X3NpemUgLSB0cmFrLT5zdGJsX3NpemU7CisgICAgbWluZl9uZXdfc2l6ZSA9IHRyYWstPm1pbmZfc2l6ZSArIHNpemVfZGlmZjsKKyAgICBtZGlhX25ld19zaXplID0gdHJhay0+bWRpYV9zaXplICsgc2l6ZV9kaWZmOworICAgIHRyYWtfbmV3X3NpemUgPSB0cmFrLT50cmFrX3NpemUgKyBzaXplX2RpZmY7CisKKyAgICBpZiAoZnNlZWsgKG1vb3ZyZi0+ZmlsZSwgdHJhay0+ZmlsZV9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQorICAgICAgZ290byBmYWlsOworICAgIHRyYWtfZGF0YV9zaXplID0gdHJhay0+cG9zdF9zdHNkX29mZnNldCAtIHRyYWstPmZpbGVfb2Zmc2V0OworICAgIHRyYWtfZGF0YSA9IGdfbWFsbG9jICh0cmFrX2RhdGFfc2l6ZSk7CisgICAgaWYgKGZyZWFkICh0cmFrX2RhdGEsIDEsIHRyYWtfZGF0YV9zaXplLCBtb292cmYtPmZpbGUpICE9IHRyYWtfZGF0YV9zaXplKSB7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIC8qIHVwZGF0ZSB0aGUgc2l6ZSB2YWx1ZXMgaW4gdGhvc2UgcmVhZCBhdG9tcyBiZWZvcmUgd3JpdGluZyAqLworICAgIEdTVF9XUklURV9VSU5UMzJfQkUgKHRyYWtfZGF0YSwgdHJha19uZXdfc2l6ZSk7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9CRSAodHJha19kYXRhICsgKHRyYWstPm1kaWFfZmlsZV9vZmZzZXQgLQorICAgICAgICAgICAgdHJhay0+ZmlsZV9vZmZzZXQpLCBtZGlhX25ld19zaXplKTsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0JFICh0cmFrX2RhdGEgKyAodHJhay0+bWluZl9maWxlX29mZnNldCAtCisgICAgICAgICAgICB0cmFrLT5maWxlX29mZnNldCksIG1pbmZfbmV3X3NpemUpOworICAgIEdTVF9XUklURV9VSU5UMzJfQkUgKHRyYWtfZGF0YSArICh0cmFrLT5zdGJsX2ZpbGVfb2Zmc2V0IC0KKyAgICAgICAgICAgIHRyYWstPmZpbGVfb2Zmc2V0KSwgc3RibF9uZXdfc2l6ZSk7CisKKyAgICAvKiB1cGRhdGUgZHVyYXRpb24gdmFsdWVzIGluIHRraGQgYW5kIG1kaGQgKi8KKyAgICBHU1RfV1JJVEVfVUlOVDMyX0JFICh0cmFrX2RhdGEgKyAodHJhay0+dGtoZF9maWxlX29mZnNldCAtCisgICAgICAgICAgICB0cmFrLT5maWxlX29mZnNldCkgKyAyOCwgZHVyYXRpb24pOworICAgIEdTVF9XUklURV9VSU5UMzJfQkUgKHRyYWtfZGF0YSArICh0cmFrLT5tZGhkX2ZpbGVfb2Zmc2V0IC0KKyAgICAgICAgICAgIHRyYWstPmZpbGVfb2Zmc2V0KSArIDI0LCB0cmFrLT5kdXJhdGlvbik7CisKKyAgICBpZiAoZndyaXRlICh0cmFrX2RhdGEsIDEsIHRyYWtfZGF0YV9zaXplLCBvdXRmKSAhPSB0cmFrX2RhdGFfc2l6ZSkgeworICAgICAgQVRPTVNfUkVDT1ZfT1VUUFVUX1dSSVRFX0VSUk9SIChlcnIpOworICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoZndyaXRlIChzdGJsX2NoaWxkcmVuLCAxLCBzdGJsX2NoaWxkcmVuX3NpemUsIG91dGYpICE9CisgICAgICAgIHN0YmxfY2hpbGRyZW5fc2l6ZSkgeworICAgICAgQVRPTVNfUkVDT1ZfT1VUUFVUX1dSSVRFX0VSUk9SIChlcnIpOworICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGdfZnJlZSAodHJha19kYXRhKTsKKyAgICB0cmFrX2RhdGEgPSBOVUxMOworICAgIGdfZnJlZSAoc3RibF9jaGlsZHJlbik7CisgICAgc3RibF9jaGlsZHJlbiA9IE5VTEw7CisKKyAgICAvKiBDb3B5IHRoZSBleHRyYSBhdG9tcyBhZnRlciAnbWluZicgKi8KKyAgICBpZiAoIWNvcHlfZGF0YV9mcm9tX2ZpbGVfdG9fZmlsZSAobW9vdnJmLT5maWxlLCB0cmFrLT5leHRyYV9hdG9tc19vZmZzZXQsCisgICAgICAgICAgICB0cmFrLT5leHRyYV9hdG9tc19zaXplLCBvdXRmLCBlcnIpKQorICAgICAgZ290byBmYWlsOworICB9CisKKyAgLyogd3JpdGUgdGhlIG1kYXQgKi8KKyAgLyogd3JpdGUgdGhlIGhlYWRlciBmaXJzdCAqLworICBpZiAobWRhdHJmLT5tZGF0X2hlYWRlcl9zaXplID09IDE2KSB7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoYXV4ZGF0YSwgMSk7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoYXV4ZGF0YSArIDQsIEZPVVJDQ19tZGF0KTsKKyAgICBHU1RfV1JJVEVfVUlOVDY0X0JFIChhdXhkYXRhICsgOCwgbWRhdHJmLT5tZGF0X3NpemUpOworICB9IGVsc2UgaWYgKG1kYXRyZi0+bWRhdF9oZWFkZXJfc2l6ZSA9PSA4KSB7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoYXV4ZGF0YSwgbWRhdHJmLT5tZGF0X3NpemUpOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGF1eGRhdGEgKyA0LCBGT1VSQ0NfbWRhdCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0VSUk9SICgiVW5leHBlY3RlZCBhdG9tIHNpemU6ICV1IiwgbWRhdHJmLT5tZGF0X2hlYWRlcl9zaXplKTsKKyAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KKworICBpZiAoZndyaXRlIChhdXhkYXRhLCAxLCBtZGF0cmYtPm1kYXRfaGVhZGVyX3NpemUsCisgICAgICAgICAgb3V0ZikgIT0gbWRhdHJmLT5tZGF0X2hlYWRlcl9zaXplKSB7CisgICAgQVRPTVNfUkVDT1ZfT1VUUFVUX1dSSVRFX0VSUk9SIChlcnIpOworICAgIGdvdG8gZmFpbDsKKyAgfQorCisgIC8qIG5vdyByZWFkIHRoZSBtZGF0IGRhdGEgYW5kIG91dHB1dCB0byB0aGUgZmlsZSAqLworICBpZiAoZnNlZWsgKG1kYXRyZi0+ZmlsZSwgbWRhdHJmLT5tZGF0X3N0YXJ0ICsKKyAgICAgICAgICAobWRhdHJmLT5yYXdmaWxlID8gMCA6IG1kYXRyZi0+bWRhdF9oZWFkZXJfc2l6ZSksIFNFRUtfU0VUKSAhPSAwKQorICAgIGdvdG8gZmFpbDsKKworICByZW1haW5pbmcgPSBtZGF0cmYtPm1kYXRfc2l6ZSAtIG1kYXRyZi0+bWRhdF9oZWFkZXJfc2l6ZTsKKyAgZGF0YSA9IGdfbWFsbG9jIChNQVhfQ0hVTktfU0laRSk7CisgIHdoaWxlICghZmVvZiAobWRhdHJmLT5maWxlKSAmJiByZW1haW5pbmcgPiAwKSB7CisgICAgZ2ludCByZWFkLCB3cml0ZSwgcmVhZHNpemU7CisKKyAgICByZWFkc2l6ZSA9IE1JTiAoTUFYX0NIVU5LX1NJWkUsIHJlbWFpbmluZyk7CisKKyAgICByZWFkID0gZnJlYWQgKGRhdGEsIDEsIHJlYWRzaXplLCBtZGF0cmYtPmZpbGUpOworICAgIHdyaXRlID0gZndyaXRlIChkYXRhLCAxLCByZWFkLCBvdXRmKTsKKyAgICByZW1haW5pbmcgLT0gcmVhZDsKKworICAgIGlmICh3cml0ZSAhPSByZWFkKSB7CisgICAgICBnX3NldF9lcnJvciAoZXJyLCBBVE9NU19SRUNPVl9RVUFSSywgQVRPTVNfUkVDT1ZfRVJSX0ZJTEUsCisgICAgICAgICAgIkZhaWxlZCB0byBjb3B5IGRhdGEgdG8gb3V0cHV0IGZpbGU6ICVzIiwgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgIH0KKyAgZ19mcmVlIChkYXRhKTsKKworICBpZiAocmVtYWluaW5nKSB7CisgICAgZ19zZXRfZXJyb3IgKHdhcm4sIEFUT01TX1JFQ09WX1FVQVJLLCBBVE9NU19SRUNPVl9FUlJfRklMRSwKKyAgICAgICAgIlNhbXBsZXMgaW4gcmVjb3ZlcnkgZmlsZSB3ZXJlIG5vdCBwcmVzZW50IG9uIGhlYWRlcnMuIgorICAgICAgICAiIEJ5dGVzIGxvc3Q6ICV1IiwgcmVtYWluaW5nKTsKKyAgfSBlbHNlIGlmICghZmVvZiAobWRhdHJmLT5maWxlKSkgeworICAgIGdfc2V0X2Vycm9yICh3YXJuLCBBVE9NU19SRUNPVl9RVUFSSywgQVRPTVNfUkVDT1ZfRVJSX0ZJTEUsCisgICAgICAgICJTYW1wbGVzIGluIGhlYWRlcnMgd2VyZSBub3QgZm91bmQgaW4gZGF0YSBmaWxlLiIpOworICAgIEdTVF9GSVhNRSAoIlJld3JpdGUgbWRhdCBzaXplIGlmIHdlIHJlYWNoIHRoaXMgdG8gbWFrZSB0aGUgZmlsZSIKKyAgICAgICAgIiBmdWxseSBjb3JyZWN0Iik7CisgIH0KKworICByZXR1cm4gVFJVRTsKKworZmFpbDoKKyAgZ19mcmVlIChzdGJsX2NoaWxkcmVuKTsKKyAgZ19mcmVlIChtdmhkX2RhdGEpOworICBnX2ZyZWUgKHByZWZpeF9kYXRhKTsKKyAgZ19mcmVlICh0cmFrX2RhdGEpOworICBnX2ZyZWUgKGRhdGEpOworICByZXR1cm4gRkFMU0U7Cit9CmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L2F0b21zcmVjb3ZlcnkuaCBiL2dzdC9pc29tcDQvYXRvbXNyZWNvdmVyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNDRjOWIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L2F0b21zcmVjb3ZlcnkuaApAQCAtMCwwICsxLDE2MiBAQAorLyogUXVpY2t0aW1lIG11eGVyIHBsdWdpbiBmb3IgR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qCisgKiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgU291cmNlIENvZGUgaXMgbGljZW5zZWQgdW5kZXIgTUlUIGxpY2Vuc2UuCisgKiBTZWUgZnVydGhlciBleHBsYW5hdGlvbiBhdHRhY2hlZCBpbiBMaWNlbnNlIFN0YXRlbWVudCAoZGlzdHJpYnV0ZWQgaW4gdGhlIGZpbGUKKyAqIExJQ0VOU0UpLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fQVRPTVNfUkVDT1ZFUllfSF9fCisjZGVmaW5lIF9fQVRPTVNfUkVDT1ZFUllfSF9fCisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJhdG9tcy5oIgorCisvKiBWZXJzaW9uIHRvIGJlIGluY3JlbWVudGVkIGVhY2ggdGltZSB3ZSBkZWNpZGUKKyAqIHRvIGNoYW5nZSB0aGUgZmlsZSBsYXlvdXQgKi8KKyNkZWZpbmUgQVRPTVNfUkVDT1ZfRklMRV9WRVJTSU9OICAgICAgICAgIDEKKworI2RlZmluZSBBVE9NU19SRUNPVl9RVUFSSyAoZ19xdWFya19mcm9tX3N0cmluZyAoInF0bXV4LWF0b21zLXJlY292ZXJ5IikpCisKKy8qIGdlcnJvciBlcnJvciBjb2RlcyAqLworI2RlZmluZSBBVE9NU19SRUNPVl9FUlJfR0VORVJJQyAgICAgICAgICAgMQorI2RlZmluZSBBVE9NU19SRUNPVl9FUlJfRklMRSAgICAgICAgICAgICAgMgorI2RlZmluZSBBVE9NU19SRUNPVl9FUlJfUEFSU0lORyAgICAgICAgICAgMworI2RlZmluZSBBVE9NU19SRUNPVl9FUlJfVkVSU0lPTiAgICAgICAgICAgNAorCisvKiB0aGlzIHN0cnVjdCByZXByZXNlbnRzIGVhY2ggYnVmZmVyIGluIGEgbW9vdiBmaWxlLCBjb250YWluaW5nIHRoZSBpbmZvCisgKiB0aGF0IGlzIHBsYWNlZCBpbiB0aGUgc3RzZCBjaGlsZHJlbiBhdG9tcworICogRmllbGRzIHNob3VsZCBiZSB3cml0ZW4gaW4gQkUgb3JkZXIsIGFuZCBib29sZWFucyBzaG91bGQgYmUgd3JpdGVuIGFzCisgKiAxYnl0ZSB3aXRoIDAgZm9yIGZhbHNlLCBhbnl0aGluZyBvdGhlcndpc2UgKi8KKyNkZWZpbmUgVFJBS19CVUZGRVJfRU5UUllfSU5GT19TSVpFIDM0Cit0eXBlZGVmIHN0cnVjdAoreworICBndWludDMyICAgdHJhY2tfaWQ7CisgIGd1aW50MzIgICBuc2FtcGxlczsKKyAgZ3VpbnQzMiAgIGRlbHRhOworICBndWludDMyICAgc2l6ZTsKKyAgZ3VpbnQ2NCAgIGNodW5rX29mZnNldDsKKyAgZ3VpbnQ2NCAgIHB0c19vZmZzZXQ7CisgIGdib29sZWFuICBzeW5jOworICBnYm9vbGVhbiAgZG9fcHRzOworfSBUcmFrQnVmZmVyRW50cnlJbmZvOworCit0eXBlZGVmIHN0cnVjdAoreworICBndWludDMyIHRyYWtfaWQ7CisgIGd1aW50MzIgZHVyYXRpb247ICAvKiBkdXJhdGlvbiBpbiB0cmFrIHRpbWVzY2FsZSAqLworICBndWludDMyIHRpbWVzY2FsZTsgLyogdHJhaydzIHRpbWVzY2FsZSAqLworCisgIGd1aW50NjQgZmlsZV9vZmZzZXQ7CisKKyAgLyogbmVlZCBmb3IgbGF0ZXIgdXBkYXRpbmcgZHVyYXRpb24gKi8KKyAgZ3VpbnQ2NCB0a2hkX2ZpbGVfb2Zmc2V0OworICBndWludDY0IG1kaGRfZmlsZV9vZmZzZXQ7CisKKyAgLyogbmVlZCB0aGVzZSBvZmZzZXRzIHRvIHVwZGF0ZSBzaXplICovCisgIGd1aW50MzIgdHJha19zaXplOworICBndWludDY0IG1kaWFfZmlsZV9vZmZzZXQ7CisgIGd1aW50MzIgbWRpYV9zaXplOworICBndWludDY0IG1pbmZfZmlsZV9vZmZzZXQ7CisgIGd1aW50MzIgbWluZl9zaXplOworICBndWludDY0IHN0YmxfZmlsZV9vZmZzZXQ7CisgIGd1aW50MzIgc3RibF9zaXplOworCisgIGd1aW50NjQgcG9zdF9zdHNkX29mZnNldDsKKyAgZ3VpbnQzMiBzdHNkX3NpemU7CisKKyAgZ3VpbnQzMiBleHRyYV9hdG9tc19zaXplOworICBndWludDMyIGV4dHJhX2F0b21zX29mZnNldDsKKworICAvKiBmb3Igc3RvcmluZyB0aGUgc2FtcGxlcyBpbmZvICovCisgIEF0b21TVEJMIHN0Ymw7Cit9IFRyYWtSZWNvdkRhdGE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEZJTEUgKiBmaWxlOworICBnYm9vbGVhbiByYXdmaWxlOworCisgIC8qIHJlc3VsdHMgZnJvbSBwYXJzaW5nIHRoZSBpbnB1dCBmaWxlICovCisgIGd1aW50NjQgICBkYXRhX3NpemU7CisgIGd1aW50MzIgICBtZGF0X2hlYWRlcl9zaXplOworICBndWludCAgICAgbWRhdF9zdGFydDsKKworICBndWludDY0ICAgbWRhdF9zaXplOworfSBNZGF0UmVjb3ZGaWxlOworCit0eXBlZGVmIHN0cnVjdAoreworICBGSUxFICogZmlsZTsKKyAgZ3VpbnQzMiB0aW1lc2NhbGU7CisKKyAgZ3VpbnQzMiBtdmhkX3BvczsKKyAgZ3VpbnQzMiBtdmhkX3NpemU7CisgIGd1aW50MzIgcHJlZml4X3NpemU7IC8qIHByZWZpeCArIGZ0eXAgdG90YWwgc2l6ZSAqLworCisgIGdpbnQgbnVtX3RyYWtzOworICBUcmFrUmVjb3ZEYXRhICp0cmFrc19yZDsKK30gTW9vdlJlY292RmlsZTsKKworZ2Jvb2xlYW4gYXRvbXNfcmVjb3Zfd3JpdGVfdHJha19pbmZvICAgICAgKEZJTEUgKiBmLCBBdG9tVFJBSyAqIHRyYWspOworZ2Jvb2xlYW4gYXRvbXNfcmVjb3Zfd3JpdGVfaGVhZGVycyAgICAgICAgKEZJTEUgKiBmLCBBdG9tRlRZUCAqIGZ0eXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0QnVmZmVyICogcHJlZml4LCBBdG9tTU9PViAqIG1vb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiB0aW1lc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiB0cmFrc19udW1iZXIpOworZ2Jvb2xlYW4gYXRvbXNfcmVjb3Zfd3JpdGVfdHJha19zYW1wbGVzICAgKEZJTEUgKiBmLCBBdG9tVFJBSyAqIHRyYWssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBuc2FtcGxlcywgZ3VpbnQzMiBkZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIHNpemUsIGd1aW50NjQgY2h1bmtfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdib29sZWFuIHN5bmMsIGdib29sZWFuIGRvX3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50NjQgcHRzX29mZnNldCk7CisKK01kYXRSZWNvdkZpbGUgKiBtZGF0X3JlY292X2ZpbGVfY3JlYXRlICAgKEZJTEUgKiBmaWxlLCBnYm9vbGVhbiBkYXRhZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKiBlcnIpOwordm9pZCAgICAgICAgICAgIG1kYXRfcmVjb3ZfZmlsZV9mcmVlICAgICAoTWRhdFJlY292RmlsZSAqIG1yZik7CitNb292UmVjb3ZGaWxlICogbW9vdl9yZWNvdl9maWxlX2NyZWF0ZSAgIChGSUxFICogZmlsZSwgR0Vycm9yICoqIGVycik7Cit2b2lkICAgICAgICAgICAgbW9vdl9yZWNvdl9maWxlX2ZyZWUgICAgIChNb292UmVjb3ZGaWxlICogbW9vdnJmKTsKK2dib29sZWFuICAgICAgICBtb292X3JlY292X3BhcnNlX2J1ZmZlcnMgKE1vb3ZSZWNvdkZpbGUgKiBtb292cmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZGF0UmVjb3ZGaWxlICogbWRhdHJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqIGVycik7CitnYm9vbGVhbiAgICAgICAgbW9vdl9yZWNvdl93cml0ZV9maWxlICAgIChNb292UmVjb3ZGaWxlICogbW9vdnJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWRhdFJlY292RmlsZSAqIG1kYXRyZiwgRklMRSAqIG91dGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiogZXJyLCBHRXJyb3IgKiogd2Fybik7CisKKyNlbmRpZiAvKiBfX0FUT01TX1JFQ09WRVJZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9kZXNjcmlwdG9ycy5jIGIvZ3N0L2lzb21wNC9kZXNjcmlwdG9ycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxM2ZmZGMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L2Rlc2NyaXB0b3JzLmMKQEAgLTAsMCArMSw0NTcgQEAKKy8qIFF1aWNrdGltZSBtdXhlciBwbHVnaW4gZm9yIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoaWFnbyBTb3VzYSBTYW50b3MgPHRoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKgorICogVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIFNvdXJjZSBDb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlLgorICogU2VlIGZ1cnRoZXIgZXhwbGFuYXRpb24gYXR0YWNoZWQgaW4gTGljZW5zZSBTdGF0ZW1lbnQgKGRpc3RyaWJ1dGVkIGluIHRoZSBmaWxlCisgKiBMSUNFTlNFKS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRlc2NyaXB0b3JzLmgiCisKKy8qCisgKiBTb21lIG1wNCBzdHJ1Y3R1cmVzIChkZXNjcmlwdG9ycykgdXNlIGEgY29kaW5nIHNjaGVtZSBmb3IKKyAqIHJlcHJlc2VudGluZyBpdHMgc2l6ZS4KKyAqIEl0IGlzIGdyb3VwZWQgaW4gYnl0ZXMuIFRoZSAxc3QgYml0IHNldCB0byAxIG1lYW5zIHdlIG5lZWQgYW5vdGhlciBieXRlLAorICogMCBvdGhlcndpc2UuIFRoZSByZW1haW5pbmcgNyBiaXRzIGFyZSB0aGUgdXNlZnVsIHZhbHVlcy4KKyAqCisgKiBUaGUgbmV4dCBzZXQgb2YgZnVuY3Rpb25zIGhhbmRsZSB0aG9zZSB2YWx1ZXMKKyAqLworCisvKgorICogR2V0cyBhbiB1bnNpZ25lZCBpbnRlZ2VyIGFuZCBwYWNrcyBpdCBpbnRvIGEgJ2V4cGFuZGFibGUgc2l6ZScgZm9ybWF0CisgKiAoYXMgdXNlZCBieSBtcDQgZGVzY3JpcHRvcnMpCisgKiBAc2l6ZTogdGhlIGludGVnZXIgdG8gYmUgcGFyc2VkCisgKiBAcHRyOiB0aGUgYXJyYXkgdG8gcGxhY2UgdGhlIHJlc3VsdAorICogQGFycmF5X3NpemU6IHRoZSBzaXplIG9mIHB0ciBhcnJheQorICovCitzdGF0aWMgdm9pZAorZXhwYW5kYWJsZV9zaXplX3BhcnNlIChndWludDY0IHNpemUsIGd1aW50OCAqIHB0ciwgZ3VpbnQzMiBhcnJheV9zaXplKQoreworICBpbnQgaW5kZXggPSAwOworCisgIG1lbXNldCAocHRyLCAwLCBzaXplb2YgKGFycmF5X3NpemUpKTsKKyAgd2hpbGUgKHNpemUgPiAwICYmIGluZGV4IDwgYXJyYXlfc2l6ZSkgeworICAgIHB0cltpbmRleCsrXSA9IChzaXplID4gMHg3RiA/IDB4ODAgOiAweDApIHwgKHNpemUgJiAweDdGKTsKKyAgICBzaXplID0gc2l6ZSA+PiA3OworICB9Cit9CisKKy8qCisgKiBHZXRzIGhvdyBtYW55IHBvc2l0aW9ucyBpbiBhbiBhcnJheSBob2xkaW5nIGFuICdleHBhbmRhYmxlIHNpemUnCisgKiBhcmUgcmVhbGx5IHVzZWQKKyAqCisgKiBAcHRyOiB0aGUgYXJyYXkgd2l0aCB0aGUgJ2V4cGFuZGFibGUgc2l6ZScKKyAqIEBhcnJheV9zaXplOiB0aGUgc2l6ZSBvZiBwdHIgYXJyYXkKKyAqCisgKiBSZXR1cm5zOiB0aGUgbnVtYmVyIG9mIHJlYWxseSB1c2VkIHBvc2l0aW9ucworICovCitzdGF0aWMgZ3VpbnQ2NAorZXhwYW5kYWJsZV9zaXplX2dldF9sZW5ndGggKGd1aW50OCAqIHB0ciwgZ3VpbnQzMiBhcnJheV9zaXplKQoreworICBnYm9vbGVhbiBuZXh0ID0gVFJVRTsKKyAgZ3VpbnQzMiBpbmRleCA9IDA7CisKKyAgd2hpbGUgKG5leHQgJiYgaW5kZXggPCBhcnJheV9zaXplKSB7CisgICAgbmV4dCA9IChwdHJbaW5kZXhdICYgMHg4MCk7CisgICAgaW5kZXgrKzsKKyAgfQorICByZXR1cm4gaW5kZXg7Cit9CisKKy8qCisgKiBJbml0aWFsaXplcnMgYmVsb3cKKyAqLworCitzdGF0aWMgdm9pZAorZGVzY19iYXNlX2Rlc2NyaXB0b3JfaW5pdCAoQmFzZURlc2NyaXB0b3IgKiBiZCwgZ3VpbnQ4IHRhZywgZ3VpbnQzMiBzaXplKQoreworICBiZC0+dGFnID0gdGFnOworICBleHBhbmRhYmxlX3NpemVfcGFyc2UgKHNpemUsIGJkLT5zaXplLCA0KTsKK30KKworc3RhdGljIHZvaWQKK2Rlc2NfZGVjX3NwZWNpZmljX2luZm9faW5pdCAoRGVjb2RlclNwZWNpZmljSW5mb0Rlc2NyaXB0b3IgKiBkc2lkKQoreworICBkZXNjX2Jhc2VfZGVzY3JpcHRvcl9pbml0ICgmZHNpZC0+YmFzZSwgREVDT0RFUl9TUEVDSUZJQ19JTkZPX1RBRywgMCk7CisgIGRzaWQtPmxlbmd0aCA9IDA7CisgIGRzaWQtPmRhdGEgPSBOVUxMOworfQorCitEZWNvZGVyU3BlY2lmaWNJbmZvRGVzY3JpcHRvciAqCitkZXNjX2RlY19zcGVjaWZpY19pbmZvX25ldyAodm9pZCkKK3sKKyAgRGVjb2RlclNwZWNpZmljSW5mb0Rlc2NyaXB0b3IgKmRlc2MgPQorICAgICAgZ19uZXcwIChEZWNvZGVyU3BlY2lmaWNJbmZvRGVzY3JpcHRvciwgMSk7CisgIGRlc2NfZGVjX3NwZWNpZmljX2luZm9faW5pdCAoZGVzYyk7CisgIHJldHVybiBkZXNjOworfQorCitzdGF0aWMgdm9pZAorZGVzY19kZWNfY29uZl9kZXNjX2luaXQgKERlY29kZXJDb25maWdEZXNjcmlwdG9yICogZGNkKQoreworICBkZXNjX2Jhc2VfZGVzY3JpcHRvcl9pbml0ICgmZGNkLT5iYXNlLCBERUNPREVSX0NPTkZJR19ERVNDX1RBRywgMCk7CisgIGRjZC0+ZGVjX3NwZWNpZmljX2luZm8gPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZGVzY19zbF9jb25mX2Rlc2NfaW5pdCAoU0xDb25maWdEZXNjcmlwdG9yICogc2wpCit7CisgIGRlc2NfYmFzZV9kZXNjcmlwdG9yX2luaXQgKCZzbC0+YmFzZSwgU0xfQ09ORklHX0RFU0NfVEFHLCAwKTsKKyAgc2wtPnByZWRlZmluZWQgPSAweDI7Cit9CisKK3ZvaWQKK2Rlc2NfZXNfaW5pdCAoRVNEZXNjcmlwdG9yICogZXMpCit7CisgIGRlc2NfYmFzZV9kZXNjcmlwdG9yX2luaXQgKCZlcy0+YmFzZSwgRVNfREVTQ1JJUFRPUl9UQUcsIDApOworCisgIGVzLT5pZCA9IDA7CisgIGVzLT5mbGFncyA9IDA7CisgIGVzLT5kZXBlbmRzX29uX2VzX2lkID0gMDsKKyAgZXMtPm9jcl9lc19pZCA9IDA7CisgIGVzLT51cmxfbGVuZ3RoID0gMDsKKyAgZXMtPnVybF9zdHJpbmcgPSBOVUxMOworCisgIGRlc2NfZGVjX2NvbmZfZGVzY19pbml0ICgmZXMtPmRlY19jb25mX2Rlc2MpOworICBkZXNjX3NsX2NvbmZfZGVzY19pbml0ICgmZXMtPnNsX2NvbmZfZGVzYyk7Cit9CisKK0VTRGVzY3JpcHRvciAqCitkZXNjX2VzX2Rlc2NyaXB0b3JfbmV3ICh2b2lkKQoreworICBFU0Rlc2NyaXB0b3IgKmVzID0gZ19uZXcwIChFU0Rlc2NyaXB0b3IsIDEpOworCisgIGRlc2NfZXNfaW5pdCAoZXMpOworICByZXR1cm4gZXM7Cit9CisKKy8qCisgKiBEZWluaXRpYWxpemVycy9EZXN0cnVjdG9ycyBiZWxvdworICovCisKK3N0YXRpYyB2b2lkCitkZXNjX2Jhc2VfZGVzY3JpcHRvcl9jbGVhciAoQmFzZURlc2NyaXB0b3IgKiBiYXNlKQoreworfQorCit2b2lkCitkZXNjX2RlY19zcGVjaWZpY19pbmZvX2ZyZWUgKERlY29kZXJTcGVjaWZpY0luZm9EZXNjcmlwdG9yICogZHNpZCkKK3sKKyAgZGVzY19iYXNlX2Rlc2NyaXB0b3JfY2xlYXIgKCZkc2lkLT5iYXNlKTsKKyAgaWYgKGRzaWQtPmRhdGEpIHsKKyAgICBnX2ZyZWUgKGRzaWQtPmRhdGEpOworICAgIGRzaWQtPmRhdGEgPSBOVUxMOworICB9CisgIGdfZnJlZSAoZHNpZCk7Cit9CisKK3N0YXRpYyB2b2lkCitkZXNjX2RlY19jb25mX2Rlc2NfY2xlYXIgKERlY29kZXJDb25maWdEZXNjcmlwdG9yICogZGVjKQoreworICBkZXNjX2Jhc2VfZGVzY3JpcHRvcl9jbGVhciAoJmRlYy0+YmFzZSk7CisgIGlmIChkZWMtPmRlY19zcGVjaWZpY19pbmZvKSB7CisgICAgZGVzY19kZWNfc3BlY2lmaWNfaW5mb19mcmVlIChkZWMtPmRlY19zcGVjaWZpY19pbmZvKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZGVzY19zbF9jb25maWdfZGVzY3JpcHRvcl9jbGVhciAoU0xDb25maWdEZXNjcmlwdG9yICogc2wpCit7CisgIGRlc2NfYmFzZV9kZXNjcmlwdG9yX2NsZWFyICgmc2wtPmJhc2UpOworfQorCit2b2lkCitkZXNjX2VzX2Rlc2NyaXB0b3JfY2xlYXIgKEVTRGVzY3JpcHRvciAqIGVzKQoreworICBkZXNjX2Jhc2VfZGVzY3JpcHRvcl9jbGVhciAoJmVzLT5iYXNlKTsKKyAgaWYgKGVzLT51cmxfc3RyaW5nKSB7CisgICAgZ19mcmVlIChlcy0+dXJsX3N0cmluZyk7CisgICAgZXMtPnVybF9zdHJpbmcgPSBOVUxMOworICB9CisgIGRlc2NfZGVjX2NvbmZfZGVzY19jbGVhciAoJmVzLT5kZWNfY29uZl9kZXNjKTsKKyAgZGVzY19zbF9jb25maWdfZGVzY3JpcHRvcl9jbGVhciAoJmVzLT5zbF9jb25mX2Rlc2MpOworfQorCisvKgorICogU2l6ZSBoYW5kbGluZyBmdW5jdGlvbnMgYmVsb3cKKyAqLworCit2b2lkCitkZXNjX2RlY19zcGVjaWZpY19pbmZvX2FsbG9jX2RhdGEgKERlY29kZXJTcGVjaWZpY0luZm9EZXNjcmlwdG9yICogZHNpZCwKKyAgICBndWludDMyIHNpemUpCit7CisgIGlmIChkc2lkLT5kYXRhKSB7CisgICAgZ19mcmVlIChkc2lkLT5kYXRhKTsKKyAgfQorICBkc2lkLT5kYXRhID0gZ19uZXcwIChndWludDgsIHNpemUpOworICBkc2lkLT5sZW5ndGggPSBzaXplOworfQorCitzdGF0aWMgdm9pZAorZGVzY19iYXNlX2Rlc2NyaXB0b3Jfc2V0X3NpemUgKEJhc2VEZXNjcmlwdG9yICogYmQsIGd1aW50MzIgc2l6ZSkKK3sKKyAgZXhwYW5kYWJsZV9zaXplX3BhcnNlIChzaXplLCBiZC0+c2l6ZSwgNCk7Cit9CisKK3N0YXRpYyBndWludDY0CitkZXNjX2Jhc2VfZGVzY3JpcHRvcl9nZXRfc2l6ZSAoQmFzZURlc2NyaXB0b3IgKiBiZCkKK3sKKyAgZ3VpbnQ2NCBzaXplID0gMDsKKworICBzaXplICs9IHNpemVvZiAoZ3VpbnQ4KTsKKyAgc2l6ZSArPSBleHBhbmRhYmxlX3NpemVfZ2V0X2xlbmd0aCAoYmQtPnNpemUsIDQpICogc2l6ZW9mIChndWludDgpOworICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGd1aW50NjQKK2Rlc2Nfc2xfY29uZmlnX2Rlc2NyaXB0b3JfZ2V0X3NpemUgKFNMQ29uZmlnRGVzY3JpcHRvciAqIHNsX2Rlc2MpCit7CisgIGd1aW50NjQgc2l6ZSA9IDA7CisgIGd1aW50NjQgZXh0cmFfc2l6ZSA9IDA7CisKKyAgc2l6ZSArPSBkZXNjX2Jhc2VfZGVzY3JpcHRvcl9nZXRfc2l6ZSAoJnNsX2Rlc2MtPmJhc2UpOworICAvKiBwcmVkZWZpbmVkICovCisgIGV4dHJhX3NpemUgKz0gc2l6ZW9mIChndWludDgpOworCisgIGRlc2NfYmFzZV9kZXNjcmlwdG9yX3NldF9zaXplICgmc2xfZGVzYy0+YmFzZSwgZXh0cmFfc2l6ZSk7CisKKyAgcmV0dXJuIHNpemUgKyBleHRyYV9zaXplOworfQorCitzdGF0aWMgZ3VpbnQ2NAorZGVzY19kZWNfc3BlY2lmaWNfaW5mb19nZXRfc2l6ZSAoRGVjb2RlclNwZWNpZmljSW5mb0Rlc2NyaXB0b3IgKiBkc2lkKQoreworICBndWludDY0IHNpemUgPSAwOworICBndWludDY0IGV4dHJhX3NpemUgPSAwOworCisgIHNpemUgKz0gZGVzY19iYXNlX2Rlc2NyaXB0b3JfZ2V0X3NpemUgKCZkc2lkLT5iYXNlKTsKKyAgZXh0cmFfc2l6ZSArPSBzaXplb2YgKGd1aW50OCkgKiBkc2lkLT5sZW5ndGg7CisgIGRlc2NfYmFzZV9kZXNjcmlwdG9yX3NldF9zaXplICgmZHNpZC0+YmFzZSwgZXh0cmFfc2l6ZSk7CisgIHJldHVybiBzaXplICsgZXh0cmFfc2l6ZTsKK30KKworc3RhdGljIGd1aW50NjQKK2Rlc2NfZGVjX2NvbmZpZ19kZXNjcmlwdG9yX2dldF9zaXplIChEZWNvZGVyQ29uZmlnRGVzY3JpcHRvciAqIGRlY19kZXNjKQoreworICBndWludDY0IHNpemUgPSAwOworICBndWludDY0IGV4dHJhX3NpemUgPSAwOworCisgIHNpemUgKz0gZGVzY19iYXNlX2Rlc2NyaXB0b3JfZ2V0X3NpemUgKCZkZWNfZGVzYy0+YmFzZSk7CisgIC8qIG9iamVjdCB0eXBlICovCisgIGV4dHJhX3NpemUgKz0gc2l6ZW9mIChndWludDgpOworICAvKiBzdHJlYW0gdHlwZSAqLworICBleHRyYV9zaXplICs9IHNpemVvZiAoZ3VpbnQ4KTsKKyAgLyogYnVmZmVyIHNpemUgKi8KKyAgZXh0cmFfc2l6ZSArPSBzaXplb2YgKGd1aW50OCkgKiAzOworICAvKiBtYXggYml0cmF0ZSAqLworICBleHRyYV9zaXplICs9IHNpemVvZiAoZ3VpbnQzMik7CisgIC8qIGF2ZyBiaXRyYXRlICovCisgIGV4dHJhX3NpemUgKz0gc2l6ZW9mIChndWludDMyKTsKKyAgaWYgKGRlY19kZXNjLT5kZWNfc3BlY2lmaWNfaW5mbykgeworICAgIGV4dHJhX3NpemUgKz0gZGVzY19kZWNfc3BlY2lmaWNfaW5mb19nZXRfc2l6ZSAoZGVjX2Rlc2MtPmRlY19zcGVjaWZpY19pbmZvKTsKKyAgfQorCisgIGRlc2NfYmFzZV9kZXNjcmlwdG9yX3NldF9zaXplICgmZGVjX2Rlc2MtPmJhc2UsIGV4dHJhX3NpemUpOworICByZXR1cm4gc2l6ZSArIGV4dHJhX3NpemU7Cit9CisKK3N0YXRpYyBndWludDY0CitkZXNjX2VzX2Rlc2NyaXB0b3JfZ2V0X3NpemUgKEVTRGVzY3JpcHRvciAqIGVzKQoreworICBndWludDY0IHNpemUgPSAwOworICBndWludDY0IGV4dHJhX3NpemUgPSAwOworCisgIHNpemUgKz0gZGVzY19iYXNlX2Rlc2NyaXB0b3JfZ2V0X3NpemUgKCZlcy0+YmFzZSk7CisgIC8qIGlkICovCisgIGV4dHJhX3NpemUgKz0gc2l6ZW9mIChndWludDE2KTsKKyAgLyogZmxhZ3MgKi8KKyAgZXh0cmFfc2l6ZSArPSBzaXplb2YgKGd1aW50OCk7CisgIC8qIGRlcGVuZHNfb25fZXNfaWQgKi8KKyAgaWYgKGVzLT5mbGFncyAmIDB4ODApIHsKKyAgICBleHRyYV9zaXplICs9IHNpemVvZiAoZ3VpbnQxNik7CisgIH0KKyAgaWYgKGVzLT5mbGFncyAmIDB4NDApIHsKKyAgICAvKiB1cmxfbGVuZ3RoICovCisgICAgZXh0cmFfc2l6ZSArPSBzaXplb2YgKGd1aW50OCk7CisgICAgLyogdXJsICovCisgICAgZXh0cmFfc2l6ZSArPSBzaXplb2YgKGdjaGFyKSAqIGVzLT51cmxfbGVuZ3RoOworICB9CisgIGlmIChlcy0+ZmxhZ3MgJiAweDIwKSB7CisgICAgLyogb2NyX2VzX2lkICovCisgICAgZXh0cmFfc2l6ZSArPSBzaXplb2YgKGd1aW50MTYpOworICB9CisKKyAgZXh0cmFfc2l6ZSArPSBkZXNjX2RlY19jb25maWdfZGVzY3JpcHRvcl9nZXRfc2l6ZSAoJmVzLT5kZWNfY29uZl9kZXNjKTsKKyAgZXh0cmFfc2l6ZSArPSBkZXNjX3NsX2NvbmZpZ19kZXNjcmlwdG9yX2dldF9zaXplICgmZXMtPnNsX2NvbmZfZGVzYyk7CisKKyAgZGVzY19iYXNlX2Rlc2NyaXB0b3Jfc2V0X3NpemUgKCZlcy0+YmFzZSwgZXh0cmFfc2l6ZSk7CisKKyAgcmV0dXJuIHNpemUgKyBleHRyYV9zaXplOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2Rlc2NfZXNfZGVzY3JpcHRvcl9jaGVja19zdHJlYW1fZGVwZW5kZW5jeSAoRVNEZXNjcmlwdG9yICogZXMpCit7CisgIHJldHVybiBlcy0+ZmxhZ3MgJiAweDgwOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2Rlc2NfZXNfZGVzY3JpcHRvcl9jaGVja191cmxfZmxhZyAoRVNEZXNjcmlwdG9yICogZXMpCit7CisgIHJldHVybiBlcy0+ZmxhZ3MgJiAweDQwOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2Rlc2NfZXNfZGVzY3JpcHRvcl9jaGVja19vY3IgKEVTRGVzY3JpcHRvciAqIGVzKQoreworICByZXR1cm4gZXMtPmZsYWdzICYgMHgyMDsKK30KKworLyogQ29weS9TZXJpYWxpemF0aW9ucyBGdW5jdGlvbnMgYmVsb3cgKi8KKworc3RhdGljIGd1aW50NjQKK2Rlc2NfYmFzZV9kZXNjcmlwdG9yX2NvcHlfZGF0YSAoQmFzZURlc2NyaXB0b3IgKiBkZXNjLCBndWludDggKiogYnVmZmVyLAorICAgIGd1aW50NjQgKiBzaXplLCBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgcHJvcF9jb3B5X3VpbnQ4IChkZXNjLT50YWcsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQ4X2FycmF5IChkZXNjLT5zaXplLCBleHBhbmRhYmxlX3NpemVfZ2V0X2xlbmd0aCAoZGVzYy0+c2l6ZSwgNCksCisgICAgICBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHJldHVybiBvcmlnaW5hbF9vZmZzZXQgLSAqb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorZGVzY19zbF9jb25maWdfZGVzY3JpcHRvcl9jb3B5X2RhdGEgKFNMQ29uZmlnRGVzY3JpcHRvciAqIGRlc2MsCisgICAgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWRlc2NfYmFzZV9kZXNjcmlwdG9yX2NvcHlfZGF0YSAoJmRlc2MtPmJhc2UsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisgIC8qIHByZWRlZmluZWQgYXR0cmlidXRlICovCisgIHByb3BfY29weV91aW50OCAoZGVzYy0+cHJlZGVmaW5lZCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorZGVzY19kZWNfc3BlY2lmaWNfaW5mb19jb3B5X2RhdGEgKERlY29kZXJTcGVjaWZpY0luZm9EZXNjcmlwdG9yICogZGVzYywKKyAgICBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghZGVzY19iYXNlX2Rlc2NyaXB0b3JfY29weV9kYXRhICgmZGVzYy0+YmFzZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcHJvcF9jb3B5X3VpbnQ4X2FycmF5IChkZXNjLT5kYXRhLCBkZXNjLT5sZW5ndGgsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2Rlc2NfZGVjX2NvbmZpZ19kZXNjcmlwdG9yX2NvcHlfZGF0YSAoRGVjb2RlckNvbmZpZ0Rlc2NyaXB0b3IgKiBkZXNjLAorICAgIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLCBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFkZXNjX2Jhc2VfZGVzY3JpcHRvcl9jb3B5X2RhdGEgKCZkZXNjLT5iYXNlLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHByb3BfY29weV91aW50OCAoZGVzYy0+b2JqZWN0X3R5cGUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICBwcm9wX2NvcHlfdWludDggKGRlc2MtPnN0cmVhbV90eXBlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50OF9hcnJheSAoZGVzYy0+YnVmZmVyX3NpemVfREIsIDMsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICBwcm9wX2NvcHlfdWludDMyIChkZXNjLT5tYXhfYml0cmF0ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyIChkZXNjLT5hdmdfYml0cmF0ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGlmIChkZXNjLT5kZWNfc3BlY2lmaWNfaW5mbykgeworICAgIGlmICghZGVzY19kZWNfc3BlY2lmaWNfaW5mb19jb3B5X2RhdGEgKGRlc2MtPmRlY19zcGVjaWZpY19pbmZvLCBidWZmZXIsCisgICAgICAgICAgICBzaXplLCBvZmZzZXQpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworZ3VpbnQ2NAorZGVzY19lc19kZXNjcmlwdG9yX2NvcHlfZGF0YSAoRVNEZXNjcmlwdG9yICogZGVzYywgZ3VpbnQ4ICoqIGJ1ZmZlciwKKyAgICBndWludDY0ICogc2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIC8qIG11c3QgY2FsbCB0aGlzIHR3aWNlIHRvIGhhdmUgc2l6ZSBmaWVsZHMgb2YgYWxsIGNvbnRhaW5lZCBkZXNjcmlwdG9ycyBzZXQKKyAgICogY29ycmVjdGx5LCBhbmQgdG8gaGF2ZSB0aGUgc2l6ZSBvZiB0aGUgc2l6ZSBmaWVsZHMgdGFrZW4gaW50byBhY2NvdW50ICovCisgIGRlc2NfZXNfZGVzY3JpcHRvcl9nZXRfc2l6ZSAoZGVzYyk7CisgIGRlc2NfZXNfZGVzY3JpcHRvcl9nZXRfc2l6ZSAoZGVzYyk7CisKKyAgaWYgKCFkZXNjX2Jhc2VfZGVzY3JpcHRvcl9jb3B5X2RhdGEgKCZkZXNjLT5iYXNlLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvKiBpZCBhbmQgZmxhZ3MgKi8KKyAgcHJvcF9jb3B5X3VpbnQxNiAoZGVzYy0+aWQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQ4IChkZXNjLT5mbGFncywgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGlmIChkZXNjX2VzX2Rlc2NyaXB0b3JfY2hlY2tfc3RyZWFtX2RlcGVuZGVuY3kgKGRlc2MpKSB7CisgICAgcHJvcF9jb3B5X3VpbnQxNiAoZGVzYy0+ZGVwZW5kc19vbl9lc19pZCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICB9CisKKyAgaWYgKGRlc2NfZXNfZGVzY3JpcHRvcl9jaGVja191cmxfZmxhZyAoZGVzYykpIHsKKyAgICBwcm9wX2NvcHlfc2l6ZV9zdHJpbmcgKGRlc2MtPnVybF9zdHJpbmcsIGRlc2MtPnVybF9sZW5ndGgsIGJ1ZmZlciwgc2l6ZSwKKyAgICAgICAgb2Zmc2V0KTsKKyAgfQorCisgIGlmIChkZXNjX2VzX2Rlc2NyaXB0b3JfY2hlY2tfb2NyIChkZXNjKSkgeworICAgIHByb3BfY29weV91aW50MTYgKGRlc2MtPm9jcl9lc19pZCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICB9CisKKyAgaWYgKCFkZXNjX2RlY19jb25maWdfZGVzY3JpcHRvcl9jb3B5X2RhdGEgKCZkZXNjLT5kZWNfY29uZl9kZXNjLCBidWZmZXIsIHNpemUsCisgICAgICAgICAgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFkZXNjX3NsX2NvbmZpZ19kZXNjcmlwdG9yX2NvcHlfZGF0YSAoJmRlc2MtPnNsX2NvbmZfZGVzYywgYnVmZmVyLCBzaXplLAorICAgICAgICAgIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9kZXNjcmlwdG9ycy5oIGIvZ3N0L2lzb21wNC9kZXNjcmlwdG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NzI1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L2Rlc2NyaXB0b3JzLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qIFF1aWNrdGltZSBtdXhlciBwbHVnaW4gZm9yIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoaWFnbyBTb3VzYSBTYW50b3MgPHRoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKgorICogVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIFNvdXJjZSBDb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlLgorICogU2VlIGZ1cnRoZXIgZXhwbGFuYXRpb24gYXR0YWNoZWQgaW4gTGljZW5zZSBTdGF0ZW1lbnQgKGRpc3RyaWJ1dGVkIGluIHRoZSBmaWxlCisgKiBMSUNFTlNFKS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX0RFU0NSSVBUT1JTX0hfXworI2RlZmluZSBfX0RFU0NSSVBUT1JTX0hfXworCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInByb3BlcnRpZXMuaCIKKworLyoKKyAqIFRhZ3MgZm9yIGRlc2NyaXB0b3IgKGVhY2gga2luZCBpcyByZXByZXNlbnRlZCBieSBhIG51bWJlciwgaW5zdGVhZCBvZiBmb3VyY2MgYXMgaW4gYXRvbXMpCisgKi8KKyNkZWZpbmUgT0JKRUNUX0RFU0NfVEFHICAgICAgICAgICAgMHgwMQorI2RlZmluZSBJTklUX09CSkVDVF9ERVNDX1RBRyAgICAgICAweDAyCisjZGVmaW5lIEVTX0RFU0NSSVBUT1JfVEFHICAgICAgICAgIDB4MDMKKyNkZWZpbmUgREVDT0RFUl9DT05GSUdfREVTQ19UQUcgICAgMHgwNAorI2RlZmluZSBERUNPREVSX1NQRUNJRklDX0lORk9fVEFHICAweDA1CisjZGVmaW5lIFNMX0NPTkZJR19ERVNDX1RBRyAgICAgICAgIDB4MDYKKyNkZWZpbmUgRVNfSURfSU5DX1RBRyAgICAgICAgICAgICAgMHgwRQorI2RlZmluZSBNUDRfSU5JVF9PQkpFQ1RfREVTQ19UQUcgICAweDEwCisKKyNkZWZpbmUgRVNEU19PQkpFQ1RfVFlQRV9NUEVHMV9QMyAgICAgICAweDZCCisjZGVmaW5lIEVTRFNfT0JKRUNUX1RZUEVfTVBFRzJfUDdfTUFJTiAgMHg2NgorI2RlZmluZSBFU0RTX09CSkVDVF9UWVBFX01QRUc0X1A3X0xDICAgIDB4NjcKKyNkZWZpbmUgRVNEU19PQkpFQ1RfVFlQRV9NUEVHNF9QN19TU1IgICAweDY4CisjZGVmaW5lIEVTRFNfT0JKRUNUX1RZUEVfTVBFRzRfUDIgICAgICAgMHgyMAorI2RlZmluZSBFU0RTX09CSkVDVF9UWVBFX01QRUc0X1AzICAgICAgIDB4NDAKKworI2RlZmluZSBFU0RTX1NUUkVBTV9UWVBFX1ZJU1VBTCAgICAgICAgIDB4MDQKKyNkZWZpbmUgRVNEU19TVFJFQU1fVFlQRV9BVURJTyAgICAgICAgICAweDA1CisKKwordHlwZWRlZiBzdHJ1Y3QgX0Jhc2VEZXNjcmlwdG9yCit7CisgIGd1aW50OCB0YWc7CisgIC8qIHRoZSBmaXJzdCBiaXQgb2YgZWFjaCBieXRlIGluZGljYXRlcyBpZiB0aGUgbmV4dCBieXRlIHNob3VsZCBiZSB1c2VkICovCisgIGd1aW50OCBzaXplWzRdOworfSBCYXNlRGVzY3JpcHRvcjsKKwordHlwZWRlZiBzdHJ1Y3QgX1NMQ29uZmlnRGVzY3JpcHRvcgoreworICBCYXNlRGVzY3JpcHRvciBiYXNlOworCisgIGd1aW50OCBwcmVkZWZpbmVkOyAgICAgICAgICAgICAgLyogZXZlcnl0aGluZyBpcyBzdXBwb3NlZCBwcmVkZWZpbmVkICovCit9IFNMQ29uZmlnRGVzY3JpcHRvcjsKKwordHlwZWRlZiBzdHJ1Y3QgX0RlY29kZXJTcGVjaWZpY0luZm9EZXNjcmlwdG9yCit7CisgIEJhc2VEZXNjcmlwdG9yIGJhc2U7CisgIGd1aW50MzIgbGVuZ3RoOworICBndWludDggKmRhdGE7Cit9IERlY29kZXJTcGVjaWZpY0luZm9EZXNjcmlwdG9yOworCit0eXBlZGVmIHN0cnVjdCBfRGVjb2RlckNvbmZpZ0Rlc2NyaXB0b3IgeworICBCYXNlRGVzY3JpcHRvciBiYXNlOworCisgIGd1aW50OCBvYmplY3RfdHlwZTsKKworICAvKiBmb2xsb3dpbmcgYXJlIGNvbmRlbnNlZCBpbnRvIHN0cmVhbVR5cGU6CisgICAqIGJpdCg2KSBzdHJlYW1UeXBlOworICAgKiBiaXQoMSkgdXBTdHJlYW07CisgICAqIGNvbnN0IGJpdCgxKSByZXNlcnZlZD0xOworICAqLworICBndWludDggc3RyZWFtX3R5cGU7CisKKyAgZ3VpbnQ4IGJ1ZmZlcl9zaXplX0RCWzNdOworICBndWludDMyIG1heF9iaXRyYXRlOworICBndWludDMyIGF2Z19iaXRyYXRlOworCisgIERlY29kZXJTcGVjaWZpY0luZm9EZXNjcmlwdG9yICpkZWNfc3BlY2lmaWNfaW5mbzsKK30gRGVjb2RlckNvbmZpZ0Rlc2NyaXB0b3I7CisKK3R5cGVkZWYgc3RydWN0IF9FU0Rlc2NyaXB0b3IKK3sKKyAgQmFzZURlc2NyaXB0b3IgYmFzZTsKKworICBndWludDE2IGlkOworCisgIC8qIGZsYWdzIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmc6CisgICAqIGJpdCgxKSBzdHJlYW1EZXBlbmRlbmNlRmxhZzsKKyAgICogYml0KDEpIFVSTF9GbGFnOworICAgKiBiaXQoMSkgT0NSc3RyZWFtRmxhZzsKKyAgICogYml0KDUpIHN0cmVhbVByaW9yaXR5OworICAgKi8KKyAgZ3VpbnQ4IGZsYWdzOworCisgIGd1aW50MTYgZGVwZW5kc19vbl9lc19pZDsKKyAgZ3VpbnQ4IHVybF9sZW5ndGg7ICAgICAgICAgICAgICAvKiBvbmx5IGlmIFVSTF9mbGFnIGlzIHNldCAqLworICBndWludDggKnVybF9zdHJpbmc7ICAgICAgICAgICAgIC8qIHNpemUgaXMgdXJsX2xlbmd0aCAqLworCisgIGd1aW50MTYgb2NyX2VzX2lkOyAgICAgICAgICAgICAgLyogb25seSBpZiBPQ1JzdHJlYW1GbGFnIGlzIHNldCAqLworCisgIERlY29kZXJDb25maWdEZXNjcmlwdG9yIGRlY19jb25mX2Rlc2M7CisgIFNMQ29uZmlnRGVzY3JpcHRvciBzbF9jb25mX2Rlc2M7CisKKyAgLyogb3B0aW9uYWwgcmVtYWluZGVyIG9mIEVTRGVzY3JpcHRvciBpcyBub3QgdXNlZCAqLworfSBFU0Rlc2NyaXB0b3I7CisKKy8qIC0tLSBGVU5DVElPTlMgLS0tICovCit2b2lkICAgIGRlc2NfZXNfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRVNEZXNjcmlwdG9yICplcyk7CitFU0Rlc2NyaXB0b3IgKmRlc2NfZXNfZGVzY3JpcHRvcl9uZXcgICAgICAgICAgICAgICAodm9pZCk7CitndWludDY0IGRlc2NfZXNfZGVzY3JpcHRvcl9jb3B5X2RhdGEgICAgICAgICAgICAgICAoRVNEZXNjcmlwdG9yICplcywgZ3VpbnQ4ICoqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50NjQgKnNpemUsIGd1aW50NjQgKm9mZnNldCk7Cit2b2lkICAgIGRlc2NfZXNfZGVzY3JpcHRvcl9jbGVhciAgICAgICAgICAgICAgICAgICAoRVNEZXNjcmlwdG9yICplcyk7CisKK0RlY29kZXJTcGVjaWZpY0luZm9EZXNjcmlwdG9yICpkZXNjX2RlY19zcGVjaWZpY19pbmZvX25ldyh2b2lkKTsKK3ZvaWQgICAgZGVzY19kZWNfc3BlY2lmaWNfaW5mb19mcmVlICAgICAgICAgICAgICAgIChEZWNvZGVyU3BlY2lmaWNJbmZvRGVzY3JpcHRvciAqZHNpZCk7Cit2b2lkICAgIGRlc2NfZGVjX3NwZWNpZmljX2luZm9fYWxsb2NfZGF0YSAgICAgICAgICAoRGVjb2RlclNwZWNpZmljSW5mb0Rlc2NyaXB0b3IgKmRzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBzaXplKTsKKworI2VuZGlmIC8qIF9fREVTQ1JJUFRPUlNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L2ZvdXJjYy5oIGIvZ3N0L2lzb21wNC9mb3VyY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTVjN2MwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9mb3VyY2MuaApAQCAtMCwwICsxLDM4NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisgLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKworI2lmbmRlZiBfX0ZPVVJDQ19IX18KKyNkZWZpbmUgX19GT1VSQ0NfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBGT1VSQ0NfbnVsbCAgICAgMHgwCisKKyNkZWZpbmUgRk9VUkNDXzJ2dXkgICAgIEdTVF9NQUtFX0ZPVVJDQygnMicsJ3YnLCd1JywneScpCisjZGVmaW5lIEZPVVJDQ19GTVA0ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ0YnLCdNJywnUCcsJzQnKQorI2RlZmluZSBGT1VSQ0NfSDI2NCAgICAgR1NUX01BS0VfRk9VUkNDKCdIJywnMicsJzYnLCc0JykKKyNkZWZpbmUgRk9VUkNDX0gyNjUgICAgIEdTVF9NQUtFX0ZPVVJDQygnSCcsJzInLCc2JywnNScpCisjZGVmaW5lIEZPVVJDQ19NQUMzICAgICBHU1RfTUFLRV9GT1VSQ0MoJ00nLCdBJywnQycsJzMnKQorI2RlZmluZSBGT1VSQ0NfTUFDNiAgICAgR1NUX01BS0VfRk9VUkNDKCdNJywnQScsJ0MnLCc2JykKKyNkZWZpbmUgRk9VUkNDX01QNFYgICAgIEdTVF9NQUtFX0ZPVVJDQygnTScsJ1AnLCc0JywnVicpCisjZGVmaW5lIEZPVVJDQ19QSUNUICAgICBHU1RfTUFLRV9GT1VSQ0MoJ1AnLCdJJywnQycsJ1QnKQorI2RlZmluZSBGT1VSQ0NfUURNMiAgICAgR1NUX01BS0VfRk9VUkNDKCdRJywnRCcsJ00nLCcyJykKKyNkZWZpbmUgRk9VUkNDX1NWUTMgICAgIEdTVF9NQUtFX0ZPVVJDQygnUycsJ1YnLCdRJywnMycpCisjZGVmaW5lIEZPVVJDQ19WUDMxICAgICBHU1RfTUFLRV9GT1VSQ0MoJ1YnLCdQJywnMycsJzEnKQorI2RlZmluZSBGT1VSQ0NfVlA4MCAgICAgR1NUX01BS0VfRk9VUkNDKCdWJywnUCcsJzgnLCcwJykKKyNkZWZpbmUgRk9VUkNDX1dSTEUgICAgIEdTVF9NQUtFX0ZPVVJDQygnVycsJ1InLCdMJywnRScpCisjZGVmaW5lIEZPVVJDQ19YTVBfICAgICBHU1RfTUFLRV9GT1VSQ0MoJ1gnLCdNJywnUCcsJ18nKQorI2RlZmluZSBGT1VSQ0NfWFZJRCAgICAgR1NUX01BS0VfRk9VUkNDKCdYJywnVicsJ0knLCdEJykKKyNkZWZpbmUgRk9VUkNDX19BUlQgICAgIEdTVF9NQUtFX0ZPVVJDQygweGE5LCdBJywnUicsJ1QnKQorI2RlZmluZSBGT1VSQ0NfX19fXyAgICAgR1NUX01BS0VfRk9VUkNDKCctJywnLScsJy0nLCctJykKKyNkZWZpbmUgRk9VUkNDX19faW4gICAgIEdTVF9NQUtFX0ZPVVJDQygnICcsJyAnLCdpJywnbicpCisjZGVmaW5lIEZPVVJDQ19fX3R5ICAgICBHU1RfTUFLRV9GT1VSQ0MoJyAnLCcgJywndCcsJ3knKQorI2RlZmluZSBGT1VSQ0NfX2FsYiAgICAgR1NUX01BS0VfRk9VUkNDKDB4YTksJ2EnLCdsJywnYicpCisjZGVmaW5lIEZPVVJDQ19fY3B5ICAgICBHU1RfTUFLRV9GT1VSQ0MoMHhhOSwnYycsJ3AnLCd5JykKKyNkZWZpbmUgRk9VUkNDX19kYXkgICAgIEdTVF9NQUtFX0ZPVVJDQygweGE5LCdkJywnYScsJ3knKQorI2RlZmluZSBGT1VSQ0NfX2RlcyAgICAgR1NUX01BS0VfRk9VUkNDKDB4YTksJ2QnLCdlJywncycpCisjZGVmaW5lIEZPVVJDQ19fZW5jICAgICBHU1RfTUFLRV9GT1VSQ0MoMHhhOSwnZScsJ24nLCdjJykKKyNkZWZpbmUgRk9VUkNDX19nZW4gICAgIEdTVF9NQUtFX0ZPVVJDQygweGE5LCAnZycsICdlJywgJ24nKQorI2RlZmluZSBGT1VSQ0NfX2dycCAgICAgR1NUX01BS0VfRk9VUkNDKDB4YTksJ2cnLCdyJywncCcpCisjZGVmaW5lIEZPVVJDQ19faW5mICAgICBHU1RfTUFLRV9GT1VSQ0MoMHhhOSwnaScsJ24nLCdmJykKKyNkZWZpbmUgRk9VUkNDX19seXIgICAgIEdTVF9NQUtFX0ZPVVJDQygweGE5LCdsJywneScsJ3InKQorI2RlZmluZSBGT1VSQ0NfX21wMyAgICAgR1NUX01BS0VfRk9VUkNDKCcuJywnbScsJ3AnLCczJykKKyNkZWZpbmUgRk9VUkNDX19uYW0gICAgIEdTVF9NQUtFX0ZPVVJDQygweGE5LCduJywnYScsJ20nKQorI2RlZmluZSBGT1VSQ0NfX3JlcSAgICAgR1NUX01BS0VfRk9VUkNDKDB4YTksJ3InLCdlJywncScpCisjZGVmaW5lIEZPVVJDQ19fdG9vICAgICBHU1RfTUFLRV9GT1VSQ0MoMHhhOSwndCcsJ28nLCdvJykKKyNkZWZpbmUgRk9VUkNDX193cnQgICAgIEdTVF9NQUtFX0ZPVVJDQygweGE5LCd3JywncicsJ3QnKQorI2RlZmluZSBGT1VSQ0NfYUFSVCAgICAgR1NUX01BS0VfRk9VUkNDKCdhJywnQScsJ1InLCdUJykKKyNkZWZpbmUgRk9VUkNDX2FjXzMgICAgIEdTVF9NQUtFX0ZPVVJDQygnYScsJ2MnLCctJywnMycpCisjZGVmaW5lIEZPVVJDQ19hZ3NtICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2EnLCdnJywncycsJ20nKQorI2RlZmluZSBGT1VSQ0NfYWxhYyAgICAgR1NUX01BS0VfRk9VUkNDKCdhJywnbCcsJ2EnLCdjJykKKyNkZWZpbmUgRk9VUkNDX2ZMYUMgICAgIEdTVF9NQUtFX0ZPVVJDQygnZicsJ0wnLCdhJywnQycpCisjZGVmaW5lIEZPVVJDQ19kZkxhICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2QnLCdmJywnTCcsJ2EnKQorI2RlZmluZSBGT1VSQ0NfYWxhdyAgICAgR1NUX01BS0VfRk9VUkNDKCdhJywnbCcsJ2EnLCd3JykKKyNkZWZpbmUgRk9VUkNDX2FsaXMgICAgIEdTVF9NQUtFX0ZPVVJDQygnYScsJ2wnLCdpJywncycpCisjZGVmaW5lIEZPVVJDQ19hcHBsICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2EnLCdwJywncCcsJ2wnKQorI2RlZmluZSBGT1VSQ0NfYXZjMSAgICAgR1NUX01BS0VfRk9VUkNDKCdhJywndicsJ2MnLCcxJykKKyNkZWZpbmUgRk9VUkNDX2F2YzMgICAgIEdTVF9NQUtFX0ZPVVJDQygnYScsJ3YnLCdjJywnMycpCisjZGVmaW5lIEZPVVJDQ19hdmNDICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2EnLCd2JywnYycsJ0MnKQorI2RlZmluZSBGT1VSQ0NfY2xpcCAgICAgR1NUX01BS0VfRk9VUkNDKCdjJywnbCcsJ2knLCdwJykKKyNkZWZpbmUgRk9VUkNDX2Ntb3YgICAgIEdTVF9NQUtFX0ZPVVJDQygnYycsJ20nLCdvJywndicpCisjZGVmaW5lIEZPVVJDQ19jbXZkICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2MnLCdtJywndicsJ2QnKQorI2RlZmluZSBGT1VSQ0NfY282NCAgICAgR1NUX01BS0VfRk9VUkNDKCdjJywnbycsJzYnLCc0JykKKyNkZWZpbmUgRk9VUkNDX2NvdnIgICAgIEdTVF9NQUtFX0ZPVVJDQygnYycsJ28nLCd2JywncicpCisjZGVmaW5lIEZPVVJDQ19jcGlsICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2MnLCdwJywnaScsJ2wnKQorI2RlZmluZSBGT1VSQ0NfY3BydCAgICAgR1NUX01BS0VfRk9VUkNDKCdjJywncCcsJ3InLCd0JykKKyNkZWZpbmUgRk9VUkNDX2NyZ24gICAgIEdTVF9NQUtFX0ZPVVJDQygnYycsJ3InLCdnJywnbicpCisjZGVmaW5lIEZPVVJDQ19jdGFiICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2MnLCd0JywnYScsJ2InKQorI2RlZmluZSBGT1VSQ0NfY3R0cyAgICAgR1NUX01BS0VfRk9VUkNDKCdjJywndCcsJ3QnLCdzJykKKyNkZWZpbmUgRk9VUkNDX2NzbGcgICAgIEdTVF9NQUtFX0ZPVVJDQygnYycsJ3MnLCdsJywnZycpCisjZGVmaW5lIEZPVVJDQ19kMjYzICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2QnLCcyJywnNicsJzMnKQorI2RlZmluZSBGT1VSQ0NfZGFjMyAgICAgR1NUX01BS0VfRk9VUkNDKCdkJywnYScsJ2MnLCczJykKKyNkZWZpbmUgRk9VUkNDX2RhbXIgICAgIEdTVF9NQUtFX0ZPVVJDQygnZCcsJ2EnLCdtJywncicpCisjZGVmaW5lIEZPVVJDQ19kYXRhICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2QnLCdhJywndCcsJ2EnKQorI2RlZmluZSBGT1VSQ0NfZGNvbSAgICAgR1NUX01BS0VfRk9VUkNDKCdkJywnYycsJ28nLCdtJykKKyNkZWZpbmUgRk9VUkNDX2Rlc2MgICAgIEdTVF9NQUtFX0ZPVVJDQygnZCcsJ2UnLCdzJywnYycpCisjZGVmaW5lIEZPVVJDQ19kaGxyICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2QnLCdoJywnbCcsJ3InKQorI2RlZmluZSBGT1VSQ0NfZGluZiAgICAgR1NUX01BS0VfRk9VUkNDKCdkJywnaScsJ24nLCdmJykKKyNkZWZpbmUgRk9VUkNDX2Rpc2MgICAgIEdTVF9NQUtFX0ZPVVJDQygnZCcsJ2knLCdzJywnYycpCisjZGVmaW5lIEZPVVJDQ19kaXNrICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2QnLCdpJywncycsJ2snKQorI2RlZmluZSBGT1VSQ0NfZHJhYyAgICAgR1NUX01BS0VfRk9VUkNDKCdkJywncicsJ2EnLCdjJykKKyNkZWZpbmUgRk9VUkNDX2RyZWYgICAgIEdTVF9NQUtFX0ZPVVJDQygnZCcsJ3InLCdlJywnZicpCisjZGVmaW5lIEZPVVJDQ19kcm1pICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2QnLCdyJywnbScsJ2knKQorI2RlZmluZSBGT1VSQ0NfZHJtcyAgICAgR1NUX01BS0VfRk9VUkNDKCdkJywncicsJ20nLCdzJykKKyNkZWZpbmUgRk9VUkNDX2R2Y3AgICAgIEdTVF9NQUtFX0ZPVVJDQygnZCcsJ3YnLCdjJywncCcpCisjZGVmaW5lIEZPVVJDQ19kdmNfICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2QnLCd2JywnYycsJyAnKQorI2RlZmluZSBGT1VSQ0NfZHY1cCAgICAgR1NUX01BS0VfRk9VUkNDKCdkJywndicsJzUnLCdwJykKKyNkZWZpbmUgRk9VUkNDX2R2NW4gICAgIEdTVF9NQUtFX0ZPVVJDQygnZCcsJ3YnLCc1JywnbicpCisjZGVmaW5lIEZPVVJDQ19lZHRzICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2UnLCdkJywndCcsJ3MnKQorI2RlZmluZSBGT1VSQ0NfZWxzdCAgICAgR1NUX01BS0VfRk9VUkNDKCdlJywnbCcsJ3MnLCd0JykKKyNkZWZpbmUgRk9VUkNDX2VuZGEgICAgIEdTVF9NQUtFX0ZPVVJDQygnZScsJ24nLCdkJywnYScpCisjZGVmaW5lIEZPVVJDQ19lc2RzICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2UnLCdzJywnZCcsJ3MnKQorI2RlZmluZSBGT1VSQ0NfZm1wNCAgICAgR1NUX01BS0VfRk9VUkNDKCdmJywnbScsJ3AnLCc0JykKKyNkZWZpbmUgRk9VUkNDX2ZyZWUgICAgIEdTVF9NQUtFX0ZPVVJDQygnZicsJ3InLCdlJywnZScpCisjZGVmaW5lIEZPVVJDQ19mcm1hICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2YnLCdyJywnbScsJ2EnKQorI2RlZmluZSBGT1VSQ0NfZnR5cCAgICAgR1NUX01BS0VfRk9VUkNDKCdmJywndCcsJ3knLCdwJykKKyNkZWZpbmUgRk9VUkNDX2Z0YWIgICAgIEdTVF9NQUtFX0ZPVVJDQygnZicsJ3QnLCdhJywnYicpCisjZGVmaW5lIEZPVVJDQ19nYW1hICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2cnLCdhJywnbScsJ2EnKQorI2RlZmluZSBGT1VSQ0NfZ2xibCAgICAgR1NUX01BS0VfRk9VUkNDKCdnJywnbCcsJ2InLCdsJykKKyNkZWZpbmUgRk9VUkNDX2dtaGQgICAgIEdTVF9NQUtFX0ZPVVJDQygnZycsJ20nLCdoJywnZCcpCisjZGVmaW5lIEZPVVJDQ19nbWluICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2cnLCdtJywnaScsJ24nKQorI2RlZmluZSBGT1VSQ0NfZ25yZSAgICAgR1NUX01BS0VfRk9VUkNDKCdnJywnbicsJ3InLCdlJykKKyNkZWZpbmUgRk9VUkNDX2gyNjMgICAgIEdTVF9NQUtFX0ZPVVJDQygnaCcsJzInLCc2JywnMycpCisjZGVmaW5lIEZPVVJDQ19oZGxyICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2gnLCdkJywnbCcsJ3InKQorI2RlZmluZSBGT1VSQ0NfaGV2MSAgICAgR1NUX01BS0VfRk9VUkNDKCdoJywnZScsJ3YnLCcxJykKKyNkZWZpbmUgRk9VUkNDX2hpbnQgICAgIEdTVF9NQUtFX0ZPVVJDQygnaCcsJ2knLCduJywndCcpCisjZGVmaW5lIEZPVVJDQ19obWhkICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2gnLCdtJywnaCcsJ2QnKQorI2RlZmluZSBGT1VSQ0NfaG5kbCAgICAgR1NUX01BS0VfRk9VUkNDKCdoJywnbicsJ2QnLCdsJykKKyNkZWZpbmUgRk9VUkNDX2hudGkgICAgIEdTVF9NQUtFX0ZPVVJDQygnaCcsJ24nLCd0JywnaScpCisjZGVmaW5lIEZPVVJDQ19odmMxICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2gnLCd2JywnYycsJzEnKQorI2RlZmluZSBGT1VSQ0NfaHZjQyAgICAgR1NUX01BS0VfRk9VUkNDKCdoJywndicsJ2MnLCdDJykKKyNkZWZpbmUgRk9VUkNDX2lsc3QgICAgIEdTVF9NQUtFX0ZPVVJDQygnaScsJ2wnLCdzJywndCcpCisjZGVmaW5lIEZPVVJDQ19pbWE0ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2knLCdtJywnYScsJzQnKQorI2RlZmluZSBGT1VSQ0NfaW1hcCAgICAgR1NUX01BS0VfRk9VUkNDKCdpJywnbScsJ2EnLCdwJykKKyNkZWZpbmUgRk9VUkNDX2luMjQgICAgIEdTVF9NQUtFX0ZPVVJDQygnaScsJ24nLCcyJywnNCcpCisjZGVmaW5lIEZPVVJDQ19qcDJjICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2onLCdwJywnMicsJ2MnKQorI2RlZmluZSBGT1VSQ0NfanBlZyAgICAgR1NUX01BS0VfRk9VUkNDKCdqJywncCcsJ2UnLCdnJykKKyNkZWZpbmUgRk9VUkNDX2tleXcgICAgIEdTVF9NQUtFX0ZPVVJDQygnaycsJ2UnLCd5JywndycpCisjZGVmaW5lIEZPVVJDQ19rbWF0ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2snLCdtJywnYScsJ3QnKQorI2RlZmluZSBGT1VSQ0Nfa3l3ZCAgICAgR1NUX01BS0VfRk9VUkNDKCdrJywneScsJ3cnLCdkJykKKyNkZWZpbmUgRk9VUkNDX2xvYWQgICAgIEdTVF9NQUtFX0ZPVVJDQygnbCcsJ28nLCdhJywnZCcpCisjZGVmaW5lIEZPVVJDQ19tYXR0ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ20nLCdhJywndCcsJ3QnKQorI2RlZmluZSBGT1VSQ0NfbWRhdCAgICAgR1NUX01BS0VfRk9VUkNDKCdtJywnZCcsJ2EnLCd0JykKKyNkZWZpbmUgRk9VUkNDX21kaGQgICAgIEdTVF9NQUtFX0ZPVVJDQygnbScsJ2QnLCdoJywnZCcpCisjZGVmaW5lIEZPVVJDQ19tZGlhICAgICBHU1RfTUFLRV9GT1VSQ0MoJ20nLCdkJywnaScsJ2EnKQorI2RlZmluZSBGT1VSQ0NfbWRpciAgICAgR1NUX01BS0VfRk9VUkNDKCdtJywnZCcsJ2knLCdyJykKKyNkZWZpbmUgRk9VUkNDX21lYW4gICAgIEdTVF9NQUtFX0ZPVVJDQygnbScsJ2UnLCdhJywnbicpCisjZGVmaW5lIEZPVVJDQ19tZXRhICAgICBHU1RfTUFLRV9GT1VSQ0MoJ20nLCdlJywndCcsJ2EnKQorI2RlZmluZSBGT1VSQ0NfbWhsciAgICAgR1NUX01BS0VfRk9VUkNDKCdtJywnaCcsJ2wnLCdyJykKKyNkZWZpbmUgRk9VUkNDX21pbmYgICAgIEdTVF9NQUtFX0ZPVVJDQygnbScsJ2knLCduJywnZicpCisjZGVmaW5lIEZPVVJDQ19tb292ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ20nLCdvJywnbycsJ3YnKQorI2RlZmluZSBGT1VSQ0NfbXA0YSAgICAgR1NUX01BS0VfRk9VUkNDKCdtJywncCcsJzQnLCdhJykKKyNkZWZpbmUgRk9VUkNDX21wNHMgICAgIEdTVF9NQUtFX0ZPVVJDQygnbScsJ3AnLCc0JywncycpCisjZGVmaW5lIEZPVVJDQ19tcDRzICAgICBHU1RfTUFLRV9GT1VSQ0MoJ20nLCdwJywnNCcsJ3MnKQorI2RlZmluZSBGT1VSQ0NfbXA0diAgICAgR1NUX01BS0VfRk9VUkNDKCdtJywncCcsJzQnLCd2JykKKyNkZWZpbmUgRk9VUkNDX25hbWUgICAgIEdTVF9NQUtFX0ZPVVJDQygnbicsJ2EnLCdtJywnZScpCisjZGVmaW5lIEZPVVJDQ19uY2xjICAgICBHU1RfTUFLRV9GT1VSQ0MoJ24nLCdjJywnbCcsJ2MnKQorI2RlZmluZSBGT1VSQ0NfbmNseCAgICAgR1NUX01BS0VfRk9VUkNDKCduJywnYycsJ2wnLCd4JykKKyNkZWZpbmUgRk9VUkNDX29wdXMgICAgIEdTVF9NQUtFX0ZPVVJDQygnTycsJ3AnLCd1JywncycpCisjZGVmaW5lIEZPVVJDQ19kb3BzICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2QnLCdPJywncCcsJ3MnKQorI2RlZmluZSBGT1VSQ0NfcGFzcCAgICAgR1NUX01BS0VfRk9VUkNDKCdwJywnYScsJ3MnLCdwJykKKyNkZWZpbmUgRk9VUkNDX2NvbHIgICAgIEdTVF9NQUtFX0ZPVVJDQygnYycsJ28nLCdsJywncicpCisjZGVmaW5lIEZPVVJDQ19jbGFwICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2MnLCdsJywnYScsJ3AnKQorI2RlZmluZSBGT1VSQ0NfdGFwdCAgICAgR1NUX01BS0VfRk9VUkNDKCd0JywnYScsJ3AnLCd0JykKKyNkZWZpbmUgRk9VUkNDX2NsZWYgICAgIEdTVF9NQUtFX0ZPVVJDQygnYycsJ2wnLCdlJywnZicpCisjZGVmaW5lIEZPVVJDQ19wcm9mICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3AnLCdyJywnbycsJ2YnKQorI2RlZmluZSBGT1VSQ0NfZW5vZiAgICAgR1NUX01BS0VfRk9VUkNDKCdlJywnbicsJ28nLCdmJykKKyNkZWZpbmUgRk9VUkNDX2ZpZWwgICAgIEdTVF9NQUtFX0ZPVVJDQygnZicsJ2knLCdlJywnbCcpCisjZGVmaW5lIEZPVVJDQ19wY3N0ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3AnLCdjJywncycsJ3QnKQorI2RlZmluZSBGT1VSQ0NfcGdhcCAgICAgR1NUX01BS0VfRk9VUkNDKCdwJywnZycsJ2EnLCdwJykKKyNkZWZpbmUgRk9VUkNDX3BuZyAgICAgIEdTVF9NQUtFX0ZPVVJDQygncCcsJ24nLCdnJywnICcpCisjZGVmaW5lIEZPVVJDQ19wbm90ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3AnLCduJywnbycsJ3QnKQorI2RlZmluZSBGT1VSQ0NfcXRfXyAgICAgR1NUX01BS0VfRk9VUkNDKCdxJywndCcsJyAnLCcgJykKKyNkZWZpbmUgRk9VUkNDX3F0aW0gICAgIEdTVF9NQUtFX0ZPVVJDQygncScsJ3QnLCdpJywnbScpCisjZGVmaW5lIEZPVVJDQ19yYXdfICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3InLCdhJywndycsJyAnKQorI2RlZmluZSBGT1VSQ0NfcmRyZiAgICAgR1NUX01BS0VfRk9VUkNDKCdyJywnZCcsJ3InLCdmJykKKyNkZWZpbmUgRk9VUkNDX3JsZV8gICAgIEdTVF9NQUtFX0ZPVVJDQygncicsJ2wnLCdlJywnICcpCisjZGVmaW5lIEZPVVJDQ19ybWRhICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3InLCdtJywnZCcsJ2EnKQorI2RlZmluZSBGT1VSQ0Nfcm1kciAgICAgR1NUX01BS0VfRk9VUkNDKCdyJywnbScsJ2QnLCdyJykKKyNkZWZpbmUgRk9VUkNDX3JtcmEgICAgIEdTVF9NQUtFX0ZPVVJDQygncicsJ20nLCdyJywnYScpCisjZGVmaW5lIEZPVVJDQ19ybXZjICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3InLCdtJywndicsJ2MnKQorI2RlZmluZSBGT1VSQ0NfcnRwXyAgICAgR1NUX01BS0VfRk9VUkNDKCdyJywndCcsJ3AnLCcgJykKKyNkZWZpbmUgRk9VUkNDX3J0c3AgICAgIEdTVF9NQUtFX0ZPVVJDQygncicsJ3QnLCdzJywncCcpCisjZGVmaW5lIEZPVVJDQ19zMjYzICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCcyJywnNicsJzMnKQorI2RlZmluZSBGT1VSQ0Nfc2FtciAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywnYScsJ20nLCdyJykKKyNkZWZpbmUgRk9VUkNDX3Nhd2IgICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ2EnLCd3JywnYicpCisjZGVmaW5lIEZPVVJDQ19zYnRsICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCdiJywndCcsJ2wnKQorI2RlZmluZSBGT1VSQ0Nfc2RwXyAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywnZCcsJ3AnLCcgJykKKyNkZWZpbmUgRk9VUkNDX3NpZHggICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ2knLCdkJywneCcpCisjZGVmaW5lIEZPVVJDQ19za2lwICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCdrJywnaScsJ3AnKQorI2RlZmluZSBGT1VSQ0Nfc21oZCAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywnbScsJ2gnLCdkJykKKyNkZWZpbmUgRk9VUkNDX3NvYWEgICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ28nLCdhJywnYScpCisjZGVmaW5lIEZPVVJDQ19zb2FsICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCdvJywnYScsJ2wnKQorI2RlZmluZSBGT1VSQ0Nfc29hciAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywnbycsJ2EnLCdyJykKKyNkZWZpbmUgRk9VUkNDX3NvY28gICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ28nLCdjJywnbycpCisjZGVmaW5lIEZPVVJDQ19zb25tICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCdvJywnbicsJ20nKQorI2RlZmluZSBGT1VSQ0Nfc29zbiAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywnbycsJ3MnLCduJykKKyNkZWZpbmUgRk9VUkNDX3NvdW4gICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ28nLCd1JywnbicpCisjZGVmaW5lIEZPVVJDQ19zb3d0ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCdvJywndycsJ3QnKQorI2RlZmluZSBGT1VSQ0Nfc3RibCAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywndCcsJ2InLCdsJykKKyNkZWZpbmUgRk9VUkNDX3N0Y28gICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ3QnLCdjJywnbycpCisjZGVmaW5lIEZPVVJDQ19zdHBwICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCd0JywncCcsJ3AnKQorI2RlZmluZSBGT1VSQ0Nfc3RwcyAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywndCcsJ3AnLCdzJykKKyNkZWZpbmUgRk9VUkNDX3N0cmYgICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ3QnLCdyJywnZicpCisjZGVmaW5lIEZPVVJDQ19zdHJtICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCd0JywncicsJ20nKQorI2RlZmluZSBGT1VSQ0Nfc3RzYyAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywndCcsJ3MnLCdjJykKKyNkZWZpbmUgRk9VUkNDX3N0c2QgICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ3QnLCdzJywnZCcpCisjZGVmaW5lIEZPVVJDQ19zdHNzICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCd0JywncycsJ3MnKQorI2RlZmluZSBGT1VSQ0Nfc3RzeiAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywndCcsJ3MnLCd6JykKKyNkZWZpbmUgRk9VUkNDX3N0dHMgICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ3QnLCd0JywncycpCisjZGVmaW5lIEZPVVJDQ19zdHlwICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCd0JywneScsJ3AnKQorI2RlZmluZSBGT1VSQ0Nfc3VicCAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywndScsJ2InLCdwJykKKyNkZWZpbmUgRk9VUkNDX3N1YnQgICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ3UnLCdiJywndCcpCisjZGVmaW5lIEZPVVJDQ190ZXh0ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3QnLCdlJywneCcsJ3QnKQorI2RlZmluZSBGT1VSQ0NfdGNtaSAgICAgR1NUX01BS0VfRk9VUkNDKCd0JywnYycsJ20nLCdpJykKKyNkZWZpbmUgRk9VUkNDX3RraGQgICAgIEdTVF9NQUtFX0ZPVVJDQygndCcsJ2snLCdoJywnZCcpCisjZGVmaW5lIEZPVVJDQ190bWNkICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3QnLCdtJywnYycsJ2QnKQorI2RlZmluZSBGT1VSQ0NfdG1wbyAgICAgR1NUX01BS0VfRk9VUkNDKCd0JywnbScsJ3AnLCdvJykKKyNkZWZpbmUgRk9VUkNDX3RyYWsgICAgIEdTVF9NQUtFX0ZPVVJDQygndCcsJ3InLCdhJywnaycpCisjZGVmaW5lIEZPVVJDQ190cmVmICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3QnLCdyJywnZScsJ2YnKQorI2RlZmluZSBGT1VSQ0NfdHJrbiAgICAgR1NUX01BS0VfRk9VUkNDKCd0JywncicsJ2snLCduJykKKyNkZWZpbmUgRk9VUkNDX3R2ZW4gICAgIEdTVF9NQUtFX0ZPVVJDQygndCcsJ3YnLCdlJywnbicpCisjZGVmaW5lIEZPVVJDQ190dmVzICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3QnLCd2JywnZScsJ3MnKQorI2RlZmluZSBGT1VSQ0NfdHZzaCAgICAgR1NUX01BS0VfRk9VUkNDKCd0JywndicsJ3MnLCdoJykKKyNkZWZpbmUgRk9VUkNDX3R2c24gICAgIEdTVF9NQUtFX0ZPVVJDQygndCcsJ3YnLCdzJywnbicpCisjZGVmaW5lIEZPVVJDQ190d29zICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3QnLCd3JywnbycsJ3MnKQorI2RlZmluZSBGT1VSQ0NfdHgzZyAgICAgR1NUX01BS0VfRk9VUkNDKCd0JywneCcsJzMnLCdnJykKKyNkZWZpbmUgRk9VUkNDX3VkdGEgICAgIEdTVF9NQUtFX0ZPVVJDQygndScsJ2QnLCd0JywnYScpCisjZGVmaW5lIEZPVVJDQ191bGF3ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3UnLCdsJywnYScsJ3cnKQorI2RlZmluZSBGT1VSQ0NfdXJsXyAgICAgR1NUX01BS0VfRk9VUkNDKCd1JywncicsJ2wnLCcgJykKKyNkZWZpbmUgRk9VUkNDX3V1aWQgICAgIEdTVF9NQUtFX0ZPVVJDQygndScsJ3UnLCdpJywnZCcpCisjZGVmaW5lIEZPVVJDQ192MjEwICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3YnLCcyJywnMScsJzAnKQorI2RlZmluZSBGT1VSQ0NfdmNfMSAgICAgR1NUX01BS0VfRk9VUkNDKCd2JywnYycsJy0nLCcxJykKKyNkZWZpbmUgRk9VUkNDX3ZpZGUgICAgIEdTVF9NQUtFX0ZPVVJDQygndicsJ2knLCdkJywnZScpCisjZGVmaW5lIEZPVVJDQ192bWhkICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3YnLCdtJywnaCcsJ2QnKQorI2RlZmluZSBGT1VSQ0NfdnAwOCAgICAgR1NUX01BS0VfRk9VUkNDKCd2JywncCcsJzAnLCc4JykKKyNkZWZpbmUgRk9VUkNDX3ZwMDkgICAgIEdTVF9NQUtFX0ZPVVJDQygndicsJ3AnLCcwJywnOScpCisjZGVmaW5lIEZPVVJDQ194dmlkICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3gnLCd2JywnaScsJ2QnKQorI2RlZmluZSBGT1VSQ0Nfd2F2ZSAgICAgR1NUX01BS0VfRk9VUkNDKCd3JywnYScsJ3YnLCdlJykKKyNkZWZpbmUgRk9VUkNDX3dpZGUgICAgIEdTVF9NQUtFX0ZPVVJDQygndycsJ2knLCdkJywnZScpCisjZGVmaW5lIEZPVVJDQ196bGliICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3onLCdsJywnaScsJ2InKQorI2RlZmluZSBGT1VSQ0NfbHBjbSAgICAgR1NUX01BS0VfRk9VUkNDKCdsJywncCcsJ2MnLCdtJykKKworI2RlZmluZSBGT1VSQ0NfY2ZoZCAgICAgR1NUX01BS0VfRk9VUkNDKCdDJywnRicsJ0gnLCdEJykKKyNkZWZpbmUgRk9VUkNDX2FwNHggICAgIEdTVF9NQUtFX0ZPVVJDQygnYScsJ3AnLCc0JywneCcpCisjZGVmaW5lIEZPVVJDQ19hcDRoICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2EnLCdwJywnNCcsJ2gnKQorI2RlZmluZSBGT1VSQ0NfYXBjaCAgICAgR1NUX01BS0VfRk9VUkNDKCdhJywncCcsJ2MnLCdoJykKKyNkZWZpbmUgRk9VUkNDX2FwY24gICAgIEdTVF9NQUtFX0ZPVVJDQygnYScsJ3AnLCdjJywnbicpCisjZGVmaW5lIEZPVVJDQ19hcGNvICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2EnLCdwJywnYycsJ28nKQorI2RlZmluZSBGT1VSQ0NfYXBjcyAgICAgR1NUX01BS0VfRk9VUkNDKCdhJywncCcsJ2MnLCdzJykKKyNkZWZpbmUgRk9VUkNDX20xdiAgICAgIEdTVF9NQUtFX0ZPVVJDQygnbScsJzEnLCd2JywnICcpCisjZGVmaW5lIEZPVVJDQ192aXZvICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3YnLCdpJywndicsJ28nKQorI2RlZmluZSBGT1VSQ0Nfc2FpeiAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywnYScsJ2knLCd6JykKKyNkZWZpbmUgRk9VUkNDX3NhaW8gICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ2EnLCdpJywnbycpCisKKyNkZWZpbmUgRk9VUkNDXzNnZzYgICAgIEdTVF9NQUtFX0ZPVVJDQygnMycsJ2cnLCdnJywnNicpCisjZGVmaW5lIEZPVVJDQ18zZ2c3ICAgICBHU1RfTUFLRV9GT1VSQ0MoJzMnLCdnJywnZycsJzcnKQorI2RlZmluZSBGT1VSQ0NfM2dwNCAgICAgR1NUX01BS0VfRk9VUkNDKCczJywnZycsJ3AnLCc0JykKKyNkZWZpbmUgRk9VUkNDXzNncDYgICAgIEdTVF9NQUtFX0ZPVVJDQygnMycsJ2cnLCdwJywnNicpCisjZGVmaW5lIEZPVVJDQ18zZ3I2ICAgICBHU1RfTUFLRV9GT1VSQ0MoJzMnLCdnJywncicsJzYnKQorI2RlZmluZSBGT1VSQ0NfM2dfXyAgICAgR1NUX01BS0VfRk9VUkNDKCczJywnZycsMCwwKQorI2RlZmluZSBGT1VSQ0NfaXNtbCAgICAgR1NUX01BS0VfRk9VUkNDKCdpJywncycsJ20nLCdsJykKKyNkZWZpbmUgRk9VUkNDX2lzbzIgICAgIEdTVF9NQUtFX0ZPVVJDQygnaScsJ3MnLCdvJywnMicpCisjZGVmaW5lIEZPVVJDQ19pc29tICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2knLCdzJywnbycsJ20nKQorI2RlZmluZSBGT1VSQ0NfbXA0MSAgICAgR1NUX01BS0VfRk9VUkNDKCdtJywncCcsJzQnLCcxJykKKyNkZWZpbmUgRk9VUkNDX21wNDIgICAgIEdTVF9NQUtFX0ZPVVJDQygnbScsJ3AnLCc0JywnMicpCisjZGVmaW5lIEZPVVJDQ19waWZmICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3AnLCdpJywnZicsJ2YnKQorI2RlZmluZSBGT1VSQ0NfdGl0bCAgICAgR1NUX01BS0VfRk9VUkNDKCd0JywnaScsJ3QnLCdsJykKKworLyogU1ZRMyBmb3VyY2MgKi8KKyNkZWZpbmUgRk9VUkNDX1NFUUggICAgIEdTVF9NQUtFX0ZPVVJDQygnUycsJ0UnLCdRJywnSCcpCisjZGVmaW5lIEZPVVJDQ19TTUlfICAgICBHU1RfTUFLRV9GT1VSQ0MoJ1MnLCdNJywnSScsJyAnKQorCisvKiAzZ3BwIGFzc2V0IG1ldGEgZGF0YSBmb3VyY2MgKi8KKyNkZWZpbmUgRk9VUkNDX2FsYm0gICAgIEdTVF9NQUtFX0ZPVVJDQygnYScsJ2wnLCdiJywnbScpCisjZGVmaW5lIEZPVVJDQ19hdXRoICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2EnLCd1JywndCcsJ2gnKQorI2RlZmluZSBGT1VSQ0NfY2xzZiAgICAgR1NUX01BS0VfRk9VUkNDKCdjJywnbCcsJ3MnLCdmJykKKyNkZWZpbmUgRk9VUkNDX2RzY3AgICAgIEdTVF9NQUtFX0ZPVVJDQygnZCcsJ3MnLCdjJywncCcpCisjZGVmaW5lIEZPVVJDQ19sb2NpICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2wnLCdvJywnYycsJ2knKQorI2RlZmluZSBGT1VSQ0NfcGVyZiAgICAgR1NUX01BS0VfRk9VUkNDKCdwJywnZScsJ3InLCdmJykKKyNkZWZpbmUgRk9VUkNDX3J0bmcgICAgIEdTVF9NQUtFX0ZPVVJDQygncicsJ3QnLCduJywnZycpCisjZGVmaW5lIEZPVVJDQ195cnJjICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3knLCdyJywncicsJ2MnKQorCisvKiBtaXNjIHRhZyBzdHVmZiAqLworI2RlZmluZSBGT1VSQ0NfSUQzMiAgICAgR1NUX01BS0VfRk9VUkNDKCdJJywgJ0QnLCczJywnMicpCisKKy8qIElTTyBNb3Rpb24gSlBFRyAyMDAwIGZvdXJjYyAqLworI2RlZmluZSBGT1VSQ0NfY2RlZiAgICAgR1NUX01BS0VfRk9VUkNDKCdjJywnZCcsJ2UnLCdmJykKKyNkZWZpbmUgRk9VUkNDX2NtYXAgICAgIEdTVF9NQUtFX0ZPVVJDQygnYycsJ20nLCdhJywncCcpCisjZGVmaW5lIEZPVVJDQ19paGRyICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2knLCdoJywnZCcsJ3InKQorI2RlZmluZSBGT1VSQ0NfanAyaCAgICAgR1NUX01BS0VfRk9VUkNDKCdqJywncCcsJzInLCdoJykKKyNkZWZpbmUgRk9VUkNDX2pwMnggICAgIEdTVF9NQUtFX0ZPVVJDQygnaicsJ3AnLCcyJywneCcpCisjZGVmaW5lIEZPVVJDQ19tanAyICAgICBHU1RfTUFLRV9GT1VSQ0MoJ20nLCdqJywncCcsJzInKQorCisvKiBzb21lIGJ1Z2d5IGhhcmR3YXJlJ3Mgbm90aW9uIG9mIG1kaGQgKi8KKyNkZWZpbmUgRk9VUkNDX21oZHIgICAgIEdTVF9NQUtFX0ZPVVJDQygnbScsJ2gnLCdkJywncicpCisKKy8qIEZyYWdtZW50ZWQgTVA0ICovCisjZGVmaW5lIEZPVVJDQ19idHJ0ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2InLCd0JywncicsJ3QnKQorI2RlZmluZSBGT1VSQ0NfbWVoZCAgICAgR1NUX01BS0VfRk9VUkNDKCdtJywnZScsJ2gnLCdkJykKKyNkZWZpbmUgRk9VUkNDX21maGQgICAgIEdTVF9NQUtFX0ZPVVJDQygnbScsJ2YnLCdoJywnZCcpCisjZGVmaW5lIEZPVVJDQ19tZnJhICAgICBHU1RfTUFLRV9GT1VSQ0MoJ20nLCdmJywncicsJ2EnKQorI2RlZmluZSBGT1VSQ0NfbWZybyAgICAgR1NUX01BS0VfRk9VUkNDKCdtJywnZicsJ3InLCdvJykKKyNkZWZpbmUgRk9VUkNDX21vb2YgICAgIEdTVF9NQUtFX0ZPVVJDQygnbScsJ28nLCdvJywnZicpCisjZGVmaW5lIEZPVVJDQ19tdmV4ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ20nLCd2JywnZScsJ3gnKQorI2RlZmluZSBGT1VSQ0NfbXZoZCAgICAgR1NUX01BS0VfRk9VUkNDKCdtJywndicsJ2gnLCdkJykKKyNkZWZpbmUgRk9VUkNDX292YzEgICAgIEdTVF9NQUtFX0ZPVVJDQygnbycsJ3YnLCdjJywnMScpCisjZGVmaW5lIEZPVVJDQ19vd21hICAgICBHU1RfTUFLRV9GT1VSQ0MoJ28nLCd3JywnbScsJ2EnKQorI2RlZmluZSBGT1VSQ0Nfc2R0cCAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywnZCcsJ3QnLCdwJykKKyNkZWZpbmUgRk9VUkNDX3RmaGQgICAgIEdTVF9NQUtFX0ZPVVJDQygndCcsJ2YnLCdoJywnZCcpCisjZGVmaW5lIEZPVVJDQ190ZnJhICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3QnLCdmJywncicsJ2EnKQorI2RlZmluZSBGT1VSQ0NfdHJhZiAgICAgR1NUX01BS0VfRk9VUkNDKCd0JywncicsJ2EnLCdmJykKKyNkZWZpbmUgRk9VUkNDX3RyZXggICAgIEdTVF9NQUtFX0ZPVVJDQygndCcsJ3InLCdlJywneCcpCisjZGVmaW5lIEZPVVJDQ190cnVuICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3QnLCdyJywndScsJ24nKQorI2RlZmluZSBGT1VSQ0Nfd21hXyAgICAgR1NUX01BS0VfRk9VUkNDKCd3JywnbScsJ2EnLCcgJykKKworLyogTVBFRyBEQVNIICovCisjZGVmaW5lIEZPVVJDQ190ZmR0ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3QnLCdmJywnZCcsJ3QnKQorCisvKiBYaXBoIGZvdXJjYyAqLworI2RlZmluZSBGT1VSQ0NfWGR4VCAgICAgR1NUX01BS0VfRk9VUkNDKCdYJywnZCcsJ3gnLCdUJykKKyNkZWZpbmUgRk9VUkNDX1hpVGggICAgIEdTVF9NQUtFX0ZPVVJDQygnWCcsJ2knLCdUJywnaCcpCisjZGVmaW5lIEZPVVJDQ190Q3RDICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3QnLCdDJywndCcsJ0MnKQorI2RlZmluZSBGT1VSQ0NfdEN0SCAgICAgR1NUX01BS0VfRk9VUkNDKCd0JywnQycsJ3QnLCdIJykKKyNkZWZpbmUgRk9VUkNDX3RDdF8gICAgIEdTVF9NQUtFX0ZPVVJDQygndCcsJ0MnLCd0JywnIycpCisKKy8qIGlsc3QgbWV0YXRhZ3MgKi8KKyNkZWZpbmUgRk9VUkNDX19jbXQgICAgIEdTVF9NQUtFX0ZPVVJDQygweGE5LCAnYycsJ20nLCd0JykKKworLyogYXBwbGUgdGFncyAqLworI2RlZmluZSBGT1VSQ0NfX21hayAgICAgR1NUX01BS0VfRk9VUkNDKDB4YTksICdtJywnYScsJ2snKQorI2RlZmluZSBGT1VSQ0NfX21vZCAgICAgR1NUX01BS0VfRk9VUkNDKDB4YTksICdtJywnbycsJ2QnKQorI2RlZmluZSBGT1VSQ0NfX3N3ciAgICAgR1NUX01BS0VfRk9VUkNDKDB4YTksICdzJywndycsJ3InKQorCisvKiBDaGFwdGVycyByZWZlcmVuY2UgKi8KKyNkZWZpbmUgRk9VUkNDX2NoYXAgICAgIEdTVF9NQUtFX0ZPVVJDQygnYycsJ2gnLCdhJywncCcpCisKKy8qIEZvciBNaWNyb3NvZnQgV2F2ZSBmb3JtYXRzIGVtYmVkZGVkIGluIHF1aWNrdGltZSwgdGhlIEZPVVJDQyBpcworICAgJ20nLCAncycsIHRoZW4gdGhlIDE2IGJpdCB3YXZlIGNvZGVjIGlkICovCisjZGVmaW5lIE1TX1dBVkVfRk9VUkNDKGNvZGVjaWQpICBHU1RfTUFLRV9GT1VSQ0MoIFwKKyAgICAgICAgJ20nLCAncycsICgoY29kZWNpZCk+PjgpJjB4ZmYsICgoY29kZWNpZCkmMHhmZikpCisKKy8qIE1QRUcgQXBwbGljYXRpb24gRm9ybWF0ICwgU3RlcmVvIFZpZGVvICovCisjZGVmaW5lIEZPVVJDQ19zczAxICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCdzJywnMCcsJzEnKQorI2RlZmluZSBGT1VSQ0Nfc3MwMiAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywncycsJzAnLCcyJykKKyNkZWZpbmUgRk9VUkNDX3N2bWkgICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ3YnLCdtJywnaScpCisjZGVmaW5lIEZPVVJDQ19zY2RpICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCdjJywnZCcsJ2knKQorCisvKiBQcm90ZWN0ZWQgc3RyZWFtcyAqLworI2RlZmluZSBGT1VSQ0NfZW5jdiAgICAgR1NUX01BS0VfRk9VUkNDKCdlJywnbicsJ2MnLCd2JykKKyNkZWZpbmUgRk9VUkNDX2VuY2EgICAgIEdTVF9NQUtFX0ZPVVJDQygnZScsJ24nLCdjJywnYScpCisjZGVmaW5lIEZPVVJDQ19lbmN0ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2UnLCduJywnYycsJ3QnKQorI2RlZmluZSBGT1VSQ0NfZW5jcyAgICAgR1NUX01BS0VfRk9VUkNDKCdlJywnbicsJ2MnLCdzJykKKyNkZWZpbmUgRk9VUkNDX3NpbmYgICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ2knLCduJywnZicpCisjZGVmaW5lIEZPVVJDQ19mcm1hICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2YnLCdyJywnbScsJ2EnKQorI2RlZmluZSBGT1VSQ0Nfc2NobSAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywnYycsJ2gnLCdtJykKKyNkZWZpbmUgRk9VUkNDX3NjaGkgICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ2MnLCdoJywnaScpCisKKy8qIENvbW1vbiBFbmNyeXB0aW9uICovCisjZGVmaW5lIEZPVVJDQ19wc3NoICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3AnLCdzJywncycsJ2gnKQorI2RlZmluZSBGT1VSQ0NfdGVuYyAgICAgR1NUX01BS0VfRk9VUkNDKCd0JywnZScsJ24nLCdjJykKKyNkZWZpbmUgRk9VUkNDX2NlbmMgICAgIEdTVF9NQUtFX0ZPVVJDQygnYycsJ2UnLCduJywnYycpCisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0ZPVVJDQ19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvZ3N0aXNvZmYuYyBiL2dzdC9pc29tcDQvZ3N0aXNvZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjlhNzNhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9nc3Rpc29mZi5jCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogSVNPIEZpbGUgRm9ybWF0IHBhcnNpbmcgbGlicmFyeQorICoKKyAqIGdzdGlzb2ZmLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgU2Ftc3VuZyBFbGVjdHJvbmljcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgQXV0aG9yOiBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5IChDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgInF0ZGVtdXhfZGVidWcuaCIKKyNpbmNsdWRlICJnc3Rpc29mZi5oIgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJ5dGVyZWFkZXIuaD4KKworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgcXRkZW11eF9kZWJ1ZworCit2b2lkCitnc3RfaXNvZmZfcXRfc2lkeF9wYXJzZXJfaW5pdCAoR3N0U2lkeFBhcnNlciAqIHBhcnNlcikKK3sKKyAgcGFyc2VyLT5zdGF0dXMgPSBHU1RfSVNPRkZfUVRfU0lEWF9QQVJTRVJfSU5JVDsKKyAgcGFyc2VyLT5jdW11bGF0aXZlX2VudHJ5X3NpemUgPSAwOworICBwYXJzZXItPnNpZHguZW50cmllcyA9IE5VTEw7CisgIHBhcnNlci0+c2lkeC5lbnRyaWVzX2NvdW50ID0gMDsKK30KKwordm9pZAorZ3N0X2lzb2ZmX3F0X3NpZHhfcGFyc2VyX2NsZWFyIChHc3RTaWR4UGFyc2VyICogcGFyc2VyKQoreworICBnX2ZyZWUgKHBhcnNlci0+c2lkeC5lbnRyaWVzKTsKKyAgcGFyc2VyLT5zaWR4LmVudHJpZXMgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2lzb2ZmX3F0X3BhcnNlX3NpZHhfZW50cnkgKEdzdFNpZHhCb3hFbnRyeSAqIGVudHJ5LCBHc3RCeXRlUmVhZGVyICogcmVhZGVyKQoreworICBndWludDMyIGF1eDsKKworICBhdXggPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQgKHJlYWRlcik7CisgIGVudHJ5LT5yZWZfdHlwZSA9IGF1eCA+PiAzMTsKKyAgZW50cnktPnNpemUgPSBhdXggJiAweDdGRkZGRkZGOworICBlbnRyeS0+ZHVyYXRpb24gPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQgKHJlYWRlcik7CisgIGF1eCA9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAocmVhZGVyKTsKKyAgZW50cnktPnN0YXJ0c193aXRoX3NhcCA9IGF1eCA+PiAzMTsKKyAgZW50cnktPnNhcF90eXBlID0gKChhdXggPj4gMjgpICYgMHg3KTsKKyAgZW50cnktPnNhcF9kZWx0YV90aW1lID0gYXV4ICYgMHhGRkZGRkZGOworfQorCitHc3RJc29mZlBhcnNlclJlc3VsdAorZ3N0X2lzb2ZmX3F0X3NpZHhfcGFyc2VyX2FkZF9kYXRhIChHc3RTaWR4UGFyc2VyICogcGFyc2VyLAorICAgIGNvbnN0IGd1aW50OCAqIGJ1ZmZlciwgZ2ludCBsZW5ndGgsIGd1aW50ICogY29uc3VtZWQpCit7CisgIEdzdElzb2ZmUGFyc2VyUmVzdWx0IHJlcyA9IEdTVF9JU09GRl9RVF9QQVJTRVJfT0s7CisgIEdzdEJ5dGVSZWFkZXIgcmVhZGVyOworICBnc2l6ZSByZW1haW5pbmc7CisgIGd1aW50MzIgZm91cmNjOworCisgIGdzdF9ieXRlX3JlYWRlcl9pbml0ICgmcmVhZGVyLCBidWZmZXIsIGxlbmd0aCk7CisKKyAgc3dpdGNoIChwYXJzZXItPnN0YXR1cykgeworICAgIGNhc2UgR1NUX0lTT0ZGX1FUX1NJRFhfUEFSU0VSX0lOSVQ6CisgICAgICBpZiAoZ3N0X2J5dGVfcmVhZGVyX2dldF9yZW1haW5pbmcgKCZyZWFkZXIpIDwgR1NUX0lTT0ZGX1FUX0ZVTExfQk9YX1NJWkUpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHBhcnNlci0+c2l6ZSA9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAoJnJlYWRlcik7CisgICAgICBmb3VyY2MgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9sZV91bmNoZWNrZWQgKCZyZWFkZXIpOworICAgICAgaWYgKGZvdXJjYyAhPSBHU1RfSVNPRkZfUVRfRk9VUkNDX1NJRFgpIHsKKyAgICAgICAgcmVzID0gR1NUX0lTT0ZGX1FUX1BBUlNFUl9VTkVYUEVDVEVEOworICAgICAgICBnc3RfYnl0ZV9yZWFkZXJfc2V0X3BvcyAoJnJlYWRlciwgMCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHBhcnNlci0+c2l6ZSA9PSAxKSB7CisgICAgICAgIGlmIChnc3RfYnl0ZV9yZWFkZXJfZ2V0X3JlbWFpbmluZyAoJnJlYWRlcikgPCAxMikgeworICAgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9zZXRfcG9zICgmcmVhZGVyLCAwKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHBhcnNlci0+c2l6ZSA9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDY0X2JlX3VuY2hlY2tlZCAoJnJlYWRlcik7CisgICAgICB9CisgICAgICBpZiAocGFyc2VyLT5zaXplID09IDApIHsKKyAgICAgICAgcmVzID0gR1NUX0lTT0ZGX1FUX1BBUlNFUl9FUlJPUjsKKyAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX3NldF9wb3MgKCZyZWFkZXIsIDApOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHBhcnNlci0+c2lkeC52ZXJzaW9uID0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OF91bmNoZWNrZWQgKCZyZWFkZXIpOworICAgICAgcGFyc2VyLT5zaWR4LmZsYWdzID0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MjRfbGVfdW5jaGVja2VkICgmcmVhZGVyKTsKKworICAgICAgcGFyc2VyLT5zdGF0dXMgPSBHU1RfSVNPRkZfUVRfU0lEWF9QQVJTRVJfSEVBREVSOworCisgICAgY2FzZSBHU1RfSVNPRkZfUVRfU0lEWF9QQVJTRVJfSEVBREVSOgorICAgICAgcmVtYWluaW5nID0gZ3N0X2J5dGVfcmVhZGVyX2dldF9yZW1haW5pbmcgKCZyZWFkZXIpOworICAgICAgaWYgKHJlbWFpbmluZyA8IDEyICsgKHBhcnNlci0+c2lkeC52ZXJzaW9uID09IDAgPyA4IDogMTYpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBwYXJzZXItPnNpZHgucmVmX2lkID0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmVfdW5jaGVja2VkICgmcmVhZGVyKTsKKyAgICAgIHBhcnNlci0+c2lkeC50aW1lc2NhbGUgPQorICAgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAoJnJlYWRlcik7CisgICAgICBpZiAocGFyc2VyLT5zaWR4LnZlcnNpb24gPT0gMCkgeworICAgICAgICBwYXJzZXItPnNpZHguZWFybGllc3RfcHRzID0KKyAgICAgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAoJnJlYWRlcik7CisgICAgICAgIHBhcnNlci0+c2lkeC5maXJzdF9vZmZzZXQgPSBwYXJzZXItPnNpZHguZWFybGllc3RfcHRzID0KKyAgICAgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAoJnJlYWRlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXJzZXItPnNpZHguZWFybGllc3RfcHRzID0KKyAgICAgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDY0X2JlX3VuY2hlY2tlZCAoJnJlYWRlcik7CisgICAgICAgIHBhcnNlci0+c2lkeC5maXJzdF9vZmZzZXQgPQorICAgICAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50NjRfYmVfdW5jaGVja2VkICgmcmVhZGVyKTsKKyAgICAgIH0KKyAgICAgIC8qIHNraXAgMiByZXNlcnZlZCBieXRlcyAqLworICAgICAgZ3N0X2J5dGVfcmVhZGVyX3NraXBfdW5jaGVja2VkICgmcmVhZGVyLCAyKTsKKyAgICAgIHBhcnNlci0+c2lkeC5lbnRyaWVzX2NvdW50ID0KKyAgICAgICAgICBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9iZV91bmNoZWNrZWQgKCZyZWFkZXIpOworCisgICAgICBHU1RfTE9HICgiVGltZXNjYWxlOiAlIiBHX0dVSU5UMzJfRk9STUFULCBwYXJzZXItPnNpZHgudGltZXNjYWxlKTsKKyAgICAgIEdTVF9MT0cgKCJFYXJsaWVzdCBwdHM6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHBhcnNlci0+c2lkeC5lYXJsaWVzdF9wdHMpOworICAgICAgR1NUX0xPRyAoIkZpcnN0IG9mZnNldDogJSIgR19HVUlOVDY0X0ZPUk1BVCwgcGFyc2VyLT5zaWR4LmZpcnN0X29mZnNldCk7CisKKyAgICAgIHBhcnNlci0+Y3VtdWxhdGl2ZV9wdHMgPQorICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnRfcm91bmQgKHBhcnNlci0+c2lkeC5lYXJsaWVzdF9wdHMsCisgICAgICAgICAgR1NUX1NFQ09ORCwgcGFyc2VyLT5zaWR4LnRpbWVzY2FsZSk7CisKKyAgICAgIGlmIChwYXJzZXItPnNpZHguZW50cmllc19jb3VudCkgeworICAgICAgICBwYXJzZXItPnNpZHguZW50cmllcyA9CisgICAgICAgICAgICBnX21hbGxvYyAoc2l6ZW9mIChHc3RTaWR4Qm94RW50cnkpICogcGFyc2VyLT5zaWR4LmVudHJpZXNfY291bnQpOworICAgICAgfQorICAgICAgcGFyc2VyLT5zaWR4LmVudHJ5X2luZGV4ID0gMDsKKworICAgICAgcGFyc2VyLT5zdGF0dXMgPSBHU1RfSVNPRkZfUVRfU0lEWF9QQVJTRVJfREFUQTsKKworICAgIGNhc2UgR1NUX0lTT0ZGX1FUX1NJRFhfUEFSU0VSX0RBVEE6CisgICAgICB3aGlsZSAocGFyc2VyLT5zaWR4LmVudHJ5X2luZGV4IDwgcGFyc2VyLT5zaWR4LmVudHJpZXNfY291bnQpIHsKKyAgICAgICAgR3N0U2lkeEJveEVudHJ5ICplbnRyeSA9CisgICAgICAgICAgICAmcGFyc2VyLT5zaWR4LmVudHJpZXNbcGFyc2VyLT5zaWR4LmVudHJ5X2luZGV4XTsKKworICAgICAgICByZW1haW5pbmcgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3JlbWFpbmluZyAoJnJlYWRlcik7CisgICAgICAgIGlmIChyZW1haW5pbmcgPCAxMikKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBlbnRyeS0+b2Zmc2V0ID0gcGFyc2VyLT5jdW11bGF0aXZlX2VudHJ5X3NpemU7CisgICAgICAgIGVudHJ5LT5wdHMgPSBwYXJzZXItPmN1bXVsYXRpdmVfcHRzOworICAgICAgICBnc3RfaXNvZmZfcXRfcGFyc2Vfc2lkeF9lbnRyeSAoZW50cnksICZyZWFkZXIpOworICAgICAgICBlbnRyeS0+ZHVyYXRpb24gPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50X3JvdW5kIChlbnRyeS0+ZHVyYXRpb24sCisgICAgICAgICAgICBHU1RfU0VDT05ELCBwYXJzZXItPnNpZHgudGltZXNjYWxlKTsKKyAgICAgICAgcGFyc2VyLT5jdW11bGF0aXZlX2VudHJ5X3NpemUgKz0gZW50cnktPnNpemU7CisgICAgICAgIHBhcnNlci0+Y3VtdWxhdGl2ZV9wdHMgKz0gZW50cnktPmR1cmF0aW9uOworCisgICAgICAgIEdTVF9MT0cgKCJTaWR4IGVudHJ5ICVkKSBvZmZzZXQ6ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgcHRzOiAlIgorICAgICAgICAgICAgR1NUX1RJTUVfRk9STUFUICIsIGR1cmF0aW9uICUiIEdTVF9USU1FX0ZPUk1BVCAiIC0gc2l6ZSAlIgorICAgICAgICAgICAgR19HVUlOVDMyX0ZPUk1BVCwgcGFyc2VyLT5zaWR4LmVudHJ5X2luZGV4LCBlbnRyeS0+b2Zmc2V0LAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZW50cnktPnB0cyksIEdTVF9USU1FX0FSR1MgKGVudHJ5LT5kdXJhdGlvbiksCisgICAgICAgICAgICBlbnRyeS0+c2l6ZSk7CisKKyAgICAgICAgcGFyc2VyLT5zaWR4LmVudHJ5X2luZGV4Kys7CisgICAgICB9CisKKyAgICAgIGlmIChwYXJzZXItPnNpZHguZW50cnlfaW5kZXggPT0gcGFyc2VyLT5zaWR4LmVudHJpZXNfY291bnQpCisgICAgICAgIHBhcnNlci0+c3RhdHVzID0gR1NUX0lTT0ZGX1FUX1NJRFhfUEFSU0VSX0ZJTklTSEVEOworICAgICAgZWxzZQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9JU09GRl9RVF9TSURYX1BBUlNFUl9GSU5JU0hFRDoKKyAgICAgIHBhcnNlci0+c2lkeC5lbnRyeV9pbmRleCA9IDA7CisgICAgICByZXMgPSBHU1RfSVNPRkZfUVRfUEFSU0VSX0RPTkU7CisgICAgICBicmVhazsKKyAgfQorCisgICpjb25zdW1lZCA9IGdzdF9ieXRlX3JlYWRlcl9nZXRfcG9zICgmcmVhZGVyKTsKKyAgcmV0dXJuIHJlczsKK30KKworR3N0SXNvZmZQYXJzZXJSZXN1bHQKK2dzdF9pc29mZl9xdF9zaWR4X3BhcnNlcl9hZGRfYnVmZmVyIChHc3RTaWR4UGFyc2VyICogcGFyc2VyLCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgZ3VpbnQgKiBjb25zdW1lZCkKK3sKKyAgR3N0SXNvZmZQYXJzZXJSZXN1bHQgcmVzID0gR1NUX0lTT0ZGX1FUX1BBUlNFUl9PSzsKKyAgR3N0TWFwSW5mbyBpbmZvOworCisgIGlmICghZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJmluZm8sIEdTVF9NQVBfUkVBRCkpIHsKKyAgICAqY29uc3VtZWQgPSAwOworICAgIHJldHVybiBHU1RfSVNPRkZfUVRfUEFSU0VSX0VSUk9SOworICB9CisKKyAgcmVzID0KKyAgICAgIGdzdF9pc29mZl9xdF9zaWR4X3BhcnNlcl9hZGRfZGF0YSAocGFyc2VyLCBpbmZvLmRhdGEsIGluZm8uc2l6ZSwKKyAgICAgIGNvbnN1bWVkKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZpbmZvKTsKKyAgcmV0dXJuIHJlczsKK30KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvZ3N0aXNvZmYuaCBiL2dzdC9pc29tcDQvZ3N0aXNvZmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmZiZjMzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9nc3Rpc29mZi5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogSVNPIEZpbGUgRm9ybWF0IHBhcnNpbmcgbGlicmFyeQorICoKKyAqIGdzdGlzb2ZmLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgU2Ftc3VuZyBFbGVjdHJvbmljcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgQXV0aG9yOiBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5IChDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9JU09GRl9RVF9IX18KKyNkZWZpbmUgX19HU1RfSVNPRkZfUVRfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK0dfQkVHSU5fREVDTFMKKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX0lTT0ZGX1FUX1BBUlNFUl9PSywKKyAgR1NUX0lTT0ZGX1FUX1BBUlNFUl9ET05FLAorICBHU1RfSVNPRkZfUVRfUEFSU0VSX1VORVhQRUNURUQsCisgIEdTVF9JU09GRl9RVF9QQVJTRVJfRVJST1IKK30gR3N0SXNvZmZQYXJzZXJSZXN1bHQ7CisKKy8qIHRoaXMgaXMgdGhlIG1pbmltdW0gc2l6ZSwgaXQgY2FuIGJlIGxhcmdlciBpZiBpdAorICogdXNlcyBleHRlbmRlZCBzaXplIG9yIHR5cGUgKi8KKyNkZWZpbmUgR1NUX0lTT0ZGX1FUX0ZVTExfQk9YX1NJWkUgMTIKKworI2RlZmluZSBHU1RfSVNPRkZfUVRfRk9VUkNDX1NJRFggR1NUX01BS0VfRk9VUkNDKCdzJywnaScsJ2QnLCd4JykKK3R5cGVkZWYgc3RydWN0IF9Hc3RTaWR4Qm94RW50cnkKK3sKKyAgZ2Jvb2xlYW4gcmVmX3R5cGU7CisgIGd1aW50MzIgc2l6ZTsKKyAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uOworICBnYm9vbGVhbiBzdGFydHNfd2l0aF9zYXA7CisgIGd1aW50OCBzYXBfdHlwZTsKKyAgZ3VpbnQzMiBzYXBfZGVsdGFfdGltZTsKKworICBndWludDY0IG9mZnNldDsKKyAgR3N0Q2xvY2tUaW1lIHB0czsKK30gR3N0U2lkeEJveEVudHJ5OworCit0eXBlZGVmIHN0cnVjdCBfR3N0U2lkeEJveAoreworICBndWludDggdmVyc2lvbjsKKyAgZ3VpbnQzMiBmbGFnczsKKworICBndWludDMyIHJlZl9pZDsKKyAgZ3VpbnQzMiB0aW1lc2NhbGU7CisgIGd1aW50NjQgZWFybGllc3RfcHRzOworICBndWludDY0IGZpcnN0X29mZnNldDsKKworICBnaW50IGVudHJ5X2luZGV4OworICBnaW50IGVudHJpZXNfY291bnQ7CisKKyAgR3N0U2lkeEJveEVudHJ5ICplbnRyaWVzOworfSBHc3RTaWR4Qm94OworCit0eXBlZGVmIGVudW0gX0dzdFNpZHhQYXJzZXJTdGF0dXMKK3sKKyAgR1NUX0lTT0ZGX1FUX1NJRFhfUEFSU0VSX0lOSVQsCisgIEdTVF9JU09GRl9RVF9TSURYX1BBUlNFUl9IRUFERVIsCisgIEdTVF9JU09GRl9RVF9TSURYX1BBUlNFUl9EQVRBLAorICBHU1RfSVNPRkZfUVRfU0lEWF9QQVJTRVJfRklOSVNIRUQKK30gR3N0U2lkeFBhcnNlclN0YXR1czsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFNpZHhQYXJzZXIKK3sKKyAgR3N0U2lkeFBhcnNlclN0YXR1cyBzdGF0dXM7CisKKyAgZ3VpbnQ2NCBzaXplOworICBndWludDY0IGN1bXVsYXRpdmVfZW50cnlfc2l6ZTsKKyAgZ3VpbnQ2NCBjdW11bGF0aXZlX3B0czsKKworICBHc3RTaWR4Qm94IHNpZHg7Cit9IEdzdFNpZHhQYXJzZXI7CisKK3ZvaWQgZ3N0X2lzb2ZmX3F0X3NpZHhfcGFyc2VyX2luaXQgKEdzdFNpZHhQYXJzZXIgKiBwYXJzZXIpOwordm9pZCBnc3RfaXNvZmZfcXRfc2lkeF9wYXJzZXJfY2xlYXIgKEdzdFNpZHhQYXJzZXIgKiBwYXJzZXIpOworR3N0SXNvZmZQYXJzZXJSZXN1bHQgZ3N0X2lzb2ZmX3F0X3NpZHhfcGFyc2VyX2FkZF9kYXRhIChHc3RTaWR4UGFyc2VyICogcGFyc2VyLCBjb25zdCBndWludDggKiBidWZmZXIsIGdpbnQgbGVuZ3RoLCBndWludCAqIGNvbnN1bWVkKTsKK0dzdElzb2ZmUGFyc2VyUmVzdWx0IGdzdF9pc29mZl9xdF9zaWR4X3BhcnNlcl9hZGRfYnVmZmVyIChHc3RTaWR4UGFyc2VyICogcGFyc2VyLCBHc3RCdWZmZXIgKiBidWYsIGd1aW50ICogY29uc3VtZWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfSVNPRkZfUVRfSF9fICovCisKZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvZ3N0cXRtb292cmVjb3Zlci5jIGIvZ3N0L2lzb21wNC9nc3RxdG1vb3ZyZWNvdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkMmI5MQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvZ3N0cXRtb292cmVjb3Zlci5jCkBAIC0wLDAgKzEsMzg3IEBACisvKiBRdWlja3RpbWUgbXV4ZXIgcGx1Z2luIGZvciBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcXRtb292cmVjb3ZlcgorICogQHNob3J0X2Rlc2NyaXB0aW9uOiBVdGlsaXR5IGVsZW1lbnQgZm9yIHJlY292ZXJpbmcgdW5maW5pc2hlZCBxdWlja3RpbWUgZmlsZXMKKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8cGFyYT4KKyAqIFRoaXMgZWxlbWVudCByZWNvdmVycyBxdWlja3RpbWUgZmlsZXMgY3JlYXRlZCB3aXRoIHF0bXV4IHVzaW5nIHRoZSBtb292CisgKiByZWNvdmVyeSBmZWF0dXJlLgorICogPC9wYXJhPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIDxwYXJhPgorICogPHByb2dyYW1saXN0aW5nPgorICogVE9ETworICogPC9wcm9ncmFtbGlzdGluZz4KKyAqIDwvcGFyYT4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z2xpYi9nc3RkaW8uaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJnc3RxdG1vb3ZyZWNvdmVyLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9xdF9tb292X3JlY292ZXJfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3F0X21vb3ZfcmVjb3Zlcl9kZWJ1ZworCisvKiBRVE1vb3ZSZWNvdmVyIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUkVDT1ZFUllfSU5QVVQsCisgIFBST1BfQlJPS0VOX0lOUFVULAorICBQUk9QX0ZJWEVEX09VVFBVVCwKKyAgUFJPUF9GQVNUX1NUQVJUX01PREUKK307CisKKyNkZWZpbmUgZ3N0X3F0X21vb3ZfcmVjb3Zlcl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RRVE1vb3ZSZWNvdmVyLCBnc3RfcXRfbW9vdl9yZWNvdmVyLCBHU1RfVFlQRV9QSVBFTElORSk7CisKKy8qIHByb3BlcnR5IGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgZ3N0X3F0X21vb3ZfcmVjb3Zlcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcXRfbW9vdl9yZWNvdmVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9xdF9tb292X3JlY292ZXJfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIHZvaWQgZ3N0X3F0X21vb3ZfcmVjb3Zlcl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbW9vdl9yZWNvdmVyX2NsYXNzX2luaXQgKEdzdFFUTW9vdlJlY292ZXJDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcXRfbW9vdl9yZWNvdmVyX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcXRfbW9vdl9yZWNvdmVyX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3F0X21vb3ZfcmVjb3Zlcl9zZXRfcHJvcGVydHk7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3F0X21vb3ZfcmVjb3Zlcl9jaGFuZ2Vfc3RhdGU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9GSVhFRF9PVVRQVVQsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZml4ZWQtb3V0cHV0IiwKKyAgICAgICAgICAiUGF0aCB0byB3cml0ZSB0aGUgZml4ZWQgZmlsZSIsCisgICAgICAgICAgIlBhdGggdG8gd3JpdGUgdGhlIGZpeGVkIGZpbGUgdG8gKHVzZWQgYXMgb3V0cHV0KSIsCisgICAgICAgICAgTlVMTCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQlJPS0VOX0lOUFVULAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImJyb2tlbi1pbnB1dCIsCisgICAgICAgICAgIlBhdGggdG8gYnJva2VuIGlucHV0IGZpbGUiLAorICAgICAgICAgICJQYXRoIHRvIGJyb2tlbiBpbnB1dCBmaWxlLiAoSWYgcXRtdXggd2FzIG9uIGZhc3RzdGFydCBtb2RlLCB0aGlzICIKKyAgICAgICAgICAiZmlsZSBpcyB0aGUgZmFzdHN0YXJ0IGZpbGUpIiwgTlVMTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SRUNPVkVSWV9JTlBVVCwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJyZWNvdmVyeS1pbnB1dCIsCisgICAgICAgICAgIlBhdGggdG8gcmVjb3ZlcnkgZmlsZSIsCisgICAgICAgICAgIlBhdGggdG8gcmVjb3ZlcnkgZmlsZSAodXNlZCBhcyBpbnB1dCkiLCBOVUxMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0ZBU1RfU1RBUlRfTU9ERSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZmFzdHN0YXJ0LW1vZGUiLAorICAgICAgICAgICJJZiB0aGUgYnJva2VuIGlucHV0IGlzIGZyb20gZmFzdHN0YXJ0IG1vZGUiLAorICAgICAgICAgICJJZiB0aGUgYnJva2VuIGlucHV0IGlzIGZyb20gZmFzdHN0YXJ0IG1vZGUiLAorICAgICAgICAgIEZBTFNFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3F0X21vb3ZfcmVjb3Zlcl9kZWJ1ZywgInF0bW9vdnJlY292ZXIiLCAwLAorICAgICAgIlFUIE1vb3ZpZSBSZWNvdmVyIik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlFUIE1vb3YgUmVjb3ZlciIsCisgICAgICAiVXRpbCIsICJSZWNvdmVycyB1bmZpbmlzaGVkIHF0bXV4IGZpbGVzIiwKKyAgICAgICJUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdF9tb292X3JlY292ZXJfaW5pdCAoR3N0UVRNb292UmVjb3ZlciAqIHF0bXIpCit7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbW9vdl9yZWNvdmVyX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbW9vdl9yZWNvdmVyX3J1biAodm9pZCAqZGF0YSkKK3sKKyAgRklMRSAqbW9vdnJlYyA9IE5VTEw7CisgIEZJTEUgKm1kYXRpbnB1dCA9IE5VTEw7CisgIEZJTEUgKm91dHB1dCA9IE5VTEw7CisgIE1kYXRSZWNvdkZpbGUgKm1kYXRfcmVjb3YgPSBOVUxMOworICBNb292UmVjb3ZGaWxlICptb292X3JlY292ID0gTlVMTDsKKyAgR3N0UVRNb292UmVjb3ZlciAqcXRtciA9IEdTVF9RVF9NT09WX1JFQ09WRVJfQ0FTVCAoZGF0YSk7CisgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgR0Vycm9yICp3YXJuID0gTlVMTDsKKworICBHU1RfTE9HX09CSkVDVCAocXRtciwgIlN0YXJ0aW5nIHRhc2siKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdG1yLCAiVmFsaWRhdGluZyBwcm9wZXJ0aWVzIik7CisgIEdTVF9PQkpFQ1RfTE9DSyAocXRtcik7CisgIC8qIHZhbGlkYXRlIHByb3BlcnRpZXMgKi8KKyAgaWYgKHF0bXItPmJyb2tlbl9pbnB1dCA9PSBOVUxMKSB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXIpOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdG1yLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgICgiUGxlYXNlIHNldCBicm9rZW4taW5wdXQgcHJvcGVydHkiKSwgKE5VTEwpKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorICBpZiAocXRtci0+cmVjb3ZlcnlfaW5wdXQgPT0gTlVMTCkgeworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChxdG1yKTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtciwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoIlBsZWFzZSBzZXQgcmVjb3ZlcnktaW5wdXQgcHJvcGVydHkiKSwgKE5VTEwpKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorICBpZiAocXRtci0+Zml4ZWRfb3V0cHV0ID09IE5VTEwpIHsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAocXRtcik7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXIsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKCJQbGVhc2Ugc2V0IGZpeGVkLW91dHB1dCBwcm9wZXJ0eSIpLCAoTlVMTCkpOworICAgIGdvdG8gZW5kOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtciwgIk9wZW5pbmcgaW5wdXQvb3V0cHV0IGZpbGVzIik7CisgIC8qIG9wZW4gZmlsZXMgKi8KKyAgbW9vdnJlYyA9IGdfZm9wZW4gKHF0bXItPnJlY292ZXJ5X2lucHV0LCAicmIiKTsKKyAgaWYgKG1vb3ZyZWMgPT0gTlVMTCkgeworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChxdG1yKTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtciwgUkVTT1VSQ0UsIE9QRU5fUkVBRCwKKyAgICAgICAgKCJGYWlsZWQgdG8gb3BlbiByZWNvdmVyeS1pbnB1dCBmaWxlIiksIChOVUxMKSk7CisgICAgZ290byBlbmQ7CisgIH0KKworICBtZGF0aW5wdXQgPSBnX2ZvcGVuIChxdG1yLT5icm9rZW5faW5wdXQsICJyYiIpOworICBpZiAobWRhdGlucHV0ID09IE5VTEwpIHsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAocXRtcik7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXIsIFJFU09VUkNFLCBPUEVOX1JFQUQsCisgICAgICAgICgiRmFpbGVkIHRvIG9wZW4gYnJva2VuLWlucHV0IGZpbGUiKSwgKE5VTEwpKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorICBvdXRwdXQgPSBnX2ZvcGVuIChxdG1yLT5maXhlZF9vdXRwdXQsICJ3YisiKTsKKyAgaWYgKG91dHB1dCA9PSBOVUxMKSB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXIpOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdG1yLCBSRVNPVVJDRSwgT1BFTl9SRUFEX1dSSVRFLAorICAgICAgICAoIkZhaWxlZCB0byBvcGVuIGZpeGVkLW91dHB1dCBmaWxlIiksIChOVUxMKSk7CisgICAgZ290byBlbmQ7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXIsICJQYXJzaW5nIGlucHV0IGZpbGVzIik7CisgIC8qIG5vdyBjcmVhdGUgb3VyIHN0cnVjdHVyZXMgKi8KKyAgbWRhdF9yZWNvdiA9IG1kYXRfcmVjb3ZfZmlsZV9jcmVhdGUgKG1kYXRpbnB1dCwgcXRtci0+ZmFzdHN0YXJ0X21vZGUsICZlcnIpOworICBtZGF0aW5wdXQgPSBOVUxMOworICBpZiAobWRhdF9yZWNvdiA9PSBOVUxMKSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXIsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgiQnJva2VuIGZpbGUgY291bGQgbm90IGJlIHBhcnNlZCBjb3JyZWN0bHkiKSwgKE5VTEwpKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorICBtb292X3JlY292ID0gbW9vdl9yZWNvdl9maWxlX2NyZWF0ZSAobW9vdnJlYywgJmVycik7CisgIG1vb3ZyZWMgPSBOVUxMOworICBpZiAobW9vdl9yZWNvdiA9PSBOVUxMKSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXIsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgiUmVjb3ZlcnkgZmlsZSBjb3VsZCBub3QgYmUgcGFyc2VkIGNvcnJlY3RseSIpLCAoTlVMTCkpOworICAgIGdvdG8gZW5kOworICB9CisKKyAgLyogbm93IHBhcnNlIHRoZSBidWZmZXJzIGRhdGEgZnJvbSBtb292cmVjICovCisgIGlmICghbW9vdl9yZWNvdl9wYXJzZV9idWZmZXJzIChtb292X3JlY292LCBtZGF0X3JlY292LCAmZXJyKSkgeworICAgIGdvdG8gZW5kOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtciwgIldyaXRpbmcgZml4ZWQgZmlsZSB0byBvdXRwdXQiKTsKKyAgaWYgKCFtb292X3JlY292X3dyaXRlX2ZpbGUgKG1vb3ZfcmVjb3YsIG1kYXRfcmVjb3YsIG91dHB1dCwgJmVyciwgJndhcm4pKSB7CisgICAgZ290byBlbmQ7CisgIH0KKworICBpZiAod2FybikgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHF0bXIsIFJFU09VUkNFLCBGQUlMRUQsICgiJXMiLCB3YXJuLT5tZXNzYWdlKSwgKE5VTEwpKTsKKyAgICBnX2Vycm9yX2ZyZWUgKHdhcm4pOworICB9CisKKyAgLyogaGVyZSBtZWFucyBzdWNjZXNzICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXIsICJGaW5pc2hlZCBzdWNjZXNzZnVsbHksIHBvc3RpbmcgRU9TIik7CisgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAocXRtciksCisgICAgICBnc3RfbWVzc2FnZV9uZXdfZW9zIChHU1RfT0JKRUNUX0NBU1QgKHF0bXIpKSk7CisKK2VuZDoKKyAgR1NUX0xPR19PQkpFQ1QgKHF0bXIsICJGaW5hbGl6aW5nIHRhc2siKTsKKyAgaWYgKGVycikgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdG1yLCBSRVNPVVJDRSwgRkFJTEVELCAoIiVzIiwgZXJyLT5tZXNzYWdlKSwgKE5VTEwpKTsKKyAgICBnX2Vycm9yX2ZyZWUgKGVycik7CisgIH0KKworICBpZiAobW9vdl9yZWNvdikKKyAgICBtb292X3JlY292X2ZpbGVfZnJlZSAobW9vdl9yZWNvdik7CisgIGlmIChtb292cmVjKQorICAgIGZjbG9zZSAobW9vdnJlYyk7CisKKyAgaWYgKG1kYXRfcmVjb3YpCisgICAgbWRhdF9yZWNvdl9maWxlX2ZyZWUgKG1kYXRfcmVjb3YpOworICBpZiAobWRhdGlucHV0KQorICAgIGZjbG9zZSAobWRhdGlucHV0KTsKKworICBpZiAob3V0cHV0KQorICAgIGZjbG9zZSAob3V0cHV0KTsKKyAgR1NUX0xPR19PQkpFQ1QgKHF0bXIsICJMZWF2aW5nIHRhc2siKTsKKyAgZ3N0X3Rhc2tfc3RvcCAocXRtci0+dGFzayk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbW9vdl9yZWNvdmVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RRVE1vb3ZSZWNvdmVyICpxdG1yID0gR1NUX1FUX01PT1ZfUkVDT1ZFUl9DQVNUIChvYmplY3QpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAocXRtcik7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9GQVNUX1NUQVJUX01PREU6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcXRtci0+ZmFzdHN0YXJ0X21vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JST0tFTl9JTlBVVDoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHF0bXItPmJyb2tlbl9pbnB1dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVDT1ZFUllfSU5QVVQ6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBxdG1yLT5yZWNvdmVyeV9pbnB1dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRklYRURfT1VUUFVUOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgcXRtci0+Zml4ZWRfb3V0cHV0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X21vb3ZfcmVjb3Zlcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UVRNb292UmVjb3ZlciAqcXRtciA9IEdTVF9RVF9NT09WX1JFQ09WRVJfQ0FTVCAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHF0bXIpOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfRkFTVF9TVEFSVF9NT0RFOgorICAgICAgcXRtci0+ZmFzdHN0YXJ0X21vZGUgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQlJPS0VOX0lOUFVUOgorICAgICAgZ19mcmVlIChxdG1yLT5icm9rZW5faW5wdXQpOworICAgICAgcXRtci0+YnJva2VuX2lucHV0ID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVDT1ZFUllfSU5QVVQ6CisgICAgICBnX2ZyZWUgKHF0bXItPnJlY292ZXJ5X2lucHV0KTsKKyAgICAgIHF0bXItPnJlY292ZXJ5X2lucHV0ID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRklYRURfT1VUUFVUOgorICAgICAgZ19mcmVlIChxdG1yLT5maXhlZF9vdXRwdXQpOworICAgICAgcXRtci0+Zml4ZWRfb3V0cHV0ID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChxdG1yKTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcXRfbW9vdl9yZWNvdmVyX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RRVE1vb3ZSZWNvdmVyICpxdG1yID0gR1NUX1FUX01PT1ZfUkVDT1ZFUl9DQVNUIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIHF0bXItPnRhc2sgPSBnc3RfdGFza19uZXcgKGdzdF9xdF9tb292X3JlY292ZXJfcnVuLCBxdG1yLCBOVUxMKTsKKyAgICAgIGdfcmVjX211dGV4X2luaXQgKCZxdG1yLT50YXNrX211dGV4KTsKKyAgICAgIGdzdF90YXNrX3NldF9sb2NrIChxdG1yLT50YXNrLCAmcXRtci0+dGFza19tdXRleCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1BMQVlJTkc6CisgICAgICBnc3RfdGFza19zdGFydCAocXRtci0+dGFzayk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUExBWUlOR19UT19QQVVTRUQ6CisgICAgICBnc3RfdGFza19zdG9wIChxdG1yLT50YXNrKTsKKyAgICAgIGdzdF90YXNrX2pvaW4gKHF0bXItPnRhc2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBpZiAoZ3N0X3Rhc2tfZ2V0X3N0YXRlIChxdG1yLT50YXNrKSAhPSBHU1RfVEFTS19TVE9QUEVEKQorICAgICAgICBHU1RfRVJST1IgKCJ0YXNrICVwIHNob3VsZCBiZSBzdG9wcGVkIGJ5IG5vdyIsIHF0bXItPnRhc2spOworICAgICAgZ3N0X29iamVjdF91bnJlZiAocXRtci0+dGFzayk7CisgICAgICBxdG1yLT50YXNrID0gTlVMTDsKKyAgICAgIGdfcmVjX211dGV4X2NsZWFyICgmcXRtci0+dGFza19tdXRleCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworCitnYm9vbGVhbgorZ3N0X3F0X21vb3ZfcmVjb3Zlcl9yZWdpc3RlciAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInF0bW9vdnJlY292ZXIiLCBHU1RfUkFOS19OT05FLAorICAgICAgR1NUX1RZUEVfUVRfTU9PVl9SRUNPVkVSKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvZ3N0cXRtb292cmVjb3Zlci5oIGIvZ3N0L2lzb21wNC9nc3RxdG1vb3ZyZWNvdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2YzIyMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvZ3N0cXRtb292cmVjb3Zlci5oCkBAIC0wLDAgKzEsODggQEAKKy8qIFF1aWNrdGltZSBtdXhlciBwbHVnaW4gZm9yIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKgorICogVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIFNvdXJjZSBDb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlLgorICogU2VlIGZ1cnRoZXIgZXhwbGFuYXRpb24gYXR0YWNoZWQgaW4gTGljZW5zZSBTdGF0ZW1lbnQgKGRpc3RyaWJ1dGVkIGluIHRoZSBmaWxlCisgKiBMSUNFTlNFKS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX0dTVF9RVF9NT09WX1JFQ09WRVJfSF9fCisjZGVmaW5lIF9fR1NUX1FUX01PT1ZfUkVDT1ZFUl9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImF0b21zLmgiCisjaW5jbHVkZSAiYXRvbXNyZWNvdmVyeS5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUVRfTU9PVl9SRUNPVkVSIChnc3RfcXRfbW9vdl9yZWNvdmVyX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9RVF9NT09WX1JFQ09WRVIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUVRfTU9PVl9SRUNPVkVSLCBHc3RRVE1vb3ZSZWNvdmVyKSkKKyNkZWZpbmUgR1NUX1FUX01PT1ZfUkVDT1ZFUl9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUVRfTU9PVl9SRUNPVkVSLCBHc3RRVE1vb3ZSZWNvdmVyKSkKKyNkZWZpbmUgR1NUX0lTX1FUX01PT1ZfUkVDT1ZFUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9RVF9NT09WX1JFQ09WRVIpKQorI2RlZmluZSBHU1RfSVNfUVRfTU9PVl9SRUNPVkVSX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9RVF9NT09WX1JFQ09WRVIpKQorI2RlZmluZSBHU1RfUVRfTU9PVl9SRUNPVkVSX0NBU1Qob2JqKSAoKEdzdFFUTW9vdlJlY292ZXIqKShvYmopKQorCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RRVE1vb3ZSZWNvdmVyIEdzdFFUTW9vdlJlY292ZXI7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UVRNb292UmVjb3ZlckNsYXNzIEdzdFFUTW9vdlJlY292ZXJDbGFzczsKKworc3RydWN0IF9Hc3RRVE1vb3ZSZWNvdmVyCit7CisgIEdzdFBpcGVsaW5lIHBpcGVsaW5lOworCisgIEdzdFRhc2sgKnRhc2s7CisgIEdSZWNNdXRleCB0YXNrX211dGV4OworCisgIC8qIHByb3BlcnRpZXMgKi8KKyAgZ2Jvb2xlYW4gIGZhc3RzdGFydF9tb2RlOworICBnY2hhciAgICAqcmVjb3ZlcnlfaW5wdXQ7CisgIGdjaGFyICAgICpmaXhlZF9vdXRwdXQ7CisgIGdjaGFyICAgICpicm9rZW5faW5wdXQ7Cit9OworCitzdHJ1Y3QgX0dzdFFUTW9vdlJlY292ZXJDbGFzcworeworICBHc3RQaXBlbGluZUNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9xdF9tb292X3JlY292ZXJfZ2V0X3R5cGUgKHZvaWQpOworZ2Jvb2xlYW4gZ3N0X3F0X21vb3ZfcmVjb3Zlcl9yZWdpc3RlciAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1FUX01PT1ZfUkVDT1ZFUl9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvZ3N0cXRtdXgtZG9jLmMgYi9nc3QvaXNvbXA0L2dzdHF0bXV4LWRvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiODU3ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L2dzdHF0bXV4LWRvYy5jCkBAIC0wLDAgKzEsMjQyIEBACisvKiBRdWlja3RpbWUgbXV4ZXIgZG9jdW1lbnRhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnI+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc2YubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29udGFjdDogU3RlZmFuIEtvc3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IG1wNG11eCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtbXA0bXV4CisgKiBAc2hvcnRfZGVzY3JpcHRpb246IE11eGVyIGZvciBJU08gTVBFRy00ICgubXA0KSBmaWxlcworICoKKyAqIFRoaXMgZWxlbWVudCBtZXJnZXMgc3RyZWFtcyAoYXVkaW8gYW5kIHZpZGVvKSBpbnRvIElTTyBNUEVHLTQgKC5tcDQpIGZpbGVzLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgYmFja2dyb3VuZCBpbnRlbmRzIHRvIGV4cGxhaW4gd2h5IHZhcmlvdXMgc2ltaWxhciBtdXhlcnMKKyAqIGFyZSBwcmVzZW50IGluIHRoaXMgcGx1Z2luLgorICoKKyAqIFRoZSA8dWxpbmsgdXJsPSJodHRwOi8vd3d3LmFwcGxlLmNvbS9xdWlja3RpbWUvcmVzb3VyY2VzL3F0ZmlsZWZvcm1hdC5wZGYiPgorICogUXVpY2tUaW1lIGZpbGUgZm9ybWF0IHNwZWNpZmljYXRpb248L3VsaW5rPiBzZXJ2ZWQgYXMgYmFzaXMgZm9yIHRoZSBNUDQgZmlsZQorICogZm9ybWF0IHNwZWNpZmljYXRpb24gKG1wNG11eCksIGFuZCBhcyBzdWNoIHRoZSBRdWlja1RpbWUgZmlsZSBzdHJ1Y3R1cmUgaXMKKyAqIG5lYXJseSBpZGVudGljYWwgdG8gdGhlIHNvLWNhbGxlZCBJU08gQmFzZSBNZWRpYSBmaWxlIGZvcm1hdCBkZWZpbmVkIGluCisgKiBJU08gMTQ0OTYtMTIgKGV4Y2VwdCBmb3Igc29tZSBtZWRpYSBzcGVjaWZpYyBwYXJ0cykuCisgKiBJbiB0dXJuLCB0aGUgbGF0dGVyIElTTyBCYXNlIE1lZGlhIGZvcm1hdCB3YXMgZnVydGhlciBzcGVjaWFsaXplZCBhcyBhCisgKiBNb3Rpb24gSlBFRy0yMDAwIGZpbGUgZm9ybWF0IGluIElTTyAxNTQ0NC0zIChtajJtdXgpCisgKiBhbmQgaW4gdmFyaW91cyAzR1BQKDIpIHNwZWNzICgzZ3BwbXV4KS4KKyAqIFRoZSBmcmFnbWVudGVkIGZpbGUgZmVhdHVyZXMgZGVmaW5lZCAob25seSkgaW4gSVNPIEJhc2UgTWVkaWEgYXJlIHVzZWQgYnkKKyAqIElTTVYgZmlsZXMgbWFraW5nIHVwIChhLm8uKSBTbW9vdGggU3RyZWFtaW5nIChpc21sbXV4KS4KKyAqCisgKiBBIGZldyBwcm9wZXJ0aWVzICgjR3N0TXA0TXV4Om1vdmllLXRpbWVzY2FsZSwgI0dzdE1wNE11eDp0cmFrLXRpbWVzY2FsZSkKKyAqIGFsbG93IGFkanVzdGluZyBzb21lIHRlY2huaWNhbCBwYXJhbWV0ZXJzLCB3aGljaCBtaWdodCBiZSB1c2VmdWwgaW4gKHJhcmUpCisgKiBjYXNlcyB0byByZXNvbHZlIGNvbXBhdGliaWxpdHkgaXNzdWVzIGluIHNvbWUgc2l0dWF0aW9ucy4KKyAqCisgKiBTb21lIG90aGVyIHByb3BlcnRpZXMgaW5mbHVlbmNlIHRoZSByZXN1bHQgbW9yZSBmdW5kYW1lbnRhbGx5LgorICogQSB0eXBpY2FsIG1vdi9tcDQgZmlsZSdzIG1ldGFkYXRhIChha2EgbW9vdikgaXMgbG9jYXRlZCBhdCB0aGUgZW5kIG9mIHRoZQorICogZmlsZSwgc29tZXdoYXQgY29udHJhcnkgdG8gdGhpcyB1c3VhbGx5IGJlaW5nIGNhbGxlZCAidGhlIGhlYWRlciIuCisgKiBIb3dldmVyLCBhICNHc3RNcDRNdXg6ZmFzdHN0YXJ0IGZpbGUgd2lsbCAod2l0aCBzb21lIGVmZm9ydCkgYXJyYW5nZSB0aGlzIHRvCisgKiBiZSBsb2NhdGVkIG5lYXIgc3RhcnQgb2YgdGhlIGZpbGUsIHdoaWNoIHRoZW4gYWxsb3dzIGl0IGUuZy4gdG8gYmUgcGxheWVkCisgKiB3aGlsZSBkb3dubG9hZGluZy4gQWx0ZXJuYXRpdmVseSwgcmF0aGVyIHRoYW4gaGF2aW5nIG9uZSBjaHVuayBvZiBtZXRhZGF0YSBhdAorICogc3RhcnQgKG9yIGVuZCksIHRoZXJlIGNhbiBiZSBzb21lIG1ldGFkYXRhIGF0IHN0YXJ0IGFuZCBtb3N0IG9mIHRoZSBvdGhlcgorICogZGF0YSBjYW4gYmUgc3ByZWFkIG91dCBpbnRvIGZyYWdtZW50cyBvZiAjR3N0TXA0TXV4OmZyYWdtZW50LWR1cmF0aW9uLgorICogSWYgc3VjaCBmcmFnbWVudGVkIGxheW91dCBpcyBpbnRlbmRlZCBmb3Igc3RyZWFtaW5nIHB1cnBvc2VzLCB0aGVuCisgKiAjR3N0TXA0TXV4OnN0cmVhbWFibGUgYWxsb3dzIGZvcmVnb2luZyB0byBhZGQgaW5kZXggbWV0YWRhdGEgKGF0IHRoZSBlbmQgb2YKKyAqIGZpbGUpLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgZ3N0LWxhdW5jaC0xLjAgdjRsMnNyYyBudW0tYnVmZmVycz01MCAhIHF1ZXVlICEgeDI2NGVuYyAhIG1wNG11eCAhIGZpbGVzaW5rIGxvY2F0aW9uPXZpZGVvLm1wNAorICogXXwKKyAqIFJlY29yZHMgYSB2aWRlbyBzdHJlYW0gY2FwdHVyZWQgZnJvbSBhIHY0bDIgZGV2aWNlLCBlbmNvZGVzIGl0IGludG8gSC4yNjQKKyAqIGFuZCBtdXhlcyBpdCBpbnRvIGFuIG1wNCBmaWxlLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAzZ3BwbXV4ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC0zZ3BwbXV4CisgKiBAc2hvcnRfZGVzY3JpcHRpb246IE11eGVyIGZvciAzR1BQICguM2dwKSBmaWxlcworICoKKyAqIFRoaXMgZWxlbWVudCBtZXJnZXMgc3RyZWFtcyAoYXVkaW8gYW5kIHZpZGVvKSBpbnRvIDNHUFAgKC4zZ3ApIGZpbGVzLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgYmFja2dyb3VuZCBpbnRlbmRzIHRvIGV4cGxhaW4gd2h5IHZhcmlvdXMgc2ltaWxhciBtdXhlcnMKKyAqIGFyZSBwcmVzZW50IGluIHRoaXMgcGx1Z2luLgorICoKKyAqIFRoZSA8dWxpbmsgdXJsPSJodHRwOi8vd3d3LmFwcGxlLmNvbS9xdWlja3RpbWUvcmVzb3VyY2VzL3F0ZmlsZWZvcm1hdC5wZGYiPgorICogUXVpY2tUaW1lIGZpbGUgZm9ybWF0IHNwZWNpZmljYXRpb248L3VsaW5rPiBzZXJ2ZWQgYXMgYmFzaXMgZm9yIHRoZSBNUDQgZmlsZQorICogZm9ybWF0IHNwZWNpZmljYXRpb24gKG1wNG11eCksIGFuZCBhcyBzdWNoIHRoZSBRdWlja1RpbWUgZmlsZSBzdHJ1Y3R1cmUgaXMKKyAqIG5lYXJseSBpZGVudGljYWwgdG8gdGhlIHNvLWNhbGxlZCBJU08gQmFzZSBNZWRpYSBmaWxlIGZvcm1hdCBkZWZpbmVkIGluCisgKiBJU08gMTQ0OTYtMTIgKGV4Y2VwdCBmb3Igc29tZSBtZWRpYSBzcGVjaWZpYyBwYXJ0cykuCisgKiBJbiB0dXJuLCB0aGUgbGF0dGVyIElTTyBCYXNlIE1lZGlhIGZvcm1hdCB3YXMgZnVydGhlciBzcGVjaWFsaXplZCBhcyBhCisgKiBNb3Rpb24gSlBFRy0yMDAwIGZpbGUgZm9ybWF0IGluIElTTyAxNTQ0NC0zIChtajJtdXgpCisgKiBhbmQgaW4gdmFyaW91cyAzR1BQKDIpIHNwZWNzICgzZ3BwbXV4KS4KKyAqIFRoZSBmcmFnbWVudGVkIGZpbGUgZmVhdHVyZXMgZGVmaW5lZCAob25seSkgaW4gSVNPIEJhc2UgTWVkaWEgYXJlIHVzZWQgYnkKKyAqIElTTVYgZmlsZXMgbWFraW5nIHVwIChhLm8uKSBTbW9vdGggU3RyZWFtaW5nIChpc21sbXV4KS4KKyAqCisgKiBBIGZldyBwcm9wZXJ0aWVzICgjR3N0M0dQUE11eDptb3ZpZS10aW1lc2NhbGUsICNHc3QzR1BQTXV4OnRyYWstdGltZXNjYWxlKQorICogYWxsb3cgYWRqdXN0aW5nIHNvbWUgdGVjaG5pY2FsIHBhcmFtZXRlcnMsIHdoaWNoIG1pZ2h0IGJlIHVzZWZ1bCBpbiAocmFyZSkKKyAqIGNhc2VzIHRvIHJlc29sdmUgY29tcGF0aWJpbGl0eSBpc3N1ZXMgaW4gc29tZSBzaXR1YXRpb25zLgorICoKKyAqIFNvbWUgb3RoZXIgcHJvcGVydGllcyBpbmZsdWVuY2UgdGhlIHJlc3VsdCBtb3JlIGZ1bmRhbWVudGFsbHkuCisgKiBBIHR5cGljYWwgbW92L21wNCBmaWxlJ3MgbWV0YWRhdGEgKGFrYSBtb292KSBpcyBsb2NhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsCisgKiBzb21ld2hhdCBjb250cmFyeSB0byB0aGlzIHVzdWFsbHkgYmVpbmcgY2FsbGVkICJ0aGUgaGVhZGVyIi4gSG93ZXZlciwgYQorICogI0dzdDNHUFBNdXg6ZmFzdHN0YXJ0IGZpbGUgd2lsbCAod2l0aCBzb21lIGVmZm9ydCkgYXJyYW5nZSB0aGlzIHRvIGJlIGxvY2F0ZWQKKyAqIG5lYXIgc3RhcnQgb2YgdGhlIGZpbGUsIHdoaWNoIHRoZW4gYWxsb3dzIGl0IGUuZy4gdG8gYmUgcGxheWVkIHdoaWxlCisgKiBkb3dubG9hZGluZy4gQWx0ZXJuYXRpdmVseSwgcmF0aGVyIHRoYW4gaGF2aW5nIG9uZSBjaHVuayBvZiBtZXRhZGF0YSBhdCBzdGFydAorICogKG9yIGVuZCksIHRoZXJlIGNhbiBiZSBzb21lIG1ldGFkYXRhIGF0IHN0YXJ0IGFuZCBtb3N0IG9mIHRoZSBvdGhlciBkYXRhIGNhbgorICogYmUgc3ByZWFkIG91dCBpbnRvIGZyYWdtZW50cyBvZiAjR3N0M0dQUE11eDpmcmFnbWVudC1kdXJhdGlvbi4gSWYgc3VjaAorICogZnJhZ21lbnRlZCBsYXlvdXQgaXMgaW50ZW5kZWQgZm9yIHN0cmVhbWluZyBwdXJwb3NlcywgdGhlbgorICogI0dzdDNHUFBNdXg6c3RyZWFtYWJsZSBhbGxvd3MgZm9yZWdvaW5nIHRvIGFkZCBpbmRleCBtZXRhZGF0YSAoYXQgdGhlIGVuZCBvZgorICogZmlsZSkuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB2NGwyc3JjIG51bS1idWZmZXJzPTUwICEgcXVldWUgISBmZmVuY19oMjYzICEgM2dwcG11eCAhIGZpbGVzaW5rIGxvY2F0aW9uPXZpZGVvLjNncAorICogXXwKKyAqIFJlY29yZHMgYSB2aWRlbyBzdHJlYW0gY2FwdHVyZWQgZnJvbSBhIHY0bDIgZGV2aWNlLCBlbmNvZGVzIGl0IGludG8gSC4yNjMKKyAqIGFuZCBtdXhlcyBpdCBpbnRvIGFuIDNncCBmaWxlLgorICogPC9yZWZzZWN0Mj4KKyAqCisgKiBEb2N1bWVudGF0aW9uIGxhc3QgcmV2aWV3ZWQgb24gMjAxMS0wNC0yMQorICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IG1qMnBtdXggPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LW1qMm11eAorICogQHNob3J0X2Rlc2NyaXB0aW9uOiBNdXhlciBmb3IgTW90aW9uIEpQRUctMjAwMCAoLm1qMikgZmlsZXMKKyAqCisgKiBUaGlzIGVsZW1lbnQgbWVyZ2VzIHN0cmVhbXMgKGF1ZGlvIGFuZCB2aWRlbykgaW50byBNSjIgKC5tajIpIGZpbGVzLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgYmFja2dyb3VuZCBpbnRlbmRzIHRvIGV4cGxhaW4gd2h5IHZhcmlvdXMgc2ltaWxhciBtdXhlcnMKKyAqIGFyZSBwcmVzZW50IGluIHRoaXMgcGx1Z2luLgorICoKKyAqIFRoZSA8dWxpbmsgdXJsPSJodHRwOi8vd3d3LmFwcGxlLmNvbS9xdWlja3RpbWUvcmVzb3VyY2VzL3F0ZmlsZWZvcm1hdC5wZGYiPgorICogUXVpY2tUaW1lIGZpbGUgZm9ybWF0IHNwZWNpZmljYXRpb248L3VsaW5rPiBzZXJ2ZWQgYXMgYmFzaXMgZm9yIHRoZSBNUDQgZmlsZQorICogZm9ybWF0IHNwZWNpZmljYXRpb24gKG1wNG11eCksIGFuZCBhcyBzdWNoIHRoZSBRdWlja1RpbWUgZmlsZSBzdHJ1Y3R1cmUgaXMKKyAqIG5lYXJseSBpZGVudGljYWwgdG8gdGhlIHNvLWNhbGxlZCBJU08gQmFzZSBNZWRpYSBmaWxlIGZvcm1hdCBkZWZpbmVkIGluCisgKiBJU08gMTQ0OTYtMTIgKGV4Y2VwdCBmb3Igc29tZSBtZWRpYSBzcGVjaWZpYyBwYXJ0cykuCisgKiBJbiB0dXJuLCB0aGUgbGF0dGVyIElTTyBCYXNlIE1lZGlhIGZvcm1hdCB3YXMgZnVydGhlciBzcGVjaWFsaXplZCBhcyBhCisgKiBNb3Rpb24gSlBFRy0yMDAwIGZpbGUgZm9ybWF0IGluIElTTyAxNTQ0NC0zIChtajJtdXgpCisgKiBhbmQgaW4gdmFyaW91cyAzR1BQKDIpIHNwZWNzICgzZ3BwbXV4KS4KKyAqIFRoZSBmcmFnbWVudGVkIGZpbGUgZmVhdHVyZXMgZGVmaW5lZCAob25seSkgaW4gSVNPIEJhc2UgTWVkaWEgYXJlIHVzZWQgYnkKKyAqIElTTVYgZmlsZXMgbWFraW5nIHVwIChhLm8uKSBTbW9vdGggU3RyZWFtaW5nIChpc21sbXV4KS4KKyAqCisgKiBBIGZldyBwcm9wZXJ0aWVzICgjR3N0TUoyTXV4Om1vdmllLXRpbWVzY2FsZSwgI0dzdE1KMk11eDp0cmFrLXRpbWVzY2FsZSkKKyAqIGFsbG93IGFkanVzdGluZyBzb21lIHRlY2huaWNhbCBwYXJhbWV0ZXJzLCB3aGljaCBtaWdodCBiZSB1c2VmdWwgaW4gKHJhcmUpCisgKiBjYXNlcyB0byByZXNvbHZlIGNvbXBhdGliaWxpdHkgaXNzdWVzIGluIHNvbWUgc2l0dWF0aW9ucy4KKyAqCisgKiBTb21lIG90aGVyIHByb3BlcnRpZXMgaW5mbHVlbmNlIHRoZSByZXN1bHQgbW9yZSBmdW5kYW1lbnRhbGx5LgorICogQSB0eXBpY2FsIG1vdi9tcDQgZmlsZSdzIG1ldGFkYXRhIChha2EgbW9vdikgaXMgbG9jYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLAorICogc29tZXdoYXQgY29udHJhcnkgdG8gdGhpcyB1c3VhbGx5IGJlaW5nIGNhbGxlZCAidGhlIGhlYWRlciIuIEhvd2V2ZXIsIGEKKyAqICNHc3RNSjJNdXg6ZmFzdHN0YXJ0IGZpbGUgd2lsbCAod2l0aCBzb21lIGVmZm9ydCkgYXJyYW5nZSB0aGlzIHRvIGJlIGxvY2F0ZWQKKyAqIG5lYXIgc3RhcnQgb2YgdGhlIGZpbGUsIHdoaWNoIHRoZW4gYWxsb3dzIGl0IGUuZy4gdG8gYmUgcGxheWVkIHdoaWxlCisgKiBkb3dubG9hZGluZy4gQWx0ZXJuYXRpdmVseSwgcmF0aGVyIHRoYW4gaGF2aW5nIG9uZSBjaHVuayBvZiBtZXRhZGF0YSBhdCBzdGFydAorICogKG9yIGVuZCksIHRoZXJlIGNhbiBiZSBzb21lIG1ldGFkYXRhIGF0IHN0YXJ0IGFuZCBtb3N0IG9mIHRoZSBvdGhlciBkYXRhIGNhbgorICogYmUgc3ByZWFkIG91dCBpbnRvIGZyYWdtZW50cyBvZiAjR3N0TUoyTXV4OmZyYWdtZW50LWR1cmF0aW9uLiBJZiBzdWNoCisgKiBmcmFnbWVudGVkIGxheW91dCBpcyBpbnRlbmRlZCBmb3Igc3RyZWFtaW5nIHB1cnBvc2VzLCB0aGVuCisgKiAjR3N0TUoyTXV4OnN0cmVhbWFibGUgYWxsb3dzIGZvcmVnb2luZyB0byBhZGQgaW5kZXggbWV0YWRhdGEgKGF0IHRoZSBlbmQgb2YKKyAqIGZpbGUpLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdjRsMnNyYyBudW0tYnVmZmVycz01MCAhIHF1ZXVlICEganAya2VuYyAhIG1qMm11eCAhIGZpbGVzaW5rIGxvY2F0aW9uPXZpZGVvLm1qMgorICogXXwKKyAqIFJlY29yZHMgYSB2aWRlbyBzdHJlYW0gY2FwdHVyZWQgZnJvbSBhIHY0bDIgZGV2aWNlLCBlbmNvZGVzIGl0IGludG8gSlBFRy0yMDAwCisgKiBhbmQgbXV4ZXMgaXQgaW50byBhbiBtajIgZmlsZS4KKyAqIDwvcmVmc2VjdDI+CisgKgorICogRG9jdW1lbnRhdGlvbiBsYXN0IHJldmlld2VkIG9uIDIwMTEtMDQtMjEKKyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBpc21sbXV4ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1pc21sbXV4CisgKiBAc2hvcnRfZGVzY3JpcHRpb246IE11eGVyIGZvciBJU01MIHNtb290aCBzdHJlYW1pbmcgKC5pc21sKSBmaWxlcworICoKKyAqIFRoaXMgZWxlbWVudCBtZXJnZXMgc3RyZWFtcyAoYXVkaW8gYW5kIHZpZGVvKSBpbnRvIE1KMiAoLm1qMikgZmlsZXMuCisgKgorICogVGhlIGZvbGxvd2luZyBiYWNrZ3JvdW5kIGludGVuZHMgdG8gZXhwbGFpbiB3aHkgdmFyaW91cyBzaW1pbGFyIG11eGVycworICogYXJlIHByZXNlbnQgaW4gdGhpcyBwbHVnaW4uCisgKgorICogVGhlIDx1bGluayB1cmw9Imh0dHA6Ly93d3cuYXBwbGUuY29tL3F1aWNrdGltZS9yZXNvdXJjZXMvcXRmaWxlZm9ybWF0LnBkZiI+CisgKiBRdWlja1RpbWUgZmlsZSBmb3JtYXQgc3BlY2lmaWNhdGlvbjwvdWxpbms+IHNlcnZlZCBhcyBiYXNpcyBmb3IgdGhlIE1QNCBmaWxlCisgKiBmb3JtYXQgc3BlY2lmaWNhdGlvbiAobXA0bXV4KSwgYW5kIGFzIHN1Y2ggdGhlIFF1aWNrVGltZSBmaWxlIHN0cnVjdHVyZSBpcworICogbmVhcmx5IGlkZW50aWNhbCB0byB0aGUgc28tY2FsbGVkIElTTyBCYXNlIE1lZGlhIGZpbGUgZm9ybWF0IGRlZmluZWQgaW4KKyAqIElTTyAxNDQ5Ni0xMiAoZXhjZXB0IGZvciBzb21lIG1lZGlhIHNwZWNpZmljIHBhcnRzKS4KKyAqIEluIHR1cm4sIHRoZSBsYXR0ZXIgSVNPIEJhc2UgTWVkaWEgZm9ybWF0IHdhcyBmdXJ0aGVyIHNwZWNpYWxpemVkIGFzIGEKKyAqIE1vdGlvbiBKUEVHLTIwMDAgZmlsZSBmb3JtYXQgaW4gSVNPIDE1NDQ0LTMgKG1qMm11eCkKKyAqIGFuZCBpbiB2YXJpb3VzIDNHUFAoMikgc3BlY3MgKDNncHBtdXgpLgorICogVGhlIGZyYWdtZW50ZWQgZmlsZSBmZWF0dXJlcyBkZWZpbmVkIChvbmx5KSBpbiBJU08gQmFzZSBNZWRpYSBhcmUgdXNlZCBieQorICogSVNNViBmaWxlcyBtYWtpbmcgdXAgKGEuby4pIFNtb290aCBTdHJlYW1pbmcgKGlzbWxtdXgpLgorICoKKyAqIEEgZmV3IHByb3BlcnRpZXMgKCNHc3RJU01MTXV4Om1vdmllLXRpbWVzY2FsZSwgI0dzdElTTUxNdXg6dHJhay10aW1lc2NhbGUpCisgKiBhbGxvdyBhZGp1c3Rpbmcgc29tZSB0ZWNobmljYWwgcGFyYW1ldGVycywgd2hpY2ggbWlnaHQgYmUgdXNlZnVsIGluIChyYXJlKQorICogY2FzZXMgdG8gcmVzb2x2ZSBjb21wYXRpYmlsaXR5IGlzc3VlcyBpbiBzb21lIHNpdHVhdGlvbnMuCisgKgorICogU29tZSBvdGhlciBwcm9wZXJ0aWVzIGluZmx1ZW5jZSB0aGUgcmVzdWx0IG1vcmUgZnVuZGFtZW50YWxseS4KKyAqIEEgdHlwaWNhbCBtb3YvbXA0IGZpbGUncyBtZXRhZGF0YSAoYWthIG1vb3YpIGlzIGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwKKyAqIHNvbWV3aGF0IGNvbnRyYXJ5IHRvIHRoaXMgdXN1YWxseSBiZWluZyBjYWxsZWQgInRoZSBoZWFkZXIiLiBIb3dldmVyLCBhCisgKiAjR3N0SVNNTE11eDpmYXN0c3RhcnQgZmlsZSB3aWxsICh3aXRoIHNvbWUgZWZmb3J0KSBhcnJhbmdlIHRoaXMgdG8gYmUgbG9jYXRlZAorICogbmVhciBzdGFydCBvZiB0aGUgZmlsZSwgd2hpY2ggdGhlbiBhbGxvd3MgaXQgZS5nLiB0byBiZSBwbGF5ZWQgd2hpbGUKKyAqIGRvd25sb2FkaW5nLiBBbHRlcm5hdGl2ZWx5LCByYXRoZXIgdGhhbiBoYXZpbmcgb25lIGNodW5rIG9mIG1ldGFkYXRhIGF0IHN0YXJ0CisgKiAob3IgZW5kKSwgdGhlcmUgY2FuIGJlIHNvbWUgbWV0YWRhdGEgYXQgc3RhcnQgYW5kIG1vc3Qgb2YgdGhlIG90aGVyIGRhdGEgY2FuCisgKiBiZSBzcHJlYWQgb3V0IGludG8gZnJhZ21lbnRzIG9mICNHc3RJU01MTXV4OmZyYWdtZW50LWR1cmF0aW9uLiBJZiBzdWNoCisgKiBmcmFnbWVudGVkIGxheW91dCBpcyBpbnRlbmRlZCBmb3Igc3RyZWFtaW5nIHB1cnBvc2VzLCB0aGVuCisgKiAjR3N0SVNNTE11eDpzdHJlYW1hYmxlIGFsbG93cyBmb3JlZ29pbmcgdG8gYWRkIGluZGV4IG1ldGFkYXRhIChhdCB0aGUgZW5kIG9mCisgKiBmaWxlKS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHY0bDJzcmMgbnVtLWJ1ZmZlcnM9NTAgISBxdWV1ZSAhIGpwMmtlbmMgISBtajJtdXggISBmaWxlc2luayBsb2NhdGlvbj12aWRlby5tajIKKyAqIF18CisgKiBSZWNvcmRzIGEgdmlkZW8gc3RyZWFtIGNhcHR1cmVkIGZyb20gYSB2NGwyIGRldmljZSwgZW5jb2RlcyBpdCBpbnRvIEpQRUctMjAwMAorICogYW5kIG11eGVzIGl0IGludG8gYW4gbWoyIGZpbGUuCisgKiA8L3JlZnNlY3QyPgorICoKKyAqIERvY3VtZW50YXRpb24gbGFzdCByZXZpZXdlZCBvbiAyMDExLTA0LTIxCisgKi8KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvZ3N0cXRtdXgtZG9jLmggYi9nc3QvaXNvbXA0L2dzdHF0bXV4LWRvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMTIxNjQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L2dzdHF0bXV4LWRvYy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIFF1aWNrdGltZSBtdXhlciBkb2N1bWVudGF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5icj4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zZi5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb250YWN0OiBTdGVmYW4gS29zdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKgorICogVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIFNvdXJjZSBDb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlLgorICogU2VlIGZ1cnRoZXIgZXhwbGFuYXRpb24gYXR0YWNoZWQgaW4gTGljZW5zZSBTdGF0ZW1lbnQgKGRpc3RyaWJ1dGVkIGluIHRoZSBmaWxlCisgKiBMSUNFTlNFKS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2Vycm9yICJUaGlzIGhlYWRlciBpcyBmb3IgZ3RrLWRvYyBvbmx5IGFuZCBub3Qgc3VwcG9zZWQgdG8gYmUgaW5jbHVkZWQiCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RNUDRNdXggR3N0TVA0TXV4OwordHlwZWRlZiBzdHJ1Y3QgX0dzdDNHUFBNdXggR3N0M0dQUE11eDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RJU01MTXV4IEdzdElTTUxNdXg7Cit0eXBlZGVmIHN0cnVjdCBfR3N0TUoyTXV4IEdzdE1KMk11eDsKKwpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9nc3RxdG11eC5jIGIvZ3N0L2lzb21wNC9nc3RxdG11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZTE3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L2dzdHF0bXV4LmMKQEAgLTAsMCArMSw2MzIyIEBACisvKiBRdWlja3RpbWUgbXV4ZXIgcGx1Z2luIGZvciBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyPgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNmLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxNCBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKyAqIENvbnRhY3Q6IFN0ZWZhbiBLb3N0IDxzdGVmYW4ua29zdEBub2tpYS5jb20+CisKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKgorICogVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIFNvdXJjZSBDb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlLgorICogU2VlIGZ1cnRoZXIgZXhwbGFuYXRpb24gYXR0YWNoZWQgaW4gTGljZW5zZSBTdGF0ZW1lbnQgKGRpc3RyaWJ1dGVkIGluIHRoZSBmaWxlCisgKiBMSUNFTlNFKS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1xdG11eAorICogQHNob3J0X2Rlc2NyaXB0aW9uOiBNdXhlciBmb3IgcXVpY2t0aW1lKC5tb3YpIGZpbGVzCisgKgorICogVGhpcyBlbGVtZW50IG1lcmdlcyBzdHJlYW1zIChhdWRpbyBhbmQgdmlkZW8pIGludG8gUXVpY2tUaW1lKC5tb3YpIGZpbGVzLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgYmFja2dyb3VuZCBpbnRlbmRzIHRvIGV4cGxhaW4gd2h5IHZhcmlvdXMgc2ltaWxhciBtdXhlcnMKKyAqIGFyZSBwcmVzZW50IGluIHRoaXMgcGx1Z2luLgorICoKKyAqIFRoZSA8dWxpbmsgdXJsPSJodHRwOi8vd3d3LmFwcGxlLmNvbS9xdWlja3RpbWUvcmVzb3VyY2VzL3F0ZmlsZWZvcm1hdC5wZGYiPgorICogUXVpY2tUaW1lIGZpbGUgZm9ybWF0IHNwZWNpZmljYXRpb248L3VsaW5rPiBzZXJ2ZWQgYXMgYmFzaXMgZm9yIHRoZSBNUDQgZmlsZQorICogZm9ybWF0IHNwZWNpZmljYXRpb24gKG1wNG11eCksIGFuZCBhcyBzdWNoIHRoZSBRdWlja1RpbWUgZmlsZSBzdHJ1Y3R1cmUgaXMKKyAqIG5lYXJseSBpZGVudGljYWwgdG8gdGhlIHNvLWNhbGxlZCBJU08gQmFzZSBNZWRpYSBmaWxlIGZvcm1hdCBkZWZpbmVkIGluCisgKiBJU08gMTQ0OTYtMTIgKGV4Y2VwdCBmb3Igc29tZSBtZWRpYSBzcGVjaWZpYyBwYXJ0cykuCisgKiBJbiB0dXJuLCB0aGUgbGF0dGVyIElTTyBCYXNlIE1lZGlhIGZvcm1hdCB3YXMgZnVydGhlciBzcGVjaWFsaXplZCBhcyBhCisgKiBNb3Rpb24gSlBFRy0yMDAwIGZpbGUgZm9ybWF0IGluIElTTyAxNTQ0NC0zIChtajJtdXgpCisgKiBhbmQgaW4gdmFyaW91cyAzR1BQKDIpIHNwZWNzIChncHBtdXgpLgorICogVGhlIGZyYWdtZW50ZWQgZmlsZSBmZWF0dXJlcyBkZWZpbmVkIChvbmx5KSBpbiBJU08gQmFzZSBNZWRpYSBhcmUgdXNlZCBieQorICogSVNNViBmaWxlcyBtYWtpbmcgdXAgKGEuby4pIFNtb290aCBTdHJlYW1pbmcgKGlzbWxtdXgpLgorICoKKyAqIEEgZmV3IHByb3BlcnRpZXMgKCNHc3RRVE11eDptb3ZpZS10aW1lc2NhbGUsICNHc3RRVE11eDp0cmFrLXRpbWVzY2FsZSwKKyAqICNHc3RRVE11eFBhZDp0cmFrLXRpbWVzY2FsZSkgYWxsb3cgYWRqdXN0aW5nIHNvbWUgdGVjaG5pY2FsIHBhcmFtZXRlcnMsCisgKiB3aGljaCBtaWdodCBiZSB1c2VmdWwgaW4gKHJhcmUpIGNhc2VzIHRvIHJlc29sdmUgY29tcGF0aWJpbGl0eSBpc3N1ZXMgaW4KKyAqIHNvbWUgc2l0dWF0aW9ucy4KKyAqCisgKiBTb21lIG90aGVyIHByb3BlcnRpZXMgaW5mbHVlbmNlIHRoZSByZXN1bHQgbW9yZSBmdW5kYW1lbnRhbGx5LgorICogQSB0eXBpY2FsIG1vdi9tcDQgZmlsZSdzIG1ldGFkYXRhIChha2EgbW9vdikgaXMgbG9jYXRlZCBhdCB0aGUgZW5kIG9mIHRoZQorICogZmlsZSwgc29tZXdoYXQgY29udHJhcnkgdG8gdGhpcyB1c3VhbGx5IGJlaW5nIGNhbGxlZCAidGhlIGhlYWRlciIuCisgKiBIb3dldmVyLCBhICNHc3RRVE11eDpmYXN0c3RhcnQgZmlsZSB3aWxsICh3aXRoIHNvbWUgZWZmb3J0KSBhcnJhbmdlIHRoaXMgdG8KKyAqIGJlIGxvY2F0ZWQgbmVhciBzdGFydCBvZiB0aGUgZmlsZSwgd2hpY2ggdGhlbiBhbGxvd3MgaXQgZS5nLiB0byBiZSBwbGF5ZWQKKyAqIHdoaWxlIGRvd25sb2FkaW5nLiBBbHRlcm5hdGl2ZWx5LCByYXRoZXIgdGhhbiBoYXZpbmcgb25lIGNodW5rIG9mIG1ldGFkYXRhIGF0CisgKiBzdGFydCAob3IgZW5kKSwgdGhlcmUgY2FuIGJlIHNvbWUgbWV0YWRhdGEgYXQgc3RhcnQgYW5kIG1vc3Qgb2YgdGhlIG90aGVyCisgKiBkYXRhIGNhbiBiZSBzcHJlYWQgb3V0IGludG8gZnJhZ21lbnRzIG9mICNHc3RRVE11eDpmcmFnbWVudC1kdXJhdGlvbi4KKyAqIElmIHN1Y2ggZnJhZ21lbnRlZCBsYXlvdXQgaXMgaW50ZW5kZWQgZm9yIHN0cmVhbWluZyBwdXJwb3NlcywgdGhlbgorICogI0dzdFFUTXV4OnN0cmVhbWFibGUgYWxsb3dzIGZvcmVnb2luZyB0byBhZGQgaW5kZXggbWV0YWRhdGEgKGF0IHRoZSBlbmQgb2YKKyAqIGZpbGUpLgorICoKKyAqIFdoZW4gdGhlIG1heGltdW0gZHVyYXRpb24gdG8gYmUgcmVjb3JkZWQgY2FuIGJlIGtub3duIGluIGFkdmFuY2UsICNHc3RRVE11eAorICogYWxzbyBzdXBwb3J0cyBhICdSb2J1c3QgTXV4aW5nJyBtb2RlLiBJbiByb2J1c3QgbXV4aW5nIG1vZGUsICBzcGFjZSBmb3IgdGhlCisgKiBoZWFkZXJzIGFyZSByZXNlcnZlZCBhdCB0aGUgc3RhcnQgb2YgbXV4aW5nLCBhbmQgcmV3cml0dGVuIGF0IGEgY29uZmlndXJhYmxlCisgKiBpbnRlcnZhbCwgc28gdGhhdCB0aGUgb3V0cHV0IGZpbGUgaXMgYWx3YXlzIHBsYXlhYmxlLCBldmVuIGlmIHRoZSByZWNvcmRpbmcKKyAqIGlzIGludGVycnVwdGVkIHVuY2xlYW5seSBieSBhIGNyYXNoLiBSb2J1c3QgbXV4aW5nIG1vZGUgcmVxdWlyZXMgYSBzZWVrYWJsZQorICogb3V0cHV0LCBzdWNoIGFzIGZpbGVzaW5rLCBiZWNhdXNlIGl0IG5lZWRzIHRvIHJld3JpdGUgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgorICoKKyAqIFRvIGVuYWJsZSByb2J1c3QgbXV4aW5nIG1vZGUsIHNldCB0aGUgI0dzdFFUTXV4OjpyZXNlcnZlZC1tb292LXVwZGF0ZS1wZXJpb2QKKyAqIGFuZCAjR3N0UVRNdXg6OnJlc2VydmVkLW1heC1kdXJhdGlvbiBwcm9wZXJ0eS4gQWxzbyBwcmVzZW50IGlzIHRoZQorICogI0dzdFFUTXV4OjpyZXNlcnZlZC1ieXRlcy1wZXItc2VjIHByb3BlcnR5LCB3aGljaCBjYW4gYmUgaW5jcmVhc2VkIGlmCisgKiBmb3Igc29tZSByZWFzb24gdGhlIGRlZmF1bHQgaXMgbm90IGxhcmdlIGVub3VnaCBhbmQgdGhlIGluaXRpYWwgcmVzZXJ2ZWQKKyAqIHNwYWNlIGZvciBoZWFkZXJzIGlzIHRvbyBzbWFsbC4gQXBwbGljYXRpb25zIGNhbiBtb25pdG9yIHRoZQorICogI0dzdFFUTXV4OjpyZXNlcnZlZC1kdXJhdGlvbi1yZW1haW5pbmcgcHJvcGVydHkgdG8gc2VlIGhvdyBjbG9zZSB0byBmdWxsCisgKiB0aGUgcmVzZXJ2ZWQgc3BhY2UgaXMgYmVjb21pbmcuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB2NGwyc3JjIG51bS1idWZmZXJzPTUwMCAhIHZpZGVvL3gtcmF3LHdpZHRoPTMyMCxoZWlnaHQ9MjQwICEgdmlkZW9jb252ZXJ0ICEgcXRtdXggISBmaWxlc2luayBsb2NhdGlvbj12aWRlby5tb3YKKyAqIF18CisgKiBSZWNvcmRzIGEgdmlkZW8gc3RyZWFtIGNhcHR1cmVkIGZyb20gYSB2NGwyIGRldmljZSBhbmQgbXV4ZXMgaXQgaW50byBhIHF0IGZpbGUuCisgKiA8L3JlZnNlY3QyPgorICovCisKKy8qCisgKiBCYXNlZCBvbiBhdmltdXgKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnbGliL2dzdGRpby5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGNvbGxlY3RwYWRzLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXJlYWRlci5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJpdHJlYWRlci5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC90YWcvdGFnLmg+CisjaW5jbHVkZSA8Z3N0L3BidXRpbHMvcGJ1dGlscy5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgR19PU19XSU4zMgorI2luY2x1ZGUgPGlvLmg+ICAgICAgICAgICAgICAgICAvKiBsc2Vlaywgb3BlbiwgY2xvc2UsIHJlYWQgKi8KKyN1bmRlZiBsc2VlaworI2RlZmluZSBsc2VlayBfbHNlZWtpNjQKKyN1bmRlZiBvZmZfdAorI2RlZmluZSBvZmZfdCBndWludDY0CisjZW5kaWYKKworI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIGZ0cnVuY2F0ZSBnX3dpbjMyX2Z0cnVuY2F0ZQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjICBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0cXRtdXguaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3F0X211eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfcXRfbXV4X2RlYnVnCisKKyNpZm5kZWYgQUJTRElGRgorI2RlZmluZSBBQlNESUZGKGEsIGIpICgoYSkgPiAoYikgPyAoYSkgLSAoYikgOiAoYikgLSAoYSkpCisjZW5kaWYKKworLyogSGFja2VyIG5vdGVzLgorICoKKyAqIFRoZSBiYXNpYyBidWlsZGluZyBibG9ja3Mgb2YgTVA0IGZpbGVzIGFyZToKKyAqICAtIGFuICdmdHlwJyBib3ggYXQgdGhlIHZlcnkgc3RhcnQKKyAqICAtIGFuICdtZGF0JyBib3ggd2hpY2ggY29udGFpbnMgdGhlIHJhdyBhdWRpby92aWRlby9zdWJ0aXRsZSBkYXRhOworICogICAgdGhpcyBpcyBqdXN0IGEgYnVuY2ggb2YgYnl0ZXMsIGNvbXBsZXRlbHkgdW5mcmFtZWQgYW5kIHBvc3NpYmx5CisgKiAgICB1bm9yZGVyZWQgd2l0aCBubyBhZGRpdGlvbmFsIG1ldGEtaW5mb3JtYXRpb24KKyAqICAtIGEgJ21vb3YnIGJveCB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkaWZmZXJlbnQgc3RyZWFtcworICogICAgYW5kIHdoYXQgdGhleSBjb250YWluLCBhcyB3ZWxsIGFzIHNhbXBsZSB0YWJsZXMgZm9yIGVhY2ggc3RyZWFtCisgKiAgICB0aGF0IHRlbGwgdGhlIGRlbXV4ZXIgd2hlcmUgaW4gdGhlIG1kYXQgYm94IGVhY2ggYnVmZmVyL3NhbXBsZSBpcworICogICAgYW5kIHdoYXQgaXRzIGR1cmF0aW9uL3RpbWVzdGFtcCBldGMuIGlzLCBhbmQgd2hldGhlciBpdCdzIGEKKyAqICAgIGtleWZyYW1lIGV0Yy4KKyAqIEFkZGl0aW9uYWxseSwgZnJhZ21lbnRlZCBNUDQgd29ya3MgYnkgd3JpdGluZyBjaHVua3Mgb2YgZGF0YSBpbgorICogcGFpcnMgb2YgJ21vb2YnIGFuZCAnbWRhdCcgYm94ZXM6CisgKiAgLSAnbW9vZicgYm94ZXMsIGhlYWRlciBwcmVjZWRpbmcgZWFjaCBtZGF0IGZyYWdtZW50IGRlc2NyaWJpbmcgdGhlCisgKiAgICBjb250ZW50cywgbGlrZSBhIG1vb3YgYnV0IG9ubHkgZm9yIHRoYXQgZnJhZ21lbnQuCisgKiAgLSBhICdtZnJhJyBib3ggZm9yIEZyYWdtZW50ZWQgTVA0LCB3aGljaCBpcyB3cml0dGVuIGF0IHRoZSBlbmQgYW5kCisgKiAgICBjb250YWlucyBhIHN1bW1hcnkgb2YgYWxsIGZyYWdtZW50cyBhbmQgc2VlayB0YWJsZXMuCisgKgorICogQ3VycmVudGx5IG1wNG11eCBjYW4gd29yayBpbiA0IGRpZmZlcmVudCBtb2RlcyAvIGdlbmVyYXRlIDQgdHlwZXMKKyAqIG9mIG91dHB1dCBmaWxlcy9zdHJlYW1zOgorICoKKyAqIC0gTm9ybWFsIG1wNDogbXA0bXV4IHdpbGwgd3JpdGUgYSBsaXR0bGUgZnR5cCBpZGVudGlmaWVyIGF0IHRoZQorICogICBiZWdpbm5pbmcsIHRoZW4gc3RhcnQgYW4gbWRhdCBib3ggaW50byB3aGljaCBpdCB3aWxsIHdyaXRlIGFsbCB0aGUKKyAqICAgc2FtcGxlIGRhdGEuIEF0IEVPUyBpdCB3aWxsIHRoZW4gd3JpdGUgdGhlIG1vb3YgaGVhZGVyIHdpdGggdHJhY2sKKyAqICAgaGVhZGVycyBhbmQgc2FtcGxlIHRhYmxlcyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgcmV3cml0ZSB0aGUKKyAqICAgc3RhcnQgb2YgdGhlIGZpbGUgdG8gZml4IHVwIHRoZSBtZGF0IGJveCBzaXplIGF0IHRoZSBiZWdpbm5pbmcuCisgKiAgIEl0IGhhcyB0byB3YWl0IGZvciBFT1MgdG8gd3JpdGUgdGhlIG1vb3YgKHdoaWNoIGluY2x1ZGVzIHRoZQorICogICBzYW1wbGUgdGFibGVzKSBiZWNhdXNlIGl0IGRvZXNuJ3Qga25vdyBob3cgbXVjaCBzcGFjZSB0aG9zZQorICogICB0YWJsZXMgd2lsbCBiZS4gVGhlIG91dHB1dCBkb3duc3RyZWFtIG11c3QgYmUgc2Vla2FibGUgdG8gcmV3cml0ZQorICogICB0aGUgbWRhdCBib3ggYXQgRU9TLgorICoKKyAqIC0gRnJhZ21lbnRlZCBtcDQ6IG1vb3YgaGVhZGVyIHdpdGggdHJhY2sgaGVhZGVycyBhdCBzdGFydAorICogICBidXQgbm8gc2FtcGxlIHRhYmxlLCBmb2xsb3dlZCBieSBOIGZyYWdtZW50cywgZWFjaCBjb250YWluaW5nCisgKiAgIHRyYWNrIGhlYWRlcnMgd2l0aCBzYW1wbGUgdGFibGVzIGZvbGxvd2VkIGJ5IHNvbWUgZGF0YS4gRG93bnN0cmVhbQorICogICBkb2VzIG5vdCBuZWVkIHRvIGJlIHNlZWthYmxlIGlmIHRoZSAnc3RyZWFtYWJsZScgZmxhZyBpcyBUUlVFLAorICogICBhcyB0aGUgZmluYWwgbWZyYSBhbmQgdG90YWwgZHVyYXRpb24gd2lsbCBiZSBvbWl0dGVkLgorICoKKyAqIC0gRmFzdC1zdGFydCBtcDQ6IHRoZSBnb2FsIGhlcmUgaXMgdG8gY3JlYXRlIGEgZmlsZSB3aGVyZSB0aGUgbW9vdgorICogICBoZWFkZXJzIGFyZSBhdCB0aGUgYmVnaW5uaW5nOyB3aGF0IG1wNG11eCB3aWxsIGRvIGlzIHdyaXRlIGFsbAorICogICBzYW1wbGUgZGF0YSBpbnRvIGEgdGVtcCBmaWxlIGFuZCBidWlsZCBtb292IGhlYWRlciBwbHVzIHNhbXBsZQorICogICB0YWJsZXMgaW4gbWVtb3J5IGFuZCB0aGVuIHdoZW4gRU9TIGNvbWVzLCBpdCB3aWxsIHB1c2ggb3V0IHRoZQorICogICBtb292IGhlYWRlciBwbHVzIHNhbXBsZSB0YWJsZXMgYXQgdGhlIGJlZ2lubmluZywgZm9sbG93ZWQgYnkgdGhlCisgKiAgIG1kYXQgc2FtcGxlIGRhdGEgYXQgdGhlIGVuZCB3aGljaCBpcyByZWFkIGluIGZyb20gdGhlIHRlbXAgZmlsZQorICogICBGaWxlcyBjcmVhdGVkIGluIHRoaXMgbW9kZSBhcmUgYmV0dGVyIGZvciBzdHJlYW1pbmcgb3ZlciB0aGUKKyAqICAgbmV0d29yaywgc2luY2UgdGhlIGNsaWVudCBkb2Vzbid0IGhhdmUgdG8gc2VlayB0byB0aGUgZW5kIG9mIHRoZQorICogICBmaWxlIHRvIGdldCB0aGUgaGVhZGVycywgYnV0IGl0IHJlcXVpcmVzIGNvcHlpbmcgYWxsIHNhbXBsZSBkYXRhCisgKiAgIG91dCBvZiB0aGUgdGVtcCBmaWxlIGF0IEVPUywgd2hpY2ggY2FuIGJlIGV4cGVuc2l2ZS4gRG93bnN0cmVhbSBkb2VzCisgKiAgIG5vdCBuZWVkIHRvIGJlIHNlZWthYmxlLCBiZWNhdXNlIG9mIHRoZSB1c2Ugb2YgdGhlIHRlbXAgZmlsZS4KKyAqCisgKiAtIFJvYnVzdCBNdXhpbmcgbW9kZTogSW4gdGhpcyBtb2RlLCBxdG11eCB1c2VzIHRoZSByZXNlcnZlZC1tYXgtZHVyYXRpb24KKyAqICAgYW5kIHJlc2VydmVkLW1vb3YtdXBkYXRlLXBlcmlvZCBwcm9wZXJ0aWVzIHRvIHJlc2VydmUgZnJlZSBzcGFjZQorICogICBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpbGUgYW5kIHBlcmlvZGljYWxseSB3cml0ZSB0aGUgTU9PViBhdG9tIG91dAorICogICB0byBpdC4gVGhhdCBtZWFucyB0aGF0IGtpbGxpbmcgdGhlIG11eGluZyBhdCBhbnkgcG9pbnQgc3RpbGwKKyAqICAgcmVzdWx0cyBpbiBhIHBsYXlhYmxlIGZpbGUsIGF0IHRoZSBjb3N0IG9mIHdhc3Rpbmcgc29tZSBhbW91bnQgb2YKKyAqICAgZnJlZSBzcGFjZSBhdCB0aGUgc3RhcnQgb2YgZmlsZS4gVGhlIGFwcHJveGltYXRlIHJlY29yZGluZyBkdXJhdGlvbgorICogICBoYXMgdG8gYmUga25vd24gaW4gYWR2YW5jZSB0byBlc3RpbWF0ZSBob3cgbXVjaCBmcmVlIHNwYWNlIHRvIHJlc2VydmUKKyAqICAgZm9yIHRoZSBtb292LCBhbmQgdGhlIGRvd25zdHJlYW0gbXVzdCBiZSBzZWVrYWJsZS4KKyAqICAgSWYgdGhlIG1vb3YgaGVhZGVyIGdyb3dzIGxhcmdlciB0aGFuIHRoZSByZXNlcnZlZCBzcGFjZSwgYW4gZXJyb3IKKyAqICAgaXMgZ2VuZXJhdGVkIC0gc28gaXQncyBiZXR0ZXIgdG8gb3Zlci1lc3RpbWF0ZSB0aGUgYW1vdW50IG9mIHNwYWNlCisgKiAgIHRvIHJlc2VydmUuIFRvIGVuc3VyZSB0aGUgZmlsZSBpcyBwbGF5YWJsZSBhdCBhbnkgcG9pbnQsIHRoZSBtb292CisgKiAgIGlzIHVwZGF0ZWQgdXNpbmcgYSAncGluZy1wb25nJyBzdHJhdGVneSwgc28gdGhlIG91dHB1dCBpcyBuZXZlciBpbgorICogICBhbiBpbnZhbGlkIHN0YXRlLgorICovCisKKyNpZm5kZWYgR1NUX1JFTU9WRV9ERVBSRUNBVEVECitlbnVtCit7CisgIERUU19NRVRIT0RfREQsCisgIERUU19NRVRIT0RfUkVPUkRFUiwKKyAgRFRTX01FVEhPRF9BU0MKK307CisKK3N0YXRpYyBHVHlwZQorZ3N0X3F0X211eF9kdHNfbWV0aG9kX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgZ3N0X3F0X211eF9kdHNfbWV0aG9kID0gMDsKKworICBpZiAoIWdzdF9xdF9tdXhfZHRzX21ldGhvZCkgeworICAgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIGR0c19tZXRob2RzW10gPSB7CisgICAgICB7RFRTX01FVEhPRF9ERCwgImRlbHRhL2R1cmF0aW9uIiwgImRkIn0sCisgICAgICB7RFRTX01FVEhPRF9SRU9SREVSLCAicmVvcmRlciIsICJyZW9yZGVyIn0sCisgICAgICB7RFRTX01FVEhPRF9BU0MsICJhc2NlbmRpbmciLCAiYXNjIn0sCisgICAgICB7MCwgTlVMTCwgTlVMTH0sCisgICAgfTsKKworICAgIGdzdF9xdF9tdXhfZHRzX21ldGhvZCA9CisgICAgICAgIGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RRVE11eER0c01ldGhvZHMiLCBkdHNfbWV0aG9kcyk7CisgIH0KKworICByZXR1cm4gZ3N0X3F0X211eF9kdHNfbWV0aG9kOworfQorCisjZGVmaW5lIEdTVF9UWVBFX1FUX01VWF9EVFNfTUVUSE9EIFwKKyAgKGdzdF9xdF9tdXhfZHRzX21ldGhvZF9nZXRfdHlwZSAoKSkKKyNlbmRpZgorCitlbnVtCit7CisgIFBST1BfUEFEXzAsCisgIFBST1BfUEFEX1RSQUtfVElNRVNDQUxFLAorfTsKKworI2RlZmluZSBERUZBVUxUX1BBRF9UUkFLX1RJTUVTQ0FMRSAgICAgICAgICAwCisKK0dUeXBlIGdzdF9xdF9tdXhfcGFkX2dldF90eXBlICh2b2lkKTsKKworI2RlZmluZSBHU1RfVFlQRV9RVF9NVVhfUEFEIFwKKyAgKGdzdF9xdF9tdXhfcGFkX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9RVF9NVVhfUEFEKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBHU1RfVFlQRV9RVF9NVVhfUEFELCBHc3RRVE11eFBhZCkpCisjZGVmaW5lIEdTVF9RVF9NVVhfUEFEX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfUVRfTVVYX1BBRCwgR3N0UVRNdXhQYWRDbGFzcykpCisjZGVmaW5lIEdTVF9JU19RVF9NVVhfUEFEKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9RVF9NVVhfUEFEKSkKKyNkZWZpbmUgR1NUX0lTX1FUX01VWF9QQURfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9RVF9NVVhfUEFEKSkKKyNkZWZpbmUgR1NUX1FUX01VWF9QQURfQ0FTVChvYmopIFwKKyAgKChHc3RRVE11eFBhZCAqKShvYmopKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UVRNdXhQYWQgR3N0UVRNdXhQYWQ7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UVRNdXhQYWRDbGFzcyBHc3RRVE11eFBhZENsYXNzOworCitzdHJ1Y3QgX0dzdFFUTXV4UGFkCit7CisgIEdzdFBhZCBwYXJlbnQ7CisKKyAgZ3VpbnQzMiB0cmFrX3RpbWVzY2FsZTsKK307CisKK3N0cnVjdCBfR3N0UVRNdXhQYWRDbGFzcworeworICBHc3RQYWRDbGFzcyBwYXJlbnQ7Cit9OworCitHX0RFRklORV9UWVBFIChHc3RRVE11eFBhZCwgZ3N0X3F0X211eF9wYWQsIEdTVF9UWVBFX1BBRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbXV4X3BhZF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UVRNdXhQYWQgKnBhZCA9IEdTVF9RVF9NVVhfUEFEX0NBU1QgKG9iamVjdCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChwYWQpOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUEFEX1RSQUtfVElNRVNDQUxFOgorICAgICAgcGFkLT50cmFrX3RpbWVzY2FsZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHBhZCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbXV4X3BhZF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UVRNdXhQYWQgKnBhZCA9IEdTVF9RVF9NVVhfUEFEX0NBU1QgKG9iamVjdCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChwYWQpOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUEFEX1RSQUtfVElNRVNDQUxFOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHBhZC0+dHJha190aW1lc2NhbGUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAocGFkKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfcGFkX2NsYXNzX2luaXQgKEdzdFFUTXV4UGFkQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcXRfbXV4X3BhZF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9xdF9tdXhfcGFkX3NldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BBRF9UUkFLX1RJTUVTQ0FMRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgidHJhay10aW1lc2NhbGUiLCAiVHJhY2sgdGltZXNjYWxlIiwKKyAgICAgICAgICAiVGltZXNjYWxlIHRvIHVzZSBmb3IgdGhpcyBwYWQncyB0cmFrICh1bml0cyBwZXIgc2Vjb25kLCAwIGlzIGF1dG9tYXRpYykiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVDMyLCBERUZBVUxUX1BBRF9UUkFLX1RJTUVTQ0FMRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9wYWRfaW5pdCAoR3N0UVRNdXhQYWQgKiBwYWQpCit7CisgIHBhZC0+dHJha190aW1lc2NhbGUgPSBERUZBVUxUX1BBRF9UUkFLX1RJTUVTQ0FMRTsKK30KKworc3RhdGljIGd1aW50MzIKK2dzdF9xdF9tdXhfcGFkX2dldF90aW1lc2NhbGUgKEdzdFFUTXV4UGFkICogcGFkKQoreworICBndWludDMyIHRpbWVzY2FsZTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHBhZCk7CisgIHRpbWVzY2FsZSA9IHBhZC0+dHJha190aW1lc2NhbGU7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChwYWQpOworCisgIHJldHVybiB0aW1lc2NhbGU7Cit9CisKKy8qIFFUTXV4IHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTU9WSUVfVElNRVNDQUxFLAorICBQUk9QX1RSQUtfVElNRVNDQUxFLAorICBQUk9QX0ZBU1RfU1RBUlQsCisgIFBST1BfRkFTVF9TVEFSVF9URU1QX0ZJTEUsCisgIFBST1BfTU9PVl9SRUNPVl9GSUxFLAorICBQUk9QX0ZSQUdNRU5UX0RVUkFUSU9OLAorICBQUk9QX1NUUkVBTUFCTEUsCisgIFBST1BfUkVTRVJWRURfTUFYX0RVUkFUSU9OLAorICBQUk9QX1JFU0VSVkVEX0RVUkFUSU9OX1JFTUFJTklORywKKyAgUFJPUF9SRVNFUlZFRF9NT09WX1VQREFURV9QRVJJT0QsCisgIFBST1BfUkVTRVJWRURfQllURVNfUEVSX1NFQywKKyAgUFJPUF9SRVNFUlZFRF9QUkVGSUxMLAorI2lmbmRlZiBHU1RfUkVNT1ZFX0RFUFJFQ0FURUQKKyAgUFJPUF9EVFNfTUVUSE9ELAorI2VuZGlmCisgIFBST1BfRE9fQ1RUUywKKyAgUFJPUF9JTlRFUkxFQVZFX0JZVEVTLAorICBQUk9QX0lOVEVSTEVBVkVfVElNRSwKKyAgUFJPUF9NQVhfUkFXX0FVRElPX0RSSUZULAorfTsKKworLyogc29tZSBzcGFyZSBmb3IgaGVhZGVyIHNpemUgYXMgd2VsbCAqLworI2RlZmluZSBNREFUX0xBUkdFX0ZJTEVfTElNSVQgICAgICAgICAgICgoZ3VpbnQ2NCkgMTAyNCAqIDEwMjQgKiAxMDI0ICogMikKKworI2RlZmluZSBERUZBVUxUX01PVklFX1RJTUVTQ0FMRSAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9UUkFLX1RJTUVTQ0FMRSAgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfRE9fQ1RUUyAgICAgICAgICAgICAgICAgVFJVRQorI2RlZmluZSBERUZBVUxUX0ZBU1RfU1RBUlQgICAgICAgICAgICAgIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfRkFTVF9TVEFSVF9URU1QX0ZJTEUgICAgTlVMTAorI2RlZmluZSBERUZBVUxUX01PT1ZfUkVDT1ZfRklMRSAgICAgICAgIE5VTEwKKyNkZWZpbmUgREVGQVVMVF9GUkFHTUVOVF9EVVJBVElPTiAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfU1RSRUFNQUJMRSAgICAgICAgICAgICAgVFJVRQorI2lmbmRlZiBHU1RfUkVNT1ZFX0RFUFJFQ0FURUQKKyNkZWZpbmUgREVGQVVMVF9EVFNfTUVUSE9EICAgICAgICAgICAgICBEVFNfTUVUSE9EX1JFT1JERVIKKyNlbmRpZgorI2RlZmluZSBERUZBVUxUX1JFU0VSVkVEX01BWF9EVVJBVElPTiAgIEdTVF9DTE9DS19USU1FX05PTkUKKyNkZWZpbmUgREVGQVVMVF9SRVNFUlZFRF9NT09WX1VQREFURV9QRVJJT0QgICBHU1RfQ0xPQ0tfVElNRV9OT05FCisjZGVmaW5lIERFRkFVTFRfUkVTRVJWRURfQllURVNfUEVSX1NFQ19QRVJfVFJBSyA1NTAKKyNkZWZpbmUgREVGQVVMVF9SRVNFUlZFRF9QUkVGSUxMIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfSU5URVJMRUFWRV9CWVRFUyAwCisjZGVmaW5lIERFRkFVTFRfSU5URVJMRUFWRV9USU1FIDI1MCpHU1RfTVNFQ09ORAorI2RlZmluZSBERUZBVUxUX01BWF9SQVdfQVVESU9fRFJJRlQgNDAgKiBHU1RfTVNFQ09ORAorCitzdGF0aWMgdm9pZCBnc3RfcXRfbXV4X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9xdF9tdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworLyogcHJvcGVydHkgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBnc3RfcXRfbXV4X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9xdF9tdXhfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCisvKiBwYWQgZnVuY3Rpb25zICovCitzdGF0aWMgR3N0UGFkICpnc3RfcXRfbXV4X3JlcXVlc3RfbmV3X3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0UGFkVGVtcGxhdGUgKiB0ZW1wbCwgY29uc3QgZ2NoYXIgKiBuYW1lLCBjb25zdCBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgdm9pZCBnc3RfcXRfbXV4X3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKTsKKworLyogZXZlbnQgKi8KK3N0YXRpYyBnYm9vbGVhbiBnc3RfcXRfbXV4X3NpbmtfZXZlbnQgKEdzdENvbGxlY3RQYWRzICogcGFkcywKKyAgICBHc3RDb2xsZWN0RGF0YSAqIGRhdGEsIEdzdEV2ZW50ICogZXZlbnQsIGdwb2ludGVyIHVzZXJfZGF0YSk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9xdF9tdXhfY29sbGVjdGVkIChHc3RDb2xsZWN0UGFkcyAqIHBhZHMsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9xdF9tdXhfYWRkX2J1ZmZlciAoR3N0UVRNdXggKiBxdG11eCwgR3N0UVRQYWQgKiBwYWQsCisgICAgR3N0QnVmZmVyICogYnVmKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfcm9idXN0X3JlY29yZGluZ19yZXdyaXRlX21vb3YgKEdzdFFUTXV4ICogcXRtdXgpOworCitzdGF0aWMgdm9pZCBnc3RfcXRfbXV4X3VwZGF0ZV9nbG9iYWxfc3RhdGlzdGljcyAoR3N0UVRNdXggKiBxdG11eCk7CitzdGF0aWMgdm9pZCBnc3RfcXRfbXV4X3VwZGF0ZV9lZGl0X2xpc3RzIChHc3RRVE11eCAqIHF0bXV4KTsKKworc3RhdGljIEdzdEVsZW1lbnRDbGFzcyAqcGFyZW50X2NsYXNzID0gTlVMTDsKKworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfYmFzZV9pbml0IChncG9pbnRlciBnX2NsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoZ19jbGFzcyk7CisgIEdzdFFUTXV4Q2xhc3MgKmtsYXNzID0gKEdzdFFUTXV4Q2xhc3MgKikgZ19jbGFzczsKKyAgR3N0UVRNdXhDbGFzc1BhcmFtcyAqcGFyYW1zOworICBHc3RQYWRUZW1wbGF0ZSAqdmlkZW9zaW5rdGVtcGwsICphdWRpb3Npbmt0ZW1wbCwgKnN1YnRpdGxlc2lua3RlbXBsOworICBHc3RQYWRUZW1wbGF0ZSAqc3JjdGVtcGw7CisgIGdjaGFyICpsb25nbmFtZSwgKmRlc2NyaXB0aW9uOworCisgIHBhcmFtcyA9CisgICAgICAoR3N0UVRNdXhDbGFzc1BhcmFtcyAqKSBnX3R5cGVfZ2V0X3FkYXRhIChHX09CSkVDVF9DTEFTU19UWVBFIChnX2NsYXNzKSwKKyAgICAgIEdTVF9RVF9NVVhfUEFSQU1TX1FEQVRBKTsKKyAgZ19hc3NlcnQgKHBhcmFtcyAhPSBOVUxMKTsKKworICAvKiBjb25zdHJ1Y3QgdGhlIGVsZW1lbnQgZGV0YWlscyBzdHJ1Y3QgKi8KKyAgbG9uZ25hbWUgPSBnX3N0cmR1cF9wcmludGYgKCIlcyBNdXhlciIsIHBhcmFtcy0+cHJvcC0+bG9uZ19uYW1lKTsKKyAgZGVzY3JpcHRpb24gPSBnX3N0cmR1cF9wcmludGYgKCJNdWx0aXBsZXggYXVkaW8gYW5kIHZpZGVvIGludG8gYSAlcyBmaWxlIiwKKyAgICAgIHBhcmFtcy0+cHJvcC0+bG9uZ19uYW1lKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgbG9uZ25hbWUsCisgICAgICAiQ29kZWMvTXV4ZXIiLCBkZXNjcmlwdGlvbiwKKyAgICAgICJUaGlhZ28gU291c2EgU2FudG9zIDx0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5icj4iKTsKKyAgZ19mcmVlIChsb25nbmFtZSk7CisgIGdfZnJlZSAoZGVzY3JpcHRpb24pOworCisgIC8qIHBhZCB0ZW1wbGF0ZXMgKi8KKyAgc3JjdGVtcGwgPSBnc3RfcGFkX3RlbXBsYXRlX25ldyAoInNyYyIsIEdTVF9QQURfU1JDLAorICAgICAgR1NUX1BBRF9BTFdBWVMsIHBhcmFtcy0+c3JjX2NhcHMpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCBzcmN0ZW1wbCk7CisKKyAgaWYgKHBhcmFtcy0+YXVkaW9fc2lua19jYXBzKSB7CisgICAgYXVkaW9zaW5rdGVtcGwgPSBnc3RfcGFkX3RlbXBsYXRlX25ld193aXRoX2d0eXBlICgiYXVkaW9fJXUiLAorICAgICAgICBHU1RfUEFEX1NJTkssIEdTVF9QQURfUkVRVUVTVCwgcGFyYW1zLT5hdWRpb19zaW5rX2NhcHMsCisgICAgICAgIEdTVF9UWVBFX1FUX01VWF9QQUQpOworICAgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsIGF1ZGlvc2lua3RlbXBsKTsKKyAgfQorCisgIGlmIChwYXJhbXMtPnZpZGVvX3NpbmtfY2FwcykgeworICAgIHZpZGVvc2lua3RlbXBsID0gZ3N0X3BhZF90ZW1wbGF0ZV9uZXdfd2l0aF9ndHlwZSAoInZpZGVvXyV1IiwKKyAgICAgICAgR1NUX1BBRF9TSU5LLCBHU1RfUEFEX1JFUVVFU1QsIHBhcmFtcy0+dmlkZW9fc2lua19jYXBzLAorICAgICAgICBHU1RfVFlQRV9RVF9NVVhfUEFEKTsKKyAgICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCB2aWRlb3Npbmt0ZW1wbCk7CisgIH0KKworICBpZiAocGFyYW1zLT5zdWJ0aXRsZV9zaW5rX2NhcHMpIHsKKyAgICBzdWJ0aXRsZXNpbmt0ZW1wbCA9IGdzdF9wYWRfdGVtcGxhdGVfbmV3X3dpdGhfZ3R5cGUgKCJzdWJ0aXRsZV8ldSIsCisgICAgICAgIEdTVF9QQURfU0lOSywgR1NUX1BBRF9SRVFVRVNULCBwYXJhbXMtPnN1YnRpdGxlX3NpbmtfY2FwcywKKyAgICAgICAgR1NUX1RZUEVfUVRfTVVYX1BBRCk7CisgICAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgc3VidGl0bGVzaW5rdGVtcGwpOworICB9CisKKyAga2xhc3MtPmZvcm1hdCA9IHBhcmFtcy0+cHJvcC0+Zm9ybWF0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9jbGFzc19pbml0IChHc3RRVE11eENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHUGFyYW1GbGFncyBzdHJlYW1hYmxlX2ZsYWdzOworICBjb25zdCBnY2hhciAqc3RyZWFtYWJsZV9kZXNjOworICBnYm9vbGVhbiBzdHJlYW1hYmxlOworI2RlZmluZSBTVFJFQU1BQkxFX0RFU0MgIklmIHNldCB0byB0cnVlLCB0aGUgb3V0cHV0IHNob3VsZCBiZSBhcyBpZiBpdCBpcyB0byAiXAorICAiYmUgc3RyZWFtZWQgYW5kIGhlbmNlIG5vIGluZGV4ZXMgd3JpdHRlbiBvciBkdXJhdGlvbiB3cml0dGVuLiIKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcXRfbXV4X2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcXRfbXV4X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3F0X211eF9zZXRfcHJvcGVydHk7CisKKyAgc3RyZWFtYWJsZV9mbGFncyA9IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1Q7CisgIGlmIChrbGFzcy0+Zm9ybWF0ID09IEdTVF9RVF9NVVhfRk9STUFUX0lTTUwpIHsKKyAgICBzdHJlYW1hYmxlX2Rlc2MgPSBTVFJFQU1BQkxFX0RFU0M7CisgICAgc3RyZWFtYWJsZSA9IERFRkFVTFRfU1RSRUFNQUJMRTsKKyAgfSBlbHNlIHsKKyAgICBzdHJlYW1hYmxlX2Rlc2MgPQorICAgICAgICBTVFJFQU1BQkxFX0RFU0MgIiAoREVQUkVDQVRFRCwgb25seSB2YWxpZCBmb3IgZnJhZ21lbnRlZCBNUDQpIjsKKyAgICBzdHJlYW1hYmxlX2ZsYWdzIHw9IEdfUEFSQU1fREVQUkVDQVRFRDsKKyAgICBzdHJlYW1hYmxlID0gRkFMU0U7CisgIH0KKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01PVklFX1RJTUVTQ0FMRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibW92aWUtdGltZXNjYWxlIiwgIk1vdmllIHRpbWVzY2FsZSIsCisgICAgICAgICAgIlRpbWVzY2FsZSB0byB1c2UgaW4gdGhlIG1vdmllICh1bml0cyBwZXIgc2Vjb25kLCAwID09IGRlZmF1bHQpIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQzMiwgREVGQVVMVF9NT1ZJRV9USU1FU0NBTEUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UUkFLX1RJTUVTQ0FMRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgidHJhay10aW1lc2NhbGUiLCAiVHJhY2sgdGltZXNjYWxlIiwKKyAgICAgICAgICAiVGltZXNjYWxlIHRvIHVzZSBmb3IgdGhlIHRyYWNrcyAodW5pdHMgcGVyIHNlY29uZCwgMCBpcyBhdXRvbWF0aWMpIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQzMiwgREVGQVVMVF9UUkFLX1RJTUVTQ0FMRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RPX0NUVFMsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInByZXNlbnRhdGlvbi10aW1lIiwKKyAgICAgICAgICAiSW5jbHVkZSBwcmVzZW50YXRpb24tdGltZSBpbmZvIiwKKyAgICAgICAgICAiQ2FsY3VsYXRlIGFuZCBpbmNsdWRlIHByZXNlbnRhdGlvbi9jb21wb3NpdGlvbiB0aW1lICIKKyAgICAgICAgICAiKGluIGFkZGl0aW9uIHRvIGRlY29kaW5nIHRpbWUpIiwgREVGQVVMVF9ET19DVFRTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisjaWZuZGVmIEdTVF9SRU1PVkVfREVQUkVDQVRFRAorICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RUU19NRVRIT0QsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoImR0cy1tZXRob2QiLCAiZHRzLW1ldGhvZCIsCisgICAgICAgICAgIk1ldGhvZCB0byBkZXRlcm1pbmUgRFRTIHRpbWUgKERFUFJFQ0FURUQpIiwKKyAgICAgICAgICBHU1RfVFlQRV9RVF9NVVhfRFRTX01FVEhPRCwgREVGQVVMVF9EVFNfTUVUSE9ELAorICAgICAgICAgIEdfUEFSQU1fREVQUkVDQVRFRCB8IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QgfAorICAgICAgICAgIEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyNlbmRpZgorICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0ZBU1RfU1RBUlQsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImZhc3RzdGFydCIsICJGb3JtYXQgZmlsZSB0byBmYXN0c3RhcnQiLAorICAgICAgICAgICJJZiB0aGUgZmlsZSBzaG91bGQgYmUgZm9ybWF0dGVkIGZvciBmYXN0c3RhcnQgKGhlYWRlcnMgZmlyc3QpIiwKKyAgICAgICAgICBERUZBVUxUX0ZBU1RfU1RBUlQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0ZBU1RfU1RBUlRfVEVNUF9GSUxFLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImZhc3RzdGFydC1maWxlIiwgIkZpbGUgdG8gdXNlIGZvciBzdG9yaW5nIGJ1ZmZlcnMiLAorICAgICAgICAgICJGaWxlIHRoYXQgd2lsbCBiZSB1c2VkIHRlbXBvcmFyaWx5IHRvIHN0b3JlIGRhdGEgZnJvbSB0aGUgc3RyZWFtICIKKyAgICAgICAgICAid2hlbiBjcmVhdGluZyBhIGZhc3RzdGFydCBmaWxlLiBJZiBudWxsIGEgZmlsZXBhdGggd2lsbCBiZSAiCisgICAgICAgICAgImNyZWF0ZWQgYXV0b21hdGljYWxseSIsIERFRkFVTFRfRkFTVF9TVEFSVF9URU1QX0ZJTEUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NT09WX1JFQ09WX0ZJTEUsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgibW9vdi1yZWNvdmVyeS1maWxlIiwKKyAgICAgICAgICAiRmlsZSB0byBzdG9yZSBkYXRhIGZvciBwb3N0ZXJpb3IgbW9vdiBhdG9tIHJlY292ZXJ5IiwKKyAgICAgICAgICAiRmlsZSB0byBiZSB1c2VkIHRvIHN0b3JlICIKKyAgICAgICAgICAiZGF0YSBmb3IgbW9vdiBhdG9tIG1ha2luZyBtb3ZpZSBmaWxlIHJlY292ZXJ5IHBvc3NpYmxlIGluIGNhc2UgIgorICAgICAgICAgICJvZiBhIGNyYXNoIGR1cmluZyBtdXhpbmcuIE51bGwgZm9yIGRpc2FibGVkLiAoRXhwZXJpbWVudGFsKSIsCisgICAgICAgICAgREVGQVVMVF9NT09WX1JFQ09WX0ZJTEUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9GUkFHTUVOVF9EVVJBVElPTiwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiZnJhZ21lbnQtZHVyYXRpb24iLCAiRnJhZ21lbnQgZHVyYXRpb24iLAorICAgICAgICAgICJGcmFnbWVudCBkdXJhdGlvbnMgaW4gbXMgKHByb2R1Y2UgYSBmcmFnbWVudGVkIGZpbGUgaWYgPiAwKSIsCisgICAgICAgICAgMCwgR19NQVhVSU5UMzIsIGtsYXNzLT5mb3JtYXQgPT0gR1NUX1FUX01VWF9GT1JNQVRfSVNNTCA/CisgICAgICAgICAgMjAwMCA6IERFRkFVTFRfRlJBR01FTlRfRFVSQVRJT04sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TVFJFQU1BQkxFLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJzdHJlYW1hYmxlIiwgIlN0cmVhbWFibGUiLCBzdHJlYW1hYmxlX2Rlc2MsCisgICAgICAgICAgc3RyZWFtYWJsZSwgc3RyZWFtYWJsZV9mbGFncyB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SRVNFUlZFRF9NQVhfRFVSQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgicmVzZXJ2ZWQtbWF4LWR1cmF0aW9uIiwKKyAgICAgICAgICAiUmVzZXJ2ZWQgbWF4aW11bSBmaWxlIGR1cmF0aW9uIChucykiLAorICAgICAgICAgICJXaGVuIHNldCB0byBhIHZhbHVlID4gMCwgcmVzZXJ2ZXMgc3BhY2UgZm9yIGluZGV4IHRhYmxlcyBhdCB0aGUgIgorICAgICAgICAgICJiZWdpbm5pbmcgb2YgdGhlIGZpbGUuIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQ2NCwgREVGQVVMVF9SRVNFUlZFRF9NQVhfRFVSQVRJT04sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1JFU0VSVkVEX0RVUkFUSU9OX1JFTUFJTklORywKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJyZXNlcnZlZC1kdXJhdGlvbi1yZW1haW5pbmciLAorICAgICAgICAgICJSZXBvcnQgdGhlIGFwcHJveGltYXRlIGFtb3VudCBvZiByZW1haW5pbmcgcmVjb3JkaW5nIHNwYWNlIChucykiLAorICAgICAgICAgICJSZXBvcnRzIHRoZSBhcHByb3hpbWF0ZSBhbW91bnQgb2YgcmVtYWluaW5nIG1vb3YgaGVhZGVyIHNwYWNlICIKKyAgICAgICAgICAicmVzZXJ2ZWQgdXNpbmcgcmVzZXJ2ZWQtbWF4LWR1cmF0aW9uIiwgMCwgR19NQVhVSU5UNjQsIDAsCisgICAgICAgICAgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfUkVTRVJWRURfTU9PVl9VUERBVEVfUEVSSU9ELAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoInJlc2VydmVkLW1vb3YtdXBkYXRlLXBlcmlvZCIsCisgICAgICAgICAgIkludGVydmFsIGF0IHdoaWNoIHRvIHVwZGF0ZSBpbmRleCB0YWJsZXMgKG5zKSIsCisgICAgICAgICAgIldoZW4gdXNlZCB3aXRoIHJlc2VydmVkLW1heC1kdXJhdGlvbiwgcGVyaW9kaWNhbGx5IHVwZGF0ZXMgdGhlICIKKyAgICAgICAgICAiaW5kZXggdGFibGVzIHdpdGggaW5mb3JtYXRpb24gbXV4ZWQgc28gZmFyLiIsIDAsIEdfTUFYVUlOVDY0LAorICAgICAgICAgIERFRkFVTFRfUkVTRVJWRURfTU9PVl9VUERBVEVfUEVSSU9ELAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JFU0VSVkVEX0JZVEVTX1BFUl9TRUMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInJlc2VydmVkLWJ5dGVzLXBlci1zZWMiLAorICAgICAgICAgICJSZXNlcnZlZCBNT09WIGJ5dGVzIHBlciBzZWNvbmQsIHBlciB0cmFjayIsCisgICAgICAgICAgIk11bHRpcGxpZXIgZm9yIGNvbnZlcnRpbmcgcmVzZXJ2ZWQtbWF4LWR1cmF0aW9uIGludG8gYnl0ZXMgb2YgaGVhZGVyIHRvIHJlc2VydmUsIHBlciBzZWNvbmQsIHBlciB0cmFjayIsCisgICAgICAgICAgMCwgMTAwMDAsIERFRkFVTFRfUkVTRVJWRURfQllURVNfUEVSX1NFQ19QRVJfVFJBSywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JFU0VSVkVEX1BSRUZJTEwsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInJlc2VydmVkLXByZWZpbGwiLAorICAgICAgICAgICJSZXNlcnZlZCBQcmVmaWxsIFNhbXBsZXMgVGFibGUiLAorICAgICAgICAgICJQcmVmaWxsIHNhbXBsZXMgdGFibGUgb2YgcmVzZXJ2ZWQgZHVyYXRpb24iLAorICAgICAgICAgIERFRkFVTFRfUkVTRVJWRURfUFJFRklMTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0lOVEVSTEVBVkVfQllURVMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgiaW50ZXJsZWF2ZS1ieXRlcyIsICJJbnRlcmxlYXZlIChieXRlcykiLAorICAgICAgICAgICJJbnRlcmxlYXZlIGJldHdlZW4gc3RyZWFtcyBpbiBieXRlcyIsCisgICAgICAgICAgMCwgR19NQVhVSU5UNjQsIERFRkFVTFRfSU5URVJMRUFWRV9CWVRFUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9JTlRFUkxFQVZFX1RJTUUsCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgiaW50ZXJsZWF2ZS10aW1lIiwgIkludGVybGVhdmUgKHRpbWUpIiwKKyAgICAgICAgICAiSW50ZXJsZWF2ZSBiZXR3ZWVuIHN0cmVhbXMgaW4gbmFub3NlY29uZHMiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVDY0LCBERUZBVUxUX0lOVEVSTEVBVkVfVElNRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfUkFXX0FVRElPX0RSSUZULAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoIm1heC1yYXctYXVkaW8tZHJpZnQiLCAiTWF4IFJhdyBBdWRpbyBEcmlmdCIsCisgICAgICAgICAgIk1heGltdW0gYWxsb3dlZCBkcmlmdCBvZiByYXcgYXVkaW8gc2FtcGxlcyB2cy4gdGltZXN0YW1wcyBpbiBuYW5vc2Vjb25kcyIsCisgICAgICAgICAgMCwgR19NQVhVSU5UNjQsIERFRkFVTFRfTUFYX1JBV19BVURJT19EUklGVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5yZXF1ZXN0X25ld19wYWQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9xdF9tdXhfcmVxdWVzdF9uZXdfcGFkKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9xdF9tdXhfY2hhbmdlX3N0YXRlKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cmVsZWFzZV9wYWQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3F0X211eF9yZWxlYXNlX3BhZCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbXV4X3BhZF9yZXNldCAoR3N0UVRQYWQgKiBxdHBhZCkKK3sKKyAgcXRwYWQtPmZvdXJjYyA9IDA7CisgIHF0cGFkLT5pc19vdXRfb2Zfb3JkZXIgPSBGQUxTRTsKKyAgcXRwYWQtPnNhbXBsZV9zaXplID0gMDsKKyAgcXRwYWQtPnN5bmMgPSBGQUxTRTsKKyAgcXRwYWQtPmxhc3RfZHRzID0gMDsKKyAgcXRwYWQtPnNhbXBsZV9vZmZzZXQgPSAwOworICBxdHBhZC0+ZHRzX2FkanVzdG1lbnQgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBxdHBhZC0+Zmlyc3RfdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBxdHBhZC0+Zmlyc3RfZHRzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgcXRwYWQtPnByZXBhcmVfYnVmX2Z1bmMgPSBOVUxMOworICBxdHBhZC0+Y3JlYXRlX2VtcHR5X2J1ZmZlciA9IE5VTEw7CisgIHF0cGFkLT5hdmdfYml0cmF0ZSA9IDA7CisgIHF0cGFkLT5tYXhfYml0cmF0ZSA9IDA7CisgIHF0cGFkLT50b3RhbF9kdXJhdGlvbiA9IDA7CisgIHF0cGFkLT50b3RhbF9ieXRlcyA9IDA7CisgIHF0cGFkLT5zcGFyc2UgPSBGQUxTRTsKKworICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZxdHBhZC0+bGFzdF9idWYsIE5VTEwpOworCisgIGlmIChxdHBhZC0+dGFncykgeworICAgIGdzdF90YWdfbGlzdF91bnJlZiAocXRwYWQtPnRhZ3MpOworICAgIHF0cGFkLT50YWdzID0gTlVMTDsKKyAgfQorCisgIC8qIHJlZmVyZW5jZSBvd25lZCBlbHNld2hlcmUgKi8KKyAgcXRwYWQtPnRyYWsgPSBOVUxMOworICBxdHBhZC0+dGNfdHJhayA9IE5VTEw7CisKKyAgaWYgKHF0cGFkLT50cmFmKSB7CisgICAgYXRvbV90cmFmX2ZyZWUgKHF0cGFkLT50cmFmKTsKKyAgICBxdHBhZC0+dHJhZiA9IE5VTEw7CisgIH0KKyAgYXRvbV9hcnJheV9jbGVhciAoJnF0cGFkLT5mcmFnbWVudF9idWZmZXJzKTsKKyAgaWYgKHF0cGFkLT5zYW1wbGVzKQorICAgIGdfYXJyYXlfdW5yZWYgKHF0cGFkLT5zYW1wbGVzKTsKKyAgcXRwYWQtPnNhbXBsZXMgPSBOVUxMOworCisgIC8qIHJlZmVyZW5jZSBvd25lZCBlbHNld2hlcmUgKi8KKyAgcXRwYWQtPnRmcmEgPSBOVUxMOworCisgIHF0cGFkLT5maXJzdF9wdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBxdHBhZC0+dGNfcG9zID0gLTE7CisgIGlmIChxdHBhZC0+Zmlyc3RfdGMpCisgICAgZ3N0X3ZpZGVvX3RpbWVfY29kZV9mcmVlIChxdHBhZC0+Zmlyc3RfdGMpOworICBxdHBhZC0+Zmlyc3RfdGMgPSBOVUxMOworCisgIGlmIChxdHBhZC0+cmF3X2F1ZGlvX2FkYXB0ZXIpCisgICAgZ3N0X29iamVjdF91bnJlZiAocXRwYWQtPnJhd19hdWRpb19hZGFwdGVyKTsKKyAgcXRwYWQtPnJhd19hdWRpb19hZGFwdGVyID0gTlVMTDsKK30KKworLyoKKyAqIFRha2VzIEdzdFFUTXV4IGJhY2sgdG8gaXRzIGluaXRpYWwgc3RhdGUKKyAqLworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfcmVzZXQgKEdzdFFUTXV4ICogcXRtdXgsIGdib29sZWFuIGFsbG9jKQoreworICBHU0xpc3QgKndhbGs7CisKKyAgcXRtdXgtPnN0YXRlID0gR1NUX1FUX01VWF9TVEFURV9OT05FOworICBxdG11eC0+aGVhZGVyX3NpemUgPSAwOworICBxdG11eC0+bWRhdF9zaXplID0gMDsKKyAgcXRtdXgtPm1vb3ZfcG9zID0gMDsKKyAgcXRtdXgtPm1kYXRfcG9zID0gMDsKKyAgcXRtdXgtPmxvbmdlc3RfY2h1bmsgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBxdG11eC0+ZnJhZ21lbnRfc2VxdWVuY2UgPSAwOworCisgIGlmIChxdG11eC0+ZnR5cCkgeworICAgIGF0b21fZnR5cF9mcmVlIChxdG11eC0+ZnR5cCk7CisgICAgcXRtdXgtPmZ0eXAgPSBOVUxMOworICB9CisgIGlmIChxdG11eC0+bW9vdikgeworICAgIGF0b21fbW9vdl9mcmVlIChxdG11eC0+bW9vdik7CisgICAgcXRtdXgtPm1vb3YgPSBOVUxMOworICB9CisgIGlmIChxdG11eC0+bWZyYSkgeworICAgIGF0b21fbWZyYV9mcmVlIChxdG11eC0+bWZyYSk7CisgICAgcXRtdXgtPm1mcmEgPSBOVUxMOworICB9CisgIGlmIChxdG11eC0+ZmFzdF9zdGFydF9maWxlKSB7CisgICAgZmNsb3NlIChxdG11eC0+ZmFzdF9zdGFydF9maWxlKTsKKyAgICBnX3JlbW92ZSAocXRtdXgtPmZhc3Rfc3RhcnRfZmlsZV9wYXRoKTsKKyAgICBxdG11eC0+ZmFzdF9zdGFydF9maWxlID0gTlVMTDsKKyAgfQorICBpZiAocXRtdXgtPm1vb3ZfcmVjb3ZfZmlsZSkgeworICAgIGZjbG9zZSAocXRtdXgtPm1vb3ZfcmVjb3ZfZmlsZSk7CisgICAgcXRtdXgtPm1vb3ZfcmVjb3ZfZmlsZSA9IE5VTEw7CisgIH0KKyAgZm9yICh3YWxrID0gcXRtdXgtPmV4dHJhX2F0b21zOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEF0b21JbmZvICphaW5mbyA9IChBdG9tSW5mbyAqKSB3YWxrLT5kYXRhOworICAgIGFpbmZvLT5mcmVlX2Z1bmMgKGFpbmZvLT5hdG9tKTsKKyAgICBnX2ZyZWUgKGFpbmZvKTsKKyAgfQorICBnX3NsaXN0X2ZyZWUgKHF0bXV4LT5leHRyYV9hdG9tcyk7CisgIHF0bXV4LT5leHRyYV9hdG9tcyA9IE5VTEw7CisKKyAgR1NUX09CSkVDVF9MT0NLIChxdG11eCk7CisgIGdzdF90YWdfc2V0dGVyX3Jlc2V0X3RhZ3MgKEdTVF9UQUdfU0VUVEVSIChxdG11eCkpOworICBHU1RfT0JKRUNUX1VOTE9DSyAocXRtdXgpOworCisgIC8qIHJlc2V0IHBhZCBkYXRhICovCisgIGZvciAod2FsayA9IHF0bXV4LT5zaW5rcGFkczsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RRVFBhZCAqcXRwYWQgPSAoR3N0UVRQYWQgKikgd2Fsay0+ZGF0YTsKKyAgICBnc3RfcXRfbXV4X3BhZF9yZXNldCAocXRwYWQpOworCisgICAgLyogaG0sIG1vb3ZfZnJlZSBhYm92ZSB5YW5rZWQgdGhlIHRyYWtzIGF3YXkgZnJvbSB1cywKKyAgICAgKiBzbyBkbyBub3QgZnJlZSwgYnV0IGRvIGNsZWFyICovCisgICAgcXRwYWQtPnRyYWsgPSBOVUxMOworICB9CisKKyAgaWYgKGFsbG9jKSB7CisgICAgcXRtdXgtPm1vb3YgPSBhdG9tX21vb3ZfbmV3IChxdG11eC0+Y29udGV4dCk7CisgICAgLyogZW5zdXJlIGFsbCBpcyBhcyBuaWNlIGFuZCBmcmVzaCBhcyByZXF1ZXN0X25ld19wYWQgd291bGQgcHJvdmlkZSBpdCAqLworICAgIGZvciAod2FsayA9IHF0bXV4LT5zaW5rcGFkczsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICAgIEdzdFFUUGFkICpxdHBhZCA9IChHc3RRVFBhZCAqKSB3YWxrLT5kYXRhOworCisgICAgICBxdHBhZC0+dHJhayA9IGF0b21fdHJha19uZXcgKHF0bXV4LT5jb250ZXh0KTsKKyAgICAgIGF0b21fbW9vdl9hZGRfdHJhayAocXRtdXgtPm1vb3YsIHF0cGFkLT50cmFrKTsKKyAgICB9CisgIH0KKworICBxdG11eC0+Y3VycmVudF9wYWQgPSBOVUxMOworICBxdG11eC0+Y3VycmVudF9jaHVua19zaXplID0gMDsKKyAgcXRtdXgtPmN1cnJlbnRfY2h1bmtfZHVyYXRpb24gPSAwOworICBxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQgPSAtMTsKKworICBxdG11eC0+cmVzZXJ2ZWRfbW9vdl9zaXplID0gMDsKKyAgcXRtdXgtPmxhc3RfbW9vdl91cGRhdGUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBxdG11eC0+bXV4ZWRfc2luY2VfbGFzdF91cGRhdGUgPSAwOworICBxdG11eC0+cmVzZXJ2ZWRfZHVyYXRpb25fcmVtYWluaW5nID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfaW5pdCAoR3N0UVRNdXggKiBxdG11eCwgR3N0UVRNdXhDbGFzcyAqIHF0bXV4X2tsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHF0bXV4X2tsYXNzKTsKKyAgR3N0UGFkVGVtcGxhdGUgKnRlbXBsOworCisgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJzcmMiKTsKKyAgcXRtdXgtPnNyY3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKHRlbXBsLCAic3JjIik7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKHF0bXV4LT5zcmNwYWQpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAocXRtdXgpLCBxdG11eC0+c3JjcGFkKTsKKworICBxdG11eC0+c2lua3BhZHMgPSBOVUxMOworICBxdG11eC0+Y29sbGVjdCA9IGdzdF9jb2xsZWN0X3BhZHNfbmV3ICgpOworICBnc3RfY29sbGVjdF9wYWRzX3NldF9ldmVudF9mdW5jdGlvbiAocXRtdXgtPmNvbGxlY3QsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3F0X211eF9zaW5rX2V2ZW50KSwgcXRtdXgpOworICBnc3RfY29sbGVjdF9wYWRzX3NldF9jbGlwX2Z1bmN0aW9uIChxdG11eC0+Y29sbGVjdCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfY29sbGVjdF9wYWRzX2NsaXBfcnVubmluZ190aW1lKSwgcXRtdXgpOworICBnc3RfY29sbGVjdF9wYWRzX3NldF9mdW5jdGlvbiAocXRtdXgtPmNvbGxlY3QsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3F0X211eF9jb2xsZWN0ZWQpLCBxdG11eCk7CisKKyAgLyogcHJvcGVydGllcyBzZXQgdG8gZGVmYXVsdCB1cG9uIGNvbnN0cnVjdGlvbiAqLworCisgIHF0bXV4LT5yZXNlcnZlZF9tYXhfZHVyYXRpb24gPSBERUZBVUxUX1JFU0VSVkVEX01BWF9EVVJBVElPTjsKKyAgcXRtdXgtPnJlc2VydmVkX21vb3ZfdXBkYXRlX3BlcmlvZCA9IERFRkFVTFRfUkVTRVJWRURfTU9PVl9VUERBVEVfUEVSSU9EOworICBxdG11eC0+cmVzZXJ2ZWRfYnl0ZXNfcGVyX3NlY19wZXJfdHJhayA9CisgICAgICBERUZBVUxUX1JFU0VSVkVEX0JZVEVTX1BFUl9TRUNfUEVSX1RSQUs7CisgIHF0bXV4LT5pbnRlcmxlYXZlX2J5dGVzID0gREVGQVVMVF9JTlRFUkxFQVZFX0JZVEVTOworICBxdG11eC0+aW50ZXJsZWF2ZV90aW1lID0gREVGQVVMVF9JTlRFUkxFQVZFX1RJTUU7CisgIHF0bXV4LT5tYXhfcmF3X2F1ZGlvX2RyaWZ0ID0gREVGQVVMVF9NQVhfUkFXX0FVRElPX0RSSUZUOworCisgIC8qIGFsd2F5cyBuZWVkIHRoaXMgKi8KKyAgcXRtdXgtPmNvbnRleHQgPQorICAgICAgYXRvbXNfY29udGV4dF9uZXcgKGdzdF9xdF9tdXhfbWFwX2Zvcm1hdF90b19mbGF2b3IgKHF0bXV4X2tsYXNzLT5mb3JtYXQpKTsKKworICAvKiBpbnRlcm5hbHMgdG8gaW5pdGlhbCBzdGF0ZSAqLworICBnc3RfcXRfbXV4X3Jlc2V0IChxdG11eCwgVFJVRSk7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFFUTXV4ICpxdG11eCA9IEdTVF9RVF9NVVhfQ0FTVCAob2JqZWN0KTsKKworICBnc3RfcXRfbXV4X3Jlc2V0IChxdG11eCwgRkFMU0UpOworCisgIGdfZnJlZSAocXRtdXgtPmZhc3Rfc3RhcnRfZmlsZV9wYXRoKTsKKyAgZ19mcmVlIChxdG11eC0+bW9vdl9yZWNvdl9maWxlX3BhdGgpOworCisgIGF0b21zX2NvbnRleHRfZnJlZSAocXRtdXgtPmNvbnRleHQpOworICBnc3Rfb2JqZWN0X3VucmVmIChxdG11eC0+Y29sbGVjdCk7CisKKyAgZ19zbGlzdF9mcmVlIChxdG11eC0+c2lua3BhZHMpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcXRfbXV4X3ByZXBhcmVfanBjX2J1ZmZlciAoR3N0UVRQYWQgKiBxdHBhZCwgR3N0QnVmZmVyICogYnVmLAorICAgIEdzdFFUTXV4ICogcXRtdXgpCit7CisgIEdzdEJ1ZmZlciAqbmV3YnVmOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3NpemUgc2l6ZTsKKworICBHU1RfTE9HX09CSkVDVCAocXRtdXgsICJQcmVwYXJpbmcganBjIGJ1ZmZlciIpOworCisgIGlmIChidWYgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKyAgbmV3YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzaXplICsgOCk7CisgIGdzdF9idWZmZXJfY29weV9pbnRvIChuZXdidWYsIGJ1ZiwgR1NUX0JVRkZFUl9DT1BZX0FMTCwgOCwgc2l6ZSk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG5ld2J1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIEdTVF9XUklURV9VSU5UMzJfQkUgKG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgIEdTVF9XUklURV9VSU5UMzJfTEUgKG1hcC5kYXRhICsgNCwgRk9VUkNDX2pwMmMpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgcmV0dXJuIG5ld2J1ZjsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcXRfbXV4X3ByZXBhcmVfdHgzZ19idWZmZXIgKEdzdFFUUGFkICogcXRwYWQsIEdzdEJ1ZmZlciAqIGJ1ZiwKKyAgICBHc3RRVE11eCAqIHF0bXV4KQoreworICBHc3RCdWZmZXIgKm5ld2J1ZjsKKyAgR3N0TWFwSW5mbyBmcm9tbWFwOworICBHc3RNYXBJbmZvIHRvbWFwOworICBnc2l6ZSBzaXplOworICBjb25zdCBndWludDggKmRhdGFlbmQ7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHF0bXV4LCAiUHJlcGFyaW5nIHR4M2cgYnVmZmVyICUiIEdTVF9QVFJfRk9STUFULCBidWYpOworCisgIGlmIChidWYgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmZnJvbW1hcCwgR1NUX01BUF9SRUFEKTsKKworICBkYXRhZW5kID0gbWVtY2hyIChmcm9tbWFwLmRhdGEsIDAsIGZyb21tYXAuc2l6ZSk7CisgIHNpemUgPSBkYXRhZW5kID8gZGF0YWVuZCAtIGZyb21tYXAuZGF0YSA6IGZyb21tYXAuc2l6ZTsKKyAgbmV3YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzaXplICsgMik7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG5ld2J1ZiwgJnRvbWFwLCBHU1RfTUFQX1dSSVRFKTsKKworICBHU1RfV1JJVEVfVUlOVDE2X0JFICh0b21hcC5kYXRhLCBzaXplKTsKKyAgbWVtY3B5ICh0b21hcC5kYXRhICsgMiwgZnJvbW1hcC5kYXRhLCBzaXplKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChuZXdidWYsICZ0b21hcCk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJmZyb21tYXApOworCisgIGdzdF9idWZmZXJfY29weV9pbnRvIChuZXdidWYsIGJ1ZiwgR1NUX0JVRkZFUl9DT1BZX01FVEFEQVRBLCAwLCBzaXplKTsKKworICAvKiBnc3RfYnVmZmVyX2NvcHlfaW50byBpcyB0cnlpbmcgdG8gYmUgdG9vIGNsZXZlciBhbmQKKyAgICogd29uJ3QgY29weSBkdXJhdGlvbiB3aGVuIHNpemUgaXMgZGlmZmVyZW50ICovCisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG5ld2J1ZikgPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgcmV0dXJuIG5ld2J1ZjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfcGFkX2FkZF9hYzNfZXh0ZW5zaW9uIChHc3RRVE11eCAqIHF0bXV4LCBHc3RRVFBhZCAqIHF0cGFkLAorICAgIGd1aW50OCBmc2NvZCwgZ3VpbnQ4IGZybXNpemNvZCwgZ3VpbnQ4IGJzaWQsIGd1aW50OCBic21vZCwgZ3VpbnQ4IGFjbW9kLAorICAgIGd1aW50OCBsZmVfb24pCit7CisgIEF0b21JbmZvICpleHQ7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAocXRwYWQtPnRyYWtfc3RlKTsKKworICBleHQgPSBidWlsZF9hYzNfZXh0ZW5zaW9uIChmc2NvZCwgYnNpZCwgYnNtb2QsIGFjbW9kLCBsZmVfb24sIGZybXNpemNvZCA+PiAxKTsgICAgICAgIC8qIGJpdHJhdGVfY29kZSBpcyBpbnNpZGUgZnJtc2l6Y29kICovCisKKyAgc2FtcGxlX3RhYmxlX2VudHJ5X2FkZF9leHRfYXRvbSAocXRwYWQtPnRyYWtfc3RlLCBleHQpOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9xdF9tdXhfcHJlcGFyZV9wYXJzZV9hYzNfZnJhbWUgKEdzdFFUUGFkICogcXRwYWQsIEdzdEJ1ZmZlciAqIGJ1ZiwKKyAgICBHc3RRVE11eCAqIHF0bXV4KQoreworICBHc3RNYXBJbmZvIG1hcDsKKyAgR3N0Qnl0ZVJlYWRlciByZWFkZXI7CisgIGd1aW50IG9mZjsKKworICBpZiAoIWdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCkpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0cGFkLT5jb2xsZWN0LnBhZCwgIkZhaWxlZCB0byBtYXAgYnVmZmVyIik7CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorCisgIGlmIChHX1VOTElLRUxZIChtYXAuc2l6ZSA8IDgpKQorICAgIGdvdG8gZG9uZTsKKworICBnc3RfYnl0ZV9yZWFkZXJfaW5pdCAoJnJlYWRlciwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgb2ZmID0gZ3N0X2J5dGVfcmVhZGVyX21hc2tlZF9zY2FuX3VpbnQzMiAoJnJlYWRlciwgMHhmZmZmMDAwMCwgMHgwYjc3MDAwMCwKKyAgICAgIDAsIG1hcC5zaXplKTsKKworICBpZiAob2ZmICE9IC0xKSB7CisgICAgR3N0Qml0UmVhZGVyIGJpdHM7CisgICAgZ3VpbnQ4IGZzY29kLCBmcm1zaXpjb2QsIGJzaWQsIGJzbW9kLCBhY21vZCwgbGZlX29uOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRwYWQtPmNvbGxlY3QucGFkLCAiRm91bmQgYWMzIHN5bmMgcG9pbnQgYXQgb2Zmc2V0OiAldSIsCisgICAgICAgIG9mZik7CisKKyAgICBnc3RfYml0X3JlYWRlcl9pbml0ICgmYml0cywgbWFwLmRhdGEsIG1hcC5zaXplKTsKKworICAgIC8qIG9mZiArIHN5bmMgKyBjcmMgKi8KKyAgICBnc3RfYml0X3JlYWRlcl9za2lwX3VuY2hlY2tlZCAoJmJpdHMsIG9mZiAqIDggKyAxNiArIDE2KTsKKworICAgIGZzY29kID0gZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmYml0cywgMik7CisgICAgZnJtc2l6Y29kID0gZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmYml0cywgNik7CisgICAgYnNpZCA9IGdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4X3VuY2hlY2tlZCAoJmJpdHMsIDUpOworICAgIGJzbW9kID0gZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmYml0cywgMyk7CisgICAgYWNtb2QgPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OF91bmNoZWNrZWQgKCZiaXRzLCAzKTsKKworICAgIGlmICgoYWNtb2QgJiAweDEpICYmIChhY21vZCAhPSAweDEpKSAgICAgICAgLyogMyBmcm9udCBjaGFubmVscyAqLworICAgICAgZ3N0X2JpdF9yZWFkZXJfc2tpcF91bmNoZWNrZWQgKCZiaXRzLCAyKTsKKyAgICBpZiAoKGFjbW9kICYgMHg0KSkgICAgICAgICAgLyogaWYgYSBzdXJyb3VuZCBjaGFubmVsIGV4aXN0cyAqLworICAgICAgZ3N0X2JpdF9yZWFkZXJfc2tpcF91bmNoZWNrZWQgKCZiaXRzLCAyKTsKKyAgICBpZiAoYWNtb2QgPT0gMHgyKSAgICAgICAgICAgLyogaWYgaW4gMi8wIG1vZGUgKi8KKyAgICAgIGdzdF9iaXRfcmVhZGVyX3NraXBfdW5jaGVja2VkICgmYml0cywgMik7CisKKyAgICBsZmVfb24gPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OF91bmNoZWNrZWQgKCZiaXRzLCAxKTsKKworICAgIGdzdF9xdF9tdXhfcGFkX2FkZF9hYzNfZXh0ZW5zaW9uIChxdG11eCwgcXRwYWQsIGZzY29kLCBmcm1zaXpjb2QsIGJzaWQsCisgICAgICAgIGJzbW9kLCBhY21vZCwgbGZlX29uKTsKKworICAgIC8qIEFDLTMgc3BlYyBzYXlzIHRoYXQgdGhvc2UgdmFsdWVzIHNob3VsZCBiZSBjb25zdGFudCBmb3IgdGhlCisgICAgICogd2hvbGUgc3RyZWFtIHdoZW4gbXV4ZWQgaW4gbXA0LiBXZSB0cnVzdCB0aGUgaW5wdXQgZm9sbG93cyBpdCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0cGFkLT5jb2xsZWN0LnBhZCwgIkRhdGEgcGFyc2VkLCByZW1vdmluZyAiCisgICAgICAgICJwcmVwYXJlIGJ1ZmZlciBmdW5jdGlvbiIpOworICAgIHF0cGFkLT5wcmVwYXJlX2J1Zl9mdW5jID0gTlVMTDsKKyAgfQorCitkb25lOgorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9xdF9tdXhfY3JlYXRlX2VtcHR5X3R4M2dfYnVmZmVyIChHc3RRVFBhZCAqIHF0cGFkLCBnaW50NjQgZHVyYXRpb24pCit7CisgIGd1aW50OCAqZGF0YTsKKworICBkYXRhID0gZ19tYWxsb2MgKDIpOworICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhLCAwKTsKKworICByZXR1cm4gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZGF0YSwgMik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbXV4X2FkZF9tcDRfdGFnIChHc3RRVE11eCAqIHF0bXV4LCBjb25zdCBHc3RUYWdMaXN0ICogbGlzdCwKKyAgICBBdG9tVURUQSAqIHVkdGEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdGFnMiwgZ3VpbnQzMiBmb3VyY2MpCit7CisgIHN3aXRjaCAoZ3N0X3RhZ19nZXRfdHlwZSAodGFnKSkgeworICAgICAgLyogc3RyaW5ncyAqLworICAgIGNhc2UgR19UWVBFX1NUUklORzoKKyAgICB7CisgICAgICBnY2hhciAqc3RyID0gTlVMTDsKKworICAgICAgaWYgKCFnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZyAobGlzdCwgdGFnLCAmc3RyKSB8fCAhc3RyKQorICAgICAgICBicmVhazsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiQWRkaW5nIHRhZyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIC0+ICVzIiwKKyAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYyksIHN0cik7CisgICAgICBhdG9tX3VkdGFfYWRkX3N0cl90YWcgKHVkdGEsIGZvdXJjYywgc3RyKTsKKyAgICAgIGdfZnJlZSAoc3RyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAgIC8qIGRvdWJsZSAqLworICAgIGNhc2UgR19UWVBFX0RPVUJMRToKKyAgICB7CisgICAgICBnZG91YmxlIHZhbHVlOworCisgICAgICBpZiAoIWdzdF90YWdfbGlzdF9nZXRfZG91YmxlIChsaXN0LCB0YWcsICZ2YWx1ZSkpCisgICAgICAgIGJyZWFrOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJBZGRpbmcgdGFnICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgLT4gJXUiLAorICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgKGdpbnQpIHZhbHVlKTsKKyAgICAgIGF0b21fdWR0YV9hZGRfdWludF90YWcgKHVkdGEsIGZvdXJjYywgMjEsIChnaW50KSB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHX1RZUEVfVUlOVDoKKyAgICB7CisgICAgICBndWludCB2YWx1ZSA9IDA7CisgICAgICBpZiAodGFnMikgeworICAgICAgICAvKiBwYWlyZWQgdW5zaWduZWQgaW50ZWdlcnMgKi8KKyAgICAgICAgZ3VpbnQgY291bnQgPSAwOworICAgICAgICBnYm9vbGVhbiBnb3RfdGFnOworCisgICAgICAgIGdvdF90YWcgPSBnc3RfdGFnX2xpc3RfZ2V0X3VpbnQgKGxpc3QsIHRhZywgJnZhbHVlKTsKKyAgICAgICAgZ290X3RhZyA9IGdzdF90YWdfbGlzdF9nZXRfdWludCAobGlzdCwgdGFnMiwgJmNvdW50KSB8fCBnb3RfdGFnOworICAgICAgICBpZiAoIWdvdF90YWcpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiQWRkaW5nIHRhZyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIC0+ICV1LyV1IiwKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgdmFsdWUsIGNvdW50KTsKKyAgICAgICAgYXRvbV91ZHRhX2FkZF91aW50X3RhZyAodWR0YSwgZm91cmNjLCAwLAorICAgICAgICAgICAgdmFsdWUgPDwgMTYgfCAoY291bnQgJiAweEZGRkYpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHVucGFpcmVkIHVuc2lnbmVkIGludGVnZXJzICovCisgICAgICAgIGlmICghZ3N0X3RhZ19saXN0X2dldF91aW50IChsaXN0LCB0YWcsICZ2YWx1ZSkpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiQWRkaW5nIHRhZyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIC0+ICV1IiwKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgdmFsdWUpOworICAgICAgICBhdG9tX3VkdGFfYWRkX3VpbnRfdGFnICh1ZHRhLCBmb3VyY2MsIDEsIHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9hZGRfbXA0X2RhdGUgKEdzdFFUTXV4ICogcXRtdXgsIGNvbnN0IEdzdFRhZ0xpc3QgKiBsaXN0LAorICAgIEF0b21VRFRBICogdWR0YSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0YWcyLCBndWludDMyIGZvdXJjYykKK3sKKyAgR0RhdGUgKmRhdGUgPSBOVUxMOworICBHRGF0ZVllYXIgeWVhcjsKKyAgR0RhdGVNb250aCBtb250aDsKKyAgR0RhdGVEYXkgZGF5OworICBnY2hhciAqc3RyOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKGdzdF90YWdfZ2V0X3R5cGUgKHRhZykgPT0gR19UWVBFX0RBVEUpOworCisgIGlmICghZ3N0X3RhZ19saXN0X2dldF9kYXRlIChsaXN0LCB0YWcsICZkYXRlKSB8fCAhZGF0ZSkKKyAgICByZXR1cm47CisKKyAgeWVhciA9IGdfZGF0ZV9nZXRfeWVhciAoZGF0ZSk7CisgIG1vbnRoID0gZ19kYXRlX2dldF9tb250aCAoZGF0ZSk7CisgIGRheSA9IGdfZGF0ZV9nZXRfZGF5IChkYXRlKTsKKworICBnX2RhdGVfZnJlZSAoZGF0ZSk7CisKKyAgaWYgKHllYXIgPT0gR19EQVRFX0JBRF9ZRUFSICYmIG1vbnRoID09IEdfREFURV9CQURfTU9OVEggJiYKKyAgICAgIGRheSA9PSBHX0RBVEVfQkFEX0RBWSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRtdXgsICJpbnZhbGlkIGRhdGUgaW4gdGFnIik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiJXUtJXUtJXUiLCB5ZWFyLCBtb250aCwgZGF5KTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJBZGRpbmcgdGFnICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgLT4gJXMiLAorICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpLCBzdHIpOworICBhdG9tX3VkdGFfYWRkX3N0cl90YWcgKHVkdGEsIGZvdXJjYywgc3RyKTsKKyAgZ19mcmVlIChzdHIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9hZGRfbXA0X2NvdmVyIChHc3RRVE11eCAqIHF0bXV4LCBjb25zdCBHc3RUYWdMaXN0ICogbGlzdCwKKyAgICBBdG9tVURUQSAqIHVkdGEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdGFnMiwgZ3VpbnQzMiBmb3VyY2MpCit7CisgIEdWYWx1ZSB2YWx1ZSA9IHsgMCwgfTsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdFNhbXBsZSAqc2FtcGxlOworICBHc3RDYXBzICpjYXBzOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2ludCBmbGFncyA9IDA7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKGdzdF90YWdfZ2V0X3R5cGUgKHRhZykgPT0gR1NUX1RZUEVfU0FNUExFKTsKKworICBpZiAoIWdzdF90YWdfbGlzdF9jb3B5X3ZhbHVlICgmdmFsdWUsIGxpc3QsIHRhZykpCisgICAgcmV0dXJuOworCisgIHNhbXBsZSA9IGdzdF92YWx1ZV9nZXRfc2FtcGxlICgmdmFsdWUpOworCisgIGlmICghc2FtcGxlKQorICAgIGdvdG8gZG9uZTsKKworICBidWYgPSBnc3Rfc2FtcGxlX2dldF9idWZmZXIgKHNhbXBsZSk7CisgIGlmICghYnVmKQorICAgIGdvdG8gZG9uZTsKKworICBjYXBzID0gZ3N0X3NhbXBsZV9nZXRfY2FwcyAoc2FtcGxlKTsKKyAgaWYgKCFjYXBzKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgInByZXZpZXcgaW1hZ2Ugd2l0aG91dCBjYXBzIik7CisgICAgZ290byBkb25lOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJwcmV2aWV3IGltYWdlIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAoc3RydWN0dXJlLCAiaW1hZ2UvanBlZyIpKQorICAgIGZsYWdzID0gMTM7CisgIGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImltYWdlL3BuZyIpKQorICAgIGZsYWdzID0gMTQ7CisKKyAgaWYgKCFmbGFncykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRtdXgsICJwcmV2aWV3IGltYWdlIGZvcm1hdCBub3Qgc3VwcG9ydGVkIik7CisgICAgZ290byBkb25lOworICB9CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJBZGRpbmcgdGFnICUiIEdTVF9GT1VSQ0NfRk9STUFUCisgICAgICAiIC0+IGltYWdlIHNpemUgJSIgR19HU0laRV9GT1JNQVQgIiIsIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgbWFwLnNpemUpOworICBhdG9tX3VkdGFfYWRkX3RhZyAodWR0YSwgZm91cmNjLCBmbGFncywgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKK2RvbmU6CisgIGdfdmFsdWVfdW5zZXQgKCZ2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbXV4X2FkZF8zZ3Bfc3RyIChHc3RRVE11eCAqIHF0bXV4LCBjb25zdCBHc3RUYWdMaXN0ICogbGlzdCwKKyAgICBBdG9tVURUQSAqIHVkdGEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdGFnMiwgZ3VpbnQzMiBmb3VyY2MpCit7CisgIGdjaGFyICpzdHIgPSBOVUxMOworICBndWludCBudW1iZXI7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoZ3N0X3RhZ19nZXRfdHlwZSAodGFnKSA9PSBHX1RZUEVfU1RSSU5HKTsKKyAgZ19yZXR1cm5faWZfZmFpbCAoIXRhZzIgfHwgZ3N0X3RhZ19nZXRfdHlwZSAodGFnMikgPT0gR19UWVBFX1VJTlQpOworCisgIGlmICghZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKGxpc3QsIHRhZywgJnN0cikgfHwgIXN0cikKKyAgICByZXR1cm47CisKKyAgaWYgKHRhZzIpCisgICAgaWYgKCFnc3RfdGFnX2xpc3RfZ2V0X3VpbnQgKGxpc3QsIHRhZzIsICZudW1iZXIpKQorICAgICAgdGFnMiA9IE5VTEw7CisKKyAgaWYgKCF0YWcyKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJBZGRpbmcgdGFnICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgLT4gJXMiLAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYyksIHN0cik7CisgICAgYXRvbV91ZHRhX2FkZF8zZ3Bfc3RyX3RhZyAodWR0YSwgZm91cmNjLCBzdHIpOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiQWRkaW5nIHRhZyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIC0+ICVzLyVkIiwKKyAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpLCBzdHIsIG51bWJlcik7CisgICAgYXRvbV91ZHRhX2FkZF8zZ3Bfc3RyX2ludF90YWcgKHVkdGEsIGZvdXJjYywgc3RyLCBudW1iZXIpOworICB9CisKKyAgZ19mcmVlIChzdHIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9hZGRfM2dwX2RhdGUgKEdzdFFUTXV4ICogcXRtdXgsIGNvbnN0IEdzdFRhZ0xpc3QgKiBsaXN0LAorICAgIEF0b21VRFRBICogdWR0YSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0YWcyLCBndWludDMyIGZvdXJjYykKK3sKKyAgR0RhdGUgKmRhdGUgPSBOVUxMOworICBHRGF0ZVllYXIgeWVhcjsKKworICBnX3JldHVybl9pZl9mYWlsIChnc3RfdGFnX2dldF90eXBlICh0YWcpID09IEdfVFlQRV9EQVRFKTsKKworICBpZiAoIWdzdF90YWdfbGlzdF9nZXRfZGF0ZSAobGlzdCwgdGFnLCAmZGF0ZSkgfHwgIWRhdGUpCisgICAgcmV0dXJuOworCisgIHllYXIgPSBnX2RhdGVfZ2V0X3llYXIgKGRhdGUpOworICBnX2RhdGVfZnJlZSAoZGF0ZSk7CisKKyAgaWYgKHllYXIgPT0gR19EQVRFX0JBRF9ZRUFSKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgImludmFsaWQgZGF0ZSBpbiB0YWciKTsKKyAgICByZXR1cm47CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIkFkZGluZyB0YWcgJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiAtPiAlZCIsCisgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYyksIHllYXIpOworICBhdG9tX3VkdGFfYWRkXzNncF91aW50X3RhZyAodWR0YSwgZm91cmNjLCB5ZWFyKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfYWRkXzNncF9sb2NhdGlvbiAoR3N0UVRNdXggKiBxdG11eCwgY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsCisgICAgQXRvbVVEVEEgKiB1ZHRhLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnRhZzIsIGd1aW50MzIgZm91cmNjKQoreworICBnZG91YmxlIGxhdGl0dWRlID0gLTM2MCwgbG9uZ2l0dWRlID0gLTM2MCwgYWx0aXR1ZGUgPSAwOworICBnY2hhciAqbG9jYXRpb24gPSBOVUxMOworICBndWludDggKmRhdGEsICpkZGF0YTsKKyAgZ2ludCBzaXplID0gMCwgbGVuID0gMDsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoc3RyY21wICh0YWcsIEdTVF9UQUdfR0VPX0xPQ0FUSU9OX05BTUUpID09IDApOworCisgIHJldCA9IGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nIChsaXN0LCB0YWcsICZsb2NhdGlvbik7CisgIHJldCB8PSBnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZSAobGlzdCwgR1NUX1RBR19HRU9fTE9DQVRJT05fTE9OR0lUVURFLAorICAgICAgJmxvbmdpdHVkZSk7CisgIHJldCB8PSBnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZSAobGlzdCwgR1NUX1RBR19HRU9fTE9DQVRJT05fTEFUSVRVREUsCisgICAgICAmbGF0aXR1ZGUpOworICByZXQgfD0gZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKGxpc3QsIEdTVF9UQUdfR0VPX0xPQ0FUSU9OX0VMRVZBVElPTiwKKyAgICAgICZhbHRpdHVkZSk7CisKKyAgaWYgKCFyZXQpCisgICAgcmV0dXJuOworCisgIGlmIChsb2NhdGlvbikKKyAgICBsZW4gPSBzdHJsZW4gKGxvY2F0aW9uKTsKKyAgc2l6ZSArPSBsZW4gKyAxICsgMjsKKworICAvKiByb2xlICsgKGxvbmcsIGxhdCwgYWx0KSArIGJvZHkgKyBub3RlcyAqLworICBzaXplICs9IDEgKyAzICogNCArIDEgKyAxOworCisgIGRhdGEgPSBkZGF0YSA9IGdfbWFsbG9jIChzaXplKTsKKworICAvKiBsYW5ndWFnZSB0YWcgKi8KKyAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoZGF0YSwgbGFuZ3VhZ2VfY29kZSAoR1NUX1FUX01VWF9ERUZBVUxUX1RBR19MQU5HVUFHRSkpOworICAvKiBsb2NhdGlvbiAqLworICBpZiAobG9jYXRpb24pCisgICAgbWVtY3B5IChkYXRhICsgMiwgbG9jYXRpb24sIGxlbik7CisgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDIgKyBsZW4sIDApOworICBkYXRhICs9IGxlbiArIDEgKyAyOworICAvKiByb2xlICovCisgIEdTVF9XUklURV9VSU5UOCAoZGF0YSwgMCk7CisgIC8qIGxvbmcsIGxhdCwgYWx0ICovCisjZGVmaW5lIFFUX1dSSVRFX1NGUDMyKGRhdGEsIGZwKSBHU1RfV1JJVEVfVUlOVDMyX0JFKGRhdGEsIChndWludDMyKSAoKGdpbnQpIChmcCAqIDY1NTM2LjApKSkKKyAgUVRfV1JJVEVfU0ZQMzIgKGRhdGEgKyAxLCBsb25naXR1ZGUpOworICBRVF9XUklURV9TRlAzMiAoZGF0YSArIDUsIGxhdGl0dWRlKTsKKyAgUVRfV1JJVEVfU0ZQMzIgKGRhdGEgKyA5LCBhbHRpdHVkZSk7CisgIC8qIG5laXRoZXIgYXN0cm9ub21pY2FsIGJvZHkgbm9yIG5vdGVzICovCisgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEgKyAxMywgMCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJBZGRpbmcgdGFnICdsb2NpJyIpOworICBhdG9tX3VkdGFfYWRkXzNncF90YWcgKHVkdGEsIGZvdXJjYywgZGRhdGEsIHNpemUpOworICBnX2ZyZWUgKGRkYXRhKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfYWRkXzNncF9rZXl3b3JkcyAoR3N0UVRNdXggKiBxdG11eCwgY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsCisgICAgQXRvbVVEVEEgKiB1ZHRhLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnRhZzIsIGd1aW50MzIgZm91cmNjKQoreworICBnY2hhciAqa2V5d29yZHMgPSBOVUxMOworICBndWludDggKmRhdGEsICpkZGF0YTsKKyAgZ2ludCBzaXplID0gMCwgaTsKKyAgZ2NoYXIgKiprd2RzOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKHN0cmNtcCAodGFnLCBHU1RfVEFHX0tFWVdPUkRTKSA9PSAwKTsKKworICBpZiAoIWdzdF90YWdfbGlzdF9nZXRfc3RyaW5nIChsaXN0LCB0YWcsICZrZXl3b3JkcykgfHwgIWtleXdvcmRzKQorICAgIHJldHVybjsKKworICBrd2RzID0gZ19zdHJzcGxpdCAoa2V5d29yZHMsICIsIiwgMCk7CisgIGdfZnJlZSAoa2V5d29yZHMpOworCisgIHNpemUgPSAwOworICBmb3IgKGkgPSAwOyBrd2RzW2ldOyBpKyspIHsKKyAgICAvKiBzaXplIGJ5dGUgKyBudWxsLXRlcm1pbmF0b3IgKi8KKyAgICBzaXplICs9IHN0cmxlbiAoa3dkc1tpXSkgKyAxICsgMTsKKyAgfQorCisgIC8qIGxhbmd1YWdlIHRhZyArIGNvdW50ICsga2V5d29yZHMgKi8KKyAgc2l6ZSArPSAyICsgMTsKKworICBkYXRhID0gZGRhdGEgPSBnX21hbGxvYyAoc2l6ZSk7CisKKyAgLyogbGFuZ3VhZ2UgdGFnICovCisgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEsIGxhbmd1YWdlX2NvZGUgKEdTVF9RVF9NVVhfREVGQVVMVF9UQUdfTEFOR1VBR0UpKTsKKyAgLyogY291bnQgKi8KKyAgR1NUX1dSSVRFX1VJTlQ4IChkYXRhICsgMiwgaSk7CisgIGRhdGEgKz0gMzsKKyAgLyoga2V5d29yZHMgKi8KKyAgZm9yIChpID0gMDsga3dkc1tpXTsgKytpKSB7CisgICAgZ2ludCBsZW4gPSBzdHJsZW4gKGt3ZHNbaV0pOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJBZGRpbmcgdGFnICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgLT4gJXMiLAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYyksIGt3ZHNbaV0pOworICAgIC8qIHNpemUgKi8KKyAgICBHU1RfV1JJVEVfVUlOVDggKGRhdGEsIGxlbiArIDEpOworICAgIG1lbWNweSAoZGF0YSArIDEsIGt3ZHNbaV0sIGxlbiArIDEpOworICAgIGRhdGEgKz0gbGVuICsgMjsKKyAgfQorCisgIGdfc3RyZnJlZXYgKGt3ZHMpOworCisgIGF0b21fdWR0YV9hZGRfM2dwX3RhZyAodWR0YSwgZm91cmNjLCBkZGF0YSwgc2l6ZSk7CisgIGdfZnJlZSAoZGRhdGEpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9xdF9tdXhfcGFyc2VfY2xhc3NpZmljYXRpb25fc3RyaW5nIChHc3RRVE11eCAqIHF0bXV4LCBjb25zdCBnY2hhciAqIGlucHV0LAorICAgIGd1aW50MzIgKiBwX2ZvdXJjYywgZ3VpbnQxNiAqIHBfdGFibGUsIGdjaGFyICoqIHBfY29udGVudCkKK3sKKyAgZ3VpbnQzMiBmb3VyY2M7CisgIGdpbnQgdGFibGU7CisgIGdpbnQgc2l6ZTsKKyAgY29uc3QgZ2NoYXIgKmRhdGE7CisKKyAgZGF0YSA9IGlucHV0OworICBzaXplID0gc3RybGVuIChpbnB1dCk7CisKKyAgaWYgKHNpemUgPCA0ICsgMyArIDEgKyAxICsgMSkgeworICAgIC8qIGF0IGxlYXN0IHRoZSBtaW5pbXVtIHh4eHg6Ly95L3ogKi8KKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LCAiQ2xhc3NpZmljYXRpb24gdGFnIGlucHV0ICglcykgdG9vIHNob3J0LCAiCisgICAgICAgICJpZ25vcmluZyIsIGlucHV0KTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiByZWFkIHRoZSBmb3VyY2MgKi8KKyAgbWVtY3B5ICgmZm91cmNjLCBkYXRhLCA0KTsKKyAgc2l6ZSAtPSA0OworICBkYXRhICs9IDQ7CisKKyAgaWYgKHN0cm5jbXAgKGRhdGEsICI6Ly8iLCAzKSAhPSAwKSB7CisgICAgZ290byBtaXNtYXRjaDsKKyAgfQorICBkYXRhICs9IDM7CisgIHNpemUgLT0gMzsKKworICAvKiByZWFkIHRoZSB0YWJsZSBudW1iZXIgKi8KKyAgaWYgKHNzY2FuZiAoZGF0YSwgIiVkIiwgJnRhYmxlKSAhPSAxKSB7CisgICAgZ290byBtaXNtYXRjaDsKKyAgfQorICBpZiAodGFibGUgPCAwKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgIkludmFsaWQgdGFibGUgbnVtYmVyIGluIGNsYXNzaWZpY2F0aW9uIHRhZyAoJWQpIgorICAgICAgICAiLCB0YWJsZSBudW1iZXJzIHNob3VsZCBiZSBwb3NpdGl2ZSwgaWdub3JpbmcgdGFnIiwgdGFibGUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIGZpbmQgdGhlIG5leHQgLyAqLworICB3aGlsZSAoc2l6ZSA+IDAgJiYgZGF0YVswXSAhPSAnLycpIHsKKyAgICBkYXRhICs9IDE7CisgICAgc2l6ZSAtPSAxOworICB9CisgIGlmIChzaXplID09IDApIHsKKyAgICBnb3RvIG1pc21hdGNoOworICB9CisgIGdfYXNzZXJ0IChkYXRhWzBdID09ICcvJyk7CisKKyAgLyogc2tpcCB0aGUgJy8nICovCisgIGRhdGEgKz0gMTsKKyAgc2l6ZSAtPSAxOworICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgZ290byBtaXNtYXRjaDsKKyAgfQorCisgIC8qIHJlYWQgdXAgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyAqLworICAqcF9jb250ZW50ID0gZ19zdHJkdXAgKGRhdGEpOworICAqcF90YWJsZSA9IChndWludDE2KSB0YWJsZTsKKyAgKnBfZm91cmNjID0gZm91cmNjOworICByZXR1cm4gVFJVRTsKKworbWlzbWF0Y2g6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LCAiSWdub3JpbmcgY2xhc3NpZmljYXRpb24gdGFnIGFzICIKKyAgICAgICAgImlucHV0ICglcykgZGlkbid0IG1hdGNoIHRoZSBleHBlY3RlZCBlbnRpdHljb2RlOi8vdGFibGUvY29udGVudCIsCisgICAgICAgIGlucHV0KTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfYWRkXzNncF9jbGFzc2lmaWNhdGlvbiAoR3N0UVRNdXggKiBxdG11eCwgY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsCisgICAgQXRvbVVEVEEgKiB1ZHRhLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnRhZzIsIGd1aW50MzIgZm91cmNjKQoreworICBnY2hhciAqY2xzZl9kYXRhID0gTlVMTDsKKyAgZ2ludCBzaXplID0gMDsKKyAgZ3VpbnQzMiBlbnRpdHkgPSAwOworICBndWludDE2IHRhYmxlID0gMDsKKyAgZ2NoYXIgKmNvbnRlbnQgPSBOVUxMOworICBndWludDggKmRhdGE7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoc3RyY21wICh0YWcsIEdTVF9UQUdfM0dQX0NMQVNTSUZJQ0FUSU9OKSA9PSAwKTsKKworICBpZiAoIWdzdF90YWdfbGlzdF9nZXRfc3RyaW5nIChsaXN0LCB0YWcsICZjbHNmX2RhdGEpIHx8ICFjbHNmX2RhdGEpCisgICAgcmV0dXJuOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiQWRkaW5nIHRhZyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIC0+ICVzIiwKKyAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgY2xzZl9kYXRhKTsKKworICAvKiBwYXJzZSB0aGUgc3RyaW5nLCBmb3JtYXQgaXM6CisgICAqIGVudGl0eWZvdXJjYzovL3RhYmxlL2NvbnRlbnQKKyAgICovCisgIGdzdF9xdF9tdXhfcGFyc2VfY2xhc3NpZmljYXRpb25fc3RyaW5nIChxdG11eCwgY2xzZl9kYXRhLCAmZW50aXR5LCAmdGFibGUsCisgICAgICAmY29udGVudCk7CisgIGdfZnJlZSAoY2xzZl9kYXRhKTsKKyAgLyogKzEgZm9yIHRoZSBcMCAqLworICBzaXplID0gc3RybGVuIChjb250ZW50KSArIDE7CisKKyAgLyogbm93IHdlIGhhdmUgZXZlcnl0aGluZywgYnVpbGQgdGhlIGF0b20KKyAgICogYXRvbSBkZXNjcmlwdGlvbiBpcyBhdCAzR1BQIFRTIDI2LjI0NCBWOC4yLjAgKDIwMDktMDkpICovCisgIGRhdGEgPSBnX21hbGxvYyAoNCArIDIgKyAyICsgc2l6ZSk7CisgIEdTVF9XUklURV9VSU5UMzJfTEUgKGRhdGEsIGVudGl0eSk7CisgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEgKyA0LCAoZ3VpbnQxNikgdGFibGUpOworICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhICsgNiwgMCk7CisgIG1lbWNweSAoZGF0YSArIDgsIGNvbnRlbnQsIHNpemUpOworICBnX2ZyZWUgKGNvbnRlbnQpOworCisgIGF0b21fdWR0YV9hZGRfM2dwX3RhZyAodWR0YSwgZm91cmNjLCBkYXRhLCA0ICsgMiArIDIgKyBzaXplKTsKKyAgZ19mcmVlIChkYXRhKTsKK30KKwordHlwZWRlZiB2b2lkICgqR3N0UVRNdXhBZGRVZHRhVGFnRnVuYykgKEdzdFFUTXV4ICogbXV4LAorICAgIGNvbnN0IEdzdFRhZ0xpc3QgKiBsaXN0LCBBdG9tVURUQSAqIHVkdGEsIGNvbnN0IGNoYXIgKnRhZywKKyAgICBjb25zdCBjaGFyICp0YWcyLCBndWludDMyIGZvdXJjYyk7CisKKy8qCisgKiBTdHJ1Y3QgdG8gcmVjb3JkIG1hcHBpbmdzIGZyb20gZ3N0cmVhbWVyIHRhZ3MgdG8gZm91cmNjIGNvZGVzCisgKi8KK3R5cGVkZWYgc3RydWN0IF9Hc3RUYWdUb0ZvdXJjYworeworICBndWludDMyIGZvdXJjYzsKKyAgY29uc3QgZ2NoYXIgKmdzdHRhZzsKKyAgY29uc3QgZ2NoYXIgKmdzdHRhZzI7CisgIGNvbnN0IEdzdFFUTXV4QWRkVWR0YVRhZ0Z1bmMgZnVuYzsKK30gR3N0VGFnVG9Gb3VyY2M7CisKKy8qIHRhZyBsaXN0IHRhZ3MgdG8gZm91cmNjIG1hdGNoaW5nICovCitzdGF0aWMgY29uc3QgR3N0VGFnVG9Gb3VyY2MgdGFnX21hdGNoZXNfbXA0W10gPSB7CisgIHtGT1VSQ0NfX2FsYiwgR1NUX1RBR19BTEJVTSwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0Nfc29hbCwgR1NUX1RBR19BTEJVTV9TT1JUTkFNRSwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0NfX0FSVCwgR1NUX1RBR19BUlRJU1QsIE5VTEwsIGdzdF9xdF9tdXhfYWRkX21wNF90YWd9LAorICB7Rk9VUkNDX3NvYXIsIEdTVF9UQUdfQVJUSVNUX1NPUlROQU1FLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF9tcDRfdGFnfSwKKyAge0ZPVVJDQ19hQVJULCBHU1RfVEFHX0FMQlVNX0FSVElTVCwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0Nfc29hYSwgR1NUX1RBR19BTEJVTV9BUlRJU1RfU09SVE5BTUUsIE5VTEwsIGdzdF9xdF9tdXhfYWRkX21wNF90YWd9LAorICB7Rk9VUkNDX19zd3IsIEdTVF9UQUdfQVBQTElDQVRJT05fTkFNRSwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0NfX2NtdCwgR1NUX1RBR19DT01NRU5ULCBOVUxMLCBnc3RfcXRfbXV4X2FkZF9tcDRfdGFnfSwKKyAge0ZPVVJDQ19fd3J0LCBHU1RfVEFHX0NPTVBPU0VSLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF9tcDRfdGFnfSwKKyAge0ZPVVJDQ19zb2NvLCBHU1RfVEFHX0NPTVBPU0VSX1NPUlROQU1FLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF9tcDRfdGFnfSwKKyAge0ZPVVJDQ190dnNoLCBHU1RfVEFHX1NIT1dfTkFNRSwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0Nfc29zbiwgR1NUX1RBR19TSE9XX1NPUlROQU1FLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF9tcDRfdGFnfSwKKyAge0ZPVVJDQ190dnNuLCBHU1RfVEFHX1NIT1dfU0VBU09OX05VTUJFUiwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0NfdHZlcywgR1NUX1RBR19TSE9XX0VQSVNPREVfTlVNQkVSLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF9tcDRfdGFnfSwKKyAge0ZPVVJDQ19fZ2VuLCBHU1RfVEFHX0dFTlJFLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF9tcDRfdGFnfSwKKyAge0ZPVVJDQ19fbmFtLCBHU1RfVEFHX1RJVExFLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF9tcDRfdGFnfSwKKyAge0ZPVVJDQ19zb25tLCBHU1RfVEFHX1RJVExFX1NPUlROQU1FLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF9tcDRfdGFnfSwKKyAge0ZPVVJDQ19wZXJmLCBHU1RfVEFHX1BFUkZPUk1FUiwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0NfX2dycCwgR1NUX1RBR19HUk9VUElORywgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0NfX2RlcywgR1NUX1RBR19ERVNDUklQVElPTiwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0NfX2x5ciwgR1NUX1RBR19MWVJJQ1MsIE5VTEwsIGdzdF9xdF9tdXhfYWRkX21wNF90YWd9LAorICB7Rk9VUkNDX190b28sIEdTVF9UQUdfRU5DT0RFUiwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0NfY3BydCwgR1NUX1RBR19DT1BZUklHSFQsIE5VTEwsIGdzdF9xdF9tdXhfYWRkX21wNF90YWd9LAorICB7Rk9VUkNDX2tleXcsIEdTVF9UQUdfS0VZV09SRFMsIE5VTEwsIGdzdF9xdF9tdXhfYWRkX21wNF90YWd9LAorICB7Rk9VUkNDX19kYXksIEdTVF9UQUdfREFURSwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X2RhdGV9LAorICB7Rk9VUkNDX3RtcG8sIEdTVF9UQUdfQkVBVFNfUEVSX01JTlVURSwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0NfdHJrbiwgR1NUX1RBR19UUkFDS19OVU1CRVIsIEdTVF9UQUdfVFJBQ0tfQ09VTlQsCisgICAgICBnc3RfcXRfbXV4X2FkZF9tcDRfdGFnfSwKKyAge0ZPVVJDQ19kaXNrLCBHU1RfVEFHX0FMQlVNX1ZPTFVNRV9OVU1CRVIsIEdTVF9UQUdfQUxCVU1fVk9MVU1FX0NPVU5ULAorICAgICAgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0NfY292ciwgR1NUX1RBR19QUkVWSUVXX0lNQUdFLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF9tcDRfY292ZXJ9LAorICB7Rk9VUkNDX2NvdnIsIEdTVF9UQUdfSU1BR0UsIE5VTEwsIGdzdF9xdF9tdXhfYWRkX21wNF9jb3Zlcn0sCisgIHswLCBOVUxMLH0KK307CisKK3N0YXRpYyBjb25zdCBHc3RUYWdUb0ZvdXJjYyB0YWdfbWF0Y2hlc18zZ3BbXSA9IHsKKyAge0ZPVVJDQ190aXRsLCBHU1RfVEFHX1RJVExFLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF8zZ3Bfc3RyfSwKKyAge0ZPVVJDQ19kc2NwLCBHU1RfVEFHX0RFU0NSSVBUSU9OLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF8zZ3Bfc3RyfSwKKyAge0ZPVVJDQ19jcHJ0LCBHU1RfVEFHX0NPUFlSSUdIVCwgTlVMTCwgZ3N0X3F0X211eF9hZGRfM2dwX3N0cn0sCisgIHtGT1VSQ0NfcGVyZiwgR1NUX1RBR19BUlRJU1QsIE5VTEwsIGdzdF9xdF9tdXhfYWRkXzNncF9zdHJ9LAorICB7Rk9VUkNDX2F1dGgsIEdTVF9UQUdfQ09NUE9TRVIsIE5VTEwsIGdzdF9xdF9tdXhfYWRkXzNncF9zdHJ9LAorICB7Rk9VUkNDX2ducmUsIEdTVF9UQUdfR0VOUkUsIE5VTEwsIGdzdF9xdF9tdXhfYWRkXzNncF9zdHJ9LAorICB7Rk9VUkNDX2t5d2QsIEdTVF9UQUdfS0VZV09SRFMsIE5VTEwsIGdzdF9xdF9tdXhfYWRkXzNncF9rZXl3b3Jkc30sCisgIHtGT1VSQ0NfeXJyYywgR1NUX1RBR19EQVRFLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF8zZ3BfZGF0ZX0sCisgIHtGT1VSQ0NfYWxibSwgR1NUX1RBR19BTEJVTSwgR1NUX1RBR19UUkFDS19OVU1CRVIsIGdzdF9xdF9tdXhfYWRkXzNncF9zdHJ9LAorICB7Rk9VUkNDX2xvY2ksIEdTVF9UQUdfR0VPX0xPQ0FUSU9OX05BTUUsIE5VTEwsIGdzdF9xdF9tdXhfYWRkXzNncF9sb2NhdGlvbn0sCisgIHtGT1VSQ0NfY2xzZiwgR1NUX1RBR18zR1BfQ0xBU1NJRklDQVRJT04sIE5VTEwsCisgICAgICBnc3RfcXRfbXV4X2FkZF8zZ3BfY2xhc3NpZmljYXRpb259LAorICB7MCwgTlVMTCx9Cit9OworCisvKiBxdGRlbXV4IHByb2R1Y2VzIHRoZXNlIGZvciBhdG9tcyBpdCBjYW5ub3QgcGFyc2UgKi8KKyNkZWZpbmUgR1NUX1FUX0RFTVVYX1BSSVZBVEVfVEFHICJwcml2YXRlLXF0LXRhZyIKKworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfYWRkX3htcF90YWdzIChHc3RRVE11eCAqIHF0bXV4LCBjb25zdCBHc3RUYWdMaXN0ICogbGlzdCkKK3sKKyAgR3N0UVRNdXhDbGFzcyAqcXRtdXhfa2xhc3MgPSAoR3N0UVRNdXhDbGFzcyAqKSAoR19PQkpFQ1RfR0VUX0NMQVNTIChxdG11eCkpOworICBHc3RCdWZmZXIgKnhtcCA9IE5VTEw7CisKKyAgLyogYWRvYmUgc3BlY3Mgb25seSBoYXZlICdxdWlja3RpbWUnIGFuZCAnbXA0JywKKyAgICogYnV0IEkgZ3Vlc3Mgd2UgY2FuIGV4dHJhcG9sYXRlIHRvIGdwcC4KKyAgICogS2VlcCBtajIgb3V0IGZvciBub3cgYXMgd2UgZG9uJ3QgYWRkIGFueSB0YWdzIGZvciBpdCB5ZXQuCisgICAqIElmIHlvdSBoYXZlIGZ1cnRoZXIgaW5mbyBhYm91dCB4bXAgb24gdGhlc2UgZm9ybWF0cywgcGxlYXNlIHNoYXJlICovCisgIGlmIChxdG11eF9rbGFzcy0+Zm9ybWF0ID09IEdTVF9RVF9NVVhfRk9STUFUX01KMikKKyAgICByZXR1cm47CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJBZGRpbmcgeG1wIHRhZ3MiKTsKKworICBpZiAocXRtdXhfa2xhc3MtPmZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9RVCkgeworICAgIHhtcCA9IGdzdF90YWdfeG1wX3dyaXRlcl90YWdfbGlzdF90b194bXBfYnVmZmVyIChHU1RfVEFHX1hNUF9XUklURVIgKHF0bXV4KSwKKyAgICAgICAgbGlzdCwgVFJVRSk7CisgICAgaWYgKHhtcCkKKyAgICAgIGF0b21fdWR0YV9hZGRfeG1wX3RhZ3MgKCZxdG11eC0+bW9vdi0+dWR0YSwgeG1wKTsKKyAgfSBlbHNlIHsKKyAgICBBdG9tSW5mbyAqYWluZm87CisgICAgLyogZm9yIGlzb20vbXA0LCBpdCBpcyBhIHRvcCBsZXZlbCB1dWlkIGF0b20gKi8KKyAgICB4bXAgPSBnc3RfdGFnX3htcF93cml0ZXJfdGFnX2xpc3RfdG9feG1wX2J1ZmZlciAoR1NUX1RBR19YTVBfV1JJVEVSIChxdG11eCksCisgICAgICAgIGxpc3QsIFRSVUUpOworICAgIGlmICh4bXApIHsKKyAgICAgIGFpbmZvID0gYnVpbGRfdXVpZF94bXBfYXRvbSAoeG1wKTsKKyAgICAgIGlmIChhaW5mbykgeworICAgICAgICBxdG11eC0+ZXh0cmFfYXRvbXMgPSBnX3NsaXN0X3ByZXBlbmQgKHF0bXV4LT5leHRyYV9hdG9tcywgYWluZm8pOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoeG1wKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKHhtcCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbXV4X2FkZF9tZXRhZGF0YV90YWdzIChHc3RRVE11eCAqIHF0bXV4LCBjb25zdCBHc3RUYWdMaXN0ICogbGlzdCwKKyAgICBBdG9tVURUQSAqIHVkdGEpCit7CisgIEdzdFFUTXV4Q2xhc3MgKnF0bXV4X2tsYXNzID0gKEdzdFFUTXV4Q2xhc3MgKikgKEdfT0JKRUNUX0dFVF9DTEFTUyAocXRtdXgpKTsKKyAgZ3VpbnQzMiBmb3VyY2M7CisgIGdpbnQgaTsKKyAgY29uc3QgZ2NoYXIgKnRhZywgKnRhZzI7CisgIGNvbnN0IEdzdFRhZ1RvRm91cmNjICp0YWdfbWF0Y2hlczsKKworICBzd2l0Y2ggKHF0bXV4X2tsYXNzLT5mb3JtYXQpIHsKKyAgICBjYXNlIEdTVF9RVF9NVVhfRk9STUFUXzNHUDoKKyAgICAgIHRhZ19tYXRjaGVzID0gdGFnX21hdGNoZXNfM2dwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUVRfTVVYX0ZPUk1BVF9NSjI6CisgICAgICB0YWdfbWF0Y2hlcyA9IE5VTEw7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogc29ydCBvZiBpVHVuZXMgc3R5bGUgZm9yIG1wNCBhbmQgUVQgKD8pICovCisgICAgICB0YWdfbWF0Y2hlcyA9IHRhZ19tYXRjaGVzX21wNDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKCF0YWdfbWF0Y2hlcykKKyAgICByZXR1cm47CisKKyAgLyogQ2xlYXIgZXhpc3RpbmcgdGFncyBzbyB3ZSBkb24ndCBhZGQgdGhlbSBvdmVyIGFuZCBvdmVyICovCisgIGF0b21fdWR0YV9jbGVhcl90YWdzICh1ZHRhKTsKKworICBmb3IgKGkgPSAwOyB0YWdfbWF0Y2hlc1tpXS5mb3VyY2M7IGkrKykgeworICAgIGZvdXJjYyA9IHRhZ19tYXRjaGVzW2ldLmZvdXJjYzsKKyAgICB0YWcgPSB0YWdfbWF0Y2hlc1tpXS5nc3R0YWc7CisgICAgdGFnMiA9IHRhZ19tYXRjaGVzW2ldLmdzdHRhZzI7CisKKyAgICBnX2Fzc2VydCAodGFnX21hdGNoZXNbaV0uZnVuYyk7CisgICAgdGFnX21hdGNoZXNbaV0uZnVuYyAocXRtdXgsIGxpc3QsIHVkdGEsIHRhZywgdGFnMiwgZm91cmNjKTsKKyAgfQorCisgIC8qIGFkZCB1bnBhcnNlZCBibG9icyBpZiBwcmVzZW50ICovCisgIGlmIChnc3RfdGFnX2V4aXN0cyAoR1NUX1FUX0RFTVVYX1BSSVZBVEVfVEFHKSkgeworICAgIGd1aW50IG51bV90YWdzOworCisgICAgbnVtX3RhZ3MgPSBnc3RfdGFnX2xpc3RfZ2V0X3RhZ19zaXplIChsaXN0LCBHU1RfUVRfREVNVVhfUFJJVkFURV9UQUcpOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdGFnczsgKytpKSB7CisgICAgICBHc3RTYW1wbGUgKnNhbXBsZSA9IE5VTEw7CisgICAgICBHc3RCdWZmZXIgKmJ1ZjsKKyAgICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqczsKKworICAgICAgaWYgKCFnc3RfdGFnX2xpc3RfZ2V0X3NhbXBsZV9pbmRleCAobGlzdCwgR1NUX1FUX0RFTVVYX1BSSVZBVEVfVEFHLCBpLAorICAgICAgICAgICAgICAmc2FtcGxlKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBidWYgPSBnc3Rfc2FtcGxlX2dldF9idWZmZXIgKHNhbXBsZSk7CisKKyAgICAgIGlmIChidWYgJiYgKHMgPSBnc3Rfc2FtcGxlX2dldF9pbmZvIChzYW1wbGUpKSkgeworICAgICAgICBjb25zdCBnY2hhciAqc3R5bGUgPSBOVUxMOworICAgICAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgICAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwKKyAgICAgICAgICAgICJGb3VuZCBwcml2YXRlIHRhZyAlZC8lZDsgc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCAiLCBpbmZvICUiCisgICAgICAgICAgICBHU1RfUFRSX0ZPUk1BVCwgaSwgbnVtX3RhZ3MsIG1hcC5zaXplLCBzKTsKKyAgICAgICAgaWYgKHMgJiYgKHN0eWxlID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAic3R5bGUiKSkpIHsKKyAgICAgICAgICAvKiB0cnkgdG8gcHJldmVudCBzb21lIHN0eWxlIHRhZyBlbmRpbmcgdXAgaW50byBhbm90aGVyIHZhcmlhbnQKKyAgICAgICAgICAgKiAodG9kbzogbWFrZSBpbnRvIGEgbGlzdCBpZiBtb3JlIGNhc2VzKSAqLworICAgICAgICAgIGlmICgoc3RyY21wIChzdHlsZSwgIml0dW5lcyIpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgIHF0bXV4X2tsYXNzLT5mb3JtYXQgPT0gR1NUX1FUX01VWF9GT1JNQVRfTVA0KSB8fAorICAgICAgICAgICAgICAoc3RyY21wIChzdHlsZSwgImlzbyIpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgIHF0bXV4X2tsYXNzLT5mb3JtYXQgPT0gR1NUX1FUX01VWF9GT1JNQVRfM0dQKSkgeworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJBZGRpbmcgcHJpdmF0ZSB0YWciKTsKKyAgICAgICAgICAgIGF0b21fdWR0YV9hZGRfYmxvYl90YWcgKHVkdGEsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgICB9CisgICAgICBnc3Rfc2FtcGxlX3VucmVmIChzYW1wbGUpOworICAgIH0KKyAgfQorCisgIHJldHVybjsKK30KKworLyoKKyAqIEdldHMgdGhlIHRhZ3NldHRlciBpZmFjZSB0YWdsaXN0IGFuZCBwdXRzIHRoZSBrbm93biB0YWdzCisgKiBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfcXRfbXV4X3NldHVwX21ldGFkYXRhIChHc3RRVE11eCAqIHF0bXV4KQoreworICBjb25zdCBHc3RUYWdMaXN0ICp0YWdzID0gTlVMTDsKKyAgR1NMaXN0ICp3YWxrOworCisgIEdTVF9PQkpFQ1RfTE9DSyAocXRtdXgpOworICBpZiAocXRtdXgtPnRhZ3NfY2hhbmdlZCkgeworICAgIHRhZ3MgPSBnc3RfdGFnX3NldHRlcl9nZXRfdGFnX2xpc3QgKEdTVF9UQUdfU0VUVEVSIChxdG11eCkpOworICAgIHF0bXV4LT50YWdzX2NoYW5nZWQgPSBGQUxTRTsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAocXRtdXgpOworCisgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwgInRhZ3M6ICUiIEdTVF9QVFJfRk9STUFULCB0YWdzKTsKKworICBpZiAodGFncyAmJiAhZ3N0X3RhZ19saXN0X2lzX2VtcHR5ICh0YWdzKSkgeworICAgIEdzdFRhZ0xpc3QgKmNvcHkgPSBnc3RfdGFnX2xpc3RfY29weSAodGFncyk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIlJlbW92aW5nIGJvZ3VzIHRhZ3MiKTsKKyAgICBnc3RfdGFnX2xpc3RfcmVtb3ZlX3RhZyAoY29weSwgR1NUX1RBR19WSURFT19DT0RFQyk7CisgICAgZ3N0X3RhZ19saXN0X3JlbW92ZV90YWcgKGNvcHksIEdTVF9UQUdfQVVESU9fQ09ERUMpOworICAgIGdzdF90YWdfbGlzdF9yZW1vdmVfdGFnIChjb3B5LCBHU1RfVEFHX0NPTlRBSU5FUl9GT1JNQVQpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJGb3JtYXR0aW5nIHRhZ3MiKTsKKyAgICBnc3RfcXRfbXV4X2FkZF9tZXRhZGF0YV90YWdzIChxdG11eCwgY29weSwgJnF0bXV4LT5tb292LT51ZHRhKTsKKyAgICBnc3RfcXRfbXV4X2FkZF94bXBfdGFncyAocXRtdXgsIGNvcHkpOworICAgIGdzdF90YWdfbGlzdF91bnJlZiAoY29weSk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJObyBuZXcgdGFncyByZWNlaXZlZCIpOworICB9CisKKyAgZm9yICh3YWxrID0gcXRtdXgtPnNpbmtwYWRzOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdENvbGxlY3REYXRhICpjZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSB3YWxrLT5kYXRhOworICAgIEdzdFFUUGFkICpxcGFkID0gKEdzdFFUUGFkICopIGNkYXRhOworICAgIEdzdFBhZCAqcGFkID0gcXBhZC0+Y29sbGVjdC5wYWQ7CisKKyAgICBpZiAocXBhZC0+dGFnc19jaGFuZ2VkICYmIHFwYWQtPnRhZ3MpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgIkFkZGluZyB0YWdzIik7CisgICAgICBnc3RfdGFnX2xpc3RfcmVtb3ZlX3RhZyAocXBhZC0+dGFncywgR1NUX1RBR19DT05UQUlORVJfRk9STUFUKTsKKyAgICAgIGdzdF9xdF9tdXhfYWRkX21ldGFkYXRhX3RhZ3MgKHF0bXV4LCBxcGFkLT50YWdzLCAmcXBhZC0+dHJhay0+dWR0YSk7CisgICAgICBxcGFkLT50YWdzX2NoYW5nZWQgPSBGQUxTRTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgIlRhZ3MgYWRkZWQiKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiTm8gbmV3IHRhZ3MgcmVjZWl2ZWQiKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGlubGluZSBHc3RCdWZmZXIgKgorX2dzdF9idWZmZXJfbmV3X3Rha2VfZGF0YSAoZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgc2l6ZSkKK3sKKyAgR3N0QnVmZmVyICpidWY7CisKKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAoYnVmLAorICAgICAgZ3N0X21lbW9yeV9uZXdfd3JhcHBlZCAoMCwgZGF0YSwgc2l6ZSwgMCwgc2l6ZSwgZGF0YSwgZ19mcmVlKSk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfc2VuZF9idWZmZXIgKEdzdFFUTXV4ICogcXRtdXgsIEdzdEJ1ZmZlciAqIGJ1ZiwgZ3VpbnQ2NCAqIG9mZnNldCwKKyAgICBnYm9vbGVhbiBtaW5kX2Zhc3QpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzOworICBnc2l6ZSBzaXplOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChidWYgIT0gTlVMTCwgR1NUX0ZMT1dfRVJST1IpOworCisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpOworICBHU1RfTE9HX09CSkVDVCAocXRtdXgsICJzZW5kaW5nIGJ1ZmZlciBzaXplICUiIEdfR1NJWkVfRk9STUFULCBzaXplKTsKKworICBpZiAobWluZF9mYXN0ICYmIHF0bXV4LT5mYXN0X3N0YXJ0X2ZpbGUpIHsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBnaW50IHJldDsKKworICAgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwgInRvIHRlbXBvcmFyeSBmaWxlIik7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICByZXQgPSBmd3JpdGUgKG1hcC5kYXRhLCBzaXplb2YgKGd1aW50OCksIG1hcC5zaXplLCBxdG11eC0+ZmFzdF9zdGFydF9maWxlKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgaWYgKHJldCAhPSBzaXplKQorICAgICAgZ290byB3cml0ZV9lcnJvcjsKKyAgICBlbHNlCisgICAgICByZXMgPSBHU1RfRkxPV19PSzsKKyAgfSBlbHNlIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRtdXgsICJkb3duc3RyZWFtIik7CisgICAgcmVzID0gZ3N0X3BhZF9wdXNoIChxdG11eC0+c3JjcGFkLCBidWYpOworICB9CisKKyAgaWYgKEdfTElLRUxZIChvZmZzZXQpKQorICAgICpvZmZzZXQgKz0gc2l6ZTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLword3JpdGVfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtdXgsIFJFU09VUkNFLCBXUklURSwKKyAgICAgICAgKCJGYWlsZWQgdG8gd3JpdGUgdG8gdGVtcG9yYXJ5IGZpbGUiKSwgR1NUX0VSUk9SX1NZU1RFTSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3F0X211eF9zZWVrX3RvX2JlZ2lubmluZyAoRklMRSAqIGYpCit7CisjaWZkZWYgSEFWRV9GU0VFS08KKyAgaWYgKGZzZWVrbyAoZiwgKG9mZl90KSAwLCBTRUVLX1NFVCkgIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisjZWxpZiBkZWZpbmVkIChHX09TX1VOSVgpIHx8IGRlZmluZWQgKEdfT1NfV0lOMzIpCisgIGlmIChsc2VlayAoZmlsZW5vIChmKSwgKG9mZl90KSAwLCBTRUVLX1NFVCkgPT0gKG9mZl90KSAtIDEpCisgICAgcmV0dXJuIEZBTFNFOworI2Vsc2UKKyAgaWYgKGZzZWVrIChmLCAobG9uZykgMCwgU0VFS19TRVQpICE9IDApCisgICAgcmV0dXJuIEZBTFNFOworI2VuZGlmCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3F0X211eF9zZW5kX2J1ZmZlcmVkX2RhdGEgKEdzdFFUTXV4ICogcXRtdXgsIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdEJ1ZmZlciAqYnVmID0gTlVMTDsKKworICBpZiAoZmZsdXNoIChxdG11eC0+ZmFzdF9zdGFydF9maWxlKSkKKyAgICBnb3RvIGZsdXNoX2ZhaWxlZDsKKworICBpZiAoIWdzdF9xdF9tdXhfc2Vla190b19iZWdpbm5pbmcgKHF0bXV4LT5mYXN0X3N0YXJ0X2ZpbGUpKQorICAgIGdvdG8gc2Vla19mYWlsZWQ7CisKKyAgLyogaG0sIHRoaXMgY291bGQgYWxsIHRha2UgYSByZWFsbHkgcmVhbGx5IGxvbmcgdGltZSwKKyAgICogYnV0IHRoZXJlIG1heSBub3QgYmUgYW5vdGhlciB3YXkgdG8gZ2V0IG1vb3YgYXRvbSBmaXJzdAorICAgKiAoc29tZWhvdyBvcHRpbWl6ZSBjb3B5PykgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJTZW5kaW5nIGJ1ZmZlcmVkIGRhdGEiKTsKKyAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSykgeworICAgIGNvbnN0IGludCBidWZzaXplID0gNDA5NjsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBnc2l6ZSBzaXplOworCisgICAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChidWZzaXplKTsKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICBzaXplID0gZnJlYWQgKG1hcC5kYXRhLCBzaXplb2YgKGd1aW50OCksIGJ1ZnNpemUsIHF0bXV4LT5mYXN0X3N0YXJ0X2ZpbGUpOworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgR1NUX0xPR19PQkpFQ1QgKHF0bXV4LCAiUHVzaGluZyBidWZmZXJlZCBidWZmZXIgb2Ygc2l6ZSAlZCIsIChnaW50KSBzaXplKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIGlmIChzaXplICE9IGJ1ZnNpemUpCisgICAgICBnc3RfYnVmZmVyX3NldF9zaXplIChidWYsIHNpemUpOworICAgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9idWZmZXIgKHF0bXV4LCBidWYsIG9mZnNldCwgRkFMU0UpOworICAgIGJ1ZiA9IE5VTEw7CisgIH0KKyAgaWYgKGJ1ZikKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgIGlmIChmdHJ1bmNhdGUgKGZpbGVubyAocXRtdXgtPmZhc3Rfc3RhcnRfZmlsZSksIDApKQorICAgIGdvdG8gc2Vla19mYWlsZWQ7CisgIGlmICghZ3N0X3F0X211eF9zZWVrX3RvX2JlZ2lubmluZyAocXRtdXgtPmZhc3Rfc3RhcnRfZmlsZSkpCisgICAgZ290byBzZWVrX2ZhaWxlZDsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworZmx1c2hfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXV4LCBSRVNPVVJDRSwgV1JJVEUsCisgICAgICAgICgiRmFpbGVkIHRvIGZsdXNoIHRlbXBvcmFyeSBmaWxlIiksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZmFpbDsKKyAgfQorc2Vla19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtdXgsIFJFU09VUkNFLCBTRUVLLAorICAgICAgICAoIkZhaWxlZCB0byBzZWVrIHRlbXBvcmFyeSBmaWxlIiksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZmFpbDsKKyAgfQorZmFpbDoKKyAgeworICAgIC8qIGNsZWFyIGRlc2NyaXB0b3Igc28gd2UgZG9uJ3QgcmVtb3ZlIHRlbXAgZmlsZSBsYXRlciBvbiwKKyAgICAgKiBtaWdodCBiZSBwb3NzaWJsZSB0byByZWNvdmVyICovCisgICAgZmNsb3NlIChxdG11eC0+ZmFzdF9zdGFydF9maWxlKTsKKyAgICBxdG11eC0+ZmFzdF9zdGFydF9maWxlID0gTlVMTDsKKyAgICByZXR1cm4gcmV0OworICB9Cit9CisKKy8qCisgKiBTZW5kcyB0aGUgaW5pdGlhbCBtZGF0IGF0b20gZmllbGRzIChzaXplIGZpZWxkcyBhbmQgZm91cmNjIHR5cGUpLAorICogdGhlIHN1YnNlcXVlbnQgYnVmZmVycyBhcmUgY29uc2lkZXJlZCBwYXJ0IG9mIGl0J3MgZGF0YS4KKyAqIEFzIHdlIGNhbid0IHByZWRpY3QgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgd2UgYXJlIGdvaW5nIHRvIHBsYWNlIGluIG1kYXQKKyAqIHdlIG5lZWQgdG8gcmVjb3JkIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2l6ZSBmaWVsZCBpbiB0aGUgc3RyZWFtIHNvIHdlIGNhbgorICogc2VlayBiYWNrIHRvIGl0IGxhdGVyIGFuZCB1cGRhdGUgd2hlbiB0aGUgc3RyZWFtcyBoYXZlIGZpbmlzaGVkLgorICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3F0X211eF9zZW5kX21kYXRfaGVhZGVyIChHc3RRVE11eCAqIHF0bXV4LCBndWludDY0ICogb2ZmLCBndWludDY0IHNpemUsCisgICAgZ2Jvb2xlYW4gZXh0ZW5kZWQsIGdib29sZWFuIGZzeW5jX2FmdGVyKQoreworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJTZW5kaW5nIG1kYXQncyBhdG9tIGhlYWRlciwgIgorICAgICAgInNpemUgJSIgR19HVUlOVDY0X0ZPUk1BVCwgc2l6ZSk7CisKKyAgLyogaWYgdGhlIHF0bXV4IHN0YXRlIGlzIEVPUywgcmVhbGx5IHdyaXRlIHRoZSBtZGF0LCBvdGhlcndpc2UKKyAgICogYWxsb3cgc2l6ZSA9PSAwIGZvciBhIHBsYWNlaG9sZGVyIGF0b20gKi8KKyAgaWYgKHF0bXV4LT5zdGF0ZSA9PSBHU1RfUVRfTVVYX1NUQVRFX0VPUyB8fCBzaXplID4gMCkKKyAgICBzaXplICs9IDg7CisKKyAgaWYgKGV4dGVuZGVkKSB7CisgICAgZ2Jvb2xlYW4gbGFyZ2VfZmlsZSA9IChzaXplID4gTURBVF9MQVJHRV9GSUxFX0xJTUlUKTsKKyAgICAvKiBBbHdheXMgd3JpdGUgMTYtYnl0ZXMsIGJ1dCBwdXQgYSBmcmVlIGF0b20gZmlyc3QKKyAgICAgKiBpZiB0aGUgc2l6ZSBpcyA8IDRHQi4gKi8KKyAgICBidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDE2KTsKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKworICAgIGlmIChsYXJnZV9maWxlKSB7CisgICAgICAvKiBXcml0ZSBleHRlbmRlZCBtZGF0IGhlYWRlciBhbmQgbGFyZ2Vfc2l6ZSBmaWVsZCAqLworICAgICAgR1NUX1dSSVRFX1VJTlQzMl9CRSAobWFwLmRhdGEsIDEpOworICAgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAobWFwLmRhdGEgKyA0LCBGT1VSQ0NfbWRhdCk7CisgICAgICBHU1RfV1JJVEVfVUlOVDY0X0JFIChtYXAuZGF0YSArIDgsIHNpemUgKyA4KTsKKyAgICB9IGVsc2UgeworICAgICAgLyogV3JpdGUgYW4gZW1wdHkgZnJlZSBhdG9tLCB0aGVuIHN0YW5kYXJkIDMyLWJpdCBtZGF0ICovCisgICAgICBHU1RfV1JJVEVfVUlOVDMyX0JFIChtYXAuZGF0YSwgOCk7CisgICAgICBHU1RfV1JJVEVfVUlOVDMyX0xFIChtYXAuZGF0YSArIDQsIEZPVVJDQ19mcmVlKTsKKyAgICAgIEdTVF9XUklURV9VSU5UMzJfQkUgKG1hcC5kYXRhICsgOCwgc2l6ZSk7CisgICAgICBHU1RfV1JJVEVfVUlOVDMyX0xFIChtYXAuZGF0YSArIDEyLCBGT1VSQ0NfbWRhdCk7CisgICAgfQorICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIH0gZWxzZSB7CisgICAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg4KTsKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKworICAgIC8qIFZhbmlsbGEgMzItYml0IG1kYXQgKi8KKyAgICBHU1RfV1JJVEVfVUlOVDMyX0JFIChtYXAuZGF0YSwgc2l6ZSk7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAobWFwLmRhdGEgKyA0LCBGT1VSQ0NfbWRhdCk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwgIlB1c2hpbmcgbWRhdCBoZWFkZXIiKTsKKyAgaWYgKGZzeW5jX2FmdGVyKQorICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX1NZTkNfQUZURVIpOworCisgIHJldHVybiBnc3RfcXRfbXV4X3NlbmRfYnVmZmVyIChxdG11eCwgYnVmLCBvZmYsIEZBTFNFKTsKKworfQorCisvKgorICogV2UgZ2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbWRhdCBzaXplIGZpZWxkLCBzZWVrIGJhY2sgdG8gaXQKKyAqIGFuZCBvdmVyd3JpdGUgd2l0aCB0aGUgcmVhbCB2YWx1ZQorICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3F0X211eF91cGRhdGVfbWRhdF9zaXplIChHc3RRVE11eCAqIHF0bXV4LCBndWludDY0IG1kYXRfcG9zLAorICAgIGd1aW50NjQgbWRhdF9zaXplLCBndWludDY0ICogb2Zmc2V0LCBnYm9vbGVhbiBmc3luY19hZnRlcikKK3sKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIC8qIFdlIG11c3QgaGF2ZSByZWNvcmRlZCB0aGUgbWRhdCBwb3NpdGlvbiBmb3IgdGhpcyB0byB3b3JrICovCisgIGdfYXNzZXJ0IChtZGF0X3BvcyAhPSAwKTsKKworICAvKiBzZWVrIGFuZCByZXdyaXRlIHRoZSBoZWFkZXIgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfQllURVMpOworICBzZWdtZW50LnN0YXJ0ID0gbWRhdF9wb3M7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAocXRtdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgIHJldHVybiBnc3RfcXRfbXV4X3NlbmRfbWRhdF9oZWFkZXIgKHF0bXV4LCBvZmZzZXQsIG1kYXRfc2l6ZSwgVFJVRSwKKyAgICAgIGZzeW5jX2FmdGVyKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfc2VuZF9mdHlwIChHc3RRVE11eCAqIHF0bXV4LCBndWludDY0ICogb2ZmKQoreworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgZ3VpbnQ2NCBzaXplID0gMCwgb2Zmc2V0ID0gMDsKKyAgZ3VpbnQ4ICpkYXRhID0gTlVMTDsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIlNlbmRpbmcgZnR5cCBhdG9tIik7CisKKyAgaWYgKCFhdG9tX2Z0eXBfY29weV9kYXRhIChxdG11eC0+ZnR5cCwgJmRhdGEsICZzaXplLCAmb2Zmc2V0KSkKKyAgICBnb3RvIHNlcmlhbGl6ZV9lcnJvcjsKKworICBidWYgPSBfZ3N0X2J1ZmZlcl9uZXdfdGFrZV9kYXRhIChkYXRhLCBvZmZzZXQpOworCisgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwgIlB1c2hpbmcgZnR5cCIpOworICByZXR1cm4gZ3N0X3F0X211eF9zZW5kX2J1ZmZlciAocXRtdXgsIGJ1Ziwgb2ZmLCBGQUxTRSk7CisKKyAgLyogRVJST1JTICovCitzZXJpYWxpemVfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtdXgsIFNUUkVBTSwgTVVYLCAoTlVMTCksCisgICAgICAgICgiRmFpbGVkIHRvIHNlcmlhbGl6ZSBmdHlwIikpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9wcmVwYXJlX2Z0eXAgKEdzdFFUTXV4ICogcXRtdXgsIEF0b21GVFlQICoqIHBfZnR5cCwKKyAgICBHc3RCdWZmZXIgKiogcF9wcmVmaXgpCit7CisgIEdzdFFUTXV4Q2xhc3MgKnF0bXV4X2tsYXNzID0gKEdzdFFUTXV4Q2xhc3MgKikgKEdfT0JKRUNUX0dFVF9DTEFTUyAocXRtdXgpKTsKKyAgZ3VpbnQzMiBtYWpvciwgdmVyc2lvbjsKKyAgR0xpc3QgKmNvbXA7CisgIEdzdEJ1ZmZlciAqcHJlZml4ID0gTlVMTDsKKyAgQXRvbUZUWVAgKmZ0eXAgPSBOVUxMOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiUHJlcGFyaW5nIGZ0eXAgYW5kIHBvc3NpYmxlIHByZWZpeCBhdG9tIik7CisKKyAgLyogaW5pdCBhbmQgc2VuZCBjb250ZXh0IGFuZCBmdHlwIGJhc2VkIG9uIGN1cnJlbnQgcHJvcGVydHkgc3RhdGUgKi8KKyAgZ3N0X3F0X211eF9tYXBfZm9ybWF0X3RvX2hlYWRlciAocXRtdXhfa2xhc3MtPmZvcm1hdCwgJnByZWZpeCwgJm1ham9yLAorICAgICAgJnZlcnNpb24sICZjb21wLCBxdG11eC0+bW9vdiwgcXRtdXgtPmxvbmdlc3RfY2h1bmssCisgICAgICBxdG11eC0+ZmFzdF9zdGFydF9maWxlICE9IE5VTEwpOworICBmdHlwID0gYXRvbV9mdHlwX25ldyAocXRtdXgtPmNvbnRleHQsIG1ham9yLCB2ZXJzaW9uLCBjb21wKTsKKyAgaWYgKGNvbXApCisgICAgZ19saXN0X2ZyZWUgKGNvbXApOworICBpZiAocHJlZml4KSB7CisgICAgaWYgKHBfcHJlZml4KQorICAgICAgKnBfcHJlZml4ID0gcHJlZml4OworICAgIGVsc2UKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHByZWZpeCk7CisgIH0KKyAgKnBfZnR5cCA9IGZ0eXA7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcXRfbXV4X3ByZXBhcmVfYW5kX3NlbmRfZnR5cCAoR3N0UVRNdXggKiBxdG11eCkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0QnVmZmVyICpwcmVmaXggPSBOVUxMOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiUHJlcGFyaW5nIHRvIHNlbmQgZnR5cCBhdG9tIik7CisKKyAgLyogaW5pdCBhbmQgc2VuZCBjb250ZXh0IGFuZCBmdHlwIGJhc2VkIG9uIGN1cnJlbnQgcHJvcGVydHkgc3RhdGUgKi8KKyAgaWYgKHF0bXV4LT5mdHlwKSB7CisgICAgYXRvbV9mdHlwX2ZyZWUgKHF0bXV4LT5mdHlwKTsKKyAgICBxdG11eC0+ZnR5cCA9IE5VTEw7CisgIH0KKyAgZ3N0X3F0X211eF9wcmVwYXJlX2Z0eXAgKHF0bXV4LCAmcXRtdXgtPmZ0eXAsICZwcmVmaXgpOworICBpZiAocHJlZml4KSB7CisgICAgcmV0ID0gZ3N0X3F0X211eF9zZW5kX2J1ZmZlciAocXRtdXgsIHByZWZpeCwgJnF0bXV4LT5oZWFkZXJfc2l6ZSwgRkFMU0UpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICByZXR1cm4gcmV0OworICB9CisgIHJldHVybiBnc3RfcXRfbXV4X3NlbmRfZnR5cCAocXRtdXgsICZxdG11eC0+aGVhZGVyX3NpemUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9zZXRfaGVhZGVyX29uX2NhcHMgKEdzdFFUTXV4ICogbXV4LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBHVmFsdWUgYXJyYXkgPSB7IDAgfTsKKyAgR1ZhbHVlIHZhbHVlID0geyAwIH07CisgIEdzdENhcHMgKmNhcHMsICp0Y2FwczsKKworICB0Y2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAobXV4LT5zcmNwYWQpOworICBjYXBzID0gZ3N0X2NhcHNfY29weSAodGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAodGNhcHMpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIGdfdmFsdWVfaW5pdCAoJmFycmF5LCBHU1RfVFlQRV9BUlJBWSk7CisKKyAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSKTsKKyAgZ192YWx1ZV9pbml0ICgmdmFsdWUsIEdTVF9UWVBFX0JVRkZFUik7CisgIGdzdF92YWx1ZV90YWtlX2J1ZmZlciAoJnZhbHVlLCBnc3RfYnVmZmVyX3JlZiAoYnVmKSk7CisgIGdzdF92YWx1ZV9hcnJheV9hcHBlbmRfdmFsdWUgKCZhcnJheSwgJnZhbHVlKTsKKyAgZ192YWx1ZV91bnNldCAoJnZhbHVlKTsKKworICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAoc3RydWN0dXJlLCAic3RyZWFtaGVhZGVyIiwgJmFycmF5KTsKKyAgZ192YWx1ZV91bnNldCAoJmFycmF5KTsKKyAgZ3N0X3BhZF9zZXRfY2FwcyAobXV4LT5zcmNwYWQsIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7Cit9CisKKy8qCisgKiBXcml0ZSBvdXQgYSBmcmVlIHNwYWNlIGF0b20uIFRoZSBvZmZzZXQgaXMgYWRqdXN0ZWQgYnkgdGhlIGZ1bGwKKyAqIHNpemUsIGJ1dCBhIHNtYWxsZXIgYnVmZmVyIGlzIHNlbnQKKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfc2VuZF9mcmVlX2F0b20gKEdzdFFUTXV4ICogcXRtdXgsIGd1aW50NjQgKiBvZmYsIGd1aW50MzIgc2l6ZSwKKyAgICBnYm9vbGVhbiBmc3luY19hZnRlcikKK3sKKyAgQXRvbSAqbm9kZV9oZWFkZXI7CisgIEdzdEJ1ZmZlciAqYnVmOworICBndWludDggKmRhdGEgPSBOVUxMOworICBndWludDY0IG9mZnNldCA9IDAsIGJzaXplID0gMDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJTZW5kaW5nIGZyZWUgYXRvbSBoZWFkZXIgb2Ygc2l6ZSAldSIsIHNpemUpOworCisgIC8qIFdlIGNhbid0IG1ha2UgYSBmcmVlIHNwYWNlIGF0b20gc21hbGxlciB0aGFuIHRoZSBoZWFkZXIgKi8KKyAgaWYgKHNpemUgPCA4KQorICAgIGdvdG8gdG9vX3NtYWxsOworCisgIG5vZGVfaGVhZGVyID0gZ19tYWxsb2MwIChzaXplb2YgKEF0b20pKTsKKyAgbm9kZV9oZWFkZXItPnR5cGUgPSBGT1VSQ0NfZnJlZTsKKyAgbm9kZV9oZWFkZXItPnNpemUgPSBzaXplOworCisgIGJzaXplID0gb2Zmc2V0ID0gMDsKKyAgaWYgKGF0b21fY29weV9kYXRhIChub2RlX2hlYWRlciwgJmRhdGEsICZic2l6ZSwgJm9mZnNldCkgPT0gMCkKKyAgICBnb3RvIHNlcmlhbGl6ZV9lcnJvcjsKKworICBidWYgPSBfZ3N0X2J1ZmZlcl9uZXdfdGFrZV9kYXRhIChkYXRhLCBvZmZzZXQpOworICBnX2ZyZWUgKG5vZGVfaGVhZGVyKTsKKworICBpZiAoZnN5bmNfYWZ0ZXIpCisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfU1lOQ19BRlRFUik7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHF0bXV4LCAiUHVzaGluZyBmcmVlIGF0b20iKTsKKyAgcmV0ID0gZ3N0X3F0X211eF9zZW5kX2J1ZmZlciAocXRtdXgsIGJ1Ziwgb2ZmLCBGQUxTRSk7CisKKyAgaWYgKG9mZikgeworICAgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICAgICpvZmYgKz0gc2l6ZSAtIDg7CisKKyAgICAvKiBNYWtlIHN1cmUgZG93bnN0cmVhbSBwb3NpdGlvbiBlbmRzIHVwIGF0IHRoZSBlbmQgb2YgdGhpcyBmcmVlIGJveCAqLworICAgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX0JZVEVTKTsKKyAgICBzZWdtZW50LnN0YXJ0ID0gKm9mZjsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHF0bXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKyAgfQorCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCit0b29fc21hbGw6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtdXgsIFNUUkVBTSwgTVVYLCAoTlVMTCksCisgICAgICAgICgiTm90IGVub3VnaCBmcmVlIHJlc2VydmVkIHNwYWNlIikpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorc2VyaWFsaXplX2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXV4LCBTVFJFQU0sIE1VWCwgKE5VTEwpLAorICAgICAgICAoIkZhaWxlZCB0byBzZXJpYWxpemUgbWRhdCIpKTsKKyAgICBnX2ZyZWUgKG5vZGVfaGVhZGVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfY29uZmlndXJlX21vb3YgKEdzdFFUTXV4ICogcXRtdXgpCit7CisgIGdib29sZWFuIGZyYWdtZW50ZWQgPSBGQUxTRTsKKyAgZ3VpbnQzMiB0aW1lc2NhbGU7CisKKyAgR1NUX09CSkVDVF9MT0NLIChxdG11eCk7CisgIHRpbWVzY2FsZSA9IHF0bXV4LT50aW1lc2NhbGU7CisgIGlmIChxdG11eC0+bXV4X21vZGUgPT0gR1NUX1FUX01VWF9NT0RFX0ZSQUdNRU5URUQgfHwKKyAgICAgIHF0bXV4LT5tdXhfbW9kZSA9PSBHU1RfUVRfTVVYX01PREVfRlJBR01FTlRFRF9TVFJFQU1BQkxFKQorICAgIGZyYWdtZW50ZWQgPSBUUlVFOworICBHU1RfT0JKRUNUX1VOTE9DSyAocXRtdXgpOworCisgIC8qIGluZm9ybSBsb3dlciBsYXllcnMgb2Ygb3VyIHByb3BlcnR5IHdpc2hlcywgYW5kIGRldGVybWluZSBkdXJhdGlvbi4KKyAgICogTGV0IG1vb3YgdGFrZSBjYXJlIG9mIHRoaXMgdXNpbmcgaXRzIGxpc3Qgb2YgdHJha3M7CisgICAqIHNvIHRoYXQgcmVsZWFzZWQgcGFkcyBhcmUgYWxzbyBpbmNsdWRlZCAqLworICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIlVwZGF0aW5nIHRpbWVzY2FsZSB0byAlIiBHX0dVSU5UMzJfRk9STUFULAorICAgICAgdGltZXNjYWxlKTsKKyAgYXRvbV9tb292X3VwZGF0ZV90aW1lc2NhbGUgKHF0bXV4LT5tb292LCB0aW1lc2NhbGUpOworICBhdG9tX21vb3Zfc2V0X2ZyYWdtZW50ZWQgKHF0bXV4LT5tb292LCBmcmFnbWVudGVkKTsKKworICBhdG9tX21vb3ZfdXBkYXRlX2R1cmF0aW9uIChxdG11eC0+bW9vdik7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcXRfbXV4X3NlbmRfbW9vdiAoR3N0UVRNdXggKiBxdG11eCwgZ3VpbnQ2NCAqIF9vZmZzZXQsCisgICAgZ3VpbnQ2NCBwYWRkZWRfbW9vdl9zaXplLCBnYm9vbGVhbiBtaW5kX2Zhc3QsIGdib29sZWFuIGZzeW5jX2FmdGVyKQoreworICBndWludDY0IG9mZnNldCA9IDAsIHNpemUgPSAwOworICBndWludDggKmRhdGE7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHU0xpc3QgKndhbGs7CisgIGd1aW50NjQgY3VycmVudF90aW1lID0gYXRvbXNfZ2V0X2N1cnJlbnRfcXRfdGltZSAoKTsKKworICAvKiB1cGRhdGUgbW9kaWZpY2F0aW9uIHRpbWVzICovCisgIHF0bXV4LT5tb292LT5tdmhkLnRpbWVfaW5mby5tb2RpZmljYXRpb25fdGltZSA9IGN1cnJlbnRfdGltZTsKKyAgZm9yICh3YWxrID0gcXRtdXgtPmNvbGxlY3QtPmRhdGE7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0Q29sbGVjdERhdGEgKmNkYXRhID0gKEdzdENvbGxlY3REYXRhICopIHdhbGstPmRhdGE7CisgICAgR3N0UVRQYWQgKnF0cGFkID0gKEdzdFFUUGFkICopIGNkYXRhOworCisgICAgcXRwYWQtPnRyYWstPm1kaWEubWRoZC50aW1lX2luZm8ubW9kaWZpY2F0aW9uX3RpbWUgPSBjdXJyZW50X3RpbWU7CisgICAgcXRwYWQtPnRyYWstPnRraGQubW9kaWZpY2F0aW9uX3RpbWUgPSBjdXJyZW50X3RpbWU7CisgIH0KKworICAvKiBzZXJpYWxpemUgbW9vdiAqLworICBvZmZzZXQgPSBzaXplID0gMDsKKyAgZGF0YSA9IE5VTEw7CisgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwgIkNvcHlpbmcgbW92aWUgaGVhZGVyIGludG8gYnVmZmVyIik7CisgIGlmICghYXRvbV9tb292X2NvcHlfZGF0YSAocXRtdXgtPm1vb3YsICZkYXRhLCAmc2l6ZSwgJm9mZnNldCkpCisgICAgZ290byBzZXJpYWxpemVfZXJyb3I7CisgIHF0bXV4LT5sYXN0X21vb3Zfc2l6ZSA9IG9mZnNldDsKKworICAvKiBDaGVjayB3ZSBoYXZlIGVub3VnaCByZXNlcnZlZCBzcGFjZSBmb3IgdGhpcyBhbmQgYSBGcmVlIGF0b20gKi8KKyAgaWYgKHBhZGRlZF9tb292X3NpemUgPiAwICYmIG9mZnNldCArIDggPiBwYWRkZWRfbW9vdl9zaXplKQorICAgIGdvdG8gdG9vX3NtYWxsX3Jlc2VydmVkOworICBidWYgPSBfZ3N0X2J1ZmZlcl9uZXdfdGFrZV9kYXRhIChkYXRhLCBvZmZzZXQpOworICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIlB1c2hpbmcgbW9vdiBhdG9tcyIpOworCisgIC8qIElmIGF0IEVPUywgdGhpcyBpcyB0aGUgZmluYWwgbW9vdiwgcHV0IGluIHRoZSBzdHJlYW1oZWFkZXIKKyAgICogKGFwcGFyZW50bHkgdXNlZCBieSBhIGZsdW1vdGlvbiB1dGlsKSAqLworICBpZiAocXRtdXgtPnN0YXRlID09IEdTVF9RVF9NVVhfU1RBVEVfRU9TKQorICAgIGdzdF9xdF9tdXhfc2V0X2hlYWRlcl9vbl9jYXBzIChxdG11eCwgYnVmKTsKKworICBpZiAoZnN5bmNfYWZ0ZXIpCisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfU1lOQ19BRlRFUik7CisgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9idWZmZXIgKHF0bXV4LCBidWYsIF9vZmZzZXQsIG1pbmRfZmFzdCk7CisKKyAgLyogV3JpdGUgb3V0IGEgZnJlZSBhdG9tIGlmIG5lZWRlZCAqLworICBpZiAocmV0ID09IEdTVF9GTE9XX09LICYmIG9mZnNldCA8IHBhZGRlZF9tb292X3NpemUpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRtdXgsICJXcml0aW5nIG91dCBmcmVlIGF0b20gb2Ygc2l6ZSAldSIsCisgICAgICAgIChndWludDMyKSAocGFkZGVkX21vb3Zfc2l6ZSAtIG9mZnNldCkpOworICAgIHJldCA9CisgICAgICAgIGdzdF9xdF9tdXhfc2VuZF9mcmVlX2F0b20gKHF0bXV4LCBfb2Zmc2V0LCBwYWRkZWRfbW9vdl9zaXplIC0gb2Zmc2V0LAorICAgICAgICBmc3luY19hZnRlcik7CisgIH0KKworICByZXR1cm4gcmV0OwordG9vX3NtYWxsX3Jlc2VydmVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXV4LCBTVFJFQU0sIE1VWCwKKyAgICAgICAgKCJOb3QgZW5vdWdoIGZyZWUgcmVzZXJ2ZWQgaGVhZGVyIHNwYWNlIiksCisgICAgICAgICgiTmVlZGVkICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBieXRlcywgcmVzZXJ2ZWQgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgIG9mZnNldCwgcGFkZGVkX21vb3Zfc2l6ZSkpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorc2VyaWFsaXplX2Vycm9yOgorICB7CisgICAgZ19mcmVlIChkYXRhKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworLyogZWl0aGVyIGNhbGN1bGF0ZXMgc2l6ZSBvZiBleHRyYSBhdG9tcyBvciBwdXNoZXMgdGhlbSAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfc2VuZF9leHRyYV9hdG9tcyAoR3N0UVRNdXggKiBxdG11eCwgZ2Jvb2xlYW4gc2VuZCwgZ3VpbnQ2NCAqIG9mZnNldCwKKyAgICBnYm9vbGVhbiBtaW5kX2Zhc3QpCit7CisgIEdTTGlzdCAqd2FsazsKKyAgZ3VpbnQ2NCBsb2Zmc2V0ID0gMCwgc2l6ZSA9IDA7CisgIGd1aW50OCAqZGF0YTsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKworICBmb3IgKHdhbGsgPSBxdG11eC0+ZXh0cmFfYXRvbXM7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgQXRvbUluZm8gKmFpbmZvID0gKEF0b21JbmZvICopIHdhbGstPmRhdGE7CisKKyAgICBsb2Zmc2V0ID0gc2l6ZSA9IDA7CisgICAgZGF0YSA9IE5VTEw7CisgICAgaWYgKCFhaW5mby0+Y29weV9kYXRhX2Z1bmMgKGFpbmZvLT5hdG9tLAorICAgICAgICAgICAgc2VuZCA/ICZkYXRhIDogTlVMTCwgJnNpemUsICZsb2Zmc2V0KSkKKyAgICAgIGdvdG8gc2VyaWFsaXplX2Vycm9yOworCisgICAgaWYgKHNlbmQpIHsKKyAgICAgIEdzdEJ1ZmZlciAqYnVmOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwKKyAgICAgICAgICAiUHVzaGluZyBleHRyYSB0b3AtbGV2ZWwgYXRvbSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGFpbmZvLT5hdG9tLT50eXBlKSk7CisgICAgICBidWYgPSBfZ3N0X2J1ZmZlcl9uZXdfdGFrZV9kYXRhIChkYXRhLCBsb2Zmc2V0KTsKKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9idWZmZXIgKHF0bXV4LCBidWYsIG9mZnNldCwgRkFMU0UpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChvZmZzZXQpCisgICAgICAgICpvZmZzZXQgKz0gbG9mZnNldDsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0OworCitzZXJpYWxpemVfZXJyb3I6CisgIHsKKyAgICBnX2ZyZWUgKGRhdGEpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9xdF9tdXhfZG93bnN0cmVhbV9pc19zZWVrYWJsZSAoR3N0UVRNdXggKiBxdG11eCkKK3sKKyAgZ2Jvb2xlYW4gc2Vla2FibGUgPSBGQUxTRTsKKyAgR3N0UXVlcnkgKnF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19zZWVraW5nIChHU1RfRk9STUFUX0JZVEVTKTsKKworICBpZiAoZ3N0X3BhZF9wZWVyX3F1ZXJ5IChxdG11eC0+c3JjcGFkLCBxdWVyeSkpIHsKKyAgICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksIE5VTEwsICZzZWVrYWJsZSwgTlVMTCwgTlVMTCk7CisgICAgR1NUX0lORk9fT0JKRUNUIChxdG11eCwgImRvd25zdHJlYW0gaXMgJXNzZWVrYWJsZSIsIHNlZWthYmxlID8gIiIgOiAibm90ICIpOworICB9IGVsc2UgeworICAgIC8qIGhhdmUgdG8gYXNzdW1lIHNlZWtpbmcgaXMgbm90IHN1cHBvcnRlZCBpZiBxdWVyeSBub3QgaGFuZGxlZCBkb3duc3RyZWFtICovCisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgImRvd25zdHJlYW0gZGlkIG5vdCBoYW5kbGUgc2Vla2luZyBxdWVyeSIpOworICAgIHNlZWthYmxlID0gRkFMU0U7CisgIH0KKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisKKyAgcmV0dXJuIHNlZWthYmxlOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9wcmVwYXJlX21vb3ZfcmVjb3ZlcnkgKEdzdFFUTXV4ICogcXRtdXgpCit7CisgIEdTTGlzdCAqd2FsazsKKyAgZ2Jvb2xlYW4gZmFpbCA9IEZBTFNFOworICBBdG9tRlRZUCAqZnR5cCA9IE5VTEw7CisgIEdzdEJ1ZmZlciAqcHJlZml4ID0gTlVMTDsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIk9wZW5pbmcgbW9vdiByZWNvdmVyeSBmaWxlOiAlcyIsCisgICAgICBxdG11eC0+bW9vdl9yZWNvdl9maWxlX3BhdGgpOworCisgIHF0bXV4LT5tb292X3JlY292X2ZpbGUgPSBnX2ZvcGVuIChxdG11eC0+bW9vdl9yZWNvdl9maWxlX3BhdGgsICJ3YisiKTsKKyAgaWYgKHF0bXV4LT5tb292X3JlY292X2ZpbGUgPT0gTlVMTCkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRtdXgsICJGYWlsZWQgdG8gb3BlbiBtb292IHJlY292ZXJ5IGZpbGUgaW4gJXMiLAorICAgICAgICBxdG11eC0+bW9vdl9yZWNvdl9maWxlX3BhdGgpOworICAgIHJldHVybjsKKyAgfQorCisgIGdzdF9xdF9tdXhfcHJlcGFyZV9mdHlwIChxdG11eCwgJmZ0eXAsICZwcmVmaXgpOworCisgIGlmICghYXRvbXNfcmVjb3Zfd3JpdGVfaGVhZGVycyAocXRtdXgtPm1vb3ZfcmVjb3ZfZmlsZSwgZnR5cCwgcHJlZml4LAorICAgICAgICAgIHF0bXV4LT5tb292LCBxdG11eC0+dGltZXNjYWxlLCBnX3NsaXN0X2xlbmd0aCAocXRtdXgtPnNpbmtwYWRzKSkpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LCAiRmFpbGVkIHRvIHdyaXRlIG1vb3YgcmVjb3ZlcnkgZmlsZSAiICJoZWFkZXJzIik7CisgICAgZ290byBmYWlsOworICB9CisKKyAgYXRvbV9mdHlwX2ZyZWUgKGZ0eXApOworICBpZiAocHJlZml4KQorICAgIGdzdF9idWZmZXJfdW5yZWYgKHByZWZpeCk7CisKKyAgZm9yICh3YWxrID0gcXRtdXgtPnNpbmtwYWRzOyB3YWxrICYmICFmYWlsOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdENvbGxlY3REYXRhICpjZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSB3YWxrLT5kYXRhOworICAgIEdzdFFUUGFkICpxcGFkID0gKEdzdFFUUGFkICopIGNkYXRhOworICAgIC8qIHdyaXRlIGluZm8gZm9yIGVhY2ggc3RyZWFtICovCisgICAgZmFpbCA9IGF0b21zX3JlY292X3dyaXRlX3RyYWtfaW5mbyAocXRtdXgtPm1vb3ZfcmVjb3ZfZmlsZSwgcXBhZC0+dHJhayk7CisgICAgaWYgKGZhaWwpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRtdXgsICJGYWlsZWQgdG8gd3JpdGUgdHJhayBpbmZvIHRvIHJlY292ZXJ5ICIKKyAgICAgICAgICAiZmlsZSIpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuOworCitmYWlsOgorICAvKiBjbGVhbnVwICovCisgIGZjbG9zZSAocXRtdXgtPm1vb3ZfcmVjb3ZfZmlsZSk7CisgIHF0bXV4LT5tb292X3JlY292X2ZpbGUgPSBOVUxMOworfQorCitzdGF0aWMgZ3VpbnQ2NAorcHJlZmlsbF9nZXRfYmxvY2tfaW5kZXggKEdzdFFUTXV4ICogcXRtdXgsIEdzdFFUUGFkICogcXBhZCkKK3sKKyAgc3dpdGNoIChxcGFkLT5mb3VyY2MpIHsKKyAgICBjYXNlIEZPVVJDQ19hcGNoOgorICAgIGNhc2UgRk9VUkNDX2FwY246CisgICAgY2FzZSBGT1VSQ0NfYXBjczoKKyAgICBjYXNlIEZPVVJDQ19hcGNvOgorICAgIGNhc2UgRk9VUkNDX2FwNGg6CisgICAgY2FzZSBGT1VSQ0NfYXA0eDoKKyAgICAgIHJldHVybiBxcGFkLT5zYW1wbGVfb2Zmc2V0OworICAgIGNhc2UgRk9VUkNDX3Nvd3Q6CisgICAgY2FzZSBGT1VSQ0NfdHdvczoKKyAgICAgIHJldHVybiBnc3RfdXRpbF91aW50NjRfc2NhbGVfY2VpbCAocXBhZC0+c2FtcGxlX29mZnNldCwKKyAgICAgICAgICBxcGFkLT5leHBlY3RlZF9zYW1wbGVfZHVyYXRpb25fbiwKKyAgICAgICAgICBxcGFkLT5leHBlY3RlZF9zYW1wbGVfZHVyYXRpb25fZCAqCisgICAgICAgICAgYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHFwYWQtPnRyYWspKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIC0xOworICB9Cit9CisKK3N0YXRpYyBndWludAorcHJlZmlsbF9nZXRfc2FtcGxlX3NpemUgKEdzdFFUTXV4ICogcXRtdXgsIEdzdFFUUGFkICogcXBhZCkKK3sKKyAgc3dpdGNoIChxcGFkLT5mb3VyY2MpIHsKKyAgICBjYXNlIEZPVVJDQ19hcGNoOgorICAgICAgaWYgKCgoU2FtcGxlVGFibGVFbnRyeU1QNFYgKikgcXBhZC0+dHJha19zdGUpLT5oZWlnaHQgPD0gNDgwKSB7CisgICAgICAgIHJldHVybiAzMDAwMDA7CisgICAgICB9IGVsc2UgaWYgKCgoU2FtcGxlVGFibGVFbnRyeU1QNFYgKikgcXBhZC0+dHJha19zdGUpLT5oZWlnaHQgPD0gNTc2KSB7CisgICAgICAgIHJldHVybiAzNTAwMDA7CisgICAgICB9IGVsc2UgaWYgKCgoU2FtcGxlVGFibGVFbnRyeU1QNFYgKikgcXBhZC0+dHJha19zdGUpLT5oZWlnaHQgPD0gNzIwKSB7CisgICAgICAgIHJldHVybiA1MjUwMDA7CisgICAgICB9IGVsc2UgaWYgKCgoU2FtcGxlVGFibGVFbnRyeU1QNFYgKikgcXBhZC0+dHJha19zdGUpLT5oZWlnaHQgPD0gMTA4MCkgeworICAgICAgICByZXR1cm4gMTA1MDAwMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiA0MTUwMDAwOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfYXBjbjoKKyAgICAgIGlmICgoKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIHFwYWQtPnRyYWtfc3RlKS0+aGVpZ2h0IDw9IDQ4MCkgeworICAgICAgICByZXR1cm4gMjAwMDAwOworICAgICAgfSBlbHNlIGlmICgoKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIHFwYWQtPnRyYWtfc3RlKS0+aGVpZ2h0IDw9IDU3NikgeworICAgICAgICByZXR1cm4gMjUwMDAwOworICAgICAgfSBlbHNlIGlmICgoKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIHFwYWQtPnRyYWtfc3RlKS0+aGVpZ2h0IDw9IDcyMCkgeworICAgICAgICByZXR1cm4gMzUwMDAwOworICAgICAgfSBlbHNlIGlmICgoKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIHFwYWQtPnRyYWtfc3RlKS0+aGVpZ2h0IDw9IDEwODApIHsKKyAgICAgICAgcmV0dXJuIDcwMDAwMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAyODAwMDAwOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfYXBjczoKKyAgICAgIGlmICgoKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIHFwYWQtPnRyYWtfc3RlKS0+aGVpZ2h0IDw9IDQ4MCkgeworICAgICAgICByZXR1cm4gMTUwMDAwOworICAgICAgfSBlbHNlIGlmICgoKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIHFwYWQtPnRyYWtfc3RlKS0+aGVpZ2h0IDw9IDU3NikgeworICAgICAgICByZXR1cm4gMjAwMDAwOworICAgICAgfSBlbHNlIGlmICgoKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIHFwYWQtPnRyYWtfc3RlKS0+aGVpZ2h0IDw9IDcyMCkgeworICAgICAgICByZXR1cm4gMjUwMDAwOworICAgICAgfSBlbHNlIGlmICgoKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIHFwYWQtPnRyYWtfc3RlKS0+aGVpZ2h0IDw9IDEwODApIHsKKyAgICAgICAgcmV0dXJuIDUwMDAwMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAyODAwMDAwOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfYXBjbzoKKyAgICAgIGlmICgoKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIHFwYWQtPnRyYWtfc3RlKS0+aGVpZ2h0IDw9IDQ4MCkgeworICAgICAgICByZXR1cm4gODAwMDA7CisgICAgICB9IGVsc2UgaWYgKCgoU2FtcGxlVGFibGVFbnRyeU1QNFYgKikgcXBhZC0+dHJha19zdGUpLT5oZWlnaHQgPD0gNTc2KSB7CisgICAgICAgIHJldHVybiAxMDAwMDA7CisgICAgICB9IGVsc2UgaWYgKCgoU2FtcGxlVGFibGVFbnRyeU1QNFYgKikgcXBhZC0+dHJha19zdGUpLT5oZWlnaHQgPD0gNzIwKSB7CisgICAgICAgIHJldHVybiAxNTAwMDA7CisgICAgICB9IGVsc2UgaWYgKCgoU2FtcGxlVGFibGVFbnRyeU1QNFYgKikgcXBhZC0+dHJha19zdGUpLT5oZWlnaHQgPD0gMTA4MCkgeworICAgICAgICByZXR1cm4gMjUwMDAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDkwMDAwMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX3Nvd3Q6CisgICAgY2FzZSBGT1VSQ0NfdHdvczp7CisgICAgICBndWludDY0IGJsb2NrX2lkeDsKKyAgICAgIGd1aW50NjQgbmV4dF9zYW1wbGVfb2Zmc2V0OworCisgICAgICBibG9ja19pZHggPSBwcmVmaWxsX2dldF9ibG9ja19pbmRleCAocXRtdXgsIHFwYWQpOworICAgICAgbmV4dF9zYW1wbGVfb2Zmc2V0ID0KKyAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGJsb2NrX2lkeCArIDEsCisgICAgICAgICAgcXBhZC0+ZXhwZWN0ZWRfc2FtcGxlX2R1cmF0aW9uX2QgKgorICAgICAgICAgIGF0b21fdHJha19nZXRfdGltZXNjYWxlIChxcGFkLT50cmFrKSwKKyAgICAgICAgICBxcGFkLT5leHBlY3RlZF9zYW1wbGVfZHVyYXRpb25fbik7CisKKyAgICAgIHJldHVybiAobmV4dF9zYW1wbGVfb2Zmc2V0IC0gcXBhZC0+c2FtcGxlX29mZnNldCkgKiBxcGFkLT5zYW1wbGVfc2l6ZTsKKyAgICB9CisgICAgY2FzZSBGT1VSQ0NfYXA0aDoKKyAgICBjYXNlIEZPVVJDQ19hcDR4OgorICAgIGRlZmF1bHQ6CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChxdG11eCwgInVuc3VwcG9ydGVkIGNvZGVjIGZvciBwcmUtZmlsbGluZyIpOworICAgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgR3N0Q2xvY2tUaW1lCitwcmVmaWxsX2dldF9uZXh0X3RpbWVzdGFtcCAoR3N0UVRNdXggKiBxdG11eCwgR3N0UVRQYWQgKiBxcGFkKQoreworICBzd2l0Y2ggKHFwYWQtPmZvdXJjYykgeworICAgIGNhc2UgRk9VUkNDX2FwY2g6CisgICAgY2FzZSBGT1VSQ0NfYXBjbjoKKyAgICBjYXNlIEZPVVJDQ19hcGNzOgorICAgIGNhc2UgRk9VUkNDX2FwY286CisgICAgY2FzZSBGT1VSQ0NfYXA0aDoKKyAgICBjYXNlIEZPVVJDQ19hcDR4OgorICAgICAgcmV0dXJuIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAocXBhZC0+c2FtcGxlX29mZnNldCArIDEsCisgICAgICAgICAgcXBhZC0+ZXhwZWN0ZWRfc2FtcGxlX2R1cmF0aW9uX2QgKiBHU1RfU0VDT05ELAorICAgICAgICAgIHFwYWQtPmV4cGVjdGVkX3NhbXBsZV9kdXJhdGlvbl9uKTsKKyAgICBjYXNlIEZPVVJDQ19zb3d0OgorICAgIGNhc2UgRk9VUkNDX3R3b3M6eworICAgICAgZ3VpbnQ2NCBibG9ja19pZHg7CisgICAgICBndWludDY0IG5leHRfc2FtcGxlX29mZnNldDsKKworICAgICAgYmxvY2tfaWR4ID0gcHJlZmlsbF9nZXRfYmxvY2tfaW5kZXggKHF0bXV4LCBxcGFkKTsKKyAgICAgIG5leHRfc2FtcGxlX29mZnNldCA9CisgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChibG9ja19pZHggKyAxLAorICAgICAgICAgIHFwYWQtPmV4cGVjdGVkX3NhbXBsZV9kdXJhdGlvbl9kICoKKyAgICAgICAgICBhdG9tX3RyYWtfZ2V0X3RpbWVzY2FsZSAocXBhZC0+dHJhayksCisgICAgICAgICAgcXBhZC0+ZXhwZWN0ZWRfc2FtcGxlX2R1cmF0aW9uX24pOworCisgICAgICByZXR1cm4gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChuZXh0X3NhbXBsZV9vZmZzZXQsIEdTVF9TRUNPTkQsCisgICAgICAgICAgYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHFwYWQtPnRyYWspKTsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0bXV4LCAidW5zdXBwb3J0ZWQgY29kZWMgZm9yIHByZS1maWxsaW5nIik7CisgICAgICByZXR1cm4gLTE7CisgIH0KKworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorcHJlZmlsbF9yYXdfYXVkaW9fcHJlcGFyZV9idWZfZnVuYyAoR3N0UVRQYWQgKiBxdHBhZCwgR3N0QnVmZmVyICogYnVmLAorICAgIEdzdFFUTXV4ICogcXRtdXgpCit7CisgIGd1aW50NjQgYmxvY2tfaWR4OworICBndWludDY0IG5zYW1wbGVzOworICBHc3RDbG9ja1RpbWUgaW5wdXRfdGltZXN0YW1wOworICBndWludDY0IGlucHV0X3RpbWVzdGFtcF9kaXN0YW5jZTsKKworICBpZiAoYnVmKQorICAgIGdzdF9hZGFwdGVyX3B1c2ggKHF0cGFkLT5yYXdfYXVkaW9fYWRhcHRlciwgYnVmKTsKKworICBibG9ja19pZHggPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfY2VpbCAocXRwYWQtPnJhd19hdWRpb19hZGFwdGVyX29mZnNldCwKKyAgICAgIHF0cGFkLT5leHBlY3RlZF9zYW1wbGVfZHVyYXRpb25fbiwKKyAgICAgIHF0cGFkLT5leHBlY3RlZF9zYW1wbGVfZHVyYXRpb25fZCAqCisgICAgICBhdG9tX3RyYWtfZ2V0X3RpbWVzY2FsZSAocXRwYWQtPnRyYWspKTsKKyAgbnNhbXBsZXMgPQorICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChibG9ja19pZHggKyAxLAorICAgICAgcXRwYWQtPmV4cGVjdGVkX3NhbXBsZV9kdXJhdGlvbl9kICogYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHF0cGFkLT50cmFrKSwKKyAgICAgIHF0cGFkLT5leHBlY3RlZF9zYW1wbGVfZHVyYXRpb25fbikgLSBxdHBhZC0+cmF3X2F1ZGlvX2FkYXB0ZXJfb2Zmc2V0OworCisgIGlmICgoIUdTVF9DT0xMRUNUX1BBRFNfU1RBVEVfSVNfU0VUICgmcXRwYWQtPmNvbGxlY3QsCisgICAgICAgICAgICAgIEdTVF9DT0xMRUNUX1BBRFNfU1RBVEVfRU9TKQorICAgICAgICAgICYmIGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocXRwYWQtPnJhd19hdWRpb19hZGFwdGVyKSA8CisgICAgICAgICAgbnNhbXBsZXMgKiBxdHBhZC0+c2FtcGxlX3NpemUpCisgICAgICB8fCBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHF0cGFkLT5yYXdfYXVkaW9fYWRhcHRlcikgPT0gMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaW5wdXRfdGltZXN0YW1wID0KKyAgICAgIGdzdF9hZGFwdGVyX3ByZXZfcHRzIChxdHBhZC0+cmF3X2F1ZGlvX2FkYXB0ZXIsCisgICAgICAmaW5wdXRfdGltZXN0YW1wX2Rpc3RhbmNlKTsKKyAgaWYgKGlucHV0X3RpbWVzdGFtcCAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgIGlucHV0X3RpbWVzdGFtcCArPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGlucHV0X3RpbWVzdGFtcF9kaXN0YW5jZSwgR1NUX1NFQ09ORCwKKyAgICAgICAgcXRwYWQtPnNhbXBsZV9zaXplICogYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHF0cGFkLT50cmFrKSk7CisKKyAgYnVmID0KKyAgICAgIGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChxdHBhZC0+cmF3X2F1ZGlvX2FkYXB0ZXIsCisgICAgICAhR1NUX0NPTExFQ1RfUEFEU19TVEFURV9JU19TRVQgKCZxdHBhZC0+Y29sbGVjdCwKKyAgICAgICAgICBHU1RfQ09MTEVDVF9QQURTX1NUQVRFX0VPUykgPyBuc2FtcGxlcyAqCisgICAgICBxdHBhZC0+c2FtcGxlX3NpemUgOiBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHF0cGFkLT5yYXdfYXVkaW9fYWRhcHRlcikpOworICBHU1RfQlVGRkVSX1BUUyAoYnVmKSA9IGlucHV0X3RpbWVzdGFtcDsKKyAgR1NUX0JVRkZFUl9EVFMgKGJ1ZikgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBxdHBhZC0+cmF3X2F1ZGlvX2FkYXB0ZXJfb2Zmc2V0ICs9IG5zYW1wbGVzOworCisgIC8qIENoZWNrIGlmIHdlIGhhdmUgeWV0IGFub3RoZXIgYmxvY2sgb2YgcmF3IGF1ZGlvIGluIHRoZSBhZGFwdGVyICovCisgIG5zYW1wbGVzID0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoYmxvY2tfaWR4ICsgMiwKKyAgICAgIHF0cGFkLT5leHBlY3RlZF9zYW1wbGVfZHVyYXRpb25fZCAqIGF0b21fdHJha19nZXRfdGltZXNjYWxlIChxdHBhZC0+dHJhayksCisgICAgICBxdHBhZC0+ZXhwZWN0ZWRfc2FtcGxlX2R1cmF0aW9uX24pIC0gcXRwYWQtPnJhd19hdWRpb19hZGFwdGVyX29mZnNldDsKKyAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocXRwYWQtPnJhd19hdWRpb19hZGFwdGVyKSA+PQorICAgICAgbnNhbXBsZXMgKiBxdHBhZC0+c2FtcGxlX3NpemUpIHsKKyAgICBpbnB1dF90aW1lc3RhbXAgPQorICAgICAgICBnc3RfYWRhcHRlcl9wcmV2X3B0cyAocXRwYWQtPnJhd19hdWRpb19hZGFwdGVyLAorICAgICAgICAmaW5wdXRfdGltZXN0YW1wX2Rpc3RhbmNlKTsKKyAgICBpZiAoaW5wdXRfdGltZXN0YW1wICE9IEdTVF9DTE9DS19USU1FX05PTkUpCisgICAgICBpbnB1dF90aW1lc3RhbXAgKz0KKyAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGlucHV0X3RpbWVzdGFtcF9kaXN0YW5jZSwgR1NUX1NFQ09ORCwKKyAgICAgICAgICBxdHBhZC0+c2FtcGxlX3NpemUgKiBhdG9tX3RyYWtfZ2V0X3RpbWVzY2FsZSAocXRwYWQtPnRyYWspKTsKKyAgICBxdHBhZC0+cmF3X2F1ZGlvX2FkYXB0ZXJfcHRzID0gaW5wdXRfdGltZXN0YW1wOworICB9IGVsc2UgeworICAgIHF0cGFkLT5yYXdfYXVkaW9fYWRhcHRlcl9wdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICB9CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGdib29sZWFuCitwcmVmaWxsX3VwZGF0ZV9zYW1wbGVfc2l6ZSAoR3N0UVRNdXggKiBxdG11eCwgR3N0UVRQYWQgKiBxcGFkKQoreworICBzd2l0Y2ggKHFwYWQtPmZvdXJjYykgeworICAgIGNhc2UgRk9VUkNDX2FwY2g6CisgICAgY2FzZSBGT1VSQ0NfYXBjbjoKKyAgICBjYXNlIEZPVVJDQ19hcGNzOgorICAgIGNhc2UgRk9VUkNDX2FwY286CisgICAgY2FzZSBGT1VSQ0NfYXA0aDoKKyAgICBjYXNlIEZPVVJDQ19hcDR4OnsKKyAgICAgIGd1aW50IHNhbXBsZV9zaXplID0gcHJlZmlsbF9nZXRfc2FtcGxlX3NpemUgKHF0bXV4LCBxcGFkKTsKKyAgICAgIGF0b21fdHJha19zZXRfY29uc3RhbnRfc2l6ZV9zYW1wbGVzIChxcGFkLT50cmFrLCBzYW1wbGVfc2l6ZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgY2FzZSBGT1VSQ0Nfc293dDoKKyAgICBjYXNlIEZPVVJDQ190d29zOnsKKyAgICAgIEdTTGlzdCAqd2FsazsKKworICAgICAgLyogRmluZCB0aGUgKGZpcnN0KSB2aWRlbyB0cmFjayBhbmQgYXNzdW1lIHRoYXQgd2UgaGF2ZSB0byBvdXRwdXQKKyAgICAgICAqIGluIHRoYXQgc2l6ZSAqLworICAgICAgZm9yICh3YWxrID0gcXRtdXgtPmNvbGxlY3QtPmRhdGE7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgICAgIEdzdENvbGxlY3REYXRhICpjZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSB3YWxrLT5kYXRhOworICAgICAgICBHc3RRVFBhZCAqdG1wX3FwYWQgPSAoR3N0UVRQYWQgKikgY2RhdGE7CisKKyAgICAgICAgaWYgKHRtcF9xcGFkLT50cmFrLT5pc192aWRlbykgeworICAgICAgICAgIHFwYWQtPmV4cGVjdGVkX3NhbXBsZV9kdXJhdGlvbl9uID0KKyAgICAgICAgICAgICAgdG1wX3FwYWQtPmV4cGVjdGVkX3NhbXBsZV9kdXJhdGlvbl9uOworICAgICAgICAgIHFwYWQtPmV4cGVjdGVkX3NhbXBsZV9kdXJhdGlvbl9kID0KKyAgICAgICAgICAgICAgdG1wX3FwYWQtPmV4cGVjdGVkX3NhbXBsZV9kdXJhdGlvbl9kOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICh3YWxrID09IE5VTEwpIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChxcGFkLT5jb2xsZWN0LnBhZCwKKyAgICAgICAgICAgICJGb3VuZCBubyB2aWRlbyBmcmFtZXJhdGUsIHVzaW5nIDQwbXMgYXVkaW8gYnVmZmVycyIpOworICAgICAgICBxcGFkLT5leHBlY3RlZF9zYW1wbGVfZHVyYXRpb25fbiA9IDI1OworICAgICAgICBxcGFkLT5leHBlY3RlZF9zYW1wbGVfZHVyYXRpb25fZCA9IDE7CisgICAgICB9CisKKyAgICAgIC8qIFNldCBhIHByZXBhcmVfYnVmX2Z1bmMgdGhhdCBlbnN1cmVzIHRoaXMgKi8KKyAgICAgIHFwYWQtPnByZXBhcmVfYnVmX2Z1bmMgPSBwcmVmaWxsX3Jhd19hdWRpb19wcmVwYXJlX2J1Zl9mdW5jOworICAgICAgcXBhZC0+cmF3X2F1ZGlvX2FkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgICAgICBxcGFkLT5yYXdfYXVkaW9fYWRhcHRlcl9vZmZzZXQgPSAwOworICAgICAgcXBhZC0+cmF3X2F1ZGlvX2FkYXB0ZXJfcHRzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gVFJVRTsKKyAgfQorfQorCitzdGF0aWMgR3N0UVRQYWQgKgorZmluZF9iZXN0X3BhZF9wcmVmaWxsIChHc3RRVE11eCAqIHF0bXV4KQoreworICBHU0xpc3QgKndhbGs7CisgIEdzdFFUUGFkICpiZXN0X3BhZCA9IE5VTEw7CisKKyAgaWYgKHF0bXV4LT5jdXJyZW50X3BhZCAmJgorICAgICAgKHF0bXV4LT5pbnRlcmxlYXZlX2J5dGVzICE9IDAgfHwgcXRtdXgtPmludGVybGVhdmVfdGltZSAhPSAwKSAmJgorICAgICAgKHF0bXV4LT5pbnRlcmxlYXZlX2J5dGVzID09IDAKKyAgICAgICAgICB8fCBxdG11eC0+Y3VycmVudF9jaHVua19zaXplIDw9IHF0bXV4LT5pbnRlcmxlYXZlX2J5dGVzKQorICAgICAgJiYgKHF0bXV4LT5pbnRlcmxlYXZlX3RpbWUgPT0gMAorICAgICAgICAgIHx8IHF0bXV4LT5jdXJyZW50X2NodW5rX2R1cmF0aW9uIDw9IHF0bXV4LT5pbnRlcmxlYXZlX3RpbWUpCisgICAgICAmJiBxdG11eC0+bXV4X21vZGUgIT0gR1NUX1FUX01VWF9NT0RFX0ZSQUdNRU5URUQKKyAgICAgICYmIHF0bXV4LT5tdXhfbW9kZSAhPSBHU1RfUVRfTVVYX01PREVfRlJBR01FTlRFRF9TVFJFQU1BQkxFKSB7CisKKyAgICBpZiAocXRtdXgtPmN1cnJlbnRfcGFkLT50b3RhbF9kdXJhdGlvbiA8IHF0bXV4LT5yZXNlcnZlZF9tYXhfZHVyYXRpb24pIHsKKyAgICAgIGJlc3RfcGFkID0gcXRtdXgtPmN1cnJlbnRfcGFkOworICAgIH0KKyAgfSBlbHNlIGlmIChxdG11eC0+Y29sbGVjdC0+ZGF0YS0+bmV4dCkgeworICAgIGJlc3RfcGFkID0gcXRtdXgtPmN1cnJlbnRfcGFkID0gTlVMTDsKKyAgfQorCisgIGlmICghYmVzdF9wYWQpIHsKKyAgICBHc3RDbG9ja1RpbWUgYmVzdF90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICAgIGZvciAod2FsayA9IHF0bXV4LT5jb2xsZWN0LT5kYXRhOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgICAgR3N0Q29sbGVjdERhdGEgKmNkYXRhID0gKEdzdENvbGxlY3REYXRhICopIHdhbGstPmRhdGE7CisgICAgICBHc3RRVFBhZCAqcXRwYWQgPSAoR3N0UVRQYWQgKikgY2RhdGE7CisgICAgICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworCisgICAgICBpZiAocXRwYWQtPnRvdGFsX2R1cmF0aW9uID49IHF0bXV4LT5yZXNlcnZlZF9tYXhfZHVyYXRpb24pCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICB0aW1lc3RhbXAgPSBxdHBhZC0+dG90YWxfZHVyYXRpb247CisKKyAgICAgIGlmIChiZXN0X3BhZCA9PSBOVUxMIHx8CisgICAgICAgICAgIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChiZXN0X3RpbWUpIHx8IHRpbWVzdGFtcCA8IGJlc3RfdGltZSkgeworICAgICAgICBiZXN0X3BhZCA9IHF0cGFkOworICAgICAgICBiZXN0X3RpbWUgPSB0aW1lc3RhbXA7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGJlc3RfcGFkOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9xdF9tdXhfcHJlZmlsbF9zYW1wbGVzIChHc3RRVE11eCAqIHF0bXV4KQoreworICBHc3RRVFBhZCAqcXBhZDsKKyAgR1NMaXN0ICp3YWxrOworICBHc3RRVE11eENsYXNzICpxdG11eF9rbGFzcyA9IChHc3RRVE11eENsYXNzICopIChHX09CSkVDVF9HRVRfQ0xBU1MgKHF0bXV4KSk7CisKKyAgLyogVXBkYXRlIGV4cGVjdGVkIHNhbXBsZSBzaXplcy9kdXJhdGlvbnMgYXMgbmVlZGVkLCB0aGlzIGlzIGZvciByYXcKKyAgICogYXVkaW8gd2hlcmUgc2FtcGxlcyBhcmUgYWN0dWFsIGF1ZGlvIHNhbXBsZXMuICovCisgIGZvciAod2FsayA9IHF0bXV4LT5jb2xsZWN0LT5kYXRhOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdENvbGxlY3REYXRhICpjZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSB3YWxrLT5kYXRhOworICAgIEdzdFFUUGFkICpxcGFkID0gKEdzdFFUUGFkICopIGNkYXRhOworCisgICAgaWYgKCFwcmVmaWxsX3VwZGF0ZV9zYW1wbGVfc2l6ZSAocXRtdXgsIHFwYWQpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKHF0bXV4X2tsYXNzLT5mb3JtYXQgPT0gR1NUX1FUX01VWF9GT1JNQVRfUVQpIHsKKyAgICAvKiBGb3IgdGhlIGZpcnN0IHNhbXBsZSBjaGVjay91cGRhdGUgdGltZWNvZGUgYXMgbmVlZGVkLiBXZSBkbyB0aGF0IGJlZm9yZQorICAgICAqIGFsbCBhY3R1YWwgc2FtcGxlcyBhcyB0aGUgY29kZSBpbiBnc3RfcXRfbXV4X2FkZF9idWZmZXIoKSBkb2VzIGl0IHdpdGgKKyAgICAgKiBpbml0aWFsIGJ1ZmZlciBkaXJlY3RseSwgbm90IHdpdGggbGFzdF9idWYgKi8KKyAgICBmb3IgKHdhbGsgPSBxdG11eC0+Y29sbGVjdC0+ZGF0YTsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICAgIEdzdENvbGxlY3REYXRhICpjZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSB3YWxrLT5kYXRhOworICAgICAgR3N0UVRQYWQgKnFwYWQgPSAoR3N0UVRQYWQgKikgY2RhdGE7CisgICAgICBHc3RCdWZmZXIgKmJ1ZmZlciA9CisgICAgICAgICAgZ3N0X2NvbGxlY3RfcGFkc19wZWVrIChxdG11eC0+Y29sbGVjdCwgKEdzdENvbGxlY3REYXRhICopIHFwYWQpOworICAgICAgR3N0VmlkZW9UaW1lQ29kZU1ldGEgKnRjX21ldGE7CisKKyAgICAgIGlmIChidWZmZXIgJiYgKHRjX21ldGEgPSBnc3RfYnVmZmVyX2dldF92aWRlb190aW1lX2NvZGVfbWV0YSAoYnVmZmVyKSkpIHsKKyAgICAgICAgR3N0VmlkZW9UaW1lQ29kZSAqdGMgPSAmdGNfbWV0YS0+dGM7CisKKyAgICAgICAgcXBhZC0+dGNfdHJhayA9IGF0b21fdHJha19uZXcgKHF0bXV4LT5jb250ZXh0KTsKKyAgICAgICAgYXRvbV9tb292X2FkZF90cmFrIChxdG11eC0+bW9vdiwgcXBhZC0+dGNfdHJhayk7CisKKyAgICAgICAgcXBhZC0+dHJhay0+dHJlZiA9IGF0b21fdHJlZl9uZXcgKEZPVVJDQ190bWNkKTsKKyAgICAgICAgYXRvbV90cmVmX2FkZF9lbnRyeSAocXBhZC0+dHJhay0+dHJlZiwgcXBhZC0+dGNfdHJhay0+dGtoZC50cmFja19JRCk7CisKKyAgICAgICAgYXRvbV90cmFrX3NldF90aW1lY29kZV90eXBlIChxcGFkLT50Y190cmFrLCBxdG11eC0+Y29udGV4dCwKKyAgICAgICAgICAgIHFwYWQtPnRyYWstPm1kaWEubWRoZC50aW1lX2luZm8udGltZXNjYWxlLCB0Yyk7CisKKyAgICAgICAgYXRvbV90cmFrX2FkZF9zYW1wbGVzIChxcGFkLT50Y190cmFrLCAxLCAxLCA0LAorICAgICAgICAgICAgcXRtdXgtPm1kYXRfc2l6ZSwgRkFMU0UsIDApOworCisgICAgICAgIHFwYWQtPnRjX3BvcyA9IHF0bXV4LT5tZGF0X3NpemU7CisgICAgICAgIHFwYWQtPmZpcnN0X3RjID0gZ3N0X3ZpZGVvX3RpbWVfY29kZV9jb3B5ICh0Yyk7CisgICAgICAgIHFwYWQtPmZpcnN0X3B0cyA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworCisgICAgICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX29mZnNldCA9IC0xOworICAgICAgICBxdG11eC0+Y3VycmVudF9jaHVua19zaXplID0gMDsKKyAgICAgICAgcXRtdXgtPmN1cnJlbnRfY2h1bmtfZHVyYXRpb24gPSAwOworICAgICAgICBxdG11eC0+bWRhdF9zaXplICs9IDQ7CisgICAgICB9CisgICAgICBpZiAoYnVmZmVyKQorICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIH0KKyAgfQorCisgIHdoaWxlICgocXBhZCA9IGZpbmRfYmVzdF9wYWRfcHJlZmlsbCAocXRtdXgpKSkgeworICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIG5leHRfdGltZXN0YW1wLCBkdXJhdGlvbjsKKyAgICBndWludCBuc2FtcGxlcywgc2FtcGxlX3NpemU7CisgICAgZ3VpbnQ2NCBjaHVua19vZmZzZXQ7CisgICAgZ2ludDY0IHNjYWxlZF9kdXJhdGlvbjsKKyAgICBnaW50NjQgcHRzX29mZnNldCA9IDA7CisgICAgZ2Jvb2xlYW4gc3luYyA9IEZBTFNFOworICAgIFRyYWtCdWZmZXJFbnRyeUluZm8gc2FtcGxlX2VudHJ5OworCisgICAgc2FtcGxlX3NpemUgPSBwcmVmaWxsX2dldF9zYW1wbGVfc2l6ZSAocXRtdXgsIHFwYWQpOworCisgICAgaWYgKHNhbXBsZV9zaXplID09IC0xKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFxcGFkLT5zYW1wbGVzKQorICAgICAgcXBhZC0+c2FtcGxlcyA9IGdfYXJyYXlfbmV3IChGQUxTRSwgRkFMU0UsIHNpemVvZiAoVHJha0J1ZmZlckVudHJ5SW5mbykpOworCisgICAgdGltZXN0YW1wID0gcXBhZC0+dG90YWxfZHVyYXRpb247CisgICAgbmV4dF90aW1lc3RhbXAgPSBwcmVmaWxsX2dldF9uZXh0X3RpbWVzdGFtcCAocXRtdXgsIHFwYWQpOworICAgIGR1cmF0aW9uID0gbmV4dF90aW1lc3RhbXAgLSB0aW1lc3RhbXA7CisKKyAgICBpZiAocXBhZC0+Zmlyc3RfdHMgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICAgIHFwYWQtPmZpcnN0X3RzID0gdGltZXN0YW1wOworICAgIGlmIChxcGFkLT5maXJzdF9kdHMgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICAgIHFwYWQtPmZpcnN0X2R0cyA9IHRpbWVzdGFtcDsKKworICAgIGlmIChxdG11eC0+Y3VycmVudF9wYWQgIT0gcXBhZCB8fCBxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQgPT0gLTEpIHsKKyAgICAgIHF0bXV4LT5jdXJyZW50X3BhZCA9IHFwYWQ7CisgICAgICBpZiAocXRtdXgtPmN1cnJlbnRfY2h1bmtfb2Zmc2V0ID09IC0xKQorICAgICAgICBxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQgPSBxdG11eC0+bWRhdF9zaXplOworICAgICAgZWxzZQorICAgICAgICBxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQgKz0gcXRtdXgtPmN1cnJlbnRfY2h1bmtfc2l6ZTsKKyAgICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX3NpemUgPSAwOworICAgICAgcXRtdXgtPmN1cnJlbnRfY2h1bmtfZHVyYXRpb24gPSAwOworICAgIH0KKyAgICBpZiAocXBhZC0+c2FtcGxlX3NpemUpCisgICAgICBuc2FtcGxlcyA9IHNhbXBsZV9zaXplIC8gcXBhZC0+c2FtcGxlX3NpemU7CisgICAgZWxzZQorICAgICAgbnNhbXBsZXMgPSAxOworICAgIHFwYWQtPmxhc3RfZHRzID0gdGltZXN0YW1wOworICAgIHNjYWxlZF9kdXJhdGlvbiA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAodGltZXN0YW1wICsgZHVyYXRpb24sCisgICAgICAgIGF0b21fdHJha19nZXRfdGltZXNjYWxlIChxcGFkLT50cmFrKSwKKyAgICAgICAgR1NUX1NFQ09ORCkgLSBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKHRpbWVzdGFtcCwKKyAgICAgICAgYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHFwYWQtPnRyYWspLCBHU1RfU0VDT05EKTsKKworICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX3NpemUgKz0gc2FtcGxlX3NpemU7CisgICAgcXRtdXgtPmN1cnJlbnRfY2h1bmtfZHVyYXRpb24gKz0gZHVyYXRpb247CisgICAgcXBhZC0+dG90YWxfYnl0ZXMgKz0gc2FtcGxlX3NpemU7CisKKyAgICBjaHVua19vZmZzZXQgPSBxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQ7CisKKyAgICAvKiBJLWZyYW1lIG9ubHksIG5vIGZyYW1lIHJlb3JkZXJpbmcgKi8KKyAgICBzeW5jID0gRkFMU0U7CisgICAgcHRzX29mZnNldCA9IDA7CisKKyAgICBpZiAocXRtdXgtPmN1cnJlbnRfY2h1bmtfZHVyYXRpb24gPiBxdG11eC0+bG9uZ2VzdF9jaHVuaworICAgICAgICB8fCAhR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHF0bXV4LT5sb25nZXN0X2NodW5rKSkgeworICAgICAgcXRtdXgtPmxvbmdlc3RfY2h1bmsgPSBxdG11eC0+Y3VycmVudF9jaHVua19kdXJhdGlvbjsKKyAgICB9CisKKyAgICBzYW1wbGVfZW50cnkudHJhY2tfaWQgPSBxcGFkLT50cmFrLT50a2hkLnRyYWNrX0lEOworICAgIHNhbXBsZV9lbnRyeS5uc2FtcGxlcyA9IG5zYW1wbGVzOworICAgIHNhbXBsZV9lbnRyeS5kZWx0YSA9IHNjYWxlZF9kdXJhdGlvbiAvIG5zYW1wbGVzOworICAgIHNhbXBsZV9lbnRyeS5zaXplID0gc2FtcGxlX3NpemUgLyBuc2FtcGxlczsKKyAgICBzYW1wbGVfZW50cnkuY2h1bmtfb2Zmc2V0ID0gY2h1bmtfb2Zmc2V0OworICAgIHNhbXBsZV9lbnRyeS5wdHNfb2Zmc2V0ID0gcHRzX29mZnNldDsKKyAgICBzYW1wbGVfZW50cnkuc3luYyA9IHN5bmM7CisgICAgc2FtcGxlX2VudHJ5LmRvX3B0cyA9IFRSVUU7CisgICAgZ19hcnJheV9hcHBlbmRfdmFsIChxcGFkLT5zYW1wbGVzLCBzYW1wbGVfZW50cnkpOworICAgIGF0b21fdHJha19hZGRfc2FtcGxlcyAocXBhZC0+dHJhaywgbnNhbXBsZXMsIHNjYWxlZF9kdXJhdGlvbiAvIG5zYW1wbGVzLAorICAgICAgICBzYW1wbGVfc2l6ZSAvIG5zYW1wbGVzLCBjaHVua19vZmZzZXQsIHN5bmMsIHB0c19vZmZzZXQpOworCisgICAgcXBhZC0+dG90YWxfZHVyYXRpb24gPSBuZXh0X3RpbWVzdGFtcDsKKyAgICBxdG11eC0+bWRhdF9zaXplICs9IHNhbXBsZV9zaXplOworICAgIHFwYWQtPnNhbXBsZV9vZmZzZXQgKz0gbnNhbXBsZXM7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfc3RhcnRfZmlsZSAoR3N0UVRNdXggKiBxdG11eCkKK3sKKyAgR3N0UVRNdXhDbGFzcyAqcXRtdXhfa2xhc3MgPSAoR3N0UVRNdXhDbGFzcyAqKSAoR19PQkpFQ1RfR0VUX0NMQVNTIChxdG11eCkpOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RDYXBzICpjYXBzOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgIGdjaGFyIHNfaWRbMzJdOworICBHc3RDbG9ja1RpbWUgcmVzZXJ2ZWRfbWF4X2R1cmF0aW9uOworICBndWludCByZXNlcnZlZF9ieXRlc19wZXJfc2VjX3Blcl90cmFrOworICBHU0xpc3QgKndhbGs7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJzdGFydGluZyBmaWxlIik7CisKKyAgR1NUX09CSkVDVF9MT0NLIChxdG11eCk7CisgIHJlc2VydmVkX21heF9kdXJhdGlvbiA9IHF0bXV4LT5yZXNlcnZlZF9tYXhfZHVyYXRpb247CisgIHJlc2VydmVkX2J5dGVzX3Blcl9zZWNfcGVyX3RyYWsgPSBxdG11eC0+cmVzZXJ2ZWRfYnl0ZXNfcGVyX3NlY19wZXJfdHJhazsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXV4KTsKKworICAvKiBzdHJlYW0tc3RhcnQgKEZJWE1FOiBjcmVhdGUgaWQgYmFzZWQgb24gaW5wdXQgaWRzKSAqLworICBnX3NucHJpbnRmIChzX2lkLCBzaXplb2YgKHNfaWQpLCAicXRtdXgtJTA4eCIsIGdfcmFuZG9tX2ludCAoKSk7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAocXRtdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKHNfaWQpKTsKKworICBjYXBzID0gZ3N0X2NhcHNfY29weSAoZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHF0bXV4LT5zcmNwYWQpKTsKKyAgLyogcXRtdXggaGFzIHN0cnVjdHVyZSB3aXRoIGFuZCB3aXRob3V0IHZhcmlhbnQsIHJlbW92ZSBhbGwgYnV0IHRoZSBmaXJzdCAqLworICB3aGlsZSAoZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpID4gMSkKKyAgICBnc3RfY2Fwc19yZW1vdmVfc3RydWN0dXJlIChjYXBzLCAxKTsKKyAgZ3N0X3BhZF9zZXRfY2FwcyAocXRtdXgtPnNyY3BhZCwgY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAvKiBEZWZhdWx0IGlzICdub3JtYWwnIG1vZGUgKi8KKyAgcXRtdXgtPm11eF9tb2RlID0gR1NUX1FUX01VWF9NT0RFX01PT1ZfQVRfRU5EOworCisgIC8qIFJlcXVpcmUgYSBzZW5zaWJsZSBmcmFnbWVudCBkdXJhdGlvbiB3aGVuIG11eGluZworICAgKiB1c2luZyB0aGUgSVNNTCBtdXhlciAqLworICBpZiAocXRtdXhfa2xhc3MtPmZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9JU01MICYmCisgICAgICBxdG11eC0+ZnJhZ21lbnRfZHVyYXRpb24gPT0gMCkKKyAgICBnb3RvIGludmFsaWRfaXNtbDsKKworICBpZiAocXRtdXgtPmZyYWdtZW50X2R1cmF0aW9uID4gMCkgeworICAgIGlmIChxdG11eC0+c3RyZWFtYWJsZSkKKyAgICAgIHF0bXV4LT5tdXhfbW9kZSA9IEdTVF9RVF9NVVhfTU9ERV9GUkFHTUVOVEVEX1NUUkVBTUFCTEU7CisgICAgZWxzZQorICAgICAgcXRtdXgtPm11eF9tb2RlID0gR1NUX1FUX01VWF9NT0RFX0ZSQUdNRU5URUQ7CisgIH0gZWxzZSBpZiAocXRtdXgtPmZhc3Rfc3RhcnQpIHsKKyAgICBxdG11eC0+bXV4X21vZGUgPSBHU1RfUVRfTVVYX01PREVfRkFTVF9TVEFSVDsKKyAgfSBlbHNlIGlmIChyZXNlcnZlZF9tYXhfZHVyYXRpb24gIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgIGlmIChxdG11eC0+cmVzZXJ2ZWRfcHJlZmlsbCkKKyAgICAgIHF0bXV4LT5tdXhfbW9kZSA9IEdTVF9RVF9NVVhfTU9ERV9ST0JVU1RfUkVDT1JESU5HX1BSRUZJTEw7CisgICAgZWxzZQorICAgICAgcXRtdXgtPm11eF9tb2RlID0gR1NUX1FUX01VWF9NT0RFX1JPQlVTVF9SRUNPUkRJTkc7CisgIH0KKworICBzd2l0Y2ggKHF0bXV4LT5tdXhfbW9kZSkgeworICAgIGNhc2UgR1NUX1FUX01VWF9NT0RFX01PT1ZfQVRfRU5EOgorICAgIGNhc2UgR1NUX1FUX01VWF9NT0RFX1JPQlVTVF9SRUNPUkRJTkc6CisgICAgICAvKiBXZSBoYXZlIHRvIGJlIGFibGUgdG8gc2VlayB0byByZXdyaXRlIHRoZSBtZGF0IGhlYWRlciwgb3IgYW55CisgICAgICAgKiBtb292IGF0b20gd2Ugd3JpdGUgd2lsbCBub3QgYmUgdmlzaWJsZSBpbiB0aGUgZmlsZSwgYmVjYXVzZSBhbgorICAgICAgICogTURBVCB3aXRoIDAgYXMgdGhlIHNpemUgY292ZXJzIHRoZSByZXN0IG9mIHRoZSBmaWxlLiBBIGZpbGUKKyAgICAgICAqIHdpdGggbm8gbW9vdiBpcyBub3QgcGxheWFibGUsIHNvIGVycm9yIG91dCBub3cuICovCisgICAgICBpZiAoIWdzdF9xdF9tdXhfZG93bnN0cmVhbV9pc19zZWVrYWJsZSAocXRtdXgpKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdG11eCwgU1RSRUFNLCBNVVgsCisgICAgICAgICAgICAoIkRvd25zdHJlYW0gaXMgbm90IHNlZWthYmxlIC0gd2lsbCBub3QgYmUgYWJsZSB0byBjcmVhdGUgYSBwbGF5YWJsZSBmaWxlIiksCisgICAgICAgICAgICAoTlVMTCkpOworICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9RVF9NVVhfTU9ERV9GQVNUX1NUQVJUOgorICAgIGNhc2UgR1NUX1FUX01VWF9NT0RFX0ZSQUdNRU5URURfU1RSRUFNQUJMRToKKyAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgbmVlZCBzZWVrYWJpbGl0eSwgaWdub3JlICovCisgICAgY2FzZSBHU1RfUVRfTVVYX01PREVfRlJBR01FTlRFRDoKKyAgICAgIGlmICghZ3N0X3F0X211eF9kb3duc3RyZWFtX2lzX3NlZWthYmxlIChxdG11eCkpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgImRvd25zdHJlYW0gaXMgbm90IHNlZWthYmxlLCBidXQgIgorICAgICAgICAgICAgInN0cmVhbWFibGU9ZmFsc2UuIFdpbGwgaWdub3JlIHRoYXQgYW5kIGNyZWF0ZSBzdHJlYW1hYmxlIG91dHB1dCAiCisgICAgICAgICAgICAiaW5zdGVhZCIpOworICAgICAgICBxdG11eC0+c3RyZWFtYWJsZSA9IFRSVUU7CisgICAgICAgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKHF0bXV4KSwgInN0cmVhbWFibGUiKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1FUX01VWF9NT0RFX1JPQlVTVF9SRUNPUkRJTkdfUFJFRklMTDoKKyAgICAgIGlmICghZ3N0X3F0X211eF9kb3duc3RyZWFtX2lzX3NlZWthYmxlIChxdG11eCkpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwKKyAgICAgICAgICAgICJkb3duc3RyZWFtIGlzIG5vdCBzZWVrYWJsZSwgd2lsbCBub3QgYmUgYWJsZSAiCisgICAgICAgICAgICAidG8gdHJpbSBzYW1wbGVzIHRhYmxlIGF0IHRoZSBlbmQgaWYgbGVzcyB0aGFuIHJlc2VydmVkLWR1cmF0aW9uIGlzICIKKyAgICAgICAgICAgICJyZWNvcmRlZCIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBsZXQgZG93bnN0cmVhbSBrbm93IHdlIHRoaW5rIGluIEJZVEVTIGFuZCBleHBlY3QgdG8gZG8gc2Vla2luZyBsYXRlciBvbiAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAocXRtdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAocXRtdXgpOworCisgIGlmIChxdG11eC0+dGltZXNjYWxlID09IDApIHsKKyAgICBndWludDMyIHN1Z2dlc3RlZF90aW1lc2NhbGUgPSAwOworICAgIEdTTGlzdCAqd2FsazsKKworICAgIC8qIENhbGN1bGF0ZSBhIHJlYXNvbmFibGUgdGltZXNjYWxlIGZvciB0aGUgbW9vdjoKKyAgICAgKiBJZiB0aGVyZSBpcyB2aWRlbywgaXQgaXMgdGhlIGJpZ2dlc3QgdmlkZW8gdHJhY2sgdGltZXNjYWxlIG9yIGFuIGV2ZW4KKyAgICAgKiBtdWx0aXBsZSBvZiBpdCBpZiBpdCdzIHNtYWxsZXIgdGhhbiAxODAwLgorICAgICAqIE90aGVyd2lzZSBpdCBpcyAxODAwICovCisgICAgZm9yICh3YWxrID0gcXRtdXgtPnNpbmtwYWRzOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgICAgR3N0Q29sbGVjdERhdGEgKmNkYXRhID0gKEdzdENvbGxlY3REYXRhICopIHdhbGstPmRhdGE7CisgICAgICBHc3RRVFBhZCAqcXBhZCA9IChHc3RRVFBhZCAqKSBjZGF0YTsKKworICAgICAgaWYgKCFxcGFkLT50cmFrKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgLyogbm90IHZpZGVvICovCisgICAgICBpZiAoIXFwYWQtPnRyYWstPm1kaWEubWluZi52bWhkKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgc3VnZ2VzdGVkX3RpbWVzY2FsZSA9CisgICAgICAgICAgTUFYIChxcGFkLT50cmFrLT5tZGlhLm1kaGQudGltZV9pbmZvLnRpbWVzY2FsZSwgc3VnZ2VzdGVkX3RpbWVzY2FsZSk7CisgICAgfQorCisgICAgaWYgKHN1Z2dlc3RlZF90aW1lc2NhbGUgPT0gMCkKKyAgICAgIHN1Z2dlc3RlZF90aW1lc2NhbGUgPSAxODAwOworCisgICAgd2hpbGUgKHN1Z2dlc3RlZF90aW1lc2NhbGUgPCAxODAwKQorICAgICAgc3VnZ2VzdGVkX3RpbWVzY2FsZSAqPSAyOworCisgICAgcXRtdXgtPnRpbWVzY2FsZSA9IHN1Z2dlc3RlZF90aW1lc2NhbGU7CisgIH0KKworICAvKiBpbml0aWFsaXplIG91ciBtb292IHJlY292ZXJ5IGZpbGUgKi8KKyAgaWYgKHF0bXV4LT5tb292X3JlY292X2ZpbGVfcGF0aCkgeworICAgIGdzdF9xdF9tdXhfcHJlcGFyZV9tb292X3JlY292ZXJ5IChxdG11eCk7CisgIH0KKworICAvKiBNYWtlIHN1cmUgdGhlIGZpcnN0IHRpbWUgd2UgdXBkYXRlIHRoZSBtb292LCB3ZSdsbAorICAgKiBpbmNsdWRlIGFueSB0YWdzZXR0ZXIgdGFncyAqLworICBxdG11eC0+dGFnc19jaGFuZ2VkID0gVFJVRTsKKworICBHU1RfT0JKRUNUX1VOTE9DSyAocXRtdXgpOworCisgIC8qCisgICAqIHNlbmQgbWRhdCBoZWFkZXIgaWYgYWxyZWFkeSBuZWVkZWQsIGFuZCBtYXJrIHBvc2l0aW9uIGZvciBsYXRlciB1cGRhdGUuCisgICAqIFdlIGRvbid0IHNlbmQgZnR5cCBub3cgaWYgd2UgYXJlIG9uIGZhc3Qgc3RhcnQgbW9kZSwgYmVjYXVzZSB3ZSBjYW4KKyAgICogYmV0dGVyIGZpbmUgdHVuZSB1c2luZyB0aGUgaW5mb3JtYXRpb24gd2UgZ2F0aGVyIHRvIGNyZWF0ZSB0aGUgd2hvbGUgbW9vdgorICAgKiBhdG9tLgorICAgKi8KKyAgc3dpdGNoIChxdG11eC0+bXV4X21vZGUpIHsKKyAgICBjYXNlIEdTVF9RVF9NVVhfTU9ERV9NT09WX0FUX0VORDoKKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfcHJlcGFyZV9hbmRfc2VuZF9mdHlwIChxdG11eCk7CisgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICBicmVhazsKKworICAgICAgLyogU3RvcmUgdGhpcyBhcyB0aGUgbWRhdCBvZmZzZXQgZm9yIGxhdGVyIHVwZGF0aW5nCisgICAgICAgKiB3aGVuIHdlIHdyaXRlIHRoZSBtb292ICovCisgICAgICBxdG11eC0+bWRhdF9wb3MgPSBxdG11eC0+aGVhZGVyX3NpemU7CisgICAgICAvKiBleHRlbmRlZCBhdG9tIGluIGNhc2Ugd2UgZ28gb3ZlciA0R0Igd2hpbGUgd3JpdGluZyBhbmQgbmVlZAorICAgICAgICogdGhlIGZ1bGwgNjQtYml0IGF0b20gKi8KKyAgICAgIHJldCA9CisgICAgICAgICAgZ3N0X3F0X211eF9zZW5kX21kYXRfaGVhZGVyIChxdG11eCwgJnF0bXV4LT5oZWFkZXJfc2l6ZSwgMCwgVFJVRSwKKyAgICAgICAgICBGQUxTRSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9RVF9NVVhfTU9ERV9ST0JVU1RfUkVDT1JESU5HOgorICAgICAgcmV0ID0gZ3N0X3F0X211eF9wcmVwYXJlX2FuZF9zZW5kX2Z0eXAgKHF0bXV4KTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGJyZWFrOworCisgICAgICAvKiBQYWQgZnR5cCBvdXQgdG8gYW4gOC1ieXRlIGJvdW5kYXJ5IGJlZm9yZSBzdGFydGluZyB0aGUgbW9vdgorICAgICAgICogcGluZyBwb25nIHJlZ2lvbi4gSXQgc2hvdWxkIGJlIHdlbGwgbGVzcyB0aGFuIDEgZGlzayBzZWN0b3IsCisgICAgICAgKiB1bmxlc3MgdGhlcmUncyBhIGJhamlsbGlvbiBjb21wYXRpYmxlIHR5cGVzIGxpc3RlZCwKKyAgICAgICAqIGJ1dCBsZXQncyBiZSBzdXJlIHRoZSBmcmVlIGF0b20gZG9lc24ndCBjcm9zcyBhIHNlY3RvcgorICAgICAgICogYm91bmRhcnkgYW55d2F5ICovCisgICAgICBpZiAocXRtdXgtPmhlYWRlcl9zaXplICUgOCkgeworICAgICAgICAvKiBFeHRyYSA4IGJ5dGVzIGZvciB0aGUgcGFkZGluZyBmcmVlIGF0b20gaGVhZGVyICovCisgICAgICAgIGd1aW50IHBhZGRpbmcgPSAoZ3VpbnQpICgxNiAtIChxdG11eC0+aGVhZGVyX3NpemUgJSA4KSk7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwgIlJvdW5kaW5nIGZ0eXAgYnkgJXUgYnl0ZXMiLCBwYWRkaW5nKTsKKyAgICAgICAgcmV0ID0KKyAgICAgICAgICAgIGdzdF9xdF9tdXhfc2VuZF9mcmVlX2F0b20gKHF0bXV4LCAmcXRtdXgtPmhlYWRlcl9zaXplLCBwYWRkaW5nLAorICAgICAgICAgICAgRkFMU0UpOworICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICB9CisKKyAgICAgIC8qIFN0b3JlIHRoaXMgYXMgdGhlIG1vb3Ygb2Zmc2V0IGZvciBsYXRlciB1cGRhdGluZy4KKyAgICAgICAqIFdlIHJlY29yZCBtZGF0IHBvc2l0aW9uIGJlbG93ICovCisgICAgICBxdG11eC0+bW9vdl9wb3MgPSBxdG11eC0+aGVhZGVyX3NpemU7CisKKyAgICAgIC8qIFNldCB1cCB0aGUgaW5pdGlhbCAncGluZycgc3RhdGUgb2YgdGhlIHBpbmctcG9uZyBidWZmZXJzICovCisgICAgICBxdG11eC0+cmVzZXJ2ZWRfbW9vdl9maXJzdF9hY3RpdmUgPSBUUlVFOworCisgICAgICBnc3RfcXRfbXV4X2NvbmZpZ3VyZV9tb292IChxdG11eCk7CisgICAgICBnc3RfcXRfbXV4X3NldHVwX21ldGFkYXRhIChxdG11eCk7CisgICAgICAvKiBFbXB0eSBmcmVlIGF0b20gdG8gYmVnaW4sIHN0YXJ0aW5nIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAqLworICAgICAgcmV0ID0gZ3N0X3F0X211eF9zZW5kX2ZyZWVfYXRvbSAocXRtdXgsICZxdG11eC0+aGVhZGVyX3NpemUsIDgsIEZBTFNFKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIHJldHVybiByZXQ7CisgICAgICAvKiBNb292IGhlYWRlciwgbm90IHBhZGRlZCB5ZXQgKi8KKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9tb292IChxdG11eCwgJnF0bXV4LT5oZWFkZXJfc2l6ZSwgMCwgRkFMU0UsIEZBTFNFKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIHJldHVybiByZXQ7CisgICAgICAvKiBUaGUgbW9vdiB3ZSBqdXN0IHNlbnQgY29udGFpbnMgdGhlICdiYXNlJyBzaXplIG9mIHRoZSBtb292LCBiZWZvcmUKKyAgICAgICAqIHdlIHB1dCBpbiBhbnkgdGltZS1kZXBlbmRlbnQgcGVyLXRyYWsgZGF0YS4gVXNlIHRoYXQgdG8gbWFrZQorICAgICAgICogYSBnb29kIGVzdGltYXRlIG9mIGhvdyBtdWNoIGV4dHJhIHRvIHJlc2VydmUgKi8KKyAgICAgIC8qIENhbGN1bGF0ZSBob3cgbXVjaCBzcGFjZSB0byByZXNlcnZlIGZvciBvdXIgTU9PViBhdG9tLgorICAgICAgICogV2UgYWN0dWFsbHkgcmVzZXJ2ZSB0d2ljZSB0aGF0LCBmb3IgcGluZy1wb25nIGJ1ZmZlcnMgKi8KKyAgICAgIHF0bXV4LT5iYXNlX21vb3Zfc2l6ZSA9IHF0bXV4LT5sYXN0X21vb3Zfc2l6ZTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwgIkJhc2UgbW9vdiBzaXplIGlzICV1IGJlZm9yZSBhbnkgaW5kZXhlcyIsCisgICAgICAgICAgcXRtdXgtPmJhc2VfbW9vdl9zaXplKTsKKyAgICAgIHF0bXV4LT5yZXNlcnZlZF9tb292X3NpemUgPSBxdG11eC0+YmFzZV9tb292X3NpemUgKworICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAocmVzZXJ2ZWRfbWF4X2R1cmF0aW9uLAorICAgICAgICAgIHJlc2VydmVkX2J5dGVzX3Blcl9zZWNfcGVyX3RyYWsgKgorICAgICAgICAgIGF0b21fbW9vdl9nZXRfdHJha19jb3VudCAocXRtdXgtPm1vb3YpLCBHU1RfU0VDT05EKTsKKworICAgICAgLyogTmVlZCBzcGFjZSBmb3IgYXQgbGVhc3QgNCBhdG9tIGhlYWRlcnMuIE1vcmUgcmVhbGx5LCBidXQKKyAgICAgICAqIHRoaXMgYXMgYW4gYWJzb2x1dGUgbWluaW11bSAqLworICAgICAgaWYgKHF0bXV4LT5yZXNlcnZlZF9tb292X3NpemUgPCA0ICogOCkKKyAgICAgICAgZ290byByZXNlcnZlZF9tb292X3Rvb19zbWFsbDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJyZXNlcnZpbmcgaGVhZGVyIGFyZWEgb2Ygc2l6ZSAldSIsCisgICAgICAgICAgMiAqIHF0bXV4LT5yZXNlcnZlZF9tb292X3NpemUgKyAxNik7CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocXRtdXgpOworICAgICAgcXRtdXgtPnJlc2VydmVkX2R1cmF0aW9uX3JlbWFpbmluZyA9CisgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChxdG11eC0+cmVzZXJ2ZWRfbW9vdl9zaXplIC0KKyAgICAgICAgICBxdG11eC0+YmFzZV9tb292X3NpemUsIEdTVF9TRUNPTkQsCisgICAgICAgICAgcmVzZXJ2ZWRfYnl0ZXNfcGVyX3NlY19wZXJfdHJhayAqCisgICAgICAgICAgYXRvbV9tb292X2dldF90cmFrX2NvdW50IChxdG11eC0+bW9vdikpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXV4KTsKKworICAgICAgLyogTm93IHRoYXQgd2Uga25vdyBob3cgbXVjaCByZXNlcnZlZCBzcGFjZSBpcyB0YXJnZXR0ZWQsCisgICAgICAgKiBvdXRwdXQgYSBmcmVlIGF0b20gdG8gZmlsbCB0aGUgZXh0cmEgcmVzZXJ2ZWQgKi8KKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9mcmVlX2F0b20gKHF0bXV4LCAmcXRtdXgtPmhlYWRlcl9zaXplLAorICAgICAgICAgIHF0bXV4LT5yZXNlcnZlZF9tb292X3NpemUgLSBxdG11eC0+YmFzZV9tb292X3NpemUsIEZBTFNFKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgIC8qIFRoZW4gYSBmcmVlIGF0b20gY29udGFpbmluZyAncG9uZycgYnVmZmVyLCB3aXRoIGFuCisgICAgICAgKiBleHRyYSA4IGJ5dGVzIHRvIGFjY291bnQgZm9yIHRoZSBmcmVlIGF0b20gaGVhZGVyIGl0c2VsZiAqLworICAgICAgcmV0ID0gZ3N0X3F0X211eF9zZW5kX2ZyZWVfYXRvbSAocXRtdXgsICZxdG11eC0+aGVhZGVyX3NpemUsCisgICAgICAgICAgcXRtdXgtPnJlc2VydmVkX21vb3Zfc2l6ZSArIDgsIEZBTFNFKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgIC8qIGV4dHJhIGF0b21zIGdvIGFmdGVyIHRoZSBmcmVlL21vb3YocyksIGJlZm9yZSB0aGUgbWRhdCAqLworICAgICAgcmV0ID0KKyAgICAgICAgICBnc3RfcXRfbXV4X3NlbmRfZXh0cmFfYXRvbXMgKHF0bXV4LCBUUlVFLCAmcXRtdXgtPmhlYWRlcl9zaXplLCBGQUxTRSk7CisgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgICBxdG11eC0+bWRhdF9wb3MgPSBxdG11eC0+aGVhZGVyX3NpemU7CisgICAgICAvKiBleHRlbmRlZCBhdG9tIGluIGNhc2Ugd2UgZ28gb3ZlciA0R0Igd2hpbGUgd3JpdGluZyBhbmQgbmVlZAorICAgICAgICogdGhlIGZ1bGwgNjQtYml0IGF0b20gKi8KKyAgICAgIHJldCA9CisgICAgICAgICAgZ3N0X3F0X211eF9zZW5kX21kYXRfaGVhZGVyIChxdG11eCwgJnF0bXV4LT5oZWFkZXJfc2l6ZSwgMCwgVFJVRSwKKyAgICAgICAgICBGQUxTRSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9RVF9NVVhfTU9ERV9ST0JVU1RfUkVDT1JESU5HX1BSRUZJTEw6CisgICAgICByZXQgPSBnc3RfcXRfbXV4X3ByZXBhcmVfYW5kX3NlbmRfZnR5cCAocXRtdXgpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFN0b3JlIHRoaXMgYXMgdGhlIG1vb3Ygb2Zmc2V0IGZvciBsYXRlciB1cGRhdGluZy4KKyAgICAgICAqIFdlIHJlY29yZCBtZGF0IHBvc2l0aW9uIGJlbG93ICovCisgICAgICBxdG11eC0+bW9vdl9wb3MgPSBxdG11eC0+aGVhZGVyX3NpemU7CisKKyAgICAgIGlmICghZ3N0X3F0X211eF9wcmVmaWxsX3NhbXBsZXMgKHF0bXV4KSkgeworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtdXgsIFNUUkVBTSwgTVVYLAorICAgICAgICAgICAgKCJVbnN1cHBvcnRlZCBjb2RlY3Mgb3IgY29uZmlndXJhdGlvbiBmb3IgcHJlZmlsbCBtb2RlIiksIChOVUxMKSk7CisKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICAgICAgfQorCisgICAgICBnc3RfcXRfbXV4X3VwZGF0ZV9nbG9iYWxfc3RhdGlzdGljcyAocXRtdXgpOworICAgICAgZ3N0X3F0X211eF9jb25maWd1cmVfbW9vdiAocXRtdXgpOworICAgICAgZ3N0X3F0X211eF91cGRhdGVfZWRpdF9saXN0cyAocXRtdXgpOworICAgICAgZ3N0X3F0X211eF9zZXR1cF9tZXRhZGF0YSAocXRtdXgpOworCisgICAgICAvKiBNb292IGhlYWRlciB3aXRoIHByZS1maWxsZWQgc2FtcGxlcyAqLworICAgICAgcmV0ID0gZ3N0X3F0X211eF9zZW5kX21vb3YgKHF0bXV4LCAmcXRtdXgtPmhlYWRlcl9zaXplLCAwLCBGQUxTRSwgRkFMU0UpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgLyogbGFzdF9tb292X3NpemUgbm93IGNvbnRhaW5zIHRoZSBmdWxsIHNpemUgb2YgdGhlIG1vb3YsIG1vb3ZfcG9zIHRoZQorICAgICAgICogcG9zaXRpb24uIFRoaXMgYWxsb3dzIHVzIHRvIHJld3JpdGUgaXQgaW4gdGhlIHZlcnkgZW5kIGFzIG5lZWRlZCAqLworICAgICAgcXRtdXgtPnJlc2VydmVkX21vb3Zfc2l6ZSA9CisgICAgICAgICAgcXRtdXgtPmxhc3RfbW9vdl9zaXplICsgMTIgKiBnX3NsaXN0X2xlbmd0aCAocXRtdXgtPnNpbmtwYWRzKSArIDg7CisKKyAgICAgIC8qIFNlbmQgYW4gYWRkaXRpb25hbCBmcmVlIGF0b20gYXQgdGhlIGVuZCBzbyB3ZSBkZWZpbml0ZWx5IGhhdmUgc3BhY2UKKyAgICAgICAqIHRvIHJld3JpdGUgdGhlIG1vb3YgaGVhZGVyIGF0IHRoZSBlbmQgYW5kIHJlbW92ZSB0aGUgc2FtcGxlcyB0aGF0CisgICAgICAgKiB3ZXJlIG5vdCBhY3R1YWxseSB3cml0dGVuICovCisgICAgICByZXQgPQorICAgICAgICAgIGdzdF9xdF9tdXhfc2VuZF9mcmVlX2F0b20gKHF0bXV4LCAmcXRtdXgtPmhlYWRlcl9zaXplLAorICAgICAgICAgIDEyICogZ19zbGlzdF9sZW5ndGggKHF0bXV4LT5zaW5rcGFkcykgKyA4LCBGQUxTRSk7CisgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAvKiBleHRyYSBhdG9tcyBnbyBhZnRlciB0aGUgZnJlZS9tb292KHMpLCBiZWZvcmUgdGhlIG1kYXQgKi8KKyAgICAgIHJldCA9CisgICAgICAgICAgZ3N0X3F0X211eF9zZW5kX2V4dHJhX2F0b21zIChxdG11eCwgVFJVRSwgJnF0bXV4LT5oZWFkZXJfc2l6ZSwgRkFMU0UpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgcXRtdXgtPm1kYXRfcG9zID0gcXRtdXgtPmhlYWRlcl9zaXplOworCisgICAgICAvKiBBbmQgbm93IHNlbmQgdGhlIG1kYXQgaGVhZGVyICovCisgICAgICByZXQgPQorICAgICAgICAgIGdzdF9xdF9tdXhfc2VuZF9tZGF0X2hlYWRlciAocXRtdXgsICZxdG11eC0+aGVhZGVyX3NpemUsCisgICAgICAgICAgcXRtdXgtPm1kYXRfc2l6ZSwgVFJVRSwgRkFMU0UpOworCisgICAgICAvKiBjaHVua3MgcG9zaXRpb24gaXMgc2V0IHJlbGF0aXZlIHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZQorICAgICAgICogTURBVCBhdG9tIHBheWxvYWQuIFNldCB0aGUgb3ZlcmFsbCBvZmZzZXQgaW50byB0aGUgZmlsZSAqLworICAgICAgYXRvbV9tb292X2NodW5rc19zZXRfb2Zmc2V0IChxdG11eC0+bW9vdiwgcXRtdXgtPmhlYWRlcl9zaXplKTsKKworICAgICAgeworICAgICAgICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfQllURVMpOworICAgICAgICBzZWdtZW50LnN0YXJ0ID0gcXRtdXgtPm1vb3ZfcG9zOworICAgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHF0bXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKworICAgICAgICByZXQgPSBnc3RfcXRfbXV4X3NlbmRfbW9vdiAocXRtdXgsIE5VTEwsIDAsIEZBTFNFLCBGQUxTRSk7CisgICAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBzZWdtZW50LnN0YXJ0ID0gcXRtdXgtPmhlYWRlcl9zaXplOworICAgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHF0bXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKyAgICAgIH0KKworICAgICAgcXRtdXgtPmN1cnJlbnRfY2h1bmtfc2l6ZSA9IDA7CisgICAgICBxdG11eC0+Y3VycmVudF9jaHVua19kdXJhdGlvbiA9IDA7CisgICAgICBxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQgPSAtMTsKKyAgICAgIHF0bXV4LT5tZGF0X3NpemUgPSAwOworICAgICAgcXRtdXgtPmN1cnJlbnRfcGFkID0gTlVMTDsKKyAgICAgIHF0bXV4LT5sb25nZXN0X2NodW5rID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICAgICAgZm9yICh3YWxrID0gcXRtdXgtPmNvbGxlY3QtPmRhdGE7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgICAgIEdzdENvbGxlY3REYXRhICpjZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSB3YWxrLT5kYXRhOworICAgICAgICBHc3RRVFBhZCAqcXRwYWQgPSAoR3N0UVRQYWQgKikgY2RhdGE7CisKKyAgICAgICAgcXRwYWQtPnRvdGFsX2J5dGVzID0gMDsKKyAgICAgICAgcXRwYWQtPnRvdGFsX2R1cmF0aW9uID0gMDsKKyAgICAgICAgcXRwYWQtPmZpcnN0X2R0cyA9IHF0cGFkLT5maXJzdF90cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICAgIHF0cGFkLT5sYXN0X2R0cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICAgIHF0cGFkLT5zYW1wbGVfb2Zmc2V0ID0gMDsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUVRfTVVYX01PREVfRkFTVF9TVEFSVDoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocXRtdXgpOworICAgICAgcXRtdXgtPmZhc3Rfc3RhcnRfZmlsZSA9IGdfZm9wZW4gKHF0bXV4LT5mYXN0X3N0YXJ0X2ZpbGVfcGF0aCwgIndiKyIpOworICAgICAgaWYgKCFxdG11eC0+ZmFzdF9zdGFydF9maWxlKQorICAgICAgICBnb3RvIG9wZW5fZmFpbGVkOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXV4KTsKKyAgICAgIC8qIHNlbmQgYSBkdW1teSBidWZmZXIgZm9yIHByZXJvbGwgKi8KKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9idWZmZXIgKHF0bXV4LCBnc3RfYnVmZmVyX25ldyAoKSwgTlVMTCwgRkFMU0UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUVRfTVVYX01PREVfRlJBR01FTlRFRDoKKyAgICBjYXNlIEdTVF9RVF9NVVhfTU9ERV9GUkFHTUVOVEVEX1NUUkVBTUFCTEU6CisgICAgICByZXQgPSBnc3RfcXRfbXV4X3ByZXBhcmVfYW5kX3NlbmRfZnR5cCAocXRtdXgpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgYnJlYWs7CisgICAgICAvKiBzdG9yZSB0aGUgbW9vdiBwb3Mgc28gd2UgY2FuIHVwZGF0ZSB0aGUgZHVyYXRpb24gbGF0ZXIKKyAgICAgICAqIGluIG5vbi1zdHJlYW1hYmxlIG1vZGUgKi8KKyAgICAgIHF0bXV4LT5tb292X3BvcyA9IHF0bXV4LT5oZWFkZXJfc2l6ZTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJmcmFnbWVudCBkdXJhdGlvbiAlZCBtcywgd3JpdGluZyBoZWFkZXJzIiwKKyAgICAgICAgICBxdG11eC0+ZnJhZ21lbnRfZHVyYXRpb24pOworICAgICAgLyogYWxzbyB1c2VkIGFzIHNuYXBzaG90IG1hcmtlciB0byBpbmRpY2F0ZSBmcmFnbWVudGVkIGZpbGUgKi8KKyAgICAgIHF0bXV4LT5mcmFnbWVudF9zZXF1ZW5jZSA9IDE7CisgICAgICAvKiBwcmVwYXJlIG1vb3YgYW5kL29yIHRhZ3MgKi8KKyAgICAgIGdzdF9xdF9tdXhfY29uZmlndXJlX21vb3YgKHF0bXV4KTsKKyAgICAgIGdzdF9xdF9tdXhfc2V0dXBfbWV0YWRhdGEgKHF0bXV4KTsKKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9tb292IChxdG11eCwgJnF0bXV4LT5oZWFkZXJfc2l6ZSwgMCwgRkFMU0UsIEZBTFNFKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIHJldHVybiByZXQ7CisgICAgICAvKiBleHRyYSBhdG9tcyAqLworICAgICAgcmV0ID0KKyAgICAgICAgICBnc3RfcXRfbXV4X3NlbmRfZXh0cmFfYXRvbXMgKHF0bXV4LCBUUlVFLCAmcXRtdXgtPmhlYWRlcl9zaXplLCBGQUxTRSk7CisgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICBicmVhazsKKyAgICAgIC8qIHByZXBhcmUgaW5kZXggaWYgbm90IHN0cmVhbWFibGUgKi8KKyAgICAgIGlmIChxdG11eC0+bXV4X21vZGUgPT0gR1NUX1FUX01VWF9NT0RFX0ZSQUdNRU5URUQpCisgICAgICAgIHF0bXV4LT5tZnJhID0gYXRvbV9tZnJhX25ldyAocXRtdXgtPmNvbnRleHQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfaXNtbDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdG11eCwgU1RSRUFNLCBNVVgsCisgICAgICAgICgiQ2Fubm90IGNyZWF0ZSBhbiBJU01MIGZpbGUgd2l0aCAwIGZyYWdtZW50IGR1cmF0aW9uIiksIChOVUxMKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CityZXNlcnZlZF9tb292X3Rvb19zbWFsbDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdG11eCwgU1RSRUFNLCBNVVgsCisgICAgICAgICgiTm90IGVub3VnaCByZXNlcnZlZCBzcGFjZSBmb3IgY3JlYXRpbmcgaGVhZGVycyIpLCAoTlVMTCkpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorb3Blbl9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtdXgsIFJFU09VUkNFLCBPUEVOX1JFQURfV1JJVEUsCisgICAgICAgICgoIkNvdWxkIG5vdCBvcGVuIHRlbXBvcmFyeSBmaWxlIFwiJXNcIiIpLAorICAgICAgICAgICAgcXRtdXgtPmZhc3Rfc3RhcnRfZmlsZV9wYXRoKSwgR1NUX0VSUk9SX1NZU1RFTSk7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXV4KTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfc2VuZF9sYXN0X2J1ZmZlcnMgKEdzdFFUTXV4ICogcXRtdXgpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdTTGlzdCAqd2FsazsKKworICBmb3IgKHdhbGsgPSBxdG11eC0+Y29sbGVjdC0+ZGF0YTsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RDb2xsZWN0RGF0YSAqY2RhdGEgPSAoR3N0Q29sbGVjdERhdGEgKikgd2Fsay0+ZGF0YTsKKyAgICBHc3RRVFBhZCAqcXRwYWQgPSAoR3N0UVRQYWQgKikgY2RhdGE7CisKKyAgICAvKiBhdm9pZCBhZGRfYnVmZmVyIGNvbXBsYWluaW5nIGlmIG5vdCBuZWdvdGlhdGVkCisgICAgICogaW4gd2hpY2ggY2FzZSBubyBidWZmZXJzIGVpdGhlciwgc28gc2tpcHBpbmcgKi8KKyAgICBpZiAoIXF0cGFkLT5mb3VyY2MpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiUGFkICVzIGhhcyBuZXZlciBoYWQgYnVmZmVycyIsCisgICAgICAgICAgR1NUX1BBRF9OQU1FIChxdHBhZC0+Y29sbGVjdC5wYWQpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIHNlbmQgbGFzdCBidWZmZXI7IGFsc28gZmx1c2hlcyBwb3NzaWJseSBxdWV1ZWQgYnVmZmVycy90cyAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiU2VuZGluZyB0aGUgbGFzdCBidWZmZXIgZm9yIHBhZCAlcyIsCisgICAgICAgIEdTVF9QQURfTkFNRSAocXRwYWQtPmNvbGxlY3QucGFkKSk7CisgICAgcmV0ID0gZ3N0X3F0X211eF9hZGRfYnVmZmVyIChxdG11eCwgcXRwYWQsIE5VTEwpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRtdXgsICJGYWlsZWQgdG8gc2VuZCBsYXN0IGJ1ZmZlciBmb3IgJXMsICIKKyAgICAgICAgICAiZmxvdyByZXR1cm46ICVzIiwgR1NUX1BBRF9OQU1FIChxdHBhZC0+Y29sbGVjdC5wYWQpLAorICAgICAgICAgIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF91cGRhdGVfZ2xvYmFsX3N0YXRpc3RpY3MgKEdzdFFUTXV4ICogcXRtdXgpCit7CisgIEdTTGlzdCAqd2FsazsKKworICAvKiBmb3Igc2V0dGluZyBzb21lIHN1YnRpdGxlcyBmaWVsZHMgKi8KKyAgZ3VpbnQgbWF4X3dpZHRoID0gMDsKKyAgZ3VpbnQgbWF4X2hlaWdodCA9IDA7CisKKyAgcXRtdXgtPmZpcnN0X3RzID0gcXRtdXgtPmxhc3RfZHRzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBmb3IgKHdhbGsgPSBxdG11eC0+Y29sbGVjdC0+ZGF0YTsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RDb2xsZWN0RGF0YSAqY2RhdGEgPSAoR3N0Q29sbGVjdERhdGEgKikgd2Fsay0+ZGF0YTsKKyAgICBHc3RRVFBhZCAqcXRwYWQgPSAoR3N0UVRQYWQgKikgY2RhdGE7CisKKyAgICBpZiAoIXF0cGFkLT5mb3VyY2MpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiUGFkICVzIGhhcyBuZXZlciBoYWQgYnVmZmVycyIsCisgICAgICAgICAgR1NUX1BBRF9OQU1FIChxdHBhZC0+Y29sbGVjdC5wYWQpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIGhhdmluZyBmbHVzaGVkIGFib3ZlLCBjYW4gY2hlY2sgZm9yIGJ1ZmZlcnMgbm93ICovCisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChxdHBhZC0+Zmlyc3RfdHMpKSB7CisgICAgICBHc3RDbG9ja1RpbWUgZmlyc3RfcHRzX2luID0gcXRwYWQtPmZpcnN0X3RzOworICAgICAgLyogaXQgc2hvdWxkIGJlLCBzaW5jZSB3ZSBnb3QgZmlyc3RfdHMgYnkgYWRkaW5nIGFkanVzdG1lbnQKKyAgICAgICAqIHRvIGEgcG9zaXRpdmUgaW5jb21pbmcgUFRTICovCisgICAgICBpZiAocXRwYWQtPmR0c19hZGp1c3RtZW50IDw9IGZpcnN0X3B0c19pbikKKyAgICAgICAgZmlyc3RfcHRzX2luIC09IHF0cGFkLT5kdHNfYWRqdXN0bWVudDsKKyAgICAgIC8qIGRldGVybWluZSBtYXggc3RyZWFtIGR1cmF0aW9uICovCisgICAgICBpZiAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChxdG11eC0+bGFzdF9kdHMpCisgICAgICAgICAgfHwgcXRwYWQtPmxhc3RfZHRzID4gcXRtdXgtPmxhc3RfZHRzKSB7CisgICAgICAgIHF0bXV4LT5sYXN0X2R0cyA9IHF0cGFkLT5sYXN0X2R0czsKKyAgICAgIH0KKyAgICAgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHF0bXV4LT5maXJzdF90cykKKyAgICAgICAgICB8fCBmaXJzdF9wdHNfaW4gPCBxdG11eC0+Zmlyc3RfdHMpIHsKKyAgICAgICAgLyogd2UgbmVlZCB0aGUgb3JpZ2luYWwgaW5jb21pbmcgUFRTIGhlcmUsIGFzIHRoaXMgZmlyc3RfdHMKKyAgICAgICAgICogaXMgdXNlZCBpbiB1cGRhdGVfZWRpdF9saXN0cyB0byBjb25zdHJ1Y3QgdGhlIGVkaXQgbGlzdCB0aGF0IGFycmFuZ2UKKyAgICAgICAgICogZm9yIHN5bmMnZWQgc3RyZWFtcy4gIFRoZSBmaXJzdF90cyBpcyBtb3N0IGxpa2VseSBvYnRhaW5lZCBmcm9tCisgICAgICAgICAqIHNvbWUgKGF1ZGlvKSBzdHJlYW0gd2l0aCAwIGR0c19hZGp1c3RtZW50IGFuZCBpbml0aWFsIDAgUFRTLAorICAgICAgICAgKiBzbyBpdCBtYWtlcyBubyBkaWZmZXJlbmNlLCB0aG91Z2ggaXQgbWF0dGVycyBpbiBvdGhlciBjYXNlcyAqLworICAgICAgICBxdG11eC0+Zmlyc3RfdHMgPSBmaXJzdF9wdHNfaW47CisgICAgICB9CisgICAgfQorCisgICAgLyogc3VidGl0bGVzIG5lZWQgdG8ga25vdyB0aGUgdmlkZW8gd2lkdGgvaGVpZ2h0LAorICAgICAqIGl0IGlzIHN0b3JlZCBzaGlmdGVkIDE2IGJpdHMgdG8gdGhlIGxlZnQgYWNjb3JkaW5nIHRvIHRoZQorICAgICAqIHNwZWMgKi8KKyAgICBtYXhfd2lkdGggPSBNQVggKG1heF93aWR0aCwgKHF0cGFkLT50cmFrLT50a2hkLndpZHRoID4+IDE2KSk7CisgICAgbWF4X2hlaWdodCA9IE1BWCAobWF4X2hlaWdodCwgKHF0cGFkLT50cmFrLT50a2hkLmhlaWdodCA+PiAxNikpOworCisgICAgLyogdXBkYXRlIGF2ZXJhZ2UgYml0cmF0ZSBvZiBzdHJlYW1zIGlmIG5lZWRlZCAqLworICAgIHsKKyAgICAgIGd1aW50MzIgYXZnYml0cmF0ZSA9IDA7CisgICAgICBndWludDMyIG1heGJpdHJhdGUgPSBxdHBhZC0+bWF4X2JpdHJhdGU7CisKKyAgICAgIGlmIChxdHBhZC0+YXZnX2JpdHJhdGUpCisgICAgICAgIGF2Z2JpdHJhdGUgPSBxdHBhZC0+YXZnX2JpdHJhdGU7CisgICAgICBlbHNlIGlmIChxdHBhZC0+dG90YWxfZHVyYXRpb24gPiAwKQorICAgICAgICBhdmdiaXRyYXRlID0gKGd1aW50MzIpIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAocXRwYWQtPnRvdGFsX2J5dGVzLAorICAgICAgICAgICAgOCAqIEdTVF9TRUNPTkQsIHF0cGFkLT50b3RhbF9kdXJhdGlvbik7CisKKyAgICAgIGF0b21fdHJha191cGRhdGVfYml0cmF0ZXMgKHF0cGFkLT50cmFrLCBhdmdiaXRyYXRlLCBtYXhiaXRyYXRlKTsKKyAgICB9CisgIH0KKworICAvKiBuZWVkIHRvIHVwZGF0ZSB2YWx1ZXMgb24gc3VidGl0bGUgdHJha3Mgbm93IHRoYXQgd2Uga25vdyB0aGUKKyAgICogbWF4IHdpZHRoIGFuZCBoZWlnaHQgKi8KKyAgZm9yICh3YWxrID0gcXRtdXgtPmNvbGxlY3QtPmRhdGE7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0Q29sbGVjdERhdGEgKmNkYXRhID0gKEdzdENvbGxlY3REYXRhICopIHdhbGstPmRhdGE7CisgICAgR3N0UVRQYWQgKnF0cGFkID0gKEdzdFFUUGFkICopIGNkYXRhOworCisgICAgaWYgKCFxdHBhZC0+Zm91cmNjKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIlBhZCAlcyBoYXMgbmV2ZXIgaGFkIGJ1ZmZlcnMiLAorICAgICAgICAgIEdTVF9QQURfTkFNRSAocXRwYWQtPmNvbGxlY3QucGFkKSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAocXRwYWQtPmZvdXJjYyA9PSBGT1VSQ0NfdHgzZykgeworICAgICAgYXRvbV90cmFrX3R4M2dfdXBkYXRlX2RpbWVuc2lvbiAocXRwYWQtPnRyYWssIG1heF93aWR0aCwgbWF4X2hlaWdodCk7CisgICAgfQorICB9Cit9CisKKy8qIENhbGxlZCBhZnRlciBnc3RfcXRfbXV4X3VwZGF0ZV9nbG9iYWxfc3RhdGlzdGljcygpIHVwZGF0ZXMgdGhlCisgKiBmaXJzdF90cyB0cmFja2luZywgdG8gY3JlYXRlL3NldCBlZGl0IGxpc3RzIGZvciBkZWxheWVkIHN0cmVhbXMgKi8KK3N0YXRpYyB2b2lkCitnc3RfcXRfbXV4X3VwZGF0ZV9lZGl0X2xpc3RzIChHc3RRVE11eCAqIHF0bXV4KQoreworICBHU0xpc3QgKndhbGs7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJNZWRpYSBmaXJzdCB0cyBzZWxlY3RlZDogJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAocXRtdXgtPmZpcnN0X3RzKSk7CisgIC8qIGFkZC91cGRhdGUgRURUU3MgZm9yIGxhdGUgc3RyZWFtcy4gY29uZmlndXJlX21vb3Ygd2lsbCBoYXZlCisgICAqIHNldCB0aGUgdHJhayBkdXJhdGlvbnMgYWJvdmUgYnkgc3VtbWluZyB0aGUgc2FtcGxlIHRhYmxlcywKKyAgICogaGVyZSB3ZSBleHRlbmQgdGhhdCBpZiBuZWVkaW5nIHRvIGluc2VydCBhbiBlbXB0eSBzZWdtZW50ICovCisgIGZvciAod2FsayA9IHF0bXV4LT5jb2xsZWN0LT5kYXRhOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdENvbGxlY3REYXRhICpjZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSB3YWxrLT5kYXRhOworICAgIEdzdFFUUGFkICpxdHBhZCA9IChHc3RRVFBhZCAqKSBjZGF0YTsKKworICAgIGF0b21fdHJha19lZHRzX2NsZWFyIChxdHBhZC0+dHJhayk7CisKKyAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHF0cGFkLT5maXJzdF90cykpIHsKKyAgICAgIGd1aW50MzIgbGF0ZW5lc3MgPSAwOworICAgICAgZ3VpbnQzMiBkdXJhdGlvbiA9IHF0cGFkLT50cmFrLT50a2hkLmR1cmF0aW9uOworICAgICAgZ2Jvb2xlYW4gaGFzX2dhcDsKKworICAgICAgaGFzX2dhcCA9IChxdHBhZC0+Zmlyc3RfdHMgPiAocXRtdXgtPmZpcnN0X3RzICsgcXRwYWQtPmR0c19hZGp1c3RtZW50KSk7CisKKyAgICAgIGlmIChoYXNfZ2FwKSB7CisgICAgICAgIEdzdENsb2NrVGltZSBkaWZmOworCisgICAgICAgIGRpZmYgPSBxdHBhZC0+Zmlyc3RfdHMgLSAocXRtdXgtPmZpcnN0X3RzICsgcXRwYWQtPmR0c19hZGp1c3RtZW50KTsKKyAgICAgICAgbGF0ZW5lc3MgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKGRpZmYsCisgICAgICAgICAgICBxdG11eC0+dGltZXNjYWxlLCBHU1RfU0VDT05EKTsKKworICAgICAgICBpZiAobGF0ZW5lc3MgPiAwKSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsCisgICAgICAgICAgICAgICJQYWQgJXMgaXMgYSBsYXRlIHN0cmVhbSBieSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICAgIEdTVF9QQURfTkFNRSAocXRwYWQtPmNvbGxlY3QucGFkKSwgR1NUX1RJTUVfQVJHUyAoZGlmZikpOworCisgICAgICAgICAgYXRvbV90cmFrX3NldF9lbHN0X2VudHJ5IChxdHBhZC0+dHJhaywgMCwgbGF0ZW5lc3MsIChndWludDMyKSAtIDEsCisgICAgICAgICAgICAgIChndWludDMyKSAoMSAqIDY1NTM2LjApKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBBbHdheXMgd3JpdGUgYW4gZWRpdCBsaXN0IGZvciB0aGUgd2hvbGUgdHJhY2suIEluIGdlbmVyYWwgdGhpcyBpcyBub3QKKyAgICAgICAqIG5lY2Vzc2FyeSBleGNlcHQgZm9yIHRoZSBjYXNlIG9mIGhhdmluZyBhIGdhcCBvciBEVFMgYWRqdXN0bWVudCBidXQKKyAgICAgICAqIGl0IGFsbG93cyB0byBnaXZlIHRoZSB3aG9sZSB0cmFjaydzIGR1cmF0aW9uIGluIHRoZSB1c3VhbGx5IG1vcmUKKyAgICAgICAqIGFjY3VyYXRlIG1lZGlhIHRpbWVzY2FsZQorICAgICAgICovCisgICAgICB7CisgICAgICAgIEdzdENsb2NrVGltZSBjdHRzID0gMDsKKyAgICAgICAgZ3VpbnQzMiBtZWRpYV9zdGFydDsKKworICAgICAgICBpZiAocXRwYWQtPmZpcnN0X3RzID4gcXRwYWQtPmZpcnN0X2R0cykKKyAgICAgICAgICBjdHRzID0gcXRwYWQtPmZpcnN0X3RzIC0gcXRwYWQtPmZpcnN0X2R0czsKKworICAgICAgICBtZWRpYV9zdGFydCA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAoY3R0cywKKyAgICAgICAgICAgIGF0b21fdHJha19nZXRfdGltZXNjYWxlIChxdHBhZC0+dHJhayksIEdTVF9TRUNPTkQpOworCisgICAgICAgIC8qIGF0b21fdHJha19zZXRfZWxzdF9lbnRyeSgpIGhhcyBhIHF1aXJrIC0gaWYgdGhlIGVkaXQgbGlzdAorICAgICAgICAgKiBpcyBlbXB0eSBiZWNhdXNlIHRoZXJlJ3Mgbm8gZ2FwIGFkZGVkIGFib3ZlLCB0aGlzIGNhbGwKKyAgICAgICAgICogd2lsbCBub3QgcmVwbGFjZSBpbmRleCAxLCBpdCB3aWxsIGNyZWF0ZSB0aGUgZW50cnkgYXQgaW5kZXggMC4KKyAgICAgICAgICogTHVja2lseSwgdGhhdCdzIGV4YWN0bHkgd2hhdCB3ZSB3YW50IGhlcmUgKi8KKyAgICAgICAgYXRvbV90cmFrX3NldF9lbHN0X2VudHJ5IChxdHBhZC0+dHJhaywgMSwgZHVyYXRpb24sIG1lZGlhX3N0YXJ0LAorICAgICAgICAgICAgKGd1aW50MzIpICgxICogNjU1MzYuMCkpOworICAgICAgfQorCisgICAgICAvKiBuZWVkIHRvIGFkZCB0aGUgZW1wdHkgdGltZSB0byB0aGUgdHJhayBkdXJhdGlvbiAqLworICAgICAgZHVyYXRpb24gKz0gbGF0ZW5lc3M7CisgICAgICBxdHBhZC0+dHJhay0+dGtoZC5kdXJhdGlvbiA9IGR1cmF0aW9uOworICAgICAgaWYgKHF0cGFkLT50Y190cmFrKSB7CisgICAgICAgIHF0cGFkLT50Y190cmFrLT50a2hkLmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgIHF0cGFkLT50Y190cmFrLT5tZGlhLm1kaGQudGltZV9pbmZvLmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgICB9CisKKyAgICAgIC8qIEFuZCBwb3NzaWJseSBncm93IHRoZSBtb292IGR1cmF0aW9uICovCisgICAgICBpZiAoZHVyYXRpb24gPiBxdG11eC0+bW9vdi0+bXZoZC50aW1lX2luZm8uZHVyYXRpb24pIHsKKyAgICAgICAgcXRtdXgtPm1vb3YtPm12aGQudGltZV9pbmZvLmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgIHF0bXV4LT5tb292LT5tdmV4Lm1laGQuZnJhZ21lbnRfZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfdXBkYXRlX3RpbWVjb2RlIChHc3RRVE11eCAqIHF0bXV4LCBHc3RRVFBhZCAqIHF0cGFkKQoreworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ2NCBvZmZzZXQgPSBxdHBhZC0+dGNfcG9zOworICBHc3RRVE11eENsYXNzICpxdG11eF9rbGFzcyA9IChHc3RRVE11eENsYXNzICopIChHX09CSkVDVF9HRVRfQ0xBU1MgKHF0bXV4KSk7CisKKyAgaWYgKHF0bXV4X2tsYXNzLT5mb3JtYXQgIT0gR1NUX1FUX01VWF9GT1JNQVRfUVQpCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIGdfYXNzZXJ0IChxdHBhZC0+dGNfcG9zICE9IC0xKTsKKworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgIHNlZ21lbnQuc3RhcnQgPSBvZmZzZXQ7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAocXRtdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoNCk7CisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworCisgIEdTVF9XUklURV9VSU5UMzJfQkUgKG1hcC5kYXRhLAorICAgICAgZ3N0X3ZpZGVvX3RpbWVfY29kZV9mcmFtZXNfc2luY2VfZGFpbHlfamFtIChxdHBhZC0+Zmlyc3RfdGMpKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICAvKiBSZXNldCB0aGlzIHZhbHVlLCBzbyB0aGUgdGltZWNvZGUgd29uJ3QgYmUgcmUtcmV3cml0dGVuICovCisgIHF0cGFkLT50Y19wb3MgPSAtMTsKKworICByZXR1cm4gZ3N0X3F0X211eF9zZW5kX2J1ZmZlciAocXRtdXgsIGJ1ZiwgJm9mZnNldCwgRkFMU0UpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3F0X211eF9zdG9wX2ZpbGUgKEdzdFFUTXV4ICogcXRtdXgpCit7CisgIGdib29sZWFuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludDY0IG9mZnNldCA9IDAsIHNpemUgPSAwOworICBnYm9vbGVhbiBsYXJnZV9maWxlOworICBHU0xpc3QgKndhbGs7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJVcGRhdGluZyByZW1haW5pbmcgdmFsdWVzIGFuZCBzZW5kaW5nIGxhc3QgZGF0YSIpOworCisgIC8qIHB1c2hpbmcgbGFzdCBidWZmZXJzIGZvciBlYWNoIHBhZCAqLworICBpZiAoKHJldCA9IGdzdF9xdF9tdXhfc2VuZF9sYXN0X2J1ZmZlcnMgKHF0bXV4KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJldDsKKworICBpZiAocXRtdXgtPm11eF9tb2RlID09IEdTVF9RVF9NVVhfTU9ERV9GUkFHTUVOVEVEX1NUUkVBTUFCTEUpIHsKKyAgICAvKiBTdHJlYW1hYmxlIG1vZGU7IG5vIG5lZWQgdG8gd3JpdGUgZHVyYXRpb24gb3IgTUZSQSAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAic3RyZWFtYWJsZSBmaWxlOyBub3RoaW5nIHRvIHN0b3AiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KKworICBnc3RfcXRfbXV4X3VwZGF0ZV9nbG9iYWxfc3RhdGlzdGljcyAocXRtdXgpOworICBmb3IgKHdhbGsgPSBxdG11eC0+Y29sbGVjdC0+ZGF0YTsgd2Fsazsgd2FsayA9IHdhbGstPm5leHQpIHsKKyAgICBHc3RRVFBhZCAqcXRwYWQgPSAoR3N0UVRQYWQgKikgd2Fsay0+ZGF0YTsKKworICAgIGlmIChxdHBhZC0+dGNfcG9zICE9IC0xKSB7CisgICAgICAvKiBGaWxlIGlzIGJlaW5nIHN0b3BwZWQgYW5kIHRpbWVjb2RlIGhhc24ndCBiZWVuIHVwZGF0ZWQuIFVwZGF0ZSBpdCBub3cKKyAgICAgICAqIHdpdGggd2hhdGV2ZXIgd2UgaGF2ZSAqLworICAgICAgcmV0ID0gZ3N0X3F0X211eF91cGRhdGVfdGltZWNvZGUgKHF0bXV4LCBxdHBhZCk7CisgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgfQorCisgIHN3aXRjaCAocXRtdXgtPm11eF9tb2RlKSB7CisgICAgY2FzZSBHU1RfUVRfTVVYX01PREVfRlJBR01FTlRFRDp7CisgICAgICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgICAgICBndWludDggKmRhdGEgPSBOVUxMOworICAgICAgR3N0QnVmZmVyICpidWY7CisKKyAgICAgIHNpemUgPSBvZmZzZXQgPSAwOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJhZGRpbmcgbWZyYSIpOworICAgICAgaWYgKCFhdG9tX21mcmFfY29weV9kYXRhIChxdG11eC0+bWZyYSwgJmRhdGEsICZzaXplLCAmb2Zmc2V0KSkKKyAgICAgICAgZ290byBzZXJpYWxpemVfZXJyb3I7CisgICAgICBidWYgPSBfZ3N0X2J1ZmZlcl9uZXdfdGFrZV9kYXRhIChkYXRhLCBvZmZzZXQpOworICAgICAgcmV0ID0gZ3N0X3F0X211eF9zZW5kX2J1ZmZlciAocXRtdXgsIGJ1ZiwgTlVMTCwgRkFMU0UpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgLyogb25seSBtdmV4IGR1cmF0aW9uIGlzIHVwZGF0ZWQsCisgICAgICAgKiBtdmhkIHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggZW1wdHkgbW9vdgorICAgICAgICogKGJ1dCBUT0RPIG1heWJlIHNvbWUgY2xpZW50cyBkbyBub3QgaGFuZGxlIHRoYXQgd2VsbCA/KSAqLworICAgICAgcXRtdXgtPm1vb3YtPm12ZXgubWVoZC5mcmFnbWVudF9kdXJhdGlvbiA9CisgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChxdG11eC0+bGFzdF9kdHMsIHF0bXV4LT50aW1lc2NhbGUsIEdTVF9TRUNPTkQpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJyZXdyaXRpbmcgbW9vdiB3aXRoIG12ZXggZHVyYXRpb24gJSIKKyAgICAgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHF0bXV4LT5sYXN0X2R0cykpOworICAgICAgLyogc2VlayBhbmQgcmV3cml0ZSB0aGUgaGVhZGVyICovCisgICAgICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgICAgICBzZWdtZW50LnN0YXJ0ID0gcXRtdXgtPm1vb3ZfcG9zOworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChxdG11eC0+c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSk7CisgICAgICAvKiBubyBuZWVkIHRvIHNlZWsgYmFjayAqLworICAgICAgcmV0dXJuIGdzdF9xdF9tdXhfc2VuZF9tb292IChxdG11eCwgTlVMTCwgMCwgRkFMU0UsIEZBTFNFKTsKKyAgICB9CisgICAgY2FzZSBHU1RfUVRfTVVYX01PREVfUk9CVVNUX1JFQ09SRElORzp7CisgICAgICByZXQgPSBnc3RfcXRfbXV4X3JvYnVzdF9yZWNvcmRpbmdfcmV3cml0ZV9tb292IChxdG11eCk7CisgICAgICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIC8qIEZpbmFsaXNlIGJ5IHdyaXRpbmcgdGhlIGZpbmFsIHNpemUgaW50byB0aGUgbWRhdC4gVXAgdW50aWwgbm93CisgICAgICAgKiBpdCdzIGJlZW4gMCwgd2hpY2ggbWVhbnMgJ3Jlc3Qgb2YgdGhlIGZpbGUnCisgICAgICAgKiBObyBuZWVkIHRvIHNlZWsgYmFjayBhZnRlciB0aGlzLCB3ZSB3b24ndCB3cml0ZSBhbnkgbW9yZSAqLworICAgICAgcmV0dXJuIGdzdF9xdF9tdXhfdXBkYXRlX21kYXRfc2l6ZSAocXRtdXgsIHF0bXV4LT5tZGF0X3BvcywKKyAgICAgICAgICBxdG11eC0+bWRhdF9zaXplLCBOVUxMLCBUUlVFKTsKKyAgICB9CisgICAgY2FzZSBHU1RfUVRfTVVYX01PREVfUk9CVVNUX1JFQ09SRElOR19QUkVGSUxMOnsKKyAgICAgIEdTTGlzdCAqd2FsazsKKyAgICAgIGd1aW50MzIgbmV4dF90cmFja19pZCA9IHF0bXV4LT5tb292LT5tdmhkLm5leHRfdHJhY2tfaWQ7CisKKyAgICAgIGZvciAod2FsayA9IHF0bXV4LT5jb2xsZWN0LT5kYXRhOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgICAgICBHc3RDb2xsZWN0RGF0YSAqY2RhdGEgPSAoR3N0Q29sbGVjdERhdGEgKikgd2Fsay0+ZGF0YTsKKyAgICAgICAgR3N0UVRQYWQgKnFwYWQgPSAoR3N0UVRQYWQgKikgY2RhdGE7CisgICAgICAgIGNvbnN0IFRyYWtCdWZmZXJFbnRyeUluZm8gKnNhbXBsZV9lbnRyeTsKKyAgICAgICAgZ3VpbnQ2NCBibG9ja19pZHg7CisgICAgICAgIEF0b21TVEJMICpzdGJsID0gJnFwYWQtPnRyYWstPm1kaWEubWluZi5zdGJsOworCisgICAgICAgIC8qIEdldCB0aGUgYmxvY2sgaW5kZXggb2YgdGhlIGxhc3Qgc2FtcGxlIHdlIHdyb3RlLCBub3Qgb2YgdGhlIG5leHQKKyAgICAgICAgICogc2FtcGxlIHdlIHdvdWxkIHdyaXRlICovCisgICAgICAgIGJsb2NrX2lkeCA9IHByZWZpbGxfZ2V0X2Jsb2NrX2luZGV4IChxdG11eCwgcXBhZCk7CisgICAgICAgIGdfYXNzZXJ0IChibG9ja19pZHggPiAwKTsKKyAgICAgICAgYmxvY2tfaWR4LS07CisKKyAgICAgICAgc2FtcGxlX2VudHJ5ID0KKyAgICAgICAgICAgICZnX2FycmF5X2luZGV4IChxcGFkLT5zYW1wbGVzLCBUcmFrQnVmZmVyRW50cnlJbmZvLCBibG9ja19pZHgpOworCisgICAgICAgIC8qIHN0dHMgKi8KKyAgICAgICAgeworICAgICAgICAgIFNUVFNFbnRyeSAqZW50cnk7CisgICAgICAgICAgZ3VpbnQ2NCBuc2FtcGxlcyA9IDA7CisgICAgICAgICAgZ2ludCBpLCBuOworCisgICAgICAgICAgbiA9IGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0YmwtPnN0dHMuZW50cmllcyk7CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgZW50cnkgPSAmYXRvbV9hcnJheV9pbmRleCAoJnN0YmwtPnN0dHMuZW50cmllcywgaSk7CisgICAgICAgICAgICBpZiAobnNhbXBsZXMgKyBlbnRyeS0+c2FtcGxlX2NvdW50ID49IHFwYWQtPnNhbXBsZV9vZmZzZXQpIHsKKyAgICAgICAgICAgICAgZW50cnktPnNhbXBsZV9jb3VudCA9IHFwYWQtPnNhbXBsZV9vZmZzZXQgLSBuc2FtcGxlczsKKyAgICAgICAgICAgICAgc3RibC0+c3R0cy5lbnRyaWVzLmxlbiA9IGkgKyAxOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5zYW1wbGVzICs9IGVudHJ5LT5zYW1wbGVfY291bnQ7CisgICAgICAgICAgfQorICAgICAgICAgIGdfYXNzZXJ0IChpIDwgbik7CisgICAgICAgIH0KKworICAgICAgICAvKiBzdHN6ICovCisgICAgICAgIHsKKyAgICAgICAgICBnX2Fzc2VydCAoc3RibC0+c3Rzei5lbnRyaWVzLmxlbiA9PSAwKTsKKyAgICAgICAgICBzdGJsLT5zdHN6LnRhYmxlX3NpemUgPSBxcGFkLT5zYW1wbGVfb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgLyogc3Rjby9zdHNjICovCisgICAgICAgIHsKKyAgICAgICAgICBnaW50IGksIG47CisgICAgICAgICAgZ3VpbnQ2NCBuc2FtcGxlcyA9IDA7CisgICAgICAgICAgZ2ludCBjaHVua19pbmRleCA9IDA7CisKKyAgICAgICAgICBuID0gc3RibC0+c3RjbzY0LmVudHJpZXMubGVuOworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGd1aW50NjQgKmVudHJ5ID0gJmF0b21fYXJyYXlfaW5kZXggKCZzdGJsLT5zdGNvNjQuZW50cmllcywgaSk7CisKKyAgICAgICAgICAgIGlmICgqZW50cnkgPT0gc2FtcGxlX2VudHJ5LT5jaHVua19vZmZzZXQpIHsKKyAgICAgICAgICAgICAgc3RibC0+c3RjbzY0LmVudHJpZXMubGVuID0gaSArIDE7CisgICAgICAgICAgICAgIGNodW5rX2luZGV4ID0gaSArIDE7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBnX2Fzc2VydCAoaSA8IG4pOworICAgICAgICAgIGdfYXNzZXJ0IChjaHVua19pbmRleCA+IDApOworCisgICAgICAgICAgbiA9IHN0YmwtPnN0c2MuZW50cmllcy5sZW47CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgU1RTQ0VudHJ5ICplbnRyeSA9ICZhdG9tX2FycmF5X2luZGV4ICgmc3RibC0+c3RzYy5lbnRyaWVzLCBpKTsKKworICAgICAgICAgICAgaWYgKGVudHJ5LT5maXJzdF9jaHVuayA+PSBjaHVua19pbmRleCkKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgICBuc2FtcGxlcyArPQorICAgICAgICAgICAgICAgICAgKGVudHJ5LT5maXJzdF9jaHVuayAtIGF0b21fYXJyYXlfaW5kZXggKCZzdGJsLT5zdHNjLmVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgaSAtCisgICAgICAgICAgICAgICAgICAgICAgMSkuZmlyc3RfY2h1bmspICogYXRvbV9hcnJheV9pbmRleCAoJnN0YmwtPnN0c2MuZW50cmllcywKKyAgICAgICAgICAgICAgICAgIGkgLSAxKS5zYW1wbGVzX3Blcl9jaHVuazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZ19hc3NlcnQgKGkgPD0gbik7CisKKyAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIFNUU0NFbnRyeSAqcHJldl9lbnRyeSA9CisgICAgICAgICAgICAgICAgJmF0b21fYXJyYXlfaW5kZXggKCZzdGJsLT5zdHNjLmVudHJpZXMsIGkgLSAxKTsKKyAgICAgICAgICAgIG5zYW1wbGVzICs9CisgICAgICAgICAgICAgICAgKGNodW5rX2luZGV4IC0KKyAgICAgICAgICAgICAgICBwcmV2X2VudHJ5LT5maXJzdF9jaHVuaykgKiBwcmV2X2VudHJ5LT5zYW1wbGVzX3Blcl9jaHVuazsKKyAgICAgICAgICAgIGlmIChxcGFkLT5zYW1wbGVfb2Zmc2V0IC0gbnNhbXBsZXMgPiAwKSB7CisgICAgICAgICAgICAgIHN0YmwtPnN0c2MuZW50cmllcy5sZW4gPSBpOworICAgICAgICAgICAgICBhdG9tX3N0c2NfYWRkX25ld19lbnRyeSAoJnN0YmwtPnN0c2MsIGNodW5rX2luZGV4LAorICAgICAgICAgICAgICAgICAgcXBhZC0+c2FtcGxlX29mZnNldCAtIG5zYW1wbGVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHN0YmwtPnN0c2MuZW50cmllcy5sZW4gPSBpOworICAgICAgICAgICAgICBzdGJsLT5zdGNvNjQuZW50cmllcy5sZW4tLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogRXZlcnl0aGluZyBpbiBhIHNpbmdsZSBjaHVuayAqLworICAgICAgICAgICAgc3RibC0+c3RzYy5lbnRyaWVzLmxlbiA9IDA7CisgICAgICAgICAgICBhdG9tX3N0c2NfYWRkX25ld19lbnRyeSAoJnN0YmwtPnN0c2MsIGNodW5rX2luZGV4LAorICAgICAgICAgICAgICAgIHFwYWQtPnNhbXBsZV9vZmZzZXQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICBHTGlzdCAqd2FsazI7CisKKyAgICAgICAgICBmb3IgKHdhbGsyID0gcXRtdXgtPm1vb3YtPm12ZXgudHJleHM7IHdhbGsyOyB3YWxrMiA9IHdhbGsyLT5uZXh0KSB7CisgICAgICAgICAgICBBdG9tVFJFWCAqdHJleCA9IHdhbGsyLT5kYXRhOworCisgICAgICAgICAgICBpZiAodHJleC0+dHJhY2tfSUQgPT0gcXBhZC0+dHJhay0+dGtoZC50cmFja19JRCkgeworICAgICAgICAgICAgICB0cmV4LT50cmFja19JRCA9IG5leHRfdHJhY2tfaWQ7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHFwYWQtPnRyYWstPnRraGQudHJhY2tfSUQgPSBuZXh0X3RyYWNrX2lkKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHF0bXV4LT5tb292LT5tdmhkLm5leHRfdHJhY2tfaWQgPSBuZXh0X3RyYWNrX2lkOworCisgICAgICBnc3RfcXRfbXV4X3VwZGF0ZV9nbG9iYWxfc3RhdGlzdGljcyAocXRtdXgpOworICAgICAgZ3N0X3F0X211eF9jb25maWd1cmVfbW9vdiAocXRtdXgpOworCisgICAgICBnc3RfcXRfbXV4X3VwZGF0ZV9lZGl0X2xpc3RzIChxdG11eCk7CisKKyAgICAgIC8qIENoZWNrIGlmIGFueSBnYXAgZWRpdCBsaXN0cyB3ZXJlIGFkZGVkLiBXZSBkb24ndCBoYXZlIGFueSBzcGFjZQorICAgICAgICogcmVzZXJ2ZWQgZm9yIHRoaXMgaW4gdGhlIG1vb3YgYW5kIHRoZSBwcmUtZmluYWxpemVkIG1vb3Ygd291bGQgaGF2ZQorICAgICAgICogYnJva2VuIEEvViBzeW5jaHJvbml6YXRpb24uIEVycm9yIG91dCBoZXJlIG5vdworICAgICAgICovCisgICAgICBmb3IgKHdhbGsgPSBxdG11eC0+Y29sbGVjdC0+ZGF0YTsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICAgICAgR3N0Q29sbGVjdERhdGEgKmNkYXRhID0gKEdzdENvbGxlY3REYXRhICopIHdhbGstPmRhdGE7CisgICAgICAgIEdzdFFUUGFkICpxcGFkID0gKEdzdFFUUGFkICopIGNkYXRhOworCisgICAgICAgIGlmIChxcGFkLT50cmFrLT5lZHRzCisgICAgICAgICAgICAmJiBnX3NsaXN0X2xlbmd0aCAocXBhZC0+dHJhay0+ZWR0cy0+ZWxzdC5lbnRyaWVzKSA+IDEpIHsKKyAgICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtdXgsIFNUUkVBTSwgTVVYLCAoTlVMTCksCisgICAgICAgICAgICAgICgiQ2FuJ3Qgc3VwcG9ydCBnYXBzIGluIHByZWZpbGwgbW9kZSIpKTsKKworICAgICAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBnc3RfcXRfbXV4X3NldHVwX21ldGFkYXRhIChxdG11eCk7CisgICAgICBhdG9tX21vb3ZfY2h1bmtzX3NldF9vZmZzZXQgKHF0bXV4LT5tb292LCBxdG11eC0+aGVhZGVyX3NpemUpOworCisgICAgICB7CisgICAgICAgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICAgICAgICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgICAgICAgIHNlZ21lbnQuc3RhcnQgPSBxdG11eC0+bW9vdl9wb3M7CisgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocXRtdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgICAgICAgIHJldCA9CisgICAgICAgICAgICBnc3RfcXRfbXV4X3NlbmRfbW9vdiAocXRtdXgsIE5VTEwsIHF0bXV4LT5yZXNlcnZlZF9tb292X3NpemUsIEZBTFNFLAorICAgICAgICAgICAgRkFMU0UpOworICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgaWYgKHF0bXV4LT5yZXNlcnZlZF9tb292X3NpemUgPiBxdG11eC0+bGFzdF9tb292X3NpemUpIHsKKyAgICAgICAgICByZXQgPQorICAgICAgICAgICAgICBnc3RfcXRfbXV4X3NlbmRfZnJlZV9hdG9tIChxdG11eCwgTlVMTCwKKyAgICAgICAgICAgICAgcXRtdXgtPnJlc2VydmVkX21vb3Zfc2l6ZSAtIHF0bXV4LT5sYXN0X21vb3Zfc2l6ZSwgVFJVRSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICB9CisKKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfdXBkYXRlX21kYXRfc2l6ZSAocXRtdXgsIHF0bXV4LT5tZGF0X3BvcywKKyAgICAgICAgICBxdG11eC0+bWRhdF9zaXplLCBOVUxMLCBGQUxTRSk7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBNb292LWF0LWVuZCBvciBmYXN0LXN0YXJ0IG1vZGUgZnJvbSBoZXJlIGRvd24gKi8KKyAgZ3N0X3F0X211eF9jb25maWd1cmVfbW9vdiAocXRtdXgpOworCisgIGdzdF9xdF9tdXhfdXBkYXRlX2VkaXRfbGlzdHMgKHF0bXV4KTsKKworICAvKiB0YWdzIGludG8gZmlsZSBtZXRhZGF0YSAqLworICBnc3RfcXRfbXV4X3NldHVwX21ldGFkYXRhIChxdG11eCk7CisKKyAgbGFyZ2VfZmlsZSA9IChxdG11eC0+bWRhdF9zaXplID4gTURBVF9MQVJHRV9GSUxFX0xJTUlUKTsKKworICBzd2l0Y2ggKHF0bXV4LT5tdXhfbW9kZSkgeworICAgIGNhc2UgR1NUX1FUX01VWF9NT0RFX0ZBU1RfU1RBUlQ6eworICAgICAgLyogaWYgZmFzdHN0YXJ0LCB1cGRhdGUgdGhlIG9mZnNldCBvZiB0aGUgYXRvbXMgaW4gdGhlIG1vdmllIHdpdGggdGhlIG9mZnNldAorICAgICAgICogdGhhdCB0aGUgbW92aWUgaGVhZGVycyBiZWZvcmUgbWRhdCB3aWxsIGNhdXNlLgorICAgICAgICogQWxzbywgc2VuZCB0aGUgZnR5cCAqLworICAgICAgb2Zmc2V0ID0gc2l6ZSA9IDA7CisKKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfcHJlcGFyZV9hbmRfc2VuZF9mdHlwIChxdG11eCk7CisgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgICAgIGdvdG8gZnR5cF9lcnJvcjsKKyAgICAgIH0KKyAgICAgIC8qIGNvcHkgaW50byBOVUxMIHRvIG9idGFpbiBzaXplICovCisgICAgICBpZiAoIWF0b21fbW9vdl9jb3B5X2RhdGEgKHF0bXV4LT5tb292LCBOVUxMLCAmc2l6ZSwgJm9mZnNldCkpCisgICAgICAgIGdvdG8gc2VyaWFsaXplX2Vycm9yOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJjYWxjdWxhdGVkIG1vb3YgYXRvbSBzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCArPSBxdG11eC0+aGVhZGVyX3NpemUgKyAobGFyZ2VfZmlsZSA/IDE2IDogOCk7CisKKyAgICAgIC8qIHN1bSB1cCB3aXRoIHRoZSBleHRyYSBhdG9tcyBzaXplICovCisgICAgICByZXQgPSBnc3RfcXRfbXV4X3NlbmRfZXh0cmFfYXRvbXMgKHF0bXV4LCBGQUxTRSwgJm9mZnNldCwgRkFMU0UpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgb2Zmc2V0ID0gcXRtdXgtPmhlYWRlcl9zaXplOworICAgICAgYnJlYWs7CisgIH0KKworICAvKiBOb3cgdGhhdCB3ZSBrbm93IHRoZSBzaXplIG9mIG1vb3YgKyBleHRyYSBhdG9tcywgd2UgY2FuIGFkanVzdAorICAgKiB0aGUgY2h1bmsgb2Zmc2V0cyBzdG9yZWQgaW50byB0aGUgbW9vdiAqLworICBhdG9tX21vb3ZfY2h1bmtzX3NldF9vZmZzZXQgKHF0bXV4LT5tb292LCBvZmZzZXQpOworCisgIC8qIHdyaXRlIG91dCBtb292IGFuZCBleHRyYSBhdG9tcyAqLworICAvKiBub3RlOiBhcyBvZiB0aGlzIHBvaW50LCB3ZSBubyBsb25nZXIgY2FyZSBhYm91dCB0cmFja2luZyB3cml0dGVuIGRhdGEgc2l6ZSwKKyAgICogc2luY2UgdGhlcmUgaXMgbm8gbW9yZSB1c2UgZm9yIGl0IGFueXdheSAqLworICByZXQgPSBnc3RfcXRfbXV4X3NlbmRfbW9vdiAocXRtdXgsIE5VTEwsIDAsIEZBTFNFLCBGQUxTRSk7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJldDsKKworICAvKiBleHRyYSBhdG9tcyAqLworICByZXQgPSBnc3RfcXRfbXV4X3NlbmRfZXh0cmFfYXRvbXMgKHF0bXV4LCBUUlVFLCBOVUxMLCBGQUxTRSk7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJldDsKKworICBzd2l0Y2ggKHF0bXV4LT5tdXhfbW9kZSkgeworICAgIGNhc2UgR1NUX1FUX01VWF9NT0RFX01PT1ZfQVRfRU5EOgorICAgIHsKKyAgICAgIC8qIG1kYXQgbmVlZHMgdXBkYXRlIGlmZiBub3QgdXNpbmcgZmFzdHN0YXJ0ICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgInVwZGF0aW5nIG1kYXQgc2l6ZSIpOworICAgICAgcmV0ID0gZ3N0X3F0X211eF91cGRhdGVfbWRhdF9zaXplIChxdG11eCwgcXRtdXgtPm1kYXRfcG9zLAorICAgICAgICAgIHF0bXV4LT5tZGF0X3NpemUsIE5VTEwsIEZBTFNFKTsKKyAgICAgIC8qIG5vdGU7IG5vIHNlZWtpbmcgYmFjayB0byB0aGUgZW5kIG9mIGZpbGUgaXMgZG9uZSwKKyAgICAgICAqIHNpbmNlIHdlIG5vIGxvbmdlciB3cml0ZSBhbnl0aGluZyBhbnl3YXkgKi8KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVF9NVVhfTU9ERV9GQVNUX1NUQVJUOgorICAgIHsKKyAgICAgIC8qIHNlbmQgbWRhdCBhdG9tIGFuZCBtb3ZlIGJ1ZmZlcmVkIGRhdGEgaW50byBpdCAqLworICAgICAgLyogbWRhdF9zaXplID0gYWNjdW11bGF0ZWQgKGJ1ZmZlcmVkIGRhdGEpICovCisgICAgICByZXQgPSBnc3RfcXRfbXV4X3NlbmRfbWRhdF9oZWFkZXIgKHF0bXV4LCBOVUxMLCBxdG11eC0+bWRhdF9zaXplLAorICAgICAgICAgIGxhcmdlX2ZpbGUsIEZBTFNFKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIHJldHVybiByZXQ7CisgICAgICByZXQgPSBnc3RfcXRfbXV4X3NlbmRfYnVmZmVyZWRfZGF0YSAocXRtdXgsIE5VTEwpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgIH0KKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworc2VyaWFsaXplX2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXV4LCBTVFJFQU0sIE1VWCwgKE5VTEwpLAorICAgICAgICAoIkZhaWxlZCB0byBzZXJpYWxpemUgbW9vdiIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2Z0eXBfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtdXgsIFNUUkVBTSwgTVVYLCAoTlVMTCksICgiRmFpbGVkIHRvIHNlbmQgZnR5cCIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfcGFkX2ZyYWdtZW50X2FkZF9idWZmZXIgKEdzdFFUTXV4ICogcXRtdXgsIEdzdFFUUGFkICogcGFkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZiwgZ2Jvb2xlYW4gZm9yY2UsIGd1aW50MzIgbnNhbXBsZXMsIGdpbnQ2NCBkdHMsCisgICAgZ3VpbnQzMiBkZWx0YSwgZ3VpbnQzMiBzaXplLCBnYm9vbGVhbiBzeW5jLCBnaW50NjQgcHRzX29mZnNldCkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKworICAvKiBzZXR1cCBpZiBuZWVkZWQgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKCFwYWQtPnRyYWYgfHwgZm9yY2UpKQorICAgIGdvdG8gaW5pdDsKKworZmx1c2g6CisgIC8qIGZsdXNoIHBhZCBmcmFnbWVudCBpZiB0aHJlc2hvbGQgcmVhY2hlZCwKKyAgICogb3IgYXQgbmV3IGtleWZyYW1lIGlmIHdlIHNob3VsZCBiZSBtaW5kaW5nIHRob3NlIGluIHRoZSBmaXJzdCBwbGFjZSAqLworICBpZiAoR19VTkxJS0VMWSAoZm9yY2UgfHwgKHN5bmMgJiYgcGFkLT5zeW5jKSB8fAorICAgICAgICAgIHBhZC0+ZnJhZ21lbnRfZHVyYXRpb24gPCAoZ2ludDY0KSBkZWx0YSkpIHsKKyAgICBBdG9tTU9PRiAqbW9vZjsKKyAgICBndWludDY0IHNpemUgPSAwLCBvZmZzZXQgPSAwOworICAgIGd1aW50OCAqZGF0YSA9IE5VTEw7CisgICAgR3N0QnVmZmVyICpidWZmZXI7CisgICAgZ3VpbnQgaSwgdG90YWxfc2l6ZTsKKworICAgIC8qIG5vdyB3ZSBrbm93IHdoZXJlIG1vb2YgZW5kcyB1cCwgdXBkYXRlIG9mZnNldCBpbiB0ZnJhICovCisgICAgaWYgKHBhZC0+dGZyYSkKKyAgICAgIGF0b21fdGZyYV91cGRhdGVfb2Zmc2V0IChwYWQtPnRmcmEsIHF0bXV4LT5oZWFkZXJfc2l6ZSk7CisKKyAgICBtb29mID0gYXRvbV9tb29mX25ldyAocXRtdXgtPmNvbnRleHQsIHF0bXV4LT5mcmFnbWVudF9zZXF1ZW5jZSk7CisgICAgLyogdGFrZXMgb3duZXJzaGlwICovCisgICAgYXRvbV9tb29mX2FkZF90cmFmIChtb29mLCBwYWQtPnRyYWYpOworICAgIHBhZC0+dHJhZiA9IE5VTEw7CisgICAgYXRvbV9tb29mX2NvcHlfZGF0YSAobW9vZiwgJmRhdGEsICZzaXplLCAmb2Zmc2V0KTsKKyAgICBidWZmZXIgPSBfZ3N0X2J1ZmZlcl9uZXdfdGFrZV9kYXRhIChkYXRhLCBvZmZzZXQpOworICAgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwgIndyaXRpbmcgbW9vZiBzaXplICUiIEdfR1NJWkVfRk9STUFULAorICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpKTsKKyAgICByZXQgPSBnc3RfcXRfbXV4X3NlbmRfYnVmZmVyIChxdG11eCwgYnVmZmVyLCAmcXRtdXgtPmhlYWRlcl9zaXplLCBGQUxTRSk7CisKKyAgICAvKiBhbmQgYWN0dWFsIGRhdGEgKi8KKyAgICB0b3RhbF9zaXplID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXRvbV9hcnJheV9nZXRfbGVuICgmcGFkLT5mcmFnbWVudF9idWZmZXJzKTsgaSsrKSB7CisgICAgICB0b3RhbF9zaXplICs9CisgICAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYXRvbV9hcnJheV9pbmRleCAoJnBhZC0+ZnJhZ21lbnRfYnVmZmVycywgaSkpOworICAgIH0KKworICAgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwgIndyaXRpbmcgJWQgYnVmZmVycywgdG90YWxfc2l6ZSAlZCIsCisgICAgICAgIGF0b21fYXJyYXlfZ2V0X2xlbiAoJnBhZC0+ZnJhZ21lbnRfYnVmZmVycyksIHRvdGFsX3NpemUpOworICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfT0spCisgICAgICByZXQgPSBnc3RfcXRfbXV4X3NlbmRfbWRhdF9oZWFkZXIgKHF0bXV4LCAmcXRtdXgtPmhlYWRlcl9zaXplLCB0b3RhbF9zaXplLAorICAgICAgICAgIEZBTFNFLCBGQUxTRSk7CisgICAgZm9yIChpID0gMDsgaSA8IGF0b21fYXJyYXlfZ2V0X2xlbiAoJnBhZC0+ZnJhZ21lbnRfYnVmZmVycyk7IGkrKykgeworICAgICAgaWYgKEdfTElLRUxZIChyZXQgPT0gR1NUX0ZMT1dfT0spKQorICAgICAgICByZXQgPSBnc3RfcXRfbXV4X3NlbmRfYnVmZmVyIChxdG11eCwKKyAgICAgICAgICAgIGF0b21fYXJyYXlfaW5kZXggKCZwYWQtPmZyYWdtZW50X2J1ZmZlcnMsIGkpLCAmcXRtdXgtPmhlYWRlcl9zaXplLAorICAgICAgICAgICAgRkFMU0UpOworICAgICAgZWxzZQorICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChhdG9tX2FycmF5X2luZGV4ICgmcGFkLT5mcmFnbWVudF9idWZmZXJzLCBpKSk7CisgICAgfQorCisgICAgYXRvbV9hcnJheV9jbGVhciAoJnBhZC0+ZnJhZ21lbnRfYnVmZmVycyk7CisgICAgYXRvbV9tb29mX2ZyZWUgKG1vb2YpOworICAgIHF0bXV4LT5mcmFnbWVudF9zZXF1ZW5jZSsrOworICAgIGZvcmNlID0gRkFMU0U7CisgIH0KKworaW5pdDoKKyAgaWYgKEdfVU5MSUtFTFkgKCFwYWQtPnRyYWYpKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHF0bXV4LCAic2V0dGluZyB1cCBuZXcgZnJhZ21lbnQiKTsKKyAgICBwYWQtPnRyYWYgPSBhdG9tX3RyYWZfbmV3IChxdG11eC0+Y29udGV4dCwgYXRvbV90cmFrX2dldF9pZCAocGFkLT50cmFrKSk7CisgICAgYXRvbV9hcnJheV9pbml0ICgmcGFkLT5mcmFnbWVudF9idWZmZXJzLCA1MTIpOworICAgIHBhZC0+ZnJhZ21lbnRfZHVyYXRpb24gPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHF0bXV4LT5mcmFnbWVudF9kdXJhdGlvbiwKKyAgICAgICAgYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHBhZC0+dHJhayksIDEwMDApOworCisgICAgaWYgKEdfVU5MSUtFTFkgKHF0bXV4LT5tZnJhICYmICFwYWQtPnRmcmEpKSB7CisgICAgICBwYWQtPnRmcmEgPSBhdG9tX3RmcmFfbmV3IChxdG11eC0+Y29udGV4dCwgYXRvbV90cmFrX2dldF9pZCAocGFkLT50cmFrKSk7CisgICAgICBhdG9tX21mcmFfYWRkX3RmcmEgKHF0bXV4LT5tZnJhLCBwYWQtPnRmcmEpOworICAgIH0KKyAgICBhdG9tX3RyYWZfc2V0X2Jhc2VfZGVjb2RlX3RpbWUgKHBhZC0+dHJhZiwgZHRzKTsKKyAgfQorCisgIC8qIGFkZCBidWZmZXIgYW5kIG1ldGFkYXRhICovCisgIGF0b21fdHJhZl9hZGRfc2FtcGxlcyAocGFkLT50cmFmLCBkZWx0YSwgc2l6ZSwgc3luYywgcHRzX29mZnNldCwKKyAgICAgIHBhZC0+c3luYyAmJiBzeW5jKTsKKyAgYXRvbV9hcnJheV9hcHBlbmQgKCZwYWQtPmZyYWdtZW50X2J1ZmZlcnMsIGJ1ZiwgMjU2KTsKKyAgcGFkLT5mcmFnbWVudF9kdXJhdGlvbiAtPSBkZWx0YTsKKworICBpZiAocGFkLT50ZnJhKSB7CisgICAgZ3VpbnQzMiBzbiA9IGF0b21fdHJhZl9nZXRfc2FtcGxlX251bSAocGFkLT50cmFmKTsKKworICAgIGlmICgoc3luYyAmJiBwYWQtPnN5bmMpIHx8IChzbiA9PSAxICYmICFwYWQtPnN5bmMpKQorICAgICAgYXRvbV90ZnJhX2FkZF9lbnRyeSAocGFkLT50ZnJhLCBkdHMsIHNuKTsKKyAgfQorCisgIGlmIChHX1VOTElLRUxZIChmb3JjZSkpCisgICAgZ290byBmbHVzaDsKKworICByZXR1cm4gcmV0OworfQorCisvKiBIZXJlJ3MgdGhlIGNsZXZlciBiaXQgb2Ygcm9idXN0IHJlY29yZGluZzogVXBkYXRpbmcgdGhlIG1vb3YKKyAqIGhlYWRlciBpcyBkb25lIHVzaW5nIGEgcGluZy1wb25nIHNjaGVtZSBpbnNpZGUgMiBibG9ja3Mgb2Ygc2l6ZQorICogJ3Jlc2VydmVkX21vb3Zfc2l6ZScgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLCBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlCisgKiBmaWxlIG9uLWRpc2sgaXMgYWx3YXlzIHZhbGlkIGlmIGludGVycnVwdGVkLgorICogSW5zaWRlIHRoZSByZXNlcnZlZCBzcGFjZSwgd2UgaGF2ZSAyIHBhaXJzIG9mIGZyZWUgKyBtb292IGF0b21zCisgKiAoaW4gdGhhdCBvcmRlciksIGZyZWUtQSArIG1vb3YtQSBAIG9mZnNldCAwIGFuZCBmcmVlLUIgKyBtb292LUIgYXQKKyAqIGF0IG9mZnNldCAicmVzZXJ2ZWRfbW9vdl9zaXplIi4KKyAqCisgKiAxLiBGcmVlLUEgaGFzIDAgc2l6ZSBwYXlsb2FkLCBtb292LUEgaW1tZWRpYXRlbHkgYWZ0ZXIgaXMKKyAqICAgIGFjdGl2ZS9jdXJyZW50LCBhbmQgaXMgcGFkZGVkIHdpdGggYW4gaW50ZXJuYWwgRnJlZSBhdG9tIHRvCisgKiAgICBlbmQgYXQgcmVzZXJ2ZWRfc3BhY2UvMi4gRnJlZS1CIGlzIGF0IHJlc2VydmVkX3NwYWNlLzIsIHNpemVkCisgKiAgICB0byBjb3ZlciB0aGUgcmVtYWluaW5nIGZyZWUgc3BhY2UgKGluY2x1ZGluZyBtb292LUIpLgorICogMi4gV2Ugd3JpdGUgbW9vdi1CICh3aGljaCBpcyBpbnZpc2libGUgaW5zaWRlIGZyZWUtQiksIGFuZCBwYWQgaXQgdG8KKyAqICAgIGVuZCBhdCB0aGUgZW5kIG9mIGZyZWUgc3BhY2UuIFRoZW4sIHdlIHVwZGF0ZSBmcmVlLUEgdG8gc2l6ZQorICogICAgcmVzZXJ2ZWRfc3BhY2UvMiArIHNpemVvZihmcmVlLUIpLCB3aGljaCBoaWRlcyBtb292LUEgYW5kIHRoZQorICogICAgZnJlZS1CIGhlYWRlciwgYW5kIG1ha2VzIG1vb3YtQiBhY3RpdmUuCisgKiAzLiBSZXdyaXRlIG1vb3YtQSBpbnNpZGUgZnJlZS1BLCB3aXRoIHBhZGRpbmcgb3V0IHRvIGZyZWUtQi4KKyAqICAgIENoYW5nZSB0aGUgc2l6ZSBvZiBmcmVlLUEgdG8gbWFrZSBtb292LUEgYWN0aXZlIGFnYWluLgorICogNC4gUmluc2UgYW5kIHJlcGVhdC4KKyAqCisgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcXRfbXV4X3JvYnVzdF9yZWNvcmRpbmdfcmV3cml0ZV9tb292IChHc3RRVE11eCAqIHF0bXV4KQoreworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBndWludDY0IGZyZWVBX29mZnNldDsKKyAgZ3VpbnQzMiBuZXdfZnJlZUFfc2l6ZTsKKyAgZ3VpbnQ2NCBuZXdfbW9vdl9vZmZzZXQ7CisKKyAgLyogVXBkYXRlIG1vb3YgaW5mbywgdGhlbiBzZWVrIGFuZCByZXdyaXRlIHRoZSBNT09WIGF0b20gKi8KKyAgZ3N0X3F0X211eF91cGRhdGVfZ2xvYmFsX3N0YXRpc3RpY3MgKHF0bXV4KTsKKyAgZ3N0X3F0X211eF9jb25maWd1cmVfbW9vdiAocXRtdXgpOworCisgIGdzdF9xdF9tdXhfdXBkYXRlX2VkaXRfbGlzdHMgKHF0bXV4KTsKKworICAvKiB0YWdzIGludG8gZmlsZSBtZXRhZGF0YSAqLworICBnc3RfcXRfbXV4X3NldHVwX21ldGFkYXRhIChxdG11eCk7CisKKyAgLyogY2h1bmtzIHBvc2l0aW9uIGlzIHNldCByZWxhdGl2ZSB0byB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUKKyAgICogTURBVCBhdG9tIHBheWxvYWQuIFNldCB0aGUgb3ZlcmFsbCBvZmZzZXQgaW50byB0aGUgZmlsZSAqLworICBhdG9tX21vb3ZfY2h1bmtzX3NldF9vZmZzZXQgKHF0bXV4LT5tb292LCBxdG11eC0+aGVhZGVyX3NpemUpOworCisgIC8qIENhbGN1bGF0ZSB3aGljaCBtb292IHRvIHJld3JpdGUuIHF0bXV4LT5tb292X3BvcyBwb2ludHMgdG8KKyAgICogdGhlIHN0YXJ0IG9mIHRoZSBmcmVlLUEgaGVhZGVyICovCisgIGZyZWVBX29mZnNldCA9IHF0bXV4LT5tb292X3BvczsKKyAgaWYgKHF0bXV4LT5yZXNlcnZlZF9tb292X2ZpcnN0X2FjdGl2ZSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiVXBkYXRpbmcgcG9uZyBtb292IGhlYWRlciIpOworICAgIC8qIEFmdGVyIHRoaXMsIGZyZWVBIHdpbGwgaW5jbHVkZSBpdHNlbGYsIG1vb3ZBLCBwbHVzIHRoZSBmcmVlQgorICAgICAqIGhlYWRlciAqLworICAgIG5ld19mcmVlQV9zaXplID0gcXRtdXgtPnJlc2VydmVkX21vb3Zfc2l6ZSArIDE2OworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiVXBkYXRpbmcgcGluZyBtb292IGhlYWRlciIpOworICAgIG5ld19mcmVlQV9zaXplID0gODsKKyAgfQorICAvKiB0aGUgbW9vdiB3ZSB1cGRhdGUgaXMgYWZ0ZXIgZnJlZS1BLCBjYWxjdWxhdGUgaXRzIG9mZnNldCAqLworICBuZXdfbW9vdl9vZmZzZXQgPSBmcmVlQV9vZmZzZXQgKyBuZXdfZnJlZUFfc2l6ZTsKKworICAvKiBTd2FwIHBpbmctcG9uZyBjYWRlbmNlIG1hcmtlciAqLworICBxdG11eC0+cmVzZXJ2ZWRfbW9vdl9maXJzdF9hY3RpdmUgPSAhcXRtdXgtPnJlc2VydmVkX21vb3ZfZmlyc3RfYWN0aXZlOworCisgIC8qIHNlZWsgYW5kIHJld3JpdGUgdGhlIE1PT1YgYXRvbSAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgIHNlZ21lbnQuc3RhcnQgPSBuZXdfbW9vdl9vZmZzZXQ7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAocXRtdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgIHJldCA9CisgICAgICBnc3RfcXRfbXV4X3NlbmRfbW9vdiAocXRtdXgsIE5VTEwsIHF0bXV4LT5yZXNlcnZlZF9tb292X3NpemUsIEZBTFNFLAorICAgICAgVFJVRSk7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJldDsKKworICAvKiBVcGRhdGUgdGhlIGVzdGltYXRlZCByZWNvcmRpbmcgc3BhY2UgcmVtYWluaW5nLCBiYXNlZCBvbiBhbW91bnQgdXNlZCBzbworICAgKiBmYXIgYW5kIGR1cmF0aW9uIG11eGVkIHNvIGZhciAqLworICBpZiAocXRtdXgtPmxhc3RfbW9vdl9zaXplID4gcXRtdXgtPmJhc2VfbW9vdl9zaXplICYmIHF0bXV4LT5sYXN0X2R0cyA+IDApIHsKKyAgICBHc3RDbG9ja1RpbWUgcmVtYWluOworICAgIEdzdENsb2NrVGltZSB0aW1lX211eGVkID0gcXRtdXgtPmxhc3RfZHRzOworCisgICAgcmVtYWluID0KKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChxdG11eC0+cmVzZXJ2ZWRfbW9vdl9zaXplIC0KKyAgICAgICAgcXRtdXgtPmxhc3RfbW9vdl9zaXplLCB0aW1lX211eGVkLAorICAgICAgICBxdG11eC0+bGFzdF9tb292X3NpemUgLSBxdG11eC0+YmFzZV9tb292X3NpemUpOworICAgIC8qIEFsd2F5cyB1bmRlci1lc3RpbWF0ZSBzbGlnaHRseSwgc28gdXNlcnMKKyAgICAgKiBoYXZlIHRpbWUgdG8gc3RvcCBtdXhpbmcgYmVmb3JlIHdlIHJ1biBvdXQgKi8KKyAgICBpZiAocmVtYWluIDwgR1NUX1NFQ09ORCAvIDIpCisgICAgICByZW1haW4gPSAwOworICAgIGVsc2UKKyAgICAgIHJlbWFpbiAtPSBHU1RfU0VDT05EIC8gMjsKKworICAgIEdTVF9JTkZPX09CSkVDVCAocXRtdXgsCisgICAgICAgICJSZXNlcnZlZCAldSBoZWFkZXIgYnl0ZXMuIFVzZWQgJXUgaW4gJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICIuIFJlbWFpbmluZyBub3cgJXUgb3IgYXBwcm94ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBuc1xuIiwKKyAgICAgICAgcXRtdXgtPnJlc2VydmVkX21vb3Zfc2l6ZSwgcXRtdXgtPmxhc3RfbW9vdl9zaXplLAorICAgICAgICBHU1RfVElNRV9BUkdTIChxdG11eC0+bGFzdF9kdHMpLAorICAgICAgICBxdG11eC0+cmVzZXJ2ZWRfbW9vdl9zaXplIC0gcXRtdXgtPmxhc3RfbW9vdl9zaXplLCByZW1haW4pOworCisgICAgR1NUX09CSkVDVF9MT0NLIChxdG11eCk7CisgICAgcXRtdXgtPnJlc2VydmVkX2R1cmF0aW9uX3JlbWFpbmluZyA9IHJlbWFpbjsKKyAgICBxdG11eC0+bXV4ZWRfc2luY2VfbGFzdF91cGRhdGUgPSAwOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAicmVzZXJ2ZWQgcmVtYWluaW5nIGR1cmF0aW9uIG5vdyAlIgorICAgICAgICBHX0dVSU5UNjRfRk9STUFULCBxdG11eC0+cmVzZXJ2ZWRfZHVyYXRpb25fcmVtYWluaW5nKTsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAocXRtdXgpOworICB9CisKKworICAvKiBOb3cgdXBkYXRlIHRoZSBtb292LUEgc2l6ZS4gRG9uJ3QgcGFzcyBvZmZzZXQsIHNpbmNlIHdlIGRvbid0IG5lZWQKKyAgICogc2VuZF9mcmVlX2F0b20oKSB0byBzZWVrIGZvciB1cyAtIGFsbCBvdXIgY2FsbGVycyBzZWVrIGJhY2sgdG8KKyAgICogd2hlcmUgdGhleSBuZWVkIGFmdGVyIHRoaXMsIG9yIHRoZXkgZG9uJ3QgbmVlZCBpdCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgIHNlZ21lbnQuc3RhcnQgPSBmcmVlQV9vZmZzZXQ7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAocXRtdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9mcmVlX2F0b20gKHF0bXV4LCBOVUxMLCBuZXdfZnJlZUFfc2l6ZSwgVFJVRSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfcm9idXN0X3JlY29yZGluZ191cGRhdGUgKEdzdFFUTXV4ICogcXRtdXgsIEdzdENsb2NrVGltZSBwb3NpdGlvbikKK3sKKyAgR3N0U2VnbWVudCBzZWdtZW50OworICBHc3RGbG93UmV0dXJuIGZsb3dfcmV0OworCisgIGd1aW50NjQgbWRhdF9vZmZzZXQgPSBxdG11eC0+bWRhdF9wb3MgKyAxNiArIHF0bXV4LT5tZGF0X3NpemU7CisKKyAgR1NUX09CSkVDVF9MT0NLIChxdG11eCk7CisKKyAgLyogVXBkYXRlIHRoZSBvZmZzZXQgb2YgaG93IG11Y2ggd2UndmUgbXV4ZWQsIHNvIHRoZQorICAgKiByZXBvcnQgb2YgcmVtYWluaW5nIHNwYWNlIGtlZXBzIGNvdW50aW5nIGRvd24gKi8KKyAgaWYgKHBvc2l0aW9uID4gcXRtdXgtPmxhc3RfbW9vdl91cGRhdGUgJiYKKyAgICAgIHBvc2l0aW9uIC0gcXRtdXgtPmxhc3RfbW9vdl91cGRhdGUgPiBxdG11eC0+bXV4ZWRfc2luY2VfbGFzdF91cGRhdGUpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRtdXgsCisgICAgICAgICJNdXhlZCB0aW1lICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBzaW5jZSBsYXN0IG1vb3YgdXBkYXRlIiwKKyAgICAgICAgcXRtdXgtPm11eGVkX3NpbmNlX2xhc3RfdXBkYXRlKTsKKyAgICBxdG11eC0+bXV4ZWRfc2luY2VfbGFzdF91cGRhdGUgPSBwb3NpdGlvbiAtIHF0bXV4LT5sYXN0X21vb3ZfdXBkYXRlOworICB9CisKKyAgLyogTmV4dCwgY2hlY2sgaWYgd2UncmUgc3VwcG9zZWQgdG8gc2VuZCBwZXJpb2RpYyBtb292IHVwZGF0ZXMgZG93bnN0cmVhbSAqLworICBpZiAocXRtdXgtPnJlc2VydmVkX21vb3ZfdXBkYXRlX3BlcmlvZCA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXV4KTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KKworICAvKiBVcGRhdGUgaWYgcG9zaXRpb24gaXMgPiB0aGUgdGhyZXNob2xkIG9yIHRoZXJlJ3MgYmVlbiBubyB1cGRhdGUgeWV0ICovCisgIGlmIChxdG11eC0+bGFzdF9tb292X3VwZGF0ZSAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FICYmCisgICAgICAocG9zaXRpb24gPD0gcXRtdXgtPmxhc3RfbW9vdl91cGRhdGUgfHwKKyAgICAgICAgICAocG9zaXRpb24gLSBxdG11eC0+bGFzdF9tb292X3VwZGF0ZSkgPAorICAgICAgICAgIHF0bXV4LT5yZXNlcnZlZF9tb292X3VwZGF0ZV9wZXJpb2QpKSB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXV4KTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7ICAgICAgICAgLyogTm8gdXBkYXRlIG5lZWRlZCB5ZXQgKi8KKyAgfQorCisgIHF0bXV4LT5sYXN0X21vb3ZfdXBkYXRlID0gcG9zaXRpb247CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChxdG11eCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJVcGRhdGUgbW9vdiBhdG9tLCBwb3NpdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIgbWRhdCBzdGFydHMgQCAlIiBHX0dVSU5UNjRfRk9STUFUICIgd2Ugd2VyZSBhICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChwb3NpdGlvbiksIHF0bXV4LT5tZGF0X3BvcywgbWRhdF9vZmZzZXQpOworCisgIGZsb3dfcmV0ID0gZ3N0X3F0X211eF9yb2J1c3RfcmVjb3JkaW5nX3Jld3JpdGVfbW9vdiAocXRtdXgpOworICBpZiAoR19VTkxJS0VMWSAoZmxvd19yZXQgIT0gR1NUX0ZMT1dfT0spKQorICAgIHJldHVybiBmbG93X3JldDsKKworICAvKiBTZWVrIGJhY2sgdG8gcHJldmlvdXMgcG9zaXRpb24gKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfQllURVMpOworICBzZWdtZW50LnN0YXJ0ID0gbWRhdF9vZmZzZXQ7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAocXRtdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgIHJldHVybiBmbG93X3JldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfcmVnaXN0ZXJfYW5kX3B1c2hfc2FtcGxlIChHc3RRVE11eCAqIHF0bXV4LCBHc3RRVFBhZCAqIHBhZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIsIGdib29sZWFuIGlzX2xhc3RfYnVmZmVyLCBndWludCBuc2FtcGxlcywKKyAgICBnaW50NjQgbGFzdF9kdHMsIGdpbnQ2NCBzY2FsZWRfZHVyYXRpb24sIGd1aW50IHNhbXBsZV9zaXplLAorICAgIGd1aW50NjQgY2h1bmtfb2Zmc2V0LCBnYm9vbGVhbiBzeW5jLCBnYm9vbGVhbiBkb19wdHMsIGdpbnQ2NCBwdHNfb2Zmc2V0KQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworCisgIC8qIG5vdGUgdGhhdCBhIG5ldyBjaHVuayBpcyBzdGFydGVkIGVhY2ggdGltZSAobm90IGZhbmN5IGJ1dCB3b3JrcykgKi8KKyAgaWYgKHF0bXV4LT5tb292X3JlY292X2ZpbGUpIHsKKyAgICBpZiAoIWF0b21zX3JlY292X3dyaXRlX3RyYWtfc2FtcGxlcyAocXRtdXgtPm1vb3ZfcmVjb3ZfZmlsZSwgcGFkLT50cmFrLAorICAgICAgICAgICAgbnNhbXBsZXMsIChnaW50MzIpIHNjYWxlZF9kdXJhdGlvbiwgc2FtcGxlX3NpemUsIGNodW5rX29mZnNldCwgc3luYywKKyAgICAgICAgICAgIGRvX3B0cywgcHRzX29mZnNldCkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRtdXgsICJGYWlsZWQgdG8gd3JpdGUgc2FtcGxlIGluZm9ybWF0aW9uIHRvICIKKyAgICAgICAgICAicmVjb3ZlcnkgZmlsZSwgZGlzYWJsaW5nIHJlY292ZXJ5Iik7CisgICAgICBmY2xvc2UgKHF0bXV4LT5tb292X3JlY292X2ZpbGUpOworICAgICAgcXRtdXgtPm1vb3ZfcmVjb3ZfZmlsZSA9IE5VTEw7CisgICAgfQorICB9CisKKyAgc3dpdGNoIChxdG11eC0+bXV4X21vZGUpIHsKKyAgICBjYXNlIEdTVF9RVF9NVVhfTU9ERV9ST0JVU1RfUkVDT1JESU5HX1BSRUZJTEw6eworICAgICAgY29uc3QgVHJha0J1ZmZlckVudHJ5SW5mbyAqc2FtcGxlX2VudHJ5OworICAgICAgZ3VpbnQ2NCBibG9ja19pZHggPSBwcmVmaWxsX2dldF9ibG9ja19pbmRleCAocXRtdXgsIHBhZCk7CisKKyAgICAgIGlmIChibG9ja19pZHggPj0gcGFkLT5zYW1wbGVzLT5sZW4pIHsKKyAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXV4LCBTVFJFQU0sIE1VWCwgKE5VTEwpLAorICAgICAgICAgICAgKCJVbmV4cGVjdGVkIHNhbXBsZSAlIiBHX0dVSU5UNjRfRk9STUFUICIsIGV4cGVjdGVkIHVwIHRvICV1IiwKKyAgICAgICAgICAgICAgICBibG9ja19pZHgsIHBhZC0+c2FtcGxlcy0+bGVuKSk7CisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgaWYgYWxsIHZhbHVlcyBhcmUgYXMgZXhwZWN0ZWQgKi8KKyAgICAgIHNhbXBsZV9lbnRyeSA9CisgICAgICAgICAgJmdfYXJyYXlfaW5kZXggKHBhZC0+c2FtcGxlcywgVHJha0J1ZmZlckVudHJ5SW5mbywgYmxvY2tfaWR4KTsKKworICAgICAgLyogQWxsb3cgKy8tIDEgZGlmZmVyZW5jZSBmb3IgdGhlIHNjYWxlZF9kdXJhdGlvbiB0byBhbGxvdworICAgICAgICogZm9yIHNvbWUgcm91bmRpbmcgZXJyb3JzCisgICAgICAgKi8KKyAgICAgIGlmIChzYW1wbGVfZW50cnktPm5zYW1wbGVzICE9IG5zYW1wbGVzCisgICAgICAgICAgfHwgQUJTRElGRiAoc2FtcGxlX2VudHJ5LT5kZWx0YSwgc2NhbGVkX2R1cmF0aW9uKSA+IDEKKyAgICAgICAgICB8fCBzYW1wbGVfZW50cnktPnNpemUgIT0gc2FtcGxlX3NpemUKKyAgICAgICAgICB8fCBzYW1wbGVfZW50cnktPmNodW5rX29mZnNldCAhPSBjaHVua19vZmZzZXQKKyAgICAgICAgICB8fCBzYW1wbGVfZW50cnktPnB0c19vZmZzZXQgIT0gcHRzX29mZnNldAorICAgICAgICAgIHx8IHNhbXBsZV9lbnRyeS0+c3luYyAhPSBzeW5jKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdG11eCwgU1RSRUFNLCBNVVgsIChOVUxMKSwKKyAgICAgICAgICAgICgiVW5leHBlY3RlZCB2YWx1ZXMgaW4gc2FtcGxlICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICAgICAgcGFkLT5zYW1wbGVfb2Zmc2V0ICsgMSkpOworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgICB9CisKKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9idWZmZXIgKHF0bXV4LCBidWZmZXIsICZxdG11eC0+bWRhdF9zaXplLCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVF9NVVhfTU9ERV9NT09WX0FUX0VORDoKKyAgICBjYXNlIEdTVF9RVF9NVVhfTU9ERV9GQVNUX1NUQVJUOgorICAgIGNhc2UgR1NUX1FUX01VWF9NT0RFX1JPQlVTVF9SRUNPUkRJTkc6CisgICAgICBhdG9tX3RyYWtfYWRkX3NhbXBsZXMgKHBhZC0+dHJhaywgbnNhbXBsZXMsIChnaW50MzIpIHNjYWxlZF9kdXJhdGlvbiwKKyAgICAgICAgICBzYW1wbGVfc2l6ZSwgY2h1bmtfb2Zmc2V0LCBzeW5jLCBwdHNfb2Zmc2V0KTsKKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9idWZmZXIgKHF0bXV4LCBidWZmZXIsICZxdG11eC0+bWRhdF9zaXplLCBUUlVFKTsKKyAgICAgIC8qIENoZWNrIGlmIGl0J3MgdGltZSB0byByZS13cml0ZSB0aGUgaGVhZGVycyBpbiByb2J1c3QtcmVjb3JkaW5nIG1vZGUgKi8KKyAgICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfT0sKKyAgICAgICAgICAmJiBxdG11eC0+bXV4X21vZGUgPT0gR1NUX1FUX01VWF9NT0RFX1JPQlVTVF9SRUNPUkRJTkcpCisgICAgICAgIHJldCA9IGdzdF9xdF9tdXhfcm9idXN0X3JlY29yZGluZ191cGRhdGUgKHF0bXV4LCBwYWQtPnRvdGFsX2R1cmF0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1FUX01VWF9NT0RFX0ZSQUdNRU5URUQ6CisgICAgY2FzZSBHU1RfUVRfTVVYX01PREVfRlJBR01FTlRFRF9TVFJFQU1BQkxFOgorICAgICAgLyogZW5zdXJlIHRoYXQgYWx3YXlzIHN5bmMgc2FtcGxlcyBhcmUgbWFya2VkIGFzIHN1Y2ggKi8KKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfcGFkX2ZyYWdtZW50X2FkZF9idWZmZXIgKHF0bXV4LCBwYWQsIGJ1ZmZlciwKKyAgICAgICAgICBpc19sYXN0X2J1ZmZlciwgbnNhbXBsZXMsIGxhc3RfZHRzLCAoZ2ludDMyKSBzY2FsZWRfZHVyYXRpb24sCisgICAgICAgICAgc2FtcGxlX3NpemUsICFwYWQtPnN5bmMgfHwgc3luYywgcHRzX29mZnNldCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbXV4X3JlZ2lzdGVyX2J1ZmZlcl9pbl9jaHVuayAoR3N0UVRNdXggKiBxdG11eCwgR3N0UVRQYWQgKiBwYWQsCisgICAgZ3VpbnQgYnVmZmVyX3NpemUsIEdzdENsb2NrVGltZSBkdXJhdGlvbikKK3sKKyAgLyogbm90IHRoYXQgbXVjaCBoYXBwZW5zIGhlcmUsCisgICAqIGJ1dCB1cGRhdGluZyBhbnkgb2YgdGhpcyB2ZXJ5IGxpa2VseSBuZWVkcyB0byBoYXBwZW4gYWxsIGluIHN5bmMsCisgICAqIHVubGVzcyB0aGVyZSBpcyBhIHZlcnkgZ29vZCByZWFzb24gbm90IHRvICovCisKKyAgLyogZm9yIGNvbXB1dGluZyB0aGUgYXZnIGJpdHJhdGUgKi8KKyAgcGFkLT50b3RhbF9ieXRlcyArPSBidWZmZXJfc2l6ZTsKKyAgcGFkLT50b3RhbF9kdXJhdGlvbiArPSBkdXJhdGlvbjsKKyAgLyogZm9yIGtlZXBpbmcgdHJhY2sgb2Ygd2hlcmUgd2UgYXJlIGluIGNodW5rOworICAgKiBlbnN1cmVzIHRoYXQgZGF0YSByZWFsbHkgaXMgbG9jYXRlZCBhcyByZWNvcmRlZCBpbiBhdG9tcyAqLworICBxdG11eC0+Y3VycmVudF9jaHVua19zaXplICs9IGJ1ZmZlcl9zaXplOworICBxdG11eC0+Y3VycmVudF9jaHVua19kdXJhdGlvbiArPSBkdXJhdGlvbjsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfY2hlY2tfYW5kX3VwZGF0ZV90aW1lY29kZSAoR3N0UVRNdXggKiBxdG11eCwgR3N0UVRQYWQgKiBwYWQsCisgICAgR3N0QnVmZmVyICogYnVmLCBHc3RGbG93UmV0dXJuIHJldCkKK3sKKyAgR3N0VmlkZW9UaW1lQ29kZU1ldGEgKnRjX21ldGE7CisgIEdzdFZpZGVvVGltZUNvZGUgKnRjOworICBHc3RCdWZmZXIgKnRjX2J1ZjsKKyAgZ3NpemUgc3pyZXQ7CisgIGd1aW50MzIgZnJhbWVzX3NpbmNlX2RhaWx5X2phbTsKKyAgR3N0UVRNdXhDbGFzcyAqcXRtdXhfa2xhc3MgPSAoR3N0UVRNdXhDbGFzcyAqKSAoR19PQkpFQ1RfR0VUX0NMQVNTIChxdG11eCkpOworCisgIGlmIChxdG11eF9rbGFzcy0+Zm9ybWF0ICE9IEdTVF9RVF9NVVhfRk9STUFUX1FUKQorICAgIHJldHVybiByZXQ7CisKKyAgaWYgKGJ1ZiA9PSBOVUxMIHx8IChwYWQtPnRjX3RyYWsgIT0gTlVMTCAmJiBwYWQtPnRjX3BvcyA9PSAtMSkpCisgICAgcmV0dXJuIHJldDsKKworICB0Y19tZXRhID0gZ3N0X2J1ZmZlcl9nZXRfdmlkZW9fdGltZV9jb2RlX21ldGEgKGJ1Zik7CisgIGlmICghdGNfbWV0YSkKKyAgICByZXR1cm4gcmV0OworCisgIHRjID0gJnRjX21ldGEtPnRjOworCisgIC8qIFRoaXMgbWVhbnMgd2UgbmV2ZXIgZ290IGEgdGltZWNvZGUgYmVmb3JlICovCisgIGlmIChwYWQtPmZpcnN0X3RjID09IE5VTEwpIHsKKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgICAgZ2NoYXIgKnRjX3N0ciA9IGdzdF92aWRlb190aW1lX2NvZGVfdG9fc3RyaW5nICh0Yyk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJGb3VuZCBmaXJzdCB0aW1lY29kZSAlcyIsIHRjX3N0cik7CisgICAgZ19mcmVlICh0Y19zdHIpOworI2VuZGlmCisgICAgZ19hc3NlcnQgKHBhZC0+dGNfdHJhayA9PSBOVUxMKTsKKyAgICBwYWQtPmZpcnN0X3RjID0gZ3N0X3ZpZGVvX3RpbWVfY29kZV9jb3B5ICh0Yyk7CisgICAgLyogSWYgZnJhbWVzIGFyZSBvdXQgb2Ygb3JkZXIsIHRoZSBmcmFtZSB3ZSdyZSBjdXJyZW50bHkgZ2V0dGluZyBtaWdodAorICAgICAqIG5vdCBiZSB0aGUgZmlyc3Qgb25lLiBKdXN0IHdyaXRlIGEgMCB0aW1lY29kZSBmb3Igbm93IGFuZCB3YWl0CisgICAgICogdW50aWwgd2UgcmVjZWl2ZSBhIHRpbWVjb2RlIHRoYXQncyBsb3dlciB0aGFuIHRoZSBjdXJyZW50IG9uZSAqLworICAgIGlmIChwYWQtPmlzX291dF9vZl9vcmRlcikgeworICAgICAgcGFkLT5maXJzdF9wdHMgPSBHU1RfQlVGRkVSX1BUUyAoYnVmKTsKKyAgICAgIGZyYW1lc19zaW5jZV9kYWlseV9qYW0gPSAwOworICAgICAgLyogUG9zaXRpb24gdG8gcmV3cml0ZSAqLworICAgICAgcGFkLT50Y19wb3MgPSBxdG11eC0+bWRhdF9zaXplOworICAgIH0gZWxzZSB7CisgICAgICBmcmFtZXNfc2luY2VfZGFpbHlfamFtID0KKyAgICAgICAgICBnc3RfdmlkZW9fdGltZV9jb2RlX2ZyYW1lc19zaW5jZV9kYWlseV9qYW0gKHBhZC0+Zmlyc3RfdGMpOworICAgICAgZnJhbWVzX3NpbmNlX2RhaWx5X2phbSA9IEdVSU5UMzJfVE9fQkUgKGZyYW1lc19zaW5jZV9kYWlseV9qYW0pOworICAgIH0KKyAgICAvKiBXcml0ZSB0aGUgdGltZWNvZGUgdHJhayBub3cgKi8KKyAgICBwYWQtPnRjX3RyYWsgPSBhdG9tX3RyYWtfbmV3IChxdG11eC0+Y29udGV4dCk7CisgICAgYXRvbV9tb292X2FkZF90cmFrIChxdG11eC0+bW9vdiwgcGFkLT50Y190cmFrKTsKKworICAgIHBhZC0+dHJhay0+dHJlZiA9IGF0b21fdHJlZl9uZXcgKEZPVVJDQ190bWNkKTsKKyAgICBhdG9tX3RyZWZfYWRkX2VudHJ5IChwYWQtPnRyYWstPnRyZWYsIHBhZC0+dGNfdHJhay0+dGtoZC50cmFja19JRCk7CisKKyAgICBhdG9tX3RyYWtfc2V0X3RpbWVjb2RlX3R5cGUgKHBhZC0+dGNfdHJhaywgcXRtdXgtPmNvbnRleHQsCisgICAgICAgIHBhZC0+dHJhay0+bWRpYS5tZGhkLnRpbWVfaW5mby50aW1lc2NhbGUsIHBhZC0+Zmlyc3RfdGMpOworCisgICAgdGNfYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIDQsIE5VTEwpOworICAgIHN6cmV0ID0gZ3N0X2J1ZmZlcl9maWxsICh0Y19idWYsIDAsICZmcmFtZXNfc2luY2VfZGFpbHlfamFtLCA0KTsKKyAgICBnX2Fzc2VydCAoc3pyZXQgPT0gNCk7CisKKyAgICBhdG9tX3RyYWtfYWRkX3NhbXBsZXMgKHBhZC0+dGNfdHJhaywgMSwgMSwgNCwgcXRtdXgtPm1kYXRfc2l6ZSwgRkFMU0UsIDApOworICAgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9idWZmZXIgKHF0bXV4LCB0Y19idWYsICZxdG11eC0+bWRhdF9zaXplLCBUUlVFKTsKKworICAgIC8qIE5lZWQgdG8gcmVzZXQgdGhlIGN1cnJlbnQgY2h1bmsgKG9mIHRoZSBwcmV2aW91cyBwYWQpIGhlcmUgYmVjYXVzZQorICAgICAqIHNvbWUgb3RoZXIgZGF0YSB3YXMgd3JpdHRlbiBub3cgYWJvdmUsIGFuZCB0aGUgcGFkIGhhcyB0byBzdGFydCBhCisgICAgICogbmV3IGNodW5rIG5vdyAqLworICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX29mZnNldCA9IC0xOworICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX3NpemUgPSAwOworICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX2R1cmF0aW9uID0gMDsKKyAgfSBlbHNlIGlmIChxdG11eC0+bXV4X21vZGUgPT0gR1NUX1FUX01VWF9NT0RFX1JPQlVTVF9SRUNPUkRJTkdfUFJFRklMTCkgeworICAgIGZyYW1lc19zaW5jZV9kYWlseV9qYW0gPQorICAgICAgICBnc3RfdmlkZW9fdGltZV9jb2RlX2ZyYW1lc19zaW5jZV9kYWlseV9qYW0gKHBhZC0+Zmlyc3RfdGMpOworICAgIGZyYW1lc19zaW5jZV9kYWlseV9qYW0gPSBHVUlOVDMyX1RPX0JFIChmcmFtZXNfc2luY2VfZGFpbHlfamFtKTsKKworICAgIHRjX2J1ZiA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCA0LCBOVUxMKTsKKyAgICBzenJldCA9IGdzdF9idWZmZXJfZmlsbCAodGNfYnVmLCAwLCAmZnJhbWVzX3NpbmNlX2RhaWx5X2phbSwgNCk7CisgICAgZ19hc3NlcnQgKHN6cmV0ID09IDQpOworCisgICAgcmV0ID0gZ3N0X3F0X211eF9zZW5kX2J1ZmZlciAocXRtdXgsIHRjX2J1ZiwgJnF0bXV4LT5tZGF0X3NpemUsIFRSVUUpOworICAgIHBhZC0+dGNfcG9zID0gLTE7CisKKyAgICBxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQgPSAtMTsKKyAgICBxdG11eC0+Y3VycmVudF9jaHVua19zaXplID0gMDsKKyAgICBxdG11eC0+Y3VycmVudF9jaHVua19kdXJhdGlvbiA9IDA7CisgIH0gZWxzZSBpZiAocGFkLT5pc19vdXRfb2Zfb3JkZXIpIHsKKyAgICAvKiBDaGVjayBmb3IgYSBsb3dlciB0aW1lY29kZSB0aGFuIHRoZSBvbmUgc3RvcmVkICovCisgICAgZ19hc3NlcnQgKHBhZC0+dGNfdHJhayAhPSBOVUxMKTsKKyAgICBpZiAoR1NUX0JVRkZFUl9EVFMgKGJ1ZikgPD0gcGFkLT5maXJzdF9wdHMpIHsKKyAgICAgIGlmIChnc3RfdmlkZW9fdGltZV9jb2RlX2NvbXBhcmUgKHRjLCBwYWQtPmZpcnN0X3RjKSA9PSAtMSkgeworICAgICAgICBnc3RfdmlkZW9fdGltZV9jb2RlX2ZyZWUgKHBhZC0+Zmlyc3RfdGMpOworICAgICAgICBwYWQtPmZpcnN0X3RjID0gZ3N0X3ZpZGVvX3RpbWVfY29kZV9jb3B5ICh0Yyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGd1aW50NjQgYmtfc2l6ZSA9IHF0bXV4LT5tZGF0X3NpemU7CisgICAgICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgICAgICAvKiBJZiB0aGlzIGZyYW1lJ3MgRFRTIGlzIGFmdGVyIHRoZSBmaXJzdCBQVFMgcmVjZWl2ZWQsIGl0IG1lYW5zCisgICAgICAgKiB3ZSd2ZSBhbHJlYWR5IHJlY2VpdmVkIHRoZSBmaXJzdCBmcmFtZSB0byBiZSBwcmVzZW50ZWQuIE90aGVyd2lzZQorICAgICAgICogdGhlIGRlY29kZXIgd291bGQgbmVlZCB0byBnbyBiYWNrIGluIHRpbWUgKi8KKyAgICAgIGdzdF9xdF9tdXhfdXBkYXRlX3RpbWVjb2RlIChxdG11eCwgcGFkKTsKKworICAgICAgLyogUmVzZXQgd3JpdGluZyBwb3NpdGlvbiAqLworICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfQllURVMpOworICAgICAgc2VnbWVudC5zdGFydCA9IGJrX3NpemU7CisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHF0bXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisvKgorICogSGVyZSB3ZSBwdXNoIHRoZSBidWZmZXIgYW5kIHVwZGF0ZSB0aGUgdGFibGVzIGluIHRoZSB0cmFjayBhdG9tcworICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3F0X211eF9hZGRfYnVmZmVyIChHc3RRVE11eCAqIHF0bXV4LCBHc3RRVFBhZCAqIHBhZCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RCdWZmZXIgKmxhc3RfYnVmID0gTlVMTDsKKyAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uOworICBndWludCBuc2FtcGxlcywgc2FtcGxlX3NpemU7CisgIGd1aW50NjQgY2h1bmtfb2Zmc2V0OworICBnaW50NjQgbGFzdF9kdHMsIHNjYWxlZF9kdXJhdGlvbjsKKyAgZ2ludDY0IHB0c19vZmZzZXQgPSAwOworICBnYm9vbGVhbiBzeW5jID0gRkFMU0U7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGd1aW50IGJ1ZmZlcl9zaXplOworCisgIGlmICghcGFkLT5mb3VyY2MpCisgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKworICAvKiBpZiB0aGlzIHBhZCBoYXMgYSBwcmVwYXJlIGZ1bmN0aW9uLCBjYWxsIGl0ICovCisgIGlmIChwYWQtPnByZXBhcmVfYnVmX2Z1bmMgIT0gTlVMTCkgeworICAgIEdzdEJ1ZmZlciAqbmV3X2J1ZjsKKworICAgIG5ld19idWYgPSBwYWQtPnByZXBhcmVfYnVmX2Z1bmMgKHBhZCwgYnVmLCBxdG11eCk7CisgICAgaWYgKGJ1ZiAmJiAhbmV3X2J1ZikKKyAgICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgICBidWYgPSBuZXdfYnVmOworICB9CisKKyAgcmV0ID0gZ3N0X3F0X211eF9jaGVja19hbmRfdXBkYXRlX3RpbWVjb2RlIChxdG11eCwgcGFkLCBidWYsIHJldCk7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICBpZiAoYnVmKQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgbGFzdF9idWYgPSBwYWQtPmxhc3RfYnVmOworICBwYWQtPmxhc3RfYnVmID0gYnVmOworCisgIGlmIChsYXN0X2J1ZiA9PSBOVUxMKSB7CisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJQYWQgJXMgaGFzIG5vIHByZXZpb3VzIGJ1ZmZlciBzdG9yZWQgYW5kICIKKyAgICAgICAgICAicmVjZWl2ZWQgTlVMTCBidWZmZXIsIGRvaW5nIG5vdGhpbmciLAorICAgICAgICAgIEdTVF9QQURfTkFNRSAocGFkLT5jb2xsZWN0LnBhZCkpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocXRtdXgsCisgICAgICAgICAgIlBhZCAlcyBoYXMgbm8gcHJldmlvdXMgYnVmZmVyIHN0b3JlZCwgc3RvcmluZyBub3ciLAorICAgICAgICAgIEdTVF9QQURfTkFNRSAocGFkLT5jb2xsZWN0LnBhZCkpOworICAgIH0KKyNlbmRpZgorICAgIGdvdG8gZXhpdDsKKyAgfQorCisgIGlmICghR1NUX0JVRkZFUl9QVFNfSVNfVkFMSUQgKGxhc3RfYnVmKSkKKyAgICBnb3RvIG5vX3B0czsKKworICAvKiBpZiB0aGlzIGlzIHRoZSBmaXJzdCBidWZmZXIsIHN0b3JlIHRoZSB0aW1lc3RhbXAgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKHBhZC0+Zmlyc3RfdHMgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkpIHsKKyAgICBpZiAoR1NUX0JVRkZFUl9QVFNfSVNfVkFMSUQgKGxhc3RfYnVmKSkgeworICAgICAgcGFkLT5maXJzdF90cyA9IEdTVF9CVUZGRVJfUFRTIChsYXN0X2J1Zik7CisgICAgfSBlbHNlIGlmIChHU1RfQlVGRkVSX0RUU19JU19WQUxJRCAobGFzdF9idWYpKSB7CisgICAgICBwYWQtPmZpcnN0X3RzID0gR1NUX0JVRkZFUl9EVFMgKGxhc3RfYnVmKTsKKyAgICB9CisKKyAgICBpZiAoR1NUX0JVRkZFUl9EVFNfSVNfVkFMSUQgKGxhc3RfYnVmKSkgeworICAgICAgcGFkLT5maXJzdF9kdHMgPSBwYWQtPmxhc3RfZHRzID0gR1NUX0JVRkZFUl9EVFMgKGxhc3RfYnVmKTsKKyAgICB9IGVsc2UgaWYgKEdTVF9CVUZGRVJfUFRTX0lTX1ZBTElEIChsYXN0X2J1ZikpIHsKKyAgICAgIHBhZC0+Zmlyc3RfZHRzID0gcGFkLT5sYXN0X2R0cyA9IEdTVF9CVUZGRVJfUFRTIChsYXN0X2J1Zik7CisgICAgfQorCisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChwYWQtPmZpcnN0X3RzKSkgeworICAgICAgR1NUX0RFQlVHICgic2V0dGluZyBmaXJzdF90cyB0byAlIiBHX0dVSU5UNjRfRk9STUFULCBwYWQtPmZpcnN0X3RzKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgIkZpcnN0IGJ1ZmZlciBmb3IgcGFkICVzIGhhcyBubyB0aW1lc3RhbXAsICIKKyAgICAgICAgICAidXNpbmcgMCBhcyBmaXJzdCB0aW1lc3RhbXAiLCBHU1RfUEFEX05BTUUgKHBhZC0+Y29sbGVjdC5wYWQpKTsKKyAgICAgIHBhZC0+Zmlyc3RfdHMgPSBwYWQtPmZpcnN0X2R0cyA9IDA7CisgICAgfQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiU3RvcmVkIGZpcnN0IHRpbWVzdGFtcCBmb3IgcGFkICVzICUiCisgICAgICAgIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1BBRF9OQU1FIChwYWQtPmNvbGxlY3QucGFkKSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAocGFkLT5maXJzdF90cykpOworICB9CisKKyAgaWYgKGJ1ZiAmJiBHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoR1NUX0JVRkZFUl9EVFMgKGJ1ZikpICYmCisgICAgICBHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoR1NUX0JVRkZFUl9EVFMgKGxhc3RfYnVmKSkgJiYKKyAgICAgIEdTVF9CVUZGRVJfRFRTIChidWYpIDwgR1NUX0JVRkZFUl9EVFMgKGxhc3RfYnVmKSkgeworICAgIEdTVF9FUlJPUiAoImRlY3JlYXNpbmcgRFRTIHZhbHVlICUiIEdTVF9USU1FX0ZPUk1BVCAiIDwgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RUUyAoYnVmKSksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFRTIChsYXN0X2J1ZikpKTsKKyAgICBwYWQtPmxhc3RfYnVmID0gYnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChidWYpOworICAgIEdTVF9CVUZGRVJfRFRTIChidWYpID0gR1NUX0JVRkZFUl9EVFMgKGxhc3RfYnVmKTsKKyAgfQorCisgIGJ1ZmZlcl9zaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAobGFzdF9idWYpOworCisgIGlmIChxdG11eC0+bXV4X21vZGUgPT0gR1NUX1FUX01VWF9NT0RFX1JPQlVTVF9SRUNPUkRJTkdfUFJFRklMTCkgeworICAgIGd1aW50IHJlcXVpcmVkX2J1ZmZlcl9zaXplID0gcHJlZmlsbF9nZXRfc2FtcGxlX3NpemUgKHF0bXV4LCBwYWQpOworICAgIGd1aW50IGZpbGxfc2l6ZSA9IHJlcXVpcmVkX2J1ZmZlcl9zaXplIC0gYnVmZmVyX3NpemU7CisgICAgR3N0TWVtb3J5ICptZW07CisgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICBpZiAocmVxdWlyZWRfYnVmZmVyX3NpemUgPCBidWZmZXJfc2l6ZSkgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXV4LCBTVFJFQU0sIE1VWCwgKE5VTEwpLAorICAgICAgICAgICgiU2FtcGxlIHNpemUgJXUgYmlnZ2VyIHRoYW4gZXhwZWN0ZWQgbWF4aW11bSAldSIsIGJ1ZmZlcl9zaXplLAorICAgICAgICAgICAgICByZXF1aXJlZF9idWZmZXJfc2l6ZSkpOworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChmaWxsX3NpemUgPiAwKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwKKyAgICAgICAgICAiUGFkZGluZyBidWZmZXIgYnkgJXUgYnl0ZXMgdG8gcmVhY2ggcmVxdWlyZWQgJXUgYnl0ZXMiLCBmaWxsX3NpemUsCisgICAgICAgICAgcmVxdWlyZWRfYnVmZmVyX3NpemUpOworICAgICAgbWVtID0gZ3N0X2FsbG9jYXRvcl9hbGxvYyAoTlVMTCwgZmlsbF9zaXplLCBOVUxMKTsKKyAgICAgIGdzdF9tZW1vcnlfbWFwIChtZW0sICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgICAgbWVtc2V0IChtYXAuZGF0YSwgMCwgbWFwLnNpemUpOworICAgICAgZ3N0X21lbW9yeV91bm1hcCAobWVtLCAmbWFwKTsKKyAgICAgIGxhc3RfYnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChsYXN0X2J1Zik7CisgICAgICBnc3RfYnVmZmVyX2FwcGVuZF9tZW1vcnkgKGxhc3RfYnVmLCBtZW0pOworICAgICAgYnVmZmVyX3NpemUgPSByZXF1aXJlZF9idWZmZXJfc2l6ZTsKKyAgICB9CisgIH0KKworICAvKiBkdXJhdGlvbiBhY3R1YWxseSBtZWFucyB0aW1lIGRlbHRhIGJldHdlZW4gc2FtcGxlcywgc28gd2UgY2FsY3VsYXRlCisgICAqIHRoZSBkdXJhdGlvbiBiYXNlZCBvbiB0aGUgZGlmZmVyZW5jZSBpbiBEVFMgb3IgUFRTLCBmYWxsaW5nIGJhY2sKKyAgICogdG8gRFVSQVRJT04gaWYgdGhlIG90aGVyIHR3byBkb24ndCBleGlzdCwgc3VjaCBhcyB3aXRoIHRoZSBsYXN0CisgICAqIHNhbXBsZSBiZWZvcmUgRU9TLiBPciB1c2UgMCBpZiBub3RoaW5nIGVsc2UgaXMgYXZhaWxhYmxlICovCisgIGlmIChHU1RfQlVGRkVSX0RVUkFUSU9OX0lTX1ZBTElEIChsYXN0X2J1ZikpCisgICAgZHVyYXRpb24gPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChsYXN0X2J1Zik7CisgIGVsc2UKKyAgICBkdXJhdGlvbiA9IDA7CisgIGlmICghcGFkLT5zcGFyc2UpIHsKKyAgICBpZiAoYnVmICYmIEdTVF9CVUZGRVJfRFRTX0lTX1ZBTElEIChidWYpCisgICAgICAgICYmIEdTVF9CVUZGRVJfRFRTX0lTX1ZBTElEIChsYXN0X2J1ZikpCisgICAgICBkdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFRTIChidWYpIC0gR1NUX0JVRkZFUl9EVFMgKGxhc3RfYnVmKTsKKyAgICBlbHNlIGlmIChidWYgJiYgR1NUX0JVRkZFUl9QVFNfSVNfVkFMSUQgKGJ1ZikKKyAgICAgICAgJiYgR1NUX0JVRkZFUl9QVFNfSVNfVkFMSUQgKGxhc3RfYnVmKSkKKyAgICAgIGR1cmF0aW9uID0gR1NUX0JVRkZFUl9QVFMgKGJ1ZikgLSBHU1RfQlVGRkVSX1BUUyAobGFzdF9idWYpOworICB9CisKKyAgaWYgKHF0bXV4LT5jdXJyZW50X3BhZCAhPSBwYWQgfHwgcXRtdXgtPmN1cnJlbnRfY2h1bmtfb2Zmc2V0ID09IC0xKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsCisgICAgICAgICJTd2l0Y2hpbmcgdG8gbmV4dCBjaHVuayBmb3IgcGFkICVzOiVzOiBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAiLCBzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgZHVyYXRpb24gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfREVCVUdfUEFEX05BTUUgKHBhZC0+Y29sbGVjdC5wYWQpLCBxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQsCisgICAgICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX3NpemUsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHF0bXV4LT5jdXJyZW50X2NodW5rX2R1cmF0aW9uKSk7CisgICAgcXRtdXgtPmN1cnJlbnRfcGFkID0gcGFkOworICAgIGlmIChxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQgPT0gLTEpCisgICAgICBxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQgPSBxdG11eC0+bWRhdF9zaXplOworICAgIGVsc2UKKyAgICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX29mZnNldCArPSBxdG11eC0+Y3VycmVudF9jaHVua19zaXplOworICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX3NpemUgPSAwOworICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX2R1cmF0aW9uID0gMDsKKyAgfQorCisgIGxhc3RfZHRzID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX3JvdW5kIChwYWQtPmxhc3RfZHRzLAorICAgICAgYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHBhZC0+dHJhayksIEdTVF9TRUNPTkQpOworCisgIC8qIGZyYWdtZW50cyBvbmx5IGRlYWwgd2l0aCAxIGJ1ZmZlciA9PSAxIGNodW5rICg9PSAxIHNhbXBsZSkgKi8KKyAgaWYgKHBhZC0+c2FtcGxlX3NpemUgJiYgIXF0bXV4LT5mcmFnbWVudF9zZXF1ZW5jZSkgeworICAgIEdzdENsb2NrVGltZSBleHBlY3RlZF90aW1lc3RhbXA7CisKKyAgICAvKiBDb25zdGFudCBzaXplIHBhY2tldHM6IHVzdWFsbHkgcmF3IGF1ZGlvICh3aXRoIG1hbnkgc2FtcGxlcyBwZXIKKyAgICAgICBidWZmZXIgKD0gY2h1bmspKSwgYnV0IGNhbiBhbHNvIGJlIGZpeGVkLXBhY2tldC1zaXplIGNvZGVjcyBsaWtlIEFEUENNCisgICAgICovCisgICAgc2FtcGxlX3NpemUgPSBwYWQtPnNhbXBsZV9zaXplOworICAgIGlmIChidWZmZXJfc2l6ZSAlIHNhbXBsZV9zaXplICE9IDApCisgICAgICBnb3RvIGZyYWdtZW50ZWRfc2FtcGxlOworCisgICAgLyogbm90ZTogcXQgcmF3IGF1ZGlvIHN0b3JhZ2Ugd2FycHMgaXQgaW1wbGljaXRseSBpbnRvIGEgdGltZXdpc2UKKyAgICAgKiBwZXJmZWN0IHN0cmVhbSwgZGlzY2FyZGluZyBidWZmZXIgdGltZXMuCisgICAgICogSWYgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBQVFMgYW5kIHRoZSBleHBlY3RlZCBvbmUKKyAgICAgKiBiZWNvbWVzIHRvbyBiaWcsIHdlIGVycm9yIG91dDogdGhlcmUgd2FzIGEgZ2FwIGFuZCB3ZSBoYXZlIG5vIHdheSB0bworICAgICAqIHJlcHJlc2VudCB0aGF0LCBjYXVzaW5nIEEvViBzeW5jIHRvIGJlIG9mZiAqLworICAgIGV4cGVjdGVkX3RpbWVzdGFtcCA9CisgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAocGFkLT5zYW1wbGVfb2Zmc2V0LCBHU1RfU0VDT05ELAorICAgICAgICBhdG9tX3RyYWtfZ2V0X3RpbWVzY2FsZSAocGFkLT50cmFrKSkgKyBwYWQtPmZpcnN0X3RzOworICAgIGlmIChBQlNESUZGIChHU1RfQlVGRkVSX0RUU19PUl9QVFMgKGxhc3RfYnVmKSwKKyAgICAgICAgICAgIGV4cGVjdGVkX3RpbWVzdGFtcCkgPiBxdG11eC0+bWF4X3Jhd19hdWRpb19kcmlmdCkKKyAgICAgIGdvdG8gcmF3X2F1ZGlvX3RpbWVzdGFtcF9kcmlmdDsKKworICAgIGlmIChHU1RfQlVGRkVSX0RVUkFUSU9OIChsYXN0X2J1ZikgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgICAgbnNhbXBsZXMgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGxhc3RfYnVmKSwKKyAgICAgICAgICBhdG9tX3RyYWtfZ2V0X3RpbWVzY2FsZSAocGFkLT50cmFrKSwgR1NUX1NFQ09ORCk7CisgICAgICBkdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGxhc3RfYnVmKTsKKyAgICB9IGVsc2UgeworICAgICAgbnNhbXBsZXMgPSBidWZmZXJfc2l6ZSAvIHNhbXBsZV9zaXplOworICAgICAgZHVyYXRpb24gPQorICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAobnNhbXBsZXMsIEdTVF9TRUNPTkQsCisgICAgICAgICAgYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHBhZC0+dHJhaykpOworICAgIH0KKworICAgIC8qIHRpbWVzY2FsZSA9IHNhbXBsZXJhdGUgKi8KKyAgICBzY2FsZWRfZHVyYXRpb24gPSAxOworICAgIHBhZC0+bGFzdF9kdHMgPQorICAgICAgICBwYWQtPmZpcnN0X2R0cyArIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAocGFkLT5zYW1wbGVfb2Zmc2V0ICsKKyAgICAgICAgbnNhbXBsZXMsIEdTVF9TRUNPTkQsIGF0b21fdHJha19nZXRfdGltZXNjYWxlIChwYWQtPnRyYWspKTsKKyAgfSBlbHNlIHsKKyAgICBuc2FtcGxlcyA9IDE7CisgICAgc2FtcGxlX3NpemUgPSBidWZmZXJfc2l6ZTsKKyAgICBpZiAoIXBhZC0+c3BhcnNlICYmICgoYnVmICYmIEdTVF9CVUZGRVJfRFRTX0lTX1ZBTElEIChidWYpKQorICAgICAgICAgICAgfHwgR1NUX0JVRkZFUl9EVFNfSVNfVkFMSUQgKGxhc3RfYnVmKSkpIHsKKyAgICAgIGdpbnQ2NCBzY2FsZWRfZHRzOworICAgICAgaWYgKGJ1ZiAmJiBHU1RfQlVGRkVSX0RUU19JU19WQUxJRCAoYnVmKSkgeworICAgICAgICBwYWQtPmxhc3RfZHRzID0gR1NUX0JVRkZFUl9EVFMgKGJ1Zik7CisgICAgICB9IGVsc2UgeworICAgICAgICBwYWQtPmxhc3RfZHRzID0gR1NUX0JVRkZFUl9EVFMgKGxhc3RfYnVmKSArIGR1cmF0aW9uOworICAgICAgfQorICAgICAgaWYgKChnaW50NjQpIChwYWQtPmxhc3RfZHRzKSA8IDApIHsKKyAgICAgICAgc2NhbGVkX2R0cyA9IC1nc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKC1wYWQtPmxhc3RfZHRzLAorICAgICAgICAgICAgYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHBhZC0+dHJhayksIEdTVF9TRUNPTkQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2NhbGVkX2R0cyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAocGFkLT5sYXN0X2R0cywKKyAgICAgICAgICAgIGF0b21fdHJha19nZXRfdGltZXNjYWxlIChwYWQtPnRyYWspLCBHU1RfU0VDT05EKTsKKyAgICAgIH0KKyAgICAgIHNjYWxlZF9kdXJhdGlvbiA9IHNjYWxlZF9kdHMgLSBsYXN0X2R0czsKKyAgICAgIGxhc3RfZHRzID0gc2NhbGVkX2R0czsKKyAgICB9IGVsc2UgeworICAgICAgLyogZmlyc3QgY29udmVydCBpbnRlbmRlZCB0aW1lc3RhbXAgKGluIEdzdENsb2NrVGltZSByZXNvbHV0aW9uKSB0bworICAgICAgICogdHJhayB0aW1lc2NhbGUsIHRoZW4gZGVyaXZlIGRlbHRhOworICAgICAgICogdGhpcyBlbnN1cmVzIHN1bXMgb2YgKHNjYWxlKWRlbHRhIGFkZCB1cCB0byBjb252ZXJ0ZWQgdGltZXN0YW1wLAorICAgICAgICogd2hpY2ggb25seSBkZXZpYXRlcyBhdCBtb3N0IDEvc2NhbGUgZnJvbSB0aW1lc3RhbXAgaXRzZWxmICovCisgICAgICBzY2FsZWRfZHVyYXRpb24gPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKHBhZC0+bGFzdF9kdHMgKyBkdXJhdGlvbiwKKyAgICAgICAgICBhdG9tX3RyYWtfZ2V0X3RpbWVzY2FsZSAocGFkLT50cmFrKSwgR1NUX1NFQ09ORCkgLSBsYXN0X2R0czsKKyAgICAgIHBhZC0+bGFzdF9kdHMgKz0gZHVyYXRpb247CisgICAgfQorICB9CisKKyAgZ3N0X3F0X211eF9yZWdpc3Rlcl9idWZmZXJfaW5fY2h1bmsgKHF0bXV4LCBwYWQsIGJ1ZmZlcl9zaXplLCBkdXJhdGlvbik7CisKKyAgY2h1bmtfb2Zmc2V0ID0gcXRtdXgtPmN1cnJlbnRfY2h1bmtfb2Zmc2V0OworCisgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwKKyAgICAgICJQYWQgKCVzKSBkdHMgdXBkYXRlZCB0byAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfUEFEX05BTUUgKHBhZC0+Y29sbGVjdC5wYWQpLCBHU1RfVElNRV9BUkdTIChwYWQtPmxhc3RfZHRzKSk7CisgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwKKyAgICAgICJBZGRpbmcgJWQgc2FtcGxlcyB0byB0cmFjaywgZHVyYXRpb246ICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICIgc2l6ZTogJSIgR19HVUlOVDMyX0ZPUk1BVCAiIGNodW5rIG9mZnNldDogJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgIG5zYW1wbGVzLCBzY2FsZWRfZHVyYXRpb24sIHNhbXBsZV9zaXplLCBjaHVua19vZmZzZXQpOworCisgIC8qIG1pZ2h0IGJlIGEgc3luYyBzYW1wbGUgKi8KKyAgaWYgKHBhZC0+c3luYyAmJgorICAgICAgIUdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGxhc3RfYnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCkpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRtdXgsICJBZGRpbmcgbmV3IHN5bmMgc2FtcGxlIGVudHJ5IGZvciB0cmFjayBvZiBwYWQgJXMiLAorICAgICAgICBHU1RfUEFEX05BTUUgKHBhZC0+Y29sbGVjdC5wYWQpKTsKKyAgICBzeW5jID0gVFJVRTsKKyAgfQorCisgIGlmIChHU1RfQlVGRkVSX0RUU19JU19WQUxJRCAobGFzdF9idWYpKSB7CisgICAgbGFzdF9kdHMgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKEdTVF9CVUZGRVJfRFRTIChsYXN0X2J1ZiksCisgICAgICAgIGF0b21fdHJha19nZXRfdGltZXNjYWxlIChwYWQtPnRyYWspLCBHU1RfU0VDT05EKTsKKyAgICBwdHNfb2Zmc2V0ID0KKyAgICAgICAgKGdpbnQ2NCkgKGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAoR1NUX0JVRkZFUl9QVFMgKGxhc3RfYnVmKSwKKyAgICAgICAgICAgIGF0b21fdHJha19nZXRfdGltZXNjYWxlIChwYWQtPnRyYWspLCBHU1RfU0VDT05EKSAtIGxhc3RfZHRzKTsKKyAgfSBlbHNlIHsKKyAgICBwdHNfb2Zmc2V0ID0gMDsKKyAgICBsYXN0X2R0cyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAoR1NUX0JVRkZFUl9QVFMgKGxhc3RfYnVmKSwKKyAgICAgICAgYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHBhZC0+dHJhayksIEdTVF9TRUNPTkQpOworICB9CisgIEdTVF9ERUJVRyAoImR0czogJSIgR1NUX1RJTUVfRk9STUFUICIgcHRzOiAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIgdGltZWJhc2VfZHRzOiAlZCBwdHNfb2Zmc2V0OiAlZCIsCisgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RUUyAobGFzdF9idWYpKSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfUFRTIChsYXN0X2J1ZikpLAorICAgICAgKGludCkgKGxhc3RfZHRzKSwgKGludCkgKHB0c19vZmZzZXQpKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGR1cmF0aW9uKQorICAgICAgJiYgKHF0bXV4LT5jdXJyZW50X2NodW5rX2R1cmF0aW9uID4gcXRtdXgtPmxvbmdlc3RfY2h1bmsKKyAgICAgICAgICB8fCAhR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHF0bXV4LT5sb25nZXN0X2NodW5rKSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwKKyAgICAgICAgIk5ldyBsb25nZXN0IGNodW5rIGZvdW5kOiAlIiBHU1RfVElNRV9GT1JNQVQgIiwgcGFkICVzIiwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAocXRtdXgtPmN1cnJlbnRfY2h1bmtfZHVyYXRpb24pLAorICAgICAgICBHU1RfUEFEX05BTUUgKHBhZC0+Y29sbGVjdC5wYWQpKTsKKyAgICBxdG11eC0+bG9uZ2VzdF9jaHVuayA9IHF0bXV4LT5jdXJyZW50X2NodW5rX2R1cmF0aW9uOworICB9CisKKyAgaWYgKHF0bXV4LT5tdXhfbW9kZSA9PSBHU1RfUVRfTVVYX01PREVfUk9CVVNUX1JFQ09SRElOR19QUkVGSUxMKSB7CisgICAgY29uc3QgVHJha0J1ZmZlckVudHJ5SW5mbyAqc2FtcGxlX2VudHJ5OworICAgIGd1aW50NjQgYmxvY2tfaWR4ID0gcHJlZmlsbF9nZXRfYmxvY2tfaW5kZXggKHF0bXV4LCBwYWQpOworCisgICAgaWYgKGJsb2NrX2lkeCA+PSBwYWQtPnNhbXBsZXMtPmxlbikgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXV4LCBTVFJFQU0sIE1VWCwgKE5VTEwpLAorICAgICAgICAgICgiVW5leHBlY3RlZCBzYW1wbGUgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBleHBlY3RlZCB1cCB0byAldSIsCisgICAgICAgICAgICAgIGJsb2NrX2lkeCwgcGFkLT5zYW1wbGVzLT5sZW4pKTsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiBhbGwgdmFsdWVzIGFyZSBhcyBleHBlY3RlZCAqLworICAgIHNhbXBsZV9lbnRyeSA9CisgICAgICAgICZnX2FycmF5X2luZGV4IChwYWQtPnNhbXBsZXMsIFRyYWtCdWZmZXJFbnRyeUluZm8sIGJsb2NrX2lkeCk7CisKKyAgICBpZiAoY2h1bmtfb2Zmc2V0IDwgc2FtcGxlX2VudHJ5LT5jaHVua19vZmZzZXQpIHsKKyAgICAgIGd1aW50IGZpbGxfc2l6ZSA9IHNhbXBsZV9lbnRyeS0+Y2h1bmtfb2Zmc2V0IC0gY2h1bmtfb2Zmc2V0OworICAgICAgR3N0QnVmZmVyICpmaWxsX2J1ZjsKKworICAgICAgZmlsbF9idWYgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgZmlsbF9zaXplLCBOVUxMKTsKKyAgICAgIGdzdF9idWZmZXJfbWVtc2V0IChmaWxsX2J1ZiwgMCwgMCwgZmlsbF9zaXplKTsKKworICAgICAgcmV0ID0gZ3N0X3F0X211eF9zZW5kX2J1ZmZlciAocXRtdXgsIGZpbGxfYnVmLCAmcXRtdXgtPm1kYXRfc2l6ZSwgVFJVRSk7CisgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICBnb3RvIGJhaWw7CisgICAgICBxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQgPSBjaHVua19vZmZzZXQgPSBzYW1wbGVfZW50cnktPmNodW5rX29mZnNldDsKKyAgICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX3NpemUgPSBidWZmZXJfc2l6ZTsKKyAgICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX2R1cmF0aW9uID0gZHVyYXRpb247CisgICAgfSBlbHNlIGlmIChjaHVua19vZmZzZXQgIT0gc2FtcGxlX2VudHJ5LT5jaHVua19vZmZzZXQpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdG11eCwgU1RSRUFNLCBNVVgsIChOVUxMKSwKKyAgICAgICAgICAoIlVuZXhwZWN0ZWQgY2h1bmsgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgZXhwZWN0ZWQgdXAgdG8gJSIKKyAgICAgICAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgY2h1bmtfb2Zmc2V0LCBzYW1wbGVfZW50cnktPmNodW5rX29mZnNldCkpOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfQorCisgIC8qIG5vdyB3ZSBnbyBhbmQgcmVnaXN0ZXIgdGhpcyBidWZmZXIvc2FtcGxlIGFsbCBvdmVyICovCisgIHJldCA9IGdzdF9xdF9tdXhfcmVnaXN0ZXJfYW5kX3B1c2hfc2FtcGxlIChxdG11eCwgcGFkLCBsYXN0X2J1ZiwKKyAgICAgIGJ1ZiA9PSBOVUxMLCBuc2FtcGxlcywgbGFzdF9kdHMsIHNjYWxlZF9kdXJhdGlvbiwgc2FtcGxlX3NpemUsCisgICAgICBjaHVua19vZmZzZXQsIHN5bmMsIFRSVUUsIHB0c19vZmZzZXQpOworICBwYWQtPnNhbXBsZV9vZmZzZXQgKz0gbnNhbXBsZXM7CisKKyAgLyogaWYgdGhpcyBpcyBzcGFyc2UgYW5kIHdlIGhhdmUgYSBuZXh0IGJ1ZmZlciwgY2hlY2sgaWYgdGhlcmUgaXMgYW55IGdhcAorICAgKiBiZXR3ZWVuIHRoZW0gdG8gaW5zZXJ0IGFuIGVtcHR5IHNhbXBsZSAqLworICBpZiAocGFkLT5zcGFyc2UgJiYgYnVmKSB7CisgICAgaWYgKHBhZC0+Y3JlYXRlX2VtcHR5X2J1ZmZlcikgeworICAgICAgR3N0QnVmZmVyICplbXB0eV9idWY7CisgICAgICBnaW50NjQgZW1wdHlfZHVyYXRpb24gPQorICAgICAgICAgIEdTVF9CVUZGRVJfUFRTIChidWYpIC0gKEdTVF9CVUZGRVJfUFRTIChsYXN0X2J1ZikgKyBkdXJhdGlvbik7CisgICAgICBnaW50NjQgZW1wdHlfZHVyYXRpb25fc2NhbGVkOworICAgICAgZ3VpbnQgZW1wdHlfc2l6ZTsKKworICAgICAgZW1wdHlfYnVmID0gcGFkLT5jcmVhdGVfZW1wdHlfYnVmZmVyIChwYWQsIGVtcHR5X2R1cmF0aW9uKTsKKworICAgICAgcGFkLT5sYXN0X2R0cyA9IEdTVF9CVUZGRVJfUFRTIChidWYpOworICAgICAgZW1wdHlfZHVyYXRpb25fc2NhbGVkID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX3JvdW5kIChwYWQtPmxhc3RfZHRzLAorICAgICAgICAgIGF0b21fdHJha19nZXRfdGltZXNjYWxlIChwYWQtPnRyYWspLCBHU1RfU0VDT05EKQorICAgICAgICAgIC0gKGxhc3RfZHRzICsgc2NhbGVkX2R1cmF0aW9uKTsKKyAgICAgIGVtcHR5X3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChlbXB0eV9idWYpOworCisgICAgICBnc3RfcXRfbXV4X3JlZ2lzdGVyX2J1ZmZlcl9pbl9jaHVuayAocXRtdXgsIHBhZCwgZW1wdHlfc2l6ZSwKKyAgICAgICAgICBlbXB0eV9kdXJhdGlvbik7CisKKyAgICAgIHJldCA9CisgICAgICAgICAgZ3N0X3F0X211eF9yZWdpc3Rlcl9hbmRfcHVzaF9zYW1wbGUgKHF0bXV4LCBwYWQsIGVtcHR5X2J1ZiwgRkFMU0UsIDEsCisgICAgICAgICAgbGFzdF9kdHMgKyBzY2FsZWRfZHVyYXRpb24sIGVtcHR5X2R1cmF0aW9uX3NjYWxlZCwKKyAgICAgICAgICBlbXB0eV9zaXplLCBjaHVua19vZmZzZXQsIHN5bmMsIFRSVUUsIDApOworICAgIH0gZWxzZSB7CisgICAgICAvKiBvdXIgb25seSBjYXNlIGN1cnJlbnRseSBpcyB0eDNnIHN1YnRpdGxlcywgc28gdGhlcmUgaXMgbm8gcmVhc29uIHRvIGZpbGwgdGhpcyB5ZXQgKi8KKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwKKyAgICAgICAgICAibm8gZW1wdHkgYnVmZmVyIGNyZWF0aW9uIGZ1bmN0aW9uIGZvdW5kIGZvciBwYWQgJXMiLAorICAgICAgICAgIEdTVF9QQURfTkFNRSAocGFkLT5jb2xsZWN0LnBhZCkpOworICAgIH0KKyAgfQorCitleGl0OgorCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCitiYWlsOgorICB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAobGFzdF9idWYpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorZnJhZ21lbnRlZF9zYW1wbGU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtdXgsIFNUUkVBTSwgTVVYLCAoTlVMTCksCisgICAgICAgICgiQXVkaW8gYnVmZmVyIGNvbnRhaW5zIGZyYWdtZW50ZWQgc2FtcGxlLiIpKTsKKyAgICBnb3RvIGJhaWw7CisgIH0KK3Jhd19hdWRpb190aW1lc3RhbXBfZHJpZnQ6CisgIHsKKyAgICAvKiBUT0RPOiBDb3VsZCBpbiB0aGVvcnkgYmUgaW1wbGVtZW50ZWQgd2l0aCBlZGl0IGxpc3RzICovCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXV4LCBTVFJFQU0sIE1VWCwgKE5VTEwpLAorICAgICAgICAoIkF1ZGlvIHN0cmVhbSB0aW1lc3RhbXBzIGFyZSBkcmlmdGluZyAoZ290ICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAgICAgIiwgZXhwZWN0ZWQgJSIgR1NUX1RJTUVfRk9STUFUICIpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgeWV0ISIsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RUU19PUl9QVFMgKGxhc3RfYnVmKSksCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChnc3RfdXRpbF91aW50NjRfc2NhbGUgKHBhZC0+c2FtcGxlX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgR1NUX1NFQ09ORCwKKyAgICAgICAgICAgICAgICAgICAgYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHBhZC0+dHJhaykpICsgcGFkLT5maXJzdF90cykpKTsKKyAgICBnb3RvIGJhaWw7CisgIH0KK25vX3B0czoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdG11eCwgU1RSRUFNLCBNVVgsIChOVUxMKSwgKCJCdWZmZXIgaGFzIG5vIFBUUy4iKSk7CisgICAgZ290byBiYWlsOworICB9Citub3RfbmVnb3RpYXRlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdG11eCwgQ09SRSwgTkVHT1RJQVRJT04sIChOVUxMKSwKKyAgICAgICAgKCJmb3JtYXQgd2Fzbid0IG5lZ290aWF0ZWQgYmVmb3JlIGJ1ZmZlciBmbG93IG9uIHBhZCAlcyIsCisgICAgICAgICAgICBHU1RfUEFEX05BTUUgKHBhZC0+Y29sbGVjdC5wYWQpKSk7CisgICAgaWYgKGJ1ZikKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICB9Cit9CisKKy8qCisgKiBEVFMgcnVubmluZyB0aW1lIGNhbiBiZSBuZWdhdGl2ZS4gVGhlcmUgaXMgbm8gd2F5IHRvIHJlcHJlc2VudCB0aGF0IGluCisgKiBNUDQgaG93ZXZlciwgdGh1cyB3ZSBuZWVkIHRvIG9mZnNldCBEVFMgc28gdGhhdCBpdCBzdGFydHMgZnJvbSAwLgorICovCitzdGF0aWMgdm9pZAorZ3N0X3F0X3BhZF9hZGp1c3RfYnVmZmVyX2R0cyAoR3N0UVRNdXggKiBxdG11eCwgR3N0UVRQYWQgKiBwYWQsCisgICAgR3N0Q29sbGVjdERhdGEgKiBjZGF0YSwgR3N0QnVmZmVyICoqIGJ1ZikKK3sKKyAgR3N0Q2xvY2tUaW1lIHB0czsKKyAgZ2ludDY0IGR0czsKKworICBwdHMgPSBHU1RfQlVGRkVSX1BUUyAoKmJ1Zik7CisgIGR0cyA9IEdTVF9DT0xMRUNUX1BBRFNfRFRTIChjZGF0YSk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHF0bXV4LCAic2VsZWN0ZWQgcGFkICVzIHdpdGggUFRTICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiBhbmQgRFRTICUiIEdTVF9TVElNRV9GT1JNQVQsIEdTVF9QQURfTkFNRSAoY2RhdGEtPnBhZCksCisgICAgICBHU1RfVElNRV9BUkdTIChwdHMpLCBHU1RfU1RJTUVfQVJHUyAoZHRzKSk7CisKKyAgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAocGFkLT5kdHNfYWRqdXN0bWVudCkpIHsKKyAgICBpZiAoR1NUX0NMT0NLX1NUSU1FX0lTX1ZBTElEIChkdHMpICYmIGR0cyA8IDApCisgICAgICBwYWQtPmR0c19hZGp1c3RtZW50ID0gLWR0czsKKyAgICBlbHNlCisgICAgICBwYWQtPmR0c19hZGp1c3RtZW50ID0gMDsKKyAgfQorCisgIGlmIChwYWQtPmR0c19hZGp1c3RtZW50ID4gMCkgeworICAgICpidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKCpidWYpOworCisgICAgZHRzICs9IHBhZC0+ZHRzX2FkanVzdG1lbnQ7CisKKyAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHB0cykpCisgICAgICBwdHMgKz0gcGFkLT5kdHNfYWRqdXN0bWVudDsKKworICAgIGlmIChHU1RfQ0xPQ0tfU1RJTUVfSVNfVkFMSUQgKGR0cykgJiYgZHRzIDwgMCkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYWQsICJEZWNyZWFzaW5nIERUUy4iKTsKKyAgICAgIGR0cyA9IDA7CisgICAgfQorCisgICAgaWYgKHB0cyA8IGR0cykgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYWQsICJEVFMgaXMgYmlnZ2VyIHRoZW4gUFRTIik7CisgICAgICBwdHMgPSBkdHM7CisgICAgfQorCisgICAgR1NUX0JVRkZFUl9QVFMgKCpidWYpID0gcHRzOworICAgIEdTVF9CVUZGRVJfRFRTICgqYnVmKSA9IGR0czsKKworICAgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwgInRpbWUgYWRqdXN0ZWQgdG8gUFRTICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAiIGFuZCBEVFMgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChwdHMpLCBHU1RfVElNRV9BUkdTIChkdHMpKTsKKyAgfQorfQorCitzdGF0aWMgR3N0UVRQYWQgKgorZmluZF9iZXN0X3BhZCAoR3N0UVRNdXggKiBxdG11eCwgR3N0Q29sbGVjdFBhZHMgKiBwYWRzKQoreworICBHU0xpc3QgKndhbGs7CisgIEdzdFFUUGFkICpiZXN0X3BhZCA9IE5VTEw7CisKKyAgaWYgKHF0bXV4LT5tdXhfbW9kZSA9PSBHU1RfUVRfTVVYX01PREVfUk9CVVNUX1JFQ09SRElOR19QUkVGSUxMKSB7CisgICAgZ3VpbnQ2NCBzbWFsbGVzdF9vZmZzZXQgPSBHX01BWFVJTlQ2NDsKKyAgICBndWludDY0IGNodW5rX29mZnNldCA9IDA7CisKKyAgICBmb3IgKHdhbGsgPSBxdG11eC0+Y29sbGVjdC0+ZGF0YTsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICAgIEdzdENvbGxlY3REYXRhICpjZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSB3YWxrLT5kYXRhOworICAgICAgR3N0UVRQYWQgKnF0cGFkID0gKEdzdFFUUGFkICopIGNkYXRhOworICAgICAgY29uc3QgVHJha0J1ZmZlckVudHJ5SW5mbyAqc2FtcGxlX2VudHJ5OworICAgICAgZ3VpbnQ2NCBibG9ja19pZHgsIGN1cnJlbnRfYmxvY2tfaWR4OworICAgICAgZ3VpbnQ2NCBjaHVua19vZmZzZXRfb2Zmc2V0ID0gMDsKKyAgICAgIEdzdEJ1ZmZlciAqdG1wX2J1ZiA9CisgICAgICAgICAgZ3N0X2NvbGxlY3RfcGFkc19wZWVrIChwYWRzLCAoR3N0Q29sbGVjdERhdGEgKikgcXRwYWQpOworCisgICAgICAvKiBDaGVjayBmb3IgRU9TIHBhZHMgYW5kIGp1c3Qgc2tpcCB0aGVtICovCisgICAgICBpZiAoIXRtcF9idWYgJiYgIXF0cGFkLT5sYXN0X2J1ZiAmJiAoIXF0cGFkLT5yYXdfYXVkaW9fYWRhcHRlcgorICAgICAgICAgICAgICB8fCBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHF0cGFkLT5yYXdfYXVkaW9fYWRhcHRlcikgPT0gMCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKHRtcF9idWYpCisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHRtcF9idWYpOworCisgICAgICAvKiBGaW5kIHRoZSBleGFjdCBvZmZzZXQgd2hlcmUgdGhlIG5leHQgc2FtcGxlIG9mIHRoaXMgdHJhY2sgaXMgc3VwcG9zZWQKKyAgICAgICAqIHRvIGJlIHdyaXR0ZW4gYXQgKi8KKyAgICAgIGJsb2NrX2lkeCA9IGN1cnJlbnRfYmxvY2tfaWR4ID0gcHJlZmlsbF9nZXRfYmxvY2tfaW5kZXggKHF0bXV4LCBxdHBhZCk7CisgICAgICBzYW1wbGVfZW50cnkgPQorICAgICAgICAgICZnX2FycmF5X2luZGV4IChxdHBhZC0+c2FtcGxlcywgVHJha0J1ZmZlckVudHJ5SW5mbywgYmxvY2tfaWR4KTsKKyAgICAgIHdoaWxlIChibG9ja19pZHggPiAwKSB7CisgICAgICAgIGNvbnN0IFRyYWtCdWZmZXJFbnRyeUluZm8gKnRtcCA9CisgICAgICAgICAgICAmZ19hcnJheV9pbmRleCAocXRwYWQtPnNhbXBsZXMsIFRyYWtCdWZmZXJFbnRyeUluZm8sIGJsb2NrX2lkeCAtIDEpOworCisgICAgICAgIGlmICh0bXAtPmNodW5rX29mZnNldCAhPSBzYW1wbGVfZW50cnktPmNodW5rX29mZnNldCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2h1bmtfb2Zmc2V0X29mZnNldCArPSB0bXAtPnNpemUgKiB0bXAtPm5zYW1wbGVzOworICAgICAgICBibG9ja19pZHgtLTsKKyAgICAgIH0KKworICAgICAgLyogRXhjZXB0IGZvciB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCBwYWQgYmVpbmcgRU9TIHdlIGFsd2F5cyBoYXZlCisgICAgICAgKiAgcXRtdXgtPmN1cnJlbnRfY2h1bmtfb2Zmc2V0ICsgcXRtdXgtPmN1cnJlbnRfY2h1bmtfc2l6ZQorICAgICAgICogICAgPT0KKyAgICAgICAqICBzYW1wbGVfZW50cnktPmNodW5rX29mZnNldCArIGNodW5rX29mZnNldF9vZmZzZXQKKyAgICAgICAqIGZvciB0aGUgYmVzdCBwYWQuIEluc3RlYWQgb2YgY2hlY2tpbmcgdGhhdCwgd2UganVzdCByZXR1cm4gdGhlCisgICAgICAgKiBwYWQgdGhhdCBoYXMgdGhlIHNtYWxsZXN0IG9mZnNldCBmb3IgdGhlIG5leHQgdG8tYmUtd3JpdHRlbiBzYW1wbGUuCisgICAgICAgKi8KKyAgICAgIGlmIChzYW1wbGVfZW50cnktPmNodW5rX29mZnNldCArIGNodW5rX29mZnNldF9vZmZzZXQgPCBzbWFsbGVzdF9vZmZzZXQpIHsKKyAgICAgICAgc21hbGxlc3Rfb2Zmc2V0ID0gc2FtcGxlX2VudHJ5LT5jaHVua19vZmZzZXQgKyBjaHVua19vZmZzZXRfb2Zmc2V0OworICAgICAgICBiZXN0X3BhZCA9IHF0cGFkOworICAgICAgICBjaHVua19vZmZzZXQgPSBzYW1wbGVfZW50cnktPmNodW5rX29mZnNldDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2h1bmtfb2Zmc2V0ICE9IHF0bXV4LT5jdXJyZW50X2NodW5rX29mZnNldCkgeworICAgICAgcXRtdXgtPmN1cnJlbnRfcGFkID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gYmVzdF9wYWQ7CisgIH0KKworICBpZiAocXRtdXgtPmN1cnJlbnRfcGFkICYmIChxdG11eC0+aW50ZXJsZWF2ZV9ieXRlcyAhPSAwCisgICAgICAgICAgfHwgcXRtdXgtPmludGVybGVhdmVfdGltZSAhPSAwKSAmJiAocXRtdXgtPmludGVybGVhdmVfYnl0ZXMgPT0gMAorICAgICAgICAgIHx8IHF0bXV4LT5jdXJyZW50X2NodW5rX3NpemUgPD0gcXRtdXgtPmludGVybGVhdmVfYnl0ZXMpCisgICAgICAmJiAocXRtdXgtPmludGVybGVhdmVfdGltZSA9PSAwCisgICAgICAgICAgfHwgcXRtdXgtPmN1cnJlbnRfY2h1bmtfZHVyYXRpb24gPD0gcXRtdXgtPmludGVybGVhdmVfdGltZSkKKyAgICAgICYmIHF0bXV4LT5tdXhfbW9kZSAhPSBHU1RfUVRfTVVYX01PREVfRlJBR01FTlRFRAorICAgICAgJiYgcXRtdXgtPm11eF9tb2RlICE9IEdTVF9RVF9NVVhfTU9ERV9GUkFHTUVOVEVEX1NUUkVBTUFCTEUpIHsKKyAgICBHc3RCdWZmZXIgKnRtcF9idWYgPQorICAgICAgICBnc3RfY29sbGVjdF9wYWRzX3BlZWsgKHBhZHMsIChHc3RDb2xsZWN0RGF0YSAqKSBxdG11eC0+Y3VycmVudF9wYWQpOworCisgICAgaWYgKHRtcF9idWYgfHwgcXRtdXgtPmN1cnJlbnRfcGFkLT5sYXN0X2J1ZikgeworICAgICAgYmVzdF9wYWQgPSBxdG11eC0+Y3VycmVudF9wYWQ7CisgICAgICBpZiAodG1wX2J1ZikKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAodG1wX2J1Zik7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIlJldXNpbmcgcGFkICVzOiVzIiwKKyAgICAgICAgICBHU1RfREVCVUdfUEFEX05BTUUgKGJlc3RfcGFkLT5jb2xsZWN0LnBhZCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChxdG11eC0+Y29sbGVjdC0+ZGF0YS0+bmV4dCkgeworICAgIC8qIE9ubHkgc3dpdGNoIHBhZHMgaWYgd2UgaGF2ZSBtb3JlIHRoYW4gb25lLCBvdGhlcndpc2UKKyAgICAgKiB3ZSBjYW4ganVzdCBwdXQgZXZlcnl0aGluZyBpbnRvIGEgc2luZ2xlIGNodW5rIGFuZCBzYXZlCisgICAgICogYSBmZXcgYnl0ZXMgb2Ygb2Zmc2V0cworICAgICAqLworICAgIGlmIChxdG11eC0+Y3VycmVudF9wYWQpCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIlN3aXRjaGluZyBmcm9tIHBhZCAlczolcyIsCisgICAgICAgICAgR1NUX0RFQlVHX1BBRF9OQU1FIChxdG11eC0+Y3VycmVudF9wYWQtPmNvbGxlY3QucGFkKSk7CisgICAgYmVzdF9wYWQgPSBxdG11eC0+Y3VycmVudF9wYWQgPSBOVUxMOworICB9CisKKyAgaWYgKCFiZXN0X3BhZCkgeworICAgIEdzdENsb2NrVGltZSBiZXN0X3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgICAgZm9yICh3YWxrID0gcXRtdXgtPmNvbGxlY3QtPmRhdGE7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgICBHc3RDb2xsZWN0RGF0YSAqY2RhdGEgPSAoR3N0Q29sbGVjdERhdGEgKikgd2Fsay0+ZGF0YTsKKyAgICAgIEdzdFFUUGFkICpxdHBhZCA9IChHc3RRVFBhZCAqKSBjZGF0YTsKKyAgICAgIEdzdEJ1ZmZlciAqdG1wX2J1ZjsKKyAgICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisKKyAgICAgIHRtcF9idWYgPSBnc3RfY29sbGVjdF9wYWRzX3BlZWsgKHBhZHMsIGNkYXRhKTsKKyAgICAgIGlmICghdG1wX2J1ZikgeworICAgICAgICAvKiBUaGlzIG9uZSBpcyBuZXdseSBFT1Mgbm93LCBmaW5pc2ggaXQgZm9yIHJlYWwgKi8KKyAgICAgICAgaWYgKHF0cGFkLT5sYXN0X2J1ZikgeworICAgICAgICAgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfRFRTX09SX1BUUyAocXRwYWQtPmxhc3RfYnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHF0cGFkLT5sYXN0X2J1ZikKKyAgICAgICAgICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX0RUU19PUl9QVFMgKHF0cGFkLT5sYXN0X2J1Zik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX0RUU19PUl9QVFMgKHRtcF9idWYpOworICAgICAgfQorCisgICAgICBpZiAoYmVzdF9wYWQgPT0gTlVMTCB8fAorICAgICAgICAgICFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoYmVzdF90aW1lKSB8fCB0aW1lc3RhbXAgPCBiZXN0X3RpbWUpIHsKKyAgICAgICAgYmVzdF9wYWQgPSBxdHBhZDsKKyAgICAgICAgYmVzdF90aW1lID0gdGltZXN0YW1wOworICAgICAgfQorCisgICAgICBpZiAodG1wX2J1ZikKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAodG1wX2J1Zik7CisgICAgfQorCisgICAgaWYgKGJlc3RfcGFkKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIkNob29zaW5nIHBhZCAlczolcyIsCisgICAgICAgICAgR1NUX0RFQlVHX1BBRF9OQU1FIChiZXN0X3BhZC0+Y29sbGVjdC5wYWQpKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJObyBiZXN0IHBhZDogRU9TIik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGJlc3RfcGFkOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3F0X211eF9jb2xsZWN0ZWQgKEdzdENvbGxlY3RQYWRzICogcGFkcywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RRVE11eCAqcXRtdXggPSBHU1RfUVRfTVVYX0NBU1QgKHVzZXJfZGF0YSk7CisgIEdzdFFUUGFkICpiZXN0X3BhZCA9IE5VTEw7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHF0bXV4LT5zdGF0ZSA9PSBHU1RfUVRfTVVYX1NUQVRFX1NUQVJURUQpKSB7CisgICAgaWYgKChyZXQgPSBnc3RfcXRfbXV4X3N0YXJ0X2ZpbGUgKHF0bXV4KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICByZXR1cm4gcmV0OworCisgICAgcXRtdXgtPnN0YXRlID0gR1NUX1FUX01VWF9TVEFURV9EQVRBOworICB9CisKKyAgaWYgKEdfVU5MSUtFTFkgKHF0bXV4LT5zdGF0ZSA9PSBHU1RfUVRfTVVYX1NUQVRFX0VPUykpCisgICAgcmV0dXJuIEdTVF9GTE9XX0VPUzsKKworICBiZXN0X3BhZCA9IGZpbmRfYmVzdF9wYWQgKHF0bXV4LCBwYWRzKTsKKworICAvKiBjbGlwcGluZyBhbHJlYWR5IGNvbnZlcnRlZCB0byBydW5uaW5nIHRpbWUgKi8KKyAgaWYgKGJlc3RfcGFkICE9IE5VTEwpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZiA9IE5VTEw7CisKKyAgICBpZiAocXRtdXgtPm11eF9tb2RlICE9IEdTVF9RVF9NVVhfTU9ERV9ST0JVU1RfUkVDT1JESU5HX1BSRUZJTEwgfHwKKyAgICAgICAgYmVzdF9wYWQtPnJhd19hdWRpb19hZGFwdGVyID09IE5VTEwgfHwKKyAgICAgICAgYmVzdF9wYWQtPnJhd19hdWRpb19hZGFwdGVyX3B0cyA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgICAgYnVmID0gZ3N0X2NvbGxlY3RfcGFkc19wb3AgKHBhZHMsIChHc3RDb2xsZWN0RGF0YSAqKSBiZXN0X3BhZCk7CisKKyAgICBnX2Fzc2VydCAoYnVmIHx8IGJlc3RfcGFkLT5sYXN0X2J1ZiB8fCAoYmVzdF9wYWQtPnJhd19hdWRpb19hZGFwdGVyCisgICAgICAgICAgICAmJiBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGJlc3RfcGFkLT5yYXdfYXVkaW9fYWRhcHRlcikgPiAwKSk7CisKKyAgICBpZiAoYnVmKQorICAgICAgZ3N0X3F0X3BhZF9hZGp1c3RfYnVmZmVyX2R0cyAocXRtdXgsIGJlc3RfcGFkLAorICAgICAgICAgIChHc3RDb2xsZWN0RGF0YSAqKSBiZXN0X3BhZCwgJmJ1Zik7CisKKyAgICByZXQgPSBnc3RfcXRfbXV4X2FkZF9idWZmZXIgKHF0bXV4LCBiZXN0X3BhZCwgYnVmKTsKKyAgfSBlbHNlIHsKKyAgICBxdG11eC0+c3RhdGUgPSBHU1RfUVRfTVVYX1NUQVRFX0VPUzsKKyAgICByZXQgPSBnc3RfcXRfbXV4X3N0b3BfZmlsZSAocXRtdXgpOworICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiUHVzaGluZyBlb3MiKTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocXRtdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworICAgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LCAiRmFpbGVkIHRvIHN0b3AgZmlsZTogJXMiLAorICAgICAgICAgIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2NoZWNrX2ZpZWxkIChHUXVhcmsgZmllbGRfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlID0gKEdzdFN0cnVjdHVyZSAqKSB1c2VyX2RhdGE7CisgIGNvbnN0IEdWYWx1ZSAqb3RoZXIgPSBnc3Rfc3RydWN0dXJlX2lkX2dldF92YWx1ZSAoc3RydWN0dXJlLCBmaWVsZF9pZCk7CisgIGlmIChvdGhlciA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgcmV0dXJuIGdzdF92YWx1ZV9jb21wYXJlICh2YWx1ZSwgb3RoZXIpID09IEdTVF9WQUxVRV9FUVVBTDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcXRtdXhfY2Fwc19pc19zdWJzZXRfZnVsbCAoR3N0UVRNdXggKiBxdG11eCwgR3N0Q2FwcyAqIHN1YnNldCwKKyAgICBHc3RDYXBzICogc3VwZXJzZXQpCit7CisgIEdzdFN0cnVjdHVyZSAqc3ViX3MgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChzdWJzZXQsIDApOworICBHc3RTdHJ1Y3R1cmUgKnN1cF9zID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoc3VwZXJzZXQsIDApOworCisgIHJldHVybiBnc3Rfc3RydWN0dXJlX2ZvcmVhY2ggKHN1Yl9zLCBjaGVja19maWVsZCwgc3VwX3MpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9xdF9tdXhfYXVkaW9fc2lua19zZXRfY2FwcyAoR3N0UVRQYWQgKiBxdHBhZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFBhZCAqcGFkID0gcXRwYWQtPmNvbGxlY3QucGFkOworICBHc3RRVE11eCAqcXRtdXggPSBHU1RfUVRfTVVYX0NBU1QgKGdzdF9wYWRfZ2V0X3BhcmVudCAocGFkKSk7CisgIEdzdFFUTXV4Q2xhc3MgKnF0bXV4X2tsYXNzID0gKEdzdFFUTXV4Q2xhc3MgKikgKEdfT0JKRUNUX0dFVF9DTEFTUyAocXRtdXgpKTsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGNvbnN0IGdjaGFyICptaW1ldHlwZTsKKyAgZ2ludCByYXRlLCBjaGFubmVsczsKKyAgY29uc3QgR1ZhbHVlICp2YWx1ZSA9IE5VTEw7CisgIGNvbnN0IEdzdEJ1ZmZlciAqY29kZWNfZGF0YSA9IE5VTEw7CisgIEdzdFFUTXV4Rm9ybWF0IGZvcm1hdDsKKyAgQXVkaW9TYW1wbGVFbnRyeSBlbnRyeSA9IHsgMCwgfTsKKyAgQXRvbUluZm8gKmV4dF9hdG9tID0gTlVMTDsKKyAgZ2ludCBjb25zdGFudF9zaXplID0gMDsKKyAgY29uc3QgZ2NoYXIgKnN0cmVhbV9mb3JtYXQ7CisgIGd1aW50MzIgdGltZXNjYWxlOworCisgIC8qIGRvZXMgbm90IGdvIHdlbGwgdG8gcmVuZWdvdGlhdGUgc3RyZWFtIG1pZC13YXksIHVubGVzcworICAgKiB0aGUgb2xkIGNhcHMgYXJlIGEgc3Vic2V0IG9mIHRoZSBuZXcgb25lICh0aGlzIG1lYW5zIHVwc3RyZWFtCisgICAqIGFkZGVkIG1vcmUgaW5mbyB0byB0aGUgY2FwcywgYXMgYm90aCBzaG91bGQgYmUgJ2ZpeGVkJyBjYXBzKSAqLworICBpZiAocXRwYWQtPmZvdXJjYykgeworICAgIEdzdENhcHMgKmN1cnJlbnRfY2FwczsKKworICAgIGN1cnJlbnRfY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAocGFkKTsKKyAgICBnX2Fzc2VydCAoY2FwcyAhPSBOVUxMKTsKKworICAgIGlmICghZ3N0X3F0bXV4X2NhcHNfaXNfc3Vic2V0X2Z1bGwgKHF0bXV4LCBjdXJyZW50X2NhcHMsIGNhcHMpKSB7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY3VycmVudF9jYXBzKTsKKyAgICAgIGdvdG8gcmVmdXNlX3JlbmVnb3RpYXRpb247CisgICAgfQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LAorICAgICAgICAicGFkICVzIGFjY2VwdGVkIHJlbmVnb3RpYXRpb24gdG8gJSIgR1NUX1BUUl9GT1JNQVQgIiBmcm9tICUiCisgICAgICAgIEdTVF9QVFJfRk9STUFULCBHU1RfUEFEX05BTUUgKHBhZCksIGNhcHMsIGN1cnJlbnRfY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGN1cnJlbnRfY2Fwcyk7CisKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiJXM6JXMsIGNhcHM9JSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBHU1RfREVCVUdfUEFEX05BTUUgKHBhZCksIGNhcHMpOworCisgIHF0cGFkLT5wcmVwYXJlX2J1Zl9mdW5jID0gTlVMTDsKKworICBmb3JtYXQgPSBxdG11eF9rbGFzcy0+Zm9ybWF0OworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgbWltZXR5cGUgPSBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzdHJ1Y3R1cmUpOworCisgIC8qIGNvbW1vbiBpbmZvICovCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsICZjaGFubmVscykgfHwKKyAgICAgICFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgInJhdGUiLCAmcmF0ZSkpIHsKKyAgICBnb3RvIHJlZnVzZV9jYXBzOworICB9CisKKyAgLyogb3B0aW9uYWwgKi8KKyAgdmFsdWUgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCAiY29kZWNfZGF0YSIpOworICBpZiAodmFsdWUgIT0gTlVMTCkKKyAgICBjb2RlY19kYXRhID0gZ3N0X3ZhbHVlX2dldF9idWZmZXIgKHZhbHVlKTsKKworICBxdHBhZC0+aXNfb3V0X29mX29yZGVyID0gRkFMU0U7CisKKyAgLyogc2V0IGNvbW1vbiBwcm9wZXJ0aWVzICovCisgIGVudHJ5LnNhbXBsZV9yYXRlID0gcmF0ZTsKKyAgZW50cnkuY2hhbm5lbHMgPSBjaGFubmVsczsKKyAgLyogZGVmYXVsdCAqLworICBlbnRyeS5zYW1wbGVfc2l6ZSA9IDE2OworICAvKiB0aGlzIGlzIHRoZSB0eXBpY2FsIGNvbXByZXNzZWQgY2FzZSAqLworICBpZiAoZm9ybWF0ID09IEdTVF9RVF9NVVhfRk9STUFUX1FUKSB7CisgICAgZW50cnkudmVyc2lvbiA9IDE7CisgICAgZW50cnkuY29tcHJlc3Npb25faWQgPSAtMjsKKyAgfQorCisgIC8qIG5vdyBtYXAgb250byBhIGZvdXJjYywgYW5kIHNvbWUgZXh0cmEgcHJvcGVydGllcyAqLworICBpZiAoc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL21wZWciKSA9PSAwKSB7CisgICAgZ2ludCBtcGVndmVyc2lvbiA9IDAsIG1wZWdhdWRpb3ZlcnNpb24gPSAwOworICAgIGdpbnQgbGF5ZXIgPSAtMTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAibXBlZ3ZlcnNpb24iLCAmbXBlZ3ZlcnNpb24pOworICAgIHN3aXRjaCAobXBlZ3ZlcnNpb24pIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJsYXllciIsICZsYXllcik7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAibXBlZ2F1ZGlvdmVyc2lvbiIsCisgICAgICAgICAgICAmbXBlZ2F1ZGlvdmVyc2lvbik7CisKKyAgICAgICAgLyogbXAxLzIvMyAqLworICAgICAgICAvKiBub3RlOiBRdWlja1RpbWUgcGxheWVyIGRvZXMgbm90IGxpa2UgbXAzIGVpdGhlciB3YXkgaW4gaXNvL21wNCAqLworICAgICAgICBpZiAoZm9ybWF0ID09IEdTVF9RVF9NVVhfRk9STUFUX1FUKQorICAgICAgICAgIGVudHJ5LmZvdXJjYyA9IEZPVVJDQ19fbXAzOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfbXA0YTsKKyAgICAgICAgICBleHRfYXRvbSA9CisgICAgICAgICAgICAgIGJ1aWxkX2VzZHNfZXh0ZW5zaW9uIChxdHBhZC0+dHJhaywgRVNEU19PQkpFQ1RfVFlQRV9NUEVHMV9QMywKKyAgICAgICAgICAgICAgRVNEU19TVFJFQU1fVFlQRV9BVURJTywgY29kZWNfZGF0YSwgcXRwYWQtPmF2Z19iaXRyYXRlLAorICAgICAgICAgICAgICBxdHBhZC0+bWF4X2JpdHJhdGUpOworICAgICAgICB9CisgICAgICAgIGlmIChsYXllciA9PSAxKSB7CisgICAgICAgICAgZ193YXJuX2lmX2ZhaWwgKGZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9NUDQKKyAgICAgICAgICAgICAgfHwgZm9ybWF0ID09IEdTVF9RVF9NVVhfRk9STUFUX1FUKTsKKyAgICAgICAgICBlbnRyeS5zYW1wbGVzX3Blcl9wYWNrZXQgPSAzODQ7CisgICAgICAgIH0gZWxzZSBpZiAobGF5ZXIgPT0gMikgeworICAgICAgICAgIGdfd2Fybl9pZl9mYWlsIChmb3JtYXQgPT0gR1NUX1FUX01VWF9GT1JNQVRfTVA0CisgICAgICAgICAgICAgIHx8IGZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9RVCk7CisgICAgICAgICAgZW50cnkuc2FtcGxlc19wZXJfcGFja2V0ID0gMTE1MjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnX3dhcm5faWZfZmFpbCAobGF5ZXIgPT0gMyk7CisgICAgICAgICAgZW50cnkuc2FtcGxlc19wZXJfcGFja2V0ID0gKG1wZWdhdWRpb3ZlcnNpb24gPD0gMSkgPyAxMTUyIDogNTc2OworICAgICAgICB9CisgICAgICAgIGVudHJ5LmJ5dGVzX3Blcl9zYW1wbGUgPSAyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKworICAgICAgICAvKiBjaGVjayBzdHJlYW0tZm9ybWF0ICovCisgICAgICAgIHN0cmVhbV9mb3JtYXQgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgInN0cmVhbS1mb3JtYXQiKTsKKyAgICAgICAgaWYgKHN0cmVhbV9mb3JtYXQpIHsKKyAgICAgICAgICBpZiAoc3RyY21wIChzdHJlYW1fZm9ybWF0LCAicmF3IikgIT0gMCkgeworICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgIlVuc3VwcG9ydGVkIEFBQyBzdHJlYW0tZm9ybWF0ICVzLCAiCisgICAgICAgICAgICAgICAgInBsZWFzZSB1c2UgJ3JhdyciLCBzdHJlYW1fZm9ybWF0KTsKKyAgICAgICAgICAgIGdvdG8gcmVmdXNlX2NhcHM7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRtdXgsICJObyBzdHJlYW0tZm9ybWF0IHByZXNlbnQgaW4gY2FwcywgIgorICAgICAgICAgICAgICAiYXNzdW1pbmcgJ3JhdyciKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghY29kZWNfZGF0YSB8fCBnc3RfYnVmZmVyX2dldF9zaXplICgoR3N0QnVmZmVyICopIGNvZGVjX2RhdGEpIDwgMikgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRtdXgsICJubyAodmFsaWQpIGNvZGVjX2RhdGEgZm9yIEFBQyBhdWRpbyIpOworICAgICAgICAgIGdvdG8gcmVmdXNlX2NhcHM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3VpbnQ4IHByb2ZpbGU7CisKKyAgICAgICAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKChHc3RCdWZmZXIgKikgY29kZWNfZGF0YSwgMCwgJnByb2ZpbGUsIDEpOworICAgICAgICAgIC8qIHdhcm4gaWYgbm90IExvdyBDb21wbGV4aXR5IHByb2ZpbGUgKi8KKyAgICAgICAgICBwcm9maWxlID4+PSAzOworICAgICAgICAgIGlmIChwcm9maWxlICE9IDIpCisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LAorICAgICAgICAgICAgICAgICJub24tTEMgQUFDIG1heSBub3QgcnVuIHdlbGwgb24gKEFwcGxlKSBRdWlja1RpbWUvaVR1bmVzIik7CisgICAgICAgIH0KKworICAgICAgICAvKiBBQUMgKi8KKyAgICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX21wNGE7CisKKyAgICAgICAgaWYgKGZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9RVCkKKyAgICAgICAgICBleHRfYXRvbSA9IGJ1aWxkX21vdl9hYWNfZXh0ZW5zaW9uIChxdHBhZC0+dHJhaywgY29kZWNfZGF0YSwKKyAgICAgICAgICAgICAgcXRwYWQtPmF2Z19iaXRyYXRlLCBxdHBhZC0+bWF4X2JpdHJhdGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgZXh0X2F0b20gPQorICAgICAgICAgICAgICBidWlsZF9lc2RzX2V4dGVuc2lvbiAocXRwYWQtPnRyYWssIEVTRFNfT0JKRUNUX1RZUEVfTVBFRzRfUDMsCisgICAgICAgICAgICAgIEVTRFNfU1RSRUFNX1RZUEVfQVVESU8sIGNvZGVjX2RhdGEsIHF0cGFkLT5hdmdfYml0cmF0ZSwKKyAgICAgICAgICAgICAgcXRwYWQtPm1heF9iaXRyYXRlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL0FNUiIpID09IDApIHsKKyAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0Nfc2FtcjsKKyAgICBlbnRyeS5zYW1wbGVfc2l6ZSA9IDE2OworICAgIGVudHJ5LnNhbXBsZXNfcGVyX3BhY2tldCA9IDE2MDsKKyAgICBlbnRyeS5ieXRlc19wZXJfc2FtcGxlID0gMjsKKyAgICBleHRfYXRvbSA9IGJ1aWxkX2Ftcl9leHRlbnNpb24gKCk7CisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL0FNUi1XQiIpID09IDApIHsKKyAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0Nfc2F3YjsKKyAgICBlbnRyeS5zYW1wbGVfc2l6ZSA9IDE2OworICAgIGVudHJ5LnNhbXBsZXNfcGVyX3BhY2tldCA9IDMyMDsKKyAgICBlbnRyeS5ieXRlc19wZXJfc2FtcGxlID0gMjsKKyAgICBleHRfYXRvbSA9IGJ1aWxkX2Ftcl9leHRlbnNpb24gKCk7CisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtcmF3IikgPT0gMCkgeworICAgIEdzdEF1ZGlvSW5mbyBpbmZvOworCisgICAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoJmluZm8pOworICAgIGlmICghZ3N0X2F1ZGlvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgY2FwcykpCisgICAgICBnb3RvIHJlZnVzZV9jYXBzOworCisgICAgLyogc3BlYyBoYXMgbm8gcGxhY2UgZm9yIGEgZGlzdGluY3Rpb24gaW4gdGhlc2UgKi8KKyAgICBpZiAoaW5mby5maW5mby0+d2lkdGggIT0gaW5mby5maW5mby0+ZGVwdGgpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAid2lkdGggbXVzdCBiZSBzYW1lIGFzIGRlcHRoISIpOworICAgICAgZ290byByZWZ1c2VfY2FwczsKKyAgICB9CisKKyAgICBpZiAoKGluZm8uZmluZm8tPmZsYWdzICYgR1NUX0FVRElPX0ZPUk1BVF9GTEFHX1NJR05FRCkpIHsKKyAgICAgIGlmIChpbmZvLmZpbmZvLT5lbmRpYW5uZXNzID09IEdfTElUVExFX0VORElBTikKKyAgICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX3Nvd3Q7CisgICAgICBlbHNlIGlmIChpbmZvLmZpbmZvLT5lbmRpYW5uZXNzID09IEdfQklHX0VORElBTikKKyAgICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX3R3b3M7CisgICAgICBlbHNlCisgICAgICAgIGVudHJ5LmZvdXJjYyA9IEZPVVJDQ19zb3d0OworICAgICAgLyogbWF4aW11bSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OyBvbmx5IG5ldyB2ZXJzaW9uIGZvciA+IDE2IGJpdCAqLworICAgICAgaWYgKGluZm8uZmluZm8tPmRlcHRoIDw9IDE2KQorICAgICAgICBlbnRyeS52ZXJzaW9uID0gMDsKKyAgICAgIC8qIG5vdCBjb21wcmVzc2VkIGluIGFueSBjYXNlICovCisgICAgICBlbnRyeS5jb21wcmVzc2lvbl9pZCA9IDA7CisgICAgICAvKiBRVCBzcGVjIHNheXM6IG1heCBhdCAxNiBiaXQgZXZlbiBpZiBzYW1wbGUgc2l6ZSB3ZXJlIGFjdHVhbGx5IGxhcmdlciwKKyAgICAgICAqIGhvd2V2ZXIsIG1vc3QgcGxheWVycyAoZS5nLiBRdWlja1RpbWUhKSBzZWVtIHRvIGRpc2FncmVlLCBzbyAuLi4gKi8KKyAgICAgIGVudHJ5LnNhbXBsZV9zaXplID0gaW5mby5maW5mby0+ZGVwdGg7CisgICAgICBlbnRyeS5ieXRlc19wZXJfc2FtcGxlID0gaW5mby5maW5mby0+ZGVwdGggLyA4OworICAgICAgZW50cnkuc2FtcGxlc19wZXJfcGFja2V0ID0gMTsKKyAgICAgIGVudHJ5LmJ5dGVzX3Blcl9wYWNrZXQgPSBpbmZvLmZpbmZvLT5kZXB0aCAvIDg7CisgICAgICBlbnRyeS5ieXRlc19wZXJfZnJhbWUgPSBlbnRyeS5ieXRlc19wZXJfcGFja2V0ICogaW5mby5jaGFubmVsczsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGluZm8uZmluZm8tPndpZHRoID09IDggJiYgaW5mby5maW5mby0+ZGVwdGggPT0gOCkgeworICAgICAgICAvKiBmYWxsIGJhY2sgdG8gb2xkIDgtYml0IHZlcnNpb24gKi8KKyAgICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX3Jhd187CisgICAgICAgIGVudHJ5LnZlcnNpb24gPSAwOworICAgICAgICBlbnRyeS5jb21wcmVzc2lvbl9pZCA9IDA7CisgICAgICAgIGVudHJ5LnNhbXBsZV9zaXplID0gODsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAibm9uIDgtYml0IFBDTSBtdXN0IGJlIHNpZ25lZCIpOworICAgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgICAgfQorICAgIH0KKyAgICBjb25zdGFudF9zaXplID0gKGluZm8uZmluZm8tPmRlcHRoIC8gOCkgKiBpbmZvLmNoYW5uZWxzOworICB9IGVsc2UgaWYgKHN0cmNtcCAobWltZXR5cGUsICJhdWRpby94LWFsYXciKSA9PSAwKSB7CisgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX2FsYXc7CisgICAgZW50cnkuc2FtcGxlc19wZXJfcGFja2V0ID0gMTAyMzsKKyAgICBlbnRyeS5ieXRlc19wZXJfc2FtcGxlID0gMjsKKyAgfSBlbHNlIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1tdWxhdyIpID09IDApIHsKKyAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfdWxhdzsKKyAgICBlbnRyeS5zYW1wbGVzX3Blcl9wYWNrZXQgPSAxMDIzOworICAgIGVudHJ5LmJ5dGVzX3Blcl9zYW1wbGUgPSAyOworICB9IGVsc2UgaWYgKHN0cmNtcCAobWltZXR5cGUsICJhdWRpby94LWFkcGNtIikgPT0gMCkgeworICAgIGdpbnQgYmxvY2tzaXplOworICAgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJibG9ja19hbGlnbiIsICZibG9ja3NpemUpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgImJyb2tlbiBjYXBzLCBibG9ja19hbGlnbiBtaXNzaW5nIik7CisgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKyAgICAvKiBDdXJyZW50bHkgb25seSBzdXBwb3J0cyBXQVYtc3R5bGUgSU1BIEFEUENNLCBmb3Igd2hpY2ggdGhlIGNvZGVjIGlkIGlzCisgICAgICAgMHgxMSAqLworICAgIGVudHJ5LmZvdXJjYyA9IE1TX1dBVkVfRk9VUkNDICgweDExKTsKKyAgICAvKiA0IGJ5dGUgaGVhZGVyIHBlciBjaGFubmVsIChpbmNsdWRpbmcgb25lIHNhbXBsZSkuIDIgc2FtcGxlcyBwZXIgYnl0ZQorICAgICAgIHJlbWFpbmluZy4gU2ltcGxpZnlpbmcgZ2l2ZXMgdGhlIGZvbGxvd2luZyAoc2FtcGxlcyBwZXIgYmxvY2sgcGVyCisgICAgICAgY2hhbm5lbCkgKi8KKyAgICBlbnRyeS5zYW1wbGVzX3Blcl9wYWNrZXQgPSAyICogYmxvY2tzaXplIC8gY2hhbm5lbHMgLSA3OworICAgIGVudHJ5LmJ5dGVzX3Blcl9zYW1wbGUgPSAyOworCisgICAgZW50cnkuYnl0ZXNfcGVyX2ZyYW1lID0gYmxvY2tzaXplOworICAgIGVudHJ5LmJ5dGVzX3Blcl9wYWNrZXQgPSBibG9ja3NpemUgLyBjaGFubmVsczsKKyAgICAvKiBBRFBDTSBoYXMgY29uc3RhbnQgc2l6ZSBwYWNrZXRzICovCisgICAgY29uc3RhbnRfc2l6ZSA9IDE7CisgICAgLyogVE9ETzogSSBkb24ndCByZWFsbHkgdW5kZXJzdGFuZCB3aHkgdGhpcyBoZWxwcywgYnV0IGl0IGRvZXMhIENvbnN0YW50CisgICAgICogc2l6ZSBhbmQgY29tcHJlc3Npb25faWQgb2YgLTIgc2VlbSB0byBiZSBpbmNvbXBhdGlibGUsIGFuZCBvdGhlciBmaWxlcworICAgICAqIGluIHRoZSB3aWxkIHVzZSB0aGlzIHRvby4gKi8KKyAgICBlbnRyeS5jb21wcmVzc2lvbl9pZCA9IC0xOworCisgICAgZXh0X2F0b20gPSBidWlsZF9pbWFfYWRwY21fZXh0ZW5zaW9uIChjaGFubmVscywgcmF0ZSwgYmxvY2tzaXplKTsKKyAgfSBlbHNlIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1hbGFjIikgPT0gMCkgeworICAgIEdzdEJ1ZmZlciAqY29kZWNfY29uZmlnOworICAgIGdpbnQgbGVuOworICAgIEdzdE1hcEluZm8gbWFwOworCisgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX2FsYWM7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKChHc3RCdWZmZXIgKikgY29kZWNfZGF0YSwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAvKiBsZXQncyBjaGVjayBpZiBjb2RlYyBkYXRhIGFscmVhZHkgY29tZXMgd2l0aCAnYWxhYycgYXRvbSBwcmVmaXggKi8KKyAgICBpZiAoIWNvZGVjX2RhdGEgfHwgKGxlbiA9IG1hcC5zaXplKSA8IDI4KSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgImJyb2tlbiBjYXBzLCBjb2RlYyBkYXRhIG1pc3NpbmciKTsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKChHc3RCdWZmZXIgKikgY29kZWNfZGF0YSwgJm1hcCk7CisgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKyAgICBpZiAoR1NUX1JFQURfVUlOVDMyX0xFIChtYXAuZGF0YSArIDQpID09IEZPVVJDQ19hbGFjKSB7CisgICAgICBsZW4gLT0gODsKKyAgICAgIGNvZGVjX2NvbmZpZyA9CisgICAgICAgICAgZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAoKEdzdEJ1ZmZlciAqKSBjb2RlY19kYXRhLAorICAgICAgICAgIEdTVF9CVUZGRVJfQ09QWV9NRU1PUlksIDgsIGxlbik7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvZGVjX2NvbmZpZyA9IGdzdF9idWZmZXJfcmVmICgoR3N0QnVmZmVyICopIGNvZGVjX2RhdGEpOworICAgIH0KKyAgICBnc3RfYnVmZmVyX3VubWFwICgoR3N0QnVmZmVyICopIGNvZGVjX2RhdGEsICZtYXApOworICAgIGlmIChsZW4gIT0gMjgpIHsKKyAgICAgIC8qIGRvZXMgbm90IGxvb2sgZ29vZCwgYnV0IHBlcmhhcHMgc29tZSB0cmFpbGluZyB1bm5lZWRlZCBzdHVmZiAqLworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgInVuZXhwZWN0ZWQgY29kZWMtZGF0YSBzaXplLCBwb3NzaWJseSBicm9rZW4iKTsKKyAgICB9CisgICAgaWYgKGZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9RVCkKKyAgICAgIGV4dF9hdG9tID0gYnVpbGRfbW92X2FsYWNfZXh0ZW5zaW9uIChjb2RlY19jb25maWcpOworICAgIGVsc2UKKyAgICAgIGV4dF9hdG9tID0gYnVpbGRfY29kZWNfZGF0YV9leHRlbnNpb24gKEZPVVJDQ19hbGFjLCBjb2RlY19jb25maWcpOworICAgIC8qIHNldCBzb21lIG1vcmUgaW5mbyAqLworICAgIGdzdF9idWZmZXJfbWFwIChjb2RlY19jb25maWcsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgZW50cnkuYnl0ZXNfcGVyX3NhbXBsZSA9IDI7CisgICAgZW50cnkuc2FtcGxlc19wZXJfcGFja2V0ID0gR1NUX1JFQURfVUlOVDMyX0JFIChtYXAuZGF0YSArIDQpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGNvZGVjX2NvbmZpZywgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoY29kZWNfY29uZmlnKTsKKyAgfSBlbHNlIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1hYzMiKSA9PSAwKSB7CisgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX2FjXzM7CisKKyAgICAvKiBGaXhlZCB2YWx1ZXMgYWNjb3JkaW5nIHRvIFRTIDEwMiAzNjYgYnV0IGl0IGFsc28gbWVudGlvbnMgdGhhdAorICAgICAqIHRoZXkgc2hvdWxkIGJlIGlnbm9yZWQgKi8KKyAgICBlbnRyeS5jaGFubmVscyA9IDI7CisgICAgZW50cnkuc2FtcGxlX3NpemUgPSAxNjsKKworICAgIC8qIEFDLTMgbmVlZHMgYW4gZXh0ZW5zaW9uIGF0b20gYnV0IGl0cyBkYXRhIGNhbiBvbmx5IGJlIG9idGFpbmVkIGZyb20KKyAgICAgKiB0aGUgc3RyZWFtIGl0c2VsZi4gQWJ1c2UgdGhlIHByZXBhcmVfYnVmX2Z1bmMgc28gd2UgcGFyc2UgYSBmcmFtZQorICAgICAqIGFuZCBnZXQgdGhlIG5lZWRlZCBkYXRhICovCisgICAgcXRwYWQtPnByZXBhcmVfYnVmX2Z1bmMgPSBnc3RfcXRfbXV4X3ByZXBhcmVfcGFyc2VfYWMzX2ZyYW1lOworICB9IGVsc2UgaWYgKHN0cmNtcCAobWltZXR5cGUsICJhdWRpby94LW9wdXMiKSA9PSAwKSB7CisgICAgLyogQmFzZWQgb24gdGhlIHNwZWNpZmljYXRpb24gZGVmaW5lZCBpbjoKKyAgICAgKiBodHRwczovL3d3dy5vcHVzLWNvZGVjLm9yZy9kb2NzL29wdXNfaW5faXNvYm1mZi5odG1sICovCisgICAgZ3VpbnQ4IGNoYW5uZWxzLCBtYXBwaW5nX2ZhbWlseSwgc3RyZWFtX2NvdW50LCBjb3VwbGVkX2NvdW50OworICAgIGd1aW50MTYgcHJlX3NraXA7CisgICAgZ2ludDE2IG91dHB1dF9nYWluOworICAgIGd1aW50MzIgcmF0ZTsKKyAgICBndWludDggY2hhbm5lbF9tYXBwaW5nWzI1Nl07CisgICAgY29uc3QgR1ZhbHVlICpzdHJlYW1oZWFkZXI7CisgICAgY29uc3QgR1ZhbHVlICpmaXJzdF9lbGVtZW50OworICAgIEdzdEJ1ZmZlciAqaGVhZGVyOworCisgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX29wdXM7CisgICAgZW50cnkuc2FtcGxlX3NpemUgPSAxNjsKKworICAgIHN0cmVhbWhlYWRlciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJzdHJlYW1oZWFkZXIiKTsKKyAgICBpZiAoc3RyZWFtaGVhZGVyICYmIEdTVF9WQUxVRV9IT0xEU19BUlJBWSAoc3RyZWFtaGVhZGVyKSAmJgorICAgICAgICBnc3RfdmFsdWVfYXJyYXlfZ2V0X3NpemUgKHN0cmVhbWhlYWRlcikgIT0gMCkgeworICAgICAgZmlyc3RfZWxlbWVudCA9IGdzdF92YWx1ZV9hcnJheV9nZXRfdmFsdWUgKHN0cmVhbWhlYWRlciwgMCk7CisgICAgICBoZWFkZXIgPSBnc3RfdmFsdWVfZ2V0X2J1ZmZlciAoZmlyc3RfZWxlbWVudCk7CisgICAgICBpZiAoIWdzdF9jb2RlY191dGlsc19vcHVzX3BhcnNlX2hlYWRlciAoaGVhZGVyLCAmcmF0ZSwgJmNoYW5uZWxzLAorICAgICAgICAgICAgICAmbWFwcGluZ19mYW1pbHksICZzdHJlYW1fY291bnQsICZjb3VwbGVkX2NvdW50LCBjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICZwcmVfc2tpcCwgJm91dHB1dF9nYWluKSkgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChxdG11eCwgIkluY29tcGxldGUgT3B1c0hlYWQiKTsKKyAgICAgICAgZ290byByZWZ1c2VfY2FwczsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwKKyAgICAgICAgICAibm8gc3RyZWFtaGVhZGVyIGZpZWxkIGluIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgICAgICBpZiAoIWdzdF9jb2RlY191dGlsc19vcHVzX3BhcnNlX2NhcHMgKGNhcHMsICZyYXRlLCAmY2hhbm5lbHMsCisgICAgICAgICAgICAgICZtYXBwaW5nX2ZhbWlseSwgJnN0cmVhbV9jb3VudCwgJmNvdXBsZWRfY291bnQsCisgICAgICAgICAgICAgIGNoYW5uZWxfbWFwcGluZykpIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAocXRtdXgsICJJbmNvbXBsZXRlIE9wdXMgY2FwcyIpOworICAgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgICAgfQorICAgICAgcHJlX3NraXAgPSAwOworICAgICAgb3V0cHV0X2dhaW4gPSAwOworICAgIH0KKworICAgIGVudHJ5LmNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgZXh0X2F0b20gPSBidWlsZF9vcHVzX2V4dGVuc2lvbiAocmF0ZSwgY2hhbm5lbHMsIG1hcHBpbmdfZmFtaWx5LAorICAgICAgICBzdHJlYW1fY291bnQsIGNvdXBsZWRfY291bnQsIGNoYW5uZWxfbWFwcGluZywgcHJlX3NraXAsIG91dHB1dF9nYWluKTsKKyAgfQorCisgIGlmICghZW50cnkuZm91cmNjKQorICAgIGdvdG8gcmVmdXNlX2NhcHM7CisKKyAgdGltZXNjYWxlID0gZ3N0X3F0X211eF9wYWRfZ2V0X3RpbWVzY2FsZSAoR1NUX1FUX01VWF9QQURfQ0FTVCAocGFkKSk7CisgIGlmICghdGltZXNjYWxlICYmIHF0bXV4LT50cmFrX3RpbWVzY2FsZSkKKyAgICB0aW1lc2NhbGUgPSBxdG11eC0+dHJha190aW1lc2NhbGU7CisgIGVsc2UgaWYgKCF0aW1lc2NhbGUpCisgICAgdGltZXNjYWxlID0gZW50cnkuc2FtcGxlX3JhdGU7CisKKyAgLyogb2ssIHNldCB0aGUgcGFkIGluZm8gYWNjb3JkaW5nbHkgKi8KKyAgcXRwYWQtPmZvdXJjYyA9IGVudHJ5LmZvdXJjYzsKKyAgcXRwYWQtPnNhbXBsZV9zaXplID0gY29uc3RhbnRfc2l6ZTsKKyAgcXRwYWQtPnRyYWtfc3RlID0KKyAgICAgIChTYW1wbGVUYWJsZUVudHJ5ICopIGF0b21fdHJha19zZXRfYXVkaW9fdHlwZSAocXRwYWQtPnRyYWssCisgICAgICBxdG11eC0+Y29udGV4dCwgJmVudHJ5LCB0aW1lc2NhbGUsIGV4dF9hdG9tLCBjb25zdGFudF9zaXplKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChxdG11eCk7CisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworcmVmdXNlX2NhcHM6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LCAicGFkICVzIHJlZnVzZWQgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgICAgR1NUX1BBRF9OQU1FIChwYWQpLCBjYXBzKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChxdG11eCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CityZWZ1c2VfcmVuZWdvdGlhdGlvbjoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRtdXgsCisgICAgICAgICJwYWQgJXMgcmVmdXNlZCByZW5lZ290aWF0aW9uIHRvICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICBHU1RfUEFEX05BTUUgKHBhZCksIGNhcHMpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHF0bXV4KTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcXRfbXV4X3ZpZGVvX3Npbmtfc2V0X2NhcHMgKEdzdFFUUGFkICogcXRwYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RQYWQgKnBhZCA9IHF0cGFkLT5jb2xsZWN0LnBhZDsKKyAgR3N0UVRNdXggKnF0bXV4ID0gR1NUX1FUX01VWF9DQVNUIChnc3RfcGFkX2dldF9wYXJlbnQgKHBhZCkpOworICBHc3RRVE11eENsYXNzICpxdG11eF9rbGFzcyA9IChHc3RRVE11eENsYXNzICopIChHX09CSkVDVF9HRVRfQ0xBU1MgKHF0bXV4KSk7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBjb25zdCBnY2hhciAqbWltZXR5cGU7CisgIGdpbnQgd2lkdGgsIGhlaWdodCwgZGVwdGggPSAtMTsKKyAgZ2ludCBmcmFtZXJhdGVfbnVtLCBmcmFtZXJhdGVfZGVuOworICBndWludDMyIHJhdGU7CisgIGNvbnN0IEdWYWx1ZSAqdmFsdWUgPSBOVUxMOworICBjb25zdCBHc3RCdWZmZXIgKmNvZGVjX2RhdGEgPSBOVUxMOworICBWaXN1YWxTYW1wbGVFbnRyeSBlbnRyeSA9IHsgMCwgfTsKKyAgR3N0UVRNdXhGb3JtYXQgZm9ybWF0OworICBBdG9tSW5mbyAqZXh0X2F0b20gPSBOVUxMOworICBHTGlzdCAqZXh0X2F0b21fbGlzdCA9IE5VTEw7CisgIGdib29sZWFuIHN5bmMgPSBGQUxTRTsKKyAgaW50IHBhcl9udW0sIHBhcl9kZW47CisgIGNvbnN0IGdjaGFyICptdWx0aXZpZXdfbW9kZTsKKworICAvKiBkb2VzIG5vdCBnbyB3ZWxsIHRvIHJlbmVnb3RpYXRlIHN0cmVhbSBtaWQtd2F5LCB1bmxlc3MKKyAgICogdGhlIG9sZCBjYXBzIGFyZSBhIHN1YnNldCBvZiB0aGUgbmV3IG9uZSAodGhpcyBtZWFucyB1cHN0cmVhbQorICAgKiBhZGRlZCBtb3JlIGluZm8gdG8gdGhlIGNhcHMsIGFzIGJvdGggc2hvdWxkIGJlICdmaXhlZCcgY2FwcykgKi8KKyAgaWYgKHF0cGFkLT5mb3VyY2MpIHsKKyAgICBHc3RDYXBzICpjdXJyZW50X2NhcHM7CisKKyAgICBjdXJyZW50X2NhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHBhZCk7CisgICAgZ19hc3NlcnQgKGNhcHMgIT0gTlVMTCk7CisKKyAgICBpZiAoIWdzdF9xdG11eF9jYXBzX2lzX3N1YnNldF9mdWxsIChxdG11eCwgY3VycmVudF9jYXBzLCBjYXBzKSkgeworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGN1cnJlbnRfY2Fwcyk7CisgICAgICBnb3RvIHJlZnVzZV9yZW5lZ290aWF0aW9uOworICAgIH0KKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwKKyAgICAgICAgInBhZCAlcyBhY2NlcHRlZCByZW5lZ290aWF0aW9uIHRvICUiIEdTVF9QVFJfRk9STUFUICIgZnJvbSAlIgorICAgICAgICBHU1RfUFRSX0ZPUk1BVCwgR1NUX1BBRF9OQU1FIChwYWQpLCBjYXBzLCBjdXJyZW50X2NhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChjdXJyZW50X2NhcHMpOworCisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIiVzOiVzLCBjYXBzPSUiIEdTVF9QVFJfRk9STUFULAorICAgICAgR1NUX0RFQlVHX1BBRF9OQU1FIChwYWQpLCBjYXBzKTsKKworICBxdHBhZC0+cHJlcGFyZV9idWZfZnVuYyA9IE5VTEw7CisKKyAgZm9ybWF0ID0gcXRtdXhfa2xhc3MtPmZvcm1hdDsKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIG1pbWV0eXBlID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAoc3RydWN0dXJlKTsKKworICAvKiByZXF1aXJlZCBwYXJ0cyAqLworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAid2lkdGgiLCAmd2lkdGgpIHx8CisgICAgICAhZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJoZWlnaHQiLCAmaGVpZ2h0KSkKKyAgICBnb3RvIHJlZnVzZV9jYXBzOworCisgIC8qIG9wdGlvbmFsICovCisgIGRlcHRoID0gLTE7CisgIC8qIHdvcmtzIGFzIGEgZGVmYXVsdCB0aW1lYmFzZSAqLworICBmcmFtZXJhdGVfbnVtID0gMTAwMDA7CisgIGZyYW1lcmF0ZV9kZW4gPSAxOworICBnc3Rfc3RydWN0dXJlX2dldF9mcmFjdGlvbiAoc3RydWN0dXJlLCAiZnJhbWVyYXRlIiwgJmZyYW1lcmF0ZV9udW0sCisgICAgICAmZnJhbWVyYXRlX2Rlbik7CisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiZGVwdGgiLCAmZGVwdGgpOworICB2YWx1ZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJjb2RlY19kYXRhIik7CisgIGlmICh2YWx1ZSAhPSBOVUxMKQorICAgIGNvZGVjX2RhdGEgPSBnc3RfdmFsdWVfZ2V0X2J1ZmZlciAodmFsdWUpOworCisgIHBhcl9udW0gPSAxOworICBwYXJfZGVuID0gMTsKKyAgZ3N0X3N0cnVjdHVyZV9nZXRfZnJhY3Rpb24gKHN0cnVjdHVyZSwgInBpeGVsLWFzcGVjdC1yYXRpbyIsICZwYXJfbnVtLAorICAgICAgJnBhcl9kZW4pOworCisgIHF0cGFkLT5pc19vdXRfb2Zfb3JkZXIgPSBGQUxTRTsKKworICAvKiBicmluZyBmcmFtZSBudW1lcmF0b3IgaW50byBhIHJhbmdlIHRoYXQgZW5zdXJlcyBib3RoIHJlYXNvbmFibGUgcmVzb2x1dGlvbgorICAgKiBhcyB3ZWxsIGFzIGEgZmFpciBkdXJhdGlvbiAqLworICBxdHBhZC0+ZXhwZWN0ZWRfc2FtcGxlX2R1cmF0aW9uX24gPSBmcmFtZXJhdGVfbnVtOworICBxdHBhZC0+ZXhwZWN0ZWRfc2FtcGxlX2R1cmF0aW9uX2QgPSBmcmFtZXJhdGVfZGVuOworCisgIHJhdGUgPSBnc3RfcXRfbXV4X3BhZF9nZXRfdGltZXNjYWxlIChHU1RfUVRfTVVYX1BBRF9DQVNUIChwYWQpKTsKKyAgaWYgKCFyYXRlICYmIHF0bXV4LT50cmFrX3RpbWVzY2FsZSkKKyAgICByYXRlID0gcXRtdXgtPnRyYWtfdGltZXNjYWxlOworICBlbHNlIGlmICghcmF0ZSkKKyAgICByYXRlID0gYXRvbV9mcmFtZXJhdGVfdG9fdGltZXNjYWxlIChmcmFtZXJhdGVfbnVtLCBmcmFtZXJhdGVfZGVuKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIlJhdGUgb2YgdmlkZW8gdHJhY2sgc2VsZWN0ZWQ6ICUiIEdfR1VJTlQzMl9GT1JNQVQsCisgICAgICByYXRlKTsKKworICBtdWx0aXZpZXdfbW9kZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAibXVsdGl2aWV3LW1vZGUiKTsKKyAgaWYgKG11bHRpdmlld19tb2RlICYmICFxdHBhZC0+dHJhay0+bWRpYS5taW5mLnN0Ymwuc3ZtaSkgeworICAgIEdzdFZpZGVvTXVsdGl2aWV3TW9kZSBtb2RlOworICAgIEdzdFZpZGVvTXVsdGl2aWV3RmxhZ3MgZmxhZ3MgPSAwOworCisgICAgbW9kZSA9IGdzdF92aWRlb19tdWx0aXZpZXdfbW9kZV9mcm9tX2NhcHNfc3RyaW5nIChtdWx0aXZpZXdfbW9kZSk7CisgICAgZ3N0X3N0cnVjdHVyZV9nZXRfZmxhZ3NldCAoc3RydWN0dXJlLCAibXVsdGl2aWV3LWZsYWdzIiwgJmZsYWdzLCBOVUxMKTsKKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX01VTFRJVklFV19NT0RFX1NJREVfQllfU0lERToKKyAgICAgICAgcXRwYWQtPnRyYWstPm1kaWEubWluZi5zdGJsLnN2bWkgPQorICAgICAgICAgICAgYXRvbV9zdm1pX25ldyAoMCwKKyAgICAgICAgICAgIGZsYWdzICYgR1NUX1ZJREVPX01VTFRJVklFV19GTEFHU19SSUdIVF9WSUVXX0ZJUlNUKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19NVUxUSVZJRVdfTU9ERV9ST1dfSU5URVJMRUFWRUQ6CisgICAgICAgIHF0cGFkLT50cmFrLT5tZGlhLm1pbmYuc3RibC5zdm1pID0KKyAgICAgICAgICAgIGF0b21fc3ZtaV9uZXcgKDEsCisgICAgICAgICAgICBmbGFncyAmIEdTVF9WSURFT19NVUxUSVZJRVdfRkxBR1NfUklHSFRfVklFV19GSVJTVCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fTVVMVElWSUVXX01PREVfRlJBTUVfQllfRlJBTUU6CisgICAgICAgIHF0cGFkLT50cmFrLT5tZGlhLm1pbmYuc3RibC5zdm1pID0KKyAgICAgICAgICAgIGF0b21fc3ZtaV9uZXcgKDIsCisgICAgICAgICAgICBmbGFncyAmIEdTVF9WSURFT19NVUxUSVZJRVdfRkxBR1NfUklHSFRfVklFV19GSVJTVCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJVbnN1cHBvcnRlZCBtdWx0aXZpZXctbW9kZSAlcyIsCisgICAgICAgICAgICBtdWx0aXZpZXdfbW9kZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8qIHNldCBjb21tb24gcHJvcGVydGllcyAqLworICBlbnRyeS53aWR0aCA9IHdpZHRoOworICBlbnRyeS5oZWlnaHQgPSBoZWlnaHQ7CisgIGVudHJ5LnBhcl9uID0gcGFyX251bTsKKyAgZW50cnkucGFyX2QgPSBwYXJfZGVuOworICAvKiBzaG91bGQgYmUgT0sgYWNjb3JkaW5nIHRvIHF0IGFuZCBpc28gc3BlYywgb3ZlcnJpZGUgaWYgcmVhbGx5IG5lZWRlZCAqLworICBlbnRyeS5jb2xvcl90YWJsZV9pZCA9IC0xOworICBlbnRyeS5mcmFtZV9jb3VudCA9IDE7CisgIGVudHJ5LmRlcHRoID0gMjQ7CisKKyAgLyogc3luYyBlbnRyaWVzIGJ5IGRlZmF1bHQgKi8KKyAgc3luYyA9IFRSVUU7CisKKyAgLyogbm93IG1hcCBvbnRvIGEgZm91cmNjLCBhbmQgc29tZSBleHRyYSBwcm9wZXJ0aWVzICovCisgIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC1yYXciKSA9PSAwKSB7CisgICAgY29uc3QgZ2NoYXIgKmZvcm1hdDsKKyAgICBHc3RWaWRlb0Zvcm1hdCBmbXQ7CisgICAgY29uc3QgR3N0VmlkZW9Gb3JtYXRJbmZvICp2aW5mbzsKKworICAgIGZvcm1hdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZm9ybWF0Iik7CisgICAgZm10ID0gZ3N0X3ZpZGVvX2Zvcm1hdF9mcm9tX3N0cmluZyAoZm9ybWF0KTsKKyAgICB2aW5mbyA9IGdzdF92aWRlb19mb3JtYXRfZ2V0X2luZm8gKGZtdCk7CisKKyAgICBzd2l0Y2ggKGZtdCkgeworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICAgIGlmIChkZXB0aCA9PSAtMSkKKyAgICAgICAgICBkZXB0aCA9IDI0OworICAgICAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfMnZ1eTsKKyAgICAgICAgZW50cnkuZGVwdGggPSBkZXB0aDsKKyAgICAgICAgc3luYyA9IEZBTFNFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF92MjEwOgorICAgICAgICBpZiAoZGVwdGggPT0gLTEpCisgICAgICAgICAgZGVwdGggPSAyNDsKKyAgICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX3YyMTA7CisgICAgICAgIGVudHJ5LmRlcHRoID0gZGVwdGg7CisgICAgICAgIHN5bmMgPSBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX0ZMQUdTICh2aW5mbykgJiBHU1RfVklERU9fRk9STUFUX0ZMQUdfUkdCKSB7CisgICAgICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX3Jhd187CisgICAgICAgICAgZW50cnkuZGVwdGggPSBHU1RfVklERU9fRk9STUFUX0lORk9fUFNUUklERSAodmluZm8sIDApICogODsKKyAgICAgICAgICBzeW5jID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgaWYgKHN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LWgyNjMiKSA9PSAwKSB7CisgICAgZXh0X2F0b20gPSBOVUxMOworICAgIGlmIChmb3JtYXQgPT0gR1NUX1FUX01VWF9GT1JNQVRfUVQpCisgICAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfaDI2MzsKKyAgICBlbHNlCisgICAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfczI2MzsKKyAgICBleHRfYXRvbSA9IGJ1aWxkX2gyNjNfZXh0ZW5zaW9uICgpOworICAgIGlmIChleHRfYXRvbSAhPSBOVUxMKQorICAgICAgZXh0X2F0b21fbGlzdCA9IGdfbGlzdF9wcmVwZW5kIChleHRfYXRvbV9saXN0LCBleHRfYXRvbSk7CisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtZGl2eCIpID09IDAgfHwKKyAgICAgIHN0cmNtcCAobWltZXR5cGUsICJ2aWRlby9tcGVnIikgPT0gMCkgeworICAgIGdpbnQgdmVyc2lvbiA9IDA7CisKKyAgICBpZiAoc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtZGl2eCIpID09IDApIHsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiZGl2eHZlcnNpb24iLCAmdmVyc2lvbik7CisgICAgICB2ZXJzaW9uID0gdmVyc2lvbiA9PSA1ID8gMSA6IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAibXBlZ3ZlcnNpb24iLCAmdmVyc2lvbik7CisgICAgICB2ZXJzaW9uID0gdmVyc2lvbiA9PSA0ID8gMSA6IDA7CisgICAgfQorICAgIGlmICh2ZXJzaW9uKSB7CisgICAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfbXA0djsKKyAgICAgIGV4dF9hdG9tID0KKyAgICAgICAgICBidWlsZF9lc2RzX2V4dGVuc2lvbiAocXRwYWQtPnRyYWssIEVTRFNfT0JKRUNUX1RZUEVfTVBFRzRfUDIsCisgICAgICAgICAgRVNEU19TVFJFQU1fVFlQRV9WSVNVQUwsIGNvZGVjX2RhdGEsIHF0cGFkLT5hdmdfYml0cmF0ZSwKKyAgICAgICAgICBxdHBhZC0+bWF4X2JpdHJhdGUpOworICAgICAgaWYgKGV4dF9hdG9tICE9IE5VTEwpCisgICAgICAgIGV4dF9hdG9tX2xpc3QgPSBnX2xpc3RfcHJlcGVuZCAoZXh0X2F0b21fbGlzdCwgZXh0X2F0b20pOworICAgICAgaWYgKCFjb2RlY19kYXRhKQorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LCAibm8gY29kZWNfZGF0YSBmb3IgTVBFRzQgdmlkZW87ICIKKyAgICAgICAgICAgICJvdXRwdXQgbWlnaHQgbm90IHBsYXkgaW4gQXBwbGUgUXVpY2tUaW1lICh0cnkgZ2xvYmFsLWhlYWRlcnM/KSIpOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC1oMjY0IikgPT0gMCkgeworICAgIGlmICghY29kZWNfZGF0YSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgIm5vIGNvZGVjX2RhdGEgaW4gaDI2NCBjYXBzIik7CisgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKworICAgIGVudHJ5LmZvdXJjYyA9IEZPVVJDQ19hdmMxOworCisgICAgZXh0X2F0b20gPSBidWlsZF9idHJ0X2V4dGVuc2lvbiAoMCwgcXRwYWQtPmF2Z19iaXRyYXRlLCBxdHBhZC0+bWF4X2JpdHJhdGUpOworICAgIGlmIChleHRfYXRvbSAhPSBOVUxMKQorICAgICAgZXh0X2F0b21fbGlzdCA9IGdfbGlzdF9wcmVwZW5kIChleHRfYXRvbV9saXN0LCBleHRfYXRvbSk7CisgICAgZXh0X2F0b20gPSBidWlsZF9jb2RlY19kYXRhX2V4dGVuc2lvbiAoRk9VUkNDX2F2Y0MsIGNvZGVjX2RhdGEpOworICAgIGlmIChleHRfYXRvbSAhPSBOVUxMKQorICAgICAgZXh0X2F0b21fbGlzdCA9IGdfbGlzdF9wcmVwZW5kIChleHRfYXRvbV9saXN0LCBleHRfYXRvbSk7CisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtaDI2NSIpID09IDApIHsKKyAgICBjb25zdCBnY2hhciAqZm9ybWF0OworCisgICAgaWYgKCFjb2RlY19kYXRhKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LCAibm8gY29kZWNfZGF0YSBpbiBoMjY1IGNhcHMiKTsKKyAgICAgIGdvdG8gcmVmdXNlX2NhcHM7CisgICAgfQorCisgICAgZm9ybWF0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJzdHJlYW0tZm9ybWF0Iik7CisgICAgaWYgKHN0cmNtcCAoZm9ybWF0LCAiaHZjMSIpID09IDApCisgICAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfaHZjMTsKKyAgICBlbHNlIGlmIChzdHJjbXAgKGZvcm1hdCwgImhldjEiKSA9PSAwKQorICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX2hldjE7CisKKyAgICBleHRfYXRvbSA9IGJ1aWxkX2J0cnRfZXh0ZW5zaW9uICgwLCBxdHBhZC0+YXZnX2JpdHJhdGUsIHF0cGFkLT5tYXhfYml0cmF0ZSk7CisgICAgaWYgKGV4dF9hdG9tICE9IE5VTEwpCisgICAgICBleHRfYXRvbV9saXN0ID0gZ19saXN0X3ByZXBlbmQgKGV4dF9hdG9tX2xpc3QsIGV4dF9hdG9tKTsKKworICAgIGV4dF9hdG9tID0gYnVpbGRfY29kZWNfZGF0YV9leHRlbnNpb24gKEZPVVJDQ19odmNDLCBjb2RlY19kYXRhKTsKKyAgICBpZiAoZXh0X2F0b20gIT0gTlVMTCkKKyAgICAgIGV4dF9hdG9tX2xpc3QgPSBnX2xpc3RfcHJlcGVuZCAoZXh0X2F0b21fbGlzdCwgZXh0X2F0b20pOworCisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtc3ZxIikgPT0gMCkgeworICAgIGdpbnQgdmVyc2lvbiA9IDA7CisgICAgY29uc3QgR3N0QnVmZmVyICpzZXFoID0gTlVMTDsKKyAgICBjb25zdCBHVmFsdWUgKnNlcWhfdmFsdWU7CisgICAgZ2RvdWJsZSBnYW1tYSA9IDA7CisKKyAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgInN2cXZlcnNpb24iLCAmdmVyc2lvbik7CisgICAgaWYgKHZlcnNpb24gPT0gMykgeworICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX1NWUTM7CisgICAgICBlbnRyeS52ZXJzaW9uID0gMzsKKyAgICAgIGVudHJ5LmRlcHRoID0gMzI7CisKKyAgICAgIHNlcWhfdmFsdWUgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCAic2VxaCIpOworICAgICAgaWYgKHNlcWhfdmFsdWUpIHsKKyAgICAgICAgc2VxaCA9IGdzdF92YWx1ZV9nZXRfYnVmZmVyIChzZXFoX3ZhbHVlKTsKKyAgICAgICAgZXh0X2F0b20gPSBidWlsZF9TTUlfYXRvbSAoc2VxaCk7CisgICAgICAgIGlmIChleHRfYXRvbSkKKyAgICAgICAgICBleHRfYXRvbV9saXN0ID0gZ19saXN0X3ByZXBlbmQgKGV4dF9hdG9tX2xpc3QsIGV4dF9hdG9tKTsKKyAgICAgIH0KKworICAgICAgLyogd2UgbmVlZCB0byBhZGQgdGhlIGdhbW1hIGFueXdheSBiZWNhdXNlIHF1aWNrdGltZSBtaWdodCBjcmFzaAorICAgICAgICogd2hlbiBpdCBkb2Vzbid0IGZpbmQgaXQgKi8KKyAgICAgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfZG91YmxlIChzdHJ1Y3R1cmUsICJhcHBsaWVkLWdhbW1hIiwgJmdhbW1hKSkgeworICAgICAgICAvKiBpdCBzZWVtcyB0aGF0IHVzaW5nIDAgaGVyZSBtYWtlcyBpdCBpZ25vcmVkICovCisgICAgICAgIGdhbW1hID0gMC4wOworICAgICAgfQorICAgICAgZXh0X2F0b20gPSBidWlsZF9nYW1hX2F0b20gKGdhbW1hKTsKKyAgICAgIGlmIChleHRfYXRvbSkKKyAgICAgICAgZXh0X2F0b21fbGlzdCA9IGdfbGlzdF9wcmVwZW5kIChleHRfYXRvbV9saXN0LCBleHRfYXRvbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRtdXgsICJTVlEgdmVyc2lvbiAlZCBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgZmlsZSAiCisgICAgICAgICAgImEgYnVnIGF0IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmciLCB2ZXJzaW9uKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtZHYiKSA9PSAwKSB7CisgICAgZ2ludCB2ZXJzaW9uID0gMDsKKyAgICBnYm9vbGVhbiBwYWwgPSBUUlVFOworCisgICAgc3luYyA9IEZBTFNFOworICAgIGlmIChmcmFtZXJhdGVfbnVtICE9IDI1IHx8IGZyYW1lcmF0ZV9kZW4gIT0gMSkKKyAgICAgIHBhbCA9IEZBTFNFOworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiZHZ2ZXJzaW9uIiwgJnZlcnNpb24pOworICAgIC8qIGZhbGwgYmFjayB0byB0eXBpY2FsIG9uZSAqLworICAgIGlmICghdmVyc2lvbikKKyAgICAgIHZlcnNpb24gPSAyNTsKKyAgICBzd2l0Y2ggKHZlcnNpb24pIHsKKyAgICAgIGNhc2UgMjU6CisgICAgICAgIGlmIChwYWwpCisgICAgICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX2R2Y3A7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfZHZjXzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDUwOgorICAgICAgICBpZiAocGFsKQorICAgICAgICAgIGVudHJ5LmZvdXJjYyA9IEZPVVJDQ19kdjVwOworICAgICAgICBlbHNlCisgICAgICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX2R2NW47CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgInVucmVjb2duaXplZCBkdiB2ZXJzaW9uIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAiaW1hZ2UvanBlZyIpID09IDApIHsKKyAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfanBlZzsKKyAgICBzeW5jID0gRkFMU0U7CisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgImltYWdlL3BuZyIpID09IDApIHsKKyAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfcG5nOworICAgIHN5bmMgPSBGQUxTRTsKKyAgfSBlbHNlIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAiaW1hZ2UveC1qMmMiKSA9PSAwIHx8CisgICAgICBzdHJjbXAgKG1pbWV0eXBlLCAiaW1hZ2UveC1qcGMiKSA9PSAwKSB7CisgICAgY29uc3QgZ2NoYXIgKmNvbG9yc3BhY2U7CisgICAgY29uc3QgR1ZhbHVlICpjbWFwX2FycmF5OworICAgIGNvbnN0IEdWYWx1ZSAqY2RlZl9hcnJheTsKKyAgICBnaW50IG5jb21wID0gMDsKKworICAgIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAiaW1hZ2UveC1qcGMiKSA9PSAwKSB7CisgICAgICBxdHBhZC0+cHJlcGFyZV9idWZfZnVuYyA9IGdzdF9xdF9tdXhfcHJlcGFyZV9qcGNfYnVmZmVyOworICAgIH0KKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAibnVtLWNvbXBvbmVudHMiLCAmbmNvbXApOworICAgIGNtYXBfYXJyYXkgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCAiY29tcG9uZW50LW1hcCIpOworICAgIGNkZWZfYXJyYXkgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCAiY2hhbm5lbC1kZWZpbml0aW9ucyIpOworCisgICAgZXh0X2F0b20gPSBOVUxMOworICAgIGVudHJ5LmZvdXJjYyA9IEZPVVJDQ19tanAyOworICAgIHN5bmMgPSBGQUxTRTsKKworICAgIGNvbG9yc3BhY2UgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImNvbG9yc3BhY2UiKTsKKyAgICBpZiAoY29sb3JzcGFjZSAmJgorICAgICAgICAoZXh0X2F0b20gPQorICAgICAgICAgICAgYnVpbGRfanAyaF9leHRlbnNpb24gKHdpZHRoLCBoZWlnaHQsIGNvbG9yc3BhY2UsIG5jb21wLCBjbWFwX2FycmF5LAorICAgICAgICAgICAgICAgIGNkZWZfYXJyYXkpKSAhPSBOVUxMKSB7CisgICAgICBleHRfYXRvbV9saXN0ID0gZ19saXN0X2FwcGVuZCAoZXh0X2F0b21fbGlzdCwgZXh0X2F0b20pOworCisgICAgICBleHRfYXRvbSA9IGJ1aWxkX2pwMnhfZXh0ZW5zaW9uIChjb2RlY19kYXRhKTsKKyAgICAgIGlmIChleHRfYXRvbSkKKyAgICAgICAgZXh0X2F0b21fbGlzdCA9IGdfbGlzdF9hcHBlbmQgKGV4dF9hdG9tX2xpc3QsIGV4dF9hdG9tKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJtaXNzaW5nIG9yIGludmFsaWQgZm91cmNjIGluIGpwMiBjYXBzIik7CisgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC12cDgiKSA9PSAwKSB7CisgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX3ZwMDg7CisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtdnA5IikgPT0gMCkgeworICAgIGVudHJ5LmZvdXJjYyA9IEZPVVJDQ192cDA5OworICB9IGVsc2UgaWYgKHN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LWRpcmFjIikgPT0gMCkgeworICAgIGVudHJ5LmZvdXJjYyA9IEZPVVJDQ19kcmFjOworICB9IGVsc2UgaWYgKHN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LXF0LXBhcnQiKSA9PSAwKSB7CisgICAgZ3VpbnQzMiBmb3VyY2MgPSAwOworCisgICAgZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAoc3RydWN0dXJlLCAiZm9ybWF0IiwgJmZvdXJjYyk7CisgICAgZW50cnkuZm91cmNjID0gZm91cmNjOworICB9IGVsc2UgaWYgKHN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LW1wNC1wYXJ0IikgPT0gMCkgeworICAgIGd1aW50MzIgZm91cmNjID0gMDsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQgKHN0cnVjdHVyZSwgImZvcm1hdCIsICZmb3VyY2MpOworICAgIGVudHJ5LmZvdXJjYyA9IGZvdXJjYzsKKyAgfSBlbHNlIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC1wcm9yZXMiKSA9PSAwKSB7CisgICAgY29uc3QgZ2NoYXIgKnZhcmlhbnQ7CisKKyAgICB2YXJpYW50ID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJ2YXJpYW50Iik7CisgICAgaWYgKCF2YXJpYW50IHx8ICFnX3N0cmNtcDAgKHZhcmlhbnQsICJzdGFuZGFyZCIpKQorICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX2FwY247CisgICAgZWxzZSBpZiAoIWdfc3RyY21wMCAodmFyaWFudCwgImx0IikpCisgICAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfYXBjczsKKyAgICBlbHNlIGlmICghZ19zdHJjbXAwICh2YXJpYW50LCAiaHEiKSkKKyAgICAgIGVudHJ5LmZvdXJjYyA9IEZPVVJDQ19hcGNoOworICAgIGVsc2UgaWYgKCFnX3N0cmNtcDAgKHZhcmlhbnQsICJwcm94eSIpKQorICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX2FwY287CisgICAgZWxzZSBpZiAoIWdfc3RyY21wMCAodmFyaWFudCwgIjQ0NDQiKSkKKyAgICAgIGVudHJ5LmZvdXJjYyA9IEZPVVJDQ19hcDRoOworICAgIGVsc2UgaWYgKCFnX3N0cmNtcDAgKHZhcmlhbnQsICI0NDQ0eHEiKSkKKyAgICAgIGVudHJ5LmZvdXJjYyA9IEZPVVJDQ19hcDR4OworCisgICAgc3luYyA9IEZBTFNFOworCisgICAgaWYgKCFxdG11eC0+aW50ZXJsZWF2ZV90aW1lX3NldCkKKyAgICAgIHF0bXV4LT5pbnRlcmxlYXZlX3RpbWUgPSA1MDAgKiBHU1RfTVNFQ09ORDsKKyAgICBpZiAoIXF0bXV4LT5pbnRlcmxlYXZlX2J5dGVzX3NldCkKKyAgICAgIHF0bXV4LT5pbnRlcmxlYXZlX2J5dGVzID0gd2lkdGggPiA3MjAgPyA0ICogMTAyNCAqIDEwMjQgOiAyICogMTAyNCAqIDEwMjQ7CisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtY2luZWZvcm0iKSA9PSAwKSB7CisgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX2NmaGQ7CisgICAgc3luYyA9IEZBTFNFOworICB9CisKKyAgaWYgKCFlbnRyeS5mb3VyY2MpCisgICAgZ290byByZWZ1c2VfY2FwczsKKworICBpZiAocXRtdXhfa2xhc3MtPmZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9RVCB8fAorICAgICAgcXRtdXhfa2xhc3MtPmZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9NUDQpIHsKKyAgICBjb25zdCBnY2hhciAqczsKKyAgICBHc3RWaWRlb0NvbG9yaW1ldHJ5IGNvbG9yaW1ldHJ5OworCisgICAgcyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiY29sb3JpbWV0cnkiKTsKKyAgICBpZiAocyAmJiBnc3RfdmlkZW9fY29sb3JpbWV0cnlfZnJvbV9zdHJpbmcgKCZjb2xvcmltZXRyeSwgcykpIHsKKyAgICAgIGV4dF9hdG9tID0KKyAgICAgICAgICBidWlsZF9jb2xyX2V4dGVuc2lvbiAoJmNvbG9yaW1ldHJ5LAorICAgICAgICAgIHF0bXV4X2tsYXNzLT5mb3JtYXQgPT0gR1NUX1FUX01VWF9GT1JNQVRfTVA0KTsKKyAgICAgIGlmIChleHRfYXRvbSkKKyAgICAgICAgZXh0X2F0b21fbGlzdCA9IGdfbGlzdF9hcHBlbmQgKGV4dF9hdG9tX2xpc3QsIGV4dF9hdG9tKTsKKyAgICB9CisgIH0KKworICBpZiAocXRtdXhfa2xhc3MtPmZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9RVAorICAgICAgfHwgc3RyY21wIChtaW1ldHlwZSwgImltYWdlL3gtajJjIikgPT0gMAorICAgICAgfHwgc3RyY21wIChtaW1ldHlwZSwgImltYWdlL3gtanBjIikgPT0gMCkgeworICAgIGNvbnN0IGdjaGFyICpzOworICAgIEdzdFZpZGVvSW50ZXJsYWNlTW9kZSBpbnRlcmxhY2VfbW9kZTsKKyAgICBHc3RWaWRlb0ZpZWxkT3JkZXIgZmllbGRfb3JkZXI7CisgICAgZ2ludCBmaWVsZHMgPSAtMTsKKworICAgIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAiaW1hZ2UveC1qMmMiKSA9PSAwIHx8CisgICAgICAgIHN0cmNtcCAobWltZXR5cGUsICJpbWFnZS94LWpwYyIpID09IDApIHsKKworICAgICAgZmllbGRzID0gMTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiZmllbGRzIiwgJmZpZWxkcyk7CisgICAgfQorCisgICAgcyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiaW50ZXJsYWNlLW1vZGUiKTsKKyAgICBpZiAocykKKyAgICAgIGludGVybGFjZV9tb2RlID0gZ3N0X3ZpZGVvX2ludGVybGFjZV9tb2RlX2Zyb21fc3RyaW5nIChzKTsKKyAgICBlbHNlCisgICAgICBpbnRlcmxhY2VfbW9kZSA9CisgICAgICAgICAgKGZpZWxkcyA8PQorICAgICAgICAgIDEpID8gR1NUX1ZJREVPX0lOVEVSTEFDRV9NT0RFX1BST0dSRVNTSVZFIDoKKyAgICAgICAgICBHU1RfVklERU9fSU5URVJMQUNFX01PREVfTUlYRUQ7CisKKyAgICBmaWVsZF9vcmRlciA9IEdTVF9WSURFT19GSUVMRF9PUkRFUl9VTktOT1dOOworICAgIGlmIChpbnRlcmxhY2VfbW9kZSA9PSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfSU5URVJMRUFWRUQpIHsKKyAgICAgIHMgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImZpZWxkLW9yZGVyIik7CisgICAgICBpZiAocykKKyAgICAgICAgZmllbGRfb3JkZXIgPSBnc3RfdmlkZW9fZmllbGRfb3JkZXJfZnJvbV9zdHJpbmcgKHMpOworICAgIH0KKworICAgIGV4dF9hdG9tID0gYnVpbGRfZmllbF9leHRlbnNpb24gKGludGVybGFjZV9tb2RlLCBmaWVsZF9vcmRlcik7CisgICAgaWYgKGV4dF9hdG9tKQorICAgICAgZXh0X2F0b21fbGlzdCA9IGdfbGlzdF9hcHBlbmQgKGV4dF9hdG9tX2xpc3QsIGV4dF9hdG9tKTsKKyAgfQorCisKKyAgaWYgKHF0bXV4X2tsYXNzLT5mb3JtYXQgPT0gR1NUX1FUX01VWF9GT1JNQVRfUVQgJiYKKyAgICAgIHdpZHRoID4gNjQwICYmIHdpZHRoIDw9IDEwNTIgJiYgaGVpZ2h0ID49IDQ4MCAmJiBoZWlnaHQgPD0gNTc2KSB7CisgICAgLyogVGhlICdjbGFwJyBleHRlbnNpb24gaXMgYWxzbyBkZWZpbmVkIGZvciBNUDQgYnV0IGludmVudGluZyB2YWx1ZXMgaW4KKyAgICAgKiBnZW5lcmFsIHNlZW1zIGEgYml0IHRyaWNreSBmb3IgdGhpcyBvbmUuIFdlIG9ubHkgd3JpdGUgaXQgZm9yCisgICAgICogU0QgcmVzb2x1dGlvbiBpbiBNT1YsIHdoZXJlIGl0IGlzIGEgcmVxdWlyZW1lbnQuCisgICAgICogVGhlIHNhbWUgZ29lcyBmb3IgdGhlICd0YXB0JyBleHRlbnNpb24sIGp1c3QgdGhhdCBpdCBpcyBub3QgZGVmaW5lZCBmb3IKKyAgICAgKiBNUDQgYW5kIG9ubHkgZm9yIE1PVgorICAgICAqLworICAgIGdpbnQgZGFyX251bSwgZGFyX2RlbjsKKyAgICBnaW50IGNsZWZfd2lkdGgsIGNsZWZfaGVpZ2h0LCBwcm9mX3dpZHRoOworICAgIGdpbnQgY2xhcF93aWR0aF9uLCBjbGFwX3dpZHRoX2QsIGNsYXBfaGVpZ2h0OworICAgIGdpbnQgY2RpdjsKKyAgICBkb3VibGUgYXBwcm94X2RhcjsKKworICAgIC8qIEZpcnN0LCBndWVzcyBkaXNwbGF5IGFzcGVjdCByYXRpbyBiYXNlZCBvbiBwaXhlbCBhc3BlY3QgcmF0aW8sCisgICAgICogd2lkdGggYW5kIGhlaWdodC4gV2UgYXNzdW1lIHRoYXQgZGlzcGxheSBhc3BlY3QgcmF0aW8gaXMgZWl0aGVyCisgICAgICogNDozIG9yIDE2OjkKKyAgICAgKi8KKyAgICBhcHByb3hfZGFyID0gKGdkb3VibGUpICh3aWR0aCAqIHBhcl9udW0pIC8gKGhlaWdodCAqIHBhcl9kZW4pOworICAgIGlmIChhcHByb3hfZGFyID4gMTEuMCAvIDkgJiYgYXBwcm94X2RhciA8IDE0LjAgLyA5KSB7CisgICAgICBkYXJfbnVtID0gNDsKKyAgICAgIGRhcl9kZW4gPSAzOworICAgIH0gZWxzZSBpZiAoYXBwcm94X2RhciA+IDE1LjAgLyA5ICYmIGFwcHJveF9kYXIgPCAxOC4wIC8gOSkgeworICAgICAgZGFyX251bSA9IDE2OworICAgICAgZGFyX2RlbiA9IDk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRhcl9udW0gPSB3aWR0aCAqIHBhcl9udW07CisgICAgICBkYXJfZGVuID0gaGVpZ2h0ICogcGFyX2RlbjsKKyAgICAgIGNkaXYgPSBnc3RfdXRpbF9ncmVhdGVzdF9jb21tb25fZGl2aXNvciAoZGFyX251bSwgZGFyX2Rlbik7CisgICAgICBkYXJfbnVtIC89IGNkaXY7CisgICAgICBkYXJfZGVuIC89IGNkaXY7CisgICAgfQorCisgICAgLyogVGhlbiwgY2FsY3VsYXRlIGNsZWFuLWFwZXJ0dXJlIHZhbHVlcyAoY2xhcCBhbmQgY2xlZikKKyAgICAgKiB1c2luZyB0aGUgZ3Vlc3NlZCBEQVIuCisgICAgICovCisgICAgY2xlZl9oZWlnaHQgPSBjbGFwX2hlaWdodCA9IChoZWlnaHQgPT0gNDg2ID8gNDgwIDogaGVpZ2h0KTsKKyAgICBjbGVmX3dpZHRoID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChjbGVmX2hlaWdodCwKKyAgICAgICAgZGFyX251bSAqIEdfR1VJTlQ2NF9DT05TVEFOVCAoNjU1MzYpLCBkYXJfZGVuKTsKKyAgICBwcm9mX3dpZHRoID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlICh3aWR0aCwKKyAgICAgICAgcGFyX251bSAqIEdfR1VJTlQ2NF9DT05TVEFOVCAoNjU1MzYpLCBwYXJfZGVuKTsKKyAgICBjbGFwX3dpZHRoX24gPSBjbGFwX2hlaWdodCAqIGRhcl9udW0gKiBwYXJfZGVuOworICAgIGNsYXBfd2lkdGhfZCA9IGRhcl9kZW4gKiBwYXJfbnVtOworICAgIGNkaXYgPSBnc3RfdXRpbF9ncmVhdGVzdF9jb21tb25fZGl2aXNvciAoY2xhcF93aWR0aF9uLCBjbGFwX3dpZHRoX2QpOworICAgIGNsYXBfd2lkdGhfbiAvPSBjZGl2OworICAgIGNsYXBfd2lkdGhfZCAvPSBjZGl2OworCisgICAgZXh0X2F0b20gPSBidWlsZF90YXB0X2V4dGVuc2lvbiAoY2xlZl93aWR0aCwgY2xlZl9oZWlnaHQgPDwgMTYsIHByb2Zfd2lkdGgsCisgICAgICAgIGhlaWdodCA8PCAxNiwgd2lkdGggPDwgMTYsIGhlaWdodCA8PCAxNik7CisgICAgcXRwYWQtPnRyYWstPnRhcHQgPSBleHRfYXRvbTsKKworICAgIGV4dF9hdG9tID0gYnVpbGRfY2xhcF9leHRlbnNpb24gKGNsYXBfd2lkdGhfbiwgY2xhcF93aWR0aF9kLAorICAgICAgICBjbGFwX2hlaWdodCwgMSwgMCwgMSwgMCwgMSk7CisgICAgaWYgKGV4dF9hdG9tKQorICAgICAgZXh0X2F0b21fbGlzdCA9IGdfbGlzdF9hcHBlbmQgKGV4dF9hdG9tX2xpc3QsIGV4dF9hdG9tKTsKKyAgfQorCisgIC8qIG9rLCBzZXQgdGhlIHBhZCBpbmZvIGFjY29yZGluZ2x5ICovCisgIHF0cGFkLT5mb3VyY2MgPSBlbnRyeS5mb3VyY2M7CisgIHF0cGFkLT5zeW5jID0gc3luYzsKKyAgcXRwYWQtPnRyYWtfc3RlID0KKyAgICAgIChTYW1wbGVUYWJsZUVudHJ5ICopIGF0b21fdHJha19zZXRfdmlkZW9fdHlwZSAocXRwYWQtPnRyYWssCisgICAgICBxdG11eC0+Y29udGV4dCwgJmVudHJ5LCByYXRlLCBleHRfYXRvbV9saXN0KTsKKyAgaWYgKHN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LXByb3JlcyIpID09IDApIHsKKyAgICBTYW1wbGVUYWJsZUVudHJ5TVA0ViAqbXA0diA9IChTYW1wbGVUYWJsZUVudHJ5TVA0ViAqKSBxdHBhZC0+dHJha19zdGU7CisgICAgY29uc3QgZ2NoYXIgKmNvbXByZXNzb3IgPSBOVUxMOworICAgIG1wNHYtPnNwYXRpYWxfcXVhbGl0eSA9IDB4M0ZGOworICAgIG1wNHYtPnRlbXBvcmFsX3F1YWxpdHkgPSAwOworICAgIG1wNHYtPnZlbmRvciA9IEZPVVJDQ19hcHBsOworICAgIG1wNHYtPmhvcml6b250YWxfcmVzb2x1dGlvbiA9IDcyIDw8IDE2OworICAgIG1wNHYtPnZlcnRpY2FsX3Jlc29sdXRpb24gPSA3MiA8PCAxNjsKKyAgICBtcDR2LT5kZXB0aCA9IChlbnRyeS5mb3VyY2MgPT0gRk9VUkNDX2FwNGgKKyAgICAgICAgfHwgZW50cnkuZm91cmNjID09IEZPVVJDQ19hcDR4KSA/IDMyIDogMjQ7CisKKyAgICAvKiBTZXQgY29tcHJlc3NvciBuYW1lLCByZXF1aXJlZCBieSBzb21lIHNvZnR3YXJlICovCisgICAgc3dpdGNoIChlbnRyeS5mb3VyY2MpIHsKKyAgICAgIGNhc2UgRk9VUkNDX2FwY246CisgICAgICAgIGNvbXByZXNzb3IgPSAiQXBwbGUgUHJvUmVzIDQyMiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGT1VSQ0NfYXBjczoKKyAgICAgICAgY29tcHJlc3NvciA9ICJBcHBsZSBQcm9SZXMgNDIyIExUIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZPVVJDQ19hcGNoOgorICAgICAgICBjb21wcmVzc29yID0gIkFwcGxlIFByb1JlcyA0MjIgSFEiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk9VUkNDX2FwY286CisgICAgICAgIGNvbXByZXNzb3IgPSAiQXBwbGUgUHJvUmVzIDQyMiBQcm94eSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGT1VSQ0NfYXA0aDoKKyAgICAgICAgY29tcHJlc3NvciA9ICJBcHBsZSBQcm9SZXMgNDQ0NCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGT1VSQ0NfYXA0eDoKKyAgICAgICAgY29tcHJlc3NvciA9ICJBcHBsZSBQcm9SZXMgNDQ0NCBYUSI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoY29tcHJlc3NvcikgeworICAgICAgc3RyY3B5ICgoZ2NoYXIgKikgbXA0di0+Y29tcHJlc3NvciArIDEsIGNvbXByZXNzb3IpOworICAgICAgbXA0di0+Y29tcHJlc3NvclswXSA9IHN0cmxlbiAoY29tcHJlc3Nvcik7CisgICAgfQorICB9CisKKyAgZ3N0X29iamVjdF91bnJlZiAocXRtdXgpOworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK3JlZnVzZV9jYXBzOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgInBhZCAlcyByZWZ1c2VkIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgIEdTVF9QQURfTkFNRSAocGFkKSwgY2Fwcyk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocXRtdXgpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorcmVmdXNlX3JlbmVnb3RpYXRpb246CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChxdG11eCwgU1RSRUFNLCBGT1JNQVQsCisgICAgICAgICgiQ2FuJ3QgY2hhbmdlIGlucHV0IGZvcm1hdCBhdCBydW50aW1lLiIpLAorICAgICAgICAoInBhZCAlcyByZWZ1c2VkIHJlbmVnb3RpYXRpb24gdG8gJSIgR1NUX1BUUl9GT1JNQVQsIEdTVF9QQURfTkFNRSAocGFkKSwKKyAgICAgICAgICAgIGNhcHMpKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChxdG11eCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3F0X211eF9zdWJ0aXRsZV9zaW5rX3NldF9jYXBzIChHc3RRVFBhZCAqIHF0cGFkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UGFkICpwYWQgPSBxdHBhZC0+Y29sbGVjdC5wYWQ7CisgIEdzdFFUTXV4ICpxdG11eCA9IEdTVF9RVF9NVVhfQ0FTVCAoZ3N0X3BhZF9nZXRfcGFyZW50IChwYWQpKTsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIFN1YnRpdGxlU2FtcGxlRW50cnkgZW50cnkgPSB7IDAsIH07CisKKyAgLyogZG9lcyBub3QgZ28gd2VsbCB0byByZW5lZ290aWF0ZSBzdHJlYW0gbWlkLXdheSwgdW5sZXNzCisgICAqIHRoZSBvbGQgY2FwcyBhcmUgYSBzdWJzZXQgb2YgdGhlIG5ldyBvbmUgKHRoaXMgbWVhbnMgdXBzdHJlYW0KKyAgICogYWRkZWQgbW9yZSBpbmZvIHRvIHRoZSBjYXBzLCBhcyBib3RoIHNob3VsZCBiZSAnZml4ZWQnIGNhcHMpICovCisgIGlmIChxdHBhZC0+Zm91cmNjKSB7CisgICAgR3N0Q2FwcyAqY3VycmVudF9jYXBzOworCisgICAgY3VycmVudF9jYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChwYWQpOworICAgIGdfYXNzZXJ0IChjYXBzICE9IE5VTEwpOworCisgICAgaWYgKCFnc3RfcXRtdXhfY2Fwc19pc19zdWJzZXRfZnVsbCAocXRtdXgsIGN1cnJlbnRfY2FwcywgY2FwcykpIHsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChjdXJyZW50X2NhcHMpOworICAgICAgZ290byByZWZ1c2VfcmVuZWdvdGlhdGlvbjsKKyAgICB9CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsCisgICAgICAgICJwYWQgJXMgYWNjZXB0ZWQgcmVuZWdvdGlhdGlvbiB0byAlIiBHU1RfUFRSX0ZPUk1BVCAiIGZyb20gJSIKKyAgICAgICAgR1NUX1BUUl9GT1JNQVQsIEdTVF9QQURfTkFNRSAocGFkKSwgY2FwcywgY3VycmVudF9jYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY3VycmVudF9jYXBzKTsKKworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICIlczolcywgY2Fwcz0lIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIEdTVF9ERUJVR19QQURfTkFNRSAocGFkKSwgY2Fwcyk7CisKKyAgLyogc3VidGl0bGVzIGRlZmF1bHQgKi8KKyAgc3VidGl0bGVfc2FtcGxlX2VudHJ5X2luaXQgKCZlbnRyeSk7CisgIHF0cGFkLT5pc19vdXRfb2Zfb3JkZXIgPSBGQUxTRTsKKyAgcXRwYWQtPnN5bmMgPSBGQUxTRTsKKyAgcXRwYWQtPnNwYXJzZSA9IFRSVUU7CisgIHF0cGFkLT5wcmVwYXJlX2J1Zl9mdW5jID0gTlVMTDsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAoc3RydWN0dXJlLCAidGV4dC94LXJhdyIpKSB7CisgICAgY29uc3QgZ2NoYXIgKmZvcm1hdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZm9ybWF0Iik7CisgICAgaWYgKGZvcm1hdCAmJiBzdHJjbXAgKGZvcm1hdCwgInV0ZjgiKSA9PSAwKSB7CisgICAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfdHgzZzsKKyAgICAgIHF0cGFkLT5wcmVwYXJlX2J1Zl9mdW5jID0gZ3N0X3F0X211eF9wcmVwYXJlX3R4M2dfYnVmZmVyOworICAgICAgcXRwYWQtPmNyZWF0ZV9lbXB0eV9idWZmZXIgPSBnc3RfcXRfbXV4X2NyZWF0ZV9lbXB0eV90eDNnX2J1ZmZlcjsKKyAgICB9CisgIH0KKworICBpZiAoIWVudHJ5LmZvdXJjYykKKyAgICBnb3RvIHJlZnVzZV9jYXBzOworCisgIHF0cGFkLT5mb3VyY2MgPSBlbnRyeS5mb3VyY2M7CisgIHF0cGFkLT50cmFrX3N0ZSA9CisgICAgICAoU2FtcGxlVGFibGVFbnRyeSAqKSBhdG9tX3RyYWtfc2V0X3N1YnRpdGxlX3R5cGUgKHF0cGFkLT50cmFrLAorICAgICAgcXRtdXgtPmNvbnRleHQsICZlbnRyeSk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocXRtdXgpOworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK3JlZnVzZV9jYXBzOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgInBhZCAlcyByZWZ1c2VkIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgIEdTVF9QQURfTkFNRSAocGFkKSwgY2Fwcyk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocXRtdXgpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorcmVmdXNlX3JlbmVnb3RpYXRpb246CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LAorICAgICAgICAicGFkICVzIHJlZnVzZWQgcmVuZWdvdGlhdGlvbiB0byAlIiBHU1RfUFRSX0ZPUk1BVCwgR1NUX1BBRF9OQU1FIChwYWQpLAorICAgICAgICBjYXBzKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChxdG11eCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3F0X211eF9zaW5rX2V2ZW50IChHc3RDb2xsZWN0UGFkcyAqIHBhZHMsIEdzdENvbGxlY3REYXRhICogZGF0YSwKKyAgICBHc3RFdmVudCAqIGV2ZW50LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFFUTXV4ICpxdG11eDsKKyAgZ3VpbnQzMiBhdmdfYml0cmF0ZSA9IDAsIG1heF9iaXRyYXRlID0gMDsKKyAgR3N0UGFkICpwYWQgPSBkYXRhLT5wYWQ7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgcXRtdXggPSBHU1RfUVRfTVVYX0NBU1QgKHVzZXJfZGF0YSk7CisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKyAgICAgIEdzdFFUUGFkICpjb2xsZWN0X3BhZDsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisKKyAgICAgIC8qIGZpbmQgc3RyZWFtIGRhdGEgKi8KKyAgICAgIGNvbGxlY3RfcGFkID0gKEdzdFFUUGFkICopIGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgICAgIGdfYXNzZXJ0IChjb2xsZWN0X3BhZCk7CisgICAgICBnX2Fzc2VydCAoY29sbGVjdF9wYWQtPnNldF9jYXBzKTsKKworICAgICAgcmV0ID0gY29sbGVjdF9wYWQtPnNldF9jYXBzIChjb2xsZWN0X3BhZCwgY2Fwcyk7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGV2ZW50ID0gTlVMTDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9UQUc6eworICAgICAgR3N0VGFnTGlzdCAqbGlzdDsKKyAgICAgIEdzdFRhZ1NldHRlciAqc2V0dGVyID0gR1NUX1RBR19TRVRURVIgKHF0bXV4KTsKKyAgICAgIEdzdFRhZ01lcmdlTW9kZSBtb2RlOworICAgICAgZ2NoYXIgKmNvZGU7CisgICAgICBHc3RRVFBhZCAqY29sbGVjdF9wYWQ7CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocXRtdXgpOworICAgICAgbW9kZSA9IGdzdF90YWdfc2V0dGVyX2dldF90YWdfbWVyZ2VfbW9kZSAoc2V0dGVyKTsKKyAgICAgIGNvbGxlY3RfcGFkID0gKEdzdFFUUGFkICopIGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3RhZyAoZXZlbnQsICZsaXN0KTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAicmVjZWl2ZWQgdGFnIGV2ZW50IG9uIHBhZCAlczolcyA6ICUiCisgICAgICAgICAgR1NUX1BUUl9GT1JNQVQsIEdTVF9ERUJVR19QQURfTkFNRSAocGFkKSwgbGlzdCk7CisKKyAgICAgIGlmIChnc3RfdGFnX2xpc3RfZ2V0X3Njb3BlIChsaXN0KSA9PSBHU1RfVEFHX1NDT1BFX0dMT0JBTCkgeworICAgICAgICBnc3RfdGFnX3NldHRlcl9tZXJnZV90YWdzIChzZXR0ZXIsIGxpc3QsIG1vZGUpOworICAgICAgICBxdG11eC0+dGFnc19jaGFuZ2VkID0gVFJVRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghY29sbGVjdF9wYWQtPnRhZ3MpCisgICAgICAgICAgY29sbGVjdF9wYWQtPnRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAgICAgICBnc3RfdGFnX2xpc3RfaW5zZXJ0IChjb2xsZWN0X3BhZC0+dGFncywgbGlzdCwgbW9kZSk7CisgICAgICAgIGNvbGxlY3RfcGFkLT50YWdzX2NoYW5nZWQgPSBUUlVFOworICAgICAgfQorICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXV4KTsKKworICAgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfdWludCAobGlzdCwgR1NUX1RBR19CSVRSQVRFLCAmYXZnX2JpdHJhdGUpIHwKKyAgICAgICAgICBnc3RfdGFnX2xpc3RfZ2V0X3VpbnQgKGxpc3QsIEdTVF9UQUdfTUFYSU1VTV9CSVRSQVRFLCAmbWF4X2JpdHJhdGUpKSB7CisgICAgICAgIEdzdFFUUGFkICpxdHBhZCA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgICAgICAgZ19hc3NlcnQgKHF0cGFkKTsKKworICAgICAgICBpZiAoYXZnX2JpdHJhdGUgPiAwICYmIGF2Z19iaXRyYXRlIDwgR19NQVhVSU5UMzIpCisgICAgICAgICAgcXRwYWQtPmF2Z19iaXRyYXRlID0gYXZnX2JpdHJhdGU7CisgICAgICAgIGlmIChtYXhfYml0cmF0ZSA+IDAgJiYgbWF4X2JpdHJhdGUgPCBHX01BWFVJTlQzMikKKyAgICAgICAgICBxdHBhZC0+bWF4X2JpdHJhdGUgPSBtYXhfYml0cmF0ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nIChsaXN0LCBHU1RfVEFHX0xBTkdVQUdFX0NPREUsICZjb2RlKSkgeworICAgICAgICBjb25zdCBjaGFyICppc29fY29kZSA9IGdzdF90YWdfZ2V0X2xhbmd1YWdlX2NvZGVfaXNvXzYzOV8yVCAoY29kZSk7CisgICAgICAgIGlmIChpc29fY29kZSkgeworICAgICAgICAgIEdzdFFUUGFkICpxdHBhZCA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgICAgICAgICBnX2Fzc2VydCAocXRwYWQpOworICAgICAgICAgIGlmIChxdHBhZC0+dHJhaykgeworICAgICAgICAgICAgLyogaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJhcnkvbWFjLyNkb2N1bWVudGF0aW9uL1F1aWNrVGltZS9RVEZGL1FURkZDaGFwNC9xdGZmNC5odG1sICovCisgICAgICAgICAgICBxdHBhZC0+dHJhay0+bWRpYS5tZGhkLmxhbmd1YWdlX2NvZGUgPQorICAgICAgICAgICAgICAgIChpc29fY29kZVswXSAtIDB4NjApICogMHg0MDAgKyAoaXNvX2NvZGVbMV0gLSAweDYwKSAqIDB4MjAgKworICAgICAgICAgICAgICAgIChpc29fY29kZVsyXSAtIDB4NjApOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBnX2ZyZWUgKGNvZGUpOworICAgICAgfQorCisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGV2ZW50ID0gTlVMTDsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKGV2ZW50ICE9IE5VTEwpCisgICAgcmV0dXJuIGdzdF9jb2xsZWN0X3BhZHNfZXZlbnRfZGVmYXVsdCAocGFkcywgZGF0YSwgZXZlbnQsIEZBTFNFKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9yZWxlYXNlX3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZCAqIHBhZCkKK3sKKyAgR3N0UVRNdXggKm11eCA9IEdTVF9RVF9NVVhfQ0FTVCAoZWxlbWVudCk7CisgIEdTTGlzdCAqd2FsazsKKworICBHU1RfREVCVUdfT0JKRUNUIChlbGVtZW50LCAiUmVsZWFzaW5nICVzOiVzIiwgR1NUX0RFQlVHX1BBRF9OQU1FIChwYWQpKTsKKworICBmb3IgKHdhbGsgPSBtdXgtPnNpbmtwYWRzOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFFUUGFkICpxdHBhZCA9IChHc3RRVFBhZCAqKSB3YWxrLT5kYXRhOworICAgIEdTVF9ERUJVRyAoIkNoZWNraW5nICVzOiVzIiwgR1NUX0RFQlVHX1BBRF9OQU1FIChxdHBhZC0+Y29sbGVjdC5wYWQpKTsKKyAgICBpZiAocXRwYWQtPmNvbGxlY3QucGFkID09IHBhZCkgeworICAgICAgLyogdGhpcyBpcyBpdCwgcmVtb3ZlICovCisgICAgICBtdXgtPnNpbmtwYWRzID0gZ19zbGlzdF9kZWxldGVfbGluayAobXV4LT5zaW5rcGFkcywgd2Fsayk7CisgICAgICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChlbGVtZW50LCBwYWQpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKG11eC0+Y3VycmVudF9wYWQgJiYgbXV4LT5jdXJyZW50X3BhZC0+Y29sbGVjdC5wYWQgPT0gcGFkKSB7CisgICAgbXV4LT5jdXJyZW50X3BhZCA9IE5VTEw7CisgICAgbXV4LT5jdXJyZW50X2NodW5rX3NpemUgPSAwOworICAgIG11eC0+Y3VycmVudF9jaHVua19kdXJhdGlvbiA9IDA7CisgIH0KKworICBnc3RfY29sbGVjdF9wYWRzX3JlbW92ZV9wYWQgKG11eC0+Y29sbGVjdCwgcGFkKTsKKworICBpZiAobXV4LT5zaW5rcGFkcyA9PSBOVUxMKSB7CisgICAgLyogTm8gbW9yZSBvdXRzdGFuZGluZyByZXF1ZXN0IHBhZHMsIHJlc2V0IG91ciBjb3VudGVycyAqLworICAgIG11eC0+dmlkZW9fcGFkcyA9IDA7CisgICAgbXV4LT5hdWRpb19wYWRzID0gMDsKKyAgICBtdXgtPnN1YnRpdGxlX3BhZHMgPSAwOworICB9Cit9CisKK3N0YXRpYyBHc3RQYWQgKgorZ3N0X3F0X211eF9yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsIGNvbnN0IGdjaGFyICogcmVxX25hbWUsIGNvbnN0IEdzdENhcHMgKiBjYXBzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChlbGVtZW50KTsKKyAgR3N0UVRNdXggKnF0bXV4ID0gR1NUX1FUX01VWF9DQVNUIChlbGVtZW50KTsKKyAgR3N0UVRQYWQgKmNvbGxlY3RfcGFkOworICBHc3RQYWQgKm5ld3BhZDsKKyAgR3N0UVRQYWRTZXRDYXBzRnVuYyBzZXRjYXBzX2Z1bmM7CisgIGdjaGFyICpuYW1lOworICBnaW50IHBhZF9pZDsKKyAgZ2Jvb2xlYW4gbG9jayA9IFRSVUU7CisKKyAgaWYgKHRlbXBsLT5kaXJlY3Rpb24gIT0gR1NUX1BBRF9TSU5LKQorICAgIGdvdG8gd3JvbmdfZGlyZWN0aW9uOworCisgIGlmIChxdG11eC0+c3RhdGUgPiBHU1RfUVRfTVVYX1NUQVRFX1NUQVJURUQpCisgICAgZ290byB0b29fbGF0ZTsKKworICBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJhdWRpb18ldSIpKSB7CisgICAgc2V0Y2Fwc19mdW5jID0gZ3N0X3F0X211eF9hdWRpb19zaW5rX3NldF9jYXBzOworICAgIGlmIChyZXFfbmFtZSAhPSBOVUxMICYmIHNzY2FuZiAocmVxX25hbWUsICJhdWRpb18ldSIsICZwYWRfaWQpID09IDEpIHsKKyAgICAgIG5hbWUgPSBnX3N0cmR1cCAocmVxX25hbWUpOworICAgIH0gZWxzZSB7CisgICAgICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiYXVkaW9fJXUiLCBxdG11eC0+YXVkaW9fcGFkcysrKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJ2aWRlb18ldSIpKSB7CisgICAgc2V0Y2Fwc19mdW5jID0gZ3N0X3F0X211eF92aWRlb19zaW5rX3NldF9jYXBzOworICAgIGlmIChyZXFfbmFtZSAhPSBOVUxMICYmIHNzY2FuZiAocmVxX25hbWUsICJ2aWRlb18ldSIsICZwYWRfaWQpID09IDEpIHsKKyAgICAgIG5hbWUgPSBnX3N0cmR1cCAocmVxX25hbWUpOworICAgIH0gZWxzZSB7CisgICAgICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgidmlkZW9fJXUiLCBxdG11eC0+dmlkZW9fcGFkcysrKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJzdWJ0aXRsZV8ldSIpKSB7CisgICAgc2V0Y2Fwc19mdW5jID0gZ3N0X3F0X211eF9zdWJ0aXRsZV9zaW5rX3NldF9jYXBzOworICAgIGlmIChyZXFfbmFtZSAhPSBOVUxMICYmIHNzY2FuZiAocmVxX25hbWUsICJzdWJ0aXRsZV8ldSIsICZwYWRfaWQpID09IDEpIHsKKyAgICAgIG5hbWUgPSBnX3N0cmR1cCAocmVxX25hbWUpOworICAgIH0gZWxzZSB7CisgICAgICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgic3VidGl0bGVfJXUiLCBxdG11eC0+c3VidGl0bGVfcGFkcysrKTsKKyAgICB9CisgICAgbG9jayA9IEZBTFNFOworICB9IGVsc2UKKyAgICBnb3RvIHdyb25nX3RlbXBsYXRlOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiUmVxdWVzdGVkIHBhZDogJXMiLCBuYW1lKTsKKworICAvKiBjcmVhdGUgcGFkIGFuZCBhZGQgdG8gY29sbGVjdGlvbnMgKi8KKyAgbmV3cGFkID0KKyAgICAgIGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfUVRfTVVYX1BBRCwgIm5hbWUiLCBuYW1lLCAiZGlyZWN0aW9uIiwKKyAgICAgIHRlbXBsLT5kaXJlY3Rpb24sICJ0ZW1wbGF0ZSIsIHRlbXBsLCBOVUxMKTsKKyAgZ19mcmVlIChuYW1lKTsKKyAgY29sbGVjdF9wYWQgPSAoR3N0UVRQYWQgKikKKyAgICAgIGdzdF9jb2xsZWN0X3BhZHNfYWRkX3BhZCAocXRtdXgtPmNvbGxlY3QsIG5ld3BhZCwgc2l6ZW9mIChHc3RRVFBhZCksCisgICAgICAoR3N0Q29sbGVjdERhdGFEZXN0cm95Tm90aWZ5KSAoZ3N0X3F0X211eF9wYWRfcmVzZXQpLCBsb2NrKTsKKyAgLyogc2V0IHVwIHBhZCAqLworICBnc3RfcXRfbXV4X3BhZF9yZXNldCAoY29sbGVjdF9wYWQpOworICBjb2xsZWN0X3BhZC0+dHJhayA9IGF0b21fdHJha19uZXcgKHF0bXV4LT5jb250ZXh0KTsKKyAgYXRvbV9tb292X2FkZF90cmFrIChxdG11eC0+bW9vdiwgY29sbGVjdF9wYWQtPnRyYWspOworCisgIHF0bXV4LT5zaW5rcGFkcyA9IGdfc2xpc3RfYXBwZW5kIChxdG11eC0+c2lua3BhZHMsIGNvbGxlY3RfcGFkKTsKKworICAvKiBzZXQgdXAgcGFkIGZ1bmN0aW9ucyAqLworICBjb2xsZWN0X3BhZC0+c2V0X2NhcHMgPSBzZXRjYXBzX2Z1bmM7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChuZXdwYWQsIFRSVUUpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChlbGVtZW50LCBuZXdwYWQpOworCisgIHJldHVybiBuZXdwYWQ7CisKKyAgLyogRVJST1JTICovCit3cm9uZ19kaXJlY3Rpb246CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LCAiUmVxdWVzdCBwYWQgdGhhdCBpcyBub3QgYSBTSU5LIHBhZC4iKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQordG9vX2xhdGU6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LCAiTm90IHByb3ZpZGluZyByZXF1ZXN0IHBhZCBhZnRlciBzdHJlYW0gc3RhcnQuIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK3dyb25nX3RlbXBsYXRlOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgIlRoaXMgaXMgbm90IG91ciB0ZW1wbGF0ZSEiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UVRNdXggKnF0bXV4ID0gR1NUX1FUX01VWF9DQVNUIChvYmplY3QpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAocXRtdXgpOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTU9WSUVfVElNRVNDQUxFOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHF0bXV4LT50aW1lc2NhbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RSQUtfVElNRVNDQUxFOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHF0bXV4LT50cmFrX3RpbWVzY2FsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRE9fQ1RUUzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBxdG11eC0+Z3Vlc3NfcHRzKTsKKyAgICAgIGJyZWFrOworI2lmbmRlZiBHU1RfUkVNT1ZFX0RFUFJFQ0FURUQKKyAgICBjYXNlIFBST1BfRFRTX01FVEhPRDoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBxdG11eC0+ZHRzX21ldGhvZCk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgUFJPUF9GQVNUX1NUQVJUOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHF0bXV4LT5mYXN0X3N0YXJ0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GQVNUX1NUQVJUX1RFTVBfRklMRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHF0bXV4LT5mYXN0X3N0YXJ0X2ZpbGVfcGF0aCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTU9PVl9SRUNPVl9GSUxFOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgcXRtdXgtPm1vb3ZfcmVjb3ZfZmlsZV9wYXRoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GUkFHTUVOVF9EVVJBVElPTjoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBxdG11eC0+ZnJhZ21lbnRfZHVyYXRpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NUUkVBTUFCTEU6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcXRtdXgtPnN0cmVhbWFibGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JFU0VSVkVEX01BWF9EVVJBVElPTjoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHF0bXV4LT5yZXNlcnZlZF9tYXhfZHVyYXRpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JFU0VSVkVEX0RVUkFUSU9OX1JFTUFJTklORzoKKyAgICAgIGlmIChxdG11eC0+cmVzZXJ2ZWRfZHVyYXRpb25fcmVtYWluaW5nID09IEdTVF9DTE9DS19USU1FX05PTkUpCisgICAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHF0bXV4LT5yZXNlcnZlZF9tYXhfZHVyYXRpb24pOworICAgICAgZWxzZSB7CisgICAgICAgIEdzdENsb2NrVGltZSByZW1haW5pbmcgPSBxdG11eC0+cmVzZXJ2ZWRfZHVyYXRpb25fcmVtYWluaW5nOworCisgICAgICAgIC8qIFJlcG9ydCB0aGUgcmVtYWluaW5nIHNwYWNlIGFzIHRoZSBjYWxjdWxhdGVkIHJlbWFpbmluZywgbWludXMKKyAgICAgICAgICogaG93ZXZlciBtdWNoIHdlJ3ZlIG11eGVkIHNpbmNlIHRoZSBsYXN0IHVwZGF0ZSAqLworICAgICAgICBpZiAocmVtYWluaW5nID4gcXRtdXgtPm11eGVkX3NpbmNlX2xhc3RfdXBkYXRlKQorICAgICAgICAgIHJlbWFpbmluZyAtPSBxdG11eC0+bXV4ZWRfc2luY2VfbGFzdF91cGRhdGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZW1haW5pbmcgPSAwOworICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRtdXgsICJyZXNlcnZlZCBkdXJhdGlvbiByZW1haW5pbmcgLSByZXBvcnRpbmcgJSIKKyAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIiglIiBHX0dVSU5UNjRfRk9STUFUICIgLSAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgcmVtYWluaW5nLCBxdG11eC0+cmVzZXJ2ZWRfZHVyYXRpb25fcmVtYWluaW5nLAorICAgICAgICAgICAgcXRtdXgtPm11eGVkX3NpbmNlX2xhc3RfdXBkYXRlKTsKKyAgICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgcmVtYWluaW5nKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRVNFUlZFRF9NT09WX1VQREFURV9QRVJJT0Q6CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCBxdG11eC0+cmVzZXJ2ZWRfbW9vdl91cGRhdGVfcGVyaW9kKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRVNFUlZFRF9CWVRFU19QRVJfU0VDOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHF0bXV4LT5yZXNlcnZlZF9ieXRlc19wZXJfc2VjX3Blcl90cmFrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRVNFUlZFRF9QUkVGSUxMOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHF0bXV4LT5yZXNlcnZlZF9wcmVmaWxsKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JTlRFUkxFQVZFX0JZVEVTOgorICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgcXRtdXgtPmludGVybGVhdmVfYnl0ZXMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0lOVEVSTEVBVkVfVElNRToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHF0bXV4LT5pbnRlcmxlYXZlX3RpbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9SQVdfQVVESU9fRFJJRlQ6CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCBxdG11eC0+bWF4X3Jhd19hdWRpb19kcmlmdCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChxdG11eCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbXV4X2dlbmVyYXRlX2Zhc3Rfc3RhcnRfZmlsZV9wYXRoIChHc3RRVE11eCAqIHF0bXV4KQoreworICBnY2hhciAqdG1wOworCisgIGdfZnJlZSAocXRtdXgtPmZhc3Rfc3RhcnRfZmlsZV9wYXRoKTsKKyAgcXRtdXgtPmZhc3Rfc3RhcnRfZmlsZV9wYXRoID0gTlVMTDsKKworICB0bXAgPSBnX3N0cmR1cF9wcmludGYgKCIlcyVkIiwgInF0bXV4IiwgZ19yYW5kb21faW50ICgpKTsKKyAgcXRtdXgtPmZhc3Rfc3RhcnRfZmlsZV9wYXRoID0gZ19idWlsZF9maWxlbmFtZSAoZ19nZXRfdG1wX2RpciAoKSwgdG1wLCBOVUxMKTsKKyAgZ19mcmVlICh0bXApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UVRNdXggKnF0bXV4ID0gR1NUX1FUX01VWF9DQVNUIChvYmplY3QpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAocXRtdXgpOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTU9WSUVfVElNRVNDQUxFOgorICAgICAgcXRtdXgtPnRpbWVzY2FsZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UUkFLX1RJTUVTQ0FMRToKKyAgICAgIHF0bXV4LT50cmFrX3RpbWVzY2FsZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ET19DVFRTOgorICAgICAgcXRtdXgtPmd1ZXNzX3B0cyA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworI2lmbmRlZiBHU1RfUkVNT1ZFX0RFUFJFQ0FURUQKKyAgICBjYXNlIFBST1BfRFRTX01FVEhPRDoKKyAgICAgIHF0bXV4LT5kdHNfbWV0aG9kID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIFBST1BfRkFTVF9TVEFSVDoKKyAgICAgIHF0bXV4LT5mYXN0X3N0YXJ0ID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZBU1RfU1RBUlRfVEVNUF9GSUxFOgorICAgICAgZ19mcmVlIChxdG11eC0+ZmFzdF9zdGFydF9maWxlX3BhdGgpOworICAgICAgcXRtdXgtPmZhc3Rfc3RhcnRfZmlsZV9wYXRoID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICAvKiBOVUxMIG1lYW5zIHRvIGdlbmVyYXRlIGEgcmFuZG9tIG9uZSAqLworICAgICAgaWYgKCFxdG11eC0+ZmFzdF9zdGFydF9maWxlX3BhdGgpIHsKKyAgICAgICAgZ3N0X3F0X211eF9nZW5lcmF0ZV9mYXN0X3N0YXJ0X2ZpbGVfcGF0aCAocXRtdXgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01PT1ZfUkVDT1ZfRklMRToKKyAgICAgIGdfZnJlZSAocXRtdXgtPm1vb3ZfcmVjb3ZfZmlsZV9wYXRoKTsKKyAgICAgIHF0bXV4LT5tb292X3JlY292X2ZpbGVfcGF0aCA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZSQUdNRU5UX0RVUkFUSU9OOgorICAgICAgcXRtdXgtPmZyYWdtZW50X2R1cmF0aW9uID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NUUkVBTUFCTEU6eworICAgICAgR3N0UVRNdXhDbGFzcyAqcXRtdXhfa2xhc3MgPQorICAgICAgICAgIChHc3RRVE11eENsYXNzICopIChHX09CSkVDVF9HRVRfQ0xBU1MgKHF0bXV4KSk7CisgICAgICBpZiAocXRtdXhfa2xhc3MtPmZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9JU01MKSB7CisgICAgICAgIHF0bXV4LT5zdHJlYW1hYmxlID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9SRVNFUlZFRF9NQVhfRFVSQVRJT046CisgICAgICBxdG11eC0+cmVzZXJ2ZWRfbWF4X2R1cmF0aW9uID0gZ192YWx1ZV9nZXRfdWludDY0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVTRVJWRURfTU9PVl9VUERBVEVfUEVSSU9EOgorICAgICAgcXRtdXgtPnJlc2VydmVkX21vb3ZfdXBkYXRlX3BlcmlvZCA9IGdfdmFsdWVfZ2V0X3VpbnQ2NCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JFU0VSVkVEX0JZVEVTX1BFUl9TRUM6CisgICAgICBxdG11eC0+cmVzZXJ2ZWRfYnl0ZXNfcGVyX3NlY19wZXJfdHJhayA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRVNFUlZFRF9QUkVGSUxMOgorICAgICAgcXRtdXgtPnJlc2VydmVkX3ByZWZpbGwgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSU5URVJMRUFWRV9CWVRFUzoKKyAgICAgIHF0bXV4LT5pbnRlcmxlYXZlX2J5dGVzID0gZ192YWx1ZV9nZXRfdWludDY0ICh2YWx1ZSk7CisgICAgICBxdG11eC0+aW50ZXJsZWF2ZV9ieXRlc19zZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0lOVEVSTEVBVkVfVElNRToKKyAgICAgIHF0bXV4LT5pbnRlcmxlYXZlX3RpbWUgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIHF0bXV4LT5pbnRlcmxlYXZlX3RpbWVfc2V0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfUkFXX0FVRElPX0RSSUZUOgorICAgICAgcXRtdXgtPm1heF9yYXdfYXVkaW9fZHJpZnQgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXV4KTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcXRfbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0UVRNdXggKnF0bXV4ID0gR1NUX1FUX01VWF9DQVNUIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfY29sbGVjdF9wYWRzX3N0YXJ0IChxdG11eC0+Y29sbGVjdCk7CisgICAgICBxdG11eC0+c3RhdGUgPSBHU1RfUVRfTVVYX1NUQVRFX1NUQVJURUQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1BMQVlJTkc6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X2NvbGxlY3RfcGFkc19zdG9wIChxdG11eC0+Y29sbGVjdCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUExBWUlOR19UT19QQVVTRUQ6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3F0X211eF9yZXNldCAocXRtdXgsIFRSVUUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3F0X211eF9yZWdpc3RlciAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBHVHlwZUluZm8gdHlwZWluZm8gPSB7CisgICAgc2l6ZW9mIChHc3RRVE11eENsYXNzKSwKKyAgICAoR0Jhc2VJbml0RnVuYykgZ3N0X3F0X211eF9iYXNlX2luaXQsCisgICAgTlVMTCwKKyAgICAoR0NsYXNzSW5pdEZ1bmMpIGdzdF9xdF9tdXhfY2xhc3NfaW5pdCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgc2l6ZW9mIChHc3RRVE11eCksCisgICAgMCwKKyAgICAoR0luc3RhbmNlSW5pdEZ1bmMpIGdzdF9xdF9tdXhfaW5pdCwKKyAgfTsKKyAgc3RhdGljIGNvbnN0IEdJbnRlcmZhY2VJbmZvIHRhZ19zZXR0ZXJfaW5mbyA9IHsKKyAgICBOVUxMLCBOVUxMLCBOVUxMCisgIH07CisgIHN0YXRpYyBjb25zdCBHSW50ZXJmYWNlSW5mbyB0YWdfeG1wX3dyaXRlcl9pbmZvID0geworICAgIE5VTEwsIE5VTEwsIE5VTEwKKyAgfTsKKyAgc3RhdGljIGNvbnN0IEdJbnRlcmZhY2VJbmZvIHByZXNldF9pbmZvID0geworICAgIE5VTEwsIE5VTEwsIE5VTEwKKyAgfTsKKyAgR1R5cGUgdHlwZTsKKyAgR3N0UVRNdXhGb3JtYXQgZm9ybWF0OworICBHc3RRVE11eENsYXNzUGFyYW1zICpwYXJhbXM7CisgIGd1aW50IGkgPSAwOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfcXRfbXV4X2RlYnVnLCAicXRtdXgiLCAwLCAiUVQgTXV4ZXIiKTsKKworICBHU1RfTE9HICgiUmVnaXN0ZXJpbmcgbXV4ZXJzIik7CisKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBHc3RRVE11eEZvcm1hdFByb3AgKnByb3A7CisgICAgR3N0Q2FwcyAqc3VidGl0bGVfY2FwczsKKworICAgIHByb3AgPSAmZ3N0X3F0X211eF9mb3JtYXRfbGlzdFtpXTsKKyAgICBmb3JtYXQgPSBwcm9wLT5mb3JtYXQ7CisgICAgaWYgKGZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9OT05FKQorICAgICAgYnJlYWs7CisKKyAgICAvKiBjcmVhdGUgYSBjYWNoZSBmb3IgdGhlc2UgcHJvcGVydGllcyAqLworICAgIHBhcmFtcyA9IGdfbmV3MCAoR3N0UVRNdXhDbGFzc1BhcmFtcywgMSk7CisgICAgcGFyYW1zLT5wcm9wID0gcHJvcDsKKyAgICBwYXJhbXMtPnNyY19jYXBzID0gZ3N0X3N0YXRpY19jYXBzX2dldCAoJnByb3AtPnNyY19jYXBzKTsKKyAgICBwYXJhbXMtPnZpZGVvX3NpbmtfY2FwcyA9IGdzdF9zdGF0aWNfY2Fwc19nZXQgKCZwcm9wLT52aWRlb19zaW5rX2NhcHMpOworICAgIHBhcmFtcy0+YXVkaW9fc2lua19jYXBzID0gZ3N0X3N0YXRpY19jYXBzX2dldCAoJnByb3AtPmF1ZGlvX3NpbmtfY2Fwcyk7CisgICAgc3VidGl0bGVfY2FwcyA9IGdzdF9zdGF0aWNfY2Fwc19nZXQgKCZwcm9wLT5zdWJ0aXRsZV9zaW5rX2NhcHMpOworICAgIGlmICghZ3N0X2NhcHNfaXNfZXF1YWwgKHN1YnRpdGxlX2NhcHMsIEdTVF9DQVBTX05PTkUpKSB7CisgICAgICBwYXJhbXMtPnN1YnRpdGxlX3NpbmtfY2FwcyA9IHN1YnRpdGxlX2NhcHM7CisgICAgfSBlbHNlIHsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChzdWJ0aXRsZV9jYXBzKTsKKyAgICB9CisKKyAgICAvKiBjcmVhdGUgdGhlIHR5cGUgbm93ICovCisgICAgdHlwZSA9IGdfdHlwZV9yZWdpc3Rlcl9zdGF0aWMgKEdTVF9UWVBFX0VMRU1FTlQsIHByb3AtPnR5cGVfbmFtZSwgJnR5cGVpbmZvLAorICAgICAgICAwKTsKKyAgICBnX3R5cGVfc2V0X3FkYXRhICh0eXBlLCBHU1RfUVRfTVVYX1BBUkFNU19RREFUQSwgKGdwb2ludGVyKSBwYXJhbXMpOworICAgIGdfdHlwZV9hZGRfaW50ZXJmYWNlX3N0YXRpYyAodHlwZSwgR1NUX1RZUEVfVEFHX1NFVFRFUiwgJnRhZ19zZXR0ZXJfaW5mbyk7CisgICAgZ190eXBlX2FkZF9pbnRlcmZhY2Vfc3RhdGljICh0eXBlLCBHU1RfVFlQRV9UQUdfWE1QX1dSSVRFUiwKKyAgICAgICAgJnRhZ194bXBfd3JpdGVyX2luZm8pOworICAgIGdfdHlwZV9hZGRfaW50ZXJmYWNlX3N0YXRpYyAodHlwZSwgR1NUX1RZUEVfUFJFU0VULCAmcHJlc2V0X2luZm8pOworCisgICAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCBwcm9wLT5uYW1lLCBwcm9wLT5yYW5rLCB0eXBlKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGkrKzsKKyAgfQorCisgIEdTVF9MT0cgKCJGaW5pc2hlZCByZWdpc3RlcmluZyBtdXhlcnMiKTsKKworICAvKiBGSVhNRTogaWRlYWxseSBjbGFzc2lmaWNhdGlvbiB0YWcgc2hvdWxkIGJlIGFkZGVkIGFuZAorICAgICByZWdpc3RlcmVkIGluIGdzdHJlYW1lciBjb3JlIGdzdHRhZ2xpc3QKKyAgICovCisKKyAgR1NUX0xPRyAoIlJlZ2lzdGVyaW5nIHRhZ3MiKTsKKworICBnc3RfdGFnX3JlZ2lzdGVyIChHU1RfVEFHXzNHUF9DTEFTU0lGSUNBVElPTiwgR1NUX1RBR19GTEFHX01FVEEsCisgICAgICBHX1RZUEVfU1RSSU5HLCBHU1RfVEFHXzNHUF9DTEFTU0lGSUNBVElPTiwgImNvbnRlbnQgY2xhc3NpZmljYXRpb24iLAorICAgICAgZ3N0X3RhZ19tZXJnZV91c2VfZmlyc3QpOworCisgIEdTVF9MT0cgKCJGaW5pc2hlZCByZWdpc3RlcmluZyB0YWdzIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L2dzdHF0bXV4LmggYi9nc3QvaXNvbXA0L2dzdHF0bXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllZjIxZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvZ3N0cXRtdXguaApAQCAtMCwwICsxLDMyOCBAQAorLyogUXVpY2t0aW1lIG11eGVyIHBsdWdpbiBmb3IgR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5icj4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19HU1RfUVRfTVVYX0hfXworI2RlZmluZSBfX0dTVF9RVF9NVVhfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Y29sbGVjdHBhZHMuaD4KKworI2luY2x1ZGUgImZvdXJjYy5oIgorI2luY2x1ZGUgImF0b21zLmgiCisjaW5jbHVkZSAiYXRvbXNyZWNvdmVyeS5oIgorI2luY2x1ZGUgImdzdHF0bXV4bWFwLmgiCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9RVF9NVVggKGdzdF9xdF9tdXhfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1FUX01VWChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9RVF9NVVgsIEdzdFFUTXV4KSkKKyNkZWZpbmUgR1NUX1FUX01VWF9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUVRfTVVYLCBHc3RRVE11eCkpCisjZGVmaW5lIEdTVF9JU19RVF9NVVgob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUVRfTVVYKSkKKyNkZWZpbmUgR1NUX0lTX1FUX01VWF9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUVRfTVVYKSkKKyNkZWZpbmUgR1NUX1FUX01VWF9DQVNUKG9iaikgKChHc3RRVE11eCopKG9iaikpCisKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFFUTXV4IEdzdFFUTXV4OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFFUTXV4Q2xhc3MgR3N0UVRNdXhDbGFzczsKK3R5cGVkZWYgc3RydWN0IF9Hc3RRVFBhZCBHc3RRVFBhZDsKKworLyoKKyAqIEdzdFFUUGFkUHJlcGFyZUJ1ZmZlckZ1bmMKKyAqCisgKiBSZWNlaXZlcyBhIGJ1ZmZlciAodGFrZXMgcmVmKSBhbmQgcmV0dXJucyBhIG5ldyBidWZmZXIgdGhhdCBzaG91bGQKKyAqIHJlcGxhY2UgdGhlIHBhc3NlZCBvbmUuCisgKgorICogVXNlZnVsIGZvciB3aGVuIHRoZSBwYWQvZGF0YXR5cGUgbmVlZHMgc29tZSBtYW5pcHVsYXRpb24gYmVmb3JlCisgKiBiZWluZyBtdXhlZC4gKE9yaWdpbmFsbHkgYWRkZWQgZm9yIGltYWdlL3gtanBjIHN1cHBvcnQsIGZvciB3aGljaCBidWZmZXJzCisgKiBuZWVkIHRvIGJlIHdyYXBwZWQgaW50byBhIGlzb20gYm94KQorICovCit0eXBlZGVmIEdzdEJ1ZmZlciAqICgqR3N0UVRQYWRQcmVwYXJlQnVmZmVyRnVuYykgKEdzdFFUUGFkICogcGFkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZiwgR3N0UVRNdXggKiBxdG11eCk7CisKK3R5cGVkZWYgZ2Jvb2xlYW4gKCpHc3RRVFBhZFNldENhcHNGdW5jKSAoR3N0UVRQYWQgKiBwYWQsIEdzdENhcHMgKiBjYXBzKTsKK3R5cGVkZWYgR3N0QnVmZmVyICogKCpHc3RRVFBhZENyZWF0ZUVtcHR5QnVmZmVyRnVuYykgKEdzdFFUUGFkICogcGFkLCBnaW50NjQgZHVyYXRpb24pOworCisjZGVmaW5lIFFUTVVYX05PX09GX1RTICAgMTAKKworc3RydWN0IF9Hc3RRVFBhZAoreworICBHc3RDb2xsZWN0RGF0YSBjb2xsZWN0OyAgICAgICAvKiB3ZSBleHRlbmQgdGhlIENvbGxlY3REYXRhICovCisKKyAgLyogZm91cmNjIGlkIG9mIHN0cmVhbSAqLworICBndWludDMyIGZvdXJjYzsKKyAgLyogd2hldGhlciB1c2luZyBmb3JtYXQgdGhhdCBoYXZlIG91dCBvZiBvcmRlciBidWZmZXJzICovCisgIGdib29sZWFuIGlzX291dF9vZl9vcmRlcjsKKyAgLyogaWYgbm90IDAsIHRyYWNrIHdpdGggY29uc3RhbnQgc2l6ZWQgc2FtcGxlcywgZS5nLiByYXcgYXVkaW8gKi8KKyAgZ3VpbnQgc2FtcGxlX3NpemU7CisgIC8qIG1ha2Ugc3luYyB0YWJsZSBlbnRyeSAqLworICBnYm9vbGVhbiBzeW5jOworICAvKiBpZiBpdCBpcyBhIHNwYXJzZSBzdHJlYW0KKyAgICogKG1lYW5pbmcgd2UgY2FuJ3QgdXNlIFBUUyBkaWZmZXJlbmNlcyB0byBjb21wdXRlIGR1cmF0aW9uKSAqLworICBnYm9vbGVhbiBzcGFyc2U7CisgIC8qIGJpdHJhdGVzICovCisgIGd1aW50MzIgYXZnX2JpdHJhdGUsIG1heF9iaXRyYXRlOworICAvKiBleHBlY3RlZCBzYW1wbGUgZHVyYXRpb24gKi8KKyAgZ3VpbnQgZXhwZWN0ZWRfc2FtcGxlX2R1cmF0aW9uX247CisgIGd1aW50IGV4cGVjdGVkX3NhbXBsZV9kdXJhdGlvbl9kOworCisgIC8qIGZvciBhdmcgYml0cmF0ZSBjYWxjdWxhdGlvbiAqLworICBndWludDY0IHRvdGFsX2J5dGVzOworICBndWludDY0IHRvdGFsX2R1cmF0aW9uOworCisgIEdzdEJ1ZmZlciAqbGFzdF9idWY7CisgIC8qIGR0cyBvZiBsYXN0X2J1ZiAqLworICBHc3RDbG9ja1RpbWUgbGFzdF9kdHM7CisgIGd1aW50NjQgc2FtcGxlX29mZnNldDsKKworICAvKiBUaGlzIGlzIGNvbXBlbnNhdGUgZm9yIENUVFMgKi8KKyAgR3N0Q2xvY2tUaW1lIGR0c19hZGp1c3RtZW50OworCisgIC8qIHN0b3JlIHRoZSBmaXJzdCB0aW1lc3RhbXAgZm9yIGNvbXBhcmluZyB3aXRoIG90aGVyIHN0cmVhbXMgYW5kCisgICAqIGtub3cgaWYgdGhlcmUgYXJlIGxhdGUgc3RyZWFtcyAqLworICAvKiBzdWJqZWN0ZWQgdG8gZHRzIGFkanVzdG1lbnQgKi8KKyAgR3N0Q2xvY2tUaW1lIGZpcnN0X3RzOworICBHc3RDbG9ja1RpbWUgZmlyc3RfZHRzOworCisgIC8qIGFsbCB0aGUgYXRvbSBhbmQgY2h1bmsgYm9vay1rZWVwaW5nIGlzIGRlbGVnYXRlZCBoZXJlCisgICAqIHVub3duZWQvdW5jb3VudGVkIHJlZmVyZW5jZSwgcGFyZW50IE1PT1Ygb3ducyAqLworICBBdG9tVFJBSyAqdHJhazsKKyAgQXRvbVRSQUsgKnRjX3RyYWs7CisgIFNhbXBsZVRhYmxlRW50cnkgKnRyYWtfc3RlOworICAvKiBmcmFnbWVudGVkIHN1cHBvcnQgKi8KKyAgLyogbWV0YSBkYXRhIGJvb2sta2VlcGluZyBkZWxlZ2F0ZWQgaGVyZSAqLworICBBdG9tVFJBRiAqdHJhZjsKKyAgLyogZnJhZ21lbnQgYnVmZmVycyAqLworICBBVE9NX0FSUkFZIChHc3RCdWZmZXIgKikgZnJhZ21lbnRfYnVmZmVyczsKKyAgLyogcnVubmluZyBmcmFnbWVudCBkdXJhdGlvbiAqLworICBnaW50NjQgZnJhZ21lbnRfZHVyYXRpb247CisgIC8qIG9wdGlvbmFsIGZyYWdtZW50IGluZGV4IGJvb2sta2VlcGluZyAqLworICBBdG9tVEZSQSAqdGZyYTsKKworICAvKiBTZXQgd2hlbiB0YWdzIGFyZSByZWNlaXZlZCwgY2xlYXJlZCB3aGVuIHdyaXR0ZW4gdG8gbW9vdiAqLworICBnYm9vbGVhbiB0YWdzX2NoYW5nZWQ7CisKKyAgR3N0VGFnTGlzdCAqdGFnczsKKworICAvKiBpZiBub3RoaW5nIGlzIHNldCwgaXQgd29uJ3QgYmUgY2FsbGVkICovCisgIEdzdFFUUGFkUHJlcGFyZUJ1ZmZlckZ1bmMgcHJlcGFyZV9idWZfZnVuYzsKKyAgR3N0UVRQYWRTZXRDYXBzRnVuYyBzZXRfY2FwczsKKyAgR3N0UVRQYWRDcmVhdGVFbXB0eUJ1ZmZlckZ1bmMgY3JlYXRlX2VtcHR5X2J1ZmZlcjsKKworICAvKiBTTVBURSB0aW1lY29kZSAqLworICBHc3RWaWRlb1RpbWVDb2RlICpmaXJzdF90YzsKKyAgR3N0Q2xvY2tUaW1lIGZpcnN0X3B0czsKKyAgZ3VpbnQ2NCB0Y19wb3M7CisKKyAgLyogZm9yIGtlZXBpbmcgdHJhY2sgaW4gcHJlLWZpbGwgbW9kZSAqLworICBHQXJyYXkgKnNhbXBsZXM7CisgIC8qIGN1cnJlbnQgc2FtcGxlICovCisgIEdzdEFkYXB0ZXIgKnJhd19hdWRpb19hZGFwdGVyOworICBndWludDY0IHJhd19hdWRpb19hZGFwdGVyX29mZnNldDsKKyAgR3N0Q2xvY2tUaW1lIHJhd19hdWRpb19hZGFwdGVyX3B0czsKK307CisKK3R5cGVkZWYgZW51bSBfR3N0UVRNdXhTdGF0ZQoreworICBHU1RfUVRfTVVYX1NUQVRFX05PTkUsCisgIEdTVF9RVF9NVVhfU1RBVEVfU1RBUlRFRCwKKyAgR1NUX1FUX01VWF9TVEFURV9EQVRBLAorICBHU1RfUVRfTVVYX1NUQVRFX0VPUworfSBHc3RRVE11eFN0YXRlOworCit0eXBlZGVmIGVudW0gX0dzdFF0TXV4TW9kZSB7CisgICAgR1NUX1FUX01VWF9NT0RFX01PT1ZfQVRfRU5ELAorICAgIEdTVF9RVF9NVVhfTU9ERV9GUkFHTUVOVEVELAorICAgIEdTVF9RVF9NVVhfTU9ERV9GUkFHTUVOVEVEX1NUUkVBTUFCTEUsCisgICAgR1NUX1FUX01VWF9NT0RFX0ZBU1RfU1RBUlQsCisgICAgR1NUX1FUX01VWF9NT0RFX1JPQlVTVF9SRUNPUkRJTkcsCisgICAgR1NUX1FUX01VWF9NT0RFX1JPQlVTVF9SRUNPUkRJTkdfUFJFRklMTCwKK30gR3N0UXRNdXhNb2RlOworCitzdHJ1Y3QgX0dzdFFUTXV4Cit7CisgIEdzdEVsZW1lbnQgZWxlbWVudDsKKworICBHc3RQYWQgKnNyY3BhZDsKKyAgR3N0Q29sbGVjdFBhZHMgKmNvbGxlY3Q7CisgIEdTTGlzdCAqc2lua3BhZHM7CisKKyAgLyogc3RhdGUgKi8KKyAgR3N0UVRNdXhTdGF0ZSBzdGF0ZTsKKworICAvKiBNdXggbW9kZSwgaW5mZXJyZWQgZnJvbSBwcm9wZXJ0eQorICAgKiBzZXQgaW4gZ3N0X3F0X211eF9zdGFydF9maWxlKCkgKi8KKyAgR3N0UXRNdXhNb2RlIG11eF9tb2RlOworCisgIC8qIHNpemUgb2YgaGVhZGVyIChwcmVmaXgsIGF0b21zIChmdHlwLCBwb3NzaWJseSBtb292LCBtZGF0IGhlYWRlcikpICovCisgIGd1aW50NjQgaGVhZGVyX3NpemU7CisgIC8qIGFjY3VtdWxhdGVkIHNpemUgb2YgcmF3IG1lZGlhIGRhdGEgKG5vdCBpbmNsdWRpbmcgbWRhdCBoZWFkZXIpICovCisgIGd1aW50NjQgbWRhdF9zaXplOworICAvKiBwb3NpdGlvbiBvZiB0aGUgbW9vdiAoZm9yIGZyYWdtZW50ZWQgbW9kZSkgb3IgcmVzZXJ2ZWQgbW9vdiBhdG9tCisgICAqIGFyZWEgKGZvciByb2J1c3QtbXV4aW5nIG1vZGUpICovCisgIGd1aW50NjQgbW9vdl9wb3M7CisgIC8qIHBvc2l0aW9uIG9mIG1kYXQgYXRvbSBoZWFkZXIgKGZvciBsYXRlciB1cGRhdGluZyBvZiBzaXplKSBpbgorICAgKiBtb292LWF0LWVuZCwgZnJhZ21lbnRlZCBhbmQgcm9idXN0LW11eGluZyBtb2RlcyAqLworICBndWludDY0IG1kYXRfcG9zOworCisgIC8qIGtlZXAgdHJhY2sgb2YgdGhlIGxhcmdlc3QgY2h1bmsgdG8gZmluZS10dW5lIGJyYW5kcyAqLworICBHc3RDbG9ja1RpbWUgbG9uZ2VzdF9jaHVuazsKKworICAvKiBFYXJsaWVzdCB0aW1lc3RhbXAgYWNyb3NzIGFsbCBwYWRzL3RyYWtzCisgICAqICh1bmFkanVzdGVkIGluY29taW5nIFBUUykgKi8KKyAgR3N0Q2xvY2tUaW1lIGZpcnN0X3RzOworICAvKiBMYXN0IERUUyBhY3Jvc3MgYWxsIHBhZHMgKD0gZHVyYXRpb24pICovCisgIEdzdENsb2NrVGltZSBsYXN0X2R0czsKKworICAvKiBMYXN0IHBhZCB3ZSB1c2VkIGZvciB3cml0aW5nIHRoZSBjdXJyZW50IGNodW5rICovCisgIEdzdFFUUGFkICpjdXJyZW50X3BhZDsKKyAgZ3VpbnQ2NCBjdXJyZW50X2NodW5rX3NpemU7CisgIEdzdENsb2NrVGltZSBjdXJyZW50X2NodW5rX2R1cmF0aW9uOworICBndWludDY0IGN1cnJlbnRfY2h1bmtfb2Zmc2V0OworCisgIC8qIGF0b20gaGVscGVyIG9iamVjdHMgKi8KKyAgQXRvbXNDb250ZXh0ICpjb250ZXh0OworICBBdG9tRlRZUCAqZnR5cDsKKyAgQXRvbU1PT1YgKm1vb3Y7CisgIEdTTGlzdCAqZXh0cmFfYXRvbXM7IC8qIGxpc3Qgb2YgZXh0cmEgdG9wLWxldmVsIGF0b21zIChlLmcuIFVVSUQgZm9yIHhtcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICogU3RvcmVkIGFzIEF0b21JbmZvIHN0cnVjdHMgKi8KKworICAvKiBTZXQgd2hlbiB0YWdzIGFyZSByZWNlaXZlZCwgY2xlYXJlZCB3aGVuIHdyaXR0ZW4gdG8gbW9vdiAqLworICBnYm9vbGVhbiB0YWdzX2NoYW5nZWQ7CisKKyAgLyogZnJhZ21lbnRlZCBmaWxlIGluZGV4ICovCisgIEF0b21NRlJBICptZnJhOworCisgIC8qIGZhc3Qgc3RhcnQgKi8KKyAgRklMRSAqZmFzdF9zdGFydF9maWxlOworCisgIC8qIG1vb3YgcmVjb3ZlcnkgKi8KKyAgRklMRSAqbW9vdl9yZWNvdl9maWxlOworCisgIC8qIGZyYWdtZW50IHNlcXVlbmNlICovCisgIGd1aW50MzIgZnJhZ21lbnRfc2VxdWVuY2U7CisKKyAgLyogcHJvcGVydGllcyAqLworICBndWludDMyIHRpbWVzY2FsZTsKKyAgZ3VpbnQzMiB0cmFrX3RpbWVzY2FsZTsKKyAgQXRvbXNUcmVlRmxhdm9yIGZsYXZvcjsKKyAgZ2Jvb2xlYW4gZmFzdF9zdGFydDsKKyAgZ2Jvb2xlYW4gZ3Vlc3NfcHRzOworI2lmbmRlZiBHU1RfUkVNT1ZFX0RFUFJFQ0FURUQKKyAgZ2ludCBkdHNfbWV0aG9kOworI2VuZGlmCisgIGdjaGFyICpmYXN0X3N0YXJ0X2ZpbGVfcGF0aDsKKyAgZ2NoYXIgKm1vb3ZfcmVjb3ZfZmlsZV9wYXRoOworICBndWludDMyIGZyYWdtZW50X2R1cmF0aW9uOworICAvKiBXaGV0aGVyIG9yIG5vdCB0byB3b3JrIGluICdzdHJlYW1hYmxlJyBtb2RlIGFuZCBub3QKKyAgICogc2VlayB0byByZXdyaXRlIGhlYWRlcnMgLSBvbmx5IHZhbGlkIGZvciBmcmFnbWVudGVkCisgICAqIG1vZGUuICovCisgIGdib29sZWFuIHN0cmVhbWFibGU7CisKKyAgLyogUmVxdWVzdGVkIHRhcmdldCBtYXhpbXVtIGR1cmF0aW9uICovCisgIEdzdENsb2NrVGltZSByZXNlcnZlZF9tYXhfZHVyYXRpb247CisgIC8qIEVzdGltYXRlIG9mIHJlbWFpbmluZyByZXNlcnZlZCBoZWFkZXIgc3BhY2UgKGluIG5zIG9mIHJlY29yZGluZykgKi8KKyAgR3N0Q2xvY2tUaW1lIHJlc2VydmVkX2R1cmF0aW9uX3JlbWFpbmluZzsKKyAgLyogTXVsdGlwbGllciBmb3IgY29udmVyc2lvbiBmcm9tIHJlc2VydmVkX21heF9kdXJhdGlvbiB0byBieXRlcyAqLworICBndWludCByZXNlcnZlZF9ieXRlc19wZXJfc2VjX3Blcl90cmFrOworCisgIGd1aW50NjQgaW50ZXJsZWF2ZV9ieXRlczsKKyAgR3N0Q2xvY2tUaW1lIGludGVybGVhdmVfdGltZTsKKyAgZ2Jvb2xlYW4gaW50ZXJsZWF2ZV9ieXRlc19zZXQsIGludGVybGVhdmVfdGltZV9zZXQ7CisKKyAgR3N0Q2xvY2tUaW1lIG1heF9yYXdfYXVkaW9fZHJpZnQ7CisKKyAgLyogUmVzZXJ2ZWQgbWluaW11bSBNT09WIHNpemUgaW4gYnl0ZXMKKyAgICogVGhpcyBpcyBjb252ZXJ0ZWQgZnJvbSByZXNlcnZlZF9tYXhfZHVyYXRpb24KKyAgICogdXNpbmcgdGhlIGJ5dGVzL3RyYWsvc2VjIGVzdGltYXRlICovCisgIGd1aW50MzIgcmVzZXJ2ZWRfbW9vdl9zaXplOworICAvKiBCYXNpYyBzaXplIG9mIHRoZSBtb292IChzdGF0aWMgaGVhZGVycyArIHRhZ3MpICovCisgIGd1aW50MzIgYmFzZV9tb292X3NpemU7CisgIC8qIFNpemUgb2YgdGhlIG1vc3QgcmVjZW50bHkgZ2VuZXJhdGVkIG1vb3YgaGVhZGVyICovCisgIGd1aW50MzIgbGFzdF9tb292X3NpemU7CisgIC8qIFRydWUgaWYgdGhlIGZpcnN0IG1vb3YgaW4gdGhlIHBpbmctcG9uZyBidWZmZXJzCisgICAqIGlzIHRoZSBhY3RpdmUgb25lLiBTZWUgZ3N0X3F0X211eF9yb2J1c3RfcmVjb3JkaW5nX3Jld3JpdGVfbW9vdigpICovCisgIGdib29sZWFuIHJlc2VydmVkX21vb3ZfZmlyc3RfYWN0aXZlOworCisgIC8qIFRyYWNraW5nIG9mIHBlcmlvZGljIE1PT1YgdXBkYXRlcyAqLworICBHc3RDbG9ja1RpbWUgbGFzdF9tb292X3VwZGF0ZTsKKyAgR3N0Q2xvY2tUaW1lIHJlc2VydmVkX21vb3ZfdXBkYXRlX3BlcmlvZDsKKyAgR3N0Q2xvY2tUaW1lIG11eGVkX3NpbmNlX2xhc3RfdXBkYXRlOworCisgIGdib29sZWFuIHJlc2VydmVkX3ByZWZpbGw7CisKKyAgLyogZm9yIHJlcXVlc3QgcGFkIG5hbWluZyAqLworICBndWludCB2aWRlb19wYWRzLCBhdWRpb19wYWRzLCBzdWJ0aXRsZV9wYWRzOworfTsKKworc3RydWN0IF9Hc3RRVE11eENsYXNzCit7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7CisKKyAgR3N0UVRNdXhGb3JtYXQgZm9ybWF0OworfTsKKworLyogdHlwZSByZWdpc3RlciBoZWxwZXIgc3RydWN0ICovCit0eXBlZGVmIHN0cnVjdCBfR3N0UVRNdXhDbGFzc1BhcmFtcworeworICBHc3RRVE11eEZvcm1hdFByb3AgKnByb3A7CisgIEdzdENhcHMgKnNyY19jYXBzOworICBHc3RDYXBzICp2aWRlb19zaW5rX2NhcHM7CisgIEdzdENhcHMgKmF1ZGlvX3NpbmtfY2FwczsKKyAgR3N0Q2FwcyAqc3VidGl0bGVfc2lua19jYXBzOworfSBHc3RRVE11eENsYXNzUGFyYW1zOworCisjZGVmaW5lIEdTVF9RVF9NVVhfUEFSQU1TX1FEQVRBIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nKCJxdC1tdXgtcGFyYW1zIikKKworR1R5cGUgZ3N0X3F0X211eF9nZXRfdHlwZSAodm9pZCk7CitnYm9vbGVhbiBnc3RfcXRfbXV4X3JlZ2lzdGVyIChHc3RQbHVnaW4gKiBwbHVnaW4pOworCisvKiBGSVhNRTogaWRlYWxseSBjbGFzc2lmaWNhdGlvbiB0YWcgc2hvdWxkIGJlIGFkZGVkIGFuZAorICogcmVnaXN0ZXJlZCBpbiBnc3RyZWFtZXIgY29yZSBnc3R0YWdsaXN0CisgKgorICogdGhpcyB0YWcgaXMgYSBzdHJpbmcgaW4gdGhlIGZvcm1hdDogZW50aXR5Zm91cmNjOi8vdGFibGVfbnVtL2NvbnRlbnQKKyAqIEZJWE1FIFNob3VsZG4ndCB3ZSBhZGQgYSBmaWVsZCBmb3IgJ2xhbmd1YWdlJz8KKyAqLworI2RlZmluZSBHU1RfVEFHXzNHUF9DTEFTU0lGSUNBVElPTiAiY2xhc3NpZmljYXRpb24iCisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9RVF9NVVhfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmMgYi9nc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUzNGUxMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvZ3N0cXRtdXhtYXAuYwpAQCAtMCwwICsxLDQxMiBAQAorLyogUXVpY2t0aW1lIG11eGVyIHBsdWdpbiBmb3IgR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhpYWdvIFNvdXNhIFNhbnRvcyA8dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnI+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKgorICogVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIFNvdXJjZSBDb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlLgorICogU2VlIGZ1cnRoZXIgZXhwbGFuYXRpb24gYXR0YWNoZWQgaW4gTGljZW5zZSBTdGF0ZW1lbnQgKGRpc3RyaWJ1dGVkIGluIHRoZSBmaWxlCisgKiBMSUNFTlNFKS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImdzdHF0bXV4bWFwLmgiCisjaW5jbHVkZSAiZm91cmNjLmgiCisKKy8qIHN0YXRpYyBpbmZvIHJlbGF0ZWQgdG8gdmFyaW91cyBmb3JtYXQgKi8KKworI2RlZmluZSBDT01NT05fVklERU9fQ0FQUyBcCisgICJ3aWR0aCA9IChpbnQpIFsgMTYsIE1BWCBdLCAiIFwKKyAgImhlaWdodCA9IChpbnQpIFsgMTYsIE1BWCBdIgorCisjZGVmaW5lIENPTU1PTl9WSURFT19DQVBTX05PX0ZSQU1FUkFURSBcCisgICJ3aWR0aCA9IChpbnQpIFsgMTYsIE1BWCBdLCAiIFwKKyAgImhlaWdodCA9IChpbnQpIFsgMTYsIE1BWCBdICIKKworI2RlZmluZSBIMjYzX0NBUFMgXAorICAidmlkZW8veC1oMjYzLCAiIFwKKyAgQ09NTU9OX1ZJREVPX0NBUFMKKworI2RlZmluZSBIMjY0X0NBUFMgXAorICAidmlkZW8veC1oMjY0LCAiIFwKKyAgInN0cmVhbS1mb3JtYXQgPSAoc3RyaW5nKSBhdmMsICIgXAorICAiYWxpZ25tZW50ID0gKHN0cmluZykgYXUsICIgXAorICBDT01NT05fVklERU9fQ0FQUworCisjZGVmaW5lIEgyNjVfQ0FQUyBcCisgICJ2aWRlby94LWgyNjUsICIgXAorICAic3RyZWFtLWZvcm1hdCA9IChzdHJpbmcpIHsgaHZjMSwgaGV2MSB9LCAiIFwKKyAgImFsaWdubWVudCA9IChzdHJpbmcpIGF1LCAiIFwKKyAgQ09NTU9OX1ZJREVPX0NBUFMKKworI2RlZmluZSBNUEVHNFZfQ0FQUyBcCisgICJ2aWRlby9tcGVnLCAiIFwKKyAgIm1wZWd2ZXJzaW9uID0gKGludCkgNCwgIlwKKyAgInN5c3RlbXN0cmVhbSA9IChib29sZWFuKSBmYWxzZSwgIiBcCisgIENPTU1PTl9WSURFT19DQVBTICI7ICIgXAorICAidmlkZW8veC1kaXZ4LCAiIFwKKyAgImRpdnh2ZXJzaW9uID0gKGludCkgNSwgIlwKKyAgQ09NTU9OX1ZJREVPX0NBUFMKKworI2RlZmluZSBQUk9SRVNfQ0FQUyBcCisgICJ2aWRlby94LXByb3JlcywgIiBcCisgICJ2YXJpYW50ID0gKHN0cmluZykge3N0YW5kYXJkLCBsdCwgaHEsIHByb3h5LCA0NDQ0LCA0NDQ0eHF9LCAiIFwKKyAgQ09NTU9OX1ZJREVPX0NBUFMKKworI2RlZmluZSBDSU5FRk9STV9DQVBTIFwKKyAgInZpZGVvL3gtY2luZWZvcm0sICIgXAorICBDT01NT05fVklERU9fQ0FQUworCisjZGVmaW5lIFNWUV9DQVBTIFwKKyAgInZpZGVvL3gtc3ZxLCAiIFwKKyAgInN2cXZlcnNpb24gPSAoaW50KSAzLCAiIFwKKyAgQ09NTU9OX1ZJREVPX0NBUFMKKworI2RlZmluZSBDT01NT05fQVVESU9fQ0FQUyhjLCByKSBcCisgICJjaGFubmVscyA9IChpbnQpIFsgMSwgIiBHX1NUUklOR0lGWSAoYykgIiBdLCAiIFwKKyAgInJhdGUgPSAoaW50KSBbIDEsICIgR19TVFJJTkdJRlkgKHIpICIgXSIKKworI2RlZmluZSBQQ01fQ0FQUyBcCisgICJhdWRpby94LXJhdywgIiBcCisgICJmb3JtYXQgPSAoc3RyaW5nKSB7IFMxNkxFLCBTMTZCRSwgUzgsIFU4IH0sICIgXAorICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgXAorICBDT01NT05fQVVESU9fQ0FQUyAoMiwgTUFYKQorCisjZGVmaW5lIFBDTV9DQVBTX0ZVTEwgXAorICAiYXVkaW8veC1yYXcsICIgXAorICAiZm9ybWF0ID0gKHN0cmluZykgeyBTMzJMRSwgUzMyQkUsIFMyNExFLCBTMjRCRSwgUzE2TEUsIFMxNkJFLCBTOCwgVTggfSwgIiBcCisgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiBcCisgIENPTU1PTl9BVURJT19DQVBTICgyLCBNQVgpCisKKyNkZWZpbmUgUENNX0NBUFNfVU5QT1NJVElPTkVEIFwKKyAgImF1ZGlvL3gtcmF3LCAiIFwKKyAgImZvcm1hdCA9IChzdHJpbmcpIHsgUzMyTEUsIFMzMkJFLCBTMjRMRSwgUzI0QkUsIFMxNkxFLCBTMTZCRSwgUzgsIFU4IH0sICIgXAorICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgXAorICAiY2hhbm5lbC1tYXNrID0gKGJpdG1hc2spIDAsICIgXAorICBDT01NT05fQVVESU9fQ0FQUyAoMTYsIE1BWCkKKworI2RlZmluZSBNUDNfQ0FQUyBcCisgICJhdWRpby9tcGVnLCAiIFwKKyAgIm1wZWd2ZXJzaW9uID0gKGludCkgMSwgIiBcCisgICJsYXllciA9IChpbnQpIDMsICIgXAorICBDT01NT05fQVVESU9fQ0FQUyAoMiwgTUFYKQorCisjZGVmaW5lIE1QMTIzX0NBUFMgXAorICAiYXVkaW8vbXBlZywgIiBcCisgICJtcGVndmVyc2lvbiA9IChpbnQpIDEsICIgXAorICAibGF5ZXIgPSAoaW50KSBbMSwgM10sICIgXAorICBDT01NT05fQVVESU9fQ0FQUyAoMiwgTUFYKQorCisjZGVmaW5lIEFBQ19DQVBTIFwKKyAgImF1ZGlvL21wZWcsICIgXAorICAibXBlZ3ZlcnNpb24gPSAoaW50KSA0LCAiIFwKKyAgInN0cmVhbS1mb3JtYXQgPSAoc3RyaW5nKSByYXcsICIgXAorICBDT01NT05fQVVESU9fQ0FQUyAoOCwgTUFYKQorCisjZGVmaW5lIEFDM19DQVBTIFwKKyAgImF1ZGlvL3gtYWMzLCAiIFwKKyAgQ09NTU9OX0FVRElPX0NBUFMgKDYsIE1BWCkKKworI2RlZmluZSBBTVJfQ0FQUyBcCisgICJhdWRpby9BTVIsICIgXAorICAicmF0ZSA9IChpbnQpIDgwMDAsICIgXAorICAiY2hhbm5lbHMgPSBbIDEsIDIgXTsgIiBcCisgICJhdWRpby9BTVItV0IsICIgXAorICAicmF0ZSA9IChpbnQpIDE2MDAwLCAiIFwKKyAgImNoYW5uZWxzID0gWyAxLCAyIF0gIgorCisjZGVmaW5lIEFEUENNX0NBUFMgIFwKKyAgImF1ZGlvL3gtYWRwY20sICIgXAorICAibGF5b3V0ID0gKHN0cmluZylkdmksICIgXAorICAiYmxvY2tfYWxpZ24gPSAoaW50KVs2NCwgODA5Nl0sICIgXAorICBDT01NT05fQVVESU9fQ0FQUygyLCBNQVgpCisKKyNkZWZpbmUgQUxBQ19DQVBTIFwKKyAgImF1ZGlvL3gtYWxhYywgIiBcCisgIENPTU1PTl9BVURJT19DQVBTKDIsIE1BWCkKKworI2RlZmluZSBPUFVTX0NBUFMgXAorICAiYXVkaW8veC1vcHVzLCAiIFwKKyAgImNoYW5uZWwtbWFwcGluZy1mYW1pbHkgPSAoaW50KSBbMCwgMjU1XSwgIiBcCisgIENPTU1PTl9BVURJT19DQVBTKDgsIE1BWCkKKworCisjZGVmaW5lIFRFWFRfVVRGOCBcCisgICJ0ZXh0L3gtcmF3LCAiIFwKKyAgImZvcm1hdD0oc3RyaW5nKXV0ZjgiCisKKy8qIEZJWE1FIDAuMTEgLSB0YWtlIGEgbG9vayBhdCBidWdzICM1ODAwMDUgYW5kICMzNDAzNzUgKi8KK0dzdFFUTXV4Rm9ybWF0UHJvcCBnc3RfcXRfbXV4X2Zvcm1hdF9saXN0W10gPSB7CisgIC8qIG9yaWdpbmFsIFF1aWNrVGltZSBmb3JtYXQ7IHNlZSBBcHBsZSBzaXRlIChlLmcuIHF0ZmYucGRmKSAqLworICB7CisgICAgICAgIEdTVF9RVF9NVVhfRk9STUFUX1FULAorICAgICAgICBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAicXRtdXgiLAorICAgICAgICAiUXVpY2tUaW1lIiwKKyAgICAgICAgIkdzdFFUTXV4IiwKKyAgICAgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8vcXVpY2t0aW1lLCB2YXJpYW50ID0gKHN0cmluZykgYXBwbGU7ICIKKyAgICAgICAgICAgICJ2aWRlby9xdWlja3RpbWUiKSwKKyAgICAgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1yYXcsICIKKyAgICAgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSB7IFJHQiwgVVlWWSwgdjIxMCB9LCAiCisgICAgICAgICAgICBDT01NT05fVklERU9fQ0FQUyAiOyAiCisgICAgICAgICAgICBNUEVHNFZfQ0FQUyAiOyAiCisgICAgICAgICAgICBQUk9SRVNfQ0FQUyAiOyAiCisgICAgICAgICAgICBDSU5FRk9STV9DQVBTICI7ICIKKyAgICAgICAgICAgIEgyNjNfQ0FQUyAiOyAiCisgICAgICAgICAgICBIMjY0X0NBUFMgIjsgIgorICAgICAgICAgICAgSDI2NV9DQVBTICI7ICIKKyAgICAgICAgICAgIFNWUV9DQVBTICI7ICIKKyAgICAgICAgICAgICJ2aWRlby94LWR2LCAiCisgICAgICAgICAgICAic3lzdGVtc3RyZWFtID0gKGJvb2xlYW4pIGZhbHNlLCAiCisgICAgICAgICAgICBDT01NT05fVklERU9fQ0FQUyAiOyAiCisgICAgICAgICAgICAiaW1hZ2UvanBlZywgIgorICAgICAgICAgICAgQ09NTU9OX1ZJREVPX0NBUFNfTk9fRlJBTUVSQVRFICI7ICIKKyAgICAgICAgICAgICJpbWFnZS9wbmcsICIKKyAgICAgICAgICAgIENPTU1PTl9WSURFT19DQVBTX05PX0ZSQU1FUkFURSAiOyAiCisgICAgICAgICAgICAidmlkZW8veC12cDgsICIKKyAgICAgICAgICAgIENPTU1PTl9WSURFT19DQVBTICI7ICIKKyAgICAgICAgICAgICJ2aWRlby94LXZwOSwgIgorICAgICAgICAgICAgQ09NTU9OX1ZJREVPX0NBUFMgIjsgIgorICAgICAgICAgICAgInZpZGVvL3gtZGlyYWMsICIKKyAgICAgICAgICAgIENPTU1PTl9WSURFT19DQVBTICI7ICIgInZpZGVvL3gtcXQtcGFydCwgIiBDT01NT05fVklERU9fQ0FQUyksCisgICAgICAgIEdTVF9TVEFUSUNfQ0FQUyAoUENNX0NBUFNfRlVMTCAiOyAiCisgICAgICAgICAgICBQQ01fQ0FQU19VTlBPU0lUSU9ORUQgIiA7ICIKKyAgICAgICAgICAgIE1QMTIzX0NBUFMgIiA7ICIKKyAgICAgICAgICAgIEFBQ19DQVBTICIgOyAiCisgICAgICAgICAgICBBQzNfQ0FQUyAiIDsgIgorICAgICAgICAgICAgQURQQ01fQ0FQUyAiIDsgIgorICAgICAgICAgICAgImF1ZGlvL3gtYWxhdywgIiBDT01NT05fQVVESU9fQ0FQUyAoMiwgTUFYKSAiOyAiCisgICAgICAgICAgICAiYXVkaW8veC1tdWxhdywgIiBDT01NT05fQVVESU9fQ0FQUyAoMiwgTUFYKSAiOyAiCisgICAgICAgICAgICBBTVJfQ0FQUyAiIDsgIiBBTEFDX0NBUFMgIiA7ICIgT1BVU19DQVBTKSwKKyAgICAgIEdTVF9TVEFUSUNfQ0FQUyAoVEVYVF9VVEY4KX0KKyAgLAorICAvKiBJU08gMTQ0OTYtMTQ6IG1wNDIgYXMgSVNPIGJhc2UgbWVkaWEgZXh0ZW5zaW9uCisgICAqIChzdXBlcnNlZGVzIG9yaWdpbmFsIElTTyAxNDQ5OTYtMSBtcDQxKSAqLworICB7CisgICAgICAgIEdTVF9RVF9NVVhfRk9STUFUX01QNCwKKyAgICAgICAgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgICAgIm1wNG11eCIsCisgICAgICAgICJNUDQiLAorICAgICAgICAiR3N0TVA0TXV4IiwKKyAgICAgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8vcXVpY2t0aW1lLCB2YXJpYW50ID0gKHN0cmluZykgaXNvIiksCisgICAgICAgIEdTVF9TVEFUSUNfQ0FQUyAoTVBFRzRWX0NBUFMgIjsgIiBIMjY0X0NBUFMgIjsiIEgyNjVfQ0FQUyAiOyIKKyAgICAgICAgICAgICJ2aWRlby94LW1wNC1wYXJ0LCIgQ09NTU9OX1ZJREVPX0NBUFMpLAorICAgICAgICBHU1RfU1RBVElDX0NBUFMgKE1QMTIzX0NBUFMgIjsgIgorICAgICAgICAgICAgQUFDX0NBUFMgIiA7ICIgQUMzX0NBUFMgIiA7ICIgQUxBQ19DQVBTICIgOyAiIE9QVVNfQ0FQUyksCisgICAgICBHU1RfU1RBVElDX0NBUFMgKFRFWFRfVVRGOCl9CisgICwKKyAgLyogTWljcm9zb2Z0IFNtb290aCBTdHJlYW1pbmcgZm1wNC9pc21sICovCisgIC8qIFRPRE8gYWRkIFdNVi9XTUEgc3VwcG9ydCAqLworICB7CisgICAgICAgIEdTVF9RVF9NVVhfRk9STUFUX0lTTUwsCisgICAgICAgIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICAgICJpc21sbXV4IiwKKyAgICAgICAgIklTTUwiLAorICAgICAgICAiR3N0SVNNTE11eCIsCisgICAgICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3F1aWNrdGltZSwgdmFyaWFudCA9IChzdHJpbmcpIGlzby1mcmFnbWVudGVkIiksCisgICAgICAgIEdTVF9TVEFUSUNfQ0FQUyAoTVBFRzRWX0NBUFMgIjsgIiBIMjY0X0NBUFMpLAorICAgICAgICBHU1RfU1RBVElDX0NBUFMgKE1QM19DQVBTICI7ICIgQUFDX0NBUFMpLAorICAgICAgR1NUX1NUQVRJQ19DQVBTX05PTkV9CisgICwKKyAgLyogM0dQUCBUZWNobmljYWwgU3BlY2lmaWNhdGlvbiAyNi4yNDQgVjcuMy4wCisgICAqIChleHRlbmRlZCBpbiAzR1BQMiBGaWxlIEZvcm1hdHMgZm9yIE11bHRpbWVkaWEgU2VydmljZXMpICovCisgIHsKKyAgICAgICAgR1NUX1FUX01VWF9GT1JNQVRfM0dQLAorICAgICAgICBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAiM2dwcG11eCIsCisgICAgICAgICIzR1BQIiwKKyAgICAgICAgIkdzdDNHUFBNdXgiLAorICAgICAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby9xdWlja3RpbWUsIHZhcmlhbnQgPSAoc3RyaW5nKSAzZ3BwIiksCisgICAgICAgIEdTVF9TVEFUSUNfQ0FQUyAoSDI2M19DQVBTICI7ICIgTVBFRzRWX0NBUFMgIjsgIiBIMjY0X0NBUFMpLAorICAgICAgICBHU1RfU1RBVElDX0NBUFMgKEFNUl9DQVBTICI7ICIgTVAzX0NBUFMgIjsgIiBBQUNfQ0FQUyAiOyAiIEFDM19DQVBTKSwKKyAgICAgIEdTVF9TVEFUSUNfQ0FQUyAoVEVYVF9VVEY4KX0KKyAgLAorICAvKiBJU08gMTU0NDQtMzogTW90aW9uLUpQRUctMjAwMCAoYWxzbyBJU08gYmFzZSBtZWRpYSBleHRlbnNpb24pICovCisgIHsKKyAgICAgICAgR1NUX1FUX01VWF9GT1JNQVRfTUoyLAorICAgICAgICBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAibWoybXV4IiwKKyAgICAgICAgIk1KMiIsCisgICAgICAgICJHc3RNSjJNdXgiLAorICAgICAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby9tajIiKSwKKyAgICAgICAgR1NUX1NUQVRJQ19DQVBTICgiaW1hZ2UveC1qMmMsICIgQ09NTU9OX1ZJREVPX0NBUFMgIjsgIgorICAgICAgICAgICAgImltYWdlL3gtanBjLCAiIENPTU1PTl9WSURFT19DQVBTKSwKKyAgICAgICAgR1NUX1NUQVRJQ19DQVBTIChQQ01fQ0FQUyksCisgICAgICBHU1RfU1RBVElDX0NBUFNfTk9ORX0KKyAgLAorICB7CisgICAgICAgIEdTVF9RVF9NVVhfRk9STUFUX05PTkUsCisgICAgICB9Cit9OworCisvKiBwcmV0dHkgc3RhdGljLCBidXQgbWF5IHR1cm4gb3V0IG5lZWRlZCBhIGZldyB0aW1lcyAqLworQXRvbXNUcmVlRmxhdm9yCitnc3RfcXRfbXV4X21hcF9mb3JtYXRfdG9fZmxhdm9yIChHc3RRVE11eEZvcm1hdCBmb3JtYXQpCit7CisgIGlmIChmb3JtYXQgPT0gR1NUX1FUX01VWF9GT1JNQVRfUVQpCisgICAgcmV0dXJuIEFUT01TX1RSRUVfRkxBVk9SX01PVjsKKyAgZWxzZSBpZiAoZm9ybWF0ID09IEdTVF9RVF9NVVhfRk9STUFUXzNHUCkKKyAgICByZXR1cm4gQVRPTVNfVFJFRV9GTEFWT1JfM0dQOworICBlbHNlIGlmIChmb3JtYXQgPT0gR1NUX1FUX01VWF9GT1JNQVRfSVNNTCkKKyAgICByZXR1cm4gQVRPTVNfVFJFRV9GTEFWT1JfSVNNTDsKKyAgZWxzZQorICAgIHJldHVybiBBVE9NU19UUkVFX0ZMQVZPUl9JU09NOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9tYXBfY2hlY2tfdHJhY2tzIChBdG9tTU9PViAqIG1vb3YsIGdpbnQgKiBfdmlkZW8sIGdpbnQgKiBfYXVkaW8sCisgICAgZ2Jvb2xlYW4gKiBfaGFzX2gyNjQpCit7CisgIEdMaXN0ICppdDsKKyAgZ2ludCB2aWRlbyA9IDAsIGF1ZGlvID0gMDsKKyAgZ2Jvb2xlYW4gaGFzX2gyNjQgPSBGQUxTRTsKKworICBmb3IgKGl0ID0gbW9vdi0+dHJha3M7IGl0ICE9IE5VTEw7IGl0ID0gZ19saXN0X25leHQgKGl0KSkgeworICAgIEF0b21UUkFLICp0cmFjayA9IGl0LT5kYXRhOworCisgICAgaWYgKHRyYWNrLT5pc192aWRlbykgeworICAgICAgdmlkZW8rKzsKKyAgICAgIGlmICh0cmFjay0+aXNfaDI2NCkKKyAgICAgICAgaGFzX2gyNjQgPSBUUlVFOworICAgIH0gZWxzZQorICAgICAgYXVkaW8rKzsKKyAgfQorCisgIGlmIChfdmlkZW8pCisgICAgKl92aWRlbyA9IHZpZGVvOworICBpZiAoX2F1ZGlvKQorICAgICpfYXVkaW8gPSBhdWRpbzsKKyAgaWYgKF9oYXNfaDI2NCkKKyAgICAqX2hhc19oMjY0ID0gaGFzX2gyNjQ7Cit9CisKKy8qIHByZXR0eSBzdGF0aWMsIGJ1dCBwb3NzaWJseSBkeW5hbWljIGZvcm1hdCBpbmZvICovCisKKy8qIG5vdGVzOgorICogLSBhdmMxIGJyYW5kIGlzIG5vdCB1c2VkLCBzaW5jZSB0aGUgc3BlY2lmaWMgZXh0ZW5zaW9ucyBpbmRpY2F0ZWQgYnkgaXQKKyAqICAgYXJlIG5vdCB1c2VkIChlLmcuIHNhbXBsZSBncm91cGluZ3MsIGV0YykKKyAqIC0gVE9ETzogbWF5YmUgZXZlbiBtb3JlIDNHUFAgYnJhbmQgZmluZS10dW5pbmcgPz8KKyAqICAgKGJ1dCB0aGF0IG1pZ2h0IG5lZWQgZnR5cCByZXdyaXRpbmcgYXQgdGhlIGVuZCkgKi8KK3ZvaWQKK2dzdF9xdF9tdXhfbWFwX2Zvcm1hdF90b19oZWFkZXIgKEdzdFFUTXV4Rm9ybWF0IGZvcm1hdCwgR3N0QnVmZmVyICoqIF9wcmVmaXgsCisgICAgZ3VpbnQzMiAqIF9tYWpvciwgZ3VpbnQzMiAqIF92ZXJzaW9uLCBHTGlzdCAqKiBfY29tcGF0aWJsZSwgQXRvbU1PT1YgKiBtb292LAorICAgIEdzdENsb2NrVGltZSBsb25nZXN0X2NodW5rLCBnYm9vbGVhbiBmYXN0c3RhcnQpCit7CisgIHN0YXRpYyBjb25zdCBndWludDMyIHF0X2JyYW5kc1tdID0geyAwIH07CisgIHN0YXRpYyBjb25zdCBndWludDMyIG1wNF9icmFuZHNbXSA9CisgICAgICB7IEZPVVJDQ19tcDQxLCBGT1VSQ0NfaXNvbSwgRk9VUkNDX2lzbzIsIDAgfTsKKyAgc3RhdGljIGNvbnN0IGd1aW50MzIgaXNtbF9icmFuZHNbXSA9IHsgRk9VUkNDX2lzbzIsIDAgfTsKKyAgc3RhdGljIGNvbnN0IGd1aW50MzIgZ3BwX2JyYW5kc1tdID0geyBGT1VSQ0NfaXNvbSwgRk9VUkNDX2lzbzIsIDAgfTsKKyAgc3RhdGljIGNvbnN0IGd1aW50MzIgbWpwMl9icmFuZHNbXSA9IHsgRk9VUkNDX2lzb20sIEZPVVJDQ19pc28yLCAwIH07CisgIHN0YXRpYyBjb25zdCBndWludDggbWpwMl9wcmVmaXhbXSA9CisgICAgICB7IDAsIDAsIDAsIDEyLCAnaicsICdQJywgJyAnLCAnICcsIDB4MEQsIDB4MEEsIDB4ODcsIDB4MEEgfTsKKyAgY29uc3QgZ3VpbnQzMiAqY29tcCA9IE5VTEw7CisgIGd1aW50MzIgbWFqb3IgPSAwLCB2ZXJzaW9uID0gMDsKKyAgR3N0QnVmZmVyICpwcmVmaXggPSBOVUxMOworICBHTGlzdCAqcmVzdWx0ID0gTlVMTDsKKworICBnX3JldHVybl9pZl9mYWlsIChfcHJlZml4ICE9IE5VTEwpOworICBnX3JldHVybl9pZl9mYWlsIChfbWFqb3IgIT0gTlVMTCk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKF92ZXJzaW9uICE9IE5VTEwpOworICBnX3JldHVybl9pZl9mYWlsIChfY29tcGF0aWJsZSAhPSBOVUxMKTsKKworICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgR1NUX1FUX01VWF9GT1JNQVRfUVQ6CisgICAgICBtYWpvciA9IEZPVVJDQ19xdF9fOworICAgICAgY29tcCA9IHF0X2JyYW5kczsKKyAgICAgIHZlcnNpb24gPSAweDIwMDUwMzAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUVRfTVVYX0ZPUk1BVF9NUDQ6CisgICAgICBtYWpvciA9IEZPVVJDQ19tcDQyOworICAgICAgY29tcCA9IG1wNF9icmFuZHM7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9RVF9NVVhfRk9STUFUX0lTTUw6CisgICAgICBtYWpvciA9IEZPVVJDQ19pc21sOworICAgICAgY29tcCA9IGlzbWxfYnJhbmRzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUVRfTVVYX0ZPUk1BVF8zR1A6CisgICAgeworICAgICAgZ2ludCB2aWRlbywgYXVkaW87CisgICAgICBnYm9vbGVhbiBoYXNfaDI2NDsKKworICAgICAgZ3N0X3F0X211eF9tYXBfY2hlY2tfdHJhY2tzIChtb292LCAmdmlkZW8sICZhdWRpbywgJmhhc19oMjY0KTsKKyAgICAgIC8qIG9ubHkgdHJhY2sgcmVzdHJpY3Rpb24gcmVhbGx5IG1hdHRlcnMgZm9yIEJhc2ljIFByb2ZpbGUgKi8KKyAgICAgIGlmICh2aWRlbyA8PSAxICYmIGF1ZGlvIDw9IDEpIHsKKyAgICAgICAgLyogaXQgc2VlbXMgb25seSBuZXdlciBzcGVjIGtub3dzIGFib3V0IEgyNjQgKi8KKyAgICAgICAgbWFqb3IgPSBoYXNfaDI2NCA/IEZPVVJDQ18zZ3A2IDogRk9VUkNDXzNncDQ7CisgICAgICAgIHZlcnNpb24gPSBoYXNfaDI2NCA/IDB4MTAwIDogMHgyMDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBtYWpvciA9IEZPVVJDQ18zZ2c2OworICAgICAgICB2ZXJzaW9uID0gMHgxMDA7CisgICAgICB9CisgICAgICBjb21wID0gZ3BwX2JyYW5kczsKKworICAgICAgLyoKKyAgICAgICAqIFdlIGFzc3VtZSB0aGF0IHdlIGhhdmUgY2h1bmtzIGluIGR0cyBvcmRlcgorICAgICAgICovCisgICAgICBpZiAoZmFzdHN0YXJ0ICYmIGxvbmdlc3RfY2h1bmsgPD0gR1NUX1NFQ09ORCkgeworICAgICAgICAvKiBhZGQgcHJvZ3Jlc3NpdmUgZG93bmxvYWQgcHJvZmlsZSAqLworICAgICAgICByZXN1bHQgPSBnX2xpc3RfYXBwZW5kIChyZXN1bHQsIEdVSU5UX1RPX1BPSU5URVIgKEZPVVJDQ18zZ3I2KSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVRfTVVYX0ZPUk1BVF9NSjI6CisgICAgeworICAgICAgbWFqb3IgPSBGT1VSQ0NfbWpwMjsKKyAgICAgIGNvbXAgPSBtanAyX2JyYW5kczsKKyAgICAgIHZlcnNpb24gPSAwOworICAgICAgcHJlZml4ID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzaXplb2YgKG1qcDJfcHJlZml4KSk7CisgICAgICBnc3RfYnVmZmVyX2ZpbGwgKHByZWZpeCwgMCwgbWpwMl9wcmVmaXgsIHNpemVvZiAobWpwMl9wcmVmaXgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIGNvbnZlcnQgbGlzdCB0byBsaXN0LCBobSAqLworICB3aGlsZSAoY29tcCAmJiAqY29tcCAhPSAwKSB7CisgICAgLyogb3JkZXIgbWF0dGVycyBvdmVyIGVmZmljaWVuY3kgKi8KKyAgICByZXN1bHQgPSBnX2xpc3RfYXBwZW5kIChyZXN1bHQsIEdVSU5UX1RPX1BPSU5URVIgKCpjb21wKSk7CisgICAgY29tcCsrOworICB9CisKKyAgKl9tYWpvciA9IG1ham9yOworICAqX3ZlcnNpb24gPSB2ZXJzaW9uOworICAqX3ByZWZpeCA9IHByZWZpeDsKKyAgKl9jb21wYXRpYmxlID0gcmVzdWx0OworCisgIC8qIFRPRE8gM0dQUCBtYXkgaW5jbHVkZSBtcDQyIGFzIGNvbXBhdGlibGUgaWYgYXBwbGljYWJsZSAqLworICAvKiBUT0RPIDNHUFAgbWFqb3IgYnJhbmQgM2dwNyBpZiBhdCBtb3N0IDEgdmlkZW8gYW5kIGF1ZGlvIHRyYWNrICovCit9CmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmggYi9nc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3OGEzNgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvZ3N0cXRtdXhtYXAuaApAQCAtMCwwICsxLDg1IEBACisvKiBRdWlja3RpbWUgbXV4ZXIgcGx1Z2luIGZvciBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGlhZ28gU291c2EgU2FudG9zIDx0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5icj4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zZi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qCisgKiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgU291cmNlIENvZGUgaXMgbGljZW5zZWQgdW5kZXIgTUlUIGxpY2Vuc2UuCisgKiBTZWUgZnVydGhlciBleHBsYW5hdGlvbiBhdHRhY2hlZCBpbiBMaWNlbnNlIFN0YXRlbWVudCAoZGlzdHJpYnV0ZWQgaW4gdGhlIGZpbGUKKyAqIExJQ0VOU0UpLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1FUX01VWF9NQVBfSF9fCisjZGVmaW5lIF9fR1NUX1FUX01VWF9NQVBfSF9fCisKKyNpbmNsdWRlICJhdG9tcy5oIgorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKwordHlwZWRlZiBlbnVtIF9Hc3RRVE11eEZvcm1hdAoreworICBHU1RfUVRfTVVYX0ZPUk1BVF9OT05FID0gMCwKKyAgR1NUX1FUX01VWF9GT1JNQVRfUVQsCisgIEdTVF9RVF9NVVhfRk9STUFUX01QNCwKKyAgR1NUX1FUX01VWF9GT1JNQVRfM0dQLAorICBHU1RfUVRfTVVYX0ZPUk1BVF9NSjIsCisgIEdTVF9RVF9NVVhfRk9STUFUX0lTTUwKK30gR3N0UVRNdXhGb3JtYXQ7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RRVE11eEZvcm1hdFByb3AKK3sKKyAgR3N0UVRNdXhGb3JtYXQgZm9ybWF0OworICBHc3RSYW5rIHJhbms7CisgIGNvbnN0IGdjaGFyICpuYW1lOworICBjb25zdCBnY2hhciAqbG9uZ19uYW1lOworICBjb25zdCBnY2hhciAqdHlwZV9uYW1lOworICBHc3RTdGF0aWNDYXBzIHNyY19jYXBzOworICBHc3RTdGF0aWNDYXBzIHZpZGVvX3NpbmtfY2FwczsKKyAgR3N0U3RhdGljQ2FwcyBhdWRpb19zaW5rX2NhcHM7CisgIEdzdFN0YXRpY0NhcHMgc3VidGl0bGVfc2lua19jYXBzOworfSBHc3RRVE11eEZvcm1hdFByb3A7CisKK2V4dGVybiBHc3RRVE11eEZvcm1hdFByb3AgZ3N0X3F0X211eF9mb3JtYXRfbGlzdFtdOworCit2b2lkICAgICAgICAgICAgZ3N0X3F0X211eF9tYXBfZm9ybWF0X3RvX2hlYWRlciAgICAgIChHc3RRVE11eEZvcm1hdCBmb3JtYXQsIEdzdEJ1ZmZlciAqKiBfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqIF9tYWpvciwgZ3VpbnQzMiAqIHZlcnNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaXN0ICoqIF9jb21wYXRpYmxlLCBBdG9tTU9PViAqIG1vb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RDbG9ja1RpbWUgbG9uZ2VzdF9jaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdib29sZWFuIGZhc3RzdGFydCk7CisKK0F0b21zVHJlZUZsYXZvciBnc3RfcXRfbXV4X21hcF9mb3JtYXRfdG9fZmxhdm9yICAgICAgKEdzdFFUTXV4Rm9ybWF0IGZvcm1hdCk7CisKKyNlbmRpZiAvKiBfX0dTVF9RVF9NVVhfTUFQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9nc3RydHB4cXRkZXBheS5jIGIvZ3N0L2lzb21wNC9nc3RydHB4cXRkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhM2M2MGUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L2dzdHJ0cHhxdGRlcGF5LmMKQEAgLTAsMCArMSw2ODcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKgorICogYmFzZWQgb24gaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vcXVpY2t0aW1lL2ljZWZsb2UvZGlzcGF0Y2gwMjYuaHRtbAorICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnc3RydHB4cXRkZXBheS5oIgorCisjZGVmaW5lIE1BS0VfVExWKGEsYikgICgoKGEpPDw4KXwoYikpCisKKyNkZWZpbmUgVExWX3NkCU1BS0VfVExWICgncycsJ2QnKQorI2RlZmluZSBUTFZfcXQJTUFLRV9UTFYgKCdxJywndCcpCisjZGVmaW5lIFRMVl90aQlNQUtFX1RMViAoJ3QnLCdpJykKKyNkZWZpbmUgVExWX2x5CU1BS0VfVExWICgnbCcsJ3knKQorI2RlZmluZSBUTFZfdm8JTUFLRV9UTFYgKCd2JywnbycpCisjZGVmaW5lIFRMVl9teAlNQUtFX1RMViAoJ20nLCd4JykKKyNkZWZpbmUgVExWX3RyCU1BS0VfVExWICgndCcsJ3InKQorI2RlZmluZSBUTFZfdHcJTUFLRV9UTFYgKCd0JywndycpCisjZGVmaW5lIFRMVl90aAlNQUtFX1RMViAoJ3QnLCdoJykKKyNkZWZpbmUgVExWX2xhCU1BS0VfVExWICgnbCcsJ2EnKQorI2RlZmluZSBUTFZfcnQJTUFLRV9UTFYgKCdyJywndCcpCisjZGVmaW5lIFRMVl9nbQlNQUtFX1RMViAoJ2cnLCdtJykKKyNkZWZpbmUgVExWX29jCU1BS0VfVExWICgnbycsJ2MnKQorI2RlZmluZSBUTFZfY3IJTUFLRV9UTFYgKCdjJywncicpCisjZGVmaW5lIFRMVl9kdQlNQUtFX1RMViAoJ2QnLCd1JykKKyNkZWZpbmUgVExWX3BvCU1BS0VfVExWICgncCcsJ28nKQorCisjZGVmaW5lIFFUX1VJTlQzMihhKSAgKEdTVF9SRUFEX1VJTlQzMl9CRShhKSkKKyNkZWZpbmUgUVRfVUlOVDI0KGEpICAoR1NUX1JFQURfVUlOVDMyX0JFKGEpID4+IDgpCisjZGVmaW5lIFFUX1VJTlQxNihhKSAgKEdTVF9SRUFEX1VJTlQxNl9CRShhKSkKKyNkZWZpbmUgUVRfVUlOVDgoYSkgICAoR1NUX1JFQURfVUlOVDgoYSkpCisjZGVmaW5lIFFUX0ZQMzIoYSkgICAgKChHU1RfUkVBRF9VSU5UMzJfQkUoYSkpLzY1NTM2LjApCisjZGVmaW5lIFFUX0ZQMTYoYSkgICAgKChHU1RfUkVBRF9VSU5UMTZfQkUoYSkpLzI1Ni4wKQorI2RlZmluZSBRVF9GT1VSQ0MoYSkgIChHU1RfUkVBRF9VSU5UMzJfTEUoYSkpCisjZGVmaW5lIFFUX1VJTlQ2NChhKSAgKCgoKGd1aW50NjQpUVRfVUlOVDMyKGEpKTw8MzIpfFFUX1VJTlQzMigoKGd1aW50OCAqKWEpKzQpKQorCisjZGVmaW5lIEZPVVJDQ19hdmMxICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2EnLCd2JywnYycsJzEnKQorI2RlZmluZSBGT1VSQ0NfYXZjMyAgICAgR1NUX01BS0VfRk9VUkNDKCdhJywndicsJ2MnLCczJykKKyNkZWZpbmUgRk9VUkNDX2F2Y0MgICAgIEdTVF9NQUtFX0ZPVVJDQygnYScsJ3YnLCdjJywnQycpCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cHhxdGRlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHB4cXRkZXBheV9kZWJ1ZykKKworLyogUnRwWFFURGVwYXkgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCitlbnVtCit7CisgIFBST1BfMCwKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3hxdF9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF94cXRfZGVwYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgeyBcImF1ZGlvXCIsIFwidmlkZW9cIiB9LCBjbG9jay1yYXRlID0gKGludCkgWzEsIE1BWF0sICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSB7IFwiWC1RVFwiLCBcIlgtUVVJQ0tUSU1FXCIgfSIpCisgICAgKTsKKworI2RlZmluZSBnc3RfcnRwX3hxdF9kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBYUVREZXBheSwgZ3N0X3J0cF94cXRfZGVwYXksIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfeHF0X2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfeHF0X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF94cXRfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RCdWZmZXIgKiBidWYpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF94cXRfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF94cXRfZGVwYXlfY2xhc3NfaW5pdCAoR3N0UnRwWFFURGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX3hxdF9kZXBheV9maW5hbGl6ZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfcnRwX3hxdF9kZXBheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX3hxdF9kZXBheV9zZXRjYXBzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzID0gZ3N0X3J0cF94cXRfZGVwYXlfcHJvY2VzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRweHF0ZGVwYXlfZGVidWcsICJydHB4cXRkZXBheSIsIDAsCisgICAgICAiUVQgTWVkaWEgUlRQIERlcGF5bG9hZGVyIik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF94cXRfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF94cXRfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgcGFja2V0IGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsiLAorICAgICAgIkV4dHJhY3RzIFF1aWNrdGltZSBhdWRpby92aWRlbyBmcm9tIFJUUCBwYWNrZXRzIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF94cXRfZGVwYXlfaW5pdCAoR3N0UnRwWFFURGVwYXkgKiBydHB4cXRkZXBheSkKK3sKKyAgcnRweHF0ZGVwYXktPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3hxdF9kZXBheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwWFFURGVwYXkgKnJ0cHhxdGRlcGF5OworCisgIHJ0cHhxdGRlcGF5ID0gR1NUX1JUUF9YUVRfREVQQVkgKG9iamVjdCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHJ0cHhxdGRlcGF5LT5hZGFwdGVyKTsKKyAgcnRweHF0ZGVwYXktPmFkYXB0ZXIgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3F1aWNrdGltZV9wYXJzZV9zZCAoR3N0UnRwWFFURGVwYXkgKiBydHB4cXRkZXBheSwgZ3VpbnQ4ICogZGF0YSwKKyAgICBndWludCBkYXRhX2xlbikKK3sKKyAgZ2ludCBsZW47CisgIGd1aW50MzIgZm91cmNjOworCisgIGlmIChkYXRhX2xlbiA8IDgpCisgICAgZ290byB0b29fc2hvcnQ7CisKKyAgbGVuID0gKGRhdGFbMF0gPDwgMjQpIHwgKGRhdGFbMV0gPDwgMTYpIHwgKGRhdGFbMl0gPDwgOCkgfCBkYXRhWzNdOworICBpZiAobGVuID4gZGF0YV9sZW4pCisgICAgZ290byB0b29fc2hvcnQ7CisKKyAgZm91cmNjID0gUVRfRk9VUkNDIChkYXRhICsgNCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRweHF0ZGVwYXksICJwYXJzaW5nICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKTsKKworICBzd2l0Y2ggKGZvdXJjYykgeworICAgIGNhc2UgRk9VUkNDX2F2YzE6CisgICAgY2FzZSBGT1VSQ0NfYXZjMzoKKyAgICB7CisgICAgICBndWludDMyIGNobGVuOworCisgICAgICBpZiAobGVuIDwgMHg1NikKKyAgICAgICAgZ290byB0b29fc2hvcnQ7CisgICAgICBsZW4gLT0gMHg1NjsKKyAgICAgIGRhdGEgKz0gMHg1NjsKKworICAgICAgLyogZmluZCBhdmNDICovCisgICAgICB3aGlsZSAobGVuID49IDgpIHsKKyAgICAgICAgY2hsZW4gPSBRVF9VSU5UMzIgKGRhdGEpOworICAgICAgICBmb3VyY2MgPSBRVF9GT1VSQ0MgKGRhdGEgKyA0KTsKKyAgICAgICAgaWYgKGZvdXJjYyA9PSBGT1VSQ0NfYXZjQykgeworICAgICAgICAgIEdzdEJ1ZmZlciAqYnVmOworICAgICAgICAgIGdpbnQgc2l6ZTsKKyAgICAgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRweHF0ZGVwYXksICJmb3VuZCBhdmNDIGNvZGVjX2RhdGEgaW4gc2QsICV1IiwKKyAgICAgICAgICAgICAgY2hsZW4pOworCisgICAgICAgICAgLyogcGFyc2UsIGlmIGZvdW5kICovCisgICAgICAgICAgaWYgKGNobGVuIDwgbGVuKQorICAgICAgICAgICAgc2l6ZSA9IGNobGVuIC0gODsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzaXplID0gbGVuIC0gODsKKworICAgICAgICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZSk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsIGRhdGEgKyA4LCBzaXplKTsKKyAgICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtaDI2NCIsCisgICAgICAgICAgICAgICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLCBidWYsIE5VTEwpOworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgICAgZ3N0X3BhZF9zZXRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRCAocnRweHF0ZGVwYXkpLT5zcmNwYWQsIGNhcHMpOworICAgICAgICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBsZW4gLT0gY2hsZW47CisgICAgICAgIGRhdGEgKz0gY2hsZW47CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLwordG9vX3Nob3J0OgorICB7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF94cXRfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBnaW50IGNsb2NrX3JhdGUgPSA5MDAwMDsgICAgICAvKiBkZWZhdWx0ICovCisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpOworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfeHF0X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0UnRwWFFURGVwYXkgKnJ0cHhxdGRlcGF5OworICBHc3RCdWZmZXIgKm91dGJ1ZiA9IE5VTEw7CisgIGdib29sZWFuIG07CisgIEdzdFJUUEJ1ZmZlciBydHAgPSB7IE5VTEwgfTsKKworICBydHB4cXRkZXBheSA9IEdTVF9SVFBfWFFUX0RFUEFZIChkZXBheWxvYWQpOworCisgIGdzdF9ydHBfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1JFQUQsICZydHApOworCisgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKGJ1ZikpIHsKKyAgICAvKiBkaXNjb250LCBjbGVhciBhZGFwdGVyIGFuZCB0cnkgdG8gZmluZCBhIG5ldyBwYWNrZXQgc3RhcnQgKi8KKyAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRweHF0ZGVwYXktPmFkYXB0ZXIpOworICAgIHJ0cHhxdGRlcGF5LT5uZWVkX3Jlc3luYyA9IFRSVUU7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRweHF0ZGVwYXksICJ3ZSBuZWVkIHJlc3luYyIpOworICB9CisKKyAgbSA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKCZydHApOworICBHU1RfTE9HX09CSkVDVCAocnRweHF0ZGVwYXksICJtYXJrZXI6ICVkIiwgbSk7CisKKyAgeworICAgIGdpbnQgcGF5bG9hZF9sZW47CisgICAgZ3VpbnQgYXZhaWw7CisgICAgZ3VpbnQ4ICpwYXlsb2FkOworICAgIGd1aW50OCB2ZXIsIHBjazsKKyAgICBnYm9vbGVhbiBzLCBxLCBsLCBkOworCisgICAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKCZydHApOworICAgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisKKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMyAKKyAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgKiB8IFZFUiAgIHxQQ0t8U3xRfEx8IFJFUyAgICAgICAgIHxEfCBRdWlja1RpbWUgUGF5bG9hZCBJRCAgICAgICAgfAorICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICovCisgICAgaWYgKHBheWxvYWRfbGVuIDw9IDQpCisgICAgICBnb3RvIHdyb25nX2xlbmd0aDsKKworICAgIHZlciA9IChwYXlsb2FkWzBdICYgMHhmMCkgPj4gNDsKKyAgICBpZiAodmVyID4gMSkKKyAgICAgIGdvdG8gd3JvbmdfdmVyc2lvbjsKKworICAgIHBjayA9IChwYXlsb2FkWzBdICYgMHgwYykgPj4gMjsKKyAgICBpZiAocGNrID09IDApCisgICAgICBnb3RvIHBja19yZXNlcnZlZDsKKworICAgIHMgPSAocGF5bG9hZFswXSAmIDB4MDIpICE9IDA7ICAgICAgIC8qIGNvbnRhaW5zIHN5bmMgc2FtcGxlICovCisgICAgcSA9IChwYXlsb2FkWzBdICYgMHgwMSkgIT0gMDsgICAgICAgLyogaGFzIHBheWxvYWQgZGVzY3JpcHRpb24gKi8KKyAgICBsID0gKHBheWxvYWRbMV0gJiAweDgwKSAhPSAwOyAgICAgICAvKiBoYXMgcGFja2V0IHNwZWNpZmljIGluZm9ybWF0aW9uIGRlc2NyaXB0aW9uICovCisgICAgZCA9IChwYXlsb2FkWzJdICYgMHg4MCkgIT0gMDsgICAgICAgLyogZG9uJ3QgY2FjaGUgaW5mbyBmb3IgcGF5bG9hZCBpZCAqLworICAgIC8qIGlkIHVzZWQgZm9yIGNhY2hpbmcgaW5mbyAqLworICAgIHJ0cHhxdGRlcGF5LT5jdXJyZW50X2lkID0gKChwYXlsb2FkWzJdICYgMHg3ZikgPDwgOCkgfCBwYXlsb2FkWzNdOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cHhxdGRlcGF5LAorICAgICAgICAiVkVSOiAlZCwgUENLOiAlZCwgUzogJWQsIFE6ICVkLCBMOiAlZCwgRDogJWQsIElEOiAlZCIsIHZlciwgcGNrLCBzLCBxLAorICAgICAgICBsLCBkLCBydHB4cXRkZXBheS0+Y3VycmVudF9pZCk7CisKKyAgICBpZiAocnRweHF0ZGVwYXktPm5lZWRfcmVzeW5jKSB7CisgICAgICAvKiB3ZSBuZWVkIHRvIGZpbmQgdGhlIGJvdW5kYXJ5IG9mIGEgbmV3IHBhY2tldCBhZnRlciBhIERJU0NPTlQgKi8KKyAgICAgIGlmIChwY2sgIT0gMyB8fCBxKSB7CisgICAgICAgIC8qIG5vbi1mcmFnbWVudGVkIHBhY2tldCBvciBwYXlsb2FkIGRlc2NyaXB0aW9uIHByZXNlbnQsIHBhY2tldCBzdGFydHMKKyAgICAgICAgICogaGVyZS4gKi8KKyAgICAgICAgcnRweHF0ZGVwYXktPm5lZWRfcmVzeW5jID0gRkFMU0U7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBmcmFnbWVudGVkIHBhY2tldCB3aXRob3V0IGRlc2NyaXB0aW9uICovCisgICAgICAgIGlmIChtKSB7CisgICAgICAgICAgLyogbWFya2VyIGJpdCBzZXQsIG5leHQgcGFja2V0IGlzIHN0YXJ0IG9mIG5ldyBvbmUgKi8KKyAgICAgICAgICBydHB4cXRkZXBheS0+bmVlZF9yZXN5bmMgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBnb3RvIG5lZWRfcmVzeW5jOworICAgICAgfQorICAgIH0KKworICAgIHBheWxvYWQgKz0gNDsKKyAgICBwYXlsb2FkX2xlbiAtPSA0OworCisgICAgaWYgKHEpIHsKKyAgICAgIGdib29sZWFuIGssIGYsIGEsIHo7CisgICAgICBndWludCBwZGxlbiwgcGRwYWRkZWQ7CisgICAgICBnaW50IHBhZGRpbmc7CisgICAgICAvKiBtZWRpYV90eXBlIG9ubHkgdXNlZCBmb3IgcHJpbnRpbmcgKi8KKyAgICAgIGd1aW50MzIgR19HTlVDX1VOVVNFRCBtZWRpYV90eXBlOworICAgICAgZ3VpbnQzMiB0aW1lc2NhbGU7CisKKyAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICogfEt8RnxBfFp8IFJFUyAgICAgICAgICAgICAgICAgICB8IFF1aWNrVGltZSBQYXlsb2FkIERlc2MgTGVuZ3RoIHwKKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKiAuIFF1aWNrVGltZSBQYXlsb2FkIERlc2MgRGF0YSAuLi4gLiAKKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKi8KKyAgICAgIGlmIChwYXlsb2FkX2xlbiA8PSA0KQorICAgICAgICBnb3RvIHdyb25nX2xlbmd0aDsKKworICAgICAgayA9IChwYXlsb2FkWzBdICYgMHg4MCkgIT0gMDsgICAgIC8qIGtleWZyYW1lICovCisgICAgICBmID0gKHBheWxvYWRbMF0gJiAweDQwKSAhPSAwOyAgICAgLyogc3BhcnNlICovCisgICAgICBhID0gKHBheWxvYWRbMF0gJiAweDIwKSAhPSAwOyAgICAgLyogc3RhcnQgb2YgcGF5bG9hZCAqLworICAgICAgeiA9IChwYXlsb2FkWzBdICYgMHgxMCkgIT0gMDsgICAgIC8qIGVuZCBvZiBwYXlsb2FkICovCisgICAgICBwZGxlbiA9IChwYXlsb2FkWzJdIDw8IDgpIHwgcGF5bG9hZFszXTsKKworICAgICAgaWYgKHBkbGVuIDwgMTIpCisgICAgICAgIGdvdG8gd3JvbmdfbGVuZ3RoOworCisgICAgICAvKiBjYWxjIHBhZGRpbmcgKi8KKyAgICAgIHBkcGFkZGVkID0gcGRsZW4gKyAzOworICAgICAgcGRwYWRkZWQgLT0gcGRwYWRkZWQgJSA0OworICAgICAgaWYgKHBheWxvYWRfbGVuIDwgcGRwYWRkZWQpCisgICAgICAgIGdvdG8gd3JvbmdfbGVuZ3RoOworCisgICAgICBwYWRkaW5nID0gcGRwYWRkZWQgLSBwZGxlbjsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHB4cXRkZXBheSwKKyAgICAgICAgICAiSzogJWQsIEY6ICVkLCBBOiAlZCwgWjogJWQsIGxlbjogJWQsIHBhZGRpbmcgJWQiLCBrLCBmLCBhLCB6LCBwZGxlbiwKKyAgICAgICAgICBwYWRkaW5nKTsKKworICAgICAgcGF5bG9hZCArPSA0OworICAgICAgcGF5bG9hZF9sZW4gLT0gNDsKKyAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICogfCBRdWlja1RpbWUgTWVkaWEgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKiB8IFRpbWVzY2FsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAqIC4gUXVpY2tUaW1lIFRMVnMgLi4uIC4KKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKi8KKyAgICAgIG1lZGlhX3R5cGUgPQorICAgICAgICAgIChwYXlsb2FkWzBdIDw8IDI0KSB8IChwYXlsb2FkWzFdIDw8IDE2KSB8IChwYXlsb2FkWzJdIDw8IDgpIHwKKyAgICAgICAgICBwYXlsb2FkWzNdOworICAgICAgdGltZXNjYWxlID0KKyAgICAgICAgICAocGF5bG9hZFs0XSA8PCAyNCkgfCAocGF5bG9hZFs1XSA8PCAxNikgfCAocGF5bG9hZFs2XSA8PCA4KSB8CisgICAgICAgICAgcGF5bG9hZFs3XTsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cHhxdGRlcGF5LCAibWVkaWFfdHlwZTogJWMlYyVjJWMsIHRpbWVzY2FsZSAldSIsCisgICAgICAgICAgcGF5bG9hZFswXSwgcGF5bG9hZFsxXSwgcGF5bG9hZFsyXSwgcGF5bG9hZFszXSwgdGltZXNjYWxlKTsKKworICAgICAgcGF5bG9hZCArPSA4OworICAgICAgcGF5bG9hZF9sZW4gLT0gODsKKyAgICAgIHBkbGVuIC09IDEyOworCisgICAgICAvKiBwYXJzZSBUTFYgKHR5cGUtbGVuZ3RoLXZhbHVlIHRyaXBsZXRzICovCisgICAgICB3aGlsZSAocGRsZW4gPiAzKSB7CisgICAgICAgIGd1aW50MTYgdGx2X2xlbiwgdGx2X3R5cGU7CisKKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiB8IFF1aWNrVGltZSBUTFYgTGVuZ3RoICAgICAgICAgIHwgUXVpY2tUaW1lIFRMViBUeXBlICAgICAgICAgICAgfAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiAuIFF1aWNrVGltZSBUTFYgVmFsdWUgLi4uIC4KKyAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICovCisgICAgICAgIHRsdl9sZW4gPSAocGF5bG9hZFswXSA8PCA4KSB8IHBheWxvYWRbMV07CisgICAgICAgIHRsdl90eXBlID0gKHBheWxvYWRbMl0gPDwgOCkgfCBwYXlsb2FkWzNdOworICAgICAgICBwZGxlbiAtPSA0OworICAgICAgICBpZiAodGx2X2xlbiA+IHBkbGVuKQorICAgICAgICAgIGdvdG8gd3JvbmdfbGVuZ3RoOworCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChydHB4cXRkZXBheSwgIlRMViAnJWMlYycsIGxlbiAlZCIsIHBheWxvYWRbMl0sCisgICAgICAgICAgICBwYXlsb2FkWzNdLCB0bHZfbGVuKTsKKworICAgICAgICBwYXlsb2FkICs9IDQ7CisgICAgICAgIHBheWxvYWRfbGVuIC09IDQ7CisKKyAgICAgICAgc3dpdGNoICh0bHZfdHlwZSkgeworICAgICAgICAgIGNhc2UgVExWX3NkOgorICAgICAgICAgICAgLyogU2Vzc2lvbiBkZXNjcmlwdGlvbiAqLworICAgICAgICAgICAgaWYgKCFnc3RfcnRwX3F1aWNrdGltZV9wYXJzZV9zZCAocnRweHF0ZGVwYXksIHBheWxvYWQsIHRsdl9sZW4pKQorICAgICAgICAgICAgICBnb3RvIHVua25vd25fZm9ybWF0OworICAgICAgICAgICAgcnRweHF0ZGVwYXktPmhhdmVfc2QgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBUTFZfcXQ6CisgICAgICAgICAgY2FzZSBUTFZfdGk6CisgICAgICAgICAgY2FzZSBUTFZfbHk6CisgICAgICAgICAgY2FzZSBUTFZfdm86CisgICAgICAgICAgY2FzZSBUTFZfbXg6CisgICAgICAgICAgY2FzZSBUTFZfdHI6CisgICAgICAgICAgY2FzZSBUTFZfdHc6CisgICAgICAgICAgY2FzZSBUTFZfdGg6CisgICAgICAgICAgY2FzZSBUTFZfbGE6CisgICAgICAgICAgY2FzZSBUTFZfcnQ6CisgICAgICAgICAgY2FzZSBUTFZfZ206CisgICAgICAgICAgY2FzZSBUTFZfb2M6CisgICAgICAgICAgY2FzZSBUTFZfY3I6CisgICAgICAgICAgY2FzZSBUTFZfZHU6CisgICAgICAgICAgY2FzZSBUTFZfcG86CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcGRsZW4gLT0gdGx2X2xlbjsKKyAgICAgICAgcGF5bG9hZCArPSB0bHZfbGVuOworICAgICAgICBwYXlsb2FkX2xlbiAtPSB0bHZfbGVuOworICAgICAgfQorICAgICAgcGF5bG9hZCArPSBwYWRkaW5nOworICAgICAgcGF5bG9hZF9sZW4gLT0gcGFkZGluZzsKKyAgICB9CisKKyAgICBpZiAobCkgeworICAgICAgZ3VpbnQgc3NpbGVuLCBzc2lwYWRkZWQ7CisgICAgICBnaW50IHBhZGRpbmc7CisKKyAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICogfCBSRVMgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNhbXBsZS1TcGVjaWZpYyBJbmZvIExlbmd0aCAgIHwKKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKiAuIFF1aWNrVGltZSBUTFZzIC4uLiAKKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKi8KKyAgICAgIGlmIChwYXlsb2FkX2xlbiA8PSA0KQorICAgICAgICBnb3RvIHdyb25nX2xlbmd0aDsKKworICAgICAgc3NpbGVuID0gKHBheWxvYWRbMl0gPDwgOCkgfCBwYXlsb2FkWzNdOworICAgICAgaWYgKHNzaWxlbiA8IDQpCisgICAgICAgIGdvdG8gd3JvbmdfbGVuZ3RoOworCisgICAgICAvKiBjYWxjIHBhZGRpbmcgKi8KKyAgICAgIHNzaXBhZGRlZCA9IHNzaWxlbiArIDM7CisgICAgICBzc2lwYWRkZWQgLT0gc3NpcGFkZGVkICUgNDsKKyAgICAgIGlmIChwYXlsb2FkX2xlbiA8IHNzaXBhZGRlZCkKKyAgICAgICAgZ290byB3cm9uZ19sZW5ndGg7CisKKyAgICAgIHBhZGRpbmcgPSBzc2lwYWRkZWQgLSBzc2lsZW47CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRweHF0ZGVwYXksICJsZW46ICVkLCBwYWRkaW5nICVkIiwgc3NpbGVuLCBwYWRkaW5nKTsKKworICAgICAgcGF5bG9hZCArPSA0OworICAgICAgcGF5bG9hZF9sZW4gLT0gNDsKKyAgICAgIHNzaWxlbiAtPSA0OworCisgICAgICAvKiBwYXJzZSBUTFYgKHR5cGUtbGVuZ3RoLXZhbHVlIHRyaXBsZXRzICovCisgICAgICB3aGlsZSAoc3NpbGVuID4gMykgeworICAgICAgICBndWludDE2IHRsdl9sZW4sIHRsdl90eXBlOworCisgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgICAgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICogfCBRdWlja1RpbWUgVExWIExlbmd0aCAgICAgICAgICB8IFF1aWNrVGltZSBUTFYgVHlwZSAgICAgICAgICAgIHwKKyAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICogLiBRdWlja1RpbWUgVExWIFZhbHVlIC4uLiAuCisgICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAqLworICAgICAgICB0bHZfbGVuID0gKHBheWxvYWRbMF0gPDwgOCkgfCBwYXlsb2FkWzFdOworICAgICAgICB0bHZfdHlwZSA9IChwYXlsb2FkWzJdIDw8IDgpIHwgcGF5bG9hZFszXTsKKyAgICAgICAgc3NpbGVuIC09IDQ7CisgICAgICAgIGlmICh0bHZfbGVuID4gc3NpbGVuKQorICAgICAgICAgIGdvdG8gd3JvbmdfbGVuZ3RoOworCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChydHB4cXRkZXBheSwgIlRMViAnJWMlYycsIGxlbiAlZCIsIHBheWxvYWRbMl0sCisgICAgICAgICAgICBwYXlsb2FkWzNdLCB0bHZfbGVuKTsKKworICAgICAgICBwYXlsb2FkICs9IDQ7CisgICAgICAgIHBheWxvYWRfbGVuIC09IDQ7CisKKyAgICAgICAgc3dpdGNoICh0bHZfdHlwZSkgeworICAgICAgICAgIGNhc2UgVExWX3NkOgorICAgICAgICAgIGNhc2UgVExWX3F0OgorICAgICAgICAgIGNhc2UgVExWX3RpOgorICAgICAgICAgIGNhc2UgVExWX2x5OgorICAgICAgICAgIGNhc2UgVExWX3ZvOgorICAgICAgICAgIGNhc2UgVExWX214OgorICAgICAgICAgIGNhc2UgVExWX3RyOgorICAgICAgICAgIGNhc2UgVExWX3R3OgorICAgICAgICAgIGNhc2UgVExWX3RoOgorICAgICAgICAgIGNhc2UgVExWX2xhOgorICAgICAgICAgIGNhc2UgVExWX3J0OgorICAgICAgICAgIGNhc2UgVExWX2dtOgorICAgICAgICAgIGNhc2UgVExWX29jOgorICAgICAgICAgIGNhc2UgVExWX2NyOgorICAgICAgICAgIGNhc2UgVExWX2R1OgorICAgICAgICAgIGNhc2UgVExWX3BvOgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHNzaWxlbiAtPSB0bHZfbGVuOworICAgICAgICBwYXlsb2FkICs9IHRsdl9sZW47CisgICAgICAgIHBheWxvYWRfbGVuIC09IHRsdl9sZW47CisgICAgICB9CisgICAgICBwYXlsb2FkICs9IHBhZGRpbmc7CisgICAgICBwYXlsb2FkX2xlbiAtPSBwYWRkaW5nOworICAgIH0KKworICAgIHJ0cHhxdGRlcGF5LT5wcmV2aW91c19pZCA9IHJ0cHhxdGRlcGF5LT5jdXJyZW50X2lkOworCisgICAgc3dpdGNoIChwY2spIHsKKyAgICAgIGNhc2UgMToKKyAgICAgIHsKKyAgICAgICAgLyogbXVsdGlwbGUgc2FtcGxlcyBwZXIgcGFja2V0LiAqLworICAgICAgICBvdXRidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHBheWxvYWRfbGVuKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl9maWxsIChvdXRidWYsIDAsIHBheWxvYWQsIHBheWxvYWRfbGVuKTsKKworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisgICAgICBjYXNlIDI6CisgICAgICB7CisgICAgICAgIGd1aW50IHNsZW47CisKKyAgICAgICAgLyogbXVsdGlwbGUgc2FtcGxlcyBwZXIgcGFja2V0LiAKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiB8U3wgUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgIHwgU2FtcGxlIExlbmd0aCAgICAgICAgICAgICAgICAgfAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiB8IFNhbXBsZSBUaW1lc3RhbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiAuIFNhbXBsZSBEYXRhIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiB8U3wgUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgIHwgU2FtcGxlIExlbmd0aCAgICAgICAgICAgICAgICAgfAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiB8IFNhbXBsZSBUaW1lc3RhbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiAuIFNhbXBsZSBEYXRhIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiAuIC4uLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKi8KKyAgICAgICAgd2hpbGUgKHBheWxvYWRfbGVuID4gOCkgeworICAgICAgICAgIHMgPSAocGF5bG9hZFswXSAmIDB4ODApICE9IDA7IC8qIGNvbnRhaW5zIHN5bmMgc2FtcGxlICovCisgICAgICAgICAgc2xlbiA9IChwYXlsb2FkWzJdIDw8IDgpIHwgcGF5bG9hZFszXTsKKyAgICAgICAgICAvKiB0aW1lc3RhbXAgPQorICAgICAgICAgICAqICAgIChwYXlsb2FkWzRdIDw8IDI0KSB8IChwYXlsb2FkWzVdIDw8IDE2KSB8IChwYXlsb2FkWzZdIDw8IDgpIHwKKyAgICAgICAgICAgKiAgICBwYXlsb2FkWzddOworICAgICAgICAgICAqLworCisgICAgICAgICAgcGF5bG9hZCArPSA4OworICAgICAgICAgIHBheWxvYWRfbGVuIC09IDg7CisKKyAgICAgICAgICBpZiAoc2xlbiA+IHBheWxvYWRfbGVuKQorICAgICAgICAgICAgc2xlbiA9IHBheWxvYWRfbGVuOworCisgICAgICAgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzbGVuKTsKKyAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKG91dGJ1ZiwgMCwgcGF5bG9hZCwgc2xlbik7CisgICAgICAgICAgaWYgKCFzKQorICAgICAgICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisKKyAgICAgICAgICBnc3RfcnRwX2Jhc2VfZGVwYXlsb2FkX3B1c2ggKGRlcGF5bG9hZCwgb3V0YnVmKTsKKworICAgICAgICAgIC8qIGFsaWduZWQgb24gMzIgYml0IGJvdW5kYXJ5ICovCisgICAgICAgICAgc2xlbiA9IEdTVF9ST1VORF9VUF80IChzbGVuKTsKKworICAgICAgICAgIHBheWxvYWQgKz0gc2xlbjsKKyAgICAgICAgICBwYXlsb2FkX2xlbiAtPSBzbGVuOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAzOgorICAgICAgeworICAgICAgICAvKiBvbmUgc2FtcGxlIHBlciBwYWNrZXQsIHVzZSBhZGFwdGVyIHRvIGNvbWJpbmUgYmFzZWQgb24gbWFya2VyIGJpdC4gKi8KKyAgICAgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChwYXlsb2FkX2xlbik7CisgICAgICAgIGdzdF9idWZmZXJfZmlsbCAob3V0YnVmLCAwLCBwYXlsb2FkLCBwYXlsb2FkX2xlbik7CisKKyAgICAgICAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRweHF0ZGVwYXktPmFkYXB0ZXIsIG91dGJ1Zik7CisgICAgICAgIG91dGJ1ZiA9IE5VTEw7CisKKyAgICAgICAgaWYgKCFtKQorICAgICAgICAgIGdvdG8gZG9uZTsKKworICAgICAgICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRweHF0ZGVwYXktPmFkYXB0ZXIpOworICAgICAgICBvdXRidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRweHF0ZGVwYXktPmFkYXB0ZXIsIGF2YWlsKTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHB4cXRkZXBheSwKKyAgICAgICAgICAgICJnc3RfcnRwX3hxdF9kZXBheV9jaGFpbjogcHVzaGluZyBidWZmZXIgb2Ygc2l6ZSAldSIsIGF2YWlsKTsKKworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisgICAgfQorICB9CisKK2RvbmU6CisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgcmV0dXJuIG91dGJ1ZjsKKworbmVlZF9yZXN5bmM6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHB4cXRkZXBheSwgIndhaXRpbmcgZm9yIG1hcmtlciIpOworICAgIGdvdG8gZG9uZTsKKyAgfQord3JvbmdfdmVyc2lvbjoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cHhxdGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJVbmtub3duIHBheWxvYWQgdmVyc2lvbi4iKSwgKE5VTEwpKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK3Bja19yZXNlcnZlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cHhxdGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJQQ0sgcmVzZXJ2ZWQgMC4iKSwgKE5VTEwpKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK3dyb25nX2xlbmd0aDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cHhxdGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJXcm9uZyBwYXlsb2FkIGxlbmd0aC4iKSwgKE5VTEwpKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK3Vua25vd25fZm9ybWF0OgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRweHF0ZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIlVua25vd24gcGF5bG9hZCBmb3JtYXQuIiksIChOVUxMKSk7CisgICAgZ290byBkb25lOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF94cXRfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0UnRwWFFURGVwYXkgKnJ0cHhxdGRlcGF5OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRweHF0ZGVwYXkgPSBHU1RfUlRQX1hRVF9ERVBBWSAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChydHB4cXRkZXBheS0+YWRhcHRlcik7CisgICAgICBydHB4cXRkZXBheS0+cHJldmlvdXNfaWQgPSAtMTsKKyAgICAgIHJ0cHhxdGRlcGF5LT5jdXJyZW50X2lkID0gLTE7CisgICAgICBydHB4cXRkZXBheS0+bmVlZF9yZXN5bmMgPSBUUlVFOworICAgICAgcnRweHF0ZGVwYXktPmhhdmVfc2QgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRweHF0ZGVwYXktPmFkYXB0ZXIpOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9nc3RydHB4cXRkZXBheS5oIGIvZ3N0L2lzb21wNC9nc3RydHB4cXRkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNGU0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L2dzdHJ0cHhxdGRlcGF5LmgKQEAgLTAsMCArMSw2NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1hRVF9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1hRVF9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfWFFUX0RFUEFZIFwKKyAgKGdzdF9ydHBfeHF0X2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfWFFUX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1hRVF9ERVBBWSxHc3RSdHBYUVREZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfWFFUX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9YUVRfREVQQVksR3N0UnRwWFFURGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfWFFUX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1hRVF9ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfWFFUX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9YUVRfREVQQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwWFFURGVwYXkgR3N0UnRwWFFURGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwWFFURGVwYXlDbGFzcyBHc3RSdHBYUVREZXBheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cFhRVERlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisKKyAgZ2Jvb2xlYW4gbmVlZF9yZXN5bmM7CisgIGd1aW50MTYgcHJldmlvdXNfaWQ7CisgIGd1aW50MTYgY3VycmVudF9pZDsKKyAgZ2Jvb2xlYW4gaGF2ZV9zZDsKK307CisKK3N0cnVjdCBfR3N0UnRwWFFURGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF94cXRfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX1hRVF9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvaXNvbXA0LXBsdWdpbi5jIGIvZ3N0L2lzb21wNC9pc29tcDQtcGx1Z2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmNzhjZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvaXNvbXA0LXBsdWdpbi5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSAiZ3N0L2dzdC1pMThuLXBsdWdpbi5oIgorCisjaW5jbHVkZSAicXRkZW11eC5oIgorI2luY2x1ZGUgImdzdHJ0cHhxdGRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cXRtdXguaCIKKyNpbmNsdWRlICJnc3RxdG1vb3ZyZWNvdmVyLmgiCisKKyNpbmNsdWRlIDxnc3QvcGJ1dGlscy9wYnV0aWxzLmg+CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyNpZmRlZiBFTkFCTEVfTkxTCisgIGJpbmR0ZXh0ZG9tYWluIChHRVRURVhUX1BBQ0tBR0UsIExPQ0FMRURJUik7CisgIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChHRVRURVhUX1BBQ0tBR0UsICJVVEYtOCIpOworI2VuZGlmIC8qIEVOQUJMRV9OTFMgKi8KKworICBnc3RfcGJfdXRpbHNfaW5pdCAoKTsKKworICAvKiBlbnN1cmUgcHJpdmF0ZSB0YWcgaXMgcmVnaXN0ZXJlZCAqLworICBnc3RfdGFnX3JlZ2lzdGVyIChHU1RfUVRfREVNVVhfUFJJVkFURV9UQUcsIEdTVF9UQUdfRkxBR19NRVRBLAorICAgICAgR1NUX1RZUEVfU0FNUExFLCAiUVQgYXRvbSIsICJ1bnBhcnNlZCBRVCB0YWcgYXRvbSIsCisgICAgICBnc3RfdGFnX21lcmdlX3VzZV9maXJzdCk7CisKKyAgZ3N0X3RhZ19yZWdpc3RlciAoR1NUX1FUX0RFTVVYX0NMQVNTSUZJQ0FUSU9OX1RBRywgR1NUX1RBR19GTEFHX01FVEEsCisgICAgICBHX1RZUEVfU1RSSU5HLCBHU1RfUVRfREVNVVhfQ0xBU1NJRklDQVRJT05fVEFHLCAiY29udGVudCBjbGFzc2lmaWNhdGlvbiIsCisgICAgICBnc3RfdGFnX21lcmdlX3VzZV9maXJzdCk7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicXRkZW11eCIsCisgICAgICAgICAgR1NUX1JBTktfUFJJTUFSWSwgR1NUX1RZUEVfUVRERU1VWCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHhxdGRlcGF5IiwKKyAgICAgICAgICBHU1RfUkFOS19NQVJHSU5BTCwgR1NUX1RZUEVfUlRQX1hRVF9ERVBBWSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3F0X211eF9yZWdpc3RlciAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghZ3N0X3F0X21vb3ZfcmVjb3Zlcl9yZWdpc3RlciAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBpc29tcDQsCisgICAgIklTTyBiYXNlIG1lZGlhIGZpbGUgZm9ybWF0IHN1cHBvcnQgKG1wNCwgM2dwcCwgcXQsIG1qMikiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L21lc29uLmJ1aWxkIGIvZ3N0L2lzb21wNC9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGEyZDY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDI5IEBACittcDRfc291cmNlcyA9IFsKKyAgJ2lzb21wNC1wbHVnaW4uYycsCisgICdnc3RydHB4cXRkZXBheS5jJywKKyAgJ3F0ZGVtdXguYycsCisgICdxdGRlbXV4X3R5cGVzLmMnLAorICAncXRkZW11eF9kdW1wLmMnLAorICAncXRkZW11eF9sYW5nLmMnLAorICAnZ3N0aXNvZmYuYycsCisgICdnc3RxdG11eC5jJywKKyAgJ2dzdHF0bW9vdnJlY292ZXIuYycsCisgICdhdG9tcy5jJywKKyAgJ2F0b21zcmVjb3ZlcnkuYycsCisgICdkZXNjcmlwdG9ycy5jJywKKyAgJ3Byb3BlcnRpZXMuYycsCisgICdnc3RxdG11eG1hcC5jJworXQorCitnc3Rpc29tcDQgPSBsaWJyYXJ5KCdnc3Rpc29tcDQnLAorICBtcDRfc291cmNlcywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBsaW5rX2FyZ3MgOiBub3NlaF9saW5rX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdF9kZXAsIGdzdHJpZmZfZGVwLCBnc3RhdWRpb19kZXAsIGdzdHZpZGVvX2RlcCwKKyAgICAgICAgICAgICAgICAgIGdzdHJ0cF9kZXAsIGdzdHRhZ19kZXAsIGdzdHBidXRpbHNfZGVwLCB6bGliX2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCisKK2luc3RhbGxfZGF0YShzb3VyY2VzOiAnR3N0UVRNdXgucHJzJywgaW5zdGFsbF9kaXI6IHByZXNldGRpcikKZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvcHJvcGVydGllcy5jIGIvZ3N0L2lzb21wNC9wcm9wZXJ0aWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I0M2UyOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvcHJvcGVydGllcy5jCkBAIC0wLDAgKzEsMjEwIEBACisvKiBRdWlja3RpbWUgbXV4ZXIgcGx1Z2luIGZvciBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGlhZ28gU291c2EgU2FudG9zIDx0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5icj4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJwcm9wZXJ0aWVzLmgiCisKKy8qIGlmIG5lZWRlZCwgcmUtYWxsb2NhdGUgYnVmZmVyIHRvIGVuc3VyZSBzaXplIGJ5dGVzIGNhbiBiZSB3cml0dGVuIGludG8gaXQKKyAqIGF0IG9mZnNldCAqLwordm9pZAorcHJvcF9jb3B5X2Vuc3VyZV9idWZmZXIgKGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBic2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCwKKyAgICBndWludDY0IHNpemUpCit7CisgIGlmIChidWZmZXIgJiYgKmJzaXplIC0gKm9mZnNldCA8IHNpemUpIHsKKyAgICAqYnNpemUgKz0gc2l6ZSArIDEwICogMTAyNDsKKyAgICAqYnVmZmVyID0gZ19yZWFsbG9jICgqYnVmZmVyLCAqYnNpemUpOworICB9Cit9CisKK3N0YXRpYyBndWludDY0Citjb3B5X2Z1bmMgKHZvaWQgKnByb3AsIGd1aW50IHNpemUsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBic2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBpZiAoYnVmZmVyKSB7CisgICAgcHJvcF9jb3B5X2Vuc3VyZV9idWZmZXIgKGJ1ZmZlciwgYnNpemUsIG9mZnNldCwgc2l6ZSk7CisgICAgbWVtY3B5ICgqYnVmZmVyICsgKm9mZnNldCwgcHJvcCwgc2l6ZSk7CisgIH0KKyAgKm9mZnNldCArPSBzaXplOworICByZXR1cm4gc2l6ZTsKK30KKworI2RlZmluZSBJTlRfQVJSQVlfQ09QWV9GVU5DX0ZBU1QobmFtZSwgZGF0YXR5cGUpIAkJCVwKK2d1aW50NjQgcHJvcF9jb3B5XyAjIyBuYW1lICMjIF9hcnJheSAoZGF0YXR5cGUgKnByb3AsIGd1aW50IHNpemUsCVwKKyAgICBndWludDggKiogYnVmZmVyLCBndWludDY0ICogYnNpemUsIGd1aW50NjQgKiBvZmZzZXQpIHsgCQlcCisgIHJldHVybiBjb3B5X2Z1bmMgKHByb3AsIHNpemVvZiAoZGF0YXR5cGUpICogc2l6ZSwgYnVmZmVyLCBic2l6ZSwgb2Zmc2V0KTtcCit9CisKKyNkZWZpbmUgSU5UX0FSUkFZX0NPUFlfRlVOQyhuYW1lLCBkYXRhdHlwZSkgCQkJCVwKK2d1aW50NjQgcHJvcF9jb3B5XyAjIyBuYW1lICMjIF9hcnJheSAoZGF0YXR5cGUgKnByb3AsIGd1aW50IHNpemUsCVwKKyAgICBndWludDggKiogYnVmZmVyLCBndWludDY0ICogYnNpemUsIGd1aW50NjQgKiBvZmZzZXQpIHsgCQlcCisgIGd1aW50IGk7CQkJCQkJCQlcCisJCQkJCQkJCQlcCisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsJCQkJCQlcCisgICAgcHJvcF9jb3B5XyAjIyBuYW1lIChwcm9wW2ldLCBidWZmZXIsIGJzaXplLCBvZmZzZXQpOwkJXAorICB9CQkJCQkJCQkJXAorICByZXR1cm4gc2l6ZW9mIChkYXRhdHlwZSkgKiBzaXplOwkJCQkJXAorfQorCisvKiBJTlRFR0VSUyAqLworZ3VpbnQ2NAorcHJvcF9jb3B5X3VpbnQ4IChndWludDggcHJvcCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgcmV0dXJuIGNvcHlfZnVuYyAoJnByb3AsIHNpemVvZiAoZ3VpbnQ4KSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworfQorCitndWludDY0Citwcm9wX2NvcHlfdWludDE2IChndWludDE2IHByb3AsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIHByb3AgPSBHVUlOVDE2X1RPX0JFIChwcm9wKTsKKyAgcmV0dXJuIGNvcHlfZnVuYyAoJnByb3AsIHNpemVvZiAoZ3VpbnQxNiksIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKK30KKworZ3VpbnQ2NAorcHJvcF9jb3B5X3VpbnQzMiAoZ3VpbnQzMiBwcm9wLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBwcm9wID0gR1VJTlQzMl9UT19CRSAocHJvcCk7CisgIHJldHVybiBjb3B5X2Z1bmMgKCZwcm9wLCBzaXplb2YgKGd1aW50MzIpLCBidWZmZXIsIHNpemUsIG9mZnNldCk7Cit9CisKK2d1aW50NjQKK3Byb3BfY29weV91aW50NjQgKGd1aW50NjQgcHJvcCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgcHJvcCA9IEdVSU5UNjRfVE9fQkUgKHByb3ApOworICByZXR1cm4gY29weV9mdW5jICgmcHJvcCwgc2l6ZW9mIChndWludDY0KSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworfQorCitndWludDY0Citwcm9wX2NvcHlfaW50MzIgKGdpbnQzMiBwcm9wLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBwcm9wID0gR0lOVDMyX1RPX0JFIChwcm9wKTsKKyAgcmV0dXJuIGNvcHlfZnVuYyAoJnByb3AsIHNpemVvZiAoZ3VpbnQzMiksIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKK30KKworLyogdWludDggY2FuIHVzZSBkaXJlY3QgY29weSBpbiBhbnkgY2FzZSwgYW5kIG1heSBiZSB1c2VkIGZvciBsYXJnZSBxdWFudGl0eSAqLworSU5UX0FSUkFZX0NPUFlfRlVOQ19GQVNUICh1aW50OCwgZ3VpbnQ4KTsKKy8qIG5vdCB1c2VkIGluIGxhcmdlIHF1YW50aXR5IGFueXdheSAqLworSU5UX0FSUkFZX0NPUFlfRlVOQyAodWludDE2LCBndWludDE2KTsKK0lOVF9BUlJBWV9DT1BZX0ZVTkMgKHVpbnQzMiwgZ3VpbnQzMik7CitJTlRfQVJSQVlfQ09QWV9GVU5DICh1aW50NjQsIGd1aW50NjQpOworCisvKiBGT1VSQ0MgKi8KK2d1aW50NjQKK3Byb3BfY29weV9mb3VyY2MgKGd1aW50MzIgcHJvcCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgcHJvcCA9IEdJTlQzMl9UT19MRSAocHJvcCk7CisgIHJldHVybiBjb3B5X2Z1bmMgKCZwcm9wLCBzaXplb2YgKGd1aW50MzIpLCBidWZmZXIsIHNpemUsIG9mZnNldCk7Cit9CisKK0lOVF9BUlJBWV9DT1BZX0ZVTkMgKGZvdXJjYywgZ3VpbnQzMik7CisKKy8qKgorICogcHJvcF9jb3B5X2ZpeGVkX3NpemVfc3RyaW5nOgorICogQHN0cmluZzogdGhlIHN0cmluZyB0byBiZSBjb3BpZWQKKyAqIEBzdHJfc2l6ZTogc2l6ZSBvZiB0aGUgc3RyaW5nCisgKiBAYnVmZmVyOiB0aGUgYXJyYXkgdG8gY29weSB0aGUgc3RyaW5nIHRvCisgKiBAb2Zmc2V0OiB0aGUgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciBhcnJheS4KKyAqIFRoaXMgdmFsdWUgaXMgdXBkYXRlZCB0byB0aGUgcG9pbnQgcmlnaHQgYWZ0ZXIgdGhlIGNvcGllZCBzdHJpbmcuCisgKgorICogQ29waWVzIGEgc3RyaW5nIG9mIGJ5dGVzIHdpdGhvdXQgcGxhY2luZyBpdHMgc2l6ZSBhdCB0aGUgYmVnaW5uaW5nLgorICoKKyAqIFJldHVybnM6IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkCisgKi8KK2d1aW50NjQKK3Byb3BfY29weV9maXhlZF9zaXplX3N0cmluZyAoZ3VpbnQ4ICogc3RyaW5nLCBndWludCBzdHJfc2l6ZSwgZ3VpbnQ4ICoqIGJ1ZmZlciwKKyAgICBndWludDY0ICogc2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgcmV0dXJuIGNvcHlfZnVuYyAoc3RyaW5nLCBzdHJfc2l6ZSAqIHNpemVvZiAoZ3VpbnQ4KSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworfQorCisvKioKKyAqIHByb3BfY29weV9zaXplX3N0cmluZzoKKyAqCisgKiBAc3RyaW5nOiB0aGUgc3RyaW5nIHRvIGJlIGNvcGllZAorICogQHN0cl9zaXplOiBzaXplIG9mIHRoZSBzdHJpbmcKKyAqIEBidWZmZXI6IHRoZSBhcnJheSB0byBjb3B5IHRoZSBzdHJpbmcgdG8KKyAqIEBvZmZzZXQ6IHRoZSBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyIGFycmF5LgorICogVGhpcyB2YWx1ZSBpcyB1cGRhdGVkIHRvIHRoZSBwb2ludCByaWdodCBhZnRlciB0aGUgY29waWVkIHN0cmluZy4KKyAqCisgKiBDb3BpZXMgYSBzdHJpbmcgYW5kIGl0cyBzaXplIHRvIGFuIGFycmF5LiBFeGFtcGxlOgorICogc3RyaW5nID0gJ2FiY1wwJworICogcmVzdWx0IGluIHRoZSBhcnJheTogWzNdW2FdW2JdW2NdICAoZWFjaCBbeF0gcmVwcmVzZW50cyBhIHBvc2l0aW9uKQorICoKKyAqIFJldHVybnM6IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkCisgKi8KK2d1aW50NjQKK3Byb3BfY29weV9zaXplX3N0cmluZyAoZ3VpbnQ4ICogc3RyaW5nLCBndWludCBzdHJfc2l6ZSwgZ3VpbnQ4ICoqIGJ1ZmZlciwKKyAgICBndWludDY0ICogc2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIHByb3BfY29weV91aW50OCAoc3RyX3NpemUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X2ZpeGVkX3NpemVfc3RyaW5nIChzdHJpbmcsIHN0cl9zaXplLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCisvKioKKyAqIHByb3BfY29weV9udWxsX3Rlcm1pbmF0ZWRfc3RyaW5nOgorICogQHN0cmluZzogdGhlIHN0cmluZyB0byBiZSBjb3BpZWQKKyAqIEBidWZmZXI6IHRoZSBhcnJheSB0byBjb3B5IHRoZSBzdHJpbmcgdG8KKyAqIEBvZmZzZXQ6IHRoZSBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyIGFycmF5LgorICogVGhpcyB2YWx1ZSBpcyB1cGRhdGVkIHRvIHRoZSBwb2ludCByaWdodCBhZnRlciB0aGUgY29waWVkIHN0cmluZy4KKyAqCisgKiBDb3BpZXMgYSBzdHJpbmcgaW5jbHVkaW5nIGl0cyBudWxsIHRlcm1pbmF0aW5nIGNoYXIgdG8gYW4gYXJyYXkuCisgKgorICogUmV0dXJuczogdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQKKyAqLworZ3VpbnQ2NAorcHJvcF9jb3B5X251bGxfdGVybWluYXRlZF9zdHJpbmcgKGdjaGFyICogc3RyaW5nLCBndWludDggKiogYnVmZmVyLAorICAgIGd1aW50NjQgKiBzaXplLCBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisgIGd1aW50IGxlbiA9IHN0cmxlbiAoc3RyaW5nKTsKKworICBwcm9wX2NvcHlfZml4ZWRfc2l6ZV9zdHJpbmcgKChndWludDggKikgc3RyaW5nLCBsZW4sIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQ4ICgnXDAnLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9wcm9wZXJ0aWVzLmggYi9nc3QvaXNvbXA0L3Byb3BlcnRpZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzZmZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9wcm9wZXJ0aWVzLmgKQEAgLTAsMCArMSw4NyBAQAorLyogUXVpY2t0aW1lIG11eGVyIHBsdWdpbiBmb3IgR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhpYWdvIFNvdXNhIFNhbnRvcyA8dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnI+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qCisgKiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgU291cmNlIENvZGUgaXMgbGljZW5zZWQgdW5kZXIgTUlUIGxpY2Vuc2UuCisgKiBTZWUgZnVydGhlciBleHBsYW5hdGlvbiBhdHRhY2hlZCBpbiBMaWNlbnNlIFN0YXRlbWVudCAoZGlzdHJpYnV0ZWQgaW4gdGhlIGZpbGUKKyAqIExJQ0VOU0UpLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fUFJPUEVSVElFU19IX18KKyNkZWZpbmUgX19QUk9QRVJUSUVTX0hfXworCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKgorICogRnVuY3Rpb25zIGZvciBjb3B5aW5nIGF0b21zIHByb3BlcnRpZXMuCisgKgorICogQWxsIG9mIHRoZW0gcmVjZWl2ZSwgYXMgdGhlIGlucHV0LCB0aGUgcHJvcGVydHkgdG8gYmUgY29waWVkLCB0aGUgZGVzdGluYXRpb24KKyAqIGJ1ZmZlciwgYW5kIGEgcG9pbnRlciB0byBhbiBvZmZzZXQgaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciB0byBjb3B5IHRvIHRoZSByaWdodCBwbGFjZS4KKyAqIFRoaXMgb2Zmc2V0IHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgbmV3IHZhbHVlIChvZmZzZXQgKyBjb3BpZWRfc2l6ZSkKKyAqIFRoZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGhhcyBiZWVuIGNvcGllZCBvciAwCisgKiBpZiBpdCBjb3VsZG4ndCBjb3B5LgorICovCisKK3ZvaWQgICAgcHJvcF9jb3B5X2Vuc3VyZV9idWZmZXIgICAgICAgICAgKGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBic2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCwgZ3VpbnQ2NCBzaXplKTsKKworZ3VpbnQ2NCBwcm9wX2NvcHlfdWludDggICAgICAgICAgICAgICAgICAoZ3VpbnQ4IHByb3AsIGd1aW50OCAqKmJ1ZmZlciwgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCAqb2Zmc2V0KTsKK2d1aW50NjQgcHJvcF9jb3B5X3VpbnQxNiAgICAgICAgICAgICAgICAgKGd1aW50MTYgcHJvcCwgZ3VpbnQ4ICoqYnVmZmVyLCBndWludDY0ICpzaXplLCBndWludDY0ICpvZmZzZXQpOworZ3VpbnQ2NCBwcm9wX2NvcHlfdWludDMyICAgICAgICAgICAgICAgICAoZ3VpbnQzMiBwcm9wLCBndWludDggKipidWZmZXIsIGd1aW50NjQgKnNpemUsIGd1aW50NjQgKm9mZnNldCk7CitndWludDY0IHByb3BfY29weV91aW50NjQgICAgICAgICAgICAgICAgIChndWludDY0IHByb3AsIGd1aW50OCAqKmJ1ZmZlciwgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCAqb2Zmc2V0KTsKKworZ3VpbnQ2NCBwcm9wX2NvcHlfaW50MzIgICAgICAgICAgICAgICAgICAoZ2ludDMyIHByb3AsIGd1aW50OCAqKmJ1ZmZlciwgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCAqb2Zmc2V0KTsKKworZ3VpbnQ2NCBwcm9wX2NvcHlfdWludDhfYXJyYXkgICAgICAgICAgICAoZ3VpbnQ4ICpwcm9wLCBndWludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ4ICoqYnVmZmVyLCBndWludDY0ICpic2l6ZSwgZ3VpbnQ2NCAqb2Zmc2V0KTsKK2d1aW50NjQgcHJvcF9jb3B5X3VpbnQxNl9hcnJheSAgICAgICAgICAgKGd1aW50MTYgKnByb3AsIGd1aW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDggKipidWZmZXIsIGd1aW50NjQgKmJzaXplLCBndWludDY0ICpvZmZzZXQpOworZ3VpbnQ2NCBwcm9wX2NvcHlfdWludDMyX2FycmF5ICAgICAgICAgICAoZ3VpbnQzMiAqcHJvcCwgZ3VpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50OCAqKmJ1ZmZlciwgZ3VpbnQ2NCAqYnNpemUsIGd1aW50NjQgKm9mZnNldCk7CitndWludDY0IHByb3BfY29weV91aW50NjRfYXJyYXkgICAgICAgICAgIChndWludDY0ICpwcm9wLCBndWludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ4ICoqYnVmZmVyLCBndWludDY0ICpic2l6ZSwgZ3VpbnQ2NCAqb2Zmc2V0KTsKKworZ3VpbnQ2NCBwcm9wX2NvcHlfZm91cmNjICAgICAgICAgICAgICAgICAoZ3VpbnQzMiBwcm9wLCBndWludDggKipidWZmZXIsIGd1aW50NjQgKnNpemUsIGd1aW50NjQgKm9mZnNldCk7CitndWludDY0IHByb3BfY29weV9mb3VyY2NfYXJyYXkgICAgICAgICAgIChndWludDMyICpwcm9wLCBndWludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ4ICoqYnVmZmVyLCBndWludDY0ICpic2l6ZSwgZ3VpbnQ2NCAqb2Zmc2V0KTsKK2d1aW50NjQgcHJvcF9jb3B5X2ZpeGVkX3NpemVfc3RyaW5nICAgICAgKGd1aW50OCAqc3RyaW5nLCBndWludCBzdHJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50OCAqKmJ1ZmZlciwgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCAqb2Zmc2V0KTsKK2d1aW50NjQgcHJvcF9jb3B5X3NpemVfc3RyaW5nICAgICAgICAgICAgKGd1aW50OCAqc3RyaW5nLCBndWludCBzdHJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50OCAqKmJ1ZmZlciwgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCAqb2Zmc2V0KTsKK2d1aW50NjQgcHJvcF9jb3B5X251bGxfdGVybWluYXRlZF9zdHJpbmcgKGdjaGFyICpzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDggKipidWZmZXIsIGd1aW50NjQgKnNpemUsIGd1aW50NjQgKm9mZnNldCk7CisKKyNlbmRpZiAvKiBfX1BST1BFUlRJRVNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L3F0YXRvbXBhcnNlci5oIGIvZ3N0L2lzb21wNC9xdGF0b21wYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWJhYjUwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9xdGF0b21wYXJzZXIuaApAQCAtMCwwICsxLDEzOSBAQAorLyogR1N0cmVhbWVyIFF1aWNrVGltZSBhdG9tIHBhcnNlcgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBTVEVyaWNzc29uIDxiZW5qYW1pbi5nYWlnbmFyZEBzdGVyaWNzc29uLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIFFUX0FUT01fUEFSU0VSX0gKKyNkZWZpbmUgUVRfQVRPTV9QQVJTRVJfSAorCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXJlYWRlci5oPgorCisvKiBvdXIgaW5saW5lZCB2ZXJzaW9uIG9mIEdzdEJ5dGVSZWFkZXIgKi8KKworc3RhdGljIGlubGluZSBnYm9vbGVhbgorcXRfYXRvbV9wYXJzZXJfaGFzX3JlbWFpbmluZyAoR3N0Qnl0ZVJlYWRlciAqIHBhcnNlciwgZ3VpbnQ2NCBieXRlc19uZWVkZWQpCit7CisgIHJldHVybiBHX0xJS0VMWSAocGFyc2VyLT5zaXplID49IGJ5dGVzX25lZWRlZCkgJiYKKyAgICAgIEdfTElLRUxZICgocGFyc2VyLT5zaXplIC0gYnl0ZXNfbmVlZGVkKSA+PSBwYXJzZXItPmJ5dGUpOworfQorCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitxdF9hdG9tX3BhcnNlcl9oYXNfY2h1bmtzIChHc3RCeXRlUmVhZGVyICogcGFyc2VyLCBndWludDMyIG5fY2h1bmtzLAorICAgIGd1aW50MzIgY2h1bmtfc2l6ZSkKK3sKKyAgLyogYXNzdW1wdGlvbjogbl9jaHVua3MgYW5kIGNodW5rX3NpemUgYXJlIDMyLWJpdCwgd2UgY2FzdCB0byA2NC1iaXQgaGVyZQorICAgKiB0byBhdm9pZCBvdmVyZmxvd3MsIHRvIGhhbmRsZSBlLmcuIChndWludDMyKS0xICogc2l6ZSBjb3JyZWN0bHkgKi8KKyAgcmV0dXJuIHF0X2F0b21fcGFyc2VyX2hhc19yZW1haW5pbmcgKHBhcnNlciwgKGd1aW50NjQpIG5fY2h1bmtzICogY2h1bmtfc2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ2Jvb2xlYW4KK3F0X2F0b21fcGFyc2VyX3BlZWtfc3ViIChHc3RCeXRlUmVhZGVyICogcGFyc2VyLCBndWludCBvZmZzZXQsIGd1aW50IHNpemUsCisgICAgR3N0Qnl0ZVJlYWRlciAqIHN1YikKK3sKKyAgKnN1YiA9ICpwYXJzZXI7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoc3ViLCBvZmZzZXQpKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIChnc3RfYnl0ZV9yZWFkZXJfZ2V0X3JlbWFpbmluZyAoc3ViKSA+PSBzaXplKTsKK30KKworc3RhdGljIGlubGluZSBnYm9vbGVhbgorcXRfYXRvbV9wYXJzZXJfc2tpcG5fYW5kX2dldF91aW50MzIgKEdzdEJ5dGVSZWFkZXIgKiBwYXJzZXIsCisgICAgZ3VpbnQgYnl0ZXNfdG9fc2tpcCwgZ3VpbnQzMiAqIHZhbCkKK3sKKyAgaWYgKEdfVU5MSUtFTFkgKGdzdF9ieXRlX3JlYWRlcl9nZXRfcmVtYWluaW5nIChwYXJzZXIpIDwgKGJ5dGVzX3RvX3NraXAgKyA0KSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGdzdF9ieXRlX3JlYWRlcl9za2lwX3VuY2hlY2tlZCAocGFyc2VyLCBieXRlc190b19za2lwKTsKKyAgKnZhbCA9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAocGFyc2VyKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIG9mZl9zaXplIG11c3QgYmUgZWl0aGVyIDQgb3IgOCAqLworc3RhdGljIGlubGluZSBnYm9vbGVhbgorcXRfYXRvbV9wYXJzZXJfZ2V0X29mZnNldCAoR3N0Qnl0ZVJlYWRlciAqIHBhcnNlciwgZ3VpbnQgb2ZmX3NpemUsCisgICAgZ3VpbnQ2NCAqIHZhbCkKK3sKKyAgaWYgKEdfVU5MSUtFTFkgKGdzdF9ieXRlX3JlYWRlcl9nZXRfcmVtYWluaW5nIChwYXJzZXIpIDwgb2ZmX3NpemUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAob2ZmX3NpemUgPT0gc2l6ZW9mIChndWludDY0KSkgeworICAgICp2YWwgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQ2NF9iZV91bmNoZWNrZWQgKHBhcnNlcik7CisgIH0gZWxzZSB7CisgICAgKnZhbCA9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAocGFyc2VyKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworLyogb2ZmX3NpemUgbXVzdCBiZSBlaXRoZXIgNCBvciA4ICovCitzdGF0aWMgaW5saW5lIGd1aW50NjQKK3F0X2F0b21fcGFyc2VyX2dldF9vZmZzZXRfdW5jaGVja2VkIChHc3RCeXRlUmVhZGVyICogcGFyc2VyLCBndWludCBvZmZfc2l6ZSkKK3sKKyAgaWYgKG9mZl9zaXplID09IHNpemVvZiAoZ3VpbnQ2NCkpIHsKKyAgICByZXR1cm4gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50NjRfYmVfdW5jaGVja2VkIChwYXJzZXIpOworICB9IGVsc2UgeworICAgIHJldHVybiBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQgKHBhcnNlcik7CisgIH0KK30KKworLyogc2l6ZSBtdXN0IGJlIGZyb20gMSB0byA0ICovCitzdGF0aWMgaW5saW5lIGd1aW50MzIKK3F0X2F0b21fcGFyc2VyX2dldF91aW50X3dpdGhfc2l6ZV91bmNoZWNrZWQgKEdzdEJ5dGVSZWFkZXIgKiBwYXJzZXIsCisgICAgZ3VpbnQgc2l6ZSkKK3sKKyAgc3dpdGNoIChzaXplKSB7CisgIGNhc2UgMToKKyAgICByZXR1cm4gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OF91bmNoZWNrZWQgKHBhcnNlcik7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfYmVfdW5jaGVja2VkIChwYXJzZXIpOworICBjYXNlIDM6CisgICAgcmV0dXJuIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDI0X2JlX3VuY2hlY2tlZCAocGFyc2VyKTsKKyAgY2FzZSA0OgorICAgIHJldHVybiBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQgKHBhcnNlcik7CisgIGRlZmF1bHQ6CisgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgZ3N0X2J5dGVfcmVhZGVyX3NraXBfdW5jaGVja2VkIChwYXJzZXIsIHNpemUpOworICAgIGJyZWFrOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitxdF9hdG9tX3BhcnNlcl9nZXRfZm91cmNjIChHc3RCeXRlUmVhZGVyICogcGFyc2VyLCBndWludDMyICogZm91cmNjKQoreworICBndWludDMyIGZfYmU7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGdzdF9ieXRlX3JlYWRlcl9nZXRfcmVtYWluaW5nIChwYXJzZXIpIDwgNCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGZfYmUgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQgKHBhcnNlcik7CisgICpmb3VyY2MgPSBHVUlOVDMyX1NXQVBfTEVfQkUgKGZfYmUpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGlubGluZSBndWludDMyCitxdF9hdG9tX3BhcnNlcl9nZXRfZm91cmNjX3VuY2hlY2tlZCAoR3N0Qnl0ZVJlYWRlciAqIHBhcnNlcikKK3sKKyAgZ3VpbnQzMiBmb3VyY2M7CisKKyAgZm91cmNjID0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmVfdW5jaGVja2VkIChwYXJzZXIpOworICByZXR1cm4gR1VJTlQzMl9TV0FQX0xFX0JFIChmb3VyY2MpOworfQorCisjZW5kaWYgLyogUVRfQVRPTV9QQVJTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9xdGRlbXV4LmMgYi9nc3QvaXNvbXA0L3F0ZGVtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmY4NzBmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9xdGRlbXV4LmMKQEAgLTAsMCArMSwxNDQ3NSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gSnVsaWVuIE1vdXR0ZSA8anVsaWVuQGZsdWVuZG8uY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFNURXJpY3Nzb24gPGJlbmphbWluLmdhaWduYXJkQHN0ZXJpY3Nzb24uY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAxMz4gU3JlZXJlbmogQmFsYWNoYW5kcmFuIDxzcmVlcmVuai5iYWxhY2hhbmRyYW5AaW50ZWwuY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAxMz4gSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgPDIwMTQ+IENlbnRyaWN1bGFyIEx0ZAorICogQ29weXJpZ2h0IChDKSA8MjAxNT4gWW91VmlldyBUViBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDwyMDE2PiBCcml0aXNoIEJyb2FkY2FzdGluZyBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXF0ZGVtdXgKKyAqCisgKiBEZW11eGVzIGEgLm1vdiBmaWxlIGludG8gcmF3IG9yIGNvbXByZXNzZWQgYXVkaW8gYW5kL29yIHZpZGVvIHN0cmVhbXMuCisgKgorICogVGhpcyBlbGVtZW50IHN1cHBvcnRzIGJvdGggcHVzaCBhbmQgcHVsbC1iYXNlZCBzY2hlZHVsaW5nLCBkZXBlbmRpbmcgb24gdGhlCisgKiBjYXBhYmlsaXRpZXMgb2YgdGhlIHVwc3RyZWFtIGVsZW1lbnRzLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPXRlc3QubW92ICEgcXRkZW11eCBuYW1lPWRlbXV4ICBkZW11eC5hdWRpb18wICEgcXVldWUgISBkZWNvZGViaW4gISBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgYXV0b2F1ZGlvc2luayAgIGRlbXV4LnZpZGVvXzAgISBxdWV1ZSAhIGRlY29kZWJpbiAhIHZpZGVvY29udmVydCAhIHZpZGVvc2NhbGUgISBhdXRvdmlkZW9zaW5rCisgKiBdfCBQbGF5IChwYXJzZSBhbmQgZGVjb2RlKSBhIC5tb3YgZmlsZSBhbmQgdHJ5IHRvIG91dHB1dCBpdCB0bworICogYW4gYXV0b21hdGljYWxseSBkZXRlY3RlZCBzb3VuZGNhcmQgYW5kIHZpZGVvc2luay4gSWYgdGhlIE1PViBmaWxlIGNvbnRhaW5zCisgKiBjb21wcmVzc2VkIGF1ZGlvIG9yIHZpZGVvIGRhdGEsIHRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgeW91IGhhdmUgdGhlCisgKiByaWdodCBkZWNvZGVyIGVsZW1lbnRzL3BsdWdpbnMgaW5zdGFsbGVkLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3QvZ3N0LWkxOG4tcGx1Z2luLmgiCisKKyNpbmNsdWRlIDxnbGliL2dwcmludGYuaD4KKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSAicXRhdG9tcGFyc2VyLmgiCisjaW5jbHVkZSAicXRkZW11eF90eXBlcy5oIgorI2luY2x1ZGUgInF0ZGVtdXhfZHVtcC5oIgorI2luY2x1ZGUgImZvdXJjYy5oIgorI2luY2x1ZGUgImRlc2NyaXB0b3JzLmgiCisjaW5jbHVkZSAicXRkZW11eF9sYW5nLmgiCisjaW5jbHVkZSAicXRkZW11eC5oIgorI2luY2x1ZGUgInF0cGFsZXR0ZS5oIgorCisjaW5jbHVkZSAiZ3N0L3JpZmYvcmlmZi1tZWRpYS5oIgorI2luY2x1ZGUgImdzdC9yaWZmL3JpZmYtcmVhZC5oIgorCisjaW5jbHVkZSA8Z3N0L3BidXRpbHMvcGJ1dGlscy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxnc3QvbWF0aC1jb21wYXQuaD4KKworI2lmZGVmIEhBVkVfWkxJQgorIyBpbmNsdWRlIDx6bGliLmg+CisjZW5kaWYKKworLyogbWF4LiBzaXplIGNvbnNpZGVyZWQgJ3NhbmUnIGZvciBub24tbWRhdCBhdG9tcyAqLworI2RlZmluZSBRVERFTVVYX01BWF9BVE9NX1NJWkUgKDI1KjEwMjQqMTAyNCkKKworLyogaWYgdGhlIHNhbXBsZSBpbmRleCBpcyBsYXJnZXIgdGhhbiB0aGlzLCBzb21ldGhpbmcgaXMgbGlrZWx5IHdyb25nICovCisjZGVmaW5lIFFUREVNVVhfTUFYX1NBTVBMRV9JTkRFWF9TSVpFICgyMDAqMTAyNCoxMDI0KQorCisvKiBGb3IgY29udmVydGluZyBxdCBjcmVhdGlvbiB0aW1lcyB0byB1bml4IGVwb2NoIHRpbWVzICovCisjZGVmaW5lIFFUREVNVVhfU0VDT05EU19QRVJfREFZICg2MCAqIDYwICogMjQpCisjZGVmaW5lIFFUREVNVVhfTEVBUF9ZRUFSU19GUk9NXzE5MDRfVE9fMTk3MCAxNworI2RlZmluZSBRVERFTVVYX1NFQ09ORFNfRlJPTV8xOTA0X1RPXzE5NzAgKCgoMTk3MCAtIDE5MDQpICogKGd1aW50NjQpIDM2NSArIFwKKyAgICBRVERFTVVYX0xFQVBfWUVBUlNfRlJPTV8xOTA0X1RPXzE5NzApICogUVRERU1VWF9TRUNPTkRTX1BFUl9EQVkpCisKKyNkZWZpbmUgUVRERU1VWF9UUkVFX05PREVfRk9VUkNDKG4pIChRVF9GT1VSQ0MoKChndWludDggKikgKG4pLT5kYXRhKSArIDQpKQorCisjZGVmaW5lIFNUUkVBTV9JU19FT1MocykgKHMtPnRpbWVfcG9zaXRpb24gPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKworI2RlZmluZSBBQlNESUZGKHgsIHkpICggKHgpID4gKHkpID8gKCh4KSAtICh5KSkgOiAoKHkpIC0gKHgpKSApCisKK0dTVF9ERUJVR19DQVRFR09SWSAocXRkZW11eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBxdGRlbXV4X2RlYnVnCisKK3R5cGVkZWYgc3RydWN0IF9RdERlbXV4U2VnbWVudCBRdERlbXV4U2VnbWVudDsKK3R5cGVkZWYgc3RydWN0IF9RdERlbXV4U2FtcGxlIFF0RGVtdXhTYW1wbGU7CisKK3R5cGVkZWYgc3RydWN0IF9RdERlbXV4Q2VuY1NhbXBsZVNldEluZm8gUXREZW11eENlbmNTYW1wbGVTZXRJbmZvOworCitzdHJ1Y3QgX1F0RGVtdXhTYW1wbGUKK3sKKyAgZ3VpbnQzMiBzaXplOworICBnaW50MzIgcHRzX29mZnNldDsgICAgICAgICAgICAvKiBBZGQgdGhpcyB2YWx1ZSB0byB0aW1lc3RhbXAgdG8gZ2V0IHRoZSBwdHMgKi8KKyAgZ3VpbnQ2NCBvZmZzZXQ7CisgIGd1aW50NjQgdGltZXN0YW1wOyAgICAgICAgICAgIC8qIERUUyBJbiBtb3YgdGltZSAqLworICBndWludDMyIGR1cmF0aW9uOyAgICAgICAgICAgICAvKiBJbiBtb3YgdGltZSAqLworICBnYm9vbGVhbiBrZXlmcmFtZTsgICAgICAgICAgICAvKiBUUlVFIHdoZW4gdGhpcyBwYWNrZXQgaXMgYSBrZXlmcmFtZSAqLworfTsKKworLyogTWFjcm9zIGZvciBjb252ZXJ0aW5nIHRvL2Zyb20gdGltZXNjYWxlICovCisjZGVmaW5lIFFUU1RSRUFNVElNRV9UT19HU1RUSU1FKHN0cmVhbSwgdmFsdWUpIChnc3RfdXRpbF91aW50NjRfc2NhbGUoKHZhbHVlKSwgR1NUX1NFQ09ORCwgKHN0cmVhbSktPnRpbWVzY2FsZSkpCisjZGVmaW5lIEdTVFRJTUVfVE9fUVRTVFJFQU1USU1FKHN0cmVhbSwgdmFsdWUpIChnc3RfdXRpbF91aW50NjRfc2NhbGUoKHZhbHVlKSwgKHN0cmVhbSktPnRpbWVzY2FsZSwgR1NUX1NFQ09ORCkpCisKKyNkZWZpbmUgUVRUSU1FX1RPX0dTVFRJTUUocXRkZW11eCwgdmFsdWUpIChnc3RfdXRpbF91aW50NjRfc2NhbGUoKHZhbHVlKSwgR1NUX1NFQ09ORCwgKHF0ZGVtdXgpLT50aW1lc2NhbGUpKQorI2RlZmluZSBHU1RUSU1FX1RPX1FUVElNRShxdGRlbXV4LCB2YWx1ZSkgKGdzdF91dGlsX3VpbnQ2NF9zY2FsZSgodmFsdWUpLCAocXRkZW11eCktPnRpbWVzY2FsZSwgR1NUX1NFQ09ORCkpCisKKy8qIHRpbWVzdGFtcCBpcyB0aGUgRFRTICovCisjZGVmaW5lIFFUU0FNUExFX0RUUyhzdHJlYW0sc2FtcGxlKSAoUVRTVFJFQU1USU1FX1RPX0dTVFRJTUUoKHN0cmVhbSksIChzYW1wbGUpLT50aW1lc3RhbXApKQorLyogdGltZXN0YW1wICsgb2Zmc2V0ICsgY3NsZ19zaGlmdCBpcyB0aGUgb3V0Z29pbmcgUFRTICovCisjZGVmaW5lIFFUU0FNUExFX1BUUyhzdHJlYW0sc2FtcGxlKSAoUVRTVFJFQU1USU1FX1RPX0dTVFRJTUUoKHN0cmVhbSksIChzYW1wbGUpLT50aW1lc3RhbXAgKyAoc3RyZWFtKS0+Y3NsZ19zaGlmdCArIChzYW1wbGUpLT5wdHNfb2Zmc2V0KSkKKy8qIHRpbWVzdGFtcCArIG9mZnNldCBpcyB0aGUgUFRTIHVzZWQgZm9yIGludGVybmFsIHNlZWsgY2FsY3VhdGlvbnMgKi8KKyNkZWZpbmUgUVRTQU1QTEVfUFRTX05PX0NTTEcoc3RyZWFtLHNhbXBsZSkgKFFUU1RSRUFNVElNRV9UT19HU1RUSU1FKChzdHJlYW0pLCAoc2FtcGxlKS0+dGltZXN0YW1wICsgKHNhbXBsZSktPnB0c19vZmZzZXQpKQorLyogdGltZXN0YW1wICsgZHVyYXRpb24gLSBkdHMgaXMgdGhlIGR1cmF0aW9uICovCisjZGVmaW5lIFFUU0FNUExFX0RVUl9EVFMoc3RyZWFtLCBzYW1wbGUsIGR0cykgKFFUU1RSRUFNVElNRV9UT19HU1RUSU1FICgoc3RyZWFtKSwgKHNhbXBsZSktPnRpbWVzdGFtcCArIChzYW1wbGUpLT5kdXJhdGlvbikgLSAoZHRzKSkKKworI2RlZmluZSBRVFNBTVBMRV9LRVlGUkFNRShzdHJlYW0sc2FtcGxlKSAoKHN0cmVhbSktPmFsbF9rZXlmcmFtZSB8fCAoc2FtcGxlKS0+a2V5ZnJhbWUpCisKKy8qCisgKiBRdWlja3RpbWUgaGFzIHRyYWNrcyBhbmQgc2VnbWVudHMuIEEgdHJhY2sgaXMgYSBjb250aW51b3VzIHBpZWNlIG9mCisgKiBtdWx0aW1lZGlhIGNvbnRlbnQuIFRoZSB0cmFjayBpcyBub3QgYWx3YXlzIHBsYXllZCBmcm9tIHN0YXJ0IHRvIGZpbmlzaCBidXQKKyAqIGluc3RlYWQsIHBpZWNlcyBvZiB0aGUgdHJhY2sgYXJlICdjdXQgb3V0JyBhbmQgcGxheWVkIGluIHNlcXVlbmNlLiBUaGlzIGlzCisgKiB3aGF0IHRoZSBzZWdtZW50cyBkby4KKyAqCisgKiBJbnNpZGUgdGhlIHRyYWNrIHdlIGhhdmUga2V5ZnJhbWVzIChLKSBhbmQgZGVsdGEgZnJhbWVzLiBUaGUgdHJhY2sgaGFzIGl0cworICogb3duIHRpbWluZywgd2hpY2ggc3RhcnRzIGZyb20gMCBhbmQgZXh0ZW5kcyB0byBlbmQuIFRoZSBwb3NpdGlvbiBpbiB0aGUgdHJhY2sKKyAqIGlzIGNhbGxlZCB0aGUgbWVkaWFfdGltZS4KKyAqCisgKiBUaGUgc2VnbWVudHMgbm93IGRlc2NyaWJlIHRoZSBwaWVjZXMgdGhhdCBzaG91bGQgYmUgcGxheWVkIGZyb20gdGhpcyB0cmFjaworICogYW5kIGFyZSBiYXNpY2FsbHkgdHVwbGVzIG9mIG1lZGlhX3RpbWUvZHVyYXRpb24vcmF0ZSBlbnRyaWVzLiBXZSBjYW4gaGF2ZQorICogbXVsdGlwbGUgc2VnbWVudHMgYW5kIHRoZXkgYXJlIGFsbCBwbGF5ZWQgYWZ0ZXIgb25lIGFub3RoZXIuIEFuIGV4YW1wbGU6CisgKgorICogc2VnbWVudCAxOiBtZWRpYV90aW1lOiAxIHNlY29uZCwgZHVyYXRpb246IDEgc2Vjb25kLCByYXRlIDEKKyAqIHNlZ21lbnQgMjogbWVkaWFfdGltZTogMyBzZWNvbmQsIGR1cmF0aW9uOiAyIHNlY29uZCwgcmF0ZSAyCisgKgorICogVG8gY29ycmVjdGx5IHBsYXkgYmFjayB0aGlzIHRyYWNrLCBvbmUgbXVzdCBwbGF5OiAxIHNlY29uZCBvZiBtZWRpYSBzdGFydGluZworICogZnJvbSBtZWRpYV90aW1lIDEgZm9sbG93ZWQgYnkgMiBzZWNvbmRzIG9mIG1lZGlhIHN0YXJ0aW5nIGZyb20gbWVkaWFfdGltZSAzCisgKiBhdCBhIHJhdGUgb2YgMi4KKyAqCisgKiBFYWNoIG9mIHRoZSBzZWdtZW50cyB3aWxsIGJlIHBsYXllZCBhdCBhIHNwZWNpZmljIHRpbWUsIHRoZSBmaXJzdCBzZWdtZW50IGF0CisgKiB0aW1lIDAsIHRoZSBzZWNvbmQgb25lIGFmdGVyIHRoZSBkdXJhdGlvbiBvZiB0aGUgZmlyc3Qgb25lLCBldGMuLiBOb3RlIHRoYXQKKyAqIHRoZSB0aW1lIGluIHJlc3VsdGluZyBwbGF5YmFjayBpcyBub3QgaWRlbnRpY2FsIHRvIHRoZSBtZWRpYV90aW1lIG9mIHRoZQorICogdHJhY2sgYW55bW9yZS4KKyAqCisgKiBWaXN1YWxseSwgYXNzdW1pbmcgdGhlIHRyYWNrIGhhcyA0IHNlY29uZCBvZiBtZWRpYV90aW1lOgorICoKKyAqICAgICAgICAgICAgICAgIChhKSAgICAgICAgICAgICAgICAgICAoYikgICAgICAgICAgKGMpICAgICAgICAgICAgICAoZCkKKyAqICAgICAgICAgLi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorICogdHJhY2s6ICB8IEsuLi4uLksuLi4uLi4uLi5LLi4uLi4uLi5LLi4uLi4uLksuLi4uLi4uSy4uLi4uLi4uLi4uSy4uLiB8CisgKiAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKKyAqICAgICAgICAgMCAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgMyAgICAgICAgICAgICAgNAorICogICAgICAgICAgIC4tLS0tLS0tLS0tLS1eICAgICAgICAgICAgICBeICAgLi0tLS0tLS0tLS1eICAgICAgICAgICAgICBeCisgKiAgICAgICAgICAvICAgICAgICAgICAgICAuLS0tLS0tLS0tLS0tLScgIC8gICAgICAgLi0tLS0tLS0tLS0tLS0tLS0tLScKKyAqICAgICAgICAgLyAgICAgICAgICAgICAgLyAgICAgICAgICAuLS0tLS0nICAgICAgIC8KKyAqICAgICAgICAgLi0tLS0tLS0tLS0tLS0tLiAgICAgICAgIC4tLS0tLS0tLS0tLS0tLS4KKyAqICAgICAgICAgfCBzZWdtZW50IDEgICAgfCAgICAgICAgIHwgc2VnbWVudCAyICAgIHwKKyAqICAgICAgICAgJy0tLS0tLS0tLS0tLS0tJyAgICAgICAgICctLS0tLS0tLS0tLS0tLScKKyAqCisgKiBUaGUgY2hhbGxlbmdlIGhlcmUgaXMgdG8gY3V0IG91dCB0aGUgcmlnaHQgcGllY2VzIG9mIHRoZSB0cmFjayBmb3IgZWFjaCBvZgorICogdGhlIHBsYXliYWNrIHNlZ21lbnRzLiBUaGlzIGZvcnR1bmF0ZWx5IGNhbiBlYXNpbHkgYmUgZG9uZSB3aXRoIHRoZSBTRUdNRU5UCisgKiBldmVudHMgb2YgR1N0cmVhbWVyLgorICoKKyAqIEZvciBwbGF5YmFjayBvZiBzZWdtZW50IDEsIHdlIG5lZWQgdG8gcHJvdmlkZSB0aGUgZGVjb2RlciB3aXRoIHRoZSBrZXlmcmFtZQorICogKGEpLCBpbiB0aGUgYWJvdmUgZmlndXJlLCBidXQgd2UgbXVzdCBpbnN0cnVjdCBpdCBvbmx5IHRvIG91dHB1dCB0aGUgZGVjb2RlZAorICogZGF0YSBiZXR3ZWVuIHNlY29uZCAxIGFuZCAyLiBXZSBkbyB0aGlzIHdpdGggYSBTRUdNRU5UIGV2ZW50IGZvciAxIHRvIDIsIHRpbWUKKyAqIHBvc2l0aW9uIHNldCB0byB0aGUgdGltZSBvZiB0aGUgc2VnbWVudDogMC4KKyAqCisgKiBXZSB0aGVuIHByb2NlZWQgdG8gcHVzaCBkYXRhIGZyb20ga2V5ZnJhbWUgKGEpIHRvIGZyYW1lIChiKS4gVGhlIGRlY29kZXIKKyAqIGRlY29kZXMgYnV0IGNsaXBzIGFsbCBiZWZvcmUgbWVkaWFfdGltZSAxLgorICoKKyAqIEFmdGVyIGZpbmlzaGluZyBhIHNlZ21lbnQsIHdlIHB1c2ggb3V0IGEgbmV3IFNFR01FTlQgZXZlbnQgd2l0aCB0aGUgY2xpcHBpbmcKKyAqIGJvdW5kYXJpZXMgb2YgdGhlIG5ldyBkYXRhLgorICoKKyAqIFRoaXMgaXMgYSBnb29kIHVzZWNhc2UgZm9yIHRoZSBHU3RyZWFtZXIgYWNjdW11bGF0ZWQgU0VHTUVOVCBldmVudHMuCisgKi8KKworc3RydWN0IF9RdERlbXV4U2VnbWVudAoreworICAvKiBnbG9iYWwgdGltZSBhbmQgZHVyYXRpb24sIGFsbCBnc3QgdGltZSAqLworICBHc3RDbG9ja1RpbWUgdGltZTsKKyAgR3N0Q2xvY2tUaW1lIHN0b3BfdGltZTsKKyAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uOworICAvKiBtZWRpYSB0aW1lIG9mIHRyYWssIGFsbCBnc3QgdGltZSAqLworICBHc3RDbG9ja1RpbWUgbWVkaWFfc3RhcnQ7CisgIEdzdENsb2NrVGltZSBtZWRpYV9zdG9wOworICBnZG91YmxlIHJhdGU7CisgIC8qIE1lZGlhIHN0YXJ0IHRpbWUgaW4gdHJhayB0aW1lc2NhbGUgdW5pdHMgKi8KKyAgZ3VpbnQzMiB0cmFrX21lZGlhX3N0YXJ0OworfTsKKworI2RlZmluZSBRVFNFR01FTlRfSVNfRU1QVFkocykgKChzKS0+bWVkaWFfc3RhcnQgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKworLyogVXNlZCB3aXRoIGZyYWdtZW50ZWQgTVA0IGZpbGVzIChtZnJhIGF0b20pICovCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RDbG9ja1RpbWUgdHM7CisgIGd1aW50NjQgbW9vZl9vZmZzZXQ7Cit9IFF0RGVtdXhSYW5kb21BY2Nlc3NFbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3QgX1F0RGVtdXhTdHJlYW1TdHNkRW50cnkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ3VpbnQzMiBmb3VyY2M7CisgIGdib29sZWFuIHNwYXJzZTsKKworICAvKiB2aWRlbyBpbmZvICovCisgIGdpbnQgd2lkdGg7CisgIGdpbnQgaGVpZ2h0OworICBnaW50IHBhcl93OworICBnaW50IHBhcl9oOworICAvKiBOdW1lcmF0b3IvZGVub21pbmF0b3IgZnJhbWVyYXRlICovCisgIGdpbnQgZnBzX247CisgIGdpbnQgZnBzX2Q7CisgIEdzdFZpZGVvQ29sb3JpbWV0cnkgY29sb3JpbWV0cnk7CisgIGd1aW50MTYgYml0c19wZXJfc2FtcGxlOworICBndWludDE2IGNvbG9yX3RhYmxlX2lkOworICBHc3RNZW1vcnkgKnJnYjhfcGFsZXR0ZTsKKyAgZ3VpbnQgaW50ZXJsYWNlX21vZGU7CisgIGd1aW50IGZpZWxkX29yZGVyOworCisgIC8qIGF1ZGlvIGluZm8gKi8KKyAgZ2RvdWJsZSByYXRlOworICBnaW50IG5fY2hhbm5lbHM7CisgIGd1aW50IHNhbXBsZXNfcGVyX3BhY2tldDsKKyAgZ3VpbnQgc2FtcGxlc19wZXJfZnJhbWU7CisgIGd1aW50IGJ5dGVzX3Blcl9wYWNrZXQ7CisgIGd1aW50IGJ5dGVzX3Blcl9zYW1wbGU7CisgIGd1aW50IGJ5dGVzX3Blcl9mcmFtZTsKKyAgZ3VpbnQgY29tcHJlc3Npb247CisKKyAgLyogaWYgd2UgdXNlIGNodW5rcyBvciBzYW1wbGVzICovCisgIGdib29sZWFuIHNhbXBsZWQ7CisgIGd1aW50IHBhZGRpbmc7CisKK30gUXREZW11eFN0cmVhbVN0c2RFbnRyeTsKKworI2RlZmluZSBDVVJfU1RSRUFNKHMpICgmKChzKS0+c3RzZF9lbnRyaWVzWyhzKS0+Y3VyX3N0c2RfZW50cnlfaW5kZXhdKSkKKworc3RydWN0IF9RdERlbXV4U3RyZWFtCit7CisgIEdzdFBhZCAqcGFkOworCisgIFF0RGVtdXhTdHJlYW1TdHNkRW50cnkgKnN0c2RfZW50cmllczsKKyAgZ3VpbnQgc3RzZF9lbnRyaWVzX2xlbmd0aDsKKyAgZ3VpbnQgY3VyX3N0c2RfZW50cnlfaW5kZXg7CisKKyAgLyogc3RyZWFtIHR5cGUgKi8KKyAgZ3VpbnQzMiBzdWJ0eXBlOworCisgIGdib29sZWFuIG5ld19jYXBzOyAgICAgICAgICAgIC8qIElmIFRSVUUsIGNhcHMgbmVlZCB0byBiZSBnZW5lcmF0ZWQgKGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNhbGxpbmcgX2NvbmZpZ3VyZV9zdHJlYW0oKSkgVGhpcyBoYXBwZW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZvciBNU1MgYW5kIGZyYWdtZW50ZWQgc3RyZWFtcyAqLworCisgIGdib29sZWFuIG5ld19zdHJlYW07ICAgICAgICAgIC8qIHNpZ25hbHMgdGhhdCBhIHN0cmVhbV9zdGFydCBpcyByZXF1aXJlZCAqLworICBnYm9vbGVhbiBvbl9rZXlmcmFtZTsgICAgICAgICAvKiBpZiB0aGlzIHN0cmVhbSBsYXN0IHB1c2hlZCBidWZmZXIgd2FzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoga2V5ZnJhbWUuIFRoaXMgaXMgaW1wb3J0YW50IHRvIGlkZW50aWZ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdoZXJlIHRvIHN0b3AgcHVzaGluZyBidWZmZXJzIGFmdGVyIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2VnbWVudCBzdG9wIHRpbWUgKi8KKworICAvKiBpZiB0aGUgc3RyZWFtIGhhcyBhIHJlZGlyZWN0IFVSSSBpbiBpdHMgaGVhZGVycywgd2Ugc3RvcmUgaXQgaGVyZSAqLworICBnY2hhciAqcmVkaXJlY3RfdXJpOworCisgIC8qIHRyYWNrIGlkICovCisgIGd1aW50IHRyYWNrX2lkOworCisgIC8qIGR1cmF0aW9uL3NjYWxlICovCisgIGd1aW50NjQgZHVyYXRpb247ICAgICAgICAgICAgIC8qIGluIHRpbWVzY2FsZSB1bml0cyAqLworICBndWludDMyIHRpbWVzY2FsZTsKKworICAvKiBsYW5ndWFnZSAqLworICBnY2hhciBsYW5nX2lkWzRdOyAgICAgICAgICAgICAvKiBJU08gNjM5LTJUIGxhbmd1YWdlIGNvZGUgKi8KKworICAvKiBvdXIgc2FtcGxlcyAqLworICBndWludDMyIG5fc2FtcGxlczsKKyAgUXREZW11eFNhbXBsZSAqc2FtcGxlczsKKyAgZ2Jvb2xlYW4gYWxsX2tleWZyYW1lOyAgICAgICAgLyogVFJVRSB3aGVuIGFsbCBzYW1wbGVzIGFyZSBrZXlmcmFtZXMgKG5vIHN0c3MpICovCisgIGd1aW50MzIgZmlyc3RfZHVyYXRpb247ICAgICAgIC8qIGR1cmF0aW9uIGluIHRpbWVzY2FsZSBvZiBmaXJzdCBzYW1wbGUsIHVzZWQgZm9yIGZpZ3VyaW5nIG91dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnJhbWVyYXRlICovCisgIGd1aW50MzIgbl9zYW1wbGVzX21vb2Y7ICAgICAgIC8qIHNhbXBsZSBjb3VudCBpbiBhIG1vb2YgKi8KKyAgZ3VpbnQ2NCBkdXJhdGlvbl9tb29mOyAgICAgICAgLyogZHVyYXRpb24gaW4gdGltZXNjYWxlIG9mIGEgbW9vZiwgdXNlZCBmb3IgZmlndXJlIG91dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZnJhbWVyYXRlIG9mIGZyYWdtZW50ZWQgZm9ybWF0IHN0cmVhbSAqLworICBndWludDY0IGR1cmF0aW9uX2xhc3RfbW9vZjsKKworICBndWludDMyIG9mZnNldF9pbl9zYW1wbGU7ICAgICAvKiBPZmZzZXQgaW4gdGhlIGN1cnJlbnQgc2FtcGxlLCB1c2VkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdHJlYW1zIHdoaWNoIGhhdmUgZ290IGV4Y2VlZGluZ2x5IGJpZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzYW1wbGUgc2l6ZSAoc3VjaCBhcyAyNHMgb2YgcmF3IGF1ZGlvKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogT25seSB1c2VkIHdoZW4gbWF4X2J1ZmZlcl9zaXplIGlzIG5vbi1OVUxMICovCisgIGd1aW50MzIgbWF4X2J1ZmZlcl9zaXplOyAgICAgIC8qIE1heGltdW0gYWxsb3dlZCBzaXplIGZvciBvdXRwdXQgYnVmZmVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQ3VycmVudGx5IG9ubHkgc2V0IGZvciByYXcgYXVkaW8gc3RyZWFtcyovCisKKyAgLyogdmlkZW8gaW5mbyAqLworICAvKiBhc3BlY3QgcmF0aW8gKi8KKyAgZ2ludCBkaXNwbGF5X3dpZHRoOworICBnaW50IGRpc3BsYXlfaGVpZ2h0OworCisgIC8qIGFsbG9jYXRpb24gKi8KKyAgZ2Jvb2xlYW4gdXNlX2FsbG9jYXRvcjsKKyAgR3N0QWxsb2NhdG9yICphbGxvY2F0b3I7CisgIEdzdEFsbG9jYXRpb25QYXJhbXMgcGFyYW1zOworCisgIGdzaXplIGFsaWdubWVudDsKKworICAvKiB3aGVuIGEgZGlzY29udGludWl0eSBpcyBwZW5kaW5nICovCisgIGdib29sZWFuIGRpc2NvbnQ7CisKKyAgLyogbGlzdCBvZiBidWZmZXJzIHRvIHB1c2ggZmlyc3QgKi8KKyAgR1NMaXN0ICpidWZmZXJzOworCisgIC8qIGlmIHdlIG5lZWQgdG8gY2xpcCB0aGlzIGJ1ZmZlci4gVGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgdW5jb21wcmVzc2VkCisgICAqIGRhdGEgKi8KKyAgZ2Jvb2xlYW4gbmVlZF9jbGlwOworCisgIC8qIGJ1ZmZlciBuZWVkcyBzb21lIGN1c3RvbSBwcm9jZXNzaW5nLCBlLmcuIHN1YnRpdGxlcyAqLworICBnYm9vbGVhbiBuZWVkX3Byb2Nlc3M7CisKKyAgLyogY3VycmVudCBwb3NpdGlvbiAqLworICBndWludDMyIHNlZ21lbnRfaW5kZXg7CisgIGd1aW50MzIgc2FtcGxlX2luZGV4OworICBHc3RDbG9ja1RpbWUgdGltZV9wb3NpdGlvbjsgICAvKiBpbiBnc3QgdGltZSAqLworICBndWludDY0IGFjY3VtdWxhdGVkX2Jhc2U7CisKKyAgLyogdGhlIEdzdCBzZWdtZW50IHdlIGFyZSBwcm9jZXNzaW5nIG91dCwgdXNlZCBmb3IgY2xpcHBpbmcgKi8KKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIC8qIHF1aWNrdGltZSBzZWdtZW50cyAqLworICBndWludDMyIG5fc2VnbWVudHM7CisgIFF0RGVtdXhTZWdtZW50ICpzZWdtZW50czsKKyAgZ2Jvb2xlYW4gZHVtbXlfc2VnbWVudDsKKyAgZ3VpbnQzMiBmcm9tX3NhbXBsZTsKKyAgZ3VpbnQzMiB0b19zYW1wbGU7CisKKyAgZ2Jvb2xlYW4gc2VudF9lb3M7CisgIEdzdFRhZ0xpc3QgKnN0cmVhbV90YWdzOworICBnYm9vbGVhbiBzZW5kX2dsb2JhbF90YWdzOworCisgIEdzdEV2ZW50ICpwZW5kaW5nX2V2ZW50OworCisgIEdzdEJ5dGVSZWFkZXIgc3RjbzsKKyAgR3N0Qnl0ZVJlYWRlciBzdHN6OworICBHc3RCeXRlUmVhZGVyIHN0c2M7CisgIEdzdEJ5dGVSZWFkZXIgc3R0czsKKyAgR3N0Qnl0ZVJlYWRlciBzdHNzOworICBHc3RCeXRlUmVhZGVyIHN0cHM7CisgIEdzdEJ5dGVSZWFkZXIgY3R0czsKKworICBnYm9vbGVhbiBjaHVua3NfYXJlX3NhbXBsZXM7ICAvKiBUUlVFIG1lYW5zIHRyZWF0IGNodW5rcyBhcyBzYW1wbGVzICovCisgIGdpbnQ2NCBzdGJsX2luZGV4OworICAvKiBzdGNvICovCisgIGd1aW50IGNvX3NpemU7CisgIEdzdEJ5dGVSZWFkZXIgY29fY2h1bms7CisgIGd1aW50MzIgZmlyc3RfY2h1bms7CisgIGd1aW50MzIgY3VycmVudF9jaHVuazsKKyAgZ3VpbnQzMiBsYXN0X2NodW5rOworICBndWludDMyIHNhbXBsZXNfcGVyX2NodW5rOworICBndWludDMyIHN0c2Rfc2FtcGxlX2Rlc2NyaXB0aW9uX2lkOworICBndWludDMyIHN0Y29fc2FtcGxlX2luZGV4OworICAvKiBzdHN6ICovCisgIGd1aW50MzIgc2FtcGxlX3NpemU7ICAgICAgICAgIC8qIDAgbWVhbnMgdmFyaWFibGUgc2l6ZXMgYXJlIHN0b3JlZCBpbiBzdHN6ICovCisgIC8qIHN0c2MgKi8KKyAgZ3VpbnQzMiBzdHNjX2luZGV4OworICBndWludDMyIG5fc2FtcGxlc19wZXJfY2h1bms7CisgIGd1aW50MzIgc3RzY19jaHVua19pbmRleDsKKyAgZ3VpbnQzMiBzdHNjX3NhbXBsZV9pbmRleDsKKyAgZ3VpbnQ2NCBjaHVua19vZmZzZXQ7CisgIC8qIHN0dHMgKi8KKyAgZ3VpbnQzMiBzdHRzX2luZGV4OworICBndWludDMyIHN0dHNfc2FtcGxlczsKKyAgZ3VpbnQzMiBuX3NhbXBsZV90aW1lczsKKyAgZ3VpbnQzMiBzdHRzX3NhbXBsZV9pbmRleDsKKyAgZ3VpbnQ2NCBzdHRzX3RpbWU7CisgIGd1aW50MzIgc3R0c19kdXJhdGlvbjsKKyAgLyogc3RzcyAqLworICBnYm9vbGVhbiBzdHNzX3ByZXNlbnQ7CisgIGd1aW50MzIgbl9zYW1wbGVfc3luY3M7CisgIGd1aW50MzIgc3Rzc19pbmRleDsKKyAgLyogc3RwcyAqLworICBnYm9vbGVhbiBzdHBzX3ByZXNlbnQ7CisgIGd1aW50MzIgbl9zYW1wbGVfcGFydGlhbF9zeW5jczsKKyAgZ3VpbnQzMiBzdHBzX2luZGV4OworICBRdERlbXV4UmFuZG9tQWNjZXNzRW50cnkgKnJhX2VudHJpZXM7CisgIGd1aW50IG5fcmFfZW50cmllczsKKworICBjb25zdCBRdERlbXV4UmFuZG9tQWNjZXNzRW50cnkgKnBlbmRpbmdfc2VlazsKKworICAvKiBjdHRzICovCisgIGdib29sZWFuIGN0dHNfcHJlc2VudDsKKyAgZ3VpbnQzMiBuX2NvbXBvc2l0aW9uX3RpbWVzOworICBndWludDMyIGN0dHNfaW5kZXg7CisgIGd1aW50MzIgY3R0c19zYW1wbGVfaW5kZXg7CisgIGd1aW50MzIgY3R0c19jb3VudDsKKyAgZ2ludDMyIGN0dHNfc29mZnNldDsKKworICAvKiBjc2xnICovCisgIGd1aW50MzIgY3NsZ19zaGlmdDsKKworICAvKiBmcmFnbWVudGVkICovCisgIGdib29sZWFuIHBhcnNlZF90cmV4OworICBndWludDMyIGRlZl9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXg7IC8qIGluZGV4IGlzIDEtYmFzZWQgKi8KKyAgZ3VpbnQzMiBkZWZfc2FtcGxlX2R1cmF0aW9uOworICBndWludDMyIGRlZl9zYW1wbGVfc2l6ZTsKKyAgZ3VpbnQzMiBkZWZfc2FtcGxlX2ZsYWdzOworCisgIGdib29sZWFuIGRpc2FibGVkOworCisgIC8qIHN0ZXJlb3Njb3BpYyB2aWRlbyBzdHJlYW1zICovCisgIEdzdFZpZGVvTXVsdGl2aWV3TW9kZSBtdWx0aXZpZXdfbW9kZTsKKyAgR3N0VmlkZW9NdWx0aXZpZXdGbGFncyBtdWx0aXZpZXdfZmxhZ3M7CisKKyAgLyogcHJvdGVjdGVkIHN0cmVhbXMgKi8KKyAgZ2Jvb2xlYW4gcHJvdGVjdGVkOworICBndWludDMyIHByb3RlY3Rpb25fc2NoZW1lX3R5cGU7CisgIGd1aW50MzIgcHJvdGVjdGlvbl9zY2hlbWVfdmVyc2lvbjsKKyAgZ3BvaW50ZXIgcHJvdGVjdGlvbl9zY2hlbWVfaW5mbzsgICAgICAvKiBzcGVjaWZpYyB0byB0aGUgcHJvdGVjdGlvbiBzY2hlbWUgKi8KKyAgR1F1ZXVlIHByb3RlY3Rpb25fc2NoZW1lX2V2ZW50X3F1ZXVlOworfTsKKworLyogQ29udGFpbnMgcHJvcGVydGllcyBhbmQgY3J5cHRvZ3JhcGhpYyBpbmZvIGZvciBhIHNldCBvZiBzYW1wbGVzIGZyb20gYQorICogdHJhY2sgcHJvdGVjdGVkIHVzaW5nIENvbW1vbiBFbmNyeXB0aW9uIChjZW5jKSAqLworc3RydWN0IF9RdERlbXV4Q2VuY1NhbXBsZVNldEluZm8KK3sKKyAgR3N0U3RydWN0dXJlICpkZWZhdWx0X3Byb3BlcnRpZXM7CisKKyAgLyogQGNyeXB0b19pbmZvIGhvbGRzIG9uZSBHc3RTdHJ1Y3R1cmUgcGVyIHNhbXBsZSAqLworICBHUHRyQXJyYXkgKmNyeXB0b19pbmZvOworfTsKKworc3RhdGljIGNvbnN0IGdjaGFyICoKK3F0X2RlbXV4X3N0YXRlX3N0cmluZyAoZW51bSBRdERlbXV4U3RhdGUgc3RhdGUpCit7CisgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICBjYXNlIFFUREVNVVhfU1RBVEVfSU5JVElBTDoKKyAgICAgIHJldHVybiAiPElOSVRJQUw+IjsKKyAgICBjYXNlIFFUREVNVVhfU1RBVEVfSEVBREVSOgorICAgICAgcmV0dXJuICI8SEVBREVSPiI7CisgICAgY2FzZSBRVERFTVVYX1NUQVRFX01PVklFOgorICAgICAgcmV0dXJuICI8TU9WSUU+IjsKKyAgICBjYXNlIFFUREVNVVhfU1RBVEVfQlVGRkVSX01EQVQ6CisgICAgICByZXR1cm4gIjxCVUZGRVJfTURBVD4iOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gIjxVTktOT1dOPiI7CisgIH0KK30KKworc3RhdGljIEdOb2RlICpxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKEdOb2RlICogbm9kZSwgZ3VpbnQzMiBmb3VyY2MpOworc3RhdGljIEdOb2RlICpxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGVfZnVsbCAoR05vZGUgKiBub2RlLAorICAgIGd1aW50MzIgZm91cmNjLCBHc3RCeXRlUmVhZGVyICogcGFyc2VyKTsKK3N0YXRpYyBHTm9kZSAqcXRkZW11eF90cmVlX2dldF9zaWJsaW5nX2J5X3R5cGUgKEdOb2RlICogbm9kZSwgZ3VpbnQzMiBmb3VyY2MpOworc3RhdGljIEdOb2RlICpxdGRlbXV4X3RyZWVfZ2V0X3NpYmxpbmdfYnlfdHlwZV9mdWxsIChHTm9kZSAqIG5vZGUsCisgICAgZ3VpbnQzMiBmb3VyY2MsIEdzdEJ5dGVSZWFkZXIgKiBwYXJzZXIpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBxdGRlbXV4X2FkZF9mcmFnbWVudGVkX3NhbXBsZXMgKEdzdFFURGVtdXggKiBxdGRlbXV4KTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9xdGRlbXV4X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3F1aWNrdGltZTsgdmlkZW8vbWoyOyBhdWRpby94LW00YTsgIgorICAgICAgICAiYXBwbGljYXRpb24veC0zZ3AiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcXRkZW11eF92aWRlb3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInZpZGVvXyV1IiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9xdGRlbXV4X2F1ZGlvc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgiYXVkaW9fJXUiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfU09NRVRJTUVTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3F0ZGVtdXhfc3Vic3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3VidGl0bGVfJXUiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfU09NRVRJTUVTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCisjZGVmaW5lIGdzdF9xdGRlbXV4X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFFURGVtdXgsIGdzdF9xdGRlbXV4LCBHU1RfVFlQRV9FTEVNRU5UKTsKKworc3RhdGljIHZvaWQgZ3N0X3F0ZGVtdXhfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBndWludDMyCitnc3RfcXRkZW11eF9maW5kX2luZGV4X2xpbmVhciAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHIsCisgICAgR3N0Q2xvY2tUaW1lIG1lZGlhX3RpbWUpOworc3RhdGljIGd1aW50MzIKK2dzdF9xdGRlbXV4X2ZpbmRfaW5kZXhfZm9yX2dpdmVuX21lZGlhX29mZnNldF9saW5lYXIgKEdzdFFURGVtdXggKiBxdGRlbXV4LAorICAgIFF0RGVtdXhTdHJlYW0gKiBzdHIsIGdpbnQ2NCBtZWRpYV9vZmZzZXQpOworCisjaWYgMAorc3RhdGljIHZvaWQgZ3N0X3F0ZGVtdXhfc2V0X2luZGV4IChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0SW5kZXggKiBpbmRleCk7CitzdGF0aWMgR3N0SW5kZXggKmdzdF9xdGRlbXV4X2dldF9pbmRleCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpOworI2VuZGlmCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3F0ZGVtdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyBnYm9vbGVhbiBxdGRlbXV4X3NpbmtfYWN0aXZhdGUgKEdzdFBhZCAqIHNpbmtwYWQsIEdzdE9iamVjdCAqIHBhcmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gcXRkZW11eF9zaW5rX2FjdGl2YXRlX21vZGUgKEdzdFBhZCAqIHNpbmtwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RQYWRNb2RlIG1vZGUsIGdib29sZWFuIGFjdGl2ZSk7CisKK3N0YXRpYyB2b2lkIGdzdF9xdGRlbXV4X2xvb3AgKEdzdFBhZCAqIHBhZCk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcXRkZW11eF9jaGFpbiAoR3N0UGFkICogc2lua3BhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGluYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcXRkZW11eF9oYW5kbGVfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3F0ZGVtdXhfc2V0Y2FwcyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcXRkZW11eF9jb25maWd1cmVfc3RyZWFtIChHc3RRVERlbXV4ICogcXRkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtKTsKK3N0YXRpYyB2b2lkIGdzdF9xdGRlbXV4X3N0cmVhbV9jaGVja19hbmRfY2hhbmdlX3N0c2RfaW5kZXggKEdzdFFURGVtdXggKiBkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9xdGRlbXV4X3Byb2Nlc3NfYWRhcHRlciAoR3N0UVREZW11eCAqIGRlbXV4LAorICAgIGdib29sZWFuIGZvcmNlKTsKKworc3RhdGljIGdib29sZWFuIHF0ZGVtdXhfcGFyc2VfbW9vdiAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgY29uc3QgZ3VpbnQ4ICogYnVmZmVyLCBndWludCBsZW5ndGgpOworc3RhdGljIGdib29sZWFuIHF0ZGVtdXhfcGFyc2Vfbm9kZSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdOb2RlICogbm9kZSwKKyAgICBjb25zdCBndWludDggKiBidWZmZXIsIGd1aW50IGxlbmd0aCk7CitzdGF0aWMgZ2Jvb2xlYW4gcXRkZW11eF9wYXJzZV90cmVlIChHc3RRVERlbXV4ICogcXRkZW11eCk7CitzdGF0aWMgdm9pZCBxdGRlbXV4X3BhcnNlX3VkdGEgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RUYWdMaXN0ICogdGFnbGlzdCwKKyAgICBHTm9kZSAqIHVkdGEpOworCitzdGF0aWMgdm9pZCBnc3RfcXRkZW11eF9oYW5kbGVfZXNkcyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwgUXREZW11eFN0cmVhbVN0c2RFbnRyeSAqIGVudHJ5LCBHTm9kZSAqIGVzZHMsCisgICAgR3N0VGFnTGlzdCAqIGxpc3QpOworc3RhdGljIEdzdENhcHMgKnF0ZGVtdXhfdmlkZW9fY2FwcyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwgUXREZW11eFN0cmVhbVN0c2RFbnRyeSAqIGVudHJ5LCBndWludDMyIGZvdXJjYywKKyAgICBjb25zdCBndWludDggKiBzdHNkX2VudHJ5X2RhdGEsIGdjaGFyICoqIGNvZGVjX25hbWUpOworc3RhdGljIEdzdENhcHMgKnF0ZGVtdXhfYXVkaW9fY2FwcyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwgUXREZW11eFN0cmVhbVN0c2RFbnRyeSAqIGVudHJ5LCBndWludDMyIGZvdXJjYywKKyAgICBjb25zdCBndWludDggKiBkYXRhLCBpbnQgbGVuLCBnY2hhciAqKiBjb2RlY19uYW1lKTsKK3N0YXRpYyBHc3RDYXBzICpxdGRlbXV4X3N1Yl9jYXBzIChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwKKyAgICBRdERlbXV4U3RyZWFtU3RzZEVudHJ5ICogZW50cnksIGd1aW50MzIgZm91cmNjLCBjb25zdCBndWludDggKiBkYXRhLAorICAgIGdjaGFyICoqIGNvZGVjX25hbWUpOworc3RhdGljIEdzdENhcHMgKnF0ZGVtdXhfZ2VuZXJpY19jYXBzIChHc3RRVERlbXV4ICogcXRkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtLCBRdERlbXV4U3RyZWFtU3RzZEVudHJ5ICogZW50cnksIGd1aW50MzIgZm91cmNjLAorICAgIGNvbnN0IGd1aW50OCAqIHN0c2RfZW50cnlfZGF0YSwgZ2NoYXIgKiogY29kZWNfbmFtZSk7CisKK3N0YXRpYyBnYm9vbGVhbiBxdGRlbXV4X3BhcnNlX3NhbXBsZXMgKEdzdFFURGVtdXggKiBxdGRlbXV4LAorICAgIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0sIGd1aW50MzIgbik7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBxdGRlbXV4X2V4cG9zZV9zdHJlYW1zIChHc3RRVERlbXV4ICogcXRkZW11eCk7CitzdGF0aWMgdm9pZCBnc3RfcXRkZW11eF9zdHJlYW1fZnJlZSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSk7CitzdGF0aWMgdm9pZCBnc3RfcXRkZW11eF9zdHJlYW1fY2xlYXIgKEdzdFFURGVtdXggKiBxdGRlbXV4LAorICAgIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0pOworc3RhdGljIHZvaWQgZ3N0X3F0ZGVtdXhfcmVtb3ZlX3N0cmVhbSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIGludCBpbmRleCk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBxdGRlbXV4X3ByZXBhcmVfc3RyZWFtcyAoR3N0UVREZW11eCAqIHF0ZGVtdXgpOworc3RhdGljIHZvaWQgcXRkZW11eF9kb19hbGxvY2F0aW9uIChHc3RRVERlbXV4ICogcXRkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcXRkZW11eF9hY3RpdmF0ZV9zZWdtZW50IChHc3RRVERlbXV4ICogcXRkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtLCBndWludDMyIHNlZ19pZHgsIEdzdENsb2NrVGltZSBvZmZzZXQpOworc3RhdGljIGdib29sZWFuIGdzdF9xdGRlbXV4X3N0cmVhbV91cGRhdGVfc2VnbWVudCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwgZ2ludCBzZWdfaWR4LCBHc3RDbG9ja1RpbWUgb2Zmc2V0LAorICAgIEdzdENsb2NrVGltZSAqIF9zdGFydCwgR3N0Q2xvY2tUaW1lICogX3N0b3ApOworc3RhdGljIHZvaWQgZ3N0X3F0ZGVtdXhfc2VuZF9nYXBfZm9yX3NlZ21lbnQgKEdzdFFURGVtdXggKiBkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtLCBnaW50IHNlZ21lbnRfaW5kZXgsIEdzdENsb2NrVGltZSBwb3MpOworCitzdGF0aWMgZ2Jvb2xlYW4gcXRkZW11eF9wdWxsX21mcm9fbWZyYSAoR3N0UVREZW11eCAqIHF0ZGVtdXgpOworc3RhdGljIHZvaWQgY2hlY2tfdXBkYXRlX2R1cmF0aW9uIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uKTsKKworc3RhdGljIGdjaGFyICpxdGRlbXV4X3V1aWRfYnl0ZXNfdG9fc3RyaW5nIChnY29uc3Rwb2ludGVyIHV1aWRfYnl0ZXMpOworCitzdGF0aWMgR3N0U3RydWN0dXJlICpxdGRlbXV4X2dldF9jZW5jX3NhbXBsZV9wcm9wZXJ0aWVzIChHc3RRVERlbXV4ICogcXRkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtLCBndWludCBzYW1wbGVfaW5kZXgpOworc3RhdGljIHZvaWQgZ3N0X3F0ZGVtdXhfYXBwZW5kX3Byb3RlY3Rpb25fc3lzdGVtX2lkIChHc3RRVERlbXV4ICogcXRkZW11eCwKKyAgICBjb25zdCBnY2hhciAqIGlkKTsKK3N0YXRpYyB2b2lkIHF0ZGVtdXhfZ3N0X3N0cnVjdHVyZV9mcmVlIChHc3RTdHJ1Y3R1cmUgKiBnc3RzdHJ1Y3R1cmUpOworCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfY2xhc3NfaW5pdCAoR3N0UVREZW11eENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBwYXJlbnRfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X3F0ZGVtdXhfZGlzcG9zZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3F0ZGVtdXhfY2hhbmdlX3N0YXRlKTsKKyNpZiAwCisgIGdzdGVsZW1lbnRfY2xhc3MtPnNldF9pbmRleCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcXRkZW11eF9zZXRfaW5kZXgpOworICBnc3RlbGVtZW50X2NsYXNzLT5nZXRfaW5kZXggPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3F0ZGVtdXhfZ2V0X2luZGV4KTsKKyNlbmRpZgorCisgIGdzdF90YWdfcmVnaXN0ZXJfbXVzaWNicmFpbnpfdGFncyAoKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcXRkZW11eF9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3F0ZGVtdXhfdmlkZW9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcXRkZW11eF9hdWRpb3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9xdGRlbXV4X3N1YnNyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJRdWlja1RpbWUgZGVtdXhlciIsCisgICAgICAiQ29kZWMvRGVtdXhlciIsCisgICAgICAiRGVtdWx0aXBsZXggYSBRdWlja1RpbWUgZmlsZSBpbnRvIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW1zIiwKKyAgICAgICJEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4sIFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHF0ZGVtdXhfZGVidWcsICJxdGRlbXV4IiwgMCwgInF0ZGVtdXggcGx1Z2luIik7CisKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X2luaXQgKEdzdFFURGVtdXggKiBxdGRlbXV4KQoreworICBxdGRlbXV4LT5zaW5rcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmZ3N0X3F0ZGVtdXhfc2lua190ZW1wbGF0ZSwgInNpbmsiKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZhdGVfZnVuY3Rpb24gKHF0ZGVtdXgtPnNpbmtwYWQsIHF0ZGVtdXhfc2lua19hY3RpdmF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2YXRlbW9kZV9mdW5jdGlvbiAocXRkZW11eC0+c2lua3BhZCwKKyAgICAgIHF0ZGVtdXhfc2lua19hY3RpdmF0ZV9tb2RlKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHF0ZGVtdXgtPnNpbmtwYWQsIGdzdF9xdGRlbXV4X2NoYWluKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHF0ZGVtdXgtPnNpbmtwYWQsIGdzdF9xdGRlbXV4X2hhbmRsZV9zaW5rX2V2ZW50KTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocXRkZW11eCksIHF0ZGVtdXgtPnNpbmtwYWQpOworCisgIHF0ZGVtdXgtPnN0YXRlID0gUVRERU1VWF9TVEFURV9JTklUSUFMOworICBxdGRlbXV4LT5wdWxsYmFzZWQgPSBGQUxTRTsKKyAgcXRkZW11eC0+cG9zdGVkX3JlZGlyZWN0ID0gRkFMU0U7CisgIHF0ZGVtdXgtPm5lZWRlZGJ5dGVzID0gMTY7CisgIHF0ZGVtdXgtPnRvZHJvcCA9IDA7CisgIHF0ZGVtdXgtPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgIHF0ZGVtdXgtPm9mZnNldCA9IDA7CisgIHF0ZGVtdXgtPmZpcnN0X21kYXQgPSAtMTsKKyAgcXRkZW11eC0+Z290X21vb3YgPSBGQUxTRTsKKyAgcXRkZW11eC0+bWRhdG9mZnNldCA9IC0xOworICBxdGRlbXV4LT5tZGF0YnVmZmVyID0gTlVMTDsKKyAgcXRkZW11eC0+cmVzdG9yZWRhdGFfYnVmZmVyID0gTlVMTDsKKyAgcXRkZW11eC0+cmVzdG9yZWRhdGFfb2Zmc2V0ID0gLTE7CisgIHF0ZGVtdXgtPmZyYWdtZW50X3N0YXJ0ID0gLTE7CisgIHF0ZGVtdXgtPmZyYWdtZW50X3N0YXJ0X29mZnNldCA9IC0xOworICBxdGRlbXV4LT5tZWRpYV9jYXBzID0gTlVMTDsKKyAgcXRkZW11eC0+ZXhwb3NlZCA9IEZBTFNFOworICBxdGRlbXV4LT5tc3NfbW9kZSA9IEZBTFNFOworICBxdGRlbXV4LT5wZW5kaW5nX25ld3NlZ21lbnQgPSBOVUxMOworICBxdGRlbXV4LT51cHN0cmVhbV9mb3JtYXRfaXNfdGltZSA9IEZBTFNFOworICBxdGRlbXV4LT5oYXZlX2dyb3VwX2lkID0gRkFMU0U7CisgIHF0ZGVtdXgtPmdyb3VwX2lkID0gR19NQVhVSU5UOworICBxdGRlbXV4LT5jZW5jX2F1eF9pbmZvX29mZnNldCA9IDA7CisgIHF0ZGVtdXgtPmNlbmNfYXV4X2luZm9fc2l6ZXMgPSBOVUxMOworICBxdGRlbXV4LT5jZW5jX2F1eF9zYW1wbGVfY291bnQgPSAwOworICBxdGRlbXV4LT5wcm90ZWN0aW9uX3N5c3RlbV9pZHMgPSBOVUxMOworICBnX3F1ZXVlX2luaXQgKCZxdGRlbXV4LT5wcm90ZWN0aW9uX2V2ZW50X3F1ZXVlKTsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnF0ZGVtdXgtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIHF0ZGVtdXgtPnRhZ19saXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZ3N0X3RhZ19saXN0X3NldF9zY29wZSAocXRkZW11eC0+dGFnX2xpc3QsIEdTVF9UQUdfU0NPUEVfR0xPQkFMKTsKKyAgcXRkZW11eC0+Zmxvd2NvbWJpbmVyID0gZ3N0X2Zsb3dfY29tYmluZXJfbmV3ICgpOworCisgIEdTVF9PQkpFQ1RfRkxBR19TRVQgKHF0ZGVtdXgsIEdTVF9FTEVNRU5UX0ZMQUdfSU5ERVhBQkxFKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFFURGVtdXggKnF0ZGVtdXggPSBHU1RfUVRERU1VWCAob2JqZWN0KTsKKworICBpZiAocXRkZW11eC0+YWRhcHRlcikgeworICAgIGdfb2JqZWN0X3VucmVmIChHX09CSkVDVCAocXRkZW11eC0+YWRhcHRlcikpOworICAgIHF0ZGVtdXgtPmFkYXB0ZXIgPSBOVUxMOworICB9CisgIGdzdF90YWdfbGlzdF91bnJlZiAocXRkZW11eC0+dGFnX2xpc3QpOworICBnc3RfZmxvd19jb21iaW5lcl9mcmVlIChxdGRlbXV4LT5mbG93Y29tYmluZXIpOworICBnX3F1ZXVlX2ZvcmVhY2ggKCZxdGRlbXV4LT5wcm90ZWN0aW9uX2V2ZW50X3F1ZXVlLCAoR0Z1bmMpIGdzdF9ldmVudF91bnJlZiwKKyAgICAgIE5VTEwpOworICBnX3F1ZXVlX2NsZWFyICgmcXRkZW11eC0+cHJvdGVjdGlvbl9ldmVudF9xdWV1ZSk7CisKKyAgZ19mcmVlIChxdGRlbXV4LT5jZW5jX2F1eF9pbmZvX3NpemVzKTsKKyAgcXRkZW11eC0+Y2VuY19hdXhfaW5mb19zaXplcyA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9wb3N0X25vX3BsYXlhYmxlX3N0cmVhbV9lcnJvciAoR3N0UVREZW11eCAqIHF0ZGVtdXgpCit7CisgIGlmIChxdGRlbXV4LT5wb3N0ZWRfcmVkaXJlY3QpIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRkZW11eCwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgKF8oIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIpKSwKKyAgICAgICAgKCJubyBrbm93biBzdHJlYW1zIGZvdW5kLCBhIHJlZGlyZWN0IG1lc3NhZ2UgaGFzIGJlZW4gcG9zdGVkIikpOworICB9IGVsc2UgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdGRlbXV4LCBTVFJFQU0sIERFTVVYLAorICAgICAgICAoXygiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIikpLAorICAgICAgICAoIm5vIGtub3duIHN0cmVhbXMgZm91bmQiKSk7CisgIH0KK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitfZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZ3BvaW50ZXIgbWVtLCBnc2l6ZSBzaXplLCBHRnJlZUZ1bmMgZnJlZV9mdW5jKQoreworICByZXR1cm4gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZF9mdWxsIChmcmVlX2Z1bmMgPyAwIDogR1NUX01FTU9SWV9GTEFHX1JFQURPTkxZLAorICAgICAgbWVtLCBzaXplLCAwLCBzaXplLCBtZW0sIGZyZWVfZnVuYyk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcXRkZW11eF9wdWxsX2F0b20gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBndWludDY0IG9mZnNldCwgZ3VpbnQ2NCBzaXplLAorICAgIEdzdEJ1ZmZlciAqKiBidWYpCit7CisgIEdzdEZsb3dSZXR1cm4gZmxvdzsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdzaXplIGJzaXplOworCisgIGlmIChHX1VOTElLRUxZIChzaXplID09IDApKSB7CisgICAgR3N0Rmxvd1JldHVybiByZXQ7CisgICAgR3N0QnVmZmVyICp0bXAgPSBOVUxMOworCisgICAgcmV0ID0gZ3N0X3F0ZGVtdXhfcHVsbF9hdG9tIChxdGRlbXV4LCBvZmZzZXQsIHNpemVvZiAoZ3VpbnQzMiksICZ0bXApOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICByZXR1cm4gcmV0OworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKHRtcCwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBzaXplID0gUVRfVUlOVDMyIChtYXAuZGF0YSk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInNpemUgMHglMDgiIEdfR0lOVDY0X01PRElGSUVSICJ4Iiwgc2l6ZSk7CisKKyAgICBnc3RfYnVmZmVyX3VubWFwICh0bXAsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKHRtcCk7CisgIH0KKworICAvKiBTYW5pdHkgY2hlY2s6IGNhdGNoIGJvZ3VzIHNpemVzIChmdXp6ZWQvYnJva2VuIGZpbGVzKSAqLworICBpZiAoR19VTkxJS0VMWSAoc2l6ZSA+IFFUREVNVVhfTUFYX0FUT01fU0laRSkpIHsKKyAgICBpZiAocXRkZW11eC0+c3RhdGUgIT0gUVRERU1VWF9TVEFURV9NT1ZJRSAmJiBxdGRlbXV4LT5nb3RfbW9vdikgeworICAgICAgLyogd2UncmUgcHVsbGluZyBoZWFkZXIgYnV0IGFscmVhZHkgZ290IG1vc3QgaW50ZXJlc3RpbmcgYml0cywKKyAgICAgICAqIHNvIG5ldmVyIG1pbmQgdGhlIHJlc3QgKGUuZy4gdGFncykgKHRoYXQgbXVjaCkgKi8KKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgImF0b20gaGFzIGJvZ3VzIHNpemUgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICBzaXplKTsKKyAgICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdGRlbXV4LCBTVFJFQU0sIERFTVVYLAorICAgICAgICAgIChfKCJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iKSksCisgICAgICAgICAgKCJhdG9tIGhhcyBib2d1cyBzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHNpemUpKTsKKyAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgICB9CisgIH0KKworICBmbG93ID0gZ3N0X3BhZF9wdWxsX3JhbmdlIChxdGRlbXV4LT5zaW5rcGFkLCBvZmZzZXQsIHNpemUsIGJ1Zik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGZsb3cgIT0gR1NUX0ZMT1dfT0spKQorICAgIHJldHVybiBmbG93OworCisgIGJzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoKmJ1Zik7CisgIC8qIENhdGNoIHNob3J0IHJlYWRzIC0gd2UgZG9uJ3Qgd2FudCBhbnkgcGFydGlhbCBhdG9tcyAqLworICBpZiAoR19VTkxJS0VMWSAoYnNpemUgPCBzaXplKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgInNob3J0IHJlYWQ6ICUiIEdfR1NJWkVfRk9STUFUICIgPCAlIiBHX0dVSU5UNjRfRk9STUFULCBic2l6ZSwgc2l6ZSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoKmJ1Zik7CisgICAgKmJ1ZiA9IE5VTEw7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VPUzsKKyAgfQorCisgIHJldHVybiBmbG93OworfQorCisjaWYgMQorc3RhdGljIGdib29sZWFuCitnc3RfcXRkZW11eF9zcmNfY29udmVydCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RGb3JtYXQgc3JjX2Zvcm1hdCwgZ2ludDY0IHNyY192YWx1ZSwgR3N0Rm9ybWF0IGRlc3RfZm9ybWF0LAorICAgIGdpbnQ2NCAqIGRlc3RfdmFsdWUpCit7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbSA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgZ2ludDMyIGluZGV4OworCisgIGlmIChzdHJlYW0tPnN1YnR5cGUgIT0gRk9VUkNDX3ZpZGUpIHsKKyAgICByZXMgPSBGQUxTRTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBzd2l0Y2ggKHNyY19mb3JtYXQpIHsKKyAgICBjYXNlIEdTVF9GT1JNQVRfVElNRToKKyAgICAgIHN3aXRjaCAoZGVzdF9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0JZVEVTOnsKKyAgICAgICAgICBpbmRleCA9IGdzdF9xdGRlbXV4X2ZpbmRfaW5kZXhfbGluZWFyIChxdGRlbXV4LCBzdHJlYW0sIHNyY192YWx1ZSk7CisgICAgICAgICAgaWYgKC0xID09IGluZGV4KSB7CisgICAgICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAqZGVzdF92YWx1ZSA9IHN0cmVhbS0+c2FtcGxlc1tpbmRleF0ub2Zmc2V0OworCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIkZvcm1hdCBDb252ZXJzaW9uIFRpbWUtPk9mZnNldCA6JSIKKyAgICAgICAgICAgICAgR1NUX1RJTUVfRk9STUFUICItPiUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHNyY192YWx1ZSksICpkZXN0X3ZhbHVlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRk9STUFUX0JZVEVTOgorICAgICAgc3dpdGNoIChkZXN0X2Zvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfVElNRTp7CisgICAgICAgICAgaW5kZXggPQorICAgICAgICAgICAgICBnc3RfcXRkZW11eF9maW5kX2luZGV4X2Zvcl9naXZlbl9tZWRpYV9vZmZzZXRfbGluZWFyIChxdGRlbXV4LAorICAgICAgICAgICAgICBzdHJlYW0sIHNyY192YWx1ZSk7CisKKyAgICAgICAgICBpZiAoLTEgPT0gaW5kZXgpIHsKKyAgICAgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgIH0KKworICAgICAgICAgICpkZXN0X3ZhbHVlID0KKyAgICAgICAgICAgICAgUVRTVFJFQU1USU1FX1RPX0dTVFRJTUUgKHN0cmVhbSwKKyAgICAgICAgICAgICAgc3RyZWFtLT5zYW1wbGVzW2luZGV4XS50aW1lc3RhbXApOworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAgICJGb3JtYXQgQ29udmVyc2lvbiBPZmZzZXQtPlRpbWUgOiUiIEdfR1VJTlQ2NF9GT1JNQVQgIi0+JSIKKyAgICAgICAgICAgICAgR1NUX1RJTUVfRk9STUFULCBzcmNfdmFsdWUsIEdTVF9USU1FX0FSR1MgKCpkZXN0X3ZhbHVlKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICB9CisKK2RvbmU6CisgIHJldHVybiByZXM7Cit9CisjZW5kaWYKKworc3RhdGljIGdib29sZWFuCitnc3RfcXRkZW11eF9nZXRfZHVyYXRpb24gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RDbG9ja1RpbWUgKiBkdXJhdGlvbikKK3sKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgKmR1cmF0aW9uID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBpZiAocXRkZW11eC0+ZHVyYXRpb24gIT0gMCAmJgorICAgICAgcXRkZW11eC0+ZHVyYXRpb24gIT0gR19NQVhJTlQ2NCAmJiBxdGRlbXV4LT50aW1lc2NhbGUgIT0gMCkgeworICAgICpkdXJhdGlvbiA9IFFUVElNRV9UT19HU1RUSU1FIChxdGRlbXV4LCBxdGRlbXV4LT5kdXJhdGlvbik7CisgICAgcmVzID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICAqZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcXRkZW11eF9oYW5kbGVfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKyAgR3N0UVREZW11eCAqcXRkZW11eCA9IEdTVF9RVERFTVVYIChwYXJlbnQpOworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICIlcyBxdWVyeSIsIEdTVF9RVUVSWV9UWVBFX05BTUUgKHF1ZXJ5KSk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfUE9TSVRJT046eworICAgICAgR3N0Rm9ybWF0IGZtdDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3Bvc2l0aW9uIChxdWVyeSwgJmZtdCwgTlVMTCk7CisgICAgICBpZiAoZm10ID09IEdTVF9GT1JNQVRfVElNRQorICAgICAgICAgICYmIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChxdGRlbXV4LT5zZWdtZW50LnBvc2l0aW9uKSkgeworICAgICAgICBnc3RfcXVlcnlfc2V0X3Bvc2l0aW9uIChxdWVyeSwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICAgICAgcXRkZW11eC0+c2VnbWVudC5wb3NpdGlvbik7CisgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICB9CisgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUVVFUllfRFVSQVRJT046eworICAgICAgR3N0Rm9ybWF0IGZtdDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2R1cmF0aW9uIChxdWVyeSwgJmZtdCwgTlVMTCk7CisgICAgICBpZiAoZm10ID09IEdTVF9GT1JNQVRfVElNRSkgeworICAgICAgICAvKiBGaXJzdCB0cnkgdG8gcXVlcnkgdXBzdHJlYW0gKi8KKyAgICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworICAgICAgICBpZiAoIXJlcykgeworICAgICAgICAgIEdzdENsb2NrVGltZSBkdXJhdGlvbjsKKyAgICAgICAgICBpZiAoZ3N0X3F0ZGVtdXhfZ2V0X2R1cmF0aW9uIChxdGRlbXV4LCAmZHVyYXRpb24pICYmIGR1cmF0aW9uID4gMCkgeworICAgICAgICAgICAgZ3N0X3F1ZXJ5X3NldF9kdXJhdGlvbiAocXVlcnksIEdTVF9GT1JNQVRfVElNRSwgZHVyYXRpb24pOworICAgICAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9DT05WRVJUOnsKKyAgICAgIEdzdEZvcm1hdCBzcmNfZm10LCBkZXN0X2ZtdDsKKyAgICAgIGdpbnQ2NCBzcmNfdmFsdWUsIGRlc3RfdmFsdWUgPSAwOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY29udmVydCAocXVlcnksICZzcmNfZm10LCAmc3JjX3ZhbHVlLCAmZGVzdF9mbXQsIE5VTEwpOworCisgICAgICByZXMgPSBnc3RfcXRkZW11eF9zcmNfY29udmVydCAocXRkZW11eCwgcGFkLAorICAgICAgICAgIHNyY19mbXQsIHNyY192YWx1ZSwgZGVzdF9mbXQsICZkZXN0X3ZhbHVlKTsKKyAgICAgIGlmIChyZXMpCisgICAgICAgIGdzdF9xdWVyeV9zZXRfY29udmVydCAocXVlcnksIHNyY19mbXQsIHNyY192YWx1ZSwgZGVzdF9mbXQsIGRlc3RfdmFsdWUpOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfRk9STUFUUzoKKyAgICAgIGdzdF9xdWVyeV9zZXRfZm9ybWF0cyAocXVlcnksIDIsIEdTVF9GT1JNQVRfVElNRSwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgICAgICByZXMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUVVFUllfU0VFS0lORzp7CisgICAgICBHc3RGb3JtYXQgZm10OworICAgICAgZ2Jvb2xlYW4gc2Vla2FibGU7CisKKyAgICAgIC8qIHRyeSB1cHN0cmVhbSBmaXJzdCAqLworICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworCisgICAgICBpZiAoIXJlcykgeworICAgICAgICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksICZmbXQsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoZm10ID09IEdTVF9GT1JNQVRfVElNRSkgeworICAgICAgICAgIEdzdENsb2NrVGltZSBkdXJhdGlvbjsKKworICAgICAgICAgIGdzdF9xdGRlbXV4X2dldF9kdXJhdGlvbiAocXRkZW11eCwgJmR1cmF0aW9uKTsKKyAgICAgICAgICBzZWVrYWJsZSA9IFRSVUU7CisgICAgICAgICAgaWYgKCFxdGRlbXV4LT5wdWxsYmFzZWQpIHsKKyAgICAgICAgICAgIEdzdFF1ZXJ5ICpxOworCisgICAgICAgICAgICAvKiB3ZSBtaWdodCBiZSBhYmxlIHdpdGggaGVscCBmcm9tIHVwc3RyZWFtICovCisgICAgICAgICAgICBzZWVrYWJsZSA9IEZBTFNFOworICAgICAgICAgICAgcSA9IGdzdF9xdWVyeV9uZXdfc2Vla2luZyAoR1NUX0ZPUk1BVF9CWVRFUyk7CisgICAgICAgICAgICBpZiAoZ3N0X3BhZF9wZWVyX3F1ZXJ5IChxdGRlbXV4LT5zaW5rcGFkLCBxKSkgeworICAgICAgICAgICAgICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocSwgJmZtdCwgJnNlZWthYmxlLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJ1cHN0cmVhbSBCWVRFIHNlZWthYmxlICVkIiwgc2Vla2FibGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ3N0X3F1ZXJ5X3VucmVmIChxKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ3N0X3F1ZXJ5X3NldF9zZWVraW5nIChxdWVyeSwgR1NUX0ZPUk1BVF9USU1FLCBzZWVrYWJsZSwgMCwgZHVyYXRpb24pOworICAgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9TRUdNRU5UOgorICAgIHsKKyAgICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisgICAgICBnaW50NjQgc3RhcnQsIHN0b3A7CisKKyAgICAgIGZvcm1hdCA9IHF0ZGVtdXgtPnNlZ21lbnQuZm9ybWF0OworCisgICAgICBzdGFydCA9CisgICAgICAgICAgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZxdGRlbXV4LT5zZWdtZW50LCBmb3JtYXQsCisgICAgICAgICAgcXRkZW11eC0+c2VnbWVudC5zdGFydCk7CisgICAgICBpZiAoKHN0b3AgPSBxdGRlbXV4LT5zZWdtZW50LnN0b3ApID09IC0xKQorICAgICAgICBzdG9wID0gcXRkZW11eC0+c2VnbWVudC5kdXJhdGlvbjsKKyAgICAgIGVsc2UKKyAgICAgICAgc3RvcCA9IGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmcXRkZW11eC0+c2VnbWVudCwgZm9ybWF0LCBzdG9wKTsKKworICAgICAgZ3N0X3F1ZXJ5X3NldF9zZWdtZW50IChxdWVyeSwgcXRkZW11eC0+c2VnbWVudC5yYXRlLCBmb3JtYXQsIHN0YXJ0LCBzdG9wKTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X3B1c2hfdGFncyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0pCit7CisgIGlmIChHX0xJS0VMWSAoc3RyZWFtLT5wYWQpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIkNoZWNraW5nIHBhZCAlczolcyBmb3IgdGFncyIsCisgICAgICAgIEdTVF9ERUJVR19QQURfTkFNRSAoc3RyZWFtLT5wYWQpKTsKKworICAgIGlmICghZ3N0X3RhZ19saXN0X2lzX2VtcHR5IChzdHJlYW0tPnN0cmVhbV90YWdzKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIlNlbmRpbmcgdGFncyAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgICAgICBzdHJlYW0tPnN0cmVhbV90YWdzKTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3RyZWFtLT5wYWQsCisgICAgICAgICAgZ3N0X2V2ZW50X25ld190YWcgKGdzdF90YWdfbGlzdF9yZWYgKHN0cmVhbS0+c3RyZWFtX3RhZ3MpKSk7CisgICAgfQorCisgICAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbS0+c2VuZF9nbG9iYWxfdGFncykpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJTZW5kaW5nIGdsb2JhbCB0YWdzICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICAgIHF0ZGVtdXgtPnRhZ19saXN0KTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3RyZWFtLT5wYWQsCisgICAgICAgICAgZ3N0X2V2ZW50X25ld190YWcgKGdzdF90YWdfbGlzdF9yZWYgKHF0ZGVtdXgtPnRhZ19saXN0KSkpOworICAgICAgc3RyZWFtLT5zZW5kX2dsb2JhbF90YWdzID0gRkFMU0U7CisgICAgfQorICB9Cit9CisKKy8qIHB1c2ggZXZlbnQgb24gYWxsIHNvdXJjZSBwYWRzOyB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGV2ZW50ICovCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfcHVzaF9ldmVudCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGd1aW50IG47CisgIGdib29sZWFuIGhhc192YWxpZF9zdHJlYW0gPSBGQUxTRTsKKyAgR3N0RXZlbnRUeXBlIGV0eXBlID0gR1NUX0VWRU5UX1RZUEUgKGV2ZW50KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicHVzaGluZyAlcyBldmVudCBvbiBhbGwgc291cmNlIHBhZHMiLAorICAgICAgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBmb3IgKG4gPSAwOyBuIDwgcXRkZW11eC0+bl9zdHJlYW1zOyBuKyspIHsKKyAgICBHc3RQYWQgKnBhZDsKKyAgICBRdERlbXV4U3RyZWFtICpzdHJlYW0gPSBxdGRlbXV4LT5zdHJlYW1zW25dOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJwdXNoaW5nIG9uIHBhZCAlaSIsIG4pOworCisgICAgaWYgKChwYWQgPSBzdHJlYW0tPnBhZCkpIHsKKyAgICAgIGhhc192YWxpZF9zdHJlYW0gPSBUUlVFOworCisgICAgICBpZiAoZXR5cGUgPT0gR1NUX0VWRU5UX0VPUykgeworICAgICAgICAvKiBsZXQncyBub3Qgc2VuZCB0d2ljZSAqLworICAgICAgICBpZiAoc3RyZWFtLT5zZW50X2VvcykKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgc3RyZWFtLT5zZW50X2VvcyA9IFRSVUU7CisgICAgICB9CisKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocGFkLCBnc3RfZXZlbnRfcmVmIChldmVudCkpOworICAgIH0KKyAgfQorCisgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworCisgIC8qIGlmIGl0IGlzIEVPUyBhbmQgdGhlcmUgYXJlIG5vIHBhZHMsIHBvc3QgYW4gZXJyb3IgKi8KKyAgaWYgKCFoYXNfdmFsaWRfc3RyZWFtICYmIGV0eXBlID09IEdTVF9FVkVOVF9FT1MpIHsKKyAgICBnc3RfcXRkZW11eF9wb3N0X25vX3BsYXlhYmxlX3N0cmVhbV9lcnJvciAocXRkZW11eCk7CisgIH0KK30KKworLyogcHVzaCBhIHBlbmRpbmcgbmV3c2VnbWVudCBldmVudCwgaWYgYW55IGZyb20gdGhlIHN0cmVhbWluZyB0aHJlYWQgKi8KK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9wdXNoX3BlbmRpbmdfbmV3c2VnbWVudCAoR3N0UVREZW11eCAqIHF0ZGVtdXgpCit7CisgIGlmIChxdGRlbXV4LT5wZW5kaW5nX25ld3NlZ21lbnQpIHsKKyAgICBnc3RfcXRkZW11eF9wdXNoX2V2ZW50IChxdGRlbXV4LCBxdGRlbXV4LT5wZW5kaW5nX25ld3NlZ21lbnQpOworICAgIHF0ZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCA9IE5VTEw7CisgIH0KK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ3VpbnQ2NCBtZWRpYV90aW1lOworfSBGaW5kRGF0YTsKKworc3RhdGljIGdpbnQKK2ZpbmRfZnVuYyAoUXREZW11eFNhbXBsZSAqIHMxLCBnaW50NjQgKiBtZWRpYV90aW1lLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGlmICgoZ2ludDY0KSBzMS0+dGltZXN0YW1wICsgczEtPnB0c19vZmZzZXQgPiAqbWVkaWFfdGltZSkKKyAgICByZXR1cm4gMTsKKyAgaWYgKChnaW50NjQpIHMxLT50aW1lc3RhbXAgKyBzMS0+cHRzX29mZnNldCA9PSAqbWVkaWFfdGltZSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gLTE7Cit9CisKKy8qIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBzYW1wbGUgdGhhdCBpbmNsdWRlcyB0aGUgZGF0YSBmb3IgQG1lZGlhX3RpbWUgdXNpbmcgYQorICogYmluYXJ5IHNlYXJjaC4gIE9ubHkgdG8gYmUgY2FsbGVkIGluIG9wdGltaXplZCBjYXNlcyBvZiBsaW5lYXIgc2VhcmNoIGJlbG93LgorICoKKyAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBzYW1wbGUuCisgKi8KK3N0YXRpYyBndWludDMyCitnc3RfcXRkZW11eF9maW5kX2luZGV4IChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0ciwKKyAgICBndWludDY0IG1lZGlhX3RpbWUpCit7CisgIFF0RGVtdXhTYW1wbGUgKnJlc3VsdDsKKyAgZ3VpbnQzMiBpbmRleDsKKworICAvKiBjb252ZXJ0IG1lZGlhX3RpbWUgdG8gbW92IGZvcm1hdCAqLworICBtZWRpYV90aW1lID0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9jZWlsIChtZWRpYV90aW1lLCBzdHItPnRpbWVzY2FsZSwgR1NUX1NFQ09ORCk7CisKKyAgcmVzdWx0ID0gZ3N0X3V0aWxfYXJyYXlfYmluYXJ5X3NlYXJjaCAoc3RyLT5zYW1wbGVzLCBzdHItPnN0YmxfaW5kZXggKyAxLAorICAgICAgc2l6ZW9mIChRdERlbXV4U2FtcGxlKSwgKEdDb21wYXJlRGF0YUZ1bmMpIGZpbmRfZnVuYywKKyAgICAgIEdTVF9TRUFSQ0hfTU9ERV9CRUZPUkUsICZtZWRpYV90aW1lLCBOVUxMKTsKKworICBpZiAoR19MSUtFTFkgKHJlc3VsdCkpCisgICAgaW5kZXggPSByZXN1bHQgLSBzdHItPnNhbXBsZXM7CisgIGVsc2UKKyAgICBpbmRleCA9IDA7CisKKyAgcmV0dXJuIGluZGV4OworfQorCisKKworLyogZmluZCB0aGUgaW5kZXggb2YgdGhlIHNhbXBsZSB0aGF0IGluY2x1ZGVzIHRoZSBkYXRhIGZvciBAbWVkaWFfb2Zmc2V0IHVzaW5nIGEKKyAqIGxpbmVhciBzZWFyY2gKKyAqCisgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgc2FtcGxlLgorICovCitzdGF0aWMgZ3VpbnQzMgorZ3N0X3F0ZGVtdXhfZmluZF9pbmRleF9mb3JfZ2l2ZW5fbWVkaWFfb2Zmc2V0X2xpbmVhciAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0ciwgZ2ludDY0IG1lZGlhX29mZnNldCkKK3sKKyAgUXREZW11eFNhbXBsZSAqcmVzdWx0ID0gc3RyLT5zYW1wbGVzOworICBndWludDMyIGluZGV4ID0gMDsKKworICBpZiAocmVzdWx0ID09IE5VTEwgfHwgc3RyLT5uX3NhbXBsZXMgPT0gMCkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKG1lZGlhX29mZnNldCA9PSByZXN1bHQtPm9mZnNldCkKKyAgICByZXR1cm4gaW5kZXg7CisKKyAgcmVzdWx0Kys7CisgIHdoaWxlIChpbmRleCA8IHN0ci0+bl9zYW1wbGVzIC0gMSkgeworICAgIGlmICghcXRkZW11eF9wYXJzZV9zYW1wbGVzIChxdGRlbXV4LCBzdHIsIGluZGV4ICsgMSkpCisgICAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKworICAgIGlmIChtZWRpYV9vZmZzZXQgPCByZXN1bHQtPm9mZnNldCkKKyAgICAgIGJyZWFrOworCisgICAgaW5kZXgrKzsKKyAgICByZXN1bHQrKzsKKyAgfQorICByZXR1cm4gaW5kZXg7CisKKyAgLyogRVJST1JTICovCitwYXJzZV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIlBhcnNpbmcgb2YgaW5kZXggJXUgZmFpbGVkISIsIGluZGV4ICsgMSk7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKKy8qIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBzYW1wbGUgdGhhdCBpbmNsdWRlcyB0aGUgZGF0YSBmb3IgQG1lZGlhX3RpbWUgdXNpbmcgYQorICogbGluZWFyIHNlYXJjaCwgYW5kIGtlZXBpbmcgaW4gbWluZCB0aGF0IG5vdCBhbGwgc2FtcGxlcyBtYXkgaGF2ZSBiZWVuIHBhcnNlZAorICogeWV0LiAgSWYgcG9zc2libGUsIGl0IHdpbGwgZGVsZWdhdGUgdG8gYmluYXJ5IHNlYXJjaC4KKyAqCisgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgc2FtcGxlLgorICovCitzdGF0aWMgZ3VpbnQzMgorZ3N0X3F0ZGVtdXhfZmluZF9pbmRleF9saW5lYXIgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBRdERlbXV4U3RyZWFtICogc3RyLAorICAgIEdzdENsb2NrVGltZSBtZWRpYV90aW1lKQoreworICBndWludDMyIGluZGV4ID0gMDsKKyAgZ3VpbnQ2NCBtb3ZfdGltZTsKKyAgUXREZW11eFNhbXBsZSAqc2FtcGxlOworCisgIC8qIGNvbnZlcnQgbWVkaWFfdGltZSB0byBtb3YgZm9ybWF0ICovCisgIG1vdl90aW1lID0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9jZWlsIChtZWRpYV90aW1lLCBzdHItPnRpbWVzY2FsZSwgR1NUX1NFQ09ORCk7CisKKyAgc2FtcGxlID0gc3RyLT5zYW1wbGVzOworICBpZiAobW92X3RpbWUgPT0gc2FtcGxlLT50aW1lc3RhbXAgKyBzYW1wbGUtPnB0c19vZmZzZXQpCisgICAgcmV0dXJuIGluZGV4OworCisgIC8qIHVzZSBmYXN0ZXIgc2VhcmNoIGlmIHJlcXVlc3RlZCB0aW1lIGluIGFscmVhZHkgcGFyc2VkIHJhbmdlICovCisgIHNhbXBsZSA9IHN0ci0+c2FtcGxlcyArIHN0ci0+c3RibF9pbmRleDsKKyAgaWYgKHN0ci0+c3RibF9pbmRleCA+PSAwICYmCisgICAgICBtb3ZfdGltZSA8PSAoc2FtcGxlLT50aW1lc3RhbXAgKyBzYW1wbGUtPnB0c19vZmZzZXQpKQorICAgIHJldHVybiBnc3RfcXRkZW11eF9maW5kX2luZGV4IChxdGRlbXV4LCBzdHIsIG1lZGlhX3RpbWUpOworCisgIHdoaWxlIChpbmRleCA8IHN0ci0+bl9zYW1wbGVzIC0gMSkgeworICAgIGlmICghcXRkZW11eF9wYXJzZV9zYW1wbGVzIChxdGRlbXV4LCBzdHIsIGluZGV4ICsgMSkpCisgICAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKworICAgIHNhbXBsZSA9IHN0ci0+c2FtcGxlcyArIGluZGV4ICsgMTsKKyAgICBpZiAobW92X3RpbWUgPCAoc2FtcGxlLT50aW1lc3RhbXAgKyBzYW1wbGUtPnB0c19vZmZzZXQpKQorICAgICAgYnJlYWs7CisKKyAgICBpbmRleCsrOworICB9CisgIHJldHVybiBpbmRleDsKKworICAvKiBFUlJPUlMgKi8KK3BhcnNlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiUGFyc2luZyBvZiBpbmRleCAldSBmYWlsZWQhIiwgaW5kZXggKyAxKTsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworLyogZmluZCB0aGUgaW5kZXggb2YgdGhlIGtleWZyYW1lIG5lZWRlZCB0byBkZWNvZGUgdGhlIHNhbXBsZSBhdCBAaW5kZXgKKyAqIG9mIHN0cmVhbSBAc3RyLCBvciBvZiBhIHN1YnNlcXVlbnQga2V5ZnJhbWUgKGRlcGVuZGluZyBvbiBAbmV4dCkKKyAqCisgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUga2V5ZnJhbWUuCisgKi8KK3N0YXRpYyBndWludDMyCitnc3RfcXRkZW11eF9maW5kX2tleWZyYW1lIChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0ciwKKyAgICBndWludDMyIGluZGV4LCBnYm9vbGVhbiBuZXh0KQoreworICBndWludDMyIG5ld19pbmRleCA9IGluZGV4OworCisgIGlmIChpbmRleCA+PSBzdHItPm5fc2FtcGxlcykgeworICAgIG5ld19pbmRleCA9IHN0ci0+bl9zYW1wbGVzOworICAgIGdvdG8gYmVhY2g7CisgIH0KKworICAvKiBhbGwga2V5ZnJhbWVzLCByZXR1cm4gaW5kZXggKi8KKyAgaWYgKHN0ci0+YWxsX2tleWZyYW1lKSB7CisgICAgbmV3X2luZGV4ID0gaW5kZXg7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIC8qIGVsc2Ugc2VhcmNoIHVudGlsIHdlIGhhdmUgYSBrZXlmcmFtZSAqLworICB3aGlsZSAobmV3X2luZGV4IDwgc3RyLT5uX3NhbXBsZXMpIHsKKyAgICBpZiAobmV4dCAmJiAhcXRkZW11eF9wYXJzZV9zYW1wbGVzIChxdGRlbXV4LCBzdHIsIG5ld19pbmRleCkpCisgICAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKworICAgIGlmIChzdHItPnNhbXBsZXNbbmV3X2luZGV4XS5rZXlmcmFtZSkKKyAgICAgIGJyZWFrOworCisgICAgaWYgKG5ld19pbmRleCA9PSAwKQorICAgICAgYnJlYWs7CisKKyAgICBpZiAobmV4dCkKKyAgICAgIG5ld19pbmRleCsrOworICAgIGVsc2UKKyAgICAgIG5ld19pbmRleC0tOworICB9CisKKyAgaWYgKG5ld19pbmRleCA9PSBzdHItPm5fc2FtcGxlcykgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJubyBuZXh0IGtleWZyYW1lIik7CisgICAgbmV3X2luZGV4ID0gLTE7CisgIH0KKworYmVhY2g6CisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJzZWFyY2hpbmcgZm9yIGtleWZyYW1lIGluZGV4ICVzIGluZGV4ICV1ICIKKyAgICAgICJnYXZlICV1IiwgbmV4dCA/ICJhZnRlciIgOiAiYmVmb3JlIiwgaW5kZXgsIG5ld19pbmRleCk7CisKKyAgcmV0dXJuIG5ld19pbmRleDsKKworICAvKiBFUlJPUlMgKi8KK3BhcnNlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiUGFyc2luZyBvZiBpbmRleCAldSBmYWlsZWQhIiwgbmV3X2luZGV4KTsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworLyogZmluZCB0aGUgc2VnbWVudCBmb3IgQHRpbWVfcG9zaXRpb24gZm9yIEBzdHJlYW0KKyAqCisgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgc2VnbWVudCBjb250YWluaW5nIEB0aW1lX3Bvc2l0aW9uLgorICogUmV0dXJucyB0aGUgbGFzdCBzZWdtZW50IGFuZCBzZXRzIHRoZSBAZW9zIHZhcmlhYmxlIHRvIFRSVUUKKyAqIGlmIHRoZSB0aW1lIGlzIGJleW9uZCB0aGUgZW5kLiBAZW9zIG1heSBiZSBOVUxMCisgKi8KK3N0YXRpYyBndWludDMyCitnc3RfcXRkZW11eF9maW5kX3NlZ21lbnQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBRdERlbXV4U3RyZWFtICogc3RyZWFtLAorICAgIEdzdENsb2NrVGltZSB0aW1lX3Bvc2l0aW9uKQoreworICBnaW50IGk7CisgIGd1aW50MzIgc2VnX2lkeDsKKworICBHU1RfTE9HX09CSkVDVCAoc3RyZWFtLT5wYWQsICJmaW5kaW5nIHNlZ21lbnQgZm9yICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVfcG9zaXRpb24pKTsKKworICBzZWdfaWR4ID0gLTE7CisgIGZvciAoaSA9IDA7IGkgPCBzdHJlYW0tPm5fc2VnbWVudHM7IGkrKykgeworICAgIFF0RGVtdXhTZWdtZW50ICpzZWdtZW50ID0gJnN0cmVhbS0+c2VnbWVudHNbaV07CisKKyAgICBHU1RfTE9HX09CSkVDVCAoc3RyZWFtLT5wYWQsCisgICAgICAgICJsb29raW5nIGF0IHNlZ21lbnQgJSIgR1NUX1RJTUVfRk9STUFUICItJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChzZWdtZW50LT50aW1lKSwgR1NUX1RJTUVfQVJHUyAoc2VnbWVudC0+c3RvcF90aW1lKSk7CisKKyAgICAvKiBGb3IgdGhlIGxhc3Qgc2VnbWVudCB3ZSBpbmNsdWRlIHN0b3BfdGltZSBpbiB0aGUgbGFzdCBzZWdtZW50ICovCisgICAgaWYgKGkgPCBzdHJlYW0tPm5fc2VnbWVudHMgLSAxKSB7CisgICAgICBpZiAoc2VnbWVudC0+dGltZSA8PSB0aW1lX3Bvc2l0aW9uICYmIHRpbWVfcG9zaXRpb24gPCBzZWdtZW50LT5zdG9wX3RpbWUpIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHN0cmVhbS0+cGFkLCAic2VnbWVudCAlZCBtYXRjaGVzIiwgaSk7CisgICAgICAgIHNlZ19pZHggPSBpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogTGFzdCBzZWdtZW50IGFsd2F5cyBtYXRjaGVzICovCisgICAgICBzZWdfaWR4ID0gaTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gc2VnX2lkeDsKK30KKworLyogbW92ZSB0aGUgc3RyZWFtIEBzdHIgdG8gdGhlIHNhbXBsZSBwb3NpdGlvbiBAaW5kZXguCisgKgorICogVXBkYXRlcyBAc3RyLT5zYW1wbGVfaW5kZXggYW5kIG1hcmtzIGRpc2NvbnRpbnVpdHkgaWYgbmVlZGVkLgorICovCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfbW92ZV9zdHJlYW0gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBRdERlbXV4U3RyZWFtICogc3RyLAorICAgIGd1aW50MzIgaW5kZXgpCit7CisgIC8qIG5vIGNoYW5nZSBuZWVkZWQgKi8KKyAgaWYgKGluZGV4ID09IHN0ci0+c2FtcGxlX2luZGV4KQorICAgIHJldHVybjsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAibW92aW5nIHRvIHNhbXBsZSAldSBvZiAldSIsIGluZGV4LAorICAgICAgc3RyLT5uX3NhbXBsZXMpOworCisgIC8qIHBvc2l0aW9uIGNoYW5nZWQsIHdlIGhhdmUgYSBkaXNjb250ICovCisgIHN0ci0+c2FtcGxlX2luZGV4ID0gaW5kZXg7CisgIHN0ci0+b2Zmc2V0X2luX3NhbXBsZSA9IDA7CisgIC8qIEVhY2ggdGltZSB3ZSBtb3ZlIGluIHRoZSBzdHJlYW0gd2Ugc3RvcmUgdGhlIHBvc2l0aW9uIHdoZXJlIHdlIGFyZQorICAgKiBzdGFydGluZyBmcm9tICovCisgIHN0ci0+ZnJvbV9zYW1wbGUgPSBpbmRleDsKKyAgc3RyLT5kaXNjb250ID0gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X2FkanVzdF9zZWVrIChHc3RRVERlbXV4ICogcXRkZW11eCwgZ2ludDY0IGRlc2lyZWRfdGltZSwKKyAgICBnYm9vbGVhbiB1c2Vfc3BhcnNlLCBnYm9vbGVhbiBuZXh0LCBnaW50NjQgKiBrZXlfdGltZSwgZ2ludDY0ICoga2V5X29mZnNldCkKK3sKKyAgZ3VpbnQ2NCBtaW5fb2Zmc2V0OworICBnaW50NjQgbWluX2J5dGVfb2Zmc2V0ID0gLTE7CisgIGdpbnQgbjsKKworICBtaW5fb2Zmc2V0ID0gZGVzaXJlZF90aW1lOworCisgIC8qIGZvciBlYWNoIHN0cmVhbSwgZmluZCB0aGUgaW5kZXggb2YgdGhlIHNhbXBsZSBpbiB0aGUgc2VnbWVudAorICAgKiBhbmQgbW92ZSBiYWNrIHRvIHRoZSBwcmV2aW91cyBrZXlmcmFtZS4gKi8KKyAgZm9yIChuID0gMDsgbiA8IHF0ZGVtdXgtPm5fc3RyZWFtczsgbisrKSB7CisgICAgUXREZW11eFN0cmVhbSAqc3RyOworICAgIGd1aW50MzIgaW5kZXgsIGtpbmRleDsKKyAgICBndWludDMyIHNlZ19pZHg7CisgICAgR3N0Q2xvY2tUaW1lIG1lZGlhX3N0YXJ0OworICAgIEdzdENsb2NrVGltZSBtZWRpYV90aW1lOworICAgIEdzdENsb2NrVGltZSBzZWdfdGltZTsKKyAgICBRdERlbXV4U2VnbWVudCAqc2VnOworICAgIGdib29sZWFuIGVtcHR5X3NlZ21lbnQgPSBGQUxTRTsKKworICAgIHN0ciA9IHF0ZGVtdXgtPnN0cmVhbXNbbl07CisKKyAgICBpZiAoQ1VSX1NUUkVBTSAoc3RyKS0+c3BhcnNlICYmICF1c2Vfc3BhcnNlKQorICAgICAgY29udGludWU7CisKKyAgICBzZWdfaWR4ID0gZ3N0X3F0ZGVtdXhfZmluZF9zZWdtZW50IChxdGRlbXV4LCBzdHIsIGRlc2lyZWRfdGltZSk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImFsaWduIHNlZ21lbnQgJWQiLCBzZWdfaWR4KTsKKworICAgIC8qIGdldCBzZWdtZW50IGFuZCB0aW1lIGluIHRoZSBzZWdtZW50ICovCisgICAgc2VnID0gJnN0ci0+c2VnbWVudHNbc2VnX2lkeF07CisgICAgc2VnX3RpbWUgPSAoZGVzaXJlZF90aW1lIC0gc2VnLT50aW1lKSAqIHNlZy0+cmF0ZTsKKworICAgIHdoaWxlIChRVFNFR01FTlRfSVNfRU1QVFkgKHNlZykpIHsKKyAgICAgIHNlZ190aW1lID0gMDsKKyAgICAgIGVtcHR5X3NlZ21lbnQgPSBUUlVFOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3RyLT5wYWQsICJTZWdtZW50ICVkIGlzIGVtcHR5LCBtb3ZpbmcgdG8gbmV4dCBvbmUiLAorICAgICAgICAgIHNlZ19pZHgpOworICAgICAgc2VnX2lkeCsrOworICAgICAgaWYgKHNlZ19pZHggPT0gc3RyLT5uX3NlZ21lbnRzKQorICAgICAgICBicmVhazsKKyAgICAgIHNlZyA9ICZzdHItPnNlZ21lbnRzW3NlZ19pZHhdOworICAgIH0KKworICAgIGlmIChzZWdfaWR4ID09IHN0ci0+bl9zZWdtZW50cykgeworICAgICAgLyogRklYTUUgdHJhY2sgc2hvdWxkbid0IGhhdmUgdGhlIGxhc3Qgc2VnbWVudCBhcyBlbXB0eSwgYnV0IGlmIGl0CisgICAgICAgKiBoYXBwZW5zIHdlIGJldHRlciBoYW5kbGUgaXQgKi8KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIGdldCB0aGUgbWVkaWEgdGltZSBpbiB0aGUgc2VnbWVudCAqLworICAgIG1lZGlhX3N0YXJ0ID0gc2VnLT5tZWRpYV9zdGFydCArIHNlZ190aW1lOworCisgICAgLyogZ2V0IHRoZSBpbmRleCBvZiB0aGUgc2FtcGxlIHdpdGggbWVkaWEgdGltZSAqLworICAgIGluZGV4ID0gZ3N0X3F0ZGVtdXhfZmluZF9pbmRleF9saW5lYXIgKHF0ZGVtdXgsIHN0ciwgbWVkaWFfc3RhcnQpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJzYW1wbGUgZm9yICUiIEdTVF9USU1FX0ZPUk1BVCAiIGF0ICV1IgorICAgICAgICAiIGF0IG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFUICIgKGVtcHR5IHNlZ21lbnQ6ICVkKSIsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKG1lZGlhX3N0YXJ0KSwgaW5kZXgsIHN0ci0+c2FtcGxlc1tpbmRleF0ub2Zmc2V0LAorICAgICAgICBlbXB0eV9zZWdtZW50KTsKKworICAgIC8qIHNoaWZ0IHRvIG5leHQgZnJhbWUgaWYgd2UgYXJlIGxvb2tpbmcgZm9yIG5leHQga2V5ZnJhbWUgKi8KKyAgICBpZiAobmV4dCAmJiBRVFNBTVBMRV9QVFNfTk9fQ1NMRyAoc3RyLCAmc3RyLT5zYW1wbGVzW2luZGV4XSkgPCBtZWRpYV9zdGFydAorICAgICAgICAmJiBpbmRleCA8IHN0ci0+c3RibF9pbmRleCkKKyAgICAgIGluZGV4Kys7CisKKyAgICBpZiAoIWVtcHR5X3NlZ21lbnQpIHsKKyAgICAgIC8qIGZpbmQgcHJldmlvdXMga2V5ZnJhbWUgKi8KKyAgICAgIGtpbmRleCA9IGdzdF9xdGRlbXV4X2ZpbmRfa2V5ZnJhbWUgKHF0ZGVtdXgsIHN0ciwgaW5kZXgsIG5leHQpOworCisgICAgICAvKiB3ZSB3aWxsIHNldHRsZSBmb3Igb25lIGJlZm9yZSBpZiBub25lIGZvdW5kIGFmdGVyICovCisgICAgICBpZiAobmV4dCAmJiBraW5kZXggPT0gLTEpCisgICAgICAgIGtpbmRleCA9IGdzdF9xdGRlbXV4X2ZpbmRfa2V5ZnJhbWUgKHF0ZGVtdXgsIHN0ciwgaW5kZXgsIEZBTFNFKTsKKworICAgICAgLyogaWYgdGhlIGtleWZyYW1lIGlzIGF0IGEgZGlmZmVyZW50IHBvc2l0aW9uLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUKKyAgICAgICAqIHJlcXVlc3RlZCBzZWVrIHRpbWUgKi8KKyAgICAgIGlmIChpbmRleCAhPSBraW5kZXgpIHsKKyAgICAgICAgaW5kZXggPSBraW5kZXg7CisKKyAgICAgICAgLyogZ2V0IHRpbWVzdGFtcCBvZiBrZXlmcmFtZSAqLworICAgICAgICBtZWRpYV90aW1lID0gUVRTQU1QTEVfUFRTX05PX0NTTEcgKHN0ciwgJnN0ci0+c2FtcGxlc1traW5kZXhdKTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICJrZXlmcmFtZSBhdCAldSB3aXRoIHRpbWUgJSIgR1NUX1RJTUVfRk9STUFUICIgYXQgb2Zmc2V0ICUiCisgICAgICAgICAgICBHX0dVSU5UNjRfRk9STUFULCBraW5kZXgsIEdTVF9USU1FX0FSR1MgKG1lZGlhX3RpbWUpLAorICAgICAgICAgICAgc3RyLT5zYW1wbGVzW2tpbmRleF0ub2Zmc2V0KTsKKworICAgICAgICAvKiBrZXlmcmFtZXMgaW4gdGhlIHNlZ21lbnQgZ2V0IGEgY2hhbmNlIHRvIGNoYW5nZSB0aGUKKyAgICAgICAgICogZGVzaXJlZF9vZmZzZXQuIGtleWZyYW1lcyBvdXQgb2YgdGhlIHNlZ21lbnQgYXJlCisgICAgICAgICAqIGlnbm9yZWQuICovCisgICAgICAgIGlmIChtZWRpYV90aW1lID49IHNlZy0+bWVkaWFfc3RhcnQpIHsKKyAgICAgICAgICBHc3RDbG9ja1RpbWUgc2VnX3RpbWU7CisKKyAgICAgICAgICAvKiB0aGlzIGtleWZyYW1lIGlzIGluc2lkZSB0aGUgc2VnbWVudCwgY29udmVydCBiYWNrIHRvCisgICAgICAgICAgICogc2VnbWVudCB0aW1lICovCisgICAgICAgICAgc2VnX3RpbWUgPSAobWVkaWFfdGltZSAtIHNlZy0+bWVkaWFfc3RhcnQpICsgc2VnLT50aW1lOworICAgICAgICAgIGlmICgoIW5leHQgJiYgKHNlZ190aW1lIDwgbWluX29mZnNldCkpIHx8CisgICAgICAgICAgICAgIChuZXh0ICYmIChzZWdfdGltZSA+IG1pbl9vZmZzZXQpKSkKKyAgICAgICAgICAgIG1pbl9vZmZzZXQgPSBzZWdfdGltZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChtaW5fYnl0ZV9vZmZzZXQgPCAwIHx8IHN0ci0+c2FtcGxlc1tpbmRleF0ub2Zmc2V0IDwgbWluX2J5dGVfb2Zmc2V0KQorICAgICAgbWluX2J5dGVfb2Zmc2V0ID0gc3RyLT5zYW1wbGVzW2luZGV4XS5vZmZzZXQ7CisgIH0KKworICBpZiAoa2V5X3RpbWUpCisgICAgKmtleV90aW1lID0gbWluX29mZnNldDsKKyAgaWYgKGtleV9vZmZzZXQpCisgICAgKmtleV9vZmZzZXQgPSBtaW5fYnl0ZV9vZmZzZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3F0ZGVtdXhfY29udmVydF9zZWVrIChHc3RQYWQgKiBwYWQsIEdzdEZvcm1hdCAqIGZvcm1hdCwKKyAgICBHc3RTZWVrVHlwZSBjdXJfdHlwZSwgZ2ludDY0ICogY3VyLCBHc3RTZWVrVHlwZSBzdG9wX3R5cGUsIGdpbnQ2NCAqIHN0b3ApCit7CisgIGdib29sZWFuIHJlczsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZm9ybWF0ICE9IE5VTEwsIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGN1ciAhPSBOVUxMLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzdG9wICE9IE5VTEwsIEZBTFNFKTsKKworICBpZiAoKmZvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgcmVzID0gVFJVRTsKKyAgaWYgKGN1cl90eXBlICE9IEdTVF9TRUVLX1RZUEVfTk9ORSkKKyAgICByZXMgPSBnc3RfcGFkX3F1ZXJ5X2NvbnZlcnQgKHBhZCwgKmZvcm1hdCwgKmN1ciwgR1NUX0ZPUk1BVF9USU1FLCBjdXIpOworICBpZiAocmVzICYmIHN0b3BfdHlwZSAhPSBHU1RfU0VFS19UWVBFX05PTkUpCisgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9jb252ZXJ0IChwYWQsICpmb3JtYXQsICpzdG9wLCBHU1RfRk9STUFUX1RJTUUsIHN0b3ApOworCisgIGlmIChyZXMpCisgICAgKmZvcm1hdCA9IEdTVF9GT1JNQVRfVElNRTsKKworICByZXR1cm4gcmVzOworfQorCisvKiBwZXJmb3JtIHNlZWsgaW4gcHVzaCBiYXNlZCBtb2RlOgorICAgZmluZCBCWVRFIHBvc2l0aW9uIHRvIG1vdmUgdG8gYmFzZWQgb24gdGltZSBhbmQgZGVsZWdhdGUgdG8gdXBzdHJlYW0KKyovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9xdGRlbXV4X2RvX3B1c2hfc2VlayAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdFBhZCAqIHBhZCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2RvdWJsZSByYXRlOworICBHc3RGb3JtYXQgZm9ybWF0OworICBHc3RTZWVrRmxhZ3MgZmxhZ3M7CisgIEdzdFNlZWtUeXBlIGN1cl90eXBlLCBzdG9wX3R5cGU7CisgIGdpbnQ2NCBjdXIsIHN0b3AsIGtleV9jdXI7CisgIGdib29sZWFuIHJlczsKKyAgZ2ludDY0IGJ5dGVfY3VyOworICBnaW50NjQgb3JpZ2luYWxfc3RvcDsKKyAgZ3VpbnQzMiBzZXFudW07CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImRvaW5nIHB1c2gtYmFzZWQgc2VlayIpOworCisgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgJnJhdGUsICZmb3JtYXQsICZmbGFncywKKyAgICAgICZjdXJfdHlwZSwgJmN1ciwgJnN0b3BfdHlwZSwgJnN0b3ApOworICBzZXFudW0gPSBnc3RfZXZlbnRfZ2V0X3NlcW51bSAoZXZlbnQpOworCisgIC8qIG9ubHkgZm9yd2FyZCBzdHJlYW1pbmcgYW5kIHNlZWtpbmcgaXMgcG9zc2libGUgKi8KKyAgaWYgKHJhdGUgPD0gMCkKKyAgICBnb3RvIHVuc3VwcG9ydGVkX3NlZWs7CisKKyAgLyogY29udmVydCB0byBUSU1FIGlmIG5lZWRlZCBhbmQgcG9zc2libGUgKi8KKyAgaWYgKCFnc3RfcXRkZW11eF9jb252ZXJ0X3NlZWsgKHBhZCwgJmZvcm1hdCwgY3VyX3R5cGUsICZjdXIsCisgICAgICAgICAgc3RvcF90eXBlLCAmc3RvcCkpCisgICAgZ290byBub19mb3JtYXQ7CisKKyAgLyogVXBzdHJlYW0gc2VlayBpbiBieXRlcyB3aWxsIGhhdmUgdW5kZWZpbmVkIHN0b3AsIGJ1dCBxdGRlbXV4IHN0b3JlcworICAgKiB0aGUgb3JpZ2luYWwgc3RvcCBwb3NpdGlvbiB0byB1c2Ugd2hlbiB1cHN0cmVhbSBwdXNoZXMgdGhlIG5ldyBzZWdtZW50CisgICAqIGZvciB0aGlzIHNlZWsgKi8KKyAgb3JpZ2luYWxfc3RvcCA9IHN0b3A7CisgIHN0b3AgPSAtMTsKKworICAvKiBmaW5kIHJlYXNvbmFibGUgY29ycmVzcG9uZGluZyBCWVRFIHBvc2l0aW9uLAorICAgKiBhbHNvIHRyeSB0byBtaW5kIGFib3V0IGtleWZyYW1lcywgc2luY2Ugd2UgY2FuIG5vdCBnbyBiYWNrIGEgYml0IGZvciB0aGVtCisgICAqIGxhdGVyIG9uICovCisgIC8qIGRldGVybWluaW5nIEBuZXh0IGhlcmUgYmFzZWQgb24gU05BUF9CRUZPUkUvU05BUF9BRlRFUiBzaG91bGQKKyAgICogbW9zdGx5IGp1c3Qgd29yaywgYnV0IGxldCdzIG5vdCB5ZXQgYm9sZGx5IGdvIHRoZXJlICAuLi4gKi8KKyAgZ3N0X3F0ZGVtdXhfYWRqdXN0X3NlZWsgKHF0ZGVtdXgsIGN1ciwgRkFMU0UsIEZBTFNFLCAma2V5X2N1ciwgJmJ5dGVfY3VyKTsKKworICBpZiAoYnl0ZV9jdXIgPT0gLTEpCisgICAgZ290byBhYm9ydF9zZWVrOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJQdXNoaW5nIEJZVEUgc2VlayByYXRlICVnLCAiCisgICAgICAic3RhcnQgJSIgR19HSU5UNjRfRk9STUFUICIsIHN0b3AgJSIgR19HSU5UNjRfRk9STUFULCByYXRlLCBieXRlX2N1ciwKKyAgICAgIHN0b3ApOworCisgIEdTVF9PQkpFQ1RfTE9DSyAocXRkZW11eCk7CisgIHF0ZGVtdXgtPnNlZWtfb2Zmc2V0ID0gYnl0ZV9jdXI7CisgIGlmICghKGZsYWdzICYgR1NUX1NFRUtfRkxBR19LRVlfVU5JVCkpIHsKKyAgICBxdGRlbXV4LT5wdXNoX3NlZWtfc3RhcnQgPSBjdXI7CisgIH0gZWxzZSB7CisgICAgcXRkZW11eC0+cHVzaF9zZWVrX3N0YXJ0ID0ga2V5X2N1cjsKKyAgfQorCisgIGlmIChzdG9wX3R5cGUgPT0gR1NUX1NFRUtfVFlQRV9OT05FKSB7CisgICAgcXRkZW11eC0+cHVzaF9zZWVrX3N0b3AgPSBxdGRlbXV4LT5zZWdtZW50LnN0b3A7CisgIH0gZWxzZSB7CisgICAgcXRkZW11eC0+cHVzaF9zZWVrX3N0b3AgPSBvcmlnaW5hbF9zdG9wOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChxdGRlbXV4KTsKKworICAvKiBCWVRFIHNlZWsgZXZlbnQgKi8KKyAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZWsgKHJhdGUsIEdTVF9GT1JNQVRfQllURVMsIGZsYWdzLCBjdXJfdHlwZSwgYnl0ZV9jdXIsCisgICAgICBzdG9wX3R5cGUsIHN0b3ApOworICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZXZlbnQsIHNlcW51bSk7CisgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAocXRkZW11eC0+c2lua3BhZCwgZXZlbnQpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCithYm9ydF9zZWVrOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImNvdWxkIG5vdCBkZXRlcm1pbmUgYnl0ZSBwb3NpdGlvbiB0byBzZWVrIHRvLCAiCisgICAgICAgICJzZWVrIGFib3J0ZWQuIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit1bnN1cHBvcnRlZF9zZWVrOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInVuc3VwcG9ydGVkIHNlZWssIHNlZWsgYWJvcnRlZC4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX2Zvcm1hdDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJ1bnN1cHBvcnRlZCBmb3JtYXQgZ2l2ZW4sIHNlZWsgYWJvcnRlZC4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogcGVyZm9ybSB0aGUgc2Vlay4KKyAqCisgKiBXZSBzZXQgYWxsIHNlZ21lbnRfaW5kZXhlcyBpbiB0aGUgc3RyZWFtcyB0byB1bmtub3duIGFuZAorICogYWRqdXN0IHRoZSB0aW1lX3Bvc2l0aW9uIHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9uLiB0aGlzIGlzIGVub3VnaAorICogdG8gdHJpZ2dlciBhIHNlZ21lbnQgc3dpdGNoIGluIHRoZSBzdHJlYW1pbmcgdGhyZWFkIHRvIHN0YXJ0CisgKiBzdHJlYW1pbmcgZnJvbSB0aGUgZGVzaXJlZCBwb3NpdGlvbi4KKyAqCisgKiBLZXlmcmFtZSBzZWVraW5nIGlzIGEgbGl0dGxlIG1vcmUgY29tcGxpY2F0ZWQgd2hlbiBkZWFsaW5nIHdpdGgKKyAqIHNlZ21lbnRzLiBJZGVhbGx5IHdlIHdhbnQgdG8gbW92ZSB0byB0aGUgcHJldmlvdXMga2V5ZnJhbWUgaW4KKyAqIHRoZSBzZWdtZW50IGJ1dCB0aGVyZSBtaWdodCBub3QgYmUgYSBrZXlmcmFtZSBpbiB0aGUgc2VnbWVudC4gSW4KKyAqIGZhY3QsIG5vbmUgb2YgdGhlIHNlZ21lbnRzIGNvdWxkIGNvbnRhaW4gYSBrZXlmcmFtZS4gV2UgdGFrZSBhCisgKiBwcmFjdGljYWwgYXBwcm9hY2g6IHNlZWsgdG8gdGhlIHByZXZpb3VzIGtleWZyYW1lIGluIHRoZSBzZWdtZW50LAorICogaWYgdGhlcmUgaXMgbm9uZSwgc2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWdtZW50LgorICoKKyAqIENhbGxlZCB3aXRoIFNUUkVBTV9MT0NLCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3F0ZGVtdXhfcGVyZm9ybV9zZWVrIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0U2VnbWVudCAqIHNlZ21lbnQsCisgICAgZ3VpbnQzMiBzZXFudW0sIEdzdFNlZWtGbGFncyBmbGFncykKK3sKKyAgZ2ludDY0IGRlc2lyZWRfb2Zmc2V0OworICBnaW50IG47CisKKyAgZGVzaXJlZF9vZmZzZXQgPSBzZWdtZW50LT5wb3NpdGlvbjsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic2Vla2luZyB0byAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChkZXNpcmVkX29mZnNldCkpOworCisgIC8qIG1heSBub3QgaGF2ZSBlbm91Z2ggZnJhZ21lbnRlZCBpbmZvIHRvIGRvIHRoaXMgYWRqdXN0bWVudCwKKyAgICogYW5kIHdlIGNhbid0IHNjYW4gKGFuZCBwcm9iYWJseSBzaG91bGQgbm90KSBhdCB0aGlzIHRpbWUgd2l0aAorICAgKiBwb3NzaWJseSBmbHVzaGluZyB1cHN0cmVhbSAqLworICBpZiAoKGZsYWdzICYgR1NUX1NFRUtfRkxBR19LRVlfVU5JVCkgJiYgIXF0ZGVtdXgtPmZyYWdtZW50ZWQpIHsKKyAgICBnaW50NjQgbWluX29mZnNldDsKKyAgICBnYm9vbGVhbiBuZXh0LCBiZWZvcmUsIGFmdGVyOworCisgICAgYmVmb3JlID0gISAhKGZsYWdzICYgR1NUX1NFRUtfRkxBR19TTkFQX0JFRk9SRSk7CisgICAgYWZ0ZXIgPSAhICEoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NOQVBfQUZURVIpOworICAgIG5leHQgPSBhZnRlciAmJiAhYmVmb3JlOworICAgIGlmIChzZWdtZW50LT5yYXRlIDwgMCkKKyAgICAgIG5leHQgPSAhbmV4dDsKKworICAgIGdzdF9xdGRlbXV4X2FkanVzdF9zZWVrIChxdGRlbXV4LCBkZXNpcmVkX29mZnNldCwgVFJVRSwgbmV4dCwgJm1pbl9vZmZzZXQsCisgICAgICAgIE5VTEwpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJrZXlmcmFtZSBzZWVrLCBhbGlnbiB0byAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKG1pbl9vZmZzZXQpKTsKKyAgICBkZXNpcmVkX29mZnNldCA9IG1pbl9vZmZzZXQ7CisgIH0KKworICAvKiBhbmQgc2V0IGFsbCBzdHJlYW1zIHRvIHRoZSBmaW5hbCBwb3NpdGlvbiAqLworICBnc3RfZmxvd19jb21iaW5lcl9yZXNldCAocXRkZW11eC0+Zmxvd2NvbWJpbmVyKTsKKyAgcXRkZW11eC0+c2VnbWVudF9zZXFudW0gPSBzZXFudW07CisgIGZvciAobiA9IDA7IG4gPCBxdGRlbXV4LT5uX3N0cmVhbXM7IG4rKykgeworICAgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbSA9IHF0ZGVtdXgtPnN0cmVhbXNbbl07CisKKyAgICBzdHJlYW0tPnRpbWVfcG9zaXRpb24gPSBkZXNpcmVkX29mZnNldDsKKyAgICBzdHJlYW0tPmFjY3VtdWxhdGVkX2Jhc2UgPSAwOworICAgIHN0cmVhbS0+c2FtcGxlX2luZGV4ID0gLTE7CisgICAgc3RyZWFtLT5vZmZzZXRfaW5fc2FtcGxlID0gMDsKKyAgICBzdHJlYW0tPnNlZ21lbnRfaW5kZXggPSAtMTsKKyAgICBzdHJlYW0tPnNlbnRfZW9zID0gRkFMU0U7CisKKyAgICBpZiAoc2VnbWVudC0+ZmxhZ3MgJiBHU1RfU0VFS19GTEFHX0ZMVVNIKQorICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJnN0cmVhbS0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgfQorICBzZWdtZW50LT5wb3NpdGlvbiA9IGRlc2lyZWRfb2Zmc2V0OworICBzZWdtZW50LT50aW1lID0gZGVzaXJlZF9vZmZzZXQ7CisgIGlmIChzZWdtZW50LT5yYXRlID49IDApIHsKKyAgICBzZWdtZW50LT5zdGFydCA9IGRlc2lyZWRfb2Zmc2V0OworCisgICAgLyogd2Ugc3RvcCBhdCB0aGUgZW5kICovCisgICAgaWYgKHNlZ21lbnQtPnN0b3AgPT0gLTEpCisgICAgICBzZWdtZW50LT5zdG9wID0gc2VnbWVudC0+ZHVyYXRpb247CisgIH0gZWxzZSB7CisgICAgc2VnbWVudC0+c3RvcCA9IGRlc2lyZWRfb2Zmc2V0OworICB9CisKKyAgaWYgKHF0ZGVtdXgtPmZyYWdtZW50ZWQpCisgICAgcXRkZW11eC0+ZnJhZ21lbnRlZF9zZWVrX3BlbmRpbmcgPSBUUlVFOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBkbyBhIHNlZWsgaW4gcHVsbCBiYXNlZCBtb2RlICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9xdGRlbXV4X2RvX3NlZWsgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RQYWQgKiBwYWQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdkb3VibGUgcmF0ZTsKKyAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgR3N0U2Vla0ZsYWdzIGZsYWdzOworICBHc3RTZWVrVHlwZSBjdXJfdHlwZSwgc3RvcF90eXBlOworICBnaW50NjQgY3VyLCBzdG9wOworICBnYm9vbGVhbiBmbHVzaDsKKyAgZ2Jvb2xlYW4gdXBkYXRlOworICBHc3RTZWdtZW50IHNlZWtzZWdtZW50OworICBndWludDMyIHNlcW51bSA9IEdTVF9TRVFOVU1fSU5WQUxJRDsKKyAgR3N0RXZlbnQgKmZsdXNoX2V2ZW50OworICBnYm9vbGVhbiByZXQ7CisKKyAgaWYgKGV2ZW50KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImRvaW5nIHNlZWsgd2l0aCBldmVudCIpOworCisgICAgZ3N0X2V2ZW50X3BhcnNlX3NlZWsgKGV2ZW50LCAmcmF0ZSwgJmZvcm1hdCwgJmZsYWdzLAorICAgICAgICAmY3VyX3R5cGUsICZjdXIsICZzdG9wX3R5cGUsICZzdG9wKTsKKyAgICBzZXFudW0gPSBnc3RfZXZlbnRfZ2V0X3NlcW51bSAoZXZlbnQpOworCisgICAgLyogd2UgaGF2ZSB0byBoYXZlIGEgZm9ybWF0IGFzIHRoZSBzZWdtZW50IGZvcm1hdC4gVHJ5IHRvIGNvbnZlcnQKKyAgICAgKiBpZiBub3QuICovCisgICAgaWYgKCFnc3RfcXRkZW11eF9jb252ZXJ0X3NlZWsgKHBhZCwgJmZvcm1hdCwgY3VyX3R5cGUsICZjdXIsCisgICAgICAgICAgICBzdG9wX3R5cGUsICZzdG9wKSkKKyAgICAgIGdvdG8gbm9fZm9ybWF0OworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInNlZWsgZm9ybWF0ICVzIiwgZ3N0X2Zvcm1hdF9nZXRfbmFtZSAoZm9ybWF0KSk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImRvaW5nIHNlZWsgd2l0aG91dCBldmVudCIpOworICAgIGZsYWdzID0gMDsKKyAgfQorCisgIGZsdXNoID0gZmxhZ3MgJiBHU1RfU0VFS19GTEFHX0ZMVVNIOworCisgIC8qIHN0b3Agc3RyZWFtaW5nLCBlaXRoZXIgYnkgZmx1c2hpbmcgb3IgYnkgcGF1c2luZyB0aGUgdGFzayAqLworICBpZiAoZmx1c2gpIHsKKyAgICBmbHVzaF9ldmVudCA9IGdzdF9ldmVudF9uZXdfZmx1c2hfc3RhcnQgKCk7CisgICAgaWYgKHNlcW51bSAhPSBHU1RfU0VRTlVNX0lOVkFMSUQpCisgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZmx1c2hfZXZlbnQsIHNlcW51bSk7CisgICAgLyogdW5sb2NrIHVwc3RyZWFtIHB1bGxfcmFuZ2UgKi8KKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHF0ZGVtdXgtPnNpbmtwYWQsIGdzdF9ldmVudF9yZWYgKGZsdXNoX2V2ZW50KSk7CisgICAgLyogbWFrZSBzdXJlIG91dCBsb29wIGZ1bmN0aW9uIGV4aXRzICovCisgICAgZ3N0X3F0ZGVtdXhfcHVzaF9ldmVudCAocXRkZW11eCwgZmx1c2hfZXZlbnQpOworICB9IGVsc2UgeworICAgIC8qIG5vbiBmbHVzaGluZyBzZWVrLCBwYXVzZSB0aGUgdGFzayAqLworICAgIGdzdF9wYWRfcGF1c2VfdGFzayAocXRkZW11eC0+c2lua3BhZCk7CisgIH0KKworICAvKiB3YWl0IGZvciBzdHJlYW1pbmcgdG8gZmluaXNoICovCisgIEdTVF9QQURfU1RSRUFNX0xPQ0sgKHF0ZGVtdXgtPnNpbmtwYWQpOworCisgIC8qIGNvcHkgc2VnbWVudCwgd2UgbmVlZCB0aGlzIGJlY2F1c2Ugd2Ugc3RpbGwgbmVlZCB0aGUgb2xkCisgICAqIHNlZ21lbnQgd2hlbiB3ZSBjbG9zZSB0aGUgY3VycmVudCBzZWdtZW50LiAqLworICBtZW1jcHkgKCZzZWVrc2VnbWVudCwgJnF0ZGVtdXgtPnNlZ21lbnQsIHNpemVvZiAoR3N0U2VnbWVudCkpOworCisgIGlmIChldmVudCkgeworICAgIC8qIGNvbmZpZ3VyZSB0aGUgc2VnbWVudCB3aXRoIHRoZSBzZWVrIHZhcmlhYmxlcyAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJjb25maWd1cmluZyBzZWVrIik7CisgICAgaWYgKCFnc3Rfc2VnbWVudF9kb19zZWVrICgmc2Vla3NlZ21lbnQsIHJhdGUsIGZvcm1hdCwgZmxhZ3MsCisgICAgICAgICAgICBjdXJfdHlwZSwgY3VyLCBzdG9wX3R5cGUsIHN0b3AsICZ1cGRhdGUpKSB7CisgICAgICByZXQgPSBGQUxTRTsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJpbmNvbnNpc3RlbnQgc2VlayB2YWx1ZXMsIGRvaW5nIG5vdGhpbmciKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogbm93IGRvIHRoZSBzZWVrICovCisgICAgICByZXQgPSBnc3RfcXRkZW11eF9wZXJmb3JtX3NlZWsgKHF0ZGVtdXgsICZzZWVrc2VnbWVudCwgc2VxbnVtLCBmbGFncyk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIG5vdyBkbyB0aGUgc2VlayAqLworICAgIHJldCA9IGdzdF9xdGRlbXV4X3BlcmZvcm1fc2VlayAocXRkZW11eCwgJnNlZWtzZWdtZW50LCBzZXFudW0sIGZsYWdzKTsKKyAgfQorCisgIC8qIHByZXBhcmUgZm9yIHN0cmVhbWluZyBhZ2FpbiAqLworICBpZiAoZmx1c2gpIHsKKyAgICBmbHVzaF9ldmVudCA9IGdzdF9ldmVudF9uZXdfZmx1c2hfc3RvcCAoVFJVRSk7CisgICAgaWYgKHNlcW51bSAhPSBHU1RfU0VRTlVNX0lOVkFMSUQpCisgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZmx1c2hfZXZlbnQsIHNlcW51bSk7CisKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHF0ZGVtdXgtPnNpbmtwYWQsIGdzdF9ldmVudF9yZWYgKGZsdXNoX2V2ZW50KSk7CisgICAgZ3N0X3F0ZGVtdXhfcHVzaF9ldmVudCAocXRkZW11eCwgZmx1c2hfZXZlbnQpOworICB9CisKKyAgLyogY29tbWl0IHRoZSBuZXcgc2VnbWVudCAqLworICBtZW1jcHkgKCZxdGRlbXV4LT5zZWdtZW50LCAmc2Vla3NlZ21lbnQsIHNpemVvZiAoR3N0U2VnbWVudCkpOworCisgIGlmIChxdGRlbXV4LT5zZWdtZW50LmZsYWdzICYgR1NUX1NFRUtfRkxBR19TRUdNRU5UKSB7CisgICAgR3N0TWVzc2FnZSAqbXNnID0gZ3N0X21lc3NhZ2VfbmV3X3NlZ21lbnRfc3RhcnQgKEdTVF9PQkpFQ1RfQ0FTVCAocXRkZW11eCksCisgICAgICAgIHF0ZGVtdXgtPnNlZ21lbnQuZm9ybWF0LCBxdGRlbXV4LT5zZWdtZW50LnBvc2l0aW9uKTsKKyAgICBpZiAoc2VxbnVtICE9IEdTVF9TRVFOVU1fSU5WQUxJRCkKKyAgICAgIGdzdF9tZXNzYWdlX3NldF9zZXFudW0gKG1zZywgc2VxbnVtKTsKKyAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHF0ZGVtdXgpLCBtc2cpOworICB9CisKKyAgLyogcmVzdGFydCBzdHJlYW1pbmcsIE5FV1NFR01FTlQgd2lsbCBiZSBzZW50IGZyb20gdGhlIHN0cmVhbWluZyB0aHJlYWQuICovCisgIGdzdF9wYWRfc3RhcnRfdGFzayAocXRkZW11eC0+c2lua3BhZCwgKEdzdFRhc2tGdW5jdGlvbikgZ3N0X3F0ZGVtdXhfbG9vcCwKKyAgICAgIHF0ZGVtdXgtPnNpbmtwYWQsIE5VTEwpOworCisgIEdTVF9QQURfU1RSRUFNX1VOTE9DSyAocXRkZW11eC0+c2lua3BhZCk7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK25vX2Zvcm1hdDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJ1bnN1cHBvcnRlZCBmb3JtYXQgZ2l2ZW4sIHNlZWsgYWJvcnRlZC4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X2Vuc3VyZV9pbmRleCAoR3N0UVREZW11eCAqIHF0ZGVtdXgpCit7CisgIGd1aW50IGk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImNvbGxlY3RpbmcgYWxsIG1ldGFkYXRhIGZvciBhbGwgc3RyZWFtcyIpOworCisgIC8qIEJ1aWxkIGNvbXBsZXRlIGluZGV4ICovCisgIGZvciAoaSA9IDA7IGkgPCBxdGRlbXV4LT5uX3N0cmVhbXM7IGkrKykgeworICAgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbSA9IHF0ZGVtdXgtPnN0cmVhbXNbaV07CisKKyAgICBpZiAoIXF0ZGVtdXhfcGFyc2Vfc2FtcGxlcyAocXRkZW11eCwgc3RyZWFtLCBzdHJlYW0tPm5fc2FtcGxlcyAtIDEpKQorICAgICAgZ290byBwYXJzZV9lcnJvcjsKKyAgfQorICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK3BhcnNlX2Vycm9yOgorICB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICJCdWlsZGluZyBjb21wbGV0ZSBpbmRleCBvZiBzdHJlYW0gJXUgZm9yIHNlZWtpbmcgZmFpbGVkISIsIGkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9xdGRlbXV4X2hhbmRsZV9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisgIEdzdFFURGVtdXggKnF0ZGVtdXggPSBHU1RfUVRERU1VWCAocGFyZW50KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TRUVLOgorICAgIHsKKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgICAgICBHc3RDbG9ja1RpbWUgdHMgPSBnc3RfdXRpbF9nZXRfdGltZXN0YW1wICgpOworI2VuZGlmCisgICAgICBndWludDMyIHNlcW51bSA9IGdzdF9ldmVudF9nZXRfc2VxbnVtIChldmVudCk7CisKKyAgICAgIGlmIChzZXFudW0gPT0gcXRkZW11eC0+c2VnbWVudF9zZXFudW0pIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhZCwKKyAgICAgICAgICAgICJEcm9wIGR1cGxpY2F0ZWQgU0VFSyBldmVudCBzZXFudW0gJSIgR19HVUlOVDMyX0ZPUk1BVCwgc2VxbnVtKTsKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorCisgICAgICBpZiAocXRkZW11eC0+dXBzdHJlYW1fZm9ybWF0X2lzX3RpbWUgJiYgcXRkZW11eC0+ZnJhZ21lbnRlZCkgeworICAgICAgICAvKiBzZWVrIHNob3VsZCBiZSBoYW5kbGVkIGJ5IHVwc3RyZWFtLCB3ZSBtaWdodCBuZWVkIHRvIHJlLWRvd25sb2FkIGZyYWdtZW50cyAqLworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICAgImxldCB1cHN0cmVhbSBoYW5kbGUgc2VlayBmb3IgZnJhZ21lbnRlZCBwbGF5YmFjayIpOworICAgICAgICBnb3RvIHVwc3RyZWFtOworICAgICAgfQorCisgICAgICAvKiBCdWlsZCBjb21wbGV0ZSBpbmRleCBmb3Igc2Vla2luZzsKKyAgICAgICAqIGlmIG5vdCBhIGZyYWdtZW50ZWQgZmlsZSBhdCBsZWFzdCAqLworICAgICAgaWYgKCFxdGRlbXV4LT5mcmFnbWVudGVkKQorICAgICAgICBpZiAoIXF0ZGVtdXhfZW5zdXJlX2luZGV4IChxdGRlbXV4KSkKKyAgICAgICAgICBnb3RvIGluZGV4X2ZhaWxlZDsKKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgICAgICB0cyA9IGdzdF91dGlsX2dldF90aW1lc3RhbXAgKCkgLSB0czsKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAiVGltZSB0YWtlbiB0byBwYXJzZSBpbmRleCAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHRzKSk7CisjZW5kaWYKKyAgICB9CisgICAgICBpZiAocXRkZW11eC0+cHVsbGJhc2VkKSB7CisgICAgICAgIHJlcyA9IGdzdF9xdGRlbXV4X2RvX3NlZWsgKHF0ZGVtdXgsIHBhZCwgZXZlbnQpOworICAgICAgfSBlbHNlIGlmIChnc3RfcGFkX3B1c2hfZXZlbnQgKHF0ZGVtdXgtPnNpbmtwYWQsIGdzdF9ldmVudF9yZWYgKGV2ZW50KSkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIlVwc3RyZWFtIHN1Y2Nlc3NmdWxseSBzZWVrZWQiKTsKKyAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgIH0gZWxzZSBpZiAocXRkZW11eC0+c3RhdGUgPT0gUVRERU1VWF9TVEFURV9NT1ZJRSAmJiBxdGRlbXV4LT5uX3N0cmVhbXMKKyAgICAgICAgICAmJiAhcXRkZW11eC0+ZnJhZ21lbnRlZCkgeworICAgICAgICByZXMgPSBnc3RfcXRkZW11eF9kb19wdXNoX3NlZWsgKHF0ZGVtdXgsIHBhZCwgZXZlbnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICJpZ25vcmluZyBzZWVrIGluIHB1c2ggbW9kZSBpbiBjdXJyZW50IHN0YXRlIik7CisgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgfQorICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgIHVwc3RyZWFtOgorICAgICAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworZG9uZToKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK2luZGV4X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJJbmRleCBmYWlsZWQiKTsKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICByZXMgPSBGQUxTRTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworLyogRmluZCwgZm9yIGVhY2ggdHJhY2ssIHRoZSBmaXJzdCBzYW1wbGUgaW4gY29kaW5nIG9yZGVyIHRoYXQgaGFzIGEgZmlsZSBvZmZzZXQgPj0gQGJ5dGVfcG9zLgorICoKKyAqIElmIEBmdyBpcyBmYWxzZSwgdGhlIGNvZGluZyBvcmRlciBpcyBleHBsb3JlZCBiYWNrd2FyZHMuCisgKgorICogSWYgQHNldCBpcyB0cnVlLCBlYWNoIHN0cmVhbSB3aWxsIGJlIG1vdmVkIHRvIGl0cyBtYXRjaGVkIHNhbXBsZSwgb3IgRU9TIGlmIG5vIG1hdGNoaW5nCisgKiBzYW1wbGUgaXMgZm91bmQgZm9yIHRoYXQgdHJhY2suCisgKgorICogVGhlIHN0cmVhbSBhbmQgc2FtcGxlIGluZGV4IG9mIHRoZSBzYW1wbGUgd2l0aCB0aGUgbWluaW11bSBvZmZzZXQgaW4gdGhlIGRpcmVjdGlvbiBleHBsb3JlZAorICogKHNlZSBAZncpIGlzIHJldHVybmVkIGluIHRoZSBvdXRwdXQgcGFyYW1ldGVycyBAX3N0cmVhbSBhbmQgQF9pbmRleCByZXNwZWN0aXZlbHkuCisgKgorICogQF90aW1lIGlzIHNldCB0byB0aGUgUVRTQU1QTEVfUFRTIG9mIHRoZSBtYXRjaGVkIHNhbXBsZSB3aXRoIHRoZSBtaW5pbXVtIFFUU0FNUExFX1BUUyBpbiB0aGUKKyAqIGRpcmVjdGlvbiBleHBsb3JlZCwgd2hpY2ggbWF5IG5vdCBhbHdheXMgbWF0Y2ggdGhlIFFUU0FNUExFX1BUUyBvZiB0aGUgc2FtcGxlIHJldHVybmVkIGluCisgKiBAX3N0cmVhbSBhbmQgQF9pbmRleC4gKi8KK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9maW5kX3NhbXBsZSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIGdpbnQ2NCBieXRlX3BvcywgZ2Jvb2xlYW4gZncsCisgICAgZ2Jvb2xlYW4gc2V0LCBRdERlbXV4U3RyZWFtICoqIF9zdHJlYW0sIGdpbnQgKiBfaW5kZXgsIGdpbnQ2NCAqIF90aW1lKQoreworICBnaW50IGksIG4sIGluZGV4OworICBnaW50NjQgdGltZSwgbWluX3RpbWU7CisgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbTsKKworICBtaW5fdGltZSA9IC0xOworICBzdHJlYW0gPSBOVUxMOworICBpbmRleCA9IC0xOworCisgIGZvciAobiA9IDA7IG4gPCBxdGRlbXV4LT5uX3N0cmVhbXM7ICsrbikgeworICAgIFF0RGVtdXhTdHJlYW0gKnN0cjsKKyAgICBnaW50IGluYzsKKyAgICBnYm9vbGVhbiBzZXRfc2FtcGxlOworCisgICAgc3RyID0gcXRkZW11eC0+c3RyZWFtc1tuXTsKKyAgICBzZXRfc2FtcGxlID0gIXNldDsKKworICAgIGlmIChmdykgeworICAgICAgaSA9IDA7CisgICAgICBpbmMgPSAxOworICAgIH0gZWxzZSB7CisgICAgICBpID0gc3RyLT5uX3NhbXBsZXMgLSAxOworICAgICAgaW5jID0gLTE7CisgICAgfQorCisgICAgZm9yICg7IChpID49IDApICYmIChpIDwgc3RyLT5uX3NhbXBsZXMpOyBpICs9IGluYykgeworICAgICAgaWYgKHN0ci0+c2FtcGxlc1tpXS5zaXplID09IDApCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAoZncgJiYgKHN0ci0+c2FtcGxlc1tpXS5vZmZzZXQgPCBieXRlX3BvcykpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAoIWZ3ICYmIChzdHItPnNhbXBsZXNbaV0ub2Zmc2V0ICsgc3RyLT5zYW1wbGVzW2ldLnNpemUgPiBieXRlX3BvcykpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvKiBtb3ZlIHN0cmVhbSB0byBmaXJzdCBhdmFpbGFibGUgc2FtcGxlICovCisgICAgICBpZiAoc2V0KSB7CisgICAgICAgIGdzdF9xdGRlbXV4X21vdmVfc3RyZWFtIChxdGRlbXV4LCBzdHIsIGkpOworICAgICAgICBzZXRfc2FtcGxlID0gVFJVRTsKKyAgICAgIH0KKworICAgICAgLyogYXZvaWQgaW5kZXggZnJvbSBzcGFyc2Ugc3RyZWFtcyBzaW5jZSB0aGV5IG1pZ2h0IGJlIGZhciBhd2F5ICovCisgICAgICBpZiAoIUNVUl9TVFJFQU0gKHN0ciktPnNwYXJzZSkgeworICAgICAgICAvKiBkZXRlcm1pbmUgbWluL21heCB0aW1lICovCisgICAgICAgIHRpbWUgPSBRVFNBTVBMRV9QVFMgKHN0ciwgJnN0ci0+c2FtcGxlc1tpXSk7CisgICAgICAgIGlmIChtaW5fdGltZSA9PSAtMSB8fCAoIWZ3ICYmIHRpbWUgPiBtaW5fdGltZSkgfHwKKyAgICAgICAgICAgIChmdyAmJiB0aW1lIDwgbWluX3RpbWUpKSB7CisgICAgICAgICAgbWluX3RpbWUgPSB0aW1lOworICAgICAgICB9CisKKyAgICAgICAgLyogZGV0ZXJtaW5lIHN0cmVhbSB3aXRoIGxlYWRpbmcgc2FtcGxlLCB0byBnZXQgaXRzIHBvc2l0aW9uICovCisgICAgICAgIGlmICghc3RyZWFtIHx8CisgICAgICAgICAgICAoZncgJiYgKHN0ci0+c2FtcGxlc1tpXS5vZmZzZXQgPCBzdHJlYW0tPnNhbXBsZXNbaW5kZXhdLm9mZnNldCkpIHx8CisgICAgICAgICAgICAoIWZ3ICYmIChzdHItPnNhbXBsZXNbaV0ub2Zmc2V0ID4gc3RyZWFtLT5zYW1wbGVzW2luZGV4XS5vZmZzZXQpKSkgeworICAgICAgICAgIHN0cmVhbSA9IHN0cjsKKyAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIG5vIHNhbXBsZSBmb3IgdGhpcyBzdHJlYW0sIG1hcmsgZW9zICovCisgICAgaWYgKCFzZXRfc2FtcGxlKQorICAgICAgZ3N0X3F0ZGVtdXhfbW92ZV9zdHJlYW0gKHF0ZGVtdXgsIHN0ciwgc3RyLT5uX3NhbXBsZXMpOworICB9CisKKyAgaWYgKF90aW1lKQorICAgICpfdGltZSA9IG1pbl90aW1lOworICBpZiAoX3N0cmVhbSkKKyAgICAqX3N0cmVhbSA9IHN0cmVhbTsKKyAgaWYgKF9pbmRleCkKKyAgICAqX2luZGV4ID0gaW5kZXg7Cit9CisKK3N0YXRpYyBRdERlbXV4U3RyZWFtICoKK19jcmVhdGVfc3RyZWFtICh2b2lkKQoreworICBRdERlbXV4U3RyZWFtICpzdHJlYW07CisKKyAgc3RyZWFtID0gZ19uZXcwIChRdERlbXV4U3RyZWFtLCAxKTsKKyAgLyogbmV3IHN0cmVhbXMgYWx3YXlzIG5lZWQgYSBkaXNjb250ICovCisgIHN0cmVhbS0+ZGlzY29udCA9IFRSVUU7CisgIC8qIHdlIGVuYWJsZSBjbGlwcGluZyBmb3IgcmF3IGF1ZGlvL3ZpZGVvIHN0cmVhbXMgKi8KKyAgc3RyZWFtLT5uZWVkX2NsaXAgPSBGQUxTRTsKKyAgc3RyZWFtLT5uZWVkX3Byb2Nlc3MgPSBGQUxTRTsKKyAgc3RyZWFtLT5zZWdtZW50X2luZGV4ID0gLTE7CisgIHN0cmVhbS0+dGltZV9wb3NpdGlvbiA9IDA7CisgIHN0cmVhbS0+c2FtcGxlX2luZGV4ID0gLTE7CisgIHN0cmVhbS0+b2Zmc2V0X2luX3NhbXBsZSA9IDA7CisgIHN0cmVhbS0+bmV3X3N0cmVhbSA9IFRSVUU7CisgIHN0cmVhbS0+bXVsdGl2aWV3X21vZGUgPSBHU1RfVklERU9fTVVMVElWSUVXX01PREVfTk9ORTsKKyAgc3RyZWFtLT5tdWx0aXZpZXdfZmxhZ3MgPSBHU1RfVklERU9fTVVMVElWSUVXX0ZMQUdTX05PTkU7CisgIHN0cmVhbS0+cHJvdGVjdGVkID0gRkFMU0U7CisgIHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfdHlwZSA9IDA7CisgIHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfdmVyc2lvbiA9IDA7CisgIHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfaW5mbyA9IE5VTEw7CisgIHN0cmVhbS0+bl9zYW1wbGVzX21vb2YgPSAwOworICBzdHJlYW0tPmR1cmF0aW9uX21vb2YgPSAwOworICBzdHJlYW0tPmR1cmF0aW9uX2xhc3RfbW9vZiA9IDA7CisgIHN0cmVhbS0+YWxpZ25tZW50ID0gMTsKKyAgc3RyZWFtLT5zdHJlYW1fdGFncyA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIGdzdF90YWdfbGlzdF9zZXRfc2NvcGUgKHN0cmVhbS0+c3RyZWFtX3RhZ3MsIEdTVF9UQUdfU0NPUEVfU1RSRUFNKTsKKyAgZ19xdWV1ZV9pbml0ICgmc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV9ldmVudF9xdWV1ZSk7CisgIHJldHVybiBzdHJlYW07Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3F0ZGVtdXhfc2V0Y2FwcyAoR3N0UVREZW11eCAqIGRlbXV4LCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGNvbnN0IGdjaGFyICp2YXJpYW50OworICBjb25zdCBHc3RDYXBzICptZWRpYWNhcHMgPSBOVUxMOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiU2luayBzZXQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICB2YXJpYW50ID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJ2YXJpYW50Iik7CisKKyAgaWYgKHZhcmlhbnQgJiYgc3RyY21wICh2YXJpYW50LCAibXNzLWZyYWdtZW50ZWQiKSA9PSAwKSB7CisgICAgUXREZW11eFN0cmVhbSAqc3RyZWFtOworICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWU7CisKKyAgICBkZW11eC0+ZnJhZ21lbnRlZCA9IFRSVUU7CisgICAgZGVtdXgtPm1zc19tb2RlID0gVFJVRTsKKworICAgIGlmIChkZW11eC0+bl9zdHJlYW1zID4gMSkgeworICAgICAgLyogY2FuJ3QgZG8gdGhpcywgd2UgY2FuIG9ubHkgcmVuZWdvdGlhdGUgZm9yIGFub3RoZXIgbXNzIGZvcm1hdCAqLworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgIm1lZGlhLWNhcHMiKTsKKyAgICAvKiBjcmVhdGUgc3RyZWFtICovCisgICAgaWYgKHZhbHVlKSB7CisgICAgICBjb25zdCBHVmFsdWUgKnRpbWVzY2FsZV92OworCisgICAgICAvKiBUT0RPIHVwZGF0ZSB3aGVuIHN0cmVhbSBjaGFuZ2VzIGR1cmluZyBwbGF5YmFjayAqLworCisgICAgICBpZiAoZGVtdXgtPm5fc3RyZWFtcyA9PSAwKSB7CisgICAgICAgIHN0cmVhbSA9IF9jcmVhdGVfc3RyZWFtICgpOworICAgICAgICBkZW11eC0+c3RyZWFtc1tkZW11eC0+bl9zdHJlYW1zXSA9IHN0cmVhbTsKKyAgICAgICAgZGVtdXgtPm5fc3RyZWFtcyA9IDE7CisgICAgICAgIC8qIG1zcyBoYXMgbm8gc3RzZC9zdHNkIGVudHJ5LCB1c2UgaWQgMCBhcyBkZWZhdWx0ICovCisgICAgICAgIHN0cmVhbS0+c3RzZF9lbnRyaWVzX2xlbmd0aCA9IDE7CisgICAgICAgIHN0cmVhbS0+c3RzZF9zYW1wbGVfZGVzY3JpcHRpb25faWQgPSBzdHJlYW0tPmN1cl9zdHNkX2VudHJ5X2luZGV4ID0gMDsKKyAgICAgICAgc3RyZWFtLT5zdHNkX2VudHJpZXMgPSBnX25ldzAgKFF0RGVtdXhTdHJlYW1TdHNkRW50cnksIDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyZWFtID0gZGVtdXgtPnN0cmVhbXNbMF07CisgICAgICB9CisKKyAgICAgIHRpbWVzY2FsZV92ID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgInRpbWVzY2FsZSIpOworICAgICAgaWYgKHRpbWVzY2FsZV92KSB7CisgICAgICAgIHN0cmVhbS0+dGltZXNjYWxlID0gZ192YWx1ZV9nZXRfdWludDY0ICh0aW1lc2NhbGVfdik7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBkZWZhdWx0IG1zcyB0aW1lc2NhbGUgKi8KKyAgICAgICAgc3RyZWFtLT50aW1lc2NhbGUgPSAxMDAwMDAwMDsKKyAgICAgIH0KKyAgICAgIGRlbXV4LT50aW1lc2NhbGUgPSBzdHJlYW0tPnRpbWVzY2FsZTsKKworICAgICAgbWVkaWFjYXBzID0gZ3N0X3ZhbHVlX2dldF9jYXBzICh2YWx1ZSk7CisgICAgICBpZiAoIUNVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMKKyAgICAgICAgICB8fCAhZ3N0X2NhcHNfaXNfZXF1YWxfZml4ZWQgKG1lZGlhY2FwcywgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y2FwcykpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJXZSBoYXZlIGEgbmV3IGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgICAgICBtZWRpYWNhcHMpOworICAgICAgICBzdHJlYW0tPm5ld19jYXBzID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGdzdF9jYXBzX3JlcGxhY2UgKCZDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLCAoR3N0Q2FwcyAqKSBtZWRpYWNhcHMpOworICAgICAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAobWVkaWFjYXBzLCAwKTsKKyAgICAgIGlmIChnX3N0cl9oYXNfcHJlZml4IChnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzdHJ1Y3R1cmUpLCAidmlkZW8iKSkgeworICAgICAgICBzdHJlYW0tPnN1YnR5cGUgPSBGT1VSQ0NfdmlkZTsKKworICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgIndpZHRoIiwgJkNVUl9TVFJFQU0gKHN0cmVhbSktPndpZHRoKTsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJoZWlnaHQiLAorICAgICAgICAgICAgJkNVUl9TVFJFQU0gKHN0cmVhbSktPmhlaWdodCk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ZyYWN0aW9uIChzdHJ1Y3R1cmUsICJmcmFtZXJhdGUiLAorICAgICAgICAgICAgJkNVUl9TVFJFQU0gKHN0cmVhbSktPmZwc19uLCAmQ1VSX1NUUkVBTSAoc3RyZWFtKS0+ZnBzX2QpOworICAgICAgfSBlbHNlIGlmIChnX3N0cl9oYXNfcHJlZml4IChnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzdHJ1Y3R1cmUpLCAiYXVkaW8iKSkgeworICAgICAgICBnaW50IHJhdGUgPSAwOworICAgICAgICBzdHJlYW0tPnN1YnR5cGUgPSBGT1VSQ0Nfc291bjsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsCisgICAgICAgICAgICAmQ1VSX1NUUkVBTSAoc3RyZWFtKS0+bl9jaGFubmVscyk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAicmF0ZSIsICZyYXRlKTsKKyAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cmF0ZSA9IHJhdGU7CisgICAgICB9CisgICAgfQorICAgIGdzdF9jYXBzX3JlcGxhY2UgKCZkZW11eC0+bWVkaWFfY2FwcywgKEdzdENhcHMgKikgbWVkaWFjYXBzKTsKKyAgfSBlbHNlIHsKKyAgICBkZW11eC0+bXNzX21vZGUgPSBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfcmVzZXQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBnYm9vbGVhbiBoYXJkKQoreworICBnaW50IG47CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIlJlc2V0dGluZyBkZW11eCIpOworICBnc3RfcGFkX3N0b3BfdGFzayAocXRkZW11eC0+c2lua3BhZCk7CisKKyAgaWYgKGhhcmQgfHwgcXRkZW11eC0+dXBzdHJlYW1fZm9ybWF0X2lzX3RpbWUpIHsKKyAgICBxdGRlbXV4LT5zdGF0ZSA9IFFUREVNVVhfU1RBVEVfSU5JVElBTDsKKyAgICBxdGRlbXV4LT5uZWVkZWRieXRlcyA9IDE2OworICAgIHF0ZGVtdXgtPnRvZHJvcCA9IDA7CisgICAgcXRkZW11eC0+cHVsbGJhc2VkID0gRkFMU0U7CisgICAgcXRkZW11eC0+cG9zdGVkX3JlZGlyZWN0ID0gRkFMU0U7CisgICAgcXRkZW11eC0+Zmlyc3RfbWRhdCA9IC0xOworICAgIHF0ZGVtdXgtPmhlYWRlcl9zaXplID0gMDsKKyAgICBxdGRlbXV4LT5tZGF0b2Zmc2V0ID0gLTE7CisgICAgcXRkZW11eC0+cmVzdG9yZWRhdGFfb2Zmc2V0ID0gLTE7CisgICAgaWYgKHF0ZGVtdXgtPm1kYXRidWZmZXIpCisgICAgICBnc3RfYnVmZmVyX3VucmVmIChxdGRlbXV4LT5tZGF0YnVmZmVyKTsKKyAgICBpZiAocXRkZW11eC0+cmVzdG9yZWRhdGFfYnVmZmVyKQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocXRkZW11eC0+cmVzdG9yZWRhdGFfYnVmZmVyKTsKKyAgICBxdGRlbXV4LT5tZGF0YnVmZmVyID0gTlVMTDsKKyAgICBxdGRlbXV4LT5yZXN0b3JlZGF0YV9idWZmZXIgPSBOVUxMOworICAgIHF0ZGVtdXgtPm1kYXRsZWZ0ID0gMDsKKyAgICBxdGRlbXV4LT5tZGF0c2l6ZSA9IDA7CisgICAgaWYgKHF0ZGVtdXgtPmNvbXBfYnJhbmRzKQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocXRkZW11eC0+Y29tcF9icmFuZHMpOworICAgIHF0ZGVtdXgtPmNvbXBfYnJhbmRzID0gTlVMTDsKKyAgICBxdGRlbXV4LT5sYXN0X21vb3Zfb2Zmc2V0ID0gLTE7CisgICAgaWYgKHF0ZGVtdXgtPm1vb3Zfbm9kZV9jb21wcmVzc2VkKSB7CisgICAgICBnX25vZGVfZGVzdHJveSAocXRkZW11eC0+bW9vdl9ub2RlX2NvbXByZXNzZWQpOworICAgICAgaWYgKHF0ZGVtdXgtPm1vb3Zfbm9kZSkKKyAgICAgICAgZ19mcmVlIChxdGRlbXV4LT5tb292X25vZGUtPmRhdGEpOworICAgIH0KKyAgICBxdGRlbXV4LT5tb292X25vZGVfY29tcHJlc3NlZCA9IE5VTEw7CisgICAgaWYgKHF0ZGVtdXgtPm1vb3Zfbm9kZSkKKyAgICAgIGdfbm9kZV9kZXN0cm95IChxdGRlbXV4LT5tb292X25vZGUpOworICAgIHF0ZGVtdXgtPm1vb3Zfbm9kZSA9IE5VTEw7CisgICAgaWYgKHF0ZGVtdXgtPnRhZ19saXN0KQorICAgICAgZ3N0X21pbmlfb2JqZWN0X3VucmVmIChHU1RfTUlOSV9PQkpFQ1RfQ0FTVCAocXRkZW11eC0+dGFnX2xpc3QpKTsKKyAgICBxdGRlbXV4LT50YWdfbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgICAgZ3N0X3RhZ19saXN0X3NldF9zY29wZSAocXRkZW11eC0+dGFnX2xpc3QsIEdTVF9UQUdfU0NPUEVfR0xPQkFMKTsKKyNpZiAwCisgICAgaWYgKHF0ZGVtdXgtPmVsZW1lbnRfaW5kZXgpCisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChxdGRlbXV4LT5lbGVtZW50X2luZGV4KTsKKyAgICBxdGRlbXV4LT5lbGVtZW50X2luZGV4ID0gTlVMTDsKKyNlbmRpZgorICAgIHF0ZGVtdXgtPm1ham9yX2JyYW5kID0gMDsKKyAgICBpZiAocXRkZW11eC0+cGVuZGluZ19uZXdzZWdtZW50KQorICAgICAgZ3N0X2V2ZW50X3VucmVmIChxdGRlbXV4LT5wZW5kaW5nX25ld3NlZ21lbnQpOworICAgIHF0ZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCA9IE5VTEw7CisgICAgcXRkZW11eC0+dXBzdHJlYW1fZm9ybWF0X2lzX3RpbWUgPSBGQUxTRTsKKyAgICBxdGRlbXV4LT51cHN0cmVhbV9zZWVrYWJsZSA9IEZBTFNFOworICAgIHF0ZGVtdXgtPnVwc3RyZWFtX3NpemUgPSAwOworCisgICAgcXRkZW11eC0+ZnJhZ21lbnRfc3RhcnQgPSAtMTsKKyAgICBxdGRlbXV4LT5mcmFnbWVudF9zdGFydF9vZmZzZXQgPSAtMTsKKyAgICBxdGRlbXV4LT5kdXJhdGlvbiA9IDA7CisgICAgcXRkZW11eC0+bW9vZl9vZmZzZXQgPSAwOworICAgIHF0ZGVtdXgtPmNoYXB0ZXJzX3RyYWNrX2lkID0gMDsKKyAgICBxdGRlbXV4LT5oYXZlX2dyb3VwX2lkID0gRkFMU0U7CisgICAgcXRkZW11eC0+Z3JvdXBfaWQgPSBHX01BWFVJTlQ7CisKKyAgICBnX3F1ZXVlX2ZvcmVhY2ggKCZxdGRlbXV4LT5wcm90ZWN0aW9uX2V2ZW50X3F1ZXVlLCAoR0Z1bmMpIGdzdF9ldmVudF91bnJlZiwKKyAgICAgICAgTlVMTCk7CisgICAgZ19xdWV1ZV9jbGVhciAoJnF0ZGVtdXgtPnByb3RlY3Rpb25fZXZlbnRfcXVldWUpOworICB9CisgIHF0ZGVtdXgtPm9mZnNldCA9IDA7CisgIGdzdF9hZGFwdGVyX2NsZWFyIChxdGRlbXV4LT5hZGFwdGVyKTsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnF0ZGVtdXgtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIHF0ZGVtdXgtPnNlZ21lbnRfc2VxbnVtID0gR1NUX1NFUU5VTV9JTlZBTElEOworCisgIGlmIChoYXJkKSB7CisgICAgZm9yIChuID0gMDsgbiA8IHF0ZGVtdXgtPm5fc3RyZWFtczsgbisrKSB7CisgICAgICBnc3RfcXRkZW11eF9zdHJlYW1fZnJlZSAocXRkZW11eCwgcXRkZW11eC0+c3RyZWFtc1tuXSk7CisgICAgICBxdGRlbXV4LT5zdHJlYW1zW25dID0gTlVMTDsKKyAgICB9CisgICAgcXRkZW11eC0+bl9zdHJlYW1zID0gMDsKKyAgICBxdGRlbXV4LT5uX3ZpZGVvX3N0cmVhbXMgPSAwOworICAgIHF0ZGVtdXgtPm5fYXVkaW9fc3RyZWFtcyA9IDA7CisgICAgcXRkZW11eC0+bl9zdWJfc3RyZWFtcyA9IDA7CisgICAgcXRkZW11eC0+ZXhwb3NlZCA9IEZBTFNFOworICAgIHF0ZGVtdXgtPmZyYWdtZW50ZWQgPSBGQUxTRTsKKyAgICBxdGRlbXV4LT5tc3NfbW9kZSA9IEZBTFNFOworICAgIGdzdF9jYXBzX3JlcGxhY2UgKCZxdGRlbXV4LT5tZWRpYV9jYXBzLCBOVUxMKTsKKyAgICBxdGRlbXV4LT50aW1lc2NhbGUgPSAwOworICAgIHF0ZGVtdXgtPmdvdF9tb292ID0gRkFMU0U7CisgICAgaWYgKHF0ZGVtdXgtPnByb3RlY3Rpb25fc3lzdGVtX2lkcykgeworICAgICAgZ19wdHJfYXJyYXlfZnJlZSAocXRkZW11eC0+cHJvdGVjdGlvbl9zeXN0ZW1faWRzLCBUUlVFKTsKKyAgICAgIHF0ZGVtdXgtPnByb3RlY3Rpb25fc3lzdGVtX2lkcyA9IE5VTEw7CisgICAgfQorICB9IGVsc2UgaWYgKHF0ZGVtdXgtPm1zc19tb2RlKSB7CisgICAgZ3N0X2Zsb3dfY29tYmluZXJfcmVzZXQgKHF0ZGVtdXgtPmZsb3djb21iaW5lcik7CisgICAgZm9yIChuID0gMDsgbiA8IHF0ZGVtdXgtPm5fc3RyZWFtczsgbisrKQorICAgICAgZ3N0X3F0ZGVtdXhfc3RyZWFtX2NsZWFyIChxdGRlbXV4LCBxdGRlbXV4LT5zdHJlYW1zW25dKTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfZmxvd19jb21iaW5lcl9yZXNldCAocXRkZW11eC0+Zmxvd2NvbWJpbmVyKTsKKyAgICBmb3IgKG4gPSAwOyBuIDwgcXRkZW11eC0+bl9zdHJlYW1zOyBuKyspIHsKKyAgICAgIHF0ZGVtdXgtPnN0cmVhbXNbbl0tPnNlbnRfZW9zID0gRkFMU0U7CisgICAgICBxdGRlbXV4LT5zdHJlYW1zW25dLT50aW1lX3Bvc2l0aW9uID0gMDsKKyAgICAgIHF0ZGVtdXgtPnN0cmVhbXNbbl0tPmFjY3VtdWxhdGVkX2Jhc2UgPSAwOworICAgIH0KKyAgICBpZiAoIXF0ZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCkgeworICAgICAgcXRkZW11eC0+cGVuZGluZ19uZXdzZWdtZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmcXRkZW11eC0+c2VnbWVudCk7CisgICAgICBpZiAocXRkZW11eC0+c2VnbWVudF9zZXFudW0gIT0gR1NUX1NFUU5VTV9JTlZBTElEKQorICAgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAocXRkZW11eC0+cGVuZGluZ19uZXdzZWdtZW50LAorICAgICAgICAgICAgcXRkZW11eC0+c2VnbWVudF9zZXFudW0pOworICAgIH0KKyAgfQorfQorCisKKy8qIE1hcHMgdGhlIEBzZWdtZW50IHRvIHRoZSBxdCBlZHRzIGludGVybmFsIHNlZ21lbnRzIGFuZCBwdXNoZXMKKyAqIHRoZSBjb3JyZXNwbmRpbmcgc2VnbWVudCBldmVudC4KKyAqCisgKiBJZiBpdCBlbmRzIHVwIGJlaW5nIGF0IGEgZW1wdHkgc2VnbWVudCwgYSBnYXAgd2lsbCBiZSBwdXNoZWQgYW5kIHRoZSBuZXh0CisgKiBlZHRzIHNlZ21lbnQgd2lsbCBiZSBhY3RpdmF0ZWQgaW4gc2VxdWVuY2UuCisgKgorICogVG8gYmUgdXNlZCBpbiBwdXNoLW1vZGUgb25seSAqLworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X21hcF9hbmRfcHVzaF9zZWdtZW50cyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdFNlZ21lbnQgKiBzZWdtZW50KQoreworICBnaW50IG4sIGk7CisKKyAgZm9yIChuID0gMDsgbiA8IHF0ZGVtdXgtPm5fc3RyZWFtczsgbisrKSB7CisgICAgUXREZW11eFN0cmVhbSAqc3RyZWFtID0gcXRkZW11eC0+c3RyZWFtc1tuXTsKKworICAgIHN0cmVhbS0+dGltZV9wb3NpdGlvbiA9IHNlZ21lbnQtPnN0YXJ0OworCisgICAgLyogaW4gcHVzaCBtb2RlIHdlIHNob3VsZCBiZSBndWFyYW50ZWVkIHRoYXQgd2Ugd2lsbCBoYXZlIGVtcHR5IHNlZ21lbnRzCisgICAgICogYXQgdGhlIGJlZ2lubmluZyBhbmQgdGhlbiBvbmUgc2VnbWVudCBhZnRlciwgb3RoZXIgc2NlbmFyaW9zIGFyZSBub3QKKyAgICAgKiBzdXBwb3J0ZWQgYW5kIGFyZSBkaXNjYXJkZWQgd2hlbiBwYXJzaW5nIHRoZSBlZHRzICovCisgICAgZm9yIChpID0gMDsgaSA8IHN0cmVhbS0+bl9zZWdtZW50czsgaSsrKSB7CisgICAgICBpZiAoc3RyZWFtLT5zZWdtZW50c1tpXS5zdG9wX3RpbWUgPiBzZWdtZW50LT5zdGFydCkgeworICAgICAgICBnc3RfcXRkZW11eF9hY3RpdmF0ZV9zZWdtZW50IChxdGRlbXV4LCBzdHJlYW0sIGksCisgICAgICAgICAgICBzdHJlYW0tPnRpbWVfcG9zaXRpb24pOworICAgICAgICBpZiAoUVRTRUdNRU5UX0lTX0VNUFRZICgmc3RyZWFtLT5zZWdtZW50c1tpXSkpIHsKKyAgICAgICAgICAvKiBwdXNoIHRoZSBlbXB0eSBzZWdtZW50IGFuZCBtb3ZlIHRvIHRoZSBuZXh0IG9uZSAqLworICAgICAgICAgIGdzdF9xdGRlbXV4X3NlbmRfZ2FwX2Zvcl9zZWdtZW50IChxdGRlbXV4LCBzdHJlYW0sIGksCisgICAgICAgICAgICAgIHN0cmVhbS0+dGltZV9wb3NpdGlvbik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBnX2Fzc2VydCAoaSA9PSBzdHJlYW0tPm5fc2VnbWVudHMgLSAxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcXRkZW11eF9oYW5kbGVfc2lua19ldmVudCAoR3N0UGFkICogc2lua3BhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFFURGVtdXggKmRlbXV4ID0gR1NUX1FUREVNVVggKHBhcmVudCk7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiaGFuZGxpbmcgJXMgZXZlbnQiLCBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6CisgICAgeworICAgICAgZ2ludDY0IG9mZnNldCA9IDA7CisgICAgICBRdERlbXV4U3RyZWFtICpzdHJlYW07CisgICAgICBnaW50IGlkeDsKKyAgICAgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICAgICAgLyogc29tZSBkZWJ1ZyBvdXRwdXQgKi8KKyAgICAgIGdzdF9ldmVudF9jb3B5X3NlZ21lbnQgKGV2ZW50LCAmc2VnbWVudCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInJlY2VpdmVkIG5ld3NlZ21lbnQgJSIgR1NUX1NFR01FTlRfRk9STUFULAorICAgICAgICAgICZzZWdtZW50KTsKKworICAgICAgLyogZXJhc2UgYW55IHByZXZpb3VzbHkgc2V0IHNlZ21lbnQgKi8KKyAgICAgIGdzdF9ldmVudF9yZXBsYWNlICgmZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCwgTlVMTCk7CisKKyAgICAgIGlmIChzZWdtZW50LmZvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJuZXcgcGVuZGluZ19uZXdzZWdtZW50Iik7CisgICAgICAgIGdzdF9ldmVudF9yZXBsYWNlICgmZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCwgZXZlbnQpOworICAgICAgICBkZW11eC0+dXBzdHJlYW1fZm9ybWF0X2lzX3RpbWUgPSBUUlVFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJOb3Qgc3RvcmluZyB1cHN0cmVhbSBuZXdzZWdtZW50LCAiCisgICAgICAgICAgICAibm90IGluIHRpbWUgZm9ybWF0Iik7CisKKyAgICAgICAgLyogY2hhaW4gd2lsbCBzZW5kIGluaXRpYWwgbmV3c2VnbWVudCBhZnRlciBwYWRzIGhhdmUgYmVlbiBhZGRlZCAqLworICAgICAgICBpZiAoZGVtdXgtPnN0YXRlICE9IFFUREVNVVhfU1RBVEVfTU9WSUUgfHwgIWRlbXV4LT5uX3N0cmVhbXMpIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInN0aWxsIHN0YXJ0aW5nLCBlYXRpbmcgZXZlbnQiKTsKKyAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogY2hlY2sgaWYgdGhpcyBtYXRjaGVzIGEgdGltZSBzZWVrIHdlIHJlY2VpdmVkIHByZXZpb3VzbHkKKyAgICAgICAqIEZJWE1FIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zIHdlIHVzZSB0aGUKKyAgICAgICAqIHNlZWtfb2Zmc2V0IGhlcmUgdG8gY29tcGFyZS4gSW4gdGhlIGZ1dHVyZSB3ZSBtaWdodCB3YW50IHRvCisgICAgICAgKiBjaGFuZ2UgdGhpcyB0byB1c2UgdGhlIHNlcW51bSBhcyBpdCB1bmlxdWVseSBzaG91bGQgaWRlbnRpZnkKKyAgICAgICAqIHRoZSBzZWdtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHNlZWsuICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlN0b3JlZCBzZWVrIG9mZnNldDogJSIgR19HSU5UNjRfRk9STUFUCisgICAgICAgICAgIiwgcmVjZWl2ZWQgc2VnbWVudCBvZmZzZXQgJSIgR19HSU5UNjRfRk9STUFULAorICAgICAgICAgIGRlbXV4LT5zZWVrX29mZnNldCwgc2VnbWVudC5zdGFydCk7CisgICAgICBpZiAoc2VnbWVudC5mb3JtYXQgPT0gR1NUX0ZPUk1BVF9CWVRFUworICAgICAgICAgICYmIGRlbXV4LT5zZWVrX29mZnNldCA9PSBzZWdtZW50LnN0YXJ0KSB7CisgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICAgICAgICBvZmZzZXQgPSBzZWdtZW50LnN0YXJ0OworCisgICAgICAgIHNlZ21lbnQuZm9ybWF0ID0gR1NUX0ZPUk1BVF9USU1FOworICAgICAgICBzZWdtZW50LnN0YXJ0ID0gZGVtdXgtPnB1c2hfc2Vla19zdGFydDsKKyAgICAgICAgc2VnbWVudC5zdG9wID0gZGVtdXgtPnB1c2hfc2Vla19zdG9wOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlJlcGxhY2VkIHNlZ21lbnQgd2l0aCBzdG9yZWQgc2VlayAiCisgICAgICAgICAgICAic2VnbWVudCAlIiBHU1RfVElNRV9GT1JNQVQgIiAtICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHNlZ21lbnQuc3RhcnQpLCBHU1RfVElNRV9BUkdTIChzZWdtZW50LnN0b3ApKTsKKyAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKyAgICAgIH0KKworICAgICAgLyogd2Ugb25seSBleHBlY3QgYSBCWVRFIHNlZ21lbnQsIGUuZy4gZm9sbG93aW5nIGEgc2VlayAqLworICAgICAgaWYgKHNlZ21lbnQuZm9ybWF0ID09IEdTVF9GT1JNQVRfQllURVMpIHsKKyAgICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzZWdtZW50LnN0YXJ0KSkgeworICAgICAgICAgIG9mZnNldCA9IHNlZ21lbnQuc3RhcnQ7CisKKyAgICAgICAgICBnc3RfcXRkZW11eF9maW5kX3NhbXBsZSAoZGVtdXgsIHNlZ21lbnQuc3RhcnQsIFRSVUUsIEZBTFNFLCBOVUxMLAorICAgICAgICAgICAgICBOVUxMLCAoZ2ludDY0ICopICYgc2VnbWVudC5zdGFydCk7CisgICAgICAgICAgaWYgKChnaW50NjQpIHNlZ21lbnQuc3RhcnQgPCAwKQorICAgICAgICAgICAgc2VnbWVudC5zdGFydCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzZWdtZW50LnN0b3ApKSB7CisgICAgICAgICAgZ3N0X3F0ZGVtdXhfZmluZF9zYW1wbGUgKGRlbXV4LCBzZWdtZW50LnN0b3AsIEZBTFNFLCBGQUxTRSwgTlVMTCwKKyAgICAgICAgICAgICAgTlVMTCwgKGdpbnQ2NCAqKSAmIHNlZ21lbnQuc3RvcCk7CisgICAgICAgICAgLyoga2V5ZnJhbWUgc2Vla2luZyBzaG91bGQgYWxyZWFkeSBhcnJhbmdlIGZvciBzdGFydCA+PSBzdG9wLAorICAgICAgICAgICAqIGJ1dCBtYWtlIHN1cmUgaW4gb3RoZXIgcmFyZSBjYXNlcyAqLworICAgICAgICAgIHNlZ21lbnQuc3RvcCA9IE1BWCAoc2VnbWVudC5zdG9wLCBzZWdtZW50LnN0YXJ0KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChzZWdtZW50LmZvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICAgICAgLyogcHVzaCBhbGwgZGF0YSBvbiB0aGUgYWRhcHRlciBiZWZvcmUgc3RhcnRpbmcgdGhpcworICAgICAgICAgKiBuZXcgc2VnbWVudCAqLworICAgICAgICBnc3RfcXRkZW11eF9wcm9jZXNzX2FkYXB0ZXIgKGRlbXV4LCBUUlVFKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAidW5zdXBwb3J0ZWQgc2VnbWVudCBmb3JtYXQsIGlnbm9yaW5nIik7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgIH0KKworICAgICAgLyogV2Ugc2hvdWxkbid0IG1vZGlmeSB1cHN0cmVhbSBkcml2ZW4gVElNRSBGT1JNQVQgc2VnbWVudCAqLworICAgICAgaWYgKCFkZW11eC0+dXBzdHJlYW1fZm9ybWF0X2lzX3RpbWUpIHsKKyAgICAgICAgLyogYWNjZXB0IHVwc3RyZWFtJ3Mgbm90aW9uIG9mIHNlZ21lbnQgYW5kIGRpc3RyaWJ1dGUgYWxvbmcgKi8KKyAgICAgICAgc2VnbWVudC5mb3JtYXQgPSBHU1RfRk9STUFUX1RJTUU7CisgICAgICAgIHNlZ21lbnQucG9zaXRpb24gPSBzZWdtZW50LnRpbWUgPSBzZWdtZW50LnN0YXJ0OworICAgICAgICBzZWdtZW50LmR1cmF0aW9uID0gZGVtdXgtPnNlZ21lbnQuZHVyYXRpb247CisgICAgICAgIHNlZ21lbnQuYmFzZSA9IGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJmRlbXV4LT5zZWdtZW50LAorICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBkZW11eC0+c2VnbWVudC5wb3NpdGlvbik7CisgICAgICB9CisKKyAgICAgIGdzdF9zZWdtZW50X2NvcHlfaW50byAoJnNlZ21lbnQsICZkZW11eC0+c2VnbWVudCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlB1c2hpbmcgbmV3c2VnICUiIEdTVF9TRUdNRU5UX0ZPUk1BVCwgJnNlZ21lbnQpOworCisgICAgICAvKiBtYXAgc2VnbWVudCB0byBpbnRlcm5hbCBxdCBzZWdtZW50cyBhbmQgcHVzaCBvbiBlYWNoIHN0cmVhbSAqLworICAgICAgaWYgKGRlbXV4LT5uX3N0cmVhbXMpIHsKKyAgICAgICAgaWYgKGRlbXV4LT5mcmFnbWVudGVkKSB7CisgICAgICAgICAgR3N0RXZlbnQgKnNlZ21lbnRfZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KTsKKworICAgICAgICAgIGdzdF9ldmVudF9yZXBsYWNlICgmZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCwgTlVMTCk7CisgICAgICAgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKHNlZ21lbnRfZXZlbnQsIGRlbXV4LT5zZWdtZW50X3NlcW51bSk7CisgICAgICAgICAgZ3N0X3F0ZGVtdXhfcHVzaF9ldmVudCAoZGVtdXgsIHNlZ21lbnRfZXZlbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9ldmVudF9yZXBsYWNlICgmZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCwgTlVMTCk7CisgICAgICAgICAgZ3N0X3F0ZGVtdXhfbWFwX2FuZF9wdXNoX3NlZ21lbnRzIChkZW11eCwgJnNlZ21lbnQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIGNsZWFyIGxlZnRvdmVyIGluIGN1cnJlbnQgc2VnbWVudCwgaWYgYW55ICovCisgICAgICBnc3RfYWRhcHRlcl9jbGVhciAoZGVtdXgtPmFkYXB0ZXIpOworCisgICAgICAvKiBzZXQgdXAgc3RyZWFtaW5nIHRocmVhZCAqLworICAgICAgZGVtdXgtPm9mZnNldCA9IG9mZnNldDsKKyAgICAgIGlmIChkZW11eC0+dXBzdHJlYW1fZm9ybWF0X2lzX3RpbWUpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJVcHN0cmVhbSBpcyBkcml2aW5nIGluIHRpbWUgZm9ybWF0LCAiCisgICAgICAgICAgICAic2V0IHZhbHVlcyB0byByZXN0YXJ0IHJlYWRpbmcgZnJvbSBhIG5ldyBhdG9tIik7CisgICAgICAgIGRlbXV4LT5uZWVkZWRieXRlcyA9IDE2OworICAgICAgICBkZW11eC0+dG9kcm9wID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9xdGRlbXV4X2ZpbmRfc2FtcGxlIChkZW11eCwgb2Zmc2V0LCBUUlVFLCBUUlVFLCAmc3RyZWFtLCAmaWR4LAorICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIGlmIChzdHJlYW0pIHsKKyAgICAgICAgICBkZW11eC0+dG9kcm9wID0gc3RyZWFtLT5zYW1wbGVzW2lkeF0ub2Zmc2V0IC0gb2Zmc2V0OworICAgICAgICAgIGRlbXV4LT5uZWVkZWRieXRlcyA9IGRlbXV4LT50b2Ryb3AgKyBzdHJlYW0tPnNhbXBsZXNbaWR4XS5zaXplOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIHNldCB1cCBmb3IgRU9TICovCisgICAgICAgICAgZGVtdXgtPm5lZWRlZGJ5dGVzID0gLTE7CisgICAgICAgICAgZGVtdXgtPnRvZHJvcCA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICBleGl0OgorICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICByZXMgPSBUUlVFOworICAgICAgZ290byBkcm9wOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVEFSVDoKKyAgICB7CisgICAgICBpZiAoZ3N0X2V2ZW50X2dldF9zZXFudW0gKGV2ZW50KSA9PSBkZW11eC0+b2Zmc2V0X3NlZWtfc2VxbnVtKSB7CisgICAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgICBnb3RvIGRyb3A7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICB7CisgICAgICBndWludDY0IGR1cjsKKworICAgICAgZHVyID0gZGVtdXgtPnNlZ21lbnQuZHVyYXRpb247CisgICAgICBnc3RfcXRkZW11eF9yZXNldCAoZGVtdXgsIEZBTFNFKTsKKyAgICAgIGRlbXV4LT5zZWdtZW50LmR1cmF0aW9uID0gZHVyOworCisgICAgICBpZiAoZ3N0X2V2ZW50X2dldF9zZXFudW0gKGV2ZW50KSA9PSBkZW11eC0+b2Zmc2V0X3NlZWtfc2VxbnVtKSB7CisgICAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgICBnb3RvIGRyb3A7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRU9TOgorICAgICAgLyogSWYgd2UgYXJlIGluIHB1c2ggbW9kZSwgYW5kIGdldCBhbiBFT1MgYmVmb3JlIHdlJ3ZlIHNlZW4gYW55IHN0cmVhbXMsCisgICAgICAgKiB0aGVuIGVycm9yIG91dCAtIHdlIGhhdmUgbm93aGVyZSB0byBzZW5kIHRoZSBFT1MgKi8KKyAgICAgIGlmICghZGVtdXgtPnB1bGxiYXNlZCkgeworICAgICAgICBnaW50IGk7CisgICAgICAgIGdib29sZWFuIGhhc192YWxpZF9zdHJlYW0gPSBGQUxTRTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGRlbXV4LT5uX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgIGlmIChkZW11eC0+c3RyZWFtc1tpXS0+cGFkICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGhhc192YWxpZF9zdHJlYW0gPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghaGFzX3ZhbGlkX3N0cmVhbSkKKyAgICAgICAgICBnc3RfcXRkZW11eF9wb3N0X25vX3BsYXlhYmxlX3N0cmVhbV9lcnJvciAoZGVtdXgpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIkRhdGEgc3RpbGwgYXZhaWxhYmxlIGFmdGVyIEVPUzogJXUiLAorICAgICAgICAgICAgICAoZ3VpbnQpIGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoZGVtdXgtPmFkYXB0ZXIpKTsKKyAgICAgICAgICBpZiAoZ3N0X3F0ZGVtdXhfcHJvY2Vzc19hZGFwdGVyIChkZW11eCwgVFJVRSkgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfQ0FQUzp7CisgICAgICBHc3RDYXBzICpjYXBzID0gTlVMTDsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICBnc3RfcXRkZW11eF9zZXRjYXBzIChkZW11eCwgY2Fwcyk7CisgICAgICByZXMgPSBUUlVFOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBnb3RvIGRyb3A7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX1BST1RFQ1RJT046CisgICAgeworICAgICAgY29uc3QgZ2NoYXIgKnN5c3RlbV9pZCA9IE5VTEw7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9wcm90ZWN0aW9uIChldmVudCwgJnN5c3RlbV9pZCwgTlVMTCwgTlVMTCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlJlY2VpdmVkIHByb3RlY3Rpb24gZXZlbnQgZm9yIHN5c3RlbSBJRCAlcyIsCisgICAgICAgICAgc3lzdGVtX2lkKTsKKyAgICAgIGdzdF9xdGRlbXV4X2FwcGVuZF9wcm90ZWN0aW9uX3N5c3RlbV9pZCAoZGVtdXgsIHN5c3RlbV9pZCk7CisgICAgICAvKiBzYXZlIHRoZSBldmVudCBmb3IgbGF0ZXIsIGZvciBzb3VyY2UgcGFkcyB0aGF0IGhhdmUgbm90IGJlZW4gY3JlYXRlZCAqLworICAgICAgZ19xdWV1ZV9wdXNoX3RhaWwgKCZkZW11eC0+cHJvdGVjdGlvbl9ldmVudF9xdWV1ZSwgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpKTsKKyAgICAgIC8qIHNlbmQgaXQgdG8gYWxsIHBhZHMgdGhhdCBhbHJlYWR5IGV4aXN0ICovCisgICAgICBnc3RfcXRkZW11eF9wdXNoX2V2ZW50IChkZW11eCwgZXZlbnQpOworICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGdvdG8gZHJvcDsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChkZW11eC0+c2lua3BhZCwgcGFyZW50LCBldmVudCkgJiByZXM7CisKK2Ryb3A6CisgIHJldHVybiByZXM7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfc2V0X2luZGV4IChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0SW5kZXggKiBpbmRleCkKK3sKKyAgR3N0UVREZW11eCAqZGVtdXggPSBHU1RfUVRERU1VWCAoZWxlbWVudCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgIGlmIChkZW11eC0+ZWxlbWVudF9pbmRleCkKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChkZW11eC0+ZWxlbWVudF9pbmRleCk7CisgIGlmIChpbmRleCkgeworICAgIGRlbXV4LT5lbGVtZW50X2luZGV4ID0gZ3N0X29iamVjdF9yZWYgKGluZGV4KTsKKyAgfSBlbHNlIHsKKyAgICBkZW11eC0+ZWxlbWVudF9pbmRleCA9IE5VTEw7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKyAgLyogb2JqZWN0IGxvY2sgbWlnaHQgYmUgdGFrZW4gYWdhaW4gKi8KKyAgaWYgKGluZGV4KQorICAgIGdzdF9pbmRleF9nZXRfd3JpdGVyX2lkIChpbmRleCwgR1NUX09CSkVDVCAoZWxlbWVudCksICZkZW11eC0+aW5kZXhfaWQpOworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlNldCBpbmRleCAlIiBHU1RfUFRSX0ZPUk1BVCAiZm9yIHdyaXRlciBpZCAlZCIsCisgICAgICBkZW11eC0+ZWxlbWVudF9pbmRleCwgZGVtdXgtPmluZGV4X2lkKTsKK30KKworc3RhdGljIEdzdEluZGV4ICoKK2dzdF9xdGRlbXV4X2dldF9pbmRleCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdEluZGV4ICpyZXN1bHQgPSBOVUxMOworICBHc3RRVERlbXV4ICpkZW11eCA9IEdTVF9RVERFTVVYIChlbGVtZW50KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgaWYgKGRlbXV4LT5lbGVtZW50X2luZGV4KQorICAgIHJlc3VsdCA9IGdzdF9vYmplY3RfcmVmIChkZW11eC0+ZWxlbWVudF9pbmRleCk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJSZXR1cm5pbmcgaW5kZXggJSIgR1NUX1BUUl9GT1JNQVQsIHJlc3VsdCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfc3RibF9mcmVlIChRdERlbXV4U3RyZWFtICogc3RyZWFtKQoreworICBnX2ZyZWUgKChncG9pbnRlcikgc3RyZWFtLT5zdGNvLmRhdGEpOworICBzdHJlYW0tPnN0Y28uZGF0YSA9IE5VTEw7CisgIGdfZnJlZSAoKGdwb2ludGVyKSBzdHJlYW0tPnN0c3ouZGF0YSk7CisgIHN0cmVhbS0+c3Rzei5kYXRhID0gTlVMTDsKKyAgZ19mcmVlICgoZ3BvaW50ZXIpIHN0cmVhbS0+c3RzYy5kYXRhKTsKKyAgc3RyZWFtLT5zdHNjLmRhdGEgPSBOVUxMOworICBnX2ZyZWUgKChncG9pbnRlcikgc3RyZWFtLT5zdHRzLmRhdGEpOworICBzdHJlYW0tPnN0dHMuZGF0YSA9IE5VTEw7CisgIGdfZnJlZSAoKGdwb2ludGVyKSBzdHJlYW0tPnN0c3MuZGF0YSk7CisgIHN0cmVhbS0+c3Rzcy5kYXRhID0gTlVMTDsKKyAgZ19mcmVlICgoZ3BvaW50ZXIpIHN0cmVhbS0+c3Rwcy5kYXRhKTsKKyAgc3RyZWFtLT5zdHBzLmRhdGEgPSBOVUxMOworICBnX2ZyZWUgKChncG9pbnRlcikgc3RyZWFtLT5jdHRzLmRhdGEpOworICBzdHJlYW0tPmN0dHMuZGF0YSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9zdHJlYW1fZmx1c2hfc2VnbWVudHNfZGF0YSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSkKK3sKKyAgZ19mcmVlIChzdHJlYW0tPnNlZ21lbnRzKTsKKyAgc3RyZWFtLT5zZWdtZW50cyA9IE5VTEw7CisgIHN0cmVhbS0+c2VnbWVudF9pbmRleCA9IC0xOworICBzdHJlYW0tPmFjY3VtdWxhdGVkX2Jhc2UgPSAwOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfc3RyZWFtX2ZsdXNoX3NhbXBsZXNfZGF0YSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSkKK3sKKyAgZ19mcmVlIChzdHJlYW0tPnNhbXBsZXMpOworICBzdHJlYW0tPnNhbXBsZXMgPSBOVUxMOworICBnc3RfcXRkZW11eF9zdGJsX2ZyZWUgKHN0cmVhbSk7CisKKyAgLyogZnJhZ21lbnRzICovCisgIGdfZnJlZSAoc3RyZWFtLT5yYV9lbnRyaWVzKTsKKyAgc3RyZWFtLT5yYV9lbnRyaWVzID0gTlVMTDsKKyAgc3RyZWFtLT5uX3JhX2VudHJpZXMgPSAwOworCisgIHN0cmVhbS0+c2FtcGxlX2luZGV4ID0gLTE7CisgIHN0cmVhbS0+c3RibF9pbmRleCA9IC0xOworICBzdHJlYW0tPm5fc2FtcGxlcyA9IDA7CisgIHN0cmVhbS0+dGltZV9wb3NpdGlvbiA9IDA7CisKKyAgc3RyZWFtLT5uX3NhbXBsZXNfbW9vZiA9IDA7CisgIHN0cmVhbS0+ZHVyYXRpb25fbW9vZiA9IDA7CisgIHN0cmVhbS0+ZHVyYXRpb25fbGFzdF9tb29mID0gMDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X3N0cmVhbV9jbGVhciAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0pCit7CisgIGdpbnQgaTsKKyAgaWYgKHN0cmVhbS0+YWxsb2NhdG9yKQorICAgIGdzdF9vYmplY3RfdW5yZWYgKHN0cmVhbS0+YWxsb2NhdG9yKTsKKyAgd2hpbGUgKHN0cmVhbS0+YnVmZmVycykgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKEdTVF9CVUZGRVJfQ0FTVCAoc3RyZWFtLT5idWZmZXJzLT5kYXRhKSk7CisgICAgc3RyZWFtLT5idWZmZXJzID0gZ19zbGlzdF9kZWxldGVfbGluayAoc3RyZWFtLT5idWZmZXJzLCBzdHJlYW0tPmJ1ZmZlcnMpOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBzdHJlYW0tPnN0c2RfZW50cmllc19sZW5ndGg7IGkrKykgeworICAgIFF0RGVtdXhTdHJlYW1TdHNkRW50cnkgKmVudHJ5ID0gJnN0cmVhbS0+c3RzZF9lbnRyaWVzW2ldOworICAgIGlmIChlbnRyeS0+cmdiOF9wYWxldHRlKSB7CisgICAgICBnc3RfbWVtb3J5X3VucmVmIChlbnRyeS0+cmdiOF9wYWxldHRlKTsKKyAgICAgIGVudHJ5LT5yZ2I4X3BhbGV0dGUgPSBOVUxMOworICAgIH0KKyAgICBlbnRyeS0+c3BhcnNlID0gRkFMU0U7CisgIH0KKworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHN0cmVhbS0+c3RyZWFtX3RhZ3MpOworICBzdHJlYW0tPnN0cmVhbV90YWdzID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZ3N0X3RhZ19saXN0X3NldF9zY29wZSAoc3RyZWFtLT5zdHJlYW1fdGFncywgR1NUX1RBR19TQ09QRV9TVFJFQU0pOworICBnX2ZyZWUgKHN0cmVhbS0+cmVkaXJlY3RfdXJpKTsKKyAgc3RyZWFtLT5yZWRpcmVjdF91cmkgPSBOVUxMOworICBzdHJlYW0tPnNlbnRfZW9zID0gRkFMU0U7CisgIHN0cmVhbS0+cHJvdGVjdGVkID0gRkFMU0U7CisgIGlmIChzdHJlYW0tPnByb3RlY3Rpb25fc2NoZW1lX2luZm8pIHsKKyAgICBpZiAoc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV90eXBlID09IEZPVVJDQ19jZW5jKSB7CisgICAgICBRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8gKmluZm8gPQorICAgICAgICAgIChRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8gKikgc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV9pbmZvOworICAgICAgaWYgKGluZm8tPmRlZmF1bHRfcHJvcGVydGllcykKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChpbmZvLT5kZWZhdWx0X3Byb3BlcnRpZXMpOworICAgICAgaWYgKGluZm8tPmNyeXB0b19pbmZvKQorICAgICAgICBnX3B0cl9hcnJheV9mcmVlIChpbmZvLT5jcnlwdG9faW5mbywgVFJVRSk7CisgICAgfQorICAgIGdfZnJlZSAoc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV9pbmZvKTsKKyAgICBzdHJlYW0tPnByb3RlY3Rpb25fc2NoZW1lX2luZm8gPSBOVUxMOworICB9CisgIHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfdHlwZSA9IDA7CisgIHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfdmVyc2lvbiA9IDA7CisgIGdfcXVldWVfZm9yZWFjaCAoJnN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfZXZlbnRfcXVldWUsCisgICAgICAoR0Z1bmMpIGdzdF9ldmVudF91bnJlZiwgTlVMTCk7CisgIGdfcXVldWVfY2xlYXIgKCZzdHJlYW0tPnByb3RlY3Rpb25fc2NoZW1lX2V2ZW50X3F1ZXVlKTsKKyAgZ3N0X3F0ZGVtdXhfc3RyZWFtX2ZsdXNoX3NlZ21lbnRzX2RhdGEgKHF0ZGVtdXgsIHN0cmVhbSk7CisgIGdzdF9xdGRlbXV4X3N0cmVhbV9mbHVzaF9zYW1wbGVzX2RhdGEgKHF0ZGVtdXgsIHN0cmVhbSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9zdHJlYW1fcmVzZXQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBRdERlbXV4U3RyZWFtICogc3RyZWFtKQoreworICBnaW50IGk7CisgIGdzdF9xdGRlbXV4X3N0cmVhbV9jbGVhciAocXRkZW11eCwgc3RyZWFtKTsKKyAgZm9yIChpID0gMDsgaSA8IHN0cmVhbS0+c3RzZF9lbnRyaWVzX2xlbmd0aDsgaSsrKSB7CisgICAgUXREZW11eFN0cmVhbVN0c2RFbnRyeSAqZW50cnkgPSAmc3RyZWFtLT5zdHNkX2VudHJpZXNbaV07CisgICAgaWYgKGVudHJ5LT5jYXBzKSB7CisgICAgICBnc3RfY2Fwc191bnJlZiAoZW50cnktPmNhcHMpOworICAgICAgZW50cnktPmNhcHMgPSBOVUxMOworICAgIH0KKyAgfQorICBnX2ZyZWUgKHN0cmVhbS0+c3RzZF9lbnRyaWVzKTsKKyAgc3RyZWFtLT5zdHNkX2VudHJpZXMgPSBOVUxMOworICBzdHJlYW0tPnN0c2RfZW50cmllc19sZW5ndGggPSAwOworfQorCisKK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9zdHJlYW1fZnJlZSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0pCit7CisgIGdzdF9xdGRlbXV4X3N0cmVhbV9yZXNldCAocXRkZW11eCwgc3RyZWFtKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmIChzdHJlYW0tPnN0cmVhbV90YWdzKTsKKyAgaWYgKHN0cmVhbS0+cGFkKSB7CisgICAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocXRkZW11eCksIHN0cmVhbS0+cGFkKTsKKyAgICBnc3RfZmxvd19jb21iaW5lcl9yZW1vdmVfcGFkIChxdGRlbXV4LT5mbG93Y29tYmluZXIsIHN0cmVhbS0+cGFkKTsKKyAgfQorICBnX2ZyZWUgKHN0cmVhbSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9yZW1vdmVfc3RyZWFtIChHc3RRVERlbXV4ICogcXRkZW11eCwgaW50IGkpCit7CisgIGdfYXNzZXJ0IChpID49IDAgJiYgaSA8IHF0ZGVtdXgtPm5fc3RyZWFtcyAmJiBxdGRlbXV4LT5zdHJlYW1zW2ldICE9IE5VTEwpOworCisgIGdzdF9xdGRlbXV4X3N0cmVhbV9mcmVlIChxdGRlbXV4LCBxdGRlbXV4LT5zdHJlYW1zW2ldKTsKKyAgcXRkZW11eC0+c3RyZWFtc1tpXSA9IHF0ZGVtdXgtPnN0cmVhbXNbcXRkZW11eC0+bl9zdHJlYW1zIC0gMV07CisgIHF0ZGVtdXgtPnN0cmVhbXNbcXRkZW11eC0+bl9zdHJlYW1zIC0gMV0gPSBOVUxMOworICBxdGRlbXV4LT5uX3N0cmVhbXMtLTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcXRkZW11eF9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RRVERlbXV4ICpxdGRlbXV4ID0gR1NUX1FUREVNVVggKGVsZW1lbnQpOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXN1bHQgPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJlc3VsdCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6eworICAgICAgZ3N0X3F0ZGVtdXhfcmVzZXQgKHF0ZGVtdXgsIFRSVUUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitxdGRlbXV4X3BhcnNlX2Z0eXAgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBjb25zdCBndWludDggKiBidWZmZXIsIGdpbnQgbGVuZ3RoKQoreworICAvKiBjb3VudHMgYXMgaGVhZGVyIGRhdGEgKi8KKyAgcXRkZW11eC0+aGVhZGVyX3NpemUgKz0gbGVuZ3RoOworCisgIC8qIG9ubHkgY29uc2lkZXIgYXQgbGVhc3QgYSBzdWZmaWNpZW50bHkgY29tcGxldGUgZnR5cCBhdG9tICovCisgIGlmIChsZW5ndGggPj0gMjApIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZjsKKworICAgIHF0ZGVtdXgtPm1ham9yX2JyYW5kID0gUVRfRk9VUkNDIChidWZmZXIgKyA4KTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAibWFqb3IgYnJhbmQ6ICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHF0ZGVtdXgtPm1ham9yX2JyYW5kKSk7CisgICAgaWYgKHF0ZGVtdXgtPmNvbXBfYnJhbmRzKQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocXRkZW11eC0+Y29tcF9icmFuZHMpOworICAgIGJ1ZiA9IHF0ZGVtdXgtPmNvbXBfYnJhbmRzID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChsZW5ndGggLSAxNik7CisgICAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsIGJ1ZmZlciArIDE2LCBsZW5ndGggLSAxNik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3F0ZGVtdXhfaGFuZGxlX3htcF90YWdsaXN0IChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0VGFnTGlzdCAqIHRhZ2xpc3QsCisgICAgR3N0VGFnTGlzdCAqIHhtcHRhZ2xpc3QpCit7CisgIC8qIFN0cmlwIG91dCBib2d1cyBmaWVsZHMgKi8KKyAgaWYgKHhtcHRhZ2xpc3QpIHsKKyAgICBpZiAoZ3N0X3RhZ19saXN0X2dldF9zY29wZSAodGFnbGlzdCkgPT0gR1NUX1RBR19TQ09QRV9HTE9CQUwpIHsKKyAgICAgIGdzdF90YWdfbGlzdF9yZW1vdmVfdGFnICh4bXB0YWdsaXN0LCBHU1RfVEFHX1ZJREVPX0NPREVDKTsKKyAgICAgIGdzdF90YWdfbGlzdF9yZW1vdmVfdGFnICh4bXB0YWdsaXN0LCBHU1RfVEFHX0FVRElPX0NPREVDKTsKKyAgICB9IGVsc2UgeworICAgICAgZ3N0X3RhZ19saXN0X3JlbW92ZV90YWcgKHhtcHRhZ2xpc3QsIEdTVF9UQUdfQ09OVEFJTkVSX0ZPUk1BVCk7CisgICAgfQorCisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIkZvdW5kIFhNUCB0YWdzICUiIEdTVF9QVFJfRk9STUFULCB4bXB0YWdsaXN0KTsKKworICAgIC8qIHByaW9yaXRpemUgbmF0aXZlIHRhZ3MgdXNpbmcgX0tFRVAgbW9kZSAqLworICAgIGdzdF90YWdfbGlzdF9pbnNlcnQgKHRhZ2xpc3QsIHhtcHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfS0VFUCk7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmICh4bXB0YWdsaXN0KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorcXRkZW11eF9wYXJzZV9waWZmIChHc3RRVERlbXV4ICogcXRkZW11eCwgY29uc3QgZ3VpbnQ4ICogYnVmZmVyLCBnaW50IGxlbmd0aCwKKyAgICBndWludCBvZmZzZXQpCit7CisgIEdzdEJ5dGVSZWFkZXIgYnI7CisgIGd1aW50OCB2ZXJzaW9uOworICBndWludDMyIGZsYWdzID0gMDsKKyAgZ3VpbnQgaTsKKyAgZ3VpbnQ4IGl2X3NpemUgPSA4OworICBRdERlbXV4U3RyZWFtICpzdHJlYW07CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8gKnNzX2luZm8gPSBOVUxMOworICBjb25zdCBnY2hhciAqc3lzdGVtX2lkOworICBnYm9vbGVhbiB1c2VzX3N1Yl9zYW1wbGVfZW5jcnlwdGlvbiA9IEZBTFNFOworCisgIGlmIChxdGRlbXV4LT5uX3N0cmVhbXMgPT0gMCkKKyAgICByZXR1cm47CisKKyAgc3RyZWFtID0gcXRkZW11eC0+c3RyZWFtc1swXTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLCAwKTsKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LWNlbmMiKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgIkF0dGVtcHRpbmcgUElGRiBib3ggcGFyc2luZyBvbiBhbiB1bmVuY3J5cHRlZCBzdHJlYW0uIik7CisgICAgcmV0dXJuOworICB9CisKKyAgZ3N0X3N0cnVjdHVyZV9nZXQgKHN0cnVjdHVyZSwgR1NUX1BST1RFQ1RJT05fU1lTVEVNX0lEX0NBUFNfRklFTEQsCisgICAgICBHX1RZUEVfU1RSSU5HLCAmc3lzdGVtX2lkLCBOVUxMKTsKKyAgZ3N0X3F0ZGVtdXhfYXBwZW5kX3Byb3RlY3Rpb25fc3lzdGVtX2lkIChxdGRlbXV4LCBzeXN0ZW1faWQpOworCisgIHN0cmVhbS0+cHJvdGVjdGVkID0gVFJVRTsKKyAgc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV90eXBlID0gRk9VUkNDX2NlbmM7CisKKyAgaWYgKCFzdHJlYW0tPnByb3RlY3Rpb25fc2NoZW1lX2luZm8pCisgICAgc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV9pbmZvID0gZ19uZXcwIChRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8sIDEpOworCisgIHNzX2luZm8gPSAoUXREZW11eENlbmNTYW1wbGVTZXRJbmZvICopIHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfaW5mbzsKKworICBpZiAoc3NfaW5mby0+ZGVmYXVsdF9wcm9wZXJ0aWVzKQorICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoc3NfaW5mby0+ZGVmYXVsdF9wcm9wZXJ0aWVzKTsKKworICBzc19pbmZvLT5kZWZhdWx0X3Byb3BlcnRpZXMgPQorICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LWNlbmMiLAorICAgICAgIml2X3NpemUiLCBHX1RZUEVfVUlOVCwgaXZfc2l6ZSwgImVuY3J5cHRlZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKworICBpZiAoc3NfaW5mby0+Y3J5cHRvX2luZm8pIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInVucmVmZmluZyBleGlzdGluZyBjcnlwdG9faW5mbyIpOworICAgIGdfcHRyX2FycmF5X2ZyZWUgKHNzX2luZm8tPmNyeXB0b19pbmZvLCBUUlVFKTsKKyAgICBzc19pbmZvLT5jcnlwdG9faW5mbyA9IE5VTEw7CisgIH0KKworICAvKiBza2lwIFVVSUQgKi8KKyAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZiciwgYnVmZmVyICsgb2Zmc2V0ICsgMTYsIGxlbmd0aCAtIG9mZnNldCAtIDE2KTsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZiciwgJnZlcnNpb24pKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwgIkVycm9yIGdldHRpbmcgYm94J3MgdmVyc2lvbiBmaWVsZCIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MjRfYmUgKCZiciwgJmZsYWdzKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJFcnJvciBnZXR0aW5nIGJveCdzIGZsYWdzIGZpZWxkIik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKChmbGFncyAmIDB4MDAwMDAxKSkgeworICAgIGd1aW50MzIgYWxnb3JpdGhtX2lkID0gMDsKKyAgICBjb25zdCBndWludDggKmtpZDsKKyAgICBHc3RCdWZmZXIgKmtpZF9idWY7CisgICAgZ2Jvb2xlYW4gaXNfZW5jcnlwdGVkID0gVFJVRTsKKworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MjRfbGUgKCZiciwgJmFsZ29yaXRobV9pZCkpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJFcnJvciBnZXR0aW5nIGJveCdzIGFsZ29yaXRobSBJRCBmaWVsZCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFsZ29yaXRobV9pZCA+Pj0gODsKKyAgICBpZiAoYWxnb3JpdGhtX2lkID09IDApIHsKKyAgICAgIGlzX2VuY3J5cHRlZCA9IEZBTFNFOworICAgIH0gZWxzZSBpZiAoYWxnb3JpdGhtX2lkID09IDEpIHsKKyAgICAgIC8qIEZJWE1FOiBtYXliZSBzdG9yZSB0aGlzIGluIHByb3BlcnRpZXM/ICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiQUVTIDEyOC1iaXRzIENUUiBlbmNyeXB0ZWQgc3RyZWFtIik7CisgICAgfSBlbHNlIGlmIChhbGdvcml0aG1faWQgPT0gMikgeworICAgICAgLyogRklYTUU6IG1heWJlIHN0b3JlIHRoaXMgaW4gcHJvcGVydGllcz8gKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJBRVMgMTI4LWJpdHMgQ0JDIGVuY3J5cHRlZCBzdHJlYW0iKTsKKyAgICB9CisKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZiciwgJml2X3NpemUpKQorICAgICAgcmV0dXJuOworCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2RhdGEgKCZiciwgMTYsICZraWQpKQorICAgICAgcmV0dXJuOworCisgICAga2lkX2J1ZiA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCAxNiwgTlVMTCk7CisgICAgZ3N0X2J1ZmZlcl9maWxsIChraWRfYnVmLCAwLCBraWQsIDE2KTsKKyAgICBpZiAoc3NfaW5mby0+ZGVmYXVsdF9wcm9wZXJ0aWVzKQorICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChzc19pbmZvLT5kZWZhdWx0X3Byb3BlcnRpZXMpOworICAgIHNzX2luZm8tPmRlZmF1bHRfcHJvcGVydGllcyA9CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1jZW5jIiwKKyAgICAgICAgIml2X3NpemUiLCBHX1RZUEVfVUlOVCwgaXZfc2l6ZSwKKyAgICAgICAgImVuY3J5cHRlZCIsIEdfVFlQRV9CT09MRUFOLCBpc19lbmNyeXB0ZWQsCisgICAgICAgICJraWQiLCBHU1RfVFlQRV9CVUZGRVIsIGtpZF9idWYsIE5VTEwpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJkZWZhdWx0IHNhbXBsZSBwcm9wZXJ0aWVzOiAiCisgICAgICAgICJpc19lbmNyeXB0ZWQ9JXUsIGl2X3NpemU9JXUiLCBpc19lbmNyeXB0ZWQsIGl2X3NpemUpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGtpZF9idWYpOworICB9IGVsc2UgaWYgKChmbGFncyAmIDB4MDAwMDAyKSkgeworICAgIHVzZXNfc3ViX3NhbXBsZV9lbmNyeXB0aW9uID0gVFJVRTsKKyAgfQorCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZiciwgJnF0ZGVtdXgtPmNlbmNfYXV4X3NhbXBsZV9jb3VudCkpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChxdGRlbXV4LCAiRXJyb3IgZ2V0dGluZyBib3gncyBzYW1wbGUgY291bnQgZmllbGQiKTsKKyAgICByZXR1cm47CisgIH0KKworICBzc19pbmZvLT5jcnlwdG9faW5mbyA9CisgICAgICBnX3B0cl9hcnJheV9uZXdfZnVsbCAocXRkZW11eC0+Y2VuY19hdXhfc2FtcGxlX2NvdW50LAorICAgICAgKEdEZXN0cm95Tm90aWZ5KSBxdGRlbXV4X2dzdF9zdHJ1Y3R1cmVfZnJlZSk7CisKKyAgZm9yIChpID0gMDsgaSA8IHF0ZGVtdXgtPmNlbmNfYXV4X3NhbXBsZV9jb3VudDsgKytpKSB7CisgICAgR3N0U3RydWN0dXJlICpwcm9wZXJ0aWVzOworICAgIGd1aW50OCAqZGF0YTsKKyAgICBHc3RCdWZmZXIgKmJ1ZjsKKworICAgIHByb3BlcnRpZXMgPSBxdGRlbXV4X2dldF9jZW5jX3NhbXBsZV9wcm9wZXJ0aWVzIChxdGRlbXV4LCBzdHJlYW0sIGkpOworICAgIGlmIChwcm9wZXJ0aWVzID09IE5VTEwpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJmYWlsZWQgdG8gZ2V0IHByb3BlcnRpZXMgZm9yIHNhbXBsZSAldSIsIGkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2R1cF9kYXRhICgmYnIsIGl2X3NpemUsICZkYXRhKSkgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwgIklWIGRhdGEgbm90IHByZXNlbnQgZm9yIHNhbXBsZSAldSIsIGkpOworICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChwcm9wZXJ0aWVzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZGF0YSwgaXZfc2l6ZSk7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHByb3BlcnRpZXMsICJpdiIsIEdTVF9UWVBFX0JVRkZFUiwgYnVmLCBOVUxMKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgICAgaWYgKHVzZXNfc3ViX3NhbXBsZV9lbmNyeXB0aW9uKSB7CisgICAgICBndWludDE2IG5fc3Vic2FtcGxlczsKKworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9iZSAoJmJyLCAmbl9zdWJzYW1wbGVzKQorICAgICAgICAgIHx8IG5fc3Vic2FtcGxlcyA9PSAwKSB7CisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAiZmFpbGVkIHRvIGdldCBzdWJzYW1wbGUgY291bnQgZm9yIHNhbXBsZSAldSIsIGkpOworICAgICAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHByb3BlcnRpZXMpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInN1YnNhbXBsZSBjb3VudDogJXUiLCBuX3N1YnNhbXBsZXMpOworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZHVwX2RhdGEgKCZiciwgbl9zdWJzYW1wbGVzICogNiwgJmRhdGEpKSB7CisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJmYWlsZWQgdG8gZ2V0IHN1YnNhbXBsZSBkYXRhIGZvciBzYW1wbGUgJXUiLAorICAgICAgICAgICAgaSk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocHJvcGVydGllcyk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGRhdGEsIG5fc3Vic2FtcGxlcyAqIDYpOworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHByb3BlcnRpZXMsCisgICAgICAgICAgInN1YnNhbXBsZV9jb3VudCIsIEdfVFlQRV9VSU5ULCBuX3N1YnNhbXBsZXMsCisgICAgICAgICAgInN1YnNhbXBsZXMiLCBHU1RfVFlQRV9CVUZGRVIsIGJ1ZiwgTlVMTCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIH0gZWxzZSB7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAocHJvcGVydGllcywgInN1YnNhbXBsZV9jb3VudCIsIEdfVFlQRV9VSU5ULCAwLCBOVUxMKTsKKyAgICB9CisKKyAgICBnX3B0cl9hcnJheV9hZGQgKHNzX2luZm8tPmNyeXB0b19pbmZvLCBwcm9wZXJ0aWVzKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorcXRkZW11eF9wYXJzZV91dWlkIChHc3RRVERlbXV4ICogcXRkZW11eCwgY29uc3QgZ3VpbnQ4ICogYnVmZmVyLCBnaW50IGxlbmd0aCkKK3sKKyAgc3RhdGljIGNvbnN0IGd1aW50OCB4bXBfdXVpZFtdID0geyAweEJFLCAweDdBLCAweENGLCAweENCLAorICAgIDB4OTcsIDB4QTksIDB4NDIsIDB4RTgsCisgICAgMHg5QywgMHg3MSwgMHg5OSwgMHg5NCwKKyAgICAweDkxLCAweEUzLCAweEFGLCAweEFDCisgIH07CisgIHN0YXRpYyBjb25zdCBndWludDggcGxheXJlYWR5X3V1aWRbXSA9IHsKKyAgICAweGQwLCAweDhhLCAweDRmLCAweDE4LCAweDEwLCAweGYzLCAweDRhLCAweDgyLAorICAgIDB4YjYsIDB4YzgsIDB4MzIsIDB4ZDgsIDB4YWIsIDB4YTEsIDB4ODMsIDB4ZDMKKyAgfTsKKworICBzdGF0aWMgY29uc3QgZ3VpbnQ4IHBpZmZfc2FtcGxlX2VuY3J5cHRpb25fdXVpZFtdID0geworICAgIDB4YTIsIDB4MzksIDB4NGYsIDB4NTIsIDB4NWEsIDB4OWIsIDB4NGYsIDB4MTQsCisgICAgMHhhMiwgMHg0NCwgMHg2YywgMHg0MiwgMHg3YywgMHg2NCwgMHg4ZCwgMHhmNAorICB9OworCisgIGd1aW50IG9mZnNldDsKKworICAvKiBjb3VudHMgYXMgaGVhZGVyIGRhdGEgKi8KKyAgcXRkZW11eC0+aGVhZGVyX3NpemUgKz0gbGVuZ3RoOworCisgIG9mZnNldCA9IChRVF9VSU5UMzIgKGJ1ZmZlcikgPT0gMCkgPyAxNiA6IDg7CisKKyAgaWYgKGxlbmd0aCA8PSBvZmZzZXQgKyAxNikgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJ1dWlkIGF0b20gaXMgdG9vIHNob3J0LCBza2lwcGluZyIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChtZW1jbXAgKGJ1ZmZlciArIG9mZnNldCwgeG1wX3V1aWQsIDE2KSA9PSAwKSB7CisgICAgR3N0QnVmZmVyICpidWY7CisgICAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKworICAgIGJ1ZiA9IF9nc3RfYnVmZmVyX25ld193cmFwcGVkICgoZ3VpbnQ4ICopIGJ1ZmZlciArIG9mZnNldCArIDE2LAorICAgICAgICBsZW5ndGggLSBvZmZzZXQgLSAxNiwgTlVMTCk7CisgICAgdGFnbGlzdCA9IGdzdF90YWdfbGlzdF9mcm9tX3htcF9idWZmZXIgKGJ1Zik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAgIC8qIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgdXNhYmxlIHRhZ2xpc3QgKi8KKyAgICBxdGRlbXV4LT50YWdfbGlzdCA9IGdzdF90YWdfbGlzdF9tYWtlX3dyaXRhYmxlIChxdGRlbXV4LT50YWdfbGlzdCk7CisKKyAgICBxdGRlbXV4X2hhbmRsZV94bXBfdGFnbGlzdCAocXRkZW11eCwgcXRkZW11eC0+dGFnX2xpc3QsIHRhZ2xpc3QpOworCisgIH0gZWxzZSBpZiAobWVtY21wIChidWZmZXIgKyBvZmZzZXQsIHBsYXlyZWFkeV91dWlkLCAxNikgPT0gMCkgeworICAgIGludCBsZW47CisgICAgY29uc3QgZ3VuaWNoYXIyICpzX3V0ZjE2OworICAgIGNoYXIgKmNvbnRlbnRzOworCisgICAgbGVuID0gR1NUX1JFQURfVUlOVDE2X0xFIChidWZmZXIgKyBvZmZzZXQgKyAweDMwKTsKKyAgICBzX3V0ZjE2ID0gKGNvbnN0IGd1bmljaGFyMiAqKSAoYnVmZmVyICsgb2Zmc2V0ICsgMHgzMik7CisgICAgY29udGVudHMgPSBnX3V0ZjE2X3RvX3V0ZjggKHNfdXRmMTYsIGxlbiAvIDIsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJjb250ZW50czogJXMiLCBjb250ZW50cyk7CisKKyAgICBnX2ZyZWUgKGNvbnRlbnRzKTsKKworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdGRlbXV4LCBTVFJFQU0sIERFQ1JZUFQsCisgICAgICAgIChfKCJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIpKSwKKyAgICAgICAgKE5VTEwpKTsKKyAgfSBlbHNlIGlmIChtZW1jbXAgKGJ1ZmZlciArIG9mZnNldCwgcGlmZl9zYW1wbGVfZW5jcnlwdGlvbl91dWlkLCAxNikgPT0gMCkgeworICAgIHF0ZGVtdXhfcGFyc2VfcGlmZiAocXRkZW11eCwgYnVmZmVyLCBsZW5ndGgsIG9mZnNldCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIklnbm9yaW5nIHVua25vd24gdXVpZDogJTA4eC0lMDh4LSUwOHgtJTA4eCIsCisgICAgICAgIEdTVF9SRUFEX1VJTlQzMl9MRSAoYnVmZmVyICsgb2Zmc2V0KSwKKyAgICAgICAgR1NUX1JFQURfVUlOVDMyX0xFIChidWZmZXIgKyBvZmZzZXQgKyA0KSwKKyAgICAgICAgR1NUX1JFQURfVUlOVDMyX0xFIChidWZmZXIgKyBvZmZzZXQgKyA4KSwKKyAgICAgICAgR1NUX1JFQURfVUlOVDMyX0xFIChidWZmZXIgKyBvZmZzZXQgKyAxMikpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitxdGRlbXV4X3BhcnNlX3NpZHggKEdzdFFURGVtdXggKiBxdGRlbXV4LCBjb25zdCBndWludDggKiBidWZmZXIsIGdpbnQgbGVuZ3RoKQoreworICBHc3RTaWR4UGFyc2VyIHNpZHhfcGFyc2VyOworICBHc3RJc29mZlBhcnNlclJlc3VsdCByZXM7CisgIGd1aW50IGNvbnN1bWVkOworCisgIGdzdF9pc29mZl9xdF9zaWR4X3BhcnNlcl9pbml0ICgmc2lkeF9wYXJzZXIpOworCisgIHJlcyA9CisgICAgICBnc3RfaXNvZmZfcXRfc2lkeF9wYXJzZXJfYWRkX2RhdGEgKCZzaWR4X3BhcnNlciwgYnVmZmVyLCBsZW5ndGgsCisgICAgICAmY29uc3VtZWQpOworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic2lkeCBwYXJzZSByZXN1bHQ6ICVkIiwgcmVzKTsKKyAgaWYgKHJlcyA9PSBHU1RfSVNPRkZfUVRfUEFSU0VSX0RPTkUpIHsKKyAgICBjaGVja191cGRhdGVfZHVyYXRpb24gKHF0ZGVtdXgsIHNpZHhfcGFyc2VyLmN1bXVsYXRpdmVfcHRzKTsKKyAgfQorICBnc3RfaXNvZmZfcXRfc2lkeF9wYXJzZXJfY2xlYXIgKCZzaWR4X3BhcnNlcik7Cit9CisKKy8qIGNhbGxlciB2ZXJpZmllcyBhdCBsZWFzdCA4IGJ5dGVzIGluIGJ1ZiAqLworc3RhdGljIHZvaWQKK2V4dHJhY3RfaW5pdGlhbF9sZW5ndGhfYW5kX2ZvdXJjYyAoY29uc3QgZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgc2l6ZSwKKyAgICBndWludDY0ICogcGxlbmd0aCwgZ3VpbnQzMiAqIHBmb3VyY2MpCit7CisgIGd1aW50NjQgbGVuZ3RoOworICBndWludDMyIGZvdXJjYzsKKworICBsZW5ndGggPSBRVF9VSU5UMzIgKGRhdGEpOworICBHU1RfREVCVUcgKCJsZW5ndGggMHglMDgiIEdfR0lOVDY0X01PRElGSUVSICJ4IiwgbGVuZ3RoKTsKKyAgZm91cmNjID0gUVRfRk9VUkNDIChkYXRhICsgNCk7CisgIEdTVF9ERUJVRyAoImF0b20gdHlwZSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKTsKKworICBpZiAobGVuZ3RoID09IDApIHsKKyAgICBsZW5ndGggPSBHX01BWFVJTlQ2NDsKKyAgfSBlbHNlIGlmIChsZW5ndGggPT0gMSAmJiBzaXplID49IDE2KSB7CisgICAgLyogdGhpcyBtZWFucyB3ZSBoYXZlIGFuIGV4dGVuZGVkIHNpemUsIHdoaWNoIGlzIHRoZSA2NCBiaXQgdmFsdWUgb2YKKyAgICAgKiB0aGUgbmV4dCA4IGJ5dGVzICovCisgICAgbGVuZ3RoID0gUVRfVUlOVDY0IChkYXRhICsgOCk7CisgICAgR1NUX0RFQlVHICgibGVuZ3RoIDB4JTA4IiBHX0dJTlQ2NF9NT0RJRklFUiAieCIsIGxlbmd0aCk7CisgIH0KKworICBpZiAocGxlbmd0aCkKKyAgICAqcGxlbmd0aCA9IGxlbmd0aDsKKyAgaWYgKHBmb3VyY2MpCisgICAgKnBmb3VyY2MgPSBmb3VyY2M7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcXRkZW11eF9wYXJzZV9tZWhkIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGJyKQoreworICBndWludDMyIHZlcnNpb24gPSAwOworICBHc3RDbG9ja1RpbWUgZHVyYXRpb24gPSAwOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGJyLCAmdmVyc2lvbikpCisgICAgZ290byBmYWlsZWQ7CisKKyAgdmVyc2lvbiA+Pj0gMjQ7CisgIGlmICh2ZXJzaW9uID09IDEpIHsKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDY0X2JlIChiciwgJmR1cmF0aW9uKSkKKyAgICAgIGdvdG8gZmFpbGVkOworICB9IGVsc2UgeworICAgIGd1aW50MzIgZHVyID0gMDsKKworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGJyLCAmZHVyKSkKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIGR1cmF0aW9uID0gZHVyOworICB9CisKKyAgR1NUX0lORk9fT0JKRUNUIChxdGRlbXV4LCAibWVoZCBkdXJhdGlvbjogJSIgR19HVUlOVDY0X0ZPUk1BVCwgZHVyYXRpb24pOworICBxdGRlbXV4LT5kdXJhdGlvbiA9IGR1cmF0aW9uOworCisgIHJldHVybiBUUlVFOworCitmYWlsZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicGFyc2luZyBtZWhkIGZhaWxlZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3F0ZGVtdXhfcGFyc2VfdHJleCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0sCisgICAgZ3VpbnQzMiAqIGRzX2R1cmF0aW9uLCBndWludDMyICogZHNfc2l6ZSwgZ3VpbnQzMiAqIGRzX2ZsYWdzKQoreworICBpZiAoIXN0cmVhbS0+cGFyc2VkX3RyZXggJiYgcXRkZW11eC0+bW9vdl9ub2RlKSB7CisgICAgR05vZGUgKm12ZXgsICp0cmV4OworICAgIEdzdEJ5dGVSZWFkZXIgdHJleF9kYXRhOworCisgICAgbXZleCA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAocXRkZW11eC0+bW9vdl9ub2RlLCBGT1VSQ0NfbXZleCk7CisgICAgaWYgKG12ZXgpIHsKKyAgICAgIHRyZXggPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGVfZnVsbCAobXZleCwgRk9VUkNDX3RyZXgsCisgICAgICAgICAgJnRyZXhfZGF0YSk7CisgICAgICB3aGlsZSAodHJleCkgeworICAgICAgICBndWludDMyIGlkID0gMCwgc2RpID0gMCwgZHVyID0gMCwgc2l6ZSA9IDAsIGZsYWdzID0gMDsKKworICAgICAgICAvKiBza2lwIHZlcnNpb24vZmxhZ3MgKi8KKyAgICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJnRyZXhfZGF0YSwgNCkpCisgICAgICAgICAgZ290byBuZXh0OworICAgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmdHJleF9kYXRhLCAmaWQpKQorICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgaWYgKGlkICE9IHN0cmVhbS0+dHJhY2tfaWQpCisgICAgICAgICAgZ290byBuZXh0OworICAgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmdHJleF9kYXRhLCAmc2RpKSkKKyAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZ0cmV4X2RhdGEsICZkdXIpKQorICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoJnRyZXhfZGF0YSwgJnNpemUpKQorICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoJnRyZXhfZGF0YSwgJmZsYWdzKSkKKyAgICAgICAgICBnb3RvIG5leHQ7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImZyYWdtZW50IGRlZmF1bHRzIGZvciBzdHJlYW0gJWQ7ICIKKyAgICAgICAgICAgICJkdXJhdGlvbiAlZCwgIHNpemUgJWQsIGZsYWdzIDB4JXgiLCBzdHJlYW0tPnRyYWNrX2lkLAorICAgICAgICAgICAgZHVyLCBzaXplLCBmbGFncyk7CisKKyAgICAgICAgc3RyZWFtLT5wYXJzZWRfdHJleCA9IFRSVUU7CisgICAgICAgIHN0cmVhbS0+ZGVmX3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCA9IHNkaTsKKyAgICAgICAgc3RyZWFtLT5kZWZfc2FtcGxlX2R1cmF0aW9uID0gZHVyOworICAgICAgICBzdHJlYW0tPmRlZl9zYW1wbGVfc2l6ZSA9IHNpemU7CisgICAgICAgIHN0cmVhbS0+ZGVmX3NhbXBsZV9mbGFncyA9IGZsYWdzOworCisgICAgICBuZXh0OgorICAgICAgICAvKiBpdGVyYXRlIGFsbCBzaWJsaW5ncyAqLworICAgICAgICB0cmV4ID0gcXRkZW11eF90cmVlX2dldF9zaWJsaW5nX2J5X3R5cGVfZnVsbCAodHJleCwgRk9VUkNDX3RyZXgsCisgICAgICAgICAgICAmdHJleF9kYXRhKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAqZHNfZHVyYXRpb24gPSBzdHJlYW0tPmRlZl9zYW1wbGVfZHVyYXRpb247CisgICpkc19zaXplID0gc3RyZWFtLT5kZWZfc2FtcGxlX3NpemU7CisgICpkc19mbGFncyA9IHN0cmVhbS0+ZGVmX3NhbXBsZV9mbGFnczsKKworICAvKiBldmVuIHRoZW4sIGFib3ZlIHZhbHVlcyBhcmUgYmV0dGVyIHRoYW4gcmFuZG9tIC4uLiAqLworICBpZiAoR19VTkxJS0VMWSAoIXN0cmVhbS0+cGFyc2VkX3RyZXgpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAiZmFpbGVkIHRvIGZpbmQgZnJhZ21lbnQgZGVmYXVsdHMgZm9yIHN0cmVhbSAlZCIsIHN0cmVhbS0+dHJhY2tfaWQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIGEgbW9yZSBhY2N1cmF0ZSBkdXJhdGlvbiBtaWdodAorICogaGF2ZSBiZWVuIGZvdW5kLiBJdCB3aWxsIHVwZGF0ZSBhbGwgcmVsZXZhbnQgdmFyaWFibGVzIGlmL3doZXJlIG5lZWRlZAorICovCitzdGF0aWMgdm9pZAorY2hlY2tfdXBkYXRlX2R1cmF0aW9uIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uKQoreworICBndWludCBpOworICBndWludDY0IG1vdmR1cjsKKyAgR3N0Q2xvY2tUaW1lIHByZXZkdXI7CisKKyAgbW92ZHVyID0gR1NUVElNRV9UT19RVFRJTUUgKHF0ZGVtdXgsIGR1cmF0aW9uKTsKKworICBpZiAobW92ZHVyID4gcXRkZW11eC0+ZHVyYXRpb24pIHsKKyAgICBwcmV2ZHVyID0gUVRUSU1FX1RPX0dTVFRJTUUgKHF0ZGVtdXgsIHF0ZGVtdXgtPmR1cmF0aW9uKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAiVXBkYXRpbmcgdG90YWwgZHVyYXRpb24gdG8gJSIgR1NUX1RJTUVfRk9STUFUICIgd2FzICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoZHVyYXRpb24pLCBHU1RfVElNRV9BUkdTIChwcmV2ZHVyKSk7CisgICAgcXRkZW11eC0+ZHVyYXRpb24gPSBtb3ZkdXI7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgInF0ZGVtdXgtPnNlZ21lbnQuZHVyYXRpb246ICUiIEdTVF9USU1FX0ZPUk1BVCAiIC5zdG9wOiAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHF0ZGVtdXgtPnNlZ21lbnQuZHVyYXRpb24pLAorICAgICAgICBHU1RfVElNRV9BUkdTIChxdGRlbXV4LT5zZWdtZW50LnN0b3ApKTsKKyAgICBpZiAocXRkZW11eC0+c2VnbWVudC5kdXJhdGlvbiA9PSBwcmV2ZHVyKSB7CisgICAgICAvKiBJZiB0aGUgY3VycmVudCBzZWdtZW50IGhhcyBkdXJhdGlvbi9zdG9wIGlkZW50aWNhbCB0byBwcmV2aW91cyBkdXJhdGlvbgorICAgICAgICogdXBkYXRlIHRoZW0gYWxzbyAoYmVjYXVzZSB0aGV5IHdlcmUgc2V0IGF0IHRoYXQgcG9pbnQgaW4gdGltZSB3aXRoCisgICAgICAgKiB0aGUgd3JvbmcgZHVyYXRpb24gKi8KKyAgICAgIC8qIFdlIGNvbnZlcnQgdGhlIHZhbHVlICpmcm9tKiB0aGUgdGltZXNjYWxlIHZlcnNpb24gdG8gYXZvaWQgcm91bmRpbmcgZXJyb3JzICovCisgICAgICBHc3RDbG9ja1RpbWUgZml4ZWRkdXIgPSBRVFRJTUVfVE9fR1NUVElNRSAocXRkZW11eCwgbW92ZHVyKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJVcGRhdGVkIHNlZ21lbnQuZHVyYXRpb24gYW5kIHNlZ21lbnQuc3RvcCIpOworICAgICAgcXRkZW11eC0+c2VnbWVudC5kdXJhdGlvbiA9IGZpeGVkZHVyOworICAgICAgcXRkZW11eC0+c2VnbWVudC5zdG9wID0gZml4ZWRkdXI7CisgICAgfQorICB9CisgIGZvciAoaSA9IDA7IGkgPCBxdGRlbXV4LT5uX3N0cmVhbXM7IGkrKykgeworICAgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbSA9IHF0ZGVtdXgtPnN0cmVhbXNbaV07CisgICAgaWYgKHN0cmVhbSkgeworICAgICAgbW92ZHVyID0gR1NUVElNRV9UT19RVFNUUkVBTVRJTUUgKHN0cmVhbSwgZHVyYXRpb24pOworICAgICAgaWYgKG1vdmR1ciA+IHN0cmVhbS0+ZHVyYXRpb24pIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICJVcGRhdGluZyBzdHJlYW0gIyVkIGR1cmF0aW9uIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwgaSwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGR1cmF0aW9uKSk7CisgICAgICAgIHN0cmVhbS0+ZHVyYXRpb24gPSBtb3ZkdXI7CisgICAgICAgIC8qIGludGVybmFsIGR1cmF0aW9uIHRyYWNraW5nIHN0YXRlIGhhcyBiZWVuIHVwZGF0ZWQgYWJvdmUsIHNvICovCisgICAgICAgIC8qIHByZXNlcnZlIGFuIG9wZW4tZW5kZWQgZHVtbXkgc2VnbWVudCByYXRoZXIgdGhhbiByZXBlYXRlZGx5IHVwZGF0aW5nCisgICAgICAgICAqIGl0IGFuZCBzcGFtbWluZyBkb3duc3RyZWFtIGFjY29yZGluZ2x5IHdpdGggc2VnbWVudCBldmVudHMgKi8KKyAgICAgICAgaWYgKHN0cmVhbS0+ZHVtbXlfc2VnbWVudCAmJgorICAgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHN0cmVhbS0+c2VnbWVudHNbMF0uZHVyYXRpb24pKSB7CisgICAgICAgICAgLyogVXBkYXRlIGFsbCBkdW1teSB2YWx1ZXMgdG8gbmV3IGR1cmF0aW9uICovCisgICAgICAgICAgc3RyZWFtLT5zZWdtZW50c1swXS5zdG9wX3RpbWUgPSBkdXJhdGlvbjsKKyAgICAgICAgICBzdHJlYW0tPnNlZ21lbnRzWzBdLmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgICAgc3RyZWFtLT5zZWdtZW50c1swXS5tZWRpYV9zdG9wID0gZHVyYXRpb247CisKKyAgICAgICAgICAvKiBsZXQgZG93bnN0cmVhbSBrbm93IHdlIHBvc3NpYmx5IGhhdmUgYSBuZXcgc3RvcCB0aW1lICovCisgICAgICAgICAgaWYgKHN0cmVhbS0+c2VnbWVudF9pbmRleCAhPSAtMSkgeworICAgICAgICAgICAgR3N0Q2xvY2tUaW1lIHBvczsKKworICAgICAgICAgICAgaWYgKHF0ZGVtdXgtPnNlZ21lbnQucmF0ZSA+PSAwKSB7CisgICAgICAgICAgICAgIHBvcyA9IHN0cmVhbS0+c2VnbWVudC5zdGFydDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHBvcyA9IHN0cmVhbS0+c2VnbWVudC5zdG9wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnc3RfcXRkZW11eF9zdHJlYW1fdXBkYXRlX3NlZ21lbnQgKHF0ZGVtdXgsIHN0cmVhbSwKKyAgICAgICAgICAgICAgICBzdHJlYW0tPnNlZ21lbnRfaW5kZXgsIHBvcywgTlVMTCwgTlVMTCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcXRkZW11eF9wYXJzZV90cnVuIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIHRydW4sCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwgZ3VpbnQzMiBkX3NhbXBsZV9kdXJhdGlvbiwgZ3VpbnQzMiBkX3NhbXBsZV9zaXplLAorICAgIGd1aW50MzIgZF9zYW1wbGVfZmxhZ3MsIGdpbnQ2NCBtb29mX29mZnNldCwgZ2ludDY0IG1vb2ZfbGVuZ3RoLAorICAgIGdpbnQ2NCAqIGJhc2Vfb2Zmc2V0LCBnaW50NjQgKiBydW5uaW5nX29mZnNldCwgZ2ludDY0IGRlY29kZV90cywKKyAgICBnYm9vbGVhbiBoYXNfdGZkdCkKK3sKKyAgR3N0Q2xvY2tUaW1lIGdzdF90cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGd1aW50NjQgdGltZXN0YW1wOworICBnaW50MzIgZGF0YV9vZmZzZXQgPSAwOworICBndWludDMyIGZsYWdzID0gMCwgZmlyc3RfZmxhZ3MgPSAwLCBzYW1wbGVzX2NvdW50ID0gMDsKKyAgZ2ludCBpOworICBndWludDggKmRhdGE7CisgIGd1aW50IGVudHJ5X3NpemUsIGR1cl9vZmZzZXQsIHNpemVfb2Zmc2V0LCBmbGFnc19vZmZzZXQgPSAwLCBjdF9vZmZzZXQgPSAwOworICBRdERlbXV4U2FtcGxlICpzYW1wbGU7CisgIGdib29sZWFuIGlzbXYgPSBGQUxTRTsKKyAgZ2ludDY0IGluaXRpYWxfb2Zmc2V0OworCisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAicGFyc2luZyB0cnVuIHN0cmVhbSAlZDsgIgorICAgICAgImRlZmF1bHQgZHVyICVkLCBzaXplICVkLCBmbGFncyAweCV4LCBiYXNlIG9mZnNldCAlIiBHX0dJTlQ2NF9GT1JNQVQgIiwgIgorICAgICAgImRlY29kZSB0cyAlIiBHX0dJTlQ2NF9GT1JNQVQsIHN0cmVhbS0+dHJhY2tfaWQsIGRfc2FtcGxlX2R1cmF0aW9uLAorICAgICAgZF9zYW1wbGVfc2l6ZSwgZF9zYW1wbGVfZmxhZ3MsICpiYXNlX29mZnNldCwgZGVjb2RlX3RzKTsKKworICBpZiAoc3RyZWFtLT5wZW5kaW5nX3NlZWsgJiYgbW9vZl9vZmZzZXQgPCBzdHJlYW0tPnBlbmRpbmdfc2Vlay0+bW9vZl9vZmZzZXQpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHN0cmVhbS0+cGFkLCAic2tpcHBpbmcgdHJ1biBiZWZvcmUgc2VlayB0YXJnZXQgZnJhZ21lbnQiKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIC8qIHByZXNlbmNlIG9mIHN0c3Mgb3Igbm90IGNhbid0IHJlYWxseSB0ZWxsIHVzIG11Y2gsCisgICAqIGFuZCBmbGFncyBhbmQgc28gb24gdGVuZCB0byBiZSBtYXJnaW5hbGx5IHJlbGlhYmxlIGluIHRoZXNlIGZpbGVzICovCisgIGlmIChzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3NvdW4pIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAic291bmQgdHJhY2sgaW4gZnJhZ21lbnRlZCBmaWxlOyBtYXJraW5nIGFsbCBrZXlmcmFtZXMiKTsKKyAgICBzdHJlYW0tPmFsbF9rZXlmcmFtZSA9IFRSVUU7CisgIH0KKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICh0cnVuLCAxKSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDI0X2JlICh0cnVuLCAmZmxhZ3MpKQorICAgIGdvdG8gZmFpbDsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICh0cnVuLCAmc2FtcGxlc19jb3VudCkpCisgICAgZ290byBmYWlsOworCisgIGlmIChmbGFncyAmIFRSX0RBVEFfT0ZGU0VUKSB7CisgICAgLyogbm90ZSB0aGlzIGlzIHJlYWxseSBzaWduZWQgKi8KKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfaW50MzJfYmUgKHRydW4sICZkYXRhX29mZnNldCkpCisgICAgICBnb3RvIGZhaWw7CisgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJ0cnVuIGRhdGEgb2Zmc2V0ICVkIiwgZGF0YV9vZmZzZXQpOworICAgIC8qIGRlZmF1bHQgYmFzZSBvZmZzZXQgPSBmaXJzdCBieXRlIG9mIG1vb2YgKi8KKyAgICBpZiAoKmJhc2Vfb2Zmc2V0ID09IC0xKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgImJhc2Vfb2Zmc2V0IGF0IG1vb2YiKTsKKyAgICAgICpiYXNlX29mZnNldCA9IG1vb2Zfb2Zmc2V0OworICAgIH0KKyAgICAqcnVubmluZ19vZmZzZXQgPSAqYmFzZV9vZmZzZXQgKyBkYXRhX29mZnNldDsKKyAgfSBlbHNlIHsKKyAgICAvKiBpZiBubyBvZmZzZXQgYXQgYWxsLCB0aGF0IHdvdWxkIG1lYW4gZGF0YSBzdGFydHMgYXQgbW9vZiBzdGFydCwKKyAgICAgKiB3aGljaCBpcyBhIGJpdCB3cm9uZyBhbmQgaXMgaXNtdiBjcmFwcHkgd2F5LCBzbyBjb21wZW5zYXRlCisgICAgICogYXNzdW1pbmcgZGF0YSBpcyBpbiBtZGF0IGZvbGxvd2luZyBtb29mICovCisgICAgaWYgKCpiYXNlX29mZnNldCA9PSAtMSkgeworICAgICAgKmJhc2Vfb2Zmc2V0ID0gbW9vZl9vZmZzZXQgKyBtb29mX2xlbmd0aCArIDg7CisgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgImJhc2Vfb2Zmc2V0IGFzc3VtZWQgaW4gbWRhdCBhZnRlciBtb29mIik7CisgICAgICBpc212ID0gVFJVRTsKKyAgICB9CisgICAgaWYgKCpydW5uaW5nX29mZnNldCA9PSAtMSkKKyAgICAgICpydW5uaW5nX29mZnNldCA9ICpiYXNlX29mZnNldDsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAicnVubmluZyBvZmZzZXQgbm93ICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICpydW5uaW5nX29mZnNldCk7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAidHJ1biBvZmZzZXQgJWQsIGZsYWdzIDB4JXgsIGVudHJpZXMgJWQiLAorICAgICAgZGF0YV9vZmZzZXQsIGZsYWdzLCBzYW1wbGVzX2NvdW50KTsKKworICBpZiAoZmxhZ3MgJiBUUl9GSVJTVF9TQU1QTEVfRkxBR1MpIHsKKyAgICBpZiAoR19VTkxJS0VMWSAoZmxhZ3MgJiBUUl9TQU1QTEVfRkxBR1MpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICJpbnZhbGlkIGZsYWdzOyBTQU1QTEUgYW5kIEZJUlNUX1NBTVBMRSBwcmVzZW50LCBkaXNjYXJkaW5nIGxhdHRlciIpOworICAgICAgZmxhZ3MgXj0gVFJfRklSU1RfU0FNUExFX0ZMQUdTOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICh0cnVuLCAmZmlyc3RfZmxhZ3MpKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgImZpcnN0IGZsYWdzOiAweCV4IiwgZmlyc3RfZmxhZ3MpOworICAgIH0KKyAgfQorCisgIC8qIEZJWE1FID8gc3BlYyBzYXlzIG90aGVyIGJpdHMgc2hvdWxkIGFsc28gYmUgY2hlY2tlZCB0byBkZXRlcm1pbmUKKyAgICogZW50cnkgc2l6ZSAoYW5kIHByZWZpeCBzaXplIGZvciB0aGF0IG1hdHRlcikgKi8KKyAgZW50cnlfc2l6ZSA9IDA7CisgIGR1cl9vZmZzZXQgPSBzaXplX29mZnNldCA9IDA7CisgIGlmIChmbGFncyAmIFRSX1NBTVBMRV9EVVJBVElPTikgeworICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiZW50cnkgZHVyYXRpb24gcHJlc2VudCIpOworICAgIGR1cl9vZmZzZXQgPSBlbnRyeV9zaXplOworICAgIGVudHJ5X3NpemUgKz0gNDsKKyAgfQorICBpZiAoZmxhZ3MgJiBUUl9TQU1QTEVfU0laRSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiZW50cnkgc2l6ZSBwcmVzZW50Iik7CisgICAgc2l6ZV9vZmZzZXQgPSBlbnRyeV9zaXplOworICAgIGVudHJ5X3NpemUgKz0gNDsKKyAgfQorICBpZiAoZmxhZ3MgJiBUUl9TQU1QTEVfRkxBR1MpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgImVudHJ5IGZsYWdzIHByZXNlbnQiKTsKKyAgICBmbGFnc19vZmZzZXQgPSBlbnRyeV9zaXplOworICAgIGVudHJ5X3NpemUgKz0gNDsKKyAgfQorICBpZiAoZmxhZ3MgJiBUUl9DT01QT1NJVElPTl9USU1FX09GRlNFVFMpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgImVudHJ5IGN0IG9mZnNldCBwcmVzZW50Iik7CisgICAgY3Rfb2Zmc2V0ID0gZW50cnlfc2l6ZTsKKyAgICBlbnRyeV9zaXplICs9IDQ7CisgIH0KKworICBpZiAoIXF0X2F0b21fcGFyc2VyX2hhc19jaHVua3MgKHRydW4sIHNhbXBsZXNfY291bnQsIGVudHJ5X3NpemUpKQorICAgIGdvdG8gZmFpbDsKKyAgZGF0YSA9IChndWludDggKikgZ3N0X2J5dGVfcmVhZGVyX3BlZWtfZGF0YV91bmNoZWNrZWQgKHRydW4pOworCisgIGlmIChzdHJlYW0tPm5fc2FtcGxlcyArIHNhbXBsZXNfY291bnQgPj0KKyAgICAgIFFUREVNVVhfTUFYX1NBTVBMRV9JTkRFWF9TSVpFIC8gc2l6ZW9mIChRdERlbXV4U2FtcGxlKSkKKyAgICBnb3RvIGluZGV4X3Rvb19iaWc7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImFsbG9jYXRpbmcgbl9zYW1wbGVzICV1ICogJXUgKCUuMmYgTUIpIiwKKyAgICAgIHN0cmVhbS0+bl9zYW1wbGVzICsgc2FtcGxlc19jb3VudCwgKGd1aW50KSBzaXplb2YgKFF0RGVtdXhTYW1wbGUpLAorICAgICAgKHN0cmVhbS0+bl9zYW1wbGVzICsgc2FtcGxlc19jb3VudCkgKgorICAgICAgc2l6ZW9mIChRdERlbXV4U2FtcGxlKSAvICgxMDI0LjAgKiAxMDI0LjApKTsKKworICAvKiBjcmVhdGUgYSBuZXcgYXJyYXkgb2Ygc2FtcGxlcyBpZiBpdCdzIHRoZSBmaXJzdCBzYW1wbGUgcGFyc2VkICovCisgIGlmIChzdHJlYW0tPm5fc2FtcGxlcyA9PSAwKSB7CisgICAgZ19hc3NlcnQgKHN0cmVhbS0+c2FtcGxlcyA9PSBOVUxMKTsKKyAgICBzdHJlYW0tPnNhbXBsZXMgPSBnX3RyeV9uZXcwIChRdERlbXV4U2FtcGxlLCBzYW1wbGVzX2NvdW50KTsKKyAgICAvKiBvciB0cnkgdG8gcmVhbGxvY2F0ZSBpdCB3aXRoIHNwYWNlIGVub3VnaCB0byBpbnNlcnQgdGhlIG5ldyBzYW1wbGVzICovCisgIH0gZWxzZQorICAgIHN0cmVhbS0+c2FtcGxlcyA9IGdfdHJ5X3JlbmV3IChRdERlbXV4U2FtcGxlLCBzdHJlYW0tPnNhbXBsZXMsCisgICAgICAgIHN0cmVhbS0+bl9zYW1wbGVzICsgc2FtcGxlc19jb3VudCk7CisgIGlmIChzdHJlYW0tPnNhbXBsZXMgPT0gTlVMTCkKKyAgICBnb3RvIG91dF9vZl9tZW1vcnk7CisKKyAgaWYgKHF0ZGVtdXgtPmZyYWdtZW50X3N0YXJ0ICE9IC0xKSB7CisgICAgdGltZXN0YW1wID0gR1NUVElNRV9UT19RVFNUUkVBTVRJTUUgKHN0cmVhbSwgcXRkZW11eC0+ZnJhZ21lbnRfc3RhcnQpOworICAgIHF0ZGVtdXgtPmZyYWdtZW50X3N0YXJ0ID0gLTE7CisgIH0gZWxzZSB7CisgICAgaWYgKHN0cmVhbS0+bl9zYW1wbGVzID09IDApIHsKKyAgICAgIGlmIChkZWNvZGVfdHMgPiAwKSB7CisgICAgICAgIHRpbWVzdGFtcCA9IGRlY29kZV90czsKKyAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLT5wZW5kaW5nX3NlZWsgIT0gTlVMTCkgeworICAgICAgICAvKiBpZiB3ZSBkb24ndCBoYXZlIGEgdGltZXN0YW1wIGZyb20gYSB0ZmR0IGJveCwgd2UnbGwgdXNlIHRoZSBvbmUKKyAgICAgICAgICogZnJvbSB0aGUgbWZyYSBzZWVrIHRhYmxlICovCisgICAgICAgIEdTVF9JTkZPX09CSkVDVCAoc3RyZWFtLT5wYWQsICJwZW5kaW5nIHNlZWsgdHMgPSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChzdHJlYW0tPnBlbmRpbmdfc2Vlay0+dHMpKTsKKworICAgICAgICAvKiBGSVhNRTogdGhpcyBpcyBub3QgZnVsbHkgY29ycmVjdCwgdGhlIHRpbWVzdGFtcCByZWZlcnMgdG8gdGhlIHJhbmRvbQorICAgICAgICAgKiBhY2Nlc3Mgc2FtcGxlIHJlZmVyZWQgdG8gaW4gdGhlIHRmcmEgZW50cnksIHdoaWNoIG1heSBub3QgbmVjZXNzYXJpbHkKKyAgICAgICAgICogYmUgdGhlIGZpcnN0IHNhbXBsZSBpbiB0aGUgdGZyYWcvdHJ1biAoYnV0IGhvcGVmdWxseS91c3VhbGx5IGlzKSAqLworICAgICAgICB0aW1lc3RhbXAgPSBHU1RUSU1FX1RPX1FUU1RSRUFNVElNRSAoc3RyZWFtLCBzdHJlYW0tPnBlbmRpbmdfc2Vlay0+dHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGltZXN0YW1wID0gMDsKKyAgICAgIH0KKworICAgICAgZ3N0X3RzID0gUVRTVFJFQU1USU1FX1RPX0dTVFRJTUUgKHN0cmVhbSwgdGltZXN0YW1wKTsKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoc3RyZWFtLT5wYWQsICJmaXJzdCBzYW1wbGUgdHMgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGdzdF90cykpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBzdWJzZXF1ZW50IGZyYWdtZW50cyBleHRlbmQgc3RyZWFtICovCisgICAgICB0aW1lc3RhbXAgPQorICAgICAgICAgIHN0cmVhbS0+c2FtcGxlc1tzdHJlYW0tPm5fc2FtcGxlcyAtIDFdLnRpbWVzdGFtcCArCisgICAgICAgICAgc3RyZWFtLT5zYW1wbGVzW3N0cmVhbS0+bl9zYW1wbGVzIC0gMV0uZHVyYXRpb247CisKKyAgICAgIC8qIElmIHRoaXMgaXMgYSBHU1RfRk9STUFUX0JZVEVTIHN0cmVhbSBhbmQgdGhlcmUncyBhIHNpZ25pZmljYW50CisgICAgICAgKiBkaWZmZXJlbmNlICgxIHNlYy4pIGJldHdlZW4gZGVjb2RlX3RzIGFuZCB0aW1lc3RhbXAsIHByZWZlciB0aGUKKyAgICAgICAqIGZvcm1lciAqLworICAgICAgaWYgKGhhc190ZmR0ICYmICFxdGRlbXV4LT51cHN0cmVhbV9mb3JtYXRfaXNfdGltZQorICAgICAgICAgICYmIEFCU0RJRkYgKGRlY29kZV90cywgdGltZXN0YW1wKSA+CisgICAgICAgICAgTUFYIChzdHJlYW0tPmR1cmF0aW9uX2xhc3RfbW9vZiAvIDIsCisgICAgICAgICAgICAgIEdTVFRJTUVfVE9fUVRTVFJFQU1USU1FIChzdHJlYW0sIEdTVF9TRUNPTkQpKSkgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAiZGVjb2RlX3RzICglIiBHU1RfVElNRV9GT1JNQVQgIikgYW5kIHRpbWVzdGFtcCAoJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICAgICAiKSBhcmUgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgKG1vcmUgdGhhbiAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAgICIpLCB1c2luZyBkZWNvZGVfdHMiLAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoUVRTVFJFQU1USU1FX1RPX0dTVFRJTUUgKHN0cmVhbSwgZGVjb2RlX3RzKSksCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChRVFNUUkVBTVRJTUVfVE9fR1NUVElNRSAoc3RyZWFtLCB0aW1lc3RhbXApKSwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKFFUU1RSRUFNVElNRV9UT19HU1RUSU1FIChzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgIE1BWCAoc3RyZWFtLT5kdXJhdGlvbl9sYXN0X21vb2YgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgR1NUVElNRV9UT19RVFNUUkVBTVRJTUUgKHN0cmVhbSwgR1NUX1NFQ09ORCkpKSkpOworICAgICAgICB0aW1lc3RhbXAgPSBkZWNvZGVfdHM7CisgICAgICB9CisKKyAgICAgIGdzdF90cyA9IFFUU1RSRUFNVElNRV9UT19HU1RUSU1FIChzdHJlYW0sIHRpbWVzdGFtcCk7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsICJmaXJzdCBzYW1wbGUgdHMgJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICAgIiAoZXh0ZW5kcyBwcmV2aW91cyBzYW1wbGVzKSIsIEdTVF9USU1FX0FSR1MgKGdzdF90cykpOworICAgIH0KKyAgfQorCisgIGluaXRpYWxfb2Zmc2V0ID0gKnJ1bm5pbmdfb2Zmc2V0OworCisgIHNhbXBsZSA9IHN0cmVhbS0+c2FtcGxlcyArIHN0cmVhbS0+bl9zYW1wbGVzOworICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlc19jb3VudDsgaSsrKSB7CisgICAgZ3VpbnQzMiBkdXIsIHNpemUsIHNmbGFncywgY3Q7CisKKyAgICAvKiBmaXJzdCByZWFkIHNhbXBsZSBkYXRhICovCisgICAgaWYgKGZsYWdzICYgVFJfU0FNUExFX0RVUkFUSU9OKSB7CisgICAgICBkdXIgPSBRVF9VSU5UMzIgKGRhdGEgKyBkdXJfb2Zmc2V0KTsKKyAgICB9IGVsc2UgeworICAgICAgZHVyID0gZF9zYW1wbGVfZHVyYXRpb247CisgICAgfQorICAgIGlmIChmbGFncyAmIFRSX1NBTVBMRV9TSVpFKSB7CisgICAgICBzaXplID0gUVRfVUlOVDMyIChkYXRhICsgc2l6ZV9vZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICBzaXplID0gZF9zYW1wbGVfc2l6ZTsKKyAgICB9CisgICAgaWYgKGZsYWdzICYgVFJfRklSU1RfU0FNUExFX0ZMQUdTKSB7CisgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgIHNmbGFncyA9IGZpcnN0X2ZsYWdzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2ZsYWdzID0gZF9zYW1wbGVfZmxhZ3M7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChmbGFncyAmIFRSX1NBTVBMRV9GTEFHUykgeworICAgICAgc2ZsYWdzID0gUVRfVUlOVDMyIChkYXRhICsgZmxhZ3Nfb2Zmc2V0KTsKKyAgICB9IGVsc2UgeworICAgICAgc2ZsYWdzID0gZF9zYW1wbGVfZmxhZ3M7CisgICAgfQorICAgIGlmIChmbGFncyAmIFRSX0NPTVBPU0lUSU9OX1RJTUVfT0ZGU0VUUykgeworICAgICAgY3QgPSBRVF9VSU5UMzIgKGRhdGEgKyBjdF9vZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICBjdCA9IDA7CisgICAgfQorICAgIGRhdGEgKz0gZW50cnlfc2l6ZTsKKworICAgIC8qIGZpbGwgdGhlIHNhbXBsZSBpbmZvcm1hdGlvbiAqLworICAgIHNhbXBsZS0+b2Zmc2V0ID0gKnJ1bm5pbmdfb2Zmc2V0OworICAgIHNhbXBsZS0+cHRzX29mZnNldCA9IGN0OworICAgIHNhbXBsZS0+c2l6ZSA9IHNpemU7CisgICAgc2FtcGxlLT50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgc2FtcGxlLT5kdXJhdGlvbiA9IGR1cjsKKyAgICAvKiBzYW1wbGUtaXMtZGlmZmVyZW5jZS1zYW1wbGUgKi8KKyAgICAvKiBpc212IHNlZW1zIHRvIHVzZSAweDQwIGZvciBrZXlmcmFtZSwgMHhjMCBmb3Igbm9uLWtleWZyYW1lLAorICAgICAqIG5vdyBpZGVhIGhvdyBpdCByZWxhdGVzIHRvIGJpdGZpZWxkIG90aGVyIHRoYW4gbWFzc2l2ZSBMRS9CRSBjb25mdXNpb24gKi8KKyAgICBzYW1wbGUtPmtleWZyYW1lID0gaXNtdiA/ICgoc2ZsYWdzICYgMHhmZikgPT0gMHg0MCkgOiAhKHNmbGFncyAmIDB4MTAwMDApOworICAgICpydW5uaW5nX29mZnNldCArPSBzaXplOworICAgIHRpbWVzdGFtcCArPSBkdXI7CisgICAgc3RyZWFtLT5kdXJhdGlvbl9tb29mICs9IGR1cjsKKyAgICBzYW1wbGUrKzsKKyAgfQorCisgIC8qIFVwZGF0ZSB0b3RhbCBkdXJhdGlvbiBpZiBuZWVkZWQgKi8KKyAgY2hlY2tfdXBkYXRlX2R1cmF0aW9uIChxdGRlbXV4LCBRVFNUUkVBTVRJTUVfVE9fR1NUVElNRSAoc3RyZWFtLCB0aW1lc3RhbXApKTsKKworICAvKiBQcmUtZW1wdGl2ZWx5IGZpZ3VyZSBvdXQgc2l6ZSBvZiBtZGF0IGJhc2VkIG9uIHRydW4gaW5mb3JtYXRpb24uCisgICAqIElmIHRoZSBbbWRhdF0gYXRvbSBpcyBlZmZlY3RpdmVsbHkgcmVhZCwgaXQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgYWN0dWFsCisgICAqIHNpemUsIGVsc2Ugd2Ugd2lsbCBzdGlsbCBiZSBhYmxlIHRvIHVzZSB0aGlzIHdoZW4gZGVhbGluZyB3aXRoIGdhcCdlZAorICAgKiBpbnB1dCAqLworICBxdGRlbXV4LT5tZGF0bGVmdCA9ICpydW5uaW5nX29mZnNldCAtIGluaXRpYWxfb2Zmc2V0OworICBxdGRlbXV4LT5tZGF0b2Zmc2V0ID0gaW5pdGlhbF9vZmZzZXQ7CisgIHF0ZGVtdXgtPm1kYXRzaXplID0gcXRkZW11eC0+bWRhdGxlZnQ7CisKKyAgc3RyZWFtLT5uX3NhbXBsZXMgKz0gc2FtcGxlc19jb3VudDsKKyAgc3RyZWFtLT5uX3NhbXBsZXNfbW9vZiArPSBzYW1wbGVzX2NvdW50OworCisgIGlmIChzdHJlYW0tPnBlbmRpbmdfc2VlayAhPSBOVUxMKQorICAgIHN0cmVhbS0+cGVuZGluZ19zZWVrID0gTlVMTDsKKworICByZXR1cm4gVFJVRTsKKworZmFpbDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgImZhaWxlZCB0byBwYXJzZSB0cnVuIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitvdXRfb2ZfbWVtb3J5OgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAiZmFpbGVkIHRvIGFsbG9jYXRlICVkIHNhbXBsZXMiLAorICAgICAgICBzdHJlYW0tPm5fc2FtcGxlcyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbmRleF90b29fYmlnOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAibm90IGFsbG9jYXRpbmcgaW5kZXggb2YgJWQgc2FtcGxlcywgd291bGQgIgorICAgICAgICAiYmUgbGFyZ2VyIHRoYW4gJXVNQiAoYnJva2VuIGZpbGU/KSIsIHN0cmVhbS0+bl9zYW1wbGVzLAorICAgICAgICBRVERFTVVYX01BWF9TQU1QTEVfSU5ERVhfU0laRSA+PiAyMCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qIGZpbmQgc3RyZWFtIHdpdGggQGlkICovCitzdGF0aWMgaW5saW5lIFF0RGVtdXhTdHJlYW0gKgorcXRkZW11eF9maW5kX3N0cmVhbSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIGd1aW50MzIgaWQpCit7CisgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbTsKKyAgZ2ludCBpOworCisgIC8qIGNoZWNrICovCisgIGlmIChHX1VOTElLRUxZICghaWQpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImludmFsaWQgdHJhY2sgaWQgMCIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLyogdHJ5IHRvIGdldCBpdCBmYXN0IGFuZCBzaW1wbGUgKi8KKyAgaWYgKEdfTElLRUxZIChpZCA8PSBxdGRlbXV4LT5uX3N0cmVhbXMpKSB7CisgICAgc3RyZWFtID0gcXRkZW11eC0+c3RyZWFtc1tpZCAtIDFdOworICAgIGlmIChHX0xJS0VMWSAoc3RyZWFtLT50cmFja19pZCA9PSBpZCkpCisgICAgICByZXR1cm4gc3RyZWFtOworICB9CisKKyAgLyogbGluZWFyIHNlYXJjaCBvdGhlcndpc2UgKi8KKyAgZm9yIChpID0gMDsgaSA8IHF0ZGVtdXgtPm5fc3RyZWFtczsgaSsrKSB7CisgICAgc3RyZWFtID0gcXRkZW11eC0+c3RyZWFtc1tpXTsKKyAgICBpZiAoc3RyZWFtLT50cmFja19pZCA9PSBpZCkKKyAgICAgIHJldHVybiBzdHJlYW07CisgIH0KKyAgaWYgKHF0ZGVtdXgtPm1zc19tb2RlKSB7CisgICAgLyogbXNzIHNob3VsZCBoYXZlIG9ubHkgMSBzdHJlYW0gYW55d2F5ICovCisgICAgcmV0dXJuIHF0ZGVtdXgtPnN0cmVhbXNbMF07CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X3BhcnNlX21maGQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogbWZoZCwKKyAgICBndWludDMyICogZnJhZ21lbnRfbnVtYmVyKQoreworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwIChtZmhkLCA0KSkKKyAgICBnb3RvIGZhaWw7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKG1maGQsIGZyYWdtZW50X251bWJlcikpCisgICAgZ290byBmYWlsOworICByZXR1cm4gVFJVRTsKK2ZhaWw6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJGYWlsZWQgdG8gcGFyc2UgbWZoZCBhdG9tIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcXRkZW11eF9wYXJzZV90ZmhkIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIHRmaGQsCisgICAgUXREZW11eFN0cmVhbSAqKiBzdHJlYW0sIGd1aW50MzIgKiBkZWZhdWx0X3NhbXBsZV9kdXJhdGlvbiwKKyAgICBndWludDMyICogZGVmYXVsdF9zYW1wbGVfc2l6ZSwgZ3VpbnQzMiAqIGRlZmF1bHRfc2FtcGxlX2ZsYWdzLAorICAgIGdpbnQ2NCAqIGJhc2Vfb2Zmc2V0KQoreworICBndWludDMyIGZsYWdzID0gMDsKKyAgZ3VpbnQzMiB0cmFja19pZCA9IDA7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAodGZoZCwgMSkgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQyNF9iZSAodGZoZCwgJmZsYWdzKSkKKyAgICBnb3RvIGludmFsaWRfdHJhY2s7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAodGZoZCwgJnRyYWNrX2lkKSkKKyAgICBnb3RvIGludmFsaWRfdHJhY2s7CisKKyAgKnN0cmVhbSA9IHF0ZGVtdXhfZmluZF9zdHJlYW0gKHF0ZGVtdXgsIHRyYWNrX2lkKTsKKyAgaWYgKEdfVU5MSUtFTFkgKCEqc3RyZWFtKSkKKyAgICBnb3RvIHVua25vd25fc3RyZWFtOworCisgIGlmIChmbGFncyAmIFRGX0RFRkFVTFRfQkFTRV9JU19NT09GKQorICAgICpiYXNlX29mZnNldCA9IHF0ZGVtdXgtPm1vb2Zfb2Zmc2V0OworCisgIGlmIChmbGFncyAmIFRGX0JBU0VfREFUQV9PRkZTRVQpCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQ2NF9iZSAodGZoZCwgKGd1aW50NjQgKikgYmFzZV9vZmZzZXQpKQorICAgICAgZ290byBpbnZhbGlkX3RyYWNrOworCisgIC8qIG9idGFpbiBzdHJlYW0gZGVmYXVsdHMgKi8KKyAgcXRkZW11eF9wYXJzZV90cmV4IChxdGRlbXV4LCAqc3RyZWFtLAorICAgICAgZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24sIGRlZmF1bHRfc2FtcGxlX3NpemUsIGRlZmF1bHRfc2FtcGxlX2ZsYWdzKTsKKworICAoKnN0cmVhbSktPnN0c2Rfc2FtcGxlX2Rlc2NyaXB0aW9uX2lkID0KKyAgICAgICgqc3RyZWFtKS0+ZGVmX3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCAtIDE7CisKKyAgaWYgKGZsYWdzICYgVEZfU0FNUExFX0RFU0NSSVBUSU9OX0lOREVYKSB7CisgICAgZ3VpbnQzMiBzYW1wbGVfZGVzY3JpcHRpb25faW5kZXg7CisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAodGZoZCwgJnNhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCkpCisgICAgICBnb3RvIGludmFsaWRfdHJhY2s7CisgICAgKCpzdHJlYW0pLT5zdHNkX3NhbXBsZV9kZXNjcmlwdGlvbl9pZCA9IHNhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCAtIDE7CisgIH0KKworICBpZiAocXRkZW11eC0+bXNzX21vZGUpIHsKKyAgICAvKiBtc3MgaGFzIG5vIHN0c2QgZW50cnkgKi8KKyAgICAoKnN0cmVhbSktPnN0c2Rfc2FtcGxlX2Rlc2NyaXB0aW9uX2lkID0gMDsKKyAgfQorCisgIGlmIChmbGFncyAmIFRGX0RFRkFVTFRfU0FNUExFX0RVUkFUSU9OKQorICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKHRmaGQsIGRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uKSkKKyAgICAgIGdvdG8gaW52YWxpZF90cmFjazsKKworICBpZiAoZmxhZ3MgJiBURl9ERUZBVUxUX1NBTVBMRV9TSVpFKQorICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKHRmaGQsIGRlZmF1bHRfc2FtcGxlX3NpemUpKQorICAgICAgZ290byBpbnZhbGlkX3RyYWNrOworCisgIGlmIChmbGFncyAmIFRGX0RFRkFVTFRfU0FNUExFX0ZMQUdTKQorICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKHRmaGQsIGRlZmF1bHRfc2FtcGxlX2ZsYWdzKSkKKyAgICAgIGdvdG8gaW52YWxpZF90cmFjazsKKworICByZXR1cm4gVFJVRTsKKworaW52YWxpZF90cmFjazoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgImludmFsaWQgdHJhY2sgZnJhZ21lbnQgaGVhZGVyIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit1bmtub3duX3N0cmVhbToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJ1bmtub3duIHN0cmVhbSBpbiB0ZmhkIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X3BhcnNlX3RmZHQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogYnIsCisgICAgZ3VpbnQ2NCAqIGRlY29kZV90aW1lKQoreworICBndWludDMyIHZlcnNpb24gPSAwOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGJyLCAmdmVyc2lvbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHZlcnNpb24gPj49IDI0OworICBpZiAodmVyc2lvbiA9PSAxKSB7CisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQ2NF9iZSAoYnIsIGRlY29kZV90aW1lKSkKKyAgICAgIGdvdG8gZmFpbGVkOworICB9IGVsc2UgeworICAgIGd1aW50MzIgZGVjX3RpbWUgPSAwOworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGJyLCAmZGVjX3RpbWUpKQorICAgICAgZ290byBmYWlsZWQ7CisgICAgKmRlY29kZV90aW1lID0gZGVjX3RpbWU7CisgIH0KKworICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsICJUcmFjayBmcmFnbWVudCBkZWNvZGUgdGltZTogJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICpkZWNvZGVfdGltZSk7CisKKyAgcmV0dXJuIFRSVUU7CisKK2ZhaWxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJwYXJzaW5nIHRmZHQgZmFpbGVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qIFJldHVybnMgYSBwb2ludGVyIHRvIGEgR3N0U3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgb2YKKyAqIHRoZSBzdHJlYW0gc2FtcGxlIGlkZW50aWZpZWQgYnkgQHNhbXBsZV9pbmRleC4gVGhlIGNhbGxlciBtdXN0IHVucmVmCisgKiB0aGUgcmV0dXJuZWQgb2JqZWN0IGFmdGVyIHVzZS4gUmV0dXJucyBOVUxMIGlmIHVuc3VjY2Vzc2Z1bC4gKi8KK3N0YXRpYyBHc3RTdHJ1Y3R1cmUgKgorcXRkZW11eF9nZXRfY2VuY19zYW1wbGVfcHJvcGVydGllcyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwgZ3VpbnQgc2FtcGxlX2luZGV4KQoreworICBRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8gKmluZm8gPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzdHJlYW0gIT0gTlVMTCwgTlVMTCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzdHJlYW0tPnByb3RlY3RlZCwgTlVMTCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzdHJlYW0tPnByb3RlY3Rpb25fc2NoZW1lX2luZm8gIT0gTlVMTCwgTlVMTCk7CisKKyAgaW5mbyA9IChRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8gKikgc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV9pbmZvOworCisgIC8qIEN1cnJlbnRseSwgY2VuYyBwcm9wZXJ0aWVzIGZvciBncm91cHMgb2Ygc2FtcGxlcyBhcmUgbm90IHN1cHBvcnRlZCwgc28KKyAgICogc2ltcGx5IHJldHVybiBhIGNvcHkgb2YgdGhlIGRlZmF1bHQgc2FtcGxlIHByb3BlcnRpZXMgKi8KKyAgcmV0dXJuIGdzdF9zdHJ1Y3R1cmVfY29weSAoaW5mby0+ZGVmYXVsdF9wcm9wZXJ0aWVzKTsKK30KKworLyogUGFyc2VzIHRoZSBzaXplcyBvZiBzYW1wbGUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIGNvbnRhaW5lZCB3aXRoaW4gYSBzdHJlYW0sCisgKiBhcyBnaXZlbiBpbiBhIHNhaXogYm94LiBSZXR1cm5zIGFycmF5IG9mIHNhbXBsZV9jb3VudCBndWludDggc2l6ZSB2YWx1ZXMsCisgKiBvciBOVUxMIG9uIGZhaWx1cmUgKi8KK3N0YXRpYyBndWludDggKgorcXRkZW11eF9wYXJzZV9zYWl6IChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwKKyAgICBHc3RCeXRlUmVhZGVyICogYnIsIGd1aW50MzIgKiBzYW1wbGVfY291bnQpCit7CisgIGd1aW50MzIgZmxhZ3MgPSAwOworICBndWludDggKmluZm9fc2l6ZXM7CisgIGd1aW50OCBkZWZhdWx0X2luZm9fc2l6ZTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAocXRkZW11eCAhPSBOVUxMLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHN0cmVhbSAhPSBOVUxMLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGJyICE9IE5VTEwsIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc2FtcGxlX2NvdW50ICE9IE5VTEwsIE5VTEwpOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGJyLCAmZmxhZ3MpKQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChmbGFncyAmIDB4MSkgeworICAgIC8qIGF1eF9pbmZvX3R5cGUgYW5kIGF1eF9pbmZvX3R5cGVfcGFyYW1ldGVyIGFyZSBpZ25vcmVkICovCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoYnIsIDgpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKGJyLCAmZGVmYXVsdF9pbmZvX3NpemUpKQorICAgIHJldHVybiBOVUxMOworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZGVmYXVsdF9pbmZvX3NpemU6ICV1IiwgZGVmYXVsdF9pbmZvX3NpemUpOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGJyLCBzYW1wbGVfY291bnQpKQorICAgIHJldHVybiBOVUxMOworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic2FtcGxlX2NvdW50OiAldSIsICpzYW1wbGVfY291bnQpOworCisKKyAgaWYgKGRlZmF1bHRfaW5mb19zaXplID09IDApIHsKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9kdXBfZGF0YSAoYnIsICpzYW1wbGVfY291bnQsICZpbmZvX3NpemVzKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9IGVsc2UgeworICAgIGluZm9fc2l6ZXMgPSBnX25ldyAoZ3VpbnQ4LCAqc2FtcGxlX2NvdW50KTsKKyAgICBtZW1zZXQgKGluZm9fc2l6ZXMsIGRlZmF1bHRfaW5mb19zaXplLCAqc2FtcGxlX2NvdW50KTsKKyAgfQorCisgIHJldHVybiBpbmZvX3NpemVzOworfQorCisvKiBQYXJzZXMgdGhlIG9mZnNldCBvZiBzYW1wbGUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIGNvbnRhaW5lZCB3aXRoaW4gYSBzdHJlYW0sCisgKiBhcyBnaXZlbiBpbiBhIHNhaW8gYm94LiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bDsgRkFMU0Ugb3RoZXJ3aXNlLiAqLworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X3BhcnNlX3NhaW8gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBRdERlbXV4U3RyZWFtICogc3RyZWFtLAorICAgIEdzdEJ5dGVSZWFkZXIgKiBiciwgZ3VpbnQzMiAqIGluZm9fdHlwZSwgZ3VpbnQzMiAqIGluZm9fdHlwZV9wYXJhbWV0ZXIsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ4IHZlcnNpb24gPSAwOworICBndWludDMyIGZsYWdzID0gMDsKKyAgZ3VpbnQzMiBhdXhfaW5mb190eXBlID0gMDsKKyAgZ3VpbnQzMiBhdXhfaW5mb190eXBlX3BhcmFtZXRlciA9IDA7CisgIGd1aW50MzIgZW50cnlfY291bnQ7CisgIGd1aW50MzIgb2ZmXzMyOworICBndWludDY0IG9mZl82NDsKKyAgY29uc3QgZ3VpbnQ4ICphdXhfaW5mb190eXBlX2RhdGEgPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChxdGRlbXV4ICE9IE5VTEwsIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHN0cmVhbSAhPSBOVUxMLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChiciAhPSBOVUxMLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChvZmZzZXQgIT0gTlVMTCwgRkFMU0UpOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAoYnIsICZ2ZXJzaW9uKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQyNF9iZSAoYnIsICZmbGFncykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChmbGFncyAmIDB4MSkgeworCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2RhdGEgKGJyLCA0LCAmYXV4X2luZm9fdHlwZV9kYXRhKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBhdXhfaW5mb190eXBlID0gUVRfRk9VUkNDIChhdXhfaW5mb190eXBlX2RhdGEpOworCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoYnIsICZhdXhfaW5mb190eXBlX3BhcmFtZXRlcikpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0gZWxzZSBpZiAoc3RyZWFtLT5wcm90ZWN0ZWQpIHsKKyAgICBhdXhfaW5mb190eXBlID0gc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV90eXBlOworICB9IGVsc2UgeworICAgIGF1eF9pbmZvX3R5cGUgPSBDVVJfU1RSRUFNIChzdHJlYW0pLT5mb3VyY2M7CisgIH0KKworICBpZiAoaW5mb190eXBlKQorICAgICppbmZvX3R5cGUgPSBhdXhfaW5mb190eXBlOworICBpZiAoaW5mb190eXBlX3BhcmFtZXRlcikKKyAgICAqaW5mb190eXBlX3BhcmFtZXRlciA9IGF1eF9pbmZvX3R5cGVfcGFyYW1ldGVyOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJhdXhfaW5mb190eXBlOiAnJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIicsICIKKyAgICAgICJhdXhfaW5mb190eXBlX3BhcmFtZXRlcjogICUjMDZ4IiwKKyAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoYXV4X2luZm9fdHlwZSksIGF1eF9pbmZvX3R5cGVfcGFyYW1ldGVyKTsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChiciwgJmVudHJ5X2NvdW50KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGVudHJ5X2NvdW50ICE9IDEpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChxdGRlbXV4LCAibXVsdGlwbGUgb2Zmc2V0cyBhcmUgbm90IHN1cHBvcnRlZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmICh2ZXJzaW9uID09IDApIHsKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChiciwgJm9mZl8zMikpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgKm9mZnNldCA9IChndWludDY0KSBvZmZfMzI7CisgIH0gZWxzZSB7CisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQ2NF9iZSAoYnIsICZvZmZfNjQpKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgICpvZmZzZXQgPSBvZmZfNjQ7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAib2Zmc2V0OiAlIiBHX0dVSU5UNjRfRk9STUFULCAqb2Zmc2V0KTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitxdGRlbXV4X2dzdF9zdHJ1Y3R1cmVfZnJlZSAoR3N0U3RydWN0dXJlICogZ3N0c3RydWN0dXJlKQoreworICBpZiAoZ3N0c3RydWN0dXJlKSB7CisgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChnc3RzdHJ1Y3R1cmUpOworICB9Cit9CisKKy8qIFBhcnNlcyBhdXhpbGlhcnkgaW5mb3JtYXRpb24gcmVsYXRpbmcgdG8gc2FtcGxlcyBwcm90ZWN0ZWQgdXNpbmcgQ29tbW9uCisgKiBFbmNyeXB0aW9uIChjZW5jKTsgdGhlIGZvcm1hdCBvZiB0aGlzIGluZm9ybWF0aW9uIGlzIGRlZmluZWQgaW4KKyAqIElTTy9JRUMgMjMwMDEtNy4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWw7IEZBTFNFIG90aGVyd2lzZS4gKi8KK3N0YXRpYyBnYm9vbGVhbgorcXRkZW11eF9wYXJzZV9jZW5jX2F1eF9pbmZvIChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwKKyAgICBHc3RCeXRlUmVhZGVyICogYnIsIGd1aW50OCAqIGluZm9fc2l6ZXMsIGd1aW50MzIgc2FtcGxlX2NvdW50KQoreworICBRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8gKnNzX2luZm8gPSBOVUxMOworICBndWludDggc2l6ZTsKKyAgZ2ludCBpOworICBHUHRyQXJyYXkgKm9sZF9jcnlwdG9faW5mbyA9IE5VTEw7CisgIGd1aW50IG9sZF9lbnRyaWVzID0gMDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAocXRkZW11eCAhPSBOVUxMLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzdHJlYW0gIT0gTlVMTCwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoYnIgIT0gTlVMTCwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc3RyZWFtLT5wcm90ZWN0ZWQsIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfaW5mbyAhPSBOVUxMLCBGQUxTRSk7CisKKyAgc3NfaW5mbyA9IChRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8gKikgc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV9pbmZvOworCisgIGlmIChzc19pbmZvLT5jcnlwdG9faW5mbykgeworICAgIG9sZF9jcnlwdG9faW5mbyA9IHNzX2luZm8tPmNyeXB0b19pbmZvOworICAgIC8qIENvdW50IG51bWJlciBvZiBub24tbnVsbCBlbnRyaWVzIHJlbWFpbmluZyBhdCB0aGUgdGFpbCBlbmQgKi8KKyAgICBmb3IgKGkgPSBvbGRfY3J5cHRvX2luZm8tPmxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICBpZiAoZ19wdHJfYXJyYXlfaW5kZXggKG9sZF9jcnlwdG9faW5mbywgaSkgPT0gTlVMTCkKKyAgICAgICAgYnJlYWs7CisgICAgICBvbGRfZW50cmllcysrOworICAgIH0KKyAgfQorCisgIHNzX2luZm8tPmNyeXB0b19pbmZvID0KKyAgICAgIGdfcHRyX2FycmF5X25ld19mdWxsIChzYW1wbGVfY291bnQgKyBvbGRfZW50cmllcywKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgcXRkZW11eF9nc3Rfc3RydWN0dXJlX2ZyZWUpOworCisgIC8qIFdlIHByZXNlcnZlIG9sZCBlbnRyaWVzIGJlY2F1c2Ugd2UgcGFyc2UgdGhlIG5leHQgbW9vZiBpbiBhZHZhbmNlCisgICAqIG9mIGNvbnN1bWluZyBhbGwgc2FtcGxlcyBmcm9tIHRoZSBwcmV2aW91cyBtb29mLCBhbmQgb3RoZXJ3aXNlCisgICAqIHdlJ2QgZGlzY2FyZCB0aGUgY29ycmVzcG9uZGluZyBjcnlwdG8gaW5mbyBmb3IgdGhlIHNhbXBsZXMKKyAgICogZnJvbSB0aGUgcHJldmlvdXMgZnJhZ21lbnQuICovCisgIGlmIChvbGRfZW50cmllcykgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJQcmVzZXJ2aW5nICVkIG9sZCBjcnlwdG8gaW5mbyBlbnRyaWVzIiwKKyAgICAgICAgb2xkX2VudHJpZXMpOworICAgIGZvciAoaSA9IG9sZF9jcnlwdG9faW5mby0+bGVuIC0gb2xkX2VudHJpZXM7IGkgPCBvbGRfY3J5cHRvX2luZm8tPmxlbjsgaSsrKSB7CisgICAgICBnX3B0cl9hcnJheV9hZGQgKHNzX2luZm8tPmNyeXB0b19pbmZvLCBnX3B0cl9hcnJheV9pbmRleCAob2xkX2NyeXB0b19pbmZvLAorICAgICAgICAgICAgICBpKSk7CisgICAgICBnX3B0cl9hcnJheV9pbmRleCAob2xkX2NyeXB0b19pbmZvLCBpKSA9IE5VTEw7CisgICAgfQorICB9CisKKyAgaWYgKG9sZF9jcnlwdG9faW5mbykgeworICAgIC8qIEV2ZXJ5dGhpbmcgbm93IGJlbG9uZ3MgdG8gdGhlIG5ldyBhcnJheSAqLworICAgIGdfcHRyX2FycmF5X2ZyZWUgKG9sZF9jcnlwdG9faW5mbywgVFJVRSk7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlX2NvdW50OyArK2kpIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnByb3BlcnRpZXM7CisgICAgZ3VpbnQxNiBuX3N1YnNhbXBsZXMgPSAwOworICAgIGd1aW50OCAqZGF0YTsKKyAgICBndWludCBpdl9zaXplOworICAgIEdzdEJ1ZmZlciAqYnVmOworCisgICAgcHJvcGVydGllcyA9IHF0ZGVtdXhfZ2V0X2NlbmNfc2FtcGxlX3Byb3BlcnRpZXMgKHF0ZGVtdXgsIHN0cmVhbSwgaSk7CisgICAgaWYgKHByb3BlcnRpZXMgPT0gTlVMTCkgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwgImZhaWxlZCB0byBnZXQgcHJvcGVydGllcyBmb3Igc2FtcGxlICV1IiwgaSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAocHJvcGVydGllcywgIml2X3NpemUiLCAmaXZfc2l6ZSkpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJmYWlsZWQgdG8gZ2V0IGl2X3NpemUgZm9yIHNhbXBsZSAldSIsIGkpOworICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChwcm9wZXJ0aWVzKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZHVwX2RhdGEgKGJyLCBpdl9zaXplLCAmZGF0YSkpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJmYWlsZWQgdG8gZ2V0IElWIGZvciBzYW1wbGUgJXUiLCBpKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocHJvcGVydGllcyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGRhdGEsIGl2X3NpemUpOworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChwcm9wZXJ0aWVzLCAiaXYiLCBHU1RfVFlQRV9CVUZGRVIsIGJ1ZiwgTlVMTCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICBzaXplID0gaW5mb19zaXplc1tpXTsKKyAgICBpZiAoc2l6ZSA+IGl2X3NpemUpIHsKKyAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfYmUgKGJyLCAmbl9zdWJzYW1wbGVzKQorICAgICAgICAgIHx8ICEobl9zdWJzYW1wbGVzID4gMCkpIHsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChwcm9wZXJ0aWVzKTsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICJmYWlsZWQgdG8gZ2V0IHN1YnNhbXBsZSBjb3VudCBmb3Igc2FtcGxlICV1IiwgaSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAic3Vic2FtcGxlIGNvdW50OiAldSIsIG5fc3Vic2FtcGxlcyk7CisgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9kdXBfZGF0YSAoYnIsIG5fc3Vic2FtcGxlcyAqIDYsICZkYXRhKSkgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChxdGRlbXV4LCAiZmFpbGVkIHRvIGdldCBzdWJzYW1wbGUgZGF0YSBmb3Igc2FtcGxlICV1IiwKKyAgICAgICAgICAgIGkpOworICAgICAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHByb3BlcnRpZXMpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBidWYgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChkYXRhLCBuX3N1YnNhbXBsZXMgKiA2KTsKKyAgICAgIGlmICghYnVmKSB7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocHJvcGVydGllcyk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChwcm9wZXJ0aWVzLAorICAgICAgICAgICJzdWJzYW1wbGVfY291bnQiLCBHX1RZUEVfVUlOVCwgbl9zdWJzYW1wbGVzLAorICAgICAgICAgICJzdWJzYW1wbGVzIiwgR1NUX1RZUEVfQlVGRkVSLCBidWYsIE5VTEwpOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICB9IGVsc2UgeworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHByb3BlcnRpZXMsICJzdWJzYW1wbGVfY291bnQiLCBHX1RZUEVfVUlOVCwgMCwgTlVMTCk7CisgICAgfQorICAgIGdfcHRyX2FycmF5X2FkZCAoc3NfaW5mby0+Y3J5cHRvX2luZm8sIHByb3BlcnRpZXMpOworICB9CisgIHJldHVybiBUUlVFOworfQorCisvKiBDb252ZXJ0cyBhIFVVSUQgaW4gcmF3IGJ5dGUgZm9ybSB0byBhIHN0cmluZyByZXByZXNlbnRhdGlvbiwgYXMgZGVmaW5lZCBpbgorICogUkZDIDQxMjIuIFRoZSBjYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSByZXR1cm5lZCBzdHJpbmcgYW5kIGlzCisgKiByZXNwb25zaWJsZSBmb3IgZnJlZWluZyBpdCBhZnRlciB1c2UuICovCitzdGF0aWMgZ2NoYXIgKgorcXRkZW11eF91dWlkX2J5dGVzX3RvX3N0cmluZyAoZ2NvbnN0cG9pbnRlciB1dWlkX2J5dGVzKQoreworICBjb25zdCBndWludDggKnV1aWQgPSAoY29uc3QgZ3VpbnQ4ICopIHV1aWRfYnl0ZXM7CisKKyAgcmV0dXJuIGdfc3RyZHVwX3ByaW50ZiAoIiUwMnglMDJ4JTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMngtIgorICAgICAgIiUwMnglMDJ4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICB1dWlkWzBdLCB1dWlkWzFdLCB1dWlkWzJdLCB1dWlkWzNdLAorICAgICAgdXVpZFs0XSwgdXVpZFs1XSwgdXVpZFs2XSwgdXVpZFs3XSwKKyAgICAgIHV1aWRbOF0sIHV1aWRbOV0sIHV1aWRbMTBdLCB1dWlkWzExXSwKKyAgICAgIHV1aWRbMTJdLCB1dWlkWzEzXSwgdXVpZFsxNF0sIHV1aWRbMTVdKTsKK30KKworLyogUGFyc2VzIGEgUHJvdGVjdGlvbiBTeXN0ZW0gU3BlY2lmaWMgSGVhZGVyIGJveCAocHNzaCksIGFzIGRlZmluZWQgaW4gdGhlCisgKiBDb21tb24gRW5jcnlwdGlvbiAoY2VuYykgc3RhbmRhcmQgKElTTy9JRUMgMjMwMDEtNyksIHdoaWNoIGNvbnRhaW5zCisgKiBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgYSBzcGVjaWZpYyBjb250ZW50IHByb3RlY3Rpb24gc3lzdGVtIGluIG9yZGVyIHRvCisgKiBkZWNyeXB0IGNlbmMtcHJvdGVjdGVkIHRyYWNrcy4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWw7IEZBTFNFCisgKiBvdGhlcndpc2UuICovCitzdGF0aWMgZ2Jvb2xlYW4KK3F0ZGVtdXhfcGFyc2VfcHNzaCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdOb2RlICogbm9kZSkKK3sKKyAgZ2NoYXIgKnN5c2lkX3N0cmluZzsKKyAgZ3VpbnQzMiBwc3NoX3NpemUgPSBRVF9VSU5UMzIgKG5vZGUtPmRhdGEpOworICBHc3RCdWZmZXIgKnBzc2ggPSBOVUxMOworICBHc3RFdmVudCAqZXZlbnQgPSBOVUxMOworICBndWludDMyIHBhcmVudF9ib3hfdHlwZTsKKyAgZ2ludCBpOworCisgIGlmIChHX1VOTElLRUxZIChwc3NoX3NpemUgPCAzMlUpKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwgImludmFsaWQgYm94IHNpemUiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBzeXNpZF9zdHJpbmcgPQorICAgICAgcXRkZW11eF91dWlkX2J5dGVzX3RvX3N0cmluZyAoKGNvbnN0IGd1aW50OCAqKSBub2RlLT5kYXRhICsgMTIpOworCisgIGdzdF9xdGRlbXV4X2FwcGVuZF9wcm90ZWN0aW9uX3N5c3RlbV9pZCAocXRkZW11eCwgc3lzaWRfc3RyaW5nKTsKKworICBwc3NoID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZ19tZW1kdXAgKG5vZGUtPmRhdGEsIHBzc2hfc2l6ZSksIHBzc2hfc2l6ZSk7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiY2VuYyBwc3NoIHNpemU6ICUiIEdfR1NJWkVfRk9STUFULAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAocHNzaCkpOworCisgIHBhcmVudF9ib3hfdHlwZSA9IFFUX0ZPVVJDQyAoKGNvbnN0IGd1aW50OCAqKSBub2RlLT5wYXJlbnQtPmRhdGEgKyA0KTsKKworICAvKiBQdXNoIGFuIGV2ZW50IGNvbnRhaW5pbmcgdGhlIHBzc2ggYm94IG9udG8gdGhlIHF1ZXVlcyBvZiBhbGwgc3RyZWFtcy4gKi8KKyAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3Byb3RlY3Rpb24gKHN5c2lkX3N0cmluZywgcHNzaCwKKyAgICAgIChwYXJlbnRfYm94X3R5cGUgPT0gRk9VUkNDX21vb3YpID8gImlzb2JtZmYvbW9vdiIgOiAiaXNvYm1mZi9tb29mIik7CisgIGZvciAoaSA9IDA7IGkgPCBxdGRlbXV4LT5uX3N0cmVhbXM7ICsraSkgeworICAgIGdfcXVldWVfcHVzaF90YWlsICgmcXRkZW11eC0+c3RyZWFtc1tpXS0+cHJvdGVjdGlvbl9zY2hlbWVfZXZlbnRfcXVldWUsCisgICAgICAgIGdzdF9ldmVudF9yZWYgKGV2ZW50KSk7CisgIH0KKyAgZ19mcmVlIChzeXNpZF9zdHJpbmcpOworICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAocHNzaCk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3F0ZGVtdXhfcGFyc2VfbW9vZiAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIGNvbnN0IGd1aW50OCAqIGJ1ZmZlciwgZ3VpbnQgbGVuZ3RoLAorICAgIGd1aW50NjQgbW9vZl9vZmZzZXQsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0pCit7CisgIEdOb2RlICptb29mX25vZGUsICp0cmFmX25vZGUsICp0ZmhkX25vZGUsICp0cnVuX25vZGUsICp0ZmR0X25vZGUsICptZmhkX25vZGU7CisgIEdOb2RlICp1dWlkX25vZGU7CisgIEdzdEJ5dGVSZWFkZXIgbWZoZF9kYXRhLCB0cnVuX2RhdGEsIHRmaGRfZGF0YSwgdGZkdF9kYXRhOworICBHTm9kZSAqc2Fpel9ub2RlLCAqc2Fpb19ub2RlLCAqcHNzaF9ub2RlOworICBHc3RCeXRlUmVhZGVyIHNhaXpfZGF0YSwgc2Fpb19kYXRhOworICBndWludDMyIGRzX3NpemUgPSAwLCBkc19kdXJhdGlvbiA9IDAsIGRzX2ZsYWdzID0gMDsKKyAgZ2ludDY0IGJhc2Vfb2Zmc2V0LCBydW5uaW5nX29mZnNldDsKKyAgZ3VpbnQzMiBmcmFnX251bTsKKworICAvKiBOT1RFIEBzdHJlYW0gaWdub3JlZCAqLworCisgIG1vb2Zfbm9kZSA9IGdfbm9kZV9uZXcgKChndWludDggKikgYnVmZmVyKTsKKyAgcXRkZW11eF9wYXJzZV9ub2RlIChxdGRlbXV4LCBtb29mX25vZGUsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgcXRkZW11eF9ub2RlX2R1bXAgKHF0ZGVtdXgsIG1vb2Zfbm9kZSk7CisKKyAgLyogR2V0IGZyYWdtZW50IG51bWJlciBmcm9tIG1maGQgYW5kIGNoZWNrIGl0J3MgdmFsaWQgKi8KKyAgbWZoZF9ub2RlID0KKyAgICAgIHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZV9mdWxsIChtb29mX25vZGUsIEZPVVJDQ19tZmhkLCAmbWZoZF9kYXRhKTsKKyAgaWYgKG1maGRfbm9kZSA9PSBOVUxMKQorICAgIGdvdG8gbWlzc2luZ19tZmhkOworICBpZiAoIXF0ZGVtdXhfcGFyc2VfbWZoZCAocXRkZW11eCwgJm1maGRfZGF0YSwgJmZyYWdfbnVtKSkKKyAgICBnb3RvIGZhaWw7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJGcmFnbWVudCAjJWQiLCBmcmFnX251bSk7CisKKyAgLyogdW5rbm93biBiYXNlX29mZnNldCB0byBzdGFydCB3aXRoICovCisgIGJhc2Vfb2Zmc2V0ID0gcnVubmluZ19vZmZzZXQgPSAtMTsKKyAgdHJhZl9ub2RlID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChtb29mX25vZGUsIEZPVVJDQ190cmFmKTsKKyAgd2hpbGUgKHRyYWZfbm9kZSkgeworICAgIGd1aW50NjQgZGVjb2RlX3RpbWUgPSAwOworCisgICAgLyogRnJhZ21lbnQgSGVhZGVyIG5vZGUgKi8KKyAgICB0ZmhkX25vZGUgPQorICAgICAgICBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGVfZnVsbCAodHJhZl9ub2RlLCBGT1VSQ0NfdGZoZCwKKyAgICAgICAgJnRmaGRfZGF0YSk7CisgICAgaWYgKCF0ZmhkX25vZGUpCisgICAgICBnb3RvIG1pc3NpbmdfdGZoZDsKKyAgICBpZiAoIXF0ZGVtdXhfcGFyc2VfdGZoZCAocXRkZW11eCwgJnRmaGRfZGF0YSwgJnN0cmVhbSwgJmRzX2R1cmF0aW9uLAorICAgICAgICAgICAgJmRzX3NpemUsICZkc19mbGFncywgJmJhc2Vfb2Zmc2V0KSkKKyAgICAgIGdvdG8gbWlzc2luZ190ZmhkOworCisgICAgLyogVGhlIGZvbGxvd2luZyBjb2RlIGFzc3VtZXMgYXQgbW9zdCBhIHNpbmdsZSBzZXQgb2Ygc2FtcGxlIGF1eGlsaWFyeQorICAgICAqIGRhdGEgaW4gdGhlIGZyYWdtZW50IChjb25zaXN0aW5nIG9mIGEgc2FpeiBib3ggYW5kIGEgY29ycmVzcG9uZGluZyBzYWlvCisgICAgICogYm94KTsgaW4gdGhlb3J5LCBob3dldmVyLCB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBzZXRzIG9mIHNhbXBsZQorICAgICAqIGF1eGlsaWFyeSBkYXRhIGluIGEgZnJhZ21lbnQuICovCisgICAgc2Fpel9ub2RlID0KKyAgICAgICAgcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlX2Z1bGwgKHRyYWZfbm9kZSwgRk9VUkNDX3NhaXosCisgICAgICAgICZzYWl6X2RhdGEpOworICAgIGlmIChzYWl6X25vZGUpIHsKKyAgICAgIGd1aW50MzIgaW5mb190eXBlID0gMDsKKyAgICAgIGd1aW50NjQgb2Zmc2V0ID0gMDsKKyAgICAgIGd1aW50MzIgaW5mb190eXBlX3BhcmFtZXRlciA9IDA7CisKKyAgICAgIGdfZnJlZSAocXRkZW11eC0+Y2VuY19hdXhfaW5mb19zaXplcyk7CisKKyAgICAgIHF0ZGVtdXgtPmNlbmNfYXV4X2luZm9fc2l6ZXMgPQorICAgICAgICAgIHF0ZGVtdXhfcGFyc2Vfc2FpeiAocXRkZW11eCwgc3RyZWFtLCAmc2Fpel9kYXRhLAorICAgICAgICAgICZxdGRlbXV4LT5jZW5jX2F1eF9zYW1wbGVfY291bnQpOworICAgICAgaWYgKHF0ZGVtdXgtPmNlbmNfYXV4X2luZm9fc2l6ZXMgPT0gTlVMTCkgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChxdGRlbXV4LCAiZmFpbGVkIHRvIHBhcnNlIHNhaXogYm94Iik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgIH0KKyAgICAgIHNhaW9fbm9kZSA9CisgICAgICAgICAgcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlX2Z1bGwgKHRyYWZfbm9kZSwgRk9VUkNDX3NhaW8sCisgICAgICAgICAgJnNhaW9fZGF0YSk7CisgICAgICBpZiAoIXNhaW9fbm9kZSkgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChxdGRlbXV4LCAic2FpeiBib3ggd2l0aG91dCBhIGNvcnJlc3BvbmRpbmcgc2FpbyBib3giKTsKKyAgICAgICAgZ19mcmVlIChxdGRlbXV4LT5jZW5jX2F1eF9pbmZvX3NpemVzKTsKKyAgICAgICAgcXRkZW11eC0+Y2VuY19hdXhfaW5mb19zaXplcyA9IE5VTEw7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgIH0KKworICAgICAgaWYgKEdfVU5MSUtFTFkgKCFxdGRlbXV4X3BhcnNlX3NhaW8gKHF0ZGVtdXgsIHN0cmVhbSwgJnNhaW9fZGF0YSwKKyAgICAgICAgICAgICAgICAgICZpbmZvX3R5cGUsICZpbmZvX3R5cGVfcGFyYW1ldGVyLCAmb2Zmc2V0KSkpIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwgImZhaWxlZCB0byBwYXJzZSBzYWlvIGJveCIpOworICAgICAgICBnX2ZyZWUgKHF0ZGVtdXgtPmNlbmNfYXV4X2luZm9fc2l6ZXMpOworICAgICAgICBxdGRlbXV4LT5jZW5jX2F1eF9pbmZvX3NpemVzID0gTlVMTDsKKyAgICAgICAgZ290byBmYWlsOworICAgICAgfQorICAgICAgaWYgKGJhc2Vfb2Zmc2V0ID4gLTEgJiYgYmFzZV9vZmZzZXQgPiBxdGRlbXV4LT5tb29mX29mZnNldCkKKyAgICAgICAgb2Zmc2V0ICs9IChndWludDY0KSAoYmFzZV9vZmZzZXQgLSBxdGRlbXV4LT5tb29mX29mZnNldCk7CisgICAgICBpZiAoaW5mb190eXBlID09IEZPVVJDQ19jZW5jICYmIGluZm9fdHlwZV9wYXJhbWV0ZXIgPT0gMFUpIHsKKyAgICAgICAgR3N0Qnl0ZVJlYWRlciBicjsKKyAgICAgICAgaWYgKG9mZnNldCA+IGxlbmd0aCkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJjZW5jIGF1eGlsaWFyeSBpbmZvIHN0b3JlZCBvdXQgb2YgbW9vZiIpOworICAgICAgICAgIHF0ZGVtdXgtPmNlbmNfYXV4X2luZm9fb2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9pbml0ICgmYnIsIGJ1ZmZlciArIG9mZnNldCwgbGVuZ3RoIC0gb2Zmc2V0KTsKKyAgICAgICAgICBpZiAoIXF0ZGVtdXhfcGFyc2VfY2VuY19hdXhfaW5mbyAocXRkZW11eCwgc3RyZWFtLCAmYnIsCisgICAgICAgICAgICAgICAgICBxdGRlbXV4LT5jZW5jX2F1eF9pbmZvX3NpemVzLAorICAgICAgICAgICAgICAgICAgcXRkZW11eC0+Y2VuY19hdXhfc2FtcGxlX2NvdW50KSkgeworICAgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwgImZhaWxlZCB0byBwYXJzZSBjZW5jIGF1eGlsaWFyeSBpbmZvIik7CisgICAgICAgICAgICBnX2ZyZWUgKHF0ZGVtdXgtPmNlbmNfYXV4X2luZm9fc2l6ZXMpOworICAgICAgICAgICAgcXRkZW11eC0+Y2VuY19hdXhfaW5mb19zaXplcyA9IE5VTEw7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdGZkdF9ub2RlID0KKyAgICAgICAgcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlX2Z1bGwgKHRyYWZfbm9kZSwgRk9VUkNDX3RmZHQsCisgICAgICAgICZ0ZmR0X2RhdGEpOworICAgIGlmICh0ZmR0X25vZGUpIHsKKyAgICAgIC8qIFdlJ2xsIHVzZSBkZWNvZGVfdGltZSB0byBpbnRlcnBvbGF0ZSB0aW1lc3RhbXBzCisgICAgICAgKiBpbiBjYXNlIHRoZSBpbnB1dCB0aW1lc3RhbXBzIGFyZSBtaXNzaW5nICovCisgICAgICBxdGRlbXV4X3BhcnNlX3RmZHQgKHF0ZGVtdXgsICZ0ZmR0X2RhdGEsICZkZWNvZGVfdGltZSk7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJkZWNvZGUgdGltZSAlIiBHX0dJTlQ2NF9GT1JNQVQKKyAgICAgICAgICAiICglIiBHU1RfVElNRV9GT1JNQVQgIikiLCBkZWNvZGVfdGltZSwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChzdHJlYW0gPyBRVFNUUkVBTVRJTUVfVE9fR1NUVElNRSAoc3RyZWFtLAorICAgICAgICAgICAgICAgICAgZGVjb2RlX3RpbWUpIDogR1NUX0NMT0NLX1RJTUVfTk9ORSkpOworCisgICAgICAvKiBEaXNjYXJkIHRoZSBmcmFnbWVudCBidWZmZXIgdGltZXN0YW1wIGluZm8gdG8gYXZvaWQgdXNpbmcgaXQuCisgICAgICAgKiBSZWx5IG9uIHRmZHQgaW5zdGVhZCBhcyBpdCBpcyBtb3JlIGFjY3VyYXRlIHRoYW4gdGhlIHRpbWVzdGFtcAorICAgICAgICogdGhhdCBpcyBmZXRjaGVkIGZyb20gYSBtYW5pZmVzdC9wbGF5bGlzdCBhbmQgaXMgdXN1YWxseQorICAgICAgICogbGVzcyBhY2N1cmF0ZS4gKi8KKyAgICAgIHF0ZGVtdXgtPmZyYWdtZW50X3N0YXJ0ID0gLTE7CisgICAgfQorCisgICAgaWYgKEdfVU5MSUtFTFkgKCFzdHJlYW0pKSB7CisgICAgICAvKiB3ZSBsb3N0IHRyYWNrIG9mIG9mZnNldCwgd2UnbGwgbmVlZCB0byByZWdhaW4gaXQsCisgICAgICAgKiBidXQgY2FuIGRlbGF5IGNvbXBsYWluaW5nIHVudGlsIGxhdGVyIG9yIGF2b2lkIGRvaW5nIHNvIGFsdG9nZXRoZXIgKi8KKyAgICAgIGJhc2Vfb2Zmc2V0ID0gLTI7CisgICAgICBnb3RvIG5leHQ7CisgICAgfQorICAgIGlmIChHX1VOTElLRUxZIChiYXNlX29mZnNldCA8IC0xKSkKKyAgICAgIGdvdG8gbG9zdF9vZmZzZXQ7CisKKyAgICBpZiAocXRkZW11eC0+dXBzdHJlYW1fZm9ybWF0X2lzX3RpbWUpCisgICAgICBnc3RfcXRkZW11eF9zdHJlYW1fZmx1c2hfc2FtcGxlc19kYXRhIChxdGRlbXV4LCBzdHJlYW0pOworCisgICAgLyogaW5pdGlhbGlzZSBtb29mIHNhbXBsZSBkYXRhICovCisgICAgc3RyZWFtLT5uX3NhbXBsZXNfbW9vZiA9IDA7CisgICAgc3RyZWFtLT5kdXJhdGlvbl9sYXN0X21vb2YgPSBzdHJlYW0tPmR1cmF0aW9uX21vb2Y7CisgICAgc3RyZWFtLT5kdXJhdGlvbl9tb29mID0gMDsKKworICAgIC8qIFRyYWNrIFJ1biBub2RlICovCisgICAgdHJ1bl9ub2RlID0KKyAgICAgICAgcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlX2Z1bGwgKHRyYWZfbm9kZSwgRk9VUkNDX3RydW4sCisgICAgICAgICZ0cnVuX2RhdGEpOworICAgIHdoaWxlICh0cnVuX25vZGUpIHsKKyAgICAgIHF0ZGVtdXhfcGFyc2VfdHJ1biAocXRkZW11eCwgJnRydW5fZGF0YSwgc3RyZWFtLAorICAgICAgICAgIGRzX2R1cmF0aW9uLCBkc19zaXplLCBkc19mbGFncywgbW9vZl9vZmZzZXQsIGxlbmd0aCwgJmJhc2Vfb2Zmc2V0LAorICAgICAgICAgICZydW5uaW5nX29mZnNldCwgZGVjb2RlX3RpbWUsICh0ZmR0X25vZGUgIT0gTlVMTCkpOworICAgICAgLyogaXRlcmF0ZSBhbGwgc2libGluZ3MgKi8KKyAgICAgIHRydW5fbm9kZSA9IHF0ZGVtdXhfdHJlZV9nZXRfc2libGluZ19ieV90eXBlX2Z1bGwgKHRydW5fbm9kZSwgRk9VUkNDX3RydW4sCisgICAgICAgICAgJnRydW5fZGF0YSk7CisgICAgfQorCisgICAgdXVpZF9ub2RlID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlICh0cmFmX25vZGUsIEZPVVJDQ191dWlkKTsKKyAgICBpZiAodXVpZF9ub2RlKSB7CisgICAgICBndWludDggKnV1aWRfYnVmZmVyID0gKGd1aW50OCAqKSB1dWlkX25vZGUtPmRhdGE7CisgICAgICBndWludDMyIGJveF9sZW5ndGggPSBRVF9VSU5UMzIgKHV1aWRfYnVmZmVyKTsKKworICAgICAgcXRkZW11eF9wYXJzZV91dWlkIChxdGRlbXV4LCB1dWlkX2J1ZmZlciwgYm94X2xlbmd0aCk7CisgICAgfQorCisgICAgLyogaWYgbm8gbmV3IGJhc2Vfb2Zmc2V0IHByb3ZpZGVkIGZvciBuZXh0IHRyYWYsCisgICAgICogYmFzZSBpcyBlbmQgb2YgY3VycmVudCB0cmFmICovCisgICAgYmFzZV9vZmZzZXQgPSBydW5uaW5nX29mZnNldDsKKyAgICBydW5uaW5nX29mZnNldCA9IC0xOworCisgICAgaWYgKHN0cmVhbS0+bl9zYW1wbGVzX21vb2YgJiYgc3RyZWFtLT5kdXJhdGlvbl9tb29mKQorICAgICAgc3RyZWFtLT5uZXdfY2FwcyA9IFRSVUU7CisKKyAgbmV4dDoKKyAgICAvKiBpdGVyYXRlIGFsbCBzaWJsaW5ncyAqLworICAgIHRyYWZfbm9kZSA9IHF0ZGVtdXhfdHJlZV9nZXRfc2libGluZ19ieV90eXBlICh0cmFmX25vZGUsIEZPVVJDQ190cmFmKTsKKyAgfQorCisgIC8qIHBhcnNlIGFueSBwcm90ZWN0aW9uIHN5c3RlbSBpbmZvICovCisgIHBzc2hfbm9kZSA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAobW9vZl9ub2RlLCBGT1VSQ0NfcHNzaCk7CisgIHdoaWxlIChwc3NoX25vZGUpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIlBhcnNpbmcgcHNzaCBib3guIik7CisgICAgcXRkZW11eF9wYXJzZV9wc3NoIChxdGRlbXV4LCBwc3NoX25vZGUpOworICAgIHBzc2hfbm9kZSA9IHF0ZGVtdXhfdHJlZV9nZXRfc2libGluZ19ieV90eXBlIChwc3NoX25vZGUsIEZPVVJDQ19wc3NoKTsKKyAgfQorCisgIGdfbm9kZV9kZXN0cm95IChtb29mX25vZGUpOworICByZXR1cm4gVFJVRTsKKworbWlzc2luZ190ZmhkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIm1pc3NpbmcgdGZoZCBib3giKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KK21pc3NpbmdfbWZoZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJNaXNzaW5nIG1maGQgYm94Iik7CisgICAgZ290byBmYWlsOworICB9Citsb3N0X29mZnNldDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJsb3N0IG9mZnNldCIpOworICAgIGdvdG8gZmFpbDsKKyAgfQorZmFpbDoKKyAgeworICAgIGdfbm9kZV9kZXN0cm95IChtb29mX25vZGUpOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdGRlbXV4LCBTVFJFQU0sIERFTVVYLAorICAgICAgICAoXygiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIikpLCAoTlVMTCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisjaWYgMAorLyogbWlnaHQgYmUgdXNlZCBpZiBzb21lIGRheSB3ZSBhY3R1YWxseSB1c2UgbWZyYSAmIGNvCisgKiBmb3IgcmFuZG9tIGFjY2VzcyB0byBmcmFnbWVudHMsCisgKiBidXQgdGhhdCB3aWxsIHJlcXVpcmUgcXVpdGUgc29tZSBtb2RpZmljYXRpb25zIGFuZCBtdWNoIGxlc3MgcmVseWluZworICogb24gYSBzYW1wbGUgYXJyYXkgKi8KKyNlbmRpZgorCitzdGF0aWMgZ2Jvb2xlYW4KK3F0ZGVtdXhfcGFyc2VfdGZyYSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdOb2RlICogdGZyYV9ub2RlKQoreworICBRdERlbXV4U3RyZWFtICpzdHJlYW07CisgIGd1aW50MzIgdmVyX2ZsYWdzLCB0cmFja19pZCwgbGVuLCBudW1fZW50cmllcywgaTsKKyAgZ3VpbnQgdmFsdWVfc2l6ZSwgdHJhZl9zaXplLCB0cnVuX3NpemUsIHNhbXBsZV9zaXplOworICBndWludDY0IHRpbWUgPSAwLCBtb29mX29mZnNldCA9IDA7CisjaWYgMAorICBHc3RCdWZmZXIgKmJ1ZiA9IE5VTEw7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworI2VuZGlmCisgIEdzdEJ5dGVSZWFkZXIgdGZyYTsKKworICBnc3RfYnl0ZV9yZWFkZXJfaW5pdCAoJnRmcmEsIHRmcmFfbm9kZS0+ZGF0YSwgUVRfVUlOVDMyICh0ZnJhX25vZGUtPmRhdGEpKTsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmdGZyYSwgOCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZ0ZnJhLCAmdmVyX2ZsYWdzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoJnRmcmEsICZ0cmFja19pZCkKKyAgICAgIHx8ICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoJnRmcmEsICZsZW4pCisgICAgICB8fCAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZ0ZnJhLCAmbnVtX2VudHJpZXMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicGFyc2luZyB0ZnJhIGJveCBmb3IgdHJhY2sgaWQgJXUiLCB0cmFja19pZCk7CisKKyAgc3RyZWFtID0gcXRkZW11eF9maW5kX3N0cmVhbSAocXRkZW11eCwgdHJhY2tfaWQpOworICBpZiAoc3RyZWFtID09IE5VTEwpCisgICAgZ290byB1bmtub3duX3RyYWNraWQ7CisKKyAgdmFsdWVfc2l6ZSA9ICgodmVyX2ZsYWdzID4+IDI0KSA9PSAxKSA/IHNpemVvZiAoZ3VpbnQ2NCkgOiBzaXplb2YgKGd1aW50MzIpOworICBzYW1wbGVfc2l6ZSA9IChsZW4gJiAzKSArIDE7CisgIHRydW5fc2l6ZSA9ICgobGVuICYgMTIpID4+IDIpICsgMTsKKyAgdHJhZl9zaXplID0gKChsZW4gJiA0OCkgPj4gNCkgKyAxOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICIldSBlbnRyaWVzLCBzaXplczogdmFsdWUgJXUsIHRyYWYgJXUsIHRydW4gJXUsICIKKyAgICAgICJzYW1wbGUgJXUiLCBudW1fZW50cmllcywgdmFsdWVfc2l6ZSwgdHJhZl9zaXplLCB0cnVuX3NpemUsIHNhbXBsZV9zaXplKTsKKworICBpZiAobnVtX2VudHJpZXMgPT0gMCkKKyAgICBnb3RvIG5vX3NhbXBsZXM7CisKKyAgaWYgKCFxdF9hdG9tX3BhcnNlcl9oYXNfY2h1bmtzICgmdGZyYSwgbnVtX2VudHJpZXMsCisgICAgICAgICAgdmFsdWVfc2l6ZSArIHZhbHVlX3NpemUgKyB0cmFmX3NpemUgKyB0cnVuX3NpemUgKyBzYW1wbGVfc2l6ZSkpCisgICAgZ290byBjb3JydXB0X2ZpbGU7CisKKyAgZ19mcmVlIChzdHJlYW0tPnJhX2VudHJpZXMpOworICBzdHJlYW0tPnJhX2VudHJpZXMgPSBnX25ldyAoUXREZW11eFJhbmRvbUFjY2Vzc0VudHJ5LCBudW1fZW50cmllcyk7CisgIHN0cmVhbS0+bl9yYV9lbnRyaWVzID0gbnVtX2VudHJpZXM7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9lbnRyaWVzOyBpKyspIHsKKyAgICBxdF9hdG9tX3BhcnNlcl9nZXRfb2Zmc2V0ICgmdGZyYSwgdmFsdWVfc2l6ZSwgJnRpbWUpOworICAgIHF0X2F0b21fcGFyc2VyX2dldF9vZmZzZXQgKCZ0ZnJhLCB2YWx1ZV9zaXplLCAmbW9vZl9vZmZzZXQpOworICAgIHF0X2F0b21fcGFyc2VyX2dldF91aW50X3dpdGhfc2l6ZV91bmNoZWNrZWQgKCZ0ZnJhLCB0cmFmX3NpemUpOworICAgIHF0X2F0b21fcGFyc2VyX2dldF91aW50X3dpdGhfc2l6ZV91bmNoZWNrZWQgKCZ0ZnJhLCB0cnVuX3NpemUpOworICAgIHF0X2F0b21fcGFyc2VyX2dldF91aW50X3dpdGhfc2l6ZV91bmNoZWNrZWQgKCZ0ZnJhLCBzYW1wbGVfc2l6ZSk7CisKKyAgICB0aW1lID0gUVRTVFJFQU1USU1FX1RPX0dTVFRJTUUgKHN0cmVhbSwgdGltZSk7CisKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgImZyYWdtZW50IHRpbWU6ICUiIEdTVF9USU1FX0ZPUk1BVCAiLCAiCisgICAgICAgICIgbW9vZl9vZmZzZXQ6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHRpbWUpLCBtb29mX29mZnNldCk7CisKKyAgICBzdHJlYW0tPnJhX2VudHJpZXNbaV0udHMgPSB0aW1lOworICAgIHN0cmVhbS0+cmFfZW50cmllc1tpXS5tb29mX29mZnNldCA9IG1vb2Zfb2Zmc2V0OworCisgICAgLyogZG9uJ3Qgd2FudCB0byBnbyB0aHJvdWdoIHRoZSBlbnRpcmUgZmlsZSBhbmQgcmVhZCBhbGwgbW9vZnMgYXQgc3RhcnR1cCAqLworI2lmIDAKKyAgICByZXQgPSBnc3RfcXRkZW11eF9wdWxsX2F0b20gKHF0ZGVtdXgsIG1vb2Zfb2Zmc2V0LCAwLCAmYnVmKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgZ290byBjb3JydXB0X2ZpbGU7CisgICAgcXRkZW11eF9wYXJzZV9tb29mIChxdGRlbXV4LCBHU1RfQlVGRkVSX0RBVEEgKGJ1ZiksIEdTVF9CVUZGRVJfU0laRSAoYnVmKSwKKyAgICAgICAgbW9vZl9vZmZzZXQsIHN0cmVhbSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyNlbmRpZgorICB9CisKKyAgY2hlY2tfdXBkYXRlX2R1cmF0aW9uIChxdGRlbXV4LCB0aW1lKTsKKworICByZXR1cm4gVFJVRTsKKworLyogRVJST1JTICovCit1bmtub3duX3RyYWNraWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJDb3VsZG4ndCBmaW5kIHN0cmVhbSBmb3IgdHJhY2sgJXUiLCB0cmFja19pZCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citjb3JydXB0X2ZpbGU6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJicm9rZW4gdHJhZiBib3gsIGlnbm9yaW5nIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19zYW1wbGVzOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAic3RyZWFtIGhhcyBubyBzYW1wbGVzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcXRkZW11eF9wdWxsX21mcm9fbWZyYSAoR3N0UVREZW11eCAqIHF0ZGVtdXgpCit7CisgIEdzdE1hcEluZm8gbWZyb19tYXAgPSBHU1RfTUFQX0lORk9fSU5JVDsKKyAgR3N0TWFwSW5mbyBtZnJhX21hcCA9IEdTVF9NQVBfSU5GT19JTklUOworICBHc3RCdWZmZXIgKm1mcm8gPSBOVUxMLCAqbWZyYSA9IE5VTEw7CisgIEdzdEZsb3dSZXR1cm4gZmxvdzsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisgIEdOb2RlICptZnJhX25vZGUsICp0ZnJhX25vZGU7CisgIGd1aW50NjQgbWZyYV9vZmZzZXQgPSAwOworICBndWludDMyIGZvdXJjYywgbWZyYV9zaXplOworICBnaW50NjQgbGVuOworCisgIC8qIHF1ZXJ5IHVwc3RyZWFtIHNpemUgaW4gYnl0ZXMgKi8KKyAgaWYgKCFnc3RfcGFkX3BlZXJfcXVlcnlfZHVyYXRpb24gKHF0ZGVtdXgtPnNpbmtwYWQsIEdTVF9GT1JNQVRfQllURVMsICZsZW4pKQorICAgIGdvdG8gc2l6ZV9xdWVyeV9mYWlsZWQ7CisKKyAgLyogbWZybyBib3ggc2hvdWxkIGJlIGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgZmlsZSAqLworICBmbG93ID0gZ3N0X3F0ZGVtdXhfcHVsbF9hdG9tIChxdGRlbXV4LCBsZW4gLSAxNiwgMTYsICZtZnJvKTsKKyAgaWYgKGZsb3cgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBleGl0OworCisgIGdzdF9idWZmZXJfbWFwIChtZnJvLCAmbWZyb19tYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgZm91cmNjID0gUVRfRk9VUkNDIChtZnJvX21hcC5kYXRhICsgNCk7CisgIGlmIChmb3VyY2MgIT0gRk9VUkNDX21mcm8pCisgICAgZ290byBleGl0OworCisgIEdTVF9JTkZPX09CSkVDVCAocXRkZW11eCwgIkZvdW5kIG1mcm8gYm94Iik7CisgIGlmIChtZnJvX21hcC5zaXplIDwgMTYpCisgICAgZ290byBpbnZhbGlkX21mcm9fc2l6ZTsKKworICBtZnJhX3NpemUgPSBRVF9VSU5UMzIgKG1mcm9fbWFwLmRhdGEgKyAxMik7CisgIGlmIChtZnJhX3NpemUgPj0gbGVuKQorICAgIGdvdG8gaW52YWxpZF9tZnJhX3NpemU7CisKKyAgbWZyYV9vZmZzZXQgPSBsZW4gLSBtZnJhX3NpemU7CisKKyAgR1NUX0lORk9fT0JKRUNUIChxdGRlbXV4LCAibWZyYSBvZmZzZXQ6ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgc2l6ZSAldSIsCisgICAgICBtZnJhX29mZnNldCwgbWZyYV9zaXplKTsKKworICAvKiBub3cgZ2V0IGFuZCBwYXJzZSBtZnJhIGJveCAqLworICBmbG93ID0gZ3N0X3F0ZGVtdXhfcHVsbF9hdG9tIChxdGRlbXV4LCBtZnJhX29mZnNldCwgbWZyYV9zaXplLCAmbWZyYSk7CisgIGlmIChmbG93ICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gYnJva2VuX2ZpbGU7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG1mcmEsICZtZnJhX21hcCwgR1NUX01BUF9SRUFEKTsKKworICBtZnJhX25vZGUgPSBnX25vZGVfbmV3ICgoZ3VpbnQ4ICopIG1mcmFfbWFwLmRhdGEpOworICBxdGRlbXV4X3BhcnNlX25vZGUgKHF0ZGVtdXgsIG1mcmFfbm9kZSwgbWZyYV9tYXAuZGF0YSwgbWZyYV9tYXAuc2l6ZSk7CisKKyAgdGZyYV9ub2RlID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChtZnJhX25vZGUsIEZPVVJDQ190ZnJhKTsKKworICB3aGlsZSAodGZyYV9ub2RlKSB7CisgICAgcXRkZW11eF9wYXJzZV90ZnJhIChxdGRlbXV4LCB0ZnJhX25vZGUpOworICAgIC8qIGl0ZXJhdGUgYWxsIHNpYmxpbmdzICovCisgICAgdGZyYV9ub2RlID0gcXRkZW11eF90cmVlX2dldF9zaWJsaW5nX2J5X3R5cGUgKHRmcmFfbm9kZSwgRk9VUkNDX3RmcmEpOworICB9CisgIGdfbm9kZV9kZXN0cm95IChtZnJhX25vZGUpOworCisgIEdTVF9JTkZPX09CSkVDVCAocXRkZW11eCwgInBhcnNlZCBtb3ZpZSBmcmFnbWVudCByYW5kb20gYWNjZXNzIGJveCAobWZyYSkiKTsKKyAgcmV0ID0gVFJVRTsKKworZXhpdDoKKworICBpZiAobWZybykgeworICAgIGlmIChtZnJvX21hcC5tZW1vcnkgIT0gTlVMTCkKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKG1mcm8sICZtZnJvX21hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAobWZybyk7CisgIH0KKyAgaWYgKG1mcmEpIHsKKyAgICBpZiAobWZyYV9tYXAubWVtb3J5ICE9IE5VTEwpCisgICAgICBnc3RfYnVmZmVyX3VubWFwIChtZnJhLCAmbWZyYV9tYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKG1mcmEpOworICB9CisgIHJldHVybiByZXQ7CisKKy8qIEVSUk9SUyAqLworc2l6ZV9xdWVyeV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJjb3VsZCBub3QgcXVlcnkgdXBzdHJlYW0gc2l6ZSIpOworICAgIGdvdG8gZXhpdDsKKyAgfQoraW52YWxpZF9tZnJvX3NpemU6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJtZnJvIHNpemUgaXMgdG9vIHNtYWxsIik7CisgICAgZ290byBleGl0OworICB9CitpbnZhbGlkX21mcmFfc2l6ZToKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIm1mcmFfc2l6ZSBpbiBtZnJvIGJveCBpcyBpbnZhbGlkIik7CisgICAgZ290byBleGl0OworICB9Citicm9rZW5fZmlsZToKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgImJvZ3VzIG1mcmEgb2Zmc2V0IG9yIHNpemUsIGJyb2tlbiBmaWxlIik7CisgICAgZ290byBleGl0OworICB9Cit9CisKK3N0YXRpYyBndWludDY0CithZGRfb2Zmc2V0IChndWludDY0IG9mZnNldCwgZ3VpbnQ2NCBhZHZhbmNlKQoreworICAvKiBBdm9pZCA2NC1iaXQgb3ZlcmZsb3cgYnkgY2xhbXBpbmcgKi8KKyAgaWYgKG9mZnNldCA+IEdfTUFYVUlOVDY0IC0gYWR2YW5jZSkKKyAgICByZXR1cm4gR19NQVhVSU5UNjQ7CisgIHJldHVybiBvZmZzZXQgKyBhZHZhbmNlOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9oZWFkZXIgKEdzdFFURGVtdXggKiBxdGRlbXV4KQoreworICBndWludDY0IGxlbmd0aCA9IDA7CisgIGd1aW50MzIgZm91cmNjID0gMDsKKyAgR3N0QnVmZmVyICpidWYgPSBOVUxMOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludDY0IGN1cl9vZmZzZXQgPSBxdGRlbXV4LT5vZmZzZXQ7CisgIEdzdE1hcEluZm8gbWFwOworCisgIHJldCA9IGdzdF9wYWRfcHVsbF9yYW5nZSAocXRkZW11eC0+c2lua3BhZCwgY3VyX29mZnNldCwgMTYsICZidWYpOworICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LKSkKKyAgICBnb3RvIGJlYWNoOworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBpZiAoR19MSUtFTFkgKG1hcC5zaXplID49IDgpKQorICAgIGV4dHJhY3RfaW5pdGlhbF9sZW5ndGhfYW5kX2ZvdXJjYyAobWFwLmRhdGEsIG1hcC5zaXplLCAmbGVuZ3RoLCAmZm91cmNjKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAvKiBtYXliZSB3ZSBhbHJlYWR5IGdvdCBtb3N0IHdlIG5lZWRlZCwgc28gb25seSBjb25zaWRlciB0aGlzIGVvZiAqLworICBpZiAoR19VTkxJS0VMWSAobGVuZ3RoID09IDApKSB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocXRkZW11eCwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgKF8oIkludmFsaWQgYXRvbSBzaXplLiIpKSwKKyAgICAgICAgKCJIZWFkZXIgYXRvbSAnJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIicgaGFzIGVtcHR5IGxlbmd0aCIsCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYykpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FT1M7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIHN3aXRjaCAoZm91cmNjKSB7CisgICAgY2FzZSBGT1VSQ0NfbW9vZjoKKyAgICAgIC8qIHJlY29yZCBmb3IgbGF0ZXIgcGFyc2luZyB3aGVuIG5lZWRlZCAqLworICAgICAgaWYgKCFxdGRlbXV4LT5tb29mX29mZnNldCkgeworICAgICAgICBxdGRlbXV4LT5tb29mX29mZnNldCA9IHF0ZGVtdXgtPm9mZnNldDsKKyAgICAgIH0KKyAgICAgIGlmIChxdGRlbXV4X3B1bGxfbWZyb19tZnJhIChxdGRlbXV4KSkgeworICAgICAgICAvKiBGSVhNRSAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcXRkZW11eC0+b2Zmc2V0ICs9IGxlbmd0aDsgICAgICAvKiBza2lwIG1vb2YgYW5kIGtlZXAgZ29pbmcgKi8KKyAgICAgIH0KKyAgICAgIGlmIChxdGRlbXV4LT5nb3RfbW9vdikgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsICJtb29mIGhlYWRlciwgZ290IG1vb3YsIGRvbmUgd2l0aCBoZWFkZXJzIik7CisgICAgICAgIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgICAgICAgZ290byBiZWFjaDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX21kYXQ6CisgICAgY2FzZSBGT1VSQ0NfZnJlZToKKyAgICBjYXNlIEZPVVJDQ19za2lwOgorICAgIGNhc2UgRk9VUkNDX3dpZGU6CisgICAgY2FzZSBGT1VSQ0NfUElDVDoKKyAgICBjYXNlIEZPVVJDQ19wbm90OgorICAgIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICJza2lwcGluZyBhdG9tICclIiBHU1RfRk9VUkNDX0ZPUk1BVCAiJyBhdCAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgY3VyX29mZnNldCk7CisgICAgICBxdGRlbXV4LT5vZmZzZXQgPSBhZGRfb2Zmc2V0IChxdGRlbXV4LT5vZmZzZXQsIGxlbmd0aCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGT1VSQ0NfbW9vdjoKKyAgICB7CisgICAgICBHc3RCdWZmZXIgKm1vb3YgPSBOVUxMOworCisgICAgICBpZiAocXRkZW11eC0+Z290X21vb3YpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIlNraXBwaW5nIG1vb3YgYXRvbSBhcyB3ZSBoYXZlIG9uZSBhbHJlYWR5Iik7CisgICAgICAgIHF0ZGVtdXgtPm9mZnNldCA9IGFkZF9vZmZzZXQgKHF0ZGVtdXgtPm9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgZ290byBiZWFjaDsKKyAgICAgIH0KKworICAgICAgcmV0ID0gZ3N0X3BhZF9wdWxsX3JhbmdlIChxdGRlbXV4LT5zaW5rcGFkLCBjdXJfb2Zmc2V0LCBsZW5ndGgsICZtb292KTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICBnc3RfYnVmZmVyX21hcCAobW9vdiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICAgICAgaWYgKGxlbmd0aCAhPSBtYXAuc2l6ZSkgeworICAgICAgICAvKiBTb21lIGZpbGVzIGhhdmUgYSAnbW9vdicgYXRvbSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHdoaWNoIGNvbnRhaW5zCisgICAgICAgICAqIGEgdGVybWluYWwgJ2ZyZWUnIGF0b20gd2hlcmUgdGhlIGJvZHkgb2YgdGhlIGF0b20gaXMgbWlzc2luZy4KKyAgICAgICAgICogQ2hlY2sgZm9yLCBhbmQgcGVybWl0LCB0aGlzIHNwZWNpYWwgY2FzZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChtYXAuc2l6ZSA+PSA4KSB7CisgICAgICAgICAgZ3VpbnQ4ICpmaW5hbF9kYXRhID0gbWFwLmRhdGEgKyAobWFwLnNpemUgLSA4KTsKKyAgICAgICAgICBndWludDMyIGZpbmFsX2xlbmd0aCA9IFFUX1VJTlQzMiAoZmluYWxfZGF0YSk7CisgICAgICAgICAgZ3VpbnQzMiBmaW5hbF9mb3VyY2MgPSBRVF9GT1VSQ0MgKGZpbmFsX2RhdGEgKyA0KTsKKworICAgICAgICAgIGlmIChmaW5hbF9mb3VyY2MgPT0gRk9VUkNDX2ZyZWUKKyAgICAgICAgICAgICAgJiYgbWFwLnNpemUgKyBmaW5hbF9sZW5ndGggLSA4ID09IGxlbmd0aCkgeworICAgICAgICAgICAgLyogT2ssIHdlJ3ZlIGZvdW5kIHRoYXQgc3BlY2lhbCBjYXNlLiBBbGxvY2F0ZSBhIG5ldyBidWZmZXIgd2l0aAorICAgICAgICAgICAgICogdGhhdCBmcmVlIGF0b20gYWN0dWFsbHkgcHJlc2VudC4gKi8KKyAgICAgICAgICAgIEdzdEJ1ZmZlciAqbmV3bW9vdiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobGVuZ3RoKTsKKyAgICAgICAgICAgIGdzdF9idWZmZXJfZmlsbCAobmV3bW9vdiwgMCwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICAgICAgICAgIGdzdF9idWZmZXJfbWVtc2V0IChuZXdtb292LCBtYXAuc2l6ZSwgMCwgZmluYWxfbGVuZ3RoIC0gOCk7CisgICAgICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChtb292LCAmbWFwKTsKKyAgICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG1vb3YpOworICAgICAgICAgICAgbW9vdiA9IG5ld21vb3Y7CisgICAgICAgICAgICBnc3RfYnVmZmVyX21hcCAobW9vdiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGxlbmd0aCAhPSBtYXAuc2l6ZSkgeworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRkZW11eCwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgICAgIChfKCJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iKSksCisgICAgICAgICAgICAoIldlIGdvdCBsZXNzIHRoYW4gZXhwZWN0ZWQgKHJlY2VpdmVkICUiIEdfR1NJWkVfRk9STUFUCisgICAgICAgICAgICAgICAgIiwgd2FudGVkICV1LCBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCAiKSIsIG1hcC5zaXplLAorICAgICAgICAgICAgICAgIChndWludCkgbGVuZ3RoLCBjdXJfb2Zmc2V0KSk7CisgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKG1vb3YsICZtYXApOworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChtb292KTsKKyAgICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICB9CisgICAgICBxdGRlbXV4LT5vZmZzZXQgKz0gbGVuZ3RoOworCisgICAgICBxdGRlbXV4X3BhcnNlX21vb3YgKHF0ZGVtdXgsIG1hcC5kYXRhLCBsZW5ndGgpOworICAgICAgcXRkZW11eF9ub2RlX2R1bXAgKHF0ZGVtdXgsIHF0ZGVtdXgtPm1vb3Zfbm9kZSk7CisKKyAgICAgIHF0ZGVtdXhfcGFyc2VfdHJlZSAocXRkZW11eCk7CisgICAgICBpZiAocXRkZW11eC0+bW9vdl9ub2RlX2NvbXByZXNzZWQpIHsKKyAgICAgICAgZ19ub2RlX2Rlc3Ryb3kgKHF0ZGVtdXgtPm1vb3Zfbm9kZV9jb21wcmVzc2VkKTsKKyAgICAgICAgZ19mcmVlIChxdGRlbXV4LT5tb292X25vZGUtPmRhdGEpOworICAgICAgfQorICAgICAgcXRkZW11eC0+bW9vdl9ub2RlX2NvbXByZXNzZWQgPSBOVUxMOworICAgICAgZ19ub2RlX2Rlc3Ryb3kgKHF0ZGVtdXgtPm1vb3Zfbm9kZSk7CisgICAgICBxdGRlbXV4LT5tb292X25vZGUgPSBOVUxMOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAobW9vdiwgJm1hcCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChtb292KTsKKyAgICAgIHF0ZGVtdXgtPmdvdF9tb292ID0gVFJVRTsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRk9VUkNDX2Z0eXA6CisgICAgeworICAgICAgR3N0QnVmZmVyICpmdHlwID0gTlVMTDsKKworICAgICAgLyogZXh0cmFjdCBtYWpvciBicmFuZDsgbWlnaHQgY29tZSBpbiBoYW5keSBmb3IgSVNPIHZzIFFUIGlzc3VlcyAqLworICAgICAgcmV0ID0gZ3N0X3F0ZGVtdXhfcHVsbF9hdG9tIChxdGRlbXV4LCBjdXJfb2Zmc2V0LCBsZW5ndGgsICZmdHlwKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICBxdGRlbXV4LT5vZmZzZXQgKz0gbGVuZ3RoOworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGZ0eXAsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICBxdGRlbXV4X3BhcnNlX2Z0eXAgKHF0ZGVtdXgsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChmdHlwLCAmbWFwKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGZ0eXApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRk9VUkNDX3V1aWQ6CisgICAgeworICAgICAgR3N0QnVmZmVyICp1dWlkID0gTlVMTDsKKworICAgICAgLyogdXVpZCBhcmUgZXh0ZW5zaW9uIGF0b21zICovCisgICAgICByZXQgPSBnc3RfcXRkZW11eF9wdWxsX2F0b20gKHF0ZGVtdXgsIGN1cl9vZmZzZXQsIGxlbmd0aCwgJnV1aWQpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBiZWFjaDsKKyAgICAgIHF0ZGVtdXgtPm9mZnNldCArPSBsZW5ndGg7CisgICAgICBnc3RfYnVmZmVyX21hcCAodXVpZCwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgIHF0ZGVtdXhfcGFyc2VfdXVpZCAocXRkZW11eCwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKHV1aWQsICZtYXApOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAodXVpZCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGT1VSQ0Nfc2lkeDoKKyAgICB7CisgICAgICBHc3RCdWZmZXIgKnNpZHggPSBOVUxMOworICAgICAgcmV0ID0gZ3N0X3F0ZGVtdXhfcHVsbF9hdG9tIChxdGRlbXV4LCBjdXJfb2Zmc2V0LCBsZW5ndGgsICZzaWR4KTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICBxdGRlbXV4LT5vZmZzZXQgKz0gbGVuZ3RoOworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKHNpZHgsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICBxdGRlbXV4X3BhcnNlX3NpZHggKHF0ZGVtdXgsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChzaWR4LCAmbWFwKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHNpZHgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgeworICAgICAgR3N0QnVmZmVyICp1bmtub3duID0gTlVMTDsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgInVua25vd24gJTA4eCAnJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIicgb2Ygc2l6ZSAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgIiBhdCAlIiBHX0dVSU5UNjRfRk9STUFULCBmb3VyY2MsIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgbGVuZ3RoLAorICAgICAgICAgIGN1cl9vZmZzZXQpOworICAgICAgcmV0ID0gZ3N0X3F0ZGVtdXhfcHVsbF9hdG9tIChxdGRlbXV4LCBjdXJfb2Zmc2V0LCBsZW5ndGgsICZ1bmtub3duKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICBnc3RfYnVmZmVyX21hcCAodW5rbm93biwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgIEdTVF9NRU1EVU1QICgiVW5rbm93biB0YWciLCBtYXAuZGF0YSwgbWFwLnNpemUpOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAodW5rbm93biwgJm1hcCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmICh1bmtub3duKTsKKyAgICAgIHF0ZGVtdXgtPm9mZnNldCArPSBsZW5ndGg7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworYmVhY2g6CisgIGlmIChyZXQgPT0gR1NUX0ZMT1dfRU9TICYmIChxdGRlbXV4LT5nb3RfbW9vdiB8fCBxdGRlbXV4LT5tZWRpYV9jYXBzKSkgeworICAgIC8qIGRpZ2VzdGVkIGFsbCBkYXRhLCBzaG93IHdoYXQgd2UgaGF2ZSAqLworICAgIHF0ZGVtdXhfcHJlcGFyZV9zdHJlYW1zIChxdGRlbXV4KTsKKyAgICByZXQgPSBxdGRlbXV4X2V4cG9zZV9zdHJlYW1zIChxdGRlbXV4KTsKKworICAgIHF0ZGVtdXgtPnN0YXRlID0gUVRERU1VWF9TVEFURV9NT1ZJRTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic3dpdGNoaW5nIHN0YXRlIHRvIFNUQVRFX01PVklFICglZCkiLAorICAgICAgICBxdGRlbXV4LT5zdGF0ZSk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXR1cm4gcmV0OworfQorCisvKiBTZWVrcyB0byB0aGUgcHJldmlvdXMga2V5ZnJhbWUgb2YgdGhlIGluZGV4ZWQgc3RyZWFtIGFuZAorICogYWxpZ25zIG90aGVyIHN0cmVhbXMgd2l0aCByZXNwZWN0IHRvIHRoZSBrZXlmcmFtZSB0aW1lc3RhbXAKKyAqIG9mIGluZGV4ZWQgc3RyZWFtLiBPbmx5IGNhbGxlZCBpbiBjYXNlIG9mIFJldmVyc2UgUGxheWJhY2sKKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdGRlbXV4X3NlZWtfdG9fcHJldmlvdXNfa2V5ZnJhbWUgKEdzdFFURGVtdXggKiBxdGRlbXV4KQoreworICBndWludDggbiA9IDA7CisgIGd1aW50MzIgc2VnX2lkeCA9IDAsIGtfaW5kZXggPSAwOworICBndWludDMyIHJlZl9zZWdfaWR4LCByZWZfa19pbmRleDsKKyAgR3N0Q2xvY2tUaW1lIGtfcG9zID0gMCwgbGFzdF9zdG9wID0gMDsKKyAgUXREZW11eFNlZ21lbnQgKnNlZyA9IE5VTEw7CisgIFF0RGVtdXhTdHJlYW0gKnJlZl9zdHIgPSBOVUxMOworICBndWludDY0IHNlZ19tZWRpYV9zdGFydF9tb3Y7ICAvKiBzZWdtZW50IG1lZGlhIHN0YXJ0IHRpbWUgaW4gbW92IGZvcm1hdCAqLworICBndWludDY0IHRhcmdldF90czsKKworICAvKiBOb3cgd2UgY2hvb3NlIGFuIGFyYml0cmFyeSBzdHJlYW0sIGdldCB0aGUgcHJldmlvdXMga2V5ZnJhbWUgdGltZXN0YW1wCisgICAqIGFuZCBmaW5hbGx5IGFsaWduIGFsbCB0aGUgb3RoZXIgc3RyZWFtcyBvbiB0aGF0IHRpbWVzdGFtcCB3aXRoIHRoZWlyCisgICAqIHJlc3BlY3RpdmUga2V5ZnJhbWVzICovCisgIGZvciAobiA9IDA7IG4gPCBxdGRlbXV4LT5uX3N0cmVhbXM7IG4rKykgeworICAgIFF0RGVtdXhTdHJlYW0gKnN0ciA9IHF0ZGVtdXgtPnN0cmVhbXNbbl07CisKKyAgICAvKiBObyBjYW5kaWRhdGUgeWV0LCB0YWtlIHRoZSBmaXJzdCBzdHJlYW0gKi8KKyAgICBpZiAoIXJlZl9zdHIpIHsKKyAgICAgIHJlZl9zdHIgPSBzdHI7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvKiBTbyB0aGF0IHN0cmVhbSBoYXMgYSBzZWdtZW50LCB3ZSBwcmVmZXIgdmlkZW8gc3RyZWFtcyAqLworICAgIGlmIChzdHItPnN1YnR5cGUgPT0gRk9VUkNDX3ZpZGUpIHsKKyAgICAgIHJlZl9zdHIgPSBzdHI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoIXJlZl9zdHIpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImNvdWxkbid0IGZpbmQgYW55IHN0cmVhbSIpOworICAgIGdvdG8gZW9zOworICB9CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFyZWZfc3RyLT5mcm9tX3NhbXBsZSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicmVhY2hlZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIik7CisgICAgZ290byBlb3M7CisgIH0KKworICAvKiBTbyB0aGF0IHN0cmVhbSBoYXMgYmVlbiBwbGF5aW5nIGZyb20gZnJvbV9zYW1wbGUgdG8gdG9fc2FtcGxlLiBXZSB3aWxsCisgICAqIGdldCB0aGUgdGltZXN0YW1wIG9mIHRoZSBwcmV2aW91cyBzYW1wbGUgYW5kIHNlYXJjaCBmb3IgYSBrZXlmcmFtZSBiZWZvcmUKKyAgICogdGhhdC4gRm9yIGF1ZGlvIHN0cmVhbXMgd2UgZG8gYW4gYXJiaXRyYXJ5IGp1bXAgaW4gdGhlIHBhc3QgKDEwIHNhbXBsZXMpICovCisgIGlmIChyZWZfc3RyLT5zdWJ0eXBlID09IEZPVVJDQ192aWRlKSB7CisgICAga19pbmRleCA9IGdzdF9xdGRlbXV4X2ZpbmRfa2V5ZnJhbWUgKHF0ZGVtdXgsIHJlZl9zdHIsCisgICAgICAgIHJlZl9zdHItPmZyb21fc2FtcGxlIC0gMSwgRkFMU0UpOworICB9IGVsc2UgeworICAgIGlmIChyZWZfc3RyLT5mcm9tX3NhbXBsZSA+PSAxMCkKKyAgICAgIGtfaW5kZXggPSByZWZfc3RyLT5mcm9tX3NhbXBsZSAtIDEwOworICAgIGVsc2UKKyAgICAgIGtfaW5kZXggPSAwOworICB9CisKKyAgdGFyZ2V0X3RzID0KKyAgICAgIHJlZl9zdHItPnNhbXBsZXNba19pbmRleF0udGltZXN0YW1wICsKKyAgICAgIHJlZl9zdHItPnNhbXBsZXNba19pbmRleF0ucHRzX29mZnNldDsKKworICAvKiBnZXQgY3VycmVudCBzZWdtZW50IGZvciB0aGF0IHN0cmVhbSAqLworICBzZWcgPSAmcmVmX3N0ci0+c2VnbWVudHNbcmVmX3N0ci0+c2VnbWVudF9pbmRleF07CisgIC8qIFVzZSBzZWdtZW50IHN0YXJ0IGluIG9yaWdpbmFsIHRpbWVzY2FsZSBmb3IgY29tcGFyaXNvbnMgKi8KKyAgc2VnX21lZGlhX3N0YXJ0X21vdiA9IHNlZy0+dHJha19tZWRpYV9zdGFydDsKKworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgImtleWZyYW1lIGluZGV4ICV1IHRzICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICIgc2VnIHN0YXJ0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiAlIiBHU1RfVElNRV9GT1JNQVQgIlxuIiwKKyAgICAgIGtfaW5kZXgsIHRhcmdldF90cywgc2VnX21lZGlhX3N0YXJ0X21vdiwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHNlZy0+bWVkaWFfc3RhcnQpKTsKKworICAvKiBDcmF3bCBiYWNrIHRocm91Z2ggc2VnbWVudHMgdG8gZmluZCB0aGUgb25lIGNvbnRhaW5pbmcgdGhpcyBJIGZyYW1lICovCisgIHdoaWxlICh0YXJnZXRfdHMgPCBzZWdfbWVkaWFfc3RhcnRfbW92KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgImtleWZyYW1lIHBvc2l0aW9uIChzYW1wbGUgJXUpIGlzIG91dCBvZiBzZWdtZW50ICV1ICIgIiB0YXJnZXQgJSIKKyAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCAiIHNlZyBzdGFydCAlIiBHX0dVSU5UNjRfRk9STUFULCBrX2luZGV4LAorICAgICAgICByZWZfc3RyLT5zZWdtZW50X2luZGV4LCB0YXJnZXRfdHMsIHNlZ19tZWRpYV9zdGFydF9tb3YpOworCisgICAgaWYgKEdfVU5MSUtFTFkgKCFyZWZfc3RyLT5zZWdtZW50X2luZGV4KSkgeworICAgICAgLyogUmVhY2hlZCBmaXJzdCBzZWdtZW50LCBsZXQncyBjb25zaWRlciBpdCdzIEVPUyAqLworICAgICAgZ290byBlb3M7CisgICAgfQorICAgIHJlZl9zdHItPnNlZ21lbnRfaW5kZXgtLTsKKyAgICBzZWcgPSAmcmVmX3N0ci0+c2VnbWVudHNbcmVmX3N0ci0+c2VnbWVudF9pbmRleF07CisgICAgLyogVXNlIHNlZ21lbnQgc3RhcnQgaW4gb3JpZ2luYWwgdGltZXNjYWxlIGZvciBjb21wYXJpc29ucyAqLworICAgIHNlZ19tZWRpYV9zdGFydF9tb3YgPSBzZWctPnRyYWtfbWVkaWFfc3RhcnQ7CisgIH0KKyAgLyogQ2FsY3VsYXRlIHRpbWUgcG9zaXRpb24gb2YgdGhlIGtleWZyYW1lIGFuZCB3aGVyZSB3ZSBzaG91bGQgc3RvcCAqLworICBrX3BvcyA9CisgICAgICBRVFNUUkVBTVRJTUVfVE9fR1NUVElNRSAocmVmX3N0ciwKKyAgICAgIHRhcmdldF90cyAtIHNlZy0+dHJha19tZWRpYV9zdGFydCkgKyBzZWctPnRpbWU7CisgIGxhc3Rfc3RvcCA9CisgICAgICBRVFNUUkVBTVRJTUVfVE9fR1NUVElNRSAocmVmX3N0ciwKKyAgICAgIHJlZl9zdHItPnNhbXBsZXNbcmVmX3N0ci0+ZnJvbV9zYW1wbGVdLnRpbWVzdGFtcCAtCisgICAgICBzZWctPnRyYWtfbWVkaWFfc3RhcnQpICsgc2VnLT50aW1lOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJwcmVmZXJyZWQgc3RyZWFtIHBsYXllZCBmcm9tIHNhbXBsZSAldSwgIgorICAgICAgIm5vdyBnb2luZyB0byBzYW1wbGUgJXUgKHB0cyAlIiBHU1RfVElNRV9GT1JNQVQgIikiLCByZWZfc3RyLT5mcm9tX3NhbXBsZSwKKyAgICAgIGtfaW5kZXgsIEdTVF9USU1FX0FSR1MgKGtfcG9zKSk7CisKKyAgLyogU2V0IGxhc3Rfc3RvcCB3aXRoIHRoZSBrZXlmcmFtZSB0aW1lc3RhbXAgd2UgcHVzaGVkIG9mIHRoYXQgc3RyZWFtICovCisgIHF0ZGVtdXgtPnNlZ21lbnQucG9zaXRpb24gPSBsYXN0X3N0b3A7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJsYXN0X3N0b3Agbm93IGlzICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKGxhc3Rfc3RvcCkpOworCisgIGlmIChHX1VOTElLRUxZIChsYXN0X3N0b3AgPCBxdGRlbXV4LT5zZWdtZW50LnN0YXJ0KSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJyZWFjaGVkIHRoZSBiZWdpbm5pbmcgb2Ygc2VnbWVudCIpOworICAgIGdvdG8gZW9zOworICB9CisKKyAgcmVmX3NlZ19pZHggPSByZWZfc3RyLT5zZWdtZW50X2luZGV4OworICByZWZfa19pbmRleCA9IGtfaW5kZXg7CisKKyAgLyogQWxpZ24gdGhlbSBhbGwgb24gdGhpcyAqLworICBmb3IgKG4gPSAwOyBuIDwgcXRkZW11eC0+bl9zdHJlYW1zOyBuKyspIHsKKyAgICBndWludDMyIGluZGV4ID0gMDsKKyAgICBHc3RDbG9ja1RpbWUgc2VnX3RpbWUgPSAwOworICAgIFF0RGVtdXhTdHJlYW0gKnN0ciA9IHF0ZGVtdXgtPnN0cmVhbXNbbl07CisKKyAgICAvKiBhbGlnbmluZyByZWZlcmVuY2Ugc3RyZWFtIGFnYWluIG1pZ2h0IGxlYWQgdG8gYmFja2luZyB1cCB0byB5ZXQgYW5vdGhlcgorICAgICAqIGtleWZyYW1lIChkdWUgdG8gdGltZXN0YW1wIHJvdW5kaW5nIGlzc3VlcyksCisgICAgICogcG90ZW50aWFsbHkgcHV0dGluZyBtb3JlIGxvYWQgb24gZG93bnN0cmVhbTsgc28gbGV0J3MgdHJ5IHRvIGF2b2lkICovCisgICAgaWYgKHN0ciA9PSByZWZfc3RyKSB7CisgICAgICBzZWdfaWR4ID0gcmVmX3NlZ19pZHg7CisgICAgICBzZWcgPSAmc3RyLT5zZWdtZW50c1tzZWdfaWR4XTsKKyAgICAgIGtfaW5kZXggPSByZWZfa19pbmRleDsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJyZWZlcmVuY2Ugc3RyZWFtICVkIHNlZ21lbnQgJWQsICIKKyAgICAgICAgICAic2FtcGxlIGF0IGluZGV4ICVkIiwgbiwgcmVmX3N0ci0+c2VnbWVudF9pbmRleCwga19pbmRleCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNlZ19pZHggPSBnc3RfcXRkZW11eF9maW5kX3NlZ21lbnQgKHF0ZGVtdXgsIHN0ciwga19wb3MpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAic3RyZWFtICVkIGFsaWduIHNlZ21lbnQgJWQgZm9yIGtleWZyYW1lIHBvcyAlIiBHU1RfVElNRV9GT1JNQVQsIG4sCisgICAgICAgICAgc2VnX2lkeCwgR1NUX1RJTUVfQVJHUyAoa19wb3MpKTsKKworICAgICAgLyogZ2V0IHNlZ21lbnQgYW5kIHRpbWUgaW4gdGhlIHNlZ21lbnQgKi8KKyAgICAgIHNlZyA9ICZzdHItPnNlZ21lbnRzW3NlZ19pZHhdOworICAgICAgc2VnX3RpbWUgPSBrX3BvcyAtIHNlZy0+dGltZTsKKworICAgICAgLyogZ2V0IHRoZSBtZWRpYSB0aW1lIGluIHRoZSBzZWdtZW50LgorICAgICAgICogTm8gYWRqdXN0bWVudCBmb3IgZW1wdHkgImZpbGxlciIgc2VnbWVudHMgKi8KKyAgICAgIGlmIChzZWctPm1lZGlhX3N0YXJ0ICE9IEdTVF9DTE9DS19USU1FX05PTkUpCisgICAgICAgIHNlZ190aW1lICs9IHNlZy0+bWVkaWFfc3RhcnQ7CisKKyAgICAgIC8qIGdldCB0aGUgaW5kZXggb2YgdGhlIHNhbXBsZSB3aXRoIG1lZGlhIHRpbWUgKi8KKyAgICAgIGluZGV4ID0gZ3N0X3F0ZGVtdXhfZmluZF9pbmRleF9saW5lYXIgKHF0ZGVtdXgsIHN0ciwgc2VnX3RpbWUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAic3RyZWFtICVkIHNhbXBsZSBmb3IgJSIgR1NUX1RJTUVfRk9STUFUICIgYXQgJXUiLCBuLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHNlZ190aW1lKSwgaW5kZXgpOworCisgICAgICAvKiBmaW5kIHByZXZpb3VzIGtleWZyYW1lICovCisgICAgICBrX2luZGV4ID0gZ3N0X3F0ZGVtdXhfZmluZF9rZXlmcmFtZSAocXRkZW11eCwgc3RyLCBpbmRleCwgRkFMU0UpOworICAgIH0KKworICAgIC8qIFJlbWVtYmVyIHVudGlsIHdoZXJlIHdlIHdhbnQgdG8gZ28gKi8KKyAgICBzdHItPnRvX3NhbXBsZSA9IHN0ci0+ZnJvbV9zYW1wbGUgLSAxOworICAgIC8qIERlZmluZSBvdXIgdGltZSBwb3NpdGlvbiAqLworICAgIHRhcmdldF90cyA9CisgICAgICAgIHN0ci0+c2FtcGxlc1trX2luZGV4XS50aW1lc3RhbXAgKyBzdHItPnNhbXBsZXNba19pbmRleF0ucHRzX29mZnNldDsKKyAgICBzdHItPnRpbWVfcG9zaXRpb24gPSBRVFNUUkVBTVRJTUVfVE9fR1NUVElNRSAoc3RyLCB0YXJnZXRfdHMpICsgc2VnLT50aW1lOworICAgIGlmIChzZWctPm1lZGlhX3N0YXJ0ICE9IEdTVF9DTE9DS19USU1FX05PTkUpCisgICAgICBzdHItPnRpbWVfcG9zaXRpb24gLT0gc2VnLT5tZWRpYV9zdGFydDsKKworICAgIC8qIE5vdyBzZWVrIGJhY2sgaW4gdGltZSAqLworICAgIGdzdF9xdGRlbXV4X21vdmVfc3RyZWFtIChxdGRlbXV4LCBzdHIsIGtfaW5kZXgpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJzdHJlYW0gJWQga2V5ZnJhbWUgYXQgJXUsIHRpbWUgcG9zaXRpb24gJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFUICIgcGxheWluZyBmcm9tIHNhbXBsZSAldSB0byAldSIsIG4sIGtfaW5kZXgsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHN0ci0+dGltZV9wb3NpdGlvbiksIHN0ci0+ZnJvbV9zYW1wbGUsIHN0ci0+dG9fc2FtcGxlKTsKKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworZW9zOgorICByZXR1cm4gR1NUX0ZMT1dfRU9TOworfQorCisvKgorICogR2V0cyB0aGUgY3VycmVudCBxdCBzZWdtZW50IHN0YXJ0LCBzdG9wIGFuZCBwb3NpdGlvbiBmb3IgdGhlCisgKiBnaXZlbiB0aW1lIG9mZnNldC4gVGhpcyBpcyB1c2VkIGluIHVwZGF0ZV9zZWdtZW50KCkKKyAqLworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X3N0cmVhbV9zZWdtZW50X2dldF9ib3VuZGFyaWVzIChHc3RRVERlbXV4ICogcXRkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtLCBHc3RDbG9ja1RpbWUgb2Zmc2V0LAorICAgIEdzdENsb2NrVGltZSAqIF9zdGFydCwgR3N0Q2xvY2tUaW1lICogX3N0b3AsIEdzdENsb2NrVGltZSAqIF90aW1lKQoreworICBHc3RDbG9ja1RpbWUgc2VnX3RpbWU7CisgIEdzdENsb2NrVGltZSBzdGFydCwgc3RvcCwgdGltZTsKKyAgUXREZW11eFNlZ21lbnQgKnNlZ21lbnQ7CisKKyAgc2VnbWVudCA9ICZzdHJlYW0tPnNlZ21lbnRzW3N0cmVhbS0+c2VnbWVudF9pbmRleF07CisKKyAgLyogZ2V0IHRpbWUgaW4gdGhpcyBzZWdtZW50ICovCisgIHNlZ190aW1lID0gKG9mZnNldCAtIHNlZ21lbnQtPnRpbWUpICogc2VnbWVudC0+cmF0ZTsKKworICBHU1RfTE9HX09CSkVDVCAoc3RyZWFtLT5wYWQsICJzZWdfdGltZSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChzZWdfdGltZSkpOworCisgIGlmIChHX1VOTElLRUxZIChzZWdfdGltZSA+IHNlZ21lbnQtPmR1cmF0aW9uKSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChzdHJlYW0tPnBhZCwKKyAgICAgICAgInNlZ190aW1lID4gc2VnbWVudC0+ZHVyYXRpb24gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChzZWdtZW50LT5kdXJhdGlvbikpOworICAgIHNlZ190aW1lID0gc2VnbWVudC0+ZHVyYXRpb247CisgIH0KKworICAvKiBxdGRlbXV4LT5zZWdtZW50LnN0b3AgaXMgaW4gb3V0c2lkZS10aW1lLXJlYWxtLCB3aGVyZWFzCisgICAqIHNlZ21lbnQtPm1lZGlhX3N0b3AgaXMgaW4gdHJhY2stdGltZS1yZWFsbS4KKyAgICoKKyAgICogSW4gb3JkZXIgdG8gY29tcGFyZSB0aGUgdHdvLCB3ZSBuZWVkIHRvIGJyaW5nIHNlZ21lbnQuc3RvcAorICAgKiBpbnRvIHRoZSB0cmFjay10aW1lLXJlYWxtCisgICAqCisgICAqIEZJWE1FIC0gZG9lcyB0aGlzIGNvbW1lbnQgc3RpbGwgaG9sZD8gRG9uJ3Qgc2VlIGFueSBjb252ZXJzaW9uIGhlcmUgKi8KKworICBzdG9wID0gcXRkZW11eC0+c2VnbWVudC5zdG9wOworICBpZiAoc3RvcCA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgIHN0b3AgPSBxdGRlbXV4LT5zZWdtZW50LmR1cmF0aW9uOworICBpZiAoc3RvcCA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgIHN0b3AgPSBzZWdtZW50LT5tZWRpYV9zdG9wOworICBlbHNlCisgICAgc3RvcCA9CisgICAgICAgIE1JTiAoc2VnbWVudC0+bWVkaWFfc3RvcCwgc3RvcCAtIHNlZ21lbnQtPnRpbWUgKyBzZWdtZW50LT5tZWRpYV9zdGFydCk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKFFUU0VHTUVOVF9JU19FTVBUWSAoc2VnbWVudCkpKSB7CisgICAgc3RhcnQgPSBzZWdtZW50LT50aW1lICsgc2VnX3RpbWU7CisgICAgdGltZSA9IG9mZnNldDsKKyAgICBzdG9wID0gc3RhcnQgLSBzZWdfdGltZSArIHNlZ21lbnQtPmR1cmF0aW9uOworICB9IGVsc2UgaWYgKHF0ZGVtdXgtPnNlZ21lbnQucmF0ZSA+PSAwKSB7CisgICAgc3RhcnQgPSBNSU4gKHNlZ21lbnQtPm1lZGlhX3N0YXJ0ICsgc2VnX3RpbWUsIHN0b3ApOworICAgIHRpbWUgPSBvZmZzZXQ7CisgIH0gZWxzZSB7CisgICAgaWYgKHNlZ21lbnQtPm1lZGlhX3N0YXJ0ID49IHF0ZGVtdXgtPnNlZ21lbnQuc3RhcnQpIHsKKyAgICAgIHRpbWUgPSBzZWdtZW50LT50aW1lOworICAgIH0gZWxzZSB7CisgICAgICB0aW1lID0gc2VnbWVudC0+dGltZSArIChxdGRlbXV4LT5zZWdtZW50LnN0YXJ0IC0gc2VnbWVudC0+bWVkaWFfc3RhcnQpOworICAgIH0KKworICAgIHN0YXJ0ID0gTUFYIChzZWdtZW50LT5tZWRpYV9zdGFydCwgcXRkZW11eC0+c2VnbWVudC5zdGFydCk7CisgICAgc3RvcCA9IE1JTiAoc2VnbWVudC0+bWVkaWFfc3RhcnQgKyBzZWdfdGltZSwgc3RvcCk7CisgIH0KKworICAqX3N0YXJ0ID0gc3RhcnQ7CisgICpfc3RvcCA9IHN0b3A7CisgICpfdGltZSA9IHRpbWU7Cit9CisKKy8qCisgKiBVcGRhdGVzIHRoZSBxdCBzZWdtZW50IHVzZWQgZm9yIHRoZSBzdHJlYW0gYW5kIHB1c2hlcyBhIG5ldyBzZWdtZW50IGV2ZW50CisgKiBkb3duc3RyZWFtIG9uIHRoaXMgc3RyZWFtJ3MgcGFkLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9xdGRlbXV4X3N0cmVhbV91cGRhdGVfc2VnbWVudCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0sCisgICAgZ2ludCBzZWdfaWR4LCBHc3RDbG9ja1RpbWUgb2Zmc2V0LCBHc3RDbG9ja1RpbWUgKiBfc3RhcnQsCisgICAgR3N0Q2xvY2tUaW1lICogX3N0b3ApCit7CisgIFF0RGVtdXhTZWdtZW50ICpzZWdtZW50OworICBHc3RDbG9ja1RpbWUgc3RhcnQgPSAwLCBzdG9wID0gR1NUX0NMT0NLX1RJTUVfTk9ORSwgdGltZSA9IDA7CisgIGdkb3VibGUgcmF0ZTsKKyAgR3N0RXZlbnQgKmV2ZW50OworCisgIC8qIHVwZGF0ZSB0aGUgY3VycmVudCBzZWdtZW50ICovCisgIHN0cmVhbS0+c2VnbWVudF9pbmRleCA9IHNlZ19pZHg7CisKKyAgLyogZ2V0IHRoZSBzZWdtZW50ICovCisgIHNlZ21lbnQgPSAmc3RyZWFtLT5zZWdtZW50c1tzZWdfaWR4XTsKKworICBpZiAoR19VTkxJS0VMWSAob2Zmc2V0IDwgc2VnbWVudC0+dGltZSkpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHN0cmVhbS0+cGFkLCAib2Zmc2V0IDwgc2VnbWVudC0+dGltZSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHNlZ21lbnQtPnRpbWUpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBzZWdtZW50IGxpZXMgYmV5b25kIHRvdGFsIGluZGljYXRlZCBkdXJhdGlvbiAqLworICBpZiAoR19VTkxJS0VMWSAocXRkZW11eC0+c2VnbWVudC5kdXJhdGlvbiAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FICYmCisgICAgICAgICAgc2VnbWVudC0+dGltZSA+IHF0ZGVtdXgtPnNlZ21lbnQuZHVyYXRpb24pKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzdHJlYW0tPnBhZCwgImZpbGUgZHVyYXRpb24gJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICIgPCBzZWdtZW50LT50aW1lICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAocXRkZW11eC0+c2VnbWVudC5kdXJhdGlvbiksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHNlZ21lbnQtPnRpbWUpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBnc3RfcXRkZW11eF9zdHJlYW1fc2VnbWVudF9nZXRfYm91bmRhcmllcyAocXRkZW11eCwgc3RyZWFtLCBvZmZzZXQsCisgICAgICAmc3RhcnQsICZzdG9wLCAmdGltZSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3RyZWFtLT5wYWQsICJuZXcgc2VnbWVudCAlZCBmcm9tICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiB0byAlIiBHU1RfVElNRV9GT1JNQVQgIiwgdGltZSAlIiBHU1RfVElNRV9GT1JNQVQsIHNlZ19pZHgsCisgICAgICBHU1RfVElNRV9BUkdTIChzdGFydCksIEdTVF9USU1FX0FSR1MgKHN0b3ApLCBHU1RfVElNRV9BUkdTICh0aW1lKSk7CisKKyAgLyogY29tYmluZSBnbG9iYWwgcmF0ZSB3aXRoIHRoYXQgb2YgdGhlIHNlZ21lbnQgKi8KKyAgcmF0ZSA9IHNlZ21lbnQtPnJhdGUgKiBxdGRlbXV4LT5zZWdtZW50LnJhdGU7CisKKyAgLyogQ29weSBmbGFncyBmcm9tIG1haW4gc2VnbWVudCAqLworICBzdHJlYW0tPnNlZ21lbnQuZmxhZ3MgPSBxdGRlbXV4LT5zZWdtZW50LmZsYWdzOworCisgIC8qIHVwZGF0ZSB0aGUgc2VnbWVudCB2YWx1ZXMgdXNlZCBmb3IgY2xpcHBpbmcgKi8KKyAgc3RyZWFtLT5zZWdtZW50Lm9mZnNldCA9IHF0ZGVtdXgtPnNlZ21lbnQub2Zmc2V0OworICBzdHJlYW0tPnNlZ21lbnQuYmFzZSA9IHF0ZGVtdXgtPnNlZ21lbnQuYmFzZSArIHN0cmVhbS0+YWNjdW11bGF0ZWRfYmFzZTsKKyAgc3RyZWFtLT5zZWdtZW50LmFwcGxpZWRfcmF0ZSA9IHF0ZGVtdXgtPnNlZ21lbnQuYXBwbGllZF9yYXRlOworICBzdHJlYW0tPnNlZ21lbnQucmF0ZSA9IHJhdGU7CisgIHN0cmVhbS0+c2VnbWVudC5zdGFydCA9IHN0YXJ0ICsgUVRTVFJFQU1USU1FX1RPX0dTVFRJTUUgKHN0cmVhbSwKKyAgICAgIHN0cmVhbS0+Y3NsZ19zaGlmdCk7CisgIHN0cmVhbS0+c2VnbWVudC5zdG9wID0gc3RvcCArIFFUU1RSRUFNVElNRV9UT19HU1RUSU1FIChzdHJlYW0sCisgICAgICBzdHJlYW0tPmNzbGdfc2hpZnQpOworICBzdHJlYW0tPnNlZ21lbnQudGltZSA9IHRpbWU7CisgIHN0cmVhbS0+c2VnbWVudC5wb3NpdGlvbiA9IHN0cmVhbS0+c2VnbWVudC5zdGFydDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzdHJlYW0tPnBhZCwgIk5ldyBzZWdtZW50OiAlIiBHU1RfU0VHTUVOVF9GT1JNQVQsCisgICAgICAmc3RyZWFtLT5zZWdtZW50KTsKKworICAvKiBub3cgcHJlcGFyZSBhbmQgc2VuZCB0aGUgc2VnbWVudCAqLworICBpZiAoc3RyZWFtLT5wYWQpIHsKKyAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnN0cmVhbS0+c2VnbWVudCk7CisgICAgaWYgKHF0ZGVtdXgtPnNlZ21lbnRfc2VxbnVtICE9IEdTVF9TRVFOVU1fSU5WQUxJRCkgeworICAgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGV2ZW50LCBxdGRlbXV4LT5zZWdtZW50X3NlcW51bSk7CisgICAgfQorICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3RyZWFtLT5wYWQsIGV2ZW50KTsKKyAgICAvKiBhc3N1bWUgd2UgY2FuIHNlbmQgbW9yZSBkYXRhIG5vdyAqLworICAgIEdTVF9QQURfTEFTVF9GTE9XX1JFVFVSTiAoc3RyZWFtLT5wYWQpID0gR1NUX0ZMT1dfT0s7CisgICAgLyogY2xlYXIgdG8gc2VuZCB0YWdzIG9uIHRoaXMgcGFkIG5vdyAqLworICAgIGdzdF9xdGRlbXV4X3B1c2hfdGFncyAocXRkZW11eCwgc3RyZWFtKTsKKyAgfQorCisgIGlmIChfc3RhcnQpCisgICAgKl9zdGFydCA9IHN0YXJ0OworICBpZiAoX3N0b3ApCisgICAgKl9zdG9wID0gc3RvcDsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogYWN0aXZhdGUgdGhlIGdpdmVuIHNlZ21lbnQgbnVtYmVyIEBzZWdfaWR4IG9mIEBzdHJlYW0gYXQgdGltZSBAb2Zmc2V0LgorICogQG9mZnNldCBpcyBhbiBhYnNvbHV0ZSBnbG9iYWwgcG9zaXRpb24gb3ZlciBhbGwgdGhlIHNlZ21lbnRzLgorICoKKyAqIFRoaXMgd2lsbCBwdXNoIG91dCBhIE5FV1NFR01FTlQgZXZlbnQgd2l0aCB0aGUgcmlnaHQgdmFsdWVzIGFuZAorICogcG9zaXRpb24gdGhlIHN0cmVhbSBpbmRleCB0byB0aGUgZmlyc3QgZGVjb2RhYmxlIHNhbXBsZSBiZWZvcmUKKyAqIEBvZmZzZXQuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3F0ZGVtdXhfYWN0aXZhdGVfc2VnbWVudCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0sCisgICAgZ3VpbnQzMiBzZWdfaWR4LCBHc3RDbG9ja1RpbWUgb2Zmc2V0KQoreworICBRdERlbXV4U2VnbWVudCAqc2VnbWVudDsKKyAgZ3VpbnQzMiBpbmRleCwga2ZfaW5kZXg7CisgIEdzdENsb2NrVGltZSBzdGFydCA9IDAsIHN0b3AgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIEdTVF9MT0dfT0JKRUNUIChzdHJlYW0tPnBhZCwgImFjdGl2YXRlIHNlZ21lbnQgJWQsIG9mZnNldCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBzZWdfaWR4LCBHU1RfVElNRV9BUkdTIChvZmZzZXQpKTsKKworICBpZiAoIWdzdF9xdGRlbXV4X3N0cmVhbV91cGRhdGVfc2VnbWVudCAocXRkZW11eCwgc3RyZWFtLCBzZWdfaWR4LCBvZmZzZXQsCisgICAgICAgICAgJnN0YXJ0LCAmc3RvcCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHNlZ21lbnQgPSAmc3RyZWFtLT5zZWdtZW50c1tzdHJlYW0tPnNlZ21lbnRfaW5kZXhdOworCisgIC8qIGluIHRoZSBmcmFnbWVudGVkIGNhc2UsIHdlIHBpY2sgYSBmcmFnbWVudCB0aGF0IHN0YXJ0cyBiZWZvcmUgb3VyCisgICAqIGRlc2lyZWQgcG9zaXRpb24gYW5kIHJlbHkgb24gZG93bnN0cmVhbSB0byB3YWl0IGZvciBhIGtleWZyYW1lCisgICAqIChGSVhNRTogZG9lc24ndCBzZWVtIHRvIHdvcmsgc28gd2VsbCB3aXRoIGlzbXYgYW5kIHdtdiwgYXMgbm8gcGFyc2VyOyB0aGUKKyAgICogdGZyYSBlbnRyaWVzIHRlbGxzIHVzIHdoaWNoIHRydW4vc2FtcGxlIHRoZSBrZXkgdW5pdCBpcyBpbiwgYnV0IHdlIGRvbid0CisgICAqIG1ha2UgdXNlIG9mIHRoaXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhdCB0aGUgbW9tZW50KSAqLworICBpZiAocXRkZW11eC0+ZnJhZ21lbnRlZCAmJiAhcXRkZW11eC0+ZnJhZ21lbnRlZF9zZWVrX3BlbmRpbmcpIHsKKyAgICBzdHJlYW0tPnRvX3NhbXBsZSA9IEdfTUFYVUlOVDMyOworICAgIHJldHVybiBUUlVFOworICB9IGVsc2UgeworICAgIC8qIHdlbGwsIGl0IHdpbGwgYmUgdGFrZW4gY2FyZSBvZiBiZWxvdyAqLworICAgIHF0ZGVtdXgtPmZyYWdtZW50ZWRfc2Vla19wZW5kaW5nID0gRkFMU0U7CisgICAgLyogRklYTUUgaWRlYWxseSB0aGUgZG9fZnJhZ21lbnRlZF9zZWVrIGNhbiBiZSBkb25lIHJpZ2h0IGhlcmUsCisgICAgICogcmF0aGVyIHRoYW4gYXQgbG9vcCBsZXZlbAorICAgICAqICh3aGljaCBtaWdodCBldmVuIGFsbG93IGhhbmRsaW5nIGVkaXQgbGlzdHMgaW4gYSBmcmFnbWVudGVkIGZpbGUpICovCisgIH0KKworICAvKiBXZSBkb24ndCBuZWVkIHRvIGxvb2sgZm9yIGEgc2FtcGxlIGluIHB1c2gtYmFzZWQgKi8KKyAgaWYgKCFxdGRlbXV4LT5wdWxsYmFzZWQpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgLyogYW5kIG1vdmUgdG8gdGhlIGtleWZyYW1lIGJlZm9yZSB0aGUgaW5kaWNhdGVkIG1lZGlhIHRpbWUgb2YgdGhlCisgICAqIHNlZ21lbnQgKi8KKyAgaWYgKEdfTElLRUxZICghUVRTRUdNRU5UX0lTX0VNUFRZIChzZWdtZW50KSkpIHsKKyAgICBpZiAocXRkZW11eC0+c2VnbWVudC5yYXRlID49IDApIHsKKyAgICAgIGluZGV4ID0gZ3N0X3F0ZGVtdXhfZmluZF9pbmRleF9saW5lYXIgKHF0ZGVtdXgsIHN0cmVhbSwgc3RhcnQpOworICAgICAgc3RyZWFtLT50b19zYW1wbGUgPSBHX01BWFVJTlQzMjsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHN0cmVhbS0+cGFkLAorICAgICAgICAgICJtb3ZpbmcgZGF0YSBwb2ludGVyIHRvICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBpbmRleDogJXUsIHB0cyAlIgorICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAoc3RhcnQpLCBpbmRleCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChRVFNBTVBMRV9QVFMgKHN0cmVhbSwgJnN0cmVhbS0+c2FtcGxlc1tpbmRleF0pKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGV4ID0gZ3N0X3F0ZGVtdXhfZmluZF9pbmRleF9saW5lYXIgKHF0ZGVtdXgsIHN0cmVhbSwgc3RvcCk7CisgICAgICBzdHJlYW0tPnRvX3NhbXBsZSA9IGluZGV4OworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3RyZWFtLT5wYWQsCisgICAgICAgICAgIm1vdmluZyBkYXRhIHBvaW50ZXIgdG8gJSIgR1NUX1RJTUVfRk9STUFUICIsIGluZGV4OiAldSwgcHRzICUiCisgICAgICAgICAgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChzdG9wKSwgaW5kZXgsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoUVRTQU1QTEVfUFRTIChzdHJlYW0sICZzdHJlYW0tPnNhbXBsZXNbaW5kZXhdKSkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzdHJlYW0tPnBhZCwgIk5vIG5lZWQgdG8gbG9vayBmb3Iga2V5ZnJhbWUsICIKKyAgICAgICAgInRoaXMgaXMgYW4gZW1wdHkgc2VnbWVudCIpOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgLyogZ3N0X3F0ZGVtdXhfcGFyc2Vfc2FtcGxlICgpIGNhbGxlZCBmcm9tIGdzdF9xdGRlbXV4X2ZpbmRfaW5kZXhfbGluZWFyICgpCisgICAqIGVuY291bnRlcmVkIGFuIGVycm9yIGFuZCBwcmludGVkIGEgbWVzc2FnZSBzbyB3ZSByZXR1cm4gYXBwcm9wcmlhdGVseSAqLworICBpZiAoaW5kZXggPT0gLTEpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIHdlJ3JlIGF0IHRoZSByaWdodCBzcG90ICovCisgIGlmIChpbmRleCA9PSBzdHJlYW0tPnNhbXBsZV9pbmRleCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHN0cmVhbS0+cGFkLCAid2UgYXJlIGF0IHRoZSByaWdodCBpbmRleCIpOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgLyogZmluZCBrZXlmcmFtZSBvZiB0aGUgdGFyZ2V0IGluZGV4ICovCisgIGtmX2luZGV4ID0gZ3N0X3F0ZGVtdXhfZmluZF9rZXlmcmFtZSAocXRkZW11eCwgc3RyZWFtLCBpbmRleCwgRkFMU0UpOworCisvKiAqSU5ERU5ULU9GRiogKi8KKy8qIGluZGVudCBkb2VzIHN0dXBpZCBzdHVmZiB3aXRoIHN0cmVhbS0+c2FtcGxlc1tdLnRpbWVzdGFtcCAqLworCisgIC8qIGlmIHdlIG1vdmUgZm9yd2FyZHMsIHdlIGRvbid0IGhhdmUgdG8gZ28gYmFjayB0byB0aGUgcHJldmlvdXMKKyAgICoga2V5ZnJhbWUgc2luY2Ugd2UgYWxyZWFkeSBzZW50IHRoYXQuIFdlIGNhbiBhbHNvIGp1c3QganVtcCB0bworICAgKiB0aGUga2V5ZnJhbWUgcmlnaHQgYmVmb3JlIHRoZSB0YXJnZXQgaW5kZXggaWYgdGhlcmUgaXMgb25lLiAqLworICBpZiAoaW5kZXggPiBzdHJlYW0tPnNhbXBsZV9pbmRleCkgeworICAgIC8qIG1vdmluZyBmb3J3YXJkcyBjaGVjayBpZiB3ZSBtb3ZlIHBhc3QgYSBrZXlmcmFtZSAqLworICAgIGlmIChrZl9pbmRleCA+IHN0cmVhbS0+c2FtcGxlX2luZGV4KSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzdHJlYW0tPnBhZCwKKyAgICAgICAgICAgIm1vdmluZyBmb3J3YXJkcyB0byBrZXlmcmFtZSBhdCAldSAocHRzICUiIEdTVF9USU1FX0ZPUk1BVCAiIGR0cyAlIkdTVF9USU1FX0ZPUk1BVCIgKSIsIGtmX2luZGV4LAorICAgICAgICAgICBHU1RfVElNRV9BUkdTIChRVFNBTVBMRV9QVFMoc3RyZWFtLCAmc3RyZWFtLT5zYW1wbGVzW2tmX2luZGV4XSkpLAorICAgICAgICAgICBHU1RfVElNRV9BUkdTIChRVFNBTVBMRV9EVFMoc3RyZWFtLCAmc3RyZWFtLT5zYW1wbGVzW2tmX2luZGV4XSkpKTsKKyAgICAgIGdzdF9xdGRlbXV4X21vdmVfc3RyZWFtIChxdGRlbXV4LCBzdHJlYW0sIGtmX2luZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3RyZWFtLT5wYWQsCisgICAgICAgICAgIm1vdmluZyBmb3J3YXJkcywga2V5ZnJhbWUgYXQgJXUgKHB0cyAlIiBHU1RfVElNRV9GT1JNQVQgIiBkdHMgJSJHU1RfVElNRV9GT1JNQVQiICkgYWxyZWFkeSBzZW50Iiwga2ZfaW5kZXgsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoUVRTQU1QTEVfUFRTIChzdHJlYW0sICZzdHJlYW0tPnNhbXBsZXNba2ZfaW5kZXhdKSksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoUVRTQU1QTEVfRFRTIChzdHJlYW0sICZzdHJlYW0tPnNhbXBsZXNba2ZfaW5kZXhdKSkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzdHJlYW0tPnBhZCwKKyAgICAgICAgIm1vdmluZyBiYWNrd2FyZHMgdG8ga2V5ZnJhbWUgYXQgJXUgKHB0cyAlIiBHU1RfVElNRV9GT1JNQVQgIiBkdHMgJSJHU1RfVElNRV9GT1JNQVQiICkiLCBrZl9pbmRleCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoUVRTQU1QTEVfUFRTKHN0cmVhbSwgJnN0cmVhbS0+c2FtcGxlc1trZl9pbmRleF0pKSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoUVRTQU1QTEVfRFRTKHN0cmVhbSwgJnN0cmVhbS0+c2FtcGxlc1trZl9pbmRleF0pKSk7CisgICAgZ3N0X3F0ZGVtdXhfbW92ZV9zdHJlYW0gKHF0ZGVtdXgsIHN0cmVhbSwga2ZfaW5kZXgpOworICB9CisKKy8qICpJTkRFTlQtT04qICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIHByZXBhcmUgdG8gZ2V0IHRoZSBjdXJyZW50IHNhbXBsZSBvZiBAc3RyZWFtLCBnZXR0aW5nIGVzc2VudGlhbCB2YWx1ZXMuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsc28gcHJlcGFyZSBhbmQgc2VuZCB0aGUgc2VnbWVudCB3aGVuIG5lZWRlZC4KKyAqCisgKiBSZXR1cm4gRkFMU0UgaWYgdGhlIHN0cmVhbSBpcyBFT1MuCisgKgorICogUFVMTC1CQVNFRAorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9xdGRlbXV4X3ByZXBhcmVfY3VycmVudF9zYW1wbGUgKEdzdFFURGVtdXggKiBxdGRlbXV4LAorICAgIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0sIGdib29sZWFuICogZW1wdHksIGd1aW50NjQgKiBvZmZzZXQsIGd1aW50ICogc2l6ZSwKKyAgICBHc3RDbG9ja1RpbWUgKiBkdHMsIEdzdENsb2NrVGltZSAqIHB0cywgR3N0Q2xvY2tUaW1lICogZHVyYXRpb24sCisgICAgZ2Jvb2xlYW4gKiBrZXlmcmFtZSkKK3sKKyAgUXREZW11eFNhbXBsZSAqc2FtcGxlOworICBHc3RDbG9ja1RpbWUgdGltZV9wb3NpdGlvbjsKKyAgZ3VpbnQzMiBzZWdfaWR4OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzdHJlYW0gIT0gTlVMTCwgRkFMU0UpOworCisgIHRpbWVfcG9zaXRpb24gPSBzdHJlYW0tPnRpbWVfcG9zaXRpb247CisgIGlmIChHX1VOTElLRUxZICh0aW1lX3Bvc2l0aW9uID09IEdTVF9DTE9DS19USU1FX05PTkUpKQorICAgIGdvdG8gZW9zOworCisgIHNlZ19pZHggPSBzdHJlYW0tPnNlZ21lbnRfaW5kZXg7CisgIGlmIChHX1VOTElLRUxZIChzZWdfaWR4ID09IC0xKSkgeworICAgIC8qIGZpbmQgc2VnbWVudCBjb3JyZXNwb25kaW5nIHRvIHRpbWVfcG9zaXRpb24gaWYgd2UgYXJlIGxvb2tpbmcKKyAgICAgKiBmb3IgYSBzZWdtZW50LiAqLworICAgIHNlZ19pZHggPSBnc3RfcXRkZW11eF9maW5kX3NlZ21lbnQgKHF0ZGVtdXgsIHN0cmVhbSwgdGltZV9wb3NpdGlvbik7CisgIH0KKworICAvKiBkaWZmZXJlbnQgc2VnbWVudCwgYWN0aXZhdGUgaXQsIHNhbXBsZV9pbmRleCB3aWxsIGJlIHNldC4gKi8KKyAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbS0+c2VnbWVudF9pbmRleCAhPSBzZWdfaWR4KSkKKyAgICBnc3RfcXRkZW11eF9hY3RpdmF0ZV9zZWdtZW50IChxdGRlbXV4LCBzdHJlYW0sIHNlZ19pZHgsIHRpbWVfcG9zaXRpb24pOworCisgIGlmIChHX1VOTElLRUxZIChRVFNFR01FTlRfSVNfRU1QVFkgKCZzdHJlYW0tPnNlZ21lbnRzW3N0cmVhbS0+CisgICAgICAgICAgICAgICAgICBzZWdtZW50X2luZGV4XSkpKSB7CisgICAgUXREZW11eFNlZ21lbnQgKnNlZyA9ICZzdHJlYW0tPnNlZ21lbnRzW3N0cmVhbS0+c2VnbWVudF9pbmRleF07CisKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIkVtcHR5IHNlZ21lbnQgYWN0aXZhdGVkLCIKKyAgICAgICAgIiBwcmVwYXJlIGVtcHR5IHNhbXBsZSIpOworCisgICAgKmVtcHR5ID0gVFJVRTsKKyAgICAqcHRzID0gKmR0cyA9IHRpbWVfcG9zaXRpb247CisgICAgKmR1cmF0aW9uID0gc2VnLT5kdXJhdGlvbiAtICh0aW1lX3Bvc2l0aW9uIC0gc2VnLT50aW1lKTsKKworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgKmVtcHR5ID0gRkFMU0U7CisKKyAgaWYgKHN0cmVhbS0+c2FtcGxlX2luZGV4ID09IC0xKQorICAgIHN0cmVhbS0+c2FtcGxlX2luZGV4ID0gMDsKKworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInNlZ21lbnQgYWN0aXZlLCBpbmRleCA9ICV1IG9mICV1IiwKKyAgICAgIHN0cmVhbS0+c2FtcGxlX2luZGV4LCBzdHJlYW0tPm5fc2FtcGxlcyk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbS0+c2FtcGxlX2luZGV4ID49IHN0cmVhbS0+bl9zYW1wbGVzKSkgeworICAgIGlmICghcXRkZW11eC0+ZnJhZ21lbnRlZCkKKyAgICAgIGdvdG8gZW9zOworCisgICAgR1NUX0lORk9fT0JKRUNUIChxdGRlbXV4LCAib3V0IG9mIHNhbXBsZXMsIHRyeWluZyB0byBhZGQgbW9yZSIpOworICAgIGRvIHsKKyAgICAgIEdzdEZsb3dSZXR1cm4gZmxvdzsKKworICAgICAgR1NUX09CSkVDVF9MT0NLIChxdGRlbXV4KTsKKyAgICAgIGZsb3cgPSBxdGRlbXV4X2FkZF9mcmFnbWVudGVkX3NhbXBsZXMgKHF0ZGVtdXgpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0ZGVtdXgpOworCisgICAgICBpZiAoZmxvdyAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBlb3M7CisgICAgfQorICAgIHdoaWxlIChzdHJlYW0tPnNhbXBsZV9pbmRleCA+PSBzdHJlYW0tPm5fc2FtcGxlcyk7CisgIH0KKworICBpZiAoIXF0ZGVtdXhfcGFyc2Vfc2FtcGxlcyAocXRkZW11eCwgc3RyZWFtLCBzdHJlYW0tPnNhbXBsZV9pbmRleCkpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIlBhcnNpbmcgb2YgaW5kZXggJXUgZmFpbGVkISIsCisgICAgICAgIHN0cmVhbS0+c2FtcGxlX2luZGV4KTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBub3cgZ2V0IHRoZSBpbmZvIGZvciB0aGUgc2FtcGxlIHdlJ3JlIGF0ICovCisgIHNhbXBsZSA9ICZzdHJlYW0tPnNhbXBsZXNbc3RyZWFtLT5zYW1wbGVfaW5kZXhdOworCisgICpkdHMgPSBRVFNBTVBMRV9EVFMgKHN0cmVhbSwgc2FtcGxlKTsKKyAgKnB0cyA9IFFUU0FNUExFX1BUUyAoc3RyZWFtLCBzYW1wbGUpOworICAqb2Zmc2V0ID0gc2FtcGxlLT5vZmZzZXQ7CisgICpzaXplID0gc2FtcGxlLT5zaXplOworICAqZHVyYXRpb24gPSBRVFNBTVBMRV9EVVJfRFRTIChzdHJlYW0sIHNhbXBsZSwgKmR0cyk7CisgICprZXlmcmFtZSA9IFFUU0FNUExFX0tFWUZSQU1FIChzdHJlYW0sIHNhbXBsZSk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogc3BlY2lhbCBjYXNlcyAqLworZW9zOgorICB7CisgICAgc3RyZWFtLT50aW1lX3Bvc2l0aW9uID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogbW92ZSB0byB0aGUgbmV4dCBzYW1wbGUgaW4gQHN0cmVhbS4KKyAqCisgKiBNb3ZlcyB0byB0aGUgbmV4dCBzZWdtZW50IHdoZW4gbmVlZGVkLgorICovCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfYWR2YW5jZV9zYW1wbGUgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBRdERlbXV4U3RyZWFtICogc3RyZWFtKQoreworICBRdERlbXV4U2FtcGxlICpzYW1wbGU7CisgIFF0RGVtdXhTZWdtZW50ICpzZWdtZW50OworCisgIC8qIGdldCBjdXJyZW50IHNlZ21lbnQgKi8KKyAgc2VnbWVudCA9ICZzdHJlYW0tPnNlZ21lbnRzW3N0cmVhbS0+c2VnbWVudF9pbmRleF07CisKKyAgaWYgKEdfVU5MSUtFTFkgKFFUU0VHTUVOVF9JU19FTVBUWSAoc2VnbWVudCkpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIkVtcHR5IHNlZ21lbnQsIG5vIHNhbXBsZXMgdG8gYWR2YW5jZSIpOworICAgIGdvdG8gbmV4dF9zZWdtZW50OworICB9CisKKyAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbS0+c2FtcGxlX2luZGV4ID49IHN0cmVhbS0+dG9fc2FtcGxlKSkgeworICAgIC8qIE1hcmsgdGhlIHN0cmVhbSBhcyBFT1MgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAicmVhY2hlZCBtYXggYWxsb3dlZCBzYW1wbGUgJXUsIG1hcmsgRU9TIiwgc3RyZWFtLT50b19zYW1wbGUpOworICAgIHN0cmVhbS0+dGltZV9wb3NpdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogbW92ZSB0byBuZXh0IHNhbXBsZSAqLworICBzdHJlYW0tPnNhbXBsZV9pbmRleCsrOworICBzdHJlYW0tPm9mZnNldF9pbl9zYW1wbGUgPSAwOworCisgIC8qIHJlYWNoZWQgdGhlIGxhc3Qgc2FtcGxlLCB3ZSBuZWVkIHRoZSBuZXh0IHNlZ21lbnQgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbS0+c2FtcGxlX2luZGV4ID49IHN0cmVhbS0+bl9zYW1wbGVzKSkKKyAgICBnb3RvIG5leHRfc2VnbWVudDsKKworICBpZiAoIXF0ZGVtdXhfcGFyc2Vfc2FtcGxlcyAocXRkZW11eCwgc3RyZWFtLCBzdHJlYW0tPnNhbXBsZV9pbmRleCkpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIlBhcnNpbmcgb2YgaW5kZXggJXUgZmFpbGVkISIsCisgICAgICAgIHN0cmVhbS0+c2FtcGxlX2luZGV4KTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBnZXQgbmV4dCBzYW1wbGUgKi8KKyAgc2FtcGxlID0gJnN0cmVhbS0+c2FtcGxlc1tzdHJlYW0tPnNhbXBsZV9pbmRleF07CisKKyAgLyogc2VlIGlmIHdlIGFyZSBwYXN0IHRoZSBzZWdtZW50ICovCisgIGlmIChHX1VOTElLRUxZIChRVFNBTVBMRV9EVFMgKHN0cmVhbSwgc2FtcGxlKSA+PSBzZWdtZW50LT5tZWRpYV9zdG9wKSkKKyAgICBnb3RvIG5leHRfc2VnbWVudDsKKworICBpZiAoUVRTQU1QTEVfRFRTIChzdHJlYW0sIHNhbXBsZSkgPj0gc2VnbWVudC0+bWVkaWFfc3RhcnQpIHsKKyAgICAvKiBpbnNpZGUgdGhlIHNlZ21lbnQsIHVwZGF0ZSB0aW1lX3Bvc2l0aW9uLCBsb29rcyB2ZXJ5IGZhbWlsaWFyIHRvCisgICAgICogR1N0cmVhbWVyIHNlZ21lbnRzLCBkb2Vzbid0IGl0PyAqLworICAgIHN0cmVhbS0+dGltZV9wb3NpdGlvbiA9CisgICAgICAgIFFUU0FNUExFX0RUUyAoc3RyZWFtLCBzYW1wbGUpIC0gc2VnbWVudC0+bWVkaWFfc3RhcnQgKyBzZWdtZW50LT50aW1lOworICB9IGVsc2UgeworICAgIC8qIG5vdCB5ZXQgaW4gc2VnbWVudCwgdGltZSBkb2VzIG5vdCB5ZXQgaW5jcmVtZW50LiBUaGlzIG1lYW5zCisgICAgICogdGhhdCB3ZSBhcmUgc3RpbGwgcHJlcm9sbGluZyBrZXlmcmFtZXMgdG8gdGhlIGRlY29kZXIgc28gaXQgY2FuCisgICAgICogZGVjb2RlIHRoZSBmaXJzdCBzYW1wbGUgb2YgdGhlIHNlZ21lbnQuICovCisgICAgc3RyZWFtLT50aW1lX3Bvc2l0aW9uID0gc2VnbWVudC0+dGltZTsKKyAgfQorICByZXR1cm47CisKKyAgLyogbW92ZSB0byB0aGUgbmV4dCBzZWdtZW50ICovCituZXh0X3NlZ21lbnQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic2VnbWVudCAlZCBlbmRlZCAiLCBzdHJlYW0tPnNlZ21lbnRfaW5kZXgpOworCisgICAgaWYgKHN0cmVhbS0+c2VnbWVudF9pbmRleCA9PSBzdHJlYW0tPm5fc2VnbWVudHMgLSAxKSB7CisgICAgICAvKiBhcmUgd2UgYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCBzZWdtZW50LCB3ZSdyZSBFT1MgKi8KKyAgICAgIHN0cmVhbS0+dGltZV9wb3NpdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGVsc2Ugd2UncmUgb25seSBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHNlZ21lbnQgKi8KKyAgICAgIHN0cmVhbS0+dGltZV9wb3NpdGlvbiA9IHNlZ21lbnQtPnN0b3BfdGltZTsKKyAgICB9CisgICAgLyogbWFrZSBzdXJlIHdlIHNlbGVjdCBhIG5ldyBzZWdtZW50ICovCisKKyAgICAvKiBhY2N1bXVsYXRlIHByZXZpb3VzIHNlZ21lbnRzICovCisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdHJlYW0tPnNlZ21lbnQuc3RvcCkpCisgICAgICBzdHJlYW0tPmFjY3VtdWxhdGVkX2Jhc2UgKz0KKyAgICAgICAgICAoc3RyZWFtLT5zZWdtZW50LnN0b3AgLQorICAgICAgICAgIHN0cmVhbS0+c2VnbWVudC5zdGFydCkgLyBBQlMgKHN0cmVhbS0+c2VnbWVudC5yYXRlKTsKKworICAgIHN0cmVhbS0+c2VnbWVudF9pbmRleCA9IC0xOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9zeW5jX3N0cmVhbXMgKEdzdFFURGVtdXggKiBkZW11eCkKK3sKKyAgZ2ludCBpOworCisgIGlmIChkZW11eC0+bl9zdHJlYW1zIDw9IDEpCisgICAgcmV0dXJuOworCisgIGZvciAoaSA9IDA7IGkgPCBkZW11eC0+bl9zdHJlYW1zOyBpKyspIHsKKyAgICBRdERlbXV4U3RyZWFtICpzdHJlYW07CisgICAgR3N0Q2xvY2tUaW1lIGVuZF90aW1lOworCisgICAgc3RyZWFtID0gZGVtdXgtPnN0cmVhbXNbaV07CisKKyAgICBpZiAoIXN0cmVhbS0+cGFkKQorICAgICAgY29udGludWU7CisKKyAgICAvKiBUT0RPIGFkdmFuY2UgdGltZSBvbiBzdWJ0aXRsZSBzdHJlYW1zIGhlcmUsIGlmIGFueSBzb21lIGRheSAqLworCisgICAgLyogc29tZSBjbGlwcy90cmFpbGVycyBtYXkgaGF2ZSB1bmJhbGFuY2VkIHN0cmVhbXMgYXQgdGhlIGVuZCwKKyAgICAgKiBzbyBzZW5kIEVPUyBvbiBzaG9ydGVyIHN0cmVhbSB0byBwcmV2ZW50IHN0YWxsaW5nIG90aGVycyAqLworCisgICAgLyogZG8gbm90IG1lc3Mgd2l0aCBFT1MgaWYgU0VHTUVOVCBzZWVraW5nICovCisgICAgaWYgKGRlbXV4LT5zZWdtZW50LmZsYWdzICYgR1NUX1NFRUtfRkxBR19TRUdNRU5UKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoZGVtdXgtPnB1bGxiYXNlZCkgeworICAgICAgLyogbG9vcCBtb2RlIGlzIHNhbXBsZSB0aW1lIGJhc2VkICovCisgICAgICBpZiAoIVNUUkVBTV9JU19FT1MgKHN0cmVhbSkpCisgICAgICAgIGNvbnRpbnVlOworICAgIH0gZWxzZSB7CisgICAgICAvKiBwdXNoIG1vZGUgaXMgYnl0ZSBwb3NpdGlvbiBiYXNlZCAqLworICAgICAgaWYgKHN0cmVhbS0+bl9zYW1wbGVzICYmCisgICAgICAgICAgc3RyZWFtLT5zYW1wbGVzW3N0cmVhbS0+bl9zYW1wbGVzIC0gMV0ub2Zmc2V0ID49IGRlbXV4LT5vZmZzZXQpCisgICAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChzdHJlYW0tPnNlbnRfZW9zKQorICAgICAgY29udGludWU7CisKKyAgICAvKiBvbmx5IGFjdCBpZiBzb21lIGdhcCAqLworICAgIGVuZF90aW1lID0gc3RyZWFtLT5zZWdtZW50c1tzdHJlYW0tPm5fc2VnbWVudHMgLSAxXS5zdG9wX3RpbWU7CisgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiY3VycmVudCBwb3NpdGlvbjogJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICIsIHN0cmVhbSBlbmQ6ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoZGVtdXgtPnNlZ21lbnQucG9zaXRpb24pLCBHU1RfVElNRV9BUkdTIChlbmRfdGltZSkpOworICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZW5kX3RpbWUpCisgICAgICAgICYmIChlbmRfdGltZSArIDIgKiBHU1RfU0VDT05EIDwgZGVtdXgtPnNlZ21lbnQucG9zaXRpb24pKSB7CisgICAgICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAic2VuZGluZyBFT1MgZm9yIHN0cmVhbSAlcyIsCisgICAgICAgICAgR1NUX1BBRF9OQU1FIChzdHJlYW0tPnBhZCkpOworICAgICAgc3RyZWFtLT5zZW50X2VvcyA9IFRSVUU7CisgICAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfZW9zICgpOworICAgICAgaWYgKGRlbXV4LT5zZWdtZW50X3NlcW51bSAhPSBHU1RfU0VRTlVNX0lOVkFMSUQpCisgICAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChldmVudCwgZGVtdXgtPnNlZ21lbnRfc2VxbnVtKTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3RyZWFtLT5wYWQsIGV2ZW50KTsKKyAgICB9CisgIH0KK30KKworLyogRU9TIGFuZCBOT1RfTElOS0VEIG5lZWQgdG8gYmUgY29tYmluZWQuIFRoaXMgbWVhbnMgdGhhdCB3ZSByZXR1cm46CisgKgorICogIEdTVF9GTE9XX05PVF9MSU5LRUQ6IHdoZW4gYWxsIHBhZHMgTk9UX0xJTktFRC4KKyAqICBHU1RfRkxPV19FT1M6IHdoZW4gYWxsIHBhZHMgRU9TIG9yIE5PVF9MSU5LRUQuCisgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcXRkZW11eF9jb21iaW5lX2Zsb3dzIChHc3RRVERlbXV4ICogZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0sCisgICAgR3N0Rmxvd1JldHVybiByZXQpCit7CisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgImZsb3cgcmV0dXJuOiAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKworICBpZiAoc3RyZWFtLT5wYWQpCisgICAgcmV0ID0gZ3N0X2Zsb3dfY29tYmluZXJfdXBkYXRlX3BhZF9mbG93IChkZW11eC0+Zmxvd2NvbWJpbmVyLCBzdHJlYW0tPnBhZCwKKyAgICAgICAgcmV0KTsKKyAgZWxzZQorICAgIHJldCA9IGdzdF9mbG93X2NvbWJpbmVyX3VwZGF0ZV9mbG93IChkZW11eC0+Zmxvd2NvbWJpbmVyLCByZXQpOworCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgImNvbWJpbmVkIGZsb3cgcmV0dXJuOiAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgcmV0dXJuIHJldDsKK30KKworLyogdGhlIGlucHV0IGJ1ZmZlciBtZXRhZGF0YSBtdXN0IGJlIHdyaXRhYmxlLiBSZXR1cm5zIE5VTEwgd2hlbiB0aGUgYnVmZmVyIGlzCisgKiBjb21wbGV0ZWx5IGNsaXBwZWQKKyAqCisgKiBTaG91bGQgYmUgdXNlZCBvbmx5IHdpdGggcmF3IGJ1ZmZlcnMgKi8KK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3F0ZGVtdXhfY2xpcF9idWZmZXIgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBRdERlbXV4U3RyZWFtICogc3RyZWFtLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgZ3VpbnQ2NCBzdGFydCwgc3RvcCwgY3N0YXJ0LCBjc3RvcCwgZGlmZjsKKyAgR3N0Q2xvY2tUaW1lIHB0cywgZHVyYXRpb247CisgIGdzaXplIHNpemUsIG9zaXplOworICBnaW50IG51bV9yYXRlLCBkZW5vbV9yYXRlOworICBnaW50IGZyYW1lX3NpemU7CisgIGdib29sZWFuIGNsaXBfZGF0YTsKKyAgZ3VpbnQgb2Zmc2V0OworCisgIG9zaXplID0gc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisgIG9mZnNldCA9IDA7CisKKyAgLyogZGVwZW5kaW5nIG9uIHRoZSB0eXBlLCBzZXR1cCB0aGUgY2xpcCBwYXJhbWV0ZXJzICovCisgIGlmIChzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3NvdW4pIHsKKyAgICBmcmFtZV9zaXplID0gQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Ynl0ZXNfcGVyX2ZyYW1lOworICAgIG51bV9yYXRlID0gR1NUX1NFQ09ORDsKKyAgICBkZW5vbV9yYXRlID0gKGdpbnQpIENVUl9TVFJFQU0gKHN0cmVhbSktPnJhdGU7CisgICAgY2xpcF9kYXRhID0gVFJVRTsKKyAgfSBlbHNlIGlmIChzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3ZpZGUpIHsKKyAgICBmcmFtZV9zaXplID0gc2l6ZTsKKyAgICBudW1fcmF0ZSA9IENVUl9TVFJFQU0gKHN0cmVhbSktPmZwc19uOworICAgIGRlbm9tX3JhdGUgPSBDVVJfU1RSRUFNIChzdHJlYW0pLT5mcHNfZDsKKyAgICBjbGlwX2RhdGEgPSBGQUxTRTsKKyAgfSBlbHNlCisgICAgZ290byB3cm9uZ190eXBlOworCisgIGlmIChmcmFtZV9zaXplIDw9IDApCisgICAgZ290byBiYWRfZnJhbWVfc2l6ZTsKKworICAvKiB3ZSBjYW4gb25seSBjbGlwIGlmIHdlIGhhdmUgYSB2YWxpZCBwdHMgKi8KKyAgcHRzID0gR1NUX0JVRkZFUl9QVFMgKGJ1Zik7CisgIGlmIChHX1VOTElLRUxZICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHB0cykpKQorICAgIGdvdG8gbm9fcHRzOworCisgIGR1cmF0aW9uID0gR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKTsKKworICBpZiAoR19VTkxJS0VMWSAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChkdXJhdGlvbikpKSB7CisgICAgZHVyYXRpb24gPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChzaXplIC8gZnJhbWVfc2l6ZSwgbnVtX3JhdGUsIGRlbm9tX3JhdGUpOworICB9CisKKyAgc3RhcnQgPSBwdHM7CisgIHN0b3AgPSBzdGFydCArIGR1cmF0aW9uOworCisgIGlmIChHX1VOTElLRUxZICghZ3N0X3NlZ21lbnRfY2xpcCAoJnN0cmVhbS0+c2VnbWVudCwKKyAgICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBzdGFydCwgc3RvcCwgJmNzdGFydCwgJmNzdG9wKSkpCisgICAgZ290byBjbGlwcGVkOworCisgIC8qIHNlZSBpZiBzb21lIGNsaXBwaW5nIGhhcHBlbmVkICovCisgIGRpZmYgPSBjc3RhcnQgLSBzdGFydDsKKyAgaWYgKGRpZmYgPiAwKSB7CisgICAgcHRzICs9IGRpZmY7CisgICAgZHVyYXRpb24gLT0gZGlmZjsKKworICAgIGlmIChjbGlwX2RhdGEpIHsKKyAgICAgIC8qIGJyaW5nIGNsaXBwZWQgdGltZSB0byBzYW1wbGVzIGFuZCB0byBieXRlcyAqLworICAgICAgZGlmZiA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKGRpZmYsIGRlbm9tX3JhdGUsIG51bV9yYXRlKTsKKyAgICAgIGRpZmYgKj0gZnJhbWVfc2l6ZTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAiY2xpcHBpbmcgc3RhcnQgdG8gJSIgR1NUX1RJTUVfRk9STUFUICIgJSIKKyAgICAgICAgICBHX0dVSU5UNjRfRk9STUFUICIgYnl0ZXMiLCBHU1RfVElNRV9BUkdTIChjc3RhcnQpLCBkaWZmKTsKKworICAgICAgb2Zmc2V0ID0gZGlmZjsKKyAgICAgIHNpemUgLT0gZGlmZjsKKyAgICB9CisgIH0KKyAgZGlmZiA9IHN0b3AgLSBjc3RvcDsKKyAgaWYgKGRpZmYgPiAwKSB7CisgICAgZHVyYXRpb24gLT0gZGlmZjsKKworICAgIGlmIChjbGlwX2RhdGEpIHsKKyAgICAgIC8qIGJyaW5nIGNsaXBwZWQgdGltZSB0byBzYW1wbGVzIGFuZCB0aGVuIHRvIGJ5dGVzICovCisgICAgICBkaWZmID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoZGlmZiwgZGVub21fcmF0ZSwgbnVtX3JhdGUpOworICAgICAgZGlmZiAqPSBmcmFtZV9zaXplOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAiY2xpcHBpbmcgc3RvcCB0byAlIiBHU1RfVElNRV9GT1JNQVQgIiAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgIiBieXRlcyIsIEdTVF9USU1FX0FSR1MgKGNzdG9wKSwgZGlmZik7CisgICAgICBzaXplIC09IGRpZmY7CisgICAgfQorICB9CisKKyAgaWYgKG9mZnNldCAhPSAwIHx8IHNpemUgIT0gb3NpemUpCisgICAgZ3N0X2J1ZmZlcl9yZXNpemUgKGJ1Ziwgb2Zmc2V0LCBzaXplKTsKKworICBHU1RfQlVGRkVSX0RUUyAoYnVmKSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIEdTVF9CVUZGRVJfUFRTIChidWYpID0gcHRzOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpID0gZHVyYXRpb247CisKKyAgcmV0dXJuIGJ1ZjsKKworICAvKiBkcm9wcGVkIGJ1ZmZlciAqLword3JvbmdfdHlwZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJ1bmtub3duIHN0cmVhbSB0eXBlIik7CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorYmFkX2ZyYW1lX3NpemU6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiYmFkIGZyYW1lIHNpemUiKTsKKyAgICByZXR1cm4gYnVmOworICB9Citub19wdHM6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAibm8gcHRzIG9uIGJ1ZmZlciIpOworICAgIHJldHVybiBidWY7CisgIH0KK2NsaXBwZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiY2xpcHBlZCBidWZmZXIiKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3F0ZGVtdXhfYWxpZ25fYnVmZmVyIChHc3RRVERlbXV4ICogZGVtdXgsCisgICAgR3N0QnVmZmVyICogYnVmZmVyLCBnc2l6ZSBhbGlnbm1lbnQpCit7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgaWYgKG1hcC5zaXplIDwgc2l6ZW9mIChndWludHB0cikpIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgIHJldHVybiBidWZmZXI7CisgIH0KKworICBpZiAoKChndWludHB0cikgbWFwLmRhdGEpICYgKGFsaWdubWVudCAtIDEpKSB7CisgICAgR3N0QnVmZmVyICpuZXdfYnVmZmVyOworICAgIEdzdEFsbG9jYXRpb25QYXJhbXMgcGFyYW1zID0geyAwLCBhbGlnbm1lbnQgLSAxLCAwLCAwLCB9OworCisgICAgbmV3X2J1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLAorICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpLCAmcGFyYW1zKTsKKworICAgIC8qIENvcHkgZGF0YSAiYnkgaGFuZCIsIHNvIGVuc3VyZSBhbGlnbm1lbnQgaXMga2VwdDogKi8KKyAgICBnc3RfYnVmZmVyX2ZpbGwgKG5ld19idWZmZXIsIDAsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisKKyAgICBnc3RfYnVmZmVyX2NvcHlfaW50byAobmV3X2J1ZmZlciwgYnVmZmVyLCBHU1RfQlVGRkVSX0NPUFlfTUVUQURBVEEsIDAsIC0xKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgIldlIHdhbnQgb3V0cHV0IGFsaWduZWQgb24gJSIgR19HU0laRV9GT1JNQVQgIiwgcmVhbGxvY2F0ZWQiLAorICAgICAgICBhbGlnbm1lbnQpOworCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgICAgcmV0dXJuIG5ld19idWZmZXI7CisgIH0KKworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICByZXR1cm4gYnVmZmVyOworfQorCisvKiB0aGUgaW5wdXQgYnVmZmVyIG1ldGFkYXRhIG11c3QgYmUgd3JpdGFibGUsCisgKiBidXQgdGltZS9kdXJhdGlvbiBldGMgbm90IHlldCBzZXQgYW5kIG5lZWQgbm90IGJlIHByZXNlcnZlZCAqLworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcXRkZW11eF9wcm9jZXNzX2J1ZmZlciAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0sCisgICAgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQgbnNpemUgPSAwOworICBnY2hhciAqc3RyOworCisgIC8qIG5vdCBtYW55IGNhc2VzIGZvciBub3cgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKENVUl9TVFJFQU0gKHN0cmVhbSktPmZvdXJjYyA9PSBGT1VSQ0NfbXA0cykpIHsKKyAgICAvKiBzZW5kIGEgb25lIHRpbWUgZHZkIGNsdXQgZXZlbnQgKi8KKyAgICBpZiAoc3RyZWFtLT5wZW5kaW5nX2V2ZW50ICYmIHN0cmVhbS0+cGFkKQorICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzdHJlYW0tPnBhZCwgc3RyZWFtLT5wZW5kaW5nX2V2ZW50KTsKKyAgICBzdHJlYW0tPnBlbmRpbmdfZXZlbnQgPSBOVUxMOworICB9CisKKyAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbS0+c3VidHlwZSAhPSBGT1VSQ0NfdGV4dAorICAgICAgICAgICYmIHN0cmVhbS0+c3VidHlwZSAhPSBGT1VSQ0Nfc2J0bCAmJgorICAgICAgICAgIHN0cmVhbS0+c3VidHlwZSAhPSBGT1VSQ0Nfc3VicCkpIHsKKyAgICByZXR1cm4gYnVmOworICB9CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICAvKiBlbXB0eSBidWZmZXIgaXMgc2VudCB0byB0ZXJtaW5hdGUgcHJldmlvdXMgc3VidGl0bGUgKi8KKyAgaWYgKG1hcC5zaXplIDw9IDIpIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0Nfc3VicCkgeworICAgIC8qIFRoYXQncyBhbGwgdGhlIHByb2Nlc3NpbmcgbmVlZGVkIGZvciBzdWJwaWN0dXJlcyAqLworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorCisgIG5zaXplID0gR1NUX1JFQURfVUlOVDE2X0JFIChtYXAuZGF0YSk7CisgIG5zaXplID0gTUlOIChuc2l6ZSwgbWFwLnNpemUgLSAyKTsKKworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIjNHUFAgdGltZWQgdGV4dCBzdWJ0aXRsZTogJWQvJSIgR19HU0laRV9GT1JNQVQgIiIsCisgICAgICBuc2l6ZSwgbWFwLnNpemUpOworCisgIC8qIHRha2VzIGNhcmUgb2YgVVRGLTggdmFsaWRhdGlvbiBvciBVVEYtMTYgcmVjb2duaXRpb24sCisgICAqIG5vIG90aGVyIGVuY29kaW5nIGV4cGVjdGVkICovCisgIHN0ciA9IGdzdF90YWdfZnJlZWZvcm1fc3RyaW5nX3RvX3V0ZjggKChnY2hhciAqKSBtYXAuZGF0YSArIDIsIG5zaXplLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgaWYgKHN0cikgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgYnVmID0gX2dzdF9idWZmZXJfbmV3X3dyYXBwZWQgKHN0ciwgc3RybGVuIChzdHIpLCBnX2ZyZWUpOworICB9IGVsc2UgeworICAgIC8qIHRoaXMgc2hvdWxkIG5vdCByZWFsbHkgaGFwcGVuIHVubGVzcyB0aGUgc3VidGl0bGUgaXMgY29ycnVwdGVkICovCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICBidWYgPSBOVUxMOworICB9CisKKyAgLyogRklYTUUgPyBjb252ZXJ0IG9wdGlvbmFsIHN1YnNlcXVlbnQgc3R5bGUgaW5mbyB0byBtYXJrdXAgKi8KKworICByZXR1cm4gYnVmOworfQorCisvKiBTZXRzIGEgYnVmZmVyJ3MgYXR0cmlidXRlcyBwcm9wZXJseSBhbmQgcHVzaGVzIGl0IGRvd25zdHJlYW0uCisgKiBBbHNvIGNoZWNrcyBmb3IgYWRkaXRpb25hbCBhY3Rpb25zIGFuZCBjdXN0b20gcHJvY2Vzc2luZyB0aGF0IG1heQorICogbmVlZCB0byBiZSBkb25lIGZpcnN0LgorICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3F0ZGVtdXhfZGVjb3JhdGVfYW5kX3B1c2hfYnVmZmVyIChHc3RRVERlbXV4ICogcXRkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtLCBHc3RCdWZmZXIgKiBidWYsCisgICAgR3N0Q2xvY2tUaW1lIGR0cywgR3N0Q2xvY2tUaW1lIHB0cywgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uLAorICAgIGdib29sZWFuIGtleWZyYW1lLCBHc3RDbG9ja1RpbWUgcG9zaXRpb24sIGd1aW50NjQgYnl0ZV9wb3NpdGlvbikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKworICAvKiBvZmZzZXQgdGhlIHRpbWVzdGFtcHMgYWNjb3JkaW5nIHRvIHRoZSBlZGl0IGxpc3QgKi8KKworICBpZiAoR19VTkxJS0VMWSAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Zm91cmNjID09IEZPVVJDQ19ydHNwKSkgeworICAgIGdjaGFyICp1cmw7CisgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIHVybCA9IGdfc3RybmR1cCAoKGdjaGFyICopIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICBpZiAodXJsICE9IE5VTEwgJiYgc3RybGVuICh1cmwpICE9IDApIHsKKyAgICAgIC8qIHdlIGhhdmUgUlRTUCByZWRpcmVjdCBub3cgKi8KKyAgICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAocXRkZW11eCksCisgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2VsZW1lbnQgKEdTVF9PQkpFQ1RfQ0FTVCAocXRkZW11eCksCisgICAgICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgicmVkaXJlY3QiLAorICAgICAgICAgICAgICAgICAgIm5ldy1sb2NhdGlvbiIsIEdfVFlQRV9TVFJJTkcsIHVybCwgTlVMTCkpKTsKKyAgICAgIHF0ZGVtdXgtPnBvc3RlZF9yZWRpcmVjdCA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIlJlZGlyZWN0IFVSSSBvZiBzdHJlYW0gaXMgZW1wdHksIG5vdCAiCisgICAgICAgICAgInBvc3RpbmciKTsKKyAgICB9CisgICAgZ19mcmVlICh1cmwpOworICB9CisKKyAgLyogcG9zaXRpb24gcmVwb3J0aW5nICovCisgIGlmIChxdGRlbXV4LT5zZWdtZW50LnJhdGUgPj0gMCkgeworICAgIHF0ZGVtdXgtPnNlZ21lbnQucG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICBnc3RfcXRkZW11eF9zeW5jX3N0cmVhbXMgKHF0ZGVtdXgpOworICB9CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFzdHJlYW0tPnBhZCkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiTm8gb3V0cHV0IHBhZCBmb3Igc3RyZWFtLCBpZ25vcmluZyIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgZ290byBleGl0OworICB9CisKKyAgLyogc2VuZCBvdXQgcGVuZGluZyBidWZmZXJzICovCisgIHdoaWxlIChzdHJlYW0tPmJ1ZmZlcnMpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZmZlciA9IChHc3RCdWZmZXIgKikgc3RyZWFtLT5idWZmZXJzLT5kYXRhOworCisgICAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbS0+ZGlzY29udCkpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAibWFya2luZyBkaXNjb250IGJ1ZmZlciIpOworICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmZmVyLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgICBzdHJlYW0tPmRpc2NvbnQgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICB9CisKKyAgICBpZiAoc3RyZWFtLT5hbGlnbm1lbnQgPiAxKQorICAgICAgYnVmZmVyID0gZ3N0X3F0ZGVtdXhfYWxpZ25fYnVmZmVyIChxdGRlbXV4LCBidWZmZXIsIHN0cmVhbS0+YWxpZ25tZW50KTsKKyAgICBnc3RfcGFkX3B1c2ggKHN0cmVhbS0+cGFkLCBidWZmZXIpOworCisgICAgc3RyZWFtLT5idWZmZXJzID0gZ19zbGlzdF9kZWxldGVfbGluayAoc3RyZWFtLT5idWZmZXJzLCBzdHJlYW0tPmJ1ZmZlcnMpOworICB9CisKKyAgLyogd2UncmUgZ29pbmcgdG8gbW9kaWZ5IHRoZSBtZXRhZGF0YSAqLworICBidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKGJ1Zik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbS0+bmVlZF9wcm9jZXNzKSkKKyAgICBidWYgPSBnc3RfcXRkZW11eF9wcm9jZXNzX2J1ZmZlciAocXRkZW11eCwgc3RyZWFtLCBidWYpOworCisgIGlmICghYnVmKSB7CisgICAgZ290byBleGl0OworICB9CisKKyAgR1NUX0JVRkZFUl9EVFMgKGJ1ZikgPSBkdHM7CisgIEdTVF9CVUZGRVJfUFRTIChidWYpID0gcHRzOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpID0gZHVyYXRpb247CisgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpID0gLTE7CisgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmKSA9IC0xOworCisgIGlmIChHX1VOTElLRUxZIChDVVJfU1RSRUFNIChzdHJlYW0pLT5yZ2I4X3BhbGV0dGUpKQorICAgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAoYnVmLAorICAgICAgICBnc3RfbWVtb3J5X3JlZiAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cmdiOF9wYWxldHRlKSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKENVUl9TVFJFQU0gKHN0cmVhbSktPnBhZGRpbmcpKSB7CisgICAgZ3N0X2J1ZmZlcl9yZXNpemUgKGJ1ZiwgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cGFkZGluZywgLTEpOworICB9CisjaWYgMAorICBpZiAoR19VTkxJS0VMWSAocXRkZW11eC0+ZWxlbWVudF9pbmRleCkpIHsKKyAgICBHc3RDbG9ja1RpbWUgc3RyZWFtX3RpbWU7CisKKyAgICBzdHJlYW1fdGltZSA9CisgICAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmc3RyZWFtLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgIHRpbWVzdGFtcCk7CisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdHJlYW1fdGltZSkpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICJhZGRpbmcgYXNzb2NpYXRpb24gJSIgR1NUX1RJTUVfRk9STUFUICItPiAlIgorICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHN0cmVhbV90aW1lKSwgYnl0ZV9wb3NpdGlvbik7CisgICAgICBnc3RfaW5kZXhfYWRkX2Fzc29jaWF0aW9uIChxdGRlbXV4LT5lbGVtZW50X2luZGV4LAorICAgICAgICAgIHF0ZGVtdXgtPmluZGV4X2lkLAorICAgICAgICAgIGtleWZyYW1lID8gR1NUX0FTU09DSUFUSU9OX0ZMQUdfS0VZX1VOSVQgOgorICAgICAgICAgIEdTVF9BU1NPQ0lBVElPTl9GTEFHX0RFTFRBX1VOSVQsIEdTVF9GT1JNQVRfVElNRSwgc3RyZWFtX3RpbWUsCisgICAgICAgICAgR1NUX0ZPUk1BVF9CWVRFUywgYnl0ZV9wb3NpdGlvbiwgTlVMTCk7CisgICAgfQorICB9CisjZW5kaWYKKworICBpZiAoc3RyZWFtLT5uZWVkX2NsaXApCisgICAgYnVmID0gZ3N0X3F0ZGVtdXhfY2xpcF9idWZmZXIgKHF0ZGVtdXgsIHN0cmVhbSwgYnVmKTsKKworICBpZiAoR19VTkxJS0VMWSAoYnVmID09IE5VTEwpKQorICAgIGdvdG8gZXhpdDsKKworICBpZiAoR19VTkxJS0VMWSAoc3RyZWFtLT5kaXNjb250KSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAibWFya2luZyBkaXNjb250IGJ1ZmZlciIpOworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgIHN0cmVhbS0+ZGlzY29udCA9IEZBTFNFOworICB9IGVsc2UgeworICAgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgIH0KKworICBpZiAoIWtleWZyYW1lKSB7CisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgICAgc3RyZWFtLT5vbl9rZXlmcmFtZSA9IEZBTFNFOworICB9IGVsc2UgeworICAgIHN0cmVhbS0+b25fa2V5ZnJhbWUgPSBUUlVFOworICB9CisKKworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICJQdXNoaW5nIGJ1ZmZlciB3aXRoIGR0cyAlIiBHU1RfVElNRV9GT1JNQVQgIiwgcHRzICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiwgZHVyYXRpb24gJSIgR1NUX1RJTUVfRk9STUFUICIgb24gcGFkICVzIiwgR1NUX1RJTUVfQVJHUyAoZHRzKSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHB0cyksIEdTVF9USU1FX0FSR1MgKGR1cmF0aW9uKSwKKyAgICAgIEdTVF9QQURfTkFNRSAoc3RyZWFtLT5wYWQpKTsKKworICBpZiAoc3RyZWFtLT5wcm90ZWN0ZWQgJiYgc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV90eXBlID09IEZPVVJDQ19jZW5jKSB7CisgICAgR3N0U3RydWN0dXJlICpjcnlwdG9faW5mbzsKKyAgICBRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8gKmluZm8gPQorICAgICAgICAoUXREZW11eENlbmNTYW1wbGVTZXRJbmZvICopIHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfaW5mbzsKKyAgICBnaW50IGluZGV4OworICAgIEdzdEV2ZW50ICpldmVudDsKKworICAgIHdoaWxlICgoZXZlbnQgPSBnX3F1ZXVlX3BvcF9oZWFkICgmc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV9ldmVudF9xdWV1ZSkpKSB7CisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHN0cmVhbS0+cGFkLCBldmVudCk7CisgICAgfQorCisgICAgaWYgKGluZm8tPmNyeXB0b19pbmZvID09IE5VTEwpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJjZW5jIG1ldGFkYXRhIGhhc24ndCBiZWVuIHBhcnNlZCB5ZXQiKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgLyogVGhlIGVuZCBvZiB0aGUgY3J5cHRvX2luZm8gYXJyYXkgbWF0Y2hlcyBvdXIgbl9zYW1wbGVzIHBvc2l0aW9uLAorICAgICAqIHNvIGNvdW50IGJhY2t3YXJkIGZyb20gdGhlcmUgKi8KKyAgICBpbmRleCA9IHN0cmVhbS0+c2FtcGxlX2luZGV4IC0gc3RyZWFtLT5uX3NhbXBsZXMgKyBpbmZvLT5jcnlwdG9faW5mby0+bGVuOworICAgIGlmIChHX0xJS0VMWSAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGluZm8tPmNyeXB0b19pbmZvLT5sZW4pKSB7CisgICAgICAvKiBzdGVhbCBzdHJ1Y3R1cmUgZnJvbSBhcnJheSAqLworICAgICAgY3J5cHRvX2luZm8gPSBnX3B0cl9hcnJheV9pbmRleCAoaW5mby0+Y3J5cHRvX2luZm8sIGluZGV4KTsKKyAgICAgIGdfcHRyX2FycmF5X2luZGV4IChpbmZvLT5jcnlwdG9faW5mbywgaW5kZXgpID0gTlVMTDsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiYXR0YWNoaW5nIGNlbmMgbWV0YWRhdGEgWyV1LyV1XSIsIGluZGV4LAorICAgICAgICAgIGluZm8tPmNyeXB0b19pbmZvLT5sZW4pOworICAgICAgaWYgKCFjcnlwdG9faW5mbyB8fCAhZ3N0X2J1ZmZlcl9hZGRfcHJvdGVjdGlvbl9tZXRhIChidWYsIGNyeXB0b19pbmZvKSkKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwgImZhaWxlZCB0byBhdHRhY2ggY2VuYyBtZXRhZGF0YSB0byBidWZmZXIiKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0lORk9fT0JKRUNUIChxdGRlbXV4LCAiTm8gY3J5cHRvIGluZm8gd2l0aCBpbmRleCAlZCBhbmQgc2FtcGxlICVkIiwKKyAgICAgICAgICBpbmRleCwgc3RyZWFtLT5zYW1wbGVfaW5kZXgpOworICAgIH0KKyAgfQorCisgIGlmIChzdHJlYW0tPmFsaWdubWVudCA+IDEpCisgICAgYnVmID0gZ3N0X3F0ZGVtdXhfYWxpZ25fYnVmZmVyIChxdGRlbXV4LCBidWYsIHN0cmVhbS0+YWxpZ25tZW50KTsKKworICByZXQgPSBnc3RfcGFkX3B1c2ggKHN0cmVhbS0+cGFkLCBidWYpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAocHRzKSAmJiBHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZHVyYXRpb24pKSB7CisgICAgLyogbWFyayBwb3NpdGlvbiBpbiBzdHJlYW0sIHdlJ2xsIG5lZWQgdGhpcyB0byBrbm93IHdoZW4gdG8gc2VuZCBHQVAgZXZlbnQgKi8KKyAgICBzdHJlYW0tPnNlZ21lbnQucG9zaXRpb24gPSBwdHMgKyBkdXJhdGlvbjsKKyAgfQorCitleGl0OgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgUXREZW11eFJhbmRvbUFjY2Vzc0VudHJ5ICoKK2dzdF9xdGRlbXV4X3N0cmVhbV9zZWVrX2ZyYWdtZW50IChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwKKyAgICBHc3RDbG9ja1RpbWUgcG9zLCBnYm9vbGVhbiBhZnRlcikKK3sKKyAgUXREZW11eFJhbmRvbUFjY2Vzc0VudHJ5ICplbnRyaWVzID0gc3RyZWFtLT5yYV9lbnRyaWVzOworICBndWludCBuX2VudHJpZXMgPSBzdHJlYW0tPm5fcmFfZW50cmllczsKKyAgZ3VpbnQgaTsKKworICAvKiB3ZSBhc3N1bWUgdGhlIHRhYmxlIGlzIHNvcnRlZCAqLworICBmb3IgKGkgPSAwOyBpIDwgbl9lbnRyaWVzOyArK2kpIHsKKyAgICBpZiAoZW50cmllc1tpXS50cyA+IHBvcykKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRklYTUU6IG1heWJlIHNhdmUgZmlyc3QgbW9vZl9vZmZzZXQgc29tZXdoZXJlIGluc3RlYWQsIGJ1dCBmb3Igbm93IGl0J3MKKyAgICogcHJvYmFibHkgb2theSB0byBhc3N1bWUgdGhhdCB0aGUgaW5kZXggbGlzdHMgdGhlIHZlcnkgZmlyc3QgZnJhZ21lbnQgKi8KKyAgaWYgKGkgPT0gMCkKKyAgICByZXR1cm4gJmVudHJpZXNbMF07CisKKyAgaWYgKGFmdGVyKQorICAgIHJldHVybiAmZW50cmllc1tpXTsKKyAgZWxzZQorICAgIHJldHVybiAmZW50cmllc1tpIC0gMV07Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3F0ZGVtdXhfZG9fZnJhZ21lbnRlZF9zZWVrIChHc3RRVERlbXV4ICogcXRkZW11eCkKK3sKKyAgY29uc3QgUXREZW11eFJhbmRvbUFjY2Vzc0VudHJ5ICpiZXN0X2VudHJ5ID0gTlVMTDsKKyAgZ3VpbnQgaTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHF0ZGVtdXgpOworCisgIGdfYXNzZXJ0IChxdGRlbXV4LT5uX3N0cmVhbXMgPiAwKTsKKworICAvKiBmaXJzdCBzZWUgaWYgd2UgY2FuIGRldGVybWluZSB3aGVyZSB0byBnbyB0byB1c2luZyBtZnJhLAorICAgKiBiZWZvcmUgd2Ugc3RhcnQgY2xlYXJpbmcgdGhpbmdzICovCisgIGZvciAoaSA9IDA7IGkgPCBxdGRlbXV4LT5uX3N0cmVhbXM7IGkrKykgeworICAgIGNvbnN0IFF0RGVtdXhSYW5kb21BY2Nlc3NFbnRyeSAqZW50cnk7CisgICAgUXREZW11eFN0cmVhbSAqc3RyZWFtOworICAgIGdib29sZWFuIGlzX2F1ZGlvX29yX3ZpZGVvOworCisgICAgc3RyZWFtID0gcXRkZW11eC0+c3RyZWFtc1tpXTsKKworICAgIGlmIChzdHJlYW0tPnJhX2VudHJpZXMgPT0gTlVMTCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0NfdmlkZSB8fCBzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3NvdW4pCisgICAgICBpc19hdWRpb19vcl92aWRlbyA9IFRSVUU7CisgICAgZWxzZQorICAgICAgaXNfYXVkaW9fb3JfdmlkZW8gPSBGQUxTRTsKKworICAgIGVudHJ5ID0KKyAgICAgICAgZ3N0X3F0ZGVtdXhfc3RyZWFtX3NlZWtfZnJhZ21lbnQgKHF0ZGVtdXgsIHN0cmVhbSwKKyAgICAgICAgc3RyZWFtLT50aW1lX3Bvc2l0aW9uLCAhaXNfYXVkaW9fb3JfdmlkZW8pOworCisgICAgR1NUX0lORk9fT0JKRUNUIChzdHJlYW0tPnBhZCwgIiUiIEdTVF9USU1FX0ZPUk1BVCAiIGF0IG9mZnNldCAiCisgICAgICAgICIlIiBHX0dVSU5UNjRfRk9STUFULCBHU1RfVElNRV9BUkdTIChlbnRyeS0+dHMpLCBlbnRyeS0+bW9vZl9vZmZzZXQpOworCisgICAgc3RyZWFtLT5wZW5kaW5nX3NlZWsgPSBlbnRyeTsKKworICAgIC8qIGRlY2lkZSBwb3NpdGlvbiB0byBqdW1wIHRvIGp1c3QgYmFzZWQgb24gYXVkaW8vdmlkZW8gdHJhY2tzLCBub3Qgc3VicyAqLworICAgIGlmICghaXNfYXVkaW9fb3JfdmlkZW8pCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChiZXN0X2VudHJ5ID09IE5VTEwgfHwgZW50cnktPm1vb2Zfb2Zmc2V0IDwgYmVzdF9lbnRyeS0+bW9vZl9vZmZzZXQpCisgICAgICBiZXN0X2VudHJ5ID0gZW50cnk7CisgIH0KKworICAvKiBubyBsdWNrLCB3aWxsIGhhbmRsZSBzZWVrIG90aGVyd2lzZSAqLworICBpZiAoYmVzdF9lbnRyeSA9PSBOVUxMKSB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0ZGVtdXgpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIG9rLCBub3cgd2UgY2FuIHByZXBhcmUgZm9yIHByb2Nlc3NpbmcgYXMgb2YgbG9jYXRlZCBtb29mICovCisgIGZvciAoaSA9IDA7IGkgPCBxdGRlbXV4LT5uX3N0cmVhbXM7IGkrKykgeworICAgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbTsKKworICAgIHN0cmVhbSA9IHF0ZGVtdXgtPnN0cmVhbXNbaV07CisKKyAgICBnX2ZyZWUgKHN0cmVhbS0+c2FtcGxlcyk7CisgICAgc3RyZWFtLT5zYW1wbGVzID0gTlVMTDsKKyAgICBzdHJlYW0tPm5fc2FtcGxlcyA9IDA7CisgICAgc3RyZWFtLT5zdGJsX2luZGV4ID0gLTE7ICAgIC8qIG5vIHNhbXBsZXMgaGF2ZSB5ZXQgYmVlbiBwYXJzZWQgKi8KKyAgICBzdHJlYW0tPnNhbXBsZV9pbmRleCA9IC0xOworCisgICAgaWYgKHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfaW5mbykgeworICAgICAgLyogQ2xlYXIgb3V0IGFueSBvbGQgY2VuYyBjcnlwdG8gaW5mbyBlbnRyaWVzIGFzIHdlJ2xsIG1vdmUgdG8gYSBuZXcgbW9vZiAqLworICAgICAgaWYgKHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfdHlwZSA9PSBGT1VSQ0NfY2VuYykgeworICAgICAgICBRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8gKmluZm8gPQorICAgICAgICAgICAgKFF0RGVtdXhDZW5jU2FtcGxlU2V0SW5mbyAqKSBzdHJlYW0tPnByb3RlY3Rpb25fc2NoZW1lX2luZm87CisgICAgICAgIGlmIChpbmZvLT5jcnlwdG9faW5mbykgeworICAgICAgICAgIGdfcHRyX2FycmF5X2ZyZWUgKGluZm8tPmNyeXB0b19pbmZvLCBUUlVFKTsKKyAgICAgICAgICBpbmZvLT5jcnlwdG9faW5mbyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsICJzZWVrIHRvICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBiZXN0IGZyYWdtZW50ICIKKyAgICAgICJtb29mIG9mZnNldDogJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCB0cyAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChxdGRlbXV4LT5zdHJlYW1zWzBdLT50aW1lX3Bvc2l0aW9uKSwKKyAgICAgIGJlc3RfZW50cnktPm1vb2Zfb2Zmc2V0LCBHU1RfVElNRV9BUkdTIChiZXN0X2VudHJ5LT50cykpOworCisgIHF0ZGVtdXgtPm1vb2Zfb2Zmc2V0ID0gYmVzdF9lbnRyeS0+bW9vZl9vZmZzZXQ7CisKKyAgcXRkZW11eF9hZGRfZnJhZ21lbnRlZF9zYW1wbGVzIChxdGRlbXV4KTsKKworICBHU1RfT0JKRUNUX1VOTE9DSyAocXRkZW11eCk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9tb3ZpZSAoR3N0UVREZW11eCAqIHF0ZGVtdXgpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdEJ1ZmZlciAqYnVmID0gTlVMTDsKKyAgUXREZW11eFN0cmVhbSAqc3RyZWFtOworICBHc3RDbG9ja1RpbWUgbWluX3RpbWU7CisgIGd1aW50NjQgb2Zmc2V0ID0gMDsKKyAgR3N0Q2xvY2tUaW1lIGR0cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIEdzdENsb2NrVGltZSBwdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBHc3RDbG9ja1RpbWUgZHVyYXRpb24gPSAwOworICBnYm9vbGVhbiBrZXlmcmFtZSA9IEZBTFNFOworICBndWludCBzYW1wbGVfc2l6ZSA9IDA7CisgIGdib29sZWFuIGVtcHR5ID0gMDsKKyAgZ3VpbnQgc2l6ZTsKKyAgZ2ludCBpbmRleDsKKyAgZ2ludCBpOworCisgIGdzdF9xdGRlbXV4X3B1c2hfcGVuZGluZ19uZXdzZWdtZW50IChxdGRlbXV4KTsKKworICBpZiAocXRkZW11eC0+ZnJhZ21lbnRlZF9zZWVrX3BlbmRpbmcpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsICJwZW5kaW5nIGZyYWdtZW50ZWQgc2VlayIpOworICAgIGlmIChnc3RfcXRkZW11eF9kb19mcmFnbWVudGVkX3NlZWsgKHF0ZGVtdXgpKSB7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsICJmcmFnbWVudGVkIHNlZWsgZG9uZSEiKTsKKyAgICAgIHF0ZGVtdXgtPmZyYWdtZW50ZWRfc2Vla19wZW5kaW5nID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAocXRkZW11eCwgImZyYWdtZW50ZWQgc2VlayBzdGlsbCBwZW5kaW5nIik7CisgICAgfQorICB9CisKKyAgLyogRmlndXJlIG91dCB0aGUgbmV4dCBzdHJlYW0gc2FtcGxlIHRvIG91dHB1dCwgbWluX3RpbWUgaXMgZXhwcmVzc2VkIGluCisgICAqIGdsb2JhbCB0aW1lIGFuZCBydW5zIG92ZXIgdGhlIGVkaXQgbGlzdCBzZWdtZW50cy4gKi8KKyAgbWluX3RpbWUgPSBHX01BWFVJTlQ2NDsKKyAgaW5kZXggPSAtMTsKKyAgZm9yIChpID0gMDsgaSA8IHF0ZGVtdXgtPm5fc3RyZWFtczsgaSsrKSB7CisgICAgR3N0Q2xvY2tUaW1lIHBvc2l0aW9uOworCisgICAgc3RyZWFtID0gcXRkZW11eC0+c3RyZWFtc1tpXTsKKyAgICBwb3NpdGlvbiA9IHN0cmVhbS0+dGltZV9wb3NpdGlvbjsKKworICAgIC8qIHBvc2l0aW9uIG9mIC0xIGlzIEVPUyAqLworICAgIGlmIChwb3NpdGlvbiAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FICYmIHBvc2l0aW9uIDwgbWluX3RpbWUpIHsKKyAgICAgIG1pbl90aW1lID0gcG9zaXRpb247CisgICAgICBpbmRleCA9IGk7CisgICAgfQorICB9CisgIC8qIGFsbCBhcmUgRU9TICovCisgIGlmIChHX1VOTElLRUxZIChpbmRleCA9PSAtMSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiYWxsIHN0cmVhbXMgYXJlIEVPUyIpOworICAgIGdvdG8gZW9zOworICB9CisKKyAgLyogY2hlY2sgZm9yIHNlZ21lbnQgZW5kICovCisgIGlmIChHX1VOTElLRUxZIChxdGRlbXV4LT5zZWdtZW50LnN0b3AgIT0gLTEKKyAgICAgICAgICAmJiAoKHF0ZGVtdXgtPnNlZ21lbnQucmF0ZSA+PSAwICYmIHF0ZGVtdXgtPnNlZ21lbnQuc3RvcCA8PSBtaW5fdGltZSkKKyAgICAgICAgICAgICAgfHwgKHF0ZGVtdXgtPnNlZ21lbnQucmF0ZSA8IDAKKyAgICAgICAgICAgICAgICAgICYmIHF0ZGVtdXgtPnNlZ21lbnQuc3RhcnQgPiBtaW5fdGltZSkpCisgICAgICAgICAgJiYgcXRkZW11eC0+c3RyZWFtc1tpbmRleF0tPm9uX2tleWZyYW1lKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJ3ZSByZWFjaGVkIHRoZSBlbmQgb2Ygb3VyIHNlZ21lbnQuIik7CisgICAgcXRkZW11eC0+c3RyZWFtc1tpbmRleF0tPnRpbWVfcG9zaXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgIGdvdG8gZW9zX3N0cmVhbTsKKyAgfQorCisgIC8qIGdhcCBldmVudHMgZm9yIHN1YnRpdGxlIHN0cmVhbXMgKi8KKyAgZm9yIChpID0gMDsgaSA8IHF0ZGVtdXgtPm5fc3RyZWFtczsgaSsrKSB7CisgICAgc3RyZWFtID0gcXRkZW11eC0+c3RyZWFtc1tpXTsKKyAgICBpZiAoc3RyZWFtLT5wYWQgJiYgKHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0Nfc3VicAorICAgICAgICAgICAgfHwgc3RyZWFtLT5zdWJ0eXBlID09IEZPVVJDQ190ZXh0CisgICAgICAgICAgICB8fCBzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3NidGwpKSB7CisgICAgICAvKiBzZW5kIG9uZSBzZWNvbmQgZ2FwIGV2ZW50cyB1bnRpbCB0aGUgc3RyZWFtIGNhdGNoZXMgdXAgKi8KKyAgICAgIC8qIGdhcHMgY2FuIG9ubHkgYmUgc2VudCBhZnRlciBzZWdtZW50IGlzIGFjdGl2YXRlZCAoc2VnbWVudC5zdG9wIGlzIG5vIGxvbmdlciAtMSkgKi8KKyAgICAgIHdoaWxlIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtLT5zZWdtZW50LnN0b3ApICYmCisgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHN0cmVhbS0+c2VnbWVudC5wb3NpdGlvbikgJiYKKyAgICAgICAgICBzdHJlYW0tPnNlZ21lbnQucG9zaXRpb24gKyBHU1RfU0VDT05EIDwgbWluX3RpbWUpIHsKKyAgICAgICAgR3N0RXZlbnQgKmdhcCA9CisgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X2dhcCAoc3RyZWFtLT5zZWdtZW50LnBvc2l0aW9uLCBHU1RfU0VDT05EKTsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzdHJlYW0tPnBhZCwgZ2FwKTsKKyAgICAgICAgc3RyZWFtLT5zZWdtZW50LnBvc2l0aW9uICs9IEdTVF9TRUNPTkQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RyZWFtID0gcXRkZW11eC0+c3RyZWFtc1tpbmRleF07CisgIC8qIGZldGNoIGluZm8gZm9yIHRoZSBjdXJyZW50IHNhbXBsZSBvZiB0aGlzIHN0cmVhbSAqLworICBpZiAoR19VTkxJS0VMWSAoIWdzdF9xdGRlbXV4X3ByZXBhcmVfY3VycmVudF9zYW1wbGUgKHF0ZGVtdXgsIHN0cmVhbSwgJmVtcHR5LAorICAgICAgICAgICAgICAmb2Zmc2V0LCAmc2FtcGxlX3NpemUsICZkdHMsICZwdHMsICZkdXJhdGlvbiwgJmtleWZyYW1lKSkpCisgICAgZ290byBlb3Nfc3RyZWFtOworCisgIGdzdF9xdGRlbXV4X3N0cmVhbV9jaGVja19hbmRfY2hhbmdlX3N0c2RfaW5kZXggKHF0ZGVtdXgsIHN0cmVhbSk7CisgIGlmIChzdHJlYW0tPm5ld19jYXBzKSB7CisgICAgZ3N0X3F0ZGVtdXhfY29uZmlndXJlX3N0cmVhbSAocXRkZW11eCwgc3RyZWFtKTsKKyAgICBxdGRlbXV4X2RvX2FsbG9jYXRpb24gKHF0ZGVtdXgsIHN0cmVhbSk7CisgIH0KKworICAvKiBJZiB3ZSdyZSBkb2luZyBhIGtleWZyYW1lLW9ubHkgdHJpY2ttb2RlLCBvbmx5IHB1c2gga2V5ZnJhbWVzIG9uIHZpZGVvIHN0cmVhbXMgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKHF0ZGVtdXgtPgorICAgICAgICAgIHNlZ21lbnQuZmxhZ3MgJiBHU1RfU0VHTUVOVF9GTEFHX1RSSUNLTU9ERV9LRVlfVU5JVFMpKSB7CisgICAgaWYgKHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0NfdmlkZSAmJiAha2V5ZnJhbWUpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiU2tpcHBpbmcgbm9uLWtleWZyYW1lIG9uIHN0cmVhbSAlZCIsIGluZGV4KTsKKyAgICAgIGdvdG8gbmV4dDsKKyAgICB9CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgInB1c2hpbmcgZnJvbSBzdHJlYW0gJWQsIGVtcHR5ICVkIG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAiLCBzaXplICVkLCBkdHM9JSIgR1NUX1RJTUVfRk9STUFUICIsIHB0cz0lIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIsIGR1cmF0aW9uICUiIEdTVF9USU1FX0ZPUk1BVCwgaW5kZXgsIGVtcHR5LCBvZmZzZXQsIHNhbXBsZV9zaXplLAorICAgICAgR1NUX1RJTUVfQVJHUyAoZHRzKSwgR1NUX1RJTUVfQVJHUyAocHRzKSwgR1NUX1RJTUVfQVJHUyAoZHVyYXRpb24pKTsKKworICBpZiAoR19VTkxJS0VMWSAoZW1wdHkpKSB7CisgICAgLyogZW1wdHkgc2VnbWVudCwgcHVzaCBhIGdhcCBpZiB0aGVyZSdzIGEgc2Vjb25kIG9yIG1vcmUKKyAgICAgKiBkaWZmZXJlbmNlIGFuZCBtb3ZlIHRvIHRoZSBuZXh0IG9uZSAqLworICAgIGlmICgocHRzICsgZHVyYXRpb24gLSBzdHJlYW0tPnNlZ21lbnQucG9zaXRpb24pID49IEdTVF9TRUNPTkQpCisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHN0cmVhbS0+cGFkLCBnc3RfZXZlbnRfbmV3X2dhcCAocHRzLCBkdXJhdGlvbikpOworICAgIHN0cmVhbS0+c2VnbWVudC5wb3NpdGlvbiA9IHB0cyArIGR1cmF0aW9uOworICAgIGdvdG8gbmV4dDsKKyAgfQorCisgIC8qIGhtbSwgZW1wdHkgc2FtcGxlLCBza2lwIGFuZCBtb3ZlIHRvIG5leHQgc2FtcGxlICovCisgIGlmIChHX1VOTElLRUxZIChzYW1wbGVfc2l6ZSA8PSAwKSkKKyAgICBnb3RvIG5leHQ7CisKKyAgLyogbGFzdCBwdXNoZWQgc2FtcGxlIHdhcyBvdXQgb2YgYm91bmRhcnksIGdvdG8gbmV4dCBzYW1wbGUgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKEdTVF9QQURfTEFTVF9GTE9XX1JFVFVSTiAoc3RyZWFtLT5wYWQpID09IEdTVF9GTE9XX0VPUykpCisgICAgZ290byBuZXh0OworCisgIGlmIChzdHJlYW0tPm1heF9idWZmZXJfc2l6ZSA9PSAwIHx8IHNhbXBsZV9zaXplIDw9IHN0cmVhbS0+bWF4X2J1ZmZlcl9zaXplKSB7CisgICAgc2l6ZSA9IHNhbXBsZV9zaXplOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICJzaXplICVkIGxhcmdlciB0aGFuIHN0cmVhbSBtYXhfYnVmZmVyX3NpemUgJWQsIHRyaW1taW5nIiwKKyAgICAgICAgc2FtcGxlX3NpemUsIHN0cmVhbS0+bWF4X2J1ZmZlcl9zaXplKTsKKyAgICBzaXplID0KKyAgICAgICAgTUlOIChzYW1wbGVfc2l6ZSAtIHN0cmVhbS0+b2Zmc2V0X2luX3NhbXBsZSwgc3RyZWFtLT5tYXhfYnVmZmVyX3NpemUpOworICB9CisKKyAgaWYgKHF0ZGVtdXgtPmNlbmNfYXV4X2luZm9fb2Zmc2V0ID4gMCkgeworICAgIEdzdE1hcEluZm8gbWFwOworICAgIEdzdEJ5dGVSZWFkZXIgYnI7CisgICAgR3N0QnVmZmVyICphdXhfaW5mbyA9IE5VTEw7CisKKyAgICAvKiBwdWxsIHRoZSBkYXRhIHN0b3JlZCBiZWZvcmUgdGhlIHNhbXBsZSAqLworICAgIHJldCA9CisgICAgICAgIGdzdF9xdGRlbXV4X3B1bGxfYXRvbSAocXRkZW11eCwgcXRkZW11eC0+b2Zmc2V0LAorICAgICAgICBvZmZzZXQgKyBzdHJlYW0tPm9mZnNldF9pbl9zYW1wbGUgLSBxdGRlbXV4LT5vZmZzZXQsICZhdXhfaW5mbyk7CisgICAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSykpCisgICAgICBnb3RvIGJlYWNoOworICAgIGdzdF9idWZmZXJfbWFwIChhdXhfaW5mbywgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicGFyc2luZyBjZW5jIGF1eGlsaWFyeSBpbmZvIik7CisgICAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZiciwgbWFwLmRhdGEgKyA4LCBtYXAuc2l6ZSk7CisgICAgaWYgKCFxdGRlbXV4X3BhcnNlX2NlbmNfYXV4X2luZm8gKHF0ZGVtdXgsIHN0cmVhbSwgJmJyLAorICAgICAgICAgICAgcXRkZW11eC0+Y2VuY19hdXhfaW5mb19zaXplcywgcXRkZW11eC0+Y2VuY19hdXhfc2FtcGxlX2NvdW50KSkgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwgImZhaWxlZCB0byBwYXJzZSBjZW5jIGF1eGlsaWFyeSBpbmZvIik7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChhdXhfaW5mbywgJm1hcCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChhdXhfaW5mbyk7CisgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgIGdvdG8gYmVhY2g7CisgICAgfQorICAgIGdzdF9idWZmZXJfdW5tYXAgKGF1eF9pbmZvLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChhdXhfaW5mbyk7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInJlYWRpbmcgJWQgYnl0ZXMgQCAlIiBHX0dVSU5UNjRfRk9STUFULCBzaXplLAorICAgICAgb2Zmc2V0KTsKKworICBpZiAoc3RyZWFtLT51c2VfYWxsb2NhdG9yKSB7CisgICAgLyogaWYgd2UgaGF2ZSBhIHBlci1zdHJlYW0gYWxsb2NhdG9yLCB1c2UgaXQgKi8KKyAgICBidWYgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoc3RyZWFtLT5hbGxvY2F0b3IsIHNpemUsICZzdHJlYW0tPnBhcmFtcyk7CisgIH0KKworICByZXQgPSBnc3RfcXRkZW11eF9wdWxsX2F0b20gKHF0ZGVtdXgsIG9mZnNldCArIHN0cmVhbS0+b2Zmc2V0X2luX3NhbXBsZSwKKyAgICAgIHNpemUsICZidWYpOworICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LKSkKKyAgICBnb3RvIGJlYWNoOworCisgIGlmIChzaXplICE9IHNhbXBsZV9zaXplKSB7CisgICAgcHRzICs9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKEdTVF9TRUNPTkQsCisgICAgICAgIHN0cmVhbS0+b2Zmc2V0X2luX3NhbXBsZSAvIENVUl9TVFJFQU0gKHN0cmVhbSktPmJ5dGVzX3Blcl9mcmFtZSwKKyAgICAgICAgc3RyZWFtLT50aW1lc2NhbGUpOworICAgIGR0cyArPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChHU1RfU0VDT05ELAorICAgICAgICBzdHJlYW0tPm9mZnNldF9pbl9zYW1wbGUgLyBDVVJfU1RSRUFNIChzdHJlYW0pLT5ieXRlc19wZXJfZnJhbWUsCisgICAgICAgIHN0cmVhbS0+dGltZXNjYWxlKTsKKyAgICBkdXJhdGlvbiA9CisgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKEdTVF9TRUNPTkQsCisgICAgICAgIHNpemUgLyBDVVJfU1RSRUFNIChzdHJlYW0pLT5ieXRlc19wZXJfZnJhbWUsIHN0cmVhbS0+dGltZXNjYWxlKTsKKyAgfQorCisgIHJldCA9IGdzdF9xdGRlbXV4X2RlY29yYXRlX2FuZF9wdXNoX2J1ZmZlciAocXRkZW11eCwgc3RyZWFtLCBidWYsCisgICAgICBkdHMsIHB0cywgZHVyYXRpb24sIGtleWZyYW1lLCBtaW5fdGltZSwgb2Zmc2V0KTsKKworICBpZiAoc2l6ZSAhPSBzYW1wbGVfc2l6ZSkgeworICAgIFF0RGVtdXhTYW1wbGUgKnNhbXBsZSA9ICZzdHJlYW0tPnNhbXBsZXNbc3RyZWFtLT5zYW1wbGVfaW5kZXhdOworICAgIFF0RGVtdXhTZWdtZW50ICpzZWdtZW50ID0gJnN0cmVhbS0+c2VnbWVudHNbc3RyZWFtLT5zZWdtZW50X2luZGV4XTsKKworICAgIEdzdENsb2NrVGltZSB0aW1lX3Bvc2l0aW9uID0gUVRTVFJFQU1USU1FX1RPX0dTVFRJTUUgKHN0cmVhbSwKKyAgICAgICAgc2FtcGxlLT50aW1lc3RhbXAgKworICAgICAgICBzdHJlYW0tPm9mZnNldF9pbl9zYW1wbGUgLyBDVVJfU1RSRUFNIChzdHJlYW0pLT5ieXRlc19wZXJfZnJhbWUpOworICAgIGlmICh0aW1lX3Bvc2l0aW9uID49IHNlZ21lbnQtPm1lZGlhX3N0YXJ0KSB7CisgICAgICAvKiBpbnNpZGUgdGhlIHNlZ21lbnQsIHVwZGF0ZSB0aW1lX3Bvc2l0aW9uLCBsb29rcyB2ZXJ5IGZhbWlsaWFyIHRvCisgICAgICAgKiBHU3RyZWFtZXIgc2VnbWVudHMsIGRvZXNuJ3QgaXQ/ICovCisgICAgICBzdHJlYW0tPnRpbWVfcG9zaXRpb24gPSAodGltZV9wb3NpdGlvbiAtIHNlZ21lbnQtPm1lZGlhX3N0YXJ0KSArCisgICAgICAgICAgc2VnbWVudC0+dGltZTsKKyAgICB9IGVsc2UgeworICAgICAgLyogbm90IHlldCBpbiBzZWdtZW50LCB0aW1lIGRvZXMgbm90IHlldCBpbmNyZW1lbnQuIFRoaXMgbWVhbnMKKyAgICAgICAqIHRoYXQgd2UgYXJlIHN0aWxsIHByZXJvbGxpbmcga2V5ZnJhbWVzIHRvIHRoZSBkZWNvZGVyIHNvIGl0IGNhbgorICAgICAgICogZGVjb2RlIHRoZSBmaXJzdCBzYW1wbGUgb2YgdGhlIHNlZ21lbnQuICovCisgICAgICBzdHJlYW0tPnRpbWVfcG9zaXRpb24gPSBzZWdtZW50LT50aW1lOworICAgIH0KKyAgfQorCisgIC8qIGNvbWJpbmUgZmxvd3MgKi8KKyAgcmV0ID0gZ3N0X3F0ZGVtdXhfY29tYmluZV9mbG93cyAocXRkZW11eCwgc3RyZWFtLCByZXQpOworICAvKiBpZ25vcmUgdW5saW5rZWQsIHdlIHdpbGwgbm90IHB1c2ggb24gdGhlIHBhZCBhbnltb3JlIGFuZCB3ZSB3aWxsIEVPUyB3aGVuCisgICAqIHdlIGhhdmUgbm8gbW9yZSBkYXRhIGZvciB0aGUgcGFkIHRvIHB1c2ggKi8KKyAgaWYgKHJldCA9PSBHU1RfRkxPV19FT1MpCisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgc3RyZWFtLT5vZmZzZXRfaW5fc2FtcGxlICs9IHNpemU7CisgIGlmIChzdHJlYW0tPm9mZnNldF9pbl9zYW1wbGUgPj0gc2FtcGxlX3NpemUpIHsKKyAgICBnc3RfcXRkZW11eF9hZHZhbmNlX3NhbXBsZSAocXRkZW11eCwgc3RyZWFtKTsKKyAgfQorICBnb3RvIGJlYWNoOworCituZXh0OgorICBnc3RfcXRkZW11eF9hZHZhbmNlX3NhbXBsZSAocXRkZW11eCwgc3RyZWFtKTsKKworYmVhY2g6CisgIHJldHVybiByZXQ7CisKKyAgLyogc3BlY2lhbCBjYXNlcyAqLworZW9zOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIk5vIHNhbXBsZXMgbGVmdCBmb3IgYW55IHN0cmVhbXMgLSBFT1MiKTsKKyAgICByZXQgPSBHU1RfRkxPV19FT1M7CisgICAgZ290byBiZWFjaDsKKyAgfQorZW9zX3N0cmVhbToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJObyBzYW1wbGVzIGxlZnQgZm9yIHN0cmVhbSIpOworICAgIC8qIEVPUyB3aWxsIGJlIHJhaXNlZCBpZiBhbGwgYXJlIEVPUyAqLworICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgIGdvdG8gYmVhY2g7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X2xvb3AgKEdzdFBhZCAqIHBhZCkKK3sKKyAgR3N0UVREZW11eCAqcXRkZW11eDsKKyAgZ3VpbnQ2NCBjdXJfb2Zmc2V0OworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBxdGRlbXV4ID0gR1NUX1FUREVNVVggKGdzdF9wYWRfZ2V0X3BhcmVudCAocGFkKSk7CisKKyAgY3VyX29mZnNldCA9IHF0ZGVtdXgtPm9mZnNldDsKKyAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJsb29wIGF0IHBvc2l0aW9uICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgc3RhdGUgJXMiLAorICAgICAgY3VyX29mZnNldCwgcXRfZGVtdXhfc3RhdGVfc3RyaW5nIChxdGRlbXV4LT5zdGF0ZSkpOworCisgIHN3aXRjaCAocXRkZW11eC0+c3RhdGUpIHsKKyAgICBjYXNlIFFUREVNVVhfU1RBVEVfSU5JVElBTDoKKyAgICBjYXNlIFFUREVNVVhfU1RBVEVfSEVBREVSOgorICAgICAgcmV0ID0gZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9oZWFkZXIgKHF0ZGVtdXgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBRVERFTVVYX1NUQVRFX01PVklFOgorICAgICAgcmV0ID0gZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9tb3ZpZSAocXRkZW11eCk7CisgICAgICBpZiAocXRkZW11eC0+c2VnbWVudC5yYXRlIDwgMCAmJiByZXQgPT0gR1NUX0ZMT1dfRU9TKSB7CisgICAgICAgIHJldCA9IGdzdF9xdGRlbXV4X3NlZWtfdG9fcHJldmlvdXNfa2V5ZnJhbWUgKHF0ZGVtdXgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIG91Y2ggKi8KKyAgICAgIGdvdG8gaW52YWxpZF9zdGF0ZTsKKyAgfQorCisgIC8qIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nLCBwYXVzZSAqLworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gcGF1c2U7CisKK2RvbmU6CisgIGdzdF9vYmplY3RfdW5yZWYgKHF0ZGVtdXgpOworICByZXR1cm47CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX3N0YXRlOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0ZGVtdXgsIFNUUkVBTSwgRkFJTEVELAorICAgICAgICAoTlVMTCksICgic3RyZWFtaW5nIHN0b3BwZWQsIGludmFsaWQgc3RhdGUiKSk7CisgICAgZ3N0X3BhZF9wYXVzZV90YXNrIChwYWQpOworICAgIGdzdF9xdGRlbXV4X3B1c2hfZXZlbnQgKHF0ZGVtdXgsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK3BhdXNlOgorICB7CisgICAgY29uc3QgZ2NoYXIgKnJlYXNvbiA9IGdzdF9mbG93X2dldF9uYW1lIChyZXQpOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJwYXVzaW5nIHRhc2ssIHJlYXNvbiAlcyIsIHJlYXNvbik7CisKKyAgICBnc3RfcGFkX3BhdXNlX3Rhc2sgKHBhZCk7CisKKyAgICAvKiBmYXRhbCBlcnJvcnMgbmVlZCBzcGVjaWFsIGFjdGlvbnMgKi8KKyAgICAvKiBjaGVjayBFT1MgKi8KKyAgICBpZiAocmV0ID09IEdTVF9GTE9XX0VPUykgeworICAgICAgaWYgKHF0ZGVtdXgtPm5fc3RyZWFtcyA9PSAwKSB7CisgICAgICAgIC8qIHdlIGhhdmUgbm8gc3RyZWFtcywgcG9zdCBhbiBlcnJvciAqLworICAgICAgICBnc3RfcXRkZW11eF9wb3N0X25vX3BsYXlhYmxlX3N0cmVhbV9lcnJvciAocXRkZW11eCk7CisgICAgICB9CisgICAgICBpZiAocXRkZW11eC0+c2VnbWVudC5mbGFncyAmIEdTVF9TRUVLX0ZMQUdfU0VHTUVOVCkgeworICAgICAgICBnaW50NjQgc3RvcDsKKworICAgICAgICBpZiAoKHN0b3AgPSBxdGRlbXV4LT5zZWdtZW50LnN0b3ApID09IC0xKQorICAgICAgICAgIHN0b3AgPSBxdGRlbXV4LT5zZWdtZW50LmR1cmF0aW9uOworCisgICAgICAgIGlmIChxdGRlbXV4LT5zZWdtZW50LnJhdGUgPj0gMCkgeworICAgICAgICAgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisgICAgICAgICAgR3N0RXZlbnQgKmV2ZW50OworCisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJTZW5kaW5nIHNlZ21lbnQgZG9uZSwgYXQgZW5kIG9mIHNlZ21lbnQiKTsKKyAgICAgICAgICBtZXNzYWdlID0gZ3N0X21lc3NhZ2VfbmV3X3NlZ21lbnRfZG9uZSAoR1NUX09CSkVDVF9DQVNUIChxdGRlbXV4KSwKKyAgICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBzdG9wKTsKKyAgICAgICAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudF9kb25lIChHU1RfRk9STUFUX1RJTUUsIHN0b3ApOworICAgICAgICAgIGlmIChxdGRlbXV4LT5zZWdtZW50X3NlcW51bSAhPSBHU1RfU0VRTlVNX0lOVkFMSUQpIHsKKyAgICAgICAgICAgIGdzdF9tZXNzYWdlX3NldF9zZXFudW0gKG1lc3NhZ2UsIHF0ZGVtdXgtPnNlZ21lbnRfc2VxbnVtKTsKKyAgICAgICAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChldmVudCwgcXRkZW11eC0+c2VnbWVudF9zZXFudW0pOworICAgICAgICAgIH0KKyAgICAgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHF0ZGVtdXgpLCBtZXNzYWdlKTsKKyAgICAgICAgICBnc3RfcXRkZW11eF9wdXNoX2V2ZW50IChxdGRlbXV4LCBldmVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKyAgICAgICAgICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgICAgICAgICAvKiAgRm9yIFJldmVyc2UgUGxheWJhY2sgKi8KKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIlNlbmRpbmcgc2VnbWVudCBkb25lLCBhdCBzdGFydCBvZiBzZWdtZW50Iik7CisgICAgICAgICAgbWVzc2FnZSA9IGdzdF9tZXNzYWdlX25ld19zZWdtZW50X2RvbmUgKEdTVF9PQkpFQ1RfQ0FTVCAocXRkZW11eCksCisgICAgICAgICAgICAgIEdTVF9GT1JNQVRfVElNRSwgcXRkZW11eC0+c2VnbWVudC5zdGFydCk7CisgICAgICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnRfZG9uZSAoR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICAgICAgICBxdGRlbXV4LT5zZWdtZW50LnN0YXJ0KTsKKyAgICAgICAgICBpZiAocXRkZW11eC0+c2VnbWVudF9zZXFudW0gIT0gR1NUX1NFUU5VTV9JTlZBTElEKSB7CisgICAgICAgICAgICBnc3RfbWVzc2FnZV9zZXRfc2VxbnVtIChtZXNzYWdlLCBxdGRlbXV4LT5zZWdtZW50X3NlcW51bSk7CisgICAgICAgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZXZlbnQsIHF0ZGVtdXgtPnNlZ21lbnRfc2VxbnVtKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChxdGRlbXV4KSwgbWVzc2FnZSk7CisgICAgICAgICAgZ3N0X3F0ZGVtdXhfcHVzaF9ldmVudCAocXRkZW11eCwgZXZlbnQpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJTZW5kaW5nIEVPUyBhdCBlbmQgb2Ygc2VnbWVudCIpOworICAgICAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfZW9zICgpOworICAgICAgICBpZiAocXRkZW11eC0+c2VnbWVudF9zZXFudW0gIT0gR1NUX1NFUU5VTV9JTlZBTElEKQorICAgICAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChldmVudCwgcXRkZW11eC0+c2VnbWVudF9zZXFudW0pOworICAgICAgICBnc3RfcXRkZW11eF9wdXNoX2V2ZW50IChxdGRlbXV4LCBldmVudCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXQgPT0gR1NUX0ZMT1dfTk9UX0xJTktFRCB8fCByZXQgPCBHU1RfRkxPV19FT1MpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0ZMT1dfRVJST1IgKHF0ZGVtdXgsIHJldCk7CisgICAgICBnc3RfcXRkZW11eF9wdXNoX2V2ZW50IChxdGRlbXV4LCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisgICAgfQorICAgIGdvdG8gZG9uZTsKKyAgfQorfQorCisvKgorICogaGFzX25leHRfZW50cnkKKyAqCisgKiBSZXR1cm5zIGlmIHRoZXJlIGFyZSBzYW1wbGVzIHRvIGJlIHBsYXllZC4KKyAqLworc3RhdGljIGdib29sZWFuCitoYXNfbmV4dF9lbnRyeSAoR3N0UVREZW11eCAqIGRlbXV4KQoreworICBRdERlbXV4U3RyZWFtICpzdHJlYW07CisgIGludCBpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiQ2hlY2tpbmcgaWYgdGhlcmUgYXJlIHNhbXBsZXMgbm90IHBsYXllZCB5ZXQiKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZGVtdXgtPm5fc3RyZWFtczsgaSsrKSB7CisgICAgc3RyZWFtID0gZGVtdXgtPnN0cmVhbXNbaV07CisKKyAgICBpZiAoc3RyZWFtLT5zYW1wbGVfaW5kZXggPT0gLTEpIHsKKyAgICAgIHN0cmVhbS0+c2FtcGxlX2luZGV4ID0gMDsKKyAgICAgIHN0cmVhbS0+b2Zmc2V0X2luX3NhbXBsZSA9IDA7CisgICAgfQorCisgICAgaWYgKHN0cmVhbS0+c2FtcGxlX2luZGV4ID49IHN0cmVhbS0+bl9zYW1wbGVzKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJzdHJlYW0gJWQgc2FtcGxlcyBleGhhdXN0ZWQiLCBpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIkZvdW5kIGEgc2FtcGxlIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlRoZXJlIHdhc24ndCBhbnkgbmV4dCBzYW1wbGUiKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogbmV4dF9lbnRyeV9zaXplCisgKgorICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZmlyc3QgZW50cnkgYXQgdGhlIGN1cnJlbnQgb2Zmc2V0LgorICogSWYgLTEsIHRoZXJlIGFyZSBub25lICh3aGljaCBtZWFucyBFT1Mgb3IgZW1wdHkgZmlsZSkuCisgKi8KK3N0YXRpYyBndWludDY0CituZXh0X2VudHJ5X3NpemUgKEdzdFFURGVtdXggKiBkZW11eCkKK3sKKyAgUXREZW11eFN0cmVhbSAqc3RyZWFtOworICBpbnQgaTsKKyAgaW50IHNtYWxsaWR4ID0gLTE7CisgIGd1aW50NjQgc21hbGxvZmZzID0gKGd1aW50NjQpIC0gMTsKKyAgUXREZW11eFNhbXBsZSAqc2FtcGxlOworCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgIkZpbmRpbmcgZW50cnkgYXQgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBkZW11eC0+b2Zmc2V0KTsKKworICBmb3IgKGkgPSAwOyBpIDwgZGVtdXgtPm5fc3RyZWFtczsgaSsrKSB7CisgICAgc3RyZWFtID0gZGVtdXgtPnN0cmVhbXNbaV07CisKKyAgICBpZiAoc3RyZWFtLT5zYW1wbGVfaW5kZXggPT0gLTEpIHsKKyAgICAgIHN0cmVhbS0+c2FtcGxlX2luZGV4ID0gMDsKKyAgICAgIHN0cmVhbS0+b2Zmc2V0X2luX3NhbXBsZSA9IDA7CisgICAgfQorCisgICAgaWYgKHN0cmVhbS0+c2FtcGxlX2luZGV4ID49IHN0cmVhbS0+bl9zYW1wbGVzKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJzdHJlYW0gJWQgc2FtcGxlcyBleGhhdXN0ZWQiLCBpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmICghcXRkZW11eF9wYXJzZV9zYW1wbGVzIChkZW11eCwgc3RyZWFtLCBzdHJlYW0tPnNhbXBsZV9pbmRleCkpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgIlBhcnNpbmcgb2YgaW5kZXggJXUgZnJvbSBzdGJsIGF0b20gZmFpbGVkISIsCisgICAgICAgICAgc3RyZWFtLT5zYW1wbGVfaW5kZXgpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHNhbXBsZSA9ICZzdHJlYW0tPnNhbXBsZXNbc3RyZWFtLT5zYW1wbGVfaW5kZXhdOworCisgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAiQ2hlY2tpbmcgU3RyZWFtICVkIChzYW1wbGVfaW5kZXg6JWQgLyBvZmZzZXQ6JSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAiIC8gc2l6ZTolIiBHX0dVSU5UMzJfRk9STUFUICIpIiwgaSwgc3RyZWFtLT5zYW1wbGVfaW5kZXgsCisgICAgICAgIHNhbXBsZS0+b2Zmc2V0LCBzYW1wbGUtPnNpemUpOworCisgICAgaWYgKCgoc21hbGxvZmZzID09IC0xKQorICAgICAgICAgICAgfHwgKHNhbXBsZS0+b2Zmc2V0IDwgc21hbGxvZmZzKSkgJiYgKHNhbXBsZS0+c2l6ZSkpIHsKKyAgICAgIHNtYWxsaWR4ID0gaTsKKyAgICAgIHNtYWxsb2ZmcyA9IHNhbXBsZS0+b2Zmc2V0OworICAgIH0KKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwKKyAgICAgICJzdHJlYW0gJWQgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBkZW11eC0+b2Zmc2V0IDolIgorICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgc21hbGxpZHgsIHNtYWxsb2ZmcywgZGVtdXgtPm9mZnNldCk7CisKKyAgaWYgKHNtYWxsaWR4ID09IC0xKQorICAgIHJldHVybiAtMTsKKworICBzdHJlYW0gPSBkZW11eC0+c3RyZWFtc1tzbWFsbGlkeF07CisgIHNhbXBsZSA9ICZzdHJlYW0tPnNhbXBsZXNbc3RyZWFtLT5zYW1wbGVfaW5kZXhdOworCisgIGlmIChzYW1wbGUtPm9mZnNldCA+PSBkZW11eC0+b2Zmc2V0KSB7CisgICAgZGVtdXgtPnRvZHJvcCA9IHNhbXBsZS0+b2Zmc2V0IC0gZGVtdXgtPm9mZnNldDsKKyAgICByZXR1cm4gc2FtcGxlLT5zaXplICsgZGVtdXgtPnRvZHJvcDsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgIlRoZXJlIHdhc24ndCBhbnkgZW50cnkgYXQgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIGRlbXV4LT5vZmZzZXQpOworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9wb3N0X3Byb2dyZXNzIChHc3RRVERlbXV4ICogZGVtdXgsIGdpbnQgbnVtLCBnaW50IGRlbm9tKQoreworICBnaW50IHBlcmMgPSAoZ2ludCkgKChnZG91YmxlKSBudW0gKiAxMDAuMCAvIChnZG91YmxlKSBkZW5vbSk7CisKKyAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChkZW11eCksCisgICAgICBnc3RfbWVzc2FnZV9uZXdfZWxlbWVudCAoR1NUX09CSkVDVF9DQVNUIChkZW11eCksCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJwcm9ncmVzcyIsICJwZXJjZW50IiwgR19UWVBFX0lOVCwgcGVyYywgTlVMTCkpKTsKK30KKworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X3NlZWtfb2Zmc2V0IChHc3RRVERlbXV4ICogZGVtdXgsIGd1aW50NjQgb2Zmc2V0KQoreworICBHc3RFdmVudCAqZXZlbnQ7CisgIGdib29sZWFuIHJlcyA9IDA7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJTZWVraW5nIHRvICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG9mZnNldCk7CisKKyAgZXZlbnQgPQorICAgICAgZ3N0X2V2ZW50X25ld19zZWVrICgxLjAsIEdTVF9GT1JNQVRfQllURVMsCisgICAgICBHU1RfU0VFS19GTEFHX0ZMVVNIIHwgR1NUX1NFRUtfRkxBR19BQ0NVUkFURSwgR1NUX1NFRUtfVFlQRV9TRVQsIG9mZnNldCwKKyAgICAgIEdTVF9TRUVLX1RZUEVfTk9ORSwgLTEpOworCisgIC8qIHN0b3JlIHNlcW51bSB0byBkcm9wIGZsdXNoIGV2ZW50cywgdGhleSBkb24ndCBuZWVkIHRvIHJlYWNoIGRvd25zdHJlYW0gKi8KKyAgZGVtdXgtPm9mZnNldF9zZWVrX3NlcW51bSA9IGdzdF9ldmVudF9nZXRfc2VxbnVtIChldmVudCk7CisgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAoZGVtdXgtPnNpbmtwYWQsIGV2ZW50KTsKKyAgZGVtdXgtPm9mZnNldF9zZWVrX3NlcW51bSA9IEdTVF9TRVFOVU1fSU5WQUxJRDsKKworICByZXR1cm4gcmVzOworfQorCisvKiBjaGVjayBmb3Igc2Vla2FibGUgdXBzdHJlYW0sIGFib3ZlIGFuZCBiZXlvbmQgYSBtZXJlIHF1ZXJ5ICovCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfY2hlY2tfc2Vla2FiaWxpdHkgKEdzdFFURGVtdXggKiBkZW11eCkKK3sKKyAgR3N0UXVlcnkgKnF1ZXJ5OworICBnYm9vbGVhbiBzZWVrYWJsZSA9IEZBTFNFOworICBnaW50NjQgc3RhcnQgPSAtMSwgc3RvcCA9IC0xOworCisgIGlmIChkZW11eC0+dXBzdHJlYW1fc2l6ZSkKKyAgICByZXR1cm47CisKKyAgaWYgKGRlbXV4LT51cHN0cmVhbV9mb3JtYXRfaXNfdGltZSkKKyAgICByZXR1cm47CisKKyAgcXVlcnkgPSBnc3RfcXVlcnlfbmV3X3NlZWtpbmcgKEdTVF9GT1JNQVRfQllURVMpOworICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeSAoZGVtdXgtPnNpbmtwYWQsIHF1ZXJ5KSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAic2Vla2luZyBxdWVyeSBmYWlsZWQiKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksIE5VTEwsICZzZWVrYWJsZSwgJnN0YXJ0LCAmc3RvcCk7CisKKyAgLyogdHJ5IGhhcmRlciB0byBxdWVyeSB1cHN0cmVhbSBzaXplIGlmIHdlIGRpZG4ndCBnZXQgaXQgdGhlIGZpcnN0IHRpbWUgKi8KKyAgaWYgKHNlZWthYmxlICYmIHN0b3AgPT0gLTEpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImRvaW5nIGR1cmF0aW9uIHF1ZXJ5IHRvIGZpeCB1cCB1bnNldCBzdG9wIik7CisgICAgZ3N0X3BhZF9wZWVyX3F1ZXJ5X2R1cmF0aW9uIChkZW11eC0+c2lua3BhZCwgR1NUX0ZPUk1BVF9CWVRFUywgJnN0b3ApOworICB9CisKKyAgLyogaWYgdXBzdHJlYW0gZG9lc24ndCBrbm93IHRoZSBzaXplLCBpdCdzIGxpa2VseSB0aGF0IGl0J3Mgbm90IHNlZWthYmxlIGluCisgICAqIHByYWN0aWNlIGV2ZW4gaWYgaXQgdGVjaG5pY2FsbHkgbWF5IGJlIHNlZWthYmxlICovCisgIGlmIChzZWVrYWJsZSAmJiAoc3RhcnQgIT0gMCB8fCBzdG9wIDw9IHN0YXJ0KSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAic2Vla2FibGUgYnV0IHVua25vd24gc3RhcnQvc3RvcCAtPiBkaXNhYmxlIik7CisgICAgc2Vla2FibGUgPSBGQUxTRTsKKyAgfQorCitkb25lOgorICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInNlZWthYmxlOiAlZCAoJSIgR19HVUlOVDY0X0ZPUk1BVCAiIC0gJSIKKyAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIikiLCBzZWVrYWJsZSwgc3RhcnQsIHN0b3ApOworICBkZW11eC0+dXBzdHJlYW1fc2Vla2FibGUgPSBzZWVrYWJsZTsKKyAgZGVtdXgtPnVwc3RyZWFtX3NpemUgPSBzZWVrYWJsZSA/IHN0b3AgOiAtMTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X2Ryb3BfZGF0YSAoR3N0UVREZW11eCAqIGRlbXV4LCBnaW50IGJ5dGVzKQoreworICBnX3JldHVybl9pZl9mYWlsIChieXRlcyA8PSBkZW11eC0+dG9kcm9wKTsKKworICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJEcm9wcGluZyAlZCBieXRlcyIsIGJ5dGVzKTsKKyAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGRlbXV4LT5hZGFwdGVyLCBieXRlcyk7CisgIGRlbXV4LT5uZWVkZWRieXRlcyAtPSBieXRlczsKKyAgZGVtdXgtPm9mZnNldCArPSBieXRlczsKKyAgZGVtdXgtPnRvZHJvcCAtPSBieXRlczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X2NoZWNrX3NlbmRfcGVuZGluZ19zZWdtZW50IChHc3RRVERlbXV4ICogZGVtdXgpCit7CisgIGlmIChHX1VOTElLRUxZIChkZW11eC0+cGVuZGluZ19uZXdzZWdtZW50KSkgeworICAgIGdpbnQgaTsKKworICAgIGdzdF9xdGRlbXV4X3B1c2hfcGVuZGluZ19uZXdzZWdtZW50IChkZW11eCk7CisgICAgLyogY2xlYXIgdG8gc2VuZCB0YWdzIG9uIGFsbCBzdHJlYW1zICovCisgICAgZm9yIChpID0gMDsgaSA8IGRlbXV4LT5uX3N0cmVhbXM7IGkrKykgeworICAgICAgUXREZW11eFN0cmVhbSAqc3RyZWFtOworICAgICAgc3RyZWFtID0gZGVtdXgtPnN0cmVhbXNbaV07CisgICAgICBnc3RfcXRkZW11eF9wdXNoX3RhZ3MgKGRlbXV4LCBzdHJlYW0pOworICAgICAgaWYgKENVUl9TVFJFQU0gKHN0cmVhbSktPnNwYXJzZSkgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKGRlbXV4LCAiU2VuZGluZyBnYXAgZXZlbnQgb24gc3RyZWFtICVkIiwgaSk7CisgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3RyZWFtLT5wYWQsCisgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X2dhcCAoc3RyZWFtLT5zZWdtZW50LnBvc2l0aW9uLCBHU1RfQ0xPQ0tfVElNRV9OT05FKSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9zZW5kX2dhcF9mb3Jfc2VnbWVudCAoR3N0UVREZW11eCAqIGRlbXV4LAorICAgIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0sIGdpbnQgc2VnbWVudF9pbmRleCwgR3N0Q2xvY2tUaW1lIHBvcykKK3sKKyAgR3N0Q2xvY2tUaW1lIHRzLCBkdXI7CisgIEdzdEV2ZW50ICpnYXA7CisKKyAgdHMgPSBwb3M7CisgIGR1ciA9CisgICAgICBzdHJlYW0tPnNlZ21lbnRzW3NlZ21lbnRfaW5kZXhdLmR1cmF0aW9uIC0gKHBvcyAtCisgICAgICBzdHJlYW0tPnNlZ21lbnRzW3NlZ21lbnRfaW5kZXhdLnRpbWUpOworICBnYXAgPSBnc3RfZXZlbnRfbmV3X2dhcCAodHMsIGR1cik7CisgIHN0cmVhbS0+dGltZV9wb3NpdGlvbiArPSBkdXI7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3RyZWFtLT5wYWQsICJQdXNoaW5nIGdhcCBmb3IgZW1wdHkgIgorICAgICAgInNlZ21lbnQ6ICUiIEdTVF9QVFJfRk9STUFULCBnYXApOworICBnc3RfcGFkX3B1c2hfZXZlbnQgKHN0cmVhbS0+cGFkLCBnYXApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfc3RyZWFtX3NlbmRfaW5pdGlhbF9nYXBfc2VnbWVudHMgKEdzdFFURGVtdXggKiBkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtKQoreworICBnaW50IGk7CisKKyAgLyogUHVzaCBhbnkgaW5pdGlhbCBnYXAgc2VnbWVudHMgYmVmb3JlIHByb2NlZWRpbmcgdG8gdGhlCisgICAqICdyZWFsJyBkYXRhICovCisgIGZvciAoaSA9IDA7IGkgPCBzdHJlYW0tPm5fc2VnbWVudHM7IGkrKykgeworICAgIGdzdF9xdGRlbXV4X2FjdGl2YXRlX3NlZ21lbnQgKGRlbXV4LCBzdHJlYW0sIGksIHN0cmVhbS0+dGltZV9wb3NpdGlvbik7CisKKyAgICBpZiAoUVRTRUdNRU5UX0lTX0VNUFRZICgmc3RyZWFtLT5zZWdtZW50c1tpXSkpIHsKKyAgICAgIGdzdF9xdGRlbXV4X3NlbmRfZ2FwX2Zvcl9zZWdtZW50IChkZW11eCwgc3RyZWFtLCBpLAorICAgICAgICAgIHN0cmVhbS0+dGltZV9wb3NpdGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIE9ubHkgc3VwcG9ydCBlbXB0eSBzZWdtZW50IGF0IHRoZSBiZWdpbm5pbmcgZm9sbG93ZWQgYnkKKyAgICAgICAqIG9uZSBub24tZW1wdHkgc2VnbWVudCwgdGhpcyB3YXMgY2hlY2tlZCB3aGVuIHBhcnNpbmcgdGhlCisgICAgICAgKiBlZHRzIGF0b20sIGFycml2aW5nIGhlcmUgaXMgdW5leHBlY3RlZCAqLworICAgICAgZ19hc3NlcnQgKGkgKyAxID09IHN0cmVhbS0+bl9zZWdtZW50cyk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdGRlbXV4X2NoYWluIChHc3RQYWQgKiBzaW5rcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGluYnVmKQoreworICBHc3RRVERlbXV4ICpkZW11eDsKKworICBkZW11eCA9IEdTVF9RVERFTVVYIChwYXJlbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgIlJlY2VpdmVkIGJ1ZmZlciBwdHM6JSIgR1NUX1RJTUVfRk9STUFUICIgZHRzOiUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiBvZmZzZXQ6JSIgR19HVUlOVDY0X0ZPUk1BVCAiIHNpemU6JSIgR19HU0laRV9GT1JNQVQgIiBkZW11eCBvZmZzZXQ6JSIKKyAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfUFRTIChpbmJ1ZikpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVFMgKGluYnVmKSksIEdTVF9CVUZGRVJfT0ZGU0VUIChpbmJ1ZiksCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChpbmJ1ZiksIGRlbXV4LT5vZmZzZXQpOworCisgIGlmIChHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChpbmJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpKSB7CisgICAgZ2Jvb2xlYW4gaXNfZ2FwX2lucHV0ID0gRkFMU0U7CisgICAgZ2ludCBpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJHb3QgRElTQ09OVCwgbWFya2luZyBhbGwgc3RyZWFtcyBhcyBESVNDT05UIik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGVtdXgtPm5fc3RyZWFtczsgaSsrKSB7CisgICAgICBkZW11eC0+c3RyZWFtc1tpXS0+ZGlzY29udCA9IFRSVUU7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgd2UgY2FuIGxhbmQgYmFjayBvbiBvdXIgZmVldCBpbiB0aGUgY2FzZSB3aGVyZSB1cHN0cmVhbSBpcworICAgICAqIGhhbmRsaW5nIHRoZSBzZWVraW5nL3B1c2hpbmcgb2Ygc2FtcGxlcyB3aXRoIGdhcHMgaW4gYmV0d2VlbiAobGlrZQorICAgICAqIGluIHRoZSBjYXNlIG9mIHRyaWNrLW1vZGUgREFTSCBmb3IgZXhhbXBsZSkgKi8KKyAgICBpZiAoZGVtdXgtPnVwc3RyZWFtX2Zvcm1hdF9pc190aW1lCisgICAgICAgICYmIEdTVF9CVUZGRVJfT0ZGU0VUIChpbmJ1ZikgIT0gR1NUX0JVRkZFUl9PRkZTRVRfTk9ORSkgeworICAgICAgZ2ludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IGRlbXV4LT5uX3N0cmVhbXM7IGkrKykgeworICAgICAgICBndWludDMyIHJlczsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgIlN0cmVhbSAjJWQgLCBjaGVja2luZyBpZiBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAgICAgIiBpcyBhIHNhbXBsZSBzdGFydCIsIGksIEdTVF9CVUZGRVJfT0ZGU0VUIChpbmJ1ZikpOworICAgICAgICByZXMgPQorICAgICAgICAgICAgZ3N0X3F0ZGVtdXhfZmluZF9pbmRleF9mb3JfZ2l2ZW5fbWVkaWFfb2Zmc2V0X2xpbmVhciAoZGVtdXgsCisgICAgICAgICAgICBkZW11eC0+c3RyZWFtc1tpXSwgR1NUX0JVRkZFUl9PRkZTRVQgKGluYnVmKSk7CisgICAgICAgIGlmIChyZXMgIT0gLTEpIHsKKyAgICAgICAgICBRdERlbXV4U2FtcGxlICpzYW1wbGUgPSAmZGVtdXgtPnN0cmVhbXNbaV0tPnNhbXBsZXNbcmVzXTsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICJDaGVja2luZyBpZiBzYW1wbGUgJWQgZnJvbSBzdHJlYW0gJWQgaXMgdmFsaWQgKG9mZnNldDolIgorICAgICAgICAgICAgICBHX0dVSU5UNjRfRk9STUFUICIgc2l6ZTolIiBHX0dVSU5UMzJfRk9STUFUICIpIiwgcmVzLCBpLAorICAgICAgICAgICAgICBzYW1wbGUtPm9mZnNldCwgc2FtcGxlLT5zaXplKTsKKyAgICAgICAgICBpZiAoc2FtcGxlLT5vZmZzZXQgPT0gR1NUX0JVRkZFUl9PRkZTRVQgKGluYnVmKSkgeworICAgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgICAgICJuZXcgYnVmZmVyIGNvcnJlc3BvbmRzIHRvIGEgdmFsaWQgc2FtcGxlIDogJSIgR19HVUlOVDMyX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICByZXMpOworICAgICAgICAgICAgaXNfZ2FwX2lucHV0ID0gVFJVRTsKKyAgICAgICAgICAgIC8qIFdlIGNhbiBnbyBiYWNrIHRvIHN0YW5kYXJkIHBsYXliYWNrIG1vZGUgKi8KKyAgICAgICAgICAgIGRlbXV4LT5zdGF0ZSA9IFFUREVNVVhfU1RBVEVfTU9WSUU7CisgICAgICAgICAgICAvKiBSZW1lbWJlciB3aGljaCBzYW1wbGUgdGhpcyBzdHJlYW0gaXMgYXQgKi8KKyAgICAgICAgICAgIGRlbXV4LT5zdHJlYW1zW2ldLT5zYW1wbGVfaW5kZXggPSByZXM7CisgICAgICAgICAgICAvKiBGaW5hbGx5IHVwZGF0ZSBhbGwgcHVzaC1iYXNlZCB2YWx1ZXMgdG8gdGhlIGV4cGVjdGVkIHZhbHVlcyAqLworICAgICAgICAgICAgZGVtdXgtPm5lZWRlZGJ5dGVzID0gZGVtdXgtPnN0cmVhbXNbaV0tPnNhbXBsZXNbcmVzXS5zaXplOworICAgICAgICAgICAgZGVtdXgtPm9mZnNldCA9IEdTVF9CVUZGRVJfT0ZGU0VUIChpbmJ1Zik7CisgICAgICAgICAgICBkZW11eC0+bWRhdGxlZnQgPQorICAgICAgICAgICAgICAgIGRlbXV4LT5tZGF0c2l6ZSAtIGRlbXV4LT5vZmZzZXQgKyBkZW11eC0+bWRhdG9mZnNldDsKKyAgICAgICAgICAgIGRlbXV4LT50b2Ryb3AgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFpc19nYXBfaW5wdXQpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJSZXNldHRpbmcsIGFjdHVhbCBESVNDT05UIik7CisgICAgICAgIC8qIFJlc2V0IHN0YXRlIGlmIGl0J3MgYSByZWFsIGRpc2NvbnQgKi8KKyAgICAgICAgZGVtdXgtPm5lZWRlZGJ5dGVzID0gMTY7CisgICAgICAgIGRlbXV4LT5zdGF0ZSA9IFFUREVNVVhfU1RBVEVfSU5JVElBTDsKKyAgICAgICAgZGVtdXgtPm9mZnNldCA9IEdTVF9CVUZGRVJfT0ZGU0VUIChpbmJ1Zik7CisgICAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChkZW11eC0+YWRhcHRlcik7CisgICAgICB9CisgICAgfQorICAgIC8qIFJldmVyc2UgZnJhZ21lbnRlZCBwbGF5YmFjaywgbmVlZCB0byBmbHVzaCBhbGwgd2UgaGF2ZSBiZWZvcmUKKyAgICAgKiBjb25zdW1pbmcgYSBuZXcgZnJhZ21lbnQuCisgICAgICogVGhlIHNhbXBsZXMgYXJyYXkgaGF2ZSB0aGUgdGltZXN0YW1wcyBjYWxjdWxhdGVkIGJ5IGFjY3VtdWxhdGluZyB0aGUKKyAgICAgKiBkdXJhdGlvbnMgYnV0IHRoaXMgd29uJ3Qgd29yayBmb3IgcmV2ZXJzZSBwbGF5YmFjayBvZiBmcmFnbWVudHMgYXMKKyAgICAgKiB0aGUgdGltZXN0YW1wcyBvZiBhIHN1YnNlcXVlbnQgZnJhZ21lbnQgc2hvdWxkIGJlIHNtYWxsZXIgdGhhbiB0aGUKKyAgICAgKiBwcmV2aW91c2x5IHJlY2VpdmVkIG9uZS4gKi8KKyAgICBpZiAoIWlzX2dhcF9pbnB1dCAmJiBkZW11eC0+ZnJhZ21lbnRlZCAmJiBkZW11eC0+c2VnbWVudC5yYXRlIDwgMCkgeworICAgICAgZ3N0X3F0ZGVtdXhfcHJvY2Vzc19hZGFwdGVyIChkZW11eCwgVFJVRSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgZGVtdXgtPm5fc3RyZWFtczsgaSsrKQorICAgICAgICBnc3RfcXRkZW11eF9zdHJlYW1fZmx1c2hfc2FtcGxlc19kYXRhIChkZW11eCwgZGVtdXgtPnN0cmVhbXNbaV0pOworICAgIH0KKyAgfQorCisgIGdzdF9hZGFwdGVyX3B1c2ggKGRlbXV4LT5hZGFwdGVyLCBpbmJ1Zik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAicHVzaGluZyBpbiBpbmJ1ZiAlcCwgbmVlZGVkYnl0ZXM6JXUsIGF2YWlsYWJsZTolIiBHX0dTSVpFX0ZPUk1BVCwgaW5idWYsCisgICAgICBkZW11eC0+bmVlZGVkYnl0ZXMsIGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoZGVtdXgtPmFkYXB0ZXIpKTsKKworICByZXR1cm4gZ3N0X3F0ZGVtdXhfcHJvY2Vzc19hZGFwdGVyIChkZW11eCwgRkFMU0UpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3F0ZGVtdXhfcHJvY2Vzc19hZGFwdGVyIChHc3RRVERlbXV4ICogZGVtdXgsIGdib29sZWFuIGZvcmNlKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworCisgIC8qIHdlIG5ldmVyIHJlYWxseSBtZWFuIHRvIGJ1ZmZlciB0aGF0IG11Y2ggKi8KKyAgaWYgKGRlbXV4LT5uZWVkZWRieXRlcyA9PSAtMSkgeworICAgIGdvdG8gZW9zOworICB9CisKKyAgd2hpbGUgKCgoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZW11eC0+YWRhcHRlcikpID49IGRlbXV4LT5uZWVkZWRieXRlcykgJiYKKyAgICAgIChyZXQgPT0gR1NUX0ZMT1dfT0sgfHwgKHJldCA9PSBHU1RfRkxPV19OT1RfTElOS0VEICYmIGZvcmNlKSkpIHsKKworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgICB7CisgICAgICBndWludDY0IGRpc2NvbnRfb2Zmc2V0LCBkaXN0YW5jZV9mcm9tX2Rpc2NvbnQ7CisKKyAgICAgIGRpc2NvbnRfb2Zmc2V0ID0gZ3N0X2FkYXB0ZXJfb2Zmc2V0X2F0X2Rpc2NvbnQgKGRlbXV4LT5hZGFwdGVyKTsKKyAgICAgIGRpc3RhbmNlX2Zyb21fZGlzY29udCA9CisgICAgICAgICAgZ3N0X2FkYXB0ZXJfZGlzdGFuY2VfZnJvbV9kaXNjb250IChkZW11eC0+YWRhcHRlcik7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICJzdGF0ZTolcyAsIGRlbXV4LT5uZWVkZWRieXRlczolZCwgZGVtdXgtPm9mZnNldDolIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgIiBhZGFwdGVyIG9mZnNldCA6JSIgR19HVUlOVDY0X0ZPUk1BVCAiICgrICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICAgICAiIGJ5dGVzKSIsIHF0X2RlbXV4X3N0YXRlX3N0cmluZyAoZGVtdXgtPnN0YXRlKSwgZGVtdXgtPm5lZWRlZGJ5dGVzLAorICAgICAgICAgIGRlbXV4LT5vZmZzZXQsIGRpc2NvbnRfb2Zmc2V0LCBkaXN0YW5jZV9mcm9tX2Rpc2NvbnQpOworICAgIH0KKyNlbmRpZgorCisgICAgc3dpdGNoIChkZW11eC0+c3RhdGUpIHsKKyAgICAgIGNhc2UgUVRERU1VWF9TVEFURV9JTklUSUFMOnsKKyAgICAgICAgY29uc3QgZ3VpbnQ4ICpkYXRhOworICAgICAgICBndWludDMyIGZvdXJjYzsKKyAgICAgICAgZ3VpbnQ2NCBzaXplOworCisgICAgICAgIGdzdF9xdGRlbXV4X2NoZWNrX3NlZWthYmlsaXR5IChkZW11eCk7CisKKyAgICAgICAgZGF0YSA9IGdzdF9hZGFwdGVyX21hcCAoZGVtdXgtPmFkYXB0ZXIsIGRlbXV4LT5uZWVkZWRieXRlcyk7CisKKyAgICAgICAgLyogZ2V0IGZvdXJjYy9sZW5ndGgsIHNldCBuZWVkZWRieXRlcyAqLworICAgICAgICBleHRyYWN0X2luaXRpYWxfbGVuZ3RoX2FuZF9mb3VyY2MgKChndWludDggKikgZGF0YSwgZGVtdXgtPm5lZWRlZGJ5dGVzLAorICAgICAgICAgICAgJnNpemUsICZmb3VyY2MpOworICAgICAgICBnc3RfYWRhcHRlcl91bm1hcCAoZGVtdXgtPmFkYXB0ZXIpOworICAgICAgICBkYXRhID0gTlVMTDsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJQZWVraW5nIGZvdW5kIFslIiBHU1RfRk9VUkNDX0ZPUk1BVCAiXSAiCisgICAgICAgICAgICAic2l6ZTogJSIgR19HVUlOVDY0X0ZPUk1BVCwgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpLCBzaXplKTsKKyAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZW11eCwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgICAgICAgKF8oIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIpKSwKKyAgICAgICAgICAgICAgKCJpbml0aWFsIGF0b20gJyUiIEdTVF9GT1VSQ0NfRk9STUFUICInIGhhcyBlbXB0eSBsZW5ndGgiLAorICAgICAgICAgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKSk7CisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvdXJjYyA9PSBGT1VSQ0NfbWRhdCkgeworICAgICAgICAgIGdpbnQgbmV4dF9lbnRyeSA9IG5leHRfZW50cnlfc2l6ZSAoZGVtdXgpOworICAgICAgICAgIGlmIChkZW11eC0+bl9zdHJlYW1zID4gMCAmJiAobmV4dF9lbnRyeSAhPSAtMSB8fCAhZGVtdXgtPmZyYWdtZW50ZWQpKSB7CisgICAgICAgICAgICAvKiB3ZSBoYXZlIHRoZSBoZWFkZXJzLCBzdGFydCBwbGF5YmFjayAqLworICAgICAgICAgICAgZGVtdXgtPnN0YXRlID0gUVRERU1VWF9TVEFURV9NT1ZJRTsKKyAgICAgICAgICAgIGRlbXV4LT5uZWVkZWRieXRlcyA9IG5leHRfZW50cnk7CisgICAgICAgICAgICBkZW11eC0+bWRhdGxlZnQgPSBzaXplOworICAgICAgICAgICAgZGVtdXgtPm1kYXRzaXplID0gZGVtdXgtPm1kYXRsZWZ0OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBubyBoZWFkZXJzIHlldCwgdHJ5IHRvIGdldCB0aGVtICovCisgICAgICAgICAgICBndWludCBiczsKKyAgICAgICAgICAgIGdib29sZWFuIHJlczsKKyAgICAgICAgICAgIGd1aW50NjQgb2xkLCB0YXJnZXQ7CisKKyAgICAgICAgICBidWZmZXJfZGF0YToKKyAgICAgICAgICAgIG9sZCA9IGRlbXV4LT5vZmZzZXQ7CisgICAgICAgICAgICB0YXJnZXQgPSBvbGQgKyBzaXplOworCisgICAgICAgICAgICAvKiB0cnkgdG8ganVtcCBvdmVyIHRoZSBhdG9tIHdpdGggYSBzZWVrICovCisgICAgICAgICAgICAvKiBvbmx5IGJvdGhlciBpZiBpdCBzZWVtcyB3b3J0aCBkb2luZyBzbywKKyAgICAgICAgICAgICAqIGFuZCBhdm9pZHMgcG9zc2libGUgdXBzdHJlYW0vc2VydmVyIHByb2JsZW1zICovCisgICAgICAgICAgICBpZiAoZGVtdXgtPnVwc3RyZWFtX3NlZWthYmxlICYmCisgICAgICAgICAgICAgICAgZGVtdXgtPnVwc3RyZWFtX3NpemUgPiA0ICogKDEgPDwgMjApKSB7CisgICAgICAgICAgICAgIHJlcyA9IHF0ZGVtdXhfc2Vla19vZmZzZXQgKGRlbXV4LCB0YXJnZXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJza2lwcGluZyBzZWVrIik7CisgICAgICAgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAic2VlayBzdWNjZXNzIik7CisgICAgICAgICAgICAgIC8qIHJlbWVtYmVyIHRoZSBvZmZzZXQgZm8gdGhlIGZpcnN0IG1kYXQgc28gd2UgY2FuIHNlZWsgYmFjayB0byBpdAorICAgICAgICAgICAgICAgKiBhZnRlciB3ZSBoYXZlIHRoZSBoZWFkZXJzICovCisgICAgICAgICAgICAgIGlmIChmb3VyY2MgPT0gRk9VUkNDX21kYXQgJiYgZGVtdXgtPmZpcnN0X21kYXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBkZW11eC0+Zmlyc3RfbWRhdCA9IG9sZDsKKyAgICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImZpcnN0IG1kYXQgYXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgZGVtdXgtPmZpcnN0X21kYXQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIC8qIHNlZWsgd29ya2VkLCBjb250aW51ZSByZWFkaW5nICovCisgICAgICAgICAgICAgIGRlbXV4LT5vZmZzZXQgPSB0YXJnZXQ7CisgICAgICAgICAgICAgIGRlbXV4LT5uZWVkZWRieXRlcyA9IDE2OworICAgICAgICAgICAgICBkZW11eC0+c3RhdGUgPSBRVERFTVVYX1NUQVRFX0lOSVRJQUw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvKiBzZWVrIGZhaWxlZCwgbmVlZCB0byBidWZmZXIgKi8KKyAgICAgICAgICAgICAgZGVtdXgtPm9mZnNldCA9IG9sZDsKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJzZWVrIGZhaWxlZC9za2lwcGVkIik7CisgICAgICAgICAgICAgIC8qIHRoZXJlIG1heSBiZSBtdWx0aXBsZSBtZGF0IChvciBhbGlrZSkgYnVmZmVycyAqLworICAgICAgICAgICAgICAvKiBzYW5pdHkgY2hlY2sgKi8KKyAgICAgICAgICAgICAgaWYgKGRlbXV4LT5tZGF0YnVmZmVyKQorICAgICAgICAgICAgICAgIGJzID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZGVtdXgtPm1kYXRidWZmZXIpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnMgPSAwOworICAgICAgICAgICAgICBpZiAoc2l6ZSArIGJzID4gMTAgKiAoMSA8PCAyMCkpCisgICAgICAgICAgICAgICAgZ290byBub19tb292OworICAgICAgICAgICAgICBkZW11eC0+c3RhdGUgPSBRVERFTVVYX1NUQVRFX0JVRkZFUl9NREFUOworICAgICAgICAgICAgICBkZW11eC0+bmVlZGVkYnl0ZXMgPSBzaXplOworICAgICAgICAgICAgICBpZiAoIWRlbXV4LT5tZGF0YnVmZmVyKQorICAgICAgICAgICAgICAgIGRlbXV4LT5tZGF0b2Zmc2V0ID0gZGVtdXgtPm9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoR19VTkxJS0VMWSAoc2l6ZSA+IFFUREVNVVhfTUFYX0FUT01fU0laRSkpIHsKKyAgICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgREVNVVgsCisgICAgICAgICAgICAgIChfKCJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iKSksCisgICAgICAgICAgICAgICgiYXRvbSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIGhhcyBib2d1cyBzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYyksIHNpemUpKTsKKyAgICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiB0aGlzIG1lYW5zIHdlIGFscmVhZHkgc3RhcnRlZCBidWZmZXJpbmcgYW5kIHN0aWxsIG5vIG1vb3YgaGVhZGVyLAorICAgICAgICAgICAqIGxldCdzIGNvbnRpbnVlIGJ1ZmZlcmluZyBldmVyeXRoaW5nIHRpbGwgd2UgZ2V0IG1vb3YgKi8KKyAgICAgICAgICBpZiAoZGVtdXgtPm1kYXRidWZmZXIgJiYgIShmb3VyY2MgPT0gRk9VUkNDX21vb3YKKyAgICAgICAgICAgICAgICAgIHx8IGZvdXJjYyA9PSBGT1VSQ0NfbW9vZikpCisgICAgICAgICAgICBnb3RvIGJ1ZmZlcl9kYXRhOworICAgICAgICAgIGRlbXV4LT5uZWVkZWRieXRlcyA9IHNpemU7CisgICAgICAgICAgZGVtdXgtPnN0YXRlID0gUVRERU1VWF9TVEFURV9IRUFERVI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIFFUREVNVVhfU1RBVEVfSEVBREVSOnsKKyAgICAgICAgY29uc3QgZ3VpbnQ4ICpkYXRhOworICAgICAgICBndWludDMyIGZvdXJjYzsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIkluIGhlYWRlciIpOworCisgICAgICAgIGRhdGEgPSBnc3RfYWRhcHRlcl9tYXAgKGRlbXV4LT5hZGFwdGVyLCBkZW11eC0+bmVlZGVkYnl0ZXMpOworCisgICAgICAgIC8qIHBhcnNlIHRoZSBoZWFkZXIgKi8KKyAgICAgICAgZXh0cmFjdF9pbml0aWFsX2xlbmd0aF9hbmRfZm91cmNjIChkYXRhLCBkZW11eC0+bmVlZGVkYnl0ZXMsIE5VTEwsCisgICAgICAgICAgICAmZm91cmNjKTsKKyAgICAgICAgaWYgKGZvdXJjYyA9PSBGT1VSQ0NfbW9vdikgeworICAgICAgICAgIGdpbnQgbjsKKworICAgICAgICAgIC8qIGluIHVzdWFsIGZyYWdtZW50ZWQgc2V0dXAgd2UgY291bGQgdHJ5IHRvIHNjYW4gZm9yIG1vcmUKKyAgICAgICAgICAgKiBhbmQgZW5kIHVwIGF0IHRoZSB0aGUgbW9vdiAoYWZ0ZXIgbWRhdCkgYWdhaW4gKi8KKyAgICAgICAgICBpZiAoZGVtdXgtPmdvdF9tb292ICYmIGRlbXV4LT5uX3N0cmVhbXMgPiAwICYmCisgICAgICAgICAgICAgICghZGVtdXgtPmZyYWdtZW50ZWQKKyAgICAgICAgICAgICAgICAgIHx8IGRlbXV4LT5sYXN0X21vb3Zfb2Zmc2V0ID09IGRlbXV4LT5vZmZzZXQpKSB7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgICAiU2tpcHBpbmcgbW9vdiBhdG9tIGFzIHdlIGhhdmUgKHRoaXMpIG9uZSBhbHJlYWR5Iik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiUGFyc2luZyBbbW9vdl0iKTsKKworICAgICAgICAgICAgaWYgKGRlbXV4LT5nb3RfbW9vdiAmJiBkZW11eC0+ZnJhZ21lbnRlZCkgeworICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgICAgICJHb3QgYSBzZWNvbmQgbW9vdiwgY2xlYW4gdXAgZGF0YSBmcm9tIG9sZCBvbmUiKTsKKyAgICAgICAgICAgICAgaWYgKGRlbXV4LT5tb292X25vZGVfY29tcHJlc3NlZCkgeworICAgICAgICAgICAgICAgIGdfbm9kZV9kZXN0cm95IChkZW11eC0+bW9vdl9ub2RlX2NvbXByZXNzZWQpOworICAgICAgICAgICAgICAgIGlmIChkZW11eC0+bW9vdl9ub2RlKQorICAgICAgICAgICAgICAgICAgZ19mcmVlIChkZW11eC0+bW9vdl9ub2RlLT5kYXRhKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBkZW11eC0+bW9vdl9ub2RlX2NvbXByZXNzZWQgPSBOVUxMOworICAgICAgICAgICAgICBpZiAoZGVtdXgtPm1vb3Zfbm9kZSkKKyAgICAgICAgICAgICAgICBnX25vZGVfZGVzdHJveSAoZGVtdXgtPm1vb3Zfbm9kZSk7CisgICAgICAgICAgICAgIGRlbXV4LT5tb292X25vZGUgPSBOVUxMOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLyogcHJlcGFyZSBuZXdzZWdtZW50IHRvIHNlbmQgd2hlbiBzdHJlYW1pbmcgYWN0dWFsbHkgc3RhcnRzICovCisgICAgICAgICAgICAgIGlmICghZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCkgeworICAgICAgICAgICAgICAgIGRlbXV4LT5wZW5kaW5nX25ld3NlZ21lbnQgPQorICAgICAgICAgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZkZW11eC0+c2VnbWVudCk7CisgICAgICAgICAgICAgICAgaWYgKGRlbXV4LT5zZWdtZW50X3NlcW51bSAhPSBHU1RfU0VRTlVNX0lOVkFMSUQpCisgICAgICAgICAgICAgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICBkZW11eC0+c2VnbWVudF9zZXFudW0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlbXV4LT5sYXN0X21vb3Zfb2Zmc2V0ID0gZGVtdXgtPm9mZnNldDsKKworICAgICAgICAgICAgcXRkZW11eF9wYXJzZV9tb292IChkZW11eCwgZGF0YSwgZGVtdXgtPm5lZWRlZGJ5dGVzKTsKKyAgICAgICAgICAgIHF0ZGVtdXhfbm9kZV9kdW1wIChkZW11eCwgZGVtdXgtPm1vb3Zfbm9kZSk7CisgICAgICAgICAgICBxdGRlbXV4X3BhcnNlX3RyZWUgKGRlbXV4KTsKKyAgICAgICAgICAgIHF0ZGVtdXhfcHJlcGFyZV9zdHJlYW1zIChkZW11eCk7CisgICAgICAgICAgICBpZiAoIWRlbXV4LT5nb3RfbW9vdikKKyAgICAgICAgICAgICAgcXRkZW11eF9leHBvc2Vfc3RyZWFtcyAoZGVtdXgpOworICAgICAgICAgICAgZWxzZSB7CisKKyAgICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IGRlbXV4LT5uX3N0cmVhbXM7IG4rKykgeworICAgICAgICAgICAgICAgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbSA9IGRlbXV4LT5zdHJlYW1zW25dOworCisgICAgICAgICAgICAgICAgZ3N0X3F0ZGVtdXhfY29uZmlndXJlX3N0cmVhbSAoZGVtdXgsIHN0cmVhbSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVtdXgtPmdvdF9tb292ID0gVFJVRTsKKyAgICAgICAgICAgIGdzdF9xdGRlbXV4X2NoZWNrX3NlbmRfcGVuZGluZ19zZWdtZW50IChkZW11eCk7CisKKyAgICAgICAgICAgIC8qIGZyYWdtZW50ZWQgc3RyZWFtcyBoZWFkZXJzIHNob3VsZG4ndCBjb250YWluIGVkdHMgYXRvbXMgKi8KKyAgICAgICAgICAgIGlmICghZGVtdXgtPmZyYWdtZW50ZWQpIHsKKyAgICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IGRlbXV4LT5uX3N0cmVhbXM7IG4rKykgeworICAgICAgICAgICAgICAgIGdzdF9xdGRlbXV4X3N0cmVhbV9zZW5kX2luaXRpYWxfZ2FwX3NlZ21lbnRzIChkZW11eCwKKyAgICAgICAgICAgICAgICAgICAgZGVtdXgtPnN0cmVhbXNbbl0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkZW11eC0+bW9vdl9ub2RlX2NvbXByZXNzZWQpIHsKKyAgICAgICAgICAgICAgZ19ub2RlX2Rlc3Ryb3kgKGRlbXV4LT5tb292X25vZGVfY29tcHJlc3NlZCk7CisgICAgICAgICAgICAgIGdfZnJlZSAoZGVtdXgtPm1vb3Zfbm9kZS0+ZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZW11eC0+bW9vdl9ub2RlX2NvbXByZXNzZWQgPSBOVUxMOworICAgICAgICAgICAgZ19ub2RlX2Rlc3Ryb3kgKGRlbXV4LT5tb292X25vZGUpOworICAgICAgICAgICAgZGVtdXgtPm1vb3Zfbm9kZSA9IE5VTEw7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIkZpbmlzaGVkIHBhcnNpbmcgdGhlIGhlYWRlciIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChmb3VyY2MgPT0gRk9VUkNDX21vb2YpIHsKKyAgICAgICAgICBpZiAoKGRlbXV4LT5nb3RfbW9vdiB8fCBkZW11eC0+bWVkaWFfY2FwcykgJiYgZGVtdXgtPmZyYWdtZW50ZWQpIHsKKyAgICAgICAgICAgIGd1aW50NjQgZGlzdCA9IDA7CisgICAgICAgICAgICBHc3RDbG9ja1RpbWUgcHJldl9wdHM7CisgICAgICAgICAgICBndWludDY0IHByZXZfb2Zmc2V0OworICAgICAgICAgICAgZ3VpbnQ2NCBhZGFwdGVyX2Rpc2NvbnRfb2Zmc2V0LCBhZGFwdGVyX2Rpc2NvbnRfZGlzdDsKKworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJQYXJzaW5nIFttb29mXSIpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9vZiBidWZmZXIgaXMgcmVsZXZhbnQgYXMgc29tZSBzY2VuYXJpb3MKKyAgICAgICAgICAgICAqIHdvbid0IGhhdmUgdGhlIGluaXRpYWwgdGltZXN0YW1wIGluIHRoZSBhdG9tcy4gV2hlbmV2ZXIgYSBuZXcKKyAgICAgICAgICAgICAqIGJ1ZmZlciBoYXMgc3RhcnRlZCwgd2UgZ2V0IHRoYXQgYnVmZmVyJ3MgUFRTIGFuZCB1c2UgaXQgYXMgYSBiYXNlCisgICAgICAgICAgICAgKiB0aW1lc3RhbXAgZm9yIHRoZSB0cnVuIGVudHJpZXMuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVG8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBidWZmZXIgdGltZXN0YW1wIGFuZCBzdGFydGluZyBwb2ludAorICAgICAgICAgICAgICogd2UgdXNlIGdzdF9hZGFwdGVyX3ByZXZfcHRzIHRoYXQgZ2l2ZXMgdXMgdGhlIFBUUyBhbmQgdGhlIGRpc3RhbmNlCisgICAgICAgICAgICAgKiBmcm9tIHRoZSBiZWdnaW5pbmcgb2YgdGhlIGJ1ZmZlciwgd2l0aCB0aGUgZGlzdGFuY2UgYW5kIGRlbXV4LT5vZmZzZXQKKyAgICAgICAgICAgICAqIHdlIGtub3cgaWYgaXQgaXMgc3RpbGwgdGhlIHNhbWUgYnVmZmVyIG9yIG5vdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHJldl9wdHMgPSBnc3RfYWRhcHRlcl9wcmV2X3B0cyAoZGVtdXgtPmFkYXB0ZXIsICZkaXN0KTsKKyAgICAgICAgICAgIHByZXZfb2Zmc2V0ID0gZGVtdXgtPm9mZnNldCAtIGRpc3Q7CisgICAgICAgICAgICBpZiAoZGVtdXgtPmZyYWdtZW50X3N0YXJ0X29mZnNldCA9PSAtMQorICAgICAgICAgICAgICAgIHx8IHByZXZfb2Zmc2V0ID4gZGVtdXgtPmZyYWdtZW50X3N0YXJ0X29mZnNldCkgeworICAgICAgICAgICAgICBkZW11eC0+ZnJhZ21lbnRfc3RhcnRfb2Zmc2V0ID0gcHJldl9vZmZzZXQ7CisgICAgICAgICAgICAgIGRlbXV4LT5mcmFnbWVudF9zdGFydCA9IHByZXZfcHRzOworICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgICAgICJOZXcgZnJhZ21lbnQgc3RhcnQgZm91bmQgYXQ6ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiA6ICUiCisgICAgICAgICAgICAgICAgICBHU1RfVElNRV9GT1JNQVQsIGRlbXV4LT5mcmFnbWVudF9zdGFydF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+ZnJhZ21lbnRfc3RhcnQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogV2UgY2FuJ3QgdXNlIHByZXZfb2Zmc2V0KCkgaGVyZSBiZWNhdXNlIHRoaXMgd291bGQgcmVxdWlyZQorICAgICAgICAgICAgICogdXBzdHJlYW0gdG8gc2V0IGNvbnNpc3RlbnQgYW5kIGNvcnJlY3Qgb2Zmc2V0cyBvbiBhbGwgYnVmZmVycworICAgICAgICAgICAgICogc2luY2UgdGhlIGRpc2NvbnQuIE5vdGhpbmcgZXZlciBkaWQgdGhhdCBpbiB0aGUgcGFzdCBhbmQgd2UKKyAgICAgICAgICAgICAqIHdvdWxkIGJyZWFrIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGhlcmUgdGhlbi4KKyAgICAgICAgICAgICAqIEluc3RlYWQgdGFrZSB0aGUgb2Zmc2V0IHdlIGhhZCBhdCB0aGUgbGFzdCBkaXNjb250IGFuZCBjb3VudAorICAgICAgICAgICAgICogdGhlIGJ5dGVzIGZyb20gdGhlcmUuIFRoaXMgd29ya3Mgd2l0aCBvbGQgY29kZSBhcyB0aGVyZSB3b3VsZAorICAgICAgICAgICAgICogYmUgbm8gZGlzY29udCBiZXR3ZWVuIG1vb3YgYW5kIG1vb2YsIGFuZCBhbHNvIHdvcmtzIHdpdGgKKyAgICAgICAgICAgICAqIGFkYXB0aXZlZGVtdXggd2hpY2ggY29ycmVjdGx5IHNldHMgb2Zmc2V0IGFuZCB3aWxsIHNldCB0aGUKKyAgICAgICAgICAgICAqIERJU0NPTlQgZmxhZyBhY2NvcmRpbmdseSB3aGVuIG5lZWRlZC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBXZSBhbHNvIG9ubHkgZG8gdGhpcyBmb3IgdXBzdHJlYW0gVElNRSBzZWdtZW50cyBhcyBvdGhlcndpc2UKKyAgICAgICAgICAgICAqIHRoZXJlIGFyZSBwb3RlbnRpYWwgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgd2l0aAorICAgICAgICAgICAgICogc2Vla2luZyBpbiBQVVNIIG1vZGUgYW5kIHVwc3RyZWFtIHByb3ZpZGluZyBpbmNvbnNpc3RlbnQKKyAgICAgICAgICAgICAqIHRpbWVzdGFtcHMuICovCisgICAgICAgICAgICBhZGFwdGVyX2Rpc2NvbnRfb2Zmc2V0ID0KKyAgICAgICAgICAgICAgICBnc3RfYWRhcHRlcl9vZmZzZXRfYXRfZGlzY29udCAoZGVtdXgtPmFkYXB0ZXIpOworICAgICAgICAgICAgYWRhcHRlcl9kaXNjb250X2Rpc3QgPQorICAgICAgICAgICAgICAgIGdzdF9hZGFwdGVyX2Rpc3RhbmNlX2Zyb21fZGlzY29udCAoZGVtdXgtPmFkYXB0ZXIpOworCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgICAiZGVtdXggb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBhZGFwdGVyIG9mZnNldCAlIgorICAgICAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIiAoKyAlIiBHX0dVSU5UNjRfRk9STUFUICIgYnl0ZXMpIiwKKyAgICAgICAgICAgICAgICBkZW11eC0+b2Zmc2V0LCBhZGFwdGVyX2Rpc2NvbnRfb2Zmc2V0LCBhZGFwdGVyX2Rpc2NvbnRfZGlzdCk7CisKKyAgICAgICAgICAgIGlmIChkZW11eC0+dXBzdHJlYW1fZm9ybWF0X2lzX3RpbWUpIHsKKyAgICAgICAgICAgICAgZGVtdXgtPm1vb2Zfb2Zmc2V0ID0gYWRhcHRlcl9kaXNjb250X29mZnNldDsKKyAgICAgICAgICAgICAgaWYgKGRlbXV4LT5tb29mX29mZnNldCAhPSBHU1RfQlVGRkVSX09GRlNFVF9OT05FKQorICAgICAgICAgICAgICAgIGRlbXV4LT5tb29mX29mZnNldCArPSBhZGFwdGVyX2Rpc2NvbnRfZGlzdDsKKyAgICAgICAgICAgICAgaWYgKGRlbXV4LT5tb29mX29mZnNldCA9PSBHU1RfQlVGRkVSX09GRlNFVF9OT05FKQorICAgICAgICAgICAgICAgIGRlbXV4LT5tb29mX29mZnNldCA9IGRlbXV4LT5vZmZzZXQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBkZW11eC0+bW9vZl9vZmZzZXQgPSBkZW11eC0+b2Zmc2V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXF0ZGVtdXhfcGFyc2VfbW9vZiAoZGVtdXgsIGRhdGEsIGRlbXV4LT5uZWVkZWRieXRlcywKKyAgICAgICAgICAgICAgICAgICAgZGVtdXgtPm1vb2Zfb2Zmc2V0LCBOVUxMKSkgeworICAgICAgICAgICAgICBnc3RfYWRhcHRlcl91bm1hcCAoZGVtdXgtPmFkYXB0ZXIpOworICAgICAgICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogaW4gTVNTIHdlIG5lZWQgdG8gZXhwb3NlIHRoZSBwYWRzIGFmdGVyIHRoZSBmaXJzdCBtb29mIGFzIHdlIHdvbid0IGdldCBhIG1vb3YgKi8KKyAgICAgICAgICAgIGlmIChkZW11eC0+bXNzX21vZGUgJiYgIWRlbXV4LT5leHBvc2VkKSB7CisgICAgICAgICAgICAgIGlmICghZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCkgeworICAgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAibmV3IHBlbmRpbmdfbmV3c2VnbWVudCIpOworICAgICAgICAgICAgICAgIGRlbXV4LT5wZW5kaW5nX25ld3NlZ21lbnQgPQorICAgICAgICAgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZkZW11eC0+c2VnbWVudCk7CisgICAgICAgICAgICAgICAgaWYgKGRlbXV4LT5zZWdtZW50X3NlcW51bSAhPSBHU1RfU0VRTlVNX0lOVkFMSUQpCisgICAgICAgICAgICAgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICBkZW11eC0+c2VnbWVudF9zZXFudW0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHF0ZGVtdXhfZXhwb3NlX3N0cmVhbXMgKGRlbXV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJEaXNjYXJkaW5nIFttb29mXSIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChmb3VyY2MgPT0gRk9VUkNDX2Z0eXApIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlBhcnNpbmcgW2Z0eXBdIik7CisgICAgICAgICAgcXRkZW11eF9wYXJzZV9mdHlwIChkZW11eCwgZGF0YSwgZGVtdXgtPm5lZWRlZGJ5dGVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChmb3VyY2MgPT0gRk9VUkNDX3V1aWQpIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlBhcnNpbmcgW3V1aWRdIik7CisgICAgICAgICAgcXRkZW11eF9wYXJzZV91dWlkIChkZW11eCwgZGF0YSwgZGVtdXgtPm5lZWRlZGJ5dGVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChmb3VyY2MgPT0gRk9VUkNDX3NpZHgpIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlBhcnNpbmcgW3NpZHhdIik7CisgICAgICAgICAgcXRkZW11eF9wYXJzZV9zaWR4IChkZW11eCwgZGF0YSwgZGVtdXgtPm5lZWRlZGJ5dGVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzd2l0Y2ggKGZvdXJjYykgeworICAgICAgICAgICAgY2FzZSBGT1VSQ0Nfc3R5cDoKKyAgICAgICAgICAgICAgLyogW3N0eXBdIGlzIGxpa2UgYSBbZnR5cF0sIGJ1dCBpbiBmcmFnbWVudCBoZWFkZXIuIFdlIGlnbm9yZSBpdCBmb3Igbm93CisgICAgICAgICAgICAgICAqIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICBjYXNlIEZPVVJDQ19za2lwOgorICAgICAgICAgICAgY2FzZSBGT1VSQ0NfZnJlZToKKyAgICAgICAgICAgICAgLyogW2ZyZWVdIGFuZCBbc2tpcF0gYXJlIHBhZGRpbmcgYXRvbXMgKi8KKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICAgICAiU2tpcHBpbmcgZm91cmNjIHdoaWxlIHBhcnNpbmcgaGVhZGVyIDogJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYykpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICAgICAiVW5rbm93biBmb3VyY2Mgd2hpbGUgcGFyc2luZyBoZWFkZXIgOiAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSk7CisgICAgICAgICAgICAgIC8qIExldCdzIGp1bXAgdGhhdCBvbmUgYW5kIGdvIGJhY2sgdG8gaW5pdGlhbCBzdGF0ZSAqLworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKGRlbXV4LT5hZGFwdGVyKTsKKyAgICAgICAgZGF0YSA9IE5VTEw7CisKKyAgICAgICAgaWYgKGRlbXV4LT5tZGF0YnVmZmVyICYmIGRlbXV4LT5uX3N0cmVhbXMpIHsKKyAgICAgICAgICBnc2l6ZSByZW1haW5pbmdfZGF0YV9zaXplID0gMDsKKworICAgICAgICAgIC8qIHRoZSBtZGF0IHdhcyBiZWZvcmUgdGhlIGhlYWRlciAqLworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiV2UgaGF2ZSBuX3N0cmVhbXM6JWQgYW5kIG1kYXRidWZmZXI6JXAiLAorICAgICAgICAgICAgICBkZW11eC0+bl9zdHJlYW1zLCBkZW11eC0+bWRhdGJ1ZmZlcik7CisgICAgICAgICAgLyogcmVzdG9yZSBvdXIgYWRhcHRlci9vZmZzZXQgdmlldyBvZiB0aGluZ3Mgd2l0aCB1cHN0cmVhbTsKKyAgICAgICAgICAgKiBwdXQgcHJlY2VkaW5nIGJ1ZmZlcmVkIGRhdGEgYWhlYWQgb2YgY3VycmVudCBtb292IGRhdGEuCisgICAgICAgICAgICogVGhpcyBzaG91bGQgYWxzbyBoYW5kbGUgZXZpbCBtZGF0LCBtb292LCBtZGF0IGNhc2VzIGFuZCBhbGlrZSAqLworICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChkZW11eC0+YWRhcHRlciwgZGVtdXgtPm5lZWRlZGJ5dGVzKTsKKworICAgICAgICAgIC8qIFN0b3JlIGFueSByZW1haW5pbmcgZGF0YSBhZnRlciB0aGUgbWRhdCBmb3IgbGF0ZXIgdXNhZ2UgKi8KKyAgICAgICAgICByZW1haW5pbmdfZGF0YV9zaXplID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZW11eC0+YWRhcHRlcik7CisgICAgICAgICAgaWYgKHJlbWFpbmluZ19kYXRhX3NpemUgPiAwKSB7CisgICAgICAgICAgICBnX2Fzc2VydCAoZGVtdXgtPnJlc3RvcmVkYXRhX2J1ZmZlciA9PSBOVUxMKTsKKyAgICAgICAgICAgIGRlbXV4LT5yZXN0b3JlZGF0YV9idWZmZXIgPQorICAgICAgICAgICAgICAgIGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChkZW11eC0+YWRhcHRlciwgcmVtYWluaW5nX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBkZW11eC0+cmVzdG9yZWRhdGFfb2Zmc2V0ID0gZGVtdXgtPm9mZnNldCArIGRlbXV4LT5uZWVkZWRieXRlczsKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgICAgICJTdG9yZWQgJSIgR19HU0laRV9GT1JNQVQgIiBwb3N0IG1kYXQgYnl0ZXMgYXQgb2Zmc2V0ICUiCisgICAgICAgICAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgcmVtYWluaW5nX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICBkZW11eC0+cmVzdG9yZWRhdGFfb2Zmc2V0KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBnc3RfYWRhcHRlcl9wdXNoIChkZW11eC0+YWRhcHRlciwgZGVtdXgtPm1kYXRidWZmZXIpOworICAgICAgICAgIGRlbXV4LT5tZGF0YnVmZmVyID0gTlVMTDsKKyAgICAgICAgICBkZW11eC0+b2Zmc2V0ID0gZGVtdXgtPm1kYXRvZmZzZXQ7CisgICAgICAgICAgZGVtdXgtPm5lZWRlZGJ5dGVzID0gbmV4dF9lbnRyeV9zaXplIChkZW11eCk7CisgICAgICAgICAgZGVtdXgtPnN0YXRlID0gUVRERU1VWF9TVEFURV9NT1ZJRTsKKyAgICAgICAgICBkZW11eC0+bWRhdGxlZnQgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGRlbXV4LT5hZGFwdGVyKTsKKyAgICAgICAgICBkZW11eC0+bWRhdHNpemUgPSBkZW11eC0+bWRhdGxlZnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJDYXJyeWluZyBvbiBub3JtYWxseSIpOworICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChkZW11eC0+YWRhcHRlciwgZGVtdXgtPm5lZWRlZGJ5dGVzKTsKKworICAgICAgICAgIC8qIG9ubHkgZ28gYmFjayB0byB0aGUgbWRhdCBpZiB0aGVyZSBhcmUgc2FtcGxlcyB0byBwbGF5ICovCisgICAgICAgICAgaWYgKGRlbXV4LT5nb3RfbW9vdiAmJiBkZW11eC0+Zmlyc3RfbWRhdCAhPSAtMQorICAgICAgICAgICAgICAmJiBoYXNfbmV4dF9lbnRyeSAoZGVtdXgpKSB7CisgICAgICAgICAgICBnYm9vbGVhbiByZXM7CisKKyAgICAgICAgICAgIC8qIHdlIG5lZWQgdG8gc2VlayBiYWNrICovCisgICAgICAgICAgICByZXMgPSBxdGRlbXV4X3NlZWtfb2Zmc2V0IChkZW11eCwgZGVtdXgtPmZpcnN0X21kYXQpOworICAgICAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgICAgICBkZW11eC0+b2Zmc2V0ID0gZGVtdXgtPmZpcnN0X21kYXQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlNlZWsgYmFjayBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVtdXgtPm9mZnNldCArPSBkZW11eC0+bmVlZGVkYnl0ZXM7CisgICAgICAgICAgfQorICAgICAgICAgIGRlbXV4LT5uZWVkZWRieXRlcyA9IDE2OworICAgICAgICAgIGRlbXV4LT5zdGF0ZSA9IFFUREVNVVhfU1RBVEVfSU5JVElBTDsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBRVERFTVVYX1NUQVRFX0JVRkZFUl9NREFUOnsKKyAgICAgICAgR3N0QnVmZmVyICpidWY7CisgICAgICAgIGd1aW50OCBmb3VyY2NbNF07CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJHb3Qgb3VyIGJ1ZmZlciBhdCBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgIGRlbXV4LT5vZmZzZXQpOworICAgICAgICBidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoZGVtdXgtPmFkYXB0ZXIsIGRlbXV4LT5uZWVkZWRieXRlcyk7CisgICAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoYnVmLCAwLCBmb3VyY2MsIDQpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIm1kYXRidWZmZXIgc3RhcnRzIHdpdGggJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKFFUX0ZPVVJDQyAoZm91cmNjKSkpOworICAgICAgICBpZiAoZGVtdXgtPm1kYXRidWZmZXIpCisgICAgICAgICAgZGVtdXgtPm1kYXRidWZmZXIgPSBnc3RfYnVmZmVyX2FwcGVuZCAoZGVtdXgtPm1kYXRidWZmZXIsIGJ1Zik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBkZW11eC0+bWRhdGJ1ZmZlciA9IGJ1ZjsKKyAgICAgICAgZGVtdXgtPm9mZnNldCArPSBkZW11eC0+bmVlZGVkYnl0ZXM7CisgICAgICAgIGRlbXV4LT5uZWVkZWRieXRlcyA9IDE2OworICAgICAgICBkZW11eC0+c3RhdGUgPSBRVERFTVVYX1NUQVRFX0lOSVRJQUw7CisgICAgICAgIGdzdF9xdGRlbXV4X3Bvc3RfcHJvZ3Jlc3MgKGRlbXV4LCAxLCAxKTsKKworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgUVRERU1VWF9TVEFURV9NT1ZJRTp7CisgICAgICAgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbSA9IE5VTEw7CisgICAgICAgIFF0RGVtdXhTYW1wbGUgKnNhbXBsZTsKKyAgICAgICAgaW50IGkgPSAtMTsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIGR0cywgcHRzLCBkdXJhdGlvbjsKKyAgICAgICAgZ2Jvb2xlYW4ga2V5ZnJhbWU7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAiQkVHSU4gLy8gaW4gTU9WSUUgZm9yIG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFULCBkZW11eC0+b2Zmc2V0KTsKKworICAgICAgICBpZiAoZGVtdXgtPmZyYWdtZW50ZWQpIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIm1kYXQgcmVtYWluaW5nICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICAgIGRlbXV4LT5tZGF0bGVmdCk7CisgICAgICAgICAgaWYgKEdfTElLRUxZIChkZW11eC0+dG9kcm9wIDwgZGVtdXgtPm1kYXRsZWZ0KSkgeworICAgICAgICAgICAgLyogaWYgbmVlZGVkIGRhdGEgc3RhcnRzIHdpdGhpbiB0aGlzIGF0b20sCisgICAgICAgICAgICAgKiB0aGVuIGl0IHNob3VsZCBub3QgZXhjZWVkIHRoaXMgYXRvbSAqLworICAgICAgICAgICAgaWYgKEdfVU5MSUtFTFkgKGRlbXV4LT5uZWVkZWRieXRlcyA+IGRlbXV4LT5tZGF0bGVmdCkpIHsKKyAgICAgICAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlbXV4LCBTVFJFQU0sIERFTVVYLAorICAgICAgICAgICAgICAgICAgKF8oIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIpKSwKKyAgICAgICAgICAgICAgICAgICgic2FtcGxlIGRhdGEgY3Jvc3NlcyBhdG9tIGJvdW5kYXJ5IikpOworICAgICAgICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZW11eC0+bWRhdGxlZnQgLT0gZGVtdXgtPm5lZWRlZGJ5dGVzOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImRhdGEgYXRvbSBlbXB0aWVkOyByZXN1bWluZyBhdG9tIHNjYW4iKTsKKyAgICAgICAgICAgIC8qIHNvIHdlIGFyZSBkcm9wcGluZyBtb3JlIHRoYW4gbGVmdCBpbiB0aGlzIGF0b20gKi8KKyAgICAgICAgICAgIGdzdF9xdGRlbXV4X2Ryb3BfZGF0YSAoZGVtdXgsIGRlbXV4LT5tZGF0bGVmdCk7CisgICAgICAgICAgICBkZW11eC0+bWRhdGxlZnQgPSAwOworCisgICAgICAgICAgICAvKiBuZWVkIHRvIHJlc3VtZSBhdG9tIHBhcnNpbmcgc28gd2UgZG8gbm90IG1pc3MgYW55IG90aGVyIHBpZWNlcyAqLworICAgICAgICAgICAgZGVtdXgtPnN0YXRlID0gUVRERU1VWF9TVEFURV9JTklUSUFMOworICAgICAgICAgICAgZGVtdXgtPm5lZWRlZGJ5dGVzID0gMTY7CisKKyAgICAgICAgICAgIC8qIGNoZWNrIGlmIHRoZXJlIHdhcyBhbnkgc3RvcmVkIHBvc3QgbWRhdCBkYXRhIGZyb20gcHJldmlvdXMgYnVmZmVycyAqLworICAgICAgICAgICAgaWYgKGRlbXV4LT5yZXN0b3JlZGF0YV9idWZmZXIpIHsKKyAgICAgICAgICAgICAgZ19hc3NlcnQgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoZGVtdXgtPmFkYXB0ZXIpID09IDApOworCisgICAgICAgICAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKGRlbXV4LT5hZGFwdGVyLCBkZW11eC0+cmVzdG9yZWRhdGFfYnVmZmVyKTsKKyAgICAgICAgICAgICAgZGVtdXgtPnJlc3RvcmVkYXRhX2J1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgIGRlbXV4LT5vZmZzZXQgPSBkZW11eC0+cmVzdG9yZWRhdGFfb2Zmc2V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVtdXgtPnRvZHJvcCkgeworICAgICAgICAgIGlmIChkZW11eC0+Y2VuY19hdXhfaW5mb19vZmZzZXQgPiAwKSB7CisgICAgICAgICAgICBHc3RCeXRlUmVhZGVyIGJyOworICAgICAgICAgICAgY29uc3QgZ3VpbnQ4ICpkYXRhOworCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInBhcnNpbmcgY2VuYyBhdXhpbGlhcnkgaW5mbyIpOworICAgICAgICAgICAgZGF0YSA9IGdzdF9hZGFwdGVyX21hcCAoZGVtdXgtPmFkYXB0ZXIsIGRlbXV4LT50b2Ryb3ApOworICAgICAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZiciwgZGF0YSArIDgsIGRlbXV4LT50b2Ryb3ApOworICAgICAgICAgICAgaWYgKCFxdGRlbXV4X3BhcnNlX2NlbmNfYXV4X2luZm8gKGRlbXV4LCBkZW11eC0+c3RyZWFtc1swXSwgJmJyLAorICAgICAgICAgICAgICAgICAgICBkZW11eC0+Y2VuY19hdXhfaW5mb19zaXplcywgZGVtdXgtPmNlbmNfYXV4X3NhbXBsZV9jb3VudCkpIHsKKyAgICAgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoZGVtdXgsICJmYWlsZWQgdG8gcGFyc2UgY2VuYyBhdXhpbGlhcnkgaW5mbyIpOworICAgICAgICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgICAgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKGRlbXV4LT5hZGFwdGVyKTsKKyAgICAgICAgICAgICAgZ19mcmVlIChkZW11eC0+Y2VuY19hdXhfaW5mb19zaXplcyk7CisgICAgICAgICAgICAgIGRlbXV4LT5jZW5jX2F1eF9pbmZvX3NpemVzID0gTlVMTDsKKyAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVtdXgtPmNlbmNfYXV4X2luZm9fb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGdfZnJlZSAoZGVtdXgtPmNlbmNfYXV4X2luZm9fc2l6ZXMpOworICAgICAgICAgICAgZGVtdXgtPmNlbmNfYXV4X2luZm9fc2l6ZXMgPSBOVUxMOworICAgICAgICAgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKGRlbXV4LT5hZGFwdGVyKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ3N0X3F0ZGVtdXhfZHJvcF9kYXRhIChkZW11eCwgZGVtdXgtPnRvZHJvcCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBmaXJzdCBidWZmZXI/ICovCisgICAgICAgIC8qIGluaXRpYWwgbmV3c2VnbWVudCBzZW50IGhlcmUgYWZ0ZXIgaGF2aW5nIGFkZGVkIHBhZHMsCisgICAgICAgICAqIHBvc3NpYmxlIG90aGVycyBpbiBzaW5rX2V2ZW50ICovCisgICAgICAgIGdzdF9xdGRlbXV4X2NoZWNrX3NlbmRfcGVuZGluZ19zZWdtZW50IChkZW11eCk7CisKKyAgICAgICAgLyogRmlndXJlIG91dCB3aGljaCBzdHJlYW0gdGhpcyBwYWNrZXQgYmVsb25ncyB0byAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGVtdXgtPm5fc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgc3RyZWFtID0gZGVtdXgtPnN0cmVhbXNbaV07CisgICAgICAgICAgaWYgKHN0cmVhbS0+c2FtcGxlX2luZGV4ID49IHN0cmVhbS0+bl9zYW1wbGVzKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgICAiQ2hlY2tpbmcgc3RyZWFtICVkIChzYW1wbGVfaW5kZXg6JWQgLyBvZmZzZXQ6JSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAgICAgICAiIC8gc2l6ZTolZCkiLCBpLCBzdHJlYW0tPnNhbXBsZV9pbmRleCwKKyAgICAgICAgICAgICAgc3RyZWFtLT5zYW1wbGVzW3N0cmVhbS0+c2FtcGxlX2luZGV4XS5vZmZzZXQsCisgICAgICAgICAgICAgIHN0cmVhbS0+c2FtcGxlc1tzdHJlYW0tPnNhbXBsZV9pbmRleF0uc2l6ZSk7CisKKyAgICAgICAgICBpZiAoc3RyZWFtLT5zYW1wbGVzW3N0cmVhbS0+c2FtcGxlX2luZGV4XS5vZmZzZXQgPT0gZGVtdXgtPm9mZnNldCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbSA9PSBOVUxMIHx8IGkgPT0gZGVtdXgtPm5fc3RyZWFtcykpCisgICAgICAgICAgZ290byB1bmtub3duX3N0cmVhbTsKKworICAgICAgICBnc3RfcXRkZW11eF9zdHJlYW1fY2hlY2tfYW5kX2NoYW5nZV9zdHNkX2luZGV4IChkZW11eCwgc3RyZWFtKTsKKworICAgICAgICBpZiAoc3RyZWFtLT5uZXdfY2FwcykgeworICAgICAgICAgIGdzdF9xdGRlbXV4X2NvbmZpZ3VyZV9zdHJlYW0gKGRlbXV4LCBzdHJlYW0pOworICAgICAgICB9CisKKyAgICAgICAgLyogUHV0IGRhdGEgaW4gYSBidWZmZXIsIHNldCB0aW1lc3RhbXBzLCBjYXBzLCAuLi4gKi8KKyAgICAgICAgc2FtcGxlID0gJnN0cmVhbS0+c2FtcGxlc1tzdHJlYW0tPnNhbXBsZV9pbmRleF07CisKKyAgICAgICAgaWYgKEdfTElLRUxZICghKFNUUkVBTV9JU19FT1MgKHN0cmVhbSkpKSkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAic3RyZWFtIDogJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Zm91cmNjKSk7CisKKyAgICAgICAgICBkdHMgPSBRVFNBTVBMRV9EVFMgKHN0cmVhbSwgc2FtcGxlKTsKKyAgICAgICAgICBwdHMgPSBRVFNBTVBMRV9QVFMgKHN0cmVhbSwgc2FtcGxlKTsKKyAgICAgICAgICBkdXJhdGlvbiA9IFFUU0FNUExFX0RVUl9EVFMgKHN0cmVhbSwgc2FtcGxlLCBkdHMpOworICAgICAgICAgIGtleWZyYW1lID0gUVRTQU1QTEVfS0VZRlJBTUUgKHN0cmVhbSwgc2FtcGxlKTsKKworICAgICAgICAgIC8qIGNoZWNrIGZvciBzZWdtZW50IGVuZCAqLworICAgICAgICAgIGlmIChHX1VOTElLRUxZIChkZW11eC0+c2VnbWVudC5zdG9wICE9IC0xCisgICAgICAgICAgICAgICAgICAmJiBkZW11eC0+c2VnbWVudC5zdG9wIDw9IHB0cyAmJiBzdHJlYW0tPm9uX2tleWZyYW1lKSkgeworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJ3ZSByZWFjaGVkIHRoZSBlbmQgb2Ygb3VyIHNlZ21lbnQuIik7CisgICAgICAgICAgICBzdHJlYW0tPnRpbWVfcG9zaXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOyAgICAgICAgLyogdGhpcyBtZWFucyBFT1MgKi8KKworICAgICAgICAgICAgLyogc2tpcCB0aGlzIGRhdGEsIHN0cmVhbSBpcyBFT1MgKi8KKyAgICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChkZW11eC0+YWRhcHRlciwgZGVtdXgtPm5lZWRlZGJ5dGVzKTsKKyAgICAgICAgICAgIGRlbXV4LT5vZmZzZXQgKz0gZGVtdXgtPm5lZWRlZGJ5dGVzOworCisgICAgICAgICAgICAvKiBjaGVjayBpZiBhbGwgc3RyZWFtcyBhcmUgZW9zICovCisgICAgICAgICAgICByZXQgPSBHU1RfRkxPV19FT1M7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGVtdXgtPm5fc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICAgIGlmICghU1RSRUFNX0lTX0VPUyAoZGVtdXgtPnN0cmVhbXNbaV0pKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR3N0QnVmZmVyICpvdXRidWY7CisKKyAgICAgICAgICAgIG91dGJ1ZiA9CisgICAgICAgICAgICAgICAgZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKGRlbXV4LT5hZGFwdGVyLCBkZW11eC0+bmVlZGVkYnl0ZXMpOworCisgICAgICAgICAgICAvKiBGSVhNRTogc2hvdWxkIGVpdGhlciBiZSBhbiBhc3NlcnQgb3IgYSBwbGFpbiBjaGVjayAqLworICAgICAgICAgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKG91dGJ1ZiAhPSBOVUxMLCBHU1RfRkxPV19FUlJPUik7CisKKyAgICAgICAgICAgIHJldCA9IGdzdF9xdGRlbXV4X2RlY29yYXRlX2FuZF9wdXNoX2J1ZmZlciAoZGVtdXgsIHN0cmVhbSwgb3V0YnVmLAorICAgICAgICAgICAgICAgIGR0cywgcHRzLCBkdXJhdGlvbiwga2V5ZnJhbWUsIGR0cywgZGVtdXgtPm9mZnNldCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogY29tYmluZSBmbG93cyAqLworICAgICAgICAgIHJldCA9IGdzdF9xdGRlbXV4X2NvbWJpbmVfZmxvd3MgKGRlbXV4LCBzdHJlYW0sIHJldCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogc2tpcCB0aGlzIGRhdGEsIHN0cmVhbSBpcyBFT1MgKi8KKyAgICAgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAoZGVtdXgtPmFkYXB0ZXIsIGRlbXV4LT5uZWVkZWRieXRlcyk7CisgICAgICAgIH0KKworICAgICAgICBzdHJlYW0tPnNhbXBsZV9pbmRleCsrOworICAgICAgICBzdHJlYW0tPm9mZnNldF9pbl9zYW1wbGUgPSAwOworCisgICAgICAgIC8qIHVwZGF0ZSBjdXJyZW50IG9mZnNldCBhbmQgZmlndXJlIG91dCBzaXplIG9mIG5leHQgYnVmZmVyICovCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgImluY3JlYXNpbmcgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBieSAldSIsCisgICAgICAgICAgICBkZW11eC0+b2Zmc2V0LCBkZW11eC0+bmVlZGVkYnl0ZXMpOworICAgICAgICBkZW11eC0+b2Zmc2V0ICs9IGRlbXV4LT5uZWVkZWRieXRlczsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAib2Zmc2V0IGlzIG5vdyAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgZGVtdXgtPm9mZnNldCk7CisKKworICAgICAgICBpZiAocmV0ID09IEdTVF9GTE9XX0VPUykgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiQWxsIHN0cmVhbXMgYXJlIEVPUywgc2lnbmFsIHVwc3RyZWFtIik7CisgICAgICAgICAgZGVtdXgtPm5lZWRlZGJ5dGVzID0gLTE7CisgICAgICAgICAgZ290byBlb3M7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGRlbXV4LT5uZWVkZWRieXRlcyA9IG5leHRfZW50cnlfc2l6ZSAoZGVtdXgpKSA9PSAtMSkgeworICAgICAgICAgIGlmIChkZW11eC0+ZnJhZ21lbnRlZCkgeworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICIodGVtcG9yYXJpbHkpIG91dCBvZiBmcmFnbWVudGVkIHNhbXBsZXMiKTsKKyAgICAgICAgICAgIC8qIHRoZXJlIG1heSBiZSBtb3JlIHRvIGZvbGxvdywgb25seSBmaW5pc2ggdGhpcyBhdG9tICovCisgICAgICAgICAgICBkZW11eC0+dG9kcm9wID0gZGVtdXgtPm1kYXRsZWZ0OworICAgICAgICAgICAgZGVtdXgtPm5lZWRlZGJ5dGVzID0gZGVtdXgtPnRvZHJvcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBnb3RvIGVvczsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LICYmIHJldCAhPSBHU1RfRkxPV19OT1RfTElOS0VEKSB7CisgICAgICAgICAgZ290byBub25fb2tfdW5saW5rZWRfZmxvdzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gaW52YWxpZF9zdGF0ZTsKKyAgICB9CisgIH0KKworICAvKiB3aGVuIGJ1ZmZlcmluZyBtb3ZpZSBkYXRhLCBhdCBsZWFzdCBzaG93IHVzZXIgc29tZXRoaW5nIGlzIGhhcHBlbmluZyAqLworICBpZiAocmV0ID09IEdTVF9GTE9XX09LICYmIGRlbXV4LT5zdGF0ZSA9PSBRVERFTVVYX1NUQVRFX0JVRkZFUl9NREFUICYmCisgICAgICBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGRlbXV4LT5hZGFwdGVyKSA8PSBkZW11eC0+bmVlZGVkYnl0ZXMpIHsKKyAgICBnc3RfcXRkZW11eF9wb3N0X3Byb2dyZXNzIChkZW11eCwgZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZW11eC0+YWRhcHRlciksCisgICAgICAgIGRlbXV4LT5uZWVkZWRieXRlcyk7CisgIH0KK2RvbmU6CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK25vbl9va191bmxpbmtlZF9mbG93OgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJTdG9wcGluZywgY29tYmluZWQgcmV0dXJuIGZsb3cgJXMiLAorICAgICAgICBnc3RfZmxvd19nZXRfbmFtZSAocmV0KSk7CisgICAgcmV0dXJuIHJldDsKKyAgfQordW5rbm93bl9zdHJlYW06CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgRkFJTEVELCAoTlVMTCksICgidW5rbm93biBzdHJlYW0gZm91bmQiKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBkb25lOworICB9Citlb3M6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIm5vIG5leHQgZW50cnksIEVPUyIpOworICAgIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgICBnb3RvIGRvbmU7CisgIH0KK2ludmFsaWRfc3RhdGU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgRkFJTEVELAorICAgICAgICAoTlVMTCksICgicXRkZW11eGVyIGludmFsaWQgc3RhdGUgJWQiLCBkZW11eC0+c3RhdGUpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGRvbmU7CisgIH0KK25vX21vb3Y6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgRkFJTEVELAorICAgICAgICAoTlVMTCksICgibm8gJ21vb3YnIGF0b20gd2l0aGluIHRoZSBmaXJzdCAxMCBNQiIpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X3NpbmtfYWN0aXZhdGUgKEdzdFBhZCAqIHNpbmtwYWQsIEdzdE9iamVjdCAqIHBhcmVudCkKK3sKKyAgR3N0UXVlcnkgKnF1ZXJ5OworICBnYm9vbGVhbiBwdWxsX21vZGU7CisKKyAgcXVlcnkgPSBnc3RfcXVlcnlfbmV3X3NjaGVkdWxpbmcgKCk7CisKKyAgaWYgKCFnc3RfcGFkX3BlZXJfcXVlcnkgKHNpbmtwYWQsIHF1ZXJ5KSkgeworICAgIGdzdF9xdWVyeV91bnJlZiAocXVlcnkpOworICAgIGdvdG8gYWN0aXZhdGVfcHVzaDsKKyAgfQorCisgIHB1bGxfbW9kZSA9IGdzdF9xdWVyeV9oYXNfc2NoZWR1bGluZ19tb2RlX3dpdGhfZmxhZ3MgKHF1ZXJ5LAorICAgICAgR1NUX1BBRF9NT0RFX1BVTEwsIEdTVF9TQ0hFRFVMSU5HX0ZMQUdfU0VFS0FCTEUpOworICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKworICBpZiAoIXB1bGxfbW9kZSkKKyAgICBnb3RvIGFjdGl2YXRlX3B1c2g7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2lua3BhZCwgImFjdGl2YXRpbmcgcHVsbCIpOworICByZXR1cm4gZ3N0X3BhZF9hY3RpdmF0ZV9tb2RlIChzaW5rcGFkLCBHU1RfUEFEX01PREVfUFVMTCwgVFJVRSk7CisKK2FjdGl2YXRlX3B1c2g6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rcGFkLCAiYWN0aXZhdGluZyBwdXNoIik7CisgICAgcmV0dXJuIGdzdF9wYWRfYWN0aXZhdGVfbW9kZSAoc2lua3BhZCwgR1NUX1BBRF9NT0RFX1BVU0gsIFRSVUUpOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcXRkZW11eF9zaW5rX2FjdGl2YXRlX21vZGUgKEdzdFBhZCAqIHNpbmtwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RQYWRNb2RlIG1vZGUsIGdib29sZWFuIGFjdGl2ZSkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RRVERlbXV4ICpkZW11eCA9IEdTVF9RVERFTVVYIChwYXJlbnQpOworCisgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgR1NUX1BBRF9NT0RFX1BVU0g6CisgICAgICBkZW11eC0+cHVsbGJhc2VkID0gRkFMU0U7CisgICAgICByZXMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUEFEX01PREVfUFVMTDoKKyAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgZGVtdXgtPnB1bGxiYXNlZCA9IFRSVUU7CisgICAgICAgIHJlcyA9IGdzdF9wYWRfc3RhcnRfdGFzayAoc2lua3BhZCwgKEdzdFRhc2tGdW5jdGlvbikgZ3N0X3F0ZGVtdXhfbG9vcCwKKyAgICAgICAgICAgIHNpbmtwYWQsIE5VTEwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gZ3N0X3BhZF9zdG9wX3Rhc2sgKHNpbmtwYWQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IEZBTFNFOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworI2lmZGVmIEhBVkVfWkxJQgorc3RhdGljIHZvaWQgKgorcXRkZW11eF9pbmZsYXRlICh2b2lkICp6X2J1ZmZlciwgZ3VpbnQgel9sZW5ndGgsIGd1aW50ICogbGVuZ3RoKQoreworICBndWludDggKmJ1ZmZlcjsKKyAgel9zdHJlYW0gejsKKyAgaW50IHJldDsKKworICBtZW1zZXQgKCZ6LCAwLCBzaXplb2YgKHopKTsKKyAgei56YWxsb2MgPSBOVUxMOworICB6LnpmcmVlID0gTlVMTDsKKyAgei5vcGFxdWUgPSBOVUxMOworCisgIGlmICgocmV0ID0gaW5mbGF0ZUluaXQgKCZ6KSkgIT0gWl9PSykgeworICAgIEdTVF9FUlJPUiAoImluZmxhdGVJbml0KCkgcmV0dXJuZWQgJWQiLCByZXQpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgei5uZXh0X2luID0gel9idWZmZXI7CisgIHouYXZhaWxfaW4gPSB6X2xlbmd0aDsKKworICBidWZmZXIgPSAoZ3VpbnQ4ICopIGdfbWFsbG9jICgqbGVuZ3RoKTsKKyAgei5hdmFpbF9vdXQgPSAqbGVuZ3RoOworICB6Lm5leHRfb3V0ID0gKEJ5dGVmICopIGJ1ZmZlcjsKKyAgZG8geworICAgIHJldCA9IGluZmxhdGUgKCZ6LCBaX05PX0ZMVVNIKTsKKyAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkgeworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIGlmIChyZXQgIT0gWl9PSykgeworICAgICAgR1NUX1dBUk5JTkcgKCJpbmZsYXRlKCkgcmV0dXJuZWQgJWQiLCByZXQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgKmxlbmd0aCArPSA0MDk2OworICAgIGJ1ZmZlciA9IChndWludDggKikgZ19yZWFsbG9jIChidWZmZXIsICpsZW5ndGgpOworICAgIHoubmV4dF9vdXQgPSAoQnl0ZWYgKikgKGJ1ZmZlciArIHoudG90YWxfb3V0KTsKKyAgICB6LmF2YWlsX291dCArPSA0MDk2OworICB9IHdoaWxlICh6LmF2YWlsX2luID4gMCk7CisKKyAgaWYgKHJldCAhPSBaX1NUUkVBTV9FTkQpIHsKKyAgICBnX2ZyZWUgKGJ1ZmZlcik7CisgICAgYnVmZmVyID0gTlVMTDsKKyAgICAqbGVuZ3RoID0gMDsKKyAgfSBlbHNlIHsKKyAgICAqbGVuZ3RoID0gei50b3RhbF9vdXQ7CisgIH0KKworICBpbmZsYXRlRW5kICgmeik7CisKKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKyNlbmRpZiAvKiBIQVZFX1pMSUIgKi8KKworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X3BhcnNlX21vb3YgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBjb25zdCBndWludDggKiBidWZmZXIsIGd1aW50IGxlbmd0aCkKK3sKKyAgR05vZGUgKmNtb3Y7CisKKyAgcXRkZW11eC0+bW9vdl9ub2RlID0gZ19ub2RlX25ldyAoKGd1aW50OCAqKSBidWZmZXIpOworCisgIC8qIGNvdW50cyBhcyBoZWFkZXIgZGF0YSAqLworICBxdGRlbXV4LT5oZWFkZXJfc2l6ZSArPSBsZW5ndGg7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInBhcnNpbmcgJ21vb3YnIGF0b20iKTsKKyAgcXRkZW11eF9wYXJzZV9ub2RlIChxdGRlbXV4LCBxdGRlbXV4LT5tb292X25vZGUsIGJ1ZmZlciwgbGVuZ3RoKTsKKworICBjbW92ID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChxdGRlbXV4LT5tb292X25vZGUsIEZPVVJDQ19jbW92KTsKKyAgaWYgKGNtb3YpIHsKKyAgICBndWludDMyIG1ldGhvZDsKKyAgICBHTm9kZSAqZGNvbTsKKyAgICBHTm9kZSAqY212ZDsKKyAgICBndWludDMyIGRjb21fbGVuOworCisgICAgZGNvbSA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAoY21vdiwgRk9VUkNDX2Rjb20pOworICAgIGNtdmQgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKGNtb3YsIEZPVVJDQ19jbXZkKTsKKyAgICBpZiAoZGNvbSA9PSBOVUxMIHx8IGNtdmQgPT0gTlVMTCkKKyAgICAgIGdvdG8gaW52YWxpZF9jb21wcmVzc2lvbjsKKworICAgIGRjb21fbGVuID0gUVRfVUlOVDMyIChkY29tLT5kYXRhKTsKKyAgICBpZiAoZGNvbV9sZW4gPCAxMikKKyAgICAgIGdvdG8gaW52YWxpZF9jb21wcmVzc2lvbjsKKworICAgIG1ldGhvZCA9IFFUX0ZPVVJDQyAoKGd1aW50OCAqKSBkY29tLT5kYXRhICsgOCk7CisgICAgc3dpdGNoIChtZXRob2QpIHsKKyNpZmRlZiBIQVZFX1pMSUIKKyAgICAgIGNhc2UgRk9VUkNDX3psaWI6eworICAgICAgICBndWludCB1bmNvbXByZXNzZWRfbGVuZ3RoOworICAgICAgICBndWludCBjb21wcmVzc2VkX2xlbmd0aDsKKyAgICAgICAgZ3VpbnQ4ICpidWY7CisgICAgICAgIGd1aW50MzIgY212ZF9sZW47CisKKyAgICAgICAgY212ZF9sZW4gPSBRVF9VSU5UMzIgKChndWludDggKikgY212ZC0+ZGF0YSk7CisgICAgICAgIGlmIChjbXZkX2xlbiA8IDEyKQorICAgICAgICAgIGdvdG8gaW52YWxpZF9jb21wcmVzc2lvbjsKKworICAgICAgICB1bmNvbXByZXNzZWRfbGVuZ3RoID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIGNtdmQtPmRhdGEgKyA4KTsKKyAgICAgICAgY29tcHJlc3NlZF9sZW5ndGggPSBjbXZkX2xlbiAtIDEyOworICAgICAgICBHU1RfTE9HICgibGVuZ3RoID0gJXUiLCB1bmNvbXByZXNzZWRfbGVuZ3RoKTsKKworICAgICAgICBidWYgPQorICAgICAgICAgICAgKGd1aW50OCAqKSBxdGRlbXV4X2luZmxhdGUgKChndWludDggKikgY212ZC0+ZGF0YSArIDEyLAorICAgICAgICAgICAgY29tcHJlc3NlZF9sZW5ndGgsICZ1bmNvbXByZXNzZWRfbGVuZ3RoKTsKKworICAgICAgICBpZiAoYnVmKSB7CisgICAgICAgICAgcXRkZW11eC0+bW9vdl9ub2RlX2NvbXByZXNzZWQgPSBxdGRlbXV4LT5tb292X25vZGU7CisgICAgICAgICAgcXRkZW11eC0+bW9vdl9ub2RlID0gZ19ub2RlX25ldyAoYnVmKTsKKworICAgICAgICAgIHF0ZGVtdXhfcGFyc2Vfbm9kZSAocXRkZW11eCwgcXRkZW11eC0+bW9vdl9ub2RlLCBidWYsCisgICAgICAgICAgICAgIHVuY29tcHJlc3NlZF9sZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorI2VuZGlmIC8qIEhBVkVfWkxJQiAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAidW5rbm93biBvciB1bmhhbmRsZWQgaGVhZGVyIGNvbXByZXNzaW9uICIKKyAgICAgICAgICAgICJ0eXBlICUiIEdTVF9GT1VSQ0NfRk9STUFULCBHU1RfRk9VUkNDX0FSR1MgKG1ldGhvZCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX2NvbXByZXNzaW9uOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwgImludmFsaWQgY29tcHJlc3NlZCBoZWFkZXIiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X3BhcnNlX2NvbnRhaW5lciAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdOb2RlICogbm9kZSwgY29uc3QgZ3VpbnQ4ICogYnVmLAorICAgIGNvbnN0IGd1aW50OCAqIGVuZCkKK3sKKyAgd2hpbGUgKEdfVU5MSUtFTFkgKGJ1ZiA8IGVuZCkpIHsKKyAgICBHTm9kZSAqY2hpbGQ7CisgICAgZ3VpbnQzMiBsZW47CisKKyAgICBpZiAoR19VTkxJS0VMWSAoYnVmICsgNCA+IGVuZCkpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiYnVmZmVyIG92ZXJydW4iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBsZW4gPSBRVF9VSU5UMzIgKGJ1Zik7CisgICAgaWYgKEdfVU5MSUtFTFkgKGxlbiA9PSAwKSkgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJlbXB0eSBjb250YWluZXIiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoR19VTkxJS0VMWSAobGVuIDwgOCkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgImxlbmd0aCB0b28gc2hvcnQgKCVkIDwgOCkiLCBsZW4pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChHX1VOTElLRUxZIChsZW4gPiAoZW5kIC0gYnVmKSkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgImxlbmd0aCB0b28gbG9uZyAoJWQgPiAlZCkiLCBsZW4sCisgICAgICAgICAgKGdpbnQpIChlbmQgLSBidWYpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNoaWxkID0gZ19ub2RlX25ldyAoKGd1aW50OCAqKSBidWYpOworICAgIGdfbm9kZV9hcHBlbmQgKG5vZGUsIGNoaWxkKTsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgImFkZGluZyBuZXcgbm9kZSBvZiBsZW4gJWQiLCBsZW4pOworICAgIHF0ZGVtdXhfcGFyc2Vfbm9kZSAocXRkZW11eCwgY2hpbGQsIGJ1ZiwgbGVuKTsKKworICAgIGJ1ZiArPSBsZW47CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcXRkZW11eF9wYXJzZV90aGVvcmFfZXh0ZW5zaW9uIChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwKKyAgICBHTm9kZSAqIHhkeHQpCit7CisgIGludCBsZW4gPSBRVF9VSU5UMzIgKHhkeHQtPmRhdGEpOworICBndWludDggKmJ1ZiA9IHhkeHQtPmRhdGE7CisgIGd1aW50OCAqZW5kID0gYnVmICsgbGVuOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKworICAvKiBza2lwIHNpemUgYW5kIHR5cGUgKi8KKyAgYnVmICs9IDg7CisgIGVuZCAtPSA4OworCisgIHdoaWxlIChidWYgPCBlbmQpIHsKKyAgICBnaW50IHNpemU7CisgICAgZ3VpbnQzMiB0eXBlOworCisgICAgc2l6ZSA9IFFUX1VJTlQzMiAoYnVmKTsKKyAgICB0eXBlID0gUVRfRk9VUkNDIChidWYgKyA0KTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiJXAgJXAiLCBidWYsIGVuZCk7CisKKyAgICBpZiAoYnVmICsgc2l6ZSA+IGVuZCB8fCBzaXplIDw9IDApCisgICAgICBicmVhazsKKworICAgIGJ1ZiArPSA4OworICAgIHNpemUgLT0gODsKKworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgImhhdmUgY29va2llICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHR5cGUpKTsKKworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBGT1VSQ0NfdEN0SDoKKyAgICAgICAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzaXplKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl9maWxsIChidWZmZXIsIDAsIGJ1Ziwgc2l6ZSk7CisgICAgICAgIHN0cmVhbS0+YnVmZmVycyA9IGdfc2xpc3RfYXBwZW5kIChzdHJlYW0tPmJ1ZmZlcnMsIGJ1ZmZlcik7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAicGFyc2luZyB0aGVvcmEgaGVhZGVyIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGT1VSQ0NfdEN0XzoKKyAgICAgICAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzaXplKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl9maWxsIChidWZmZXIsIDAsIGJ1Ziwgc2l6ZSk7CisgICAgICAgIHN0cmVhbS0+YnVmZmVycyA9IGdfc2xpc3RfYXBwZW5kIChzdHJlYW0tPmJ1ZmZlcnMsIGJ1ZmZlcik7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAicGFyc2luZyB0aGVvcmEgY29tbWVudCIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk9VUkNDX3RDdEM6CisgICAgICAgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZSk7CisgICAgICAgIGdzdF9idWZmZXJfZmlsbCAoYnVmZmVyLCAwLCBidWYsIHNpemUpOworICAgICAgICBzdHJlYW0tPmJ1ZmZlcnMgPSBnX3NsaXN0X2FwcGVuZCAoc3RyZWFtLT5idWZmZXJzLCBidWZmZXIpOworICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInBhcnNpbmcgdGhlb3JhIGNvZGVib29rIik7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICAgInVua25vd24gdGhlb3JhIGNvb2tpZSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAodHlwZSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgYnVmICs9IHNpemU7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcXRkZW11eF9wYXJzZV9ub2RlIChHc3RRVERlbXV4ICogcXRkZW11eCwgR05vZGUgKiBub2RlLCBjb25zdCBndWludDggKiBidWZmZXIsCisgICAgZ3VpbnQgbGVuZ3RoKQoreworICBndWludDMyIGZvdXJjYyA9IDA7CisgIGd1aW50MzIgbm9kZV9sZW5ndGggPSAwOworICBjb25zdCBRdE5vZGVUeXBlICp0eXBlOworICBjb25zdCBndWludDggKmVuZDsKKworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInF0ZGVtdXhfcGFyc2UgYnVmZmVyICVwIGxlbmd0aCAldSIsIGJ1ZmZlciwgbGVuZ3RoKTsKKworICBpZiAoR19VTkxJS0VMWSAobGVuZ3RoIDwgOCkpCisgICAgZ290byBub3RfZW5vdWdoX2RhdGE7CisKKyAgbm9kZV9sZW5ndGggPSBRVF9VSU5UMzIgKGJ1ZmZlcik7CisgIGZvdXJjYyA9IFFUX0ZPVVJDQyAoYnVmZmVyICsgNCk7CisKKyAgLyogaWdub3JlIGVtcHR5IG5vZGVzICovCisgIGlmIChHX1VOTElLRUxZIChmb3VyY2MgPT0gMCB8fCBub2RlX2xlbmd0aCA9PSA4KSkKKyAgICByZXR1cm4gVFJVRTsKKworICB0eXBlID0gcXRkZW11eF90eXBlX2dldCAoZm91cmNjKTsKKworICBlbmQgPSBidWZmZXIgKyBsZW5ndGg7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAicGFyc2luZyAnJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIicsIGxlbmd0aD0ldSwgbmFtZSAnJXMnIiwKKyAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgbm9kZV9sZW5ndGgsIHR5cGUtPm5hbWUpOworCisgIGlmIChub2RlX2xlbmd0aCA+IGxlbmd0aCkKKyAgICBnb3RvIGJyb2tlbl9hdG9tX3NpemU7CisKKyAgaWYgKHR5cGUtPmZsYWdzICYgUVRfRkxBR19DT05UQUlORVIpIHsKKyAgICBxdGRlbXV4X3BhcnNlX2NvbnRhaW5lciAocXRkZW11eCwgbm9kZSwgYnVmZmVyICsgOCwgZW5kKTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZvdXJjYykgeworICAgICAgY2FzZSBGT1VSQ0Nfc3RzZDoKKyAgICAgIHsKKyAgICAgICAgaWYgKG5vZGVfbGVuZ3RoIDwgMjApIHsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInNraXBwaW5nIHNtYWxsIHN0c2QgYm94Iik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICJwYXJzaW5nIHN0c2QgKHNhbXBsZSB0YWJsZSwgc2FtcGxlIGRlc2NyaXB0aW9uKSBhdG9tIik7CisgICAgICAgIC8qIFNraXAgb3ZlciA4IGJ5dGUgYXRvbSBoZHIgKyAxIGJ5dGUgdmVyc2lvbiwgMyBieXRlcyBmbGFncywgNCBieXRlIG51bV9lbnRyaWVzICovCisgICAgICAgIHF0ZGVtdXhfcGFyc2VfY29udGFpbmVyIChxdGRlbXV4LCBub2RlLCBidWZmZXIgKyAxNiwgZW5kKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEZPVVJDQ19tcDRhOgorICAgICAgY2FzZSBGT1VSQ0NfYWxhYzoKKyAgICAgIGNhc2UgRk9VUkNDX2ZMYUM6CisgICAgICB7CisgICAgICAgIGd1aW50MzIgdmVyc2lvbjsKKyAgICAgICAgZ3VpbnQzMiBvZmZzZXQ7CisgICAgICAgIGd1aW50IG1pbl9zaXplOworCisgICAgICAgIC8qIGFsc28gcmVhZCBhbGFjIChvciB3aGF0ZXZlcikgaW4gc3RlYWQgb2YgbXA0YSBpbiB0aGUgZm9sbG93aW5nLAorICAgICAgICAgKiBzaW5jZSBhIHNpbWlsYXIgbGF5b3V0IGlzIHVzZWQgaW4gb3RoZXIgY2FzZXMgYXMgd2VsbCAqLworICAgICAgICBpZiAoZm91cmNjID09IEZPVVJDQ19tcDRhKQorICAgICAgICAgIG1pbl9zaXplID0gMjA7CisgICAgICAgIGVsc2UgaWYgKGZvdXJjYyA9PSBGT1VSQ0NfZkxhQykKKyAgICAgICAgICBtaW5fc2l6ZSA9IDg2OworICAgICAgICBlbHNlCisgICAgICAgICAgbWluX3NpemUgPSA0MDsKKworICAgICAgICAvKiBUaGVyZSBhcmUgdHdvIHRoaW5ncyB3ZSBtaWdodCBlbmNvdW50ZXIgaGVyZTogYSB0cnVlIG1wNGEgYXRvbSwgYW5kCisgICAgICAgICAgIGFuIG1wNGEgZW50cnkgaW4gYW4gc3RzZCBhdG9tLiBUaGUgbGF0dGVyIGlzIHdoYXQgd2UncmUgaW50ZXJlc3RlZAorICAgICAgICAgICBpbiwgYW5kIGl0IGxvb2tzIGxpa2UgYW4gYXRvbSwgYnV0IGlzbid0IHJlYWxseSBvbmUuIFRoZSB0cnVlIG1wNGEKKyAgICAgICAgICAgYXRvbSBpcyBzaG9ydCwgc28gd2UgZGV0ZWN0IGl0IGJhc2VkIG9uIGxlbmd0aCBoZXJlLiAqLworICAgICAgICBpZiAobGVuZ3RoIDwgbWluX3NpemUpIHsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInNraXBwaW5nIHNtYWxsICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgYm94IiwKKyAgICAgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qICd2ZXJzaW9uJyBoZXJlIGlzIHRoZSBzb3VuZCBzYW1wbGUgZGVzY3JpcHRpb24gdmVyc2lvbi4gVHlwZXMgMCBhbmQKKyAgICAgICAgICAgMSBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgUVRGRiByZWZlcmVuY2UsIGJ1dCB0eXBlIDIgaXMgbm90OiBpdCdzCisgICAgICAgICAgIGRlc2NyaWJlZCBpbiBBcHBsZSBoZWFkZXIgZmlsZXMgaW5zdGVhZCAoc3RydWN0IFNvdW5kRGVzY3JpcHRpb25WMgorICAgICAgICAgICBpbiBNb3ZpZXMuaCkgKi8KKyAgICAgICAgdmVyc2lvbiA9IFFUX1VJTlQxNiAoYnVmZmVyICsgMTYpOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICIlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIHZlcnNpb24gMHglMDh4IiwKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgdmVyc2lvbik7CisKKyAgICAgICAgLyogcGFyc2UgYW55IGVzZHMgZGVzY3JpcHRvcnMgKi8KKyAgICAgICAgc3dpdGNoICh2ZXJzaW9uKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgb2Zmc2V0ID0gMHgyNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIG9mZnNldCA9IDB4MzQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBvZmZzZXQgPSAweDQ4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICAgICAidW5oYW5kbGVkICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgdmVyc2lvbiAweCUwOHgiLAorICAgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgdmVyc2lvbik7CisgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mZnNldCkKKyAgICAgICAgICBxdGRlbXV4X3BhcnNlX2NvbnRhaW5lciAocXRkZW11eCwgbm9kZSwgYnVmZmVyICsgb2Zmc2V0LCBlbmQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgRk9VUkNDX21wNHY6CisgICAgICBjYXNlIEZPVVJDQ19NUDRWOgorICAgICAgY2FzZSBGT1VSQ0NfZm1wNDoKKyAgICAgIGNhc2UgRk9VUkNDX0ZNUDQ6CisgICAgICBjYXNlIEZPVVJDQ19hcGNzOgorICAgICAgY2FzZSBGT1VSQ0NfYXBjaDoKKyAgICAgIGNhc2UgRk9VUkNDX2FwY246CisgICAgICBjYXNlIEZPVVJDQ19hcGNvOgorICAgICAgY2FzZSBGT1VSQ0NfYXA0aDoKKyAgICAgIGNhc2UgRk9VUkNDX3h2aWQ6CisgICAgICBjYXNlIEZPVVJDQ19YVklEOgorICAgICAgY2FzZSBGT1VSQ0NfSDI2NDoKKyAgICAgIGNhc2UgRk9VUkNDX2F2YzE6CisgICAgICBjYXNlIEZPVVJDQ19hdmMzOgorICAgICAgY2FzZSBGT1VSQ0NfSDI2NToKKyAgICAgIGNhc2UgRk9VUkNDX2h2YzE6CisgICAgICBjYXNlIEZPVVJDQ19oZXYxOgorICAgICAgY2FzZSBGT1VSQ0NfbWpwMjoKKyAgICAgIGNhc2UgRk9VUkNDX2VuY3Y6CisgICAgICB7CisgICAgICAgIGd1aW50MzIgdmVyc2lvbjsKKyAgICAgICAgZ3VpbnQzMiBzdHJfbGVuOworCisgICAgICAgIC8qIGNvZGVjX2RhdGEgaXMgY29udGFpbmVkIGluc2lkZSB0aGVzZSBhdG9tcywgd2hpY2ggYWxsIGhhdmUKKyAgICAgICAgICogdGhlIHNhbWUgZm9ybWF0LiAqLworICAgICAgICAvKiB2aWRlbyBzYW1wbGUgZGVzY3JpcHRpb24gc2l6ZSBpcyA4NiBieXRlcyB3aXRob3V0IGV4dGVuc2lvbi4KKyAgICAgICAgICogbm9kZV9sZW5ndGggaGF2ZSB0byBiZSBiaWdnZXIgdGhhbiA4NiBieXRlcyBiZWNhdXNlIHZpZGVvIHNhbXBsZQorICAgICAgICAgKiBkZXNjcmlwdGlvbiBjYW4gaW5jbHVkZSBleHRlbnN0aW9ucyBzdWNoIGFzIGVzZHMsIGZpZWwsIGdsYmwsIGV0Yy4gKi8KKyAgICAgICAgaWYgKG5vZGVfbGVuZ3RoIDwgODYpIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICIlIiBHU1RfRk9VUkNDX0ZPUk1BVAorICAgICAgICAgICAgICAiIHNhbXBsZSBkZXNjcmlwdGlvbiBsZW5ndGggdG9vIHNob3J0ICgldSA8IDg2KSIsCisgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgbm9kZV9sZW5ndGgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInBhcnNpbmcgaW4gJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYykpOworCisgICAgICAgIC8qIHZlcnNpb24gKDIgYnl0ZXMpIDogdGhpcyBpcyBzZXQgdG8gMCwgdW5sZXNzIGEgY29tcHJlc3NvciBoYXMgY2hhbmdlZAorICAgICAgICAgKiAgICAgICAgICAgICAgaXRzIGRhdGEgZm9ybWF0LgorICAgICAgICAgKiByZXZpc2lvbiBsZXZlbCAoMiBieXRlcykgOiBtdXN0IGJlIHNldCB0byAwLiAqLworICAgICAgICB2ZXJzaW9uID0gUVRfVUlOVDMyIChidWZmZXIgKyAxNik7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJ2ZXJzaW9uICUwOHgiLCB2ZXJzaW9uKTsKKworICAgICAgICAvKiBjb21wcmVzc29yIG5hbWUgOiBQQVNDQUwgc3RyaW5nIGFuZCBpbmZvcm1hdGl2ZSBwdXJwb3NlcworICAgICAgICAgKiBmaXJzdCBieXRlIDogdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBkaXNwbGF5ZWQuCisgICAgICAgICAqICAgICAgICAgICAgICBpdCBoYXMgdG8gYmUgbGVzcyB0aGFuIDMyIGJlY2F1c2UgaXQgaXMgcmVzZXJ2ZWQKKyAgICAgICAgICogICAgICAgICAgICAgIHNwYWNlIG9mIDMyIGJ5dGVzIHRvdGFsIGluY2x1ZGluZyBpdHNlbGYuICovCisgICAgICAgIHN0cl9sZW4gPSBRVF9VSU5UOCAoYnVmZmVyICsgNTApOworICAgICAgICBpZiAoc3RyX2xlbiA8IDMyKQorICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJjb21wcmVzc29ybmFtZSA9ICUuKnMiLCBzdHJfbGVuLAorICAgICAgICAgICAgICAoY2hhciAqKSBidWZmZXIgKyA1MSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAgICJjb21wcmVzc29ybmFtZSBsZW5ndGggdG9vIGJpZyAoJXUgPiAzMSkiLCBzdHJfbGVuKTsKKworICAgICAgICBHU1RfTUVNRFVNUF9PQkpFQ1QgKHF0ZGVtdXgsICJ2aWRlbyBzYW1wbGUgZGVzY3JpcHRpb24iLCBidWZmZXIsCisgICAgICAgICAgICBlbmQgLSBidWZmZXIpOworICAgICAgICBxdGRlbXV4X3BhcnNlX2NvbnRhaW5lciAocXRkZW11eCwgbm9kZSwgYnVmZmVyICsgODYsIGVuZCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBGT1VSQ0NfbWV0YToKKyAgICAgIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInBhcnNpbmcgbWV0YSBhdG9tIik7CisKKyAgICAgICAgLyogWW91IGFyZSByZWFkaW5nIHRoaXMgY29ycmVjdGx5LiBRVEZGIHNwZWNpZmllcyB0aGF0IHRoZQorICAgICAgICAgKiBtZXRhZGF0YSBhdG9tIGlzIGEgc2hvcnQgYXRvbSwgd2hlcmVhcyBJU08gQk1GRiBzcGVjaWZpZXMKKyAgICAgICAgICogaXQncyBhIGZ1bGwgYXRvbS4gQnV0IHNpbmNlIHNvIG1hbnkgcGVvcGxlIGFyZSBkb2luZyB0aGluZ3MKKyAgICAgICAgICogZGlmZmVyZW50bHksIHdlIGFjdHVhbGx5IHBlZWsgaW50byB0aGUgYXRvbSB0byBzZWUgd2hpY2gKKyAgICAgICAgICogdmFyaWFudCBpdCBpcyAqLworICAgICAgICBpZiAobGVuZ3RoIDwgMTYpIHsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInNraXBwaW5nIHNtYWxsICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgYm94IiwKKyAgICAgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoUVRfRk9VUkNDIChidWZmZXIgKyAxMikgPT0gRk9VUkNDX2hkbHIpIHsKKyAgICAgICAgICAvKiBWYXJpYW50IDE6IFdoYXQgUVRGRiBzcGVjaWZpZXMuICdtZXRhJyBpcyBhIHNob3J0IGhlYWRlciB3aGljaAorICAgICAgICAgICAqIHN0YXJ0cyB3aXRoIGEgJ2hkbHInIGF0b20gKi8KKyAgICAgICAgICBxdGRlbXV4X3BhcnNlX2NvbnRhaW5lciAocXRkZW11eCwgbm9kZSwgYnVmZmVyICsgOCwgZW5kKTsKKyAgICAgICAgfSBlbHNlIGlmIChRVF9VSU5UMzIgKGJ1ZmZlciArIDgpID09IDB4MDAwMDAwMDApIHsKKyAgICAgICAgICAvKiBWYXJpYW50IDI6IFdoYXQgSVNPIEJNRkYgc3BlY2lmaWVzLiAnbWV0YScgaXMgYSBfZnVsbF8gYXRvbQorICAgICAgICAgICAqIHdpdGggdmVyc2lvbi9mbGFncyBib3RoIHNldCB0byB6ZXJvICovCisgICAgICAgICAgcXRkZW11eF9wYXJzZV9jb250YWluZXIgKHF0ZGVtdXgsIG5vZGUsIGJ1ZmZlciArIDEyLCBlbmQpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJVbmtub3duICdtZXRhJyBhdG9tIGZvcm1hdCIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgRk9VUkNDX21wNHM6CisgICAgICB7CisgICAgICAgIEdTVF9NRU1EVU1QX09CSkVDVCAocXRkZW11eCwgIm1wNHMiLCBidWZmZXIsIGVuZCAtIGJ1ZmZlcik7CisgICAgICAgIC8qIFNraXAgOCBieXRlIGhlYWRlciwgcGx1cyA4IGJ5dGUgdmVyc2lvbiArIGZsYWdzICsgZW50cnlfY291bnQgKi8KKyAgICAgICAgcXRkZW11eF9wYXJzZV9jb250YWluZXIgKHF0ZGVtdXgsIG5vZGUsIGJ1ZmZlciArIDE2LCBlbmQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgRk9VUkNDX1hpVGg6CisgICAgICB7CisgICAgICAgIGd1aW50MzIgdmVyc2lvbjsKKyAgICAgICAgZ3VpbnQzMiBvZmZzZXQ7CisKKyAgICAgICAgaWYgKGxlbmd0aCA8IDE2KSB7CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJza2lwcGluZyBzbWFsbCAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIGJveCIsCisgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB2ZXJzaW9uID0gUVRfVUlOVDMyIChidWZmZXIgKyAxMik7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJwYXJzaW5nIFhpVGggYXRvbSB2ZXJzaW9uIDB4JTA4eCIsIHZlcnNpb24pOworCisgICAgICAgIHN3aXRjaCAodmVyc2lvbikgeworICAgICAgICAgIGNhc2UgMHgwMDAwMDAwMToKKyAgICAgICAgICAgIG9mZnNldCA9IDB4NjI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInVua25vd24gdmVyc2lvbiAweCUwOHgiLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAob2Zmc2V0KSB7CisgICAgICAgICAgaWYgKGxlbmd0aCA8IG9mZnNldCkgeworICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICAgICAgICJza2lwcGluZyB0b28gc21hbGwgJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiBib3giLAorICAgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgcXRkZW11eF9wYXJzZV9jb250YWluZXIgKHF0ZGVtdXgsIG5vZGUsIGJ1ZmZlciArIG9mZnNldCwgZW5kKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgRk9VUkNDX2luMjQ6CisgICAgICB7CisgICAgICAgIHF0ZGVtdXhfcGFyc2VfY29udGFpbmVyIChxdGRlbXV4LCBub2RlLCBidWZmZXIgKyAweDM0LCBlbmQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgRk9VUkNDX3V1aWQ6CisgICAgICB7CisgICAgICAgIHF0ZGVtdXhfcGFyc2VfdXVpZCAocXRkZW11eCwgYnVmZmVyLCBlbmQgLSBidWZmZXIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgRk9VUkNDX2VuY2E6CisgICAgICB7CisgICAgICAgIHF0ZGVtdXhfcGFyc2VfY29udGFpbmVyIChxdGRlbXV4LCBub2RlLCBidWZmZXIgKyAzNiwgZW5kKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoIXN0cmNtcCAodHlwZS0+bmFtZSwgInVua25vd24iKSkKKyAgICAgICAgICBHU1RfTUVNRFVNUCAoIlVua25vd24gdGFnIiwgYnVmZmVyICsgNCwgZW5kIC0gYnVmZmVyIC0gNCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInBhcnNlZCAnJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiciLAorICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKTsKKyAgcmV0dXJuIFRSVUU7CisKKy8qIEVSUk9SUyAqLworbm90X2Vub3VnaF9kYXRhOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0ZGVtdXgsIFNUUkVBTSwgREVNVVgsCisgICAgICAgIChfKCJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iKSksCisgICAgICAgICgiTm90IGVub3VnaCBkYXRhIGZvciBhbiBhdG9tIGhlYWRlciwgZ290IG9ubHkgJXUgYnl0ZXMiLCBsZW5ndGgpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2Jyb2tlbl9hdG9tX3NpemU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRkZW11eCwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgKF8oIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIpKSwKKyAgICAgICAgKCJBdG9tICclIiBHU1RfRk9VUkNDX0ZPUk1BVCAiJyBoYXMgc2l6ZSBvZiAldSBieXRlcywgYnV0IHdlIGhhdmUgb25seSAiCisgICAgICAgICAgICAiJXUgYnl0ZXMgYXZhaWxhYmxlLiIsIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgbm9kZV9sZW5ndGgsCisgICAgICAgICAgICBsZW5ndGgpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdOb2RlICoKK3F0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAoR05vZGUgKiBub2RlLCBndWludDMyIGZvdXJjYykKK3sKKyAgR05vZGUgKmNoaWxkOworICBndWludDggKmJ1ZmZlcjsKKyAgZ3VpbnQzMiBjaGlsZF9mb3VyY2M7CisKKyAgZm9yIChjaGlsZCA9IGdfbm9kZV9maXJzdF9jaGlsZCAobm9kZSk7IGNoaWxkOworICAgICAgY2hpbGQgPSBnX25vZGVfbmV4dF9zaWJsaW5nIChjaGlsZCkpIHsKKyAgICBidWZmZXIgPSAoZ3VpbnQ4ICopIGNoaWxkLT5kYXRhOworCisgICAgY2hpbGRfZm91cmNjID0gUVRfRk9VUkNDIChidWZmZXIgKyA0KTsKKworICAgIGlmIChHX1VOTElLRUxZIChjaGlsZF9mb3VyY2MgPT0gZm91cmNjKSkgeworICAgICAgcmV0dXJuIGNoaWxkOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEdOb2RlICoKK3F0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZV9mdWxsIChHTm9kZSAqIG5vZGUsIGd1aW50MzIgZm91cmNjLAorICAgIEdzdEJ5dGVSZWFkZXIgKiBwYXJzZXIpCit7CisgIEdOb2RlICpjaGlsZDsKKyAgZ3VpbnQ4ICpidWZmZXI7CisgIGd1aW50MzIgY2hpbGRfZm91cmNjLCBjaGlsZF9sZW47CisKKyAgZm9yIChjaGlsZCA9IGdfbm9kZV9maXJzdF9jaGlsZCAobm9kZSk7IGNoaWxkOworICAgICAgY2hpbGQgPSBnX25vZGVfbmV4dF9zaWJsaW5nIChjaGlsZCkpIHsKKyAgICBidWZmZXIgPSAoZ3VpbnQ4ICopIGNoaWxkLT5kYXRhOworCisgICAgY2hpbGRfbGVuID0gUVRfVUlOVDMyIChidWZmZXIpOworICAgIGNoaWxkX2ZvdXJjYyA9IFFUX0ZPVVJDQyAoYnVmZmVyICsgNCk7CisKKyAgICBpZiAoR19VTkxJS0VMWSAoY2hpbGRfZm91cmNjID09IGZvdXJjYykpIHsKKyAgICAgIGlmIChHX1VOTElLRUxZIChjaGlsZF9sZW4gPCAoNCArIDQpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAvKiBGSVhNRTogbXVzdCB2ZXJpZnkgaWYgYXRvbSBsZW5ndGggPCBwYXJlbnQgYXRvbSBsZW5ndGggKi8KKyAgICAgIGdzdF9ieXRlX3JlYWRlcl9pbml0IChwYXJzZXIsIGJ1ZmZlciArICg0ICsgNCksIGNoaWxkX2xlbiAtICg0ICsgNCkpOworICAgICAgcmV0dXJuIGNoaWxkOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEdOb2RlICoKK3F0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfaW5kZXggKEdOb2RlICogbm9kZSwgZ3VpbnQgaW5kZXgpCit7CisgIHJldHVybiBnX25vZGVfbnRoX2NoaWxkIChub2RlLCBpbmRleCk7Cit9CisKK3N0YXRpYyBHTm9kZSAqCitxdGRlbXV4X3RyZWVfZ2V0X3NpYmxpbmdfYnlfdHlwZV9mdWxsIChHTm9kZSAqIG5vZGUsIGd1aW50MzIgZm91cmNjLAorICAgIEdzdEJ5dGVSZWFkZXIgKiBwYXJzZXIpCit7CisgIEdOb2RlICpjaGlsZDsKKyAgZ3VpbnQ4ICpidWZmZXI7CisgIGd1aW50MzIgY2hpbGRfZm91cmNjLCBjaGlsZF9sZW47CisKKyAgZm9yIChjaGlsZCA9IGdfbm9kZV9uZXh0X3NpYmxpbmcgKG5vZGUpOyBjaGlsZDsKKyAgICAgIGNoaWxkID0gZ19ub2RlX25leHRfc2libGluZyAoY2hpbGQpKSB7CisgICAgYnVmZmVyID0gKGd1aW50OCAqKSBjaGlsZC0+ZGF0YTsKKworICAgIGNoaWxkX2ZvdXJjYyA9IFFUX0ZPVVJDQyAoYnVmZmVyICsgNCk7CisKKyAgICBpZiAoY2hpbGRfZm91cmNjID09IGZvdXJjYykgeworICAgICAgaWYgKHBhcnNlcikgeworICAgICAgICBjaGlsZF9sZW4gPSBRVF9VSU5UMzIgKGJ1ZmZlcik7CisgICAgICAgIGlmIChHX1VOTElLRUxZIChjaGlsZF9sZW4gPCAoNCArIDQpKSkKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgLyogRklYTUU6IG11c3QgdmVyaWZ5IGlmIGF0b20gbGVuZ3RoIDwgcGFyZW50IGF0b20gbGVuZ3RoICovCisgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9pbml0IChwYXJzZXIsIGJ1ZmZlciArICg0ICsgNCksIGNoaWxkX2xlbiAtICg0ICsgNCkpOworICAgICAgfQorICAgICAgcmV0dXJuIGNoaWxkOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEdOb2RlICoKK3F0ZGVtdXhfdHJlZV9nZXRfc2libGluZ19ieV90eXBlIChHTm9kZSAqIG5vZGUsIGd1aW50MzIgZm91cmNjKQoreworICByZXR1cm4gcXRkZW11eF90cmVlX2dldF9zaWJsaW5nX2J5X3R5cGVfZnVsbCAobm9kZSwgZm91cmNjLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK3F0ZGVtdXhfZG9fYWxsb2NhdGlvbiAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0pCit7CisvKiBGSVhNRTogVGhpcyBjYW4gb25seSByZWxpYWJseSB3b3JrIGlmIGRlbXV4ZXJzIGhhdmUgYQorICogc2VwYXJhdGUgc3RyZWFtaW5nIHRocmVhZCBwZXIgc3JjcGFkLiBUaGlzIHNob3VsZCBiZQorICogZG9uZSBpbiBhIGRlbXV4ZXIgYmFzZSBjbGFzcywgd2hpY2ggaW50ZWdyYXRlcyBwYXJ0cworICogb2YgbXVsdGlxdWV1ZQorICoKKyAqIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDE4NTYKKyAqLworI2lmIDAKKyAgR3N0UXVlcnkgKnF1ZXJ5OworCisgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19hbGxvY2F0aW9uIChzdHJlYW0tPmNhcHMsIEZBTFNFKTsKKworICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeSAoc3RyZWFtLT5wYWQsIHF1ZXJ5KSkgeworICAgIC8qIG5vdCBhIHByb2JsZW0sIGp1c3QgZGVidWcgYSBsaXR0bGUgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicGVlciBBTExPQ0FUSU9OIHF1ZXJ5IGZhaWxlZCIpOworICB9CisKKyAgaWYgKHN0cmVhbS0+YWxsb2NhdG9yKQorICAgIGdzdF9vYmplY3RfdW5yZWYgKHN0cmVhbS0+YWxsb2NhdG9yKTsKKworICBpZiAoZ3N0X3F1ZXJ5X2dldF9uX2FsbG9jYXRpb25fcGFyYW1zIChxdWVyeSkgPiAwKSB7CisgICAgLyogdHJ5IHRoZSBhbGxvY2F0b3IgKi8KKyAgICBnc3RfcXVlcnlfcGFyc2VfbnRoX2FsbG9jYXRpb25fcGFyYW0gKHF1ZXJ5LCAwLCAmc3RyZWFtLT5hbGxvY2F0b3IsCisgICAgICAgICZzdHJlYW0tPnBhcmFtcyk7CisgICAgc3RyZWFtLT51c2VfYWxsb2NhdG9yID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBzdHJlYW0tPmFsbG9jYXRvciA9IE5VTEw7CisgICAgZ3N0X2FsbG9jYXRpb25fcGFyYW1zX2luaXQgKCZzdHJlYW0tPnBhcmFtcyk7CisgICAgc3RyZWFtLT51c2VfYWxsb2NhdG9yID0gRkFMU0U7CisgIH0KKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisjZW5kaWYKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcXRkZW11eF9jb25maWd1cmVfcHJvdGVjdGVkX2NhcHMgKEdzdFFURGVtdXggKiBxdGRlbXV4LAorICAgIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0pCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgY29uc3QgZ2NoYXIgKnNlbGVjdGVkX3N5c3RlbTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAocXRkZW11eCAhPSBOVUxMLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzdHJlYW0gIT0gTlVMTCwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ3N0X2NhcHNfZ2V0X3NpemUgKENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMpID09IDEsCisgICAgICBGQUxTRSk7CisKKyAgaWYgKHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfdHlwZSAhPSBGT1VSQ0NfY2VuYykgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJ1bnN1cHBvcnRlZCBwcm90ZWN0aW9uIHNjaGVtZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAocXRkZW11eC0+cHJvdGVjdGlvbl9zeXN0ZW1faWRzID09IE5VTEwpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChxdGRlbXV4LCAic3RyZWFtIGlzIHByb3RlY3RlZCB1c2luZyBjZW5jLCBidXQgbm8gIgorICAgICAgICAiY2VuYyBwcm90ZWN0aW9uIHN5c3RlbSBpbmZvcm1hdGlvbiBoYXMgYmVlbiBmb3VuZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBnX3B0cl9hcnJheV9hZGQgKHF0ZGVtdXgtPnByb3RlY3Rpb25fc3lzdGVtX2lkcywgTlVMTCk7CisgIHNlbGVjdGVkX3N5c3RlbSA9IGdzdF9wcm90ZWN0aW9uX3NlbGVjdF9zeXN0ZW0gKChjb25zdCBnY2hhciAqKikKKyAgICAgIHF0ZGVtdXgtPnByb3RlY3Rpb25fc3lzdGVtX2lkcy0+cGRhdGEpOworICBnX3B0cl9hcnJheV9yZW1vdmVfaW5kZXggKHF0ZGVtdXgtPnByb3RlY3Rpb25fc3lzdGVtX2lkcywKKyAgICAgIHF0ZGVtdXgtPnByb3RlY3Rpb25fc3lzdGVtX2lkcy0+bGVuIC0gMSk7CisgIGlmICghc2VsZWN0ZWRfc3lzdGVtKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwgInN0cmVhbSBpcyBwcm90ZWN0ZWQsIGJ1dCBubyAiCisgICAgICAgICJzdWl0YWJsZSBkZWNyeXB0b3IgZWxlbWVudCBoYXMgYmVlbiBmb3VuZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLCAwKTsKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiYXBwbGljYXRpb24veC1jZW5jIikpIHsKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocywKKyAgICAgICAgIm9yaWdpbmFsLW1lZGlhLXR5cGUiLCBHX1RZUEVfU1RSSU5HLCBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzKSwKKyAgICAgICAgR1NUX1BST1RFQ1RJT05fU1lTVEVNX0lEX0NBUFNfRklFTEQsIEdfVFlQRV9TVFJJTkcsIHNlbGVjdGVkX3N5c3RlbSwKKyAgICAgICAgTlVMTCk7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAocywgImFwcGxpY2F0aW9uL3gtY2VuYyIpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9xdGRlbXV4X2NvbmZpZ3VyZV9zdHJlYW0gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBRdERlbXV4U3RyZWFtICogc3RyZWFtKQoreworICBpZiAoc3RyZWFtLT5zdWJ0eXBlID09IEZPVVJDQ192aWRlKSB7CisgICAgLyogZnBzIGlzIGNhbGN1bGF0ZWQgYmFzZSBvbiB0aGUgZHVyYXRpb24gb2YgdGhlIGF2ZXJhZ2UgZnJhbWVyYXRlIHNpbmNlCisgICAgICogcXQgZG9lcyBub3QgaGF2ZSBhIGZpeGVkIGZyYW1lcmF0ZS4gKi8KKyAgICBnYm9vbGVhbiBmcHNfYXZhaWxhYmxlID0gVFJVRTsKKworICAgIGlmICgoc3RyZWFtLT5uX3NhbXBsZXMgPT0gMSAmJiBzdHJlYW0tPmZpcnN0X2R1cmF0aW9uID09IDApCisgICAgICAgIHx8IChxdGRlbXV4LT5mcmFnbWVudGVkICYmIHN0cmVhbS0+bl9zYW1wbGVzX21vb2YgPT0gMSkpIHsKKyAgICAgIC8qIHN0aWxsIGZyYW1lICovCisgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT5mcHNfbiA9IDA7CisgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT5mcHNfZCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChzdHJlYW0tPmR1cmF0aW9uID09IDAgfHwgc3RyZWFtLT5uX3NhbXBsZXMgPCAyKSB7CisgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmZwc19uID0gc3RyZWFtLT50aW1lc2NhbGU7CisgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmZwc19kID0gMTsKKyAgICAgICAgZnBzX2F2YWlsYWJsZSA9IEZBTFNFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIGF2Z19kdXJhdGlvbjsKKyAgICAgICAgZ3VpbnQ2NCBkdXJhdGlvbjsKKyAgICAgICAgZ3VpbnQzMiBuX3NhbXBsZXM7CisKKyAgICAgICAgLyogZHVyYXRpb24gYW5kIG5fc2FtcGxlcyBjYW4gYmUgdXBkYXRlZCBmb3IgZnJhZ21lbnRlZCBmb3JtYXQKKyAgICAgICAgICogc28sIGZyYW1lcmF0ZSBvZiBmcmFnbWVudGVkIGZvcm1hdCBpcyBjYWxjdWxhdGVkIHVzaW5nIGRhdGEgaW4gYSBtb29mICovCisgICAgICAgIGlmIChxdGRlbXV4LT5mcmFnbWVudGVkICYmIHN0cmVhbS0+bl9zYW1wbGVzX21vb2YgPiAwCisgICAgICAgICAgICAmJiBzdHJlYW0tPmR1cmF0aW9uX21vb2YgPiAwKSB7CisgICAgICAgICAgbl9zYW1wbGVzID0gc3RyZWFtLT5uX3NhbXBsZXNfbW9vZjsKKyAgICAgICAgICBkdXJhdGlvbiA9IHN0cmVhbS0+ZHVyYXRpb25fbW9vZjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuX3NhbXBsZXMgPSBzdHJlYW0tPm5fc2FtcGxlczsKKyAgICAgICAgICBkdXJhdGlvbiA9IHN0cmVhbS0+ZHVyYXRpb247CisgICAgICAgIH0KKworICAgICAgICAvKiBDYWxjdWxhdGUgYSBmcmFtZXJhdGUsIGlnbm9yaW5nIHRoZSBmaXJzdCBzYW1wbGUgd2hpY2ggaXMgc29tZXRpbWVzIHRydW5jYXRlZCAqLworICAgICAgICAvKiBzdHJlYW0tPmR1cmF0aW9uIGlzIGd1aW50NjQsIHRpbWVzY2FsZSwgbl9zYW1wbGVzIGFyZSBndWludDMyICovCisgICAgICAgIGF2Z19kdXJhdGlvbiA9CisgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKGR1cmF0aW9uIC0KKyAgICAgICAgICAgIHN0cmVhbS0+Zmlyc3RfZHVyYXRpb24sIEdTVF9TRUNPTkQsCisgICAgICAgICAgICAoZ3VpbnQ2NCkgKHN0cmVhbS0+dGltZXNjYWxlKSAqIChuX3NhbXBsZXMgLSAxKSk7CisKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAiQ2FsY3VsYXRpbmcgYXZnIHNhbXBsZSBkdXJhdGlvbiBiYXNlZCBvbiBzdHJlYW0gKG9yIG1vb2YpIGR1cmF0aW9uICUiCisgICAgICAgICAgICBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgICAiIG1pbnVzIGZpcnN0IHNhbXBsZSAldSwgbGVhdmluZyAlZCBzYW1wbGVzIGdpdmVzICUiCisgICAgICAgICAgICBHU1RfVElNRV9GT1JNQVQsIGR1cmF0aW9uLCBzdHJlYW0tPmZpcnN0X2R1cmF0aW9uLAorICAgICAgICAgICAgbl9zYW1wbGVzIC0gMSwgR1NUX1RJTUVfQVJHUyAoYXZnX2R1cmF0aW9uKSk7CisKKyAgICAgICAgZ3N0X3ZpZGVvX2d1ZXNzX2ZyYW1lcmF0ZSAoYXZnX2R1cmF0aW9uLCAmQ1VSX1NUUkVBTSAoc3RyZWFtKS0+ZnBzX24sCisgICAgICAgICAgICAmQ1VSX1NUUkVBTSAoc3RyZWFtKS0+ZnBzX2QpOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAiQ2FsY3VsYXRpbmcgZnJhbWVyYXRlLCB0aW1lc2NhbGUgJXUgZ2F2ZSBmcHNfbiAlZCBmcHNfZCAlZCIsCisgICAgICAgICAgICBzdHJlYW0tPnRpbWVzY2FsZSwgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+ZnBzX24sCisgICAgICAgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT5mcHNfZCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMpIHsKKyAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMgPQorICAgICAgICAgIGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMpOworCisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLAorICAgICAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIENVUl9TVFJFQU0gKHN0cmVhbSktPndpZHRoLAorICAgICAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBDVVJfU1RSRUFNIChzdHJlYW0pLT5oZWlnaHQsIE5VTEwpOworCisgICAgICAvKiBzZXQgZnJhbWVyYXRlIGlmIGNhbGN1bGF0ZWQgZnJhbWVyYXRlIGlzIHJlbGlhYmxlICovCisgICAgICBpZiAoZnBzX2F2YWlsYWJsZSkgeworICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLAorICAgICAgICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLCBDVVJfU1RSRUFNIChzdHJlYW0pLT5mcHNfbiwKKyAgICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmZwc19kLCBOVUxMKTsKKyAgICAgIH0KKworICAgICAgLyogY2FsY3VsYXRlIHBpeGVsLWFzcGVjdC1yYXRpbyB1c2luZyBkaXNwbGF5IHdpZHRoIGFuZCBoZWlnaHQgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgInZpZGVvIHNpemUgJWR4JWQsIHRhcmdldCBkaXNwbGF5IHNpemUgJWR4JWQiLAorICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPndpZHRoLCBDVVJfU1RSRUFNIChzdHJlYW0pLT5oZWlnaHQsCisgICAgICAgICAgc3RyZWFtLT5kaXNwbGF5X3dpZHRoLCBzdHJlYW0tPmRpc3BsYXlfaGVpZ2h0KTsKKyAgICAgIC8qIHF0IGZpbGUgbWlnaHQgaGF2ZSBwYXNwIGF0b20gKi8KKyAgICAgIGlmIChDVVJfU1RSRUFNIChzdHJlYW0pLT5wYXJfdyA+IDAgJiYgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cGFyX2ggPiAwKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJwYXIgJWQ6JWQiLCBDVVJfU1RSRUFNIChzdHJlYW0pLT5wYXJfdywKKyAgICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPnBhcl9oKTsKKyAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y2FwcywgInBpeGVsLWFzcGVjdC1yYXRpbyIsCisgICAgICAgICAgICBHU1RfVFlQRV9GUkFDVElPTiwgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cGFyX3csCisgICAgICAgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT5wYXJfaCwgTlVMTCk7CisgICAgICB9IGVsc2UgaWYgKHN0cmVhbS0+ZGlzcGxheV93aWR0aCA+IDAgJiYgc3RyZWFtLT5kaXNwbGF5X2hlaWdodCA+IDAKKyAgICAgICAgICAmJiBDVVJfU1RSRUFNIChzdHJlYW0pLT53aWR0aCA+IDAKKyAgICAgICAgICAmJiBDVVJfU1RSRUFNIChzdHJlYW0pLT5oZWlnaHQgPiAwKSB7CisgICAgICAgIGdpbnQgbiwgZDsKKworICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIHBpeGVsIGFzcGVjdCByYXRpbyB1c2luZyB0aGUgZGlzcGxheSBhbmQgcGl4ZWwgdy9oICovCisgICAgICAgIG4gPSBzdHJlYW0tPmRpc3BsYXlfd2lkdGggKiBDVVJfU1RSRUFNIChzdHJlYW0pLT5oZWlnaHQ7CisgICAgICAgIGQgPSBzdHJlYW0tPmRpc3BsYXlfaGVpZ2h0ICogQ1VSX1NUUkVBTSAoc3RyZWFtKS0+d2lkdGg7CisgICAgICAgIGlmIChuID09IGQpCisgICAgICAgICAgbiA9IGQgPSAxOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic2V0dGluZyBQQVIgdG8gJWQvJWQiLCBuLCBkKTsKKyAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cGFyX3cgPSBuOworICAgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT5wYXJfaCA9IGQ7CisgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iLAorICAgICAgICAgICAgR1NUX1RZUEVfRlJBQ1RJT04sIENVUl9TVFJFQU0gKHN0cmVhbSktPnBhcl93LAorICAgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cGFyX2gsIE5VTEwpOworICAgICAgfQorCisgICAgICBpZiAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+aW50ZXJsYWNlX21vZGUgPiAwKSB7CisgICAgICAgIGlmIChDVVJfU1RSRUFNIChzdHJlYW0pLT5pbnRlcmxhY2VfbW9kZSA9PSAxKSB7CisgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y2FwcywgImludGVybGFjZS1tb2RlIiwKKyAgICAgICAgICAgICAgR19UWVBFX1NUUklORywgInByb2dyZXNzaXZlIiwgTlVMTCk7CisgICAgICAgIH0gZWxzZSBpZiAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+aW50ZXJsYWNlX21vZGUgPT0gMikgeworICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMsICJpbnRlcmxhY2UtbW9kZSIsCisgICAgICAgICAgICAgIEdfVFlQRV9TVFJJTkcsICJpbnRlcmxlYXZlZCIsIE5VTEwpOworICAgICAgICAgIGlmIChDVVJfU1RSRUFNIChzdHJlYW0pLT5maWVsZF9vcmRlciA9PSA5KSB7CisgICAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLCAiZmllbGQtb3JkZXIiLAorICAgICAgICAgICAgICAgIEdfVFlQRV9TVFJJTkcsICJ0b3AtZmllbGQtZmlyc3QiLCBOVUxMKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKENVUl9TVFJFQU0gKHN0cmVhbSktPmZpZWxkX29yZGVyID09IDE0KSB7CisgICAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLCAiZmllbGQtb3JkZXIiLAorICAgICAgICAgICAgICAgIEdfVFlQRV9TVFJJTkcsICJib3R0b20tZmllbGQtZmlyc3QiLCBOVUxMKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogQ3JlYXRlIGluY29tcGxldGUgY29sb3JpbWV0cnkgaGVyZSBpZiBuZWVkZWQgKi8KKyAgICAgIGlmIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jb2xvcmltZXRyeS5yYW5nZSB8fAorICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmNvbG9yaW1ldHJ5Lm1hdHJpeCB8fAorICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmNvbG9yaW1ldHJ5LnRyYW5zZmVyCisgICAgICAgICAgfHwgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y29sb3JpbWV0cnkucHJpbWFyaWVzKSB7CisgICAgICAgIGdjaGFyICpjb2xvcmltZXRyeSA9CisgICAgICAgICAgICBnc3RfdmlkZW9fY29sb3JpbWV0cnlfdG9fc3RyaW5nICgmQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y29sb3JpbWV0cnkpOworICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLCAiY29sb3JpbWV0cnkiLAorICAgICAgICAgICAgR19UWVBFX1NUUklORywgY29sb3JpbWV0cnksIE5VTEwpOworICAgICAgICBnX2ZyZWUgKGNvbG9yaW1ldHJ5KTsKKyAgICAgIH0KKworICAgICAgaWYgKHN0cmVhbS0+bXVsdGl2aWV3X21vZGUgIT0gR1NUX1ZJREVPX01VTFRJVklFV19NT0RFX05PTkUpIHsKKyAgICAgICAgZ3VpbnQgcGFyX3cgPSAxLCBwYXJfaCA9IDE7CisKKyAgICAgICAgaWYgKENVUl9TVFJFQU0gKHN0cmVhbSktPnBhcl93ID4gMCAmJiBDVVJfU1RSRUFNIChzdHJlYW0pLT5wYXJfaCA+IDApIHsKKyAgICAgICAgICBwYXJfdyA9IENVUl9TVFJFQU0gKHN0cmVhbSktPnBhcl93OworICAgICAgICAgIHBhcl9oID0gQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cGFyX2g7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ3N0X3ZpZGVvX211bHRpdmlld19ndWVzc19oYWxmX2FzcGVjdCAoc3RyZWFtLT5tdWx0aXZpZXdfbW9kZSwKKyAgICAgICAgICAgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT53aWR0aCwgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+aGVpZ2h0LCBwYXJfdywKKyAgICAgICAgICAgICAgICBwYXJfaCkpIHsKKyAgICAgICAgICBzdHJlYW0tPm11bHRpdmlld19mbGFncyB8PSBHU1RfVklERU9fTVVMVElWSUVXX0ZMQUdTX0hBTEZfQVNQRUNUOworICAgICAgICB9CisKKyAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y2FwcywKKyAgICAgICAgICAgICJtdWx0aXZpZXctbW9kZSIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICBnc3RfdmlkZW9fbXVsdGl2aWV3X21vZGVfdG9fY2Fwc19zdHJpbmcgKHN0cmVhbS0+bXVsdGl2aWV3X21vZGUpLAorICAgICAgICAgICAgIm11bHRpdmlldy1mbGFncyIsIEdTVF9UWVBFX1ZJREVPX01VTFRJVklFV19GTEFHU0VULAorICAgICAgICAgICAgc3RyZWFtLT5tdWx0aXZpZXdfZmxhZ3MsIEdTVF9GTEFHX1NFVF9NQVNLX0VYQUNULCBOVUxMKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBlbHNlIGlmIChzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3NvdW4pIHsKKyAgICBpZiAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y2FwcykgeworICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y2FwcyA9CisgICAgICAgICAgZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y2Fwcyk7CisgICAgICBpZiAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cmF0ZSA+IDApCisgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMsCisgICAgICAgICAgICAicmF0ZSIsIEdfVFlQRV9JTlQsIChpbnQpIENVUl9TVFJFQU0gKHN0cmVhbSktPnJhdGUsIE5VTEwpOworICAgICAgaWYgKENVUl9TVFJFQU0gKHN0cmVhbSktPm5fY2hhbm5lbHMgPiAwKQorICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLAorICAgICAgICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+bl9jaGFubmVscywgTlVMTCk7CisgICAgICBpZiAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+bl9jaGFubmVscyA+IDIpIHsKKyAgICAgICAgLyogRklYTUU6IE5lZWQgdG8gcGFyc2UgdGhlICdjaGFuJyBhdG9tIHRvIGdldCBjaGFubmVsIGxheW91dHMKKyAgICAgICAgICogY29ycmVjdGx5OyB0aGlzIGlzIGp1c3QgdGhlIG1pbmltdW0gd2UgY2FuIGRvIC0gYXNzdW1lCisgICAgICAgICAqIHdlIGRvbid0IGFjdHVhbGx5IGhhdmUgYW55IGNoYW5uZWwgcG9zaXRpb25zLiAqLworICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLAorICAgICAgICAgICAgImNoYW5uZWwtbWFzayIsIEdTVF9UWVBFX0JJVE1BU0ssIEdfR1VJTlQ2NF9DT05TVEFOVCAoMCksIE5VTEwpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChzdHJlYW0tPnBhZCkgeworICAgIEdzdENhcHMgKnByZXZfY2FwcyA9IE5VTEw7CisKKyAgICBHU1RfUEFEX0VMRU1FTlRfUFJJVkFURSAoc3RyZWFtLT5wYWQpID0gc3RyZWFtOworICAgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChzdHJlYW0tPnBhZCwgZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19ldmVudCk7CisgICAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKHN0cmVhbS0+cGFkLCBnc3RfcXRkZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KTsKKyAgICBnc3RfcGFkX3NldF9hY3RpdmUgKHN0cmVhbS0+cGFkLCBUUlVFKTsKKworICAgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKHN0cmVhbS0+cGFkKTsKKworICAgIGlmIChzdHJlYW0tPnByb3RlY3RlZCkgeworICAgICAgaWYgKCFnc3RfcXRkZW11eF9jb25maWd1cmVfcHJvdGVjdGVkX2NhcHMgKHF0ZGVtdXgsIHN0cmVhbSkpIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICJGYWlsZWQgdG8gY29uZmlndXJlIHByb3RlY3RlZCBzdHJlYW0gY2Fwcy4iKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0KKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJzZXR0aW5nIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMpOworICAgIGlmIChzdHJlYW0tPm5ld19zdHJlYW0pIHsKKyAgICAgIGdjaGFyICpzdHJlYW1faWQ7CisgICAgICBHc3RFdmVudCAqZXZlbnQ7CisgICAgICBHc3RTdHJlYW1GbGFncyBzdHJlYW1fZmxhZ3MgPSBHU1RfU1RSRUFNX0ZMQUdfTk9ORTsKKworICAgICAgZXZlbnQgPQorICAgICAgICAgIGdzdF9wYWRfZ2V0X3N0aWNreV9ldmVudCAocXRkZW11eC0+c2lua3BhZCwgR1NUX0VWRU5UX1NUUkVBTV9TVEFSVCwKKyAgICAgICAgICAwKTsKKyAgICAgIGlmIChldmVudCkgeworICAgICAgICBnc3RfZXZlbnRfcGFyc2Vfc3RyZWFtX2ZsYWdzIChldmVudCwgJnN0cmVhbV9mbGFncyk7CisgICAgICAgIGlmIChnc3RfZXZlbnRfcGFyc2VfZ3JvdXBfaWQgKGV2ZW50LCAmcXRkZW11eC0+Z3JvdXBfaWQpKQorICAgICAgICAgIHF0ZGVtdXgtPmhhdmVfZ3JvdXBfaWQgPSBUUlVFOworICAgICAgICBlbHNlCisgICAgICAgICAgcXRkZW11eC0+aGF2ZV9ncm91cF9pZCA9IEZBTFNFOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIH0gZWxzZSBpZiAoIXF0ZGVtdXgtPmhhdmVfZ3JvdXBfaWQpIHsKKyAgICAgICAgcXRkZW11eC0+aGF2ZV9ncm91cF9pZCA9IFRSVUU7CisgICAgICAgIHF0ZGVtdXgtPmdyb3VwX2lkID0gZ3N0X3V0aWxfZ3JvdXBfaWRfbmV4dCAoKTsKKyAgICAgIH0KKworICAgICAgc3RyZWFtLT5uZXdfc3RyZWFtID0gRkFMU0U7CisgICAgICBzdHJlYW1faWQgPQorICAgICAgICAgIGdzdF9wYWRfY3JlYXRlX3N0cmVhbV9pZF9wcmludGYgKHN0cmVhbS0+cGFkLAorICAgICAgICAgIEdTVF9FTEVNRU5UX0NBU1QgKHF0ZGVtdXgpLCAiJTAzdSIsIHN0cmVhbS0+dHJhY2tfaWQpOworICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoc3RyZWFtX2lkKTsKKyAgICAgIGlmIChxdGRlbXV4LT5oYXZlX2dyb3VwX2lkKQorICAgICAgICBnc3RfZXZlbnRfc2V0X2dyb3VwX2lkIChldmVudCwgcXRkZW11eC0+Z3JvdXBfaWQpOworICAgICAgaWYgKHN0cmVhbS0+ZGlzYWJsZWQpCisgICAgICAgIHN0cmVhbV9mbGFncyB8PSBHU1RfU1RSRUFNX0ZMQUdfVU5TRUxFQ1Q7CisgICAgICBpZiAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+c3BhcnNlKSB7CisgICAgICAgIHN0cmVhbV9mbGFncyB8PSBHU1RfU1RSRUFNX0ZMQUdfU1BBUlNFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyZWFtX2ZsYWdzICY9IH5HU1RfU1RSRUFNX0ZMQUdfU1BBUlNFOworICAgICAgfQorICAgICAgZ3N0X2V2ZW50X3NldF9zdHJlYW1fZmxhZ3MgKGV2ZW50LCBzdHJlYW1fZmxhZ3MpOworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzdHJlYW0tPnBhZCwgZXZlbnQpOworICAgICAgZ19mcmVlIChzdHJlYW1faWQpOworICAgIH0KKworICAgIHByZXZfY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoc3RyZWFtLT5wYWQpOworCisgICAgaWYgKENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMpIHsKKyAgICAgIGlmICghcHJldl9jYXBzCisgICAgICAgICAgfHwgIWdzdF9jYXBzX2lzX2VxdWFsX2ZpeGVkIChwcmV2X2NhcHMsIENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMpKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJzZXR0aW5nIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzKTsKKyAgICAgICAgZ3N0X3BhZF9zZXRfY2FwcyAoc3RyZWFtLT5wYWQsIENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImlnbm9yZSBkdXBsaWNhdGVkIGNhcHMiKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAic3RyZWFtIHdpdGhvdXQgY2FwcyIpOworICAgIH0KKworICAgIGlmIChwcmV2X2NhcHMpCisgICAgICBnc3RfY2Fwc191bnJlZiAocHJldl9jYXBzKTsKKyAgICBzdHJlYW0tPm5ld19jYXBzID0gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9zdHJlYW1fY2hlY2tfYW5kX2NoYW5nZV9zdHNkX2luZGV4IChHc3RRVERlbXV4ICogZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSkKK3sKKyAgaWYgKHN0cmVhbS0+Y3VyX3N0c2RfZW50cnlfaW5kZXggPT0gc3RyZWFtLT5zdHNkX3NhbXBsZV9kZXNjcmlwdGlvbl9pZCkKKyAgICByZXR1cm47CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3RyZWFtLT5wYWQsICJDaGFuZ2luZyBzdHNkIGluZGV4IGZyb20gJyV1JyB0byAnJXUnIiwKKyAgICAgIHN0cmVhbS0+Y3VyX3N0c2RfZW50cnlfaW5kZXgsIHN0cmVhbS0+c3RzZF9zYW1wbGVfZGVzY3JpcHRpb25faWQpOworICBpZiAoR19VTkxJS0VMWSAoc3RyZWFtLT5zdHNkX3NhbXBsZV9kZXNjcmlwdGlvbl9pZCA+PQorICAgICAgICAgIHN0cmVhbS0+c3RzZF9lbnRyaWVzX2xlbmd0aCkpIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgREVNVVgsCisgICAgICAgIChfKCJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iKSksCisgICAgICAgICgiTmV3IHNhbXBsZSBkZXNjcmlwdGlvbiBpZCBpcyBvdXQgb2YgYm91bmRzICglZCA+PSAlZCkiLAorICAgICAgICAgICAgc3RyZWFtLT5zdHNkX3NhbXBsZV9kZXNjcmlwdGlvbl9pZCwgc3RyZWFtLT5zdHNkX2VudHJpZXNfbGVuZ3RoKSk7CisgIH0gZWxzZSB7CisgICAgc3RyZWFtLT5jdXJfc3RzZF9lbnRyeV9pbmRleCA9IHN0cmVhbS0+c3RzZF9zYW1wbGVfZGVzY3JpcHRpb25faWQ7CisgICAgc3RyZWFtLT5uZXdfY2FwcyA9IFRSVUU7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcXRkZW11eF9hZGRfc3RyZWFtIChHc3RRVERlbXV4ICogcXRkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtLCBHc3RUYWdMaXN0ICogbGlzdCkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKyAgLyogY29uc2lzdGVudCBkZWZhdWx0IGZvciBwdXNoIGJhc2VkIG1vZGUgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnN0cmVhbS0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKworICBpZiAoc3RyZWFtLT5zdWJ0eXBlID09IEZPVVJDQ192aWRlKSB7CisgICAgZ2NoYXIgKm5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJ2aWRlb18ldSIsIHF0ZGVtdXgtPm5fdmlkZW9fc3RyZWFtcyk7CisKKyAgICBzdHJlYW0tPnBhZCA9CisgICAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmZ3N0X3F0ZGVtdXhfdmlkZW9zcmNfdGVtcGxhdGUsIG5hbWUpOworICAgIGdfZnJlZSAobmFtZSk7CisKKyAgICBpZiAoIWdzdF9xdGRlbXV4X2NvbmZpZ3VyZV9zdHJlYW0gKHF0ZGVtdXgsIHN0cmVhbSkpIHsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHN0cmVhbS0+cGFkKTsKKyAgICAgIHN0cmVhbS0+cGFkID0gTlVMTDsKKyAgICAgIHJldCA9IEZBTFNFOworICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIHF0ZGVtdXgtPm5fdmlkZW9fc3RyZWFtcysrOworICB9IGVsc2UgaWYgKHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0Nfc291bikgeworICAgIGdjaGFyICpuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiYXVkaW9fJXUiLCBxdGRlbXV4LT5uX2F1ZGlvX3N0cmVhbXMpOworCisgICAgc3RyZWFtLT5wYWQgPQorICAgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJmdzdF9xdGRlbXV4X2F1ZGlvc3JjX3RlbXBsYXRlLCBuYW1lKTsKKyAgICBnX2ZyZWUgKG5hbWUpOworICAgIGlmICghZ3N0X3F0ZGVtdXhfY29uZmlndXJlX3N0cmVhbSAocXRkZW11eCwgc3RyZWFtKSkgeworICAgICAgZ3N0X29iamVjdF91bnJlZiAoc3RyZWFtLT5wYWQpOworICAgICAgc3RyZWFtLT5wYWQgPSBOVUxMOworICAgICAgcmV0ID0gRkFMU0U7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIHF0ZGVtdXgtPm5fYXVkaW9fc3RyZWFtcysrOworICB9IGVsc2UgaWYgKHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0Nfc3RybSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJzdHJlYW0gdHlwZSwgbm90IGNyZWF0aW5nIHBhZCIpOworICB9IGVsc2UgaWYgKHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0Nfc3VicCB8fCBzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3RleHQKKyAgICAgIHx8IHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0Nfc2J0bCB8fCBzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3N1YnQpIHsKKyAgICBnY2hhciAqbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInN1YnRpdGxlXyV1IiwgcXRkZW11eC0+bl9zdWJfc3RyZWFtcyk7CisKKyAgICBzdHJlYW0tPnBhZCA9CisgICAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmZ3N0X3F0ZGVtdXhfc3Vic3JjX3RlbXBsYXRlLCBuYW1lKTsKKyAgICBnX2ZyZWUgKG5hbWUpOworICAgIGlmICghZ3N0X3F0ZGVtdXhfY29uZmlndXJlX3N0cmVhbSAocXRkZW11eCwgc3RyZWFtKSkgeworICAgICAgZ3N0X29iamVjdF91bnJlZiAoc3RyZWFtLT5wYWQpOworICAgICAgc3RyZWFtLT5wYWQgPSBOVUxMOworICAgICAgcmV0ID0gRkFMU0U7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIHF0ZGVtdXgtPm5fc3ViX3N0cmVhbXMrKzsKKyAgfSBlbHNlIGlmIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzKSB7CisgICAgZ2NoYXIgKm5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJ2aWRlb18ldSIsIHF0ZGVtdXgtPm5fdmlkZW9fc3RyZWFtcyk7CisKKyAgICBzdHJlYW0tPnBhZCA9CisgICAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmZ3N0X3F0ZGVtdXhfdmlkZW9zcmNfdGVtcGxhdGUsIG5hbWUpOworICAgIGdfZnJlZSAobmFtZSk7CisgICAgaWYgKCFnc3RfcXRkZW11eF9jb25maWd1cmVfc3RyZWFtIChxdGRlbXV4LCBzdHJlYW0pKSB7CisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChzdHJlYW0tPnBhZCk7CisgICAgICBzdHJlYW0tPnBhZCA9IE5VTEw7CisgICAgICByZXQgPSBGQUxTRTsKKyAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgICAgcXRkZW11eC0+bl92aWRlb19zdHJlYW1zKys7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInVua25vd24gc3RyZWFtIHR5cGUiKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBpZiAoc3RyZWFtLT5wYWQpIHsKKyAgICBHTGlzdCAqbDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJhZGRpbmcgcGFkICVzICVwIHRvIHF0ZGVtdXggJXAiLAorICAgICAgICBHU1RfT0JKRUNUX05BTUUgKHN0cmVhbS0+cGFkKSwgc3RyZWFtLT5wYWQsIHF0ZGVtdXgpOworICAgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHF0ZGVtdXgpLCBzdHJlYW0tPnBhZCk7CisgICAgZ3N0X2Zsb3dfY29tYmluZXJfYWRkX3BhZCAocXRkZW11eC0+Zmxvd2NvbWJpbmVyLCBzdHJlYW0tPnBhZCk7CisKKyAgICBpZiAoc3RyZWFtLT5zdHJlYW1fdGFncykKKyAgICAgIGdzdF90YWdfbGlzdF91bnJlZiAoc3RyZWFtLT5zdHJlYW1fdGFncyk7CisgICAgc3RyZWFtLT5zdHJlYW1fdGFncyA9IGxpc3Q7CisgICAgbGlzdCA9IE5VTEw7CisgICAgLyogZ2xvYmFsIHRhZ3MgZ28gb24gZWFjaCBwYWQgYW55d2F5ICovCisgICAgc3RyZWFtLT5zZW5kX2dsb2JhbF90YWdzID0gVFJVRTsKKyAgICAvKiBzZW5kIHVwc3RyZWFtIEdTVF9FVkVOVF9QUk9URUNUSU9OIGV2ZW50cyB0aGF0IHdlcmUgcmVjZWl2ZWQgYmVmb3JlCisgICAgICAgdGhpcyBzb3VyY2UgcGFkIHdhcyBjcmVhdGVkICovCisgICAgZm9yIChsID0gcXRkZW11eC0+cHJvdGVjdGlvbl9ldmVudF9xdWV1ZS5oZWFkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQorICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzdHJlYW0tPnBhZCwgZ3N0X2V2ZW50X3JlZiAobC0+ZGF0YSkpOworICB9Citkb25lOgorICBpZiAobGlzdCkKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKGxpc3QpOworICByZXR1cm4gcmV0OworfQorCisvKiBmaW5kIG5leHQgYXRvbSB3aXRoIEBmb3VyY2Mgc3RhcnRpbmcgYXQgQG9mZnNldCAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK3F0ZGVtdXhfZmluZF9hdG9tIChHc3RRVERlbXV4ICogcXRkZW11eCwgZ3VpbnQ2NCAqIG9mZnNldCwKKyAgICBndWludDY0ICogbGVuZ3RoLCBndWludDMyIGZvdXJjYykKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIGd1aW50MzIgbGZvdXJjYzsKKyAgR3N0QnVmZmVyICpidWY7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJmaW5kaW5nIGZvdXJjYyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIGF0IG9mZnNldCAlIgorICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpLCAqb2Zmc2V0KTsKKworICB3aGlsZSAoVFJVRSkgeworICAgIEdzdE1hcEluZm8gbWFwOworCisgICAgYnVmID0gTlVMTDsKKyAgICByZXQgPSBnc3RfcGFkX3B1bGxfcmFuZ2UgKHF0ZGVtdXgtPnNpbmtwYWQsICpvZmZzZXQsIDE2LCAmYnVmKTsKKyAgICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LKSkKKyAgICAgIGdvdG8gbG9jYXRlX2ZhaWxlZDsKKyAgICBpZiAoR19VTkxJS0VMWSAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSAhPSAxNikpIHsKKyAgICAgIC8qIGxpa2VseSBFT0YgKi8KKyAgICAgIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICBnb3RvIGxvY2F0ZV9mYWlsZWQ7CisgICAgfQorICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgZXh0cmFjdF9pbml0aWFsX2xlbmd0aF9hbmRfZm91cmNjIChtYXAuZGF0YSwgMTYsIGxlbmd0aCwgJmxmb3VyY2MpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAgIGlmIChHX1VOTElLRUxZICgqbGVuZ3RoID09IDApKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiaW52YWxpZCBsZW5ndGggMCIpOworICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICBnb3RvIGxvY2F0ZV9mYWlsZWQ7CisgICAgfQorCisgICAgaWYgKGxmb3VyY2MgPT0gZm91cmNjKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZm91bmQgZm91cmNjIGF0IG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICpvZmZzZXQpOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICJza2lwcGluZyBhdG9tICclIiBHU1RfRk9VUkNDX0ZPUk1BVCAiJyBhdCAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgKm9mZnNldCk7CisgICAgICAqb2Zmc2V0ICs9ICpsZW5ndGg7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCitsb2NhdGVfZmFpbGVkOgorICB7CisgICAgLyogbWlnaHQgc2ltcGx5IGhhdmUgaGFkIGxhc3Qgb25lICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImZvdXJjYyBub3QgZm91bmQiKTsKKyAgICByZXR1cm4gcmV0OworICB9Cit9CisKKy8qIHNob3VsZCBvbmx5IGRvIHNvbWV0aGluZyBpbiBwdWxsIG1vZGUgKi8KKy8qIGNhbGwgd2l0aCBPQkpFQ1QgbG9jayAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK3F0ZGVtdXhfYWRkX2ZyYWdtZW50ZWRfc2FtcGxlcyAoR3N0UVREZW11eCAqIHF0ZGVtdXgpCit7CisgIGd1aW50NjQgbGVuZ3RoLCBvZmZzZXQ7CisgIEdzdEJ1ZmZlciAqYnVmID0gTlVMTDsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0Rmxvd1JldHVybiByZXMgPSBHU1RfRkxPV19PSzsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgb2Zmc2V0ID0gcXRkZW11eC0+bW9vZl9vZmZzZXQ7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJuZXh0IG1vb2YgYXQgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG9mZnNldCk7CisKKyAgaWYgKCFvZmZzZXQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAibm8gbmV4dCBtb29mIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VPUzsKKyAgfQorCisgIC8qIGJlc3Qgbm90IGRvIHB1bGwgZXRjIHdpdGggbG9jayBoZWxkICovCisgIEdTVF9PQkpFQ1RfVU5MT0NLIChxdGRlbXV4KTsKKworICByZXQgPSBxdGRlbXV4X2ZpbmRfYXRvbSAocXRkZW11eCwgJm9mZnNldCwgJmxlbmd0aCwgRk9VUkNDX21vb2YpOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gZmxvd19mYWlsZWQ7CisKKyAgcmV0ID0gZ3N0X3F0ZGVtdXhfcHVsbF9hdG9tIChxdGRlbXV4LCBvZmZzZXQsIGxlbmd0aCwgJmJ1Zik7CisgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spKQorICAgIGdvdG8gZmxvd19mYWlsZWQ7CisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGlmICghcXRkZW11eF9wYXJzZV9tb29mIChxdGRlbXV4LCBtYXAuZGF0YSwgbWFwLnNpemUsIG9mZnNldCwgTlVMTCkpIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgYnVmID0gTlVMTDsKKyAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKyAgfQorCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIGJ1ZiA9IE5VTEw7CisKKyAgb2Zmc2V0ICs9IGxlbmd0aDsKKyAgLyogbG9vayBmb3IgbmV4dCBtb29mICovCisgIHJldCA9IHF0ZGVtdXhfZmluZF9hdG9tIChxdGRlbXV4LCAmb2Zmc2V0LCAmbGVuZ3RoLCBGT1VSQ0NfbW9vZik7CisgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spKQorICAgIGdvdG8gZmxvd19mYWlsZWQ7CisKK2V4aXQ6CisgIEdTVF9PQkpFQ1RfTE9DSyAocXRkZW11eCk7CisKKyAgcXRkZW11eC0+bW9vZl9vZmZzZXQgPSBvZmZzZXQ7CisKKyAgcmV0dXJuIHJlczsKKworcGFyc2VfZmFpbGVkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImZhaWxlZCB0byBwYXJzZSBtb29mIik7CisgICAgb2Zmc2V0ID0gMDsKKyAgICByZXMgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGV4aXQ7CisgIH0KK2Zsb3dfZmFpbGVkOgorICB7CisgICAgLyogbWF5YmUgdXBzdHJlYW0gdGVtcG9yYXJpbHkgZmx1c2hpbmcgKi8KKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX0ZMVVNISU5HKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAibm8gbmV4dCBtb29mIik7CisgICAgICBvZmZzZXQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAidXBzdHJlYW0gV1JPTkdfU1RBVEUiKTsKKyAgICAgIC8qIHJlc3VtZSBhdCBjdXJyZW50IHBvc2l0aW9uIG5leHQgdGltZSAqLworICAgIH0KKyAgICByZXMgPSByZXQ7CisgICAgZ290byBleGl0OworICB9Cit9CisKKy8qIGluaXRpYWxpc2UgYnl0ZXJlYWRlcnMgZm9yIHN0Ymwgc3ViLWF0b21zICovCitzdGF0aWMgZ2Jvb2xlYW4KK3F0ZGVtdXhfc3RibF9pbml0IChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwgR05vZGUgKiBzdGJsKQoreworICBzdHJlYW0tPnN0YmxfaW5kZXggPSAtMTsgICAgICAvKiBubyBzYW1wbGVzIGhhdmUgeWV0IGJlZW4gcGFyc2VkICovCisgIHN0cmVhbS0+c2FtcGxlX2luZGV4ID0gLTE7CisKKyAgLyogdGltZS10by1zYW1wbGUgYXRvbSAqLworICBpZiAoIXF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZV9mdWxsIChzdGJsLCBGT1VSQ0Nfc3R0cywgJnN0cmVhbS0+c3R0cykpCisgICAgZ290byBjb3JydXB0X2ZpbGU7CisKKyAgLyogY29weSBhdG9tIGRhdGEgaW50byBhIG5ldyBidWZmZXIgZm9yIGxhdGVyIHVzZSAqLworICBzdHJlYW0tPnN0dHMuZGF0YSA9IGdfbWVtZHVwIChzdHJlYW0tPnN0dHMuZGF0YSwgc3RyZWFtLT5zdHRzLnNpemUpOworCisgIC8qIHNraXAgdmVyc2lvbiArIGZsYWdzICovCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZzdHJlYW0tPnN0dHMsIDEgKyAzKSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmc3RyZWFtLT5zdHRzLCAmc3RyZWFtLT5uX3NhbXBsZV90aW1lcykpCisgICAgZ290byBjb3JydXB0X2ZpbGU7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiJXUgdGltZXN0YW1wIGJsb2NrcyIsIHN0cmVhbS0+bl9zYW1wbGVfdGltZXMpOworCisgIC8qIG1ha2Ugc3VyZSB0aGVyZSdzIGVub3VnaCBkYXRhICovCisgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX2NodW5rcyAoJnN0cmVhbS0+c3R0cywgc3RyZWFtLT5uX3NhbXBsZV90aW1lcywgOCkpIHsKKyAgICBzdHJlYW0tPm5fc2FtcGxlX3RpbWVzID0gZ3N0X2J5dGVfcmVhZGVyX2dldF9yZW1haW5pbmcgKCZzdHJlYW0tPnN0dHMpIC8gODsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIm92ZXJyaWRpbmcgdG8gJXUgdGltZXN0YW1wIGJsb2NrcyIsCisgICAgICAgIHN0cmVhbS0+bl9zYW1wbGVfdGltZXMpOworICAgIGlmICghc3RyZWFtLT5uX3NhbXBsZV90aW1lcykKKyAgICAgIGdvdG8gY29ycnVwdF9maWxlOworICB9CisKKyAgLyogc3luYyBzYW1wbGUgYXRvbSAqLworICBzdHJlYW0tPnN0cHNfcHJlc2VudCA9IEZBTFNFOworICBpZiAoKHN0cmVhbS0+c3Rzc19wcmVzZW50ID0KKyAgICAgICAgICAhICFxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGVfZnVsbCAoc3RibCwgRk9VUkNDX3N0c3MsCisgICAgICAgICAgICAgICZzdHJlYW0tPnN0c3MpID8gVFJVRSA6IEZBTFNFKSA9PSBUUlVFKSB7CisgICAgLyogY29weSBhdG9tIGRhdGEgaW50byBhIG5ldyBidWZmZXIgZm9yIGxhdGVyIHVzZSAqLworICAgIHN0cmVhbS0+c3Rzcy5kYXRhID0gZ19tZW1kdXAgKHN0cmVhbS0+c3Rzcy5kYXRhLCBzdHJlYW0tPnN0c3Muc2l6ZSk7CisKKyAgICAvKiBza2lwIHZlcnNpb24gKyBmbGFncyAqLworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZzdHJlYW0tPnN0c3MsIDEgKyAzKSB8fAorICAgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZzdHJlYW0tPnN0c3MsICZzdHJlYW0tPm5fc2FtcGxlX3N5bmNzKSkKKyAgICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgICAgaWYgKHN0cmVhbS0+bl9zYW1wbGVfc3luY3MpIHsKKyAgICAgIC8qIG1ha2Ugc3VyZSB0aGVyZSdzIGVub3VnaCBkYXRhICovCisgICAgICBpZiAoIXF0X2F0b21fcGFyc2VyX2hhc19jaHVua3MgKCZzdHJlYW0tPnN0c3MsIHN0cmVhbS0+bl9zYW1wbGVfc3luY3MsIDQpKQorICAgICAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKyAgICB9CisKKyAgICAvKiBwYXJ0aWFsIHN5bmMgc2FtcGxlIGF0b20gKi8KKyAgICBpZiAoKHN0cmVhbS0+c3Rwc19wcmVzZW50ID0KKyAgICAgICAgICAgICEgIXF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZV9mdWxsIChzdGJsLCBGT1VSQ0Nfc3RwcywKKyAgICAgICAgICAgICAgICAmc3RyZWFtLT5zdHBzKSA/IFRSVUUgOiBGQUxTRSkgPT0gVFJVRSkgeworICAgICAgLyogY29weSBhdG9tIGRhdGEgaW50byBhIG5ldyBidWZmZXIgZm9yIGxhdGVyIHVzZSAqLworICAgICAgc3RyZWFtLT5zdHBzLmRhdGEgPSBnX21lbWR1cCAoc3RyZWFtLT5zdHBzLmRhdGEsIHN0cmVhbS0+c3Rwcy5zaXplKTsKKworICAgICAgLyogc2tpcCB2ZXJzaW9uICsgZmxhZ3MgKi8KKyAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZzdHJlYW0tPnN0cHMsIDEgKyAzKSB8fAorICAgICAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoJnN0cmVhbS0+c3RwcywKKyAgICAgICAgICAgICAgJnN0cmVhbS0+bl9zYW1wbGVfcGFydGlhbF9zeW5jcykpCisgICAgICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgICAgICAvKiBpZiB0aGVyZSBhcmUgbm8gZW50cmllcywgdGhlIHN0c3MgdGFibGUgY29udGFpbnMgdGhlIHJlYWwKKyAgICAgICAqIHN5bmMgc2FtcGxlcyAqLworICAgICAgaWYgKHN0cmVhbS0+bl9zYW1wbGVfcGFydGlhbF9zeW5jcykgeworICAgICAgICAvKiBtYWtlIHN1cmUgdGhlcmUncyBlbm91Z2ggZGF0YSAqLworICAgICAgICBpZiAoIXF0X2F0b21fcGFyc2VyX2hhc19jaHVua3MgKCZzdHJlYW0tPnN0cHMsCisgICAgICAgICAgICAgICAgc3RyZWFtLT5uX3NhbXBsZV9wYXJ0aWFsX3N5bmNzLCA0KSkKKyAgICAgICAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBzYW1wbGUgc2l6ZSAqLworICBpZiAoIXF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZV9mdWxsIChzdGJsLCBGT1VSQ0Nfc3RzeiwgJnN0cmVhbS0+c3RzeikpCisgICAgZ290byBub19zYW1wbGVzOworCisgIC8qIGNvcHkgYXRvbSBkYXRhIGludG8gYSBuZXcgYnVmZmVyIGZvciBsYXRlciB1c2UgKi8KKyAgc3RyZWFtLT5zdHN6LmRhdGEgPSBnX21lbWR1cCAoc3RyZWFtLT5zdHN6LmRhdGEsIHN0cmVhbS0+c3Rzei5zaXplKTsKKworICAvKiBza2lwIHZlcnNpb24gKyBmbGFncyAqLworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmc3RyZWFtLT5zdHN6LCAxICsgMykgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoJnN0cmVhbS0+c3RzeiwgJnN0cmVhbS0+c2FtcGxlX3NpemUpKQorICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZzdHJlYW0tPnN0c3osICZzdHJlYW0tPm5fc2FtcGxlcykpCisgICAgZ290byBjb3JydXB0X2ZpbGU7CisKKyAgaWYgKCFzdHJlYW0tPm5fc2FtcGxlcykKKyAgICBnb3RvIG5vX3NhbXBsZXM7CisKKyAgLyogc2FtcGxlLXRvLWNodW5rIGF0b20gKi8KKyAgaWYgKCFxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGVfZnVsbCAoc3RibCwgRk9VUkNDX3N0c2MsICZzdHJlYW0tPnN0c2MpKQorICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgIC8qIGNvcHkgYXRvbSBkYXRhIGludG8gYSBuZXcgYnVmZmVyIGZvciBsYXRlciB1c2UgKi8KKyAgc3RyZWFtLT5zdHNjLmRhdGEgPSBnX21lbWR1cCAoc3RyZWFtLT5zdHNjLmRhdGEsIHN0cmVhbS0+c3RzYy5zaXplKTsKKworICAvKiBza2lwIHZlcnNpb24gKyBmbGFncyAqLworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmc3RyZWFtLT5zdHNjLCAxICsgMykgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoJnN0cmVhbS0+c3RzYywKKyAgICAgICAgICAmc3RyZWFtLT5uX3NhbXBsZXNfcGVyX2NodW5rKSkKKyAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAibl9zYW1wbGVzX3Blcl9jaHVuayAldSIsCisgICAgICBzdHJlYW0tPm5fc2FtcGxlc19wZXJfY2h1bmspOworCisgIC8qIG1ha2Ugc3VyZSB0aGVyZSdzIGVub3VnaCBkYXRhICovCisgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX2NodW5rcyAoJnN0cmVhbS0+c3RzYywgc3RyZWFtLT5uX3NhbXBsZXNfcGVyX2NodW5rLAorICAgICAgICAgIDEyKSkKKyAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworCisgIC8qIGNodW5rIG9mZnNldCAqLworICBpZiAocXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlX2Z1bGwgKHN0YmwsIEZPVVJDQ19zdGNvLCAmc3RyZWFtLT5zdGNvKSkKKyAgICBzdHJlYW0tPmNvX3NpemUgPSBzaXplb2YgKGd1aW50MzIpOworICBlbHNlIGlmIChxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGVfZnVsbCAoc3RibCwgRk9VUkNDX2NvNjQsCisgICAgICAgICAgJnN0cmVhbS0+c3RjbykpCisgICAgc3RyZWFtLT5jb19zaXplID0gc2l6ZW9mIChndWludDY0KTsKKyAgZWxzZQorICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgIC8qIGNvcHkgYXRvbSBkYXRhIGludG8gYSBuZXcgYnVmZmVyIGZvciBsYXRlciB1c2UgKi8KKyAgc3RyZWFtLT5zdGNvLmRhdGEgPSBnX21lbWR1cCAoc3RyZWFtLT5zdGNvLmRhdGEsIHN0cmVhbS0+c3Rjby5zaXplKTsKKworICAvKiBza2lwIHZlcnNpb24gKyBmbGFncyAqLworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmc3RyZWFtLT5zdGNvLCAxICsgMykpCisgICAgZ290byBjb3JydXB0X2ZpbGU7CisKKyAgLyogY2h1bmtzX2FyZV9zYW1wbGVzID09IFRSVUUgbWVhbnMgdHJlYXQgY2h1bmtzIGFzIHNhbXBsZXMgKi8KKyAgc3RyZWFtLT5jaHVua3NfYXJlX3NhbXBsZXMgPSBzdHJlYW0tPnNhbXBsZV9zaXplCisgICAgICAmJiAhQ1VSX1NUUkVBTSAoc3RyZWFtKS0+c2FtcGxlZDsKKyAgaWYgKHN0cmVhbS0+Y2h1bmtzX2FyZV9zYW1wbGVzKSB7CisgICAgLyogdHJlYXQgY2h1bmtzIGFzIHNhbXBsZXMgKi8KKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmc3RyZWFtLT5zdGNvLCAmc3RyZWFtLT5uX3NhbXBsZXMpKQorICAgICAgZ290byBjb3JydXB0X2ZpbGU7CisgIH0gZWxzZSB7CisgICAgLyogc2tpcCBudW1iZXIgb2YgZW50cmllcyAqLworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZzdHJlYW0tPnN0Y28sIDQpKQorICAgICAgZ290byBjb3JydXB0X2ZpbGU7CisKKyAgICAvKiBtYWtlIHN1cmUgdGhlcmUgYXJlIGVub3VnaCBkYXRhIGluIHRoZSBzdHN6IGF0b20gKi8KKyAgICBpZiAoIXN0cmVhbS0+c2FtcGxlX3NpemUpIHsKKyAgICAgIC8qIGRpZmZlcmVudCBzaXplcyBmb3IgZWFjaCBzYW1wbGUgKi8KKyAgICAgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX2NodW5rcyAoJnN0cmVhbS0+c3Rzeiwgc3RyZWFtLT5uX3NhbXBsZXMsIDQpKQorICAgICAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKyAgICB9CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiYWxsb2NhdGluZyBuX3NhbXBsZXMgJXUgKiAldSAoJS4yZiBNQikiLAorICAgICAgc3RyZWFtLT5uX3NhbXBsZXMsIChndWludCkgc2l6ZW9mIChRdERlbXV4U2FtcGxlKSwKKyAgICAgIHN0cmVhbS0+bl9zYW1wbGVzICogc2l6ZW9mIChRdERlbXV4U2FtcGxlKSAvICgxMDI0LjAgKiAxMDI0LjApKTsKKworICBpZiAoc3RyZWFtLT5uX3NhbXBsZXMgPj0KKyAgICAgIFFUREVNVVhfTUFYX1NBTVBMRV9JTkRFWF9TSVpFIC8gc2l6ZW9mIChRdERlbXV4U2FtcGxlKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIm5vdCBhbGxvY2F0aW5nIGluZGV4IG9mICVkIHNhbXBsZXMsIHdvdWxkICIKKyAgICAgICAgImJlIGxhcmdlciB0aGFuICV1TUIgKGJyb2tlbiBmaWxlPykiLCBzdHJlYW0tPm5fc2FtcGxlcywKKyAgICAgICAgUVRERU1VWF9NQVhfU0FNUExFX0lOREVYX1NJWkUgPj4gMjApOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGdfYXNzZXJ0IChzdHJlYW0tPnNhbXBsZXMgPT0gTlVMTCk7CisgIHN0cmVhbS0+c2FtcGxlcyA9IGdfdHJ5X25ldzAgKFF0RGVtdXhTYW1wbGUsIHN0cmVhbS0+bl9zYW1wbGVzKTsKKyAgaWYgKCFzdHJlYW0tPnNhbXBsZXMpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJmYWlsZWQgdG8gYWxsb2NhdGUgJWQgc2FtcGxlcyIsCisgICAgICAgIHN0cmVhbS0+bl9zYW1wbGVzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBjb21wb3NpdGlvbiB0aW1lLXRvLXNhbXBsZSAqLworICBpZiAoKHN0cmVhbS0+Y3R0c19wcmVzZW50ID0KKyAgICAgICAgICAhICFxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGVfZnVsbCAoc3RibCwgRk9VUkNDX2N0dHMsCisgICAgICAgICAgICAgICZzdHJlYW0tPmN0dHMpID8gVFJVRSA6IEZBTFNFKSA9PSBUUlVFKSB7CisgICAgR3N0Qnl0ZVJlYWRlciBjc2xnID0gR1NUX0JZVEVfUkVBREVSX0lOSVQgKE5VTEwsIDApOworCisgICAgLyogY29weSBhdG9tIGRhdGEgaW50byBhIG5ldyBidWZmZXIgZm9yIGxhdGVyIHVzZSAqLworICAgIHN0cmVhbS0+Y3R0cy5kYXRhID0gZ19tZW1kdXAgKHN0cmVhbS0+Y3R0cy5kYXRhLCBzdHJlYW0tPmN0dHMuc2l6ZSk7CisKKyAgICAvKiBza2lwIHZlcnNpb24gKyBmbGFncyAqLworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZzdHJlYW0tPmN0dHMsIDEgKyAzKQorICAgICAgICB8fCAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZzdHJlYW0tPmN0dHMsCisgICAgICAgICAgICAmc3RyZWFtLT5uX2NvbXBvc2l0aW9uX3RpbWVzKSkKKyAgICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgICAgLyogbWFrZSBzdXJlIHRoZXJlJ3MgZW5vdWdoIGRhdGEgKi8KKyAgICBpZiAoIXF0X2F0b21fcGFyc2VyX2hhc19jaHVua3MgKCZzdHJlYW0tPmN0dHMsIHN0cmVhbS0+bl9jb21wb3NpdGlvbl90aW1lcywKKyAgICAgICAgICAgIDQgKyA0KSkKKyAgICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgICAgLyogVGhpcyBpcyBvcHRpb25hbCwgaWYgbWlzc2luZyB3ZSBpdGVyYXRlIHRoZSBjdHRzICovCisgICAgaWYgKHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZV9mdWxsIChzdGJsLCBGT1VSQ0NfY3NsZywgJmNzbGcpKSB7CisgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmY3NsZywgMSArIDMpCisgICAgICAgICAgfHwgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmY3NsZywgJnN0cmVhbS0+Y3NsZ19zaGlmdCkpIHsKKyAgICAgICAgZ19mcmVlICgoZ3BvaW50ZXIpIGNzbGcuZGF0YSk7CisgICAgICAgIGdvdG8gY29ycnVwdF9maWxlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBnaW50MzIgY3NsZ19sZWFzdCA9IDA7CisgICAgICBndWludCBudW1fZW50cmllcywgcG9zOworICAgICAgZ2ludCBpOworCisgICAgICBwb3MgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3BvcyAoJnN0cmVhbS0+Y3R0cyk7CisgICAgICBudW1fZW50cmllcyA9IHN0cmVhbS0+bl9jb21wb3NpdGlvbl90aW1lczsKKworICAgICAgc3RyZWFtLT5jc2xnX3NoaWZ0ID0gMDsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9lbnRyaWVzOyBpKyspIHsKKyAgICAgICAgZ2ludDMyIG9mZnNldDsKKworICAgICAgICBnc3RfYnl0ZV9yZWFkZXJfc2tpcF91bmNoZWNrZWQgKCZzdHJlYW0tPmN0dHMsIDQpOworICAgICAgICBvZmZzZXQgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X2ludDMyX2JlX3VuY2hlY2tlZCAoJnN0cmVhbS0+Y3R0cyk7CisKKyAgICAgICAgaWYgKG9mZnNldCA8IGNzbGdfbGVhc3QpCisgICAgICAgICAgY3NsZ19sZWFzdCA9IG9mZnNldDsKKyAgICAgIH0KKworICAgICAgaWYgKGNzbGdfbGVhc3QgPCAwKQorICAgICAgICBzdHJlYW0tPmNzbGdfc2hpZnQgPSBBQlMgKGNzbGdfbGVhc3QpOworICAgICAgZWxzZQorICAgICAgICBzdHJlYW0tPmNzbGdfc2hpZnQgPSAwOworCisgICAgICAvKiByZXNldCB0aGUgcmVhZGVyIHNvIHdlIGNhbiBnZW5lcmF0ZSBzYW1wbGUgdGFibGUgKi8KKyAgICAgIGdzdF9ieXRlX3JlYWRlcl9zZXRfcG9zICgmc3RyZWFtLT5jdHRzLCBwb3MpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBFbnN1cmUgdGhlIGNzbGdfc2hpZnQgdmFsdWUgaXMgY29uc2lzdGVudCBzbyB3ZSBjYW4gdXNlIGl0CisgICAgICogdW5jb25kaXRpb25uYWxseSB0byBwcm9kdWNlIFRTIGFuZCBTZWdtZW50ICovCisgICAgc3RyZWFtLT5jc2xnX3NoaWZ0ID0gMDsKKyAgfQorCisgIHJldHVybiBUUlVFOworCitjb3JydXB0X2ZpbGU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRkZW11eCwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgKF8oIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIpKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX3NhbXBsZXM6CisgIHsKKyAgICBnc3RfcXRkZW11eF9zdGJsX2ZyZWUgKHN0cmVhbSk7CisgICAgaWYgKCFxdGRlbXV4LT5mcmFnbWVudGVkKSB7CisgICAgICAvKiBub3QgcXVpdGUgZ29vZCAqLworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAic3RyZWFtIGhhcyBubyBzYW1wbGVzIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIG1heSBwaWNrIHVwIHNhbXBsZXMgZWxzZXdoZXJlICovCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KK30KKworLyogY29sbGVjdCBzYW1wbGVzIGZyb20gdGhlIG5leHQgc2FtcGxlIHRvIGJlIHBhcnNlZCB1cCB0byBzYW1wbGUgQG4gZm9yIEBzdHJlYW0KKyAqIGJ5IHJlYWRpbmcgdGhlIGluZm8gZnJvbSBAc3RibAorICoKKyAqIFRoaXMgY29kZSBjYW4gYmUgZXhlY3V0ZWQgZnJvbSBib3RoIHRoZSBzdHJlYW1pbmcgdGhyZWFkIGFuZCB0aGUgc2Vla2luZworICogdGhyZWFkIHNvIGl0IHRha2VzIHRoZSBvYmplY3QgbG9jayB0byBwcm90ZWN0IGl0c2VsZgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK3F0ZGVtdXhfcGFyc2Vfc2FtcGxlcyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0sIGd1aW50MzIgbikKK3sKKyAgZ2ludCBpLCBqLCBrOworICBRdERlbXV4U2FtcGxlICpzYW1wbGVzLCAqZmlyc3QsICpjdXIsICpsYXN0OworICBndWludDMyIG5fc2FtcGxlc19wZXJfY2h1bms7CisgIGd1aW50MzIgbl9zYW1wbGVzOworCisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAicGFyc2luZyBzYW1wbGVzIGZvciBzdHJlYW0gZm91cmNjICUiCisgICAgICBHU1RfRk9VUkNDX0ZPUk1BVCAiLCBwYWQgJXMiLAorICAgICAgR1NUX0ZPVVJDQ19BUkdTIChDVVJfU1RSRUFNIChzdHJlYW0pLT5mb3VyY2MpLAorICAgICAgc3RyZWFtLT5wYWQgPyBHU1RfUEFEX05BTUUgKHN0cmVhbS0+cGFkKSA6ICIoTlVMTCkiKTsKKworICBuX3NhbXBsZXMgPSBzdHJlYW0tPm5fc2FtcGxlczsKKworICBpZiAobiA+PSBuX3NhbXBsZXMpCisgICAgZ290byBvdXRfb2Zfc2FtcGxlczsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHF0ZGVtdXgpOworICBpZiAobiA8PSBzdHJlYW0tPnN0YmxfaW5kZXgpCisgICAgZ290byBhbHJlYWR5X3BhcnNlZDsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicGFyc2luZyB1cCB0byBzYW1wbGUgJXUiLCBuKTsKKworICBpZiAoIXN0cmVhbS0+c3Rzei5kYXRhKSB7CisgICAgLyogc28gd2UgYWxyZWFkeSBwYXJzZWQgYW5kIHBhc3NlZCBhbGwgdGhlIG1vb3Ygc2FtcGxlczsKKyAgICAgKiBvbnRvIGZyYWdtZW50ZWQgb25lcyAqLworICAgIGdfYXNzZXJ0IChxdGRlbXV4LT5mcmFnbWVudGVkKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICAvKiBwb2ludGVyIHRvIHRoZSBzYW1wbGUgdGFibGUgKi8KKyAgc2FtcGxlcyA9IHN0cmVhbS0+c2FtcGxlczsKKworICAvKiBzdGFydHMgZnJvbSAtMSwgbW92ZXMgdG8gdGhlIG5leHQgc2FtcGxlIGluZGV4IHRvIHBhcnNlICovCisgIHN0cmVhbS0+c3RibF9pbmRleCsrOworCisgIC8qIGtlZXAgdHJhY2sgb2YgdGhlIGZpcnN0IGFuZCBsYXN0IHNhbXBsZSB0byBmaWxsICovCisgIGZpcnN0ID0gJnNhbXBsZXNbc3RyZWFtLT5zdGJsX2luZGV4XTsKKyAgbGFzdCA9ICZzYW1wbGVzW25dOworCisgIGlmICghc3RyZWFtLT5jaHVua3NfYXJlX3NhbXBsZXMpIHsKKyAgICAvKiBzZXQgdGhlIHNhbXBsZSBzaXplcyAqLworICAgIGlmIChzdHJlYW0tPnNhbXBsZV9zaXplID09IDApIHsKKyAgICAgIC8qIGRpZmZlcmVudCBzaXplcyBmb3IgZWFjaCBzYW1wbGUgKi8KKyAgICAgIGZvciAoY3VyID0gZmlyc3Q7IGN1ciA8PSBsYXN0OyBjdXIrKykgeworICAgICAgICBjdXItPnNpemUgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQgKCZzdHJlYW0tPnN0c3opOworICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInNhbXBsZSAlZCBoYXMgc2l6ZSAldSIsCisgICAgICAgICAgICAoZ3VpbnQpIChjdXIgLSBzYW1wbGVzKSwgY3VyLT5zaXplKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogc2FtcGxlcyBoYXZlIHRoZSBzYW1lIHNpemUgKi8KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiYWxsIHNhbXBsZXMgaGF2ZSBzaXplICV1Iiwgc3RyZWFtLT5zYW1wbGVfc2l6ZSk7CisgICAgICBmb3IgKGN1ciA9IGZpcnN0OyBjdXIgPD0gbGFzdDsgY3VyKyspCisgICAgICAgIGN1ci0+c2l6ZSA9IHN0cmVhbS0+c2FtcGxlX3NpemU7CisgICAgfQorICB9CisKKyAgbl9zYW1wbGVzX3Blcl9jaHVuayA9IHN0cmVhbS0+bl9zYW1wbGVzX3Blcl9jaHVuazsKKyAgY3VyID0gZmlyc3Q7CisKKyAgZm9yIChpID0gc3RyZWFtLT5zdHNjX2luZGV4OyBpIDwgbl9zYW1wbGVzX3Blcl9jaHVuazsgaSsrKSB7CisgICAgZ3VpbnQzMiBsYXN0X2NodW5rOworCisgICAgaWYgKHN0cmVhbS0+c3RzY19jaHVua19pbmRleCA+PSBzdHJlYW0tPmxhc3RfY2h1bmsKKyAgICAgICAgfHwgc3RyZWFtLT5zdHNjX2NodW5rX2luZGV4IDwgc3RyZWFtLT5maXJzdF9jaHVuaykgeworICAgICAgc3RyZWFtLT5maXJzdF9jaHVuayA9CisgICAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmVfdW5jaGVja2VkICgmc3RyZWFtLT5zdHNjKTsKKyAgICAgIHN0cmVhbS0+c2FtcGxlc19wZXJfY2h1bmsgPQorICAgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAoJnN0cmVhbS0+c3RzYyk7CisgICAgICAvKiBzdGFydHMgZnJvbSAxICovCisgICAgICBzdHJlYW0tPnN0c2Rfc2FtcGxlX2Rlc2NyaXB0aW9uX2lkID0KKyAgICAgICAgICBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQgKCZzdHJlYW0tPnN0c2MpIC0gMTsKKworICAgICAgLyogY2h1bmsgbnVtYmVycyBhcmUgY291bnRlZCBmcm9tIDEgaXQgc2VlbXMgKi8KKyAgICAgIGlmIChHX1VOTElLRUxZIChzdHJlYW0tPmZpcnN0X2NodW5rID09IDApKQorICAgICAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworICAgICAgLS1zdHJlYW0tPmZpcnN0X2NodW5rOworCisgICAgICAvKiB0aGUgbGFzdCBjaHVuayBvZiBlYWNoIGVudHJ5IGlzIGNhbGN1bGF0ZWQgYnkgdGFraW5nIHRoZSBmaXJzdCBjaHVuaworICAgICAgICogb2YgdGhlIG5leHQgZW50cnk7IGV4Y2VwdCBpZiB0aGVyZSBpcyBubyBuZXh0LCB3aGVyZSB3ZSBmYWtlIGl0IHdpdGgKKyAgICAgICAqIElOVF9NQVggKi8KKyAgICAgIGlmIChHX1VOTElLRUxZIChpID09IChzdHJlYW0tPm5fc2FtcGxlc19wZXJfY2h1bmsgLSAxKSkpIHsKKyAgICAgICAgc3RyZWFtLT5sYXN0X2NodW5rID0gR19NQVhVSU5UMzI7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdHJlYW0tPmxhc3RfY2h1bmsgPQorICAgICAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX3BlZWtfdWludDMyX2JlX3VuY2hlY2tlZCAoJnN0cmVhbS0+c3RzYyk7CisgICAgICAgIGlmIChHX1VOTElLRUxZIChzdHJlYW0tPmxhc3RfY2h1bmsgPT0gMCkpCisgICAgICAgICAgZ290byBjb3JydXB0X2ZpbGU7CisKKyAgICAgICAgLS1zdHJlYW0tPmxhc3RfY2h1bms7CisgICAgICB9CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICJlbnRyeSAlZCBoYXMgZmlyc3RfY2h1bmsgJWQsIGxhc3RfY2h1bmsgJWQsIHNhbXBsZXNfcGVyX2NodW5rICVkIgorICAgICAgICAgICJzYW1wbGUgZGVzYyBJRDogJWQiLCBpLCBzdHJlYW0tPmZpcnN0X2NodW5rLCBzdHJlYW0tPmxhc3RfY2h1bmssCisgICAgICAgICAgc3RyZWFtLT5zYW1wbGVzX3Blcl9jaHVuaywgc3RyZWFtLT5zdHNkX3NhbXBsZV9kZXNjcmlwdGlvbl9pZCk7CisKKyAgICAgIGlmIChHX1VOTElLRUxZIChzdHJlYW0tPmxhc3RfY2h1bmsgPCBzdHJlYW0tPmZpcnN0X2NodW5rKSkKKyAgICAgICAgZ290byBjb3JydXB0X2ZpbGU7CisKKyAgICAgIGlmIChzdHJlYW0tPmxhc3RfY2h1bmsgIT0gR19NQVhVSU5UMzIpIHsKKyAgICAgICAgaWYgKCFxdF9hdG9tX3BhcnNlcl9wZWVrX3N1YiAoJnN0cmVhbS0+c3RjbywKKyAgICAgICAgICAgICAgICBzdHJlYW0tPmZpcnN0X2NodW5rICogc3RyZWFtLT5jb19zaXplLAorICAgICAgICAgICAgICAgIChzdHJlYW0tPmxhc3RfY2h1bmsgLSBzdHJlYW0tPmZpcnN0X2NodW5rKSAqIHN0cmVhbS0+Y29fc2l6ZSwKKyAgICAgICAgICAgICAgICAmc3RyZWFtLT5jb19jaHVuaykpCisgICAgICAgICAgZ290byBjb3JydXB0X2ZpbGU7CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmVhbS0+Y29fY2h1bmsgPSBzdHJlYW0tPnN0Y287CisgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZzdHJlYW0tPmNvX2NodW5rLAorICAgICAgICAgICAgICAgIHN0cmVhbS0+Zmlyc3RfY2h1bmsgKiBzdHJlYW0tPmNvX3NpemUpKQorICAgICAgICAgIGdvdG8gY29ycnVwdF9maWxlOworICAgICAgfQorCisgICAgICBzdHJlYW0tPnN0c2NfY2h1bmtfaW5kZXggPSBzdHJlYW0tPmZpcnN0X2NodW5rOworICAgIH0KKworICAgIGxhc3RfY2h1bmsgPSBzdHJlYW0tPmxhc3RfY2h1bms7CisKKyAgICBpZiAoc3RyZWFtLT5jaHVua3NfYXJlX3NhbXBsZXMpIHsKKyAgICAgIGN1ciA9ICZzYW1wbGVzW3N0cmVhbS0+c3RzY19jaHVua19pbmRleF07CisKKyAgICAgIGZvciAoaiA9IHN0cmVhbS0+c3RzY19jaHVua19pbmRleDsgaiA8IGxhc3RfY2h1bms7IGorKykgeworICAgICAgICBpZiAoaiA+IG4pIHsKKyAgICAgICAgICAvKiBzYXZlIHN0YXRlICovCisgICAgICAgICAgc3RyZWFtLT5zdHNjX2NodW5rX2luZGV4ID0gajsKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKworICAgICAgICBjdXItPm9mZnNldCA9CisgICAgICAgICAgICBxdF9hdG9tX3BhcnNlcl9nZXRfb2Zmc2V0X3VuY2hlY2tlZCAoJnN0cmVhbS0+Y29fY2h1bmssCisgICAgICAgICAgICBzdHJlYW0tPmNvX3NpemUpOworCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiQ3JlYXRlZCBlbnRyeSAlZCB3aXRoIG9mZnNldCAiCisgICAgICAgICAgICAiJSIgR19HVUlOVDY0X0ZPUk1BVCwgaiwgY3VyLT5vZmZzZXQpOworCisgICAgICAgIGlmIChDVVJfU1RSRUFNIChzdHJlYW0pLT5zYW1wbGVzX3Blcl9mcmFtZSA+IDAgJiYKKyAgICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmJ5dGVzX3Blcl9mcmFtZSA+IDApIHsKKyAgICAgICAgICBjdXItPnNpemUgPQorICAgICAgICAgICAgICAoc3RyZWFtLT5zYW1wbGVzX3Blcl9jaHVuayAqIENVUl9TVFJFQU0gKHN0cmVhbSktPm5fY2hhbm5lbHMpIC8KKyAgICAgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+c2FtcGxlc19wZXJfZnJhbWUgKgorICAgICAgICAgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT5ieXRlc19wZXJfZnJhbWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY3VyLT5zaXplID0gc3RyZWFtLT5zYW1wbGVzX3Blcl9jaHVuazsKKyAgICAgICAgfQorCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAia2V5ZnJhbWUgc2FtcGxlICVkOiB0aW1lc3RhbXAgJSIgR1NUX1RJTUVfRk9STUFUICIsIHNpemUgJXUiLAorICAgICAgICAgICAgaiwgR1NUX1RJTUVfQVJHUyAoUVRTVFJFQU1USU1FX1RPX0dTVFRJTUUgKHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5zdGNvX3NhbXBsZV9pbmRleCkpLCBjdXItPnNpemUpOworCisgICAgICAgIGN1ci0+dGltZXN0YW1wID0gc3RyZWFtLT5zdGNvX3NhbXBsZV9pbmRleDsKKyAgICAgICAgY3VyLT5kdXJhdGlvbiA9IHN0cmVhbS0+c2FtcGxlc19wZXJfY2h1bms7CisgICAgICAgIGN1ci0+a2V5ZnJhbWUgPSBUUlVFOworICAgICAgICBjdXIrKzsKKworICAgICAgICBzdHJlYW0tPnN0Y29fc2FtcGxlX2luZGV4ICs9IHN0cmVhbS0+c2FtcGxlc19wZXJfY2h1bms7CisgICAgICB9CisgICAgICBzdHJlYW0tPnN0c2NfY2h1bmtfaW5kZXggPSBqOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGogPSBzdHJlYW0tPnN0c2NfY2h1bmtfaW5kZXg7IGogPCBsYXN0X2NodW5rOyBqKyspIHsKKyAgICAgICAgZ3VpbnQzMiBzYW1wbGVzX3Blcl9jaHVuazsKKyAgICAgICAgZ3VpbnQ2NCBjaHVua19vZmZzZXQ7CisKKyAgICAgICAgaWYgKCFzdHJlYW0tPnN0c2Nfc2FtcGxlX2luZGV4CisgICAgICAgICAgICAmJiAhcXRfYXRvbV9wYXJzZXJfZ2V0X29mZnNldCAoJnN0cmVhbS0+Y29fY2h1bmssIHN0cmVhbS0+Y29fc2l6ZSwKKyAgICAgICAgICAgICAgICAmc3RyZWFtLT5jaHVua19vZmZzZXQpKQorICAgICAgICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgICAgICAgIHNhbXBsZXNfcGVyX2NodW5rID0gc3RyZWFtLT5zYW1wbGVzX3Blcl9jaHVuazsKKyAgICAgICAgY2h1bmtfb2Zmc2V0ID0gc3RyZWFtLT5jaHVua19vZmZzZXQ7CisKKyAgICAgICAgZm9yIChrID0gc3RyZWFtLT5zdHNjX3NhbXBsZV9pbmRleDsgayA8IHNhbXBsZXNfcGVyX2NodW5rOyBrKyspIHsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgImNyZWF0aW5nIGVudHJ5ICVkIHdpdGggb2Zmc2V0ICUiCisgICAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIiBhbmQgc2l6ZSAlZCIsCisgICAgICAgICAgICAgIChndWludCkgKGN1ciAtIHNhbXBsZXMpLCBjaHVua19vZmZzZXQsIGN1ci0+c2l6ZSk7CisKKyAgICAgICAgICBjdXItPm9mZnNldCA9IGNodW5rX29mZnNldDsKKyAgICAgICAgICBjaHVua19vZmZzZXQgKz0gY3VyLT5zaXplOworICAgICAgICAgIGN1cisrOworCisgICAgICAgICAgaWYgKEdfVU5MSUtFTFkgKGN1ciA+IGxhc3QpKSB7CisgICAgICAgICAgICAvKiBzYXZlIHN0YXRlICovCisgICAgICAgICAgICBzdHJlYW0tPnN0c2Nfc2FtcGxlX2luZGV4ID0gayArIDE7CisgICAgICAgICAgICBzdHJlYW0tPmNodW5rX29mZnNldCA9IGNodW5rX29mZnNldDsKKyAgICAgICAgICAgIHN0cmVhbS0+c3RzY19jaHVua19pbmRleCA9IGo7CisgICAgICAgICAgICBnb3RvIGRvbmUyOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJlYW0tPnN0c2Nfc2FtcGxlX2luZGV4ID0gMDsKKyAgICAgIH0KKyAgICAgIHN0cmVhbS0+c3RzY19jaHVua19pbmRleCA9IGo7CisgICAgfQorICAgIHN0cmVhbS0+c3RzY19pbmRleCsrOworICB9CisKKyAgaWYgKHN0cmVhbS0+Y2h1bmtzX2FyZV9zYW1wbGVzKQorICAgIGdvdG8gY3R0czsKK2RvbmUyOgorICB7CisgICAgZ3VpbnQzMiBuX3NhbXBsZV90aW1lczsKKworICAgIG5fc2FtcGxlX3RpbWVzID0gc3RyZWFtLT5uX3NhbXBsZV90aW1lczsKKyAgICBjdXIgPSBmaXJzdDsKKworICAgIGZvciAoaSA9IHN0cmVhbS0+c3R0c19pbmRleDsgaSA8IG5fc2FtcGxlX3RpbWVzOyBpKyspIHsKKyAgICAgIGd1aW50MzIgc3R0c19zYW1wbGVzOworICAgICAgZ2ludDMyIHN0dHNfZHVyYXRpb247CisgICAgICBnaW50NjQgc3R0c190aW1lOworCisgICAgICBpZiAoc3RyZWFtLT5zdHRzX3NhbXBsZV9pbmRleCA+PSBzdHJlYW0tPnN0dHNfc2FtcGxlcworICAgICAgICAgIHx8ICFzdHJlYW0tPnN0dHNfc2FtcGxlX2luZGV4KSB7CisKKyAgICAgICAgc3RyZWFtLT5zdHRzX3NhbXBsZXMgPQorICAgICAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmVfdW5jaGVja2VkICgmc3RyZWFtLT5zdHRzKTsKKyAgICAgICAgc3RyZWFtLT5zdHRzX2R1cmF0aW9uID0KKyAgICAgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAoJnN0cmVhbS0+c3R0cyk7CisKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJibG9jayAlZCwgJXUgdGltZXN0YW1wcywgZHVyYXRpb24gJXUiLAorICAgICAgICAgICAgaSwgc3RyZWFtLT5zdHRzX3NhbXBsZXMsIHN0cmVhbS0+c3R0c19kdXJhdGlvbik7CisKKyAgICAgICAgc3RyZWFtLT5zdHRzX3NhbXBsZV9pbmRleCA9IDA7CisgICAgICB9CisKKyAgICAgIHN0dHNfc2FtcGxlcyA9IHN0cmVhbS0+c3R0c19zYW1wbGVzOworICAgICAgc3R0c19kdXJhdGlvbiA9IHN0cmVhbS0+c3R0c19kdXJhdGlvbjsKKyAgICAgIHN0dHNfdGltZSA9IHN0cmVhbS0+c3R0c190aW1lOworCisgICAgICBmb3IgKGogPSBzdHJlYW0tPnN0dHNfc2FtcGxlX2luZGV4OyBqIDwgc3R0c19zYW1wbGVzOyBqKyspIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICJzYW1wbGUgJWQ6IGluZGV4ICVkLCB0aW1lc3RhbXAgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgKGd1aW50KSAoY3VyIC0gc2FtcGxlcyksIGosCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChRVFNUUkVBTVRJTUVfVE9fR1NUVElNRSAoc3RyZWFtLCBzdHRzX3RpbWUpKSk7CisKKyAgICAgICAgY3VyLT50aW1lc3RhbXAgPSBzdHRzX3RpbWU7CisgICAgICAgIGN1ci0+ZHVyYXRpb24gPSBzdHRzX2R1cmF0aW9uOworCisgICAgICAgIC8qIGF2b2lkIDMyLWJpdCB3cmFwLWFyb3VuZCwKKyAgICAgICAgICogYnV0IHN0aWxsIG1pbmQgcG9zc2libGUgJ25lZ2F0aXZlJyBkdXJhdGlvbiAqLworICAgICAgICBzdHRzX3RpbWUgKz0gKGdpbnQ2NCkgc3R0c19kdXJhdGlvbjsKKyAgICAgICAgY3VyKys7CisKKyAgICAgICAgaWYgKEdfVU5MSUtFTFkgKGN1ciA+IGxhc3QpKSB7CisgICAgICAgICAgLyogc2F2ZSB2YWx1ZXMgKi8KKyAgICAgICAgICBzdHJlYW0tPnN0dHNfdGltZSA9IHN0dHNfdGltZTsKKyAgICAgICAgICBzdHJlYW0tPnN0dHNfc2FtcGxlX2luZGV4ID0gaiArIDE7CisgICAgICAgICAgaWYgKHN0cmVhbS0+c3R0c19zYW1wbGVfaW5kZXggPj0gc3RyZWFtLT5zdHRzX3NhbXBsZXMpCisgICAgICAgICAgICBzdHJlYW0tPnN0dHNfaW5kZXgrKzsKKyAgICAgICAgICBnb3RvIGRvbmUzOworICAgICAgICB9CisgICAgICB9CisgICAgICBzdHJlYW0tPnN0dHNfc2FtcGxlX2luZGV4ID0gMDsKKyAgICAgIHN0cmVhbS0+c3R0c190aW1lID0gc3R0c190aW1lOworICAgICAgc3RyZWFtLT5zdHRzX2luZGV4Kys7CisgICAgfQorICAgIC8qIGZpbGwgdXAgZW1wdHkgdGltZXN0YW1wcyB3aXRoIHRoZSBsYXN0IHRpbWVzdGFtcCwgdGhpcyBjYW4gaGFwcGVuIHdoZW4KKyAgICAgKiB0aGUgbGFzdCBzYW1wbGVzIGRvIG5vdCBkZWNvZGUgYW5kIHNvIHdlIGRvbid0IGhhdmUgdGltZXN0YW1wcyBmb3IgdGhlbS4KKyAgICAgKiBXZSBob3dldmVyIGxvb2sgYXQgdGhlIGxhc3QgdGltZXN0YW1wIHRvIGVzdGltYXRlIHRoZSB0cmFjayBsZW5ndGggc28gd2UKKyAgICAgKiBuZWVkIHNvbWV0aGluZyBpbiBoZXJlLiAqLworICAgIGZvciAoOyBjdXIgPCBsYXN0OyBjdXIrKykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAiZmlsbCBzYW1wbGUgJWQ6IHRpbWVzdGFtcCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgKGd1aW50KSAoY3VyIC0gc2FtcGxlcyksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoUVRTVFJFQU1USU1FX1RPX0dTVFRJTUUgKHN0cmVhbSwgc3RyZWFtLT5zdHRzX3RpbWUpKSk7CisgICAgICBjdXItPnRpbWVzdGFtcCA9IHN0cmVhbS0+c3R0c190aW1lOworICAgICAgY3VyLT5kdXJhdGlvbiA9IC0xOworICAgIH0KKyAgfQorZG9uZTM6CisgIHsKKyAgICAvKiBzYW1wbGUgc3luYywgY2FuIGJlIE5VTEwgKi8KKyAgICBpZiAoc3RyZWFtLT5zdHNzX3ByZXNlbnQgPT0gVFJVRSkgeworICAgICAgZ3VpbnQzMiBuX3NhbXBsZV9zeW5jczsKKworICAgICAgbl9zYW1wbGVfc3luY3MgPSBzdHJlYW0tPm5fc2FtcGxlX3N5bmNzOworCisgICAgICBpZiAoIW5fc2FtcGxlX3N5bmNzKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJhbGwgc2FtcGxlcyBhcmUga2V5ZnJhbWVzIik7CisgICAgICAgIHN0cmVhbS0+YWxsX2tleWZyYW1lID0gVFJVRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IHN0cmVhbS0+c3Rzc19pbmRleDsgaSA8IG5fc2FtcGxlX3N5bmNzOyBpKyspIHsKKyAgICAgICAgICAvKiBub3RlIHRoYXQgdGhlIGZpcnN0IHNhbXBsZSBpcyBpbmRleCAxLCBub3QgMCAqLworICAgICAgICAgIGd1aW50MzIgaW5kZXg7CisKKyAgICAgICAgICBpbmRleCA9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAoJnN0cmVhbS0+c3Rzcyk7CisKKyAgICAgICAgICBpZiAoR19MSUtFTFkgKGluZGV4ID4gMCAmJiBpbmRleCA8PSBuX3NhbXBsZXMpKSB7CisgICAgICAgICAgICBpbmRleCAtPSAxOworICAgICAgICAgICAgc2FtcGxlc1tpbmRleF0ua2V5ZnJhbWUgPSBUUlVFOworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInNhbXBsZXMgYXQgJXUgaXMga2V5ZnJhbWUiLCBpbmRleCk7CisgICAgICAgICAgICAvKiBhbmQgZXhpdCBpZiB3ZSBoYXZlIGVub3VnaCBzYW1wbGVzICovCisgICAgICAgICAgICBpZiAoR19VTkxJS0VMWSAoaW5kZXggPj0gbikpIHsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogc2F2ZSBzdGF0ZSAqLworICAgICAgICBzdHJlYW0tPnN0c3NfaW5kZXggPSBpOworICAgICAgfQorCisgICAgICAvKiBzdHBzIG1hcmtzIHBhcnRpYWwgc3luYyBmcmFtZXMgbGlrZSBvcGVuIEdPUCBJLUZyYW1lcyAqLworICAgICAgaWYgKHN0cmVhbS0+c3Rwc19wcmVzZW50ID09IFRSVUUpIHsKKyAgICAgICAgZ3VpbnQzMiBuX3NhbXBsZV9wYXJ0aWFsX3N5bmNzOworCisgICAgICAgIG5fc2FtcGxlX3BhcnRpYWxfc3luY3MgPSBzdHJlYW0tPm5fc2FtcGxlX3BhcnRpYWxfc3luY3M7CisKKyAgICAgICAgLyogaWYgdGhlcmUgYXJlIG5vIGVudHJpZXMsIHRoZSBzdHNzIHRhYmxlIGNvbnRhaW5zIHRoZSByZWFsCisgICAgICAgICAqIHN5bmMgc2FtcGxlcyAqLworICAgICAgICBpZiAobl9zYW1wbGVfcGFydGlhbF9zeW5jcykgeworICAgICAgICAgIGZvciAoaSA9IHN0cmVhbS0+c3Rwc19pbmRleDsgaSA8IG5fc2FtcGxlX3BhcnRpYWxfc3luY3M7IGkrKykgeworICAgICAgICAgICAgLyogbm90ZSB0aGF0IHRoZSBmaXJzdCBzYW1wbGUgaXMgaW5kZXggMSwgbm90IDAgKi8KKyAgICAgICAgICAgIGd1aW50MzIgaW5kZXg7CisKKyAgICAgICAgICAgIGluZGV4ID0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmVfdW5jaGVja2VkICgmc3RyZWFtLT5zdHBzKTsKKworICAgICAgICAgICAgaWYgKEdfTElLRUxZIChpbmRleCA+IDAgJiYgaW5kZXggPD0gbl9zYW1wbGVzKSkgeworICAgICAgICAgICAgICBpbmRleCAtPSAxOworICAgICAgICAgICAgICBzYW1wbGVzW2luZGV4XS5rZXlmcmFtZSA9IFRSVUU7CisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJzYW1wbGVzIGF0ICV1IGlzIGtleWZyYW1lIiwgaW5kZXgpOworICAgICAgICAgICAgICAvKiBhbmQgZXhpdCBpZiB3ZSBoYXZlIGVub3VnaCBzYW1wbGVzICovCisgICAgICAgICAgICAgIGlmIChHX1VOTElLRUxZIChpbmRleCA+PSBuKSkgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICAvKiBzYXZlIHN0YXRlICovCisgICAgICAgICAgc3RyZWFtLT5zdHBzX2luZGV4ID0gaTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiBubyBzdHNzLCBhbGwgc2FtcGxlcyBhcmUga2V5ZnJhbWVzICovCisgICAgICBzdHJlYW0tPmFsbF9rZXlmcmFtZSA9IFRSVUU7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic2V0dGluZyBhbGwga2V5ZnJhbWVzIik7CisgICAgfQorICB9CisKK2N0dHM6CisgIC8qIGNvbXBvc2l0aW9uIHRpbWUgdG8gc2FtcGxlICovCisgIGlmIChzdHJlYW0tPmN0dHNfcHJlc2VudCA9PSBUUlVFKSB7CisgICAgZ3VpbnQzMiBuX2NvbXBvc2l0aW9uX3RpbWVzOworICAgIGd1aW50MzIgY3R0c19jb3VudDsKKyAgICBnaW50MzIgY3R0c19zb2Zmc2V0OworCisgICAgLyogRmlsbCBpbiB0aGUgcHRzX29mZnNldHMgKi8KKyAgICBjdXIgPSBmaXJzdDsKKyAgICBuX2NvbXBvc2l0aW9uX3RpbWVzID0gc3RyZWFtLT5uX2NvbXBvc2l0aW9uX3RpbWVzOworCisgICAgZm9yIChpID0gc3RyZWFtLT5jdHRzX2luZGV4OyBpIDwgbl9jb21wb3NpdGlvbl90aW1lczsgaSsrKSB7CisgICAgICBpZiAoc3RyZWFtLT5jdHRzX3NhbXBsZV9pbmRleCA+PSBzdHJlYW0tPmN0dHNfY291bnQKKyAgICAgICAgICB8fCAhc3RyZWFtLT5jdHRzX3NhbXBsZV9pbmRleCkgeworICAgICAgICBzdHJlYW0tPmN0dHNfY291bnQgPQorICAgICAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmVfdW5jaGVja2VkICgmc3RyZWFtLT5jdHRzKTsKKyAgICAgICAgc3RyZWFtLT5jdHRzX3NvZmZzZXQgPQorICAgICAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX2dldF9pbnQzMl9iZV91bmNoZWNrZWQgKCZzdHJlYW0tPmN0dHMpOworICAgICAgICBzdHJlYW0tPmN0dHNfc2FtcGxlX2luZGV4ID0gMDsKKyAgICAgIH0KKworICAgICAgY3R0c19jb3VudCA9IHN0cmVhbS0+Y3R0c19jb3VudDsKKyAgICAgIGN0dHNfc29mZnNldCA9IHN0cmVhbS0+Y3R0c19zb2Zmc2V0OworCisgICAgICBmb3IgKGogPSBzdHJlYW0tPmN0dHNfc2FtcGxlX2luZGV4OyBqIDwgY3R0c19jb3VudDsgaisrKSB7CisgICAgICAgIGN1ci0+cHRzX29mZnNldCA9IGN0dHNfc29mZnNldDsKKyAgICAgICAgY3VyKys7CisKKyAgICAgICAgaWYgKEdfVU5MSUtFTFkgKGN1ciA+IGxhc3QpKSB7CisgICAgICAgICAgLyogc2F2ZSBzdGF0ZSAqLworICAgICAgICAgIHN0cmVhbS0+Y3R0c19zYW1wbGVfaW5kZXggPSBqICsgMTsKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHN0cmVhbS0+Y3R0c19zYW1wbGVfaW5kZXggPSAwOworICAgICAgc3RyZWFtLT5jdHRzX2luZGV4Kys7CisgICAgfQorICB9Citkb25lOgorICBzdHJlYW0tPnN0YmxfaW5kZXggPSBuOworICAvKiBpZiBpbmRleCBoYXMgYmVlbiBjb21wbGV0ZWx5IHBhcnNlZCwgZnJlZSBkYXRhIHRoYXQgaXMgbm8tbG9uZ2VyIG5lZWRlZCAqLworICBpZiAobiArIDEgPT0gc3RyZWFtLT5uX3NhbXBsZXMpIHsKKyAgICBnc3RfcXRkZW11eF9zdGJsX2ZyZWUgKHN0cmVhbSk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInBhcnNlZCBhbGwgYXZhaWxhYmxlIHNhbXBsZXM7Iik7CisgICAgaWYgKHF0ZGVtdXgtPnB1bGxiYXNlZCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImNoZWNraW5nIGZvciBtb3JlIHNhbXBsZXMiKTsKKyAgICAgIHdoaWxlIChuICsgMSA9PSBzdHJlYW0tPm5fc2FtcGxlcykKKyAgICAgICAgaWYgKHF0ZGVtdXhfYWRkX2ZyYWdtZW50ZWRfc2FtcGxlcyAocXRkZW11eCkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChxdGRlbXV4KTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBTVUNDRVNTICovCithbHJlYWR5X3BhcnNlZDoKKyAgeworICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAiVHJpZWQgdG8gcGFyc2UgdXAgdG8gc2FtcGxlICV1IGJ1dCB0aGlzIHNhbXBsZSBoYXMgYWxyZWFkeSBiZWVuIHBhcnNlZCIsCisgICAgICAgIG4pOworICAgIC8qIGlmIGZyYWdtZW50ZWQsIHRoZXJlIG1heSBiZSBtb3JlICovCisgICAgaWYgKHF0ZGVtdXgtPmZyYWdtZW50ZWQgJiYgbiA9PSBzdHJlYW0tPnN0YmxfaW5kZXgpCisgICAgICBnb3RvIGRvbmU7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0ZGVtdXgpOworICAgIHJldHVybiBUUlVFOworICB9CisgIC8qIEVSUk9SUyAqLworb3V0X29mX3NhbXBsZXM6CisgIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgIlRyaWVkIHRvIHBhcnNlIHVwIHRvIHNhbXBsZSAldSBidXQgdGhlcmUgYXJlIG9ubHkgJXUgc2FtcGxlcyIsIG4gKyAxLAorICAgICAgICBzdHJlYW0tPm5fc2FtcGxlcyk7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0ZGVtdXgsIFNUUkVBTSwgREVNVVgsCisgICAgICAgIChfKCJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iKSksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citjb3JydXB0X2ZpbGU6CisgIHsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAocXRkZW11eCk7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0ZGVtdXgsIFNUUkVBTSwgREVNVVgsCisgICAgICAgIChfKCJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iKSksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qIGNvbGxlY3QgYWxsIHNlZ21lbnQgaW5mbyBmb3IgQHN0cmVhbS4KKyAqLworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X3BhcnNlX3NlZ21lbnRzIChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwKKyAgICBHTm9kZSAqIHRyYWspCit7CisgIEdOb2RlICplZHRzOworICAvKiBhY2NlcHQgZWR0cyBpZiB0aGV5IGNvbnRhaW4gZ2FwcyBhdCBzdGFydCBhbmQgdGhlcmUgaXMgb25seQorICAgKiBvbmUgbWVkaWEgc2VnbWVudCAqLworICBnYm9vbGVhbiBhbGxvd19wdXNoYmFzZWRfZWR0cyA9IFRSVUU7CisgIGdpbnQgbWVkaWFfc2VnbWVudHNfY291bnQgPSAwOworCisgIC8qIHBhcnNlIGFuZCBwcmVwYXJlIHNlZ21lbnQgaW5mbyBmcm9tIHRoZSBlZGl0IGxpc3QgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImxvb2tpbmcgZm9yIGVkaXQgbGlzdCBjb250YWluZXIiKTsKKyAgc3RyZWFtLT5uX3NlZ21lbnRzID0gMDsKKyAgc3RyZWFtLT5zZWdtZW50cyA9IE5VTEw7CisgIGlmICgoZWR0cyA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAodHJhaywgRk9VUkNDX2VkdHMpKSkgeworICAgIEdOb2RlICplbHN0OworICAgIGdpbnQgbl9zZWdtZW50czsKKyAgICBnaW50IGksIGNvdW50LCBlbnRyeV9zaXplOworICAgIGd1aW50NjQgdGltZTsKKyAgICBHc3RDbG9ja1RpbWUgc3RpbWU7CisgICAgY29uc3QgZ3VpbnQ4ICpidWZmZXI7CisgICAgZ3VpbnQ4IHZlcnNpb247CisgICAgZ3VpbnQzMiBzaXplOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImxvb2tpbmcgZm9yIGVkaXQgbGlzdCIpOworICAgIGlmICghKGVsc3QgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKGVkdHMsIEZPVVJDQ19lbHN0KSkpCisgICAgICBnb3RvIGRvbmU7CisKKyAgICBidWZmZXIgPSBlbHN0LT5kYXRhOworCisgICAgc2l6ZSA9IFFUX1VJTlQzMiAoYnVmZmVyKTsKKyAgICAvKiB2ZXJzaW9uLCBmbGFncywgbl9zZWdtZW50cyAqLworICAgIGlmIChzaXplIDwgMTYpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIkludmFsaWQgZWRpdCBsaXN0Iik7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIHZlcnNpb24gPSBRVF9VSU5UOCAoYnVmZmVyICsgOCk7CisgICAgZW50cnlfc2l6ZSA9ICh2ZXJzaW9uID09IDEpID8gMjAgOiAxMjsKKworICAgIG5fc2VnbWVudHMgPSBRVF9VSU5UMzIgKGJ1ZmZlciArIDEyKTsKKworICAgIGlmIChuX3NlZ21lbnRzID4gMTAwMDAwIHx8IHNpemUgPCAxNiArIG5fc2VnbWVudHMgKiBlbnRyeV9zaXplKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJJbnZhbGlkIGVkaXQgbGlzdCIpOworICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIC8qIHdlIG1pZ2h0IGFsbG9jYXRlIGEgYml0IHRvbyBtdWNoLCBhdCBsZWFzdCBhbGxvY2F0ZSAxIHNlZ21lbnQgKi8KKyAgICBzdHJlYW0tPnNlZ21lbnRzID0gZ19uZXcgKFF0RGVtdXhTZWdtZW50LCBNQVggKG5fc2VnbWVudHMsIDEpKTsKKworICAgIC8qIHNlZ21lbnRzIGFsd2F5cyBzdGFydCBmcm9tIDAgKi8KKyAgICB0aW1lID0gMDsKKyAgICBzdGltZSA9IDA7CisgICAgY291bnQgPSAwOworICAgIGJ1ZmZlciArPSAxNjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbl9zZWdtZW50czsgaSsrKSB7CisgICAgICBndWludDY0IGR1cmF0aW9uOworICAgICAgZ3VpbnQ2NCBtZWRpYV90aW1lOworICAgICAgZ2Jvb2xlYW4gdGltZV92YWxpZCA9IFRSVUU7CisgICAgICBRdERlbXV4U2VnbWVudCAqc2VnbWVudDsKKyAgICAgIGd1aW50MzIgcmF0ZV9pbnQ7CisgICAgICBHc3RDbG9ja1RpbWUgbWVkaWFfc3RhcnQgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgICAgICBpZiAodmVyc2lvbiA9PSAxKSB7CisgICAgICAgIG1lZGlhX3RpbWUgPSBRVF9VSU5UNjQgKGJ1ZmZlciArIDgpOworICAgICAgICBkdXJhdGlvbiA9IFFUX1VJTlQ2NCAoYnVmZmVyKTsKKyAgICAgICAgaWYgKG1lZGlhX3RpbWUgPT0gR19NQVhVSU5UNjQpCisgICAgICAgICAgdGltZV92YWxpZCA9IEZBTFNFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWVkaWFfdGltZSA9IFFUX1VJTlQzMiAoYnVmZmVyICsgNCk7CisgICAgICAgIGR1cmF0aW9uID0gUVRfVUlOVDMyIChidWZmZXIpOworICAgICAgICBpZiAobWVkaWFfdGltZSA9PSBHX01BWFVJTlQzMikKKyAgICAgICAgICB0aW1lX3ZhbGlkID0gRkFMU0U7CisgICAgICB9CisKKyAgICAgIGlmICh0aW1lX3ZhbGlkKQorICAgICAgICBtZWRpYV9zdGFydCA9IFFUU1RSRUFNVElNRV9UT19HU1RUSU1FIChzdHJlYW0sIG1lZGlhX3RpbWUpOworCisgICAgICBzZWdtZW50ID0gJnN0cmVhbS0+c2VnbWVudHNbY291bnQrK107CisKKyAgICAgIC8qIHRpbWUgYW5kIGR1cmF0aW9uIGV4cHJlc3NlZCBpbiBnbG9iYWwgdGltZXNjYWxlICovCisgICAgICBzZWdtZW50LT50aW1lID0gc3RpbWU7CisgICAgICAvKiBhZGQgbm9uIHNjYWxlZCB2YWx1ZXMgc28gd2UgZG9uJ3QgY2F1c2Ugcm91bmRvZmYgZXJyb3JzICovCisgICAgICBpZiAoZHVyYXRpb24gfHwgbWVkaWFfc3RhcnQgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgICAgICB0aW1lICs9IGR1cmF0aW9uOworICAgICAgICBzdGltZSA9IFFUVElNRV9UT19HU1RUSU1FIChxdGRlbXV4LCB0aW1lKTsKKyAgICAgICAgc2VnbWVudC0+ZHVyYXRpb24gPSBzdGltZSAtIHNlZ21lbnQtPnRpbWU7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiB6ZXJvIGR1cmF0aW9uIGRvZXMgbm90IGltcGx5IG1lZGlhX3N0YXJ0ID09IG1lZGlhX3N0b3AKKyAgICAgICAgICogYnV0LCBvbmx5IHNwZWNpZnkgbWVkaWFfc3RhcnQuKi8KKyAgICAgICAgc3RpbWUgPSBRVFRJTUVfVE9fR1NUVElNRSAocXRkZW11eCwgcXRkZW11eC0+ZHVyYXRpb24pOworICAgICAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHN0aW1lKSAmJiB0aW1lX3ZhbGlkCisgICAgICAgICAgICAmJiBzdGltZSA+PSBtZWRpYV9zdGFydCkgeworICAgICAgICAgIHNlZ21lbnQtPmR1cmF0aW9uID0gc3RpbWUgLSBtZWRpYV9zdGFydDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZWdtZW50LT5kdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNlZ21lbnQtPnN0b3BfdGltZSA9IHN0aW1lOworCisgICAgICBzZWdtZW50LT50cmFrX21lZGlhX3N0YXJ0ID0gbWVkaWFfdGltZTsKKyAgICAgIC8qIG1lZGlhX3RpbWUgZXhwcmVzc2VkIGluIHN0cmVhbSB0aW1lc2NhbGUgKi8KKyAgICAgIGlmICh0aW1lX3ZhbGlkKSB7CisgICAgICAgIHNlZ21lbnQtPm1lZGlhX3N0YXJ0ID0gbWVkaWFfc3RhcnQ7CisgICAgICAgIHNlZ21lbnQtPm1lZGlhX3N0b3AgPSBzZWdtZW50LT5tZWRpYV9zdGFydCArIHNlZ21lbnQtPmR1cmF0aW9uOworICAgICAgICBtZWRpYV9zZWdtZW50c19jb3VudCsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2VnbWVudC0+bWVkaWFfc3RhcnQgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgICAgICBzZWdtZW50LT5tZWRpYV9zdG9wID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICAgIH0KKyAgICAgIHJhdGVfaW50ID0gUVRfVUlOVDMyIChidWZmZXIgKyAoKHZlcnNpb24gPT0gMSkgPyAxNiA6IDgpKTsKKworICAgICAgaWYgKHJhdGVfaW50IDw9IDEpIHsKKyAgICAgICAgLyogMCBpcyBub3QgYWxsb3dlZCwgc29tZSBwcm9ncmFtcyB3cml0ZSAxIGluc3RlYWQgb2YgdGhlIGZsb2F0aW5nIHBvaW50CisgICAgICAgICAqIHZhbHVlICovCisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgImZvdW5kIHN1c3BpY2lvdXMgcmF0ZSAlIiBHX0dVSU5UMzJfRk9STUFULAorICAgICAgICAgICAgcmF0ZV9pbnQpOworICAgICAgICBzZWdtZW50LT5yYXRlID0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNlZ21lbnQtPnJhdGUgPSByYXRlX2ludCAvIDY1NTM2LjA7CisgICAgICB9CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJjcmVhdGVkIHNlZ21lbnQgJWQgdGltZSAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAiLCBkdXJhdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQgIiwgbWVkaWFfc3RhcnQgJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICAgIiAoJSIgR19HVUlOVDY0X0ZPUk1BVCAiKSAsIG1lZGlhX3N0b3AgJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICAgIiBzdG9wX3RpbWUgJSIgR1NUX1RJTUVfRk9STUFUICIgcmF0ZSAlZywgKCVkKSB0aW1lc2NhbGUgJXUiLAorICAgICAgICAgIGksIEdTVF9USU1FX0FSR1MgKHNlZ21lbnQtPnRpbWUpLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHNlZ21lbnQtPmR1cmF0aW9uKSwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChzZWdtZW50LT5tZWRpYV9zdGFydCksIG1lZGlhX3RpbWUsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoc2VnbWVudC0+bWVkaWFfc3RvcCksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoc2VnbWVudC0+c3RvcF90aW1lKSwgc2VnbWVudC0+cmF0ZSwgcmF0ZV9pbnQsCisgICAgICAgICAgc3RyZWFtLT50aW1lc2NhbGUpOworICAgICAgaWYgKHNlZ21lbnQtPnN0b3BfdGltZSA+IHF0ZGVtdXgtPnNlZ21lbnQuc3RvcCkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJTZWdtZW50ICVkICIKKyAgICAgICAgICAgICIgZXh0ZW5kcyB0byAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAgICIgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGR1cmF0aW9uICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAgICAgIiBpdCB3aWxsIGJlIHRydW5jYXRlZCIsIGksIEdTVF9USU1FX0FSR1MgKHNlZ21lbnQtPnN0b3BfdGltZSksCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChxdGRlbXV4LT5zZWdtZW50LnN0b3ApKTsKKyAgICAgICAgcXRkZW11eC0+c2VnbWVudC5zdG9wID0gc2VnbWVudC0+c3RvcF90aW1lOworICAgICAgfQorCisgICAgICBidWZmZXIgKz0gZW50cnlfc2l6ZTsKKyAgICB9CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImZvdW5kICVkIHNlZ21lbnRzIiwgY291bnQpOworICAgIHN0cmVhbS0+bl9zZWdtZW50cyA9IGNvdW50OworICAgIGlmIChtZWRpYV9zZWdtZW50c19jb3VudCAhPSAxKQorICAgICAgYWxsb3dfcHVzaGJhc2VkX2VkdHMgPSBGQUxTRTsKKyAgfQorZG9uZToKKworICAvKiBwdXNoIGJhc2VkIGRvZXMgbm90IGhhbmRsZSBzZWdtZW50cywgc28gYWN0IGFjY29yZGluZ2x5IGhlcmUsCisgICAqIGFuZCB3YXJuIGlmIGFwcGxpY2FibGUgKi8KKyAgaWYgKCFxdGRlbXV4LT5wdWxsYmFzZWQgJiYgIWFsbG93X3B1c2hiYXNlZF9lZHRzKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAic3RyZWFtaW5nOyBkaXNjYXJkaW5nIGVkaXQgbGlzdCBzZWdtZW50cyIpOworICAgIC8qIHJlbW92ZSBhbmQgdXNlIGRlZmF1bHQgb25lIGJlbG93LCB3ZSBzdHJlYW0gbGlrZSBpdCBhbnl3YXkgKi8KKyAgICBnX2ZyZWUgKHN0cmVhbS0+c2VnbWVudHMpOworICAgIHN0cmVhbS0+c2VnbWVudHMgPSBOVUxMOworICAgIHN0cmVhbS0+bl9zZWdtZW50cyA9IDA7CisgIH0KKworICAvKiBubyBzZWdtZW50cywgY3JlYXRlIG9uZSB0byBwbGF5IHRoZSBjb21wbGV0ZSB0cmFrICovCisgIGlmIChzdHJlYW0tPm5fc2VnbWVudHMgPT0gMCkgeworICAgIEdzdENsb2NrVGltZSBzdHJlYW1fZHVyYXRpb24gPQorICAgICAgICBRVFNUUkVBTVRJTUVfVE9fR1NUVElNRSAoc3RyZWFtLCBzdHJlYW0tPmR1cmF0aW9uKTsKKworICAgIGlmIChzdHJlYW0tPnNlZ21lbnRzID09IE5VTEwpCisgICAgICBzdHJlYW0tPnNlZ21lbnRzID0gZ19uZXcgKFF0RGVtdXhTZWdtZW50LCAxKTsKKworICAgIC8qIHJlcHJlc2VudCB1bmtub3duIG91ciB3YXkgKi8KKyAgICBpZiAoc3RyZWFtX2R1cmF0aW9uID09IDApCisgICAgICBzdHJlYW1fZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgICAgc3RyZWFtLT5zZWdtZW50c1swXS50aW1lID0gMDsKKyAgICBzdHJlYW0tPnNlZ21lbnRzWzBdLnN0b3BfdGltZSA9IHN0cmVhbV9kdXJhdGlvbjsKKyAgICBzdHJlYW0tPnNlZ21lbnRzWzBdLmR1cmF0aW9uID0gc3RyZWFtX2R1cmF0aW9uOworICAgIHN0cmVhbS0+c2VnbWVudHNbMF0ubWVkaWFfc3RhcnQgPSAwOworICAgIHN0cmVhbS0+c2VnbWVudHNbMF0ubWVkaWFfc3RvcCA9IHN0cmVhbV9kdXJhdGlvbjsKKyAgICBzdHJlYW0tPnNlZ21lbnRzWzBdLnJhdGUgPSAxLjA7CisgICAgc3RyZWFtLT5zZWdtZW50c1swXS50cmFrX21lZGlhX3N0YXJ0ID0gMDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJjcmVhdGVkIGR1bW15IHNlZ21lbnQgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChzdHJlYW1fZHVyYXRpb24pKTsKKyAgICBzdHJlYW0tPm5fc2VnbWVudHMgPSAxOworICAgIHN0cmVhbS0+ZHVtbXlfc2VnbWVudCA9IFRSVUU7CisgIH0KKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInVzaW5nICVkIHNlZ21lbnRzIiwgc3RyZWFtLT5uX3NlZ21lbnRzKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIFBhcnNlcyB0aGUgc3RzZCBhdG9tIG9mIGEgc3ZxMyB0cmFrIGxvb2tpbmcgZm9yCisgKiB0aGUgU01JIGFuZCBnYW1hIGF0b21zLgorICovCitzdGF0aWMgdm9pZAorcXRkZW11eF9wYXJzZV9zdnEzX3N0c2RfZGF0YSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgY29uc3QgZ3VpbnQ4ICogc3RzZF9lbnRyeV9kYXRhLCBjb25zdCBndWludDggKiogZ2FtbWEsIEdzdEJ1ZmZlciAqKiBzZXFoKQoreworICBjb25zdCBndWludDggKl9nYW1tYSA9IE5VTEw7CisgIEdzdEJ1ZmZlciAqX3NlcWggPSBOVUxMOworICBjb25zdCBndWludDggKnN0c2RfZGF0YSA9IHN0c2RfZW50cnlfZGF0YTsKKyAgZ3VpbnQzMiBsZW5ndGggPSBRVF9VSU5UMzIgKHN0c2RfZGF0YSk7CisgIGd1aW50MTYgdmVyc2lvbjsKKworICBpZiAobGVuZ3RoIDwgMzIpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJzdHNkIHRvbyBzaG9ydCIpOworICAgIGdvdG8gZW5kOworICB9CisKKyAgc3RzZF9kYXRhICs9IDE2OworICBsZW5ndGggLT0gMTY7CisgIHZlcnNpb24gPSBRVF9VSU5UMTYgKHN0c2RfZGF0YSk7CisgIGlmICh2ZXJzaW9uID09IDMpIHsKKyAgICBpZiAobGVuZ3RoID49IDcwKSB7CisgICAgICBsZW5ndGggLT0gNzA7CisgICAgICBzdHNkX2RhdGEgKz0gNzA7CisgICAgICB3aGlsZSAobGVuZ3RoID4gOCkgeworICAgICAgICBndWludDMyIGZvdXJjYywgc2l6ZTsKKyAgICAgICAgY29uc3QgZ3VpbnQ4ICpkYXRhOworICAgICAgICBzaXplID0gUVRfVUlOVDMyIChzdHNkX2RhdGEpOworICAgICAgICBmb3VyY2MgPSBRVF9GT1VSQ0MgKHN0c2RfZGF0YSArIDQpOworICAgICAgICBkYXRhID0gc3RzZF9kYXRhICsgODsKKworICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAiQXRvbSBvZiBzaXplIDAgZm91bmQsIGFib3J0aW5nICIKKyAgICAgICAgICAgICAgInN2cTMgYXRvbSBwYXJzaW5nIik7CisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGZvdXJjYykgeworICAgICAgICAgIGNhc2UgRk9VUkNDX2dhbWE6eworICAgICAgICAgICAgaWYgKHNpemUgPT0gMTIpIHsKKyAgICAgICAgICAgICAgX2dhbW1hID0gZGF0YTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIlVuZXhwZWN0ZWQgc2l6ZSAlIiBHX0dVSU5UMzJfRk9STUFUCisgICAgICAgICAgICAgICAgICAiIGZvciBnYW1hIGF0b20sIGV4cGVjdGVkIDEyIiwgc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBGT1VSQ0NfU01JXzp7CisgICAgICAgICAgICBpZiAoc2l6ZSA+IDE2ICYmIFFUX0ZPVVJDQyAoZGF0YSkgPT0gRk9VUkNDX1NFUUgpIHsKKyAgICAgICAgICAgICAgZ3VpbnQzMiBzZXFoX3NpemU7CisgICAgICAgICAgICAgIGlmIChfc2VxaCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAiVW5leHBlY3RlZCBzZWNvbmQgU0VRSCBTTUkgYXRvbSAiCisgICAgICAgICAgICAgICAgICAgICIgZm91bmQsIGlnbm9yaW5nIik7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VxaF9zaXplID0gUVRfVUlOVDMyIChkYXRhICsgNCk7CisgICAgICAgICAgICAgICAgaWYgKHNlcWhfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgIF9zZXFoID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzZXFoX3NpemUpOworICAgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl9maWxsIChfc2VxaCwgMCwgZGF0YSArIDgsIHNlcWhfc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDp7CisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJVbmhhbmRsZWQgYXRvbSAlIiBHU1RfRk9VUkNDX0ZPUk1BVAorICAgICAgICAgICAgICAgICIgaW4gU1ZRMyBlbnRyeSBpbiBzdHNkIGF0b20iLCBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYykpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaXplIDw9IGxlbmd0aCkgeworICAgICAgICAgIGxlbmd0aCAtPSBzaXplOworICAgICAgICAgIHN0c2RfZGF0YSArPSBzaXplOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIlNWUTMgZW50cnkgdG9vIHNob3J0IGluIHN0c2QgYXRvbSIpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJVbmV4cGVjdGVkIHZlcnNpb24gZm9yIFNWUTMgZW50cnkgJSIKKyAgICAgICAgR19HVUlOVDE2X0ZPUk1BVCwgdmVyc2lvbik7CisgICAgZ290byBlbmQ7CisgIH0KKworZW5kOgorICBpZiAoZ2FtbWEpIHsKKyAgICAqZ2FtbWEgPSBfZ2FtbWE7CisgIH0KKyAgaWYgKHNlcWgpIHsKKyAgICAqc2VxaCA9IF9zZXFoOworICB9IGVsc2UgaWYgKF9zZXFoKSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoX3NlcWgpOworICB9Cit9CisKK3N0YXRpYyBnY2hhciAqCitxdGRlbXV4X2dldF9ydHNwX3VyaV9mcm9tX2huZGwgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHTm9kZSAqIG1pbmYpCit7CisgIEdOb2RlICpkaW5mOworICBHc3RCeXRlUmVhZGVyIGRyZWY7CisgIGdjaGFyICp1cmkgPSBOVUxMOworCisgIC8qCisgICAqIEdldCAnZGluZicsIHRvIGdldCBpdHMgY2hpbGQgJ2RyZWYnLCB0aGF0IG1pZ2h0IGNvbnRhaW4gYSAnaG5kbCcKKyAgICogYXRvbSB0aGF0IG1pZ2h0IGNvbnRhaW4gYSAnZGF0YScgYXRvbSB3aXRoIHRoZSBydHNwIHVyaS4KKyAgICogVGhpcyBjYXNlIHdhcyByZXBvcnRlZCBpbiBidWcgIzU5NzQ5Nywgc29tZSBpbmZvIGFib3V0CisgICAqIHRoZSBobmRsIGF0b20gY2FuIGJlIGZvdW5kIGluIFROMTE5NQorICAgKi8KKyAgZGluZiA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAobWluZiwgRk9VUkNDX2RpbmYpOworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiVHJ5aW5nIHRvIG9idGFpbiBydHNwIFVSSSBmb3Igc3RyZWFtIHRyYWsiKTsKKworICBpZiAoZGluZikgeworICAgIGd1aW50MzIgZHJlZl9udW1fZW50cmllcyA9IDA7CisgICAgaWYgKHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZV9mdWxsIChkaW5mLCBGT1VSQ0NfZHJlZiwgJmRyZWYpICYmCisgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9za2lwICgmZHJlZiwgNCkgJiYKKyAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZkcmVmLCAmZHJlZl9udW1fZW50cmllcykpIHsKKyAgICAgIGdpbnQgaTsKKworICAgICAgLyogc2VhcmNoIGRyZWYgZW50cmllcyBmb3IgaG5kbCBhdG9tICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgZHJlZl9udW1fZW50cmllczsgaSsrKSB7CisgICAgICAgIGd1aW50MzIgc2l6ZSA9IDAsIHR5cGU7CisgICAgICAgIGd1aW50OCBzdHJpbmdfbGVuID0gMDsKKyAgICAgICAgaWYgKGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmZHJlZiwgJnNpemUpICYmCisgICAgICAgICAgICBxdF9hdG9tX3BhcnNlcl9nZXRfZm91cmNjICgmZHJlZiwgJnR5cGUpKSB7CisgICAgICAgICAgaWYgKHR5cGUgPT0gRk9VUkNDX2huZGwpIHsKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJGb3VuZCBobmRsIGF0b20iKTsKKworICAgICAgICAgICAgLyogc2tpcCBkYXRhIHJlZmVyZW5jZSBoYW5kbGUgYnl0ZXMgYW5kIHRoZQorICAgICAgICAgICAgICogZm9sbG93aW5nIHBhc2NhbCBzdHJpbmcgYW5kIHNvbWUgZXh0cmEgNAorICAgICAgICAgICAgICogYnl0ZXMgSSBoYXZlIG5vIGlkZWEgd2hhdCBhcmUgKi8KKyAgICAgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZkcmVmLCA0KSB8fAorICAgICAgICAgICAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQ4ICgmZHJlZiwgJnN0cmluZ19sZW4pIHx8CisgICAgICAgICAgICAgICAgIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmZHJlZiwgc3RyaW5nX2xlbiArIDQpKSB7CisgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIkZhaWxlZCB0byBwYXJzZSBobmRsIGF0b20iKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciB0aGUgYXRvbXMgdG8gZmluZCB0aGUgZGF0YSBhdG9tICovCisgICAgICAgICAgICB3aGlsZSAoZ3N0X2J5dGVfcmVhZGVyX2dldF9yZW1haW5pbmcgKCZkcmVmKSA+PSA4KSB7CisgICAgICAgICAgICAgIGd1aW50MzIgYXRvbV9zaXplOworICAgICAgICAgICAgICBndWludDMyIGF0b21fdHlwZTsKKworICAgICAgICAgICAgICBpZiAoZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZkcmVmLCAmYXRvbV9zaXplKSAmJgorICAgICAgICAgICAgICAgICAgcXRfYXRvbV9wYXJzZXJfZ2V0X2ZvdXJjYyAoJmRyZWYsICZhdG9tX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGF0b21fdHlwZSA9PSBGT1VSQ0NfZGF0YSkgeworICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQ4ICp1cmlfYXV4ID0gTlVMTDsKKworICAgICAgICAgICAgICAgICAgLyogZm91bmQgdGhlIGRhdGEgYXRvbSB0aGF0IG1pZ2h0IGNvbnRhaW4gdGhlIHJ0c3AgdXJpICovCisgICAgICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiRm91bmQgZGF0YSBhdG9tIGluc2lkZSAiCisgICAgICAgICAgICAgICAgICAgICAgImhuZGwgYXRvbSwgaW50ZXJwcmV0aW5nIGl0IGFzIGFuIFVSSSIpOworICAgICAgICAgICAgICAgICAgaWYgKGdzdF9ieXRlX3JlYWRlcl9wZWVrX2RhdGEgKCZkcmVmLCBhdG9tX3NpemUgLSA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXJpX2F1eCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdfc3Ryc3RyX2xlbiAoKGdjaGFyICopIHVyaV9hdXgsIDcsICJydHNwOi8vIikgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICB1cmkgPSBnX3N0cm5kdXAgKChnY2hhciAqKSB1cmlfYXV4LCBhdG9tX3NpemUgLSA4KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIkRhdGEgYXRvbSBpbiBobmRsIGF0b20gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlkbid0IGNvbnRhaW4gYSBydHNwIGFkZHJlc3MiKTsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIkZhaWxlZCB0byBnZXQgdGhlIGRhdGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgImF0b20gY29udGVudHMiKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBza2lwcGluZyB0byB0aGUgbmV4dCBlbnRyeSAqLworICAgICAgICAgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZkcmVmLCBhdG9tX3NpemUgLSA4KSkKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIkZhaWxlZCB0byBwYXJzZSBobmRsIGNoaWxkICIKKyAgICAgICAgICAgICAgICAgICAgImF0b20gaGVhZGVyIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICAvKiBza2lwIHRvIHRoZSBuZXh0IGVudHJ5ICovCisgICAgICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJmRyZWYsIHNpemUgLSA4KSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIkVycm9yIHBhcnNpbmcgZHJlZiBhdG9tIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJGaW5pc2hlZCBwYXJzaW5nIGRyZWYgYXRvbSIpOworICAgIH0KKyAgfQorICByZXR1cm4gdXJpOworfQorCisjZGVmaW5lIEFNUl9OQl9BTExfTU9ERVMgICAgICAgIDB4ODFmZgorI2RlZmluZSBBTVJfV0JfQUxMX01PREVTICAgICAgICAweDgzZmYKK3N0YXRpYyBndWludAorcXRkZW11eF9wYXJzZV9hbXJfYml0cmF0ZSAoR3N0QnVmZmVyICogYnVmLCBnYm9vbGVhbiB3YikKK3sKKyAgLyogVGhlICdkYW1yJyBhdG9tIGlzIG9mIHRoZSBmb3JtOgorICAgKgorICAgKiB8IHZlbmRvciB8IGRlY29kZXJfdmVyIHwgbW9kZV9zZXQgfCBtb2RlX2NoYW5nZV9wZXJpb2QgfCBmcmFtZXMvc2FtcGxlIHwKKyAgICogICAgMzIgYiAgICAgICA4IGIgICAgICAgICAgMTYgYiAgICAgICAgICAgOCBiICAgICAgICAgICAgICAgICA4IGIKKyAgICoKKyAgICogVGhlIGhpZ2hlc3Qgc2V0IGJpdCBvZiB0aGUgZmlyc3QgNyAoQU1SLU5CKSBvciA4IChBTVItV0IpIGJpdHMgb2YgbW9kZV9zZXQKKyAgICogcmVwcmVzZW50cyB0aGUgaGlnaGVzdCBtb2RlIHVzZWQgaW4gdGhlIHN0cmVhbSAoYW5kIHRodXMgdGhlIG1heGltdW0KKyAgICogYml0cmF0ZSksIHdpdGggYSBjb3VwbGUgb2Ygc3BlY2lhbCBjYXNlcyBhcyBzZWVuIGJlbG93LgorICAgKi8KKworICAvKiBNYXAgb2YgZnJhbWUgdHlwZSBJRCAtPiBiaXRyYXRlICovCisgIHN0YXRpYyBjb25zdCBndWludCBuYl9iaXRyYXRlc1tdID0geworICAgIDQ3NTAsIDUxNTAsIDU5MDAsIDY3MDAsIDc0MDAsIDc5NTAsIDEwMjAwLCAxMjIwMAorICB9OworICBzdGF0aWMgY29uc3QgZ3VpbnQgd2JfYml0cmF0ZXNbXSA9IHsKKyAgICA2NjAwLCA4ODUwLCAxMjY1MCwgMTQyNTAsIDE1ODUwLCAxODI1MCwgMTk4NTAsIDIzMDUwLCAyMzg1MAorICB9OworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3NpemUgbWF4X21vZGU7CisgIGd1aW50MTYgbW9kZV9zZXQ7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICBpZiAobWFwLnNpemUgIT0gMHgxMSkgeworICAgIEdTVF9ERUJVRyAoIkF0b20gc2hvdWxkIGhhdmUgc2l6ZSAweDExLCBub3QgJSIgR19HU0laRV9GT1JNQVQsIG1hcC5zaXplKTsKKyAgICBnb3RvIGJhZF9kYXRhOworICB9CisKKyAgaWYgKFFUX0ZPVVJDQyAobWFwLmRhdGEgKyA0KSAhPSBGT1VSQ0NfZGFtcikgeworICAgIEdTVF9ERUJVRyAoIlVua25vd24gYXRvbSBpbiAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChRVF9VSU5UMzIgKG1hcC5kYXRhICsgNCkpKTsKKyAgICBnb3RvIGJhZF9kYXRhOworICB9CisKKyAgbW9kZV9zZXQgPSBRVF9VSU5UMTYgKG1hcC5kYXRhICsgMTMpOworCisgIGlmIChtb2RlX3NldCA9PSAod2IgPyBBTVJfV0JfQUxMX01PREVTIDogQU1SX05CX0FMTF9NT0RFUykpCisgICAgbWF4X21vZGUgPSA3ICsgKHdiID8gMSA6IDApOworICBlbHNlCisgICAgLyogQU1SLU5CIG1vZGVzIGZvIGZyb20gMC03LCBhbmQgQU1SLVdCIG1vZGVzIGdvIGZyb20gMC04ICovCisgICAgbWF4X21vZGUgPSBnX2JpdF9udGhfbXNmICgoZ3Vsb25nKSBtb2RlX3NldCAmICh3YiA/IDB4MWZmIDogMHhmZiksIC0xKTsKKworICBpZiAobWF4X21vZGUgPT0gLTEpIHsKKyAgICBHU1RfREVCVUcgKCJObyBtb2RlIGluZGljYXRpb24gd2FzIGZvdW5kIChtb2RlIHNldCkgPSAleCIsCisgICAgICAgIChndWludCkgbW9kZV9zZXQpOworICAgIGdvdG8gYmFkX2RhdGE7CisgIH0KKworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICByZXR1cm4gd2IgPyB3Yl9iaXRyYXRlc1ttYXhfbW9kZV0gOiBuYl9iaXRyYXRlc1ttYXhfbW9kZV07CisKK2JhZF9kYXRhOgorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X3BhcnNlX3RyYW5zZm9ybWF0aW9uX21hdHJpeCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgR3N0Qnl0ZVJlYWRlciAqIHJlYWRlciwgZ3VpbnQzMiAqIG1hdHJpeCwgY29uc3QgZ2NoYXIgKiBhdG9tKQoreworICAvKgorICAgKiA5IHZhbHVlcyBvZiAzMiBiaXRzIChmaXhlZCBwb2ludCAxNi4xNiwgZXhjZXB0IDIgNSBhbmQgOCB0aGF0IGFyZSAyLjMwKQorICAgKiBbMCAxIDJdCisgICAqIFszIDQgNV0KKyAgICogWzYgNyA4XQorICAgKi8KKworICBpZiAoZ3N0X2J5dGVfcmVhZGVyX2dldF9yZW1haW5pbmcgKHJlYWRlcikgPCAzNikKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbWF0cml4WzBdID0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmVfdW5jaGVja2VkIChyZWFkZXIpOworICBtYXRyaXhbMV0gPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQgKHJlYWRlcik7CisgIG1hdHJpeFsyXSA9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAocmVhZGVyKTsKKyAgbWF0cml4WzNdID0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmVfdW5jaGVja2VkIChyZWFkZXIpOworICBtYXRyaXhbNF0gPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQgKHJlYWRlcik7CisgIG1hdHJpeFs1XSA9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAocmVhZGVyKTsKKyAgbWF0cml4WzZdID0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmVfdW5jaGVja2VkIChyZWFkZXIpOworICBtYXRyaXhbN10gPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQgKHJlYWRlcik7CisgIG1hdHJpeFs4XSA9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAocmVhZGVyKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiVHJhbnNmb3JtYXRpb24gbWF0cml4IGZyb20gYXRvbSAlcyIsIGF0b20pOworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiJXUuJXUgJXUuJXUgJXUuJXUiLCBtYXRyaXhbMF0gPj4gMTYsCisgICAgICBtYXRyaXhbMF0gJiAweEZGRkYsIG1hdHJpeFsxXSA+PiAxNiwgbWF0cml4WzFdICYgMHhGRiwgbWF0cml4WzJdID4+IDE2LAorICAgICAgbWF0cml4WzJdICYgMHhGRik7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICIldS4ldSAldS4ldSAldS4ldSIsIG1hdHJpeFszXSA+PiAxNiwKKyAgICAgIG1hdHJpeFszXSAmIDB4RkZGRiwgbWF0cml4WzRdID4+IDE2LCBtYXRyaXhbNF0gJiAweEZGLCBtYXRyaXhbNV0gPj4gMTYsCisgICAgICBtYXRyaXhbNV0gJiAweEZGKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIiV1LiV1ICV1LiV1ICV1LiV1IiwgbWF0cml4WzZdID4+IDE2LAorICAgICAgbWF0cml4WzZdICYgMHhGRkZGLCBtYXRyaXhbN10gPj4gMTYsIG1hdHJpeFs3XSAmIDB4RkYsIG1hdHJpeFs4XSA+PiAxNiwKKyAgICAgIG1hdHJpeFs4XSAmIDB4RkYpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorcXRkZW11eF9pbnNwZWN0X3RyYW5zZm9ybWF0aW9uX21hdHJpeCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwgZ3VpbnQzMiAqIG1hdHJpeCwgR3N0VGFnTGlzdCAqKiB0YWdsaXN0KQoreworCisvKiBbYSBiIGNdCisgKiBbZCBlIGZdCisgKiBbZyBoIGldCisgKgorICogVGhpcyBtYWNybyB3aWxsIG9ubHkgY29tcGFyZSB2YWx1ZSBhYmRlZ2gsIGl0IGV4cGVjdHMgY2ZpIHRvIGhhdmUgYWxyZWFkeQorICogYmVlbiBjaGVja2VkCisgKi8KKyNkZWZpbmUgUVRDSEVDS19NQVRSSVgobSxhLGIsZCxlKSAoKG0pWzBdID09IChhIDw8IDE2KSAmJiAobSlbMV0gPT0gKGIgPDwgMTYpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG0pWzNdID09IChkIDw8IDE2KSAmJiAobSlbNF0gPT0gKGUgPDwgMTYpKQorCisgIC8qIG9ubHkgaGFuZGxlIHRoZSBjYXNlcyB3aGVyZSB0aGUgbGFzdCBjb2x1bW4gaGFzIHN0YW5kYXJkIHZhbHVlcyAqLworICBpZiAobWF0cml4WzJdID09IDAgJiYgbWF0cml4WzVdID09IDAgJiYgbWF0cml4WzhdID09IDEgPDwgMzApIHsKKyAgICBjb25zdCBnY2hhciAqcm90YXRpb25fdGFnID0gTlVMTDsKKworICAgIC8qIG5vIHJvdGF0aW9uIG5lZWRlZCAqLworICAgIGlmIChRVENIRUNLX01BVFJJWCAobWF0cml4LCAxLCAwLCAwLCAxKSkgeworICAgICAgLyogTk9QICovCisgICAgfSBlbHNlIGlmIChRVENIRUNLX01BVFJJWCAobWF0cml4LCAwLCAxLCBHX01BWFVJTlQxNiwgMCkpIHsKKyAgICAgIHJvdGF0aW9uX3RhZyA9ICJyb3RhdGUtOTAiOworICAgIH0gZWxzZSBpZiAoUVRDSEVDS19NQVRSSVggKG1hdHJpeCwgR19NQVhVSU5UMTYsIDAsIDAsIEdfTUFYVUlOVDE2KSkgeworICAgICAgcm90YXRpb25fdGFnID0gInJvdGF0ZS0xODAiOworICAgIH0gZWxzZSBpZiAoUVRDSEVDS19NQVRSSVggKG1hdHJpeCwgMCwgR19NQVhVSU5UMTYsIDEsIDApKSB7CisgICAgICByb3RhdGlvbl90YWcgPSAicm90YXRlLTI3MCI7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKHF0ZGVtdXgsICJVbmhhbmRsZWQgdHJhbnNmb3JtYXRpb24gbWF0cml4IHZhbHVlcyIpOworICAgIH0KKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJUcmFuc2Zvcm1hdGlvbiBtYXRyaXggcm90YXRpb24gJXMiLAorICAgICAgICByb3RhdGlvbl90YWcpOworICAgIGlmIChyb3RhdGlvbl90YWcgIT0gTlVMTCkgeworICAgICAgaWYgKCp0YWdsaXN0ID09IE5VTEwpCisgICAgICAgICp0YWdsaXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgICAgIGdzdF90YWdfbGlzdF9hZGQgKCp0YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgR1NUX1RBR19JTUFHRV9PUklFTlRBVElPTiwgcm90YXRpb25fdGFnLCBOVUxMKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgR1NUX0ZJWE1FX09CSkVDVCAocXRkZW11eCwgIlVuaGFuZGxlZCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdmFsdWVzIik7CisgIH0KK30KKworLyogUGFyc2VzIHRoZSBib3hlcyBkZWZpbmVkIGluIElTTy9JRUMgMTQ0OTYtMTIgdGhhdCBlbmFibGUgc3VwcG9ydCBmb3IKKyAqIHByb3RlY3RlZCBzdHJlYW1zIChzaW5mLCBmcm1hLCBzY2htIGFuZCBzY2hpKTsgaWYgdGhlIHByb3RlY3Rpb24gc2NoZW1lIGlzCisgKiBDb21tb24gRW5jcnlwdGlvbiAoY2VuYyksIHRoZSBmdW5jdGlvbiB3aWxsIGFsc28gcGFyc2UgdGhlIHRlbmMgYm94IChkZWZpbmVkCisgKiBpbiBJU08vSUVDIDIzMDAxLTcpLiBAY29udGFpbmVyIHBvaW50cyB0byB0aGUgbm9kZSB0aGF0IGNvbnRhaW5zIHRoZXNlIGJveGVzCisgKiAodHlwaWNhbGx5IGFuIGVuY1t2fGF8dHxzXSBzYW1wbGUgZW50cnkpOyB0aGUgZnVuY3Rpb24gd2lsbCBzZXQKKyAqIEBvcmlnaW5hbF9mbXQgdG8gdGhlIGZvdXJjYyBvZiB0aGUgb3JpZ2luYWwgdW5lbmNyeXB0ZWQgc3RyZWFtIGZvcm1hdC4KKyAqIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsOyBGQUxTRSBvdGhlcndpc2UuICovCitzdGF0aWMgZ2Jvb2xlYW4KK3F0ZGVtdXhfcGFyc2VfcHJvdGVjdGlvbl9zY2hlbWVfaW5mbyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwgR05vZGUgKiBjb250YWluZXIsIGd1aW50MzIgKiBvcmlnaW5hbF9mbXQpCit7CisgIEdOb2RlICpzaW5mOworICBHTm9kZSAqZnJtYTsKKyAgR05vZGUgKnNjaG07CisgIEdOb2RlICpzY2hpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChxdGRlbXV4ICE9IE5VTEwsIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHN0cmVhbSAhPSBOVUxMLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb250YWluZXIgIT0gTlVMTCwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAob3JpZ2luYWxfZm10ICE9IE5VTEwsIEZBTFNFKTsKKworICBzaW5mID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChjb250YWluZXIsIEZPVVJDQ19zaW5mKTsKKyAgaWYgKEdfVU5MSUtFTFkgKCFzaW5mKSkgeworICAgIGlmIChzdHJlYW0tPnByb3RlY3Rpb25fc2NoZW1lX3R5cGUgPT0gRk9VUkNDX2NlbmMpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJzaW5mIGJveCBkb2VzIG5vdCBjb250YWluIHNjaGkgYm94LCB3aGljaCBpcyAiCisgICAgICAgICAgIm1hbmRhdG9yeSBmb3IgQ29tbW9uIEVuY3J5cHRpb24iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBmcm1hID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChzaW5mLCBGT1VSQ0NfZnJtYSk7CisgIGlmIChHX1VOTElLRUxZICghZnJtYSkpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChxdGRlbXV4LCAic2luZiBib3ggZG9lcyBub3QgY29udGFpbiBtYW5kYXRvcnkgZnJtYSBib3giKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAqb3JpZ2luYWxfZm10ID0gUVRfRk9VUkNDICgoY29uc3QgZ3VpbnQ4ICopIGZybWEtPmRhdGEgKyA4KTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIm9yaWdpbmFsIHN0cmVhbSBmb3JtYXQ6ICclIiBHU1RfRk9VUkNDX0ZPUk1BVCAiJyIsCisgICAgICBHU1RfRk9VUkNDX0FSR1MgKCpvcmlnaW5hbF9mbXQpKTsKKworICBzY2htID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChzaW5mLCBGT1VSQ0Nfc2NobSk7CisgIGlmICghc2NobSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJzaW5mIGJveCBkb2VzIG5vdCBjb250YWluIHNjaG0gYm94Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfdHlwZSA9IFFUX0ZPVVJDQyAoKGNvbnN0IGd1aW50OCAqKSBzY2htLT5kYXRhICsgMTIpOworICBzdHJlYW0tPnByb3RlY3Rpb25fc2NoZW1lX3ZlcnNpb24gPQorICAgICAgUVRfVUlOVDMyICgoY29uc3QgZ3VpbnQ4ICopIHNjaG0tPmRhdGEgKyAxNik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICJwcm90ZWN0aW9uX3NjaGVtZV90eXBlOiAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiLCAiCisgICAgICAicHJvdGVjdGlvbl9zY2hlbWVfdmVyc2lvbjogJSMwMTB4IiwKKyAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV90eXBlKSwKKyAgICAgIHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfdmVyc2lvbik7CisKKyAgc2NoaSA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAoc2luZiwgRk9VUkNDX3NjaGkpOworICBpZiAoIXNjaGkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic2luZiBib3ggZG9lcyBub3QgY29udGFpbiBzY2hpIGJveCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV90eXBlID09IEZPVVJDQ19jZW5jKSB7CisgICAgUXREZW11eENlbmNTYW1wbGVTZXRJbmZvICppbmZvOworICAgIEdOb2RlICp0ZW5jOworICAgIGNvbnN0IGd1aW50OCAqdGVuY19kYXRhOworICAgIGd1aW50MzIgaXNFbmNyeXB0ZWQ7CisgICAgZ3VpbnQ4IGl2X3NpemU7CisgICAgY29uc3QgZ3VpbnQ4ICpkZWZhdWx0X2tpZDsKKyAgICBHc3RCdWZmZXIgKmtpZF9idWY7CisKKyAgICBpZiAoR19VTkxJS0VMWSAoIXN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfaW5mbykpCisgICAgICBzdHJlYW0tPnByb3RlY3Rpb25fc2NoZW1lX2luZm8gPQorICAgICAgICAgIGdfbWFsbG9jMCAoc2l6ZW9mIChRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8pKTsKKworICAgIGluZm8gPSAoUXREZW11eENlbmNTYW1wbGVTZXRJbmZvICopIHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfaW5mbzsKKworICAgIHRlbmMgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHNjaGksIEZPVVJDQ190ZW5jKTsKKyAgICBpZiAoIXRlbmMpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJzY2hpIGJveCBkb2VzIG5vdCBjb250YWluIHRlbmMgYm94LCAiCisgICAgICAgICAgIndoaWNoIGlzIG1hbmRhdG9yeSBmb3IgQ29tbW9uIEVuY3J5cHRpb24iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgdGVuY19kYXRhID0gKGNvbnN0IGd1aW50OCAqKSB0ZW5jLT5kYXRhICsgMTI7CisgICAgaXNFbmNyeXB0ZWQgPSBRVF9VSU5UMjQgKHRlbmNfZGF0YSk7CisgICAgaXZfc2l6ZSA9IFFUX1VJTlQ4ICh0ZW5jX2RhdGEgKyAzKTsKKyAgICBkZWZhdWx0X2tpZCA9ICh0ZW5jX2RhdGEgKyA0KTsKKyAgICBraWRfYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIDE2LCBOVUxMKTsKKyAgICBnc3RfYnVmZmVyX2ZpbGwgKGtpZF9idWYsIDAsIGRlZmF1bHRfa2lkLCAxNik7CisgICAgaWYgKGluZm8tPmRlZmF1bHRfcHJvcGVydGllcykKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoaW5mby0+ZGVmYXVsdF9wcm9wZXJ0aWVzKTsKKyAgICBpbmZvLT5kZWZhdWx0X3Byb3BlcnRpZXMgPQorICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtY2VuYyIsCisgICAgICAgICJpdl9zaXplIiwgR19UWVBFX1VJTlQsIGl2X3NpemUsCisgICAgICAgICJlbmNyeXB0ZWQiLCBHX1RZUEVfQk9PTEVBTiwgKGlzRW5jcnlwdGVkID09IDEpLAorICAgICAgICAia2lkIiwgR1NUX1RZUEVfQlVGRkVSLCBraWRfYnVmLCBOVUxMKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZGVmYXVsdCBzYW1wbGUgcHJvcGVydGllczogIgorICAgICAgICAiaXNfZW5jcnlwdGVkPSV1LCBpdl9zaXplPSV1IiwgaXNFbmNyeXB0ZWQsIGl2X3NpemUpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGtpZF9idWYpOworICB9CisgIHJldHVybiBUUlVFOworfQorCisvKiBwYXJzZSB0aGUgdHJha3MuCisgKiBXaXRoIGVhY2ggdHJhY2sgd2UgYXNzb2NpYXRlIGEgbmV3IFF0RGVtdXhTdHJlYW0gdGhhdCBjb250YWlucyBhbGwgdGhlIGluZm8KKyAqIGFib3V0IHRoZSB0cmFrLgorICogdHJha3MgdGhhdCBkbyBub3QgZGVjb2RlIHRvIHNvbWV0aGluZyAobGlrZSBzdHJtIHRyYWtzKSB3aWxsIG5vdCBoYXZlIGEgcGFkLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK3F0ZGVtdXhfcGFyc2VfdHJhayAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdOb2RlICogdHJhaykKK3sKKyAgR3N0Qnl0ZVJlYWRlciB0a2hkOworICBpbnQgb2Zmc2V0OworICBHTm9kZSAqbWRpYTsKKyAgR05vZGUgKm1kaGQ7CisgIEdOb2RlICpoZGxyOworICBHTm9kZSAqbWluZjsKKyAgR05vZGUgKnN0Ymw7CisgIEdOb2RlICpzdHNkOworICBHTm9kZSAqbXA0YTsKKyAgR05vZGUgKm1wNHY7CisgIEdOb2RlICplc2RzOworICBHTm9kZSAqdHJlZjsKKyAgR05vZGUgKnVkdGE7CisgIEdOb2RlICpzdm1pOworCisgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbSA9IE5VTEw7CisgIGdib29sZWFuIG5ld19zdHJlYW0gPSBGQUxTRTsKKyAgY29uc3QgZ3VpbnQ4ICpzdHNkX2RhdGE7CisgIGNvbnN0IGd1aW50OCAqc3RzZF9lbnRyeV9kYXRhOworICBndWludCByZW1haW5pbmdfc3RzZF9sZW47CisgIGd1aW50IHN0c2RfZW50cnlfY291bnQ7CisgIGd1aW50IHN0c2RfaW5kZXg7CisgIGd1aW50MTYgbGFuZ19jb2RlOyAgICAgICAgICAgIC8qIHF1aWNrdGltZSBsYW5nIGNvZGUgb3IgcGFja2VkIGlzbyBjb2RlICovCisgIGd1aW50MzIgdmVyc2lvbjsKKyAgZ3VpbnQzMiB0a2hkX2ZsYWdzID0gMDsKKyAgZ3VpbnQ4IHRraGRfdmVyc2lvbiA9IDA7CisgIGd1aW50MzIgdyA9IDAsIGggPSAwOworICBndWludCB2YWx1ZV9zaXplLCBzdHNkX2xlbiwgbGVuOworICBndWludDMyIHRyYWNrX2lkOworICBndWludDMyIGR1bW15OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJwYXJzZV90cmFrIik7CisKKyAgaWYgKCFxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGVfZnVsbCAodHJhaywgRk9VUkNDX3RraGQsICZ0a2hkKQorICAgICAgfHwgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZ0a2hkLCAmdGtoZF92ZXJzaW9uKQorICAgICAgfHwgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDI0X2JlICgmdGtoZCwgJnRraGRfZmxhZ3MpKQorICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgIC8qIHBpY2sgYmV0d2VlbiA2NCBvciAzMiBiaXRzICovCisgIHZhbHVlX3NpemUgPSB0a2hkX3ZlcnNpb24gPT0gMSA/IDggOiA0OworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmdGtoZCwgdmFsdWVfc2l6ZSAqIDIpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZ0a2hkLCAmdHJhY2tfaWQpKQorICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgIGlmICghcXRkZW11eC0+Z290X21vb3YpIHsKKyAgICBpZiAocXRkZW11eF9maW5kX3N0cmVhbSAocXRkZW11eCwgdHJhY2tfaWQpKQorICAgICAgZ290byBleGlzdGluZ19zdHJlYW07CisgICAgc3RyZWFtID0gX2NyZWF0ZV9zdHJlYW0gKCk7CisgICAgc3RyZWFtLT50cmFja19pZCA9IHRyYWNrX2lkOworICAgIG5ld19zdHJlYW0gPSBUUlVFOworICB9IGVsc2UgeworICAgIHN0cmVhbSA9IHF0ZGVtdXhfZmluZF9zdHJlYW0gKHF0ZGVtdXgsIHRyYWNrX2lkKTsKKyAgICBpZiAoIXN0cmVhbSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAiU3RyZWFtIG5vdCBmb3VuZCwgZ29pbmcgdG8gaWdub3JlIGl0Iik7CisgICAgICBnb3RvIHNraXBfdHJhY2s7CisgICAgfQorCisgICAgLyogcmVzZXQgcmV1c2VkIHN0cmVhbSAqLworICAgIGdzdF9xdGRlbXV4X3N0cmVhbV9yZXNldCAocXRkZW11eCwgc3RyZWFtKTsKKyAgfQorICAvKiBuZWVkIGRlZmF1bHRzIGZvciBmcmFnbWVudHMgKi8KKyAgcXRkZW11eF9wYXJzZV90cmV4IChxdGRlbXV4LCBzdHJlYW0sICZkdW1teSwgJmR1bW15LCAmZHVtbXkpOworCisgIGlmICgodGtoZF9mbGFncyAmIDEpID09IDApCisgICAgc3RyZWFtLT5kaXNhYmxlZCA9IFRSVUU7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJ0cmFja1t0a2hkXSB2ZXJzaW9uL2ZsYWdzL2lkOiAweCUwMngvJTA2eC8ldSIsCisgICAgICB0a2hkX3ZlcnNpb24sIHRraGRfZmxhZ3MsIHN0cmVhbS0+dHJhY2tfaWQpOworCisgIGlmICghKG1kaWEgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHRyYWssIEZPVVJDQ19tZGlhKSkpCisgICAgZ290byBjb3JydXB0X2ZpbGU7CisKKyAgaWYgKCEobWRoZCA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAobWRpYSwgRk9VUkNDX21kaGQpKSkgeworICAgIC8qIGJlIG5pY2UgZm9yIHNvbWUgY3Jvb2tlZCBtanAyIGZpbGVzIHRoYXQgdXNlIG1oZHIgZm9yIG1kaGQgKi8KKyAgICBpZiAocXRkZW11eC0+bWFqb3JfYnJhbmQgIT0gRk9VUkNDX21qcDIgfHwKKyAgICAgICAgIShtZGhkID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChtZGlhLCBGT1VSQ0NfbWhkcikpKQorICAgICAgZ290byBjb3JydXB0X2ZpbGU7CisgIH0KKworICBsZW4gPSBRVF9VSU5UMzIgKChndWludDggKikgbWRoZC0+ZGF0YSk7CisgIHZlcnNpb24gPSBRVF9VSU5UMzIgKChndWludDggKikgbWRoZC0+ZGF0YSArIDgpOworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInRyYWNrIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCB2ZXJzaW9uKTsKKyAgaWYgKHZlcnNpb24gPT0gMHgwMTAwMDAwMCkgeworICAgIGlmIChsZW4gPCAzOCkKKyAgICAgIGdvdG8gY29ycnVwdF9maWxlOworICAgIHN0cmVhbS0+dGltZXNjYWxlID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIG1kaGQtPmRhdGEgKyAyOCk7CisgICAgc3RyZWFtLT5kdXJhdGlvbiA9IFFUX1VJTlQ2NCAoKGd1aW50OCAqKSBtZGhkLT5kYXRhICsgMzIpOworICAgIGxhbmdfY29kZSA9IFFUX1VJTlQxNiAoKGd1aW50OCAqKSBtZGhkLT5kYXRhICsgMzYpOworICB9IGVsc2UgeworICAgIGlmIChsZW4gPCAzMCkKKyAgICAgIGdvdG8gY29ycnVwdF9maWxlOworICAgIHN0cmVhbS0+dGltZXNjYWxlID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIG1kaGQtPmRhdGEgKyAyMCk7CisgICAgc3RyZWFtLT5kdXJhdGlvbiA9IFFUX1VJTlQzMiAoKGd1aW50OCAqKSBtZGhkLT5kYXRhICsgMjQpOworICAgIGxhbmdfY29kZSA9IFFUX1VJTlQxNiAoKGd1aW50OCAqKSBtZGhkLT5kYXRhICsgMjgpOworICB9CisKKyAgaWYgKGxhbmdfY29kZSA8IDB4NDAwKSB7CisgICAgcXRkZW11eF9sYW5nX21hcF9xdF9jb2RlX3RvX2lzbyAoc3RyZWFtLT5sYW5nX2lkLCBsYW5nX2NvZGUpOworICB9IGVsc2UgaWYgKGxhbmdfY29kZSA9PSAweDdmZmYpIHsKKyAgICBzdHJlYW0tPmxhbmdfaWRbMF0gPSAwOyAgICAgLyogdW5zcGVjaWZpZWQgKi8KKyAgfSBlbHNlIHsKKyAgICBzdHJlYW0tPmxhbmdfaWRbMF0gPSAweDYwICsgKChsYW5nX2NvZGUgPj4gMTApICYgMHgxRik7CisgICAgc3RyZWFtLT5sYW5nX2lkWzFdID0gMHg2MCArICgobGFuZ19jb2RlID4+IDUpICYgMHgxRik7CisgICAgc3RyZWFtLT5sYW5nX2lkWzJdID0gMHg2MCArIChsYW5nX2NvZGUgJiAweDFGKTsKKyAgICBzdHJlYW0tPmxhbmdfaWRbM10gPSAwOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJ0cmFjayB0aW1lc2NhbGU6ICUiIEdfR1VJTlQzMl9GT1JNQVQsCisgICAgICBzdHJlYW0tPnRpbWVzY2FsZSk7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAidHJhY2sgZHVyYXRpb246ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBzdHJlYW0tPmR1cmF0aW9uKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJ0cmFjayBsYW5ndWFnZSBjb2RlL2lkOiAweCUwNHgvJXMiLAorICAgICAgbGFuZ19jb2RlLCBzdHJlYW0tPmxhbmdfaWQpOworCisgIGlmIChHX1VOTElLRUxZIChzdHJlYW0tPnRpbWVzY2FsZSA9PSAwIHx8IHF0ZGVtdXgtPnRpbWVzY2FsZSA9PSAwKSkKKyAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworICBpZiAoKHRyZWYgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHRyYWssIEZPVVJDQ190cmVmKSkpIHsKKyAgICAvKiBjaGFwdGVycyB0cmFjayByZWZlcmVuY2UgKi8KKyAgICBHTm9kZSAqY2hhcCA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAodHJlZiwgRk9VUkNDX2NoYXApOworICAgIGlmIChjaGFwKSB7CisgICAgICBnc2l6ZSBsZW5ndGggPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGNoYXAtPmRhdGEpOworICAgICAgaWYgKHF0ZGVtdXgtPmNoYXB0ZXJzX3RyYWNrX2lkKQorICAgICAgICBHU1RfRklYTUVfT0JKRUNUIChxdGRlbXV4LCAiTXVsdGlwbGUgQ0hBUCB0cmFja3MiKTsKKworICAgICAgaWYgKGxlbmd0aCA+PSAxMikgeworICAgICAgICBxdGRlbXV4LT5jaGFwdGVyc190cmFja19pZCA9CisgICAgICAgICAgICBHU1RfUkVBRF9VSU5UMzJfQkUgKChnaW50OCAqKSBjaGFwLT5kYXRhICsgOCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogZnJhZ21lbnRlZCBmaWxlcyBtYXkgaGF2ZSBib2d1cyBkdXJhdGlvbiBpbiBtb292ICovCisgIGlmICghcXRkZW11eC0+ZnJhZ21lbnRlZCAmJgorICAgICAgcXRkZW11eC0+ZHVyYXRpb24gIT0gR19NQVhJTlQ2NCAmJiBzdHJlYW0tPmR1cmF0aW9uICE9IEdfTUFYSU5UMzIpIHsKKyAgICBndWludDY0IHRkdXIxLCB0ZHVyMjsKKworICAgIC8qIGRvbid0IG92ZXJmbG93ICovCisgICAgdGR1cjEgPSBzdHJlYW0tPnRpbWVzY2FsZSAqIChndWludDY0KSBxdGRlbXV4LT5kdXJhdGlvbjsKKyAgICB0ZHVyMiA9IHF0ZGVtdXgtPnRpbWVzY2FsZSAqIChndWludDY0KSBzdHJlYW0tPmR1cmF0aW9uOworCisgICAgLyogSEFDSzoKKyAgICAgKiBzb21lIG9mIHRob3NlIHRyYWlsZXJzLCBub3dhZGF5cywgaGF2ZSBwcm9sb2d1ZSBpbWFnZXMgdGhhdCBhcmUKKyAgICAgKiB0aGVtc2VsdmVzIHZpZGVvIHRyYWNrcyBhcyB3ZWxsLiBJIGhhdmVuJ3QgcmVhbGx5IGZvdW5kIGEgd2F5IHRvCisgICAgICogaWRlbnRpZnkgdGhvc2UgeWV0LCBleGNlcHQgZm9yIGp1c3QgbG9va2luZyBhdCB0aGVpciBkdXJhdGlvbi4gKi8KKyAgICBpZiAodGR1cjEgIT0gMCAmJiAodGR1cjIgKiAxMCAvIHRkdXIxKSA8IDIpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAiVHJhY2sgc2hvcnRlciB0aGFuIDIwJSUgKCUiIEdfR1VJTlQ2NF9GT1JNQVQgIi8lIiBHX0dVSU5UMzJfRk9STUFUCisgICAgICAgICAgIiB2cy4gJSIgR19HVUlOVDY0X0ZPUk1BVCAiLyUiIEdfR1VJTlQzMl9GT1JNQVQgIikgb2YgdGhlIHN0cmVhbSAiCisgICAgICAgICAgImZvdW5kLCBhc3N1bWluZyBwcmV2aWV3IGltYWdlIG9yIHNvbWV0aGluZzsgc2tpcHBpbmcgdHJhY2siLAorICAgICAgICAgIHN0cmVhbS0+ZHVyYXRpb24sIHN0cmVhbS0+dGltZXNjYWxlLCBxdGRlbXV4LT5kdXJhdGlvbiwKKyAgICAgICAgICBxdGRlbXV4LT50aW1lc2NhbGUpOworICAgICAgaWYgKG5ld19zdHJlYW0pCisgICAgICAgIGdzdF9xdGRlbXV4X3N0cmVhbV9mcmVlIChxdGRlbXV4LCBzdHJlYW0pOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisKKyAgaWYgKCEoaGRsciA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAobWRpYSwgRk9VUkNDX2hkbHIpKSkKKyAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInRyYWNrIHR5cGU6ICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgR1NUX0ZPVVJDQ19BUkdTIChRVF9GT1VSQ0MgKChndWludDggKikgaGRsci0+ZGF0YSArIDEyKSkpOworCisgIGxlbiA9IFFUX1VJTlQzMiAoKGd1aW50OCAqKSBoZGxyLT5kYXRhKTsKKyAgaWYgKGxlbiA+PSAyMCkKKyAgICBzdHJlYW0tPnN1YnR5cGUgPSBRVF9GT1VSQ0MgKChndWludDggKikgaGRsci0+ZGF0YSArIDE2KTsKKyAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJ0cmFjayBzdWJ0eXBlOiAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoc3RyZWFtLT5zdWJ0eXBlKSk7CisKKyAgaWYgKCEobWluZiA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAobWRpYSwgRk9VUkNDX21pbmYpKSkKKyAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworICBpZiAoIShzdGJsID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChtaW5mLCBGT1VSQ0Nfc3RibCkpKQorICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgIC8qcGFyc2Ugc3ZtaSBoZWFkZXIgaWYgZXhpc3RpbmcgKi8KKyAgc3ZtaSA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAoc3RibCwgRk9VUkNDX3N2bWkpOworICBpZiAoc3ZtaSkgeworICAgIGxlbiA9IFFUX1VJTlQzMiAoKGd1aW50OCAqKSBzdm1pLT5kYXRhKTsKKyAgICB2ZXJzaW9uID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIHN2bWktPmRhdGEgKyA4KTsKKyAgICBpZiAoIXZlcnNpb24pIHsKKyAgICAgIEdzdFZpZGVvTXVsdGl2aWV3TW9kZSBtb2RlID0gR1NUX1ZJREVPX01VTFRJVklFV19NT0RFX05PTkU7CisgICAgICBHc3RWaWRlb011bHRpdmlld0ZsYWdzIGZsYWdzID0gR1NUX1ZJREVPX01VTFRJVklFV19GTEFHU19OT05FOworICAgICAgZ3VpbnQ4IGZyYW1lX3R5cGUsIGZyYW1lX2xheW91dDsKKworICAgICAgLyogTVBFRy1BIHN0ZXJlbyB2aWRlbyAqLworICAgICAgaWYgKHF0ZGVtdXgtPm1ham9yX2JyYW5kID09IEZPVVJDQ19zczAyKQorICAgICAgICBmbGFncyB8PSBHU1RfVklERU9fTVVMVElWSUVXX0ZMQUdTX01JWEVEX01PTk87CisKKyAgICAgIGZyYW1lX3R5cGUgPSBRVF9VSU5UOCAoKGd1aW50OCAqKSBzdm1pLT5kYXRhICsgMTIpOworICAgICAgZnJhbWVfbGF5b3V0ID0gUVRfVUlOVDggKChndWludDggKikgc3ZtaS0+ZGF0YSArIDEzKSAmIDB4MDE7CisgICAgICBzd2l0Y2ggKGZyYW1lX3R5cGUpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgIG1vZGUgPSBHU1RfVklERU9fTVVMVElWSUVXX01PREVfU0lERV9CWV9TSURFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgbW9kZSA9IEdTVF9WSURFT19NVUxUSVZJRVdfTU9ERV9ST1dfSU5URVJMRUFWRUQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICBtb2RlID0gR1NUX1ZJREVPX01VTFRJVklFV19NT0RFX0ZSQU1FX0JZX0ZSQU1FOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgLyogbW9kZSAzIGlzIHByaW1hcnkvc2Vjb25kYXJ5IHZpZXcgc2VxdWVuY2UsIGllCisgICAgICAgICAgICogbGVmdC9yaWdodCB2aWV3cyBpbiBzZXBhcmF0ZSB0cmFja3MuIFNlZSBzZWN0aW9uIDcuMgorICAgICAgICAgICAqIG9mIElTTy9JRUMgMjMwMDAtMTE6MjAwOSAqLworICAgICAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAgICJJbXBsZW1lbnQgc3RlcmVvIHZpZGVvIGluIHNlcGFyYXRlIHN0cmVhbXMiKTsKKyAgICAgIH0KKworICAgICAgaWYgKChmcmFtZV9sYXlvdXQgJiAweDEpID09IDApCisgICAgICAgIGZsYWdzIHw9IEdTVF9WSURFT19NVUxUSVZJRVdfRkxBR1NfUklHSFRfVklFV19GSVJTVDsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgIlN0ZXJlb1ZpZGVvOiBjb21wb3NpdGlvbiB0eXBlOiAldSwgaXNfbGVmdF9maXJzdDogJXUiLAorICAgICAgICAgIGZyYW1lX3R5cGUsIGZyYW1lX2xheW91dCk7CisgICAgICBzdHJlYW0tPm11bHRpdmlld19tb2RlID0gbW9kZTsKKyAgICAgIHN0cmVhbS0+bXVsdGl2aWV3X2ZsYWdzID0gZmxhZ3M7CisgICAgfQorICB9CisKKyAgLyogcGFyc2UgcmVzdCBvZiB0a2hkICovCisgIGlmIChzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3ZpZGUpIHsKKyAgICBndWludDMyIG1hdHJpeFs5XTsKKworICAgIC8qIHZlcnNpb24gMSB1c2VzIHNvbWUgNjQtYml0IGludHMgKi8KKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmdGtoZCwgMjAgKyB2YWx1ZV9zaXplKSkKKyAgICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgICAgaWYgKCFxdGRlbXV4X3BhcnNlX3RyYW5zZm9ybWF0aW9uX21hdHJpeCAocXRkZW11eCwgJnRraGQsIG1hdHJpeCwgInRraGQiKSkKKyAgICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoJnRraGQsICZ3KQorICAgICAgICB8fCAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZ0a2hkLCAmaCkpCisgICAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworICAgIHF0ZGVtdXhfaW5zcGVjdF90cmFuc2Zvcm1hdGlvbl9tYXRyaXggKHF0ZGVtdXgsIHN0cmVhbSwgbWF0cml4LAorICAgICAgICAmc3RyZWFtLT5zdHJlYW1fdGFncyk7CisgIH0KKworICAvKiBwYXJzZSBzdHNkICovCisgIGlmICghKHN0c2QgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHN0YmwsIEZPVVJDQ19zdHNkKSkpCisgICAgZ290byBjb3JydXB0X2ZpbGU7CisgIHN0c2RfZGF0YSA9IChjb25zdCBndWludDggKikgc3RzZC0+ZGF0YTsKKworICAvKiBzdHNkIHNob3VsZCBhdCBsZWFzdCBoYXZlIG9uZSBlbnRyeSAqLworICBzdHNkX2xlbiA9IFFUX1VJTlQzMiAoc3RzZF9kYXRhKTsKKyAgaWYgKHN0c2RfbGVuIDwgMjQpIHsKKyAgICAvKiAuLiBidXQgc2tpcCBzdHJlYW0gd2l0aCBlbXB0eSBzdHNkIHByb2R1Y2VkIGJ5IHNvbWUgVml2b3RlayBjYW1lcmFzICovCisgICAgaWYgKHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0Nfdml2bykgeworICAgICAgaWYgKG5ld19zdHJlYW0pCisgICAgICAgIGdzdF9xdGRlbXV4X3N0cmVhbV9mcmVlIChxdGRlbXV4LCBzdHJlYW0pOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIGdvdG8gY29ycnVwdF9maWxlOworICAgIH0KKyAgfQorCisgIHN0cmVhbS0+c3RzZF9lbnRyaWVzX2xlbmd0aCA9IHN0c2RfZW50cnlfY291bnQgPSBRVF9VSU5UMzIgKHN0c2RfZGF0YSArIDEyKTsKKyAgc3RyZWFtLT5zdHNkX2VudHJpZXMgPSBnX25ldzAgKFF0RGVtdXhTdHJlYW1TdHNkRW50cnksIHN0c2RfZW50cnlfY291bnQpOworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInN0c2QgbGVuOiAgICAgICAgICAgJWQiLCBzdHNkX2xlbik7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAic3RzZCBlbnRyeSBjb3VudDogICAldSIsIHN0c2RfZW50cnlfY291bnQpOworCisgIHN0c2RfZW50cnlfZGF0YSA9IHN0c2RfZGF0YSArIDE2OworICByZW1haW5pbmdfc3RzZF9sZW4gPSBzdHNkX2xlbiAtIDE2OworICBmb3IgKHN0c2RfaW5kZXggPSAwOyBzdHNkX2luZGV4IDwgc3RzZF9lbnRyeV9jb3VudDsgc3RzZF9pbmRleCsrKSB7CisgICAgZ3VpbnQzMiBmb3VyY2M7CisgICAgZ2NoYXIgKmNvZGVjID0gTlVMTDsKKyAgICBRdERlbXV4U3RyZWFtU3RzZEVudHJ5ICplbnRyeSA9ICZzdHJlYW0tPnN0c2RfZW50cmllc1tzdHNkX2luZGV4XTsKKworICAgIC8qIGFuZCB0aGF0IGVudHJ5IHNob3VsZCBmaXQgd2l0aGluIHN0c2QgKi8KKyAgICBsZW4gPSBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSk7CisgICAgaWYgKGxlbiA+IHJlbWFpbmluZ19zdHNkX2xlbikKKyAgICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgICAgZW50cnktPmZvdXJjYyA9IGZvdXJjYyA9IFFUX0ZPVVJDQyAoc3RzZF9lbnRyeV9kYXRhICsgNCk7CisgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJzdHNkIHR5cGU6ICAgICAgICAgICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGVudHJ5LT5mb3VyY2MpKTsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInN0c2QgdHlwZSBsZW46ICAgICAgJWQiLCBsZW4pOworCisgICAgaWYgKChmb3VyY2MgPT0gRk9VUkNDX2RybXMpIHx8IChmb3VyY2MgPT0gRk9VUkNDX2RybWkpKQorICAgICAgZ290byBlcnJvcl9lbmNyeXB0ZWQ7CisKKyAgICBpZiAoZm91cmNjID09IEZPVVJDQ19lbmN2IHx8IGZvdXJjYyA9PSBGT1VSQ0NfZW5jYSkgeworICAgICAgLyogRklYTUUgdGhpcyBsb29rcyB3cm9uZywgdGhlcmUgbWlnaHQgYmUgbXVsdGlwbGUgY2hpbGRyZW4KKyAgICAgICAqIHdpdGggdGhlIHNhbWUgdHlwZSAqLworICAgICAgR05vZGUgKmVuYyA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAoc3RzZCwgZm91cmNjKTsKKyAgICAgIHN0cmVhbS0+cHJvdGVjdGVkID0gVFJVRTsKKyAgICAgIGlmICghcXRkZW11eF9wYXJzZV9wcm90ZWN0aW9uX3NjaGVtZV9pbmZvIChxdGRlbXV4LCBzdHJlYW0sIGVuYywgJmZvdXJjYykpCisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJGYWlsZWQgdG8gcGFyc2UgcHJvdGVjdGlvbiBzY2hlbWUgaW5mbyIpOworICAgIH0KKworICAgIGlmIChzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3ZpZGUpIHsKKyAgICAgIEdOb2RlICpjb2xyOworICAgICAgR05vZGUgKmZpZWw7CisgICAgICBHTm9kZSAqcGFzcDsKKyAgICAgIGdib29sZWFuIGdyYXk7CisgICAgICBnaW50IGRlcHRoLCBwYWxldHRlX3NpemUsIHBhbGV0dGVfY291bnQ7CisgICAgICBndWludDMyICpwYWxldHRlX2RhdGEgPSBOVUxMOworCisgICAgICBlbnRyeS0+c2FtcGxlZCA9IFRSVUU7CisKKyAgICAgIHN0cmVhbS0+ZGlzcGxheV93aWR0aCA9IHcgPj4gMTY7CisgICAgICBzdHJlYW0tPmRpc3BsYXlfaGVpZ2h0ID0gaCA+PiAxNjsKKworICAgICAgb2Zmc2V0ID0gMTY7CisgICAgICBpZiAobGVuIDwgODYpICAgICAgICAgICAgIC8qIFRPRE8gdmVyaWZ5ICovCisgICAgICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgICAgICBlbnRyeS0+d2lkdGggPSBRVF9VSU5UMTYgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDE2KTsKKyAgICAgIGVudHJ5LT5oZWlnaHQgPSBRVF9VSU5UMTYgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDE4KTsKKyAgICAgIGVudHJ5LT5mcHNfbiA9IDA7ICAgICAgICAgLyogdGhpcyBpcyBmaWxsZWQgaW4gbGF0ZXIgKi8KKyAgICAgIGVudHJ5LT5mcHNfZCA9IDA7ICAgICAgICAgLyogdGhpcyBpcyBmaWxsZWQgaW4gbGF0ZXIgKi8KKyAgICAgIGVudHJ5LT5iaXRzX3Blcl9zYW1wbGUgPSBRVF9VSU5UMTYgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDY2KTsKKyAgICAgIGVudHJ5LT5jb2xvcl90YWJsZV9pZCA9IFFUX1VJTlQxNiAoc3RzZF9lbnRyeV9kYXRhICsgb2Zmc2V0ICsgNjgpOworCisgICAgICAvKiBpZiBjb2xvcl90YWJsZV9pZCBpcyAwLCBjdGFiIGF0b20gbXVzdCBmb2xsb3c7IGhvd2V2ZXIgc29tZSBmaWxlcworICAgICAgICogcHJvZHVjZWQgYnkgVE1QRUdFbmMgaGF2ZSBjb2xvcl90YWJsZV9pZCA9IDAgYW5kIG5vIGN0YWIgYXRvbSwgc28KKyAgICAgICAqIGlmIGNvbG9yIHRhYmxlIGlzIG5vdCBwcmVzZW50IHdlJ2xsIGNvcnJlY3QgdGhlIHZhbHVlICovCisgICAgICBpZiAoZW50cnktPmNvbG9yX3RhYmxlX2lkID09IDAgJiYKKyAgICAgICAgICAobGVuIDwgOTAKKyAgICAgICAgICAgICAgfHwgUVRfRk9VUkNDIChzdHNkX2VudHJ5X2RhdGEgKyBvZmZzZXQgKyA3MCkgIT0gRk9VUkNDX2N0YWIpKSB7CisgICAgICAgIGVudHJ5LT5jb2xvcl90YWJsZV9pZCA9IC0xOworICAgICAgfQorCisgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIndpZHRoICVkLCBoZWlnaHQgJWQsIGJwcyAlZCwgY29sb3IgdGFibGUgaWQgJWQiLAorICAgICAgICAgIGVudHJ5LT53aWR0aCwgZW50cnktPmhlaWdodCwgZW50cnktPmJpdHNfcGVyX3NhbXBsZSwKKyAgICAgICAgICBlbnRyeS0+Y29sb3JfdGFibGVfaWQpOworCisgICAgICBkZXB0aCA9IGVudHJ5LT5iaXRzX3Blcl9zYW1wbGU7CisKKyAgICAgIC8qIG1vcmUgdGhhbiAzMiBiaXRzIG1lYW5zIGdyYXlzY2FsZSAqLworICAgICAgZ3JheSA9IChkZXB0aCA+IDMyKTsKKyAgICAgIC8qIGxvdyAzMiBiaXRzIHNwZWNpZnkgdGhlIGRlcHRoICAqLworICAgICAgZGVwdGggJj0gMHgxRjsKKworICAgICAgLyogZGlmZmVyZW50IG51bWJlciBvZiBwYWxldHRlIGVudHJpZXMgaXMgZGV0ZXJtaW5lZCBieSBkZXB0aC4gKi8KKyAgICAgIHBhbGV0dGVfY291bnQgPSAwOworICAgICAgaWYgKChkZXB0aCA9PSAxKSB8fCAoZGVwdGggPT0gMikgfHwgKGRlcHRoID09IDQpIHx8IChkZXB0aCA9PSA4KSkKKyAgICAgICAgcGFsZXR0ZV9jb3VudCA9ICgxIDw8IGRlcHRoKTsKKyAgICAgIHBhbGV0dGVfc2l6ZSA9IHBhbGV0dGVfY291bnQgKiA0OworCisgICAgICBpZiAoZW50cnktPmNvbG9yX3RhYmxlX2lkKSB7CisgICAgICAgIHN3aXRjaCAocGFsZXR0ZV9jb3VudCkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHBhbGV0dGVfZGF0YSA9IGdfbWVtZHVwIChmZl9xdF9kZWZhdWx0X3BhbGV0dGVfMiwgcGFsZXR0ZV9zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHBhbGV0dGVfZGF0YSA9IGdfbWVtZHVwIChmZl9xdF9kZWZhdWx0X3BhbGV0dGVfNCwgcGFsZXR0ZV9zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICBpZiAoZ3JheSkKKyAgICAgICAgICAgICAgcGFsZXR0ZV9kYXRhID0KKyAgICAgICAgICAgICAgICAgIGdfbWVtZHVwIChmZl9xdF9ncmF5c2NhbGVfcGFsZXR0ZV8xNiwgcGFsZXR0ZV9zaXplKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcGFsZXR0ZV9kYXRhID0gZ19tZW1kdXAgKGZmX3F0X2RlZmF1bHRfcGFsZXR0ZV8xNiwgcGFsZXR0ZV9zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjU2OgorICAgICAgICAgICAgaWYgKGdyYXkpCisgICAgICAgICAgICAgIHBhbGV0dGVfZGF0YSA9CisgICAgICAgICAgICAgICAgICBnX21lbWR1cCAoZmZfcXRfZ3JheXNjYWxlX3BhbGV0dGVfMjU2LCBwYWxldHRlX3NpemUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBwYWxldHRlX2RhdGEgPSBnX21lbWR1cCAoZmZfcXRfZGVmYXVsdF9wYWxldHRlXzI1NiwgcGFsZXR0ZV9zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChxdGRlbXV4LCBTVFJFQU0sIERFTVVYLAorICAgICAgICAgICAgICAgIChfKCJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iKSksCisgICAgICAgICAgICAgICAgKCJ1bnN1cHBvcnRlZCBwYWxldHRlIGRlcHRoICVkIiwgZGVwdGgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBnaW50IGksIGosIHN0YXJ0LCBlbmQ7CisKKyAgICAgICAgaWYgKGxlbiA8IDk0KQorICAgICAgICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgICAgICAgIC8qIHJlYWQgdGFibGUgKi8KKyAgICAgICAgc3RhcnQgPSBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDcwKTsKKyAgICAgICAgcGFsZXR0ZV9jb3VudCA9IFFUX1VJTlQxNiAoc3RzZF9lbnRyeV9kYXRhICsgb2Zmc2V0ICsgNzQpOworICAgICAgICBlbmQgPSBRVF9VSU5UMTYgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDc2KTsKKworICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInN0YXJ0ICVkLCBlbmQgJWQsIHBhbGV0dGVfY291bnQgJWQiLAorICAgICAgICAgICAgc3RhcnQsIGVuZCwgcGFsZXR0ZV9jb3VudCk7CisKKyAgICAgICAgaWYgKGVuZCA+IDI1NSkKKyAgICAgICAgICBlbmQgPSAyNTU7CisgICAgICAgIGlmIChzdGFydCA+IGVuZCkKKyAgICAgICAgICBzdGFydCA9IGVuZDsKKworICAgICAgICBpZiAobGVuIDwgOTQgKyAoZW5kIC0gc3RhcnQpICogOCkKKyAgICAgICAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworICAgICAgICAvKiBwYWxldHRlIGlzIGFsd2F5cyB0aGUgc2FtZSBzaXplICovCisgICAgICAgIHBhbGV0dGVfZGF0YSA9IGdfbWFsbG9jMCAoMjU2ICogNCk7CisgICAgICAgIHBhbGV0dGVfc2l6ZSA9IDI1NiAqIDQ7CisKKyAgICAgICAgZm9yIChqID0gMCwgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaisrLCBpKyspIHsKKyAgICAgICAgICBndWludDMyIGEsIHIsIGcsIGI7CisKKyAgICAgICAgICBhID0gUVRfVUlOVDE2IChzdHNkX2VudHJ5X2RhdGEgKyBvZmZzZXQgKyA3OCArIChqICogOCkpOworICAgICAgICAgIHIgPSBRVF9VSU5UMTYgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDgwICsgKGogKiA4KSk7CisgICAgICAgICAgZyA9IFFUX1VJTlQxNiAoc3RzZF9lbnRyeV9kYXRhICsgb2Zmc2V0ICsgODIgKyAoaiAqIDgpKTsKKyAgICAgICAgICBiID0gUVRfVUlOVDE2IChzdHNkX2VudHJ5X2RhdGEgKyBvZmZzZXQgKyA4NCArIChqICogOCkpOworCisgICAgICAgICAgcGFsZXR0ZV9kYXRhW2ldID0gKChhICYgMHhmZjAwKSA8PCAxNikgfCAoKHIgJiAweGZmMDApIDw8IDgpIHwKKyAgICAgICAgICAgICAgKGcgJiAweGZmMDApIHwgKGIgPj4gOCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGVudHJ5LT5jYXBzKQorICAgICAgICBnc3RfY2Fwc191bnJlZiAoZW50cnktPmNhcHMpOworCisgICAgICBlbnRyeS0+Y2FwcyA9CisgICAgICAgICAgcXRkZW11eF92aWRlb19jYXBzIChxdGRlbXV4LCBzdHJlYW0sIGVudHJ5LCBmb3VyY2MsIHN0c2RfZW50cnlfZGF0YSwKKyAgICAgICAgICAmY29kZWMpOworICAgICAgaWYgKEdfVU5MSUtFTFkgKCFlbnRyeS0+Y2FwcykpIHsKKyAgICAgICAgZ19mcmVlIChwYWxldHRlX2RhdGEpOworICAgICAgICBnb3RvIHVua25vd25fc3RyZWFtOworICAgICAgfQorCisgICAgICBpZiAoY29kZWMpIHsKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZCAoc3RyZWFtLT5zdHJlYW1fdGFncywgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICAgICAgR1NUX1RBR19WSURFT19DT0RFQywgY29kZWMsIE5VTEwpOworICAgICAgICBnX2ZyZWUgKGNvZGVjKTsKKyAgICAgICAgY29kZWMgPSBOVUxMOworICAgICAgfQorCisgICAgICBpZiAocGFsZXR0ZV9kYXRhKSB7CisgICAgICAgIEdzdFN0cnVjdHVyZSAqczsKKworICAgICAgICBpZiAoZW50cnktPnJnYjhfcGFsZXR0ZSkKKyAgICAgICAgICBnc3RfbWVtb3J5X3VucmVmIChlbnRyeS0+cmdiOF9wYWxldHRlKTsKKyAgICAgICAgZW50cnktPnJnYjhfcGFsZXR0ZSA9IGdzdF9tZW1vcnlfbmV3X3dyYXBwZWQgKEdTVF9NRU1PUllfRkxBR19SRUFET05MWSwKKyAgICAgICAgICAgIHBhbGV0dGVfZGF0YSwgcGFsZXR0ZV9zaXplLCAwLCBwYWxldHRlX3NpemUsIHBhbGV0dGVfZGF0YSwgZ19mcmVlKTsKKworICAgICAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoZW50cnktPmNhcHMsIDApOworCisgICAgICAgIC8qIG5vbi1yYXcgdmlkZW8gaGFzIGEgcGFsZXR0ZV9kYXRhIHByb3BlcnR5LiByYXcgdmlkZW8gaGFzIHRoZSBwYWxldHRlIGFzCisgICAgICAgICAqIGFuIGV4dHJhIHBsYW5lIHRoYXQgd2UgYXBwZW5kIHRvIHRoZSBvdXRwdXQgYnVmZmVycyBiZWZvcmUgd2UgcHVzaAorICAgICAgICAgKiB0aGVtKi8KKyAgICAgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAidmlkZW8veC1yYXciKSkgeworICAgICAgICAgIEdzdEJ1ZmZlciAqcGFsZXR0ZTsKKworICAgICAgICAgIHBhbGV0dGUgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgICAgICAgICBnc3RfYnVmZmVyX2FwcGVuZF9tZW1vcnkgKHBhbGV0dGUsIGVudHJ5LT5yZ2I4X3BhbGV0dGUpOworICAgICAgICAgIGVudHJ5LT5yZ2I4X3BhbGV0dGUgPSBOVUxMOworCisgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsICJwYWxldHRlX2RhdGEiLAorICAgICAgICAgICAgICBHU1RfVFlQRV9CVUZGRVIsIHBhbGV0dGUsIE5VTEwpOworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHBhbGV0dGUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHBhbGV0dGVfY291bnQgIT0gMCkgeworICAgICAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChxdGRlbXV4LCBTVFJFQU0sIE5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgIChOVUxMKSwgKCJVbnN1cHBvcnRlZCBwYWxldHRlIGRlcHRoICVkIiwgZGVwdGgpKTsKKyAgICAgIH0KKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJmcmFtZSBjb3VudDogICAldSIsCisgICAgICAgICAgUVRfVUlOVDE2IChzdHNkX2VudHJ5X2RhdGEgKyBvZmZzZXQgKyAzMikpOworCisgICAgICBlc2RzID0gTlVMTDsKKyAgICAgIHBhc3AgPSBOVUxMOworICAgICAgY29sciA9IE5VTEw7CisgICAgICBmaWVsID0gTlVMTDsKKyAgICAgIC8qIHBpY2sgJ3RoZScgc3RzZCBjaGlsZCAqLworICAgICAgbXA0diA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfaW5kZXggKHN0c2QsIHN0c2RfaW5kZXgpOworICAgICAgaWYgKCFzdHJlYW0tPnByb3RlY3RlZCkgeworICAgICAgICBpZiAoUVRERU1VWF9UUkVFX05PREVfRk9VUkNDIChtcDR2KSAhPSBmb3VyY2MpIHsKKyAgICAgICAgICBtcDR2ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKFFUREVNVVhfVFJFRV9OT0RFX0ZPVVJDQyAobXA0dikgIT0gRk9VUkNDX2VuY3YpIHsKKyAgICAgICAgICBtcDR2ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAobXA0dikgeworICAgICAgICBlc2RzID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChtcDR2LCBGT1VSQ0NfZXNkcyk7CisgICAgICAgIHBhc3AgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKG1wNHYsIEZPVVJDQ19wYXNwKTsKKyAgICAgICAgY29sciA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAobXA0diwgRk9VUkNDX2NvbHIpOworICAgICAgICBmaWVsID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChtcDR2LCBGT1VSQ0NfZmllbCk7CisgICAgICB9CisKKyAgICAgIGlmIChwYXNwKSB7CisgICAgICAgIGNvbnN0IGd1aW50OCAqcGFzcF9kYXRhID0gKGNvbnN0IGd1aW50OCAqKSBwYXNwLT5kYXRhOworICAgICAgICBnaW50IGxlbiA9IFFUX1VJTlQzMiAocGFzcF9kYXRhKTsKKworICAgICAgICBpZiAobGVuID09IDE2KSB7CisgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cGFyX3cgPSBRVF9VSU5UMzIgKHBhc3BfZGF0YSArIDgpOworICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPnBhcl9oID0gUVRfVUlOVDMyIChwYXNwX2RhdGEgKyAxMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cGFyX3cgPSAwOworICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPnBhcl9oID0gMDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cGFyX3cgPSAwOworICAgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT5wYXJfaCA9IDA7CisgICAgICB9CisKKyAgICAgIGlmIChmaWVsKSB7CisgICAgICAgIGNvbnN0IGd1aW50OCAqZmllbF9kYXRhID0gKGNvbnN0IGd1aW50OCAqKSBmaWVsLT5kYXRhOworICAgICAgICBnaW50IGxlbiA9IFFUX1VJTlQzMiAoZmllbF9kYXRhKTsKKworICAgICAgICBpZiAobGVuID09IDEwKSB7CisgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+aW50ZXJsYWNlX21vZGUgPSBHU1RfUkVBRF9VSU5UOCAoZmllbF9kYXRhICsgOCk7CisgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+ZmllbGRfb3JkZXIgPSBHU1RfUkVBRF9VSU5UOCAoZmllbF9kYXRhICsgOSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGNvbHIpIHsKKyAgICAgICAgY29uc3QgZ3VpbnQ4ICpjb2xyX2RhdGEgPSAoY29uc3QgZ3VpbnQ4ICopIGNvbHItPmRhdGE7CisgICAgICAgIGdpbnQgbGVuID0gUVRfVUlOVDMyIChjb2xyX2RhdGEpOworCisgICAgICAgIGlmIChsZW4gPT0gMTkgfHwgbGVuID09IDE4KSB7CisgICAgICAgICAgZ3VpbnQzMiBjb2xvcl90eXBlID0gR1NUX1JFQURfVUlOVDMyX0xFIChjb2xyX2RhdGEgKyA4KTsKKworICAgICAgICAgIGlmIChjb2xvcl90eXBlID09IEZPVVJDQ19uY2x4IHx8IGNvbG9yX3R5cGUgPT0gRk9VUkNDX25jbGMpIHsKKyAgICAgICAgICAgIGd1aW50MTYgcHJpbWFyaWVzID0gR1NUX1JFQURfVUlOVDE2X0JFIChjb2xyX2RhdGEgKyAxMik7CisgICAgICAgICAgICBndWludDE2IHRyYW5zZmVyX2Z1bmN0aW9uID0gR1NUX1JFQURfVUlOVDE2X0JFIChjb2xyX2RhdGEgKyAxNCk7CisgICAgICAgICAgICBndWludDE2IG1hdHJpeCA9IEdTVF9SRUFEX1VJTlQxNl9CRSAoY29scl9kYXRhICsgMTYpOworICAgICAgICAgICAgZ2Jvb2xlYW4gZnVsbF9yYW5nZSA9IGxlbiA9PSAxOSA/IGNvbHJfZGF0YVsxN10gPj4gNyA6IEZBTFNFOworCisgICAgICAgICAgICBzd2l0Y2ggKHByaW1hcmllcykgeworICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y29sb3JpbWV0cnkucHJpbWFyaWVzID0KKyAgICAgICAgICAgICAgICAgICAgR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19CVDcwOTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmNvbG9yaW1ldHJ5LnByaW1hcmllcyA9CisgICAgICAgICAgICAgICAgICAgIEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfQlQ0NzBCRzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmNvbG9yaW1ldHJ5LnByaW1hcmllcyA9CisgICAgICAgICAgICAgICAgICAgIEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfU01QVEUxNzBNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y29sb3JpbWV0cnkucHJpbWFyaWVzID0KKyAgICAgICAgICAgICAgICAgICAgR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19CVDIwMjA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodHJhbnNmZXJfZnVuY3Rpb24pIHsKKyAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmNvbG9yaW1ldHJ5LnRyYW5zZmVyID0KKyAgICAgICAgICAgICAgICAgICAgR1NUX1ZJREVPX1RSQU5TRkVSX0JUNzA5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y29sb3JpbWV0cnkudHJhbnNmZXIgPQorICAgICAgICAgICAgICAgICAgICBHU1RfVklERU9fVFJBTlNGRVJfU01QVEUyNDBNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKG1hdHJpeCkgeworICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y29sb3JpbWV0cnkubWF0cml4ID0KKyAgICAgICAgICAgICAgICAgICAgR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9CVDcwOTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmNvbG9yaW1ldHJ5Lm1hdHJpeCA9CisgICAgICAgICAgICAgICAgICAgIEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQ2MDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT5jb2xvcmltZXRyeS5tYXRyaXggPQorICAgICAgICAgICAgICAgICAgICBHU1RfVklERU9fQ09MT1JfTUFUUklYX1NNUFRFMjQwTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmNvbG9yaW1ldHJ5Lm1hdHJpeCA9CisgICAgICAgICAgICAgICAgICAgIEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQyMDIwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT5jb2xvcmltZXRyeS5yYW5nZSA9CisgICAgICAgICAgICAgICAgZnVsbF9yYW5nZSA/IEdTVF9WSURFT19DT0xPUl9SQU5HRV8wXzI1NSA6CisgICAgICAgICAgICAgICAgR1NUX1ZJREVPX0NPTE9SX1JBTkdFXzE2XzIzNTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIlVuc3VwcG9ydGVkIGNvbG9yIHR5cGUiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAiSW52YWxpZCBjb2xyIGF0b20gc2l6ZSIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChlc2RzKSB7CisgICAgICAgIGdzdF9xdGRlbXV4X2hhbmRsZV9lc2RzIChxdGRlbXV4LCBzdHJlYW0sIGVudHJ5LCBlc2RzLAorICAgICAgICAgICAgc3RyZWFtLT5zdHJlYW1fdGFncyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKGZvdXJjYykgeworICAgICAgICAgIGNhc2UgRk9VUkNDX0gyNjQ6CisgICAgICAgICAgY2FzZSBGT1VSQ0NfYXZjMToKKyAgICAgICAgICBjYXNlIEZPVVJDQ19hdmMzOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGdpbnQgbGVuID0gUVRfVUlOVDMyIChzdHNkX2VudHJ5X2RhdGEpIC0gMHg1NjsKKyAgICAgICAgICAgIGNvbnN0IGd1aW50OCAqYXZjX2RhdGEgPSBzdHNkX2VudHJ5X2RhdGEgKyAweDU2OworCisgICAgICAgICAgICAvKiBmaW5kIGF2Y0MgKi8KKyAgICAgICAgICAgIHdoaWxlIChsZW4gPj0gMHg4KSB7CisgICAgICAgICAgICAgIGdpbnQgc2l6ZTsKKworICAgICAgICAgICAgICBpZiAoUVRfVUlOVDMyIChhdmNfZGF0YSkgPD0gbGVuKQorICAgICAgICAgICAgICAgIHNpemUgPSBRVF9VSU5UMzIgKGF2Y19kYXRhKSAtIDB4ODsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNpemUgPSBsZW4gLSAweDg7CisKKyAgICAgICAgICAgICAgaWYgKHNpemUgPCAxKQorICAgICAgICAgICAgICAgIC8qIE5vIHJlYWwgZGF0YSwgc28gYnJlYWsgb3V0ICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgc3dpdGNoIChRVF9GT1VSQ0MgKGF2Y19kYXRhICsgMHg0KSkgeworICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDX2F2Y0M6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogcGFyc2UsIGlmIGZvdW5kICovCisgICAgICAgICAgICAgICAgICBHc3RCdWZmZXIgKmJ1ZjsKKworICAgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImZvdW5kIGF2Y0MgY29kZWNfZGF0YSBpbiBzdHNkIik7CisKKyAgICAgICAgICAgICAgICAgIC8qIEZpcnN0IDQgYnl0ZXMgYXJlIHRoZSBsZW5ndGggb2YgdGhlIGF0b20sIHRoZSBuZXh0IDQgYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAqIGFyZSB0aGUgZm91cmNjLCB0aGUgbmV4dCAxIGJ5dGUgaXMgdGhlIHZlcnNpb24sIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICAqIHN1YnNlcXVlbnQgYnl0ZXMgYXJlIHByb2ZpbGVfdGllcl9sZXZlbCBzdHJ1Y3R1cmUgbGlrZSBkYXRhLiAqLworICAgICAgICAgICAgICAgICAgZ3N0X2NvZGVjX3V0aWxzX2gyNjRfY2Fwc19zZXRfbGV2ZWxfYW5kX3Byb2ZpbGUgKGVudHJ5LT5jYXBzLAorICAgICAgICAgICAgICAgICAgICAgIGF2Y19kYXRhICsgOCArIDEsIHNpemUgLSAxKTsKKyAgICAgICAgICAgICAgICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZSk7CisgICAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgYXZjX2RhdGEgKyAweDgsIHNpemUpOworICAgICAgICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgICAgICAgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIGJ1ZiwgTlVMTCk7CisgICAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0Nfc3RyZjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBHc3RCdWZmZXIgKmJ1ZjsKKworICAgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImZvdW5kIHN0cmYgY29kZWNfZGF0YSBpbiBzdHNkIik7CisKKyAgICAgICAgICAgICAgICAgIC8qIEZpcnN0IDQgYnl0ZXMgYXJlIHRoZSBsZW5ndGggb2YgdGhlIGF0b20sIHRoZSBuZXh0IDQgYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAqIGFyZSB0aGUgZm91cmNjLCBuZXh0IDQwIGJ5dGVzIGFyZSBCSVRNQVBJTkZPSEVBREVSLAorICAgICAgICAgICAgICAgICAgICogbmV4dCAxIGJ5dGUgaXMgdGhlIHZlcnNpb24sIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICAqIHN1YnNlcXVlbnQgYnl0ZXMgYXJlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgbGlrZSBkYXRhLiAqLworCisgICAgICAgICAgICAgICAgICBzaXplIC09IDQwOyAgIC8qIHdlJ2xsIGJlIHNraXBwaW5nIEJJVE1BUElORk9IRUFERVIgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChzaXplID4gMSkgeworICAgICAgICAgICAgICAgICAgICBnc3RfY29kZWNfdXRpbHNfaDI2NF9jYXBzX3NldF9sZXZlbF9hbmRfcHJvZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgKGVudHJ5LT5jYXBzLCBhdmNfZGF0YSArIDggKyA0MCArIDEsIHNpemUgLSAxKTsKKworICAgICAgICAgICAgICAgICAgICBidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHNpemUpOworICAgICAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgYXZjX2RhdGEgKyA4ICsgNDAsIHNpemUpOworICAgICAgICAgICAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChlbnRyeS0+Y2FwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLCBidWYsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDX2J0cnQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZ3VpbnQgYXZnX2JpdHJhdGUsIG1heF9iaXRyYXRlOworCisgICAgICAgICAgICAgICAgICAvKiBidWZmZXJTaXplREIsIG1heEJpdHJhdGUgYW5kIGF2Z0JpdHJhdGUgLSA0IGJ5dGVzIGVhY2ggKi8KKyAgICAgICAgICAgICAgICAgIGlmIChzaXplIDwgMTIpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICBtYXhfYml0cmF0ZSA9IFFUX1VJTlQzMiAoYXZjX2RhdGEgKyAweGMpOworICAgICAgICAgICAgICAgICAgYXZnX2JpdHJhdGUgPSBRVF9VSU5UMzIgKGF2Y19kYXRhICsgMHgxMCk7CisKKyAgICAgICAgICAgICAgICAgIGlmICghbWF4X2JpdHJhdGUgJiYgIWF2Z19iaXRyYXRlKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgLyogU29tZSBtdXhlcnMgc2VlbSB0byBzd2FwIHRoZSBhdmVyYWdlIGFuZCBtYXhpbXVtIGJpdHJhdGVzCisgICAgICAgICAgICAgICAgICAgKiAoSSdtIGxvb2tpbmcgYXQgeW91LCBZb3VUdWJlKSwgc28gd2Ugc3dhcCBmb3Igc2FuaXR5LiAqLworICAgICAgICAgICAgICAgICAgaWYgKG1heF9iaXRyYXRlID4gMCAmJiBtYXhfYml0cmF0ZSA8IGF2Z19iaXRyYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGd1aW50IHRlbXAgPSBhdmdfYml0cmF0ZTsKKworICAgICAgICAgICAgICAgICAgICBhdmdfYml0cmF0ZSA9IG1heF9iaXRyYXRlOworICAgICAgICAgICAgICAgICAgICBtYXhfYml0cmF0ZSA9IHRlbXA7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGlmIChtYXhfYml0cmF0ZSA+IDAgJiYgbWF4X2JpdHJhdGUgPCBHX01BWFVJTlQzMikgeworICAgICAgICAgICAgICAgICAgICBnc3RfdGFnX2xpc3RfYWRkIChzdHJlYW0tPnN0cmVhbV90YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgR1NUX1RBR19NRVJHRV9SRVBMQUNFLCBHU1RfVEFHX01BWElNVU1fQklUUkFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9iaXRyYXRlLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGlmIChhdmdfYml0cmF0ZSA+IDAgJiYgYXZnX2JpdHJhdGUgPCBHX01BWFVJTlQzMikgeworICAgICAgICAgICAgICAgICAgICBnc3RfdGFnX2xpc3RfYWRkIChzdHJlYW0tPnN0cmVhbV90YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgR1NUX1RBR19NRVJHRV9SRVBMQUNFLCBHU1RfVEFHX0JJVFJBVEUsIGF2Z19iaXRyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGxlbiAtPSBzaXplICsgODsKKyAgICAgICAgICAgICAgYXZjX2RhdGEgKz0gc2l6ZSArIDg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEZPVVJDQ19IMjY1OgorICAgICAgICAgIGNhc2UgRk9VUkNDX2h2YzE6CisgICAgICAgICAgY2FzZSBGT1VSQ0NfaGV2MToKKyAgICAgICAgICB7CisgICAgICAgICAgICBnaW50IGxlbiA9IFFUX1VJTlQzMiAoc3RzZF9lbnRyeV9kYXRhKSAtIDB4NTY7CisgICAgICAgICAgICBjb25zdCBndWludDggKmhldmNfZGF0YSA9IHN0c2RfZW50cnlfZGF0YSArIDB4NTY7CisKKyAgICAgICAgICAgIC8qIGZpbmQgaGV2YyAqLworICAgICAgICAgICAgd2hpbGUgKGxlbiA+PSAweDgpIHsKKyAgICAgICAgICAgICAgZ2ludCBzaXplOworCisgICAgICAgICAgICAgIGlmIChRVF9VSU5UMzIgKGhldmNfZGF0YSkgPD0gbGVuKQorICAgICAgICAgICAgICAgIHNpemUgPSBRVF9VSU5UMzIgKGhldmNfZGF0YSkgLSAweDg7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzaXplID0gbGVuIC0gMHg4OworCisgICAgICAgICAgICAgIGlmIChzaXplIDwgMSkKKyAgICAgICAgICAgICAgICAvKiBObyByZWFsIGRhdGEsIHNvIGJyZWFrIG91dCAqLworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIHN3aXRjaCAoUVRfRk9VUkNDIChoZXZjX2RhdGEgKyAweDQpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0NfaHZjQzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBwYXJzZSwgaWYgZm91bmQgKi8KKyAgICAgICAgICAgICAgICAgIEdzdEJ1ZmZlciAqYnVmOworCisgICAgICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZm91bmQgaHZjQyBjb2RlY19kYXRhIGluIHN0c2QiKTsKKworICAgICAgICAgICAgICAgICAgLyogRmlyc3QgNCBieXRlcyBhcmUgdGhlIGxlbmd0aCBvZiB0aGUgYXRvbSwgdGhlIG5leHQgNCBieXRlcworICAgICAgICAgICAgICAgICAgICogYXJlIHRoZSBmb3VyY2MsIHRoZSBuZXh0IDEgYnl0ZSBpcyB0aGUgdmVyc2lvbiwgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICogc3Vic2VxdWVudCBieXRlcyBhcmUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBsaWtlIGRhdGEuICovCisgICAgICAgICAgICAgICAgICBnc3RfY29kZWNfdXRpbHNfaDI2NV9jYXBzX3NldF9sZXZlbF90aWVyX2FuZF9wcm9maWxlCisgICAgICAgICAgICAgICAgICAgICAgKGVudHJ5LT5jYXBzLCBoZXZjX2RhdGEgKyA4ICsgMSwgc2l6ZSAtIDEpOworCisgICAgICAgICAgICAgICAgICBidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHNpemUpOworICAgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsIGhldmNfZGF0YSArIDB4OCwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChlbnRyeS0+Y2FwcywKKyAgICAgICAgICAgICAgICAgICAgICAiY29kZWNfZGF0YSIsIEdTVF9UWVBFX0JVRkZFUiwgYnVmLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGxlbiAtPSBzaXplICsgODsKKyAgICAgICAgICAgICAgaGV2Y19kYXRhICs9IHNpemUgKyA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgRk9VUkNDX21wNHY6CisgICAgICAgICAgY2FzZSBGT1VSQ0NfTVA0VjoKKyAgICAgICAgICBjYXNlIEZPVVJDQ19mbXA0OgorICAgICAgICAgIGNhc2UgRk9VUkNDX0ZNUDQ6CisgICAgICAgICAgY2FzZSBGT1VSQ0NfeHZpZDoKKyAgICAgICAgICBjYXNlIEZPVVJDQ19YVklEOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIEdOb2RlICpnbGJsOworCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZm91bmQgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKTsKKworICAgICAgICAgICAgLyogY29kZWMgZGF0YSBtaWdodCBiZSBpbiBnbGJsIGV4dGVuc2lvbiBhdG9tICovCisgICAgICAgICAgICBnbGJsID0gbXA0diA/CisgICAgICAgICAgICAgICAgcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChtcDR2LCBGT1VSQ0NfZ2xibCkgOiBOVUxMOworICAgICAgICAgICAgaWYgKGdsYmwpIHsKKyAgICAgICAgICAgICAgZ3VpbnQ4ICpkYXRhOworICAgICAgICAgICAgICBHc3RCdWZmZXIgKmJ1ZjsKKyAgICAgICAgICAgICAgZ2ludCBsZW47CisKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImZvdW5kIGdsYmwgZGF0YSBpbiBzdHNkIik7CisgICAgICAgICAgICAgIGRhdGEgPSBnbGJsLT5kYXRhOworICAgICAgICAgICAgICBsZW4gPSBRVF9VSU5UMzIgKGRhdGEpOworICAgICAgICAgICAgICBpZiAobGVuID4gMHg4KSB7CisgICAgICAgICAgICAgICAgbGVuIC09IDB4ODsKKyAgICAgICAgICAgICAgICBidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGxlbik7CisgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsIGRhdGEgKyA4LCBsZW4pOworICAgICAgICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGVudHJ5LT5jYXBzLAorICAgICAgICAgICAgICAgICAgICAiY29kZWNfZGF0YSIsIEdTVF9UWVBFX0JVRkZFUiwgYnVmLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBGT1VSQ0NfbWpwMjoKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBzZWUgYW5uZXggSSBvZiB0aGUganBlZzIwMDAgc3BlYyAqLworICAgICAgICAgICAgR05vZGUgKmpwMmgsICppaGRyLCAqY29sciwgKm1qcDIsICpmaWVsZCwgKnByZWZpeCwgKmNtYXAsICpjZGVmOworICAgICAgICAgICAgY29uc3QgZ3VpbnQ4ICpkYXRhOworICAgICAgICAgICAgY29uc3QgZ2NoYXIgKmNvbG9yc3BhY2UgPSBOVUxMOworICAgICAgICAgICAgZ2ludCBuY29tcCA9IDA7CisgICAgICAgICAgICBndWludDMyIG5jb21wX21hcCA9IDA7CisgICAgICAgICAgICBnaW50MzIgKmNvbXBfbWFwID0gTlVMTDsKKyAgICAgICAgICAgIGd1aW50MzIgbmNoYW5fZGVmID0gMDsKKyAgICAgICAgICAgIGdpbnQzMiAqY2hhbl9kZWYgPSBOVUxMOworCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZm91bmQgbWpwMiIpOworICAgICAgICAgICAgLyogc29tZSByZXF1aXJlZCBhdG9tcyAqLworICAgICAgICAgICAgbWpwMiA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfaW5kZXggKHN0c2QsIHN0c2RfaW5kZXgpOworICAgICAgICAgICAgaWYgKCFtanAyKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGpwMmggPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKG1qcDIsIEZPVVJDQ19qcDJoKTsKKyAgICAgICAgICAgIGlmICghanAyaCkKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb21wb25lbnRzOyByZWR1bmRhbnQgd2l0aCBpbmZvIGluIGNvZGVzdHJlYW0sIGJ1dCB1c2VmdWwKKyAgICAgICAgICAgICAgIHRvIGEgbXV4ZXIgKi8KKyAgICAgICAgICAgIGloZHIgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKGpwMmgsIEZPVVJDQ19paGRyKTsKKyAgICAgICAgICAgIGlmICghaWhkciB8fCBRVF9VSU5UMzIgKGloZHItPmRhdGEpICE9IDIyKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIG5jb21wID0gUVRfVUlOVDE2ICgoKGd1aW50OCAqKSBpaGRyLT5kYXRhKSArIDE2KTsKKworICAgICAgICAgICAgY29sciA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAoanAyaCwgRk9VUkNDX2NvbHIpOworICAgICAgICAgICAgaWYgKCFjb2xyKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJmb3VuZCBjb2xyIik7CisgICAgICAgICAgICAvKiBleHRyYWN0IGNvbG91ciBzcGFjZSBpbmZvICovCisgICAgICAgICAgICBpZiAoUVRfVUlOVDggKChndWludDggKikgY29sci0+ZGF0YSArIDgpID09IDEpIHsKKyAgICAgICAgICAgICAgc3dpdGNoIChRVF9VSU5UMzIgKChndWludDggKikgY29sci0+ZGF0YSArIDExKSkgeworICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICBjb2xvcnNwYWNlID0gInNSR0IiOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgIGNvbG9yc3BhY2UgPSAiR1JBWSI7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgY29sb3JzcGFjZSA9ICJzWVVWIjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICBjb2xvcnNwYWNlID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWNvbG9yc3BhY2UpCisgICAgICAgICAgICAgIC8qIGNvbHIgaXMgcmVxdWlyZWQsIGFuZCBvbmx5IHZhbHVlcyAxNiwgMTcsIGFuZCAxOCBhcmUgc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgICBzbyBlcnJvciBpZiB3ZSBoYXZlIG5vIGNvbG9yc3BhY2UgKi8KKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIGV4dHJhY3QgY29tcG9uZW50IG1hcHBpbmcgKi8KKyAgICAgICAgICAgIGNtYXAgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKGpwMmgsIEZPVVJDQ19jbWFwKTsKKyAgICAgICAgICAgIGlmIChjbWFwKSB7CisgICAgICAgICAgICAgIGd1aW50MzIgY21hcF9sZW4gPSAwOworICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgY21hcF9sZW4gPSBRVF9VSU5UMzIgKGNtYXAtPmRhdGEpOworICAgICAgICAgICAgICBpZiAoY21hcF9sZW4gPj0gOCkgeworICAgICAgICAgICAgICAgIC8qIG5vcm1hbCBib3gsIHN1YnRyYWN0IG9mZiBoZWFkZXIgKi8KKyAgICAgICAgICAgICAgICBjbWFwX2xlbiAtPSA4OworICAgICAgICAgICAgICAgIC8qIGNtYXA6IHsgdTE2IGNtcDsgdTggbXR5cDsgdTggcGNvbDsgfSogKi8KKyAgICAgICAgICAgICAgICBpZiAoY21hcF9sZW4gJSA0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgIG5jb21wX21hcCA9IChjbWFwX2xlbiAvIDQpOworICAgICAgICAgICAgICAgICAgY29tcF9tYXAgPSBnX25ldzAgKGdpbnQzMiwgbmNvbXBfbWFwKTsKKyAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuY29tcF9tYXA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBndWludDE2IGNtcDsKKyAgICAgICAgICAgICAgICAgICAgZ3VpbnQ4IG10eXAsIHBjb2w7CisgICAgICAgICAgICAgICAgICAgIGNtcCA9IFFUX1VJTlQxNiAoKChndWludDggKikgY21hcC0+ZGF0YSkgKyA4ICsgaSAqIDQpOworICAgICAgICAgICAgICAgICAgICBtdHlwID0gUVRfVUlOVDggKCgoZ3VpbnQ4ICopIGNtYXAtPmRhdGEpICsgOCArIGkgKiA0ICsgMik7CisgICAgICAgICAgICAgICAgICAgIHBjb2wgPSBRVF9VSU5UOCAoKChndWludDggKikgY21hcC0+ZGF0YSkgKyA4ICsgaSAqIDQgKyAzKTsKKyAgICAgICAgICAgICAgICAgICAgY29tcF9tYXBbaV0gPSAobXR5cCA8PCAyNCkgfCAocGNvbCA8PCAxNikgfCBjbXA7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBleHRyYWN0IGNoYW5uZWwgZGVmaW5pdGlvbnMgKi8KKyAgICAgICAgICAgIGNkZWYgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKGpwMmgsIEZPVVJDQ19jZGVmKTsKKyAgICAgICAgICAgIGlmIChjZGVmKSB7CisgICAgICAgICAgICAgIGd1aW50MzIgY2RlZl9sZW4gPSAwOworICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgY2RlZl9sZW4gPSBRVF9VSU5UMzIgKGNkZWYtPmRhdGEpOworICAgICAgICAgICAgICBpZiAoY2RlZl9sZW4gPj0gMTApIHsKKyAgICAgICAgICAgICAgICAvKiBub3JtYWwgYm94LCBzdWJ0cmFjdCBvZmYgaGVhZGVyIGFuZCBsZW4gKi8KKyAgICAgICAgICAgICAgICBjZGVmX2xlbiAtPSAxMDsKKyAgICAgICAgICAgICAgICAvKiBjZGVmOiB1MTYgbjsgeyB1MTYgY247IHUxNiB0eXA7IHUxNiBhc29jOyB9KiAqLworICAgICAgICAgICAgICAgIGlmIChjZGVmX2xlbiAlIDYgPT0gMCkgeworICAgICAgICAgICAgICAgICAgbmNoYW5fZGVmID0gKGNkZWZfbGVuIC8gNik7CisgICAgICAgICAgICAgICAgICBjaGFuX2RlZiA9IGdfbmV3MCAoZ2ludDMyLCBuY2hhbl9kZWYpOworICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5jaGFuX2RlZjsgaSsrKQorICAgICAgICAgICAgICAgICAgICBjaGFuX2RlZltpXSA9IC0xOworICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5jaGFuX2RlZjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGd1aW50MTYgY24sIHR5cCwgYXNvYzsKKyAgICAgICAgICAgICAgICAgICAgY24gPSBRVF9VSU5UMTYgKCgoZ3VpbnQ4ICopIGNkZWYtPmRhdGEpICsgMTAgKyBpICogNik7CisgICAgICAgICAgICAgICAgICAgIHR5cCA9IFFUX1VJTlQxNiAoKChndWludDggKikgY2RlZi0+ZGF0YSkgKyAxMCArIGkgKiA2ICsgMik7CisgICAgICAgICAgICAgICAgICAgIGFzb2MgPSBRVF9VSU5UMTYgKCgoZ3VpbnQ4ICopIGNkZWYtPmRhdGEpICsgMTAgKyBpICogNiArIDQpOworICAgICAgICAgICAgICAgICAgICBpZiAoY24gPCBuY2hhbl9kZWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuX2RlZltjbl0gPSBhc29jOworICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbl9kZWZbY25dID0gMDsgICAgIC8qIGFscGhhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbl9kZWZbY25dID0gLXR5cDsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgIm51bS1jb21wb25lbnRzIiwgR19UWVBFX0lOVCwgbmNvbXAsIE5VTEwpOworICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgImNvbG9yc3BhY2UiLCBHX1RZUEVfU1RSSU5HLCBjb2xvcnNwYWNlLCBOVUxMKTsKKworICAgICAgICAgICAgaWYgKGNvbXBfbWFwKSB7CisgICAgICAgICAgICAgIEdWYWx1ZSBhcnIgPSB7IDAsIH07CisgICAgICAgICAgICAgIEdWYWx1ZSBlbHQgPSB7IDAsIH07CisgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZhcnIsIEdTVF9UWVBFX0FSUkFZKTsKKyAgICAgICAgICAgICAgZ192YWx1ZV9pbml0ICgmZWx0LCBHX1RZUEVfSU5UKTsKKyAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5jb21wX21hcDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZ192YWx1ZV9zZXRfaW50ICgmZWx0LCBjb21wX21hcFtpXSk7CisgICAgICAgICAgICAgICAgZ3N0X3ZhbHVlX2FycmF5X2FwcGVuZF92YWx1ZSAoJmFyciwgJmVsdCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGVudHJ5LT5jYXBzLCAwKSwKKyAgICAgICAgICAgICAgICAgICJjb21wb25lbnQtbWFwIiwgJmFycik7CisgICAgICAgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZlbHQpOworICAgICAgICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmYXJyKTsKKyAgICAgICAgICAgICAgZ19mcmVlIChjb21wX21hcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaGFuX2RlZikgeworICAgICAgICAgICAgICBHVmFsdWUgYXJyID0geyAwLCB9OworICAgICAgICAgICAgICBHVmFsdWUgZWx0ID0geyAwLCB9OworICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgZ192YWx1ZV9pbml0ICgmYXJyLCBHU1RfVFlQRV9BUlJBWSk7CisgICAgICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJmVsdCwgR19UWVBFX0lOVCk7CisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuY2hhbl9kZWY7IGkrKykgeworICAgICAgICAgICAgICAgIGdfdmFsdWVfc2V0X2ludCAoJmVsdCwgY2hhbl9kZWZbaV0pOworICAgICAgICAgICAgICAgIGdzdF92YWx1ZV9hcnJheV9hcHBlbmRfdmFsdWUgKCZhcnIsICZlbHQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChlbnRyeS0+Y2FwcywgMCksCisgICAgICAgICAgICAgICAgICAiY2hhbm5lbC1kZWZpbml0aW9ucyIsICZhcnIpOworICAgICAgICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmZWx0KTsKKyAgICAgICAgICAgICAgZ192YWx1ZV91bnNldCAoJmFycik7CisgICAgICAgICAgICAgIGdfZnJlZSAoY2hhbl9kZWYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBzb21lIG9wdGlvbmFsIGF0b21zICovCisgICAgICAgICAgICBmaWVsZCA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAobWpwMiwgRk9VUkNDX2ZpZWwpOworICAgICAgICAgICAgcHJlZml4ID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChtanAyLCBGT1VSQ0NfanAyeCk7CisKKyAgICAgICAgICAgIC8qIGluZGljYXRlIHBvc3NpYmxlIGZpZWxkcyBpbiBjYXBzICovCisgICAgICAgICAgICBpZiAoZmllbGQpIHsKKyAgICAgICAgICAgICAgZGF0YSA9IChndWludDggKikgZmllbGQtPmRhdGEgKyA4OworICAgICAgICAgICAgICBpZiAoKmRhdGEgIT0gMSkKKyAgICAgICAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChlbnRyeS0+Y2FwcywgImZpZWxkcyIsIEdfVFlQRV9JTlQsCisgICAgICAgICAgICAgICAgICAgIChnaW50KSAqIGRhdGEsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogYWRkIGNvZGVjX2RhdGEgaWYgcHJvdmlkZWQgKi8KKyAgICAgICAgICAgIGlmIChwcmVmaXgpIHsKKyAgICAgICAgICAgICAgR3N0QnVmZmVyICpidWY7CisgICAgICAgICAgICAgIGdpbnQgbGVuOworCisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJmb3VuZCBwcmVmaXggZGF0YSBpbiBzdHNkIik7CisgICAgICAgICAgICAgIGRhdGEgPSBwcmVmaXgtPmRhdGE7CisgICAgICAgICAgICAgIGxlbiA9IFFUX1VJTlQzMiAoZGF0YSk7CisgICAgICAgICAgICAgIGlmIChsZW4gPiAweDgpIHsKKyAgICAgICAgICAgICAgICBsZW4gLT0gMHg4OworICAgICAgICAgICAgICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobGVuKTsKKyAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgZGF0YSArIDgsIGxlbik7CisgICAgICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgICAgICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLCBidWYsIE5VTEwpOworICAgICAgICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEZPVVJDQ19TVlEzOgorICAgICAgICAgIGNhc2UgRk9VUkNDX1ZQMzE6CisgICAgICAgICAgeworICAgICAgICAgICAgR3N0QnVmZmVyICpidWY7CisgICAgICAgICAgICBHc3RCdWZmZXIgKnNlcWggPSBOVUxMOworICAgICAgICAgICAgY29uc3QgZ3VpbnQ4ICpnYW1tYV9kYXRhID0gTlVMTDsKKyAgICAgICAgICAgIGdpbnQgbGVuID0gUVRfVUlOVDMyIChzdHNkX2RhdGEpOyAgIC8qIEZJWE1FIHJldmlldyAtIHdoeSBwdXQgdGhlIHdob2xlIHN0c2QgaW4gY29kZWMgZGF0YT8gKi8KKworICAgICAgICAgICAgcXRkZW11eF9wYXJzZV9zdnEzX3N0c2RfZGF0YSAocXRkZW11eCwgc3RzZF9lbnRyeV9kYXRhLCAmZ2FtbWFfZGF0YSwKKyAgICAgICAgICAgICAgICAmc2VxaCk7CisgICAgICAgICAgICBpZiAoZ2FtbWFfZGF0YSkgeworICAgICAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChlbnRyeS0+Y2FwcywgImFwcGxpZWQtZ2FtbWEiLCBHX1RZUEVfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgUVRfRlAzMiAoZ2FtbWFfZGF0YSksIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlcWgpIHsKKyAgICAgICAgICAgICAgLyogc29ycnkgZm9yIHRoZSBiYWQgbmFtZSwgYnV0IHdlIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzLCBvdGhlcgorICAgICAgICAgICAgICAgKiB0aGFuIGl0cyBvd24gZm91cmNjICovCisgICAgICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGVudHJ5LT5jYXBzLCAic2VxaCIsIEdTVF9UWVBFX0JVRkZFUiwgc2VxaCwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChzZXFoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImZvdW5kIGNvZGVjX2RhdGEgaW4gc3RzZCIpOworICAgICAgICAgICAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChsZW4pOworICAgICAgICAgICAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsIHN0c2RfZGF0YSwgbGVuKTsKKyAgICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGVudHJ5LT5jYXBzLAorICAgICAgICAgICAgICAgICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLCBidWYsIE5VTEwpOworICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEZPVVJDQ19qcGVnOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9zdGFuZGFyZHMvcXRmZi0yMDAxLnBkZiwKKyAgICAgICAgICAgICAqIHBhZ2UgOTIsICJWaWRlbyBTYW1wbGUgRGVzY3JpcHRpb24iLCB1bmRlciB0YWJsZSAzLjEgKi8KKyAgICAgICAgICAgIEdzdEJ5dGVSZWFkZXIgYnI7CisKKyAgICAgICAgICAgIGNvbnN0IGdpbnQgY29tcHJlc3Nvcl9vZmZzZXQgPQorICAgICAgICAgICAgICAgIDE2ICsgNCArIDQgKiAzICsgMiAqIDIgKyAyICogNCArIDQgKyAyOworICAgICAgICAgICAgY29uc3QgZ2ludCBtaW5fc2l6ZSA9IGNvbXByZXNzb3Jfb2Zmc2V0ICsgMzIgKyAyICsgMjsKKyAgICAgICAgICAgIEdOb2RlICpqcGVnOworICAgICAgICAgICAgZ3VpbnQzMiBsZW47CisgICAgICAgICAgICBndWludDE2IGNvbG9yX3RhYmxlX2lkID0gMDsKKyAgICAgICAgICAgIGdib29sZWFuIG9rOworCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZm91bmQganBlZyIpOworCisgICAgICAgICAgICAvKiByZWNvdmVyIGluZm9ybWF0aW9uIG9uIGludGVybGFjZWQvcHJvZ3Jlc3NpdmUgKi8KKyAgICAgICAgICAgIGpwZWcgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHN0c2QsIEZPVVJDQ19qcGVnKTsKKyAgICAgICAgICAgIGlmICghanBlZykKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGxlbiA9IFFUX1VJTlQzMiAoanBlZy0+ZGF0YSk7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiRm91bmQganBlZzogbGVuICV1LCBuZWVkICVkIiwgbGVuLAorICAgICAgICAgICAgICAgIG1pbl9zaXplKTsKKyAgICAgICAgICAgIGlmIChsZW4gPj0gbWluX3NpemUpIHsKKyAgICAgICAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZiciwganBlZy0+ZGF0YSwgbGVuKTsKKworICAgICAgICAgICAgICBnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJmJyLCBjb21wcmVzc29yX29mZnNldCArIDMyICsgMik7CisgICAgICAgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2xlICgmYnIsICZjb2xvcl90YWJsZV9pZCk7CisgICAgICAgICAgICAgIGlmIChjb2xvcl90YWJsZV9pZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgLyogdGhlIHNwZWMgc2F5cyB0aGVyZSBjYW4gYmUgY29uY2F0ZW5hdGVkIGNodW5rcyBpbiB0aGUgZGF0YSwgYW5kIHdlIHdhbnQKKyAgICAgICAgICAgICAgICAgKiB0byBmaW5kIG9uZSBjYWxsZWQgZmllbGQuIFdhbGsgdGhyb3VnaCB0aGVtLiAqLworICAgICAgICAgICAgICAgIGdpbnQgb2Zmc2V0ID0gbWluX3NpemU7CisgICAgICAgICAgICAgICAgd2hpbGUgKG9mZnNldCArIDggPCBsZW4pIHsKKyAgICAgICAgICAgICAgICAgIGd1aW50MzIgc2l6ZSA9IDAsIHRhZzsKKyAgICAgICAgICAgICAgICAgIG9rID0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKCZiciwgJnNpemUpOworICAgICAgICAgICAgICAgICAgb2sgJj0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKCZiciwgJnRhZyk7CisgICAgICAgICAgICAgICAgICBpZiAoIW9rIHx8IHNpemUgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gd2FsayBvcHRpb25hbCBjaHVuayBsaXN0Iik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICAgICAgICAgICAiRm91bmQgb3B0aW9uYWwgJTQuNHMgY2h1bmssIHNpemUgJXUiLAorICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopICZ0YWcsIHNpemUpOworICAgICAgICAgICAgICAgICAgaWYgKHRhZyA9PSBGT1VSQ0NfZmllbCkgeworICAgICAgICAgICAgICAgICAgICBndWludDggbl9maWVsZHMgPSAwLCBvcmRlcmluZyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZiciwgJm5fZmllbGRzKTsKKyAgICAgICAgICAgICAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAoJmJyLCAmb3JkZXJpbmcpOworICAgICAgICAgICAgICAgICAgICBpZiAobl9maWVsZHMgPT0gMSB8fCBuX2ZpZWxkcyA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvdW5kIGZpZWwgdGFnIHdpdGggJXUgZmllbGRzLCBvcmRlcmluZyAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5fZmllbGRzLCBvcmRlcmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKG5fZmllbGRzID09IDIpCisgICAgICAgICAgICAgICAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmxhY2UtbW9kZSIsIEdfVFlQRV9TVFJJTkcsICJpbnRlcmxlYXZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRm91bmQgZmllbCB0YWcgd2l0aCBpbnZhbGlkIGZpZWxkcyAoJXUpIiwgbl9maWVsZHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICAgICAgICAgIkNvbG9yIHRhYmxlIElEIGlzIDAsIG5vdCB0cnlpbmcgdG8gZ2V0IGludGVybGFjZWRuZXNzIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICAgICAgICJMZW5ndGggb2YganBlZyBjaHVuayBpcyB0b28gc21hbGwsIG5vdCB0cnlpbmcgdG8gZ2V0IGludGVybGFjZWRuZXNzIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEZPVVJDQ19ybGVfOgorICAgICAgICAgIGNhc2UgRk9VUkNDX1dSTEU6CisgICAgICAgICAgeworICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgImRlcHRoIiwgR19UWVBFX0lOVCwgUVRfVUlOVDE2IChzdHNkX2VudHJ5X2RhdGEgKyBvZmZzZXQgKyA2NiksCisgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBGT1VSQ0NfWGlUaDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBHTm9kZSAqeGl0aCwgKnhkeHQ7CisKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJmb3VuZCBYaVRoIik7CisgICAgICAgICAgICB4aXRoID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV9pbmRleCAoc3RzZCwgc3RzZF9pbmRleCk7CisgICAgICAgICAgICBpZiAoIXhpdGgpCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB4ZHh0ID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlICh4aXRoLCBGT1VSQ0NfWGR4VCk7CisgICAgICAgICAgICBpZiAoIXhkeHQpCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZm91bmQgWGR4VCBub2RlIik7CisgICAgICAgICAgICAvKiBjb2xsZWN0IHRoZSBoZWFkZXJzIGFuZCBzdG9yZSB0aGVtIGluIGEgc3RyZWFtIGxpc3Qgc28gdGhhdCB3ZSBjYW4KKyAgICAgICAgICAgICAqIHNlbmQgdGhlbSBvdXQgZmlyc3QgKi8KKyAgICAgICAgICAgIHF0ZGVtdXhfcGFyc2VfdGhlb3JhX2V4dGVuc2lvbiAocXRkZW11eCwgc3RyZWFtLCB4ZHh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEZPVVJDQ19vdmMxOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIEdOb2RlICpvdmMxOworICAgICAgICAgICAgZ3VpbnQ4ICpvdmMxX2RhdGE7CisgICAgICAgICAgICBndWludCBvdmMxX2xlbjsKKyAgICAgICAgICAgIEdzdEJ1ZmZlciAqYnVmOworCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicGFyc2Ugb3ZjMSBoZWFkZXIiKTsKKyAgICAgICAgICAgIG92YzEgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X2luZGV4IChzdHNkLCBzdHNkX2luZGV4KTsKKyAgICAgICAgICAgIGlmICghb3ZjMSkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBvdmMxX2RhdGEgPSBvdmMxLT5kYXRhOworICAgICAgICAgICAgb3ZjMV9sZW4gPSBRVF9VSU5UMzIgKG92YzFfZGF0YSk7CisgICAgICAgICAgICBpZiAob3ZjMV9sZW4gPD0gMTk4KSB7CisgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIlRvbyBzbWFsbCBvdmMxIGhlYWRlciwgc2tpcHBpbmciKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG92YzFfbGVuIC0gMTk4KTsKKyAgICAgICAgICAgIGdzdF9idWZmZXJfZmlsbCAoYnVmLCAwLCBvdmMxX2RhdGEgKyAxOTgsIG92YzFfbGVuIC0gMTk4KTsKKyAgICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGVudHJ5LT5jYXBzLAorICAgICAgICAgICAgICAgICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLCBidWYsIE5VTEwpOworICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEZPVVJDQ192Y18xOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGdpbnQgbGVuID0gUVRfVUlOVDMyIChzdHNkX2VudHJ5X2RhdGEpIC0gMHg1NjsKKyAgICAgICAgICAgIGNvbnN0IGd1aW50OCAqdmMxX2RhdGEgPSBzdHNkX2VudHJ5X2RhdGEgKyAweDU2OworCisgICAgICAgICAgICAvKiBmaW5kIGR2YzEgKi8KKyAgICAgICAgICAgIHdoaWxlIChsZW4gPj0gOCkgeworICAgICAgICAgICAgICBnaW50IHNpemU7CisKKyAgICAgICAgICAgICAgaWYgKFFUX1VJTlQzMiAodmMxX2RhdGEpIDw9IGxlbikKKyAgICAgICAgICAgICAgICBzaXplID0gUVRfVUlOVDMyICh2YzFfZGF0YSkgLSA4OworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2l6ZSA9IGxlbiAtIDg7CisKKyAgICAgICAgICAgICAgaWYgKHNpemUgPCAxKQorICAgICAgICAgICAgICAgIC8qIE5vIHJlYWwgZGF0YSwgc28gYnJlYWsgb3V0ICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgc3dpdGNoIChRVF9GT1VSQ0MgKHZjMV9kYXRhICsgMHg0KSkgeworICAgICAgICAgICAgICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnZCcsICd2JywgJ2MnLCAnMScpOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIEdzdEJ1ZmZlciAqYnVmOworCisgICAgICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZm91bmQgZHZjMSBjb2RlY19kYXRhIGluIHN0c2QiKTsKKyAgICAgICAgICAgICAgICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZSk7CisgICAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgdmMxX2RhdGEgKyA4LCBzaXplKTsKKyAgICAgICAgICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGVudHJ5LT5jYXBzLAorICAgICAgICAgICAgICAgICAgICAgICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLCBidWYsIE5VTEwpOworICAgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbGVuIC09IHNpemUgKyA4OworICAgICAgICAgICAgICB2YzFfZGF0YSArPSBzaXplICsgODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgR1NUX0lORk9fT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICJ0eXBlICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYyksIGVudHJ5LT5jYXBzKTsKKworICAgIH0gZWxzZSBpZiAoc3RyZWFtLT5zdWJ0eXBlID09IEZPVVJDQ19zb3VuKSB7CisgICAgICBHTm9kZSAqd2F2ZTsKKyAgICAgIGludCB2ZXJzaW9uLCBzYW1wbGVzaXplOworICAgICAgZ3VpbnQxNiBjb21wcmVzc2lvbl9pZDsKKyAgICAgIGdib29sZWFuIGFtcndiID0gRkFMU0U7CisKKyAgICAgIG9mZnNldCA9IDE2OworICAgICAgLyogc2FtcGxlIGRlc2NyaXB0aW9uIGVudHJ5ICgxNikgKyBzb3VuZCBzYW1wbGUgZGVzY3JpcHRpb24gdjAgKDIwKSAqLworICAgICAgaWYgKGxlbiA8IDM2KQorICAgICAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworICAgICAgdmVyc2lvbiA9IFFUX1VJTlQzMiAoc3RzZF9lbnRyeV9kYXRhICsgb2Zmc2V0KTsKKyAgICAgIGVudHJ5LT5uX2NoYW5uZWxzID0gUVRfVUlOVDE2IChzdHNkX2VudHJ5X2RhdGEgKyBvZmZzZXQgKyA4KTsKKyAgICAgIHNhbXBsZXNpemUgPSBRVF9VSU5UMTYgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDEwKTsKKyAgICAgIGNvbXByZXNzaW9uX2lkID0gUVRfVUlOVDE2IChzdHNkX2VudHJ5X2RhdGEgKyBvZmZzZXQgKyAxMik7CisgICAgICBlbnRyeS0+cmF0ZSA9IFFUX0ZQMzIgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDE2KTsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJ2ZXJzaW9uL3JldjogICAgICAlMDh4IiwgdmVyc2lvbik7CisgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInZlbmRvcjogICAgICAgICAgICUwOHgiLAorICAgICAgICAgIFFUX1VJTlQzMiAoc3RzZF9lbnRyeV9kYXRhICsgb2Zmc2V0ICsgNCkpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJuX2NoYW5uZWxzOiAgICAgICAlZCIsIGVudHJ5LT5uX2NoYW5uZWxzKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAic2FtcGxlX3NpemU6ICAgICAgJWQiLCBzYW1wbGVzaXplKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiY29tcHJlc3Npb25faWQ6ICAgJWQiLCBjb21wcmVzc2lvbl9pZCk7CisgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInBhY2tldCBzaXplOiAgICAgICVkIiwKKyAgICAgICAgICBRVF9VSU5UMTYgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDE0KSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInNhbXBsZSByYXRlOiAgICAgICVnIiwgZW50cnktPnJhdGUpOworCisgICAgICBpZiAoY29tcHJlc3Npb25faWQgPT0gMHhmZmZlKQorICAgICAgICBlbnRyeS0+c2FtcGxlZCA9IFRSVUU7CisKKyAgICAgIC8qIGZpcnN0IGFzc3VtZSB1bmNvbXByZXNzZWQgYXVkaW8gKi8KKyAgICAgIGVudHJ5LT5ieXRlc19wZXJfc2FtcGxlID0gc2FtcGxlc2l6ZSAvIDg7CisgICAgICBlbnRyeS0+c2FtcGxlc19wZXJfZnJhbWUgPSBlbnRyeS0+bl9jaGFubmVsczsKKyAgICAgIGVudHJ5LT5ieXRlc19wZXJfZnJhbWUgPSBlbnRyeS0+bl9jaGFubmVscyAqIGVudHJ5LT5ieXRlc19wZXJfc2FtcGxlOworICAgICAgZW50cnktPnNhbXBsZXNfcGVyX3BhY2tldCA9IGVudHJ5LT5zYW1wbGVzX3Blcl9mcmFtZTsKKyAgICAgIGVudHJ5LT5ieXRlc19wZXJfcGFja2V0ID0gZW50cnktPmJ5dGVzX3Blcl9zYW1wbGU7CisKKyAgICAgIG9mZnNldCA9IDM2OworICAgICAgc3dpdGNoIChmb3VyY2MpIHsKKyAgICAgICAgICAvKiBZZXMsIHRoZXNlIGhhdmUgdG8gYmUgaGFyZC1jb2RlZCAqLworICAgICAgICBjYXNlIEZPVVJDQ19NQUM2OgorICAgICAgICB7CisgICAgICAgICAgZW50cnktPnNhbXBsZXNfcGVyX3BhY2tldCA9IDY7CisgICAgICAgICAgZW50cnktPmJ5dGVzX3Blcl9wYWNrZXQgPSAxOworICAgICAgICAgIGVudHJ5LT5ieXRlc19wZXJfZnJhbWUgPSAxICogZW50cnktPm5fY2hhbm5lbHM7CisgICAgICAgICAgZW50cnktPmJ5dGVzX3Blcl9zYW1wbGUgPSAxOworICAgICAgICAgIGVudHJ5LT5zYW1wbGVzX3Blcl9mcmFtZSA9IDYgKiBlbnRyeS0+bl9jaGFubmVsczsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQ19NQUMzOgorICAgICAgICB7CisgICAgICAgICAgZW50cnktPnNhbXBsZXNfcGVyX3BhY2tldCA9IDM7CisgICAgICAgICAgZW50cnktPmJ5dGVzX3Blcl9wYWNrZXQgPSAxOworICAgICAgICAgIGVudHJ5LT5ieXRlc19wZXJfZnJhbWUgPSAxICogZW50cnktPm5fY2hhbm5lbHM7CisgICAgICAgICAgZW50cnktPmJ5dGVzX3Blcl9zYW1wbGUgPSAxOworICAgICAgICAgIGVudHJ5LT5zYW1wbGVzX3Blcl9mcmFtZSA9IDMgKiBlbnRyeS0+bl9jaGFubmVsczsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQ19pbWE0OgorICAgICAgICB7CisgICAgICAgICAgZW50cnktPnNhbXBsZXNfcGVyX3BhY2tldCA9IDY0OworICAgICAgICAgIGVudHJ5LT5ieXRlc19wZXJfcGFja2V0ID0gMzQ7CisgICAgICAgICAgZW50cnktPmJ5dGVzX3Blcl9mcmFtZSA9IDM0ICogZW50cnktPm5fY2hhbm5lbHM7CisgICAgICAgICAgZW50cnktPmJ5dGVzX3Blcl9zYW1wbGUgPSAyOworICAgICAgICAgIGVudHJ5LT5zYW1wbGVzX3Blcl9mcmFtZSA9IDY0ICogZW50cnktPm5fY2hhbm5lbHM7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0NfdWxhdzoKKyAgICAgICAgY2FzZSBGT1VSQ0NfYWxhdzoKKyAgICAgICAgeworICAgICAgICAgIGVudHJ5LT5zYW1wbGVzX3Blcl9wYWNrZXQgPSAxOworICAgICAgICAgIGVudHJ5LT5ieXRlc19wZXJfcGFja2V0ID0gMTsKKyAgICAgICAgICBlbnRyeS0+Ynl0ZXNfcGVyX2ZyYW1lID0gMSAqIGVudHJ5LT5uX2NoYW5uZWxzOworICAgICAgICAgIGVudHJ5LT5ieXRlc19wZXJfc2FtcGxlID0gMTsKKyAgICAgICAgICBlbnRyeS0+c2FtcGxlc19wZXJfZnJhbWUgPSAxICogZW50cnktPm5fY2hhbm5lbHM7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0NfYWdzbToKKyAgICAgICAgeworICAgICAgICAgIGVudHJ5LT5zYW1wbGVzX3Blcl9wYWNrZXQgPSAxNjA7CisgICAgICAgICAgZW50cnktPmJ5dGVzX3Blcl9wYWNrZXQgPSAzMzsKKyAgICAgICAgICBlbnRyeS0+Ynl0ZXNfcGVyX2ZyYW1lID0gMzMgKiBlbnRyeS0+bl9jaGFubmVsczsKKyAgICAgICAgICBlbnRyeS0+Ynl0ZXNfcGVyX3NhbXBsZSA9IDI7CisgICAgICAgICAgZW50cnktPnNhbXBsZXNfcGVyX2ZyYW1lID0gMTYwICogZW50cnktPm5fY2hhbm5lbHM7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKHZlcnNpb24gPT0gMHgwMDAxMDAwMCkgeworICAgICAgICAvKiBzYW1wbGUgZGVzY3JpcHRpb24gZW50cnkgKDE2KSArIHNvdW5kIHNhbXBsZSBkZXNjcmlwdGlvbiB2MSAoMjArMTYpICovCisgICAgICAgIGlmIChsZW4gPCA1MikKKyAgICAgICAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworICAgICAgICBzd2l0Y2ggKGZvdXJjYykgeworICAgICAgICAgIGNhc2UgRk9VUkNDX3R3b3M6CisgICAgICAgICAgY2FzZSBGT1VSQ0Nfc293dDoKKyAgICAgICAgICBjYXNlIEZPVVJDQ19yYXdfOgorICAgICAgICAgIGNhc2UgRk9VUkNDX2xwY206CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG9ubHkgcGFyc2UgZXh0cmEgZGVjb2RpbmcgY29uZmlnIGZvciBub24tcGNtIGF1ZGlvICovCisgICAgICAgICAgICBlbnRyeS0+c2FtcGxlc19wZXJfcGFja2V0ID0gUVRfVUlOVDMyIChzdHNkX2VudHJ5X2RhdGEgKyBvZmZzZXQpOworICAgICAgICAgICAgZW50cnktPmJ5dGVzX3Blcl9wYWNrZXQgPSBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDQpOworICAgICAgICAgICAgZW50cnktPmJ5dGVzX3Blcl9mcmFtZSA9IFFUX1VJTlQzMiAoc3RzZF9lbnRyeV9kYXRhICsgb2Zmc2V0ICsgOCk7CisgICAgICAgICAgICBlbnRyeS0+Ynl0ZXNfcGVyX3NhbXBsZSA9IFFUX1VJTlQzMiAoc3RzZF9lbnRyeV9kYXRhICsgb2Zmc2V0ICsgMTIpOworCisgICAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInNhbXBsZXMvcGFja2V0OiAgICVkIiwKKyAgICAgICAgICAgICAgICBlbnRyeS0+c2FtcGxlc19wZXJfcGFja2V0KTsKKyAgICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiYnl0ZXMvcGFja2V0OiAgICAgJWQiLAorICAgICAgICAgICAgICAgIGVudHJ5LT5ieXRlc19wZXJfcGFja2V0KTsKKyAgICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiYnl0ZXMvZnJhbWU6ICAgICAgJWQiLAorICAgICAgICAgICAgICAgIGVudHJ5LT5ieXRlc19wZXJfZnJhbWUpOworICAgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJieXRlcy9zYW1wbGU6ICAgICAlZCIsCisgICAgICAgICAgICAgICAgZW50cnktPmJ5dGVzX3Blcl9zYW1wbGUpOworCisgICAgICAgICAgICBpZiAoIWVudHJ5LT5zYW1wbGVkICYmIGVudHJ5LT5ieXRlc19wZXJfcGFja2V0KSB7CisgICAgICAgICAgICAgIGVudHJ5LT5zYW1wbGVzX3Blcl9mcmFtZSA9IChlbnRyeS0+Ynl0ZXNfcGVyX2ZyYW1lIC8KKyAgICAgICAgICAgICAgICAgIGVudHJ5LT5ieXRlc19wZXJfcGFja2V0KSAqIGVudHJ5LT5zYW1wbGVzX3Blcl9wYWNrZXQ7CisgICAgICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAic2FtcGxlcy9mcmFtZTogICAgJWQiLAorICAgICAgICAgICAgICAgICAgZW50cnktPnNhbXBsZXNfcGVyX2ZyYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDB4MDAwMjAwMDApIHsKKyAgICAgICAgdW5pb24KKyAgICAgICAgeworICAgICAgICAgIGdkb3VibGUgZnA7CisgICAgICAgICAgZ3VpbnQ2NCB2YWw7CisgICAgICAgIH0gcXRmcDsKKworICAgICAgICAvKiBzYW1wbGUgZGVzY3JpcHRpb24gZW50cnkgKDE2KSArIHNvdW5kIHNhbXBsZSBkZXNjcmlwdGlvbiB2MiAoNTYpICovCisgICAgICAgIGlmIChsZW4gPCA3MikKKyAgICAgICAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworICAgICAgICBxdGZwLnZhbCA9IFFUX1VJTlQ2NCAoc3RzZF9lbnRyeV9kYXRhICsgb2Zmc2V0ICsgNCk7CisgICAgICAgIGVudHJ5LT5yYXRlID0gcXRmcC5mcDsKKyAgICAgICAgZW50cnktPm5fY2hhbm5lbHMgPSBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDEyKTsKKworICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIlNvdW5kIHNhbXBsZSBkZXNjcmlwdGlvbiBWZXJzaW9uIDIiKTsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJzYW1wbGUgcmF0ZTogICAgICAgICVnIiwgZW50cnktPnJhdGUpOworICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIm5fY2hhbm5lbHM6ICAgICAgICAgJWQiLCBlbnRyeS0+bl9jaGFubmVscyk7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiYml0cy9jaGFubmVsOiAgICAgICAlZCIsCisgICAgICAgICAgICBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDIwKSk7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiZm9ybWF0IGZsYWdzOiAgICAgICAlWCIsCisgICAgICAgICAgICBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDI0KSk7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiYnl0ZXMvcGFja2V0OiAgICAgICAlZCIsCisgICAgICAgICAgICBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDI4KSk7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiTFBDTSBmcmFtZXMvcGFja2V0OiAlZCIsCisgICAgICAgICAgICBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDMyKSk7CisgICAgICB9IGVsc2UgaWYgKHZlcnNpb24gIT0gMHgwMDAwMCkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJ1bmtub3duIGF1ZGlvIFNUU0QgdmVyc2lvbiAlMDh4IiwKKyAgICAgICAgICAgIHZlcnNpb24pOworICAgICAgfQorCisgICAgICBpZiAoZW50cnktPmNhcHMpCisgICAgICAgIGdzdF9jYXBzX3VucmVmIChlbnRyeS0+Y2Fwcyk7CisKKyAgICAgIGVudHJ5LT5jYXBzID0gcXRkZW11eF9hdWRpb19jYXBzIChxdGRlbXV4LCBzdHJlYW0sIGVudHJ5LCBmb3VyY2MsCisgICAgICAgICAgc3RzZF9lbnRyeV9kYXRhICsgMzIsIGxlbiAtIDE2LCAmY29kZWMpOworCisgICAgICBzd2l0Y2ggKGZvdXJjYykgeworICAgICAgICBjYXNlIEZPVVJDQ19pbjI0OgorICAgICAgICB7CisgICAgICAgICAgR05vZGUgKmVuZGE7CisgICAgICAgICAgR05vZGUgKmluMjQ7CisKKyAgICAgICAgICBpbjI0ID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChzdHNkLCBGT1VSQ0NfaW4yNCk7CisKKyAgICAgICAgICBlbmRhID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChpbjI0LCBGT1VSQ0NfZW5kYSk7CisgICAgICAgICAgaWYgKCFlbmRhKSB7CisgICAgICAgICAgICB3YXZlID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChpbjI0LCBGT1VSQ0Nfd2F2ZSk7CisgICAgICAgICAgICBpZiAod2F2ZSkKKyAgICAgICAgICAgICAgZW5kYSA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAod2F2ZSwgRk9VUkNDX2VuZGEpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZW5kYSkgeworICAgICAgICAgICAgaW50IGVuZGFfdmFsdWUgPSBRVF9VSU5UMTYgKChndWludDggKikgZW5kYS0+ZGF0YSArIDgpOworICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsIChlbmRhX3ZhbHVlKSA/ICJTMjRMRSIgOiAiUzI0QkUiLAorICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQ19vd21hOgorICAgICAgICB7CisgICAgICAgICAgY29uc3QgZ3VpbnQ4ICpvd21hX2RhdGE7CisgICAgICAgICAgY29uc3QgZ2NoYXIgKmNvZGVjX25hbWUgPSBOVUxMOworICAgICAgICAgIGd1aW50IG93bWFfbGVuOworICAgICAgICAgIEdzdEJ1ZmZlciAqYnVmOworICAgICAgICAgIGdpbnQgdmVyc2lvbiA9IDE7CisgICAgICAgICAgLyogZnJvbSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZGQ3NTc3MjAoVlMuODUpLmFzcHggKi8KKyAgICAgICAgICAvKiBGSVhNRSB0aGlzIHNob3VsZCBhbHNvIGJlIGdzdF9yaWZmX3N0cmZfYXVkcywKKyAgICAgICAgICAgKiBidXQgdGhlIGxhdHRlciBvbmUgaXMgYWN0dWFsbHkgbWlzc2luZyBiaXRzLXBlci1zYW1wbGUgOiggKi8KKyAgICAgICAgICB0eXBlZGVmIHN0cnVjdAorICAgICAgICAgIHsKKyAgICAgICAgICAgIGdpbnQxNiB3Rm9ybWF0VGFnOworICAgICAgICAgICAgZ2ludDE2IG5DaGFubmVsczsKKyAgICAgICAgICAgIGdpbnQzMiBuU2FtcGxlc1BlclNlYzsKKyAgICAgICAgICAgIGdpbnQzMiBuQXZnQnl0ZXNQZXJTZWM7CisgICAgICAgICAgICBnaW50MTYgbkJsb2NrQWxpZ247CisgICAgICAgICAgICBnaW50MTYgd0JpdHNQZXJTYW1wbGU7CisgICAgICAgICAgICBnaW50MTYgY2JTaXplOworICAgICAgICAgIH0gV0FWRUZPUk1BVEVYOworICAgICAgICAgIFdBVkVGT1JNQVRFWCAqd2ZleDsKKworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJwYXJzZSBvd21hIik7CisgICAgICAgICAgb3dtYV9kYXRhID0gc3RzZF9lbnRyeV9kYXRhOworICAgICAgICAgIG93bWFfbGVuID0gUVRfVUlOVDMyIChvd21hX2RhdGEpOworICAgICAgICAgIGlmIChvd21hX2xlbiA8PSA1NCkgeworICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAiVG9vIHNtYWxsIG93bWEgaGVhZGVyLCBza2lwcGluZyIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHdmZXggPSAoV0FWRUZPUk1BVEVYICopIChvd21hX2RhdGEgKyAzNik7CisgICAgICAgICAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChvd21hX2xlbiAtIDU0KTsKKyAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgb3dtYV9kYXRhICsgNTQsIG93bWFfbGVuIC0gNTQpOworICAgICAgICAgIGlmICh3ZmV4LT53Rm9ybWF0VGFnID09IDB4MDE2MSkgeworICAgICAgICAgICAgY29kZWNfbmFtZSA9ICJXaW5kb3dzIE1lZGlhIEF1ZGlvIjsKKyAgICAgICAgICAgIHZlcnNpb24gPSAyOworICAgICAgICAgIH0gZWxzZSBpZiAod2ZleC0+d0Zvcm1hdFRhZyA9PSAweDAxNjIpIHsKKyAgICAgICAgICAgIGNvZGVjX25hbWUgPSAiV2luZG93cyBNZWRpYSBBdWRpbyA5IFBybyI7CisgICAgICAgICAgICB2ZXJzaW9uID0gMzsKKyAgICAgICAgICB9IGVsc2UgaWYgKHdmZXgtPndGb3JtYXRUYWcgPT0gMHgwMTYzKSB7CisgICAgICAgICAgICBjb2RlY19uYW1lID0gIldpbmRvd3MgTWVkaWEgQXVkaW8gOSBMb3NzbGVzcyI7CisgICAgICAgICAgICAvKiBpcyB0aGF0IGNvcnJlY3Q/IGdzdGZmbXBlZ2NvZGVjbWFwLmMgaXMgbWlzc2luZyBpdCwgYnV0CisgICAgICAgICAgICAgKiBmbHVlbmRvIGNvZGVjIHNlZW1zIHRvIHN1cHBvcnQgaXQgKi8KKyAgICAgICAgICAgIHZlcnNpb24gPSA0OworICAgICAgICAgIH0KKworICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGVudHJ5LT5jYXBzLAorICAgICAgICAgICAgICAiY29kZWNfZGF0YSIsIEdTVF9UWVBFX0JVRkZFUiwgYnVmLAorICAgICAgICAgICAgICAid21hdmVyc2lvbiIsIEdfVFlQRV9JTlQsIHZlcnNpb24sCisgICAgICAgICAgICAgICJibG9ja19hbGlnbiIsIEdfVFlQRV9JTlQsCisgICAgICAgICAgICAgIEdTVF9SRUFEX1VJTlQxNl9MRSAoJndmZXgtPm5CbG9ja0FsaWduKSwgImJpdHJhdGUiLCBHX1RZUEVfSU5ULAorICAgICAgICAgICAgICBHU1RfUkVBRF9VSU5UMzJfTEUgKCZ3ZmV4LT5uQXZnQnl0ZXNQZXJTZWMpLCAid2lkdGgiLCBHX1RZUEVfSU5ULAorICAgICAgICAgICAgICBHU1RfUkVBRF9VSU5UMTZfTEUgKCZ3ZmV4LT53Qml0c1BlclNhbXBsZSksICJkZXB0aCIsIEdfVFlQRV9JTlQsCisgICAgICAgICAgICAgIEdTVF9SRUFEX1VJTlQxNl9MRSAoJndmZXgtPndCaXRzUGVyU2FtcGxlKSwgTlVMTCk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAgICAgICAgIGlmIChjb2RlY19uYW1lKSB7CisgICAgICAgICAgICBnX2ZyZWUgKGNvZGVjKTsKKyAgICAgICAgICAgIGNvZGVjID0gZ19zdHJkdXAgKGNvZGVjX25hbWUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQ193bWFfOgorICAgICAgICB7CisgICAgICAgICAgZ2ludCBsZW4gPSBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSkgLSBvZmZzZXQ7CisgICAgICAgICAgY29uc3QgZ3VpbnQ4ICp3ZmV4X2RhdGEgPSBzdHNkX2VudHJ5X2RhdGEgKyBvZmZzZXQ7CisgICAgICAgICAgY29uc3QgZ2NoYXIgKmNvZGVjX25hbWUgPSBOVUxMOworICAgICAgICAgIGdpbnQgdmVyc2lvbiA9IDE7CisgICAgICAgICAgLyogZnJvbSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZGQ3NTc3MjAoVlMuODUpLmFzcHggKi8KKyAgICAgICAgICAvKiBGSVhNRSB0aGlzIHNob3VsZCBhbHNvIGJlIGdzdF9yaWZmX3N0cmZfYXVkcywKKyAgICAgICAgICAgKiBidXQgdGhlIGxhdHRlciBvbmUgaXMgYWN0dWFsbHkgbWlzc2luZyBiaXRzLXBlci1zYW1wbGUgOiggKi8KKyAgICAgICAgICB0eXBlZGVmIHN0cnVjdAorICAgICAgICAgIHsKKyAgICAgICAgICAgIGdpbnQxNiB3Rm9ybWF0VGFnOworICAgICAgICAgICAgZ2ludDE2IG5DaGFubmVsczsKKyAgICAgICAgICAgIGdpbnQzMiBuU2FtcGxlc1BlclNlYzsKKyAgICAgICAgICAgIGdpbnQzMiBuQXZnQnl0ZXNQZXJTZWM7CisgICAgICAgICAgICBnaW50MTYgbkJsb2NrQWxpZ247CisgICAgICAgICAgICBnaW50MTYgd0JpdHNQZXJTYW1wbGU7CisgICAgICAgICAgICBnaW50MTYgY2JTaXplOworICAgICAgICAgIH0gV0FWRUZPUk1BVEVYOworICAgICAgICAgIFdBVkVGT1JNQVRFWCB3ZmV4OworCisgICAgICAgICAgLyogRklYTUU6IHVuaWZ5IHdpdGggc2ltaWxhciB3YXZmb3JtYXRleCBwYXJzaW5nIGNvZGUgYWJvdmUgKi8KKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicGFyc2Ugd21hLCBsb29raW5nIGZvciB3ZmV4Iik7CisKKyAgICAgICAgICAvKiBmaW5kIHdmZXggKi8KKyAgICAgICAgICB3aGlsZSAobGVuID49IDgpIHsKKyAgICAgICAgICAgIGdpbnQgc2l6ZTsKKworICAgICAgICAgICAgaWYgKFFUX1VJTlQzMiAod2ZleF9kYXRhKSA8PSBsZW4pCisgICAgICAgICAgICAgIHNpemUgPSBRVF9VSU5UMzIgKHdmZXhfZGF0YSkgLSA4OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBzaXplID0gbGVuIC0gODsKKworICAgICAgICAgICAgaWYgKHNpemUgPCAxKQorICAgICAgICAgICAgICAvKiBObyByZWFsIGRhdGEsIHNvIGJyZWFrIG91dCAqLworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgc3dpdGNoIChRVF9GT1VSQ0MgKHdmZXhfZGF0YSArIDQpKSB7CisgICAgICAgICAgICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgndycsICdmJywgJ2UnLCAneCcpOgorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImZvdW5kIHdmZXggaW4gc3RzZCIpOworCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCA4ICsgMTgpCisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIHdmZXgud0Zvcm1hdFRhZyA9IEdTVF9SRUFEX1VJTlQxNl9MRSAod2ZleF9kYXRhICsgOCArIDApOworICAgICAgICAgICAgICAgIHdmZXgubkNoYW5uZWxzID0gR1NUX1JFQURfVUlOVDE2X0xFICh3ZmV4X2RhdGEgKyA4ICsgMik7CisgICAgICAgICAgICAgICAgd2ZleC5uU2FtcGxlc1BlclNlYyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAod2ZleF9kYXRhICsgOCArIDQpOworICAgICAgICAgICAgICAgIHdmZXgubkF2Z0J5dGVzUGVyU2VjID0gR1NUX1JFQURfVUlOVDMyX0xFICh3ZmV4X2RhdGEgKyA4ICsgOCk7CisgICAgICAgICAgICAgICAgd2ZleC5uQmxvY2tBbGlnbiA9IEdTVF9SRUFEX1VJTlQxNl9MRSAod2ZleF9kYXRhICsgOCArIDEyKTsKKyAgICAgICAgICAgICAgICB3ZmV4LndCaXRzUGVyU2FtcGxlID0gR1NUX1JFQURfVUlOVDE2X0xFICh3ZmV4X2RhdGEgKyA4ICsgMTQpOworICAgICAgICAgICAgICAgIHdmZXguY2JTaXplID0gR1NUX1JFQURfVUlOVDE2X0xFICh3ZmV4X2RhdGEgKyA4ICsgMTYpOworCisgICAgICAgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJGb3VuZCB3ZmV4IGJveCBpbiBzdHNkOiIpOworICAgICAgICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiRm9ybWF0VGFnID0gMHglMDR4LCBDaGFubmVscyA9ICV1LCAiCisgICAgICAgICAgICAgICAgICAgICJTYW1wbGVzUGVyU2VjID0gJXUsIEF2Z0J5dGVzUGVyU2VjID0gJXUsIEJsb2NrQWxpZ24gPSAldSwgIgorICAgICAgICAgICAgICAgICAgICAiQml0c1BlclNhbXBsZSA9ICV1LCBTaXplID0gJXUiLCB3ZmV4LndGb3JtYXRUYWcsCisgICAgICAgICAgICAgICAgICAgIHdmZXgubkNoYW5uZWxzLCB3ZmV4Lm5TYW1wbGVzUGVyU2VjLCB3ZmV4Lm5BdmdCeXRlc1BlclNlYywKKyAgICAgICAgICAgICAgICAgICAgd2ZleC5uQmxvY2tBbGlnbiwgd2ZleC53Qml0c1BlclNhbXBsZSwgd2ZleC5jYlNpemUpOworCisgICAgICAgICAgICAgICAgaWYgKHdmZXgud0Zvcm1hdFRhZyA9PSAweDAxNjEpIHsKKyAgICAgICAgICAgICAgICAgIGNvZGVjX25hbWUgPSAiV2luZG93cyBNZWRpYSBBdWRpbyI7CisgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdmZXgud0Zvcm1hdFRhZyA9PSAweDAxNjIpIHsKKyAgICAgICAgICAgICAgICAgIGNvZGVjX25hbWUgPSAiV2luZG93cyBNZWRpYSBBdWRpbyA5IFBybyI7CisgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gMzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdmZXgud0Zvcm1hdFRhZyA9PSAweDAxNjMpIHsKKyAgICAgICAgICAgICAgICAgIGNvZGVjX25hbWUgPSAiV2luZG93cyBNZWRpYSBBdWRpbyA5IExvc3NsZXNzIjsKKyAgICAgICAgICAgICAgICAgIC8qIGlzIHRoYXQgY29ycmVjdD8gZ3N0ZmZtcGVnY29kZWNtYXAuYyBpcyBtaXNzaW5nIGl0LCBidXQKKyAgICAgICAgICAgICAgICAgICAqIGZsdWVuZG8gY29kZWMgc2VlbXMgdG8gc3VwcG9ydCBpdCAqLworICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IDQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgICAgICJ3bWF2ZXJzaW9uIiwgR19UWVBFX0lOVCwgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgImJsb2NrX2FsaWduIiwgR19UWVBFX0lOVCwgd2ZleC5uQmxvY2tBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgImJpdHJhdGUiLCBHX1RZUEVfSU5ULCB3ZmV4Lm5BdmdCeXRlc1BlclNlYywKKyAgICAgICAgICAgICAgICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgd2ZleC53Qml0c1BlclNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgImRlcHRoIiwgR19UWVBFX0lOVCwgd2ZleC53Qml0c1BlclNhbXBsZSwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IHdmZXguY2JTaXplKSB7CisgICAgICAgICAgICAgICAgICBHc3RCdWZmZXIgKmJ1ZjsKKworICAgICAgICAgICAgICAgICAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzaXplIC0gd2ZleC5jYlNpemUpOworICAgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsIHdmZXhfZGF0YSArIDggKyB3ZmV4LmNiU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplIC0gd2ZleC5jYlNpemUpOworICAgICAgICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgICAgICAgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIGJ1ZiwgTlVMTCk7CisgICAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJubyBjb2RlYyBkYXRhIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGNvZGVjX25hbWUpIHsKKyAgICAgICAgICAgICAgICAgIGdfZnJlZSAoY29kZWMpOworICAgICAgICAgICAgICAgICAgY29kZWMgPSBnX3N0cmR1cCAoY29kZWNfbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZW4gLT0gc2l6ZSArIDg7CisgICAgICAgICAgICB3ZmV4X2RhdGEgKz0gc2l6ZSArIDg7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDX29wdXM6CisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBndWludDggKm9wdXNfZGF0YTsKKyAgICAgICAgICBndWludDggKmNoYW5uZWxfbWFwcGluZyA9IE5VTEw7CisgICAgICAgICAgZ3VpbnQzMiByYXRlOworICAgICAgICAgIGd1aW50OCBjaGFubmVsczsKKyAgICAgICAgICBndWludDggY2hhbm5lbF9tYXBwaW5nX2ZhbWlseTsKKyAgICAgICAgICBndWludDggc3RyZWFtX2NvdW50OworICAgICAgICAgIGd1aW50OCBjb3VwbGVkX2NvdW50OworICAgICAgICAgIGd1aW50OCBpOworCisgICAgICAgICAgb3B1c19kYXRhID0gc3RzZF9lbnRyeV9kYXRhOworCisgICAgICAgICAgY2hhbm5lbHMgPSBHU1RfUkVBRF9VSU5UOCAob3B1c19kYXRhICsgNDUpOworICAgICAgICAgIHJhdGUgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKG9wdXNfZGF0YSArIDQ4KTsKKyAgICAgICAgICBjaGFubmVsX21hcHBpbmdfZmFtaWx5ID0gR1NUX1JFQURfVUlOVDggKG9wdXNfZGF0YSArIDU0KTsKKyAgICAgICAgICBzdHJlYW1fY291bnQgPSBHU1RfUkVBRF9VSU5UOCAob3B1c19kYXRhICsgNTUpOworICAgICAgICAgIGNvdXBsZWRfY291bnQgPSBHU1RfUkVBRF9VSU5UOCAob3B1c19kYXRhICsgNTYpOworCisgICAgICAgICAgaWYgKGNoYW5uZWxzID4gMCkgeworICAgICAgICAgICAgY2hhbm5lbF9tYXBwaW5nID0gZ19tYWxsb2MgKGNoYW5uZWxzICogc2l6ZW9mIChndWludDgpKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKQorICAgICAgICAgICAgICBjaGFubmVsX21hcHBpbmdbaV0gPSBHU1RfUkVBRF9VSU5UOCAob3B1c19kYXRhICsgaSArIDU3KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBlbnRyeS0+Y2FwcyA9IGdzdF9jb2RlY191dGlsc19vcHVzX2NyZWF0ZV9jYXBzIChyYXRlLCBjaGFubmVscywKKyAgICAgICAgICAgICAgY2hhbm5lbF9tYXBwaW5nX2ZhbWlseSwgc3RyZWFtX2NvdW50LCBjb3VwbGVkX2NvdW50LAorICAgICAgICAgICAgICBjaGFubmVsX21hcHBpbmcpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChjb2RlYykgeworICAgICAgICBHc3RTdHJ1Y3R1cmUgKnM7CisgICAgICAgIGdpbnQgYml0cmF0ZSA9IDA7CisKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZCAoc3RyZWFtLT5zdHJlYW1fdGFncywgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICAgICAgR1NUX1RBR19BVURJT19DT0RFQywgY29kZWMsIE5VTEwpOworICAgICAgICBnX2ZyZWUgKGNvZGVjKTsKKyAgICAgICAgY29kZWMgPSBOVUxMOworCisgICAgICAgIC8qIHNvbWUgYml0cmF0ZSBpbmZvIG1heSBoYXZlIGVuZGVkIHVwIGluIGNhcHMgKi8KKyAgICAgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGVudHJ5LT5jYXBzLCAwKTsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzLCAiYml0cmF0ZSIsICZiaXRyYXRlKTsKKyAgICAgICAgaWYgKGJpdHJhdGUgPiAwKQorICAgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHN0cmVhbS0+c3RyZWFtX3RhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgICAgICAgICAgR1NUX1RBR19CSVRSQVRFLCBiaXRyYXRlLCBOVUxMKTsKKyAgICAgIH0KKworICAgICAgbXA0YSA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfaW5kZXggKHN0c2QsIHN0c2RfaW5kZXgpOworICAgICAgaWYgKCFzdHJlYW0tPnByb3RlY3RlZCkgeworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKFFUREVNVVhfVFJFRV9OT0RFX0ZPVVJDQyAobXA0dikgIT0gRk9VUkNDX2VuY3YpIHsKKyAgICAgICAgICBtcDR2ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHN0cmVhbS0+cHJvdGVjdGVkICYmIGZvdXJjYyA9PSBGT1VSQ0NfbXA0YSkgeworICAgICAgICBpZiAoUVRERU1VWF9UUkVFX05PREVfRk9VUkNDIChtcDRhKSAhPSBGT1VSQ0NfZW5jYSkgeworICAgICAgICAgIG1wNGEgPSBOVUxMOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoUVRERU1VWF9UUkVFX05PREVfRk9VUkNDIChtcDRhKSAhPSBGT1VSQ0NfbXA0YSkgeworICAgICAgICAgIG1wNGEgPSBOVUxMOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHdhdmUgPSBOVUxMOworICAgICAgZXNkcyA9IE5VTEw7CisgICAgICBpZiAobXA0YSkgeworICAgICAgICB3YXZlID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChtcDRhLCBGT1VSQ0Nfd2F2ZSk7CisgICAgICAgIGlmICh3YXZlKQorICAgICAgICAgIGVzZHMgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHdhdmUsIEZPVVJDQ19lc2RzKTsKKyAgICAgICAgaWYgKCFlc2RzKQorICAgICAgICAgIGVzZHMgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKG1wNGEsIEZPVVJDQ19lc2RzKTsKKyAgICAgIH0KKworCisgICAgICAvKiBJZiB0aGUgZm91cmNjJ3MgYm90dG9tIDE2IGJpdHMgZ2l2ZXMgJ3NtJywgdGhlbiB0aGUgdG9wCisgICAgICAgICAxNiBiaXRzIGlzIGEgYnl0ZS1zd2FwcGVkIHdhdmUtc3R5bGUgY29kZWMgaWRlbnRpZmllciwKKyAgICAgICAgIGFuZCB3ZSBjYW4gZmluZCBhIFdBVkUgaGVhZGVyIGludGVybmFsbHkgdG8gYSAnd2F2ZScgYXRvbSBoZXJlLgorICAgICAgICAgVGhpcyBjYW4gbW9yZSBjbGVhcmx5IGJlIHRob3VnaHQgb2YgYXMgJ21zJyBhcyB0aGUgdG9wIDE2IGJpdHMsIGFuZCBhCisgICAgICAgICBjb2RlYyBpZCBhcyB0aGUgYm90dG9tIDE2IGJpdHMgLSBidXQgYnl0ZS1zd2FwcGVkIHRvIHN0b3JlIGluIFFUICh3aGljaAorICAgICAgICAgaXMgYmlnLWVuZGlhbikuCisgICAgICAgKi8KKyAgICAgIGlmICgoZm91cmNjICYgMHhmZmZmKSA9PSAoKCdzJyA8PCA4KSB8ICdtJykpIHsKKyAgICAgICAgaWYgKGxlbiA8IG9mZnNldCArIDIwKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAiTm8gd2F2ZSBhdG9tIGluIE1TLXN0eWxlIGF1ZGlvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3VpbnQzMiBkYXRhbGVuID0gUVRfVUlOVDMyIChzdHNkX2VudHJ5X2RhdGEgKyBvZmZzZXQgKyAxNik7CisgICAgICAgICAgY29uc3QgZ3VpbnQ4ICpkYXRhID0gc3RzZF9lbnRyeV9kYXRhICsgb2Zmc2V0ICsgMTY7CisgICAgICAgICAgR05vZGUgKndhdmVub2RlOworICAgICAgICAgIEdOb2RlICp3YXZlaGVhZGVybm9kZTsKKworICAgICAgICAgIHdhdmVub2RlID0gZ19ub2RlX25ldyAoKGd1aW50OCAqKSBkYXRhKTsKKyAgICAgICAgICBpZiAocXRkZW11eF9wYXJzZV9ub2RlIChxdGRlbXV4LCB3YXZlbm9kZSwgZGF0YSwgZGF0YWxlbikpIHsKKyAgICAgICAgICAgIGNvbnN0IGd1aW50OCAqd2F2ZWhlYWRlcjsKKyAgICAgICAgICAgIGd1aW50MzIgaGVhZGVybGVuOworCisgICAgICAgICAgICB3YXZlaGVhZGVybm9kZSA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAod2F2ZW5vZGUsIGZvdXJjYyk7CisgICAgICAgICAgICBpZiAod2F2ZWhlYWRlcm5vZGUpIHsKKyAgICAgICAgICAgICAgd2F2ZWhlYWRlciA9IChjb25zdCBndWludDggKikgd2F2ZWhlYWRlcm5vZGUtPmRhdGE7CisgICAgICAgICAgICAgIGhlYWRlcmxlbiA9IFFUX1VJTlQzMiAod2F2ZWhlYWRlcik7CisKKyAgICAgICAgICAgICAgaWYgKGhlYWRlcmxlbiA+IDgpIHsKKyAgICAgICAgICAgICAgICBnc3RfcmlmZl9zdHJmX2F1ZHMgKmhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgR3N0QnVmZmVyICpoZWFkZXJidWY7CisgICAgICAgICAgICAgICAgR3N0QnVmZmVyICpleHRyYTsKKworICAgICAgICAgICAgICAgIHdhdmVoZWFkZXIgKz0gODsKKyAgICAgICAgICAgICAgICBoZWFkZXJsZW4gLT0gODsKKworICAgICAgICAgICAgICAgIGhlYWRlcmJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoaGVhZGVybGVuKTsKKyAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKGhlYWRlcmJ1ZiwgMCwgd2F2ZWhlYWRlciwgaGVhZGVybGVuKTsKKworICAgICAgICAgICAgICAgIGlmIChnc3RfcmlmZl9wYXJzZV9zdHJmX2F1ZHMgKEdTVF9FTEVNRU5UX0NBU1QgKHF0ZGVtdXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyYnVmLCAmaGVhZGVyLCAmZXh0cmEpKSB7CisgICAgICAgICAgICAgICAgICBnc3RfY2Fwc191bnJlZiAoZW50cnktPmNhcHMpOworICAgICAgICAgICAgICAgICAgLyogRklYTUU6IE5lZWQgdG8gZG8gc29tZXRoaW5nIHdpdGggdGhlIGNoYW5uZWwgcmVvcmRlciBtYXAgKi8KKyAgICAgICAgICAgICAgICAgIGVudHJ5LT5jYXBzID0KKyAgICAgICAgICAgICAgICAgICAgICBnc3RfcmlmZl9jcmVhdGVfYXVkaW9fY2FwcyAoaGVhZGVyLT5mb3JtYXQsIE5VTEwsIGhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICBleHRyYSwgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICAgIGlmIChleHRyYSkKKyAgICAgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoZXh0cmEpOworICAgICAgICAgICAgICAgICAgZ19mcmVlIChoZWFkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgIEdTVF9ERUJVRyAoIkRpZG4ndCBmaW5kIHdhdmVoZWFkZXJub2RlIGZvciB0aGlzIGNvZGVjIik7CisgICAgICAgICAgfQorICAgICAgICAgIGdfbm9kZV9kZXN0cm95ICh3YXZlbm9kZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoZXNkcykgeworICAgICAgICBnc3RfcXRkZW11eF9oYW5kbGVfZXNkcyAocXRkZW11eCwgc3RyZWFtLCBlbnRyeSwgZXNkcywKKyAgICAgICAgICAgIHN0cmVhbS0+c3RyZWFtX3RhZ3MpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChmb3VyY2MpIHsKKyNpZiAwCisgICAgICAgICAgICAvKiBGSVhNRTogd2hhdCBpcyBpbiB0aGUgY2h1bms/ICovCisgICAgICAgICAgY2FzZSBGT1VSQ0NfUURNQzoKKyAgICAgICAgICB7CisgICAgICAgICAgICBnaW50IGxlbiA9IFFUX1VJTlQzMiAoc3RzZF9kYXRhKTsKKworICAgICAgICAgICAgLyogc2VlbXMgdG8gYmUgYWx3YXlzID0gMTE2ID0gMHg3NCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgY2FzZSBGT1VSQ0NfUURNMjoKKyAgICAgICAgICB7CisgICAgICAgICAgICBnaW50IGxlbiA9IFFUX1VJTlQzMiAoc3RzZF9lbnRyeV9kYXRhKTsKKworICAgICAgICAgICAgaWYgKGxlbiA+IDB4M0MpIHsKKyAgICAgICAgICAgICAgR3N0QnVmZmVyICpidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGxlbiAtIDB4M0MpOworCisgICAgICAgICAgICAgIGdzdF9idWZmZXJfZmlsbCAoYnVmLCAwLCBzdHNkX2VudHJ5X2RhdGEgKyAweDNDLCBsZW4gLSAweDNDKTsKKyAgICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgICAiY29kZWNfZGF0YSIsIEdTVF9UWVBFX0JVRkZFUiwgYnVmLCBOVUxMKTsKKyAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGVudHJ5LT5jYXBzLAorICAgICAgICAgICAgICAgICJzYW1wbGVzaXplIiwgR19UWVBFX0lOVCwgc2FtcGxlc2l6ZSwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBGT1VSQ0NfYWxhYzoKKyAgICAgICAgICB7CisgICAgICAgICAgICBHTm9kZSAqYWxhYywgKndhdmUgPSBOVUxMOworCisgICAgICAgICAgICAvKiBhcHBhcmVudGx5LCBtNGEgaGFzIHRoaXMgYXRvbSBhcHBlbmRlZCBkaXJlY3RseSBpbiB0aGUgc3RzZCBlbnRyeSwKKyAgICAgICAgICAgICAqIHdoaWxlIG1vdiBoYXMgaXQgaW4gYSB3YXZlIGF0b20gKi8KKyAgICAgICAgICAgIGFsYWMgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHN0c2QsIEZPVVJDQ19hbGFjKTsKKyAgICAgICAgICAgIGlmIChhbGFjKSB7CisgICAgICAgICAgICAgIC8qIGFsYWMgbm93IHJlZmVycyB0byBzdHNkIGVudHJ5IGF0b20gKi8KKyAgICAgICAgICAgICAgd2F2ZSA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAoYWxhYywgRk9VUkNDX3dhdmUpOworICAgICAgICAgICAgICBpZiAod2F2ZSkKKyAgICAgICAgICAgICAgICBhbGFjID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlICh3YXZlLCBGT1VSQ0NfYWxhYyk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhbGFjID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChhbGFjLCBGT1VSQ0NfYWxhYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWxhYykgeworICAgICAgICAgICAgICBjb25zdCBndWludDggKmFsYWNfZGF0YSA9IGFsYWMtPmRhdGE7CisgICAgICAgICAgICAgIGdpbnQgbGVuID0gUVRfVUlOVDMyIChhbGFjLT5kYXRhKTsKKyAgICAgICAgICAgICAgR3N0QnVmZmVyICpidWY7CisKKyAgICAgICAgICAgICAgaWYgKGxlbiA8IDM2KSB7CisgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICAgICAgICAgImRpc2NhcmRpbmcgYWxhYyBhdG9tIHdpdGggdW5leHBlY3RlZCBsZW4gJWQiLCBsZW4pOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIGNvZGVjLWRhdGEgY29udGFpbnMgYWxhYyBhdG9tIHNpemUgYW5kIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgKiBmZm1wZWcgbGlrZXMgaXQgdGhhdCB3YXksIG5vdCBxdWl0ZSBnc3QtaXNoIHRob3VnaCAuLi4qLworICAgICAgICAgICAgICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobGVuKTsKKyAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgYWxhYy0+ZGF0YSwgbGVuKTsKKyAgICAgICAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChlbnRyeS0+Y2FwcywKKyAgICAgICAgICAgICAgICAgICAgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIGJ1ZiwgTlVMTCk7CisgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAgICAgICAgICAgICAgIGVudHJ5LT5ieXRlc19wZXJfZnJhbWUgPSBRVF9VSU5UMzIgKGFsYWNfZGF0YSArIDEyKTsKKyAgICAgICAgICAgICAgICBlbnRyeS0+bl9jaGFubmVscyA9IFFUX1VJTlQ4IChhbGFjX2RhdGEgKyAyMSk7CisgICAgICAgICAgICAgICAgZW50cnktPnJhdGUgPSBRVF9VSU5UMzIgKGFsYWNfZGF0YSArIDMyKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgInNhbXBsZXNpemUiLCBHX1RZUEVfSU5ULCBzYW1wbGVzaXplLCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEZPVVJDQ19mTGFDOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoZSBjb2RpbmduYW1lIG9mIHRoZSBzYW1wbGUgZW50cnkgaXMgJ2ZMYUMnICovCisgICAgICAgICAgICBHTm9kZSAqZmxhYyA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAoc3RzZCwgRk9VUkNDX2ZMYUMpOworCisgICAgICAgICAgICBpZiAoZmxhYykgeworICAgICAgICAgICAgICAvKiBUaGUgJ2RmTGEnIGJveCBpcyBhZGRlZCB0byB0aGUgc2FtcGxlIGVudHJ5IHRvIGNvbnZleQorICAgICAgICAgICAgICAgICBpbml0aWFsaXppbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBkZWNvZGVyLiAqLworICAgICAgICAgICAgICBjb25zdCBHTm9kZSAqZGZsYSA9CisgICAgICAgICAgICAgICAgICBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKGZsYWMsIEZPVVJDQ19kZkxhKTsKKworICAgICAgICAgICAgICBpZiAoZGZsYSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuID0gUVRfVUlOVDMyIChkZmxhLT5kYXRhKTsKKworICAgICAgICAgICAgICAgIC8qIE11c3QgY29udGFpbiBhdCBsZWFzdCBkZkxhIGJveCBoZWFkZXIgKDEyKSwKKyAgICAgICAgICAgICAgICAgKiBNRVRBREFUQV9CTE9DS19IRUFERVIgKDQpLCBNRVRBREFUQV9CTE9DS19TVFJFQU1JTkZPICgzNCkgKi8KKyAgICAgICAgICAgICAgICBpZiAobGVuIDwgNTApIHsKKyAgICAgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAgICAgICAgICAgImRpc2NhcmRpbmcgZGZsYSBhdG9tIHdpdGggdW5leHBlY3RlZCBsZW4gJWQiLCBsZW4pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAvKiBza2lwIGRmTGEgaGVhZGVyIHRvIGdldCB0aGUgTUVUQURBVEFfQkxPQ0tzICovCisgICAgICAgICAgICAgICAgICBjb25zdCBndWludDggKm1ldGFkYXRhX2Jsb2NrcyA9IChndWludDggKikgZGZsYS0+ZGF0YSArIDEyOworICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBtZXRhZGF0YV9ibG9ja3NfbGVuID0gbGVuIC0gMTI7CisKKyAgICAgICAgICAgICAgICAgIGdjaGFyICpzdHJlYW1fbWFya2VyID0gZ19zdHJkdXAgKCJmTGFDIik7CisgICAgICAgICAgICAgICAgICBHc3RCdWZmZXIgKmJsb2NrID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoc3RyZWFtX21hcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4gKHN0cmVhbV9tYXJrZXIpKTsKKworICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBpbmRleCA9IDA7CisgICAgICAgICAgICAgICAgICBndWludDMyIHJlbWFpbmRlciA9IDA7CisgICAgICAgICAgICAgICAgICBndWludDMyIGJsb2NrX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgZ2Jvb2xlYW4gaXNfbGFzdCA9IEZBTFNFOworCisgICAgICAgICAgICAgICAgICBHVmFsdWUgYXJyYXkgPSBHX1ZBTFVFX0lOSVQ7CisgICAgICAgICAgICAgICAgICBHVmFsdWUgdmFsdWUgPSBHX1ZBTFVFX0lOSVQ7CisKKyAgICAgICAgICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJmFycmF5LCBHU1RfVFlQRV9BUlJBWSk7CisgICAgICAgICAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZ2YWx1ZSwgR1NUX1RZUEVfQlVGRkVSKTsKKworICAgICAgICAgICAgICAgICAgZ3N0X3ZhbHVlX3NldF9idWZmZXIgKCZ2YWx1ZSwgYmxvY2spOworICAgICAgICAgICAgICAgICAgZ3N0X3ZhbHVlX2FycmF5X2FwcGVuZF92YWx1ZSAoJmFycmF5LCAmdmFsdWUpOworICAgICAgICAgICAgICAgICAgZ192YWx1ZV9yZXNldCAoJnZhbHVlKTsKKworICAgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYmxvY2spOworCisgICAgICAgICAgICAgICAgICAvKiBjaGVjayB0aGVyZSdzIGF0IGxlYXN0IG9uZSBNRVRBREFUQV9CTE9DS19IRUFERVIncyB3b3J0aAorICAgICAgICAgICAgICAgICAgICogb2YgZGF0YSwgYW5kIHdlIGhhdmVuJ3QgYWxyZWFkeSBmaW5pc2hlZCBwYXJzaW5nICovCisgICAgICAgICAgICAgICAgICB3aGlsZSAoIWlzX2xhc3QgJiYgKChpbmRleCArIDMpIDwgbWV0YWRhdGFfYmxvY2tzX2xlbikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyID0gbWV0YWRhdGFfYmxvY2tzX2xlbiAtIGluZGV4OworCisgICAgICAgICAgICAgICAgICAgIC8qIGFkZCB0aGUgTUVUQURBVEFfQkxPQ0tfSEVBREVSIHNpemUgdG8gdGhlIHNpZ25hbGxlZCBzaXplICovCisgICAgICAgICAgICAgICAgICAgIGJsb2NrX3NpemUgPSA0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChtZXRhZGF0YV9ibG9ja3NbaW5kZXggKyAxXSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgKG1ldGFkYXRhX2Jsb2Nrc1tpbmRleCArIDJdIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhX2Jsb2Nrc1tpbmRleCArIDNdOworCisgICAgICAgICAgICAgICAgICAgIC8qIGJlIGNhcmVmdWwgbm90IHRvIHJlYWQgb2ZmIGVuZCBvZiBib3ggKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrX3NpemUgPiByZW1haW5kZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlzX2xhc3QgPSBtZXRhZGF0YV9ibG9ja3NbaW5kZXhdID4+IDc7CisKKyAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGJsb2NrX3NpemUpOworCisgICAgICAgICAgICAgICAgICAgIGdzdF9idWZmZXJfZmlsbCAoYmxvY2ssIDAsICZtZXRhZGF0YV9ibG9ja3NbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgZ3N0X3ZhbHVlX3NldF9idWZmZXIgKCZ2YWx1ZSwgYmxvY2spOworICAgICAgICAgICAgICAgICAgICBnc3RfdmFsdWVfYXJyYXlfYXBwZW5kX3ZhbHVlICgmYXJyYXksICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGdfdmFsdWVfcmVzZXQgKCZ2YWx1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYmxvY2spOworCisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IGJsb2NrX3NpemU7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIC8qIG9ubHkgYXBwZW5kIHRoZSBtZXRhZGF0YSBpZiB3ZSBzdWNjZXNzZnVsbHkgcmVhZCBhbGwgb2YgaXQgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChpc19sYXN0KSB7CisgICAgICAgICAgICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChDVVJfU1RSRUFNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmVhbSktPmNhcHMsIDApLCAic3RyZWFtaGVhZGVyIiwgJmFycmF5KTsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkaXNjYXJkaW5nIGFsbCBNRVRBREFUQV9CTE9DS3MgZHVlIHRvIGludmFsaWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgImJsb2NrX3NpemUgJWQgYXQgaWR4ICVkLCByZW0gJWQiLCBibG9ja19zaXplLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlcik7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmYXJyYXkpOworCisgICAgICAgICAgICAgICAgICAvKiBUaGUgc2FtcGxlIHJhdGUgb2J0YWluZWQgZnJvbSB0aGUgc3RzZCBtYXkgbm90IGJlIGFjY3VyYXRlCisgICAgICAgICAgICAgICAgICAgKiBzaW5jZSBpdCBjYW5ub3QgcmVwcmVzZW50IHJhdGVzIGdyZWF0ZXIgdGhhbiA2NTUzNUh6LCBzbworICAgICAgICAgICAgICAgICAgICogb3ZlcnJpZGUgdGhhdCB2YWx1ZSB3aXRoIHRoZSBzYW1wbGUgcmF0ZSBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICogTUVUQURBVEFfQkxPQ0tfU1RSRUFNSU5GTyBibG9jayAqLworICAgICAgICAgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cmF0ZSA9CisgICAgICAgICAgICAgICAgICAgICAgKFFUX1VJTlQzMiAobWV0YWRhdGFfYmxvY2tzICsgMTQpID4+IDEyKSAmIDB4RkZGRkY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBGT1VSQ0Nfc2F3YjoKKyAgICAgICAgICAgIC8qIEZhbGx0aHJvdWdoISAqLworICAgICAgICAgICAgYW1yd2IgPSBUUlVFOworICAgICAgICAgIGNhc2UgRk9VUkNDX3NhbXI6CisgICAgICAgICAgeworICAgICAgICAgICAgZ2ludCBsZW4gPSBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSk7CisKKyAgICAgICAgICAgIGlmIChsZW4gPiAweDI0KSB7CisgICAgICAgICAgICAgIEdzdEJ1ZmZlciAqYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChsZW4gLSAweDI0KTsKKyAgICAgICAgICAgICAgZ3VpbnQgYml0cmF0ZTsKKworICAgICAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgc3RzZF9lbnRyeV9kYXRhICsgMHgyNCwgbGVuIC0gMHgyNCk7CisKKyAgICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSBlbm91Z2ggZGF0YSwgbGV0J3MgdHJ5IHRvIGdldCB0aGUgJ2RhbXInIGF0b20uIFNlZQorICAgICAgICAgICAgICAgKiB0aGUgM0dQUCBjb250YWluZXIgc3BlYyAoMjYuMjQ0KSBmb3IgbW9yZSBkZXRhaWxzLiAqLworICAgICAgICAgICAgICBpZiAoKGxlbiAtIDB4MzQpID4gOCAmJgorICAgICAgICAgICAgICAgICAgKGJpdHJhdGUgPSBxdGRlbXV4X3BhcnNlX2Ftcl9iaXRyYXRlIChidWYsIGFtcndiKSkpIHsKKyAgICAgICAgICAgICAgICBnc3RfdGFnX2xpc3RfYWRkIChzdHJlYW0tPnN0cmVhbV90YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgICAgICAgICAgIEdTVF9UQUdfTUFYSU1VTV9CSVRSQVRFLCBiaXRyYXRlLCBOVUxMKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGVudHJ5LT5jYXBzLAorICAgICAgICAgICAgICAgICAgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIGJ1ZiwgTlVMTCk7CisgICAgICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBGT1VSQ0NfbXA0YToKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBtcDRhIGF0b20gd2l0aHRvdXQgRVNEUzsgQXR0ZW1wdCB0byBidWlsZCBjb2RlYyBkYXRhIGZyb20gYXRvbSAqLworICAgICAgICAgICAgZ2ludCBsZW4gPSBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSk7CisKKyAgICAgICAgICAgIGlmIChsZW4gPj0gMzQpIHsKKyAgICAgICAgICAgICAgZ3VpbnQxNiBzb3VuZF92ZXJzaW9uID0gUVRfVUlOVDE2IChzdHNkX2VudHJ5X2RhdGEgKyAxNik7CisKKyAgICAgICAgICAgICAgaWYgKHNvdW5kX3ZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgICAgIGd1aW50MTYgY2hhbm5lbHMgPSBRVF9VSU5UMTYgKHN0c2RfZW50cnlfZGF0YSArIDI0KTsKKyAgICAgICAgICAgICAgICBndWludDMyIHRpbWVfc2NhbGUgPSBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSArIDMwKTsKKyAgICAgICAgICAgICAgICBndWludDggY29kZWNfZGF0YVsyXTsKKyAgICAgICAgICAgICAgICBHc3RCdWZmZXIgKmJ1ZjsKKyAgICAgICAgICAgICAgICBnaW50IHByb2ZpbGUgPSAyOyAgICAgICAvKiBGSVhNRTogQ2FuIHRoaXMgYmUgZGV0ZXJtaW5lZCBzb21laG93PyBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYW55dGhpbmcgaW4gbXA0YSBhdG9tIHRoYXQgc3BlY2lmaXMgY29tcHJlc3Npb24gKi8KKworICAgICAgICAgICAgICAgIGdpbnQgc2FtcGxlX3JhdGVfaW5kZXggPQorICAgICAgICAgICAgICAgICAgICBnc3RfY29kZWNfdXRpbHNfYWFjX2dldF9pbmRleF9mcm9tX3NhbXBsZV9yYXRlICh0aW1lX3NjYWxlKTsKKworICAgICAgICAgICAgICAgIC8qIGJ1aWxkIEFBQyBjb2RlYyBkYXRhICovCisgICAgICAgICAgICAgICAgY29kZWNfZGF0YVswXSA9IHByb2ZpbGUgPDwgMzsKKyAgICAgICAgICAgICAgICBjb2RlY19kYXRhWzBdIHw9ICgoc2FtcGxlX3JhdGVfaW5kZXggPj4gMSkgJiAweDcpOworICAgICAgICAgICAgICAgIGNvZGVjX2RhdGFbMV0gPSAoc2FtcGxlX3JhdGVfaW5kZXggJiAweDAxKSA8PCA3OworICAgICAgICAgICAgICAgIGNvZGVjX2RhdGFbMV0gfD0gKGNoYW5uZWxzICYgMHhGKSA8PCAzOworCisgICAgICAgICAgICAgICAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgyKTsKKyAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgY29kZWNfZGF0YSwgMik7CisgICAgICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgICAgICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLCBidWYsIE5VTEwpOworICAgICAgICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEZPVVJDQ19scGNtOgorICAgICAgICAgICAgLyogRnVsbHkgaGFuZGxlZCBlbHNld2hlcmUgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAgICAgInVuaGFuZGxlZCB0eXBlICUiIEdTVF9GT1VSQ0NfRk9STUFULCBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEdTVF9JTkZPX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAidHlwZSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpLCBlbnRyeS0+Y2Fwcyk7CisKKyAgICB9IGVsc2UgaWYgKHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0Nfc3RybSkgeworICAgICAgaWYgKGZvdXJjYyA9PSBGT1VSQ0NfcnRzcCkgeworICAgICAgICBzdHJlYW0tPnJlZGlyZWN0X3VyaSA9IHF0ZGVtdXhfZ2V0X3J0c3BfdXJpX2Zyb21faG5kbCAocXRkZW11eCwgbWluZik7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsICJ1bmhhbmRsZWQgc3RyZWFtIHR5cGUgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYykpOworICAgICAgICBnb3RvIHVua25vd25fc3RyZWFtOworICAgICAgfQorICAgICAgZW50cnktPnNhbXBsZWQgPSBUUlVFOworICAgIH0gZWxzZSBpZiAoc3RyZWFtLT5zdWJ0eXBlID09IEZPVVJDQ19zdWJwIHx8IHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0NfdGV4dAorICAgICAgICB8fCBzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3NidGwgfHwgc3RyZWFtLT5zdWJ0eXBlID09IEZPVVJDQ19zdWJ0KSB7CisKKyAgICAgIGVudHJ5LT5zYW1wbGVkID0gVFJVRTsKKyAgICAgIGVudHJ5LT5zcGFyc2UgPSBUUlVFOworCisgICAgICBlbnRyeS0+Y2FwcyA9CisgICAgICAgICAgcXRkZW11eF9zdWJfY2FwcyAocXRkZW11eCwgc3RyZWFtLCBlbnRyeSwgZm91cmNjLCBzdHNkX2VudHJ5X2RhdGEsCisgICAgICAgICAgJmNvZGVjKTsKKyAgICAgIGlmIChjb2RlYykgeworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkIChzdHJlYW0tPnN0cmVhbV90YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgICBHU1RfVEFHX1NVQlRJVExFX0NPREVDLCBjb2RlYywgTlVMTCk7CisgICAgICAgIGdfZnJlZSAoY29kZWMpOworICAgICAgICBjb2RlYyA9IE5VTEw7CisgICAgICB9CisKKyAgICAgIC8qIGh1bnQgZm9yIHNvcnQtb2YgY29kZWMgZGF0YSAqLworICAgICAgc3dpdGNoIChmb3VyY2MpIHsKKyAgICAgICAgY2FzZSBGT1VSQ0NfbXA0czoKKyAgICAgICAgeworICAgICAgICAgIEdOb2RlICptcDRzID0gTlVMTDsKKyAgICAgICAgICBHTm9kZSAqZXNkcyA9IE5VTEw7CisKKyAgICAgICAgICAvKiBsb29rIGZvciBwYWxldHRlIGluIGEgc3RzZC0+bXA0cy0+ZXNkcyBzdWItYXRvbSAqLworICAgICAgICAgIG1wNHMgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHN0c2QsIEZPVVJDQ19tcDRzKTsKKyAgICAgICAgICBpZiAobXA0cykKKyAgICAgICAgICAgIGVzZHMgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKG1wNHMsIEZPVVJDQ19lc2RzKTsKKyAgICAgICAgICBpZiAoZXNkcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAvKiBJbnZhbGlkIFNUU0QgKi8KKyAgICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiU2tpcHBpbmcgaW52YWxpZCBzdHNkOiBubyBlc2RzIGNoaWxkIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBnc3RfcXRkZW11eF9oYW5kbGVfZXNkcyAocXRkZW11eCwgc3RyZWFtLCBlbnRyeSwgZXNkcywKKyAgICAgICAgICAgICAgc3RyZWFtLT5zdHJlYW1fdGFncyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAgICJ1bmhhbmRsZWQgdHlwZSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIEdTVF9JTkZPX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAidHlwZSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpLCBlbnRyeS0+Y2Fwcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGV2ZXJ5dGhpbmcgaW4gMSBzYW1wbGUgKi8KKyAgICAgIGVudHJ5LT5zYW1wbGVkID0gVFJVRTsKKworICAgICAgZW50cnktPmNhcHMgPQorICAgICAgICAgIHF0ZGVtdXhfZ2VuZXJpY19jYXBzIChxdGRlbXV4LCBzdHJlYW0sIGVudHJ5LCBmb3VyY2MsIHN0c2RfZW50cnlfZGF0YSwKKyAgICAgICAgICAmY29kZWMpOworCisgICAgICBpZiAoZW50cnktPmNhcHMgPT0gTlVMTCkKKyAgICAgICAgZ290byB1bmtub3duX3N0cmVhbTsKKworICAgICAgaWYgKGNvZGVjKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHN0cmVhbS0+c3RyZWFtX3RhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgICAgICAgIEdTVF9UQUdfU1VCVElUTEVfQ09ERUMsIGNvZGVjLCBOVUxMKTsKKyAgICAgICAgZ19mcmVlIChjb2RlYyk7CisgICAgICAgIGNvZGVjID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwcm9tb3RlIHRvIHNhbXBsZWQgZm9ybWF0ICovCisgICAgaWYgKGVudHJ5LT5mb3VyY2MgPT0gRk9VUkNDX3NhbXIpIHsKKyAgICAgIC8qIGZvcmNlIG1vbm8gODAwMCBIeiBmb3IgQU1SICovCisgICAgICBlbnRyeS0+c2FtcGxlZCA9IFRSVUU7CisgICAgICBlbnRyeS0+bl9jaGFubmVscyA9IDE7CisgICAgICBlbnRyeS0+cmF0ZSA9IDgwMDA7CisgICAgfSBlbHNlIGlmIChlbnRyeS0+Zm91cmNjID09IEZPVVJDQ19zYXdiKSB7CisgICAgICAvKiBmb3JjZSBtb25vIDE2MDAwIEh6IGZvciBBTVItV0IgKi8KKyAgICAgIGVudHJ5LT5zYW1wbGVkID0gVFJVRTsKKyAgICAgIGVudHJ5LT5uX2NoYW5uZWxzID0gMTsKKyAgICAgIGVudHJ5LT5yYXRlID0gMTYwMDA7CisgICAgfSBlbHNlIGlmIChlbnRyeS0+Zm91cmNjID09IEZPVVJDQ19tcDRhKSB7CisgICAgICBlbnRyeS0+c2FtcGxlZCA9IFRSVUU7CisgICAgfQorCisKKyAgICBzdHNkX2VudHJ5X2RhdGEgKz0gbGVuOworICAgIHJlbWFpbmluZ19zdHNkX2xlbiAtPSBsZW47CisKKyAgfQorCisgIC8qIGNvbGxlY3Qgc2FtcGxlIGluZm9ybWF0aW9uICovCisgIGlmICghcXRkZW11eF9zdGJsX2luaXQgKHF0ZGVtdXgsIHN0cmVhbSwgc3RibCkpCisgICAgZ290byBzYW1wbGVzX2ZhaWxlZDsKKworICBpZiAocXRkZW11eC0+ZnJhZ21lbnRlZCkgeworICAgIGd1aW50NjQgb2Zmc2V0OworCisgICAgLyogbmVlZCBhbGwgbW9vdiBzYW1wbGVzIGFzIGJhc2lzOyBwcm9iYWJseSBub3QgbWFueSBpZiBhbnkgYXQgYWxsICovCisgICAgLyogcHJldmVudCBtb29mIHBhcnNpbmcgdGFraW5nIG9mIGF0IHRoaXMgdGltZSAqLworICAgIG9mZnNldCA9IHF0ZGVtdXgtPm1vb2Zfb2Zmc2V0OworICAgIHF0ZGVtdXgtPm1vb2Zfb2Zmc2V0ID0gMDsKKyAgICBpZiAoc3RyZWFtLT5uX3NhbXBsZXMgJiYKKyAgICAgICAgIXF0ZGVtdXhfcGFyc2Vfc2FtcGxlcyAocXRkZW11eCwgc3RyZWFtLCBzdHJlYW0tPm5fc2FtcGxlcyAtIDEpKSB7CisgICAgICBxdGRlbXV4LT5tb29mX29mZnNldCA9IG9mZnNldDsKKyAgICAgIGdvdG8gc2FtcGxlc19mYWlsZWQ7CisgICAgfQorICAgIHF0ZGVtdXgtPm1vb2Zfb2Zmc2V0ID0gMDsKKyAgICAvKiBtb3ZpZSBkdXJhdGlvbiBtb3JlIHJlbGlhYmxlIGluIHRoaXMgY2FzZSAoZS5nLiBtZWhkKSAqLworICAgIGlmIChxdGRlbXV4LT5zZWdtZW50LmR1cmF0aW9uICYmCisgICAgICAgIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChxdGRlbXV4LT5zZWdtZW50LmR1cmF0aW9uKSkKKyAgICAgIHN0cmVhbS0+ZHVyYXRpb24gPQorICAgICAgICAgIEdTVFRJTUVfVE9fUVRTVFJFQU1USU1FIChzdHJlYW0sIHF0ZGVtdXgtPnNlZ21lbnQuZHVyYXRpb24pOworICB9CisKKyAgLyogY29uZmlndXJlIHNlZ21lbnRzICovCisgIGlmICghcXRkZW11eF9wYXJzZV9zZWdtZW50cyAocXRkZW11eCwgc3RyZWFtLCB0cmFrKSkKKyAgICBnb3RvIHNlZ21lbnRzX2ZhaWxlZDsKKworICAvKiBhZGQgc29tZSBsYW5ndWFnZSB0YWcsIGlmIHVzZWZ1bCAqLworICBpZiAoc3RyZWFtLT5sYW5nX2lkWzBdICE9ICdcMCcgJiYgc3RyY21wIChzdHJlYW0tPmxhbmdfaWQsICJ1bmsiKSAmJgorICAgICAgc3RyY21wIChzdHJlYW0tPmxhbmdfaWQsICJ1bmQiKSkgeworICAgIGNvbnN0IGdjaGFyICpsYW5nX2NvZGU7CisKKyAgICAvKiBjb252ZXJ0IElTTyA2MzktMiBjb2RlIHRvIElTTyA2MzktMSAqLworICAgIGxhbmdfY29kZSA9IGdzdF90YWdfZ2V0X2xhbmd1YWdlX2NvZGUgKHN0cmVhbS0+bGFuZ19pZCk7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAoc3RyZWFtLT5zdHJlYW1fdGFncywgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICBHU1RfVEFHX0xBTkdVQUdFX0NPREUsIChsYW5nX2NvZGUpID8gbGFuZ19jb2RlIDogc3RyZWFtLT5sYW5nX2lkLCBOVUxMKTsKKyAgfQorCisgIC8qIENoZWNrIGZvciBVRFRBIHRhZ3MgKi8KKyAgaWYgKCh1ZHRhID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlICh0cmFrLCBGT1VSQ0NfdWR0YSkpKSB7CisgICAgcXRkZW11eF9wYXJzZV91ZHRhIChxdGRlbXV4LCBzdHJlYW0tPnN0cmVhbV90YWdzLCB1ZHRhKTsKKyAgfQorCisgIC8qIG5vdyB3ZSBhcmUgcmVhZHkgdG8gYWRkIHRoZSBzdHJlYW0gKi8KKyAgaWYgKHF0ZGVtdXgtPm5fc3RyZWFtcyA+PSBHU1RfUVRERU1VWF9NQVhfU1RSRUFNUykKKyAgICBnb3RvIHRvb19tYW55X3N0cmVhbXM7CisKKyAgaWYgKCFxdGRlbXV4LT5nb3RfbW9vdikgeworICAgIHF0ZGVtdXgtPnN0cmVhbXNbcXRkZW11eC0+bl9zdHJlYW1zXSA9IHN0cmVhbTsKKyAgICBxdGRlbXV4LT5uX3N0cmVhbXMrKzsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAibl9zdHJlYW1zIGlzIG5vdyAlZCIsIHF0ZGVtdXgtPm5fc3RyZWFtcyk7CisgIH0KKworICByZXR1cm4gVFJVRTsKKworLyogRVJST1JTICovCitza2lwX3RyYWNrOgorICB7CisgICAgR1NUX0lORk9fT0JKRUNUIChxdGRlbXV4LCAic2tpcCBkaXNhYmxlZCB0cmFjayIpOworICAgIGlmIChuZXdfc3RyZWFtKQorICAgICAgZ3N0X3F0ZGVtdXhfc3RyZWFtX2ZyZWUgKHF0ZGVtdXgsIHN0cmVhbSk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KK2NvcnJ1cHRfZmlsZToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdGRlbXV4LCBTVFJFQU0sIERFTVVYLAorICAgICAgICAoXygiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIikpLCAoTlVMTCkpOworICAgIGlmIChuZXdfc3RyZWFtKQorICAgICAgZ3N0X3F0ZGVtdXhfc3RyZWFtX2ZyZWUgKHF0ZGVtdXgsIHN0cmVhbSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitlcnJvcl9lbmNyeXB0ZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRkZW11eCwgU1RSRUFNLCBERUNSWVBULCAoTlVMTCksIChOVUxMKSk7CisgICAgaWYgKG5ld19zdHJlYW0pCisgICAgICBnc3RfcXRkZW11eF9zdHJlYW1fZnJlZSAocXRkZW11eCwgc3RyZWFtKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3NhbXBsZXNfZmFpbGVkOgorc2VnbWVudHNfZmFpbGVkOgorICB7CisgICAgLyogd2UgcG9zdGVkIGFuIGVycm9yIGFscmVhZHkgKi8KKyAgICAvKiBmcmVlIHN0Ymwgc3ViLWF0b21zICovCisgICAgZ3N0X3F0ZGVtdXhfc3RibF9mcmVlIChzdHJlYW0pOworICAgIGlmIChuZXdfc3RyZWFtKQorICAgICAgZ3N0X3F0ZGVtdXhfc3RyZWFtX2ZyZWUgKHF0ZGVtdXgsIHN0cmVhbSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitleGlzdGluZ19zdHJlYW06CisgIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsICJzdHJlYW0gd2l0aCB0cmFjayBpZCAlaSBhbHJlYWR5IGV4aXN0cyIsCisgICAgICAgIHRyYWNrX2lkKTsKKyAgICBpZiAobmV3X3N0cmVhbSkKKyAgICAgIGdzdF9xdGRlbXV4X3N0cmVhbV9mcmVlIChxdGRlbXV4LCBzdHJlYW0pOworICAgIHJldHVybiBUUlVFOworICB9Cit1bmtub3duX3N0cmVhbToKKyAgeworICAgIEdTVF9JTkZPX09CSkVDVCAocXRkZW11eCwgInVua25vd24gc3VidHlwZSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChzdHJlYW0tPnN1YnR5cGUpKTsKKyAgICBpZiAobmV3X3N0cmVhbSkKKyAgICAgIGdzdF9xdGRlbXV4X3N0cmVhbV9mcmVlIChxdGRlbXV4LCBzdHJlYW0pOworICAgIHJldHVybiBUUlVFOworICB9Cit0b29fbWFueV9zdHJlYW1zOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocXRkZW11eCwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgKF8oIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiKSwKKyAgICAgICAgICAgIEdTVF9RVERFTVVYX01BWF9TVFJFQU1TKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorfQorCisvKiBJZiB3ZSBjYW4gZXN0aW1hdGUgdGhlIG92ZXJhbGwgYml0cmF0ZSwgYW5kIGRvbid0IGhhdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgKiBzdHJlYW0gYml0cmF0ZSBmb3IgZXhhY3RseSBvbmUgc3RyZWFtLCB0aGlzIGd1ZXNzZXMgdGhlIHN0cmVhbSBiaXRyYXRlIGFzCisgKiB0aGUgb3ZlcmFsbCBiaXRyYXRlIG1pbnVzIHRoZSBzdW0gb2YgdGhlIGJpdHJhdGVzIG9mIGFsbCBvdGhlciBzdHJlYW1zLiBUaGlzCisgKiBzaG91bGQgYmUgdXNlZnVsIGZvciB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgd2UgaGF2ZSBvbmUgYXVkaW8gYW5kIG9uZSB2aWRlbworICogc3RyZWFtIGFuZCBjYW4gZXN0aW1hdGUgdGhlIGJpdHJhdGUgb2Ygb25lLCBidXQgbm90IHRoZSBvdGhlci4gKi8KK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9ndWVzc19iaXRyYXRlIChHc3RRVERlbXV4ICogcXRkZW11eCkKK3sKKyAgUXREZW11eFN0cmVhbSAqc3RyZWFtID0gTlVMTDsKKyAgZ2ludDY0IHNpemUsIHN5c19iaXRyYXRlLCBzdW1fYml0cmF0ZSA9IDA7CisgIEdzdENsb2NrVGltZSBkdXJhdGlvbjsKKyAgZ2ludCBpOworICBndWludCBiaXRyYXRlOworCisgIGlmIChxdGRlbXV4LT5mcmFnbWVudGVkKQorICAgIHJldHVybjsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiTG9va2luZyBmb3Igc3RyZWFtcyB3aXRoIHVua25vd24gYml0cmF0ZSIpOworCisgIGlmICghZ3N0X3BhZF9wZWVyX3F1ZXJ5X2R1cmF0aW9uIChxdGRlbXV4LT5zaW5rcGFkLCBHU1RfRk9STUFUX0JZVEVTLCAmc2l6ZSkKKyAgICAgIHx8IHNpemUgPD0gMCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICJTaXplIGluIGJ5dGVzIG9mIHRoZSBzdHJlYW0gbm90IGtub3duIC0gYmFpbGluZyIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFN1YnRyYWN0IHRoZSBoZWFkZXIgc2l6ZSAqLworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiVG90YWwgc2l6ZSAlIiBHX0dJTlQ2NF9GT1JNQVQgIiwgaGVhZGVyIHNpemUgJXUiLAorICAgICAgc2l6ZSwgcXRkZW11eC0+aGVhZGVyX3NpemUpOworCisgIGlmIChzaXplIDwgcXRkZW11eC0+aGVhZGVyX3NpemUpCisgICAgcmV0dXJuOworCisgIHNpemUgPSBzaXplIC0gcXRkZW11eC0+aGVhZGVyX3NpemU7CisKKyAgaWYgKCFnc3RfcXRkZW11eF9nZXRfZHVyYXRpb24gKHF0ZGVtdXgsICZkdXJhdGlvbikpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiU3RyZWFtIGR1cmF0aW9uIG5vdCBrbm93biAtIGJhaWxpbmciKTsKKyAgICByZXR1cm47CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgcXRkZW11eC0+bl9zdHJlYW1zOyBpKyspIHsKKyAgICBzd2l0Y2ggKHF0ZGVtdXgtPnN0cmVhbXNbaV0tPnN1YnR5cGUpIHsKKyAgICAgIGNhc2UgRk9VUkNDX3NvdW46CisgICAgICBjYXNlIEZPVVJDQ192aWRlOgorICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiY2hlY2tpbmcgYml0cmF0ZSBmb3IgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgICAgICBDVVJfU1RSRUFNIChxdGRlbXV4LT5zdHJlYW1zW2ldKS0+Y2Fwcyk7CisgICAgICAgIC8qIHJldHJpZXZlIGJpdHJhdGUsIHByZWZlciBhdmcgdGhlbiBtYXggKi8KKyAgICAgICAgYml0cmF0ZSA9IDA7CisgICAgICAgIGlmIChxdGRlbXV4LT5zdHJlYW1zW2ldLT5zdHJlYW1fdGFncykgeworICAgICAgICAgIGlmIChnc3RfdGFnX2xpc3RfZ2V0X3VpbnQgKHF0ZGVtdXgtPnN0cmVhbXNbaV0tPnN0cmVhbV90YWdzLAorICAgICAgICAgICAgICAgICAgR1NUX1RBR19NQVhJTVVNX0JJVFJBVEUsICZiaXRyYXRlKSkKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJtYXgtYml0cmF0ZTogJXUiLCBiaXRyYXRlKTsKKyAgICAgICAgICBpZiAoZ3N0X3RhZ19saXN0X2dldF91aW50IChxdGRlbXV4LT5zdHJlYW1zW2ldLT5zdHJlYW1fdGFncywKKyAgICAgICAgICAgICAgICAgIEdTVF9UQUdfTk9NSU5BTF9CSVRSQVRFLCAmYml0cmF0ZSkpCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAibm9taW5hbC1iaXRyYXRlOiAldSIsIGJpdHJhdGUpOworICAgICAgICAgIGlmIChnc3RfdGFnX2xpc3RfZ2V0X3VpbnQgKHF0ZGVtdXgtPnN0cmVhbXNbaV0tPnN0cmVhbV90YWdzLAorICAgICAgICAgICAgICAgICAgR1NUX1RBR19CSVRSQVRFLCAmYml0cmF0ZSkpCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiYml0cmF0ZTogJXUiLCBiaXRyYXRlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYml0cmF0ZSkKKyAgICAgICAgICBzdW1fYml0cmF0ZSArPSBiaXRyYXRlOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpZiAoc3RyZWFtKSB7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICAgICAgICI+MSBzdHJlYW0gd2l0aCB1bmtub3duIGJpdHJhdGUgLSBiYWlsaW5nIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBzdHJlYW0gPSBxdGRlbXV4LT5zdHJlYW1zW2ldOworICAgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIEZvciBvdGhlciBzdWJ0eXBlcywgd2UgYXNzdW1lIG5vIHNpZ25pZmljYW50IGltcGFjdCBvbiBiaXRyYXRlICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmICghc3RyZWFtKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIkFsbCBzdHJlYW0gYml0cmF0ZXMgYXJlIGtub3duIik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3lzX2JpdHJhdGUgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHNpemUsIEdTVF9TRUNPTkQgKiA4LCBkdXJhdGlvbik7CisKKyAgaWYgKHN5c19iaXRyYXRlIDwgc3VtX2JpdHJhdGUpIHsKKyAgICAvKiBUaGlzIGNhbiBoYXBwZW4sIHNpbmNlIHN1bV9iaXRyYXRlIG1pZ2h0IGJlIGRlcml2ZWQgZnJvbSBtYXhpbXVtCisgICAgICogYml0cmF0ZXMgYW5kIG5vdCBhdmVyYWdlIGJpdHJhdGVzICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgIlN5c3RlbSBiaXRyYXRlIGxlc3MgdGhhbiBzdW0gYml0cmF0ZSAtIGJhaWxpbmciKTsKKyAgICByZXR1cm47CisgIH0KKworICBiaXRyYXRlID0gc3lzX2JpdHJhdGUgLSBzdW1fYml0cmF0ZTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIlN5c3RlbSBiaXRyYXRlID0gJSIgR19HSU5UNjRfRk9STUFUCisgICAgICAiLCBTdHJlYW0gYml0cmF0ZSA9ICV1Iiwgc3lzX2JpdHJhdGUsIGJpdHJhdGUpOworCisgIGlmICghc3RyZWFtLT5zdHJlYW1fdGFncykKKyAgICBzdHJlYW0tPnN0cmVhbV90YWdzID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZWxzZQorICAgIHN0cmVhbS0+c3RyZWFtX3RhZ3MgPSBnc3RfdGFnX2xpc3RfbWFrZV93cml0YWJsZSAoc3RyZWFtLT5zdHJlYW1fdGFncyk7CisKKyAgZ3N0X3RhZ19saXN0X2FkZCAoc3RyZWFtLT5zdHJlYW1fdGFncywgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgR1NUX1RBR19CSVRSQVRFLCBiaXRyYXRlLCBOVUxMKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK3F0ZGVtdXhfcHJlcGFyZV9zdHJlYW1zIChHc3RRVERlbXV4ICogcXRkZW11eCkKK3sKKyAgZ2ludCBpOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJwcmVwYXJlIHN0cmVhbXMiKTsKKworICBmb3IgKGkgPSAwOyByZXQgPT0gR1NUX0ZMT1dfT0sgJiYgaSA8IHF0ZGVtdXgtPm5fc3RyZWFtczsgaSsrKSB7CisgICAgUXREZW11eFN0cmVhbSAqc3RyZWFtID0gcXRkZW11eC0+c3RyZWFtc1tpXTsKKyAgICBndWludDMyIHNhbXBsZV9udW0gPSAwOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInN0cmVhbSAlZCwgaWQgJWQsIGZvdXJjYyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgaSwgc3RyZWFtLT50cmFja19pZCwgR1NUX0ZPVVJDQ19BUkdTIChDVVJfU1RSRUFNIChzdHJlYW0pLT5mb3VyY2MpKTsKKworICAgIGlmIChxdGRlbXV4LT5mcmFnbWVudGVkKSB7CisgICAgICAvKiBuZWVkIGFsbCBtb292IHNhbXBsZXMgZmlyc3QgKi8KKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocXRkZW11eCk7CisgICAgICB3aGlsZSAoc3RyZWFtLT5uX3NhbXBsZXMgPT0gMCkKKyAgICAgICAgaWYgKChyZXQgPSBxdGRlbXV4X2FkZF9mcmFnbWVudGVkX3NhbXBsZXMgKHF0ZGVtdXgpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChxdGRlbXV4KTsKKyAgICB9IGVsc2UgeworICAgICAgLyogZGlzY2FyZCBhbnkgc3RyYXkgbW9vZiAqLworICAgICAgcXRkZW11eC0+bW9vZl9vZmZzZXQgPSAwOworICAgIH0KKworICAgIC8qIHByZXBhcmUgYnJha2luZyAqLworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfRVJST1IpCisgICAgICByZXQgPSBHU1RfRkxPV19PSzsKKworICAgIC8qIGluIHB1bGwgbW9kZSwgd2Ugc2hvdWxkIGhhdmUgcGFyc2VkIHNvbWUgc2FtcGxlIGluZm8gYnkgbm93OworICAgICAqIGFuZCBxdWl0ZSBzb21lIGNvZGUgd2lsbCBub3QgaGFuZGxlIG5vIHNhbXBsZXMuCisgICAgICogaW4gcHVzaCBtb2RlLCB3ZSdsbCBqdXN0IGhhdmUgdG8gZGVhbCB3aXRoIGl0ICovCisgICAgaWYgKEdfVU5MSUtFTFkgKHF0ZGVtdXgtPnB1bGxiYXNlZCAmJiAhc3RyZWFtLT5uX3NhbXBsZXMpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAibm8gc2FtcGxlcyBmb3Igc3RyZWFtOyBkaXNjYXJkaW5nIik7CisgICAgICBnc3RfcXRkZW11eF9yZW1vdmVfc3RyZWFtIChxdGRlbXV4LCBpKTsKKyAgICAgIGktLTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIHBhcnNlIHRoZSBpbml0aWFsIHNhbXBsZSBmb3IgdXNlIGluIHNldHRpbmcgdGhlIGZyYW1lIHJhdGUgY2FwICovCisgICAgd2hpbGUgKHNhbXBsZV9udW0gPT0gMCAmJiBzYW1wbGVfbnVtIDwgc3RyZWFtLT5uX3NhbXBsZXMpIHsKKyAgICAgIGlmICghcXRkZW11eF9wYXJzZV9zYW1wbGVzIChxdGRlbXV4LCBzdHJlYW0sIHNhbXBsZV9udW0pKQorICAgICAgICBicmVhazsKKyAgICAgICsrc2FtcGxlX251bTsKKyAgICB9CisgICAgaWYgKHN0cmVhbS0+bl9zYW1wbGVzID4gMCAmJiBzdHJlYW0tPnN0YmxfaW5kZXggPj0gMCkgeworICAgICAgc3RyZWFtLT5maXJzdF9kdXJhdGlvbiA9IHN0cmVhbS0+c2FtcGxlc1swXS5kdXJhdGlvbjsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAic3RyZWFtICVkIGZpcnN0IGR1cmF0aW9uICV1IiwKKyAgICAgICAgICBzdHJlYW0tPnRyYWNrX2lkLCBzdHJlYW0tPmZpcnN0X2R1cmF0aW9uKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorcXRkZW11eF9leHBvc2Vfc3RyZWFtcyAoR3N0UVREZW11eCAqIHF0ZGVtdXgpCit7CisgIGdpbnQgaTsKKyAgR1NMaXN0ICpvbGRwYWRzID0gTlVMTDsKKyAgR1NMaXN0ICppdGVyOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJleHBvc2luZyBzdHJlYW1zIik7CisKKyAgZm9yIChpID0gMDsgaSA8IHF0ZGVtdXgtPm5fc3RyZWFtczsgaSsrKSB7CisgICAgUXREZW11eFN0cmVhbSAqc3RyZWFtID0gcXRkZW11eC0+c3RyZWFtc1tpXTsKKyAgICBHc3RQYWQgKm9sZHBhZCA9IHN0cmVhbS0+cGFkOworICAgIEdzdFRhZ0xpc3QgKmxpc3Q7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic3RyZWFtICVkLCBpZCAlZCwgZm91cmNjICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICBpLCBzdHJlYW0tPnRyYWNrX2lkLCBHU1RfRk9VUkNDX0FSR1MgKENVUl9TVFJFQU0gKHN0cmVhbSktPmZvdXJjYykpOworCisgICAgaWYgKChzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3RleHQgfHwgc3RyZWFtLT5zdWJ0eXBlID09IEZPVVJDQ19zYnRsKSAmJgorICAgICAgICBzdHJlYW0tPnRyYWNrX2lkID09IHF0ZGVtdXgtPmNoYXB0ZXJzX3RyYWNrX2lkKSB7CisgICAgICAvKiBUT0RPIC0gcGFyc2UgY2hhcHRlcnMgdHJhY2sgYW5kIGV4cG9zZSBpdCBhcyBHc3RUb2M7IEZvciBub3cganVzdCBpZ25vcmUgaXQKKyAgICAgICAgIHNvIHRoYXQgaXQgZG9lc24ndCBsb29rIGxpa2UgYSBzdWJ0aXRsZSB0cmFjayAqLworICAgICAgZ3N0X3F0ZGVtdXhfcmVtb3ZlX3N0cmVhbSAocXRkZW11eCwgaSk7CisgICAgICBpLS07CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvKiBub3cgd2UgaGF2ZSBhbGwgaW5mbyBhbmQgY2FuIGV4cG9zZSAqLworICAgIGxpc3QgPSBzdHJlYW0tPnN0cmVhbV90YWdzOworICAgIHN0cmVhbS0+c3RyZWFtX3RhZ3MgPSBOVUxMOworICAgIGlmIChvbGRwYWQpCisgICAgICBvbGRwYWRzID0gZ19zbGlzdF9wcmVwZW5kIChvbGRwYWRzLCBvbGRwYWQpOworICAgIGlmICghZ3N0X3F0ZGVtdXhfYWRkX3N0cmVhbSAocXRkZW11eCwgc3RyZWFtLCBsaXN0KSkKKyAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIGdzdF9xdGRlbXV4X2d1ZXNzX2JpdHJhdGUgKHF0ZGVtdXgpOworCisgIGdzdF9lbGVtZW50X25vX21vcmVfcGFkcyAoR1NUX0VMRU1FTlRfQ0FTVCAocXRkZW11eCkpOworCisgIGZvciAoaXRlciA9IG9sZHBhZHM7IGl0ZXI7IGl0ZXIgPSBnX3NsaXN0X25leHQgKGl0ZXIpKSB7CisgICAgR3N0UGFkICpvbGRwYWQgPSBpdGVyLT5kYXRhOworICAgIEdzdEV2ZW50ICpldmVudDsKKworICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19lb3MgKCk7CisgICAgaWYgKHF0ZGVtdXgtPnNlZ21lbnRfc2VxbnVtICE9IEdTVF9TRVFOVU1fSU5WQUxJRCkKKyAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChldmVudCwgcXRkZW11eC0+c2VnbWVudF9zZXFudW0pOworCisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChvbGRwYWQsIGV2ZW50KTsKKyAgICBnc3RfcGFkX3NldF9hY3RpdmUgKG9sZHBhZCwgRkFMU0UpOworICAgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKEdTVF9FTEVNRU5UIChxdGRlbXV4KSwgb2xkcGFkKTsKKyAgICBnc3RfZmxvd19jb21iaW5lcl9yZW1vdmVfcGFkIChxdGRlbXV4LT5mbG93Y29tYmluZXIsIG9sZHBhZCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAob2xkcGFkKTsKKyAgfQorCisgIC8qIGNoZWNrIGlmIHdlIHNob3VsZCBwb3N0IGEgcmVkaXJlY3QgaW4gY2FzZSB0aGVyZSBpcyBhIHNpbmdsZSB0cmFrCisgICAqIGFuZCBpdCBpcyBhIHJlZGlyZWN0aW5nIHRyYWsgKi8KKyAgaWYgKHF0ZGVtdXgtPm5fc3RyZWFtcyA9PSAxICYmIHF0ZGVtdXgtPnN0cmVhbXNbMF0tPnJlZGlyZWN0X3VyaSAhPSBOVUxMKSB7CisgICAgR3N0TWVzc2FnZSAqbTsKKworICAgIEdTVF9JTkZPX09CSkVDVCAocXRkZW11eCwgIklzc3VpbmcgYSByZWRpcmVjdCBkdWUgdG8gYSBzaW5nbGUgdHJhY2sgd2l0aCAiCisgICAgICAgICJhbiBleHRlcm5hbCBjb250ZW50Iik7CisgICAgbSA9IGdzdF9tZXNzYWdlX25ld19lbGVtZW50IChHU1RfT0JKRUNUX0NBU1QgKHF0ZGVtdXgpLAorICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoInJlZGlyZWN0IiwKKyAgICAgICAgICAgICJuZXctbG9jYXRpb24iLCBHX1RZUEVfU1RSSU5HLCBxdGRlbXV4LT5zdHJlYW1zWzBdLT5yZWRpcmVjdF91cmksCisgICAgICAgICAgICBOVUxMKSk7CisgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChxdGRlbXV4KSwgbSk7CisgICAgcXRkZW11eC0+cG9zdGVkX3JlZGlyZWN0ID0gVFJVRTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBxdGRlbXV4LT5uX3N0cmVhbXM7IGkrKykgeworICAgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbSA9IHF0ZGVtdXgtPnN0cmVhbXNbaV07CisKKyAgICBxdGRlbXV4X2RvX2FsbG9jYXRpb24gKHF0ZGVtdXgsIHN0cmVhbSk7CisgIH0KKworICBxdGRlbXV4LT5leHBvc2VkID0gVFJVRTsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCisvKiBjaGVjayBpZiBtYWpvciBvciBjb21wYXRpYmxlIGJyYW5kIGlzIDNHUCAqLworc3RhdGljIGlubGluZSBnYm9vbGVhbgorcXRkZW11eF9pc19icmFuZF8zZ3AgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBnYm9vbGVhbiBtYWpvcikKK3sKKyAgaWYgKG1ham9yKSB7CisgICAgcmV0dXJuICgocXRkZW11eC0+bWFqb3JfYnJhbmQgJiBHU1RfTUFLRV9GT1VSQ0MgKDI1NSwgMjU1LCAwLCAwKSkgPT0KKyAgICAgICAgRk9VUkNDXzNnX18pOworICB9IGVsc2UgaWYgKHF0ZGVtdXgtPmNvbXBfYnJhbmRzICE9IE5VTEwpIHsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBndWludDggKmRhdGE7CisgICAgZ3NpemUgc2l6ZTsKKyAgICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKworICAgIGdzdF9idWZmZXJfbWFwIChxdGRlbXV4LT5jb21wX2JyYW5kcywgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBkYXRhID0gbWFwLmRhdGE7CisgICAgc2l6ZSA9IG1hcC5zaXplOworICAgIHdoaWxlIChzaXplID49IDQpIHsKKyAgICAgIHJlcyA9IHJlcyB8fCAoKFFUX0ZPVVJDQyAoZGF0YSkgJiBHU1RfTUFLRV9GT1VSQ0MgKDI1NSwgMjU1LCAwLCAwKSkgPT0KKyAgICAgICAgICBGT1VSQ0NfM2dfXyk7CisgICAgICBkYXRhICs9IDQ7CisgICAgICBzaXplIC09IDQ7CisgICAgfQorICAgIGdzdF9idWZmZXJfdW5tYXAgKHF0ZGVtdXgtPmNvbXBfYnJhbmRzLCAmbWFwKTsKKyAgICByZXR1cm4gcmVzOworICB9IGVsc2UgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKiBjaGVjayBpZiB0YWcgaXMgYSBzcGVjJ2VkIDNHUCB0YWcga2V5d29yZCBzdG9yaW5nIGEgc3RyaW5nICovCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitxdGRlbXV4X2lzX3N0cmluZ190YWdfM2dwIChHc3RRVERlbXV4ICogcXRkZW11eCwgZ3VpbnQzMiBmb3VyY2MpCit7CisgIHJldHVybiBmb3VyY2MgPT0gRk9VUkNDX2NwcnQgfHwgZm91cmNjID09IEZPVVJDQ19nbnJlIHx8IGZvdXJjYyA9PSBGT1VSQ0NfdGl0bAorICAgICAgfHwgZm91cmNjID09IEZPVVJDQ19kc2NwIHx8IGZvdXJjYyA9PSBGT1VSQ0NfcGVyZiB8fCBmb3VyY2MgPT0gRk9VUkNDX2F1dGgKKyAgICAgIHx8IGZvdXJjYyA9PSBGT1VSQ0NfYWxibTsKK30KKworc3RhdGljIHZvaWQKK3F0ZGVtdXhfdGFnX2FkZF9sb2NhdGlvbiAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdFRhZ0xpc3QgKiB0YWdsaXN0LAorICAgIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqZHVtbXksIEdOb2RlICogbm9kZSkKK3sKKyAgY29uc3QgZ2NoYXIgKmVudl92YXJzW10gPSB7ICJHU1RfUVRfVEFHX0VOQ09ESU5HIiwgIkdTVF9UQUdfRU5DT0RJTkciLCBOVUxMIH07CisgIGludCBvZmZzZXQ7CisgIGNoYXIgKm5hbWU7CisgIGdjaGFyICpkYXRhOworICBnZG91YmxlIGxvbmdpdHVkZSwgbGF0aXR1ZGUsIGFsdGl0dWRlOworICBnaW50IGxlbjsKKworICBsZW4gPSBRVF9VSU5UMzIgKG5vZGUtPmRhdGEpOworICBpZiAobGVuIDw9IDE0KQorICAgIGdvdG8gc2hvcnRfcmVhZDsKKworICBkYXRhID0gbm9kZS0+ZGF0YTsKKyAgb2Zmc2V0ID0gMTQ7CisKKyAgLyogVE9ETzogbGFuZ3VhZ2UgY29kZSBza2lwcGVkICovCisKKyAgbmFtZSA9IGdzdF90YWdfZnJlZWZvcm1fc3RyaW5nX3RvX3V0ZjggKGRhdGEgKyBvZmZzZXQsIC0xLCBlbnZfdmFycyk7CisKKyAgaWYgKCFuYW1lKSB7CisgICAgLyogZG8gbm90IGFsYXJtIGluIHRyaXZpYWwgY2FzZSwgYnV0IGJhaWwgb3V0IG90aGVyd2lzZSAqLworICAgIGlmICgqKGRhdGEgKyBvZmZzZXQpICE9IDApIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJmYWlsZWQgdG8gY29udmVydCAlcyB0YWcgdG8gVVRGLTgsICIKKyAgICAgICAgICAiZ2l2aW5nIHVwIiwgdGFnKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICBHU1RfVEFHX0dFT19MT0NBVElPTl9OQU1FLCBuYW1lLCBOVUxMKTsKKyAgICBvZmZzZXQgKz0gc3RybGVuIChuYW1lKTsKKyAgICBnX2ZyZWUgKG5hbWUpOworICB9CisKKyAgaWYgKGxlbiA8IG9mZnNldCArIDIgKyA0ICsgNCArIDQpCisgICAgZ290byBzaG9ydF9yZWFkOworCisgIC8qICsxICsxID0gc2tpcCBudWxsLXRlcm1pbmF0b3IgYW5kIGxvY2F0aW9uIHJvbGUgYnl0ZSAqLworICBvZmZzZXQgKz0gMSArIDE7CisgIC8qIHRhYmxlIGluIHNwZWMgc2F5cyB1bnNpZ25lZCwgc2VtYW50aWNzIHNheSBuZWdhdGl2ZSBoYXMgbWVhbmluZyAuLi4gKi8KKyAgbG9uZ2l0dWRlID0gUVRfU0ZQMzIgKGRhdGEgKyBvZmZzZXQpOworCisgIG9mZnNldCArPSA0OworICBsYXRpdHVkZSA9IFFUX1NGUDMyIChkYXRhICsgb2Zmc2V0KTsKKworICBvZmZzZXQgKz0gNDsKKyAgYWx0aXR1ZGUgPSBRVF9TRlAzMiAoZGF0YSArIG9mZnNldCk7CisKKyAgLyogb25lIGludmFsaWQgbWVhbnMgYWxsIGFyZSBpbnZhbGlkICovCisgIGlmIChsb25naXR1ZGUgPj0gLTE4MC4wICYmIGxvbmdpdHVkZSA8PSAxODAuMCAmJgorICAgICAgbGF0aXR1ZGUgPj0gLTkwLjAgJiYgbGF0aXR1ZGUgPD0gOTAuMCkgeworICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgICAgR1NUX1RBR19HRU9fTE9DQVRJT05fTEFUSVRVREUsIGxhdGl0dWRlLAorICAgICAgICBHU1RfVEFHX0dFT19MT0NBVElPTl9MT05HSVRVREUsIGxvbmdpdHVkZSwKKyAgICAgICAgR1NUX1RBR19HRU9fTE9DQVRJT05fRUxFVkFUSU9OLCBhbHRpdHVkZSwgTlVMTCk7CisgIH0KKworICAvKiBUT0RPOiBubyBHU1RfVEFHXywgc28gYXN0cm9ub21pY2FsIGJvZHkgYW5kIGFkZGl0aW9uYWwgbm90ZXMgc2tpcHBlZCAqLworCisgIHJldHVybjsKKworICAvKiBFUlJPUlMgKi8KK3Nob3J0X3JlYWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic2hvcnQgcmVhZCBwYXJzaW5nIDNHUCBsb2NhdGlvbiIpOworICAgIHJldHVybjsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCitxdGRlbXV4X3RhZ19hZGRfeWVhciAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdFRhZ0xpc3QgKiB0YWdsaXN0LAorICAgIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqZHVtbXksIEdOb2RlICogbm9kZSkKK3sKKyAgZ3VpbnQxNiB5OworICBHRGF0ZSAqZGF0ZTsKKyAgZ2ludCBsZW47CisKKyAgbGVuID0gUVRfVUlOVDMyIChub2RlLT5kYXRhKTsKKyAgaWYgKGxlbiA8IDE0KQorICAgIHJldHVybjsKKworICB5ID0gUVRfVUlOVDE2ICgoZ3VpbnQ4ICopIG5vZGUtPmRhdGEgKyAxMik7CisgIGlmICh5ID09IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAieWVhcjogJXUgaXMgbm90IGEgdmFsaWQgeWVhciIsIHkpOworICAgIHJldHVybjsKKyAgfQorICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAieWVhcjogJXUiLCB5KTsKKworICBkYXRlID0gZ19kYXRlX25ld19kbXkgKDEsIDEsIHkpOworICBnc3RfdGFnX2xpc3RfYWRkICh0YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIHRhZywgZGF0ZSwgTlVMTCk7CisgIGdfZGF0ZV9mcmVlIChkYXRlKTsKK30KKworc3RhdGljIHZvaWQKK3F0ZGVtdXhfdGFnX2FkZF9jbGFzc2lmaWNhdGlvbiAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdFRhZ0xpc3QgKiB0YWdsaXN0LAorICAgIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqZHVtbXksIEdOb2RlICogbm9kZSkKK3sKKyAgaW50IG9mZnNldDsKKyAgY2hhciAqdGFnX3N0ciA9IE5VTEw7CisgIGd1aW50OCAqZW50aXR5OworICBndWludDE2IHRhYmxlOworICBnaW50IGxlbjsKKworICBsZW4gPSBRVF9VSU5UMzIgKG5vZGUtPmRhdGEpOworICBpZiAobGVuIDw9IDIwKQorICAgIGdvdG8gc2hvcnRfcmVhZDsKKworICBvZmZzZXQgPSAxMjsKKyAgZW50aXR5ID0gKGd1aW50OCAqKSBub2RlLT5kYXRhICsgb2Zmc2V0OworICBpZiAoZW50aXR5WzBdID09IDAgfHwgZW50aXR5WzFdID09IDAgfHwgZW50aXR5WzJdID09IDAgfHwgZW50aXR5WzNdID09IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAiY2xhc3NpZmljYXRpb24gaW5mbzogJWMlYyVjJWMgaW52YWxpZCBjbGFzc2lmaWNhdGlvbiBlbnRpdHkiLAorICAgICAgICBlbnRpdHlbMF0sIGVudGl0eVsxXSwgZW50aXR5WzJdLCBlbnRpdHlbM10pOworICAgIHJldHVybjsKKyAgfQorCisgIG9mZnNldCArPSA0OworICB0YWJsZSA9IFFUX1VJTlQxNiAoKGd1aW50OCAqKSBub2RlLT5kYXRhICsgb2Zmc2V0KTsKKworICAvKiBMYW5ndWFnZSBjb2RlIHNraXBwZWQgKi8KKworICBvZmZzZXQgKz0gNDsKKworICAvKiBUYWcgZm9ybWF0OiAiWFhYWDovL1lbWVlZWV0vY2xhc3NpZmljYXRpb24gaW5mbyBzdHJpbmciCisgICAqIFhYWFg6IGNsYXNzaWZpY2F0aW9uIGVudGl0eSwgZml4ZWQgbGVuZ3RoIDQgY2hhcnMuCisgICAqIFlbWVlZWV06IGNsYXNzaWZpY2F0aW9uIHRhYmxlLCBtYXggNSBjaGFycy4KKyAgICovCisgIHRhZ19zdHIgPSBnX3N0cmR1cF9wcmludGYgKCItLS0tOi8vJXUvJXMiLAorICAgICAgdGFibGUsIChjaGFyICopIG5vZGUtPmRhdGEgKyBvZmZzZXQpOworCisgIC8qIG1lbWNweSBUbyBiZSBzdXJlIHdlJ3JlIHByZXNlcnZpbmcgYnl0ZSBvcmRlciAqLworICBtZW1jcHkgKHRhZ19zdHIsIGVudGl0eSwgNCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJjbGFzc2lmaWNhdGlvbiBpbmZvOiAlcyIsIHRhZ19zdHIpOworCisgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELCB0YWcsIHRhZ19zdHIsIE5VTEwpOworCisgIGdfZnJlZSAodGFnX3N0cik7CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworc2hvcnRfcmVhZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJzaG9ydCByZWFkIHBhcnNpbmcgM0dQIGNsYXNzaWZpY2F0aW9uIik7CisgICAgcmV0dXJuOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcXRkZW11eF90YWdfYWRkX3N0cl9mdWxsIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0VGFnTGlzdCAqIHRhZ2xpc3QsCisgICAgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICpkdW1teSwgR05vZGUgKiBub2RlKQoreworICBjb25zdCBnY2hhciAqZW52X3ZhcnNbXSA9IHsgIkdTVF9RVF9UQUdfRU5DT0RJTkciLCAiR1NUX1RBR19FTkNPRElORyIsIE5VTEwgfTsKKyAgR05vZGUgKmRhdGE7CisgIGNoYXIgKnM7CisgIGludCBsZW47CisgIGd1aW50MzIgdHlwZTsKKyAgaW50IG9mZnNldDsKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKyAgY29uc3QgZ2NoYXIgKmNoYXJzZXQgPSBOVUxMOworCisgIGRhdGEgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKG5vZGUsIEZPVVJDQ19kYXRhKTsKKyAgaWYgKGRhdGEpIHsKKyAgICBsZW4gPSBRVF9VSU5UMzIgKGRhdGEtPmRhdGEpOworICAgIHR5cGUgPSBRVF9VSU5UMzIgKChndWludDggKikgZGF0YS0+ZGF0YSArIDgpOworICAgIGlmICh0eXBlID09IDB4MDAwMDAwMDEgJiYgbGVuID4gMTYpIHsKKyAgICAgIHMgPSBnc3RfdGFnX2ZyZWVmb3JtX3N0cmluZ190b191dGY4ICgoY2hhciAqKSBkYXRhLT5kYXRhICsgMTYsIGxlbiAtIDE2LAorICAgICAgICAgIGVudl92YXJzKTsKKyAgICAgIGlmIChzKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJhZGRpbmcgdGFnICVzIiwgR1NUX1NUUl9OVUxMIChzKSk7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwgdGFnLCBzLCBOVUxMKTsKKyAgICAgICAgZ19mcmVlIChzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJmYWlsZWQgdG8gY29udmVydCAlcyB0YWcgdG8gVVRGLTgiLCB0YWcpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBsZW4gPSBRVF9VSU5UMzIgKG5vZGUtPmRhdGEpOworICAgIHR5cGUgPSBRVF9VSU5UMzIgKChndWludDggKikgbm9kZS0+ZGF0YSArIDQpOworICAgIGlmICgodHlwZSA+PiAyNCkgPT0gMHhhOSAmJiBsZW4gPiA4ICsgNCkgeworICAgICAgZ2ludCBzdHJfbGVuOworICAgICAgZ2ludCBsYW5nX2NvZGU7CisKKyAgICAgIC8qIFR5cGUgc3RhcnRzIHdpdGggdGhlIChDKSBzeW1ib2wsIHNvIHRoZSBuZXh0IGRhdGEgaXMgYSBsaXN0CisgICAgICAgKiBvZiAoc3RyaW5nIHNpemUoMTYpLCBsYW5ndWFnZSBjb2RlKDE2KSwgc3RyaW5nKSAqLworCisgICAgICBzdHJfbGVuID0gUVRfVUlOVDE2ICgoZ3VpbnQ4ICopIG5vZGUtPmRhdGEgKyA4KTsKKyAgICAgIGxhbmdfY29kZSA9IFFUX1VJTlQxNiAoKGd1aW50OCAqKSBub2RlLT5kYXRhICsgMTApOworCisgICAgICAvKiB0aGUgc3RyaW5nICsgZm91cmNjICsgc2l6ZSArIDIgMTZiaXQgZmllbGRzLAorICAgICAgICogbWVhbnMgdGhhdCB0aGVyZSBhcmUgbW9yZSB0YWdzIGluIHRoaXMgYXRvbSAqLworICAgICAgaWYgKGxlbiA+IHN0cl9sZW4gKyA4ICsgNCkgeworICAgICAgICAvKiBUT0RPIGhvdyB0byByZXByZXNlbnQgdGhlIHNhbWUgdGFnIGluIGRpZmZlcmVudCBsYW5ndWFnZXM/ICovCisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIklnbm9yaW5nIG1ldGFkYXRhIGVudHJ5IHdpdGggbXVsdGlwbGUgIgorICAgICAgICAgICAgInRleHQgYWx0ZXJuYXRpdmVzLCByZWFkaW5nIG9ubHkgZmlyc3Qgb25lIik7CisgICAgICB9CisKKyAgICAgIG9mZnNldCA9IDEyOworICAgICAgbGVuID0gTUlOIChsZW4sIHN0cl9sZW4gKyA4ICsgNCk7IC8qIHJlbW92ZSB0cmFpbGluZyBzdHJpbmdzIHRoYXQgd2UgZG9uJ3QgdXNlICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZm91bmQgaW50ZXJuYXRpb25hbCB0ZXh0IHRhZyIpOworCisgICAgICBpZiAobGFuZ19jb2RlIDwgMHg4MDApIHsgIC8qIE1BQyBlbmNvZGVkIHN0cmluZyAqLworICAgICAgICBjaGFyc2V0ID0gIm1hYyI7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChsZW4gPiAxNCAmJiBxdGRlbXV4X2lzX3N0cmluZ190YWdfM2dwIChxdGRlbXV4LAorICAgICAgICAgICAgUVRfRk9VUkNDICgoZ3VpbnQ4ICopIG5vZGUtPmRhdGEgKyA0KSkpIHsKKyAgICAgIGd1aW50MzIgdHlwZSA9IFFUX1VJTlQzMiAoKGd1aW50OCAqKSBub2RlLT5kYXRhICsgOCk7CisKKyAgICAgIC8qIHdlIGdvIGZvciAzR1Agc3R5bGUgZW5jb2RpbmcgaWYgbWFqb3IgYnJhbmRzIGNsYWltcyBzbywKKyAgICAgICAqIG9yIGlmIG5vIGhvcGUgZm9yIGRhdGEgYmUgb2sgVVRGLTgsIGFuZCBjb21wYXRpYmxlIDNHUCBicmFuZCBwcmVzZW50ICovCisgICAgICBpZiAocXRkZW11eF9pc19icmFuZF8zZ3AgKHF0ZGVtdXgsIFRSVUUpIHx8CisgICAgICAgICAgKHF0ZGVtdXhfaXNfYnJhbmRfM2dwIChxdGRlbXV4LCBGQUxTRSkgJiYKKyAgICAgICAgICAgICAgKCh0eXBlICYgMHgwMEZGRkZGRikgPT0gMHgwKSAmJiAodHlwZSA+PiAyNCA8PSAweEYpKSkgeworICAgICAgICBvZmZzZXQgPSAxNDsKKyAgICAgICAgLyogMTYtYml0IExhbmd1YWdlIGNvZGUgaXMgaWdub3JlZCBoZXJlIGFzIHdlbGwgKi8KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImZvdW5kIDNncHAgdGV4dCB0YWciKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdvdG8gbm9ybWFsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgbm9ybWFsOgorICAgICAgb2Zmc2V0ID0gODsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJmb3VuZCBub3JtYWwgdGV4dCB0YWciKTsKKyAgICAgIHJldCA9IEZBTFNFOyAgICAgICAgICAgICAgLyogbWF5IGhhdmUgdG8gZmFsbGJhY2sgKi8KKyAgICB9CisgICAgaWYgKGNoYXJzZXQpIHsKKyAgICAgIEdFcnJvciAqZXJyID0gTlVMTDsKKworICAgICAgcyA9IGdfY29udmVydCAoKGdjaGFyICopIG5vZGUtPmRhdGEgKyBvZmZzZXQsIGxlbiAtIG9mZnNldCwgInV0ZjgiLAorICAgICAgICAgIGNoYXJzZXQsIE5VTEwsIE5VTEwsICZlcnIpOworICAgICAgaWYgKGVycikgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiRmFpbGVkIHRvIGNvbnZlcnQgc3RyaW5nIGZyb20gY2hhcnNldCAlczoiCisgICAgICAgICAgICAiICVzKCVkKTogJXMiLCBjaGFyc2V0LCBnX3F1YXJrX3RvX3N0cmluZyAoZXJyLT5kb21haW4pLCBlcnItPmNvZGUsCisgICAgICAgICAgICBlcnItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHMgPSBnc3RfdGFnX2ZyZWVmb3JtX3N0cmluZ190b191dGY4ICgoY2hhciAqKSBub2RlLT5kYXRhICsgb2Zmc2V0LAorICAgICAgICAgIGxlbiAtIG9mZnNldCwgZW52X3ZhcnMpOworICAgIH0KKyAgICBpZiAocykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImFkZGluZyB0YWcgJXMiLCBHU1RfU1RSX05VTEwgKHMpKTsKKyAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwgdGFnLCBzLCBOVUxMKTsKKyAgICAgIGdfZnJlZSAocyk7CisgICAgICByZXQgPSBUUlVFOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZmFpbGVkIHRvIGNvbnZlcnQgJXMgdGFnIHRvIFVURi04IiwgdGFnKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK3F0ZGVtdXhfdGFnX2FkZF9zdHIgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RUYWdMaXN0ICogdGFnbGlzdCwKKyAgICBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKmR1bW15LCBHTm9kZSAqIG5vZGUpCit7CisgIHF0ZGVtdXhfdGFnX2FkZF9zdHJfZnVsbCAocXRkZW11eCwgdGFnbGlzdCwgdGFnLCBkdW1teSwgbm9kZSk7Cit9CisKK3N0YXRpYyB2b2lkCitxdGRlbXV4X3RhZ19hZGRfa2V5d29yZHMgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RUYWdMaXN0ICogdGFnbGlzdCwKKyAgICBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKmR1bW15LCBHTm9kZSAqIG5vZGUpCit7CisgIGNvbnN0IGdjaGFyICplbnZfdmFyc1tdID0geyAiR1NUX1FUX1RBR19FTkNPRElORyIsICJHU1RfVEFHX0VOQ09ESU5HIiwgTlVMTCB9OworICBndWludDggKmRhdGE7CisgIGNoYXIgKnMsICp0LCAqayA9IE5VTEw7CisgIGludCBsZW47CisgIGludCBvZmZzZXQ7CisgIGludCBjb3VudDsKKworICAvKiBmaXJzdCB0cnkgbm9ybWFsIHN0cmluZyB0YWcgaWYgbWFqb3IgYnJhbmQgbm90IDNHUCAqLworICBpZiAoIXF0ZGVtdXhfaXNfYnJhbmRfM2dwIChxdGRlbXV4LCBUUlVFKSkgeworICAgIGlmICghcXRkZW11eF90YWdfYWRkX3N0cl9mdWxsIChxdGRlbXV4LCB0YWdsaXN0LCB0YWcsIGR1bW15LCBub2RlKSkgeworICAgICAgLyogaG0sIHRoYXQgZGlkIG5vdCB3b3JrLCBtYXliZSAzZ3BwIHN0b3JhZ2UgaW4gbm9uLTNncHAgbWFqb3IgYnJhbmQ7CisgICAgICAgKiBsZXQncyB0cnkgaXQgM2dwcCB3YXkgYWZ0ZXIgbWlub3Igc2FmZXR5IGNoZWNrICovCisgICAgICBkYXRhID0gbm9kZS0+ZGF0YTsKKyAgICAgIGlmIChRVF9VSU5UMzIgKGRhdGEpIDwgMTUgfHwgIXF0ZGVtdXhfaXNfYnJhbmRfM2dwIChxdGRlbXV4LCBGQUxTRSkpCisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybjsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJmb3VuZCAzZ3BwIGtleXdvcmQgdGFnIik7CisKKyAgZGF0YSA9IG5vZGUtPmRhdGE7CisKKyAgbGVuID0gUVRfVUlOVDMyIChkYXRhKTsKKyAgaWYgKGxlbiA8IDE1KQorICAgIGdvdG8gc2hvcnRfcmVhZDsKKworICBjb3VudCA9IFFUX1VJTlQ4IChkYXRhICsgMTQpOworICBvZmZzZXQgPSAxNTsKKyAgZm9yICg7IGNvdW50OyBjb3VudC0tKSB7CisgICAgZ2ludCBzbGVuOworCisgICAgaWYgKG9mZnNldCArIDEgPiBsZW4pCisgICAgICBnb3RvIHNob3J0X3JlYWQ7CisgICAgc2xlbiA9IFFUX1VJTlQ4IChkYXRhICsgb2Zmc2V0KTsKKyAgICBvZmZzZXQgKz0gMTsKKyAgICBpZiAob2Zmc2V0ICsgc2xlbiA+IGxlbikKKyAgICAgIGdvdG8gc2hvcnRfcmVhZDsKKyAgICBzID0gZ3N0X3RhZ19mcmVlZm9ybV9zdHJpbmdfdG9fdXRmOCAoKGNoYXIgKikgbm9kZS0+ZGF0YSArIG9mZnNldCwKKyAgICAgICAgc2xlbiwgZW52X3ZhcnMpOworICAgIGlmIChzKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiYWRkaW5nIGtleXdvcmQgJXMiLCBHU1RfU1RSX05VTEwgKHMpKTsKKyAgICAgIGlmIChrKSB7CisgICAgICAgIHQgPSBnX3N0cmpvaW4gKCIsIiwgaywgcywgTlVMTCk7CisgICAgICAgIGdfZnJlZSAocyk7CisgICAgICAgIGdfZnJlZSAoayk7CisgICAgICAgIGsgPSB0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgayA9IHM7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJmYWlsZWQgdG8gY29udmVydCBrZXl3b3JkIHRvIFVURi04Iik7CisgICAgfQorICAgIG9mZnNldCArPSBzbGVuOworICB9CisKK2RvbmU6CisgIGlmIChrKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImFkZGluZyB0YWcgJXMiLCBHU1RfU1RSX05VTEwgKGspKTsKKyAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIHRhZywgaywgTlVMTCk7CisgIH0KKyAgZ19mcmVlIChrKTsKKworICByZXR1cm47CisKKyAgLyogRVJST1JTICovCitzaG9ydF9yZWFkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInNob3J0IHJlYWQgcGFyc2luZyAzR1Aga2V5d29yZHMiKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3F0ZGVtdXhfdGFnX2FkZF9udW0gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RUYWdMaXN0ICogdGFnbGlzdCwKKyAgICBjb25zdCBjaGFyICp0YWcxLCBjb25zdCBjaGFyICp0YWcyLCBHTm9kZSAqIG5vZGUpCit7CisgIEdOb2RlICpkYXRhOworICBpbnQgbGVuOworICBpbnQgdHlwZTsKKyAgaW50IG4xLCBuMjsKKworICBkYXRhID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChub2RlLCBGT1VSQ0NfZGF0YSk7CisgIGlmIChkYXRhKSB7CisgICAgbGVuID0gUVRfVUlOVDMyIChkYXRhLT5kYXRhKTsKKyAgICB0eXBlID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIGRhdGEtPmRhdGEgKyA4KTsKKyAgICBpZiAodHlwZSA9PSAweDAwMDAwMDAwICYmIGxlbiA+PSAyMikgeworICAgICAgbjEgPSBRVF9VSU5UMTYgKChndWludDggKikgZGF0YS0+ZGF0YSArIDE4KTsKKyAgICAgIG4yID0gUVRfVUlOVDE2ICgoZ3VpbnQ4ICopIGRhdGEtPmRhdGEgKyAyMCk7CisgICAgICBpZiAobjEgPiAwKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJhZGRpbmcgdGFnICVzPSVkIiwgdGFnMSwgbjEpOworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIHRhZzEsIG4xLCBOVUxMKTsKKyAgICAgIH0KKyAgICAgIGlmIChuMiA+IDApIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImFkZGluZyB0YWcgJXM9JWQiLCB0YWcyLCBuMik7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwgdGFnMiwgbjIsIE5VTEwpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorcXRkZW11eF90YWdfYWRkX3RtcG8gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RUYWdMaXN0ICogdGFnbGlzdCwKKyAgICBjb25zdCBjaGFyICp0YWcxLCBjb25zdCBjaGFyICpkdW1teSwgR05vZGUgKiBub2RlKQoreworICBHTm9kZSAqZGF0YTsKKyAgaW50IGxlbjsKKyAgaW50IHR5cGU7CisgIGludCBuMTsKKworICBkYXRhID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChub2RlLCBGT1VSQ0NfZGF0YSk7CisgIGlmIChkYXRhKSB7CisgICAgbGVuID0gUVRfVUlOVDMyIChkYXRhLT5kYXRhKTsKKyAgICB0eXBlID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIGRhdGEtPmRhdGEgKyA4KTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiaGF2ZSB0ZW1wbyB0YWcsIHR5cGU9JWQsbGVuPSVkIiwgdHlwZSwgbGVuKTsKKyAgICAvKiBzb21lIGZpbGVzIHdyb25nbHkgaGF2ZSBhIHR5cGUgMHgwZj0xNSwgYnV0IGl0IHNob3VsZCBiZSAweDE1ICovCisgICAgaWYgKCh0eXBlID09IDB4MDAwMDAwMTUgfHwgdHlwZSA9PSAweDAwMDAwMDBmKSAmJiBsZW4gPj0gMTgpIHsKKyAgICAgIG4xID0gUVRfVUlOVDE2ICgoZ3VpbnQ4ICopIGRhdGEtPmRhdGEgKyAxNik7CisgICAgICBpZiAobjEpIHsKKyAgICAgICAgLyogZG8gbm90IGFkZCBicG09MCAqLworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiYWRkaW5nIHRhZyAlZCIsIG4xKTsKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLCB0YWcxLCAoZ2RvdWJsZSkgbjEsCisgICAgICAgICAgICBOVUxMKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK3F0ZGVtdXhfdGFnX2FkZF91aW50MzIgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RUYWdMaXN0ICogdGFnbGlzdCwKKyAgICBjb25zdCBjaGFyICp0YWcxLCBjb25zdCBjaGFyICpkdW1teSwgR05vZGUgKiBub2RlKQoreworICBHTm9kZSAqZGF0YTsKKyAgaW50IGxlbjsKKyAgaW50IHR5cGU7CisgIGd1aW50MzIgbnVtOworCisgIGRhdGEgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKG5vZGUsIEZPVVJDQ19kYXRhKTsKKyAgaWYgKGRhdGEpIHsKKyAgICBsZW4gPSBRVF9VSU5UMzIgKGRhdGEtPmRhdGEpOworICAgIHR5cGUgPSBRVF9VSU5UMzIgKChndWludDggKikgZGF0YS0+ZGF0YSArIDgpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJoYXZlICVzIHRhZywgdHlwZT0lZCxsZW49JWQiLCB0YWcxLCB0eXBlLCBsZW4pOworICAgIC8qIHNvbWUgZmlsZXMgd3JvbmdseSBoYXZlIGEgdHlwZSAweDBmPTE1LCBidXQgaXQgc2hvdWxkIGJlIDB4MTUgKi8KKyAgICBpZiAoKHR5cGUgPT0gMHgwMDAwMDAxNSB8fCB0eXBlID09IDB4MDAwMDAwMGYpICYmIGxlbiA+PSAyMCkgeworICAgICAgbnVtID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIGRhdGEtPmRhdGEgKyAxNik7CisgICAgICBpZiAobnVtKSB7CisgICAgICAgIC8qIGRvIG5vdCBhZGQgbnVtPTAgKi8KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImFkZGluZyB0YWcgJWQiLCBudW0pOworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIHRhZzEsIG51bSwgTlVMTCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitxdGRlbXV4X3RhZ19hZGRfY292ciAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdFRhZ0xpc3QgKiB0YWdsaXN0LAorICAgIGNvbnN0IGNoYXIgKnRhZzEsIGNvbnN0IGNoYXIgKmR1bW15LCBHTm9kZSAqIG5vZGUpCit7CisgIEdOb2RlICpkYXRhOworICBpbnQgbGVuOworICBpbnQgdHlwZTsKKyAgR3N0U2FtcGxlICpzYW1wbGU7CisKKyAgZGF0YSA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAobm9kZSwgRk9VUkNDX2RhdGEpOworICBpZiAoZGF0YSkgeworICAgIGxlbiA9IFFUX1VJTlQzMiAoZGF0YS0+ZGF0YSk7CisgICAgdHlwZSA9IFFUX1VJTlQzMiAoKGd1aW50OCAqKSBkYXRhLT5kYXRhICsgOCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImhhdmUgY292ciB0YWcsIHR5cGU9JWQsbGVuPSVkIiwgdHlwZSwgbGVuKTsKKyAgICBpZiAoKHR5cGUgPT0gMHgwMDAwMDAwZCB8fCB0eXBlID09IDB4MDAwMDAwMGUpICYmIGxlbiA+IDE2KSB7CisgICAgICBHc3RUYWdJbWFnZVR5cGUgaW1hZ2VfdHlwZTsKKworICAgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfdGFnX3NpemUgKHRhZ2xpc3QsIEdTVF9UQUdfSU1BR0UpID09IDApCisgICAgICAgIGltYWdlX3R5cGUgPSBHU1RfVEFHX0lNQUdFX1RZUEVfRlJPTlRfQ09WRVI7CisgICAgICBlbHNlCisgICAgICAgIGltYWdlX3R5cGUgPSBHU1RfVEFHX0lNQUdFX1RZUEVfTk9ORTsKKworICAgICAgaWYgKChzYW1wbGUgPQorICAgICAgICAgICAgICBnc3RfdGFnX2ltYWdlX2RhdGFfdG9faW1hZ2Vfc2FtcGxlICgoZ3VpbnQ4ICopIGRhdGEtPmRhdGEgKyAxNiwKKyAgICAgICAgICAgICAgICAgIGxlbiAtIDE2LCBpbWFnZV90eXBlKSkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImFkZGluZyB0YWcgc2l6ZSAlZCIsIGxlbiAtIDE2KTsKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLCB0YWcxLCBzYW1wbGUsIE5VTEwpOworICAgICAgICBnc3Rfc2FtcGxlX3VucmVmIChzYW1wbGUpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorcXRkZW11eF90YWdfYWRkX2RhdGUgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RUYWdMaXN0ICogdGFnbGlzdCwKKyAgICBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKmR1bW15LCBHTm9kZSAqIG5vZGUpCit7CisgIEdOb2RlICpkYXRhOworICBjaGFyICpzOworICBpbnQgbGVuOworICBpbnQgdHlwZTsKKworICBkYXRhID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChub2RlLCBGT1VSQ0NfZGF0YSk7CisgIGlmIChkYXRhKSB7CisgICAgbGVuID0gUVRfVUlOVDMyIChkYXRhLT5kYXRhKTsKKyAgICB0eXBlID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIGRhdGEtPmRhdGEgKyA4KTsKKyAgICBpZiAodHlwZSA9PSAweDAwMDAwMDAxICYmIGxlbiA+IDE2KSB7CisgICAgICBndWludCB5LCBtID0gMSwgZCA9IDE7CisgICAgICBnaW50IHJldDsKKworICAgICAgcyA9IGdfc3RybmR1cCAoKGNoYXIgKikgZGF0YS0+ZGF0YSArIDE2LCBsZW4gLSAxNik7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiYWRkaW5nIGRhdGUgJyVzJyIsIHMpOworICAgICAgcmV0ID0gc3NjYW5mIChzLCAiJXUtJXUtJXUiLCAmeSwgJm0sICZkKTsKKyAgICAgIGlmIChyZXQgPj0gMSAmJiB5ID4gMTUwMCAmJiB5IDwgMzAwMCkgeworICAgICAgICBHRGF0ZSAqZGF0ZTsKKworICAgICAgICBkYXRlID0gZ19kYXRlX25ld19kbXkgKGQsIG0sIHkpOworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIHRhZywgZGF0ZSwgTlVMTCk7CisgICAgICAgIGdfZGF0ZV9mcmVlIChkYXRlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJjb3VsZCBub3QgcGFyc2UgZGF0ZSBzdHJpbmcgJyVzJyIsIHMpOworICAgICAgfQorICAgICAgZ19mcmVlIChzKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK3F0ZGVtdXhfdGFnX2FkZF9nbnJlIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0VGFnTGlzdCAqIHRhZ2xpc3QsCisgICAgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICpkdW1teSwgR05vZGUgKiBub2RlKQoreworICBHTm9kZSAqZGF0YTsKKworICBkYXRhID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChub2RlLCBGT1VSQ0NfZGF0YSk7CisKKyAgLyogcmUtcm91dGUgdG8gbm9ybWFsIHN0cmluZyB0YWcgaWYgbWFqb3IgYnJhbmQgc2F5cyBzbworICAgKiBvciBubyBkYXRhIGF0b20gYW5kIGNvbXBhdGlibGUgYnJhbmQgc3VnZ2VzdHMgc28gKi8KKyAgaWYgKHF0ZGVtdXhfaXNfYnJhbmRfM2dwIChxdGRlbXV4LCBUUlVFKSB8fAorICAgICAgKHF0ZGVtdXhfaXNfYnJhbmRfM2dwIChxdGRlbXV4LCBGQUxTRSkgJiYgIWRhdGEpKSB7CisgICAgcXRkZW11eF90YWdfYWRkX3N0ciAocXRkZW11eCwgdGFnbGlzdCwgdGFnLCBkdW1teSwgbm9kZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGRhdGEpIHsKKyAgICBndWludCBsZW4sIHR5cGUsIG47CisKKyAgICBsZW4gPSBRVF9VSU5UMzIgKGRhdGEtPmRhdGEpOworICAgIHR5cGUgPSBRVF9VSU5UMzIgKChndWludDggKikgZGF0YS0+ZGF0YSArIDgpOworICAgIGlmICh0eXBlID09IDB4MDAwMDAwMDAgJiYgbGVuID49IDE4KSB7CisgICAgICBuID0gUVRfVUlOVDE2ICgoZ3VpbnQ4ICopIGRhdGEtPmRhdGEgKyAxNik7CisgICAgICBpZiAobiA+IDApIHsKKyAgICAgICAgY29uc3QgZ2NoYXIgKmdlbnJlOworCisgICAgICAgIGdlbnJlID0gZ3N0X3RhZ19pZDNfZ2VucmVfZ2V0IChuIC0gMSk7CisgICAgICAgIGlmIChnZW5yZSAhPSBOVUxMKSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImFkZGluZyAlZCBbJXNdIiwgbiwgZ2VucmUpOworICAgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwgdGFnLCBnZW5yZSwgTlVMTCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK3F0ZGVtdXhfYWRkX2RvdWJsZV90YWdfZnJvbV9zdHIgKEdzdFFURGVtdXggKiBkZW11eCwgR3N0VGFnTGlzdCAqIHRhZ2xpc3QsCisgICAgY29uc3QgZ2NoYXIgKiB0YWcsIGd1aW50OCAqIGRhdGEsIGd1aW50MzIgZGF0YXNpemUpCit7CisgIGdkb3VibGUgdmFsdWU7CisgIGdjaGFyICpkYXRhY29weTsKKworICAvKiBtYWtlIGEgY29weSB0byBoYXZlIFwwIGF0IHRoZSBlbmQgKi8KKyAgZGF0YWNvcHkgPSBnX3N0cm5kdXAgKChnY2hhciAqKSBkYXRhLCBkYXRhc2l6ZSk7CisKKyAgLyogY29udmVydCB0aGUgc3RyIHRvIGRvdWJsZSAqLworICBpZiAoc3NjYW5mIChkYXRhY29weSwgIiVsZiIsICZ2YWx1ZSkgPT0gMSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiYWRkaW5nIHRhZzogJXMgWyVzXSIsIHRhZywgZGF0YWNvcHkpOworICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwgdGFnLCB2YWx1ZSwgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIkZhaWxlZCB0byBwYXJzZSBkb3VibGUgZnJvbSBzdHJpbmc6ICVzIiwKKyAgICAgICAgZGF0YWNvcHkpOworICB9CisgIGdfZnJlZSAoZGF0YWNvcHkpOworfQorCisKK3N0YXRpYyB2b2lkCitxdGRlbXV4X3RhZ19hZGRfcmV2ZG5zIChHc3RRVERlbXV4ICogZGVtdXgsIEdzdFRhZ0xpc3QgKiB0YWdsaXN0LAorICAgIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdGFnX2JpcywgR05vZGUgKiBub2RlKQoreworICBHTm9kZSAqbWVhbjsKKyAgR05vZGUgKm5hbWU7CisgIEdOb2RlICpkYXRhOworICBndWludDMyIG1lYW5zaXplOworICBndWludDMyIG5hbWVzaXplOworICBndWludDMyIGRhdGF0eXBlOworICBndWludDMyIGRhdGFzaXplOworICBjb25zdCBnY2hhciAqbWVhbnN0cjsKKyAgY29uc3QgZ2NoYXIgKm5hbWVzdHI7CisKKyAgLyogY2hlY2tpbmcgdGhlIHdob2xlIC0tLS0gYXRvbSBzaXplIGZvciBjb25zaXN0ZW5jeSAqLworICBpZiAoUVRfVUlOVDMyIChub2RlLT5kYXRhKSA8PSA0ICsgMTIgKyAxMiArIDE2KSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIlRhZyAtLS0tIGF0b20gaXMgdG9vIHNtYWxsLCBpZ25vcmluZyIpOworICAgIHJldHVybjsKKyAgfQorCisgIG1lYW4gPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKG5vZGUsIEZPVVJDQ19tZWFuKTsKKyAgaWYgKCFtZWFuKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIk5vICdtZWFuJyBhdG9tIGZvdW5kIik7CisgICAgcmV0dXJuOworICB9CisKKyAgbWVhbnNpemUgPSBRVF9VSU5UMzIgKG1lYW4tPmRhdGEpOworICBpZiAobWVhbnNpemUgPD0gMTIpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiU21hbGwgbWVhbiBhdG9tLCBpZ25vcmluZyB0aGUgd2hvbGUgdGFnIik7CisgICAgcmV0dXJuOworICB9CisgIG1lYW5zdHIgPSAoKGdjaGFyICopIG1lYW4tPmRhdGEpICsgMTI7CisgIG1lYW5zaXplIC09IDEyOworCisgIG5hbWUgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKG5vZGUsIEZPVVJDQ19uYW1lKTsKKyAgaWYgKCFuYW1lKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIiduYW1lJyBhdG9tIG5vdCBmb3VuZCwgaWdub3JpbmcgdGFnIik7CisgICAgcmV0dXJuOworICB9CisKKyAgbmFtZXNpemUgPSBRVF9VSU5UMzIgKG5hbWUtPmRhdGEpOworICBpZiAobmFtZXNpemUgPD0gMTIpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiJ25hbWUnIGF0b20gaXMgdG9vIHNtYWxsLCBpZ25vcmluZyB0YWciKTsKKyAgICByZXR1cm47CisgIH0KKyAgbmFtZXN0ciA9ICgoZ2NoYXIgKikgbmFtZS0+ZGF0YSkgKyAxMjsKKyAgbmFtZXNpemUgLT0gMTI7CisKKyAgLyoKKyAgICogRGF0YSBhdG9tIGlzOgorICAgKiB1aW50MzIgLSBzaXplCisgICAqIHVpbnQzMiAtIG5hbWUKKyAgICogdWludDggIC0gdmVyc2lvbgorICAgKiB1aW50MjQgLSBkYXRhIHR5cGUKKyAgICogdWludDMyIC0gYWxsIDAKKyAgICogcmVzdCAgIC0gdGhlIGRhdGEKKyAgICovCisgIGRhdGEgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKG5vZGUsIEZPVVJDQ19kYXRhKTsKKyAgaWYgKCFkYXRhKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIk5vIGRhdGEgYXRvbSBpbiB0aGlzIHRhZyIpOworICAgIHJldHVybjsKKyAgfQorICBkYXRhc2l6ZSA9IFFUX1VJTlQzMiAoZGF0YS0+ZGF0YSk7CisgIGlmIChkYXRhc2l6ZSA8PSAxNikgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJEYXRhIGF0b20gdG9vIHNtYWxsIik7CisgICAgcmV0dXJuOworICB9CisgIGRhdGF0eXBlID0gUVRfVUlOVDMyICgoKGdjaGFyICopIGRhdGEtPmRhdGEpICsgOCkgJiAweEZGRkZGRjsKKworICBpZiAoKHN0cm5jbXAgKG1lYW5zdHIsICJjb20uYXBwbGUuaVR1bmVzIiwgbWVhbnNpemUpID09IDApIHx8CisgICAgICAoc3RybmNtcCAobWVhbnN0ciwgIm9yZy5oeWRyb2dlbmF1ZGlvLnJlcGxheWdhaW4iLCBtZWFuc2l6ZSkgPT0gMCkpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0CisgICAgeworICAgICAgY29uc3QgZ2NoYXIgbmFtZVsyOF07CisgICAgICBjb25zdCBnY2hhciB0YWdbMjhdOworICAgIH0gdGFnc1tdID0geworICAgICAgeworICAgICAgInJlcGxheWdhaW5fdHJhY2tfZ2FpbiIsIEdTVF9UQUdfVFJBQ0tfR0FJTn0sIHsKKyAgICAgICJyZXBsYXlnYWluX3RyYWNrX3BlYWsiLCBHU1RfVEFHX1RSQUNLX1BFQUt9LCB7CisgICAgICAicmVwbGF5Z2Fpbl9hbGJ1bV9nYWluIiwgR1NUX1RBR19BTEJVTV9HQUlOfSwgeworICAgICAgInJlcGxheWdhaW5fYWxidW1fcGVhayIsIEdTVF9UQUdfQUxCVU1fUEVBS30sIHsKKyAgICAgICJNdXNpY0JyYWlueiBUcmFjayBJZCIsIEdTVF9UQUdfTVVTSUNCUkFJTlpfVFJBQ0tJRH0sIHsKKyAgICAgICJNdXNpY0JyYWlueiBBcnRpc3QgSWQiLCBHU1RfVEFHX01VU0lDQlJBSU5aX0FSVElTVElEfSwgeworICAgICAgIk11c2ljQnJhaW56IEFsYnVtIElkIiwgR1NUX1RBR19NVVNJQ0JSQUlOWl9BTEJVTUlEfSwgeworICAgICAgIk11c2ljQnJhaW56IEFsYnVtIEFydGlzdCBJZCIsIEdTVF9UQUdfTVVTSUNCUkFJTlpfQUxCVU1BUlRJU1RJRH0KKyAgICB9OworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEdfTl9FTEVNRU5UUyAodGFncyk7ICsraSkgeworICAgICAgaWYgKCFnX2FzY2lpX3N0cm5jYXNlY21wICh0YWdzW2ldLm5hbWUsIG5hbWVzdHIsIG5hbWVzaXplKSkgeworICAgICAgICBzd2l0Y2ggKGdzdF90YWdfZ2V0X3R5cGUgKHRhZ3NbaV0udGFnKSkgeworICAgICAgICAgIGNhc2UgR19UWVBFX0RPVUJMRToKKyAgICAgICAgICAgIHF0ZGVtdXhfYWRkX2RvdWJsZV90YWdfZnJvbV9zdHIgKGRlbXV4LCB0YWdsaXN0LCB0YWdzW2ldLnRhZywKKyAgICAgICAgICAgICAgICAoKGd1aW50OCAqKSBkYXRhLT5kYXRhKSArIDE2LCBkYXRhc2l6ZSAtIDE2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR19UWVBFX1NUUklORzoKKyAgICAgICAgICAgIHF0ZGVtdXhfdGFnX2FkZF9zdHIgKGRlbXV4LCB0YWdsaXN0LCB0YWdzW2ldLnRhZywgTlVMTCwgbm9kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogbm90IHJlYWNoZWQgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA9PSBHX05fRUxFTUVOVFMgKHRhZ3MpKQorICAgICAgZ290byB1bmtub3duX3RhZzsKKyAgfSBlbHNlIHsKKyAgICBnb3RvIHVua25vd25fdGFnOworICB9CisKKyAgcmV0dXJuOworCisvKiBlcnJvcnMgKi8KK3Vua25vd25fdGFnOgorI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgeworICAgIGdjaGFyICpuYW1lc3RyX2RiZzsKKyAgICBnY2hhciAqbWVhbnN0cl9kYmc7CisKKyAgICBtZWFuc3RyX2RiZyA9IGdfc3RybmR1cCAobWVhbnN0ciwgbWVhbnNpemUpOworICAgIG5hbWVzdHJfZGJnID0gZ19zdHJuZHVwIChuYW1lc3RyLCBuYW1lc2l6ZSk7CisKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiVGhpcyB0YWcgJXM6JXMgdHlwZToldSBpcyBub3QgbWFwcGVkLCAiCisgICAgICAgICJmaWxlIGEgYnVnIGF0IGJ1Z3ppbGxhLmdub21lLm9yZyIsIG1lYW5zdHJfZGJnLCBuYW1lc3RyX2RiZywgZGF0YXR5cGUpOworCisgICAgZ19mcmVlIChuYW1lc3RyX2RiZyk7CisgICAgZ19mcmVlIChtZWFuc3RyX2RiZyk7CisgIH0KKyNlbmRpZgorICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitxdGRlbXV4X3RhZ19hZGRfaWQzMiAoR3N0UVREZW11eCAqIGRlbXV4LCBHc3RUYWdMaXN0ICogdGFnbGlzdCwgY29uc3QgY2hhciAqdGFnLAorICAgIGNvbnN0IGNoYXIgKnRhZ19iaXMsIEdOb2RlICogbm9kZSkKK3sKKyAgZ3VpbnQ4ICpkYXRhOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgZ3VpbnQgbGVuOworICBHc3RUYWdMaXN0ICppZDMyX3RhZ2xpc3QgPSBOVUxMOworCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgInBhcnNpbmcgSUQzMiIpOworCisgIGRhdGEgPSBub2RlLT5kYXRhOworICBsZW4gPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEpOworCisgIC8qIG5lZWQgYXQgbGVhc3QgZnVsbCBib3ggYW5kIGxhbmd1YWdlIHRhZyAqLworICBpZiAobGVuIDwgMTIgKyAyKQorICAgIHJldHVybjsKKworICBidWYgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgbGVuIC0gMTQsIE5VTEwpOworICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgZGF0YSArIDE0LCBsZW4gLSAxNCk7CisKKyAgaWQzMl90YWdsaXN0ID0gZ3N0X3RhZ19saXN0X2Zyb21faWQzdjJfdGFnIChidWYpOworICBpZiAoaWQzMl90YWdsaXN0KSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAicGFyc2luZyBvayIpOworICAgIGdzdF90YWdfbGlzdF9pbnNlcnQgKHRhZ2xpc3QsIGlkMzJfdGFnbGlzdCwgR1NUX1RBR19NRVJHRV9LRUVQKTsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKGlkMzJfdGFnbGlzdCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAicGFyc2luZyBmYWlsZWQiKTsKKyAgfQorCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7Cit9CisKK3R5cGVkZWYgdm9pZCAoKkdzdFFURGVtdXhBZGRUYWdGdW5jKSAoR3N0UVREZW11eCAqIGRlbXV4LCBHc3RUYWdMaXN0ICogdGFnbGlzdCwKKyAgICBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnRhZ19iaXMsIEdOb2RlICogbm9kZSk7CisKKy8qIHVubWFwcGVkIHRhZ3MKK0ZPVVJDQ19wY3N0IC0+IGlmIG1lZGlhIGlzIGEgcG9kY2FzdCAtPiBib29sCitGT1VSQ0NfY3BpbCAtPiBpZiBtZWRpYSBpcyBwYXJ0IG9mIGEgY29tcGlsYXRpb24gLT4gYm9vbAorRk9VUkNDX3BnYXAgLT4gaWYgbWVkaWEgaXMgcGFydCBvZiBhIGdhcGxlc3MgY29udGV4dCAtPiBib29sCitGT1VSQ0NfdHZlbiAtPiB0aGUgdHYgZXBpc29kZSBpZCBlLmcuIFMwMUUyMyAtPiBzdHIKKyovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QKK3sKKyAgZ3VpbnQzMiBmb3VyY2M7CisgIGNvbnN0IGdjaGFyICpnc3RfdGFnOworICBjb25zdCBnY2hhciAqZ3N0X3RhZ19iaXM7CisgIGNvbnN0IEdzdFFURGVtdXhBZGRUYWdGdW5jIGZ1bmM7Cit9IGFkZF9mdW5jc1tdID0geworICB7CisgIEZPVVJDQ19fbmFtLCBHU1RfVEFHX1RJVExFLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0NfdGl0bCwgR1NUX1RBR19USVRMRSwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX19ncnAsIEdTVF9UQUdfR1JPVVBJTkcsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9zdHJ9LCB7CisgIEZPVVJDQ19fd3J0LCBHU1RfVEFHX0NPTVBPU0VSLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0NfX0FSVCwgR1NUX1RBR19BUlRJU1QsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9zdHJ9LCB7CisgIEZPVVJDQ19hQVJULCBHU1RfVEFHX0FMQlVNX0FSVElTVCwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX3BlcmYsIEdTVF9UQUdfQVJUSVNULCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0NfYXV0aCwgR1NUX1RBR19DT01QT1NFUiwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX19hbGIsIEdTVF9UQUdfQUxCVU0sIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9zdHJ9LCB7CisgIEZPVVJDQ19hbGJtLCBHU1RfVEFHX0FMQlVNLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0NfY3BydCwgR1NUX1RBR19DT1BZUklHSFQsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9zdHJ9LCB7CisgIEZPVVJDQ19fY3B5LCBHU1RfVEFHX0NPUFlSSUdIVCwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX19jbXQsIEdTVF9UQUdfQ09NTUVOVCwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX19kZXMsIEdTVF9UQUdfREVTQ1JJUFRJT04sIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9zdHJ9LCB7CisgIEZPVVJDQ19kZXNjLCBHU1RfVEFHX0RFU0NSSVBUSU9OLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0NfZHNjcCwgR1NUX1RBR19ERVNDUklQVElPTiwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX19seXIsIEdTVF9UQUdfTFlSSUNTLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0NfX2RheSwgR1NUX1RBR19EQVRFLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfZGF0ZX0sIHsKKyAgRk9VUkNDX3lycmMsIEdTVF9UQUdfREFURSwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3llYXJ9LCB7CisgIEZPVVJDQ19fdG9vLCBHU1RfVEFHX0VOQ09ERVIsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9zdHJ9LCB7CisgIEZPVVJDQ19faW5mLCBHU1RfVEFHX0NPTU1FTlQsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9zdHJ9LCB7CisgIEZPVVJDQ190cmtuLCBHU1RfVEFHX1RSQUNLX05VTUJFUiwgR1NUX1RBR19UUkFDS19DT1VOVCwgcXRkZW11eF90YWdfYWRkX251bX0sIHsKKyAgRk9VUkNDX2Rpc2ssIEdTVF9UQUdfQUxCVU1fVk9MVU1FX05VTUJFUiwgR1NUX1RBR19BTEJVTV9WT0xVTUVfQ09VTlQsCisgICAgICAgIHF0ZGVtdXhfdGFnX2FkZF9udW19LCB7CisgIEZPVVJDQ19kaXNjLCBHU1RfVEFHX0FMQlVNX1ZPTFVNRV9OVU1CRVIsIEdTVF9UQUdfQUxCVU1fVk9MVU1FX0NPVU5ULAorICAgICAgICBxdGRlbXV4X3RhZ19hZGRfbnVtfSwgeworICBGT1VSQ0NfX2dlbiwgR1NUX1RBR19HRU5SRSwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX2ducmUsIEdTVF9UQUdfR0VOUkUsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9nbnJlfSwgeworICBGT1VSQ0NfdG1wbywgR1NUX1RBR19CRUFUU19QRVJfTUlOVVRFLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfdG1wb30sIHsKKyAgRk9VUkNDX2NvdnIsIEdTVF9UQUdfSU1BR0UsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9jb3ZyfSwgeworICBGT1VSQ0Nfc29ubSwgR1NUX1RBR19USVRMRV9TT1JUTkFNRSwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX3NvYWwsIEdTVF9UQUdfQUxCVU1fU09SVE5BTUUsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9zdHJ9LCB7CisgIEZPVVJDQ19zb2FyLCBHU1RfVEFHX0FSVElTVF9TT1JUTkFNRSwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX3NvYWEsIEdTVF9UQUdfQUxCVU1fQVJUSVNUX1NPUlROQU1FLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0Nfc29jbywgR1NUX1RBR19DT01QT1NFUl9TT1JUTkFNRSwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX3Nvc24sIEdTVF9UQUdfU0hPV19TT1JUTkFNRSwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX3R2c2gsIEdTVF9UQUdfU0hPV19OQU1FLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0NfdHZzbiwgR1NUX1RBR19TSE9XX1NFQVNPTl9OVU1CRVIsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF91aW50MzJ9LCB7CisgIEZPVVJDQ190dmVzLCBHU1RfVEFHX1NIT1dfRVBJU09ERV9OVU1CRVIsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF91aW50MzJ9LCB7CisgIEZPVVJDQ19reXdkLCBHU1RfVEFHX0tFWVdPUkRTLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfa2V5d29yZHN9LCB7CisgIEZPVVJDQ19rZXl3LCBHU1RfVEFHX0tFWVdPUkRTLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0NfX2VuYywgR1NUX1RBR19FTkNPREVSLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0NfbG9jaSwgR1NUX1RBR19HRU9fTE9DQVRJT05fTkFNRSwgTlVMTCwgcXRkZW11eF90YWdfYWRkX2xvY2F0aW9ufSwgeworICBGT1VSQ0NfY2xzZiwgR1NUX1FUX0RFTVVYX0NMQVNTSUZJQ0FUSU9OX1RBRywgTlVMTCwKKyAgICAgICAgcXRkZW11eF90YWdfYWRkX2NsYXNzaWZpY2F0aW9ufSwgeworICBGT1VSQ0NfX21haywgR1NUX1RBR19ERVZJQ0VfTUFOVUZBQ1RVUkVSLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0NfX21vZCwgR1NUX1RBR19ERVZJQ0VfTU9ERUwsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9zdHJ9LCB7CisgIEZPVVJDQ19fc3dyLCBHU1RfVEFHX0FQUExJQ0FUSU9OX05BTUUsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9zdHJ9LCB7CisKKyAgICAvKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLCBzb21lIHRhZ3MgYXJlIHN0b3JlZCBpbiB0aGlzCisgICAgICogJ3JldmVyc2UgZG5zIG5hbWluZycsIGFjY29yZGluZyB0bzoKKyAgICAgKiBodHRwOi8vYXRvbWljcGFyc2xleS5zb3VyY2Vmb3JnZS5uZXQvbXBlZy00ZmlsZXMuaHRtbCBhbmQKKyAgICAgKiBidWcgIzYxNDQ3MQorICAgICAqLworICBGT1VSQ0NfX19fXywgIiIsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9yZXZkbnN9LCB7CisgICAgLyogc2VlIGh0dHA6Ly93d3cubXA0cmEub3JnL3NwZWNzLmh0bWwgZm9yIElEMzIgaW4gbWV0YSBib3ggKi8KKyAgRk9VUkNDX0lEMzIsICIiLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfaWQzMn0KK307CisKK3N0cnVjdCBfR3N0UXREZW11eFRhZ0xpc3QKK3sKKyAgR3N0UVREZW11eCAqZGVtdXg7CisgIEdzdFRhZ0xpc3QgKnRhZ2xpc3Q7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFF0RGVtdXhUYWdMaXN0IEdzdFF0RGVtdXhUYWdMaXN0OworCitzdGF0aWMgdm9pZAorcXRkZW11eF90YWdfYWRkX2Jsb2IgKEdOb2RlICogbm9kZSwgR3N0UXREZW11eFRhZ0xpc3QgKiBxdGRlbXV4dGFnbGlzdCkKK3sKKyAgZ2ludCBsZW47CisgIGd1aW50OCAqZGF0YTsKKyAgR3N0QnVmZmVyICpidWY7CisgIGdjaGFyICptZWRpYV90eXBlOworICBjb25zdCBnY2hhciAqc3R5bGU7CisgIEdzdFNhbXBsZSAqc2FtcGxlOworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIGd1aW50IGk7CisgIGd1aW50OCBuZGF0YVs0XTsKKyAgR3N0UVREZW11eCAqZGVtdXggPSBxdGRlbXV4dGFnbGlzdC0+ZGVtdXg7CisgIEdzdFRhZ0xpc3QgKnRhZ2xpc3QgPSBxdGRlbXV4dGFnbGlzdC0+dGFnbGlzdDsKKworICBkYXRhID0gbm9kZS0+ZGF0YTsKKyAgbGVuID0gUVRfVUlOVDMyIChkYXRhKTsKKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChsZW4pOworICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgZGF0YSwgbGVuKTsKKworICAvKiBoZXVyaXN0aWMgdG8gZGV0ZXJtaW5lIHN0eWxlIG9mIHRhZyAqLworICBpZiAoUVRfRk9VUkNDIChkYXRhICsgNCkgPT0gRk9VUkNDX19fX18gfHwKKyAgICAgIChsZW4gPiA4ICsgMTIgJiYgUVRfRk9VUkNDIChkYXRhICsgMTIpID09IEZPVVJDQ19kYXRhKSkKKyAgICBzdHlsZSA9ICJpdHVuZXMiOworICBlbHNlIGlmIChkZW11eC0+bWFqb3JfYnJhbmQgPT0gRk9VUkNDX3F0X18pCisgICAgc3R5bGUgPSAicXVpY2t0aW1lIjsKKyAgLyogZmFsbCBiYWNrIHRvIGFzc3VtaW5nIGlzby8zZ3AgdGFnIHN0eWxlICovCisgIGVsc2UKKyAgICBzdHlsZSA9ICJpc28iOworCisgIC8qIHNhbnRpemUgdGhlIG5hbWUgZm9yIHRoZSBjYXBzLiAqLworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgZ3VpbnQ4IGQgPSBkYXRhWzQgKyBpXTsKKyAgICBpZiAoZ19hc2NpaV9pc2FsbnVtIChkKSkKKyAgICAgIG5kYXRhW2ldID0gZ19hc2NpaV90b2xvd2VyIChkKTsKKyAgICBlbHNlCisgICAgICBuZGF0YVtpXSA9ICdfJzsKKyAgfQorCisgIG1lZGlhX3R5cGUgPSBnX3N0cmR1cF9wcmludGYgKCJhcHBsaWNhdGlvbi94LWdzdC1xdC0lYyVjJWMlYy10YWciLAorICAgICAgbmRhdGFbMF0sIG5kYXRhWzFdLCBuZGF0YVsyXSwgbmRhdGFbM10pOworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIm1lZGlhIHR5cGUgJXMiLCBtZWRpYV90eXBlKTsKKworICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKG1lZGlhX3R5cGUsICJzdHlsZSIsIEdfVFlQRV9TVFJJTkcsIHN0eWxlLCBOVUxMKTsKKyAgc2FtcGxlID0gZ3N0X3NhbXBsZV9uZXcgKGJ1ZiwgTlVMTCwgTlVMTCwgcyk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIGdfZnJlZSAobWVkaWFfdHlwZSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJhZGRpbmcgcHJpdmF0ZSB0YWc7IHNpemUgJWQsIGluZm8gJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBsZW4sIHMpOworCisgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAorICAgICAgR1NUX1FUX0RFTVVYX1BSSVZBVEVfVEFHLCBzYW1wbGUsIE5VTEwpOworCisgIGdzdF9zYW1wbGVfdW5yZWYgKHNhbXBsZSk7Cit9CisKK3N0YXRpYyB2b2lkCitxdGRlbXV4X3BhcnNlX3VkdGEgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RUYWdMaXN0ICogdGFnbGlzdCwgR05vZGUgKiB1ZHRhKQoreworICBHTm9kZSAqbWV0YTsKKyAgR05vZGUgKmlsc3Q7CisgIEdOb2RlICp4bXBfOworICBHTm9kZSAqbm9kZTsKKyAgZ2ludCBpOworICBHc3RRdERlbXV4VGFnTGlzdCBkZW11eHRhZ2xpc3Q7CisKKyAgZGVtdXh0YWdsaXN0LmRlbXV4ID0gcXRkZW11eDsKKyAgZGVtdXh0YWdsaXN0LnRhZ2xpc3QgPSB0YWdsaXN0OworCisgIG1ldGEgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHVkdGEsIEZPVVJDQ19tZXRhKTsKKyAgaWYgKG1ldGEgIT0gTlVMTCkgeworICAgIGlsc3QgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKG1ldGEsIEZPVVJDQ19pbHN0KTsKKyAgICBpZiAoaWxzdCA9PSBOVUxMKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIm5vIGlsc3QiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWxzdCA9IHVkdGE7CisgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJubyBtZXRhIHNvIHVzaW5nIHVkdGEgaXRzZWxmIik7CisgIH0KKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBHX05fRUxFTUVOVFMgKGFkZF9mdW5jcykpIHsKKyAgICBub2RlID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChpbHN0LCBhZGRfZnVuY3NbaV0uZm91cmNjKTsKKyAgICBpZiAobm9kZSkgeworICAgICAgZ2ludCBsZW47CisKKyAgICAgIGxlbiA9IFFUX1VJTlQzMiAobm9kZS0+ZGF0YSk7CisgICAgICBpZiAobGVuIDwgMTIpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInRvbyBzbWFsbCB0YWcgYXRvbSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoYWRkX2Z1bmNzW2ldLmZvdXJjYykpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYWRkX2Z1bmNzW2ldLmZ1bmMgKHF0ZGVtdXgsIHRhZ2xpc3QsIGFkZF9mdW5jc1tpXS5nc3RfdGFnLAorICAgICAgICAgICAgYWRkX2Z1bmNzW2ldLmdzdF90YWdfYmlzLCBub2RlKTsKKyAgICAgIH0KKyAgICAgIGdfbm9kZV9kZXN0cm95IChub2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgaSsrOworICAgIH0KKyAgfQorCisgIC8qIHBhcnNlZCBub2RlcyBoYXZlIGJlZW4gcmVtb3ZlZCwgcGFzcyBhbG9uZyByZW1haW5kZXIgYXMgYmxvYiAqLworICBnX25vZGVfY2hpbGRyZW5fZm9yZWFjaCAoaWxzdCwgR19UUkFWRVJTRV9BTEwsCisgICAgICAoR05vZGVGb3JlYWNoRnVuYykgcXRkZW11eF90YWdfYWRkX2Jsb2IsICZkZW11eHRhZ2xpc3QpOworCisgIC8qIHBhcnNlIHVwIFhNUF8gbm9kZSBpZiBleGlzdGluZyAqLworICB4bXBfID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlICh1ZHRhLCBGT1VSQ0NfWE1QXyk7CisgIGlmICh4bXBfICE9IE5VTEwpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZjsKKyAgICBHc3RUYWdMaXN0ICp4bXB0YWdsaXN0OworCisgICAgYnVmID0gX2dzdF9idWZmZXJfbmV3X3dyYXBwZWQgKCgoZ3VpbnQ4ICopIHhtcF8tPmRhdGEpICsgOCwKKyAgICAgICAgUVRfVUlOVDMyICgoZ3VpbnQ4ICopIHhtcF8tPmRhdGEpIC0gOCwgTlVMTCk7CisgICAgeG1wdGFnbGlzdCA9IGdzdF90YWdfbGlzdF9mcm9tX3htcF9idWZmZXIgKGJ1Zik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAgIHF0ZGVtdXhfaGFuZGxlX3htcF90YWdsaXN0IChxdGRlbXV4LCB0YWdsaXN0LCB4bXB0YWdsaXN0KTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiTm8gWE1QXyBub2RlIGZvdW5kIik7CisgIH0KK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7ICAgICAgLyogaGVscGVyIGZvciBzb3J0IGZ1bmN0aW9uICovCisgIGdjaGFyICpsb2NhdGlvbjsKKyAgZ3VpbnQgbWluX3JlcV9iaXRyYXRlOworICBndWludCBtaW5fcmVxX3F0X3ZlcnNpb247Cit9IEdzdFF0UmVmZXJlbmNlOworCitzdGF0aWMgZ2ludAorcXRkZW11eF9yZWRpcmVjdHNfc29ydF9mdW5jIChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYikKK3sKKyAgR3N0UXRSZWZlcmVuY2UgKnJlZl9hID0gKEdzdFF0UmVmZXJlbmNlICopIGE7CisgIEdzdFF0UmVmZXJlbmNlICpyZWZfYiA9IChHc3RRdFJlZmVyZW5jZSAqKSBiOworCisgIGlmIChyZWZfYi0+bWluX3JlcV9xdF92ZXJzaW9uICE9IHJlZl9hLT5taW5fcmVxX3F0X3ZlcnNpb24pCisgICAgcmV0dXJuIHJlZl9iLT5taW5fcmVxX3F0X3ZlcnNpb24gLSByZWZfYS0+bWluX3JlcV9xdF92ZXJzaW9uOworCisgIC8qIGtub3duIGJpdHJhdGVzIGdvIGJlZm9yZSB1bmtub3duOyBoaWdoZXIgYml0cmF0ZXMgZ28gZmlyc3QgKi8KKyAgcmV0dXJuIHJlZl9iLT5taW5fcmVxX2JpdHJhdGUgLSByZWZfYS0+bWluX3JlcV9iaXRyYXRlOworfQorCisvKiBzb3J0IHRoZSByZWRpcmVjdHMgYW5kIHBvc3QgYSBtZXNzYWdlIGZvciB0aGUgYXBwbGljYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCitxdGRlbXV4X3Byb2Nlc3NfcmVkaXJlY3RzIChHc3RRVERlbXV4ICogcXRkZW11eCwgR0xpc3QgKiByZWZlcmVuY2VzKQoreworICBHc3RRdFJlZmVyZW5jZSAqYmVzdDsKKyAgR3N0U3RydWN0dXJlICpzOworICBHc3RNZXNzYWdlICptc2c7CisgIEdWYWx1ZSBsaXN0X3ZhbCA9IHsgMCwgfTsKKyAgR0xpc3QgKmw7CisKKyAgZ19hc3NlcnQgKHJlZmVyZW5jZXMgIT0gTlVMTCk7CisKKyAgcmVmZXJlbmNlcyA9IGdfbGlzdF9zb3J0IChyZWZlcmVuY2VzLCBxdGRlbXV4X3JlZGlyZWN0c19zb3J0X2Z1bmMpOworCisgIGJlc3QgPSAoR3N0UXRSZWZlcmVuY2UgKikgcmVmZXJlbmNlcy0+ZGF0YTsKKworICBnX3ZhbHVlX2luaXQgKCZsaXN0X3ZhbCwgR1NUX1RZUEVfTElTVCk7CisKKyAgZm9yIChsID0gcmVmZXJlbmNlczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgeworICAgIEdzdFF0UmVmZXJlbmNlICpyZWYgPSAoR3N0UXRSZWZlcmVuY2UgKikgbC0+ZGF0YTsKKyAgICBHVmFsdWUgc3RydWN0X3ZhbCA9IHsgMCwgfTsKKworICAgIHJlZi0+c3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJyZWRpcmVjdCIsCisgICAgICAgICJuZXctbG9jYXRpb24iLCBHX1RZUEVfU1RSSU5HLCByZWYtPmxvY2F0aW9uLCBOVUxMKTsKKworICAgIGlmIChyZWYtPm1pbl9yZXFfYml0cmF0ZSA+IDApIHsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChyZWYtPnN0cnVjdHVyZSwgIm1pbmltdW0tYml0cmF0ZSIsIEdfVFlQRV9JTlQsCisgICAgICAgICAgcmVmLT5taW5fcmVxX2JpdHJhdGUsIE5VTEwpOworICAgIH0KKworICAgIGdfdmFsdWVfaW5pdCAoJnN0cnVjdF92YWwsIEdTVF9UWVBFX1NUUlVDVFVSRSk7CisgICAgZ192YWx1ZV9zZXRfYm94ZWQgKCZzdHJ1Y3RfdmFsLCByZWYtPnN0cnVjdHVyZSk7CisgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmbGlzdF92YWwsICZzdHJ1Y3RfdmFsKTsKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmc3RydWN0X3ZhbCk7CisgICAgLyogZG9uJ3QgZnJlZSBhbnl0aGluZyBoZXJlIHlldCwgc2luY2Ugd2UgbmVlZCBiZXN0LT5zdHJ1Y3R1cmUgYmVsb3cgKi8KKyAgfQorCisgIGdfYXNzZXJ0IChiZXN0ICE9IE5VTEwpOworICBzID0gZ3N0X3N0cnVjdHVyZV9jb3B5IChiZXN0LT5zdHJ1Y3R1cmUpOworCisgIGlmIChnX2xpc3RfbGVuZ3RoIChyZWZlcmVuY2VzKSA+IDEpIHsKKyAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAocywgImxvY2F0aW9ucyIsICZsaXN0X3ZhbCk7CisgIH0KKworICBnX3ZhbHVlX3Vuc2V0ICgmbGlzdF92YWwpOworCisgIGZvciAobCA9IHJlZmVyZW5jZXM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpIHsKKyAgICBHc3RRdFJlZmVyZW5jZSAqcmVmID0gKEdzdFF0UmVmZXJlbmNlICopIGwtPmRhdGE7CisKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHJlZi0+c3RydWN0dXJlKTsKKyAgICBnX2ZyZWUgKHJlZi0+bG9jYXRpb24pOworICAgIGdfZnJlZSAocmVmKTsKKyAgfQorICBnX2xpc3RfZnJlZSAocmVmZXJlbmNlcyk7CisKKyAgR1NUX0lORk9fT0JKRUNUIChxdGRlbXV4LCAicG9zdGluZyByZWRpcmVjdCBtZXNzYWdlOiAlIiBHU1RfUFRSX0ZPUk1BVCwgcyk7CisgIG1zZyA9IGdzdF9tZXNzYWdlX25ld19lbGVtZW50IChHU1RfT0JKRUNUX0NBU1QgKHF0ZGVtdXgpLCBzKTsKKyAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChxdGRlbXV4KSwgbXNnKTsKKyAgcXRkZW11eC0+cG9zdGVkX3JlZGlyZWN0ID0gVFJVRTsKK30KKworLyogbG9vayBmb3IgcmVkaXJlY3Qgbm9kZXMsIGNvbGxlY3QgYWxsIHJlZGlyZWN0IGluZm9ybWF0aW9uIGFuZAorICogcHJvY2VzcyBpdC4KKyAqLworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X3BhcnNlX3JlZGlyZWN0cyAoR3N0UVREZW11eCAqIHF0ZGVtdXgpCit7CisgIEdOb2RlICpybXJhLCAqcm1kYSwgKnJkcmY7CisKKyAgcm1yYSA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAocXRkZW11eC0+bW9vdl9ub2RlLCBGT1VSQ0Nfcm1yYSk7CisgIGlmIChybXJhKSB7CisgICAgR0xpc3QgKnJlZGlyZWN0cyA9IE5VTEw7CisKKyAgICBybWRhID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChybXJhLCBGT1VSQ0Nfcm1kYSk7CisgICAgd2hpbGUgKHJtZGEpIHsKKyAgICAgIEdzdFF0UmVmZXJlbmNlIHJlZiA9IHsgTlVMTCwgTlVMTCwgMCwgMCB9OworICAgICAgR05vZGUgKnJtZHIsICpybXZjOworCisgICAgICBpZiAoKHJtZHIgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHJtZGEsIEZPVVJDQ19ybWRyKSkpIHsKKyAgICAgICAgcmVmLm1pbl9yZXFfYml0cmF0ZSA9IFFUX1VJTlQzMiAoKGd1aW50OCAqKSBybWRyLT5kYXRhICsgMTIpOworICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgImRhdGEgcmF0ZSBhdG9tLCByZXF1aXJlZCBiaXRyYXRlID0gJXUiLAorICAgICAgICAgICAgcmVmLm1pbl9yZXFfYml0cmF0ZSk7CisgICAgICB9CisKKyAgICAgIGlmICgocm12YyA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAocm1kYSwgRk9VUkNDX3JtdmMpKSkgeworICAgICAgICBndWludDMyIHBhY2thZ2UgPSBRVF9GT1VSQ0MgKChndWludDggKikgcm12Yy0+ZGF0YSArIDEyKTsKKyAgICAgICAgZ3VpbnQgdmVyc2lvbiA9IFFUX1VJTlQzMiAoKGd1aW50OCAqKSBybXZjLT5kYXRhICsgMTYpOworCisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworICAgICAgICBndWludCBiaXRtYXNrID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIHJtdmMtPmRhdGEgKyAyMCk7CisjZW5kaWYKKyAgICAgICAgZ3VpbnQgY2hlY2tfdHlwZSA9IFFUX1VJTlQxNiAoKGd1aW50OCAqKSBybXZjLT5kYXRhICsgMjQpOworCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICAgInZlcnNpb24gY2hlY2sgYXRvbSBbJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIl0sIHZlcnNpb249MHglMDh4IgorICAgICAgICAgICAgIiwgbWFzaz0lMDh4LCBjaGVja190eXBlPSV1IiwgR1NUX0ZPVVJDQ19BUkdTIChwYWNrYWdlKSwgdmVyc2lvbiwKKyAgICAgICAgICAgIGJpdG1hc2ssIGNoZWNrX3R5cGUpOworICAgICAgICBpZiAocGFja2FnZSA9PSBGT1VSQ0NfcXRpbSAmJiBjaGVja190eXBlID09IDApIHsKKyAgICAgICAgICByZWYubWluX3JlcV9xdF92ZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZHJmID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChybWRhLCBGT1VSQ0NfcmRyZik7CisgICAgICBpZiAocmRyZikgeworICAgICAgICBndWludDMyIHJlZl90eXBlOworICAgICAgICBndWludDggKnJlZl9kYXRhOworICAgICAgICBndWludCByZWZfbGVuOworCisgICAgICAgIHJlZl9sZW4gPSBRVF9VSU5UMzIgKChndWludDggKikgcmRyZi0+ZGF0YSk7CisgICAgICAgIGlmIChyZWZfbGVuID4gMjApIHsKKyAgICAgICAgICByZWZfdHlwZSA9IFFUX0ZPVVJDQyAoKGd1aW50OCAqKSByZHJmLT5kYXRhICsgMTIpOworICAgICAgICAgIHJlZl9kYXRhID0gKGd1aW50OCAqKSByZHJmLT5kYXRhICsgMjA7CisgICAgICAgICAgaWYgKHJlZl90eXBlID09IEZPVVJDQ19hbGlzKSB7CisgICAgICAgICAgICBndWludCByZWNvcmRfbGVuLCByZWNvcmRfdmVyc2lvbiwgZm5fbGVuOworCisgICAgICAgICAgICBpZiAocmVmX2xlbiA+IDcwKSB7CisgICAgICAgICAgICAgIC8qIE1hY09TWCBhbGlhcyByZWNvcmQsIGdvb2dsZSBmb3IgYWxpYXMtbGF5b3V0LnR4dCAqLworICAgICAgICAgICAgICByZWNvcmRfbGVuID0gUVRfVUlOVDE2IChyZWZfZGF0YSArIDQpOworICAgICAgICAgICAgICByZWNvcmRfdmVyc2lvbiA9IFFUX1VJTlQxNiAocmVmX2RhdGEgKyA0ICsgMik7CisgICAgICAgICAgICAgIGZuX2xlbiA9IFFUX1VJTlQ4IChyZWZfZGF0YSArIDUwKTsKKyAgICAgICAgICAgICAgaWYgKHJlY29yZF9sZW4gPiA1MCAmJiByZWNvcmRfdmVyc2lvbiA9PSAyICYmIGZuX2xlbiA+IDApIHsKKyAgICAgICAgICAgICAgICByZWYubG9jYXRpb24gPSBnX3N0cm5kdXAgKChnY2hhciAqKSByZWZfZGF0YSArIDUxLCBmbl9sZW4pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJJbnZhbGlkIHJkcmYvYWxpcyBzaXplICgldSA8IDcwKSIsCisgICAgICAgICAgICAgICAgICByZWZfbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKHJlZl90eXBlID09IEZPVVJDQ191cmxfKSB7CisgICAgICAgICAgICByZWYubG9jYXRpb24gPSBnX3N0cm5kdXAgKChnY2hhciAqKSByZWZfZGF0YSwgcmVmX2xlbiAtIDgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICAgICAgICJ1bmtub3duIHJkcmYgcmVmZXJlbmNlIHR5cGUgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChyZWZfdHlwZSkpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAocmVmLmxvY2F0aW9uICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEdTVF9JTkZPX09CSkVDVCAocXRkZW11eCwgIk5ldyBsb2NhdGlvbjogJXMiLCByZWYubG9jYXRpb24pOworICAgICAgICAgICAgcmVkaXJlY3RzID0KKyAgICAgICAgICAgICAgICBnX2xpc3RfcHJlcGVuZCAocmVkaXJlY3RzLCBnX21lbWR1cCAoJnJlZiwgc2l6ZW9mIChyZWYpKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGV4dHJhY3QgcmVkaXJlY3QgbG9jYXRpb24gZnJvbSByZHJmIGF0b20iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAiSW52YWxpZCByZHJmIHNpemUgKCV1IDwgMjApIiwgcmVmX2xlbik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogbG9vayBmb3Igb3RoZXJzICovCisgICAgICBybWRhID0gcXRkZW11eF90cmVlX2dldF9zaWJsaW5nX2J5X3R5cGUgKHJtZGEsIEZPVVJDQ19ybWRhKTsKKyAgICB9CisKKyAgICBpZiAocmVkaXJlY3RzICE9IE5VTEwpIHsKKyAgICAgIHF0ZGVtdXhfcHJvY2Vzc19yZWRpcmVjdHMgKHF0ZGVtdXgsIHJlZGlyZWN0cyk7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0VGFnTGlzdCAqCitxdGRlbXV4X2FkZF9jb250YWluZXJfZm9ybWF0IChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0VGFnTGlzdCAqIHRhZ3MpCit7CisgIGNvbnN0IGdjaGFyICpmbXQ7CisKKyAgaWYgKHRhZ3MgPT0gTlVMTCkgeworICAgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAgIGdzdF90YWdfbGlzdF9zZXRfc2NvcGUgKHRhZ3MsIEdTVF9UQUdfU0NPUEVfR0xPQkFMKTsKKyAgfQorCisgIGlmIChxdGRlbXV4LT5tYWpvcl9icmFuZCA9PSBGT1VSQ0NfbWpwMikKKyAgICBmbXQgPSAiTW90aW9uIEpQRUcgMjAwMCI7CisgIGVsc2UgaWYgKChxdGRlbXV4LT5tYWpvcl9icmFuZCAmIDB4ZmZmZikgPT0gRk9VUkNDXzNnX18pCisgICAgZm10ID0gIjNHUCI7CisgIGVsc2UgaWYgKHF0ZGVtdXgtPm1ham9yX2JyYW5kID09IEZPVVJDQ19xdF9fKQorICAgIGZtdCA9ICJRdWlja3RpbWUiOworICBlbHNlIGlmIChxdGRlbXV4LT5mcmFnbWVudGVkKQorICAgIGZtdCA9ICJJU08gZk1QNCI7CisgIGVsc2UKKyAgICBmbXQgPSAiSVNPIE1QNC9NNEEiOworCisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAibWFwcGVkICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgdG8gJyVzJyIsCisgICAgICBHU1RfRk9VUkNDX0FSR1MgKHF0ZGVtdXgtPm1ham9yX2JyYW5kKSwgZm10KTsKKworICBnc3RfdGFnX2xpc3RfYWRkICh0YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIEdTVF9UQUdfQ09OVEFJTkVSX0ZPUk1BVCwKKyAgICAgIGZtdCwgTlVMTCk7CisKKyAgcmV0dXJuIHRhZ3M7Cit9CisKKy8qIHdlIGhhdmUgcmVhZCB0aGUgY29tcGxldGUgbW9vdiBub2RlIG5vdy4KKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIGFsbCBvZiB0aGUgcmVsZXZhbnQgaW5mbywgY3JlYXRlcyB0aGUgdHJha3MgYW5kCisgKiBwcmVwYXJlcyBhbGwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBwbGF5YmFjaworICovCitzdGF0aWMgZ2Jvb2xlYW4KK3F0ZGVtdXhfcGFyc2VfdHJlZSAoR3N0UVREZW11eCAqIHF0ZGVtdXgpCit7CisgIEdOb2RlICptdmhkOworICBHTm9kZSAqdHJhazsKKyAgR05vZGUgKnVkdGE7CisgIEdOb2RlICptdmV4OworICBHc3RDbG9ja1RpbWUgZHVyYXRpb247CisgIEdOb2RlICpwc3NoOworICBndWludDY0IGNyZWF0aW9uX3RpbWU7CisgIEdzdERhdGVUaW1lICpkYXRldGltZSA9IE5VTEw7CisgIGdpbnQgdmVyc2lvbjsKKworICAvKiBtYWtlIHN1cmUgd2UgaGF2ZSBhIHVzYWJsZSB0YWdsaXN0ICovCisgIHF0ZGVtdXgtPnRhZ19saXN0ID0gZ3N0X3RhZ19saXN0X21ha2Vfd3JpdGFibGUgKHF0ZGVtdXgtPnRhZ19saXN0KTsKKworICBtdmhkID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChxdGRlbXV4LT5tb292X25vZGUsIEZPVVJDQ19tdmhkKTsKKyAgaWYgKG12aGQgPT0gTlVMTCkgeworICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiTm8gbXZoZCBub2RlIGZvdW5kLCBsb29raW5nIGZvciByZWRpcmVjdHMuIik7CisgICAgcmV0dXJuIHF0ZGVtdXhfcGFyc2VfcmVkaXJlY3RzIChxdGRlbXV4KTsKKyAgfQorCisgIHZlcnNpb24gPSBRVF9VSU5UOCAoKGd1aW50OCAqKSBtdmhkLT5kYXRhICsgOCk7CisgIGlmICh2ZXJzaW9uID09IDEpIHsKKyAgICBjcmVhdGlvbl90aW1lID0gUVRfVUlOVDY0ICgoZ3VpbnQ4ICopIG12aGQtPmRhdGEgKyAxMik7CisgICAgcXRkZW11eC0+dGltZXNjYWxlID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIG12aGQtPmRhdGEgKyAyOCk7CisgICAgcXRkZW11eC0+ZHVyYXRpb24gPSBRVF9VSU5UNjQgKChndWludDggKikgbXZoZC0+ZGF0YSArIDMyKTsKKyAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDApIHsKKyAgICBjcmVhdGlvbl90aW1lID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIG12aGQtPmRhdGEgKyAxMik7CisgICAgcXRkZW11eC0+dGltZXNjYWxlID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIG12aGQtPmRhdGEgKyAyMCk7CisgICAgcXRkZW11eC0+ZHVyYXRpb24gPSBRVF9VSU5UMzIgKChndWludDggKikgbXZoZC0+ZGF0YSArIDI0KTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJVbmhhbmRsZWQgbXZoZCB2ZXJzaW9uICVkIiwgdmVyc2lvbik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogTW92aW5nIHF0IGNyZWF0aW9uIHRpbWUgKHNlY3Mgc2luY2UgMTkwNCkgdG8gdW5peCB0aW1lICovCisgIGlmIChjcmVhdGlvbl90aW1lICE9IDApIHsKKyAgICAvKiBUcnkgdG8gdXNlIGVwb2NoIGZpcnN0IGFzIGl0IHNob3VsZCBiZSBmYXN0ZXIgYW5kIG1vcmUgY29tbW9ubHkgZm91bmQgKi8KKyAgICBpZiAoY3JlYXRpb25fdGltZSA+PSBRVERFTVVYX1NFQ09ORFNfRlJPTV8xOTA0X1RPXzE5NzApIHsKKyAgICAgIEdUaW1lVmFsIG5vdzsKKworICAgICAgY3JlYXRpb25fdGltZSAtPSBRVERFTVVYX1NFQ09ORFNfRlJPTV8xOTA0X1RPXzE5NzA7CisgICAgICAvKiBzb21lIGRhdGEgY2xlYW5zaW5nIHNhbml0eSAqLworICAgICAgZ19nZXRfY3VycmVudF90aW1lICgmbm93KTsKKyAgICAgIGlmIChub3cudHZfc2VjICsgMjQgKiAzNjAwIDwgY3JlYXRpb25fdGltZSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZGlzY2FyZGluZyBib2d1cyBmdXR1cmUgY3JlYXRpb24gdGltZSIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0ZXRpbWUgPSBnc3RfZGF0ZV90aW1lX25ld19mcm9tX3VuaXhfZXBvY2hfdXRjIChjcmVhdGlvbl90aW1lKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgR0RhdGVUaW1lICpiYXNlX2R0ID0gZ19kYXRlX3RpbWVfbmV3X3V0YyAoMTkwNCwgMSwgMSwgMCwgMCwgMCk7CisgICAgICBHRGF0ZVRpbWUgKmR0LCAqZHRfbG9jYWw7CisKKyAgICAgIGR0ID0gZ19kYXRlX3RpbWVfYWRkX3NlY29uZHMgKGJhc2VfZHQsIGNyZWF0aW9uX3RpbWUpOworICAgICAgZHRfbG9jYWwgPSBnX2RhdGVfdGltZV90b19sb2NhbCAoZHQpOworICAgICAgZGF0ZXRpbWUgPSBnc3RfZGF0ZV90aW1lX25ld19mcm9tX2dfZGF0ZV90aW1lIChkdF9sb2NhbCk7CisKKyAgICAgIGdfZGF0ZV90aW1lX3VucmVmIChiYXNlX2R0KTsKKyAgICAgIGdfZGF0ZV90aW1lX3VucmVmIChkdCk7CisgICAgfQorICB9CisgIGlmIChkYXRldGltZSkgeworICAgIC8qIFVzZSBLRUVQIGFzIGV4cGxpY2l0IHRhZ3Mgc2hvdWxkIGhhdmUgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiBtdmhkIHRhZyAqLworICAgIGdzdF90YWdfbGlzdF9hZGQgKHF0ZGVtdXgtPnRhZ19saXN0LCBHU1RfVEFHX01FUkdFX0tFRVAsIEdTVF9UQUdfREFURV9USU1FLAorICAgICAgICBkYXRldGltZSwgTlVMTCk7CisgICAgZ3N0X2RhdGVfdGltZV91bnJlZiAoZGF0ZXRpbWUpOworICB9CisKKyAgR1NUX0lORk9fT0JKRUNUIChxdGRlbXV4LCAidGltZXNjYWxlOiAldSIsIHF0ZGVtdXgtPnRpbWVzY2FsZSk7CisgIEdTVF9JTkZPX09CSkVDVCAocXRkZW11eCwgImR1cmF0aW9uOiAlIiBHX0dVSU5UNjRfRk9STUFULCBxdGRlbXV4LT5kdXJhdGlvbik7CisKKyAgLyogY2hlY2sgZm9yIGZyYWdtZW50ZWQgZmlsZSBhbmQgZ2V0IHNvbWUgKGRlZmF1bHQpIGRhdGEgKi8KKyAgbXZleCA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAocXRkZW11eC0+bW9vdl9ub2RlLCBGT1VSQ0NfbXZleCk7CisgIGlmIChtdmV4KSB7CisgICAgR05vZGUgKm1laGQ7CisgICAgR3N0Qnl0ZVJlYWRlciBtZWhkX2RhdGE7CisKKyAgICAvKiBsZXQgdHJhY2sgcGFyc2luZyBvciBhbnlvbmUga25vdyB3ZWlyZCBzdHVmZiBtaWdodCBoYXBwZW4gLi4uICovCisgICAgcXRkZW11eC0+ZnJhZ21lbnRlZCA9IFRSVUU7CisKKyAgICAvKiBjb21wZW5zYXRlIGZvciB0b3RhbCBkdXJhdGlvbiAqLworICAgIG1laGQgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGVfZnVsbCAobXZleCwgRk9VUkNDX21laGQsICZtZWhkX2RhdGEpOworICAgIGlmIChtZWhkKQorICAgICAgcXRkZW11eF9wYXJzZV9tZWhkIChxdGRlbXV4LCAmbWVoZF9kYXRhKTsKKyAgfQorCisgIC8qIHNldCBkdXJhdGlvbiBpbiB0aGUgc2VnbWVudCBpbmZvICovCisgIGdzdF9xdGRlbXV4X2dldF9kdXJhdGlvbiAocXRkZW11eCwgJmR1cmF0aW9uKTsKKyAgaWYgKGR1cmF0aW9uKSB7CisgICAgcXRkZW11eC0+c2VnbWVudC5kdXJhdGlvbiA9IGR1cmF0aW9uOworICAgIC8qIGFsc28gZG8gbm90IGV4Y2VlZCBkdXJhdGlvbjsgc3RvcCBpcyBzZXQgdGhhdCB3YXkgcG9zdCBzZWVrIGFueXdheSwKKyAgICAgKiBhbmQgc2VnbWVudCBhY3RpdmF0aW9uIGZhbGxzIGJhY2sgdG8gZHVyYXRpb24sCisgICAgICogd2hlcmVhcyBsb29wIG9ubHkgY2hlY2tzIHN0b3AsIHNvIGxldCdzIGFsaWduIHRoaXMgaGVyZSBhcyB3ZWxsICovCisgICAgcXRkZW11eC0+c2VnbWVudC5zdG9wID0gZHVyYXRpb247CisgIH0KKworICAvKiBwYXJzZSBhbGwgdHJha3MgKi8KKyAgdHJhayA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAocXRkZW11eC0+bW9vdl9ub2RlLCBGT1VSQ0NfdHJhayk7CisgIHdoaWxlICh0cmFrKSB7CisgICAgcXRkZW11eF9wYXJzZV90cmFrIChxdGRlbXV4LCB0cmFrKTsKKyAgICAvKiBpdGVyYXRlIGFsbCBzaWJsaW5ncyAqLworICAgIHRyYWsgPSBxdGRlbXV4X3RyZWVfZ2V0X3NpYmxpbmdfYnlfdHlwZSAodHJhaywgRk9VUkNDX3RyYWspOworICB9CisKKyAgcXRkZW11eC0+dGFnX2xpc3QgPSBnc3RfdGFnX2xpc3RfbWFrZV93cml0YWJsZSAocXRkZW11eC0+dGFnX2xpc3QpOworCisgIC8qIGZpbmQgdGFncyAqLworICB1ZHRhID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChxdGRlbXV4LT5tb292X25vZGUsIEZPVVJDQ191ZHRhKTsKKyAgaWYgKHVkdGEpIHsKKyAgICBxdGRlbXV4X3BhcnNlX3VkdGEgKHF0ZGVtdXgsIHF0ZGVtdXgtPnRhZ19saXN0LCB1ZHRhKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIk5vIHVkdGEgbm9kZSBmb3VuZC4iKTsKKyAgfQorCisgIC8qIG1heWJlIGFsc28gc29tZSB0YWdzIGluIG1ldGEgYm94ICovCisgIHVkdGEgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHF0ZGVtdXgtPm1vb3Zfbm9kZSwgRk9VUkNDX21ldGEpOworICBpZiAodWR0YSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJQYXJzaW5nIG1ldGEgYm94IGZvciB0YWdzLiIpOworICAgIHF0ZGVtdXhfcGFyc2VfdWR0YSAocXRkZW11eCwgcXRkZW11eC0+dGFnX2xpc3QsIHVkdGEpOworICB9IGVsc2UgeworICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiTm8gbWV0YSBub2RlIGZvdW5kLiIpOworICB9CisKKyAgLyogcGFyc2UgYW55IHByb3RlY3Rpb24gc3lzdGVtIGluZm8gKi8KKyAgcHNzaCA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAocXRkZW11eC0+bW9vdl9ub2RlLCBGT1VSQ0NfcHNzaCk7CisgIHdoaWxlIChwc3NoKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJQYXJzaW5nIHBzc2ggYm94LiIpOworICAgIHF0ZGVtdXhfcGFyc2VfcHNzaCAocXRkZW11eCwgcHNzaCk7CisgICAgcHNzaCA9IHF0ZGVtdXhfdHJlZV9nZXRfc2libGluZ19ieV90eXBlIChwc3NoLCBGT1VSQ0NfcHNzaCk7CisgIH0KKworICBxdGRlbXV4LT50YWdfbGlzdCA9IHF0ZGVtdXhfYWRkX2NvbnRhaW5lcl9mb3JtYXQgKHF0ZGVtdXgsIHF0ZGVtdXgtPnRhZ19saXN0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogdGFrZW4gZnJvbSBmZm1wZWcgKi8KK3N0YXRpYyBpbnQKK3JlYWRfZGVzY3Jfc2l6ZSAoZ3VpbnQ4ICogcHRyLCBndWludDggKiBlbmQsIGd1aW50OCAqKiBlbmRfb3V0KQoreworICBpbnQgY291bnQgPSA0OworICBpbnQgbGVuID0gMDsKKworICB3aGlsZSAoY291bnQtLSkgeworICAgIGludCBjOworCisgICAgaWYgKHB0ciA+PSBlbmQpCisgICAgICByZXR1cm4gLTE7CisKKyAgICBjID0gKnB0cisrOworICAgIGxlbiA9IChsZW4gPDwgNykgfCAoYyAmIDB4N2YpOworICAgIGlmICghKGMgJiAweDgwKSkKKyAgICAgIGJyZWFrOworICB9CisgICplbmRfb3V0ID0gcHRyOworICByZXR1cm4gbGVuOworfQorCisvKiB0aGlzIGNhbiBjaGFuZ2UgdGhlIGNvZGVjIG9yaWdpbmFsbHkgcHJlc2VudCBpbiBAbGlzdCAqLworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X2hhbmRsZV9lc2RzIChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwKKyAgICBRdERlbXV4U3RyZWFtU3RzZEVudHJ5ICogZW50cnksIEdOb2RlICogZXNkcywgR3N0VGFnTGlzdCAqIGxpc3QpCit7CisgIGludCBsZW4gPSBRVF9VSU5UMzIgKGVzZHMtPmRhdGEpOworICBndWludDggKnB0ciA9IGVzZHMtPmRhdGE7CisgIGd1aW50OCAqZW5kID0gcHRyICsgbGVuOworICBpbnQgdGFnOworICBndWludDggKmRhdGFfcHRyID0gTlVMTDsKKyAgaW50IGRhdGFfbGVuID0gMDsKKyAgZ3VpbnQ4IG9iamVjdF90eXBlX2lkID0gMDsKKyAgY29uc3QgY2hhciAqY29kZWNfbmFtZSA9IE5VTEw7CisgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworCisgIEdTVF9NRU1EVU1QX09CSkVDVCAocXRkZW11eCwgImVzZHMiLCBwdHIsIGxlbik7CisgIHB0ciArPSA4OworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAidmVyc2lvbi9mbGFncyA9ICUwOHgiLCBRVF9VSU5UMzIgKHB0cikpOworICBwdHIgKz0gNDsKKyAgd2hpbGUgKHB0ciArIDEgPCBlbmQpIHsKKyAgICB0YWcgPSBRVF9VSU5UOCAocHRyKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAidGFnID0gJTAyeCIsIHRhZyk7CisgICAgcHRyKys7CisgICAgbGVuID0gcmVhZF9kZXNjcl9zaXplIChwdHIsIGVuZCwgJnB0cik7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImxlbiA9ICVkIiwgbGVuKTsKKworICAgIC8qIENoZWNrIHRoZSBzdGF0ZWQgYW1vdW50IG9mIGRhdGEgaXMgYXZhaWxhYmxlIGZvciByZWFkaW5nICovCisgICAgaWYgKGxlbiA8IDAgfHwgcHRyICsgbGVuID4gZW5kKQorICAgICAgYnJlYWs7CisKKyAgICBzd2l0Y2ggKHRhZykgeworICAgICAgY2FzZSBFU19ERVNDUklQVE9SX1RBRzoKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIklEICUwNHgiLCBRVF9VSU5UMTYgKHB0cikpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicHJpb3JpdHkgJTA0eCIsIFFUX1VJTlQ4IChwdHIgKyAyKSk7CisgICAgICAgIHB0ciArPSAzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgREVDT0RFUl9DT05GSUdfREVTQ19UQUc6eworICAgICAgICBndWludCBtYXhfYml0cmF0ZSwgYXZnX2JpdHJhdGU7CisKKyAgICAgICAgb2JqZWN0X3R5cGVfaWQgPSBRVF9VSU5UOCAocHRyKTsKKyAgICAgICAgbWF4X2JpdHJhdGUgPSBRVF9VSU5UMzIgKHB0ciArIDUpOworICAgICAgICBhdmdfYml0cmF0ZSA9IFFUX1VJTlQzMiAocHRyICsgOSk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJvYmplY3RfdHlwZV9pZCAlMDJ4Iiwgb2JqZWN0X3R5cGVfaWQpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic3RyZWFtX3R5cGUgJTAyeCIsIFFUX1VJTlQ4IChwdHIgKyAxKSk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJidWZmZXJfc2l6ZV9kYiAlMDJ4IiwgUVRfVUlOVDI0IChwdHIgKyAyKSk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJtYXggYml0cmF0ZSAldSIsIG1heF9iaXRyYXRlKTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImF2ZyBiaXRyYXRlICV1IiwgYXZnX2JpdHJhdGUpOworICAgICAgICBpZiAobWF4X2JpdHJhdGUgPiAwICYmIG1heF9iaXRyYXRlIDwgR19NQVhVSU5UMzIpIHsKKyAgICAgICAgICBnc3RfdGFnX2xpc3RfYWRkIChsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgICAgIEdTVF9UQUdfTUFYSU1VTV9CSVRSQVRFLCBtYXhfYml0cmF0ZSwgTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2Z19iaXRyYXRlID4gMCAmJiBhdmdfYml0cmF0ZSA8IEdfTUFYVUlOVDMyKSB7CisgICAgICAgICAgZ3N0X3RhZ19saXN0X2FkZCAobGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLCBHU1RfVEFHX0JJVFJBVEUsCisgICAgICAgICAgICAgIGF2Z19iaXRyYXRlLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBwdHIgKz0gMTM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBERUNPREVSX1NQRUNJRklDX0lORk9fVEFHOgorICAgICAgICBHU1RfTUVNRFVNUF9PQkpFQ1QgKHF0ZGVtdXgsICJkYXRhIiwgcHRyLCBsZW4pOworICAgICAgICBpZiAob2JqZWN0X3R5cGVfaWQgPT0gMHhlMCAmJiBsZW4gPT0gMHg0MCkgeworICAgICAgICAgIGd1aW50OCAqZGF0YTsKKyAgICAgICAgICBHc3RTdHJ1Y3R1cmUgKnM7CisgICAgICAgICAgZ3VpbnQzMiBjbHV0WzE2XTsKKyAgICAgICAgICBnaW50IGk7CisKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICAgICAiSGF2ZSBWT0JTVUIgcGFsZXR0ZS4gQ3JlYXRpbmcgcGFsZXR0ZSBldmVudCIpOworICAgICAgICAgIC8qIG1vdmUgdG8gZGVjQ29uZmlnRGVzY3IgZGF0YSBhbmQgcmVhZCBwYWxldHRlICovCisgICAgICAgICAgZGF0YSA9IHB0cjsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgY2x1dFtpXSA9IFFUX1VJTlQzMiAoZGF0YSk7CisgICAgICAgICAgICBkYXRhICs9IDQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1nc3QtZHZkIiwgImV2ZW50IiwKKyAgICAgICAgICAgICAgR19UWVBFX1NUUklORywgImR2ZC1zcHUtY2x1dC1jaGFuZ2UiLAorICAgICAgICAgICAgICAiY2x1dDAwIiwgR19UWVBFX0lOVCwgY2x1dFswXSwgImNsdXQwMSIsIEdfVFlQRV9JTlQsIGNsdXRbMV0sCisgICAgICAgICAgICAgICJjbHV0MDIiLCBHX1RZUEVfSU5ULCBjbHV0WzJdLCAiY2x1dDAzIiwgR19UWVBFX0lOVCwgY2x1dFszXSwKKyAgICAgICAgICAgICAgImNsdXQwNCIsIEdfVFlQRV9JTlQsIGNsdXRbNF0sICJjbHV0MDUiLCBHX1RZUEVfSU5ULCBjbHV0WzVdLAorICAgICAgICAgICAgICAiY2x1dDA2IiwgR19UWVBFX0lOVCwgY2x1dFs2XSwgImNsdXQwNyIsIEdfVFlQRV9JTlQsIGNsdXRbN10sCisgICAgICAgICAgICAgICJjbHV0MDgiLCBHX1RZUEVfSU5ULCBjbHV0WzhdLCAiY2x1dDA5IiwgR19UWVBFX0lOVCwgY2x1dFs5XSwKKyAgICAgICAgICAgICAgImNsdXQxMCIsIEdfVFlQRV9JTlQsIGNsdXRbMTBdLCAiY2x1dDExIiwgR19UWVBFX0lOVCwgY2x1dFsxMV0sCisgICAgICAgICAgICAgICJjbHV0MTIiLCBHX1RZUEVfSU5ULCBjbHV0WzEyXSwgImNsdXQxMyIsIEdfVFlQRV9JTlQsIGNsdXRbMTNdLAorICAgICAgICAgICAgICAiY2x1dDE0IiwgR19UWVBFX0lOVCwgY2x1dFsxNF0sICJjbHV0MTUiLCBHX1RZUEVfSU5ULCBjbHV0WzE1XSwKKyAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgICAvKiBzdG9yZSBldmVudCBhbmQgdHJpZ2dlciBjdXN0b20gcHJvY2Vzc2luZyAqLworICAgICAgICAgIHN0cmVhbS0+cGVuZGluZ19ldmVudCA9CisgICAgICAgICAgICAgIGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX0RPV05TVFJFQU0sIHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIEdlbmVyaWMgY29kZWNfZGF0YSBoYW5kbGVyIHB1dHMgaXQgb24gdGhlIGNhcHMgKi8KKyAgICAgICAgICBkYXRhX3B0ciA9IHB0cjsKKyAgICAgICAgICBkYXRhX2xlbiA9IGxlbjsKKyAgICAgICAgfQorCisgICAgICAgIHB0ciArPSBsZW47CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTTF9DT05GSUdfREVTQ19UQUc6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJkYXRhICUwMngiLCBRVF9VSU5UOCAocHRyKSk7CisgICAgICAgIHB0ciArPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJVbmtub3duL3VuaGFuZGxlZCBkZXNjcmlwdG9yIHRhZyAlMDJ4IiwKKyAgICAgICAgICAgIHRhZyk7CisgICAgICAgIEdTVF9NRU1EVU1QX09CSkVDVCAocXRkZW11eCwgImRlc2NyaXB0b3IgZGF0YSIsIHB0ciwgbGVuKTsKKyAgICAgICAgcHRyICs9IGxlbjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLyogb2JqZWN0X3R5cGVfaWQgaW4gdGhlIGVzZHMgYXRvbSBpbiBtcDRhIGFuZCBtcDR2IHRlbGxzIHVzIHdoaWNoIGNvZGVjIGlzCisgICAqIGluIHVzZSwgYW5kIHNob3VsZCBhbHNvIGJlIHVzZWQgdG8gb3ZlcnJpZGUgc29tZSBvdGhlciBwYXJhbWV0ZXJzIGZvciBzb21lCisgICAqIGNvZGVjcy4gKi8KKyAgc3dpdGNoIChvYmplY3RfdHlwZV9pZCkgeworICAgIGNhc2UgMHgyMDogICAgICAgICAgICAgICAgIC8qIE1QRUctNCAqLworICAgICAgLyogNCBieXRlcyBmb3IgdGhlIHZpc3VhbF9vYmplY3Rfc2VxdWVuY2Vfc3RhcnRfY29kZSBhbmQgMSBieXRlIGZvciB0aGUKKyAgICAgICAqIHByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24gKi8KKyAgICAgIGlmIChkYXRhX3B0ciAhPSBOVUxMICYmIGRhdGFfbGVuID49IDUgJiYKKyAgICAgICAgICBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGFfcHRyKSA9PSAweDAwMDAwMWIwKSB7CisgICAgICAgIGdzdF9jb2RlY191dGlsc19tcGVnNHZpZGVvX2NhcHNfc2V0X2xldmVsX2FuZF9wcm9maWxlIChlbnRyeS0+Y2FwcywKKyAgICAgICAgICAgIGRhdGFfcHRyICsgNCwgZGF0YV9sZW4gLSA0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgLyogTm90aGluZyBzcGVjaWFsIG5lZWRlZCBoZXJlICovCisgICAgY2FzZSAweDIxOiAgICAgICAgICAgICAgICAgLyogSC4yNjQgKi8KKyAgICAgIGNvZGVjX25hbWUgPSAiSC4yNjQgLyBBVkMiOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWgyNjQiLAorICAgICAgICAgICJzdHJlYW0tZm9ybWF0IiwgR19UWVBFX1NUUklORywgImF2YyIsCisgICAgICAgICAgImFsaWdubWVudCIsIEdfVFlQRV9TVFJJTkcsICJhdSIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDQwOiAgICAgICAgICAgICAgICAgLyogQUFDIChhbnkpICovCisgICAgY2FzZSAweDY2OiAgICAgICAgICAgICAgICAgLyogQUFDIE1haW4gKi8KKyAgICBjYXNlIDB4Njc6ICAgICAgICAgICAgICAgICAvKiBBQUMgTEMgKi8KKyAgICBjYXNlIDB4Njg6ICAgICAgICAgICAgICAgICAvKiBBQUMgU1NSICovCisgICAgICAvKiBPdmVycmlkZSBjaGFubmVscyBhbmQgcmF0ZSBiYXNlZCBvbiB0aGUgY29kZWNfZGF0YSwgYXMgaXQncyBvZnRlbgorICAgICAgICogd3JvbmcuICovCisgICAgICAvKiBPbmx5IGRvIHNvIGZvciBiYXNpYyBzZXR1cCB3aXRob3V0IEhFLUFBQyBleHRlbnNpb24gKi8KKyAgICAgIGlmIChkYXRhX3B0ciAmJiBkYXRhX2xlbiA9PSAyKSB7CisgICAgICAgIGd1aW50IGNoYW5uZWxzLCByYXRlOworCisgICAgICAgIGNoYW5uZWxzID0gZ3N0X2NvZGVjX3V0aWxzX2FhY19nZXRfY2hhbm5lbHMgKGRhdGFfcHRyLCBkYXRhX2xlbik7CisgICAgICAgIGlmIChjaGFubmVscyA+IDApCisgICAgICAgICAgZW50cnktPm5fY2hhbm5lbHMgPSBjaGFubmVsczsKKworICAgICAgICByYXRlID0gZ3N0X2NvZGVjX3V0aWxzX2FhY19nZXRfc2FtcGxlX3JhdGUgKGRhdGFfcHRyLCBkYXRhX2xlbik7CisgICAgICAgIGlmIChyYXRlID4gMCkKKyAgICAgICAgICBlbnRyeS0+cmF0ZSA9IHJhdGU7CisgICAgICB9CisKKyAgICAgIC8qIFNldCBsZXZlbCBhbmQgcHJvZmlsZSBpZiBwb3NzaWJsZSAqLworICAgICAgaWYgKGRhdGFfcHRyICE9IE5VTEwgJiYgZGF0YV9sZW4gPj0gMikgeworICAgICAgICBnc3RfY29kZWNfdXRpbHNfYWFjX2NhcHNfc2V0X2xldmVsX2FuZF9wcm9maWxlIChlbnRyeS0+Y2FwcywKKyAgICAgICAgICAgIGRhdGFfcHRyLCBkYXRhX2xlbik7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBnY2hhciAqcHJvZmlsZV9zdHIgPSBOVUxMOworICAgICAgICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgICAgICAgR3N0TWFwSW5mbyBtYXA7CisgICAgICAgIGd1aW50OCAqY29kZWNfZGF0YTsKKyAgICAgICAgZ2ludCByYXRlX2lkeCwgcHJvZmlsZTsKKworICAgICAgICAvKiBObyBjb2RlY19kYXRhLCBsZXQncyBpbnZlbnQgc29tZXRoaW5nLgorICAgICAgICAgKiBGSVhNRTogVGhpcyBpcyB3cm9uZyBmb3IgU0JSISAqLworCisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIk5vIGNvZGVjX2RhdGEgZm9yIEFBQyBhdmFpbGFibGUiKTsKKworICAgICAgICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDIpOworICAgICAgICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICAgICAgY29kZWNfZGF0YSA9IG1hcC5kYXRhOworCisgICAgICAgIHJhdGVfaWR4ID0KKyAgICAgICAgICAgIGdzdF9jb2RlY191dGlsc19hYWNfZ2V0X2luZGV4X2Zyb21fc2FtcGxlX3JhdGUgKENVUl9TVFJFQU0KKyAgICAgICAgICAgIChzdHJlYW0pLT5yYXRlKTsKKworICAgICAgICBzd2l0Y2ggKG9iamVjdF90eXBlX2lkKSB7CisgICAgICAgICAgY2FzZSAweDY2OgorICAgICAgICAgICAgcHJvZmlsZV9zdHIgPSAibWFpbiI7CisgICAgICAgICAgICBwcm9maWxlID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMHg2NzoKKyAgICAgICAgICAgIHByb2ZpbGVfc3RyID0gImxjIjsKKyAgICAgICAgICAgIHByb2ZpbGUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAweDY4OgorICAgICAgICAgICAgcHJvZmlsZV9zdHIgPSAic3NyIjsKKyAgICAgICAgICAgIHByb2ZpbGUgPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHByb2ZpbGUgPSAzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb2RlY19kYXRhWzBdID0gKChwcm9maWxlICsgMSkgPDwgMykgfCAoKHJhdGVfaWR4ICYgMHhFKSA+PiAxKTsKKyAgICAgICAgY29kZWNfZGF0YVsxXSA9CisgICAgICAgICAgICAoKHJhdGVfaWR4ICYgMHgxKSA8PCA3KSB8IChDVVJfU1RSRUFNIChzdHJlYW0pLT5uX2NoYW5uZWxzIDw8IDMpOworCisgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMsICJjb2RlY19kYXRhIiwKKyAgICAgICAgICAgIEdTVF9UWVBFX0JVRkZFUiwgYnVmZmVyLCBOVUxMKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICAgICAgICBpZiAocHJvZmlsZV9zdHIpIHsKKyAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLCAicHJvZmlsZSIsCisgICAgICAgICAgICAgIEdfVFlQRV9TVFJJTkcsIHByb2ZpbGVfc3RyLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAweDYwOiAgICAgICAgICAgICAgICAgLyogTVBFRy0yLCB2YXJpb3VzIHByb2ZpbGVzICovCisgICAgY2FzZSAweDYxOgorICAgIGNhc2UgMHg2MjoKKyAgICBjYXNlIDB4NjM6CisgICAgY2FzZSAweDY0OgorICAgIGNhc2UgMHg2NToKKyAgICAgIGNvZGVjX25hbWUgPSAiTVBFRy0yIHZpZGVvIjsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8vbXBlZyIsCisgICAgICAgICAgIm1wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgMiwKKyAgICAgICAgICAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHg2OTogICAgICAgICAgICAgICAgIC8qIE1QRUctMiBCQyBhdWRpbyAqLworICAgIGNhc2UgMHg2QjogICAgICAgICAgICAgICAgIC8qIE1QRUctMSBhdWRpbyAqLworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby9tcGVnIiwKKyAgICAgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgICAgIGNvZGVjX25hbWUgPSAiTVBFRy0xIGF1ZGlvIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHg2QTogICAgICAgICAgICAgICAgIC8qIE1QRUctMSAqLworICAgICAgY29kZWNfbmFtZSA9ICJNUEVHLTEgdmlkZW8iOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby9tcGVnIiwKKyAgICAgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAxLAorICAgICAgICAgICJzeXN0ZW1zdHJlYW0iLCBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDZDOiAgICAgICAgICAgICAgICAgLyogTUpQRUcgKi8KKyAgICAgIGNhcHMgPQorICAgICAgICAgIGdzdF9jYXBzX25ld19zaW1wbGUgKCJpbWFnZS9qcGVnIiwgInBhcnNlZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLAorICAgICAgICAgIE5VTEwpOworICAgICAgY29kZWNfbmFtZSA9ICJNb3Rpb24tSlBFRyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4NkQ6ICAgICAgICAgICAgICAgICAvKiBQTkcgKi8KKyAgICAgIGNhcHMgPQorICAgICAgICAgIGdzdF9jYXBzX25ld19zaW1wbGUgKCJpbWFnZS9wbmciLCAicGFyc2VkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsCisgICAgICAgICAgTlVMTCk7CisgICAgICBjb2RlY19uYW1lID0gIlBORyBzdGlsbCBpbWFnZXMiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDZFOiAgICAgICAgICAgICAgICAgLyogSlBFRzIwMDAgKi8KKyAgICAgIGNvZGVjX25hbWUgPSAiSlBFRy0yMDAwIjsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiaW1hZ2UveC1qMmMiLCAiZmllbGRzIiwgR19UWVBFX0lOVCwgMSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4QTQ6ICAgICAgICAgICAgICAgICAvKiBEaXJhYyAqLworICAgICAgY29kZWNfbmFtZSA9ICJEaXJhYyI7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtZGlyYWMiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHhBNTogICAgICAgICAgICAgICAgIC8qIEFDMyAqLworICAgICAgY29kZWNfbmFtZSA9ICJBQy0zIGF1ZGlvIjsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1hYzMiLAorICAgICAgICAgICJmcmFtZWQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4QTk6ICAgICAgICAgICAgICAgICAvKiBBQzMgKi8KKyAgICAgIGNvZGVjX25hbWUgPSAiRFRTIGF1ZGlvIjsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1kdHMiLAorICAgICAgICAgICJmcmFtZWQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4RTE6ICAgICAgICAgICAgICAgICAvKiBRQ0VMUCAqLworICAgICAgLyogUUNFTFAsIHRoZSBjb2RlY19kYXRhIGlzIGEgcmlmZiB0YWcgKGxpdHRsZSBlbmRpYW4pIHdpdGgKKyAgICAgICAqIG1vcmUgaW5mbyAoaHR0cDovL2Z0cC4zZ3BwMi5vcmcvVFNHQy9Xb3JraW5nLzIwMDMvMjAwMy0wNS1TYW5EaWVnby9UU0ctQy0yMDAzLTA1LVNhbiUyMERpZWdvL1dHMS9TV0cxMi9DMTItMjAwMzA1MTItMDA2JTIwPSUyMEMxMi0yMDAzMDIxNy0wMTVfRHJhZnRfQmFzZWxpbmUlMjBUZXh0JTIwb2YlMjBGRk1TX1IyLmRvYykuICovCisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3FjZWxwIik7CisgICAgICBjb2RlY19uYW1lID0gIlFDRUxQIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIElmIHdlIGhhdmUgYSByZXBsYWNlbWVudCBjYXBzLCB0aGVuIGNoYW5nZSBvdXIgY2FwcyBmb3IgdGhpcyBzdHJlYW0gKi8KKyAgaWYgKGNhcHMpIHsKKyAgICBnc3RfY2Fwc191bnJlZiAoZW50cnktPmNhcHMpOworICAgIGVudHJ5LT5jYXBzID0gY2FwczsKKyAgfQorCisgIGlmIChjb2RlY19uYW1lICYmIGxpc3QpCisgICAgZ3N0X3RhZ19saXN0X2FkZCAobGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICBHU1RfVEFHX0FVRElPX0NPREVDLCBjb2RlY19uYW1lLCBOVUxMKTsKKworICAvKiBBZGQgdGhlIGNvZGVjX2RhdGEgYXR0cmlidXRlIHRvIGNhcHMsIGlmIHdlIGhhdmUgaXQgKi8KKyAgaWYgKGRhdGFfcHRyKSB7CisgICAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGRhdGFfbGVuKTsKKyAgICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZmZlciwgMCwgZGF0YV9wdHIsIGRhdGFfbGVuKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJzZXR0aW5nIGNvZGVjX2RhdGEgZnJvbSBlc2RzIik7CisgICAgR1NUX01FTURVTVBfT0JKRUNUIChxdGRlbXV4LCAiY29kZWNfZGF0YSBmcm9tIGVzZHMiLCBkYXRhX3B0ciwgZGF0YV9sZW4pOworCisgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLAorICAgICAgICBidWZmZXIsIE5VTEwpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgIH0KKworfQorCitzdGF0aWMgaW5saW5lIEdzdENhcHMgKgorX2dldF91bmtub3duX2NvZGVjX25hbWUgKGNvbnN0IGdjaGFyICogdHlwZSwgZ3VpbnQzMiBmb3VyY2MpCit7CisgIEdzdENhcHMgKmNhcHM7CisgIGd1aW50IGk7CisgIGNoYXIgKnMsIGZvdXJzdHJbNV07CisKKyAgZ19zbnByaW50ZiAoZm91cnN0ciwgNSwgIiUiIEdTVF9GT1VSQ0NfRk9STUFULCBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYykpOworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgaWYgKCFnX2FzY2lpX2lzYWxudW0gKGZvdXJzdHJbaV0pKQorICAgICAgZm91cnN0cltpXSA9ICdfJzsKKyAgfQorICBzID0gZ19zdHJkdXBfcHJpbnRmICgiJXMveC1nc3QtZm91cmNjLSVzIiwgdHlwZSwgZ19zdHJzdHJpcCAoZm91cnN0cikpOworICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAocyk7CisgIGdfZnJlZSAocyk7CisgIHJldHVybiBjYXBzOworfQorCisjZGVmaW5lIF9jb2RlYyhuYW1lKSBcCisgIGRvIHsgXAorICAgIGlmIChjb2RlY19uYW1lKSB7IFwKKyAgICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXAgKG5hbWUpOyBcCisgICAgfSBcCisgIH0gd2hpbGUgKDApCisKK3N0YXRpYyBHc3RDYXBzICoKK3F0ZGVtdXhfdmlkZW9fY2FwcyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0sCisgICAgUXREZW11eFN0cmVhbVN0c2RFbnRyeSAqIGVudHJ5LCBndWludDMyIGZvdXJjYywKKyAgICBjb25zdCBndWludDggKiBzdHNkX2VudHJ5X2RhdGEsIGdjaGFyICoqIGNvZGVjX25hbWUpCit7CisgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworICBHc3RWaWRlb0Zvcm1hdCBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX1VOS05PV047CisKKyAgc3dpdGNoIChmb3VyY2MpIHsKKyAgICBjYXNlIEZPVVJDQ19wbmc6CisgICAgICBfY29kZWMgKCJQTkcgc3RpbGwgaW1hZ2VzIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImltYWdlL3BuZyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfanBlZzoKKyAgICAgIF9jb2RlYyAoIkpQRUcgc3RpbGwgaW1hZ2VzIik7CisgICAgICBjYXBzID0KKyAgICAgICAgICBnc3RfY2Fwc19uZXdfc2ltcGxlICgiaW1hZ2UvanBlZyIsICJwYXJzZWQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwKKyAgICAgICAgICBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnbScsICdqJywgJ3AnLCAnYScpOgorICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnQScsICdWJywgJ0QnLCAnSicpOgorICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnTScsICdKJywgJ1AnLCAnRycpOgorICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnZCcsICdtJywgJ2InLCAnMScpOgorICAgICAgX2NvZGVjICgiTW90aW9uLUpQRUciKTsKKyAgICAgIGNhcHMgPQorICAgICAgICAgIGdzdF9jYXBzX25ld19zaW1wbGUgKCJpbWFnZS9qcGVnIiwgInBhcnNlZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLAorICAgICAgICAgIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdtJywgJ2onLCAncCcsICdiJyk6CisgICAgICBfY29kZWMgKCJNb3Rpb24tSlBFRyBmb3JtYXQgQiIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJ2aWRlby94LW1qcGVnLWIiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX21qcDI6CisgICAgICBfY29kZWMgKCJKUEVHLTIwMDAiKTsKKyAgICAgIC8qIG92ZXJyaWRlIHRvIHdoYXQgaXQgc2hvdWxkIGJlIGFjY29yZGluZyB0byBzcGVjLCBhdm9pZCBwYWxldHRlX2RhdGEgKi8KKyAgICAgIGVudHJ5LT5iaXRzX3Blcl9zYW1wbGUgPSAyNDsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiaW1hZ2UveC1qMmMiLCAiZmllbGRzIiwgR19UWVBFX0lOVCwgMSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19TVlEzOgorICAgICAgX2NvZGVjICgiU29yZW5zZW4gdmlkZW8gdi4zIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtc3ZxIiwKKyAgICAgICAgICAic3ZxdmVyc2lvbiIsIEdfVFlQRV9JTlQsIDMsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdzJywgJ3YnLCAncScsICdpJyk6CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdTJywgJ1YnLCAnUScsICcxJyk6CisgICAgICBfY29kZWMgKCJTb3JlbnNlbiB2aWRlbyB2LjEiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1zdnEiLAorICAgICAgICAgICJzdnF2ZXJzaW9uIiwgR19UWVBFX0lOVCwgMSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ1cnLCAnUicsICdBJywgJ1cnKToKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgidmlkZW8veC1yYXciKTsKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiUkdCOFAiLCBOVUxMKTsKKyAgICAgIF9jb2RlYyAoIldpbmRvd3MgUmF3IFJHQiIpOworICAgICAgc3RyZWFtLT5hbGlnbm1lbnQgPSAzMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX3Jhd186CisgICAgeworICAgICAgZ3VpbnQxNiBicHM7CisKKyAgICAgIGJwcyA9IFFUX1VJTlQxNiAoc3RzZF9lbnRyeV9kYXRhICsgODIpOworICAgICAgc3dpdGNoIChicHMpIHsKKyAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX1JHQjE1OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE2OgorICAgICAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfUkdCMTY7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9SR0I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9BUkdCOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIC8qIHVua25vd24gKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ3knLCAndicsICcxJywgJzInKToKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfSTQyMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneScsICd1JywgJ3YnLCAnMicpOgorICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnWScsICd1JywgJ3YnLCAnMicpOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9JNDIwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfMnZ1eToKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJzInLCAnVicsICd1JywgJ3knKToKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfVVlWWTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgndicsICczJywgJzAnLCAnOCcpOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF92MzA4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCd2JywgJzInLCAnMScsICc2Jyk6CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX3YyMTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ192MjEwOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF92MjEwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdyJywgJzInLCAnMScsICcwJyk6CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX3IyMTA7CisgICAgICBicmVhazsKKyAgICAgIC8qIFBhY2tlZCBZVVYgNDo0OjQgMTAgYml0IGluIDMyIGJpdHMsIGNvbXBsZXgKKyAgICAgICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgndicsICc0JywgJzEnLCAnMCcpOgorICAgICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF92NDEwOworICAgICAgICAgYnJlYWs7CisgICAgICAgKi8KKyAgICAgIC8qIFBhY2tlZCBZVVYgNDo0OjQ6NCA4IGJpdCBpbiAzMiBiaXRzCisgICAgICAgKiBidXQgZGlmZmVyZW50IG9yZGVyIHRoYW4gQVlVVgorICAgICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgndicsICc0JywgJzAnLCAnOCcpOgorICAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfdjQwODsKKyAgICAgICBicmVhazsKKyAgICAgICAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnbScsICdwJywgJ2UnLCAnZycpOgorICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnbScsICdwJywgJ2cnLCAnMScpOgorICAgICAgX2NvZGVjICgiTVBFRy0xIHZpZGVvIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL21wZWciLCAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAxLAorICAgICAgICAgICJzeXN0ZW1zdHJlYW0iLCBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdoJywgJ2QnLCAndicsICcxJyk6IC8qIEhEViA3MjBwMzAgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2gnLCAnZCcsICd2JywgJzInKTogLyogSERWIDEwODBpNjAgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2gnLCAnZCcsICd2JywgJzMnKTogLyogSERWIDEwODBpNTAgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2gnLCAnZCcsICd2JywgJzQnKTogLyogSERWIDcyMHAyNCAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnaCcsICdkJywgJ3YnLCAnNScpOiAvKiBIRFYgNzIwcDI1ICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdoJywgJ2QnLCAndicsICc2Jyk6IC8qIEhEViAxMDgwcDI0ICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdoJywgJ2QnLCAndicsICc3Jyk6IC8qIEhEViAxMDgwcDI1ICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdoJywgJ2QnLCAndicsICc4Jyk6IC8qIEhEViAxMDgwcDMwICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdoJywgJ2QnLCAndicsICc5Jyk6IC8qIEhEViA3MjBwNjAgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2gnLCAnZCcsICd2JywgJ2EnKTogLyogSERWIDcyMHA1MCAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnbScsICd4JywgJzUnLCAnbicpOiAvKiBNUEVHMiBJTVggTlRTQyA1MjUvNjAgNTBtYi9zIHByb2R1Y2VkIGJ5IEZDUCAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnbScsICd4JywgJzUnLCAncCcpOiAvKiBNUEVHMiBJTVggUEFMIDYyNS82MCA1MG1iL3MgcHJvZHVjZWQgYnkgRkNQICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdtJywgJ3gnLCAnNCcsICduJyk6IC8qIE1QRUcyIElNWCBOVFNDIDUyNS82MCA0MG1iL3MgcHJvZHVjZWQgYnkgRkNQICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdtJywgJ3gnLCAnNCcsICdwJyk6IC8qIE1QRUcyIElNWCBQQUwgNjI1LzYwIDQwbWIvcyBwcm9kdWNlZCBieSBGQ1AgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ20nLCAneCcsICczJywgJ24nKTogLyogTVBFRzIgSU1YIE5UU0MgNTI1LzYwIDMwbWIvcyBwcm9kdWNlZCBieSBGQ1AgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ20nLCAneCcsICczJywgJ3AnKTogLyogTVBFRzIgSU1YIFBBTCA2MjUvNTAgMzBtYi9zIHByb2R1Y2VkIGJ5IEZDUCAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJ3YnLCAnMScpOiAvKiBYRENBTSBIRCA3MjBwMzAgMzVNYi9zICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCd4JywgJ2QnLCAndicsICcyJyk6IC8qIFhEQ0FNIEhEIDEwODBpNjAgMzVNYi9zICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCd4JywgJ2QnLCAndicsICczJyk6IC8qIFhEQ0FNIEhEIDEwODBpNTAgMzVNYi9zICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCd4JywgJ2QnLCAndicsICc0Jyk6IC8qIFhEQ0FNIEhEIDcyMHAyNCAzNU1iL3MgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ3gnLCAnZCcsICd2JywgJzUnKTogLyogWERDQU0gSEQgNzIwcDI1IDM1TWIvcyAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJ3YnLCAnNicpOiAvKiBYRENBTSBIRCAxMDgwcDI0IDM1TWIvcyAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJ3YnLCAnNycpOiAvKiBYRENBTSBIRCAxMDgwcDI1IDM1TWIvcyAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJ3YnLCAnOCcpOiAvKiBYRENBTSBIRCAxMDgwcDMwIDM1TWIvcyAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJ3YnLCAnOScpOiAvKiBYRENBTSBIRCA3MjBwNjAgMzVNYi9zICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCd4JywgJ2QnLCAndicsICdhJyk6IC8qIFhEQ0FNIEhEIDcyMHA1MCAzNU1iL3MgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ3gnLCAnZCcsICd2JywgJ2InKTogLyogWERDQU0gRVggMTA4MGk2MCA1ME1iL3MgQ0JSICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCd4JywgJ2QnLCAndicsICdjJyk6IC8qIFhEQ0FNIEVYIDEwODBpNTAgNTBNYi9zIENCUiAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJ3YnLCAnZCcpOiAvKiBYRENBTSBIRCAxMDgwcDI0IDUwTWIvcyBDQlIgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ3gnLCAnZCcsICd2JywgJ2UnKTogLyogWERDQU0gSEQgMTA4MHAyNSA1ME1iL3MgQ0JSICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCd4JywgJ2QnLCAndicsICdmJyk6IC8qIFhEQ0FNIEhEIDEwODBwMzAgNTBNYi9zIENCUiAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJzUnLCAnMScpOiAvKiBYRENBTSBIRDQyMiA3MjBwMzAgNTBNYi9zIENCUiAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJzUnLCAnNCcpOiAvKiBYRENBTSBIRDQyMiA3MjBwMjQgNTBNYi9zIENCUiAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJzUnLCAnNScpOiAvKiBYRENBTSBIRDQyMiA3MjBwMjUgNTBNYi9zIENCUiAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJzUnLCAnOScpOiAvKiBYRENBTSBIRDQyMiA3MjBwNjAgNTBNYi9zIENCUiAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJzUnLCAnYScpOiAvKiBYRENBTSBIRDQyMiA3MjBwNTAgNTBNYi9zIENCUiAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJzUnLCAnYicpOiAvKiBYRENBTSBIRDQyMiAxMDgwaTUwIDUwTWIvcyBDQlIgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ3gnLCAnZCcsICc1JywgJ2MnKTogLyogWERDQU0gSEQ0MjIgMTA4MGk1MCA1ME1iL3MgQ0JSICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCd4JywgJ2QnLCAnNScsICdkJyk6IC8qIFhEQ0FNIEhENDIyIDEwODBwMjQgNTBNYi9zIENCUiAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJzUnLCAnZScpOiAvKiBYRENBTSBIRDQyMiAxMDgwcDI1IDUwTWIvcyBDQlIgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ3gnLCAnZCcsICc1JywgJ2YnKTogLyogWERDQU0gSEQ0MjIgMTA4MHAzMCA1ME1iL3MgQ0JSICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCd4JywgJ2QnLCAnaCcsICdkJyk6IC8qIFhEQ0FNIEhEIDU0MHAgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ3gnLCAnZCcsICdoJywgJzInKTogLyogWERDQU0gSEQ0MjIgNTQwcCAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnQScsICdWJywgJ20nLCAncCcpOiAvKiBBVklEIElNWCBQQUwgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ20nLCAncCcsICdnJywgJzInKTogLyogQVZJRCBJTVggUEFMICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdtJywgJ3AnLCAnMicsICd2Jyk6IC8qIEFWSUQgSU1YIFBBTCAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnbScsICcyJywgJ3YnLCAnMScpOgorICAgICAgX2NvZGVjICgiTVBFRy0yIHZpZGVvIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL21wZWciLCAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAyLAorICAgICAgICAgICJzeXN0ZW1zdHJlYW0iLCBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdnJywgJ2knLCAnZicsICcgJyk6CisgICAgICBfY29kZWMgKCJHSUYgc3RpbGwgaW1hZ2VzIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImltYWdlL2dpZiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfaDI2MzoKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ0gnLCAnMicsICc2JywgJzMnKToKKyAgICBjYXNlIEZPVVJDQ19zMjYzOgorICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnVScsICcyJywgJzYnLCAnMycpOgorICAgICAgX2NvZGVjICgiSC4yNjMiKTsKKyAgICAgIC8qIGZmbXBlZyB1c2VzIHRoZSBoZWlnaHQvd2lkdGggcHJvcHMsIGRvbid0IGtub3cgd2h5ICovCisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtaDI2MyIsCisgICAgICAgICAgInZhcmlhbnQiLCBHX1RZUEVfU1RSSU5HLCAiaXR1IiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19tcDR2OgorICAgIGNhc2UgRk9VUkNDX01QNFY6CisgICAgICBfY29kZWMgKCJNUEVHLTQgdmlkZW8iKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8vbXBlZyIsICJtcGVndmVyc2lvbiIsIEdfVFlQRV9JTlQsIDQsCisgICAgICAgICAgInN5c3RlbXN0cmVhbSIsIEdfVFlQRV9CT09MRUFOLCBGQUxTRSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJzMnLCAnaScsICd2JywgJ2QnKToKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJzMnLCAnSScsICdWJywgJ0QnKToKKyAgICAgIF9jb2RlYyAoIk1pY3Jvc29mdCBNUEVHLTQgNC4zIik7ICAvKiBGSVhNRT8gKi8KKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1tc21wZWciLAorICAgICAgICAgICJtc21wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgNDMsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdEJywgJ0knLCAnVicsICczJyk6CisgICAgICBfY29kZWMgKCJEaXZYIDMiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1kaXZ4IiwKKyAgICAgICAgICAiZGl2eHZlcnNpb24iLCBHX1RZUEVfSU5ULCAzLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnRCcsICdJJywgJ1YnLCAnWCcpOgorICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnZCcsICdpJywgJ3YnLCAneCcpOgorICAgICAgX2NvZGVjICgiRGl2WCA0Iik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtZGl2eCIsCisgICAgICAgICAgImRpdnh2ZXJzaW9uIiwgR19UWVBFX0lOVCwgNCwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ0QnLCAnWCcsICc1JywgJzAnKToKKyAgICAgIF9jb2RlYyAoIkRpdlggNSIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWRpdngiLAorICAgICAgICAgICJkaXZ4dmVyc2lvbiIsIEdfVFlQRV9JTlQsIDUsIE5VTEwpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ0YnLCAnRicsICdWJywgJzEnKToKKyAgICAgIF9jb2RlYyAoIkZGVjEiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1mZnYiLAorICAgICAgICAgICJmZnZ2ZXJzaW9uIiwgR19UWVBFX0lOVCwgMSwgTlVMTCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnMycsICdJJywgJ1YnLCAnMScpOgorICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnMycsICdJJywgJ1YnLCAnMicpOgorICAgIGNhc2UgRk9VUkNDX1hWSUQ6CisgICAgY2FzZSBGT1VSQ0NfeHZpZDoKKyAgICBjYXNlIEZPVVJDQ19GTVA0OgorICAgIGNhc2UgRk9VUkNDX2ZtcDQ6CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdVJywgJ00nLCAnUCcsICc0Jyk6CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL21wZWciLCAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCA0LAorICAgICAgICAgICJzeXN0ZW1zdHJlYW0iLCBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworICAgICAgX2NvZGVjICgiTVBFRy00Iik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnYycsICd2JywgJ2knLCAnZCcpOgorICAgICAgX2NvZGVjICgiQ2luZXBhayIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJ2aWRlby94LWNpbmVwYWsiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgncScsICdkJywgJ3InLCAndycpOgorICAgICAgX2NvZGVjICgiQXBwbGUgUXVpY2tEcmF3Iik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtcWRydyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdyJywgJ3AnLCAneicsICdhJyk6CisgICAgICBfY29kZWMgKCJBcHBsZSB2aWRlbyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJ2aWRlby94LWFwcGxlLXZpZGVvIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19IMjY0OgorICAgIGNhc2UgRk9VUkNDX2F2YzE6CisgICAgICBfY29kZWMgKCJILjI2NCAvIEFWQyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWgyNjQiLAorICAgICAgICAgICJzdHJlYW0tZm9ybWF0IiwgR19UWVBFX1NUUklORywgImF2YyIsCisgICAgICAgICAgImFsaWdubWVudCIsIEdfVFlQRV9TVFJJTkcsICJhdSIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfYXZjMzoKKyAgICAgIF9jb2RlYyAoIkguMjY0IC8gQVZDIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtaDI2NCIsCisgICAgICAgICAgInN0cmVhbS1mb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiYXZjMyIsCisgICAgICAgICAgImFsaWdubWVudCIsIEdfVFlQRV9TVFJJTkcsICJhdSIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfSDI2NToKKyAgICBjYXNlIEZPVVJDQ19odmMxOgorICAgICAgX2NvZGVjICgiSC4yNjUgLyBIRVZDIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtaDI2NSIsCisgICAgICAgICAgInN0cmVhbS1mb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiaHZjMSIsCisgICAgICAgICAgImFsaWdubWVudCIsIEdfVFlQRV9TVFJJTkcsICJhdSIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfaGV2MToKKyAgICAgIF9jb2RlYyAoIkguMjY1IC8gSEVWQyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWgyNjUiLAorICAgICAgICAgICJzdHJlYW0tZm9ybWF0IiwgR19UWVBFX1NUUklORywgImhldjEiLAorICAgICAgICAgICJhbGlnbm1lbnQiLCBHX1RZUEVfU1RSSU5HLCAiYXUiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX3JsZV86CisgICAgICBfY29kZWMgKCJSdW4tbGVuZ3RoIGVuY29kaW5nIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcmxlIiwKKyAgICAgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgInF1aWNrdGltZSIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfV1JMRToKKyAgICAgIF9jb2RlYyAoIlJ1bi1sZW5ndGggZW5jb2RpbmciKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1ybGUiLAorICAgICAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCAibWljcm9zb2Z0IiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ0knLCAnVicsICczJywgJzInKToKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2knLCAndicsICczJywgJzInKToKKyAgICAgIF9jb2RlYyAoIkluZGVvIFZpZGVvIDMiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1pbmRlbyIsCisgICAgICAgICAgImluZGVvdmVyc2lvbiIsIEdfVFlQRV9JTlQsIDMsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdJJywgJ1YnLCAnNCcsICcxJyk6CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdpJywgJ3YnLCAnNCcsICcxJyk6CisgICAgICBfY29kZWMgKCJJbnRlbCBWaWRlbyA0Iik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtaW5kZW8iLAorICAgICAgICAgICJpbmRlb3ZlcnNpb24iLCBHX1RZUEVfSU5ULCA0LCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX2R2Y3A6CisgICAgY2FzZSBGT1VSQ0NfZHZjXzoKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2QnLCAndicsICdzJywgJ2QnKToKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ0QnLCAnVicsICdTJywgJ0QnKToKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2QnLCAndicsICdjJywgJ3MnKToKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ0QnLCAnVicsICdDJywgJ1MnKToKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2QnLCAndicsICcyJywgJzUnKToKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2QnLCAndicsICdwJywgJ3AnKToKKyAgICAgIF9jb2RlYyAoIkRWIFZpZGVvIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtZHYiLCAiZHZ2ZXJzaW9uIiwgR19UWVBFX0lOVCwgMjUsCisgICAgICAgICAgInN5c3RlbXN0cmVhbSIsIEdfVFlQRV9CT09MRUFOLCBGQUxTRSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19kdjVuOiAgICAgICAgICAvKiBEVkNQUk81MCBOVFNDICovCisgICAgY2FzZSBGT1VSQ0NfZHY1cDogICAgICAgICAgLyogRFZDUFJPNTAgUEFMICovCisgICAgICBfY29kZWMgKCJEVkNQcm81MCBWaWRlbyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWR2IiwgImR2dmVyc2lvbiIsIEdfVFlQRV9JTlQsIDUwLAorICAgICAgICAgICJzeXN0ZW1zdHJlYW0iLCBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdkJywgJ3YnLCAnaCcsICc1Jyk6IC8qIERWQ1BSTyBIRCA1MGkgcHJvZHVjZWQgYnkgRkNQICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdkJywgJ3YnLCAnaCcsICc2Jyk6IC8qIERWQ1BSTyBIRCA2MGkgcHJvZHVjZWQgYnkgRkNQICovCisgICAgICBfY29kZWMgKCJEVkNQcm9IRCBWaWRlbyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWR2IiwgImR2dmVyc2lvbiIsIEdfVFlQRV9JTlQsIDEwMCwKKyAgICAgICAgICAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgncycsICdtJywgJ2MnLCAnICcpOgorICAgICAgX2NvZGVjICgiQXBwbGUgR3JhcGhpY3MgKFNNQykiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgidmlkZW8veC1zbWMiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnVicsICdQJywgJzMnLCAnMScpOgorICAgICAgX2NvZGVjICgiVlAzIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtdnAzIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ1YnLCAnUCcsICc2JywgJ0YnKToKKyAgICAgIF9jb2RlYyAoIlZQNiBGbGFzaCIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJ2aWRlby94LXZwNi1mbGFzaCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfWGlUaDoKKyAgICAgIF9jb2RlYyAoIlRoZW9yYSIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJ2aWRlby94LXRoZW9yYSIpOworICAgICAgLyogdGhlb3JhIHVzZXMgb25lIGJ5dGUgb2YgcGFkZGluZyBpbiB0aGUgZGF0YSBzdHJlYW0gYmVjYXVzZSBpdCBkb2VzIG5vdAorICAgICAgICogYWxsb3cgMCBzaXplZCBwYWNrZXRzIHdoaWxlIHRoZW9yYSBkb2VzICovCisgICAgICBlbnRyeS0+cGFkZGluZyA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19kcmFjOgorICAgICAgX2NvZGVjICgiRGlyYWMiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgidmlkZW8veC1kaXJhYyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCd0JywgJ2knLCAnZicsICdmJyk6CisgICAgICBfY29kZWMgKCJUSUZGIHN0aWxsIGltYWdlcyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJpbWFnZS90aWZmIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2knLCAnYycsICdvJywgJ2QnKToKKyAgICAgIF9jb2RlYyAoIkFwcGxlIEludGVybWVkaWF0ZSBDb2RlYyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nICgidmlkZW8veC1hcHBsZS1pbnRlcm1lZGlhdGUtY29kZWMiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnQScsICdWJywgJ2QnLCAnbicpOgorICAgICAgX2NvZGVjICgiQVZJRCBETnhIRCIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nICgidmlkZW8veC1kbnhoZCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfVlA4MDoKKyAgICBjYXNlIEZPVVJDQ192cDA4OgorICAgICAgX2NvZGVjICgiT24yIFZQOCIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nICgidmlkZW8veC12cDgiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX3ZwMDk6CisgICAgICBfY29kZWMgKCJHb29nbGUgVlA5Iik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKCJ2aWRlby94LXZwOSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfYXBjczoKKyAgICAgIF9jb2RlYyAoIkFwcGxlIFByb1JlcyBMVCIpOworICAgICAgY2FwcyA9CisgICAgICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcHJvcmVzIiwgInZhcmlhbnQiLCBHX1RZUEVfU1RSSU5HLCAibHQiLAorICAgICAgICAgIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfYXBjaDoKKyAgICAgIF9jb2RlYyAoIkFwcGxlIFByb1JlcyBIUSIpOworICAgICAgY2FwcyA9CisgICAgICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcHJvcmVzIiwgInZhcmlhbnQiLCBHX1RZUEVfU1RSSU5HLCAiaHEiLAorICAgICAgICAgIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfYXBjbjoKKyAgICAgIF9jb2RlYyAoIkFwcGxlIFByb1JlcyIpOworICAgICAgY2FwcyA9CisgICAgICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcHJvcmVzIiwgInZhcmlhbnQiLCBHX1RZUEVfU1RSSU5HLAorICAgICAgICAgICJzdGFuZGFyZCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfYXBjbzoKKyAgICAgIF9jb2RlYyAoIkFwcGxlIFByb1JlcyBQcm94eSIpOworICAgICAgY2FwcyA9CisgICAgICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcHJvcmVzIiwgInZhcmlhbnQiLCBHX1RZUEVfU1RSSU5HLAorICAgICAgICAgICJwcm94eSIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfYXA0aDoKKyAgICAgIF9jb2RlYyAoIkFwcGxlIFByb1JlcyA0NDQ0Iik7CisgICAgICBjYXBzID0KKyAgICAgICAgICBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1wcm9yZXMiLCAidmFyaWFudCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgICAgIjQ0NDQiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX2FwNHg6CisgICAgICBfY29kZWMgKCJBcHBsZSBQcm9SZXMgNDQ0NCBYUSIpOworICAgICAgY2FwcyA9CisgICAgICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcHJvcmVzIiwgInZhcmlhbnQiLCBHX1RZUEVfU1RSSU5HLAorICAgICAgICAgICI0NDQ0eHEiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX2NmaGQ6CisgICAgICBfY29kZWMgKCJHb1BybyBDaW5lRm9ybSIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nICgidmlkZW8veC1jaW5lZm9ybSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfdmNfMToKKyAgICBjYXNlIEZPVVJDQ19vdmMxOgorICAgICAgX2NvZGVjICgiVkMtMSIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LXdtdiIsCisgICAgICAgICAgIndtdnZlcnNpb24iLCBHX1RZUEVfSU5ULCAzLCAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIldWQzEiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnaycsICdwJywgJ2MnLCAnZCcpOgorICAgIGRlZmF1bHQ6CisgICAgeworICAgICAgY2FwcyA9IF9nZXRfdW5rbm93bl9jb2RlY19uYW1lICgidmlkZW8iLCBmb3VyY2MpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGZvcm1hdCAhPSBHU1RfVklERU9fRk9STUFUX1VOS05PV04pIHsKKyAgICBHc3RWaWRlb0luZm8gaW5mbzsKKworICAgIGdzdF92aWRlb19pbmZvX2luaXQgKCZpbmZvKTsKKyAgICBnc3RfdmlkZW9faW5mb19zZXRfZm9ybWF0ICgmaW5mbywgZm9ybWF0LCBlbnRyeS0+d2lkdGgsIGVudHJ5LT5oZWlnaHQpOworCisgICAgY2FwcyA9IGdzdF92aWRlb19pbmZvX3RvX2NhcHMgKCZpbmZvKTsKKyAgICAqY29kZWNfbmFtZSA9IGdzdF9wYl91dGlsc19nZXRfY29kZWNfZGVzY3JpcHRpb24gKGNhcHMpOworCisgICAgLyogZW5hYmxlIGNsaXBwaW5nIGZvciByYXcgdmlkZW8gc3RyZWFtcyAqLworICAgIHN0cmVhbS0+bmVlZF9jbGlwID0gVFJVRTsKKyAgICBzdHJlYW0tPmFsaWdubWVudCA9IDMyOworICB9CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKK3N0YXRpYyBndWludAorcm91bmRfdXBfcG93MiAoZ3VpbnQgbikKK3sKKyAgbiA9IG4gLSAxOworICBuID0gbiB8IChuID4+IDEpOworICBuID0gbiB8IChuID4+IDIpOworICBuID0gbiB8IChuID4+IDQpOworICBuID0gbiB8IChuID4+IDgpOworICBuID0gbiB8IChuID4+IDE2KTsKKyAgcmV0dXJuIG4gKyAxOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitxdGRlbXV4X2F1ZGlvX2NhcHMgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBRdERlbXV4U3RyZWFtICogc3RyZWFtLAorICAgIFF0RGVtdXhTdHJlYW1TdHNkRW50cnkgKiBlbnRyeSwgZ3VpbnQzMiBmb3VyY2MsIGNvbnN0IGd1aW50OCAqIGRhdGEsCisgICAgaW50IGxlbiwgZ2NoYXIgKiogY29kZWNfbmFtZSkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzOworICBjb25zdCBnY2hhciAqbmFtZTsKKyAgZ2ludCBlbmRpYW4gPSAwOworICBHc3RBdWRpb0Zvcm1hdCBmb3JtYXQgPSAwOworICBnaW50IGRlcHRoOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJyZXNvbHZlIGZvdXJjYyAweCUwOHgiLCBHVUlOVDMyX1RPX0JFIChmb3VyY2MpKTsKKworICBkZXB0aCA9IGVudHJ5LT5ieXRlc19wZXJfcGFja2V0ICogODsKKworICBzd2l0Y2ggKGZvdXJjYykgeworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnTicsICdPJywgJ04nLCAnRScpOgorICAgIGNhc2UgRk9VUkNDX3Jhd186CisgICAgICAvKiA4LWJpdCBhdWRpbyBpcyB1bnNpZ25lZCAqLworICAgICAgaWYgKGRlcHRoID09IDgpCisgICAgICAgIGZvcm1hdCA9IEdTVF9BVURJT19GT1JNQVRfVTg7CisgICAgICAvKiBvdGhlcndpc2UgaXQncyBzaWduZWQgYW5kIGJpZy1lbmRpYW4ganVzdCBsaWtlICd0d29zJyAqLworICAgIGNhc2UgRk9VUkNDX3R3b3M6CisgICAgICBlbmRpYW4gPSBHX0JJR19FTkRJQU47CisgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgICBjYXNlIEZPVVJDQ19zb3d0OgorICAgIHsKKyAgICAgIGdjaGFyICpzdHI7CisKKyAgICAgIGlmICghZW5kaWFuKQorICAgICAgICBlbmRpYW4gPSBHX0xJVFRMRV9FTkRJQU47CisKKyAgICAgIGlmICghZm9ybWF0KQorICAgICAgICBmb3JtYXQgPSBnc3RfYXVkaW9fZm9ybWF0X2J1aWxkX2ludGVnZXIgKFRSVUUsIGVuZGlhbiwgZGVwdGgsIGRlcHRoKTsKKworICAgICAgc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiUmF3ICVkLWJpdCBQQ00gYXVkaW8iLCBkZXB0aCk7CisgICAgICBfY29kZWMgKHN0cik7CisgICAgICBnX2ZyZWUgKHN0cik7CisKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLAorICAgICAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCBnc3RfYXVkaW9fZm9ybWF0X3RvX3N0cmluZyAoZm9ybWF0KSwKKyAgICAgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImludGVybGVhdmVkIiwgTlVMTCk7CisgICAgICBzdHJlYW0tPmFsaWdubWVudCA9IEdTVF9ST1VORF9VUF84IChkZXB0aCk7CisgICAgICBzdHJlYW0tPmFsaWdubWVudCA9IHJvdW5kX3VwX3BvdzIgKHN0cmVhbS0+YWxpZ25tZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2YnLCAnbCcsICc2JywgJzQnKToKKyAgICAgIF9jb2RlYyAoIlJhdyA2NC1iaXQgZmxvYXRpbmctcG9pbnQgYXVkaW8iKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLAorICAgICAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiRjY0QkUiLAorICAgICAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCAiaW50ZXJsZWF2ZWQiLCBOVUxMKTsKKyAgICAgIHN0cmVhbS0+YWxpZ25tZW50ID0gODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnZicsICdsJywgJzMnLCAnMicpOgorICAgICAgX2NvZGVjICgiUmF3IDMyLWJpdCBmbG9hdGluZy1wb2ludCBhdWRpbyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsCisgICAgICAgICAgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJGMzJCRSIsCisgICAgICAgICAgImxheW91dCIsIEdfVFlQRV9TVFJJTkcsICJpbnRlcmxlYXZlZCIsIE5VTEwpOworICAgICAgc3RyZWFtLT5hbGlnbm1lbnQgPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfaW4yNDoKKyAgICAgIF9jb2RlYyAoIlJhdyAyNC1iaXQgUENNIGF1ZGlvIik7CisgICAgICAvKiB3ZSBhc3N1bWUgQklHIEVORElBTiwgYW4gZW5kYSBib3ggd2lsbCB0ZWxsIHVzIHRvIGNoYW5nZSB0aGlzIHRvIGxpdHRsZQorICAgICAgICogZW5kaWFuIGxhdGVyICovCisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcmF3IiwKKyAgICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIlMyNEJFIiwKKyAgICAgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImludGVybGVhdmVkIiwgTlVMTCk7CisgICAgICBzdHJlYW0tPmFsaWdubWVudCA9IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2knLCAnbicsICczJywgJzInKToKKyAgICAgIF9jb2RlYyAoIlJhdyAzMi1iaXQgUENNIGF1ZGlvIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcmF3IiwKKyAgICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIlMzMkJFIiwKKyAgICAgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImludGVybGVhdmVkIiwgTlVMTCk7CisgICAgICBzdHJlYW0tPmFsaWdubWVudCA9IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ3MnLCAnMScsICc2JywgJ2wnKToKKyAgICAgIF9jb2RlYyAoIlJhdyAxNi1iaXQgUENNIGF1ZGlvIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcmF3IiwKKyAgICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIlMxNkxFIiwKKyAgICAgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImludGVybGVhdmVkIiwgTlVMTCk7CisgICAgICBzdHJlYW0tPmFsaWdubWVudCA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ191bGF3OgorICAgICAgX2NvZGVjICgiTXUtbGF3IGF1ZGlvIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtbXVsYXciKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX2FsYXc6CisgICAgICBfY29kZWMgKCJBLWxhdyBhdWRpbyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby94LWFsYXciKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwMjAwNzM2ZDoKKyAgICBjYXNlIDB4NmQ3MzAwMDI6CisgICAgICBfY29kZWMgKCJNaWNyb3NvZnQgQURQQ00iKTsKKyAgICAgIC8qIE1pY3Jvc29mdCBBRFBDTS1BQ00gY29kZSAyICovCisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtYWRwY20iLAorICAgICAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCAibWljcm9zb2Z0IiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTEwMDczNmQ6CisgICAgY2FzZSAweDZkNzMwMDExOgorICAgICAgX2NvZGVjICgiRFZJL0lNQSBBRFBDTSIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LWFkcGNtIiwKKyAgICAgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImR2aSIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDE3MDA3MzZkOgorICAgIGNhc2UgMHg2ZDczMDAxNzoKKyAgICAgIF9jb2RlYyAoIkRWSS9JbnRlbCBJTUEgQURQQ00iKTsKKyAgICAgIC8qIEZJWE1FIERWSS9JbnRlbCBJTUEgQURQQ00vQUNNIGNvZGUgMTcgKi8KKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1hZHBjbSIsCisgICAgICAgICAgImxheW91dCIsIEdfVFlQRV9TVFJJTkcsICJxdWlja3RpbWUiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHg1NTAwNzM2ZDoKKyAgICBjYXNlIDB4NmQ3MzAwNTU6CisgICAgICAvKiBNUEVHIGxheWVyIDMsIENCUiBvbmx5IChwcmUgUVQ0LjEpICovCisgICAgY2FzZSBGT1VSQ0NfX21wMzoKKyAgICAgIF9jb2RlYyAoIk1QRUctMSBsYXllciAzIik7CisgICAgICAvKiBNUEVHIGxheWVyIDMsIENCUiAmIFZCUiAoUVQ0LjEgYW5kIGxhdGVyKSAqLworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby9tcGVnIiwgImxheWVyIiwgR19UWVBFX0lOVCwgMywKKyAgICAgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnLicsICdtJywgJ3AnLCAnMicpOgorICAgICAgX2NvZGVjICgiTVBFRy0xIGxheWVyIDIiKTsKKyAgICAgIC8qIE1QRUcgbGF5ZXIgMiAqLworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby9tcGVnIiwgImxheWVyIiwgR19UWVBFX0lOVCwgMiwKKyAgICAgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHgyMDczNmQ6CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdlJywgJ2MnLCAnLScsICczJyk6CisgICAgICBfY29kZWMgKCJFQUMtMyBhdWRpbyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LWVhYzMiLAorICAgICAgICAgICJmcmFtZWQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisgICAgICBlbnRyeS0+c2FtcGxlZCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ3MnLCAnYScsICdjJywgJzMnKTogLy8gTmVybyBSZWNvZGUKKyAgICBjYXNlIEZPVVJDQ19hY18zOgorICAgICAgX2NvZGVjICgiQUMtMyBhdWRpbyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LWFjMyIsCisgICAgICAgICAgImZyYW1lZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKyAgICAgIGVudHJ5LT5zYW1wbGVkID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnZCcsICd0JywgJ3MnLCAnYycpOgorICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnRCcsICdUJywgJ1MnLCAnICcpOgorICAgICAgX2NvZGVjICgiRFRTIGF1ZGlvIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtZHRzIiwKKyAgICAgICAgICAiZnJhbWVkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICAgICAgZW50cnktPnNhbXBsZWQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdkJywgJ3QnLCAncycsICdoJyk6IC8vIERUUy1IRAorICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnZCcsICd0JywgJ3MnLCAnbCcpOiAvLyBEVFMtSEQgTG9zc2xlc3MKKyAgICAgIF9jb2RlYyAoIkRUUy1IRCBhdWRpbyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LWR0cyIsCisgICAgICAgICAgImZyYW1lZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKyAgICAgIGVudHJ5LT5zYW1wbGVkID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX01BQzM6CisgICAgICBfY29kZWMgKCJNQUNFLTMiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1tYWNlIiwKKyAgICAgICAgICAibWFjZXZlcnNpb24iLCBHX1RZUEVfSU5ULCAzLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX01BQzY6CisgICAgICBfY29kZWMgKCJNQUNFLTYiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1tYWNlIiwKKyAgICAgICAgICAibWFjZXZlcnNpb24iLCBHX1RZUEVfSU5ULCA2LCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnTycsICdnJywgJ2cnLCAnVicpOgorICAgICAgLyogb2dnL3ZvcmJpcyAqLworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhcHBsaWNhdGlvbi9vZ2ciKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnZCcsICd2JywgJ2MnLCAnYScpOgorICAgICAgX2NvZGVjICgiRFYgYXVkaW8iKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8veC1kdiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfbXA0YToKKyAgICAgIF9jb2RlYyAoIk1QRUctNCBBQUMgYXVkaW8iKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8vbXBlZyIsCisgICAgICAgICAgIm1wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgNCwgImZyYW1lZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLAorICAgICAgICAgICJzdHJlYW0tZm9ybWF0IiwgR19UWVBFX1NUUklORywgInJhdyIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdRJywgJ0QnLCAnTScsICdDJyk6CisgICAgICBfY29kZWMgKCJRRGVzaWduIE11c2ljIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtcWRtIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19RRE0yOgorICAgICAgX2NvZGVjICgiUURlc2lnbiBNdXNpYyB2LjIiKTsKKyAgICAgIC8qIEZJWE1FOiBRRGVzaWduIG11c2ljIHZlcnNpb24gMiAobm8gY29uc3RhbnQpICovCisgICAgICBpZiAoRkFMU0UgJiYgZGF0YSkgeworICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcWRtMiIsCisgICAgICAgICAgICAiZnJhbWVzaXplIiwgR19UWVBFX0lOVCwgUVRfVUlOVDMyIChkYXRhICsgNTIpLAorICAgICAgICAgICAgImJpdHJhdGUiLCBHX1RZUEVfSU5ULCBRVF9VSU5UMzIgKGRhdGEgKyA0MCksCisgICAgICAgICAgICAiYmxvY2tzaXplIiwgR19UWVBFX0lOVCwgUVRfVUlOVDMyIChkYXRhICsgNDQpLCBOVUxMKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8veC1xZG0yIik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19hZ3NtOgorICAgICAgX2NvZGVjICgiR1NNIGF1ZGlvIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtZ3NtIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19zYW1yOgorICAgICAgX2NvZGVjICgiQU1SIGF1ZGlvIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL0FNUiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0Nfc2F3YjoKKyAgICAgIF9jb2RlYyAoIkFNUi1XQiBhdWRpbyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby9BTVItV0IiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX2ltYTQ6CisgICAgICBfY29kZWMgKCJRdWlja3RpbWUgSU1BIEFEUENNIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtYWRwY20iLAorICAgICAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCAicXVpY2t0aW1lIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19hbGFjOgorICAgICAgX2NvZGVjICgiQXBwbGUgbG9zc2xlc3MgYXVkaW8iKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8veC1hbGFjIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19mTGFDOgorICAgICAgX2NvZGVjICgiRnJlZSBMb3NzbGVzcyBBdWRpbyBDb2RlYyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LWZsYWMiLAorICAgICAgICAgICJmcmFtZWQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ1EnLCAnYycsICdsJywgJ3AnKToKKyAgICAgIF9jb2RlYyAoIlF1YWxDb21tIFB1cmVWb2ljZSIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nICgiYXVkaW8vcWNlbHAiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX3dtYV86CisgICAgY2FzZSBGT1VSQ0Nfb3dtYToKKyAgICAgIF9jb2RlYyAoIldNQSIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby94LXdtYSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0Nfb3B1czoKKyAgICAgIF9jb2RlYyAoIk9wdXMiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8veC1vcHVzIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19scGNtOgorICAgIHsKKyAgICAgIGd1aW50MzIgZmxhZ3MgPSAwOworICAgICAgZ3VpbnQzMiBkZXB0aCA9IDA7CisgICAgICBndWludDMyIHdpZHRoID0gMDsKKyAgICAgIEdzdEF1ZGlvRm9ybWF0IGZvcm1hdDsKKyAgICAgIGVudW0KKyAgICAgIHsKKyAgICAgICAgRkxBR19JU19GTE9BVCA9IDB4MSwKKyAgICAgICAgRkxBR19JU19CSUdfRU5ESUFOID0gMHgyLAorICAgICAgICBGTEFHX0lTX1NJR05FRCA9IDB4NCwKKyAgICAgICAgRkxBR19JU19QQUNLRUQgPSAweDgsCisgICAgICAgIEZMQUdfSVNfQUxJR05FRF9ISUdIID0gMHgxMCwKKyAgICAgICAgRkxBR19JU19OT05fSU5URVJMRUFWRUQgPSAweDIwCisgICAgICB9OworICAgICAgX2NvZGVjICgiUmF3IExQQ00gYXVkaW8iKTsKKworICAgICAgaWYgKGRhdGEgJiYgbGVuID49IDM2KSB7CisgICAgICAgIGRlcHRoID0gUVRfVUlOVDMyIChkYXRhICsgMjQpOworICAgICAgICBmbGFncyA9IFFUX1VJTlQzMiAoZGF0YSArIDI4KTsKKyAgICAgICAgd2lkdGggPSBRVF9VSU5UMzIgKGRhdGEgKyAzMikgKiA4IC8gZW50cnktPm5fY2hhbm5lbHM7CisgICAgICB9CisgICAgICBpZiAoKGZsYWdzICYgRkxBR19JU19GTE9BVCkgPT0gMCkgeworICAgICAgICBpZiAoZGVwdGggPT0gMCkKKyAgICAgICAgICBkZXB0aCA9IDE2OworICAgICAgICBpZiAod2lkdGggPT0gMCkKKyAgICAgICAgICB3aWR0aCA9IDE2OworICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19JU19BTElHTkVEX0hJR0gpKQorICAgICAgICAgIGRlcHRoID0gd2lkdGg7CisKKyAgICAgICAgZm9ybWF0ID0gZ3N0X2F1ZGlvX2Zvcm1hdF9idWlsZF9pbnRlZ2VyICgoZmxhZ3MgJiBGTEFHX0lTX1NJR05FRCkgPworICAgICAgICAgICAgVFJVRSA6IEZBTFNFLCAoZmxhZ3MgJiBGTEFHX0lTX0JJR19FTkRJQU4pID8KKyAgICAgICAgICAgIEdfQklHX0VORElBTiA6IEdfTElUVExFX0VORElBTiwgd2lkdGgsIGRlcHRoKTsKKyAgICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsCisgICAgICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywKKyAgICAgICAgICAgIGZvcm1hdCAhPQorICAgICAgICAgICAgR1NUX0FVRElPX0ZPUk1BVF9VTktOT1dOID8gZ3N0X2F1ZGlvX2Zvcm1hdF90b19zdHJpbmcgKGZvcm1hdCkgOgorICAgICAgICAgICAgIlVOS05PV04iLCAibGF5b3V0IiwgR19UWVBFX1NUUklORywKKyAgICAgICAgICAgIChmbGFncyAmIEZMQUdfSVNfTk9OX0lOVEVSTEVBVkVEKSA/ICJub24taW50ZXJsZWF2ZWQiIDoKKyAgICAgICAgICAgICJpbnRlcmxlYXZlZCIsIE5VTEwpOworICAgICAgICBzdHJlYW0tPmFsaWdubWVudCA9IEdTVF9ST1VORF9VUF84IChkZXB0aCk7CisgICAgICAgIHN0cmVhbS0+YWxpZ25tZW50ID0gcm91bmRfdXBfcG93MiAoc3RyZWFtLT5hbGlnbm1lbnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHdpZHRoID09IDApCisgICAgICAgICAgd2lkdGggPSAzMjsKKyAgICAgICAgaWYgKHdpZHRoID09IDY0KSB7CisgICAgICAgICAgaWYgKGZsYWdzICYgRkxBR19JU19CSUdfRU5ESUFOKQorICAgICAgICAgICAgZm9ybWF0ID0gR1NUX0FVRElPX0ZPUk1BVF9GNjRCRTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBmb3JtYXQgPSBHU1RfQVVESU9fRk9STUFUX0Y2NExFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChmbGFncyAmIEZMQUdfSVNfQklHX0VORElBTikKKyAgICAgICAgICAgIGZvcm1hdCA9IEdTVF9BVURJT19GT1JNQVRfRjMyQkU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZm9ybWF0ID0gR1NUX0FVRElPX0ZPUk1BVF9GMzJMRTsKKyAgICAgICAgfQorICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcmF3IiwKKyAgICAgICAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCBnc3RfYXVkaW9fZm9ybWF0X3RvX3N0cmluZyAoZm9ybWF0KSwKKyAgICAgICAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCAoZmxhZ3MgJiBGTEFHX0lTX05PTl9JTlRFUkxFQVZFRCkgPworICAgICAgICAgICAgIm5vbi1pbnRlcmxlYXZlZCIgOiAiaW50ZXJsZWF2ZWQiLCBOVUxMKTsKKyAgICAgICAgc3RyZWFtLT5hbGlnbm1lbnQgPSB3aWR0aCAvIDg7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdxJywgJ3QnLCAndicsICdyJyk6CisgICAgICAvKiA/ICovCisgICAgZGVmYXVsdDoKKyAgICB7CisgICAgICBjYXBzID0gX2dldF91bmtub3duX2NvZGVjX25hbWUgKCJhdWRpbyIsIGZvdXJjYyk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoY2FwcykgeworICAgIEdzdENhcHMgKnRlbXBsX2NhcHMgPQorICAgICAgICBnc3Rfc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXRfY2FwcyAoJmdzdF9xdGRlbXV4X2F1ZGlvc3JjX3RlbXBsYXRlKTsKKyAgICBHc3RDYXBzICppbnRlcnNlY3Rpb24gPSBnc3RfY2Fwc19pbnRlcnNlY3QgKGNhcHMsIHRlbXBsX2NhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGVtcGxfY2Fwcyk7CisgICAgY2FwcyA9IGludGVyc2VjdGlvbjsKKyAgfQorCisgIC8qIGVuYWJsZSBjbGlwcGluZyBmb3IgcmF3IGF1ZGlvIHN0cmVhbXMgKi8KKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBuYW1lID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyk7CisgIGlmIChnX3N0cl9oYXNfcHJlZml4IChuYW1lLCAiYXVkaW8veC1yYXciKSkgeworICAgIHN0cmVhbS0+bmVlZF9jbGlwID0gVFJVRTsKKyAgICBzdHJlYW0tPm1heF9idWZmZXJfc2l6ZSA9IDQwOTYgKiBlbnRyeS0+Ynl0ZXNfcGVyX2ZyYW1lOworICAgIEdTVF9ERUJVRyAoInNldHRpbmcgbWF4IGJ1ZmZlciBzaXplIHRvICVkIiwgc3RyZWFtLT5tYXhfYnVmZmVyX3NpemUpOworICB9CisgIHJldHVybiBjYXBzOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitxdGRlbXV4X3N1Yl9jYXBzIChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwKKyAgICBRdERlbXV4U3RyZWFtU3RzZEVudHJ5ICogZW50cnksIGd1aW50MzIgZm91cmNjLAorICAgIGNvbnN0IGd1aW50OCAqIHN0c2RfZW50cnlfZGF0YSwgZ2NoYXIgKiogY29kZWNfbmFtZSkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicmVzb2x2ZSBmb3VyY2MgMHglMDh4IiwgR1VJTlQzMl9UT19CRSAoZm91cmNjKSk7CisKKyAgc3dpdGNoIChmb3VyY2MpIHsKKyAgICBjYXNlIEZPVVJDQ19tcDRzOgorICAgICAgX2NvZGVjICgiRFZEIHN1YnRpdGxlIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInN1YnBpY3R1cmUveC1kdmQiKTsKKyAgICAgIHN0cmVhbS0+bmVlZF9wcm9jZXNzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX3RleHQ6CisgICAgICBfY29kZWMgKCJRdWlja3RpbWUgdGltZWQgdGV4dCIpOworICAgICAgZ290byB0ZXh0OworICAgIGNhc2UgRk9VUkNDX3R4M2c6CisgICAgICBfY29kZWMgKCIzR1BQIHRpbWVkIHRleHQiKTsKKyAgICB0ZXh0OgorICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ0ZXh0L3gtcmF3IiwgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgICAgInV0ZjgiLCBOVUxMKTsKKyAgICAgIC8qIGFjdHVhbCB0ZXh0IHBpZWNlIG5lZWRzIHRvIGJlIGV4dHJhY3RlZCAqLworICAgICAgc3RyZWFtLT5uZWVkX3Byb2Nlc3MgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0Nfc3RwcDoKKyAgICAgIF9jb2RlYyAoIlhNTCBzdWJ0aXRsZXMiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXBwbGljYXRpb24vdHRtbCt4bWwiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgeworICAgICAgY2FwcyA9IF9nZXRfdW5rbm93bl9jb2RlY19uYW1lICgidGV4dCIsIGZvdXJjYyk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGNhcHM7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK3F0ZGVtdXhfZ2VuZXJpY19jYXBzIChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwKKyAgICBRdERlbXV4U3RyZWFtU3RzZEVudHJ5ICogZW50cnksIGd1aW50MzIgZm91cmNjLAorICAgIGNvbnN0IGd1aW50OCAqIHN0c2RfZW50cnlfZGF0YSwgZ2NoYXIgKiogY29kZWNfbmFtZSkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKworICBzd2l0Y2ggKGZvdXJjYykgeworICAgIGNhc2UgRk9VUkNDX20xdjoKKyAgICAgIF9jb2RlYyAoIk1QRUcgMSB2aWRlbyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby9tcGVnIiwgIm1wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgMSwKKyAgICAgICAgICAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBjYXBzID0gTlVMTDsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBjYXBzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfYXBwZW5kX3Byb3RlY3Rpb25fc3lzdGVtX2lkIChHc3RRVERlbXV4ICogcXRkZW11eCwKKyAgICBjb25zdCBnY2hhciAqIHN5c3RlbV9pZCkKK3sKKyAgZ2ludCBpOworCisgIGlmICghcXRkZW11eC0+cHJvdGVjdGlvbl9zeXN0ZW1faWRzKQorICAgIHF0ZGVtdXgtPnByb3RlY3Rpb25fc3lzdGVtX2lkcyA9CisgICAgICAgIGdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoKEdEZXN0cm95Tm90aWZ5KSBnX2ZyZWUpOworICAvKiBDaGVjayB3aGV0aGVyIHdlIGFscmVhZHkgaGF2ZSBhbiBlbnRyeSBmb3IgdGhpcyBzeXN0ZW0gSUQuICovCisgIGZvciAoaSA9IDA7IGkgPCBxdGRlbXV4LT5wcm90ZWN0aW9uX3N5c3RlbV9pZHMtPmxlbjsgKytpKSB7CisgICAgY29uc3QgZ2NoYXIgKmlkID0gZ19wdHJfYXJyYXlfaW5kZXggKHF0ZGVtdXgtPnByb3RlY3Rpb25fc3lzdGVtX2lkcywgaSk7CisgICAgaWYgKGdfYXNjaWlfc3RyY2FzZWNtcCAoc3lzdGVtX2lkLCBpZCkgPT0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiQWRkaW5nIGNlbmMgcHJvdGVjdGlvbiBzeXN0ZW0gSUQgJXMiLCBzeXN0ZW1faWQpOworICBnX3B0cl9hcnJheV9hZGQgKHF0ZGVtdXgtPnByb3RlY3Rpb25fc3lzdGVtX2lkcywgZ19hc2NpaV9zdHJkb3duIChzeXN0ZW1faWQsCisgICAgICAgICAgLTEpKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvcXRkZW11eC5oIGIvZ3N0L2lzb21wNC9xdGRlbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ0ZGEzZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvcXRkZW11eC5oCkBAIC0wLDAgKzEsMjQyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1FUREVNVVhfSF9fCisjZGVmaW5lIF9fR1NUX1FUREVNVVhfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGZsb3djb21iaW5lci5oPgorI2luY2x1ZGUgImdzdGlzb2ZmLmgiCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9RVERFTVVYIFwKKyAgKGdzdF9xdGRlbXV4X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9RVERFTVVYKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUVRERU1VWCxHc3RRVERlbXV4KSkKKyNkZWZpbmUgR1NUX1FUREVNVVhfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUVRERU1VWCxHc3RRVERlbXV4Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUVRERU1VWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1FUREVNVVgpKQorI2RlZmluZSBHU1RfSVNfUVRERU1VWF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9RVERFTVVYKSkKKworI2RlZmluZSBHU1RfUVRERU1VWF9DQVNUKG9iaikgKChHc3RRVERlbXV4ICopKG9iaikpCisKKy8qIHF0ZGVtdXggcHJvZHVjZXMgdGhlc2UgZm9yIGF0b21zIGl0IGNhbm5vdCBwYXJzZSAqLworI2RlZmluZSBHU1RfUVRfREVNVVhfUFJJVkFURV9UQUcgInByaXZhdGUtcXQtdGFnIgorI2RlZmluZSBHU1RfUVRfREVNVVhfQ0xBU1NJRklDQVRJT05fVEFHICJjbGFzc2lmaWNhdGlvbiIKKworI2RlZmluZSBHU1RfUVRERU1VWF9NQVhfU1RSRUFNUyAgICAgICAgIDMyCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RRVERlbXV4IEdzdFFURGVtdXg7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UVREZW11eENsYXNzIEdzdFFURGVtdXhDbGFzczsKK3R5cGVkZWYgc3RydWN0IF9RdERlbXV4U3RyZWFtIFF0RGVtdXhTdHJlYW07CisKK2VudW0gUXREZW11eFN0YXRlCit7CisgIFFUREVNVVhfU1RBVEVfSU5JVElBTCwgICAgICAgIC8qIEluaXRpYWwgc3RhdGUgKGhhdmVuJ3QgZ290IHRoZSBoZWFkZXIgeWV0KSAqLworICBRVERFTVVYX1NUQVRFX0hFQURFUiwgICAgICAgICAvKiBQYXJzaW5nIHRoZSBoZWFkZXIgKi8KKyAgUVRERU1VWF9TVEFURV9NT1ZJRSwgICAgICAgICAgLyogUGFyc2luZy9QbGF5aW5nIHRoZSBtZWRpYSBkYXRhICovCisgIFFUREVNVVhfU1RBVEVfQlVGRkVSX01EQVQgICAgIC8qIEJ1ZmZlcmluZyB0aGUgbWRhdCBhdG9tICovCit9OworCitzdHJ1Y3QgX0dzdFFURGVtdXggeworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgLyogR2xvYmFsIHN0YXRlICovCisgIGVudW0gUXREZW11eFN0YXRlIHN0YXRlOworCisgIC8qIHN0YXRpYyBzaW5rIHBhZCAqLworICBHc3RQYWQgKnNpbmtwYWQ7CisKKyAgLyogVFJVRSBpZiBwdWxsLWJhc2VkICovCisgIGdib29sZWFuIHB1bGxiYXNlZDsKKworICBnYm9vbGVhbiBwb3N0ZWRfcmVkaXJlY3Q7CisKKyAgUXREZW11eFN0cmVhbSAqc3RyZWFtc1tHU1RfUVRERU1VWF9NQVhfU1RSRUFNU107CisgIGdpbnQgICAgIG5fc3RyZWFtczsKKyAgZ2ludCAgICAgbl92aWRlb19zdHJlYW1zOworICBnaW50ICAgICBuX2F1ZGlvX3N0cmVhbXM7CisgIGdpbnQgICAgIG5fc3ViX3N0cmVhbXM7CisKKyAgR3N0Rmxvd0NvbWJpbmVyICpmbG93Y29tYmluZXI7CisKKyAgLyogSW5jb21pbmcgc3RyZWFtIGdyb3VwLWlkIHRvIHNldCBvbiBkb3duc3RyZWFtIFNUUkVBTV9TVEFSVCBldmVudHMuCisgICAqIElmIHVwc3RyZWFtIGRvZXNuJ3QgY29udGFpbiBvbmUsIGEgZ2xvYmFsIG9uZSB3aWxsIGJlIGdlbmVyYXRlZCAqLworICBnYm9vbGVhbiBoYXZlX2dyb3VwX2lkOworICBndWludCBncm91cF9pZDsKKworICBndWludCAgbWFqb3JfYnJhbmQ7CisgIEdzdEJ1ZmZlciAqY29tcF9icmFuZHM7CisKKyAgLyogW21vb3ZdIGhlYWRlci4KKyAgICogRklYTUUgOiBUaGlzIGlzIGRpc2NhcmRlZCBqdXN0IGFmdGVyIGl0J3MgY3JlYXRlZC4gSnVzdCBtb3ZlIGl0CisgICAqIHRvIGEgdGVtcG9yYXJ5IHZhcmlhYmxlID8gKi8KKyAgR05vZGUgKm1vb3Zfbm9kZTsKKworICAvKiBGSVhNRSA6IFRoaXMgaXMgbmV2ZXIgZnJlZWQuIEl0IGlzIG9ubHkgYXNzaWduZWQgb25jZS4gbWVtbGVhayA/ICovCisgIEdOb2RlICptb292X25vZGVfY29tcHJlc3NlZDsKKworICAvKiBTZXQgdG8gVFJVRSB3aGVuIHRoZSBbbW9vdl0gaGVhZGVyIGhhcyBiZWVuIGZ1bGx5IHBhcnNlZCAqLworICBnYm9vbGVhbiBnb3RfbW9vdjsKKworICAvKiBHbG9iYWwgdGltZXNjYWxlIGZvciB0aGUgaW5jb21pbmcgc3RyZWFtLiBVc2UgdGhlIFFUVElNRSBtYWNyb3MKKyAgICogdG8gY29udmVydCB2YWx1ZXMgdG8vZnJvbSBHc3RDbG9ja1RpbWUgKi8KKyAgZ3VpbnQzMiB0aW1lc2NhbGU7CisKKyAgLyogR2xvYmFsIGR1cmF0aW9uIChpbiBnbG9iYWwgdGltZXNjYWxlKS4gVXNlIFFUVElNRSBtYWNyb3MgdG8gZ2V0IEdzdENsb2NrVGltZSAqLworICBndWludDY0IGR1cmF0aW9uOworCisgIC8qIFRvdGFsIHNpemUgb2YgaGVhZGVyIGF0b21zLiBVc2VkIHRvIGNhbGN1bGF0ZSBmYWxsYmFjayBvdmVyYWxsIGJpdHJhdGUgKi8KKyAgZ3VpbnQgaGVhZGVyX3NpemU7CisKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisKKyAgLyogY29uZmlndXJlZCBwbGF5YmFjayByZWdpb24gKi8KKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIC8qIFRoZSBTRUdNRU5UX0VWRU5UIGZyb20gdXBzdHJlYW0gKk9SKiBnZW5lcmF0ZWQgZnJvbSBzZWdtZW50IChhYm92ZSkgKi8KKyAgR3N0RXZlbnQgKnBlbmRpbmdfbmV3c2VnbWVudDsKKworICBndWludDMyIHNlZ21lbnRfc2VxbnVtOworCisgIC8qIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggYSBzbW9vdGhzdHJlYW1pbmcgZnJhZ21lbnQKKyAgICogTXNzIGRvZXNuJ3QgaGF2ZSAnbW9vdicgb3IgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHJlYW1zIGZvcm1hdCwKKyAgICogcmVxdWlyaW5nIHF0ZGVtdXggdG8gZXhwb3NlIGFuZCBjcmVhdGUgdGhlIHN0cmVhbXMgKi8KKyAgZ2Jvb2xlYW4gbXNzX21vZGU7CisKKyAgLyogU2V0IHRvIFRSVUUgaWYgdGhlIGluY29taW5nIHN0cmVhbSBpcyBlaXRoZXIgYSBNU1Mgc3RyZWFtIG9yCisgICAqIGEgRnJhZ21lbnRlZCBNUDQgKGNvbnRhaW5pbmcgdGhlIFttdmV4XSBhdG9tIGluIHRoZSBoZWFkZXIpICovCisgIGdib29sZWFuIGZyYWdtZW50ZWQ7CisKKyAgLyogUFVMTC1CQVNFRCBvbmx5IDogSWYgVFJVRSB0aGVyZSBpcyBhIHBlbmRpbmcgc2VlayAqLworICBnYm9vbGVhbiBmcmFnbWVudGVkX3NlZWtfcGVuZGluZzsKKworICAvKiBQVUxMLUJBU0VEIDogb2Zmc2V0IG9mIGZpcnN0IFttb29mXSBvciBvZiBmcmFnbWVudCB0byBzZWVrIHRvCisgICAqIFBVU0gtQkFTRUQgOiBvZmZzZXQgb2YgbGF0ZXN0IFttb29mXSAqLworICBndWludDY0IG1vb2Zfb2Zmc2V0OworCisgIC8qIE1TUyBzdHJlYW1zIGhhdmUgYSBzaW5nbGUgbWVkaWEgdGhhdCBpcyB1bnNwZWNpZmllZCBhdCB0aGUgYXRvbXMsIHNvCisgICAqIHVwc3RyZWFtIHByb3ZpZGVzIGl0IGF0IHRoZSBjYXBzICovCisgIEdzdENhcHMgKm1lZGlhX2NhcHM7CisKKyAgLyogU2V0IHRvIFRSVUUgd2hlbiBhbGwgc3RyZWFtcyBoYXZlIGJlZW4gZXhwb3NlZCAqLworICBnYm9vbGVhbiBleHBvc2VkOworCisgIGdpbnQ2NCBjaGFwdGVyc190cmFja19pZDsKKworICAvKiBwcm90ZWN0aW9uIHN1cHBvcnQgKi8KKyAgR1B0ckFycmF5ICpwcm90ZWN0aW9uX3N5c3RlbV9pZHM7IC8qIEhvbGRzIGlkZW50aWZpZXJzIG9mIGFsbCBjb250ZW50IHByb3RlY3Rpb24gc3lzdGVtcyBmb3IgYWxsIHRyYWNrcyAqLworICBHUXVldWUgcHJvdGVjdGlvbl9ldmVudF9xdWV1ZTsgLyogaG9sZHMgY29weSBvZiB1cHN0cmVhbSBwcm90ZWN0aW9uIGV2ZW50cyAqLworICBndWludDY0IGNlbmNfYXV4X2luZm9fb2Zmc2V0OworICBndWludDggKmNlbmNfYXV4X2luZm9fc2l6ZXM7CisgIGd1aW50MzIgY2VuY19hdXhfc2FtcGxlX2NvdW50OworCisKKyAgLyoKKyAgICogQUxMIFZBUklBQkxFUyBCRUxPVyBBUkUgT05MWSBVU0VEIElOIFBVU0gtQkFTRUQgTU9ERQorICAgKi8KKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKKyAgZ3VpbnQgbmVlZGVkYnl0ZXM7CisgIGd1aW50IHRvZHJvcDsKKyAgLyogVXNlZCB0byBzdG9yZSBkYXRhIGlmIFttZGF0XSBpcyBiZWZvcmUgdGhlIGhlYWRlcnMgKi8KKyAgR3N0QnVmZmVyICptZGF0YnVmZmVyOworICAvKiBBbW91bnQgb2YgYnl0ZXMgbGVmdCB0byByZWFkIGluIHRoZSBjdXJyZW50IFttZGF0XSAqLworICBndWludDY0IG1kYXRsZWZ0LCBtZGF0c2l6ZTsKKworICAvKiBXaGVuIHJlc3RvcmluZyB0aGUgbWRhdCB0byB0aGUgYWRhcHRlciwgdGhpcyBidWZmZXIgc3RvcmVzIGFueQorICAgKiB0cmFpbGluZyBkYXRhIHRoYXQgd2FzIGFmdGVyIHRoZSBsYXN0IGF0b20gcGFyc2VkIGFzIGl0IGhhcyB0byBiZQorICAgKiByZXN0b3JlZCBsYXRlciBhbG9uZyB3aXRoIHRoZSBjb3JyZWN0IG9mZnNldC4gVXNlZCBpbiBmcmFnbWVudGVkCisgICAqIHNjZW5hcmlvIHdoZXJlIG1kYXQvbW9vZiBhcmUgb25lIGFmdGVyIHRoZSBvdGhlciBpbiBhbnkgb3JkZXIuCisgICAqCisgICAqIENoZWNrIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTA2MjMgKi8KKyAgR3N0QnVmZmVyICpyZXN0b3JlZGF0YV9idWZmZXI7CisgIGd1aW50NjQgcmVzdG9yZWRhdGFfb2Zmc2V0OworCisgIC8qIFRoZSBjdXJyZW50IG9mZnNldCBpbiBieXRlcyBmcm9tIHVwc3RyZWFtLgorICAgKiBOb3RlOiBXaGlsZSBpdCBtYWtlcyBjb21wbGV0ZSBzZW5zZSB3aGVuIHdlIGFyZSBQVUxMLUJBU0VEIChwdWxsaW5nCisgICAqIGluIEJZVEVTIGZyb20gdXBzdHJlYW0pIGFuZCBQVVNILUJBU0VEIHdpdGggYSBCWVRFIFNFR01FTlQgKHJlY2VpdmluZworICAgKiBidWZmZXJzIHdpdGggYWN0dWFsIG9mZnNldHMpLCBpdCBpcyB1bmRlZmluZWQgaW4gUFVTSC1CQVNFRCB3aXRoIGEKKyAgICogVElNRSBTRUdNRU5UICovCisgIGd1aW50NjQgb2Zmc2V0OworCisgIC8qIG9mZnNldCBvZiB0aGUgbWRhdCBhdG9tICovCisgIGd1aW50NjQgbWRhdG9mZnNldDsKKyAgLyogT2Zmc2V0IG9mIHRoZSBmaXJzdCBtZGF0ICovCisgIGd1aW50NjQgZmlyc3RfbWRhdDsKKyAgLyogb2Zmc2V0IG9mIGxhc3QgW21vb3ZdIHNlZW4gKi8KKyAgZ3VpbnQ2NCBsYXN0X21vb3Zfb2Zmc2V0OworCisgIC8qIElmIFRSVUUsIHF0ZGVtdXggcmVjZWl2ZWQgdXBzdHJlYW0gbmV3c2VnbWVudCBpbiBUSU1FIGZvcm1hdAorICAgKiB3aGljaCBsaWtlbHkgbWVhbnMgdGhhdCB1cHN0cmVhbSBpcyBkcml2aW5nIHRoZSBwaXBlbGluZSAoc3VjaCBhcworICAgKiBhZGFwdGl2ZSBkZW11eGVycyBvciBkbG5hIHNvdXJjZXMpICovCisgIGdib29sZWFuIHVwc3RyZWFtX2Zvcm1hdF9pc190aW1lOworCisgIC8qIFNlcW51bSBvZiB0aGUgc2VlayBldmVudCBzZW50IHVwc3RyZWFtLiAgV2lsbCBiZSB1c2VkIHRvCisgICAqIGRldGVjdCBpbmNvbWluZyBGTFVTSCBldmVudHMgY29ycmVzcG9uZGluZyB0byB0aGF0ICovCisgIGd1aW50MzIgb2Zmc2V0X3NlZWtfc2VxbnVtOworCisgIC8qIFVQU1RSRUFNIEJZVEU6IFJlcXVlc3RlZCB1cHN0cmVhbSBieXRlIHNlZWsgb2Zmc2V0LgorICAgKiBDdXJyZW50bHkgaXQgaXMgb25seSB1c2VkIHRvIGNoZWNrIGlmIGFuIGluY29taW5nIEJZVEUgU0VHTUVOVAorICAgKiBjb3JyZXNwb25kcyB0byBhIHNlZWsgZXZlbnQgdGhhdCB3YXMgc2VudCB1cHN0cmVhbSAqLworICBnaW50NjQgc2Vla19vZmZzZXQ7CisKKyAgLyogVVBTVFJFQU0gQllURTogUmVxdWVzdGVkIHN0YXJ0L3N0b3AgVElNRSB2YWx1ZXMgZnJvbQorICAgKiBkb3duc3RyZWFtLgorICAgKiBVc2VkIHRvIHNldCBvbiB0aGUgZG93bnN0cmVhbSBzZWdtZW50IG9uY2UgdGhlIGNvcnJlc3BvbmRpbmcgdXBzdHJlYW0KKyAgICogQllURSBTRUVLIGhhcyBzdWNjZWVkZWQgKi8KKyAgZ2ludDY0IHB1c2hfc2Vla19zdGFydDsKKyAgZ2ludDY0IHB1c2hfc2Vla19zdG9wOworCisjaWYgMAorICAvKiBnc3QgaW5kZXggc3VwcG9ydCAqLworICBHc3RJbmRleCAqZWxlbWVudF9pbmRleDsKKyAgZ2ludCBpbmRleF9pZDsKKyNlbmRpZgorCisgIC8qIFdoZXRoZXIgdXBzdHJlYW0gaXMgc2Vla2FibGUgaW4gQllURVMgKi8KKyAgZ2Jvb2xlYW4gdXBzdHJlYW1fc2Vla2FibGU7CisgIC8qIFVQU1RSRUFNIEJZVEU6IFNpemUgb2YgdXBzdHJlYW0gY29udGVudC4KKyAgICogTm90ZSA6IFRoaXMgaXMgb25seSBjb21wdXRlZCBvbmNlICEgSWYgdXBzdHJlYW0gZ3Jvd3MgaW4gdGhlIG1lYW50aW1lCisgICAqIGl0IHdpbGwgbm90IGJlIHVwZGF0ZWQgKi8KKyAgZ2ludDY0IHVwc3RyZWFtX3NpemU7CisKKyAgLyogVVBTVFJFQU0gVElNRSA6IENvbnRhaW5zIHRoZSBQVFMgKGlmIGFueSkgb2YgdGhlCisgICAqIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIGEgW21vb2ZdIGhlYWRlci4gV2lsbCBiZSB1c2VkIHRvIGVzdGFibGlzaAorICAgKiB0aGUgYWN0dWFsIFBUUyBvZiB0aGUgc2FtcGxlcyBjb250YWluZWQgd2l0aGluIHRoYXQgZnJhZ21lbnQuICovCisgIGd1aW50NjQgZnJhZ21lbnRfc3RhcnQ7CisgIC8qIFVQU1RSRUFNIFRJTUUgOiBUaGUgb2Zmc2V0IGluIGJ5dGVzIG9mIHRoZSBbbW9vZl0KKyAgICogaGVhZGVyIHN0YXJ0LgorICAgKiBOb3RlIDogVGhpcyBpcyBub3QgY29tcHV0ZWQgZnJvbSB0aGUgR1NUX0JVRkZFUl9PRkZTRVQgZmllbGQgKi8KKyAgZ3VpbnQ2NCBmcmFnbWVudF9zdGFydF9vZmZzZXQ7Cit9OworCitzdHJ1Y3QgX0dzdFFURGVtdXhDbGFzcyB7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcXRkZW11eF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9RVERFTVVYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9xdGRlbXV4X2RlYnVnLmggYi9nc3QvaXNvbXA0L3F0ZGVtdXhfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmRhMjY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9xdGRlbXV4X2RlYnVnLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfX0dTVF9RVERFTVVYX0RFQlVHX0hfXworI2RlZmluZSBfX0dTVF9RVERFTVVYX0RFQlVHX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitHX0JFR0lOX0RFQ0xTCisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKHF0ZGVtdXhfZGVidWcpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUVRERU1VWF9ERUJVR19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvcXRkZW11eF9kdW1wLmMgYi9nc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZjJlOTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5jCkBAIC0wLDAgKzEsMTA0OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBTVEVyaWNzc29uIDxiZW5qYW1pbi5nYWlnbmFyZEBzdGVyaWNzc29uLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAicXRkZW11eF9kZWJ1Zy5oIgorI2luY2x1ZGUgInF0ZGVtdXhfdHlwZXMuaCIKKyNpbmNsdWRlICJxdGRlbXV4X2R1bXAuaCIKKyNpbmNsdWRlICJmb3VyY2MuaCIKKworI2luY2x1ZGUgInF0YXRvbXBhcnNlci5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHF0ZGVtdXhfZGVidWcKKworI2RlZmluZSBHRVRfVUlOVDgoZGF0YSkgICBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQ4X3VuY2hlY2tlZChkYXRhKQorI2RlZmluZSBHRVRfVUlOVDE2KGRhdGEpICBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9iZV91bmNoZWNrZWQoZGF0YSkKKyNkZWZpbmUgR0VUX1VJTlQzMihkYXRhKSAgZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmVfdW5jaGVja2VkKGRhdGEpCisjZGVmaW5lIEdFVF9VSU5UNjQoZGF0YSkgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDY0X2JlX3VuY2hlY2tlZChkYXRhKQorI2RlZmluZSBHRVRfRlAzMihkYXRhKSAgIChnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQoZGF0YSkvNjU1MzYuMCkKKyNkZWZpbmUgR0VUX0ZQMTYoZGF0YSkgICAoZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfYmVfdW5jaGVja2VkKGRhdGEpLzI1Ni4wKQorI2RlZmluZSBHRVRfRk9VUkNDKGRhdGEpICBxdF9hdG9tX3BhcnNlcl9nZXRfZm91cmNjX3VuY2hlY2tlZChkYXRhKQorCitnYm9vbGVhbgorcXRkZW11eF9kdW1wX212aGQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwgaW50IGRlcHRoKQoreworICBndWludDMyIHZlcnNpb24gPSAwOworCisgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX3JlbWFpbmluZyAoZGF0YSwgMTAwKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgdmVyc2lvbiA9IEdFVF9VSU5UMzIgKGRhdGEpOworICBHU1RfTE9HICgiJSpzICB2ZXJzaW9uL2ZsYWdzOiAlMDh4IiwgZGVwdGgsICIiLCB2ZXJzaW9uKTsKKworICB2ZXJzaW9uID0gdmVyc2lvbiA+PiAyNDsKKyAgaWYgKHZlcnNpb24gPT0gMCkgeworICAgIEdTVF9MT0cgKCIlKnMgIGNyZWF0aW9uIHRpbWU6ICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgICAgR1NUX0xPRyAoIiUqcyAgbW9kaWZ5IHRpbWU6ICAgJXUiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgICBHU1RfTE9HICgiJSpzICB0aW1lIHNjYWxlOiAgICAxLyV1IHNlYyIsIGRlcHRoLCAiIiwgR0VUX1VJTlQzMiAoZGF0YSkpOworICAgIEdTVF9MT0cgKCIlKnMgIGR1cmF0aW9uOiAgICAgICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAxKSB7CisgICAgR1NUX0xPRyAoIiUqcyAgY3JlYXRpb24gdGltZTogJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgZGVwdGgsICIiLCBHRVRfVUlOVDY0IChkYXRhKSk7CisgICAgR1NUX0xPRyAoIiUqcyAgbW9kaWZ5IHRpbWU6ICAgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgZGVwdGgsICIiLCBHRVRfVUlOVDY0IChkYXRhKSk7CisgICAgR1NUX0xPRyAoIiUqcyAgdGltZSBzY2FsZTogICAgMS8ldSBzZWMiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgICBHU1RfTE9HICgiJSpzICBkdXJhdGlvbjogICAgICAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICBkZXB0aCwgIiIsIEdFVF9VSU5UNjQgKGRhdGEpKTsKKyAgfSBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHByZWYuIHJhdGU6ICAgICVnIiwgZGVwdGgsICIiLCBHRVRfRlAzMiAoZGF0YSkpOworICBHU1RfTE9HICgiJSpzICBwcmVmLiB2b2x1bWU6ICAlZyIsIGRlcHRoLCAiIiwgR0VUX0ZQMTYgKGRhdGEpKTsKKyAgZ3N0X2J5dGVfcmVhZGVyX3NraXBfdW5jaGVja2VkIChkYXRhLCA0Nik7CisgIEdTVF9MT0cgKCIlKnMgIHByZXZpZXcgdGltZTogICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgIEdTVF9MT0cgKCIlKnMgIHByZXZpZXcgZHVyLjogICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgIEdTVF9MT0cgKCIlKnMgIHBvc3RlciB0aW1lOiAgICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgIEdTVF9MT0cgKCIlKnMgIHNlbGVjdCB0aW1lOiAgICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgIEdTVF9MT0cgKCIlKnMgIHNlbGVjdCBkdXIuOiAgICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgIEdTVF9MT0cgKCIlKnMgIGN1cnJlbnQgdGltZTogICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgIEdTVF9MT0cgKCIlKnMgIG5leHQgdHJhY2sgSUQ6ICVkIiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgorcXRkZW11eF9kdW1wX3RraGQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwgaW50IGRlcHRoKQoreworICBndWludDY0IGR1cmF0aW9uLCBjdGltZSwgbXRpbWU7CisgIGd1aW50MzIgdmVyc2lvbiA9IDAsIHRyYWNrX2lkID0gMCwgaXdpZHRoID0gMCwgaWhlaWdodCA9IDA7CisgIGd1aW50MTYgbGF5ZXIgPSAwLCBhbHRfZ3JvdXAgPSAwLCBpdm9sID0gMDsKKyAgZ3VpbnQgdmFsdWVfc2l6ZTsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmdmVyc2lvbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcnNpb24pOworCisgIHZhbHVlX3NpemUgPSAoKHZlcnNpb24gPj4gMjQpID09IDEpID8gc2l6ZW9mIChndWludDY0KSA6IHNpemVvZiAoZ3VpbnQzMik7CisKKyAgaWYgKHF0X2F0b21fcGFyc2VyX2dldF9vZmZzZXQgKGRhdGEsIHZhbHVlX3NpemUsICZjdGltZSkgJiYKKyAgICAgIHF0X2F0b21fcGFyc2VyX2dldF9vZmZzZXQgKGRhdGEsIHZhbHVlX3NpemUsICZtdGltZSkgJiYKKyAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmdHJhY2tfaWQpICYmCisgICAgICBnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoZGF0YSwgNCkgJiYKKyAgICAgIHF0X2F0b21fcGFyc2VyX2dldF9vZmZzZXQgKGRhdGEsIHZhbHVlX3NpemUsICZkdXJhdGlvbikgJiYKKyAgICAgIGdzdF9ieXRlX3JlYWRlcl9za2lwIChkYXRhLCA0KSAmJgorICAgICAgZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfYmUgKGRhdGEsICZsYXllcikgJiYKKyAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2JlIChkYXRhLCAmYWx0X2dyb3VwKSAmJgorICAgICAgZ3N0X2J5dGVfcmVhZGVyX3NraXAgKGRhdGEsIDQpICYmCisgICAgICBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9iZSAoZGF0YSwgJml2b2wpICYmCisgICAgICBnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoZGF0YSwgMiArICg5ICogNCkpICYmCisgICAgICBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJml3aWR0aCkgJiYKKyAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmaWhlaWdodCkpIHsKKyAgICBHU1RfTE9HICgiJSpzICBjcmVhdGlvbiB0aW1lOiAlIiBHX0dVSU5UNjRfRk9STUFULCBkZXB0aCwgIiIsIGN0aW1lKTsKKyAgICBHU1RfTE9HICgiJSpzICBtb2RpZnkgdGltZTogICAlIiBHX0dVSU5UNjRfRk9STUFULCBkZXB0aCwgIiIsIG10aW1lKTsKKyAgICBHU1RfTE9HICgiJSpzICB0cmFjayBJRDogICAgICAldSIsIGRlcHRoLCAiIiwgdHJhY2tfaWQpOworICAgIEdTVF9MT0cgKCIlKnMgIGR1cmF0aW9uOiAgICAgICUiIEdfR1VJTlQ2NF9GT1JNQVQsIGRlcHRoLCAiIiwgZHVyYXRpb24pOworICAgIEdTVF9MT0cgKCIlKnMgIGxheWVyOiAgICAgICAgICV1IiwgZGVwdGgsICIiLCBsYXllcik7CisgICAgR1NUX0xPRyAoIiUqcyAgYWx0IGdyb3VwOiAgICAgJXUiLCBkZXB0aCwgIiIsIGFsdF9ncm91cCk7CisgICAgR1NUX0xPRyAoIiUqcyAgdm9sdW1lOiAgICAgICAgJWciLCBkZXB0aCwgIiIsIGl2b2wgLyAyNTYuMCk7CisgICAgR1NUX0xPRyAoIiUqcyAgdHJhY2sgd2lkdGg6ICAgJWciLCBkZXB0aCwgIiIsIGl3aWR0aCAvIDY1NTM2LjApOworICAgIEdTVF9MT0cgKCIlKnMgIHRyYWNrIGhlaWdodDogICVnIiwgZGVwdGgsICIiLCBpaGVpZ2h0IC8gNjU1MzYuMCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfZWxzdCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGd1aW50MzIgdmVyX2ZsYWdzID0gMCwgbnVtX2VudHJpZXMgPSAwLCBpOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZ2ZXJfZmxhZ3MpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZudW1fZW50cmllcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcl9mbGFncyk7CisgIEdTVF9MT0cgKCIlKnMgIG4gZW50cmllczogICAgICVkIiwgZGVwdGgsICIiLCBudW1fZW50cmllcyk7CisKKyAgaWYgKCFxdF9hdG9tX3BhcnNlcl9oYXNfY2h1bmtzIChkYXRhLCBudW1fZW50cmllcywgNCArIDQgKyA0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9lbnRyaWVzOyBpKyspIHsKKyAgICBHU1RfTE9HICgiJSpzICAgIHRyYWNrIGR1cjogICAgICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgICAgR1NUX0xPRyAoIiUqcyAgICBtZWRpYSB0aW1lOiAgICAldSIsIGRlcHRoLCAiIiwgR0VUX1VJTlQzMiAoZGF0YSkpOworICAgIEdTVF9MT0cgKCIlKnMgICAgbWVkaWEgcmF0ZTogICAgJWciLCBkZXB0aCwgIiIsIEdFVF9GUDMyIChkYXRhKSk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfbWRoZCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGd1aW50MzIgdmVyc2lvbiA9IDA7CisgIGd1aW50NjQgZHVyYXRpb24sIGN0aW1lLCBtdGltZTsKKyAgZ3VpbnQzMiB0aW1lX3NjYWxlID0gMDsKKyAgZ3VpbnQxNiBsYW5ndWFnZSA9IDAsIHF1YWxpdHkgPSAwOworICBndWludCB2YWx1ZV9zaXplOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZ2ZXJzaW9uKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgR1NUX0xPRyAoIiUqcyAgdmVyc2lvbi9mbGFnczogJTA4eCIsIGRlcHRoLCAiIiwgdmVyc2lvbik7CisKKyAgdmFsdWVfc2l6ZSA9ICgodmVyc2lvbiA+PiAyNCkgPT0gMSkgPyBzaXplb2YgKGd1aW50NjQpIDogc2l6ZW9mIChndWludDMyKTsKKworICBpZiAocXRfYXRvbV9wYXJzZXJfZ2V0X29mZnNldCAoZGF0YSwgdmFsdWVfc2l6ZSwgJmN0aW1lKSAmJgorICAgICAgcXRfYXRvbV9wYXJzZXJfZ2V0X29mZnNldCAoZGF0YSwgdmFsdWVfc2l6ZSwgJm10aW1lKSAmJgorICAgICAgZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZ0aW1lX3NjYWxlKSAmJgorICAgICAgcXRfYXRvbV9wYXJzZXJfZ2V0X29mZnNldCAoZGF0YSwgdmFsdWVfc2l6ZSwgJmR1cmF0aW9uKSAmJgorICAgICAgZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfYmUgKGRhdGEsICZsYW5ndWFnZSkgJiYKKyAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2JlIChkYXRhLCAmcXVhbGl0eSkpIHsKKyAgICBHU1RfTE9HICgiJSpzICBjcmVhdGlvbiB0aW1lOiAlIiBHX0dVSU5UNjRfRk9STUFULCBkZXB0aCwgIiIsIGN0aW1lKTsKKyAgICBHU1RfTE9HICgiJSpzICBtb2RpZnkgdGltZTogICAlIiBHX0dVSU5UNjRfRk9STUFULCBkZXB0aCwgIiIsIG10aW1lKTsKKyAgICBHU1RfTE9HICgiJSpzICB0aW1lIHNjYWxlOiAgICAxLyV1IHNlYyIsIGRlcHRoLCAiIiwgdGltZV9zY2FsZSk7CisgICAgR1NUX0xPRyAoIiUqcyAgZHVyYXRpb246ICAgICAgJSIgR19HVUlOVDY0X0ZPUk1BVCwgZGVwdGgsICIiLCBkdXJhdGlvbik7CisgICAgR1NUX0xPRyAoIiUqcyAgbGFuZ3VhZ2U6ICAgICAgJXUiLCBkZXB0aCwgIiIsIGxhbmd1YWdlKTsKKyAgICBHU1RfTE9HICgiJSpzICBxdWFsaXR5OiAgICAgICAldSIsIGRlcHRoLCAiIiwgcXVhbGl0eSk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfaGRsciAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGd1aW50MzIgdmVyc2lvbiwgdHlwZSwgc3VidHlwZSwgbWFudWZhY3R1cmVyOworICBjb25zdCBnY2hhciAqbmFtZTsKKworICBpZiAoIXF0X2F0b21fcGFyc2VyX2hhc19yZW1haW5pbmcgKGRhdGEsIDQgKyA0ICsgNCArIDQgKyA0ICsgNCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHZlcnNpb24gPSBHRVRfVUlOVDMyIChkYXRhKTsKKyAgdHlwZSA9IEdFVF9GT1VSQ0MgKGRhdGEpOworICBzdWJ0eXBlID0gR0VUX0ZPVVJDQyAoZGF0YSk7CisgIG1hbnVmYWN0dXJlciA9IEdFVF9GT1VSQ0MgKGRhdGEpOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcnNpb24pOworICBHU1RfTE9HICgiJSpzICB0eXBlOiAgICAgICAgICAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwgZGVwdGgsICIiLAorICAgICAgR1NUX0ZPVVJDQ19BUkdTICh0eXBlKSk7CisgIEdTVF9MT0cgKCIlKnMgIHN1YnR5cGU6ICAgICAgICUiIEdTVF9GT1VSQ0NfRk9STUFULCBkZXB0aCwgIiIsCisgICAgICBHU1RfRk9VUkNDX0FSR1MgKHN1YnR5cGUpKTsKKyAgR1NUX0xPRyAoIiUqcyAgbWFudWZhY3R1cmVyOiAgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsIGRlcHRoLCAiIiwKKyAgICAgIEdTVF9GT1VSQ0NfQVJHUyAobWFudWZhY3R1cmVyKSk7CisgIEdTVF9MT0cgKCIlKnMgIGZsYWdzOiAgICAgICAgICUwOHgiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgR1NUX0xPRyAoIiUqcyAgZmxhZ3MgbWFzazogICAgJTA4eCIsIGRlcHRoLCAiIiwgR0VUX1VJTlQzMiAoZGF0YSkpOworCisgIC8qIHF1aWNrdGltZSB1c2VzIHBhc2NhbCBzdHJpbmcsIG1wNCB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5nICovCisgIGlmIChnc3RfYnl0ZV9yZWFkZXJfcGVla19zdHJpbmcgKGRhdGEsICZuYW1lKSkgeworICAgIEdTVF9MT0cgKCIlKnMgIG5hbWU6ICAgICAgICAgICVzIiwgZGVwdGgsICIiLCBuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICBnY2hhciBidWZbMjU2XTsKKyAgICBndWludDggbGVuOworCisgICAgaWYgKGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKGRhdGEsICZsZW4pCisgICAgICAgICYmIHF0X2F0b21fcGFyc2VyX2hhc19yZW1haW5pbmcgKGRhdGEsIGxlbikpIHsKKyAgICAgIG1lbWNweSAoYnVmLCBnc3RfYnl0ZV9yZWFkZXJfcGVla19kYXRhX3VuY2hlY2tlZCAoZGF0YSksIGxlbik7CisgICAgICBidWZbbGVuXSA9ICdcMCc7CisgICAgICBHU1RfTE9HICgiJSpzICBuYW1lOiAgICAgICAgICAlcyIsIGRlcHRoLCAiIiwgYnVmKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfdm1oZCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX3JlbWFpbmluZyAoZGF0YSwgNCArIDQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBHU1RfTE9HICgiJSpzICB2ZXJzaW9uL2ZsYWdzOiAlMDh4IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgIEdTVF9MT0cgKCIlKnMgIG1vZGUvY29sb3I6ICAgICUwOHgiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfZHJlZiAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGd1aW50MzIgdmVyX2ZsYWdzID0gMCwgbnVtX2VudHJpZXMgPSAwLCBpOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZ2ZXJfZmxhZ3MpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZudW1fZW50cmllcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcl9mbGFncyk7CisgIEdTVF9MT0cgKCIlKnMgIG4gZW50cmllczogICAgICV1IiwgZGVwdGgsICIiLCBudW1fZW50cmllcyk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fZW50cmllczsgaSsrKSB7CisgICAgZ3VpbnQzMiBzaXplID0gMCwgZm91cmNjOworCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJnNpemUpIHx8CisgICAgICAgICFxdF9hdG9tX3BhcnNlcl9nZXRfZm91cmNjIChkYXRhLCAmZm91cmNjKSB8fCBzaXplIDwgOCB8fAorICAgICAgICAhZ3N0X2J5dGVfcmVhZGVyX3NraXAgKGRhdGEsIHNpemUgLSA4KSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIEdTVF9MT0cgKCIlKnMgICAgc2l6ZTogICAgICAgICAgJXUiLCBkZXB0aCwgIiIsIHNpemUpOworICAgIEdTVF9MT0cgKCIlKnMgICAgdHlwZTogICAgICAgICAgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsIGRlcHRoLCAiIiwKKyAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X2R1bXBfc3RzZF9hdmMxIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsIGd1aW50IHNpemUsCisgICAgaW50IGRlcHRoKQoreworICBndWludDMyIGZvdXJjYzsKKworICAvKiBTaXplIG9mIGF2YzEgPSA3OCBieXRlcyAqLworICBpZiAoc2l6ZSA8ICg2ICsgMiArIDQgKyA0ICsgNCArIDQgKyAyICsgMiArIDQgKyA0ICsgNCArIDIgKyAxICsgMzEgKyAyICsgMikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGdzdF9ieXRlX3JlYWRlcl9za2lwX3VuY2hlY2tlZCAoZGF0YSwgNik7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiJSpzICAgIGRhdGEgcmVmZXJlbmNlOiVkIiwgZGVwdGgsICIiLAorICAgICAgR0VUX1VJTlQxNiAoZGF0YSkpOworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIiUqcyAgICB2ZXJzaW9uL3Jldi46ICAlMDh4IiwgZGVwdGgsICIiLAorICAgICAgR0VUX1VJTlQzMiAoZGF0YSkpOworICBmb3VyY2MgPSBHRVRfRk9VUkNDIChkYXRhKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICIlKnMgICAgdmVuZG9yOiAgICAgICAgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsIGRlcHRoLAorICAgICAgIiIsIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSk7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiJSpzICAgIHRlbXBvcmFsIHF1YWw6ICV1IiwgZGVwdGgsICIiLAorICAgICAgR0VUX1VJTlQzMiAoZGF0YSkpOworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIiUqcyAgICBzcGF0aWFsIHF1YWw6ICAldSIsIGRlcHRoLCAiIiwKKyAgICAgIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICIlKnMgICAgd2lkdGg6ICAgICAgICAgJXUiLCBkZXB0aCwgIiIsCisgICAgICBHRVRfVUlOVDE2IChkYXRhKSk7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiJSpzICAgIGhlaWdodDogICAgICAgICV1IiwgZGVwdGgsICIiLAorICAgICAgR0VUX1VJTlQxNiAoZGF0YSkpOworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIiUqcyAgICBob3Jpei4gcmVzb2w6ICAlZyIsIGRlcHRoLCAiIiwKKyAgICAgIEdFVF9GUDMyIChkYXRhKSk7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiJSpzICAgIHZlcnQuIHJlc29sLjogICVnIiwgZGVwdGgsICIiLAorICAgICAgR0VUX0ZQMzIgKGRhdGEpKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICIlKnMgICAgZGF0YSBzaXplOiAgICAgJXUiLCBkZXB0aCwgIiIsCisgICAgICBHRVRfVUlOVDMyIChkYXRhKSk7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiJSpzICAgIGZyYW1lIGNvdW50OiAgICV1IiwgZGVwdGgsICIiLAorICAgICAgR0VUX1VJTlQxNiAoZGF0YSkpOworICAvKiBzb21ldGhpbmcgaXMgbm90IHJpZ2h0IHdpdGggdGhpcywgaXQncyBzdXBwb3NlZCB0byBiZSBhIHN0cmluZyBidXQgaXQncworICAgKiBub3QgYXBwYXJlbnRseSwgc28ganVzdCBza2lwIHRoaXMgZm9yIG5vdyAqLworICBnc3RfYnl0ZV9yZWFkZXJfc2tpcF91bmNoZWNrZWQgKGRhdGEsIDEgKyAzMSk7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiJSpzICAgIGNvbXByZXNzb3I6ICAgIChza2lwcGVkKSIsIGRlcHRoLCAiIik7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiJSpzICAgIGRlcHRoOiAgICAgICAgICV1IiwgZGVwdGgsICIiLAorICAgICAgR0VUX1VJTlQxNiAoZGF0YSkpOworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIiUqcyAgICBjb2xvciB0YWJsZSBJRDoldSIsIGRlcHRoLCAiIiwKKyAgICAgIEdFVF9VSU5UMTYgKGRhdGEpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3F0ZGVtdXhfZHVtcF9zdHNkIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsIGludCBkZXB0aCkKK3sKKyAgZ3VpbnQzMiB2ZXJfZmxhZ3MgPSAwLCBudW1fZW50cmllcyA9IDAsIGk7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJnZlcl9mbGFncykgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJm51bV9lbnRyaWVzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgR1NUX0xPRyAoIiUqcyAgdmVyc2lvbi9mbGFnczogJTA4eCIsIGRlcHRoLCAiIiwgdmVyX2ZsYWdzKTsKKyAgR1NUX0xPRyAoIiUqcyAgbiBlbnRyaWVzOiAgICAgJWQiLCBkZXB0aCwgIiIsIG51bV9lbnRyaWVzKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykgeworICAgIEdzdEJ5dGVSZWFkZXIgc3ViOworICAgIGd1aW50MzIgc2l6ZSwgcmVtYWluOworICAgIGd1aW50MzIgZm91cmNjOworCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJnNpemUpIHx8CisgICAgICAgICFxdF9hdG9tX3BhcnNlcl9nZXRfZm91cmNjIChkYXRhLCAmZm91cmNjKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiJSpzICAgIHNpemU6ICAgICAgICAgICV1IiwgZGVwdGgsICIiLCBzaXplKTsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIiUqcyAgICB0eXBlOiAgICAgICAgICAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwgZGVwdGgsCisgICAgICAgICIiLCBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYykpOworCisgICAgcmVtYWluID0gZ3N0X2J5dGVfcmVhZGVyX2dldF9yZW1haW5pbmcgKGRhdGEpOworICAgIC8qIFNpemUgaW5jbHVkZXMgdGhlIDggYnl0ZXMgd2UganVzdCByZWFkOiBsZW4gJiBmb3VyY2MsIHRoZW4gOCBieXRlcworICAgICAqIHZlcnNpb24sIGZsYWdzLCBlbnRyaWVzX2NvdW50ICovCisgICAgaWYgKHNpemUgPiByZW1haW4gKyA4KSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAiTm90IGVub3VnaCBkYXRhIGxlZnQgZm9yIHRoaXMgYXRvbSAoaGF2ZSAldSBuZWVkICV1KSIsIHJlbWFpbiwgc2l6ZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcXRfYXRvbV9wYXJzZXJfcGVla19zdWIgKGRhdGEsIDAsIHNpemUsICZzdWIpOworICAgIHN3aXRjaCAoZm91cmNjKSB7CisgICAgICBjYXNlIEZPVVJDQ19hdmMxOgorICAgICAgICBpZiAoIXF0ZGVtdXhfZHVtcF9zdHNkX2F2YzEgKHF0ZGVtdXgsICZzdWIsIHNpemUsIGRlcHRoICsgMSkpCisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk9VUkNDX2ZMYUM6CisgICAgICAgIC8qIHdpbGwgYmUgZHVtcGVkIGJ5IG5vZGVfZHVtcF9mb3JlYWNoICovCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGT1VSQ0NfbXA0czoKKyAgICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoJnN1YiwgJnZlcl9mbGFncykgfHwKKyAgICAgICAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoJnN1YiwgJm51bV9lbnRyaWVzKSkKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghcXRkZW11eF9kdW1wX3Vua25vd24gKHF0ZGVtdXgsICZzdWIsIGRlcHRoICsgMSkpCisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIFVua25vd24gc3RzZCBkYXRhLCBkdW1wIHRoZSBieXRlcyAqLworICAgICAgICBpZiAoIXF0ZGVtdXhfZHVtcF91bmtub3duIChxdGRlbXV4LCAmc3ViLCBkZXB0aCArIDEpKQorICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoZGF0YSwgc2l6ZSAtICg0ICsgNCkpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgorcXRkZW11eF9kdW1wX3N0dHMgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwgaW50IGRlcHRoKQoreworICBndWludDMyIHZlcl9mbGFncyA9IDAsIG51bV9lbnRyaWVzID0gMCwgaTsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmdmVyX2ZsYWdzKSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmbnVtX2VudHJpZXMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBHU1RfTE9HICgiJSpzICB2ZXJzaW9uL2ZsYWdzOiAlMDh4IiwgZGVwdGgsICIiLCB2ZXJfZmxhZ3MpOworICBHU1RfTE9HICgiJSpzICBuIGVudHJpZXM6ICAgICAlZCIsIGRlcHRoLCAiIiwgbnVtX2VudHJpZXMpOworCisgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX2NodW5rcyAoZGF0YSwgbnVtX2VudHJpZXMsIDQgKyA0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9lbnRyaWVzOyBpKyspIHsKKyAgICBHU1RfTE9HICgiJSpzICAgIGNvdW50OiAgICAgICAgICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgICAgR1NUX0xPRyAoIiUqcyAgICBkdXJhdGlvbjogICAgICAldSIsIGRlcHRoLCAiIiwgR0VUX1VJTlQzMiAoZGF0YSkpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgorcXRkZW11eF9kdW1wX3N0cHMgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwgaW50IGRlcHRoKQoreworICBndWludDMyIHZlcl9mbGFncyA9IDAsIG51bV9lbnRyaWVzID0gMCwgaTsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmdmVyX2ZsYWdzKSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmbnVtX2VudHJpZXMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBHU1RfTE9HICgiJSpzICB2ZXJzaW9uL2ZsYWdzOiAlMDh4IiwgZGVwdGgsICIiLCB2ZXJfZmxhZ3MpOworICBHU1RfTE9HICgiJSpzICBuIGVudHJpZXM6ICAgICAlZCIsIGRlcHRoLCAiIiwgbnVtX2VudHJpZXMpOworCisgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX2NodW5rcyAoZGF0YSwgbnVtX2VudHJpZXMsIDQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykgeworICAgIEdTVF9MT0cgKCIlKnMgICAgc2FtcGxlOiAgICAgICAgJXUiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3F0ZGVtdXhfZHVtcF9zdHNzIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsIGludCBkZXB0aCkKK3sKKyAgZ3VpbnQzMiB2ZXJfZmxhZ3MgPSAwLCBudW1fZW50cmllcyA9IDAsIGk7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJnZlcl9mbGFncykgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJm51bV9lbnRyaWVzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgR1NUX0xPRyAoIiUqcyAgdmVyc2lvbi9mbGFnczogJTA4eCIsIGRlcHRoLCAiIiwgdmVyX2ZsYWdzKTsKKyAgR1NUX0xPRyAoIiUqcyAgbiBlbnRyaWVzOiAgICAgJWQiLCBkZXB0aCwgIiIsIG51bV9lbnRyaWVzKTsKKworICBpZiAoIXF0X2F0b21fcGFyc2VyX2hhc19jaHVua3MgKGRhdGEsIG51bV9lbnRyaWVzLCA0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9lbnRyaWVzOyBpKyspIHsKKyAgICBHU1RfTE9HICgiJSpzICAgIHNhbXBsZTogICAgICAgICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfc3RzYyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGd1aW50MzIgdmVyX2ZsYWdzID0gMCwgbnVtX2VudHJpZXMgPSAwLCBpOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZ2ZXJfZmxhZ3MpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZudW1fZW50cmllcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcl9mbGFncyk7CisgIEdTVF9MT0cgKCIlKnMgIG4gZW50cmllczogICAgICVkIiwgZGVwdGgsICIiLCBudW1fZW50cmllcyk7CisKKyAgaWYgKCFxdF9hdG9tX3BhcnNlcl9oYXNfY2h1bmtzIChkYXRhLCBudW1fZW50cmllcywgNCArIDQgKyA0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9lbnRyaWVzOyBpKyspIHsKKyAgICBHU1RfTE9HICgiJSpzICAgIGZpcnN0IGNodW5rOiAgICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgICAgR1NUX0xPRyAoIiUqcyAgICBzYW1wbGUgcGVyIGNoOiAldSIsIGRlcHRoLCAiIiwgR0VUX1VJTlQzMiAoZGF0YSkpOworICAgIEdTVF9MT0cgKCIlKnMgICAgc2FtcGxlIGRlc2MgaWQ6JTA4eCIsIGRlcHRoLCAiIiwgR0VUX1VJTlQzMiAoZGF0YSkpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgorcXRkZW11eF9kdW1wX3N0c3ogKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwgaW50IGRlcHRoKQoreworICBndWludDMyIHZlcl9mbGFncyA9IDAsIHNhbXBsZV9zaXplID0gMCwgbnVtX2VudHJpZXMgPSAwLCBpOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZ2ZXJfZmxhZ3MpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZzYW1wbGVfc2l6ZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcl9mbGFncyk7CisgIEdTVF9MT0cgKCIlKnMgIHNhbXBsZSBzaXplOiAgICVkIiwgZGVwdGgsICIiLCBzYW1wbGVfc2l6ZSk7CisKKyAgaWYgKHNhbXBsZV9zaXplID09IDApIHsKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmbnVtX2VudHJpZXMpKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgR1NUX0xPRyAoIiUqcyAgbiBlbnRyaWVzOiAgICAgJWQiLCBkZXB0aCwgIiIsIG51bV9lbnRyaWVzKTsKKyAgICBpZiAoIXF0X2F0b21fcGFyc2VyX2hhc19jaHVua3MgKGRhdGEsIG51bV9lbnRyaWVzLCA0KSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykgeworICAgICAgR1NUX1RSQUNFICgiJSpzICAgIHNhbXBsZSBzaXplOiAgICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgorcXRkZW11eF9kdW1wX3N0Y28gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwgaW50IGRlcHRoKQoreworICBndWludDMyIHZlcl9mbGFncyA9IDAsIG51bV9lbnRyaWVzID0gMCwgaTsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmdmVyX2ZsYWdzKSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmbnVtX2VudHJpZXMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBHU1RfTE9HICgiJSpzICB2ZXJzaW9uL2ZsYWdzOiAlMDh4IiwgZGVwdGgsICIiLCB2ZXJfZmxhZ3MpOworICBHU1RfTE9HICgiJSpzICBuIGVudHJpZXM6ICAgICAlZCIsIGRlcHRoLCAiIiwgbnVtX2VudHJpZXMpOworCisgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX2NodW5rcyAoZGF0YSwgbnVtX2VudHJpZXMsIDQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykgeworICAgIEdTVF9MT0cgKCIlKnMgICAgY2h1bmsgb2Zmc2V0OiAgJXUiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3F0ZGVtdXhfZHVtcF9jdHRzIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsIGludCBkZXB0aCkKK3sKKyAgZ3VpbnQzMiB2ZXJfZmxhZ3MgPSAwLCBudW1fZW50cmllcyA9IDAsIGksIGNvdW50OworICBnaW50MzIgb2Zmc2V0OworCisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJnZlcl9mbGFncykgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJm51bV9lbnRyaWVzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgR1NUX0xPRyAoIiUqcyAgdmVyc2lvbi9mbGFnczogJTA4eCIsIGRlcHRoLCAiIiwgdmVyX2ZsYWdzKTsKKyAgR1NUX0xPRyAoIiUqcyAgbiBlbnRyaWVzOiAgICAgJXUiLCBkZXB0aCwgIiIsIG51bV9lbnRyaWVzKTsKKworICBpZiAoIXF0X2F0b21fcGFyc2VyX2hhc19jaHVua3MgKGRhdGEsIG51bV9lbnRyaWVzLCA0ICsgNCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fZW50cmllczsgaSsrKSB7CisgICAgY291bnQgPSBHRVRfVUlOVDMyIChkYXRhKTsKKyAgICBvZmZzZXQgPSBHRVRfVUlOVDMyIChkYXRhKTsKKyAgICBHU1RfTE9HICgiJSpzICAgIHNhbXBsZSBjb3VudCA6JThkIG9mZnNldDogJThkIiwgZGVwdGgsICIiLCBjb3VudCwgb2Zmc2V0KTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3F0ZGVtdXhfZHVtcF9jc2xnIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsIGludCBkZXB0aCkKK3sKKyAgZ3VpbnQzMiB2ZXJfZmxhZ3MgPSAwLCBzaGlmdCA9IDA7CisgIGdpbnQzMiBsZWFzdF9vZmZzZXQgPSAwLCBzdGFydF90aW1lID0gMCwgZW5kX3RpbWUgPSAwOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZ2ZXJfZmxhZ3MpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZzaGlmdCkgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2ludDMyX2JlIChkYXRhLCAmbGVhc3Rfb2Zmc2V0KSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfaW50MzJfYmUgKGRhdGEsICZzdGFydF90aW1lKSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfaW50MzJfYmUgKGRhdGEsICZlbmRfdGltZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcl9mbGFncyk7CisgIEdTVF9MT0cgKCIlKnMgIHNoaWZ0OiAgICAgICAgICV1IiwgZGVwdGgsICIiLCBzaGlmdCk7CisgIEdTVF9MT0cgKCIlKnMgIGxlYXN0IG9mZnNldDogICVkIiwgZGVwdGgsICIiLCBsZWFzdF9vZmZzZXQpOworICBHU1RfTE9HICgiJSpzICBzdGFydCB0aW1lOiAgICAlZCIsIGRlcHRoLCAiIiwgc3RhcnRfdGltZSk7CisgIEdTVF9MT0cgKCIlKnMgIGVuZCB0aW1lOiAgICAgICVkIiwgZGVwdGgsICIiLCBlbmRfdGltZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfY282NCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGd1aW50MzIgdmVyX2ZsYWdzID0gMCwgbnVtX2VudHJpZXMgPSAwLCBpOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZ2ZXJfZmxhZ3MpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZudW1fZW50cmllcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcl9mbGFncyk7CisgIEdTVF9MT0cgKCIlKnMgIG4gZW50cmllczogICAgICVkIiwgZGVwdGgsICIiLCBudW1fZW50cmllcyk7CisKKyAgaWYgKCFxdF9hdG9tX3BhcnNlcl9oYXNfY2h1bmtzIChkYXRhLCBudW1fZW50cmllcywgOCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fZW50cmllczsgaSsrKSB7CisgICAgR1NUX0xPRyAoIiUqcyAgICBjaHVuayBvZmZzZXQ6ICAlIiBHX0dVSU5UNjRfRk9STUFULCBkZXB0aCwgIiIsCisgICAgICAgIEdFVF9VSU5UNjQgKGRhdGEpKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3F0ZGVtdXhfZHVtcF9kY29tIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsIGludCBkZXB0aCkKK3sKKyAgaWYgKCFxdF9hdG9tX3BhcnNlcl9oYXNfcmVtYWluaW5nIChkYXRhLCA0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgR1NUX0xPRyAoIiUqcyAgY29tcHJlc3Npb24gdHlwZTogJSIgR1NUX0ZPVVJDQ19GT1JNQVQsIGRlcHRoLCAiIiwKKyAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoR0VUX0ZPVVJDQyAoZGF0YSkpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfY212ZCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX3JlbWFpbmluZyAoZGF0YSwgNCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIGxlbmd0aDogJWQiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfbWZybyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX3JlbWFpbmluZyAoZGF0YSwgNCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgR1NUX0xPRyAoIiUqcyAgc2l6ZTogJWQiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfbWZoZCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX3JlbWFpbmluZyAoZGF0YSwgNCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgR1NUX0xPRyAoIiUqcyAgc2VxdWVuY2VfbnVtYmVyOiAlZCIsIGRlcHRoLCAiIiwgR0VUX1VJTlQzMiAoZGF0YSkpOworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3F0ZGVtdXhfZHVtcF90ZnJhIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsIGludCBkZXB0aCkKK3sKKyAgZ3VpbnQ2NCB0aW1lID0gMCwgbW9vZl9vZmZzZXQgPSAwOworICBndWludDMyIGxlbiA9IDAsIG51bV9lbnRyaWVzID0gMCwgdmVyX2ZsYWdzID0gMCwgdHJhY2tfaWQgPSAwLCBpOworICBndWludCB2YWx1ZV9zaXplLCB0cmFmX3NpemUsIHRydW5fc2l6ZSwgc2FtcGxlX3NpemU7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJnZlcl9mbGFncykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcl9mbGFncyk7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJnRyYWNrX2lkKSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmbGVuKSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmbnVtX2VudHJpZXMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBHU1RfTE9HICgiJSpzICB0cmFjayBJRDogICAgICAldSIsIGRlcHRoLCAiIiwgdHJhY2tfaWQpOworICBHU1RfTE9HICgiJSpzICBsZW5ndGg6ICAgICAgICAweCV4IiwgZGVwdGgsICIiLCBsZW4pOworICBHU1RfTE9HICgiJSpzICBuIGVudHJpZXM6ICAgICAldSIsIGRlcHRoLCAiIiwgbnVtX2VudHJpZXMpOworCisgIHZhbHVlX3NpemUgPSAoKHZlcl9mbGFncyA+PiAyNCkgPT0gMSkgPyBzaXplb2YgKGd1aW50NjQpIDogc2l6ZW9mIChndWludDMyKTsKKyAgc2FtcGxlX3NpemUgPSAobGVuICYgMykgKyAxOworICB0cnVuX3NpemUgPSAoKGxlbiAmIDEyKSA+PiAyKSArIDE7CisgIHRyYWZfc2l6ZSA9ICgobGVuICYgNDgpID4+IDQpICsgMTsKKworICBpZiAoIXF0X2F0b21fcGFyc2VyX2hhc19jaHVua3MgKGRhdGEsIG51bV9lbnRyaWVzLAorICAgICAgICAgIHZhbHVlX3NpemUgKyB2YWx1ZV9zaXplICsgdHJhZl9zaXplICsgdHJ1bl9zaXplICsgc2FtcGxlX3NpemUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykgeworICAgIHF0X2F0b21fcGFyc2VyX2dldF9vZmZzZXQgKGRhdGEsIHZhbHVlX3NpemUsICZ0aW1lKTsKKyAgICBxdF9hdG9tX3BhcnNlcl9nZXRfb2Zmc2V0IChkYXRhLCB2YWx1ZV9zaXplLCAmbW9vZl9vZmZzZXQpOworICAgIEdTVF9MT0cgKCIlKnMgICAgdGltZTogICAgICAgICAgJSIgR19HVUlOVDY0X0ZPUk1BVCwgZGVwdGgsICIiLCB0aW1lKTsKKyAgICBHU1RfTE9HICgiJSpzICAgIG1vb2Zfb2Zmc2V0OiAgICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgIGRlcHRoLCAiIiwgbW9vZl9vZmZzZXQpOworICAgIEdTVF9MT0cgKCIlKnMgICAgdHJhZl9udW1iZXI6ICAgJXUiLCBkZXB0aCwgIiIsCisgICAgICAgIHF0X2F0b21fcGFyc2VyX2dldF91aW50X3dpdGhfc2l6ZV91bmNoZWNrZWQgKGRhdGEsIHRyYWZfc2l6ZSkpOworICAgIEdTVF9MT0cgKCIlKnMgICAgdHJ1bl9udW1iZXI6ICAgJXUiLCBkZXB0aCwgIiIsCisgICAgICAgIHF0X2F0b21fcGFyc2VyX2dldF91aW50X3dpdGhfc2l6ZV91bmNoZWNrZWQgKGRhdGEsIHRydW5fc2l6ZSkpOworICAgIEdTVF9MT0cgKCIlKnMgICAgc2FtcGxlX251bWJlcjogJXUiLCBkZXB0aCwgIiIsCisgICAgICAgIHF0X2F0b21fcGFyc2VyX2dldF91aW50X3dpdGhfc2l6ZV91bmNoZWNrZWQgKGRhdGEsIHNhbXBsZV9zaXplKSk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3F0ZGVtdXhfZHVtcF90ZmhkIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsIGludCBkZXB0aCkKK3sKKyAgZ3VpbnQzMiBmbGFncyA9IDAsIG4gPSAwLCB0cmFja19pZCA9IDA7CisgIGd1aW50NjQgYmFzZV9kYXRhX29mZnNldCA9IDA7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoZGF0YSwgMSkgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQyNF9iZSAoZGF0YSwgJmZsYWdzKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIEdTVF9MT0cgKCIlKnMgIGZsYWdzOiAlMDh4IiwgZGVwdGgsICIiLCBmbGFncyk7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJnRyYWNrX2lkKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIEdTVF9MT0cgKCIlKnMgIHRyYWNrX2lkOiAldSIsIGRlcHRoLCAiIiwgdHJhY2tfaWQpOworCisgIGlmIChmbGFncyAmIFRGX0JBU0VfREFUQV9PRkZTRVQpIHsKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDY0X2JlIChkYXRhLCAmYmFzZV9kYXRhX29mZnNldCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgR1NUX0xPRyAoIiUqcyAgICBiYXNlLWRhdGEtb2Zmc2V0OiAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICBkZXB0aCwgIiIsIGJhc2VfZGF0YV9vZmZzZXQpOworICB9CisKKyAgaWYgKGZsYWdzICYgVEZfU0FNUExFX0RFU0NSSVBUSU9OX0lOREVYKSB7CisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJm4pKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIEdTVF9MT0cgKCIlKnMgICAgc2FtcGxlLWRlc2NyaXB0aW9uLWluZGV4OiAldSIsIGRlcHRoLCAiIiwgbik7CisgIH0KKworICBpZiAoZmxhZ3MgJiBURl9ERUZBVUxUX1NBTVBMRV9EVVJBVElPTikgeworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZuKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBHU1RfTE9HICgiJSpzICAgIGRlZmF1bHQtc2FtcGxlLWR1cmF0aW9uOiAgJXUiLCBkZXB0aCwgIiIsIG4pOworICB9CisKKyAgaWYgKGZsYWdzICYgVEZfREVGQVVMVF9TQU1QTEVfU0laRSkgeworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZuKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBHU1RfTE9HICgiJSpzICAgIGRlZmF1bHQtc2FtcGxlLXNpemU6ICAldSIsIGRlcHRoLCAiIiwgbik7CisgIH0KKworICBpZiAoZmxhZ3MgJiBURl9ERUZBVUxUX1NBTVBMRV9GTEFHUykgeworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZuKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBHU1RfTE9HICgiJSpzICAgIGRlZmF1bHQtc2FtcGxlLWZsYWdzOiAgJXUiLCBkZXB0aCwgIiIsIG4pOworICB9CisKKyAgR1NUX0xPRyAoIiUqcyAgICBkdXJhdGlvbi1pcy1lbXB0eTogICAgICVzIiwgZGVwdGgsICIiLAorICAgICAgZmxhZ3MgJiBURl9EVVJBVElPTl9JU19FTVBUWSA/ICJ5ZXMiIDogIm5vIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfdHJ1biAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGd1aW50MzIgZmxhZ3MgPSAwLCBzYW1wbGVzX2NvdW50ID0gMCwgZGF0YV9vZmZzZXQgPSAwLCBmaXJzdF9zYW1wbGVfZmxhZ3MgPSAwOworICBndWludDMyIHNhbXBsZV9kdXJhdGlvbiA9IDAsIHNhbXBsZV9zaXplID0gMCwgc2FtcGxlX2ZsYWdzID0KKyAgICAgIDAsIGNvbXBvc2l0aW9uX3RpbWVfb2Zmc2V0cyA9IDA7CisgIGludCBpID0gMDsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwIChkYXRhLCAxKSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDI0X2JlIChkYXRhLCAmZmxhZ3MpKQorICAgIHJldHVybiBGQUxTRTsKKworICBHU1RfTE9HICgiJSpzICBmbGFnczogJTA4eCIsIGRlcHRoLCAiIiwgZmxhZ3MpOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZzYW1wbGVzX2NvdW50KSkKKyAgICByZXR1cm4gRkFMU0U7CisgIEdTVF9MT0cgKCIlKnMgIHNhbXBsZXNfY291bnQ6ICV1IiwgZGVwdGgsICIiLCBzYW1wbGVzX2NvdW50KTsKKworICBpZiAoZmxhZ3MgJiBUUl9EQVRBX09GRlNFVCkgeworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZkYXRhX29mZnNldCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgR1NUX0xPRyAoIiUqcyAgICBkYXRhLW9mZnNldDogJXUiLCBkZXB0aCwgIiIsIGRhdGFfb2Zmc2V0KTsKKyAgfQorCisgIGlmIChmbGFncyAmIFRSX0ZJUlNUX1NBTVBMRV9GTEFHUykgeworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZmaXJzdF9zYW1wbGVfZmxhZ3MpKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIEdTVF9MT0cgKCIlKnMgICAgZmlyc3Qtc2FtcGxlLWZsYWdzOiAldSIsIGRlcHRoLCAiIiwgZmlyc3Rfc2FtcGxlX2ZsYWdzKTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBzYW1wbGVzX2NvdW50OyBpKyspIHsKKyAgICBpZiAoZmxhZ3MgJiBUUl9TQU1QTEVfRFVSQVRJT04pIHsKKyAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZzYW1wbGVfZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBHU1RfVFJBQ0UgKCIlKnMgICAgc2FtcGxlLWR1cmF0aW9uOiAgJXUiLCBkZXB0aCwgIiIsIHNhbXBsZV9kdXJhdGlvbik7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgVFJfU0FNUExFX1NJWkUpIHsKKyAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZzYW1wbGVfc2l6ZSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIEdTVF9UUkFDRSAoIiUqcyAgICBzYW1wbGUtc2l6ZTogICV1IiwgZGVwdGgsICIiLCBzYW1wbGVfc2l6ZSk7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgVFJfU0FNUExFX0ZMQUdTKSB7CisgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmc2FtcGxlX2ZsYWdzKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgR1NUX1RSQUNFICgiJSpzICAgIHNhbXBsZS1mbGFnczogICV1IiwgZGVwdGgsICIiLCBzYW1wbGVfZmxhZ3MpOworICAgIH0KKworICAgIGlmIChmbGFncyAmIFRSX0NPTVBPU0lUSU9OX1RJTUVfT0ZGU0VUUykgeworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJmNvbXBvc2l0aW9uX3RpbWVfb2Zmc2V0cykpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIEdTVF9UUkFDRSAoIiUqcyAgICBjb21wb3NpdGlvbl90aW1lX29mZnNldHM6ICAldSIsIGRlcHRoLCAiIiwKKyAgICAgICAgICBjb21wb3NpdGlvbl90aW1lX29mZnNldHMpOworICAgIH0KKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgorcXRkZW11eF9kdW1wX3RyZXggKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwgaW50IGRlcHRoKQoreworICBpZiAoIXF0X2F0b21fcGFyc2VyX2hhc19yZW1haW5pbmcgKGRhdGEsIDQgKyA0ICsgNCArIDQgKyA0ICsgNCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgR1NUX0xPRyAoIiUqcyAgdHJhY2sgSUQ6ICAgICAgJTA4eCIsIGRlcHRoLCAiIiwgR0VUX1VJTlQzMiAoZGF0YSkpOworICBHU1RfTE9HICgiJSpzICBkZWZhdWx0IHNhbXBsZSBkZXNjLiBpbmRleDogJTA4eCIsIGRlcHRoLCAiIiwKKyAgICAgIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgR1NUX0xPRyAoIiUqcyAgZGVmYXVsdCBzYW1wbGUgZHVyYXRpb246ICAgICUwOHgiLCBkZXB0aCwgIiIsCisgICAgICBHRVRfVUlOVDMyIChkYXRhKSk7CisgIEdTVF9MT0cgKCIlKnMgIGRlZmF1bHQgc2FtcGxlIHNpemU6ICAgICAgICAlMDh4IiwgZGVwdGgsICIiLAorICAgICAgR0VUX1VJTlQzMiAoZGF0YSkpOworICBHU1RfTE9HICgiJSpzICBkZWZhdWx0IHNhbXBsZSBmbGFnczogICAgICAgJTA4eCIsIGRlcHRoLCAiIiwKKyAgICAgIEdFVF9VSU5UMzIgKGRhdGEpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3F0ZGVtdXhfZHVtcF9tZWhkIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsIGludCBkZXB0aCkKK3sKKyAgZ3VpbnQzMiB2ZXJzaW9uID0gMDsKKyAgZ3VpbnQ2NCBmcmFnbWVudF9kdXJhdGlvbjsKKyAgZ3VpbnQgdmFsdWVfc2l6ZTsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmdmVyc2lvbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcnNpb24pOworCisgIHZhbHVlX3NpemUgPSAoKHZlcnNpb24gPj4gMjQpID09IDEpID8gc2l6ZW9mIChndWludDY0KSA6IHNpemVvZiAoZ3VpbnQzMik7CisgIGlmIChxdF9hdG9tX3BhcnNlcl9nZXRfb2Zmc2V0IChkYXRhLCB2YWx1ZV9zaXplLCAmZnJhZ21lbnRfZHVyYXRpb24pKSB7CisgICAgR1NUX0xPRyAoIiUqcyAgZnJhZ21lbnQgZHVyYXRpb246ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgIGRlcHRoLCAiIiwgZnJhZ21lbnRfZHVyYXRpb24pOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitnYm9vbGVhbgorcXRkZW11eF9kdW1wX3RmZHQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwgaW50IGRlcHRoKQoreworICBndWludDMyIHZlcnNpb24gPSAwOworICBndWludDY0IGRlY29kZV90aW1lOworICBndWludCB2YWx1ZV9zaXplOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZ2ZXJzaW9uKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgR1NUX0xPRyAoIiUqcyAgdmVyc2lvbi9mbGFnczogJTA4eCIsIGRlcHRoLCAiIiwgdmVyc2lvbik7CisKKyAgdmFsdWVfc2l6ZSA9ICgodmVyc2lvbiA+PiAyNCkgPT0gMSkgPyBzaXplb2YgKGd1aW50NjQpIDogc2l6ZW9mIChndWludDMyKTsKKyAgaWYgKHF0X2F0b21fcGFyc2VyX2dldF9vZmZzZXQgKGRhdGEsIHZhbHVlX3NpemUsICZkZWNvZGVfdGltZSkpIHsKKyAgICBHU1RfTE9HICgiJSpzICBUcmFjayBmcmFnbWVudCBkZWNvZGUgdGltZTogJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgZGVwdGgsICIiLCBkZWNvZGVfdGltZSk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfc2R0cCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGd1aW50MzIgdmVyc2lvbjsKKyAgZ3VpbnQ4IHZhbDsKKyAgZ3VpbnQgaSA9IDE7CisKKyAgdmVyc2lvbiA9IEdFVF9VSU5UMzIgKGRhdGEpOworICBHU1RfTE9HICgiJSpzICB2ZXJzaW9uL2ZsYWdzOiAlMDh4IiwgZGVwdGgsICIiLCB2ZXJzaW9uKTsKKworICAvKiB0aGUgc2FtcGxlX2NvdW50IGlzIHNwZWNpZmllZCBpbiB0aGUgc3RzeiBvciBzdHoyIGJveC4KKyAgICogdGhlIGluZm9ybWF0aW9uIGZvciBhIHNhbXBsZSBpcyBzdG9yZWQgaW4gYSBzaW5nbGUgYnl0ZSwKKyAgICogc28gd2UgcmVhZCB1bnRpbCB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIGJ5dGVzICovCisgIHdoaWxlIChxdF9hdG9tX3BhcnNlcl9oYXNfcmVtYWluaW5nIChkYXRhLCAxKSkgeworICAgIHZhbCA9IEdFVF9VSU5UOCAoZGF0YSk7CisgICAgR1NUX0xPRyAoIiUqcyAgICAgc2FtcGxlIG51bWJlcjogJWQiLCBkZXB0aCwgIiIsIGkpOworICAgIEdTVF9MT0cgKCIlKnMgICAgIHNhbXBsZV9kZXBlbmRzX29uOiAlZCIsIGRlcHRoLCAiIiwKKyAgICAgICAgKChndWludDE2KSAodmFsKSkgJiAweDMpOworICAgIEdTVF9MT0cgKCIlKnMgICAgIHNhbXBsZV9pc19kZXBlbmRlZF9vbjogJWQiLCBkZXB0aCwgIiIsCisgICAgICAgICgoZ3VpbnQxNikgKHZhbCA+PiAyKSkgJiAweDMpOworICAgIEdTVF9MT0cgKCIlKnMgICAgIHNhbXBsZV9oYXNfcmVkdW5kYW5jeTogJWQiLCBkZXB0aCwgIiIsCisgICAgICAgICgoZ3VpbnQxNikgKHZhbCA+PiA0KSkgJiAweDMpOworICAgIEdTVF9MT0cgKCIlKnMgICAgIGVhcmx5IGRpc3BsYXk6ICVkIiwgZGVwdGgsICIiLAorICAgICAgICAoKGd1aW50MTYpICh2YWwgPj4gNikpICYgMHgxKTsKKyAgICArK2k7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfc3ZtaSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGd1aW50MzIgdmVyc2lvbjsKKyAgZ3VpbnQgc3RlcmVvX21vbm9fY2hhbmdlX2NvdW50OworICBndWludCBpOworCisgIHZlcnNpb24gPSBHRVRfVUlOVDMyIChkYXRhKTsKKyAgR1NUX0xPRyAoIiUqcyAgdmVyc2lvbi9mbGFnczogJTA4eCIsIGRlcHRoLCAiIiwgdmVyc2lvbik7CisKKyAgaWYgKCF2ZXJzaW9uKSB7CisgICAgLyogc3RlcmVvc2NvcGljIHZpc3VhbCB0eXBlIGluZm9ybWF0aW9uICovCisgICAgR1NUX0xPRyAoIiUqcyAgICAgc3RlcmVvX2NvbXBvc2l0aW9uX3R5cGU6ICVkIiwgZGVwdGgsICIiLAorICAgICAgICBHRVRfVUlOVDggKGRhdGEpKTsKKyAgICBHU1RfTE9HICgiJSpzICAgICBpc19sZWZ0X2ZpcnN0OiAlZCIsIGRlcHRoLCAiIiwKKyAgICAgICAgKChndWludDgpIEdFVF9VSU5UOCAoZGF0YSkpICYgMHgwMSk7CisKKyAgICAvKiBzdGVyZW9fbW9ub19jaGFuZ2UgaW5mb3JtYXRpb24gKi8KKyAgICBzdGVyZW9fbW9ub19jaGFuZ2VfY291bnQgPSBHRVRfVUlOVDMyIChkYXRhKTsKKyAgICBHU1RfTE9HICgiJSpzICAgICBzdGVyZW9fbW9ub19jaGFuZ2VfY291bnQ6ICVkIiwgZGVwdGgsICIiLAorICAgICAgICBzdGVyZW9fbW9ub19jaGFuZ2VfY291bnQpOworICAgIGZvciAoaSA9IDE7IGkgPD0gc3RlcmVvX21vbm9fY2hhbmdlX2NvdW50OyBpKyspIHsKKyAgICAgIEdTVF9MT0cgKCIlKnMgICAgIHNhbXBsZV9jb3VudDogJWQiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgICAgIEdTVF9MT0cgKCIlKnMgICAgIHN0ZXJlb19mbGFnOiAlZCIsIGRlcHRoLCAiIiwKKyAgICAgICAgICAoKGd1aW50OCkgR0VUX1VJTlQ4IChkYXRhKSkgJiAweDAxKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfZGZMYSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGNvbnN0IGdjaGFyICpibG9ja190eXBlc1tdID0geworICAgICJTVFJFQU1JTkZPIiwgIlBBRERJTkciLCAiQVBQTElDQVRJT04iLCAiU0VFS1RBQkxFIiwgIlZPUkJJU19DT01NRU5UIiwKKyAgICAiQ1VFU0hFRVQiLCAiUElDVFVSRSIsICJVTktOT1dOIiwgIklOVkFMSUQiCisgIH07CisKKyAgZ3VpbnQzMiB2ZXJfZmxhZ3MsIGJsb2NrX2hlYWRlciwgYmxvY2tfc2l6ZTsKKyAgZ2ludDggYmxvY2tfdHlwZTsKKyAgZ2Jvb2xlYW4gaXNMYXN0ID0gRkFMU0U7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJnZlcl9mbGFncykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcl9mbGFncyk7CisKKyAgZG8geworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZibG9ja19oZWFkZXIpKQorICAgICAgYnJlYWs7CisKKyAgICBpc0xhc3QgPSAoYmxvY2tfaGVhZGVyID4+IDMxKSAmIDE7CisgICAgYmxvY2tfdHlwZSA9IChibG9ja19oZWFkZXIgPj4gMjQpICYgMHg3RjsKKyAgICBibG9ja19zaXplID0gYmxvY2tfaGVhZGVyICYgMHhGRkZGRkY7CisKKyAgICBpZiAoYmxvY2tfdHlwZSA9PSAxMjcpCisgICAgICBibG9ja190eXBlID0gODsKKyAgICBlbHNlIGlmIChibG9ja190eXBlID4gNikKKyAgICAgIGJsb2NrX3R5cGUgPSA3OworCisgICAgR1NUX0xPRyAoIiUqcyAgYmxvY2tfdHlwZTogICAgICAlcyIsIGRlcHRoLCAiIiwgYmxvY2tfdHlwZXNbYmxvY2tfdHlwZV0pOworICAgIEdTVF9MT0cgKCIlKnMgIGxhc3QtYmxvY2stZmxhZzogJXMiLCBkZXB0aCwgIiIsIGlzTGFzdCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgIEdTVF9MT0cgKCIlKnMgIGxlbmd0aDogICAgICAgICAgJWQiLCBkZXB0aCwgIiIsIGJsb2NrX3NpemUpOworCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoZGF0YSwgYmxvY2tfc2l6ZSkpCisgICAgICBicmVhazsKKyAgfSB3aGlsZSAoIWlzTGFzdCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfZkxhQyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGd1aW50MTYgZGF0YV9yZWZfaWQsIG5fY2hhbm5lbHMsIHNhbXBsZV9zaXplOworICBndWludDMyIHNhbXBsZV9yYXRlOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKGRhdGEsIDYpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfYmUgKGRhdGEsICZkYXRhX3JlZl9pZCkgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoZGF0YSwgOCkgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9iZSAoZGF0YSwgJm5fY2hhbm5lbHMpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfYmUgKGRhdGEsICZzYW1wbGVfc2l6ZSkgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoZGF0YSwgNCkgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJnNhbXBsZV9yYXRlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgR1NUX0xPRyAoIiUqcyAgZGF0YSByZWZlcmVuY2U6ICVkIiwgZGVwdGgsICIiLCBkYXRhX3JlZl9pZCk7CisgIEdTVF9MT0cgKCIlKnMgIGNoYW5uZWwgY291bnQ6ICAlZCIsIGRlcHRoLCAiIiwgbl9jaGFubmVscyk7CisgIEdTVF9MT0cgKCIlKnMgIHNhbXBsZSBzaXplOiAgICAlZCIsIGRlcHRoLCAiIiwgc2FtcGxlX3NpemUpOworICBHU1RfTE9HICgiJSpzICBzYW1wbGUgcmF0ZTogICAgJWQiLCBkZXB0aCwgIiIsIChzYW1wbGVfcmF0ZSA+PiAxNikpOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgorcXRkZW11eF9kdW1wX2dtaW4gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwgaW50IGRlcHRoKQoreworICBndWludDMyIHZlcl9mbGFnczsKKyAgZ3VpbnQxNiBncmFwaGljc19tb2RlLCBvcGNfciwgb3BjX2csIG9wY19iLCBiYWxhbmNlOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZ2ZXJfZmxhZ3MpKQorICAgIHJldHVybiBGQUxTRTsKKworICBHU1RfTE9HICgiJSpzICB2ZXJzaW9uL2ZsYWdzIDogJTA4eCIsIGRlcHRoLCAiIiwgdmVyX2ZsYWdzKTsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9iZSAoZGF0YSwgJmdyYXBoaWNzX21vZGUpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfYmUgKGRhdGEsICZvcGNfcikgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9iZSAoZGF0YSwgJm9wY19nKSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2JlIChkYXRhLCAmb3BjX2IpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfYmUgKGRhdGEsICZiYWxhbmNlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgR1NUX0xPRyAoIiUqcyAgZ3JhcGhpY3MgbW9kZSA6IDB4JXgiLCBkZXB0aCwgIiIsIGdyYXBoaWNzX21vZGUpOworICBHU1RfTE9HICgiJSpzICBvcGNvbG9yIDogICAgICAgcjoweCV4IGc6MHgleCBiOjB4JXgiLCBkZXB0aCwgIiIsIG9wY19yLCBvcGNfZywKKyAgICAgIG9wY19iKTsKKyAgR1NUX0xPRyAoIiUqcyAgYmFsYW5jZSA6ICAgICAgICVkIiwgZGVwdGgsICIiLCBiYWxhbmNlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3F0ZGVtdXhfZHVtcF91bmtub3duIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsIGludCBkZXB0aCkKK3sKKyAgaW50IGxlbjsKKworICBsZW4gPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3JlbWFpbmluZyAoZGF0YSk7CisgIEdTVF9MT0cgKCIlKnMgIGxlbmd0aDogJWQiLCBkZXB0aCwgIiIsIGxlbik7CisKKyAgR1NUX01FTURVTVBfT0JKRUNUIChxdGRlbXV4LCAidW5rbm93biBhdG9tIGRhdGEiLAorICAgICAgZ3N0X2J5dGVfcmVhZGVyX3BlZWtfZGF0YV91bmNoZWNrZWQgKGRhdGEpLCBsZW4pOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X25vZGVfZHVtcF9mb3JlYWNoIChHTm9kZSAqIG5vZGUsIGdwb2ludGVyIHF0ZGVtdXgpCit7CisgIEdzdEJ5dGVSZWFkZXIgcGFyc2VyOworICBndWludDggKmJ1ZmZlciA9IChndWludDggKikgbm9kZS0+ZGF0YTsgICAgICAgLyogRklYTUU6IG1vdmUgdG8gYnl0ZSByZWFkZXIgKi8KKyAgZ3VpbnQzMiBub2RlX2xlbmd0aDsKKyAgZ3VpbnQzMiBmb3VyY2M7CisgIGNvbnN0IFF0Tm9kZVR5cGUgKnR5cGU7CisgIGludCBkZXB0aDsKKworICBub2RlX2xlbmd0aCA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoYnVmZmVyKTsKKyAgZm91cmNjID0gR1NUX1JFQURfVUlOVDMyX0xFIChidWZmZXIgKyA0KTsKKworICBnX3dhcm5faWZfZmFpbCAobm9kZV9sZW5ndGggPj0gOCk7CisKKyAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZwYXJzZXIsIGJ1ZmZlciArIDgsIG5vZGVfbGVuZ3RoIC0gOCk7CisKKyAgdHlwZSA9IHF0ZGVtdXhfdHlwZV9nZXQgKGZvdXJjYyk7CisKKyAgZGVwdGggPSAoZ19ub2RlX2RlcHRoIChub2RlKSAtIDEpICogMjsKKyAgR1NUX0xPRyAoIiUqcyclIiBHU1RfRk9VUkNDX0ZPUk1BVCAiJywgWyVkXSwgJXMiLAorICAgICAgZGVwdGgsICIiLCBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYyksIG5vZGVfbGVuZ3RoLCB0eXBlLT5uYW1lKTsKKworICBpZiAodHlwZS0+ZHVtcCkgeworICAgIGdib29sZWFuIHJldDsKKworICAgIHJldCA9IHR5cGUtPmR1bXAgKEdTVF9RVERFTVVYX0NBU1QgKHF0ZGVtdXgpLCAmcGFyc2VyLCBkZXB0aCk7CisKKyAgICBpZiAoIXJldCkgeworICAgICAgR1NUX1dBUk5JTkcgKCIlKnMgIG5vdCBlbm91Z2ggZGF0YSBwYXJzaW5nIGF0b20gJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgZGVwdGgsICIiLCBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYykpOworICAgIH0KKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworZ2Jvb2xlYW4KK3F0ZGVtdXhfbm9kZV9kdW1wIChHc3RRVERlbXV4ICogcXRkZW11eCwgR05vZGUgKiBub2RlKQoreworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgLyogT25seSB0cmF2ZXJzZS9kdW1wIGlmIHdlIGtub3cgaXQgd2lsbCBiZSBvdXRwdXR0ZWQgaW4gdGhlIGVuZCAqLworICBpZiAocXRkZW11eF9kZWJ1Zy0+dGhyZXNob2xkIDwgR1NUX0xFVkVMX0xPRykKKyAgICByZXR1cm4gVFJVRTsKKworICBnX25vZGVfdHJhdmVyc2UgKG5vZGUsIEdfUFJFX09SREVSLCBHX1RSQVZFUlNFX0FMTCwgLTEsCisgICAgICBxdGRlbXV4X25vZGVfZHVtcF9mb3JlYWNoLCBxdGRlbXV4KTsKKyNlbmRpZgorICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvcXRkZW11eF9kdW1wLmggYi9nc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZGNkM2YKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5oCkBAIC0wLDAgKzEsOTggQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFNURXJpY3Nzb24gPGJlbmphbWluLmdhaWduYXJkQHN0ZXJpY3Nzb24uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUVRERU1VWF9EVU1QX0hfXworI2RlZmluZSBfX0dTVF9RVERFTVVYX0RVTVBfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8cXRkZW11eC5oPgorCitHX0JFR0lOX0RFQ0xTCisgICAgZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX212aGQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3RraGQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX2Vsc3QgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX21kaGQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX2hkbHIgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3ZtaGQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX2RyZWYgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3N0c2QgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3N0dHMgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3N0c3MgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3N0cHMgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3N0c2MgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3N0c3ogKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3N0Y28gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX2NvNjQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX2Rjb20gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX2NtdmQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX2N0dHMgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX2NzbGcgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX21mcm8gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX21maGQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3RmcmEgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3RmaGQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3RydW4gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3RyZXggKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX21laGQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3NkdHAgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3RmZHQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3Vua25vd24gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3N2bWkgKEdzdFFURGVtdXggKnF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKmRhdGEsCisgICAgaW50IGRlcHRoKTsKK2dib29sZWFuIHF0ZGVtdXhfZHVtcF9kZkxhIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsCisgICAgaW50IGRlcHRoKTsKK2dib29sZWFuIHF0ZGVtdXhfZHVtcF9mTGFDIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsCisgICAgaW50IGRlcHRoKTsKK2dib29sZWFuIHF0ZGVtdXhfZHVtcF9nbWluIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsCisgICAgaW50IGRlcHRoKTsKKworZ2Jvb2xlYW4gcXRkZW11eF9ub2RlX2R1bXAgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHTm9kZSAqIG5vZGUpOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1FUREVNVVhfRFVNUF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvcXRkZW11eF9sYW5nLmMgYi9nc3QvaXNvbXA0L3F0ZGVtdXhfbGFuZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NjQ2YjIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L3F0ZGVtdXhfbGFuZy5jCkBAIC0wLDAgKzEsMjA3IEBACisvKiBHU3RyZWFtZXIgUXVpY2t0aW1lL0lTTyBkZW11eGVyIGxhbmd1YWdlIHV0aWxpdHkgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAicXRkZW11eF9kZWJ1Zy5oIgorI2luY2x1ZGUgInF0ZGVtdXhfbGFuZy5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHF0ZGVtdXhfZGVidWcKKworLyogaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vbWFjL2xpYnJhcnkvZG9jdW1lbnRhdGlvbi9RdWlja1RpbWUvUVRGRi9RVEZGQ2hhcDQvcXRmZjQuaHRtbCAqLworCitzdGF0aWMgY29uc3QgZ2NoYXIgcXRfbGFuZ19tYXBbXVs0XSA9IHsKKworLyogMDAwIEVuZ2xpc2gKKyAqIDAwMSBGcmVuY2gKKyAqIDAwMiBHZXJtYW4KKyAqIDAwMyBJdGFsaWFuCisgKiAwMDQgRHV0Y2gKKyAqIDAwNSBTd2VkaXNoCisgKiAwMDYgU3BhbmlzaAorICogMDA3IERhbmlzaAorICogMDA4IFBvcnR1Z3Vlc2UKKyAqIDAwOSBOb3J3ZWdpYW4KKyAqLworICAiZW5nIiwgImZyZSIsICJkZXUiLCAiaXRhIiwgIm5sZCIsICJzd2UiLCAic3BhIiwgImRhbiIsICJwb3IiLCAibm9yIiwKKworLyogMDEwIEhlYnJldworICogMDExIEphcGFuZXNlCisgKiAwMTIgQXJhYmljCisgKiAwMTMgRmlubmlzaAorICogMDE0IEdyZWVrCisgKiAwMTUgSWNlbGFuZGljCisgKiAwMTYgTWFsdGVzZQorICogMDE3IFR1cmtpc2gKKyAqIDAxOCBDcm9hdGlhbgorICogMDE5IFRyYWRpdGlvbmFsIENoaW5lc2UgKElTTyA2MzktMiBjYW4ndCBleHByZXNzIHNjcmlwdCBkaWZmZXJlbmNlcywgc28gemhvKQorICovCisgICJoZWIiLCAianBuIiwgImFyYSIsICJmaW4iLCAiZWxsIiwgImlzbCIsICJtbHQiLCAidHVyIiwgImhydiIsICJ6aG8iLAorCisvKiAwMjAgVXJkdQorICogMDIxIEhpbmRpCisgKiAwMjIgVGhhaQorICogMDIzIEtvcmVhbgorICogMDI0IExpdGh1YW5pYW4KKyAqIDAyNSBQb2xpc2gKKyAqIDAyNiBIdW5nYXJpYW4KKyAqIDAyNyBFc3RvbmlhbgorICogMDI4IExhdHZpYW4gLyBMZXR0aXNoCisgKiAwMjkgTGFwcGlzaCAvIFNhYW1pc2ggKHVzZWQgY29kZSBmb3IgTm90aGVybiBTYW1pKQorICovCisgICJ1cmQiLCAiaGluIiwgInRoYSIsICJrb3IiLCAibGl0IiwgInBvbCIsICJodW4iLCAiZXN0IiwgImxhdiIsICJzbWUiLAorCisvKiAwMzAgRmFlcm9lc2UKKyAqIDAzMSBGYXJzaQorICogMDMyIFJ1c3NpYW4KKyAqIDAzMyBTaW1wbGlmaWVkIENoaW5lc2UgKElTTyA2MzktMiBjYW4ndCBleHByZXNzIHNjcmlwdCBkaWZmZXJlbmNlcywgc28gemhvKQorICogMDM0IEZsZW1pc2ggKG5vIElTTyA2MzktMiBjb2RlLCB1c2VkIER1dGNoIGNvZGUpCisgKiAwMzUgSXJpc2gKKyAqIDAzNiBBbGJhbmlhbgorICogMDM3IFJvbWFuaWFuCisgKiAwMzggQ3plY2gKKyAqIDAzOSBTbG92YWsKKyAqLworICAiZmFvIiwgImZhcyIsICJydXMiLCAiemhvIiwgIm5sZCIsICJnbGUiLCAic3FpIiwgInJvbiIsICJjZXMiLCAic2xrIiwKKworLyogMDQwIFNsb3ZlbmlhbgorICogMDQxIFlpZGRpc2gKKyAqIDA0MiBTZXJiaWFuCisgKiAwNDMgTWFjZWRvbmlhbgorICogMDQ0IEJ1bGdhcmlhbgorICogMDQ1IFVrcmFpbmlhbgorICogMDQ2IEJ5ZWxvcnVzc2lhbgorICogMDQ3IFV6YmVrCisgKiAwNDggS2F6YWtoCisgKiAwNDkgQXplcmJhaWphbmkKKyAqLworICAic2x2IiwgInlpZCIsICJzcnAiLCAibWtkIiwgImJ1bCIsICJ1a3IiLCAiYmVsIiwgInV6YiIsICJrYXoiLCAiYXplIiwKKworLyogMDUwIEF6ZXJiYWlqYW5BciAocHJlc3VtYWJseSBzY3JpcHQgZGlmZmVyZW5jZT8gdXNlZCBhemUgaGVyZSkKKyAqIDA1MSBBcm1lbmlhbgorICogMDUyIEdlb3JnaWFuCisgKiAwNTMgTW9sZGF2aWFuCisgKiAwNTQgS2lyZ2hpegorICogMDU1IFRhamlraQorICogMDU2IFR1cmttZW4KKyAqIDA1NyBNb25nb2xpYW4KKyAqIDA1OCBNb25nb2xpYW5DeXIgKHByZXN1bWFibHkgc2NyaXB0IGRpZmZlcmVuY2U/IHVzZWQgbW9uIGhlcmUpCisgKiAwNTkgUGFzaHRvCisgKi8KKworICAiYXplIiwgImh5ZSIsICJrYXQiLCAibW9sIiwgImtpciIsICJ0Z2siLCAidHVrIiwgIm1vbiIsICJtb24iLCAicHVzIiwKKworCisvKiAwNjAgS3VyZGlzaAorICogMDYxIEthc2htaXJpCisgKiAwNjIgU2luZGhpCisgKiAwNjMgVGliZXRhbgorICogMDY0IE5lcGFsaQorICogMDY1IFNhbnNrcml0CisgKiAwNjYgTWFyYXRoaQorICogMDY3IEJlbmdhbGkKKyAqIDA2OCBBc3NhbWVzZQorICogMDY5IEd1amFyYXRpCisgKi8KKyAgImt1ciIsICJrYXMiLCAic25kIiwgImJvZCIsICJuZXAiLCAic2FuIiwgIm1hciIsICJiZW4iLCAiYXNtIiwgImd1aiIsCisKKy8qIDA3MCBQdW5qYWJpCisgKiAwNzEgT3JpeWEKKyAqIDA3MiBNYWxheWFsYW0KKyAqIDA3MyBLYW5uYWRhCisgKiAwNzQgVGFtaWwKKyAqIDA3NSBUZWx1Z3UKKyAqIDA3NiBTaW5oYWxlc2UKKyAqIDA3NyBCdXJtZXNlCisgKiAwNzggS2htZXIKKyAqIDA3OSBMYW8KKyAqLworICAicGFuIiwgIm9yaSIsICJtYWwiLCAia2FuIiwgInRhbSIsICJ0ZWwiLCAic2luIiwgIm15YSIsICJraG0iLCAibGFvIiwKKworLyogMDgwIFZpZXRuYW1lc2UKKyAqIDA4MSBJbmRvbmVzaWFuCisgKiAwODIgVGFnYWxvZworICogMDgzIE1hbGF5Um9tYW4KKyAqIDA4NCBNYWxheUFyYWJpYworICogMDg1IEFtaGFyaWMKKyAqIDA4NyBHYWxsYSAoc2FtZSBhcyBPcm9tbz8pCisgKiAwODcgT3JvbW8KKyAqIDA4OCBTb21hbGkKKyAqIDA4OSBTd2FoaWxpCisgKi8KKyAgInZpZSIsICJpbmQiLCAidGdsIiwgIm1zYSIsICJtc2EiLCAiYW1oIiwgIm9ybSIsICJvcm0iLCAic29tIiwgInN3YSIsCisKKy8qIDA5MCBSdWFuZGEKKyAqIDA5MSBSdW5kaQorICogMDkyIENoZXdhCisgKiAwOTMgTWFsYWdhc3kKKyAqIDA5NCBFc3BlcmFudG8KKyAqIDA5NSAtLS0KKyAqIDA5NiAtLS0KKyAqIDA5NyAtLS0KKyAqIDA5OCAtLS0KKyAqIDA5OSAtLS0KKyAqLworICAia2luIiwgInJ1biIsICJueWEiLCAibWxnIiwgImVwIiwgInVuZCIsICJ1bmQiLCAidW5kIiwgInVuZCIsICJ1bmQiLAorCisvKiAxMDAtMTA5IC0tLQorICogMTEwLTExOSAtLS0KKyAqLworICAidW5kIiwgInVuZCIsICJ1bmQiLCAidW5kIiwgInVuZCIsICJ1bmQiLCAidW5kIiwgInVuZCIsICJ1bmQiLCAidW5kIiwKKyAgInVuZCIsICJ1bmQiLCAidW5kIiwgInVuZCIsICJ1bmQiLCAidW5kIiwgInVuZCIsICJ1bmQiLCAidW5kIiwgInVuZCIsCisKKy8qIDEyMC0xMjcgLS0tCisgKiAxMjggV2Vsc2gKKyAqIDEyOSBCYXNxdWUKKyAqLworICAidW5kIiwgInVuZCIsICJ1bmQiLCAidW5kIiwgInVuZCIsICJ1bmQiLCAidW5kIiwgInVuZCIsICJjeW0iLCAiZXVzIiwKKworLyogMTMwIENhdGFsYW4KKyAqIDEzMSBMYXRpbgorICogMTMyIFF1ZWNodWEKKyAqIDEzMyBHdWFyYW5pCisgKiAxMzQgQXltYXJhCisgKiAxMzUgVGF0YXIKKyAqIDEzNiBVaWdodXIKKyAqIDEzNyBEem9uZ2toYQorICogMTM4IEphdmFuZXNlUm9tCisgKi8KKyAgImNhdCIsICJsYXQiLCAicXVlIiwgImdybiIsICJheW0iLCAidGF0IiwgInVpZyIsICJkem8iLCAiamF2IgorfTsKKworLyogbWFwIHF1aWNrdGltZSBsYW5ndWFnZSBjb2RlIHRvIElTTy02MzktMlQgaWQsIHJldHVybnMgInVuZCIgaWYgdW5rbm93biAqLwordm9pZAorcXRkZW11eF9sYW5nX21hcF9xdF9jb2RlX3RvX2lzbyAoZ2NoYXIgaWRbNF0sIGd1aW50MTYgcXRfbGFuZ19jb2RlKQoreworICBjb25zdCBnY2hhciAqaXNvX2NvZGU7CisKKyAgZ19hc3NlcnQgKHF0X2xhbmdfY29kZSA8IDB4NDAwKTsKKworICBpZiAocXRfbGFuZ19jb2RlIDwgR19OX0VMRU1FTlRTIChxdF9sYW5nX21hcCkpCisgICAgaXNvX2NvZGUgPSBxdF9sYW5nX21hcFtxdF9sYW5nX2NvZGVdOworICBlbHNlCisgICAgaXNvX2NvZGUgPSAidW5kIjsKKworICBHU1RfREVCVUcgKCJtYXBwZWQgcXVpY2t0aW1lIGxhbmd1YWdlIGNvZGUgJXUgdG8gSVNPIDYzOS0yVCBjb2RlICclcyciLAorICAgICAgcXRfbGFuZ19jb2RlLCBpc29fY29kZSk7CisKKyAgbWVtY3B5IChpZCwgaXNvX2NvZGUsIDQpOworCisgIGdfYXNzZXJ0IChpZFszXSA9PSAnXDAnKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvcXRkZW11eF9sYW5nLmggYi9nc3QvaXNvbXA0L3F0ZGVtdXhfbGFuZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwN2M1ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L3F0ZGVtdXhfbGFuZy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qIEdTdHJlYW1lciBRdWlja3RpbWUvSVNPIGRlbXV4ZXIgbGFuZ3VhZ2UgdXRpbGl0eSBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUVRERU1VWF9MQU5HX0hfXworI2RlZmluZSBfX0dTVF9RVERFTVVYX0xBTkdfSF9fCisKK0dfQkVHSU5fREVDTFMKKworI2luY2x1ZGUgPGdsaWIuaD4KKwordm9pZCBxdGRlbXV4X2xhbmdfbWFwX3F0X2NvZGVfdG9faXNvIChnY2hhciBpZFs0XSwgZ3VpbnQxNiBxdF9sYW5nX2NvZGUpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUVRERU1VWF9MQU5HX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmMgYi9nc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGRiOGMyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmMKQEAgLTAsMCArMSwyMzYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAicXRkZW11eF9kZWJ1Zy5oIgorI2luY2x1ZGUgInF0ZGVtdXhfdHlwZXMuaCIKKyNpbmNsdWRlICJxdGRlbXV4X2R1bXAuaCIKKyNpbmNsdWRlICJmb3VyY2MuaCIKKworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgcXRkZW11eF9kZWJ1ZworCitzdGF0aWMgY29uc3QgUXROb2RlVHlwZSBxdF9ub2RlX3R5cGVzW10gPSB7CisgIHtGT1VSQ0NfbW9vdiwgIm1vdmllIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19tdmhkLCAibW92aWUgaGVhZGVyIiwgMCwKKyAgICAgIHF0ZGVtdXhfZHVtcF9tdmhkfSwKKyAge0ZPVVJDQ19jbGlwLCAiY2xpcHBpbmciLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX3RyYWssICJ0cmFjayIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfdWR0YSwgInVzZXIgZGF0YSIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sICAgICAgIC8qIHNwZWNpYWwgY29udGFpbmVyICovCisgIHtGT1VSQ0NfY3RhYiwgImNvbG9yIHRhYmxlIiwgMCx9LAorICB7Rk9VUkNDX3RraGQsICJ0cmFjayBoZWFkZXIiLCAwLAorICAgICAgcXRkZW11eF9kdW1wX3RraGR9LAorICB7Rk9VUkNDX2NyZ24sICJjbGlwcGluZyByZWdpb24iLCAwLH0sCisgIHtGT1VSQ0NfbWF0dCwgInRyYWNrIG1hdHRlIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19rbWF0LCAiY29tcHJlc3NlZCBtYXR0ZSIsIDAsfSwKKyAge0ZPVVJDQ19lZHRzLCAiZWRpdCIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfZWxzdCwgImVkaXQgbGlzdCIsIDAsCisgICAgICBxdGRlbXV4X2R1bXBfZWxzdH0sCisgIHtGT1VSQ0NfbG9hZCwgInRyYWNrIGxvYWQgc2V0dGluZ3MiLCAwLH0sCisgIHtGT1VSQ0NfdHJlZiwgInRyYWNrIHJlZmVyZW5jZSIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfaW1hcCwgInRyYWNrIGlucHV0IG1hcCIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfX19pbiwgInRyYWNrIGlucHV0IiwgMCx9LCAgICAgLyogc3BlY2lhbCBjb250YWluZXIgKi8KKyAge0ZPVVJDQ19fX3R5LCAiaW5wdXQgdHlwZSIsIDAsfSwKKyAge0ZPVVJDQ19tZGlhLCAibWVkaWEiLCBRVF9GTEFHX0NPTlRBSU5FUn0sCisgIHtGT1VSQ0NfbWRoZCwgIm1lZGlhIGhlYWRlciIsIDAsCisgICAgICBxdGRlbXV4X2R1bXBfbWRoZH0sCisgIHtGT1VSQ0NfaGRsciwgImhhbmRsZXIgcmVmZXJlbmNlIiwgMCwKKyAgICAgIHF0ZGVtdXhfZHVtcF9oZGxyfSwKKyAge0ZPVVJDQ19taW5mLCAibWVkaWEgaW5mb3JtYXRpb24iLCBRVF9GTEFHX0NPTlRBSU5FUn0sCisgIHtGT1VSQ0Nfdm1oZCwgInZpZGVvIG1lZGlhIGluZm9ybWF0aW9uIiwgMCwKKyAgICAgIHF0ZGVtdXhfZHVtcF92bWhkfSwKKyAge0ZPVVJDQ19zbWhkLCAic291bmQgbWVkaWEgaW5mb3JtYXRpb24iLCAwfSwKKyAge0ZPVVJDQ19nbWhkLCAiYmFzZSBtZWRpYSBpbmZvcm1hdGlvbiBoZWFkZXIiLCBRVF9GTEFHX0NPTlRBSU5FUn0sCisgIHtGT1VSQ0NfZ21pbiwgImJhc2UgbWVkaWEgaW5mbyIsIDAsIHF0ZGVtdXhfZHVtcF9nbWlufSwKKyAge0ZPVVJDQ19kaW5mLCAiZGF0YSBpbmZvcm1hdGlvbiIsIFFUX0ZMQUdfQ09OVEFJTkVSfSwKKyAge0ZPVVJDQ19kcmVmLCAiZGF0YSByZWZlcmVuY2UiLCAwLAorICAgICAgcXRkZW11eF9kdW1wX2RyZWZ9LAorICB7Rk9VUkNDX3N0YmwsICJzYW1wbGUgdGFibGUiLCBRVF9GTEFHX0NPTlRBSU5FUn0sCisgIHtGT1VSQ0Nfc3RzZCwgInNhbXBsZSBkZXNjcmlwdGlvbiIsIDAsCisgICAgICBxdGRlbXV4X2R1bXBfc3RzZH0sCisgIHtGT1VSQ0Nfc3R0cywgInRpbWUtdG8tc2FtcGxlIiwgMCwKKyAgICAgIHF0ZGVtdXhfZHVtcF9zdHRzfSwKKyAge0ZPVVJDQ19zdHBzLCAicGFydGlhbCBzeW5jIHNhbXBsZSIsIDAsCisgICAgICBxdGRlbXV4X2R1bXBfc3Rwc30sCisgIHtGT1VSQ0Nfc3RzcywgInN5bmMgc2FtcGxlIiwgMCwKKyAgICAgIHF0ZGVtdXhfZHVtcF9zdHNzfSwKKyAge0ZPVVJDQ19zdHNjLCAic2FtcGxlLXRvLWNodW5rIiwgMCwKKyAgICAgIHF0ZGVtdXhfZHVtcF9zdHNjfSwKKyAge0ZPVVJDQ19zdHN6LCAic2FtcGxlIHNpemUiLCAwLAorICAgICAgcXRkZW11eF9kdW1wX3N0c3p9LAorICB7Rk9VUkNDX3N0Y28sICJjaHVuayBvZmZzZXQiLCAwLAorICAgICAgcXRkZW11eF9kdW1wX3N0Y299LAorICB7Rk9VUkNDX2NvNjQsICI2NC1iaXQgY2h1bmsgb2Zmc2V0IiwgMCwKKyAgICAgIHF0ZGVtdXhfZHVtcF9jbzY0fSwKKyAge0ZPVVJDQ192aWRlLCAidmlkZW8gbWVkaWEiLCAwfSwKKyAge0ZPVVJDQ19jbW92LCAiY29tcHJlc3NlZCBtb3ZpZSIsIFFUX0ZMQUdfQ09OVEFJTkVSfSwKKyAge0ZPVVJDQ19kY29tLCAiY29tcHJlc3NlZCBkYXRhIiwgMCwgcXRkZW11eF9kdW1wX2Rjb219LAorICB7Rk9VUkNDX2NtdmQsICJjb21wcmVzc2VkIG1vdmllIGRhdGEiLCAwLCBxdGRlbXV4X2R1bXBfY212ZH0sCisgIHtGT1VSQ0NfaGludCwgImhpbnQiLCAwLH0sCisgIHtGT1VSQ0NfbXA0YSwgIm1wNGEiLCAwLH0sCisgIHtGT1VSQ0NfbXA0diwgIm1wNHYiLCAwLH0sCisgIHtGT1VSQ0NfbWpwMiwgIm1qcDIiLCAwLH0sCisgIHtGT1VSQ0NfbWhkciwgIm1oZHIiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX2pwMmgsICJqcDJoIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19jb2xyLCAiY29sciIsIDAsfSwKKyAge0ZPVVJDQ19jbGFwLCAiY2xhcCIsIDAsfSwKKyAge0ZPVVJDQ190YXB0LCAidGFwdCIsIDAsfSwKKyAge0ZPVVJDQ19paGRyLCAiaWhkciIsIDAsfSwKKyAge0ZPVVJDQ19maWVsLCAiZmllbCIsIDAsfSwKKyAge0ZPVVJDQ19qcDJ4LCAianAyeCIsIDAsfSwKKyAge0ZPVVJDQ19hbGFjLCAiYWxhYyIsIDAsfSwKKyAge0ZPVVJDQ19mTGFDLCAiZkxhQyIsIDAsIHF0ZGVtdXhfZHVtcF9mTGFDfSwKKyAge0ZPVVJDQ19kZkxhLCAiZGZMYSIsIDAsIHF0ZGVtdXhfZHVtcF9kZkxhfSwKKyAge0ZPVVJDQ193YXZlLCAid2F2ZSIsIFFUX0ZMQUdfQ09OVEFJTkVSfSwKKyAge0ZPVVJDQ19hcHBsLCAiYXBwbCIsIFFUX0ZMQUdfQ09OVEFJTkVSfSwKKyAge0ZPVVJDQ19jZmhkLCAiY2ZoZCIsIFFUX0ZMQUdfQ09OVEFJTkVSfSwKKyAge0ZPVVJDQ19lc2RzLCAiZXNkcyIsIDB9LAorICB7Rk9VUkNDX2hudGksICJobnRpIiwgUVRfRkxBR19DT05UQUlORVJ9LAorICB7Rk9VUkNDX3J0cF8sICJydHAgIiwgMCwgcXRkZW11eF9kdW1wX3Vua25vd259LAorICB7Rk9VUkNDX3NkcF8sICJzZHAgIiwgMCwgcXRkZW11eF9kdW1wX3Vua25vd259LAorICB7Rk9VUkNDX21ldGEsICJtZXRhIiwgMCwgcXRkZW11eF9kdW1wX3Vua25vd259LAorICB7Rk9VUkNDX2lsc3QsICJpbHN0IiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19fbmFtLCAiTmFtZSIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfdGl0bCwgIlRpdGxlIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19fQVJULCAiQXJ0aXN0IiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19hQVJULCAiQWxidW0gQXJ0aXN0IiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19hdXRoLCAiQXV0aG9yIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19wZXJmLCAiUGVyZm9ybWVyIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19fd3J0LCAiV3JpdGVyIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19fZ3JwLCAiR3JvdXBpbmciLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX19hbGIsICJBbGJ1bSIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfYWxibSwgIkFsYnVtIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19fZGF5LCAiRGF0ZSIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfX2NweSwgIkNvcHlyaWdodCIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfX2NtdCwgIkNvbW1lbnQiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX19kZXMsICJEZXNjcmlwdGlvbiIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfZGVzYywgIkRlc2NyaXB0aW9uIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19kc2NwLCAiRGVzY3JpcHRpb24iLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX19seXIsICJMeXJpY3MiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX19yZXEsICJSZXF1aXJlbWVudCIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfX2VuYywgIkVuY29kZXIiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX2ducmUsICJHZW5yZSIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfdHJrbiwgIlRyYWNrIE51bWJlciIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfZGlzYywgIkRpc2MgTnVtYmVyIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19kaXNrLCAiRGlzYyBOdW1iZXIiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX2NwcnQsICJDb3B5cmlnaHQiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX2NwaWwsICJDb21waWxhdGlvbiIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfcGdhcCwgIkdhcGxlc3MiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX3Bjc3QsICJQb2RjYXN0IiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ190bXBvLCAiVGVtcG8iLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX2NvdnIsICJDb3ZlciIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0Nfc29ubSwgIlNvcnQgVGl0bGUiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX3NvYWwsICJTb3J0IEFsYnVtIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19zb2FyLCAiU29ydCBBcnRpc3QiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX3NvYWEsICJTb3J0IEFsYnVtIEFydGlzdCIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0Nfc29jbywgIlNvcnQgQ29tcG9zZXIiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX3Nvc24sICJTb3J0IFRWIFNob3ciLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX3R2c2gsICJUViBTaG93IiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ190dmVuLCAiVFYgRXBpc29kZSBJRCIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfdHZzbiwgIlRWIFNlYXNvbiBOdW1iZXIiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX3R2ZXMsICJUViBFcGlzb2RlIE51bWJlciIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0Nfa2V5dywgIktleXdvcmRzIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19reXdkLCAiS2V5d29yZHMiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX190b28sICJFbmNvZGVyIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19fc3dyLCAiQXBwbGljYXRpb24gTmFtZSIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfX19fXywgIi0tLS0iLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX2RhdGEsICJkYXRhIiwgMCwgcXRkZW11eF9kdW1wX3Vua25vd259LAorICB7Rk9VUkNDX2ZyZWUsICJmcmVlIiwgMCx9LAorICB7Rk9VUkNDX3NraXAsICJza2lwIiwgMCx9LAorICB7Rk9VUkNDX1NWUTMsICJTVlEzIiwgMCx9LAorICB7Rk9VUkNDX3JtcmEsICJybXJhIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19ybWRhLCAicm1kYSIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfcmRyZiwgInJkcmYiLCAwLH0sCisgIHtGT1VSQ0NfX2dlbiwgIkN1c3RvbSBHZW5yZSIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfY3R0cywgIkNvbXBvc2l0aW9uIHRpbWUgdG8gc2FtcGxlIiwgMCwgcXRkZW11eF9kdW1wX2N0dHN9LAorICB7Rk9VUkNDX2NzbGcsICJDb21wb3NpdGlvbiBTaGlmdCBMZWFzdCBHcmVhdGVzdCIsIDAsIHF0ZGVtdXhfZHVtcF9jc2xnfSwKKyAge0ZPVVJDQ19YaVRoLCAiWGlUaCIsIDB9LAorICB7Rk9VUkNDX1hkeFQsICJYZHhUIiwgMH0sCisgIHtGT1VSQ0NfbG9jaSwgImxvY2kiLCAwfSwKKyAge0ZPVVJDQ19jbHNmLCAiY2xzZiIsIDB9LAorICB7Rk9VUkNDX21mcmEsICJtb3ZpZSBmcmFnbWVudCByYW5kb20gYWNjZXNzIiwKKyAgICAgIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfdGZyYSwgInRyYWNrIGZyYWdtZW50IHJhbmRvbSBhY2Nlc3MiLCAwLAorICAgICAgcXRkZW11eF9kdW1wX3RmcmF9LAorICB7Rk9VUkNDX21mcm8sICJtb3ZpZSBmcmFnbWVudCByYW5kb20gYWNjZXNzIG9mZnNldCIsIDAsCisgICAgICBxdGRlbXV4X2R1bXBfbWZyb30sCisgIHtGT1VSQ0NfbW9vZiwgIm1vdmllIGZyYWdtZW50IiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19tZmhkLCAibW92aWUgZnJhZ21lbnQgaGVhZGVyIiwgMCwgcXRkZW11eF9kdW1wX21maGR9LAorICB7Rk9VUkNDX3RyYWYsICJ0cmFjayBmcmFnbWVudCIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfdGZoZCwgInRyYWNrIGZyYWdtZW50IGhlYWRlciIsIDAsCisgICAgICBxdGRlbXV4X2R1bXBfdGZoZH0sCisgIHtGT1VSQ0Nfc2R0cCwgImluZGVwZW5kZW50IGFuZCBkaXNwb3NhYmxlIHNhbXBsZXMiLCAwLAorICAgICAgcXRkZW11eF9kdW1wX3NkdHB9LAorICB7Rk9VUkNDX3RydW4sICJ0cmFjayBmcmFnbWVudCBydW4iLCAwLCBxdGRlbXV4X2R1bXBfdHJ1bn0sCisgIHtGT1VSQ0NfbWRhdCwgIm1vb3ZpZSBkYXRhIiwgMCwgcXRkZW11eF9kdW1wX3Vua25vd259LAorICB7Rk9VUkNDX3RyZXgsICJtb292aWUgZGF0YSIsIDAsIHF0ZGVtdXhfZHVtcF90cmV4fSwKKyAge0ZPVVJDQ19tdmV4LCAibXZleCIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfbWVoZCwgIm1vdmllIGV4dGVuZHMgaGVhZGVyIiwgMCwKKyAgICAgIHF0ZGVtdXhfZHVtcF9tZWhkfSwKKyAge0ZPVVJDQ19vdmMxLCAib3ZjMSIsIDB9LAorICB7Rk9VUkNDX293bWEsICJvd21hIiwgMH0sCisgIHtGT1VSQ0NfYXZjQywgIkFWIGNvZGVjIGNvbmZpZ3VyYXRpb24gY29udGFpbmVyIiwgMH0sCisgIHtGT1VSQ0NfYXZjMSwgIkFWIGNvZGVjIGNvbmZpZ3VyYXRpb24gdjEiLCAwfSwKKyAge0ZPVVJDQ19hdmMzLCAiQVYgY29kZWMgY29uZmlndXJhdGlvbiB2MyIsIDB9LAorICB7Rk9VUkNDX21wNHMsICJWT0JTVUIgY29kZWMgY29uZmlndXJhdGlvbiIsIDB9LAorICB7Rk9VUkNDX2h2YzEsICJIRVZDIGNvZGVjIGNvbmZpZ3VyYXRpb24iLCAwfSwKKyAge0ZPVVJDQ19oZXYxLCAiSEVWQyBjb2RlYyBjb25maWd1cmF0aW9uIiwgMH0sCisgIHtGT1VSQ0NfaHZjQywgIkhFVkMgY29kZWMgY29uZmlndXJhdGlvbiBjb250YWluZXIiLCAwfSwKKyAge0ZPVVJDQ190ZmR0LCAiVHJhY2sgZnJhZ21lbnQgZGVjb2RlIHRpbWUiLCAwLCBxdGRlbXV4X2R1bXBfdGZkdH0sCisgIHtGT1VSQ0NfY2hhcCwgIkNoYXB0ZXIgUmVmZXJlbmNlIn0sCisgIHtGT1VSQ0NfYnRydCwgIkJpdHJhdGUgaW5mb3JtYXRpb24iLCAwfSwKKyAge0ZPVVJDQ19mcm1hLCAiQXVkaW8gY29kZWMgZm9ybWF0IiwgMH0sCisgIHtGT1VSQ0NfbmFtZSwgIm5hbWUiLCAwfSwKKyAge0ZPVVJDQ19tZWFuLCAibWVhbiIsIDB9LAorICB7Rk9VUkNDX3N2bWksICJTdGVyZW9zY29waWMgVmlkZW8gTWVkaWEgSW5mb3JtYXRpb24iLCAwLAorICAgICAgcXRkZW11eF9kdW1wX3N2bWl9LAorICB7Rk9VUkNDX3NjZGksICJTdGVyZW9zY29waWMgQ2FtZXJhIGFuZCBEaXNwbGF5IEluZm9ybWF0aW9uIiwgMCwKKyAgICAgIHF0ZGVtdXhfZHVtcF91bmtub3dufSwKKyAge0ZPVVJDQ19zYWl6LCAic2FtcGxlIGF1eGlsaWFyeSBpbmZvcm1hdGlvbiBzaXplcyIsIDB9LAorICB7Rk9VUkNDX3NhaW8sICJzYW1wbGUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIG9mZnNldHMiLCAwfSwKKyAge0ZPVVJDQ19lbmN2LCAiZW5jcnlwdGVkIHZpc3VhbCBzYW1wbGUgZW50cnkiLCAwfSwKKyAge0ZPVVJDQ19lbmNhLCAiZW5jcnlwdGVkIGF1ZGlvIHNhbXBsZSBlbnRyeSIsIDB9LAorICB7Rk9VUkNDX2VuY3QsICJlbmNyeXB0ZWQgdGV4dCBzYW1wbGUgZW50cnkiLCAwfSwKKyAge0ZPVVJDQ19lbmNzLCAiZW5jcnlwdGVkIHN5c3RlbSBzYW1wbGUgZW50cnkiLCAwfSwKKyAge0ZPVVJDQ19zaW5mLCAicHJvdGVjdGlvbiBzY2hlbWUgaW5mb3JtYXRpb24iLCBRVF9GTEFHX0NPTlRBSU5FUn0sCisgIHtGT1VSQ0NfZnJtYSwgIm9yaWdpbmFsIGZvcm1hdCIsIDB9LAorICB7Rk9VUkNDX3NjaG0sICJzY2hlbWUgdHlwZSIsIDB9LAorICB7Rk9VUkNDX3NjaGksICJzY2hlbWUgaW5mb3JtYXRpb24iLCBRVF9GTEFHX0NPTlRBSU5FUn0sCisgIHtGT1VSQ0NfcHNzaCwgInByb3RlY3Rpb24gc3lzdGVtIHNwZWNpZmljIGhlYWRlciIsIDB9LAorICB7Rk9VUkNDX3RlbmMsICJ0cmFjayBlbmNyeXB0aW9uIiwgMH0sCisgIHtGT1VSQ0Nfc3RwcCwgIlhNTCBzdWJ0aXRsZSBzYW1wbGUgZW50cnkiLCAwfSwKKyAgezAsICJ1bmtub3duIiwgMCx9LAorfTsKKworc3RhdGljIGNvbnN0IGludCBuX3F0X25vZGVfdHlwZXMgPQorICAgIHNpemVvZiAocXRfbm9kZV90eXBlcykgLyBzaXplb2YgKHF0X25vZGVfdHlwZXNbMF0pOworCitjb25zdCBRdE5vZGVUeXBlICoKK3F0ZGVtdXhfdHlwZV9nZXQgKGd1aW50MzIgZm91cmNjKQoreworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbl9xdF9ub2RlX3R5cGVzOyBpKyspIHsKKyAgICBpZiAoR19VTkxJS0VMWSAocXRfbm9kZV90eXBlc1tpXS5mb3VyY2MgPT0gZm91cmNjKSkKKyAgICAgIHJldHVybiBxdF9ub2RlX3R5cGVzICsgaTsKKyAgfQorCisgIEdTVF9XQVJOSU5HICgidW5rbm93biBRdWlja1RpbWUgbm9kZSB0eXBlICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKTsKKworICByZXR1cm4gcXRfbm9kZV90eXBlcyArIG5fcXRfbm9kZV90eXBlcyAtIDE7Cit9CmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuaCBiL2dzdC9pc29tcDQvcXRkZW11eF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZWY3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuaApAQCAtMCwwICsxLDgzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBTVEVyaWNzc29uIDxiZW5qYW1pbi5nYWlnbmFyZEBzdGVyaWNzc29uLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1FUREVNVVhfVFlQRVNfSF9fCisjZGVmaW5lIF9fR1NUX1FUREVNVVhfVFlQRVNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXJlYWRlci5oPgorCisjaW5jbHVkZSAicXRkZW11eC5oIgorCitHX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgZ2Jvb2xlYW4gKCpRdER1bXBGdW5jKSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLAorICAgIGludCBkZXB0aCk7CisKK3R5cGVkZWYgc3RydWN0IF9RdE5vZGVUeXBlIFF0Tm9kZVR5cGU7CisKKyNkZWZpbmUgUVRfVUlOVDMyKGEpICAoR1NUX1JFQURfVUlOVDMyX0JFKGEpKQorI2RlZmluZSBRVF9VSU5UMjQoYSkgIChHU1RfUkVBRF9VSU5UMzJfQkUoYSkgPj4gOCkKKyNkZWZpbmUgUVRfVUlOVDE2KGEpICAoR1NUX1JFQURfVUlOVDE2X0JFKGEpKQorI2RlZmluZSBRVF9VSU5UOChhKSAgIChHU1RfUkVBRF9VSU5UOChhKSkKKyNkZWZpbmUgUVRfRlAzMihhKSAgICAoKEdTVF9SRUFEX1VJTlQzMl9CRShhKSkvNjU1MzYuMCkKKyNkZWZpbmUgUVRfU0ZQMzIoYSkgICAoKChnaW50KShHU1RfUkVBRF9VSU5UMzJfQkUoYSkpKS82NTUzNi4wKQorI2RlZmluZSBRVF9GUDE2KGEpICAgICgoR1NUX1JFQURfVUlOVDE2X0JFKGEpKS8yNTYuMCkKKyNkZWZpbmUgUVRfRk9VUkNDKGEpICAoR1NUX1JFQURfVUlOVDMyX0xFKGEpKQorI2RlZmluZSBRVF9VSU5UNjQoYSkgICgoKChndWludDY0KVFUX1VJTlQzMihhKSk8PDMyKXxRVF9VSU5UMzIoKChndWludDggKilhKSs0KSkKKwordHlwZWRlZiBlbnVtIHsKKyAgUVRfRkxBR19OT05FICAgICAgPSAoMCksCisgIFFUX0ZMQUdfQ09OVEFJTkVSID0gKDEgPDwgMCkKK30gUXRGbGFnczsKKworc3RydWN0IF9RdE5vZGVUeXBlIHsKKyAgZ3VpbnQzMiAgICAgIGZvdXJjYzsKKyAgY29uc3QgZ2NoYXIgKm5hbWU7CisgIFF0RmxhZ3MgICAgICBmbGFnczsKKyAgUXREdW1wRnVuYyAgIGR1bXA7Cit9OworCitlbnVtIFRmRmxhZ3MKK3sKKyAgVEZfQkFTRV9EQVRBX09GRlNFVCAgICAgICAgID0gMHgwMDAwMDEsICAgLyogYmFzZS1kYXRhLW9mZnNldC1wcmVzZW50ICovCisgIFRGX1NBTVBMRV9ERVNDUklQVElPTl9JTkRFWCA9IDB4MDAwMDAyLCAgIC8qIHNhbXBsZS1kZXNjcmlwdGlvbi1pbmRleC1wcmVzZW50ICovCisgIFRGX0RFRkFVTFRfU0FNUExFX0RVUkFUSU9OICA9IDB4MDAwMDA4LCAgIC8qIGRlZmF1bHQtc2FtcGxlLWR1cmF0aW9uLXByZXNlbnQgKi8KKyAgVEZfREVGQVVMVF9TQU1QTEVfU0laRSAgICAgID0gMHgwMDAwMTAsICAgLyogZGVmYXVsdC1zYW1wbGUtc2l6ZS1wcmVzZW50ICovCisgIFRGX0RFRkFVTFRfU0FNUExFX0ZMQUdTICAgICA9IDB4MDAwMDIwLCAgIC8qIGRlZmF1bHQtc2FtcGxlLWZsYWdzLXByZXNlbnQgKi8KKyAgVEZfRFVSQVRJT05fSVNfRU1QVFkgICAgICAgID0gMHgwMTAwMDAsICAgLyogZHVyYXRpb24taXMtZW1wdHkgKi8KKyAgVEZfREVGQVVMVF9CQVNFX0lTX01PT0YgICAgID0gMHgwMjAwMDAgICAgLyogZGVmYXVsdC1iYXNlLWlzLW1vb2YgKi8KK307CisKK2VudW0gVHJGbGFncworeworICBUUl9EQVRBX09GRlNFVCAgICAgICAgICAgICAgPSAweDAwMDAwMSwgICAvKiBkYXRhLW9mZnNldC1wcmVzZW50ICovCisgIFRSX0ZJUlNUX1NBTVBMRV9GTEFHUyAgICAgICA9IDB4MDAwMDA0LCAgIC8qIGZpcnN0LXNhbXBsZS1mbGFncy1wcmVzZW50ICovCisgIFRSX1NBTVBMRV9EVVJBVElPTiAgICAgICAgICA9IDB4MDAwMTAwLCAgIC8qIHNhbXBsZS1kdXJhdGlvbi1wcmVzZW50ICovCisgIFRSX1NBTVBMRV9TSVpFICAgICAgICAgICAgICA9IDB4MDAwMjAwLCAgIC8qIHNhbXBsZS1zaXplLXByZXNlbnQgKi8KKyAgVFJfU0FNUExFX0ZMQUdTICAgICAgICAgICAgID0gMHgwMDA0MDAsICAgLyogc2FtcGxlLWZsYWdzLXByZXNlbnQgKi8KKyAgVFJfQ09NUE9TSVRJT05fVElNRV9PRkZTRVRTID0gMHgwMDA4MDAgICAgLyogc2FtcGxlLWNvbXBvc2l0aW9uLXRpbWUtb2Zmc2V0cy1wcmVzZW50cyAqLworfTsKKworY29uc3QgUXROb2RlVHlwZSAqcXRkZW11eF90eXBlX2dldCAoZ3VpbnQzMiBmb3VyY2MpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUVRERU1VWF9UWVBFU19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvcXRwYWxldHRlLmggYi9nc3QvaXNvbXA0L3F0cGFsZXR0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MWU5OTEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L3F0cGFsZXR0ZS5oCkBAIC0wLDAgKzEsMTM3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1FUUEFMTEVURV9IX18KKyNkZWZpbmUgX19HU1RfUVRQQUxMRVRFX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitHX0JFR0lOX0RFQ0xTCisKK3N0YXRpYyBjb25zdCBndWludDMyIGZmX3F0X2RlZmF1bHRfcGFsZXR0ZV8yWzJdID0geworICAweGZmZmZmZiwgMHgwMDAwMDAKK307CisKK3N0YXRpYyBjb25zdCBndWludDMyIGZmX3F0X2RlZmF1bHRfcGFsZXR0ZV80WzRdID0geworICAweDkzNjU1ZSwgMHhmZmZmZmYsIDB4ZGZkMGFiLCAweDAwMDAwMAorfTsKKworc3RhdGljIGNvbnN0IGd1aW50MzIgZmZfcXRfZGVmYXVsdF9wYWxldHRlXzE2WzE2XSA9IHsKKyAgMHhmZmZiZmYsIDB4ZWZkOWJiLCAweGU4YzliMSwgMHg5MzY1NWUsCisgIDB4ZmNkZWU4LCAweDlkODg5MSwgMHhmZmZmZmYsIDB4ZmZmZmZmLAorICAweGZmZmZmZiwgMHg0NzQ4MzcsIDB4N2E1ZTU1LCAweGRmZDBhYiwKKyAgMHhmZmZiZjksIDB4ZThjYWM1LCAweDhhN2M3NywgMHgwMDAwMDAKK307CitzdGF0aWMgY29uc3QgZ3VpbnQzMiBmZl9xdF9kZWZhdWx0X3BhbGV0dGVfMjU2WzI1Nl0gPSB7CisgIDB4RkZGRkZGLCAweEZGRkZDQywgMHhGRkZGOTksIDB4RkZGRjY2LCAweEZGRkYzMywgMHhGRkZGMDAsCisgIDB4RkZDQ0ZGLCAweEZGQ0NDQywgMHhGRkNDOTksIDB4RkZDQzY2LCAweEZGQ0MzMywgMHhGRkNDMDAsCisgIDB4RkY5OUZGLCAweEZGOTlDQywgMHhGRjk5OTksIDB4RkY5OTY2LCAweEZGOTkzMywgMHhGRjk5MDAsCisgIDB4RkY2NkZGLCAweEZGNjZDQywgMHhGRjY2OTksIDB4RkY2NjY2LCAweEZGNjYzMywgMHhGRjY2MDAsCisgIDB4RkYzM0ZGLCAweEZGMzNDQywgMHhGRjMzOTksIDB4RkYzMzY2LCAweEZGMzMzMywgMHhGRjMzMDAsCisgIDB4RkYwMEZGLCAweEZGMDBDQywgMHhGRjAwOTksIDB4RkYwMDY2LCAweEZGMDAzMywgMHhGRjAwMDAsCisgIDB4Q0NGRkZGLCAweENDRkZDQywgMHhDQ0ZGOTksIDB4Q0NGRjY2LCAweENDRkYzMywgMHhDQ0ZGMDAsCisgIDB4Q0NDQ0ZGLCAweENDQ0NDQywgMHhDQ0NDOTksIDB4Q0NDQzY2LCAweENDQ0MzMywgMHhDQ0NDMDAsCisgIDB4Q0M5OUZGLCAweENDOTlDQywgMHhDQzk5OTksIDB4Q0M5OTY2LCAweENDOTkzMywgMHhDQzk5MDAsCisgIDB4Q0M2NkZGLCAweENDNjZDQywgMHhDQzY2OTksIDB4Q0M2NjY2LCAweENDNjYzMywgMHhDQzY2MDAsCisgIDB4Q0MzM0ZGLCAweENDMzNDQywgMHhDQzMzOTksIDB4Q0MzMzY2LCAweENDMzMzMywgMHhDQzMzMDAsCisgIDB4Q0MwMEZGLCAweENDMDBDQywgMHhDQzAwOTksIDB4Q0MwMDY2LCAweENDMDAzMywgMHhDQzAwMDAsCisgIDB4OTlGRkZGLCAweDk5RkZDQywgMHg5OUZGOTksIDB4OTlGRjY2LCAweDk5RkYzMywgMHg5OUZGMDAsCisgIDB4OTlDQ0ZGLCAweDk5Q0NDQywgMHg5OUNDOTksIDB4OTlDQzY2LCAweDk5Q0MzMywgMHg5OUNDMDAsCisgIDB4OTk5OUZGLCAweDk5OTlDQywgMHg5OTk5OTksIDB4OTk5OTY2LCAweDk5OTkzMywgMHg5OTk5MDAsCisgIDB4OTk2NkZGLCAweDk5NjZDQywgMHg5OTY2OTksIDB4OTk2NjY2LCAweDk5NjYzMywgMHg5OTY2MDAsCisgIDB4OTkzM0ZGLCAweDk5MzNDQywgMHg5OTMzOTksIDB4OTkzMzY2LCAweDk5MzMzMywgMHg5OTMzMDAsCisgIDB4OTkwMEZGLCAweDk5MDBDQywgMHg5OTAwOTksIDB4OTkwMDY2LCAweDk5MDAzMywgMHg5OTAwMDAsCisgIDB4NjZGRkZGLCAweDY2RkZDQywgMHg2NkZGOTksIDB4NjZGRjY2LCAweDY2RkYzMywgMHg2NkZGMDAsCisgIDB4NjZDQ0ZGLCAweDY2Q0NDQywgMHg2NkNDOTksIDB4NjZDQzY2LCAweDY2Q0MzMywgMHg2NkNDMDAsCisgIDB4NjY5OUZGLCAweDY2OTlDQywgMHg2Njk5OTksIDB4NjY5OTY2LCAweDY2OTkzMywgMHg2Njk5MDAsCisgIDB4NjY2NkZGLCAweDY2NjZDQywgMHg2NjY2OTksIDB4NjY2NjY2LCAweDY2NjYzMywgMHg2NjY2MDAsCisgIDB4NjYzM0ZGLCAweDY2MzNDQywgMHg2NjMzOTksIDB4NjYzMzY2LCAweDY2MzMzMywgMHg2NjMzMDAsCisgIDB4NjYwMEZGLCAweDY2MDBDQywgMHg2NjAwOTksIDB4NjYwMDY2LCAweDY2MDAzMywgMHg2NjAwMDAsCisgIDB4MzNGRkZGLCAweDMzRkZDQywgMHgzM0ZGOTksIDB4MzNGRjY2LCAweDMzRkYzMywgMHgzM0ZGMDAsCisgIDB4MzNDQ0ZGLCAweDMzQ0NDQywgMHgzM0NDOTksIDB4MzNDQzY2LCAweDMzQ0MzMywgMHgzM0NDMDAsCisgIDB4MzM5OUZGLCAweDMzOTlDQywgMHgzMzk5OTksIDB4MzM5OTY2LCAweDMzOTkzMywgMHgzMzk5MDAsCisgIDB4MzM2NkZGLCAweDMzNjZDQywgMHgzMzY2OTksIDB4MzM2NjY2LCAweDMzNjYzMywgMHgzMzY2MDAsCisgIDB4MzMzM0ZGLCAweDMzMzNDQywgMHgzMzMzOTksIDB4MzMzMzY2LCAweDMzMzMzMywgMHgzMzMzMDAsCisgIDB4MzMwMEZGLCAweDMzMDBDQywgMHgzMzAwOTksIDB4MzMwMDY2LCAweDMzMDAzMywgMHgzMzAwMDAsCisgIDB4MDBGRkZGLCAweDAwRkZDQywgMHgwMEZGOTksIDB4MDBGRjY2LCAweDAwRkYzMywgMHgwMEZGMDAsCisgIDB4MDBDQ0ZGLCAweDAwQ0NDQywgMHgwMENDOTksIDB4MDBDQzY2LCAweDAwQ0MzMywgMHgwMENDMDAsCisgIDB4MDA5OUZGLCAweDAwOTlDQywgMHgwMDk5OTksIDB4MDA5OTY2LCAweDAwOTkzMywgMHgwMDk5MDAsCisgIDB4MDA2NkZGLCAweDAwNjZDQywgMHgwMDY2OTksIDB4MDA2NjY2LCAweDAwNjYzMywgMHgwMDY2MDAsCisgIDB4MDAzM0ZGLCAweDAwMzNDQywgMHgwMDMzOTksIDB4MDAzMzY2LCAweDAwMzMzMywgMHgwMDMzMDAsCisgIDB4MDAwMEZGLCAweDAwMDBDQywgMHgwMDAwOTksIDB4MDAwMDY2LCAweDAwMDAzMywgMHhFRTAwMDAsCisgIDB4REQwMDAwLCAweEJCMDAwMCwgMHhBQTAwMDAsIDB4ODgwMDAwLCAweDc3MDAwMCwgMHg1NTAwMDAsCisgIDB4NDQwMDAwLCAweDIyMDAwMCwgMHgxMTAwMDAsIDB4MDBFRTAwLCAweDAwREQwMCwgMHgwMEJCMDAsCisgIDB4MDBBQTAwLCAweDAwODgwMCwgMHgwMDc3MDAsIDB4MDA1NTAwLCAweDAwNDQwMCwgMHgwMDIyMDAsCisgIDB4MDAxMTAwLCAweDAwMDBFRSwgMHgwMDAwREQsIDB4MDAwMEJCLCAweDAwMDBBQSwgMHgwMDAwODgsCisgIDB4MDAwMDc3LCAweDAwMDA1NSwgMHgwMDAwNDQsIDB4MDAwMDIyLCAweDAwMDAxMSwgMHhFRUVFRUUsCisgIDB4RERERERELCAweEJCQkJCQiwgMHhBQUFBQUEsIDB4ODg4ODg4LCAweDc3Nzc3NywgMHg1NTU1NTUsCisgIDB4NDQ0NDQ0LCAweDIyMjIyMiwgMHgxMTExMTEsIDB4MDAwMDAwCit9OworCitzdGF0aWMgY29uc3QgZ3VpbnQzMiBmZl9xdF9ncmF5c2NhbGVfcGFsZXR0ZV8xNlsxNl0gPSB7CisgIDB4ZmZmZmZmLCAweGVlZWVlZSwgMHhkZGRkZGQsIDB4Y2NjY2NjLAorICAweGJiYmJiYiwgMHhhYWFhYWEsIDB4OTk5OTk5LCAweDg4ODg4OCwKKyAgMHg3Nzc3NzcsIDB4NjY2NjY2LCAweDU1NTU1NSwgMHg0NDQ0NDQsCisgIDB4MzMzMzMzLCAweDIyMjIyMiwgMHgxMTExMTEsIDB4MDAwMDAwCit9OworCitzdGF0aWMgY29uc3QgZ3VpbnQzMiBmZl9xdF9ncmF5c2NhbGVfcGFsZXR0ZV8yNTZbMjU2XSA9IHsKKyAgMHhmZmZmZmYsIDB4ZmVmZWZlLCAweGZkZmRmZCwgMHhmY2ZjZmMsIDB4ZmJmYmZiLCAweGZhZmFmYSwgMHhmOWY5ZjksCisgIDB4ZjhmOGY4LCAweGY3ZjdmNywgMHhmNmY2ZjYsIDB4ZjVmNWY1LCAweGY0ZjRmNCwgMHhmM2YzZjMsIDB4ZjJmMmYyLAorICAweGYxZjFmMSwgMHhmMGYwZjAsIDB4ZWZlZmVmLCAweGVlZWVlZSwgMHhlZGVkZWQsIDB4ZWNlY2VjLCAweGViZWJlYiwKKyAgMHhlYWVhZWEsIDB4ZTllOWU5LCAweGU4ZThlOCwgMHhlN2U3ZTcsIDB4ZTZlNmU2LCAweGU1ZTVlNSwgMHhlNGU0ZTQsCisgIDB4ZTNlM2UzLCAweGUyZTJlMiwgMHhlMWUxZTEsIDB4ZTBlMGUwLCAweGRmZGZkZiwgMHhkZWRlZGUsIDB4ZGRkZGRkLAorICAweGRjZGNkYywgMHhkYmRiZGIsIDB4ZGFkYWRhLCAweGQ5ZDlkOSwgMHhkOGQ4ZDgsIDB4ZDdkN2Q3LCAweGQ2ZDZkNiwKKyAgMHhkNWQ1ZDUsIDB4ZDRkNGQ0LCAweGQzZDNkMywgMHhkMmQyZDIsIDB4ZDFkMWQxLCAweGQwZDBkMCwgMHhjZmNmY2YsCisgIDB4Y2VjZWNlLCAweGNkY2RjZCwgMHhjY2NjY2MsIDB4Y2JjYmNiLCAweGNhY2FjYSwgMHhjOWM5YzksIDB4YzhjOGM4LAorICAweGM3YzdjNywgMHhjNmM2YzYsIDB4YzVjNWM1LCAweGM0YzRjNCwgMHhjM2MzYzMsIDB4YzJjMmMyLCAweGMxYzFjMSwKKyAgMHhjMGMwYzAsIDB4YmZiZmJmLCAweGJlYmViZSwgMHhiZGJkYmQsIDB4YmNiY2JjLCAweGJiYmJiYiwgMHhiYWJhYmEsCisgIDB4YjliOWI5LCAweGI4YjhiOCwgMHhiN2I3YjcsIDB4YjZiNmI2LCAweGI1YjViNSwgMHhiNGI0YjQsIDB4YjNiM2IzLAorICAweGIyYjJiMiwgMHhiMWIxYjEsIDB4YjBiMGIwLCAweGFmYWZhZiwgMHhhZWFlYWUsIDB4YWRhZGFkLCAweGFjYWNhYywKKyAgMHhhYmFiYWIsIDB4YWFhYWFhLCAweGE5YTlhOSwgMHhhOGE4YTgsIDB4YTdhN2E3LCAweGE2YTZhNiwgMHhhNWE1YTUsCisgIDB4YTRhNGE0LCAweGEzYTNhMywgMHhhMmEyYTIsIDB4YTFhMWExLCAweGEwYTBhMCwgMHg5ZjlmOWYsIDB4OWU5ZTllLAorICAweDlkOWQ5ZCwgMHg5YzljOWMsIDB4OWI5YjliLCAweDlhOWE5YSwgMHg5OTk5OTksIDB4OTg5ODk4LCAweDk3OTc5NywKKyAgMHg5Njk2OTYsIDB4OTU5NTk1LCAweDk0OTQ5NCwgMHg5MzkzOTMsIDB4OTI5MjkyLCAweDkxOTE5MSwgMHg5MDkwOTAsCisgIDB4OGY4ZjhmLCAweDhlOGU4ZSwgMHg4ZDhkOGQsIDB4OGM4YzhjLCAweDhiOGI4YiwgMHg4YThhOGEsIDB4ODk4OTg5LAorICAweDg4ODg4OCwgMHg4Nzg3ODcsIDB4ODY4Njg2LCAweDg1ODU4NSwgMHg4NDg0ODQsIDB4ODM4MzgzLCAweDgyODI4MiwKKyAgMHg4MTgxODEsIDB4ODA4MDgwLCAweDdmN2Y3ZiwgMHg3ZTdlN2UsIDB4N2Q3ZDdkLCAweDdjN2M3YywgMHg3YjdiN2IsCisgIDB4N2E3YTdhLCAweDc5Nzk3OSwgMHg3ODc4NzgsIDB4Nzc3Nzc3LCAweDc2NzY3NiwgMHg3NTc1NzUsIDB4NzQ3NDc0LAorICAweDczNzM3MywgMHg3MjcyNzIsIDB4NzE3MTcxLCAweDcwNzA3MCwgMHg2ZjZmNmYsIDB4NmU2ZTZlLCAweDZkNmQ2ZCwKKyAgMHg2YzZjNmMsIDB4NmI2YjZiLCAweDZhNmE2YSwgMHg2OTY5NjksIDB4Njg2ODY4LCAweDY3Njc2NywgMHg2NjY2NjYsCisgIDB4NjU2NTY1LCAweDY0NjQ2NCwgMHg2MzYzNjMsIDB4NjI2MjYyLCAweDYxNjE2MSwgMHg2MDYwNjAsIDB4NWY1ZjVmLAorICAweDVlNWU1ZSwgMHg1ZDVkNWQsIDB4NWM1YzVjLCAweDViNWI1YiwgMHg1YTVhNWEsIDB4NTk1OTU5LCAweDU4NTg1OCwKKyAgMHg1NzU3NTcsIDB4NTY1NjU2LCAweDU1NTU1NSwgMHg1NDU0NTQsIDB4NTM1MzUzLCAweDUyNTI1MiwgMHg1MTUxNTEsCisgIDB4NTA1MDUwLCAweDRmNGY0ZiwgMHg0ZTRlNGUsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0YjRiNGIsIDB4NGE0YTRhLAorICAweDQ5NDk0OSwgMHg0ODQ4NDgsIDB4NDc0NzQ3LCAweDQ2NDY0NiwgMHg0NTQ1NDUsIDB4NDQ0NDQ0LCAweDQzNDM0MywKKyAgMHg0MjQyNDIsIDB4NDE0MTQxLCAweDQwNDA0MCwgMHgzZjNmM2YsIDB4M2UzZTNlLCAweDNkM2QzZCwgMHgzYzNjM2MsCisgIDB4M2IzYjNiLCAweDNhM2EzYSwgMHgzOTM5MzksIDB4MzgzODM4LCAweDM3MzczNywgMHgzNjM2MzYsIDB4MzUzNTM1LAorICAweDM0MzQzNCwgMHgzMzMzMzMsIDB4MzIzMjMyLCAweDMxMzEzMSwgMHgzMDMwMzAsIDB4MmYyZjJmLCAweDJlMmUyZSwKKyAgMHgyZDJkMmQsIDB4MmMyYzJjLCAweDJiMmIyYiwgMHgyYTJhMmEsIDB4MjkyOTI5LCAweDI4MjgyOCwgMHgyNzI3MjcsCisgIDB4MjYyNjI2LCAweDI1MjUyNSwgMHgyNDI0MjQsIDB4MjMyMzIzLCAweDIyMjIyMiwgMHgyMTIxMjEsIDB4MjAyMDIwLAorICAweDFmMWYxZiwgMHgxZTFlMWUsIDB4MWQxZDFkLCAweDFjMWMxYywgMHgxYjFiMWIsIDB4MWExYTFhLCAweDE5MTkxOSwKKyAgMHgxODE4MTgsIDB4MTcxNzE3LCAweDE2MTYxNiwgMHgxNTE1MTUsIDB4MTQxNDE0LCAweDEzMTMxMywgMHgxMjEyMTIsCisgIDB4MTExMTExLCAweDEwMTAxMCwgMHgwZjBmMGYsIDB4MGUwZTBlLCAweDBkMGQwZCwgMHgwYzBjMGMsIDB4MGIwYjBiLAorICAweDBhMGEwYSwgMHgwOTA5MDksIDB4MDgwODA4LCAweDA3MDcwNywgMHgwNjA2MDYsIDB4MDUwNTA1LCAweDA0MDQwNCwKKyAgMHgwMzAzMDMsIDB4MDIwMjAyLCAweDAxMDEwMSwgMHgwMDAwMDAKK307CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9RVFBBTEVUVEVfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvbGF3L01ha2VmaWxlLmFtIGIvZ3N0L2xhdy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWQ5NGJhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2xhdy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE1IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RhbGF3LmxhIGxpYmdzdG11bGF3LmxhCisKK2xpYmdzdGFsYXdfbGFfU09VUkNFUyA9IGFsYXctZW5jb2RlLmMgYWxhdy1kZWNvZGUuYyBhbGF3LmMKK2xpYmdzdGFsYXdfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKQorbGliZ3N0YWxhd19sYV9MSUJBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RhdWRpby0kKEdTVF9BUElfVkVSU0lPTikgXAorCSQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykKK2xpYmdzdGFsYXdfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitsaWJnc3RtdWxhd19sYV9TT1VSQ0VTID0gbXVsYXctZW5jb2RlLmMgbXVsYXctY29udmVyc2lvbi5jIG11bGF3LWRlY29kZS5jIG11bGF3LmMKK2xpYmdzdG11bGF3X2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdG11bGF3X2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKQorbGliZ3N0bXVsYXdfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IG11bGF3LWNvbnZlcnNpb24uaCBhbGF3LWVuY29kZS5oIGFsYXctZGVjb2RlLmggbXVsYXctZW5jb2RlLmggbXVsYXctZGVjb2RlLmgKZGlmZiAtLWdpdCBhL2dzdC9sYXcvYWxhdy1kZWNvZGUuYyBiL2dzdC9sYXcvYWxhdy1kZWNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWEyM2U1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2xhdy9hbGF3LWRlY29kZS5jCkBAIC0wLDAgKzEsMjMxIEBACisvKiBHU3RyZWFtZXIgQS1MYXcgdG8gUENNIGNvbnZlcnNpb24KKyAqIENvcHlyaWdodCAoQykgMjAwMCBieSBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYWxhd2RlYworICoKKyAqIFRoaXMgZWxlbWVudCBkZWNvZGVzIGFsYXcgYXVkaW8uIEFsYXcgY29kaW5nIGlzIGFsc28ga25vd24gYXMgRy43MTEuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiYWxhdy1kZWNvZGUuaCIKKworZXh0ZXJuIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGFsYXdfZGVjX3NyY19mYWN0b3J5OworZXh0ZXJuIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGFsYXdfZGVjX3NpbmtfZmFjdG9yeTsKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoYWxhd19kZWNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgYWxhd19kZWNfZGVidWcKKworc3RhdGljIGdib29sZWFuIGdzdF9hbGF3X2RlY19zZXRfZm9ybWF0IChHc3RBdWRpb0RlY29kZXIgKiBkZWMsIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9hbGF3X2RlY19oYW5kbGVfZnJhbWUgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYywKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworCisjZGVmaW5lIGdzdF9hbGF3X2RlY19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RBTGF3RGVjLCBnc3RfYWxhd19kZWMsIEdTVF9UWVBFX0FVRElPX0RFQ09ERVIpOworCisvKiBzb21lIGRheSB3ZSBtaWdodCBoYXZlIGRlZmluZXMgaW4gZ3N0Y29uZmlnLmggdGhhdCB0ZWxsIHVzIGFib3V0IHRoZQorICogZGVzaXJlZCBjcHUvbWVtb3J5L2JpbmFyeSBzaXplIHRyYWRlLW9mZnMgKi8KKyNkZWZpbmUgR1NUX0FMQVdfREVDX1VTRV9UQUJMRQorCisjaWZkZWYgR1NUX0FMQVdfREVDX1VTRV9UQUJMRQorCitzdGF0aWMgY29uc3QgZ2ludCBhbGF3X3RvX3MxNl90YWJsZVsyNTZdID0geworICAtNTUwNCwgLTUyNDgsIC02MDE2LCAtNTc2MCwgLTQ0ODAsIC00MjI0LCAtNDk5MiwgLTQ3MzYsCisgIC03NTUyLCAtNzI5NiwgLTgwNjQsIC03ODA4LCAtNjUyOCwgLTYyNzIsIC03MDQwLCAtNjc4NCwKKyAgLTI3NTIsIC0yNjI0LCAtMzAwOCwgLTI4ODAsIC0yMjQwLCAtMjExMiwgLTI0OTYsIC0yMzY4LAorICAtMzc3NiwgLTM2NDgsIC00MDMyLCAtMzkwNCwgLTMyNjQsIC0zMTM2LCAtMzUyMCwgLTMzOTIsCisgIC0yMjAxNiwgLTIwOTkyLCAtMjQwNjQsIC0yMzA0MCwgLTE3OTIwLCAtMTY4OTYsIC0xOTk2OCwgLTE4OTQ0LAorICAtMzAyMDgsIC0yOTE4NCwgLTMyMjU2LCAtMzEyMzIsIC0yNjExMiwgLTI1MDg4LCAtMjgxNjAsIC0yNzEzNiwKKyAgLTExMDA4LCAtMTA0OTYsIC0xMjAzMiwgLTExNTIwLCAtODk2MCwgLTg0NDgsIC05OTg0LCAtOTQ3MiwKKyAgLTE1MTA0LCAtMTQ1OTIsIC0xNjEyOCwgLTE1NjE2LCAtMTMwNTYsIC0xMjU0NCwgLTE0MDgwLCAtMTM1NjgsCisgIC0zNDQsIC0zMjgsIC0zNzYsIC0zNjAsIC0yODAsIC0yNjQsIC0zMTIsIC0yOTYsCisgIC00NzIsIC00NTYsIC01MDQsIC00ODgsIC00MDgsIC0zOTIsIC00NDAsIC00MjQsCisgIC04OCwgLTcyLCAtMTIwLCAtMTA0LCAtMjQsIC04LCAtNTYsIC00MCwKKyAgLTIxNiwgLTIwMCwgLTI0OCwgLTIzMiwgLTE1MiwgLTEzNiwgLTE4NCwgLTE2OCwKKyAgLTEzNzYsIC0xMzEyLCAtMTUwNCwgLTE0NDAsIC0xMTIwLCAtMTA1NiwgLTEyNDgsIC0xMTg0LAorICAtMTg4OCwgLTE4MjQsIC0yMDE2LCAtMTk1MiwgLTE2MzIsIC0xNTY4LCAtMTc2MCwgLTE2OTYsCisgIC02ODgsIC02NTYsIC03NTIsIC03MjAsIC01NjAsIC01MjgsIC02MjQsIC01OTIsCisgIC05NDQsIC05MTIsIC0xMDA4LCAtOTc2LCAtODE2LCAtNzg0LCAtODgwLCAtODQ4LAorICA1NTA0LCA1MjQ4LCA2MDE2LCA1NzYwLCA0NDgwLCA0MjI0LCA0OTkyLCA0NzM2LAorICA3NTUyLCA3Mjk2LCA4MDY0LCA3ODA4LCA2NTI4LCA2MjcyLCA3MDQwLCA2Nzg0LAorICAyNzUyLCAyNjI0LCAzMDA4LCAyODgwLCAyMjQwLCAyMTEyLCAyNDk2LCAyMzY4LAorICAzNzc2LCAzNjQ4LCA0MDMyLCAzOTA0LCAzMjY0LCAzMTM2LCAzNTIwLCAzMzkyLAorICAyMjAxNiwgMjA5OTIsIDI0MDY0LCAyMzA0MCwgMTc5MjAsIDE2ODk2LCAxOTk2OCwgMTg5NDQsCisgIDMwMjA4LCAyOTE4NCwgMzIyNTYsIDMxMjMyLCAyNjExMiwgMjUwODgsIDI4MTYwLCAyNzEzNiwKKyAgMTEwMDgsIDEwNDk2LCAxMjAzMiwgMTE1MjAsIDg5NjAsIDg0NDgsIDk5ODQsIDk0NzIsCisgIDE1MTA0LCAxNDU5MiwgMTYxMjgsIDE1NjE2LCAxMzA1NiwgMTI1NDQsIDE0MDgwLCAxMzU2OCwKKyAgMzQ0LCAzMjgsIDM3NiwgMzYwLCAyODAsIDI2NCwgMzEyLCAyOTYsCisgIDQ3MiwgNDU2LCA1MDQsIDQ4OCwgNDA4LCAzOTIsIDQ0MCwgNDI0LAorICA4OCwgNzIsIDEyMCwgMTA0LCAyNCwgOCwgNTYsIDQwLAorICAyMTYsIDIwMCwgMjQ4LCAyMzIsIDE1MiwgMTM2LCAxODQsIDE2OCwKKyAgMTM3NiwgMTMxMiwgMTUwNCwgMTQ0MCwgMTEyMCwgMTA1NiwgMTI0OCwgMTE4NCwKKyAgMTg4OCwgMTgyNCwgMjAxNiwgMTk1MiwgMTYzMiwgMTU2OCwgMTc2MCwgMTY5NiwKKyAgNjg4LCA2NTYsIDc1MiwgNzIwLCA1NjAsIDUyOCwgNjI0LCA1OTIsCisgIDk0NCwgOTEyLCAxMDA4LCA5NzYsIDgxNiwgNzg0LCA4ODAsIDg0OAorfTsKKworc3RhdGljIGlubGluZSBnaW50CithbGF3X3RvX3MxNiAoZ3VpbnQ4IGFfdmFsKQoreworICByZXR1cm4gYWxhd190b19zMTZfdGFibGVbYV92YWxdOworfQorCisjZWxzZSAvKiBHU1RfQUxBV19ERUNfVVNFX1RBQkxFICovCisKK3N0YXRpYyBpbmxpbmUgZ2ludAorYWxhd190b19zMTYgKGd1aW50OCBhX3ZhbCkKK3sKKyAgZ2ludCB0OworICBnaW50IHNlZzsKKworICBhX3ZhbCBePSAweDU1OworICB0ID0gYV92YWwgJiAweDdmOworICBpZiAodCA8IDE2KQorICAgIHQgPSAodCA8PCA0KSArIDg7CisgIGVsc2UgeworICAgIHNlZyA9ICh0ID4+IDQpICYgMHgwNzsKKyAgICB0ID0gKCh0ICYgMHgwZikgPDwgNCkgKyAweDEwODsKKyAgICB0IDw8PSBzZWcgLSAxOworICB9CisgIHJldHVybiAoKGFfdmFsICYgMHg4MCkgPyB0IDogLXQpOworfQorCisjZW5kaWYgLyogR1NUX0FMQVdfREVDX1VTRV9UQUJMRSAqLworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hbGF3X2RlY19zZXRfZm9ybWF0IChHc3RBdWRpb0RlY29kZXIgKiBkZWMsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RBTGF3RGVjICphbGF3ZGVjID0gR1NUX0FMQVdfREVDIChkZWMpOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgaW50IHJhdGUsIGNoYW5uZWxzOworICBHc3RBdWRpb0luZm8gaW5mbzsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgaWYgKCFzdHJ1Y3R1cmUpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkZWMsICJmYWlsZWQgdG8gZ2V0IHN0cnVjdHVyZSBmcm9tIGNhcHMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAicmF0ZSIsICZyYXRlKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlYywgImZhaWxlZCB0byBmaW5kIGZpZWxkIHJhdGUgaW4gaW5wdXQgY2FwcyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsICZjaGFubmVscykpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkZWMsICJmYWlsZWQgdG8gZmluZCBmaWVsZCBjaGFubmVscyBpbiBpbnB1dCBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoJmluZm8pOworICBnc3RfYXVkaW9faW5mb19zZXRfZm9ybWF0ICgmaW5mbywgR1NUX0FVRElPX0ZPUk1BVF9TMTYsIHJhdGUsIGNoYW5uZWxzLCBOVUxMKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChhbGF3ZGVjLCAicmF0ZT0lZCwgY2hhbm5lbHM9JWQiLCByYXRlLCBjaGFubmVscyk7CisKKyAgcmV0dXJuIGdzdF9hdWRpb19kZWNvZGVyX3NldF9vdXRwdXRfZm9ybWF0IChkZWMsICZpbmZvKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hbGF3X2RlY19oYW5kbGVfZnJhbWUgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYywgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RNYXBJbmZvIGlubWFwLCBvdXRtYXA7CisgIGdpbnQxNiAqbGluZWFyX2RhdGE7CisgIGd1aW50OCAqYWxhd19kYXRhOworICBnc2l6ZSBhbGF3X3NpemUsIGxpbmVhcl9zaXplOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ2ludCBpOworCisgIGlmICghYnVmZmVyKSB7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CisKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmaW5tYXAsIEdTVF9NQVBfUkVBRCkpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkZWMsICJmYWlsZWQgdG8gbWFwIGlucHV0IGJ1ZmZlciIpOworICAgIGdvdG8gZXJyb3JfZmFpbGVkX21hcF9pbnB1dF9idWZmZXI7CisgIH0KKworICBhbGF3X2RhdGEgPSBpbm1hcC5kYXRhOworICBhbGF3X3NpemUgPSBpbm1hcC5zaXplOworCisgIGxpbmVhcl9zaXplID0gYWxhd19zaXplICogMjsKKworICBvdXRidWYgPSBnc3RfYXVkaW9fZGVjb2Rlcl9hbGxvY2F0ZV9vdXRwdXRfYnVmZmVyIChkZWMsIGxpbmVhcl9zaXplKTsKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmb3V0bWFwLCBHU1RfTUFQX1dSSVRFKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlYywgImZhaWxlZCB0byBtYXAgaW5wdXQgYnVmZmVyIik7CisgICAgZ290byBlcnJvcl9mYWlsZWRfbWFwX291dHB1dF9idWZmZXI7CisgIH0KKworICBsaW5lYXJfZGF0YSA9IChnaW50MTYgKikgb3V0bWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCBhbGF3X3NpemU7IGkrKykgeworICAgIGxpbmVhcl9kYXRhW2ldID0gYWxhd190b19zMTYgKGFsYXdfZGF0YVtpXSk7CisgIH0KKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWYsICZvdXRtYXApOworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZpbm1hcCk7CisKKyAgcmV0dXJuIGdzdF9hdWRpb19kZWNvZGVyX2ZpbmlzaF9mcmFtZSAoZGVjLCBvdXRidWYsIC0xKTsKKworZXJyb3JfZmFpbGVkX21hcF9vdXRwdXRfYnVmZmVyOgorICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWYpOworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZpbm1hcCk7CisKK2Vycm9yX2ZhaWxlZF9tYXBfaW5wdXRfYnVmZmVyOgorICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FsYXdfZGVjX3N0YXJ0IChHc3RBdWRpb0RlY29kZXIgKiBkZWMpCit7CisgIGdzdF9hdWRpb19kZWNvZGVyX3NldF9lc3RpbWF0ZV9yYXRlIChkZWMsIFRSVUUpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2FsYXdfZGVjX2NsYXNzX2luaXQgKEdzdEFMYXdEZWNDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RBdWRpb0RlY29kZXJDbGFzcyAqYXVkaW9kZWNfY2xhc3MgPSBHU1RfQVVESU9fREVDT0RFUl9DTEFTUyAoa2xhc3MpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmFsYXdfZGVjX3NyY19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmYWxhd19kZWNfc2lua19mYWN0b3J5KTsKKworICBhdWRpb2RlY19jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FsYXdfZGVjX3N0YXJ0KTsKKyAgYXVkaW9kZWNfY2xhc3MtPnNldF9mb3JtYXQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FsYXdfZGVjX3NldF9mb3JtYXQpOworICBhdWRpb2RlY19jbGFzcy0+aGFuZGxlX2ZyYW1lID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hbGF3X2RlY19oYW5kbGVfZnJhbWUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJBIExhdyBhdWRpbyBkZWNvZGVyIiwKKyAgICAgICJDb2RlYy9EZWNvZGVyL0F1ZGlvIiwKKyAgICAgICJDb252ZXJ0IDhiaXQgQSBsYXcgdG8gMTZiaXQgUENNIiwKKyAgICAgICJaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoYWxhd19kZWNfZGVidWcsICJhbGF3ZGVjIiwgMCwgIkEgTGF3IGF1ZGlvIGRlY29kZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hbGF3X2RlY19pbml0IChHc3RBTGF3RGVjICogYWxhd2RlYykKK3sKKyAgZ3N0X2F1ZGlvX2RlY29kZXJfc2V0X25lZWRzX2Zvcm1hdCAoR1NUX0FVRElPX0RFQ09ERVIgKGFsYXdkZWMpLCBUUlVFKTsKKyAgZ3N0X2F1ZGlvX2RlY29kZXJfc2V0X3VzZV9kZWZhdWx0X3BhZF9hY2NlcHRjYXBzIChHU1RfQVVESU9fREVDT0RFUl9DQVNUCisgICAgICAoYWxhd2RlYyksIFRSVUUpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9BVURJT19ERUNPREVSX1NJTktfUEFEIChhbGF3ZGVjKSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvbGF3L2FsYXctZGVjb2RlLmggYi9nc3QvbGF3L2FsYXctZGVjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2NDdkYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9sYXcvYWxhdy1kZWNvZGUuaApAQCAtMCwwICsxLDU1IEBACisvKiBHU3RyZWFtZXIgQS1MYXcgdG8gUENNIGNvbnZlcnNpb24KKyAqIENvcHlyaWdodCAoQykgMjAwMCBieSBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9BTEFXX0RFQ09ERV9IX18KKyNkZWZpbmUgX19HU1RfQUxBV19ERUNPREVfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9BTEFXX0RFQyBcCisgIChnc3RfYWxhd19kZWNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0FMQVdfREVDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQUxBV19ERUMsR3N0QUxhd0RlYykpCisjZGVmaW5lIEdTVF9BTEFXX0RFQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9BTEFXX0RFQyxHc3RBTGF3RGVjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQUxBV19ERUMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9BTEFXX0RFQykpCisjZGVmaW5lIEdTVF9JU19BTEFXX0RFQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9BTEFXX0RFQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBTGF3RGVjIEdzdEFMYXdEZWM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QUxhd0RlY0NsYXNzIEdzdEFMYXdEZWNDbGFzczsKKworc3RydWN0IF9Hc3RBTGF3RGVjIHsKKyAgR3N0QXVkaW9EZWNvZGVyIGVsZW1lbnQ7Cit9OworCitzdHJ1Y3QgX0dzdEFMYXdEZWNDbGFzcyB7CisgIEdzdEF1ZGlvRGVjb2RlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9hbGF3X2RlY19nZXRfdHlwZSh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0FMQVdfREVDT0RFX0hfXyAqLworCmRpZmYgLS1naXQgYS9nc3QvbGF3L2FsYXctZW5jb2RlLmMgYi9nc3QvbGF3L2FsYXctZW5jb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYxNzAwMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9sYXcvYWxhdy1lbmNvZGUuYwpAQCAtMCwwICsxLDQyNyBAQAorLyogR1N0cmVhbWVyIFBDTSB0byBBLUxhdyBjb252ZXJzaW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgYnkgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LWFsYXdlbmMKKyAqCisgKiBUaGlzIGVsZW1lbnQgZW5jb2RlIGFsYXcgYXVkaW8uIEFsYXcgY29kaW5nIGlzIGFsc28ga25vd24gYXMgRy43MTEuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSAiYWxhdy1lbmNvZGUuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoYWxhd19lbmNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgYWxhd19lbmNfZGVidWcKKworZXh0ZXJuIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGFsYXdfZW5jX3NyY19mYWN0b3J5OworZXh0ZXJuIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGFsYXdfZW5jX3NpbmtfZmFjdG9yeTsKKworR19ERUZJTkVfVFlQRSAoR3N0QUxhd0VuYywgZ3N0X2FsYXdfZW5jLCBHU1RfVFlQRV9BVURJT19FTkNPREVSKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hbGF3X2VuY19zdGFydCAoR3N0QXVkaW9FbmNvZGVyICogYXVkaW9lbmMpOworc3RhdGljIGdib29sZWFuIGdzdF9hbGF3X2VuY19zZXRfZm9ybWF0IChHc3RBdWRpb0VuY29kZXIgKiBlbmMsCisgICAgR3N0QXVkaW9JbmZvICogaW5mbyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfYWxhd19lbmNfaGFuZGxlX2ZyYW1lIChHc3RBdWRpb0VuY29kZXIgKiBlbmMsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKKworLyogc29tZSBkYXkgd2UgbWlnaHQgaGF2ZSBkZWZpbmVzIGluIGdzdGNvbmZpZy5oIHRoYXQgdGVsbCB1cyBhYm91dCB0aGUKKyAqIGRlc2lyZWQgY3B1L21lbW9yeS9iaW5hcnkgc2l6ZSB0cmFkZS1vZmZzICovCisjZGVmaW5lIEdTVF9BTEFXX0VOQ19VU0VfVEFCTEUKKworI2lmZGVmIEdTVF9BTEFXX0VOQ19VU0VfVEFCTEUKKworc3RhdGljIGNvbnN0IGd1aW50OCBhbGF3X2VuY29kZVsyMDQ4ICsgMV0gPSB7CisgIDB4ZDUsIDB4ZDQsIDB4ZDcsIDB4ZDYsIDB4ZDEsIDB4ZDAsIDB4ZDMsIDB4ZDIsIDB4ZGQsIDB4ZGMsIDB4ZGYsIDB4ZGUsCisgIDB4ZDksIDB4ZDgsIDB4ZGIsIDB4ZGEsIDB4YzUsIDB4YzQsIDB4YzcsIDB4YzYsIDB4YzEsIDB4YzAsIDB4YzMsIDB4YzIsCisgIDB4Y2QsIDB4Y2MsIDB4Y2YsIDB4Y2UsIDB4YzksIDB4YzgsIDB4Y2IsIDB4Y2EsIDB4ZjUsIDB4ZjUsIDB4ZjQsIDB4ZjQsCisgIDB4ZjcsIDB4ZjcsIDB4ZjYsIDB4ZjYsIDB4ZjEsIDB4ZjEsIDB4ZjAsIDB4ZjAsIDB4ZjMsIDB4ZjMsIDB4ZjIsIDB4ZjIsCisgIDB4ZmQsIDB4ZmQsIDB4ZmMsIDB4ZmMsIDB4ZmYsIDB4ZmYsIDB4ZmUsIDB4ZmUsIDB4ZjksIDB4ZjksIDB4ZjgsIDB4ZjgsCisgIDB4ZmIsIDB4ZmIsIDB4ZmEsIDB4ZmEsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTQsCisgIDB4ZTcsIDB4ZTcsIDB4ZTcsIDB4ZTcsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsCisgIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTMsIDB4ZTMsIDB4ZTMsIDB4ZTMsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTIsCisgIDB4ZWQsIDB4ZWQsIDB4ZWQsIDB4ZWQsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsCisgIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsCisgIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWEsIDB4ZWEsIDB4ZWEsIDB4ZWEsIDB4OTUsIDB4OTUsIDB4OTUsIDB4OTUsCisgIDB4OTUsIDB4OTUsIDB4OTUsIDB4OTUsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsCisgIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTYsIDB4OTYsIDB4OTYsIDB4OTYsCisgIDB4OTYsIDB4OTYsIDB4OTYsIDB4OTYsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisgIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTMsIDB4OTMsIDB4OTMsIDB4OTMsCisgIDB4OTMsIDB4OTMsIDB4OTMsIDB4OTMsIDB4OTIsIDB4OTIsIDB4OTIsIDB4OTIsIDB4OTIsIDB4OTIsIDB4OTIsIDB4OTIsCisgIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWMsIDB4OWMsIDB4OWMsIDB4OWMsCisgIDB4OWMsIDB4OWMsIDB4OWMsIDB4OWMsIDB4OWYsIDB4OWYsIDB4OWYsIDB4OWYsIDB4OWYsIDB4OWYsIDB4OWYsIDB4OWYsCisgIDB4OWUsIDB4OWUsIDB4OWUsIDB4OWUsIDB4OWUsIDB4OWUsIDB4OWUsIDB4OWUsIDB4OTksIDB4OTksIDB4OTksIDB4OTksCisgIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsCisgIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWEsIDB4OWEsIDB4OWEsIDB4OWEsCisgIDB4OWEsIDB4OWEsIDB4OWEsIDB4OWEsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsCisgIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsCisgIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsCisgIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsCisgIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsCisgIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsCisgIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsCisgIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsCisgIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsCisgIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGQsCisgIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGMsCisgIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsCisgIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsCisgIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsCisgIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksCisgIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsCisgIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsCisgIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsCisgIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsCisgIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsCisgIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsCisgIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsCisgIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsCisgIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsCisgIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsCisgIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsCisgIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsCisgIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsCisgIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsCisgIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsCisgIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsCisgIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsCisgIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsCisgIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsCisgIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsCisgIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsCisgIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsCisgIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsCisgIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsCisgIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsCisgIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsCisgIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsCisgIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsCisgIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsCisgIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsCisgIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsCisgIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YjksIDB4YjksIDB4YjksIDB4YjksCisgIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksCisgIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksCisgIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsCisgIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsCisgIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsCisgIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsCisgIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsCisgIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsCisgIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsCisgIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsCisgIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsCisgIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsCisgIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsCisgIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsCisgIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsCisgIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsCisgIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsCisgIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsCisgIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsCisgIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsCisgIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsCisgIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsCisgIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsCisgIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsCisgIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsCisgIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsCisgIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsCisgIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsCisgIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsCisgIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsCisgIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsCisgIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsCisgIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsCisgIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsCisgIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsCisgIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsCisgIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsCisgIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsCisgIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsCisgIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsCisgIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsCisgIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsCisgIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsCisgIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsCisgIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsCisgIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsCisgIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsCisgIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsCisgIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsCisgIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsCisgIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsCisgIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsCisgIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsCisgIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsCisgIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsCisgIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsCisgIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsCisgIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsCisgIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsCisgIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsCisgIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsCisgIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsCisgIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsCisgIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsCisgIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsCisgIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsCisgIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsCisgIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsCisgIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsCisgIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsCisgIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsCisgIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsCisgIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsCisgIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsCisgIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksCisgIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksCisgIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksCisgIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksCisgIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksCisgIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsCisgIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsCisgIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsCisgIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsCisgIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsCisgIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsCisgIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsCisgIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsCisgIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsCisgIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsCisgIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsCisgIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4MmEKK307CisKK3N0YXRpYyBpbmxpbmUgZ3VpbnQ4CitzMTZfdG9fYWxhdyAoZ2ludDE2IHBjbV92YWwpCit7CisgIGlmIChwY21fdmFsID49IDApCisgICAgcmV0dXJuIGFsYXdfZW5jb2RlW3BjbV92YWwgLyAxNl07CisgIGVsc2UKKyAgICByZXR1cm4gKDB4N0YgJiBhbGF3X2VuY29kZVtwY21fdmFsIC8gLTE2XSk7Cit9CisKKyNlbHNlIC8qIEdTVF9BTEFXX0VOQ19VU0VfVEFCTEUgKi8KKworLyoKKyAqIHMxNl90b19hbGF3KCkgLSBDb252ZXJ0IGEgMTYtYml0IGxpbmVhciBQQ00gdmFsdWUgdG8gOC1iaXQgQS1sYXcKKyAqCisgKiBzMTZfdG9fYWxhdygpIGFjY2VwdHMgYW4gMTYtYml0IGludGVnZXIgYW5kIGVuY29kZXMgaXQgYXMgQS1sYXcgZGF0YS4KKyAqCisgKiAgICAgICAgICAgICAgTGluZWFyIElucHV0IENvZGUgICAgICAgQ29tcHJlc3NlZCBDb2RlCisgKiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgIDAwMDAwMDB3eHl6YSAgICAgICAgICAgICAgICAgICAgMDAwd3h5egorICogICAgICAwMDAwMDAxd3h5emEgICAgICAgICAgICAgICAgICAgIDAwMXd4eXoKKyAqICAgICAgMDAwMDAxd3h5emFiICAgICAgICAgICAgICAgICAgICAwMTB3eHl6CisgKiAgICAgIDAwMDAxd3h5emFiYyAgICAgICAgICAgICAgICAgICAgMDExd3h5egorICogICAgICAwMDAxd3h5emFiY2QgICAgICAgICAgICAgICAgICAgIDEwMHd4eXoKKyAqICAgICAgMDAxd3h5emFiY2RlICAgICAgICAgICAgICAgICAgICAxMDF3eHl6CisgKiAgICAgIDAxd3h5emFiY2RlZiAgICAgICAgICAgICAgICAgICAgMTEwd3h5egorICogICAgICAxd3h5emFiY2RlZmcgICAgICAgICAgICAgICAgICAgIDExMXd4eXoKKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiBzZWUgSm9obiBDLiBCZWxsYW15J3MgRGlnaXRhbCBUZWxlcGhvbnksIDE5ODIsCisgKiBKb2huIFdpbGV5ICYgU29ucywgcHBzIDk4LTExMSBhbmQgNDcyLTQ3Ni4KKyAqLworCitzdGF0aWMgaW5saW5lIGdpbnQKK3ZhbF9zZWcgKGdpbnQgdmFsKQoreworICBnaW50IHIgPSAxOworCisgIHZhbCA+Pj0gODsKKyAgaWYgKHZhbCAmIDB4ZjApIHsKKyAgICB2YWwgPj49IDQ7CisgICAgciArPSA0OworICB9CisgIGlmICh2YWwgJiAweDBjKSB7CisgICAgdmFsID4+PSAyOworICAgIHIgKz0gMjsKKyAgfQorICBpZiAodmFsICYgMHgwMikKKyAgICByICs9IDE7CisgIHJldHVybiByOworfQorCitzdGF0aWMgaW5saW5lIGd1aW50OAorczE2X3RvX2FsYXcgKGdpbnQgcGNtX3ZhbCkKK3sKKyAgZ2ludCBzZWc7CisgIGd1aW50OCBtYXNrOworICBndWludDggYXZhbDsKKworICBpZiAocGNtX3ZhbCA+PSAwKSB7CisgICAgbWFzayA9IDB4RDU7CisgIH0gZWxzZSB7CisgICAgbWFzayA9IDB4NTU7CisgICAgcGNtX3ZhbCA9IC1wY21fdmFsOworICAgIGlmIChwY21fdmFsID4gMHg3ZmZmKQorICAgICAgcGNtX3ZhbCA9IDB4N2ZmZjsKKyAgfQorCisgIGlmIChwY21fdmFsIDwgMjU2KQorICAgIGF2YWwgPSBwY21fdmFsID4+IDQ7CisgIGVsc2UgeworICAgIC8qIENvbnZlcnQgdGhlIHNjYWxlZCBtYWduaXR1ZGUgdG8gc2VnbWVudCBudW1iZXIuICovCisgICAgc2VnID0gdmFsX3NlZyAocGNtX3ZhbCk7CisgICAgYXZhbCA9IChzZWcgPDwgNCkgfCAoKHBjbV92YWwgPj4gKHNlZyArIDMpKSAmIDB4MGYpOworICB9CisgIHJldHVybiBhdmFsIF4gbWFzazsKK30KKworI2VuZGlmIC8qIEdTVF9BTEFXX0VOQ19VU0VfVEFCTEUgKi8KKworc3RhdGljIGdib29sZWFuCitnc3RfYWxhd19lbmNfc3RhcnQgKEdzdEF1ZGlvRW5jb2RlciAqIGF1ZGlvZW5jKQoreworICBHc3RBTGF3RW5jICphbGF3ZW5jID0gR1NUX0FMQVdfRU5DIChhdWRpb2VuYyk7CisKKyAgYWxhd2VuYy0+Y2hhbm5lbHMgPSAwOworICBhbGF3ZW5jLT5yYXRlID0gMDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYWxhd19lbmNfc2V0X2Zvcm1hdCAoR3N0QXVkaW9FbmNvZGVyICogYXVkaW9lbmMsIEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIEdzdENhcHMgKmJhc2VfY2FwczsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdEFMYXdFbmMgKmFsYXdlbmMgPSBHU1RfQUxBV19FTkMgKGF1ZGlvZW5jKTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIGFsYXdlbmMtPnJhdGUgPSBpbmZvLT5yYXRlOworICBhbGF3ZW5jLT5jaGFubmVscyA9IGluZm8tPmNoYW5uZWxzOworCisgIGJhc2VfY2FwcyA9CisgICAgICBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX0FVRElPX0VOQ09ERVJfU1JDX1BBRCAoYXVkaW9lbmMpKTsKKyAgZ19hc3NlcnQgKGJhc2VfY2Fwcyk7CisgIGJhc2VfY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGJhc2VfY2Fwcyk7CisgIGdfYXNzZXJ0IChiYXNlX2NhcHMpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGJhc2VfY2FwcywgMCk7CisgIGdfYXNzZXJ0IChzdHJ1Y3R1cmUpOworICBnc3Rfc3RydWN0dXJlX3NldCAoc3RydWN0dXJlLCAicmF0ZSIsIEdfVFlQRV9JTlQsIGFsYXdlbmMtPnJhdGUsIE5VTEwpOworICBnc3Rfc3RydWN0dXJlX3NldCAoc3RydWN0dXJlLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBhbGF3ZW5jLT5jaGFubmVscywKKyAgICAgIE5VTEwpOworCisgIHJldCA9IGdzdF9hdWRpb19lbmNvZGVyX3NldF9vdXRwdXRfZm9ybWF0IChhdWRpb2VuYywgYmFzZV9jYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGJhc2VfY2Fwcyk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hbGF3X2VuY19oYW5kbGVfZnJhbWUgKEdzdEF1ZGlvRW5jb2RlciAqIGF1ZGlvZW5jLCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdEFMYXdFbmMgKmFsYXdlbmM7CisgIEdzdE1hcEluZm8gaW5tYXAsIG91dG1hcDsKKyAgZ2ludDE2ICpsaW5lYXJfZGF0YTsKKyAgZ3NpemUgbGluZWFyX3NpemU7CisgIGd1aW50OCAqYWxhd19kYXRhOworICBndWludCBhbGF3X3NpemU7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ2ludCBpOworCisgIGlmICghYnVmZmVyKSB7CisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgZ290byBkb25lOworICB9CisKKyAgYWxhd2VuYyA9IEdTVF9BTEFXX0VOQyAoYXVkaW9lbmMpOworCisgIGlmICghYWxhd2VuYy0+cmF0ZSB8fCAhYWxhd2VuYy0+Y2hhbm5lbHMpCisgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmaW5tYXAsIEdTVF9NQVBfUkVBRCk7CisgIGxpbmVhcl9kYXRhID0gKGdpbnQxNiAqKSBpbm1hcC5kYXRhOworICBsaW5lYXJfc2l6ZSA9IGlubWFwLnNpemU7CisKKyAgYWxhd19zaXplID0gbGluZWFyX3NpemUgLyAyOworCisgIG91dGJ1ZiA9IGdzdF9hdWRpb19lbmNvZGVyX2FsbG9jYXRlX291dHB1dF9idWZmZXIgKGF1ZGlvZW5jLCBhbGF3X3NpemUpOworCisgIGdfYXNzZXJ0IChvdXRidWYpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZvdXRtYXAsIEdTVF9NQVBfV1JJVEUpOworICBhbGF3X2RhdGEgPSBvdXRtYXAuZGF0YTsKKworICBmb3IgKGkgPSAwOyBpIDwgYWxhd19zaXplOyBpKyspIHsKKyAgICBhbGF3X2RhdGFbaV0gPSBzMTZfdG9fYWxhdyAobGluZWFyX2RhdGFbaV0pOworICB9CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmb3V0bWFwKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmaW5tYXApOworCisgIHJldCA9IGdzdF9hdWRpb19lbmNvZGVyX2ZpbmlzaF9mcmFtZSAoYXVkaW9lbmMsIG91dGJ1ZiwgLTEpOworCitkb25lOgorICByZXR1cm4gcmV0OworCitub3RfbmVnb3RpYXRlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFsYXdlbmMsICJubyBmb3JtYXQgbmVnb3RpYXRlZCIpOworICAgIHJldCA9IEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICAgIGdvdG8gZG9uZTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2FsYXdfZW5jX2NsYXNzX2luaXQgKEdzdEFMYXdFbmNDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBHc3RBdWRpb0VuY29kZXJDbGFzcyAqYXVkaW9fZW5jb2Rlcl9jbGFzcyA9IEdTVF9BVURJT19FTkNPREVSX0NMQVNTIChrbGFzcyk7CisKKyAgYXVkaW9fZW5jb2Rlcl9jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FsYXdfZW5jX3N0YXJ0KTsKKyAgYXVkaW9fZW5jb2Rlcl9jbGFzcy0+c2V0X2Zvcm1hdCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWxhd19lbmNfc2V0X2Zvcm1hdCk7CisgIGF1ZGlvX2VuY29kZXJfY2xhc3MtPmhhbmRsZV9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FsYXdfZW5jX2hhbmRsZV9mcmFtZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmYWxhd19lbmNfc3JjX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZhbGF3X2VuY19zaW5rX2ZhY3RvcnkpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiQSBMYXcgYXVkaW8gZW5jb2RlciIsICJDb2RlYy9FbmNvZGVyL0F1ZGlvIiwKKyAgICAgICJDb252ZXJ0IDE2Yml0IFBDTSB0byA4Yml0IEEgbGF3IiwKKyAgICAgICJaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4iKTsKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGFsYXdfZW5jX2RlYnVnLCAiYWxhd2VuYyIsIDAsICJBIExhdyBhdWRpbyBlbmNvZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYWxhd19lbmNfaW5pdCAoR3N0QUxhd0VuYyAqIGFsYXdlbmMpCit7CisgIEdTVF9QQURfU0VUX0FDQ0VQVF9URU1QTEFURSAoR1NUX0FVRElPX0VOQ09ERVJfU0lOS19QQUQgKGFsYXdlbmMpKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9sYXcvYWxhdy1lbmNvZGUuaCBiL2dzdC9sYXcvYWxhdy1lbmNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjA4ZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2xhdy9hbGF3LWVuY29kZS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qIEdTdHJlYW1lciBQQ00gdG8gQS1MYXcgY29udmVyc2lvbgorICogQ29weXJpZ2h0IChDKSAyMDAwIGJ5IEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfQUxBV19FTkNPREVfSF9fCisjZGVmaW5lIF9fR1NUX0FMQVdfRU5DT0RFX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQUxBV19FTkMgXAorICAoZ3N0X2FsYXdfZW5jX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9BTEFXX0VOQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0FMQVdfRU5DLEdzdEFMYXdFbmMpKQorI2RlZmluZSBHU1RfQUxBV19FTkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfQUxBV19FTkMsR3N0QUxhd0VuY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FMQVdfRU5DKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQUxBV19FTkMpKQorI2RlZmluZSBHU1RfSVNfQUxBV19FTkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfQUxBV19FTkMpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0QUxhd0VuYyBHc3RBTGF3RW5jOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEFMYXdFbmNDbGFzcyBHc3RBTGF3RW5jQ2xhc3M7CisKK3N0cnVjdCBfR3N0QUxhd0VuYyB7CisgIEdzdEF1ZGlvRW5jb2RlciBlbmNvZGVyOworCisgIGdpbnQgY2hhbm5lbHM7CisgIGdpbnQgcmF0ZTsKK307CisKK3N0cnVjdCBfR3N0QUxhd0VuY0NsYXNzIHsKKyAgR3N0QXVkaW9FbmNvZGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2FsYXdfZW5jX2dldF90eXBlKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfQUxBV19FTkNPREVfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvbGF3L2FsYXcuYyBiL2dzdC9sYXcvYWxhdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZjdlMDYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbGF3L2FsYXcuYwpAQCAtMCwwICsxLDc3IEBACisvKiBHU3RyZWFtZXIgUENNL0EtTGF3IGNvbnZlcnNpb25zCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgImFsYXctZW5jb2RlLmgiCisjaW5jbHVkZSAiYWxhdy1kZWNvZGUuaCIKKworR3N0U3RhdGljUGFkVGVtcGxhdGUgYWxhd19kZWNfc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChTMTYpICIsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyA4MDAwLCAxOTIwMDAgXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDIgXSIpCisgICAgKTsKKworR3N0U3RhdGljUGFkVGVtcGxhdGUgYWxhd19kZWNfc2lua19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1hbGF3LCAiCisgICAgICAgICJyYXRlID0gWyA4MDAwICwgMTkyMDAwIF0sICIgImNoYW5uZWxzID0gWyAxICwgMiBdIikKKyAgICApOworCitHc3RTdGF0aWNQYWRUZW1wbGF0ZSBhbGF3X2VuY19zaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKFMxNikgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDgwMDAsIDE5MjAwMCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdIikKKyAgICApOworCitHc3RTdGF0aWNQYWRUZW1wbGF0ZSBhbGF3X2VuY19zcmNfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LWFsYXcsICIKKyAgICAgICAgInJhdGUgPSBbIDgwMDAgLCAxOTIwMDAgXSwgIiAiY2hhbm5lbHMgPSBbIDEgLCAyIF0iKQorICAgICk7CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYWxhd2VuYyIsCisgICAgICAgICAgR1NUX1JBTktfUFJJTUFSWSwgR1NUX1RZUEVfQUxBV19FTkMpIHx8CisgICAgICAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImFsYXdkZWMiLAorICAgICAgICAgIEdTVF9SQU5LX1BSSU1BUlksIEdTVF9UWVBFX0FMQVdfREVDKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIEZJWE1FIDAuMTE6IG1lcmdlIGFsYXcgYW5kIG11bGF3IGludG8gb25lIHBsdWdpbj8gKi8KK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBhbGF3LAorICAgICJBTGF3IGF1ZGlvIGNvbnZlcnNpb24gcm91dGluZXMiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L2xhdy9tZXNvbi5idWlsZCBiL2dzdC9sYXcvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYxODEwZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9sYXcvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxNyBAQAorZ3N0YWxhdyA9IGxpYnJhcnkoJ2dzdGFsYXcnLAorICAnYWxhdy1lbmNvZGUuYycsICdhbGF3LWRlY29kZS5jJywgJ2FsYXcuYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0YmFzZV9kZXAsIGdzdGF1ZGlvX2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCisKK2dzdG11bGF3ID0gbGlicmFyeSgnZ3N0bXVsYXcnLAorICAnbXVsYXctZW5jb2RlLmMnLCAnbXVsYXctY29udmVyc2lvbi5jJywgJ211bGF3LWRlY29kZS5jJywgJ211bGF3LmMnLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdGJhc2VfZGVwLCBnc3RhdWRpb19kZXBdLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L2xhdy9tdWxhdy1jb252ZXJzaW9uLmMgYi9nc3QvbGF3L211bGF3LWNvbnZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWNkZTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2xhdy9tdWxhdy1jb252ZXJzaW9uLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBUaGlzIHJvdXRpbmUgY29udmVydHMgZnJvbSBsaW5lYXIgdG8gdWxhdworICogMjkgU2VwdGVtYmVyIDE5ODkKKyAqCisgKiBDcmFpZyBSZWVzZTogSURBL1N1cGVyY29tcHV0aW5nIFJlc2VhcmNoIENlbnRlcgorICogSm9lIENhbXBiZWxsOiBEZXBhcnRtZW50IG9mIERlZmVuc2UKKyAqCisgKiBSZWZlcmVuY2VzOgorICogMSkgQ0NJVFQgUmVjb21tZW5kYXRpb24gRy43MTEgICh2ZXJ5IGRpZmZpY3VsdCB0byBmb2xsb3cpCisgKiAyKSAiQSBOZXcgRGlnaXRhbCBUZWNobmlxdWUgZm9yIEltcGxlbWVudGF0aW9uIG9mIEFueSAKKyAqICAgICBDb250aW51b3VzIFBDTSBDb21wYW5kaW5nIExhdywiIFZpbGxlcmV0LCBNaWNoZWwsCisgKiAgICAgZXQgYWwuIDE5NzMgSUVFRSBJbnQuIENvbmYuIG9uIENvbW11bmljYXRpb25zLCBWb2wgMSwKKyAqICAgICAxOTczLCBwZy4gMTEuMTItMTEuMTcKKyAqIDMpIE1JTC1TVEQtMTg4LTExMywiSW50ZXJvcGVyYWJpbGl0eSBhbmQgUGVyZm9ybWFuY2UgU3RhbmRhcmRzCisgKiAgICAgZm9yIEFuYWxvZy10b19EaWdpdGFsIENvbnZlcnNpb24gVGVjaG5pcXVlcywiCisgKiAgICAgMTcgRmVicnVhcnkgMTk4NworICoKKyAqIElucHV0OiBTaWduZWQgMTYgYml0IGxpbmVhciBzYW1wbGUKKyAqIE91dHB1dDogOCBiaXQgdWxhdyBzYW1wbGUKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlICJtdWxhdy1jb252ZXJzaW9uLmgiCisKKyN1bmRlZiBaRVJPVFJBUCAgICAgICAgICAgICAgICAgLyogdHVybiBvbiB0aGUgdHJhcCBhcyBwZXIgdGhlIE1JTC1TVEQgKi8KKyNkZWZpbmUgQklBUyAweDg0ICAgICAgICAgICAgICAgLyogZGVmaW5lIHRoZSBhZGQtaW4gYmlhcyBmb3IgMTYgYml0IHNhbXBsZXMgKi8KKyNkZWZpbmUgQ0xJUCAzMjYzNQorCit2b2lkCittdWxhd19lbmNvZGUgKGdpbnQxNiAqIGluLCBndWludDggKiBvdXQsIGdpbnQgbnVtc2FtcGxlcykKK3sKKyAgc3RhdGljIGNvbnN0IGdpbnQxNiBleHBfbHV0WzI1Nl0gPSB7CisgICAgMCwgMCwgMSwgMSwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCisgICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwKKyAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCisgICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwKKyAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywKKyAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywKKyAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNworICB9OworICBnaW50MTYgc2lnbiwgZXhwb25lbnQsIG1hbnRpc3NhOworICBnaW50MTYgc2FtcGxlOworICBndWludDggdWxhd2J5dGU7CisgIGdpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtc2FtcGxlczsgaSsrKSB7CisgICAgc2FtcGxlID0gaW5baV07CisgICAgICAvKiogZ2V0IHRoZSBzYW1wbGUgaW50byBzaWduLW1hZ25pdHVkZSAqKi8KKyAgICBzaWduID0gKHNhbXBsZSA+PiA4KSAmIDB4ODA7ICAgICAgICAvKiBzZXQgYXNpZGUgdGhlIHNpZ24gKi8KKyAgICBpZiAoc2lnbiAhPSAwKSB7CisgICAgICBzYW1wbGUgPSAtc2FtcGxlOyAgICAgICAgIC8qIGdldCBtYWduaXR1ZGUgKi8KKyAgICB9CisgICAgLyogc2FtcGxlIGNhbiBiZSB6ZXJvIGJlY2F1c2Ugd2UgY2FuIG92ZXJmbG93IGluIHRoZSBpbnZlcnNpb24sCisgICAgICogY2hlY2tpbmcgYWdhaW5zdCB0aGUgdW5zaWduZWQgdmVyc2lvbiBzb2x2ZXMgdGhpcyAqLworICAgIGlmICgoKGd1aW50MTYpIHNhbXBsZSkgPiBDTElQKQorICAgICAgc2FtcGxlID0gQ0xJUDsgICAgICAgICAgICAvKiBjbGlwIHRoZSBtYWduaXR1ZGUgKi8KKworICAgICAgLyoqIGNvbnZlcnQgZnJvbSAxNiBiaXQgbGluZWFyIHRvIHVsYXcgKiovCisgICAgc2FtcGxlID0gc2FtcGxlICsgQklBUzsKKyAgICBleHBvbmVudCA9IGV4cF9sdXRbKHNhbXBsZSA+PiA3KSAmIDB4RkZdOworICAgIG1hbnRpc3NhID0gKHNhbXBsZSA+PiAoZXhwb25lbnQgKyAzKSkgJiAweDBGOworICAgIHVsYXdieXRlID0gfihzaWduIHwgKGV4cG9uZW50IDw8IDQpIHwgbWFudGlzc2EpOworI2lmZGVmIFpFUk9UUkFQCisgICAgaWYgKHVsYXdieXRlID09IDApCisgICAgICB1bGF3Ynl0ZSA9IDB4MDI7ICAgICAgICAgIC8qIG9wdGlvbmFsIENDSVRUIHRyYXAgKi8KKyNlbmRpZgorICAgIG91dFtpXSA9IHVsYXdieXRlOworICB9Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgY29udmVydHMgZnJvbSB1bGF3IHRvIDE2IGJpdCBsaW5lYXIKKyAqIDI5IFNlcHRlbWJlciAxOTg5CisgKgorICogQ3JhaWcgUmVlc2U6IElEQS9TdXBlcmNvbXB1dGluZyBSZXNlYXJjaCBDZW50ZXIKKyAqCisgKiBSZWZlcmVuY2VzOgorICogMSkgQ0NJVFQgUmVjb21tZW5kYXRpb24gRy43MTEgICh2ZXJ5IGRpZmZpY3VsdCB0byBmb2xsb3cpCisgKiAyKSBNSUwtU1RELTE4OC0xMTMsIkludGVyb3BlcmFiaWxpdHkgYW5kIFBlcmZvcm1hbmNlIFN0YW5kYXJkcworICogICAgIGZvciBBbmFsb2ctdG9fRGlnaXRhbCBDb252ZXJzaW9uIFRlY2huaXF1ZXMsIgorICogICAgIDE3IEZlYnJ1YXJ5IDE5ODcKKyAqCisgKiBJbnB1dDogOCBiaXQgdWxhdyBzYW1wbGUKKyAqIE91dHB1dDogc2lnbmVkIDE2IGJpdCBsaW5lYXIgc2FtcGxlCisgKi8KKwordm9pZAorbXVsYXdfZGVjb2RlIChndWludDggKiBpbiwgZ2ludDE2ICogb3V0LCBnaW50IG51bXNhbXBsZXMpCit7CisgIHN0YXRpYyBjb25zdCBnaW50MTYgZXhwX2x1dFs4XSA9CisgICAgICB7IDAsIDEzMiwgMzk2LCA5MjQsIDE5ODAsIDQwOTIsIDgzMTYsIDE2NzY0IH07CisgIGdpbnQxNiBzaWduLCBleHBvbmVudCwgbWFudGlzc2E7CisgIGd1aW50OCB1bGF3Ynl0ZTsKKyAgZ2ludDE2IGxpbmVhcjsKKyAgZ2ludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1zYW1wbGVzOyBpKyspIHsKKyAgICB1bGF3Ynl0ZSA9IGluW2ldOworICAgIHVsYXdieXRlID0gfnVsYXdieXRlOworICAgIHNpZ24gPSAodWxhd2J5dGUgJiAweDgwKTsKKyAgICBleHBvbmVudCA9ICh1bGF3Ynl0ZSA+PiA0KSAmIDB4MDc7CisgICAgbWFudGlzc2EgPSB1bGF3Ynl0ZSAmIDB4MEY7CisgICAgbGluZWFyID0gZXhwX2x1dFtleHBvbmVudF0gKyAobWFudGlzc2EgPDwgKGV4cG9uZW50ICsgMykpOworICAgIGlmIChzaWduICE9IDApCisgICAgICBsaW5lYXIgPSAtbGluZWFyOworICAgIG91dFtpXSA9IGxpbmVhcjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3N0L2xhdy9tdWxhdy1jb252ZXJzaW9uLmggYi9nc3QvbGF3L211bGF3LWNvbnZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODM2N2FkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2xhdy9tdWxhdy1jb252ZXJzaW9uLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfR1NUX1VMQVdfQ09OVkVSU0lPTl9ICisjZGVmaW5lIF9HU1RfVUxBV19DT05WRVJTSU9OX0gKKworI2luY2x1ZGUgPGdsaWIuaD4KKwordm9pZAorbXVsYXdfZW5jb2RlKGdpbnQxNiogaW4sIGd1aW50OCogb3V0LCBnaW50IG51bXNhbXBsZXMpOwordm9pZAorbXVsYXdfZGVjb2RlKGd1aW50OCogaW4sZ2ludDE2KiBvdXQsZ2ludCBudW1zYW1wbGVzKTsKKworI2VuZGlmIC8qIF9HU1RfVUxBV19DT05WRVJTSU9OX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYyBiL2dzdC9sYXcvbXVsYXctZGVjb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE3MGQwYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9sYXcvbXVsYXctZGVjb2RlLmMKQEAgLTAsMCArMSwxNzYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtbXVsYXdkZWMKKyAqCisgKiBUaGlzIGVsZW1lbnQgZGVjb2RlcyBtdWxhdyBhdWRpby4gTXVsYXcgY29kaW5nIGlzIGFsc28ga25vd24gYXMgRy43MTEuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgIm11bGF3LWRlY29kZS5oIgorI2luY2x1ZGUgIm11bGF3LWNvbnZlcnNpb24uaCIKKworZXh0ZXJuIEdzdFN0YXRpY1BhZFRlbXBsYXRlIG11bGF3X2RlY19zcmNfZmFjdG9yeTsKK2V4dGVybiBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBtdWxhd19kZWNfc2lua19mYWN0b3J5OworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X211bGF3ZGVjX3NldF9mb3JtYXQgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYywgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X211bGF3ZGVjX2hhbmRsZV9mcmFtZSAoR3N0QXVkaW9EZWNvZGVyICogZGVjLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKKworLyogU3RlcmVvIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAKK307CisKKyNkZWZpbmUgZ3N0X211bGF3ZGVjX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdE11TGF3RGVjLCBnc3RfbXVsYXdkZWMsIEdTVF9UWVBFX0FVRElPX0RFQ09ERVIpOworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWxhd2RlY19zZXRfZm9ybWF0IChHc3RBdWRpb0RlY29kZXIgKiBkZWMsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RNdUxhd0RlYyAqbXVsYXdkZWMgPSBHU1RfTVVMQVdERUMgKGRlYyk7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBpbnQgcmF0ZSwgY2hhbm5lbHM7CisgIEdzdEF1ZGlvSW5mbyBpbmZvOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBpZiAoIXN0cnVjdHVyZSkgeworICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBnZXQgc3RydWN0dXJlIGZyb20gY2FwcyIpOworICAgIGdvdG8gZXJyb3JfZmFpbGVkX2dldF9zdHJ1Y3R1cmU7CisgIH0KKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAicmF0ZSIsICZyYXRlKSkgeworICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBmaW5kIGZpZWxkIHJhdGUgaW4gaW5wdXQgY2FwcyIpOworICAgIGdvdG8gZXJyb3JfZmFpbGVkX2ZpbmRfcmF0ZTsKKyAgfQorCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsICZjaGFubmVscykpIHsKKyAgICBHU1RfRVJST1IgKCJmYWlsZWQgdG8gZmluZCBmaWVsZCBjaGFubmVscyBpbiBpbnB1dCBjYXBzIik7CisgICAgZ290byBlcnJvcl9mYWlsZWRfZmluZF9jaGFubmVsOworICB9CisKKyAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoJmluZm8pOworICBnc3RfYXVkaW9faW5mb19zZXRfZm9ybWF0ICgmaW5mbywgR1NUX0FVRElPX0ZPUk1BVF9TMTYsIHJhdGUsIGNoYW5uZWxzLCBOVUxMKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChtdWxhd2RlYywgInJhdGU9JWQsIGNoYW5uZWxzPSVkIiwgcmF0ZSwgY2hhbm5lbHMpOworCisgIHJldHVybiBnc3RfYXVkaW9fZGVjb2Rlcl9zZXRfb3V0cHV0X2Zvcm1hdCAoZGVjLCAmaW5mbyk7CisKK2Vycm9yX2ZhaWxlZF9maW5kX2NoYW5uZWw6CitlcnJvcl9mYWlsZWRfZmluZF9yYXRlOgorZXJyb3JfZmFpbGVkX2dldF9zdHJ1Y3R1cmU6CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tdWxhd2RlY19oYW5kbGVfZnJhbWUgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYywgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RNYXBJbmZvIGlubWFwLCBvdXRtYXA7CisgIGdpbnQxNiAqbGluZWFyX2RhdGE7CisgIGd1aW50OCAqbXVsYXdfZGF0YTsKKyAgZ3NpemUgbXVsYXdfc2l6ZSwgbGluZWFyX3NpemU7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworCisgIGlmICghYnVmZmVyKSB7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CisKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmaW5tYXAsIEdTVF9NQVBfUkVBRCkpIHsKKyAgICBHU1RfRVJST1IgKCJmYWlsZWQgdG8gbWFwIGlucHV0IGJ1ZmZlciIpOworICAgIGdvdG8gZXJyb3JfZmFpbGVkX21hcF9pbnB1dF9idWZmZXI7CisgIH0KKworICBtdWxhd19kYXRhID0gaW5tYXAuZGF0YTsKKyAgbXVsYXdfc2l6ZSA9IGlubWFwLnNpemU7CisKKyAgbGluZWFyX3NpemUgPSBtdWxhd19zaXplICogMjsKKworICBvdXRidWYgPSBnc3RfYXVkaW9fZGVjb2Rlcl9hbGxvY2F0ZV9vdXRwdXRfYnVmZmVyIChkZWMsIGxpbmVhcl9zaXplKTsKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmb3V0bWFwLCBHU1RfTUFQX1dSSVRFKSkgeworICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBtYXAgaW5wdXQgYnVmZmVyIik7CisgICAgZ290byBlcnJvcl9mYWlsZWRfbWFwX291dHB1dF9idWZmZXI7CisgIH0KKworICBsaW5lYXJfZGF0YSA9IChnaW50MTYgKikgb3V0bWFwLmRhdGE7CisKKyAgbXVsYXdfZGVjb2RlIChtdWxhd19kYXRhLCBsaW5lYXJfZGF0YSwgbXVsYXdfc2l6ZSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmb3V0bWFwKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmaW5tYXApOworCisgIHJldHVybiBnc3RfYXVkaW9fZGVjb2Rlcl9maW5pc2hfZnJhbWUgKGRlYywgb3V0YnVmLCAtMSk7CisKK2Vycm9yX2ZhaWxlZF9tYXBfb3V0cHV0X2J1ZmZlcjoKKyAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmaW5tYXApOworCitlcnJvcl9mYWlsZWRfbWFwX2lucHV0X2J1ZmZlcjoKKyAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWxhd2RlY19zdGFydCAoR3N0QXVkaW9EZWNvZGVyICogZGVjKQoreworICBnc3RfYXVkaW9fZGVjb2Rlcl9zZXRfZXN0aW1hdGVfcmF0ZSAoZGVjLCBUUlVFKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWxhd2RlY19jbGFzc19pbml0IChHc3RNdUxhd0RlY0NsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdEF1ZGlvRGVjb2RlckNsYXNzICphdWRpb2RlY19jbGFzcyA9IEdTVF9BVURJT19ERUNPREVSX0NMQVNTIChrbGFzcyk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmbXVsYXdfZGVjX3NyY19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmbXVsYXdfZGVjX3NpbmtfZmFjdG9yeSk7CisKKworICBhdWRpb2RlY19jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X211bGF3ZGVjX3N0YXJ0KTsKKyAgYXVkaW9kZWNfY2xhc3MtPnNldF9mb3JtYXQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X211bGF3ZGVjX3NldF9mb3JtYXQpOworICBhdWRpb2RlY19jbGFzcy0+aGFuZGxlX2ZyYW1lID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tdWxhd2RlY19oYW5kbGVfZnJhbWUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJNdSBMYXcgYXVkaW8gZGVjb2RlciIsCisgICAgICAiQ29kZWMvRGVjb2Rlci9BdWRpbyIsCisgICAgICAiQ29udmVydCA4Yml0IG11IGxhdyB0byAxNmJpdCBQQ00iLAorICAgICAgIlphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X211bGF3ZGVjX2luaXQgKEdzdE11TGF3RGVjICogbXVsYXdkZWMpCit7CisgIGdzdF9hdWRpb19kZWNvZGVyX3NldF9uZWVkc19mb3JtYXQgKEdTVF9BVURJT19ERUNPREVSIChtdWxhd2RlYyksIFRSVUUpOworICBnc3RfYXVkaW9fZGVjb2Rlcl9zZXRfdXNlX2RlZmF1bHRfcGFkX2FjY2VwdGNhcHMgKEdTVF9BVURJT19ERUNPREVSX0NBU1QKKyAgICAgIChtdWxhd2RlYyksIFRSVUUpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9BVURJT19ERUNPREVSX1NJTktfUEFEIChtdWxhd2RlYykpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2xhdy9tdWxhdy1kZWNvZGUuaCBiL2dzdC9sYXcvbXVsYXctZGVjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkNjJmYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9sYXcvbXVsYXctZGVjb2RlLmgKQEAgLTAsMCArMSw1NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfTVVMQVdERUNPREVfSF9fCisjZGVmaW5lIF9fR1NUX01VTEFXREVDT0RFX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb2RlY29kZXIuaD4KKworR19CRUdJTl9ERUNMUworI2RlZmluZSBHU1RfVFlQRV9NVUxBV0RFQyBcCisgIChnc3RfbXVsYXdkZWNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX01VTEFXREVDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfTVVMQVdERUMsR3N0TXVMYXdEZWMpKQorI2RlZmluZSBHU1RfTVVMQVdERUNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfTVVMQVdERUMsR3N0TXVMYXdEZWNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19NVUxBV0RFQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX01VTEFXREVDKSkKKyNkZWZpbmUgR1NUX0lTX01VTEFXREVDX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX01VTEFXREVDKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RNdUxhd0RlYyBHc3RNdUxhd0RlYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RNdUxhd0RlY0NsYXNzIEdzdE11TGF3RGVjQ2xhc3M7CisKK3N0cnVjdCBfR3N0TXVMYXdEZWMKK3sKKyAgR3N0QXVkaW9EZWNvZGVyIGVsZW1lbnQ7Cit9OworCitzdHJ1Y3QgX0dzdE11TGF3RGVjQ2xhc3MKK3sKKyAgR3N0QXVkaW9EZWNvZGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X211bGF3ZGVjX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9TVEVSRU9fSF9fICovCmRpZmYgLS1naXQgYS9nc3QvbGF3L211bGF3LWVuY29kZS5jIGIvZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjJjZTBkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYwpAQCAtMCwwICsxLDIxMSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1tdWxhd2VuYworICoKKyAqIFRoaXMgZWxlbWVudCBlbmNvZGUgbXVsYXcgYXVkaW8uIE11bGF3IGNvZGluZyBpcyBhbHNvIGtub3duIGFzIEcuNzExLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJtdWxhdy1lbmNvZGUuaCIKKyNpbmNsdWRlICJtdWxhdy1jb252ZXJzaW9uLmgiCisKK2V4dGVybiBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBtdWxhd19lbmNfc3JjX2ZhY3Rvcnk7CitleHRlcm4gR3N0U3RhdGljUGFkVGVtcGxhdGUgbXVsYXdfZW5jX3NpbmtfZmFjdG9yeTsKKworLyogU3RlcmVvIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAKK307CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbXVsYXdlbmNfc3RhcnQgKEdzdEF1ZGlvRW5jb2RlciAqIGF1ZGlvZW5jKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbXVsYXdlbmNfc2V0X2Zvcm1hdCAoR3N0QXVkaW9FbmNvZGVyICogZW5jLAorICAgIEdzdEF1ZGlvSW5mbyAqIGluZm8pOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X211bGF3ZW5jX2hhbmRsZV9mcmFtZSAoR3N0QXVkaW9FbmNvZGVyICogZW5jLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CitzdGF0aWMgdm9pZCBnc3RfbXVsYXdlbmNfc2V0X3RhZ3MgKEdzdE11TGF3RW5jICogbXVsYXdlbmMpOworCisKKyNkZWZpbmUgZ3N0X211bGF3ZW5jX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdE11TGF3RW5jLCBnc3RfbXVsYXdlbmMsIEdTVF9UWVBFX0FVRElPX0VOQ09ERVIpOworCisvKnN0YXRpYyBndWludCBnc3Rfc3RlcmVvX3NpZ25hbHNbTEFTVF9TSUdOQUxdID0geyAwIH07ICovCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X211bGF3ZW5jX3N0YXJ0IChHc3RBdWRpb0VuY29kZXIgKiBhdWRpb2VuYykKK3sKKyAgR3N0TXVMYXdFbmMgKm11bGF3ZW5jID0gR1NUX01VTEFXRU5DIChhdWRpb2VuYyk7CisKKyAgbXVsYXdlbmMtPmNoYW5uZWxzID0gMDsKKyAgbXVsYXdlbmMtPnJhdGUgPSAwOworCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyB2b2lkCitnc3RfbXVsYXdlbmNfc2V0X3RhZ3MgKEdzdE11TGF3RW5jICogbXVsYXdlbmMpCit7CisgIEdzdFRhZ0xpc3QgKnRhZ2xpc3Q7CisgIGd1aW50IGJpdHJhdGU7CisKKyAgLyogYml0cmF0ZSBvZiBtdWxhdyBpcyA4IGJpdHMvc2FtcGxlICogc2FtcGxlIHJhdGUgKiBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgYml0cmF0ZSA9IDggKiBtdWxhd2VuYy0+cmF0ZSAqIG11bGF3ZW5jLT5jaGFubmVsczsKKworICB0YWdsaXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZ3N0X3RhZ19saXN0X2FkZCAodGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgR1NUX1RBR19NQVhJTVVNX0JJVFJBVEUsIGJpdHJhdGUsIE5VTEwpOworICBnc3RfdGFnX2xpc3RfYWRkICh0YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICBHU1RfVEFHX01JTklNVU1fQklUUkFURSwgYml0cmF0ZSwgTlVMTCk7CisgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgIEdTVF9UQUdfQklUUkFURSwgYml0cmF0ZSwgTlVMTCk7CisKKyAgZ3N0X2F1ZGlvX2VuY29kZXJfbWVyZ2VfdGFncyAoR1NUX0FVRElPX0VOQ09ERVIgKG11bGF3ZW5jKSwKKyAgICAgIHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSk7CisKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdsaXN0KTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWxhd2VuY19zZXRfZm9ybWF0IChHc3RBdWRpb0VuY29kZXIgKiBhdWRpb2VuYywgR3N0QXVkaW9JbmZvICogaW5mbykKK3sKKyAgR3N0Q2FwcyAqYmFzZV9jYXBzOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgR3N0TXVMYXdFbmMgKm11bGF3ZW5jID0gR1NUX01VTEFXRU5DIChhdWRpb2VuYyk7CisgIGdib29sZWFuIHJldDsKKworICBtdWxhd2VuYy0+cmF0ZSA9IGluZm8tPnJhdGU7CisgIG11bGF3ZW5jLT5jaGFubmVscyA9IGluZm8tPmNoYW5uZWxzOworCisgIGJhc2VfY2FwcyA9CisgICAgICBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX0FVRElPX0VOQ09ERVJfU1JDX1BBRCAoYXVkaW9lbmMpKTsKKyAgZ19hc3NlcnQgKGJhc2VfY2Fwcyk7CisgIGJhc2VfY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGJhc2VfY2Fwcyk7CisgIGdfYXNzZXJ0IChiYXNlX2NhcHMpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGJhc2VfY2FwcywgMCk7CisgIGdfYXNzZXJ0IChzdHJ1Y3R1cmUpOworICBnc3Rfc3RydWN0dXJlX3NldCAoc3RydWN0dXJlLCAicmF0ZSIsIEdfVFlQRV9JTlQsIG11bGF3ZW5jLT5yYXRlLCBOVUxMKTsKKyAgZ3N0X3N0cnVjdHVyZV9zZXQgKHN0cnVjdHVyZSwgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgbXVsYXdlbmMtPmNoYW5uZWxzLAorICAgICAgTlVMTCk7CisKKyAgZ3N0X211bGF3ZW5jX3NldF90YWdzIChtdWxhd2VuYyk7CisKKyAgcmV0ID0gZ3N0X2F1ZGlvX2VuY29kZXJfc2V0X291dHB1dF9mb3JtYXQgKGF1ZGlvZW5jLCBiYXNlX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoYmFzZV9jYXBzKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X211bGF3ZW5jX2hhbmRsZV9mcmFtZSAoR3N0QXVkaW9FbmNvZGVyICogYXVkaW9lbmMsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0TXVMYXdFbmMgKm11bGF3ZW5jOworICBHc3RNYXBJbmZvIGlubWFwLCBvdXRtYXA7CisgIGdpbnQxNiAqbGluZWFyX2RhdGE7CisgIGdzaXplIGxpbmVhcl9zaXplOworICBndWludDggKm11bGF3X2RhdGE7CisgIGd1aW50IG11bGF3X3NpemU7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBpZiAoIWJ1ZmZlcikgeworICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIG11bGF3ZW5jID0gR1NUX01VTEFXRU5DIChhdWRpb2VuYyk7CisKKyAgaWYgKCFtdWxhd2VuYy0+cmF0ZSB8fCAhbXVsYXdlbmMtPmNoYW5uZWxzKQorICAgIGdvdG8gbm90X25lZ290aWF0ZWQ7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJmlubWFwLCBHU1RfTUFQX1JFQUQpOworICBsaW5lYXJfZGF0YSA9IChnaW50MTYgKikgaW5tYXAuZGF0YTsKKyAgbGluZWFyX3NpemUgPSBpbm1hcC5zaXplOworCisgIG11bGF3X3NpemUgPSBsaW5lYXJfc2l6ZSAvIDI7CisKKyAgb3V0YnVmID0gZ3N0X2F1ZGlvX2VuY29kZXJfYWxsb2NhdGVfb3V0cHV0X2J1ZmZlciAoYXVkaW9lbmMsIG11bGF3X3NpemUpOworCisgIGdfYXNzZXJ0IChvdXRidWYpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZvdXRtYXAsIEdTVF9NQVBfV1JJVEUpOworICBtdWxhd19kYXRhID0gb3V0bWFwLmRhdGE7CisKKyAgbXVsYXdfZW5jb2RlIChsaW5lYXJfZGF0YSwgbXVsYXdfZGF0YSwgbXVsYXdfc2l6ZSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmb3V0bWFwKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmaW5tYXApOworCisgIHJldCA9IGdzdF9hdWRpb19lbmNvZGVyX2ZpbmlzaF9mcmFtZSAoYXVkaW9lbmMsIG91dGJ1ZiwgLTEpOworCitkb25lOgorCisgIHJldHVybiByZXQ7CisKK25vdF9uZWdvdGlhdGVkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAobXVsYXdlbmMsICJubyBmb3JtYXQgbmVnb3RpYXRlZCIpOworICAgIHJldCA9IEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICAgIGdvdG8gZG9uZTsKKyAgfQorfQorCisKKworc3RhdGljIHZvaWQKK2dzdF9tdWxhd2VuY19jbGFzc19pbml0IChHc3RNdUxhd0VuY0NsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdzdEF1ZGlvRW5jb2RlckNsYXNzICphdWRpb19lbmNvZGVyX2NsYXNzID0gR1NUX0FVRElPX0VOQ09ERVJfQ0xBU1MgKGtsYXNzKTsKKworICBhdWRpb19lbmNvZGVyX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbXVsYXdlbmNfc3RhcnQpOworICBhdWRpb19lbmNvZGVyX2NsYXNzLT5zZXRfZm9ybWF0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tdWxhd2VuY19zZXRfZm9ybWF0KTsKKyAgYXVkaW9fZW5jb2Rlcl9jbGFzcy0+aGFuZGxlX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbXVsYXdlbmNfaGFuZGxlX2ZyYW1lKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZtdWxhd19lbmNfc3JjX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZtdWxhd19lbmNfc2lua19mYWN0b3J5KTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiTXUgTGF3IGF1ZGlvIGVuY29kZXIiLAorICAgICAgIkNvZGVjL0VuY29kZXIvQXVkaW8iLAorICAgICAgIkNvbnZlcnQgMTZiaXQgUENNIHRvIDhiaXQgbXUgbGF3IiwKKyAgICAgICJaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWxhd2VuY19pbml0IChHc3RNdUxhd0VuYyAqIG11bGF3ZW5jKQoreworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9BVURJT19FTkNPREVSX1NJTktfUEFEIChtdWxhd2VuYykpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2xhdy9tdWxhdy1lbmNvZGUuaCBiL2dzdC9sYXcvbXVsYXctZW5jb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhZGUzOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9sYXcvbXVsYXctZW5jb2RlLmgKQEAgLTAsMCArMSw1NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9NVUxBV0VOQ09ERV9IX18KKyNkZWZpbmUgX19HU1RfTVVMQVdFTkNPREVfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZW5jb2Rlci5oPgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX01VTEFXRU5DIFwKKyAgKGdzdF9tdWxhd2VuY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfTVVMQVdFTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9NVUxBV0VOQyxHc3RNdUxhd0VuYykpCisjZGVmaW5lIEdTVF9NVUxBV0VOQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9NVUxBV0VOQyxHc3RNdUxhd0VuY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX01VTEFXRU5DKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfTVVMQVdFTkMpKQorI2RlZmluZSBHU1RfSVNfTVVMQVdFTkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfTVVMQVdFTkMpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdE11TGF3RW5jIEdzdE11TGF3RW5jOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE11TGF3RW5jQ2xhc3MgR3N0TXVMYXdFbmNDbGFzczsKKworc3RydWN0IF9Hc3RNdUxhd0VuYworeworICBHc3RBdWRpb0VuY29kZXIgZWxlbWVudDsKKworICBnaW50IGNoYW5uZWxzOworICBnaW50IHJhdGU7Cit9OworCitzdHJ1Y3QgX0dzdE11TGF3RW5jQ2xhc3MKK3sKKyAgR3N0QXVkaW9FbmNvZGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X211bGF3ZW5jX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9TVEVSRU9fSF9fICovCmRpZmYgLS1naXQgYS9nc3QvbGF3L211bGF3LmMgYi9nc3QvbGF3L211bGF3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJlNjE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9sYXcvbXVsYXcuYwpAQCAtMCwwICsxLDc5IEBACisvKiBHU3RyZWFtZXIgUENNL0EtTGF3IGNvbnZlcnNpb25zCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSAibXVsYXctZW5jb2RlLmgiCisjaW5jbHVkZSAibXVsYXctZGVjb2RlLmgiCisKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIElOVF9GT1JNQVQgIlMxNkxFIgorI2Vsc2UKKyNkZWZpbmUgSU5UX0ZPUk1BVCAiUzE2QkUiCisjZW5kaWYKKworR3N0U3RhdGljUGFkVGVtcGxhdGUgbXVsYXdfZGVjX3NyY19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIElOVF9GT1JNQVQgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDgwMDAsIDE5MjAwMCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdIikKKyAgICApOworCitHc3RTdGF0aWNQYWRUZW1wbGF0ZSBtdWxhd19kZWNfc2lua19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1tdWxhdywgIgorICAgICAgICAicmF0ZSA9IFsgODAwMCAsIDE5MjAwMCBdLCAiICJjaGFubmVscyA9IFsgMSAsIDIgXSIpCisgICAgKTsKKworR3N0U3RhdGljUGFkVGVtcGxhdGUgbXVsYXdfZW5jX3NpbmtfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIElOVF9GT1JNQVQgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDgwMDAsIDE5MjAwMCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdIikKKyAgICApOworCitHc3RTdGF0aWNQYWRUZW1wbGF0ZSBtdWxhd19lbmNfc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1tdWxhdywgIgorICAgICAgICAicmF0ZSA9IFsgODAwMCAsIDE5MjAwMCBdLCAiICJjaGFubmVscyA9IFsgMSAsIDIgXSIpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJtdWxhd2VuYyIsCisgICAgICAgICAgR1NUX1JBTktfUFJJTUFSWSwgR1NUX1RZUEVfTVVMQVdFTkMpIHx8CisgICAgICAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIm11bGF3ZGVjIiwKKyAgICAgICAgICBHU1RfUkFOS19QUklNQVJZLCBHU1RfVFlQRV9NVUxBV0RFQykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgbXVsYXcsCisgICAgIk11TGF3IGF1ZGlvIGNvbnZlcnNpb24gcm91dGluZXMiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L2xldmVsLy5naXRpZ25vcmUgYi9nc3QvbGV2ZWwvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWVmZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2xldmVsLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorbGV2ZWwtZXhhbXBsZQpkaWZmIC0tZ2l0IGEvZ3N0L2xldmVsL01ha2VmaWxlLmFtIGIvZ3N0L2xldmVsL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YzdiMjgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbGV2ZWwvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RsZXZlbC5sYQorCitsaWJnc3RsZXZlbF9sYV9TT1VSQ0VTID0gZ3N0bGV2ZWwuYworbGliZ3N0bGV2ZWxfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdGxldmVsX2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKEdTVF9CQVNFX0xJQlMpICQoTElCTSkKK2xpYmdzdGxldmVsX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3RsZXZlbC5oCmRpZmYgLS1naXQgYS9nc3QvbGV2ZWwvZ3N0bGV2ZWwuYyBiL2dzdC9sZXZlbC9nc3RsZXZlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjI5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbGV2ZWwvZ3N0bGV2ZWwuYwpAQCAtMCwwICsxLDgwNSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEsMjAwMiwyMDAzLDIwMDUKKyAqICAgICAgICAgICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtbGV2ZWwKKyAqCisgKiBMZXZlbCBhbmFseXNlcyBpbmNvbWluZyBhdWRpbyBidWZmZXJzIGFuZCwgaWYgdGhlICNHc3RMZXZlbDptZXNzYWdlIHByb3BlcnR5CisgKiBpcyAlVFJVRSwgZ2VuZXJhdGVzIGFuIGVsZW1lbnQgbWVzc2FnZSBuYW1lZAorICogPGNsYXNzbmFtZT4mcXVvdDtsZXZlbCZxdW90OzwvY2xhc3NuYW1lPjoKKyAqIGFmdGVyIGVhY2ggaW50ZXJ2YWwgb2YgdGltZSBnaXZlbiBieSB0aGUgI0dzdExldmVsOmludGVydmFsIHByb3BlcnR5LgorICogVGhlIG1lc3NhZ2UncyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlc2UgZmllbGRzOgorICogPGl0ZW1pemVkbGlzdD4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgICNHc3RDbG9ja1RpbWUKKyAqICAgPGNsYXNzbmFtZT4mcXVvdDt0aW1lc3RhbXAmcXVvdDs8L2NsYXNzbmFtZT46CisgKiAgIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGJ1ZmZlciB0aGF0IHRyaWdnZXJlZCB0aGUgbWVzc2FnZS4KKyAqICAgPC9wYXJhPgorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgICNHc3RDbG9ja1RpbWUKKyAqICAgPGNsYXNzbmFtZT4mcXVvdDtzdHJlYW0tdGltZSZxdW90OzwvY2xhc3NuYW1lPjoKKyAqICAgdGhlIHN0cmVhbSB0aW1lIG9mIHRoZSBidWZmZXIuCisgKiAgIDwvcGFyYT4KKyAqIDwvbGlzdGl0ZW0+CisgKiA8bGlzdGl0ZW0+CisgKiAgIDxwYXJhPgorICogICAjR3N0Q2xvY2tUaW1lCisgKiAgIDxjbGFzc25hbWU+JnF1b3Q7cnVubmluZy10aW1lJnF1b3Q7PC9jbGFzc25hbWU+OgorICogICB0aGUgcnVubmluZ190aW1lIG9mIHRoZSBidWZmZXIuCisgKiAgIDwvcGFyYT4KKyAqIDwvbGlzdGl0ZW0+CisgKiA8bGlzdGl0ZW0+CisgKiAgIDxwYXJhPgorICogICAjR3N0Q2xvY2tUaW1lCisgKiAgIDxjbGFzc25hbWU+JnF1b3Q7ZHVyYXRpb24mcXVvdDs8L2NsYXNzbmFtZT46CisgKiAgIHRoZSBkdXJhdGlvbiBvZiB0aGUgYnVmZmVyLgorICogICA8L3BhcmE+CisgKiA8L2xpc3RpdGVtPgorICogPGxpc3RpdGVtPgorICogICA8cGFyYT4KKyAqICAgI0dzdENsb2NrVGltZQorICogICA8Y2xhc3NuYW1lPiZxdW90O2VuZHRpbWUmcXVvdDs8L2NsYXNzbmFtZT46CisgKiAgIHRoZSBlbmQgdGltZSBvZiB0aGUgYnVmZmVyIHRoYXQgdHJpZ2dlcmVkIHRoZSBtZXNzYWdlIGFzIHN0cmVhbSB0aW1lICh0aGlzCisgKiAgIGlzIGRlcHJlY2F0ZWQsIGFzIGl0IGNhbiBiZSBjYWxjdWxhdGVkIGZyb20gc3RyZWFtLXRpbWUgKyBkdXJhdGlvbikKKyAqICAgPC9wYXJhPgorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgICNHVmFsdWVBcnJheSBvZiAjZ2RvdWJsZQorICogICA8Y2xhc3NuYW1lPiZxdW90O3BlYWsmcXVvdDs8L2NsYXNzbmFtZT46CisgKiAgIHRoZSBwZWFrIHBvd2VyIGxldmVsIGluIGRCIGZvciBlYWNoIGNoYW5uZWwKKyAqICAgPC9wYXJhPgorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgICNHVmFsdWVBcnJheSBvZiAjZ2RvdWJsZQorICogICA8Y2xhc3NuYW1lPiZxdW90O2RlY2F5JnF1b3Q7PC9jbGFzc25hbWU+OgorICogICB0aGUgZGVjYXlpbmcgcGVhayBwb3dlciBsZXZlbCBpbiBkQiBmb3IgZWFjaCBjaGFubmVsCisgKiAgIFRoZSBkZWNheWluZyBwZWFrIGxldmVsIGZvbGxvd3MgdGhlIHBlYWsgbGV2ZWwsIGJ1dCBzdGFydHMgZHJvcHBpbmcgaWYgbm8KKyAqICAgbmV3IHBlYWsgaXMgcmVhY2hlZCBhZnRlciB0aGUgdGltZSBnaXZlbiBieSB0aGUgI0dzdExldmVsOnBlYWstdHRsLgorICogICBXaGVuIHRoZSBkZWNheWluZyBwZWFrIGxldmVsIGRyb3BzLCBpdCBkb2VzIHNvIGF0IHRoZSBkZWNheSByYXRlIGFzCisgKiAgIHNwZWNpZmllZCBieSB0aGUgI0dzdExldmVsOnBlYWstZmFsbG9mZi4KKyAqICAgPC9wYXJhPgorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgICNHVmFsdWVBcnJheSBvZiAjZ2RvdWJsZQorICogICA8Y2xhc3NuYW1lPiZxdW90O3JtcyZxdW90OzwvY2xhc3NuYW1lPjoKKyAqICAgdGhlIFJvb3QgTWVhbiBTcXVhcmUgKG9yIGF2ZXJhZ2UgcG93ZXIpIGxldmVsIGluIGRCIGZvciBlYWNoIGNoYW5uZWwKKyAqICAgPC9wYXJhPgorICogPC9saXN0aXRlbT4KKyAqIDwvaXRlbWl6ZWRsaXN0PgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGFwcGxpY2F0aW9uPC90aXRsZT4KKyAqIDxpbmZvcm1hbGV4YW1wbGU+PHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJDIj4KKyAqIDx4aTppbmNsdWRlIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzL1hJbmNsdWRlIiBwYXJzZT0idGV4dCIgaHJlZj0iLi4vLi4vLi4vLi4vdGVzdHMvZXhhbXBsZXMvbGV2ZWwvbGV2ZWwtZXhhbXBsZS5jIiAvPgorICogPC9wcm9ncmFtbGlzdGluZz48L2luZm9ybWFsZXhhbXBsZT4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisvKiBGSVhNRSAwLjExOiBzdXBwcmVzcyB3YXJuaW5ncyBmb3IgZGVwcmVjYXRlZCBBUEkgc3VjaCBhcyBHVmFsdWVBcnJheQorICogd2l0aCBuZXdlciBHTGliIHZlcnNpb25zICg+PSAyLjMxLjApICovCisjZGVmaW5lIEdMSUJfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgImdzdGxldmVsLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGxldmVsX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGxldmVsX2RlYnVnCisKKyNkZWZpbmUgRVBTSUxPTiAxZS0zNWYKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfdGVtcGxhdGVfZmFjdG9yeSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgeyBTOCwgIiBHU1RfQVVESU9fTkUgKFMxNikgIiwgIiBHU1RfQVVESU9fTkUgKFMzMikKKyAgICAgICAgIiwgIiBHU1RfQVVESU9fTkUgKEYzMikgIiwiIEdTVF9BVURJT19ORSAoRjY0KSAiIH0sIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgTUFYIF0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcGxhdGVfZmFjdG9yeSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgUzgsICIgR1NUX0FVRElPX05FIChTMTYpICIsICIgR1NUX0FVRElPX05FIChTMzIpCisgICAgICAgICIsICIgR1NUX0FVRElPX05FIChGMzIpICIsIiBHU1RfQVVESU9fTkUgKEY2NCkgIiB9LCIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxLCBNQVggXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIE1BWCBdIikKKyAgICApOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9QT1NUX01FU1NBR0VTLAorICBQUk9QX01FU1NBR0UsCisgIFBST1BfSU5URVJWQUwsCisgIFBST1BfUEVBS19UVEwsCisgIFBST1BfUEVBS19GQUxMT0ZGCit9OworCisjZGVmaW5lIGdzdF9sZXZlbF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RMZXZlbCwgZ3N0X2xldmVsLCBHU1RfVFlQRV9CQVNFX1RSQU5TRk9STSk7CisKK3N0YXRpYyB2b2lkIGdzdF9sZXZlbF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfbGV2ZWxfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2xldmVsX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9sZXZlbF9zZXRfY2FwcyAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLCBHc3RDYXBzICogaW4sCisgICAgR3N0Q2FwcyAqIG91dCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2xldmVsX3N0YXJ0IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2xldmVsX3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdEJ1ZmZlciAqIGluKTsKK3N0YXRpYyB2b2lkIGdzdF9sZXZlbF9wb3N0X21lc3NhZ2UgKEdzdExldmVsICogZmlsdGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbGV2ZWxfc2lua19ldmVudCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIHZvaWQgZ3N0X2xldmVsX3JlY2FsY19pbnRlcnZhbF9mcmFtZXMgKEdzdExldmVsICogbGV2ZWwpOworCitzdGF0aWMgdm9pZAorZ3N0X2xldmVsX2NsYXNzX2luaXQgKEdzdExldmVsQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzICp0cmFuc19jbGFzcyA9IEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9sZXZlbF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9sZXZlbF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2xldmVsX2ZpbmFsaXplOworCisgIC8qKgorICAgKiBHc3RMZXZlbDpwb3N0LW1lc3NhZ2VzCisgICAqCisgICAqIFBvc3QgbWVzc2FnZXMgb24gdGhlIGJ1cyB3aXRoIGxldmVsIGluZm9ybWF0aW9uLgorICAgKgorICAgKiBTaW5jZTogMS4xLjAKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUE9TVF9NRVNTQUdFUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgicG9zdC1tZXNzYWdlcyIsICJQb3N0IE1lc3NhZ2VzIiwKKyAgICAgICAgICAiV2hldGhlciB0byBwb3N0IGEgJ2xldmVsJyBlbGVtZW50IG1lc3NhZ2Ugb24gdGhlIGJ1cyBmb3IgZWFjaCAiCisgICAgICAgICAgInBhc3NlZCBpbnRlcnZhbCIsIFRSVUUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKiBGSVhNRSgyLjApOiByZW1vdmUgdGhpcyBwcm9wZXJ0eSAqLworICAvKioKKyAgICogR3N0TGV2ZWw6cG9zdC1tZXNzYWdlcworICAgKgorICAgKiBQb3N0IG1lc3NhZ2VzIG9uIHRoZSBidXMgd2l0aCBsZXZlbCBpbmZvcm1hdGlvbi4KKyAgICoKKyAgICogRGVwcmVjYXRlZDogdXNlIHRoZSAjR3N0TGV2ZWw6cG9zdC1tZXNzYWdlcyBwcm9wZXJ0eQorICAgKi8KKyNpZm5kZWYgR1NUX1JFTU9WRV9ERVBSRUNBVEVECisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUVTU0FHRSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgibWVzc2FnZSIsICJtZXNzYWdlIiwKKyAgICAgICAgICAiUG9zdCBhICdsZXZlbCcgbWVzc2FnZSBmb3IgZWFjaCBwYXNzZWQgaW50ZXJ2YWwgIgorICAgICAgICAgICIoZGVwcmVjYXRlZCwgdXNlIHRoZSBwb3N0LW1lc3NhZ2VzIHByb3BlcnR5IGluc3RlYWQpIiwgVFJVRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fREVQUkVDQVRFRCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyNlbmRpZgorICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0lOVEVSVkFMLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoImludGVydmFsIiwgIkludGVydmFsIiwKKyAgICAgICAgICAiSW50ZXJ2YWwgb2YgdGltZSBiZXR3ZWVuIG1lc3NhZ2UgcG9zdHMgKGluIG5hbm9zZWNvbmRzKSIsCisgICAgICAgICAgMSwgR19NQVhVSU5UNjQsIEdTVF9TRUNPTkQgLyAxMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QRUFLX1RUTCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJwZWFrLXR0bCIsICJQZWFrIFRUTCIsCisgICAgICAgICAgIlRpbWUgVG8gTGl2ZSBvZiBkZWNheSBwZWFrIGJlZm9yZSBpdCBmYWxscyBiYWNrIChpbiBuYW5vc2Vjb25kcykiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVDY0LCBHU1RfU0VDT05EIC8gMTAgKiAzLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BFQUtfRkFMTE9GRiwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJwZWFrLWZhbGxvZmYiLCAiUGVhayBGYWxsb2ZmIiwKKyAgICAgICAgICAiRGVjYXkgcmF0ZSBvZiBkZWNheSBwZWFrIGFmdGVyIFRUTCAoaW4gZEIvc2VjKSIsCisgICAgICAgICAgMC4wLCBHX01BWERPVUJMRSwgMTAuMCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGxldmVsX2RlYnVnLCAibGV2ZWwiLCAwLCAiTGV2ZWwgY2FsY3VsYXRpb24iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZzaW5rX3RlbXBsYXRlX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZzcmNfdGVtcGxhdGVfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJMZXZlbCIsCisgICAgICAiRmlsdGVyL0FuYWx5emVyL0F1ZGlvIiwKKyAgICAgICJSTVMvUGVhay9EZWNheWluZyBQZWFrIExldmVsIG1lc3NhZ2VyIGZvciBhdWRpby9yYXciLAorICAgICAgIlRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4iKTsKKworICB0cmFuc19jbGFzcy0+c2V0X2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2xldmVsX3NldF9jYXBzKTsKKyAgdHJhbnNfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9sZXZlbF9zdGFydCk7CisgIHRyYW5zX2NsYXNzLT50cmFuc2Zvcm1faXAgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2xldmVsX3RyYW5zZm9ybV9pcCk7CisgIHRyYW5zX2NsYXNzLT5zaW5rX2V2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9sZXZlbF9zaW5rX2V2ZW50KTsKKyAgdHJhbnNfY2xhc3MtPnBhc3N0aHJvdWdoX29uX3NhbWVfY2FwcyA9IFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbGV2ZWxfaW5pdCAoR3N0TGV2ZWwgKiBmaWx0ZXIpCit7CisgIGZpbHRlci0+Q1MgPSBOVUxMOworICBmaWx0ZXItPnBlYWsgPSBOVUxMOworICBmaWx0ZXItPmxhc3RfcGVhayA9IE5VTEw7CisgIGZpbHRlci0+ZGVjYXlfcGVhayA9IE5VTEw7CisgIGZpbHRlci0+ZGVjYXlfcGVha19iYXNlID0gTlVMTDsKKyAgZmlsdGVyLT5kZWNheV9wZWFrX2FnZSA9IE5VTEw7CisKKyAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoJmZpbHRlci0+aW5mbyk7CisKKyAgZmlsdGVyLT5pbnRlcnZhbCA9IEdTVF9TRUNPTkQgLyAxMDsKKyAgZmlsdGVyLT5kZWNheV9wZWFrX3R0bCA9IEdTVF9TRUNPTkQgLyAxMCAqIDM7CisgIGZpbHRlci0+ZGVjYXlfcGVha19mYWxsb2ZmID0gMTAuMDsgICAgLyogZEIgZmFsbG9mZiAoL3NlYykgKi8KKworICBmaWx0ZXItPnBvc3RfbWVzc2FnZXMgPSBUUlVFOworCisgIGZpbHRlci0+cHJvY2VzcyA9IE5VTEw7CisKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9nYXBfYXdhcmUgKEdTVF9CQVNFX1RSQU5TRk9STSAoZmlsdGVyKSwgVFJVRSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbGV2ZWxfZmluYWxpemUgKEdPYmplY3QgKiBvYmopCit7CisgIEdzdExldmVsICpmaWx0ZXIgPSBHU1RfTEVWRUwgKG9iaik7CisKKyAgZ19mcmVlIChmaWx0ZXItPkNTKTsKKyAgZ19mcmVlIChmaWx0ZXItPnBlYWspOworICBnX2ZyZWUgKGZpbHRlci0+bGFzdF9wZWFrKTsKKyAgZ19mcmVlIChmaWx0ZXItPmRlY2F5X3BlYWspOworICBnX2ZyZWUgKGZpbHRlci0+ZGVjYXlfcGVha19iYXNlKTsKKyAgZ19mcmVlIChmaWx0ZXItPmRlY2F5X3BlYWtfYWdlKTsKKworICBmaWx0ZXItPkNTID0gTlVMTDsKKyAgZmlsdGVyLT5wZWFrID0gTlVMTDsKKyAgZmlsdGVyLT5sYXN0X3BlYWsgPSBOVUxMOworICBmaWx0ZXItPmRlY2F5X3BlYWsgPSBOVUxMOworICBmaWx0ZXItPmRlY2F5X3BlYWtfYmFzZSA9IE5VTEw7CisgIGZpbHRlci0+ZGVjYXlfcGVha19hZ2UgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9sZXZlbF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0TGV2ZWwgKmZpbHRlciA9IEdTVF9MRVZFTCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUE9TVF9NRVNTQUdFUzoKKyAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICAgIGNhc2UgUFJPUF9NRVNTQUdFOgorICAgICAgZmlsdGVyLT5wb3N0X21lc3NhZ2VzID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0lOVEVSVkFMOgorICAgICAgZmlsdGVyLT5pbnRlcnZhbCA9IGdfdmFsdWVfZ2V0X3VpbnQ2NCAodmFsdWUpOworICAgICAgLyogTm90IGV4YWN0bHkgdGhyZWFkLXNhZmUsIGJ1dCBwcm9wZXJ0eSBkb2VzIG5vdCBhZHZlcnRpc2UgdGhhdCBpdAorICAgICAgICogY2FuIGJlIGNoYW5nZWQgYXQgcnVudGltZSBhbnl3YXkgKi8KKyAgICAgIGlmIChHU1RfQVVESU9fSU5GT19SQVRFICgmZmlsdGVyLT5pbmZvKSkgeworICAgICAgICBnc3RfbGV2ZWxfcmVjYWxjX2ludGVydmFsX2ZyYW1lcyAoZmlsdGVyKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QRUFLX1RUTDoKKyAgICAgIGZpbHRlci0+ZGVjYXlfcGVha190dGwgPQorICAgICAgICAgIGdzdF9ndWludDY0X3RvX2dkb3VibGUgKGdfdmFsdWVfZ2V0X3VpbnQ2NCAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QRUFLX0ZBTExPRkY6CisgICAgICBmaWx0ZXItPmRlY2F5X3BlYWtfZmFsbG9mZiA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2xldmVsX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RMZXZlbCAqZmlsdGVyID0gR1NUX0xFVkVMIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QT1NUX01FU1NBR0VTOgorICAgICAgLyogZmFsbC10aHJvdWdoICovCisgICAgY2FzZSBQUk9QX01FU1NBR0U6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZmlsdGVyLT5wb3N0X21lc3NhZ2VzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JTlRFUlZBTDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIGZpbHRlci0+aW50ZXJ2YWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BFQUtfVFRMOgorICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgZmlsdGVyLT5kZWNheV9wZWFrX3R0bCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUEVBS19GQUxMT0ZGOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgZmlsdGVyLT5kZWNheV9wZWFrX2ZhbGxvZmYpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisKKy8qIHByb2Nlc3Mgb25lIChpbnRlcmxlYXZlZCkgY2hhbm5lbCBvZiBpbmNvbWluZyBzYW1wbGVzCisgKiBjYWxjdWxhdGUgc3F1YXJlIHN1bSBvZiBzYW1wbGVzCisgKiBub3JtYWxpemUgYW5kIGF2ZXJhZ2Ugb3ZlciBudW1iZXIgb2Ygc2FtcGxlcworICogcmV0dXJucyBhIG5vcm1hbGl6ZWQgY3VtdWxhdGl2ZSBzcXVhcmUgdmFsdWUsIHdoaWNoIGNhbiBiZSBhdmVyYWdlZAorICogdG8gcmV0dXJuIHRoZSBhdmVyYWdlIHBvd2VyIGFzIGEgZG91YmxlIGJldHdlZW4gMCBhbmQgMQorICogYWxzbyByZXR1cm5zIHRoZSBub3JtYWxpemVkIHBlYWsgcG93ZXIgKHNxdWFyZSBvZiB0aGUgaGlnaGVzdCBhbXBsaXR1ZGUpCisgKgorICogY2FsbGVyIG11c3QgYXNzdXJlIG51bSBpcyBhIG11bHRpcGxlIG9mIGNoYW5uZWxzCisgKiBzYW1wbGVzIGZvciBtdWx0aXBsZSBjaGFubmVscyBhcmUgaW50ZXJsZWF2ZWQKKyAqIGlucHV0IHNhbXBsZSBkYXRhIGVudGVycyBpbiAqaW5fZGF0YSBhbmQgaXMgbm90IG1vZGlmaWVkCisgKiB0aGlzIGZpbHRlciBvbmx5IGFjY2VwdHMgc2lnbmVkIGF1ZGlvIGRhdGEsIHNvIG1pZCBsZXZlbCBpcyBhbHdheXMgMAorICoKKyAqIGZvciBpbnRlZ2VycywgdGhpcyBjb2RlIGNvbnNpZGVycyB0aGUgbm9uLWV4aXN0YW50IHBvc2l0aXZlIG1heCB2YWx1ZSB0byBiZQorICogZnVsbC1zY2FsZTsgc28gbWF4LTEgd2lsbCBub3QgbWFwIHRvIDEuMAorICovCisKKyNkZWZpbmUgREVGSU5FX0lOVF9MRVZFTF9DQUxDVUxBVE9SKFRZUEUsIFJFU09MVVRJT04pICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIGlubGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2dzdF9sZXZlbF9jYWxjdWxhdGVfIyNUWVBFIChncG9pbnRlciBkYXRhLCBndWludCBudW0sIGd1aW50IGNoYW5uZWxzLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlICpOQ1MsIGdkb3VibGUgKk5QUykgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVFlQRSAqIGluID0gKFRZUEUgKilkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmVnaXN0ZXIgZ3VpbnQgajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ2RvdWJsZSBzcXVhcmVzdW0gPSAwLjA7ICAgICAgICAgICAvKiBzcXVhcmUgc3VtIG9mIHRoZSBpbnB1dCBzYW1wbGVzICovICAgIFwKKyAgcmVnaXN0ZXIgZ2RvdWJsZSBzcXVhcmUgPSAwLjA7ICAgICAvKiBTcXVhcmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmVnaXN0ZXIgZ2RvdWJsZSBwZWFrc3F1YXJlID0gMC4wOyAvKiBQZWFrIFNxdWFyZSBTYW1wbGUgKi8gICAgICAgICAgICAgICAgIFwKKyAgZ2RvdWJsZSBub3JtYWxpemVyOyAgICAgICAgICAgICAgICAvKiBkaXZpc29yIHRvIGdldCBhIFstMS4wLCAxLjBdIHJhbmdlICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogKk5DUyA9IDAuMDsgTm9ybWFsaXplZCBDdW11bGF0aXZlIFNxdWFyZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogKk5QUyA9IDAuMDsgTm9ybWFsaXplZCBQZWFrIFNxdWFyZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChqID0gMDsgaiA8IG51bTsgaiArPSBjaGFubmVscykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcXVhcmUgPSAoKGdkb3VibGUpIGluW2pdKSAqIGluW2pdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoc3F1YXJlID4gcGVha3NxdWFyZSkgcGVha3NxdWFyZSA9IHNxdWFyZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcXVhcmVzdW0gKz0gc3F1YXJlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbm9ybWFsaXplciA9IChnZG91YmxlKSAoR19HSU5UNjRfQ09OU1RBTlQoMSkgPDwgKFJFU09MVVRJT04gKiAyKSk7ICAgICAgICAgIFwKKyAgKk5DUyA9IHNxdWFyZXN1bSAvIG5vcm1hbGl6ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKk5QUyA9IHBlYWtzcXVhcmUgLyBub3JtYWxpemVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworREVGSU5FX0lOVF9MRVZFTF9DQUxDVUxBVE9SIChnaW50MzIsIDMxKTsKK0RFRklORV9JTlRfTEVWRUxfQ0FMQ1VMQVRPUiAoZ2ludDE2LCAxNSk7CitERUZJTkVfSU5UX0xFVkVMX0NBTENVTEFUT1IgKGdpbnQ4LCA3KTsKKworLyogRklYTUU6IHVzZSBvcmMgdG8gY2FsY3VsYXRlIHNxdWFyZXN1bXM/ICovCisjZGVmaW5lIERFRklORV9GTE9BVF9MRVZFTF9DQUxDVUxBVE9SKFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBpbmxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitnc3RfbGV2ZWxfY2FsY3VsYXRlXyMjVFlQRSAoZ3BvaW50ZXIgZGF0YSwgZ3VpbnQgbnVtLCBndWludCBjaGFubmVscywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSAqTkNTLCBnZG91YmxlICpOUFMpICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRZUEUgKiBpbiA9IChUWVBFICopZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJlZ2lzdGVyIGd1aW50IGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdkb3VibGUgc3F1YXJlc3VtID0gMC4wOyAgICAgICAgICAgLyogc3F1YXJlIHN1bSBvZiB0aGUgaW5wdXQgc2FtcGxlcyAqLyAgICBcCisgIHJlZ2lzdGVyIGdkb3VibGUgc3F1YXJlID0gMC4wOyAgICAgLyogU3F1YXJlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJlZ2lzdGVyIGdkb3VibGUgcGVha3NxdWFyZSA9IDAuMDsgLyogUGVhayBTcXVhcmUgU2FtcGxlICovICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qICpOQ1MgPSAwLjA7IE5vcm1hbGl6ZWQgQ3VtdWxhdGl2ZSBTcXVhcmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qICpOUFMgPSAwLjA7IE5vcm1hbGl6ZWQgUGVhayBTcXVhcmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIG9yY19sZXZlbF9zcXVhcmVzdW1fZjY0KCZzcXVhcmVzdW0saW4sbnVtKTsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaiA9IDA7IGogPCBudW07IGogKz0gY2hhbm5lbHMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3F1YXJlID0gKChnZG91YmxlKSBpbltqXSkgKiBpbltqXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHNxdWFyZSA+IHBlYWtzcXVhcmUpIHBlYWtzcXVhcmUgPSBzcXVhcmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3F1YXJlc3VtICs9IHNxdWFyZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICpOQ1MgPSBzcXVhcmVzdW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICpOUFMgPSBwZWFrc3F1YXJlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0RFRklORV9GTE9BVF9MRVZFTF9DQUxDVUxBVE9SIChnZmxvYXQpOworREVGSU5FX0ZMT0FUX0xFVkVMX0NBTENVTEFUT1IgKGdkb3VibGUpOworCisvKiB3ZSB3b3VsZCBuZWVkIHN0cmlkZSB0byBkZWludGVybGVhdmUgYWxzbworc3RhdGljIHZvaWQgaW5saW5lCitnc3RfbGV2ZWxfY2FsY3VsYXRlX2dkb3VibGUgKGdwb2ludGVyIGRhdGEsIGd1aW50IG51bSwgZ3VpbnQgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSAqTkNTLCBnZG91YmxlICpOUFMpCit7CisgIG9yY19sZXZlbF9zcXVhcmVzdW1fZjY0KE5DUywoZ2RvdWJsZSAqKWRhdGEsbnVtKTsKKyAgKk5QUyA9IDAuMDsKK30KKyovCisKK3N0YXRpYyB2b2lkCitnc3RfbGV2ZWxfcmVjYWxjX2ludGVydmFsX2ZyYW1lcyAoR3N0TGV2ZWwgKiBsZXZlbCkKK3sKKyAgR3N0Q2xvY2tUaW1lIGludGVydmFsID0gbGV2ZWwtPmludGVydmFsOworICBndWludCBzYW1wbGVfcmF0ZSA9IEdTVF9BVURJT19JTkZPX1JBVEUgKCZsZXZlbC0+aW5mbyk7CisgIGd1aW50IGludGVydmFsX2ZyYW1lczsKKworICBpbnRlcnZhbF9mcmFtZXMgPSBHU1RfQ0xPQ0tfVElNRV9UT19GUkFNRVMgKGludGVydmFsLCBzYW1wbGVfcmF0ZSk7CisKKyAgaWYgKGludGVydmFsX2ZyYW1lcyA9PSAwKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChsZXZlbCwgImludGVydmFsICUiIEdTVF9USU1FX0ZPUk1BVCAiIGlzIHRvbyBzbWFsbCwgIgorICAgICAgICAic2hvdWxkIGJlIGF0IGxlYXN0ICUiIEdTVF9USU1FX0ZPUk1BVCAiIGZvciBzYW1wbGUgcmF0ZSAldSIsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGludGVydmFsKSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0ZSQU1FU19UT19DTE9DS19USU1FICgxLCBzYW1wbGVfcmF0ZSkpLCBzYW1wbGVfcmF0ZSk7CisgICAgaW50ZXJ2YWxfZnJhbWVzID0gMTsKKyAgfQorCisgIGxldmVsLT5pbnRlcnZhbF9mcmFtZXMgPSBpbnRlcnZhbF9mcmFtZXM7CisKKyAgR1NUX0lORk9fT0JKRUNUIChsZXZlbCwgImludGVydmFsX2ZyYW1lcyBub3cgJXUgZm9yIGludGVydmFsICIKKyAgICAgICIlIiBHU1RfVElNRV9GT1JNQVQgIiBhbmQgc2FtcGxlIHJhdGUgJXUiLCBpbnRlcnZhbF9mcmFtZXMsCisgICAgICBHU1RfVElNRV9BUkdTIChpbnRlcnZhbCksIHNhbXBsZV9yYXRlKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbGV2ZWxfc2V0X2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywgR3N0Q2FwcyAqIGluLCBHc3RDYXBzICogb3V0KQoreworICBHc3RMZXZlbCAqZmlsdGVyID0gR1NUX0xFVkVMICh0cmFucyk7CisgIEdzdEF1ZGlvSW5mbyBpbmZvOworICBnaW50IGksIGNoYW5uZWxzOworCisgIGlmICghZ3N0X2F1ZGlvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBzd2l0Y2ggKEdTVF9BVURJT19JTkZPX0ZPUk1BVCAoJmluZm8pKSB7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1M4OgorICAgICAgZmlsdGVyLT5wcm9jZXNzID0gZ3N0X2xldmVsX2NhbGN1bGF0ZV9naW50ODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMTY6CisgICAgICBmaWx0ZXItPnByb2Nlc3MgPSBnc3RfbGV2ZWxfY2FsY3VsYXRlX2dpbnQxNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMzI6CisgICAgICBmaWx0ZXItPnByb2Nlc3MgPSBnc3RfbGV2ZWxfY2FsY3VsYXRlX2dpbnQzMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GMzI6CisgICAgICBmaWx0ZXItPnByb2Nlc3MgPSBnc3RfbGV2ZWxfY2FsY3VsYXRlX2dmbG9hdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GNjQ6CisgICAgICBmaWx0ZXItPnByb2Nlc3MgPSBnc3RfbGV2ZWxfY2FsY3VsYXRlX2dkb3VibGU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZmlsdGVyLT5wcm9jZXNzID0gTlVMTDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgZmlsdGVyLT5pbmZvID0gaW5mbzsKKworICBjaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTICgmaW5mbyk7CisKKyAgLyogYWxsb2NhdGUgY2hhbm5lbCB2YXJpYWJsZSBhcnJheXMgKi8KKyAgZ19mcmVlIChmaWx0ZXItPkNTKTsKKyAgZ19mcmVlIChmaWx0ZXItPnBlYWspOworICBnX2ZyZWUgKGZpbHRlci0+bGFzdF9wZWFrKTsKKyAgZ19mcmVlIChmaWx0ZXItPmRlY2F5X3BlYWspOworICBnX2ZyZWUgKGZpbHRlci0+ZGVjYXlfcGVha19iYXNlKTsKKyAgZ19mcmVlIChmaWx0ZXItPmRlY2F5X3BlYWtfYWdlKTsKKyAgZmlsdGVyLT5DUyA9IGdfbmV3IChnZG91YmxlLCBjaGFubmVscyk7CisgIGZpbHRlci0+cGVhayA9IGdfbmV3IChnZG91YmxlLCBjaGFubmVscyk7CisgIGZpbHRlci0+bGFzdF9wZWFrID0gZ19uZXcgKGdkb3VibGUsIGNoYW5uZWxzKTsKKyAgZmlsdGVyLT5kZWNheV9wZWFrID0gZ19uZXcgKGdkb3VibGUsIGNoYW5uZWxzKTsKKyAgZmlsdGVyLT5kZWNheV9wZWFrX2Jhc2UgPSBnX25ldyAoZ2RvdWJsZSwgY2hhbm5lbHMpOworCisgIGZpbHRlci0+ZGVjYXlfcGVha19hZ2UgPSBnX25ldyAoR3N0Q2xvY2tUaW1lLCBjaGFubmVscyk7CisKKyAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyArK2kpIHsKKyAgICBmaWx0ZXItPkNTW2ldID0gZmlsdGVyLT5wZWFrW2ldID0gZmlsdGVyLT5sYXN0X3BlYWtbaV0gPQorICAgICAgICBmaWx0ZXItPmRlY2F5X3BlYWtbaV0gPSBmaWx0ZXItPmRlY2F5X3BlYWtfYmFzZVtpXSA9IDAuMDsKKyAgICBmaWx0ZXItPmRlY2F5X3BlYWtfYWdlW2ldID0gR19HVUlOVDY0X0NPTlNUQU5UICgwKTsKKyAgfQorCisgIGdzdF9sZXZlbF9yZWNhbGNfaW50ZXJ2YWxfZnJhbWVzIChmaWx0ZXIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9sZXZlbF9zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICBHc3RMZXZlbCAqZmlsdGVyID0gR1NUX0xFVkVMICh0cmFucyk7CisKKyAgZmlsdGVyLT5udW1fZnJhbWVzID0gMDsKKyAgZmlsdGVyLT5tZXNzYWdlX3RzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdE1lc3NhZ2UgKgorZ3N0X2xldmVsX21lc3NhZ2VfbmV3IChHc3RMZXZlbCAqIGxldmVsLCBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLAorICAgIEdzdENsb2NrVGltZSBkdXJhdGlvbikKK3sKKyAgR3N0QmFzZVRyYW5zZm9ybSAqdHJhbnMgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0FTVCAobGV2ZWwpOworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIEdWYWx1ZSB2ID0geyAwLCB9OworICBHc3RDbG9ja1RpbWUgZW5kdGltZSwgcnVubmluZ190aW1lLCBzdHJlYW1fdGltZTsKKworICBydW5uaW5nX3RpbWUgPSBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZ0cmFucy0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgdGltZXN0YW1wKTsKKyAgc3RyZWFtX3RpbWUgPSBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJnRyYW5zLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICB0aW1lc3RhbXApOworICAvKiBlbmR0aW1lIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLworICBlbmR0aW1lID0gc3RyZWFtX3RpbWUgKyBkdXJhdGlvbjsKKworICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJsZXZlbCIsCisgICAgICAiZW5kdGltZSIsIEdTVF9UWVBFX0NMT0NLX1RJTUUsIGVuZHRpbWUsCisgICAgICAidGltZXN0YW1wIiwgR19UWVBFX1VJTlQ2NCwgdGltZXN0YW1wLAorICAgICAgInN0cmVhbS10aW1lIiwgR19UWVBFX1VJTlQ2NCwgc3RyZWFtX3RpbWUsCisgICAgICAicnVubmluZy10aW1lIiwgR19UWVBFX1VJTlQ2NCwgcnVubmluZ190aW1lLAorICAgICAgImR1cmF0aW9uIiwgR19UWVBFX1VJTlQ2NCwgZHVyYXRpb24sIE5VTEwpOworCisgIGdfdmFsdWVfaW5pdCAoJnYsIEdfVFlQRV9WQUxVRV9BUlJBWSk7CisgIGdfdmFsdWVfdGFrZV9ib3hlZCAoJnYsIGdfdmFsdWVfYXJyYXlfbmV3ICgwKSk7CisgIGdzdF9zdHJ1Y3R1cmVfdGFrZV92YWx1ZSAocywgInJtcyIsICZ2KTsKKworICBnX3ZhbHVlX2luaXQgKCZ2LCBHX1RZUEVfVkFMVUVfQVJSQVkpOworICBnX3ZhbHVlX3Rha2VfYm94ZWQgKCZ2LCBnX3ZhbHVlX2FycmF5X25ldyAoMCkpOworICBnc3Rfc3RydWN0dXJlX3Rha2VfdmFsdWUgKHMsICJwZWFrIiwgJnYpOworCisgIGdfdmFsdWVfaW5pdCAoJnYsIEdfVFlQRV9WQUxVRV9BUlJBWSk7CisgIGdfdmFsdWVfdGFrZV9ib3hlZCAoJnYsIGdfdmFsdWVfYXJyYXlfbmV3ICgwKSk7CisgIGdzdF9zdHJ1Y3R1cmVfdGFrZV92YWx1ZSAocywgImRlY2F5IiwgJnYpOworCisgIHJldHVybiBnc3RfbWVzc2FnZV9uZXdfZWxlbWVudCAoR1NUX09CSkVDVCAobGV2ZWwpLCBzKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9sZXZlbF9tZXNzYWdlX2FwcGVuZF9jaGFubmVsIChHc3RNZXNzYWdlICogbSwgZ2RvdWJsZSBybXMsIGdkb3VibGUgcGVhaywKKyAgICBnZG91YmxlIGRlY2F5KQoreworICBjb25zdCBHVmFsdWUgKmFycmF5X3ZhbDsKKyAgR3N0U3RydWN0dXJlICpzOworICBHVmFsdWVBcnJheSAqYXJyOworICBHVmFsdWUgdiA9IHsgMCwgfTsKKworICBnX3ZhbHVlX2luaXQgKCZ2LCBHX1RZUEVfRE9VQkxFKTsKKworICBzID0gKEdzdFN0cnVjdHVyZSAqKSBnc3RfbWVzc2FnZV9nZXRfc3RydWN0dXJlIChtKTsKKworICBhcnJheV92YWwgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgInJtcyIpOworICBhcnIgPSAoR1ZhbHVlQXJyYXkgKikgZ192YWx1ZV9nZXRfYm94ZWQgKGFycmF5X3ZhbCk7CisgIGdfdmFsdWVfc2V0X2RvdWJsZSAoJnYsIHJtcyk7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kIChhcnIsICZ2KTsgICAgICAgLyogY29waWVzIGJ5IHZhbHVlICovCisKKyAgYXJyYXlfdmFsID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJwZWFrIik7CisgIGFyciA9IChHVmFsdWVBcnJheSAqKSBnX3ZhbHVlX2dldF9ib3hlZCAoYXJyYXlfdmFsKTsKKyAgZ192YWx1ZV9zZXRfZG91YmxlICgmdiwgcGVhayk7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kIChhcnIsICZ2KTsgICAgICAgLyogY29waWVzIGJ5IHZhbHVlICovCisKKyAgYXJyYXlfdmFsID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJkZWNheSIpOworICBhcnIgPSAoR1ZhbHVlQXJyYXkgKikgZ192YWx1ZV9nZXRfYm94ZWQgKGFycmF5X3ZhbCk7CisgIGdfdmFsdWVfc2V0X2RvdWJsZSAoJnYsIGRlY2F5KTsKKyAgZ192YWx1ZV9hcnJheV9hcHBlbmQgKGFyciwgJnYpOyAgICAgICAvKiBjb3BpZXMgYnkgdmFsdWUgKi8KKworICBnX3ZhbHVlX3Vuc2V0ICgmdik7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbGV2ZWxfdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdEJ1ZmZlciAqIGluKQoreworICBHc3RMZXZlbCAqZmlsdGVyOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ4ICppbl9kYXRhOworICBnc2l6ZSBpbl9zaXplOworICBnZG91YmxlIENTOworICBndWludCBpOworICBndWludCBudW1fZnJhbWVzOworICBndWludCBudW1faW50X3NhbXBsZXMgPSAwOyAgICAvKiBudW1iZXIgb2YgaW50ZXJsZWF2ZWQgc2FtcGxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpZS4gdG90YWwgY291bnQgZm9yIGFsbCBjaGFubmVscyBjb21iaW5lZCAqLworICBndWludCBibG9ja19zaXplLCBibG9ja19pbnRfc2l6ZTsgICAgIC8qIHdlIHN1YmRpdmlkZSBidWZmZXJzIHRvIG5vdCBza2lwIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbnRlcnZhbHMgKi8KKyAgR3N0Q2xvY2tUaW1lRGlmZiBmYWxsb2ZmX3RpbWU7CisgIGdpbnQgY2hhbm5lbHMsIHJhdGUsIGJwczsKKworICBmaWx0ZXIgPSBHU1RfTEVWRUwgKHRyYW5zKTsKKworICBjaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTICgmZmlsdGVyLT5pbmZvKTsKKyAgYnBzID0gR1NUX0FVRElPX0lORk9fQlBTICgmZmlsdGVyLT5pbmZvKTsKKyAgcmF0ZSA9IEdTVF9BVURJT19JTkZPX1JBVEUgKCZmaWx0ZXItPmluZm8pOworCisgIGdzdF9idWZmZXJfbWFwIChpbiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgaW5fZGF0YSA9IG1hcC5kYXRhOworICBpbl9zaXplID0gbWFwLnNpemU7CisKKyAgbnVtX2ludF9zYW1wbGVzID0gaW5fc2l6ZSAvIGJwczsKKworICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiYW5hbHl6aW5nICV1IHNhbXBsZSBmcmFtZXMgYXQgdHMgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgbnVtX2ludF9zYW1wbGVzLCBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW4pKSk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKG51bV9pbnRfc2FtcGxlcyAlIGNoYW5uZWxzID09IDAsIEdTVF9GTE9XX0VSUk9SKTsKKworICBpZiAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoaW4sIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKSkgeworICAgIGZpbHRlci0+bWVzc2FnZV90cyA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbik7CisgICAgZmlsdGVyLT5udW1fZnJhbWVzID0gMDsKKyAgfQorICBpZiAoR19VTkxJS0VMWSAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChmaWx0ZXItPm1lc3NhZ2VfdHMpKSkgeworICAgIGZpbHRlci0+bWVzc2FnZV90cyA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbik7CisgIH0KKworICBudW1fZnJhbWVzID0gbnVtX2ludF9zYW1wbGVzIC8gY2hhbm5lbHM7CisgIHdoaWxlIChudW1fZnJhbWVzID4gMCkgeworICAgIGJsb2NrX3NpemUgPSBmaWx0ZXItPmludGVydmFsX2ZyYW1lcyAtIGZpbHRlci0+bnVtX2ZyYW1lczsKKyAgICBibG9ja19zaXplID0gTUlOIChibG9ja19zaXplLCBudW1fZnJhbWVzKTsKKyAgICBibG9ja19pbnRfc2l6ZSA9IGJsb2NrX3NpemUgKiBjaGFubmVsczsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgKytpKSB7CisgICAgICBpZiAoIUdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGluLCBHU1RfQlVGRkVSX0ZMQUdfR0FQKSkgeworICAgICAgICBmaWx0ZXItPnByb2Nlc3MgKGluX2RhdGEgKyAoYnBzICogaSksIGJsb2NrX2ludF9zaXplLCBjaGFubmVscywgJkNTLAorICAgICAgICAgICAgJmZpbHRlci0+cGVha1tpXSk7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsCisgICAgICAgICAgICAiWyVkXTogY3VtdWxhdGl2ZSBzcXVhcmVzICVsZiwgb3ZlciAlZCBzYW1wbGVzLyVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgIGksIENTLCBibG9ja19pbnRfc2l6ZSwgY2hhbm5lbHMpOworICAgICAgICBmaWx0ZXItPkNTW2ldICs9IENTOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsdGVyLT5wZWFrW2ldID0gMC4wOworICAgICAgfQorCisgICAgICBmaWx0ZXItPmRlY2F5X3BlYWtfYWdlW2ldICs9IEdTVF9GUkFNRVNfVE9fQ0xPQ0tfVElNRSAobnVtX2ZyYW1lcywgcmF0ZSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLAorICAgICAgICAgICJbJWRdOiBwZWFrICVmLCBsYXN0IHBlYWsgJWYsIGRlY2F5IHBlYWsgJWYsIGFnZSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgaSwgZmlsdGVyLT5wZWFrW2ldLCBmaWx0ZXItPmxhc3RfcGVha1tpXSwgZmlsdGVyLT5kZWNheV9wZWFrW2ldLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGZpbHRlci0+ZGVjYXlfcGVha19hZ2VbaV0pKTsKKworICAgICAgLyogdXBkYXRlIHJ1bm5pbmcgcGVhayAqLworICAgICAgaWYgKGZpbHRlci0+cGVha1tpXSA+IGZpbHRlci0+bGFzdF9wZWFrW2ldKQorICAgICAgICBmaWx0ZXItPmxhc3RfcGVha1tpXSA9IGZpbHRlci0+cGVha1tpXTsKKworICAgICAgLyogbWFrZSBkZWNheSBwZWFrIGZhbGwgb2ZmIGlmIHRvbyBvbGQgKi8KKyAgICAgIGZhbGxvZmZfdGltZSA9CisgICAgICAgICAgR1NUX0NMT0NLX0RJRkYgKGdzdF9nZG91YmxlX3RvX2d1aW50NjQgKGZpbHRlci0+ZGVjYXlfcGVha190dGwpLAorICAgICAgICAgIGZpbHRlci0+ZGVjYXlfcGVha19hZ2VbaV0pOworICAgICAgaWYgKGZhbGxvZmZfdGltZSA+IDApIHsKKyAgICAgICAgZ2RvdWJsZSBmYWxsb2ZmX2RCOworICAgICAgICBnZG91YmxlIGZhbGxvZmY7CisgICAgICAgIGdkb3VibGUgbGVuZ3RoOyAgICAgICAgIC8qIGxlbmd0aCBvZiBmYWxsb2ZmIHRpbWUgaW4gc2Vjb25kcyAqLworCisgICAgICAgIGxlbmd0aCA9IChnZG91YmxlKSBmYWxsb2ZmX3RpbWUgLyAoZ2RvdWJsZSkgR1NUX1NFQ09ORDsKKyAgICAgICAgZmFsbG9mZl9kQiA9IGZpbHRlci0+ZGVjYXlfcGVha19mYWxsb2ZmICogbGVuZ3RoOworICAgICAgICBmYWxsb2ZmID0gcG93ICgxMCwgZmFsbG9mZl9kQiAvIC0yMC4wKTsKKworICAgICAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLAorICAgICAgICAgICAgImZhbGxvZmY6IGN1cnJlbnQgJWYsIGJhc2UgJWYsIGludGVydmFsICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAgICAgIiwgZEIgZmFsbG9mZiAlZiwgZmFjdG9yICVlIiwKKyAgICAgICAgICAgIGZpbHRlci0+ZGVjYXlfcGVha1tpXSwgZmlsdGVyLT5kZWNheV9wZWFrX2Jhc2VbaV0sCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChmYWxsb2ZmX3RpbWUpLCBmYWxsb2ZmX2RCLCBmYWxsb2ZmKTsKKyAgICAgICAgZmlsdGVyLT5kZWNheV9wZWFrW2ldID0gZmlsdGVyLT5kZWNheV9wZWFrX2Jhc2VbaV0gKiBmYWxsb2ZmOworICAgICAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLAorICAgICAgICAgICAgInBlYWsgaXMgJSIgR1NUX1RJTUVfRk9STUFUICIgb2xkLCBkZWNheWVkIHdpdGggZmFjdG9yICVlIHRvICVmIiwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGZpbHRlci0+ZGVjYXlfcGVha19hZ2VbaV0pLCBmYWxsb2ZmLAorICAgICAgICAgICAgZmlsdGVyLT5kZWNheV9wZWFrW2ldKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICJwZWFrIG5vdCBvbGQgZW5vdWdoLCBub3QgZGVjYXlpbmciKTsKKyAgICAgIH0KKworICAgICAgLyogaWYgdGhlIHBlYWsgb2YgdGhpcyBydW4gaXMgaGlnaGVyLCB0aGUgZGVjYXkgcGVhayBnZXRzIHJlc2V0ICovCisgICAgICBpZiAoZmlsdGVyLT5wZWFrW2ldID49IGZpbHRlci0+ZGVjYXlfcGVha1tpXSkgeworICAgICAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAibmV3IHBlYWssICVmIiwgZmlsdGVyLT5wZWFrW2ldKTsKKyAgICAgICAgZmlsdGVyLT5kZWNheV9wZWFrW2ldID0gZmlsdGVyLT5wZWFrW2ldOworICAgICAgICBmaWx0ZXItPmRlY2F5X3BlYWtfYmFzZVtpXSA9IGZpbHRlci0+cGVha1tpXTsKKyAgICAgICAgZmlsdGVyLT5kZWNheV9wZWFrX2FnZVtpXSA9IEdfR0lOVDY0X0NPTlNUQU5UICgwKTsKKyAgICAgIH0KKyAgICB9CisgICAgaW5fZGF0YSArPSBibG9ja19zaXplICogYnBzICogY2hhbm5lbHM7CisKKyAgICBmaWx0ZXItPm51bV9mcmFtZXMgKz0gYmxvY2tfc2l6ZTsKKyAgICBudW1fZnJhbWVzIC09IGJsb2NrX3NpemU7CisKKyAgICAvKiBkbyB3ZSBuZWVkIHRvIG1lc3NhZ2UgPyAqLworICAgIGlmIChmaWx0ZXItPm51bV9mcmFtZXMgPj0gZmlsdGVyLT5pbnRlcnZhbF9mcmFtZXMpIHsKKyAgICAgIGdzdF9sZXZlbF9wb3N0X21lc3NhZ2UgKGZpbHRlcik7CisgICAgfQorICB9CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW4sICZtYXApOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK2dzdF9sZXZlbF9wb3N0X21lc3NhZ2UgKEdzdExldmVsICogZmlsdGVyKQoreworICBndWludCBpOworICBnaW50IGNoYW5uZWxzLCByYXRlLCBmcmFtZXMgPSBmaWx0ZXItPm51bV9mcmFtZXM7CisgIEdzdENsb2NrVGltZSBkdXJhdGlvbjsKKworICBjaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTICgmZmlsdGVyLT5pbmZvKTsKKyAgcmF0ZSA9IEdTVF9BVURJT19JTkZPX1JBVEUgKCZmaWx0ZXItPmluZm8pOworICBkdXJhdGlvbiA9IEdTVF9GUkFNRVNfVE9fQ0xPQ0tfVElNRSAoZnJhbWVzLCByYXRlKTsKKworICBpZiAoZmlsdGVyLT5wb3N0X21lc3NhZ2VzKSB7CisgICAgR3N0TWVzc2FnZSAqbSA9CisgICAgICAgIGdzdF9sZXZlbF9tZXNzYWdlX25ldyAoZmlsdGVyLCBmaWx0ZXItPm1lc3NhZ2VfdHMsIGR1cmF0aW9uKTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsCisgICAgICAgICJtZXNzYWdlOiB0cyAlIiBHU1RfVElNRV9GT1JNQVQgIiwgZHVyYXRpb24gJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICIsIG51bV9mcmFtZXMgJWQiLCBHU1RfVElNRV9BUkdTIChmaWx0ZXItPm1lc3NhZ2VfdHMpLAorICAgICAgICBHU1RfVElNRV9BUkdTIChkdXJhdGlvbiksIGZyYW1lcyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7ICsraSkgeworICAgICAgZ2RvdWJsZSBSTVM7CisgICAgICBnZG91YmxlIFJNU2RCLCBwZWFrZEIsIGRlY2F5ZEI7CisKKyAgICAgIFJNUyA9IHNxcnQgKGZpbHRlci0+Q1NbaV0gLyBmcmFtZXMpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKGZpbHRlciwKKyAgICAgICAgICAibWVzc2FnZTogY2hhbm5lbCAlZCwgQ1MgJWYsIFJNUyAlZiIsIGksIGZpbHRlci0+Q1NbaV0sIFJNUyk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLAorICAgICAgICAgICJtZXNzYWdlOiBsYXN0X3BlYWs6ICVmLCBkZWNheV9wZWFrOiAlZiIsCisgICAgICAgICAgZmlsdGVyLT5sYXN0X3BlYWtbaV0sIGZpbHRlci0+ZGVjYXlfcGVha1tpXSk7CisgICAgICAvKiBSTVMgdmFsdWVzIGFyZSBjYWxjdWxhdGVkIGluIGFtcGxpdHVkZSwgc28gMjAgKiBsb2cgMTAgKi8KKyAgICAgIFJNU2RCID0gMjAgKiBsb2cxMCAoUk1TICsgRVBTSUxPTik7CisgICAgICAvKiBwZWFrIHZhbHVlcyBhcmUgc3F1YXJlIHN1bXMsIGllLiBwb3dlciwgc28gMTAgKiBsb2cgMTAgKi8KKyAgICAgIHBlYWtkQiA9IDEwICogbG9nMTAgKGZpbHRlci0+bGFzdF9wZWFrW2ldICsgRVBTSUxPTik7CisgICAgICBkZWNheWRCID0gMTAgKiBsb2cxMCAoZmlsdGVyLT5kZWNheV9wZWFrW2ldICsgRVBTSUxPTik7CisKKyAgICAgIGlmIChmaWx0ZXItPmRlY2F5X3BlYWtbaV0gPCBmaWx0ZXItPmxhc3RfcGVha1tpXSkgeworICAgICAgICAvKiB0aGlzIGNhbiBoYXBwZW4gaW4gY2VydGFpbiBjYXNlcywgZm9yIGV4YW1wbGUgd2hlbgorICAgICAgICAgKiB0aGUgbGFzdCBwZWFrIGlzIGJldHdlZW4gZGVjYXlfcGVhayBhbmQgZGVjYXlfcGVha19iYXNlICovCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwKKyAgICAgICAgICAgICJtZXNzYWdlOiBkZWNheSBwZWFrIGRCICVmIHNtYWxsZXIgdGhhbiBsYXN0IHBlYWsgZEIgJWYsIGNvcHlpbmciLAorICAgICAgICAgICAgZGVjYXlkQiwgcGVha2RCKTsKKyAgICAgICAgZmlsdGVyLT5kZWNheV9wZWFrW2ldID0gZmlsdGVyLT5sYXN0X3BlYWtbaV07CisgICAgICB9CisgICAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLAorICAgICAgICAgICJtZXNzYWdlOiBSTVMgJWYgZEIsIHBlYWsgJWYgZEIsIGRlY2F5ICVmIGRCIiwKKyAgICAgICAgICBSTVNkQiwgcGVha2RCLCBkZWNheWRCKTsKKworICAgICAgZ3N0X2xldmVsX21lc3NhZ2VfYXBwZW5kX2NoYW5uZWwgKG0sIFJNU2RCLCBwZWFrZEIsIGRlY2F5ZEIpOworCisgICAgICAvKiByZXNldCBjdW11bGF0aXZlIGFuZCBub3JtYWwgcGVhayAqLworICAgICAgZmlsdGVyLT5DU1tpXSA9IDAuMDsKKyAgICAgIGZpbHRlci0+bGFzdF9wZWFrW2ldID0gMC4wOworICAgIH0KKworICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKGZpbHRlciksIG0pOworCisgIH0KKyAgZmlsdGVyLT5udW1fZnJhbWVzIC09IGZyYW1lczsKKyAgZmlsdGVyLT5tZXNzYWdlX3RzICs9IGR1cmF0aW9uOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2xldmVsX3NpbmtfZXZlbnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgaWYgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX0VPUykgeworICAgIEdzdExldmVsICpmaWx0ZXIgPSBHU1RfTEVWRUwgKHRyYW5zKTsKKworICAgIGdzdF9sZXZlbF9wb3N0X21lc3NhZ2UgKGZpbHRlcik7CisgIH0KKworICByZXR1cm4gR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50ICh0cmFucywgZXZlbnQpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAibGV2ZWwiLCBHU1RfUkFOS19OT05FLCBHU1RfVFlQRV9MRVZFTCk7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBsZXZlbCwKKyAgICAiQXVkaW8gbGV2ZWwgcGx1Z2luIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9nc3QvbGV2ZWwvZ3N0bGV2ZWwuaCBiL2dzdC9sZXZlbC9nc3RsZXZlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZDkyN2EKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbGV2ZWwvZ3N0bGV2ZWwuaApAQCAtMCwwICsxLDkyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OSBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEsMjAwMiwyMDAzLDIwMDUKKyAqICAgICAgICAgICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX0xFVkVMX0hfXworI2RlZmluZSBfX0dTVF9MRVZFTF9IX18KKworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworR19CRUdJTl9ERUNMUworCisKKyNkZWZpbmUgR1NUX1RZUEVfTEVWRUwgXAorICAoZ3N0X2xldmVsX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9MRVZFTChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0xFVkVMLEdzdExldmVsKSkKKyNkZWZpbmUgR1NUX0xFVkVMX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0xFVkVMLEdzdExldmVsQ2xhc3MpKQorI2RlZmluZSBHU1RfTEVWRUxfR0VUX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUygob2JqKSxHU1RfVFlQRV9MRVZFTCxHc3RMZXZlbENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0xFVkVMKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfTEVWRUwpKQorI2RlZmluZSBHU1RfSVNfTEVWRUxfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfTEVWRUwpKQorCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RMZXZlbCBHc3RMZXZlbDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RMZXZlbENsYXNzIEdzdExldmVsQ2xhc3M7CisKKy8qKgorICogR3N0TGV2ZWw6CisgKgorICogT3BhcXVlIGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdExldmVsIHsKKyAgR3N0QmFzZVRyYW5zZm9ybSBlbGVtZW50OworCisgIC8qIHByb3BlcnRpZXMgKi8KKyAgZ2Jvb2xlYW4gcG9zdF9tZXNzYWdlczsgICAgICAgLyogd2hldGhlciBvciBub3QgdG8gcG9zdCBtZXNzYWdlcyAqLworICBndWludDY0IGludGVydmFsOyAgICAgICAgICAgICAvKiBob3cgbWFueSBuYW5vc2Vjb25kcyBiZXR3ZWVuIGVtaXRzICovCisgIGdkb3VibGUgZGVjYXlfcGVha190dGw7ICAgICAgIC8qIHRpbWUgdG8gbGl2ZSBmb3IgcGVhayBpbiBuYW5vc2Vjb25kcyAqLworICBnZG91YmxlIGRlY2F5X3BlYWtfZmFsbG9mZjsgICAvKiBmYWxsb2ZmIGluIGRCL3NlYyAqLworCisgIEdzdEF1ZGlvSW5mbyBpbmZvOworICBnaW50IG51bV9mcmFtZXM7ICAgICAgICAgICAgICAvKiBmcmFtZSBjb3VudCAoMSBzYW1wbGUgcGVyIGNoYW5uZWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpbmNlIGxhc3QgZW1pdCAqLworICBnaW50IGludGVydmFsX2ZyYW1lczsgICAgICAgICAvKiBhZnRlciBob3cgbWFueSBmcmFtZSB0byBzZW50IGEgbWVzc2FnZSAqLworICBHc3RDbG9ja1RpbWUgbWVzc2FnZV90czsgICAgICAvKiBzdGFydHRpbWUgZm9yIG5leHQgbWVzc2FnZSAqLworCisgIC8qIHBlci1jaGFubmVsIGFycmF5cyBmb3IgaW50ZXJtZWRpYXRlIHZhbHVlcyAqLworICBnZG91YmxlICpDUzsgICAgICAgICAgICAgICAgICAvKiBub3JtYWxpemVkIEN1bXVsYXRpdmUgU3F1YXJlICovCisgIGdkb3VibGUgKnBlYWs7ICAgICAgICAgICAgICAgIC8qIG5vcm1hbGl6ZWQgUGVhayB2YWx1ZSBvdmVyIGJ1ZmZlciAqLworICBnZG91YmxlICpsYXN0X3BlYWs7ICAgICAgICAgICAvKiBsYXN0IG5vcm1hbGl6ZWQgUGVhayB2YWx1ZSBvdmVyIGludGVydmFsICovCisgIGdkb3VibGUgKmRlY2F5X3BlYWs7ICAgICAgICAgIC8qIHJ1bm5pbmcgZGVjYXlpbmcgbm9ybWFsaXplZCBQZWFrICovCisgIGdkb3VibGUgKmRlY2F5X3BlYWtfYmFzZTsgICAgIC8qIHZhbHVlIG9mIGxhc3QgcGVhayB3ZSBhcmUgZGVjYXlpbmcgZnJvbSAqLworICBHc3RDbG9ja1RpbWUgKmRlY2F5X3BlYWtfYWdlOyAvKiBhZ2Ugb2YgbGFzdCBwZWFrICovCisKKyAgdm9pZCAoKnByb2Nlc3MpKGdwb2ludGVyLCBndWludCwgZ3VpbnQsIGdkb3VibGUqLCBnZG91YmxlKik7Cit9OworCitzdHJ1Y3QgX0dzdExldmVsQ2xhc3MgeworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2xldmVsX2dldF90eXBlICh2b2lkKTsKKworCitHX0VORF9ERUNMUworCisKKyNlbmRpZiAvKiBfX0dTVF9MRVZFTF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9sZXZlbC9tZXNvbi5idWlsZCBiL2dzdC9sZXZlbC9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGFjNGM5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2xldmVsL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsOCBAQAorZ3N0bGV2ZWwgPSBsaWJyYXJ5KCdnc3RsZXZlbCcsCisgICdnc3RsZXZlbC5jJywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgZ3N0YXVkaW9fZGVwLCBsaWJtXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKZGlmZiAtLWdpdCBhL2dzdC9tYXRyb3NrYS9NYWtlZmlsZS5hbSBiL2dzdC9tYXRyb3NrYS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGU5ODY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDMgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdG1hdHJvc2thLmxhCisKK2xpYmdzdG1hdHJvc2thX2xhX1NPVVJDRVMgPSBcCisJZWJtbC1yZWFkLmMgXAorCWVibWwtd3JpdGUuYyBcCisJbWF0cm9za2EuYyBcCisJbWF0cm9za2EtZGVtdXguYyBcCisJbWF0cm9za2EtcGFyc2UuYyBcCisJbWF0cm9za2EtaWRzLmMgXAorCW1hdHJvc2thLW11eC5jIFwKKwltYXRyb3NrYS1yZWFkLWNvbW1vbi5jIFwKKwl3ZWJtLW11eC5jIFwKKwlsem8uYworCitub2luc3RfSEVBREVSUyA9IFwKKwllYm1sLWlkcy5oIFwKKwllYm1sLXJlYWQuaCBcCisJZWJtbC13cml0ZS5oIFwKKwltYXRyb3NrYS1kZW11eC5oIFwKKwltYXRyb3NrYS1wYXJzZS5oIFwKKwltYXRyb3NrYS1pZHMuaCBcCisJbWF0cm9za2EtbXV4LmggXAorCW1hdHJvc2thLXJlYWQtY29tbW9uLmggXAorCXdlYm0tbXV4LmggXAorCWx6by5oCisKK2xpYmdzdG1hdHJvc2thX2xhX0NGTEFHUyA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9DRkxBR1MpCitsaWJnc3RtYXRyb3NrYV9sYV9MSUJBREQgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIFwKKwktbGdzdHJpZmYtQEdTVF9BUElfVkVSU0lPTkAgXAorCS1sZ3N0YXVkaW8tQEdTVF9BUElfVkVSU0lPTkAgXAorCS1sZ3N0dmlkZW8tQEdTVF9BUElfVkVSU0lPTkAgXAorCS1sZ3N0dGFnLUBHU1RfQVBJX1ZFUlNJT05AIFwKKwktbGdzdHBidXRpbHMtQEdTVF9BUElfVkVSU0lPTkAgXAorCSQoR1NUX0JBU0VfTElCUykgXAorCSQoR1NUX0xJQlMpIFwKKwkkKFpMSUJfTElCUykgXAorCSQoQloyX0xJQlMpIFwKKwkkKExJQk0pCitsaWJnc3RtYXRyb3NrYV9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2EvZWJtbC1pZHMuaCBiL2dzdC9tYXRyb3NrYS9lYm1sLWlkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMmU2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbWF0cm9za2EvZWJtbC1pZHMuaApAQCAtMCwwICsxLDU0IEBACisvKiBHU3RyZWFtZXIgRUJNTCBJL08KKyAqIChjKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqCisgKiBlYm1sLWlkcy5oOiBkZWZpbml0aW9uIG9mIEVCTUwgZGF0YSBJRHMKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0VCTUxfSURTX0hfXworI2RlZmluZSBfX0dTVF9FQk1MX0lEU19IX18KKworR19CRUdJTl9ERUNMUworCisvKiBFQk1MIHZlcnNpb24gc3VwcG9ydGVkICovCisjZGVmaW5lIEdTVF9FQk1MX1ZFUlNJT04gMQorCisvKiBVbmtub3duIHNpemUgKGFsbCBiaXRzIHNldCB0byAxKSAqLworI2RlZmluZSBHU1RfRUJNTF9TSVpFX1VOS05PV04gICAgICAgICAgR19HSU5UNjRfQ09OU1RBTlQoMHgwMGZmZmZmZmZmZmZmZmZmKQorCisvKiB0b3AtbGV2ZWwgbWFzdGVyLUlEcyAqLworI2RlZmluZSBHU1RfRUJNTF9JRF9IRUFERVIgICAgICAgICAgICAgMHgxQTQ1REZBMworCisvKiBJRHMgaW4gdGhlIEhFQURFUiBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX0VCTUxfSURfRUJNTFZFUlNJT04gICAgICAgIDB4NDI4NgorI2RlZmluZSBHU1RfRUJNTF9JRF9FQk1MUkVBRFZFUlNJT04gICAgMHg0MkY3CisjZGVmaW5lIEdTVF9FQk1MX0lEX0VCTUxNQVhJRExFTkdUSCAgICAweDQyRjIKKyNkZWZpbmUgR1NUX0VCTUxfSURfRUJNTE1BWFNJWkVMRU5HVEggIDB4NDJGMworI2RlZmluZSBHU1RfRUJNTF9JRF9ET0NUWVBFICAgICAgICAgICAgMHg0MjgyCisjZGVmaW5lIEdTVF9FQk1MX0lEX0RPQ1RZUEVWRVJTSU9OICAgICAweDQyODcKKyNkZWZpbmUgR1NUX0VCTUxfSURfRE9DVFlQRVJFQURWRVJTSU9OIDB4NDI4NQorCisvKiBnZW5lcmFsIEVCTUwgdHlwZXMgKi8KKyNkZWZpbmUgR1NUX0VCTUxfSURfVk9JRCAgICAgICAgICAgICAgIDB4RUMKKyNkZWZpbmUgR1NUX0VCTUxfSURfQ1JDMzIgICAgICAgICAgICAgIDB4QkYKKworLyogRWJtbERhdGUgb2Zmc2V0IGZyb20gdGhlIHVuaXggZXBvY2ggaW4gc2Vjb25kcywgMjAwMS8wMS8wMSAwMDowMDowMCBVVEMgKi8KKyNkZWZpbmUgR1NUX0VCTUxfREFURV9PRkZTRVQgICAgICAgICAgIDk3ODMwNzIwMAorCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfRUJNTF9JRFNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2EvZWJtbC1yZWFkLmMgYi9nc3QvbWF0cm9za2EvZWJtbC1yZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4OTNmMQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYwpAQCAtMCwwICsxLDY2OSBAQAorLyogR1N0cmVhbWVyIEVCTUwgSS9PCisgKiAoYykgMjAwMyBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKgorICogZWJtbC1yZWFkLmM6IHJlYWQgRUJNTCBkYXRhIGZyb20gZmlsZS9zdHJlYW0KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImVibWwtcmVhZC5oIgorI2luY2x1ZGUgImVibWwtaWRzLmgiCisKKyNpbmNsdWRlIDxnc3QvbWF0aC1jb21wYXQuaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZIChlYm1scmVhZF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBlYm1scmVhZF9kZWJ1ZworCisvKiBQZWVrcyBmb2xsb3dpbmcgZWxlbWVudCBpZCBhbmQgZWxlbWVudCBsZW5ndGggaW4gZGF0YXN0cmVhbSBwcm92aWRlZAorICogYnkgQHBlZWsgd2l0aCBAY3R4IGFzIHVzZXIgZGF0YS4KKyAqIFJldHVybnMgR1NUX0ZMT1dfRU9TIGlmIG5vdCBlbm91Z2ggZGF0YSB0byByZWFkIGlkIGFuZCBsZW5ndGguCisgKiBPdGhlcndpc2UsIEBuZWVkZWQgcHJvdmlkZXMgdGhlIHByZWZpeCBsZW5ndGggKGlkICsgbGVuZ3RoKSwgYW5kCisgKiBAbGVuZ3RoIHByb3ZpZGVzIGVsZW1lbnQgbGVuZ3RoLgorICoKKyAqIEBvYmplY3QgYW5kIEBvZmZzZXQgYXJlIHByb3ZpZGVkIGZvciBpbmZvcm1hdGl2ZSBtZXNzYWdpbmcvZGVidWcgcHVycG9zZXMuCisgKi8KK0dzdEZsb3dSZXR1cm4KK2dzdF9lYm1sX3BlZWtfaWRfbGVuZ3RoIChndWludDMyICogX2lkLCBndWludDY0ICogX2xlbmd0aCwgZ3VpbnQgKiBfbmVlZGVkLAorICAgIEdzdFBlZWtEYXRhIHBlZWssIGdwb2ludGVyICogY3R4LCBHc3RFbGVtZW50ICogZWwsIGd1aW50NjQgb2Zmc2V0KQoreworICBndWludCBuZWVkZWQ7CisgIGNvbnN0IGd1aW50OCAqYnVmOworICBnaW50IGxlbl9tYXNrID0gMHg4MCwgcmVhZCA9IDEsIG4gPSAxLCBudW1fZmZzID0gMDsKKyAgZ3VpbnQ2NCB0b3RhbDsKKyAgZ3VpbnQ4IGI7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChfaWQgIT0gTlVMTCwgR1NUX0ZMT1dfRVJST1IpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoX2xlbmd0aCAhPSBOVUxMLCBHU1RfRkxPV19FUlJPUik7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChfbmVlZGVkICE9IE5VTEwsIEdTVF9GTE9XX0VSUk9SKTsKKworICAvKiB3ZWxsIC4uLiAqLworICAqX2lkID0gKGd1aW50MzIpIEdTVF9FQk1MX1NJWkVfVU5LTk9XTjsKKyAgKl9sZW5ndGggPSBHU1RfRUJNTF9TSVpFX1VOS05PV047CisKKyAgLyogcmVhZCBlbGVtZW50IGlkICovCisgIG5lZWRlZCA9IDI7CisgIHJldCA9IHBlZWsgKGN0eCwgbmVlZGVkLCAmYnVmKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICBnb3RvIHBlZWtfZXJyb3I7CisgIGIgPSBHU1RfUkVBRF9VSU5UOCAoYnVmKTsKKyAgdG90YWwgPSAoZ3VpbnQ2NCkgYjsKKyAgd2hpbGUgKHJlYWQgPD0gNCAmJiAhKHRvdGFsICYgbGVuX21hc2spKSB7CisgICAgcmVhZCsrOworICAgIGxlbl9tYXNrID4+PSAxOworICB9CisgIGlmIChHX1VOTElLRUxZIChyZWFkID4gNCkpCisgICAgZ290byBpbnZhbGlkX2lkOworCisgIC8qIG5lZWQgaWQgYW5kIGF0IGxlYXN0IHNvbWV0aGluZyBmb3Igc3Vic2VxdWVudCBsZW5ndGggKi8KKyAgbmVlZGVkID0gcmVhZCArIDE7CisgIHJldCA9IHBlZWsgKGN0eCwgbmVlZGVkLCAmYnVmKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICBnb3RvIHBlZWtfZXJyb3I7CisgIHdoaWxlIChuIDwgcmVhZCkgeworICAgIGIgPSBHU1RfUkVBRF9VSU5UOCAoYnVmICsgbik7CisgICAgdG90YWwgPSAodG90YWwgPDwgOCkgfCBiOworICAgICsrbjsKKyAgfQorICAqX2lkID0gKGd1aW50MzIpIHRvdGFsOworCisgIC8qIHJlYWQgZWxlbWVudCBsZW5ndGggKi8KKyAgYiA9IEdTVF9SRUFEX1VJTlQ4IChidWYgKyBuKTsKKyAgdG90YWwgPSAoZ3VpbnQ2NCkgYjsKKyAgbGVuX21hc2sgPSAweDgwOworICByZWFkID0gMTsKKyAgd2hpbGUgKHJlYWQgPD0gOCAmJiAhKHRvdGFsICYgbGVuX21hc2spKSB7CisgICAgcmVhZCsrOworICAgIGxlbl9tYXNrID4+PSAxOworICB9CisgIGlmIChHX1VOTElLRUxZIChyZWFkID4gOCkpCisgICAgZ290byBpbnZhbGlkX2xlbmd0aDsKKyAgaWYgKCh0b3RhbCAmPSAobGVuX21hc2sgLSAxKSkgPT0gbGVuX21hc2sgLSAxKQorICAgIG51bV9mZnMrKzsKKworICBuZWVkZWQgKz0gcmVhZCAtIDE7CisgIHJldCA9IHBlZWsgKGN0eCwgbmVlZGVkLCAmYnVmKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICBnb3RvIHBlZWtfZXJyb3I7CisgIGJ1ZiArPSAobmVlZGVkIC0gcmVhZCk7CisgIG4gPSAxOworICB3aGlsZSAobiA8IHJlYWQpIHsKKyAgICBndWludDggYiA9IEdTVF9SRUFEX1VJTlQ4IChidWYgKyBuKTsKKworICAgIGlmIChHX1VOTElLRUxZIChiID09IDB4ZmYpKQorICAgICAgbnVtX2ZmcysrOworICAgIHRvdGFsID0gKHRvdGFsIDw8IDgpIHwgYjsKKyAgICArK247CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAocmVhZCA9PSBudW1fZmZzKSkKKyAgICAqX2xlbmd0aCA9IEdfTUFYVUlOVDY0OworICBlbHNlCisgICAgKl9sZW5ndGggPSB0b3RhbDsKKworICAqX25lZWRlZCA9IG5lZWRlZDsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVJST1JTICovCitwZWVrX2Vycm9yOgorICB7CisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19GTFVTSElORyAmJiByZXQgIT0gR1NUX0ZMT1dfRU9TKQorICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbCwgInBlZWsgZmFpbGVkLCByZXQgPSAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgICBlbHNlCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChlbCwgInBlZWsgZmFpbGVkLCByZXQgPSAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgICAqX25lZWRlZCA9IG5lZWRlZDsKKyAgICByZXR1cm4gcmV0OworICB9CitpbnZhbGlkX2lkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZWwsCisgICAgICAgICJJbnZhbGlkIEVCTUwgSUQgc2l6ZSB0YWcgKDB4JXgpIGF0IHBvc2l0aW9uICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiAoMHglIgorICAgICAgICBHX0dJTlQ2NF9NT0RJRklFUiAieCkiLCAoZ3VpbnQpIGIsIG9mZnNldCwgb2Zmc2V0KTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2ludmFsaWRfbGVuZ3RoOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZWwsCisgICAgICAgICJJbnZhbGlkIEVCTUwgbGVuZ3RoIHNpemUgdGFnICgweCV4KSBhdCBwb3NpdGlvbiAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICIgKDB4JSIgR19HSU5UNjRfTU9ESUZJRVIgIngpIiwgKGd1aW50KSBiLCBvZmZzZXQsIG9mZnNldCk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKKy8qIHNldHVwIGZvciBwYXJzaW5nIEBidWYgYXQgcG9zaXRpb24gQG9mZnNldCBvbiBiZWhhbGYgb2YgQGVsLgorICogVGFrZXMgb3duZXJzaGlwIG9mIEBidWYuICovCit2b2lkCitnc3RfZWJtbF9yZWFkX2luaXQgKEdzdEVibWxSZWFkICogZWJtbCwgR3N0RWxlbWVudCAqIGVsLCBHc3RCdWZmZXIgKiBidWYsCisgICAgZ3VpbnQ2NCBvZmZzZXQpCit7CisgIEdzdEVibWxNYXN0ZXIgbTsKKworICBnX3JldHVybl9pZl9mYWlsIChlbCk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKGJ1Zik7CisKKyAgZWJtbC0+ZWwgPSBlbDsKKyAgZWJtbC0+b2Zmc2V0ID0gb2Zmc2V0OworICBlYm1sLT5idWYgPSBidWY7CisgIGdzdF9idWZmZXJfbWFwIChidWYsICZlYm1sLT5tYXAsIEdTVF9NQVBfUkVBRCk7CisgIGVibWwtPnJlYWRlcnMgPSBnX2FycmF5X3NpemVkX25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKEdzdEVibWxNYXN0ZXIpLCAxMCk7CisgIG0ub2Zmc2V0ID0gZWJtbC0+b2Zmc2V0OworICBnc3RfYnl0ZV9yZWFkZXJfaW5pdCAoJm0uYnIsIGVibWwtPm1hcC5kYXRhLCBlYm1sLT5tYXAuc2l6ZSk7CisgIGdfYXJyYXlfYXBwZW5kX3ZhbCAoZWJtbC0+cmVhZGVycywgbSk7Cit9CisKK3ZvaWQKK2dzdF9lYm1sX3JlYWRfY2xlYXIgKEdzdEVibWxSZWFkICogZWJtbCkKK3sKKyAgaWYgKGVibWwtPnJlYWRlcnMpCisgICAgZ19hcnJheV9mcmVlIChlYm1sLT5yZWFkZXJzLCBUUlVFKTsKKyAgZWJtbC0+cmVhZGVycyA9IE5VTEw7CisgIGlmIChlYm1sLT5idWYpIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChlYm1sLT5idWYsICZlYm1sLT5tYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGVibWwtPmJ1Zik7CisgIH0KKyAgZWJtbC0+YnVmID0gTlVMTDsKKyAgZWJtbC0+ZWwgPSBOVUxMOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2VibWxfcmVhZF9wZWVrIChHc3RCeXRlUmVhZGVyICogYnIsIGd1aW50IHBlZWssIGNvbnN0IGd1aW50OCAqKiBkYXRhKQoreworICBpZiAoR19MSUtFTFkgKGdzdF9ieXRlX3JlYWRlcl9wZWVrX2RhdGEgKGJyLCBwZWVrLCBkYXRhKSkpCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICBlbHNlCisgICAgcmV0dXJuIEdTVF9GTE9XX0VPUzsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9lYm1sX3BlZWtfaWRfZnVsbCAoR3N0RWJtbFJlYWQgKiBlYm1sLCBndWludDMyICogaWQsIGd1aW50NjQgKiBsZW5ndGgsCisgICAgZ3VpbnQgKiBwcmVmaXgpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIHJldCA9IGdzdF9lYm1sX3BlZWtfaWRfbGVuZ3RoIChpZCwgbGVuZ3RoLCBwcmVmaXgsCisgICAgICAoR3N0UGVla0RhdGEpIGdzdF9lYm1sX3JlYWRfcGVlaywgKGdwb2ludGVyKSBnc3RfZWJtbF9yZWFkX2JyIChlYm1sKSwKKyAgICAgIGVibWwtPmVsLCBnc3RfZWJtbF9yZWFkX2dldF9wb3MgKGVibWwpKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICByZXR1cm4gcmV0OworCisgIEdTVF9MT0dfT0JKRUNUIChlYm1sLT5lbCwgImlkIDB4JXggYXQgb2Zmc2V0IDB4JSIgR19HSU5UNjRfTU9ESUZJRVIgIngiCisgICAgICAiIG9mIGxlbmd0aCAlIiBHX0dVSU5UNjRfRk9STUFUICIsIHByZWZpeCAlZCIsICppZCwKKyAgICAgIGdzdF9lYm1sX3JlYWRfZ2V0X3BvcyAoZWJtbCksICpsZW5ndGgsICpwcmVmaXgpOworCisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworICBpZiAoZWJtbHJlYWRfZGVidWctPnRocmVzaG9sZCA+PSBHU1RfTEVWRUxfTE9HKSB7CisgICAgY29uc3QgZ3VpbnQ4ICpkYXRhID0gTlVMTDsKKyAgICBHc3RCeXRlUmVhZGVyICpiciA9IGdzdF9lYm1sX3JlYWRfYnIgKGVibWwpOworICAgIGd1aW50IHNpemUgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3JlbWFpbmluZyAoYnIpOworCisgICAgaWYgKGdzdF9ieXRlX3JlYWRlcl9wZWVrX2RhdGEgKGJyLCBzaXplLCAmZGF0YSkpIHsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKGVibWwtPmVsLCAiY3VycmVudCBiciAlcDsgcmVtYWluaW5nICVkIiwgYnIsIHNpemUpOworICAgICAgaWYgKGRhdGEpCisgICAgICAgIEdTVF9NRU1EVU1QX09CSkVDVCAoZWJtbC0+ZWwsICJlbGVtZW50IiwgZGF0YSwgTUlOIChzaXplLCAqbGVuZ3RoKSk7CisgICAgfQorICB9CisjZW5kaWYKKworICByZXR1cm4gcmV0OworfQorCitHc3RGbG93UmV0dXJuCitnc3RfZWJtbF9wZWVrX2lkIChHc3RFYm1sUmVhZCAqIGVibWwsIGd1aW50MzIgKiBpZCkKK3sKKyAgZ3VpbnQ2NCBsZW5ndGg7CisgIGd1aW50IG5lZWRlZDsKKworICByZXR1cm4gZ3N0X2VibWxfcGVla19pZF9mdWxsIChlYm1sLCBpZCwgJmxlbmd0aCwgJm5lZWRlZCk7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBuZXh0IGVsZW1lbnQsIHRoZSBjb250ZW50cyBhcmUgc3VwcG9zZWQgdG8gYmUgc3ViLWVsZW1lbnRzIHdoaWNoCisgKiBjYW4gYmUgcmVhZCBzZXBhcmF0ZWx5LiAgQSBuZXcgYnl0ZXJlYWRlciBpcyBzZXR1cCBmb3IgZG9pbmcgc28uCisgKi8KK0dzdEZsb3dSZXR1cm4KK2dzdF9lYm1sX3JlYWRfbWFzdGVyIChHc3RFYm1sUmVhZCAqIGVibWwsIGd1aW50MzIgKiBpZCkKK3sKKyAgZ3VpbnQ2NCBsZW5ndGg7CisgIGd1aW50IHByZWZpeDsKKyAgY29uc3QgZ3VpbnQ4ICpkYXRhID0gTlVMTDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdEVibWxNYXN0ZXIgbTsKKworICByZXQgPSBnc3RfZWJtbF9wZWVrX2lkX2Z1bGwgKGVibWwsIGlkLCAmbGVuZ3RoLCAmcHJlZml4KTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICByZXR1cm4gcmV0OworCisgIC8qIHdlIGp1c3QgYXQgbGVhc3QgcGVla2VkIHRoZSBpZCAqLworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwIChnc3RfZWJtbF9yZWFkX2JyIChlYm1sKSwgcHJlZml4KSkKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7ICAgICAgLyogRklYTUU6IGRvIHByb3BlciBlcnJvciBoYW5kbGluZyAqLworCisgIG0ub2Zmc2V0ID0gZ3N0X2VibWxfcmVhZF9nZXRfcG9zIChlYm1sKTsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2RhdGEgKGdzdF9lYm1sX3JlYWRfYnIgKGVibWwpLCBsZW5ndGgsICZkYXRhKSkKKyAgICByZXR1cm4gR1NUX0ZMT1dfUEFSU0U7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGVibWwtPmVsLCAicHVzaGluZyBsZXZlbCAlZCBhdCBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgIGVibWwtPnJlYWRlcnMtPmxlbiwgbS5vZmZzZXQpOworICBnc3RfYnl0ZV9yZWFkZXJfaW5pdCAoJm0uYnIsIGRhdGEsIGxlbmd0aCk7CisgIGdfYXJyYXlfYXBwZW5kX3ZhbCAoZWJtbC0+cmVhZGVycywgbSk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCisvKiBleHBsaWNpdGx5IHBvcCBhIGJ5dGVyZWFkZXIgZnJvbSBzdGFjay4gIFVzdWFsbHkgaW52b2tlZCBhdXRvbWFnaWNhbGx5LiAqLworR3N0Rmxvd1JldHVybgorZ3N0X2VibWxfcmVhZF9wb3BfbWFzdGVyIChHc3RFYm1sUmVhZCAqIGVibWwpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChlYm1sLT5yZWFkZXJzLCBHU1RfRkxPV19FUlJPUik7CisKKyAgLyogbmV2ZXIgcmVtb3ZlIGluaXRpYWwgYnl0ZXJlYWRlciAqLworICBpZiAoZWJtbC0+cmVhZGVycy0+bGVuID4gMSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChlYm1sLT5lbCwgInBvcHBpbmcgbGV2ZWwgJWQiLCBlYm1sLT5yZWFkZXJzLT5sZW4gLSAxKTsKKyAgICBnX2FycmF5X3JlbW92ZV9pbmRleCAoZWJtbC0+cmVhZGVycywgZWJtbC0+cmVhZGVycy0+bGVuIC0gMSk7CisgIH0KKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKKy8qCisgKiBTa2lwIHRoZSBuZXh0IGVsZW1lbnQuCisgKi8KKworR3N0Rmxvd1JldHVybgorZ3N0X2VibWxfcmVhZF9za2lwIChHc3RFYm1sUmVhZCAqIGVibWwpCit7CisgIGd1aW50NjQgbGVuZ3RoOworICBndWludDMyIGlkOworICBndWludCBwcmVmaXg7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIHJldCA9IGdzdF9lYm1sX3BlZWtfaWRfZnVsbCAoZWJtbCwgJmlkLCAmbGVuZ3RoLCAmcHJlZml4KTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICByZXR1cm4gcmV0OworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKGdzdF9lYm1sX3JlYWRfYnIgKGVibWwpLCBsZW5ndGggKyBwcmVmaXgpKQorICAgIHJldHVybiBHU1RfRkxPV19QQVJTRTsKKworICByZXR1cm4gcmV0OworfQorCisvKgorICogUmVhZCB0aGUgbmV4dCBlbGVtZW50IGFzIGEgR3N0QnVmZmVyIChiaW5hcnkpLgorICovCisKK0dzdEZsb3dSZXR1cm4KK2dzdF9lYm1sX3JlYWRfYnVmZmVyIChHc3RFYm1sUmVhZCAqIGVibWwsIGd1aW50MzIgKiBpZCwgR3N0QnVmZmVyICoqIGJ1ZikKK3sKKyAgZ3VpbnQ2NCBsZW5ndGg7CisgIGd1aW50IHByZWZpeDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgcmV0ID0gZ3N0X2VibWxfcGVla19pZF9mdWxsIChlYm1sLCBpZCwgJmxlbmd0aCwgJnByZWZpeCk7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJldDsKKworICAvKiB3ZSBqdXN0IGF0IGxlYXN0IHBlZWtlZCB0aGUgaWQgKi8KKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoZ3N0X2VibWxfcmVhZF9iciAoZWJtbCksIHByZWZpeCkpCisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOyAgICAgIC8qIEZJWE1FOiBkbyBwcm9wZXIgZXJyb3IgaGFuZGxpbmcgKi8KKworICBpZiAoR19MSUtFTFkgKGxlbmd0aCA+IDApKSB7CisgICAgZ3VpbnQgb2Zmc2V0OworCisgICAgb2Zmc2V0ID0gZ3N0X2VibWxfcmVhZF9nZXRfcG9zIChlYm1sKSAtIGVibWwtPm9mZnNldDsKKyAgICBpZiAoR19MSUtFTFkgKGdzdF9ieXRlX3JlYWRlcl9za2lwIChnc3RfZWJtbF9yZWFkX2JyIChlYm1sKSwgbGVuZ3RoKSkpIHsKKyAgICAgICpidWYgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChlYm1sLT5idWYsIEdTVF9CVUZGRVJfQ09QWV9BTEwsCisgICAgICAgICAgb2Zmc2V0LCBsZW5ndGgpOworICAgIH0gZWxzZSB7CisgICAgICAqYnVmID0gTlVMTDsKKyAgICAgIHJldHVybiBHU1RfRkxPV19QQVJTRTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgKmJ1ZiA9IGdzdF9idWZmZXJfbmV3ICgpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlYWQgdGhlIG5leHQgZWxlbWVudCwgcmV0dXJuIGEgcG9pbnRlciB0byBpdCBhbmQgaXRzIHNpemUuCisgKi8KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9lYm1sX3JlYWRfYnl0ZXMgKEdzdEVibWxSZWFkICogZWJtbCwgZ3VpbnQzMiAqIGlkLCBjb25zdCBndWludDggKiogZGF0YSwKKyAgICBndWludCAqIHNpemUpCit7CisgIGd1aW50NjQgbGVuZ3RoOworICBndWludCBwcmVmaXg7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgICpzaXplID0gMDsKKworICByZXQgPSBnc3RfZWJtbF9wZWVrX2lkX2Z1bGwgKGVibWwsIGlkLCAmbGVuZ3RoLCAmcHJlZml4KTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICByZXR1cm4gcmV0OworCisgIC8qIHdlIGp1c3QgYXQgbGVhc3QgcGVla2VkIHRoZSBpZCAqLworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwIChnc3RfZWJtbF9yZWFkX2JyIChlYm1sKSwgcHJlZml4KSkKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7ICAgICAgLyogRklYTUU6IGRvIHByb3BlciBlcnJvciBoYW5kbGluZyAqLworCisgICpkYXRhID0gTlVMTDsKKyAgaWYgKEdfTElLRUxZIChsZW5ndGggPiAwKSkgeworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF9kYXRhIChnc3RfZWJtbF9yZWFkX2JyIChlYm1sKSwgbGVuZ3RoLCBkYXRhKSkKKyAgICAgIHJldHVybiBHU1RfRkxPV19QQVJTRTsKKyAgfQorCisgICpzaXplID0gbGVuZ3RoOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBuZXh0IGVsZW1lbnQgYXMgYW4gdW5zaWduZWQgaW50LgorICovCisKK0dzdEZsb3dSZXR1cm4KK2dzdF9lYm1sX3JlYWRfdWludCAoR3N0RWJtbFJlYWQgKiBlYm1sLCBndWludDMyICogaWQsIGd1aW50NjQgKiBudW0pCit7CisgIGNvbnN0IGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQgc2l6ZTsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgcmV0ID0gZ3N0X2VibWxfcmVhZF9ieXRlcyAoZWJtbCwgaWQsICZkYXRhLCAmc2l6ZSk7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJldDsKKworICBpZiAoc2l6ZSA+IDgpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChlYm1sLT5lbCwKKyAgICAgICAgIkludmFsaWQgaW50ZWdlciBlbGVtZW50IHNpemUgJWQgYXQgcG9zaXRpb24gJSIgR19HVUlOVDY0X0ZPUk1BVCAiICgweCUiCisgICAgICAgIEdfR0lOVDY0X01PRElGSUVSICJ4KSIsIHNpemUsIGdzdF9lYm1sX3JlYWRfZ2V0X3BvcyAoZWJtbCkgLSBzaXplLAorICAgICAgICBnc3RfZWJtbF9yZWFkX2dldF9wb3MgKGVibWwpIC0gc2l6ZSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgaWYgKHNpemUgPT0gMCkgeworICAgICpudW0gPSAwOworICAgIHJldHVybiByZXQ7CisgIH0KKworICAqbnVtID0gMDsKKyAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgKm51bSA9ICgqbnVtIDw8IDgpIHwgKmRhdGE7CisgICAgc2l6ZS0tOworICAgIGRhdGErKzsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBuZXh0IGVsZW1lbnQgYXMgYSBzaWduZWQgaW50LgorICovCisKK0dzdEZsb3dSZXR1cm4KK2dzdF9lYm1sX3JlYWRfc2ludCAoR3N0RWJtbFJlYWQgKiBlYm1sLCBndWludDMyICogaWQsIGdpbnQ2NCAqIG51bSkKK3sKKyAgY29uc3QgZ3VpbnQ4ICpkYXRhOworICBndWludCBzaXplOworICBnYm9vbGVhbiBuZWdhdGl2ZSA9IDA7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIHJldCA9IGdzdF9lYm1sX3JlYWRfYnl0ZXMgKGVibWwsIGlkLCAmZGF0YSwgJnNpemUpOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIHJldHVybiByZXQ7CisKKyAgaWYgKHNpemUgPiA4KSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZWJtbC0+ZWwsCisgICAgICAgICJJbnZhbGlkIGludGVnZXIgZWxlbWVudCBzaXplICVkIGF0IHBvc2l0aW9uICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiAoMHglIgorICAgICAgICBHX0dJTlQ2NF9NT0RJRklFUiAieCkiLCBzaXplLCBnc3RfZWJtbF9yZWFkX2dldF9wb3MgKGVibWwpIC0gc2l6ZSwKKyAgICAgICAgZ3N0X2VibWxfcmVhZF9nZXRfcG9zIChlYm1sKSAtIHNpemUpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIGlmIChzaXplID09IDApIHsKKyAgICAqbnVtID0gMDsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgKm51bSA9IDA7CisgIGlmICgqZGF0YSAmIDB4ODApIHsKKyAgICBuZWdhdGl2ZSA9IDE7CisgICAgKm51bSA9ICpkYXRhICYgfjB4ODA7CisgICAgc2l6ZS0tOworICAgIGRhdGErKzsKKyAgfQorCisgIHdoaWxlIChzaXplID4gMCkgeworICAgICpudW0gPSAoKm51bSA8PCA4KSB8ICpkYXRhOworICAgIHNpemUtLTsKKyAgICBkYXRhKys7CisgIH0KKworICAvKiBtYWtlIHNpZ25lZCAqLworICBpZiAobmVnYXRpdmUpIHsKKyAgICAqbnVtID0gMCAtICpudW07CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisvKiBDb252ZXJ0IDgwIGJpdCBleHRlbmRlZCBwcmVjaXNpb24gZmxvYXQgaW4gYmlnIGVuZGlhbiBmb3JtYXQgdG8gZG91YmxlLgorICogQ29kZSB0YWtlbiBmcm9tIGxpYmF2dXRpbC9pbnRmbG9hdF9yZWFkd3JpdGUuYyBmcm9tIGZmbXBlZywKKyAqIGxpY2Vuc2VkIHVuZGVyIExHUEwgKi8KKworc3RydWN0IF9leHRfZmxvYXQKK3sKKyAgZ3VpbnQ4IGV4cG9uZW50WzJdOworICBndWludDggbWFudGlzc2FbOF07Cit9OworCitzdGF0aWMgZ2RvdWJsZQorX2V4dDJkYmwgKGNvbnN0IGd1aW50OCAqIGRhdGEpCit7CisgIHN0cnVjdCBfZXh0X2Zsb2F0IGV4dDsKKyAgZ3VpbnQ2NCBtID0gMDsKKyAgZ2ludCBlLCBpOworCisgIG1lbWNweSAoJmV4dC5leHBvbmVudCwgZGF0YSwgMik7CisgIG1lbWNweSAoJmV4dC5tYW50aXNzYSwgZGF0YSArIDIsIDgpOworCisgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgbSA9IChtIDw8IDgpICsgZXh0Lm1hbnRpc3NhW2ldOworICBlID0gKCgoZ2ludCkgZXh0LmV4cG9uZW50WzBdICYgMHg3ZikgPDwgOCkgfCBleHQuZXhwb25lbnRbMV07CisgIGlmIChlID09IDB4N2ZmZiAmJiBtKQorICAgIHJldHVybiBOQU47CisgIGUgLT0gMTYzODMgKyA2MzsgICAgICAgICAgICAgIC8qIEluIElFRUUgODAgYml0cywgdGhlIHdob2xlIChpLmUuIDEueHh4eCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbWFudGlzc2EgYml0IGlzIHdyaXR0ZW4gYXMgb3Bwb3NlZCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2luZ2xlIGFuZCBkb3VibGUgcHJlY2lzaW9uIGZvcm1hdHMgKi8KKyAgaWYgKGV4dC5leHBvbmVudFswXSAmIDB4ODApCisgICAgbSA9IC1tOworICByZXR1cm4gbGRleHAgKG0sIGUpOworfQorCisvKgorICogUmVhZCB0aGUgbmV4dCBlbGVtZW50IGFzIGEgZmxvYXQuCisgKi8KKworR3N0Rmxvd1JldHVybgorZ3N0X2VibWxfcmVhZF9mbG9hdCAoR3N0RWJtbFJlYWQgKiBlYm1sLCBndWludDMyICogaWQsIGdkb3VibGUgKiBudW0pCit7CisgIGNvbnN0IGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQgc2l6ZTsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgcmV0ID0gZ3N0X2VibWxfcmVhZF9ieXRlcyAoZWJtbCwgaWQsICZkYXRhLCAmc2l6ZSk7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJldDsKKworICBpZiAoc2l6ZSAhPSAwICYmIHNpemUgIT0gNCAmJiBzaXplICE9IDggJiYgc2l6ZSAhPSAxMCkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGVibWwtPmVsLAorICAgICAgICAiSW52YWxpZCBmbG9hdCBlbGVtZW50IHNpemUgJWQgYXQgcG9zaXRpb24gJSIgR19HVUlOVDY0X0ZPUk1BVCAiICgweCUiCisgICAgICAgIEdfR0lOVDY0X01PRElGSUVSICJ4KSIsIHNpemUsIGdzdF9lYm1sX3JlYWRfZ2V0X3BvcyAoZWJtbCkgLSBzaXplLAorICAgICAgICBnc3RfZWJtbF9yZWFkX2dldF9wb3MgKGVibWwpIC0gc2l6ZSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgaWYgKHNpemUgPT0gNCkgeworICAgIGdmbG9hdCBmOworCisgICAgbWVtY3B5ICgmZiwgZGF0YSwgNCk7CisgICAgZiA9IEdGTE9BVF9GUk9NX0JFIChmKTsKKworICAgICpudW0gPSBmOworICB9IGVsc2UgaWYgKHNpemUgPT0gOCkgeworICAgIGdkb3VibGUgZDsKKworICAgIG1lbWNweSAoJmQsIGRhdGEsIDgpOworICAgIGQgPSBHRE9VQkxFX0ZST01fQkUgKGQpOworCisgICAgKm51bSA9IGQ7CisgIH0gZWxzZSBpZiAoc2l6ZSA9PSAxMCkgeworICAgICpudW0gPSBfZXh0MmRibCAoZGF0YSk7CisgIH0gZWxzZSB7CisgICAgLyogc2l6ZSA9PSAwIG1lYW5zIGEgdmFsdWUgb2YgMC4wICovCisgICAgKm51bSA9IDAuMDsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBuZXh0IGVsZW1lbnQgYXMgYSBDIHN0cmluZy4KKyAqLworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2VibWxfcmVhZF9zdHJpbmcgKEdzdEVibWxSZWFkICogZWJtbCwgZ3VpbnQzMiAqIGlkLCBnY2hhciAqKiBzdHIpCit7CisgIGNvbnN0IGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQgc2l6ZTsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgcmV0ID0gZ3N0X2VibWxfcmVhZF9ieXRlcyAoZWJtbCwgaWQsICZkYXRhLCAmc2l6ZSk7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJldDsKKworICAqc3RyID0gZ19tYWxsb2MgKHNpemUgKyAxKTsKKyAgbWVtY3B5ICgqc3RyLCBkYXRhLCBzaXplKTsKKyAgKCpzdHIpW3NpemVdID0gJ1wwJzsKKworICByZXR1cm4gcmV0OworfQorCisvKgorICogUmVhZCB0aGUgbmV4dCBlbGVtZW50IGFzIGFuIEFTQ0lJIHN0cmluZy4KKyAqLworCitHc3RGbG93UmV0dXJuCitnc3RfZWJtbF9yZWFkX2FzY2lpIChHc3RFYm1sUmVhZCAqIGVibWwsIGd1aW50MzIgKiBpZCwgZ2NoYXIgKiogc3RyX291dCkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIGdjaGFyICpzdHI7CisgIGdjaGFyICppdGVyOworCisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworICBndWludDY0IG9sZG9mZiA9IGVibWwtPm9mZnNldDsKKyNlbmRpZgorCisgIHJldCA9IGdzdF9lYm1sX3JlYWRfc3RyaW5nIChlYm1sLCBpZCwgJnN0cik7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJldDsKKworICBmb3IgKGl0ZXIgPSBzdHI7ICppdGVyICE9ICdcMCc7IGl0ZXIrKykgeworICAgIGlmIChHX1VOTElLRUxZICgqaXRlciAmIDB4ODApKSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChlYm1sLAorICAgICAgICAgICJJbnZhbGlkIEFTQ0lJIHN0cmluZyBhdCBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwgb2xkb2ZmKTsKKyAgICAgIGdfZnJlZSAoc3RyKTsKKyAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgICB9CisgIH0KKworICAqc3RyX291dCA9IHN0cjsKKyAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlYWQgdGhlIG5leHQgZWxlbWVudCBhcyBhIFVURi04IHN0cmluZy4KKyAqLworCitHc3RGbG93UmV0dXJuCitnc3RfZWJtbF9yZWFkX3V0ZjggKEdzdEVibWxSZWFkICogZWJtbCwgZ3VpbnQzMiAqIGlkLCBnY2hhciAqKiBzdHIpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworICBndWludDY0IG9sZG9mZiA9IGdzdF9lYm1sX3JlYWRfZ2V0X3BvcyAoZWJtbCk7CisjZW5kaWYKKworICByZXQgPSBnc3RfZWJtbF9yZWFkX3N0cmluZyAoZWJtbCwgaWQsIHN0cik7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJldDsKKworICBpZiAoc3RyICE9IE5VTEwgJiYgKnN0ciAhPSBOVUxMICYmICoqc3RyICE9ICdcMCcgJiYKKyAgICAgICFnX3V0ZjhfdmFsaWRhdGUgKCpzdHIsIC0xLCBOVUxMKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZWJtbC0+ZWwsCisgICAgICAgICJJbnZhbGlkIFVURi04IHN0cmluZyBhdCBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwgb2xkb2ZmKTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBuZXh0IGVsZW1lbnQgYXMgYSBkYXRlLgorICogUmV0dXJucyB0aGUgc2Vjb25kcyBzaW5jZSB0aGUgdW5peCBlcG9jaC4KKyAqLworCitHc3RGbG93UmV0dXJuCitnc3RfZWJtbF9yZWFkX2RhdGUgKEdzdEVibWxSZWFkICogZWJtbCwgZ3VpbnQzMiAqIGlkLCBnaW50NjQgKiBkYXRlKQoreworICBnaW50NjQgZWJtbF9kYXRlOworICBHc3RGbG93UmV0dXJuIHJldDsKKworICByZXQgPSBnc3RfZWJtbF9yZWFkX3NpbnQgKGVibWwsIGlkLCAmZWJtbF9kYXRlKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICByZXR1cm4gcmV0OworCisgICpkYXRlID0gKGVibWxfZGF0ZSAvIEdTVF9TRUNPTkQpICsgR1NUX0VCTUxfREFURV9PRkZTRVQ7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlYWQgdGhlIG5leHQgZWxlbWVudCBhcyBiaW5hcnkgZGF0YS4KKyAqLworCitHc3RGbG93UmV0dXJuCitnc3RfZWJtbF9yZWFkX2JpbmFyeSAoR3N0RWJtbFJlYWQgKiBlYm1sLAorICAgIGd1aW50MzIgKiBpZCwgZ3VpbnQ4ICoqIGJpbmFyeSwgZ3VpbnQ2NCAqIGxlbmd0aCkKK3sKKyAgY29uc3QgZ3VpbnQ4ICpkYXRhOworICBndWludCBzaXplOworICBHc3RGbG93UmV0dXJuIHJldDsKKworICByZXQgPSBnc3RfZWJtbF9yZWFkX2J5dGVzIChlYm1sLCBpZCwgJmRhdGEsICZzaXplKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICByZXR1cm4gcmV0OworCisgICpsZW5ndGggPSBzaXplOworICAqYmluYXJ5ID0gZ19tZW1kdXAgKGRhdGEsIHNpemUpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KZGlmZiAtLWdpdCBhL2dzdC9tYXRyb3NrYS9lYm1sLXJlYWQuaCBiL2dzdC9tYXRyb3NrYS9lYm1sLXJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTg5NGRhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21hdHJvc2thL2VibWwtcmVhZC5oCkBAIC0wLDAgKzEsMTcxIEBACisvKiBHU3RyZWFtZXIgRUJNTCBJL08KKyAqIChjKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqCisgKiBlYm1sLXJlYWQuYzogcmVhZCBFQk1MIGRhdGEgZnJvbSBmaWxlL3N0cmVhbQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfRUJNTF9SRUFEX0hfXworI2RlZmluZSBfX0dTVF9FQk1MX1JFQURfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXJlYWRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfRUJNTF9SRUFEIFwKKyAgKGdzdF9lYm1sX3JlYWRfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9FQk1MX1JFQUQob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0VCTUxfUkVBRCwgR3N0RWJtbFJlYWQpKQorI2RlZmluZSBHU1RfRUJNTF9SRUFEX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfRUJNTF9SRUFELCBHc3RFYm1sUmVhZENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0VCTUxfUkVBRChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfRUJNTF9SRUFEKSkKKyNkZWZpbmUgR1NUX0lTX0VCTUxfUkVBRF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX0VCTUxfUkVBRCkpCisjZGVmaW5lIEdTVF9FQk1MX1JFQURfR0VUX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIEdTVF9UWVBFX0VCTUxfUkVBRCwgR3N0RWJtbFJlYWRDbGFzcykpCisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKGVibWxyZWFkX2RlYnVnKTsKKworLyogY3VzdG9tIGZsb3cgcmV0dXJuIGNvZGUgKi8KKyNkZWZpbmUgIEdTVF9GTE9XX1BBUlNFICBHU1RfRkxPV19DVVNUT01fRVJST1IKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEVibWxNYXN0ZXIgeworICBndWludDY0ICAgICAgIG9mZnNldDsKKyAgR3N0Qnl0ZVJlYWRlciBicjsKK30gR3N0RWJtbE1hc3RlcjsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEVibWxSZWFkIHsKKyAgR3N0RWxlbWVudCAqZWw7CisKKyAgR3N0QnVmZmVyICpidWY7CisgIGd1aW50NjQgb2Zmc2V0OworICBHc3RNYXBJbmZvIG1hcDsKKworICBHQXJyYXkgKnJlYWRlcnM7Cit9IEdzdEVibWxSZWFkOworCit0eXBlZGVmIEdzdEZsb3dSZXR1cm4gKCpHc3RQZWVrRGF0YSkgKGdwb2ludGVyICogY29udGV4dCwgZ3VpbnQgcGVlaywgY29uc3QgZ3VpbnQ4ICoqIGRhdGEpOworCisvKiByZXR1cm5zIFVORVhQRUNURUQgaWYgbm90IGVub3VnaCBkYXRhICovCitHc3RGbG93UmV0dXJuIGdzdF9lYm1sX3BlZWtfaWRfbGVuZ3RoICAgIChndWludDMyICogX2lkLCBndWludDY0ICogX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50ICogX25lZWRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFBlZWtEYXRhIHBlZWssIGdwb2ludGVyICogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0RWxlbWVudCAqIGVsLCBndWludDY0IG9mZnNldCk7CisKK3ZvaWQgICAgICAgICAgZ3N0X2VibWxfcmVhZF9pbml0ICAgICAgICAgKEdzdEVibWxSZWFkICogZWJtbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdEVsZW1lbnQgKiBlbCwgR3N0QnVmZmVyICogYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCBvZmZzZXQpOworCit2b2lkICAgICAgICAgIGdzdF9lYm1sX3JlYWRfY2xlYXIgICAgICAgIChHc3RFYm1sUmVhZCAqIGVibWwpOworCitHc3RGbG93UmV0dXJuIGdzdF9lYm1sX3BlZWtfaWQgICAgICAgICAgIChHc3RFYm1sUmVhZCAqIGVibWwsIGd1aW50MzIgKiBpZCk7CisKKy8qIHJldHVybiBfUEFSU0UgaWYgbm90IGVub3VnaCBkYXRhIHRvIHJlYWQgd2hhdCBpcyBuZWVkZWQsIF9FUlJPUiBvciBfT0sgKi8KK0dzdEZsb3dSZXR1cm4gZ3N0X2VibWxfcmVhZF9za2lwICAgICAgICAgKEdzdEVibWxSZWFkICplYm1sKTsKKworR3N0Rmxvd1JldHVybiBnc3RfZWJtbF9yZWFkX2J1ZmZlciAgICAgICAoR3N0RWJtbFJlYWQgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICAgICAqaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RCdWZmZXIgICoqYnVmKTsKKworR3N0Rmxvd1JldHVybiBnc3RfZWJtbF9yZWFkX3VpbnQgICAgICAgICAoR3N0RWJtbFJlYWQgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICAgICAqaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDY0ICAgICAqbnVtKTsKKworR3N0Rmxvd1JldHVybiBnc3RfZWJtbF9yZWFkX3NpbnQgICAgICAgICAoR3N0RWJtbFJlYWQgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICAgICAqaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50NjQgICAgICAqbnVtKTsKKworR3N0Rmxvd1JldHVybiBnc3RfZWJtbF9yZWFkX2Zsb2F0ICAgICAgICAoR3N0RWJtbFJlYWQgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICAgICAqaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlICAgICAqbnVtKTsKKworR3N0Rmxvd1JldHVybiBnc3RfZWJtbF9yZWFkX2FzY2lpICAgICAgICAoR3N0RWJtbFJlYWQgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICAgICAqaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAgICAgICoqc3RyKTsKKworR3N0Rmxvd1JldHVybiBnc3RfZWJtbF9yZWFkX3V0ZjggICAgICAgICAoR3N0RWJtbFJlYWQgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICAgICAqaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAgICAgICoqc3RyKTsKKworR3N0Rmxvd1JldHVybiBnc3RfZWJtbF9yZWFkX2RhdGUgICAgICAgICAoR3N0RWJtbFJlYWQgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICAgICAqaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50NjQgICAgICAqZGF0ZSk7CisKK0dzdEZsb3dSZXR1cm4gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgICAgICAgKEdzdEVibWxSZWFkICplYm1sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAgICAgKmlkKTsKKworR3N0Rmxvd1JldHVybiBnc3RfZWJtbF9yZWFkX3BvcF9tYXN0ZXIgICAoR3N0RWJtbFJlYWQgKmVibWwpOworCitHc3RGbG93UmV0dXJuIGdzdF9lYm1sX3JlYWRfYmluYXJ5ICAgICAgIChHc3RFYm1sUmVhZCAqZWJtbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgICAgICppZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50OCAgICAgKipiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDY0ICAgICAqbGVuZ3RoKTsKKworR3N0Rmxvd1JldHVybiBnc3RfZWJtbF9yZWFkX2hlYWRlciAgICAgICAoR3N0RWJtbFJlYWQgKnJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAgICAgICoqZG9jdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50ICAgICAgICp2ZXJzaW9uKTsKKworLyogUmV0dXJucyBjdXJyZW50IChhYnNvbHV0ZSkgcG9zaXRpb24gb2YgRWJtbCBwYXJzZXIsCisgKiBpLmUuIHRha2luZyBpbnRvIGFjY291bnQgb2Zmc2V0IHByb3ZpZGVkIGF0IGluaXQgKi8KK3N0YXRpYyBpbmxpbmUgZ3VpbnQ2NAorZ3N0X2VibWxfcmVhZF9nZXRfcG9zIChHc3RFYm1sUmVhZCAqIGVibWwpCit7CisgIEdzdEVibWxNYXN0ZXIgKm07CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGVibWwtPnJlYWRlcnMsIDApOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZWJtbC0+cmVhZGVycy0+bGVuLCAwKTsKKworICBtID0gJihnX2FycmF5X2luZGV4IChlYm1sLT5yZWFkZXJzLCBHc3RFYm1sTWFzdGVyLCBlYm1sLT5yZWFkZXJzLT5sZW4gLSAxKSk7CisgIHJldHVybiBtLT5vZmZzZXQgKyBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3BvcyAoJm0tPmJyKTsKK30KKworLyogUmV0dXJucyBzdGFydGluZyBvZmZzZXQgb2YgRWJtbCBwYXJzZXIgKi8KK3N0YXRpYyBpbmxpbmUgZ3VpbnQ2NAorZ3N0X2VibWxfcmVhZF9nZXRfb2Zmc2V0IChHc3RFYm1sUmVhZCAqIGVibWwpCit7CisgIHJldHVybiBlYm1sLT5vZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgR3N0Qnl0ZVJlYWRlciAqCitnc3RfZWJtbF9yZWFkX2JyIChHc3RFYm1sUmVhZCAqIGVibWwpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChlYm1sLT5yZWFkZXJzLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGVibWwtPnJlYWRlcnMtPmxlbiwgTlVMTCk7CisKKyAgcmV0dXJuICYoZ19hcnJheV9pbmRleCAoZWJtbC0+cmVhZGVycywKKyAgICAgICAgICBHc3RFYm1sTWFzdGVyLCBlYm1sLT5yZWFkZXJzLT5sZW4gLSAxKS5icik7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ2Jvb2xlYW4KK2dzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoR3N0RWJtbFJlYWQgKiBlYm1sLCBndWludDY0IGJ5dGVzX25lZWRlZCwKKyAgICBnYm9vbGVhbiBhdXRvX3BvcCkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHJlcyA9IChnc3RfYnl0ZV9yZWFkZXJfZ2V0X3JlbWFpbmluZyAoZ3N0X2VibWxfcmVhZF9iciAoZWJtbCkpID49IGJ5dGVzX25lZWRlZCk7CisgIGlmIChHX0xJS0VMWSAoIXJlcyAmJiBhdXRvX3BvcCkpIHsKKyAgICBnc3RfZWJtbF9yZWFkX3BvcF9tYXN0ZXIgKGVibWwpOworICB9CisKKyAgcmV0dXJuIEdfTElLRUxZIChyZXMpOworfQorCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfRUJNTF9SRUFEX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYyBiL2dzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlOTNiYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmMKQEAgLTAsMCArMSw5NDEgQEAKKy8qIEdTdHJlYW1lciBFQk1MIEkvTworICogKGMpIDIwMDMgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogKGMpIDIwMDUgTWljaGFsIEJlbmVzIDxtaWNoYWwuYmVuZXNAeGVyaXMuY3o+CisgKgorICogZWJtbC13cml0ZS5jOiB3cml0ZSBFQk1MIGRhdGEgdG8gZmlsZS9zdHJlYW0KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImVibWwtd3JpdGUuaCIKKyNpbmNsdWRlICJlYm1sLWlkcy5oIgorCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9lYm1sX3dyaXRlX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9lYm1sX3dyaXRlX2RlYnVnCisKKyNkZWZpbmUgX2RvX2luaXQgXAorICAgICAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9lYm1sX3dyaXRlX2RlYnVnLCAiZWJtbHdyaXRlIiwgMCwgIldyaXRlIEVCTUwgc3RydWN0dXJlZCBkYXRhIikKKyNkZWZpbmUgcGFyZW50X2NsYXNzIGdzdF9lYm1sX3dyaXRlX3BhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdEVibWxXcml0ZSwgZ3N0X2VibWxfd3JpdGUsIEdTVF9UWVBFX09CSkVDVCwKKyAgICBfZG9faW5pdCk7CisKK3N0YXRpYyB2b2lkIGdzdF9lYm1sX3dyaXRlX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIHZvaWQKK2dzdF9lYm1sX3dyaXRlX2NsYXNzX2luaXQgKEdzdEVibWxXcml0ZUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0ID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBvYmplY3QtPmZpbmFsaXplID0gZ3N0X2VibWxfd3JpdGVfZmluYWxpemU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZWJtbF93cml0ZV9pbml0IChHc3RFYm1sV3JpdGUgKiBlYm1sKQoreworICBlYm1sLT5zcmNwYWQgPSBOVUxMOworICBlYm1sLT5wb3MgPSAwOworICBlYm1sLT5sYXN0X3BvcyA9IEdfTUFYVUlOVDY0OyAvKiBmb3JjZSBzZWdtZW50IGV2ZW50ICovCisKKyAgZWJtbC0+Y2FjaGUgPSBOVUxMOworICBlYm1sLT5zdHJlYW1oZWFkZXIgPSBOVUxMOworICBlYm1sLT5zdHJlYW1oZWFkZXJfcG9zID0gMDsKKyAgZWJtbC0+d3JpdGluZ19zdHJlYW1oZWFkZXIgPSBGQUxTRTsKKyAgZWJtbC0+Y2FwcyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZWJtbF93cml0ZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0RWJtbFdyaXRlICplYm1sID0gR1NUX0VCTUxfV1JJVEUgKG9iamVjdCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoZWJtbC0+c3JjcGFkKTsKKworICBpZiAoZWJtbC0+Y2FjaGUpIHsKKyAgICBnc3RfYnl0ZV93cml0ZXJfZnJlZSAoZWJtbC0+Y2FjaGUpOworICAgIGVibWwtPmNhY2hlID0gTlVMTDsKKyAgfQorCisgIGlmIChlYm1sLT5zdHJlYW1oZWFkZXIpIHsKKyAgICBnc3RfYnl0ZV93cml0ZXJfZnJlZSAoZWJtbC0+c3RyZWFtaGVhZGVyKTsKKyAgICBlYm1sLT5zdHJlYW1oZWFkZXIgPSBOVUxMOworICB9CisKKyAgaWYgKGVibWwtPmNhcHMpIHsKKyAgICBnc3RfY2Fwc191bnJlZiAoZWJtbC0+Y2Fwcyk7CisgICAgZWJtbC0+Y2FwcyA9IE5VTEw7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKKworLyoqCisgKiBnc3RfZWJtbF93cml0ZV9uZXc6CisgKiBAc3JjcGFkOiBTb3VyY2UgcGFkIHRvIHdoaWNoIHRoZSBvdXRwdXQgd2lsbCBiZSBwdXNoZWQuCisgKgorICogQ3JlYXRlcyBhIG5ldyAjR3N0RWJtbFdyaXRlLgorICoKKyAqIFJldHVybnM6IGEgbmV3ICNHc3RFYm1sV3JpdGUKKyAqLworR3N0RWJtbFdyaXRlICoKK2dzdF9lYm1sX3dyaXRlX25ldyAoR3N0UGFkICogc3JjcGFkKQoreworICBHc3RFYm1sV3JpdGUgKmVibWwgPQorICAgICAgR1NUX0VCTUxfV1JJVEUgKGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfRUJNTF9XUklURSwgTlVMTCkpOworCisgIGVibWwtPnNyY3BhZCA9IGdzdF9vYmplY3RfcmVmIChzcmNwYWQpOworICBlYm1sLT50aW1lc3RhbXAgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIGdzdF9lYm1sX3dyaXRlX3Jlc2V0IChlYm1sKTsKKworICByZXR1cm4gZWJtbDsKK30KKworCisvKioKKyAqIGdzdF9lYm1sX3dyaXRlX3Jlc2V0OgorICogQGVibWw6IGEgI0dzdEVibWxXcml0ZS4KKyAqCisgKiBSZXNldCBpbnRlcm5hbCBzdGF0ZSBvZiAjR3N0RWJtbFdyaXRlLgorICovCit2b2lkCitnc3RfZWJtbF93cml0ZV9yZXNldCAoR3N0RWJtbFdyaXRlICogZWJtbCkKK3sKKyAgZWJtbC0+cG9zID0gMDsKKyAgZWJtbC0+bGFzdF9wb3MgPSBHX01BWFVJTlQ2NDsgLyogZm9yY2Ugc2VnbWVudCBldmVudCAqLworCisgIGlmIChlYm1sLT5jYWNoZSkgeworICAgIGdzdF9ieXRlX3dyaXRlcl9mcmVlIChlYm1sLT5jYWNoZSk7CisgICAgZWJtbC0+Y2FjaGUgPSBOVUxMOworICB9CisKKyAgaWYgKGVibWwtPmNhcHMpIHsKKyAgICBnc3RfY2Fwc191bnJlZiAoZWJtbC0+Y2Fwcyk7CisgICAgZWJtbC0+Y2FwcyA9IE5VTEw7CisgIH0KKworICBlYm1sLT5sYXN0X3dyaXRlX3Jlc3VsdCA9IEdTVF9GTE9XX09LOworICBlYm1sLT50aW1lc3RhbXAgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworfQorCisKKy8qKgorICogZ3N0X2VibWxfbGFzdF93cml0ZV9yZXN1bHQ6CisgKiBAZWJtbDogYSAjR3N0RWJtbFdyaXRlLgorICoKKyAqIFJldHVybnM6IEdTVF9GTE9XX09LIGlmIHRoZXJlIHdhcyBub3Qgd3JpdGUgZXJyb3Igc2luY2UgdGhlIGxhc3QgY2FsbCBvZgorICogICAgICAgICAgZ3N0X2VibWxfbGFzdF93cml0ZV9yZXN1bHQgb3IgY29kZSBvZiB0aGUgZXJyb3IuCisgKi8KK0dzdEZsb3dSZXR1cm4KK2dzdF9lYm1sX2xhc3Rfd3JpdGVfcmVzdWx0IChHc3RFYm1sV3JpdGUgKiBlYm1sKQoreworICBHc3RGbG93UmV0dXJuIHJlcyA9IGVibWwtPmxhc3Rfd3JpdGVfcmVzdWx0OworCisgIGVibWwtPmxhc3Rfd3JpdGVfcmVzdWx0ID0gR1NUX0ZMT1dfT0s7CisKKyAgcmV0dXJuIHJlczsKK30KKworCit2b2lkCitnc3RfZWJtbF9zdGFydF9zdHJlYW1oZWFkZXIgKEdzdEVibWxXcml0ZSAqIGVibWwpCit7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKGVibWwtPnN0cmVhbWhlYWRlciA9PSBOVUxMKTsKKworICBHU1RfREVCVUcgKCJTdGFydGluZyBzdHJlYW1oZWFkZXIgYXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwgZWJtbC0+cG9zKTsKKyAgZWJtbC0+c3RyZWFtaGVhZGVyID0gZ3N0X2J5dGVfd3JpdGVyX25ld193aXRoX3NpemUgKDEwMDAsIEZBTFNFKTsKKyAgZWJtbC0+c3RyZWFtaGVhZGVyX3BvcyA9IGVibWwtPnBvczsKKyAgZWJtbC0+d3JpdGluZ19zdHJlYW1oZWFkZXIgPSBUUlVFOworfQorCitHc3RCdWZmZXIgKgorZ3N0X2VibWxfc3RvcF9zdHJlYW1oZWFkZXIgKEdzdEVibWxXcml0ZSAqIGVibWwpCit7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworCisgIGlmICghZWJtbC0+c3RyZWFtaGVhZGVyKQorICAgIHJldHVybiBOVUxMOworCisgIGJ1ZmZlciA9IGdzdF9ieXRlX3dyaXRlcl9mcmVlX2FuZF9nZXRfYnVmZmVyIChlYm1sLT5zdHJlYW1oZWFkZXIpOworICBlYm1sLT5zdHJlYW1oZWFkZXIgPSBOVUxMOworICBHU1RfREVCVUcgKCJTdHJlYW1oZWFkZXIgd2FzIHNpemUgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpKTsKKworICBlYm1sLT53cml0aW5nX3N0cmVhbWhlYWRlciA9IEZBTFNFOworICByZXR1cm4gYnVmZmVyOworfQorCisvKioKKyAqIGdzdF9lYm1sX3dyaXRlX3NldF9jYWNoZToKKyAqIEBlYm1sOiBhICNHc3RFYm1sV3JpdGUuCisgKiBAc2l6ZTogc2l6ZSBvZiB0aGUgY2FjaGUuCisgKiBDcmVhdGUgYSBjYWNoZS4KKyAqCisgKiBUaGUgaWRlYSBpcyB0aGF0IHlvdSB1c2UgdGhpcyBmb3Igd3JpdGluZyBhIGxvdAorICogb2Ygc21hbGwgZWxlbWVudHMuIFRoaXMgd2lsbCBqdXN0ICJxdWV1ZSIgYWxsIG9mCisgKiB0aGVtIGFuZCB0aGV5J2xsIGJlIHB1c2hlZCB0byB0aGUgbmV4dCBlbGVtZW50IGFsbAorICogYXQgb25jZS4gVGhpcyBzYXZlcyBtZW1vcnkgYW5kIHRpbWUgZm9yIGJ1ZmZlcgorICogYWxsb2NhdGlvbiBhbmQgaW5pdCwgYW5kIGl0IGxvb2tzIGJldHRlci4KKyAqLwordm9pZAorZ3N0X2VibWxfd3JpdGVfc2V0X2NhY2hlIChHc3RFYm1sV3JpdGUgKiBlYm1sLCBndWludCBzaXplKQoreworICBnX3JldHVybl9pZl9mYWlsIChlYm1sLT5jYWNoZSA9PSBOVUxMKTsKKworICBHU1RfREVCVUcgKCJTdGFydGluZyBjYWNoZSBhdCAlIiBHX0dVSU5UNjRfRk9STUFULCBlYm1sLT5wb3MpOworICBlYm1sLT5jYWNoZSA9IGdzdF9ieXRlX3dyaXRlcl9uZXdfd2l0aF9zaXplIChzaXplLCBGQUxTRSk7CisgIGVibWwtPmNhY2hlX3BvcyA9IGVibWwtPnBvczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZWJtbF93cml0ZXJfc2VuZF9zZWdtZW50X2V2ZW50IChHc3RFYm1sV3JpdGUgKiBlYm1sLCBndWludDY0IG5ld19wb3MpCit7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIEdTVF9JTkZPICgic2Vla2luZyB0byAlIiBHX0dVSU5UNjRfRk9STUFULCBuZXdfcG9zKTsKKworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwKKyAgICAgIGVibWwtPnN0cmVhbWFibGUgPyBHU1RfRk9STUFUX1RJTUUgOiBHU1RfRk9STUFUX0JZVEVTKTsKKyAgc2VnbWVudC5zdGFydCA9IG5ld19wb3M7CisgIHNlZ21lbnQuc3RvcCA9IC0xOworICBzZWdtZW50LnBvc2l0aW9uID0gMDsKKworICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKGVibWwtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgIGlmICghcmVzKQorICAgIEdTVF9XQVJOSU5HICgic2VlayB0byAlIiBHX0dVSU5UNjRfRk9STUFUICJmYWlsZWQiLCBuZXdfcG9zKTsKKworICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIGdzdF9lYm1sX3dyaXRlX2ZsdXNoX2NhY2hlOgorICogQGVibWw6ICAgICAgYSAjR3N0RWJtbFdyaXRlLgorICogQHRpbWVzdGFtcDogdGltZXN0YW1wIG9mIHRoZSBidWZmZXIuCisgKgorICogRmx1c2ggdGhlIGNhY2hlLgorICovCit2b2lkCitnc3RfZWJtbF93cml0ZV9mbHVzaF9jYWNoZSAoR3N0RWJtbFdyaXRlICogZWJtbCwgZ2Jvb2xlYW4gaXNfa2V5ZnJhbWUsCisgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCkKK3sKKyAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgaWYgKCFlYm1sLT5jYWNoZSkKKyAgICByZXR1cm47CisKKyAgYnVmZmVyID0gZ3N0X2J5dGVfd3JpdGVyX2ZyZWVfYW5kX2dldF9idWZmZXIgKGVibWwtPmNhY2hlKTsKKyAgZWJtbC0+Y2FjaGUgPSBOVUxMOworICBHU1RfREVCVUcgKCJGbHVzaGluZyBjYWNoZSBvZiBzaXplICUiIEdfR1NJWkVfRk9STUFULAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpID0gdGltZXN0YW1wOworICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKSA9IGVibWwtPnBvcyAtIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcik7CisgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmZmVyKSA9IGVibWwtPnBvczsKKyAgaWYgKGVibWwtPmxhc3Rfd3JpdGVfcmVzdWx0ID09IEdTVF9GTE9XX09LKSB7CisgICAgaWYgKEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpICE9IGVibWwtPmxhc3RfcG9zKSB7CisgICAgICBnc3RfZWJtbF93cml0ZXJfc2VuZF9zZWdtZW50X2V2ZW50IChlYm1sLCBHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKSk7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWZmZXIsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChidWZmZXIsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICB9CisgICAgaWYgKGVibWwtPndyaXRpbmdfc3RyZWFtaGVhZGVyKSB7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWZmZXIsIEdTVF9CVUZGRVJfRkxBR19IRUFERVIpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfVU5TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0hFQURFUik7CisgICAgfQorICAgIGlmICghaXNfa2V5ZnJhbWUpIHsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworICAgIH0KKyAgICBlYm1sLT5sYXN0X3BvcyA9IGVibWwtPnBvczsKKyAgICBlYm1sLT5sYXN0X3dyaXRlX3Jlc3VsdCA9IGdzdF9wYWRfcHVzaCAoZWJtbC0+c3JjcGFkLCBidWZmZXIpOworICB9IGVsc2UgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgIH0KK30KKworCisvKioKKyAqIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfbmV3OgorICogQGVibWw6IGEgI0dzdEVibWxXcml0ZS4KKyAqIEBzaXplOiBzaXplIG9mIHRoZSByZXF1ZXN0ZWQgYnVmZmVyLgorICoKKyAqIENyZWF0ZSBhIGJ1ZmZlciBmb3Igb25lIGVsZW1lbnQuIElmIHRoZXJlIGlzCisgKiBhIGNhY2hlLCB1c2UgdGhhdCBpbnN0ZWFkLgorICoKKyAqIFJldHVybnM6IEEgbmV3ICNHc3RCdWZmZXIuCisgKi8KK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9uZXcgKEdzdEVibWxXcml0ZSAqIGVibWwsIEdzdE1hcEluZm8gKiBtYXAsIGd1aW50IHNpemUpCit7CisgIC8qIENyZWF0ZSBuZXcgYnVmZmVyIG9mIHNpemUgKyBJRCArIGxlbmd0aCAqLworICBHc3RCdWZmZXIgKmJ1ZjsKKworICAvKiBsZW5ndGgsIElEICovCisgIHNpemUgKz0gMTI7CisKKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzaXplKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikgPSBlYm1sLT50aW1lc3RhbXA7CisKKyAgLyogRklYTUUgdW5tYXAgbm90IHBvc3NpYmxlICovCisgIGdzdF9idWZmZXJfbWFwIChidWYsIG1hcCwgR1NUX01BUF9XUklURSk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworCisvKioKKyAqIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfaWQ6CisgKiBAZGF0YV9pbm91dDogUG9pbnRlciB0byBkYXRhIHBvaW50ZXIKKyAqIEBpZDogRWxlbWVudCBJRCB0aGF0IHNob3VsZCBiZSB3cml0dGVuLgorICogCisgKiBXcml0ZSBlbGVtZW50IElEIGludG8gYSBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfZWJtbF93cml0ZV9lbGVtZW50X2lkIChndWludDggKiogZGF0YV9pbm91dCwgZ3VpbnQzMiBpZCkKK3sKKyAgZ3VpbnQ4ICpkYXRhID0gKmRhdGFfaW5vdXQ7CisgIGd1aW50IGJ5dGVzID0gNCwgbWFzayA9IDB4MTA7CisKKyAgLyogZ2V0IElEIGxlbmd0aCAqLworICB3aGlsZSAoIShpZCAmIChtYXNrIDw8ICgoYnl0ZXMgLSAxKSAqIDgpKSkgJiYgYnl0ZXMgPiAwKSB7CisgICAgbWFzayA8PD0gMTsKKyAgICBieXRlcy0tOworICB9CisKKyAgLyogaWYgaW52YWxpZCBJRCwgdXNlIGR1bW15ICovCisgIGlmIChieXRlcyA9PSAwKSB7CisgICAgR1NUX1dBUk5JTkcgKCJJbnZhbGlkIElELCB2b2lkaW5nIik7CisgICAgYnl0ZXMgPSAxOworICAgIGlkID0gR1NUX0VCTUxfSURfVk9JRDsKKyAgfQorCisgIC8qIHdyaXRlIG91dCwgQkUgKi8KKyAgKmRhdGFfaW5vdXQgKz0gYnl0ZXM7CisgIHdoaWxlIChieXRlcy0tKSB7CisgICAgZGF0YVtieXRlc10gPSBpZCAmIDB4ZmY7CisgICAgaWQgPj49IDg7CisgIH0KK30KKworCisvKioKKyAqIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfc2l6ZToKKyAqIEBkYXRhX2lub3V0OiBQb2ludGVyIHRvIGRhdGEgcG9pbnRlcgorICogQHNpemU6IEVsZW1lbnQgbGVuZ3RoLgorICoKKyAqIFdyaXRlIGVsZW1lbnQgbGVuZ3RoIGludG8gYSBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfZWJtbF93cml0ZV9lbGVtZW50X3NpemUgKGd1aW50OCAqKiBkYXRhX2lub3V0LCBndWludDY0IHNpemUpCit7CisgIGd1aW50OCAqZGF0YSA9ICpkYXRhX2lub3V0OworICBndWludCBieXRlcyA9IDEsIG1hc2sgPSAweDgwOworCisgIGlmIChzaXplICE9IEdTVF9FQk1MX1NJWkVfVU5LTk9XTikgeworICAgIC8qIGhvdyBtYW55IGJ5dGVzPyAtIHVzZSBtYXNrLTEgYmVjYXVzZSBhbiBhbGwtMSBiaXRzZXQgaXMgbm90IGFsbG93ZWQgKi8KKyAgICB3aGlsZSAoYnl0ZXMgPD0gOCAmJiAoc2l6ZSA+PiAoKGJ5dGVzIC0gMSkgKiA4KSkgPj0gKG1hc2sgLSAxKSkgeworICAgICAgbWFzayA+Pj0gMTsKKyAgICAgIGJ5dGVzKys7CisgICAgfQorCisgICAgLyogaWYgaW52YWxpZCBzaXplLCB1c2UgbWF4LiAqLworICAgIGlmIChieXRlcyA+IDgpIHsKKyAgICAgIEdTVF9XQVJOSU5HICgiSW52YWxpZCBzaXplLCB3cml0aW5nIHNpemUgdW5rbm93biIpOworICAgICAgbWFzayA9IDB4MDE7CisgICAgICBieXRlcyA9IDg7CisgICAgICAvKiBOb3cgaGVyZSdzIGEgcmVhbCBGSVhNRTogd2UgY2Fubm90IHJlYWQgdGhvc2UgeWV0ISAqLworICAgICAgc2l6ZSA9IEdTVF9FQk1MX1NJWkVfVU5LTk9XTjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbWFzayA9IDB4MDE7CisgICAgYnl0ZXMgPSA4OworICB9CisKKyAgLyogd3JpdGUgb3V0LCBCRSwgd2l0aCBsZW5ndGggc2l6ZSBtYXJrZXIgKi8KKyAgKmRhdGFfaW5vdXQgKz0gYnl0ZXM7CisgIHdoaWxlIChieXRlcy0tID4gMCkgeworICAgIGRhdGFbYnl0ZXNdID0gc2l6ZSAmIDB4ZmY7CisgICAgc2l6ZSA+Pj0gODsKKyAgICBpZiAoIWJ5dGVzKQorICAgICAgKmRhdGEgfD0gbWFzazsKKyAgfQorfQorCisKKy8qKgorICogZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9kYXRhOgorICogQGRhdGFfaW5vdXQ6IFBvaW50ZXIgdG8gZGF0YSBwb2ludGVyCisgKiBAd3JpdGU6IERhdGEgdGhhdCBzaG91bGQgYmUgd3JpdHRlbi4KKyAqIEBsZW5ndGg6IExlbmd0aCBvZiB0aGUgZGF0YS4KKyAqCisgKiBXcml0ZSBlbGVtZW50IGRhdGEgaW50byBhIGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQKK2dzdF9lYm1sX3dyaXRlX2VsZW1lbnRfZGF0YSAoZ3VpbnQ4ICoqIGRhdGFfaW5vdXQsIGd1aW50OCAqIHdyaXRlLAorICAgIGd1aW50NjQgbGVuZ3RoKQoreworICBtZW1jcHkgKCpkYXRhX2lub3V0LCB3cml0ZSwgbGVuZ3RoKTsKKyAgKmRhdGFfaW5vdXQgKz0gbGVuZ3RoOworfQorCisKKy8qKgorICogZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9wdXNoOgorICogQGVibWw6ICNHc3RFYm1sV3JpdGUKKyAqIEBidWY6ICNHc3RCdWZmZXIgdG8gYmUgd3JpdHRlbi4KKyAqIEBidWZfZGF0YTogU3RhcnQgb2YgZGF0YSB0byBwdXNoIGZyb20gQGJ1ZiAob3IgTlVMTCBmb3Igd2hvbGUgYnVmZmVyKS4KKyAqIEBidWZfZGF0YV9lbmQ6IERhdGEgcG9pbnRlciBwb3NpdGlvbmVkIGFmdGVyIHRoZSBsYXN0IGJ5dGUgaW4gQGJ1Zl9kYXRhIChvcgorICogTlVMTCBmb3Igd2hvbGUgYnVmZmVyKS4KKyAqIAorICogV3JpdGUgb3V0IGJ1ZmZlciBieSBtb3ZpbmcgaXQgdG8gdGhlIG5leHQgZWxlbWVudC4KKyAqLworc3RhdGljIHZvaWQKK2dzdF9lYm1sX3dyaXRlX2VsZW1lbnRfcHVzaCAoR3N0RWJtbFdyaXRlICogZWJtbCwgR3N0QnVmZmVyICogYnVmLAorICAgIGd1aW50OCAqIGJ1Zl9kYXRhLCBndWludDggKiBidWZfZGF0YV9lbmQpCit7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludCBkYXRhX3NpemU7CisKKyAgbWFwLmRhdGEgPSBOVUxMOworCisgIGlmIChidWZfZGF0YV9lbmQpCisgICAgZGF0YV9zaXplID0gYnVmX2RhdGFfZW5kIC0gYnVmX2RhdGE7CisgIGVsc2UKKyAgICBkYXRhX3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpOworCisgIGVibWwtPnBvcyArPSBkYXRhX3NpemU7CisKKyAgLyogaWYgdGhlcmUncyBubyBjYWNoZSwgdGhlbiBkb24ndCBwdXNoIGl0ISAqLworICBpZiAoZWJtbC0+d3JpdGluZ19zdHJlYW1oZWFkZXIpIHsKKyAgICBpZiAoIWJ1Zl9kYXRhKSB7CisgICAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgYnVmX2RhdGEgPSBtYXAuZGF0YTsKKyAgICB9CisgICAgaWYgKCFidWZfZGF0YSkKKyAgICAgIEdTVF9XQVJOSU5HICgiRmFpbGVkIHRvIG1hcCBidWZmZXIiKTsKKyAgICBlbHNlIGlmICghZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhIChlYm1sLT5zdHJlYW1oZWFkZXIsIGJ1Zl9kYXRhLAorICAgICAgICAgICAgZGF0YV9zaXplKSkKKyAgICAgIEdTVF9XQVJOSU5HICgiRXJyb3Igd3JpdGluZyBkYXRhIHRvIHN0cmVhbWhlYWRlciIpOworICB9CisgIGlmIChlYm1sLT5jYWNoZSkgeworICAgIGlmICghYnVmX2RhdGEpIHsKKyAgICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICBidWZfZGF0YSA9IG1hcC5kYXRhOworICAgIH0KKyAgICBpZiAoIWJ1Zl9kYXRhKQorICAgICAgR1NUX1dBUk5JTkcgKCJGYWlsZWQgdG8gbWFwIGJ1ZmZlciIpOworICAgIGVsc2UgaWYgKCFnc3RfYnl0ZV93cml0ZXJfcHV0X2RhdGEgKGVibWwtPmNhY2hlLCBidWZfZGF0YSwgZGF0YV9zaXplKSkKKyAgICAgIEdTVF9XQVJOSU5HICgiRXJyb3Igd3JpdGluZyBkYXRhIHRvIGNhY2hlIik7CisgICAgaWYgKG1hcC5kYXRhKQorICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChidWZfZGF0YSAmJiBtYXAuZGF0YSkKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIGlmIChlYm1sLT5sYXN0X3dyaXRlX3Jlc3VsdCA9PSBHU1RfRkxPV19PSykgeworICAgIGJ1ZiA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoYnVmKTsKKyAgICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSA9IGVibWwtPnBvcyAtIGRhdGFfc2l6ZTsKKyAgICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKGJ1ZikgPSBlYm1sLT5wb3M7CisgICAgaWYgKGVibWwtPndyaXRpbmdfc3RyZWFtaGVhZGVyKSB7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19IRUFERVIpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfVU5TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0hFQURFUik7CisgICAgfQorICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgICAgaWYgKEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpICE9IGVibWwtPmxhc3RfcG9zKSB7CisgICAgICBnc3RfZWJtbF93cml0ZXJfc2VuZF9zZWdtZW50X2V2ZW50IChlYm1sLCBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSk7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICB9CisgICAgZWJtbC0+bGFzdF9wb3MgPSBlYm1sLT5wb3M7CisgICAgZWJtbC0+bGFzdF93cml0ZV9yZXN1bHQgPSBnc3RfcGFkX3B1c2ggKGVibWwtPnNyY3BhZCwgYnVmKTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICB9Cit9CisKKworLyoqCisgKiBnc3RfZWJtbF93cml0ZV9zZWVrOgorICogQGVibWw6ICNHc3RFYm1sV3JpdGUKKyAqIEBwb3M6IFNlZWsgcG9zaXRpb24uCisgKiAKKyAqIFNlZWsuCisgKi8KK3ZvaWQKK2dzdF9lYm1sX3dyaXRlX3NlZWsgKEdzdEVibWxXcml0ZSAqIGVibWwsIGd1aW50NjQgcG9zKQoreworICBpZiAoZWJtbC0+d3JpdGluZ19zdHJlYW1oZWFkZXIpIHsKKyAgICBHU1RfREVCVUcgKCJ3YW50aW5nIHRvIHNlZWsgdG8gcG9zICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHBvcyk7CisgICAgaWYgKHBvcyA+PSBlYm1sLT5zdHJlYW1oZWFkZXJfcG9zICYmCisgICAgICAgIHBvcyA8PSBlYm1sLT5zdHJlYW1oZWFkZXJfcG9zICsgZWJtbC0+c3RyZWFtaGVhZGVyLT5wYXJlbnQuc2l6ZSkgeworICAgICAgZ3N0X2J5dGVfd3JpdGVyX3NldF9wb3MgKGVibWwtPnN0cmVhbWhlYWRlciwKKyAgICAgICAgICBwb3MgLSBlYm1sLT5zdHJlYW1oZWFkZXJfcG9zKTsKKyAgICAgIEdTVF9ERUJVRyAoInNlZWtlZCBpbiBzdHJlYW1oZWFkZXIgdG8gcG9zaXRpb24gJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICBwb3MgLSBlYm1sLT5zdHJlYW1oZWFkZXJfcG9zKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkcKKyAgICAgICAgICAoIndlIGFyZSB3cml0aW5nIHN0cmVhbWhlYWRlciBzdGlsbCBhbmQgc2VlayBpcyBvdXQgb2YgYm91bmRzIik7CisgICAgfQorICB9CisgIC8qIENhY2hlIHNlZWtpbmcuIEEgYml0IGRhbmdlcm91cywgd2UgYXNzdW1lIHRoZSBjbGllbnQgd3JpdGVyCisgICAqIGtub3dzIHdoYXQgaGUncyBkb2luZy4uLiAqLworICBpZiAoZWJtbC0+Y2FjaGUpIHsKKyAgICAvKiB3aXRoaW4gYm91bmRzPyAqLworICAgIGlmIChwb3MgPj0gZWJtbC0+Y2FjaGVfcG9zICYmCisgICAgICAgIHBvcyA8PSBlYm1sLT5jYWNoZV9wb3MgKyBlYm1sLT5jYWNoZS0+cGFyZW50LnNpemUpIHsKKyAgICAgIEdTVF9ERUJVRyAoInNlZWtpbmcgaW4gY2FjaGUgdG8gJSIgR19HVUlOVDY0X0ZPUk1BVCwgcG9zKTsKKyAgICAgIGVibWwtPnBvcyA9IHBvczsKKyAgICAgIGdzdF9ieXRlX3dyaXRlcl9zZXRfcG9zIChlYm1sLT5jYWNoZSwgZWJtbC0+cG9zIC0gZWJtbC0+Y2FjaGVfcG9zKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0xPRyAoIlNlZWsgb3V0c2lkZSBjYWNoZSByYW5nZS4gQ2xlYXJpbmcuLi4iKTsKKyAgICAgIGdzdF9lYm1sX3dyaXRlX2ZsdXNoX2NhY2hlIChlYm1sLCBGQUxTRSwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgICAgfQorICB9CisKKyAgR1NUX0lORk8gKCJzY2hlZHVsaW5nIHNlZWsgdG8gJSIgR19HVUlOVDY0X0ZPUk1BVCwgcG9zKTsKKyAgZWJtbC0+cG9zID0gcG9zOworfQorCisKKy8qKgorICogZ3N0X2VibWxfd3JpdGVfZ2V0X3VpbnRfc2l6ZToKKyAqIEBudW06IE51bWJlciB0byBiZSBlbmNvZGVkLgorICogCisgKiBHZXQgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byB3cml0ZSBhIHVpbnQuCisgKgorICogUmV0dXJuczogRW5jb2RlZCB1aW50IGxlbmd0aC4KKyAqLworc3RhdGljIGd1aW50Citnc3RfZWJtbF93cml0ZV9nZXRfdWludF9zaXplIChndWludDY0IG51bSkKK3sKKyAgZ3VpbnQgc2l6ZSA9IDE7CisKKyAgLyogZ2V0IHNpemUgKi8KKyAgd2hpbGUgKHNpemUgPCA4ICYmIG51bSA+PSAoR19HSU5UNjRfQ09OU1RBTlQgKDEpIDw8IChzaXplICogOCkpKSB7CisgICAgc2l6ZSsrOworICB9CisKKyAgcmV0dXJuIHNpemU7Cit9CisKKworLyoqCisgKiBnc3RfZWJtbF93cml0ZV9zZXRfdWludDoKKyAqIEBkYXRhX2lub3V0OiBQb2ludGVyIHRvIGRhdGEgcG9pbnRlcgorICogQG51bTogTnVtYmVyIHRvIGJlIHdyaXR0ZW4uCisgKiBAc2l6ZTogRW5jb2RlZCBudW1iZXIgbGVuZ3RoLgorICoKKyAqIFdyaXRlIGFuIHVpbnQgaW50byBhIGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQKK2dzdF9lYm1sX3dyaXRlX3NldF91aW50IChndWludDggKiogZGF0YV9pbm91dCwgZ3VpbnQ2NCBudW0sIGd1aW50IHNpemUpCit7CisgIGd1aW50OCAqZGF0YSA9ICpkYXRhX2lub3V0OworCisgICpkYXRhX2lub3V0ICs9IHNpemU7CisKKyAgd2hpbGUgKHNpemUtLSA+IDApIHsKKyAgICBkYXRhW3NpemVdID0gbnVtICYgMHhmZjsKKyAgICBudW0gPj49IDg7CisgIH0KK30KKworCisvKioKKyAqIGdzdF9lYm1sX3dyaXRlX3VpbnQ6CisgKiBAZWJtbDogI0dzdEVibWxXcml0ZQorICogQGlkOiBFbGVtZW50IElELgorICogQG51bTogTnVtYmVyIHRvIGJlIHdyaXR0ZW4uCisgKgorICogV3JpdGUgdWludCBlbGVtZW50LgorICovCit2b2lkCitnc3RfZWJtbF93cml0ZV91aW50IChHc3RFYm1sV3JpdGUgKiBlYm1sLCBndWludDMyIGlkLCBndWludDY0IG51bSkKK3sKKyAgR3N0QnVmZmVyICpidWY7CisgIGd1aW50OCAqZGF0YV9zdGFydCwgKmRhdGFfZW5kOworICBndWludCBzaXplID0gZ3N0X2VibWxfd3JpdGVfZ2V0X3VpbnRfc2l6ZSAobnVtKTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYnVmID0gZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9uZXcgKGVibWwsICZtYXAsIHNpemVvZiAobnVtKSk7CisgIGRhdGFfZW5kID0gZGF0YV9zdGFydCA9IG1hcC5kYXRhOworCisgIC8qIHdyaXRlICovCisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfaWQgKCZkYXRhX2VuZCwgaWQpOworICBnc3RfZWJtbF93cml0ZV9lbGVtZW50X3NpemUgKCZkYXRhX2VuZCwgc2l6ZSk7CisgIGdzdF9lYm1sX3dyaXRlX3NldF91aW50ICgmZGF0YV9lbmQsIG51bSwgc2l6ZSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfc2V0X3NpemUgKGJ1ZiwgKGRhdGFfZW5kIC0gZGF0YV9zdGFydCkpOworCisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfcHVzaCAoZWJtbCwgYnVmLCBkYXRhX3N0YXJ0LCBkYXRhX2VuZCk7Cit9CisKKworLyoqCisgKiBnc3RfZWJtbF93cml0ZV9zaW50OgorICogQGVibWw6ICNHc3RFYm1sV3JpdGUKKyAqIEBpZDogRWxlbWVudCBJRC4KKyAqIEBudW06IE51bWJlciB0byBiZSB3cml0dGVuLgorICoKKyAqIFdyaXRlIHNpbnQgZWxlbWVudC4KKyAqLwordm9pZAorZ3N0X2VibWxfd3JpdGVfc2ludCAoR3N0RWJtbFdyaXRlICogZWJtbCwgZ3VpbnQzMiBpZCwgZ2ludDY0IG51bSkKK3sKKyAgR3N0QnVmZmVyICpidWY7CisgIGd1aW50OCAqZGF0YV9zdGFydCwgKmRhdGFfZW5kOworICBHc3RNYXBJbmZvIG1hcDsKKworICAvKiBpZiB0aGUgc2lnbmVkIG51bWJlciBpcyBvbiB0aGUgZWRnZSBvZiBhIGV4dHJhLWJ5dGUsCisgICAqIHRoZW4gd2UnbGwgZmFsbCBvdmVyIHdoZW4gZGV0ZWN0aW5nIGl0LiBFeGFtcGxlOiBpZiBJCisgICAqIGhhdmUgYSBudW1iZXIgKC0pMHg4MDAwIChHX01JTlNIT1JUKSwgdGhlbiBteSBhYnMoKTw8MQorICAgKiB3aWxsIGJlIDB4MTAwMDA7IHRoaXMgaXMgR19NQVhVU0hPUlQrMSEgU286IGlmICg8MCkgLTEuICovCisgIGd1aW50NjQgdW51bSA9IChudW0gPCAwID8gKC1udW0gLSAxKSA8PCAxIDogbnVtIDw8IDEpOworICBndWludCBzaXplID0gZ3N0X2VibWxfd3JpdGVfZ2V0X3VpbnRfc2l6ZSAodW51bSk7CisKKyAgYnVmID0gZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9uZXcgKGVibWwsICZtYXAsIHNpemVvZiAobnVtKSk7CisgIGRhdGFfZW5kID0gZGF0YV9zdGFydCA9IG1hcC5kYXRhOworCisgIC8qIG1ha2UgdW5zaWduZWQgKi8KKyAgaWYgKG51bSA+PSAwKSB7CisgICAgdW51bSA9IG51bTsKKyAgfSBlbHNlIHsKKyAgICB1bnVtID0gKChndWludDY0KSAweDgwKSA8PCAoKHNpemUgLSAxKSAqIDgpOworICAgIHVudW0gKz0gbnVtOworICAgIHVudW0gfD0gKChndWludDY0KSAweDgwKSA8PCAoKHNpemUgLSAxKSAqIDgpOworICB9CisKKyAgLyogd3JpdGUgKi8KKyAgZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9pZCAoJmRhdGFfZW5kLCBpZCk7CisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfc2l6ZSAoJmRhdGFfZW5kLCBzaXplKTsKKyAgZ3N0X2VibWxfd3JpdGVfc2V0X3VpbnQgKCZkYXRhX2VuZCwgdW51bSwgc2l6ZSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfc2V0X3NpemUgKGJ1ZiwgKGRhdGFfZW5kIC0gZGF0YV9zdGFydCkpOworCisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfcHVzaCAoZWJtbCwgYnVmLCBkYXRhX3N0YXJ0LCBkYXRhX2VuZCk7Cit9CisKKworLyoqCisgKiBnc3RfZWJtbF93cml0ZV9mbG9hdDoKKyAqIEBlYm1sOiAjR3N0RWJtbFdyaXRlCisgKiBAaWQ6IEVsZW1lbnQgSUQuCisgKiBAbnVtOiBOdW1iZXIgdG8gYmUgd3JpdHRlbi4KKyAqCisgKiBXcml0ZSBmbG9hdCBlbGVtZW50LgorICovCit2b2lkCitnc3RfZWJtbF93cml0ZV9mbG9hdCAoR3N0RWJtbFdyaXRlICogZWJtbCwgZ3VpbnQzMiBpZCwgZ2RvdWJsZSBudW0pCit7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ4ICpkYXRhX3N0YXJ0LCAqZGF0YV9lbmQ7CisKKyAgYnVmID0gZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9uZXcgKGVibWwsICZtYXAsIHNpemVvZiAobnVtKSk7CisgIGRhdGFfZW5kID0gZGF0YV9zdGFydCA9IG1hcC5kYXRhOworCisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfaWQgKCZkYXRhX2VuZCwgaWQpOworICBnc3RfZWJtbF93cml0ZV9lbGVtZW50X3NpemUgKCZkYXRhX2VuZCwgOCk7CisgIG51bSA9IEdET1VCTEVfVE9fQkUgKG51bSk7CisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfZGF0YSAoJmRhdGFfZW5kLCAoZ3VpbnQ4ICopICYgbnVtLCA4KTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl9zZXRfc2l6ZSAoYnVmLCAoZGF0YV9lbmQgLSBkYXRhX3N0YXJ0KSk7CisKKyAgZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9wdXNoIChlYm1sLCBidWYsIGRhdGFfc3RhcnQsIGRhdGFfZW5kKTsKK30KKworCisvKioKKyAqIGdzdF9lYm1sX3dyaXRlX2FzY2lpOgorICogQGVibWw6ICNHc3RFYm1sV3JpdGUKKyAqIEBpZDogRWxlbWVudCBJRC4KKyAqIEBzdHI6IFN0cmluZyB0byBiZSB3cml0dGVuLgorICoKKyAqIFdyaXRlIHN0cmluZyBlbGVtZW50LgorICovCit2b2lkCitnc3RfZWJtbF93cml0ZV9hc2NpaSAoR3N0RWJtbFdyaXRlICogZWJtbCwgZ3VpbnQzMiBpZCwgY29uc3QgZ2NoYXIgKiBzdHIpCit7CisgIGdpbnQgbGVuID0gc3RybGVuIChzdHIpICsgMTsgIC8qIGFkZCB0cmFpbGluZyAnXDAnICovCisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ4ICpkYXRhX3N0YXJ0LCAqZGF0YV9lbmQ7CisKKyAgYnVmID0gZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9uZXcgKGVibWwsICZtYXAsIGxlbik7CisgIGRhdGFfZW5kID0gZGF0YV9zdGFydCA9IG1hcC5kYXRhOworCisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfaWQgKCZkYXRhX2VuZCwgaWQpOworICBnc3RfZWJtbF93cml0ZV9lbGVtZW50X3NpemUgKCZkYXRhX2VuZCwgbGVuKTsKKyAgZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9kYXRhICgmZGF0YV9lbmQsIChndWludDggKikgc3RyLCBsZW4pOworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICBnc3RfYnVmZmVyX3NldF9zaXplIChidWYsIChkYXRhX2VuZCAtIGRhdGFfc3RhcnQpKTsKKworICBnc3RfZWJtbF93cml0ZV9lbGVtZW50X3B1c2ggKGVibWwsIGJ1ZiwgZGF0YV9zdGFydCwgZGF0YV9lbmQpOworfQorCisKKy8qKgorICogZ3N0X2VibWxfd3JpdGVfdXRmODoKKyAqIEBlYm1sOiAjR3N0RWJtbFdyaXRlCisgKiBAaWQ6IEVsZW1lbnQgSUQuCisgKiBAc3RyOiBTdHJpbmcgdG8gYmUgd3JpdHRlbi4KKyAqCisgKiBXcml0ZSB1dGY4IGVuY29kZWQgc3RyaW5nIGVsZW1lbnQuCisgKi8KK3ZvaWQKK2dzdF9lYm1sX3dyaXRlX3V0ZjggKEdzdEVibWxXcml0ZSAqIGVibWwsIGd1aW50MzIgaWQsIGNvbnN0IGdjaGFyICogc3RyKQoreworICBnc3RfZWJtbF93cml0ZV9hc2NpaSAoZWJtbCwgaWQsIHN0cik7Cit9CisKKworLyoqCisgKiBnc3RfZWJtbF93cml0ZV9kYXRlOgorICogQGVibWw6ICNHc3RFYm1sV3JpdGUKKyAqIEBpZDogRWxlbWVudCBJRC4KKyAqIEBkYXRlOiBEYXRlIGluIHNlY29uZHMgc2luY2UgdGhlIHVuaXggZXBvY2guCisgKgorICogV3JpdGUgZGF0ZSBlbGVtZW50LgorICovCit2b2lkCitnc3RfZWJtbF93cml0ZV9kYXRlIChHc3RFYm1sV3JpdGUgKiBlYm1sLCBndWludDMyIGlkLCBnaW50NjQgZGF0ZSkKK3sKKyAgZ3N0X2VibWxfd3JpdGVfc2ludCAoZWJtbCwgaWQsIChkYXRlIC0gR1NUX0VCTUxfREFURV9PRkZTRVQpICogR1NUX1NFQ09ORCk7Cit9CisKKy8qKgorICogZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0OgorICogQGVibWw6ICNHc3RFYm1sV3JpdGUKKyAqIEBpZDogRWxlbWVudCBJRC4KKyAqCisgKiBTdGFydCB3aXJpdGluZyBtYXRlciBlbGVtZW50LgorICoKKyAqIE1hc3RlciB3cml0aW5nIGlzIGFubm95aW5nLiBXZSB1c2UgYSBzaXplIG1hcmtlciBvZgorICogdGhlIG1heC4gYWxsb3dlZCBsZW5ndGgsIHNvIHRoYXQgd2UgY2FuIGxhdGVyIGZpbGwgaXQKKyAqIGluIHZhbGlkbHkuIAorICoKKyAqIFJldHVybnM6IE1hc3RlciBzdGFydGluZyBwb3NpdGlvbi4KKyAqLworZ3VpbnQ2NAorZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0IChHc3RFYm1sV3JpdGUgKiBlYm1sLCBndWludDMyIGlkKQoreworICBndWludDY0IHBvcyA9IGVibWwtPnBvczsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKmRhdGFfc3RhcnQsICpkYXRhX2VuZDsKKworICBidWYgPSBnc3RfZWJtbF93cml0ZV9lbGVtZW50X25ldyAoZWJtbCwgJm1hcCwgMCk7CisgIGRhdGFfZW5kID0gZGF0YV9zdGFydCA9IG1hcC5kYXRhOworCisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfaWQgKCZkYXRhX2VuZCwgaWQpOworICBwb3MgKz0gZGF0YV9lbmQgLSBkYXRhX3N0YXJ0OworICBnc3RfZWJtbF93cml0ZV9lbGVtZW50X3NpemUgKCZkYXRhX2VuZCwgR1NUX0VCTUxfU0laRV9VTktOT1dOKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl9zZXRfc2l6ZSAoYnVmLCAoZGF0YV9lbmQgLSBkYXRhX3N0YXJ0KSk7CisKKyAgZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9wdXNoIChlYm1sLCBidWYsIGRhdGFfc3RhcnQsIGRhdGFfZW5kKTsKKworICByZXR1cm4gcG9zOworfQorCisKKy8qKgorICogZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaF9mdWxsOgorICogQGVibWw6ICNHc3RFYm1sV3JpdGUKKyAqIEBzdGFydHBvczogTWFzdGVyIHN0YXJ0aW5nIHBvc2l0aW9uLgorICoKKyAqIEZpbmlzaCB3cml0aW5nIG1hc3RlciBlbGVtZW50LiAgU2l6ZSBvZiBtYXN0ZXIgZWxlbWVudCBpcyBkaWZmZXJlbmNlIGJldHdlZW4KKyAqIGN1cnJlbnQgcG9zaXRpb24gYW5kIHRoZSBlbGVtZW50IHN0YXJ0LCBhbmQgQGV4dHJhX3NpemUgYWRkZWQgdG8gdGhpcy4KKyAqLwordm9pZAorZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaF9mdWxsIChHc3RFYm1sV3JpdGUgKiBlYm1sLCBndWludDY0IHN0YXJ0cG9zLAorICAgIGd1aW50NjQgZXh0cmFfc2l6ZSkKK3sKKyAgZ3VpbnQ2NCBwb3MgPSBlYm1sLT5wb3M7CisgIGd1aW50OCAqZGF0YSA9IGdfbWFsbG9jICg4KTsKKyAgR3N0QnVmZmVyICpidWYgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChkYXRhLCA4KTsKKworICBnc3RfZWJtbF93cml0ZV9zZWVrIChlYm1sLCBzdGFydHBvcyk7CisKKyAgR1NUX1dSSVRFX1VJTlQ2NF9CRSAoZGF0YSwKKyAgICAgIChHX0dJTlQ2NF9DT05TVEFOVCAoMSkgPDwgNTYpIHwgKHBvcyAtIHN0YXJ0cG9zIC0gOCArIGV4dHJhX3NpemUpKTsKKworICBnc3RfZWJtbF93cml0ZV9lbGVtZW50X3B1c2ggKGVibWwsIGJ1ZiwgTlVMTCwgTlVMTCk7CisgIGdzdF9lYm1sX3dyaXRlX3NlZWsgKGVibWwsIHBvcyk7Cit9CisKK3ZvaWQKK2dzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKEdzdEVibWxXcml0ZSAqIGVibWwsIGd1aW50NjQgc3RhcnRwb3MpCit7CisgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2hfZnVsbCAoZWJtbCwgc3RhcnRwb3MsIDApOworfQorCisvKioKKyAqIGdzdF9lYm1sX3dyaXRlX2JpbmFyeToKKyAqIEBlYm1sOiAjR3N0RWJtbFdyaXRlCisgKiBAaWQ6IEVsZW1lbnQgSUQuCisgKiBAYmluYXJ5OiBEYXRhIHRvIGJlIHdyaXR0ZW4uCisgKiBAbGVuZ3RoOiBMZW5ndGggb2YgdGhlIGRhdGEKKyAqCisgKiBXcml0ZSBhbiBlbGVtZW50IHdpdGggYmluYXJ5IGRhdGEuCisgKi8KK3ZvaWQKK2dzdF9lYm1sX3dyaXRlX2JpbmFyeSAoR3N0RWJtbFdyaXRlICogZWJtbCwKKyAgICBndWludDMyIGlkLCBndWludDggKiBiaW5hcnksIGd1aW50NjQgbGVuZ3RoKQoreworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YV9zdGFydCwgKmRhdGFfZW5kOworCisgIGJ1ZiA9IGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfbmV3IChlYm1sLCAmbWFwLCBsZW5ndGgpOworICBkYXRhX2VuZCA9IGRhdGFfc3RhcnQgPSBtYXAuZGF0YTsKKworICBnc3RfZWJtbF93cml0ZV9lbGVtZW50X2lkICgmZGF0YV9lbmQsIGlkKTsKKyAgZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9zaXplICgmZGF0YV9lbmQsIGxlbmd0aCk7CisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfZGF0YSAoJmRhdGFfZW5kLCBiaW5hcnksIGxlbmd0aCk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfc2V0X3NpemUgKGJ1ZiwgKGRhdGFfZW5kIC0gZGF0YV9zdGFydCkpOworCisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfcHVzaCAoZWJtbCwgYnVmLCBkYXRhX3N0YXJ0LCBkYXRhX2VuZCk7Cit9CisKKworLyoqCisgKiBnc3RfZWJtbF93cml0ZV9idWZmZXJfaGVhZGVyOgorICogQGVibWw6ICNHc3RFYm1sV3JpdGUKKyAqIEBpZDogRWxlbWVudCBJRC4KKyAqIEBsZW5ndGg6IExlbmd0aCBvZiB0aGUgZGF0YQorICogCisgKiBXcml0ZSBoZWFkZXIgb2YgdGhlIGJpbmFyeSBlbGVtZW50ICh1c2Ugd2l0aCBnc3RfZWJtbF93cml0ZV9idWZmZXIgZnVuY3Rpb24pLgorICogCisgKiBGb3IgdGhpbmdzIGxpa2UgdmlkZW8gZnJhbWVzIGFuZCBhdWRpbyBzYW1wbGVzLAorICogeW91IHdhbnQgdG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzIGl0IGRvZXNuJ3QgaGF2ZQorICogdGhlIG92ZXJoZWFkIG9mIG1lbWNweSgpIHRoYXQgb3RoZXIgZnVuY3Rpb25zCisgKiBzdWNoIGFzIHdyaXRlX2JpbmFyeSgpIGRvIGhhdmUuCisgKi8KK3ZvaWQKK2dzdF9lYm1sX3dyaXRlX2J1ZmZlcl9oZWFkZXIgKEdzdEVibWxXcml0ZSAqIGVibWwsIGd1aW50MzIgaWQsIGd1aW50NjQgbGVuZ3RoKQoreworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YV9zdGFydCwgKmRhdGFfZW5kOworCisgIGJ1ZiA9IGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfbmV3IChlYm1sLCAmbWFwLCAwKTsKKyAgZGF0YV9lbmQgPSBkYXRhX3N0YXJ0ID0gbWFwLmRhdGE7CisKKyAgZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9pZCAoJmRhdGFfZW5kLCBpZCk7CisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfc2l6ZSAoJmRhdGFfZW5kLCBsZW5ndGgpOworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICBnc3RfYnVmZmVyX3NldF9zaXplIChidWYsIChkYXRhX2VuZCAtIGRhdGFfc3RhcnQpKTsKKworICBnc3RfZWJtbF93cml0ZV9lbGVtZW50X3B1c2ggKGVibWwsIGJ1ZiwgZGF0YV9zdGFydCwgZGF0YV9lbmQpOworfQorCisKKy8qKgorICogZ3N0X2VibWxfd3JpdGVfYnVmZmVyOgorICogQGVibWw6ICNHc3RFYm1sV3JpdGUKKyAqIEBidWY6ICNHc3RCdWZmZXIgY29pbnRhaW5pbmcgdGhlIGRhdGEuCisgKgorICogV3JpdGUgIGJpbmFyeSBlbGVtZW50IChzZWUgZ3N0X2VibWxfd3JpdGVfYnVmZmVyX2hlYWRlcikuCisgKi8KK3ZvaWQKK2dzdF9lYm1sX3dyaXRlX2J1ZmZlciAoR3N0RWJtbFdyaXRlICogZWJtbCwgR3N0QnVmZmVyICogYnVmKQoreworICBnc3RfZWJtbF93cml0ZV9lbGVtZW50X3B1c2ggKGVibWwsIGJ1ZiwgTlVMTCwgTlVMTCk7Cit9CisKKworLyoqCisgKiBnc3RfZWJtbF9yZXBsYWNlX3VpbnQ6CisgKiBAZWJtbDogI0dzdEVibWxXcml0ZQorICogQHBvczogUG9zaXRpb24gb2YgdGhlIHVpbnQgdGhhdCBzaG91bGQgYmUgcmVwbGFjZWQuCisgKiBAbnVtOiBOZXcgdmFsdWUuCisgKgorICogUmVwbGFjZSB1aW50IHdpdGggYSBuZXcgdmFsdWUuCisgKiAKKyAqIFdoZW4gcmVwbGFjaW5nIGEgdWludCwgd2UgYXNzdW1lIHRoYXQgaXQgaXMgKmFsd2F5cyoKKyAqIDgtYnl0ZSwgc2luY2UgdGhhdCdzIHRoZSBzYWZlc3QgZ3Vlc3Mgd2UgY2FuIGRvLiBUaGlzCisgKiBpcyBqdXN0IGZvciBzaW1wbGljaXR5LgorICoKKyAqIEZJWE1FOiB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJlcGxhY2VkIHdpdGggc29tZXRoaW5nCisgKiBwcm9wZXIuIFRoaXMgaXMgYSBjcnVkZSBoYWNrLgorICovCit2b2lkCitnc3RfZWJtbF9yZXBsYWNlX3VpbnQgKEdzdEVibWxXcml0ZSAqIGVibWwsIGd1aW50NjQgcG9zLCBndWludDY0IG51bSkKK3sKKyAgZ3VpbnQ2NCBvbGRwb3MgPSBlYm1sLT5wb3M7CisgIGd1aW50OCAqZGF0YV9zdGFydCwgKmRhdGFfZW5kOworICBHc3RCdWZmZXIgKmJ1ZjsKKworICBkYXRhX3N0YXJ0ID0gZ19tYWxsb2MgKDgpOworICBkYXRhX2VuZCA9IGRhdGFfc3RhcnQ7CisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGRhdGFfc3RhcnQsIDgpOworCisgIGdzdF9lYm1sX3dyaXRlX3NlZWsgKGVibWwsIHBvcyk7CisgIGdzdF9lYm1sX3dyaXRlX3NldF91aW50ICgmZGF0YV9lbmQsIG51bSwgOCk7CisKKyAgZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9wdXNoIChlYm1sLCBidWYsIGRhdGFfc3RhcnQsIGRhdGFfZW5kKTsKKyAgZ3N0X2VibWxfd3JpdGVfc2VlayAoZWJtbCwgb2xkcG9zKTsKK30KKworLyoqCisgKiBnc3RfZWJtbF93cml0ZV9oZWFkZXI6CisgKiBAZWJtbDogI0dzdEVibWxXcml0ZQorICogQGRvY3R5cGU6IERvY3VtZW50IHR5cGUuCisgKiBAdmVyc2lvbjogRG9jdW1lbnQgdHlwZSB2ZXJzaW9uLgorICogCisgKiBXcml0ZSBFQk1MIGhlYWRlci4KKyAqLwordm9pZAorZ3N0X2VibWxfd3JpdGVfaGVhZGVyIChHc3RFYm1sV3JpdGUgKiBlYm1sLCBjb25zdCBnY2hhciAqIGRvY3R5cGUsCisgICAgZ3VpbnQgdmVyc2lvbikKK3sKKyAgZ3VpbnQ2NCBwb3M7CisKKyAgLyogd3JpdGUgdGhlIGJhc2ljIEVCTUwgaGVhZGVyICovCisgIGdzdF9lYm1sX3dyaXRlX3NldF9jYWNoZSAoZWJtbCwgMHg0MCk7CisgIHBvcyA9IGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCAoZWJtbCwgR1NUX0VCTUxfSURfSEVBREVSKTsKKyNpZiAoR1NUX0VCTUxfVkVSU0lPTiAhPSAxKQorICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfRUJNTF9JRF9FQk1MVkVSU0lPTiwgR1NUX0VCTUxfVkVSU0lPTik7CisgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9FQk1MX0lEX0VCTUxSRUFEVkVSU0lPTiwgR1NUX0VCTUxfVkVSU0lPTik7CisjZW5kaWYKKyNpZiAwCisgIC8qIHdlIGRvbid0IHdyaXRlIHRoZXNlIHVudGlsIHRoZXkncmUgIm5vbi1kZWZhdWx0IiAobmV2ZXIhKSAqLworICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfRUJNTF9JRF9FQk1MTUFYSURMRU5HVEgsIHNpemVvZiAoZ3VpbnQzMikpOworICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfRUJNTF9JRF9FQk1MTUFYU0laRUxFTkdUSCwgc2l6ZW9mIChndWludDY0KSk7CisjZW5kaWYKKyAgZ3N0X2VibWxfd3JpdGVfYXNjaWkgKGVibWwsIEdTVF9FQk1MX0lEX0RPQ1RZUEUsIGRvY3R5cGUpOworICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfRUJNTF9JRF9ET0NUWVBFVkVSU0lPTiwgdmVyc2lvbik7CisgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9FQk1MX0lEX0RPQ1RZUEVSRUFEVkVSU0lPTiwgdmVyc2lvbik7CisgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKGVibWwsIHBvcyk7CisgIGdzdF9lYm1sX3dyaXRlX2ZsdXNoX2NhY2hlIChlYm1sLCBGQUxTRSwgMCk7Cit9CmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2EvZWJtbC13cml0ZS5oIGIvZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzE0M2ZlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuaApAQCAtMCwwICsxLDE1NCBAQAorLyogR1N0cmVhbWVyIEVCTUwgSS9PCisgKiAoYykgMjAwMyBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAoYykgMjAwNSBNaWNoYWwgQmVuZXMgPG1pY2hhbC5iZW5lc0B4ZXJpcy5jej4KKyAqCisgKiBlYm1sLXdyaXRlLmM6IHdyaXRlIEVCTUwgZGF0YSB0byBmaWxlL3N0cmVhbQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfRUJNTF9XUklURV9IX18KKyNkZWZpbmUgX19HU1RfRUJNTF9XUklURV9IX18KKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXdyaXRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfRUJNTF9XUklURSBcCisgIChnc3RfZWJtbF93cml0ZV9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX0VCTUxfV1JJVEUob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0VCTUxfV1JJVEUsIEdzdEVibWxXcml0ZSkpCisjZGVmaW5lIEdTVF9FQk1MX1dSSVRFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfRUJNTF9XUklURSwgR3N0RWJtbFdyaXRlQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfRUJNTF9XUklURShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfRUJNTF9XUklURSkpCisjZGVmaW5lIEdTVF9JU19FQk1MX1dSSVRFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgR1NUX1RZUEVfRUJNTF9XUklURSkpCisjZGVmaW5lIEdTVF9FQk1MX1dSSVRFX0dFVF9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9FQk1MX1dSSVRFLCBHc3RFYm1sV3JpdGVDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RFYm1sV3JpdGUgeworICBHc3RPYmplY3Qgb2JqZWN0OworCisgIEdzdFBhZCAqc3JjcGFkOworICBndWludDY0IHBvczsKKyAgZ3VpbnQ2NCBsYXN0X3BvczsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKworICBHc3RCeXRlV3JpdGVyICpjYWNoZTsKKyAgZ3VpbnQ2NCBjYWNoZV9wb3M7CisKKyAgR3N0Rmxvd1JldHVybiBsYXN0X3dyaXRlX3Jlc3VsdDsKKworICBnYm9vbGVhbiB3cml0aW5nX3N0cmVhbWhlYWRlcjsKKyAgR3N0Qnl0ZVdyaXRlciAqc3RyZWFtaGVhZGVyOworICBndWludDY0IHN0cmVhbWhlYWRlcl9wb3M7CisKKyAgR3N0Q2FwcyAqY2FwczsKKworICBnYm9vbGVhbiBzdHJlYW1hYmxlOworfSBHc3RFYm1sV3JpdGU7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RFYm1sV3JpdGVDbGFzcyB7CisgIEdzdE9iamVjdENsYXNzIHBhcmVudDsKK30gR3N0RWJtbFdyaXRlQ2xhc3M7CisKK0dUeXBlICAgZ3N0X2VibWxfd3JpdGVfZ2V0X3R5cGUgICAgICAodm9pZCk7CisKK0dzdEVibWxXcml0ZSAqZ3N0X2VibWxfd3JpdGVfbmV3ICAgICAoR3N0UGFkICpzcmNwYWQpOwordm9pZCAgICBnc3RfZWJtbF93cml0ZV9yZXNldCAgICAgICAgIChHc3RFYm1sV3JpdGUgKmVibWwpOworCitHc3RGbG93UmV0dXJuIGdzdF9lYm1sX2xhc3Rfd3JpdGVfcmVzdWx0IChHc3RFYm1sV3JpdGUgKmVibWwpOworCisvKiBVc2VkIHRvIGNyZWF0ZSBzdHJlYW1oZWFkZXJzICovCit2b2lkICAgIGdzdF9lYm1sX3N0YXJ0X3N0cmVhbWhlYWRlciAgKEdzdEVibWxXcml0ZSAqZWJtbCk7CitHc3RCdWZmZXIqICAgIGdzdF9lYm1sX3N0b3Bfc3RyZWFtaGVhZGVyICAgKEdzdEVibWxXcml0ZSAqZWJtbCk7CisKKy8qCisgKiBDYWNoaW5nIG1lYW5zIHRoYXQgd2UgZG8gbm90IHB1c2ggb25lIGJ1ZmZlciBmb3IKKyAqIGVhY2ggZWxlbWVudCwgYnV0IGZpbGwgdGhpcyBvbmUgdW50aWwgYSBmbHVzaC4KKyAqLwordm9pZCAgICBnc3RfZWJtbF93cml0ZV9zZXRfY2FjaGUgICAgIChHc3RFYm1sV3JpdGUgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50ICAgICAgICAgc2l6ZSk7Cit2b2lkICAgIGdzdF9lYm1sX3dyaXRlX2ZsdXNoX2NhY2hlICAgKEdzdEVibWxXcml0ZSAqZWJtbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Jvb2xlYW4gaXNfa2V5ZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXApOworCisvKgorICogU2Vla2luZy4KKyAqLwordm9pZCAgICBnc3RfZWJtbF93cml0ZV9zZWVrICAgICAgICAgIChHc3RFYm1sV3JpdGUgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50NjQgICAgICAgcG9zKTsKKworLyoKKyAqIERhdGEgd3JpdGluZy4gCisgKi8KK3ZvaWQgICAgZ3N0X2VibWxfd3JpdGVfdWludCAgICAgICAgICAoR3N0RWJtbFdyaXRlICplYm1sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDY0ICAgICAgIG51bSk7Cit2b2lkICAgIGdzdF9lYm1sX3dyaXRlX3NpbnQgICAgICAgICAgKEdzdEVibWxXcml0ZSAqZWJtbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDY0ICAgICAgICBudW0pOwordm9pZCAgICBnc3RfZWJtbF93cml0ZV9mbG9hdCAgICAgICAgIChHc3RFYm1sV3JpdGUgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUgICAgICAgbnVtKTsKK3ZvaWQgICAgZ3N0X2VibWxfd3JpdGVfYXNjaWkgICAgICAgICAoR3N0RWJtbFdyaXRlICplYm1sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgKnN0cik7Cit2b2lkICAgIGdzdF9lYm1sX3dyaXRlX3V0ZjggICAgICAgICAgKEdzdEVibWxXcml0ZSAqZWJtbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICpzdHIpOwordm9pZCAgICBnc3RfZWJtbF93cml0ZV9kYXRlICAgICAgICAgIChHc3RFYm1sV3JpdGUgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQ2NCAgICAgICAgZGF0ZSk7CitndWludDY0IGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCAgKEdzdEVibWxXcml0ZSAqZWJtbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAgICAgICBpZCk7Cit2b2lkICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKEdzdEVibWxXcml0ZSAqZWJtbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCAgICAgICBzdGFydHBvcyk7Cit2b2lkICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2hfZnVsbCAoR3N0RWJtbFdyaXRlICogZWJtbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCBzdGFydHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCBleHRyYV9zaXplKTsKK3ZvaWQgICAgZ3N0X2VibWxfd3JpdGVfYmluYXJ5ICAgICAgICAoR3N0RWJtbFdyaXRlICplYm1sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWNoYXIgICAgICAgKmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCAgICAgICBsZW5ndGgpOwordm9pZCAgICBnc3RfZWJtbF93cml0ZV9oZWFkZXIgICAgICAgIChHc3RFYm1sV3JpdGUgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICAqZG9jdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQgICAgICAgICB2ZXJzaW9uKTsKKworLyoKKyAqIE5vdGU6IHRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBvbmx5IGZvciBtZWRpYSBkYXRhLgorICovCit2b2lkICAgIGdzdF9lYm1sX3dyaXRlX2J1ZmZlcl9oZWFkZXIgKEdzdEVibWxXcml0ZSAqZWJtbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCAgICAgICBsZW5ndGgpOwordm9pZCAgICBnc3RfZWJtbF93cml0ZV9idWZmZXIgICAgICAgIChHc3RFYm1sV3JpdGUgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdEJ1ZmZlciAgICAqZGF0YSk7CisKKy8qCisgKiBBIGhhY2ssIGJhc2ljYWxseS4uLiBTZWUgbWF0cm9za2EtbXV4LmMuIEkgc2hvdWxkIGFjdHVhbGx5CisgKiBtYWtlIGEgbmljZSBfcmVwbGFjZV9lbGVtZW50X3dpdGhfc2l6ZSgpIG9yIHNvLCBidXQgdGhpcworICogd29ya3MgZm9yIG5vdy4KKyAqLwordm9pZCAgICBnc3RfZWJtbF9yZXBsYWNlX3VpbnQgICAgICAgIChHc3RFYm1sV3JpdGUgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50NjQgICAgICAgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDY0ICAgICAgIG51bSk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9FQk1MX1dSSVRFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L21hdHJvc2thL2x6by5jIGIvZ3N0L21hdHJvc2thL2x6by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMWU4NDgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbWF0cm9za2EvbHpvLmMKQEAgLTAsMCArMSwyOTIgQEAKKy8qCisgKiBMWk8gMXggZGVjb21wcmVzc2lvbgorICogQ29weXJpZ2h0IChjKSAyMDA2IFJlaW1hciBEb2VmZmluZ2VyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAibHpvLmgiCisKKy8qISBkZWZpbmUgaWYgd2UgbWF5IHdyaXRlIHVwIHRvIDEyIGJ5dGVzIGJleW9uZCB0aGUgb3V0cHV0IGJ1ZmZlciAqLworLyogI2RlZmluZSBPVVRCVUZfUEFEREVEIDEgKi8KKy8qISBkZWZpbmUgaWYgd2UgbWF5IHJlYWQgdXAgdG8gOCBieXRlcyBiZXlvbmQgdGhlIGlucHV0IGJ1ZmZlciAqLworLyogI2RlZmluZSBJTkJVRl9QQURERUQgMSAqLwordHlwZWRlZiBzdHJ1Y3QgTFpPQ29udGV4dAoreworICBjb25zdCBndWludDggKmluLCAqaW5fZW5kOworICBndWludDggKm91dF9zdGFydCwgKm91dCwgKm91dF9lbmQ7CisgIGludCBlcnJvcjsKK30gTFpPQ29udGV4dDsKKworLyoKKyAqIFxicmllZiByZWFkIG9uZSBieXRlIGZyb20gaW5wdXQgYnVmZmVyLCBhdm9pZGluZyBvdmVycnVuCisgKiBccmV0dXJuIGJ5dGUgcmVhZAorICovCitzdGF0aWMgaW5saW5lIGludAorZ2V0X2J5dGUgKExaT0NvbnRleHQgKiBjKQoreworICBpZiAoYy0+aW4gPCBjLT5pbl9lbmQpCisgICAgcmV0dXJuICpjLT5pbisrOworICBjLT5lcnJvciB8PSBMWk9fSU5QVVRfREVQTEVURUQ7CisgIHJldHVybiAxOworfQorCisjaWZkZWYgSU5CVUZfUEFEREVECisjZGVmaW5lIEdFVEIoYykgKCooYykuaW4rKykKKyNlbHNlCisjZGVmaW5lIEdFVEIoYykgZ2V0X2J5dGUoJihjKSkKKyNlbmRpZgorCisvKgorICogXGJyaWVmIGRlY29kZSBhIGxlbmd0aCB2YWx1ZSBpbiB0aGUgY29kaW5nIHVzZWQgYnkgbHpvCisgKiBccGFyYW0geCBwcmV2aW91cyBieXRlIHZhbHVlCisgKiBccGFyYW0gbWFzayBiaXRzIHVzZWQgZnJvbSB4CisgKiBccmV0dXJuIGRlY29kZWQgbGVuZ3RoIHZhbHVlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitnZXRfbGVuIChMWk9Db250ZXh0ICogYywgaW50IHgsIGludCBtYXNrKQoreworICBpbnQgY250ID0geCAmIG1hc2s7CisgIGlmICghY250KSB7CisgICAgd2hpbGUgKCEoeCA9IGdldF9ieXRlIChjKSkpCisgICAgICBjbnQgKz0gMjU1OworICAgIGNudCArPSBtYXNrICsgeDsKKyAgfQorICByZXR1cm4gY250OworfQorCisvKiNkZWZpbmUgVU5BTElHTkVEX0xPQURTVE9SRSAqLworI2RlZmluZSBCVUlMVElOX01FTUNQWQorI2lmZGVmIFVOQUxJR05FRF9MT0FEU1RPUkUKKyNkZWZpbmUgQ09QWTIoZCwgcykgKihndWludDE2ICopKGQpID0gKihndWludDE2ICopKHMpOworI2RlZmluZSBDT1BZNChkLCBzKSAqKGd1aW50MzIgKikoZCkgPSAqKGd1aW50MzIgKikocyk7CisjZWxpZiBkZWZpbmVkKEJVSUxUSU5fTUVNQ1BZKQorI2RlZmluZSBDT1BZMihkLCBzKSBtZW1jcHkoZCwgcywgMik7CisjZGVmaW5lIENPUFk0KGQsIHMpIG1lbWNweShkLCBzLCA0KTsKKyNlbHNlCisjZGVmaW5lIENPUFkyKGQsIHMpIChkKVswXSA9IChzKVswXTsgKGQpWzFdID0gKHMpWzFdOworI2RlZmluZSBDT1BZNChkLCBzKSAoZClbMF0gPSAocylbMF07IChkKVsxXSA9IChzKVsxXTsgKGQpWzJdID0gKHMpWzJdOyAoZClbM10gPSAocylbM107CisjZW5kaWYKKworLyoKKyAqIFxicmllZiBjb3B5IGJ5dGVzIGZyb20gaW5wdXQgdG8gb3V0cHV0IGJ1ZmZlciB3aXRoIGNoZWNraW5nCisgKiBccGFyYW0gY250IG51bWJlciBvZiBieXRlcyB0byBjb3B5LCBtdXN0IGJlID49IDAKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitjb3B5IChMWk9Db250ZXh0ICogYywgaW50IGNudCkKK3sKKyAgcmVnaXN0ZXIgY29uc3QgZ3VpbnQ4ICpzcmMgPSBjLT5pbjsKKyAgcmVnaXN0ZXIgZ3VpbnQ4ICpkc3QgPSBjLT5vdXQ7CisgIGlmIChjbnQgPiBjLT5pbl9lbmQgLSBzcmMpIHsKKyAgICBjbnQgPSBNQVggKGMtPmluX2VuZCAtIHNyYywgMCk7CisgICAgYy0+ZXJyb3IgfD0gTFpPX0lOUFVUX0RFUExFVEVEOworICB9CisgIGlmIChjbnQgPiBjLT5vdXRfZW5kIC0gZHN0KSB7CisgICAgY250ID0gTUFYIChjLT5vdXRfZW5kIC0gZHN0LCAwKTsKKyAgICBjLT5lcnJvciB8PSBMWk9fT1VUUFVUX0ZVTEw7CisgIH0KKyNpZiBkZWZpbmVkKElOQlVGX1BBRERFRCkgJiYgZGVmaW5lZChPVVRCVUZfUEFEREVEKQorICBDT1BZNCAoZHN0LCBzcmMpOworICBzcmMgKz0gNDsKKyAgZHN0ICs9IDQ7CisgIGNudCAtPSA0OworICBpZiAoY250ID4gMCkKKyNlbmRpZgorICAgIG1lbWNweSAoZHN0LCBzcmMsIGNudCk7CisgIGMtPmluID0gc3JjICsgY250OworICBjLT5vdXQgPSBkc3QgKyBjbnQ7Cit9CisKKy8qCisgKiBcYnJpZWYgY29weSBwcmV2aW91c2x5IGRlY29kZWQgYnl0ZXMgdG8gY3VycmVudCBwb3NpdGlvbgorICogXHBhcmFtIGJhY2sgaG93IG1hbnkgYnl0ZXMgYmFjayB3ZSBzdGFydAorICogXHBhcmFtIGNudCBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSwgbXVzdCBiZSA+PSAwCisgKgorICogY250ID4gYmFjayBpcyB2YWxpZCwgdGhpcyB3aWxsIGNvcHkgdGhlIGJ5dGVzIHdlIGp1c3QgY29waWVkLAorICogdGh1cyBjcmVhdGluZyBhIHJlcGVhdGluZyBwYXR0ZXJuIHdpdGggYSBwZXJpb2QgbGVuZ3RoIG9mIGJhY2suCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorY29weV9iYWNrcHRyIChMWk9Db250ZXh0ICogYywgaW50IGJhY2ssIGludCBjbnQpCit7CisgIHJlZ2lzdGVyIGNvbnN0IGd1aW50OCAqc3JjID0gJmMtPm91dFstYmFja107CisgIHJlZ2lzdGVyIGd1aW50OCAqZHN0ID0gYy0+b3V0OworICBpZiAoc3JjIDwgYy0+b3V0X3N0YXJ0IHx8IHNyYyA+IGRzdCkgeworICAgIGMtPmVycm9yIHw9IExaT19JTlZBTElEX0JBQ0tQVFI7CisgICAgcmV0dXJuOworICB9CisgIGlmIChjbnQgPiBjLT5vdXRfZW5kIC0gZHN0KSB7CisgICAgY250ID0gTUFYIChjLT5vdXRfZW5kIC0gZHN0LCAwKTsKKyAgICBjLT5lcnJvciB8PSBMWk9fT1VUUFVUX0ZVTEw7CisgIH0KKyAgaWYgKGJhY2sgPT0gMSkgeworICAgIG1lbXNldCAoZHN0LCAqc3JjLCBjbnQpOworICAgIGRzdCArPSBjbnQ7CisgIH0gZWxzZSB7CisjaWZkZWYgT1VUQlVGX1BBRERFRAorICAgIENPUFkyIChkc3QsIHNyYyk7CisgICAgQ09QWTIgKGRzdCArIDIsIHNyYyArIDIpOworICAgIHNyYyArPSA0OworICAgIGRzdCArPSA0OworICAgIGNudCAtPSA0OworICAgIGlmIChjbnQgPiAwKSB7CisgICAgICBDT1BZMiAoZHN0LCBzcmMpOworICAgICAgQ09QWTIgKGRzdCArIDIsIHNyYyArIDIpOworICAgICAgQ09QWTIgKGRzdCArIDQsIHNyYyArIDQpOworICAgICAgQ09QWTIgKGRzdCArIDYsIHNyYyArIDYpOworICAgICAgc3JjICs9IDg7CisgICAgICBkc3QgKz0gODsKKyAgICAgIGNudCAtPSA4OworICAgIH0KKyNlbmRpZgorICAgIGlmIChjbnQgPiAwKSB7CisgICAgICBpbnQgYmxvY2tsZW4gPSBiYWNrOworICAgICAgd2hpbGUgKGNudCA+IGJsb2NrbGVuKSB7CisgICAgICAgIG1lbWNweSAoZHN0LCBzcmMsIGJsb2NrbGVuKTsKKyAgICAgICAgZHN0ICs9IGJsb2NrbGVuOworICAgICAgICBjbnQgLT0gYmxvY2tsZW47CisgICAgICAgIGJsb2NrbGVuIDw8PSAxOworICAgICAgfQorICAgICAgbWVtY3B5IChkc3QsIHNyYywgY250KTsKKyAgICB9CisgICAgZHN0ICs9IGNudDsKKyAgfQorICBjLT5vdXQgPSBkc3Q7Cit9CisKKy8qCisgKiBcYnJpZWYgZGVjb2RlIExaTyAxeCBjb21wcmVzc2VkIGRhdGEKKyAqIFxwYXJhbSBvdXQgb3V0cHV0IGJ1ZmZlcgorICogXHBhcmFtIG91dGxlbiBzaXplIG9mIG91dHB1dCBidWZmZXIsIG51bWJlciBvZiBieXRlcyBsZWZ0IGFyZSByZXR1cm5lZCBoZXJlCisgKiBccGFyYW0gaW4gaW5wdXQgYnVmZmVyCisgKiBccGFyYW0gaW5sZW4gc2l6ZSBvZiBpbnB1dCBidWZmZXIsIG51bWJlciBvZiBieXRlcyBsZWZ0IGFyZSByZXR1cm5lZCBoZXJlCisgKiBccmV0dXJuIDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGZsYWdzLCBzZWUgbHpvLmgKKyAqCisgKiBtYWtlIHN1cmUgYWxsIGJ1ZmZlcnMgYXJlIGFwcHJvcHJpYXRlbHkgcGFkZGVkLCBpbiBtdXN0IHByb3ZpZGUKKyAqIExaT19JTlBVVF9QQURESU5HLCBvdXQgbXVzdCBwcm92aWRlIExaT19PVVRQVVRfUEFERElORyBhZGRpdGlvbmFsIGJ5dGVzCisgKi8KK2ludAorbHpvMXhfZGVjb2RlICh2b2lkICpvdXQsIGludCAqb3V0bGVuLCBjb25zdCB2b2lkICppbiwgaW50ICppbmxlbikKK3sKKyAgaW50IHN0YXRlID0gMDsKKyAgaW50IHg7CisgIExaT0NvbnRleHQgYzsKKyAgYy5pbiA9IGluOworICBjLmluX2VuZCA9IChjb25zdCBndWludDggKikgaW4gKyAqaW5sZW47CisgIGMub3V0ID0gYy5vdXRfc3RhcnQgPSBvdXQ7CisgIGMub3V0X2VuZCA9IChndWludDggKikgb3V0ICsgKm91dGxlbjsKKyAgYy5lcnJvciA9IDA7CisgIHggPSBHRVRCIChjKTsKKyAgaWYgKHggPiAxNykgeworICAgIGNvcHkgKCZjLCB4IC0gMTcpOworICAgIHggPSBHRVRCIChjKTsKKyAgICBpZiAoeCA8IDE2KQorICAgICAgYy5lcnJvciB8PSBMWk9fRVJST1I7CisgIH0KKyAgaWYgKGMuaW4gPiBjLmluX2VuZCkKKyAgICBjLmVycm9yIHw9IExaT19JTlBVVF9ERVBMRVRFRDsKKyAgd2hpbGUgKCFjLmVycm9yKSB7CisgICAgaW50IGNudCwgYmFjazsKKyAgICBpZiAoeCA+IDE1KSB7CisgICAgICBpZiAoeCA+IDYzKSB7CisgICAgICAgIGNudCA9ICh4ID4+IDUpIC0gMTsKKyAgICAgICAgYmFjayA9IChHRVRCIChjKSA8PCAzKSArICgoeCA+PiAyKSAmIDcpICsgMTsKKyAgICAgIH0gZWxzZSBpZiAoeCA+IDMxKSB7CisgICAgICAgIGNudCA9IGdldF9sZW4gKCZjLCB4LCAzMSk7CisgICAgICAgIHggPSBHRVRCIChjKTsKKyAgICAgICAgYmFjayA9IChHRVRCIChjKSA8PCA2KSArICh4ID4+IDIpICsgMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNudCA9IGdldF9sZW4gKCZjLCB4LCA3KTsKKyAgICAgICAgYmFjayA9ICgxIDw8IDE0KSArICgoeCAmIDgpIDw8IDExKTsKKyAgICAgICAgeCA9IEdFVEIgKGMpOworICAgICAgICBiYWNrICs9IChHRVRCIChjKSA8PCA2KSArICh4ID4+IDIpOworICAgICAgICBpZiAoYmFjayA9PSAoMSA8PCAxNCkpIHsKKyAgICAgICAgICBpZiAoY250ICE9IDEpCisgICAgICAgICAgICBjLmVycm9yIHw9IExaT19FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0YXRlKSB7CisgICAgICBjbnQgPSBnZXRfbGVuICgmYywgeCwgMTUpOworICAgICAgY29weSAoJmMsIGNudCArIDMpOworICAgICAgeCA9IEdFVEIgKGMpOworICAgICAgaWYgKHggPiAxNSkKKyAgICAgICAgY29udGludWU7CisgICAgICBjbnQgPSAxOworICAgICAgYmFjayA9ICgxIDw8IDExKSArIChHRVRCIChjKSA8PCAyKSArICh4ID4+IDIpICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgY250ID0gMDsKKyAgICAgIGJhY2sgPSAoR0VUQiAoYykgPDwgMikgKyAoeCA+PiAyKSArIDE7CisgICAgfQorICAgIGNvcHlfYmFja3B0ciAoJmMsIGJhY2ssIGNudCArIDIpOworICAgIHN0YXRlID0gY250ID0geCAmIDM7CisgICAgY29weSAoJmMsIGNudCk7CisgICAgeCA9IEdFVEIgKGMpOworICB9CisgICppbmxlbiA9IGMuaW5fZW5kIC0gYy5pbjsKKyAgaWYgKGMuaW4gPiBjLmluX2VuZCkKKyAgICAqaW5sZW4gPSAwOworICAqb3V0bGVuID0gYy5vdXRfZW5kIC0gYy5vdXQ7CisgIHJldHVybiBjLmVycm9yOworfQorCisjaWZkZWYgVEVTVAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bHpvL2x6bzF4Lmg+CisjaW5jbHVkZSAibG9nLmgiCisjZGVmaW5lIE1BWFNaICgxMCoxMDI0KjEwMjQpCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIEZJTEUgKmluID0gZm9wZW4gKGFyZ3ZbMV0sICJyYiIpOworICBndWludDggKm9yaWcgPSBhdl9tYWxsb2MgKE1BWFNaICsgMTYpOworICBndWludDggKmNvbXAgPSBhdl9tYWxsb2MgKDIgKiBNQVhTWiArIDE2KTsKKyAgZ3VpbnQ4ICpkZWNvbXAgPSBhdl9tYWxsb2MgKE1BWFNaICsgMTYpOworICBnc2l6ZSBzID0gZnJlYWQgKG9yaWcsIDEsIE1BWFNaLCBpbik7CisgIGx6b191aW50IGNsZW4gPSAwOworICBsb25nIHRtcFtMWk8xWF9NRU1fQ09NUFJFU1NdOworICBpbnQgaW5sZW4sIG91dGxlbjsKKyAgaW50IGk7CisgIGF2X2xvZ19sZXZlbCA9IEFWX0xPR19ERUJVRzsKKyAgbHpvMXhfOTk5X2NvbXByZXNzIChvcmlnLCBzLCBjb21wLCAmY2xlbiwgdG1wKTsKKyAgZm9yIChpID0gMDsgaSA8IDMwMDsgaSsrKSB7CisgICAgU1RBUlRfVElNRVIgaW5sZW4gPSBjbGVuOworICAgIG91dGxlbiA9IE1BWFNaOworI2lmZGVmIExJQkxaTworICAgIGlmIChsem8xeF9kZWNvbXByZXNzX3NhZmUgKGNvbXAsIGlubGVuLCBkZWNvbXAsICZvdXRsZW4sIE5VTEwpKQorI2VsaWYgZGVmaW5lZChMSUJMWk9fVU5TQUZFKQorICAgIGlmIChsem8xeF9kZWNvbXByZXNzIChjb21wLCBpbmxlbiwgZGVjb21wLCAmb3V0bGVuLCBOVUxMKSkKKyNlbHNlCisgICAgaWYgKGx6bzF4X2RlY29kZSAoZGVjb21wLCAmb3V0bGVuLCBjb21wLCAmaW5sZW4pKQorI2VuZGlmCisgICAgICBhdl9sb2cgKE5VTEwsIEFWX0xPR19FUlJPUiwgImRlY29tcHJlc3Npb24gZXJyb3JcbiIpOworICAgIFNUT1BfVElNRVIgKCJsem9kIikKKyAgfQorICBpZiAobWVtY21wIChvcmlnLCBkZWNvbXAsIHMpKQorICAgIGF2X2xvZyAoTlVMTCwgQVZfTE9HX0VSUk9SLCAiZGVjb21wcmVzc2lvbiBpbmNvcnJlY3RcbiIpOworICBlbHNlCisgICAgYXZfbG9nIChOVUxMLCBBVl9MT0dfRVJST1IsICJkZWNvbXByZXNzaW9uIG9rXG4iKTsKKworICBmY2xvc2UgKGluKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC9tYXRyb3NrYS9sem8uaCBiL2dzdC9tYXRyb3NrYS9sem8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzc5NWY3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21hdHJvc2thL2x6by5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMWk8gMXggZGVjb21wcmVzc2lvbgorICogY29weXJpZ2h0IChjKSAyMDA2IFJlaW1hciBEb2VmZmluZ2VyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgRkZNUEVHX0xaT19ICisjZGVmaW5lIEZGTVBFR19MWk9fSAorCisjZGVmaW5lIExaT19JTlBVVF9ERVBMRVRFRCAxCisjZGVmaW5lIExaT19PVVRQVVRfRlVMTCAyCisjZGVmaW5lIExaT19JTlZBTElEX0JBQ0tQVFIgNAorI2RlZmluZSBMWk9fRVJST1IgOAorCisjZGVmaW5lIExaT19JTlBVVF9QQURESU5HIDgKKyNkZWZpbmUgTFpPX09VVFBVVF9QQURESU5HIDEyCisKK2ludCBsem8xeF9kZWNvZGUodm9pZCAqb3V0LCBpbnQgKm91dGxlbiwgY29uc3Qgdm9pZCAqaW4sIGludCAqaW5sZW4pOworCisjZW5kaWYgLyogRkZNUEVHX0xaT19IICovCmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYyBiL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYmY3NjMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYwpAQCAtMCwwICsxLDY0MDcgQEAKKy8qIEdTdHJlYW1lciBNYXRyb3NrYSBtdXhlci9kZW11eGVyCisgKiAoYykgMjAwMyBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAoYykgMjAwNiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICogKGMpIDIwMDggU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICogKGMpIDIwMTEgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorICoKKyAqIG1hdHJvc2thLWRlbXV4LmM6IG1hdHJvc2thIGZpbGUvc3RyZWFtIGRlbXV4ZXIKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKiBUT0RPOiBjaGVjayBDUkMzMiBpZiBwcmVzZW50CisgKiBUT0RPOiB0aGVyZSBjYW4gYmUgYSBzZWdtZW50IGFmdGVyIHRoZSBmaXJzdCBzZWdtZW50LiBIYW5kbGUgbGlrZQorICogICAgICAgY2hhaW5lZCBvZ2dzLiBGaXhlcyAjMzM0MDgyCisgKiBUT0RPOiBUZXN0IHNhbXBsZXM6IGh0dHA6Ly93d3cubWF0cm9za2Eub3JnL3NhbXBsZXMvbWF0cml4L2luZGV4Lmh0bWwKKyAqICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3NhbXBsZXMubXBsYXllcmhxLmh1L01hdHJvc2thLworICogVE9ETzogY2hlY2sgaWYgZGVtdXhpbmcgaXMgZG9uZSBjb3JyZWN0IGZvciBhbGwgY29kZWNzIGFjY29yZGluZyB0byBzcGVjCisgKiBUT0RPOiBzZWVraW5nIHdpdGggaW5jb21wbGV0ZSBvciB3aXRob3V0IENVRQorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LW1hdHJvc2thZGVtdXgKKyAqCisgKiBtYXRyb3NrYWRlbXV4IGRlbXV4ZXMgYSBNYXRyb3NrYSBmaWxlIGludG8gdGhlIGRpZmZlcmVudCBjb250YWluZWQgc3RyZWFtcy4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgZmlsZXNyYyBsb2NhdGlvbj0vcGF0aC90by9ta3YgISBtYXRyb3NrYWRlbXV4ICEgdm9yYmlzZGVjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIGF1dG9hdWRpb3NpbmsKKyAqIF18IFRoaXMgcGlwZWxpbmUgZGVtdXhlcyBhIE1hdHJvc2thIGZpbGUgYW5kIG91dHB1dHMgdGhlIGNvbnRhaW5lZCBWb3JiaXMgYXVkaW8uCisgKiA8L3JlZnNlY3QyPgorICovCisKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdsaWIvZ3ByaW50Zi5oPgorCisvKiBGb3IgQVZJIGNvbXBhdGliaWxpdHkgbW9kZQorICAgYW5kIGZvciBmb3VyY2Mgc3R1ZmYgKi8KKyNpbmNsdWRlIDxnc3QvcmlmZi9yaWZmLXJlYWQuaD4KKyNpbmNsdWRlIDxnc3QvcmlmZi9yaWZmLWlkcy5oPgorI2luY2x1ZGUgPGdzdC9yaWZmL3JpZmYtbWVkaWEuaD4KKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC90YWcvdGFnLmg+CisjaW5jbHVkZSA8Z3N0L3BidXRpbHMvcGJ1dGlscy5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSAibWF0cm9za2EtZGVtdXguaCIKKyNpbmNsdWRlICJtYXRyb3NrYS1pZHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAobWF0cm9za2FkZW11eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBtYXRyb3NrYWRlbXV4X2RlYnVnCisKKyNkZWZpbmUgREVCVUdfRUxFTUVOVF9TVEFSVChkZW11eCwgZWJtbCwgZWxlbWVudCkgXAorICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiUGFyc2luZyAiIGVsZW1lbnQgIiBlbGVtZW50IGF0IG9mZnNldCAlIiBcCisgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIGdzdF9lYm1sX3JlYWRfZ2V0X3BvcyAoZWJtbCkpCisKKyNkZWZpbmUgREVCVUdfRUxFTUVOVF9TVE9QKGRlbXV4LCBlYm1sLCBlbGVtZW50LCByZXQpIFwKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlBhcnNpbmcgIiBlbGVtZW50ICIgZWxlbWVudCAiIFwKKyAgICAgICAgIiBmaW5pc2hlZCB3aXRoICclcyciLCBnc3RfZmxvd19nZXRfbmFtZSAocmV0KSkKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTUVUQURBVEEsCisgIFBST1BfU1RSRUFNSU5GTywKKyAgUFJPUF9NQVhfR0FQX1RJTUUKK307CisKKyNkZWZpbmUgIERFRkFVTFRfTUFYX0dBUF9USU1FICAgICAgKDIgKiBHU1RfU0VDT05EKQorI2RlZmluZSAgSU5WQUxJRF9EQVRBX1RIUkVTSE9MRCAgICAoMiAqIDEwMjQgKiAxMDI0KQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbCA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtbWF0cm9za2E7IHZpZGVvL3gtbWF0cm9za2E7ICIKKyAgICAgICAgInZpZGVvL3gtbWF0cm9za2EtM2Q7IGF1ZGlvL3dlYm07IHZpZGVvL3dlYm0iKQorICAgICk7CisKKy8qIFRPRE86IGZpbGwgaW4gY2FwcyEgKi8KKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGF1ZGlvX3NyY190ZW1wbCA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoImF1ZGlvXyV1IiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJBTlkiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSB2aWRlb19zcmNfdGVtcGwgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJ2aWRlb18ldSIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9TT01FVElNRVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiQU5ZIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3VidGl0bGVfc3JjX3RlbXBsID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInN1YnRpdGxlXyV1IiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ0ZXh0L3gtcmF3LCBmb3JtYXQ9cGFuZ28tbWFya3VwOyBhcHBsaWNhdGlvbi94LXNzYTsgIgorICAgICAgICAiYXBwbGljYXRpb24veC1hc3M7YXBwbGljYXRpb24veC11c2Y7IHN1YnBpY3R1cmUveC1kdmQ7ICIKKyAgICAgICAgInN1YnBpY3R1cmUveC1wZ3M7IHN1YnRpdGxlL3gta2F0ZTsgIiAiYXBwbGljYXRpb24veC1zdWJ0aXRsZS11bmtub3duIikKKyAgICApOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfaWQgKEdzdE1hdHJvc2thRGVtdXggKiBkZW11eCwKKyAgICBndWludDMyIGlkLCBndWludDY0IGxlbmd0aCwgZ3VpbnQgbmVlZGVkKTsKKworLyogZWxlbWVudCBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIGdzdF9tYXRyb3NrYV9kZW11eF9sb29wIChHc3RQYWQgKiBwYWQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX2RlbXV4X2VsZW1lbnRfc2VuZF9ldmVudCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX2RlbXV4X2VsZW1lbnRfcXVlcnkgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworCisvKiBwYWQgZnVuY3Rpb25zICovCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX2RlbXV4X3NpbmtfYWN0aXZhdGUgKEdzdFBhZCAqIHNpbmtwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbWF0cm9za2FfZGVtdXhfc2lua19hY3RpdmF0ZV9tb2RlIChHc3RQYWQgKiBzaW5rcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UGFkTW9kZSBtb2RlLCBnYm9vbGVhbiBhY3RpdmUpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX2V2ZW50IChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgsCisgICAgR3N0UGFkICogcGFkLCBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdFF1ZXJ5ICogcXVlcnkpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9tYXRyb3NrYV9kZW11eF9jaGFpbiAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIG9iamVjdCwgR3N0QnVmZmVyICogYnVmZmVyKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfbWF0cm9za2FfZGVtdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKyNpZiAwCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX2RlbXV4X3NldF9pbmRleCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEluZGV4ICogaW5kZXgpOworc3RhdGljIEdzdEluZGV4ICpnc3RfbWF0cm9za2FfZGVtdXhfZ2V0X2luZGV4IChHc3RFbGVtZW50ICogZWxlbWVudCk7CisjZW5kaWYKKworLyogY2FwcyBmdW5jdGlvbnMgKi8KK3N0YXRpYyBHc3RDYXBzICpnc3RfbWF0cm9za2FfZGVtdXhfdmlkZW9fY2FwcyAoR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dAorICAgICogdmlkZW9jb250ZXh0LCBjb25zdCBnY2hhciAqIGNvZGVjX2lkLCBndWludDggKiBkYXRhLCBndWludCBzaXplLAorICAgIGdjaGFyICoqIGNvZGVjX25hbWUsIGd1aW50MzIgKiByaWZmX2ZvdXJjYyk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X21hdHJvc2thX2RlbXV4X2F1ZGlvX2NhcHMgKEdzdE1hdHJvc2thVHJhY2tBdWRpb0NvbnRleHQKKyAgICAqIGF1ZGlvY29udGV4dCwgY29uc3QgZ2NoYXIgKiBjb2RlY19pZCwgZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgc2l6ZSwKKyAgICBnY2hhciAqKiBjb2RlY19uYW1lLCBndWludDE2ICogcmlmZl9hdWRpb19mbXQpOworc3RhdGljIEdzdENhcHMKKyAgICAqIGdzdF9tYXRyb3NrYV9kZW11eF9zdWJ0aXRsZV9jYXBzIChHc3RNYXRyb3NrYVRyYWNrU3VidGl0bGVDb250ZXh0ICoKKyAgICBzdWJ0aXRsZWNvbnRleHQsIGNvbnN0IGdjaGFyICogY29kZWNfaWQsIGdwb2ludGVyIGRhdGEsIGd1aW50IHNpemUpOworCisvKiBzdHJlYW0gbWV0aG9kcyAqLworc3RhdGljIHZvaWQgZ3N0X21hdHJvc2thX2RlbXV4X3Jlc2V0IChHc3RFbGVtZW50ICogZWxlbWVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gcGVyZm9ybV9zZWVrX3RvX29mZnNldCAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4LAorICAgIGdkb3VibGUgcmF0ZSwgZ3VpbnQ2NCBvZmZzZXQsIGd1aW50MzIgc2VxbnVtLCBHc3RTZWVrRmxhZ3MgZmxhZ3MpOworCisvKiBnb2JqZWN0IGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgZ3N0X21hdHJvc2thX2RlbXV4X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9tYXRyb3NrYV9kZW11eF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK0dUeXBlIGdzdF9tYXRyb3NrYV9kZW11eF9nZXRfdHlwZSAodm9pZCk7CisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3RfbWF0cm9za2FfZGVtdXhfcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RNYXRyb3NrYURlbXV4LCBnc3RfbWF0cm9za2FfZGVtdXgsIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX2RlbXV4X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RNYXRyb3NrYURlbXV4ICpkZW11eCA9IEdTVF9NQVRST1NLQV9ERU1VWCAob2JqZWN0KTsKKworICBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fZmluYWxpemUgKCZkZW11eC0+Y29tbW9uKTsKKyAgZ3N0X2Zsb3dfY29tYmluZXJfZnJlZSAoZGVtdXgtPmZsb3djb21iaW5lcik7CisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9kZW11eF9jbGFzc19pbml0IChHc3RNYXRyb3NrYURlbXV4Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAobWF0cm9za2FkZW11eF9kZWJ1ZywgIm1hdHJvc2thZGVtdXgiLCAwLAorICAgICAgIk1hdHJvc2thIGRlbXV4ZXIiKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9tYXRyb3NrYV9kZW11eF9maW5hbGl6ZTsKKworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfbWF0cm9za2FfZGVtdXhfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfbWF0cm9za2FfZGVtdXhfc2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX0dBUF9USU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoIm1heC1nYXAtdGltZSIsICJNYXhpbXVtIGdhcCB0aW1lIiwKKyAgICAgICAgICAiVGhlIGRlbXV4ZXIgc2VuZHMgb3V0IHNlZ21lbnQgZXZlbnRzIGZvciBza2lwcGluZyAiCisgICAgICAgICAgImdhcHMgbG9uZ2VyIHRoYW4gdGhpcyAoMCA9IGRpc2FibGVkKS4iLCAwLCBHX01BWFVJTlQ2NCwKKyAgICAgICAgICBERUZBVUxUX01BWF9HQVBfVElNRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbWF0cm9za2FfZGVtdXhfY2hhbmdlX3N0YXRlKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+c2VuZF9ldmVudCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21hdHJvc2thX2RlbXV4X2VsZW1lbnRfc2VuZF9ldmVudCk7CisgIGdzdGVsZW1lbnRfY2xhc3MtPnF1ZXJ5ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbWF0cm9za2FfZGVtdXhfZWxlbWVudF9xdWVyeSk7CisjaWYgMAorICBnc3RlbGVtZW50X2NsYXNzLT5zZXRfaW5kZXggPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9kZW11eF9zZXRfaW5kZXgpOworICBnc3RlbGVtZW50X2NsYXNzLT5nZXRfaW5kZXggPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9kZW11eF9nZXRfaW5kZXgpOworI2VuZGlmCisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmdmlkZW9fc3JjX3RlbXBsKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmYXVkaW9fc3JjX3RlbXBsKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmc3VidGl0bGVfc3JjX3RlbXBsKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiTWF0cm9za2EgZGVtdXhlciIsCisgICAgICAiQ29kZWMvRGVtdXhlciIsCisgICAgICAiRGVtdXhlcyBNYXRyb3NrYS9XZWJNIHN0cmVhbXMgaW50byB2aWRlby9hdWRpby9zdWJ0aXRsZXMiLAorICAgICAgIkdTdHJlYW1lciBtYWludGFpbmVycyA8Z3N0cmVhbWVyLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZz4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9kZW11eF9pbml0IChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgpCit7CisgIGRlbXV4LT5jb21tb24uc2lua3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc2lua190ZW1wbCwKKyAgICAgICJzaW5rIik7CisgIGdzdF9wYWRfc2V0X2FjdGl2YXRlX2Z1bmN0aW9uIChkZW11eC0+Y29tbW9uLnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21hdHJvc2thX2RlbXV4X3NpbmtfYWN0aXZhdGUpKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZhdGVtb2RlX2Z1bmN0aW9uIChkZW11eC0+Y29tbW9uLnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21hdHJvc2thX2RlbXV4X3NpbmtfYWN0aXZhdGVfbW9kZSkpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoZGVtdXgtPmNvbW1vbi5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9kZW11eF9jaGFpbikpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoZGVtdXgtPmNvbW1vbi5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc2lua19ldmVudCkpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoZGVtdXgpLCBkZW11eC0+Y29tbW9uLnNpbmtwYWQpOworCisgIC8qIGluaXQgZGVmYXVsdHMgZm9yIGNvbW1vbiByZWFkIGNvbnRleHQgKi8KKyAgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2luaXQgKCZkZW11eC0+Y29tbW9uKTsKKworICAvKiBwcm9wZXJ0eSBkZWZhdWx0cyAqLworICBkZW11eC0+bWF4X2dhcF90aW1lID0gREVGQVVMVF9NQVhfR0FQX1RJTUU7CisKKyAgR1NUX09CSkVDVF9GTEFHX1NFVCAoZGVtdXgsIEdTVF9FTEVNRU5UX0ZMQUdfSU5ERVhBQkxFKTsKKworICBkZW11eC0+Zmxvd2NvbWJpbmVyID0gZ3N0X2Zsb3dfY29tYmluZXJfbmV3ICgpOworCisgIC8qIGZpbmlzaCBvZmYgKi8KKyAgZ3N0X21hdHJvc2thX2RlbXV4X3Jlc2V0IChHU1RfRUxFTUVOVCAoZGVtdXgpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9kZW11eF9yZXNldCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdE1hdHJvc2thRGVtdXggKmRlbXV4ID0gR1NUX01BVFJPU0tBX0RFTVVYIChlbGVtZW50KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlJlc2V0dGluZyBzdGF0ZSIpOworCisgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9yZXNldCAoR1NUX0VMRU1FTlQgKGRlbXV4KSwgJmRlbXV4LT5jb21tb24pOworCisgIGRlbXV4LT5udW1fYV9zdHJlYW1zID0gMDsKKyAgZGVtdXgtPm51bV90X3N0cmVhbXMgPSAwOworICBkZW11eC0+bnVtX3Zfc3RyZWFtcyA9IDA7CisKKyAgZGVtdXgtPmhhdmVfZ3JvdXBfaWQgPSBGQUxTRTsKKyAgZGVtdXgtPmdyb3VwX2lkID0gR19NQVhVSU5UOworCisgIGRlbXV4LT5jbG9jayA9IE5VTEw7CisgIGRlbXV4LT50cmFja3NfcGFyc2VkID0gRkFMU0U7CisKKyAgaWYgKGRlbXV4LT5jbHVzdGVycykgeworICAgIGdfYXJyYXlfZnJlZSAoZGVtdXgtPmNsdXN0ZXJzLCBUUlVFKTsKKyAgICBkZW11eC0+Y2x1c3RlcnMgPSBOVUxMOworICB9CisKKyAgZ19saXN0X2ZvcmVhY2ggKGRlbXV4LT5zZWVrX3BhcnNlZCwKKyAgICAgIChHRnVuYykgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2ZyZWVfcGFyc2VkX2VsLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKGRlbXV4LT5zZWVrX3BhcnNlZCk7CisgIGRlbXV4LT5zZWVrX3BhcnNlZCA9IE5VTEw7CisKKyAgZGVtdXgtPmxhc3Rfc3RvcF9lbmQgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBkZW11eC0+c2Vla19ibG9jayA9IDA7CisgIGRlbXV4LT5zdHJlYW1fc3RhcnRfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGRlbXV4LT50b190aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgZGVtdXgtPmNsdXN0ZXJfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGRlbXV4LT5jbHVzdGVyX29mZnNldCA9IDA7CisgIGRlbXV4LT5uZXh0X2NsdXN0ZXJfb2Zmc2V0ID0gMDsKKyAgZGVtdXgtPnN0cmVhbV9sYXN0X3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBkZW11eC0+bGFzdF9jbHVzdGVyX29mZnNldCA9IDA7CisgIGRlbXV4LT5pbmRleF9vZmZzZXQgPSAwOworICBkZW11eC0+c2Vla2FibGUgPSBGQUxTRTsKKyAgZGVtdXgtPm5lZWRfc2VnbWVudCA9IEZBTFNFOworICBkZW11eC0+c2VnbWVudF9zZXFudW0gPSAwOworICBkZW11eC0+cmVxdWVzdGVkX3NlZWtfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGRlbXV4LT5zZWVrX29mZnNldCA9IC0xOworICBkZW11eC0+YnVpbGRpbmdfaW5kZXggPSBGQUxTRTsKKyAgaWYgKGRlbXV4LT5zZWVrX2V2ZW50KSB7CisgICAgZ3N0X2V2ZW50X3VucmVmIChkZW11eC0+c2Vla19ldmVudCk7CisgICAgZGVtdXgtPnNlZWtfZXZlbnQgPSBOVUxMOworICB9CisKKyAgZGVtdXgtPnNlZWtfaW5kZXggPSBOVUxMOworICBkZW11eC0+c2Vla19lbnRyeSA9IDA7CisKKyAgaWYgKGRlbXV4LT5uZXdfc2VnbWVudCkgeworICAgIGdzdF9ldmVudF91bnJlZiAoZGVtdXgtPm5ld19zZWdtZW50KTsKKyAgICBkZW11eC0+bmV3X3NlZ21lbnQgPSBOVUxMOworICB9CisKKyAgZGVtdXgtPmludmFsaWRfZHVyYXRpb24gPSBGQUxTRTsKKworICBkZW11eC0+Y2FjaGVkX2xlbmd0aCA9IEdfTUFYVUlOVDY0OworCisgIGdzdF9mbG93X2NvbWJpbmVyX2NsZWFyIChkZW11eC0+Zmxvd2NvbWJpbmVyKTsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfbWF0cm9za2FfZGVjb2RlX2J1ZmZlciAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBjb250ZXh0LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdE1hcEluZm8gbWFwOworICBncG9pbnRlciBkYXRhOworICBnc2l6ZSBzaXplOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfQlVGRkVSIChidWYpLCBOVUxMKTsKKworICBHU1RfREVCVUcgKCJkZWNvZGluZyBidWZmZXIgJXAiLCBidWYpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKyAgc2l6ZSA9IG1hcC5zaXplOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzaXplID4gMCwgYnVmKTsKKworICBpZiAoZ3N0X21hdHJvc2thX2RlY29kZV9kYXRhIChjb250ZXh0LT5lbmNvZGluZ3MsICZkYXRhLCAmc2l6ZSwKKyAgICAgICAgICBHU1RfTUFUUk9TS0FfVFJBQ0tfRU5DT0RJTkdfU0NPUEVfRlJBTUUsIEZBTFNFKSkgeworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZGF0YSwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHICgiZGVjb2RlIGRhdGEgZmFpbGVkIik7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbV9oZWFkZXJzX3RvX2NhcHMgKEdzdE1hdHJvc2thRGVtdXggKiBkZW11eCwKKyAgICBHc3RCdWZmZXJMaXN0ICogbGlzdCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgR1ZhbHVlIGFycl92YWwgPSBHX1ZBTFVFX0lOSVQ7CisgIEdWYWx1ZSBidWZfdmFsID0gR19WQUxVRV9JTklUOworICBnaW50IGksIG51bTsKKworICBnX2Fzc2VydCAoZ3N0X2NhcHNfaXNfd3JpdGFibGUgKGNhcHMpKTsKKworICBnX3ZhbHVlX2luaXQgKCZhcnJfdmFsLCBHU1RfVFlQRV9BUlJBWSk7CisgIGdfdmFsdWVfaW5pdCAoJmJ1Zl92YWwsIEdTVF9UWVBFX0JVRkZFUik7CisKKyAgbnVtID0gZ3N0X2J1ZmZlcl9saXN0X2xlbmd0aCAobGlzdCk7CisgIGZvciAoaSA9IDA7IGkgPCBudW07ICsraSkgeworICAgIGdfdmFsdWVfc2V0X2JveGVkICgmYnVmX3ZhbCwgZ3N0X2J1ZmZlcl9saXN0X2dldCAobGlzdCwgaSkpOworICAgIGdzdF92YWx1ZV9hcnJheV9hcHBlbmRfdmFsdWUgKCZhcnJfdmFsLCAmYnVmX3ZhbCk7CisgIH0KKworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGdzdF9zdHJ1Y3R1cmVfdGFrZV92YWx1ZSAocywgInN0cmVhbWhlYWRlciIsICZhcnJfdmFsKTsKKyAgZ192YWx1ZV91bnNldCAoJmJ1Zl92YWwpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NvbG91ciAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4LCBHc3RFYm1sUmVhZCAqIGVibWwsCisgICAgR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCAqIHZpZGVvX2NvbnRleHQpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RWaWRlb0NvbG9yaW1ldHJ5IGNvbG9yaW1ldHJ5OworICBndWludDMyIGlkOworICBndWludDY0IG51bTsKKworICBjb2xvcmltZXRyeS5yYW5nZSA9IEdTVF9WSURFT19DT0xPUl9SQU5HRV9VTktOT1dOOworICBjb2xvcmltZXRyeS5tYXRyaXggPSBHU1RfVklERU9fQ09MT1JfTUFUUklYX1VOS05PV047CisgIGNvbG9yaW1ldHJ5LnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX1VOS05PV047CisgIGNvbG9yaW1ldHJ5LnByaW1hcmllcyA9IEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfVU5LTk9XTjsKKworICBERUJVR19FTEVNRU5UX1NUQVJUIChkZW11eCwgZWJtbCwgIlRyYWNrVmlkZW9Db2xvdXIiKTsKKworICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfbWFzdGVyIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICBnb3RvIGJlYWNoOworCisgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIGJlYWNoOworCisgICAgc3dpdGNoIChpZCkgeworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9NQVRSSVhDT0VGRklDSUVOVFM6eworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgZ290byBiZWFjaDsKKworICAgICAgICBzd2l0Y2ggKG51bSkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5Lm1hdHJpeCA9IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfUkdCOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY29sb3JpbWV0cnkubWF0cml4ID0gR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9CVDcwOTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5Lm1hdHJpeCA9IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfVU5LTk9XTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5Lm1hdHJpeCA9IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfRkNDOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvKiBGSVhNRTogIjU6IEJUNDcwQkciIGlzIHVuZGVmaW5lZCBpbiBHc3RWaWRlb0NvbG9yTWF0cml4CisgICAgICAgICAgICAgKiBidXQgaXQncyBmdW5jdGlvbmFsbHkgc2FtZSBhcyAiNjogQlQ2MDEiICovCisgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5Lm1hdHJpeCA9IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQ2MDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBjb2xvcmltZXRyeS5tYXRyaXggPSBHU1RfVklERU9fQ09MT1JfTUFUUklYX1NNUFRFMjQwTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5Lm1hdHJpeCA9IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQyMDIwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKGRlbXV4LCAiVW5zdXBwb3J0ZWQgY29sb3IgbWF0cml4IGNvZWZmaWNpZW50cyAgJSIKKyAgICAgICAgICAgICAgICBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPUkFOR0U6eworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgZ290byBiZWFjaDsKKworICAgICAgICBzd2l0Y2ggKG51bSkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5LnJhbmdlID0gR1NUX1ZJREVPX0NPTE9SX1JBTkdFX1VOS05PV047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjb2xvcmltZXRyeS5yYW5nZSA9IEdTVF9WSURFT19DT0xPUl9SQU5HRV8xNl8yMzU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBjb2xvcmltZXRyeS5yYW5nZSA9IEdTVF9WSURFT19DT0xPUl9SQU5HRV8wXzI1NTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBHU1RfRklYTUVfT0JKRUNUIChkZW11eCwgIlVuc3VwcG9ydGVkIGNvbG9yIHJhbmdlICAlIgorICAgICAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9UUkFOU0ZFUkNIQVJBQ1RFUklTVElDUzp7CisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBnb3RvIGJlYWNoOworCisgICAgICAgIHN3aXRjaCAobnVtKSB7CisgICAgICAgICAgICAvKiBGSVhNRTogIjY6IEJUNjAxIiBhbmQgIjE0OiBCVDIwMjBfMTAiIGFyZSB1bmRlZmluZWQgaW4KKyAgICAgICAgICAgICAqIEdzdFZpZGVvVHJhbnNmZXJGdW5jdGlvbiwgYnV0IGZ1bmN0aW9uYWxseSBzYW1lIGFzICIxOiBCVDcwOSIgKi8KKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICBjb2xvcmltZXRyeS50cmFuc2ZlciA9IEdTVF9WSURFT19UUkFOU0ZFUl9CVDcwOTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5LnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX1VOS05PV047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBjb2xvcmltZXRyeS50cmFuc2ZlciA9IEdTVF9WSURFT19UUkFOU0ZFUl9HQU1NQTIyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgY29sb3JpbWV0cnkudHJhbnNmZXIgPSBHU1RfVklERU9fVFJBTlNGRVJfR0FNTUEyODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5LnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX1NNUFRFMjQwTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5LnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX0dBTU1BMTA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICBjb2xvcmltZXRyeS50cmFuc2ZlciA9IEdTVF9WSURFT19UUkFOU0ZFUl9MT0cxMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgY29sb3JpbWV0cnkudHJhbnNmZXIgPSBHU1RfVklERU9fVFJBTlNGRVJfTE9HMzE2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5LnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX1NSR0I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgY29sb3JpbWV0cnkudHJhbnNmZXIgPSBHU1RfVklERU9fVFJBTlNGRVJfQlQyMDIwXzEyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBjb2xvciB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpY3MgICUiCisgICAgICAgICAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9WSURFT1BSSU1BUklFUzp7CisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBnb3RvIGJlYWNoOworCisgICAgICAgIHN3aXRjaCAobnVtKSB7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY29sb3JpbWV0cnkucHJpbWFyaWVzID0gR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19CVDcwOTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5LnByaW1hcmllcyA9IEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfVU5LTk9XTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5LnByaW1hcmllcyA9IEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfQlQ0NzBNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgY29sb3JpbWV0cnkucHJpbWFyaWVzID0gR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19CVDQ3MEJHOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgY29sb3JpbWV0cnkucHJpbWFyaWVzID0gR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19TTVBURTE3ME07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBjb2xvcmltZXRyeS5wcmltYXJpZXMgPSBHU1RfVklERU9fQ09MT1JfUFJJTUFSSUVTX1NNUFRFMjQwTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5LnByaW1hcmllcyA9IEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfRklMTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5LnByaW1hcmllcyA9IEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfQlQyMDIwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKGRlbXV4LCAiVW5zdXBwb3J0ZWQgY29sb3IgcHJpbWFyaWVzICAlIgorICAgICAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX0ZJWE1FX09CSkVDVCAoZGVtdXgsICJVbnN1cHBvcnRlZCBzdWJlbGVtZW50IDB4JXggaW4gQ29sb3VyIiwgaWQpOworICAgICAgICByZXQgPSBnc3RfZWJtbF9yZWFkX3NraXAgKGVibWwpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBtZW1jcHkgKCZ2aWRlb19jb250ZXh0LT5jb2xvcmltZXRyeSwgJmNvbG9yaW1ldHJ5LAorICAgICAgc2l6ZW9mIChHc3RWaWRlb0NvbG9yaW1ldHJ5KSk7CisKK2JlYWNoOgorICBERUJVR19FTEVNRU5UX1NUT1AgKGRlbXV4LCBlYm1sLCAiVHJhY2tWaWRlb0NvbG91ciIsIHJldCk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4LCBHc3RFYm1sUmVhZCAqIGVibWwpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqa2xhc3MgPSBHU1RfRUxFTUVOVF9HRVRfQ0xBU1MgKGRlbXV4KTsKKyAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKmNvbnRleHQ7CisgIEdzdFBhZFRlbXBsYXRlICp0ZW1wbCA9IE5VTEw7CisgIEdzdFN0cmVhbUZsYWdzIHN0cmVhbV9mbGFnczsKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisgIEdzdFRhZ0xpc3QgKmNhY2hlZF90YWdsaXN0OworICBnY2hhciAqcGFkbmFtZSA9IE5VTEw7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBndWludDMyIGlkLCByaWZmX2ZvdXJjYyA9IDA7CisgIGd1aW50MTYgcmlmZl9hdWRpb19mbXQgPSAwOworICBHc3RFdmVudCAqc3RyZWFtX3N0YXJ0OworICBnY2hhciAqY29kZWMgPSBOVUxMOworICBnY2hhciAqc3RyZWFtX2lkOworCisgIERFQlVHX0VMRU1FTlRfU1RBUlQgKGRlbXV4LCBlYm1sLCAiVHJhY2tFbnRyeSIpOworCisgIC8qIHN0YXJ0IHdpdGggdGhlIG1hc3RlciAqLworICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfbWFzdGVyIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykgeworICAgIERFQlVHX0VMRU1FTlRfU1RPUCAoZGVtdXgsIGVibWwsICJUcmFja0VudHJ5IiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgLyogYWxsb2NhdGUgZ2VuZXJpYy4uLiBpZiB3ZSBrbm93IHRoZSB0eXBlLCB3ZSdsbCBnX3JlbmV3KCkKKyAgICogd2l0aCB0aGUgcHJlY2lzZSB0eXBlICovCisgIGNvbnRleHQgPSBnX25ldzAgKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0LCAxKTsKKyAgZ19wdHJfYXJyYXlfYWRkIChkZW11eC0+Y29tbW9uLnNyYywgY29udGV4dCk7CisgIGNvbnRleHQtPmluZGV4ID0gZGVtdXgtPmNvbW1vbi5udW1fc3RyZWFtczsKKyAgY29udGV4dC0+aW5kZXhfd3JpdGVyX2lkID0gLTE7CisgIGNvbnRleHQtPnR5cGUgPSAwOyAgICAgICAgICAgIC8qIG5vIHR5cGUgeWV0ICovCisgIGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24gPSAwOworICBjb250ZXh0LT5wb3MgPSAwOworICBjb250ZXh0LT5zZXRfZGlzY29udCA9IFRSVUU7CisgIGNvbnRleHQtPnRpbWVjb2Rlc2NhbGUgPSAxLjA7CisgIGNvbnRleHQtPmZsYWdzID0KKyAgICAgIEdTVF9NQVRST1NLQV9UUkFDS19FTkFCTEVEIHwgR1NUX01BVFJPU0tBX1RSQUNLX0RFRkFVTFQgfAorICAgICAgR1NUX01BVFJPU0tBX1RSQUNLX0xBQ0lORzsKKyAgY29udGV4dC0+ZnJvbV90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgY29udGV4dC0+ZnJvbV9vZmZzZXQgPSAtMTsKKyAgY29udGV4dC0+dG9fb2Zmc2V0ID0gR19NQVhJTlQ2NDsKKyAgY29udGV4dC0+YWxpZ25tZW50ID0gMTsKKyAgY29udGV4dC0+ZHRzX29ubHkgPSBGQUxTRTsKKyAgY29udGV4dC0+aW50cmFfb25seSA9IEZBTFNFOworICBjb250ZXh0LT50YWdzID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZGVtdXgtPmNvbW1vbi5udW1fc3RyZWFtcysrOworICBnX2Fzc2VydCAoZGVtdXgtPmNvbW1vbi5zcmMtPmxlbiA9PSBkZW11eC0+Y29tbW9uLm51bV9zdHJlYW1zKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlN0cmVhbSBudW1iZXIgJWQiLCBjb250ZXh0LT5pbmRleCk7CisKKyAgLyogdHJ5IHJlYWRpbmcgdGhlIHRyYWNrZW50cnkgaGVhZGVycyAqLworICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmIGdzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoZWJtbCwgMSwgVFJVRSkpIHsKKyAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3BlZWtfaWQgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICAgIC8qIHRyYWNrIG51bWJlciAodW5pcXVlIHN0cmVhbSBJRCkgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLTlVNQkVSOnsKKyAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChudW0gPT0gMCkgeworICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlbXV4LCAiSW52YWxpZCBUcmFja051bWJlciAwIik7CisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoIWdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl90cmFja251bWJlcl91bmlxdWUgKCZkZW11eC0+Y29tbW9uLAorICAgICAgICAgICAgICAgIG51bSkpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChkZW11eCwgIlRyYWNrTnVtYmVyICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICAgICAgICAgIiBpcyBub3QgdW5pcXVlIiwgbnVtKTsKKyAgICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiVHJhY2tOdW1iZXI6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgIGNvbnRleHQtPm51bSA9IG51bTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAgIC8qIHRyYWNrIFVJRCAodW5pcXVlIGlkZW50aWZpZXIpICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS1VJRDp7CisgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAobnVtID09IDApIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChkZW11eCwgIkludmFsaWQgVHJhY2tVSUQgMCIpOworICAgICAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJUcmFja1VJRDogJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgY29udGV4dC0+dWlkID0gbnVtOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiB0cmFjayB0eXBlICh2aWRlbywgYXVkaW8sIGNvbWJpbmVkLCBzdWJ0aXRsZSwgZXRjLikgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLVFlQRTp7CisgICAgICAgIGd1aW50NjQgdHJhY2tfdHlwZTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmdHJhY2tfdHlwZSkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29udGV4dC0+dHlwZSAhPSAwICYmIGNvbnRleHQtPnR5cGUgIT0gdHJhY2tfdHlwZSkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICJNb3JlIHRoYW4gb25lIHRyYWNrdHlwZSBkZWZpbmVkIGluIGEgVHJhY2tFbnRyeSAtIHNraXBwaW5nIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2tfdHlwZSA8IDEgfHwgdHJhY2tfdHlwZSA+IDI1NCkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJJbnZhbGlkIFRyYWNrVHlwZSAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgICB0cmFja190eXBlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiVHJhY2tUeXBlOiAlIiBHX0dVSU5UNjRfRk9STUFULCB0cmFja190eXBlKTsKKworICAgICAgICAvKiBvaywgc28gd2UncmUgYWN0dWFsbHkgZ29pbmcgdG8gcmVhbGxvY2F0ZSB0aGlzIHRoaW5nICovCisgICAgICAgIHN3aXRjaCAodHJhY2tfdHlwZSkgeworICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfVklERU86CisgICAgICAgICAgICBnc3RfbWF0cm9za2FfdHJhY2tfaW5pdF92aWRlb19jb250ZXh0ICgmY29udGV4dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX0FVRElPOgorICAgICAgICAgICAgZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfYXVkaW9fY29udGV4dCAoJmNvbnRleHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9TVUJUSVRMRToKKyAgICAgICAgICAgIGdzdF9tYXRyb3NrYV90cmFja19pbml0X3N1YnRpdGxlX2NvbnRleHQgKCZjb250ZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQ09NUExFWDoKKyAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX0xPR086CisgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9CVVRUT05TOgorICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQ09OVFJPTDoKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgICAiVW5rbm93biBvciB1bnN1cHBvcnRlZCBUcmFja1R5cGUgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgICAgICB0cmFja190eXBlKTsKKyAgICAgICAgICAgIGNvbnRleHQtPnR5cGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZ19wdHJfYXJyYXlfaW5kZXggKGRlbXV4LT5jb21tb24uc3JjLCBkZW11eC0+Y29tbW9uLm51bV9zdHJlYW1zIC0gMSkKKyAgICAgICAgICAgID0gY29udGV4dDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgICAgLyogdHJhY2t0eXBlIHNwZWNpZmljIHN0dWZmIGZvciB2aWRlbyAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tWSURFTzp7CisgICAgICAgIEdzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQgKnZpZGVvY29udGV4dDsKKworICAgICAgICBERUJVR19FTEVNRU5UX1NUQVJUIChkZW11eCwgZWJtbCwgIlRyYWNrVmlkZW8iKTsKKworICAgICAgICBpZiAoIWdzdF9tYXRyb3NrYV90cmFja19pbml0X3ZpZGVvX2NvbnRleHQgKCZjb250ZXh0KSkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICJUcmFja1ZpZGVvIGVsZW1lbnQgaW4gbm9uLXZpZGVvIHRyYWNrIC0gaWdub3JpbmcgdHJhY2siKTsKKyAgICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdmlkZW9jb250ZXh0ID0gKEdzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQgKikgY29udGV4dDsKKyAgICAgICAgZ19wdHJfYXJyYXlfaW5kZXggKGRlbXV4LT5jb21tb24uc3JjLCBkZW11eC0+Y29tbW9uLm51bV9zdHJlYW1zIC0gMSkKKyAgICAgICAgICAgID0gY29udGV4dDsKKworICAgICAgICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmCisgICAgICAgICAgICBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgc3dpdGNoIChpZCkgeworICAgICAgICAgICAgICAvKiBTaG91bGQgYmUgb25lIGxldmVsIHVwIGJ1dCBzb21lIGJyb2tlbiBtdXhlcnMgd3JpdGUgaXQgaGVyZS4gKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLREVGQVVMVERVUkFUSU9OOnsKKyAgICAgICAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGlmIChudW0gPT0gMCkgeworICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJJbnZhbGlkIFRyYWNrRGVmYXVsdER1cmF0aW9uIDAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgICAgICAgIlRyYWNrRGVmYXVsdER1cmF0aW9uOiAlIiBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICAgICAgICBjb250ZXh0LT5kZWZhdWx0X2R1cmF0aW9uID0gbnVtOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiB2aWRlbyBmcmFtZXJhdGUgKi8KKyAgICAgICAgICAgICAgLyogTk9URTogVGhpcyBvbmUgaXMgaGVyZSBvbmx5IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICAgICAgICAgICAgICAgKiBVc2UgX1RSQUNLREVGQVVMRFVSQVRJT04gb25lIGxldmVsIHVwLiAqLworICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9GUkFNRVJBVEU6eworICAgICAgICAgICAgICBnZG91YmxlIG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfZmxvYXQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGlmIChudW0gPD0gMC4wKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIkludmFsaWQgVHJhY2tWaWRlb0ZQUyAlbGYiLCBudW0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJUcmFja1ZpZGVvRnJhbWVSYXRlOiAlbGYiLCBudW0pOworICAgICAgICAgICAgICBpZiAoY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbiA9PSAwKQorICAgICAgICAgICAgICAgIGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24gPQorICAgICAgICAgICAgICAgICAgICBnc3RfZ2RvdWJsZV90b19ndWludDY0ICgoZ2RvdWJsZSkgR1NUX1NFQ09ORCAqICgxLjAgLyBudW0pKTsKKyAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5kZWZhdWx0X2ZwcyA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogd2lkdGggb2YgdGhlIHNpemUgdG8gZGlzcGxheSB0aGUgdmlkZW8gYXQgKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPRElTUExBWVdJRFRIOnsKKyAgICAgICAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGlmIChudW0gPT0gMCkgeworICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJJbnZhbGlkIFRyYWNrVmlkZW9EaXNwbGF5V2lkdGggMCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICAgICAiVHJhY2tWaWRlb0Rpc3BsYXlXaWR0aDogJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5kaXNwbGF5X3dpZHRoID0gbnVtOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiBoZWlnaHQgb2YgdGhlIHNpemUgdG8gZGlzcGxheSB0aGUgdmlkZW8gYXQgKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPRElTUExBWUhFSUdIVDp7CisgICAgICAgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBpZiAobnVtID09IDApIHsKKyAgICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiSW52YWxpZCBUcmFja1ZpZGVvRGlzcGxheUhlaWdodCAwIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgICAgICJUcmFja1ZpZGVvRGlzcGxheUhlaWdodDogJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5kaXNwbGF5X2hlaWdodCA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogd2lkdGggb2YgdGhlIHZpZGVvIGluIHRoZSBmaWxlICovCisgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9WSURFT1BJWEVMV0lEVEg6eworICAgICAgICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIkludmFsaWQgVHJhY2tWaWRlb1BpeGVsV2lkdGggMCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICAgICAiVHJhY2tWaWRlb1BpeGVsV2lkdGg6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgICAgICAgIHZpZGVvY29udGV4dC0+cGl4ZWxfd2lkdGggPSBudW07CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIGhlaWdodCBvZiB0aGUgdmlkZW8gaW4gdGhlIGZpbGUgKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPUElYRUxIRUlHSFQ6eworICAgICAgICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIkludmFsaWQgVHJhY2tWaWRlb1BpeGVsSGVpZ2h0IDAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgICAgICAgIlRyYWNrVmlkZW9QaXhlbEhlaWdodDogJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5waXhlbF9oZWlnaHQgPSBudW07CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIHdoZXRoZXIgdGhlIHZpZGVvIGlzIGludGVybGFjZWQgKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPRkxBR0lOVEVSTEFDRUQ6eworICAgICAgICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSkKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5mbGFncyB8PSBHU1RfTUFUUk9TS0FfVklERU9UUkFDS19JTlRFUkxBQ0VEOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29udGV4dC0+ZmxhZ3MgJj0gfkdTVF9NQVRST1NLQV9WSURFT1RSQUNLX0lOVEVSTEFDRUQ7CisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiVHJhY2tWaWRlb0ludGVybGFjZWQ6ICVkIiwKKyAgICAgICAgICAgICAgICAgIChjb250ZXh0LT5mbGFncyAmIEdTVF9NQVRST1NLQV9WSURFT1RSQUNLX0lOVEVSTEFDRUQpID8gMSA6CisgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogYXNwZWN0IHJhdGlvIGJlaGF2aW91ciAqLworICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9BU1BFQ1RSQVRJT1RZUEU6eworICAgICAgICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSAhPSBHU1RfTUFUUk9TS0FfQVNQRUNUX1JBVElPX01PREVfRlJFRSAmJgorICAgICAgICAgICAgICAgICAgbnVtICE9IEdTVF9NQVRST1NLQV9BU1BFQ1RfUkFUSU9fTU9ERV9LRUVQICYmCisgICAgICAgICAgICAgICAgICBudW0gIT0gR1NUX01BVFJPU0tBX0FTUEVDVF9SQVRJT19NT0RFX0ZJWEVEKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgICAgICAgIlVua25vd24gVHJhY2tWaWRlb0FzcGVjdFJhdGlvVHlwZSAweCV4IiwgKGd1aW50KSBudW0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgICAgICAgIlRyYWNrVmlkZW9Bc3BlY3RSYXRpb1R5cGU6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgICAgICAgIHZpZGVvY29udGV4dC0+YXNyX21vZGUgPSBudW07CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIGNvbG91cnNwYWNlIChvbmx5IG1hdHRlcnMgZm9yIHJhdyB2aWRlbykgZm91cmNjICovCisgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9WSURFT0NPTE9VUlNQQUNFOnsKKyAgICAgICAgICAgICAgZ3VpbnQ4ICpkYXRhOworICAgICAgICAgICAgICBndWludDY0IGRhdGFsZW47CisKKyAgICAgICAgICAgICAgaWYgKChyZXQgPQorICAgICAgICAgICAgICAgICAgICAgIGdzdF9lYm1sX3JlYWRfYmluYXJ5IChlYm1sLCAmaWQsICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YWxlbikpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGlmIChkYXRhbGVuICE9IDQpIHsKKyAgICAgICAgICAgICAgICBnX2ZyZWUgKGRhdGEpOworICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFRyYWNrVmlkZW9Db2xvdXJTcGFjZSBsZW5ndGggJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgZGF0YWxlbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBtZW1jcHkgKCZ2aWRlb2NvbnRleHQtPmZvdXJjYywgZGF0YSwgNCk7CisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgICAgICAgIlRyYWNrVmlkZW9Db2xvdXJTcGFjZTogJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHZpZGVvY29udGV4dC0+Zm91cmNjKSk7CisgICAgICAgICAgICAgIGdfZnJlZSAoZGF0YSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIGNvbG9yIGluZm8gKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPQ09MT1VSOnsKKyAgICAgICAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NvbG91ciAoZGVtdXgsIGVibWwsIHZpZGVvY29udGV4dCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9WSURFT1NURVJFT01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlN0ZXJlb01vZGU6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisKKyAgICAgICAgICAgICAgc3dpdGNoIChudW0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9TVEVSRU9fTU9ERV9TQlNfUkw6CisgICAgICAgICAgICAgICAgICB2aWRlb2NvbnRleHQtPm11bHRpdmlld19mbGFncyA9CisgICAgICAgICAgICAgICAgICAgICAgR1NUX1ZJREVPX01VTFRJVklFV19GTEFHU19SSUdIVF9WSUVXX0ZJUlNUOworICAgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfU1RFUkVPX01PREVfU0JTX0xSOgorICAgICAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfbW9kZSA9CisgICAgICAgICAgICAgICAgICAgICAgR1NUX1ZJREVPX01VTFRJVklFV19NT0RFX1NJREVfQllfU0lERTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX1RCX1JMOgorICAgICAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfZmxhZ3MgPQorICAgICAgICAgICAgICAgICAgICAgIEdTVF9WSURFT19NVUxUSVZJRVdfRkxBR1NfUklHSFRfVklFV19GSVJTVDsKKyAgICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX1RCX0xSOgorICAgICAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfbW9kZSA9CisgICAgICAgICAgICAgICAgICAgICAgR1NUX1ZJREVPX01VTFRJVklFV19NT0RFX1RPUF9CT1RUT007CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9TVEVSRU9fTU9ERV9DSEVDS0VSX1JMOgorICAgICAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfZmxhZ3MgPQorICAgICAgICAgICAgICAgICAgICAgIEdTVF9WSURFT19NVUxUSVZJRVdfRkxBR1NfUklHSFRfVklFV19GSVJTVDsKKyAgICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX0NIRUNLRVJfTFI6CisgICAgICAgICAgICAgICAgICB2aWRlb2NvbnRleHQtPm11bHRpdmlld19tb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICBHU1RfVklERU9fTVVMVElWSUVXX01PREVfQ0hFQ0tFUkJPQVJEOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfU1RFUkVPX01PREVfRkJGX1JMOgorICAgICAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfZmxhZ3MgPQorICAgICAgICAgICAgICAgICAgICAgIEdTVF9WSURFT19NVUxUSVZJRVdfRkxBR1NfUklHSFRfVklFV19GSVJTVDsKKyAgICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX0ZCRl9MUjoKKyAgICAgICAgICAgICAgICAgIHZpZGVvY29udGV4dC0+bXVsdGl2aWV3X21vZGUgPQorICAgICAgICAgICAgICAgICAgICAgIEdTVF9WSURFT19NVUxUSVZJRVdfTU9ERV9GUkFNRV9CWV9GUkFNRTsKKyAgICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBJbiBmcmFtZS1ieS1mcmFtZSBtb2RlLCBsZWZ0L3JpZ2h0IGZyYW1lIGJ1ZmZlcnMgYXJlCisgICAgICAgICAgICAgICAgICAgKiBsYWNlZCB3aXRoaW4gb25lIGJsb2NrLCBhbmQgd2UnbGwgbmVlZCB0byBhcHBseSBGSVJTVF9JTl9CVU5ETEUKKyAgICAgICAgICAgICAgICAgICAqIGFjY29yZGluZ2x5LiBTZWUgaHR0cDovL3d3dy5tYXRyb3NrYS5vcmcvdGVjaG5pY2FsL3NwZWNzL2luZGV4Lmh0bWwjU3RlcmVvTW9kZSAqLworICAgICAgICAgICAgICAgICAgR1NUX0ZJWE1FX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICAgICAgICAgIkZyYW1lLWJ5LWZyYW1lIHN0ZXJlb3Njb3BpYyBtb2RlIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICAgICAiVW5rbm93biBUcmFja1ZpZGVvIHN1YmVsZW1lbnQgMHgleCAtIGlnbm9yaW5nIiwgaWQpOworICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPRElTUExBWVVOSVQ6CisgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9WSURFT1BJWEVMQ1JPUEJPVFRPTToKKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPUElYRUxDUk9QVE9QOgorICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9QSVhFTENST1BMRUZUOgorICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9QSVhFTENST1BSSUdIVDoKKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPR0FNTUFWQUxVRToKKyAgICAgICAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9za2lwIChlYm1sKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgREVCVUdfRUxFTUVOVF9TVE9QIChkZW11eCwgZWJtbCwgIlRyYWNrVmlkZW8iLCByZXQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiB0cmFja3R5cGUgc3BlY2lmaWMgc3R1ZmYgZm9yIGF1ZGlvICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0FVRElPOnsKKyAgICAgICAgR3N0TWF0cm9za2FUcmFja0F1ZGlvQ29udGV4dCAqYXVkaW9jb250ZXh0OworCisgICAgICAgIERFQlVHX0VMRU1FTlRfU1RBUlQgKGRlbXV4LCBlYm1sLCAiVHJhY2tBdWRpbyIpOworCisgICAgICAgIGlmICghZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfYXVkaW9fY29udGV4dCAoJmNvbnRleHQpKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgIlRyYWNrQXVkaW8gZWxlbWVudCBpbiBub24tYXVkaW8gdHJhY2sgLSBpZ25vcmluZyB0cmFjayIpOworICAgICAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgYXVkaW9jb250ZXh0ID0gKEdzdE1hdHJvc2thVHJhY2tBdWRpb0NvbnRleHQgKikgY29udGV4dDsKKyAgICAgICAgZ19wdHJfYXJyYXlfaW5kZXggKGRlbXV4LT5jb21tb24uc3JjLCBkZW11eC0+Y29tbW9uLm51bV9zdHJlYW1zIC0gMSkKKyAgICAgICAgICAgID0gY29udGV4dDsKKworICAgICAgICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmCisgICAgICAgICAgICBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgc3dpdGNoIChpZCkgeworICAgICAgICAgICAgICAvKiBzYW1wbGVyYXRlICovCisgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9BVURJT1NBTVBMSU5HRlJFUTp7CisgICAgICAgICAgICAgIGdkb3VibGUgbnVtOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9mbG9hdCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgICAgICBpZiAobnVtIDw9IDAuMCkgeworICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFRyYWNrQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSAlbGYiLCBudW0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJUcmFja0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3k6ICVsZiIsIG51bSk7CisgICAgICAgICAgICAgIGF1ZGlvY29udGV4dC0+c2FtcGxlcmF0ZSA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogYml0ZGVwdGggKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0FVRElPQklUREVQVEg6eworICAgICAgICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIkludmFsaWQgVHJhY2tBdWRpb0JpdERlcHRoIDAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiVHJhY2tBdWRpb0JpdERlcHRoOiAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgICAgICAgbnVtKTsKKyAgICAgICAgICAgICAgYXVkaW9jb250ZXh0LT5iaXRkZXB0aCA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogY2hhbm5lbHMgKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0FVRElPQ0hBTk5FTFM6eworICAgICAgICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIkludmFsaWQgVHJhY2tBdWRpb0NoYW5uZWxzIDAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiVHJhY2tBdWRpb0NoYW5uZWxzOiAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgICAgICAgbnVtKTsKKyAgICAgICAgICAgICAgYXVkaW9jb250ZXh0LT5jaGFubmVscyA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICAgICAiVW5rbm93biBUcmFja0F1ZGlvIHN1YmVsZW1lbnQgMHgleCAtIGlnbm9yaW5nIiwgaWQpOworICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0FVRElPQ0hBTk5FTFBPU0lUSU9OUzoKKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0FVRElPT1VUUFVUU0FNUExJTkdGUkVROgorICAgICAgICAgICAgICByZXQgPSBnc3RfZWJtbF9yZWFkX3NraXAgKGVibWwpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBERUJVR19FTEVNRU5UX1NUT1AgKGRlbXV4LCBlYm1sLCAiVHJhY2tBdWRpbyIsIHJldCk7CisKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgICAgLyogY29kZWMgaWRlbnRpZmllciAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ09ERUNJRDp7CisgICAgICAgIGdjaGFyICp0ZXh0OworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9hc2NpaSAoZWJtbCwgJmlkLCAmdGV4dCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiQ29kZWNJRDogJXMiLCBHU1RfU1RSX05VTEwgKHRleHQpKTsKKyAgICAgICAgY29udGV4dC0+Y29kZWNfaWQgPSB0ZXh0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiBjb2RlYyBwcml2YXRlIGRhdGEgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPREVDUFJJVkFURTp7CisgICAgICAgIGd1aW50OCAqZGF0YTsKKyAgICAgICAgZ3VpbnQ2NCBzaXplOworCisgICAgICAgIGlmICgocmV0ID0KKyAgICAgICAgICAgICAgICBnc3RfZWJtbF9yZWFkX2JpbmFyeSAoZWJtbCwgJmlkLCAmZGF0YSwgJnNpemUpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjb250ZXh0LT5jb2RlY19wcml2ID0gZGF0YTsKKyAgICAgICAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplID0gc2l6ZTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIkNvZGVjUHJpdmF0ZSBvZiBzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICBzaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgICAgLyogbmFtZSBvZiB0aGUgY29kZWMgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPREVDTkFNRTp7CisgICAgICAgIGdjaGFyICp0ZXh0OworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91dGY4IChlYm1sLCAmaWQsICZ0ZXh0KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJDb2RlY05hbWU6ICVzIiwgR1NUX1NUUl9OVUxMICh0ZXh0KSk7CisgICAgICAgIGNvbnRleHQtPmNvZGVjX25hbWUgPSB0ZXh0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiBjb2RlYyBkZWxheSAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ09ERUNERUxBWTp7CisgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjb250ZXh0LT5jb2RlY19kZWxheSA9IG51bTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIkNvZGVjRGVsYXk6ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKG51bSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiBjb2RlYyBkZWxheSAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfU0VFS1BSRVJPTEw6eworICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY29udGV4dC0+c2Vla19wcmVyb2xsID0gbnVtOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiU2Vla1ByZXJvbGw6ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKG51bSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiBuYW1lIG9mIHRoaXMgdHJhY2sgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLTkFNRTp7CisgICAgICAgIGdjaGFyICp0ZXh0OworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91dGY4IChlYm1sLCAmaWQsICZ0ZXh0KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY29udGV4dC0+bmFtZSA9IHRleHQ7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiVHJhY2tOYW1lOiAlcyIsIEdTVF9TVFJfTlVMTCAodGV4dCkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiBsYW5ndWFnZSAobWF0dGVycyBmb3IgYXVkaW8vc3VidGl0bGVzLCBtb3N0bHkpICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0xBTkdVQUdFOnsKKyAgICAgICAgZ2NoYXIgKnRleHQ7CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3V0ZjggKGVibWwsICZpZCwgJnRleHQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNvbnRleHQtPmxhbmd1YWdlID0gdGV4dDsKKworICAgICAgICAvKiBmcmUtY2EgPT4gZnJlICovCisgICAgICAgIGlmIChzdHJsZW4gKGNvbnRleHQtPmxhbmd1YWdlKSA+PSA0ICYmIGNvbnRleHQtPmxhbmd1YWdlWzNdID09ICctJykKKyAgICAgICAgICBjb250ZXh0LT5sYW5ndWFnZVszXSA9ICdcMCc7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJUcmFja0xhbmd1YWdlOiAlcyIsCisgICAgICAgICAgICBHU1RfU1RSX05VTEwgKGNvbnRleHQtPmxhbmd1YWdlKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAgIC8qIHdoZXRoZXIgdGhpcyBpcyBhY3R1YWxseSB1c2VkICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0ZMQUdFTkFCTEVEOnsKKyAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChudW0pCisgICAgICAgICAgY29udGV4dC0+ZmxhZ3MgfD0gR1NUX01BVFJPU0tBX1RSQUNLX0VOQUJMRUQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBjb250ZXh0LT5mbGFncyAmPSB+R1NUX01BVFJPU0tBX1RSQUNLX0VOQUJMRUQ7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJUcmFja0VuYWJsZWQ6ICVkIiwKKyAgICAgICAgICAgIChjb250ZXh0LT5mbGFncyAmIEdTVF9NQVRST1NLQV9UUkFDS19FTkFCTEVEKSA/IDEgOiAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgICAgLyogd2hldGhlciBpdCdzIHRoZSBkZWZhdWx0IGZvciB0aGlzIHRyYWNrIHR5cGUgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLRkxBR0RFRkFVTFQ6eworICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG51bSkKKyAgICAgICAgICBjb250ZXh0LT5mbGFncyB8PSBHU1RfTUFUUk9TS0FfVFJBQ0tfREVGQVVMVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGNvbnRleHQtPmZsYWdzICY9IH5HU1RfTUFUUk9TS0FfVFJBQ0tfREVGQVVMVDsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlRyYWNrRGVmYXVsdDogJWQiLAorICAgICAgICAgICAgKGNvbnRleHQtPmZsYWdzICYgR1NUX01BVFJPU0tBX1RSQUNLX0RFRkFVTFQpID8gMSA6IDApOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiB3aGV0aGVyIHRoZSB0cmFjayBtdXN0IGJlIHVzZWQgZHVyaW5nIHBsYXliYWNrICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0ZMQUdGT1JDRUQ6eworICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG51bSkKKyAgICAgICAgICBjb250ZXh0LT5mbGFncyB8PSBHU1RfTUFUUk9TS0FfVFJBQ0tfRk9SQ0VEOworICAgICAgICBlbHNlCisgICAgICAgICAgY29udGV4dC0+ZmxhZ3MgJj0gfkdTVF9NQVRST1NLQV9UUkFDS19GT1JDRUQ7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJUcmFja0ZvcmNlZDogJWQiLAorICAgICAgICAgICAgKGNvbnRleHQtPmZsYWdzICYgR1NUX01BVFJPU0tBX1RSQUNLX0ZPUkNFRCkgPyAxIDogMCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAgIC8qIGxhY2luZyAobGlrZSBNUEVHLCB3aGVyZSBibG9ja3MgZG9uJ3QgZW5kL3N0YXJ0IG9uIGZyYW1lCisgICAgICAgICAqIGJvdW5kYXJpZXMpICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0ZMQUdMQUNJTkc6eworICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG51bSkKKyAgICAgICAgICBjb250ZXh0LT5mbGFncyB8PSBHU1RfTUFUUk9TS0FfVFJBQ0tfTEFDSU5HOworICAgICAgICBlbHNlCisgICAgICAgICAgY29udGV4dC0+ZmxhZ3MgJj0gfkdTVF9NQVRST1NLQV9UUkFDS19MQUNJTkc7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJUcmFja0xhY2luZzogJWQiLAorICAgICAgICAgICAgKGNvbnRleHQtPmZsYWdzICYgR1NUX01BVFJPU0tBX1RSQUNLX0xBQ0lORykgPyAxIDogMCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAgIC8qIGRlZmF1bHQgbGVuZ3RoIChpbiB0aW1lKSBvZiBvbmUgZGF0YSBibG9jayBpbiB0aGlzIHRyYWNrICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0RFRkFVTFREVVJBVElPTjp7CisgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGlmIChudW0gPT0gMCkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJJbnZhbGlkIFRyYWNrRGVmYXVsdER1cmF0aW9uIDAiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiVHJhY2tEZWZhdWx0RHVyYXRpb246ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICBudW0pOworICAgICAgICBjb250ZXh0LT5kZWZhdWx0X2R1cmF0aW9uID0gbnVtOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ09OVEVOVEVOQ09ESU5HUzp7CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9yZWFkX3RyYWNrX2VuY29kaW5ncyAoJmRlbXV4LT5jb21tb24sCisgICAgICAgICAgICBlYm1sLCBjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLVElNRUNPREVTQ0FMRTp7CisgICAgICAgIGdkb3VibGUgbnVtOworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9mbG9hdCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG51bSA8PSAwLjApIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiSW52YWxpZCBUcmFja1RpbWVDb2RlU2NhbGUgJWxmIiwgbnVtKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiVHJhY2tUaW1lQ29kZVNjYWxlOiAlbGYiLCBudW0pOworICAgICAgICBjb250ZXh0LT50aW1lY29kZXNjYWxlID0gbnVtOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJVbmtub3duIFRyYWNrRW50cnkgc3ViZWxlbWVudCAweCV4IC0gaWdub3JpbmciLCBpZCk7CisgICAgICAgIC8qIHBhc3MtdGhyb3VnaCAqLworCisgICAgICAgIC8qIHdlIGlnbm9yZSB0aGVzZSBiZWNhdXNlIHRoZXkncmUgbm90aGluZyB1c2VmdWwgKGkuZS4gY3JhcCkKKyAgICAgICAgICogb3Igc2ltcGx5IG5vdCBpbXBsZW1lbnRlZCB5ZXQuICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS01JTkNBQ0hFOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tNQVhDQUNIRToKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX01BWEJMT0NLQURESVRJT05JRDoKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLQVRUQUNITUVOVExJTks6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS09WRVJMQVk6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS1RSQU5TTEFURToKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLT0ZGU0VUOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ09ERUNTRVRUSU5HUzoKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPREVDSU5GT1VSTDoKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPREVDRE9XTkxPQURVUkw6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DT0RFQ0RFQ09ERUFMTDoKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9za2lwIChlYm1sKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgREVCVUdfRUxFTUVOVF9TVE9QIChkZW11eCwgZWJtbCwgIlRyYWNrRW50cnkiLCByZXQpOworCisgIC8qIERlY29kZSBjb2RlYyBwcml2YXRlIGRhdGEgaWYgbmVjZXNzYXJ5ICovCisgIGlmIChjb250ZXh0LT5lbmNvZGluZ3MgJiYgY29udGV4dC0+ZW5jb2RpbmdzLT5sZW4gPiAwICYmIGNvbnRleHQtPmNvZGVjX3ByaXYKKyAgICAgICYmIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSA+IDApIHsKKyAgICBpZiAoIWdzdF9tYXRyb3NrYV9kZWNvZGVfZGF0YSAoY29udGV4dC0+ZW5jb2RpbmdzLAorICAgICAgICAgICAgJmNvbnRleHQtPmNvZGVjX3ByaXYsICZjb250ZXh0LT5jb2RlY19wcml2X3NpemUsCisgICAgICAgICAgICBHU1RfTUFUUk9TS0FfVFJBQ0tfRU5DT0RJTkdfU0NPUEVfQ09ERUNfREFUQSwgVFJVRSkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJEZWNvZGluZyBjb2RlYyBwcml2YXRlIGRhdGEgZmFpbGVkIik7CisgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICB9CisgIH0KKworICBpZiAoY29udGV4dC0+dHlwZSA9PSAwIHx8IGNvbnRleHQtPmNvZGVjX2lkID09IE5VTEwgfHwgKHJldCAhPSBHU1RfRkxPV19PSworICAgICAgICAgICYmIHJldCAhPSBHU1RfRkxPV19FT1MpKSB7CisgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSyB8fCByZXQgPT0gR1NUX0ZMT1dfRU9TKQorICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlYm1sLCAiVW5rbm93biBzdHJlYW0vY29kZWMgaW4gdHJhY2sgZW50cnkgaGVhZGVyIik7CisKKyAgICBkZW11eC0+Y29tbW9uLm51bV9zdHJlYW1zLS07CisgICAgZ19wdHJfYXJyYXlfcmVtb3ZlX2luZGV4IChkZW11eC0+Y29tbW9uLnNyYywgZGVtdXgtPmNvbW1vbi5udW1fc3RyZWFtcyk7CisgICAgZ19hc3NlcnQgKGRlbXV4LT5jb21tb24uc3JjLT5sZW4gPT0gZGVtdXgtPmNvbW1vbi5udW1fc3RyZWFtcyk7CisgICAgZ3N0X21hdHJvc2thX3RyYWNrX2ZyZWUgKGNvbnRleHQpOworCisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIC8qIGNoZWNrIGZvciBhIGNhY2hlZCB0cmFjayB0YWdsaXN0ICAqLworICBjYWNoZWRfdGFnbGlzdCA9CisgICAgICAoR3N0VGFnTGlzdCAqKSBnX2hhc2hfdGFibGVfbG9va3VwIChkZW11eC0+Y29tbW9uLmNhY2hlZF90cmFja190YWdsaXN0cywKKyAgICAgIEdVSU5UX1RPX1BPSU5URVIgKGNvbnRleHQtPnVpZCkpOworICBpZiAoY2FjaGVkX3RhZ2xpc3QpCisgICAgZ3N0X3RhZ19saXN0X2luc2VydCAoY29udGV4dC0+dGFncywgY2FjaGVkX3RhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5EKTsKKworICAvKiBub3cgY3JlYXRlIHRoZSBHU3RyZWFtZXIgY29ubmVjdGl2aXR5ICovCisgIHN3aXRjaCAoY29udGV4dC0+dHlwZSkgeworICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfVklERU86eworICAgICAgR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCAqdmlkZW9jb250ZXh0ID0KKyAgICAgICAgICAoR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCAqKSBjb250ZXh0OworCisgICAgICBwYWRuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgidmlkZW9fJXUiLCBkZW11eC0+bnVtX3Zfc3RyZWFtcysrKTsKKyAgICAgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJ2aWRlb18ldSIpOworICAgICAgY2FwcyA9IGdzdF9tYXRyb3NrYV9kZW11eF92aWRlb19jYXBzICh2aWRlb2NvbnRleHQsCisgICAgICAgICAgY29udGV4dC0+Y29kZWNfaWQsIGNvbnRleHQtPmNvZGVjX3ByaXYsCisgICAgICAgICAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplLCAmY29kZWMsICZyaWZmX2ZvdXJjYyk7CisKKyAgICAgIGlmIChjb2RlYykgeworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkIChjb250ZXh0LT50YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgICBHU1RfVEFHX1ZJREVPX0NPREVDLCBjb2RlYywgTlVMTCk7CisgICAgICAgIGNvbnRleHQtPnRhZ3NfY2hhbmdlZCA9IFRSVUU7CisgICAgICAgIGdfZnJlZSAoY29kZWMpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9BVURJTzp7CisgICAgICBHc3RNYXRyb3NrYVRyYWNrQXVkaW9Db250ZXh0ICphdWRpb2NvbnRleHQgPQorICAgICAgICAgIChHc3RNYXRyb3NrYVRyYWNrQXVkaW9Db250ZXh0ICopIGNvbnRleHQ7CisKKyAgICAgIHBhZG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJhdWRpb18ldSIsIGRlbXV4LT5udW1fYV9zdHJlYW1zKyspOworICAgICAgdGVtcGwgPSBnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywgImF1ZGlvXyV1Iik7CisgICAgICBjYXBzID0gZ3N0X21hdHJvc2thX2RlbXV4X2F1ZGlvX2NhcHMgKGF1ZGlvY29udGV4dCwKKyAgICAgICAgICBjb250ZXh0LT5jb2RlY19pZCwgY29udGV4dC0+Y29kZWNfcHJpdiwgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplLAorICAgICAgICAgICZjb2RlYywgJnJpZmZfYXVkaW9fZm10KTsKKworICAgICAgaWYgKGNvZGVjKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKGNvbnRleHQtPnRhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgICAgICAgIEdTVF9UQUdfQVVESU9fQ09ERUMsIGNvZGVjLCBOVUxMKTsKKyAgICAgICAgY29udGV4dC0+dGFnc19jaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgZ19mcmVlIChjb2RlYyk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFOnsKKyAgICAgIEdzdE1hdHJvc2thVHJhY2tTdWJ0aXRsZUNvbnRleHQgKnN1YnRpdGxlY29udGV4dCA9CisgICAgICAgICAgKEdzdE1hdHJvc2thVHJhY2tTdWJ0aXRsZUNvbnRleHQgKikgY29udGV4dDsKKworICAgICAgcGFkbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInN1YnRpdGxlXyV1IiwgZGVtdXgtPm51bV90X3N0cmVhbXMrKyk7CisgICAgICB0ZW1wbCA9IGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLCAic3VidGl0bGVfJXUiKTsKKyAgICAgIGNhcHMgPSBnc3RfbWF0cm9za2FfZGVtdXhfc3VidGl0bGVfY2FwcyAoc3VidGl0bGVjb250ZXh0LAorICAgICAgICAgIGNvbnRleHQtPmNvZGVjX2lkLCBjb250ZXh0LT5jb2RlY19wcml2LCBjb250ZXh0LT5jb2RlY19wcml2X3NpemUpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9DT01QTEVYOgorICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfTE9HTzoKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX0JVVFRPTlM6CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9DT05UUk9MOgorICAgIGRlZmF1bHQ6CisgICAgICAvKiB3ZSBzaG91bGQgYWxyZWFkeSBoYXZlIHF1aXQgYnkgbm93ICovCisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgfQorCisgIGlmICgoY29udGV4dC0+bGFuZ3VhZ2UgPT0gTlVMTCB8fCAqY29udGV4dC0+bGFuZ3VhZ2UgPT0gJ1wwJykgJiYKKyAgICAgIChjb250ZXh0LT50eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX0FVRElPIHx8CisgICAgICAgICAgY29udGV4dC0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9TVUJUSVRMRSkpIHsKKyAgICBHU1RfTE9HICgic3RyZWFtICVkOiBsYW5ndWFnZT1lbmcgKGFzc3VtaW5nIGRlZmF1bHQpIiwgY29udGV4dC0+aW5kZXgpOworICAgIGNvbnRleHQtPmxhbmd1YWdlID0gZ19zdHJkdXAgKCJlbmciKTsKKyAgfQorCisgIGlmIChjb250ZXh0LT5sYW5ndWFnZSkgeworICAgIGNvbnN0IGdjaGFyICpsYW5nOworCisgICAgLyogTWF0cm9za2EgY29udGFpbnMgSVNPIDYzOS0yQiBjb2Rlcywgd2Ugd2FudCBJU08gNjM5LTEgKi8KKyAgICBsYW5nID0gZ3N0X3RhZ19nZXRfbGFuZ3VhZ2VfY29kZSAoY29udGV4dC0+bGFuZ3VhZ2UpOworICAgIGdzdF90YWdfbGlzdF9hZGQgKGNvbnRleHQtPnRhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgICAgR1NUX1RBR19MQU5HVUFHRV9DT0RFLCAobGFuZykgPyBsYW5nIDogY29udGV4dC0+bGFuZ3VhZ2UsIE5VTEwpOworICAgIGNvbnRleHQtPnRhZ3NfY2hhbmdlZCA9IFRSVUU7CisgIH0KKworICBpZiAoY2FwcyA9PSBOVUxMKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgImNvdWxkIG5vdCBkZXRlcm1pbmUgY2FwcyBmb3Igc3RyZWFtIHdpdGggIgorICAgICAgICAiY29kZWNfaWQ9JyVzJyIsIGNvbnRleHQtPmNvZGVjX2lkKTsKKyAgICBzd2l0Y2ggKGNvbnRleHQtPnR5cGUpIHsKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfVklERU86CisgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgidmlkZW8veC11bmtub3duIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9BVURJTzoKKyAgICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby94LXVua25vd24iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFOgorICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtc3VidGl0bGUtdW5rbm93biIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQ09NUExFWDoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXBwbGljYXRpb24veC1tYXRyb3NrYS11bmtub3duIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAiY29kZWMtaWQiLCBHX1RZUEVfU1RSSU5HLCBjb250ZXh0LT5jb2RlY19pZCwKKyAgICAgICAgTlVMTCk7CisKKyAgICAvKiBhZGQgYW55IHVucmVjb2duaXNlZCByaWZmIGZvdXJjYyAvIGF1ZGlvIGZvcm1hdCwgYnV0IGFmdGVyIGNvZGVjLWlkICovCisgICAgaWYgKGNvbnRleHQtPnR5cGUgPT0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQVVESU8gJiYgcmlmZl9hdWRpb19mbXQgIT0gMCkKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJmb3JtYXQiLCBHX1RZUEVfSU5ULCByaWZmX2F1ZGlvX2ZtdCwgTlVMTCk7CisgICAgZWxzZSBpZiAoY29udGV4dC0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9WSURFTyAmJiByaWZmX2ZvdXJjYyAhPSAwKSB7CisgICAgICBnY2hhciAqZnN0ciA9IGdfc3RyZHVwX3ByaW50ZiAoIiUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAocmlmZl9mb3VyY2MpKTsKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJmb3VyY2MiLCBHX1RZUEVfU1RSSU5HLCBmc3RyLCBOVUxMKTsKKyAgICAgIGdfZnJlZSAoZnN0cik7CisgICAgfQorICB9IGVsc2UgaWYgKGNvbnRleHQtPnN0cmVhbV9oZWFkZXJzICE9IE5VTEwpIHsKKyAgICBnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbV9oZWFkZXJzX3RvX2NhcHMgKGRlbXV4LAorICAgICAgICBjb250ZXh0LT5zdHJlYW1faGVhZGVycywgY2Fwcyk7CisgIH0KKworICAvKiB0aGUgcGFkIGluIGhlcmUgKi8KKyAgY29udGV4dC0+cGFkID0gZ3N0X3BhZF9uZXdfZnJvbV90ZW1wbGF0ZSAodGVtcGwsIHBhZG5hbWUpOworICBjb250ZXh0LT5jYXBzID0gY2FwczsKKworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoY29udGV4dC0+cGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc3JjX2V2ZW50KSk7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChjb250ZXh0LT5wYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpKTsKKworICBHU1RfSU5GT19PQkpFQ1QgKGRlbXV4LCAiQWRkaW5nIHBhZCAnJXMnIHdpdGggY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIHBhZG5hbWUsIGNhcHMpOworCisgIGdzdF9wYWRfc2V0X2VsZW1lbnRfcHJpdmF0ZSAoY29udGV4dC0+cGFkLCBjb250ZXh0KTsKKworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChjb250ZXh0LT5wYWQpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKGNvbnRleHQtPnBhZCwgVFJVRSk7CisKKyAgc3RyZWFtX2lkID0KKyAgICAgIGdzdF9wYWRfY3JlYXRlX3N0cmVhbV9pZF9wcmludGYgKGNvbnRleHQtPnBhZCwgR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLAorICAgICAgIiUwMyIgR19HVUlOVDY0X0ZPUk1BVCAiOiUwMyIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgIGNvbnRleHQtPm51bSwgY29udGV4dC0+dWlkKTsKKyAgc3RyZWFtX3N0YXJ0ID0KKyAgICAgIGdzdF9wYWRfZ2V0X3N0aWNreV9ldmVudCAoZGVtdXgtPmNvbW1vbi5zaW5rcGFkLCBHU1RfRVZFTlRfU1RSRUFNX1NUQVJULAorICAgICAgMCk7CisgIGlmIChzdHJlYW1fc3RhcnQpIHsKKyAgICBpZiAoZ3N0X2V2ZW50X3BhcnNlX2dyb3VwX2lkIChzdHJlYW1fc3RhcnQsICZkZW11eC0+Z3JvdXBfaWQpKQorICAgICAgZGVtdXgtPmhhdmVfZ3JvdXBfaWQgPSBUUlVFOworICAgIGVsc2UKKyAgICAgIGRlbXV4LT5oYXZlX2dyb3VwX2lkID0gRkFMU0U7CisgICAgZ3N0X2V2ZW50X3VucmVmIChzdHJlYW1fc3RhcnQpOworICB9IGVsc2UgaWYgKCFkZW11eC0+aGF2ZV9ncm91cF9pZCkgeworICAgIGRlbXV4LT5oYXZlX2dyb3VwX2lkID0gVFJVRTsKKyAgICBkZW11eC0+Z3JvdXBfaWQgPSBnc3RfdXRpbF9ncm91cF9pZF9uZXh0ICgpOworICB9CisKKyAgc3RyZWFtX3N0YXJ0ID0gZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKHN0cmVhbV9pZCk7CisgIGdfZnJlZSAoc3RyZWFtX2lkKTsKKyAgaWYgKGRlbXV4LT5oYXZlX2dyb3VwX2lkKQorICAgIGdzdF9ldmVudF9zZXRfZ3JvdXBfaWQgKHN0cmVhbV9zdGFydCwgZGVtdXgtPmdyb3VwX2lkKTsKKyAgc3RyZWFtX2ZsYWdzID0gR1NUX1NUUkVBTV9GTEFHX05PTkU7CisgIGlmIChjb250ZXh0LT50eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFKQorICAgIHN0cmVhbV9mbGFncyB8PSBHU1RfU1RSRUFNX0ZMQUdfU1BBUlNFOworICBpZiAoY29udGV4dC0+ZmxhZ3MgJiBHU1RfTUFUUk9TS0FfVFJBQ0tfREVGQVVMVCkKKyAgICBzdHJlYW1fZmxhZ3MgfD0gR1NUX1NUUkVBTV9GTEFHX1NFTEVDVDsKKyAgZ3N0X2V2ZW50X3NldF9zdHJlYW1fZmxhZ3MgKHN0cmVhbV9zdGFydCwgc3RyZWFtX2ZsYWdzKTsKKyAgZ3N0X3BhZF9wdXNoX2V2ZW50IChjb250ZXh0LT5wYWQsIHN0cmVhbV9zdGFydCk7CisgIGdzdF9wYWRfc2V0X2NhcHMgKGNvbnRleHQtPnBhZCwgY29udGV4dC0+Y2Fwcyk7CisKKworICBpZiAoZGVtdXgtPmNvbW1vbi5nbG9iYWxfdGFncykgeworICAgIEdzdEV2ZW50ICp0YWdfZXZlbnQ7CisKKyAgICBnc3RfdGFnX2xpc3RfYWRkIChkZW11eC0+Y29tbW9uLmdsb2JhbF90YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgIEdTVF9UQUdfQ09OVEFJTkVSX0ZPUk1BVCwgIk1hdHJvc2thIiwgTlVMTCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoY29udGV4dC0+cGFkLCAiU2VuZGluZyBnbG9iYWxfdGFncyAlcDogJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgIGRlbXV4LT5jb21tb24uZ2xvYmFsX3RhZ3MsIGRlbXV4LT5jb21tb24uZ2xvYmFsX3RhZ3MpOworCisgICAgdGFnX2V2ZW50ID0KKyAgICAgICAgZ3N0X2V2ZW50X25ld190YWcgKGdzdF90YWdfbGlzdF9jb3B5IChkZW11eC0+Y29tbW9uLmdsb2JhbF90YWdzKSk7CisKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKGNvbnRleHQtPnBhZCwgdGFnX2V2ZW50KTsKKyAgfQorCisgIGlmIChHX1VOTElLRUxZIChjb250ZXh0LT50YWdzX2NoYW5nZWQpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoY29udGV4dC0+cGFkLCAiU2VuZGluZyB0YWdzICVwOiAlIgorICAgICAgICBHU1RfUFRSX0ZPUk1BVCwgY29udGV4dC0+dGFncywgY29udGV4dC0+dGFncyk7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChjb250ZXh0LT5wYWQsCisgICAgICAgIGdzdF9ldmVudF9uZXdfdGFnIChnc3RfdGFnX2xpc3RfY29weSAoY29udGV4dC0+dGFncykpKTsKKyAgICBjb250ZXh0LT50YWdzX2NoYW5nZWQgPSBGQUxTRTsKKyAgfQorCisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChkZW11eCksIGNvbnRleHQtPnBhZCk7CisgIGdzdF9mbG93X2NvbWJpbmVyX2FkZF9wYWQgKGRlbXV4LT5mbG93Y29tYmluZXIsIGNvbnRleHQtPnBhZCk7CisKKyAgZ19mcmVlIChwYWRuYW1lKTsKKworICAvKiB0YWRhYWghICovCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX2RlbXV4X3F1ZXJ5IChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKyAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKmNvbnRleHQgPSBOVUxMOworCisgIGlmIChwYWQpIHsKKyAgICBjb250ZXh0ID0gZ3N0X3BhZF9nZXRfZWxlbWVudF9wcml2YXRlIChwYWQpOworICB9CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfUE9TSVRJT046CisgICAgeworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3Bvc2l0aW9uIChxdWVyeSwgJmZvcm1hdCwgTlVMTCk7CisKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBpZiAoZm9ybWF0ID09IEdTVF9GT1JNQVRfVElNRSkgeworICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgICAgICAgaWYgKGNvbnRleHQpCisgICAgICAgICAgZ3N0X3F1ZXJ5X3NldF9wb3NpdGlvbiAocXVlcnksIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgICAgICAgTUFYIChjb250ZXh0LT5wb3MsIGRlbXV4LT5zdHJlYW1fc3RhcnRfdGltZSkgLQorICAgICAgICAgICAgICBkZW11eC0+c3RyZWFtX3N0YXJ0X3RpbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgZ3N0X3F1ZXJ5X3NldF9wb3NpdGlvbiAocXVlcnksIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgICAgICAgTUFYIChkZW11eC0+Y29tbW9uLnNlZ21lbnQucG9zaXRpb24sIGRlbXV4LT5zdHJlYW1fc3RhcnRfdGltZSkgLQorICAgICAgICAgICAgICBkZW11eC0+c3RyZWFtX3N0YXJ0X3RpbWUpOworICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gR1NUX0ZPUk1BVF9ERUZBVUxUICYmIGNvbnRleHQKKyAgICAgICAgICAmJiBjb250ZXh0LT5kZWZhdWx0X2R1cmF0aW9uKSB7CisgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICAgICAgICBnc3RfcXVlcnlfc2V0X3Bvc2l0aW9uIChxdWVyeSwgR1NUX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgY29udGV4dC0+cG9zIC8gY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbik7CisgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICJvbmx5IHBvc2l0aW9uIHF1ZXJ5IGluIFRJTUUgYW5kIERFRkFVTFQgZm9ybWF0IGlzIHN1cHBvcnRlZCIpOworICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX0RVUkFUSU9OOgorICAgIHsKKyAgICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9kdXJhdGlvbiAocXVlcnksICZmb3JtYXQsIE5VTEwpOworCisgICAgICByZXMgPSBUUlVFOworICAgICAgaWYgKGZvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICAgICAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgICAgICAgIGdzdF9xdWVyeV9zZXRfZHVyYXRpb24gKHF1ZXJ5LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgICBkZW11eC0+Y29tbW9uLnNlZ21lbnQuZHVyYXRpb24pOworICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gR1NUX0ZPUk1BVF9ERUZBVUxUICYmIGNvbnRleHQKKyAgICAgICAgICAmJiBjb250ZXh0LT5kZWZhdWx0X2R1cmF0aW9uKSB7CisgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICAgICAgICBnc3RfcXVlcnlfc2V0X2R1cmF0aW9uIChxdWVyeSwgR1NUX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgZGVtdXgtPmNvbW1vbi5zZWdtZW50LmR1cmF0aW9uIC8gY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbik7CisgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICJvbmx5IGR1cmF0aW9uIHF1ZXJ5IGluIFRJTUUgYW5kIERFRkFVTFQgZm9ybWF0IGlzIHN1cHBvcnRlZCIpOworICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR1NUX1FVRVJZX1NFRUtJTkc6CisgICAgeworICAgICAgR3N0Rm9ybWF0IGZtdDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3NlZWtpbmcgKHF1ZXJ5LCAmZm10LCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICAgICAgaWYgKGZtdCA9PSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICAgICAgZ2Jvb2xlYW4gc2Vla2FibGU7CisKKyAgICAgICAgaWYgKGRlbXV4LT5zdHJlYW1pbmcpIHsKKyAgICAgICAgICAvKiBhc3N1bWluZyB3ZSdsbCBiZSBhYmxlIHRvIGdldCBhbiBpbmRleCAuLi4gKi8KKyAgICAgICAgICBzZWVrYWJsZSA9IGRlbXV4LT5zZWVrYWJsZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZWVrYWJsZSA9IFRSVUU7CisgICAgICAgIH0KKworICAgICAgICBnc3RfcXVlcnlfc2V0X3NlZWtpbmcgKHF1ZXJ5LCBHU1RfRk9STUFUX1RJTUUsIHNlZWthYmxlLAorICAgICAgICAgICAgMCwgZGVtdXgtPmNvbW1vbi5zZWdtZW50LmR1cmF0aW9uKTsKKyAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfU0VHTUVOVDoKKyAgICB7CisgICAgICBHc3RGb3JtYXQgZm9ybWF0OworICAgICAgZ2ludDY0IHN0YXJ0LCBzdG9wOworCisgICAgICBmb3JtYXQgPSBkZW11eC0+Y29tbW9uLnNlZ21lbnQuZm9ybWF0OworCisgICAgICBzdGFydCA9CisgICAgICAgICAgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZkZW11eC0+Y29tbW9uLnNlZ21lbnQsIGZvcm1hdCwKKyAgICAgICAgICBkZW11eC0+Y29tbW9uLnNlZ21lbnQuc3RhcnQpOworICAgICAgaWYgKChzdG9wID0gZGVtdXgtPmNvbW1vbi5zZWdtZW50LnN0b3ApID09IC0xKQorICAgICAgICBzdG9wID0gZGVtdXgtPmNvbW1vbi5zZWdtZW50LmR1cmF0aW9uOworICAgICAgZWxzZQorICAgICAgICBzdG9wID0KKyAgICAgICAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmZGVtdXgtPmNvbW1vbi5zZWdtZW50LCBmb3JtYXQsIHN0b3ApOworCisgICAgICBnc3RfcXVlcnlfc2V0X3NlZ21lbnQgKHF1ZXJ5LCBkZW11eC0+Y29tbW9uLnNlZ21lbnQucmF0ZSwgZm9ybWF0LCBzdGFydCwKKyAgICAgICAgICBzdG9wKTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChwYWQpCisgICAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCAoR3N0T2JqZWN0ICopIGRlbXV4LCBxdWVyeSk7CisgICAgICBlbHNlCisgICAgICAgIHJlcyA9CisgICAgICAgICAgICBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+cXVlcnkgKEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSwKKyAgICAgICAgICAgIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbWF0cm9za2FfZGVtdXhfZWxlbWVudF9xdWVyeSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIHJldHVybiBnc3RfbWF0cm9za2FfZGVtdXhfcXVlcnkgKEdTVF9NQVRST1NLQV9ERU1VWCAoZWxlbWVudCksIE5VTEwsIHF1ZXJ5KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0TWF0cm9za2FEZW11eCAqZGVtdXggPSBHU1RfTUFUUk9TS0FfREVNVVggKHBhcmVudCk7CisKKyAgcmV0dXJuIGdzdF9tYXRyb3NrYV9kZW11eF9xdWVyeSAoZGVtdXgsIHBhZCwgcXVlcnkpOworfQorCisvKiByZXR1cm5zIEZBTFNFIGlmIHRoZXJlIGFyZSBubyBwYWRzIHRvIGRlbGl2ZXIgZXZlbnQgdG8sCisgKiBvdGhlcndpc2UgVFJVRSAod2hhdGV2ZXIgdGhlIG91dGNvbWUgb2YgZXZlbnQgc2VuZGluZyksCisgKiB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIHBhc3NlZCBldmVudCEgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX2RlbXV4X3NlbmRfZXZlbnQgKEdzdE1hdHJvc2thRGVtdXggKiBkZW11eCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisgIGdpbnQgaTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZXZlbnQgIT0gTlVMTCwgRkFMU0UpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiU2VuZGluZyBldmVudCBvZiB0eXBlICVzIHRvIGFsbCBzb3VyY2UgcGFkcyIsCisgICAgICBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIGdfYXNzZXJ0IChkZW11eC0+Y29tbW9uLnNyYy0+bGVuID09IGRlbXV4LT5jb21tb24ubnVtX3N0cmVhbXMpOworICBmb3IgKGkgPSAwOyBpIDwgZGVtdXgtPmNvbW1vbi5zcmMtPmxlbjsgaSsrKSB7CisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKnN0cmVhbTsKKworICAgIHN0cmVhbSA9IGdfcHRyX2FycmF5X2luZGV4IChkZW11eC0+Y29tbW9uLnNyYywgaSk7CisgICAgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3RyZWFtLT5wYWQsIGV2ZW50KTsKKyAgICByZXQgPSBUUlVFOworICB9CisKKyAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfZGVtdXhfc2VuZF90YWdzIChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgpCit7CisgIGdpbnQgaTsKKworICBpZiAoR19VTkxJS0VMWSAoZGVtdXgtPmNvbW1vbi5nbG9iYWxfdGFnc19jaGFuZ2VkKSkgeworICAgIEdzdEV2ZW50ICp0YWdfZXZlbnQ7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAoZGVtdXgtPmNvbW1vbi5nbG9iYWxfdGFncywgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICBHU1RfVEFHX0NPTlRBSU5FUl9GT1JNQVQsICJNYXRyb3NrYSIsIE5VTEwpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiU2VuZGluZyBnbG9iYWxfdGFncyAlcCA6ICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICBkZW11eC0+Y29tbW9uLmdsb2JhbF90YWdzLCBkZW11eC0+Y29tbW9uLmdsb2JhbF90YWdzKTsKKworICAgIHRhZ19ldmVudCA9CisgICAgICAgIGdzdF9ldmVudF9uZXdfdGFnIChnc3RfdGFnX2xpc3RfY29weSAoZGVtdXgtPmNvbW1vbi5nbG9iYWxfdGFncykpOworCisgICAgZm9yIChpID0gMDsgaSA8IGRlbXV4LT5jb21tb24uc3JjLT5sZW47IGkrKykgeworICAgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKnN0cmVhbTsKKworICAgICAgc3RyZWFtID0gZ19wdHJfYXJyYXlfaW5kZXggKGRlbXV4LT5jb21tb24uc3JjLCBpKTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3RyZWFtLT5wYWQsIGdzdF9ldmVudF9yZWYgKHRhZ19ldmVudCkpOworICAgIH0KKworICAgIGdzdF9ldmVudF91bnJlZiAodGFnX2V2ZW50KTsKKyAgICBkZW11eC0+Y29tbW9uLmdsb2JhbF90YWdzX2NoYW5nZWQgPSBGQUxTRTsKKyAgfQorCisgIGdfYXNzZXJ0IChkZW11eC0+Y29tbW9uLnNyYy0+bGVuID09IGRlbXV4LT5jb21tb24ubnVtX3N0cmVhbXMpOworICBmb3IgKGkgPSAwOyBpIDwgZGVtdXgtPmNvbW1vbi5zcmMtPmxlbjsgaSsrKSB7CisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKnN0cmVhbTsKKworICAgIHN0cmVhbSA9IGdfcHRyX2FycmF5X2luZGV4IChkZW11eC0+Y29tbW9uLnNyYywgaSk7CisKKyAgICBpZiAoR19VTkxJS0VMWSAoc3RyZWFtLT50YWdzX2NoYW5nZWQpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlNlbmRpbmcgdGFncyAlcCBmb3IgcGFkICVzOiVzIDogJSIKKyAgICAgICAgICBHU1RfUFRSX0ZPUk1BVCwgc3RyZWFtLT50YWdzLAorICAgICAgICAgIEdTVF9ERUJVR19QQURfTkFNRSAoc3RyZWFtLT5wYWQpLCBzdHJlYW0tPnRhZ3MpOworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzdHJlYW0tPnBhZCwKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X3RhZyAoZ3N0X3RhZ19saXN0X2NvcHkgKHN0cmVhbS0+dGFncykpKTsKKyAgICAgIHN0cmVhbS0+dGFnc19jaGFuZ2VkID0gRkFMU0U7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX2RlbXV4X2VsZW1lbnRfc2VuZF9ldmVudCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdE1hdHJvc2thRGVtdXggKmRlbXV4ID0gR1NUX01BVFJPU0tBX0RFTVVYIChlbGVtZW50KTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChldmVudCAhPSBOVUxMLCBGQUxTRSk7CisKKyAgaWYgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX1NFRUspIHsKKyAgICAvKiBubyBzZWVraW5nIHVudGlsIHdlIGFyZSAoc2FmZWx5KSByZWFkeSAqLworICAgIGlmIChkZW11eC0+Y29tbW9uLnN0YXRlICE9IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX0RBVEEpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAibm90IHJlYWR5IGZvciBzZWVraW5nIHlldCIpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJlcyA9IGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc2Vla19ldmVudCAoZGVtdXgsIE5VTEwsIGV2ZW50KTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiVW5oYW5kbGVkIGV2ZW50IG9mIHR5cGUgJXMiLAorICAgICAgICBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworICAgIHJlcyA9IEZBTFNFOworICB9CisgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9kZW11eF9tb3ZlX3RvX2VudHJ5IChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgsCisgICAgR3N0TWF0cm9za2FJbmRleCAqIGVudHJ5LCBnYm9vbGVhbiByZXNldCwgZ2Jvb2xlYW4gdXBkYXRlKQoreworICBnaW50IGk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisKKyAgaWYgKHVwZGF0ZSkgeworICAgIC8qIHNlZWsgKHJlbGF0aXZlIHRvIG1hdHJvc2thIHNlZ21lbnQpICovCisgICAgLyogcG9zaXRpb24gbWlnaHQgYmUgaW52YWxpZDsgd2lsbCBlcnJvciB3aGVuIHN0cmVhbWluZyByZXN1bWVzIC4uLiAqLworICAgIGRlbXV4LT5jb21tb24ub2Zmc2V0ID0gZW50cnktPnBvcyArIGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X3N0YXJ0OworICAgIGRlbXV4LT5uZXh0X2NsdXN0ZXJfb2Zmc2V0ID0gMDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAiU2Vla2VkIHRvIG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFUICIsIGJsb2NrICVkLCAiICJ0aW1lICUiCisgICAgICAgIEdTVF9USU1FX0ZPUk1BVCwgZW50cnktPnBvcyArIGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X3N0YXJ0LAorICAgICAgICBlbnRyeS0+YmxvY2ssIEdTVF9USU1FX0FSR1MgKGVudHJ5LT50aW1lKSk7CisKKyAgICAvKiB1cGRhdGUgdGhlIHRpbWUgKi8KKyAgICBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcmVzZXRfc3RyZWFtcyAoJmRlbXV4LT5jb21tb24sIGVudHJ5LT50aW1lLCBUUlVFKTsKKyAgICBnc3RfZmxvd19jb21iaW5lcl9yZXNldCAoZGVtdXgtPmZsb3djb21iaW5lcik7CisgICAgZGVtdXgtPmNvbW1vbi5zZWdtZW50LnBvc2l0aW9uID0gZW50cnktPnRpbWU7CisgICAgZGVtdXgtPnNlZWtfYmxvY2sgPSBlbnRyeS0+YmxvY2s7CisgICAgZGVtdXgtPnNlZWtfZmlyc3QgPSBUUlVFOworICAgIGRlbXV4LT5sYXN0X3N0b3BfZW5kID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBkZW11eC0+Y29tbW9uLnNyYy0+bGVuOyBpKyspIHsKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqc3RyZWFtID0gZ19wdHJfYXJyYXlfaW5kZXggKGRlbXV4LT5jb21tb24uc3JjLCBpKTsKKworICAgIGlmIChyZXNldCkgeworICAgICAgc3RyZWFtLT50b19vZmZzZXQgPSBHX01BWElOVDY0OworICAgIH0gZWxzZSB7CisgICAgICBpZiAoc3RyZWFtLT5mcm9tX29mZnNldCAhPSAtMSkKKyAgICAgICAgc3RyZWFtLT50b19vZmZzZXQgPSBzdHJlYW0tPmZyb21fb2Zmc2V0OworICAgIH0KKyAgICBzdHJlYW0tPmZyb21fb2Zmc2V0ID0gLTE7CisgICAgc3RyZWFtLT5mcm9tX3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICB9CisKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdpbnQKK2dzdF9tYXRyb3NrYV9jbHVzdGVyX2NvbXBhcmUgKGdpbnQ2NCAqIGkxLCBnaW50NjQgKiBpMikKK3sKKyAgaWYgKCppMSA8ICppMikKKyAgICByZXR1cm4gLTE7CisgIGVsc2UgaWYgKCppMSA+ICppMikKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBzZWFyY2hlcyBmb3IgYSBjbHVzdGVyIHN0YXJ0IGZyb20gQHBvcywKKyAqIHJldHVybiBHU1RfRkxPV19PSyBhbmQgY2x1c3RlciBwb3NpdGlvbiBpbiBAcG9zIGlmIGZvdW5kICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlbXV4X3NlYXJjaF9jbHVzdGVyIChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgsIGdpbnQ2NCAqIHBvcywKKyAgICBnYm9vbGVhbiBmb3J3YXJkKQoreworICBnaW50NjQgbmV3cG9zID0gKnBvczsKKyAgZ2ludDY0IG9yaWdfb2Zmc2V0OworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBjb25zdCBndWludCBjaHVuayA9IDEyOCAqIDEwMjQ7CisgIEdzdEJ1ZmZlciAqYnVmID0gTlVMTDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdwb2ludGVyIGRhdGEgPSBOVUxMOworICBnc2l6ZSBzaXplOworICBndWludDY0IGxlbmd0aDsKKyAgZ3VpbnQzMiBpZDsKKyAgZ3VpbnQgbmVlZGVkOworICBnaW50NjQgb2xkcG9zLCBvbGRsZW5ndGg7CisKKyAgb3JpZ19vZmZzZXQgPSBkZW11eC0+Y29tbW9uLm9mZnNldDsKKworICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJzZWFyY2hpbmcgY2x1c3RlciAlcyBvZmZzZXQgJSIgR19HSU5UNjRfRk9STUFULAorICAgICAgZm9yd2FyZCA/ICJmb2xsb3dpbmciIDogInByZWNlZGluZyIsICpwb3MpOworCisgIGlmIChkZW11eC0+Y2x1c3RlcnMpIHsKKyAgICBnaW50NjQgKmNwb3M7CisKKyAgICBjcG9zID0gZ3N0X3V0aWxfYXJyYXlfYmluYXJ5X3NlYXJjaCAoZGVtdXgtPmNsdXN0ZXJzLT5kYXRhLAorICAgICAgICBkZW11eC0+Y2x1c3RlcnMtPmxlbiwgc2l6ZW9mIChnaW50NjQpLAorICAgICAgICAoR0NvbXBhcmVEYXRhRnVuYykgZ3N0X21hdHJvc2thX2NsdXN0ZXJfY29tcGFyZSwKKyAgICAgICAgZm9yd2FyZCA/IEdTVF9TRUFSQ0hfTU9ERV9BRlRFUiA6IEdTVF9TRUFSQ0hfTU9ERV9CRUZPUkUsIHBvcywgTlVMTCk7CisgICAgLyogc2FuaXR5IGNoZWNrICovCisgICAgaWYgKGNwb3MpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICJjbHVzdGVyIHJlcG9ydGVkIGF0IG9mZnNldCAlIiBHX0dJTlQ2NF9GT1JNQVQsICpjcG9zKTsKKyAgICAgIGRlbXV4LT5jb21tb24ub2Zmc2V0ID0gKmNwb3M7CisgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGVla19pZF9sZW5ndGhfcHVsbCAoJmRlbXV4LT5jb21tb24sCisgICAgICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCAmaWQsICZsZW5ndGgsICZuZWVkZWQpOworICAgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSyAmJiBpZCA9PSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUikgeworICAgICAgICBuZXdwb3MgPSAqY3BvczsKKyAgICAgICAgZ290byBleGl0OworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIHJlYWQgaW4gYXQgbmV3cG9zIGFuZCBzY2FuIGZvciBlYm1sIGNsdXN0ZXIgaWQgKi8KKyAgb2xkcG9zID0gb2xkbGVuZ3RoID0gLTE7CisgIHdoaWxlICgxKSB7CisgICAgR3N0Qnl0ZVJlYWRlciByZWFkZXI7CisgICAgZ2ludCBjbHVzdGVyX3BvczsKKyAgICBndWludCB0b3JlYWQgPSBjaHVuazsKKworICAgIGlmICghZm9yd2FyZCkgeworICAgICAgLyogbmV2ZXIgcmVhZCBiZXlvbmQgdGhlIHJlcXVlc3RlZCB0YXJnZXQgKi8KKyAgICAgIGlmIChHX1VOTElLRUxZIChuZXdwb3MgPCBjaHVuaykpIHsKKyAgICAgICAgdG9yZWFkID0gbmV3cG9zOworICAgICAgICBuZXdwb3MgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmV3cG9zIC09IGNodW5rOworICAgICAgfQorICAgIH0KKyAgICBpZiAoYnVmICE9IE5VTEwpIHsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgYnVmID0gTlVMTDsKKyAgICB9CisgICAgcmV0ID0gZ3N0X3BhZF9wdWxsX3JhbmdlIChkZW11eC0+Y29tbW9uLnNpbmtwYWQsIG5ld3BvcywgdG9yZWFkLCAmYnVmKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICJyZWFkIGJ1ZmZlciBzaXplICUiIEdfR1NJWkVfRk9STUFUICIgYXQgb2Zmc2V0ICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSwgbmV3cG9zKTsKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIGRhdGEgPSBtYXAuZGF0YTsKKyAgICBzaXplID0gbWFwLnNpemU7CisgICAgaWYgKG9sZHBvcyA9PSBuZXdwb3MgJiYgb2xkbGVuZ3RoID09IG1hcC5zaXplKSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChkZW11eCwgIlN0dWNrIGF0IHNhbWUgcG9zaXRpb24iKTsKKyAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgZ290byBleGl0OworICAgIH0gZWxzZSB7CisgICAgICBvbGRwb3MgPSBuZXdwb3M7CisgICAgICBvbGRsZW5ndGggPSBtYXAuc2l6ZTsKKyAgICB9CisKKyAgICBnc3RfYnl0ZV9yZWFkZXJfaW5pdCAoJnJlYWRlciwgZGF0YSwgc2l6ZSk7CisgICAgY2x1c3Rlcl9wb3MgPSAtMTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgZ2ludCBmb3VuZCA9IGdzdF9ieXRlX3JlYWRlcl9tYXNrZWRfc2Nhbl91aW50MzIgKCZyZWFkZXIsIDB4ZmZmZmZmZmYsCisgICAgICAgICAgR1NUX01BVFJPU0tBX0lEX0NMVVNURVIsIDAsIGdzdF9ieXRlX3JlYWRlcl9nZXRfcmVtYWluaW5nICgmcmVhZGVyKSk7CisgICAgICBpZiAoZm9yd2FyZCkgeworICAgICAgICBjbHVzdGVyX3BvcyA9IGZvdW5kOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8qIG5lZWQgbGFzdCBvY2N1cnJlbmNlIHdoZW4gc2VhcmNoaW5nIGJhY2t3YXJkcyAqLworICAgICAgaWYgKGZvdW5kID49IDApIHsKKyAgICAgICAgY2x1c3Rlcl9wb3MgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3BvcyAoJnJlYWRlcikgKyBmb3VuZDsKKyAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZyZWFkZXIsIGZvdW5kICsgNCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2x1c3Rlcl9wb3MgPj0gMCkgeworICAgICAgbmV3cG9zICs9IGNsdXN0ZXJfcG9zOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgImZvdW5kIGNsdXN0ZXIgZWJtbCBpZCBhdCBvZmZzZXQgJSIgR19HSU5UNjRfRk9STUFULCBuZXdwb3MpOworICAgICAgLyogZXh0cmEgY2hlY2tzIHdoZXRoZXIgd2UgcmVhbGx5IHN5bmMnZWQgdG8gYSBjbHVzdGVyOgorICAgICAgICogLSBlaXRoZXIgaXQgaXMgdGhlIGZpcnN0IGFuZCBvbmx5IGNsdXN0ZXIKKyAgICAgICAqIC0gZWl0aGVyIHRoZXJlIGlzIGEgY2x1c3RlciBhZnRlciB0aGlzIG9uZQorICAgICAgICogLSBlaXRoZXIgY2x1c3RlciBsZW5ndGggaXMgdW5kZWZpbmVkCisgICAgICAgKi8KKyAgICAgIC8qIG9rIGlmIGZpcnN0IGNsdXN0ZXIgKHRoZXJlIG1heSBub3QgYSBzdWJzZXF1ZW50IG9uZSkgKi8KKyAgICAgIGlmIChuZXdwb3MgPT0gZGVtdXgtPmZpcnN0X2NsdXN0ZXJfb2Zmc2V0KSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiY2x1c3RlciBpcyBmaXJzdCBjbHVzdGVyIC0+IE9LIik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVtdXgtPmNvbW1vbi5vZmZzZXQgPSBuZXdwb3M7CisgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGVla19pZF9sZW5ndGhfcHVsbCAoJmRlbXV4LT5jb21tb24sCisgICAgICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCAmaWQsICZsZW5ndGgsICZuZWVkZWQpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIm5lZWQgbW9yZSBkYXRhIC0+IGNvbnRpbnVlIik7CisgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgIH0KKyAgICAgIGdfYXNzZXJ0IChpZCA9PSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUik7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImNsdXN0ZXIgc2l6ZSAlIiBHX0dVSU5UNjRfRk9STUFUICIsIHByZWZpeCAlZCIsCisgICAgICAgICAgbGVuZ3RoLCBuZWVkZWQpOworICAgICAgLyogb2sgaWYgdW5kZWZpbmVkIGxlbmd0aCBvciBmaXJzdCBjbHVzdGVyICovCisgICAgICBpZiAobGVuZ3RoID09IEdTVF9FQk1MX1NJWkVfVU5LTk9XTiB8fCBsZW5ndGggPT0gR19NQVhVSU5UNjQpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJjbHVzdGVyIGhhcyB1bmRlZmluZWQgbGVuZ3RoIC0+IE9LIik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLyogc2tpcCBjbHVzdGVyICovCisgICAgICBkZW11eC0+Y29tbW9uLm9mZnNldCArPSBsZW5ndGggKyBuZWVkZWQ7CisgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGVla19pZF9sZW5ndGhfcHVsbCAoJmRlbXV4LT5jb21tb24sCisgICAgICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCAmaWQsICZsZW5ndGgsICZuZWVkZWQpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBuZXh0OworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJuZXh0IGVsZW1lbnQgaXMgJXNjbHVzdGVyIiwKKyAgICAgICAgICBpZCA9PSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUiA/ICIiIDogIm5vdCAiKTsKKyAgICAgIGlmIChpZCA9PSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUikKKyAgICAgICAgYnJlYWs7CisgICAgbmV4dDoKKyAgICAgIGlmIChmb3J3YXJkKQorICAgICAgICBuZXdwb3MgKz0gMTsKKyAgICB9IGVsc2UgeworICAgICAgLyogcGFydGlhbCBjbHVzdGVyIGlkIG1heSBoYXZlIGJlZW4gaW4gdGFpbCBvZiBidWZmZXIgKi8KKyAgICAgIG5ld3BvcyArPQorICAgICAgICAgIGZvcndhcmQgPyBNQVggKGdzdF9ieXRlX3JlYWRlcl9nZXRfcmVtYWluaW5nICgmcmVhZGVyKSwgNCkgLSAzIDogMzsKKyAgICB9CisgIH0KKworICBpZiAoYnVmKSB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIGJ1ZiA9IE5VTEw7CisgIH0KKworZXhpdDoKKyAgZGVtdXgtPmNvbW1vbi5vZmZzZXQgPSBvcmlnX29mZnNldDsKKyAgKnBvcyA9IG5ld3BvczsKKyAgcmV0dXJuIHJldDsKK30KKworLyogYmlzZWN0IGFuZCBzY2FuIHRocm91Z2ggZmlsZSBmb3IgY2x1c3RlciBzdGFydGluZyBiZWZvcmUgQHRpbWUsCisgKiByZXR1cm5zIGZha2UgaW5kZXggZW50cnkgd2l0aCBjb3JyZXNwb25kaW5nIGluZm8gb24gY2x1c3RlciAqLworc3RhdGljIEdzdE1hdHJvc2thSW5kZXggKgorZ3N0X21hdHJvc2thX2RlbXV4X3NlYXJjaF9wb3MgKEdzdE1hdHJvc2thRGVtdXggKiBkZW11eCwgR3N0Q2xvY2tUaW1lIHRpbWUpCit7CisgIEdzdE1hdHJvc2thSW5kZXggKmVudHJ5ID0gTlVMTDsKKyAgR3N0TWF0cm9za2FSZWFkU3RhdGUgY3VycmVudF9zdGF0ZTsKKyAgR3N0Q2xvY2tUaW1lIG90aW1lLCBwcmV2X2NsdXN0ZXJfdGltZSwgY3VycmVudF9jbHVzdGVyX3RpbWUsIGNsdXN0ZXJfdGltZTsKKyAgR3N0Q2xvY2tUaW1lIGF0aW1lOworICBnaW50NjQgb3BvcywgbmV3cG9zLCBjdXJyZW50X29mZnNldDsKKyAgZ2ludDY0IHByZXZfY2x1c3Rlcl9vZmZzZXQgPSAtMSwgY3VycmVudF9jbHVzdGVyX29mZnNldCwgY2x1c3Rlcl9vZmZzZXQ7CisgIGdpbnQ2NCBhcG9zLCBtYXhwb3M7CisgIGd1aW50NjQgY2x1c3Rlcl9zaXplID0gMDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIGd1aW50NjQgbGVuZ3RoOworICBndWludDMyIGlkOworICBndWludCBuZWVkZWQ7CisKKyAgLyogZXN0aW1hdGUgbmV3IHBvc2l0aW9uLCByZXN5bmMgdXNpbmcgY2x1c3RlciBlYm1sIGlkLAorICAgKiBhbmQgYmlzZWN0IGZ1cnRoZXIgb3Igc2NhbiBmb3J3YXJkIHRvIGFwcHJvcHJpYXRlIGNsdXN0ZXIgKi8KKworICAvKiBzdG9yZSBzb21lIGN1cnJlbnQgc3RhdGUgKi8KKyAgY3VycmVudF9zdGF0ZSA9IGRlbXV4LT5jb21tb24uc3RhdGU7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChjdXJyZW50X3N0YXRlID09IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX0RBVEEsIE5VTEwpOworCisgIGN1cnJlbnRfY2x1c3Rlcl9vZmZzZXQgPSBkZW11eC0+Y2x1c3Rlcl9vZmZzZXQ7CisgIGN1cnJlbnRfY2x1c3Rlcl90aW1lID0gZGVtdXgtPmNsdXN0ZXJfdGltZTsKKyAgY3VycmVudF9vZmZzZXQgPSBkZW11eC0+Y29tbW9uLm9mZnNldDsKKworICBkZW11eC0+Y29tbW9uLnN0YXRlID0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfU0NBTk5JTkc7CisKKyAgLyogZXN0aW1hdGUgdXNpbmcgc3RhcnQgYW5kIGxhc3Qga25vd24gY2x1c3RlciAqLworICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgYXBvcyA9IGRlbXV4LT5maXJzdF9jbHVzdGVyX29mZnNldDsKKyAgYXRpbWUgPSBkZW11eC0+c3RyZWFtX3N0YXJ0X3RpbWU7CisgIG9wb3MgPSBkZW11eC0+bGFzdF9jbHVzdGVyX29mZnNldDsKKyAgb3RpbWUgPSBkZW11eC0+c3RyZWFtX2xhc3RfdGltZTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKworICAvKiBzYW5pdGl6ZSAqLworICB0aW1lID0gTUFYICh0aW1lLCBhdGltZSk7CisgIG90aW1lID0gTUFYIChvdGltZSwgYXRpbWUpOworICBvcG9zID0gTUFYIChvcG9zLCBhcG9zKTsKKworICBtYXhwb3MgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fZ2V0X2xlbmd0aCAoJmRlbXV4LT5jb21tb24pOworCisgIC8qIGludmFyaWFudHM7CisgICAqIGFwb3MgPD0gb3BvcworICAgKiBhdGltZSA8PSBvdGltZQorICAgKiBhcG9zIGFsd2F5cyByZWZlciB0byBhIGNsdXN0ZXIgYmVmb3JlIHRhcmdldCB0aW1lOworICAgKiBvcG9zIG1heSBvciBtYXkgbm90IGJlIGFmdGVyIHRhcmdldCB0aW1lLCBidXQgaWYgaXQgaXMgb25jZSBzbywKKyAgICogdGhlbiBhbHNvIGluIG5leHQgaXRlcmF0aW9uCisgICAqICovCisKK3JldHJ5OgorICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsCisgICAgICAiYXBvczogJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBhdGltZTogJSIgR1NUX1RJTUVfRk9STUFUICIsICUiCisgICAgICBHU1RfVElNRV9GT1JNQVQgIiBpbiBzdHJlYW0gdGltZSwgIgorICAgICAgIm9wb3M6ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgb3RpbWU6ICUiIEdTVF9USU1FX0ZPUk1BVCAiLCAlIgorICAgICAgR1NUX1RJTUVfRk9STUFUICIgaW4gc3RyZWFtIHRpbWUgKHN0YXJ0ICUiIEdTVF9USU1FX0ZPUk1BVCAiKSwgdGltZSAlIgorICAgICAgR1NUX1RJTUVfRk9STUFULCBhcG9zLCBHU1RfVElNRV9BUkdTIChhdGltZSksCisgICAgICBHU1RfVElNRV9BUkdTIChhdGltZSAtIGRlbXV4LT5zdHJlYW1fc3RhcnRfdGltZSksIG9wb3MsCisgICAgICBHU1RfVElNRV9BUkdTIChvdGltZSksIEdTVF9USU1FX0FSR1MgKG90aW1lIC0gZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lKSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKGRlbXV4LT5zdHJlYW1fc3RhcnRfdGltZSksIEdTVF9USU1FX0FSR1MgKHRpbWUpKTsKKworICBnX2Fzc2VydCAoYXRpbWUgPD0gb3RpbWUpOworICBnX2Fzc2VydCAoYXBvcyA8PSBvcG9zKTsKKyAgaWYgKHRpbWUgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAic2VhcmNoaW5nIGxhc3QgY2x1c3RlciIpOworICAgIG5ld3BvcyA9IG1heHBvczsKKyAgICBpZiAobmV3cG9zID09IC0xKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInVua25vd24gZmlsZSBzaXplOyBiYWlsaW5nIG91dCIpOworICAgICAgZ290byBleGl0OworICAgIH0KKyAgfSBlbHNlIGlmIChvdGltZSA8PSBhdGltZSkgeworICAgIG5ld3BvcyA9IGFwb3M7CisgIH0gZWxzZSB7CisgICAgbmV3cG9zID0gYXBvcyArCisgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAob3BvcyAtIGFwb3MsIHRpbWUgLSBhdGltZSwgb3RpbWUgLSBhdGltZSk7CisgICAgaWYgKG1heHBvcyAhPSAtMSAmJiBuZXdwb3MgPiBtYXhwb3MpCisgICAgICBuZXdwb3MgPSBtYXhwb3M7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICJlc3RpbWF0ZWQgb2Zmc2V0IGZvciAlIiBHU1RfVElNRV9GT1JNQVQgIjogJSIgR19HSU5UNjRfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAodGltZSksIG5ld3Bvcyk7CisKKyAgLyogc2VhcmNoIGJhY2t3YXJkcyAqLworICBpZiAobmV3cG9zID4gYXBvcykgeworICAgIHJldCA9IGdzdF9tYXRyb3NrYV9kZW11eF9zZWFyY2hfY2x1c3RlciAoZGVtdXgsICZuZXdwb3MsIEZBTFNFKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgZ290byBleGl0OworICB9CisKKyAgLyogdGhlbiBzdGFydCBzY2FubmluZyBhbmQgcGFyc2luZyBmb3IgY2x1c3RlciB0aW1lLAorICAgKiByZS1lc3RpbWF0ZSBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlIG5leHQgY2x1c3RlciBhbmQgc28gb24gKi8KKyAgLyogbm90ZSB0aGF0IGVhY2ggcmUtZXN0aW1hdGUgaXMgZW50ZXJlZCB3aXRoIGEgY2hhbmdlIGluIGFwb3Mgb3Igb3BvcywKKyAgICogYXZvaWRpbmcgaW5maW5pdGUgbG9vcCAqLworICBkZW11eC0+Y29tbW9uLm9mZnNldCA9IG5ld3BvczsKKyAgZGVtdXgtPmNsdXN0ZXJfdGltZSA9IGNsdXN0ZXJfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGNsdXN0ZXJfc2l6ZSA9IDA7CisgIHByZXZfY2x1c3Rlcl90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgd2hpbGUgKDEpIHsKKyAgICAvKiBwZWVrIGFuZCBwYXJzZSBzb21lIGVsZW1lbnRzICovCisgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BlZWtfaWRfbGVuZ3RoX3B1bGwgKCZkZW11eC0+Y29tbW9uLAorICAgICAgICBHU1RfRUxFTUVOVF9DQVNUIChkZW11eCksICZpZCwgJmxlbmd0aCwgJm5lZWRlZCk7CisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiT2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgRWxlbWVudCBpZCAweCV4LCAiCisgICAgICAgICJzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgbmVlZGVkICVkIiwgZGVtdXgtPmNvbW1vbi5vZmZzZXQsIGlkLAorICAgICAgICBsZW5ndGgsIG5lZWRlZCk7CisgICAgcmV0ID0gZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2lkIChkZW11eCwgaWQsIGxlbmd0aCwgbmVlZGVkKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgZ290byBlcnJvcjsKKworICAgIGlmIChpZCA9PSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUikgeworICAgICAgY2x1c3Rlcl90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICAgIGlmIChsZW5ndGggPT0gR19NQVhVSU5UNjQpCisgICAgICAgIGNsdXN0ZXJfc2l6ZSA9IDA7CisgICAgICBlbHNlCisgICAgICAgIGNsdXN0ZXJfc2l6ZSA9IGxlbmd0aCArIG5lZWRlZDsKKyAgICB9CisgICAgaWYgKGRlbXV4LT5jbHVzdGVyX3RpbWUgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSAmJgorICAgICAgICBjbHVzdGVyX3RpbWUgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgICAgY2x1c3Rlcl90aW1lID0gZGVtdXgtPmNsdXN0ZXJfdGltZSAqIGRlbXV4LT5jb21tb24udGltZV9zY2FsZTsKKyAgICAgIGNsdXN0ZXJfb2Zmc2V0ID0gZGVtdXgtPmNsdXN0ZXJfb2Zmc2V0OworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJmb3VuZCBjbHVzdGVyIGF0IG9mZnNldCAlIiBHX0dJTlQ2NF9GT1JNQVQKKyAgICAgICAgICAiIHdpdGggdGltZSAlIiBHU1RfVElNRV9GT1JNQVQsIGNsdXN0ZXJfb2Zmc2V0LAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGNsdXN0ZXJfdGltZSkpOworICAgICAgaWYgKHRpbWUgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImZvdW5kIGxhc3QgY2x1c3RlciIpOworICAgICAgICBwcmV2X2NsdXN0ZXJfdGltZSA9IGNsdXN0ZXJfdGltZTsKKyAgICAgICAgcHJldl9jbHVzdGVyX29mZnNldCA9IGNsdXN0ZXJfb2Zmc2V0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChjbHVzdGVyX3RpbWUgPiB0aW1lKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAib3ZlcnNob3QgdGFyZ2V0Iik7CisgICAgICAgIC8qIGNsdXN0ZXIgb3ZlcnNob290cyAqLworICAgICAgICBpZiAoY2x1c3Rlcl9vZmZzZXQgPT0gZGVtdXgtPmZpcnN0X2NsdXN0ZXJfb2Zmc2V0KSB7CisgICAgICAgICAgLyogYnV0IG5vIHByZXYgb25lICovCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJidXQgdXNpbmcgZmlyc3QgY2x1c3RlciBhbnl3YXkiKTsKKyAgICAgICAgICBwcmV2X2NsdXN0ZXJfdGltZSA9IGNsdXN0ZXJfdGltZTsKKyAgICAgICAgICBwcmV2X2NsdXN0ZXJfb2Zmc2V0ID0gY2x1c3Rlcl9vZmZzZXQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZXZfY2x1c3Rlcl90aW1lICE9IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICAgICAgICAvKiBwcmV2IGNsdXN0ZXIgZGlkIG5vdCBvdmVyc2hvb3QsIHNvIHByZXYgY2x1c3RlciBpcyB0YXJnZXQgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiByZS1lc3RpbWF0ZSB1c2luZyB0aGlzIG5ldyBwb3NpdGlvbiBpbmZvICovCisgICAgICAgICAgb3BvcyA9IGNsdXN0ZXJfb2Zmc2V0OworICAgICAgICAgIG90aW1lID0gY2x1c3Rlcl90aW1lOworICAgICAgICAgIGdvdG8gcmV0cnk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGNsdXN0ZXIgdW5kZXJzaG9vdHMgKi8KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJ1bmRlcnNob3QgdGFyZ2V0Iik7CisgICAgICAgIC8qIG9rIGlmIGNsb3NlIGVub3VnaCAqLworICAgICAgICBpZiAoR1NUX0NMT0NLX0RJRkYgKGNsdXN0ZXJfdGltZSwgdGltZSkgPCA1ICogR1NUX1NFQ09ORCkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAidGFyZ2V0IGNsb3NlIGVub3VnaCIpOworICAgICAgICAgIHByZXZfY2x1c3Rlcl90aW1lID0gY2x1c3Rlcl90aW1lOworICAgICAgICAgIHByZXZfY2x1c3Rlcl9vZmZzZXQgPSBjbHVzdGVyX29mZnNldDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAob3RpbWUgPiB0aW1lKSB7CisgICAgICAgICAgLyogd2UgYXJlIGluIGJldHdlZW4gYXRpbWUgYW5kIG90aW1lID0+IGNhbiBiaXNlY3QgaWYgd29ydGh3aGlsZSAqLworICAgICAgICAgIGlmIChwcmV2X2NsdXN0ZXJfdGltZSAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FICYmCisgICAgICAgICAgICAgIGNsdXN0ZXJfdGltZSA+IHByZXZfY2x1c3Rlcl90aW1lICYmCisgICAgICAgICAgICAgIChHU1RfQ0xPQ0tfRElGRiAocHJldl9jbHVzdGVyX3RpbWUsIGNsdXN0ZXJfdGltZSkgKiAxMCA8CisgICAgICAgICAgICAgICAgICBHU1RfQ0xPQ0tfRElGRiAoY2x1c3Rlcl90aW1lLCB0aW1lKSkpIHsKKyAgICAgICAgICAgIC8qIHdlIG1vdmVkIGF0IGxlYXN0IG9uZSBjbHVzdGVyIGZvcndhcmQsCisgICAgICAgICAgICAgKiBhbmQgaXQgbG9va3MgbGlrZSB0YXJnZXQgaXMgc3RpbGwgZmFyIGF3YXksCisgICAgICAgICAgICAgKiBsZXQncyBlc3RpbWF0ZSBhZ2FpbiAqLworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJiaXNlY3Rpbmcgd2l0aCBuZXcgYXBvcyIpOworICAgICAgICAgICAgYXBvcyA9IGNsdXN0ZXJfb2Zmc2V0OworICAgICAgICAgICAgYXRpbWUgPSBjbHVzdGVyX3RpbWU7CisgICAgICAgICAgICBnb3RvIHJldHJ5OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBjbHVzdGVyIHVuZGVyc2hvb3RzLCBnb3RvIG5leHQgb25lICovCisgICAgICAgIHByZXZfY2x1c3Rlcl90aW1lID0gY2x1c3Rlcl90aW1lOworICAgICAgICBwcmV2X2NsdXN0ZXJfb2Zmc2V0ID0gY2x1c3Rlcl9vZmZzZXQ7CisgICAgICAgIC8qIHNraXAgY2x1c3RlciBpZiBsZW5ndGggaXMgZGVmaW5lZCwKKyAgICAgICAgICogb3RoZXJ3aXNlIHdpbGwgYmUgc2tpcHBpbmdseSBwYXJzZWQgaW50byAqLworICAgICAgICBpZiAoY2x1c3Rlcl9zaXplKSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJza2lwcGluZyB0byBuZXh0IGNsdXN0ZXIiKTsKKyAgICAgICAgICBkZW11eC0+Y29tbW9uLm9mZnNldCA9IGNsdXN0ZXJfb2Zmc2V0ICsgY2x1c3Rlcl9zaXplOworICAgICAgICAgIGRlbXV4LT5jbHVzdGVyX3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAicGFyc2luZy9za2lwcGluZyBjbHVzdGVyIGVsZW1lbnRzIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgY29udGludWU7CisKKyAgZXJyb3I6CisgICAgaWYgKHJldCA9PSBHU1RfRkxPV19FT1MpIHsKKyAgICAgIGlmIChwcmV2X2NsdXN0ZXJfdGltZSAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgZ290byBleGl0OworICB9CisKKyAgZW50cnkgPSBnX25ldzAgKEdzdE1hdHJvc2thSW5kZXgsIDEpOworICBlbnRyeS0+dGltZSA9IHByZXZfY2x1c3Rlcl90aW1lOworICBlbnRyeS0+cG9zID0gcHJldl9jbHVzdGVyX29mZnNldCAtIGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X3N0YXJ0OworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInNpbXVsYXRlZCBpbmRleCBlbnRyeTsgdGltZSAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIsIHBvcyAlIiBHX0dVSU5UNjRfRk9STUFULCBHU1RfVElNRV9BUkdTIChlbnRyeS0+dGltZSksIGVudHJ5LT5wb3MpOworCitleGl0OgorCisgIC8qIHJlc3RvcmUgc29tZSBzdGF0ZSAqLworICBkZW11eC0+Y2x1c3Rlcl9vZmZzZXQgPSBjdXJyZW50X2NsdXN0ZXJfb2Zmc2V0OworICBkZW11eC0+Y2x1c3Rlcl90aW1lID0gY3VycmVudF9jbHVzdGVyX3RpbWU7CisgIGRlbXV4LT5jb21tb24ub2Zmc2V0ID0gY3VycmVudF9vZmZzZXQ7CisgIGRlbXV4LT5jb21tb24uc3RhdGUgPSBjdXJyZW50X3N0YXRlOworCisgIHJldHVybiBlbnRyeTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NlZWtfZXZlbnQgKEdzdE1hdHJvc2thRGVtdXggKiBkZW11eCwKKyAgICBHc3RQYWQgKiBwYWQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdE1hdHJvc2thSW5kZXggKmVudHJ5ID0gTlVMTDsKKyAgR3N0TWF0cm9za2FJbmRleCBzY2FuX2VudHJ5OworICBHc3RTZWVrRmxhZ3MgZmxhZ3M7CisgIEdzdFNlZWtUeXBlIGN1cl90eXBlLCBzdG9wX3R5cGU7CisgIEdzdEZvcm1hdCBmb3JtYXQ7CisgIGdib29sZWFuIGZsdXNoLCBrZXl1bml0LCBiZWZvcmUsIGFmdGVyLCBzbmFwX25leHQ7CisgIGdkb3VibGUgcmF0ZTsKKyAgZ2ludDY0IGN1ciwgc3RvcDsKKyAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKnRyYWNrID0gTlVMTDsKKyAgR3N0U2VnbWVudCBzZWVrc2VnbWVudCA9IHsgMCwgfTsKKyAgZ2Jvb2xlYW4gdXBkYXRlID0gVFJVRTsKKyAgZ2Jvb2xlYW4gcGFkX2xvY2tlZCA9IEZBTFNFOworICBndWludDMyIHNlcW51bTsKKyAgR3N0U2VhcmNoTW9kZSBzbmFwX2RpcjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZXZlbnQgIT0gTlVMTCwgRkFMU0UpOworCisgIGlmIChwYWQpCisgICAgdHJhY2sgPSBnc3RfcGFkX2dldF9lbGVtZW50X3ByaXZhdGUgKHBhZCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJIYXZlIHNlZWsgJSIgR1NUX1BUUl9GT1JNQVQsIGV2ZW50KTsKKworICBnc3RfZXZlbnRfcGFyc2Vfc2VlayAoZXZlbnQsICZyYXRlLCAmZm9ybWF0LCAmZmxhZ3MsICZjdXJfdHlwZSwgJmN1ciwKKyAgICAgICZzdG9wX3R5cGUsICZzdG9wKTsKKyAgc2VxbnVtID0gZ3N0X2V2ZW50X2dldF9zZXFudW0gKGV2ZW50KTsKKworICAvKiB3ZSBjYW4gb25seSBzZWVrIG9uIHRpbWUgKi8KKyAgaWYgKGZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIkNhbiBvbmx5IHNlZWsgb24gVElNRSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIGNvcHkgc2VnbWVudCwgd2UgbmVlZCB0aGlzIGJlY2F1c2Ugd2Ugc3RpbGwgbmVlZCB0aGUgb2xkCisgICAqIHNlZ21lbnQgd2hlbiB3ZSBjbG9zZSB0aGUgY3VycmVudCBzZWdtZW50LiAqLworICBtZW1jcHkgKCZzZWVrc2VnbWVudCwgJmRlbXV4LT5jb21tb24uc2VnbWVudCwgc2l6ZW9mIChHc3RTZWdtZW50KSk7CisKKyAgLyogcHVsbCBtb2RlIHdpdGhvdXQgaW5kZXggbWVhbnMgdGhhdCB0aGUgYWN0dWFsIGR1cmF0aW9uIGlzIG5vdCBrbm93biwKKyAgICogd2UgbWlnaHQgYmUgcGxheWluZyBhIGZpbGUgdGhhdCdzIHN0aWxsIGJlaW5nIHJlY29yZGVkCisgICAqIHNvLCBpbnZhbGlkYXRlIG91ciBjdXJyZW50IGR1cmF0aW9uLCB3aGljaCBpcyBvbmx5IGEgbW92aW5nIHRhcmdldCwKKyAgICogYW5kIHNob3VsZCBub3QgYmUgdXNlZCB0byBjbGFtcCBhbnl0aGluZyAqLworICBpZiAoIWRlbXV4LT5zdHJlYW1pbmcgJiYgIWRlbXV4LT5jb21tb24uaW5kZXggJiYgZGVtdXgtPmludmFsaWRfZHVyYXRpb24pIHsKKyAgICBzZWVrc2VnbWVudC5kdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImNvbmZpZ3VyaW5nIHNlZWsiKTsKKyAgLyogU3VidHJhY3Qgc3RyZWFtX3N0YXJ0X3RpbWUgc28gd2UgYWx3YXlzIHNlZWsgb24gYSBzZWdtZW50CisgICAqIGluIHN0cmVhbSB0aW1lICovCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lKSkgeworICAgIHNlZWtzZWdtZW50LnN0YXJ0IC09IGRlbXV4LT5zdHJlYW1fc3RhcnRfdGltZTsKKyAgICBzZWVrc2VnbWVudC5wb3NpdGlvbiAtPSBkZW11eC0+c3RyZWFtX3N0YXJ0X3RpbWU7CisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzZWVrc2VnbWVudC5zdG9wKSkKKyAgICAgIHNlZWtzZWdtZW50LnN0b3AgLT0gZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lOworICAgIGVsc2UKKyAgICAgIHNlZWtzZWdtZW50LnN0b3AgPSBzZWVrc2VnbWVudC5kdXJhdGlvbjsKKyAgfQorCisgIGdzdF9zZWdtZW50X2RvX3NlZWsgKCZzZWVrc2VnbWVudCwgcmF0ZSwgZm9ybWF0LCBmbGFncywKKyAgICAgIGN1cl90eXBlLCBjdXIsIHN0b3BfdHlwZSwgc3RvcCwgJnVwZGF0ZSk7CisKKyAgLyogUmVzdG9yZSB0aGUgY2xpcCB0aW1lc3RhbXAgb2Zmc2V0ICovCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lKSkgeworICAgIHNlZWtzZWdtZW50LnBvc2l0aW9uICs9IGRlbXV4LT5zdHJlYW1fc3RhcnRfdGltZTsKKyAgICBzZWVrc2VnbWVudC5zdGFydCArPSBkZW11eC0+c3RyZWFtX3N0YXJ0X3RpbWU7CisgICAgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc2Vla3NlZ21lbnQuc3RvcCkpCisgICAgICBzZWVrc2VnbWVudC5zdG9wID0gc2Vla3NlZ21lbnQuZHVyYXRpb247CisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzZWVrc2VnbWVudC5zdG9wKSkKKyAgICAgIHNlZWtzZWdtZW50LnN0b3AgKz0gZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lOworICB9CisKKyAgLyogcmVzdG9yZSBzZWdtZW50IGR1cmF0aW9uIChpZiBhbnkgZWZmZWN0KSwKKyAgICogd291bGQgYmUgZGV0ZXJtaW5lZCBhZ2FpbiB3aGVuIHBhcnNpbmcsIGJ1dCBhbnl3YXkgLi4uICovCisgIHNlZWtzZWdtZW50LmR1cmF0aW9uID0gZGVtdXgtPmNvbW1vbi5zZWdtZW50LmR1cmF0aW9uOworCisgIGZsdXNoID0gISAhKGZsYWdzICYgR1NUX1NFRUtfRkxBR19GTFVTSCk7CisgIGtleXVuaXQgPSAhICEoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX0tFWV9VTklUKTsKKyAgYWZ0ZXIgPSAhICEoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NOQVBfQUZURVIpOworICBiZWZvcmUgPSAhICEoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NOQVBfQkVGT1JFKTsKKworICAvKiBhbHdheXMgZG8gZnVsbCB1cGRhdGUgaWYgZmx1c2hpbmcsCisgICAqIG90aGVyd2lzZSBwcm9ibGVtcyBtaWdodCBhcmlzZSBkb3duc3RyZWFtIHdpdGggbWlzc2luZyBrZXlmcmFtZXMgZXRjICovCisgIHVwZGF0ZSA9IHVwZGF0ZSB8fCBmbHVzaDsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIk5ldyBzZWdtZW50ICUiIEdTVF9TRUdNRU5UX0ZPUk1BVCwgJnNlZWtzZWdtZW50KTsKKworICAvKiBjaGVjayBzYW5pdHkgYmVmb3JlIHdlIHN0YXJ0IGZsdXNoaW5nIGFuZCBhbGwgdGhhdCAqLworICBzbmFwX25leHQgPSBhZnRlciAmJiAhYmVmb3JlOworICBpZiAoc2Vla3NlZ21lbnQucmF0ZSA8IDApCisgICAgc25hcF9kaXIgPSBzbmFwX25leHQgPyBHU1RfU0VBUkNIX01PREVfQkVGT1JFIDogR1NUX1NFQVJDSF9NT0RFX0FGVEVSOworICBlbHNlCisgICAgc25hcF9kaXIgPSBzbmFwX25leHQgPyBHU1RfU0VBUkNIX01PREVfQUZURVIgOiBHU1RfU0VBUkNIX01PREVfQkVGT1JFOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICB0cmFjayA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9nZXRfc2Vla190cmFjayAoJmRlbXV4LT5jb21tb24sIHRyYWNrKTsKKyAgaWYgKChlbnRyeSA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9kb19pbmRleF9zZWVrICgmZGVtdXgtPmNvbW1vbiwgdHJhY2ssCisgICAgICAgICAgICAgIHNlZWtzZWdtZW50LnBvc2l0aW9uLCAmZGVtdXgtPnNlZWtfaW5kZXgsICZkZW11eC0+c2Vla19lbnRyeSwKKyAgICAgICAgICAgICAgc25hcF9kaXIpKSA9PSBOVUxMKSB7CisgICAgLyogcHVsbCBtb2RlIHdpdGhvdXQgaW5kZXggY2FuIHNjYW4gbGF0ZXIgb24gKi8KKyAgICBpZiAoZGVtdXgtPnN0cmVhbWluZykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJObyBtYXRjaGluZyBzZWVrIGVudHJ5IGluIGluZGV4Iik7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0gZWxzZSBpZiAocmF0ZSA8IDAuMCkgeworICAgICAgLyogRklYTUU6IFdlIHNob3VsZCBidWlsZCBhbiBpbmRleCBkdXJpbmcgcGxheWJhY2sgb3Igd2hlbiBzY2FubmluZworICAgICAgICogdGhhdCBjYW4gYmUgdXNlZCBoZXJlLiBUaGUgcmV2ZXJzZSBwbGF5YmFjayBjb2RlIHJlcXVpcmVzIHNlZWtfaW5kZXgKKyAgICAgICAqIGFuZCBzZWVrX2VudHJ5IHRvIGJlIHNldCEKKyAgICAgICAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgIk5vIG1hdGNoaW5nIHNlZWsgZW50cnkgaW4gaW5kZXgsIG5lZWRlZCBmb3IgcmV2ZXJzZSBwbGF5YmFjayIpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJTZWVrIHBvc2l0aW9uIGxvb2tzIHNhbmUiKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKworICBpZiAoIXVwZGF0ZSkgeworICAgIC8qIG9ubHkgaGF2ZSB0byB1cGRhdGUgc29tZSBzZWdtZW50LAorICAgICAqIGJ1dCBhbHNvIHN0aWxsIGhhdmUgdG8gaG9ub3VyIGZsdXNoIGFuZCBzbyBvbiAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiLi4uIG5vIHVwZGF0ZSIpOworICAgIC8qIGJhZCBnb3RvLCBiYWQgLi4uICovCisgICAgZ290byBuZXh0OworICB9CisKKyAgaWYgKGRlbXV4LT5zdHJlYW1pbmcpCisgICAgZ290byBmaW5pc2g7CisKK25leHQ6CisgIGlmIChmbHVzaCkgeworICAgIEdzdEV2ZW50ICpmbHVzaF9ldmVudCA9IGdzdF9ldmVudF9uZXdfZmx1c2hfc3RhcnQgKCk7CisgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGZsdXNoX2V2ZW50LCBzZXFudW0pOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiU3RhcnRpbmcgZmx1c2giKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKGRlbXV4LT5jb21tb24uc2lua3BhZCwgZ3N0X2V2ZW50X3JlZiAoZmx1c2hfZXZlbnQpKTsKKyAgICBnc3RfbWF0cm9za2FfZGVtdXhfc2VuZF9ldmVudCAoZGVtdXgsIGZsdXNoX2V2ZW50KTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIk5vbi1mbHVzaGluZyBzZWVrLCBwYXVzaW5nIHRhc2siKTsKKyAgICBnc3RfcGFkX3BhdXNlX3Rhc2sgKGRlbXV4LT5jb21tb24uc2lua3BhZCk7CisgIH0KKyAgLyogb3VjaCAqLworICBpZiAoIXVwZGF0ZSkgeworICAgIEdTVF9QQURfU1RSRUFNX0xPQ0sgKGRlbXV4LT5jb21tb24uc2lua3BhZCk7CisgICAgcGFkX2xvY2tlZCA9IFRSVUU7CisgICAgZ290byBleGl0OworICB9CisKKyAgLyogbm93IGdyYWIgdGhlIHN0cmVhbSBsb2NrIHNvIHRoYXQgc3RyZWFtaW5nIGNhbm5vdCBjb250aW51ZSwgZm9yCisgICAqIG5vbiBmbHVzaGluZyBzZWVrcyB3aGVuIHRoZSBlbGVtZW50IGlzIGluIFBBVVNFRCB0aGlzIGNvdWxkIGJsb2NrCisgICAqIGZvcmV2ZXIuICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiV2FpdGluZyBmb3Igc3RyZWFtaW5nIHRvIHN0b3AiKTsKKyAgR1NUX1BBRF9TVFJFQU1fTE9DSyAoZGVtdXgtPmNvbW1vbi5zaW5rcGFkKTsKKyAgcGFkX2xvY2tlZCA9IFRSVUU7CisKKyAgLyogcHVsbCBtb2RlIHdpdGhvdXQgaW5kZXggY2FuIGRvIHNvbWUgc2Nhbm5pbmcgKi8KKyAgaWYgKCFkZW11eC0+c3RyZWFtaW5nICYmICFlbnRyeSkgeworICAgIEdzdEV2ZW50ICpmbHVzaF9ldmVudDsKKworICAgIC8qIG5lZWQgdG8gc3RvcCBmbHVzaGluZyB1cHN0cmVhbSBhcyB3ZSBuZWVkIGl0IG5leHQgKi8KKyAgICBpZiAoZmx1c2gpIHsKKyAgICAgIGZsdXNoX2V2ZW50ID0gZ3N0X2V2ZW50X25ld19mbHVzaF9zdG9wIChUUlVFKTsKKyAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChmbHVzaF9ldmVudCwgc2VxbnVtKTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoZGVtdXgtPmNvbW1vbi5zaW5rcGFkLCBmbHVzaF9ldmVudCk7CisgICAgfQorICAgIGVudHJ5ID0gZ3N0X21hdHJvc2thX2RlbXV4X3NlYXJjaF9wb3MgKGRlbXV4LCBzZWVrc2VnbWVudC5wb3NpdGlvbik7CisgICAgLyoga2VlcCBsb2NhbCBjb3B5ICovCisgICAgaWYgKGVudHJ5KSB7CisgICAgICBzY2FuX2VudHJ5ID0gKmVudHJ5OworICAgICAgZ19mcmVlIChlbnRyeSk7CisgICAgICBlbnRyeSA9ICZzY2FuX2VudHJ5OworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlNjYW4gZmFpbGVkIHRvIGZpbmQgbWF0Y2hpbmcgcG9zaXRpb24iKTsKKyAgICAgIGlmIChmbHVzaCkgeworICAgICAgICBmbHVzaF9ldmVudCA9IGdzdF9ldmVudF9uZXdfZmx1c2hfc3RvcCAoVFJVRSk7CisgICAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChmbHVzaF9ldmVudCwgc2VxbnVtKTsKKyAgICAgICAgZ3N0X21hdHJvc2thX2RlbXV4X3NlbmRfZXZlbnQgKGRlbXV4LCBmbHVzaF9ldmVudCk7CisgICAgICB9CisgICAgICBnb3RvIHNlZWtfZXJyb3I7CisgICAgfQorICB9CisKK2ZpbmlzaDoKKyAgaWYgKGtleXVuaXQgJiYgc2Vla3NlZ21lbnQucmF0ZSA+IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInNlZWsgdG8ga2V5IHVuaXQsIGFkanVzdGluZyBzZWdtZW50IHN0YXJ0IGZyb20gJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFUICIgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChzZWVrc2VnbWVudC5zdGFydCksIEdTVF9USU1FX0FSR1MgKGVudHJ5LT50aW1lKSk7CisgICAgc2Vla3NlZ21lbnQuc3RhcnQgPSBNQVggKGVudHJ5LT50aW1lLCBkZW11eC0+c3RyZWFtX3N0YXJ0X3RpbWUpOworICAgIHNlZWtzZWdtZW50LnBvc2l0aW9uID0gc2Vla3NlZ21lbnQuc3RhcnQ7CisgICAgc2Vla3NlZ21lbnQudGltZSA9IHNlZWtzZWdtZW50LnN0YXJ0IC0gZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lOworICB9IGVsc2UgaWYgKGtleXVuaXQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInNlZWsgdG8ga2V5IHVuaXQsIGFkanVzdGluZyBzZWdtZW50IHN0b3AgZnJvbSAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiB0byAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHNlZWtzZWdtZW50LnN0b3ApLCBHU1RfVElNRV9BUkdTIChlbnRyeS0+dGltZSkpOworICAgIHNlZWtzZWdtZW50LnN0b3AgPSBNQVggKGVudHJ5LT50aW1lLCBkZW11eC0+c3RyZWFtX3N0YXJ0X3RpbWUpOworICAgIHNlZWtzZWdtZW50LnBvc2l0aW9uID0gc2Vla3NlZ21lbnQuc3RvcDsKKyAgfQorCisgIGlmIChkZW11eC0+c3RyZWFtaW5nKSB7CisgICAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgICAgLyogdHJhY2sgcmVhbCBwb3NpdGlvbiB3ZSBzaG91bGQgc3RhcnQgYXQgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInN0b3Jpbmcgc2VnbWVudCBzdGFydCIpOworICAgIGRlbXV4LT5yZXF1ZXN0ZWRfc2Vla190aW1lID0gc2Vla3NlZ21lbnQucG9zaXRpb247CisgICAgZGVtdXgtPnNlZWtfb2Zmc2V0ID0gZW50cnktPnBvcyArIGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X3N0YXJ0OworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgLyogbmVlZCB0byBzZWVrIHRvIGNsdXN0ZXIgc3RhcnQgdG8gcGljayB1cCBjbHVzdGVyIHRpbWUgKi8KKyAgICAvKiB1cHN0cmVhbSB0YWtlcyBjYXJlIG9mIGZsdXNoaW5nIGFuZCBhbGwgdGhhdAorICAgICAqIC4uLiBhbmQgbmV3c2VnbWVudCBldmVudCBoYW5kbGluZyB0YWtlcyBjYXJlIG9mIHRoZSByZXN0ICovCisgICAgcmV0dXJuIHBlcmZvcm1fc2Vla190b19vZmZzZXQgKGRlbXV4LCByYXRlLAorICAgICAgICBlbnRyeS0+cG9zICsgZGVtdXgtPmNvbW1vbi5lYm1sX3NlZ21lbnRfc3RhcnQsIHNlcW51bSwgZmxhZ3MpOworICB9CisKK2V4aXQ6CisgIGlmIChmbHVzaCkgeworICAgIEdzdEV2ZW50ICpmbHVzaF9ldmVudCA9IGdzdF9ldmVudF9uZXdfZmx1c2hfc3RvcCAoVFJVRSk7CisgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGZsdXNoX2V2ZW50LCBzZXFudW0pOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiU3RvcHBpbmcgZmx1c2giKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKGRlbXV4LT5jb21tb24uc2lua3BhZCwgZ3N0X2V2ZW50X3JlZiAoZmx1c2hfZXZlbnQpKTsKKyAgICBnc3RfbWF0cm9za2FfZGVtdXhfc2VuZF9ldmVudCAoZGVtdXgsIGZsdXNoX2V2ZW50KTsKKyAgfQorCisgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICAvKiBub3cgdXBkYXRlIHRoZSByZWFsIHNlZ21lbnQgaW5mbyAqLworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIkNvbW1pdHRpbmcgbmV3IHNlZWsgc2VnbWVudCIpOworICBtZW1jcHkgKCZkZW11eC0+Y29tbW9uLnNlZ21lbnQsICZzZWVrc2VnbWVudCwgc2l6ZW9mIChHc3RTZWdtZW50KSk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisKKyAgLyogdXBkYXRlIHNvbWUgKHNlZ21lbnQpIHN0YXRlICovCisgIGlmICghZ3N0X21hdHJvc2thX2RlbXV4X21vdmVfdG9fZW50cnkgKGRlbXV4LCBlbnRyeSwgVFJVRSwgdXBkYXRlKSkKKyAgICBnb3RvIHNlZWtfZXJyb3I7CisKKyAgLyogbm90aWZ5IHN0YXJ0IG9mIG5ldyBzZWdtZW50ICovCisgIGlmIChkZW11eC0+Y29tbW9uLnNlZ21lbnQuZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NFR01FTlQpIHsKKyAgICBHc3RNZXNzYWdlICptc2c7CisKKyAgICBtc2cgPSBnc3RfbWVzc2FnZV9uZXdfc2VnbWVudF9zdGFydCAoR1NUX09CSkVDVCAoZGVtdXgpLAorICAgICAgICBHU1RfRk9STUFUX1RJTUUsIGRlbXV4LT5jb21tb24uc2VnbWVudC5zdGFydCk7CisgICAgZ3N0X21lc3NhZ2Vfc2V0X3NlcW51bSAobXNnLCBzZXFudW0pOworICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKGRlbXV4KSwgbXNnKTsKKyAgfQorCisgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICBpZiAoZGVtdXgtPm5ld19zZWdtZW50KQorICAgIGdzdF9ldmVudF91bnJlZiAoZGVtdXgtPm5ld19zZWdtZW50KTsKKworICAvKiBPbiBwb3J0IGZyb20gMC4xMCwgZGlzY2FyZGVkICF1cGRhdGUgKGZvciBzZWdtZW50LnVwZGF0ZSkgaGVyZSwgRklYTUU/ICovCisgIGRlbXV4LT5uZXdfc2VnbWVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJmRlbXV4LT5jb21tb24uc2VnbWVudCk7CisgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChkZW11eC0+bmV3X3NlZ21lbnQsIHNlcW51bSk7CisgIGlmIChkZW11eC0+Y29tbW9uLnNlZ21lbnQucmF0ZSA8IDAgJiYgZGVtdXgtPmNvbW1vbi5zZWdtZW50LnN0b3AgPT0gLTEpCisgICAgZGVtdXgtPnRvX3RpbWUgPSBkZW11eC0+Y29tbW9uLnNlZ21lbnQucG9zaXRpb247CisgIGVsc2UKKyAgICBkZW11eC0+dG9fdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGRlbXV4LT5zZWdtZW50X3NlcW51bSA9IHNlcW51bTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKworICAvKiByZXN0YXJ0IG91ciB0YXNrIHNpbmNlIGl0IG1pZ2h0IGhhdmUgYmVlbiBzdG9wcGVkIHdoZW4gd2UgZGlkIHRoZQorICAgKiBmbHVzaC4gKi8KKyAgZ3N0X3BhZF9zdGFydF90YXNrIChkZW11eC0+Y29tbW9uLnNpbmtwYWQsCisgICAgICAoR3N0VGFza0Z1bmN0aW9uKSBnc3RfbWF0cm9za2FfZGVtdXhfbG9vcCwgZGVtdXgtPmNvbW1vbi5zaW5rcGFkLCBOVUxMKTsKKworICAvKiBzdHJlYW1pbmcgY2FuIGNvbnRpbnVlIG5vdyAqLworICBpZiAocGFkX2xvY2tlZCkgeworICAgIEdTVF9QQURfU1RSRUFNX1VOTE9DSyAoZGVtdXgtPmNvbW1vbi5zaW5rcGFkKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworCitzZWVrX2Vycm9yOgorICB7CisgICAgaWYgKHBhZF9sb2NrZWQpIHsKKyAgICAgIEdTVF9QQURfU1RSRUFNX1VOTE9DSyAoZGVtdXgtPmNvbW1vbi5zaW5rcGFkKTsKKyAgICB9CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlbXV4LCBTVFJFQU0sIERFTVVYLCAoTlVMTCksICgiR290IGEgc2VlayBlcnJvciIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyoKKyAqIEhhbmRsZSB3aGV0aGVyIHdlIGNhbiBwZXJmb3JtIHRoZSBzZWVrIGV2ZW50IG9yIGlmIHdlIGhhdmUgdG8gbGV0IHRoZSBjaGFpbgorICogZnVuY3Rpb24gaGFuZGxlIHNlZWtzIHRvIGJ1aWxkIHRoZSBzZWVrIGluZGV4ZXMgZmlyc3QuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX3B1c2ggKEdzdE1hdHJvc2thRGVtdXggKiBkZW11eCwgR3N0UGFkICogcGFkLAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFNlZWtGbGFncyBmbGFnczsKKyAgR3N0U2Vla1R5cGUgY3VyX3R5cGUsIHN0b3BfdHlwZTsKKyAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgZ2RvdWJsZSByYXRlOworICBnaW50NjQgY3VyLCBzdG9wOworCisgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgJnJhdGUsICZmb3JtYXQsICZmbGFncywgJmN1cl90eXBlLCAmY3VyLAorICAgICAgJnN0b3BfdHlwZSwgJnN0b3ApOworCisgIC8qIHNhbml0eSBjaGVja3MgKi8KKworICAvKiB3ZSBjYW4gb25seSBzZWVrIG9uIHRpbWUgKi8KKyAgaWYgKGZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIkNhbiBvbmx5IHNlZWsgb24gVElNRSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmIChzdG9wX3R5cGUgIT0gR1NUX1NFRUtfVFlQRV9OT05FICYmIHN0b3AgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiU2VlayBlbmQtdGltZSBub3Qgc3VwcG9ydGVkIGluIHN0cmVhbWluZyBtb2RlIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKCEoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX0ZMVVNIKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAiTm9uLWZsdXNoaW5nIHNlZWsgbm90IHN1cHBvcnRlZCBpbiBzdHJlYW1pbmcgbW9kZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmIChmbGFncyAmIEdTVF9TRUVLX0ZMQUdfU0VHTUVOVCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiU2VnbWVudCBzZWVrIG5vdCBzdXBwb3J0ZWQgaW4gc3RyZWFtaW5nIG1vZGUiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBjaGVjayBmb3IgaGF2aW5nIHBhcnNlZCBpbmRleCBhbHJlYWR5ICovCisgIGlmICghZGVtdXgtPmNvbW1vbi5pbmRleF9wYXJzZWQpIHsKKyAgICBnYm9vbGVhbiBidWlsZGluZ19pbmRleDsKKyAgICBndWludDY0IG9mZnNldCA9IDA7CisKKyAgICBpZiAoIWRlbXV4LT5pbmRleF9vZmZzZXQpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAibm8gaW5kZXggKGxvY2F0aW9uKTsgbm8gc2VlayBpbiBwdXNoIG1vZGUiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgICAvKiBoYW5kbGUgdGhlIHNlZWsgZXZlbnQgaW4gdGhlIGNoYWluIGZ1bmN0aW9uICovCisgICAgZGVtdXgtPmNvbW1vbi5zdGF0ZSA9IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX1NFRUs7CisgICAgLyogbm8gbW9yZSBzZWVrIGNhbiBiZSBpc3N1ZWQgdW50aWwgc3RhdGUgcmVzZXQgdG8gX0RBVEEgKi8KKworICAgIC8qIGNvcHkgdGhlIGV2ZW50ICovCisgICAgaWYgKGRlbXV4LT5zZWVrX2V2ZW50KQorICAgICAgZ3N0X2V2ZW50X3VucmVmIChkZW11eC0+c2Vla19ldmVudCk7CisgICAgZGVtdXgtPnNlZWtfZXZlbnQgPSBnc3RfZXZlbnRfcmVmIChldmVudCk7CisKKyAgICAvKiBzZXQgdGhlIGJ1aWxkaW5nX2luZGV4IGZsYWcgc28gdGhhdCBvbmx5IG9uZSB0aHJlYWQgY2FuIHNldHVwIHRoZQorICAgICAqIHN0cnVjdHVyZXMgZm9yIGluZGV4IHNlZWtpbmcuICovCisgICAgYnVpbGRpbmdfaW5kZXggPSBkZW11eC0+YnVpbGRpbmdfaW5kZXg7CisgICAgaWYgKCFidWlsZGluZ19pbmRleCkgeworICAgICAgZGVtdXgtPmJ1aWxkaW5nX2luZGV4ID0gVFJVRTsKKyAgICAgIG9mZnNldCA9IGRlbXV4LT5pbmRleF9vZmZzZXQ7CisgICAgfQorICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisKKyAgICBpZiAoIWJ1aWxkaW5nX2luZGV4KSB7CisgICAgICAvKiBzZWVrIHRvIHRoZSBmaXJzdCBzdWJpbmRleCBvciBsZWdhY3kgaW5kZXggKi8KKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoZGVtdXgsICJTZWVraW5nIHRvIEN1ZXMgYXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwgb2Zmc2V0KTsKKyAgICAgIHJldHVybiBwZXJmb3JtX3NlZWtfdG9fb2Zmc2V0IChkZW11eCwgcmF0ZSwgb2Zmc2V0LAorICAgICAgICAgIGdzdF9ldmVudF9nZXRfc2VxbnVtIChldmVudCksIEdTVF9TRUVLX0ZMQUdfTk9ORSk7CisgICAgfQorCisgICAgLyogd2VsbCwgd2UgYXJlIGhhbmRsaW5nIGl0IGFscmVhZHkgKi8KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIC8qIGRlbGVnYXRlIHRvIHR3ZWFrZWQgcmVndWxhciBzZWVrICovCisgIHJldHVybiBnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NlZWtfZXZlbnQgKGRlbXV4LCBwYWQsIGV2ZW50KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0TWF0cm9za2FEZW11eCAqZGVtdXggPSBHU1RfTUFUUk9TS0FfREVNVVggKHBhcmVudCk7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICAgIC8qIG5vIHNlZWtpbmcgdW50aWwgd2UgYXJlIChzYWZlbHkpIHJlYWR5ICovCisgICAgICBpZiAoZGVtdXgtPmNvbW1vbi5zdGF0ZSAhPSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9EQVRBKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAibm90IHJlYWR5IGZvciBzZWVraW5nIHlldCIpOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorCisgICAgICB7CisgICAgICAgIGd1aW50MzIgc2VxbnVtID0gZ3N0X2V2ZW50X2dldF9zZXFudW0gKGV2ZW50KTsKKyAgICAgICAgaWYgKHNlcW51bSA9PSBkZW11eC0+c2VnbWVudF9zZXFudW0pIHsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocGFkLAorICAgICAgICAgICAgICAiRHJvcCBkdXBsaWNhdGVkIFNFRUsgZXZlbnQgc2VxbnVtICUiIEdfR1VJTlQzMl9GT1JNQVQsIHNlcW51bSk7CisgICAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKCFkZW11eC0+c3RyZWFtaW5nKQorICAgICAgICByZXMgPSBnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NlZWtfZXZlbnQgKGRlbXV4LCBwYWQsIGV2ZW50KTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmVzID0gZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX3B1c2ggKGRlbXV4LCBwYWQsIGV2ZW50KTsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdTVF9FVkVOVF9RT1M6CisgICAgeworICAgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKmNvbnRleHQgPSBnc3RfcGFkX2dldF9lbGVtZW50X3ByaXZhdGUgKHBhZCk7CisgICAgICBpZiAoY29udGV4dC0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9WSURFTykgeworICAgICAgICBHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICp2aWRlb2NvbnRleHQgPQorICAgICAgICAgICAgKEdzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQgKikgY29udGV4dDsKKyAgICAgICAgZ2RvdWJsZSBwcm9wb3J0aW9uOworICAgICAgICBHc3RDbG9ja1RpbWVEaWZmIGRpZmY7CisgICAgICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisKKyAgICAgICAgZ3N0X2V2ZW50X3BhcnNlX3FvcyAoZXZlbnQsIE5VTEwsICZwcm9wb3J0aW9uLCAmZGlmZiwgJnRpbWVzdGFtcCk7CisKKyAgICAgICAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgICAgICAgIHZpZGVvY29udGV4dC0+ZWFybGllc3RfdGltZSA9IHRpbWVzdGFtcCArIGRpZmY7CisgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgICB9CisgICAgICByZXMgPSBUUlVFOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdTVF9FVkVOVF9UT0NfU0VMRUNUOgorICAgIHsKKyAgICAgIGNoYXIgKnVpZCA9IE5VTEw7CisgICAgICBHc3RUb2NFbnRyeSAqZW50cnkgPSBOVUxMOworICAgICAgR3N0RXZlbnQgKnNlZWtfZXZlbnQ7CisgICAgICBnaW50NjQgc3RhcnRfcG9zOworCisgICAgICBpZiAoIWRlbXV4LT5jb21tb24udG9jKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAibm8gVE9DIHRvIHNlbGVjdCIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9IGVsc2UgeworICAgICAgICBnc3RfZXZlbnRfcGFyc2VfdG9jX3NlbGVjdCAoZXZlbnQsICZ1aWQpOworICAgICAgICBpZiAodWlkICE9IE5VTEwpIHsKKyAgICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgICAgICAgICBlbnRyeSA9IGdzdF90b2NfZmluZF9lbnRyeSAoZGVtdXgtPmNvbW1vbi50b2MsIHVpZCk7CisgICAgICAgICAgaWYgKGVudHJ5ID09IE5VTEwpIHsKKyAgICAgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAibm8gVE9DIGVudHJ5IHdpdGggZ2l2ZW4gVUlEOiAlcyIsIHVpZCk7CisgICAgICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ3N0X3RvY19lbnRyeV9nZXRfc3RhcnRfc3RvcF90aW1lcyAoZW50cnksICZzdGFydF9wb3MsIE5VTEwpOworICAgICAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKyAgICAgICAgICAgIHNlZWtfZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZWsgKDEuMCwKKyAgICAgICAgICAgICAgICBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgICAgICAgR1NUX1NFRUtfRkxBR19GTFVTSCwKKyAgICAgICAgICAgICAgICBHU1RfU0VFS19UWVBFX1NFVCwgc3RhcnRfcG9zLCBHU1RfU0VFS19UWVBFX1NFVCwgLTEpOworICAgICAgICAgICAgcmVzID0gZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX2V2ZW50IChkZW11eCwgcGFkLCBzZWVrX2V2ZW50KTsKKyAgICAgICAgICAgIGdzdF9ldmVudF91bnJlZiAoc2Vla19ldmVudCk7CisgICAgICAgICAgfQorICAgICAgICAgIGdfZnJlZSAodWlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAicmVjZWl2ZWQgZW1wdHkgVE9DIHNlbGVjdCBldmVudCIpOworICAgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgICB9CisgICAgICB9CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgICAgLyogZXZlbnRzIHdlIGRvbid0IG5lZWQgdG8gaGFuZGxlICovCisgICAgY2FzZSBHU1RfRVZFTlRfTkFWSUdBVElPTjoKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgcmVzID0gRkFMU0U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgR1NUX0VWRU5UX0xBVEVOQ1k6CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAoZGVtdXgtPmNvbW1vbi5zaW5rcGFkLCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfZGVtdXhfc2Vla190b19wcmV2aW91c19rZXlmcmFtZSAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4KQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgZ2Jvb2xlYW4gZG9uZSA9IFRSVUU7CisgIGdpbnQgaTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZGVtdXgtPnNlZWtfaW5kZXgsIEdTVF9GTE9XX0VPUyk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChkZW11eC0+c2Vla19lbnRyeSA8IGRlbXV4LT5zZWVrX2luZGV4LT5sZW4sCisgICAgICBHU1RfRkxPV19FT1MpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAibG9jYXRpbmcgcHJldmlvdXMga2V5ZnJhbWUiKTsKKworICBpZiAoIWRlbXV4LT5zZWVrX2VudHJ5KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJubyBlYXJsaWVyIGluZGV4IGVudHJ5Iik7CisgICAgZ290byBleGl0OworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGRlbXV4LT5jb21tb24uc3JjLT5sZW47IGkrKykgeworICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpzdHJlYW0gPSBnX3B0cl9hcnJheV9pbmRleCAoZGVtdXgtPmNvbW1vbi5zcmMsIGkpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJzZWdtZW50IHN0YXJ0ICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAiLCBzdHJlYW0gJWQgYXQgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+Y29tbW9uLnNlZ21lbnQuc3RhcnQpLCBzdHJlYW0tPmluZGV4LAorICAgICAgICBHU1RfVElNRV9BUkdTIChzdHJlYW0tPmZyb21fdGltZSkpOworICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtLT5mcm9tX3RpbWUpKSB7CisgICAgICBpZiAoc3RyZWFtLT5mcm9tX3RpbWUgPiBkZW11eC0+Y29tbW9uLnNlZ21lbnQuc3RhcnQpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJzdHJlYW0gJWQgbm90IGZpbmlzaGVkIHlldCIsIHN0cmVhbS0+aW5kZXgpOworICAgICAgICBkb25lID0gRkFMU0U7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIG5vdGhpbmcgcHVzaGVkIGZvciB0aGlzIHN0cmVhbTsKKyAgICAgICAqIGxpa2VseSBzZWVrIGVudHJ5IGRpZCBub3Qgc3RhcnQgYXQga2V5ZnJhbWUsIHNvIGFsbCB3YXMgc2tpcHBlZC4KKyAgICAgICAqIFNvIHdlIG5lZWQgYW4gZWFybGllciBlbnRyeSAqLworICAgICAgZG9uZSA9IEZBTFNFOworICAgIH0KKyAgfQorCisgIGlmICghZG9uZSkgeworICAgIEdzdE1hdHJvc2thSW5kZXggKmVudHJ5OworCisgICAgZW50cnkgPSAmZ19hcnJheV9pbmRleCAoZGVtdXgtPnNlZWtfaW5kZXgsIEdzdE1hdHJvc2thSW5kZXgsCisgICAgICAgIC0tZGVtdXgtPnNlZWtfZW50cnkpOworICAgIGlmICghZ3N0X21hdHJvc2thX2RlbXV4X21vdmVfdG9fZW50cnkgKGRlbXV4LCBlbnRyeSwgRkFMU0UsIFRSVUUpKQorICAgICAgZ290byBleGl0OworCisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgIH0KKworZXhpdDoKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV90cmFja3MgKEdzdE1hdHJvc2thRGVtdXggKiBkZW11eCwgR3N0RWJtbFJlYWQgKiBlYm1sKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludDMyIGlkOworCisgIERFQlVHX0VMRU1FTlRfU1RBUlQgKGRlbXV4LCBlYm1sLCAiVHJhY2tzIik7CisKKyAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICBERUJVR19FTEVNRU5UX1NUT1AgKGRlbXV4LCBlYm1sLCAiVHJhY2tzIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSyAmJiBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworCisgICAgc3dpdGNoIChpZCkgeworICAgICAgICAvKiBvbmUgdHJhY2sgd2l0aGluIHRoZSAiYWxsLXRyYWNrcyIgaGVhZGVyICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0VOVFJZOgorICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSAoZGVtdXgsIGVibWwpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX3NraXAgKCZkZW11eC0+Y29tbW9uLCBlYm1sLAorICAgICAgICAgICAgIlRyYWNrIiwgaWQpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgREVCVUdfRUxFTUVOVF9TVE9QIChkZW11eCwgZWJtbCwgIlRyYWNrcyIsIHJldCk7CisKKyAgZGVtdXgtPnRyYWNrc19wYXJzZWQgPSBUUlVFOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWFkIHNpZ25lZC91bnNpZ25lZCAiRUJNTCIgbnVtYmVycy4KKyAqIFJldHVybjogbnVtYmVyIG9mIGJ5dGVzIHByb2Nlc3NlZC4KKyAqLworCitzdGF0aWMgZ2ludAorZ3N0X21hdHJvc2thX2VibWxudW1fdWludCAoZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgc2l6ZSwgZ3VpbnQ2NCAqIG51bSkKK3sKKyAgZ2ludCBsZW5fbWFzayA9IDB4ODAsIHJlYWQgPSAxLCBuID0gMSwgbnVtX2ZmcyA9IDA7CisgIGd1aW50NjQgdG90YWw7CisKKyAgaWYgKHNpemUgPD0gMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHRvdGFsID0gZGF0YVswXTsKKyAgd2hpbGUgKHJlYWQgPD0gOCAmJiAhKHRvdGFsICYgbGVuX21hc2spKSB7CisgICAgcmVhZCsrOworICAgIGxlbl9tYXNrID4+PSAxOworICB9CisgIGlmIChyZWFkID4gOCkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKCh0b3RhbCAmPSAobGVuX21hc2sgLSAxKSkgPT0gbGVuX21hc2sgLSAxKQorICAgIG51bV9mZnMrKzsKKyAgaWYgKHNpemUgPCByZWFkKQorICAgIHJldHVybiAtMTsKKyAgd2hpbGUgKG4gPCByZWFkKSB7CisgICAgaWYgKGRhdGFbbl0gPT0gMHhmZikKKyAgICAgIG51bV9mZnMrKzsKKyAgICB0b3RhbCA9ICh0b3RhbCA8PCA4KSB8IGRhdGFbbl07CisgICAgbisrOworICB9CisKKyAgaWYgKHJlYWQgPT0gbnVtX2ZmcyAmJiB0b3RhbCAhPSAwKQorICAgICpudW0gPSBHX01BWFVJTlQ2NDsKKyAgZWxzZQorICAgICpudW0gPSB0b3RhbDsKKworICByZXR1cm4gcmVhZDsKK30KKworc3RhdGljIGdpbnQKK2dzdF9tYXRyb3NrYV9lYm1sbnVtX3NpbnQgKGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsIGdpbnQ2NCAqIG51bSkKK3sKKyAgZ3VpbnQ2NCB1bnVtOworICBnaW50IHJlczsKKworICAvKiByZWFkIGFzIHVuc2lnbmVkIG51bWJlciBmaXJzdCAqLworICBpZiAoKHJlcyA9IGdzdF9tYXRyb3NrYV9lYm1sbnVtX3VpbnQgKGRhdGEsIHNpemUsICZ1bnVtKSkgPCAwKQorICAgIHJldHVybiAtMTsKKworICAvKiBtYWtlIHNpZ25lZCAqLworICBpZiAodW51bSA9PSBHX01BWFVJTlQ2NCkKKyAgICAqbnVtID0gR19NQVhJTlQ2NDsKKyAgZWxzZQorICAgICpudW0gPSB1bnVtIC0gKCgxIDw8ICgoNyAqIHJlcykgLSAxKSkgLSAxKTsKKworICByZXR1cm4gcmVzOworfQorCisvKgorICogTW9zdGx5IHVzZWQgZm9yIHN1YnRpdGxlcy4gV2UgYWRkIHZvaWQgZmlsbGVyIGRhdGEgZm9yIGVhY2gKKyAqIGxhZ2dpbmcgc3RyZWFtIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBkZWFkbG9jay4KKyAqLworCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX2RlbXV4X3N5bmNfc3RyZWFtcyAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4KQoreworICBHc3RDbG9ja1RpbWUgZ2FwX3RocmVzaG9sZDsKKyAgZ2ludCBzdHJlYW1fbnI7CisKKyAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiU3luYyB0byAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+Y29tbW9uLnNlZ21lbnQucG9zaXRpb24pKTsKKworICBnX2Fzc2VydCAoZGVtdXgtPmNvbW1vbi5udW1fc3RyZWFtcyA9PSBkZW11eC0+Y29tbW9uLnNyYy0+bGVuKTsKKyAgZm9yIChzdHJlYW1fbnIgPSAwOyBzdHJlYW1fbnIgPCBkZW11eC0+Y29tbW9uLnNyYy0+bGVuOyBzdHJlYW1fbnIrKykgeworICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjb250ZXh0OworCisgICAgY29udGV4dCA9IGdfcHRyX2FycmF5X2luZGV4IChkZW11eC0+Y29tbW9uLnNyYywgc3RyZWFtX25yKTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwKKyAgICAgICAgIkNoZWNraW5nIGZvciByZXN5bmMgb24gc3RyZWFtICVkICglIiBHU1RfVElNRV9GT1JNQVQgIikiLCBzdHJlYW1fbnIsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGNvbnRleHQtPnBvcykpOworCisgICAgLyogT25seSBzZW5kIGdhcCBldmVudHMgb24gbm9uLXN1YnRpdGxlIHN0cmVhbXMgaWYgbGFnZ2luZyB3YXkgYmVoaW5kLgorICAgICAqIFRoZSAwLjUgc2Vjb25kIHRocmVzaG9sZCBmb3Igc3VidGl0bGUgc3RyZWFtcyBpcyBhbHNvIHF1aXRlIHJhbmRvbS4gKi8KKyAgICBpZiAoY29udGV4dC0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9TVUJUSVRMRSkKKyAgICAgIGdhcF90aHJlc2hvbGQgPSBHU1RfU0VDT05EIC8gMjsKKyAgICBlbHNlCisgICAgICBnYXBfdGhyZXNob2xkID0gMyAqIEdTVF9TRUNPTkQ7CisKKyAgICAvKiBMYWcgbmVlZCBvbmx5IGJlIGNvbnNpZGVyZWQgaWYgd2UgaGF2ZSBhZHZhbmNlZCBpbnRvIHJlcXVlc3RlZCBzZWdtZW50ICovCisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChjb250ZXh0LT5wb3MpICYmCisgICAgICAgIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChkZW11eC0+Y29tbW9uLnNlZ21lbnQucG9zaXRpb24pICYmCisgICAgICAgIGRlbXV4LT5jb21tb24uc2VnbWVudC5wb3NpdGlvbiA+IGRlbXV4LT5jb21tb24uc2VnbWVudC5zdGFydCAmJgorICAgICAgICBjb250ZXh0LT5wb3MgKyBnYXBfdGhyZXNob2xkIDwgZGVtdXgtPmNvbW1vbi5zZWdtZW50LnBvc2l0aW9uKSB7CisKKyAgICAgIEdzdEV2ZW50ICpldmVudDsKKyAgICAgIGd1aW50NjQgc3RhcnQgPSBjb250ZXh0LT5wb3M7CisgICAgICBndWludDY0IHN0b3AgPSBkZW11eC0+Y29tbW9uLnNlZ21lbnQucG9zaXRpb24gLSBnYXBfdGhyZXNob2xkOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAiU3luY2hyb25pemluZyBzdHJlYW0gJWQgd2l0aCBvdGhlciBieSBhZHZhbmNpbmcgdGltZSBmcm9tICUiCisgICAgICAgICAgR1NUX1RJTUVfRk9STUFUICIgdG8gJSIgR1NUX1RJTUVfRk9STUFULCBzdHJlYW1fbnIsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoc3RhcnQpLCBHU1RfVElNRV9BUkdTIChzdG9wKSk7CisKKyAgICAgIGNvbnRleHQtPnBvcyA9IHN0b3A7CisKKyAgICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19nYXAgKHN0YXJ0LCBzdG9wIC0gc3RhcnQpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoY29udGV4dC0+cGFkLCBldmVudCk7CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgICB9CisgIH0KKworICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlbXV4X3B1c2hfc3RyZWFtX2hlYWRlcnMgKEdzdE1hdHJvc2thRGVtdXggKiBkZW11eCwKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIHN0cmVhbSkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ2ludCBpLCBudW07CisKKyAgbnVtID0gZ3N0X2J1ZmZlcl9saXN0X2xlbmd0aCAoc3RyZWFtLT5zdHJlYW1faGVhZGVycyk7CisgIGZvciAoaSA9IDA7IGkgPCBudW07ICsraSkgeworICAgIEdzdEJ1ZmZlciAqYnVmOworCisgICAgYnVmID0gZ3N0X2J1ZmZlcl9saXN0X2dldCAoc3RyZWFtLT5zdHJlYW1faGVhZGVycywgaSk7CisgICAgYnVmID0gZ3N0X2J1ZmZlcl9jb3B5IChidWYpOworCisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSKTsKKworICAgIGlmIChzdHJlYW0tPnNldF9kaXNjb250KSB7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICAgIHN0cmVhbS0+c2V0X2Rpc2NvbnQgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICB9CisKKyAgICAvKiBwdXNoIG91dCBhbGwgaGVhZGVycyBpbiBvbmUgZ28gYW5kIHVzZSBsYXN0IGZsb3cgcmV0dXJuICovCisgICAgcmV0ID0gZ3N0X3BhZF9wdXNoIChzdHJlYW0tPnBhZCwgYnVmKTsKKyAgfQorCisgIC8qIGRvbid0IG5lZWQgdGhlc2UgYW55ICBsb25nZXIgKi8KKyAgZ3N0X2J1ZmZlcl9saXN0X3VucmVmIChzdHJlYW0tPnN0cmVhbV9oZWFkZXJzKTsKKyAgc3RyZWFtLT5zdHJlYW1faGVhZGVycyA9IE5VTEw7CisKKyAgLyogY29tYmluZSBmbG93cyAqLworICByZXQgPSBnc3RfZmxvd19jb21iaW5lcl91cGRhdGVfZmxvdyAoZGVtdXgtPmZsb3djb21iaW5lciwgcmV0KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX2RlbXV4X3B1c2hfZHZkX2NsdXRfY2hhbmdlX2V2ZW50IChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBzdHJlYW0pCit7CisgIGdjaGFyICpidWYsICpzdGFydDsKKworICBnX2Fzc2VydCAoIXN0cmNtcCAoc3RyZWFtLT5jb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1NVQlRJVExFX1ZPQlNVQikpOworCisgIGlmICghc3RyZWFtLT5jb2RlY19wcml2KQorICAgIHJldHVybjsKKworICAvKiBpZGVhbGx5LCBWb2JTdWIgcHJpdmF0ZSBkYXRhIHNob3VsZCBiZSBwYXJzZWQgYW5kIHN0b3JlZCBtb3JlIGNvbnZlbmllbnQKKyAgICogZWxzZXdoZXJlLCBidXQgZm9yIG5vdywgb25seSBpbnRlcmVzdGVkIGluIGEgc21hbGwgcGFydCAqLworCisgIC8qIG1ha2Ugc3VyZSB3ZSBoYXZlIHRlcm1pbmF0aW5nIDAgKi8KKyAgYnVmID0gZ19zdHJuZHVwIChzdHJlYW0tPmNvZGVjX3ByaXYsIHN0cmVhbS0+Y29kZWNfcHJpdl9zaXplKTsKKworICAvKiBqdXN0IGxvY2F0ZSBhbmQgcGFyc2UgcGFsZXR0ZSBwYXJ0ICovCisgIHN0YXJ0ID0gc3Ryc3RyIChidWYsICJwYWxldHRlOiIpOworICBpZiAoc3RhcnQpIHsKKyAgICBnaW50IGk7CisgICAgZ3VpbnQzMiBjbHV0WzE2XTsKKyAgICBndWludDMyIGNvbDsKKyAgICBndWludDggciwgZywgYiwgeSwgdSwgdjsKKworICAgIHN0YXJ0ICs9IDg7CisgICAgd2hpbGUgKGdfYXNjaWlfaXNzcGFjZSAoKnN0YXJ0KSkKKyAgICAgIHN0YXJ0Kys7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgIGlmIChzc2NhbmYgKHN0YXJ0LCAiJTA2eCIsICZjb2wpICE9IDEpCisgICAgICAgIGJyZWFrOworICAgICAgc3RhcnQgKz0gNjsKKyAgICAgIHdoaWxlICgoKnN0YXJ0ID09ICcsJykgfHwgZ19hc2NpaV9pc3NwYWNlICgqc3RhcnQpKQorICAgICAgICBzdGFydCsrOworICAgICAgLyogc2lnaCwgbmVlZCB0byBjb252ZXJ0IHRoaXMgZnJvbSB2b2JzdWIgcHNldWRvLVJHQiB0byBZVVYgKi8KKyAgICAgIHIgPSAoY29sID4+IDE2KSAmIDB4ZmY7CisgICAgICBnID0gKGNvbCA+PiA4KSAmIDB4ZmY7CisgICAgICBiID0gY29sICYgMHhmZjsKKyAgICAgIHkgPSBDTEFNUCAoKDAuMTQ5NCAqIHIgKyAwLjYwNjEgKiBnICsgMC4yNDQ1ICogYikgKiAyMTkgLyAyNTUgKyAxNiwgMCwKKyAgICAgICAgICAyNTUpOworICAgICAgdSA9IENMQU1QICgwLjYwNjYgKiByIC0gMC40MzIyICogZyAtIDAuMTc0NCAqIGIgKyAxMjgsIDAsIDI1NSk7CisgICAgICB2ID0gQ0xBTVAgKC0wLjA4NDM1ICogciAtIDAuMzQyMiAqIGcgKyAwLjQyNjYgKiBiICsgMTI4LCAwLCAyNTUpOworICAgICAgY2x1dFtpXSA9ICh5IDw8IDE2KSB8ICh1IDw8IDgpIHwgdjsKKyAgICB9CisKKyAgICAvKiBnb3QgdGhlbSBhbGwgd2l0aG91dCBwcm9ibGVtczsgYnVpbGQgYW5kIHNlbmQgZXZlbnQgKi8KKyAgICBpZiAoaSA9PSAxNikgeworICAgICAgR3N0U3RydWN0dXJlICpzOworCisgICAgICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LWdzdC1kdmQiLCAiZXZlbnQiLCBHX1RZUEVfU1RSSU5HLAorICAgICAgICAgICJkdmQtc3B1LWNsdXQtY2hhbmdlIiwgImNsdXQwMCIsIEdfVFlQRV9JTlQsIGNsdXRbMF0sICJjbHV0MDEiLAorICAgICAgICAgIEdfVFlQRV9JTlQsIGNsdXRbMV0sICJjbHV0MDIiLCBHX1RZUEVfSU5ULCBjbHV0WzJdLCAiY2x1dDAzIiwKKyAgICAgICAgICBHX1RZUEVfSU5ULCBjbHV0WzNdLCAiY2x1dDA0IiwgR19UWVBFX0lOVCwgY2x1dFs0XSwgImNsdXQwNSIsCisgICAgICAgICAgR19UWVBFX0lOVCwgY2x1dFs1XSwgImNsdXQwNiIsIEdfVFlQRV9JTlQsIGNsdXRbNl0sICJjbHV0MDciLAorICAgICAgICAgIEdfVFlQRV9JTlQsIGNsdXRbN10sICJjbHV0MDgiLCBHX1RZUEVfSU5ULCBjbHV0WzhdLCAiY2x1dDA5IiwKKyAgICAgICAgICBHX1RZUEVfSU5ULCBjbHV0WzldLCAiY2x1dDEwIiwgR19UWVBFX0lOVCwgY2x1dFsxMF0sICJjbHV0MTEiLAorICAgICAgICAgIEdfVFlQRV9JTlQsIGNsdXRbMTFdLCAiY2x1dDEyIiwgR19UWVBFX0lOVCwgY2x1dFsxMl0sICJjbHV0MTMiLAorICAgICAgICAgIEdfVFlQRV9JTlQsIGNsdXRbMTNdLCAiY2x1dDE0IiwgR19UWVBFX0lOVCwgY2x1dFsxNF0sICJjbHV0MTUiLAorICAgICAgICAgIEdfVFlQRV9JTlQsIGNsdXRbMTVdLCBOVUxMKTsKKworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzdHJlYW0tPnBhZCwKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9ET1dOU1RSRUFNX1NUSUNLWSwgcykpOworICAgIH0KKyAgfQorICBnX2ZyZWUgKGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfZGVtdXhfcHVzaF9jb2RlY19kYXRhX2FsbCAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4KQoreworICBnaW50IHN0cmVhbV9ucjsKKworICBnX2Fzc2VydCAoZGVtdXgtPmNvbW1vbi5udW1fc3RyZWFtcyA9PSBkZW11eC0+Y29tbW9uLnNyYy0+bGVuKTsKKyAgZm9yIChzdHJlYW1fbnIgPSAwOyBzdHJlYW1fbnIgPCBkZW11eC0+Y29tbW9uLnNyYy0+bGVuOyBzdHJlYW1fbnIrKykgeworICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpzdHJlYW07CisKKyAgICBzdHJlYW0gPSBnX3B0cl9hcnJheV9pbmRleCAoZGVtdXgtPmNvbW1vbi5zcmMsIHN0cmVhbV9ucik7CisKKyAgICBpZiAoc3RyZWFtLT5zZW5kX3N0cmVhbV9oZWFkZXJzKSB7CisgICAgICBpZiAoc3RyZWFtLT5zdHJlYW1faGVhZGVycyAhPSBOVUxMKSB7CisgICAgICAgIGdzdF9tYXRyb3NrYV9kZW11eF9wdXNoX3N0cmVhbV9oZWFkZXJzIChkZW11eCwgc3RyZWFtKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEZJWE1FOiBwZXJoYXBzIHdlIGNhbiBqdXN0IGRpc2FibGUgYW5kIHNraXAgdGhpcyBzdHJlYW0gdGhlbiAqLworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksCisgICAgICAgICAgICAoIkZhaWxlZCB0byBleHRyYWN0IHN0cmVhbSBoZWFkZXJzIGZyb20gY29kZWMgcHJpdmF0ZSBkYXRhIikpOworICAgICAgfQorICAgICAgc3RyZWFtLT5zZW5kX3N0cmVhbV9oZWFkZXJzID0gRkFMU0U7CisgICAgfQorCisgICAgaWYgKHN0cmVhbS0+c2VuZF9kdmRfZXZlbnQpIHsKKyAgICAgIGdzdF9tYXRyb3NrYV9kZW11eF9wdXNoX2R2ZF9jbHV0X2NoYW5nZV9ldmVudCAoZGVtdXgsIHN0cmVhbSk7CisgICAgICAvKiBGSVhNRTogc2hvdWxkIHdlIHNlbmQgdGhpcyBldmVudCBhZ2FpbiBhZnRlciAoZmx1c2hpbmcpIHNlZWsgPyAqLworICAgICAgc3RyZWFtLT5zZW5kX2R2ZF9ldmVudCA9IEZBTFNFOworICAgIH0KKyAgfQorCit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfZGVtdXhfYWRkX21wZWdfc2VxX2hlYWRlciAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBzdHJlYW0sIEdzdEJ1ZmZlciAqKiBidWYpCit7CisgIGd1aW50OCAqc2VxX2hlYWRlcjsKKyAgZ3VpbnQgc2VxX2hlYWRlcl9sZW47CisgIGd1aW50MzIgaGVhZGVyLCB0bXA7CisKKyAgaWYgKHN0cmVhbS0+Y29kZWNfc3RhdGUpIHsKKyAgICBzZXFfaGVhZGVyID0gc3RyZWFtLT5jb2RlY19zdGF0ZTsKKyAgICBzZXFfaGVhZGVyX2xlbiA9IHN0cmVhbS0+Y29kZWNfc3RhdGVfc2l6ZTsKKyAgfSBlbHNlIGlmIChzdHJlYW0tPmNvZGVjX3ByaXYpIHsKKyAgICBzZXFfaGVhZGVyID0gc3RyZWFtLT5jb2RlY19wcml2OworICAgIHNlcV9oZWFkZXJfbGVuID0gc3RyZWFtLT5jb2RlY19wcml2X3NpemU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CisKKyAgLyogU2VxdWVuY2UgaGVhZGVyIG9ubHkgbmVlZGVkIGZvciBrZXlmcmFtZXMgKi8KKyAgaWYgKEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKCpidWYsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKSkKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgaWYgKGdzdF9idWZmZXJfZ2V0X3NpemUgKCpidWYpIDwgNCkKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgZ3N0X2J1ZmZlcl9leHRyYWN0ICgqYnVmLCAwLCAmdG1wLCBzaXplb2YgKGd1aW50MzIpKTsKKyAgaGVhZGVyID0gR1VJTlQzMl9GUk9NX0JFICh0bXApOworCisgIC8qIFNlcXVlbmNlIHN0YXJ0IGNvZGUsIGlmIG5vdCBmb3VuZCBwcmVwZW5kICovCisgIGlmIChoZWFkZXIgIT0gMHgwMDAwMDFiMykgeworICAgIEdzdEJ1ZmZlciAqbmV3YnVmOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZWxlbWVudCwgIlByZXBlbmRpbmcgTVBFRyBzZXF1ZW5jZSBoZWFkZXIiKTsKKworICAgIG5ld2J1ZiA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGdfbWVtZHVwIChzZXFfaGVhZGVyLCBzZXFfaGVhZGVyX2xlbiksCisgICAgICAgIHNlcV9oZWFkZXJfbGVuKTsKKworICAgIGdzdF9idWZmZXJfY29weV9pbnRvIChuZXdidWYsICpidWYsIEdTVF9CVUZGRVJfQ09QWV9USU1FU1RBTVBTIHwKKyAgICAgICAgR1NUX0JVRkZFUl9DT1BZX0ZMQUdTIHwgR1NUX0JVRkZFUl9DT1BZX01FTU9SWSwgMCwKKyAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoKmJ1ZikpOworCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoKmJ1Zik7CisgICAgKmJ1ZiA9IG5ld2J1ZjsKKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9kZW11eF9hZGRfd3Zwa19oZWFkZXIgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICogc3RyZWFtLCBHc3RCdWZmZXIgKiogYnVmKQoreworICBHc3RNYXRyb3NrYVRyYWNrQXVkaW9Db250ZXh0ICphdWRpb2NvbnRleHQgPQorICAgICAgKEdzdE1hdHJvc2thVHJhY2tBdWRpb0NvbnRleHQgKikgc3RyZWFtOworICBHc3RCdWZmZXIgKm5ld2J1ZiA9IE5VTEw7CisgIEdzdE1hcEluZm8gbWFwLCBvdXRtYXA7CisgIGd1aW50OCAqYnVmX2RhdGEsICpkYXRhOworICBXYXZwYWNrNEhlYWRlciB3dmg7CisKKyAgd3ZoLmNrX2lkWzBdID0gJ3cnOworICB3dmguY2tfaWRbMV0gPSAndic7CisgIHd2aC5ja19pZFsyXSA9ICdwJzsKKyAgd3ZoLmNrX2lkWzNdID0gJ2snOworCisgIHd2aC52ZXJzaW9uID0gR1NUX1JFQURfVUlOVDE2X0xFIChzdHJlYW0tPmNvZGVjX3ByaXYpOworICB3dmgudHJhY2tfbm8gPSAwOworICB3dmguaW5kZXhfbm8gPSAwOworICB3dmgudG90YWxfc2FtcGxlcyA9IC0xOworICB3dmguYmxvY2tfaW5kZXggPSBhdWRpb2NvbnRleHQtPnd2cGtfYmxvY2tfaW5kZXg7CisKKyAgaWYgKGF1ZGlvY29udGV4dC0+Y2hhbm5lbHMgPD0gMikgeworICAgIGd1aW50MzIgYmxvY2tfc2FtcGxlcywgdG1wOworICAgIGdzaXplIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplICgqYnVmKTsKKworICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoKmJ1ZiwgMCwgJnRtcCwgc2l6ZW9mIChndWludDMyKSk7CisgICAgYmxvY2tfc2FtcGxlcyA9IEdVSU5UMzJfRlJPTV9MRSAodG1wKTsKKyAgICAvKiB3ZSBuZWVkIHRvIHJlY29uc3RydWN0IHRoZSBoZWFkZXIgb2YgdGhlIHdhdnBhY2sgYmxvY2sgKi8KKworICAgIC8qIC0yMCBiZWNhdXNlIGNrX3NpemUgaXMgdGhlIHNpemUgb2YgdGhlIHdhdnBhY2sgYmxvY2sgLTgKKyAgICAgKiBhbmQgbGFjZV9zaXplIGlzIHRoZSBzaXplIG9mIHRoZSB3YXZwYWNrIGJsb2NrICsgMTIKKyAgICAgKiAodGhlIHRocmVlIGd1aW50MzIgb2YgdGhlIGhlYWRlciB0aGF0IGFscmVhZHkgYXJlIGluIHRoZSBidWZmZXIpICovCisgICAgd3ZoLmNrX3NpemUgPSBzaXplICsgc2l6ZW9mIChXYXZwYWNrNEhlYWRlcikgLSAyMDsKKworICAgIC8qIGJsb2NrX3NhbXBsZXMsIGZsYWdzIGFuZCBjcmMgYXJlIGFscmVhZHkgaW4gdGhlIGJ1ZmZlciAqLworICAgIG5ld2J1ZiA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCBzaXplb2YgKFdhdnBhY2s0SGVhZGVyKSAtIDEyLCBOVUxMKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChuZXdidWYsICZvdXRtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgIGRhdGEgPSBvdXRtYXAuZGF0YTsKKyAgICBkYXRhWzBdID0gJ3cnOworICAgIGRhdGFbMV0gPSAndic7CisgICAgZGF0YVsyXSA9ICdwJzsKKyAgICBkYXRhWzNdID0gJ2snOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGRhdGEgKyA0LCB3dmguY2tfc2l6ZSk7CisgICAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoZGF0YSArIDgsIHd2aC52ZXJzaW9uKTsKKyAgICBHU1RfV1JJVEVfVUlOVDggKGRhdGEgKyAxMCwgd3ZoLnRyYWNrX25vKTsKKyAgICBHU1RfV1JJVEVfVUlOVDggKGRhdGEgKyAxMSwgd3ZoLmluZGV4X25vKTsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhICsgMTIsIHd2aC50b3RhbF9zYW1wbGVzKTsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhICsgMTYsIHd2aC5ibG9ja19pbmRleCk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAobmV3YnVmLCAmb3V0bWFwKTsKKworICAgIC8qIEFwcGVuZCBkYXRhIGZyb20gYnVmOiAqLworICAgIGdzdF9idWZmZXJfY29weV9pbnRvIChuZXdidWYsICpidWYsIEdTVF9CVUZGRVJfQ09QWV9USU1FU1RBTVBTIHwKKyAgICAgICAgR1NUX0JVRkZFUl9DT1BZX0ZMQUdTIHwgR1NUX0JVRkZFUl9DT1BZX01FTU9SWSwgMCwgc2l6ZSk7CisKKyAgICBnc3RfYnVmZmVyX3VucmVmICgqYnVmKTsKKyAgICAqYnVmID0gbmV3YnVmOworICAgIGF1ZGlvY29udGV4dC0+d3Zwa19ibG9ja19pbmRleCArPSBibG9ja19zYW1wbGVzOworICB9IGVsc2UgeworICAgIGd1aW50OCAqb3V0ZGF0YSA9IE5VTEw7CisgICAgZ3VpbnQgb3V0cG9zID0gMDsKKyAgICBnc2l6ZSBidWZfc2l6ZSwgc2l6ZSwgb3V0X3NpemUgPSAwOworICAgIGd1aW50MzIgYmxvY2tfc2FtcGxlcywgZmxhZ3MsIGNyYywgYmxvY2tzaXplOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKCpidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgYnVmX2RhdGEgPSBtYXAuZGF0YTsKKyAgICBidWZfc2l6ZSA9IG1hcC5zaXplOworCisgICAgaWYgKGJ1Zl9zaXplIDwgNCkgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAoZWxlbWVudCwgIlRvbyBzbWFsbCB3YXZwYWNrIGJ1ZmZlciIpOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoKmJ1ZiwgJm1hcCk7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgfQorCisgICAgZGF0YSA9IGJ1Zl9kYXRhOworICAgIHNpemUgPSBidWZfc2l6ZTsKKworICAgIGJsb2NrX3NhbXBsZXMgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEpOworICAgIGRhdGEgKz0gNDsKKyAgICBzaXplIC09IDQ7CisKKyAgICB3aGlsZSAoc2l6ZSA+IDEyKSB7CisgICAgICBmbGFncyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSk7CisgICAgICBkYXRhICs9IDQ7CisgICAgICBzaXplIC09IDQ7CisgICAgICBjcmMgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEpOworICAgICAgZGF0YSArPSA0OworICAgICAgc2l6ZSAtPSA0OworICAgICAgYmxvY2tzaXplID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKyAgICAgIGRhdGEgKz0gNDsKKyAgICAgIHNpemUgLT0gNDsKKworICAgICAgaWYgKGJsb2Nrc2l6ZSA9PSAwIHx8IHNpemUgPCBibG9ja3NpemUpCisgICAgICAgIGJyZWFrOworCisgICAgICBnX2Fzc2VydCAoKG5ld2J1ZiA9PSBOVUxMKSA9PSAob3V0ZGF0YSA9PSBOVUxMKSk7CisKKyAgICAgIGlmIChuZXdidWYgPT0gTlVMTCkgeworICAgICAgICBvdXRfc2l6ZSA9IHNpemVvZiAoV2F2cGFjazRIZWFkZXIpICsgYmxvY2tzaXplOworICAgICAgICBuZXdidWYgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgb3V0X3NpemUsIE5VTEwpOworCisgICAgICAgIGdzdF9idWZmZXJfY29weV9pbnRvIChuZXdidWYsICpidWYsCisgICAgICAgICAgICBHU1RfQlVGRkVSX0NPUFlfVElNRVNUQU1QUyB8IEdTVF9CVUZGRVJfQ09QWV9GTEFHUywgMCwgLTEpOworCisgICAgICAgIG91dHBvcyA9IDA7CisgICAgICAgIGdzdF9idWZmZXJfbWFwIChuZXdidWYsICZvdXRtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgICAgICBvdXRkYXRhID0gb3V0bWFwLmRhdGE7CisgICAgICB9IGVsc2UgeworICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChuZXdidWYsICZvdXRtYXApOworICAgICAgICBvdXRfc2l6ZSArPSBzaXplb2YgKFdhdnBhY2s0SGVhZGVyKSArIGJsb2Nrc2l6ZTsKKyAgICAgICAgZ3N0X2J1ZmZlcl9zZXRfc2l6ZSAobmV3YnVmLCBvdXRfc2l6ZSk7CisgICAgICAgIGdzdF9idWZmZXJfbWFwIChuZXdidWYsICZvdXRtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgICAgICBvdXRkYXRhID0gb3V0bWFwLmRhdGE7CisgICAgICB9CisKKyAgICAgIG91dGRhdGFbb3V0cG9zXSA9ICd3JzsKKyAgICAgIG91dGRhdGFbb3V0cG9zICsgMV0gPSAndic7CisgICAgICBvdXRkYXRhW291dHBvcyArIDJdID0gJ3AnOworICAgICAgb3V0ZGF0YVtvdXRwb3MgKyAzXSA9ICdrJzsKKyAgICAgIG91dHBvcyArPSA0OworCisgICAgICBHU1RfV1JJVEVfVUlOVDMyX0xFIChvdXRkYXRhICsgb3V0cG9zLAorICAgICAgICAgIGJsb2Nrc2l6ZSArIHNpemVvZiAoV2F2cGFjazRIZWFkZXIpIC0gOCk7CisgICAgICBHU1RfV1JJVEVfVUlOVDE2X0xFIChvdXRkYXRhICsgb3V0cG9zICsgNCwgd3ZoLnZlcnNpb24pOworICAgICAgR1NUX1dSSVRFX1VJTlQ4IChvdXRkYXRhICsgb3V0cG9zICsgNiwgd3ZoLnRyYWNrX25vKTsKKyAgICAgIEdTVF9XUklURV9VSU5UOCAob3V0ZGF0YSArIG91dHBvcyArIDcsIHd2aC5pbmRleF9ubyk7CisgICAgICBHU1RfV1JJVEVfVUlOVDMyX0xFIChvdXRkYXRhICsgb3V0cG9zICsgOCwgd3ZoLnRvdGFsX3NhbXBsZXMpOworICAgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAob3V0ZGF0YSArIG91dHBvcyArIDEyLCB3dmguYmxvY2tfaW5kZXgpOworICAgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAob3V0ZGF0YSArIG91dHBvcyArIDE2LCBibG9ja19zYW1wbGVzKTsKKyAgICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKG91dGRhdGEgKyBvdXRwb3MgKyAyMCwgZmxhZ3MpOworICAgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAob3V0ZGF0YSArIG91dHBvcyArIDI0LCBjcmMpOworICAgICAgb3V0cG9zICs9IDI4OworCisgICAgICBtZW1tb3ZlIChvdXRkYXRhICsgb3V0cG9zLCBkYXRhLCBibG9ja3NpemUpOworICAgICAgb3V0cG9zICs9IGJsb2Nrc2l6ZTsKKyAgICAgIGRhdGEgKz0gYmxvY2tzaXplOworICAgICAgc2l6ZSAtPSBibG9ja3NpemU7CisgICAgfQorICAgIGdzdF9idWZmZXJfdW5tYXAgKCpidWYsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKCpidWYpOworCisgICAgaWYgKG5ld2J1ZikKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKG5ld2J1ZiwgJm91dG1hcCk7CisKKyAgICAqYnVmID0gbmV3YnVmOworICAgIGF1ZGlvY29udGV4dC0+d3Zwa19ibG9ja19pbmRleCArPSBibG9ja19zYW1wbGVzOworICB9CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlbXV4X2FkZF9wcm9yZXNfaGVhZGVyIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIHN0cmVhbSwgR3N0QnVmZmVyICoqIGJ1ZikKK3sKKyAgR3N0QnVmZmVyICpuZXdidWYgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgOCwgTlVMTCk7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDMyIGZyYW1lX3NpemU7CisKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAobmV3YnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKSkgeworICAgIEdTVF9FUlJPUiAoIkZhaWxlZCB0byBtYXAgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIGZyYW1lX3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplICgqYnVmKTsKKworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChtYXAuZGF0YSwgZnJhbWVfc2l6ZSk7CisgIG1hcC5kYXRhWzRdID0gJ2knOworICBtYXAuZGF0YVs1XSA9ICdjJzsKKyAgbWFwLmRhdGFbNl0gPSAncCc7CisgIG1hcC5kYXRhWzddID0gJ2YnOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG5ld2J1ZiwgJm1hcCk7CisgICpidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAobmV3YnVmLCAqYnVmKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKKy8qIEB0ZXh0IG11c3QgYmUgbnVsbC10ZXJtaW5hdGVkICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9kZW11eF9zdWJ0aXRsZV9jaHVua19oYXNfdGFnIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBjb25zdCBnY2hhciAqIHRleHQpCit7CisgIGdjaGFyICp0YWc7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHRleHQgIT0gTlVMTCwgRkFMU0UpOworCisgIC8qIHllcywgdGhpcyBtaWdodCBhbGwgbGVhZCB0byBmYWxzZSBwb3NpdGl2ZXMgLi4uICovCisgIHRhZyA9IChnY2hhciAqKSB0ZXh0OworICB3aGlsZSAoKHRhZyA9IHN0cmNociAodGFnLCAnPCcpKSkgeworICAgIHRhZysrOworICAgIGlmICgqdGFnICE9ICdcMCcgJiYgKih0YWcgKyAxKSA9PSAnPicpIHsKKyAgICAgIC8qIHNvbWUgY29tbW9uIGNvbnZlbmllbmNlIG9uZXMgKi8KKyAgICAgIC8qIG1heWJlIGFueSBjaGFyYWN0ZXIgd2lsbCBkbyBoZXJlID8gKi8KKyAgICAgIHN3aXRjaCAoKnRhZykgeworICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgY2FzZSAnaSc6CisgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKHN0cnN0ciAodGV4dCwgIjxzcGFuIikpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlbXV4X2NoZWNrX3N1YnRpdGxlX2J1ZmZlciAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBzdHJlYW0sIEdzdEJ1ZmZlciAqKiBidWYpCit7CisgIEdzdE1hdHJvc2thVHJhY2tTdWJ0aXRsZUNvbnRleHQgKnN1Yl9zdHJlYW07CisgIGNvbnN0IGdjaGFyICplbmNvZGluZzsKKyAgR0Vycm9yICplcnIgPSBOVUxMOworICBHc3RCdWZmZXIgKm5ld2J1ZjsKKyAgZ2NoYXIgKnV0Zjg7CisgIEdzdE1hcEluZm8gbWFwOworICBnYm9vbGVhbiBuZWVkc191bm1hcCA9IFRSVUU7CisKKyAgc3ViX3N0cmVhbSA9IChHc3RNYXRyb3NrYVRyYWNrU3VidGl0bGVDb250ZXh0ICopIHN0cmVhbTsKKworICBpZiAoIWdzdF9idWZmZXJfZ2V0X3NpemUgKCpidWYpIHx8ICFnc3RfYnVmZmVyX21hcCAoKmJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKSkKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogVGhlIHN1YnRpdGxlIGJ1ZmZlciB3ZSBwdXNoIG91dCBzaG91bGQgbm90IGluY2x1ZGUgYSBOVUwgdGVybWluYXRvciBhcworICAgKiBwYXJ0IG9mIHRoZSBkYXRhLiAqLworICBpZiAobWFwLmRhdGFbbWFwLnNpemUgLSAxXSA9PSAnXDAnKSB7CisgICAgZ3N0X2J1ZmZlcl9zZXRfc2l6ZSAoKmJ1ZiwgbWFwLnNpemUgLSAxKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwICgqYnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX21hcCAoKmJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgfQorCisgIGlmICghc3ViX3N0cmVhbS0+aW52YWxpZF91dGY4KSB7CisgICAgaWYgKGdfdXRmOF92YWxpZGF0ZSAoKGdjaGFyICopIG1hcC5kYXRhLCBtYXAuc2l6ZSwgTlVMTCkpIHsKKyAgICAgIGdvdG8gbmV4dDsKKyAgICB9CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbGVtZW50LCAic3VidGl0bGUgc3RyZWFtICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICAgIiBpcyBub3QgdmFsaWQgVVRGLTgsIHRoaXMgaXMgYnJva2VuIGFjY29yZGluZyB0byB0aGUgbWF0cm9za2EiCisgICAgICAgICIgc3BlY2lmaWNhdGlvbiIsIHN0cmVhbS0+bnVtKTsKKyAgICBzdWJfc3RyZWFtLT5pbnZhbGlkX3V0ZjggPSBUUlVFOworICB9CisKKyAgLyogZmlsZSB3aXRoIGJyb2tlbiBub24tVVRGOCBzdWJ0aXRsZSwgZG8gdGhlIGJlc3Qgd2UgY2FuIGRvIHRvIGZpeCBpdCAqLworICBlbmNvZGluZyA9IGdfZ2V0ZW52ICgiR1NUX1NVQlRJVExFX0VOQ09ESU5HIik7CisgIGlmIChlbmNvZGluZyA9PSBOVUxMIHx8ICplbmNvZGluZyA9PSAnXDAnKSB7CisgICAgLyogaWYgbG9jYWwgZW5jb2RpbmcgaXMgVVRGLTggYW5kIG5vIGVuY29kaW5nIHNwZWNpZmllZAorICAgICAqIHZpYSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUsIGFzc3VtZSBJU08tODg1OS0xNSAqLworICAgIGlmIChnX2dldF9jaGFyc2V0ICgmZW5jb2RpbmcpKSB7CisgICAgICBlbmNvZGluZyA9ICJJU08tODg1OS0xNSI7CisgICAgfQorICB9CisKKyAgdXRmOCA9CisgICAgICBnX2NvbnZlcnRfd2l0aF9mYWxsYmFjayAoKGdjaGFyICopIG1hcC5kYXRhLCBtYXAuc2l6ZSwgIlVURi04IiwgZW5jb2RpbmcsCisgICAgICAoY2hhciAqKSAiKiIsIE5VTEwsIE5VTEwsICZlcnIpOworCisgIGlmIChlcnIpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoZWxlbWVudCwgImNvdWxkIG5vdCBjb252ZXJ0IHN0cmluZyBmcm9tICclcycgdG8gVVRGLTg6ICVzIiwKKyAgICAgICAgZW5jb2RpbmcsIGVyci0+bWVzc2FnZSk7CisgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICAgIGdfZnJlZSAodXRmOCk7CisKKyAgICAvKiBpbnZhbGlkIGlucHV0IGVuY29kaW5nLCBmYWxsIGJhY2sgdG8gSVNPLTg4NTktMTUgKGFsd2F5cyBzdWNjZWVkcykgKi8KKyAgICBlbmNvZGluZyA9ICJJU08tODg1OS0xNSI7CisgICAgdXRmOCA9CisgICAgICAgIGdfY29udmVydF93aXRoX2ZhbGxiYWNrICgoZ2NoYXIgKikgbWFwLmRhdGEsIG1hcC5zaXplLCAiVVRGLTgiLAorICAgICAgICBlbmNvZGluZywgKGNoYXIgKikgIioiLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChlbGVtZW50LCAiY29udmVydGVkIHN1YnRpdGxlIHRleHQgZnJvbSAlcyB0byBVVEYtOCAlcyIsCisgICAgICBlbmNvZGluZywgKGVycikgPyAiKHVzaW5nIElTTy04ODU5LTE1IGFzIGZhbGxiYWNrKSIgOiAiIik7CisKKyAgaWYgKHV0ZjggPT0gTlVMTCkKKyAgICB1dGY4ID0gZ19zdHJkdXAgKCJpbnZhbGlkIHN1YnRpdGxlIik7CisKKyAgbmV3YnVmID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAodXRmOCwgc3RybGVuICh1dGY4KSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKCpidWYsICZtYXApOworICBnc3RfYnVmZmVyX2NvcHlfaW50byAobmV3YnVmLCAqYnVmLAorICAgICAgR1NUX0JVRkZFUl9DT1BZX1RJTUVTVEFNUFMgfCBHU1RfQlVGRkVSX0NPUFlfRkxBR1MgfCBHU1RfQlVGRkVSX0NPUFlfTUVUQSwKKyAgICAgIDAsIC0xKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoKmJ1Zik7CisKKyAgKmJ1ZiA9IG5ld2J1ZjsKKyAgZ3N0X2J1ZmZlcl9tYXAgKCpidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKK25leHQ6CisKKyAgaWYgKHN1Yl9zdHJlYW0tPmNoZWNrX21hcmt1cCkgeworICAgIC8qIGNhcHMgY2xhaW0gbWFya3VwIHRleHQsIHNvIHdlIG5lZWQgdG8gZXNjYXBlIHRleHQsCisgICAgICogZXhjZXB0IGlmIHRleHQgaXMgYWxyZWFkeSBtYXJrdXAgYW5kIHRoZW4gbmVlZHMgbm8gZnVydGhlciBlc2NhcGluZyAqLworICAgIHN1Yl9zdHJlYW0tPnNlZW5fbWFya3VwX3RhZyA9IHN1Yl9zdHJlYW0tPnNlZW5fbWFya3VwX3RhZyB8fAorICAgICAgICBnc3RfbWF0cm9za2FfZGVtdXhfc3VidGl0bGVfY2h1bmtfaGFzX3RhZyAoZWxlbWVudCwgKGdjaGFyICopIG1hcC5kYXRhKTsKKworICAgIGlmICghc3ViX3N0cmVhbS0+c2Vlbl9tYXJrdXBfdGFnKSB7CisgICAgICB1dGY4ID0gZ19tYXJrdXBfZXNjYXBlX3RleHQgKChnY2hhciAqKSBtYXAuZGF0YSwgbWFwLnNpemUpOworCisgICAgICBuZXdidWYgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkICh1dGY4LCBzdHJsZW4gKHV0ZjgpKTsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKCpidWYsICZtYXApOworICAgICAgZ3N0X2J1ZmZlcl9jb3B5X2ludG8gKG5ld2J1ZiwgKmJ1ZiwKKyAgICAgICAgICBHU1RfQlVGRkVSX0NPUFlfVElNRVNUQU1QUyB8IEdTVF9CVUZGRVJfQ09QWV9GTEFHUyB8CisgICAgICAgICAgR1NUX0JVRkZFUl9DT1BZX01FVEEsIDAsIC0xKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKCpidWYpOworCisgICAgICAqYnVmID0gbmV3YnVmOworICAgICAgbmVlZHNfdW5tYXAgPSBGQUxTRTsKKyAgICB9CisgIH0KKworICBpZiAobmVlZHNfdW5tYXApCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoKmJ1ZiwgJm1hcCk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlbXV4X2NoZWNrX2FhYyAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBzdHJlYW0sIEdzdEJ1ZmZlciAqKiBidWYpCit7CisgIGd1aW50OCBkYXRhWzJdOworICBndWludCBzaXplOworCisgIGdzdF9idWZmZXJfZXh0cmFjdCAoKmJ1ZiwgMCwgZGF0YSwgMik7CisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplICgqYnVmKTsKKworICBpZiAoc2l6ZSA+IDIgJiYgZGF0YVswXSA9PSAweGZmICYmIChkYXRhWzFdID4+IDQgPT0gMHgwZikpIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgICAvKiB0c3MsIEFEVFMgZGF0YSwgcmVtb3ZlIGNvZGVjX2RhdGEKKyAgICAgKiBzdGlsbCBhc3N1bWUgaXQgaXMgYXQgbGVhc3QgcGFyc2VkICovCisgICAgc3RyZWFtLT5jYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoc3RyZWFtLT5jYXBzKTsKKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoc3RyZWFtLT5jYXBzLCAwKTsKKyAgICBnX2Fzc2VydCAocyk7CisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJjb2RlY19kYXRhIik7CisgICAgZ3N0X3BhZF9zZXRfY2FwcyAoc3RyZWFtLT5wYWQsIHN0cmVhbS0+Y2Fwcyk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZWxlbWVudCwgIkFEVFMgQUFDIGF1ZGlvIGRhdGE7IHJlbW92aW5nIGNvZGVjLWRhdGEsICIKKyAgICAgICAgIm5ldyBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgc3RyZWFtLT5jYXBzKTsKKyAgfQorCisgIC8qIGRpc2FibGUgc3Vic2VxdWVudCBjaGVja2luZyAqLworICBzdHJlYW0tPnBvc3Rwcm9jZXNzX2ZyYW1lID0gTlVMTDsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X21hdHJvc2thX2RlbXV4X2FsaWduX2J1ZmZlciAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlciwgZ3NpemUgYWxpZ25tZW50KQoreworICBHc3RNYXBJbmZvIG1hcDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIGlmIChtYXAuc2l6ZSA8IHNpemVvZiAoZ3VpbnRwdHIpKSB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICByZXR1cm4gYnVmZmVyOworICB9CisKKyAgaWYgKCgoZ3VpbnRwdHIpIG1hcC5kYXRhKSAmIChhbGlnbm1lbnQgLSAxKSkgeworICAgIEdzdEJ1ZmZlciAqbmV3X2J1ZmZlcjsKKyAgICBHc3RBbGxvY2F0aW9uUGFyYW1zIHBhcmFtcyA9IHsgMCwgYWxpZ25tZW50IC0gMSwgMCwgMCwgfTsKKworICAgIG5ld19idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwKKyAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSwgJnBhcmFtcyk7CisKKyAgICAvKiBDb3B5IGRhdGEgImJ5IGhhbmQiLCBzbyBlbnN1cmUgYWxpZ25tZW50IGlzIGtlcHQ6ICovCisgICAgZ3N0X2J1ZmZlcl9maWxsIChuZXdfYnVmZmVyLCAwLCBtYXAuZGF0YSwgbWFwLnNpemUpOworCisgICAgZ3N0X2J1ZmZlcl9jb3B5X2ludG8gKG5ld19idWZmZXIsIGJ1ZmZlciwgR1NUX0JVRkZFUl9DT1BZX01FVEFEQVRBLCAwLCAtMSk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICJXZSB3YW50IG91dHB1dCBhbGlnbmVkIG9uICUiIEdfR1NJWkVfRk9STUFUICIsIHJlYWxsb2NhdGVkIiwKKyAgICAgICAgYWxpZ25tZW50KTsKKworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICAgIHJldHVybiBuZXdfYnVmZmVyOworICB9CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrIChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgsCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sLCBndWludDY0IGNsdXN0ZXJfdGltZSwgZ3VpbnQ2NCBjbHVzdGVyX29mZnNldCwKKyAgICBnYm9vbGVhbiBpc19zaW1wbGVibG9jaykKK3sKKyAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKnN0cmVhbSA9IE5VTEw7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGdib29sZWFuIHJlYWRibG9jayA9IEZBTFNFOworICBndWludDMyIGlkOworICBndWludDY0IGJsb2NrX2R1cmF0aW9uID0gLTE7CisgIGdpbnQ2NCBibG9ja19kaXNjYXJkcGFkZGluZyA9IDA7CisgIEdzdEJ1ZmZlciAqYnVmID0gTlVMTDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdpbnQgc3RyZWFtX251bSA9IC0xLCBuLCBsYWNlcyA9IDA7CisgIGd1aW50IHNpemUgPSAwOworICBnaW50ICpsYWNlX3NpemUgPSBOVUxMOworICBnaW50NjQgdGltZSA9IDA7CisgIGdpbnQgZmxhZ3MgPSAwOworICBnaW50NjQgcmVmZXJlbmNlYmxvY2sgPSAwOworICBnaW50NjQgb2Zmc2V0OworICBHc3RDbG9ja1RpbWUgYnVmZmVyX3RpbWVzdGFtcDsKKworICBvZmZzZXQgPSBnc3RfZWJtbF9yZWFkX2dldF9vZmZzZXQgKGVibWwpOworCisgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgIGlmICghaXNfc2ltcGxlYmxvY2spIHsKKyAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgICAgZ290byBkYXRhX2Vycm9yOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZCA9IEdTVF9NQVRST1NLQV9JRF9TSU1QTEVCTE9DSzsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICAgIC8qIG9uZSBibG9jayBpbnNpZGUgdGhlIGdyb3VwLiBOb3RlLCBibG9jayBwYXJzaW5nIGlzIG9uZQorICAgICAgICAgKiBvZiB0aGUgaGFyZGVyIHRoaW5ncywgc28gdGhpcyBjb2RlIGlzIGEgYml0IGNvbXBsaWNhdGVkLgorICAgICAgICAgKiBTZWUgaHR0cDovL3d3dy5tYXRyb3NrYS5vcmcvIGZvciBkb2N1bWVudGF0aW9uLiAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfU0lNUExFQkxPQ0s6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9CTE9DSzoKKyAgICAgIHsKKyAgICAgICAgZ3VpbnQ2NCBudW07CisgICAgICAgIGd1aW50OCAqZGF0YTsKKworICAgICAgICBpZiAoYnVmKSB7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgIGJ1ZiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX2J1ZmZlciAoZWJtbCwgJmlkLCAmYnVmKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgICAgZGF0YSA9IG1hcC5kYXRhOworICAgICAgICBzaXplID0gbWFwLnNpemU7CisKKyAgICAgICAgLyogZmlyc3QgYnl0ZShzKTogYmxvY2tudW0gKi8KKyAgICAgICAgaWYgKChuID0gZ3N0X21hdHJvc2thX2VibWxudW1fdWludCAoZGF0YSwgc2l6ZSwgJm51bSkpIDwgMCkKKyAgICAgICAgICBnb3RvIGRhdGFfZXJyb3I7CisgICAgICAgIGRhdGEgKz0gbjsKKyAgICAgICAgc2l6ZSAtPSBuOworCisgICAgICAgIC8qIGZldGNoIHN0cmVhbSBmcm9tIG51bSAqLworICAgICAgICBzdHJlYW1fbnVtID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3N0cmVhbV9mcm9tX251bSAoJmRlbXV4LT5jb21tb24sCisgICAgICAgICAgICBudW0pOworICAgICAgICBpZiAoR19VTkxJS0VMWSAoc2l6ZSA8IDMpKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIkludmFsaWQgc2l6ZSAldSIsIHNpemUpOworICAgICAgICAgIC8qIG5vbi1mYXRhbCwgdHJ5IG5leHQgYmxvY2soZ3JvdXApICovCisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9IGVsc2UgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbV9udW0gPCAwIHx8CisgICAgICAgICAgICAgICAgc3RyZWFtX251bSA+PSBkZW11eC0+Y29tbW9uLm51bV9zdHJlYW1zKSkgeworICAgICAgICAgIC8qIGxldCdzIG5vdCBnaXZlIHVwIG9uIGEgc3RyYXkgaW52YWxpZCB0cmFjayBudW1iZXIgKi8KKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgICAiSW52YWxpZCBzdHJlYW0gJWQgZm9yIHRyYWNrIG51bWJlciAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgICAgICI7IGlnbm9yaW5nIGJsb2NrIiwgc3RyZWFtX251bSwgbnVtKTsKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKworICAgICAgICBzdHJlYW0gPSBnX3B0cl9hcnJheV9pbmRleCAoZGVtdXgtPmNvbW1vbi5zcmMsIHN0cmVhbV9udW0pOworCisgICAgICAgIC8qIHRpbWUgKHJlbGF0aXZlIHRvIGNsdXN0ZXIgdGltZSkgKi8KKyAgICAgICAgdGltZSA9ICgoZ2ludDE2KSBHU1RfUkVBRF9VSU5UMTZfQkUgKGRhdGEpKTsKKyAgICAgICAgZGF0YSArPSAyOworICAgICAgICBzaXplIC09IDI7CisgICAgICAgIGZsYWdzID0gR1NUX1JFQURfVUlOVDggKGRhdGEpOworICAgICAgICBkYXRhICs9IDE7CisgICAgICAgIHNpemUgLT0gMTsKKworICAgICAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJ0aW1lICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgZmxhZ3MgJWQiLCB0aW1lLAorICAgICAgICAgICAgZmxhZ3MpOworCisgICAgICAgIHN3aXRjaCAoKGZsYWdzICYgMHgwNikgPj4gMSkgeworICAgICAgICAgIGNhc2UgMHgwOiAgICAgICAgICAgIC8qIG5vIGxhY2luZyAqLworICAgICAgICAgICAgbGFjZXMgPSAxOworICAgICAgICAgICAgbGFjZV9zaXplID0gZ19uZXcgKGdpbnQsIDEpOworICAgICAgICAgICAgbGFjZV9zaXplWzBdID0gc2l6ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDE6ICAgICAgICAgICAgLyogeGlwaCBsYWNpbmcgKi8KKyAgICAgICAgICBjYXNlIDB4MjogICAgICAgICAgICAvKiBmaXhlZC1zaXplIGxhY2luZyAqLworICAgICAgICAgIGNhc2UgMHgzOiAgICAgICAgICAgIC8qIEVCTUwgbGFjaW5nICovCisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgICAgICAgICBnb3RvIGludmFsaWRfbGFjaW5nOworICAgICAgICAgICAgbGFjZXMgPSBHU1RfUkVBRF9VSU5UOCAoZGF0YSkgKyAxOworICAgICAgICAgICAgZGF0YSArPSAxOworICAgICAgICAgICAgc2l6ZSAtPSAxOworICAgICAgICAgICAgbGFjZV9zaXplID0gZ19uZXcwIChnaW50LCBsYWNlcyk7CisKKyAgICAgICAgICAgIHN3aXRjaCAoKGZsYWdzICYgMHgwNikgPj4gMSkgeworICAgICAgICAgICAgICBjYXNlIDB4MTogICAgICAgIC8qIHhpcGggbGFjaW5nICovICB7CisgICAgICAgICAgICAgICAgZ3VpbnQgdGVtcCwgdG90YWwgPSAwOworCisgICAgICAgICAgICAgICAgZm9yIChuID0gMDsgcmV0ID09IEdTVF9GTE9XX09LICYmIG4gPCBsYWNlcyAtIDE7IG4rKykgeworICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICBnb3RvIGludmFsaWRfbGFjaW5nOworICAgICAgICAgICAgICAgICAgICB0ZW1wID0gR1NUX1JFQURfVUlOVDggKGRhdGEpOworICAgICAgICAgICAgICAgICAgICBsYWNlX3NpemVbbl0gKz0gdGVtcDsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSArPSAxOworICAgICAgICAgICAgICAgICAgICBzaXplIC09IDE7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wICE9IDB4ZmYpCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB0b3RhbCArPSBsYWNlX3NpemVbbl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhY2Vfc2l6ZVtuXSA9IHNpemUgLSB0b3RhbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNhc2UgMHgyOiAgICAgICAgLyogZml4ZWQtc2l6ZSBsYWNpbmcgKi8KKyAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbGFjZXM7IG4rKykKKyAgICAgICAgICAgICAgICAgIGxhY2Vfc2l6ZVtuXSA9IHNpemUgLyBsYWNlczsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIDB4MzogICAgICAgIC8qIEVCTUwgbGFjaW5nICovICB7CisgICAgICAgICAgICAgICAgZ3VpbnQgdG90YWw7CisKKyAgICAgICAgICAgICAgICBpZiAoKG4gPSBnc3RfbWF0cm9za2FfZWJtbG51bV91aW50IChkYXRhLCBzaXplLCAmbnVtKSkgPCAwKQorICAgICAgICAgICAgICAgICAgZ290byBkYXRhX2Vycm9yOworICAgICAgICAgICAgICAgIGRhdGEgKz0gbjsKKyAgICAgICAgICAgICAgICBzaXplIC09IG47CisgICAgICAgICAgICAgICAgdG90YWwgPSBsYWNlX3NpemVbMF0gPSBudW07CisgICAgICAgICAgICAgICAgZm9yIChuID0gMTsgcmV0ID09IEdTVF9GTE9XX09LICYmIG4gPCBsYWNlcyAtIDE7IG4rKykgeworICAgICAgICAgICAgICAgICAgZ2ludDY0IHNudW07CisgICAgICAgICAgICAgICAgICBnaW50IHI7CisKKyAgICAgICAgICAgICAgICAgIGlmICgociA9IGdzdF9tYXRyb3NrYV9lYm1sbnVtX3NpbnQgKGRhdGEsIHNpemUsICZzbnVtKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGRhdGFfZXJyb3I7CisgICAgICAgICAgICAgICAgICBkYXRhICs9IHI7CisgICAgICAgICAgICAgICAgICBzaXplIC09IHI7CisgICAgICAgICAgICAgICAgICBsYWNlX3NpemVbbl0gPSBsYWNlX3NpemVbbiAtIDFdICsgc251bTsKKyAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGxhY2Vfc2l6ZVtuXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG4gPCBsYWNlcykKKyAgICAgICAgICAgICAgICAgIGxhY2Vfc2l6ZVtuXSA9IHNpemUgLSB0b3RhbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHJlYWRibG9jayA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9CTE9DS0RVUkFUSU9OOnsKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZibG9ja19kdXJhdGlvbik7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiQmxvY2tEdXJhdGlvbjogJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgIGJsb2NrX2R1cmF0aW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0RJU0NBUkRQQURESU5HOnsKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9zaW50IChlYm1sLCAmaWQsICZibG9ja19kaXNjYXJkcGFkZGluZyk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiRGlzY2FyZFBhZGRpbmc6ICUiIEdTVF9TVElNRV9GT1JNQVQsCisgICAgICAgICAgICBHU1RfU1RJTUVfQVJHUyAoYmxvY2tfZGlzY2FyZHBhZGRpbmcpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1JFRkVSRU5DRUJMT0NLOnsKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9zaW50IChlYm1sLCAmaWQsICZyZWZlcmVuY2VibG9jayk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiUmVmZXJlbmNlQmxvY2s6ICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgIHJlZmVyZW5jZWJsb2NrKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPREVDU1RBVEU6eworICAgICAgICBndWludDggKmRhdGE7CisgICAgICAgIGd1aW50NjQgZGF0YV9sZW4gPSAwOworCisgICAgICAgIGlmICgocmV0ID0KKyAgICAgICAgICAgICAgICBnc3RfZWJtbF9yZWFkX2JpbmFyeSAoZWJtbCwgJmlkLCAmZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgJmRhdGFfbGVuKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbSA9PSBOVUxMKSkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICJVbmV4cGVjdGVkIENvZGVjU3RhdGUgc3ViZWxlbWVudCAtIGlnbm9yaW5nIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBnX2ZyZWUgKHN0cmVhbS0+Y29kZWNfc3RhdGUpOworICAgICAgICBzdHJlYW0tPmNvZGVjX3N0YXRlID0gZGF0YTsKKyAgICAgICAgc3RyZWFtLT5jb2RlY19zdGF0ZV9zaXplID0gZGF0YV9sZW47CisKKyAgICAgICAgLyogRGVjb2RlIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICBpZiAoc3RyZWFtLT5lbmNvZGluZ3MgJiYgc3RyZWFtLT5lbmNvZGluZ3MtPmxlbiA+IDAKKyAgICAgICAgICAgICYmIHN0cmVhbS0+Y29kZWNfc3RhdGUgJiYgc3RyZWFtLT5jb2RlY19zdGF0ZV9zaXplID4gMCkgeworICAgICAgICAgIGlmICghZ3N0X21hdHJvc2thX2RlY29kZV9kYXRhIChzdHJlYW0tPmVuY29kaW5ncywKKyAgICAgICAgICAgICAgICAgICZzdHJlYW0tPmNvZGVjX3N0YXRlLCAmc3RyZWFtLT5jb2RlY19zdGF0ZV9zaXplLAorICAgICAgICAgICAgICAgICAgR1NUX01BVFJPU0tBX1RSQUNLX0VOQ09ESU5HX1NDT1BFX0NPREVDX0RBVEEsIFRSVUUpKSB7CisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiRGVjb2RpbmcgY29kZWMgc3RhdGUgZmFpbGVkIik7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJDb2RlY1N0YXRlIG9mICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMiLAorICAgICAgICAgICAgc3RyZWFtLT5jb2RlY19zdGF0ZV9zaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwICgmZGVtdXgtPmNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICJCbG9ja0dyb3VwIiwgaWQpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQkxPQ0tWSVJUVUFMOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQkxPQ0tBRERJVElPTlM6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9SRUZFUkVOQ0VQUklPUklUWToKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1JFRkVSRU5DRVZJUlRVQUw6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TTElDRVM6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgIlNraXBwaW5nIEJsb2NrR3JvdXAgc3ViZWxlbWVudCAweCV4IC0gaWdub3JpbmciLCBpZCk7CisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfc2tpcCAoZWJtbCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChpc19zaW1wbGVibG9jaykKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogcmVhZGluZyBhIG51bWJlciBvciBzbyBjb3VsZCBoYXZlIGZhaWxlZCAqLworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gZGF0YV9lcnJvcjsKKworICBpZiAocmV0ID09IEdTVF9GTE9XX09LICYmIHJlYWRibG9jaykgeworICAgIGdib29sZWFuIGludmlzaWJsZV9mcmFtZSA9IEZBTFNFOworICAgIGdib29sZWFuIGRlbHRhX3VuaXQgPSBGQUxTRTsKKyAgICBndWludDY0IGR1cmF0aW9uID0gMDsKKyAgICBnaW50NjQgbGFjZV90aW1lID0gMDsKKworICAgIHN0cmVhbSA9IGdfcHRyX2FycmF5X2luZGV4IChkZW11eC0+Y29tbW9uLnNyYywgc3RyZWFtX251bSk7CisKKyAgICBpZiAoY2x1c3Rlcl90aW1lICE9IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICAgIC8qIEZJWE1FOiBXaGF0IHRvIGRvIHdpdGggbmVnYXRpdmUgdGltZXN0YW1wcz8gR2l2ZSB0aW1lc3RhbXAgMCBvciAtMT8KKyAgICAgICAqIERyb3AgdW5sZXNzIHRoZSBsYWNlIGNvbnRhaW5zIHRpbWVzdGFtcCAwPyAqLworICAgICAgaWYgKHRpbWUgPCAwICYmICgtdGltZSkgPiBjbHVzdGVyX3RpbWUpIHsKKyAgICAgICAgbGFjZV90aW1lID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzdHJlYW0tPnRpbWVjb2Rlc2NhbGUgPT0gMS4wKQorICAgICAgICAgIGxhY2VfdGltZSA9IChjbHVzdGVyX3RpbWUgKyB0aW1lKSAqIGRlbXV4LT5jb21tb24udGltZV9zY2FsZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGxhY2VfdGltZSA9CisgICAgICAgICAgICAgIGdzdF91dGlsX2d1aW50NjRfdG9fZ2RvdWJsZSAoKGNsdXN0ZXJfdGltZSArIHRpbWUpICoKKyAgICAgICAgICAgICAgZGVtdXgtPmNvbW1vbi50aW1lX3NjYWxlKSAqIHN0cmVhbS0+dGltZWNvZGVzY2FsZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgbGFjZV90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICB9CisKKyAgICAvKiBuZWVkIHRvIHJlZnJlc2ggc2VnbWVudCBpbmZvIEFTQVAgKi8KKyAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGxhY2VfdGltZSkgJiYgZGVtdXgtPm5lZWRfc2VnbWVudCkgeworICAgICAgR3N0U2VnbWVudCAqc2VnbWVudCA9ICZkZW11eC0+Y29tbW9uLnNlZ21lbnQ7CisgICAgICBndWludDY0IGNsYWNlX3RpbWU7CisgICAgICBHc3RFdmVudCAqc2VnbWVudF9ldmVudDsKKworICAgICAgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lKSkgeworICAgICAgICBkZW11eC0+c3RyZWFtX3N0YXJ0X3RpbWUgPSBsYWNlX3RpbWU7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgIlNldHRpbmcgc3RyZWFtIHN0YXJ0IHRpbWUgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAobGFjZV90aW1lKSk7CisgICAgICB9CisgICAgICBjbGFjZV90aW1lID0gTUFYIChsYWNlX3RpbWUsIGRlbXV4LT5zdHJlYW1fc3RhcnRfdGltZSk7CisgICAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGRlbXV4LT5jb21tb24uc2VnbWVudC5wb3NpdGlvbikgJiYKKyAgICAgICAgICBkZW11eC0+Y29tbW9uLnNlZ21lbnQucG9zaXRpb24gIT0gMCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICJ1c2luZyBzdG9yZWQgc2VlayBwb3NpdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+Y29tbW9uLnNlZ21lbnQucG9zaXRpb24pKTsKKyAgICAgICAgY2xhY2VfdGltZSA9IGRlbXV4LT5jb21tb24uc2VnbWVudC5wb3NpdGlvbjsKKyAgICAgICAgc2VnbWVudC0+cG9zaXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgICAgfQorICAgICAgc2VnbWVudC0+c3RhcnQgPSBjbGFjZV90aW1lOworICAgICAgc2VnbWVudC0+c3RvcCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICBzZWdtZW50LT50aW1lID0gc2VnbWVudC0+c3RhcnQgLSBkZW11eC0+c3RyZWFtX3N0YXJ0X3RpbWU7CisgICAgICBzZWdtZW50LT5wb3NpdGlvbiA9IHNlZ21lbnQtPnN0YXJ0IC0gZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgImdlbmVyYXRlZCBzZWdtZW50IHN0YXJ0aW5nIGF0ICUiIEdTVF9USU1FX0ZPUk1BVCAiOiAlIgorICAgICAgICAgIEdTVF9TRUdNRU5UX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAobGFjZV90aW1lKSwgc2VnbWVudCk7CisgICAgICAvKiBub3cgY29udmV5IG91ciBzZWdtZW50IG5vdGlvbiBkb3duc3RyZWFtICovCisgICAgICBzZWdtZW50X2V2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50IChzZWdtZW50KTsKKyAgICAgIGlmIChkZW11eC0+c2VnbWVudF9zZXFudW0pCisgICAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChzZWdtZW50X2V2ZW50LCBkZW11eC0+c2VnbWVudF9zZXFudW0pOworICAgICAgZ3N0X21hdHJvc2thX2RlbXV4X3NlbmRfZXZlbnQgKGRlbXV4LCBzZWdtZW50X2V2ZW50KTsKKyAgICAgIGRlbXV4LT5uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKyAgICAgIGRlbXV4LT5zZWdtZW50X3NlcW51bSA9IDA7CisgICAgfQorCisgICAgLyogc2VuZCBwZW5kaW5nIGNvZGVjIGRhdGEgaGVhZGVycyBmb3IgYWxsIHN0cmVhbXMsCisgICAgICogYmVmb3JlIHdlIHBlcmZvcm0gc3luYyBhY3Jvc3MgYWxsIHN0cmVhbXMgKi8KKyAgICBnc3RfbWF0cm9za2FfZGVtdXhfcHVzaF9jb2RlY19kYXRhX2FsbCAoZGVtdXgpOworCisgICAgaWYgKGJsb2NrX2R1cmF0aW9uICE9IC0xKSB7CisgICAgICBpZiAoc3RyZWFtLT50aW1lY29kZXNjYWxlID09IDEuMCkKKyAgICAgICAgZHVyYXRpb24gPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGJsb2NrX2R1cmF0aW9uLAorICAgICAgICAgICAgZGVtdXgtPmNvbW1vbi50aW1lX3NjYWxlLCAxKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZHVyYXRpb24gPQorICAgICAgICAgICAgZ3N0X3V0aWxfZ2RvdWJsZV90b19ndWludDY0IChnc3RfdXRpbF9ndWludDY0X3RvX2dkb3VibGUKKyAgICAgICAgICAgIChnc3RfdXRpbF91aW50NjRfc2NhbGUgKGJsb2NrX2R1cmF0aW9uLCBkZW11eC0+Y29tbW9uLnRpbWVfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgIDEpKSAqIHN0cmVhbS0+dGltZWNvZGVzY2FsZSk7CisgICAgfSBlbHNlIGlmIChzdHJlYW0tPmRlZmF1bHRfZHVyYXRpb24pIHsKKyAgICAgIGR1cmF0aW9uID0gc3RyZWFtLT5kZWZhdWx0X2R1cmF0aW9uICogbGFjZXM7CisgICAgfQorICAgIC8qIGVsc2UgZHVyYXRpb24gaXMgZGlmZiBiZXR3ZWVuIHRpbWVjb2RlIG9mIHRoaXMgYW5kIG5leHQgYmxvY2sgKi8KKworICAgIGlmIChzdHJlYW0tPnR5cGUgPT0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfVklERU8pIHsKKyAgICAgIC8qIEZvciBTaW1wbGVCbG9jaywgbG9vayBhdCB0aGUga2V5ZnJhbWUgYml0IGluIGZsYWdzLiBPdGhlcndpc2UsCisgICAgICAgICBhIFJlZmVyZW5jZUJsb2NrIGltcGxpZXMgdGhhdCB0aGlzIGlzIG5vdCBhIGtleWZyYW1lLiBJbiBlaXRoZXIKKyAgICAgICAgIGNhc2UsIGl0IG9ubHkgbWFrZXMgc2Vuc2UgZm9yIHZpZGVvIHN0cmVhbXMuICovCisgICAgICBpZiAoKGlzX3NpbXBsZWJsb2NrICYmICEoZmxhZ3MgJiAweDgwKSkgfHwgcmVmZXJlbmNlYmxvY2spIHsKKyAgICAgICAgZGVsdGFfdW5pdCA9IFRSVUU7CisgICAgICAgIGludmlzaWJsZV9mcmFtZSA9ICgoZmxhZ3MgJiAweDA4KSkgJiYKKyAgICAgICAgICAgICghc3RyY21wIChzdHJlYW0tPmNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fVlA4KSB8fAorICAgICAgICAgICAgIXN0cmNtcCAoc3RyZWFtLT5jb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1ZQOSkgfHwKKyAgICAgICAgICAgICFzdHJjbXAgKHN0cmVhbS0+Y29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19BVjEpKTsKKyAgICAgIH0KKworICAgICAgLyogSWYgd2UncmUgZG9pbmcgYSBrZXlmcmFtZS1vbmx5IHRyaWNrbW9kZSwgb25seSBwdXNoIGtleWZyYW1lcyBvbiB2aWRlbworICAgICAgICogc3RyZWFtcyAqLworICAgICAgaWYgKGRlbHRhX3VuaXQKKyAgICAgICAgICAmJiBkZW11eC0+Y29tbW9uLgorICAgICAgICAgIHNlZ21lbnQuZmxhZ3MgJiBHU1RfU0VHTUVOVF9GTEFHX1RSSUNLTU9ERV9LRVlfVU5JVFMpIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiU2tpcHBpbmcgbm9uLWtleWZyYW1lIG9uIHN0cmVhbSAlZCIsCisgICAgICAgICAgICBzdHJlYW0tPmluZGV4KTsKKyAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgbGFjZXM7IG4rKykgeworICAgICAgR3N0QnVmZmVyICpzdWI7CisKKyAgICAgIGlmIChHX1VOTElLRUxZIChsYWNlX3NpemVbbl0gPiBzaXplKSkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiSW52YWxpZCBsYWNlIHNpemUiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8qIFFvUyBmb3IgdmlkZW8gdHJhY2sgd2l0aCBhbiBpbmRleC4gdGhlIGFzc3VtcHRpb24gaXMgdGhhdAorICAgICAgICAgaW5kZXggZW50cmllcyBwb2ludCB0byBrZXlmcmFtZXMsIGJ1dCBpZiB0aGF0IGlzIG5vdCB0cnVlIHdlCisgICAgICAgICB3aWxsIGluc3RhZCBza2lwIHVudGlsIHRoZSBuZXh0IGtleWZyYW1lLiAqLworICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChsYWNlX3RpbWUpICYmCisgICAgICAgICAgc3RyZWFtLT50eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1ZJREVPICYmCisgICAgICAgICAgc3RyZWFtLT5pbmRleF90YWJsZSAmJiBkZW11eC0+Y29tbW9uLnNlZ21lbnQucmF0ZSA+IDAuMCkgeworICAgICAgICBHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICp2aWRlb2NvbnRleHQgPQorICAgICAgICAgICAgKEdzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQgKikgc3RyZWFtOworICAgICAgICBHc3RDbG9ja1RpbWUgZWFybGllc3RfdGltZTsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIGVhcmxpZXN0X3N0cmVhbV90aW1lOworCisgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICAgICAgICBlYXJsaWVzdF90aW1lID0gdmlkZW9jb250ZXh0LT5lYXJsaWVzdF90aW1lOworICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworICAgICAgICBlYXJsaWVzdF9zdHJlYW1fdGltZSA9CisgICAgICAgICAgICBnc3Rfc2VnbWVudF9wb3NpdGlvbl9mcm9tX3J1bm5pbmdfdGltZSAoJmRlbXV4LT5jb21tb24uc2VnbWVudCwKKyAgICAgICAgICAgIEdTVF9GT1JNQVRfVElNRSwgZWFybGllc3RfdGltZSk7CisKKyAgICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChsYWNlX3RpbWUpICYmCisgICAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZWFybGllc3Rfc3RyZWFtX3RpbWUpICYmCisgICAgICAgICAgICBsYWNlX3RpbWUgPD0gZWFybGllc3Rfc3RyZWFtX3RpbWUpIHsKKyAgICAgICAgICAvKiBmaW5kIGluZGV4IGVudHJ5IChrZXlmcmFtZSkgPD0gZWFybGllc3Rfc3RyZWFtX3RpbWUgKi8KKyAgICAgICAgICBHc3RNYXRyb3NrYUluZGV4ICplbnRyeSA9CisgICAgICAgICAgICAgIGdzdF91dGlsX2FycmF5X2JpbmFyeV9zZWFyY2ggKHN0cmVhbS0+aW5kZXhfdGFibGUtPmRhdGEsCisgICAgICAgICAgICAgIHN0cmVhbS0+aW5kZXhfdGFibGUtPmxlbiwgc2l6ZW9mIChHc3RNYXRyb3NrYUluZGV4KSwKKyAgICAgICAgICAgICAgKEdDb21wYXJlRGF0YUZ1bmMpIGdzdF9tYXRyb3NrYV9pbmRleF9zZWVrX2ZpbmQsCisgICAgICAgICAgICAgIEdTVF9TRUFSQ0hfTU9ERV9CRUZPUkUsICZlYXJsaWVzdF9zdHJlYW1fdGltZSwgTlVMTCk7CisKKyAgICAgICAgICAvKiBpZiB0aGF0IGVudHJ5IChrZXlmcmFtZSkgaXMgYWZ0ZXIgdGhlIGN1cnJlbnQgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICBidWZmZXIsIHdlIGNhbiBza2lwIHB1c2hpbmcgKGFuZCB0aHVzIGRlY29kaW5nKSBhbGwKKyAgICAgICAgICAgICBidWZmZXJzIHVudGlsIHRoYXQga2V5ZnJhbWUuICovCisgICAgICAgICAgaWYgKGVudHJ5ICYmIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChlbnRyeS0+dGltZSkgJiYKKyAgICAgICAgICAgICAgZW50cnktPnRpbWUgPiBsYWNlX3RpbWUpIHsKKyAgICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgIlNraXBwaW5nIGxhY2UgYmVmb3JlIGxhdGUga2V5ZnJhbWUiKTsKKyAgICAgICAgICAgIHN0cmVhbS0+c2V0X2Rpc2NvbnQgPSBUUlVFOworICAgICAgICAgICAgZ290byBuZXh0X2xhY2U7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHN1YiA9IGdzdF9idWZmZXJfY29weV9yZWdpb24gKGJ1ZiwgR1NUX0JVRkZFUl9DT1BZX0FMTCwKKyAgICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpIC0gc2l6ZSwgbGFjZV9zaXplW25dKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiY3JlYXRlZCBzdWJidWZmZXIgJXAiLCBzdWIpOworCisgICAgICBpZiAoZGVsdGFfdW5pdCkKKyAgICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoc3ViLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgICAgICBlbHNlCisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAoc3ViLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisKKyAgICAgIGlmIChpbnZpc2libGVfZnJhbWUpCisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKHN1YiwgR1NUX0JVRkZFUl9GTEFHX0RFQ09ERV9PTkxZKTsKKworICAgICAgaWYgKHN0cmVhbS0+ZW5jb2RpbmdzICE9IE5VTEwgJiYgc3RyZWFtLT5lbmNvZGluZ3MtPmxlbiA+IDApCisgICAgICAgIHN1YiA9IGdzdF9tYXRyb3NrYV9kZWNvZGVfYnVmZmVyIChzdHJlYW0sIHN1Yik7CisKKyAgICAgIGlmIChzdWIgPT0gTlVMTCkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiRGVjb2RpbmcgYnVmZmVyIGZhaWxlZCIpOworICAgICAgICBnb3RvIG5leHRfbGFjZTsKKyAgICAgIH0KKworICAgICAgaWYgKCFzdHJlYW0tPmR0c19vbmx5KSB7CisgICAgICAgIEdTVF9CVUZGRVJfUFRTIChzdWIpID0gbGFjZV90aW1lOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0JVRkZFUl9EVFMgKHN1YikgPSBsYWNlX3RpbWU7CisgICAgICAgIGlmIChzdHJlYW0tPmludHJhX29ubHkpCisgICAgICAgICAgR1NUX0JVRkZFUl9QVFMgKHN1YikgPSBsYWNlX3RpbWU7CisgICAgICB9CisKKyAgICAgIGJ1ZmZlcl90aW1lc3RhbXAgPSBnc3RfbWF0cm9za2FfdHJhY2tfZ2V0X2J1ZmZlcl90aW1lc3RhbXAgKHN0cmVhbSwgc3ViKTsKKworICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChsYWNlX3RpbWUpKSB7CisgICAgICAgIEdzdENsb2NrVGltZSBsYXN0X3N0b3BfZW5kOworCisgICAgICAgIC8qIENoZWNrIGlmIHRoaXMgc3RyZWFtIGlzIGFmdGVyIHNlZ21lbnQgc3RvcCAqLworICAgICAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGRlbXV4LT5jb21tb24uc2VnbWVudC5zdG9wKSAmJgorICAgICAgICAgICAgbGFjZV90aW1lID49IGRlbXV4LT5jb21tb24uc2VnbWVudC5zdG9wKSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICJTdHJlYW0gJWQgYWZ0ZXIgc2VnbWVudCBzdG9wICUiIEdTVF9USU1FX0ZPUk1BVCwgc3RyZWFtLT5pbmRleCwKKyAgICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZGVtdXgtPmNvbW1vbi5zZWdtZW50LnN0b3ApKTsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChzdWIpOworICAgICAgICAgIGdvdG8gZW9zOworICAgICAgICB9CisgICAgICAgIGlmIChvZmZzZXQgPj0gc3RyZWFtLT50b19vZmZzZXQKKyAgICAgICAgICAgIHx8IChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZGVtdXgtPnRvX3RpbWUpCisgICAgICAgICAgICAgICAgJiYgbGFjZV90aW1lID4gZGVtdXgtPnRvX3RpbWUpKSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJTdHJlYW0gJWQgYWZ0ZXIgcGxheWJhY2sgc2VjdGlvbiIsCisgICAgICAgICAgICAgIHN0cmVhbS0+aW5kZXgpOworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHN1Yik7CisgICAgICAgICAgZ290byBlb3M7CisgICAgICAgIH0KKworICAgICAgICAvKiBoYW5kbGUgZ2FwcywgZS5nLiBub24temVybyBzdGFydC10aW1lLCBvciBhbiBjdWUgaW5kZXggZW50cnkKKyAgICAgICAgICogdGhhdCBsYW5kZWQgdXMgd2l0aCB0aW1lc3RhbXBzIG5vdCBxdWl0ZSBpbnRlbmRlZCAqLworICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgICAgICAgaWYgKGRlbXV4LT5tYXhfZ2FwX3RpbWUgJiYKKyAgICAgICAgICAgIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChkZW11eC0+bGFzdF9zdG9wX2VuZCkgJiYKKyAgICAgICAgICAgIGRlbXV4LT5jb21tb24uc2VnbWVudC5yYXRlID4gMC4wKSB7CisgICAgICAgICAgR3N0Q2xvY2tUaW1lRGlmZiBkaWZmOworCisgICAgICAgICAgLyogb25seSBzZW5kIHNlZ21lbnRzIHdpdGggaW5jcmVhc2luZyBzdGFydCB0aW1lcywKKyAgICAgICAgICAgKiBvdGhlcndpc2UgaWYgdGhlc2UgZ28gYmFjayBhbmQgZm9ydGggZG93bnN0cmVhbSAoc2lua3MpIGluY3JlYXNlCisgICAgICAgICAgICogYWNjdW11bGF0ZWQgdGltZSBhbmQgcnVubmluZ190aW1lICovCisgICAgICAgICAgZGlmZiA9IEdTVF9DTE9DS19ESUZGIChkZW11eC0+bGFzdF9zdG9wX2VuZCwgbGFjZV90aW1lKTsKKyAgICAgICAgICBpZiAoZGlmZiA+IDAgJiYgZGlmZiA+IGRlbXV4LT5tYXhfZ2FwX3RpbWUKKyAgICAgICAgICAgICAgJiYgbGFjZV90aW1lID4gZGVtdXgtPmNvbW1vbi5zZWdtZW50LnN0YXJ0CisgICAgICAgICAgICAgICYmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGRlbXV4LT5jb21tb24uc2VnbWVudC5zdG9wKQorICAgICAgICAgICAgICAgICAgfHwgbGFjZV90aW1lIDwgZGVtdXgtPmNvbW1vbi5zZWdtZW50LnN0b3ApKSB7CisgICAgICAgICAgICBHc3RFdmVudCAqZXZlbnQ7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgICAiR2FwIG9mICUiIEdfR0lOVDY0X0ZPUk1BVCAiIG5zIGRldGVjdGVkIGluIgorICAgICAgICAgICAgICAgICJzdHJlYW0gJWQgKCUiIEdTVF9USU1FX0ZPUk1BVCAiIC0+ICUiIEdTVF9USU1FX0ZPUk1BVCAiKS4gIgorICAgICAgICAgICAgICAgICJTZW5kaW5nIHVwZGF0ZWQgU0VHTUVOVCBldmVudHMiLCBkaWZmLAorICAgICAgICAgICAgICAgIHN0cmVhbS0+aW5kZXgsIEdTVF9USU1FX0FSR1MgKHN0cmVhbS0+cG9zKSwKKyAgICAgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChsYWNlX3RpbWUpKTsKKworICAgICAgICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2dhcCAoZGVtdXgtPmxhc3Rfc3RvcF9lbmQsIGRpZmYpOworICAgICAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKyAgICAgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3RyZWFtLT5wYWQsIGV2ZW50KTsKKyAgICAgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGRlbXV4LT5jb21tb24uc2VnbWVudC5wb3NpdGlvbikKKyAgICAgICAgICAgIHx8IGRlbXV4LT5jb21tb24uc2VnbWVudC5wb3NpdGlvbiA8IGxhY2VfdGltZSkgeworICAgICAgICAgIGRlbXV4LT5jb21tb24uc2VnbWVudC5wb3NpdGlvbiA9IGxhY2VfdGltZTsKKyAgICAgICAgfQorICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworCisgICAgICAgIGxhc3Rfc3RvcF9lbmQgPSBsYWNlX3RpbWU7CisgICAgICAgIGlmIChkdXJhdGlvbikgeworICAgICAgICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKHN1YikgPSBkdXJhdGlvbiAvIGxhY2VzOworICAgICAgICAgIGxhc3Rfc3RvcF9lbmQgKz0gR1NUX0JVRkZFUl9EVVJBVElPTiAoc3ViKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGRlbXV4LT5sYXN0X3N0b3BfZW5kKSB8fAorICAgICAgICAgICAgZGVtdXgtPmxhc3Rfc3RvcF9lbmQgPCBsYXN0X3N0b3BfZW5kKQorICAgICAgICAgIGRlbXV4LT5sYXN0X3N0b3BfZW5kID0gbGFzdF9zdG9wX2VuZDsKKworICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgICAgICAgaWYgKGRlbXV4LT5jb21tb24uc2VnbWVudC5kdXJhdGlvbiA9PSAtMSB8fAorICAgICAgICAgICAgZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lICsgZGVtdXgtPmNvbW1vbi5zZWdtZW50LmR1cmF0aW9uIDwKKyAgICAgICAgICAgIGxhc3Rfc3RvcF9lbmQpIHsKKyAgICAgICAgICBkZW11eC0+Y29tbW9uLnNlZ21lbnQuZHVyYXRpb24gPQorICAgICAgICAgICAgICBsYXN0X3N0b3BfZW5kIC0gZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lOworICAgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgICAgICAgaWYgKCFkZW11eC0+aW52YWxpZF9kdXJhdGlvbikgeworICAgICAgICAgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChkZW11eCksCisgICAgICAgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2R1cmF0aW9uX2NoYW5nZWQgKEdTVF9PQkpFQ1RfQ0FTVCAoZGVtdXgpKSk7CisgICAgICAgICAgICBkZW11eC0+aW52YWxpZF9kdXJhdGlvbiA9IFRSVUU7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc3RyZWFtLT5wb3MgPSBsYWNlX3RpbWU7CisKKyAgICAgIGdzdF9tYXRyb3NrYV9kZW11eF9zeW5jX3N0cmVhbXMgKGRlbXV4KTsKKworICAgICAgaWYgKHN0cmVhbS0+c2V0X2Rpc2NvbnQpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJtYXJraW5nIERJU0NPTlQiKTsKKyAgICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoc3ViLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgICAgIHN0cmVhbS0+c2V0X2Rpc2NvbnQgPSBGQUxTRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAoc3ViLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgICB9CisKKyAgICAgIC8qIHJldmVyc2UgcGxheWJhY2sgYm9vay1rZWVwaW5nICovCisgICAgICBpZiAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdHJlYW0tPmZyb21fdGltZSkpCisgICAgICAgIHN0cmVhbS0+ZnJvbV90aW1lID0gbGFjZV90aW1lOworICAgICAgaWYgKHN0cmVhbS0+ZnJvbV9vZmZzZXQgPT0gLTEpCisgICAgICAgIHN0cmVhbS0+ZnJvbV9vZmZzZXQgPSBvZmZzZXQ7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICJQdXNoaW5nIGxhY2UgJWQsIGRhdGEgb2Ygc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVAorICAgICAgICAgICIgZm9yIHN0cmVhbSAlZCwgdGltZT0lIiBHU1RfVElNRV9GT1JNQVQgIiBhbmQgZHVyYXRpb249JSIKKyAgICAgICAgICBHU1RfVElNRV9GT1JNQVQsIG4sIGdzdF9idWZmZXJfZ2V0X3NpemUgKHN1YiksIHN0cmVhbV9udW0sCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoYnVmZmVyX3RpbWVzdGFtcCksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVVJBVElPTiAoc3ViKSkpOworCisjaWYgMAorICAgICAgaWYgKGRlbXV4LT5jb21tb24uZWxlbWVudF9pbmRleCkgeworICAgICAgICBpZiAoc3RyZWFtLT5pbmRleF93cml0ZXJfaWQgPT0gLTEpCisgICAgICAgICAgZ3N0X2luZGV4X2dldF93cml0ZXJfaWQgKGRlbXV4LT5jb21tb24uZWxlbWVudF9pbmRleCwKKyAgICAgICAgICAgICAgR1NUX09CSkVDVCAoc3RyZWFtLT5wYWQpLCAmc3RyZWFtLT5pbmRleF93cml0ZXJfaWQpOworCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgImFkZGluZyBhc3NvY2lhdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQgIi0+ICUiCisgICAgICAgICAgICBHX0dVSU5UNjRfRk9STUFUICIgZm9yIHdyaXRlciBpZCAlZCIsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChidWZmZXJfdGltZXN0YW1wKSwgY2x1c3Rlcl9vZmZzZXQsCisgICAgICAgICAgICBzdHJlYW0tPmluZGV4X3dyaXRlcl9pZCk7CisgICAgICAgIGdzdF9pbmRleF9hZGRfYXNzb2NpYXRpb24gKGRlbXV4LT5jb21tb24uZWxlbWVudF9pbmRleCwKKyAgICAgICAgICAgIHN0cmVhbS0+aW5kZXhfd3JpdGVyX2lkLCBHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChzdWIsCisgICAgICAgICAgICAgICAgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpID8gMCA6IEdTVF9BU1NPQ0lBVElPTl9GTEFHX0tFWV9VTklULAorICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBidWZmZXJfdGltZXN0YW1wLCBHU1RfRk9STUFUX0JZVEVTLCBjbHVzdGVyX29mZnNldCwKKyAgICAgICAgICAgIE5VTEwpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8qIFBvc3Rwcm9jZXNzIHRoZSBidWZmZXJzIGRlcGVuZGluZyBvbiB0aGUgY29kZWMgdXNlZCAqLworICAgICAgaWYgKHN0cmVhbS0+cG9zdHByb2Nlc3NfZnJhbWUpIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAicnVubmluZyBwb3N0IHByb2Nlc3MiKTsKKyAgICAgICAgcmV0ID0gc3RyZWFtLT5wb3N0cHJvY2Vzc19mcmFtZSAoR1NUX0VMRU1FTlQgKGRlbXV4KSwgc3RyZWFtLCAmc3ViKTsKKyAgICAgIH0KKworICAgICAgLyogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBhIHN1Yi1idWZmZXIgcG9pbnRpbmcgYXQgZGF0YSB3aXRoaW4gYSBsYXJnZXIKKyAgICAgICAgIGJ1ZmZlci4gVGhpcyBkYXRhIG1pZ2h0IG5vdCBiZSBhbGlnbmVkIHdpdGggYW55dGhpbmcuIElmIHRoZSBkYXRhIGlzCisgICAgICAgICByYXcgc2FtcGxlcyB0aG91Z2gsIHdlIHdhbnQgaXQgYWxpZ25lZCB0byB0aGUgcmF3IHR5cGUgKGVnLCA0IGJ5dGVzCisgICAgICAgICBmb3IgMzIgYml0IHNhbXBsZXMsIGV0YyksIG9yIGJhZCB0aGluZ3Mgd2lsbCBoYXBwZW4gZG93bnN0cmVhbSBhcworICAgICAgICAgZWxlbWVudHMgdHlwaWNhbGx5IGFzc3VtZSBtaW5pbWFsIGFsaWdubWVudC4KKyAgICAgICAgIFRoZXJlZm9yZSwgY3JlYXRlIGFuIGFsaWduZWQgY29weSBpZiBuZWNlc3NhcnkuICovCisgICAgICBzdWIgPSBnc3RfbWF0cm9za2FfZGVtdXhfYWxpZ25fYnVmZmVyIChkZW11eCwgc3ViLCBzdHJlYW0tPmFsaWdubWVudCk7CisKKyAgICAgIGlmICghc3RyY21wIChzdHJlYW0tPmNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fT1BVUykpIHsKKyAgICAgICAgZ3VpbnQ2NCBzdGFydF9jbGlwID0gMCwgZW5kX2NsaXAgPSAwOworCisgICAgICAgIC8qIENvZGVjIGRlbGF5IGlzIHBhcnQgb2YgdGhlIHRpbWVzdGFtcHMgKi8KKyAgICAgICAgaWYgKEdTVF9CVUZGRVJfUFRTX0lTX1ZBTElEIChzdWIpICYmIHN0cmVhbS0+Y29kZWNfZGVsYXkpIHsKKyAgICAgICAgICBpZiAoR1NUX0JVRkZFUl9QVFMgKHN1YikgPiBzdHJlYW0tPmNvZGVjX2RlbGF5KSB7CisgICAgICAgICAgICBHU1RfQlVGRkVSX1BUUyAoc3ViKSAtPSBzdHJlYW0tPmNvZGVjX2RlbGF5OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfQlVGRkVSX1BUUyAoc3ViKSA9IDA7CisgICAgICAgICAgICBzdGFydF9jbGlwID0KKyAgICAgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKHN0cmVhbS0+Y29kZWNfZGVsYXksIDQ4MDAwLAorICAgICAgICAgICAgICAgIEdTVF9TRUNPTkQpOworCisgICAgICAgICAgICBpZiAoR1NUX0JVRkZFUl9EVVJBVElPTl9JU19WQUxJRCAoc3ViKSkgeworICAgICAgICAgICAgICBpZiAoR1NUX0JVRkZFUl9EVVJBVElPTiAoc3ViKSA+IHN0cmVhbS0+Y29kZWNfZGVsYXkpCisgICAgICAgICAgICAgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoc3ViKSAtPSBzdHJlYW0tPmNvZGVjX2RlbGF5OworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoc3ViKSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGJsb2NrX2Rpc2NhcmRwYWRkaW5nKSB7CisgICAgICAgICAgZW5kX2NsaXAgPQorICAgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKGJsb2NrX2Rpc2NhcmRwYWRkaW5nLCA0ODAwMCwKKyAgICAgICAgICAgICAgR1NUX1NFQ09ORCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhcnRfY2xpcCB8fCBlbmRfY2xpcCkgeworICAgICAgICAgIGdzdF9idWZmZXJfYWRkX2F1ZGlvX2NsaXBwaW5nX21ldGEgKHN1YiwgR1NUX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgICBzdGFydF9jbGlwLCBlbmRfY2xpcCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKEdTVF9CVUZGRVJfUFRTX0lTX1ZBTElEIChzdWIpKSB7CisgICAgICAgIHN0cmVhbS0+cG9zID0gR1NUX0JVRkZFUl9QVFMgKHN1Yik7CisgICAgICAgIGlmIChHU1RfQlVGRkVSX0RVUkFUSU9OX0lTX1ZBTElEIChzdWIpKQorICAgICAgICAgIHN0cmVhbS0+cG9zICs9IEdTVF9CVUZGRVJfRFVSQVRJT04gKHN1Yik7CisgICAgICB9IGVsc2UgaWYgKEdTVF9CVUZGRVJfRFRTX0lTX1ZBTElEIChzdWIpKSB7CisgICAgICAgIHN0cmVhbS0+cG9zID0gR1NUX0JVRkZFUl9EVFMgKHN1Yik7CisgICAgICAgIGlmIChHU1RfQlVGRkVSX0RVUkFUSU9OX0lTX1ZBTElEIChzdWIpKQorICAgICAgICAgIHN0cmVhbS0+cG9zICs9IEdTVF9CVUZGRVJfRFVSQVRJT04gKHN1Yik7CisgICAgICB9CisKKyAgICAgIHJldCA9IGdzdF9wYWRfcHVzaCAoc3RyZWFtLT5wYWQsIHN1Yik7CisKKyAgICAgIGlmIChkZW11eC0+Y29tbW9uLnNlZ21lbnQucmF0ZSA8IDApIHsKKyAgICAgICAgaWYgKGxhY2VfdGltZSA+IGRlbXV4LT5jb21tb24uc2VnbWVudC5zdG9wICYmIHJldCA9PSBHU1RfRkxPV19FT1MpIHsKKyAgICAgICAgICAvKiBJbiByZXZlcnNlIHBsYXliYWNrIHdlIGNhbiBnZXQgYSBHU1RfRkxPV19FT1Mgd2hlbgorICAgICAgICAgICAqIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBzZWdtZW50LCBzbyB3ZSBqdXN0IG5lZWQgdG8ganVtcAorICAgICAgICAgICAqIGJhY2sgdG8gdGhlIHByZXZpb3VzIHNlY3Rpb24uICovCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJkb3duc3RyZWFtIGhhcyByZWFjaGVkIGVuZCBvZiBzZWdtZW50Iik7CisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIGNvbWJpbmUgZmxvd3MgKi8KKyAgICAgIHJldCA9IGdzdF9mbG93X2NvbWJpbmVyX3VwZGF0ZV9wYWRfZmxvdyAoZGVtdXgtPmZsb3djb21iaW5lciwKKyAgICAgICAgICBzdHJlYW0tPnBhZCwgcmV0KTsKKworICAgIG5leHRfbGFjZToKKyAgICAgIHNpemUgLT0gbGFjZV9zaXplW25dOworICAgICAgaWYgKGxhY2VfdGltZSAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FICYmIGR1cmF0aW9uKQorICAgICAgICBsYWNlX3RpbWUgKz0gZHVyYXRpb24gLyBsYWNlczsKKyAgICAgIGVsc2UKKyAgICAgICAgbGFjZV90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICB9CisgIH0KKworZG9uZToKKyAgaWYgKGJ1ZikgeworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgfQorICBnX2ZyZWUgKGxhY2Vfc2l6ZSk7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFWElUUyAqLworZW9zOgorICB7CisgICAgc3RyZWFtLT5lb3MgPSBUUlVFOworICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgIC8qIGNvbWJpbmUgZmxvd3MgKi8KKyAgICByZXQgPSBnc3RfZmxvd19jb21iaW5lcl91cGRhdGVfcGFkX2Zsb3cgKGRlbXV4LT5mbG93Y29tYmluZXIsIHN0cmVhbS0+cGFkLAorICAgICAgICByZXQpOworICAgIGdvdG8gZG9uZTsKKyAgfQoraW52YWxpZF9sYWNpbmc6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChkZW11eCwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLCAoIkludmFsaWQgbGFjaW5nIHNpemUiKSk7CisgICAgLyogbm9uLWZhdGFsLCB0cnkgbmV4dCBibG9jayhncm91cCkgKi8KKyAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICBnb3RvIGRvbmU7CisgIH0KK2RhdGFfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChkZW11eCwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLCAoIkRhdGEgZXJyb3IiKSk7CisgICAgLyogbm9uLWZhdGFsLCB0cnkgbmV4dCBibG9jayhncm91cCkgKi8KKyAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworLyogcmV0dXJuIEZBTFNFIGlmIGJsb2NrKGdyb3VwKSBzaG91bGQgYmUgc2tpcHBlZCAoZHVlIHRvIGEgc2VlaykgKi8KK3N0YXRpYyBpbmxpbmUgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9kZW11eF9zZWVrX2Jsb2NrIChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgpCit7CisgIGlmIChHX1VOTElLRUxZIChkZW11eC0+c2Vla19ibG9jaykpIHsKKyAgICBpZiAoISgtLWRlbXV4LT5zZWVrX2Jsb2NrKSkgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgInNob3VsZCBza2lwIGJsb2NrIGR1ZSB0byBzZWVrIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiBUUlVFOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfY29udGVudHNfc2Vla2VudHJ5IChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgsCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sKQoreworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ3VpbnQ2NCBzZWVrX3BvcyA9IChndWludDY0KSAtIDE7CisgIGd1aW50MzIgc2Vla19pZCA9IDA7CisgIGd1aW50MzIgaWQ7CisKKyAgREVCVUdfRUxFTUVOVF9TVEFSVCAoZGVtdXgsIGVibWwsICJTZWVrIik7CisKKyAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICBERUJVR19FTEVNRU5UX1NUT1AgKGRlbXV4LCBlYm1sLCAiU2VlayIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1NFRUtJRDoKKyAgICAgIHsKKyAgICAgICAgZ3VpbnQ2NCB0OworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZ0KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJTZWVrSUQ6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHQpOworICAgICAgICBzZWVrX2lkID0gdDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1NFRUtQT1NJVElPTjoKKyAgICAgIHsKKyAgICAgICAgZ3VpbnQ2NCB0OworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZ0KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKHQgPiBHX01BWElOVDY0KSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgIlRvbyBsYXJnZSBTZWVrUG9zaXRpb24gJSIgR19HVUlOVDY0X0ZPUk1BVCwgdCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlNlZWtQb3NpdGlvbjogJSIgR19HVUlOVDY0X0ZPUk1BVCwgdCk7CisgICAgICAgIHNlZWtfcG9zID0gdDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwICgmZGVtdXgtPmNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICJTZWVrSGVhZCIsIGlkKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSyAmJiByZXQgIT0gR1NUX0ZMT1dfRU9TKQorICAgIHJldHVybiByZXQ7CisKKyAgaWYgKCFzZWVrX2lkIHx8IHNlZWtfcG9zID09IChndWludDY0KSAtIDEpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiSW5jb21wbGV0ZSBzZWVraGVhZCBlbnRyeSAoMHgleC8lIgorICAgICAgICBHX0dVSU5UNjRfRk9STUFUICIpIiwgc2Vla19pZCwgc2Vla19wb3MpOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorCisgIHN3aXRjaCAoc2Vla19pZCkgeworICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1NFRUtIRUFEOgorICAgIHsKKyAgICB9CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ1VFUzoKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UQUdTOgorICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLUzoKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TRUdNRU5USU5GTzoKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9BVFRBQ0hNRU5UUzoKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSUzoKKyAgICB7CisgICAgICBndWludDY0IGJlZm9yZV9wb3MsIGxlbmd0aDsKKyAgICAgIGd1aW50IG5lZWRlZDsKKworICAgICAgLyogcmVtZW1iZXIgKi8KKyAgICAgIGxlbmd0aCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9nZXRfbGVuZ3RoICgmZGVtdXgtPmNvbW1vbik7CisgICAgICBiZWZvcmVfcG9zID0gZGVtdXgtPmNvbW1vbi5vZmZzZXQ7CisKKyAgICAgIGlmIChsZW5ndGggPT0gKGd1aW50NjQpIC0gMSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIm5vIHVwc3RyZWFtIGxlbmd0aCwgc2tpcHBpbmcgU2Vha0hlYWQgZW50cnkiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8qIGNoZWNrIGZvciB2YWxpZGl0eSAqLworICAgICAgaWYgKHNlZWtfcG9zICsgZGVtdXgtPmNvbW1vbi5lYm1sX3NlZ21lbnRfc3RhcnQgKyAxMiA+PSBsZW5ndGgpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICJTZWVrSGVhZCByZWZlcmVuY2UgbGllcyBvdXRzaWRlIGZpbGUhIiAiICglIgorICAgICAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCAiKyUiIEdfR1VJTlQ2NF9GT1JNQVQgIisxMiA+PSAlIgorICAgICAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCAiKSIsIHNlZWtfcG9zLCBkZW11eC0+Y29tbW9uLmVibWxfc2VnbWVudF9zdGFydCwKKyAgICAgICAgICAgIGxlbmd0aCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvKiBvbmx5IHBpY2sgdXAgaW5kZXggbG9jYXRpb24gd2hlbiBzdHJlYW1pbmcgKi8KKyAgICAgIGlmIChkZW11eC0+c3RyZWFtaW5nKSB7CisgICAgICAgIGlmIChzZWVrX2lkID09IEdTVF9NQVRST1NLQV9JRF9DVUVTKSB7CisgICAgICAgICAgZGVtdXgtPmluZGV4X29mZnNldCA9IHNlZWtfcG9zICsgZGVtdXgtPmNvbW1vbi5lYm1sX3NlZ21lbnRfc3RhcnQ7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJDdWVzIGxvY2F0ZWQgYXQgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICAgIGRlbXV4LT5pbmRleF9vZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvKiBzZWVrICovCisgICAgICBkZW11eC0+Y29tbW9uLm9mZnNldCA9IHNlZWtfcG9zICsgZGVtdXgtPmNvbW1vbi5lYm1sX3NlZ21lbnRfc3RhcnQ7CisKKyAgICAgIC8qIGNoZWNrIElEICovCisgICAgICBpZiAoKHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wZWVrX2lkX2xlbmd0aF9wdWxsICgmZGVtdXgtPmNvbW1vbiwKKyAgICAgICAgICAgICAgICAgIEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSwgJmlkLCAmbGVuZ3RoLCAmbmVlZGVkKSkgIT0KKyAgICAgICAgICBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBmaW5pc2g7CisKKyAgICAgIGlmIChpZCAhPSBzZWVrX2lkKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAiV2UgbG9va2VkIGZvciBJRD0weCV4IGJ1dCBnb3QgSUQ9MHgleCAocG9zPSUiIEdfR1VJTlQ2NF9GT1JNQVQgIikiLAorICAgICAgICAgICAgc2Vla19pZCwgaWQsIHNlZWtfcG9zICsgZGVtdXgtPmNvbW1vbi5lYm1sX3NlZ21lbnRfc3RhcnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogbm93IHBhcnNlICovCisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pZCAoZGVtdXgsIGlkLCBsZW5ndGgsIG5lZWRlZCk7CisgICAgICB9CisKKyAgICBmaW5pc2g6CisgICAgICAvKiBzZWVrIGJhY2sgKi8KKyAgICAgIGRlbXV4LT5jb21tb24ub2Zmc2V0ID0gYmVmb3JlX3BvczsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NMVVNURVI6CisgICAgeworICAgICAgZ3VpbnQ2NCBwb3MgPSBzZWVrX3BvcyArIGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X3N0YXJ0OworCisgICAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJDbHVzdGVyIHBvc2l0aW9uIik7CisgICAgICBpZiAoR19VTkxJS0VMWSAoIWRlbXV4LT5jbHVzdGVycykpCisgICAgICAgIGRlbXV4LT5jbHVzdGVycyA9IGdfYXJyYXlfc2l6ZWRfbmV3IChUUlVFLCBUUlVFLCBzaXplb2YgKGd1aW50NjQpLCAxMDApOworICAgICAgZ19hcnJheV9hcHBlbmRfdmFsIChkZW11eC0+Y2x1c3RlcnMsIHBvcyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJJZ25vcmluZyBTZWVrIGVudHJ5IGZvciBJRD0weCV4Iiwgc2Vla19pZCk7CisgICAgICBicmVhazsKKyAgfQorICBERUJVR19FTEVNRU5UX1NUT1AgKGRlbXV4LCBlYm1sLCAiU2VlayIsIHJldCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9jb250ZW50cyAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4LCBHc3RFYm1sUmVhZCAqIGVibWwpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGd1aW50MzIgaWQ7CisKKyAgREVCVUdfRUxFTUVOVF9TVEFSVCAoZGVtdXgsIGVibWwsICJTZWVrSGVhZCIpOworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChkZW11eCwgZWJtbCwgIlNlZWtIZWFkIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSyAmJiBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworCisgICAgc3dpdGNoIChpZCkgeworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfU0VFS0VOVFJZOgorICAgICAgeworICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfY29udGVudHNfc2Vla2VudHJ5IChkZW11eCwgZWJtbCk7CisgICAgICAgIC8qIElnbm9yZSBFT1MgYW5kIGVycm9ycyBoZXJlICovCisgICAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIklnbm9yaW5nICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworICAgICAgICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2Vfc2tpcCAoJmRlbXV4LT5jb21tb24sCisgICAgICAgICAgICBlYm1sLCAiU2Vla0hlYWQiLCBpZCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIERFQlVHX0VMRU1FTlRfU1RPUCAoZGVtdXgsIGVibWwsICJTZWVrSGVhZCIsIHJldCk7CisKKyAgLyogU29ydCBjbHVzdGVycyBieSBwb3NpdGlvbiBmb3IgZWFzaWVyIHNlYXJjaGluZyAqLworICBpZiAoZGVtdXgtPmNsdXN0ZXJzKQorICAgIGdfYXJyYXlfc29ydCAoZGVtdXgtPmNsdXN0ZXJzLCAoR0NvbXBhcmVGdW5jKSBnc3RfbWF0cm9za2FfY2x1c3Rlcl9jb21wYXJlKTsKKworICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIEdTVF9GTE9XX09WRVJGTE9XICAgR1NUX0ZMT1dfQ1VTVE9NX0VSUk9SCisKKyNkZWZpbmUgTUFYX0JMT0NLX1NJWkUgKDE1ICogMTAyNCAqIDEwMjQpCisKK3N0YXRpYyBpbmxpbmUgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlbXV4X2NoZWNrX3JlYWRfc2l6ZSAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4LCBndWludDY0IGJ5dGVzKQoreworICBpZiAoR19VTkxJS0VMWSAoYnl0ZXMgPiBNQVhfQkxPQ0tfU0laRSkpIHsKKyAgICAvKiBvbmx5IGEgZmV3IGJsb2NrcyBhcmUgZXhwZWN0ZWQvYWxsb3dlZCB0byBiZSBsYXJnZSwKKyAgICAgKiBhbmQgd2lsbCBiZSByZWN1cnNlZCBpbnRvLCB3aGVyZWFzIG90aGVycyB3aWxsIGJlIHJlYWQgYW5kIG11c3QgZml0ICovCisgICAgaWYgKGRlbXV4LT5zdHJlYW1pbmcpIHsKKyAgICAgIC8qIGZhdGFsIGluIHN0cmVhbWluZyBjYXNlLCBhcyB3ZSBjYW4ndCBzdGVwIG92ZXIgZWFzaWx5ICovCisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgREVNVVgsIChOVUxMKSwKKyAgICAgICAgICAoInJlYWRpbmcgbGFyZ2UgYmxvY2sgb2Ygc2l6ZSAlIiBHX0dVSU5UNjRfRk9STUFUICIgbm90IHN1cHBvcnRlZDsgIgorICAgICAgICAgICAgICAiZmlsZSBtaWdodCBiZSBjb3JydXB0LiIsIGJ5dGVzKSk7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGluZGljYXRlIGhpZ2hlciBsZXZlbCB0byBxdWlldGx5IGdpdmUgdXAgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICJ0b28gbGFyZ2UgYmxvY2sgb2Ygc2l6ZSAlIiBHX0dVSU5UNjRfRk9STUFULCBieXRlcyk7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorfQorCisvKiByZXR1cm5zIFRSVUUgaWYgd2UgdHJ1ZWx5IGFyZSBpbiBlcnJvciBzdGF0ZSwgYW5kIHNob3VsZCBnaXZlIHVwICovCitzdGF0aWMgaW5saW5lIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9kZW11eF9jaGVja19wYXJzZV9lcnJvciAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4KQoreworICBpZiAoIWRlbXV4LT5zdHJlYW1pbmcgJiYgZGVtdXgtPm5leHRfY2x1c3Rlcl9vZmZzZXQgPiAwKSB7CisgICAgLyoganVzdCByZXBvc2l0aW9uaW5nIHRvIHdoZXJlIG5leHQgY2x1c3RlciBzaG91bGQgYmUgYW5kIHRyeSBmcm9tIHRoZXJlICovCisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgInBhcnNlIGVycm9yLCB0cnlpbmcgbmV4dCBjbHVzdGVyIGV4cGVjdGVkIGF0ICUiCisgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIGRlbXV4LT5uZXh0X2NsdXN0ZXJfb2Zmc2V0KTsKKyAgICBkZW11eC0+Y29tbW9uLm9mZnNldCA9IGRlbXV4LT5uZXh0X2NsdXN0ZXJfb2Zmc2V0OworICAgIGRlbXV4LT5uZXh0X2NsdXN0ZXJfb2Zmc2V0ID0gMDsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0gZWxzZSB7CisgICAgZ2ludDY0IHBvczsKKyAgICBHc3RGbG93UmV0dXJuIHJldDsKKworICAgIC8qIHNpZ2gsIG9uZSBsYXN0IGF0dGVtcHQgYWJvdmUgYW5kIGJleW9uZCBjYWxsIG9mIGR1dHkgLi4uOworICAgICAqIHNlYXJjaCBmb3IgY2x1c3RlciBtYXJrIGZvbGxvd2luZyBjdXJyZW50IHBvcyAqLworICAgIHBvcyA9IGRlbXV4LT5jb21tb24ub2Zmc2V0OworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJwYXJzZSBlcnJvciwgbG9va2luZyBmb3IgbmV4dCBjbHVzdGVyIik7CisgICAgaWYgKChyZXQgPSBnc3RfbWF0cm9za2FfZGVtdXhfc2VhcmNoX2NsdXN0ZXIgKGRlbXV4LCAmcG9zLCBUUlVFKSkgIT0KKyAgICAgICAgR1NUX0ZMT1dfT0spIHsKKyAgICAgIC8qIGRpZCBub3Qgd29yaywgZ2l2ZSB1cCAqLworICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICIuLi4gZm91bmQgYXQgICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHBvcyk7CisgICAgICAvKiB0cnkgdGhhdCBwb3NpdGlvbiAqLworICAgICAgZGVtdXgtPmNvbW1vbi5vZmZzZXQgPSBwb3M7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlbXV4X2ZsdXNoIChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgsIGd1aW50IGZsdXNoKQoreworICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJza2lwcGluZyAlZCBieXRlcyIsIGZsdXNoKTsKKyAgZGVtdXgtPmNvbW1vbi5vZmZzZXQgKz0gZmx1c2g7CisgIGlmIChkZW11eC0+c3RyZWFtaW5nKSB7CisgICAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgICAvKiBoYXJkIHRvIHNraXAgbGFyZ2UgYmxvY2tzIHdoZW4gc3RyZWFtaW5nICovCisgICAgcmV0ID0gZ3N0X21hdHJvc2thX2RlbXV4X2NoZWNrX3JlYWRfc2l6ZSAoZGVtdXgsIGZsdXNoKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoZmx1c2ggPD0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZW11eC0+Y29tbW9uLmFkYXB0ZXIpKQorICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGRlbXV4LT5jb21tb24uYWRhcHRlciwgZmx1c2gpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisgIH0KKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCisvKiBpbml0aWFsaXplcyBAZWJtbCB3aXRoIEBieXRlcyBmcm9tIGlucHV0IHN0cmVhbSBhdCBjdXJyZW50IG9mZnNldC4KKyAqIFJldHVybnMgRU9TIGlmIGluc3VmZmljaWVudCBhdmFpbGFibGUsCisgKiBFUlJPUiBpZiB0b28gbXVjaCB3YXMgYXR0ZW1wdGVkIHRvIHJlYWQuICovCitzdGF0aWMgaW5saW5lIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9kZW11eF90YWtlIChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgsIGd1aW50NjQgYnl0ZXMsCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sKQoreworICBHc3RCdWZmZXIgKmJ1ZmZlciA9IE5VTEw7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAidGFraW5nICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBieXRlcyBmb3IgcGFyc2luZyIsCisgICAgICBieXRlcyk7CisgIHJldCA9IGdzdF9tYXRyb3NrYV9kZW11eF9jaGVja19yZWFkX3NpemUgKGRlbXV4LCBieXRlcyk7CisgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spKSB7CisgICAgaWYgKCFkZW11eC0+c3RyZWFtaW5nKSB7CisgICAgICAvKiBpbiBwdWxsIG1vZGUsIHdlIGNhbiBza2lwICovCisgICAgICBpZiAoKHJldCA9IGdzdF9tYXRyb3NrYV9kZW11eF9mbHVzaCAoZGVtdXgsIGJ5dGVzKSkgPT0gR1NUX0ZMT1dfT0spCisgICAgICAgIHJldCA9IEdTVF9GTE9XX09WRVJGTE9XOworICAgIH0gZWxzZSB7CisgICAgICAvKiBvdGhlcndpc2UgZmF0YWwgKi8KKyAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIH0KKyAgICBnb3RvIGV4aXQ7CisgIH0KKyAgaWYgKGRlbXV4LT5zdHJlYW1pbmcpIHsKKyAgICBpZiAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZW11eC0+Y29tbW9uLmFkYXB0ZXIpID49IGJ5dGVzKQorICAgICAgYnVmZmVyID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKGRlbXV4LT5jb21tb24uYWRhcHRlciwgYnl0ZXMpOworICAgIGVsc2UKKyAgICAgIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgfSBlbHNlCisgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BlZWtfYnl0ZXMgKCZkZW11eC0+Y29tbW9uLAorICAgICAgICBkZW11eC0+Y29tbW9uLm9mZnNldCwgYnl0ZXMsICZidWZmZXIsIE5VTEwpOworICBpZiAoR19MSUtFTFkgKGJ1ZmZlcikpIHsKKyAgICBnc3RfZWJtbF9yZWFkX2luaXQgKGVibWwsIEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSwgYnVmZmVyLAorICAgICAgICBkZW11eC0+Y29tbW9uLm9mZnNldCk7CisgICAgZGVtdXgtPmNvbW1vbi5vZmZzZXQgKz0gYnl0ZXM7CisgIH0KK2V4aXQ6CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfZGVtdXhfY2hlY2tfc2Vla2FiaWxpdHkgKEdzdE1hdHJvc2thRGVtdXggKiBkZW11eCkKK3sKKyAgR3N0UXVlcnkgKnF1ZXJ5OworICBnYm9vbGVhbiBzZWVrYWJsZSA9IEZBTFNFOworICBnaW50NjQgc3RhcnQgPSAtMSwgc3RvcCA9IC0xOworCisgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19zZWVraW5nIChHU1RfRk9STUFUX0JZVEVTKTsKKyAgaWYgKCFnc3RfcGFkX3BlZXJfcXVlcnkgKGRlbXV4LT5jb21tb24uc2lua3BhZCwgcXVlcnkpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJzZWVraW5nIHF1ZXJ5IGZhaWxlZCIpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGdzdF9xdWVyeV9wYXJzZV9zZWVraW5nIChxdWVyeSwgTlVMTCwgJnNlZWthYmxlLCAmc3RhcnQsICZzdG9wKTsKKworICAvKiB0cnkgaGFyZGVyIHRvIHF1ZXJ5IHVwc3RyZWFtIHNpemUgaWYgd2UgZGlkbid0IGdldCBpdCB0aGUgZmlyc3QgdGltZSAqLworICBpZiAoc2Vla2FibGUgJiYgc3RvcCA9PSAtMSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZG9pbmcgZHVyYXRpb24gcXVlcnkgdG8gZml4IHVwIHVuc2V0IHN0b3AiKTsKKyAgICBnc3RfcGFkX3BlZXJfcXVlcnlfZHVyYXRpb24gKGRlbXV4LT5jb21tb24uc2lua3BhZCwgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICAgICAgJnN0b3ApOworICB9CisKKyAgLyogaWYgdXBzdHJlYW0gZG9lc24ndCBrbm93IHRoZSBzaXplLCBpdCdzIGxpa2VseSB0aGF0IGl0J3Mgbm90IHNlZWthYmxlIGluCisgICAqIHByYWN0aWNlIGV2ZW4gaWYgaXQgdGVjaG5pY2FsbHkgbWF5IGJlIHNlZWthYmxlICovCisgIGlmIChzZWVrYWJsZSAmJiAoc3RhcnQgIT0gMCB8fCBzdG9wIDw9IHN0YXJ0KSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAic2Vla2FibGUgYnV0IHVua25vd24gc3RhcnQvc3RvcCAtPiBkaXNhYmxlIik7CisgICAgc2Vla2FibGUgPSBGQUxTRTsKKyAgfQorCitkb25lOgorICBHU1RfSU5GT19PQkpFQ1QgKGRlbXV4LCAic2Vla2FibGU6ICVkICglIiBHX0dVSU5UNjRfRk9STUFUICIgLSAlIgorICAgICAgR19HVUlOVDY0X0ZPUk1BVCAiKSIsIHNlZWthYmxlLCBzdGFydCwgc3RvcCk7CisgIGRlbXV4LT5zZWVrYWJsZSA9IHNlZWthYmxlOworCisgIGdzdF9xdWVyeV91bnJlZiAocXVlcnkpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlbXV4X2ZpbmRfdHJhY2tzIChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgpCit7CisgIGd1aW50MzIgaWQ7CisgIGd1aW50NjQgYmVmb3JlX3BvczsKKyAgZ3VpbnQ2NCBsZW5ndGg7CisgIGd1aW50IG5lZWRlZDsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKworICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LAorICAgICAgIkZvdW5kIENsdXN0ZXIgZWxlbWVudCBiZWZvcmUgVHJhY2tzLCBzZWFyY2hpbmcgVHJhY2tzIik7CisKKyAgLyogcmVtZW1iZXIgKi8KKyAgYmVmb3JlX3BvcyA9IGRlbXV4LT5jb21tb24ub2Zmc2V0OworCisgIC8qIFNlYXJjaCBUcmFja3MgZWxlbWVudCAqLworICB3aGlsZSAoVFJVRSkgeworICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wZWVrX2lkX2xlbmd0aF9wdWxsICgmZGVtdXgtPmNvbW1vbiwKKyAgICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCAmaWQsICZsZW5ndGgsICZuZWVkZWQpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKworICAgIGlmIChpZCAhPSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tTKSB7CisgICAgICAvKiB3ZSBtYXkgYmUgc2tpcHBpbmcgbGFyZ2UgY2x1c3RlciBoZXJlLCBzbyBmb3JlZ28gc2l6ZSBjaGVjayBldGMgKi8KKyAgICAgIC8qIC4uLiBidXQgd2UgY2FuJ3Qgc2tpcCB1bmRlZmluZWQgc2l6ZTsgZm9yY2UgZXJyb3IgKi8KKyAgICAgIGlmIChsZW5ndGggPT0gR19NQVhVSU5UNjQpIHsKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX2RlbXV4X2NoZWNrX3JlYWRfc2l6ZSAoZGVtdXgsIGxlbmd0aCk7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVtdXgtPmNvbW1vbi5vZmZzZXQgKz0gbmVlZGVkOworICAgICAgICBkZW11eC0+Y29tbW9uLm9mZnNldCArPSBsZW5ndGg7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvKiB3aWxsIGxlYWQgdG8gdHJhY2sgcGFyc2luZyAuLi4gKi8KKyAgICByZXQgPSBnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfaWQgKGRlbXV4LCBpZCwgbGVuZ3RoLCBuZWVkZWQpOworICAgIGJyZWFrOworICB9CisKKyAgLyogc2VlayBiYWNrICovCisgIGRlbXV4LT5jb21tb24ub2Zmc2V0ID0gYmVmb3JlX3BvczsKKworICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIEdTVF9SRUFEX0NIRUNLKHN0bXQpICBcCitHX1NUTVRfU1RBUlQgeyBcCisgIGlmIChHX1VOTElLRUxZICgocmV0ID0gKHN0bXQpKSAhPSBHU1RfRkxPV19PSykpIHsgXAorICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfT1ZFUkZMT1cpIHsgXAorICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7IFwKKyAgICB9IFwKKyAgICBnb3RvIHJlYWRfZXJyb3I7IFwKKyAgfSBcCit9IEdfU1RNVF9FTkQKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pZCAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4LCBndWludDMyIGlkLAorICAgIGd1aW50NjQgbGVuZ3RoLCBndWludCBuZWVkZWQpCit7CisgIEdzdEVibWxSZWFkIGVibWwgPSB7IDAsIH07CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGd1aW50NjQgcmVhZDsKKworICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJQYXJzaW5nIEVsZW1lbnQgaWQgMHgleCwgIgorICAgICAgInNpemUgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBwcmVmaXggJWQiLCBpZCwgbGVuZ3RoLCBuZWVkZWQpOworCisgIC8qIGlmIHdlIHBsYW4gdG8gcmVhZCBhbmQgcGFyc2UgdGhpcyBlbGVtZW50LCB3ZSBuZWVkIHByZWZpeCAoaWQgKyBsZW5ndGgpCisgICAqIGFuZCB0aGUgY29udGVudHMgKi8KKyAgLyogbWluZCBhYm91dCBvdmVyZmxvdyB3cmFwLWFyb3VuZCB3aGVuIGRlYWxpbmcgd2l0aCB1bmRlZmluZWQgc2l6ZSAqLworICByZWFkID0gbGVuZ3RoOworICBpZiAoR19MSUtFTFkgKGxlbmd0aCAhPSBHX01BWFVJTlQ2NCkpCisgICAgcmVhZCArPSBuZWVkZWQ7CisKKyAgc3dpdGNoIChkZW11eC0+Y29tbW9uLnN0YXRlKSB7CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9TVEFSVDoKKyAgICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgY2FzZSBHU1RfRUJNTF9JRF9IRUFERVI6CisgICAgICAgICAgR1NUX1JFQURfQ0hFQ0sgKGdzdF9tYXRyb3NrYV9kZW11eF90YWtlIChkZW11eCwgcmVhZCwgJmVibWwpKTsKKyAgICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfaGVhZGVyICgmZGVtdXgtPmNvbW1vbiwgJmVibWwpOworICAgICAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKyAgICAgICAgICBkZW11eC0+Y29tbW9uLnN0YXRlID0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfU0VHTUVOVDsKKyAgICAgICAgICBnc3RfbWF0cm9za2FfZGVtdXhfY2hlY2tfc2Vla2FiaWxpdHkgKGRlbXV4KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBnb3RvIGludmFsaWRfaGVhZGVyOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9TRUdNRU5UOgorICAgICAgc3dpdGNoIChpZCkgeworICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TRUdNRU5UOgorICAgICAgICAgIC8qIGVhdCBzZWdtZW50IHByZWZpeCAqLworICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfZGVtdXhfZmx1c2ggKGRlbXV4LCBuZWVkZWQpKTsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgIkZvdW5kIFNlZ21lbnQgc3RhcnQgYXQgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiB3aXRoIHNpemUgJSIKKyAgICAgICAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgZGVtdXgtPmNvbW1vbi5vZmZzZXQsIGxlbmd0aCk7CisgICAgICAgICAgLyogc2Vla3MgYXJlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VnbWVudCwKKyAgICAgICAgICAgKiBhZnRlciB0aGUgc2VnbWVudCBJRC9sZW5ndGggKi8KKyAgICAgICAgICBkZW11eC0+Y29tbW9uLmVibWxfc2VnbWVudF9zdGFydCA9IGRlbXV4LT5jb21tb24ub2Zmc2V0OworICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgICAgIGxlbmd0aCA9IEdfTUFYVUlOVDY0OworICAgICAgICAgIGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X2xlbmd0aCA9IGxlbmd0aDsKKyAgICAgICAgICBkZW11eC0+Y29tbW9uLnN0YXRlID0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfSEVBREVSOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICJFeHBlY3RlZCBhIFNlZ21lbnQgSUQgKDB4JXgpLCBidXQgcmVjZWl2ZWQgMHgleCEiLAorICAgICAgICAgICAgICBHU1RfTUFUUk9TS0FfSURfU0VHTUVOVCwgaWQpOworICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfZGVtdXhfZmx1c2ggKGRlbXV4LCByZWFkKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX1NDQU5OSU5HOgorICAgICAgaWYgKGlkICE9IEdTVF9NQVRST1NLQV9JRF9DTFVTVEVSICYmCisgICAgICAgICAgaWQgIT0gR1NUX01BVFJPU0tBX0lEX0NMVVNURVJUSU1FQ09ERSkgeworICAgICAgICBpZiAoZGVtdXgtPmNvbW1vbi5zdGFydF9yZXN5bmNfb2Zmc2V0ICE9IC0xKSB7CisgICAgICAgICAgLyogd2UgbmVlZCB0byBza2lwIGJ5dGUgcGVyIGJ5dGUgaWYgd2UgYXJlIHNjYW5uaW5nIGZvciBhIG5ldyBjbHVzdGVyCisgICAgICAgICAgICogYWZ0ZXIgaW52YWxpZCBkYXRhIGlzIGZvdW5kCisgICAgICAgICAgICovCisgICAgICAgICAgcmVhZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZ290byBza2lwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGRlbXV4LT5jb21tb24uc3RhcnRfcmVzeW5jX29mZnNldCAhPSAtMSkgeworICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgIlJlc3luYyBkb25lLCBuZXcgY2x1c3RlciBmb3VuZCEiKTsKKyAgICAgICAgICBkZW11eC0+Y29tbW9uLnN0YXJ0X3Jlc3luY19vZmZzZXQgPSAtMTsKKyAgICAgICAgICBkZW11eC0+Y29tbW9uLnN0YXRlID0gZGVtdXgtPmNvbW1vbi5zdGF0ZV90b19yZXN0b3JlOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgICBjYXNlIEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX0hFQURFUjoKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX0RBVEE6CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9TRUVLOgorICAgICAgc3dpdGNoIChpZCkgeworICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TRUdNRU5USU5GTzoKKyAgICAgICAgICBpZiAoIWRlbXV4LT5jb21tb24uc2VnbWVudGluZm9fcGFyc2VkKSB7CisgICAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX2RlbXV4X3Rha2UgKGRlbXV4LCByZWFkLCAmZWJtbCkpOworICAgICAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX2luZm8gKCZkZW11eC0+Y29tbW9uLAorICAgICAgICAgICAgICAgIEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSwgJmVibWwpOworICAgICAgICAgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgICAgZ3N0X21hdHJvc2thX2RlbXV4X3NlbmRfdGFncyAoZGVtdXgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX2RlbXV4X2ZsdXNoIChkZW11eCwgcmVhZCkpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tTOgorICAgICAgICAgIGlmICghZGVtdXgtPnRyYWNrc19wYXJzZWQpIHsKKyAgICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfZGVtdXhfdGFrZSAoZGVtdXgsIHJlYWQsICZlYm1sKSk7CisgICAgICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfdHJhY2tzIChkZW11eCwgJmVibWwpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX2RlbXV4X2ZsdXNoIChkZW11eCwgcmVhZCkpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUjoKKyAgICAgICAgICBpZiAoR19VTkxJS0VMWSAoIWRlbXV4LT50cmFja3NfcGFyc2VkKSkgeworICAgICAgICAgICAgaWYgKGRlbXV4LT5zdHJlYW1pbmcpIHsKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJDbHVzdGVyIGJlZm9yZSBUcmFjayIpOworICAgICAgICAgICAgICBnb3RvIG5vdF9zdHJlYW1hYmxlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX2RlbXV4X2ZpbmRfdHJhY2tzIChkZW11eCk7CisgICAgICAgICAgICAgIGlmICghZGVtdXgtPnRyYWNrc19wYXJzZWQpCisgICAgICAgICAgICAgICAgZ290byBub190cmFja3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChHX1VOTElLRUxZIChkZW11eC0+Y29tbW9uLnN0YXRlCisgICAgICAgICAgICAgICAgICA9PSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9IRUFERVIpKSB7CisgICAgICAgICAgICBkZW11eC0+Y29tbW9uLnN0YXRlID0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfREFUQTsKKyAgICAgICAgICAgIGRlbXV4LT5maXJzdF9jbHVzdGVyX29mZnNldCA9IGRlbXV4LT5jb21tb24ub2Zmc2V0OworICAgICAgICAgICAgaWYgKCFkZW11eC0+c3RyZWFtaW5nICYmCisgICAgICAgICAgICAgICAgIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChkZW11eC0+Y29tbW9uLnNlZ21lbnQuZHVyYXRpb24pKSB7CisgICAgICAgICAgICAgIEdzdE1hdHJvc2thSW5kZXggKmxhc3QgPSBOVUxMOworCisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgICAgICAgImVzdGltYXRpbmcgZHVyYXRpb24gdXNpbmcgbGFzdCBjbHVzdGVyIik7CisgICAgICAgICAgICAgIGlmICgobGFzdCA9IGdzdF9tYXRyb3NrYV9kZW11eF9zZWFyY2hfcG9zIChkZW11eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBkZW11eC0+bGFzdF9jbHVzdGVyX29mZnNldCA9CisgICAgICAgICAgICAgICAgICAgIGxhc3QtPnBvcyArIGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X3N0YXJ0OworICAgICAgICAgICAgICAgIGRlbXV4LT5zdHJlYW1fbGFzdF90aW1lID0gbGFzdC0+dGltZTsKKyAgICAgICAgICAgICAgICBkZW11eC0+Y29tbW9uLnNlZ21lbnQuZHVyYXRpb24gPQorICAgICAgICAgICAgICAgICAgICBkZW11eC0+c3RyZWFtX2xhc3RfdGltZSAtIGRlbXV4LT5zdHJlYW1fc3RhcnRfdGltZTsKKyAgICAgICAgICAgICAgICAvKiBhYm92ZSBlc3RpbWF0ZSBzaG91bGQgbm90IGJlIHRha2VuIGFsbCB0b28gc3Ryb25nbHkgKi8KKyAgICAgICAgICAgICAgICBkZW11eC0+aW52YWxpZF9kdXJhdGlvbiA9IFRSVUU7CisgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICAgICAgICJlc3RpbWF0ZWQgZHVyYXRpb24gYXMgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+Y29tbW9uLnNlZ21lbnQuZHVyYXRpb24pKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJzaWduYWxpbmcgbm8gbW9yZSBwYWRzIik7CisgICAgICAgICAgICBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgKEdTVF9FTEVNRU5UIChkZW11eCkpOworICAgICAgICAgICAgLyogc2VuZCBpbml0aWFsIHNlZ21lbnQgLSB3ZSB3YWl0IHRpbGwgd2Uga25vdyB0aGUgZmlyc3QKKyAgICAgICAgICAgICAgIGluY29taW5nIHRpbWVzdGFtcCwgc28gd2UgY2FuIHByb3Blcmx5IHNldCB0aGUgc3RhcnQgb2YKKyAgICAgICAgICAgICAgIHRoZSBzZWdtZW50LiAqLworICAgICAgICAgICAgZGVtdXgtPm5lZWRfc2VnbWVudCA9IFRSVUU7CisgICAgICAgICAgfQorICAgICAgICAgIGRlbXV4LT5jbHVzdGVyX3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgICAgICAgIGRlbXV4LT5jbHVzdGVyX29mZnNldCA9IGRlbXV4LT5jb21tb24ub2Zmc2V0OworICAgICAgICAgIGlmIChHX1VOTElLRUxZICghZGVtdXgtPnNlZWtfZmlyc3QgJiYgZGVtdXgtPnNlZWtfYmxvY2spKSB7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInNlZWsgdGFyZ2V0IGJsb2NrICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICAgICAgICAgICAiIG5vdCBmb3VuZCBpbiBDbHVzdGVyLCB0cnlpbmcgbmV4dCBDbHVzdGVyJ3MgZmlyc3QgYmxvY2sgaW5zdGVhZCIsCisgICAgICAgICAgICAgICAgZGVtdXgtPnNlZWtfYmxvY2spOworICAgICAgICAgICAgZGVtdXgtPnNlZWtfYmxvY2sgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBkZW11eC0+c2Vla19maXJzdCA9IEZBTFNFOworICAgICAgICAgIC8qIHJlY29yZCBuZXh0IGNsdXN0ZXIgZm9yIHJlY292ZXJ5ICovCisgICAgICAgICAgaWYgKHJlYWQgIT0gR19NQVhVSU5UNjQpCisgICAgICAgICAgICBkZW11eC0+bmV4dF9jbHVzdGVyX29mZnNldCA9IGRlbXV4LT5jbHVzdGVyX29mZnNldCArIHJlYWQ7CisgICAgICAgICAgLyogZWF0IGNsdXN0ZXIgcHJlZml4ICovCisgICAgICAgICAgZ3N0X21hdHJvc2thX2RlbXV4X2ZsdXNoIChkZW11eCwgbmVlZGVkKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUlRJTUVDT0RFOgorICAgICAgICB7CisgICAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX2RlbXV4X3Rha2UgKGRlbXV4LCByZWFkLCAmZWJtbCkpOworICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50ICgmZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIkNsdXN0ZXJUaW1lQ29kZTogJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICBkZW11eC0+Y2x1c3Rlcl90aW1lID0gbnVtOworICAgICAgICAgIC8qIHRyYWNrIGxhc3QgY2x1c3RlciAqLworICAgICAgICAgIGlmIChkZW11eC0+Y2x1c3Rlcl9vZmZzZXQgPiBkZW11eC0+bGFzdF9jbHVzdGVyX29mZnNldCkgeworICAgICAgICAgICAgZGVtdXgtPmxhc3RfY2x1c3Rlcl9vZmZzZXQgPSBkZW11eC0+Y2x1c3Rlcl9vZmZzZXQ7CisgICAgICAgICAgICBkZW11eC0+c3RyZWFtX2xhc3RfdGltZSA9CisgICAgICAgICAgICAgICAgZGVtdXgtPmNsdXN0ZXJfdGltZSAqIGRlbXV4LT5jb21tb24udGltZV9zY2FsZTsKKyAgICAgICAgICB9CisjaWYgMAorICAgICAgICAgIGlmIChkZW11eC0+Y29tbW9uLmVsZW1lbnRfaW5kZXgpIHsKKyAgICAgICAgICAgIGlmIChkZW11eC0+Y29tbW9uLmVsZW1lbnRfaW5kZXhfd3JpdGVyX2lkID09IC0xKQorICAgICAgICAgICAgICBnc3RfaW5kZXhfZ2V0X3dyaXRlcl9pZCAoZGVtdXgtPmNvbW1vbi5lbGVtZW50X2luZGV4LAorICAgICAgICAgICAgICAgICAgR1NUX09CSkVDVCAoZGVtdXgpLCAmZGVtdXgtPmNvbW1vbi5lbGVtZW50X2luZGV4X3dyaXRlcl9pZCk7CisgICAgICAgICAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJhZGRpbmcgYXNzb2NpYXRpb24gJSIgR1NUX1RJTUVfRk9STUFUICItPiAlIgorICAgICAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIiBmb3Igd3JpdGVyIGlkICVkIiwKKyAgICAgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+Y2x1c3Rlcl90aW1lKSwgZGVtdXgtPmNsdXN0ZXJfb2Zmc2V0LAorICAgICAgICAgICAgICAgIGRlbXV4LT5jb21tb24uZWxlbWVudF9pbmRleF93cml0ZXJfaWQpOworICAgICAgICAgICAgZ3N0X2luZGV4X2FkZF9hc3NvY2lhdGlvbiAoZGVtdXgtPmNvbW1vbi5lbGVtZW50X2luZGV4LAorICAgICAgICAgICAgICAgIGRlbXV4LT5jb21tb24uZWxlbWVudF9pbmRleF93cml0ZXJfaWQsCisgICAgICAgICAgICAgICAgR1NUX0FTU09DSUFUSU9OX0ZMQUdfS0VZX1VOSVQsCisgICAgICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBkZW11eC0+Y2x1c3Rlcl90aW1lLAorICAgICAgICAgICAgICAgIEdTVF9GT1JNQVRfQllURVMsIGRlbXV4LT5jbHVzdGVyX29mZnNldCwgTlVMTCk7CisgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQkxPQ0tHUk9VUDoKKyAgICAgICAgICBpZiAoIWdzdF9tYXRyb3NrYV9kZW11eF9zZWVrX2Jsb2NrIChkZW11eCkpCisgICAgICAgICAgICBnb3RvIHNraXA7CisgICAgICAgICAgR1NUX1JFQURfQ0hFQ0sgKGdzdF9tYXRyb3NrYV9kZW11eF90YWtlIChkZW11eCwgcmVhZCwgJmVibWwpKTsKKyAgICAgICAgICBERUJVR19FTEVNRU5UX1NUQVJUIChkZW11eCwgJmVibWwsICJCbG9ja0dyb3VwIik7CisgICAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoJmVibWwsICZpZCkpID09IEdTVF9GTE9XX09LKSB7CisgICAgICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayAoZGVtdXgsCisgICAgICAgICAgICAgICAgJmVibWwsIGRlbXV4LT5jbHVzdGVyX3RpbWUsIGRlbXV4LT5jbHVzdGVyX29mZnNldCwgRkFMU0UpOworICAgICAgICAgIH0KKyAgICAgICAgICBERUJVR19FTEVNRU5UX1NUT1AgKGRlbXV4LCAmZWJtbCwgIkJsb2NrR3JvdXAiLCByZXQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TSU1QTEVCTE9DSzoKKyAgICAgICAgICBpZiAoIWdzdF9tYXRyb3NrYV9kZW11eF9zZWVrX2Jsb2NrIChkZW11eCkpCisgICAgICAgICAgICBnb3RvIHNraXA7CisgICAgICAgICAgR1NUX1JFQURfQ0hFQ0sgKGdzdF9tYXRyb3NrYV9kZW11eF90YWtlIChkZW11eCwgcmVhZCwgJmVibWwpKTsKKyAgICAgICAgICBERUJVR19FTEVNRU5UX1NUQVJUIChkZW11eCwgJmVibWwsICJTaW1wbGVCbG9jayIpOworICAgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrIChkZW11eCwKKyAgICAgICAgICAgICAgJmVibWwsIGRlbXV4LT5jbHVzdGVyX3RpbWUsIGRlbXV4LT5jbHVzdGVyX29mZnNldCwgVFJVRSk7CisgICAgICAgICAgREVCVUdfRUxFTUVOVF9TVE9QIChkZW11eCwgJmVibWwsICJTaW1wbGVCbG9jayIsIHJldCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0FUVEFDSE1FTlRTOgorICAgICAgICAgIGlmICghZGVtdXgtPmNvbW1vbi5hdHRhY2htZW50c19wYXJzZWQpIHsKKyAgICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfZGVtdXhfdGFrZSAoZGVtdXgsIHJlYWQsICZlYm1sKSk7CisgICAgICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfYXR0YWNobWVudHMgKCZkZW11eC0+Y29tbW9uLAorICAgICAgICAgICAgICAgIEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSwgJmVibWwpOworICAgICAgICAgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgICAgZ3N0X21hdHJvc2thX2RlbXV4X3NlbmRfdGFncyAoZGVtdXgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX2RlbXV4X2ZsdXNoIChkZW11eCwgcmVhZCkpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVEFHUzoKKyAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX2RlbXV4X3Rha2UgKGRlbXV4LCByZWFkLCAmZWJtbCkpOworICAgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9tZXRhZGF0YSAoJmRlbXV4LT5jb21tb24sCisgICAgICAgICAgICAgIEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSwgJmVibWwpOworICAgICAgICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICBnc3RfbWF0cm9za2FfZGVtdXhfc2VuZF90YWdzIChkZW11eCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJTOgorICAgICAgICAgIGlmICghZGVtdXgtPmNvbW1vbi5jaGFwdGVyc19wYXJzZWQpIHsKKyAgICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfZGVtdXhfdGFrZSAoZGVtdXgsIHJlYWQsICZlYm1sKSk7CisgICAgICAgICAgICByZXQgPQorICAgICAgICAgICAgICAgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9jaGFwdGVycyAoJmRlbXV4LT5jb21tb24sICZlYm1sKTsKKworICAgICAgICAgICAgaWYgKGRlbXV4LT5jb21tb24udG9jKSB7CisgICAgICAgICAgICAgIGdzdF9tYXRyb3NrYV9kZW11eF9zZW5kX2V2ZW50IChkZW11eCwKKyAgICAgICAgICAgICAgICAgIGdzdF9ldmVudF9uZXdfdG9jIChkZW11eC0+Y29tbW9uLnRvYywgRkFMU0UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfZGVtdXhfZmx1c2ggKGRlbXV4LCByZWFkKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1NFRUtIRUFEOgorICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfZGVtdXhfdGFrZSAoZGVtdXgsIHJlYWQsICZlYm1sKSk7CisgICAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NvbnRlbnRzIChkZW11eCwgJmVibWwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DVUVTOgorICAgICAgICAgIGlmIChkZW11eC0+Y29tbW9uLmluZGV4X3BhcnNlZCkgeworICAgICAgICAgICAgR1NUX1JFQURfQ0hFQ0sgKGdzdF9tYXRyb3NrYV9kZW11eF9mbHVzaCAoZGVtdXgsIHJlYWQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX2RlbXV4X3Rha2UgKGRlbXV4LCByZWFkLCAmZWJtbCkpOworICAgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9pbmRleCAoJmRlbXV4LT5jb21tb24sICZlYm1sKTsKKyAgICAgICAgICAvKiBvbmx5IHB1c2ggYmFzZWQ7IGRlbGF5ZWQgaW5kZXggYnVpbGRpbmcgKi8KKyAgICAgICAgICBpZiAocmV0ID09IEdTVF9GTE9XX09LCisgICAgICAgICAgICAgICYmIGRlbXV4LT5jb21tb24uc3RhdGUgPT0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfU0VFSykgeworICAgICAgICAgICAgR3N0RXZlbnQgKmV2ZW50OworCisgICAgICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgICAgICAgICAgIGV2ZW50ID0gZGVtdXgtPnNlZWtfZXZlbnQ7CisgICAgICAgICAgICBkZW11eC0+c2Vla19ldmVudCA9IE5VTEw7CisgICAgICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworCisgICAgICAgICAgICBnX2Fzc2VydCAoZXZlbnQpOworICAgICAgICAgICAgLyogdW5saWtlbHkgdG8gZmFpbCwgc2luY2Ugd2UgbWFuYWdlZCB0byBzZWVrIHRvIHRoaXMgcG9pbnQgKi8KKyAgICAgICAgICAgIGlmICghZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX2V2ZW50IChkZW11eCwgTlVMTCwgZXZlbnQpKSB7CisgICAgICAgICAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgICAgICAgICBnb3RvIHNlZWtfZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgICAgICAvKiByZXN1bWUgZGF0YSBoYW5kbGluZywgbWFpbiB0aHJlYWQgY2xlYXIgdG8gc2VlayBhZ2FpbiAqLworICAgICAgICAgICAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgICAgICAgICAgICBkZW11eC0+Y29tbW9uLnN0YXRlID0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfREFUQTsKKyAgICAgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9QT1NJVElPTjoKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfUFJFVlNJWkU6CisgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0VOQ1JZUFRFREJMT0NLOgorICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TSUxFTlRUUkFDS1M6CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICJTa2lwcGluZyBDbHVzdGVyIHN1YmVsZW1lbnQgMHgleCAtIGlnbm9yaW5nIiwgaWQpOworICAgICAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICBza2lwOgorICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAic2tpcHBpbmcgRWxlbWVudCAweCV4IiwgaWQpOworICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfZGVtdXhfZmx1c2ggKGRlbXV4LCByZWFkKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChyZXQgPT0gR1NUX0ZMT1dfUEFSU0UpCisgICAgZ290byBwYXJzZV9mYWlsZWQ7CisKK2V4aXQ6CisgIGdzdF9lYm1sX3JlYWRfY2xlYXIgKCZlYm1sKTsKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK3JlYWRfZXJyb3I6CisgIHsKKyAgICAvKiBzaW1wbHkgZXhpdCwgbWF5YmUgbm90IGVub3VnaCBkYXRhIHlldCAqLworICAgIC8qIG5vIGVibWwgdG8gY2xlYXIgaWYgcmVhZCBlcnJvciAqLworICAgIHJldHVybiByZXQ7CisgIH0KK3BhcnNlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZW11eCwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAoIkZhaWxlZCB0byBwYXJzZSBFbGVtZW50IDB4JXgiLCBpZCkpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZXhpdDsKKyAgfQorbm90X3N0cmVhbWFibGU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgREVNVVgsIChOVUxMKSwKKyAgICAgICAgKCJGaWxlIGxheW91dCBkb2VzIG5vdCBwZXJtaXQgc3RyZWFtaW5nIikpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZXhpdDsKKyAgfQorbm9fdHJhY2tzOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlbXV4LCBTVFJFQU0sIERFTVVYLCAoTlVMTCksCisgICAgICAgICgiTm8gVHJhY2tzIGVsZW1lbnQgZm91bmQiKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBleGl0OworICB9CitpbnZhbGlkX2hlYWRlcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZW11eCwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLCAoIkludmFsaWQgaGVhZGVyIikpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZXhpdDsKKyAgfQorc2Vla19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgREVNVVgsIChOVUxMKSwgKCJGYWlsZWQgdG8gc2VlayIpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGV4aXQ7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9kZW11eF9sb29wIChHc3RQYWQgKiBwYWQpCit7CisgIEdzdE1hdHJvc2thRGVtdXggKmRlbXV4ID0gR1NUX01BVFJPU0tBX0RFTVVYIChHU1RfUEFEX1BBUkVOVCAocGFkKSk7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBndWludDMyIGlkOworICBndWludDY0IGxlbmd0aDsKKyAgZ3VpbnQgbmVlZGVkOworCisgIC8qIElmIHdlIGhhdmUgdG8gY2xvc2UgYSBzZWdtZW50LCBzZW5kIGEgbmV3IHNlZ21lbnQgdG8gZG8gdGhpcyBub3cgKi8KKyAgaWYgKEdfTElLRUxZIChkZW11eC0+Y29tbW9uLnN0YXRlID09IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX0RBVEEpKSB7CisgICAgaWYgKEdfVU5MSUtFTFkgKGRlbXV4LT5uZXdfc2VnbWVudCkpIHsKKyAgICAgIGdzdF9tYXRyb3NrYV9kZW11eF9zZW5kX2V2ZW50IChkZW11eCwgZGVtdXgtPm5ld19zZWdtZW50KTsKKyAgICAgIGRlbXV4LT5uZXdfc2VnbWVudCA9IE5VTEw7CisgICAgfQorICB9CisKKyAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BlZWtfaWRfbGVuZ3RoX3B1bGwgKCZkZW11eC0+Y29tbW9uLAorICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCAmaWQsICZsZW5ndGgsICZuZWVkZWQpOworICBpZiAocmV0ID09IEdTVF9GTE9XX0VPUykgeworICAgIGdvdG8gZW9zOworICB9IGVsc2UgaWYgKHJldCA9PSBHU1RfRkxPV19GTFVTSElORykgeworICAgIGdvdG8gcGF1c2U7CisgIH0gZWxzZSBpZiAocmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgcmV0ID0gZ3N0X21hdHJvc2thX2RlbXV4X2NoZWNrX3BhcnNlX2Vycm9yIChkZW11eCk7CisKKyAgICAvKiBPbmx5IGhhbmRsZSBFT1MgYXMgbm8gZXJyb3IgaWYgd2UncmUgb3V0c2lkZSB0aGUgc2VnbWVudCBhbHJlYWR5ICovCisgICAgaWYgKHJldCA9PSBHU1RfRkxPV19FT1MgJiYgKGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X2xlbmd0aCAhPSBHX01BWFVJTlQ2NAorICAgICAgICAgICAgJiYgZGVtdXgtPmNvbW1vbi5vZmZzZXQgPj0KKyAgICAgICAgICAgIGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X3N0YXJ0ICsKKyAgICAgICAgICAgIGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X2xlbmd0aCkpCisgICAgICBnb3RvIGVvczsKKyAgICBlbHNlIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIHBhdXNlOworICAgIGVsc2UKKyAgICAgIHJldHVybjsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgIk9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFUICIsIEVsZW1lbnQgaWQgMHgleCwgIgorICAgICAgInNpemUgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBuZWVkZWQgJWQiLCBkZW11eC0+Y29tbW9uLm9mZnNldCwgaWQsCisgICAgICBsZW5ndGgsIG5lZWRlZCk7CisKKyAgcmV0ID0gZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2lkIChkZW11eCwgaWQsIGxlbmd0aCwgbmVlZGVkKTsKKyAgaWYgKHJldCA9PSBHU1RfRkxPV19FT1MpCisgICAgZ290byBlb3M7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBwYXVzZTsKKworICAvKiBjaGVjayBpZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIGEgY29uZmlndXJlZCBzZWdtZW50ICovCisgIGlmIChHX0xJS0VMWSAoZGVtdXgtPmNvbW1vbi5zcmMtPmxlbikpIHsKKyAgICBndWludCBpOworCisgICAgZ19hc3NlcnQgKGRlbXV4LT5jb21tb24ubnVtX3N0cmVhbXMgPT0gZGVtdXgtPmNvbW1vbi5zcmMtPmxlbik7CisgICAgZm9yIChpID0gMDsgaSA8IGRlbXV4LT5jb21tb24uc3JjLT5sZW47IGkrKykgeworICAgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKmNvbnRleHQgPSBnX3B0cl9hcnJheV9pbmRleCAoZGVtdXgtPmNvbW1vbi5zcmMsCisgICAgICAgICAgaSk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChjb250ZXh0LT5wYWQsICJwb3MgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGNvbnRleHQtPnBvcykpOworICAgICAgaWYgKGNvbnRleHQtPmVvcyA9PSBGQUxTRSkKKyAgICAgICAgZ290byBuZXh0OworICAgIH0KKworICAgIEdTVF9JTkZPX09CSkVDVCAoZGVtdXgsICJBbGwgc3RyZWFtcyBhcmUgRU9TIik7CisgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgIGdvdG8gZW9zOworICB9CisKK25leHQ6CisgIGlmIChHX1VOTElLRUxZIChkZW11eC0+Y2FjaGVkX2xlbmd0aCA9PSBHX01BWFVJTlQ2NCB8fAorICAgICAgICAgIGRlbXV4LT5jb21tb24ub2Zmc2V0ID49IGRlbXV4LT5jYWNoZWRfbGVuZ3RoKSkgeworICAgIGRlbXV4LT5jYWNoZWRfbGVuZ3RoID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2dldF9sZW5ndGggKCZkZW11eC0+Y29tbW9uKTsKKyAgICBpZiAoZGVtdXgtPmNvbW1vbi5vZmZzZXQgPT0gZGVtdXgtPmNhY2hlZF9sZW5ndGgpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgIlJlYWNoZWQgZW5kIG9mIHN0cmVhbSIpOworICAgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgICAgZ290byBlb3M7CisgICAgfQorICB9CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworZW9zOgorICB7CisgICAgaWYgKGRlbXV4LT5jb21tb24uc2VnbWVudC5yYXRlIDwgMC4wKSB7CisgICAgICByZXQgPSBnc3RfbWF0cm9za2FfZGVtdXhfc2Vla190b19wcmV2aW91c19rZXlmcmFtZSAoZGVtdXgpOworICAgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgfQorcGF1c2U6CisgIHsKKyAgICBjb25zdCBnY2hhciAqcmVhc29uID0gZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCk7CisgICAgZ2Jvb2xlYW4gcHVzaF9lb3MgPSBGQUxTRTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgInBhdXNpbmcgdGFzaywgcmVhc29uICVzIiwgcmVhc29uKTsKKyAgICBnc3RfcGFkX3BhdXNlX3Rhc2sgKGRlbXV4LT5jb21tb24uc2lua3BhZCk7CisKKyAgICBpZiAocmV0ID09IEdTVF9GTE9XX0VPUykgeworICAgICAgLyogcGVyZm9ybSBFT1MgbG9naWMgKi8KKworICAgICAgLyogSWYgd2Ugd2VyZSBpbiB0aGUgaGVhZGVycywgbWFrZSBzdXJlIHdlIHNlbmQgbm8tbW9yZS1wYWRzLgorICAgICAgICAgVGhpcyB3aWxsIGVuc3VyZSBkZWNvZGViaW4gZG9lcyBub3QgZ2V0IHN0dWNrIHRoaW5raW5nCisgICAgICAgICB0aGUgY2hhaW4gaXMgbm90IGNvbXBsZXRlIHlldCwgYW5kIHdhaXRpbmcgaW5kZWZpbml0ZWx5LiAqLworICAgICAgaWYgKEdfVU5MSUtFTFkgKGRlbXV4LT5jb21tb24uc3RhdGUgPT0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfSEVBREVSKSkgeworICAgICAgICBpZiAoZGVtdXgtPmNvbW1vbi5zcmMtPmxlbiA9PSAwKSB7CisgICAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlbXV4LCBTVFJFQU0sIEZBSUxFRCwgKE5VTEwpLAorICAgICAgICAgICAgICAoIk5vIHBhZHMgY3JlYXRlZCIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChkZW11eCwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAgICAgICAoIkZhaWxlZCB0byBmaW5pc2ggcmVhZGluZyBoZWFkZXJzIikpOworICAgICAgICB9CisgICAgICAgIGdzdF9lbGVtZW50X25vX21vcmVfcGFkcyAoR1NUX0VMRU1FTlQgKGRlbXV4KSk7CisgICAgICB9CisKKyAgICAgIGlmIChkZW11eC0+Y29tbW9uLnNlZ21lbnQuZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NFR01FTlQpIHsKKyAgICAgICAgR3N0RXZlbnQgKmV2ZW50OworICAgICAgICBHc3RNZXNzYWdlICptc2c7CisgICAgICAgIGdpbnQ2NCBzdG9wOworCisgICAgICAgIC8qIGZvciBzZWdtZW50IHBsYXliYWNrIHdlIG5lZWQgdG8gcG9zdCB3aGVuIChpbiBzdHJlYW0gdGltZSkKKyAgICAgICAgICogd2Ugc3RvcHBlZCwgdGhpcyBpcyBlaXRoZXIgc3RvcCAod2hlbiBzZXQpIG9yIHRoZSBkdXJhdGlvbi4gKi8KKyAgICAgICAgaWYgKChzdG9wID0gZGVtdXgtPmNvbW1vbi5zZWdtZW50LnN0b3ApID09IC0xKQorICAgICAgICAgIHN0b3AgPSBkZW11eC0+bGFzdF9zdG9wX2VuZDsKKworICAgICAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJTZW5kaW5nIHNlZ21lbnQgZG9uZSwgYXQgZW5kIG9mIHNlZ21lbnQiKTsKKyAgICAgICAgbXNnID0gZ3N0X21lc3NhZ2VfbmV3X3NlZ21lbnRfZG9uZSAoR1NUX09CSkVDVCAoZGVtdXgpLCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgICBzdG9wKTsKKyAgICAgICAgaWYgKGRlbXV4LT5zZWdtZW50X3NlcW51bSkKKyAgICAgICAgICBnc3RfbWVzc2FnZV9zZXRfc2VxbnVtIChtc2csIGRlbXV4LT5zZWdtZW50X3NlcW51bSk7CisgICAgICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKGRlbXV4KSwgbXNnKTsKKworICAgICAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudF9kb25lIChHU1RfRk9STUFUX1RJTUUsIHN0b3ApOworICAgICAgICBpZiAoZGVtdXgtPnNlZ21lbnRfc2VxbnVtKQorICAgICAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChldmVudCwgZGVtdXgtPnNlZ21lbnRfc2VxbnVtKTsKKyAgICAgICAgZ3N0X21hdHJvc2thX2RlbXV4X3NlbmRfZXZlbnQgKGRlbXV4LCBldmVudCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwdXNoX2VvcyA9IFRSVUU7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXQgPT0gR1NUX0ZMT1dfTk9UX0xJTktFRCB8fCByZXQgPCBHU1RfRkxPV19FT1MpIHsKKyAgICAgIC8qIGZvciBmYXRhbCBlcnJvcnMgd2UgcG9zdCBhbiBlcnJvciBtZXNzYWdlICovCisgICAgICBHU1RfRUxFTUVOVF9GTE9XX0VSUk9SIChkZW11eCwgcmV0KTsKKyAgICAgIHB1c2hfZW9zID0gVFJVRTsKKyAgICB9CisgICAgaWYgKHB1c2hfZW9zKSB7CisgICAgICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgICAgIC8qIHNlbmQgRU9TLCBhbmQgcHJldmVudCBoYW5naW5nIGlmIG5vIHN0cmVhbXMgeWV0ICovCisgICAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJTZW5kaW5nIEVPUywgYXQgZW5kIG9mIHN0cmVhbSIpOworICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2VvcyAoKTsKKyAgICAgIGlmIChkZW11eC0+c2VnbWVudF9zZXFudW0pCisgICAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChldmVudCwgZGVtdXgtPnNlZ21lbnRfc2VxbnVtKTsKKyAgICAgIGlmICghZ3N0X21hdHJvc2thX2RlbXV4X3NlbmRfZXZlbnQgKGRlbXV4LCBldmVudCkgJiYKKyAgICAgICAgICAocmV0ID09IEdTVF9GTE9XX0VPUykpIHsKKyAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlbXV4LCBTVFJFQU0sIERFTVVYLAorICAgICAgICAgICAgKE5VTEwpLCAoImdvdCBlb3MgYnV0IG5vIHN0cmVhbXMgKHlldCkiKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKyAgfQorfQorCisvKgorICogQ3JlYXRlIGFuZCBwdXNoIGEgZmx1c2hpbmcgc2VlayBldmVudCB1cHN0cmVhbQorICovCitzdGF0aWMgZ2Jvb2xlYW4KK3BlcmZvcm1fc2Vla190b19vZmZzZXQgKEdzdE1hdHJvc2thRGVtdXggKiBkZW11eCwgZ2RvdWJsZSByYXRlLCBndWludDY0IG9mZnNldCwKKyAgICBndWludDMyIHNlcW51bSwgR3N0U2Vla0ZsYWdzIGZsYWdzKQoreworICBHc3RFdmVudCAqZXZlbnQ7CisgIGdib29sZWFuIHJlcyA9IDA7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJTZWVraW5nIHRvICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG9mZnNldCk7CisKKyAgZXZlbnQgPQorICAgICAgZ3N0X2V2ZW50X25ld19zZWVrIChyYXRlLCBHU1RfRk9STUFUX0JZVEVTLAorICAgICAgZmxhZ3MgfCBHU1RfU0VFS19GTEFHX0ZMVVNIIHwgR1NUX1NFRUtfRkxBR19BQ0NVUkFURSwKKyAgICAgIEdTVF9TRUVLX1RZUEVfU0VULCBvZmZzZXQsIEdTVF9TRUVLX1RZUEVfTk9ORSwgLTEpOworICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZXZlbnQsIHNlcW51bSk7CisKKyAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChkZW11eC0+Y29tbW9uLnNpbmtwYWQsIGV2ZW50KTsKKworICAvKiBzZWdtZW50IGV2ZW50IHdpbGwgdXBkYXRlIG9mZnNldCAqLworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlbXV4X2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RNYXRyb3NrYURlbXV4ICpkZW11eCA9IEdTVF9NQVRST1NLQV9ERU1VWCAocGFyZW50KTsKKyAgZ3VpbnQgYXZhaWxhYmxlOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludCBuZWVkZWQgPSAwOworICBndWludDMyIGlkOworICBndWludDY0IGxlbmd0aDsKKworICBpZiAoR19VTkxJS0VMWSAoR1NUX0JVRkZFUl9JU19ESVNDT05UIChidWZmZXIpKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZ290IERJU0NPTlQiKTsKKyAgICBnc3RfYWRhcHRlcl9jbGVhciAoZGVtdXgtPmNvbW1vbi5hZGFwdGVyKTsKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgICBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcmVzZXRfc3RyZWFtcyAoJmRlbXV4LT5jb21tb24sCisgICAgICAgIEdTVF9DTE9DS19USU1FX05PTkUsIEZBTFNFKTsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworICB9CisKKyAgZ3N0X2FkYXB0ZXJfcHVzaCAoZGVtdXgtPmNvbW1vbi5hZGFwdGVyLCBidWZmZXIpOworICBidWZmZXIgPSBOVUxMOworCituZXh0OgorICBhdmFpbGFibGUgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGRlbXV4LT5jb21tb24uYWRhcHRlcik7CisKKyAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BlZWtfaWRfbGVuZ3RoX3B1c2ggKCZkZW11eC0+Y29tbW9uLAorICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCAmaWQsICZsZW5ndGgsICZuZWVkZWQpOworICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LICYmIHJldCAhPSBHU1RfRkxPV19FT1MpKSB7CisgICAgaWYgKGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X2xlbmd0aCAhPSBHX01BWFVJTlQ2NAorICAgICAgICAmJiBkZW11eC0+Y29tbW9uLm9mZnNldCA+PQorICAgICAgICBkZW11eC0+Y29tbW9uLmVibWxfc2VnbWVudF9zdGFydCArIGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X2xlbmd0aCkgeworICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgIH0gZWxzZSB7CisgICAgICBnaW50NjQgYnl0ZXNfc2Nhbm5lZDsKKyAgICAgIGlmIChkZW11eC0+Y29tbW9uLnN0YXJ0X3Jlc3luY19vZmZzZXQgPT0gLTEpIHsKKyAgICAgICAgZGVtdXgtPmNvbW1vbi5zdGFydF9yZXN5bmNfb2Zmc2V0ID0gZGVtdXgtPmNvbW1vbi5vZmZzZXQ7CisgICAgICAgIGRlbXV4LT5jb21tb24uc3RhdGVfdG9fcmVzdG9yZSA9IGRlbXV4LT5jb21tb24uc3RhdGU7CisgICAgICB9CisgICAgICBieXRlc19zY2FubmVkID0gZGVtdXgtPmNvbW1vbi5vZmZzZXQgLSBkZW11eC0+Y29tbW9uLnN0YXJ0X3Jlc3luY19vZmZzZXQ7CisgICAgICBpZiAoYnl0ZXNfc2Nhbm5lZCA8PSBJTlZBTElEX0RBVEFfVEhSRVNIT0xEKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAicGFyc2UgZXJyb3IsIGxvb2tpbmcgZm9yIG5leHQgY2x1c3RlciwgYWN0dWFsIG9mZnNldCAlIgorICAgICAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCAiLCBzdGFydCByZXN5bmMgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICBkZW11eC0+Y29tbW9uLm9mZnNldCwgZGVtdXgtPmNvbW1vbi5zdGFydF9yZXN5bmNfb2Zmc2V0KTsKKyAgICAgICAgZGVtdXgtPmNvbW1vbi5zdGF0ZSA9IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX1NDQU5OSU5HOworICAgICAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAidW5yZWNvdmVyYWJsZSBwYXJzZSBlcnJvciwgbmV4dCBjbHVzdGVyIG5vdCBmb3VuZCBhbmQgdGhyZXNob2xkICIKKyAgICAgICAgICAgICJleGNlZWRlZCwgYnl0ZXMgc2Nhbm5lZCAlIiBHX0dJTlQ2NF9GT1JNQVQsIGJ5dGVzX3NjYW5uZWQpOworICAgICAgICByZXR1cm4gcmV0OworICAgICAgfQorICAgIH0KKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgIk9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFUICIsIEVsZW1lbnQgaWQgMHgleCwgIgorICAgICAgInNpemUgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBuZWVkZWQgJWQsIGF2YWlsYWJsZSAlZCIsCisgICAgICBkZW11eC0+Y29tbW9uLm9mZnNldCwgaWQsIGxlbmd0aCwgbmVlZGVkLCBhdmFpbGFibGUpOworCisgIGlmIChuZWVkZWQgPiBhdmFpbGFibGUpCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIHJldCA9IGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pZCAoZGVtdXgsIGlkLCBsZW5ndGgsIG5lZWRlZCk7CisgIGlmIChyZXQgPT0gR1NUX0ZMT1dfRU9TKSB7CisgICAgLyogbmVlZCBtb3JlIGRhdGEgKi8KKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0gZWxzZSBpZiAocmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfSBlbHNlCisgICAgZ290byBuZXh0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmVzID0gVFJVRTsKKyAgR3N0TWF0cm9za2FEZW11eCAqZGVtdXggPSBHU1RfTUFUUk9TS0FfREVNVVggKHBhcmVudCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAiaGF2ZSBldmVudCB0eXBlICVzOiAlcCBvbiBzaW5rIHBhZCIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSwgZXZlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6CisgICAgeworICAgICAgY29uc3QgR3N0U2VnbWVudCAqc2VnbWVudDsKKworICAgICAgLyogc29tZSBkZWJ1ZyBvdXRwdXQgKi8KKyAgICAgIGdzdF9ldmVudF9wYXJzZV9zZWdtZW50IChldmVudCwgJnNlZ21lbnQpOworICAgICAgLyogRklYTUU6IGRvIHdlIG5lZWQgdG8gdXBkYXRlIHNlZ21lbnQgYmFzZSBoZXJlIChsaWtlIGFjY3VtIGluIDAuMTApPyAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgInJlY2VpdmVkIGZvcm1hdCAlZCBzZWdtZW50ICUiIEdTVF9TRUdNRU5UX0ZPUk1BVCwgc2VnbWVudC0+Zm9ybWF0LAorICAgICAgICAgIHNlZ21lbnQpOworCisgICAgICBpZiAoZGVtdXgtPmNvbW1vbi5zdGF0ZSA8IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX0RBVEEpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJzdGlsbCBzdGFydGluZyIpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgICB9CisKKyAgICAgIC8qIHdlIG9ubHkgZXhwZWN0IGEgQllURSBzZWdtZW50LCBlLmcuIGZvbGxvd2luZyBhIHNlZWsgKi8KKyAgICAgIGlmIChzZWdtZW50LT5mb3JtYXQgIT0gR1NUX0ZPUk1BVF9CWVRFUykgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInVuc3VwcG9ydGVkIHNlZ21lbnQgZm9ybWF0LCBpZ25vcmluZyIpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgICB9CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiY2xlYXJpbmcgc2VnbWVudCBzdGF0ZSIpOworICAgICAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgICAgICAvKiBjbGVhciBjdXJyZW50IHNlZ21lbnQgbGVmdG92ZXIgKi8KKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChkZW11eC0+Y29tbW9uLmFkYXB0ZXIpOworICAgICAgLyogYW5kIHNvbWUgc3RyZWFtaW5nIHNldHVwICovCisgICAgICBkZW11eC0+Y29tbW9uLm9mZnNldCA9IHNlZ21lbnQtPnN0YXJ0OworICAgICAgLyogYWNjdW11bGF0ZSBiYXNlIGJhc2VkIG9uIGN1cnJlbnQgcG9zaXRpb24gKi8KKyAgICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZGVtdXgtPmNvbW1vbi5zZWdtZW50LnBvc2l0aW9uKSkKKyAgICAgICAgZGVtdXgtPmNvbW1vbi5zZWdtZW50LmJhc2UgKz0KKyAgICAgICAgICAgIChNQVggKGRlbXV4LT5jb21tb24uc2VnbWVudC5wb3NpdGlvbiwgZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lKQorICAgICAgICAgICAgLSBkZW11eC0+c3RyZWFtX3N0YXJ0X3RpbWUpIC8gZmFicyAoZGVtdXgtPmNvbW1vbi5zZWdtZW50LnJhdGUpOworICAgICAgLyogZG8gbm90IGtub3cgd2hlcmUgd2UgYXJlOworICAgICAgICogbmVlZCB0byBjb21lIGFjcm9zcyBhIGNsdXN0ZXIgYW5kIGdlbmVyYXRlIHNlZ21lbnQgKi8KKyAgICAgIGRlbXV4LT5jb21tb24uc2VnbWVudC5wb3NpdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICBkZW11eC0+Y2x1c3Rlcl90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICAgIGRlbXV4LT5jbHVzdGVyX29mZnNldCA9IDA7CisgICAgICBkZW11eC0+bmVlZF9zZWdtZW50ID0gVFJVRTsKKyAgICAgIGRlbXV4LT5zZWdtZW50X3NlcW51bSA9IGdzdF9ldmVudF9nZXRfc2VxbnVtIChldmVudCk7CisgICAgICAvKiBidXQga2VlcCBzb21lIG9mIHRoZSB1cHN0cmVhbSBzZWdtZW50ICovCisgICAgICBkZW11eC0+Y29tbW9uLnNlZ21lbnQucmF0ZSA9IHNlZ21lbnQtPnJhdGU7CisgICAgICBkZW11eC0+Y29tbW9uLnNlZ21lbnQuZmxhZ3MgPSBzZWdtZW50LT5mbGFnczsKKyAgICAgIC8qIGFsc28gY2hlY2sgaWYgbmVlZCB0byBrZWVwIHNvbWUgb2YgdGhlIHJlcXVlc3RlZCBzZWVrIHBvc2l0aW9uICovCisgICAgICBpZiAoZGVtdXgtPnNlZWtfb2Zmc2V0ID09IHNlZ21lbnQtPnN0YXJ0KSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAicG9zaXRpb24gbWF0Y2hlcyByZXF1ZXN0ZWQgc2VlayIpOworICAgICAgICBkZW11eC0+Y29tbW9uLnNlZ21lbnQucG9zaXRpb24gPSBkZW11eC0+cmVxdWVzdGVkX3NlZWtfdGltZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAidW5leHBlY3RlZCBzZWdtZW50IHBvc2l0aW9uIik7CisgICAgICB9CisgICAgICBkZW11eC0+cmVxdWVzdGVkX3NlZWtfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICBkZW11eC0+c2Vla19vZmZzZXQgPSAtMTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgZXhpdDoKKyAgICAgIC8qIGNoYWluIHdpbGwgc2VuZCBpbml0aWFsIHNlZ21lbnQgYWZ0ZXIgcGFkcyBoYXZlIGJlZW4gYWRkZWQsCisgICAgICAgKiBvciBvdGhlcndpc2UgY29tZSB1cCB3aXRoIG9uZSAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJlYXRpbmcgZXZlbnQiKTsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgeworICAgICAgaWYgKGRlbXV4LT5jb21tb24uc3RhdGUgIT0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfREFUQQorICAgICAgICAgICYmIGRlbXV4LT5jb21tb24uc3RhdGUgIT0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfU0NBTk5JTkcpIHsKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZW11eCwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgICAgIChOVUxMKSwgKCJnb3QgZW9zIGFuZCBkaWRuJ3QgcmVjZWl2ZSBhIGNvbXBsZXRlIGhlYWRlciBvYmplY3QiKSk7CisgICAgICB9IGVsc2UgaWYgKGRlbXV4LT5jb21tb24ubnVtX3N0cmVhbXMgPT0gMCkgeworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgREVNVVgsCisgICAgICAgICAgICAoTlVMTCksICgiZ290IGVvcyBidXQgbm8gc3RyZWFtcyAoeWV0KSIpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9tYXRyb3NrYV9kZW11eF9zZW5kX2V2ZW50IChkZW11eCwgZXZlbnQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6CisgICAgeworICAgICAgZ3VpbnQ2NCBkdXI7CisKKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChkZW11eC0+Y29tbW9uLmFkYXB0ZXIpOworICAgICAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgICAgICBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcmVzZXRfc3RyZWFtcyAoJmRlbXV4LT5jb21tb24sCisgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSwgVFJVRSk7CisgICAgICBnc3RfZmxvd19jb21iaW5lcl9yZXNldCAoZGVtdXgtPmZsb3djb21iaW5lcik7CisgICAgICBkdXIgPSBkZW11eC0+Y29tbW9uLnNlZ21lbnQuZHVyYXRpb247CisgICAgICBnc3Rfc2VnbWVudF9pbml0ICgmZGVtdXgtPmNvbW1vbi5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICAgICAgZGVtdXgtPmNvbW1vbi5zZWdtZW50LmR1cmF0aW9uID0gZHVyOworICAgICAgZGVtdXgtPmNsdXN0ZXJfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICBkZW11eC0+Y2x1c3Rlcl9vZmZzZXQgPSAwOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKyAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9kZW11eF9zaW5rX2FjdGl2YXRlIChHc3RQYWQgKiBzaW5rcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQpCit7CisgIEdzdE1hdHJvc2thRGVtdXggKmRlbXV4ID0gR1NUX01BVFJPU0tBX0RFTVVYIChwYXJlbnQpOworICBHc3RRdWVyeSAqcXVlcnk7CisgIGdib29sZWFuIHB1bGxfbW9kZSA9IEZBTFNFOworCisgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19zY2hlZHVsaW5nICgpOworCisgIGlmIChnc3RfcGFkX3BlZXJfcXVlcnkgKHNpbmtwYWQsIHF1ZXJ5KSkKKyAgICBwdWxsX21vZGUgPSBnc3RfcXVlcnlfaGFzX3NjaGVkdWxpbmdfbW9kZV93aXRoX2ZsYWdzIChxdWVyeSwKKyAgICAgICAgR1NUX1BBRF9NT0RFX1BVTEwsIEdTVF9TQ0hFRFVMSU5HX0ZMQUdfU0VFS0FCTEUpOworCisgIGdzdF9xdWVyeV91bnJlZiAocXVlcnkpOworCisgIGlmIChwdWxsX21vZGUpIHsKKyAgICBHU1RfREVCVUcgKCJnb2luZyB0byBwdWxsIG1vZGUiKTsKKyAgICBkZW11eC0+c3RyZWFtaW5nID0gRkFMU0U7CisgICAgcmV0dXJuIGdzdF9wYWRfYWN0aXZhdGVfbW9kZSAoc2lua3BhZCwgR1NUX1BBRF9NT0RFX1BVTEwsIFRSVUUpOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVRyAoImdvaW5nIHRvIHB1c2ggKHN0cmVhbWluZykgbW9kZSIpOworICAgIGRlbXV4LT5zdHJlYW1pbmcgPSBUUlVFOworICAgIHJldHVybiBnc3RfcGFkX2FjdGl2YXRlX21vZGUgKHNpbmtwYWQsIEdTVF9QQURfTU9ERV9QVVNILCBUUlVFKTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9kZW11eF9zaW5rX2FjdGl2YXRlX21vZGUgKEdzdFBhZCAqIHNpbmtwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RQYWRNb2RlIG1vZGUsIGdib29sZWFuIGFjdGl2ZSkKK3sKKyAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBHU1RfUEFEX01PREVfUFVMTDoKKyAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgLyogaWYgd2UgaGF2ZSBhIHNjaGVkdWxlciB3ZSBjYW4gc3RhcnQgdGhlIHRhc2sgKi8KKyAgICAgICAgZ3N0X3BhZF9zdGFydF90YXNrIChzaW5rcGFkLCAoR3N0VGFza0Z1bmN0aW9uKSBnc3RfbWF0cm9za2FfZGVtdXhfbG9vcCwKKyAgICAgICAgICAgIHNpbmtwYWQsIE5VTEwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ3N0X3BhZF9zdG9wX3Rhc2sgKHNpbmtwYWQpOworICAgICAgfQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgY2FzZSBHU1RfUEFEX01PREVfUFVTSDoKKyAgICAgIHJldHVybiBUUlVFOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X21hdHJvc2thX2RlbXV4X3ZpZGVvX2NhcHMgKEdzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQgKgorICAgIHZpZGVvY29udGV4dCwgY29uc3QgZ2NoYXIgKiBjb2RlY19pZCwgZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgc2l6ZSwKKyAgICBnY2hhciAqKiBjb2RlY19uYW1lLCBndWludDMyICogcmlmZl9mb3VyY2MpCit7CisgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjb250ZXh0ID0gKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICopIHZpZGVvY29udGV4dDsKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisKKyAgZ19hc3NlcnQgKHZpZGVvY29udGV4dCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKGNvZGVjX25hbWUgIT0gTlVMTCk7CisKKyAgaWYgKHJpZmZfZm91cmNjKQorICAgICpyaWZmX2ZvdXJjYyA9IDA7CisKKyAgLyogVE9ETzogY2hlY2sgaWYgd2UgaGF2ZSBhbGwgY29kZWMgdHlwZXMgZnJvbSBtYXRyb3NrYS1pZHMuaAorICAgKiAgICAgICBjaGVjayBpZiB3ZSBoYXZlIHRvIGRvIG1vcmUgc3BlY2lhbCB0aGluZ3Mgd2l0aCBjb2RlY19wcml2YXRlCisgICAqCisgICAqIEFkZCBzdXBwb3J0IGZvcgorICAgKiAgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1FVSUNLVElNRQorICAgKiAgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1NOT1cKKyAgICovCisKKyAgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fVkZXX0ZPVVJDQykpIHsKKyAgICBnc3RfcmlmZl9zdHJmX3ZpZHMgKnZpZHMgPSBOVUxMOworCisgICAgaWYgKGRhdGEpIHsKKyAgICAgIEdzdEJ1ZmZlciAqYnVmID0gTlVMTDsKKworICAgICAgdmlkcyA9IChnc3RfcmlmZl9zdHJmX3ZpZHMgKikgZGF0YTsKKworICAgICAgLyogYXNzdXJlIHNpemUgaXMgYmlnIGVub3VnaCAqLworICAgICAgaWYgKHNpemUgPCAyNCkgeworICAgICAgICBHU1RfV0FSTklORyAoIlRvbyBzbWFsbCBCSVRNQVBJTkZPSEVBREVSICglZCBieXRlcykiLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBpZiAoc2l6ZSA8IHNpemVvZiAoZ3N0X3JpZmZfc3RyZl92aWRzKSkgeworICAgICAgICB2aWRzID0gZ19uZXcgKGdzdF9yaWZmX3N0cmZfdmlkcywgMSk7CisgICAgICAgIG1lbWNweSAodmlkcywgZGF0YSwgc2l6ZSk7CisgICAgICB9CisKKyAgICAgIGNvbnRleHQtPmR0c19vbmx5ID0gVFJVRTsgLyogVkZXIGZpbGVzIG9ubHkgc3RvcmUgRFRTICovCisKKyAgICAgIC8qIGxpdHRsZS1lbmRpYW4gLT4gYnl0ZS1vcmRlciAqLworICAgICAgdmlkcy0+c2l6ZSA9IEdVSU5UMzJfRlJPTV9MRSAodmlkcy0+c2l6ZSk7CisgICAgICB2aWRzLT53aWR0aCA9IEdVSU5UMzJfRlJPTV9MRSAodmlkcy0+d2lkdGgpOworICAgICAgdmlkcy0+aGVpZ2h0ID0gR1VJTlQzMl9GUk9NX0xFICh2aWRzLT5oZWlnaHQpOworICAgICAgdmlkcy0+cGxhbmVzID0gR1VJTlQxNl9GUk9NX0xFICh2aWRzLT5wbGFuZXMpOworICAgICAgdmlkcy0+Yml0X2NudCA9IEdVSU5UMTZfRlJPTV9MRSAodmlkcy0+Yml0X2NudCk7CisgICAgICB2aWRzLT5jb21wcmVzc2lvbiA9IEdVSU5UMzJfRlJPTV9MRSAodmlkcy0+Y29tcHJlc3Npb24pOworICAgICAgdmlkcy0+aW1hZ2Vfc2l6ZSA9IEdVSU5UMzJfRlJPTV9MRSAodmlkcy0+aW1hZ2Vfc2l6ZSk7CisgICAgICB2aWRzLT54cGVsc19tZXRlciA9IEdVSU5UMzJfRlJPTV9MRSAodmlkcy0+eHBlbHNfbWV0ZXIpOworICAgICAgdmlkcy0+eXBlbHNfbWV0ZXIgPSBHVUlOVDMyX0ZST01fTEUgKHZpZHMtPnlwZWxzX21ldGVyKTsKKyAgICAgIHZpZHMtPm51bV9jb2xvcnMgPSBHVUlOVDMyX0ZST01fTEUgKHZpZHMtPm51bV9jb2xvcnMpOworICAgICAgdmlkcy0+aW1wX2NvbG9ycyA9IEdVSU5UMzJfRlJPTV9MRSAodmlkcy0+aW1wX2NvbG9ycyk7CisKKyAgICAgIGlmIChzaXplID4gc2l6ZW9mIChnc3RfcmlmZl9zdHJmX3ZpZHMpKSB7IC8qIHNvbWUgZXh0cmFfZGF0YSAqLworICAgICAgICBnc2l6ZSBvZmZzZXQgPSBzaXplb2YgKGdzdF9yaWZmX3N0cmZfdmlkcyk7CisKKyAgICAgICAgYnVmID0KKyAgICAgICAgICAgIGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGdfbWVtZHVwICgoZ3VpbnQ4ICopIHZpZHMgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgc2l6ZSAtIG9mZnNldCksIHNpemUgLSBvZmZzZXQpOworICAgICAgfQorCisgICAgICBpZiAocmlmZl9mb3VyY2MpCisgICAgICAgICpyaWZmX2ZvdXJjYyA9IHZpZHMtPmNvbXByZXNzaW9uOworCisgICAgICBjYXBzID0gZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX2NhcHMgKHZpZHMtPmNvbXByZXNzaW9uLCBOVUxMLCB2aWRzLAorICAgICAgICAgIGJ1ZiwgTlVMTCwgY29kZWNfbmFtZSk7CisKKyAgICAgIGlmIChjYXBzID09IE5VTEwpIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJVbmhhbmRsZWQgUklGRiBmb3VyY2MgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHZpZHMtPmNvbXByZXNzaW9uKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdGF0aWMgR3N0U3RhdGljQ2FwcyBpbnRyYV9jYXBzID0gR1NUX1NUQVRJQ19DQVBTICgiaW1hZ2UvanBlZzsgIgorICAgICAgICAgICAgInZpZGVvL3gtcmF3OyBpbWFnZS9wbmc7IHZpZGVvL3gtZHY7IHZpZGVvL3gtaHVmZnl1djsgdmlkZW8veC1mZnY7ICIKKyAgICAgICAgICAgICJ2aWRlby94LWNvbXByZXNzZWQteXV2Iik7CisgICAgICAgIGNvbnRleHQtPmludHJhX29ubHkgPQorICAgICAgICAgICAgZ3N0X2NhcHNfY2FuX2ludGVyc2VjdCAoZ3N0X3N0YXRpY19jYXBzX2dldCAoJmludHJhX2NhcHMpLCBjYXBzKTsKKyAgICAgIH0KKworICAgICAgaWYgKGJ1ZikKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAgICAgaWYgKHZpZHMgIT0gKGdzdF9yaWZmX3N0cmZfdmlkcyAqKSBkYXRhKQorICAgICAgICBnX2ZyZWUgKHZpZHMpOworICAgIH0KKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1VOQ09NUFJFU1NFRCkpIHsKKyAgICBHc3RWaWRlb0luZm8gaW5mbzsKKyAgICBHc3RWaWRlb0Zvcm1hdCBmb3JtYXQ7CisKKyAgICBnc3RfdmlkZW9faW5mb19pbml0ICgmaW5mbyk7CisgICAgc3dpdGNoICh2aWRlb2NvbnRleHQtPmZvdXJjYykgeworICAgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdJJywgJzQnLCAnMicsICcwJyk6CisgICAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfSTQyMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ1knLCAnVScsICdZJywgJzInKToKKyAgICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9ZVVkyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnWScsICdWJywgJzEnLCAnMicpOgorICAgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX1lWMTI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdVJywgJ1knLCAnVicsICdZJyk6CisgICAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfVVlWWTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ0EnLCAnWScsICdVJywgJ1YnKToKKyAgICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnWScsICc4JywgJzAnLCAnMCcpOgorICAgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdZJywgJzgnLCAnICcsICcgJyk6CisgICAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfR1JBWTg7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdSJywgJ0cnLCAnQicsIDI0KToKKyAgICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9SR0I7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdCJywgJ0cnLCAnUicsIDI0KToKKyAgICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9CR1I7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX0RFQlVHICgiVW5rbm93biBmb3VyY2MgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHZpZGVvY29udGV4dC0+Zm91cmNjKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNvbnRleHQtPmludHJhX29ubHkgPSBUUlVFOworCisgICAgZ3N0X3ZpZGVvX2luZm9fc2V0X2Zvcm1hdCAoJmluZm8sIGZvcm1hdCwgdmlkZW9jb250ZXh0LT5waXhlbF93aWR0aCwKKyAgICAgICAgdmlkZW9jb250ZXh0LT5waXhlbF9oZWlnaHQpOworICAgIGNhcHMgPSBnc3RfdmlkZW9faW5mb190b19jYXBzICgmaW5mbyk7CisgICAgKmNvZGVjX25hbWUgPSBnc3RfcGJfdXRpbHNfZ2V0X2NvZGVjX2Rlc2NyaXB0aW9uIChjYXBzKTsKKyAgICBjb250ZXh0LT5hbGlnbm1lbnQgPSAzMjsKKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX01QRUc0X1NQKSkgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1kaXZ4IiwKKyAgICAgICAgImRpdnh2ZXJzaW9uIiwgR19UWVBFX0lOVCwgNCwgTlVMTCk7CisgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cCAoIk1QRUctNCBzaW1wbGUgcHJvZmlsZSIpOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFRzRfQVNQKSB8fAorICAgICAgIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19NUEVHNF9BUCkpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL21wZWciLAorICAgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCA0LAorICAgICAgICAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgICBpZiAoZGF0YSkgeworICAgICAgR3N0QnVmZmVyICpwcml2OworCisgICAgICBwcml2ID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZ19tZW1kdXAgKGRhdGEsIHNpemUpLCBzaXplKTsKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLCBwcml2LCBOVUxMKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHByaXYpOworCisgICAgICBnc3RfY29kZWNfdXRpbHNfbXBlZzR2aWRlb19jYXBzX3NldF9sZXZlbF9hbmRfcHJvZmlsZSAoY2FwcywgZGF0YSwgc2l6ZSk7CisgICAgfQorICAgIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX01QRUc0X0FTUCkpCisgICAgICAqY29kZWNfbmFtZSA9IGdfc3RyZHVwICgiTVBFRy00IGFkdmFuY2VkIHNpbXBsZSBwcm9maWxlIik7CisgICAgZWxzZQorICAgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cCAoIk1QRUctNCBhZHZhbmNlZCBwcm9maWxlIik7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19NU01QRUc0VjMpKSB7CisjaWYgMAorICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZnVsbCAoZ3N0X3N0cnVjdHVyZV9uZXcgKCJ2aWRlby94LWRpdngiLAorICAgICAgICAgICAgImRpdnh2ZXJzaW9uIiwgR19UWVBFX0lOVCwgMywgTlVMTCksCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgidmlkZW8veC1tc21wZWciLAorICAgICAgICAgICAgIm1zbXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCA0MywgTlVMTCksIE5VTEwpOworI2VuZGlmCisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LW1zbXBlZyIsCisgICAgICAgICJtc21wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgNDMsIE5VTEwpOworICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXAgKCJNaWNyb3NvZnQgTVBFRy00IHYuMyIpOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFRzEpIHx8CisgICAgICAhc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX01QRUcyKSkgeworICAgIGdpbnQgbXBlZ3ZlcnNpb247CisKKyAgICBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19NUEVHMSkpCisgICAgICBtcGVndmVyc2lvbiA9IDE7CisgICAgZWxzZQorICAgICAgbXBlZ3ZlcnNpb24gPSAyOworCisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby9tcGVnIiwKKyAgICAgICAgInN5c3RlbXN0cmVhbSIsIEdfVFlQRV9CT09MRUFOLCBGQUxTRSwKKyAgICAgICAgIm1wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgbXBlZ3ZlcnNpb24sIE5VTEwpOworICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiTVBFRy0lZCB2aWRlbyIsIG1wZWd2ZXJzaW9uKTsKKyAgICBjb250ZXh0LT5wb3N0cHJvY2Vzc19mcmFtZSA9IGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfbXBlZ19zZXFfaGVhZGVyOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTUpQRUcpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJpbWFnZS9qcGVnIik7CisgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cCAoIk1vdGlvbi1KUEVHIik7CisgICAgY29udGV4dC0+aW50cmFfb25seSA9IFRSVUU7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19NUEVHNF9BVkMpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJ2aWRlby94LWgyNjQiKTsKKyAgICBpZiAoZGF0YSkgeworICAgICAgR3N0QnVmZmVyICpwcml2OworCisgICAgICAvKiBGaXJzdCBieXRlIGlzIHRoZSB2ZXJzaW9uLCBzZWNvbmQgaXMgdGhlIHByb2ZpbGUgaW5kaWNhdGlvbiwgYW5kIHRoaXJkCisgICAgICAgKiBpcyB0aGUgNSBjb250cmFpbnRfc2V0X2ZsYWdzIGFuZCAzIHJlc2VydmVkIGJpdHMuIEZvdXJ0aCBieXRlIGlzIHRoZQorICAgICAgICogbGV2ZWwgaW5kaWNhdGlvbi4gKi8KKyAgICAgIGdzdF9jb2RlY191dGlsc19oMjY0X2NhcHNfc2V0X2xldmVsX2FuZF9wcm9maWxlIChjYXBzLCBkYXRhICsgMSwKKyAgICAgICAgICBzaXplIC0gMSk7CisKKyAgICAgIHByaXYgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChnX21lbWR1cCAoZGF0YSwgc2l6ZSksIHNpemUpOworICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIHByaXYsIE5VTEwpOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocHJpdik7CisKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJzdHJlYW0tZm9ybWF0IiwgR19UWVBFX1NUUklORywgImF2YyIsCisgICAgICAgICAgImFsaWdubWVudCIsIEdfVFlQRV9TVFJJTkcsICJhdSIsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklORyAoIk5vIGNvZGVjIGRhdGEgZm91bmQsIGFzc3VtaW5nIG91dHB1dCBpcyBieXRlLXN0cmVhbSIpOworICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgInN0cmVhbS1mb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiYnl0ZS1zdHJlYW0iLAorICAgICAgICAgIE5VTEwpOworICAgIH0KKyAgICAqY29kZWNfbmFtZSA9IGdfc3RyZHVwICgiSDI2NCIpOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFR0hfSEVWQykpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtaDI2NSIpOworICAgIGlmIChkYXRhKSB7CisgICAgICBHc3RCdWZmZXIgKnByaXY7CisKKyAgICAgIGdzdF9jb2RlY191dGlsc19oMjY1X2NhcHNfc2V0X2xldmVsX3RpZXJfYW5kX3Byb2ZpbGUgKGNhcHMsIGRhdGEgKyAxLAorICAgICAgICAgIHNpemUgLSAxKTsKKworICAgICAgcHJpdiA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGdfbWVtZHVwIChkYXRhLCBzaXplKSwgc2l6ZSk7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAiY29kZWNfZGF0YSIsIEdTVF9UWVBFX0JVRkZFUiwgcHJpdiwgTlVMTCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChwcml2KTsKKworICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgInN0cmVhbS1mb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiaHZjMSIsCisgICAgICAgICAgImFsaWdubWVudCIsIEdfVFlQRV9TVFJJTkcsICJhdSIsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklORyAoIk5vIGNvZGVjIGRhdGEgZm91bmQsIGFzc3VtaW5nIG91dHB1dCBpcyBieXRlLXN0cmVhbSIpOworICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgInN0cmVhbS1mb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiYnl0ZS1zdHJlYW0iLAorICAgICAgICAgIE5VTEwpOworICAgIH0KKyAgICAqY29kZWNfbmFtZSA9IGdfc3RyZHVwICgiSEVWQyIpOworICB9IGVsc2UgaWYgKCghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1JFQUxWSURFTzEpKSB8fAorICAgICAgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fUkVBTFZJREVPMikpIHx8CisgICAgICAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19SRUFMVklERU8zKSkgfHwKKyAgICAgICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1JFQUxWSURFTzQpKSkgeworICAgIGdpbnQgcm12ZXJzaW9uID0gLTE7CisKKyAgICBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19SRUFMVklERU8xKSkKKyAgICAgIHJtdmVyc2lvbiA9IDE7CisgICAgZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19SRUFMVklERU8yKSkKKyAgICAgIHJtdmVyc2lvbiA9IDI7CisgICAgZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19SRUFMVklERU8zKSkKKyAgICAgIHJtdmVyc2lvbiA9IDM7CisgICAgZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19SRUFMVklERU80KSkKKyAgICAgIHJtdmVyc2lvbiA9IDQ7CisKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcG4tcmVhbHZpZGVvIiwKKyAgICAgICAgInJtdmVyc2lvbiIsIEdfVFlQRV9JTlQsIHJtdmVyc2lvbiwgTlVMTCk7CisgICAgR1NUX0RFQlVHICgiZGF0YTolcCwgc2l6ZToweCV4IiwgZGF0YSwgc2l6ZSk7CisgICAgLyogV2UgbmVlZCB0byBleHRyYWN0IHRoZSBleHRyYWRhdGEgISAqLworICAgIGlmIChkYXRhICYmIChzaXplID49IDB4MjIpKSB7CisgICAgICBHc3RCdWZmZXIgKnByaXY7CisgICAgICBndWludCByZm9ybWF0OworICAgICAgZ3VpbnQgc3ViZm9ybWF0OworCisgICAgICBzdWJmb3JtYXQgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEgKyAweDFhKTsKKyAgICAgIHJmb3JtYXQgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEgKyAweDFlKTsKKworICAgICAgcHJpdiA9CisgICAgICAgICAgZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZ19tZW1kdXAgKGRhdGEgKyAweDFhLCBzaXplIC0gMHgxYSksCisgICAgICAgICAgc2l6ZSAtIDB4MWEpOworICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIHByaXYsICJmb3JtYXQiLAorICAgICAgICAgIEdfVFlQRV9JTlQsIHJmb3JtYXQsICJzdWJmb3JtYXQiLCBHX1RZUEVfSU5ULCBzdWJmb3JtYXQsIE5VTEwpOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocHJpdik7CisKKyAgICB9CisgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJSZWFsVmlkZW8gJWQuMCIsIHJtdmVyc2lvbik7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19USEVPUkEpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJ2aWRlby94LXRoZW9yYSIpOworICAgIGNvbnRleHQtPnN0cmVhbV9oZWFkZXJzID0KKyAgICAgICAgZ3N0X21hdHJvc2thX3BhcnNlX3hpcGhfc3RyZWFtX2hlYWRlcnMgKGNvbnRleHQtPmNvZGVjX3ByaXYsCisgICAgICAgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSk7CisgICAgLyogRklYTUU6IG1hcmsgc3RyZWFtIGFzIGJyb2tlbiBhbmQgc2tpcCBpZiB0aGVyZSBhcmUgbm8gc3RyZWFtIGhlYWRlcnMgKi8KKyAgICBjb250ZXh0LT5zZW5kX3N0cmVhbV9oZWFkZXJzID0gVFJVRTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX0RJUkFDKSkgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgidmlkZW8veC1kaXJhYyIpOworICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiRGlyYWMiKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1ZQOCkpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtdnA4Iik7CisgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJPbjIgVlA4Iik7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19WUDkpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJ2aWRlby94LXZwOSIpOworICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiT24yIFZQOSIpOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fQVYxKSkgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgidmlkZW8veC1hdjEiKTsKKyAgICAqY29kZWNfbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoIkFPTSBBVjEiKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1BST1JFUykpIHsKKyAgICBndWludDMyIGZvdXJjYzsKKyAgICBjb25zdCBnY2hhciAqdmFyaWFudCwgKnZhcmlhbnRfZGVzY3IgPSAiIjsKKworICAgIC8qIEV4cGVjdCBhIGZvdXJjYyBpbiB0aGUgY29kZWMgcHJpdmF0ZSBkYXRhICovCisgICAgaWYgKCFkYXRhIHx8IHNpemUgPCA0KSB7CisgICAgICBHU1RfV0FSTklORyAoIk5vIG9yIHRvbyBzbWFsbCBQUk9SRVNTIGZvdXJjYyAoJWQgYnl0ZXMpIiwgc2l6ZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3VyY2MgPSBHU1RfU1RSX0ZPVVJDQyAoZGF0YSk7CisgICAgc3dpdGNoIChmb3VyY2MpIHsKKyAgICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnYScsICdwJywgJ2MnLCAncycpOgorICAgICAgICB2YXJpYW50X2Rlc2NyID0gIiA0OjI6MiBMVCI7CisgICAgICAgIHZhcmlhbnQgPSAibHQiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnYScsICdwJywgJ2MnLCAnaCcpOgorICAgICAgICB2YXJpYW50ID0gImhxIjsKKyAgICAgICAgdmFyaWFudF9kZXNjciA9ICIgNDoyOjIgSFEiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnYScsICdwJywgJzQnLCAnaCcpOgorICAgICAgICB2YXJpYW50ID0gIjQ0NDQiOworICAgICAgICB2YXJpYW50X2Rlc2NyID0gIiA0OjQ6NDo0IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2EnLCAncCcsICdjJywgJ28nKToKKyAgICAgICAgdmFyaWFudCA9ICJwcm94eSI7CisgICAgICAgIHZhcmlhbnRfZGVzY3IgPSAiIDQ6MjoyIFByb3h5IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2EnLCAncCcsICdjJywgJ24nKToKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHZhcmlhbnQgPSAic3RhbmRhcmQiOworICAgICAgICB2YXJpYW50X2Rlc2NyID0gIiA0OjI6MiBTRCI7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIEdTVF9MT0cgKCJQcm9yZXMgdmlkZW8sIGNvZGVjIGZvdXJjYyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKTsKKworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1wcm9yZXMiLAorICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgdmFyaWFudCwgTlVMTCk7CisgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJBcHBsZSBQcm9SZXMlcyIsIHZhcmlhbnRfZGVzY3IpOworICAgIGNvbnRleHQtPnBvc3Rwcm9jZXNzX2ZyYW1lID0gZ3N0X21hdHJvc2thX2RlbXV4X2FkZF9wcm9yZXNfaGVhZGVyOworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HICgiVW5rbm93biBjb2RlYyAnJXMnLCBjYW5ub3QgYnVpbGQgQ2FwcyIsIGNvZGVjX2lkKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChjYXBzICE9IE5VTEwpIHsKKyAgICBpbnQgaTsKKyAgICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7IGkrKykgeworICAgICAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSk7CisKKyAgICAgIC8qIEZJWE1FOiB1c2UgdGhlIHJlYWwgdW5pdCBoZXJlISAqLworICAgICAgR1NUX0RFQlVHICgidmlkZW8gc2l6ZSAlZHglZCwgdGFyZ2V0IGRpc3BsYXkgc2l6ZSAlZHglZCAoYW55IHVuaXQpIiwKKyAgICAgICAgICB2aWRlb2NvbnRleHQtPnBpeGVsX3dpZHRoLAorICAgICAgICAgIHZpZGVvY29udGV4dC0+cGl4ZWxfaGVpZ2h0LAorICAgICAgICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV93aWR0aCwgdmlkZW9jb250ZXh0LT5kaXNwbGF5X2hlaWdodCk7CisKKyAgICAgIC8qIHBpeGVsIHdpZHRoIGFuZCBoZWlnaHQgYXJlIHRoZSB3IGFuZCBoIG9mIHRoZSB2aWRlbyBpbiBwaXhlbHMgKi8KKyAgICAgIGlmICh2aWRlb2NvbnRleHQtPnBpeGVsX3dpZHRoID4gMCAmJiB2aWRlb2NvbnRleHQtPnBpeGVsX2hlaWdodCA+IDApIHsKKyAgICAgICAgZ2ludCB3ID0gdmlkZW9jb250ZXh0LT5waXhlbF93aWR0aDsKKyAgICAgICAgZ2ludCBoID0gdmlkZW9jb250ZXh0LT5waXhlbF9oZWlnaHQ7CisKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHN0cnVjdHVyZSwKKyAgICAgICAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHcsICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBoLCBOVUxMKTsKKyAgICAgIH0KKworICAgICAgaWYgKHZpZGVvY29udGV4dC0+ZGlzcGxheV93aWR0aCA+IDAgfHwgdmlkZW9jb250ZXh0LT5kaXNwbGF5X2hlaWdodCA+IDApIHsKKyAgICAgICAgaW50IG4sIGQ7CisKKyAgICAgICAgaWYgKHZpZGVvY29udGV4dC0+ZGlzcGxheV93aWR0aCA8PSAwKQorICAgICAgICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV93aWR0aCA9IHZpZGVvY29udGV4dC0+cGl4ZWxfd2lkdGg7CisgICAgICAgIGlmICh2aWRlb2NvbnRleHQtPmRpc3BsYXlfaGVpZ2h0IDw9IDApCisgICAgICAgICAgdmlkZW9jb250ZXh0LT5kaXNwbGF5X2hlaWdodCA9IHZpZGVvY29udGV4dC0+cGl4ZWxfaGVpZ2h0OworCisgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgcGl4ZWwgYXNwZWN0IHJhdGlvIHVzaW5nIHRoZSBkaXNwbGF5IGFuZCBwaXhlbCB3L2ggKi8KKyAgICAgICAgbiA9IHZpZGVvY29udGV4dC0+ZGlzcGxheV93aWR0aCAqIHZpZGVvY29udGV4dC0+cGl4ZWxfaGVpZ2h0OworICAgICAgICBkID0gdmlkZW9jb250ZXh0LT5kaXNwbGF5X2hlaWdodCAqIHZpZGVvY29udGV4dC0+cGl4ZWxfd2lkdGg7CisgICAgICAgIEdTVF9ERUJVRyAoInNldHRpbmcgUEFSIHRvICVkLyVkIiwgbiwgZCk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzdHJ1Y3R1cmUsICJwaXhlbC1hc3BlY3QtcmF0aW8iLAorICAgICAgICAgICAgR1NUX1RZUEVfRlJBQ1RJT04sCisgICAgICAgICAgICB2aWRlb2NvbnRleHQtPmRpc3BsYXlfd2lkdGggKiB2aWRlb2NvbnRleHQtPnBpeGVsX2hlaWdodCwKKyAgICAgICAgICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV9oZWlnaHQgKiB2aWRlb2NvbnRleHQtPnBpeGVsX3dpZHRoLCBOVUxMKTsKKyAgICAgIH0KKworICAgICAgaWYgKHZpZGVvY29udGV4dC0+ZGVmYXVsdF9mcHMgPiAwLjApIHsKKyAgICAgICAgZ2ludCBmcHNfbiwgZnBzX2Q7CisKKyAgICAgICAgZ3N0X3V0aWxfZG91YmxlX3RvX2ZyYWN0aW9uICh2aWRlb2NvbnRleHQtPmRlZmF1bHRfZnBzLCAmZnBzX24sICZmcHNfZCk7CisKKyAgICAgICAgR1NUX0RFQlVHICgidXNpbmcgZGVmYXVsdCBmcHMgJWQvJWQiLCBmcHNfbiwgZnBzX2QpOworCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzdHJ1Y3R1cmUsICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTiwgZnBzX24sCisgICAgICAgICAgICBmcHNfZCwgTlVMTCk7CisgICAgICB9IGVsc2UgaWYgKGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24gPiAwKSB7CisgICAgICAgIGludCBmcHNfbiwgZnBzX2Q7CisKKyAgICAgICAgZ3N0X3ZpZGVvX2d1ZXNzX2ZyYW1lcmF0ZSAoY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbiwgJmZwc19uLCAmZnBzX2QpOworCisgICAgICAgIEdTVF9JTkZPICgidXNpbmcgZGVmYXVsdCBkdXJhdGlvbiAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgICAiIGZyYW1lcmF0ZSAlZC8lZCIsIGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24sIGZwc19uLCBmcHNfZCk7CisKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHN0cnVjdHVyZSwgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLAorICAgICAgICAgICAgZnBzX24sIGZwc19kLCBOVUxMKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzdHJ1Y3R1cmUsICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTiwKKyAgICAgICAgICAgIDAsIDEsIE5VTEwpOworICAgICAgfQorCisgICAgICBpZiAodmlkZW9jb250ZXh0LT5wYXJlbnQuZmxhZ3MgJiBHU1RfTUFUUk9TS0FfVklERU9UUkFDS19JTlRFUkxBQ0VEKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoc3RydWN0dXJlLCAiaW50ZXJsYWNlLW1vZGUiLCBHX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgIm1peGVkIiwgTlVMTCk7CisgICAgfQorICAgIGlmICh2aWRlb2NvbnRleHQtPm11bHRpdmlld19tb2RlICE9IEdTVF9WSURFT19NVUxUSVZJRVdfTU9ERV9OT05FKSB7CisgICAgICBpZiAoZ3N0X3ZpZGVvX211bHRpdmlld19ndWVzc19oYWxmX2FzcGVjdCAodmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfbW9kZSwKKyAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5waXhlbF93aWR0aCwgdmlkZW9jb250ZXh0LT5waXhlbF9oZWlnaHQsCisgICAgICAgICAgICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV93aWR0aCAqIHZpZGVvY29udGV4dC0+cGl4ZWxfaGVpZ2h0LAorICAgICAgICAgICAgICB2aWRlb2NvbnRleHQtPmRpc3BsYXlfaGVpZ2h0ICogdmlkZW9jb250ZXh0LT5waXhlbF93aWR0aCkpIHsKKyAgICAgICAgdmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfZmxhZ3MgfD0gR1NUX1ZJREVPX01VTFRJVklFV19GTEFHU19IQUxGX0FTUEVDVDsKKyAgICAgIH0KKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsCisgICAgICAgICAgIm11bHRpdmlldy1tb2RlIiwgR19UWVBFX1NUUklORywKKyAgICAgICAgICBnc3RfdmlkZW9fbXVsdGl2aWV3X21vZGVfdG9fY2Fwc19zdHJpbmcKKyAgICAgICAgICAodmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfbW9kZSksICJtdWx0aXZpZXctZmxhZ3MiLAorICAgICAgICAgIEdTVF9UWVBFX1ZJREVPX01VTFRJVklFV19GTEFHU0VULCB2aWRlb2NvbnRleHQtPm11bHRpdmlld19mbGFncywKKyAgICAgICAgICBHU1RfRkxBR19TRVRfTUFTS19FWEFDVCwgTlVMTCk7CisgICAgfQorCisgICAgaWYgKHZpZGVvY29udGV4dC0+Y29sb3JpbWV0cnkucmFuZ2UgIT0gR1NUX1ZJREVPX0NPTE9SX1JBTkdFX1VOS05PV04gfHwKKyAgICAgICAgdmlkZW9jb250ZXh0LT5jb2xvcmltZXRyeS5tYXRyaXggIT0gR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9VTktOT1dOIHx8CisgICAgICAgIHZpZGVvY29udGV4dC0+Y29sb3JpbWV0cnkudHJhbnNmZXIgIT0gR1NUX1ZJREVPX1RSQU5TRkVSX1VOS05PV04gfHwKKyAgICAgICAgdmlkZW9jb250ZXh0LT5jb2xvcmltZXRyeS5wcmltYXJpZXMgIT0KKyAgICAgICAgR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19VTktOT1dOKSB7CisgICAgICBnY2hhciAqY29sb3JpbWV0cnkgPQorICAgICAgICAgIGdzdF92aWRlb19jb2xvcmltZXRyeV90b19zdHJpbmcgKCZ2aWRlb2NvbnRleHQtPmNvbG9yaW1ldHJ5KTsKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJjb2xvcmltZXRyeSIsIEdfVFlQRV9TVFJJTkcsIGNvbG9yaW1ldHJ5LAorICAgICAgICAgIE5VTEwpOworICAgICAgR1NUX0RFQlVHICgic2V0dGluZyBjb2xvcmltZXRyeSB0byAlcyIsIGNvbG9yaW1ldHJ5KTsKKyAgICAgIGdfZnJlZSAoY29sb3JpbWV0cnkpOworICAgIH0KKworICAgIGNhcHMgPSBnc3RfY2Fwc19zaW1wbGlmeSAoY2Fwcyk7CisgIH0KKworICByZXR1cm4gY2FwczsKK30KKworLyoKKyAqIFNvbWUgQUFDIHNwZWNpZmljIGNvZGUuLi4gKnNpZ2gqCisgKiBGSVhNRTogbWF5YmUgd2Ugc2hvdWxkIHVzZSAnMTUnIGFuZCBjb2RlIHRoZSBzYW1wbGUgcmF0ZSBleHBsaWNpdGx5CisgKiBpZiB0aGUgc2FtcGxlIHJhdGUgZG9lc24ndCBtYXRjaCB0aGUgcHJlZGVmaW5lZCByYXRlcyBleGFjdGx5PyAodHBtKQorICovCisKK3N0YXRpYyBnaW50CithYWNfcmF0ZV9pZHggKGdpbnQgcmF0ZSkKK3sKKyAgaWYgKDkyMDE3IDw9IHJhdGUpCisgICAgcmV0dXJuIDA7CisgIGVsc2UgaWYgKDc1MTMyIDw9IHJhdGUpCisgICAgcmV0dXJuIDE7CisgIGVsc2UgaWYgKDU1NDI2IDw9IHJhdGUpCisgICAgcmV0dXJuIDI7CisgIGVsc2UgaWYgKDQ2MDA5IDw9IHJhdGUpCisgICAgcmV0dXJuIDM7CisgIGVsc2UgaWYgKDM3NTY2IDw9IHJhdGUpCisgICAgcmV0dXJuIDQ7CisgIGVsc2UgaWYgKDI3NzEzIDw9IHJhdGUpCisgICAgcmV0dXJuIDU7CisgIGVsc2UgaWYgKDIzMDA0IDw9IHJhdGUpCisgICAgcmV0dXJuIDY7CisgIGVsc2UgaWYgKDE4NzgzIDw9IHJhdGUpCisgICAgcmV0dXJuIDc7CisgIGVsc2UgaWYgKDEzODU2IDw9IHJhdGUpCisgICAgcmV0dXJuIDg7CisgIGVsc2UgaWYgKDExNTAyIDw9IHJhdGUpCisgICAgcmV0dXJuIDk7CisgIGVsc2UgaWYgKDkzOTEgPD0gcmF0ZSkKKyAgICByZXR1cm4gMTA7CisgIGVsc2UKKyAgICByZXR1cm4gMTE7Cit9CisKK3N0YXRpYyBnaW50CithYWNfcHJvZmlsZV9pZHggKGNvbnN0IGdjaGFyICogY29kZWNfaWQpCit7CisgIGdpbnQgcHJvZmlsZTsKKworICBpZiAoc3RybGVuIChjb2RlY19pZCkgPD0gMTIpCisgICAgcHJvZmlsZSA9IDM7CisgIGVsc2UgaWYgKCFzdHJuY21wICgmY29kZWNfaWRbMTJdLCAiTUFJTiIsIDQpKQorICAgIHByb2ZpbGUgPSAwOworICBlbHNlIGlmICghc3RybmNtcCAoJmNvZGVjX2lkWzEyXSwgIkxDIiwgMikpCisgICAgcHJvZmlsZSA9IDE7CisgIGVsc2UgaWYgKCFzdHJuY21wICgmY29kZWNfaWRbMTJdLCAiU1NSIiwgMykpCisgICAgcHJvZmlsZSA9IDI7CisgIGVsc2UKKyAgICBwcm9maWxlID0gMzsKKworICByZXR1cm4gcHJvZmlsZTsKK30KKworc3RhdGljIGd1aW50Cityb3VuZF91cF9wb3cyIChndWludCBuKQoreworICBuID0gbiAtIDE7CisgIG4gPSBuIHwgKG4gPj4gMSk7CisgIG4gPSBuIHwgKG4gPj4gMik7CisgIG4gPSBuIHwgKG4gPj4gNCk7CisgIG4gPSBuIHwgKG4gPj4gOCk7CisgIG4gPSBuIHwgKG4gPj4gMTYpOworICByZXR1cm4gbiArIDE7Cit9CisKKyNkZWZpbmUgQUFDX1NZTkNfRVhURU5TSU9OX1RZUEUgMHgwMmI3CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9tYXRyb3NrYV9kZW11eF9hdWRpb19jYXBzIChHc3RNYXRyb3NrYVRyYWNrQXVkaW9Db250ZXh0ICoKKyAgICBhdWRpb2NvbnRleHQsIGNvbnN0IGdjaGFyICogY29kZWNfaWQsIGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsCisgICAgZ2NoYXIgKiogY29kZWNfbmFtZSwgZ3VpbnQxNiAqIHJpZmZfYXVkaW9fZm10KQoreworICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqY29udGV4dCA9IChHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqKSBhdWRpb2NvbnRleHQ7CisgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworCisgIGdfYXNzZXJ0IChhdWRpb2NvbnRleHQgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChjb2RlY19uYW1lICE9IE5VTEwpOworCisgIGlmIChyaWZmX2F1ZGlvX2ZtdCkKKyAgICAqcmlmZl9hdWRpb19mbXQgPSAwOworCisgIC8qIFRPRE86IGNoZWNrIGlmIHdlIGhhdmUgYWxsIGNvZGVjIHR5cGVzIGZyb20gbWF0cm9za2EtaWRzLmgKKyAgICogICAgICAgY2hlY2sgaWYgd2UgaGF2ZSB0byBkbyBtb3JlIHNwZWNpYWwgdGhpbmdzIHdpdGggY29kZWNfcHJpdmF0ZQorICAgKiAgICAgICBjaGVjayBpZiB3ZSBuZWVkIGJpdGRlcHRoIGluIGRpZmZlcmVudCBwbGFjZXMgdG9vCisgICAqICAgICAgIGltcGxlbWVudCBjaGFubmVsIHBvc2l0aW9uIG1hZ2ljCisgICAqIEFkZCBzdXBwb3J0IGZvcjoKKyAgICogIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19BQzNfQlNJRDkKKyAgICogIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19BQzNfQlNJRDEwCisgICAqICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUVVJQ0tUSU1FX1FETUMKKyAgICogIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19RVUlDS1RJTUVfUURNMgorICAgKi8KKworICBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19NUEVHMV9MMSkgfHwKKyAgICAgICFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fTVBFRzFfTDIpIHx8CisgICAgICAhc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX01QRUcxX0wzKSkgeworICAgIGdpbnQgbGF5ZXI7CisKKyAgICBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19NUEVHMV9MMSkpCisgICAgICBsYXllciA9IDE7CisgICAgZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19NUEVHMV9MMikpCisgICAgICBsYXllciA9IDI7CisgICAgZWxzZQorICAgICAgbGF5ZXIgPSAzOworCisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby9tcGVnIiwKKyAgICAgICAgIm1wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgMSwgImxheWVyIiwgR19UWVBFX0lOVCwgbGF5ZXIsIE5VTEwpOworICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiTVBFRy0xIGxheWVyICVkIiwgbGF5ZXIpOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUENNX0lOVF9CRSkgfHwKKyAgICAgICFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUENNX0lOVF9MRSkpIHsKKyAgICBnYm9vbGVhbiBzaWduOworICAgIGdpbnQgZW5kaWFubmVzczsKKyAgICBHc3RBdWRpb0Zvcm1hdCBmb3JtYXQ7CisKKyAgICBzaWduID0gKGF1ZGlvY29udGV4dC0+Yml0ZGVwdGggIT0gOCk7CisgICAgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUENNX0lOVF9CRSkpCisgICAgICBlbmRpYW5uZXNzID0gR19CSUdfRU5ESUFOOworICAgIGVsc2UKKyAgICAgIGVuZGlhbm5lc3MgPSBHX0xJVFRMRV9FTkRJQU47CisKKyAgICBmb3JtYXQgPSBnc3RfYXVkaW9fZm9ybWF0X2J1aWxkX2ludGVnZXIgKHNpZ24sIGVuZGlhbm5lc3MsCisgICAgICAgIGF1ZGlvY29udGV4dC0+Yml0ZGVwdGgsIGF1ZGlvY29udGV4dC0+Yml0ZGVwdGgpOworCisgICAgLyogRklYTUU6IENoYW5uZWwgbWFzayBhbmQgcmVvcmRlcmluZyAqLworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLAorICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgZ3N0X2F1ZGlvX2Zvcm1hdF90b19zdHJpbmcgKGZvcm1hdCksCisgICAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCAiaW50ZXJsZWF2ZWQiLAorICAgICAgICAiY2hhbm5lbC1tYXNrIiwgR1NUX1RZUEVfQklUTUFTSywKKyAgICAgICAgZ3N0X2F1ZGlvX2NoYW5uZWxfZ2V0X2ZhbGxiYWNrX21hc2sgKGF1ZGlvY29udGV4dC0+Y2hhbm5lbHMpLCBOVUxMKTsKKworICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiUmF3ICVkLWJpdCBQQ00gYXVkaW8iLAorICAgICAgICBhdWRpb2NvbnRleHQtPmJpdGRlcHRoKTsKKyAgICBjb250ZXh0LT5hbGlnbm1lbnQgPSBHU1RfUk9VTkRfVVBfOCAoYXVkaW9jb250ZXh0LT5iaXRkZXB0aCkgLyA4OworICAgIGNvbnRleHQtPmFsaWdubWVudCA9IHJvdW5kX3VwX3BvdzIgKGNvbnRleHQtPmFsaWdubWVudCk7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19QQ01fRkxPQVQpKSB7CisgICAgY29uc3QgZ2NoYXIgKmZvcm1hdDsKKyAgICBpZiAoYXVkaW9jb250ZXh0LT5iaXRkZXB0aCA9PSAzMikKKyAgICAgIGZvcm1hdCA9ICJGMzJMRSI7CisgICAgZWxzZQorICAgICAgZm9ybWF0ID0gIkY2NExFIjsKKyAgICAvKiBGSVhNRTogQ2hhbm5lbCBtYXNrIGFuZCByZW9yZGVyaW5nICovCisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsCisgICAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCBmb3JtYXQsCisgICAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCAiaW50ZXJsZWF2ZWQiLAorICAgICAgICAiY2hhbm5lbC1tYXNrIiwgR1NUX1RZUEVfQklUTUFTSywKKyAgICAgICAgZ3N0X2F1ZGlvX2NoYW5uZWxfZ2V0X2ZhbGxiYWNrX21hc2sgKGF1ZGlvY29udGV4dC0+Y2hhbm5lbHMpLCBOVUxMKTsKKyAgICAqY29kZWNfbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoIlJhdyAlZC1iaXQgZmxvYXRpbmctcG9pbnQgYXVkaW8iLAorICAgICAgICBhdWRpb2NvbnRleHQtPmJpdGRlcHRoKTsKKyAgICBjb250ZXh0LT5hbGlnbm1lbnQgPSBhdWRpb2NvbnRleHQtPmJpdGRlcHRoIC8gODsKKyAgICBjb250ZXh0LT5hbGlnbm1lbnQgPSByb3VuZF91cF9wb3cyIChjb250ZXh0LT5hbGlnbm1lbnQpOworICB9IGVsc2UgaWYgKCFzdHJuY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX0FDMywKKyAgICAgICAgICBzdHJsZW4gKEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19BQzMpKSkgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1hYzMiLAorICAgICAgICAiZnJhbWVkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXAgKCJBQy0zIGF1ZGlvIik7CisgIH0gZWxzZSBpZiAoIXN0cm5jbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fRUFDMywKKyAgICAgICAgICBzdHJsZW4gKEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19FQUMzKSkpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtZWFjMyIsCisgICAgICAgICJmcmFtZWQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cCAoIkUtQUMtMyBhdWRpbyIpOworICB9IGVsc2UgaWYgKCFzdHJuY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1RSVUVIRCwKKyAgICAgICAgICBzdHJsZW4gKEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19UUlVFSEQpKSkgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8veC10cnVlLWhkIik7CisgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cCAoIkRvbGJ5IFRydWVIRCIpOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fRFRTKSkgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8veC1kdHMiKTsKKyAgICAqY29kZWNfbmFtZSA9IGdfc3RyZHVwICgiRFRTIGF1ZGlvIik7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19WT1JCSVMpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby94LXZvcmJpcyIpOworICAgIGNvbnRleHQtPnN0cmVhbV9oZWFkZXJzID0KKyAgICAgICAgZ3N0X21hdHJvc2thX3BhcnNlX3hpcGhfc3RyZWFtX2hlYWRlcnMgKGNvbnRleHQtPmNvZGVjX3ByaXYsCisgICAgICAgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSk7CisgICAgLyogRklYTUU6IG1hcmsgc3RyZWFtIGFzIGJyb2tlbiBhbmQgc2tpcCBpZiB0aGVyZSBhcmUgbm8gc3RyZWFtIGhlYWRlcnMgKi8KKyAgICBjb250ZXh0LT5zZW5kX3N0cmVhbV9oZWFkZXJzID0gVFJVRTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX0ZMQUMpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby94LWZsYWMiKTsKKyAgICBjb250ZXh0LT5zdHJlYW1faGVhZGVycyA9CisgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9mbGFjX3N0cmVhbV9oZWFkZXJzIChjb250ZXh0LT5jb2RlY19wcml2LAorICAgICAgICBjb250ZXh0LT5jb2RlY19wcml2X3NpemUpOworICAgIC8qIEZJWE1FOiBtYXJrIHN0cmVhbSBhcyBicm9rZW4gYW5kIHNraXAgaWYgdGhlcmUgYXJlIG5vIHN0cmVhbSBoZWFkZXJzICovCisgICAgY29udGV4dC0+c2VuZF9zdHJlYW1faGVhZGVycyA9IFRSVUU7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19TUEVFWCkpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtc3BlZXgiKTsKKyAgICBjb250ZXh0LT5zdHJlYW1faGVhZGVycyA9CisgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9zcGVleF9zdHJlYW1faGVhZGVycyAoY29udGV4dC0+Y29kZWNfcHJpdiwKKyAgICAgICAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplKTsKKyAgICAvKiBGSVhNRTogbWFyayBzdHJlYW0gYXMgYnJva2VuIGFuZCBza2lwIGlmIHRoZXJlIGFyZSBubyBzdHJlYW0gaGVhZGVycyAqLworICAgIGNvbnRleHQtPnNlbmRfc3RyZWFtX2hlYWRlcnMgPSBUUlVFOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fT1BVUykpIHsKKyAgICBHc3RCdWZmZXIgKnRtcDsKKworICAgIGlmIChjb250ZXh0LT5jb2RlY19wcml2X3NpemUgPj0gMTkpIHsKKyAgICAgIGlmIChhdWRpb2NvbnRleHQtPnNhbXBsZXJhdGUpCisgICAgICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKChndWludDggKikgY29udGV4dC0+Y29kZWNfcHJpdiArIDEyLAorICAgICAgICAgICAgYXVkaW9jb250ZXh0LT5zYW1wbGVyYXRlKTsKKyAgICAgIGlmIChjb250ZXh0LT5jb2RlY19kZWxheSkgeworICAgICAgICBndWludDY0IGRlbGF5ID0KKyAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAoY29udGV4dC0+Y29kZWNfZGVsYXksIDQ4MDAwLAorICAgICAgICAgICAgR1NUX1NFQ09ORCk7CisgICAgICAgIEdTVF9XUklURV9VSU5UMTZfTEUgKChndWludDggKikgY29udGV4dC0+Y29kZWNfcHJpdiArIDEwLCBkZWxheSk7CisgICAgICB9CisKKyAgICAgIHRtcCA9CisgICAgICAgICAgZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZ19tZW1kdXAgKGNvbnRleHQtPmNvZGVjX3ByaXYsCisgICAgICAgICAgICAgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSksIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSk7CisgICAgICBjYXBzID0gZ3N0X2NvZGVjX3V0aWxzX29wdXNfY3JlYXRlX2NhcHNfZnJvbV9oZWFkZXIgKHRtcCwgTlVMTCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmICh0bXApOworICAgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cCAoIk9wdXMiKTsKKyAgICB9IGVsc2UgaWYgKGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSA9PSAwKSB7CisgICAgICBHU1RfV0FSTklORyAoIk5vIE9wdXMgY29kZWMgZGF0YSBmb3VuZCwgdHJ5aW5nIHRvIGNyZWF0ZSBvbmUiKTsKKyAgICAgIGlmIChhdWRpb2NvbnRleHQtPmNoYW5uZWxzIDw9IDIpIHsKKyAgICAgICAgZ3VpbnQ4IHN0cmVhbXMsIGNvdXBsZWQsIGNoYW5uZWxzOworICAgICAgICBndWludDMyIHNhbXBsZXJhdGU7CisKKyAgICAgICAgc2FtcGxlcmF0ZSA9CisgICAgICAgICAgICBhdWRpb2NvbnRleHQtPnNhbXBsZXJhdGUgPT0gMCA/IDQ4MDAwIDogYXVkaW9jb250ZXh0LT5zYW1wbGVyYXRlOworICAgICAgICBjaGFubmVscyA9IGF1ZGlvY29udGV4dC0+Y2hhbm5lbHMgPT0gMCA/IDIgOiBhdWRpb2NvbnRleHQtPmNoYW5uZWxzOworICAgICAgICBpZiAoY2hhbm5lbHMgPT0gMSkgeworICAgICAgICAgIHN0cmVhbXMgPSAxOworICAgICAgICAgIGNvdXBsZWQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN0cmVhbXMgPSAxOworICAgICAgICAgIGNvdXBsZWQgPSAxOworICAgICAgICB9CisKKyAgICAgICAgY2FwcyA9CisgICAgICAgICAgICBnc3RfY29kZWNfdXRpbHNfb3B1c19jcmVhdGVfY2FwcyAoc2FtcGxlcmF0ZSwgY2hhbm5lbHMsIDAsIHN0cmVhbXMsCisgICAgICAgICAgICBjb3VwbGVkLCBOVUxMKTsKKyAgICAgICAgaWYgKGNhcHMpIHsKKyAgICAgICAgICAqY29kZWNfbmFtZSA9IGdfc3RyZHVwICgiT3B1cyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9XQVJOSU5HICgiRmFpbGVkIHRvIGNyZWF0ZSBPcHVzIGNhcHMgZnJvbSBhdWRpbyBjb250ZXh0Iik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9XQVJOSU5HICgiTm8gT3B1cyBjb2RlYyBkYXRhLCBhbmQgbm90IGVub3VnaCBpbmZvIHRvIGNyZWF0ZSBvbmUiKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkcgKCJJbnZhbGlkIE9wdXMgY29kZWMgZGF0YSBzaXplIChnb3QgJSIgR19HU0laRV9GT1JNQVQKKyAgICAgICAgICAiLCBleHBlY3RlZCAxOSkiLCBjb250ZXh0LT5jb2RlY19wcml2X3NpemUpOworICAgIH0KKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX0FDTSkpIHsKKyAgICBnc3RfcmlmZl9zdHJmX2F1ZHMgYXVkczsKKworICAgIGlmIChkYXRhICYmIHNpemUgPj0gMTgpIHsKKyAgICAgIEdzdEJ1ZmZlciAqY29kZWNfZGF0YSA9IE5VTEw7CisKKyAgICAgIC8qIGxpdHRsZS1lbmRpYW4gLT4gYnl0ZS1vcmRlciAqLworICAgICAgYXVkcy5mb3JtYXQgPSBHU1RfUkVBRF9VSU5UMTZfTEUgKGRhdGEpOworICAgICAgYXVkcy5jaGFubmVscyA9IEdTVF9SRUFEX1VJTlQxNl9MRSAoZGF0YSArIDIpOworICAgICAgYXVkcy5yYXRlID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhICsgNCk7CisgICAgICBhdWRzLmF2X2JwcyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDgpOworICAgICAgYXVkcy5ibG9ja2FsaWduID0gR1NUX1JFQURfVUlOVDE2X0xFIChkYXRhICsgMTIpOworICAgICAgYXVkcy5iaXRzX3Blcl9zYW1wbGUgPSBHU1RfUkVBRF9VSU5UMTZfTEUgKGRhdGEgKyAxNik7CisKKyAgICAgIC8qIDE4IGlzIHRoZSB3YXZlZm9ybWF0ZXggc2l6ZSAqLworICAgICAgaWYgKHNpemUgPiAxOCkgeworICAgICAgICBjb2RlY19kYXRhID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZF9mdWxsIChHU1RfTUVNT1JZX0ZMQUdfUkVBRE9OTFksCisgICAgICAgICAgICBkYXRhICsgMTgsIHNpemUgLSAxOCwgMCwgc2l6ZSAtIDE4LCBOVUxMLCBOVUxMKTsKKyAgICAgIH0KKworICAgICAgaWYgKHJpZmZfYXVkaW9fZm10KQorICAgICAgICAqcmlmZl9hdWRpb19mbXQgPSBhdWRzLmZvcm1hdDsKKworICAgICAgLyogRklYTUU6IEhhbmRsZSByZW9yZGVyIG1hcCAqLworICAgICAgY2FwcyA9IGdzdF9yaWZmX2NyZWF0ZV9hdWRpb19jYXBzIChhdWRzLmZvcm1hdCwgTlVMTCwgJmF1ZHMsIE5VTEwsCisgICAgICAgICAgY29kZWNfZGF0YSwgY29kZWNfbmFtZSwgTlVMTCk7CisgICAgICBpZiAoY29kZWNfZGF0YSkKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoY29kZWNfZGF0YSk7CisKKyAgICAgIGlmIChjYXBzID09IE5VTEwpIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJVbmhhbmRsZWQgUklGRiBhdWRpbyBmb3JtYXQgMHglMDJ4IiwgYXVkcy5mb3JtYXQpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklORyAoIkludmFsaWQgY29kZWMgZGF0YSBzaXplICglZCBleHBlY3RlZCwgZ290ICVkKSIsIDE4LCBzaXplKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZ19zdHJfaGFzX3ByZWZpeCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19BQUMpKSB7CisgICAgR3N0QnVmZmVyICpwcml2ID0gTlVMTDsKKyAgICBnaW50IG1wZWd2ZXJzaW9uOworICAgIGdpbnQgcmF0ZV9pZHgsIHByb2ZpbGU7CisgICAgZ3VpbnQ4ICpkYXRhID0gTlVMTDsKKworICAgIC8qIHVuc3BlY2lmaWVkIEFBQyBwcm9maWxlIHdpdGggb3BhcXVlIHByaXZhdGUgY29kZWMgZGF0YSAqLworICAgIGlmIChzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fQUFDKSA9PSAwKSB7CisgICAgICBpZiAoY29udGV4dC0+Y29kZWNfcHJpdl9zaXplID49IDIpIHsKKyAgICAgICAgZ3VpbnQgb2JqX3R5cGUsIGZyZXFfaW5kZXgsIGV4cGxpY2l0X2ZyZXFfYnl0ZXMgPSAwOworCisgICAgICAgIGNvZGVjX2lkID0gR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX0FBQ19NUEVHNDsKKyAgICAgICAgbXBlZ3ZlcnNpb24gPSA0OworICAgICAgICBmcmVxX2luZGV4ID0gKEdTVF9SRUFEX1VJTlQxNl9CRSAoY29udGV4dC0+Y29kZWNfcHJpdikgJiAweDc4MCkgPj4gNzsKKyAgICAgICAgb2JqX3R5cGUgPSAoR1NUX1JFQURfVUlOVDE2X0JFIChjb250ZXh0LT5jb2RlY19wcml2KSAmIDB4RjgwMCkgPj4gMTE7CisgICAgICAgIGlmIChmcmVxX2luZGV4ID09IDE1KQorICAgICAgICAgIGV4cGxpY2l0X2ZyZXFfYnl0ZXMgPSAzOworICAgICAgICBHU1RfREVCVUcgKCJvYmpfdHlwZSA9ICV1LCBmcmVxX2luZGV4ID0gJXUiLCBvYmpfdHlwZSwgZnJlcV9pbmRleCk7CisgICAgICAgIHByaXYgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChnX21lbWR1cCAoY29udGV4dC0+Y29kZWNfcHJpdiwKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5jb2RlY19wcml2X3NpemUpLCBjb250ZXh0LT5jb2RlY19wcml2X3NpemUpOworICAgICAgICAvKiBhc3N1bWUgU0JSIGlmIHNhbXBsZXJhdGUgPD0gMjRrSHogKi8KKyAgICAgICAgaWYgKG9ial90eXBlID09IDUgfHwgKGZyZXFfaW5kZXggPj0gNiAmJiBmcmVxX2luZGV4ICE9IDE1KSB8fAorICAgICAgICAgICAgKGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSA9PSAoNSArIGV4cGxpY2l0X2ZyZXFfYnl0ZXMpKSkgeworICAgICAgICAgIGF1ZGlvY29udGV4dC0+c2FtcGxlcmF0ZSAqPSAyOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfV0FSTklORyAoIk9wYXF1ZSBBX0FBQyBjb2RlYyBJRCwgYnV0IG5vIGNvZGVjIHByaXZhdGUgZGF0YSIpOworICAgICAgICAvKiB0aGlzIGlzIHByZXR0eSBicm9rZW47CisgICAgICAgICAqIG1heWJlIHdlIG5lZWQgdG8gbWFrZSB1cCBzb21lIGRlZmF1bHQgcHJpdmF0ZSwKKyAgICAgICAgICogb3IgbWF5YmUgQURUUyBkYXRhIGdvdCBkdW1wZWQgaW4uCisgICAgICAgICAqIExldCdzIHNldCB1cCBzb21lIHByaXZhdGUgZGF0YSBub3csIGFuZCBjaGVjayBhY3R1YWwgZGF0YSBsYXRlciAqLworICAgICAgICAvKiBqdXN0IHRyeSB0aGlzIGFuZCBzZWUgd2hhdCBoYXBwZW5zIC4uLiAqLworICAgICAgICBjb2RlY19pZCA9IEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19BQUNfTVBFRzQ7CisgICAgICAgIGNvbnRleHQtPnBvc3Rwcm9jZXNzX2ZyYW1lID0gZ3N0X21hdHJvc2thX2RlbXV4X2NoZWNrX2FhYzsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBtYWtlIHVwIGRlY29kZXItc3BlY2lmaWMgZGF0YSBpZiBpdCBpcyBub3Qgc3VwcGxpZWQgKi8KKyAgICBpZiAocHJpdiA9PSBOVUxMKSB7CisgICAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgICAgcHJpdiA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCA1LCBOVUxMKTsKKyAgICAgIGdzdF9idWZmZXJfbWFwIChwcml2LCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICAgIGRhdGEgPSBtYXAuZGF0YTsKKyAgICAgIHJhdGVfaWR4ID0gYWFjX3JhdGVfaWR4IChhdWRpb2NvbnRleHQtPnNhbXBsZXJhdGUpOworICAgICAgcHJvZmlsZSA9IGFhY19wcm9maWxlX2lkeCAoY29kZWNfaWQpOworCisgICAgICBkYXRhWzBdID0gKChwcm9maWxlICsgMSkgPDwgMykgfCAoKHJhdGVfaWR4ICYgMHhFKSA+PiAxKTsKKyAgICAgIGRhdGFbMV0gPSAoKHJhdGVfaWR4ICYgMHgxKSA8PCA3KSB8IChhdWRpb2NvbnRleHQtPmNoYW5uZWxzIDw8IDMpOworCisgICAgICBpZiAoIXN0cm5jbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fQUFDX01QRUcyLAorICAgICAgICAgICAgICBzdHJsZW4gKEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19BQUNfTVBFRzIpKSkgeworICAgICAgICBtcGVndmVyc2lvbiA9IDI7CisgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKHByaXYsICZtYXApOworICAgICAgICBnc3RfYnVmZmVyX3NldF9zaXplIChwcml2LCAyKTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fQUFDX01QRUc0LAorICAgICAgICAgICAgICBzdHJsZW4gKEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19BQUNfTVBFRzQpKSkgeworICAgICAgICBtcGVndmVyc2lvbiA9IDQ7CisKKyAgICAgICAgaWYgKGdfc3RycnN0ciAoY29kZWNfaWQsICJTQlIiKSkgeworICAgICAgICAgIC8qIEhFLUFBQyAoYWthIFNCUiBBQUMpICovCisgICAgICAgICAgYXVkaW9jb250ZXh0LT5zYW1wbGVyYXRlICo9IDI7CisgICAgICAgICAgcmF0ZV9pZHggPSBhYWNfcmF0ZV9pZHggKGF1ZGlvY29udGV4dC0+c2FtcGxlcmF0ZSk7CisgICAgICAgICAgZGF0YVsyXSA9IEFBQ19TWU5DX0VYVEVOU0lPTl9UWVBFID4+IDM7CisgICAgICAgICAgZGF0YVszXSA9ICgoQUFDX1NZTkNfRVhURU5TSU9OX1RZUEUgJiAweDA3KSA8PCA1KSB8IDU7CisgICAgICAgICAgZGF0YVs0XSA9ICgxIDw8IDcpIHwgKHJhdGVfaWR4IDw8IDMpOworICAgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKHByaXYsICZtYXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKHByaXYsICZtYXApOworICAgICAgICAgIGdzdF9idWZmZXJfc2V0X3NpemUgKHByaXYsIDIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChwcml2LCAmbWFwKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocHJpdik7CisgICAgICAgIHByaXYgPSBOVUxMOworICAgICAgICBHU1RfRVJST1IgKCJVbmtub3duIEFBQyBwcm9maWxlIGFuZCBubyBjb2RlYyBwcml2YXRlIGRhdGEiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHJpdikgeworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby9tcGVnIiwKKyAgICAgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCBtcGVndmVyc2lvbiwKKyAgICAgICAgICAiZnJhbWVkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsCisgICAgICAgICAgInN0cmVhbS1mb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAicmF3IiwgTlVMTCk7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAiY29kZWNfZGF0YSIsIEdTVF9UWVBFX0JVRkZFUiwgcHJpdiwgTlVMTCk7CisgICAgICBpZiAoY29udGV4dC0+Y29kZWNfcHJpdiAmJiBjb250ZXh0LT5jb2RlY19wcml2X3NpemUgPiAwKQorICAgICAgICBnc3RfY29kZWNfdXRpbHNfYWFjX2NhcHNfc2V0X2xldmVsX2FuZF9wcm9maWxlIChjYXBzLAorICAgICAgICAgICAgY29udGV4dC0+Y29kZWNfcHJpdiwgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplKTsKKyAgICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiTVBFRy0lZCBBQUMgYXVkaW8iLCBtcGVndmVyc2lvbik7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChwcml2KTsKKyAgICB9CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19UVEEpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXR0YSIsCisgICAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIGF1ZGlvY29udGV4dC0+Yml0ZGVwdGgsIE5VTEwpOworICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXAgKCJUVEEgYXVkaW8iKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1dBVlBBQ0s0KSkgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC13YXZwYWNrIiwKKyAgICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgYXVkaW9jb250ZXh0LT5iaXRkZXB0aCwKKyAgICAgICAgImZyYW1lZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKyAgICAqY29kZWNfbmFtZSA9IGdfc3RyZHVwICgiV2F2cGFjayBhdWRpbyIpOworICAgIGNvbnRleHQtPnBvc3Rwcm9jZXNzX2ZyYW1lID0gZ3N0X21hdHJvc2thX2RlbXV4X2FkZF93dnBrX2hlYWRlcjsKKyAgICBhdWRpb2NvbnRleHQtPnd2cGtfYmxvY2tfaW5kZXggPSAwOworICB9IGVsc2UgaWYgKCghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1JFQUxfMTRfNCkpIHx8CisgICAgICAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19SRUFMXzI4XzgpKSB8fAorICAgICAgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUkVBTF9DT09LKSkpIHsKKyAgICBnaW50IHJhdmVyc2lvbiA9IC0xOworCisgICAgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUkVBTF8xNF80KSkKKyAgICAgIHJhdmVyc2lvbiA9IDE7CisgICAgZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19SRUFMX0NPT0spKQorICAgICAgcmF2ZXJzaW9uID0gODsKKyAgICBlbHNlCisgICAgICByYXZlcnNpb24gPSAyOworCisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXBuLXJlYWxhdWRpbyIsCisgICAgICAgICJyYXZlcnNpb24iLCBHX1RZUEVfSU5ULCByYXZlcnNpb24sIE5VTEwpOworICAgIC8qIEV4dHJhY3QgZXh0cmEgaW5mb3JtYXRpb24gZnJvbSBjYXBzLCBtYXBwaW5nIHZhcmllcyBiYXNlZCBvbiBjb2RlYyAqLworICAgIGlmIChkYXRhICYmIChzaXplID49IDB4NTApKSB7CisgICAgICBHc3RCdWZmZXIgKnByaXY7CisgICAgICBndWludCBmbGF2b3I7CisgICAgICBndWludCBwYWNrZXRfc2l6ZTsKKyAgICAgIGd1aW50IGhlaWdodDsKKyAgICAgIGd1aW50IGxlYWZfc2l6ZTsKKyAgICAgIGd1aW50IHNhbXBsZV93aWR0aDsKKyAgICAgIGd1aW50IGV4dHJhX2RhdGFfc2l6ZTsKKworICAgICAgR1NUX0RFQlVHICgicmVhbCBhdWRpbyByYXZlcnNpb246JWQiLCByYXZlcnNpb24pOworICAgICAgaWYgKHJhdmVyc2lvbiA9PSA4KSB7CisgICAgICAgIC8qIENPT0sgKi8KKyAgICAgICAgZmxhdm9yID0gR1NUX1JFQURfVUlOVDE2X0JFIChkYXRhICsgMjIpOworICAgICAgICBwYWNrZXRfc2l6ZSA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoZGF0YSArIDI0KTsKKyAgICAgICAgaGVpZ2h0ID0gR1NUX1JFQURfVUlOVDE2X0JFIChkYXRhICsgNDApOworICAgICAgICBsZWFmX3NpemUgPSBHU1RfUkVBRF9VSU5UMTZfQkUgKGRhdGEgKyA0NCk7CisgICAgICAgIHNhbXBsZV93aWR0aCA9IEdTVF9SRUFEX1VJTlQxNl9CRSAoZGF0YSArIDU4KTsKKyAgICAgICAgZXh0cmFfZGF0YV9zaXplID0gR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhICsgNzQpOworCisgICAgICAgIEdTVF9ERUJVRworICAgICAgICAgICAgKCJmbGF2b3I6JWQsIHBhY2tldF9zaXplOiVkLCBoZWlnaHQ6JWQsIGxlYWZfc2l6ZTolZCwgc2FtcGxlX3dpZHRoOiVkLCBleHRyYV9kYXRhX3NpemU6JWQiLAorICAgICAgICAgICAgZmxhdm9yLCBwYWNrZXRfc2l6ZSwgaGVpZ2h0LCBsZWFmX3NpemUsIHNhbXBsZV93aWR0aCwKKyAgICAgICAgICAgIGV4dHJhX2RhdGFfc2l6ZSk7CisgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJmbGF2b3IiLCBHX1RZUEVfSU5ULCBmbGF2b3IsICJwYWNrZXRfc2l6ZSIsCisgICAgICAgICAgICBHX1RZUEVfSU5ULCBwYWNrZXRfc2l6ZSwgImhlaWdodCIsIEdfVFlQRV9JTlQsIGhlaWdodCwgImxlYWZfc2l6ZSIsCisgICAgICAgICAgICBHX1RZUEVfSU5ULCBsZWFmX3NpemUsICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHNhbXBsZV93aWR0aCwgTlVMTCk7CisKKyAgICAgICAgaWYgKChzaXplIC0gNzgpID49IGV4dHJhX2RhdGFfc2l6ZSkgeworICAgICAgICAgIHByaXYgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChnX21lbWR1cCAoZGF0YSArIDc4LCBleHRyYV9kYXRhX3NpemUpLAorICAgICAgICAgICAgICBleHRyYV9kYXRhX3NpemUpOworICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLCBwcml2LCBOVUxMKTsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChwcml2KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiUmVhbEF1ZGlvICVkLjAiLCByYXZlcnNpb24pOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUkVBTF9TSVBSKSkgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8veC1zaXBybyIpOworICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXAgKCJTaXByby9BQ0VMUC5ORVQgVm9pY2UgQ29kZWMiKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1JFQUxfUkFMRikpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtcmFsZi1tcGVnNC1nZW5lcmljIik7CisgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cCAoIlJlYWwgQXVkaW8gTG9zc2xlc3MiKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1JFQUxfQVRSQykpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtdm5kLnNvbnkuYXRyYWMzIik7CisgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cCAoIlNvbnkgQVRSQUMzIik7CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkcgKCJVbmtub3duIGNvZGVjICclcycsIGNhbm5vdCBidWlsZCBDYXBzIiwgY29kZWNfaWQpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKGNhcHMgIT0gTlVMTCkgeworICAgIGlmIChhdWRpb2NvbnRleHQtPnNhbXBsZXJhdGUgPiAwICYmIGF1ZGlvY29udGV4dC0+Y2hhbm5lbHMgPiAwKSB7CisgICAgICBnaW50IGk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7IGkrKykgeworICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSksCisgICAgICAgICAgICAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBhdWRpb2NvbnRleHQtPmNoYW5uZWxzLAorICAgICAgICAgICAgInJhdGUiLCBHX1RZUEVfSU5ULCBhdWRpb2NvbnRleHQtPnNhbXBsZXJhdGUsIE5VTEwpOworICAgICAgfQorICAgIH0KKworICAgIGNhcHMgPSBnc3RfY2Fwc19zaW1wbGlmeSAoY2Fwcyk7CisgIH0KKworICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X21hdHJvc2thX2RlbXV4X3N1YnRpdGxlX2NhcHMgKEdzdE1hdHJvc2thVHJhY2tTdWJ0aXRsZUNvbnRleHQgKgorICAgIHN1YnRpdGxlY29udGV4dCwgY29uc3QgZ2NoYXIgKiBjb2RlY19pZCwgZ3BvaW50ZXIgZGF0YSwgZ3VpbnQgc2l6ZSkKK3sKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjb250ZXh0ID0KKyAgICAgIChHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqKSBzdWJ0aXRsZWNvbnRleHQ7CisKKyAgLyogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisgIGlmICghZ19hc2NpaV9zdHJjYXNlY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1NVQlRJVExFX0FTQ0lJKSkKKyAgICBjb2RlY19pZCA9IEdTVF9NQVRST1NLQV9DT0RFQ19JRF9TVUJUSVRMRV9VVEY4OworICBlbHNlIGlmICghZ19hc2NpaV9zdHJjYXNlY21wIChjb2RlY19pZCwgIlNfU1NBIikpCisgICAgY29kZWNfaWQgPSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfU1NBOworICBlbHNlIGlmICghZ19hc2NpaV9zdHJjYXNlY21wIChjb2RlY19pZCwgIlNfQVNTIikpCisgICAgY29kZWNfaWQgPSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfQVNTOworICBlbHNlIGlmICghZ19hc2NpaV9zdHJjYXNlY21wIChjb2RlY19pZCwgIlNfVVNGIikpCisgICAgY29kZWNfaWQgPSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfVVNGOworCisgIC8qIFRPRE86IEFkZCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfQk1QIHN1cHBvcnQKKyAgICogQ2hlY2sgaWYgd2UgaGF2ZSB0byBkbyBzb21ldGhpbmcgd2l0aCBjb2RlY19wcml2YXRlICovCisgIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1NVQlRJVExFX1VURjgpKSB7CisgICAgLyogd2VsbCwgcGxhaW4gdGV4dCBzaW1wbHkgZG9lcyBub3QgaGF2ZSBhIGxvdCBvZiBtYXJrdXAgLi4uICovCisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ0ZXh0L3gtcmF3IiwgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgICJwYW5nby1tYXJrdXAiLCBOVUxMKTsKKyAgICBjb250ZXh0LT5wb3N0cHJvY2Vzc19mcmFtZSA9IGdzdF9tYXRyb3NrYV9kZW11eF9jaGVja19zdWJ0aXRsZV9idWZmZXI7CisgICAgc3VidGl0bGVjb250ZXh0LT5jaGVja19tYXJrdXAgPSBUUlVFOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfU1NBKSkgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXBwbGljYXRpb24veC1zc2EiKTsKKyAgICBjb250ZXh0LT5wb3N0cHJvY2Vzc19mcmFtZSA9IGdzdF9tYXRyb3NrYV9kZW11eF9jaGVja19zdWJ0aXRsZV9idWZmZXI7CisgICAgc3VidGl0bGVjb250ZXh0LT5jaGVja19tYXJrdXAgPSBGQUxTRTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1NVQlRJVExFX0FTUykpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtYXNzIik7CisgICAgY29udGV4dC0+cG9zdHByb2Nlc3NfZnJhbWUgPSBnc3RfbWF0cm9za2FfZGVtdXhfY2hlY2tfc3VidGl0bGVfYnVmZmVyOworICAgIHN1YnRpdGxlY29udGV4dC0+Y2hlY2tfbWFya3VwID0gRkFMU0U7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9TVUJUSVRMRV9VU0YpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXVzZiIpOworICAgIGNvbnRleHQtPnBvc3Rwcm9jZXNzX2ZyYW1lID0gZ3N0X21hdHJvc2thX2RlbXV4X2NoZWNrX3N1YnRpdGxlX2J1ZmZlcjsKKyAgICBzdWJ0aXRsZWNvbnRleHQtPmNoZWNrX21hcmt1cCA9IEZBTFNFOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfVk9CU1VCKSkgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgic3VicGljdHVyZS94LWR2ZCIpOworICAgICgoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKikgc3VidGl0bGVjb250ZXh0KS0+c2VuZF9kdmRfZXZlbnQgPSBUUlVFOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfSERNVlBHUykpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInN1YnBpY3R1cmUveC1wZ3MiKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1NVQlRJVExFX0tBVEUpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJzdWJ0aXRsZS94LWthdGUiKTsKKyAgICBjb250ZXh0LT5zdHJlYW1faGVhZGVycyA9CisgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV94aXBoX3N0cmVhbV9oZWFkZXJzIChjb250ZXh0LT5jb2RlY19wcml2LAorICAgICAgICBjb250ZXh0LT5jb2RlY19wcml2X3NpemUpOworICAgIC8qIEZJWE1FOiBtYXJrIHN0cmVhbSBhcyBicm9rZW4gYW5kIHNraXAgaWYgdGhlcmUgYXJlIG5vIHN0cmVhbSBoZWFkZXJzICovCisgICAgY29udGV4dC0+c2VuZF9zdHJlYW1faGVhZGVycyA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHICgiVW5rbm93biBzdWJ0aXRsZSBzdHJlYW06IGNvZGVjX2lkPSclcyciLCBjb2RlY19pZCk7CisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXN1YnRpdGxlLXVua25vd24iKTsKKyAgfQorCisgIGlmIChkYXRhICE9IE5VTEwgJiYgc2l6ZSA+IDApIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZjsKKworICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGdfbWVtZHVwIChkYXRhLCBzaXplKSwgc2l6ZSk7CisgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIGJ1ZiwgTlVMTCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgfQorCisgIHJldHVybiBjYXBzOworfQorCisjaWYgMAorc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9kZW11eF9zZXRfaW5kZXggKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RJbmRleCAqIGluZGV4KQoreworICBHc3RNYXRyb3NrYURlbXV4ICpkZW11eCA9IEdTVF9NQVRST1NLQV9ERU1VWCAoZWxlbWVudCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgIGlmIChkZW11eC0+Y29tbW9uLmVsZW1lbnRfaW5kZXgpCisgICAgZ3N0X29iamVjdF91bnJlZiAoZGVtdXgtPmNvbW1vbi5lbGVtZW50X2luZGV4KTsKKyAgZGVtdXgtPmNvbW1vbi5lbGVtZW50X2luZGV4ID0gaW5kZXggPyBnc3Rfb2JqZWN0X3JlZiAoaW5kZXgpIDogTlVMTDsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJTZXQgaW5kZXggJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBkZW11eC0+Y29tbW9uLmVsZW1lbnRfaW5kZXgpOworfQorCitzdGF0aWMgR3N0SW5kZXggKgorZ3N0X21hdHJvc2thX2RlbXV4X2dldF9pbmRleCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdEluZGV4ICpyZXN1bHQgPSBOVUxMOworICBHc3RNYXRyb3NrYURlbXV4ICpkZW11eCA9IEdTVF9NQVRST1NLQV9ERU1VWCAoZWxlbWVudCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgIGlmIChkZW11eC0+Y29tbW9uLmVsZW1lbnRfaW5kZXgpCisgICAgcmVzdWx0ID0gZ3N0X29iamVjdF9yZWYgKGRlbXV4LT5jb21tb24uZWxlbWVudF9pbmRleCk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJSZXR1cm5pbmcgaW5kZXggJSIgR1NUX1BUUl9GT1JNQVQsIHJlc3VsdCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9tYXRyb3NrYV9kZW11eF9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdE1hdHJvc2thRGVtdXggKmRlbXV4ID0gR1NUX01BVFJPU0tBX0RFTVVYIChlbGVtZW50KTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTOworCisgIC8qIGhhbmRsZSB1cHdhcmRzIHN0YXRlIGNoYW5nZXMgaGVyZSAqLworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICAvKiBoYW5kbGUgZG93bndhcmRzIHN0YXRlIGNoYW5nZXMgKi8KKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9tYXRyb3NrYV9kZW11eF9yZXNldCAoR1NUX0VMRU1FTlQgKGRlbXV4KSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX2RlbXV4X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RNYXRyb3NrYURlbXV4ICpkZW11eDsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfTUFUUk9TS0FfREVNVVggKG9iamVjdCkpOworICBkZW11eCA9IEdTVF9NQVRST1NLQV9ERU1VWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTUFYX0dBUF9USU1FOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgICAgICBkZW11eC0+bWF4X2dhcF90aW1lID0gZ192YWx1ZV9nZXRfdWludDY0ICh2YWx1ZSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX2RlbXV4X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RNYXRyb3NrYURlbXV4ICpkZW11eDsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfTUFUUk9TS0FfREVNVVggKG9iamVjdCkpOworICBkZW11eCA9IEdTVF9NQVRST1NLQV9ERU1VWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTUFYX0dBUF9USU1FOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCBkZW11eC0+bWF4X2dhcF90aW1lKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2dib29sZWFuCitnc3RfbWF0cm9za2FfZGVtdXhfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgZ3N0X3JpZmZfaW5pdCAoKTsKKworICAvKiBwYXJzZXIgaGVscGVyIHNlcGFyYXRlIGRlYnVnICovCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChlYm1scmVhZF9kZWJ1ZywgImVibWxyZWFkIiwKKyAgICAgIDAsICJFQk1MIHN0cmVhbSBoZWxwZXIgY2xhc3MiKTsKKworICAvKiBjcmVhdGUgYW4gZWxlbWVudGZhY3RvcnkgZm9yIHRoZSBtYXRyb3NrYV9kZW11eCBlbGVtZW50ICovCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIm1hdHJvc2thZGVtdXgiLAorICAgICAgICAgIEdTVF9SQU5LX1BSSU1BUlksIEdTVF9UWVBFX01BVFJPU0tBX0RFTVVYKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaCBiL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZTI0OGIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaApAQCAtMCwwICsxLDEyNiBAQAorLyogR1N0cmVhbWVyIE1hdHJvc2thIG11eGVyL2RlbXV4ZXIKKyAqIChjKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqIChjKSAyMDExIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKyAqCisgKiBtYXRyb3NrYS1kZW11eC5oOiBtYXRyb3NrYSBmaWxlL3N0cmVhbSBkZW11eGVyIGRlZmluaXRpb24KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX01BVFJPU0tBX0RFTVVYX0hfXworI2RlZmluZSBfX0dTVF9NQVRST1NLQV9ERU1VWF9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RmbG93Y29tYmluZXIuaD4KKworI2luY2x1ZGUgImVibWwtcmVhZC5oIgorI2luY2x1ZGUgIm1hdHJvc2thLWlkcy5oIgorI2luY2x1ZGUgIm1hdHJvc2thLXJlYWQtY29tbW9uLmgiCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9NQVRST1NLQV9ERU1VWCBcCisgIChnc3RfbWF0cm9za2FfZGVtdXhfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9NQVRST1NLQV9ERU1VWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfTUFUUk9TS0FfREVNVVgsIEdzdE1hdHJvc2thRGVtdXgpKQorI2RlZmluZSBHU1RfTUFUUk9TS0FfREVNVVhfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9NQVRST1NLQV9ERU1VWCwgR3N0TWF0cm9za2FEZW11eENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX01BVFJPU0tBX0RFTVVYKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9NQVRST1NLQV9ERU1VWCkpCisjZGVmaW5lIEdTVF9JU19NQVRST1NLQV9ERU1VWF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX01BVFJPU0tBX0RFTVVYKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE1hdHJvc2thRGVtdXggeworICBHc3RFbGVtZW50ICAgICAgICAgICAgICBwYXJlbnQ7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKworICBHc3RNYXRyb3NrYVJlYWRDb21tb24gICAgY29tbW9uOworCisgIC8qIHBhZHMgKi8KKyAgR3N0Q2xvY2sgICAgICAgICAgICAgICAgKmNsb2NrOworICBndWludCAgICAgICAgICAgICAgICAgICAgbnVtX3Zfc3RyZWFtczsKKyAgZ3VpbnQgICAgICAgICAgICAgICAgICAgIG51bV9hX3N0cmVhbXM7CisgIGd1aW50ICAgICAgICAgICAgICAgICAgICBudW1fdF9zdHJlYW1zOworCisgIGd1aW50ICAgICAgICAgICAgICAgICAgICBncm91cF9pZDsKKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIGhhdmVfZ3JvdXBfaWQ7CisKKyAgR3N0Rmxvd0NvbWJpbmVyICAgICAgICAgKmZsb3djb21iaW5lcjsKKworICAvKiBzdGF0ZSAqLworICBnYm9vbGVhbiAgICAgICAgICAgICAgICAgc3RyZWFtaW5nOworICBndWludDY0ICAgICAgICAgICAgICAgICAgc2Vla19ibG9jazsKKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIHNlZWtfZmlyc3Q7CisKKyAgLyogZGlkIHdlIHBhcnNlIGN1ZXMvdHJhY2tzL3NlZ21lbnRpbmZvIGFscmVhZHk/ICovCisgIGdib29sZWFuICAgICAgICAgICAgICAgICB0cmFja3NfcGFyc2VkOworICBHTGlzdCAgICAgICAgICAgICAgICAgICAqc2Vla19wYXJzZWQ7CisKKyAgLyogY2x1c3RlciBwb3NpdGlvbnMgKG9wdGlvbmFsKSAqLworICBHQXJyYXkgICAgICAgICAgICAgICAgICAqY2x1c3RlcnM7CisKKyAgLyoga2VlcGluZyB0cmFjayBvZiBwbGF5YmFjayBwb3NpdGlvbiAqLworICBHc3RDbG9ja1RpbWUgICAgICAgICAgICAgbGFzdF9zdG9wX2VuZDsKKyAgR3N0Q2xvY2tUaW1lICAgICAgICAgICAgIHN0cmVhbV9zdGFydF90aW1lOworCisgIC8qIFN0b3AgdGltZSBmb3IgcmV2ZXJzZSBwbGF5YmFjayAqLworICBHc3RDbG9ja1RpbWUgICAgICAgICAgICAgdG9fdGltZTsKKyAgR3N0RXZlbnQgICAgICAgICAgICAgICAgKm5ld19zZWdtZW50OworCisgIC8qIHNvbWUgc3RhdGUgc2F2aW5nICovCisgIEdzdENsb2NrVGltZSAgICAgICAgICAgICBjbHVzdGVyX3RpbWU7CisgIGd1aW50NjQgICAgICAgICAgICAgICAgICBjbHVzdGVyX29mZnNldDsKKyAgZ3VpbnQ2NCAgICAgICAgICAgICAgICAgIGZpcnN0X2NsdXN0ZXJfb2Zmc2V0OworICBndWludDY0ICAgICAgICAgICAgICAgICAgbmV4dF9jbHVzdGVyX29mZnNldDsKKyAgR3N0Q2xvY2tUaW1lICAgICAgICAgICAgIHJlcXVlc3RlZF9zZWVrX3RpbWU7CisgIGd1aW50NjQgICAgICAgICAgICAgICAgICBzZWVrX29mZnNldDsKKworICAvKiBhbHRlcm5hdGl2ZSBkdXJhdGlvbjsgb3B0aW9uYWxseSBvYnRhaW5lZCBmcm9tIGxhc3QgY2x1c3RlciAqLworICBndWludDY0ICAgICAgICAgICAgICAgICAgbGFzdF9jbHVzdGVyX29mZnNldDsKKyAgR3N0Q2xvY2tUaW1lICAgICAgICAgICAgIHN0cmVhbV9sYXN0X3RpbWU7CisKKyAgLyogaW5kZXggc3R1ZmYgKi8KKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIHNlZWthYmxlOworICBnYm9vbGVhbiAgICAgICAgICAgICAgICAgYnVpbGRpbmdfaW5kZXg7CisgIGd1aW50NjQgICAgICAgICAgICAgICAgICBpbmRleF9vZmZzZXQ7CisgIEdzdEV2ZW50ICAgICAgICAgICAgICAgICpzZWVrX2V2ZW50OworICBnYm9vbGVhbiAgICAgICAgICAgICAgICAgbmVlZF9zZWdtZW50OworICBndWludDMyICAgICAgICAgICAgICAgICAgc2VnbWVudF9zZXFudW07CisKKyAgLyogcmV2ZXJzZSBwbGF5YmFjayAqLworICBHQXJyYXkgICAgICAgICAgICAgICAgICAqc2Vla19pbmRleDsKKyAgZ2ludCAgICAgICAgICAgICAgICAgICAgIHNlZWtfZW50cnk7CisKKyAgLyogZ2FwIGhhbmRsaW5nICovCisgIGd1aW50NjQgICAgICAgICAgICAgICAgICBtYXhfZ2FwX3RpbWU7CisKKyAgLyogZm9yIG5vbi1maW5hbGl6ZWQgZmlsZXMsIHdpdGggaW52YWxpZCBzZWdtZW50IGR1cmF0aW9uICovCisgIGdib29sZWFuICAgICAgICAgICAgICAgICBpbnZhbGlkX2R1cmF0aW9uOworCisgIC8qIENhY2hlZCB1cHN0cmVhbSBsZW5ndGggKGRlZmF1bHQgR19NQVhVSU5UNjQpICovCisgIGd1aW50NjQJICAgICAgICAgICBjYWNoZWRfbGVuZ3RoOworfSBHc3RNYXRyb3NrYURlbXV4OworCit0eXBlZGVmIHN0cnVjdCBfR3N0TWF0cm9za2FEZW11eENsYXNzIHsKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudDsKK30gR3N0TWF0cm9za2FEZW11eENsYXNzOworCitnYm9vbGVhbiBnc3RfbWF0cm9za2FfZGVtdXhfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX01BVFJPU0tBX0RFTVVYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5jIGIvZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZTNkMjcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmMKQEAgLTAsMCArMSwzNTUgQEAKKy8qIEdTdHJlYW1lciBNYXRyb3NrYSBtdXhlci9kZW11eGVyCisgKiAoQykgMjAwMyBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAoQykgMjAwNiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIG1hdHJvc2thLWlkcy5jOiBtYXRyb3NrYSB0cmFjayBjb250ZXh0IHV0aWxpdHkgZnVuY3Rpb25zCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0cm9za2EtaWRzLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV90cmFja19pbml0X3ZpZGVvX2NvbnRleHQgKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICoqIHBfY29udGV4dCkKK3sKKyAgR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCAqdmlkZW9fY29udGV4dDsKKworICBnX2Fzc2VydCAocF9jb250ZXh0ICE9IE5VTEwgJiYgKnBfY29udGV4dCAhPSBOVUxMKTsKKworICAvKiBhbHJlYWR5IHNldCB1cD8gKHRyYWNrIGluZm8gbWlnaHQgY29tZSBiZWZvcmUgdHJhY2sgdHlwZSkgKi8KKyAgaWYgKCgqcF9jb250ZXh0KS0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9WSURFTykgeworICAgIEdTVF9MT0cgKCJ2aWRlbyBjb250ZXh0IGFscmVhZHkgc2V0IHVwIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICAvKiBpdCBiZXR0ZXIgbm90IGhhdmUgYmVlbiBzZXQgdXAgYXMgc29tZSBvdGhlciB0cmFjayB0eXBlIC4uLiAqLworICBpZiAoKCpwX2NvbnRleHQpLT50eXBlICE9IDApIHsKKyAgICBnX3JldHVybl92YWxfaWZfcmVhY2hlZCAoRkFMU0UpOworICB9CisKKyAgdmlkZW9fY29udGV4dCA9IGdfcmVuZXcgKEdzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQsICpwX2NvbnRleHQsIDEpOworICAqcF9jb250ZXh0ID0gKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICopIHZpZGVvX2NvbnRleHQ7CisKKyAgLyogZGVmYXVsdHMgKi8KKyAgKCpwX2NvbnRleHQpLT50eXBlID0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfVklERU87CisgIHZpZGVvX2NvbnRleHQtPmRpc3BsYXlfd2lkdGggPSAwOworICB2aWRlb19jb250ZXh0LT5kaXNwbGF5X2hlaWdodCA9IDA7CisgIHZpZGVvX2NvbnRleHQtPnBpeGVsX3dpZHRoID0gMDsKKyAgdmlkZW9fY29udGV4dC0+cGl4ZWxfaGVpZ2h0ID0gMDsKKyAgdmlkZW9fY29udGV4dC0+YXNyX21vZGUgPSAwOworICB2aWRlb19jb250ZXh0LT5mb3VyY2MgPSAwOworICB2aWRlb19jb250ZXh0LT5kZWZhdWx0X2ZwcyA9IDAuMDsKKyAgdmlkZW9fY29udGV4dC0+ZWFybGllc3RfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIHZpZGVvX2NvbnRleHQtPm11bHRpdmlld19tb2RlID0gR1NUX1ZJREVPX01VTFRJVklFV19NT0RFX05PTkU7CisgIHZpZGVvX2NvbnRleHQtPm11bHRpdmlld19mbGFncyA9IEdTVF9WSURFT19NVUxUSVZJRVdfRkxBR1NfTk9ORTsKKyAgdmlkZW9fY29udGV4dC0+Y29sb3JpbWV0cnkucmFuZ2UgPSBHU1RfVklERU9fQ09MT1JfUkFOR0VfVU5LTk9XTjsKKyAgdmlkZW9fY29udGV4dC0+Y29sb3JpbWV0cnkubWF0cml4ID0gR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9VTktOT1dOOworICB2aWRlb19jb250ZXh0LT5jb2xvcmltZXRyeS50cmFuc2ZlciA9IEdTVF9WSURFT19UUkFOU0ZFUl9VTktOT1dOOworICB2aWRlb19jb250ZXh0LT5jb2xvcmltZXRyeS5wcmltYXJpZXMgPSBHU1RfVklERU9fQ09MT1JfUFJJTUFSSUVTX1VOS05PV047CisKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV90cmFja19pbml0X2F1ZGlvX2NvbnRleHQgKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICoqIHBfY29udGV4dCkKK3sKKyAgR3N0TWF0cm9za2FUcmFja0F1ZGlvQ29udGV4dCAqYXVkaW9fY29udGV4dDsKKworICBnX2Fzc2VydCAocF9jb250ZXh0ICE9IE5VTEwgJiYgKnBfY29udGV4dCAhPSBOVUxMKTsKKworICAvKiBhbHJlYWR5IHNldCB1cD8gKHRyYWNrIGluZm8gbWlnaHQgY29tZSBiZWZvcmUgdHJhY2sgdHlwZSkgKi8KKyAgaWYgKCgqcF9jb250ZXh0KS0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9BVURJTykKKyAgICByZXR1cm4gVFJVRTsKKworICAvKiBpdCBiZXR0ZXIgbm90IGhhdmUgYmVlbiBzZXQgdXAgYXMgc29tZSBvdGhlciB0cmFjayB0eXBlIC4uLiAqLworICBpZiAoKCpwX2NvbnRleHQpLT50eXBlICE9IDApIHsKKyAgICBnX3JldHVybl92YWxfaWZfcmVhY2hlZCAoRkFMU0UpOworICB9CisKKyAgYXVkaW9fY29udGV4dCA9IGdfcmVuZXcgKEdzdE1hdHJvc2thVHJhY2tBdWRpb0NvbnRleHQsICpwX2NvbnRleHQsIDEpOworICAqcF9jb250ZXh0ID0gKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICopIGF1ZGlvX2NvbnRleHQ7CisKKyAgLyogZGVmYXVsdHMgKi8KKyAgKCpwX2NvbnRleHQpLT50eXBlID0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQVVESU87CisgIGF1ZGlvX2NvbnRleHQtPmNoYW5uZWxzID0gMTsKKyAgYXVkaW9fY29udGV4dC0+c2FtcGxlcmF0ZSA9IDgwMDA7CisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgorZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfc3VidGl0bGVfY29udGV4dCAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiogcF9jb250ZXh0KQoreworICBHc3RNYXRyb3NrYVRyYWNrU3VidGl0bGVDb250ZXh0ICpzdWJ0aXRsZV9jb250ZXh0OworCisgIGdfYXNzZXJ0IChwX2NvbnRleHQgIT0gTlVMTCAmJiAqcF9jb250ZXh0ICE9IE5VTEwpOworCisgIC8qIGFscmVhZHkgc2V0IHVwPyAodHJhY2sgaW5mbyBtaWdodCBjb21lIGJlZm9yZSB0cmFjayB0eXBlKSAqLworICBpZiAoKCpwX2NvbnRleHQpLT50eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFKQorICAgIHJldHVybiBUUlVFOworCisgIC8qIGl0IGJldHRlciBub3QgaGF2ZSBiZWVuIHNldCB1cCBhcyBzb21lIG90aGVyIHRyYWNrIHR5cGUgLi4uICovCisgIGlmICgoKnBfY29udGV4dCktPnR5cGUgIT0gMCkgeworICAgIGdfcmV0dXJuX3ZhbF9pZl9yZWFjaGVkIChGQUxTRSk7CisgIH0KKworICBzdWJ0aXRsZV9jb250ZXh0ID0gZ19yZW5ldyAoR3N0TWF0cm9za2FUcmFja1N1YnRpdGxlQ29udGV4dCwgKnBfY29udGV4dCwgMSk7CisgICpwX2NvbnRleHQgPSAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKikgc3VidGl0bGVfY29udGV4dDsKKworICAoKnBfY29udGV4dCktPnR5cGUgPSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9TVUJUSVRMRTsKKyAgc3VidGl0bGVfY29udGV4dC0+aW52YWxpZF91dGY4ID0gRkFMU0U7CisgIHN1YnRpdGxlX2NvbnRleHQtPnNlZW5fbWFya3VwX3RhZyA9IEZBTFNFOworICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorZ3N0X21hdHJvc2thX3JlZ2lzdGVyX3RhZ3MgKHZvaWQpCit7CisgIC8qIFRPRE86IHJlZ2lzdGVyIG90aGVyIGN1c3RvbSB0YWdzICovCit9CisKK0dzdEJ1ZmZlckxpc3QgKgorZ3N0X21hdHJvc2thX3BhcnNlX3hpcGhfc3RyZWFtX2hlYWRlcnMgKGdwb2ludGVyIGNvZGVjX2RhdGEsCisgICAgZ3NpemUgY29kZWNfZGF0YV9zaXplKQoreworICBHc3RCdWZmZXJMaXN0ICpsaXN0ID0gTlVMTDsKKyAgZ3VpbnQ4ICpwID0gY29kZWNfZGF0YTsKKyAgZ2ludCBpLCBvZmZzZXQsIG51bV9wYWNrZXRzOworICBndWludCAqbGVuZ3RoLCBsYXN0OworCisgIEdTVF9NRU1EVU1QICgieGlwaCBjb2RlYyBkYXRhIiwgY29kZWNfZGF0YSwgY29kZWNfZGF0YV9zaXplKTsKKworICBpZiAoY29kZWNfZGF0YSA9PSBOVUxMIHx8IGNvZGVjX2RhdGFfc2l6ZSA9PSAwKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogc3RhcnQgb2YgdGhlIHN0cmVhbSBhbmQgdm9yYmlzIGF1ZGlvIG9yIHRoZW9yYSB2aWRlbywgbmVlZCB0bworICAgKiBzZW5kIHRoZSBjb2RlY19wcml2IGRhdGEgYXMgZmlyc3QgdGhyZWUgcGFja2V0cyAqLworICBudW1fcGFja2V0cyA9IHBbMF0gKyAxOworICBHU1RfREVCVUcgKCIldSBzdHJlYW0gaGVhZGVycywgdG90YWwgbGVuZ3RoPSUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMiLAorICAgICAgKGd1aW50KSBudW1fcGFja2V0cywgY29kZWNfZGF0YV9zaXplKTsKKworICBsZW5ndGggPSBnX2FsbG9jYSAobnVtX3BhY2tldHMgKiBzaXplb2YgKGd1aW50KSk7CisgIGxhc3QgPSAwOworICBvZmZzZXQgPSAxOworCisgIC8qIGZpcnN0IHBhY2tldHMsIHJlYWQgbGVuZ3RoIHZhbHVlcyAqLworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhY2tldHMgLSAxOyBpKyspIHsKKyAgICBsZW5ndGhbaV0gPSAwOworICAgIHdoaWxlIChvZmZzZXQgPCBjb2RlY19kYXRhX3NpemUpIHsKKyAgICAgIGxlbmd0aFtpXSArPSBwW29mZnNldF07CisgICAgICBpZiAocFtvZmZzZXQrK10gIT0gMHhmZikKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGxhc3QgKz0gbGVuZ3RoW2ldOworICB9CisgIGlmIChvZmZzZXQgKyBsYXN0ID4gY29kZWNfZGF0YV9zaXplKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogbGFzdCBwYWNrZXQgaXMgdGhlIHJlbWFpbmluZyBzaXplICovCisgIGxlbmd0aFtpXSA9IGNvZGVjX2RhdGFfc2l6ZSAtIG9mZnNldCAtIGxhc3Q7CisKKyAgbGlzdCA9IGdzdF9idWZmZXJfbGlzdF9uZXcgKCk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9wYWNrZXRzOyBpKyspIHsKKyAgICBHc3RCdWZmZXIgKmhkcjsKKworICAgIEdTVF9ERUJVRyAoImJ1ZmZlciAlZDogJXUgYnl0ZXMiLCBpLCAoZ3VpbnQpIGxlbmd0aFtpXSk7CisKKyAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoW2ldID4gY29kZWNfZGF0YV9zaXplKQorICAgICAgZ290byBlcnJvcjsKKworICAgIGhkciA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGdfbWVtZHVwIChwICsgb2Zmc2V0LCBsZW5ndGhbaV0pLCBsZW5ndGhbaV0pOworICAgIGdzdF9idWZmZXJfbGlzdF9hZGQgKGxpc3QsIGhkcik7CisKKyAgICBvZmZzZXQgKz0gbGVuZ3RoW2ldOworICB9CisKKyAgcmV0dXJuIGxpc3Q7CisKKy8qIEVSUk9SUyAqLworZXJyb3I6CisgIHsKKyAgICBpZiAobGlzdCAhPSBOVUxMKQorICAgICAgZ3N0X2J1ZmZlcl9saXN0X3VucmVmIChsaXN0KTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitHc3RCdWZmZXJMaXN0ICoKK2dzdF9tYXRyb3NrYV9wYXJzZV9zcGVleF9zdHJlYW1faGVhZGVycyAoZ3BvaW50ZXIgY29kZWNfZGF0YSwKKyAgICBnc2l6ZSBjb2RlY19kYXRhX3NpemUpCit7CisgIEdzdEJ1ZmZlckxpc3QgKmxpc3QgPSBOVUxMOworICBHc3RCdWZmZXIgKmhkcjsKKyAgZ3VpbnQ4ICpwZGF0YSA9IGNvZGVjX2RhdGE7CisKKyAgR1NUX01FTURVTVAgKCJzcGVleCBjb2RlYyBkYXRhIiwgY29kZWNfZGF0YSwgY29kZWNfZGF0YV9zaXplKTsKKworICBpZiAoY29kZWNfZGF0YSA9PSBOVUxMIHx8IGNvZGVjX2RhdGFfc2l6ZSA8IDgwKSB7CisgICAgR1NUX1dBUk5JTkcgKCJub3QgZW5vdWdoIGNvZGVjIHByaXYgZGF0YSBmb3Igc3BlZXggaGVhZGVycyIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKG1lbWNtcCAocGRhdGEsICJTcGVleCAgICIsIDgpICE9IDApIHsKKyAgICBHU1RfV0FSTklORyAoIm5vIFNwZWV4IG1hcmtlciBhdCBzdGFydCBvZiBzdHJlYW0gaGVhZGVycyIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgbGlzdCA9IGdzdF9idWZmZXJfbGlzdF9uZXcgKCk7CisKKyAgaGRyID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZ19tZW1kdXAgKHBkYXRhLCA4MCksIDgwKTsKKyAgZ3N0X2J1ZmZlcl9saXN0X2FkZCAobGlzdCwgaGRyKTsKKworICBpZiAoY29kZWNfZGF0YV9zaXplID4gODApIHsKKyAgICBoZHIgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChnX21lbWR1cCAocGRhdGEgKyA4MCwgY29kZWNfZGF0YV9zaXplIC0gODApLAorICAgICAgICBjb2RlY19kYXRhX3NpemUgLSA4MCk7CisgICAgZ3N0X2J1ZmZlcl9saXN0X2FkZCAobGlzdCwgaGRyKTsKKyAgfQorCisgIHJldHVybiBsaXN0OworfQorCitHc3RCdWZmZXJMaXN0ICoKK2dzdF9tYXRyb3NrYV9wYXJzZV9vcHVzX3N0cmVhbV9oZWFkZXJzIChncG9pbnRlciBjb2RlY19kYXRhLAorICAgIGdzaXplIGNvZGVjX2RhdGFfc2l6ZSkKK3sKKyAgR3N0QnVmZmVyTGlzdCAqbGlzdCA9IE5VTEw7CisgIEdzdEJ1ZmZlciAqaGRyOworICBndWludDggKnBkYXRhID0gY29kZWNfZGF0YTsKKworICBHU1RfTUVNRFVNUCAoIm9wdXMgY29kZWMgZGF0YSIsIGNvZGVjX2RhdGEsIGNvZGVjX2RhdGFfc2l6ZSk7CisKKyAgaWYgKGNvZGVjX2RhdGEgPT0gTlVMTCB8fCBjb2RlY19kYXRhX3NpemUgPCAxOSkgeworICAgIEdTVF9XQVJOSU5HICgibm90IGVub3VnaCBjb2RlYyBwcml2IGRhdGEgZm9yIG9wdXMgaGVhZGVycyIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKG1lbWNtcCAocGRhdGEsICJPcHVzSGVhZCIsIDgpICE9IDApIHsKKyAgICBHU1RfV0FSTklORyAoIm5vIE9wdXNIZWFkIG1hcmtlciBhdCBzdGFydCBvZiBzdHJlYW0gaGVhZGVycyIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgbGlzdCA9IGdzdF9idWZmZXJfbGlzdF9uZXcgKCk7CisKKyAgaGRyID0KKyAgICAgIGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGdfbWVtZHVwIChwZGF0YSwgY29kZWNfZGF0YV9zaXplKSwKKyAgICAgIGNvZGVjX2RhdGFfc2l6ZSk7CisgIGdzdF9idWZmZXJfbGlzdF9hZGQgKGxpc3QsIGhkcik7CisKKyAgcmV0dXJuIGxpc3Q7Cit9CisKK0dzdEJ1ZmZlckxpc3QgKgorZ3N0X21hdHJvc2thX3BhcnNlX2ZsYWNfc3RyZWFtX2hlYWRlcnMgKGdwb2ludGVyIGNvZGVjX2RhdGEsCisgICAgZ3NpemUgY29kZWNfZGF0YV9zaXplKQoreworICBHc3RCdWZmZXJMaXN0ICpsaXN0ID0gTlVMTDsKKyAgR3N0QnVmZmVyICpoZHI7CisgIGd1aW50OCAqcGRhdGEgPSBjb2RlY19kYXRhOworICBndWludCBsZW4sIG9mZjsKKworICBHU1RfTUVNRFVNUCAoImZsYWMgY29kZWMgZGF0YSIsIGNvZGVjX2RhdGEsIGNvZGVjX2RhdGFfc2l6ZSk7CisKKyAgLyogbmVlZCBhdCBsZWFzdCAnZkxhQycgbWFya2VyICsgU1RSRUFNSU5GTyBtZXRhZGF0YSBibG9jayAqLworICBpZiAoY29kZWNfZGF0YSA9PSBOVUxMIHx8IGNvZGVjX2RhdGFfc2l6ZSA8ICgoNCkgKyAoNCArIDM0KSkpIHsKKyAgICBHU1RfV0FSTklORyAoIm5vdCBlbm91Z2ggY29kZWMgcHJpdiBkYXRhIGZvciBmbGFjIGhlYWRlcnMiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChtZW1jbXAgKHBkYXRhLCAiZkxhQyIsIDQpICE9IDApIHsKKyAgICBHU1RfV0FSTklORyAoIm5vIGZsYWMgbWFya2VyIGF0IHN0YXJ0IG9mIHN0cmVhbSBoZWFkZXJzIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBsaXN0ID0gZ3N0X2J1ZmZlcl9saXN0X25ldyAoKTsKKworICBoZHIgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChnX21lbWR1cCAocGRhdGEsIDQpLCA0KTsKKyAgZ3N0X2J1ZmZlcl9saXN0X2FkZCAobGlzdCwgaGRyKTsKKworICAvKiBza2lwIGZMYUMgbWFya2VyICovCisgIG9mZiA9IDQ7CisKKyAgd2hpbGUgKG9mZiA8IGNvZGVjX2RhdGFfc2l6ZSAtIDMpIHsKKyAgICBsZW4gPSBHU1RfUkVBRF9VSU5UOCAocGRhdGEgKyBvZmYgKyAxKSA8PCAxNjsKKyAgICBsZW4gfD0gR1NUX1JFQURfVUlOVDggKHBkYXRhICsgb2ZmICsgMikgPDwgODsKKyAgICBsZW4gfD0gR1NUX1JFQURfVUlOVDggKHBkYXRhICsgb2ZmICsgMyk7CisKKyAgICBHU1RfREVCVUcgKCJoZWFkZXIgcGFja2V0OiBsZW49JXUgYnl0ZXMsIGZsYWdzPTB4JTAyeCIsIGxlbiwgcGRhdGFbb2ZmXSk7CisKKyAgICBpZiAob2ZmICsgbGVuID4gY29kZWNfZGF0YV9zaXplKSB7CisgICAgICBnc3RfYnVmZmVyX2xpc3RfdW5yZWYgKGxpc3QpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaGRyID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZ19tZW1kdXAgKHBkYXRhICsgb2ZmLCBsZW4gKyA0KSwgbGVuICsgNCk7CisgICAgZ3N0X2J1ZmZlcl9saXN0X2FkZCAobGlzdCwgaGRyKTsKKworICAgIG9mZiArPSA0ICsgbGVuOworICB9CisgIHJldHVybiBsaXN0OworfQorCitHc3RDbG9ja1RpbWUKK2dzdF9tYXRyb3NrYV90cmFja19nZXRfYnVmZmVyX3RpbWVzdGFtcCAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiB0cmFjaywKKyAgICBHc3RCdWZmZXIgKiBidWYpCit7CisgIGlmICh0cmFjay0+ZHRzX29ubHkpIHsKKyAgICByZXR1cm4gR1NUX0JVRkZFUl9EVFNfT1JfUFRTIChidWYpOworICB9IGVsc2UgeworICAgIHJldHVybiBHU1RfQlVGRkVSX1BUUyAoYnVmKTsKKyAgfQorfQorCit2b2lkCitnc3RfbWF0cm9za2FfdHJhY2tfZnJlZSAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiB0cmFjaykKK3sKKyAgZ19mcmVlICh0cmFjay0+Y29kZWNfaWQpOworICBnX2ZyZWUgKHRyYWNrLT5jb2RlY19uYW1lKTsKKyAgZ19mcmVlICh0cmFjay0+bmFtZSk7CisgIGdfZnJlZSAodHJhY2stPmxhbmd1YWdlKTsKKyAgZ19mcmVlICh0cmFjay0+Y29kZWNfcHJpdik7CisgIGdfZnJlZSAodHJhY2stPmNvZGVjX3N0YXRlKTsKKworICBpZiAodHJhY2stPmVuY29kaW5ncyAhPSBOVUxMKSB7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdHJhY2stPmVuY29kaW5ncy0+bGVuOyArK2kpIHsKKyAgICAgIEdzdE1hdHJvc2thVHJhY2tFbmNvZGluZyAqZW5jID0gJmdfYXJyYXlfaW5kZXggKHRyYWNrLT5lbmNvZGluZ3MsCisgICAgICAgICAgR3N0TWF0cm9za2FUcmFja0VuY29kaW5nLAorICAgICAgICAgIGkpOworCisgICAgICBnX2ZyZWUgKGVuYy0+Y29tcF9zZXR0aW5ncyk7CisgICAgfQorICAgIGdfYXJyYXlfZnJlZSAodHJhY2stPmVuY29kaW5ncywgVFJVRSk7CisgIH0KKworICBpZiAodHJhY2stPnRhZ3MpCisgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0cmFjay0+dGFncyk7CisKKyAgaWYgKHRyYWNrLT5pbmRleF90YWJsZSkKKyAgICBnX2FycmF5X2ZyZWUgKHRyYWNrLT5pbmRleF90YWJsZSwgVFJVRSk7CisKKyAgaWYgKHRyYWNrLT5zdHJlYW1faGVhZGVycykKKyAgICBnc3RfYnVmZmVyX2xpc3RfdW5yZWYgKHRyYWNrLT5zdHJlYW1faGVhZGVycyk7CisKKyAgZ19mcmVlICh0cmFjayk7Cit9CmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmggYi9nc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE4ODAxMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaApAQCAtMCwwICsxLDY4OSBAQAorLyogR1N0cmVhbWVyIE1hdHJvc2thIG11eGVyL2RlbXV4ZXIKKyAqIChjKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqCisgKiBtYXRyb3NrYS1pZHMuaDogbWF0cm9za2EgZmlsZS9zdHJlYW0gZGF0YSBJRHMKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX01BVFJPU0tBX0lEU19IX18KKyNkZWZpbmUgX19HU1RfTUFUUk9TS0FfSURTX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby1pbmZvLmg+CisKKyNpbmNsdWRlICJlYm1sLWlkcy5oIgorCisvKgorICogRUJNTCBEb2NUeXBlLgorICovCisKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0RPQ1RZUEVfTUFUUk9TS0EgICAgICAgICAgICAgICJtYXRyb3NrYSIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0RPQ1RZUEVfV0VCTSAgICAgICAgICAgICAgICAgICJ3ZWJtIgorCisvKgorICogTWF0cm9za2EgZWxlbWVudCBJRHMuIG1heC4gMzItYml0LgorICovCisKKy8qIHRvcGxldmVsIFNlZ21lbnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1NFR01FTlQgICAgICAgICAgICAgICAgICAgIDB4MTg1MzgwNjcKKworLyogbWF0cm9za2EgdG9wLWxldmVsIG1hc3RlciBJRHMsIGNoaWxkcyBvZiBTZWdtZW50ICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9TRUdNRU5USU5GTyAgICAgICAgICAgICAgICAweDE1NDlBOTY2CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UUkFDS1MgICAgICAgICAgICAgICAgICAgICAweDE2NTRBRTZCCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DVUVTICAgICAgICAgICAgICAgICAgICAgICAweDFDNTNCQjZCCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UQUdTICAgICAgICAgICAgICAgICAgICAgICAweDEyNTRDMzY3CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9TRUVLSEVBRCAgICAgICAgICAgICAgICAgICAweDExNEQ5Qjc0CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DTFVTVEVSICAgICAgICAgICAgICAgICAgICAweDFGNDNCNjc1CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9BVFRBQ0hNRU5UUyAgICAgICAgICAgICAgICAweDE5NDFBNDY5CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSUyAgICAgICAgICAgICAgICAgICAweDEwNDNBNzcwCisKKy8qIElEcyBpbiB0aGUgU2VnbWVudEluZm8gbWFzdGVyICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9USU1FQ09ERVNDQUxFICAgICAgICAgICAgICAweDJBRDdCMQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfRFVSQVRJT04gICAgICAgICAgICAgICAgICAgMHg0NDg5CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9XUklUSU5HQVBQICAgICAgICAgICAgICAgICAweDU3NDEKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX01VWElOR0FQUCAgICAgICAgICAgICAgICAgIDB4NEQ4MAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfREFURVVUQyAgICAgICAgICAgICAgICAgICAgMHg0NDYxCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9TRUdNRU5UVUlEICAgICAgICAgICAgICAgICAweDczQTQKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1NFR01FTlRGSUxFTkFNRSAgICAgICAgICAgIDB4NzM4NAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfUFJFVlVJRCAgICAgICAgICAgICAgICAgICAgMHgzQ0I5MjMKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1BSRVZGSUxFTkFNRSAgICAgICAgICAgICAgIDB4M0M4M0FCCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9ORVhUVUlEICAgICAgICAgICAgICAgICAgICAweDNFQjkyMworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfTkVYVEZJTEVOQU1FICAgICAgICAgICAgICAgMHgzRTgzQkIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RJVExFICAgICAgICAgICAgICAgICAgICAgIDB4N0JBOQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfU0VHTUVOVEZBTUlMWSAgICAgICAgICAgICAgMHg0NDQ0CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSVFJBTlNMQVRFICAgICAgICAgICAweDY5MjQKKworLyogSURzIGluIHRoZSBDaGFwdGVyVHJhbnNsYXRlIG1hc3RlciAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUlRSQU5TTEFURUVESVRJT05VSUQgMHg2OUZDCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSVFJBTlNMQVRFQ09ERUMgICAgICAweDY5QkYKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJUUkFOU0xBVEVJRCAgICAgICAgIDB4NjlBNQorCisvKiBJRCBpbiB0aGUgVHJhY2tzIG1hc3RlciAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tFTlRSWSAgICAgICAgICAgICAgICAgMHhBRQorCisvKiBJRHMgaW4gdGhlIFRyYWNrRW50cnkgbWFzdGVyICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UUkFDS05VTUJFUiAgICAgICAgICAgICAgICAweEQ3CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UUkFDS1VJRCAgICAgICAgICAgICAgICAgICAweDczQzUKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RSQUNLVFlQRSAgICAgICAgICAgICAgICAgIDB4ODMKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RSQUNLQVVESU8gICAgICAgICAgICAgICAgIDB4RTEKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RSQUNLVklERU8gICAgICAgICAgICAgICAgIDB4RTAKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRFTkNPRElOR1MgICAgICAgICAgIDB4NkQ4MAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ09ERUNJRCAgICAgICAgICAgICAgICAgICAgMHg4NgorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ09ERUNQUklWQVRFICAgICAgICAgICAgICAgMHg2M0EyCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DT0RFQ05BTUUgICAgICAgICAgICAgICAgICAweDI1ODY4OAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tOQU1FICAgICAgICAgICAgICAgICAgMHg1MzZFCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UUkFDS0xBTkdVQUdFICAgICAgICAgICAgICAweDIyQjU5QworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tGTEFHRU5BQkxFRCAgICAgICAgICAgMHhCOQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tGTEFHREVGQVVMVCAgICAgICAgICAgMHg4OAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tGTEFHRk9SQ0VEICAgICAgICAgICAgMHg1NUFBCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UUkFDS0ZMQUdMQUNJTkcgICAgICAgICAgICAweDlDCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UUkFDS01JTkNBQ0hFICAgICAgICAgICAgICAweDZERTcKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RSQUNLTUFYQ0FDSEUgICAgICAgICAgICAgIDB4NkRGOAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tERUZBVUxURFVSQVRJT04gICAgICAgMHgyM0UzODMKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RSQUNLVElNRUNPREVTQ0FMRSAgICAgICAgIDB4MjMzMTRGCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9NQVhCTE9DS0FERElUSU9OSUQgICAgICAgICAweDU1RUUKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RSQUNLQVRUQUNITUVOVExJTksgICAgICAgIDB4NzQ0NgorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tPVkVSTEFZICAgICAgICAgICAgICAgMHg2RkFCCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UUkFDS1RSQU5TTEFURSAgICAgICAgICAgICAweDY2MjQKKy8qIHNlbWktZHJhZnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RSQUNLT0ZGU0VUICAgICAgICAgICAgICAgIDB4NTM3RgorLyogc2VtaS1kcmFmdCAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ09ERUNTRVRUSU5HUyAgICAgICAgICAgICAgMHgzQTk2OTcKKy8qIHNlbWktZHJhZnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NPREVDSU5GT1VSTCAgICAgICAgICAgICAgIDB4M0I0MDQwCisvKiBzZW1pLWRyYWZ0ICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DT0RFQ0RPV05MT0FEVVJMICAgICAgICAgICAweDI2QjI0MAorLyogc2VtaS1kcmFmdCAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ09ERUNERUNPREVBTEwgICAgICAgICAgICAgMHhBQQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfU0VFS1BSRVJPTEwgICAgICAgICAgICAgICAgMHg1NkJCCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DT0RFQ0RFTEFZICAgICAgICAgICAgICAgICAweDU2QUEKKworLyogSURzIGluIHRoZSBUcmFja1RyYW5zbGF0ZSBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RSQUNLVFJBTlNMQVRFRURJVElPTlVJRCAgIDB4NjZGQworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tUUkFOU0xBVEVDT0RFQyAgICAgICAgMHg2NkJGCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UUkFDS1RSQU5TTEFURVRSQUNLSUQgICAgICAweDY2QTUKKworCisvKiBJRHMgaW4gdGhlIFRyYWNrVmlkZW8gbWFzdGVyICovCisvKiBOT1RFOiBUaGlzIG9uZSBpcyBoZXJlIG9ubHkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgKiBVc2UgX1RSQUNLREVGQVVMRFVSQVRJT04gKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1ZJREVPRlJBTUVSQVRFICAgICAgICAgICAgIDB4MjM4M0UzCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9WSURFT0RJU1BMQVlXSURUSCAgICAgICAgICAweDU0QjAKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1ZJREVPRElTUExBWUhFSUdIVCAgICAgICAgIDB4NTRCQQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVklERU9ESVNQTEFZVU5JVCAgICAgICAgICAgMHg1NEIyCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9WSURFT1BJWEVMV0lEVEggICAgICAgICAgICAweEIwCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9WSURFT1BJWEVMSEVJR0hUICAgICAgICAgICAweEJBCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9WSURFT1BJWEVMQ1JPUEJPVFRPTSAgICAgICAweDU0QUEKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1ZJREVPUElYRUxDUk9QVE9QICAgICAgICAgIDB4NTRCQgorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVklERU9QSVhFTENST1BMRUZUICAgICAgICAgMHg1NENDCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9WSURFT1BJWEVMQ1JPUFJJR0hUICAgICAgICAweDU0REQKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1ZJREVPRkxBR0lOVEVSTEFDRUQgICAgICAgIDB4OUEKKy8qIHNlbWktZHJhZnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1ZJREVPU1RFUkVPTU9ERSAgICAgICAgICAgIDB4NTNCOAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVklERU9BU1BFQ1RSQVRJT1RZUEUgICAgICAgMHg1NEIzCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9WSURFT0NPTE9VUlNQQUNFICAgICAgICAgICAweDJFQjUyNAorLyogc2VtaS1kcmFmdCAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVklERU9HQU1NQVZBTFVFICAgICAgICAgICAgMHgyRkI1MjMKKworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVklERU9DT0xPVVIgICAgICAgICAgICAgICAgMHg1NUIwCisvKiBJRHMgaW4gdGhlIENvbG91ciBtYXN0ZXIqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVklERU9NQVRSSVhDT0VGRklDSUVOVFMgICAgMHg1NUIxCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9WSURFT1JBTkdFICAgICAgICAgICAgICAgICAweDU1QjkKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1ZJREVPVFJBTlNGRVJDSEFSQUNURVJJU1RJQ1MgIDB4NTVCQQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVklERU9QUklNQVJJRVMgICAgICAgICAgICAgMHg1NUJCCisKKy8qIElEcyBpbiB0aGUgVHJhY2tBdWRpbyBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0FVRElPU0FNUExJTkdGUkVRICAgICAgICAgIDB4QjUKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0FVRElPQklUREVQVEggICAgICAgICAgICAgIDB4NjI2NAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQVVESU9DSEFOTkVMUyAgICAgICAgICAgICAgMHg5RgorLyogc2VtaS1kcmFmdCAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQVVESU9DSEFOTkVMUE9TSVRJT05TICAgICAgMHg3RDdCCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9BVURJT09VVFBVVFNBTVBMSU5HRlJFUSAgICAweDc4QjUKKworLyogSURzIGluIHRoZSBUcmFja0NvbnRlbnRFbmNvZGluZyBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRFTkNPRElORyAgICAgICAgICAgIDB4NjI0MAorCisvKiBJRHMgaW4gdGhlIENvbnRlbnRFbmNvZGluZyBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRFTkNPRElOR09SREVSICAgICAgIDB4NTAzMQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ09OVEVOVEVOQ09ESU5HU0NPUEUgICAgICAgMHg1MDMyCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DT05URU5URU5DT0RJTkdUWVBFICAgICAgICAweDUwMzMKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRDT01QUkVTU0lPTiAgICAgICAgIDB4NTAzNAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ09OVEVOVEVOQ1JZUFRJT04gICAgICAgICAgMHg1MDM1CisKKy8qIElEcyBpbiB0aGUgQ29udGVudENvbXByZXNzaW9uIG1hc3RlciAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ09OVEVOVENPTVBBTEdPICAgICAgICAgICAgMHg0MjU0CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DT05URU5UQ09NUFNFVFRJTkdTICAgICAgICAweDQyNTUKKworLyogSURzIGluIHRoZSBDb250ZW50RW5jcnlwdGlvbiBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRFTkNBTEdPICAgICAgICAgICAgIDB4NDdFMQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ09OVEVOVEVOQ0tFWUlEICAgICAgICAgICAgMHg0N0UyCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DT05URU5UU0lHTkFUVVJFICAgICAgICAgICAweDQ3RTMKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRTSUdLRVlJRCAgICAgICAgICAgIDB4NDdFNAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ09OVEVOVFNJR0FMR08gICAgICAgICAgICAgMHg0N0U1CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DT05URU5UU0lHSEFTSEFMR08gICAgICAgICAweDQ3RTYKKworLyogSUQgaW4gdGhlIENVRXMgbWFzdGVyICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9QT0lOVEVOVFJZICAgICAgICAgICAgICAgICAweEJCCisKKy8qIElEcyBpbiB0aGUgcG9pbnRlbnRyeSBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NVRVRJTUUgICAgICAgICAgICAgICAgICAgIDB4QjMKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NVRVRSQUNLUE9TSVRJT05TICAgICAgICAgIDB4QjcKKworLyogSURzIGluIHRoZSBDdWVUcmFja1Bvc2l0aW9ucyBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NVRVRSQUNLICAgICAgICAgICAgICAgICAgIDB4RjcKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NVRUNMVVNURVJQT1NJVElPTiAgICAgICAgIDB4RjEKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NVRUJMT0NLTlVNQkVSICAgICAgICAgICAgIDB4NTM3OAorLyogc2VtaS1kcmFmdCAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ1VFQ09ERUNTVEFURSAgICAgICAgICAgICAgMHhFQQorLyogc2VtaS1kcmFmdCAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ1VFUkVGRVJFTkNFICAgICAgICAgICAgICAgMHhEQgorCisvKiBJRHMgaW4gdGhlIEN1ZVJlZmVyZW5jZSBtYXN0ZXIgKi8KKy8qIHNlbWktZHJhZnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NVRVJFRlRJTUUgICAgICAgICAgICAgICAgIDB4OTYKKy8qIHNlbWktZHJhZnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NVRVJFRkNMVVNURVIgICAgICAgICAgICAgIDB4OTcKKy8qIHNlbWktZHJhZnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NVRVJFRk5VTUJFUiAgICAgICAgICAgICAgIDB4NTM1RgorLyogc2VtaS1kcmFmdCAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ1VFUkVGQ09ERUNTVEFURSAgICAgICAgICAgMHhFQgorCisvKiBJRHMgaW4gdGhlIFRhZ3MgbWFzdGVyICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UQUcgICAgICAgICAgICAgICAgICAgICAgICAweDczNzMKKworLyogaW4gdGhlIFRhZyBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1NJTVBMRVRBRyAgICAgICAgICAgICAgICAgIDB4NjdDOAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVEFSR0VUUyAgICAgICAgICAgICAgICAgICAgMHg2M0MwCisKKy8qIGluIHRoZSBTaW1wbGVUYWcgbWFzdGVyICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UQUdOQU1FICAgICAgICAgICAgICAgICAgICAweDQ1QTMKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RBR1NUUklORyAgICAgICAgICAgICAgICAgIDB4NDQ4NworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVEFHTEFOR1VBR0UgICAgICAgICAgICAgICAgMHg0NDdBCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UQUdERUZBVUxUICAgICAgICAgICAgICAgICAweDQ0ODQKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RBR0JJTkFSWSAgICAgICAgICAgICAgICAgIDB4NDQ4NQorCisvKiBpbiB0aGUgVGFyZ2V0cyBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RBUkdFVFRZUEVWQUxVRSAgICAgICAgICAgIDB4NjhDQQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVEFSR0VUVFlQRSAgICAgICAgICAgICAgICAgMHg2M0NBCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UQVJHRVRUUkFDS1VJRCAgICAgICAgICAgICAweDYzQzUKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RBUkdFVEVESVRJT05VSUQgICAgICAgICAgIDB4NjNDOQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVEFSR0VUQ0hBUFRFUlVJRCAgICAgICAgICAgMHg2M0M0CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UQVJHRVRBVFRBQ0hNRU5UVUlEICAgICAgICAweDYzQzYKKworLyogSURzIGluIHRoZSBTZWVrSGVhZCBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1NFRUtFTlRSWSAgICAgICAgICAgICAgICAgIDB4NERCQgorCisvKiBJRHMgaW4gdGhlIFNlZWtFbnRyeSBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1NFRUtJRCAgICAgICAgICAgICAgICAgICAgIDB4NTNBQgorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfU0VFS1BPU0lUSU9OICAgICAgICAgICAgICAgMHg1M0FDCisKKy8qIElEcyBpbiB0aGUgQ2x1c3RlciBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NMVVNURVJUSU1FQ09ERSAgICAgICAgICAgIDB4RTcKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0JMT0NLR1JPVVAgICAgICAgICAgICAgICAgIDB4QTAKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1NJTVBMRUJMT0NLICAgICAgICAgICAgICAgIDB4QTMKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1JFRkVSRU5DRUJMT0NLICAgICAgICAgICAgIDB4RkIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1BPU0lUSU9OICAgICAgICAgICAgICAgICAgIDB4QTcKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1BSRVZTSVpFICAgICAgICAgICAgICAgICAgIDB4QUIKKy8qIHNlbWktZHJhZnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0VOQ1JZUFRFREJMT0NLICAgICAgICAgICAgIDB4QUYKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1NJTEVOVFRSQUNLUyAgICAgICAgICAgICAgIDB4NTg1NAorCisvKiBJRHMgaW4gdGhlIFNpbGVudFRyYWNrcyBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1NJTEVOVFRSQUNLTlVNQkVSICAgICAgICAgIDB4NThENworCisvKiBJRHMgaW4gdGhlIEJsb2NrR3JvdXAgbWFzdGVyICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9CTE9DSyAgICAgICAgICAgICAgICAgICAgICAweEExCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9CTE9DS0RVUkFUSU9OICAgICAgICAgICAgICAweDlCCisvKiBzZW1pLWRyYWZ0ICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9CTE9DS1ZJUlRVQUwgICAgICAgICAgICAgICAweEEyCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9SRUZFUkVOQ0VCTE9DSyAgICAgICAgICAgICAweEZCCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9CTE9DS0FERElUSU9OUyAgICAgICAgICAgICAweDc1QTEKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1JFRkVSRU5DRVBSSU9SSVRZICAgICAgICAgIDB4RkEKKy8qIHNlbWktZHJhZnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1JFRkVSRU5DRVZJUlRVQUwgICAgICAgICAgIDB4RkQKKy8qIHNlbWktZHJhZnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NPREVDU1RBVEUgICAgICAgICAgICAgICAgIDB4QTQKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1NMSUNFUyAgICAgICAgICAgICAgICAgICAgIDB4OEUKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0RJU0NBUkRQQURESU5HICAgICAgICAgICAgIDB4NzVBMgorCisvKiBJRHMgaW4gdGhlIEJsb2NrQWRkaXRpb25zIG1hc3RlciAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQkxPQ0tNT1JFICAgICAgICAgICAgICAgICAgMHhBNgorCisvKiBJRHMgaW4gdGhlIEJsb2NrTW9yZSBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0JMT0NLQURESUQgICAgICAgICAgICAgICAgIDB4RUUKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0JMT0NLQURESVRJT05BTCAgICAgICAgICAgIDB4QTUKKworLyogSURzIGluIHRoZSBTbGljZXMgbWFzdGVyICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9USU1FU0xJQ0UgICAgICAgICAgICAgICAgICAweEU4CisKKy8qIElEcyBpbiB0aGUgVGltZVNsaWNlIG1hc3RlciAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfTEFDRU5VTUJFUiAgICAgICAgICAgICAgICAgMHhDQworLyogc2VtaS1kcmFmdCAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfRlJBTUVOVU1CRVIgICAgICAgICAgICAgICAgMHhDRAorLyogc2VtaS1kcmFmdCAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQkxPQ0tBRERJVElPTklEICAgICAgICAgICAgMHhDQgorLyogc2VtaS1kcmFmdCAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVElNRVNMSUNFREVMQVkgICAgICAgICAgICAgMHhDRQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVElNRVNMSUNFRFVSQVRJT04gICAgICAgICAgMHhDRgorCisvKiBJRHMgaW4gdGhlIEF0dGFjaG1lbnRzIG1hc3RlciAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQVRUQUNIRURGSUxFICAgICAgICAgICAgICAgMHg2MUE3CisKKy8qIElEcyBpbiB0aGUgQXR0YWNoZWRGaWxlIG1hc3RlciAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfRklMRURFU0NSSVBUSU9OICAgICAgICAgICAgMHg0NjdFCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9GSUxFTkFNRSAgICAgICAgICAgICAgICAgICAweDQ2NkUKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0ZJTEVNSU1FVFlQRSAgICAgICAgICAgICAgIDB4NDY2MAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfRklMRURBVEEgICAgICAgICAgICAgICAgICAgMHg0NjVDCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9GSUxFVUlEICAgICAgICAgICAgICAgICAgICAweDQ2QUUKKy8qIHNlbWktZHJhZnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0ZJTEVSRUZFUlJBTCAgICAgICAgICAgICAgIDB4NDY3NQorCisvKiBJRHMgaW4gdGhlIENoYXB0ZXJzIG1hc3RlciAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfRURJVElPTkVOVFJZICAgICAgICAgICAgICAgMHg0NUI5CisKKy8qIElEcyBpbiB0aGUgRWRpdGlvbkVudHJ5IG1hc3RlciAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfRURJVElPTlVJRCAgICAgICAgICAgICAgICAgMHg0NUJDCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9FRElUSU9ORkxBR0hJRERFTiAgICAgICAgICAweDQ1QkQKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0VESVRJT05GTEFHREVGQVVMVCAgICAgICAgIDB4NDVEQgorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfRURJVElPTkZMQUdPUkRFUkVEICAgICAgICAgMHg0NURECisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSQVRPTSAgICAgICAgICAgICAgICAweEI2CisKKy8qIElEcyBpbiB0aGUgQ2hhcHRlckF0b20gbWFzdGVyICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSVUlEICAgICAgICAgICAgICAgICAweDczQzQKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJTVFJJTkdVSUQgICAgICAgICAgIDB4NTY1NAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUlRJTUVTVEFSVCAgICAgICAgICAgMHg5MQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUlRJTUVTVE9QICAgICAgICAgICAgMHg5MgorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUkZMQUdISURERU4gICAgICAgICAgMHg5OAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUkZMQUdFTkFCTEVEICAgICAgICAgMHg0NTk4CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSU0VHTUVOVFVJRCAgICAgICAgICAweDZFNjcKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJTRUdNRU5URURJVElPTlVJRCAgIDB4NkVCQworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUlBIWVNJQ0FMRVFVSVYgICAgICAgMHg2M0MzCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSVFJBQ0sgICAgICAgICAgICAgICAweDhGCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSRElTUExBWSAgICAgICAgICAgICAweDgwCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQUFJPQ0VTUyAgICAgICAgICAgICAgICAweDY5NDQKKworLyogSURzIGluIHRoZSBDaGFwUHJvY2VzcyBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NIQVBQUk9DRVNTQ09ERUNJRCAgICAgICAgIDB4Njk1NQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFBST0NFU1NQUklWQVRFICAgICAgICAgMHg0NTBECisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQUFJPQ0VTU0NPTU1BTkQgICAgICAgICAweDY5MTEKKworLyogSURzIGluIHRoZSBDaGFwUHJvY2Vzc0NvbW1hbmQgbWFzdGVyICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQUFJPQ0VTU1RJTUUgICAgICAgICAgICAweDY5MjIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NIQVBQUk9DRVNTREFUQSAgICAgICAgICAgIDB4NjkzMworCisvKiBJRHMgaW4gdGhlIENoYXB0ZXJEaXNwbGF5IG1hc3RlciAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFNUUklORyAgICAgICAgICAgICAgICAgMHg4NQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ0hBUExBTkdVQUdFICAgICAgICAgICAgICAgMHg0MzdDCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQQ09VTlRSWSAgICAgICAgICAgICAgICAweDQzN0UKKworLyogSURzIGluIHRoZSBDaGFwdGVyVHJhY2sgbWFzdGVyICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSVFJBQ0tOVU1CRVIgICAgICAgICAweDg5CisKKy8qCisgKiBNYXRyb3NrYSBDb2RlYyBJRHMuIFN0cmluZ3MuCisgKi8KKworI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fVkZXX0ZPVVJDQyAgICJWX01TL1ZGVy9GT1VSQ0MiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19VTkNPTVBSRVNTRUQgIlZfVU5DT01QUkVTU0VEIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFRzRfU1AgICAgICJWX01QRUc0L0lTTy9TUCIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX01QRUc0X0FTUCAgICAiVl9NUEVHNC9JU08vQVNQIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFRzRfQVAgICAgICJWX01QRUc0L0lTTy9BUCIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX01QRUc0X0FWQyAgICAiVl9NUEVHNC9JU08vQVZDIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVNNUEVHNFYzICAgICJWX01QRUc0L01TL1YzIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFRzEgICAgICAgICJWX01QRUcxIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFRzIgICAgICAgICJWX01QRUcyIgorLyogRklYTUU6IG5vdCAoeWV0KSBpbiB0aGUgc3BlYyEgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX01KUEVHICAgICAgICAiVl9NSlBFRyIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1JFQUxWSURFTzEgICAiVl9SRUFML1JWMTAiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19SRUFMVklERU8yICAgIlZfUkVBTC9SVjIwIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fUkVBTFZJREVPMyAgICJWX1JFQUwvUlYzMCIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1JFQUxWSURFTzQgICAiVl9SRUFML1JWNDAiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19USEVPUkEgICAgICAgIlZfVEhFT1JBIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fUVVJQ0tUSU1FICAgICJWX1FVSUNLVElNRSIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1NOT1cgICAgICAgICAiVl9TTk9XIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fRElSQUMgICAgICAgICJWX0RJUkFDIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fVlA4ICAgICAgICAgICJWX1ZQOCIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1ZQOSAgICAgICAgICAiVl9WUDkiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19BVjEgICAgICAgICAgIlZfQVYxIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFR0hfSEVWQyAgICJWX01QRUdIL0lTTy9IRVZDIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fUFJPUkVTICAgICAgICJWX1BST1JFUyIKKworI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fTVBFRzFfTDEgICAgICAgIkFfTVBFRy9MMSIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX01QRUcxX0wyICAgICAgICJBX01QRUcvTDIiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19NUEVHMV9MMyAgICAgICAiQV9NUEVHL0wzIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUENNX0lOVF9CRSAgICAgIkFfUENNL0lOVC9CSUciCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19QQ01fSU5UX0xFICAgICAiQV9QQ00vSU5UL0xJVCIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1BDTV9GTE9BVCAgICAgICJBX1BDTS9GTE9BVC9JRUVFIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fQUMzICAgICAgICAgICAgIkFfQUMzIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fQUMzX0JTSUQ5ICAgICAgIkFfQUMzL0JTSUQ5IgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fQUMzX0JTSUQxMCAgICAgIkFfQUMzL0JTSUQxMCIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX0VBQzMgICAgICAgICAgICJBX0VBQzMiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19UUlVFSEQgICAgICAgICAiQV9UUlVFSEQiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19EVFMgICAgICAgICAgICAiQV9EVFMiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19WT1JCSVMgICAgICAgICAiQV9WT1JCSVMiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19GTEFDICAgICAgICAgICAiQV9GTEFDIgorLyogRklYTUU6IG5vdCB5ZXQgaW4gdGhlIHNwZWMgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1NQRUVYICAgICAgICAgICJBX1NQRUVYIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fQUNNICAgICAgICAgICAgIkFfTVMvQUNNIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fVFRBICAgICAgICAgICAgIkFfVFRBMSIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1dBVlBBQ0s0ICAgICAgICJBX1dBVlBBQ0s0IgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUkVBTF8xNF80ICAgICAgIkFfUkVBTC8xNF80IgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUkVBTF8yOF84ICAgICAgIkFfUkVBTC8yOF84IgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUkVBTF9DT09LICAgICAgIkFfUkVBTC9DT09LIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUkVBTF9TSVBSICAgICAgIkFfUkVBTC9TSVBSIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUkVBTF9SQUxGICAgICAgIkFfUkVBTC9SQUxGIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUkVBTF9BVFJDICAgICAgIkFfUkVBTC9BVFJDIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fQUFDICAgICAgICAgICAgIkFfQUFDIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fQUFDX01QRUcyICAgICAgIkFfQUFDL01QRUcyLyIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX0FBQ19NUEVHNCAgICAgICJBX0FBQy9NUEVHNC8iCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19RVUlDS1RJTUVfUURNQyAiQV9RVUlDS1RJTUUvUURNQyIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1FVSUNLVElNRV9RRE0yICJBX1FVSUNLVElNRS9RRE0yIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fT1BVUyAgICAgICAgICAgIkFfT1BVUyIKKy8qIFVuZGVmaW5lZCBmb3Igbm93OgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fTVBDICAgICAgICAgICAgIkFfTVBDIgorKi8KKworI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfQVNDSUkgICAgICJTX1RFWFQvQVNDSUkiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9TVUJUSVRMRV9VVEY4ICAgICAgIlNfVEVYVC9VVEY4IgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfU1NBICAgICAgICJTX1RFWFQvU1NBIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfQVNTICAgICAgICJTX1RFWFQvQVNTIiAKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX1NVQlRJVExFX1VTRiAgICAgICAiU19URVhUL1VTRiIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX1NVQlRJVExFX1ZPQlNVQiAgICAiU19WT0JTVUIiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9TVUJUSVRMRV9IRE1WUEdTICAgIlNfSERNVi9QR1MiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9TVUJUSVRMRV9CTVAgICAgICAgIlNfSU1BR0UvQk1QIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfS0FURSAgICAgICJTX0tBVEUiCisKKy8qCisgKiBNYXRyb3NrYSB0YWdzLiBTdHJpbmdzLgorICovCisKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9USVRMRSAgICAiVElUTEUiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfQVVUSE9SICAgIkFVVEhPUiIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9BUlRJU1QgICAiQVJUSVNUIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0FMQlVNICAgICJBTEJVTSIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9DT01NRU5UUyAiQ09NTUVOVFMiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfQ09NTUVOVCAgIkNPTU1FTlQiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfQklUU1BTICAgIkJJVFNQUyIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9CUFMgICAgICAiQlBTIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0VOQ09ERVIgICJFTkNPREVSIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0lTUkMgICAgICJJU1JDIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0NPUFlSSUdIVCAiQ09QWVJJR0hUIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0JQTSAgICAgICAiQlBNIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX1RFUk1TX09GX1VTRSAiVEVSTVNfT0ZfVVNFIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0RBVEUgICAgICAiREFURSIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9DT01QT1NFUiAgIkNPTVBPU0VSIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0xFQURfUEVSRk9STUVSICAiTEVBRF9QRVJGT01FUiIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9HRU5SRSAgICAgIkdFTlJFIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX1RPVEFMX1BBUlRTICJUT1RBTF9QQVJUUyIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9QQVJUX05VTUJFUiAiUEFSVF9OVU1CRVIiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfU1VCVElUTEUgIlNVQlRJVExFIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0FDQ09NUEFOSU1FTlQgIkFDQ09NUEFOSU1FTlQiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfTFlSSUNTICJMWVJJQ1MiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfQ09ORFVDVE9SICJDT05EVUNUT1IiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfRU5DT0RFRF9CWSAiRU5DT0RFRF9CWSIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9ERVNDUklQVElPTiAiREVTQ1JJUFRJT04iCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfS0VZV09SRFMgIktFWVdPUkRTIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0RBVEVfUkVMRUFTRUQgIkRBVEVfUkVMRUFTRUQiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfREFURV9SRUNPUkRFRCAiREFURV9SRUNPUkRFRCIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9EQVRFX0VOQ09ERUQgIkRBVEVfRU5DT0RFRCIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9EQVRFX1RBR0dFRCAiREFURV9UQUdHRUQiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfREFURV9ESUdJVElaRUQgIkRBVEVfRElHSVRJWkVEIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0RBVEVfV1JJVFRFTiAiREFURV9XUklUVEVOIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0RBVEVfUFVSQ0hBU0VEICJEQVRFX1BVUkNIQVNFRCIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9SRUNPUkRJTkdfTE9DQVRJT04gIlJFQ09SRElOR19MT0NBVElPTiIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9QUk9EVUNUSU9OX0NPUFlSSUdIVCAiUFJPRFVDVElPTl9DT1BZUklHSFQiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfTElDRU5TRSAiTElDRU5TRSIKKworLyoKKyAqIFRPRE86IGFkZCB0aGlzIHRhZyAmIG1hcHBpbmdzCisgKiAiUkVQTEFZR0FJTl9HQUlOIiAtPiBHU1RfVEFHXypfR0FJTiAgIHNlZSBodHRwOi8vcmVwbGF5Z2Fpbi5oeWRyb2dlbmF1ZGlvLm9yZy9yZ19kYXRhX2Zvcm1hdC5odG1sCisgKiAiUkVQTEFZR0FJTl9QRUFLIiAtPiBHU1RfVEFHXypfUEVBSyAgIHNlZSBodHRwOi8vcmVwbGF5Z2Fpbi5oeWRyb2dlbmF1ZGlvLm9yZy9wZWFrX2RhdGFfZm9ybWF0Lmh0bWwKKyAqIGJvdGggYXJlIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0ICh0cmFjaywgYWxidW0/KQorICoKKyAqICJUT1RBTF9QQVJUUyIgLT4gR1NUX1RBR19UUkFDS19DT1VOVCAgICBkZXBlbmRpbmcgb24gdGFyZ2V0CisgKiAiUEFSVF9OVU1CRVIiIC0+IEdTVF9UQUdfVFJBQ0tfTlVNQkVSICAgZGVwZW5kaW5nIG9uIHRhcmdldAorICoKKyAqICJTT1JUX1dJVEgiIC0+IG5lc3RlZCBpbiBvdGhlciBlbGVtZW50cywgR1NUX1RBR19USVRMRV9TT1JUTkFNRSwgZXRjCisgKgorICogVE9ETzogbWF5YmUgYWRkIGN1c3RvbSBnc3RyZWFtZXIgdGFncyBmb3Igb3RoZXIgc3RhbmRhcmQgbWF0cm9za2EgdGFncywKKyAqIHNlZSBodHRwOi8vbWF0cm9za2Eub3JnL3RlY2huaWNhbC9zcGVjcy90YWdnaW5nL2luZGV4Lmh0bWwKKyAqCisgKiBUT0RPOiBoYW5kbGUgdGFnIHRhcmdldHMgYW5kIG5lc3RpbmcgY29ycmVjdGx5CisgKi8KKworLyoKKyAqIEVudW1lcmF0aW9ucyBmb3IgdmFyaW91cyB0eXBlcyAobWFwcGluZyBmcm9tIGJpbmFyeQorICogdmFsdWUgdG8gd2hhdCBpdCBhY3R1YWxseSBtZWFucykuCisgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfVklERU8gICAgPSAweDEsCisgIEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX0FVRElPICAgID0gMHgyLAorICBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9DT01QTEVYICA9IDB4MywKKyAgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfTE9HTyAgICAgPSAweDEwLAorICBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9TVUJUSVRMRSA9IDB4MTEsCisgIEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX0JVVFRPTlMgID0gMHgxMiwKKyAgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQ09OVFJPTCAgPSAweDIwLAorfSBHc3RNYXRyb3NrYVRyYWNrVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX01BVFJPU0tBX0FTUEVDVF9SQVRJT19NT0RFX0ZSRUUgID0gMHgwLAorICBHU1RfTUFUUk9TS0FfQVNQRUNUX1JBVElPX01PREVfS0VFUCAgPSAweDEsCisgIEdTVF9NQVRST1NLQV9BU1BFQ1RfUkFUSU9fTU9ERV9GSVhFRCA9IDB4MiwKK30gR3N0TWF0cm9za2FBc3BlY3RSYXRpb01vZGU7CisKKy8qCisgKiBUaGVzZSBhcmVuJ3QgaW4gYW55IHdheSAibWF0cm9za2EtZm9ybSIgdGhpbmdzLAorICogaXQncyBqdXN0IHNvbWV0aGluZyBJIHVzZSBpbiB0aGUgbXV4ZXIvZGVtdXhlci4KKyAqLworCit0eXBlZGVmIGVudW0geworICBHU1RfTUFUUk9TS0FfVFJBQ0tfRU5BQkxFRCA9ICgxPDwwKSwKKyAgR1NUX01BVFJPU0tBX1RSQUNLX0RFRkFVTFQgPSAoMTw8MSksCisgIEdTVF9NQVRST1NLQV9UUkFDS19MQUNJTkcgID0gKDE8PDIpLAorICBHU1RfTUFUUk9TS0FfVFJBQ0tfRk9SQ0VEICA9ICgxPDwzKSwKKyAgR1NUX01BVFJPU0tBX1RSQUNLX1NISUZUICAgPSAoMTw8MTYpCit9IEdzdE1hdHJvc2thVHJhY2tGbGFnczsKKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX01BVFJPU0tBX1ZJREVPVFJBQ0tfSU5URVJMQUNFRCA9IChHU1RfTUFUUk9TS0FfVFJBQ0tfU0hJRlQ8PDApCit9IEdzdE1hdHJvc2thVmlkZW9UcmFja0ZsYWdzOworCit0eXBlZGVmIGVudW0geworICBHU1RfTUFUUk9TS0FfU1RFUkVPX01PREVfU0JTX0xSICAgICAgPSAweDEsCisgIEdTVF9NQVRST1NLQV9TVEVSRU9fTU9ERV9UQl9STCAgICAgICA9IDB4MiwKKyAgR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX1RCX0xSICAgICAgID0gMHgzLAorICBHU1RfTUFUUk9TS0FfU1RFUkVPX01PREVfQ0hFQ0tFUl9STCAgPSAweDQsCisgIEdTVF9NQVRST1NLQV9TVEVSRU9fTU9ERV9DSEVDS0VSX0xSICA9IDB4NSwKKyAgR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX1NCU19STCAgICAgID0gMHg5LAorICBHU1RfTUFUUk9TS0FfU1RFUkVPX01PREVfRkJGX0xSICAgICAgPSAweEQsCisgIEdTVF9NQVRST1NLQV9TVEVSRU9fTU9ERV9GQkZfUkwgICAgICA9IDB4RQorfSBHc3RNYXRyb3NrYVN0ZXJlb01vZGU7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RNYXRyb3NrYVRyYWNrQ29udGV4dCBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dDsKKworLyogVE9ETzogY2hlY2sgaWYgYWxsIGZpZWxkcyBhcmUgdXNlZCAqLworc3RydWN0IF9Hc3RNYXRyb3NrYVRyYWNrQ29udGV4dCB7CisgIEdzdFBhZCAgICAgICAqcGFkOworICBHc3RDYXBzICAgICAgKmNhcHM7CisgIGd1aW50ICAgICAgICAgaW5kZXg7CisgIC8qIHJldmVyc2UgcGxheWJhY2sgKi8KKyAgR3N0Q2xvY2tUaW1lICBmcm9tX3RpbWU7CisgIGdpbnQ2NCAgICAgICAgICAgICAgICAgICBmcm9tX29mZnNldDsKKyAgZ2ludDY0ICAgICAgICAgICAgICAgICAgIHRvX29mZnNldDsKKworICBHQXJyYXkgICAgICAgKmluZGV4X3RhYmxlOworCisgIGdpbnQgICAgICAgICAgaW5kZXhfd3JpdGVyX2lkOworCisgIC8qIHNvbWUgb2Z0ZW4tdXNlZCBpbmZvICovCisgIGdjaGFyICAgICAgICAqY29kZWNfaWQsICpjb2RlY19uYW1lLCAqbmFtZSwgKmxhbmd1YWdlOworICBncG9pbnRlciAgICAgIGNvZGVjX3ByaXY7CisgIGdzaXplICAgICAgICAgY29kZWNfcHJpdl9zaXplOworICBncG9pbnRlciAgICAgIGNvZGVjX3N0YXRlOworICBnc2l6ZSAgICAgICAgIGNvZGVjX3N0YXRlX3NpemU7CisgIEdzdE1hdHJvc2thVHJhY2tUeXBlIHR5cGU7CisgIGd1aW50NjQgICAgICAgdWlkLCBudW07CisgIEdzdE1hdHJvc2thVHJhY2tGbGFncyBmbGFnczsKKyAgZ3VpbnQ2NCAgICAgICBkZWZhdWx0X2R1cmF0aW9uOworICBndWludDY0ICAgICAgIHBvczsKKyAgZ2RvdWJsZSAgICAgICB0aW1lY29kZXNjYWxlOworICBndWludDY0ICAgICAgIHNlZWtfcHJlcm9sbDsKKyAgZ3VpbnQ2NCAgICAgICBjb2RlY19kZWxheTsKKworICBnYm9vbGVhbiAgICAgIHNldF9kaXNjb250OyAvKiBUUlVFID0gc2V0IERJU0NPTlQgZmxhZyBvbiBuZXh0IGJ1ZmZlciAqLworCisgIC8qIFN0cmVhbSBoZWFkZXIgYnVmZmVyLCB0byBwdXQgaW50byBjYXBzIGFuZCBzZW5kIGJlZm9yZSBhbnkgb3RoZXIgYnVmZmVycyAqLworICBHc3RCdWZmZXJMaXN0ICogc3RyZWFtX2hlYWRlcnM7CisgIGdib29sZWFuICAgICAgICBzZW5kX3N0cmVhbV9oZWFkZXJzOworCisgIC8qIFNwZWNpYWwgZmxhZyBmb3IgVm9iU3ViLCBmb3Igd2hpY2ggd2UgaGF2ZSB0byBzZW5kIGNvbG91ciB0YWJsZSBpbmZvCisgICAqIChpZiBhdmFpbGFibGUpIGZpcnN0IGJlZm9yZSBzZW5kaW5nIGFueSBkYXRhLCBhbmQganVzdCB0ZXN0aW5nCisgICAqIGZvciB0aW1lID09IDAgaXMgbm90IGVub3VnaCB0byBkZXRlY3QgdGhhdC4gVXNlZCBieSBkZW11eGVyICovCisgIGdib29sZWFuICAgICAgc2VuZF9kdmRfZXZlbnQ7CisKKyAgLyogU3BlY2lhbCBjb3VudGVyIGZvciBtdXhlciB0byBza2lwIHRoZSBmaXJzdCBOIHZvcmJpcy90aGVvcmEgaGVhZGVycyAtCisgICAqIHRoZXkgYXJlIHB1dCBpbnRvIGNvZGVjIHByaXZhdGUgZGF0YSwgbm90IG11eGVkIGludG8gdGhlIHN0cmVhbSAqLworICBndWludCAgICAgICAgIHhpcGhfaGVhZGVyc190b19za2lwOworCisgIC8qIFVzZWQgZm9yIHBvc3Rwcm9jZXNzaW5nIGEgZnJhbWUgYmVmb3JlIGl0IGlzIHB1c2hlZCBmcm9tIHRoZSBkZW11eGVyICovCisgIEdzdEZsb3dSZXR1cm4gKCpwb3N0cHJvY2Vzc19mcmFtZSkgKEdzdEVsZW1lbnQgKmVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjb250ZXh0LAorCQkJCSAgICAgIEdzdEJ1ZmZlciAqKmJ1ZmZlcik7CisKKyAgLyogTGlzdCBvZiB0YWdzIGZvciB0aGlzIHN0cmVhbSAqLworICBHc3RUYWdMaXN0ICAgKnRhZ3M7CisgIC8qIFRhZ3MgY2hhbmdlZCBhbmQgc2hvdWxkIGJlIHB1c2hlZCBhZ2FpbiAqLworICBnYm9vbGVhbiAgICAgIHRhZ3NfY2hhbmdlZDsKKworICAvKiBBIEdBcnJheSBvZiBHc3RNYXRyb3NrYVRyYWNrRW5jb2Rpbmcgc3RydWN0dXJlcyB3aGljaCBjb250YWluIHRoZQorICAgKiBlbmNvZGluZyAoY29tcHJlc3Npb24vZW5jcnlwdGlvbikgc2V0dGluZ3MgZm9yIHRoaXMgdHJhY2ssIGlmIGFueSAqLworICBHQXJyYXkgICAgICAgKmVuY29kaW5nczsKKworICAvKiBXaGV0aGVyIHRoZSBzdHJlYW0gaXMgRU9TICovCisgIGdib29sZWFuICAgICAgZW9zOworCisgIC8qIGFueSBhbGlnbm1lbnQgd2UgbmVlZCBvdXIgb3V0cHV0IGJ1ZmZlcnMgdG8gaGF2ZSAqLworICBnaW50ICAgICAgICAgIGFsaWdubWVudDsKKyAgCisgIC8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggVkZXIGZpbGVzLCB3aGVyZSB0aW1lc3RhbXAgcmVwcmVzZW50cyBEVFMgKi8KKyAgZ2Jvb2xlYW4gICAgICBkdHNfb25seTsKKyAgCisgIC8qIGluZGljYXRlIHRoYXQgdGhlIHRyYWNrIGlzIHJhdyAoanBlZyxyYXcgdmFyaWFudHMpIGFuZCBzbyBwdHM9ZHRzICovCisgIGdib29sZWFuCQlpbnRyYV9vbmx5OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQgeworICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCBwYXJlbnQ7CisKKyAgZ3VpbnQgICAgICAgICBwaXhlbF93aWR0aCwgcGl4ZWxfaGVpZ2h0OworICBndWludCAgICAgICAgIGRpc3BsYXlfd2lkdGgsIGRpc3BsYXlfaGVpZ2h0OworICBnZG91YmxlICAgICAgIGRlZmF1bHRfZnBzOworICBHc3RNYXRyb3NrYUFzcGVjdFJhdGlvTW9kZSBhc3JfbW9kZTsKKyAgZ3VpbnQzMiAgICAgICBmb3VyY2M7CisKKyAgR3N0VmlkZW9NdWx0aXZpZXdNb2RlIG11bHRpdmlld19tb2RlOworICBHc3RWaWRlb011bHRpdmlld0ZsYWdzIG11bHRpdmlld19mbGFnczsKKworICAvKiBRb1MgKi8KKyAgR3N0Q2xvY2tUaW1lICBlYXJsaWVzdF90aW1lOworCisgIEdzdEJ1ZmZlciAgICAgKmRpcmFjX3VuaXQ7CisgIEdzdFZpZGVvQ29sb3JpbWV0cnkgY29sb3JpbWV0cnk7Cit9IEdzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RNYXRyb3NrYVRyYWNrQXVkaW9Db250ZXh0IHsKKyAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgcGFyZW50OworCisgIGd1aW50ICAgICAgICAgc2FtcGxlcmF0ZSwgY2hhbm5lbHMsIGJpdGRlcHRoOworCisgIGd1aW50MzIgICAgICAgd3Zwa19ibG9ja19pbmRleDsKK30gR3N0TWF0cm9za2FUcmFja0F1ZGlvQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE1hdHJvc2thVHJhY2tTdWJ0aXRsZUNvbnRleHQgeworICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCBwYXJlbnQ7CisKKyAgZ2Jvb2xlYW4gICAgY2hlY2tfdXRmODsgICAgIC8qIGJ1ZmZlcnMgc2hvdWxkIGJlIHZhbGlkIFVURi04ICovCisgIGdib29sZWFuICAgIGNoZWNrX21hcmt1cDsgICAvKiBjaGVjayBpZiBidWZmZXJzIGNvbnRhaW4gbWFya3VwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvciBwbGFpbnRleHQgYW5kIGVzY2FwZSBjaGFyYWN0ZXJzICovCisgIGdib29sZWFuICAgIGludmFsaWRfdXRmODsgICAvKiB3b3JrIGFyb3VuZCBicm9rZW4gZmlsZXMgICAgICAqLworICBnYm9vbGVhbiAgICBzZWVuX21hcmt1cF90YWc7ICAvKiBtYXJrdXAgZm91bmQgaW4gdGV4dCAqLworfSBHc3RNYXRyb3NrYVRyYWNrU3VidGl0bGVDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBfR3N0TWF0cm9za2FJbmRleCB7CisgIGd1aW50NjQgICAgICAgIHBvczsgICAgICAvKiBvZiB0aGUgY29ycmVzcG9uZGluZyAqY2x1c3RlciohICovCisgIEdzdENsb2NrVGltZSAgIHRpbWU7ICAgICAvKiBpbiBuYW5vc2Vjb25kcyAqLworICBndWludDMyICAgICAgICBibG9jazsgICAgLyogbnVtYmVyIG9mIHRoZSBibG9jayBpbiB0aGUgY2x1c3RlciAqLworICBndWludDE2ICAgICAgICB0cmFjazsgICAgLyogcmVmZXJlbmNlIHRvICdudW0nICovCit9IEdzdE1hdHJvc2thSW5kZXg7CisKK3R5cGVkZWYgc3RydWN0IF9XYXZwYWNrNEhlYWRlciB7CisgIGd1Y2hhciAgY2tfaWQgWzRdOyAgICAgLyogInd2cGsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBndWludDMyIGNrX3NpemU7ICAgICAgIC8qIHNpemUgb2YgZW50aXJlIGZyYW1lIChtaW51cyA4LCBvZiBjb3Vyc2UpICAgICAgKi8KKyAgZ3VpbnQxNiB2ZXJzaW9uOyAgICAgICAvKiAweDQwMyBmb3Igbm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGd1aW50OCAgdHJhY2tfbm87ICAgICAgLyogdHJhY2sgbnVtYmVyICgwIGlmIG5vdCB1c2VkLCBsaWtlIG5vdykgICAgICAgICAqLworICBndWludDggIGluZGV4X25vOyAgICAgIC8qIHJlbWVtYmVyIHRoZXNlPyAoMCBpZiBub3QgdXNlZCwgbGlrZSBub3cpICAgICAgKi8KKyAgZ3VpbnQzMiB0b3RhbF9zYW1wbGVzOyAvKiBmb3IgZW50aXJlIGZpbGUgKC0xIGlmIHVua25vd24pICAgICAgICAgICAgICAgICovCisgIGd1aW50MzIgYmxvY2tfaW5kZXg7ICAgLyogaW5kZXggb2YgZmlyc3Qgc2FtcGxlIGluIGJsb2NrICh0byBmaWxlIGJlZ2luKSAqLworICBndWludDMyIGJsb2NrX3NhbXBsZXM7IC8qICMgc2FtcGxlcyBpbiB0aGlzIGJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgZ3VpbnQzMiBmbGFnczsgICAgICAgICAvKiB2YXJpb3VzIGZsYWdzIGZvciBpZCBhbmQgZGVjb2RpbmcgICAgICAgICAgICAgICovCisgIGd1aW50MzIgY3JjOyAgICAgICAgICAgLyogY3JjIGZvciBhY3R1YWwgZGVjb2RlZCBkYXRhICAgICAgICAgICAgICAgICAgICAqLworfSBXYXZwYWNrNEhlYWRlcjsKKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX01BVFJPU0tBX1RSQUNLX0VOQ09ESU5HX1NDT1BFX0ZSQU1FID0gKDE8PDApLAorICBHU1RfTUFUUk9TS0FfVFJBQ0tfRU5DT0RJTkdfU0NPUEVfQ09ERUNfREFUQSA9ICgxPDwxKSwKKyAgR1NUX01BVFJPU0tBX1RSQUNLX0VOQ09ESU5HX1NDT1BFX05FWFRfQ09OVEVOVF9FTkNPRElORyA9ICgxPDwyKQorfSBHc3RNYXRyb3NrYVRyYWNrRW5jb2RpbmdTY29wZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX01BVFJPU0tBX1RSQUNLX0NPTVBSRVNTSU9OX0FMR09SSVRITV9aTElCID0gMCwKKyAgR1NUX01BVFJPU0tBX1RSQUNLX0NPTVBSRVNTSU9OX0FMR09SSVRITV9CWkxJQiA9IDEsCisgIEdTVF9NQVRST1NLQV9UUkFDS19DT01QUkVTU0lPTl9BTEdPUklUSE1fTFpPMVggPSAyLAorICBHU1RfTUFUUk9TS0FfVFJBQ0tfQ09NUFJFU1NJT05fQUxHT1JJVEhNX0hFQURFUlNUUklQID0gMworfSBHc3RNYXRyb3NrYVRyYWNrQ29tcHJlc3Npb25BbGdvcml0aG07CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RNYXRyb3NrYVRyYWNrRW5jb2RpbmcgeworICBndWludCAgIG9yZGVyOworICBndWludCAgIHNjb3BlICAgICA6IDM7CisgIGd1aW50ICAgdHlwZSAgICAgIDogMTsKKyAgZ3VpbnQgICBjb21wX2FsZ28gOiAyOworICBndWludDggKmNvbXBfc2V0dGluZ3M7CisgIGd1aW50ICAgY29tcF9zZXR0aW5nc19sZW5ndGg7Cit9IEdzdE1hdHJvc2thVHJhY2tFbmNvZGluZzsKKworZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfdmlkZW9fY29udGV4dCAgICAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiogcF9jb250ZXh0KTsKK2dib29sZWFuIGdzdF9tYXRyb3NrYV90cmFja19pbml0X2F1ZGlvX2NvbnRleHQgICAgKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICoqIHBfY29udGV4dCk7CitnYm9vbGVhbiBnc3RfbWF0cm9za2FfdHJhY2tfaW5pdF9zdWJ0aXRsZV9jb250ZXh0IChHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqKiBwX2NvbnRleHQpOworCit2b2lkIGdzdF9tYXRyb3NrYV9yZWdpc3Rlcl90YWdzICh2b2lkKTsKKworR3N0QnVmZmVyTGlzdCAqIGdzdF9tYXRyb3NrYV9wYXJzZV94aXBoX3N0cmVhbV9oZWFkZXJzICAoZ3BvaW50ZXIgY29kZWNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzaXplIGNvZGVjX2RhdGFfc2l6ZSk7CisKK0dzdEJ1ZmZlckxpc3QgKiBnc3RfbWF0cm9za2FfcGFyc2Vfc3BlZXhfc3RyZWFtX2hlYWRlcnMgKGdwb2ludGVyIGNvZGVjX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc2l6ZSBjb2RlY19kYXRhX3NpemUpOworCitHc3RCdWZmZXJMaXN0ICogZ3N0X21hdHJvc2thX3BhcnNlX29wdXNfc3RyZWFtX2hlYWRlcnMgIChncG9pbnRlciBjb2RlY19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NpemUgY29kZWNfZGF0YV9zaXplKTsKKworR3N0QnVmZmVyTGlzdCAqIGdzdF9tYXRyb3NrYV9wYXJzZV9mbGFjX3N0cmVhbV9oZWFkZXJzICAoZ3BvaW50ZXIgY29kZWNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzaXplIGNvZGVjX2RhdGFfc2l6ZSk7Cit2b2lkIGdzdF9tYXRyb3NrYV90cmFja19mcmVlIChHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIHRyYWNrKTsKK0dzdENsb2NrVGltZSBnc3RfbWF0cm9za2FfdHJhY2tfZ2V0X2J1ZmZlcl90aW1lc3RhbXAgKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICogdHJhY2ssIEdzdEJ1ZmZlciAqYnVmKTsKKworI2VuZGlmIC8qIF9fR1NUX01BVFJPU0tBX0lEU19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYyBiL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDA5ZTJlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jCkBAIC0wLDAgKzEsNDA2NyBAQAorLyogR1N0cmVhbWVyIE1hdHJvc2thIG11eGVyL2RlbXV4ZXIKKyAqIChjKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqIChjKSAyMDA1IE1pY2hhbCBCZW5lcyA8bWljaGFsLmJlbmVzQHhlcmlzLmN6PgorICogKGMpIDIwMDggU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKiAoYykgMjAxMSBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBtYXRyb3NrYS1tdXguYzogbWF0cm9za2EgZmlsZS9zdHJlYW0gbXV4ZXIKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKiBUT0RPOiAtIGNoZWNrIGV2ZXJ5d2hlcmUgdGhhdCB3ZSBkb24ndCB3cml0ZSBpbnZhbGlkIHZhbHVlcworICogICAgICAgLSBtYWtlIHN1cmUgdGltZXN0YW1wcyBhcmUgY29ycmVjdGx5IHNjYWxlZCBldmVyeXdoZXJlCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtbWF0cm9za2FtdXgKKyAqCisgKiBtYXRyb3NrYW11eCBtdXhlcyBkaWZmZXJlbnQgaW5wdXQgc3RyZWFtcyBpbnRvIGEgTWF0cm9za2EgZmlsZS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgZmlsZXNyYyBsb2NhdGlvbj0vcGF0aC90by9tcDMgISBtcGVnYXVkaW9wYXJzZSAhIG1hdHJvc2thbXV4IG5hbWU9bXV4ICEgZmlsZXNpbmsgbG9jYXRpb249dGVzdC5ta3YgIGZpbGVzcmMgbG9jYXRpb249L3BhdGgvdG8vdGhlb3JhLm9nZyAhIG9nZ2RlbXV4ICEgdGhlb3JhcGFyc2UgISBtdXguCisgKiBdfCBUaGlzIHBpcGVsaW5lIG11eGVzIGFuIE1QMyBmaWxlIGFuZCBhIE9nZyBUaGVvcmEgdmlkZW8gaW50byBhIE1hdHJvc2thIGZpbGUuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgYXVkaW90ZXN0c3JjIG51bS1idWZmZXJzPTEwMCAhIGF1ZGlvY29udmVydCAhIHZvcmJpc2VuYyAhIG1hdHJvc2thbXV4ICEgZmlsZXNpbmsgbG9jYXRpb249dGVzdC5ta2EKKyAqIF18IFRoaXMgcGlwZWxpbmUgbXV4ZXMgYSA0NDBIeiBzaW5lIHdhdmUgZW5jb2RlZCB3aXRoIHRoZSBWb3JiaXMgY29kZWMgaW50byBhIE1hdHJvc2thIGZpbGUuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L3JpZmYvcmlmZi1tZWRpYS5oPgorI2luY2x1ZGUgPGdzdC90YWcvdGFnLmg+CisjaW5jbHVkZSA8Z3N0L3BidXRpbHMvY29kZWMtdXRpbHMuaD4KKworI2luY2x1ZGUgIm1hdHJvc2thLW11eC5oIgorI2luY2x1ZGUgIm1hdHJvc2thLWlkcy5oIgorCisjZGVmaW5lIEdTVF9NQVRST1NLQV9NVVhfQ0hBUExBTkcgInVuZCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAobWF0cm9za2FtdXhfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgbWF0cm9za2FtdXhfZGVidWcKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfV1JJVElOR19BUFAsCisgIFBST1BfRE9DVFlQRV9WRVJTSU9OLAorICBQUk9QX01JTl9JTkRFWF9JTlRFUlZBTCwKKyAgUFJPUF9TVFJFQU1BQkxFLAorICBQUk9QX1RJTUVDT0RFU0NBTEUsCisgIFBST1BfTUlOX0NMVVNURVJfRFVSQVRJT04sCisgIFBST1BfTUFYX0NMVVNURVJfRFVSQVRJT04KK307CisKKyNkZWZpbmUgIERFRkFVTFRfRE9DVFlQRV9WRVJTSU9OICAgICAgICAgMgorI2RlZmluZSAgREVGQVVMVF9XUklUSU5HX0FQUCAgICAgICAgICAgICAiR1N0cmVhbWVyIE1hdHJvc2thIG11eGVyIgorI2RlZmluZSAgREVGQVVMVF9NSU5fSU5ERVhfSU5URVJWQUwgICAgICAwCisjZGVmaW5lICBERUZBVUxUX1NUUkVBTUFCTEUgICAgICAgICAgICAgIEZBTFNFCisjZGVmaW5lICBERUZBVUxUX1RJTUVDT0RFU0NBTEUgICAgICAgICAgIEdTVF9NU0VDT05ECisjZGVmaW5lICBERUZBVUxUX01JTl9DTFVTVEVSX0RVUkFUSU9OICAgIDUwMCAqIEdTVF9NU0VDT05ECisjZGVmaW5lICBERUZBVUxUX01BWF9DTFVTVEVSX0RVUkFUSU9OICAgIDY1NTM1ICogR1NUX01TRUNPTkQKKworLyogV0FWRUZPUk1BVEVYIGlzIGdzdF9yaWZmX3N0cmZfYXVkcyArIGFuIGV4dHJhIGd1aW50MTYgZXh0ZW5zaW9uIHNpemUgKi8KKyNkZWZpbmUgV0FWRUZPUk1BVEVYX1NJWkUgICgyICsgc2l6ZW9mIChnc3RfcmlmZl9zdHJmX2F1ZHMpKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtbWF0cm9za2E7IHZpZGVvL3gtbWF0cm9za2EtM2Q7IGF1ZGlvL3gtbWF0cm9za2EiKQorICAgICk7CisKKyNkZWZpbmUgQ09NTU9OX1ZJREVPX0NBUFMgXAorICAid2lkdGggPSAoaW50KSBbIDE2LCBNQVggXSwgIiBcCisgICJoZWlnaHQgPSAoaW50KSBbIDE2LCBNQVggXSAiCisKKy8qIEZJWE1FOgorICogKiByZXF1aXJlIGNvZGVjIGRhdGEsIGV0YyBhcyBuZWVkZWQKKyAqLworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgdmlkZW9zaW5rX3RlbXBsID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInZpZGVvXyV1IiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9SRVFVRVNULAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL21wZWcsICIKKyAgICAgICAgIm1wZWd2ZXJzaW9uID0gKGludCkgeyAxLCAyLCA0IH0sICIKKyAgICAgICAgInN5c3RlbXN0cmVhbSA9IChib29sZWFuKSBmYWxzZSwgIgorICAgICAgICBDT01NT05fVklERU9fQ0FQUyAiOyAiCisgICAgICAgICJ2aWRlby94LWgyNjQsIHN0cmVhbS1mb3JtYXQ9YXZjLCBhbGlnbm1lbnQ9YXUsICIKKyAgICAgICAgQ09NTU9OX1ZJREVPX0NBUFMgIjsgIgorICAgICAgICAidmlkZW8veC1oMjY1LCBzdHJlYW0tZm9ybWF0PWh2YzEsIGFsaWdubWVudD1hdSwgIgorICAgICAgICBDT01NT05fVklERU9fQ0FQUyAiOyAiCisgICAgICAgICJ2aWRlby94LWRpdngsICIKKyAgICAgICAgQ09NTU9OX1ZJREVPX0NBUFMgIjsgIgorICAgICAgICAidmlkZW8veC1odWZmeXV2LCAiCisgICAgICAgIENPTU1PTl9WSURFT19DQVBTICI7ICIKKyAgICAgICAgInZpZGVvL3gtZHYsICIKKyAgICAgICAgQ09NTU9OX1ZJREVPX0NBUFMgIjsgIgorICAgICAgICAidmlkZW8veC1oMjYzLCAiCisgICAgICAgIENPTU1PTl9WSURFT19DQVBTICI7ICIKKyAgICAgICAgInZpZGVvL3gtbXNtcGVnLCAiCisgICAgICAgIENPTU1PTl9WSURFT19DQVBTICI7ICIKKyAgICAgICAgImltYWdlL2pwZWcsICIKKyAgICAgICAgQ09NTU9OX1ZJREVPX0NBUFMgIjsgIgorICAgICAgICAidmlkZW8veC10aGVvcmE7ICIKKyAgICAgICAgInZpZGVvL3gtZGlyYWMsICIKKyAgICAgICAgQ09NTU9OX1ZJREVPX0NBUFMgIjsgIgorICAgICAgICAidmlkZW8veC1wbi1yZWFsdmlkZW8sICIKKyAgICAgICAgInJtdmVyc2lvbiA9IChpbnQpIFsxLCA0XSwgIgorICAgICAgICBDT01NT05fVklERU9fQ0FQUyAiOyAiCisgICAgICAgICJ2aWRlby94LXZwOCwgIgorICAgICAgICBDT01NT05fVklERU9fQ0FQUyAiOyAiCisgICAgICAgICJ2aWRlby94LXZwOSwgIgorICAgICAgICBDT01NT05fVklERU9fQ0FQUyAiOyAiCisgICAgICAgICJ2aWRlby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgeyBZVVkyLCBJNDIwLCBZVjEyLCBVWVZZLCBBWVVWLCBHUkFZOCwgQkdSLCBSR0IgfSwgIgorICAgICAgICBDT01NT05fVklERU9fQ0FQUyAiOyAiCisgICAgICAgICJ2aWRlby94LXByb3JlcywgIgorICAgICAgICBDT01NT05fVklERU9fQ0FQUyAiOyAiCisgICAgICAgICJ2aWRlby94LXdtdiwgIiAid212dmVyc2lvbiA9IChpbnQpIFsgMSwgMyBdLCAiIENPTU1PTl9WSURFT19DQVBTKQorICAgICk7CisKKyNkZWZpbmUgQ09NTU9OX0FVRElPX0NBUFMgXAorICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIE1BWCBdLCAiIFwKKyAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdIgorCisvKiBGSVhNRToKKyAqICogcmVxdWlyZSBjb2RlYyBkYXRhLCBldGMgYXMgbmVlZGVkCisgKi8KK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBhdWRpb3NpbmtfdGVtcGwgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgiYXVkaW9fJXUiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8vbXBlZywgIgorICAgICAgICAibXBlZ3ZlcnNpb24gPSAoaW50KSAxLCAiCisgICAgICAgICJsYXllciA9IChpbnQpIFsgMSwgMyBdLCAiCisgICAgICAgIENPTU1PTl9BVURJT19DQVBTICI7ICIKKyAgICAgICAgImF1ZGlvL21wZWcsICIKKyAgICAgICAgIm1wZWd2ZXJzaW9uID0gKGludCkgeyAyLCA0IH0sICIKKyAgICAgICAgInN0cmVhbS1mb3JtYXQgPSAoc3RyaW5nKSByYXcsICIKKyAgICAgICAgQ09NTU9OX0FVRElPX0NBUFMgIjsgIgorICAgICAgICAiYXVkaW8veC1hYzMsICIKKyAgICAgICAgQ09NTU9OX0FVRElPX0NBUFMgIjsgIgorICAgICAgICAiYXVkaW8veC1lYWMzLCAiCisgICAgICAgIENPTU1PTl9BVURJT19DQVBTICI7ICIKKyAgICAgICAgImF1ZGlvL3gtZHRzLCAiCisgICAgICAgIENPTU1PTl9BVURJT19DQVBTICI7ICIKKyAgICAgICAgImF1ZGlvL3gtdm9yYmlzLCAiCisgICAgICAgIENPTU1PTl9BVURJT19DQVBTICI7ICIKKyAgICAgICAgImF1ZGlvL3gtZmxhYywgIgorICAgICAgICBDT01NT05fQVVESU9fQ0FQUyAiOyAiCisgICAgICAgICJhdWRpby94LW9wdXM7ICIKKyAgICAgICAgImF1ZGlvL3gtc3BlZXgsICIKKyAgICAgICAgQ09NTU9OX0FVRElPX0NBUFMgIjsgIgorICAgICAgICAiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgVTgsIFMxNkJFLCBTMTZMRSwgUzI0QkUsIFMyNExFLCBTMzJCRSwgUzMyTEUsIEYzMkxFLCBGNjRMRSB9LCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICBDT01NT05fQVVESU9fQ0FQUyAiOyIKKyAgICAgICAgImF1ZGlvL3gtdHRhLCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIHsgOCwgMTYsIDI0IH0sICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgeyAxLCAyIH0sICIgInJhdGUgPSAoaW50KSBbIDgwMDAsIDk2MDAwIF07ICIKKyAgICAgICAgImF1ZGlvL3gtcG4tcmVhbGF1ZGlvLCAiCisgICAgICAgICJyYXZlcnNpb24gPSAoaW50KSB7IDEsIDIsIDggfSwgIiBDT01NT05fQVVESU9fQ0FQUyAiOyAiCisgICAgICAgICJhdWRpby94LXdtYSwgIiAid21hdmVyc2lvbiA9IChpbnQpIFsgMSwgMyBdLCAiCisgICAgICAgICJibG9ja19hbGlnbiA9IChpbnQpIFsgMCwgNjU1MzUgXSwgYml0cmF0ZSA9IChpbnQpIFsgMCwgNTI0Mjg4IF0sICIKKyAgICAgICAgQ09NTU9OX0FVRElPX0NBUFMgIjsiCisgICAgICAgICJhdWRpby94LWFsYXcsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgezEsIDJ9LCAiICJyYXRlID0gKGludCkgWyA4MDAwLCAxOTIwMDAgXTsgIgorICAgICAgICAiYXVkaW8veC1tdWxhdywgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSB7MSwgMn0sICIgInJhdGUgPSAoaW50KSBbIDgwMDAsIDE5MjAwMCBdOyAiCisgICAgICAgICJhdWRpby94LWFkcGNtLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKWR2aSwgIgorICAgICAgICAiYmxvY2tfYWxpZ24gPSAoaW50KVs2NCwgODE5Ml0sICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgeyAxLCAyIH0sICIgInJhdGUgPSAoaW50KSBbIDgwMDAsIDk2MDAwIF07ICIKKyAgICAgICAgImF1ZGlvL0c3MjIsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkxLCIgInJhdGUgPSAoaW50KTE2MDAwOyAiCisgICAgICAgICJhdWRpby94LWFkcGNtLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKWc3MjYsICIgImNoYW5uZWxzID0gKGludCkxLCIgInJhdGUgPSAoaW50KTgwMDA7ICIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHN1YnRpdGxlc2lua190ZW1wbCA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzdWJ0aXRsZV8ldSIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfUkVRVUVTVCwKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJzdWJ0aXRsZS94LWthdGU7ICIKKyAgICAgICAgInRleHQveC1yYXcsIGZvcm1hdD11dGY4OyBhcHBsaWNhdGlvbi94LXNzYTsgYXBwbGljYXRpb24veC1hc3M7ICIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtdXNmOyBzdWJwaWN0dXJlL3gtZHZkOyAiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXN1YnRpdGxlLXVua25vd24iKQorICAgICk7CisKK3N0YXRpYyBncG9pbnRlciBwYXJlbnRfY2xhc3M7ICAgLyogTlVMTCAqLworCisvKiBNYXRyb3NrYSBtdXhlciBkZXN0cnVjdG9yICovCitzdGF0aWMgdm9pZCBnc3RfbWF0cm9za2FfbXV4X2NsYXNzX2luaXQgKEdzdE1hdHJvc2thTXV4Q2xhc3MgKiBrbGFzcyk7CitzdGF0aWMgdm9pZCBnc3RfbWF0cm9za2FfbXV4X2luaXQgKEdzdE1hdHJvc2thTXV4ICogbXV4LCBncG9pbnRlciBnX2NsYXNzKTsKK3N0YXRpYyB2b2lkIGdzdF9tYXRyb3NrYV9tdXhfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCisvKiBQYWRzIGNvbGxlY3RlZCBjYWxsYmFjayAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X21hdHJvc2thX211eF9oYW5kbGVfYnVmZmVyIChHc3RDb2xsZWN0UGFkcyAqIHBhZHMsCisgICAgR3N0Q29sbGVjdERhdGEgKiBkYXRhLCBHc3RCdWZmZXIgKiBidWYsIGdwb2ludGVyIHVzZXJfZGF0YSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX211eF9oYW5kbGVfc2lua19ldmVudCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLAorICAgIEdzdENvbGxlY3REYXRhICogZGF0YSwgR3N0RXZlbnQgKiBldmVudCwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKworLyogcGFkIGZ1bmN0aW9ucyAqLworc3RhdGljIGdib29sZWFuIGdzdF9tYXRyb3NrYV9tdXhfaGFuZGxlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgR3N0UGFkICpnc3RfbWF0cm9za2FfbXV4X3JlcXVlc3RfbmV3X3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0UGFkVGVtcGxhdGUgKiB0ZW1wbCwgY29uc3QgZ2NoYXIgKiBuYW1lLCBjb25zdCBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgdm9pZCBnc3RfbWF0cm9za2FfbXV4X3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKTsKKworLyogZ3N0IGludGVybmFsIGNoYW5nZSBzdGF0ZSBoYW5kbGVyICovCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9tYXRyb3NrYV9tdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKKy8qIGdvYmplY3QgYmxhIGJsYSAqLworc3RhdGljIHZvaWQgZ3N0X21hdHJvc2thX211eF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfbWF0cm9za2FfbXV4X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworLyogcmVzZXQgbXV4ZXIgKi8KK3N0YXRpYyB2b2lkIGdzdF9tYXRyb3NrYV9tdXhfcmVzZXQgKEdzdEVsZW1lbnQgKiBlbGVtZW50KTsKKworLyogdWlkIGdlbmVyYXRpb24gKi8KK3N0YXRpYyBndWludDY0IGdzdF9tYXRyb3NrYV9tdXhfY3JlYXRlX3VpZCAoR3N0TWF0cm9za2FNdXggKiBtdXgpOworCitzdGF0aWMgZ2Jvb2xlYW4gdGhlb3JhX3N0cmVhbWhlYWRlcl90b19jb2RlY2RhdGEgKGNvbnN0IEdWYWx1ZSAqIHN0cmVhbWhlYWRlciwKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIGNvbnRleHQpOworc3RhdGljIGdib29sZWFuIHZvcmJpc19zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIChjb25zdCBHVmFsdWUgKiBzdHJlYW1oZWFkZXIsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBjb250ZXh0KTsKK3N0YXRpYyBnYm9vbGVhbiBzcGVleF9zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIChjb25zdCBHVmFsdWUgKiBzdHJlYW1oZWFkZXIsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBjb250ZXh0KTsKK3N0YXRpYyBnYm9vbGVhbiBrYXRlX3N0cmVhbWhlYWRlcl90b19jb2RlY2RhdGEgKGNvbnN0IEdWYWx1ZSAqIHN0cmVhbWhlYWRlciwKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIGNvbnRleHQpOworc3RhdGljIGdib29sZWFuIGZsYWNfc3RyZWFtaGVhZGVyX3RvX2NvZGVjZGF0YSAoY29uc3QgR1ZhbHVlICogc3RyZWFtaGVhZGVyLAorICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICogY29udGV4dCk7CitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX211eF93cml0ZV9zaW1wbGVfdGFnIChjb25zdCBHc3RUYWdMaXN0ICogbGlzdCwgY29uc3QgZ2NoYXIgKiB0YWcsCisgICAgZ3BvaW50ZXIgZGF0YSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX211eF90YWdfbGlzdF9pc19lbXB0eSAoY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QpOworc3RhdGljIHZvaWQgZ3N0X21hdHJvc2thX211eF93cml0ZV9zdHJlYW1zX3RhZ3MgKEdzdE1hdHJvc2thTXV4ICogbXV4KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbWF0cm9za2FfbXV4X3N0cmVhbXNfaGF2ZV90YWdzIChHc3RNYXRyb3NrYU11eCAqIG11eCk7CisKKy8qIENhbm5vdCB1c2UgYm9pbGVycGxhdGUgbWFjcm9zIGhlcmUgYmVjYXVzZSB3ZSBuZWVkIHRoZSBmdWxsIGluaXQgZnVuY3Rpb24KKyAqIHNpZ25hdHVyZSB3aXRoIHRoZSBhZGRpdGlvbmFsIGNsYXNzIGFyZ3VtZW50LCBzbyB3ZSB1c2UgdGhlIHJpZ2h0IHRlbXBsYXRlCisgKiBmb3IgdGhlIHNpbmsgY2FwcyAqLworR1R5cGUKK2dzdF9tYXRyb3NrYV9tdXhfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBvYmplY3RfdHlwZTsgICAgIC8qIDAgKi8KKworICBpZiAob2JqZWN0X3R5cGUgPT0gMCkgeworICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gb2JqZWN0X2luZm8gPSB7CisgICAgICBzaXplb2YgKEdzdE1hdHJvc2thTXV4Q2xhc3MpLAorICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlX2luaXQgKi8KKyAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogYmFzZV9maW5hbGl6ZSAqLworICAgICAgKEdDbGFzc0luaXRGdW5jKSBnc3RfbWF0cm9za2FfbXV4X2NsYXNzX2luaXQsCisgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIGNsYXNzX2ZpbmFsaXplICovCisgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIGNsYXNzX2RhdGEgKi8KKyAgICAgIHNpemVvZiAoR3N0TWF0cm9za2FNdXgpLAorICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBuX3ByZWFsbG9jcyAqLworICAgICAgKEdJbnN0YW5jZUluaXRGdW5jKSBnc3RfbWF0cm9za2FfbXV4X2luaXQKKyAgICB9OworICAgIGNvbnN0IEdJbnRlcmZhY2VJbmZvIGlmYWNlX2luZm8gPSB7IE5VTEwgfTsKKworICAgIG9iamVjdF90eXBlID0gZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyAoR1NUX1RZUEVfRUxFTUVOVCwKKyAgICAgICAgIkdzdE1hdHJvc2thTXV4IiwgJm9iamVjdF9pbmZvLCAoR1R5cGVGbGFncykgMCk7CisKKyAgICBnX3R5cGVfYWRkX2ludGVyZmFjZV9zdGF0aWMgKG9iamVjdF90eXBlLCBHU1RfVFlQRV9UQUdfU0VUVEVSLCAmaWZhY2VfaW5mbyk7CisgICAgZ190eXBlX2FkZF9pbnRlcmZhY2Vfc3RhdGljIChvYmplY3RfdHlwZSwgR1NUX1RZUEVfVE9DX1NFVFRFUiwgJmlmYWNlX2luZm8pOworICB9CisKKyAgcmV0dXJuIG9iamVjdF90eXBlOworfQorCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX211eF9jbGFzc19pbml0IChHc3RNYXRyb3NrYU11eENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZ2aWRlb3NpbmtfdGVtcGwpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZhdWRpb3NpbmtfdGVtcGwpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZzdWJ0aXRsZXNpbmtfdGVtcGwpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbCk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJNYXRyb3NrYSBtdXhlciIsCisgICAgICAiQ29kZWMvTXV4ZXIiLAorICAgICAgIk11eGVzIHZpZGVvL2F1ZGlvL3N1YnRpdGxlIHN0cmVhbXMgaW50byBhIG1hdHJvc2thIHN0cmVhbSIsCisgICAgICAiR1N0cmVhbWVyIG1haW50YWluZXJzIDxnc3RyZWFtZXItZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnPiIpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChtYXRyb3NrYW11eF9kZWJ1ZywgIm1hdHJvc2thbXV4IiwgMCwKKyAgICAgICJNYXRyb3NrYSBtdXhlciIpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X21hdHJvc2thX211eF9maW5hbGl6ZTsKKworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfbWF0cm9za2FfbXV4X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X21hdHJvc2thX211eF9zZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9XUklUSU5HX0FQUCwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJ3cml0aW5nLWFwcCIsICJXcml0aW5nIGFwcGxpY2F0aW9uLiIsCisgICAgICAgICAgIlRoZSBuYW1lIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGNyZWF0ZXMgdGhlIG1hdHJvc2thIGZpbGUuIiwKKyAgICAgICAgICBOVUxMLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ET0NUWVBFX1ZFUlNJT04sCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgidmVyc2lvbiIsICJEb2NUeXBlIHZlcnNpb24iLAorICAgICAgICAgICJUaGlzIHBhcmFtZXRlciBkZXRlcm1pbmVzIHdoYXQgTWF0cm9za2EgZmVhdHVyZXMgY2FuIGJlIHVzZWQuIiwKKyAgICAgICAgICAxLCAyLCBERUZBVUxUX0RPQ1RZUEVfVkVSU0lPTiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NSU5fSU5ERVhfSU5URVJWQUwsCisgICAgICBnX3BhcmFtX3NwZWNfaW50NjQgKCJtaW4taW5kZXgtaW50ZXJ2YWwiLCAiTWluaW11bSB0aW1lIGJldHdlZW4gaW5kZXggIgorICAgICAgICAgICJlbnRyaWVzIiwgIkFuIGluZGV4IGVudHJ5IGlzIGNyZWF0ZWQgZXZlcnkgc28gbWFueSBuYW5vc2Vjb25kcy4iLAorICAgICAgICAgIDAsIEdfTUFYSU5UNjQsIERFRkFVTFRfTUlOX0lOREVYX0lOVEVSVkFMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NUUkVBTUFCTEUsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInN0cmVhbWFibGUiLCAiRGV0ZXJtaW5lcyB3aGV0aGVyIG91dHB1dCBzaG91bGQgIgorICAgICAgICAgICJiZSBzdHJlYW1hYmxlIiwgIklmIHNldCB0byB0cnVlLCB0aGUgb3V0cHV0IHNob3VsZCBiZSBhcyBpZiBpdCBpcyAiCisgICAgICAgICAgInRvIGJlIHN0cmVhbWVkIGFuZCBoZW5jZSBubyBpbmRleGVzIHdyaXR0ZW4gb3IgZHVyYXRpb24gd3JpdHRlbi4iLAorICAgICAgICAgIERFRkFVTFRfU1RSRUFNQUJMRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVElNRUNPREVTQ0FMRSwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQ2NCAoInRpbWVjb2Rlc2NhbGUiLCAiVGltZWNvZGUgU2NhbGUiLAorICAgICAgICAgICJUaW1lY29kZVNjYWxlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBSYXcgVGltZWNvZGUgb2YgYSBCbG9jayIsIDEsCisgICAgICAgICAgR1NUX1NFQ09ORCwgREVGQVVMVF9USU1FQ09ERVNDQUxFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01JTl9DTFVTVEVSX0RVUkFUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX2ludDY0ICgibWluLWNsdXN0ZXItZHVyYXRpb24iLCAiTWluaW11bSBjbHVzdGVyIGR1cmF0aW9uIiwKKyAgICAgICAgICAiRGVzaWRlcmVkIGNsdXN0ZXIgZHVyYXRpb24gYXMgbmFub3NlY29uZHMuIEEgbmV3IGNsdXN0ZXIgd2lsbCBiZSAiCisgICAgICAgICAgImNyZWF0ZWQgaXJyZXNwZWN0aXZlIG9mIHRoaXMgcHJvcGVydHkgaWYgYSBmb3JjZSBrZXkgdW5pdCBldmVudCAiCisgICAgICAgICAgImlzIHJlY2VpdmVkLiAwIG1lYW5zIGNyZWF0ZSBhIG5ldyBjbHVzdGVyIGZvciBlYWNoIHZpZGVvIGtleWZyYW1lICIKKyAgICAgICAgICAib3IgZm9yIGVhY2ggYXVkaW8gYnVmZmVyIGluIGF1ZGlvIG9ubHkgc3RyZWFtcy4iLCAwLAorICAgICAgICAgIEdfTUFYSU5UNjQsIERFRkFVTFRfTUlOX0NMVVNURVJfRFVSQVRJT04sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX0NMVVNURVJfRFVSQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfaW50NjQgKCJtYXgtY2x1c3Rlci1kdXJhdGlvbiIsICJNYXhpbXVtIGNsdXN0ZXIgZHVyYXRpb24iLAorICAgICAgICAgICJBIG5ldyBjbHVzdGVyIHdpbGwgYmUgY3JlYXRlZCBpZiBpdHMgZHVyYXRpb24gZXhjZWVkcyB0aGlzIHZhbHVlLiAiCisgICAgICAgICAgIjAgbWVhbnMgbm8gbWF4aW11bSBkdXJhdGlvbi4iLCAwLAorICAgICAgICAgIEdfTUFYSU5UNjQsIERFRkFVTFRfTUFYX0NMVVNURVJfRFVSQVRJT04sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbWF0cm9za2FfbXV4X2NoYW5nZV9zdGF0ZSk7CisgIGdzdGVsZW1lbnRfY2xhc3MtPnJlcXVlc3RfbmV3X3BhZCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21hdHJvc2thX211eF9yZXF1ZXN0X25ld19wYWQpOworICBnc3RlbGVtZW50X2NsYXNzLT5yZWxlYXNlX3BhZCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21hdHJvc2thX211eF9yZWxlYXNlX3BhZCk7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7Cit9CisKKy8qCisgKiBTdGFydCBvZiBwYWQgb3B0aW9uIGhhbmRsZXIgY29kZQorICovCisjZGVmaW5lIERFRkFVTFRfUEFEX0ZSQU1FX0RVUkFUSU9OIFRSVUUKKworZW51bQoreworICBQUk9QX1BBRF8wLAorICBQUk9QX1BBRF9GUkFNRV9EVVJBVElPTgorfTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0UGFkIHBhcmVudDsKKyAgZ2Jvb2xlYW4gZnJhbWVfZHVyYXRpb247CisgIGdib29sZWFuIGZyYW1lX2R1cmF0aW9uX3VzZXI7Cit9IEdzdE1hdHJvc2thbXV4UGFkOworCit0eXBlZGVmIEdzdFBhZENsYXNzIEdzdE1hdHJvc2thbXV4UGFkQ2xhc3M7CisKK0dUeXBlIGdzdF9tYXRyb3NrYW11eF9wYWRfZ2V0X3R5cGUgKHZvaWQpOworR19ERUZJTkVfVFlQRSAoR3N0TWF0cm9za2FtdXhQYWQsIGdzdF9tYXRyb3NrYW11eF9wYWQsIEdTVF9UWVBFX1BBRCk7CisKKyNkZWZpbmUgR1NUX1RZUEVfTUFUUk9TS0FNVVhfUEFEIChnc3RfbWF0cm9za2FtdXhfcGFkX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9NQVRST1NLQU1VWF9QQUQocGFkKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKHBhZCksR1NUX1RZUEVfTUFUUk9TS0FNVVhfUEFELEdzdE1hdHJvc2thbXV4UGFkKSkKKyNkZWZpbmUgR1NUX01BVFJPU0tBTVVYX1BBRF9DQVNUKHBhZCkgKChHc3RNYXRyb3NrYW11eFBhZCAqKSBwYWQpCisjZGVmaW5lIEdTVF9JU19NQVRST1NLQU1VWF9QQUQocGFkKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKHBhZCksR1NUX1RZUEVfTUFUUk9TS0FNVVhfUEFEKSkKKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYW11eF9wYWRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE1hdHJvc2thbXV4UGFkICpwYWQgPSBHU1RfTUFUUk9TS0FNVVhfUEFEIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QQURfRlJBTUVfRFVSQVRJT046CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcGFkLT5mcmFtZV9kdXJhdGlvbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FtdXhfcGFkX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RNYXRyb3NrYW11eFBhZCAqcGFkID0gR1NUX01BVFJPU0tBTVVYX1BBRCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUEFEX0ZSQU1FX0RVUkFUSU9OOgorICAgICAgcGFkLT5mcmFtZV9kdXJhdGlvbiA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIHBhZC0+ZnJhbWVfZHVyYXRpb25fdXNlciA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FtdXhfcGFkX2NsYXNzX2luaXQgKEdzdE1hdHJvc2thbXV4UGFkQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfbWF0cm9za2FtdXhfcGFkX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X21hdHJvc2thbXV4X3BhZF9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QQURfRlJBTUVfRFVSQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImZyYW1lLWR1cmF0aW9uIiwgIkZyYW1lIGR1cmF0aW9uIiwKKyAgICAgICAgICAiRGVmYXVsdCBmcmFtZSBkdXJhdGlvbiIsIERFRkFVTFRfUEFEX0ZSQU1FX0RVUkFUSU9OLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYW11eF9wYWRfaW5pdCAoR3N0TWF0cm9za2FtdXhQYWQgKiBwYWQpCit7CisgIHBhZC0+ZnJhbWVfZHVyYXRpb24gPSBERUZBVUxUX1BBRF9GUkFNRV9EVVJBVElPTjsKKyAgcGFkLT5mcmFtZV9kdXJhdGlvbl91c2VyID0gRkFMU0U7Cit9CisKKy8qCisgKiBFbmQgb2YgcGFkIG9wdGlvbiBoYW5kbGVyIGNvZGUKKyAqKi8KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9tdXhfaW5pdCAoR3N0TWF0cm9za2FNdXggKiBtdXgsIGdwb2ludGVyIGdfY2xhc3MpCit7CisgIEdzdFBhZFRlbXBsYXRlICp0ZW1wbDsKKworICB0ZW1wbCA9CisgICAgICBnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChHU1RfRUxFTUVOVF9DTEFTUyAoZ19jbGFzcyksICJzcmMiKTsKKyAgbXV4LT5zcmNwYWQgPSBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlICh0ZW1wbCwgInNyYyIpOworCisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChtdXgtPnNyY3BhZCwgZ3N0X21hdHJvc2thX211eF9oYW5kbGVfc3JjX2V2ZW50KTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKG11eCksIG11eC0+c3JjcGFkKTsKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAobXV4LT5zcmNwYWQpOworCisgIG11eC0+Y29sbGVjdCA9IGdzdF9jb2xsZWN0X3BhZHNfbmV3ICgpOworICBnc3RfY29sbGVjdF9wYWRzX3NldF9jbGlwX2Z1bmN0aW9uIChtdXgtPmNvbGxlY3QsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2NvbGxlY3RfcGFkc19jbGlwX3J1bm5pbmdfdGltZSksIG11eCk7CisgIGdzdF9jb2xsZWN0X3BhZHNfc2V0X2J1ZmZlcl9mdW5jdGlvbiAobXV4LT5jb2xsZWN0LAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9tdXhfaGFuZGxlX2J1ZmZlciksIG11eCk7CisgIGdzdF9jb2xsZWN0X3BhZHNfc2V0X2V2ZW50X2Z1bmN0aW9uIChtdXgtPmNvbGxlY3QsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21hdHJvc2thX211eF9oYW5kbGVfc2lua19ldmVudCksIG11eCk7CisKKyAgbXV4LT5lYm1sX3dyaXRlID0gZ3N0X2VibWxfd3JpdGVfbmV3IChtdXgtPnNyY3BhZCk7CisgIG11eC0+ZG9jdHlwZSA9IEdTVF9NQVRST1NLQV9ET0NUWVBFX01BVFJPU0tBOworCisgIC8qIHByb3BlcnR5IGRlZmF1bHRzICovCisgIG11eC0+ZG9jdHlwZV92ZXJzaW9uID0gREVGQVVMVF9ET0NUWVBFX1ZFUlNJT047CisgIG11eC0+d3JpdGluZ19hcHAgPSBnX3N0cmR1cCAoREVGQVVMVF9XUklUSU5HX0FQUCk7CisgIG11eC0+bWluX2luZGV4X2ludGVydmFsID0gREVGQVVMVF9NSU5fSU5ERVhfSU5URVJWQUw7CisgIG11eC0+ZWJtbF93cml0ZS0+c3RyZWFtYWJsZSA9IERFRkFVTFRfU1RSRUFNQUJMRTsKKyAgbXV4LT50aW1lX3NjYWxlID0gREVGQVVMVF9USU1FQ09ERVNDQUxFOworICBtdXgtPm1pbl9jbHVzdGVyX2R1cmF0aW9uID0gREVGQVVMVF9NSU5fQ0xVU1RFUl9EVVJBVElPTjsKKyAgbXV4LT5tYXhfY2x1c3Rlcl9kdXJhdGlvbiA9IERFRkFVTFRfTUFYX0NMVVNURVJfRFVSQVRJT047CisKKyAgLyogaW5pdGlhbGl6ZSBpbnRlcm5hbCB2YXJpYWJsZXMgKi8KKyAgbXV4LT5pbmRleCA9IE5VTEw7CisgIG11eC0+bnVtX3N0cmVhbXMgPSAwOworICBtdXgtPm51bV9hX3N0cmVhbXMgPSAwOworICBtdXgtPm51bV90X3N0cmVhbXMgPSAwOworICBtdXgtPm51bV92X3N0cmVhbXMgPSAwOworICBtdXgtPmludGVybmFsX3RvYyA9IE5VTEw7CisKKyAgLyogY3JlYXRlIHVzZWQgdWlkIGxpc3QgKi8KKyAgbXV4LT51c2VkX3VpZHMgPSBnX2FycmF5X3NpemVkX25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKGd1aW50NjQpLCAxMCk7CisKKyAgLyogaW5pdGlhbGl6ZSByZW1haW5pbmcgdmFyaWFibGVzICovCisgIGdzdF9tYXRyb3NrYV9tdXhfcmVzZXQgKEdTVF9FTEVNRU5UIChtdXgpKTsKK30KKworCisvKioKKyAqIGdzdF9tYXRyb3NrYV9tdXhfZmluYWxpemU6CisgKiBAb2JqZWN0OiAjR3N0TWF0cm9za2FNdXggdGhhdCBzaG91bGQgYmUgZmluYWxpemVkLgorICoKKyAqIEZpbmFsaXplIG1hdHJvc2thIG11eGVyLgorICovCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX211eF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0TWF0cm9za2FNdXggKm11eCA9IEdTVF9NQVRST1NLQV9NVVggKG9iamVjdCk7CisKKyAgZ3N0X2V2ZW50X3JlcGxhY2UgKCZtdXgtPmZvcmNlX2tleV91bml0X2V2ZW50LCBOVUxMKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChtdXgtPmNvbGxlY3QpOworICBnc3Rfb2JqZWN0X3VucmVmIChtdXgtPmVibWxfd3JpdGUpOworICBnX2ZyZWUgKG11eC0+d3JpdGluZ19hcHApOworCisgIGdfYXJyYXlfZnJlZSAobXV4LT51c2VkX3VpZHMsIFRSVUUpOworCisgIGlmIChtdXgtPmludGVybmFsX3RvYykgeworICAgIGdzdF90b2NfdW5yZWYgKG11eC0+aW50ZXJuYWxfdG9jKTsKKyAgICBtdXgtPmludGVybmFsX3RvYyA9IE5VTEw7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X2NyZWF0ZV91aWQ6CisgKiBAbXV4OiAjR3N0TWF0cm9za2FNdXggdG8gZ2VuZXJhdGUgVUlEIGZvci4KKyAqCisgKiBHZW5lcmF0ZSBuZXcgdW51c2VkIHRyYWNrIFVJRC4KKyAqCisgKiBSZXR1cm5zOiBOZXcgdHJhY2sgVUlELgorICovCitzdGF0aWMgZ3VpbnQ2NAorZ3N0X21hdHJvc2thX211eF9jcmVhdGVfdWlkIChHc3RNYXRyb3NrYU11eCAqIG11eCkKK3sKKyAgZ3VpbnQ2NCB1aWQgPSAwOworCisgIHdoaWxlICghdWlkKSB7CisgICAgZ3VpbnQgaTsKKworICAgIHVpZCA9ICgoKGd1aW50NjQpIGdfcmFuZG9tX2ludCAoKSkgPDwgMzIpIHwgZ19yYW5kb21faW50ICgpOworICAgIGZvciAoaSA9IDA7IGkgPCBtdXgtPnVzZWRfdWlkcy0+bGVuOyBpKyspIHsKKyAgICAgIGlmIChnX2FycmF5X2luZGV4IChtdXgtPnVzZWRfdWlkcywgZ3VpbnQ2NCwgaSkgPT0gdWlkKSB7CisgICAgICAgIHVpZCA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBnX2FycmF5X2FwcGVuZF92YWwgKG11eC0+dXNlZF91aWRzLCB1aWQpOworICB9CisKKyAgcmV0dXJuIHVpZDsKK30KKworCisvKioKKyAqIGdzdF9tYXRyb3NrYV9wYWRfcmVzZXQ6CisgKiBAY29sbGVjdF9wYWQ6IHRoZSAjR3N0TWF0cm9za2FQYWQKKyAqCisgKiBSZXNldCBhbmQvb3IgcmVsZWFzZSByZXNvdXJjZXMgb2YgYSBtYXRyb3NrYSBjb2xsZWN0IHBhZC4KKyAqLworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9wYWRfcmVzZXQgKEdzdE1hdHJvc2thUGFkICogY29sbGVjdF9wYWQsIGdib29sZWFuIGZ1bGwpCit7CisgIGdjaGFyICpuYW1lID0gTlVMTDsKKyAgR3N0TWF0cm9za2FUcmFja1R5cGUgdHlwZSA9IDA7CisKKyAgLyogZnJlZSB0cmFjayBpbmZvcm1hdGlvbiAqLworICBpZiAoY29sbGVjdF9wYWQtPnRyYWNrICE9IE5VTEwpIHsKKyAgICAvKiByZXRyaWV2ZSBmb3Igb3B0aW9uYWwgbGF0ZXIgdXNlICovCisgICAgbmFtZSA9IGNvbGxlY3RfcGFkLT50cmFjay0+bmFtZTsKKyAgICB0eXBlID0gY29sbGVjdF9wYWQtPnRyYWNrLT50eXBlOworICAgIC8qIGV4dHJhIGZvciB2aWRlbyAqLworICAgIGlmICh0eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1ZJREVPKSB7CisgICAgICBHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICpjdHggPQorICAgICAgICAgIChHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICopIGNvbGxlY3RfcGFkLT50cmFjazsKKworICAgICAgaWYgKGN0eC0+ZGlyYWNfdW5pdCkgeworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChjdHgtPmRpcmFjX3VuaXQpOworICAgICAgICBjdHgtPmRpcmFjX3VuaXQgPSBOVUxMOworICAgICAgfQorICAgIH0KKyAgICBnX2ZyZWUgKGNvbGxlY3RfcGFkLT50cmFjay0+Y29kZWNfaWQpOworICAgIGdfZnJlZSAoY29sbGVjdF9wYWQtPnRyYWNrLT5jb2RlY19uYW1lKTsKKyAgICBpZiAoZnVsbCkKKyAgICAgIGdfZnJlZSAoY29sbGVjdF9wYWQtPnRyYWNrLT5uYW1lKTsKKyAgICBnX2ZyZWUgKGNvbGxlY3RfcGFkLT50cmFjay0+bGFuZ3VhZ2UpOworICAgIGdfZnJlZSAoY29sbGVjdF9wYWQtPnRyYWNrLT5jb2RlY19wcml2KTsKKyAgICBnX2ZyZWUgKGNvbGxlY3RfcGFkLT50cmFjayk7CisgICAgY29sbGVjdF9wYWQtPnRyYWNrID0gTlVMTDsKKyAgICBpZiAoY29sbGVjdF9wYWQtPnRhZ3MpIHsKKyAgICAgIGdzdF90YWdfbGlzdF91bnJlZiAoY29sbGVjdF9wYWQtPnRhZ3MpOworICAgICAgY29sbGVjdF9wYWQtPnRhZ3MgPSBOVUxMOworICAgIH0KKyAgfQorCisgIGlmICghZnVsbCAmJiB0eXBlICE9IDApIHsKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqY29udGV4dDsKKworICAgIC8qIGNyZWF0ZSBhIGZyZXNoIGNvbnRleHQgKi8KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfVklERU86CisgICAgICAgIGNvbnRleHQgPSAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKikKKyAgICAgICAgICAgIGdfbmV3MCAoR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCwgMSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9BVURJTzoKKyAgICAgICAgY29udGV4dCA9IChHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqKQorICAgICAgICAgICAgZ19uZXcwIChHc3RNYXRyb3NrYVRyYWNrQXVkaW9Db250ZXh0LCAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFOgorICAgICAgICBjb250ZXh0ID0gKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICopCisgICAgICAgICAgICBnX25ldzAgKEdzdE1hdHJvc2thVHJhY2tTdWJ0aXRsZUNvbnRleHQsIDEpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29udGV4dC0+dHlwZSA9IHR5cGU7CisgICAgY29udGV4dC0+bmFtZSA9IG5hbWU7CisgICAgY29udGV4dC0+dWlkID0gZ3N0X21hdHJvc2thX211eF9jcmVhdGVfdWlkIChjb2xsZWN0X3BhZC0+bXV4KTsKKyAgICAvKiBUT0RPOiBjaGVjayBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGNvbnRleHQgKi8KKyAgICBjb250ZXh0LT5mbGFncyA9IEdTVF9NQVRST1NLQV9UUkFDS19FTkFCTEVEIHwgR1NUX01BVFJPU0tBX1RSQUNLX0RFRkFVTFQ7CisgICAgY29sbGVjdF9wYWQtPnRyYWNrID0gY29udGV4dDsKKyAgICBjb2xsZWN0X3BhZC0+c3RhcnRfdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgIGNvbGxlY3RfcGFkLT5lbmRfdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgIGNvbGxlY3RfcGFkLT50YWdzID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgICBnc3RfdGFnX2xpc3Rfc2V0X3Njb3BlIChjb2xsZWN0X3BhZC0+dGFncywgR1NUX1RBR19TQ09QRV9TVFJFQU0pOworICB9Cit9CisKKy8qKgorICogZ3N0X21hdHJvc2thX3BhZF9mcmVlOgorICogQGNvbGxlY3RfcGFkOiB0aGUgI0dzdE1hdHJvc2thUGFkCisgKgorICogUmVsZWFzZSByZXNvdXJjZXMgb2YgYSBtYXRyb3NrYSBjb2xsZWN0IHBhZC4KKyAqLworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9wYWRfZnJlZSAoR3N0UGFkICogY29sbGVjdF9wYWQpCit7CisgIGdzdF9tYXRyb3NrYV9wYWRfcmVzZXQgKChHc3RNYXRyb3NrYVBhZCAqKSBjb2xsZWN0X3BhZCwgVFJVRSk7Cit9CisKKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X3Jlc2V0OgorICogQGVsZW1lbnQ6ICNHc3RNYXRyb3NrYU11eCB0aGF0IHNob3VsZCBiZSByZXNldGVkLgorICoKKyAqIFJlc2V0IG1hdHJvc2thIG11eGVyIGJhY2sgdG8gaW5pdGlhbCBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9tdXhfcmVzZXQgKEdzdEVsZW1lbnQgKiBlbGVtZW50KQoreworICBHc3RNYXRyb3NrYU11eCAqbXV4ID0gR1NUX01BVFJPU0tBX01VWCAoZWxlbWVudCk7CisgIEdTTGlzdCAqd2FsazsKKworICAvKiByZXNldCBFQk1MIHdyaXRlICovCisgIGdzdF9lYm1sX3dyaXRlX3Jlc2V0IChtdXgtPmVibWxfd3JpdGUpOworCisgIC8qIHJlc2V0IGlucHV0ICovCisgIG11eC0+c3RhdGUgPSBHU1RfTUFUUk9TS0FfTVVYX1NUQVRFX1NUQVJUOworCisgIC8qIGNsZWFuIHVwIGV4aXN0aW5nIHN0cmVhbXMgKi8KKworICBmb3IgKHdhbGsgPSBtdXgtPmNvbGxlY3QtPmRhdGE7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0TWF0cm9za2FQYWQgKmNvbGxlY3RfcGFkOworCisgICAgY29sbGVjdF9wYWQgPSAoR3N0TWF0cm9za2FQYWQgKikgd2Fsay0+ZGF0YTsKKworICAgIC8qIHJlc2V0IGNvbGxlY3QgcGFkIHRvIHByaXN0aW5lIHN0YXRlICovCisgICAgZ3N0X21hdHJvc2thX3BhZF9yZXNldCAoY29sbGVjdF9wYWQsIEZBTFNFKTsKKyAgfQorCisgIC8qIHJlc2V0IGluZGV4ZXMgKi8KKyAgbXV4LT5udW1faW5kZXhlcyA9IDA7CisgIGdfZnJlZSAobXV4LT5pbmRleCk7CisgIG11eC0+aW5kZXggPSBOVUxMOworCisgIC8qIHJlc2V0IHRpbWVycyAqLworICBtdXgtPmR1cmF0aW9uID0gMDsKKworICAvKiByZXNldCBjbHVzdGVyICovCisgIG11eC0+Y2x1c3RlciA9IDA7CisgIG11eC0+Y2x1c3Rlcl90aW1lID0gMDsKKyAgbXV4LT5jbHVzdGVyX3BvcyA9IDA7CisgIG11eC0+cHJldl9jbHVzdGVyX3NpemUgPSAwOworCisgIC8qIHJlc2V0IHRhZ3MgKi8KKyAgZ3N0X3RhZ19zZXR0ZXJfcmVzZXRfdGFncyAoR1NUX1RBR19TRVRURVIgKG11eCkpOworCisgIG11eC0+dGFnc19wb3MgPSAwOworCisgIC8qIHJlc2V0IGNoYXB0ZXJzICovCisgIGdzdF90b2Nfc2V0dGVyX3Jlc2V0IChHU1RfVE9DX1NFVFRFUiAobXV4KSk7CisgIGlmIChtdXgtPmludGVybmFsX3RvYykgeworICAgIGdzdF90b2NfdW5yZWYgKG11eC0+aW50ZXJuYWxfdG9jKTsKKyAgICBtdXgtPmludGVybmFsX3RvYyA9IE5VTEw7CisgIH0KKworICBtdXgtPmNoYXB0ZXJzX3BvcyA9IDA7CisKKyAgLyogY2xlYXIgdXNlZCB1aWRzICovCisgIGlmIChtdXgtPnVzZWRfdWlkcy0+bGVuID4gMCkgeworICAgIGdfYXJyYXlfcmVtb3ZlX3JhbmdlIChtdXgtPnVzZWRfdWlkcywgMCwgbXV4LT51c2VkX3VpZHMtPmxlbik7CisgIH0KK30KKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X2hhbmRsZV9zcmNfZXZlbnQ6CisgKiBAcGFkOiBQYWQgd2hpY2ggcmVjZWl2ZWQgdGhlIGV2ZW50LgorICogQGV2ZW50OiBSZWNlaXZlZCBldmVudC4KKyAqCisgKiBoYW5kbGUgZXZlbnRzIC0gY29waWVkIGZyb20gb2dnbXV4IHdpdGhvdXQgdW5kZXJzdGFuZGluZworICoKKyAqIFJldHVybnM6ICVUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX211eF9oYW5kbGVfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RFdmVudFR5cGUgdHlwZTsKKworICB0eXBlID0gZXZlbnQgPyBHU1RfRVZFTlRfVFlQRSAoZXZlbnQpIDogR1NUX0VWRU5UX1VOS05PV047CisKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICAgIC8qIGRpc2FibGUgc2Vla2luZyBmb3Igbm93ICovCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX211eF9mcmVlX2NvZGVjX3ByaXYgKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICogY29udGV4dCkKK3sKKyAgaWYgKGNvbnRleHQtPmNvZGVjX3ByaXYgIT0gTlVMTCkgeworICAgIGdfZnJlZSAoY29udGV4dC0+Y29kZWNfcHJpdik7CisgICAgY29udGV4dC0+Y29kZWNfcHJpdiA9IE5VTEw7CisgICAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplID0gMDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX211eF9idWlsZF92b2JzdWJfcHJpdmF0ZSAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBjb250ZXh0LAorICAgIGNvbnN0IGd1aW50ICogY2x1dCkKK3sKKyAgZ2NoYXIgKmNsdXR2WzE3XTsKKyAgZ2NoYXIgKnNjbHV0OworICBnaW50IGk7CisgIGd1aW50MzIgY29sOworICBnZG91YmxlIHksIHUsIHY7CisgIGd1aW50OCByLCBnLCBiOworCisgIC8qIHByb2R1Y2UgY29tbWEtc2VwYXJhdGVkIGxpc3QgaW4gaGV4IGZvcm1hdCAqLworICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgIGNvbCA9IGNsdXRbaV07CisgICAgLyogcmVwbGljYXRlIHZvYnN1YidzIHNsaWdodGx5IG9mZiBSR0IgY29udmVyc2lvbiBjYWxjdWxhdGlvbiAqLworICAgIHkgPSAoKChjb2wgPj4gMTYpICYgMHhmZikgLSAxNikgKiAyNTUgLyAyMTk7CisgICAgdSA9ICgoY29sID4+IDgpICYgMHhmZikgLSAxMjg7CisgICAgdiA9IChjb2wgJiAweGZmKSAtIDEyODsKKyAgICByID0gQ0xBTVAgKDEuMCAqIHkgKyAxLjQwMjIgKiB1LCAwLCAyNTUpOworICAgIGcgPSBDTEFNUCAoMS4wICogeSAtIDAuMzQ1NiAqIHUgLSAwLjcxNDUgKiB2LCAwLCAyNTUpOworICAgIGIgPSBDTEFNUCAoMS4wICogeSArIDEuNzcxMCAqIHYsIDAsIDI1NSk7CisgICAgY2x1dHZbaV0gPSBnX3N0cmR1cF9wcmludGYgKCIlMDJ4JTAyeCUwMngiLCByLCBnLCBiKTsKKyAgfQorICBjbHV0dltpXSA9IE5VTEw7CisgIHNjbHV0ID0gZ19zdHJqb2ludiAoIiwiLCBjbHV0dik7CisKKyAgLyogYnVpbGQgY29kZWMgcHJpdmF0ZTsgb25seSBwYWxldHRlIGZvciBub3cgKi8KKyAgZ3N0X21hdHJvc2thX211eF9mcmVlX2NvZGVjX3ByaXYgKGNvbnRleHQpOworICBjb250ZXh0LT5jb2RlY19wcml2ID0gKGd1aW50OCAqKSBnX3N0cmR1cF9wcmludGYgKCJwYWxldHRlOiAlcyIsIHNjbHV0KTsKKyAgLyogaW5jbHVkZSB0ZXJtaW5hdGluZyAwICovCisgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSA9IHN0cmxlbiAoKGdjaGFyICopIGNvbnRleHQtPmNvZGVjX3ByaXYpICsgMTsKKyAgZ19mcmVlIChzY2x1dCk7CisgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgZ19mcmVlIChjbHV0dltpXSk7CisgIH0KK30KKworCisvKioKKyAqIGdzdF9tYXRyb3NrYV9tdXhfaGFuZGxlX3NpbmtfZXZlbnQ6CisgKiBAcGFkOiBQYWQgd2hpY2ggcmVjZWl2ZWQgdGhlIGV2ZW50LgorICogQGV2ZW50OiBSZWNlaXZlZCBldmVudC4KKyAqCisgKiBoYW5kbGUgZXZlbnRzIC0gaW5mb3JtYXRpb25hbCBvbmVzIGxpa2UgdGFncworICoKKyAqIFJldHVybnM6ICVUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX211eF9oYW5kbGVfc2lua19ldmVudCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLAorICAgIEdzdENvbGxlY3REYXRhICogZGF0YSwgR3N0RXZlbnQgKiBldmVudCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RNYXRyb3NrYVBhZCAqY29sbGVjdF9wYWQ7CisgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjb250ZXh0OworICBHc3RNYXRyb3NrYU11eCAqbXV4OworICBHc3RQYWQgKnBhZDsKKyAgR3N0VGFnTGlzdCAqbGlzdDsKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKworICBtdXggPSBHU1RfTUFUUk9TS0FfTVVYICh1c2VyX2RhdGEpOworICBjb2xsZWN0X3BhZCA9IChHc3RNYXRyb3NrYVBhZCAqKSBkYXRhOworICBwYWQgPSBkYXRhLT5wYWQ7CisgIGNvbnRleHQgPSBjb2xsZWN0X3BhZC0+dHJhY2s7CisgIGdfYXNzZXJ0IChjb250ZXh0KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9DQVBTOnsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgIGNvbGxlY3RfcGFkID0gKEdzdE1hdHJvc2thUGFkICopIGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9jYXBzIChldmVudCwgJmNhcHMpOworCisgICAgICByZXQgPSBjb2xsZWN0X3BhZC0+Y2Fwc2Z1bmMgKHBhZCwgY2Fwcyk7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGV2ZW50ID0gTlVMTDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9UQUc6eworICAgICAgZ2NoYXIgKmxhbmcgPSBOVUxMOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJyZWNlaXZlZCB0YWcgZXZlbnQiKTsKKyAgICAgIGdzdF9ldmVudF9wYXJzZV90YWcgKGV2ZW50LCAmbGlzdCk7CisKKyAgICAgIC8qIE1hdHJvc2thIHdhbnRzIElTTyA2MzktMkIgY29kZSwgdGFnbGlzdCBtb3N0IGxpa2VseSBjb250YWlucyA2MzktMSAqLworICAgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nIChsaXN0LCBHU1RfVEFHX0xBTkdVQUdFX0NPREUsICZsYW5nKSkgeworICAgICAgICBjb25zdCBnY2hhciAqbGFuZ19jb2RlOworCisgICAgICAgIGxhbmdfY29kZSA9IGdzdF90YWdfZ2V0X2xhbmd1YWdlX2NvZGVfaXNvXzYzOV8yQiAobGFuZyk7CisgICAgICAgIGlmIChsYW5nX2NvZGUpIHsKKyAgICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHBhZCwgIlNldHRpbmcgbGFuZ3VhZ2UgdG8gJyVzJyIsIGxhbmdfY29kZSk7CisgICAgICAgICAgZ19mcmVlIChjb250ZXh0LT5sYW5ndWFnZSk7CisgICAgICAgICAgY29udGV4dC0+bGFuZ3VhZ2UgPSBnX3N0cmR1cCAobGFuZ19jb2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhZCwgIkRpZCBub3QgZ2V0IGxhbmd1YWdlIGNvZGUgZm9yICclcyciLCBsYW5nKTsKKyAgICAgICAgfQorICAgICAgICBnX2ZyZWUgKGxhbmcpOworICAgICAgfQorCisgICAgICAvKiBGSVhNRTogd2hhdCBhYm91dCBzdHJlYW0tc3BlY2lmaWMgdGFncz8gKi8KKyAgICAgIGlmIChnc3RfdGFnX2xpc3RfZ2V0X3Njb3BlIChsaXN0KSA9PSBHU1RfVEFHX1NDT1BFX0dMT0JBTCkgeworICAgICAgICBnc3RfdGFnX3NldHRlcl9tZXJnZV90YWdzIChHU1RfVEFHX1NFVFRFUiAobXV4KSwgbGlzdCwKKyAgICAgICAgICAgIGdzdF90YWdfc2V0dGVyX2dldF90YWdfbWVyZ2VfbW9kZSAoR1NUX1RBR19TRVRURVIgKG11eCkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9pbnNlcnQgKGNvbGxlY3RfcGFkLT50YWdzLCBsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UpOworICAgICAgfQorCisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIC8qIGhhbmRsZWQgdGhpcywgZG9uJ3Qgd2FudCBjb2xsZWN0cGFkcyB0byBmb3J3YXJkIGl0IGRvd25zdHJlYW0gKi8KKyAgICAgIGV2ZW50ID0gTlVMTDsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfVE9DOnsKKyAgICAgIEdzdFRvYyAqdG9jLCAqb2xkX3RvYzsKKworICAgICAgaWYgKG11eC0+Y2hhcHRlcnNfcG9zID4gMCkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgInJlY2VpdmVkIHRvYyBldmVudCIpOworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3RvYyAoZXZlbnQsICZ0b2MsIE5VTEwpOworCisgICAgICBpZiAodG9jICE9IE5VTEwpIHsKKyAgICAgICAgb2xkX3RvYyA9IGdzdF90b2Nfc2V0dGVyX2dldF90b2MgKEdTVF9UT0NfU0VUVEVSIChtdXgpKTsKKyAgICAgICAgaWYgKG9sZF90b2MgIT0gTlVMTCkgeworICAgICAgICAgIGlmIChvbGRfdG9jICE9IHRvYykKKyAgICAgICAgICAgIEdTVF9JTkZPX09CSkVDVCAocGFkLCAiUmVwbGFjaW5nIFRPQyB3aXRoIGEgbmV3IG9uZSIpOworICAgICAgICAgIGdzdF90b2NfdW5yZWYgKG9sZF90b2MpOworICAgICAgICB9CisKKyAgICAgICAgZ3N0X3RvY19zZXR0ZXJfc2V0X3RvYyAoR1NUX1RPQ19TRVRURVIgKG11eCksIHRvYyk7CisgICAgICAgIGdzdF90b2NfdW5yZWYgKHRvYyk7CisgICAgICB9CisKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgLyogaGFuZGxlZCB0aGlzLCBkb24ndCB3YW50IGNvbGxlY3RwYWRzIHRvIGZvcndhcmQgaXQgZG93bnN0cmVhbSAqLworICAgICAgZXZlbnQgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX0NVU1RPTV9ET1dOU1RSRUFNOgorICAgIGNhc2UgR1NUX0VWRU5UX0NVU1RPTV9ET1dOU1RSRUFNX1NUSUNLWTp7CisgICAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKworICAgICAgc3RydWN0dXJlID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUgKGV2ZW50KTsKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzdHJ1Y3R1cmUsICJHc3RGb3JjZUtleVVuaXQiKSkgeworICAgICAgICBnc3RfZXZlbnRfcmVwbGFjZSAoJm11eC0+Zm9yY2Vfa2V5X3VuaXRfZXZlbnQsIE5VTEwpOworICAgICAgICBtdXgtPmZvcmNlX2tleV91bml0X2V2ZW50ID0gZXZlbnQ7CisgICAgICAgIGV2ZW50ID0gTlVMTDsKKyAgICAgIH0gZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAoc3RydWN0dXJlLCAiYXBwbGljYXRpb24veC1nc3QtZHZkIikgJiYKKyAgICAgICAgICAhc3RyY21wICgiZHZkLXNwdS1jbHV0LWNoYW5nZSIsCisgICAgICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZXZlbnQiKSkpIHsKKyAgICAgICAgZ2NoYXIgbmFtZVsxNl07CisgICAgICAgIGdpbnQgaSwgdmFsdWU7CisgICAgICAgIGd1aW50IGNsdXRbMTZdOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgIk5ldyBEVkQgY29sb3VyIHRhYmxlIHJlY2VpdmVkIik7CisgICAgICAgIGlmIChjb250ZXh0LT50eXBlICE9IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiLi4uIGRpc2NhcmRpbmciKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBmaXJzdCB0cmFuc2Zvcm0gZXZlbnQgZGF0YSBpbnRvIHRhYmxlIGZvcm0gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgICBnX3NucHJpbnRmIChuYW1lLCBzaXplb2YgKG5hbWUpLCAiY2x1dCUwMmQiLCBpKTsKKyAgICAgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCBuYW1lLCAmdmFsdWUpKSB7CisgICAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChtdXgsICJkdmQtc3B1LWNsdXQtY2hhbmdlIGV2ZW50IGRpZCBub3QgIgorICAgICAgICAgICAgICAgICJjb250YWluICVzIGZpZWxkIiwgbmFtZSk7CisgICAgICAgICAgICBnb3RvIGJyZWFrX2hhcmQ7CisgICAgICAgICAgfQorICAgICAgICAgIGNsdXRbaV0gPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHRyYW5zZm9ybSBpbnRvIHByaXZhdGUgZGF0YSBmb3Igc3RyZWFtOyB0ZXh0IGZvcm0gKi8KKyAgICAgICAgZ3N0X21hdHJvc2thX211eF9idWlsZF92b2JzdWJfcHJpdmF0ZSAoY29udGV4dCwgY2x1dCk7CisgICAgICB9CisgICAgfQorICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKK2JyZWFrX2hhcmQ6CisgIGlmIChldmVudCAhPSBOVUxMKQorICAgIHJldHVybiBnc3RfY29sbGVjdF9wYWRzX2V2ZW50X2RlZmF1bHQgKHBhZHMsIGRhdGEsIGV2ZW50LCBGQUxTRSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIGNvbnRleHQsCisgICAgY29uc3QgY2hhciAqaWQpCit7CisgIGdfYXNzZXJ0IChjb250ZXh0ICYmIGlkKTsKKyAgZ19mcmVlIChjb250ZXh0LT5jb2RlY19pZCk7CisgIGNvbnRleHQtPmNvZGVjX2lkID0gZ19zdHJkdXAgKGlkKTsKK30KKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X3ZpZGVvX3BhZF9zZXRjYXBzOgorICogQHBhZDogUGFkIHdoaWNoIGdvdCB0aGUgY2Fwcy4KKyAqIEBjYXBzOiBOZXcgY2Fwcy4KKyAqCisgKiBTZXRjYXBzIGZ1bmN0aW9uIGZvciB2aWRlbyBzaW5rIHBhZC4KKyAqCisgKiBSZXR1cm5zOiAlVFJVRSBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9tdXhfdmlkZW9fcGFkX3NldGNhcHMgKEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjb250ZXh0ID0gTlVMTDsKKyAgR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCAqdmlkZW9jb250ZXh0OworICBHc3RNYXRyb3NrYU11eCAqbXV4OworICBHc3RNYXRyb3NrYVBhZCAqY29sbGVjdF9wYWQ7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBjb25zdCBnY2hhciAqbWltZXR5cGU7CisgIGNvbnN0IGdjaGFyICppbnRlcmxhY2VfbW9kZSwgKnM7CisgIGNvbnN0IEdWYWx1ZSAqdmFsdWUgPSBOVUxMOworICBHc3RCdWZmZXIgKmNvZGVjX2J1ZiA9IE5VTEw7CisgIGdpbnQgd2lkdGgsIGhlaWdodCwgcGl4ZWxfd2lkdGgsIHBpeGVsX2hlaWdodDsKKyAgZ2ludCBmcHNfZCwgZnBzX247CisgIGd1aW50IG11bHRpdmlld19mbGFnczsKKworICBtdXggPSBHU1RfTUFUUk9TS0FfTVVYIChHU1RfUEFEX1BBUkVOVCAocGFkKSk7CisKKyAgLyogZmluZCBjb250ZXh0ICovCisgIGNvbGxlY3RfcGFkID0gKEdzdE1hdHJvc2thUGFkICopIGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgZ19hc3NlcnQgKGNvbGxlY3RfcGFkKTsKKyAgY29udGV4dCA9IGNvbGxlY3RfcGFkLT50cmFjazsKKyAgZ19hc3NlcnQgKGNvbnRleHQpOworICBnX2Fzc2VydCAoY29udGV4dC0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9WSURFTyk7CisgIHZpZGVvY29udGV4dCA9IChHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICopIGNvbnRleHQ7CisKKyAgLyogZ3N0IC0+IG1hdHJvc2thIElEJ2luZyAqLworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBtaW1ldHlwZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHN0cnVjdHVyZSk7CisKKyAgaW50ZXJsYWNlX21vZGUgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImludGVybGFjZS1tb2RlIik7CisgIGlmIChpbnRlcmxhY2VfbW9kZSAhPSBOVUxMICYmIHN0cmNtcCAoaW50ZXJsYWNlX21vZGUsICJwcm9ncmVzc2l2ZSIpICE9IDApCisgICAgY29udGV4dC0+ZmxhZ3MgfD0gR1NUX01BVFJPU0tBX1ZJREVPVFJBQ0tfSU5URVJMQUNFRDsKKworICBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LXRoZW9yYSIpKSB7CisgICAgLyogd2UnbGwgZXh0cmFjdCB0aGUgZGV0YWlscyBsYXRlciBmcm9tIHRoZSB0aGVvcmEgaWRlbnRpZmljYXRpb24gaGVhZGVyICovCisgICAgZ290byBza2lwX2RldGFpbHM7CisgIH0KKworICAvKiBnZXQgZ2VuZXJhbCBwcm9wZXJ0aWVzICovCisgIC8qIHNwZWMgc2F5cyBpdCBpcyBtYW5kYXRvcnkgKi8KKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgIndpZHRoIiwgJndpZHRoKSB8fAorICAgICAgIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiaGVpZ2h0IiwgJmhlaWdodCkpCisgICAgZ290byByZWZ1c2VfY2FwczsKKworICB2aWRlb2NvbnRleHQtPnBpeGVsX3dpZHRoID0gd2lkdGg7CisgIHZpZGVvY29udGV4dC0+cGl4ZWxfaGVpZ2h0ID0gaGVpZ2h0OworCisgIGlmIChHU1RfTUFUUk9TS0FNVVhfUEFEX0NBU1QgKHBhZCktPmZyYW1lX2R1cmF0aW9uCisgICAgICAmJiBnc3Rfc3RydWN0dXJlX2dldF9mcmFjdGlvbiAoc3RydWN0dXJlLCAiZnJhbWVyYXRlIiwgJmZwc19uLCAmZnBzX2QpCisgICAgICAmJiBmcHNfbiA+IDApIHsKKyAgICBjb250ZXh0LT5kZWZhdWx0X2R1cmF0aW9uID0KKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoR1NUX1NFQ09ORCwgZnBzX2QsIGZwc19uKTsKKyAgICBHU1RfTE9HX09CSkVDVCAocGFkLCAiZGVmYXVsdCBkdXJhdGlvbiA9ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbikpOworICB9IGVsc2UgeworICAgIGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24gPSAwOworICB9CisgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9mcmFjdGlvbiAoc3RydWN0dXJlLCAicGl4ZWwtYXNwZWN0LXJhdGlvIiwKKyAgICAgICAgICAmcGl4ZWxfd2lkdGgsICZwaXhlbF9oZWlnaHQpKSB7CisgICAgaWYgKHBpeGVsX3dpZHRoID4gcGl4ZWxfaGVpZ2h0KSB7CisgICAgICB2aWRlb2NvbnRleHQtPmRpc3BsYXlfd2lkdGggPSB3aWR0aCAqIHBpeGVsX3dpZHRoIC8gcGl4ZWxfaGVpZ2h0OworICAgICAgdmlkZW9jb250ZXh0LT5kaXNwbGF5X2hlaWdodCA9IGhlaWdodDsKKyAgICB9IGVsc2UgaWYgKHBpeGVsX3dpZHRoIDwgcGl4ZWxfaGVpZ2h0KSB7CisgICAgICB2aWRlb2NvbnRleHQtPmRpc3BsYXlfd2lkdGggPSB3aWR0aDsKKyAgICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV9oZWlnaHQgPSBoZWlnaHQgKiBwaXhlbF9oZWlnaHQgLyBwaXhlbF93aWR0aDsKKyAgICB9IGVsc2UgeworICAgICAgdmlkZW9jb250ZXh0LT5kaXNwbGF5X3dpZHRoID0gMDsKKyAgICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV9oZWlnaHQgPSAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB2aWRlb2NvbnRleHQtPmRpc3BsYXlfd2lkdGggPSAwOworICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV9oZWlnaHQgPSAwOworICB9CisKKyAgLyogQ29sbGVjdCBzdGVyZW9zY29waWMgaW5mbywgaWYgYW55ICovCisgIGlmICgocyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAibXVsdGl2aWV3LW1vZGUiKSkpCisgICAgdmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfbW9kZSA9CisgICAgICAgIGdzdF92aWRlb19tdWx0aXZpZXdfbW9kZV9mcm9tX2NhcHNfc3RyaW5nIChzKTsKKyAgZ3N0X3N0cnVjdHVyZV9nZXRfZmxhZ3NldCAoc3RydWN0dXJlLCAibXVsdGl2aWV3LWZsYWdzIiwgJm11bHRpdmlld19mbGFncywKKyAgICAgIE5VTEwpOworICB2aWRlb2NvbnRleHQtPm11bHRpdmlld19mbGFncyA9IG11bHRpdmlld19mbGFnczsKKworCitza2lwX2RldGFpbHM6CisKKyAgdmlkZW9jb250ZXh0LT5hc3JfbW9kZSA9IEdTVF9NQVRST1NLQV9BU1BFQ1RfUkFUSU9fTU9ERV9GUkVFOworICB2aWRlb2NvbnRleHQtPmZvdXJjYyA9IDA7CisKKyAgLyogVE9ETzogLSBjaGVjayBpZiB3ZSBoYW5kbGUgYWxsIGNvZGVjcyBieSB0aGUgc3BlYywgaS5lLiBjb2RlYyBwcml2YXRlCisgICAqICAgICAgICAgZGF0YSBhbmQgb3RoZXIgc2V0dGluZ3MKKyAgICogICAgICAgLSBhZGQgbmV3IGZvcm1hdHMKKyAgICovCisKKyAgLyogZXh0cmFjdCBjb2RlY19kYXRhLCBtYXkgdHVybiBvdXQgbmVlZGVkICovCisgIHZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImNvZGVjX2RhdGEiKTsKKyAgaWYgKHZhbHVlKQorICAgIGNvZGVjX2J1ZiA9IChHc3RCdWZmZXIgKikgZ3N0X3ZhbHVlX2dldF9idWZmZXIgKHZhbHVlKTsKKworICAvKiBmaW5kIHR5cGUgKi8KKyAgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC1yYXciKSkgeworICAgIGNvbnN0IGdjaGFyICpmc3RyOworICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LAorICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fVU5DT01QUkVTU0VEKTsKKyAgICBmc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJmb3JtYXQiKTsKKyAgICBpZiAoZnN0cikgeworICAgICAgaWYgKHN0cmxlbiAoZnN0cikgPT0gNCkKKyAgICAgICAgdmlkZW9jb250ZXh0LT5mb3VyY2MgPSBHU1RfU1RSX0ZPVVJDQyAoZnN0cik7CisgICAgICBlbHNlIGlmICghc3RyY21wIChmc3RyLCAiR1JBWTgiKSkKKyAgICAgICAgdmlkZW9jb250ZXh0LT5mb3VyY2MgPSBHU1RfTUFLRV9GT1VSQ0MgKCdZJywgJzgnLCAnMCcsICcwJyk7CisgICAgICBlbHNlIGlmICghc3RyY21wIChmc3RyLCAiQkdSIikpCisgICAgICAgIHZpZGVvY29udGV4dC0+Zm91cmNjID0gR1NUX01BS0VfRk9VUkNDICgnQicsICdHJywgJ1InLCAyNCk7CisgICAgICBlbHNlIGlmICghc3RyY21wIChmc3RyLCAiUkdCIikpCisgICAgICAgIHZpZGVvY29udGV4dC0+Zm91cmNjID0gR1NUX01BS0VfRk9VUkNDICgnUicsICdHJywgJ0InLCAyNCk7CisgICAgfQorICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC1odWZmeXV2IikgICAgICAvKiBNUy9WZlcgY29tcGF0aWJpbGl0eSBjYXNlcyAqLworICAgICAgfHwhc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtZGl2eCIpCisgICAgICB8fCAhc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtZHYiKQorICAgICAgfHwgIXN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LWgyNjMiKQorICAgICAgfHwgIXN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LW1zbXBlZyIpCisgICAgICB8fCAhc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtd212IikKKyAgICAgIHx8ICFzdHJjbXAgKG1pbWV0eXBlLCAiaW1hZ2UvanBlZyIpKSB7CisgICAgZ3N0X3JpZmZfc3RyZl92aWRzICpiaWg7CisgICAgZ2ludCBzaXplID0gc2l6ZW9mIChnc3RfcmlmZl9zdHJmX3ZpZHMpOworICAgIGd1aW50MzIgZm91cmNjID0gMDsKKworICAgIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtaHVmZnl1diIpKQorICAgICAgZm91cmNjID0gR1NUX01BS0VfRk9VUkNDICgnSCcsICdGJywgJ1knLCAnVScpOworICAgIGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC1kdiIpKQorICAgICAgZm91cmNjID0gR1NUX01BS0VfRk9VUkNDICgnRCcsICdWJywgJ1MnLCAnRCcpOworICAgIGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC1oMjYzIikpCisgICAgICBmb3VyY2MgPSBHU1RfTUFLRV9GT1VSQ0MgKCdIJywgJzInLCAnNicsICczJyk7CisgICAgZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LWRpdngiKSkgeworICAgICAgZ2ludCBkaXZ4dmVyc2lvbjsKKworICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJkaXZ4dmVyc2lvbiIsICZkaXZ4dmVyc2lvbik7CisgICAgICBzd2l0Y2ggKGRpdnh2ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICBmb3VyY2MgPSBHU1RfTUFLRV9GT1VSQ0MgKCdEJywgJ0knLCAnVicsICczJyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICBmb3VyY2MgPSBHU1RfTUFLRV9GT1VSQ0MgKCdEJywgJ0knLCAnVicsICdYJyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICBmb3VyY2MgPSBHU1RfTUFLRV9GT1VSQ0MgKCdEJywgJ1gnLCAnNScsICcwJyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtbXNtcGVnIikpIHsKKyAgICAgIGdpbnQgbXNtcGVndmVyc2lvbjsKKworICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJtc21wZWd2ZXJzaW9uIiwgJm1zbXBlZ3ZlcnNpb24pOworICAgICAgc3dpdGNoIChtc21wZWd2ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgNDE6CisgICAgICAgICAgZm91cmNjID0gR1NUX01BS0VfRk9VUkNDICgnTScsICdQJywgJ0cnLCAnNCcpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQyOgorICAgICAgICAgIGZvdXJjYyA9IEdTVF9NQUtFX0ZPVVJDQyAoJ00nLCAnUCcsICc0JywgJzInKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0MzoKKyAgICAgICAgICBnb3RvIG1zbXBlZzQzOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LXdtdiIpKSB7CisgICAgICBnaW50IHdtdnZlcnNpb247CisgICAgICBjb25zdCBnY2hhciAqZnN0cjsKKworICAgICAgZnN0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZm9ybWF0Iik7CisgICAgICBpZiAoZnN0ciAmJiBzdHJsZW4gKGZzdHIpID09IDQpIHsKKyAgICAgICAgZm91cmNjID0gR1NUX1NUUl9GT1VSQ0MgKGZzdHIpOworICAgICAgfSBlbHNlIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgIndtdnZlcnNpb24iLCAmd212dmVyc2lvbikpIHsKKyAgICAgICAgaWYgKHdtdnZlcnNpb24gPT0gMikgeworICAgICAgICAgIGZvdXJjYyA9IEdTVF9NQUtFX0ZPVVJDQyAoJ1cnLCAnTScsICdWJywgJzInKTsKKyAgICAgICAgfSBlbHNlIGlmICh3bXZ2ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICBmb3VyY2MgPSBHU1RfTUFLRV9GT1VSQ0MgKCdXJywgJ00nLCAnVicsICcxJyk7CisgICAgICAgIH0gZWxzZSBpZiAod212dmVyc2lvbiA9PSAzKSB7CisgICAgICAgICAgZm91cmNjID0gR1NUX01BS0VfRk9VUkNDICgnVycsICdNJywgJ1YnLCAnMycpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImltYWdlL2pwZWciKSkgeworICAgICAgZm91cmNjID0gR1NUX01BS0VfRk9VUkNDICgnTScsICdKJywgJ1AnLCAnRycpOworICAgIH0KKworICAgIGlmICghZm91cmNjKQorICAgICAgZ290byByZWZ1c2VfY2FwczsKKworICAgIGJpaCA9IGdfbmV3MCAoZ3N0X3JpZmZfc3RyZl92aWRzLCAxKTsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0xFICgmYmloLT5zaXplLCBzaXplKTsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0xFICgmYmloLT53aWR0aCwgdmlkZW9jb250ZXh0LT5waXhlbF93aWR0aCk7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoJmJpaC0+aGVpZ2h0LCB2aWRlb2NvbnRleHQtPnBpeGVsX2hlaWdodCk7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoJmJpaC0+Y29tcHJlc3Npb24sIGZvdXJjYyk7CisgICAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoJmJpaC0+cGxhbmVzLCAoZ3VpbnQxNikgMSk7CisgICAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoJmJpaC0+Yml0X2NudCwgKGd1aW50MTYpIDI0KTsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0xFICgmYmloLT5pbWFnZV9zaXplLCB2aWRlb2NvbnRleHQtPnBpeGVsX3dpZHRoICoKKyAgICAgICAgdmlkZW9jb250ZXh0LT5waXhlbF9oZWlnaHQgKiAzKTsKKworICAgIC8qIHByb2Nlc3MgY29kZWMgcHJpdmF0ZS9pbml0aWFsaXphdGlvbiBkYXRhLCBpZiBhbnkgKi8KKyAgICBpZiAoY29kZWNfYnVmKSB7CisgICAgICBzaXplICs9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGNvZGVjX2J1Zik7CisgICAgICBiaWggPSBnX3JlYWxsb2MgKGJpaCwgc2l6ZSk7CisgICAgICBHU1RfV1JJVEVfVUlOVDMyX0xFICgmYmloLT5zaXplLCBzaXplKTsKKyAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoY29kZWNfYnVmLCAwLAorICAgICAgICAgIChndWludDggKikgYmloICsgc2l6ZW9mIChnc3RfcmlmZl9zdHJmX3ZpZHMpLCAtMSk7CisgICAgfQorCisgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsCisgICAgICAgIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19WRldfRk9VUkNDKTsKKyAgICBnc3RfbWF0cm9za2FfbXV4X2ZyZWVfY29kZWNfcHJpdiAoY29udGV4dCk7CisgICAgY29udGV4dC0+Y29kZWNfcHJpdiA9IChncG9pbnRlcikgYmloOworICAgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSA9IHNpemU7CisgICAgY29udGV4dC0+ZHRzX29ubHkgPSBUUlVFOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC1oMjY0IikpIHsKKyAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwKKyAgICAgICAgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX01QRUc0X0FWQyk7CisgICAgZ3N0X21hdHJvc2thX211eF9mcmVlX2NvZGVjX3ByaXYgKGNvbnRleHQpOworICAgIC8qIENyZWF0ZSBhdmNDIGhlYWRlciAqLworICAgIGlmIChjb2RlY19idWYgIT0gTlVMTCkgeworICAgICAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoY29kZWNfYnVmKTsKKyAgICAgIGNvbnRleHQtPmNvZGVjX3ByaXYgPSBnX21hbGxvYzAgKGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSk7CisgICAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKGNvZGVjX2J1ZiwgMCwgY29udGV4dC0+Y29kZWNfcHJpdiwgLTEpOworICAgIH0KKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtaDI2NSIpKSB7CisgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsCisgICAgICAgIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19NUEVHSF9IRVZDKTsKKyAgICBnc3RfbWF0cm9za2FfbXV4X2ZyZWVfY29kZWNfcHJpdiAoY29udGV4dCk7CisgICAgLyogQ3JlYXRlIGh2Y0MgaGVhZGVyICovCisgICAgaWYgKGNvZGVjX2J1ZiAhPSBOVUxMKSB7CisgICAgICBjb250ZXh0LT5jb2RlY19wcml2X3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChjb2RlY19idWYpOworICAgICAgY29udGV4dC0+Y29kZWNfcHJpdiA9IGdfbWFsbG9jMCAoY29udGV4dC0+Y29kZWNfcHJpdl9zaXplKTsKKyAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoY29kZWNfYnVmLCAwLCBjb250ZXh0LT5jb2RlY19wcml2LCAtMSk7CisgICAgfQorICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC10aGVvcmEiKSkgeworICAgIGNvbnN0IEdWYWx1ZSAqc3RyZWFtaGVhZGVyOworCisgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19USEVPUkEpOworCisgICAgZ3N0X21hdHJvc2thX211eF9mcmVlX2NvZGVjX3ByaXYgKGNvbnRleHQpOworCisgICAgc3RyZWFtaGVhZGVyID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgInN0cmVhbWhlYWRlciIpOworICAgIGlmICghdGhlb3JhX3N0cmVhbWhlYWRlcl90b19jb2RlY2RhdGEgKHN0cmVhbWhlYWRlciwgY29udGV4dCkpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtdXgsIFNUUkVBTSwgTVVYLCAoTlVMTCksCisgICAgICAgICAgKCJ0aGVvcmEgc3RyZWFtIGhlYWRlcnMgbWlzc2luZyBvciBtYWxmb3JtZWQiKSk7CisgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtZGlyYWMiKSkgeworICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fRElSQUMpOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC12cDgiKSkgeworICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fVlA4KTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtdnA5IikpIHsKKyAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1ZQOSk7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LWF2MSIpKSB7CisgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19BVjEpOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8vbXBlZyIpKSB7CisgICAgZ2ludCBtcGVndmVyc2lvbjsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAibXBlZ3ZlcnNpb24iLCAmbXBlZ3ZlcnNpb24pOworICAgIHN3aXRjaCAobXBlZ3ZlcnNpb24pIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsCisgICAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFRzEpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsCisgICAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFRzIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsCisgICAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFRzRfQVNQKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKworICAgIC8qIGdsb2JhbCBoZWFkZXJzIG1heSBiZSBpbiBjb2RlYyBkYXRhICovCisgICAgaWYgKGNvZGVjX2J1ZiAhPSBOVUxMKSB7CisgICAgICBnc3RfbWF0cm9za2FfbXV4X2ZyZWVfY29kZWNfcHJpdiAoY29udGV4dCk7CisgICAgICBjb250ZXh0LT5jb2RlY19wcml2X3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChjb2RlY19idWYpOworICAgICAgY29udGV4dC0+Y29kZWNfcHJpdiA9IGdfbWFsbG9jMCAoY29udGV4dC0+Y29kZWNfcHJpdl9zaXplKTsKKyAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoY29kZWNfYnVmLCAwLCBjb250ZXh0LT5jb2RlY19wcml2LCAtMSk7CisgICAgfQorICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC1tc21wZWciKSkgeworICBtc21wZWc0MzoKKyAgICAvKiBjYW4gb25seSBtYWtlIGl0IGhlcmUgaWYgcHJlY2VkaW5nIGNhc2UgdmVyaWZpZWQgaXQgd2FzIHZlcnNpb24gMyAqLworICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LAorICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVNNUEVHNFYzKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtcG4tcmVhbHZpZGVvIikpIHsKKyAgICBnaW50IHJtdmVyc2lvbjsKKyAgICBjb25zdCBHVmFsdWUgKm1kcHJfZGF0YTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAicm12ZXJzaW9uIiwgJnJtdmVyc2lvbik7CisgICAgc3dpdGNoIChybXZlcnNpb24pIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsCisgICAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fUkVBTFZJREVPMSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwKKyAgICAgICAgICAgIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19SRUFMVklERU8yKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM6CisgICAgICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LAorICAgICAgICAgICAgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1JFQUxWSURFTzMpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsCisgICAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fUkVBTFZJREVPNCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byByZWZ1c2VfY2FwczsKKyAgICB9CisKKyAgICBtZHByX2RhdGEgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCAibWRwcl9kYXRhIik7CisgICAgaWYgKG1kcHJfZGF0YSAhPSBOVUxMKSB7CisgICAgICBndWludDggKnByaXZfZGF0YSA9IE5VTEw7CisgICAgICBndWludCBwcml2X2RhdGFfc2l6ZSA9IDA7CisKKyAgICAgIEdzdEJ1ZmZlciAqY29kZWNfZGF0YV9idWYgPSBnX3ZhbHVlX3BlZWtfcG9pbnRlciAobWRwcl9kYXRhKTsKKworICAgICAgcHJpdl9kYXRhX3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChjb2RlY19kYXRhX2J1Zik7CisgICAgICBwcml2X2RhdGEgPSBnX21hbGxvYzAgKHByaXZfZGF0YV9zaXplKTsKKworICAgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChjb2RlY19kYXRhX2J1ZiwgMCwgcHJpdl9kYXRhLCAtMSk7CisKKyAgICAgIGdzdF9tYXRyb3NrYV9tdXhfZnJlZV9jb2RlY19wcml2IChjb250ZXh0KTsKKyAgICAgIGNvbnRleHQtPmNvZGVjX3ByaXYgPSBwcml2X2RhdGE7CisgICAgICBjb250ZXh0LT5jb2RlY19wcml2X3NpemUgPSBwcml2X2RhdGFfc2l6ZTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtcHJvcmVzIikgPT0gMCkgeworICAgIGNvbnN0IGdjaGFyICp2YXJpYW50OworCisgICAgZ3N0X21hdHJvc2thX211eF9mcmVlX2NvZGVjX3ByaXYgKGNvbnRleHQpOworCisgICAgdmFyaWFudCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZm9ybWF0Iik7CisgICAgaWYgKCF2YXJpYW50IHx8ICFnX3N0cmNtcDAgKHZhcmlhbnQsICJzdGFuZGFyZCIpKQorICAgICAgY29udGV4dC0+Y29kZWNfcHJpdiA9IGdfc3RyZHVwICgiYXBjbiIpOworICAgIGVsc2UgaWYgKCFnX3N0cmNtcDAgKHZhcmlhbnQsICJocSIpKQorICAgICAgY29udGV4dC0+Y29kZWNfcHJpdiA9IGdfc3RyZHVwICgiYXBjaCIpOworICAgIGVsc2UgaWYgKCFnX3N0cmNtcDAgKHZhcmlhbnQsICJsdCIpKQorICAgICAgY29udGV4dC0+Y29kZWNfcHJpdiA9IGdfc3RyZHVwICgiYXBjcyIpOworICAgIGVsc2UgaWYgKCFnX3N0cmNtcDAgKHZhcmlhbnQsICJwcm94eSIpKQorICAgICAgY29udGV4dC0+Y29kZWNfcHJpdiA9IGdfc3RyZHVwICgiYXBjbyIpOworICAgIGVsc2UgaWYgKCFnX3N0cmNtcDAgKHZhcmlhbnQsICI0NDQ0IikpCisgICAgICBjb250ZXh0LT5jb2RlY19wcml2ID0gZ19zdHJkdXAgKCJhcDRoIik7CisgICAgZWxzZSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgIlVuaGFuZGxlZCBwcm9yZXMgZm9ybWF0OiAlcyIsIHZhcmlhbnQpOworCisgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKworICAgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSA9IHNpemVvZiAoZ3VpbnQzMik7CisgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19QUk9SRVMpOworICB9CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCityZWZ1c2VfY2FwczoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXV4LCAicGFkICVzIHJlZnVzZWQgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgICAgR1NUX1BBRF9OQU1FIChwYWQpLCBjYXBzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogTiA+IDAgdG8gZXhwZWN0IGEgcGFydGljdWxhciBudW1iZXIgb2YgaGVhZGVycywgbmVnYXRpdmUgaWYgdGhlCisgICBudW1iZXIgb2YgaGVhZGVycyBpcyB2YXJpYWJsZSAqLworc3RhdGljIGdib29sZWFuCit4aXBoTl9zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIChjb25zdCBHVmFsdWUgKiBzdHJlYW1oZWFkZXIsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBjb250ZXh0LCBHc3RCdWZmZXIgKiogcF9idWYwLCBpbnQgTikKK3sKKyAgR3N0QnVmZmVyICoqYnVmID0gTlVMTDsKKyAgR0FycmF5ICpidWZhcnI7CisgIGd1aW50OCAqcHJpdl9kYXRhOworICBndWludCBidWZpLCBpLCBvZmZzZXQsIHByaXZfZGF0YV9zaXplOworCisgIGlmIChzdHJlYW1oZWFkZXIgPT0gTlVMTCkKKyAgICBnb3RvIG5vX3N0cmVhbV9oZWFkZXJzOworCisgIGlmIChHX1ZBTFVFX1RZUEUgKHN0cmVhbWhlYWRlcikgIT0gR1NUX1RZUEVfQVJSQVkpCisgICAgZ290byB3cm9uZ190eXBlOworCisgIGJ1ZmFyciA9IGdfdmFsdWVfcGVla19wb2ludGVyIChzdHJlYW1oZWFkZXIpOworICBpZiAoYnVmYXJyLT5sZW4gPD0gMCB8fCBidWZhcnItPmxlbiA+IDI1NSkgICAgLyogYXQgbGVhc3Qgb25lIGhlYWRlciwgYW5kIGNvdW50IHN0b3JlZCBpbiBhIGJ5dGUgKi8KKyAgICBnb3RvIHdyb25nX2NvdW50OworICBpZiAoTiA+IDAgJiYgYnVmYXJyLT5sZW4gIT0gTikKKyAgICBnb3RvIHdyb25nX2NvdW50OworCisgIGNvbnRleHQtPnhpcGhfaGVhZGVyc190b19za2lwID0gYnVmYXJyLT5sZW47CisKKyAgYnVmID0gKEdzdEJ1ZmZlciAqKikgZ19tYWxsb2MwIChzaXplb2YgKEdzdEJ1ZmZlciAqKSAqIGJ1ZmFyci0+bGVuKTsKKyAgZm9yIChpID0gMDsgaSA8IGJ1ZmFyci0+bGVuOyBpKyspIHsKKyAgICBHVmFsdWUgKmJ1ZnZhbCA9ICZnX2FycmF5X2luZGV4IChidWZhcnIsIEdWYWx1ZSwgaSk7CisKKyAgICBpZiAoR19WQUxVRV9UWVBFIChidWZ2YWwpICE9IEdTVF9UWVBFX0JVRkZFUikgeworICAgICAgZ19mcmVlIChidWYpOworICAgICAgZ290byB3cm9uZ19jb250ZW50X3R5cGU7CisgICAgfQorCisgICAgYnVmW2ldID0gZ192YWx1ZV9wZWVrX3BvaW50ZXIgKGJ1ZnZhbCk7CisgIH0KKworICBwcml2X2RhdGFfc2l6ZSA9IDE7CisgIGlmIChidWZhcnItPmxlbiA+IDApIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmYXJyLT5sZW4gLSAxOyBpKyspIHsKKyAgICAgIHByaXZfZGF0YV9zaXplICs9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZltpXSkgLyAweGZmICsgMTsKKyAgICB9CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgYnVmYXJyLT5sZW47ICsraSkgeworICAgIHByaXZfZGF0YV9zaXplICs9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZltpXSk7CisgIH0KKworICBwcml2X2RhdGEgPSBnX21hbGxvYzAgKHByaXZfZGF0YV9zaXplKTsKKworICBwcml2X2RhdGFbMF0gPSBidWZhcnItPmxlbiAtIDE7CisgIG9mZnNldCA9IDE7CisKKyAgaWYgKGJ1ZmFyci0+bGVuID4gMCkgeworICAgIGZvciAoYnVmaSA9IDA7IGJ1ZmkgPCBidWZhcnItPmxlbiAtIDE7IGJ1ZmkrKykgeworICAgICAgZm9yIChpID0gMDsgaSA8IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZltidWZpXSkgLyAweGZmOyArK2kpIHsKKyAgICAgICAgcHJpdl9kYXRhW29mZnNldCsrXSA9IDB4ZmY7CisgICAgICB9CisgICAgICBwcml2X2RhdGFbb2Zmc2V0KytdID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmW2J1ZmldKSAlIDB4ZmY7CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGJ1ZmFyci0+bGVuOyArK2kpIHsKKyAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKGJ1ZltpXSwgMCwgcHJpdl9kYXRhICsgb2Zmc2V0LCAtMSk7CisgICAgb2Zmc2V0ICs9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZltpXSk7CisgIH0KKworICBnc3RfbWF0cm9za2FfbXV4X2ZyZWVfY29kZWNfcHJpdiAoY29udGV4dCk7CisgIGNvbnRleHQtPmNvZGVjX3ByaXYgPSBwcml2X2RhdGE7CisgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSA9IHByaXZfZGF0YV9zaXplOworCisgIGlmIChwX2J1ZjApCisgICAgKnBfYnVmMCA9IGdzdF9idWZmZXJfcmVmIChidWZbMF0pOworCisgIGdfZnJlZSAoYnVmKTsKKworICByZXR1cm4gVFJVRTsKKworLyogRVJST1JTICovCitub19zdHJlYW1faGVhZGVyczoKKyAgeworICAgIEdTVF9XQVJOSU5HICgicmVxdWlyZWQgc3RyZWFtaGVhZGVycyBtaXNzaW5nIGluIHNpbmsgY2FwcyEiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3dyb25nX3R5cGU6CisgIHsKKyAgICBHU1RfV0FSTklORyAoInN0cmVhbWhlYWRlcnMgYXJlIG5vdCBhIEdTVF9UWVBFX0FSUkFZLCBidXQgYSAlcyIsCisgICAgICAgIEdfVkFMVUVfVFlQRV9OQU1FIChzdHJlYW1oZWFkZXIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3dyb25nX2NvdW50OgorICB7CisgICAgR1NUX1dBUk5JTkcgKCJnb3QgJXUgc3RyZWFtaGVhZGVycywgbm90ICVkIGFzIGV4cGVjdGVkIiwgYnVmYXJyLT5sZW4sIE4pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQord3JvbmdfY29udGVudF90eXBlOgorICB7CisgICAgR1NUX1dBUk5JTkcgKCJzdHJlYW1oZWFkZXJzIGFycmF5IGRvZXMgbm90IGNvbnRhaW4gR3N0QnVmZmVycyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3ZvcmJpc19zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIChjb25zdCBHVmFsdWUgKiBzdHJlYW1oZWFkZXIsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBjb250ZXh0KQoreworICBHc3RCdWZmZXIgKmJ1ZjAgPSBOVUxMOworCisgIGlmICgheGlwaE5fc3RyZWFtaGVhZGVyX3RvX2NvZGVjZGF0YSAoc3RyZWFtaGVhZGVyLCBjb250ZXh0LCAmYnVmMCwgMykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChidWYwID09IE5VTEwgfHwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmMCkgPCAxICsgNiArIDQpIHsKKyAgICBHU1RfV0FSTklORyAoIkZpcnN0IHZvcmJpcyBoZWFkZXIgdG9vIHNtYWxsLCBpZ25vcmluZyIpOworICB9IGVsc2UgeworICAgIGlmIChnc3RfYnVmZmVyX21lbWNtcCAoYnVmMCwgMSwgInZvcmJpcyIsIDYpID09IDApIHsKKyAgICAgIEdzdE1hdHJvc2thVHJhY2tBdWRpb0NvbnRleHQgKmF1ZGlvY29udGV4dDsKKyAgICAgIEdzdE1hcEluZm8gbWFwOworICAgICAgZ3VpbnQ4ICpoZHI7CisKKyAgICAgIGdzdF9idWZmZXJfbWFwIChidWYwLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgaGRyID0gbWFwLmRhdGEgKyAxICsgNiArIDQ7CisgICAgICBhdWRpb2NvbnRleHQgPSAoR3N0TWF0cm9za2FUcmFja0F1ZGlvQ29udGV4dCAqKSBjb250ZXh0OworICAgICAgYXVkaW9jb250ZXh0LT5jaGFubmVscyA9IEdTVF9SRUFEX1VJTlQ4IChoZHIpOworICAgICAgYXVkaW9jb250ZXh0LT5zYW1wbGVyYXRlID0gR1NUX1JFQURfVUlOVDMyX0xFIChoZHIgKyAxKTsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZjAsICZtYXApOworICAgIH0KKyAgfQorCisgIGlmIChidWYwKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZjApOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3RoZW9yYV9zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIChjb25zdCBHVmFsdWUgKiBzdHJlYW1oZWFkZXIsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBjb250ZXh0KQoreworICBHc3RCdWZmZXIgKmJ1ZjAgPSBOVUxMOworCisgIGlmICgheGlwaE5fc3RyZWFtaGVhZGVyX3RvX2NvZGVjZGF0YSAoc3RyZWFtaGVhZGVyLCBjb250ZXh0LCAmYnVmMCwgMykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChidWYwID09IE5VTEwgfHwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmMCkgPCAxICsgNiArIDI2KSB7CisgICAgR1NUX1dBUk5JTkcgKCJGaXJzdCB0aGVvcmEgaGVhZGVyIHRvbyBzbWFsbCwgaWdub3JpbmciKTsKKyAgfSBlbHNlIGlmIChnc3RfYnVmZmVyX21lbWNtcCAoYnVmMCwgMCwgIlwyMDB0aGVvcmFcMDAzXDAwMiIsIDkpICE9IDApIHsKKyAgICBHU1RfV0FSTklORyAoIkZpcnN0IGhlYWRlciBub3QgYSB0aGVvcmEgaWRlbnRpZmljYXRpb24gaGVhZGVyLCBpZ25vcmluZyIpOworICB9IGVsc2UgeworICAgIEdzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQgKnZpZGVvY29udGV4dDsKKyAgICBndWludCBmcHNfbnVtLCBmcHNfZGVub20sIHBhcl9udW0sIHBhcl9kZW5vbTsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBndWludDggKmhkcjsKKworICAgIGdzdF9idWZmZXJfbWFwIChidWYwLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIGhkciA9IG1hcC5kYXRhICsgMSArIDYgKyAzICsgMiArIDI7CisKKyAgICB2aWRlb2NvbnRleHQgPSAoR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCAqKSBjb250ZXh0OworICAgIHZpZGVvY29udGV4dC0+cGl4ZWxfd2lkdGggPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGhkcikgPj4gODsKKyAgICB2aWRlb2NvbnRleHQtPnBpeGVsX2hlaWdodCA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoaGRyICsgMykgPj4gODsKKyAgICBoZHIgKz0gMyArIDMgKyAxICsgMTsKKyAgICBmcHNfbnVtID0gR1NUX1JFQURfVUlOVDMyX0JFIChoZHIpOworICAgIGZwc19kZW5vbSA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoaGRyICsgNCk7CisgICAgY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbiA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKEdTVF9TRUNPTkQsCisgICAgICAgIGZwc19kZW5vbSwgZnBzX251bSk7CisgICAgaGRyICs9IDQgKyA0OworICAgIHBhcl9udW0gPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGhkcikgPj4gODsKKyAgICBwYXJfZGVub20gPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGhkciArIDMpID4+IDg7CisgICAgaWYgKHBhcl9udW0gPiAwICYmIHBhcl9kZW5vbSA+IDApIHsKKyAgICAgIGlmIChwYXJfbnVtID4gcGFyX2Rlbm9tKSB7CisgICAgICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV93aWR0aCA9CisgICAgICAgICAgICB2aWRlb2NvbnRleHQtPnBpeGVsX3dpZHRoICogcGFyX251bSAvIHBhcl9kZW5vbTsKKyAgICAgICAgdmlkZW9jb250ZXh0LT5kaXNwbGF5X2hlaWdodCA9IHZpZGVvY29udGV4dC0+cGl4ZWxfaGVpZ2h0OworICAgICAgfSBlbHNlIGlmIChwYXJfbnVtIDwgcGFyX2Rlbm9tKSB7CisgICAgICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV93aWR0aCA9IHZpZGVvY29udGV4dC0+cGl4ZWxfd2lkdGg7CisgICAgICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV9oZWlnaHQgPQorICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5waXhlbF9oZWlnaHQgKiBwYXJfZGVub20gLyBwYXJfbnVtOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmlkZW9jb250ZXh0LT5kaXNwbGF5X3dpZHRoID0gMDsKKyAgICAgICAgdmlkZW9jb250ZXh0LT5kaXNwbGF5X2hlaWdodCA9IDA7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV93aWR0aCA9IDA7CisgICAgICB2aWRlb2NvbnRleHQtPmRpc3BsYXlfaGVpZ2h0ID0gMDsKKyAgICB9CisKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYwLCAmbWFwKTsKKyAgfQorCisgIGlmIChidWYwKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZjApOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2thdGVfc3RyZWFtaGVhZGVyX3RvX2NvZGVjZGF0YSAoY29uc3QgR1ZhbHVlICogc3RyZWFtaGVhZGVyLAorICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICogY29udGV4dCkKK3sKKyAgR3N0QnVmZmVyICpidWYwID0gTlVMTDsKKworICBpZiAoIXhpcGhOX3N0cmVhbWhlYWRlcl90b19jb2RlY2RhdGEgKHN0cmVhbWhlYWRlciwgY29udGV4dCwgJmJ1ZjAsIC0xKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGJ1ZjAgPT0gTlVMTCB8fCBnc3RfYnVmZmVyX2dldF9zaXplIChidWYwKSA8IDY0KSB7ICAgICAgICAvKiBLYXRlIElEIGhlYWRlciBpcyA2NCBieXRlcyAqLworICAgIEdTVF9XQVJOSU5HICgiRmlyc3Qga2F0ZSBoZWFkZXIgdG9vIHNtYWxsLCBpZ25vcmluZyIpOworICB9IGVsc2UgaWYgKGdzdF9idWZmZXJfbWVtY21wIChidWYwLCAwLCAiXDIwMGthdGVcMFwwXDAiLCA4KSAhPSAwKSB7CisgICAgR1NUX1dBUk5JTkcgKCJGaXJzdCBoZWFkZXIgbm90IGEga2F0ZSBpZGVudGlmaWNhdGlvbiBoZWFkZXIsIGlnbm9yaW5nIik7CisgIH0KKworICBpZiAoYnVmMCkKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYwKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitmbGFjX3N0cmVhbWhlYWRlcl90b19jb2RlY2RhdGEgKGNvbnN0IEdWYWx1ZSAqIHN0cmVhbWhlYWRlciwKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIGNvbnRleHQpCit7CisgIEdBcnJheSAqYnVmYXJyOworICBnaW50IGk7CisgIEdWYWx1ZSAqYnVmdmFsOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKworICBpZiAoc3RyZWFtaGVhZGVyID09IE5VTEwgfHwgR19WQUxVRV9UWVBFIChzdHJlYW1oZWFkZXIpICE9IEdTVF9UWVBFX0FSUkFZKSB7CisgICAgR1NUX1dBUk5JTkcgKCJObyBvciBpbnZhbGlkIHN0cmVhbWhlYWRlciBmaWVsZCBpbiB0aGUgY2FwcyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGJ1ZmFyciA9IGdfdmFsdWVfcGVla19wb2ludGVyIChzdHJlYW1oZWFkZXIpOworICBpZiAoYnVmYXJyLT5sZW4gPCAyKSB7CisgICAgR1NUX1dBUk5JTkcgKCJUb28gZmV3IGhlYWRlcnMgaW4gc3RyZWFtaGVhZGVyIGZpZWxkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgY29udGV4dC0+eGlwaF9oZWFkZXJzX3RvX3NraXAgPSBidWZhcnItPmxlbiArIDE7CisKKyAgYnVmdmFsID0gJmdfYXJyYXlfaW5kZXggKGJ1ZmFyciwgR1ZhbHVlLCAwKTsKKyAgaWYgKEdfVkFMVUVfVFlQRSAoYnVmdmFsKSAhPSBHU1RfVFlQRV9CVUZGRVIpIHsKKyAgICBHU1RfV0FSTklORyAoInN0cmVhbWhlYWRlcnMgYXJyYXkgZG9lcyBub3QgY29udGFpbiBHc3RCdWZmZXJzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgYnVmZmVyID0gZ192YWx1ZV9wZWVrX3BvaW50ZXIgKGJ1ZnZhbCk7CisKKyAgLyogTmVlZCBhdCBsZWFzdCBPZ2dGTEFDIG1hcHBpbmcgaGVhZGVyLCBmTGFDIG1hcmtlciBhbmQgU1RSRUFNSU5GTyBibG9jayAqLworICBpZiAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSA8IDkgKyA0ICsgNCArIDM0CisgICAgICB8fCBnc3RfYnVmZmVyX21lbWNtcCAoYnVmZmVyLCAxLCAiRkxBQyIsIDQpICE9IDAKKyAgICAgIHx8IGdzdF9idWZmZXJfbWVtY21wIChidWZmZXIsIDksICJmTGFDIiwgNCkgIT0gMCkgeworICAgIEdTVF9XQVJOSU5HICgiSW52YWxpZCBzdHJlYW1oZWFkZXIgZm9yIEZMQUMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBnc3RfbWF0cm9za2FfbXV4X2ZyZWVfY29kZWNfcHJpdiAoY29udGV4dCk7CisgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcikgLSA5OworICBjb250ZXh0LT5jb2RlY19wcml2ID0gZ19tYWxsb2MgKGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSk7CisgIGdzdF9idWZmZXJfZXh0cmFjdCAoYnVmZmVyLCA5LCBjb250ZXh0LT5jb2RlY19wcml2LCAtMSk7CisKKyAgZm9yIChpID0gMTsgaSA8IGJ1ZmFyci0+bGVuOyBpKyspIHsKKyAgICBndWludCBvbGRfc2l6ZTsKKyAgICBidWZ2YWwgPSAmZ19hcnJheV9pbmRleCAoYnVmYXJyLCBHVmFsdWUsIGkpOworCisgICAgaWYgKEdfVkFMVUVfVFlQRSAoYnVmdmFsKSAhPSBHU1RfVFlQRV9CVUZGRVIpIHsKKyAgICAgIGdzdF9tYXRyb3NrYV9tdXhfZnJlZV9jb2RlY19wcml2IChjb250ZXh0KTsKKyAgICAgIEdTVF9XQVJOSU5HICgic3RyZWFtaGVhZGVycyBhcnJheSBkb2VzIG5vdCBjb250YWluIEdzdEJ1ZmZlcnMiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBidWZmZXIgPSBnX3ZhbHVlX3BlZWtfcG9pbnRlciAoYnVmdmFsKTsKKworICAgIG9sZF9zaXplID0gY29udGV4dC0+Y29kZWNfcHJpdl9zaXplOworICAgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSArPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpOworCisgICAgY29udGV4dC0+Y29kZWNfcHJpdiA9IGdfcmVhbGxvYyAoY29udGV4dC0+Y29kZWNfcHJpdiwKKyAgICAgICAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplKTsKKyAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKGJ1ZmZlciwgMCwKKyAgICAgICAgKGd1aW50OCAqKSBjb250ZXh0LT5jb2RlY19wcml2ICsgb2xkX3NpemUsIC0xKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3NwZWV4X3N0cmVhbWhlYWRlcl90b19jb2RlY2RhdGEgKGNvbnN0IEdWYWx1ZSAqIHN0cmVhbWhlYWRlciwKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIGNvbnRleHQpCit7CisgIEdBcnJheSAqYnVmYXJyOworICBHVmFsdWUgKmJ1ZnZhbDsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIGd1aW50IG9sZF9zaXplOworCisgIGlmIChzdHJlYW1oZWFkZXIgPT0gTlVMTCB8fCBHX1ZBTFVFX1RZUEUgKHN0cmVhbWhlYWRlcikgIT0gR1NUX1RZUEVfQVJSQVkpIHsKKyAgICBHU1RfV0FSTklORyAoIk5vIG9yIGludmFsaWQgc3RyZWFtaGVhZGVyIGZpZWxkIGluIHRoZSBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgYnVmYXJyID0gZ192YWx1ZV9wZWVrX3BvaW50ZXIgKHN0cmVhbWhlYWRlcik7CisgIGlmIChidWZhcnItPmxlbiAhPSAyKSB7CisgICAgR1NUX1dBUk5JTkcgKCJUb28gZmV3IGhlYWRlcnMgaW4gc3RyZWFtaGVhZGVyIGZpZWxkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgY29udGV4dC0+eGlwaF9oZWFkZXJzX3RvX3NraXAgPSBidWZhcnItPmxlbiArIDE7CisKKyAgYnVmdmFsID0gJmdfYXJyYXlfaW5kZXggKGJ1ZmFyciwgR1ZhbHVlLCAwKTsKKyAgaWYgKEdfVkFMVUVfVFlQRSAoYnVmdmFsKSAhPSBHU1RfVFlQRV9CVUZGRVIpIHsKKyAgICBHU1RfV0FSTklORyAoInN0cmVhbWhlYWRlcnMgYXJyYXkgZG9lcyBub3QgY29udGFpbiBHc3RCdWZmZXJzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgYnVmZmVyID0gZ192YWx1ZV9wZWVrX3BvaW50ZXIgKGJ1ZnZhbCk7CisKKyAgaWYgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcikgPCA4MAorICAgICAgfHwgZ3N0X2J1ZmZlcl9tZW1jbXAgKGJ1ZmZlciwgMCwgIlNwZWV4ICAgIiwgOCkgIT0gMCkgeworICAgIEdTVF9XQVJOSU5HICgiSW52YWxpZCBzdHJlYW1oZWFkZXIgZm9yIFNwZWV4Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgZ3N0X21hdHJvc2thX211eF9mcmVlX2NvZGVjX3ByaXYgKGNvbnRleHQpOworICBjb250ZXh0LT5jb2RlY19wcml2X3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpOworICBjb250ZXh0LT5jb2RlY19wcml2ID0gZ19tYWxsb2MgKGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSk7CisgIGdzdF9idWZmZXJfZXh0cmFjdCAoYnVmZmVyLCAwLCBjb250ZXh0LT5jb2RlY19wcml2LCAtMSk7CisKKyAgYnVmdmFsID0gJmdfYXJyYXlfaW5kZXggKGJ1ZmFyciwgR1ZhbHVlLCAxKTsKKworICBpZiAoR19WQUxVRV9UWVBFIChidWZ2YWwpICE9IEdTVF9UWVBFX0JVRkZFUikgeworICAgIGdzdF9tYXRyb3NrYV9tdXhfZnJlZV9jb2RlY19wcml2IChjb250ZXh0KTsKKyAgICBHU1RfV0FSTklORyAoInN0cmVhbWhlYWRlcnMgYXJyYXkgZG9lcyBub3QgY29udGFpbiBHc3RCdWZmZXJzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgYnVmZmVyID0gZ192YWx1ZV9wZWVrX3BvaW50ZXIgKGJ1ZnZhbCk7CisKKyAgb2xkX3NpemUgPSBjb250ZXh0LT5jb2RlY19wcml2X3NpemU7CisgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSArPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpOworICBjb250ZXh0LT5jb2RlY19wcml2ID0gZ19yZWFsbG9jIChjb250ZXh0LT5jb2RlY19wcml2LAorICAgICAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplKTsKKyAgZ3N0X2J1ZmZlcl9leHRyYWN0IChidWZmZXIsIDAsIChndWludDggKikgY29udGV4dC0+Y29kZWNfcHJpdiArIG9sZF9zaXplLCAtMSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorb3B1c19zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIChjb25zdCBHVmFsdWUgKiBzdHJlYW1oZWFkZXIsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBjb250ZXh0KQoreworICBHQXJyYXkgKmJ1ZmFycjsKKyAgR1ZhbHVlICpidWZ2YWw7CisgIEdzdEJ1ZmZlciAqYnVmOworCisgIGlmIChHX1ZBTFVFX1RZUEUgKHN0cmVhbWhlYWRlcikgIT0gR1NUX1RZUEVfQVJSQVkpCisgICAgZ290byB3cm9uZ190eXBlOworCisgIGJ1ZmFyciA9IGdfdmFsdWVfcGVla19wb2ludGVyIChzdHJlYW1oZWFkZXIpOworICBpZiAoYnVmYXJyLT5sZW4gIT0gMSAmJiBidWZhcnItPmxlbiAhPSAyKSAgICAgLyogb25lIGhlYWRlciwgYW5kIGNvdW50IHN0b3JlZCBpbiBhIGJ5dGUgKi8KKyAgICBnb3RvIHdyb25nX2NvdW50OworCisgIC8qIE9wdXMgaGVhZGVycyBhcmUgbm90IGluLWJhbmQgKi8KKyAgY29udGV4dC0+eGlwaF9oZWFkZXJzX3RvX3NraXAgPSAwOworCisgIGJ1ZnZhbCA9ICZnX2FycmF5X2luZGV4IChidWZhcnIsIEdWYWx1ZSwgMCk7CisgIGlmIChHX1ZBTFVFX1RZUEUgKGJ1ZnZhbCkgIT0gR1NUX1RZUEVfQlVGRkVSKSB7CisgICAgZ290byB3cm9uZ19jb250ZW50X3R5cGU7CisgIH0KKyAgYnVmID0gZ192YWx1ZV9wZWVrX3BvaW50ZXIgKGJ1ZnZhbCk7CisKKyAgZ3N0X21hdHJvc2thX211eF9mcmVlX2NvZGVjX3ByaXYgKGNvbnRleHQpOworCisgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisgIGNvbnRleHQtPmNvZGVjX3ByaXYgPSBnX21hbGxvYzAgKGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSk7CisgIGdzdF9idWZmZXJfZXh0cmFjdCAoYnVmLCAwLCBjb250ZXh0LT5jb2RlY19wcml2LCAtMSk7CisKKyAgY29udGV4dC0+Y29kZWNfZGVsYXkgPQorICAgICAgR1NUX1JFQURfVUlOVDE2X0xFICgoZ3VpbnQ4ICopIGNvbnRleHQtPmNvZGVjX3ByaXYgKyAxMCk7CisgIGNvbnRleHQtPmNvZGVjX2RlbGF5ID0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAoY29udGV4dC0+Y29kZWNfZGVsYXksIEdTVF9TRUNPTkQsIDQ4MDAwKTsKKyAgY29udGV4dC0+c2Vla19wcmVyb2xsID0gODAgKiBHU1RfTVNFQ09ORDsKKworICByZXR1cm4gVFJVRTsKKworLyogRVJST1JTICovCit3cm9uZ190eXBlOgorICB7CisgICAgR1NUX1dBUk5JTkcgKCJzdHJlYW1oZWFkZXJzIGFyZSBub3QgYSBHU1RfVFlQRV9BUlJBWSwgYnV0IGEgJXMiLAorICAgICAgICBHX1ZBTFVFX1RZUEVfTkFNRSAoc3RyZWFtaGVhZGVyKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit3cm9uZ19jb3VudDoKKyAgeworICAgIEdTVF9XQVJOSU5HICgiZ290ICV1IHN0cmVhbWhlYWRlcnMsIG5vdCAxIG9yIDIgYXMgZXhwZWN0ZWQiLCBidWZhcnItPmxlbik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit3cm9uZ19jb250ZW50X3R5cGU6CisgIHsKKyAgICBHU1RfV0FSTklORyAoInN0cmVhbWhlYWRlcnMgYXJyYXkgZG9lcyBub3QgY29udGFpbiBHc3RCdWZmZXJzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorb3B1c19tYWtlX2NvZGVjZGF0YSAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBjb250ZXh0LCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ3VpbnQzMiByYXRlOworICBndWludDggY2hhbm5lbHM7CisgIGd1aW50OCBjaGFubmVsX21hcHBpbmdfZmFtaWx5OworICBndWludDggc3RyZWFtX2NvdW50LCBjb3VwbGVkX2NvdW50LCBjaGFubmVsX21hcHBpbmdbMjU2XTsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIEdzdE1hcEluZm8gbWFwOworCisgIC8qIE9wdXMgaGVhZGVycyBhcmUgbm90IGluLWJhbmQgKi8KKyAgY29udGV4dC0+eGlwaF9oZWFkZXJzX3RvX3NraXAgPSAwOworCisgIGNvbnRleHQtPmNvZGVjX2RlbGF5ID0gMDsKKyAgY29udGV4dC0+c2Vla19wcmVyb2xsID0gODAgKiBHU1RfTVNFQ09ORDsKKworICBpZiAoIWdzdF9jb2RlY191dGlsc19vcHVzX3BhcnNlX2NhcHMgKGNhcHMsICZyYXRlLCAmY2hhbm5lbHMsCisgICAgICAgICAgJmNoYW5uZWxfbWFwcGluZ19mYW1pbHksICZzdHJlYW1fY291bnQsICZjb3VwbGVkX2NvdW50LAorICAgICAgICAgIGNoYW5uZWxfbWFwcGluZykpIHsKKyAgICBHU1RfV0FSTklORyAoIkZhaWxlZCB0byBwYXJzZSBjYXBzIGZvciBPcHVzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgYnVmZmVyID0KKyAgICAgIGdzdF9jb2RlY191dGlsc19vcHVzX2NyZWF0ZV9oZWFkZXIgKHJhdGUsIGNoYW5uZWxzLAorICAgICAgY2hhbm5lbF9tYXBwaW5nX2ZhbWlseSwgc3RyZWFtX2NvdW50LCBjb3VwbGVkX2NvdW50LCBjaGFubmVsX21hcHBpbmcsIDAsCisgICAgICAwKTsKKyAgaWYgKCFidWZmZXIpIHsKKyAgICBHU1RfV0FSTklORyAoIkZhaWxlZCB0byBjcmVhdGUgT3B1cyBoZWFkZXIgZnJvbSBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplID0gbWFwLnNpemU7CisgIGNvbnRleHQtPmNvZGVjX3ByaXYgPSBnX21hbGxvYyAoY29udGV4dC0+Y29kZWNfcHJpdl9zaXplKTsKKyAgbWVtY3B5IChjb250ZXh0LT5jb2RlY19wcml2LCBtYXAuZGF0YSwgbWFwLnNpemUpOworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIGdzdF9tYXRyb3NrYV9tdXhfYXVkaW9fcGFkX3NldGNhcHM6CisgKiBAcGFkOiBQYWQgd2hpY2ggZ290IHRoZSBjYXBzLgorICogQGNhcHM6IE5ldyBjYXBzLgorICoKKyAqIFNldGNhcHMgZnVuY3Rpb24gZm9yIGF1ZGlvIHNpbmsgcGFkLgorICoKKyAqIFJldHVybnM6ICVUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX211eF9hdWRpb19wYWRfc2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKmNvbnRleHQgPSBOVUxMOworICBHc3RNYXRyb3NrYVRyYWNrQXVkaW9Db250ZXh0ICphdWRpb2NvbnRleHQ7CisgIEdzdE1hdHJvc2thTXV4ICptdXg7CisgIEdzdE1hdHJvc2thUGFkICpjb2xsZWN0X3BhZDsKKyAgY29uc3QgZ2NoYXIgKm1pbWV0eXBlOworICBnaW50IHNhbXBsZXJhdGUgPSAwLCBjaGFubmVscyA9IDA7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBjb25zdCBHVmFsdWUgKmNvZGVjX2RhdGEgPSBOVUxMOworICBHc3RCdWZmZXIgKmJ1ZiA9IE5VTEw7CisgIGNvbnN0IGdjaGFyICpzdHJlYW1fZm9ybWF0ID0gTlVMTDsKKworICBtdXggPSBHU1RfTUFUUk9TS0FfTVVYIChHU1RfUEFEX1BBUkVOVCAocGFkKSk7CisKKyAgLyogZmluZCBjb250ZXh0ICovCisgIGNvbGxlY3RfcGFkID0gKEdzdE1hdHJvc2thUGFkICopIGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgZ19hc3NlcnQgKGNvbGxlY3RfcGFkKTsKKyAgY29udGV4dCA9IGNvbGxlY3RfcGFkLT50cmFjazsKKyAgZ19hc3NlcnQgKGNvbnRleHQpOworICBnX2Fzc2VydCAoY29udGV4dC0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9BVURJTyk7CisgIGF1ZGlvY29udGV4dCA9IChHc3RNYXRyb3NrYVRyYWNrQXVkaW9Db250ZXh0ICopIGNvbnRleHQ7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIG1pbWV0eXBlID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAoc3RydWN0dXJlKTsKKworICAvKiBnZW5lcmFsIHNldHVwICovCisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAicmF0ZSIsICZzYW1wbGVyYXRlKTsKKyAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsICZjaGFubmVscyk7CisKKyAgYXVkaW9jb250ZXh0LT5zYW1wbGVyYXRlID0gc2FtcGxlcmF0ZTsKKyAgYXVkaW9jb250ZXh0LT5jaGFubmVscyA9IGNoYW5uZWxzOworICBhdWRpb2NvbnRleHQtPmJpdGRlcHRoID0gMDsKKyAgY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbiA9IDA7CisKKyAgY29kZWNfZGF0YSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJjb2RlY19kYXRhIik7CisgIGlmIChjb2RlY19kYXRhKQorICAgIGJ1ZiA9IGdzdF92YWx1ZV9nZXRfYnVmZmVyIChjb2RlY19kYXRhKTsKKworICAvKiBUT0RPOiAtIGNoZWNrIGlmIHdlIGhhbmRsZSBhbGwgY29kZWNzIGJ5IHRoZSBzcGVjLCBpLmUuIGNvZGVjIHByaXZhdGUKKyAgICogICAgICAgICBkYXRhIGFuZCBvdGhlciBzZXR0aW5ncworICAgKiAgICAgICAtIGFkZCBuZXcgZm9ybWF0cworICAgKi8KKworICBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJhdWRpby9tcGVnIikpIHsKKyAgICBnaW50IG1wZWd2ZXJzaW9uID0gMDsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAibXBlZ3ZlcnNpb24iLCAmbXBlZ3ZlcnNpb24pOworICAgIHN3aXRjaCAobXBlZ3ZlcnNpb24pIHsKKyAgICAgIGNhc2UgMTp7CisgICAgICAgIGdpbnQgbGF5ZXI7CisgICAgICAgIGdpbnQgdmVyc2lvbiA9IDE7CisgICAgICAgIGdpbnQgc3BmOworCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAibGF5ZXIiLCAmbGF5ZXIpOworCisgICAgICAgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJtcGVnYXVkaW92ZXJzaW9uIiwgJnZlcnNpb24pKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsCisgICAgICAgICAgICAgICJVbmFibGUgdG8gZGV0ZXJtaW5lIE1QRUcgYXVkaW8gdmVyc2lvbiwgYXNzdW1pbmcgMSIpOworICAgICAgICAgIHZlcnNpb24gPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxheWVyID09IDEpCisgICAgICAgICAgc3BmID0gMzg0OworICAgICAgICBlbHNlIGlmIChsYXllciA9PSAyKQorICAgICAgICAgIHNwZiA9IDExNTI7CisgICAgICAgIGVsc2UgaWYgKHZlcnNpb24gPT0gMikKKyAgICAgICAgICBzcGYgPSA1NzY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzcGYgPSAxMTUyOworCisgICAgICAgIGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24gPQorICAgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChHU1RfU0VDT05ELCBzcGYsIGF1ZGlvY29udGV4dC0+c2FtcGxlcmF0ZSk7CisKKyAgICAgICAgc3dpdGNoIChsYXllcikgeworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LAorICAgICAgICAgICAgICAgIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19NUEVHMV9MMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwKKyAgICAgICAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fTVBFRzFfTDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsCisgICAgICAgICAgICAgICAgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX01QRUcxX0wzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAyOgorICAgICAgY2FzZSA0OgorICAgICAgICBzdHJlYW1fZm9ybWF0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJzdHJlYW0tZm9ybWF0Iik7CisgICAgICAgIC8qIGNoZWNrIHRoaXMgaXMgcmF3IGFhYyAqLworICAgICAgICBpZiAoc3RyZWFtX2Zvcm1hdCkgeworICAgICAgICAgIGlmIChzdHJjbXAgKHN0cmVhbV9mb3JtYXQsICJyYXciKSAhPSAwKSB7CisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgIkFBQyBzdHJlYW0tZm9ybWF0IG11c3QgYmUgJ3JhdycsIG5vdCAlcyIsCisgICAgICAgICAgICAgICAgc3RyZWFtX2Zvcm1hdCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXV4LCAiQUFDIHN0cmVhbS1mb3JtYXQgbm90IHNwZWNpZmllZCwgIgorICAgICAgICAgICAgICAiYXNzdW1pbmcgJ3JhdyciKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChidWYpIHsKKyAgICAgICAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwKKyAgICAgICAgICAgICAgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX0FBQyk7CisgICAgICAgICAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKyAgICAgICAgICBjb250ZXh0LT5jb2RlY19wcml2ID0gZ19tYWxsb2MgKGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChidWYsIDAsIGNvbnRleHQtPmNvZGVjX3ByaXYsCisgICAgICAgICAgICAgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAibm8gQUFDIGNvZGVjX2RhdGE7IG5vdCBwYWNrZXRpemVkIik7CisgICAgICAgICAgZ290byByZWZ1c2VfY2FwczsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gcmVmdXNlX2NhcHM7CisgICAgfQorICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1yYXciKSkgeworICAgIEdzdEF1ZGlvSW5mbyBpbmZvOworCisgICAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoJmluZm8pOworICAgIGlmICghZ3N0X2F1ZGlvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgY2FwcykpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwKKyAgICAgICAgICAiYnJva2VuIGNhcHMsIHJlamVjdGVkIGJ5IGdzdF9hdWRpb19pbmZvX2Zyb21fY2FwcyIpOworICAgICAgZ290byByZWZ1c2VfY2FwczsKKyAgICB9CisKKyAgICBzd2l0Y2ggKEdTVF9BVURJT19JTkZPX0ZPUk1BVCAoJmluZm8pKSB7CisgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfVTg6CisgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzE2QkU6CisgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzE2TEU6CisgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzI0QkU6CisgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzI0TEU6CisgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzMyQkU6CisgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzMyTEU6CisgICAgICAgIGlmIChHU1RfQVVESU9fSU5GT19XSURUSCAoJmluZm8pICE9IEdTVF9BVURJT19JTkZPX0RFUFRIICgmaW5mbykpIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJ3aWR0aCBtdXN0IGJlIHNhbWUgYXMgZGVwdGghIik7CisgICAgICAgICAgZ290byByZWZ1c2VfY2FwczsKKyAgICAgICAgfQorICAgICAgICBpZiAoR1NUX0FVRElPX0lORk9fSVNfQklHX0VORElBTiAoJmluZm8pKQorICAgICAgICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LAorICAgICAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUENNX0lOVF9CRSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwKKyAgICAgICAgICAgICAgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1BDTV9JTlRfTEUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GMzJMRToKKyAgICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GNjRMRToKKyAgICAgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsCisgICAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUENNX0ZMT0FUKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgIndyb25nIGZvcm1hdCBpbiByYXcgYXVkaW8gY2FwcyIpOworICAgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKworICAgIGF1ZGlvY29udGV4dC0+Yml0ZGVwdGggPSBHU1RfQVVESU9fSU5GT19XSURUSCAoJmluZm8pOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC12b3JiaXMiKSkgeworICAgIGNvbnN0IEdWYWx1ZSAqc3RyZWFtaGVhZGVyOworCisgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19WT1JCSVMpOworCisgICAgZ3N0X21hdHJvc2thX211eF9mcmVlX2NvZGVjX3ByaXYgKGNvbnRleHQpOworCisgICAgc3RyZWFtaGVhZGVyID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgInN0cmVhbWhlYWRlciIpOworICAgIGlmICghdm9yYmlzX3N0cmVhbWhlYWRlcl90b19jb2RlY2RhdGEgKHN0cmVhbWhlYWRlciwgY29udGV4dCkpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtdXgsIFNUUkVBTSwgTVVYLCAoTlVMTCksCisgICAgICAgICAgKCJ2b3JiaXMgc3RyZWFtIGhlYWRlcnMgbWlzc2luZyBvciBtYWxmb3JtZWQiKSk7CisgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtZmxhYyIpKSB7CisgICAgY29uc3QgR1ZhbHVlICpzdHJlYW1oZWFkZXI7CisKKyAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX0ZMQUMpOworCisgICAgZ3N0X21hdHJvc2thX211eF9mcmVlX2NvZGVjX3ByaXYgKGNvbnRleHQpOworCisgICAgc3RyZWFtaGVhZGVyID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgInN0cmVhbWhlYWRlciIpOworICAgIGlmICghZmxhY19zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIChzdHJlYW1oZWFkZXIsIGNvbnRleHQpKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAobXV4LCBTVFJFQU0sIE1VWCwgKE5VTEwpLAorICAgICAgICAgICgiZmxhYyBzdHJlYW0gaGVhZGVycyBtaXNzaW5nIG9yIG1hbGZvcm1lZCIpKTsKKyAgICAgIGdvdG8gcmVmdXNlX2NhcHM7CisgICAgfQorICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1zcGVleCIpKSB7CisgICAgY29uc3QgR1ZhbHVlICpzdHJlYW1oZWFkZXI7CisKKyAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1NQRUVYKTsKKyAgICBnc3RfbWF0cm9za2FfbXV4X2ZyZWVfY29kZWNfcHJpdiAoY29udGV4dCk7CisKKyAgICBzdHJlYW1oZWFkZXIgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCAic3RyZWFtaGVhZGVyIik7CisgICAgaWYgKCFzcGVleF9zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIChzdHJlYW1oZWFkZXIsIGNvbnRleHQpKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAobXV4LCBTVFJFQU0sIE1VWCwgKE5VTEwpLAorICAgICAgICAgICgic3BlZXggc3RyZWFtIGhlYWRlcnMgbWlzc2luZyBvciBtYWxmb3JtZWQiKSk7CisgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtb3B1cyIpKSB7CisgICAgY29uc3QgR1ZhbHVlICpzdHJlYW1oZWFkZXI7CisKKyAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX09QVVMpOworCisgICAgc3RyZWFtaGVhZGVyID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgInN0cmVhbWhlYWRlciIpOworICAgIGlmIChzdHJlYW1oZWFkZXIpIHsKKyAgICAgIGdzdF9tYXRyb3NrYV9tdXhfZnJlZV9jb2RlY19wcml2IChjb250ZXh0KTsKKyAgICAgIGlmICghb3B1c19zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIChzdHJlYW1oZWFkZXIsIGNvbnRleHQpKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtdXgsIFNUUkVBTSwgTVVYLCAoTlVMTCksCisgICAgICAgICAgICAoIm9wdXMgc3RyZWFtIGhlYWRlcnMgbWlzc2luZyBvciBtYWxmb3JtZWQiKSk7CisgICAgICAgIGdvdG8gcmVmdXNlX2NhcHM7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIG5vIHN0cmVhbWhlYWRlciwgYnV0IHdlIG5lZWQgdG8gaGF2ZSBvbmUsIHNvIHdlIG1ha2Ugb25lIHVwCisgICAgICAgICBiYXNlZCBvbiBjYXBzICovCisgICAgICBnc3RfbWF0cm9za2FfbXV4X2ZyZWVfY29kZWNfcHJpdiAoY29udGV4dCk7CisgICAgICBpZiAoIW9wdXNfbWFrZV9jb2RlY2RhdGEgKGNvbnRleHQsIGNhcHMpKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtdXgsIFNUUkVBTSwgTVVYLCAoTlVMTCksCisgICAgICAgICAgICAoIm9wdXMgc3RyZWFtIGhlYWRlcnMgbWlzc2luZyBvciBtYWxmb3JtZWQiKSk7CisgICAgICAgIGdvdG8gcmVmdXNlX2NhcHM7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1hYzMiKSkgeworICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fQUMzKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtZWFjMyIpKSB7CisgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19FQUMzKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtZHRzIikpIHsKKyAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX0RUUyk7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJhdWRpby94LXR0YSIpKSB7CisgICAgZ2ludCB3aWR0aDsKKworICAgIC8qIFRUQSBmcmFtZSBkdXJhdGlvbiAqLworICAgIGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24gPSAxLjA0NDg5Nzk1OTE4MzY3MzQ2OTM5ICogR1NUX1NFQ09ORDsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAid2lkdGgiLCAmd2lkdGgpOworICAgIGF1ZGlvY29udGV4dC0+Yml0ZGVwdGggPSB3aWR0aDsKKyAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1RUQSk7CisKKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtcG4tcmVhbGF1ZGlvIikpIHsKKyAgICBnaW50IHJhdmVyc2lvbjsKKyAgICBjb25zdCBHVmFsdWUgKm1kcHJfZGF0YTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAicmF2ZXJzaW9uIiwgJnJhdmVyc2lvbik7CisgICAgc3dpdGNoIChyYXZlcnNpb24pIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsCisgICAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUkVBTF8xNF80KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LAorICAgICAgICAgICAgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1JFQUxfMjhfOCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA4OgorICAgICAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwKKyAgICAgICAgICAgIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19SRUFMX0NPT0spOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gcmVmdXNlX2NhcHM7CisgICAgfQorCisgICAgbWRwcl9kYXRhID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgIm1kcHJfZGF0YSIpOworICAgIGlmIChtZHByX2RhdGEgIT0gTlVMTCkgeworICAgICAgZ3VpbnQ4ICpwcml2X2RhdGEgPSBOVUxMOworICAgICAgZ3VpbnQgcHJpdl9kYXRhX3NpemUgPSAwOworCisgICAgICBHc3RCdWZmZXIgKmNvZGVjX2RhdGFfYnVmID0gZ192YWx1ZV9wZWVrX3BvaW50ZXIgKG1kcHJfZGF0YSk7CisKKyAgICAgIHByaXZfZGF0YV9zaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoY29kZWNfZGF0YV9idWYpOworICAgICAgcHJpdl9kYXRhID0gZ19tYWxsb2MwIChwcml2X2RhdGFfc2l6ZSk7CisKKyAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoY29kZWNfZGF0YV9idWYsIDAsIHByaXZfZGF0YSwgLTEpOworCisgICAgICBnc3RfbWF0cm9za2FfbXV4X2ZyZWVfY29kZWNfcHJpdiAoY29udGV4dCk7CisKKyAgICAgIGNvbnRleHQtPmNvZGVjX3ByaXYgPSBwcml2X2RhdGE7CisgICAgICBjb250ZXh0LT5jb2RlY19wcml2X3NpemUgPSBwcml2X2RhdGFfc2l6ZTsKKyAgICB9CisKKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtd21hIikKKyAgICAgIHx8ICFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1hbGF3IikKKyAgICAgIHx8ICFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1tdWxhdyIpCisgICAgICB8fCAhc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtYWRwY20iKQorICAgICAgfHwgIXN0cmNtcCAobWltZXR5cGUsICJhdWRpby9HNzIyIikpIHsKKyAgICBndWludDggKmNvZGVjX3ByaXY7CisgICAgZ3VpbnQgY29kZWNfcHJpdl9zaXplOworICAgIGd1aW50MTYgZm9ybWF0ID0gMDsKKyAgICBnaW50IGJsb2NrX2FsaWduID0gMDsKKyAgICBnaW50IGJpdHJhdGUgPSAwOworCisgICAgaWYgKHNhbXBsZXJhdGUgPT0gMCB8fCBjaGFubmVscyA9PSAwKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgIk1pc3NpbmcgY2hhbm5lbHMvc2FtcGxlcmF0ZSBvbiBjYXBzIik7CisgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKworICAgIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtd21hIikpIHsKKyAgICAgIGdpbnQgd21hdmVyc2lvbjsKKyAgICAgIGdpbnQgZGVwdGg7CisKKyAgICAgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJ3bWF2ZXJzaW9uIiwgJndtYXZlcnNpb24pCisgICAgICAgICAgfHwgIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiYmxvY2tfYWxpZ24iLCAmYmxvY2tfYWxpZ24pCisgICAgICAgICAgfHwgIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiYml0cmF0ZSIsICZiaXRyYXRlKSkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgIk1pc3Npbmcgd21hdmVyc2lvbi9ibG9ja19hbGlnbi9iaXRyYXRlIgorICAgICAgICAgICAgIiBvbiBXTUEgY2FwcyIpOworICAgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKHdtYXZlcnNpb24pIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIGZvcm1hdCA9IEdTVF9SSUZGX1dBVkVfRk9STUFUX1dNQVYxOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgZm9ybWF0ID0gR1NUX1JJRkZfV0FWRV9GT1JNQVRfV01BVjI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICBmb3JtYXQgPSBHU1RfUklGRl9XQVZFX0ZPUk1BVF9XTUFWMzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgIlVuZXhwZWN0ZWQgV01BIHZlcnNpb246ICVkIiwgd21hdmVyc2lvbik7CisgICAgICAgICAgZ290byByZWZ1c2VfY2FwczsKKyAgICAgIH0KKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiZGVwdGgiLCAmZGVwdGgpKQorICAgICAgICBhdWRpb2NvbnRleHQtPmJpdGRlcHRoID0gZGVwdGg7CisgICAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtYWxhdyIpCisgICAgICAgIHx8ICFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1tdWxhdyIpKSB7CisgICAgICBhdWRpb2NvbnRleHQtPmJpdGRlcHRoID0gODsKKyAgICAgIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtYWxhdyIpKQorICAgICAgICBmb3JtYXQgPSBHU1RfUklGRl9XQVZFX0ZPUk1BVF9BTEFXOworICAgICAgZWxzZQorICAgICAgICBmb3JtYXQgPSBHU1RfUklGRl9XQVZFX0ZPUk1BVF9NVUxBVzsKKworICAgICAgYmxvY2tfYWxpZ24gPSBjaGFubmVsczsKKyAgICAgIGJpdHJhdGUgPSBibG9ja19hbGlnbiAqIHNhbXBsZXJhdGU7CisgICAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtYWRwY20iKSkgeworICAgICAgY29uc3QgY2hhciAqbGF5b3V0OworCisgICAgICBsYXlvdXQgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImxheW91dCIpOworICAgICAgaWYgKCFsYXlvdXQpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsICJNaXNzaW5nIGxheW91dCBvbiBhZHBjbSBjYXBzIik7CisgICAgICAgIGdvdG8gcmVmdXNlX2NhcHM7CisgICAgICB9CisKKyAgICAgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJibG9ja19hbGlnbiIsICZibG9ja19hbGlnbikpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsICJNaXNzaW5nIGJsb2NrX2FsaWduIG9uIGFkcGNtIGNhcHMiKTsKKyAgICAgICAgZ290byByZWZ1c2VfY2FwczsKKyAgICAgIH0KKworICAgICAgaWYgKCFzdHJjbXAgKGxheW91dCwgImR2aSIpKSB7CisgICAgICAgIGZvcm1hdCA9IEdTVF9SSUZGX1dBVkVfRk9STUFUX0RWSV9BRFBDTTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCAobGF5b3V0LCAiZzcyNiIpKSB7CisgICAgICAgIGZvcm1hdCA9IEdTVF9SSUZGX1dBVkVfRk9STUFUX0lUVV9HNzI2X0FEUENNOworICAgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiYml0cmF0ZSIsICZiaXRyYXRlKSkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXV4LCAiTWlzc2luZyBiaXRyYXRlIG9uIGFkcGNtIGc3MjYgY2FwcyIpOworICAgICAgICAgIGdvdG8gcmVmdXNlX2NhcHM7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXV4LCAiVW5rbm93biBsYXlvdXQgb24gYWRwY20gY2FwcyIpOworICAgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgICAgfQorCisgICAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL0c3MjIiKSkgeworICAgICAgZm9ybWF0ID0gR1NUX1JJRkZfV0FWRV9GT1JNQVRfQURQQ01fRzcyMjsKKyAgICB9CisgICAgZ19hc3NlcnQgKGZvcm1hdCAhPSAwKTsKKworICAgIGNvZGVjX3ByaXZfc2l6ZSA9IFdBVkVGT1JNQVRFWF9TSVpFOworICAgIGlmIChidWYpCisgICAgICBjb2RlY19wcml2X3NpemUgKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKworICAgIC8qIHNlcmlhbGl6ZSB3YXZlZm9ybWF0ZXggc3RydWN0dXJlICovCisgICAgY29kZWNfcHJpdiA9IGdfbWFsbG9jMCAoY29kZWNfcHJpdl9zaXplKTsKKyAgICBHU1RfV1JJVEVfVUlOVDE2X0xFIChjb2RlY19wcml2LCBmb3JtYXQpOworICAgIEdTVF9XUklURV9VSU5UMTZfTEUgKGNvZGVjX3ByaXYgKyAyLCBjaGFubmVscyk7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoY29kZWNfcHJpdiArIDQsIHNhbXBsZXJhdGUpOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGNvZGVjX3ByaXYgKyA4LCBiaXRyYXRlIC8gOCk7CisgICAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoY29kZWNfcHJpdiArIDEyLCBibG9ja19hbGlnbik7CisgICAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoY29kZWNfcHJpdiArIDE0LCAwKTsKKyAgICBpZiAoYnVmKQorICAgICAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoY29kZWNfcHJpdiArIDE2LCBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpKTsKKyAgICBlbHNlCisgICAgICBHU1RfV1JJVEVfVUlOVDE2X0xFIChjb2RlY19wcml2ICsgMTYsIDApOworCisgICAgLyogcHJvY2VzcyBjb2RlYyBwcml2YXRlL2luaXRpYWxpemF0aW9uIGRhdGEsIGlmIGFueSAqLworICAgIGlmIChidWYpIHsKKyAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoYnVmLCAwLAorICAgICAgICAgIChndWludDggKikgY29kZWNfcHJpdiArIFdBVkVGT1JNQVRFWF9TSVpFLCAtMSk7CisgICAgfQorCisgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19BQ00pOworICAgIGdzdF9tYXRyb3NrYV9tdXhfZnJlZV9jb2RlY19wcml2IChjb250ZXh0KTsKKyAgICBjb250ZXh0LT5jb2RlY19wcml2ID0gKGdwb2ludGVyKSBjb2RlY19wcml2OworICAgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSA9IGNvZGVjX3ByaXZfc2l6ZTsKKyAgfQorCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworcmVmdXNlX2NhcHM6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgInBhZCAlcyByZWZ1c2VkIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgIEdTVF9QQURfTkFNRSAocGFkKSwgY2Fwcyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qIHdlIHByb2JhYmx5IGRvbid0IGhhdmUgdGhlIGRhdGEgYXQgc3RhcnQsCisgKiBzbyBoYXZlIHRvIHJlc2VydmUgKGEgbWF4aW11bSkgc3BhY2UgdG8gd3JpdGUgdGhpcyBhdCB0aGUgZW5kLgorICogYml0IHNwYWN5LCBidXQgc29tZSBmb3JtYXRzIGNhbiBob2xkIHF1aXRlIHNvbWUgKi8KKyNkZWZpbmUgU1VCVElUTEVfTUFYX0NPREVDX1BSSVZBVEUgICAyMDQ4ICAgICAgIC8qIG11c3QgYmUgPiAxMjggKi8KKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X3N1YnRpdGxlX3BhZF9zZXRjYXBzOgorICogQHBhZDogUGFkIHdoaWNoIGdvdCB0aGUgY2Fwcy4KKyAqIEBjYXBzOiBOZXcgY2Fwcy4KKyAqCisgKiBTZXRjYXBzIGZ1bmN0aW9uIGZvciBzdWJ0aXRsZSBzaW5rIHBhZC4KKyAqCisgKiBSZXR1cm5zOiAlVFJVRSBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9tdXhfc3VidGl0bGVfcGFkX3NldGNhcHMgKEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIC8qIFRoZXJlIGlzIG5vdyAoYXQgbGVhc3QpIG9uZSBzdWNoIGFsZW1lbnQgKGthdGVlbmMpLCBhbmQgSSdtIGdvaW5nCisgICAgIHRvIGhhbmRsZSBpdCBoZXJlIGFuZCBjbGFpbSBpdCB3b3JrcyB3aGVuIGl0IGNhbiBiZSBwaXBlZCBiYWNrCisgICAgIHRocm91Z2ggR1N0cmVhbWVyIGFuZCBWTEMgKi8KKworICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqY29udGV4dCA9IE5VTEw7CisgIEdzdE1hdHJvc2thVHJhY2tTdWJ0aXRsZUNvbnRleHQgKnNjb250ZXh0OworICBHc3RNYXRyb3NrYU11eCAqbXV4OworICBHc3RNYXRyb3NrYVBhZCAqY29sbGVjdF9wYWQ7CisgIGNvbnN0IGdjaGFyICptaW1ldHlwZTsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGNvbnN0IEdWYWx1ZSAqdmFsdWUgPSBOVUxMOworICBHc3RCdWZmZXIgKmJ1ZiA9IE5VTEw7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgbXV4ID0gR1NUX01BVFJPU0tBX01VWCAoR1NUX1BBRF9QQVJFTlQgKHBhZCkpOworCisgIC8qIGZpbmQgY29udGV4dCAqLworICBjb2xsZWN0X3BhZCA9IChHc3RNYXRyb3NrYVBhZCAqKSBnc3RfcGFkX2dldF9lbGVtZW50X3ByaXZhdGUgKHBhZCk7CisgIGdfYXNzZXJ0IChjb2xsZWN0X3BhZCk7CisgIGNvbnRleHQgPSBjb2xsZWN0X3BhZC0+dHJhY2s7CisgIGdfYXNzZXJ0IChjb250ZXh0KTsKKyAgZ19hc3NlcnQgKGNvbnRleHQtPnR5cGUgPT0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfU1VCVElUTEUpOworICBzY29udGV4dCA9IChHc3RNYXRyb3NrYVRyYWNrU3VidGl0bGVDb250ZXh0ICopIGNvbnRleHQ7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIG1pbWV0eXBlID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAoc3RydWN0dXJlKTsKKworICAvKiBnZW5lcmFsIHNldHVwICovCisgIHNjb250ZXh0LT5jaGVja191dGY4ID0gMTsKKyAgc2NvbnRleHQtPmludmFsaWRfdXRmOCA9IDA7CisgIGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24gPSAwOworCisgIGlmICghc3RyY21wIChtaW1ldHlwZSwgInN1YnRpdGxlL3gta2F0ZSIpKSB7CisgICAgY29uc3QgR1ZhbHVlICpzdHJlYW1oZWFkZXI7CisKKyAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwKKyAgICAgICAgR1NUX01BVFJPU0tBX0NPREVDX0lEX1NVQlRJVExFX0tBVEUpOworCisgICAgZ3N0X21hdHJvc2thX211eF9mcmVlX2NvZGVjX3ByaXYgKGNvbnRleHQpOworCisgICAgc3RyZWFtaGVhZGVyID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgInN0cmVhbWhlYWRlciIpOworICAgIGlmICgha2F0ZV9zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIChzdHJlYW1oZWFkZXIsIGNvbnRleHQpKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAobXV4LCBTVFJFQU0sIE1VWCwgKE5VTEwpLAorICAgICAgICAgICgia2F0ZSBzdHJlYW0gaGVhZGVycyBtaXNzaW5nIG9yIG1hbGZvcm1lZCIpKTsKKyAgICAgIHJldCA9IEZBTFNFOworICAgICAgZ290byBleGl0OworICAgIH0KKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgInRleHQveC1yYXciKSkgeworICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LAorICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfVVRGOCk7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJhcHBsaWNhdGlvbi94LXNzYSIpKSB7CisgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9TVUJUSVRMRV9TU0EpOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAiYXBwbGljYXRpb24veC1hc3MiKSkgeworICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfQVNTKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImFwcGxpY2F0aW9uL3gtdXNmIikpIHsKKyAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1NVQlRJVExFX1VTRik7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJzdWJwaWN0dXJlL3gtZHZkIikpIHsKKyAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwKKyAgICAgICAgR1NUX01BVFJPU0tBX0NPREVDX0lEX1NVQlRJVExFX1ZPQlNVQik7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gRkFMU0U7CisgICAgZ290byBleGl0OworICB9CisKKyAgLyogbWF5YmUgc29tZSBwcml2YXRlIGRhdGEsIGUuZy4gdm9ic3ViICovCisgIHZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImNvZGVjX2RhdGEiKTsKKyAgaWYgKHZhbHVlKQorICAgIGJ1ZiA9IGdzdF92YWx1ZV9nZXRfYnVmZmVyICh2YWx1ZSk7CisgIGlmIChidWYgIT0gTlVMTCkgeworICAgIEdzdE1hcEluZm8gbWFwOworICAgIGd1aW50OCAqcHJpdl9kYXRhID0gTlVMTDsKKworICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgICBpZiAobWFwLnNpemUgPiBTVUJUSVRMRV9NQVhfQ09ERUNfUFJJVkFURSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsICJwYWQgJSIgR1NUX1BUUl9GT1JNQVQgIiBzdWJ0aXRsZSBwcml2YXRlIGRhdGEiCisgICAgICAgICAgIiBleGNlZWRlZCBtYXhpbXVtICglZCk7IGRpc2NhcmRpbmciLCBwYWQsCisgICAgICAgICAgU1VCVElUTEVfTUFYX0NPREVDX1BSSVZBVEUpOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIGdzdF9tYXRyb3NrYV9tdXhfZnJlZV9jb2RlY19wcml2IChjb250ZXh0KTsKKworICAgIHByaXZfZGF0YSA9IGdfbWFsbG9jMCAobWFwLnNpemUpOworICAgIG1lbWNweSAocHJpdl9kYXRhLCBtYXAuZGF0YSwgbWFwLnNpemUpOworICAgIGNvbnRleHQtPmNvZGVjX3ByaXYgPSBwcml2X2RhdGE7CisgICAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplID0gbWFwLnNpemU7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgImNvZGVjX2lkICVzLCBjb2RlYyBkYXRhIHNpemUgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICBHU1RfU1RSX05VTEwgKGNvbnRleHQtPmNvZGVjX2lkKSwgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplKTsKKworZXhpdDoKKworICByZXR1cm4gcmV0OworfQorCisKKy8qKgorICogZ3N0X21hdHJvc2thX211eF9yZXF1ZXN0X25ld19wYWQ6CisgKiBAZWxlbWVudDogI0dzdE1hdHJvc2thTXV4LgorICogQHRlbXBsOiAjR3N0UGFkVGVtcGxhdGUuCisgKiBAcGFkX25hbWU6IE5ldyBwYWQgbmFtZS4KKyAqCisgKiBSZXF1ZXN0IHBhZCBmdW5jdGlvbiBmb3Igc2luayB0ZW1wbGF0ZXMuCisgKgorICogUmV0dXJuczogTmV3ICNHc3RQYWQuCisgKi8KK3N0YXRpYyBHc3RQYWQgKgorZ3N0X21hdHJvc2thX211eF9yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsIGNvbnN0IGdjaGFyICogcmVxX25hbWUsIGNvbnN0IEdzdENhcHMgKiBjYXBzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChlbGVtZW50KTsKKyAgR3N0TWF0cm9za2FNdXggKm11eCA9IEdTVF9NQVRST1NLQV9NVVggKGVsZW1lbnQpOworICBHc3RNYXRyb3NrYVBhZCAqY29sbGVjdF9wYWQ7CisgIEdzdE1hdHJvc2thbXV4UGFkICpuZXdwYWQ7CisgIGdjaGFyICpuYW1lID0gTlVMTDsKKyAgY29uc3QgZ2NoYXIgKnBhZF9uYW1lID0gTlVMTDsKKyAgR3N0TWF0cm9za2FDYXBzRnVuYyBjYXBzZnVuYyA9IE5VTEw7CisgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjb250ZXh0ID0gTlVMTDsKKyAgZ2ludCBwYWRfaWQ7CisgIGdib29sZWFuIGxvY2tlZCA9IFRSVUU7CisgIGNvbnN0IGdjaGFyICppZCA9IE5VTEw7CisKKyAgaWYgKHRlbXBsID09IGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLCAiYXVkaW9fJXUiKSkgeworICAgIC8qIGRvbid0IG1peCBuYW1lZCBhbmQgdW5uYW1lZCBwYWRzLCBpZiB0aGUgcGFkIGFscmVhZHkgZXhpc3RzIHdlIGZhaWwgd2hlbgorICAgICAqIHRyeWluZyB0byBhZGQgaXQgKi8KKyAgICBpZiAocmVxX25hbWUgIT0gTlVMTCAmJiBzc2NhbmYgKHJlcV9uYW1lLCAiYXVkaW9fJXUiLCAmcGFkX2lkKSA9PSAxKSB7CisgICAgICBwYWRfbmFtZSA9IHJlcV9uYW1lOworICAgIH0gZWxzZSB7CisgICAgICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiYXVkaW9fJXUiLCBtdXgtPm51bV9hX3N0cmVhbXMrKyk7CisgICAgICBwYWRfbmFtZSA9IG5hbWU7CisgICAgfQorICAgIGNhcHNmdW5jID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9tdXhfYXVkaW9fcGFkX3NldGNhcHMpOworICAgIGNvbnRleHQgPSAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKikKKyAgICAgICAgZ19uZXcwIChHc3RNYXRyb3NrYVRyYWNrQXVkaW9Db250ZXh0LCAxKTsKKyAgICBjb250ZXh0LT50eXBlID0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQVVESU87CisgICAgY29udGV4dC0+bmFtZSA9IGdfc3RyZHVwICgiQXVkaW8iKTsKKyAgfSBlbHNlIGlmICh0ZW1wbCA9PSBnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywgInZpZGVvXyV1IikpIHsKKyAgICAvKiBkb24ndCBtaXggbmFtZWQgYW5kIHVubmFtZWQgcGFkcywgaWYgdGhlIHBhZCBhbHJlYWR5IGV4aXN0cyB3ZSBmYWlsIHdoZW4KKyAgICAgKiB0cnlpbmcgdG8gYWRkIGl0ICovCisgICAgaWYgKHJlcV9uYW1lICE9IE5VTEwgJiYgc3NjYW5mIChyZXFfbmFtZSwgInZpZGVvXyV1IiwgJnBhZF9pZCkgPT0gMSkgeworICAgICAgcGFkX25hbWUgPSByZXFfbmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInZpZGVvXyV1IiwgbXV4LT5udW1fdl9zdHJlYW1zKyspOworICAgICAgcGFkX25hbWUgPSBuYW1lOworICAgIH0KKyAgICBjYXBzZnVuYyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbWF0cm9za2FfbXV4X3ZpZGVvX3BhZF9zZXRjYXBzKTsKKyAgICBjb250ZXh0ID0gKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICopCisgICAgICAgIGdfbmV3MCAoR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCwgMSk7CisgICAgY29udGV4dC0+dHlwZSA9IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1ZJREVPOworICAgIGNvbnRleHQtPm5hbWUgPSBnX3N0cmR1cCAoIlZpZGVvIik7CisgIH0gZWxzZSBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJzdWJ0aXRsZV8ldSIpKSB7CisgICAgLyogZG9uJ3QgbWl4IG5hbWVkIGFuZCB1bm5hbWVkIHBhZHMsIGlmIHRoZSBwYWQgYWxyZWFkeSBleGlzdHMgd2UgZmFpbCB3aGVuCisgICAgICogdHJ5aW5nIHRvIGFkZCBpdCAqLworICAgIGlmIChyZXFfbmFtZSAhPSBOVUxMICYmIHNzY2FuZiAocmVxX25hbWUsICJzdWJ0aXRsZV8ldSIsICZwYWRfaWQpID09IDEpIHsKKyAgICAgIHBhZF9uYW1lID0gcmVxX25hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzdWJ0aXRsZV8ldSIsIG11eC0+bnVtX3Rfc3RyZWFtcysrKTsKKyAgICAgIHBhZF9uYW1lID0gbmFtZTsKKyAgICB9CisgICAgY2Fwc2Z1bmMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21hdHJvc2thX211eF9zdWJ0aXRsZV9wYWRfc2V0Y2Fwcyk7CisgICAgY29udGV4dCA9IChHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqKQorICAgICAgICBnX25ldzAgKEdzdE1hdHJvc2thVHJhY2tTdWJ0aXRsZUNvbnRleHQsIDEpOworICAgIGNvbnRleHQtPnR5cGUgPSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9TVUJUSVRMRTsKKyAgICBjb250ZXh0LT5uYW1lID0gZ19zdHJkdXAgKCJTdWJ0aXRsZSIpOworICAgIC8qIHNldGNhcHMgbWF5IG9ubHkgcHJvdmlkZSBwcm9wZXIgb25lIGEgbG90IGxhdGVyICovCisgICAgaWQgPSAiU19TVUJfVU5LTk9XTiI7CisgICAgbG9ja2VkID0gRkFMU0U7CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsICJUaGlzIGlzIG5vdCBvdXIgdGVtcGxhdGUhIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBuZXdwYWQgPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX01BVFJPU0tBTVVYX1BBRCwKKyAgICAgICJuYW1lIiwgcGFkX25hbWUsICJkaXJlY3Rpb24iLCB0ZW1wbC0+ZGlyZWN0aW9uLCAidGVtcGxhdGUiLCB0ZW1wbCwgTlVMTCk7CisKKyAgZ3N0X21hdHJvc2thbXV4X3BhZF9pbml0IChuZXdwYWQpOworICBjb2xsZWN0X3BhZCA9IChHc3RNYXRyb3NrYVBhZCAqKQorICAgICAgZ3N0X2NvbGxlY3RfcGFkc19hZGRfcGFkIChtdXgtPmNvbGxlY3QsIEdTVF9QQUQgKG5ld3BhZCksCisgICAgICBzaXplb2YgKEdzdE1hdHJvc2thbXV4UGFkKSwKKyAgICAgIChHc3RDb2xsZWN0RGF0YURlc3Ryb3lOb3RpZnkpIGdzdF9tYXRyb3NrYV9wYWRfZnJlZSwgbG9ja2VkKTsKKworICBjb2xsZWN0X3BhZC0+bXV4ID0gbXV4OworICBjb2xsZWN0X3BhZC0+dHJhY2sgPSBjb250ZXh0OworICBnc3RfbWF0cm9za2FfcGFkX3Jlc2V0IChjb2xsZWN0X3BhZCwgRkFMU0UpOworICBpZiAoaWQpCisgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbGxlY3RfcGFkLT50cmFjaywgaWQpOworICBjb2xsZWN0X3BhZC0+dHJhY2stPmR0c19vbmx5ID0gRkFMU0U7CisKKyAgY29sbGVjdF9wYWQtPmNhcHNmdW5jID0gY2Fwc2Z1bmM7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoR1NUX1BBRCAobmV3cGFkKSwgVFJVRSk7CisgIGlmICghZ3N0X2VsZW1lbnRfYWRkX3BhZCAoZWxlbWVudCwgR1NUX1BBRCAobmV3cGFkKSkpCisgICAgZ290byBwYWRfYWRkX2ZhaWxlZDsKKworICBnX2ZyZWUgKG5hbWUpOworCisgIG11eC0+bnVtX3N0cmVhbXMrKzsKKworICBHU1RfREVCVUdfT0JKRUNUIChuZXdwYWQsICJBZGRlZCBuZXcgcmVxdWVzdCBwYWQiKTsKKworICByZXR1cm4gR1NUX1BBRCAobmV3cGFkKTsKKworICAvKiBFUlJPUiBjYXNlcyAqLworcGFkX2FkZF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgIkFkZGluZyB0aGUgbmV3IHBhZCAnJXMnIGZhaWxlZCIsIHBhZF9uYW1lKTsKKyAgICBnX2ZyZWUgKG5hbWUpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKG5ld3BhZCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X3JlbGVhc2VfcGFkOgorICogQGVsZW1lbnQ6ICNHc3RNYXRyb3NrYU11eC4KKyAqIEBwYWQ6IFBhZCB0byByZWxlYXNlLgorICoKKyAqIFJlbGVhc2UgYSBwcmV2aW91c2x5IHJlcXVlc3RlZCBwYWQuCisqLworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9tdXhfcmVsZWFzZV9wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RQYWQgKiBwYWQpCit7CisgIEdzdE1hdHJvc2thTXV4ICptdXg7CisgIEdTTGlzdCAqd2FsazsKKworICBtdXggPSBHU1RfTUFUUk9TS0FfTVVYIChHU1RfUEFEX1BBUkVOVCAocGFkKSk7CisKKyAgZm9yICh3YWxrID0gbXV4LT5jb2xsZWN0LT5kYXRhOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdENvbGxlY3REYXRhICpjZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSB3YWxrLT5kYXRhOworICAgIEdzdE1hdHJvc2thUGFkICpjb2xsZWN0X3BhZCA9IChHc3RNYXRyb3NrYVBhZCAqKSBjZGF0YTsKKworICAgIGlmIChjZGF0YS0+cGFkID09IHBhZCkgeworICAgICAgLyoKKyAgICAgICAqIG9ic2VydmVkIGR1cmF0aW9uLCB0aGlzIHdpbGwgcmVtYWluIEdTVF9DTE9DS19USU1FX05PTkUKKyAgICAgICAqIG9ubHkgaWYgdGhlIHBhZCBpcyByZXNldHRlZCAKKyAgICAgICAqLworICAgICAgR3N0Q2xvY2tUaW1lIGNvbGxlY3RlZF9kdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisKKyAgICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoY29sbGVjdF9wYWQtPnN0YXJ0X3RzKSAmJgorICAgICAgICAgIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChjb2xsZWN0X3BhZC0+ZW5kX3RzKSkgeworICAgICAgICBjb2xsZWN0ZWRfZHVyYXRpb24gPQorICAgICAgICAgICAgR1NUX0NMT0NLX0RJRkYgKGNvbGxlY3RfcGFkLT5zdGFydF90cywgY29sbGVjdF9wYWQtPmVuZF90cyk7CisgICAgICB9CisKKyAgICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoY29sbGVjdGVkX2R1cmF0aW9uKQorICAgICAgICAgICYmIG11eC0+ZHVyYXRpb24gPCBjb2xsZWN0ZWRfZHVyYXRpb24pCisgICAgICAgIG11eC0+ZHVyYXRpb24gPSBjb2xsZWN0ZWRfZHVyYXRpb247CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGdzdF9jb2xsZWN0X3BhZHNfcmVtb3ZlX3BhZCAobXV4LT5jb2xsZWN0LCBwYWQpOworICBpZiAoZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoZWxlbWVudCwgcGFkKSkKKyAgICBtdXgtPm51bV9zdHJlYW1zLS07Cit9CisKKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X3RyYWNrX2hlYWRlcjoKKyAqIEBtdXg6ICNHc3RNYXRyb3NrYU11eAorICogQGNvbnRleHQ6IFRhY2sgY29udGV4dC4KKyAqCisgKiBXcml0ZSBhIHRyYWNrIGhlYWRlci4KKyAqLworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9tdXhfdHJhY2tfaGVhZGVyIChHc3RNYXRyb3NrYU11eCAqIG11eCwKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIGNvbnRleHQpCit7CisgIEdzdEVibWxXcml0ZSAqZWJtbCA9IG11eC0+ZWJtbF93cml0ZTsKKyAgZ3VpbnQ2NCBtYXN0ZXI7CisKKyAgLyogVE9ETzogY2hlY2sgaWYgZXZlcnl0aGluZyBuZWNlc3NhcnkgaXMgd3JpdHRlbiBhbmQgY2hlY2sgZGVmYXVsdCB2YWx1ZXMgKi8KKworICAvKiB0cmFjayB0eXBlIGdvZXMgYmVmb3JlIHRoZSB0eXBlLXNwZWNpZmljIHN0dWZmICovCisgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UUkFDS05VTUJFUiwgY29udGV4dC0+bnVtKTsKKyAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1RSQUNLVFlQRSwgY29udGV4dC0+dHlwZSk7CisKKyAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1RSQUNLVUlELCBjb250ZXh0LT51aWQpOworICBpZiAoY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbikgeworICAgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UUkFDS0RFRkFVTFREVVJBVElPTiwKKyAgICAgICAgY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbik7CisgIH0KKyAgaWYgKGNvbnRleHQtPmxhbmd1YWdlKSB7CisgICAgZ3N0X2VibWxfd3JpdGVfdXRmOCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1RSQUNLTEFOR1VBR0UsCisgICAgICAgIGNvbnRleHQtPmxhbmd1YWdlKTsKKyAgfQorCisgIC8qIEZJWE1FOiB1bnRpbCB3ZSBoYXZlIGEgbmljZSB3YXkgb2YgZ2V0dGluZyB0aGUgY29kZWNuYW1lCisgICAqIG91dCBvZiB0aGUgY2FwcywgSSdtIG5vdCBnb2luZyB0byBlbmFibGUgdGhpcy4gVG9vIG11Y2gKKyAgICogKHVzZWxlc3MsIGRvdWJsZSwgYm9yaW5nKSB3b3JrLi4uICovCisgIC8qIFRPRE86IFVzZSB2YWx1ZSBmcm9tIHRhZ3MgaWYgYW55ICovCisgIC8qZ3N0X2VibWxfd3JpdGVfdXRmOCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0NPREVDTkFNRSwKKyAgICAgY29udGV4dC0+Y29kZWNfbmFtZSk7ICovCisgIGdzdF9lYm1sX3dyaXRlX3V0ZjggKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UUkFDS05BTUUsIGNvbnRleHQtPm5hbWUpOworCisgIC8qIHR5cGUtc3BlY2lmaWMgc3R1ZmYgKi8KKyAgc3dpdGNoIChjb250ZXh0LT50eXBlKSB7CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9WSURFTzp7CisgICAgICBHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICp2aWRlb2NvbnRleHQgPQorICAgICAgICAgIChHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICopIGNvbnRleHQ7CisKKyAgICAgIG1hc3RlciA9IGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1RSQUNLVklERU8pOworICAgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1ZJREVPUElYRUxXSURUSCwKKyAgICAgICAgICB2aWRlb2NvbnRleHQtPnBpeGVsX3dpZHRoKTsKKyAgICAgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9WSURFT1BJWEVMSEVJR0hULAorICAgICAgICAgIHZpZGVvY29udGV4dC0+cGl4ZWxfaGVpZ2h0KTsKKyAgICAgIGlmICh2aWRlb2NvbnRleHQtPmRpc3BsYXlfd2lkdGggJiYgdmlkZW9jb250ZXh0LT5kaXNwbGF5X2hlaWdodCkgeworICAgICAgICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfVklERU9ESVNQTEFZV0lEVEgsCisgICAgICAgICAgICB2aWRlb2NvbnRleHQtPmRpc3BsYXlfd2lkdGgpOworICAgICAgICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfVklERU9ESVNQTEFZSEVJR0hULAorICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5kaXNwbGF5X2hlaWdodCk7CisgICAgICB9CisgICAgICBpZiAoY29udGV4dC0+ZmxhZ3MgJiBHU1RfTUFUUk9TS0FfVklERU9UUkFDS19JTlRFUkxBQ0VEKQorICAgICAgICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfVklERU9GTEFHSU5URVJMQUNFRCwgMSk7CisgICAgICBpZiAodmlkZW9jb250ZXh0LT5mb3VyY2MpIHsKKyAgICAgICAgZ3VpbnQzMiBmY2NfbGUgPSBHVUlOVDMyX1RPX0xFICh2aWRlb2NvbnRleHQtPmZvdXJjYyk7CisKKyAgICAgICAgZ3N0X2VibWxfd3JpdGVfYmluYXJ5IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfVklERU9DT0xPVVJTUEFDRSwKKyAgICAgICAgICAgIChncG9pbnRlcikgJiBmY2NfbGUsIDQpOworICAgICAgfQorICAgICAgaWYgKHZpZGVvY29udGV4dC0+bXVsdGl2aWV3X21vZGUgIT0gR1NUX1ZJREVPX01VTFRJVklFV19NT0RFX05PTkUpIHsKKyAgICAgICAgZ3VpbnQ2NCBzdGVyZW9fbW9kZSA9IDA7CisKKyAgICAgICAgc3dpdGNoICh2aWRlb2NvbnRleHQtPm11bHRpdmlld19tb2RlKSB7CisgICAgICAgICAgY2FzZSBHU1RfVklERU9fTVVMVElWSUVXX01PREVfTU9OTzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX01VTFRJVklFV19NT0RFX1NJREVfQllfU0lERToKKyAgICAgICAgICAgIGlmICh2aWRlb2NvbnRleHQtPm11bHRpdmlld19mbGFncyAmCisgICAgICAgICAgICAgICAgR1NUX1ZJREVPX01VTFRJVklFV19GTEFHU19SSUdIVF9WSUVXX0ZJUlNUKQorICAgICAgICAgICAgICBzdGVyZW9fbW9kZSA9IEdTVF9NQVRST1NLQV9TVEVSRU9fTU9ERV9TQlNfUkw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHN0ZXJlb19tb2RlID0gR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX1NCU19MUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX01VTFRJVklFV19NT0RFX1RPUF9CT1RUT006CisgICAgICAgICAgICBpZiAodmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfZmxhZ3MgJgorICAgICAgICAgICAgICAgIEdTVF9WSURFT19NVUxUSVZJRVdfRkxBR1NfUklHSFRfVklFV19GSVJTVCkKKyAgICAgICAgICAgICAgc3RlcmVvX21vZGUgPSBHU1RfTUFUUk9TS0FfU1RFUkVPX01PREVfVEJfUkw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHN0ZXJlb19tb2RlID0gR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX1RCX0xSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHU1RfVklERU9fTVVMVElWSUVXX01PREVfQ0hFQ0tFUkJPQVJEOgorICAgICAgICAgICAgaWYgKHZpZGVvY29udGV4dC0+bXVsdGl2aWV3X2ZsYWdzICYKKyAgICAgICAgICAgICAgICBHU1RfVklERU9fTVVMVElWSUVXX0ZMQUdTX1JJR0hUX1ZJRVdfRklSU1QpCisgICAgICAgICAgICAgIHN0ZXJlb19tb2RlID0gR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX0NIRUNLRVJfUkw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHN0ZXJlb19tb2RlID0gR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX0NIRUNLRVJfTFI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdTVF9WSURFT19NVUxUSVZJRVdfTU9ERV9GUkFNRV9CWV9GUkFNRToKKyAgICAgICAgICAgIGlmICh2aWRlb2NvbnRleHQtPm11bHRpdmlld19mbGFncyAmCisgICAgICAgICAgICAgICAgR1NUX1ZJREVPX01VTFRJVklFV19GTEFHU19SSUdIVF9WSUVXX0ZJUlNUKQorICAgICAgICAgICAgICBzdGVyZW9fbW9kZSA9IEdTVF9NQVRST1NLQV9TVEVSRU9fTU9ERV9GQkZfUkw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHN0ZXJlb19tb2RlID0gR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX0ZCRl9MUjsKKyAgICAgICAgICAgIC8qIEZJWE1FOiBJbiBmcmFtZS1ieS1mcmFtZSBtb2RlLCBsZWZ0L3JpZ2h0IGZyYW1lIGJ1ZmZlcnMgbmVlZCB0byBiZQorICAgICAgICAgICAgICogbGFjZWQgd2l0aGluIG9uZSBibG9jay4gU2VlIGh0dHA6Ly93d3cubWF0cm9za2Eub3JnL3RlY2huaWNhbC9zcGVjcy9pbmRleC5odG1sI1N0ZXJlb01vZGUgKi8KKyAgICAgICAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKG11eCwKKyAgICAgICAgICAgICAgICAiRnJhbWUtYnktZnJhbWUgc3RlcmVvc2NvcGljIG1vZGUgbm90IGZ1bGx5IGltcGxlbWVudGVkIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsCisgICAgICAgICAgICAgICAgIk11bHRpdmlldyBtb2RlICVkIG5vdCBzdXBwb3J0ZWQgaW4gTWF0cm9za2EvV2ViTSIsCisgICAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfbW9kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGVyZW9fbW9kZSAhPSAwKQorICAgICAgICAgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9WSURFT1NURVJFT01PREUsCisgICAgICAgICAgICAgIHN0ZXJlb19tb2RlKTsKKyAgICAgIH0KKyAgICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKGVibWwsIG1hc3Rlcik7CisKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQVVESU86eworICAgICAgR3N0TWF0cm9za2FUcmFja0F1ZGlvQ29udGV4dCAqYXVkaW9jb250ZXh0ID0KKyAgICAgICAgICAoR3N0TWF0cm9za2FUcmFja0F1ZGlvQ29udGV4dCAqKSBjb250ZXh0OworCisgICAgICBtYXN0ZXIgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UUkFDS0FVRElPKTsKKyAgICAgIGlmIChhdWRpb2NvbnRleHQtPnNhbXBsZXJhdGUgIT0gODAwMCkKKyAgICAgICAgZ3N0X2VibWxfd3JpdGVfZmxvYXQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9BVURJT1NBTVBMSU5HRlJFUSwKKyAgICAgICAgICAgIGF1ZGlvY29udGV4dC0+c2FtcGxlcmF0ZSk7CisgICAgICBpZiAoYXVkaW9jb250ZXh0LT5jaGFubmVscyAhPSAxKQorICAgICAgICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfQVVESU9DSEFOTkVMUywKKyAgICAgICAgICAgIGF1ZGlvY29udGV4dC0+Y2hhbm5lbHMpOworICAgICAgaWYgKGF1ZGlvY29udGV4dC0+Yml0ZGVwdGgpIHsKKyAgICAgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0FVRElPQklUREVQVEgsCisgICAgICAgICAgICBhdWRpb2NvbnRleHQtPmJpdGRlcHRoKTsKKyAgICAgIH0KKworICAgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgbWFzdGVyKTsKKworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9TVUJUSVRMRTp7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIGRvZXNuJ3QgbmVlZCB0eXBlLXNwZWNpZmljIGRhdGEgKi8KKyAgICAgIGJyZWFrOworICB9CisKKyAgZ3N0X2VibWxfd3JpdGVfYXNjaWkgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9DT0RFQ0lELCBjb250ZXh0LT5jb2RlY19pZCk7CisgIGlmIChjb250ZXh0LT5jb2RlY19wcml2KQorICAgIGdzdF9lYm1sX3dyaXRlX2JpbmFyeSAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0NPREVDUFJJVkFURSwKKyAgICAgICAgY29udGV4dC0+Y29kZWNfcHJpdiwgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplKTsKKworICBpZiAoY29udGV4dC0+c2Vla19wcmVyb2xsKSB7CisgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1NFRUtQUkVST0xMLAorICAgICAgICBjb250ZXh0LT5zZWVrX3ByZXJvbGwpOworICB9CisKKyAgaWYgKGNvbnRleHQtPmNvZGVjX2RlbGF5KSB7CisgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0NPREVDREVMQVksCisgICAgICAgIGNvbnRleHQtPmNvZGVjX2RlbGF5KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX211eF93cml0ZV9jaGFwdGVyX3RpdGxlIChjb25zdCBnY2hhciAqIHRpdGxlLCBHc3RFYm1sV3JpdGUgKiBlYm1sKQoreworICBndWludDY0IHRpdGxlX21hc3RlcjsKKworICB0aXRsZV9tYXN0ZXIgPQorICAgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUkRJU1BMQVkpOworCisgIGdzdF9lYm1sX3dyaXRlX3V0ZjggKGVibWwsIEdTVF9NQVRST1NLQV9JRF9DSEFQU1RSSU5HLCB0aXRsZSk7CisgIGdzdF9lYm1sX3dyaXRlX2FzY2lpIChlYm1sLCBHU1RfTUFUUk9TS0FfSURfQ0hBUExBTkdVQUdFLAorICAgICAgR1NUX01BVFJPU0tBX01VWF9DSEFQTEFORyk7CisKKyAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgdGl0bGVfbWFzdGVyKTsKK30KKworc3RhdGljIEdzdFRvY0VudHJ5ICoKK2dzdF9tYXRyb3NrYV9tdXhfd3JpdGVfY2hhcHRlciAoR3N0TWF0cm9za2FNdXggKiBtdXgsIEdzdFRvY0VudHJ5ICogZWRpdGlvbiwKKyAgICBHc3RUb2NFbnRyeSAqIGVudHJ5LCBHc3RFYm1sV3JpdGUgKiBlYm1sLCBndWludDY0ICogbWFzdGVyX2NoYXB0ZXJzLAorICAgIGd1aW50NjQgKiBtYXN0ZXJfZWRpdGlvbikKK3sKKyAgZ3VpbnQ2NCBtYXN0ZXJfY2hhcHRlcmF0b207CisgIEdMaXN0ICpjdXI7CisgIGd1aW50IGNvdW50LCBpOworICBnY2hhciAqdGl0bGU7CisgIGdpbnQ2NCBzdGFydCwgc3RvcDsKKyAgZ3VpbnQ2NCB1aWQ7CisgIGdjaGFyIHNfdWlkWzMyXTsKKyAgR3N0VG9jRW50cnkgKmludGVybmFsX2NoYXB0ZXIsICppbnRlcm5hbF9uZXN0ZWQ7CisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisKKyAgaWYgKEdfVU5MSUtFTFkgKG1hc3Rlcl9jaGFwdGVycyAhPSBOVUxMICYmICptYXN0ZXJfY2hhcHRlcnMgPT0gMCkpCisgICAgKm1hc3Rlcl9jaGFwdGVycyA9CisgICAgICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJTKTsKKworICBpZiAoR19VTkxJS0VMWSAobWFzdGVyX2VkaXRpb24gIT0gTlVMTCAmJiAqbWFzdGVyX2VkaXRpb24gPT0gMCkpIHsKKyAgICAvKiBjcmVhdGUgdWlkIGZvciB0aGUgcGFyZW50ICovCisgICAgKm1hc3Rlcl9lZGl0aW9uID0KKyAgICAgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfRURJVElPTkVOVFJZKTsKKworICAgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9FRElUSU9OVUlELAorICAgICAgICBnX2FzY2lpX3N0cnRvdWxsIChnc3RfdG9jX2VudHJ5X2dldF91aWQgKGVkaXRpb24pLCBOVUxMLCAxMCkpOworICAgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9FRElUSU9ORkxBR0hJRERFTiwgMCk7CisgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0VESVRJT05GTEFHREVGQVVMVCwgMCk7CisgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0VESVRJT05GTEFHT1JERVJFRCwgMCk7CisgIH0KKworICBnc3RfdG9jX2VudHJ5X2dldF9zdGFydF9zdG9wX3RpbWVzIChlbnRyeSwgJnN0YXJ0LCAmc3RvcCk7CisgIHRhZ3MgPSBnc3RfdG9jX2VudHJ5X2dldF90YWdzIChlbnRyeSk7CisgIGlmICh0YWdzICE9IE5VTEwpIHsKKyAgICB0YWdzID0gZ3N0X3RhZ19saXN0X2NvcHkgKHRhZ3MpOworICB9CisKKyAgLyogYnVpbGQgaW50ZXJuYWwgY2hhcHRlciAqLworICB1aWQgPSBnc3RfbWF0cm9za2FfbXV4X2NyZWF0ZV91aWQgKG11eCk7CisgIGdfc25wcmludGYgKHNfdWlkLCBzaXplb2YgKHNfdWlkKSwgIiUiIEdfR0lOVDY0X0ZPUk1BVCwgdWlkKTsKKyAgaW50ZXJuYWxfY2hhcHRlciA9IGdzdF90b2NfZW50cnlfbmV3IChHU1RfVE9DX0VOVFJZX1RZUEVfQ0hBUFRFUiwgc191aWQpOworCisgIC8qIFdyaXRlIHRoZSBjaGFwdGVyIGVudHJ5ICovCisgIG1hc3Rlcl9jaGFwdGVyYXRvbSA9CisgICAgICBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSQVRPTSk7CisKKyAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJVSUQsIHVpZCk7CisgIC8qIFN0b3JlIHRoZSB1c2VyIHByb3ZpZGVkIFVJRCBpbiB0aGUgQ2hhcHRlclN0cmluZ1VJRCAqLworICBnc3RfZWJtbF93cml0ZV91dGY4IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUlNUUklOR1VJRCwKKyAgICAgIGdzdF90b2NfZW50cnlfZ2V0X3VpZCAoZW50cnkpKTsKKyAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJUSU1FU1RBUlQsIHN0YXJ0KTsKKyAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJUSU1FU1RPUCwgc3RvcCk7CisgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSRkxBR0hJRERFTiwgMCk7CisgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSRkxBR0VOQUJMRUQsIDEpOworCisgIC8qIHdyaXRlIGN1cnJlbnQgQ2hhcHRlckRpc3BsYXlzIGJlZm9yZSB0aGUgbmVzdGVkIGNoYXB0ZXJzICovCisgIGlmIChHX0xJS0VMWSAodGFncyAhPSBOVUxMKSkgeworICAgIGNvdW50ID0gZ3N0X3RhZ19saXN0X2dldF90YWdfc2l6ZSAodGFncywgR1NUX1RBR19USVRMRSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgZ3N0X3RhZ19saXN0X2dldF9zdHJpbmdfaW5kZXggKHRhZ3MsIEdTVF9UQUdfVElUTEUsIGksICZ0aXRsZSk7CisgICAgICAvKiBGSVhNRTogaGFuZGxlIENoYXB0ZXJMYW5ndWFnZSBlbnRyaWVzICovCisgICAgICBnc3RfbWF0cm9za2FfbXV4X3dyaXRlX2NoYXB0ZXJfdGl0bGUgKHRpdGxlLCBlYm1sKTsKKyAgICAgIGdfZnJlZSAodGl0bGUpOworICAgIH0KKworICAgIC8qIHJlbW92ZSB0aXRsZSB0YWcgKi8KKyAgICBpZiAoR19MSUtFTFkgKGNvdW50ID4gMCkpCisgICAgICBnc3RfdGFnX2xpc3RfcmVtb3ZlX3RhZyAodGFncywgR1NUX1RBR19USVRMRSk7CisKKyAgICBnc3RfdG9jX2VudHJ5X3NldF90YWdzIChpbnRlcm5hbF9jaGFwdGVyLCB0YWdzKTsKKyAgfQorCisgIC8qIFdyaXRlIG5lc3RlZCBjaGFwdGVycyAqLworICBmb3IgKGN1ciA9IGdzdF90b2NfZW50cnlfZ2V0X3N1Yl9lbnRyaWVzIChlbnRyeSk7IGN1ciAhPSBOVUxMOworICAgICAgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgaW50ZXJuYWxfbmVzdGVkID0gZ3N0X21hdHJvc2thX211eF93cml0ZV9jaGFwdGVyIChtdXgsIE5VTEwsIGN1ci0+ZGF0YSwKKyAgICAgICAgZWJtbCwgTlVMTCwgTlVMTCk7CisKKyAgICBnc3RfdG9jX2VudHJ5X2FwcGVuZF9zdWJfZW50cnkgKGludGVybmFsX2NoYXB0ZXIsIGludGVybmFsX25lc3RlZCk7CisgIH0KKworICBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfZmluaXNoIChlYm1sLCBtYXN0ZXJfY2hhcHRlcmF0b20pOworCisgIHJldHVybiBpbnRlcm5hbF9jaGFwdGVyOworfQorCitzdGF0aWMgR3N0VG9jRW50cnkgKgorZ3N0X21hdHJvc2thX211eF93cml0ZV9jaGFwdGVyX2VkaXRpb24gKEdzdE1hdHJvc2thTXV4ICogbXV4LAorICAgIEdzdFRvY0VudHJ5ICogZWRpdGlvbiwgR0xpc3QgKiBjaGFwdGVycywgR3N0RWJtbFdyaXRlICogZWJtbCwKKyAgICBndWludDY0ICogbWFzdGVyX2NoYXB0ZXJzKQoreworICBndWludDY0IG1hc3Rlcl9lZGl0aW9uID0gMDsKKyAgZ2NoYXIgc191aWRbMzJdOworICBHTGlzdCAqY3VyOworICBHc3RUb2NFbnRyeSAqaW50ZXJuYWxfZWRpdGlvbiwgKmludGVybmFsX2NoYXB0ZXI7CisgIEdzdFRhZ0xpc3QgKnRhZ3MgPSBOVUxMOworCisgIGdfc25wcmludGYgKHNfdWlkLCBzaXplb2YgKHNfdWlkKSwgIiUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgIGdzdF9tYXRyb3NrYV9tdXhfY3JlYXRlX3VpZCAobXV4KSk7CisKKyAgaWYgKGVkaXRpb24gIT0gTlVMTCkgeworICAgIC8qIEVkaXRpb24gZW50cnkgZGVmaW5lZCwgZ2V0IGl0cyB0YWdzICovCisgICAgdGFncyA9IGdzdF90b2NfZW50cnlfZ2V0X3RhZ3MgKGVkaXRpb24pOworICAgIGlmICh0YWdzICE9IE5VTEwpIHsKKyAgICAgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfY29weSAodGFncyk7CisgICAgfQorICB9CisKKyAgaW50ZXJuYWxfZWRpdGlvbiA9IGdzdF90b2NfZW50cnlfbmV3IChHU1RfVE9DX0VOVFJZX1RZUEVfRURJVElPTiwgc191aWQpOworICBpZiAodGFncyAhPSBOVUxMKSB7CisgICAgZ3N0X3RvY19lbnRyeV9zZXRfdGFncyAoaW50ZXJuYWxfZWRpdGlvbiwgdGFncyk7CisgIH0KKworICBmb3IgKGN1ciA9IGdfbGlzdF9maXJzdCAoY2hhcHRlcnMpOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgaW50ZXJuYWxfY2hhcHRlciA9IGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfY2hhcHRlciAobXV4LCBpbnRlcm5hbF9lZGl0aW9uLAorICAgICAgICBjdXItPmRhdGEsIGVibWwsIG1hc3Rlcl9jaGFwdGVycywgJm1hc3Rlcl9lZGl0aW9uKTsKKworICAgIGdzdF90b2NfZW50cnlfYXBwZW5kX3N1Yl9lbnRyeSAoaW50ZXJuYWxfZWRpdGlvbiwgaW50ZXJuYWxfY2hhcHRlcik7CisgIH0KKworICBpZiAoR19MSUtFTFkgKG1hc3Rlcl9lZGl0aW9uICE9IDApKQorICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKGVibWwsIG1hc3Rlcl9lZGl0aW9uKTsKKworICByZXR1cm4gaW50ZXJuYWxfZWRpdGlvbjsKK30KKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X3N0YXJ0OgorICogQG11eDogI0dzdE1hdHJvc2thTXV4CisgKgorICogU3RhcnQgYSBuZXcgbWF0cm9za2EgZmlsZSAod3JpdGUgaGVhZGVycyBldGMuLi4pCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfbXV4X3N0YXJ0IChHc3RNYXRyb3NrYU11eCAqIG11eCwgR3N0TWF0cm9za2FQYWQgKiBmaXJzdF9wYWQsCisgICAgR3N0QnVmZmVyICogZmlyc3RfcGFkX2J1ZikKK3sKKyAgR3N0RWJtbFdyaXRlICplYm1sID0gbXV4LT5lYm1sX3dyaXRlOworICBjb25zdCBnY2hhciAqZG9jdHlwZTsKKyAgZ3VpbnQzMiBzZWVraGVhZF9pZFtdID0geyBHU1RfTUFUUk9TS0FfSURfU0VHTUVOVElORk8sCisgICAgR1NUX01BVFJPU0tBX0lEX1RSQUNLUywKKyAgICBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUlMsCisgICAgR1NUX01BVFJPU0tBX0lEX0NVRVMsCisgICAgR1NUX01BVFJPU0tBX0lEX1RBR1MsCisgICAgMAorICB9OworICBjb25zdCBnY2hhciAqbWVkaWFfdHlwZTsKKyAgZ2Jvb2xlYW4gYXVkaW9fb25seTsKKyAgZ3VpbnQ2NCBtYXN0ZXIsIGNoaWxkOworICBHU0xpc3QgKmNvbGxlY3RlZDsKKyAgaW50IGk7CisgIGd1aW50IHRyYWNrbnVtID0gMTsKKyAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uID0gMDsKKyAgZ3VpbnQzMiBzZWdtZW50X3VpZFs0XTsKKyAgR1RpbWVWYWwgdGltZSA9IHsgMCwgMCB9OworICBnY2hhciBzX2lkWzMyXTsKKyAgR3N0VG9jICp0b2M7CisKKyAgLyogaWYgbm90IHN0cmVhbWluZywgY2hlY2sgaWYgZG93bnN0cmVhbSBpcyBzZWVrYWJsZSAqLworICBpZiAoIW11eC0+ZWJtbF93cml0ZS0+c3RyZWFtYWJsZSkgeworICAgIGdib29sZWFuIHNlZWthYmxlOworICAgIEdzdFF1ZXJ5ICpxdWVyeTsKKworICAgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19zZWVraW5nIChHU1RfRk9STUFUX0JZVEVTKTsKKyAgICBpZiAoZ3N0X3BhZF9wZWVyX3F1ZXJ5IChtdXgtPnNyY3BhZCwgcXVlcnkpKSB7CisgICAgICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksIE5VTEwsICZzZWVrYWJsZSwgTlVMTCwgTlVMTCk7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKG11eCwgImRvd25zdHJlYW0gaXMgJXNzZWVrYWJsZSIsIHNlZWthYmxlID8gIiIgOiAibm90ICIpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBhc3N1bWUgc2Vla2luZyBpcyBub3Qgc3VwcG9ydGVkIGlmIHF1ZXJ5IG5vdCBoYW5kbGVkIGRvd25zdHJlYW0gKi8KKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXV4LCAiZG93bnN0cmVhbSBkaWQgbm90IGhhbmRsZSBzZWVraW5nIHF1ZXJ5Iik7CisgICAgICBzZWVrYWJsZSA9IEZBTFNFOworICAgIH0KKyAgICBpZiAoIXNlZWthYmxlKSB7CisgICAgICBtdXgtPmVibWxfd3JpdGUtPnN0cmVhbWFibGUgPSBUUlVFOworICAgICAgZ19vYmplY3Rfbm90aWZ5IChHX09CSkVDVCAobXV4KSwgInN0cmVhbWFibGUiKTsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXV4LCAiZG93bnN0cmVhbSBpcyBub3Qgc2Vla2FibGUsIGJ1dCAiCisgICAgICAgICAgInN0cmVhbWFibGU9ZmFsc2UuIFdpbGwgaWdub3JlIHRoYXQgYW5kIGNyZWF0ZSBzdHJlYW1hYmxlIG91dHB1dCAiCisgICAgICAgICAgImluc3RlYWQiKTsKKyAgICB9CisgICAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisgIH0KKworICAvKiBzdHJlYW0tc3RhcnQgKEZJWE1FOiBjcmVhdGUgaWQgYmFzZWQgb24gaW5wdXQgaWRzKSAqLworICBnX3NucHJpbnRmIChzX2lkLCBzaXplb2YgKHNfaWQpLCAibWF0cm9za2FtdXgtJTA4eCIsIGdfcmFuZG9tX2ludCAoKSk7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAobXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0IChzX2lkKSk7CisKKyAgLyogb3V0cHV0IGNhcHMgKi8KKyAgYXVkaW9fb25seSA9IG11eC0+bnVtX3Zfc3RyZWFtcyA9PSAwICYmIG11eC0+bnVtX2Ffc3RyZWFtcyA+IDA7CisgIGlmIChtdXgtPmlzX3dlYm0pIHsKKyAgICBtZWRpYV90eXBlID0gKGF1ZGlvX29ubHkpID8gImF1ZGlvL3dlYm0iIDogInZpZGVvL3dlYm0iOworICB9IGVsc2UgeworICAgIG1lZGlhX3R5cGUgPSAoYXVkaW9fb25seSkgPyAiYXVkaW8veC1tYXRyb3NrYSIgOiAidmlkZW8veC1tYXRyb3NrYSI7CisgIH0KKyAgZWJtbC0+Y2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKG1lZGlhX3R5cGUpOworICBnc3RfcGFkX3NldF9jYXBzIChtdXgtPnNyY3BhZCwgZWJtbC0+Y2Fwcyk7CisgIC8qIHdlIHN0YXJ0IHdpdGggYSBFQk1MIGhlYWRlciAqLworICBkb2N0eXBlID0gbXV4LT5kb2N0eXBlOworICBHU1RfSU5GT19PQkpFQ1QgKGVibWwsICJEb2NUeXBlOiAlcywgVmVyc2lvbjogJWQiLAorICAgICAgZG9jdHlwZSwgbXV4LT5kb2N0eXBlX3ZlcnNpb24pOworICBnc3RfZWJtbF93cml0ZV9oZWFkZXIgKGVibWwsIGRvY3R5cGUsIG11eC0+ZG9jdHlwZV92ZXJzaW9uKTsKKworICAvKiB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyIGlzIGNhY2hlZCAqLworICBnc3RfZWJtbF93cml0ZV9zZXRfY2FjaGUgKGVibWwsIDB4MTAwMCk7CisKKyAgLyogc3RhcnQgYSBzZWdtZW50ICovCisgIG11eC0+c2VnbWVudF9wb3MgPQorICAgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfU0VHTUVOVCk7CisgIG11eC0+c2VnbWVudF9tYXN0ZXIgPSBlYm1sLT5wb3M7CisKKyAgaWYgKCFtdXgtPmVibWxfd3JpdGUtPnN0cmVhbWFibGUpIHsKKyAgICAvKiBzZWVraGVhZCAodGFibGUgb2YgY29udGVudHMpIC0gd2Ugc2V0IHRoZSBwb3NpdGlvbnMgbGF0ZXIgKi8KKyAgICBtdXgtPnNlZWtoZWFkX3BvcyA9IGVibWwtPnBvczsKKyAgICBtYXN0ZXIgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9TRUVLSEVBRCk7CisgICAgZm9yIChpID0gMDsgc2Vla2hlYWRfaWRbaV0gIT0gMDsgaSsrKSB7CisgICAgICBjaGlsZCA9IGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1NFRUtFTlRSWSk7CisgICAgICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfU0VFS0lELCBzZWVraGVhZF9pZFtpXSk7CisgICAgICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfU0VFS1BPU0lUSU9OLCAtMSk7CisgICAgICBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfZmluaXNoIChlYm1sLCBjaGlsZCk7CisgICAgfQorICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKGVibWwsIG1hc3Rlcik7CisgIH0KKworICBpZiAobXV4LT5lYm1sX3dyaXRlLT5zdHJlYW1hYmxlKSB7CisgICAgY29uc3QgR3N0VGFnTGlzdCAqdGFnczsKKyAgICBnYm9vbGVhbiBoYXNfbWFpbl90YWdzOworCisgICAgLyogdGFncyAqLworICAgIHRhZ3MgPSBnc3RfdGFnX3NldHRlcl9nZXRfdGFnX2xpc3QgKEdTVF9UQUdfU0VUVEVSIChtdXgpKTsKKyAgICBoYXNfbWFpbl90YWdzID0gdGFncyAhPSBOVUxMICYmICFnc3RfbWF0cm9za2FfbXV4X3RhZ19saXN0X2lzX2VtcHR5ICh0YWdzKTsKKworICAgIGlmIChoYXNfbWFpbl90YWdzIHx8IGdzdF9tYXRyb3NrYV9tdXhfc3RyZWFtc19oYXZlX3RhZ3MgKG11eCkpIHsKKyAgICAgIGd1aW50NjQgbWFzdGVyX3RhZ3MsIG1hc3Rlcl90YWc7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgIldyaXRpbmcgdGFncyIpOworCisgICAgICBtdXgtPnRhZ3NfcG9zID0gZWJtbC0+cG9zOworICAgICAgbWFzdGVyX3RhZ3MgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UQUdTKTsKKyAgICAgIGlmIChoYXNfbWFpbl90YWdzKSB7CisgICAgICAgIG1hc3Rlcl90YWcgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UQUcpOworICAgICAgICBnc3RfdGFnX2xpc3RfZm9yZWFjaCAodGFncywgZ3N0X21hdHJvc2thX211eF93cml0ZV9zaW1wbGVfdGFnLCBlYm1sKTsKKyAgICAgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgbWFzdGVyX3RhZyk7CisgICAgICB9CisgICAgICBnc3RfbWF0cm9za2FfbXV4X3dyaXRlX3N0cmVhbXNfdGFncyAobXV4KTsKKyAgICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKGVibWwsIG1hc3Rlcl90YWdzKTsKKyAgICB9CisgIH0KKworICAvKiBzZWdtZW50IGluZm8gKi8KKyAgbXV4LT5pbmZvX3BvcyA9IGVibWwtPnBvczsKKyAgbWFzdGVyID0gZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfU0VHTUVOVElORk8pOworCisgIC8qIFdlYk0gZG9lcyBub3Qgc3VwcG9ydCBTZWdtZW50VUlEIGZpZWxkIG9uIFNlZ21lbnRJbmZvICovCisgIGlmICghbXV4LT5pc193ZWJtKSB7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgc2VnbWVudF91aWRbaV0gPSBnX3JhbmRvbV9pbnQgKCk7CisgICAgfQorICAgIGdzdF9lYm1sX3dyaXRlX2JpbmFyeSAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1NFR01FTlRVSUQsCisgICAgICAgIChndWludDggKikgc2VnbWVudF91aWQsIDE2KTsKKyAgfQorCisgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9USU1FQ09ERVNDQUxFLCBtdXgtPnRpbWVfc2NhbGUpOworICBtdXgtPmR1cmF0aW9uX3BvcyA9IGVibWwtPnBvczsKKyAgLyogZ2V0IGR1cmF0aW9uICovCisgIGlmICghbXV4LT5lYm1sX3dyaXRlLT5zdHJlYW1hYmxlKSB7CisgICAgZm9yIChjb2xsZWN0ZWQgPSBtdXgtPmNvbGxlY3QtPmRhdGE7IGNvbGxlY3RlZDsKKyAgICAgICAgY29sbGVjdGVkID0gZ19zbGlzdF9uZXh0IChjb2xsZWN0ZWQpKSB7CisgICAgICBHc3RNYXRyb3NrYVBhZCAqY29sbGVjdF9wYWQ7CisgICAgICBHc3RQYWQgKnRoZXBhZDsKKyAgICAgIGdpbnQ2NCB0cmFja2R1cmF0aW9uOworCisgICAgICBjb2xsZWN0X3BhZCA9IChHc3RNYXRyb3NrYVBhZCAqKSBjb2xsZWN0ZWQtPmRhdGE7CisgICAgICB0aGVwYWQgPSBjb2xsZWN0X3BhZC0+Y29sbGVjdC5wYWQ7CisKKyAgICAgIC8qIFF1ZXJ5IHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIHRyYWNrLiAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAodGhlcGFkLCAicXVlcnlpbmcgcGVlciBkdXJhdGlvbiIpOworICAgICAgaWYgKGdzdF9wYWRfcGVlcl9xdWVyeV9kdXJhdGlvbiAodGhlcGFkLCBHU1RfRk9STUFUX1RJTUUsICZ0cmFja2R1cmF0aW9uKSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh0aGVwYWQsICJkdXJhdGlvbjogJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAodHJhY2tkdXJhdGlvbikpOworICAgICAgICBpZiAodHJhY2tkdXJhdGlvbiAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FICYmIHRyYWNrZHVyYXRpb24gPiBkdXJhdGlvbikgeworICAgICAgICAgIGR1cmF0aW9uID0gKEdzdENsb2NrVGltZSkgdHJhY2tkdXJhdGlvbjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBnc3RfZWJtbF93cml0ZV9mbG9hdCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0RVUkFUSU9OLAorICAgICAgICBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIChkdXJhdGlvbikgLworICAgICAgICBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIChtdXgtPnRpbWVfc2NhbGUpKTsKKyAgfQorICBnc3RfZWJtbF93cml0ZV91dGY4IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfTVVYSU5HQVBQLAorICAgICAgIkdTdHJlYW1lciBtYXRyb3NrYW11eCB2ZXJzaW9uICIgUEFDS0FHRV9WRVJTSU9OKTsKKyAgaWYgKG11eC0+d3JpdGluZ19hcHAgJiYgbXV4LT53cml0aW5nX2FwcFswXSkgeworICAgIGdzdF9lYm1sX3dyaXRlX3V0ZjggKGVibWwsIEdTVF9NQVRST1NLQV9JRF9XUklUSU5HQVBQLCBtdXgtPndyaXRpbmdfYXBwKTsKKyAgfQorICBnX2dldF9jdXJyZW50X3RpbWUgKCZ0aW1lKTsKKyAgZ3N0X2VibWxfd3JpdGVfZGF0ZSAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0RBVEVVVEMsIHRpbWUudHZfc2VjKTsKKyAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgbWFzdGVyKTsKKworICAvKiB0cmFja3MgKi8KKyAgbXV4LT50cmFja3NfcG9zID0gZWJtbC0+cG9zOworICBtYXN0ZXIgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UUkFDS1MpOworCisgIGZvciAoY29sbGVjdGVkID0gbXV4LT5jb2xsZWN0LT5kYXRhOyBjb2xsZWN0ZWQ7CisgICAgICBjb2xsZWN0ZWQgPSBnX3NsaXN0X25leHQgKGNvbGxlY3RlZCkpIHsKKyAgICBHc3RNYXRyb3NrYVBhZCAqY29sbGVjdF9wYWQ7CisgICAgR3N0QnVmZmVyICpidWY7CisKKyAgICBjb2xsZWN0X3BhZCA9IChHc3RNYXRyb3NrYVBhZCAqKSBjb2xsZWN0ZWQtPmRhdGE7CisKKyAgICAvKiBUaGlzIHdpbGwgY2F1c2UgYW4gZXJyb3IgYXQgYSBsYXRlciB0aW1lICovCisgICAgaWYgKGNvbGxlY3RfcGFkLT50cmFjay0+Y29kZWNfaWQgPT0gTlVMTCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogRm9yIGF1ZGlvIHRyYWNrcywgdXNlIHRoZSBmaXJzdCBidWZmZXJzIGR1cmF0aW9uIGFzIHRoZSBkZWZhdWx0CisgICAgICogZHVyYXRpb24gaWYgd2UgZGlkbid0IGdldCBhbnkgYmV0dGVyIGlkZWEgZnJvbSB0aGUgY2FwcyBldmVudCBhbHJlYWR5CisgICAgICovCisgICAgaWYgKGNvbGxlY3RfcGFkLT50cmFjay0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9BVURJTyAmJgorICAgICAgICBjb2xsZWN0X3BhZC0+dHJhY2stPmRlZmF1bHRfZHVyYXRpb24gPT0gMCkgeworICAgICAgaWYgKGNvbGxlY3RfcGFkID09IGZpcnN0X3BhZCkKKyAgICAgICAgYnVmID0gZmlyc3RfcGFkX2J1ZiA/IGdzdF9idWZmZXJfcmVmIChmaXJzdF9wYWRfYnVmKSA6IE5VTEw7CisgICAgICBlbHNlCisgICAgICAgIGJ1ZiA9IGdzdF9jb2xsZWN0X3BhZHNfcGVlayAobXV4LT5jb2xsZWN0LCBjb2xsZWN0ZWQtPmRhdGEpOworCisgICAgICBpZiAoYnVmICYmIEdTVF9CVUZGRVJfRFVSQVRJT05fSVNfVkFMSUQgKGJ1ZikpCisgICAgICAgIGNvbGxlY3RfcGFkLT50cmFjay0+ZGVmYXVsdF9kdXJhdGlvbiA9CisgICAgICAgICAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpICsgY29sbGVjdF9wYWQtPnRyYWNrLT5jb2RlY19kZWxheTsKKyAgICAgIGlmIChidWYpCisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgfQorCisgICAgY29sbGVjdF9wYWQtPnRyYWNrLT5udW0gPSB0cmFja251bSsrOworICAgIGNoaWxkID0gZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfVFJBQ0tFTlRSWSk7CisgICAgZ3N0X21hdHJvc2thX211eF90cmFja19oZWFkZXIgKG11eCwgY29sbGVjdF9wYWQtPnRyYWNrKTsKKyAgICBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfZmluaXNoIChlYm1sLCBjaGlsZCk7CisgICAgLyogc29tZSByZW1haW5pbmcgcGFkL3RyYWNrIHNldHVwICovCisgICAgY29sbGVjdF9wYWQtPmRlZmF1bHRfZHVyYXRpb25fc2NhbGVkID0KKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChjb2xsZWN0X3BhZC0+dHJhY2stPmRlZmF1bHRfZHVyYXRpb24sCisgICAgICAgIDEsIG11eC0+dGltZV9zY2FsZSk7CisgIH0KKyAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgbWFzdGVyKTsKKworICAvKiBjaGFwdGVycyAqLworICB0b2MgPSBnc3RfdG9jX3NldHRlcl9nZXRfdG9jIChHU1RfVE9DX1NFVFRFUiAobXV4KSk7CisgIGlmICh0b2MgIT0gTlVMTCAmJiAhbXV4LT5lYm1sX3dyaXRlLT5zdHJlYW1hYmxlKSB7CisgICAgZ3VpbnQ2NCBtYXN0ZXJfY2hhcHRlcnMgPSAwOworICAgIEdzdFRvY0VudHJ5ICppbnRlcm5hbF9lZGl0aW9uOworICAgIEdMaXN0ICpjdXIsICpjaGFwdGVyczsKKworICAgIEdTVF9ERUJVRyAoIldyaXRpbmcgY2hhcHRlcnMiKTsKKworICAgIC8qIFRoZXJlIGFyZSB0d28gVUlEcyBmb3IgQ2hhcHRlcnM6CisgICAgICogLSBUaGUgQ2hhcHRlclVJRCBpcyBhIG1hbmRhdG9yeSB1bnNpZ25lZCBpbnRlZ2VyIHdoaWNoIGludGVybmFsbHkKKyAgICAgKiByZWZlcnMgdG8gYSBnaXZlbiBjaGFwdGVyLiBFeGNlcHQgZm9yIHRoZSB0aXRsZSAmIGxhbmd1YWdlIHdoaWNoIHVzZQorICAgICAqIGRlZGljYXRlZCBmaWVsZHMsIHRoaXMgVUlEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYWRkIHRhZ3MgdG8gdGhlIENoYXB0ZXIuCisgICAgICogVGhlIHRhZ3MgY29tZSBpbiBhIHNlcGFyYXRlIHNlY3Rpb24gb2YgdGhlIGNvbnRhaW5lci4KKyAgICAgKiAtIFRoZSBDaGFwdGVyU3RyaW5nVUlEIGlzIGFuIG9wdGlvbmFsIFVURi04IHN0cmluZyB3aGljaCBhbHNvIHVuaXF1ZWx5CisgICAgICogcmVmZXJzIHRvIGEgY2hhcHRlciBidXQgZnJvbSBhbiBleHRlcm5hbCBwZXJzcGVjdGl2ZS4gSXQgY2FuIGFjdCBhcyBhCisgICAgICogIldlYlZUVCBjdWUgaWRlbnRpZmllciIgd2hpY2ggImNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZSBhIHNwZWNpZmljIGN1ZSwKKyAgICAgKiBmb3IgZXhhbXBsZSBmcm9tIHNjcmlwdCBvciBDU1MiLgorICAgICAqCisgICAgICogVGhlIENoYXB0ZXJVSUQgd2lsbCBiZSBnZW5lcmF0ZWQgYW5kIGNoZWNrZWQgZm9yIHVuaWNpdHksIHdoaWxlIHRoZQorICAgICAqIENoYXB0ZXJTdHJpbmdVSUQgd2lsbCByZWNlaXZlIHRoZSB1c2VyIGRlZmluZWQgVUlELgorICAgICAqCisgICAgICogSW4gb3JkZXIgdG8gYmUgYWJsZSB0byByZWZlciB0byBjaGFwdGVycyBmcm9tIHRoZSB0YWdzIHNlY3Rpb24sCisgICAgICogd2UgbXVzdCBtYWludGFpbiBhbiBpbnRlcm5hbCBUb2MgdHJlZSB3aXRoIHRoZSBnZW5lcmF0ZWQgQ2hhcHRlclVJRAorICAgICAqIChzZWUgZ3N0X21hdHJvc2thX211eF93cml0ZV90b2NfZW50cnlfdGFncykgKi8KKworICAgIC8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBlZGl0aW9ucyBvciBjaGFwdGVycyBhdCB0aGUgcm9vdCBsZXZlbC4gKi8KKyAgICBjdXIgPSBnc3RfdG9jX2dldF9lbnRyaWVzICh0b2MpOworICAgIGlmIChjdXIgIT0gTlVMTCkgeworICAgICAgbXV4LT5jaGFwdGVyc19wb3MgPSBlYm1sLT5wb3M7CisKKyAgICAgIG11eC0+aW50ZXJuYWxfdG9jID0gZ3N0X3RvY19uZXcgKEdTVF9UT0NfU0NPUEVfR0xPQkFMKTsKKworICAgICAgaWYgKGdzdF90b2NfZW50cnlfZ2V0X2VudHJ5X3R5cGUgKGN1ci0+ZGF0YSkgPT0KKyAgICAgICAgICBHU1RfVE9DX0VOVFJZX1RZUEVfRURJVElPTikgeworICAgICAgICAvKiBFZGl0aW9ucyBhdCB0aGUgcm9vdCBsZXZlbCAqLworICAgICAgICBmb3IgKDsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICAgIGNoYXB0ZXJzID0gZ3N0X3RvY19lbnRyeV9nZXRfc3ViX2VudHJpZXMgKGN1ci0+ZGF0YSk7CisgICAgICAgICAgaW50ZXJuYWxfZWRpdGlvbiA9IGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfY2hhcHRlcl9lZGl0aW9uIChtdXgsCisgICAgICAgICAgICAgIGN1ci0+ZGF0YSwgY2hhcHRlcnMsIGVibWwsICZtYXN0ZXJfY2hhcHRlcnMpOworICAgICAgICAgIGdzdF90b2NfYXBwZW5kX2VudHJ5IChtdXgtPmludGVybmFsX3RvYywgaW50ZXJuYWxfZWRpdGlvbik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIENoYXB0ZXJzIGF0IHRoZSByb290IGxldmVsICovCisgICAgICAgIGludGVybmFsX2VkaXRpb24gPSBnc3RfbWF0cm9za2FfbXV4X3dyaXRlX2NoYXB0ZXJfZWRpdGlvbiAobXV4LAorICAgICAgICAgICAgTlVMTCwgY3VyLCBlYm1sLCAmbWFzdGVyX2NoYXB0ZXJzKTsKKyAgICAgICAgZ3N0X3RvY19hcHBlbmRfZW50cnkgKG11eC0+aW50ZXJuYWxfdG9jLCBpbnRlcm5hbF9lZGl0aW9uKTsKKyAgICAgIH0KKworICAgICAgLyogY2xvc2UgbWFzdGVyIGVsZW1lbnQgaWYgYW55IGVkaXRpb24gd2FzIHdyaXR0ZW4gKi8KKyAgICAgIGlmIChHX0xJS0VMWSAobWFzdGVyX2NoYXB0ZXJzICE9IDApKQorICAgICAgICBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfZmluaXNoIChlYm1sLCBtYXN0ZXJfY2hhcHRlcnMpOworICAgIH0KKyAgfQorCisgIC8qIGxhc3RseSwgZmx1c2ggdGhlIGNhY2hlICovCisgIGdzdF9lYm1sX3dyaXRlX2ZsdXNoX2NhY2hlIChlYm1sLCBGQUxTRSwgMCk7CisKKyAgaWYgKHRvYyAhPSBOVUxMKQorICAgIGdzdF90b2NfdW5yZWYgKHRvYyk7Cit9CisKKy8qIFRPRE86IG1vcmUgc2Vuc2libGUgdGFnIG1hcHBpbmdzICovCitzdGF0aWMgY29uc3Qgc3RydWN0Cit7CisgIGNvbnN0IGdjaGFyICptYXRyb3NrYV90YWduYW1lOworICBjb25zdCBnY2hhciAqZ3N0cmVhbWVyX3RhZ25hbWU7Cit9Citnc3RfbWF0cm9za2FfdGFnX2NvbnZbXSA9IHsKKyAgeworICBHU1RfTUFUUk9TS0FfVEFHX0lEX1RJVExFLCBHU1RfVEFHX1RJVExFfSwgeworICBHU1RfTUFUUk9TS0FfVEFHX0lEX0FSVElTVCwgR1NUX1RBR19BUlRJU1R9LCB7CisgIEdTVF9NQVRST1NLQV9UQUdfSURfQUxCVU0sIEdTVF9UQUdfQUxCVU19LCB7CisgIEdTVF9NQVRST1NLQV9UQUdfSURfQ09NTUVOVFMsIEdTVF9UQUdfQ09NTUVOVH0sIHsKKyAgR1NUX01BVFJPU0tBX1RBR19JRF9CSVRTUFMsIEdTVF9UQUdfQklUUkFURX0sIHsKKyAgR1NUX01BVFJPU0tBX1RBR19JRF9CUFMsIEdTVF9UQUdfQklUUkFURX0sIHsKKyAgR1NUX01BVFJPU0tBX1RBR19JRF9FTkNPREVSLCBHU1RfVEFHX0VOQ09ERVJ9LCB7CisgIEdTVF9NQVRST1NLQV9UQUdfSURfREFURSwgR1NUX1RBR19EQVRFfSwgeworICBHU1RfTUFUUk9TS0FfVEFHX0lEX0lTUkMsIEdTVF9UQUdfSVNSQ30sIHsKKyAgR1NUX01BVFJPU0tBX1RBR19JRF9DT1BZUklHSFQsIEdTVF9UQUdfQ09QWVJJR0hUfSwgeworICBHU1RfTUFUUk9TS0FfVEFHX0lEX0JQTSwgR1NUX1RBR19CRUFUU19QRVJfTUlOVVRFfSwgeworICBHU1RfTUFUUk9TS0FfVEFHX0lEX1RFUk1TX09GX1VTRSwgR1NUX1RBR19MSUNFTlNFfSwgeworICBHU1RfTUFUUk9TS0FfVEFHX0lEX0NPTVBPU0VSLCBHU1RfVEFHX0NPTVBPU0VSfSwgeworICBHU1RfTUFUUk9TS0FfVEFHX0lEX0xFQURfUEVSRk9STUVSLCBHU1RfVEFHX1BFUkZPUk1FUn0sIHsKKyAgR1NUX01BVFJPU0tBX1RBR19JRF9HRU5SRSwgR1NUX1RBR19HRU5SRX0KK307CisKKy8qIEV2ZXJ5IHN0YWdlZnJpZ2h0IGltcGxlbWVudGF0aW9uIG9uIGFuZHJvaWQgdXAgdG8gYW5kIGluY2x1ZGluZyA2LjAuMSBpcyB1c2luZworIGxpYndlYm0gd2l0aCBidWcgaW4gbWF0cm9za2EgcGFyc2luZywgd2hlcmUgaXQgd2lsbCBjaG9rZSBvbiBlbXB0eSB0YWcgZWxlbWVudHM7Cisgc28gYmVmb3JlIG91dHB1dHRpbmcgdGFncyBhbmQgdGFnIGVsZW1lbnRzIHdlIGJldHRlciBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUKKyBhY3R1YWxseSB0YWdzIHdlIGFyZSBnb2luZyB0byB3cml0ZSAqLworc3RhdGljIGdib29sZWFuCitnc3RfbWF0cm9za2FfbXV4X3RhZ19saXN0X2lzX2VtcHR5IChjb25zdCBHc3RUYWdMaXN0ICogbGlzdCkKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBnc3RfdGFnX2xpc3Rfbl90YWdzIChsaXN0KTsgaSsrKSB7CisgICAgY29uc3QgZ2NoYXIgKnRhZyA9IGdzdF90YWdfbGlzdF9udGhfdGFnX25hbWUgKGxpc3QsIGkpOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBHX05fRUxFTUVOVFMgKGdzdF9tYXRyb3NrYV90YWdfY29udik7IGkrKykgeworICAgICAgY29uc3QgZ2NoYXIgKnRhZ25hbWVfZ3N0ID0gZ3N0X21hdHJvc2thX3RhZ19jb252W2ldLmdzdHJlYW1lcl90YWduYW1lOworICAgICAgaWYgKHN0cmNtcCAodGFnbmFtZV9nc3QsIHRhZykgPT0gMCkgeworICAgICAgICBHVmFsdWUgc3JjID0geyAwLCB9OworICAgICAgICBnY2hhciAqZGVzdDsKKworICAgICAgICBpZiAoIWdzdF90YWdfbGlzdF9jb3B5X3ZhbHVlICgmc3JjLCBsaXN0LCB0YWcpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZXN0ID0gZ3N0X3ZhbHVlX3NlcmlhbGl6ZSAoJnNyYyk7CisKKyAgICAgICAgZ192YWx1ZV91bnNldCAoJnNyYyk7CisgICAgICAgIGlmIChkZXN0KSB7CisgICAgICAgICAgZ19mcmVlIChkZXN0KTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfbXV4X3dyaXRlX3NpbXBsZV90YWcgKGNvbnN0IEdzdFRhZ0xpc3QgKiBsaXN0LCBjb25zdCBnY2hhciAqIHRhZywKKyAgICBncG9pbnRlciBkYXRhKQoreworICBHc3RFYm1sV3JpdGUgKmVibWwgPSAoR3N0RWJtbFdyaXRlICopIGRhdGE7CisgIGd1aW50IGk7CisgIGd1aW50NjQgc2ltcGxldGFnX21hc3RlcjsKKworICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTIChnc3RfbWF0cm9za2FfdGFnX2NvbnYpOyBpKyspIHsKKyAgICBjb25zdCBnY2hhciAqdGFnbmFtZV9nc3QgPSBnc3RfbWF0cm9za2FfdGFnX2NvbnZbaV0uZ3N0cmVhbWVyX3RhZ25hbWU7CisgICAgY29uc3QgZ2NoYXIgKnRhZ25hbWVfbWt2ID0gZ3N0X21hdHJvc2thX3RhZ19jb252W2ldLm1hdHJvc2thX3RhZ25hbWU7CisKKyAgICBpZiAoc3RyY21wICh0YWduYW1lX2dzdCwgdGFnKSA9PSAwKSB7CisgICAgICBHVmFsdWUgc3JjID0geyAwLCB9OworICAgICAgZ2NoYXIgKmRlc3Q7CisKKyAgICAgIGlmICghZ3N0X3RhZ19saXN0X2NvcHlfdmFsdWUgKCZzcmMsIGxpc3QsIHRhZykpCisgICAgICAgIGJyZWFrOworICAgICAgaWYgKChkZXN0ID0gZ3N0X3ZhbHVlX3NlcmlhbGl6ZSAoJnNyYykpKSB7CisKKyAgICAgICAgc2ltcGxldGFnX21hc3RlciA9IGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCAoZWJtbCwKKyAgICAgICAgICAgIEdTVF9NQVRST1NLQV9JRF9TSU1QTEVUQUcpOworICAgICAgICBnc3RfZWJtbF93cml0ZV9hc2NpaSAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1RBR05BTUUsIHRhZ25hbWVfbWt2KTsKKyAgICAgICAgZ3N0X2VibWxfd3JpdGVfdXRmOCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1RBR1NUUklORywgZGVzdCk7CisgICAgICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKGVibWwsIHNpbXBsZXRhZ19tYXN0ZXIpOworICAgICAgICBnX2ZyZWUgKGRlc3QpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJDYW4ndCB0cmFuc2Zvcm0gdGFnICclcycgdG8gc3RyaW5nIiwgdGFnbmFtZV9ta3YpOworICAgICAgfQorICAgICAgZ192YWx1ZV91bnNldCAoJnNyYyk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9tdXhfd3JpdGVfc3RyZWFtX3RhZ3MgKEdzdE1hdHJvc2thTXV4ICogbXV4LCBHc3RNYXRyb3NrYVBhZCAqIG1wYWQpCit7CisgIGd1aW50NjQgbWFzdGVyX3RhZywgbWFzdGVyX3RhcmdldHM7CisgIEdzdEVibWxXcml0ZSAqZWJtbDsKKworICBlYm1sID0gbXV4LT5lYm1sX3dyaXRlOworCisgIGlmIChHX1VOTElLRUxZIChtcGFkLT50YWdzID09IE5VTEwKKyAgICAgICAgICB8fCBnc3RfbWF0cm9za2FfbXV4X3RhZ19saXN0X2lzX2VtcHR5IChtcGFkLT50YWdzKSkpCisgICAgcmV0dXJuOworCisgIG1hc3Rlcl90YWcgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UQUcpOworICBtYXN0ZXJfdGFyZ2V0cyA9IGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1RBUkdFVFMpOworCisgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UQVJHRVRUUkFDS1VJRCwgbXBhZC0+dHJhY2stPnVpZCk7CisKKyAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgbWFzdGVyX3RhcmdldHMpOworICBnc3RfdGFnX2xpc3RfZm9yZWFjaCAobXBhZC0+dGFncywgZ3N0X21hdHJvc2thX211eF93cml0ZV9zaW1wbGVfdGFnLCBlYm1sKTsKKyAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgbWFzdGVyX3RhZyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfbXV4X3dyaXRlX3N0cmVhbXNfdGFncyAoR3N0TWF0cm9za2FNdXggKiBtdXgpCit7CisgIEdTTGlzdCAqd2FsazsKKworICBmb3IgKHdhbGsgPSBtdXgtPmNvbGxlY3QtPmRhdGE7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0TWF0cm9za2FQYWQgKmNvbGxlY3RfcGFkOworCisgICAgY29sbGVjdF9wYWQgPSAoR3N0TWF0cm9za2FQYWQgKikgd2Fsay0+ZGF0YTsKKworICAgIGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfc3RyZWFtX3RhZ3MgKG11eCwgY29sbGVjdF9wYWQpOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX211eF9zdHJlYW1zX2hhdmVfdGFncyAoR3N0TWF0cm9za2FNdXggKiBtdXgpCit7CisgIEdTTGlzdCAqd2FsazsKKworICBmb3IgKHdhbGsgPSBtdXgtPmNvbGxlY3QtPmRhdGE7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0TWF0cm9za2FQYWQgKmNvbGxlY3RfcGFkOworCisgICAgY29sbGVjdF9wYWQgPSAoR3N0TWF0cm9za2FQYWQgKikgd2Fsay0+ZGF0YTsKKyAgICBpZiAoIWdzdF9tYXRyb3NrYV9tdXhfdGFnX2xpc3RfaXNfZW1wdHkgKGNvbGxlY3RfcGFkLT50YWdzKSkKKyAgICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9tdXhfd3JpdGVfdG9jX2VudHJ5X3RhZ3MgKEdzdE1hdHJvc2thTXV4ICogbXV4LAorICAgIGNvbnN0IEdzdFRvY0VudHJ5ICogZW50cnksIGd1aW50NjQgKiBtYXN0ZXJfdGFncywgZ2Jvb2xlYW4gKiBoYXNfdGFncykKK3sKKyAgZ3VpbnQ2NCBtYXN0ZXJfdGFnLCBtYXN0ZXJfdGFyZ2V0czsKKyAgR3N0RWJtbFdyaXRlICplYm1sOworICBHTGlzdCAqY3VyOworICBjb25zdCBHc3RUYWdMaXN0ICp0YWdzOworCisgIGVibWwgPSBtdXgtPmVibWxfd3JpdGU7CisKKyAgdGFncyA9IGdzdF90b2NfZW50cnlfZ2V0X3RhZ3MgKGVudHJ5KTsKKyAgaWYgKEdfVU5MSUtFTFkgKHRhZ3MgIT0gTlVMTCAmJiAhZ3N0X21hdHJvc2thX211eF90YWdfbGlzdF9pc19lbXB0eSAodGFncykpKSB7CisgICAgKmhhc190YWdzID0gVFJVRTsKKworICAgIGlmICgqbWFzdGVyX3RhZ3MgPT0gMCkgeworICAgICAgbXV4LT50YWdzX3BvcyA9IGVibWwtPnBvczsKKyAgICAgICptYXN0ZXJfdGFncyA9IGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1RBR1MpOworICAgIH0KKworICAgIG1hc3Rlcl90YWcgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UQUcpOworICAgIG1hc3Rlcl90YXJnZXRzID0KKyAgICAgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfVEFSR0VUUyk7CisKKyAgICBpZiAoZ3N0X3RvY19lbnRyeV9nZXRfZW50cnlfdHlwZSAoZW50cnkpID09IEdTVF9UT0NfRU5UUllfVFlQRV9FRElUSU9OKQorICAgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1RBUkdFVEVESVRJT05VSUQsCisgICAgICAgICAgZ19hc2NpaV9zdHJ0b3VsbCAoZ3N0X3RvY19lbnRyeV9nZXRfdWlkIChlbnRyeSksIE5VTEwsIDEwKSk7CisgICAgZWxzZQorICAgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1RBUkdFVENIQVBURVJVSUQsCisgICAgICAgICAgZ19hc2NpaV9zdHJ0b3VsbCAoZ3N0X3RvY19lbnRyeV9nZXRfdWlkIChlbnRyeSksIE5VTEwsIDEwKSk7CisKKyAgICBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfZmluaXNoIChlYm1sLCBtYXN0ZXJfdGFyZ2V0cyk7CisgICAgZ3N0X3RhZ19saXN0X2ZvcmVhY2ggKHRhZ3MsIGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfc2ltcGxlX3RhZywgZWJtbCk7CisgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgbWFzdGVyX3RhZyk7CisgIH0KKworICBmb3IgKGN1ciA9IGdzdF90b2NfZW50cnlfZ2V0X3N1Yl9lbnRyaWVzIChlbnRyeSk7IGN1ciAhPSBOVUxMOworICAgICAgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgZ3N0X21hdHJvc2thX211eF93cml0ZV90b2NfZW50cnlfdGFncyAobXV4LCBjdXItPmRhdGEsIG1hc3Rlcl90YWdzLAorICAgICAgICBoYXNfdGFncyk7CisgIH0KK30KKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X2ZpbmlzaDoKKyAqIEBtdXg6ICNHc3RNYXRyb3NrYU11eAorICoKKyAqIEZpbmlzaCBhIG5ldyBtYXRyb3NrYSBmaWxlICh3cml0ZSBpbmRleCBldGMuLi4pCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfbXV4X2ZpbmlzaCAoR3N0TWF0cm9za2FNdXggKiBtdXgpCit7CisgIEdzdEVibWxXcml0ZSAqZWJtbCA9IG11eC0+ZWJtbF93cml0ZTsKKyAgZ3VpbnQ2NCBwb3M7CisgIGd1aW50NjQgZHVyYXRpb24gPSAwOworICBHU0xpc3QgKmNvbGxlY3RlZDsKKyAgY29uc3QgR3N0VGFnTGlzdCAqdGFncywgKnRvY190YWdzOworICBjb25zdCBHc3RUb2MgKnRvYzsKKyAgZ2Jvb2xlYW4gaGFzX21haW5fdGFncywgdG9jX2hhc190YWdzID0gRkFMU0U7CisgIEdMaXN0ICpjdXI7CisKKyAgLyogZmluaXNoIGxhc3QgY2x1c3RlciAqLworICBpZiAobXV4LT5jbHVzdGVyKSB7CisgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgbXV4LT5jbHVzdGVyKTsKKyAgfQorCisgIC8qIGN1ZXMgKi8KKyAgaWYgKG11eC0+aW5kZXggIT0gTlVMTCkgeworICAgIGd1aW50IG47CisgICAgZ3VpbnQ2NCBtYXN0ZXIsIHBvaW50ZW50cnlfbWFzdGVyLCB0cmFja3Bvc19tYXN0ZXI7CisKKyAgICBtdXgtPmN1ZXNfcG9zID0gZWJtbC0+cG9zOworICAgIGdzdF9lYm1sX3dyaXRlX3NldF9jYWNoZSAoZWJtbCwgMTIgKyA0MSAqIG11eC0+bnVtX2luZGV4ZXMpOworICAgIG1hc3RlciA9IGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0NVRVMpOworCisgICAgZm9yIChuID0gMDsgbiA8IG11eC0+bnVtX2luZGV4ZXM7IG4rKykgeworICAgICAgR3N0TWF0cm9za2FJbmRleCAqaWR4ID0gJm11eC0+aW5kZXhbbl07CisKKyAgICAgIHBvaW50ZW50cnlfbWFzdGVyID0gZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0IChlYm1sLAorICAgICAgICAgIEdTVF9NQVRST1NLQV9JRF9QT0lOVEVOVFJZKTsKKyAgICAgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9DVUVUSU1FLAorICAgICAgICAgIGlkeC0+dGltZSAvIG11eC0+dGltZV9zY2FsZSk7CisgICAgICB0cmFja3Bvc19tYXN0ZXIgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsCisgICAgICAgICAgR1NUX01BVFJPU0tBX0lEX0NVRVRSQUNLUE9TSVRJT05TKTsKKyAgICAgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9DVUVUUkFDSywgaWR4LT50cmFjayk7CisgICAgICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfQ1VFQ0xVU1RFUlBPU0lUSU9OLAorICAgICAgICAgIGlkeC0+cG9zIC0gbXV4LT5zZWdtZW50X21hc3Rlcik7CisgICAgICBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfZmluaXNoIChlYm1sLCB0cmFja3Bvc19tYXN0ZXIpOworICAgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgcG9pbnRlbnRyeV9tYXN0ZXIpOworICAgIH0KKworICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKGVibWwsIG1hc3Rlcik7CisgICAgZ3N0X2VibWxfd3JpdGVfZmx1c2hfY2FjaGUgKGVibWwsIEZBTFNFLCBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKyAgfQorCisgIC8qIHRhZ3MgKi8KKyAgdGFncyA9IGdzdF90YWdfc2V0dGVyX2dldF90YWdfbGlzdCAoR1NUX1RBR19TRVRURVIgKG11eCkpOworICBoYXNfbWFpbl90YWdzID0gdGFncyAhPSBOVUxMICYmICFnc3RfbWF0cm9za2FfbXV4X3RhZ19saXN0X2lzX2VtcHR5ICh0YWdzKTsKKyAgdG9jID0gZ3N0X3RvY19zZXR0ZXJfZ2V0X3RvYyAoR1NUX1RPQ19TRVRURVIgKG11eCkpOworCisgIGlmIChoYXNfbWFpbl90YWdzIHx8IGdzdF9tYXRyb3NrYV9tdXhfc3RyZWFtc19oYXZlX3RhZ3MgKG11eCkgfHwgdG9jICE9IE5VTEwpIHsKKyAgICBndWludDY0IG1hc3Rlcl90YWdzID0gMCwgbWFzdGVyX3RhZzsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgIldyaXRpbmcgdGFncyIpOworCisgICAgaWYgKGhhc19tYWluX3RhZ3MpIHsKKyAgICAgIC8qIFRPRE86IG1heWJlIGxpbWl0IHZpYSB0aGUgVEFSR0VUUyBpZCBieSBsb29raW5nIGF0IHRoZSBzb3VyY2UgcGFkICovCisgICAgICBtdXgtPnRhZ3NfcG9zID0gZWJtbC0+cG9zOworICAgICAgbWFzdGVyX3RhZ3MgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UQUdTKTsKKyAgICAgIG1hc3Rlcl90YWcgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UQUcpOworCisgICAgICBpZiAodGFncyAhPSBOVUxMKQorICAgICAgICBnc3RfdGFnX2xpc3RfZm9yZWFjaCAodGFncywgZ3N0X21hdHJvc2thX211eF93cml0ZV9zaW1wbGVfdGFnLCBlYm1sKTsKKyAgICAgIGlmIChtdXgtPmludGVybmFsX3RvYyAhPSBOVUxMKSB7CisgICAgICAgIHRvY190YWdzID0gZ3N0X3RvY19nZXRfdGFncyAobXV4LT5pbnRlcm5hbF90b2MpOworICAgICAgICB0b2NfaGFzX3RhZ3MgPSAodG9jX3RhZ3MgIT0gTlVMTCk7CisgICAgICAgIGdzdF90YWdfbGlzdF9mb3JlYWNoICh0b2NfdGFncywgZ3N0X21hdHJvc2thX211eF93cml0ZV9zaW1wbGVfdGFnLAorICAgICAgICAgICAgZWJtbCk7CisgICAgICB9CisKKyAgICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKGVibWwsIG1hc3Rlcl90YWcpOworICAgIH0KKworICAgIGlmIChtdXgtPmludGVybmFsX3RvYyAhPSBOVUxMKSB7CisgICAgICBmb3IgKGN1ciA9IGdzdF90b2NfZ2V0X2VudHJpZXMgKG11eC0+aW50ZXJuYWxfdG9jKTsgY3VyICE9IE5VTEw7CisgICAgICAgICAgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfdG9jX2VudHJ5X3RhZ3MgKG11eCwgY3VyLT5kYXRhLCAmbWFzdGVyX3RhZ3MsCisgICAgICAgICAgICAmdG9jX2hhc190YWdzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWFzdGVyX3RhZ3MgPT0gMCAmJiBnc3RfbWF0cm9za2FfbXV4X3N0cmVhbXNfaGF2ZV90YWdzIChtdXgpKSB7CisgICAgICBtdXgtPnRhZ3NfcG9zID0gZWJtbC0+cG9zOworICAgICAgbWFzdGVyX3RhZ3MgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UQUdTKTsKKyAgICB9CisgICAgZ3N0X21hdHJvc2thX211eF93cml0ZV9zdHJlYW1zX3RhZ3MgKG11eCk7CisKKyAgICBpZiAobWFzdGVyX3RhZ3MgIT0gMCkKKyAgICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKGVibWwsIG1hc3Rlcl90YWdzKTsKKyAgfQorCisgIC8qIHVwZGF0ZSBzZWVraGVhZC4gV2Uga25vdyB0aGF0OgorICAgKiAtIGEgc2Vla2hlYWQgY29udGFpbnMgNSBlbnRyaWVzLgorICAgKiAtIG9yZGVyIG9mIGVudHJpZXMgaXMgYXMgYWJvdmUuCisgICAqIC0gYSBzZWVraGVhZCBoYXMgYSA0LWJ5dGUgaGVhZGVyICsgOC1ieXRlIGxlbmd0aAorICAgKiAtIGVhY2ggZW50cnkgaXMgMi1ieXRlIG1hc3RlciwgMi1ieXRlIElEIHBvaW50ZXIsCisgICAqICAgICAyLWJ5dGUgbGVuZ3RoIHBvaW50ZXIsIGFsbCA4LzEtYnl0ZSBsZW5ndGgsIDQtCisgICAqICAgICBieXRlIElEIGFuZCA4LWJ5dGUgbGVuZ3RoIHBvaW50ZXIsIHdoZXJlIHRoZQorICAgKiAgICAgbGVuZ3RoIHBvaW50ZXIgc3RhcnRzIGF0IDIwLgorICAgKiAtIGFsbCBlbnRyaWVzIGFyZSBsb2NhbCB0byB0aGUgc2VnbWVudCAoc28gcG9zIC0gc2VnbWVudF9tYXN0ZXIpLgorICAgKiAtIHNvIGVhY2ggZW50cnkgaXMgYXQgMTIgKyAyMCArIG51bSAqIDI4LiAqLworICBnc3RfZWJtbF9yZXBsYWNlX3VpbnQgKGVibWwsIG11eC0+c2Vla2hlYWRfcG9zICsgMzIsCisgICAgICBtdXgtPmluZm9fcG9zIC0gbXV4LT5zZWdtZW50X21hc3Rlcik7CisgIGdzdF9lYm1sX3JlcGxhY2VfdWludCAoZWJtbCwgbXV4LT5zZWVraGVhZF9wb3MgKyA2MCwKKyAgICAgIG11eC0+dHJhY2tzX3BvcyAtIG11eC0+c2VnbWVudF9tYXN0ZXIpOworICBpZiAodG9jICE9IE5VTEwgJiYgbXV4LT5jaGFwdGVyc19wb3MgPiAwKSB7CisgICAgZ3N0X2VibWxfcmVwbGFjZV91aW50IChlYm1sLCBtdXgtPnNlZWtoZWFkX3BvcyArIDg4LAorICAgICAgICBtdXgtPmNoYXB0ZXJzX3BvcyAtIG11eC0+c2VnbWVudF9tYXN0ZXIpOworICB9IGVsc2UgeworICAgIC8qIHZvaWQnaWZ5ICovCisgICAgZ3VpbnQ2NCBteV9wb3MgPSBlYm1sLT5wb3M7CisKKyAgICBnc3RfZWJtbF93cml0ZV9zZWVrIChlYm1sLCBtdXgtPnNlZWtoZWFkX3BvcyArIDY4KTsKKyAgICBnc3RfZWJtbF93cml0ZV9idWZmZXJfaGVhZGVyIChlYm1sLCBHU1RfRUJNTF9JRF9WT0lELCAyNik7CisgICAgZ3N0X2VibWxfd3JpdGVfc2VlayAoZWJtbCwgbXlfcG9zKTsKKyAgfQorICBpZiAobXV4LT5pbmRleCAhPSBOVUxMKSB7CisgICAgZ3N0X2VibWxfcmVwbGFjZV91aW50IChlYm1sLCBtdXgtPnNlZWtoZWFkX3BvcyArIDExNiwKKyAgICAgICAgbXV4LT5jdWVzX3BvcyAtIG11eC0+c2VnbWVudF9tYXN0ZXIpOworICB9IGVsc2UgeworICAgIC8qIHZvaWQnaWZ5ICovCisgICAgZ3VpbnQ2NCBteV9wb3MgPSBlYm1sLT5wb3M7CisKKyAgICBnc3RfZWJtbF93cml0ZV9zZWVrIChlYm1sLCBtdXgtPnNlZWtoZWFkX3BvcyArIDk2KTsKKyAgICBnc3RfZWJtbF93cml0ZV9idWZmZXJfaGVhZGVyIChlYm1sLCBHU1RfRUJNTF9JRF9WT0lELCAyNik7CisgICAgZ3N0X2VibWxfd3JpdGVfc2VlayAoZWJtbCwgbXlfcG9zKTsKKyAgfQorCisgIGlmICh0YWdzICE9IE5VTEwgfHwgdG9jX2hhc190YWdzKSB7CisgICAgZ3N0X2VibWxfcmVwbGFjZV91aW50IChlYm1sLCBtdXgtPnNlZWtoZWFkX3BvcyArIDE0NCwKKyAgICAgICAgbXV4LT50YWdzX3BvcyAtIG11eC0+c2VnbWVudF9tYXN0ZXIpOworICB9IGVsc2UgeworICAgIC8qIHZvaWQnaWZ5ICovCisgICAgZ3VpbnQ2NCBteV9wb3MgPSBlYm1sLT5wb3M7CisKKyAgICBnc3RfZWJtbF93cml0ZV9zZWVrIChlYm1sLCBtdXgtPnNlZWtoZWFkX3BvcyArIDEyNCk7CisgICAgZ3N0X2VibWxfd3JpdGVfYnVmZmVyX2hlYWRlciAoZWJtbCwgR1NUX0VCTUxfSURfVk9JRCwgMjYpOworICAgIGdzdF9lYm1sX3dyaXRlX3NlZWsgKGVibWwsIG15X3Bvcyk7CisgIH0KKworICBpZiAodG9jICE9IE5VTEwpIHsKKyAgICBnc3RfdG9jX3VucmVmICh0b2MpOworICB9CisKKyAgLyogbG9vcCB0cmFja3M6CisgICAqIC0gZmlyc3QgZ2V0IHRoZSBvdmVyYWxsIGR1cmF0aW9uCisgICAqICAgKGEgcmVsZWFzZWQgdHJhY2sgbWF5IGhhdmUgbGVmdCBhIGR1cmF0aW9uIGluIGhlcmUpCisgICAqIC0gd3JpdGUgc29tZSB0cmFjayBoZWFkZXIgZGF0YSBmb3Igc3VidGl0bGVzCisgICAqLworICBkdXJhdGlvbiA9IG11eC0+ZHVyYXRpb247CisgIHBvcyA9IGVibWwtPnBvczsKKyAgZm9yIChjb2xsZWN0ZWQgPSBtdXgtPmNvbGxlY3QtPmRhdGE7IGNvbGxlY3RlZDsKKyAgICAgIGNvbGxlY3RlZCA9IGdfc2xpc3RfbmV4dCAoY29sbGVjdGVkKSkgeworICAgIEdzdE1hdHJvc2thUGFkICpjb2xsZWN0X3BhZDsKKyAgICAvKgorICAgICAqIG9ic2VydmVkIGR1cmF0aW9uLCB0aGlzIHdpbGwgbmV2ZXIgcmVtYWluIEdTVF9DTE9DS19USU1FX05PTkUKKyAgICAgKiBzaW5jZSB0aGlzIG1lYW5zIGJ1ZmZlciB3aXRob3V0IHRpbWVzdGFtcHMgdGhhdCBpcyBub3QgcG9zc2liaWxlCisgICAgICovCisgICAgR3N0Q2xvY2tUaW1lIGNvbGxlY3RlZF9kdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisKKyAgICBjb2xsZWN0X3BhZCA9IChHc3RNYXRyb3NrYVBhZCAqKSBjb2xsZWN0ZWQtPmRhdGE7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChtdXgsCisgICAgICAgICJQYWQgJSIgR1NUX1BUUl9GT1JNQVQgIiBzdGFydCB0cyAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgIiBlbmQgdHMgJSIgR1NUX1RJTUVfRk9STUFULCBjb2xsZWN0X3BhZCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoY29sbGVjdF9wYWQtPnN0YXJ0X3RzKSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoY29sbGVjdF9wYWQtPmVuZF90cykpOworCisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChjb2xsZWN0X3BhZC0+c3RhcnRfdHMpICYmCisgICAgICAgIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChjb2xsZWN0X3BhZC0+ZW5kX3RzKSkgeworICAgICAgY29sbGVjdGVkX2R1cmF0aW9uID0KKyAgICAgICAgICBHU1RfQ0xPQ0tfRElGRiAoY29sbGVjdF9wYWQtPnN0YXJ0X3RzLCBjb2xsZWN0X3BhZC0+ZW5kX3RzKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbGxlY3RfcGFkLAorICAgICAgICAgICJmaW5hbCB0cmFjayBkdXJhdGlvbjogJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGNvbGxlY3RlZF9kdXJhdGlvbikpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvbGxlY3RfcGFkLCAidW5hYmxlIHRvIGdldCBmaW5hbCB0cmFjayBkdXJhdGlvbiIpOworICAgIH0KKyAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGNvbGxlY3RlZF9kdXJhdGlvbikgJiYKKyAgICAgICAgZHVyYXRpb24gPCBjb2xsZWN0ZWRfZHVyYXRpb24pCisgICAgICBkdXJhdGlvbiA9IGNvbGxlY3RlZF9kdXJhdGlvbjsKKworICB9CisKKyAgLyogc2VlayBiYWNrIChvcHRpb25hbCwgYnV0IGRvIGFueXdheSkgKi8KKyAgZ3N0X2VibWxfd3JpdGVfc2VlayAoZWJtbCwgcG9zKTsKKworICAvKiB1cGRhdGUgZHVyYXRpb24gKi8KKyAgaWYgKGR1cmF0aW9uICE9IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJmaW5hbCB0b3RhbCBkdXJhdGlvbjogJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChkdXJhdGlvbikpOworICAgIHBvcyA9IG11eC0+ZWJtbF93cml0ZS0+cG9zOworICAgIGdzdF9lYm1sX3dyaXRlX3NlZWsgKGVibWwsIG11eC0+ZHVyYXRpb25fcG9zKTsKKyAgICBnc3RfZWJtbF93cml0ZV9mbG9hdCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0RVUkFUSU9OLAorICAgICAgICBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIChkdXJhdGlvbikgLworICAgICAgICBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIChtdXgtPnRpbWVfc2NhbGUpKTsKKyAgICBnc3RfZWJtbF93cml0ZV9zZWVrIChlYm1sLCBwb3MpOworICB9IGVsc2UgeworICAgIC8qIHZvaWQnaWZ5ICovCisgICAgZ3VpbnQ2NCBteV9wb3MgPSBlYm1sLT5wb3M7CisKKyAgICBnc3RfZWJtbF93cml0ZV9zZWVrIChlYm1sLCBtdXgtPmR1cmF0aW9uX3Bvcyk7CisgICAgZ3N0X2VibWxfd3JpdGVfYnVmZmVyX2hlYWRlciAoZWJtbCwgR1NUX0VCTUxfSURfVk9JRCwgOCk7CisgICAgZ3N0X2VibWxfd3JpdGVfc2VlayAoZWJtbCwgbXlfcG9zKTsKKyAgfQorICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJmaW5pc2hpbmcgc2VnbWVudCIpOworICAvKiBmaW5pc2ggc2VnbWVudCAtIHRoaXMgYWxzbyB3cml0ZXMgZWxlbWVudCBsZW5ndGggKi8KKyAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgbXV4LT5zZWdtZW50X3Bvcyk7Cit9CisKKy8qKgorICogZ3N0X21hdHJvc2thX211eF9idWZmZXJfaGVhZGVyOgorICogQHRyYWNrOiBUcmFjayBjb250ZXh0LgorICogQHJlbGF0aXZlX3RpbWVzdGFtcDogcmVsYXRpdmUgdGltZXN0YW1wIG9mIHRoZSBidWZmZXIKKyAqIEBmbGFnczogQnVmZmVyIGZsYWdzLgorICoKKyAqIENyZWF0ZSBhIGJ1ZmZlciBjb250YWluaW5nIGJ1ZmZlciBoZWFkZXIuCisgKgorICogUmV0dXJuczogTmV3IGJ1ZmZlci4KKyAqLworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfbWF0cm9za2FfbXV4X2NyZWF0ZV9idWZmZXJfaGVhZGVyIChHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIHRyYWNrLAorICAgIGdpbnQxNiByZWxhdGl2ZV90aW1lc3RhbXAsIGludCBmbGFncykKK3sKKyAgR3N0QnVmZmVyICpoZHI7CisgIGd1aW50OCAqZGF0YSA9IGdfbWFsbG9jICg0KTsKKworICBoZHIgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChkYXRhLCA0KTsKKyAgLyogdHJhY2sgbnVtIC0gRklYTUU6IHdoYXQgaWYgbnVtID49IDB4ODAgKHVubGlrZWx5KT8gKi8KKyAgZGF0YVswXSA9IHRyYWNrLT5udW0gfCAweDgwOworICAvKiB0aW1lIHJlbGF0aXZlIHRvIGNsdXN0ZXJ0aW1lICovCisgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEgKyAxLCByZWxhdGl2ZV90aW1lc3RhbXApOworCisgIC8qIGZsYWdzICovCisgIGRhdGFbM10gPSBmbGFnczsKKworICByZXR1cm4gaGRyOworfQorCisjZGVmaW5lIERJUkFDX1BBUlNFX0NPREVfU0VRVUVOQ0VfSEVBREVSIDB4MDAKKyNkZWZpbmUgRElSQUNfUEFSU0VfQ09ERV9FTkRfT0ZfU0VRVUVOQ0UgMHgxMAorI2RlZmluZSBESVJBQ19QQVJTRV9DT0RFX0lTX1BJQ1RVUkUoeCkgKCh4ICYgMHgwOCkgIT0gMCkKKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfbWF0cm9za2FfbXV4X2hhbmRsZV9kaXJhY19wYWNrZXQgKEdzdE1hdHJvc2thTXV4ICogbXV4LAorICAgIEdzdE1hdHJvc2thUGFkICogY29sbGVjdF9wYWQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCAqY3R4ID0KKyAgICAgIChHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICopIGNvbGxlY3RfcGFkLT50cmFjazsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3NpemUgc2l6ZTsKKyAgZ3VpbnQ4IHBhcnNlX2NvZGU7CisgIGd1aW50MzIgbmV4dF9wYXJzZV9vZmZzZXQ7CisgIEdzdEJ1ZmZlciAqcmV0ID0gTlVMTDsKKyAgZ2Jvb2xlYW4gaXNfbXV4aW5nX3VuaXQgPSBGQUxTRTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBkYXRhID0gbWFwLmRhdGE7CisgIHNpemUgPSBtYXAuc2l6ZTsKKworICBpZiAoc2l6ZSA8IDEzKSB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICAvKiBDaGVjayBpZiB0aGlzIGJ1ZmZlciBjb250YWlucyBhIHBpY3R1cmUgb3IgZW5kLW9mLXNlcXVlbmNlIHBhY2tldCAqLworICB3aGlsZSAoc2l6ZSA+PSAxMykgeworICAgIGlmIChHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEpICE9IDB4NDI0MjQzNDQgLyogJ0JCQ0QnICovICkgeworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHBhcnNlX2NvZGUgPSBHU1RfUkVBRF9VSU5UOCAoZGF0YSArIDQpOworICAgIGlmIChwYXJzZV9jb2RlID09IERJUkFDX1BBUlNFX0NPREVfU0VRVUVOQ0VfSEVBREVSKSB7CisgICAgICBpZiAoY3R4LT5kaXJhY191bml0KSB7CisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGN0eC0+ZGlyYWNfdW5pdCk7CisgICAgICAgIGN0eC0+ZGlyYWNfdW5pdCA9IE5VTEw7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChESVJBQ19QQVJTRV9DT0RFX0lTX1BJQ1RVUkUgKHBhcnNlX2NvZGUpIHx8CisgICAgICAgIHBhcnNlX2NvZGUgPT0gRElSQUNfUEFSU0VfQ09ERV9FTkRfT0ZfU0VRVUVOQ0UpIHsKKyAgICAgIGlzX211eGluZ191bml0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIG5leHRfcGFyc2Vfb2Zmc2V0ID0gR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhICsgNSk7CisKKyAgICBpZiAoR19VTkxJS0VMWSAobmV4dF9wYXJzZV9vZmZzZXQgPT0gMCB8fCBuZXh0X3BhcnNlX29mZnNldCA+IHNpemUpKQorICAgICAgYnJlYWs7CisKKyAgICBkYXRhICs9IG5leHRfcGFyc2Vfb2Zmc2V0OworICAgIHNpemUgLT0gbmV4dF9wYXJzZV9vZmZzZXQ7CisgIH0KKworICBpZiAoY3R4LT5kaXJhY191bml0KQorICAgIGN0eC0+ZGlyYWNfdW5pdCA9IGdzdF9idWZmZXJfYXBwZW5kIChjdHgtPmRpcmFjX3VuaXQsIGdzdF9idWZmZXJfcmVmIChidWYpKTsKKyAgZWxzZQorICAgIGN0eC0+ZGlyYWNfdW5pdCA9IGdzdF9idWZmZXJfcmVmIChidWYpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgaWYgKGlzX211eGluZ191bml0KSB7CisgICAgcmV0ID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChjdHgtPmRpcmFjX3VuaXQpOworICAgIGN0eC0+ZGlyYWNfdW5pdCA9IE5VTEw7CisgICAgZ3N0X2J1ZmZlcl9jb3B5X2ludG8gKHJldCwgYnVmLAorICAgICAgICBHU1RfQlVGRkVSX0NPUFlfRkxBR1MgfCBHU1RfQlVGRkVSX0NPUFlfVElNRVNUQU1QUywgMCwgLTEpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIH0gZWxzZSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXQgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9tdXhfc3RvcF9zdHJlYW1oZWFkZXIgKEdzdE1hdHJvc2thTXV4ICogbXV4KQoreworICBHc3RDYXBzICpjYXBzOworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIEdWYWx1ZSBzdHJlYW1oZWFkZXIgPSB7IDAgfTsKKyAgR1ZhbHVlIGJ1ZnZhbCA9IHsgMCB9OworICBHc3RCdWZmZXIgKnN0cmVhbWhlYWRlcl9idWZmZXI7CisgIEdzdEVibWxXcml0ZSAqZWJtbCA9IG11eC0+ZWJtbF93cml0ZTsKKworICBzdHJlYW1oZWFkZXJfYnVmZmVyID0gZ3N0X2VibWxfc3RvcF9zdHJlYW1oZWFkZXIgKGVibWwpOworICBjYXBzID0gZ3N0X2NhcHNfY29weSAobXV4LT5lYm1sX3dyaXRlLT5jYXBzKTsKKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBnX3ZhbHVlX2luaXQgKCZzdHJlYW1oZWFkZXIsIEdTVF9UWVBFX0FSUkFZKTsKKyAgZ192YWx1ZV9pbml0ICgmYnVmdmFsLCBHU1RfVFlQRV9CVUZGRVIpOworICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChzdHJlYW1oZWFkZXJfYnVmZmVyLCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSKTsKKyAgZ3N0X3ZhbHVlX3NldF9idWZmZXIgKCZidWZ2YWwsIHN0cmVhbWhlYWRlcl9idWZmZXIpOworICBnc3RfdmFsdWVfYXJyYXlfYXBwZW5kX3ZhbHVlICgmc3RyZWFtaGVhZGVyLCAmYnVmdmFsKTsKKyAgZ192YWx1ZV91bnNldCAoJmJ1ZnZhbCk7CisgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChzLCAic3RyZWFtaGVhZGVyIiwgJnN0cmVhbWhlYWRlcik7CisgIGdfdmFsdWVfdW5zZXQgKCZzdHJlYW1oZWFkZXIpOworICBnc3RfY2Fwc19yZXBsYWNlICgmZWJtbC0+Y2FwcywgY2Fwcyk7CisgIGdzdF9idWZmZXJfdW5yZWYgKHN0cmVhbWhlYWRlcl9idWZmZXIpOworICBnc3RfcGFkX3NldF9jYXBzIChtdXgtPnNyY3BhZCwgY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKK30KKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X3dyaXRlX2RhdGE6CisgKiBAbXV4OiAjR3N0TWF0cm9za2FNdXgKKyAqIEBjb2xsZWN0X3BhZDogI0dzdE1hdHJvc2thUGFkIHdpdGggdGhlIGRhdGEKKyAqCisgKiBXcml0ZSBjb2xsZWN0ZWQgZGF0YSAoY2FsbGVkIGZyb20gZ3N0X21hdHJvc2thX211eF9jb2xsZWN0ZWQpLgorICoKKyAqIFJldHVybnM6IFJlc3VsdCBvZiB0aGUgZ3N0X3BhZF9wdXNoIGlzc3VlZCB0byB3cml0ZSB0aGUgZGF0YS4KKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9tdXhfd3JpdGVfZGF0YSAoR3N0TWF0cm9za2FNdXggKiBtdXgsIEdzdE1hdHJvc2thUGFkICogY29sbGVjdF9wYWQsCisgICAgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RFYm1sV3JpdGUgKmVibWwgPSBtdXgtPmVibWxfd3JpdGU7CisgIEdzdEJ1ZmZlciAqaGRyOworICBndWludDY0IGJsb2NrZ3JvdXA7CisgIGdib29sZWFuIHdyaXRlX2R1cmF0aW9uOworICBnaW50MTYgcmVsYXRpdmVfdGltZXN0YW1wOworICBnaW50NjQgcmVsYXRpdmVfdGltZXN0YW1wNjQ7CisgIGd1aW50NjQgYmxvY2tfZHVyYXRpb24sIGR1cmF0aW9uX2RpZmYgPSAwOworICBnYm9vbGVhbiBpc192aWRlb19rZXlmcmFtZSA9IEZBTFNFOworICBnYm9vbGVhbiBpc192aWRlb19pbnZpc2libGUgPSBGQUxTRTsKKyAgZ2Jvb2xlYW4gaXNfYXVkaW9fb25seSA9IEZBTFNFOworICBnYm9vbGVhbiBpc19taW5fZHVyYXRpb25fcmVhY2hlZCA9IEZBTFNFOworICBnYm9vbGVhbiBpc19tYXhfZHVyYXRpb25fZXhjZWVkZWQgPSBGQUxTRTsKKyAgR3N0TWF0cm9za2FtdXhQYWQgKnBhZDsKKyAgZ2ludCBmbGFncyA9IDA7CisgIEdzdENsb2NrVGltZSBidWZmZXJfdGltZXN0YW1wOworICBHc3RBdWRpb0NsaXBwaW5nTWV0YSAqY21ldGEgPSBOVUxMOworCisgIC8qIHdyaXRlIGRhdGEgKi8KKyAgcGFkID0gR1NUX01BVFJPU0tBTVVYX1BBRF9DQVNUIChjb2xsZWN0X3BhZC0+Y29sbGVjdC5wYWQpOworCisgIC8qIHZvcmJpcy90aGVvcmEgaGVhZGVycyBhcmUgcmV0cmlldmVkIGZyb20gY2FwcyBhbmQgcHV0IGluIENvZGVjUHJpdmF0ZSAqLworICBpZiAoY29sbGVjdF9wYWQtPnRyYWNrLT54aXBoX2hlYWRlcnNfdG9fc2tpcCA+IDApIHsKKyAgICAtLWNvbGxlY3RfcGFkLT50cmFjay0+eGlwaF9oZWFkZXJzX3RvX3NraXA7CisgICAgaWYgKEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0hFQURFUikpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChjb2xsZWN0X3BhZC0+Y29sbGVjdC5wYWQsICJkcm9wcGluZyBzdHJlYW1oZWFkZXIgYnVmZmVyIik7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgIH0KKyAgfQorCisgIC8qIGZvciBkaXJhYyB3ZSBoYXZlIHRvIHF1ZXVlIHVwIGV2ZXJ5dGhpbmcgdXAgdG8gYSBwaWN0dXJlIHVuaXQgKi8KKyAgaWYgKCFzdHJjbXAgKGNvbGxlY3RfcGFkLT50cmFjay0+Y29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19ESVJBQykpIHsKKyAgICBidWYgPSBnc3RfbWF0cm9za2FfbXV4X2hhbmRsZV9kaXJhY19wYWNrZXQgKG11eCwgY29sbGVjdF9wYWQsIGJ1Zik7CisgICAgaWYgKCFidWYpCisgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoY29sbGVjdF9wYWQtPnRyYWNrLT5jb2RlY19pZCwKKyAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fUFJPUkVTKSkgeworICAgIC8qIFJlbW92ZSB0aGUgJ0ZyYW1lIGNvbnRhaW5lciBhdG9tJyBoZWFkZXInICovCisgICAgYnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChidWYpOworICAgIGdzdF9idWZmZXJfcmVzaXplIChidWYsIDgsIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikgLSA4KTsKKyAgfQorCisgIGJ1ZmZlcl90aW1lc3RhbXAgPQorICAgICAgZ3N0X21hdHJvc2thX3RyYWNrX2dldF9idWZmZXJfdGltZXN0YW1wIChjb2xsZWN0X3BhZC0+dHJhY2ssIGJ1Zik7CisKKyAgLyogaG0sIGludmFsaWQgdGltZXN0YW1wIChkdWUgdG8gLS10byBiZSBmaXhlZC0tLSBlbGVtZW50IHVwc3RyZWFtKTsKKyAgICogdGhpcyB3b3VsZCB3cmVhayBoYXZvYyB3aXRoIHRpbWUgc3RvcmVkIGluIG1hdHJvc2thIGZpbGUgKi8KKyAgLyogVE9ETzogbWF5YmUgY2FsY3VsYXRlIGEgdGltZXN0YW1wIGJ5IHVzaW5nIHRoZSBwcmV2aW91cyB0aW1lc3RhbXAKKyAgICogYW5kIGRlZmF1bHQgZHVyYXRpb24gKi8KKyAgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoYnVmZmVyX3RpbWVzdGFtcCkpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvbGxlY3RfcGFkLT5jb2xsZWN0LnBhZCwKKyAgICAgICAgIkludmFsaWQgYnVmZmVyIHRpbWVzdGFtcDsgZHJvcHBpbmcgYnVmZmVyIik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KKworICBpZiAoIXN0cmNtcCAoY29sbGVjdF9wYWQtPnRyYWNrLT5jb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX09QVVMpCisgICAgICAmJiBjb2xsZWN0X3BhZC0+dHJhY2stPmNvZGVjX2RlbGF5KSB7CisgICAgLyogQWxsIHRpbWVzdGFtcHMgc2hvdWxkIGluY2x1ZGUgdGhlIGNvZGVjIGRlbGF5ICovCisgICAgaWYgKGJ1ZmZlcl90aW1lc3RhbXAgPiBjb2xsZWN0X3BhZC0+dHJhY2stPmNvZGVjX2RlbGF5KSB7CisgICAgICBidWZmZXJfdGltZXN0YW1wICs9IGNvbGxlY3RfcGFkLT50cmFjay0+Y29kZWNfZGVsYXk7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1ZmZlcl90aW1lc3RhbXAgPSAwOworICAgICAgZHVyYXRpb25fZGlmZiA9IGNvbGxlY3RfcGFkLT50cmFjay0+Y29kZWNfZGVsYXkgLSBidWZmZXJfdGltZXN0YW1wOworICAgIH0KKyAgfQorCisgIC8qIHNldCB0aGUgdGltZXN0YW1wIGZvciBvdXRnb2luZyBidWZmZXJzICovCisgIGVibWwtPnRpbWVzdGFtcCA9IGJ1ZmZlcl90aW1lc3RhbXA7CisKKyAgaWYgKGNvbGxlY3RfcGFkLT50cmFjay0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9WSURFTykgeworICAgIGlmICghR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCkpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChtdXgsICJoYXZlIHZpZGVvIGtleWZyYW1lLCB0cz0lIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoYnVmZmVyX3RpbWVzdGFtcCkpOworICAgICAgaXNfdmlkZW9fa2V5ZnJhbWUgPSBUUlVFOworICAgIH0gZWxzZSBpZiAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVDT0RFX09OTFkpICYmCisgICAgICAgICghc3RyY21wIChjb2xsZWN0X3BhZC0+dHJhY2stPmNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fVlA4KQorICAgICAgICAgICAgfHwgIXN0cmNtcCAoY29sbGVjdF9wYWQtPnRyYWNrLT5jb2RlY19pZCwKKyAgICAgICAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fVlA5KSkpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChtdXgsCisgICAgICAgICAgImhhdmUgVlA4IHZpZGVvIGludmlzaWJsZSBmcmFtZSwgIiAidHM9JSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGJ1ZmZlcl90aW1lc3RhbXApKTsKKyAgICAgIGlzX3ZpZGVvX2ludmlzaWJsZSA9IFRSVUU7CisgICAgfQorICB9CisKKyAgaXNfYXVkaW9fb25seSA9IChjb2xsZWN0X3BhZC0+dHJhY2stPnR5cGUgPT0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQVVESU8pICYmCisgICAgICAobXV4LT5udW1fc3RyZWFtcyA9PSAxKTsKKyAgaXNfbWluX2R1cmF0aW9uX3JlYWNoZWQgPSAobXV4LT5taW5fY2x1c3Rlcl9kdXJhdGlvbiA9PSAwCisgICAgICB8fCAoYnVmZmVyX3RpbWVzdGFtcCA+IG11eC0+Y2x1c3Rlcl90aW1lCisgICAgICAgICAgJiYgKGJ1ZmZlcl90aW1lc3RhbXAgLSBtdXgtPmNsdXN0ZXJfdGltZSkgPj0KKyAgICAgICAgICBtdXgtPm1pbl9jbHVzdGVyX2R1cmF0aW9uKSk7CisgIGlzX21heF9kdXJhdGlvbl9leGNlZWRlZCA9IChtdXgtPm1heF9jbHVzdGVyX2R1cmF0aW9uID4gMAorICAgICAgJiYgYnVmZmVyX3RpbWVzdGFtcCA+IG11eC0+Y2x1c3Rlcl90aW1lCisgICAgICAmJiAoYnVmZmVyX3RpbWVzdGFtcCAtIG11eC0+Y2x1c3Rlcl90aW1lKSA+PSBtdXgtPm1heF9jbHVzdGVyX2R1cmF0aW9uKTsKKworICBpZiAobXV4LT5jbHVzdGVyKSB7CisgICAgLyogc3RhcnQgYSBuZXcgY2x1c3RlciBhdCBldmVyeSBrZXlmcmFtZSwgYXQgZXZlcnkgR3N0Rm9yY2VLZXlVbml0IGV2ZW50LAorICAgICAqIG9yIHdoZW4gd2UgbWF5IGJlIHJlYWNoaW5nIHRoZSBsaW1pdCBvZiB0aGUgcmVsYXRpdmUgdGltZXN0YW1wICovCisgICAgaWYgKGlzX21heF9kdXJhdGlvbl9leGNlZWRlZCB8fCAoaXNfdmlkZW9fa2V5ZnJhbWUKKyAgICAgICAgICAgICYmIGlzX21pbl9kdXJhdGlvbl9yZWFjaGVkKSB8fCBtdXgtPmZvcmNlX2tleV91bml0X2V2ZW50CisgICAgICAgIHx8IChpc19hdWRpb19vbmx5ICYmIGlzX21pbl9kdXJhdGlvbl9yZWFjaGVkKSkgeworICAgICAgaWYgKCFtdXgtPmVibWxfd3JpdGUtPnN0cmVhbWFibGUpCisgICAgICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKGVibWwsIG11eC0+Y2x1c3Rlcik7CisKKyAgICAgIC8qIEZvcndhcmQgdGhlIEdzdEZvcmNlS2V5VW5pdCBldmVudCBhZnRlciBmaW5pc2hpbmcgdGhlIGNsdXN0ZXIgKi8KKyAgICAgIGlmIChtdXgtPmZvcmNlX2tleV91bml0X2V2ZW50KSB7CisgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAobXV4LT5zcmNwYWQsIG11eC0+Zm9yY2Vfa2V5X3VuaXRfZXZlbnQpOworICAgICAgICBtdXgtPmZvcmNlX2tleV91bml0X2V2ZW50ID0gTlVMTDsKKyAgICAgIH0KKworICAgICAgbXV4LT5wcmV2X2NsdXN0ZXJfc2l6ZSA9IGVibWwtPnBvcyAtIG11eC0+Y2x1c3Rlcl9wb3M7CisgICAgICBtdXgtPmNsdXN0ZXJfcG9zID0gZWJtbC0+cG9zOworICAgICAgZ3N0X2VibWxfd3JpdGVfc2V0X2NhY2hlIChlYm1sLCAweDIwKTsKKyAgICAgIG11eC0+Y2x1c3RlciA9CisgICAgICAgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUik7CisgICAgICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUlRJTUVDT0RFLAorICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoYnVmZmVyX3RpbWVzdGFtcCwgMSwgbXV4LT50aW1lX3NjYWxlKSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAobXV4LCAiY2x1c3RlciB0aW1lc3RhbXAgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGJ1ZmZlcl90aW1lc3RhbXAsIDEsIG11eC0+dGltZV9zY2FsZSkpOworICAgICAgZ3N0X2VibWxfd3JpdGVfZmx1c2hfY2FjaGUgKGVibWwsIFRSVUUsIGJ1ZmZlcl90aW1lc3RhbXApOworICAgICAgbXV4LT5jbHVzdGVyX3RpbWUgPSBidWZmZXJfdGltZXN0YW1wOworICAgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1BSRVZTSVpFLAorICAgICAgICAgIG11eC0+cHJldl9jbHVzdGVyX3NpemUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBmaXJzdCBjbHVzdGVyICovCisKKyAgICBtdXgtPmNsdXN0ZXJfcG9zID0gZWJtbC0+cG9zOworICAgIGdzdF9lYm1sX3dyaXRlX3NldF9jYWNoZSAoZWJtbCwgMHgyMCk7CisgICAgbXV4LT5jbHVzdGVyID0gZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUik7CisgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0NMVVNURVJUSU1FQ09ERSwKKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChidWZmZXJfdGltZXN0YW1wLCAxLCBtdXgtPnRpbWVfc2NhbGUpKTsKKyAgICBnc3RfZWJtbF93cml0ZV9mbHVzaF9jYWNoZSAoZWJtbCwgVFJVRSwgYnVmZmVyX3RpbWVzdGFtcCk7CisgICAgbXV4LT5jbHVzdGVyX3RpbWUgPSBidWZmZXJfdGltZXN0YW1wOworICB9CisKKyAgLyogV2UgY3VycmVudGx5IHdyaXRlIGluZGV4IGVudHJpZXMgZm9yIGFsbCB2aWRlbyB0cmFja3Mgb3IgZm9yIHRoZSBhdWRpbworICAgKiB0cmFjayBpbiBhIHNpbmdsZS10cmFjayBhdWRpbyBmaWxlLiAgVGhpcyBjb3VsZCBiZSBpbXByb3ZlZCBieSBrZWVwaW5nIHRoZQorICAgKiBpbmRleCBvbmx5IGZvciB0aGUgKmZpcnN0KiB2aWRlbyB0cmFjay4gKi8KKworICAvKiBUT0RPOiBpbmRleCBpcyB1c2VmdWwgZm9yIGV2ZXJ5IHRyYWNrLCBzaG91bGQgY29udGFpbiB0aGUgbnVtYmVyIG9mCisgICAqIHRoZSBibG9jayBpbiB0aGUgY2x1c3RlciB3aGljaCBjb250YWlucyB0aGUgdGltZXN0YW1wLCBzaG91bGQgYWxzbyB3b3JrCisgICAqIGZvciBmaWxlcyB3aXRoIG11bHRpcGxlIGF1ZGlvIHRyYWNrcy4KKyAgICovCisgIGlmICghbXV4LT5lYm1sX3dyaXRlLT5zdHJlYW1hYmxlICYmIChpc192aWRlb19rZXlmcmFtZSB8fCBpc19hdWRpb19vbmx5KSkgeworICAgIGdpbnQgbGFzdF9pZHggPSAtMTsKKworICAgIGlmIChtdXgtPm1pbl9pbmRleF9pbnRlcnZhbCAhPSAwKSB7CisgICAgICBmb3IgKGxhc3RfaWR4ID0gbXV4LT5udW1faW5kZXhlcyAtIDE7IGxhc3RfaWR4ID49IDA7IGxhc3RfaWR4LS0pIHsKKyAgICAgICAgaWYgKG11eC0+aW5kZXhbbGFzdF9pZHhdLnRyYWNrID09IGNvbGxlY3RfcGFkLT50cmFjay0+bnVtKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChsYXN0X2lkeCA8IDAgfHwgbXV4LT5taW5faW5kZXhfaW50ZXJ2YWwgPT0gMCB8fAorICAgICAgICAoR1NUX0NMT0NLX0RJRkYgKG11eC0+aW5kZXhbbGFzdF9pZHhdLnRpbWUsIGJ1ZmZlcl90aW1lc3RhbXApCisgICAgICAgICAgICA+PSBtdXgtPm1pbl9pbmRleF9pbnRlcnZhbCkpIHsKKyAgICAgIEdzdE1hdHJvc2thSW5kZXggKmlkeDsKKworICAgICAgaWYgKG11eC0+bnVtX2luZGV4ZXMgJSAzMiA9PSAwKSB7CisgICAgICAgIG11eC0+aW5kZXggPSBnX3JlbmV3IChHc3RNYXRyb3NrYUluZGV4LCBtdXgtPmluZGV4LAorICAgICAgICAgICAgbXV4LT5udW1faW5kZXhlcyArIDMyKTsKKyAgICAgIH0KKyAgICAgIGlkeCA9ICZtdXgtPmluZGV4W211eC0+bnVtX2luZGV4ZXMrK107CisKKyAgICAgIGlkeC0+cG9zID0gbXV4LT5jbHVzdGVyX3BvczsKKyAgICAgIGlkeC0+dGltZSA9IGJ1ZmZlcl90aW1lc3RhbXA7CisgICAgICBpZHgtPnRyYWNrID0gY29sbGVjdF9wYWQtPnRyYWNrLT5udW07CisgICAgfQorICB9CisKKyAgLyogQ2hlY2sgaWYgdGhlIGR1cmF0aW9uIGRpZmZlcnMgZnJvbSB0aGUgZGVmYXVsdCBkdXJhdGlvbi4gKi8KKyAgd3JpdGVfZHVyYXRpb24gPSBGQUxTRTsKKyAgYmxvY2tfZHVyYXRpb24gPSAwOworICBpZiAocGFkLT5mcmFtZV9kdXJhdGlvbiAmJiBHU1RfQlVGRkVSX0RVUkFUSU9OX0lTX1ZBTElEIChidWYpKSB7CisgICAgYmxvY2tfZHVyYXRpb24gPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpICsgZHVyYXRpb25fZGlmZjsKKyAgICBibG9ja19kdXJhdGlvbiA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoYmxvY2tfZHVyYXRpb24sIDEsIG11eC0+dGltZV9zY2FsZSk7CisKKyAgICAvKiBzbWFsbCBkaWZmZXJlbmNlIHNob3VsZCBiZSBvay4gKi8KKyAgICBpZiAoYmxvY2tfZHVyYXRpb24gPiBjb2xsZWN0X3BhZC0+ZGVmYXVsdF9kdXJhdGlvbl9zY2FsZWQgKyAxIHx8CisgICAgICAgIGJsb2NrX2R1cmF0aW9uIDwgY29sbGVjdF9wYWQtPmRlZmF1bHRfZHVyYXRpb25fc2NhbGVkIC0gMSkgeworICAgICAgd3JpdGVfZHVyYXRpb24gPSBUUlVFOworICAgIH0KKyAgfQorCisgIC8qIHdyaXRlIHRoZSBibG9jaywgZm9yIGRvY3R5cGUgdjIgdXNlIFNpbXBsZUJsb2NrIGlmIHBvc3NpYmxlCisgICAqIG9uZSBzbGljZSAoKmJyZWF0aCopLgorICAgKiBGSVhNRTogTmVlZCB0byBkbyBjb3JyZWN0IGxhY2luZyEgKi8KKyAgcmVsYXRpdmVfdGltZXN0YW1wNjQgPSBidWZmZXJfdGltZXN0YW1wIC0gbXV4LT5jbHVzdGVyX3RpbWU7CisgIGlmIChyZWxhdGl2ZV90aW1lc3RhbXA2NCA+PSAwKSB7CisgICAgLyogcm91bmQgdGhlIHRpbWVzdGFtcCAqLworICAgIHJlbGF0aXZlX3RpbWVzdGFtcDY0ICs9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAobXV4LT50aW1lX3NjYWxlLCAxLCAyKTsKKyAgICByZWxhdGl2ZV90aW1lc3RhbXAgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHJlbGF0aXZlX3RpbWVzdGFtcDY0LCAxLAorICAgICAgICBtdXgtPnRpbWVfc2NhbGUpOworICB9IGVsc2UgeworICAgIC8qIHJvdW5kIHRoZSB0aW1lc3RhbXAgKi8KKyAgICByZWxhdGl2ZV90aW1lc3RhbXA2NCAtPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKG11eC0+dGltZV9zY2FsZSwgMSwgMik7CisgICAgcmVsYXRpdmVfdGltZXN0YW1wID0KKyAgICAgICAgLSgoZ2ludDE2KSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKC1yZWxhdGl2ZV90aW1lc3RhbXA2NCwgMSwKKyAgICAgICAgICAgIG11eC0+dGltZV9zY2FsZSkpOworICB9CisKKyAgaWYgKGlzX3ZpZGVvX2ludmlzaWJsZSkKKyAgICBmbGFncyB8PSAweDA4OworCisgIGlmICghc3RyY21wIChjb2xsZWN0X3BhZC0+dHJhY2stPmNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fT1BVUykpIHsKKyAgICBjbWV0YSA9IGdzdF9idWZmZXJfZ2V0X2F1ZGlvX2NsaXBwaW5nX21ldGEgKGJ1Zik7CisgICAgZ19hc3NlcnQgKCFjbWV0YSB8fCBjbWV0YS0+Zm9ybWF0ID09IEdTVF9GT1JNQVRfREVGQVVMVCk7CisKKyAgICAvKiBTdGFydCBjbGlwcGluZyBpcyBkb25lIHZpYSBoZWFkZXIgYW5kIENvZGVjRGVsYXkgKi8KKyAgICBpZiAoY21ldGEgJiYgIWNtZXRhLT5lbmQpCisgICAgICBjbWV0YSA9IE5VTEw7CisgIH0KKworICBpZiAobXV4LT5kb2N0eXBlX3ZlcnNpb24gPiAxICYmICF3cml0ZV9kdXJhdGlvbiAmJiAhY21ldGEpIHsKKyAgICBpZiAoaXNfdmlkZW9fa2V5ZnJhbWUpCisgICAgICBmbGFncyB8PSAweDgwOworCisgICAgaGRyID0KKyAgICAgICAgZ3N0X21hdHJvc2thX211eF9jcmVhdGVfYnVmZmVyX2hlYWRlciAoY29sbGVjdF9wYWQtPnRyYWNrLAorICAgICAgICByZWxhdGl2ZV90aW1lc3RhbXAsIGZsYWdzKTsKKyAgICBnc3RfZWJtbF93cml0ZV9zZXRfY2FjaGUgKGVibWwsIDB4NDApOworICAgIGdzdF9lYm1sX3dyaXRlX2J1ZmZlcl9oZWFkZXIgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9TSU1QTEVCTE9DSywKKyAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSArIGdzdF9idWZmZXJfZ2V0X3NpemUgKGhkcikpOworICAgIGdzdF9lYm1sX3dyaXRlX2J1ZmZlciAoZWJtbCwgaGRyKTsKKyAgICBnc3RfZWJtbF93cml0ZV9mbHVzaF9jYWNoZSAoZWJtbCwgRkFMU0UsIGJ1ZmZlcl90aW1lc3RhbXApOworICAgIGdzdF9lYm1sX3dyaXRlX2J1ZmZlciAoZWJtbCwgYnVmKTsKKworICAgIHJldHVybiBnc3RfZWJtbF9sYXN0X3dyaXRlX3Jlc3VsdCAoZWJtbCk7CisgIH0gZWxzZSB7CisgICAgZ3N0X2VibWxfd3JpdGVfc2V0X2NhY2hlIChlYm1sLCBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpICogMik7CisgICAgLyogd3JpdGUgYW5kIGNhbGwgb3JkZXIgc2xpZ2h0bHkgdW5uYXR1cmFsLAorICAgICAqIGJ1dCBhdm9pZHMgc2VlayBhbmQgbWluaXplcyBwdXNoaW5nICovCisgICAgYmxvY2tncm91cCA9IGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0JMT0NLR1JPVVApOworICAgIGhkciA9CisgICAgICAgIGdzdF9tYXRyb3NrYV9tdXhfY3JlYXRlX2J1ZmZlcl9oZWFkZXIgKGNvbGxlY3RfcGFkLT50cmFjaywKKyAgICAgICAgcmVsYXRpdmVfdGltZXN0YW1wLCBmbGFncyk7CisgICAgaWYgKHdyaXRlX2R1cmF0aW9uKQorICAgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0JMT0NLRFVSQVRJT04sIGJsb2NrX2R1cmF0aW9uKTsKKworICAgIGlmICghc3RyY21wIChjb2xsZWN0X3BhZC0+dHJhY2stPmNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fT1BVUykKKyAgICAgICAgJiYgY21ldGEpIHsKKyAgICAgIC8qIFN0YXJ0IGNsaXBwaW5nIGlzIGRvbmUgdmlhIGhlYWRlciBhbmQgQ29kZWNEZWxheSAqLworICAgICAgaWYgKGNtZXRhLT5lbmQpIHsKKyAgICAgICAgZ3VpbnQ2NCBlbmQgPQorICAgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX3JvdW5kIChjbWV0YS0+ZW5kLCBHU1RfU0VDT05ELCA0ODAwMCk7CisgICAgICAgIGdzdF9lYm1sX3dyaXRlX3NpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9ESVNDQVJEUEFERElORywgZW5kKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnc3RfZWJtbF93cml0ZV9idWZmZXJfaGVhZGVyIChlYm1sLCBHU1RfTUFUUk9TS0FfSURfQkxPQ0ssCisgICAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikgKyBnc3RfYnVmZmVyX2dldF9zaXplIChoZHIpKTsKKyAgICBnc3RfZWJtbF93cml0ZV9idWZmZXIgKGVibWwsIGhkcik7CisgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaF9mdWxsIChlYm1sLCBibG9ja2dyb3VwLAorICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpKTsKKyAgICBnc3RfZWJtbF93cml0ZV9mbHVzaF9jYWNoZSAoZWJtbCwgRkFMU0UsIGJ1ZmZlcl90aW1lc3RhbXApOworICAgIGdzdF9lYm1sX3dyaXRlX2J1ZmZlciAoZWJtbCwgYnVmKTsKKworICAgIHJldHVybiBnc3RfZWJtbF9sYXN0X3dyaXRlX3Jlc3VsdCAoZWJtbCk7CisgIH0KK30KKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X2hhbmRsZV9idWZmZXI6CisgKiBAcGFkczogI0dzdENvbGxlY3RQYWRzCisgKiBAdXVzZXJfZGF0YTogI0dzdE1hdHJvc2thTXV4CisgKgorICogQ29sbGVjdHBhZHMgY2FsbGJhY2suCisgKgorICogUmV0dXJuczogI0dzdEZsb3dSZXR1cm4KKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9tdXhfaGFuZGxlX2J1ZmZlciAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLCBHc3RDb2xsZWN0RGF0YSAqIGRhdGEsCisgICAgR3N0QnVmZmVyICogYnVmLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdENsb2NrVGltZSBidWZmZXJfdGltZXN0YW1wOworICBHc3RNYXRyb3NrYU11eCAqbXV4ID0gR1NUX01BVFJPU0tBX01VWCAodXNlcl9kYXRhKTsKKyAgR3N0RWJtbFdyaXRlICplYm1sID0gbXV4LT5lYm1sX3dyaXRlOworICBHc3RNYXRyb3NrYVBhZCAqYmVzdCA9IChHc3RNYXRyb3NrYVBhZCAqKSBkYXRhOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJDb2xsZWN0ZWQgcGFkcyIpOworCisgIC8qIHN0YXJ0IHdpdGggYSBoZWFkZXIgKi8KKyAgaWYgKG11eC0+c3RhdGUgPT0gR1NUX01BVFJPU0tBX01VWF9TVEFURV9TVEFSVCkgeworICAgIGlmIChtdXgtPmNvbGxlY3QtPmRhdGEgPT0gTlVMTCkgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKG11eCwgU1RSRUFNLCBNVVgsIChOVUxMKSwKKyAgICAgICAgICAoIk5vIGlucHV0IHN0cmVhbXMgY29uZmlndXJlZCIpKTsKKyAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgICB9CisgICAgbXV4LT5zdGF0ZSA9IEdTVF9NQVRST1NLQV9NVVhfU1RBVEVfSEVBREVSOworICAgIGdzdF9lYm1sX3N0YXJ0X3N0cmVhbWhlYWRlciAoZWJtbCk7CisgICAgZ3N0X21hdHJvc2thX211eF9zdGFydCAobXV4LCBiZXN0LCBidWYpOworICAgIGdzdF9tYXRyb3NrYV9tdXhfc3RvcF9zdHJlYW1oZWFkZXIgKG11eCk7CisgICAgbXV4LT5zdGF0ZSA9IEdTVF9NQVRST1NLQV9NVVhfU1RBVEVfREFUQTsKKyAgfQorCisgIC8qIGlmIHRoZXJlIGlzIG5vIGJlc3QgcGFkLCB3ZSBoYXZlIHJlYWNoZWQgRU9TICovCisgIGlmIChiZXN0ID09IE5VTEwpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJObyBiZXN0IHBhZC4gRmluaXNoaW5nLi4uIik7CisgICAgaWYgKCFtdXgtPmVibWxfd3JpdGUtPnN0cmVhbWFibGUpIHsKKyAgICAgIGdzdF9tYXRyb3NrYV9tdXhfZmluaXNoIChtdXgpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICIuLi4gYnV0IHN0cmVhbWFibGUsIG5vdGhpbmcgdG8gZmluaXNoIik7CisgICAgfQorICAgIGdzdF9wYWRfcHVzaF9ldmVudCAobXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FT1M7CisgICAgZ290byBleGl0OworICB9CisKKyAgaWYgKGJlc3QtPnRyYWNrLT5jb2RlY19pZCA9PSBOVUxMKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoYmVzdC0+Y29sbGVjdC5wYWQsICJObyBjb2RlYy1pZCBmb3IgcGFkIik7CisgICAgcmV0ID0gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisgICAgZ290byBleGl0OworICB9CisKKyAgLyogaWYgd2UgaGF2ZSBhIGJlc3Qgc3RyZWFtLCBzaG91bGQgYWxzbyBoYXZlIGEgYnVmZmVyICovCisgIGdfYXNzZXJ0IChidWYpOworCisgIGJ1ZmZlcl90aW1lc3RhbXAgPSBnc3RfbWF0cm9za2FfdHJhY2tfZ2V0X2J1ZmZlcl90aW1lc3RhbXAgKGJlc3QtPnRyYWNrLCBidWYpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGJlc3QtPmNvbGxlY3QucGFkLCAiYmVzdCBwYWQgLSBidWZmZXIgdHMgJSIKKyAgICAgIEdTVF9USU1FX0ZPUk1BVCAiIGR1ciAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChidWZmZXJfdGltZXN0YW1wKSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikpKTsKKworICAvKiBtYWtlIG5vdGUgb2YgZmlyc3QgYW5kIGxhc3QgZW5jb3VudGVyZWQgdGltZXN0YW1wcywgc28gd2UgY2FuIGNhbGN1bGF0ZQorICAgKiB0aGUgYWN0dWFsIGR1cmF0aW9uIGxhdGVyIHdoZW4gd2Ugc2VuZCBhbiB1cGRhdGVkIGhlYWRlciBvbiBlb3MgKi8KKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChidWZmZXJfdGltZXN0YW1wKSkgeworICAgIEdzdENsb2NrVGltZSBzdGFydF90cyA9IGJ1ZmZlcl90aW1lc3RhbXA7CisgICAgR3N0Q2xvY2tUaW1lIGVuZF90cyA9IHN0YXJ0X3RzOworCisgICAgaWYgKEdTVF9CVUZGRVJfRFVSQVRJT05fSVNfVkFMSUQgKGJ1ZikpCisgICAgICBlbmRfdHMgKz0gR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKTsKKyAgICBlbHNlIGlmIChiZXN0LT50cmFjay0+ZGVmYXVsdF9kdXJhdGlvbikKKyAgICAgIGVuZF90cyArPSBiZXN0LT50cmFjay0+ZGVmYXVsdF9kdXJhdGlvbjsKKworICAgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGJlc3QtPmVuZF90cykgfHwgZW5kX3RzID4gYmVzdC0+ZW5kX3RzKQorICAgICAgYmVzdC0+ZW5kX3RzID0gZW5kX3RzOworCisgICAgaWYgKEdfVU5MSUtFTFkgKGJlc3QtPnN0YXJ0X3RzID09IEdTVF9DTE9DS19USU1FX05PTkUgfHwKKyAgICAgICAgICAgIHN0YXJ0X3RzIDwgYmVzdC0+c3RhcnRfdHMpKQorICAgICAgYmVzdC0+c3RhcnRfdHMgPSBzdGFydF90czsKKyAgfQorCisgIC8qIHdyaXRlIG9uZSBidWZmZXIgKi8KKyAgcmV0ID0gZ3N0X21hdHJvc2thX211eF93cml0ZV9kYXRhIChtdXgsIGJlc3QsIGJ1Zik7CisKK2V4aXQ6CisgIHJldHVybiByZXQ7Cit9CisKKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X2NoYW5nZV9zdGF0ZToKKyAqIEBlbGVtZW50OiAjR3N0TWF0cm9za2FNdXgKKyAqIEB0cmFuc2l0aW9uOiBTdGF0ZSBjaGFuZ2UgdHJhbnNpdGlvbi4KKyAqCisgKiBDaGFuZ2UgdGhlIG11eGVyIHN0YXRlLgorICoKKyAqIFJldHVybnM6ICNHc3RTdGF0ZUNoYW5nZVJldHVybgorICovCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9tYXRyb3NrYV9tdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RNYXRyb3NrYU11eCAqbXV4ID0gR1NUX01BVFJPU0tBX01VWCAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X2NvbGxlY3RfcGFkc19zdGFydCAobXV4LT5jb2xsZWN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUExBWUlORzoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3RfY29sbGVjdF9wYWRzX3N0b3AgKG11eC0+Y29sbGVjdCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUExBWUlOR19UT19QQVVTRUQ6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X21hdHJvc2thX211eF9yZXNldCAoR1NUX0VMRU1FTlQgKG11eCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX211eF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0TWF0cm9za2FNdXggKm11eDsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfTUFUUk9TS0FfTVVYIChvYmplY3QpKTsKKyAgbXV4ID0gR1NUX01BVFJPU0tBX01VWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfV1JJVElOR19BUFA6CisgICAgICBpZiAoIWdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXV4LCAid3JpdGluZy1hcHAgcHJvcGVydHkgY2FuIG5vdCBiZSBOVUxMIik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZ19mcmVlIChtdXgtPndyaXRpbmdfYXBwKTsKKyAgICAgIG11eC0+d3JpdGluZ19hcHAgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ET0NUWVBFX1ZFUlNJT046CisgICAgICBtdXgtPmRvY3R5cGVfdmVyc2lvbiA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01JTl9JTkRFWF9JTlRFUlZBTDoKKyAgICAgIG11eC0+bWluX2luZGV4X2ludGVydmFsID0gZ192YWx1ZV9nZXRfaW50NjQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVFJFQU1BQkxFOgorICAgICAgbXV4LT5lYm1sX3dyaXRlLT5zdHJlYW1hYmxlID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RJTUVDT0RFU0NBTEU6CisgICAgICBtdXgtPnRpbWVfc2NhbGUgPSBnX3ZhbHVlX2dldF9pbnQ2NCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01JTl9DTFVTVEVSX0RVUkFUSU9OOgorICAgICAgbXV4LT5taW5fY2x1c3Rlcl9kdXJhdGlvbiA9IGdfdmFsdWVfZ2V0X2ludDY0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX0NMVVNURVJfRFVSQVRJT046CisgICAgICBtdXgtPm1heF9jbHVzdGVyX2R1cmF0aW9uID0gZ192YWx1ZV9nZXRfaW50NjQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9tdXhfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE1hdHJvc2thTXV4ICptdXg7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX01BVFJPU0tBX01VWCAob2JqZWN0KSk7CisgIG11eCA9IEdTVF9NQVRST1NLQV9NVVggKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1dSSVRJTkdfQVBQOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgbXV4LT53cml0aW5nX2FwcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRE9DVFlQRV9WRVJTSU9OOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgbXV4LT5kb2N0eXBlX3ZlcnNpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01JTl9JTkRFWF9JTlRFUlZBTDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludDY0ICh2YWx1ZSwgbXV4LT5taW5faW5kZXhfaW50ZXJ2YWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NUUkVBTUFCTEU6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgbXV4LT5lYm1sX3dyaXRlLT5zdHJlYW1hYmxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USU1FQ09ERVNDQUxFOgorICAgICAgZ192YWx1ZV9zZXRfaW50NjQgKHZhbHVlLCBtdXgtPnRpbWVfc2NhbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01JTl9DTFVTVEVSX0RVUkFUSU9OOgorICAgICAgZ192YWx1ZV9zZXRfaW50NjQgKHZhbHVlLCBtdXgtPm1pbl9jbHVzdGVyX2R1cmF0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfQ0xVU1RFUl9EVVJBVElPTjoKKyAgICAgIGdfdmFsdWVfc2V0X2ludDY0ICh2YWx1ZSwgbXV4LT5tYXhfY2x1c3Rlcl9kdXJhdGlvbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmggYi9nc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI4Mzg0MAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaApAQCAtMCwwICsxLDE1NiBAQAorLyogR1N0cmVhbWVyIE1hdHJvc2thIG11eGVyL2RlbXV4ZXIKKyAqIChjKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqIChjKSAyMDA1IE1pY2hhbCBCZW5lcyA8bWljaGFsLmJlbmVzQHhlcmlzLmN6PgorICoKKyAqIG1hdHJvc2thLW11eC5oOiBtYXRyb3NrYSBmaWxlL3N0cmVhbSBtdXhlciBvYmplY3QgdHlwZXMKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX01BVFJPU0tBX01VWF9IX18KKyNkZWZpbmUgX19HU1RfTUFUUk9TS0FfTVVYX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGNvbGxlY3RwYWRzLmg+CisKKyNpbmNsdWRlICJlYm1sLXdyaXRlLmgiCisjaW5jbHVkZSAibWF0cm9za2EtaWRzLmgiCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9NQVRST1NLQV9NVVggXAorICAoZ3N0X21hdHJvc2thX211eF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX01BVFJPU0tBX01VWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfTUFUUk9TS0FfTVVYLCBHc3RNYXRyb3NrYU11eCkpCisjZGVmaW5lIEdTVF9NQVRST1NLQV9NVVhfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9NQVRST1NLQV9NVVgsIEdzdE1hdHJvc2thTXV4Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfTUFUUk9TS0FfTVVYKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9NQVRST1NLQV9NVVgpKQorI2RlZmluZSBHU1RfSVNfTUFUUk9TS0FfTVVYX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgR1NUX1RZUEVfTUFUUk9TS0FfTVVYKSkKKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX01BVFJPU0tBX01VWF9TVEFURV9TVEFSVCwKKyAgR1NUX01BVFJPU0tBX01VWF9TVEFURV9IRUFERVIsCisgIEdTVF9NQVRST1NLQV9NVVhfU1RBVEVfREFUQSwKK30gR3N0TWF0cm9za2FNdXhTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE1hdHJvc2thTWV0YVNlZWtJbmRleCB7CisgIGd1aW50MzIgIGlkOworICBndWludDY0ICBwb3M7Cit9IEdzdE1hdHJvc2thTWV0YVNlZWtJbmRleDsKKwordHlwZWRlZiBnYm9vbGVhbiAoKkdzdE1hdHJvc2thQ2Fwc0Z1bmMpIChHc3RQYWQgKnBhZCwgR3N0Q2FwcyAqY2Fwcyk7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RNYXRyb3NrYU11eCBHc3RNYXRyb3NrYU11eDsKKworLyogYWxsIGluZm9ybWF0aW9uIG5lZWRlZCBmb3Igb25lIG1hdHJvc2thIHN0cmVhbSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0Q29sbGVjdERhdGEgY29sbGVjdDsgICAgICAgLyogd2UgZXh0ZW5kIHRoZSBDb2xsZWN0RGF0YSAqLworICBHc3RNYXRyb3NrYUNhcHNGdW5jIGNhcHNmdW5jOworICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqdHJhY2s7CisKKyAgR3N0TWF0cm9za2FNdXggKm11eDsKKworICBHc3RUYWdMaXN0ICp0YWdzOworCisgIEdzdENsb2NrVGltZSBzdGFydF90czsKKyAgR3N0Q2xvY2tUaW1lIGVuZF90czsgICAgLyogbGFzdCB0aW1lc3RhbXAgKyAoaWYgYXZhaWxhYmxlKSBkdXJhdGlvbiAqLworICBndWludDY0IGRlZmF1bHRfZHVyYXRpb25fc2NhbGVkOworfQorR3N0TWF0cm9za2FQYWQ7CisKKworc3RydWN0IF9Hc3RNYXRyb3NrYU11eCB7CisgIEdzdEVsZW1lbnQgICAgIGVsZW1lbnQ7CisgIAorICAvKiA8IHByaXZhdGUgPiAqLworCisgIC8qIHBhZHMgKi8KKyAgR3N0UGFkICAgICAgICAqc3JjcGFkOworICBHc3RDb2xsZWN0UGFkcyAqY29sbGVjdDsKKyAgR3N0RWJtbFdyaXRlICplYm1sX3dyaXRlOworCisgIGd1aW50ICAgICAgICAgIG51bV9zdHJlYW1zLAorICAgICAgICAgICAgICAgICBudW1fdl9zdHJlYW1zLCBudW1fYV9zdHJlYW1zLCBudW1fdF9zdHJlYW1zOworCisgIC8qIEFwcGxpY2F0aW9uIG5hbWUgKGZvciB0aGUgd3JpdGluZyBhcHBsaWNhdGlvbiBoZWFkZXIgZWxlbWVudCkgKi8KKyAgZ2NoYXIgICAgICAgICAgKndyaXRpbmdfYXBwOworCisgIC8qIEVCTUwgRG9jVHlwZS4gKi8KKyAgY29uc3QgZ2NoYXIgICAgKmRvY3R5cGU7CisKKyAgLyogRG9jVHlwZSB2ZXJzaW9uLiAqLworICBndWludCAgICAgICAgICBkb2N0eXBlX3ZlcnNpb247CisKKyAgLyogc3RhdGUgKi8KKyAgR3N0TWF0cm9za2FNdXhTdGF0ZSBzdGF0ZTsKKworICAvKiBhIGN1ZSAoaW5kZXgpIHRhYmxlICovCisgIEdzdE1hdHJvc2thSW5kZXggKmluZGV4OworICBndWludCAgICAgICAgICBudW1faW5kZXhlczsKKyAgR3N0Q2xvY2tUaW1lRGlmZiBtaW5faW5kZXhfaW50ZXJ2YWw7CisgCisgIC8qIHRpbWVzY2FsZSBpbiB0aGUgZmlsZSAqLworICBndWludDY0ICAgICAgICB0aW1lX3NjYWxlOworICAvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIGxpbWl0IG9mIG5hbm9zZWNvbmRzIHlvdSBjYW4gaGF2ZSBpbiBhIGNsdXN0ZXIgKi8KKyAgZ3VpbnQ2NCAgICAgICAgbWF4X2NsdXN0ZXJfZHVyYXRpb247CisgIGd1aW50NjQgICAgICAgIG1pbl9jbHVzdGVyX2R1cmF0aW9uOworCisgIC8qIGxlbmd0aCwgcG9zaXRpb24gKHRpbWUsIG5zKSAqLworICBndWludDY0ICAgICAgICBkdXJhdGlvbjsKKworICAvKiBieXRlLXBvc2l0aW9ucyBvZiBtYXN0ZXItZWxlbWVudHMgKGZvciByZXBsYWNpbmcgY29udGVudHMpICovCisgIGd1aW50NjQgICAgICAgIHNlZ21lbnRfcG9zLAorICAgICAgICAgICAgICAgICBzZWVraGVhZF9wb3MsCisgICAgICAgICAgICAgICAgIGN1ZXNfcG9zLAorICAgICAgICAgICAgICAgICBjaGFwdGVyc19wb3MsCisgICAgICAgICAgICAgICAgIHRhZ3NfcG9zLAorICAgICAgICAgICAgICAgICBpbmZvX3BvcywKKyAgICAgICAgICAgICAgICAgdHJhY2tzX3BvcywKKyAgICAgICAgICAgICAgICAgZHVyYXRpb25fcG9zLAorICAgICAgICAgICAgICAgICBtZXRhX3BvczsKKyAgZ3VpbnQ2NCAgICAgICAgc2VnbWVudF9tYXN0ZXI7CisKKyAgLyogY3VycmVudCBjbHVzdGVyICovCisgIGd1aW50NjQgICAgICAgIGNsdXN0ZXIsCisgICAgICAgICAgICAgICAgIGNsdXN0ZXJfdGltZSwKKyAgICAgICAgICAgICAgICAgY2x1c3Rlcl9wb3MsCisJCSBwcmV2X2NsdXN0ZXJfc2l6ZTsKKworICAvKiBHc3RGb3JjZUtleVVuaXQgZXZlbnQgKi8KKyAgR3N0RXZlbnQgICAgICAgKmZvcmNlX2tleV91bml0X2V2ZW50OworCisgIC8qIEludGVybmFsIFRvYyAoYWRqdXN0ZWQgVUlEcyBhbmQgdGl0bGUgdGFncyByZW1vdmVkIHdoZW4gcHJvY2Vzc2VkKSAqLworICBHc3RUb2MgICAgICAgICAqaW50ZXJuYWxfdG9jOworCisgIC8qIEZsYWcgdG8gZWFzZSBoYW5kbGluZyBvZiBXZWJNIHNwZWNpZmljcyAqLworICBnYm9vbGVhbiBpc193ZWJtOworCisgIC8qIHVzZWQgdWlkcyAqLworICBHQXJyYXkgKnVzZWRfdWlkczsKK307CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RNYXRyb3NrYU11eENsYXNzIHsKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudDsKK30gR3N0TWF0cm9za2FNdXhDbGFzczsKKworR1R5cGUgICBnc3RfbWF0cm9za2FfbXV4X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX01BVFJPU0tBX01VWF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jIGIvZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2YTQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jCkBAIC0wLDAgKzEsMzIzNiBAQAorLyogR1N0cmVhbWVyIE1hdHJvc2thIG11eGVyL2RlbXV4ZXIKKyAqIChjKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqIChjKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiAoYykgMjAwOCBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKiAoYykgMjAxMSBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisgKgorICogbWF0cm9za2EtcGFyc2UuYzogbWF0cm9za2EgZmlsZS9zdHJlYW0gcGFyc2VyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyogVE9ETzogY2hlY2sgQ1JDMzIgaWYgcHJlc2VudAorICogVE9ETzogdGhlcmUgY2FuIGJlIGEgc2VnbWVudCBhZnRlciB0aGUgZmlyc3Qgc2VnbWVudC4gSGFuZGxlIGxpa2UKKyAqICAgICAgIGNoYWluZWQgb2dncy4gRml4ZXMgIzMzNDA4MgorICogVE9ETzogVGVzdCBzYW1wbGVzOiBodHRwOi8vd3d3Lm1hdHJvc2thLm9yZy9zYW1wbGVzL21hdHJpeC9pbmRleC5odG1sCisgKiAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly9zYW1wbGVzLm1wbGF5ZXJocS5odS9NYXRyb3NrYS8KKyAqIFRPRE86IGNoZWNrIGlmIHBhcnNlaW5nIGlzIGRvbmUgY29ycmVjdCBmb3IgYWxsIGNvZGVjcyBhY2NvcmRpbmcgdG8gc3BlYworICogVE9ETzogc2Vla2luZyB3aXRoIGluY29tcGxldGUgb3Igd2l0aG91dCBDVUUKKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1tYXRyb3NrYXBhcnNlCisgKgorICogbWF0cm9za2FwYXJzZSBwYXJzZWVzIGEgTWF0cm9za2EgZmlsZSBpbnRvIHRoZSBkaWZmZXJlbnQgY29udGFpbmVkIHN0cmVhbXMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGZpbGVzcmMgbG9jYXRpb249L3BhdGgvdG8vbWt2ICEgbWF0cm9za2FwYXJzZSAhIHZvcmJpc2RlYyAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhdXRvYXVkaW9zaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIHBhcnNlZXMgYSBNYXRyb3NrYSBmaWxlIGFuZCBvdXRwdXRzIHRoZSBjb250YWluZWQgVm9yYmlzIGF1ZGlvLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnbGliL2dwcmludGYuaD4KKworLyogRm9yIEFWSSBjb21wYXRpYmlsaXR5IG1vZGUKKyAgIGFuZCBmb3IgZm91cmNjIHN0dWZmICovCisjaW5jbHVkZSA8Z3N0L3JpZmYvcmlmZi1yZWFkLmg+CisjaW5jbHVkZSA8Z3N0L3JpZmYvcmlmZi1pZHMuaD4KKyNpbmNsdWRlIDxnc3QvcmlmZi9yaWZmLW1lZGlhLmg+CisKKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorCisjaW5jbHVkZSA8Z3N0L3BidXRpbHMvcGJ1dGlscy5oPgorCisjaW5jbHVkZSAibWF0cm9za2EtcGFyc2UuaCIKKyNpbmNsdWRlICJtYXRyb3NrYS1pZHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAobWF0cm9za2FwYXJzZV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBtYXRyb3NrYXBhcnNlX2RlYnVnCisKKyNkZWZpbmUgREVCVUdfRUxFTUVOVF9TVEFSVChwYXJzZSwgZWJtbCwgZWxlbWVudCkgXAorICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiUGFyc2luZyAiIGVsZW1lbnQgIiBlbGVtZW50IGF0IG9mZnNldCAlIiBcCisgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIGdzdF9lYm1sX3JlYWRfZ2V0X3BvcyAoZWJtbCkpCisKKyNkZWZpbmUgREVCVUdfRUxFTUVOVF9TVE9QKHBhcnNlLCBlYm1sLCBlbGVtZW50LCByZXQpIFwKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlBhcnNpbmcgIiBlbGVtZW50ICIgZWxlbWVudCAiIFwKKyAgICAgICAgIiBmaW5pc2hlZCB3aXRoICclcyciLCBnc3RfZmxvd19nZXRfbmFtZSAocmV0KSkKKworI2RlZmluZSBJTlZBTElEX0RBVEFfVEhSRVNIT0xEICgyICogMTAyNCAqIDEwMjQpCisKK2VudW0KK3sKKyAgUFJPUF8wCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbCA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtbWF0cm9za2E7IHZpZGVvL3gtbWF0cm9za2E7ICIKKyAgICAgICAgInZpZGVvL3gtbWF0cm9za2EtM2Q7IGF1ZGlvL3dlYm07IHZpZGVvL3dlYm0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcGwgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1tYXRyb3NrYTsgdmlkZW8veC1tYXRyb3NrYTsgIgorICAgICAgICAidmlkZW8veC1tYXRyb3NrYS0zZDsgYXVkaW8vd2VibTsgdmlkZW8vd2VibSIpCisgICAgKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X21hdHJvc2thX3BhcnNlX3BhcnNlX2lkIChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UsCisgICAgZ3VpbnQzMiBpZCwgZ3VpbnQ2NCBsZW5ndGgsIGd1aW50IG5lZWRlZCk7CisKKy8qIGVsZW1lbnQgZnVuY3Rpb25zICovCisvL3N0YXRpYyB2b2lkIGdzdF9tYXRyb3NrYV9wYXJzZV9sb29wIChHc3RQYWQgKiBwYWQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX3BhcnNlX2VsZW1lbnRfc2VuZF9ldmVudCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX3BhcnNlX2VsZW1lbnRfcXVlcnkgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworCisvKiBwYWQgZnVuY3Rpb25zICovCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX3BhcnNlX2hhbmRsZV9zZWVrX2V2ZW50IChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UsCisgICAgR3N0UGFkICogcGFkLCBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbWF0cm9za2FfcGFyc2VfaGFuZGxlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX3BhcnNlX2hhbmRsZV9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdFF1ZXJ5ICogcXVlcnkpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX3BhcnNlX2hhbmRsZV9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9tYXRyb3NrYV9wYXJzZV9jaGFpbiAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmZmVyKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfbWF0cm9za2FfcGFyc2VfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKyNpZiAwCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX3BhcnNlX3NldF9pbmRleCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEluZGV4ICogaW5kZXgpOworc3RhdGljIEdzdEluZGV4ICpnc3RfbWF0cm9za2FfcGFyc2VfZ2V0X2luZGV4IChHc3RFbGVtZW50ICogZWxlbWVudCk7CisjZW5kaWYKKworLyogc3RyZWFtIG1ldGhvZHMgKi8KK3N0YXRpYyB2b2lkIGdzdF9tYXRyb3NrYV9wYXJzZV9yZXNldCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpOworc3RhdGljIGdib29sZWFuIHBlcmZvcm1fc2Vla190b19vZmZzZXQgKEdzdE1hdHJvc2thUGFyc2UgKiBwYXJzZSwKKyAgICBndWludDY0IG9mZnNldCk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X21hdHJvc2thX3BhcnNlX2ZvcmdlX2NhcHMgKGdib29sZWFuIGlzX3dlYm0sCisgICAgZ2Jvb2xlYW4gaGFzX3ZpZGVvKTsKKworR1R5cGUgZ3N0X21hdHJvc2thX3BhcnNlX2dldF90eXBlICh2b2lkKTsKKyNkZWZpbmUgcGFyZW50X2NsYXNzIGdzdF9tYXRyb3NrYV9wYXJzZV9wYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdE1hdHJvc2thUGFyc2UsIGdzdF9tYXRyb3NrYV9wYXJzZSwgR1NUX1RZUEVfRUxFTUVOVCk7CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfcGFyc2VfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdE1hdHJvc2thUGFyc2UgKnBhcnNlID0gR1NUX01BVFJPU0tBX1BBUlNFIChvYmplY3QpOworCisgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9maW5hbGl6ZSAoJnBhcnNlLT5jb21tb24pOworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfcGFyc2VfY2xhc3NfaW5pdCAoR3N0TWF0cm9za2FQYXJzZUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKG1hdHJvc2thcGFyc2VfZGVidWcsICJtYXRyb3NrYXBhcnNlIiwgMCwKKyAgICAgICJNYXRyb3NrYSBwYXJzZXIiKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9tYXRyb3NrYV9wYXJzZV9maW5hbGl6ZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9wYXJzZV9jaGFuZ2Vfc3RhdGUpOworICBnc3RlbGVtZW50X2NsYXNzLT5zZW5kX2V2ZW50ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbWF0cm9za2FfcGFyc2VfZWxlbWVudF9zZW5kX2V2ZW50KTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cXVlcnkgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9wYXJzZV9lbGVtZW50X3F1ZXJ5KTsKKworI2lmIDAKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+c2V0X2luZGV4ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbWF0cm9za2FfcGFyc2Vfc2V0X2luZGV4KTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Z2V0X2luZGV4ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbWF0cm9za2FfcGFyc2VfZ2V0X2luZGV4KTsKKyNlbmRpZgorCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc3JjX3RlbXBsKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIk1hdHJvc2thIHBhcnNlciIsICJDb2RlYy9QYXJzZXIiLAorICAgICAgIlBhcnNlcyBNYXRyb3NrYS9XZWJNIHN0cmVhbXMgaW50byB2aWRlby9hdWRpby9zdWJ0aXRsZXMiLAorICAgICAgIkdTdHJlYW1lciBtYWludGFpbmVycyA8Z3N0cmVhbWVyLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZz4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9wYXJzZV9pbml0IChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UpCit7CisgIHBhcnNlLT5jb21tb24uc2lua3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc2lua190ZW1wbCwKKyAgICAgICJzaW5rIik7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChwYXJzZS0+Y29tbW9uLnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21hdHJvc2thX3BhcnNlX2NoYWluKSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChwYXJzZS0+Y29tbW9uLnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21hdHJvc2thX3BhcnNlX2hhbmRsZV9zaW5rX2V2ZW50KSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChwYXJzZSksIHBhcnNlLT5jb21tb24uc2lua3BhZCk7CisKKyAgcGFyc2UtPnNyY3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc3JjX3RlbXBsLCAic3JjIik7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChwYXJzZS0+c3JjcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9wYXJzZV9oYW5kbGVfc3JjX2V2ZW50KSk7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChwYXJzZS0+c3JjcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9wYXJzZV9oYW5kbGVfc3JjX3F1ZXJ5KSk7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKHBhcnNlLT5zcmNwYWQpOworCisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChwYXJzZSksIHBhcnNlLT5zcmNwYWQpOworCisgIC8qIGluaXQgZGVmYXVsdHMgZm9yIGNvbW1vbiByZWFkIGNvbnRleHQgKi8KKyAgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2luaXQgKCZwYXJzZS0+Y29tbW9uKTsKKworICBHU1RfT0JKRUNUX0ZMQUdfU0VUIChwYXJzZSwgR1NUX0VMRU1FTlRfRkxBR19JTkRFWEFCTEUpOworCisgIC8qIGZpbmlzaCBvZmYgKi8KKyAgZ3N0X21hdHJvc2thX3BhcnNlX3Jlc2V0IChHU1RfRUxFTUVOVCAocGFyc2UpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9wYXJzZV9yZXNldCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdE1hdHJvc2thUGFyc2UgKnBhcnNlID0gR1NUX01BVFJPU0tBX1BBUlNFIChlbGVtZW50KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlJlc2V0dGluZyBzdGF0ZSIpOworCisgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9yZXNldCAoR1NUX0VMRU1FTlQgKHBhcnNlKSwgJnBhcnNlLT5jb21tb24pOworCisgIHBhcnNlLT5udW1fYV9zdHJlYW1zID0gMDsKKyAgcGFyc2UtPm51bV90X3N0cmVhbXMgPSAwOworICBwYXJzZS0+bnVtX3Zfc3RyZWFtcyA9IDA7CisKKyAgcGFyc2UtPmNsb2NrID0gTlVMTDsKKyAgcGFyc2UtPnRyYWNrc19wYXJzZWQgPSBGQUxTRTsKKworICBnX2xpc3RfZm9yZWFjaCAocGFyc2UtPnNlZWtfcGFyc2VkLAorICAgICAgKEdGdW5jKSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fZnJlZV9wYXJzZWRfZWwsIE5VTEwpOworICBnX2xpc3RfZnJlZSAocGFyc2UtPnNlZWtfcGFyc2VkKTsKKyAgcGFyc2UtPnNlZWtfcGFyc2VkID0gTlVMTDsKKworICBwYXJzZS0+bGFzdF9zdG9wX2VuZCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIHBhcnNlLT5zZWVrX2Jsb2NrID0gMDsKKyAgcGFyc2UtPmNsdXN0ZXJfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIHBhcnNlLT5jbHVzdGVyX29mZnNldCA9IDA7CisgIHBhcnNlLT5uZXh0X2NsdXN0ZXJfb2Zmc2V0ID0gMDsKKyAgcGFyc2UtPmluZGV4X29mZnNldCA9IDA7CisgIHBhcnNlLT5zZWVrYWJsZSA9IEZBTFNFOworICBwYXJzZS0+bmVlZF9uZXdzZWdtZW50ID0gVFJVRTsKKyAgcGFyc2UtPmJ1aWxkaW5nX2luZGV4ID0gRkFMU0U7CisgIGlmIChwYXJzZS0+c2Vla19ldmVudCkgeworICAgIGdzdF9ldmVudF91bnJlZiAocGFyc2UtPnNlZWtfZXZlbnQpOworICAgIHBhcnNlLT5zZWVrX2V2ZW50ID0gTlVMTDsKKyAgfQorCisgIHBhcnNlLT5zZWVrX2luZGV4ID0gTlVMTDsKKyAgcGFyc2UtPnNlZWtfZW50cnkgPSAwOworCisgIGlmIChwYXJzZS0+Y2xvc2Vfc2VnbWVudCkgeworICAgIGdzdF9ldmVudF91bnJlZiAocGFyc2UtPmNsb3NlX3NlZ21lbnQpOworICAgIHBhcnNlLT5jbG9zZV9zZWdtZW50ID0gTlVMTDsKKyAgfQorCisgIGlmIChwYXJzZS0+bmV3X3NlZ21lbnQpIHsKKyAgICBnc3RfZXZlbnRfdW5yZWYgKHBhcnNlLT5uZXdfc2VnbWVudCk7CisgICAgcGFyc2UtPm5ld19zZWdtZW50ID0gTlVMTDsKKyAgfQorCisgIGlmIChwYXJzZS0+c3RyZWFtaGVhZGVyICE9IE5VTEwpIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChwYXJzZS0+c3RyZWFtaGVhZGVyKTsKKyAgICBwYXJzZS0+c3RyZWFtaGVhZGVyID0gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3BhcnNlX2FkZF9zdHJlYW0gKEdzdE1hdHJvc2thUGFyc2UgKiBwYXJzZSwgR3N0RWJtbFJlYWQgKiBlYm1sKQoreworICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqY29udGV4dDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIGd1aW50MzIgaWQ7CisKKyAgREVCVUdfRUxFTUVOVF9TVEFSVCAocGFyc2UsIGVibWwsICJUcmFja0VudHJ5Iik7CisKKyAgLyogc3RhcnQgd2l0aCB0aGUgbWFzdGVyICovCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChwYXJzZSwgZWJtbCwgIlRyYWNrRW50cnkiLCByZXQpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICAvKiBhbGxvY2F0ZSBnZW5lcmljLi4uIGlmIHdlIGtub3cgdGhlIHR5cGUsIHdlJ2xsIGdfcmVuZXcoKQorICAgKiB3aXRoIHRoZSBwcmVjaXNlIHR5cGUgKi8KKyAgY29udGV4dCA9IGdfbmV3MCAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQsIDEpOworICBnX3B0cl9hcnJheV9hZGQgKHBhcnNlLT5jb21tb24uc3JjLCBjb250ZXh0KTsKKyAgY29udGV4dC0+aW5kZXggPSBwYXJzZS0+Y29tbW9uLm51bV9zdHJlYW1zOworICBjb250ZXh0LT5pbmRleF93cml0ZXJfaWQgPSAtMTsKKyAgY29udGV4dC0+dHlwZSA9IDA7ICAgICAgICAgICAgLyogbm8gdHlwZSB5ZXQgKi8KKyAgY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbiA9IDA7CisgIGNvbnRleHQtPnBvcyA9IDA7CisgIGNvbnRleHQtPnNldF9kaXNjb250ID0gVFJVRTsKKyAgY29udGV4dC0+dGltZWNvZGVzY2FsZSA9IDEuMDsKKyAgY29udGV4dC0+ZmxhZ3MgPQorICAgICAgR1NUX01BVFJPU0tBX1RSQUNLX0VOQUJMRUQgfCBHU1RfTUFUUk9TS0FfVFJBQ0tfREVGQVVMVCB8CisgICAgICBHU1RfTUFUUk9TS0FfVFJBQ0tfTEFDSU5HOworICBjb250ZXh0LT50b19vZmZzZXQgPSBHX01BWElOVDY0OworICBjb250ZXh0LT5hbGlnbm1lbnQgPSAxOworICBwYXJzZS0+Y29tbW9uLm51bV9zdHJlYW1zKys7CisgIGdfYXNzZXJ0IChwYXJzZS0+Y29tbW9uLnNyYy0+bGVuID09IHBhcnNlLT5jb21tb24ubnVtX3N0cmVhbXMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiU3RyZWFtIG51bWJlciAlZCIsIGNvbnRleHQtPmluZGV4KTsKKworICAvKiB0cnkgcmVhZGluZyB0aGUgdHJhY2tlbnRyeSBoZWFkZXJzICovCisgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgLyogdHJhY2sgbnVtYmVyICh1bmlxdWUgc3RyZWFtIElEKSAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tOVU1CRVI6eworICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAocGFyc2UsICJJbnZhbGlkIFRyYWNrTnVtYmVyIDAiKTsKKyAgICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmICghZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3RyYWNrbnVtYmVyX3VuaXF1ZSAoJnBhcnNlLT5jb21tb24sCisgICAgICAgICAgICAgICAgbnVtKSkgeworICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBhcnNlLCAiVHJhY2tOdW1iZXIgJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAgICAgICAiIGlzIG5vdCB1bmlxdWUiLCBudW0pOworICAgICAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJUcmFja051bWJlcjogJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgY29udGV4dC0+bnVtID0gbnVtOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgICAgLyogdHJhY2sgVUlEICh1bmlxdWUgaWRlbnRpZmllcikgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLVUlEOnsKKyAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChudW0gPT0gMCkgeworICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBhcnNlLCAiSW52YWxpZCBUcmFja1VJRCAwIik7CisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlRyYWNrVUlEOiAlIiBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICBjb250ZXh0LT51aWQgPSBudW07CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAgIC8qIHRyYWNrIHR5cGUgKHZpZGVvLCBhdWRpbywgY29tYmluZWQsIHN1YnRpdGxlLCBldGMuKSAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tUWVBFOnsKKyAgICAgICAgZ3VpbnQ2NCB0cmFja190eXBlOworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZ0cmFja190eXBlKSkgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb250ZXh0LT50eXBlICE9IDAgJiYgY29udGV4dC0+dHlwZSAhPSB0cmFja190eXBlKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAgICAgIk1vcmUgdGhhbiBvbmUgdHJhY2t0eXBlIGRlZmluZWQgaW4gYSBUcmFja0VudHJ5IC0gc2tpcHBpbmciKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFja190eXBlIDwgMSB8fCB0cmFja190eXBlID4gMjU0KSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIkludmFsaWQgVHJhY2tUeXBlICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICAgIHRyYWNrX3R5cGUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJUcmFja1R5cGU6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHRyYWNrX3R5cGUpOworCisgICAgICAgIC8qIG9rLCBzbyB3ZSdyZSBhY3R1YWxseSBnb2luZyB0byByZWFsbG9jYXRlIHRoaXMgdGhpbmcgKi8KKyAgICAgICAgc3dpdGNoICh0cmFja190eXBlKSB7CisgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9WSURFTzoKKyAgICAgICAgICAgIGdzdF9tYXRyb3NrYV90cmFja19pbml0X3ZpZGVvX2NvbnRleHQgKCZjb250ZXh0KTsKKyAgICAgICAgICAgIHBhcnNlLT5jb21tb24uaGFzX3ZpZGVvID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQVVESU86CisgICAgICAgICAgICBnc3RfbWF0cm9za2FfdHJhY2tfaW5pdF9hdWRpb19jb250ZXh0ICgmY29udGV4dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFOgorICAgICAgICAgICAgZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfc3VidGl0bGVfY29udGV4dCAoJmNvbnRleHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9DT01QTEVYOgorICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfTE9HTzoKKyAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX0JVVFRPTlM6CisgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9DT05UUk9MOgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLAorICAgICAgICAgICAgICAgICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIFRyYWNrVHlwZSAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgICAgIHRyYWNrX3R5cGUpOworICAgICAgICAgICAgY29udGV4dC0+dHlwZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBnX3B0cl9hcnJheV9pbmRleCAocGFyc2UtPmNvbW1vbi5zcmMsIHBhcnNlLT5jb21tb24ubnVtX3N0cmVhbXMgLSAxKQorICAgICAgICAgICAgPSBjb250ZXh0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiB0cmFja3R5cGUgc3BlY2lmaWMgc3R1ZmYgZm9yIHZpZGVvICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS1ZJREVPOnsKKyAgICAgICAgR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCAqdmlkZW9jb250ZXh0OworCisgICAgICAgIERFQlVHX0VMRU1FTlRfU1RBUlQgKHBhcnNlLCBlYm1sLCAiVHJhY2tWaWRlbyIpOworCisgICAgICAgIGlmICghZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfdmlkZW9fY29udGV4dCAoJmNvbnRleHQpKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAgICAgIlRyYWNrVmlkZW8gZWxlbWVudCBpbiBub24tdmlkZW8gdHJhY2sgLSBpZ25vcmluZyB0cmFjayIpOworICAgICAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB2aWRlb2NvbnRleHQgPSAoR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCAqKSBjb250ZXh0OworICAgICAgICBnX3B0cl9hcnJheV9pbmRleCAocGFyc2UtPmNvbW1vbi5zcmMsIHBhcnNlLT5jb21tb24ubnVtX3N0cmVhbXMgLSAxKQorICAgICAgICAgICAgPSBjb250ZXh0OworCisgICAgICAgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYKKyAgICAgICAgICAgIGdzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoZWJtbCwgMSwgVFJVRSkpIHsKKyAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3BlZWtfaWQgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBzd2l0Y2ggKGlkKSB7CisgICAgICAgICAgICAgIC8qIFNob3VsZCBiZSBvbmUgbGV2ZWwgdXAgYnV0IHNvbWUgYnJva2VuIG11eGVycyB3cml0ZSBpdCBoZXJlLiAqLworICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tERUZBVUxURFVSQVRJT046eworICAgICAgICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIkludmFsaWQgVHJhY2tEZWZhdWx0RHVyYXRpb24gMCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICAgICAiVHJhY2tEZWZhdWx0RHVyYXRpb246ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgICAgICAgIGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24gPSBudW07CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIHZpZGVvIGZyYW1lcmF0ZSAqLworICAgICAgICAgICAgICAvKiBOT1RFOiBUaGlzIG9uZSBpcyBoZXJlIG9ubHkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgICAgICAgICAgICAgICAqIFVzZSBfVFJBQ0tERUZBVUxEVVJBVElPTiBvbmUgbGV2ZWwgdXAuICovCisgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9WSURFT0ZSQU1FUkFURTp7CisgICAgICAgICAgICAgIGdkb3VibGUgbnVtOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9mbG9hdCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSA8PSAwLjApIHsKKyAgICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLCAiSW52YWxpZCBUcmFja1ZpZGVvRlBTICVsZiIsIG51bSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlRyYWNrVmlkZW9GcmFtZVJhdGU6ICVsZiIsIG51bSk7CisgICAgICAgICAgICAgIGlmIChjb250ZXh0LT5kZWZhdWx0X2R1cmF0aW9uID09IDApCisgICAgICAgICAgICAgICAgY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIGdzdF9nZG91YmxlX3RvX2d1aW50NjQgKChnZG91YmxlKSBHU1RfU0VDT05EICogKDEuMCAvIG51bSkpOworICAgICAgICAgICAgICB2aWRlb2NvbnRleHQtPmRlZmF1bHRfZnBzID0gbnVtOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiB3aWR0aCBvZiB0aGUgc2l6ZSB0byBkaXNwbGF5IHRoZSB2aWRlbyBhdCAqLworICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9ESVNQTEFZV0lEVEg6eworICAgICAgICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIkludmFsaWQgVHJhY2tWaWRlb0Rpc3BsYXlXaWR0aCAwIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAgICAgICAgICJUcmFja1ZpZGVvRGlzcGxheVdpZHRoOiAlIiBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICAgICAgICB2aWRlb2NvbnRleHQtPmRpc3BsYXlfd2lkdGggPSBudW07CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIGhlaWdodCBvZiB0aGUgc2l6ZSB0byBkaXNwbGF5IHRoZSB2aWRlbyBhdCAqLworICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9ESVNQTEFZSEVJR0hUOnsKKyAgICAgICAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGlmIChudW0gPT0gMCkgeworICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsICJJbnZhbGlkIFRyYWNrVmlkZW9EaXNwbGF5SGVpZ2h0IDAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLAorICAgICAgICAgICAgICAgICAgIlRyYWNrVmlkZW9EaXNwbGF5SGVpZ2h0OiAlIiBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICAgICAgICB2aWRlb2NvbnRleHQtPmRpc3BsYXlfaGVpZ2h0ID0gbnVtOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiB3aWR0aCBvZiB0aGUgdmlkZW8gaW4gdGhlIGZpbGUgKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPUElYRUxXSURUSDp7CisgICAgICAgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBpZiAobnVtID09IDApIHsKKyAgICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLCAiSW52YWxpZCBUcmFja1ZpZGVvUGl4ZWxXaWR0aCAwIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAgICAgICAgICJUcmFja1ZpZGVvUGl4ZWxXaWR0aDogJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5waXhlbF93aWR0aCA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogaGVpZ2h0IG9mIHRoZSB2aWRlbyBpbiB0aGUgZmlsZSAqLworICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9QSVhFTEhFSUdIVDp7CisgICAgICAgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBpZiAobnVtID09IDApIHsKKyAgICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLCAiSW52YWxpZCBUcmFja1ZpZGVvUGl4ZWxIZWlnaHQgMCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICAgICAiVHJhY2tWaWRlb1BpeGVsSGVpZ2h0OiAlIiBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICAgICAgICB2aWRlb2NvbnRleHQtPnBpeGVsX2hlaWdodCA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogd2hldGhlciB0aGUgdmlkZW8gaXMgaW50ZXJsYWNlZCAqLworICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9GTEFHSU5URVJMQUNFRDp7CisgICAgICAgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBpZiAobnVtKQorICAgICAgICAgICAgICAgIGNvbnRleHQtPmZsYWdzIHw9IEdTVF9NQVRST1NLQV9WSURFT1RSQUNLX0lOVEVSTEFDRUQ7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5mbGFncyAmPSB+R1NUX01BVFJPU0tBX1ZJREVPVFJBQ0tfSU5URVJMQUNFRDsKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJUcmFja1ZpZGVvSW50ZXJsYWNlZDogJWQiLAorICAgICAgICAgICAgICAgICAgKGNvbnRleHQtPmZsYWdzICYgR1NUX01BVFJPU0tBX1ZJREVPVFJBQ0tfSU5URVJMQUNFRCkgPyAxIDoKKyAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiBhc3BlY3QgcmF0aW8gYmVoYXZpb3VyICovCisgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9WSURFT0FTUEVDVFJBVElPVFlQRTp7CisgICAgICAgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBpZiAobnVtICE9IEdTVF9NQVRST1NLQV9BU1BFQ1RfUkFUSU9fTU9ERV9GUkVFICYmCisgICAgICAgICAgICAgICAgICBudW0gIT0gR1NUX01BVFJPU0tBX0FTUEVDVF9SQVRJT19NT0RFX0tFRVAgJiYKKyAgICAgICAgICAgICAgICAgIG51bSAhPSBHU1RfTUFUUk9TS0FfQVNQRUNUX1JBVElPX01PREVfRklYRUQpIHsKKyAgICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLAorICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBUcmFja1ZpZGVvQXNwZWN0UmF0aW9UeXBlIDB4JXgiLCAoZ3VpbnQpIG51bSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICAgICAiVHJhY2tWaWRlb0FzcGVjdFJhdGlvVHlwZTogJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5hc3JfbW9kZSA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogY29sb3Vyc3BhY2UgKG9ubHkgbWF0dGVycyBmb3IgcmF3IHZpZGVvKSBmb3VyY2MgKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPQ09MT1VSU1BBQ0U6eworICAgICAgICAgICAgICBndWludDggKmRhdGE7CisgICAgICAgICAgICAgIGd1aW50NjQgZGF0YWxlbjsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9CisgICAgICAgICAgICAgICAgICAgICAgZ3N0X2VibWxfcmVhZF9iaW5hcnkgKGVibWwsICZpZCwgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhbGVuKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKGRhdGFsZW4gIT0gNCkgeworICAgICAgICAgICAgICAgIGdfZnJlZSAoZGF0YSk7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgVHJhY2tWaWRlb0NvbG91clNwYWNlIGxlbmd0aCAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgICAgICAgICBkYXRhbGVuKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIG1lbWNweSAoJnZpZGVvY29udGV4dC0+Zm91cmNjLCBkYXRhLCA0KTsKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICAgICAiVHJhY2tWaWRlb0NvbG91clNwYWNlOiAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAodmlkZW9jb250ZXh0LT5mb3VyY2MpKTsKKyAgICAgICAgICAgICAgZ19mcmVlIChkYXRhKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICAgICAiVW5rbm93biBUcmFja1ZpZGVvIHN1YmVsZW1lbnQgMHgleCAtIGlnbm9yaW5nIiwgaWQpOworICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPU1RFUkVPTU9ERToKKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPRElTUExBWVVOSVQ6CisgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9WSURFT1BJWEVMQ1JPUEJPVFRPTToKKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPUElYRUxDUk9QVE9QOgorICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9QSVhFTENST1BMRUZUOgorICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9QSVhFTENST1BSSUdIVDoKKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPR0FNTUFWQUxVRToKKyAgICAgICAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9za2lwIChlYm1sKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgREVCVUdfRUxFTUVOVF9TVE9QIChwYXJzZSwgZWJtbCwgIlRyYWNrVmlkZW8iLCByZXQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiB0cmFja3R5cGUgc3BlY2lmaWMgc3R1ZmYgZm9yIGF1ZGlvICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0FVRElPOnsKKyAgICAgICAgR3N0TWF0cm9za2FUcmFja0F1ZGlvQ29udGV4dCAqYXVkaW9jb250ZXh0OworCisgICAgICAgIERFQlVHX0VMRU1FTlRfU1RBUlQgKHBhcnNlLCBlYm1sLCAiVHJhY2tBdWRpbyIpOworCisgICAgICAgIGlmICghZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfYXVkaW9fY29udGV4dCAoJmNvbnRleHQpKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAgICAgIlRyYWNrQXVkaW8gZWxlbWVudCBpbiBub24tYXVkaW8gdHJhY2sgLSBpZ25vcmluZyB0cmFjayIpOworICAgICAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgYXVkaW9jb250ZXh0ID0gKEdzdE1hdHJvc2thVHJhY2tBdWRpb0NvbnRleHQgKikgY29udGV4dDsKKyAgICAgICAgZ19wdHJfYXJyYXlfaW5kZXggKHBhcnNlLT5jb21tb24uc3JjLCBwYXJzZS0+Y29tbW9uLm51bV9zdHJlYW1zIC0gMSkKKyAgICAgICAgICAgID0gY29udGV4dDsKKworICAgICAgICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmCisgICAgICAgICAgICBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgc3dpdGNoIChpZCkgeworICAgICAgICAgICAgICAvKiBzYW1wbGVyYXRlICovCisgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9BVURJT1NBTVBMSU5HRlJFUTp7CisgICAgICAgICAgICAgIGdkb3VibGUgbnVtOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9mbG9hdCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgICAgICBpZiAobnVtIDw9IDAuMCkgeworICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFRyYWNrQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSAlbGYiLCBudW0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJUcmFja0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3k6ICVsZiIsIG51bSk7CisgICAgICAgICAgICAgIGF1ZGlvY29udGV4dC0+c2FtcGxlcmF0ZSA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogYml0ZGVwdGggKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0FVRElPQklUREVQVEg6eworICAgICAgICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIkludmFsaWQgVHJhY2tBdWRpb0JpdERlcHRoIDAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiVHJhY2tBdWRpb0JpdERlcHRoOiAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgICAgICAgbnVtKTsKKyAgICAgICAgICAgICAgYXVkaW9jb250ZXh0LT5iaXRkZXB0aCA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogY2hhbm5lbHMgKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0FVRElPQ0hBTk5FTFM6eworICAgICAgICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIkludmFsaWQgVHJhY2tBdWRpb0NoYW5uZWxzIDAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiVHJhY2tBdWRpb0NoYW5uZWxzOiAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgICAgICAgbnVtKTsKKyAgICAgICAgICAgICAgYXVkaW9jb250ZXh0LT5jaGFubmVscyA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICAgICAiVW5rbm93biBUcmFja0F1ZGlvIHN1YmVsZW1lbnQgMHgleCAtIGlnbm9yaW5nIiwgaWQpOworICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0FVRElPQ0hBTk5FTFBPU0lUSU9OUzoKKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0FVRElPT1VUUFVUU0FNUExJTkdGUkVROgorICAgICAgICAgICAgICByZXQgPSBnc3RfZWJtbF9yZWFkX3NraXAgKGVibWwpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBERUJVR19FTEVNRU5UX1NUT1AgKHBhcnNlLCBlYm1sLCAiVHJhY2tBdWRpbyIsIHJldCk7CisKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgICAgLyogY29kZWMgaWRlbnRpZmllciAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ09ERUNJRDp7CisgICAgICAgIGdjaGFyICp0ZXh0OworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9hc2NpaSAoZWJtbCwgJmlkLCAmdGV4dCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiQ29kZWNJRDogJXMiLCBHU1RfU1RSX05VTEwgKHRleHQpKTsKKyAgICAgICAgY29udGV4dC0+Y29kZWNfaWQgPSB0ZXh0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiBjb2RlYyBwcml2YXRlIGRhdGEgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPREVDUFJJVkFURTp7CisgICAgICAgIGd1aW50OCAqZGF0YTsKKyAgICAgICAgZ3VpbnQ2NCBzaXplOworCisgICAgICAgIGlmICgocmV0ID0KKyAgICAgICAgICAgICAgICBnc3RfZWJtbF9yZWFkX2JpbmFyeSAoZWJtbCwgJmlkLCAmZGF0YSwgJnNpemUpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjb250ZXh0LT5jb2RlY19wcml2ID0gZGF0YTsKKyAgICAgICAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplID0gc2l6ZTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIkNvZGVjUHJpdmF0ZSBvZiBzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICBzaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgICAgLyogbmFtZSBvZiB0aGUgY29kZWMgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPREVDTkFNRTp7CisgICAgICAgIGdjaGFyICp0ZXh0OworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91dGY4IChlYm1sLCAmaWQsICZ0ZXh0KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJDb2RlY05hbWU6ICVzIiwgR1NUX1NUUl9OVUxMICh0ZXh0KSk7CisgICAgICAgIGNvbnRleHQtPmNvZGVjX25hbWUgPSB0ZXh0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiBuYW1lIG9mIHRoaXMgdHJhY2sgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLTkFNRTp7CisgICAgICAgIGdjaGFyICp0ZXh0OworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91dGY4IChlYm1sLCAmaWQsICZ0ZXh0KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY29udGV4dC0+bmFtZSA9IHRleHQ7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiVHJhY2tOYW1lOiAlcyIsIEdTVF9TVFJfTlVMTCAodGV4dCkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiBsYW5ndWFnZSAobWF0dGVycyBmb3IgYXVkaW8vc3VidGl0bGVzLCBtb3N0bHkpICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0xBTkdVQUdFOnsKKyAgICAgICAgZ2NoYXIgKnRleHQ7CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3V0ZjggKGVibWwsICZpZCwgJnRleHQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNvbnRleHQtPmxhbmd1YWdlID0gdGV4dDsKKworICAgICAgICAvKiBmcmUtY2EgPT4gZnJlICovCisgICAgICAgIGlmIChzdHJsZW4gKGNvbnRleHQtPmxhbmd1YWdlKSA+PSA0ICYmIGNvbnRleHQtPmxhbmd1YWdlWzNdID09ICctJykKKyAgICAgICAgICBjb250ZXh0LT5sYW5ndWFnZVszXSA9ICdcMCc7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJUcmFja0xhbmd1YWdlOiAlcyIsCisgICAgICAgICAgICBHU1RfU1RSX05VTEwgKGNvbnRleHQtPmxhbmd1YWdlKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAgIC8qIHdoZXRoZXIgdGhpcyBpcyBhY3R1YWxseSB1c2VkICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0ZMQUdFTkFCTEVEOnsKKyAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChudW0pCisgICAgICAgICAgY29udGV4dC0+ZmxhZ3MgfD0gR1NUX01BVFJPU0tBX1RSQUNLX0VOQUJMRUQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBjb250ZXh0LT5mbGFncyAmPSB+R1NUX01BVFJPU0tBX1RSQUNLX0VOQUJMRUQ7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJUcmFja0VuYWJsZWQ6ICVkIiwKKyAgICAgICAgICAgIChjb250ZXh0LT5mbGFncyAmIEdTVF9NQVRST1NLQV9UUkFDS19FTkFCTEVEKSA/IDEgOiAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgICAgLyogd2hldGhlciBpdCdzIHRoZSBkZWZhdWx0IGZvciB0aGlzIHRyYWNrIHR5cGUgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLRkxBR0RFRkFVTFQ6eworICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG51bSkKKyAgICAgICAgICBjb250ZXh0LT5mbGFncyB8PSBHU1RfTUFUUk9TS0FfVFJBQ0tfREVGQVVMVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGNvbnRleHQtPmZsYWdzICY9IH5HU1RfTUFUUk9TS0FfVFJBQ0tfREVGQVVMVDsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlRyYWNrRGVmYXVsdDogJWQiLAorICAgICAgICAgICAgKGNvbnRleHQtPmZsYWdzICYgR1NUX01BVFJPU0tBX1RSQUNLX0VOQUJMRUQpID8gMSA6IDApOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiB3aGV0aGVyIHRoZSB0cmFjayBtdXN0IGJlIHVzZWQgZHVyaW5nIHBsYXliYWNrICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0ZMQUdGT1JDRUQ6eworICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG51bSkKKyAgICAgICAgICBjb250ZXh0LT5mbGFncyB8PSBHU1RfTUFUUk9TS0FfVFJBQ0tfRk9SQ0VEOworICAgICAgICBlbHNlCisgICAgICAgICAgY29udGV4dC0+ZmxhZ3MgJj0gfkdTVF9NQVRST1NLQV9UUkFDS19GT1JDRUQ7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJUcmFja0ZvcmNlZDogJWQiLAorICAgICAgICAgICAgKGNvbnRleHQtPmZsYWdzICYgR1NUX01BVFJPU0tBX1RSQUNLX0VOQUJMRUQpID8gMSA6IDApOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiBsYWNpbmcgKGxpa2UgTVBFRywgd2hlcmUgYmxvY2tzIGRvbid0IGVuZC9zdGFydCBvbiBmcmFtZQorICAgICAgICAgKiBib3VuZGFyaWVzKSAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tGTEFHTEFDSU5HOnsKKyAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChudW0pCisgICAgICAgICAgY29udGV4dC0+ZmxhZ3MgfD0gR1NUX01BVFJPU0tBX1RSQUNLX0xBQ0lORzsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGNvbnRleHQtPmZsYWdzICY9IH5HU1RfTUFUUk9TS0FfVFJBQ0tfTEFDSU5HOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiVHJhY2tMYWNpbmc6ICVkIiwKKyAgICAgICAgICAgIChjb250ZXh0LT5mbGFncyAmIEdTVF9NQVRST1NLQV9UUkFDS19FTkFCTEVEKSA/IDEgOiAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgICAgLyogZGVmYXVsdCBsZW5ndGggKGluIHRpbWUpIG9mIG9uZSBkYXRhIGJsb2NrIGluIHRoaXMgdHJhY2sgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLREVGQVVMVERVUkFUSU9OOnsKKyAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIkludmFsaWQgVHJhY2tEZWZhdWx0RHVyYXRpb24gMCIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJUcmFja0RlZmF1bHREdXJhdGlvbjogJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgIG51bSk7CisgICAgICAgIGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24gPSBudW07CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DT05URU5URU5DT0RJTkdTOnsKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3JlYWRfdHJhY2tfZW5jb2RpbmdzICgmcGFyc2UtPmNvbW1vbiwKKyAgICAgICAgICAgIGVibWwsIGNvbnRleHQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tUSU1FQ09ERVNDQUxFOnsKKyAgICAgICAgZ2RvdWJsZSBudW07CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX2Zsb2F0IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAobnVtIDw9IDAuMCkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsICJJbnZhbGlkIFRyYWNrVGltZUNvZGVTY2FsZSAlbGYiLCBudW0pOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJUcmFja1RpbWVDb2RlU2NhbGU6ICVsZiIsIG51bSk7CisgICAgICAgIGNvbnRleHQtPnRpbWVjb2Rlc2NhbGUgPSBudW07CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfV0FSTklORyAoIlVua25vd24gVHJhY2tFbnRyeSBzdWJlbGVtZW50IDB4JXggLSBpZ25vcmluZyIsIGlkKTsKKyAgICAgICAgLyogcGFzcy10aHJvdWdoICovCisKKyAgICAgICAgLyogd2UgaWdub3JlIHRoZXNlIGJlY2F1c2UgdGhleSdyZSBub3RoaW5nIHVzZWZ1bCAoaS5lLiBjcmFwKQorICAgICAgICAgKiBvciBzaW1wbHkgbm90IGltcGxlbWVudGVkIHlldC4gKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLTUlOQ0FDSEU6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS01BWENBQ0hFOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfTUFYQkxPQ0tBRERJVElPTklEOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tBVFRBQ0hNRU5UTElOSzoKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLT1ZFUkxBWToKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLVFJBTlNMQVRFOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tPRkZTRVQ6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DT0RFQ1NFVFRJTkdTOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ09ERUNJTkZPVVJMOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ09ERUNET1dOTE9BRFVSTDoKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPREVDREVDT0RFQUxMOgorICAgICAgICByZXQgPSBnc3RfZWJtbF9yZWFkX3NraXAgKGVibWwpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBERUJVR19FTEVNRU5UX1NUT1AgKHBhcnNlLCBlYm1sLCAiVHJhY2tFbnRyeSIsIHJldCk7CisKKyAgLyogRGVjb2RlIGNvZGVjIHByaXZhdGUgZGF0YSBpZiBuZWNlc3NhcnkgKi8KKyAgaWYgKGNvbnRleHQtPmVuY29kaW5ncyAmJiBjb250ZXh0LT5lbmNvZGluZ3MtPmxlbiA+IDAgJiYgY29udGV4dC0+Y29kZWNfcHJpdgorICAgICAgJiYgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplID4gMCkgeworICAgIGlmICghZ3N0X21hdHJvc2thX2RlY29kZV9kYXRhIChjb250ZXh0LT5lbmNvZGluZ3MsCisgICAgICAgICAgICAmY29udGV4dC0+Y29kZWNfcHJpdiwgJmNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSwKKyAgICAgICAgICAgIEdTVF9NQVRST1NLQV9UUkFDS19FTkNPRElOR19TQ09QRV9DT0RFQ19EQVRBLCBUUlVFKSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIkRlY29kaW5nIGNvZGVjIHByaXZhdGUgZGF0YSBmYWlsZWQiKTsKKyAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIH0KKyAgfQorCisgIGlmIChjb250ZXh0LT50eXBlID09IDAgfHwgY29udGV4dC0+Y29kZWNfaWQgPT0gTlVMTCB8fCAocmV0ICE9IEdTVF9GTE9XX09LCisgICAgICAgICAgJiYgcmV0ICE9IEdTVF9GTE9XX0VPUykpIHsKKyAgICBpZiAocmV0ID09IEdTVF9GTE9XX09LIHx8IHJldCA9PSBHU1RfRkxPV19FT1MpCisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGVibWwsICJVbmtub3duIHN0cmVhbS9jb2RlYyBpbiB0cmFjayBlbnRyeSBoZWFkZXIiKTsKKworICAgIHBhcnNlLT5jb21tb24ubnVtX3N0cmVhbXMtLTsKKyAgICBnX3B0cl9hcnJheV9yZW1vdmVfaW5kZXggKHBhcnNlLT5jb21tb24uc3JjLCBwYXJzZS0+Y29tbW9uLm51bV9zdHJlYW1zKTsKKyAgICBnX2Fzc2VydCAocGFyc2UtPmNvbW1vbi5zcmMtPmxlbiA9PSBwYXJzZS0+Y29tbW9uLm51bV9zdHJlYW1zKTsKKyAgICBnc3RfbWF0cm9za2FfdHJhY2tfZnJlZSAoY29udGV4dCk7CisKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgaWYgKChjb250ZXh0LT5sYW5ndWFnZSA9PSBOVUxMIHx8ICpjb250ZXh0LT5sYW5ndWFnZSA9PSAnXDAnKSAmJgorICAgICAgKGNvbnRleHQtPnR5cGUgPT0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQVVESU8gfHwKKyAgICAgICAgICBjb250ZXh0LT50eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFKSkgeworICAgIEdTVF9MT0cgKCJzdHJlYW0gJWQ6IGxhbmd1YWdlPWVuZyAoYXNzdW1pbmcgZGVmYXVsdCkiLCBjb250ZXh0LT5pbmRleCk7CisgICAgY29udGV4dC0+bGFuZ3VhZ2UgPSBnX3N0cmR1cCAoImVuZyIpOworICB9CisKKworICAvKiB0YWRhYWghICovCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX3BhcnNlX3F1ZXJ5IChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKyAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKmNvbnRleHQgPSBOVUxMOworCisgIGlmIChwYWQpIHsKKyAgICBjb250ZXh0ID0gZ3N0X3BhZF9nZXRfZWxlbWVudF9wcml2YXRlIChwYWQpOworICB9CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfUE9TSVRJT046CisgICAgeworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3Bvc2l0aW9uIChxdWVyeSwgJmZvcm1hdCwgTlVMTCk7CisKKyAgICAgIGlmIChmb3JtYXQgPT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocGFyc2UpOworICAgICAgICBpZiAoY29udGV4dCkKKyAgICAgICAgICBnc3RfcXVlcnlfc2V0X3Bvc2l0aW9uIChxdWVyeSwgR1NUX0ZPUk1BVF9USU1FLCBjb250ZXh0LT5wb3MpOworICAgICAgICBlbHNlCisgICAgICAgICAgZ3N0X3F1ZXJ5X3NldF9wb3NpdGlvbiAocXVlcnksIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgICAgICAgcGFyc2UtPmNvbW1vbi5zZWdtZW50LnBvc2l0aW9uKTsKKyAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHBhcnNlKTsKKyAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IEdTVF9GT1JNQVRfREVGQVVMVCAmJiBjb250ZXh0CisgICAgICAgICAgJiYgY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbikgeworICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHBhcnNlKTsKKyAgICAgICAgZ3N0X3F1ZXJ5X3NldF9wb3NpdGlvbiAocXVlcnksIEdTVF9GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgIGNvbnRleHQtPnBvcyAvIGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24pOworICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocGFyc2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAib25seSBwb3NpdGlvbiBxdWVyeSBpbiBUSU1FIGFuZCBERUZBVUxUIGZvcm1hdCBpcyBzdXBwb3J0ZWQiKTsKKyAgICAgIH0KKworICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9EVVJBVElPTjoKKyAgICB7CisgICAgICBHc3RGb3JtYXQgZm9ybWF0OworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfZHVyYXRpb24gKHF1ZXJ5LCAmZm9ybWF0LCBOVUxMKTsKKworICAgICAgaWYgKGZvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICAgICAgR1NUX09CSkVDVF9MT0NLIChwYXJzZSk7CisgICAgICAgIGdzdF9xdWVyeV9zZXRfZHVyYXRpb24gKHF1ZXJ5LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgICBwYXJzZS0+Y29tbW9uLnNlZ21lbnQuZHVyYXRpb24pOworICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocGFyc2UpOworICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gR1NUX0ZPUk1BVF9ERUZBVUxUICYmIGNvbnRleHQKKyAgICAgICAgICAmJiBjb250ZXh0LT5kZWZhdWx0X2R1cmF0aW9uKSB7CisgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocGFyc2UpOworICAgICAgICBnc3RfcXVlcnlfc2V0X2R1cmF0aW9uIChxdWVyeSwgR1NUX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgcGFyc2UtPmNvbW1vbi5zZWdtZW50LmR1cmF0aW9uIC8gY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbik7CisgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChwYXJzZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAgICJvbmx5IGR1cmF0aW9uIHF1ZXJ5IGluIFRJTUUgYW5kIERFRkFVTFQgZm9ybWF0IGlzIHN1cHBvcnRlZCIpOworICAgICAgfQorCisgICAgICByZXMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHU1RfUVVFUllfU0VFS0lORzoKKyAgICB7CisgICAgICBHc3RGb3JtYXQgZm10OworCisgICAgICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksICZmbXQsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgaWYgKGZtdCA9PSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICAgICAgZ2Jvb2xlYW4gc2Vla2FibGU7CisKKyAgICAgICAgLyogYXNzdW1pbmcgd2UnbGwgYmUgYWJsZSB0byBnZXQgYW4gaW5kZXggLi4uICovCisgICAgICAgIHNlZWthYmxlID0gcGFyc2UtPnNlZWthYmxlOworCisgICAgICAgIGdzdF9xdWVyeV9zZXRfc2Vla2luZyAocXVlcnksIEdTVF9GT1JNQVRfVElNRSwgc2Vla2FibGUsCisgICAgICAgICAgICAwLCBwYXJzZS0+Y29tbW9uLnNlZ21lbnQuZHVyYXRpb24pOworICAgICAgICByZXMgPSBUUlVFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBpZiAocGFkKQorICAgICAgICByZXMgPSBnc3RfcGFkX3F1ZXJ5X2RlZmF1bHQgKHBhZCwgKEdzdE9iamVjdCAqKSBwYXJzZSwgcXVlcnkpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9wYXJzZV9lbGVtZW50X3F1ZXJ5IChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgcmV0dXJuIGdzdF9tYXRyb3NrYV9wYXJzZV9xdWVyeSAoR1NUX01BVFJPU0tBX1BBUlNFIChlbGVtZW50KSwgTlVMTCwgcXVlcnkpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9wYXJzZV9oYW5kbGVfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnYm9vbGVhbiByZXQ7CisgIEdzdE1hdHJvc2thUGFyc2UgKnBhcnNlID0gR1NUX01BVFJPU0tBX1BBUlNFIChwYXJlbnQpOworCisgIHJldCA9IGdzdF9tYXRyb3NrYV9wYXJzZV9xdWVyeSAocGFyc2UsIHBhZCwgcXVlcnkpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfcGFyc2Vfc2VuZF90YWdzIChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UpCit7CisgIGlmIChHX1VOTElLRUxZIChwYXJzZS0+Y29tbW9uLmdsb2JhbF90YWdzX2NoYW5nZWQpKSB7CisgICAgR3N0RXZlbnQgKnRhZ19ldmVudDsKKyAgICBnc3RfdGFnX2xpc3RfYWRkIChwYXJzZS0+Y29tbW9uLmdsb2JhbF90YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgIEdTVF9UQUdfQ09OVEFJTkVSX0ZPUk1BVCwgIk1hdHJvc2thIiwgTlVMTCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJTZW5kaW5nIGdsb2JhbF90YWdzICVwIDogJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgIHBhcnNlLT5jb21tb24uZ2xvYmFsX3RhZ3MsIHBhcnNlLT5jb21tb24uZ2xvYmFsX3RhZ3MpOworCisgICAgLyogU2VuZCBhIGNvcHkgYXMgd2Ugd2FudCB0byBrZWVwIG91ciBsb2NhbCByZWYgd3JpdGFibGUgdG8gYWRkIG1vcmUgdGFncworICAgICAqIGlmIGFueSBhcmUgZm91bmQgKi8KKyAgICB0YWdfZXZlbnQgPQorICAgICAgICBnc3RfZXZlbnRfbmV3X3RhZyAoZ3N0X3RhZ19saXN0X2NvcHkgKHBhcnNlLT5jb21tb24uZ2xvYmFsX3RhZ3MpKTsKKworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocGFyc2UtPnNyY3BhZCwgdGFnX2V2ZW50KTsKKworICAgIHBhcnNlLT5jb21tb24uZ2xvYmFsX3RhZ3NfY2hhbmdlZCA9IEZBTFNFOworICB9Cit9CisKKy8qIHJldHVybnMgRkFMU0UgaWYgdGhlcmUgYXJlIG5vIHBhZHMgdG8gZGVsaXZlciBldmVudCB0bywKKyAqIG90aGVyd2lzZSBUUlVFICh3aGF0ZXZlciB0aGUgb3V0Y29tZSBvZiBldmVudCBzZW5kaW5nKSwKKyAqIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgcGFzc2VkIGV2ZW50ISAqLworc3RhdGljIGdib29sZWFuCitnc3RfbWF0cm9za2FfcGFyc2Vfc2VuZF9ldmVudCAoR3N0TWF0cm9za2FQYXJzZSAqIHBhcnNlLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZXZlbnQgIT0gTlVMTCwgRkFMU0UpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiU2VuZGluZyBldmVudCBvZiB0eXBlICVzIHRvIGFsbCBzb3VyY2UgcGFkcyIsCisgICAgICBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIGdzdF9wYWRfcHVzaF9ldmVudCAocGFyc2UtPnNyY3BhZCwgZXZlbnQpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX3BhcnNlX2VsZW1lbnRfc2VuZF9ldmVudCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdE1hdHJvc2thUGFyc2UgKnBhcnNlID0gR1NUX01BVFJPU0tBX1BBUlNFIChlbGVtZW50KTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChldmVudCAhPSBOVUxMLCBGQUxTRSk7CisKKyAgaWYgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX1NFRUspIHsKKyAgICByZXMgPSBnc3RfbWF0cm9za2FfcGFyc2VfaGFuZGxlX3NlZWtfZXZlbnQgKHBhcnNlLCBOVUxMLCBldmVudCk7CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIlVuaGFuZGxlZCBldmVudCBvZiB0eXBlICVzIiwKKyAgICAgICAgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKyAgICByZXMgPSBGQUxTRTsKKyAgfQorICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgcmV0dXJuIHJlczsKK30KKworI2lmIDAKKy8qIHNlYXJjaGVzIGZvciBhIGNsdXN0ZXIgc3RhcnQgZnJvbSBAcG9zLAorICogcmV0dXJuIEdTVF9GTE9XX09LIGFuZCBjbHVzdGVyIHBvc2l0aW9uIGluIEBwb3MgaWYgZm91bmQgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcGFyc2Vfc2VhcmNoX2NsdXN0ZXIgKEdzdE1hdHJvc2thUGFyc2UgKiBwYXJzZSwgZ2ludDY0ICogcG9zKQoreworICBnaW50NjQgbmV3cG9zID0gKnBvczsKKyAgZ2ludDY0IG9yaWdfb2Zmc2V0OworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBjb25zdCBndWludCBjaHVuayA9IDY0ICogMTAyNDsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdE1hcEluZm8gbWFwOworICBncG9pbnRlciBkYXRhOworICBnc2l6ZSBzaXplOworICBndWludDY0IGxlbmd0aDsKKyAgZ3VpbnQzMiBpZDsKKyAgZ3VpbnQgbmVlZGVkOworCisgIG9yaWdfb2Zmc2V0ID0gcGFyc2UtPmNvbW1vbi5vZmZzZXQ7CisKKyAgLyogcmVhZCBpbiBhdCBuZXdwb3MgYW5kIHNjYW4gZm9yIGVibWwgY2x1c3RlciBpZCAqLworICB3aGlsZSAoMSkgeworICAgIEdzdEJ5dGVSZWFkZXIgcmVhZGVyOworICAgIGdpbnQgY2x1c3Rlcl9wb3M7CisKKyAgICBidWYgPSBOVUxMOworICAgIHJldCA9IGdzdF9wYWRfcHVsbF9yYW5nZSAocGFyc2UtPmNvbW1vbi5zaW5rcGFkLCBuZXdwb3MsIGNodW5rLCAmYnVmKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAgICJyZWFkIGJ1ZmZlciBzaXplICUiIEdfR1NJWkVfRk9STUFUICIgYXQgb2Zmc2V0ICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSwgbmV3cG9zKTsKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIGRhdGEgPSBtYXAuZGF0YTsKKyAgICBzaXplID0gbWFwLnNpemU7CisgICAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZyZWFkZXIsIGRhdGEsIHNpemUpOworICAgIGNsdXN0ZXJfcG9zID0gMDsKKyAgcmVzdW1lOgorICAgIGNsdXN0ZXJfcG9zID0gZ3N0X2J5dGVfcmVhZGVyX21hc2tlZF9zY2FuX3VpbnQzMiAoJnJlYWRlciwgMHhmZmZmZmZmZiwKKyAgICAgICAgR1NUX01BVFJPU0tBX0lEX0NMVVNURVIsIGNsdXN0ZXJfcG9zLCBzaXplIC0gY2x1c3Rlcl9wb3MpOworICAgIGlmIChjbHVzdGVyX3BvcyA+PSAwKSB7CisgICAgICBuZXdwb3MgKz0gY2x1c3Rlcl9wb3M7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAiZm91bmQgY2x1c3RlciBlYm1sIGlkIGF0IG9mZnNldCAlIiBHX0dJTlQ2NF9GT1JNQVQsIG5ld3Bvcyk7CisgICAgICAvKiBleHRyYSBjaGVja3Mgd2hldGhlciB3ZSByZWFsbHkgc3luYydlZCB0byBhIGNsdXN0ZXI6CisgICAgICAgKiAtIGVpdGhlciBpdCBpcyB0aGUgZmlyc3QgYW5kIG9ubHkgY2x1c3RlcgorICAgICAgICogLSBlaXRoZXIgdGhlcmUgaXMgYSBjbHVzdGVyIGFmdGVyIHRoaXMgb25lCisgICAgICAgKiAtIGVpdGhlciBjbHVzdGVyIGxlbmd0aCBpcyB1bmRlZmluZWQKKyAgICAgICAqLworICAgICAgLyogb2sgaWYgZmlyc3QgY2x1c3RlciAodGhlcmUgbWF5IG5vdCBhIHN1YnNlcXVlbnQgb25lKSAqLworICAgICAgaWYgKG5ld3BvcyA9PSBwYXJzZS0+Zmlyc3RfY2x1c3Rlcl9vZmZzZXQpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJjbHVzdGVyIGlzIGZpcnN0IGNsdXN0ZXIgLT4gT0siKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBwYXJzZS0+Y29tbW9uLm9mZnNldCA9IG5ld3BvczsKKyAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wZWVrX2lkX2xlbmd0aF9wdWxsICgmcGFyc2UtPmNvbW1vbiwKKyAgICAgICAgICBHU1RfRUxFTUVOVF9DQVNUIChwYXJzZSksICZpZCwgJmxlbmd0aCwgJm5lZWRlZCk7CisgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICBnb3RvIHJlc3VtZTsKKyAgICAgIGdfYXNzZXJ0IChpZCA9PSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUik7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgImNsdXN0ZXIgc2l6ZSAlIiBHX0dVSU5UNjRfRk9STUFUICIsIHByZWZpeCAlZCIsCisgICAgICAgICAgbGVuZ3RoLCBuZWVkZWQpOworICAgICAgLyogb2sgaWYgdW5kZWZpbmVkIGxlbmd0aCBvciBmaXJzdCBjbHVzdGVyICovCisgICAgICBpZiAobGVuZ3RoID09IEdfTUFYVUlOVDY0KSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiY2x1c3RlciBoYXMgdW5kZWZpbmVkIGxlbmd0aCAtPiBPSyIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8qIHNraXAgY2x1c3RlciAqLworICAgICAgcGFyc2UtPmNvbW1vbi5vZmZzZXQgKz0gbGVuZ3RoICsgbmVlZGVkOworICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BlZWtfaWRfbGVuZ3RoX3B1bGwgKCZwYXJzZS0+Y29tbW9uLAorICAgICAgICAgIEdTVF9FTEVNRU5UX0NBU1QgKHBhcnNlKSwgJmlkLCAmbGVuZ3RoLCAmbmVlZGVkKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gcmVzdW1lOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJuZXh0IGVsZW1lbnQgaXMgJXNjbHVzdGVyIiwKKyAgICAgICAgICBpZCA9PSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUiA/ICIiIDogIm5vdCAiKTsKKyAgICAgIGlmIChpZCA9PSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUikKKyAgICAgICAgYnJlYWs7CisgICAgICAvKiBub3Qgb2ssIHJlc3VtZSAqLworICAgICAgZ290byByZXN1bWU7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHBhcnRpYWwgY2x1c3RlciBpZCBtYXkgaGF2ZSBiZWVuIGluIHRhaWwgb2YgYnVmZmVyICovCisgICAgICBuZXdwb3MgKz0gTUFYIChzaXplLCA0KSAtIDM7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgIGJ1ZiA9IE5VTEw7CisgICAgfQorICB9CisKKyAgaWYgKGJ1ZikgeworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICBidWYgPSBOVUxMOworICB9CisKKyAgcGFyc2UtPmNvbW1vbi5vZmZzZXQgPSBvcmlnX29mZnNldDsKKyAgKnBvcyA9IG5ld3BvczsKKyAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9wYXJzZV9oYW5kbGVfc2Vla19ldmVudCAoR3N0TWF0cm9za2FQYXJzZSAqIHBhcnNlLAorICAgIEdzdFBhZCAqIHBhZCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0TWF0cm9za2FJbmRleCAqZW50cnkgPSBOVUxMOworICBHc3RTZWVrRmxhZ3MgZmxhZ3M7CisgIEdzdFNlZWtUeXBlIGN1cl90eXBlLCBzdG9wX3R5cGU7CisgIEdzdEZvcm1hdCBmb3JtYXQ7CisgIGdkb3VibGUgcmF0ZTsKKyAgZ2ludDY0IGN1ciwgc3RvcDsKKyAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKnRyYWNrID0gTlVMTDsKKyAgR3N0U2VnbWVudCBzZWVrc2VnbWVudCA9IHsgMCwgfTsKKyAgZ2Jvb2xlYW4gdXBkYXRlOworICBHc3RTZWFyY2hNb2RlIHNuYXBfZGlyOworCisgIGlmIChwYWQpCisgICAgdHJhY2sgPSBnc3RfcGFkX2dldF9lbGVtZW50X3ByaXZhdGUgKHBhZCk7CisKKyAgdHJhY2sgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fZ2V0X3NlZWtfdHJhY2sgKCZwYXJzZS0+Y29tbW9uLCB0cmFjayk7CisKKyAgZ3N0X2V2ZW50X3BhcnNlX3NlZWsgKGV2ZW50LCAmcmF0ZSwgJmZvcm1hdCwgJmZsYWdzLCAmY3VyX3R5cGUsICZjdXIsCisgICAgICAmc3RvcF90eXBlLCAmc3RvcCk7CisKKyAgLyogd2UgY2FuIG9ubHkgc2VlayBvbiB0aW1lICovCisgIGlmIChmb3JtYXQgIT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJDYW4gb25seSBzZWVrIG9uIFRJTUUiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBjb3B5IHNlZ21lbnQsIHdlIG5lZWQgdGhpcyBiZWNhdXNlIHdlIHN0aWxsIG5lZWQgdGhlIG9sZAorICAgKiBzZWdtZW50IHdoZW4gd2UgY2xvc2UgdGhlIGN1cnJlbnQgc2VnbWVudC4gKi8KKyAgbWVtY3B5ICgmc2Vla3NlZ21lbnQsICZwYXJzZS0+Y29tbW9uLnNlZ21lbnQsIHNpemVvZiAoR3N0U2VnbWVudCkpOworCisgIGlmIChldmVudCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiY29uZmlndXJpbmcgc2VlayIpOworICAgIGdzdF9zZWdtZW50X2RvX3NlZWsgKCZzZWVrc2VnbWVudCwgcmF0ZSwgZm9ybWF0LCBmbGFncywKKyAgICAgICAgY3VyX3R5cGUsIGN1ciwgc3RvcF90eXBlLCBzdG9wLCAmdXBkYXRlKTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiTmV3IHNlZ21lbnQgJSIgR1NUX1NFR01FTlRfRk9STUFULCAmc2Vla3NlZ21lbnQpOworCisgIGlmIChzZWVrc2VnbWVudC5yYXRlIDwgMCkKKyAgICBzbmFwX2RpciA9IEdTVF9TRUFSQ0hfTU9ERV9BRlRFUjsKKyAgZWxzZQorICAgIHNuYXBfZGlyID0gR1NUX1NFQVJDSF9NT0RFX0JFRk9SRTsKKworICAvKiBjaGVjayBzYW5pdHkgYmVmb3JlIHdlIHN0YXJ0IGZsdXNoaW5nIGFuZCBhbGwgdGhhdCAqLworICBHU1RfT0JKRUNUX0xPQ0sgKHBhcnNlKTsKKyAgaWYgKChlbnRyeSA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9kb19pbmRleF9zZWVrICgmcGFyc2UtPmNvbW1vbiwgdHJhY2ssCisgICAgICAgICAgICAgIHNlZWtzZWdtZW50LnBvc2l0aW9uLCAmcGFyc2UtPnNlZWtfaW5kZXgsICZwYXJzZS0+c2Vla19lbnRyeSwKKyAgICAgICAgICAgICAgc25hcF9kaXIpKSA9PSBOVUxMKSB7CisgICAgLyogcHVsbCBtb2RlIHdpdGhvdXQgaW5kZXggY2FuIHNjYW4gbGF0ZXIgb24gKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIk5vIG1hdGNoaW5nIHNlZWsgZW50cnkgaW4gaW5kZXgiKTsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAocGFyc2UpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlNlZWsgcG9zaXRpb24gbG9va3Mgc2FuZSIpOworICBHU1RfT0JKRUNUX1VOTE9DSyAocGFyc2UpOworCisgIC8qIG5lZWQgdG8gc2VlayB0byBjbHVzdGVyIHN0YXJ0IHRvIHBpY2sgdXAgY2x1c3RlciB0aW1lICovCisgIC8qIHVwc3RyZWFtIHRha2VzIGNhcmUgb2YgZmx1c2hpbmcgYW5kIGFsbCB0aGF0CisgICAqIC4uLiBhbmQgbmV3c2VnbWVudCBldmVudCBoYW5kbGluZyB0YWtlcyBjYXJlIG9mIHRoZSByZXN0ICovCisgIHJldHVybiBwZXJmb3JtX3NlZWtfdG9fb2Zmc2V0IChwYXJzZSwgZW50cnktPnBvcworICAgICAgKyBwYXJzZS0+Y29tbW9uLmVibWxfc2VnbWVudF9zdGFydCk7Cit9CisKKy8qCisgKiBIYW5kbGUgd2hldGhlciB3ZSBjYW4gcGVyZm9ybSB0aGUgc2VlayBldmVudCBvciBpZiB3ZSBoYXZlIHRvIGxldCB0aGUgY2hhaW4KKyAqIGZ1bmN0aW9uIGhhbmRsZSBzZWVrcyB0byBidWlsZCB0aGUgc2VlayBpbmRleGVzIGZpcnN0LgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9wYXJzZV9oYW5kbGVfc2Vla19wdXNoIChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RTZWVrRmxhZ3MgZmxhZ3M7CisgIEdzdFNlZWtUeXBlIGN1cl90eXBlLCBzdG9wX3R5cGU7CisgIEdzdEZvcm1hdCBmb3JtYXQ7CisgIGdkb3VibGUgcmF0ZTsKKyAgZ2ludDY0IGN1ciwgc3RvcDsKKworICBnc3RfZXZlbnRfcGFyc2Vfc2VlayAoZXZlbnQsICZyYXRlLCAmZm9ybWF0LCAmZmxhZ3MsICZjdXJfdHlwZSwgJmN1ciwKKyAgICAgICZzdG9wX3R5cGUsICZzdG9wKTsKKworICAvKiBzYW5pdHkgY2hlY2tzICovCisKKyAgLyogd2UgY2FuIG9ubHkgc2VlayBvbiB0aW1lICovCisgIGlmIChmb3JtYXQgIT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJDYW4gb25seSBzZWVrIG9uIFRJTUUiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoc3RvcF90eXBlICE9IEdTVF9TRUVLX1RZUEVfTk9ORSAmJiBzdG9wICE9IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlNlZWsgZW5kLXRpbWUgbm90IHN1cHBvcnRlZCBpbiBzdHJlYW1pbmcgbW9kZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmICghKGZsYWdzICYgR1NUX1NFRUtfRkxBR19GTFVTSCkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgIk5vbi1mbHVzaGluZyBzZWVrIG5vdCBzdXBwb3J0ZWQgaW4gc3RyZWFtaW5nIG1vZGUiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NFR01FTlQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlNlZ21lbnQgc2VlayBub3Qgc3VwcG9ydGVkIGluIHN0cmVhbWluZyBtb2RlIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogY2hlY2sgZm9yIGhhdmluZyBwYXJzZWQgaW5kZXggYWxyZWFkeSAqLworICBpZiAoIXBhcnNlLT5jb21tb24uaW5kZXhfcGFyc2VkKSB7CisgICAgZ2Jvb2xlYW4gYnVpbGRpbmdfaW5kZXg7CisgICAgZ3VpbnQ2NCBvZmZzZXQgPSAwOworCisgICAgaWYgKCFwYXJzZS0+aW5kZXhfb2Zmc2V0KSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIm5vIGluZGV4IChsb2NhdGlvbik7IG5vIHNlZWsgaW4gcHVzaCBtb2RlIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgR1NUX09CSkVDVF9MT0NLIChwYXJzZSk7CisgICAgLyogaGFuZGxlIHRoZSBzZWVrIGV2ZW50IGluIHRoZSBjaGFpbiBmdW5jdGlvbiAqLworICAgIHBhcnNlLT5jb21tb24uc3RhdGUgPSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9TRUVLOworICAgIC8qIG5vIG1vcmUgc2VlayBjYW4gYmUgaXNzdWVkIHVudGlsIHN0YXRlIHJlc2V0IHRvIF9EQVRBICovCisKKyAgICAvKiBjb3B5IHRoZSBldmVudCAqLworICAgIGlmIChwYXJzZS0+c2Vla19ldmVudCkKKyAgICAgIGdzdF9ldmVudF91bnJlZiAocGFyc2UtPnNlZWtfZXZlbnQpOworICAgIHBhcnNlLT5zZWVrX2V2ZW50ID0gZ3N0X2V2ZW50X3JlZiAoZXZlbnQpOworCisgICAgLyogc2V0IHRoZSBidWlsZGluZ19pbmRleCBmbGFnIHNvIHRoYXQgb25seSBvbmUgdGhyZWFkIGNhbiBzZXR1cCB0aGUKKyAgICAgKiBzdHJ1Y3R1cmVzIGZvciBpbmRleCBzZWVraW5nLiAqLworICAgIGJ1aWxkaW5nX2luZGV4ID0gcGFyc2UtPmJ1aWxkaW5nX2luZGV4OworICAgIGlmICghYnVpbGRpbmdfaW5kZXgpIHsKKyAgICAgIHBhcnNlLT5idWlsZGluZ19pbmRleCA9IFRSVUU7CisgICAgICBvZmZzZXQgPSBwYXJzZS0+aW5kZXhfb2Zmc2V0OworICAgIH0KKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAocGFyc2UpOworCisgICAgaWYgKCFidWlsZGluZ19pbmRleCkgeworICAgICAgLyogc2VlayB0byB0aGUgZmlyc3Qgc3ViaW5kZXggb3IgbGVnYWN5IGluZGV4ICovCisgICAgICBHU1RfSU5GT19PQkpFQ1QgKHBhcnNlLCAiU2Vla2luZyB0byBDdWVzIGF0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG9mZnNldCk7CisgICAgICByZXR1cm4gcGVyZm9ybV9zZWVrX3RvX29mZnNldCAocGFyc2UsIG9mZnNldCk7CisgICAgfQorCisgICAgLyogd2VsbCwgd2UgYXJlIGhhbmRsaW5nIGl0IGFscmVhZHkgKi8KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIC8qIGRlbGVnYXRlIHRvIHR3ZWFrZWQgcmVndWxhciBzZWVrICovCisgIHJldHVybiBnc3RfbWF0cm9za2FfcGFyc2VfaGFuZGxlX3NlZWtfZXZlbnQgKHBhcnNlLCBwYWQsIGV2ZW50KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbWF0cm9za2FfcGFyc2VfaGFuZGxlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0TWF0cm9za2FQYXJzZSAqcGFyc2UgPSBHU1RfTUFUUk9TS0FfUEFSU0UgKHBhcmVudCk7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICAgIC8qIG5vIHNlZWtpbmcgdW50aWwgd2UgYXJlIChzYWZlbHkpIHJlYWR5ICovCisgICAgICBpZiAocGFyc2UtPmNvbW1vbi5zdGF0ZSAhPSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9EQVRBKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAibm90IHJlYWR5IGZvciBzZWVraW5nIHlldCIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICByZXMgPSBnc3RfbWF0cm9za2FfcGFyc2VfaGFuZGxlX3NlZWtfcHVzaCAocGFyc2UsIHBhZCwgZXZlbnQpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgR1NUX0VWRU5UX1FPUzoKKyAgICB7CisgICAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqY29udGV4dCA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgICAgIGlmIChjb250ZXh0LT50eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1ZJREVPKSB7CisgICAgICAgIEdzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQgKnZpZGVvY29udGV4dCA9CisgICAgICAgICAgICAoR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCAqKSBjb250ZXh0OworICAgICAgICBnZG91YmxlIHByb3BvcnRpb247CisgICAgICAgIEdzdENsb2NrVGltZURpZmYgZGlmZjsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKworICAgICAgICBnc3RfZXZlbnRfcGFyc2VfcW9zIChldmVudCwgTlVMTCwgJnByb3BvcnRpb24sICZkaWZmLCAmdGltZXN0YW1wKTsKKworICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHBhcnNlKTsKKyAgICAgICAgdmlkZW9jb250ZXh0LT5lYXJsaWVzdF90aW1lID0gdGltZXN0YW1wICsgZGlmZjsKKyAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHBhcnNlKTsKKyAgICAgIH0KKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgICAgLyogZXZlbnRzIHdlIGRvbid0IG5lZWQgdG8gaGFuZGxlICovCisgICAgY2FzZSBHU1RfRVZFTlRfTkFWSUdBVElPTjoKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgcmVzID0gRkFMU0U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgR1NUX0VWRU5UX0xBVEVOQ1k6CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAocGFyc2UtPmNvbW1vbi5zaW5rcGFkLCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcGFyc2VfcGFyc2VfdHJhY2tzIChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UsIEdzdEVibWxSZWFkICogZWJtbCkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ3VpbnQzMiBpZDsKKworICBERUJVR19FTEVNRU5UX1NUQVJUIChwYXJzZSwgZWJtbCwgIlRyYWNrcyIpOworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChwYXJzZSwgZWJtbCwgIlRyYWNrcyIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgLyogb25lIHRyYWNrIHdpdGhpbiB0aGUgImFsbC10cmFja3MiIGhlYWRlciAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tFTlRSWToKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3BhcnNlX2FkZF9zdHJlYW0gKHBhcnNlLCBlYm1sKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwICgmcGFyc2UtPmNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICJUcmFjayIsIGlkKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIERFQlVHX0VMRU1FTlRfU1RPUCAocGFyc2UsIGVibWwsICJUcmFja3MiLCByZXQpOworCisgIHBhcnNlLT50cmFja3NfcGFyc2VkID0gVFJVRTsKKworICByZXR1cm4gcmV0OworfQorCisvKgorICogUmVhZCBzaWduZWQvdW5zaWduZWQgIkVCTUwiIG51bWJlcnMuCisgKiBSZXR1cm46IG51bWJlciBvZiBieXRlcyBwcm9jZXNzZWQuCisgKi8KKworc3RhdGljIGdpbnQKK2dzdF9tYXRyb3NrYV9lYm1sbnVtX3VpbnQgKGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsIGd1aW50NjQgKiBudW0pCit7CisgIGdpbnQgbGVuX21hc2sgPSAweDgwLCByZWFkID0gMSwgbiA9IDEsIG51bV9mZnMgPSAwOworICBndWludDY0IHRvdGFsOworCisgIGlmIChzaXplIDw9IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICB0b3RhbCA9IGRhdGFbMF07CisgIHdoaWxlIChyZWFkIDw9IDggJiYgISh0b3RhbCAmIGxlbl9tYXNrKSkgeworICAgIHJlYWQrKzsKKyAgICBsZW5fbWFzayA+Pj0gMTsKKyAgfQorICBpZiAocmVhZCA+IDgpCisgICAgcmV0dXJuIC0xOworCisgIGlmICgodG90YWwgJj0gKGxlbl9tYXNrIC0gMSkpID09IGxlbl9tYXNrIC0gMSkKKyAgICBudW1fZmZzKys7CisgIGlmIChzaXplIDwgcmVhZCkKKyAgICByZXR1cm4gLTE7CisgIHdoaWxlIChuIDwgcmVhZCkgeworICAgIGlmIChkYXRhW25dID09IDB4ZmYpCisgICAgICBudW1fZmZzKys7CisgICAgdG90YWwgPSAodG90YWwgPDwgOCkgfCBkYXRhW25dOworICAgIG4rKzsKKyAgfQorCisgIGlmIChyZWFkID09IG51bV9mZnMgJiYgdG90YWwgIT0gMCkKKyAgICAqbnVtID0gR19NQVhVSU5UNjQ7CisgIGVsc2UKKyAgICAqbnVtID0gdG90YWw7CisKKyAgcmV0dXJuIHJlYWQ7Cit9CisKK3N0YXRpYyBnaW50Citnc3RfbWF0cm9za2FfZWJtbG51bV9zaW50IChndWludDggKiBkYXRhLCBndWludCBzaXplLCBnaW50NjQgKiBudW0pCit7CisgIGd1aW50NjQgdW51bTsKKyAgZ2ludCByZXM7CisKKyAgLyogcmVhZCBhcyB1bnNpZ25lZCBudW1iZXIgZmlyc3QgKi8KKyAgaWYgKChyZXMgPSBnc3RfbWF0cm9za2FfZWJtbG51bV91aW50IChkYXRhLCBzaXplLCAmdW51bSkpIDwgMCkKKyAgICByZXR1cm4gLTE7CisKKyAgLyogbWFrZSBzaWduZWQgKi8KKyAgaWYgKHVudW0gPT0gR19NQVhVSU5UNjQpCisgICAgKm51bSA9IEdfTUFYSU5UNjQ7CisgIGVsc2UKKyAgICAqbnVtID0gdW51bSAtICgoMSA8PCAoKDcgKiByZXMpIC0gMSkpIC0gMSk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9wYXJzZV9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrIChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UsCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sLCBndWludDY0IGNsdXN0ZXJfdGltZSwgZ3VpbnQ2NCBjbHVzdGVyX29mZnNldCwKKyAgICBnYm9vbGVhbiBpc19zaW1wbGVibG9jaykKK3sKKyAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKnN0cmVhbSA9IE5VTEw7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGdib29sZWFuIHJlYWRibG9jayA9IEZBTFNFOworICBndWludDMyIGlkOworICBndWludDY0IGJsb2NrX2R1cmF0aW9uID0gMDsKKyAgR3N0QnVmZmVyICpidWYgPSBOVUxMOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2ludCBzdHJlYW1fbnVtID0gLTEsIG4sIGxhY2VzID0gMDsKKyAgZ3VpbnQgc2l6ZSA9IDA7CisgIGdpbnQgKmxhY2Vfc2l6ZSA9IE5VTEw7CisgIGdpbnQ2NCB0aW1lID0gMDsKKyAgZ2ludCBmbGFncyA9IDA7CisgIGdpbnQ2NCByZWZlcmVuY2VibG9jayA9IDA7CisKKyAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSyAmJiBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgaWYgKCFpc19zaW1wbGVibG9jaykgeworICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykgeworICAgICAgICBnb3RvIGRhdGFfZXJyb3I7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlkID0gR1NUX01BVFJPU0tBX0lEX1NJTVBMRUJMT0NLOworICAgIH0KKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgLyogb25lIGJsb2NrIGluc2lkZSB0aGUgZ3JvdXAuIE5vdGUsIGJsb2NrIHBhcnNpbmcgaXMgb25lCisgICAgICAgICAqIG9mIHRoZSBoYXJkZXIgdGhpbmdzLCBzbyB0aGlzIGNvZGUgaXMgYSBiaXQgY29tcGxpY2F0ZWQuCisgICAgICAgICAqIFNlZSBodHRwOi8vd3d3Lm1hdHJvc2thLm9yZy8gZm9yIGRvY3VtZW50YXRpb24uICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TSU1QTEVCTE9DSzoKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0JMT0NLOgorICAgICAgeworICAgICAgICBndWludDY0IG51bTsKKyAgICAgICAgZ3VpbnQ4ICpkYXRhOworCisgICAgICAgIGlmIChidWYpIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgIGJ1ZiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX2J1ZmZlciAoZWJtbCwgJmlkLCAmYnVmKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgICAgZGF0YSA9IG1hcC5kYXRhOworICAgICAgICBzaXplID0gbWFwLnNpemU7CisKKyAgICAgICAgLyogZmlyc3QgYnl0ZShzKTogYmxvY2tudW0gKi8KKyAgICAgICAgaWYgKChuID0gZ3N0X21hdHJvc2thX2VibWxudW1fdWludCAoZGF0YSwgc2l6ZSwgJm51bSkpIDwgMCkKKyAgICAgICAgICBnb3RvIGRhdGFfZXJyb3I7CisgICAgICAgIGRhdGEgKz0gbjsKKyAgICAgICAgc2l6ZSAtPSBuOworCisgICAgICAgIC8qIGZldGNoIHN0cmVhbSBmcm9tIG51bSAqLworICAgICAgICBzdHJlYW1fbnVtID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3N0cmVhbV9mcm9tX251bSAoJnBhcnNlLT5jb21tb24sCisgICAgICAgICAgICBudW0pOworICAgICAgICBpZiAoR19VTkxJS0VMWSAoc2l6ZSA8IDMpKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIkludmFsaWQgc2l6ZSAldSIsIHNpemUpOworICAgICAgICAgIC8qIG5vbi1mYXRhbCwgdHJ5IG5leHQgYmxvY2soZ3JvdXApICovCisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9IGVsc2UgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbV9udW0gPCAwIHx8CisgICAgICAgICAgICAgICAgc3RyZWFtX251bSA+PSBwYXJzZS0+Y29tbW9uLm51bV9zdHJlYW1zKSkgeworICAgICAgICAgIC8qIGxldCdzIG5vdCBnaXZlIHVwIG9uIGEgc3RyYXkgaW52YWxpZCB0cmFjayBudW1iZXIgKi8KKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLAorICAgICAgICAgICAgICAiSW52YWxpZCBzdHJlYW0gJWQgZm9yIHRyYWNrIG51bWJlciAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgICAgICI7IGlnbm9yaW5nIGJsb2NrIiwgc3RyZWFtX251bSwgbnVtKTsKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKworICAgICAgICBzdHJlYW0gPSBnX3B0cl9hcnJheV9pbmRleCAocGFyc2UtPmNvbW1vbi5zcmMsIHN0cmVhbV9udW0pOworCisgICAgICAgIC8qIHRpbWUgKHJlbGF0aXZlIHRvIGNsdXN0ZXIgdGltZSkgKi8KKyAgICAgICAgdGltZSA9ICgoZ2ludDE2KSBHU1RfUkVBRF9VSU5UMTZfQkUgKGRhdGEpKTsKKyAgICAgICAgZGF0YSArPSAyOworICAgICAgICBzaXplIC09IDI7CisgICAgICAgIGZsYWdzID0gR1NUX1JFQURfVUlOVDggKGRhdGEpOworICAgICAgICBkYXRhICs9IDE7CisgICAgICAgIHNpemUgLT0gMTsKKworICAgICAgICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJ0aW1lICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgZmxhZ3MgJWQiLCB0aW1lLAorICAgICAgICAgICAgZmxhZ3MpOworCisgICAgICAgIHN3aXRjaCAoKGZsYWdzICYgMHgwNikgPj4gMSkgeworICAgICAgICAgIGNhc2UgMHgwOiAgICAgICAgICAgIC8qIG5vIGxhY2luZyAqLworICAgICAgICAgICAgbGFjZXMgPSAxOworICAgICAgICAgICAgbGFjZV9zaXplID0gZ19uZXcgKGdpbnQsIDEpOworICAgICAgICAgICAgbGFjZV9zaXplWzBdID0gc2l6ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDE6ICAgICAgICAgICAgLyogeGlwaCBsYWNpbmcgKi8KKyAgICAgICAgICBjYXNlIDB4MjogICAgICAgICAgICAvKiBmaXhlZC1zaXplIGxhY2luZyAqLworICAgICAgICAgIGNhc2UgMHgzOiAgICAgICAgICAgIC8qIEVCTUwgbGFjaW5nICovCisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgICAgICAgICBnb3RvIGludmFsaWRfbGFjaW5nOworICAgICAgICAgICAgbGFjZXMgPSBHU1RfUkVBRF9VSU5UOCAoZGF0YSkgKyAxOworICAgICAgICAgICAgZGF0YSArPSAxOworICAgICAgICAgICAgc2l6ZSAtPSAxOworICAgICAgICAgICAgbGFjZV9zaXplID0gZ19uZXcwIChnaW50LCBsYWNlcyk7CisKKyAgICAgICAgICAgIHN3aXRjaCAoKGZsYWdzICYgMHgwNikgPj4gMSkgeworICAgICAgICAgICAgICBjYXNlIDB4MTogICAgICAgIC8qIHhpcGggbGFjaW5nICovICB7CisgICAgICAgICAgICAgICAgZ3VpbnQgdGVtcCwgdG90YWwgPSAwOworCisgICAgICAgICAgICAgICAgZm9yIChuID0gMDsgcmV0ID09IEdTVF9GTE9XX09LICYmIG4gPCBsYWNlcyAtIDE7IG4rKykgeworICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICBnb3RvIGludmFsaWRfbGFjaW5nOworICAgICAgICAgICAgICAgICAgICB0ZW1wID0gR1NUX1JFQURfVUlOVDggKGRhdGEpOworICAgICAgICAgICAgICAgICAgICBsYWNlX3NpemVbbl0gKz0gdGVtcDsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSArPSAxOworICAgICAgICAgICAgICAgICAgICBzaXplIC09IDE7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wICE9IDB4ZmYpCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB0b3RhbCArPSBsYWNlX3NpemVbbl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhY2Vfc2l6ZVtuXSA9IHNpemUgLSB0b3RhbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNhc2UgMHgyOiAgICAgICAgLyogZml4ZWQtc2l6ZSBsYWNpbmcgKi8KKyAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbGFjZXM7IG4rKykKKyAgICAgICAgICAgICAgICAgIGxhY2Vfc2l6ZVtuXSA9IHNpemUgLyBsYWNlczsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIDB4MzogICAgICAgIC8qIEVCTUwgbGFjaW5nICovICB7CisgICAgICAgICAgICAgICAgZ3VpbnQgdG90YWw7CisKKyAgICAgICAgICAgICAgICBpZiAoKG4gPSBnc3RfbWF0cm9za2FfZWJtbG51bV91aW50IChkYXRhLCBzaXplLCAmbnVtKSkgPCAwKQorICAgICAgICAgICAgICAgICAgZ290byBkYXRhX2Vycm9yOworICAgICAgICAgICAgICAgIGRhdGEgKz0gbjsKKyAgICAgICAgICAgICAgICBzaXplIC09IG47CisgICAgICAgICAgICAgICAgdG90YWwgPSBsYWNlX3NpemVbMF0gPSBudW07CisgICAgICAgICAgICAgICAgZm9yIChuID0gMTsgcmV0ID09IEdTVF9GTE9XX09LICYmIG4gPCBsYWNlcyAtIDE7IG4rKykgeworICAgICAgICAgICAgICAgICAgZ2ludDY0IHNudW07CisgICAgICAgICAgICAgICAgICBnaW50IHI7CisKKyAgICAgICAgICAgICAgICAgIGlmICgociA9IGdzdF9tYXRyb3NrYV9lYm1sbnVtX3NpbnQgKGRhdGEsIHNpemUsICZzbnVtKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGRhdGFfZXJyb3I7CisgICAgICAgICAgICAgICAgICBkYXRhICs9IHI7CisgICAgICAgICAgICAgICAgICBzaXplIC09IHI7CisgICAgICAgICAgICAgICAgICBsYWNlX3NpemVbbl0gPSBsYWNlX3NpemVbbiAtIDFdICsgc251bTsKKyAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGxhY2Vfc2l6ZVtuXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG4gPCBsYWNlcykKKyAgICAgICAgICAgICAgICAgIGxhY2Vfc2l6ZVtuXSA9IHNpemUgLSB0b3RhbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHJlYWRibG9jayA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9CTE9DS0RVUkFUSU9OOnsKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZibG9ja19kdXJhdGlvbik7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiQmxvY2tEdXJhdGlvbjogJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgIGJsb2NrX2R1cmF0aW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1JFRkVSRU5DRUJMT0NLOnsKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9zaW50IChlYm1sLCAmaWQsICZyZWZlcmVuY2VibG9jayk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiUmVmZXJlbmNlQmxvY2s6ICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgIHJlZmVyZW5jZWJsb2NrKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPREVDU1RBVEU6eworICAgICAgICBndWludDggKmRhdGE7CisgICAgICAgIGd1aW50NjQgZGF0YV9sZW4gPSAwOworCisgICAgICAgIGlmICgocmV0ID0KKyAgICAgICAgICAgICAgICBnc3RfZWJtbF9yZWFkX2JpbmFyeSAoZWJtbCwgJmlkLCAmZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgJmRhdGFfbGVuKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbSA9PSBOVUxMKSkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICJVbmV4cGVjdGVkIENvZGVjU3RhdGUgc3ViZWxlbWVudCAtIGlnbm9yaW5nIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBnX2ZyZWUgKHN0cmVhbS0+Y29kZWNfc3RhdGUpOworICAgICAgICBzdHJlYW0tPmNvZGVjX3N0YXRlID0gZGF0YTsKKyAgICAgICAgc3RyZWFtLT5jb2RlY19zdGF0ZV9zaXplID0gZGF0YV9sZW47CisKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwICgmcGFyc2UtPmNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICJCbG9ja0dyb3VwIiwgaWQpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQkxPQ0tWSVJUVUFMOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQkxPQ0tBRERJVElPTlM6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9SRUZFUkVOQ0VQUklPUklUWToKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1JFRkVSRU5DRVZJUlRVQUw6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TTElDRVM6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLAorICAgICAgICAgICAgIlNraXBwaW5nIEJsb2NrR3JvdXAgc3ViZWxlbWVudCAweCV4IC0gaWdub3JpbmciLCBpZCk7CisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfc2tpcCAoZWJtbCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChpc19zaW1wbGVibG9jaykKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogcmVhZGluZyBhIG51bWJlciBvciBzbyBjb3VsZCBoYXZlIGZhaWxlZCAqLworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gZGF0YV9lcnJvcjsKKworICBpZiAocmV0ID09IEdTVF9GTE9XX09LICYmIHJlYWRibG9jaykgeworICAgIGd1aW50NjQgZHVyYXRpb24gPSAwOworICAgIGdpbnQ2NCBsYWNlX3RpbWUgPSAwOworICAgIGdib29sZWFuIGRlbHRhX3VuaXQ7CisKKyAgICBzdHJlYW0gPSBnX3B0cl9hcnJheV9pbmRleCAocGFyc2UtPmNvbW1vbi5zcmMsIHN0cmVhbV9udW0pOworCisgICAgaWYgKGNsdXN0ZXJfdGltZSAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgICAvKiBGSVhNRTogV2hhdCB0byBkbyB3aXRoIG5lZ2F0aXZlIHRpbWVzdGFtcHM/IEdpdmUgdGltZXN0YW1wIDAgb3IgLTE/CisgICAgICAgKiBEcm9wIHVubGVzcyB0aGUgbGFjZSBjb250YWlucyB0aW1lc3RhbXAgMD8gKi8KKyAgICAgIGlmICh0aW1lIDwgMCAmJiAoLXRpbWUpID4gY2x1c3Rlcl90aW1lKSB7CisgICAgICAgIGxhY2VfdGltZSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc3RyZWFtLT50aW1lY29kZXNjYWxlID09IDEuMCkKKyAgICAgICAgICBsYWNlX3RpbWUgPSAoY2x1c3Rlcl90aW1lICsgdGltZSkgKiBwYXJzZS0+Y29tbW9uLnRpbWVfc2NhbGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBsYWNlX3RpbWUgPQorICAgICAgICAgICAgICBnc3RfdXRpbF9ndWludDY0X3RvX2dkb3VibGUgKChjbHVzdGVyX3RpbWUgKyB0aW1lKSAqCisgICAgICAgICAgICAgIHBhcnNlLT5jb21tb24udGltZV9zY2FsZSkgKiBzdHJlYW0tPnRpbWVjb2Rlc2NhbGU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGxhY2VfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgfQorCisgICAgaWYgKGxhY2VfdGltZSAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgICBwYXJzZS0+bGFzdF90aW1lc3RhbXAgPSBsYWNlX3RpbWU7CisgICAgfQorICAgIC8qIG5lZWQgdG8gcmVmcmVzaCBzZWdtZW50IGluZm8gQVNBUCAqLworICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAobGFjZV90aW1lKSAmJiBwYXJzZS0+bmVlZF9uZXdzZWdtZW50KSB7CisgICAgICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAiZ2VuZXJhdGluZyBzZWdtZW50IHN0YXJ0aW5nIGF0ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChsYWNlX3RpbWUpKTsKKyAgICAgIC8qIHByZXRlbmQgd2Ugc2Vla2VkIGhlcmUgKi8KKyAgICAgIGdzdF9zZWdtZW50X2RvX3NlZWsgKCZwYXJzZS0+Y29tbW9uLnNlZ21lbnQsIHBhcnNlLT5jb21tb24uc2VnbWVudC5yYXRlLAorICAgICAgICAgIEdTVF9GT1JNQVRfVElNRSwgMCwgR1NUX1NFRUtfVFlQRV9TRVQsIGxhY2VfdGltZSwKKyAgICAgICAgICBHU1RfU0VFS19UWVBFX1NFVCwgR1NUX0NMT0NLX1RJTUVfTk9ORSwgTlVMTCk7CisgICAgICAvKiBub3cgY29udmV5IG91ciBzZWdtZW50IG5vdGlvbiBkb3duc3RyZWFtICovCisgICAgICBzZWdtZW50ID0gcGFyc2UtPmNvbW1vbi5zZWdtZW50OworICAgICAgc2VnbWVudC5wb3NpdGlvbiA9IHNlZ21lbnQuc3RhcnQ7CisgICAgICBnc3RfbWF0cm9za2FfcGFyc2Vfc2VuZF9ldmVudCAocGFyc2UsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKyAgICAgIHBhcnNlLT5uZWVkX25ld3NlZ21lbnQgPSBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoYmxvY2tfZHVyYXRpb24pIHsKKyAgICAgIGlmIChzdHJlYW0tPnRpbWVjb2Rlc2NhbGUgPT0gMS4wKQorICAgICAgICBkdXJhdGlvbiA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoYmxvY2tfZHVyYXRpb24sCisgICAgICAgICAgICBwYXJzZS0+Y29tbW9uLnRpbWVfc2NhbGUsIDEpOworICAgICAgZWxzZQorICAgICAgICBkdXJhdGlvbiA9CisgICAgICAgICAgICBnc3RfdXRpbF9nZG91YmxlX3RvX2d1aW50NjQgKGdzdF91dGlsX2d1aW50NjRfdG9fZ2RvdWJsZQorICAgICAgICAgICAgKGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoYmxvY2tfZHVyYXRpb24sIHBhcnNlLT5jb21tb24udGltZV9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgMSkpICogc3RyZWFtLT50aW1lY29kZXNjYWxlKTsKKyAgICB9IGVsc2UgaWYgKHN0cmVhbS0+ZGVmYXVsdF9kdXJhdGlvbikgeworICAgICAgZHVyYXRpb24gPSBzdHJlYW0tPmRlZmF1bHRfZHVyYXRpb24gKiBsYWNlczsKKyAgICB9CisgICAgLyogZWxzZSBkdXJhdGlvbiBpcyBkaWZmIGJldHdlZW4gdGltZWNvZGUgb2YgdGhpcyBhbmQgbmV4dCBibG9jayAqLworCisgICAgLyogRm9yIFNpbXBsZUJsb2NrLCBsb29rIGF0IHRoZSBrZXlmcmFtZSBiaXQgaW4gZmxhZ3MuIE90aGVyd2lzZSwKKyAgICAgICBhIFJlZmVyZW5jZUJsb2NrIGltcGxpZXMgdGhhdCB0aGlzIGlzIG5vdCBhIGtleWZyYW1lLiBJbiBlaXRoZXIKKyAgICAgICBjYXNlLCBpdCBvbmx5IG1ha2VzIHNlbnNlIGZvciB2aWRlbyBzdHJlYW1zLiAqLworICAgIGRlbHRhX3VuaXQgPSBzdHJlYW0tPnR5cGUgPT0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfVklERU8gJiYKKyAgICAgICAgKChpc19zaW1wbGVibG9jayAmJiAhKGZsYWdzICYgMHg4MCkpIHx8IHJlZmVyZW5jZWJsb2NrKTsKKworICAgIGlmIChkZWx0YV91bml0ICYmIHN0cmVhbS0+c2V0X2Rpc2NvbnQpIHsKKyAgICAgIC8qIFdoZW4gZG9pbmcgc2Vla3Mgb3Igc3VjaCwgd2UgbmVlZCB0byByZXN0YXJ0IG9uIGtleSBmcmFtZXMgb3IKKyAgICAgICAqIGRlY29kZXJzIG1pZ2h0IGNob2tlLiAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJza2lwcGluZyBkZWx0YSB1bml0Iik7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgZm9yIChuID0gMDsgbiA8IGxhY2VzOyBuKyspIHsKKyAgICAgIGlmIChHX1VOTElLRUxZIChsYWNlX3NpemVbbl0gPiBzaXplKSkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLCAiSW52YWxpZCBsYWNlIHNpemUiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8qIFFvUyBmb3IgdmlkZW8gdHJhY2sgd2l0aCBhbiBpbmRleC4gdGhlIGFzc3VtcHRpb24gaXMgdGhhdAorICAgICAgICAgaW5kZXggZW50cmllcyBwb2ludCB0byBrZXlmcmFtZXMsIGJ1dCBpZiB0aGF0IGlzIG5vdCB0cnVlIHdlCisgICAgICAgICB3aWxsIGluc3RhZCBza2lwIHVudGlsIHRoZSBuZXh0IGtleWZyYW1lLiAqLworICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChsYWNlX3RpbWUpICYmCisgICAgICAgICAgc3RyZWFtLT50eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1ZJREVPICYmCisgICAgICAgICAgc3RyZWFtLT5pbmRleF90YWJsZSAmJiBwYXJzZS0+Y29tbW9uLnNlZ21lbnQucmF0ZSA+IDAuMCkgeworICAgICAgICBHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICp2aWRlb2NvbnRleHQgPQorICAgICAgICAgICAgKEdzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQgKikgc3RyZWFtOworICAgICAgICBHc3RDbG9ja1RpbWUgZWFybGllc3RfdGltZTsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIGVhcmxpZXN0X3N0cmVhbV90aW1lOworCisgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocGFyc2UpOworICAgICAgICBlYXJsaWVzdF90aW1lID0gdmlkZW9jb250ZXh0LT5lYXJsaWVzdF90aW1lOworICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocGFyc2UpOworICAgICAgICBlYXJsaWVzdF9zdHJlYW1fdGltZSA9CisgICAgICAgICAgICBnc3Rfc2VnbWVudF9wb3NpdGlvbl9mcm9tX3J1bm5pbmdfdGltZSAoJnBhcnNlLT5jb21tb24uc2VnbWVudCwKKyAgICAgICAgICAgIEdTVF9GT1JNQVRfVElNRSwgZWFybGllc3RfdGltZSk7CisKKyAgICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChsYWNlX3RpbWUpICYmCisgICAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZWFybGllc3Rfc3RyZWFtX3RpbWUpICYmCisgICAgICAgICAgICBsYWNlX3RpbWUgPD0gZWFybGllc3Rfc3RyZWFtX3RpbWUpIHsKKyAgICAgICAgICAvKiBmaW5kIGluZGV4IGVudHJ5IChrZXlmcmFtZSkgPD0gZWFybGllc3Rfc3RyZWFtX3RpbWUgKi8KKyAgICAgICAgICBHc3RNYXRyb3NrYUluZGV4ICplbnRyeSA9CisgICAgICAgICAgICAgIGdzdF91dGlsX2FycmF5X2JpbmFyeV9zZWFyY2ggKHN0cmVhbS0+aW5kZXhfdGFibGUtPmRhdGEsCisgICAgICAgICAgICAgIHN0cmVhbS0+aW5kZXhfdGFibGUtPmxlbiwgc2l6ZW9mIChHc3RNYXRyb3NrYUluZGV4KSwKKyAgICAgICAgICAgICAgKEdDb21wYXJlRGF0YUZ1bmMpIGdzdF9tYXRyb3NrYV9pbmRleF9zZWVrX2ZpbmQsCisgICAgICAgICAgICAgIEdTVF9TRUFSQ0hfTU9ERV9CRUZPUkUsICZlYXJsaWVzdF9zdHJlYW1fdGltZSwgTlVMTCk7CisKKyAgICAgICAgICAvKiBpZiB0aGF0IGVudHJ5IChrZXlmcmFtZSkgaXMgYWZ0ZXIgdGhlIGN1cnJlbnQgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICBidWZmZXIsIHdlIGNhbiBza2lwIHB1c2hpbmcgKGFuZCB0aHVzIGRlY29kaW5nKSBhbGwKKyAgICAgICAgICAgICBidWZmZXJzIHVudGlsIHRoYXQga2V5ZnJhbWUuICovCisgICAgICAgICAgaWYgKGVudHJ5ICYmIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChlbnRyeS0+dGltZSkgJiYKKyAgICAgICAgICAgICAgZW50cnktPnRpbWUgPiBsYWNlX3RpbWUpIHsKKyAgICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgIlNraXBwaW5nIGxhY2UgYmVmb3JlIGxhdGUga2V5ZnJhbWUiKTsKKyAgICAgICAgICAgIHN0cmVhbS0+c2V0X2Rpc2NvbnQgPSBUUlVFOworICAgICAgICAgICAgZ290byBuZXh0X2xhY2U7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisjaWYgMAorICAgICAgc3ViID0gZ3N0X2J1ZmZlcl9jcmVhdGVfc3ViIChidWYsCisgICAgICAgICAgR1NUX0JVRkZFUl9TSVpFIChidWYpIC0gc2l6ZSwgbGFjZV9zaXplW25dKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiY3JlYXRlZCBzdWJidWZmZXIgJXAiLCBzdWIpOworCisgICAgICBpZiAoZGVsdGFfdW5pdCkKKyAgICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoc3ViLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgICAgICBlbHNlCisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAoc3ViLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisKKyAgICAgIGlmIChzdHJlYW0tPmVuY29kaW5ncyAhPSBOVUxMICYmIHN0cmVhbS0+ZW5jb2RpbmdzLT5sZW4gPiAwKQorICAgICAgICBzdWIgPSBnc3RfbWF0cm9za2FfZGVjb2RlX2J1ZmZlciAoc3RyZWFtLCBzdWIpOworCisgICAgICBpZiAoc3ViID09IE5VTEwpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIkRlY29kaW5nIGJ1ZmZlciBmYWlsZWQiKTsKKyAgICAgICAgZ290byBuZXh0X2xhY2U7CisgICAgICB9CisKKyAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChzdWIpID0gbGFjZV90aW1lOworCisgICAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGxhY2VfdGltZSkpIHsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIGxhc3Rfc3RvcF9lbmQ7CisKKyAgICAgICAgLyogQ2hlY2sgaWYgdGhpcyBzdHJlYW0gaXMgYWZ0ZXIgc2VnbWVudCBzdG9wICovCisgICAgICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAocGFyc2UtPmNvbW1vbi5zZWdtZW50LnN0b3ApICYmCisgICAgICAgICAgICBsYWNlX3RpbWUgPj0gcGFyc2UtPmNvbW1vbi5zZWdtZW50LnN0b3ApIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAgICAgIlN0cmVhbSAlZCBhZnRlciBzZWdtZW50IHN0b3AgJSIgR1NUX1RJTUVfRk9STUFULCBzdHJlYW0tPmluZGV4LAorICAgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChwYXJzZS0+Y29tbW9uLnNlZ21lbnQuc3RvcCkpOworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHN1Yik7CisgICAgICAgICAgZ290byBlb3M7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mZnNldCA+PSBzdHJlYW0tPnRvX29mZnNldCkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiU3RyZWFtICVkIGFmdGVyIHBsYXliYWNrIHNlY3Rpb24iLAorICAgICAgICAgICAgICBzdHJlYW0tPmluZGV4KTsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChzdWIpOworICAgICAgICAgIGdvdG8gZW9zOworICAgICAgICB9CisKKyAgICAgICAgLyogaGFuZGxlIGdhcHMsIGUuZy4gbm9uLXplcm8gc3RhcnQtdGltZSwgb3IgYW4gY3VlIGluZGV4IGVudHJ5CisgICAgICAgICAqIHRoYXQgbGFuZGVkIHVzIHdpdGggdGltZXN0YW1wcyBub3QgcXVpdGUgaW50ZW5kZWQgKi8KKyAgICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChwYXJzZS0+c2VnbWVudC5sYXN0X3N0b3ApICYmCisgICAgICAgICAgICBwYXJzZS0+c2VnbWVudC5yYXRlID4gMC4wKSB7CisgICAgICAgICAgR3N0Q2xvY2tUaW1lRGlmZiBkaWZmOworCisgICAgICAgICAgLyogb25seSBzZW5kIG5ld3NlZ21lbnRzIHdpdGggaW5jcmVhc2luZyBzdGFydCB0aW1lcywKKyAgICAgICAgICAgKiBvdGhlcndpc2UgaWYgdGhlc2UgZ28gYmFjayBhbmQgZm9ydGggZG93bnN0cmVhbSAoc2lua3MpIGluY3JlYXNlCisgICAgICAgICAgICogYWNjdW11bGF0ZWQgdGltZSBhbmQgcnVubmluZ190aW1lICovCisgICAgICAgICAgZGlmZiA9IEdTVF9DTE9DS19ESUZGIChwYXJzZS0+c2VnbWVudC5sYXN0X3N0b3AsIGxhY2VfdGltZSk7CisgICAgICAgICAgaWYgKGRpZmYgPiAyICogR1NUX1NFQ09ORCAmJiBsYWNlX3RpbWUgPiBwYXJzZS0+c2VnbWVudC5zdGFydCAmJgorICAgICAgICAgICAgICAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChwYXJzZS0+c2VnbWVudC5zdG9wKSB8fAorICAgICAgICAgICAgICAgICAgbGFjZV90aW1lIDwgcGFyc2UtPnNlZ21lbnQuc3RvcCkpIHsKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLAorICAgICAgICAgICAgICAgICJHYXAgb2YgJSIgR19HSU5UNjRfRk9STUFUICIgbnMgZGV0ZWN0ZWQgaW4iCisgICAgICAgICAgICAgICAgInN0cmVhbSAlZCAoJSIgR1NUX1RJTUVfRk9STUFUICIgLT4gJSIgR1NUX1RJTUVfRk9STUFUICIpLiAiCisgICAgICAgICAgICAgICAgIlNlbmRpbmcgdXBkYXRlZCBORVdTRUdNRU5UIGV2ZW50cyIsIGRpZmYsCisgICAgICAgICAgICAgICAgc3RyZWFtLT5pbmRleCwgR1NUX1RJTUVfQVJHUyAoc3RyZWFtLT5wb3MpLAorICAgICAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGxhY2VfdGltZSkpOworICAgICAgICAgICAgLyogc2VuZCBuZXdzZWdtZW50IGV2ZW50cyBzdWNoIHRoYXQgdGhlIGdhcCBpcyBub3QgYWNjb3VudGVkIGluCisgICAgICAgICAgICAgKiBhY2N1bSB0aW1lLCBoZW5jZSBydW5uaW5nX3RpbWUgKi8KKyAgICAgICAgICAgIC8qIGNsb3NlIGFoZWFkIG9mIGdhcCAqLworICAgICAgICAgICAgZ3N0X21hdHJvc2thX3BhcnNlX3NlbmRfZXZlbnQgKHBhcnNlLAorICAgICAgICAgICAgICAgIGdzdF9ldmVudF9uZXdfbmV3X3NlZ21lbnQgKFRSVUUsIHBhcnNlLT5zZWdtZW50LnJhdGUsCisgICAgICAgICAgICAgICAgICAgIHBhcnNlLT5zZWdtZW50LmZvcm1hdCwgcGFyc2UtPnNlZ21lbnQubGFzdF9zdG9wLAorICAgICAgICAgICAgICAgICAgICBwYXJzZS0+c2VnbWVudC5sYXN0X3N0b3AsIHBhcnNlLT5zZWdtZW50Lmxhc3Rfc3RvcCkpOworICAgICAgICAgICAgLyogc2tpcCBnYXAgKi8KKyAgICAgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9zZW5kX2V2ZW50IChwYXJzZSwKKyAgICAgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X25ld19zZWdtZW50IChGQUxTRSwgcGFyc2UtPnNlZ21lbnQucmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgcGFyc2UtPnNlZ21lbnQuZm9ybWF0LCBsYWNlX3RpbWUsIHBhcnNlLT5zZWdtZW50LnN0b3AsCisgICAgICAgICAgICAgICAgICAgIGxhY2VfdGltZSkpOworICAgICAgICAgICAgLyogYWxpZ24gc2VnbWVudCB2aWV3IHdpdGggZG93bnN0cmVhbSwKKyAgICAgICAgICAgICAqIHByZXZlbnRzIGRvdWJsZS1jb3VudGluZyBhY2N1bSB3aGVuIGNsb3Npbmcgc2VnbWVudCAqLworICAgICAgICAgICAgZ3N0X3NlZ21lbnRfc2V0X25ld3NlZ21lbnQgKCZwYXJzZS0+c2VnbWVudCwgRkFMU0UsCisgICAgICAgICAgICAgICAgcGFyc2UtPnNlZ21lbnQucmF0ZSwgcGFyc2UtPnNlZ21lbnQuZm9ybWF0LCBsYWNlX3RpbWUsCisgICAgICAgICAgICAgICAgcGFyc2UtPnNlZ21lbnQuc3RvcCwgbGFjZV90aW1lKTsKKyAgICAgICAgICAgIHBhcnNlLT5zZWdtZW50Lmxhc3Rfc3RvcCA9IGxhY2VfdGltZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChwYXJzZS0+c2VnbWVudC5sYXN0X3N0b3ApCisgICAgICAgICAgICB8fCBwYXJzZS0+c2VnbWVudC5sYXN0X3N0b3AgPCBsYWNlX3RpbWUpIHsKKyAgICAgICAgICBwYXJzZS0+c2VnbWVudC5sYXN0X3N0b3AgPSBsYWNlX3RpbWU7CisgICAgICAgIH0KKworICAgICAgICBsYXN0X3N0b3BfZW5kID0gbGFjZV90aW1lOworICAgICAgICBpZiAoZHVyYXRpb24pIHsKKyAgICAgICAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChzdWIpID0gZHVyYXRpb24gLyBsYWNlczsKKyAgICAgICAgICBsYXN0X3N0b3BfZW5kICs9IEdTVF9CVUZGRVJfRFVSQVRJT04gKHN1Yik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChwYXJzZS0+bGFzdF9zdG9wX2VuZCkgfHwKKyAgICAgICAgICAgIHBhcnNlLT5sYXN0X3N0b3BfZW5kIDwgbGFzdF9zdG9wX2VuZCkKKyAgICAgICAgICBwYXJzZS0+bGFzdF9zdG9wX2VuZCA9IGxhc3Rfc3RvcF9lbmQ7CisKKyAgICAgICAgaWYgKHBhcnNlLT5zZWdtZW50LmR1cmF0aW9uID09IC0xIHx8CisgICAgICAgICAgICBwYXJzZS0+c2VnbWVudC5kdXJhdGlvbiA8IGxhY2VfdGltZSkgeworICAgICAgICAgIGdzdF9zZWdtZW50X3NldF9kdXJhdGlvbiAoJnBhcnNlLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgICAgIGxhc3Rfc3RvcF9lbmQpOworICAgICAgICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAocGFyc2UpLAorICAgICAgICAgICAgICBnc3RfbWVzc2FnZV9uZXdfZHVyYXRpb24gKEdTVF9PQkpFQ1RfQ0FTVCAocGFyc2UpLAorICAgICAgICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBHU1RfQ0xPQ0tfVElNRV9OT05FKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc3RyZWFtLT5wb3MgPSBsYWNlX3RpbWU7CisKKyAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9zeW5jX3N0cmVhbXMgKHBhcnNlKTsKKworICAgICAgaWYgKHN0cmVhbS0+c2V0X2Rpc2NvbnQpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJtYXJraW5nIERJU0NPTlQiKTsKKyAgICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoc3ViLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgICAgIHN0cmVhbS0+c2V0X2Rpc2NvbnQgPSBGQUxTRTsKKyAgICAgIH0KKworICAgICAgLyogcmV2ZXJzZSBwbGF5YmFjayBib29rLWtlZXBpbmcgKi8KKyAgICAgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHN0cmVhbS0+ZnJvbV90aW1lKSkKKyAgICAgICAgc3RyZWFtLT5mcm9tX3RpbWUgPSBsYWNlX3RpbWU7CisgICAgICBpZiAoc3RyZWFtLT5mcm9tX29mZnNldCA9PSAtMSkKKyAgICAgICAgc3RyZWFtLT5mcm9tX29mZnNldCA9IG9mZnNldDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgIlB1c2hpbmcgbGFjZSAlZCwgZGF0YSBvZiBzaXplICVkIGZvciBzdHJlYW0gJWQsIHRpbWU9JSIKKyAgICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiBhbmQgZHVyYXRpb249JSIgR1NUX1RJTUVfRk9STUFULCBuLAorICAgICAgICAgIEdTVF9CVUZGRVJfU0laRSAoc3ViKSwgc3RyZWFtX251bSwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoc3ViKSksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVVJBVElPTiAoc3ViKSkpOworCisgICAgICBpZiAocGFyc2UtPmVsZW1lbnRfaW5kZXgpIHsKKyAgICAgICAgaWYgKHN0cmVhbS0+aW5kZXhfd3JpdGVyX2lkID09IC0xKQorICAgICAgICAgIGdzdF9pbmRleF9nZXRfd3JpdGVyX2lkIChwYXJzZS0+ZWxlbWVudF9pbmRleCwKKyAgICAgICAgICAgICAgR1NUX09CSkVDVCAoc3RyZWFtLT5wYWQpLCAmc3RyZWFtLT5pbmRleF93cml0ZXJfaWQpOworCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgImFkZGluZyBhc3NvY2lhdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQgIi0+ICUiCisgICAgICAgICAgICBHX0dVSU5UNjRfRk9STUFUICIgZm9yIHdyaXRlciBpZCAlZCIsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoc3ViKSksIGNsdXN0ZXJfb2Zmc2V0LAorICAgICAgICAgICAgc3RyZWFtLT5pbmRleF93cml0ZXJfaWQpOworICAgICAgICBnc3RfaW5kZXhfYWRkX2Fzc29jaWF0aW9uIChwYXJzZS0+ZWxlbWVudF9pbmRleCwKKyAgICAgICAgICAgIHN0cmVhbS0+aW5kZXhfd3JpdGVyX2lkLCBHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChzdWIsCisgICAgICAgICAgICAgICAgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpID8gMCA6IEdTVF9BU1NPQ0lBVElPTl9GTEFHX0tFWV9VTklULAorICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoc3ViKSwgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICAgICAgICAgIGNsdXN0ZXJfb2Zmc2V0LCBOVUxMKTsKKyAgICAgIH0KKworICAgICAgZ3N0X2J1ZmZlcl9zZXRfY2FwcyAoc3ViLCBHU1RfUEFEX0NBUFMgKHBhcnNlLT5zcmNwYWQpKTsKKworICAgICAgLyogUG9zdHByb2Nlc3MgdGhlIGJ1ZmZlcnMgZGVwZW5kaW5nIG9uIHRoZSBjb2RlYyB1c2VkICovCisgICAgICBpZiAoc3RyZWFtLT5wb3N0cHJvY2Vzc19mcmFtZSkgeworICAgICAgICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJydW5uaW5nIHBvc3QgcHJvY2VzcyIpOworICAgICAgICByZXQgPSBzdHJlYW0tPnBvc3Rwcm9jZXNzX2ZyYW1lIChHU1RfRUxFTUVOVCAocGFyc2UpLCBzdHJlYW0sICZzdWIpOworICAgICAgfQorCisgICAgICByZXQgPSBnc3RfcGFkX3B1c2ggKHN0cmVhbS0+cGFkLCBzdWIpOworICAgICAgaWYgKHBhcnNlLT5zZWdtZW50LnJhdGUgPCAwKSB7CisgICAgICAgIGlmIChsYWNlX3RpbWUgPiBwYXJzZS0+c2VnbWVudC5zdG9wICYmIHJldCA9PSBHU1RfRkxPV19FT1MpIHsKKyAgICAgICAgICAvKiBJbiByZXZlcnNlIHBsYXliYWNrIHdlIGNhbiBnZXQgYSBHU1RfRkxPV19FT1Mgd2hlbgorICAgICAgICAgICAqIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBzZWdtZW50LCBzbyB3ZSBqdXN0IG5lZWQgdG8ganVtcAorICAgICAgICAgICAqIGJhY2sgdG8gdGhlIHByZXZpb3VzIHNlY3Rpb24uICovCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJkb3duc3RyZWFtIGhhcyByZWFjaGVkIGVuZCBvZiBzZWdtZW50Iik7CisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIGNvbWJpbmUgZmxvd3MgKi8KKyAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9wYXJzZV9jb21iaW5lX2Zsb3dzIChwYXJzZSwgc3RyZWFtLCByZXQpOworI2VuZGlmCisKKyAgICBuZXh0X2xhY2U6CisgICAgICBzaXplIC09IGxhY2Vfc2l6ZVtuXTsKKyAgICAgIGlmIChsYWNlX3RpbWUgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSAmJiBkdXJhdGlvbikKKyAgICAgICAgbGFjZV90aW1lICs9IGR1cmF0aW9uIC8gbGFjZXM7CisgICAgICBlbHNlCisgICAgICAgIGxhY2VfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgfQorICB9CisKK2RvbmU6CisgIGlmIChidWYpIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIH0KKyAgZ19mcmVlIChsYWNlX3NpemUpOworCisgIHJldHVybiByZXQ7CisKKyAgLyogRVhJVFMgKi8KK2ludmFsaWRfbGFjaW5nOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocGFyc2UsIFNUUkVBTSwgREVNVVgsIChOVUxMKSwgKCJJbnZhbGlkIGxhY2luZyBzaXplIikpOworICAgIC8qIG5vbi1mYXRhbCwgdHJ5IG5leHQgYmxvY2soZ3JvdXApICovCisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgZ290byBkb25lOworICB9CitkYXRhX2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocGFyc2UsIFNUUkVBTSwgREVNVVgsIChOVUxMKSwgKCJEYXRhIGVycm9yIikpOworICAgIC8qIG5vbi1mYXRhbCwgdHJ5IG5leHQgYmxvY2soZ3JvdXApICovCisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgZ290byBkb25lOworICB9Cit9CisKKy8qIHJldHVybiBGQUxTRSBpZiBibG9jayhncm91cCkgc2hvdWxkIGJlIHNraXBwZWQgKGR1ZSB0byBhIHNlZWspICovCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitnc3RfbWF0cm9za2FfcGFyc2Vfc2Vla19ibG9jayAoR3N0TWF0cm9za2FQYXJzZSAqIHBhcnNlKQoreworICBpZiAoR19VTkxJS0VMWSAocGFyc2UtPnNlZWtfYmxvY2spKSB7CisgICAgaWYgKCEoLS1wYXJzZS0+c2Vla19ibG9jaykpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJzaG91bGQgc2tpcCBibG9jayBkdWUgdG8gc2VlayIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3BhcnNlX3BhcnNlX2NvbnRlbnRzX3NlZWtlbnRyeSAoR3N0TWF0cm9za2FQYXJzZSAqIHBhcnNlLAorICAgIEdzdEVibWxSZWFkICogZWJtbCkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIGd1aW50NjQgc2Vla19wb3MgPSAoZ3VpbnQ2NCkgLSAxOworICBndWludDMyIHNlZWtfaWQgPSAwOworICBndWludDMyIGlkOworCisgIERFQlVHX0VMRU1FTlRfU1RBUlQgKHBhcnNlLCBlYm1sLCAiU2VlayIpOworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChwYXJzZSwgZWJtbCwgIlNlZWsiLCByZXQpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmIGdzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoZWJtbCwgMSwgVFJVRSkpIHsKKyAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3BlZWtfaWQgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TRUVLSUQ6CisgICAgICB7CisgICAgICAgIGd1aW50NjQgdDsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmdCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiU2Vla0lEOiAlIiBHX0dVSU5UNjRfRk9STUFULCB0KTsKKyAgICAgICAgc2Vla19pZCA9IHQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TRUVLUE9TSVRJT046CisgICAgICB7CisgICAgICAgIGd1aW50NjQgdDsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmdCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmICh0ID4gR19NQVhJTlQ2NCkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICJUb28gbGFyZ2UgU2Vla1Bvc2l0aW9uICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJTZWVrUG9zaXRpb246ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHQpOworICAgICAgICBzZWVrX3BvcyA9IHQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2Vfc2tpcCAoJnBhcnNlLT5jb21tb24sIGVibWwsCisgICAgICAgICAgICAiU2Vla0hlYWQiLCBpZCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0sgJiYgcmV0ICE9IEdTVF9GTE9XX0VPUykKKyAgICByZXR1cm4gcmV0OworCisgIGlmICghc2Vla19pZCB8fCBzZWVrX3BvcyA9PSAoZ3VpbnQ2NCkgLSAxKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIkluY29tcGxldGUgc2Vla2hlYWQgZW50cnkgKDB4JXgvJSIKKyAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCAiKSIsIHNlZWtfaWQsIHNlZWtfcG9zKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KKworICBzd2l0Y2ggKHNlZWtfaWQpIHsKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TRUVLSEVBRDoKKyAgICB7CisgICAgfQorICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NVRVM6CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVEFHUzoKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS1M6CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfU0VHTUVOVElORk86CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQVRUQUNITUVOVFM6CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUlM6CisgICAgeworICAgICAgZ3VpbnQ2NCBsZW5ndGg7CisKKyAgICAgIC8qIHJlbWVtYmVyICovCisgICAgICBsZW5ndGggPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fZ2V0X2xlbmd0aCAoJnBhcnNlLT5jb21tb24pOworCisgICAgICBpZiAobGVuZ3RoID09IChndWludDY0KSAtIDEpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJubyB1cHN0cmVhbSBsZW5ndGgsIHNraXBwaW5nIFNlYWtIZWFkIGVudHJ5Iik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvKiBjaGVjayBmb3IgdmFsaWRpdHkgKi8KKyAgICAgIGlmIChzZWVrX3BvcyArIHBhcnNlLT5jb21tb24uZWJtbF9zZWdtZW50X3N0YXJ0ICsgMTIgPj0gbGVuZ3RoKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAiU2Vla0hlYWQgcmVmZXJlbmNlIGxpZXMgb3V0c2lkZSBmaWxlISIgIiAoJSIKKyAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIislIiBHX0dVSU5UNjRfRk9STUFUICIrMTIgPj0gJSIKKyAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIikiLCBzZWVrX3BvcywgcGFyc2UtPmNvbW1vbi5lYm1sX3NlZ21lbnRfc3RhcnQsCisgICAgICAgICAgICBsZW5ndGgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLyogb25seSBwaWNrIHVwIGluZGV4IGxvY2F0aW9uIHdoZW4gc3RyZWFtaW5nICovCisgICAgICBpZiAoc2Vla19pZCA9PSBHU1RfTUFUUk9TS0FfSURfQ1VFUykgeworICAgICAgICBwYXJzZS0+aW5kZXhfb2Zmc2V0ID0gc2Vla19wb3MgKyBwYXJzZS0+Y29tbW9uLmVibWxfc2VnbWVudF9zdGFydDsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJDdWVzIGxvY2F0ZWQgYXQgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICBwYXJzZS0+aW5kZXhfb2Zmc2V0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIklnbm9yaW5nIFNlZWsgZW50cnkgZm9yIElEPTB4JXgiLCBzZWVrX2lkKTsKKyAgICAgIGJyZWFrOworICB9CisgIERFQlVHX0VMRU1FTlRfU1RPUCAocGFyc2UsIGVibWwsICJTZWVrIiwgcmV0KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3BhcnNlX3BhcnNlX2NvbnRlbnRzIChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UsIEdzdEVibWxSZWFkICogZWJtbCkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ3VpbnQzMiBpZDsKKworICBERUJVR19FTEVNRU5UX1NUQVJUIChwYXJzZSwgZWJtbCwgIlNlZWtIZWFkIik7CisKKyAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICBERUJVR19FTEVNRU5UX1NUT1AgKHBhcnNlLCBlYm1sLCAiU2Vla0hlYWQiLCByZXQpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmIGdzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoZWJtbCwgMSwgVFJVRSkpIHsKKyAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3BlZWtfaWQgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TRUVLRU5UUlk6CisgICAgICB7CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9wYXJzZV9wYXJzZV9jb250ZW50c19zZWVrZW50cnkgKHBhcnNlLCBlYm1sKTsKKyAgICAgICAgLyogSWdub3JlIEVPUyBhbmQgZXJyb3JzIGhlcmUgKi8KKyAgICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiSWdub3JpbmcgJXMiLCBnc3RfZmxvd19nZXRfbmFtZSAocmV0KSk7CisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwICgmcGFyc2UtPmNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICJTZWVrSGVhZCIsIGlkKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgREVCVUdfRUxFTUVOVF9TVE9QIChwYXJzZSwgZWJtbCwgIlNlZWtIZWFkIiwgcmV0KTsKKworICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIEdTVF9GTE9XX09WRVJGTE9XICAgR1NUX0ZMT1dfQ1VTVE9NX0VSUk9SCisKKyNkZWZpbmUgTUFYX0JMT0NLX1NJWkUgKDE1ICogMTAyNCAqIDEwMjQpCisKK3N0YXRpYyBpbmxpbmUgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3BhcnNlX2NoZWNrX3JlYWRfc2l6ZSAoR3N0TWF0cm9za2FQYXJzZSAqIHBhcnNlLCBndWludDY0IGJ5dGVzKQoreworICBpZiAoR19VTkxJS0VMWSAoYnl0ZXMgPiBNQVhfQkxPQ0tfU0laRSkpIHsKKyAgICAvKiBvbmx5IGEgZmV3IGJsb2NrcyBhcmUgZXhwZWN0ZWQvYWxsb3dlZCB0byBiZSBsYXJnZSwKKyAgICAgKiBhbmQgd2lsbCBiZSByZWN1cnNlZCBpbnRvLCB3aGVyZWFzIG90aGVycyB3aWxsIGJlIHJlYWQgYW5kIG11c3QgZml0ICovCisgICAgLyogZmF0YWwgaW4gc3RyZWFtaW5nIGNhc2UsIGFzIHdlIGNhbid0IHN0ZXAgb3ZlciBlYXNpbHkgKi8KKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocGFyc2UsIFNUUkVBTSwgREVNVVgsIChOVUxMKSwKKyAgICAgICAgKCJyZWFkaW5nIGxhcmdlIGJsb2NrIG9mIHNpemUgJSIgR19HVUlOVDY0X0ZPUk1BVCAiIG5vdCBzdXBwb3J0ZWQ7ICIKKyAgICAgICAgICAgICJmaWxlIG1pZ2h0IGJlIGNvcnJ1cHQuIiwgYnl0ZXMpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9Cit9CisKKyNpZiAwCisvKiByZXR1cm5zIFRSVUUgaWYgd2UgdHJ1ZWx5IGFyZSBpbiBlcnJvciBzdGF0ZSwgYW5kIHNob3VsZCBnaXZlIHVwICovCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitnc3RfbWF0cm9za2FfcGFyc2VfY2hlY2tfcGFyc2VfZXJyb3IgKEdzdE1hdHJvc2thUGFyc2UgKiBwYXJzZSkKK3sKKyAgZ2ludDY0IHBvczsKKworICAvKiBzaWdoLCBvbmUgbGFzdCBhdHRlbXB0IGFib3ZlIGFuZCBiZXlvbmQgY2FsbCBvZiBkdXR5IC4uLjsKKyAgICogc2VhcmNoIGZvciBjbHVzdGVyIG1hcmsgZm9sbG93aW5nIGN1cnJlbnQgcG9zICovCisgIHBvcyA9IHBhcnNlLT5jb21tb24ub2Zmc2V0OworICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLCAicGFyc2UgZXJyb3IsIGxvb2tpbmcgZm9yIG5leHQgY2x1c3RlciIpOworICBpZiAoZ3N0X21hdHJvc2thX3BhcnNlX3NlYXJjaF9jbHVzdGVyIChwYXJzZSwgJnBvcykgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAvKiBkaWQgbm90IHdvcmssIGdpdmUgdXAgKi8KKyAgICByZXR1cm4gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIi4uLiBmb3VuZCBhdCAgJSIgR19HVUlOVDY0X0ZPUk1BVCwgcG9zKTsKKyAgICAvKiB0cnkgdGhhdCBwb3NpdGlvbiAqLworICAgIHBhcnNlLT5jb21tb24ub2Zmc2V0ID0gcG9zOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorI2VuZGlmCisKKy8qIGluaXRpYWxpemVzIEBlYm1sIHdpdGggQGJ5dGVzIGZyb20gaW5wdXQgc3RyZWFtIGF0IGN1cnJlbnQgb2Zmc2V0LgorICogUmV0dXJucyBFT1MgaWYgaW5zdWZmaWNpZW50IGF2YWlsYWJsZSwKKyAqIEVSUk9SIGlmIHRvbyBtdWNoIHdhcyBhdHRlbXB0ZWQgdG8gcmVhZC4gKi8KK3N0YXRpYyBpbmxpbmUgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3BhcnNlX3Rha2UgKEdzdE1hdHJvc2thUGFyc2UgKiBwYXJzZSwgZ3VpbnQ2NCBieXRlcywKKyAgICBHc3RFYm1sUmVhZCAqIGVibWwpCit7CisgIEdzdEJ1ZmZlciAqYnVmZmVyID0gTlVMTDsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKworICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJ0YWtpbmcgJSIgR19HVUlOVDY0X0ZPUk1BVCAiIGJ5dGVzIGZvciBwYXJzaW5nIiwKKyAgICAgIGJ5dGVzKTsKKyAgcmV0ID0gZ3N0X21hdHJvc2thX3BhcnNlX2NoZWNrX3JlYWRfc2l6ZSAocGFyc2UsIGJ5dGVzKTsKKyAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSykpIHsKKyAgICAvKiBvdGhlcndpc2UgZmF0YWwgKi8KKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGV4aXQ7CisgIH0KKyAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocGFyc2UtPmNvbW1vbi5hZGFwdGVyKSA8IGJ5dGVzKQorICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisKKyAgYnVmZmVyID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHBhcnNlLT5jb21tb24uYWRhcHRlciwgYnl0ZXMpOworICBpZiAoR19MSUtFTFkgKGJ1ZmZlcikpIHsKKyAgICBnc3RfZWJtbF9yZWFkX2luaXQgKGVibWwsIEdTVF9FTEVNRU5UX0NBU1QgKHBhcnNlKSwgYnVmZmVyLAorICAgICAgICBwYXJzZS0+Y29tbW9uLm9mZnNldCk7CisgICAgcGFyc2UtPmNvbW1vbi5vZmZzZXQgKz0gYnl0ZXM7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2V4aXQ6CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9wYXJzZV9jaGVja19zZWVrYWJpbGl0eSAoR3N0TWF0cm9za2FQYXJzZSAqIHBhcnNlKQoreworICBHc3RRdWVyeSAqcXVlcnk7CisgIGdib29sZWFuIHNlZWthYmxlID0gRkFMU0U7CisgIGdpbnQ2NCBzdGFydCA9IC0xLCBzdG9wID0gLTE7CisKKyAgcXVlcnkgPSBnc3RfcXVlcnlfbmV3X3NlZWtpbmcgKEdTVF9GT1JNQVRfQllURVMpOworICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeSAocGFyc2UtPmNvbW1vbi5zaW5rcGFkLCBxdWVyeSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgInNlZWtpbmcgcXVlcnkgZmFpbGVkIik7CisgICAgZ290byBkb25lOworICB9CisKKyAgZ3N0X3F1ZXJ5X3BhcnNlX3NlZWtpbmcgKHF1ZXJ5LCBOVUxMLCAmc2Vla2FibGUsICZzdGFydCwgJnN0b3ApOworCisgIC8qIHRyeSBoYXJkZXIgdG8gcXVlcnkgdXBzdHJlYW0gc2l6ZSBpZiB3ZSBkaWRuJ3QgZ2V0IGl0IHRoZSBmaXJzdCB0aW1lICovCisgIGlmIChzZWVrYWJsZSAmJiBzdG9wID09IC0xKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJkb2luZyBkdXJhdGlvbiBxdWVyeSB0byBmaXggdXAgdW5zZXQgc3RvcCIpOworICAgIGdzdF9wYWRfcGVlcl9xdWVyeV9kdXJhdGlvbiAocGFyc2UtPmNvbW1vbi5zaW5rcGFkLCBHU1RfRk9STUFUX0JZVEVTLAorICAgICAgICAmc3RvcCk7CisgIH0KKworICAvKiBpZiB1cHN0cmVhbSBkb2Vzbid0IGtub3cgdGhlIHNpemUsIGl0J3MgbGlrZWx5IHRoYXQgaXQncyBub3Qgc2Vla2FibGUgaW4KKyAgICogcHJhY3RpY2UgZXZlbiBpZiBpdCB0ZWNobmljYWxseSBtYXkgYmUgc2Vla2FibGUgKi8KKyAgaWYgKHNlZWthYmxlICYmIChzdGFydCAhPSAwIHx8IHN0b3AgPD0gc3RhcnQpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJzZWVrYWJsZSBidXQgdW5rbm93biBzdGFydC9zdG9wIC0+IGRpc2FibGUiKTsKKyAgICBzZWVrYWJsZSA9IEZBTFNFOworICB9CisKK2RvbmU6CisgIEdTVF9JTkZPX09CSkVDVCAocGFyc2UsICJzZWVrYWJsZTogJWQgKCUiIEdfR1VJTlQ2NF9GT1JNQVQgIiAtICUiCisgICAgICBHX0dVSU5UNjRfRk9STUFUICIpIiwgc2Vla2FibGUsIHN0YXJ0LCBzdG9wKTsKKyAgcGFyc2UtPnNlZWthYmxlID0gc2Vla2FibGU7CisKKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7Cit9CisKKyNpZiAwCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3BhcnNlX2ZpbmRfdHJhY2tzIChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UpCit7CisgIGd1aW50MzIgaWQ7CisgIGd1aW50NjQgYmVmb3JlX3BvczsKKyAgZ3VpbnQ2NCBsZW5ndGg7CisgIGd1aW50IG5lZWRlZDsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKworICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLAorICAgICAgIkZvdW5kIENsdXN0ZXIgZWxlbWVudCBiZWZvcmUgVHJhY2tzLCBzZWFyY2hpbmcgVHJhY2tzIik7CisKKyAgLyogcmVtZW1iZXIgKi8KKyAgYmVmb3JlX3BvcyA9IHBhcnNlLT5jb21tb24ub2Zmc2V0OworCisgIC8qIFNlYXJjaCBUcmFja3MgZWxlbWVudCAqLworICB3aGlsZSAoVFJVRSkgeworICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wZWVrX2lkX2xlbmd0aF9wdWxsICgmcGFyc2UtPmNvbW1vbiwKKyAgICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAocGFyc2UpLCAmaWQsICZsZW5ndGgsICZuZWVkZWQpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKworICAgIGlmIChpZCAhPSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tTKSB7CisgICAgICAvKiB3ZSBtYXkgYmUgc2tpcHBpbmcgbGFyZ2UgY2x1c3RlciBoZXJlLCBzbyBmb3JlZ28gc2l6ZSBjaGVjayBldGMgKi8KKyAgICAgIC8qIC4uLiBidXQgd2UgY2FuJ3Qgc2tpcCB1bmRlZmluZWQgc2l6ZTsgZm9yY2UgZXJyb3IgKi8KKyAgICAgIGlmIChsZW5ndGggPT0gR19NQVhVSU5UNjQpIHsKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3BhcnNlX2NoZWNrX3JlYWRfc2l6ZSAocGFyc2UsIGxlbmd0aCk7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyc2UtPmNvbW1vbi5vZmZzZXQgKz0gbmVlZGVkOworICAgICAgICBwYXJzZS0+b2Zmc2V0ICs9IGxlbmd0aDsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIHdpbGwgbGVhZCB0byB0cmFjayBwYXJzaW5nIC4uLiAqLworICAgIHJldCA9IGdzdF9tYXRyb3NrYV9wYXJzZV9wYXJzZV9pZCAocGFyc2UsIGlkLCBsZW5ndGgsIG5lZWRlZCk7CisgICAgYnJlYWs7CisgIH0KKworICAvKiBzZWVrIGJhY2sgKi8KKyAgcGFyc2UtPm9mZnNldCA9IGJlZm9yZV9wb3M7CisKKyAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisjZGVmaW5lIEdTVF9SRUFEX0NIRUNLKHN0bXQpICBcCitHX1NUTVRfU1RBUlQgeyBcCisgIGlmIChHX1VOTElLRUxZICgocmV0ID0gKHN0bXQpKSAhPSBHU1RfRkxPV19PSykpIHsgXAorICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfT1ZFUkZMT1cpIHsgXAorICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7IFwKKyAgICB9IFwKKyAgICBnb3RvIHJlYWRfZXJyb3I7IFwKKyAgfSBcCit9IEdfU1RNVF9FTkQKKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9wYXJzZV9hY2N1bXVsYXRlX3N0cmVhbWhlYWRlciAoR3N0TWF0cm9za2FQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgaWYgKHBhcnNlLT5wdXNoZWRfaGVhZGVycykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsCisgICAgICAgICJBY2N1bXVsYXRpbmcgaGVhZGVycywgYnV0IGhlYWRlcnMgYXJlIGFscmVhZHkgcHVzaGVkIik7CisgIH0KKworICBpZiAocGFyc2UtPnN0cmVhbWhlYWRlcikgeworICAgIHBhcnNlLT5zdHJlYW1oZWFkZXIgPSBnc3RfYnVmZmVyX2FwcGVuZCAocGFyc2UtPnN0cmVhbWhlYWRlciwKKyAgICAgICAgZ3N0X2J1ZmZlcl9yZWYgKGJ1ZmZlcikpOworICB9IGVsc2UgeworICAgIHBhcnNlLT5zdHJlYW1oZWFkZXIgPSBnc3RfYnVmZmVyX3JlZiAoYnVmZmVyKTsKKyAgfQorCisgIEdTVF9ERUJVRyAoIiUiIEdfR1NJWkVfRk9STUFULCBnc3RfYnVmZmVyX2dldF9zaXplIChwYXJzZS0+c3RyZWFtaGVhZGVyKSk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcGFyc2Vfb3V0cHV0IChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UsIEdzdEJ1ZmZlciAqIGJ1ZmZlciwKKyAgICBnYm9vbGVhbiBrZXlmcmFtZSkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgaWYgKCFwYXJzZS0+cHVzaGVkX2hlYWRlcnMpIHsKKyAgICBHc3RDYXBzICpjYXBzOworICAgIEdzdFN0cnVjdHVyZSAqczsKKyAgICBHVmFsdWUgc3RyZWFtaGVhZGVyID0geyAwIH07CisgICAgR1ZhbHVlIGJ1ZnZhbCA9IHsgMCB9OworICAgIEdzdEJ1ZmZlciAqYnVmOworCisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAocGFyc2UtPmNvbW1vbi5zaW5rcGFkKTsKKyAgICBpZiAoY2FwcyA9PSBOVUxMKSB7CisgICAgICBjYXBzID0gZ3N0X21hdHJvc2thX3BhcnNlX2ZvcmdlX2NhcHMgKHBhcnNlLT5jb21tb24uaXNfd2VibSwKKyAgICAgICAgICBwYXJzZS0+Y29tbW9uLmhhc192aWRlbyk7CisgICAgfSBlbHNlCisgICAgICBjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoY2Fwcyk7CisKKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgICAgZ192YWx1ZV9pbml0ICgmc3RyZWFtaGVhZGVyLCBHU1RfVFlQRV9BUlJBWSk7CisgICAgZ192YWx1ZV9pbml0ICgmYnVmdmFsLCBHU1RfVFlQRV9CVUZGRVIpOworICAgIGJ1ZiA9IGdzdF9idWZmZXJfY29weSAocGFyc2UtPnN0cmVhbWhlYWRlcik7CisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSKTsKKyAgICBnc3RfdmFsdWVfc2V0X2J1ZmZlciAoJmJ1ZnZhbCwgYnVmKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIGdzdF92YWx1ZV9hcnJheV9hcHBlbmRfdmFsdWUgKCZzdHJlYW1oZWFkZXIsICZidWZ2YWwpOworICAgIGdfdmFsdWVfdW5zZXQgKCZidWZ2YWwpOworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChzLCAic3RyZWFtaGVhZGVyIiwgJnN0cmVhbWhlYWRlcik7CisgICAgZ192YWx1ZV91bnNldCAoJnN0cmVhbWhlYWRlcik7CisgICAgLy9nc3RfY2Fwc19yZXBsYWNlIChwYXJzZS0+Y2FwcywgY2Fwcyk7CisgICAgZ3N0X3BhZF9zZXRfY2FwcyAocGFyc2UtPnNyY3BhZCwgY2Fwcyk7CisKKyAgICBpZiAocGFyc2UtPm5lZWRfbmV3c2VnbWVudCkgeworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChwYXJzZS0+c3JjcGFkLAorICAgICAgICAgIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnBhcnNlLT5jb21tb24uc2VnbWVudCkpOworICAgICAgcGFyc2UtPm5lZWRfbmV3c2VnbWVudCA9IEZBTFNFOworICAgIH0KKworICAgIGJ1ZiA9IGdzdF9idWZmZXJfY29weSAocGFyc2UtPnN0cmVhbWhlYWRlcik7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSKTsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKTsKKworICAgIHJldCA9IGdzdF9wYWRfcHVzaCAocGFyc2UtPnNyY3BhZCwgYnVmKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLCAiRmFpbGVkIHRvIHB1c2ggYnVmZmVyIik7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHBhcnNlLT5wdXNoZWRfaGVhZGVycyA9IFRSVUU7CisgIH0KKworICBpZiAoIWtleWZyYW1lKSB7CisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmZmVyLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChidWZmZXIsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKTsKKyAgfQorICBpZiAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcikgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgIHBhcnNlLT5sYXN0X3RpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpOworICB9IGVsc2UgeworICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpID0gcGFyc2UtPmxhc3RfdGltZXN0YW1wOworICB9CisKKyAgcmV0dXJuIGdzdF9wYWRfcHVzaCAocGFyc2UtPnNyY3BhZCwgZ3N0X2J1ZmZlcl9yZWYgKGJ1ZmZlcikpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3BhcnNlX3BhcnNlX2lkIChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UsIGd1aW50MzIgaWQsCisgICAgZ3VpbnQ2NCBsZW5ndGgsIGd1aW50IG5lZWRlZCkKK3sKKyAgR3N0RWJtbFJlYWQgZWJtbCA9IHsgMCwgfTsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ3VpbnQ2NCByZWFkOworICAvL0dzdEJ1ZmZlciAqYnVmZmVyOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiUGFyc2luZyBFbGVtZW50IGlkIDB4JXgsICIKKyAgICAgICJzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgcHJlZml4ICVkIiwgaWQsIGxlbmd0aCwgbmVlZGVkKTsKKworI2lmIDAKKyAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocGFyc2UtPmFkYXB0ZXIpID49IGxlbmd0aCArIG5lZWRlZCkgeworICAgIGJ1ZmZlciA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChwYXJzZS0+YWRhcHRlciwgbGVuZ3RoICsgbmVlZGVkKTsKKyAgICBnc3RfcGFkX3B1c2ggKHBhcnNlLT5zcmNwYWQsIGJ1ZmZlcik7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICB9CisgIC8vR1NUX1JFQURfQ0hFQ0sgKGdzdF9tYXRyb3NrYV9wYXJzZV90YWtlIChwYXJzZSwgcmVhZCwgJmVibWwpKTsKKworICByZXR1cm4gcmV0OworI2VuZGlmCisKKworCisgIC8qIGlmIHdlIHBsYW4gdG8gcmVhZCBhbmQgcGFyc2UgdGhpcyBlbGVtZW50LCB3ZSBuZWVkIHByZWZpeCAoaWQgKyBsZW5ndGgpCisgICAqIGFuZCB0aGUgY29udGVudHMgKi8KKyAgLyogbWluZCBhYm91dCBvdmVyZmxvdyB3cmFwLWFyb3VuZCB3aGVuIGRlYWxpbmcgd2l0aCB1bmRlZmluZWQgc2l6ZSAqLworICByZWFkID0gbGVuZ3RoOworICBpZiAoR19MSUtFTFkgKGxlbmd0aCAhPSBHX01BWFVJTlQ2NCkpCisgICAgcmVhZCArPSBuZWVkZWQ7CisKKyAgc3dpdGNoIChwYXJzZS0+Y29tbW9uLnN0YXRlKSB7CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9TVEFSVDoKKyAgICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgY2FzZSBHU1RfRUJNTF9JRF9IRUFERVI6CisgICAgICAgICAgR1NUX1JFQURfQ0hFQ0sgKGdzdF9tYXRyb3NrYV9wYXJzZV90YWtlIChwYXJzZSwgcmVhZCwgJmVibWwpKTsKKyAgICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfaGVhZGVyICgmcGFyc2UtPmNvbW1vbiwgJmVibWwpOworICAgICAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKyAgICAgICAgICBwYXJzZS0+Y29tbW9uLnN0YXRlID0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfU0VHTUVOVDsKKyAgICAgICAgICBnc3RfbWF0cm9za2FfcGFyc2VfY2hlY2tfc2Vla2FiaWxpdHkgKHBhcnNlKTsKKyAgICAgICAgICBnc3RfbWF0cm9za2FfcGFyc2VfYWNjdW11bGF0ZV9zdHJlYW1oZWFkZXIgKHBhcnNlLCBlYm1sLmJ1Zik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZ290byBpbnZhbGlkX2hlYWRlcjsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfU0VHTUVOVDoKKyAgICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfU0VHTUVOVDoKKyAgICAgICAgICAvKiBlYXQgc2VnbWVudCBwcmVmaXggKi8KKyAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX3BhcnNlX3Rha2UgKHBhcnNlLCBuZWVkZWQsICZlYm1sKSk7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICJGb3VuZCBTZWdtZW50IHN0YXJ0IGF0IG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFUICIgd2l0aCBzaXplICUiCisgICAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIHBhcnNlLT5jb21tb24ub2Zmc2V0LCBsZW5ndGgpOworICAgICAgICAgIC8qIHNlZWtzIGFyZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlZ21lbnQsCisgICAgICAgICAgICogYWZ0ZXIgdGhlIHNlZ21lbnQgSUQvbGVuZ3RoICovCisgICAgICAgICAgcGFyc2UtPmNvbW1vbi5lYm1sX3NlZ21lbnRfc3RhcnQgPSBwYXJzZS0+Y29tbW9uLm9mZnNldDsKKyAgICAgICAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgICAgICBsZW5ndGggPSBHX01BWFVJTlQ2NDsKKyAgICAgICAgICBwYXJzZS0+Y29tbW9uLmVibWxfc2VnbWVudF9sZW5ndGggPSBsZW5ndGg7CisgICAgICAgICAgcGFyc2UtPmNvbW1vbi5zdGF0ZSA9IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX0hFQURFUjsKKyAgICAgICAgICBnc3RfbWF0cm9za2FfcGFyc2VfYWNjdW11bGF0ZV9zdHJlYW1oZWFkZXIgKHBhcnNlLCBlYm1sLmJ1Zik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAgICAgIkV4cGVjdGVkIGEgU2VnbWVudCBJRCAoMHgleCksIGJ1dCByZWNlaXZlZCAweCV4ISIsCisgICAgICAgICAgICAgIEdTVF9NQVRST1NLQV9JRF9TRUdNRU5ULCBpZCk7CisgICAgICAgICAgR1NUX1JFQURfQ0hFQ0sgKGdzdF9tYXRyb3NrYV9wYXJzZV90YWtlIChwYXJzZSwgbmVlZGVkLCAmZWJtbCkpOworICAgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9hY2N1bXVsYXRlX3N0cmVhbWhlYWRlciAocGFyc2UsIGVibWwuYnVmKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfU0NBTk5JTkc6CisgICAgICBpZiAoaWQgIT0gR1NUX01BVFJPU0tBX0lEX0NMVVNURVIgJiYKKyAgICAgICAgICBpZCAhPSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUlRJTUVDT0RFKSB7CisgICAgICAgIC8qIHdlIG5lZWQgdG8gc2tpcCBieXRlIHBlciBieXRlIGlmIHdlIGFyZSBzY2FubmluZyBmb3IgYSBuZXcgY2x1c3RlciAqLworICAgICAgICByZWFkID0gMTsKKyAgICAgICAgZ290byBza2lwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAiUmVzeW5jIGRvbmUsIG5ldyBjbHVzdGVyIGZvdW5kISIpOworICAgICAgICBwYXJzZS0+Y29tbW9uLnN0YXJ0X3Jlc3luY19vZmZzZXQgPSAtMTsKKyAgICAgICAgcGFyc2UtPmNvbW1vbi5zdGF0ZSA9IHBhcnNlLT5jb21tb24uc3RhdGVfdG9fcmVzdG9yZTsKKyAgICAgIH0KKyAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICAgIGNhc2UgR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfSEVBREVSOgorICAgIGNhc2UgR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfREFUQToKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX1NFRUs6CisgICAgICBzd2l0Y2ggKGlkKSB7CisgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1NFR01FTlRJTkZPOgorICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfcGFyc2VfdGFrZSAocGFyc2UsIHJlYWQsICZlYm1sKSk7CisgICAgICAgICAgaWYgKCFwYXJzZS0+Y29tbW9uLnNlZ21lbnRpbmZvX3BhcnNlZCkgeworICAgICAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX2luZm8gKCZwYXJzZS0+Y29tbW9uLAorICAgICAgICAgICAgICAgIEdTVF9FTEVNRU5UX0NBU1QgKHBhcnNlKSwgJmVibWwpOworICAgICAgICAgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgICAgZ3N0X21hdHJvc2thX3BhcnNlX3NlbmRfdGFncyAocGFyc2UpOworICAgICAgICAgIH0KKyAgICAgICAgICBnc3RfbWF0cm9za2FfcGFyc2VfYWNjdW11bGF0ZV9zdHJlYW1oZWFkZXIgKHBhcnNlLCBlYm1sLmJ1Zik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLUzoKKyAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX3BhcnNlX3Rha2UgKHBhcnNlLCByZWFkLCAmZWJtbCkpOworICAgICAgICAgIGlmICghcGFyc2UtPnRyYWNrc19wYXJzZWQpIHsKKyAgICAgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9wYXJzZV9wYXJzZV90cmFja3MgKHBhcnNlLCAmZWJtbCk7CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9hY2N1bXVsYXRlX3N0cmVhbWhlYWRlciAocGFyc2UsIGVibWwuYnVmKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUjoKKyAgICAgICAgICBpZiAoR19VTkxJS0VMWSAoIXBhcnNlLT50cmFja3NfcGFyc2VkKSkgeworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJDbHVzdGVyIGJlZm9yZSBUcmFjayIpOworICAgICAgICAgICAgZ290byBub3Rfc3RyZWFtYWJsZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKEdfVU5MSUtFTFkgKHBhcnNlLT5jb21tb24uc3RhdGUKKyAgICAgICAgICAgICAgICAgID09IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX0hFQURFUikpIHsKKyAgICAgICAgICAgIHBhcnNlLT5jb21tb24uc3RhdGUgPSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9EQVRBOworICAgICAgICAgICAgcGFyc2UtPmZpcnN0X2NsdXN0ZXJfb2Zmc2V0ID0gcGFyc2UtPmNvbW1vbi5vZmZzZXQ7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgInNpZ25hbGluZyBubyBtb3JlIHBhZHMiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcGFyc2UtPmNsdXN0ZXJfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICAgICAgcGFyc2UtPmNsdXN0ZXJfb2Zmc2V0ID0gcGFyc2UtPmNvbW1vbi5vZmZzZXQ7CisgICAgICAgICAgaWYgKEdfVU5MSUtFTFkgKCFwYXJzZS0+c2Vla19maXJzdCAmJiBwYXJzZS0+c2Vla19ibG9jaykpIHsKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAic2VlayB0YXJnZXQgYmxvY2sgJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAgICAgICAgICIgbm90IGZvdW5kIGluIENsdXN0ZXIsIHRyeWluZyBuZXh0IENsdXN0ZXIncyBmaXJzdCBibG9jayBpbnN0ZWFkIiwKKyAgICAgICAgICAgICAgICBwYXJzZS0+c2Vla19ibG9jayk7CisgICAgICAgICAgICBwYXJzZS0+c2Vla19ibG9jayA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIHBhcnNlLT5zZWVrX2ZpcnN0ID0gRkFMU0U7CisgICAgICAgICAgLyogcmVjb3JkIG5leHQgY2x1c3RlciBmb3IgcmVjb3ZlcnkgKi8KKyAgICAgICAgICBpZiAocmVhZCAhPSBHX01BWFVJTlQ2NCkKKyAgICAgICAgICAgIHBhcnNlLT5uZXh0X2NsdXN0ZXJfb2Zmc2V0ID0gcGFyc2UtPmNsdXN0ZXJfb2Zmc2V0ICsgcmVhZDsKKyAgICAgICAgICAvKiBlYXQgY2x1c3RlciBwcmVmaXggKi8KKyAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX3BhcnNlX3Rha2UgKHBhcnNlLCBuZWVkZWQsICZlYm1sKSk7CisgICAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3BhcnNlX291dHB1dCAocGFyc2UsIGVibWwuYnVmLCBUUlVFKTsKKyAgICAgICAgICAvL2dzdF9tYXRyb3NrYV9wYXJzZV9hY2N1bXVsYXRlX3N0cmVhbWhlYWRlciAocGFyc2UsIGVibWwuYnVmKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUlRJTUVDT0RFOgorICAgICAgICB7CisgICAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX3BhcnNlX3Rha2UgKHBhcnNlLCByZWFkLCAmZWJtbCkpOworICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50ICgmZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIkNsdXN0ZXJUaW1lQ29kZTogJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICBwYXJzZS0+Y2x1c3Rlcl90aW1lID0gbnVtOworI2lmIDAKKyAgICAgICAgICBpZiAocGFyc2UtPmNvbW1vbi5lbGVtZW50X2luZGV4KSB7CisgICAgICAgICAgICBpZiAocGFyc2UtPmNvbW1vbi5lbGVtZW50X2luZGV4X3dyaXRlcl9pZCA9PSAtMSkKKyAgICAgICAgICAgICAgZ3N0X2luZGV4X2dldF93cml0ZXJfaWQgKHBhcnNlLT5jb21tb24uZWxlbWVudF9pbmRleCwKKyAgICAgICAgICAgICAgICAgIEdTVF9PQkpFQ1QgKHBhcnNlKSwgJnBhcnNlLT5jb21tb24uZWxlbWVudF9pbmRleF93cml0ZXJfaWQpOworICAgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAiYWRkaW5nIGFzc29jaWF0aW9uICUiIEdTVF9USU1FX0ZPUk1BVCAiLT4gJSIKKyAgICAgICAgICAgICAgICBHX0dVSU5UNjRfRk9STUFUICIgZm9yIHdyaXRlciBpZCAlZCIsCisgICAgICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocGFyc2UtPmNsdXN0ZXJfdGltZSksIHBhcnNlLT5jbHVzdGVyX29mZnNldCwKKyAgICAgICAgICAgICAgICBwYXJzZS0+Y29tbW9uLmVsZW1lbnRfaW5kZXhfd3JpdGVyX2lkKTsKKyAgICAgICAgICAgIGdzdF9pbmRleF9hZGRfYXNzb2NpYXRpb24gKHBhcnNlLT5jb21tb24uZWxlbWVudF9pbmRleCwKKyAgICAgICAgICAgICAgICBwYXJzZS0+Y29tbW9uLmVsZW1lbnRfaW5kZXhfd3JpdGVyX2lkLAorICAgICAgICAgICAgICAgIEdTVF9BU1NPQ0lBVElPTl9GTEFHX0tFWV9VTklULAorICAgICAgICAgICAgICAgIEdTVF9GT1JNQVRfVElNRSwgcGFyc2UtPmNsdXN0ZXJfdGltZSwKKyAgICAgICAgICAgICAgICBHU1RfRk9STUFUX0JZVEVTLCBwYXJzZS0+Y2x1c3Rlcl9vZmZzZXQsIE5VTEwpOworICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9vdXRwdXQgKHBhcnNlLCBlYm1sLmJ1ZiwgRkFMU0UpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0JMT0NLR1JPVVA6CisgICAgICAgICAgaWYgKCFnc3RfbWF0cm9za2FfcGFyc2Vfc2Vla19ibG9jayAocGFyc2UpKQorICAgICAgICAgICAgZ290byBza2lwOworICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfcGFyc2VfdGFrZSAocGFyc2UsIHJlYWQsICZlYm1sKSk7CisgICAgICAgICAgREVCVUdfRUxFTUVOVF9TVEFSVCAocGFyc2UsICZlYm1sLCAiQmxvY2tHcm91cCIpOworICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKCZlYm1sLCAmaWQpKSA9PSBHU1RfRkxPV19PSykgeworICAgICAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3BhcnNlX3BhcnNlX2Jsb2NrZ3JvdXBfb3Jfc2ltcGxlYmxvY2sgKHBhcnNlLAorICAgICAgICAgICAgICAgICZlYm1sLCBwYXJzZS0+Y2x1c3Rlcl90aW1lLCBwYXJzZS0+Y2x1c3Rlcl9vZmZzZXQsIEZBTFNFKTsKKyAgICAgICAgICB9CisgICAgICAgICAgREVCVUdfRUxFTUVOVF9TVE9QIChwYXJzZSwgJmVibWwsICJCbG9ja0dyb3VwIiwgcmV0KTsKKyAgICAgICAgICBnc3RfbWF0cm9za2FfcGFyc2Vfb3V0cHV0IChwYXJzZSwgZWJtbC5idWYsIEZBTFNFKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfU0lNUExFQkxPQ0s6CisgICAgICAgICAgaWYgKCFnc3RfbWF0cm9za2FfcGFyc2Vfc2Vla19ibG9jayAocGFyc2UpKQorICAgICAgICAgICAgZ290byBza2lwOworICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfcGFyc2VfdGFrZSAocGFyc2UsIHJlYWQsICZlYm1sKSk7CisgICAgICAgICAgREVCVUdfRUxFTUVOVF9TVEFSVCAocGFyc2UsICZlYm1sLCAiU2ltcGxlQmxvY2siKTsKKyAgICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcGFyc2VfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayAocGFyc2UsCisgICAgICAgICAgICAgICZlYm1sLCBwYXJzZS0+Y2x1c3Rlcl90aW1lLCBwYXJzZS0+Y2x1c3Rlcl9vZmZzZXQsIFRSVUUpOworICAgICAgICAgIERFQlVHX0VMRU1FTlRfU1RPUCAocGFyc2UsICZlYm1sLCAiU2ltcGxlQmxvY2siLCByZXQpOworICAgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9vdXRwdXQgKHBhcnNlLCBlYm1sLmJ1ZiwgRkFMU0UpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9BVFRBQ0hNRU5UUzoKKyAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX3BhcnNlX3Rha2UgKHBhcnNlLCByZWFkLCAmZWJtbCkpOworICAgICAgICAgIGlmICghcGFyc2UtPmNvbW1vbi5hdHRhY2htZW50c19wYXJzZWQpIHsKKyAgICAgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9hdHRhY2htZW50cyAoJnBhcnNlLT5jb21tb24sCisgICAgICAgICAgICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAocGFyc2UpLCAmZWJtbCk7CisgICAgICAgICAgICBpZiAocmV0ID09IEdTVF9GTE9XX09LKQorICAgICAgICAgICAgICBnc3RfbWF0cm9za2FfcGFyc2Vfc2VuZF90YWdzIChwYXJzZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9vdXRwdXQgKHBhcnNlLCBlYm1sLmJ1ZiwgRkFMU0UpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UQUdTOgorICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfcGFyc2VfdGFrZSAocGFyc2UsIHJlYWQsICZlYm1sKSk7CisgICAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX21ldGFkYXRhICgmcGFyc2UtPmNvbW1vbiwKKyAgICAgICAgICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAocGFyc2UpLCAmZWJtbCk7CisgICAgICAgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9zZW5kX3RhZ3MgKHBhcnNlKTsKKyAgICAgICAgICBnc3RfbWF0cm9za2FfcGFyc2VfYWNjdW11bGF0ZV9zdHJlYW1oZWFkZXIgKHBhcnNlLCBlYm1sLmJ1Zik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJTOgorICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfcGFyc2VfdGFrZSAocGFyc2UsIHJlYWQsICZlYm1sKSk7CisgICAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX2NoYXB0ZXJzICgmcGFyc2UtPmNvbW1vbiwgJmVibWwpOworICAgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9vdXRwdXQgKHBhcnNlLCBlYm1sLmJ1ZiwgRkFMU0UpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TRUVLSEVBRDoKKyAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX3BhcnNlX3Rha2UgKHBhcnNlLCByZWFkLCAmZWJtbCkpOworICAgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9wYXJzZV9wYXJzZV9jb250ZW50cyAocGFyc2UsICZlYm1sKTsKKyAgICAgICAgICBnc3RfbWF0cm9za2FfcGFyc2Vfb3V0cHV0IChwYXJzZSwgZWJtbC5idWYsIEZBTFNFKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ1VFUzoKKyAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX3BhcnNlX3Rha2UgKHBhcnNlLCByZWFkLCAmZWJtbCkpOworICAgICAgICAgIGlmICghcGFyc2UtPmNvbW1vbi5pbmRleF9wYXJzZWQpIHsKKyAgICAgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9pbmRleCAoJnBhcnNlLT5jb21tb24sICZlYm1sKTsKKyAgICAgICAgICAgIC8qIG9ubHkgcHVzaCBiYXNlZDsgZGVsYXllZCBpbmRleCBidWlsZGluZyAqLworICAgICAgICAgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSworICAgICAgICAgICAgICAgICYmIHBhcnNlLT5jb21tb24uc3RhdGUgPT0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfU0VFSykgeworICAgICAgICAgICAgICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgICAgICAgICAgICAgR1NUX09CSkVDVF9MT0NLIChwYXJzZSk7CisgICAgICAgICAgICAgIGV2ZW50ID0gcGFyc2UtPnNlZWtfZXZlbnQ7CisgICAgICAgICAgICAgIHBhcnNlLT5zZWVrX2V2ZW50ID0gTlVMTDsKKyAgICAgICAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHBhcnNlKTsKKworICAgICAgICAgICAgICBnX2Fzc2VydCAoZXZlbnQpOworICAgICAgICAgICAgICAvKiB1bmxpa2VseSB0byBmYWlsLCBzaW5jZSB3ZSBtYW5hZ2VkIHRvIHNlZWsgdG8gdGhpcyBwb2ludCAqLworICAgICAgICAgICAgICBpZiAoIWdzdF9tYXRyb3NrYV9wYXJzZV9oYW5kbGVfc2Vla19ldmVudCAocGFyc2UsIE5VTEwsIGV2ZW50KSkKKyAgICAgICAgICAgICAgICBnb3RvIHNlZWtfZmFpbGVkOworICAgICAgICAgICAgICAvKiByZXN1bWUgZGF0YSBoYW5kbGluZywgbWFpbiB0aHJlYWQgY2xlYXIgdG8gc2VlayBhZ2FpbiAqLworICAgICAgICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHBhcnNlKTsKKyAgICAgICAgICAgICAgcGFyc2UtPmNvbW1vbi5zdGF0ZSA9IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX0RBVEE7CisgICAgICAgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChwYXJzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9vdXRwdXQgKHBhcnNlLCBlYm1sLmJ1ZiwgRkFMU0UpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9QT1NJVElPTjoKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfUFJFVlNJWkU6CisgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0VOQ1JZUFRFREJMT0NLOgorICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TSUxFTlRUUkFDS1M6CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICJTa2lwcGluZyBDbHVzdGVyIHN1YmVsZW1lbnQgMHgleCAtIGlnbm9yaW5nIiwgaWQpOworICAgICAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICBza2lwOgorICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAic2tpcHBpbmcgRWxlbWVudCAweCV4IiwgaWQpOworICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfcGFyc2VfdGFrZSAocGFyc2UsIHJlYWQsICZlYm1sKSk7CisgICAgICAgICAgZ3N0X21hdHJvc2thX3BhcnNlX291dHB1dCAocGFyc2UsIGVibWwuYnVmLCBGQUxTRSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChyZXQgPT0gR1NUX0ZMT1dfUEFSU0UpCisgICAgZ290byBwYXJzZV9mYWlsZWQ7CisKK2V4aXQ6CisgIGdzdF9lYm1sX3JlYWRfY2xlYXIgKCZlYm1sKTsKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK3JlYWRfZXJyb3I6CisgIHsKKyAgICAvKiBzaW1wbHkgZXhpdCwgbWF5YmUgbm90IGVub3VnaCBkYXRhIHlldCAqLworICAgIC8qIG5vIGVibWwgdG8gY2xlYXIgaWYgcmVhZCBlcnJvciAqLworICAgIHJldHVybiByZXQ7CisgIH0KK3BhcnNlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwYXJzZSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAoIkZhaWxlZCB0byBwYXJzZSBFbGVtZW50IDB4JXgiLCBpZCkpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZXhpdDsKKyAgfQorbm90X3N0cmVhbWFibGU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocGFyc2UsIFNUUkVBTSwgREVNVVgsIChOVUxMKSwKKyAgICAgICAgKCJGaWxlIGxheW91dCBkb2VzIG5vdCBwZXJtaXQgc3RyZWFtaW5nIikpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZXhpdDsKKyAgfQorI2lmIDAKK25vX3RyYWNrczoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwYXJzZSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAoIk5vIFRyYWNrcyBlbGVtZW50IGZvdW5kIikpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZXhpdDsKKyAgfQorI2VuZGlmCitpbnZhbGlkX2hlYWRlcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwYXJzZSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLCAoIkludmFsaWQgaGVhZGVyIikpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZXhpdDsKKyAgfQorc2Vla19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocGFyc2UsIFNUUkVBTSwgREVNVVgsIChOVUxMKSwgKCJGYWlsZWQgdG8gc2VlayIpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGV4aXQ7CisgIH0KK30KKworI2lmIDAKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfcGFyc2VfbG9vcCAoR3N0UGFkICogcGFkKQoreworICBHc3RNYXRyb3NrYVBhcnNlICpwYXJzZSA9IEdTVF9NQVRST1NLQV9QQVJTRSAoR1NUX1BBRF9QQVJFTlQgKHBhZCkpOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ3VpbnQzMiBpZDsKKyAgZ3VpbnQ2NCBsZW5ndGg7CisgIGd1aW50IG5lZWRlZDsKKworICAvKiBJZiB3ZSBoYXZlIHRvIGNsb3NlIGEgc2VnbWVudCwgc2VuZCBhIG5ldyBzZWdtZW50IHRvIGRvIHRoaXMgbm93ICovCisgIGlmIChHX0xJS0VMWSAocGFyc2UtPmNvbW1vbi5zdGF0ZSA9PSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9EQVRBKSkgeworICAgIGlmIChHX1VOTElLRUxZIChwYXJzZS0+Y2xvc2Vfc2VnbWVudCkpIHsKKyAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9zZW5kX2V2ZW50IChwYXJzZSwgcGFyc2UtPmNsb3NlX3NlZ21lbnQpOworICAgICAgcGFyc2UtPmNsb3NlX3NlZ21lbnQgPSBOVUxMOworICAgIH0KKyAgICBpZiAoR19VTkxJS0VMWSAocGFyc2UtPm5ld19zZWdtZW50KSkgeworICAgICAgZ3N0X21hdHJvc2thX3BhcnNlX3NlbmRfZXZlbnQgKHBhcnNlLCBwYXJzZS0+bmV3X3NlZ21lbnQpOworICAgICAgcGFyc2UtPm5ld19zZWdtZW50ID0gTlVMTDsKKyAgICB9CisgIH0KKworICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGVla19pZF9sZW5ndGhfcHVsbCAoJnBhcnNlLT5jb21tb24sCisgICAgICBHU1RfRUxFTUVOVF9DQVNUIChwYXJzZSksICZpZCwgJmxlbmd0aCwgJm5lZWRlZCk7CisgIGlmIChyZXQgPT0gR1NUX0ZMT1dfRU9TKQorICAgIGdvdG8gZW9zOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgaWYgKGdzdF9tYXRyb3NrYV9wYXJzZV9jaGVja19wYXJzZV9lcnJvciAocGFyc2UpKQorICAgICAgZ290byBwYXVzZTsKKyAgICBlbHNlCisgICAgICByZXR1cm47CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJPZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBFbGVtZW50IGlkIDB4JXgsICIKKyAgICAgICJzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgbmVlZGVkICVkIiwgcGFyc2UtPm9mZnNldCwgaWQsCisgICAgICBsZW5ndGgsIG5lZWRlZCk7CisKKyAgcmV0ID0gZ3N0X21hdHJvc2thX3BhcnNlX3BhcnNlX2lkIChwYXJzZSwgaWQsIGxlbmd0aCwgbmVlZGVkKTsKKyAgaWYgKHJldCA9PSBHU1RfRkxPV19FT1MpCisgICAgZ290byBlb3M7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBwYXVzZTsKKworICAvKiBjaGVjayBpZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIGEgY29uZmlndXJlZCBzZWdtZW50ICovCisgIGlmIChHX0xJS0VMWSAocGFyc2UtPnNyYy0+bGVuKSkgeworICAgIGd1aW50IGk7CisKKyAgICBnX2Fzc2VydCAocGFyc2UtPm51bV9zdHJlYW1zID09IHBhcnNlLT5zcmMtPmxlbik7CisgICAgZm9yIChpID0gMDsgaSA8IHBhcnNlLT5zcmMtPmxlbjsgaSsrKSB7CisgICAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqY29udGV4dCA9IGdfcHRyX2FycmF5X2luZGV4IChwYXJzZS0+c3JjLCBpKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbnRleHQtPnBhZCwgInBvcyAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoY29udGV4dC0+cG9zKSk7CisgICAgICBpZiAoY29udGV4dC0+ZW9zID09IEZBTFNFKQorICAgICAgICBnb3RvIG5leHQ7CisgICAgfQorCisgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIkFsbCBzdHJlYW1zIGFyZSBFT1MiKTsKKyAgICByZXQgPSBHU1RfRkxPV19FT1M7CisgICAgZ290byBlb3M7CisgIH0KKworbmV4dDoKKyAgaWYgKEdfVU5MSUtFTFkgKHBhcnNlLT5vZmZzZXQgPT0KKyAgICAgICAgICBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fZ2V0X2xlbmd0aCAoJnBhcnNlLT5jb21tb24pKSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgIlJlYWNoZWQgZW5kIG9mIHN0cmVhbSIpOworICAgIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgICBnb3RvIGVvczsKKyAgfQorCisgIHJldHVybjsKKworICAvKiBFUlJPUlMgKi8KK2VvczoKKyAgeworICAgIGlmIChwYXJzZS0+c2VnbWVudC5yYXRlIDwgMC4wKSB7CisgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcGFyc2Vfc2Vla190b19wcmV2aW91c19rZXlmcmFtZSAocGFyc2UpOworICAgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgfQorcGF1c2U6CisgIHsKKyAgICBjb25zdCBnY2hhciAqcmVhc29uID0gZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCk7CisgICAgZ2Jvb2xlYW4gcHVzaF9lb3MgPSBGQUxTRTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgInBhdXNpbmcgdGFzaywgcmVhc29uICVzIiwgcmVhc29uKTsKKyAgICBwYXJzZS0+c2VnbWVudF9ydW5uaW5nID0gRkFMU0U7CisgICAgZ3N0X3BhZF9wYXVzZV90YXNrIChwYXJzZS0+Y29tbW9uLnNpbmtwYWQpOworCisgICAgaWYgKHJldCA9PSBHU1RfRkxPV19FT1MpIHsKKyAgICAgIC8qIHBlcmZvcm0gRU9TIGxvZ2ljICovCisKKyAgICAgIC8qIENsb3NlIHRoZSBzZWdtZW50LCBpLmUuIHVwZGF0ZSBzZWdtZW50IHN0b3Agd2l0aCB0aGUgZHVyYXRpb24KKyAgICAgICAqIGlmIG5vIHN0b3Agd2FzIHNldCAqLworICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChwYXJzZS0+bGFzdF9zdG9wX2VuZCkgJiYKKyAgICAgICAgICAhR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHBhcnNlLT5zZWdtZW50LnN0b3ApKSB7CisgICAgICAgIEdzdEV2ZW50ICpldmVudCA9CisgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X25ld19zZWdtZW50X2Z1bGwgKFRSVUUsIHBhcnNlLT5zZWdtZW50LnJhdGUsCisgICAgICAgICAgICBwYXJzZS0+c2VnbWVudC5hcHBsaWVkX3JhdGUsIHBhcnNlLT5zZWdtZW50LmZvcm1hdCwKKyAgICAgICAgICAgIHBhcnNlLT5zZWdtZW50LnN0YXJ0LAorICAgICAgICAgICAgTUFYIChwYXJzZS0+bGFzdF9zdG9wX2VuZCwgcGFyc2UtPnNlZ21lbnQuc3RhcnQpLAorICAgICAgICAgICAgcGFyc2UtPnNlZ21lbnQudGltZSk7CisgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9zZW5kX2V2ZW50IChwYXJzZSwgZXZlbnQpOworICAgICAgfQorCisgICAgICBpZiAocGFyc2UtPnNlZ21lbnQuZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NFR01FTlQpIHsKKyAgICAgICAgZ2ludDY0IHN0b3A7CisKKyAgICAgICAgLyogZm9yIHNlZ21lbnQgcGxheWJhY2sgd2UgbmVlZCB0byBwb3N0IHdoZW4gKGluIHN0cmVhbSB0aW1lKQorICAgICAgICAgKiB3ZSBzdG9wcGVkLCB0aGlzIGlzIGVpdGhlciBzdG9wICh3aGVuIHNldCkgb3IgdGhlIGR1cmF0aW9uLiAqLworICAgICAgICBpZiAoKHN0b3AgPSBwYXJzZS0+c2VnbWVudC5zdG9wKSA9PSAtMSkKKyAgICAgICAgICBzdG9wID0gcGFyc2UtPmxhc3Rfc3RvcF9lbmQ7CisKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAiU2VuZGluZyBzZWdtZW50IGRvbmUsIGF0IGVuZCBvZiBzZWdtZW50Iik7CisgICAgICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKHBhcnNlKSwKKyAgICAgICAgICAgIGdzdF9tZXNzYWdlX25ld19zZWdtZW50X2RvbmUgKEdTVF9PQkpFQ1QgKHBhcnNlKSwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICAgICAgICAgIHN0b3ApKTsKKyAgICAgICAgZ3N0X21hdHJvc2thX3BhcnNlX3NlbmRfZXZlbnQgKHBhcnNlLAorICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19zZWdtZW50X2RvbmUgKEdTVF9GT1JNQVRfVElNRSwgc3RvcCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHVzaF9lb3MgPSBUUlVFOworICAgICAgfQorICAgIH0gZWxzZSBpZiAocmV0ID09IEdTVF9GTE9XX05PVF9MSU5LRUQgfHwgcmV0IDwgR1NUX0ZMT1dfRU9TKSB7CisgICAgICAvKiBmb3IgZmF0YWwgZXJyb3JzIHdlIHBvc3QgYW4gZXJyb3IgbWVzc2FnZSAqLworICAgICAgR1NUX0VMRU1FTlRfRkxPV19FUlJPUiAocGFyc2UsIHJldCk7CisgICAgICBwdXNoX2VvcyA9IFRSVUU7CisgICAgfQorICAgIGlmIChwdXNoX2VvcykgeworICAgICAgLyogc2VuZCBFT1MsIGFuZCBwcmV2ZW50IGhhbmdpbmcgaWYgbm8gc3RyZWFtcyB5ZXQgKi8KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgIlNlbmRpbmcgRU9TLCBhdCBlbmQgb2Ygc3RyZWFtIik7CisgICAgICBpZiAoIWdzdF9tYXRyb3NrYV9wYXJzZV9zZW5kX2V2ZW50IChwYXJzZSwgZ3N0X2V2ZW50X25ld19lb3MgKCkpICYmCisgICAgICAgICAgKHJldCA9PSBHU1RfRkxPV19FT1MpKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwYXJzZSwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgICAgIChOVUxMKSwgKCJnb3QgZW9zIGJ1dCBubyBzdHJlYW1zICh5ZXQpIikpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIH0KK30KKyNlbmRpZgorCisvKgorICogQ3JlYXRlIGFuZCBwdXNoIGEgZmx1c2hpbmcgc2VlayBldmVudCB1cHN0cmVhbQorICovCitzdGF0aWMgZ2Jvb2xlYW4KK3BlcmZvcm1fc2Vla190b19vZmZzZXQgKEdzdE1hdHJvc2thUGFyc2UgKiBwYXJzZSwgZ3VpbnQ2NCBvZmZzZXQpCit7CisgIEdzdEV2ZW50ICpldmVudDsKKyAgZ2Jvb2xlYW4gcmVzID0gMDsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlNlZWtpbmcgdG8gJSIgR19HVUlOVDY0X0ZPUk1BVCwgb2Zmc2V0KTsKKworICBldmVudCA9CisgICAgICBnc3RfZXZlbnRfbmV3X3NlZWsgKDEuMCwgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICAgIEdTVF9TRUVLX0ZMQUdfRkxVU0ggfCBHU1RfU0VFS19GTEFHX0FDQ1VSQVRFLCBHU1RfU0VFS19UWVBFX1NFVCwgb2Zmc2V0LAorICAgICAgR1NUX1NFRUtfVFlQRV9OT05FLCAtMSk7CisKKyAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChwYXJzZS0+Y29tbW9uLnNpbmtwYWQsIGV2ZW50KTsKKworICAvKiBuZXdzZWdtZW50IGV2ZW50IHdpbGwgdXBkYXRlIG9mZnNldCAqLworICByZXR1cm4gcmVzOworfQorCisvKgorICogRm9yZ2UgZW1wdHkgZGVmYXVsdCBjYXBzIHdoZW4gYWxsIHdlIGtub3cgaXMgdGhlIHN0cmVhbSdzIEVCTUwKKyAqIHR5cGUgYW5kIHdoZXRoZXIgaXQgaGFzIHZpZGVvIG9yIG5vdC4KKyAqCisgKiBGSVhNRTogRG8gc29tZXRoaW5nIHdpdGggdmlkZW8veC1tYXRyb3NrYS0zZCBpZiBwb3NzaWJsZQorICovCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfbWF0cm9za2FfcGFyc2VfZm9yZ2VfY2FwcyAoZ2Jvb2xlYW4gaXNfd2VibSwgZ2Jvb2xlYW4gaGFzX3ZpZGVvKQoreworICBHc3RDYXBzICpjYXBzOworCisgIGlmIChpc193ZWJtKSB7CisgICAgaWYgKGhhc192aWRlbykKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgidmlkZW8vd2VibSIpOworICAgIGVsc2UKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8vd2VibSIpOworICB9IGVsc2UgeworICAgIGlmIChoYXNfdmlkZW8pCisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtbWF0cm9za2EiKTsKKyAgICBlbHNlCisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtbWF0cm9za2EiKTsKKyAgfQorICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9wYXJzZV9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0TWF0cm9za2FQYXJzZSAqcGFyc2UgPSBHU1RfTUFUUk9TS0FfUEFSU0UgKHBhcmVudCk7CisgIGd1aW50IGF2YWlsYWJsZTsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ3VpbnQgbmVlZGVkID0gMDsKKyAgZ3VpbnQzMiBpZDsKKyAgZ3VpbnQ2NCBsZW5ndGg7CisKKyAgaWYgKEdfVU5MSUtFTFkgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAoYnVmZmVyKSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgImdvdCBESVNDT05UIik7CisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHBhcnNlLT5jb21tb24uYWRhcHRlcik7CisgICAgR1NUX09CSkVDVF9MT0NLIChwYXJzZSk7CisgICAgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3Jlc2V0X3N0cmVhbXMgKCZwYXJzZS0+Y29tbW9uLAorICAgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FLCBGQUxTRSk7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHBhcnNlKTsKKyAgfQorCisgIGdzdF9hZGFwdGVyX3B1c2ggKHBhcnNlLT5jb21tb24uYWRhcHRlciwgYnVmZmVyKTsKKyAgYnVmZmVyID0gTlVMTDsKKworbmV4dDoKKyAgYXZhaWxhYmxlID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChwYXJzZS0+Y29tbW9uLmFkYXB0ZXIpOworCisgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wZWVrX2lkX2xlbmd0aF9wdXNoICgmcGFyc2UtPmNvbW1vbiwKKyAgICAgIEdTVF9FTEVNRU5UX0NBU1QgKHBhcnNlKSwgJmlkLCAmbGVuZ3RoLCAmbmVlZGVkKTsKKyAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSyAmJiByZXQgIT0gR1NUX0ZMT1dfRU9TKSkgeworICAgIGlmIChwYXJzZS0+Y29tbW9uLmVibWxfc2VnbWVudF9sZW5ndGggIT0gR19NQVhVSU5UNjQKKyAgICAgICAgJiYgcGFyc2UtPmNvbW1vbi5vZmZzZXQgPj0KKyAgICAgICAgcGFyc2UtPmNvbW1vbi5lYm1sX3NlZ21lbnRfc3RhcnQgKyBwYXJzZS0+Y29tbW9uLmVibWxfc2VnbWVudF9sZW5ndGgpIHsKKyAgICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qCisgICAgICAgKiBwYXJzaW5nIGVycm9yOiB3ZSBuZWVkIHRvIGZsdXNoIGEgYnl0ZSBmcm9tIHRoZSBhZGFwdGVyIGlmIHRoZSBpZCBpcworICAgICAgICogbm90IGEgY2x1c3RlciBhbmQgc28gb24gdW50aWwgd2UgZm91bmQgYSBuZXcgY2x1c2VyIG9yIHRoZQorICAgICAgICogSU5WQUxJRF9EQVRBX1RIUkVTSE9MRCBpcyBleGNlZWRlZCwgd2UgcmV1c2UgZ3N0X21hdHJvc2thX3BhcnNlX3BhcnNlX2lkCisgICAgICAgKiBzZXR0aW5nIHRoZSBzdGF0ZSB0byBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9TQ0FOTklORyBzbyB0aGUgYnl0ZXMKKyAgICAgICAqIGFyZSBza2lwcGVkIHVudGlsIGEgbmV3IGNsdXN0ZXIgaXMgZm91bmQKKyAgICAgICAqLworICAgICAgZ2ludDY0IGJ5dGVzX3NjYW5uZWQ7CisgICAgICBpZiAocGFyc2UtPmNvbW1vbi5zdGFydF9yZXN5bmNfb2Zmc2V0ID09IC0xKSB7CisgICAgICAgIHBhcnNlLT5jb21tb24uc3RhcnRfcmVzeW5jX29mZnNldCA9IHBhcnNlLT5jb21tb24ub2Zmc2V0OworICAgICAgICBwYXJzZS0+Y29tbW9uLnN0YXRlX3RvX3Jlc3RvcmUgPSBwYXJzZS0+Y29tbW9uLnN0YXRlOworICAgICAgfQorICAgICAgYnl0ZXNfc2Nhbm5lZCA9IHBhcnNlLT5jb21tb24ub2Zmc2V0IC0gcGFyc2UtPmNvbW1vbi5zdGFydF9yZXN5bmNfb2Zmc2V0OworICAgICAgaWYgKGJ5dGVzX3NjYW5uZWQgPD0gSU5WQUxJRF9EQVRBX1RIUkVTSE9MRCkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLAorICAgICAgICAgICAgInBhcnNlIGVycm9yLCBsb29raW5nIGZvciBuZXh0IGNsdXN0ZXIsIGFjdHVhbCBvZmZzZXQgJSIKKyAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIiwgc3RhcnQgcmVzeW5jIG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgcGFyc2UtPmNvbW1vbi5vZmZzZXQsIHBhcnNlLT5jb21tb24uc3RhcnRfcmVzeW5jX29mZnNldCk7CisgICAgICAgIHBhcnNlLT5jb21tb24uc3RhdGUgPSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9TQ0FOTklORzsKKyAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLAorICAgICAgICAgICAgInVucmVjb3ZlcmFibGUgcGFyc2UgZXJyb3IsIG5leHQgY2x1c3RlciBub3QgZm91bmQgYW5kIHRocmVzaG9sZCAiCisgICAgICAgICAgICAiZXhjZWVkZWQsIGJ5dGVzIHNjYW5uZWQgJSIgR19HSU5UNjRfRk9STUFULCBieXRlc19zY2FubmVkKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJPZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBFbGVtZW50IGlkIDB4JXgsICIKKyAgICAgICJzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgbmVlZGVkICVkLCBhdmFpbGFibGUgJWQiLAorICAgICAgcGFyc2UtPmNvbW1vbi5vZmZzZXQsIGlkLCBsZW5ndGgsIG5lZWRlZCwgYXZhaWxhYmxlKTsKKworICBpZiAobmVlZGVkID4gYXZhaWxhYmxlKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICByZXQgPSBnc3RfbWF0cm9za2FfcGFyc2VfcGFyc2VfaWQgKHBhcnNlLCBpZCwgbGVuZ3RoLCBuZWVkZWQpOworICBpZiAocmV0ID09IEdTVF9GTE9XX0VPUykgeworICAgIC8qIG5lZWQgbW9yZSBkYXRhICovCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9IGVsc2UgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgIHJldHVybiByZXQ7CisgIH0gZWxzZQorICAgIGdvdG8gbmV4dDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbWF0cm9za2FfcGFyc2VfaGFuZGxlX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisgIEdzdE1hdHJvc2thUGFyc2UgKnBhcnNlID0gR1NUX01BVFJPU0tBX1BBUlNFIChHU1RfUEFEX1BBUkVOVCAocGFkKSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAiaGF2ZSBldmVudCB0eXBlICVzOiAlcCBvbiBzaW5rIHBhZCIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSwgZXZlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6CisgICAgeworICAgICAgY29uc3QgR3N0U2VnbWVudCAqc2VnbWVudDsKKworICAgICAgLyogc29tZSBkZWJ1ZyBvdXRwdXQgKi8KKyAgICAgIGdzdF9ldmVudF9wYXJzZV9zZWdtZW50IChldmVudCwgJnNlZ21lbnQpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgInJlY2VpdmVkIGZvcm1hdCAlZCBuZXdzZWdtZW50ICUiIEdTVF9TRUdNRU5UX0ZPUk1BVCwKKyAgICAgICAgICBzZWdtZW50LT5mb3JtYXQsIHNlZ21lbnQpOworCisgICAgICBpZiAocGFyc2UtPmNvbW1vbi5zdGF0ZSA8IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX0RBVEEpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJzdGlsbCBzdGFydGluZyIpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgICB9CisKKyAgICAgIC8qIHdlIG9ubHkgZXhwZWN0IGEgQllURSBzZWdtZW50LCBlLmcuIGZvbGxvd2luZyBhIHNlZWsgKi8KKyAgICAgIGlmIChzZWdtZW50LT5mb3JtYXQgIT0gR1NUX0ZPUk1BVF9CWVRFUykgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgInVuc3VwcG9ydGVkIHNlZ21lbnQgZm9ybWF0LCBpZ25vcmluZyIpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgICB9CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiY2xlYXJpbmcgc2VnbWVudCBzdGF0ZSIpOworICAgICAgLyogY2xlYXIgY3VycmVudCBzZWdtZW50IGxlZnRvdmVyICovCisgICAgICBnc3RfYWRhcHRlcl9jbGVhciAocGFyc2UtPmNvbW1vbi5hZGFwdGVyKTsKKyAgICAgIC8qIGFuZCBzb21lIHN0cmVhbWluZyBzZXR1cCAqLworICAgICAgcGFyc2UtPmNvbW1vbi5vZmZzZXQgPSBzZWdtZW50LT5zdGFydDsKKyAgICAgIC8qIGRvIG5vdCBrbm93IHdoZXJlIHdlIGFyZTsKKyAgICAgICAqIG5lZWQgdG8gY29tZSBhY3Jvc3MgYSBjbHVzdGVyIGFuZCBnZW5lcmF0ZSBuZXdzZWdtZW50ICovCisgICAgICBwYXJzZS0+Y29tbW9uLnNlZ21lbnQucG9zaXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgICAgcGFyc2UtPmNsdXN0ZXJfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICBwYXJzZS0+Y2x1c3Rlcl9vZmZzZXQgPSAwOworICAgICAgcGFyc2UtPm5lZWRfbmV3c2VnbWVudCA9IFRSVUU7CisgICAgICAvKiBidXQga2VlcCBzb21lIG9mIHRoZSB1cHN0cmVhbSBzZWdtZW50ICovCisgICAgICBwYXJzZS0+Y29tbW9uLnNlZ21lbnQucmF0ZSA9IHNlZ21lbnQtPnJhdGU7CisgICAgZXhpdDoKKyAgICAgIC8qIGNoYWluIHdpbGwgc2VuZCBpbml0aWFsIG5ld3NlZ21lbnQgYWZ0ZXIgcGFkcyBoYXZlIGJlZW4gYWRkZWQsCisgICAgICAgKiBvciBvdGhlcndpc2UgY29tZSB1cCB3aXRoIG9uZSAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJlYXRpbmcgZXZlbnQiKTsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgeworICAgICAgaWYgKHBhcnNlLT5jb21tb24uc3RhdGUgIT0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfREFUQQorICAgICAgICAgICYmIHBhcnNlLT5jb21tb24uc3RhdGUgIT0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfU0NBTk5JTkcpIHsKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwYXJzZSwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgICAgIChOVUxMKSwgKCJnb3QgZW9zIGFuZCBkaWRuJ3QgcmVjZWl2ZSBhIGNvbXBsZXRlIGhlYWRlciBvYmplY3QiKSk7CisgICAgICB9IGVsc2UgaWYgKHBhcnNlLT5jb21tb24ubnVtX3N0cmVhbXMgPT0gMCkgeworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAocGFyc2UsIFNUUkVBTSwgREVNVVgsCisgICAgICAgICAgICAoTlVMTCksICgiZ290IGVvcyBidXQgbm8gc3RyZWFtcyAoeWV0KSIpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9zZW5kX2V2ZW50IChwYXJzZSwgZXZlbnQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6CisgICAgeworICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHBhcnNlLT5jb21tb24uYWRhcHRlcik7CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHBhcnNlKTsKKyAgICAgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9yZXNldF9zdHJlYW1zICgmcGFyc2UtPmNvbW1vbiwKKyAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FLCBUUlVFKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChwYXJzZSk7CisgICAgICBwYXJzZS0+Y29tbW9uLnNlZ21lbnQucG9zaXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgICAgcGFyc2UtPmNsdXN0ZXJfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICBwYXJzZS0+Y2x1c3Rlcl9vZmZzZXQgPSAwOworICAgICAgLyogZmFsbC10aHJvdWdoICovCisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX3BhcnNlX3NldF9pbmRleCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEluZGV4ICogaW5kZXgpCit7CisgIEdzdE1hdHJvc2thUGFyc2UgKnBhcnNlID0gR1NUX01BVFJPU0tBX1BBUlNFIChlbGVtZW50KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHBhcnNlKTsKKyAgaWYgKHBhcnNlLT5jb21tb24uZWxlbWVudF9pbmRleCkKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwYXJzZS0+Y29tbW9uLmVsZW1lbnRfaW5kZXgpOworICBwYXJzZS0+Y29tbW9uLmVsZW1lbnRfaW5kZXggPSBpbmRleCA/IGdzdF9vYmplY3RfcmVmIChpbmRleCkgOiBOVUxMOworICBHU1RfT0JKRUNUX1VOTE9DSyAocGFyc2UpOworICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlNldCBpbmRleCAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIHBhcnNlLT5jb21tb24uZWxlbWVudF9pbmRleCk7Cit9CisKK3N0YXRpYyBHc3RJbmRleCAqCitnc3RfbWF0cm9za2FfcGFyc2VfZ2V0X2luZGV4IChHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgR3N0SW5kZXggKnJlc3VsdCA9IE5VTEw7CisgIEdzdE1hdHJvc2thUGFyc2UgKnBhcnNlID0gR1NUX01BVFJPU0tBX1BBUlNFIChlbGVtZW50KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHBhcnNlKTsKKyAgaWYgKHBhcnNlLT5jb21tb24uZWxlbWVudF9pbmRleCkKKyAgICByZXN1bHQgPSBnc3Rfb2JqZWN0X3JlZiAocGFyc2UtPmNvbW1vbi5lbGVtZW50X2luZGV4KTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHBhcnNlKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlJldHVybmluZyBpbmRleCAlIiBHU1RfUFRSX0ZPUk1BVCwgcmVzdWx0KTsKKworICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X21hdHJvc2thX3BhcnNlX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0TWF0cm9za2FQYXJzZSAqcGFyc2UgPSBHU1RfTUFUUk9TS0FfUEFSU0UgKGVsZW1lbnQpOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1M7CisKKyAgLyogaGFuZGxlIHVwd2FyZHMgc3RhdGUgY2hhbmdlcyBoZXJlICovCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIC8qIGhhbmRsZSBkb3dud2FyZHMgc3RhdGUgY2hhbmdlcyAqLworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X21hdHJvc2thX3BhcnNlX3Jlc2V0IChHU1RfRUxFTUVOVCAocGFyc2UpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfbWF0cm9za2FfcGFyc2VfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgZ3N0X3JpZmZfaW5pdCAoKTsKKworICAvKiBjcmVhdGUgYW4gZWxlbWVudGZhY3RvcnkgZm9yIHRoZSBtYXRyb3NrYV9wYXJzZSBlbGVtZW50ICovCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIm1hdHJvc2thcGFyc2UiLAorICAgICAgICAgIEdTVF9SQU5LX05PTkUsIEdTVF9UWVBFX01BVFJPU0tBX1BBUlNFKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuaCBiL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNTk4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuaApAQCAtMCwwICsxLDEwNSBAQAorLyogR1N0cmVhbWVyIE1hdHJvc2thIG11eGVyL2RlbXV4ZXIKKyAqIChjKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqIChjKSAyMDExIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKyAqCisgKiBtYXRyb3NrYS1wYXJzZS5oOiBtYXRyb3NrYSBmaWxlL3N0cmVhbSBwYXJzZWVyIGRlZmluaXRpb24KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX01BVFJPU0tBX1BBUlNFX0hfXworI2RlZmluZSBfX0dTVF9NQVRST1NLQV9QQVJTRV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImVibWwtcmVhZC5oIgorI2luY2x1ZGUgIm1hdHJvc2thLWlkcy5oIgorI2luY2x1ZGUgIm1hdHJvc2thLXJlYWQtY29tbW9uLmgiCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9NQVRST1NLQV9QQVJTRSBcCisgIChnc3RfbWF0cm9za2FfcGFyc2VfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9NQVRST1NLQV9QQVJTRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfTUFUUk9TS0FfUEFSU0UsIEdzdE1hdHJvc2thUGFyc2UpKQorI2RlZmluZSBHU1RfTUFUUk9TS0FfUEFSU0VfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9NQVRST1NLQV9QQVJTRSwgR3N0TWF0cm9za2FQYXJzZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX01BVFJPU0tBX1BBUlNFKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9NQVRST1NLQV9QQVJTRSkpCisjZGVmaW5lIEdTVF9JU19NQVRST1NLQV9QQVJTRV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX01BVFJPU0tBX1BBUlNFKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE1hdHJvc2thUGFyc2UgeworICBHc3RFbGVtZW50ICAgICAgICAgICAgICBwYXJlbnQ7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKworICBHc3RNYXRyb3NrYVJlYWRDb21tb24gICAgY29tbW9uOworCisgIC8qIHBhZHMgKi8KKyAgR3N0UGFkICAgICAgICAgICAgICAgICAgKnNyY3BhZDsKKyAgR3N0Q2xvY2sgICAgICAgICAgICAgICAgKmNsb2NrOworICBndWludCAgICAgICAgICAgICAgICAgICAgbnVtX3Zfc3RyZWFtczsKKyAgZ3VpbnQgICAgICAgICAgICAgICAgICAgIG51bV9hX3N0cmVhbXM7CisgIGd1aW50ICAgICAgICAgICAgICAgICAgICBudW1fdF9zdHJlYW1zOworCisgIEdzdEJ1ZmZlciAqc3RyZWFtaGVhZGVyOworICBnYm9vbGVhbiBwdXNoZWRfaGVhZGVyczsKKyAgR3N0Q2xvY2tUaW1lIGxhc3RfdGltZXN0YW1wOworCisgIC8qIHN0YXRlICovCisgIC8vZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIHN0cmVhbWluZzsKKyAgZ3VpbnQ2NCAgICAgICAgICAgICAgICAgIHNlZWtfYmxvY2s7CisgIGdib29sZWFuICAgICAgICAgICAgICAgICBzZWVrX2ZpcnN0OworCisgIC8qIGRpZCB3ZSBwYXJzZSBjdWVzL3RyYWNrcy9zZWdtZW50aW5mbyBhbHJlYWR5PyAqLworICBnYm9vbGVhbiAgICAgICAgICAgICAgICAgdHJhY2tzX3BhcnNlZDsKKyAgR0xpc3QgICAgICAgICAgICAgICAgICAgKnNlZWtfcGFyc2VkOworCisgIC8qIGtlZXBpbmcgdHJhY2sgb2YgcGxheWJhY2sgcG9zaXRpb24gKi8KKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIHNlZ21lbnRfcnVubmluZzsKKyAgR3N0Q2xvY2tUaW1lICAgICAgICAgICAgIGxhc3Rfc3RvcF9lbmQ7CisKKyAgR3N0RXZlbnQgICAgICAgICAgICAgICAgKmNsb3NlX3NlZ21lbnQ7CisgIEdzdEV2ZW50ICAgICAgICAgICAgICAgICpuZXdfc2VnbWVudDsKKworICAvKiBzb21lIHN0YXRlIHNhdmluZyAqLworICBHc3RDbG9ja1RpbWUgICAgICAgICAgICAgY2x1c3Rlcl90aW1lOworICBndWludDY0ICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9vZmZzZXQ7CisgIGd1aW50NjQgICAgICAgICAgICAgICAgICBmaXJzdF9jbHVzdGVyX29mZnNldDsKKyAgZ3VpbnQ2NCAgICAgICAgICAgICAgICAgIG5leHRfY2x1c3Rlcl9vZmZzZXQ7CisKKyAgLyogaW5kZXggc3R1ZmYgKi8KKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIHNlZWthYmxlOworICBnYm9vbGVhbiAgICAgICAgICAgICAgICAgYnVpbGRpbmdfaW5kZXg7CisgIGd1aW50NjQgICAgICAgICAgICAgICAgICBpbmRleF9vZmZzZXQ7CisgIEdzdEV2ZW50ICAgICAgICAgICAgICAgICpzZWVrX2V2ZW50OworICBnYm9vbGVhbiAgICAgICAgICAgICAgICAgbmVlZF9uZXdzZWdtZW50OworCisgIC8qIHJldmVyc2UgcGxheWJhY2sgKi8KKyAgR0FycmF5ICAgICAgICAgICAgICAgICAgKnNlZWtfaW5kZXg7CisgIGdpbnQgICAgICAgICAgICAgICAgICAgICBzZWVrX2VudHJ5OworfSBHc3RNYXRyb3NrYVBhcnNlOworCit0eXBlZGVmIHN0cnVjdCBfR3N0TWF0cm9za2FQYXJzZUNsYXNzIHsKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudDsKK30gR3N0TWF0cm9za2FQYXJzZUNsYXNzOworCitnYm9vbGVhbiBnc3RfbWF0cm9za2FfcGFyc2VfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX01BVFJPU0tBX1BBUlNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmMgYi9nc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTliYTdmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmMKQEAgLTAsMCArMSwzMDcwIEBACisvKiBHU3RyZWFtZXIgTWF0cm9za2EgbXV4ZXIvZGVtdXhlcgorICogKGMpIDIwMDMgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogKGMpIDIwMDYgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqIChjKSAyMDA4IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqIChjKSAyMDExIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKyAqCisgKiBtYXRyb3NrYS1yZWFkLWNvbW1vbi5jOiBzaGFyZWQgYnkgbWF0cm9za2EgZmlsZS9zdHJlYW0gZGVtdXhlciBhbmQgcGFyc2VyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIEhBVkVfWkxJQgorI2luY2x1ZGUgPHpsaWIuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9CWjIKKyNpbmNsdWRlIDxiemxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdHR5cGVmaW5kaGVscGVyLmg+CisKKyNpbmNsdWRlICJsem8uaCIKKworI2luY2x1ZGUgImVibWwtcmVhZC5oIgorI2luY2x1ZGUgIm1hdHJvc2thLXJlYWQtY29tbW9uLmgiCisjaW5jbHVkZSAibWF0cm9za2EtaWRzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWSAobWF0cm9za2FyZWFkY29tbW9uX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIG1hdHJvc2thcmVhZGNvbW1vbl9kZWJ1ZworCisjZGVmaW5lIERFQlVHX0VMRU1FTlRfU1RBUlQoY29tbW9uLCBlYm1sLCBlbGVtZW50KSBcCisgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiUGFyc2luZyAiIGVsZW1lbnQgIiBlbGVtZW50IGF0IG9mZnNldCAlIiBcCisgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIGdzdF9lYm1sX3JlYWRfZ2V0X3BvcyAoZWJtbCkpCisKKyNkZWZpbmUgREVCVUdfRUxFTUVOVF9TVE9QKGNvbW1vbiwgZWJtbCwgZWxlbWVudCwgcmV0KSBcCisgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiUGFyc2luZyAiIGVsZW1lbnQgIiBlbGVtZW50ICIgXAorICAgICAgICAiIGZpbmlzaGVkIHdpdGggJyVzJyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKQorCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UT0NfVUlEX0NIQVBURVIgImNoYXB0ZXIiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UT0NfVUlEX0VESVRJT04gImVkaXRpb24iCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UT0NfVUlEX0VNUFRZICJlbXB0eSIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0VGFnTGlzdCAqcmVzdWx0OworICBndWludDY0IHRhcmdldF90eXBlX3ZhbHVlOworICBnY2hhciAqdGFyZ2V0X3R5cGU7CisgIGdib29sZWFuIGF1ZGlvX29ubHk7Cit9IFRhcmdldFR5cGVDb250ZXh0OworCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX2RlY29tcHJlc3NfZGF0YSAoR3N0TWF0cm9za2FUcmFja0VuY29kaW5nICogZW5jLAorICAgIGdwb2ludGVyICogZGF0YV9vdXQsIGdzaXplICogc2l6ZV9vdXQsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbXByZXNzaW9uQWxnb3JpdGhtIGFsZ28pCit7CisgIGd1aW50OCAqbmV3X2RhdGEgPSBOVUxMOworICBndWludCBuZXdfc2l6ZSA9IDA7CisgIGd1aW50OCAqZGF0YSA9ICpkYXRhX291dDsKKyAgZ3VpbnQgc2l6ZSA9ICpzaXplX291dDsKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKworICBpZiAoYWxnbyA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfQ09NUFJFU1NJT05fQUxHT1JJVEhNX1pMSUIpIHsKKyNpZmRlZiBIQVZFX1pMSUIKKyAgICAvKiB6bGliIGVuY29kZWQgZGF0YSAqLworICAgIHpfc3RyZWFtIHpzdHJlYW07CisgICAgZ3VpbnQgb3JpZ19zaXplOworICAgIGludCByZXN1bHQ7CisKKyAgICBvcmlnX3NpemUgPSBzaXplOworICAgIHpzdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpIDA7CisgICAgenN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpIDA7CisgICAgenN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKSAwOworICAgIGlmIChpbmZsYXRlSW5pdCAoJnpzdHJlYW0pICE9IFpfT0spIHsKKyAgICAgIEdTVF9XQVJOSU5HICgiemxpYiBpbml0aWFsaXphdGlvbiBmYWlsZWQuIik7CisgICAgICByZXQgPSBGQUxTRTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICB6c3RyZWFtLm5leHRfaW4gPSAoQnl0ZWYgKikgZGF0YTsKKyAgICB6c3RyZWFtLmF2YWlsX2luID0gb3JpZ19zaXplOworICAgIG5ld19zaXplID0gb3JpZ19zaXplOworICAgIG5ld19kYXRhID0gZ19tYWxsb2MgKG5ld19zaXplKTsKKyAgICB6c3RyZWFtLmF2YWlsX291dCA9IG5ld19zaXplOworICAgIHpzdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZWYgKikgbmV3X2RhdGE7CisKKyAgICBkbyB7CisgICAgICByZXN1bHQgPSBpbmZsYXRlICgmenN0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgICBpZiAocmVzdWx0ID09IFpfU1RSRUFNX0VORCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IFpfT0spIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJpbmZsYXRlKCkgcmV0dXJuZWQgJWQiLCByZXN1bHQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgbmV3X3NpemUgKz0gNDA5NjsKKyAgICAgIG5ld19kYXRhID0gZ19yZWFsbG9jIChuZXdfZGF0YSwgbmV3X3NpemUpOworICAgICAgenN0cmVhbS5uZXh0X291dCA9IChCeXRlZiAqKSAobmV3X2RhdGEgKyB6c3RyZWFtLnRvdGFsX291dCk7CisgICAgICB6c3RyZWFtLmF2YWlsX291dCArPSA0MDk2OworICAgIH0gd2hpbGUgKHpzdHJlYW0uYXZhaWxfaW4gPiAwKTsKKworICAgIGlmIChyZXN1bHQgIT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICByZXQgPSBGQUxTRTsKKyAgICAgIGdfZnJlZSAobmV3X2RhdGEpOworICAgIH0gZWxzZSB7CisgICAgICBuZXdfc2l6ZSA9IHpzdHJlYW0udG90YWxfb3V0OworICAgIH0KKyAgICBpbmZsYXRlRW5kICgmenN0cmVhbSk7CisKKyNlbHNlCisgICAgR1NUX1dBUk5JTkcgKCJ6bGliIGVuY29kZWQgdHJhY2tzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgcmV0ID0gRkFMU0U7CisgICAgZ290byBvdXQ7CisjZW5kaWYKKyAgfSBlbHNlIGlmIChhbGdvID09IEdTVF9NQVRST1NLQV9UUkFDS19DT01QUkVTU0lPTl9BTEdPUklUSE1fQlpMSUIpIHsKKyNpZmRlZiBIQVZFX0JaMgorICAgIC8qIGJ6aXAyIGVuY29kZWQgZGF0YSAqLworICAgIGJ6X3N0cmVhbSBienN0cmVhbTsKKyAgICBndWludCBvcmlnX3NpemU7CisgICAgaW50IHJlc3VsdDsKKworICAgIGJ6c3RyZWFtLmJ6YWxsb2MgPSBOVUxMOworICAgIGJ6c3RyZWFtLmJ6ZnJlZSA9IE5VTEw7CisgICAgYnpzdHJlYW0ub3BhcXVlID0gTlVMTDsKKyAgICBvcmlnX3NpemUgPSBzaXplOworCisgICAgaWYgKEJaMl9iekRlY29tcHJlc3NJbml0ICgmYnpzdHJlYW0sIDAsIDApICE9IEJaX09LKSB7CisgICAgICBHU1RfV0FSTklORyAoImJ6aXAyIGluaXRpYWxpemF0aW9uIGZhaWxlZC4iKTsKKyAgICAgIHJldCA9IEZBTFNFOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgYnpzdHJlYW0ubmV4dF9pbiA9IChjaGFyICopIGRhdGE7CisgICAgYnpzdHJlYW0uYXZhaWxfaW4gPSBvcmlnX3NpemU7CisgICAgbmV3X3NpemUgPSBvcmlnX3NpemU7CisgICAgbmV3X2RhdGEgPSBnX21hbGxvYyAobmV3X3NpemUpOworICAgIGJ6c3RyZWFtLmF2YWlsX291dCA9IG5ld19zaXplOworICAgIGJ6c3RyZWFtLm5leHRfb3V0ID0gKGNoYXIgKikgbmV3X2RhdGE7CisKKyAgICBkbyB7CisgICAgICByZXN1bHQgPSBCWjJfYnpEZWNvbXByZXNzICgmYnpzdHJlYW0pOworICAgICAgaWYgKHJlc3VsdCA9PSBCWl9TVFJFQU1fRU5EKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gQlpfT0spIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJCWjJfYnpEZWNvbXByZXNzKCkgcmV0dXJuZWQgJWQiLCByZXN1bHQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgbmV3X3NpemUgKz0gNDA5NjsKKyAgICAgIG5ld19kYXRhID0gZ19yZWFsbG9jIChuZXdfZGF0YSwgbmV3X3NpemUpOworICAgICAgYnpzdHJlYW0ubmV4dF9vdXQgPSAoY2hhciAqKSAobmV3X2RhdGEgKyBienN0cmVhbS50b3RhbF9vdXRfbG8zMik7CisgICAgICBienN0cmVhbS5hdmFpbF9vdXQgKz0gNDA5NjsKKyAgICB9IHdoaWxlIChienN0cmVhbS5hdmFpbF9pbiA+IDApOworCisgICAgaWYgKHJlc3VsdCAhPSBCWl9TVFJFQU1fRU5EKSB7CisgICAgICByZXQgPSBGQUxTRTsKKyAgICAgIGdfZnJlZSAobmV3X2RhdGEpOworICAgIH0gZWxzZSB7CisgICAgICBuZXdfc2l6ZSA9IGJ6c3RyZWFtLnRvdGFsX291dF9sbzMyOworICAgIH0KKyAgICBCWjJfYnpEZWNvbXByZXNzRW5kICgmYnpzdHJlYW0pOworCisjZWxzZQorICAgIEdTVF9XQVJOSU5HICgiYnppcDIgZW5jb2RlZCB0cmFja3Mgbm90IHN1cHBvcnRlZC4iKTsKKyAgICByZXQgPSBGQUxTRTsKKyAgICBnb3RvIG91dDsKKyNlbmRpZgorICB9IGVsc2UgaWYgKGFsZ28gPT0gR1NUX01BVFJPU0tBX1RSQUNLX0NPTVBSRVNTSU9OX0FMR09SSVRITV9MWk8xWCkgeworICAgIC8qIGx6byBlbmNvZGVkIGRhdGEgKi8KKyAgICBpbnQgcmVzdWx0OworICAgIGludCBvcmlnX3NpemUsIG91dF9zaXplOworCisgICAgb3JpZ19zaXplID0gc2l6ZTsKKyAgICBvdXRfc2l6ZSA9IHNpemU7CisgICAgbmV3X3NpemUgPSBzaXplOworICAgIG5ld19kYXRhID0gZ19tYWxsb2MgKG5ld19zaXplKTsKKworICAgIGRvIHsKKyAgICAgIG9yaWdfc2l6ZSA9IHNpemU7CisgICAgICBvdXRfc2l6ZSA9IG5ld19zaXplOworCisgICAgICByZXN1bHQgPSBsem8xeF9kZWNvZGUgKG5ld19kYXRhLCAmb3V0X3NpemUsIGRhdGEsICZvcmlnX3NpemUpOworCisgICAgICBpZiAob3JpZ19zaXplID4gMCkgeworICAgICAgICBuZXdfc2l6ZSArPSA0MDk2OworICAgICAgICBuZXdfZGF0YSA9IGdfcmVhbGxvYyAobmV3X2RhdGEsIG5ld19zaXplKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlIChvcmlnX3NpemUgPiAwICYmIHJlc3VsdCA9PSBMWk9fT1VUUFVUX0ZVTEwpOworCisgICAgbmV3X3NpemUgLT0gb3V0X3NpemU7CisKKyAgICBpZiAocmVzdWx0ICE9IExaT19PVVRQVVRfRlVMTCkgeworICAgICAgR1NUX1dBUk5JTkcgKCJsem8gZGVjb21wcmVzc2lvbiBmYWlsZWQiKTsKKyAgICAgIGdfZnJlZSAobmV3X2RhdGEpOworCisgICAgICByZXQgPSBGQUxTRTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB9IGVsc2UgaWYgKGFsZ28gPT0gR1NUX01BVFJPU0tBX1RSQUNLX0NPTVBSRVNTSU9OX0FMR09SSVRITV9IRUFERVJTVFJJUCkgeworICAgIC8qIGhlYWRlciBzdHJpcHBlZCBlbmNvZGVkIGRhdGEgKi8KKyAgICBpZiAoZW5jLT5jb21wX3NldHRpbmdzX2xlbmd0aCA+IDApIHsKKyAgICAgIG5ld19kYXRhID0gZ19tYWxsb2MgKHNpemUgKyBlbmMtPmNvbXBfc2V0dGluZ3NfbGVuZ3RoKTsKKyAgICAgIG5ld19zaXplID0gc2l6ZSArIGVuYy0+Y29tcF9zZXR0aW5nc19sZW5ndGg7CisKKyAgICAgIG1lbWNweSAobmV3X2RhdGEsIGVuYy0+Y29tcF9zZXR0aW5ncywgZW5jLT5jb21wX3NldHRpbmdzX2xlbmd0aCk7CisgICAgICBtZW1jcHkgKG5ld19kYXRhICsgZW5jLT5jb21wX3NldHRpbmdzX2xlbmd0aCwgZGF0YSwgc2l6ZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9FUlJPUiAoImludmFsaWQgY29tcHJlc3Npb24gYWxnb3JpdGhtICVkIiwgYWxnbyk7CisgICAgcmV0ID0gRkFMU0U7CisgIH0KKworb3V0OgorCisgIGlmICghcmV0KSB7CisgICAgKmRhdGFfb3V0ID0gTlVMTDsKKyAgICAqc2l6ZV9vdXQgPSAwOworICB9IGVsc2UgeworICAgICpkYXRhX291dCA9IG5ld19kYXRhOworICAgICpzaXplX291dCA9IG5ld19zaXplOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlY29kZV9jb250ZW50X2VuY29kaW5ncyAoR0FycmF5ICogZW5jb2RpbmdzKQoreworICBnaW50IGk7CisKKyAgaWYgKGVuY29kaW5ncyA9PSBOVUxMKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICBmb3IgKGkgPSAwOyBpIDwgZW5jb2RpbmdzLT5sZW47IGkrKykgeworICAgIEdzdE1hdHJvc2thVHJhY2tFbmNvZGluZyAqZW5jID0KKyAgICAgICAgJmdfYXJyYXlfaW5kZXggKGVuY29kaW5ncywgR3N0TWF0cm9za2FUcmFja0VuY29kaW5nLCBpKTsKKyAgICBncG9pbnRlciBkYXRhID0gTlVMTDsKKyAgICBnc2l6ZSBzaXplOworCisgICAgaWYgKChlbmMtPnNjb3BlICYgR1NUX01BVFJPU0tBX1RSQUNLX0VOQ09ESU5HX1NDT1BFX05FWFRfQ09OVEVOVF9FTkNPRElORykKKyAgICAgICAgPT0gMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogRW5jcnlwdGlvbiBub3Qgc3VwcG9ydGVkIHlldCAqLworICAgIGlmIChlbmMtPnR5cGUgIT0gMCkKKyAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKworICAgIGlmIChpICsgMSA+PSBlbmNvZGluZ3MtPmxlbikKKyAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKworICAgIGlmIChlbmMtPmNvbXBfc2V0dGluZ3NfbGVuZ3RoID09IDApCisgICAgICBjb250aW51ZTsKKworICAgIGRhdGEgPSBlbmMtPmNvbXBfc2V0dGluZ3M7CisgICAgc2l6ZSA9IGVuYy0+Y29tcF9zZXR0aW5nc19sZW5ndGg7CisKKyAgICBpZiAoIWdzdF9tYXRyb3NrYV9kZWNvbXByZXNzX2RhdGEgKGVuYywgJmRhdGEsICZzaXplLCBlbmMtPmNvbXBfYWxnbykpCisgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisKKyAgICBnX2ZyZWUgKGVuYy0+Y29tcF9zZXR0aW5ncyk7CisKKyAgICBlbmMtPmNvbXBfc2V0dGluZ3MgPSBkYXRhOworICAgIGVuYy0+Y29tcF9zZXR0aW5nc19sZW5ndGggPSBzaXplOworICB9CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitnYm9vbGVhbgorZ3N0X21hdHJvc2thX2RlY29kZV9kYXRhIChHQXJyYXkgKiBlbmNvZGluZ3MsIGdwb2ludGVyICogZGF0YV9vdXQsCisgICAgZ3NpemUgKiBzaXplX291dCwgR3N0TWF0cm9za2FUcmFja0VuY29kaW5nU2NvcGUgc2NvcGUsIGdib29sZWFuIGZyZWUpCit7CisgIGdwb2ludGVyIGRhdGE7CisgIGdzaXplIHNpemU7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIGdpbnQgaTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZW5jb2RpbmdzICE9IE5VTEwsIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGRhdGFfb3V0ICE9IE5VTEwgJiYgKmRhdGFfb3V0ICE9IE5VTEwsIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNpemVfb3V0ICE9IE5VTEwsIEZBTFNFKTsKKworICBkYXRhID0gKmRhdGFfb3V0OworICBzaXplID0gKnNpemVfb3V0OworCisgIGZvciAoaSA9IDA7IGkgPCBlbmNvZGluZ3MtPmxlbjsgaSsrKSB7CisgICAgR3N0TWF0cm9za2FUcmFja0VuY29kaW5nICplbmMgPQorICAgICAgICAmZ19hcnJheV9pbmRleCAoZW5jb2RpbmdzLCBHc3RNYXRyb3NrYVRyYWNrRW5jb2RpbmcsIGkpOworICAgIGdwb2ludGVyIG5ld19kYXRhID0gTlVMTDsKKyAgICBnc2l6ZSBuZXdfc2l6ZSA9IDA7CisKKyAgICBpZiAoKGVuYy0+c2NvcGUgJiBzY29wZSkgPT0gMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogRW5jcnlwdGlvbiBub3Qgc3VwcG9ydGVkIHlldCAqLworICAgIGlmIChlbmMtPnR5cGUgIT0gMCkgeworICAgICAgcmV0ID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBuZXdfZGF0YSA9IGRhdGE7CisgICAgbmV3X3NpemUgPSBzaXplOworCisgICAgcmV0ID0KKyAgICAgICAgZ3N0X21hdHJvc2thX2RlY29tcHJlc3NfZGF0YSAoZW5jLCAmbmV3X2RhdGEsICZuZXdfc2l6ZSwKKyAgICAgICAgZW5jLT5jb21wX2FsZ28pOworCisgICAgaWYgKCFyZXQpCisgICAgICBicmVhazsKKworICAgIGlmICgoZGF0YSA9PSAqZGF0YV9vdXQgJiYgZnJlZSkgfHwgKGRhdGEgIT0gKmRhdGFfb3V0KSkKKyAgICAgIGdfZnJlZSAoZGF0YSk7CisKKyAgICBkYXRhID0gbmV3X2RhdGE7CisgICAgc2l6ZSA9IG5ld19zaXplOworICB9CisKKyAgaWYgKCFyZXQpIHsKKyAgICBpZiAoKGRhdGEgPT0gKmRhdGFfb3V0ICYmIGZyZWUpIHx8IChkYXRhICE9ICpkYXRhX291dCkpCisgICAgICBnX2ZyZWUgKGRhdGEpOworCisgICAgKmRhdGFfb3V0ID0gTlVMTDsKKyAgICAqc2l6ZV9vdXQgPSAwOworICB9IGVsc2UgeworICAgICpkYXRhX291dCA9IGRhdGE7CisgICAgKnNpemVfb3V0ID0gc2l6ZTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnaW50Citnc3RfbWF0cm9za2FfaW5kZXhfY29tcGFyZSAoR3N0TWF0cm9za2FJbmRleCAqIGkxLCBHc3RNYXRyb3NrYUluZGV4ICogaTIpCit7CisgIGlmIChpMS0+dGltZSA8IGkyLT50aW1lKQorICAgIHJldHVybiAtMTsKKyAgZWxzZSBpZiAoaTEtPnRpbWUgPiBpMi0+dGltZSkKKyAgICByZXR1cm4gMTsKKyAgZWxzZSBpZiAoaTEtPmJsb2NrIDwgaTItPmJsb2NrKQorICAgIHJldHVybiAtMTsKKyAgZWxzZSBpZiAoaTEtPmJsb2NrID4gaTItPmJsb2NrKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK2dpbnQKK2dzdF9tYXRyb3NrYV9pbmRleF9zZWVrX2ZpbmQgKEdzdE1hdHJvc2thSW5kZXggKiBpMSwgR3N0Q2xvY2tUaW1lICogdGltZSwKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGlmIChpMS0+dGltZSA8ICp0aW1lKQorICAgIHJldHVybiAtMTsKKyAgZWxzZSBpZiAoaTEtPnRpbWUgPiAqdGltZSkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitHc3RNYXRyb3NrYUluZGV4ICoKK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9kb19pbmRleF9zZWVrIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiB0cmFjaywgZ2ludDY0IHNlZWtfcG9zLCBHQXJyYXkgKiogX2luZGV4LAorICAgIGdpbnQgKiBfZW50cnlfaW5kZXgsIEdzdFNlYXJjaE1vZGUgc25hcF9kaXIpCit7CisgIEdzdE1hdHJvc2thSW5kZXggKmVudHJ5ID0gTlVMTDsKKyAgR0FycmF5ICppbmRleDsKKworICAvKiBmaW5kIGVudHJ5IGp1c3QgYmVmb3JlIG9yIGF0IHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gKi8KKyAgaWYgKHRyYWNrICYmIHRyYWNrLT5pbmRleF90YWJsZSkKKyAgICBpbmRleCA9IHRyYWNrLT5pbmRleF90YWJsZTsKKyAgZWxzZQorICAgIGluZGV4ID0gY29tbW9uLT5pbmRleDsKKworICBpZiAoIWluZGV4IHx8ICFpbmRleC0+bGVuKQorICAgIHJldHVybiBOVUxMOworCisgIGVudHJ5ID0KKyAgICAgIGdzdF91dGlsX2FycmF5X2JpbmFyeV9zZWFyY2ggKGluZGV4LT5kYXRhLCBpbmRleC0+bGVuLAorICAgICAgc2l6ZW9mIChHc3RNYXRyb3NrYUluZGV4KSwKKyAgICAgIChHQ29tcGFyZURhdGFGdW5jKSBnc3RfbWF0cm9za2FfaW5kZXhfc2Vla19maW5kLCBzbmFwX2RpciwgJnNlZWtfcG9zLAorICAgICAgTlVMTCk7CisKKyAgaWYgKGVudHJ5ID09IE5VTEwpIHsKKyAgICBpZiAoc25hcF9kaXIgPT0gR1NUX1NFQVJDSF9NT0RFX0FGVEVSKSB7CisgICAgICAvKiBDYW4gb25seSBoYXBwZW4gd2l0aCBhIHJldmVyc2Ugc2VlayBwYXN0IHRoZSBlbmQgKi8KKyAgICAgIGVudHJ5ID0gJmdfYXJyYXlfaW5kZXggKGluZGV4LCBHc3RNYXRyb3NrYUluZGV4LCBpbmRleC0+bGVuIC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIENhbiBvbmx5IGhhcHBlbiB3aXRoIGEgZm9yd2FyZCBzZWVrIGJlZm9yZSB0aGUgc3RhcnQgKi8KKyAgICAgIGVudHJ5ID0gJmdfYXJyYXlfaW5kZXggKGluZGV4LCBHc3RNYXRyb3NrYUluZGV4LCAwKTsKKyAgICB9CisgIH0KKworICBpZiAoX2luZGV4KQorICAgICpfaW5kZXggPSBpbmRleDsKKyAgaWYgKF9lbnRyeV9pbmRleCkKKyAgICAqX2VudHJ5X2luZGV4ID0gZW50cnkgLSAoR3N0TWF0cm9za2FJbmRleCAqKSBpbmRleC0+ZGF0YTsKKworICByZXR1cm4gZW50cnk7Cit9CisKK3N0YXRpYyBnaW50Citnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fZW5jb2RpbmdfY21wIChHc3RNYXRyb3NrYVRyYWNrRW5jb2RpbmcgKiBhLAorICAgIEdzdE1hdHJvc2thVHJhY2tFbmNvZGluZyAqIGIpCit7CisgIGlmIChiLT5vcmRlciA+IGEtPm9yZGVyKQorICAgIHJldHVybiAxOworICBlbHNlIGlmIChiLT5vcmRlciA8IGEtPm9yZGVyKQorICAgIHJldHVybiAtMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9lbmNvZGluZ19vcmRlcl91bmlxdWUgKEdBcnJheSAqIGVuY29kaW5ncywgZ3VpbnQ2NAorICAgIG9yZGVyKQoreworICBnaW50IGk7CisKKyAgaWYgKGVuY29kaW5ncyA9PSBOVUxMIHx8IGVuY29kaW5ncy0+bGVuID09IDApCisgICAgcmV0dXJuIFRSVUU7CisKKyAgZm9yIChpID0gMDsgaSA8IGVuY29kaW5ncy0+bGVuOyBpKyspCisgICAgaWYgKGdfYXJyYXlfaW5kZXggKGVuY29kaW5ncywgR3N0TWF0cm9za2FUcmFja0VuY29kaW5nLCBpKS5vcmRlciA9PSBvcmRlcikKKyAgICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogdGFrZXMgb3duZXJzaGlwIG9mIHRhZ2xpc3QgKi8KK3ZvaWQKK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9mb3VuZF9nbG9iYWxfdGFnIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0RWxlbWVudCAqIGVsLCBHc3RUYWdMaXN0ICogdGFnbGlzdCkKK3sKKyAgaWYgKGNvbW1vbi0+Z2xvYmFsX3RhZ3MpIHsKKyAgICBnc3RfdGFnX2xpc3RfaW5zZXJ0IChjb21tb24tPmdsb2JhbF90YWdzLCB0YWdsaXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCk7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdsaXN0KTsKKyAgfSBlbHNlIHsKKyAgICBjb21tb24tPmdsb2JhbF90YWdzID0gdGFnbGlzdDsKKyAgfQorICBjb21tb24tPmdsb2JhbF90YWdzX2NoYW5nZWQgPSBUUlVFOworfQorCitnaW50NjQKK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9nZXRfbGVuZ3RoIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24pCit7CisgIGdpbnQ2NCBlbmQgPSAtMTsKKworICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeV9kdXJhdGlvbiAoY29tbW9uLT5zaW5rcGFkLCBHU1RfRk9STUFUX0JZVEVTLAorICAgICAgICAgICZlbmQpIHx8IGVuZCA8IDApCisgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAibm8gdXBzdHJlYW0gbGVuZ3RoIik7CisKKyAgcmV0dXJuIGVuZDsKK30KKworLyogZGV0ZXJtaW5lIHRyYWNrIHRvIHNlZWsgaW4gKi8KK0dzdE1hdHJvc2thVHJhY2tDb250ZXh0ICoKK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9nZXRfc2Vla190cmFjayAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLAorICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICogdHJhY2spCit7CisgIGdpbnQgaTsKKworICBpZiAodHJhY2sgJiYgdHJhY2stPnR5cGUgPT0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfVklERU8pCisgICAgcmV0dXJuIHRyYWNrOworCisgIGZvciAoaSA9IDA7IGkgPCBjb21tb24tPnNyYy0+bGVuOyBpKyspIHsKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqc3RyZWFtOworCisgICAgc3RyZWFtID0gZ19wdHJfYXJyYXlfaW5kZXggKGNvbW1vbi0+c3JjLCBpKTsKKyAgICBpZiAoc3RyZWFtLT50eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1ZJREVPICYmIHN0cmVhbS0+aW5kZXhfdGFibGUpCisgICAgICB0cmFjayA9IHN0cmVhbTsKKyAgfQorCisgIHJldHVybiB0cmFjazsKK30KKworLyogc2tpcCB1bmtub3duIG9yIGFsaWtlIGVsZW1lbnQgKi8KK0dzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sLCBjb25zdCBnY2hhciAqIHBhcmVudF9uYW1lLCBndWludCBpZCkKK3sKKyAgaWYgKGlkID09IEdTVF9FQk1MX0lEX1ZPSUQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJTa2lwcGluZyBFQk1MIFZvaWQgZWxlbWVudCIpOworICB9IGVsc2UgaWYgKGlkID09IEdTVF9FQk1MX0lEX0NSQzMyKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiU2tpcHBpbmcgRUJNTCBDUkMzMiBlbGVtZW50Iik7CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsCisgICAgICAgICJVbmtub3duICVzIHN1YmVsZW1lbnQgMHgleCAtIGlnbm9yaW5nIiwgcGFyZW50X25hbWUsIGlkKTsKKyAgfQorCisgIHJldHVybiBnc3RfZWJtbF9yZWFkX3NraXAgKGVibWwpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX2F0dGFjaGVkX2ZpbGUgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGNvbW1vbiwKKyAgICBHc3RFYm1sUmVhZCAqIGVibWwsIEdzdFRhZ0xpc3QgKiB0YWdsaXN0KQoreworICBndWludDMyIGlkOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ2NoYXIgKmRlc2NyaXB0aW9uID0gTlVMTDsKKyAgZ2NoYXIgKmZpbGVuYW1lID0gTlVMTDsKKyAgZ2NoYXIgKm1pbWV0eXBlID0gTlVMTDsKKyAgZ3VpbnQ4ICpkYXRhID0gTlVMTDsKKyAgZ3VpbnQ2NCBkYXRhbGVuID0gMDsKKworICBERUJVR19FTEVNRU5UX1NUQVJUIChjb21tb24sIGVibWwsICJBdHRhY2hlZEZpbGUiKTsKKworICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfbWFzdGVyIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykgeworICAgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiQXR0YWNoZWRGaWxlIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSyAmJiBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgLyogcmVhZCBhbGwgc3ViLWVudHJpZXMgKi8KKworICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0ZJTEVERVNDUklQVElPTjoKKyAgICAgICAgaWYgKGRlc2NyaXB0aW9uKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsCisgICAgICAgICAgICAgICJGaWxlRGVzY3JpcHRpb24gY2FuIG9ubHkgYXBwZWFyIG9uY2UiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfdXRmOCAoZWJtbCwgJmlkLCAmZGVzY3JpcHRpb24pOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJGaWxlRGVzY3JpcHRpb246ICVzIiwKKyAgICAgICAgICAgIEdTVF9TVFJfTlVMTCAoZGVzY3JpcHRpb24pKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9GSUxFTkFNRToKKyAgICAgICAgaWYgKGZpbGVuYW1lKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJGaWxlTmFtZSBjYW4gb25seSBhcHBlYXIgb25jZSIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF91dGY4IChlYm1sLCAmaWQsICZmaWxlbmFtZSk7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiRmlsZU5hbWU6ICVzIiwKKyAgICAgICAgICAgIEdTVF9TVFJfTlVMTCAoZmlsZW5hbWUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9GSUxFTUlNRVRZUEU6CisgICAgICAgIGlmIChtaW1ldHlwZSkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAgICAgICAiRmlsZU1pbWVUeXBlIGNhbiBvbmx5IGFwcGVhciBvbmNlIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBnc3RfZWJtbF9yZWFkX2FzY2lpIChlYm1sLCAmaWQsICZtaW1ldHlwZSk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIkZpbGVNaW1lVHlwZTogJXMiLAorICAgICAgICAgICAgR1NUX1NUUl9OVUxMIChtaW1ldHlwZSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0ZJTEVEQVRBOgorICAgICAgICBpZiAoZGF0YSkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiRmlsZURhdGEgY2FuIG9ubHkgYXBwZWFyIG9uY2UiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfYmluYXJ5IChlYm1sLCAmaWQsICZkYXRhLCAmZGF0YWxlbik7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgICAgICJGaWxlRGF0YSBvZiBzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQsIGRhdGFsZW4pOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX3NraXAgKGNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICJBdHRhY2hlZEZpbGUiLCBpZCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfRklMRVVJRDoKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9za2lwIChlYm1sKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJBdHRhY2hlZEZpbGUiLCByZXQpOworCisgIGlmIChmaWxlbmFtZSAmJiBtaW1ldHlwZSAmJiBkYXRhICYmIGRhdGFsZW4gPiAwKSB7CisgICAgR3N0VGFnSW1hZ2VUeXBlIGltYWdlX3R5cGUgPSBHU1RfVEFHX0lNQUdFX1RZUEVfTk9ORTsKKyAgICBHc3RCdWZmZXIgKnRhZ2J1ZmZlciA9IE5VTEw7CisgICAgR3N0U2FtcGxlICp0YWdzYW1wbGUgPSBOVUxMOworICAgIEdzdFN0cnVjdHVyZSAqaW5mbyA9IE5VTEw7CisgICAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisgICAgZ2NoYXIgKmZpbGVuYW1lX2xjID0gZ191dGY4X3N0cmRvd24gKGZpbGVuYW1lLCAtMSk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJDcmVhdGluZyB0YWcgZm9yIGF0dGFjaG1lbnQgd2l0aCAiCisgICAgICAgICJmaWxlbmFtZSAnJXMnLCBtaW1ldHlwZSAnJXMnLCBkZXNjcmlwdGlvbiAnJXMnLCAiCisgICAgICAgICJzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQsIGZpbGVuYW1lLCBtaW1ldHlwZSwKKyAgICAgICAgR1NUX1NUUl9OVUxMIChkZXNjcmlwdGlvbiksIGRhdGFsZW4pOworCisgICAgLyogVE9ETzogYmV0dGVyIGhldXJpc3RpY3MgZm9yIGRpZmZlcmVudCBpbWFnZSB0eXBlcyAqLworICAgIGlmIChzdHJzdHIgKGZpbGVuYW1lX2xjLCAiY292ZXIiKSkgeworICAgICAgaWYgKHN0cnN0ciAoZmlsZW5hbWVfbGMsICJiYWNrIikpCisgICAgICAgIGltYWdlX3R5cGUgPSBHU1RfVEFHX0lNQUdFX1RZUEVfQkFDS19DT1ZFUjsKKyAgICAgIGVsc2UKKyAgICAgICAgaW1hZ2VfdHlwZSA9IEdTVF9UQUdfSU1BR0VfVFlQRV9GUk9OVF9DT1ZFUjsKKyAgICB9IGVsc2UgaWYgKGdfc3RyX2hhc19wcmVmaXggKG1pbWV0eXBlLCAiaW1hZ2UvIikgfHwKKyAgICAgICAgZ19zdHJfaGFzX3N1ZmZpeCAoZmlsZW5hbWVfbGMsICJwbmciKSB8fAorICAgICAgICBnX3N0cl9oYXNfc3VmZml4IChmaWxlbmFtZV9sYywgImpwZyIpIHx8CisgICAgICAgIGdfc3RyX2hhc19zdWZmaXggKGZpbGVuYW1lX2xjLCAianBlZyIpIHx8CisgICAgICAgIGdfc3RyX2hhc19zdWZmaXggKGZpbGVuYW1lX2xjLCAiZ2lmIikgfHwKKyAgICAgICAgZ19zdHJfaGFzX3N1ZmZpeCAoZmlsZW5hbWVfbGMsICJibXAiKSkgeworICAgICAgaW1hZ2VfdHlwZSA9IEdTVF9UQUdfSU1BR0VfVFlQRV9VTkRFRklORUQ7CisgICAgfQorICAgIGdfZnJlZSAoZmlsZW5hbWVfbGMpOworCisgICAgLyogRmlyc3QgdHJ5IHRvIGNyZWF0ZSBhbiBpbWFnZSB0YWcgYnVmZmVyIGZyb20gdGhpcyAqLworICAgIGlmIChpbWFnZV90eXBlICE9IEdTVF9UQUdfSU1BR0VfVFlQRV9OT05FKSB7CisgICAgICB0YWdzYW1wbGUgPQorICAgICAgICAgIGdzdF90YWdfaW1hZ2VfZGF0YV90b19pbWFnZV9zYW1wbGUgKGRhdGEsIGRhdGFsZW4sIGltYWdlX3R5cGUpOworCisgICAgICBpZiAoIXRhZ3NhbXBsZSkgeworICAgICAgICBpbWFnZV90eXBlID0gR1NUX1RBR19JTUFHRV9UWVBFX05PTkU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0YWdidWZmZXIgPSBnc3RfYnVmZmVyX3JlZiAoZ3N0X3NhbXBsZV9nZXRfYnVmZmVyICh0YWdzYW1wbGUpKTsKKyAgICAgICAgY2FwcyA9IGdzdF9jYXBzX3JlZiAoZ3N0X3NhbXBsZV9nZXRfY2FwcyAodGFnc2FtcGxlKSk7CisgICAgICAgIGluZm8gPSBnc3Rfc3RydWN0dXJlX2NvcHkgKGdzdF9zYW1wbGVfZ2V0X2luZm8gKHRhZ3NhbXBsZSkpOworICAgICAgICBnc3Rfc2FtcGxlX3VucmVmICh0YWdzYW1wbGUpOworICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIHRoaXMgZmFpbGVkIGNyZWF0ZSBhbiBhdHRhY2htZW50IGJ1ZmZlciAqLworICAgIGlmICghdGFnYnVmZmVyKSB7CisgICAgICB0YWdidWZmZXIgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChnX21lbWR1cCAoZGF0YSwgZGF0YWxlbiksIGRhdGFsZW4pOworCisgICAgICBjYXBzID0gZ3N0X3R5cGVfZmluZF9oZWxwZXJfZm9yX2J1ZmZlciAoTlVMTCwgdGFnYnVmZmVyLCBOVUxMKTsKKyAgICAgIGlmIChjYXBzID09IE5VTEwpCisgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlIChtaW1ldHlwZSk7CisgICAgfQorCisgICAgLyogU2V0IGZpbGVuYW1lIGFuZCBkZXNjcmlwdGlvbiBpbiB0aGUgaW5mbyAqLworICAgIGlmIChpbmZvID09IE5VTEwpCisgICAgICBpbmZvID0gZ3N0X3N0cnVjdHVyZV9uZXdfZW1wdHkgKCJHc3RUYWdJbWFnZUluZm8iKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChpbmZvLCAiZmlsZW5hbWUiLCBHX1RZUEVfU1RSSU5HLCBmaWxlbmFtZSwgTlVMTCk7CisgICAgaWYgKGRlc2NyaXB0aW9uKQorICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKGluZm8sICJkZXNjcmlwdGlvbiIsIEdfVFlQRV9TVFJJTkcsIGRlc2NyaXB0aW9uLCBOVUxMKTsKKworICAgIHRhZ3NhbXBsZSA9IGdzdF9zYW1wbGVfbmV3ICh0YWdidWZmZXIsIGNhcHMsIE5VTEwsIGluZm8pOworCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAodGFnYnVmZmVyKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsCisgICAgICAgICJDcmVhdGVkIGF0dGFjaG1lbnQgc2FtcGxlOiAlIiBHU1RfUFRSX0ZPUk1BVCwgdGFnc2FtcGxlKTsKKworICAgIC8qIGFuZCBhcHBlbmQgdG8gdGhlIHRhZyBsaXN0ICovCisgICAgaWYgKGltYWdlX3R5cGUgIT0gR1NUX1RBR19JTUFHRV9UWVBFX05PTkUpCisgICAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdsaXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwgR1NUX1RBR19JTUFHRSwgdGFnc2FtcGxlLAorICAgICAgICAgIE5VTEwpOworICAgIGVsc2UKKyAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELCBHU1RfVEFHX0FUVEFDSE1FTlQsCisgICAgICAgICAgdGFnc2FtcGxlLCBOVUxMKTsKKworICAgIC8qIHRoZSBsaXN0IGFkZHMgaXQgb3duIHJlZiAqLworICAgIGdzdF9zYW1wbGVfdW5yZWYgKHRhZ3NhbXBsZSk7CisgIH0KKworICBnX2ZyZWUgKGZpbGVuYW1lKTsKKyAgZ19mcmVlIChtaW1ldHlwZSk7CisgIGdfZnJlZSAoZGF0YSk7CisgIGdfZnJlZSAoZGVzY3JpcHRpb24pOworCisgIHJldHVybiByZXQ7Cit9CisKK0dzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9hdHRhY2htZW50cyAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLAorICAgIEdzdEVsZW1lbnQgKiBlbCwgR3N0RWJtbFJlYWQgKiBlYm1sKQoreworICBndWludDMyIGlkOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RUYWdMaXN0ICp0YWdsaXN0OworCisgIERFQlVHX0VMRU1FTlRfU1RBUlQgKGNvbW1vbiwgZWJtbCwgIkF0dGFjaG1lbnRzIik7CisKKyAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICBERUJVR19FTEVNRU5UX1NUT1AgKGNvbW1vbiwgZWJtbCwgIkF0dGFjaG1lbnRzIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgdGFnbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIGdzdF90YWdfbGlzdF9zZXRfc2NvcGUgKHRhZ2xpc3QsIEdTVF9UQUdfU0NPUEVfR0xPQkFMKTsKKworICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmIGdzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoZWJtbCwgMSwgVFJVRSkpIHsKKyAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3BlZWtfaWQgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9BVFRBQ0hFREZJTEU6CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9hdHRhY2hlZF9maWxlIChjb21tb24sIGVibWwsCisgICAgICAgICAgICB0YWdsaXN0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwIChjb21tb24sIGVibWwsCisgICAgICAgICAgICAiQXR0YWNobWVudHMiLCBpZCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBERUJVR19FTEVNRU5UX1NUT1AgKGNvbW1vbiwgZWJtbCwgIkF0dGFjaG1lbnRzIiwgcmV0KTsKKworICBpZiAoZ3N0X3RhZ19saXN0X25fdGFncyAodGFnbGlzdCkgPiAwKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiU3RvcmluZyBhdHRhY2htZW50IHRhZ3MiKTsKKyAgICBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fZm91bmRfZ2xvYmFsX3RhZyAoY29tbW9uLCBlbCwgdGFnbGlzdCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiTm8gdmFsaWQgYXR0YWNobWVudHMgZm91bmQiKTsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ2xpc3QpOworICB9CisKKyAgY29tbW9uLT5hdHRhY2htZW50c19wYXJzZWQgPSBUUlVFOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfdG9jX3RhZyAoR3N0VG9jRW50cnkgKiBlbnRyeSwKKyAgICBHc3RUb2NFbnRyeSAqIGludGVybmFsX2VudHJ5LCBHQXJyYXkgKiBlZGl0aW9uX3RhcmdldHMsCisgICAgR0FycmF5ICogY2hhcHRlcl90YXJnZXRzLCBHc3RUYWdMaXN0ICogdGFncykKK3sKKyAgZ2NoYXIgKnVpZDsKKyAgZ3VpbnQgaTsKKyAgZ3VpbnQ2NCB0Z3Q7CisgIEdBcnJheSAqdGFyZ2V0czsKKyAgR0xpc3QgKmN1ciwgKmludGVybmFsX2N1cjsKKyAgR3N0VGFnTGlzdCAqZXRhZ3M7CisKKyAgdGFyZ2V0cyA9CisgICAgICAoZ3N0X3RvY19lbnRyeV9nZXRfZW50cnlfdHlwZSAoZW50cnkpID09CisgICAgICBHU1RfVE9DX0VOVFJZX1RZUEVfRURJVElPTikgPyBlZGl0aW9uX3RhcmdldHMgOiBjaGFwdGVyX3RhcmdldHM7CisKKyAgZXRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgIGZvciAoaSA9IDA7IGkgPCB0YXJnZXRzLT5sZW47ICsraSkgeworICAgIHRndCA9IGdfYXJyYXlfaW5kZXggKHRhcmdldHMsIGd1aW50NjQsIGkpOworCisgICAgaWYgKHRndCA9PSAwKQorICAgICAgZ3N0X3RhZ19saXN0X2luc2VydCAoZXRhZ3MsIHRhZ3MsIEdTVF9UQUdfTUVSR0VfQVBQRU5EKTsKKyAgICBlbHNlIHsKKyAgICAgIHVpZCA9IGdfc3RyZHVwX3ByaW50ZiAoIiUiIEdfR1VJTlQ2NF9GT1JNQVQsIHRndCk7CisgICAgICBpZiAoZ19zdHJjbXAwIChnc3RfdG9jX2VudHJ5X2dldF91aWQgKGludGVybmFsX2VudHJ5KSwgdWlkKSA9PSAwKQorICAgICAgICBnc3RfdGFnX2xpc3RfaW5zZXJ0IChldGFncywgdGFncywgR1NUX1RBR19NRVJHRV9BUFBFTkQpOworICAgICAgZ19mcmVlICh1aWQpOworICAgIH0KKyAgfQorCisgIGdzdF90b2NfZW50cnlfbWVyZ2VfdGFncyAoZW50cnksIGV0YWdzLCBHU1RfVEFHX01FUkdFX0FQUEVORCk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAoZXRhZ3MpOworCisgIGN1ciA9IGdzdF90b2NfZW50cnlfZ2V0X3N1Yl9lbnRyaWVzIChlbnRyeSk7CisgIGludGVybmFsX2N1ciA9IGdzdF90b2NfZW50cnlfZ2V0X3N1Yl9lbnRyaWVzIChpbnRlcm5hbF9lbnRyeSk7CisgIHdoaWxlIChjdXIgIT0gTlVMTCAmJiBpbnRlcm5hbF9jdXIgIT0gTlVMTCkgeworICAgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV90b2NfdGFnIChjdXItPmRhdGEsIGludGVybmFsX2N1ci0+ZGF0YSwKKyAgICAgICAgZWRpdGlvbl90YXJnZXRzLCBjaGFwdGVyX3RhcmdldHMsIHRhZ3MpOworICAgIGN1ciA9IGN1ci0+bmV4dDsKKyAgICBpbnRlcm5hbF9jdXIgPSBpbnRlcm5hbF9jdXItPm5leHQ7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9tZXRhZGF0YV90YXJnZXRzIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sLCBHQXJyYXkgKiBlZGl0aW9uX3RhcmdldHMsIEdBcnJheSAqIGNoYXB0ZXJfdGFyZ2V0cywKKyAgICBHQXJyYXkgKiB0cmFja190YXJnZXRzLCBndWludDY0ICogdGFyZ2V0X3R5cGVfdmFsdWUsIGdjaGFyICoqIHRhcmdldF90eXBlKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludDMyIGlkOworICBndWludDY0IHVpZDsKKyAgZ3VpbnQ2NCB0bXA7CisgIGdjaGFyICpzdHI7CisKKyAgREVCVUdfRUxFTUVOVF9TVEFSVCAoY29tbW9uLCBlYm1sLCAiVGFnVGFyZ2V0cyIpOworCisgICp0YXJnZXRfdHlwZV92YWx1ZSA9IDUwOworICAqdGFyZ2V0X3R5cGUgPSBOVUxMOworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJUYWdUYXJnZXRzIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSyAmJiBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworCisgICAgc3dpdGNoIChpZCkgeworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVEFSR0VUQ0hBUFRFUlVJRDoKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJnVpZCkpID09IEdTVF9GTE9XX09LKQorICAgICAgICAgIGdfYXJyYXlfYXBwZW5kX3ZhbCAoY2hhcHRlcl90YXJnZXRzLCB1aWQpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVEFSR0VURURJVElPTlVJRDoKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJnVpZCkpID09IEdTVF9GTE9XX09LKQorICAgICAgICAgIGdfYXJyYXlfYXBwZW5kX3ZhbCAoZWRpdGlvbl90YXJnZXRzLCB1aWQpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVEFSR0VUVFJBQ0tVSUQ6CisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZ1aWQpKSA9PSBHU1RfRkxPV19PSykKKyAgICAgICAgICBnX2FycmF5X2FwcGVuZF92YWwgKHRyYWNrX3RhcmdldHMsIHVpZCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UQVJHRVRUWVBFVkFMVUU6CisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZ0bXApKSA9PSBHU1RfRkxPV19PSykKKyAgICAgICAgICAqdGFyZ2V0X3R5cGVfdmFsdWUgPSB0bXA7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UQVJHRVRUWVBFOgorICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfYXNjaWkgKGVibWwsICZpZCwgJnN0cikpID09IEdTVF9GTE9XX09LKSB7CisgICAgICAgICAgZ19mcmVlICgqdGFyZ2V0X3R5cGUpOworICAgICAgICAgICp0YXJnZXRfdHlwZSA9IHN0cjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0KKyAgICAgICAgICAgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwIChjb21tb24sIGVibWwsICJUYWdUYXJnZXRzIiwKKyAgICAgICAgICAgIGlkKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJUYWdUYXJnZXRzIiwgcmV0KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3Bvc3Rwcm9jZXNzX3RvY19lbnRyaWVzIChHTGlzdCAqIHRvY19lbnRyaWVzLAorICAgIGd1aW50NjQgbWF4LCBjb25zdCBnY2hhciAqIHBhcmVudF91aWQpCit7CisgIEdzdFRvY0VudHJ5ICpjdXJfaW5mbywgKnByZXZfaW5mbywgKm5leHRfaW5mbzsKKyAgR0xpc3QgKmN1cl9saXN0LCAqcHJldl9saXN0LCAqbmV4dF9saXN0OworICBnaW50NjQgY3VyX3N0YXJ0LCBwcmV2X3N0YXJ0LCBzdG9wOworCisgIGN1cl9saXN0ID0gdG9jX2VudHJpZXM7CisgIHdoaWxlIChjdXJfbGlzdCAhPSBOVUxMKSB7CisgICAgY3VyX2luZm8gPSBjdXJfbGlzdC0+ZGF0YTsKKworICAgIHN3aXRjaCAoZ3N0X3RvY19lbnRyeV9nZXRfZW50cnlfdHlwZSAoY3VyX2luZm8pKSB7CisgICAgICBjYXNlIEdTVF9UT0NfRU5UUllfVFlQRV9BTkdMRToKKyAgICAgIGNhc2UgR1NUX1RPQ19FTlRSWV9UWVBFX1ZFUlNJT046CisgICAgICBjYXNlIEdTVF9UT0NfRU5UUllfVFlQRV9FRElUSU9OOgorICAgICAgICAvKiBpbiBNYXRyb3NrYSB0ZXJtcyBlZGl0aW9uIGhhcyBkdXJhdGlvbiBvZiBmdWxsIHRyYWNrICovCisgICAgICAgIGdzdF90b2NfZW50cnlfc2V0X3N0YXJ0X3N0b3BfdGltZXMgKGN1cl9pbmZvLCAwLCBtYXgpOworCisgICAgICAgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wb3N0cHJvY2Vzc190b2NfZW50cmllcworICAgICAgICAgICAgKGdzdF90b2NfZW50cnlfZ2V0X3N1Yl9lbnRyaWVzIChjdXJfaW5mbyksIG1heCwKKyAgICAgICAgICAgIGdzdF90b2NfZW50cnlfZ2V0X3VpZCAoY3VyX2luZm8pKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgR1NUX1RPQ19FTlRSWV9UWVBFX1RJVExFOgorICAgICAgY2FzZSBHU1RfVE9DX0VOVFJZX1RZUEVfVFJBQ0s6CisgICAgICBjYXNlIEdTVF9UT0NfRU5UUllfVFlQRV9DSEFQVEVSOgorICAgICAgICBwcmV2X2xpc3QgPSBjdXJfbGlzdC0+cHJldjsKKyAgICAgICAgbmV4dF9saXN0ID0gY3VyX2xpc3QtPm5leHQ7CisKKyAgICAgICAgaWYgKHByZXZfbGlzdCAhPSBOVUxMKQorICAgICAgICAgIHByZXZfaW5mbyA9IHByZXZfbGlzdC0+ZGF0YTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHByZXZfaW5mbyA9IE5VTEw7CisKKyAgICAgICAgaWYgKG5leHRfbGlzdCAhPSBOVUxMKQorICAgICAgICAgIG5leHRfaW5mbyA9IG5leHRfbGlzdC0+ZGF0YTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG5leHRfaW5mbyA9IE5VTEw7CisKKyAgICAgICAgLyogdXBkYXRlZCBzdG9wIHRpbWUgaW4gcHJldmlvdXMgY2hhcHRlciBhbmQgaXQncyBzdWJjaGFwdGVycyAqLworICAgICAgICBpZiAocHJldl9pbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICBnc3RfdG9jX2VudHJ5X2dldF9zdGFydF9zdG9wX3RpbWVzIChwcmV2X2luZm8sICZwcmV2X3N0YXJ0LCAmc3RvcCk7CisgICAgICAgICAgZ3N0X3RvY19lbnRyeV9nZXRfc3RhcnRfc3RvcF90aW1lcyAoY3VyX2luZm8sICZjdXJfc3RhcnQsICZzdG9wKTsKKworICAgICAgICAgIHN0b3AgPSBjdXJfc3RhcnQ7CisgICAgICAgICAgZ3N0X3RvY19lbnRyeV9zZXRfc3RhcnRfc3RvcF90aW1lcyAocHJldl9pbmZvLCBwcmV2X3N0YXJ0LCBzdG9wKTsKKworICAgICAgICAgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wb3N0cHJvY2Vzc190b2NfZW50cmllcworICAgICAgICAgICAgICAoZ3N0X3RvY19lbnRyeV9nZXRfc3ViX2VudHJpZXMgKHByZXZfaW5mbyksIGN1cl9zdGFydCwKKyAgICAgICAgICAgICAgZ3N0X3RvY19lbnRyeV9nZXRfdWlkIChwcmV2X2luZm8pKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHVwZGF0ZWQgc3RvcCB0aW1lIGluIGN1cnJlbnQgY2hhcHRlciBhbmQgaXQncyBzdWJjaGFwdGVycyAqLworICAgICAgICBpZiAobmV4dF9pbmZvID09IE5VTEwpIHsKKyAgICAgICAgICBnc3RfdG9jX2VudHJ5X2dldF9zdGFydF9zdG9wX3RpbWVzIChjdXJfaW5mbywgJmN1cl9zdGFydCwgJnN0b3ApOworCisgICAgICAgICAgaWYgKHN0b3AgPT0gLTEpIHsKKyAgICAgICAgICAgIHN0b3AgPSBtYXg7CisgICAgICAgICAgICBnc3RfdG9jX2VudHJ5X3NldF9zdGFydF9zdG9wX3RpbWVzIChjdXJfaW5mbywgY3VyX3N0YXJ0LCBzdG9wKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcG9zdHByb2Nlc3NfdG9jX2VudHJpZXMKKyAgICAgICAgICAgICAgKGdzdF90b2NfZW50cnlfZ2V0X3N1Yl9lbnRyaWVzIChjdXJfaW5mbyksIHN0b3AsCisgICAgICAgICAgICAgIGdzdF90b2NfZW50cnlfZ2V0X3VpZCAoY3VyX2luZm8pKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1RPQ19FTlRSWV9UWVBFX0lOVkFMSUQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjdXJfbGlzdCA9IGN1cl9saXN0LT5uZXh0OworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfY2hhcHRlcl90aXRsZXMgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGNvbW1vbiwKKyAgICBHc3RFYm1sUmVhZCAqIGVibWwsIEdzdFRhZ0xpc3QgKiB0aXRsZXMpCit7CisgIGd1aW50MzIgaWQ7CisgIGdjaGFyICp0aXRsZSA9IE5VTEw7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgREVCVUdfRUxFTUVOVF9TVEFSVCAoY29tbW9uLCBlYm1sLCAiQ2hhcHRlcnNUaXRsZXMiKTsKKworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJDaGFwdGVyc1RpdGxlcyIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NIQVBTVFJJTkc6CisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfdXRmOCAoZWJtbCwgJmlkLCAmdGl0bGUpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0KKyAgICAgICAgICAgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwIChjb21tb24sIGVibWwsICJDaGFwdGVyc1RpdGxlcyIsCisgICAgICAgICAgICBpZCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiQ2hhcHRlcnNUaXRsZXMiLCByZXQpOworCisgIGlmICh0aXRsZSAhPSBOVUxMICYmIHJldCA9PSBHU1RfRkxPV19PSykKKyAgICBnc3RfdGFnX2xpc3RfYWRkICh0aXRsZXMsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELCBHU1RfVEFHX1RJVExFLCB0aXRsZSwgTlVMTCk7CisKKyAgZ19mcmVlICh0aXRsZSk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfY2hhcHRlcl9lbGVtZW50IChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sLCBHTGlzdCAqKiBzdWJlbnRyaWVzLCBHTGlzdCAqKiBpbnRlcm5hbF9zdWJlbnRyaWVzKQoreworICBndWludDMyIGlkOworICBndWludDY0IHN0YXJ0X3RpbWUgPSAtMSwgc3RvcF90aW1lID0gLTE7CisgIGd1aW50NjQgaXNfaGlkZGVuID0gMCwgaXNfZW5hYmxlZCA9IDEsIHVpZCA9IDA7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdFRvY0VudHJ5ICpjaGFwdGVyX2luZm8sICppbnRlcm5hbF9jaGFwdGVyX2luZm87CisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisgIGdjaGFyICp1aWRfc3RyLCAqc3RyaW5nX3VpZCA9IE5VTEw7CisgIEdMaXN0ICpzdWJzdWJlbnRyaWVzID0gTlVMTCwgKmludGVybmFsX3N1YnN1YmVudHJpZXMgPSBOVUxMLCAqbCwgKmlsOworCisgIERFQlVHX0VMRU1FTlRfU1RBUlQgKGNvbW1vbiwgZWJtbCwgIkNoYXB0ZXJzRWxlbWVudCIpOworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJDaGFwdGVyc0VsZW1lbnQiLCByZXQpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICB0YWdzID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKworICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmIGdzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoZWJtbCwgMSwgVFJVRSkpIHsKKyAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3BlZWtfaWQgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSVUlEOgorICAgICAgICByZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJnVpZCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSU1RSSU5HVUlEOgorICAgICAgICByZXQgPSBnc3RfZWJtbF9yZWFkX3V0ZjggKGVibWwsICZpZCwgJnN0cmluZ191aWQpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUlRJTUVTVEFSVDoKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZzdGFydF90aW1lKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJUSU1FU1RPUDoKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZzdG9wX3RpbWUpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUkFUT006CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9jaGFwdGVyX2VsZW1lbnQgKGNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICZzdWJzdWJlbnRyaWVzLCAmaW50ZXJuYWxfc3Vic3ViZW50cmllcyk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSRElTUExBWToKKyAgICAgICAgcmV0ID0KKyAgICAgICAgICAgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9jaGFwdGVyX3RpdGxlcyAoY29tbW9uLCBlYm1sLCB0YWdzKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJGTEFHSElEREVOOgorICAgICAgICByZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJmlzX2hpZGRlbik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSRkxBR0VOQUJMRUQ6CisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmaXNfZW5hYmxlZCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXQgPQorICAgICAgICAgICAgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX3NraXAgKGNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICJDaGFwdGVyc0VsZW1lbnQiLCBpZCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmICh1aWQgPT0gMCkKKyAgICB1aWQgPSAoKChndWludDY0KSBnX3JhbmRvbV9pbnQgKCkpIDw8IDMyKSB8IGdfcmFuZG9tX2ludCAoKTsKKyAgdWlkX3N0ciA9IGdfc3RyZHVwX3ByaW50ZiAoIiUiIEdfR1VJTlQ2NF9GT1JNQVQsIHVpZCk7CisgIGlmIChzdHJpbmdfdWlkICE9IE5VTEwpIHsKKyAgICAvKiBpbml0IHRvYyB3aXRoIHByb3ZpZGVkIFN0cmluZyBVSUQgKi8KKyAgICBjaGFwdGVyX2luZm8gPSBnc3RfdG9jX2VudHJ5X25ldyAoR1NUX1RPQ19FTlRSWV9UWVBFX0NIQVBURVIsIHN0cmluZ191aWQpOworICAgIGdfZnJlZSAoc3RyaW5nX3VpZCk7CisgIH0gZWxzZSB7CisgICAgLyogTm8gU3RyaW5nIFVJRCBwcm92aWRlZCA9PiB1c2UgdGhlIGludGVybmFsIFVJRCBpbnN0ZWFkICovCisgICAgY2hhcHRlcl9pbmZvID0gZ3N0X3RvY19lbnRyeV9uZXcgKEdTVF9UT0NfRU5UUllfVFlQRV9DSEFQVEVSLCB1aWRfc3RyKTsKKyAgfQorICAvKiBpbml0IGludGVybmFsIHRvYyB3aXRoIGludGVybmFsIFVJRCAqLworICBpbnRlcm5hbF9jaGFwdGVyX2luZm8gPSBnc3RfdG9jX2VudHJ5X25ldyAoR1NUX1RPQ19FTlRSWV9UWVBFX0NIQVBURVIsCisgICAgICB1aWRfc3RyKTsKKyAgZ19mcmVlICh1aWRfc3RyKTsKKworICBnc3RfdG9jX2VudHJ5X3NldF90YWdzIChjaGFwdGVyX2luZm8sIHRhZ3MpOworICBnc3RfdG9jX2VudHJ5X3NldF9zdGFydF9zdG9wX3RpbWVzIChjaGFwdGVyX2luZm8sIHN0YXJ0X3RpbWUsIHN0b3BfdGltZSk7CisKKyAgZm9yIChsID0gc3Vic3ViZW50cmllcywgaWwgPSBpbnRlcm5hbF9zdWJzdWJlbnRyaWVzOworICAgICAgbCAmJiBpbDsgbCA9IGwtPm5leHQsIGlsID0gaWwtPm5leHQpIHsKKyAgICBnc3RfdG9jX2VudHJ5X2FwcGVuZF9zdWJfZW50cnkgKGNoYXB0ZXJfaW5mbywgbC0+ZGF0YSk7CisgICAgZ3N0X3RvY19lbnRyeV9hcHBlbmRfc3ViX2VudHJ5IChpbnRlcm5hbF9jaGFwdGVyX2luZm8sIGlsLT5kYXRhKTsKKyAgfQorICBnX2xpc3RfZnJlZSAoc3Vic3ViZW50cmllcyk7CisgIGdfbGlzdF9mcmVlIChpbnRlcm5hbF9zdWJzdWJlbnRyaWVzKTsKKworICBERUJVR19FTEVNRU5UX1NUT1AgKGNvbW1vbiwgZWJtbCwgIkNoYXB0ZXJzRWxlbWVudCIsIHJldCk7CisKKyAgLyogc3RhcnQgdGltZSBpcyBtYW5kYXRvcnkgYW5kIGhhcyBubyBkZWZhdWx0IHZhbHVlLAorICAgKiBzbyB3ZSBzaG91bGQgc2tpcCBjaGFwdGVycyB3aXRob3V0IGl0ICovCisgIGlmIChpc19oaWRkZW4gPT0gMCAmJiBpc19lbmFibGVkID4gMCAmJgorICAgICAgc3RhcnRfdGltZSAhPSAtMSAmJiByZXQgPT0gR1NUX0ZMT1dfT0spIHsKKyAgICAqc3ViZW50cmllcyA9IGdfbGlzdF9hcHBlbmQgKCpzdWJlbnRyaWVzLCBjaGFwdGVyX2luZm8pOworICAgICppbnRlcm5hbF9zdWJlbnRyaWVzID0gZ19saXN0X2FwcGVuZCAoKmludGVybmFsX3N1YmVudHJpZXMsCisgICAgICAgIGludGVybmFsX2NoYXB0ZXJfaW5mbyk7CisgIH0gZWxzZSB7CisgICAgZ3N0X3RvY19lbnRyeV91bnJlZiAoY2hhcHRlcl9pbmZvKTsKKyAgICBnc3RfdG9jX2VudHJ5X3VucmVmIChpbnRlcm5hbF9jaGFwdGVyX2luZm8pOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9jaGFwdGVyX2VkaXRpb24gKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGNvbW1vbiwKKyAgICBHc3RFYm1sUmVhZCAqIGVibWwsIEdzdFRvYyAqIHRvYywgR3N0VG9jICogaW50ZXJuYWxfdG9jKQoreworICBndWludDMyIGlkOworICBndWludDY0IGlzX2hpZGRlbiA9IDAsIHVpZCA9IDA7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdFRvY0VudHJ5ICplZGl0aW9uX2luZm8sICppbnRlcm5hbF9lZGl0aW9uX2luZm87CisgIEdMaXN0ICpzdWJlbnRyaWVzID0gTlVMTCwgKmludGVybmFsX3N1YmVudHJpZXMgPSBOVUxMLCAqbCwgKmlsOworICBnY2hhciAqdWlkX3N0cjsKKworICBERUJVR19FTEVNRU5UX1NUQVJUIChjb21tb24sIGVibWwsICJDaGFwdGVyc0VkaXRpb24iKTsKKworICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfbWFzdGVyIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykgeworICAgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiQ2hhcHRlcnNFZGl0aW9uIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSyAmJiBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworCisgICAgc3dpdGNoIChpZCkgeworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfRURJVElPTlVJRDoKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZ1aWQpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUkFUT006CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9jaGFwdGVyX2VsZW1lbnQgKGNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICZzdWJlbnRyaWVzLCAmaW50ZXJuYWxfc3ViZW50cmllcyk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9FRElUSU9ORkxBR0hJRERFTjoKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZpc19oaWRkZW4pOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0KKyAgICAgICAgICAgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwIChjb21tb24sIGVibWwsCisgICAgICAgICAgICAiQ2hhcHRlcnNFZGl0aW9uIiwgaWQpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBERUJVR19FTEVNRU5UX1NUT1AgKGNvbW1vbiwgZWJtbCwgIkNoYXB0ZXJzRWRpdGlvbiIsIHJldCk7CisKKyAgaWYgKHVpZCA9PSAwKQorICAgIHVpZCA9ICgoKGd1aW50NjQpIGdfcmFuZG9tX2ludCAoKSkgPDwgMzIpIHwgZ19yYW5kb21faW50ICgpOworICB1aWRfc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiJSIgR19HVUlOVDY0X0ZPUk1BVCwgdWlkKTsKKyAgZWRpdGlvbl9pbmZvID0gZ3N0X3RvY19lbnRyeV9uZXcgKEdTVF9UT0NfRU5UUllfVFlQRV9FRElUSU9OLCB1aWRfc3RyKTsKKyAgZ3N0X3RvY19lbnRyeV9zZXRfc3RhcnRfc3RvcF90aW1lcyAoZWRpdGlvbl9pbmZvLCAtMSwgLTEpOworICBpbnRlcm5hbF9lZGl0aW9uX2luZm8gPSBnc3RfdG9jX2VudHJ5X25ldyAoR1NUX1RPQ19FTlRSWV9UWVBFX0VESVRJT04sCisgICAgICB1aWRfc3RyKTsKKyAgZ19mcmVlICh1aWRfc3RyKTsKKworICBmb3IgKGwgPSBzdWJlbnRyaWVzLCBpbCA9IGludGVybmFsX3N1YmVudHJpZXM7IGwgJiYgaWw7CisgICAgICBsID0gbC0+bmV4dCwgaWwgPSBpbC0+bmV4dCkgeworICAgIGdzdF90b2NfZW50cnlfYXBwZW5kX3N1Yl9lbnRyeSAoZWRpdGlvbl9pbmZvLCBsLT5kYXRhKTsKKyAgICBnc3RfdG9jX2VudHJ5X2FwcGVuZF9zdWJfZW50cnkgKGludGVybmFsX2VkaXRpb25faW5mbywgaWwtPmRhdGEpOworICB9CisgIGdfbGlzdF9mcmVlIChzdWJlbnRyaWVzKTsKKyAgZ19saXN0X2ZyZWUgKGludGVybmFsX3N1YmVudHJpZXMpOworCisgIGlmIChpc19oaWRkZW4gPT0gMCAmJiBzdWJlbnRyaWVzICE9IE5VTEwgJiYgcmV0ID09IEdTVF9GTE9XX09LKSB7CisgICAgZ3N0X3RvY19hcHBlbmRfZW50cnkgKHRvYywgZWRpdGlvbl9pbmZvKTsKKyAgICBnc3RfdG9jX2FwcGVuZF9lbnRyeSAoaW50ZXJuYWxfdG9jLCBpbnRlcm5hbF9lZGl0aW9uX2luZm8pOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgIlNraXBwaW5nIGVtcHR5IG9yIGhpZGRlbiBlZGl0aW9uIGluIHRoZSBjaGFwdGVycyBUT0MiKTsKKyAgICBnc3RfdG9jX2VudHJ5X3VucmVmIChlZGl0aW9uX2luZm8pOworICAgIGdzdF90b2NfZW50cnlfdW5yZWYgKGludGVybmFsX2VkaXRpb25faW5mbyk7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfY2hhcHRlcnMgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGNvbW1vbiwKKyAgICBHc3RFYm1sUmVhZCAqIGVibWwpCit7CisgIGd1aW50MzIgaWQ7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdFRvYyAqdG9jLCAqaW50ZXJuYWxfdG9jOworCisgIERFQlVHX0VMRU1FTlRfU1RBUlQgKGNvbW1vbiwgZWJtbCwgIkNoYXB0ZXJzIik7CisKKyAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICBERUJVR19FTEVNRU5UX1NUT1AgKGNvbW1vbiwgZWJtbCwgIkNoYXB0ZXJzIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgLyogRklYTUU6IGNyZWF0ZSBDVVJSRU5UIHRvYyBhcyB3ZWxsICovCisgIHRvYyA9IGdzdF90b2NfbmV3IChHU1RfVE9DX1NDT1BFX0dMT0JBTCk7CisgIGludGVybmFsX3RvYyA9IGdzdF90b2NfbmV3IChHU1RfVE9DX1NDT1BFX0dMT0JBTCk7CisKKyAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSyAmJiBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworCisgICAgc3dpdGNoIChpZCkgeworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfRURJVElPTkVOVFJZOgorICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfY2hhcHRlcl9lZGl0aW9uIChjb21tb24sIGVibWwsCisgICAgICAgICAgICB0b2MsIGludGVybmFsX3RvYyk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXQgPQorICAgICAgICAgICAgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX3NraXAgKGNvbW1vbiwgZWJtbCwgIkNoYXB0ZXJzIiwgaWQpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoZ3N0X3RvY19nZXRfZW50cmllcyAodG9jKSAhPSBOVUxMKSB7CisgICAgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3Bvc3Rwcm9jZXNzX3RvY19lbnRyaWVzIChnc3RfdG9jX2dldF9lbnRyaWVzICh0b2MpLAorICAgICAgICBjb21tb24tPnNlZ21lbnQuZHVyYXRpb24sICIiKTsKKyAgICAvKiBubyBuZWVkIHRvIHBvc3Rwcm9jZXNzIGludGVybmFsX3RvYyBhcyB3ZSBkb24ndCBuZWVkIHRvIGtlZXAgdHJhY2sKKyAgICAgKiBvZiBzdGFydCAvIGVuZCBhbmQgdGFncyAob25seSBVSURzKSAqLworCisgICAgY29tbW9uLT50b2MgPSB0b2M7CisgICAgY29tbW9uLT5pbnRlcm5hbF90b2MgPSBpbnRlcm5hbF90b2M7CisgIH0gZWxzZSB7CisgICAgZ3N0X3RvY191bnJlZiAodG9jKTsKKyAgICBnc3RfdG9jX3VucmVmIChpbnRlcm5hbF90b2MpOworICB9CisKKyAgY29tbW9uLT5jaGFwdGVyc19wYXJzZWQgPSBUUlVFOworCisgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiQ2hhcHRlcnMiLCByZXQpOworICByZXR1cm4gcmV0OworfQorCitHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfaGVhZGVyIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sKQoreworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ2NoYXIgKmRvY3R5cGU7CisgIGd1aW50IHZlcnNpb247CisgIGd1aW50MzIgaWQ7CisKKyAgLyogdGhpcyBmdW5jdGlvbiBpcyB0aGUgZmlyc3QgdG8gYmUgY2FsbGVkICovCisKKyAgLyogZGVmYXVsdCBpbml0ICovCisgIGRvY3R5cGUgPSBOVUxMOworICB2ZXJzaW9uID0gMTsKKworICByZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIHJldHVybiByZXQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiaWQ6ICUwOHgiLCBpZCk7CisKKyAgaWYgKGlkICE9IEdTVF9FQk1MX0lEX0hFQURFUikgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIkZhaWxlZCB0byByZWFkIGhlYWRlciIpOworICAgIGdvdG8gZXhpdDsKKyAgfQorCisgIHJldCA9IGdzdF9lYm1sX3JlYWRfbWFzdGVyIChlYm1sLCAmaWQpOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIHJldHVybiByZXQ7CisKKyAgd2hpbGUgKGdzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoZWJtbCwgMSwgVFJVRSkpIHsKKyAgICByZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIGV4aXRfZXJyb3I7CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICAgIC8qIGlzIG91ciByZWFkIHZlcnNpb24gdXB0b2RhdGU/ICovCisgICAgICBjYXNlIEdTVF9FQk1MX0lEX0VCTUxSRUFEVkVSU0lPTjp7CisgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKTsKKyAgICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBnb3RvIGV4aXRfZXJyb3I7CisgICAgICAgIGlmIChudW0gIT0gR1NUX0VCTUxfVkVSU0lPTikgeworICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIEVCTUwgdmVyc2lvbiAlIiBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICAgIGdvdG8gZXhpdF9lcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgICAgICJFYm1sUmVhZFZlcnNpb246ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAgIC8qIHdlIG9ubHkgaGFuZGxlIDggYnl0ZSBsZW5ndGhzIGF0IG1heCAqLworICAgICAgY2FzZSBHU1RfRUJNTF9JRF9FQk1MTUFYU0laRUxFTkdUSDp7CisgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKTsKKyAgICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBnb3RvIGV4aXRfZXJyb3I7CisgICAgICAgIGlmIChudW0gPiBzaXplb2YgKGd1aW50NjQpKSB7CisgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgRUJNTCBtYXhpbXVtIHNpemUgJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAgICAgIkVibWxNYXhTaXplTGVuZ3RoOiAlIiBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiB3ZSBoYW5kbGUgNCBieXRlIElEcyBhdCBtYXggKi8KKyAgICAgIGNhc2UgR1NUX0VCTUxfSURfRUJNTE1BWElETEVOR1RIOnsKKyAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pOworICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGdvdG8gZXhpdF9lcnJvcjsKKyAgICAgICAgaWYgKG51bSA+IHNpemVvZiAoZ3VpbnQzMikpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsCisgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBFQk1MIG1heGltdW0gSUQgJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAgICAgIkVibWxNYXhJZExlbmd0aDogJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR1NUX0VCTUxfSURfRE9DVFlQRTp7CisgICAgICAgIGdjaGFyICp0ZXh0OworCisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfYXNjaWkgKGVibWwsICZpZCwgJnRleHQpOworICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGdvdG8gZXhpdF9lcnJvcjsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJFYm1sRG9jVHlwZTogJXMiLAorICAgICAgICAgICAgR1NUX1NUUl9OVUxMICh0ZXh0KSk7CisKKyAgICAgICAgZ19mcmVlIChkb2N0eXBlKTsKKyAgICAgICAgZG9jdHlwZSA9IHRleHQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdTVF9FQk1MX0lEX0RPQ1RZUEVSRUFEVkVSU0lPTjp7CisgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKTsKKyAgICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBnb3RvIGV4aXRfZXJyb3I7CisgICAgICAgIHZlcnNpb24gPSBudW07CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgICAgICJFYm1sUmVhZFZlcnNpb246ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2Vfc2tpcCAoY29tbW9uLCBlYm1sLAorICAgICAgICAgICAgIkVCTUwgaGVhZGVyIiwgaWQpOworICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGdvdG8gZXhpdF9lcnJvcjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogd2UgaWdub3JlIHRoZXNlIHR3bywgYXMgdGhleSBkb24ndCB0ZWxsIHVzIGFueXRoaW5nIHdlIGNhcmUgYWJvdXQgKi8KKyAgICAgIGNhc2UgR1NUX0VCTUxfSURfRUJNTFZFUlNJT046CisgICAgICBjYXNlIEdTVF9FQk1MX0lEX0RPQ1RZUEVWRVJTSU9OOgorICAgICAgICByZXQgPSBnc3RfZWJtbF9yZWFkX3NraXAgKGVibWwpOworICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGdvdG8gZXhpdF9lcnJvcjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKK2V4aXQ6CisKKyAgaWYgKChkb2N0eXBlICE9IE5VTEwgJiYgIXN0cmNtcCAoZG9jdHlwZSwgR1NUX01BVFJPU0tBX0RPQ1RZUEVfTUFUUk9TS0EpKSB8fAorICAgICAgKGRvY3R5cGUgIT0gTlVMTCAmJiAhc3RyY21wIChkb2N0eXBlLCBHU1RfTUFUUk9TS0FfRE9DVFlQRV9XRUJNKSkgfHwKKyAgICAgIChkb2N0eXBlID09IE5VTEwpKSB7CisgICAgaWYgKHZlcnNpb24gPD0gMikgeworICAgICAgaWYgKGRvY3R5cGUpIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJJbnB1dCBpcyAlcyB2ZXJzaW9uICVkIiwgZG9jdHlwZSwKKyAgICAgICAgICAgIHZlcnNpb24pOworICAgICAgICBpZiAoIXN0cmNtcCAoZG9jdHlwZSwgR1NUX01BVFJPU0tBX0RPQ1RZUEVfV0VCTSkpCisgICAgICAgICAgY29tbW9uLT5pc193ZWJtID0gVFJVRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAgICAgIklucHV0IGlzIEVCTUwgd2l0aG91dCBkb2N0eXBlLCBhc3N1bWluZyAiICJtYXRyb3NrYSAodmVyc2lvbiAlZCkiLAorICAgICAgICAgICAgdmVyc2lvbik7CisgICAgICB9CisgICAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGNvbW1vbiwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAgICgiRGVtdXhlciB2ZXJzaW9uICgyKSBpcyB0b28gb2xkIHRvIHJlYWQgJXMgdmVyc2lvbiAlZCIsCisgICAgICAgICAgICAgIEdTVF9TVFJfTlVMTCAoZG9jdHlwZSksIHZlcnNpb24pKTsKKyAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoY29tbW9uLCBTVFJFQU0sIFdST05HX1RZUEUsIChOVUxMKSwKKyAgICAgICAgKCJJbnB1dCBpcyBub3QgYSBtYXRyb3NrYSBzdHJlYW0gKGRvY3R5cGU9JXMpIiwgZG9jdHlwZSkpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICB9CisKK2V4aXRfZXJyb3I6CisKKyAgZ19mcmVlIChkb2N0eXBlKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX2luZGV4X2N1ZXRyYWNrIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sLCBndWludCAqIG5lbnRyaWVzKQoreworICBndWludDMyIGlkOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0TWF0cm9za2FJbmRleCBpZHg7CisKKyAgaWR4LnBvcyA9IChndWludDY0KSAtIDE7CisgIGlkeC50cmFjayA9IDA7CisgIGlkeC50aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgaWR4LmJsb2NrID0gMTsKKworICBERUJVR19FTEVNRU5UX1NUQVJUIChjb21tb24sIGVibWwsICJDdWVUcmFja1Bvc2l0aW9ucyIpOworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJDdWVUcmFja1Bvc2l0aW9ucyIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgLyogdHJhY2sgbnVtYmVyICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DVUVUUkFDSzoKKyAgICAgIHsKKyAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChudW0gPT0gMCkgeworICAgICAgICAgIGlkeC50cmFjayA9IDA7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJJbnZhbGlkIEN1ZVRyYWNrIDAiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIkN1ZVRyYWNrOiAlIiBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICBpZHgudHJhY2sgPSBudW07CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAgIC8qIHBvc2l0aW9uIGluIGZpbGUgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NVRUNMVVNURVJQT1NJVElPTjoKKyAgICAgIHsKKyAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChudW0gPiBHX01BWElOVDY0KSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsCisgICAgICAgICAgICAgICJDdWVDbHVzdGVyUG9zaXRpb24gJSIgR19HVUlOVDY0X0ZPUk1BVCAiIHRvbyBsYXJnZSIsIG51bSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZHgucG9zID0gbnVtOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiBudW1iZXIgb2YgYmxvY2sgaW4gdGhlIGNsdXN0ZXIgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NVRUJMT0NLTlVNQkVSOgorICAgICAgeworICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJJbnZhbGlkIEN1ZUJsb2NrTnVtYmVyIDAiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIkN1ZUJsb2NrTnVtYmVyOiAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgbnVtKTsKKyAgICAgICAgaWR4LmJsb2NrID0gbnVtOworCisgICAgICAgIC8qIG1pbGQgc2FuaXR5IGNoZWNrLCBkaXNyZWdhcmQgc3RyYW5nZSBjYXNlcyAuLi4gKi8KKyAgICAgICAgaWYgKGlkeC5ibG9jayA+IEdfTUFYVUlOVDE2KSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiLi4uIGxvb2tzIHN1c3BpY2lvdXMsIGlnbm9yaW5nIik7CisgICAgICAgICAgaWR4LmJsb2NrID0gMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX3NraXAgKGNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICJDdWVUcmFja1Bvc2l0aW9ucyIsIGlkKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NVRUNPREVDU1RBVEU6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DVUVSRUZFUkVOQ0U6CisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfc2tpcCAoZWJtbCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiQ3VlVHJhY2tQb3NpdGlvbnMiLCByZXQpOworCisgIC8qIChlLmcuKSBsYXZmIHR5cGljYWxseSBjcmVhdGVzIGVudHJpZXMgd2l0aG91dCBhIGJsb2NrIG51bWJlciwKKyAgICogd2hpY2ggaXMgYm9ndXMgYW5kIGxlYWRzIHRvIGNvbnRyYWRpY3RvcnkgaW5mb3JtYXRpb24gKi8KKyAgaWYgKGNvbW1vbi0+aW5kZXgtPmxlbikgeworICAgIEdzdE1hdHJvc2thSW5kZXggKmxhc3RfaWR4OworCisgICAgbGFzdF9pZHggPSAmZ19hcnJheV9pbmRleCAoY29tbW9uLT5pbmRleCwgR3N0TWF0cm9za2FJbmRleCwKKyAgICAgICAgY29tbW9uLT5pbmRleC0+bGVuIC0gMSk7CisgICAgaWYgKGxhc3RfaWR4LT5ibG9jayA9PSBpZHguYmxvY2sgJiYgbGFzdF9pZHgtPnBvcyA9PSBpZHgucG9zICYmCisgICAgICAgIGxhc3RfaWR4LT50cmFjayA9PSBpZHgudHJhY2sgJiYgaWR4LnRpbWUgPiBsYXN0X2lkeC0+dGltZSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiQ3VlIGVudHJ5IHJlZmVycyB0byBzYW1lIGxvY2F0aW9uLCAiCisgICAgICAgICAgImJ1dCBoYXMgZGlmZmVyZW50IHRpbWUgdGhhbiBwcmV2aW91cyBlbnRyeTsgZGlzY2FyZGluZyIpOworICAgICAgaWR4LnRyYWNrID0gMDsKKyAgICB9CisgIH0KKworICBpZiAoKHJldCA9PSBHU1RfRkxPV19PSyB8fCByZXQgPT0gR1NUX0ZMT1dfRU9TKQorICAgICAgJiYgaWR4LnBvcyAhPSAoZ3VpbnQ2NCkgLSAxICYmIGlkeC50cmFjayA+IDApIHsKKyAgICBnX2FycmF5X2FwcGVuZF92YWwgKGNvbW1vbi0+aW5kZXgsIGlkeCk7CisgICAgKCpuZW50cmllcykrKzsKKyAgfSBlbHNlIGlmIChyZXQgPT0gR1NUX0ZMT1dfT0sgfHwgcmV0ID09IEdTVF9GTE9XX0VPUykgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgIkN1ZVRyYWNrUG9zaXRpb25zIHdpdGhvdXQgdmFsaWQgY29udGVudCIpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9pbmRleF9wb2ludGVudHJ5IChHc3RNYXRyb3NrYVJlYWRDb21tb24gKgorICAgIGNvbW1vbiwgR3N0RWJtbFJlYWQgKiBlYm1sKQoreworICBndWludDMyIGlkOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0Q2xvY2tUaW1lIHRpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBndWludCBuZW50cmllcyA9IDA7CisKKyAgREVCVUdfRUxFTUVOVF9TVEFSVCAoY29tbW9uLCBlYm1sLCAiQ3VlUG9pbnQiKTsKKworICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfbWFzdGVyIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykgeworICAgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiQ3VlUG9pbnQiLCByZXQpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmIGdzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoZWJtbCwgMSwgVFJVRSkpIHsKKyAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3BlZWtfaWQgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICAgIC8qIG9uZSBzaW5nbGUgaW5kZXggZW50cnkgKCdwb2ludCcpICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DVUVUSU1FOgorICAgICAgeworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmdGltZSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIkN1ZVRpbWU6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHRpbWUpOworICAgICAgICB0aW1lID0gdGltZSAqIGNvbW1vbi0+dGltZV9zY2FsZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgICAgLyogcG9zaXRpb24gaW4gdGhlIGZpbGUgKyB0cmFjayB0byB3aGljaCBpdCBiZWxvbmdzICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DVUVUUkFDS1BPU0lUSU9OUzoKKyAgICAgIHsKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX2luZGV4X2N1ZXRyYWNrIChjb21tb24sIGVibWwsCisgICAgICAgICAgICAmbmVudHJpZXMpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX3NraXAgKGNvbW1vbiwgZWJtbCwgIkN1ZVBvaW50IiwKKyAgICAgICAgICAgIGlkKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJDdWVQb2ludCIsIHJldCk7CisKKyAgaWYgKG5lbnRyaWVzID4gMCkgeworICAgIGlmICh0aW1lID09IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiQ3VlUG9pbnQgd2l0aG91dCB2YWxpZCB0aW1lIik7CisgICAgICBnX2FycmF5X3JlbW92ZV9yYW5nZSAoY29tbW9uLT5pbmRleCwgY29tbW9uLT5pbmRleC0+bGVuIC0gbmVudHJpZXMsCisgICAgICAgICAgbmVudHJpZXMpOworICAgIH0gZWxzZSB7CisgICAgICBnaW50IGk7CisKKyAgICAgIGZvciAoaSA9IGNvbW1vbi0+aW5kZXgtPmxlbiAtIG5lbnRyaWVzOyBpIDwgY29tbW9uLT5pbmRleC0+bGVuOyBpKyspIHsKKyAgICAgICAgR3N0TWF0cm9za2FJbmRleCAqaWR4ID0KKyAgICAgICAgICAgICZnX2FycmF5X2luZGV4IChjb21tb24tPmluZGV4LCBHc3RNYXRyb3NrYUluZGV4LCBpKTsKKworICAgICAgICBpZHgtPnRpbWUgPSB0aW1lOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJJbmRleCBlbnRyeTogcG9zPSUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICAgICAgICIsIHRpbWU9JSIgR1NUX1RJTUVfRk9STUFUICIsIHRyYWNrPSV1LCBibG9jaz0ldSIsIGlkeC0+cG9zLAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoaWR4LT50aW1lKSwgKGd1aW50KSBpZHgtPnRyYWNrLCAoZ3VpbnQpIGlkeC0+YmxvY2spOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJFbXB0eSBDdWVQb2ludCIpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworZ2ludAorZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3N0cmVhbV9mcm9tX251bSAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLAorICAgIGd1aW50IHRyYWNrX251bSkKK3sKKyAgZ3VpbnQgbjsKKworICBnX2Fzc2VydCAoY29tbW9uLT5zcmMtPmxlbiA9PSBjb21tb24tPm51bV9zdHJlYW1zKTsKKyAgZm9yIChuID0gMDsgbiA8IGNvbW1vbi0+c3JjLT5sZW47IG4rKykgeworICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjb250ZXh0ID0gZ19wdHJfYXJyYXlfaW5kZXggKGNvbW1vbi0+c3JjLCBuKTsKKworICAgIGlmIChjb250ZXh0LT5udW0gPT0gdHJhY2tfbnVtKSB7CisgICAgICByZXR1cm4gbjsKKyAgICB9CisgIH0KKworICBpZiAobiA9PSBjb21tb24tPm51bV9zdHJlYW1zKQorICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAiRmFpbGVkIHRvIGZpbmQgY29ycmVzcG9uZGluZyBwYWQgZm9yIHRyYWNrbnVtICVkIiwgdHJhY2tfbnVtKTsKKworICByZXR1cm4gLTE7Cit9CisKK0dzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9pbmRleCAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLAorICAgIEdzdEVibWxSZWFkICogZWJtbCkKK3sKKyAgZ3VpbnQzMiBpZDsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ3VpbnQgaTsKKworICBpZiAoY29tbW9uLT5pbmRleCkKKyAgICBnX2FycmF5X2ZyZWUgKGNvbW1vbi0+aW5kZXgsIFRSVUUpOworICBjb21tb24tPmluZGV4ID0KKyAgICAgIGdfYXJyYXlfc2l6ZWRfbmV3IChGQUxTRSwgRkFMU0UsIHNpemVvZiAoR3N0TWF0cm9za2FJbmRleCksIDEyOCk7CisKKyAgREVCVUdfRUxFTUVOVF9TVEFSVCAoY29tbW9uLCBlYm1sLCAiQ3VlcyIpOworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJDdWVzIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSyAmJiBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworCisgICAgc3dpdGNoIChpZCkgeworICAgICAgICAvKiBvbmUgc2luZ2xlIGluZGV4IGVudHJ5ICgncG9pbnQnKSAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfUE9JTlRFTlRSWToKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX2luZGV4X3BvaW50ZW50cnkgKGNvbW1vbiwgZWJtbCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2Vfc2tpcCAoY29tbW9uLCBlYm1sLCAiQ3VlcyIsIGlkKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiQ3VlcyIsIHJldCk7CisKKyAgLyogU29ydCBpbmRleCBieSB0aW1lLCBzbWFsbGVzdCB0aW1lIGZpcnN0LCBmb3IgZWFzaWVyIHNlYXJjaGluZyAqLworICBnX2FycmF5X3NvcnQgKGNvbW1vbi0+aW5kZXgsIChHQ29tcGFyZUZ1bmMpIGdzdF9tYXRyb3NrYV9pbmRleF9jb21wYXJlKTsKKworICAvKiBOb3cgc29ydCB0aGUgdHJhY2sgc3BlY2lmaWMgaW5kZXggZW50cmllcyBpbnRvIHRoZWlyIG93biBhcnJheXMgKi8KKyAgZm9yIChpID0gMDsgaSA8IGNvbW1vbi0+aW5kZXgtPmxlbjsgaSsrKSB7CisgICAgR3N0TWF0cm9za2FJbmRleCAqaWR4ID0gJmdfYXJyYXlfaW5kZXggKGNvbW1vbi0+aW5kZXgsIEdzdE1hdHJvc2thSW5kZXgsCisgICAgICAgIGkpOworICAgIGdpbnQgdHJhY2tfbnVtOworICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjdHg7CisKKyNpZiAwCisgICAgaWYgKGNvbW1vbi0+ZWxlbWVudF9pbmRleCkgeworICAgICAgZ2ludCB3cml0ZXJfaWQ7CisKKyAgICAgIGlmIChpZHgtPnRyYWNrICE9IDAgJiYKKyAgICAgICAgICAodHJhY2tfbnVtID0KKyAgICAgICAgICAgICAgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3N0cmVhbV9mcm9tX251bSAoY29tbW9uLAorICAgICAgICAgICAgICAgICAgaWR4LT50cmFjaykpICE9IC0xKSB7CisgICAgICAgIGN0eCA9IGdfcHRyX2FycmF5X2luZGV4IChjb21tb24tPnNyYywgdHJhY2tfbnVtKTsKKworICAgICAgICBpZiAoY3R4LT5pbmRleF93cml0ZXJfaWQgPT0gLTEpCisgICAgICAgICAgZ3N0X2luZGV4X2dldF93cml0ZXJfaWQgKGNvbW1vbi0+ZWxlbWVudF9pbmRleCwKKyAgICAgICAgICAgICAgR1NUX09CSkVDVCAoY3R4LT5wYWQpLCAmY3R4LT5pbmRleF93cml0ZXJfaWQpOworICAgICAgICB3cml0ZXJfaWQgPSBjdHgtPmluZGV4X3dyaXRlcl9pZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjb21tb24tPmVsZW1lbnRfaW5kZXhfd3JpdGVyX2lkID09IC0xKQorICAgICAgICAgIGdzdF9pbmRleF9nZXRfd3JpdGVyX2lkIChjb21tb24tPmVsZW1lbnRfaW5kZXgsIEdTVF9PQkpFQ1QgKGNvbW1vbiksCisgICAgICAgICAgICAgICZjb21tb24tPmVsZW1lbnRfaW5kZXhfd3JpdGVyX2lkKTsKKyAgICAgICAgd3JpdGVyX2lkID0gY29tbW9uLT5lbGVtZW50X2luZGV4X3dyaXRlcl9pZDsKKyAgICAgIH0KKworICAgICAgR1NUX0xPR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgICAiYWRkaW5nIGFzc29jaWF0aW9uICUiIEdTVF9USU1FX0ZPUk1BVCAiLT4gJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAgICIgZm9yIHdyaXRlciBpZCAlZCIsIEdTVF9USU1FX0FSR1MgKGlkeC0+dGltZSksIGlkeC0+cG9zLCB3cml0ZXJfaWQpOworICAgICAgZ3N0X2luZGV4X2FkZF9hc3NvY2lhdGlvbiAoY29tbW9uLT5lbGVtZW50X2luZGV4LCB3cml0ZXJfaWQsCisgICAgICAgICAgR1NUX0FTU09DSUFUSU9OX0ZMQUdfS0VZX1VOSVQsIEdTVF9GT1JNQVRfVElNRSwgaWR4LT50aW1lLAorICAgICAgICAgIEdTVF9GT1JNQVRfQllURVMsIGlkeC0+cG9zICsgY29tbW9uLT5lYm1sX3NlZ21lbnRfc3RhcnQsIE5VTEwpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGlkeC0+dHJhY2sgPT0gMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgdHJhY2tfbnVtID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3N0cmVhbV9mcm9tX251bSAoY29tbW9uLCBpZHgtPnRyYWNrKTsKKyAgICBpZiAodHJhY2tfbnVtID09IC0xKQorICAgICAgY29udGludWU7CisKKyAgICBjdHggPSBnX3B0cl9hcnJheV9pbmRleCAoY29tbW9uLT5zcmMsIHRyYWNrX251bSk7CisKKyAgICBpZiAoY3R4LT5pbmRleF90YWJsZSA9PSBOVUxMKQorICAgICAgY3R4LT5pbmRleF90YWJsZSA9CisgICAgICAgICAgZ19hcnJheV9zaXplZF9uZXcgKEZBTFNFLCBGQUxTRSwgc2l6ZW9mIChHc3RNYXRyb3NrYUluZGV4KSwgMTI4KTsKKworICAgIGdfYXJyYXlfYXBwZW5kX3ZhbHMgKGN0eC0+aW5kZXhfdGFibGUsIGlkeCwgMSk7CisgIH0KKworICBjb21tb24tPmluZGV4X3BhcnNlZCA9IFRSVUU7CisKKyAgLyogc2FuaXR5IGNoZWNrOyBlbXB0eSBpbmRleCBub3JtYWxpemVzIHRvIG5vIGluZGV4ICovCisgIGlmIChjb21tb24tPmluZGV4LT5sZW4gPT0gMCkgeworICAgIGdfYXJyYXlfZnJlZSAoY29tbW9uLT5pbmRleCwgVFJVRSk7CisgICAgY29tbW9uLT5pbmRleCA9IE5VTEw7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfaW5mbyAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLAorICAgIEdzdEVsZW1lbnQgKiBlbCwgR3N0RWJtbFJlYWQgKiBlYm1sKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBnZG91YmxlIGR1cl9mID0gLTEuMDsKKyAgZ3VpbnQzMiBpZDsKKworICBERUJVR19FTEVNRU5UX1NUQVJUIChjb21tb24sIGVibWwsICJTZWdtZW50SW5mbyIpOworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJTZWdtZW50SW5mbyIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgLyogY2x1c3RlciB0aW1lY29kZSAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVElNRUNPREVTQ0FMRTp7CisgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIlRpbWVDb2RlU2NhbGU6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICBudW0pOworICAgICAgICBjb21tb24tPnRpbWVfc2NhbGUgPSBudW07CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9EVVJBVElPTjp7CisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9mbG9hdCAoZWJtbCwgJmlkLCAmZHVyX2YpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoZHVyX2YgPD0gMC4wKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJJbnZhbGlkIGR1cmF0aW9uICVsZiIsIGR1cl9mKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIkR1cmF0aW9uOiAlbGYiLCBkdXJfZik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9XUklUSU5HQVBQOnsKKyAgICAgICAgZ2NoYXIgKnRleHQ7CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3V0ZjggKGVibWwsICZpZCwgJnRleHQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJXcml0aW5nQXBwOiAlcyIsCisgICAgICAgICAgICBHU1RfU1RSX05VTEwgKHRleHQpKTsKKyAgICAgICAgY29tbW9uLT53cml0aW5nX2FwcCA9IHRleHQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9NVVhJTkdBUFA6eworICAgICAgICBnY2hhciAqdGV4dDsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdXRmOCAoZWJtbCwgJmlkLCAmdGV4dCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIk11eGluZ0FwcDogJXMiLAorICAgICAgICAgICAgR1NUX1NUUl9OVUxMICh0ZXh0KSk7CisgICAgICAgIGNvbW1vbi0+bXV4aW5nX2FwcCA9IHRleHQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9EQVRFVVRDOnsKKyAgICAgICAgZ2ludDY0IHRpbWU7CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX2RhdGUgKGVibWwsICZpZCwgJnRpbWUpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJEYXRlVVRDOiAlIiBHX0dJTlQ2NF9GT1JNQVQsIHRpbWUpOworICAgICAgICBjb21tb24tPmNyZWF0ZWQgPSB0aW1lOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVElUTEU6eworICAgICAgICBnY2hhciAqdGV4dDsKKyAgICAgICAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdXRmOCAoZWJtbCwgJmlkLCAmdGV4dCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIlRpdGxlOiAlcyIsIEdTVF9TVFJfTlVMTCAodGV4dCkpOworICAgICAgICB0YWdsaXN0ID0gZ3N0X3RhZ19saXN0X25ldyAoR1NUX1RBR19USVRMRSwgdGV4dCwgTlVMTCk7CisgICAgICAgIGdzdF90YWdfbGlzdF9zZXRfc2NvcGUgKHRhZ2xpc3QsIEdTVF9UQUdfU0NPUEVfR0xPQkFMKTsKKyAgICAgICAgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2ZvdW5kX2dsb2JhbF90YWcgKGNvbW1vbiwgZWwsIHRhZ2xpc3QpOworICAgICAgICBnX2ZyZWUgKHRleHQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX3NraXAgKGNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICJTZWdtZW50SW5mbyIsIGlkKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TRUdNRU5UVUlEOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfU0VHTUVOVEZJTEVOQU1FOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfUFJFVlVJRDoKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1BSRVZGSUxFTkFNRToKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX05FWFRVSUQ6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9ORVhURklMRU5BTUU6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TRUdNRU5URkFNSUxZOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUlRSQU5TTEFURToKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9za2lwIChlYm1sKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGR1cl9mID4gMC4wKSB7CisgICAgR3N0Q2xvY2tUaW1lIGR1cl91OworCisgICAgZHVyX3UgPSBnc3RfZ2RvdWJsZV90b19ndWludDY0IChkdXJfZiAqCisgICAgICAgIGdzdF9ndWludDY0X3RvX2dkb3VibGUgKGNvbW1vbi0+dGltZV9zY2FsZSkpOworICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZHVyX3UpICYmIGR1cl91IDw9IEdfTUFYSU5UNjQpCisgICAgICBjb21tb24tPnNlZ21lbnQuZHVyYXRpb24gPSBkdXJfdTsKKyAgfQorCisgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiU2VnbWVudEluZm8iLCByZXQpOworCisgIGNvbW1vbi0+c2VnbWVudGluZm9fcGFyc2VkID0gVFJVRTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX21ldGFkYXRhX2lkX3NpbXBsZV90YWcgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqCisgICAgY29tbW9uLCBHc3RFYm1sUmVhZCAqIGVibWwsIEdzdFRhZ0xpc3QgKiogcF90YWdsaXN0LCBnY2hhciAqIHBhcmVudCkKK3sKKyAgLyogRklYTUU6IGNoZWNrIGlmIHRoZXJlIGFyZSBtb3JlIHVzZWZ1bCBtYXBwaW5ncyAqLworICBzdGF0aWMgY29uc3Qgc3RydWN0CisgIHsKKyAgICBjb25zdCBnY2hhciAqbWF0cm9za2FfdGFnbmFtZTsKKyAgICBjb25zdCBnY2hhciAqZ3N0cmVhbWVyX3RhZ25hbWU7CisgIH0KKyAgdGFnX2NvbnZbXSA9IHsKKyAgICB7CisgICAgICAvKiBUaGUgZm9sbG93aW5nIGxpc3QgaGFzIHRoZSBfc2FtZV8gb3JkZXIgYXMgdGhlIG9uZSBpbiBNYXRyb3NrYSBzcGVjLiBQbGVhc2UsIGRvbid0IG1lc3MgaXQgdXAuICovCisgICAgICAvKiBUT0RPOiBOZXN0aW5nIGluZm9ybWF0aW9uOgorICAgICAgICAgT1JJR0lOQUwgQSBzcGVjaWFsIHRhZyB0aGF0IGlzIG1lYW50IHRvIGhhdmUgb3RoZXIgdGFncyBpbnNpZGUgKHVzaW5nIG5lc3RlZCB0YWdzKSB0byBkZXNjcmliZSB0aGUgb3JpZ2luYWwgd29yayBvZiBhcnQgdGhhdCB0aGlzIGl0ZW0gaXMgYmFzZWQgb24uIEFsbCB0YWdzIGluIHRoaXMgbGlzdCBjYW4gYmUgdXNlZCAidW5kZXIiIHRoZSBPUklHSU5BTCB0YWcgbGlrZSBMWVJJQ0lTVCwgUEVSRk9STUVSLCBldGMuCisgICAgICAgICBTQU1QTEUgQSB0YWcgdGhhdCBjb250YWlucyBvdGhlciB0YWdzIHRvIGRlc2NyaWJlIGEgc2FtcGxlIHVzZWQgaW4gdGhlIHRhcmdldGVkIGl0ZW0gdGFrZW4gZnJvbSBhbm90aGVyIHdvcmsgb2YgYXJ0LiBBbGwgdGFncyBpbiB0aGlzIGxpc3QgY2FuIGJlIHVzZWQgInVuZGVyIiB0aGUgU0FNUExFIHRhZyBsaWtlIFRJVExFLCBBUlRJU1QsIERBVEVfUkVMRUFTRUQsIGV0Yy4KKyAgICAgICAgIENPVU5UUlkgVGhlIG5hbWUgb2YgdGhlIGNvdW50cnkgKGJpYmxpbyBJU08tNjM5LTIpIHRoYXQgaXMgbWVhbnQgdG8gaGF2ZSBvdGhlciB0YWdzIGluc2lkZSAodXNpbmcgbmVzdGVkIHRhZ3MpIHRvIGNvdW50cnkgc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGl0ZW0uIEFsbCB0YWdzIGluIHRoaXMgbGlzdCBjYW4gYmUgdXNlZCAidW5kZXIiIHRoZSBDT1VOVFJZX1NQRUNJRklDIHRhZyBsaWtlIExBQkVMLCBQVUJMSVNIX1JBVElORywgZXRjLgorICAgICAgICovCisKKyAgICAgIC8qIE9yZ2FuaXphdGlvbmFsIEluZm9ybWF0aW9uICovCisgICAgR1NUX01BVFJPU0tBX1RBR19JRF9UT1RBTF9QQVJUUywgR1NUX1RBR19UUkFDS19DT1VOVH0sIHsKKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX1BBUlRfTlVNQkVSLCBHU1RfVEFHX1RSQUNLX05VTUJFUn0sIHsKKyAgICAgIC8qIFRPRE86IFBBUlRfT0ZGU0VUIEEgbnVtYmVyIHRvIGFkZCB0byBQQVJUX05VTUJFUiB3aGVuIHRoZSBwYXJ0cyBhdCB0aGF0IGxldmVsIGRvbid0IHN0YXJ0IGF0IDEuIChlLmcuIGlmIFRhcmdldFR5cGUgaXMgVFJBQ0ssIHRoZSB0cmFjayBudW1iZXIgb2YgdGhlIHNlY29uZCBhdWRpbyBDRCkgKi8KKworICAgICAgLyogVGl0bGVzICovCisgICAgR1NUX01BVFJPU0tBX1RBR19JRF9TVUJUSVRMRSwgR1NUX1RBR19USVRMRX0sIHsgICAgIC8qIFN1YiBUaXRsZSBvZiB0aGUgZW50aXR5LiBTaW5jZSB3ZSdyZSBjb25jYXQnaW5nIGFsbCB0aXRsZS1saWtlIGVudGl0aWVzIGFueXdheSwgbWlnaHQgYXMgd2VsbCBhZGQgdGhlIHN1Yi10aXRsZS4gKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX1RJVExFLCBHU1RfVEFHX1RJVExFfSwgeworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfQUxCVU0sIEdTVF9UQUdfQUxCVU19LCB7ICAgICAgICAvKiBNYXRyb3NrYSBzcGVjIGRvZXMgTk9UIGhhdmUgdGhpcyB0YWchIER1bm5vIHdoYXQgaXQgd2FzIGRvaW5nIGhlcmUsIHByb2JhYmx5IGZvciBjb21wYXRpYmlsaXR5LiAqLworCisgICAgICAvKiBUT0RPOiBOZXN0ZWQgSW5mb3JtYXRpb246CisgICAgICAgICBVUkwgVVJMIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRhZyBpdCdzIGluY2x1ZGVkIGluLgorICAgICAgICAgU09SVF9XSVRIIEEgY2hpbGQgZWxlbWVudCB0byBpbmRpY2F0ZSB3aGF0IGFsdGVybmF0aXZlIHZhbHVlIHRoZSBwYXJlbnQgdGFnIGNhbiBoYXZlIHRvIGJlIHNvcnRlZCwgZm9yIGV4YW1wbGUgIlBldCBTaG9wIEJveXMiIGluc3RlYWQgb2YgIlRoZSBQZXQgU2hvcCBCb3lzIi4gT3IgIk1hcmxleSBCb2IiIGFuZCAiTWFybGV5IFppZ2d5IiAobm8gY29tbWEgbmVlZGVkKS4KKyAgICAgICAgIElOU1RSVU1FTlRTIFRoZSBpbnN0cnVtZW50cyB0aGF0IGFyZSBiZWluZyB1c2VkL3BsYXllZCwgc2VwYXJhdGVkIGJ5IGEgY29tbWEuIEl0IHNob3VsZCBiZSBhIGNoaWxkIG9mIHRoZSBmb2xsb3dpbmcgdGFnczogQVJUSVNULCBMRUFEX1BFUkZPUk1FUiBvciBBQ0NPTVBBTklNRU5ULgorICAgICAgICAgRU1BSUwgRW1haWwgY29ycmVzcG9uZGluZyB0byB0aGUgdGFnIGl0J3MgaW5jbHVkZWQgaW4uCisgICAgICAgICBBRERSRVNTIFRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBlbnRpdHkuIFRoZSBhZGRyZXNzIHNob3VsZCBpbmNsdWRlIGEgY291bnRyeSBjb2RlLiBJdCBjYW4gYmUgdXNlZnVsIGZvciBhIHJlY29yZGluZyBsYWJlbC4KKyAgICAgICAgIEZBWCBUaGUgZmF4IG51bWJlciBjb3JyZXNwb25kaW5nIHRvIHRoZSB0YWcgaXQncyBpbmNsdWRlZCBpbi4gSXQgY2FuIGJlIHVzZWZ1bCBmb3IgYSByZWNvcmRpbmcgbGFiZWwuCisgICAgICAgICBQSE9ORSBUaGUgcGhvbmUgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRhZyBpdCdzIGluY2x1ZGVkIGluLiBJdCBjYW4gYmUgdXNlZnVsIGZvciBhIHJlY29yZGluZyBsYWJlbC4KKyAgICAgICAqLworCisgICAgICAvKiBFbnRpdGllcyAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfQVJUSVNULCBHU1RfVEFHX0FSVElTVH0sIHsKKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0xFQURfUEVSRk9STUVSLCBHU1RfVEFHX1BFUkZPUk1FUn0sIHsKKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0FDQ09NUEFOSU1FTlQsIEdTVF9UQUdfUEVSRk9STUVSfSwgeyAgICAvKiBCYW5kL29yY2hlc3RyYS9hY2NvbXBhbmltZW50L211c2ljaWFuLiBUaGlzIGlzIGFraW4gdG8gdGhlIFRQRTIgdGFnIGluIElEMy4gKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0NPTVBPU0VSLCBHU1RfVEFHX0NPTVBPU0VSfSwgeworICAgICAgLyogQVJSQU5HRVIgVGhlIHBlcnNvbiB3aG8gYXJyYW5nZWQgdGhlIHBpZWNlLCBlLmcuLCBSYXZlbC4gKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0xZUklDUywgR1NUX1RBR19MWVJJQ1N9LCB7ICAgICAgLyogVGhlIGx5cmljcyBjb3JyZXNwb25kaW5nIHRvIGEgc29uZyAoaW4gY2FzZSBhdWRpbyBzeW5jaHJvbml6YXRpb24gaXMgbm90IGtub3duIG9yIGFzIGEgZG91YmxvbiB0byBhIHN1YnRpdGxlIHRyYWNrKS4gRWRpdGluZyB0aGlzIHZhbHVlIHdoZW4gc3VidGl0bGVzIGFyZSBmb3VuZCBzaG91bGQgYWxzbyByZXN1bHQgaW4gZWRpdGluZyB0aGUgc3VidGl0bGUgdHJhY2sgZm9yIG1vcmUgY29uc2lzdGVuY3kuICovCisgICAgICAvKiBMWVJJQ0lTVCBUaGUgcGVyc29uIHdobyB3cm90ZSB0aGUgbHlyaWNzIGZvciBhIG11c2ljYWwgaXRlbS4gVGhpcyBpcyBha2luIHRvIHRoZSBURVhUIHRhZyBpbiBJRDMuICovCisgICAgR1NUX01BVFJPU0tBX1RBR19JRF9DT05EVUNUT1IsIEdTVF9UQUdfUEVSRk9STUVSfSwgeyAgICAgICAgLyogQ29uZHVjdG9yL3BlcmZvcm1lciByZWZpbmVtZW50LiBUaGlzIGlzIGFraW4gdG8gdGhlIFRQRTMgdGFnIGluIElEMy4gKi8KKyAgICAgIC8qIERJUkVDVE9SIFRoaXMgaXMgYWtpbiB0byB0aGUgSUFSVCB0YWcgaW4gUklGRi4gKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0FVVEhPUiwgR1NUX1RBR19BUlRJU1R9LCB7CisgICAgICAvKiBBU1NJU1RBTlRfRElSRUNUT1IgVGhlIG5hbWUgb2YgdGhlIGFzc2lzdGFudCBkaXJlY3Rvci4gKi8KKyAgICAgIC8qIERJUkVDVE9SX09GX1BIT1RPR1JBUEhZIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvciBvZiBwaG90b2dyYXBoeSwgYWxzbyBrbm93biBhcyBjaW5lbWF0b2dyYXBoZXIuIFRoaXMgaXMgYWtpbiB0byB0aGUgSUNOTSB0YWcgaW4gRXh0ZW5kZWQgUklGRi4gKi8KKyAgICAgIC8qIFNPVU5EX0VOR0lORUVSIFRoZSBuYW1lIG9mIHRoZSBzb3VuZCBlbmdpbmVlciBvciBzb3VuZCByZWNvcmRpc3QuICovCisgICAgICAvKiBBUlRfRElSRUNUT1IgVGhlIHBlcnNvbiB3aG8gb3ZlcnNlZXMgdGhlIGFydGlzdHMgYW5kIGNyYWZ0c3Blb3BsZSB3aG8gYnVpbGQgdGhlIHNldHMuICovCisgICAgICAvKiBQUk9EVUNUSU9OX0RFU0lHTkVSIEFydGlzdCByZXNwb25zaWJsZSBmb3IgZGVzaWduaW5nIHRoZSBvdmVyYWxsIHZpc3VhbCBhcHBlYXJhbmNlIG9mIGEgbW92aWUuICovCisgICAgICAvKiBDSE9SRUdSQVBIRVIgVGhlIG5hbWUgb2YgdGhlIGNob3JlZ3JhcGhlciAqLworICAgICAgLyogQ09TVFVNRV9ERVNJR05FUiBUaGUgbmFtZSBvZiB0aGUgY29zdHVtZSBkZXNpZ25lciAqLworICAgICAgLyogQUNUT1IgQW4gYWN0b3Igb3IgYWN0cmVzcyBwbGF5aW5nIGEgcm9sZSBpbiB0aGlzIG1vdmllLiBUaGlzIGlzIHRoZSBwZXJzb24ncyByZWFsIG5hbWUsIG5vdCB0aGUgY2hhcmFjdGVyJ3MgbmFtZSB0aGUgcGVyc29uIGlzIHBsYXlpbmcuICovCisgICAgICAvKiBDSEFSQUNURVIgVGhlIG5hbWUgb2YgdGhlIGNoYXJhY3RlciBhbiBhY3RvciBvciBhY3RyZXNzIHBsYXlzIGluIHRoaXMgbW92aWUuIFRoaXMgc2hvdWxkIGJlIGEgc3ViLXRhZyBvZiBhbiBBQ1RPUiB0YWcgaW4gb3JkZXIgbm90IHRvIGNhdXNlIGFtYmlndWl0aWVzLiAqLworICAgICAgLyogV1JJVFRFTl9CWSBUaGUgYXV0aG9yIG9mIHRoZSBzdG9yeSBvciBzY3JpcHQgKHVzZWQgZm9yIG1vdmllcyBhbmQgVFYgc2hvd3MpLiAqLworICAgICAgLyogU0NSRUVOUExBWV9CWSBUaGUgYXV0aG9yIG9mIHRoZSBzY3JlZW5wbGF5IG9yIHNjZW5hcmlvICh1c2VkIGZvciBtb3ZpZXMgYW5kIFRWIHNob3dzKS4gKi8KKyAgICAgIC8qIEVESVRFRF9CWSBUaGlzIGlzIGFraW4gdG8gdGhlIElFRFQgdGFnIGluIEV4dGVuZGVkIFJJRkYuICovCisgICAgICAvKiBQUk9EVUNFUiBQcm9kdWNlZCBieS4gVGhpcyBpcyBha2luIHRvIHRoZSBJUFJPIHRhZyBpbiBFeHRlbmRlZCBSSUZGLiAqLworICAgICAgLyogQ09QUk9EVUNFUiBUaGUgbmFtZSBvZiBhIGNvLXByb2R1Y2VyLiAqLworICAgICAgLyogRVhFQ1VUSVZFX1BST0RVQ0VSIFRoZSBuYW1lIG9mIGFuIGV4ZWN1dGl2ZSBwcm9kdWNlci4gKi8KKyAgICAgIC8qIERJU1RSSUJVVEVEX0JZIFRoaXMgaXMgYWtpbiB0byB0aGUgSURTVCB0YWcgaW4gRXh0ZW5kZWQgUklGRi4gKi8KKyAgICAgIC8qIE1BU1RFUkVEX0JZIFRoZSBlbmdpbmVlciB3aG8gbWFzdGVyZWQgdGhlIGNvbnRlbnQgZm9yIGEgcGh5c2ljYWwgbWVkaXVtIG9yIGZvciBkaWdpdGFsIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0VOQ09ERURfQlksIEdTVF9UQUdfRU5DT0RFRF9CWX0sIHsgICAgICAvKiBUaGlzIGlzIGFraW4gdG8gdGhlIFRFTkMgdGFnIGluIElEMy4gKi8KKyAgICAgIC8qIE1JWEVEX0JZIERKIG1peCBieSB0aGUgYXJ0aXN0IHNwZWNpZmllZCAqLworICAgICAgLyogUkVNSVhFRF9CWSBJbnRlcnByZXRlZCwgcmVtaXhlZCwgb3Igb3RoZXJ3aXNlIG1vZGlmaWVkIGJ5LiBUaGlzIGlzIGFraW4gdG8gdGhlIFRQRTQgdGFnIGluIElEMy4gKi8KKyAgICAgIC8qIFBST0RVQ1RJT05fU1RVRElPIFRoaXMgaXMgYWtpbiB0byB0aGUgSVNURCB0YWcgaW4gRXh0ZW5kZWQgUklGRi4gKi8KKyAgICAgIC8qIFRIQU5LU19UTyBBIHZlcnkgZ2VuZXJhbCB0YWcgZm9yIGV2ZXJ5b25lIGVsc2UgdGhhdCB3YW50cyB0byBiZSBsaXN0ZWQuICovCisgICAgICAvKiBQVUJMSVNIRVIgVGhpcyBpcyBha2luIHRvIHRoZSBUUFVCIHRhZyBpbiBJRDMuICovCisgICAgICAvKiBMQUJFTCBUaGUgcmVjb3JkIGxhYmVsIG9yIGltcHJpbnQgb24gdGhlIGRpc2MuICovCisgICAgICAvKiBTZWFyY2ggLyBDbGFzc2lmaWNhdGlvbiAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfR0VOUkUsIEdTVF9UQUdfR0VOUkV9LCB7CisgICAgICAvKiBNT09EIEludGVuZGVkIHRvIHJlZmxlY3QgdGhlIG1vb2Qgb2YgdGhlIGl0ZW0gd2l0aCBhIGZldyBrZXl3b3JkcywgZS5nLiAiUm9tYW50aWMiLCAiU2FkIiBvciAiVXBsaWZ0aW5nIi4gVGhlIGZvcm1hdCBmb2xsb3dzIHRoYXQgb2YgdGhlIFRNT08gdGFnIGluIElEMy4gKi8KKyAgICAgIC8qIE9SSUdJTkFMX01FRElBX1RZUEUgRGVzY3JpYmVzIHRoZSBvcmlnaW5hbCB0eXBlIG9mIHRoZSBtZWRpYSwgc3VjaCBhcywgIkRWRCIsICJDRCIsICJjb21wdXRlciBpbWFnZSwiICJkcmF3aW5nLCIgImxpdGhvZ3JhcGgsIiBhbmQgc28gZm9ydGguIFRoaXMgaXMgYWtpbiB0byB0aGUgVE1FRCB0YWcgaW4gSUQzLiAqLworICAgICAgLyogQ09OVEVOVF9UWVBFIFRoZSB0eXBlIG9mIHRoZSBpdGVtLiBlLmcuIERvY3VtZW50YXJ5LCBGZWF0dXJlIEZpbG0sIENhcnRvb24sIE11c2ljIFZpZGVvLCBNdXNpYywgU291bmQgRlgsIC4uLiAqLworICAgICAgLyogU1VCSkVDVCBEZXNjcmliZXMgdGhlIHRvcGljIG9mIHRoZSBmaWxlLCBzdWNoIGFzICJBZXJpYWwgdmlldyBvZiBTZWF0dGxlLiIgKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0RFU0NSSVBUSU9OLCBHU1RfVEFHX0RFU0NSSVBUSU9OfSwgeyAgICAvKiBBIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBjb250ZW50LCBzdWNoIGFzICJUd28gYmlyZHMgZmx5aW5nLiIgKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0tFWVdPUkRTLCBHU1RfVEFHX0tFWVdPUkRTfSwgeyAgLyogS2V5d29yZHMgdG8gdGhlIGl0ZW0gc2VwYXJhdGVkIGJ5IGEgY29tbWEsIHVzZWQgZm9yIHNlYXJjaGluZy4gKi8KKyAgICAgIC8qIFNVTU1BUlkgQSBwbG90IG91dGxpbmUgb3IgYSBzdW1tYXJ5IG9mIHRoZSBzdG9yeS4gKi8KKyAgICAgIC8qIFNZTk9QU0lTIEEgZGVzY3JpcHRpb24gb2YgdGhlIHN0b3J5IGxpbmUgb2YgdGhlIGl0ZW0uICovCisgICAgICAvKiBJTklUSUFMX0tFWSBUaGUgaW5pdGlhbCBrZXkgdGhhdCBhIG11c2ljYWwgdHJhY2sgc3RhcnRzIGluLiBUaGUgZm9ybWF0IGlzIGlkZW50aWNhbCB0byBJRDMuICovCisgICAgICAvKiBQRVJJT0QgRGVzY3JpYmVzIHRoZSBwZXJpb2QgdGhhdCB0aGUgcGllY2UgaXMgZnJvbSBvciBhYm91dC4gRm9yIGV4YW1wbGUsICJSZW5haXNzYW5jZSIuICovCisgICAgICAvKiBMQVdfUkFUSU5HIERlcGVuZGluZyBvbiB0aGUgY291bnRyeSBpdCdzIHRoZSBmb3JtYXQgb2YgdGhlIHJhdGluZyBvZiBhIG1vdmllIChQLCBSLCBYIGluIHRoZSBVU0EsIGFuIGFnZSBpbiBvdGhlciBjb3VudHJpZXMgb3IgYSBVUkkgZGVmaW5pbmcgYSBsb2dvKS4gKi8KKyAgICAgIC8qIElDUkEgVGhlIElDUkEgY29udGVudCByYXRpbmcgZm9yIHBhcmVudGFsIGNvbnRyb2wuIChQcmV2aW91c2x5IFJTQUNpKSAqLworCisgICAgICAvKiBUZW1wb3JhbCBJbmZvcm1hdGlvbiAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfREFURV9SRUxFQVNFRCwgR1NUX1RBR19EQVRFfSwgeyAvKiBUaGUgdGltZSB0aGF0IHRoZSBpdGVtIHdhcyBvcmlnaW5hbHkgcmVsZWFzZWQuIFRoaXMgaXMgYWtpbiB0byB0aGUgVERSTCB0YWcgaW4gSUQzLiAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfREFURV9SRUNPUkRFRCwgR1NUX1RBR19EQVRFfSwgeyAvKiBUaGUgdGltZSB0aGF0IHRoZSByZWNvcmRpbmcgYmVnYW4uIFRoaXMgaXMgYWtpbiB0byB0aGUgVERSQyB0YWcgaW4gSUQzLiAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfREFURV9FTkNPREVELCBHU1RfVEFHX0RBVEV9LCB7ICAvKiBUaGUgdGltZSB0aGF0IHRoZSBlbmNvZGluZyBvZiB0aGlzIGl0ZW0gd2FzIGNvbXBsZXRlZCBiZWdhbi4gVGhpcyBpcyBha2luIHRvIHRoZSBUREVOIHRhZyBpbiBJRDMuICovCisgICAgR1NUX01BVFJPU0tBX1RBR19JRF9EQVRFX1RBR0dFRCwgR1NUX1RBR19EQVRFfSwgeyAgIC8qIFRoZSB0aW1lIHRoYXQgdGhlIHRhZ3Mgd2VyZSBkb25lIGZvciB0aGlzIGl0ZW0uIFRoaXMgaXMgYWtpbiB0byB0aGUgVERURyB0YWcgaW4gSUQzLiAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfREFURV9ESUdJVElaRUQsIEdTVF9UQUdfREFURX0sIHsgICAgICAgIC8qIFRoZSB0aW1lIHRoYXQgdGhlIGl0ZW0gd2FzIHRyYW5mZXJlZCB0byBhIGRpZ2l0YWwgbWVkaXVtLiBUaGlzIGlzIGFraW4gdG8gdGhlIElESVQgdGFnIGluIFJJRkYuICovCisgICAgR1NUX01BVFJPU0tBX1RBR19JRF9EQVRFX1dSSVRURU4sIEdTVF9UQUdfREFURX0sIHsgIC8qIFRoZSB0aW1lIHRoYXQgdGhlIHdyaXRpbmcgb2YgdGhlIG11c2ljL3NjcmlwdCBiZWdhbi4gKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0RBVEVfUFVSQ0hBU0VELCBHU1RfVEFHX0RBVEV9LCB7ICAgICAgICAvKiBJbmZvcm1hdGlvbiBvbiB3aGVuIHRoZSBmaWxlIHdhcyBwdXJjaGFzZWQgKHNlZSBhbHNvIHB1cmNoYXNlIHRhZ3MpLiAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfREFURSwgR1NUX1RBR19EQVRFfSwgeyAgLyogTWF0cm9za2Egc3BlYyBkb2VzIE5PVCBoYXZlIHRoaXMgdGFnISBEdW5ubyB3aGF0IGl0IHdhcyBkb2luZyBoZXJlLCBwcm9iYWJseSBmb3IgY29tcGF0aWJpbGl0eS4gKi8KKworICAgICAgLyogU3BhY2lhbCBJbmZvcm1hdGlvbiAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfUkVDT1JESU5HX0xPQ0FUSU9OLCBHU1RfVEFHX0dFT19MT0NBVElPTl9OQU1FfSwgeyAgICAgICAvKiBUaGUgbG9jYXRpb24gd2hlcmUgdGhlIGl0ZW0gd2FzIHJlY29yZGVkLiBUaGUgY291bnRyaWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0cmluZywgc2FtZSAyIG9jdGV0cyBhcyBpbiBJbnRlcm5ldCBkb21haW5zLCBvciBwb3NzaWJseSBJU08tMzE2Ni4gVGhpcyBjb2RlIGlzIGZvbGxvd2VkIGJ5IGEgY29tbWEsIHRoZW4gbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBzdWNoIGFzIHN0YXRlL3Byb3ZpbmNlLCBhbm90aGVyIGNvbW1hLCBhbmQgdGhlbiBjaXR5LiBGb3IgZXhhbXBsZSwgIlVTLCBUZXhhcywgQXVzdGluIi4gVGhpcyB3aWxsIGFsbG93IGZvciBlYXN5IHNvcnRpbmcuIEl0IGlzIG9rYXkgdG8gb25seSBzdG9yZSB0aGUgY291bnRyeSwgb3IgdGhlIGNvdW50cnkgYW5kIHRoZSBzdGF0ZS9wcm92aW5jZS4gTW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBjYW4gYmUgYWRkZWQgYWZ0ZXIgdGhlIGNpdHkgdGhyb3VnaCB0aGUgdXNlIG9mIGFkZGl0aW9uYWwgY29tbWFzLiBJbiBjYXNlcyB3aGVyZSB0aGUgcHJvdmluY2Uvc3RhdGUgaXMgdW5rbm93biwgYnV0IHlvdSB3YW50IHRvIHN0b3JlIHRoZSBjaXR5LCBzaW1wbHkgbGVhdmUgYSBzcGFjZSBiZXR3ZWVuIHRoZSB0d28gY29tbWFzLiBGb3IgZXhhbXBsZSwgIlVTLCAsIEF1c3RpbiIuICovCisgICAgICAvKiBDT01QT1NJVElPTl9MT0NBVElPTiBMb2NhdGlvbiB0aGF0IHRoZSBpdGVtIHdhcyBvcmlnaW5hbHkgZGVzaWduZWQvd3JpdHRlbi4gVGhlIGNvdW50cmllcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdHJpbmcsIHNhbWUgMiBvY3RldHMgYXMgaW4gSW50ZXJuZXQgZG9tYWlucywgb3IgcG9zc2libHkgSVNPLTMxNjYuIFRoaXMgY29kZSBpcyBmb2xsb3dlZCBieSBhIGNvbW1hLCB0aGVuIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gc3VjaCBhcyBzdGF0ZS9wcm92aW5jZSwgYW5vdGhlciBjb21tYSwgYW5kIHRoZW4gY2l0eS4gRm9yIGV4YW1wbGUsICJVUywgVGV4YXMsIEF1c3RpbiIuIFRoaXMgd2lsbCBhbGxvdyBmb3IgZWFzeSBzb3J0aW5nLiBJdCBpcyBva2F5IHRvIG9ubHkgc3RvcmUgdGhlIGNvdW50cnksIG9yIHRoZSBjb3VudHJ5IGFuZCB0aGUgc3RhdGUvcHJvdmluY2UuIE1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gY2FuIGJlIGFkZGVkIGFmdGVyIHRoZSBjaXR5IHRocm91Z2ggdGhlIHVzZSBvZiBhZGRpdGlvbmFsIGNvbW1hcy4gSW4gY2FzZXMgd2hlcmUgdGhlIHByb3ZpbmNlL3N0YXRlIGlzIHVua25vd24sIGJ1dCB5b3Ugd2FudCB0byBzdG9yZSB0aGUgY2l0eSwgc2ltcGx5IGxlYXZlIGEgc3BhY2UgYmV0d2VlbiB0aGUgdHdvIGNvbW1hcy4gRm9yIGV4YW1wbGUsICJVUywgLCBBdXN0aW4iLiAqLworICAgICAgLyogQ09NUE9TRVJfTkFUSU9OQUxJVFkgTmF0aW9uYWxpdHkgb2YgdGhlIG1haW4gY29tcG9zZXIgb2YgdGhlIGl0ZW0sIG1vc3RseSBmb3IgY2xhc3NpY2FsIG11c2ljLiBUaGUgY291bnRyaWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0cmluZywgc2FtZSAyIG9jdGV0cyBhcyBpbiBJbnRlcm5ldCBkb21haW5zLCBvciBwb3NzaWJseSBJU08tMzE2Ni4gKi8KKworICAgICAgLyogUGVyc29uYWwgKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0NPTU1FTlQsIEdTVF9UQUdfQ09NTUVOVH0sIHsgICAgLyogQW55IGNvbW1lbnQgcmVsYXRlZCB0byB0aGUgY29udGVudC4gKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0NPTU1FTlRTLCBHU1RfVEFHX0NPTU1FTlR9LCB7ICAgLyogTWF0cm9za2Egc3BlYyBkb2VzIE5PVCBoYXZlIHRoaXMgdGFnISBEdW5ubyB3aGF0IGl0IHdhcyBkb2luZyBoZXJlLCBwcm9iYWJseSBmb3IgY29tcGF0aWJpbGl0eS4gKi8KKyAgICAgIC8qIFBMQVlfQ09VTlRFUiBUaGUgbnVtYmVyIG9mIHRpbWUgdGhlIGl0ZW0gaGFzIGJlZW4gcGxheWVkLiAqLworICAgICAgLyogVE9ETzogUkFUSU5HIEEgbnVtZXJpYyB2YWx1ZSBkZWZpbmluZyBob3cgbXVjaCBhIHBlcnNvbiBsaWtlcyB0aGUgc29uZy9tb3ZpZS4gVGhlIG51bWJlciBpcyBiZXR3ZWVuIDAgYW5kIDUgd2l0aCBkZWNpbWFsIHZhbHVlcyBwb3NzaWJsZSAoZS5nLiAyLjcpLCA1KC4wKSBiZWluZyB0aGUgaGlnaGVzdCBwb3NzaWJsZSByYXRpbmcuIE90aGVyIHJhdGluZyBzeXN0ZW1zIHdpdGggZGlmZmVyZW50IHJhbmdlcyB3aWxsIGhhdmUgdG8gYmUgc2NhbGVkLiAqLworCisgICAgICAvKiBUZWNobmljYWwgSW5mb3JtYXRpb24gKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0VOQ09ERVIsIEdTVF9UQUdfRU5DT0RFUn0sIHsKKyAgICAgIC8qIEVOQ09ERVJfU0VUVElOR1MgQSBsaXN0IG9mIHRoZSBzZXR0aW5ncyB1c2VkIGZvciBlbmNvZGluZyB0aGlzIGl0ZW0uIE5vIHNwZWNpZmljIGZvcm1hdC4gKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0JQUywgR1NUX1RBR19CSVRSQVRFfSwgeworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfQklUU1BTLCBHU1RfVEFHX0JJVFJBVEV9LCB7ICAgICAvKiBNYXRyb3NrYSBzcGVjIGRvZXMgTk9UIGhhdmUgdGhpcyB0YWchIER1bm5vIHdoYXQgaXQgd2FzIGRvaW5nIGhlcmUsIHByb2JhYmx5IGZvciBjb21wYXRpYmlsaXR5LiAqLworICAgICAgLyogV09OVEZJWCAoYWxyZWFkeSBoYW5kbGVkIGluIGFub3RoZXIgd2F5KTogRlBTIFRoZSBhdmVyYWdlIGZyYW1lcyBwZXIgc2Vjb25kIG9mIHRoZSBzcGVjaWZpZWQgaXRlbS4gVGhpcyBpcyB0eXBpY2FsbHkgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIEJsb2NrcyBwZXIgc2Vjb25kLiBJbiB0aGUgZXZlbnQgdGhhdCBsYWNpbmcgaXMgdXNlZCwgZWFjaCBsYWNlZCBjaHVuayBpcyB0byBiZSBjb3VudGVkIGFzIGEgc2VwZXJhdGUgZnJhbWUuICovCisgICAgR1NUX01BVFJPU0tBX1RBR19JRF9CUE0sIEdTVF9UQUdfQkVBVFNfUEVSX01JTlVURX0sIHsKKyAgICAgIC8qIE1FQVNVUkUgSW4gbXVzaWMsIGEgbWVhc3VyZSBpcyBhIHVuaXQgb2YgdGltZSBpbiBXZXN0ZXJuIG11c2ljIGxpa2UgIjQvNCIuIEl0IHJlcHJlc2VudHMgYSByZWd1bGFyIGdyb3VwaW5nIG9mIGJlYXRzLCBhIG1ldGVyLCBhcyBpbmRpY2F0ZWQgaW4gbXVzaWNhbCBub3RhdGlvbiBieSB0aGUgdGltZSBzaWduYXR1cmUuLiBUaGUgbWFqb3JpdHkgb2YgdGhlIGNvbnRlbXBvcmFyeSByb2NrIGFuZCBwb3AgbXVzaWMgeW91IGhlYXIgb24gdGhlIHJhZGlvIHRoZXNlIGRheXMgaXMgd3JpdHRlbiBpbiB0aGUgNC80IHRpbWUgc2lnbmF0dXJlLiAqLworICAgICAgLyogVFVOSU5HIEl0IGlzIHNhdmVkIGFzIGEgZnJlcXVlbmN5IGluIGhlcnR6IHRvIGFsbG93IG5lYXItcGVyZmVjdCB0dW5pbmcgb2YgaW5zdHJ1bWVudHMgdG8gdGhlIHNhbWUgdG9uZSBhcyB0aGUgbXVzaWNhbCBwaWVjZSAoZS5nLiAiNDQxLjM0IiBpbiBIZXJ0eikuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDQ0MC4wIEh6LiAqLworICAgICAgLyogVE9ETzogUkVQTEFZR0FJTl9HQUlOIFRoZSBnYWluIHRvIGFwcGx5IHRvIHJlYWNoIDg5ZEIgU1BMIG9uIHBsYXliYWNrLiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBSZXBsYXkgR2FpbiBzdGFuZGFyZC4gTm90ZSB0aGF0IFJlcGxheUdhaW4gaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGF0IGFsbCBUYXJnZXRUeXBlIGxldmVscyAodHJhY2ssIGFsYnVtLCBldGMpLiAqLworICAgICAgLyogVE9ETzogUkVQTEFZR0FJTl9QRUFLIFRoZSBtYXhpbXVtIGFic29sdXRlIHBlYWsgdmFsdWUgb2YgdGhlIGl0ZW0uIFRoaXMgaXMgYmFzZWQgb24gdGhlIFJlcGxheSBHYWluIHN0YW5kYXJkLiAqLworCisgICAgICAvKiBJZGVudGlmaWVycyAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfSVNSQywgR1NUX1RBR19JU1JDfSwgeworICAgICAgLyogTUNESSBUaGlzIGlzIGEgYmluYXJ5IGR1bXAgb2YgdGhlIFRPQyBvZiB0aGUgQ0RST00gdGhhdCB0aGlzIGl0ZW0gd2FzIHRha2VuIGZyb20uIFRoaXMgaG9sZHMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIE1DREkgaW4gSUQzLiAqLworICAgICAgLyogSVNCTiBJbnRlcm5hdGlvbmFsIFN0YW5kYXJkIEJvb2sgTnVtYmVyICovCisgICAgICAvKiBCQVJDT0RFIEVBTi0xMyAoRXVyb3BlYW4gQXJ0aWNsZSBOdW1iZXJpbmcpIG9yIFVQQy1BIChVbml2ZXJzYWwgUHJvZHVjdCBDb2RlKSBiYXIgY29kZSBpZGVudGlmaWVyICovCisgICAgICAvKiBDQVRBTE9HX05VTUJFUiBBIGxhYmVsLXNwZWNpZmljIHN0cmluZyB1c2VkIHRvIGlkZW50aWZ5IHRoZSByZWxlYXNlIChUSUMgMDEgZm9yIGV4YW1wbGUpLiAqLworICAgICAgLyogTEFCRUxfQ09ERSBBIDQtZGlnaXQgb3IgNS1kaWdpdCBudW1iZXIgdG8gaWRlbnRpZnkgdGhlIHJlY29yZCBsYWJlbCwgdHlwaWNhbGx5IHByaW50ZWQgYXMgKExDKSB4eHh4IG9yIChMQykgMHh4eHggb24gQ0RzIG1lZGlhcyBvciBjb3ZlcnMgKG9ubHkgdGhlIG51bWJlciBpcyBzdG9yZWQpLiAqLworICAgICAgLyogTENDTiBMaWJyYXJ5IG9mIENvbmdyZXNzIENvbnRyb2wgTnVtYmVyICovCisKKyAgICAgIC8qIENvbW1lcmNpYWwgKi8KKyAgICAgIC8qIFBVUkNIQVNFX0lURU0gVVJMIHRvIHB1cmNoYXNlIHRoaXMgZmlsZS4gVGhpcyBpcyBha2luIHRvIHRoZSBXUEFZIHRhZyBpbiBJRDMuICovCisgICAgICAvKiBQVVJDSEFTRV9JTkZPIEluZm9ybWF0aW9uIG9uIHdoZXJlIHRvIHB1cmNoYXNlIHRoaXMgYWxidW0uIFRoaXMgaXMgYWtpbiB0byB0aGUgV0NPTSB0YWcgaW4gSUQzLiAqLworICAgICAgLyogUFVSQ0hBU0VfT1dORVIgSW5mb3JtYXRpb24gb24gdGhlIHBlcnNvbiB3aG8gcHVyY2hhc2VkIHRoZSBmaWxlLiBUaGlzIGlzIGFraW4gdG8gdGhlIFRPV04gdGFnIGluIElEMy4gKi8KKyAgICAgIC8qIFBVUkNIQVNFX1BSSUNFIFRoZSBhbW91bnQgcGFpZCBmb3IgZW50aXR5LiBUaGVyZSBzaG91bGQgb25seSBiZSBhIG51bWVyaWMgdmFsdWUgaW4gaGVyZS4gT25seSBudW1iZXJzLCBubyBsZXR0ZXJzIG9yIHN5bWJvbHMgb3RoZXIgdGhhbiAiLiIuIEZvciBpbnN0YW5jZSwgeW91IHdvdWxkIHN0b3JlICIxNS41OSIgaW5zdGVhZCBvZiAiJDE1LjU5VVNEIi4gKi8KKyAgICAgIC8qIFBVUkNIQVNFX0NVUlJFTkNZIFRoZSBjdXJyZW5jeSB0eXBlIHVzZWQgdG8gcGF5IGZvciB0aGUgZW50aXR5LiBVc2UgSVNPLTQyMTcgZm9yIHRoZSAzIGxldHRlciBjdXJyZW5jeSBjb2RlLiAqLworCisgICAgICAvKiBMZWdhbCAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfQ09QWVJJR0hULCBHU1RfVEFHX0NPUFlSSUdIVH0sIHsKKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX1BST0RVQ1RJT05fQ09QWVJJR0hULCBHU1RfVEFHX0NPUFlSSUdIVH0sIHsgICAgIC8qIFRoZSBjb3B5cmlnaHQgaW5mb3JtYXRpb24gYXMgcGVyIHRoZSBwcm9kdWN0aW9uIGNvcHlyaWdodCBob2xkZXIuIFRoaXMgaXMgYWtpbiB0byB0aGUgVFBSTyB0YWcgaW4gSUQzLiAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfTElDRU5TRSwgR1NUX1RBR19MSUNFTlNFfSwgeyAgICAvKiBUaGUgbGljZW5zZSBhcHBsaWVkIHRvIHRoZSBjb250ZW50IChsaWtlIENyZWF0aXZlIENvbW1vbnMgdmFyaWFudHMpLiAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfVEVSTVNfT0ZfVVNFLCBHU1RfVEFHX0xJQ0VOU0V9CisgIH07CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QKKyAgeworICAgIGNvbnN0IGdjaGFyICptYXRyb3NrYV90YWduYW1lOworICAgIGNvbnN0IGdjaGFyICpnc3RyZWFtZXJfdGFnbmFtZTsKKyAgfQorICBjaGlsZF90YWdfY29udltdID0geworICAgIHsKKyAgICAiVElUTEUvU09SVF9XSVRIPSIsIEdTVF9UQUdfVElUTEVfU09SVE5BTUV9LCB7CisgICAgIkFSVElTVC9TT1JUX1dJVEg9IiwgR1NUX1RBR19BUlRJU1RfU09SVE5BTUV9LCB7CisgICAgICAvKiBBTEJVTS1zdHVmZiBpcyBoYW5kbGVkIGVsc2V3aGVyZSAqLworICAgICJDT01QT1NFUi9TT1JUX1dJVEg9IiwgR1NUX1RBR19USVRMRV9TT1JUTkFNRX0sIHsKKyAgICAiT1JJR0lOQUwvVVJMPSIsIEdTVF9UQUdfTE9DQVRJT059LCB7CisgICAgICAvKiBFTUFJTCwgUEhPTkUsIEZBWCBhbGwgY2FuIGJlIG1hcHBlZCB0byBHU1RfVEFHX0NPTlRBQ1QsIHRoZXJlIGlzIHNwZWNpYWwKKyAgICAgICAqIGNvZGUgZm9yIHRoYXQgbGF0ZXIuCisgICAgICAgKi8KKyAgICAiVElUTEUvVVJMPSIsIEdTVF9UQUdfSE9NRVBBR0V9LCB7CisgICAgIkFSVElTVC9VUkw9IiwgR1NUX1RBR19IT01FUEFHRX0sIHsKKyAgICAiQ09QWVJJR0hUL1VSTD0iLCBHU1RfVEFHX0NPUFlSSUdIVF9VUkl9LCB7CisgICAgIkxJQ0VOU0UvVVJMPSIsIEdTVF9UQUdfTElDRU5TRV9VUkl9LCB7CisgICAgIkxJQ0VOU0UvVVJMPSIsIEdTVF9UQUdfTElDRU5TRV9VUkl9CisgIH07CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBndWludDMyIGlkOworICBnY2hhciAqdmFsdWUgPSBOVUxMOworICBnY2hhciAqdGFnID0gTlVMTDsKKyAgZ2NoYXIgKm5hbWVfd2l0aF9wYXJlbnQgPSBOVUxMOworICBHc3RUYWdMaXN0ICpjaGlsZF90YWdsaXN0ID0gTlVMTDsKKworICBERUJVR19FTEVNRU5UX1NUQVJUIChjb21tb24sIGVibWwsICJTaW1wbGVUYWciKTsKKworICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfbWFzdGVyIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykgeworICAgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiU2ltcGxlVGFnIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgaWYgKHBhcmVudCkKKyAgICBjaGlsZF90YWdsaXN0ID0gKnBfdGFnbGlzdDsKKyAgZWxzZQorICAgIGNoaWxkX3RhZ2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgIC8qIHJlYWQgYWxsIHN1Yi1lbnRyaWVzICovCisKKyAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3BlZWtfaWQgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UQUdOQU1FOgorICAgICAgICBnX2ZyZWUgKHRhZyk7CisgICAgICAgIHRhZyA9IE5VTEw7CisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfYXNjaWkgKGVibWwsICZpZCwgJnRhZyk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIlRhZ05hbWU6ICVzIiwgR1NUX1NUUl9OVUxMICh0YWcpKTsKKyAgICAgICAgZ19mcmVlIChuYW1lX3dpdGhfcGFyZW50KTsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBOVUxMKQorICAgICAgICAgIG5hbWVfd2l0aF9wYXJlbnQgPSBnX3N0cmR1cF9wcmludGYgKCIlcy8lcyIsIHBhcmVudCwgdGFnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG5hbWVfd2l0aF9wYXJlbnQgPSBnX3N0cmR1cCAodGFnKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RBR1NUUklORzoKKyAgICAgICAgZ19mcmVlICh2YWx1ZSk7CisgICAgICAgIHZhbHVlID0gTlVMTDsKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF91dGY4IChlYm1sLCAmaWQsICZ2YWx1ZSk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIlRhZ1N0cmluZzogJXMiLAorICAgICAgICAgICAgR1NUX1NUUl9OVUxMICh2YWx1ZSkpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfU0lNUExFVEFHOgorICAgICAgICAvKiBSZWN1cnNpdmUgU2ltcGxlVGFnICovCisgICAgICAgIC8qIFRoaXMgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGFnIG5hbWUgb2YgX3RoaXNfIHRhZyB0byBiZSBrbm93bgorICAgICAgICAgKiBpbiBvcmRlciB0byByZWFkIGl0cyBjaGlsZHJlbi4gSXQncyBub3QgaW4gdGhlIHNwZWMsIGp1c3QgdGhlIHdheQorICAgICAgICAgKiB0aGUgY29kZSBpcyB3cml0dGVuLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKG5hbWVfd2l0aF9wYXJlbnQgIT0gTlVMTCkgeworICAgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9tZXRhZGF0YV9pZF9zaW1wbGVfdGFnIChjb21tb24sCisgICAgICAgICAgICAgIGVibWwsICZjaGlsZF90YWdsaXN0LCBuYW1lX3dpdGhfcGFyZW50KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX3NraXAgKGNvbW1vbiwgZWJtbCwgIlNpbXBsZVRhZyIsCisgICAgICAgICAgICBpZCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UQUdMQU5HVUFHRToKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RBR0RFRkFVTFQ6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UQUdCSU5BUlk6CisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfc2tpcCAoZWJtbCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiU2ltcGxlVGFnIiwgcmV0KTsKKworICBpZiAocGFyZW50ICYmIHRhZyAmJiB2YWx1ZSAmJiAqdmFsdWUgIT0gJ1wwJykgeworICAgIC8qIERvbid0IGJvdGhlciBtYXBwaW5nIGNoaWxkcmVuIHRhZ3MgLSBwYXJlbnQgd2lsbCBkbyB0aGF0ICovCisgICAgZ2NoYXIgKmtleV92YWw7CisgICAgLyogVE9ETzogcmVhZCBMQU5HVUFHRSBzdWItdGFnLCBhbmQgdXNlICJrZXlbbGNdPXZhbCIgZm9ybSAqLworICAgIGtleV92YWwgPSBnX3N0cmR1cF9wcmludGYgKCIlcz0lcyIsIG5hbWVfd2l0aF9wYXJlbnQsIHZhbHVlKTsKKyAgICBnc3RfdGFnX2xpc3RfYWRkICgqcF90YWdsaXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgR1NUX1RBR19FWFRFTkRFRF9DT01NRU5ULCBrZXlfdmFsLCBOVUxMKTsKKyAgICBnX2ZyZWUgKGtleV92YWwpOworICB9IGVsc2UgaWYgKHRhZyAmJiB2YWx1ZSAmJiAqdmFsdWUgIT0gJ1wwJykgeworICAgIGdib29sZWFuIG1hdGNoZWQgPSBGQUxTRTsKKyAgICBndWludCBpOworCisgICAgZm9yIChpID0gMDsgIW1hdGNoZWQgJiYgaSA8IEdfTl9FTEVNRU5UUyAodGFnX2NvbnYpOyBpKyspIHsKKyAgICAgIGNvbnN0IGdjaGFyICp0YWduYW1lX2dzdCA9IHRhZ19jb252W2ldLmdzdHJlYW1lcl90YWduYW1lOworCisgICAgICBjb25zdCBnY2hhciAqdGFnbmFtZV9ta3YgPSB0YWdfY29udltpXS5tYXRyb3NrYV90YWduYW1lOworCisgICAgICBpZiAoc3RyY21wICh0YWduYW1lX21rdiwgdGFnKSA9PSAwKSB7CisgICAgICAgIEdWYWx1ZSBkZXN0ID0geyAwLCB9OworICAgICAgICBHVHlwZSBkZXN0X3R5cGUgPSBnc3RfdGFnX2dldF90eXBlICh0YWduYW1lX2dzdCk7CisKKyAgICAgICAgLyogRW5zdXJlIHRoYXQgYW55IGRhdGUgc3RyaW5nIGlzIGNvbXBsZXRlICovCisgICAgICAgIGlmIChkZXN0X3R5cGUgPT0gR19UWVBFX0RBVEUpIHsKKyAgICAgICAgICBndWludCB5ZWFyID0gMTkwMSwgbW9udGggPSAxLCBkYXkgPSAxOworCisgICAgICAgICAgLyogRGF0ZXMgY2FuIGJlIHl5eXktTU0tZGQsIHl5eXktTU0gb3IgeXl5eSwgYnV0IHdlIG5lZWQKKyAgICAgICAgICAgKiB0aGUgZmlyc3QgdHlwZSAqLworICAgICAgICAgIGlmIChzc2NhbmYgKHZhbHVlLCAiJTA0dS0lMDJ1LSUwMnUiLCAmeWVhciwgJm1vbnRoLCAmZGF5KSAhPSAwKSB7CisgICAgICAgICAgICBnX2ZyZWUgKHZhbHVlKTsKKyAgICAgICAgICAgIHZhbHVlID0gZ19zdHJkdXBfcHJpbnRmICgiJTA0dS0lMDJ1LSUwMnUiLCB5ZWFyLCBtb250aCwgZGF5KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBnX3ZhbHVlX2luaXQgKCZkZXN0LCBkZXN0X3R5cGUpOworICAgICAgICBpZiAoZ3N0X3ZhbHVlX2Rlc2VyaWFsaXplICgmZGVzdCwgdmFsdWUpKSB7CisgICAgICAgICAgZ3N0X3RhZ19saXN0X2FkZF92YWx1ZXMgKCpwX3RhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAorICAgICAgICAgICAgICB0YWduYW1lX2dzdCwgJmRlc3QsIE5VTEwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiQ2FuJ3QgdHJhbnNmb3JtIHRhZyAnJXMnIHdpdGggIgorICAgICAgICAgICAgICAidmFsdWUgJyVzJyB0byB0YXJnZXQgdHlwZSAnJXMnIiwgdGFnLCB2YWx1ZSwKKyAgICAgICAgICAgICAgZ190eXBlX25hbWUgKGRlc3RfdHlwZSkpOworICAgICAgICB9CisgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZkZXN0KTsKKyAgICAgICAgbWF0Y2hlZCA9IFRSVUU7CisgICAgICB9CisgICAgfQorICAgIGlmICghbWF0Y2hlZCkgeworICAgICAgZ2NoYXIgKmtleV92YWw7CisgICAgICAvKiBUT0RPOiByZWFkIExBTkdVQUdFIHN1Yi10YWcsIGFuZCB1c2UgImtleVtsY109dmFsIiBmb3JtICovCisgICAgICBrZXlfdmFsID0gZ19zdHJkdXBfcHJpbnRmICgiJXM9JXMiLCB0YWcsIHZhbHVlKTsKKyAgICAgIGdzdF90YWdfbGlzdF9hZGQgKCpwX3RhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAorICAgICAgICAgIEdTVF9UQUdfRVhURU5ERURfQ09NTUVOVCwga2V5X3ZhbCwgTlVMTCk7CisgICAgICBnX2ZyZWUgKGtleV92YWwpOworICAgIH0KKyAgfQorCisgIGlmICghcGFyZW50KSB7CisgICAgLyogTWFwIGNoaWxkcmVuIHRhZ3MuIFRoaXMgb25seSBzdXBwb3J0cyB0b3AtYW5jaG9yZWQgbWFwcGluZy4gVGhhdCBpcywKKyAgICAgKiB3ZSBzdGFydCBhdCB0b3BsZXZlbCB0YWcgKHRoaXMgdGFnKSwgYW5kIHNlZSBob3cgaXRzIGNvbWJpbmF0aW9ucworICAgICAqIHdpdGggaXRzIGNoaWxkcmVuIGNhbiBiZSBtYXBwZWQuIFdoaWNoIG1lYW5zIHRoYXQgZ3JhbmRjaGlsZHJlbgorICAgICAqIGFyZSBhbHNvIGNvbWJpbmVkIGhlcmUsIHdpdGggX3RoaXNfIHRhZyB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uCisgICAgICogSWYgZ3JhbmRjaGlsZHJlbiBjYW4gYmUgY29tYmluZWQgb25seSB3aXRoIGNoaWxkcmVuLCB0aGF0IGNvbWJpbmF0aW9uCisgICAgICogd2lsbCBub3QgaGFwcGVuLgorICAgICAqLworICAgIGdpbnQgY2hpbGRfdGFnc19uID0gZ3N0X3RhZ19saXN0X25fdGFncyAoY2hpbGRfdGFnbGlzdCk7CisgICAgaWYgKGNoaWxkX3RhZ3NfbiA+IDApIHsKKyAgICAgIGdpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGlsZF90YWdzX247IGkrKykgeworICAgICAgICBnaW50IGo7CisgICAgICAgIGNvbnN0IGdjaGFyICpjaGlsZF9uYW1lID0gZ3N0X3RhZ19saXN0X250aF90YWdfbmFtZSAoY2hpbGRfdGFnbGlzdCwgaSk7CisgICAgICAgIGd1aW50IHRhZ2xlbiA9IGdzdF90YWdfbGlzdF9nZXRfdGFnX3NpemUgKGNoaWxkX3RhZ2xpc3QsIGNoaWxkX25hbWUpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgdGFnbGVuOyBqKyspIHsKKyAgICAgICAgICBnY2hhciAqdmFsOworICAgICAgICAgIGdib29sZWFuIG1hdGNoZWQgPSBGQUxTRTsKKyAgICAgICAgICBnY2hhciAqdmFsX3ByZSwgKnZhbF9wb3N0OworICAgICAgICAgIGdpbnQgazsKKworICAgICAgICAgIGlmICghZ3N0X3RhZ19saXN0X2dldF9zdHJpbmdfaW5kZXggKGNoaWxkX3RhZ2xpc3QsIGNoaWxkX25hbWUsCisgICAgICAgICAgICAgICAgICBqLCAmdmFsKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGlmICghc3RyY2hyICh2YWwsICc9JykpIHsKKyAgICAgICAgICAgIGdfZnJlZSAodmFsKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICB2YWxfcG9zdCA9IGdfc3RyZHVwIChzdHJjaHIgKHZhbCwgJz0nKSArIDEpOworICAgICAgICAgIHZhbF9wcmUgPSBnX3N0cmR1cCAodmFsKTsKKyAgICAgICAgICAqKHN0cmNociAodmFsX3ByZSwgJz0nKSArIDEpID0gJ1wwJzsKKworICAgICAgICAgIGZvciAoayA9IDA7ICFtYXRjaGVkICYmIGsgPCBHX05fRUxFTUVOVFMgKGNoaWxkX3RhZ19jb252KTsgaysrKSB7CisgICAgICAgICAgICBjb25zdCBnY2hhciAqdGFnbmFtZV9nc3QgPSBjaGlsZF90YWdfY29udltrXS5nc3RyZWFtZXJfdGFnbmFtZTsKKworICAgICAgICAgICAgY29uc3QgZ2NoYXIgKnRhZ25hbWVfbWt2ID0gY2hpbGRfdGFnX2NvbnZba10ubWF0cm9za2FfdGFnbmFtZTsKKworICAgICAgICAgICAgLyogVE9ETzogT25jZSAia2V5W2xjXT12YWx1ZSIgZm9ybSBzdXBwb3J0IGlzIGltcGxlbWVudGVkLAorICAgICAgICAgICAgICogc3RyaXAgW2xjXSBoZXJlLiBJdCBjYW4ndCBiZSB1c2VkIGluIGNvbWJpbmVkIHRhZ3MuCisgICAgICAgICAgICAgKiBJZiBhIHRhZyBpcyBub3QgY29tYmluZWQsIGxlYXZlIFtsY10gYXMgaXQgaXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChzdHJjbXAgKHRhZ25hbWVfbWt2LCB2YWxfcHJlKSA9PSAwKSB7CisgICAgICAgICAgICAgIEdWYWx1ZSBkZXN0ID0geyAwLCB9OworICAgICAgICAgICAgICBHVHlwZSBkZXN0X3R5cGUgPSBnc3RfdGFnX2dldF90eXBlICh0YWduYW1lX2dzdCk7CisKKyAgICAgICAgICAgICAgZ192YWx1ZV9pbml0ICgmZGVzdCwgZGVzdF90eXBlKTsKKyAgICAgICAgICAgICAgaWYgKGdzdF92YWx1ZV9kZXNlcmlhbGl6ZSAoJmRlc3QsIHZhbF9wb3N0KSkgeworICAgICAgICAgICAgICAgIGdzdF90YWdfbGlzdF9hZGRfdmFsdWVzICgqcF90YWdsaXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgICAgICAgICAgICAgdGFnbmFtZV9nc3QsICZkZXN0LCBOVUxMKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgICAgICAgICAgICAgIkNhbid0IHRyYW5zZm9ybSBjb21wbGV4IHRhZyAnJXMnICIgInRvIHRhcmdldCB0eXBlICclcyciLAorICAgICAgICAgICAgICAgICAgICB2YWwsIGdfdHlwZV9uYW1lIChkZXN0X3R5cGUpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmZGVzdCk7CisgICAgICAgICAgICAgIG1hdGNoZWQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIW1hdGNoZWQpIHsKKyAgICAgICAgICAgIGdjaGFyICpsYXN0X3NsYXNoID0gc3RycmNociAodmFsX3ByZSwgJy8nKTsKKyAgICAgICAgICAgIGlmIChsYXN0X3NsYXNoKSB7CisgICAgICAgICAgICAgIGxhc3Rfc2xhc2grKzsKKyAgICAgICAgICAgICAgaWYgKHN0cmNtcCAobGFzdF9zbGFzaCwgIkVNQUlMPSIpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgIHN0cmNtcCAobGFzdF9zbGFzaCwgIlBIT05FPSIpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgIHN0cmNtcCAobGFzdF9zbGFzaCwgIkFERFJFU1M9IikgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgc3RyY21wIChsYXN0X3NsYXNoLCAiRkFYPSIpID09IDApIHsKKyAgICAgICAgICAgICAgICBnc3RfdGFnX2xpc3RfYWRkICgqcF90YWdsaXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgICAgICAgICAgICAgR1NUX1RBR19DT05UQUNULCB2YWxfcG9zdCwgTlVMTCk7CisgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IFRSVUU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFtYXRjaGVkKQorICAgICAgICAgICAgZ3N0X3RhZ19saXN0X2FkZCAoKnBfdGFnbGlzdCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsCisgICAgICAgICAgICAgICAgR1NUX1RBR19FWFRFTkRFRF9DT01NRU5ULCB2YWwsIE5VTEwpOworICAgICAgICAgIGdfZnJlZSAodmFsX3Bvc3QpOworICAgICAgICAgIGdfZnJlZSAodmFsX3ByZSk7CisgICAgICAgICAgZ19mcmVlICh2YWwpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGdzdF90YWdfbGlzdF91bnJlZiAoY2hpbGRfdGFnbGlzdCk7CisgIH0KKworICBnX2ZyZWUgKHRhZyk7CisgIGdfZnJlZSAodmFsdWUpOworICBnX2ZyZWUgKG5hbWVfd2l0aF9wYXJlbnQpOworCisgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9jb3VudF9zdHJlYW1zIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgZ2ludCAqIGEsIGdpbnQgKiB2LCBnaW50ICogcykKK3sKKyAgZ2ludCBpOworICBnaW50IHZpZGVvX3N0cmVhbXMgPSAwLCBhdWRpb19zdHJlYW1zID0gMCwgc3VidGl0bGVfc3RyZWFtcyA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IGNvbW1vbi0+c3JjLT5sZW47IGkrKykgeworICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpzdHJlYW07CisKKyAgICBzdHJlYW0gPSBnX3B0cl9hcnJheV9pbmRleCAoY29tbW9uLT5zcmMsIGkpOworICAgIGlmIChzdHJlYW0tPnR5cGUgPT0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfVklERU8pCisgICAgICB2aWRlb19zdHJlYW1zICs9IDE7CisgICAgZWxzZSBpZiAoc3RyZWFtLT50eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX0FVRElPKQorICAgICAgYXVkaW9fc3RyZWFtcyArPSAxOworICAgIGVsc2UgaWYgKHN0cmVhbS0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9TVUJUSVRMRSkKKyAgICAgIHN1YnRpdGxlX3N0cmVhbXMgKz0gMTsKKyAgfQorICAqdiA9IHZpZGVvX3N0cmVhbXM7CisgICphID0gYXVkaW9fc3RyZWFtczsKKyAgKnMgPSBzdWJ0aXRsZV9zdHJlYW1zOworfQorCisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fYXBwbHlfdGFyZ2V0X3R5cGVfZm9yZWFjaCAoY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsCisgICAgY29uc3QgZ2NoYXIgKiB0YWcsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZ3VpbnQgdmFsbGVuOworICBndWludCBpOworICBUYXJnZXRUeXBlQ29udGV4dCAqY3R4ID0gKFRhcmdldFR5cGVDb250ZXh0ICopIHVzZXJfZGF0YTsKKworICB2YWxsZW4gPSBnc3RfdGFnX2xpc3RfZ2V0X3RhZ19zaXplIChsaXN0LCB0YWcpOworICBpZiAodmFsbGVuID09IDApCisgICAgcmV0dXJuOworCisgIGZvciAoaSA9IDA7IGkgPCB2YWxsZW47IGkrKykgeworICAgIGNvbnN0IEdWYWx1ZSAqdmFsX3JlZjsKKworICAgIHZhbF9yZWYgPSBnc3RfdGFnX2xpc3RfZ2V0X3ZhbHVlX2luZGV4IChsaXN0LCB0YWcsIGkpOworICAgIGlmICh2YWxfcmVmID09IE5VTEwpCisgICAgICBjb250aW51ZTsKKworICAgIC8qIFRPRE86IHVzZSB0aGUgb3B0aW9uYWwgY3R4LT50YXJnZXRfdHlwZSBzb21laG93ICovCisgICAgaWYgKHN0cmNtcCAodGFnLCBHU1RfVEFHX1RJVExFKSA9PSAwKSB7CisgICAgICBpZiAoY3R4LT50YXJnZXRfdHlwZV92YWx1ZSA+PSA3MCAmJiAhY3R4LT5hdWRpb19vbmx5KSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGRfdmFsdWUgKGN0eC0+cmVzdWx0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgICAgIEdTVF9UQUdfU0hPV19OQU1FLCB2YWxfcmVmKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgaWYgKGN0eC0+dGFyZ2V0X3R5cGVfdmFsdWUgPj0gNTApIHsKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZF92YWx1ZSAoY3R4LT5yZXN1bHQsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAorICAgICAgICAgICAgR1NUX1RBR19USVRMRSwgdmFsX3JlZik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfVElUTEVfU09SVE5BTUUpID09IDApIHsKKyAgICAgIGlmIChjdHgtPnRhcmdldF90eXBlX3ZhbHVlID49IDcwICYmICFjdHgtPmF1ZGlvX29ubHkpIHsKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZF92YWx1ZSAoY3R4LT5yZXN1bHQsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAorICAgICAgICAgICAgR1NUX1RBR19TSE9XX1NPUlROQU1FLCB2YWxfcmVmKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgaWYgKGN0eC0+dGFyZ2V0X3R5cGVfdmFsdWUgPj0gNTApIHsKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZF92YWx1ZSAoY3R4LT5yZXN1bHQsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAorICAgICAgICAgICAgR1NUX1RBR19USVRMRV9TT1JUTkFNRSwgdmFsX3JlZik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfQVJUSVNUKSA9PSAwKSB7CisgICAgICBpZiAoY3R4LT50YXJnZXRfdHlwZV92YWx1ZSA+PSA1MCkgeworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkX3ZhbHVlIChjdHgtPnJlc3VsdCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsCisgICAgICAgICAgICBHU1RfVEFHX0FSVElTVCwgdmFsX3JlZik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfQVJUSVNUX1NPUlROQU1FKSA9PSAwKSB7CisgICAgICBpZiAoY3R4LT50YXJnZXRfdHlwZV92YWx1ZSA+PSA1MCkgeworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkX3ZhbHVlIChjdHgtPnJlc3VsdCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsCisgICAgICAgICAgICBHU1RfVEFHX0FSVElTVF9TT1JUTkFNRSwgdmFsX3JlZik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfVFJBQ0tfQ09VTlQpID09IDApIHsKKyAgICAgIGlmIChjdHgtPnRhcmdldF90eXBlX3ZhbHVlID49IDYwKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGRfdmFsdWUgKGN0eC0+cmVzdWx0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgICAgIEdTVF9UQUdfQUxCVU1fVk9MVU1FX0NPVU5ULCB2YWxfcmVmKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChzdHJjbXAgKHRhZywgR1NUX1RBR19UUkFDS19OVU1CRVIpID09IDApIHsKKyAgICAgIGlmIChjdHgtPnRhcmdldF90eXBlX3ZhbHVlID49IDYwICYmICFjdHgtPmF1ZGlvX29ubHkpIHsKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZF92YWx1ZSAoY3R4LT5yZXN1bHQsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAorICAgICAgICAgICAgR1NUX1RBR19TSE9XX1NFQVNPTl9OVU1CRVIsIHZhbF9yZWYpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSBpZiAoY3R4LT50YXJnZXRfdHlwZV92YWx1ZSA+PSA1MCAmJiAhY3R4LT5hdWRpb19vbmx5KSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGRfdmFsdWUgKGN0eC0+cmVzdWx0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgICAgIEdTVF9UQUdfU0hPV19FUElTT0RFX05VTUJFUiwgdmFsX3JlZik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIGlmIChjdHgtPnRhcmdldF90eXBlX3ZhbHVlID49IDUwKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGRfdmFsdWUgKGN0eC0+cmVzdWx0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgICAgIEdTVF9UQUdfQUxCVU1fVk9MVU1FX05VTUJFUiwgdmFsX3JlZik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgICBnc3RfdGFnX2xpc3RfYWRkX3ZhbHVlIChjdHgtPnJlc3VsdCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsIHRhZywgdmFsX3JlZik7CisgIH0KK30KKworCitzdGF0aWMgR3N0VGFnTGlzdCAqCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fYXBwbHlfdGFyZ2V0X3R5cGUgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGNvbW1vbiwKKyAgICBHc3RUYWdMaXN0ICogdGFnbGlzdCwgZ3VpbnQ2NCB0YXJnZXRfdHlwZV92YWx1ZSwgZ2NoYXIgKiB0YXJnZXRfdHlwZSkKK3sKKyAgVGFyZ2V0VHlwZUNvbnRleHQgY3R4OworICBnaW50IGEgPSAwOworICBnaW50IHYgPSAwOworICBnaW50IHMgPSAwOworCisgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9jb3VudF9zdHJlYW1zIChjb21tb24sICZhLCAmdiwgJnMpOworCisgIGN0eC5hdWRpb19vbmx5ID0gKGEgPiAwICYmIHYgPT0gMCAmJiBzID09IDApOworICBjdHgucmVzdWx0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgY3R4LnRhcmdldF90eXBlX3ZhbHVlID0gdGFyZ2V0X3R5cGVfdmFsdWU7CisgIGN0eC50YXJnZXRfdHlwZSA9IHRhcmdldF90eXBlOworCisgIGdzdF90YWdfbGlzdF9mb3JlYWNoICh0YWdsaXN0LAorICAgICAgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2FwcGx5X3RhcmdldF90eXBlX2ZvcmVhY2gsICZjdHgpOworCisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnbGlzdCk7CisgIHJldHVybiBjdHgucmVzdWx0OworfQorCisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfbWV0YWRhdGFfaWRfdGFnIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sLCBHc3RUYWdMaXN0ICoqIHBfdGFnbGlzdCkKK3sKKyAgZ3VpbnQzMiBpZDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdBcnJheSAqY2hhcHRlcl90YXJnZXRzLCAqZWRpdGlvbl90YXJnZXRzLCAqdHJhY2tfdGFyZ2V0czsKKyAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKyAgR0xpc3QgKmN1ciwgKmludGVybmFsX2N1cjsKKyAgZ3VpbnQ2NCB0YXJnZXRfdHlwZV92YWx1ZSA9IDUwOworICBnY2hhciAqdGFyZ2V0X3R5cGUgPSBOVUxMOworCisgIERFQlVHX0VMRU1FTlRfU1RBUlQgKGNvbW1vbiwgZWJtbCwgIlRhZyIpOworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJUYWciLCByZXQpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICBlZGl0aW9uX3RhcmdldHMgPSBnX2FycmF5X25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKGd1aW50NjQpKTsKKyAgY2hhcHRlcl90YXJnZXRzID0gZ19hcnJheV9uZXcgKEZBTFNFLCBGQUxTRSwgc2l6ZW9mIChndWludDY0KSk7CisgIHRyYWNrX3RhcmdldHMgPSBnX2FycmF5X25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKGd1aW50NjQpKTsKKyAgdGFnbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIHRhcmdldF90eXBlID0gTlVMTDsKKworICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmIGdzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoZWJtbCwgMSwgVFJVRSkpIHsKKyAgICAvKiByZWFkIGFsbCBzdWItZW50cmllcyAqLworCisgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworCisgICAgc3dpdGNoIChpZCkgeworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfU0lNUExFVEFHOgorICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfbWV0YWRhdGFfaWRfc2ltcGxlX3RhZyAoY29tbW9uLAorICAgICAgICAgICAgZWJtbCwgJnRhZ2xpc3QsIE5VTEwpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVEFSR0VUUzoKKyAgICAgICAgZ19mcmVlICh0YXJnZXRfdHlwZSk7CisgICAgICAgIHRhcmdldF90eXBlID0gTlVMTDsKKyAgICAgICAgdGFyZ2V0X3R5cGVfdmFsdWUgPSA1MDsKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX21ldGFkYXRhX3RhcmdldHMgKGNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgIGVkaXRpb25fdGFyZ2V0cywgY2hhcHRlcl90YXJnZXRzLCB0cmFja190YXJnZXRzLAorICAgICAgICAgICAgJnRhcmdldF90eXBlX3ZhbHVlLCAmdGFyZ2V0X3R5cGUpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX3NraXAgKGNvbW1vbiwgZWJtbCwgIlRhZyIsIGlkKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJUYWciLCByZXQpOworCisgIHRhZ2xpc3QgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fYXBwbHlfdGFyZ2V0X3R5cGUgKGNvbW1vbiwgdGFnbGlzdCwKKyAgICAgIHRhcmdldF90eXBlX3ZhbHVlLCB0YXJnZXRfdHlwZSk7CisgIGdfZnJlZSAodGFyZ2V0X3R5cGUpOworCisgIC8qIGlmIHRhZyBpcyBjaGFwdGVyL2VkaXRpb24gc3BlY2lmaWMgLSB0cnkgdG8gZmluZCB0aGF0IGVudHJ5ICovCisgIGlmIChHX1VOTElLRUxZIChjaGFwdGVyX3RhcmdldHMtPmxlbiA+IDAgfHwgZWRpdGlvbl90YXJnZXRzLT5sZW4gPiAwIHx8CisgICAgICAgICAgdHJhY2tfdGFyZ2V0cy0+bGVuID4gMCkpIHsKKyAgICBnaW50IGk7CisgICAgaWYgKGNoYXB0ZXJfdGFyZ2V0cy0+bGVuID4gMCB8fCBlZGl0aW9uX3RhcmdldHMtPmxlbiA+IDApIHsKKyAgICAgIGlmIChjb21tb24tPnRvYyA9PSBOVUxMKQorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgICAgICJGb3VuZCBjaGFwdGVyL2VkaXRpb24gc3BlY2lmaWMgdGFnLCBidXQgVE9DIGlzIG5vdCBwcmVzZW50Iik7CisgICAgICBlbHNlIHsKKyAgICAgICAgY3VyID0gZ3N0X3RvY19nZXRfZW50cmllcyAoY29tbW9uLT50b2MpOworICAgICAgICBpbnRlcm5hbF9jdXIgPSBnc3RfdG9jX2dldF9lbnRyaWVzIChjb21tb24tPmludGVybmFsX3RvYyk7CisgICAgICAgIHdoaWxlIChjdXIgIT0gTlVMTCAmJiBpbnRlcm5hbF9jdXIgIT0gTlVMTCkgeworICAgICAgICAgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV90b2NfdGFnIChjdXItPmRhdGEsIGludGVybmFsX2N1ci0+ZGF0YSwKKyAgICAgICAgICAgICAgZWRpdGlvbl90YXJnZXRzLCBjaGFwdGVyX3RhcmdldHMsIHRhZ2xpc3QpOworICAgICAgICAgIGN1ciA9IGN1ci0+bmV4dDsKKyAgICAgICAgICBpbnRlcm5hbF9jdXIgPSBpbnRlcm5hbF9jdXItPm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgY29tbW9uLT50b2NfdXBkYXRlZCA9IFRSVUU7CisgICAgICB9CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCB0cmFja190YXJnZXRzLT5sZW47IGkrKykgeworICAgICAgZ2ludCBqOworICAgICAgZ2Jvb2xlYW4gZm91bmQgPSBGQUxTRTsKKyAgICAgIGd1aW50NjQgdGd0ID0gZ19hcnJheV9pbmRleCAodHJhY2tfdGFyZ2V0cywgZ3VpbnQ2NCwgaSk7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCBjb21tb24tPnNyYy0+bGVuOyBqKyspIHsKKyAgICAgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKnN0cmVhbSA9IGdfcHRyX2FycmF5X2luZGV4IChjb21tb24tPnNyYywgaik7CisKKyAgICAgICAgaWYgKHN0cmVhbS0+dWlkID09IHRndCkgeworICAgICAgICAgIGdzdF90YWdfbGlzdF9pbnNlcnQgKHN0cmVhbS0+dGFncywgdGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFKTsKKyAgICAgICAgICBzdHJlYW0tPnRhZ3NfY2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgIC8qIENhY2hlIHRoZSB0cmFjayB0YWdsaXN0OiBwb3NzaWJseSBiZWxvbmdzIHRvIGEgdHJhY2sgdGhhdCB3aWxsIGJlIHBhcnNlZAorICAgICAgICAgICBsYXRlciBpbiBnc3RfbWF0cm9za2FfZGVtdXguYzpnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSAoLi4uKSAqLworICAgICAgICBncG9pbnRlciB0cmFja191aWQgPSBHVUlOVF9UT19QT0lOVEVSICh0Z3QpOworICAgICAgICBHc3RUYWdMaXN0ICpjYWNoZWRfdGFnbGlzdCA9CisgICAgICAgICAgICBnX2hhc2hfdGFibGVfbG9va3VwIChjb21tb24tPmNhY2hlZF90cmFja190YWdsaXN0cywgdHJhY2tfdWlkKTsKKyAgICAgICAgaWYgKGNhY2hlZF90YWdsaXN0KQorICAgICAgICAgIGdzdF90YWdfbGlzdF9pbnNlcnQgKGNhY2hlZF90YWdsaXN0LCB0YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBnc3RfdGFnX2xpc3RfcmVmICh0YWdsaXN0KTsKKyAgICAgICAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChjb21tb24tPmNhY2hlZF90cmFja190YWdsaXN0cywgdHJhY2tfdWlkLAorICAgICAgICAgICAgICB0YWdsaXN0KTsKKyAgICAgICAgfQorICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsCisgICAgICAgICAgICAiRm91bmQgdHJhY2stc3BlY2lmaWMgdGFnKHMpLCBidXQgdHJhY2sgJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAgICAgIiBpcyBub3Qga25vd24geWV0LCBjYWNoaW5nIiwgdGd0KTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZQorICAgIGdzdF90YWdfbGlzdF9pbnNlcnQgKCpwX3RhZ2xpc3QsIHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5EKTsKKworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ2xpc3QpOworICBnX2FycmF5X3VucmVmIChjaGFwdGVyX3RhcmdldHMpOworICBnX2FycmF5X3VucmVmIChlZGl0aW9uX3RhcmdldHMpOworICBnX2FycmF5X3VucmVmICh0cmFja190YXJnZXRzKTsKKworICByZXR1cm4gcmV0OworfQorCitHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfbWV0YWRhdGEgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGNvbW1vbiwKKyAgICBHc3RFbGVtZW50ICogZWwsIEdzdEVibWxSZWFkICogZWJtbCkKK3sKKyAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ3VpbnQzMiBpZDsKKyAgR0xpc3QgKmw7CisgIGd1aW50NjQgY3VycG9zOworCisgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBwYXJzZSBhIHRhZ3MgZWxlbWVudCB0d2ljZSBhbmQKKyAgICogcG9zdCBpdCdzIHRhZ3MgdHdpY2UgKi8KKyAgY3VycG9zID0gZ3N0X2VibWxfcmVhZF9nZXRfcG9zIChlYm1sKTsKKyAgZm9yIChsID0gY29tbW9uLT50YWdzX3BhcnNlZDsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICBndWludDY0ICpwb3MgPSBsLT5kYXRhOworCisgICAgaWYgKCpwb3MgPT0gY3VycG9zKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsCisgICAgICAgICAgIlNraXBwaW5nIGFscmVhZHkgcGFyc2VkIFRhZ3MgYXQgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIGN1cnBvcyk7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgICAgfQorICB9CisKKyAgY29tbW9uLT50YWdzX3BhcnNlZCA9CisgICAgICBnX2xpc3RfcHJlcGVuZCAoY29tbW9uLT50YWdzX3BhcnNlZCwgZ19zbGljZV9uZXcgKGd1aW50NjQpKTsKKyAgKigoZ3VpbnQ2NCAqKSBjb21tb24tPnRhZ3NfcGFyc2VkLT5kYXRhKSA9IGN1cnBvczsKKyAgLyogZmFsbC10aHJvdWdoICovCisKKyAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICBERUJVR19FTEVNRU5UX1NUT1AgKGNvbW1vbiwgZWJtbCwgIlRhZ3MiLCByZXQpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICB0YWdsaXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZ3N0X3RhZ19saXN0X3NldF9zY29wZSAodGFnbGlzdCwgR1NUX1RBR19TQ09QRV9HTE9CQUwpOworICBjb21tb24tPnRvY191cGRhdGVkID0gRkFMU0U7CisKKyAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSyAmJiBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworCisgICAgc3dpdGNoIChpZCkgeworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVEFHOgorICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfbWV0YWRhdGFfaWRfdGFnIChjb21tb24sIGVibWwsCisgICAgICAgICAgICAmdGFnbGlzdCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2Vfc2tpcCAoY29tbW9uLCBlYm1sLCAiVGFncyIsIGlkKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIEZJWE1FOiBVc2UgdG8gbGltaXQgdGhlIHRhZ3MgdG8gc3BlY2lmaWMgcGFkcyAqLworICAgIH0KKyAgfQorCisgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiVGFncyIsIHJldCk7CisKKyAgaWYgKEdfTElLRUxZICghZ3N0X3RhZ19saXN0X2lzX2VtcHR5ICh0YWdsaXN0KSkpCisgICAgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2ZvdW5kX2dsb2JhbF90YWcgKGNvbW1vbiwgZWwsIHRhZ2xpc3QpOworICBlbHNlCisgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdsaXN0KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BlZWtfYWRhcHRlciAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLCBndWludAorICAgIHBlZWssIGNvbnN0IGd1aW50OCAqKiBkYXRhKQoreworICAvKiBDYWxsZXIgbmVlZHMgdG8gZ3N0X2FkYXB0ZXJfdW5tYXAuICovCisgICpkYXRhID0gZ3N0X2FkYXB0ZXJfbWFwIChjb21tb24tPmFkYXB0ZXIsIHBlZWspOworICBpZiAoKmRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm4gR1NUX0ZMT1dfRU9TOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworLyoKKyAqIENhbGxzIHB1bGxfcmFuZ2UgZm9yIChvZmZzZXQsc2l6ZSkgd2l0aG91dCBhZHZhbmNpbmcgb3VyIG9mZnNldAorICovCitHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGVla19ieXRlcyAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLCBndWludDY0CisgICAgb2Zmc2V0LCBndWludCBzaXplLCBHc3RCdWZmZXIgKiogcF9idWYsIGd1aW50OCAqKiBieXRlcykKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgLyogQ2FjaGluZyBoZXJlIGFjdHVhbGx5IG1ha2VzIG11Y2ggbGVzcyBkaWZmZXJlbmNlIHRoYW4gb25lIHdvdWxkIGV4cGVjdC4KKyAgICogV2UgZG8gaXQgbWFpbmx5IHRvIGF2b2lkIHB1bGxpbmcgYnVmZmVycyBvZiAxIGJ5dGUgYWxsIHRoZSB0aW1lICovCisgIGlmIChjb21tb24tPmNhY2hlZF9idWZmZXIpIHsKKyAgICBndWludDY0IGNhY2hlX29mZnNldCA9IEdTVF9CVUZGRVJfT0ZGU0VUIChjb21tb24tPmNhY2hlZF9idWZmZXIpOworICAgIGdzaXplIGNhY2hlX3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChjb21tb24tPmNhY2hlZF9idWZmZXIpOworCisgICAgaWYgKGNhY2hlX29mZnNldCA8PSBjb21tb24tPm9mZnNldCAmJgorICAgICAgICAoY29tbW9uLT5vZmZzZXQgKyBzaXplKSA8PSAoY2FjaGVfb2Zmc2V0ICsgY2FjaGVfc2l6ZSkpIHsKKyAgICAgIGlmIChwX2J1ZikKKyAgICAgICAgKnBfYnVmID0gZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAoY29tbW9uLT5jYWNoZWRfYnVmZmVyLAorICAgICAgICAgICAgR1NUX0JVRkZFUl9DT1BZX0FMTCwgY29tbW9uLT5vZmZzZXQgLSBjYWNoZV9vZmZzZXQsIHNpemUpOworICAgICAgaWYgKGJ5dGVzKSB7CisgICAgICAgIGlmICghY29tbW9uLT5jYWNoZWRfZGF0YSkgeworICAgICAgICAgIGdzdF9idWZmZXJfbWFwIChjb21tb24tPmNhY2hlZF9idWZmZXIsICZjb21tb24tPmNhY2hlZF9tYXAsCisgICAgICAgICAgICAgIEdTVF9NQVBfUkVBRCk7CisgICAgICAgICAgY29tbW9uLT5jYWNoZWRfZGF0YSA9IGNvbW1vbi0+Y2FjaGVkX21hcC5kYXRhOworICAgICAgICB9CisgICAgICAgICpieXRlcyA9IGNvbW1vbi0+Y2FjaGVkX2RhdGEgKyBjb21tb24tPm9mZnNldCAtIGNhY2hlX29mZnNldDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgICB9CisgICAgLyogbm90IGVub3VnaCBkYXRhIGluIHRoZSBjYWNoZSwgZnJlZSBjYWNoZSBhbmQgZ2V0IGEgbmV3IG9uZSAqLworICAgIGlmIChjb21tb24tPmNhY2hlZF9kYXRhKSB7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChjb21tb24tPmNhY2hlZF9idWZmZXIsICZjb21tb24tPmNhY2hlZF9tYXApOworICAgICAgY29tbW9uLT5jYWNoZWRfZGF0YSA9IE5VTEw7CisgICAgfQorICAgIGdzdF9idWZmZXJfdW5yZWYgKGNvbW1vbi0+Y2FjaGVkX2J1ZmZlcik7CisgICAgY29tbW9uLT5jYWNoZWRfYnVmZmVyID0gTlVMTDsKKyAgfQorCisgIC8qIHJlZmlsbCB0aGUgY2FjaGUgKi8KKyAgcmV0ID0gZ3N0X3BhZF9wdWxsX3JhbmdlIChjb21tb24tPnNpbmtwYWQsIGNvbW1vbi0+b2Zmc2V0LAorICAgICAgTUFYIChzaXplLCA2NCAqIDEwMjQpLCAmY29tbW9uLT5jYWNoZWRfYnVmZmVyKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgIGNvbW1vbi0+Y2FjaGVkX2J1ZmZlciA9IE5VTEw7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIGlmIChnc3RfYnVmZmVyX2dldF9zaXplIChjb21tb24tPmNhY2hlZF9idWZmZXIpID49IHNpemUpIHsKKyAgICBpZiAocF9idWYpCisgICAgICAqcF9idWYgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChjb21tb24tPmNhY2hlZF9idWZmZXIsCisgICAgICAgICAgR1NUX0JVRkZFUl9DT1BZX0FMTCwgMCwgc2l6ZSk7CisgICAgaWYgKGJ5dGVzKSB7CisgICAgICBnc3RfYnVmZmVyX21hcCAoY29tbW9uLT5jYWNoZWRfYnVmZmVyLCAmY29tbW9uLT5jYWNoZWRfbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgY29tbW9uLT5jYWNoZWRfZGF0YSA9IGNvbW1vbi0+Y2FjaGVkX21hcC5kYXRhOworICAgICAgKmJ5dGVzID0gY29tbW9uLT5jYWNoZWRfZGF0YTsKKyAgICB9CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CisKKyAgLyogTm90IHBvc3NpYmxlIHRvIGdldCBlbm91Z2ggZGF0YSwgdHJ5IGEgbGFzdCB0aW1lIHdpdGgKKyAgICogcmVxdWVzdGluZyBleGFjdGx5IHRoZSBzaXplIHdlIG5lZWQgKi8KKyAgZ3N0X2J1ZmZlcl91bnJlZiAoY29tbW9uLT5jYWNoZWRfYnVmZmVyKTsKKyAgY29tbW9uLT5jYWNoZWRfYnVmZmVyID0gTlVMTDsKKworICByZXQgPQorICAgICAgZ3N0X3BhZF9wdWxsX3JhbmdlIChjb21tb24tPnNpbmtwYWQsIGNvbW1vbi0+b2Zmc2V0LCBzaXplLAorICAgICAgJmNvbW1vbi0+Y2FjaGVkX2J1ZmZlcik7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJwdWxsX3JhbmdlIHJldHVybmVkICVkIiwgcmV0KTsKKyAgICBpZiAocF9idWYpCisgICAgICAqcF9idWYgPSBOVUxMOworICAgIGlmIChieXRlcykKKyAgICAgICpieXRlcyA9IE5VTEw7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIGlmIChnc3RfYnVmZmVyX2dldF9zaXplIChjb21tb24tPmNhY2hlZF9idWZmZXIpIDwgc2l6ZSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiRHJvcHBpbmcgc2hvcnQgYnVmZmVyIGF0IG9mZnNldCAlIgorICAgICAgICBHX0dVSU5UNjRfRk9STUFUICI6IHdhbnRlZCAldSBieXRlcywgZ290ICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMiLAorICAgICAgICBjb21tb24tPm9mZnNldCwgc2l6ZSwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoY29tbW9uLT5jYWNoZWRfYnVmZmVyKSk7CisKKyAgICBnc3RfYnVmZmVyX3VucmVmIChjb21tb24tPmNhY2hlZF9idWZmZXIpOworICAgIGNvbW1vbi0+Y2FjaGVkX2J1ZmZlciA9IE5VTEw7CisgICAgaWYgKHBfYnVmKQorICAgICAgKnBfYnVmID0gTlVMTDsKKyAgICBpZiAoYnl0ZXMpCisgICAgICAqYnl0ZXMgPSBOVUxMOworICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisgIH0KKworICBpZiAocF9idWYpCisgICAgKnBfYnVmID0gZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAoY29tbW9uLT5jYWNoZWRfYnVmZmVyLAorICAgICAgICBHU1RfQlVGRkVSX0NPUFlfQUxMLCAwLCBzaXplKTsKKyAgaWYgKGJ5dGVzKSB7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKGNvbW1vbi0+Y2FjaGVkX2J1ZmZlciwgJmNvbW1vbi0+Y2FjaGVkX21hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBjb21tb24tPmNhY2hlZF9kYXRhID0gY29tbW9uLT5jYWNoZWRfbWFwLmRhdGE7CisgICAgKmJ5dGVzID0gY29tbW9uLT5jYWNoZWRfZGF0YTsKKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wZWVrX3B1bGwgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGNvbW1vbiwgZ3VpbnQgcGVlaywKKyAgICBndWludDggKiogZGF0YSkKK3sKKyAgcmV0dXJuIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wZWVrX2J5dGVzIChjb21tb24sIGNvbW1vbi0+b2Zmc2V0LCBwZWVrLAorICAgICAgTlVMTCwgZGF0YSk7Cit9CisKK0dzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wZWVrX2lkX2xlbmd0aF9wdWxsIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0RWxlbWVudCAqIGVsLCBndWludDMyICogX2lkLCBndWludDY0ICogX2xlbmd0aCwgZ3VpbnQgKiBfbmVlZGVkKQoreworICByZXR1cm4gZ3N0X2VibWxfcGVla19pZF9sZW5ndGggKF9pZCwgX2xlbmd0aCwgX25lZWRlZCwKKyAgICAgIChHc3RQZWVrRGF0YSkgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BlZWtfcHVsbCwgKGdwb2ludGVyKSBjb21tb24sIGVsLAorICAgICAgY29tbW9uLT5vZmZzZXQpOworfQorCitHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGVla19pZF9sZW5ndGhfcHVzaCAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLAorICAgIEdzdEVsZW1lbnQgKiBlbCwgZ3VpbnQzMiAqIF9pZCwgZ3VpbnQ2NCAqIF9sZW5ndGgsIGd1aW50ICogX25lZWRlZCkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgcmV0ID0gZ3N0X2VibWxfcGVla19pZF9sZW5ndGggKF9pZCwgX2xlbmd0aCwgX25lZWRlZCwKKyAgICAgIChHc3RQZWVrRGF0YSkgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BlZWtfYWRhcHRlciwgKGdwb2ludGVyKSBjb21tb24sCisgICAgICBlbCwgY29tbW9uLT5vZmZzZXQpOworCisgIGdzdF9hZGFwdGVyX3VubWFwIChjb21tb24tPmFkYXB0ZXIpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcmVhZF90cmFja19lbmNvZGluZyAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLAorICAgIEdzdEVibWxSZWFkICogZWJtbCwgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBjb250ZXh0KQoreworICBHc3RNYXRyb3NrYVRyYWNrRW5jb2RpbmcgZW5jID0geyAwLCB9OworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ3VpbnQzMiBpZDsKKworICBERUJVR19FTEVNRU5UX1NUQVJUIChjb21tb24sIGVibWwsICJDb250ZW50RW5jb2RpbmciKTsKKyAgLyogU2V0IGRlZmF1bHQgdmFsdWVzICovCisgIGVuYy5zY29wZSA9IDE7CisgIC8qIEFsbCBvdGhlciBkZWZhdWx0IHZhbHVlcyBhcmUgMCAqLworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJDb250ZW50RW5jb2RpbmciLCByZXQpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmIGdzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoZWJtbCwgMSwgVFJVRSkpIHsKKyAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3BlZWtfaWQgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DT05URU5URU5DT0RJTkdPUkRFUjp7CisgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoIWdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9lbmNvZGluZ19vcmRlcl91bmlxdWUgKGNvbnRleHQtPmVuY29kaW5ncywKKyAgICAgICAgICAgICAgICBudW0pKSB7CisgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAgICAgICAiQ29udGVudEVuY29kaW5nT3JkZXIgJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAgICAgICAiaXMgbm90IHVuaXF1ZSBmb3IgdHJhY2sgJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtLCBjb250ZXh0LT5udW0pOworICAgICAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAgICAgIkNvbnRlbnRFbmNvZGluZ09yZGVyOiAlIiBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICBlbmMub3JkZXIgPSBudW07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ09OVEVOVEVOQ09ESU5HU0NPUEU6eworICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG51bSA+IDcgfHwgbnVtID09IDApIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJJbnZhbGlkIENvbnRlbnRFbmNvZGluZ1Njb3BlICUiCisgICAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsCisgICAgICAgICAgICAiQ29udGVudEVuY29kaW5nU2NvcGU6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgIGVuYy5zY29wZSA9IG51bTsKKworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRFTkNPRElOR1RZUEU6eworICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG51bSA+IDEpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJJbnZhbGlkIENvbnRlbnRFbmNvZGluZ1R5cGUgJSIKKyAgICAgICAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChudW0gIT0gMCkgeworICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgICAgICAgIkVuY3J5cHRlZCB0cmFja3MgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0Iik7CisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAgICAgIkNvbnRlbnRFbmNvZGluZ1R5cGU6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgIGVuYy50eXBlID0gbnVtOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRDT01QUkVTU0lPTjp7CisKKyAgICAgICAgREVCVUdfRUxFTUVOVF9TVEFSVCAoY29tbW9uLCBlYm1sLCAiQ29udGVudENvbXByZXNzaW9uIik7CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSyAmJgorICAgICAgICAgICAgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRDT01QQUxHTzp7CisgICAgICAgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChudW0gPiAzKSB7CisgICAgICAgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiSW52YWxpZCBDb250ZW50Q29tcEFsZ28gJSIKKyAgICAgICAgICAgICAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsCisgICAgICAgICAgICAgICAgICAiQ29udGVudENvbXBBbGdvOiAlIiBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICAgICAgICBlbmMuY29tcF9hbGdvID0gbnVtOworCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ09OVEVOVENPTVBTRVRUSU5HUzp7CisgICAgICAgICAgICAgIGd1aW50OCAqZGF0YTsKKyAgICAgICAgICAgICAgZ3VpbnQ2NCBzaXplOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0KKyAgICAgICAgICAgICAgICAgICAgICBnc3RfZWJtbF9yZWFkX2JpbmFyeSAoZWJtbCwgJmlkLCAmZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKSAhPSBHU1RfRkxPV19PSykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVuYy5jb21wX3NldHRpbmdzID0gZGF0YTsKKyAgICAgICAgICAgICAgZW5jLmNvbXBfc2V0dGluZ3NfbGVuZ3RoID0gc2l6ZTsKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAgICAgICAgICAgIkNvbnRlbnRDb21wU2V0dGluZ3Mgb2Ygc2l6ZSAlIiBHX0dVSU5UNjRfRk9STUFULCBzaXplKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgICAgICAgICAgICJVbmtub3duIENvbnRlbnRDb21wcmVzc2lvbiBzdWJlbGVtZW50IDB4JXggLSBpZ25vcmluZyIsIGlkKTsKKyAgICAgICAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9za2lwIChlYm1sKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiQ29udGVudENvbXByZXNzaW9uIiwgcmV0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRFTkNSWVBUSU9OOgorICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsCisgICAgICAgICAgICAiRW5jcnlwdGVkIHRyYWNrcyBub3QgeWV0IHN1cHBvcnRlZCIpOworICAgICAgICBnc3RfZWJtbF9yZWFkX3NraXAgKGVibWwpOworICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgICAgICJVbmtub3duIENvbnRlbnRFbmNvZGluZyBzdWJlbGVtZW50IDB4JXggLSBpZ25vcmluZyIsIGlkKTsKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9za2lwIChlYm1sKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJDb250ZW50RW5jb2RpbmciLCByZXQpOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LICYmIHJldCAhPSBHU1RfRkxPV19FT1MpCisgICAgcmV0dXJuIHJldDsKKworICAvKiBUT0RPOiBDaGVjayBpZiB0aGUgY29tYmluYXRpb24gb2YgdmFsdWVzIGlzIHZhbGlkICovCisKKyAgZ19hcnJheV9hcHBlbmRfdmFsIChjb250ZXh0LT5lbmNvZGluZ3MsIGVuYyk7CisKKyAgcmV0dXJuIHJldDsKK30KKworR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3JlYWRfdHJhY2tfZW5jb2RpbmdzIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sLCBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIGNvbnRleHQpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBndWludDMyIGlkOworCisgIERFQlVHX0VMRU1FTlRfU1RBUlQgKGNvbW1vbiwgZWJtbCwgIkNvbnRlbnRFbmNvZGluZ3MiKTsKKworICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfbWFzdGVyIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykgeworICAgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiQ29udGVudEVuY29kaW5ncyIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIGNvbnRleHQtPmVuY29kaW5ncyA9CisgICAgICBnX2FycmF5X3NpemVkX25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKEdzdE1hdHJvc2thVHJhY2tFbmNvZGluZyksIDEpOworCisgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRFTkNPRElORzoKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3JlYWRfdHJhY2tfZW5jb2RpbmcgKGNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgIGNvbnRleHQpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAgICAgIlVua25vd24gQ29udGVudEVuY29kaW5ncyBzdWJlbGVtZW50IDB4JXggLSBpZ25vcmluZyIsIGlkKTsKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9za2lwIChlYm1sKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJDb250ZW50RW5jb2RpbmdzIiwgcmV0KTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSyAmJiByZXQgIT0gR1NUX0ZMT1dfRU9TKQorICAgIHJldHVybiByZXQ7CisKKyAgLyogU29ydCBlbmNvZGluZ3MgYWNjb3JkaW5nIHRvIHRoZWlyIG9yZGVyICovCisgIGdfYXJyYXlfc29ydCAoY29udGV4dC0+ZW5jb2RpbmdzLAorICAgICAgKEdDb21wYXJlRnVuYykgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2VuY29kaW5nX2NtcCk7CisKKyAgcmV0dXJuIGdzdF9tYXRyb3NrYV9kZWNvZGVfY29udGVudF9lbmNvZGluZ3MgKGNvbnRleHQtPmVuY29kaW5ncyk7Cit9CisKK3ZvaWQKK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9mcmVlX3BhcnNlZF9lbCAoZ3BvaW50ZXIgbWVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGdfc2xpY2VfZnJlZSAoZ3VpbnQ2NCwgbWVtKTsKK30KKwordm9pZAorZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2luaXQgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGN0eCkKK3sKKyAgY3R4LT5zcmMgPSBOVUxMOworICBjdHgtPndyaXRpbmdfYXBwID0gTlVMTDsKKyAgY3R4LT5tdXhpbmdfYXBwID0gTlVMTDsKKyAgY3R4LT5pbmRleCA9IE5VTEw7CisgIGN0eC0+Z2xvYmFsX3RhZ3MgPSBOVUxMOworICBjdHgtPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgIGN0eC0+dG9jID0gTlVMTDsKKyAgY3R4LT5pbnRlcm5hbF90b2MgPSBOVUxMOworICBjdHgtPnRvY191cGRhdGVkID0gRkFMU0U7CisgIGN0eC0+Y2FjaGVkX3RyYWNrX3RhZ2xpc3RzID0KKyAgICAgIGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X3RhZ19saXN0X3VucmVmKTsKK30KKwordm9pZAorZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2ZpbmFsaXplIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjdHgpCit7CisgIGlmIChjdHgtPnNyYykgeworICAgIGdfcHRyX2FycmF5X2ZyZWUgKGN0eC0+c3JjLCBUUlVFKTsKKyAgICBjdHgtPnNyYyA9IE5VTEw7CisgIH0KKworICBpZiAoY3R4LT5nbG9iYWxfdGFncykgeworICAgIGdzdF90YWdfbGlzdF91bnJlZiAoY3R4LT5nbG9iYWxfdGFncyk7CisgICAgY3R4LT5nbG9iYWxfdGFncyA9IE5VTEw7CisgIH0KKworICBpZiAoY3R4LT50b2MpIHsKKyAgICBnc3RfdG9jX3VucmVmIChjdHgtPnRvYyk7CisgICAgY3R4LT50b2MgPSBOVUxMOworICB9CisgIGlmIChjdHgtPmludGVybmFsX3RvYykgeworICAgIGdzdF90b2NfdW5yZWYgKGN0eC0+aW50ZXJuYWxfdG9jKTsKKyAgICBjdHgtPmludGVybmFsX3RvYyA9IE5VTEw7CisgIH0KKworICBjdHgtPnRvY191cGRhdGVkID0gRkFMU0U7CisKKyAgZ19vYmplY3RfdW5yZWYgKGN0eC0+YWRhcHRlcik7CisgIGdfaGFzaF90YWJsZV9yZW1vdmVfYWxsIChjdHgtPmNhY2hlZF90cmFja190YWdsaXN0cyk7CisgIGdfaGFzaF90YWJsZV91bnJlZiAoY3R4LT5jYWNoZWRfdHJhY2tfdGFnbGlzdHMpOworCit9CisKK3ZvaWQKK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9yZXNldCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY3R4KQoreworICBndWludCBpOworCisgIEdTVF9MT0dfT0JKRUNUIChjdHgtPnNpbmtwYWQsICJyZXNldHRpbmcgcmVhZCBjb250ZXh0Iik7CisKKyAgLyogcmVzZXQgaW5wdXQgKi8KKyAgY3R4LT5zdGF0ZSA9IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX1NUQVJUOworCisgIC8qIGNsZWFuIHVwIGV4aXN0aW5nIHN0cmVhbXMgaWYgYW55ICovCisgIGlmIChjdHgtPnNyYykgeworICAgIGdfYXNzZXJ0IChjdHgtPnNyYy0+bGVuID09IGN0eC0+bnVtX3N0cmVhbXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPnNyYy0+bGVuOyBpKyspIHsKKyAgICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjb250ZXh0ID0gZ19wdHJfYXJyYXlfaW5kZXggKGN0eC0+c3JjLCBpKTsKKworICAgICAgaWYgKGNvbnRleHQtPnBhZCAhPSBOVUxMKQorICAgICAgICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChlbGVtZW50LCBjb250ZXh0LT5wYWQpOworCisgICAgICBnc3RfY2Fwc19yZXBsYWNlICgmY29udGV4dC0+Y2FwcywgTlVMTCk7CisgICAgICBnc3RfbWF0cm9za2FfdHJhY2tfZnJlZSAoY29udGV4dCk7CisgICAgfQorICAgIGdfcHRyX2FycmF5X2ZyZWUgKGN0eC0+c3JjLCBUUlVFKTsKKyAgfQorICBjdHgtPnNyYyA9IGdfcHRyX2FycmF5X25ldyAoKTsKKyAgY3R4LT5udW1fc3RyZWFtcyA9IDA7CisKKyAgLyogcmVzZXQgbWVkaWEgaW5mbyAqLworICBnX2ZyZWUgKGN0eC0+d3JpdGluZ19hcHApOworICBjdHgtPndyaXRpbmdfYXBwID0gTlVMTDsKKyAgZ19mcmVlIChjdHgtPm11eGluZ19hcHApOworICBjdHgtPm11eGluZ19hcHAgPSBOVUxMOworCisgIC8qIHJlc2V0IHN0cmVhbSB0eXBlICovCisgIGN0eC0+aXNfd2VibSA9IEZBTFNFOworICBjdHgtPmhhc192aWRlbyA9IEZBTFNFOworCisgIC8qIHJlc2V0IGluZGV4ZXMgKi8KKyAgaWYgKGN0eC0+aW5kZXgpIHsKKyAgICBnX2FycmF5X2ZyZWUgKGN0eC0+aW5kZXgsIFRSVUUpOworICAgIGN0eC0+aW5kZXggPSBOVUxMOworICB9CisKKyAgLyogcmVzZXQgdGltZXJzICovCisgIGN0eC0+dGltZV9zY2FsZSA9IDEwMDAwMDA7CisgIGN0eC0+Y3JlYXRlZCA9IEdfTUlOSU5UNjQ7CisKKyAgLyogY3Vlcy90cmFja3Mvc2VnbWVudGluZm8gKi8KKyAgY3R4LT5pbmRleF9wYXJzZWQgPSBGQUxTRTsKKyAgY3R4LT5zZWdtZW50aW5mb19wYXJzZWQgPSBGQUxTRTsKKyAgY3R4LT5hdHRhY2htZW50c19wYXJzZWQgPSBGQUxTRTsKKyAgY3R4LT5jaGFwdGVyc19wYXJzZWQgPSBGQUxTRTsKKworICAvKiB0YWdzICovCisgIGN0eC0+Z2xvYmFsX3RhZ3NfY2hhbmdlZCA9IEZBTFNFOworICBnX2xpc3RfZm9yZWFjaCAoY3R4LT50YWdzX3BhcnNlZCwKKyAgICAgIChHRnVuYykgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2ZyZWVfcGFyc2VkX2VsLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKGN0eC0+dGFnc19wYXJzZWQpOworICBjdHgtPnRhZ3NfcGFyc2VkID0gTlVMTDsKKyAgaWYgKGN0eC0+Z2xvYmFsX3RhZ3MpIHsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKGN0eC0+Z2xvYmFsX3RhZ3MpOworICB9CisgIGN0eC0+Z2xvYmFsX3RhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBnc3RfdGFnX2xpc3Rfc2V0X3Njb3BlIChjdHgtPmdsb2JhbF90YWdzLCBHU1RfVEFHX1NDT1BFX0dMT0JBTCk7CisKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJmN0eC0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgY3R4LT5vZmZzZXQgPSAwOworICBjdHgtPnN0YXJ0X3Jlc3luY19vZmZzZXQgPSAtMTsKKyAgY3R4LT5zdGF0ZV90b19yZXN0b3JlID0gLTE7CisKKyAgaWYgKGN0eC0+Y2FjaGVkX2J1ZmZlcikgeworICAgIGlmIChjdHgtPmNhY2hlZF9kYXRhKSB7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChjdHgtPmNhY2hlZF9idWZmZXIsICZjdHgtPmNhY2hlZF9tYXApOworICAgICAgY3R4LT5jYWNoZWRfZGF0YSA9IE5VTEw7CisgICAgfQorICAgIGdzdF9idWZmZXJfdW5yZWYgKGN0eC0+Y2FjaGVkX2J1ZmZlcik7CisgICAgY3R4LT5jYWNoZWRfYnVmZmVyID0gTlVMTDsKKyAgfQorCisgIC8qIGZyZWUgY2hhcHRlcnMgVE9DIGlmIGFueSAqLworICBpZiAoY3R4LT50b2MpIHsKKyAgICBnc3RfdG9jX3VucmVmIChjdHgtPnRvYyk7CisgICAgY3R4LT50b2MgPSBOVUxMOworICB9CisgIGlmIChjdHgtPmludGVybmFsX3RvYykgeworICAgIGdzdF90b2NfdW5yZWYgKGN0eC0+aW50ZXJuYWxfdG9jKTsKKyAgICBjdHgtPmludGVybmFsX3RvYyA9IE5VTEw7CisgIH0KKyAgY3R4LT50b2NfdXBkYXRlZCA9IEZBTFNFOworfQorCisvKiBjYWxsIHdpdGggb2JqZWN0IGxvY2sgaGVsZCAqLwordm9pZAorZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3Jlc2V0X3N0cmVhbXMgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGNvbW1vbiwKKyAgICBHc3RDbG9ja1RpbWUgdGltZSwgZ2Jvb2xlYW4gZnVsbCkKK3sKKyAgZ2ludCBpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgInJlc2V0dGluZyBzdHJlYW0gc3RhdGUiKTsKKworICBnX2Fzc2VydCAoY29tbW9uLT5zcmMtPmxlbiA9PSBjb21tb24tPm51bV9zdHJlYW1zKTsKKyAgZm9yIChpID0gMDsgaSA8IGNvbW1vbi0+c3JjLT5sZW47IGkrKykgeworICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjb250ZXh0ID0gZ19wdHJfYXJyYXlfaW5kZXggKGNvbW1vbi0+c3JjLCBpKTsKKyAgICBjb250ZXh0LT5wb3MgPSB0aW1lOworICAgIGNvbnRleHQtPnNldF9kaXNjb250ID0gVFJVRTsKKyAgICBjb250ZXh0LT5lb3MgPSBGQUxTRTsKKyAgICBjb250ZXh0LT5mcm9tX3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgIGlmIChjb250ZXh0LT50eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1ZJREVPKSB7CisgICAgICBHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICp2aWRlb2NvbnRleHQgPQorICAgICAgICAgIChHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICopIGNvbnRleHQ7CisgICAgICAvKiBkZW11eCBvYmplY3QgbG9jayBoZWxkIGJ5IGNhbGxlciAqLworICAgICAgdmlkZW9jb250ZXh0LT5lYXJsaWVzdF90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICB9CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl90cmFja251bWJlcl91bmlxdWUgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGNvbW1vbiwKKyAgICBndWludDY0IG51bSkKK3sKKyAgZ2ludCBpOworCisgIGdfYXNzZXJ0IChjb21tb24tPnNyYy0+bGVuID09IGNvbW1vbi0+bnVtX3N0cmVhbXMpOworICBmb3IgKGkgPSAwOyBpIDwgY29tbW9uLT5zcmMtPmxlbjsgaSsrKSB7CisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKmNvbnRleHQgPSBnX3B0cl9hcnJheV9pbmRleCAoY29tbW9uLT5zcmMsIGkpOworCisgICAgaWYgKGNvbnRleHQtPm51bSA9PSBudW0pCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oIGIvZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyODJkNgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oCkBAIC0wLDAgKzEsMTcyIEBACisvKiBHU3RyZWFtZXIgTWF0cm9za2EgbXV4ZXIvZGVtdXhlcgorICogKGMpIDIwMDMgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogKGMpIDIwMTEgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorICoKKyAqIG1hdHJvc2thLXJlYWQtY29tbW9uLmg6IHNoYXJlZCBieSBtYXRyb3NrYSBmaWxlL3N0cmVhbSBkZW11eGVyIGFuZCBwYXJzZXIKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX01BVFJPU0tBX1JFQURfQ09NTU9OX0hfXworI2RlZmluZSBfX0dTVF9NQVRST1NLQV9SRUFEX0NPTU1PTl9IX18KKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorCisjaW5jbHVkZSAibWF0cm9za2EtaWRzLmgiCisKK0dfQkVHSU5fREVDTFMKKworR1NUX0RFQlVHX0NBVEVHT1JZX0VYVEVSTihtYXRyb3NrYXJlYWRjb21tb25fZGVidWcpOworCit0eXBlZGVmIGVudW0geworICBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9TVEFSVCwKKyAgR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfU0VHTUVOVCwKKyAgR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfSEVBREVSLAorICBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9EQVRBLAorICBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9TRUVLLAorICBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9TQ0FOTklORworfSBHc3RNYXRyb3NrYVJlYWRTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE1hdHJvc2thUmVhZENvbW1vbiB7CisjaWYgMAorICBHc3RJbmRleCAgICAgICAgICAgICAgICAqZWxlbWVudF9pbmRleDsKKyAgZ2ludCAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfaW5kZXhfd3JpdGVyX2lkOworI2VuZGlmCisKKyAgLyogcGFkcyAqLworICBHc3RQYWQgICAgICAgICAgICAgICAgICAqc2lua3BhZDsKKyAgR1B0ckFycmF5ICAgICAgICAgICAgICAgKnNyYzsKKyAgZ3VpbnQgICAgICAgICAgICAgICAgICAgIG51bV9zdHJlYW1zOworCisgIC8qIG1ldGFkYXRhICovCisgIGdjaGFyICAgICAgICAgICAgICAgICAgICptdXhpbmdfYXBwOworICBnY2hhciAgICAgICAgICAgICAgICAgICAqd3JpdGluZ19hcHA7CisgIGdpbnQ2NCAgICAgICAgICAgICAgICAgICBjcmVhdGVkOworCisgIC8qIHN0YXRlICovCisgIEdzdE1hdHJvc2thUmVhZFN0YXRlICAgICBzdGF0ZTsKKworICAvKiBzdHJlYW0gdHlwZSAqLworICBnYm9vbGVhbiAgICAgICAgICAgICAgICAgaXNfd2VibTsKKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIGhhc192aWRlbzsKKworICAvKiBkaWQgd2UgcGFyc2UgY3Vlcy90cmFja3Mvc2VnbWVudGluZm8gYWxyZWFkeT8gKi8KKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIGluZGV4X3BhcnNlZDsKKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIHNlZ21lbnRpbmZvX3BhcnNlZDsKKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzX3BhcnNlZDsKKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIGNoYXB0ZXJzX3BhcnNlZDsKKyAgR0xpc3QgICAgICAgICAgICAgICAgICAgKnRhZ3NfcGFyc2VkOworCisgIC8qIGNoYXB0ZXJzIHN0dWZmICovCisgIC8qIEludGVybmFsIHRvYyBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGludGVybmFsIFVJRAorICAgKiB3aGljaCBhcmUgZGlmZmVyZW50IGZyb20gdGhlIGV4dGVybmFsIFN0cmluZ1VJRCB1c2VkCisgICAqIGluIHRoZSB1c2VyIHRvYyAqLworICBHc3RUb2MgICAgICAgICAgICAgICAgICAqdG9jOworICBHc3RUb2MgICAgICAgICAgICAgICAgICAqaW50ZXJuYWxfdG9jOworICBnYm9vbGVhbiAgICAgICAgICAgICAgICB0b2NfdXBkYXRlZDsKKworICAvKiBzdGFydC1vZi1zZWdtZW50IGFuZCBsZW5ndGggKi8KKyAgZ3VpbnQ2NCAgICAgICAgICAgICAgICAgIGVibWxfc2VnbWVudF9zdGFydDsKKyAgZ3VpbnQ2NCAgICAgICAgICAgICAgICAgIGVibWxfc2VnbWVudF9sZW5ndGg7CisKKyAgLyogYSBjdWUgKGluZGV4KSB0YWJsZSAqLworICBHQXJyYXkgICAgICAgICAgICAgICAgICAqaW5kZXg7CisKKyAgLyogdGltZXNjYWxlIGluIHRoZSBmaWxlICovCisgIGd1aW50NjQgICAgICAgICAgICAgICAgICB0aW1lX3NjYWxlOworCisgIC8qIGtlZXBpbmcgdHJhY2sgb2YgcGxheWJhY2sgcG9zaXRpb24gKi8KKyAgR3N0U2VnbWVudCAgICAgICAgICAgICAgIHNlZ21lbnQ7CisKKyAgR3N0VGFnTGlzdCAgICAgICAgICAgICAgKmdsb2JhbF90YWdzOworICBnYm9vbGVhbiAgICAgICAgICAgICAgICAgZ2xvYmFsX3RhZ3NfY2hhbmdlZDsKKworICAvKiBwdWxsIG1vZGUgY2FjaGluZyAqLworICBHc3RCdWZmZXIgKmNhY2hlZF9idWZmZXI7CisgIGd1aW50OCAqY2FjaGVkX2RhdGE7CisgIEdzdE1hcEluZm8gY2FjaGVkX21hcDsKKworICAvKiBwdXNoIGFuZCBwdWxsIG1vZGUgKi8KKyAgZ3VpbnQ2NCAgICAgICAgICAgICAgICAgIG9mZnNldDsKKworICBndWludDY0ICAgICAgICAgICAgICAgICAgc3RhcnRfcmVzeW5jX29mZnNldDsKKworICAvKiBzdGF0ZSB0byByZXN0b3JlIGFmdGVyIHNjYW5uaW5nIGZvciBpbnZhbGlkIGRhdGEgKi8KKyAgZ2ludCAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3RvX3Jlc3RvcmU7CisKKyAgLyogcHVzaCBiYXNlZCBtb2RlIHVzdWFsIHN1c3BlY3RzICovCisgIEdzdEFkYXB0ZXIgICAgICAgICAgICAgICphZGFwdGVyOworCisgIC8qIGNhY2hlIGZvciB0cmFjayB0YWdzIHRoYXQgZm9yd2FyZC1yZWZlcmVuY2UgdGhlaXIgdHJhY2tzICovCisgIEdIYXNoVGFibGUgKmNhY2hlZF90cmFja190YWdsaXN0cyA7CisgCit9IEdzdE1hdHJvc2thUmVhZENvbW1vbjsKKworR3N0Rmxvd1JldHVybiBnc3RfbWF0cm9za2FfZGVjb2RlX2NvbnRlbnRfZW5jb2RpbmdzIChHQXJyYXkgKiBlbmNvZGluZ3MpOworZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX2RlY29kZV9kYXRhIChHQXJyYXkgKiBlbmNvZGluZ3MsIGdwb2ludGVyICogZGF0YV9vdXQsCisgICAgZ3NpemUgKiBzaXplX291dCwgR3N0TWF0cm9za2FUcmFja0VuY29kaW5nU2NvcGUgc2NvcGUsIGdib29sZWFuIGZyZWUpOworZ2ludCBnc3RfbWF0cm9za2FfaW5kZXhfc2Vla19maW5kIChHc3RNYXRyb3NrYUluZGV4ICogaTEsIEdzdENsb2NrVGltZSAqIHRpbWUsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK0dzdE1hdHJvc2thSW5kZXggKiBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fZG9faW5kZXhfc2VlayAoCisgICAgR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLCBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIHRyYWNrLCBnaW50NjQKKyAgICBzZWVrX3BvcywgR0FycmF5ICoqIF9pbmRleCwgZ2ludCAqIF9lbnRyeV9pbmRleCwgR3N0U2VhcmNoTW9kZSBzbmFwX2Rpcik7Cit2b2lkIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9mb3VuZF9nbG9iYWxfdGFnIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0RWxlbWVudCAqIGVsLCBHc3RUYWdMaXN0ICogdGFnbGlzdCk7CitnaW50NjQgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2dldF9sZW5ndGggKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGNvbW1vbik7CitHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9nZXRfc2Vla190cmFjayAoCisgICAgR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLCBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIHRyYWNrKTsKK0dzdEZsb3dSZXR1cm4gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX2luZGV4IChHc3RNYXRyb3NrYVJlYWRDb21tb24gKgorICAgIGNvbW1vbiwgR3N0RWJtbFJlYWQgKiBlYm1sKTsKK0dzdEZsb3dSZXR1cm4gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX2luZm8gKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqCisgICAgY29tbW9uLCBHc3RFbGVtZW50ICogZWwsIEdzdEVibWxSZWFkICogZWJtbCk7CitHc3RGbG93UmV0dXJuIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9hdHRhY2htZW50cyAoCisgICAgR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLCBHc3RFbGVtZW50ICogZWwsIEdzdEVibWxSZWFkICogZWJtbCk7CitHc3RGbG93UmV0dXJuIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9jaGFwdGVycyAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICoKKyAgICBjb21tb24sIEdzdEVibWxSZWFkICogZWJtbCk7CitHc3RGbG93UmV0dXJuIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9oZWFkZXIgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqCisgICAgY29tbW9uLCBHc3RFYm1sUmVhZCAqIGVibWwpOworR3N0Rmxvd1JldHVybiBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfbWV0YWRhdGEgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqCisgICAgY29tbW9uLCBHc3RFbGVtZW50ICogZWwsIEdzdEVibWxSZWFkICogZWJtbCk7CitHc3RGbG93UmV0dXJuIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKgorICAgIGNvbW1vbiwgR3N0RWJtbFJlYWQgKiBlYm1sLCBjb25zdCBnY2hhciAqIHBhcmVudF9uYW1lLCBndWludCBpZCk7CitHc3RGbG93UmV0dXJuIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wZWVrX2J5dGVzIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKgorICAgIGNvbW1vbiwgZ3VpbnQ2NCBvZmZzZXQsIGd1aW50IHNpemUsIEdzdEJ1ZmZlciAqKiBwX2J1ZiwgZ3VpbnQ4ICoqIGJ5dGVzKTsKK0dzdEZsb3dSZXR1cm4gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BlZWtfaWRfbGVuZ3RoX3B1bGwgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqCisgICAgY29tbW9uLCBHc3RFbGVtZW50ICogZWwsIGd1aW50MzIgKiBfaWQsIGd1aW50NjQgKiBfbGVuZ3RoLCBndWludCAqCisgICAgX25lZWRlZCk7CitHc3RGbG93UmV0dXJuIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wZWVrX2lkX2xlbmd0aF9wdXNoIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKgorICAgIGNvbW1vbiwgR3N0RWxlbWVudCAqIGVsLCBndWludDMyICogX2lkLCBndWludDY0ICogX2xlbmd0aCwgZ3VpbnQgKgorICAgIF9uZWVkZWQpOworZ2ludCBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fc3RyZWFtX2Zyb21fbnVtIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgZ3VpbnQgdHJhY2tfbnVtKTsKK0dzdEZsb3dSZXR1cm4gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3JlYWRfdHJhY2tfZW5jb2RpbmdzICgKKyAgICBHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sIEdzdEVibWxSZWFkICogZWJtbCwKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIGNvbnRleHQpOwordm9pZCBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcmVzZXRfc3RyZWFtcyAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLAorICAgIEdzdENsb2NrVGltZSB0aW1lLCBnYm9vbGVhbiBmdWxsKTsKK3ZvaWQgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2ZyZWVfcGFyc2VkX2VsIChncG9pbnRlciBtZW0sIGdwb2ludGVyIHVzZXJfZGF0YSk7Cit2b2lkIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9pbml0IChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjdHgpOwordm9pZCBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fZmluYWxpemUgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGN0eCk7Cit2b2lkIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9yZXNldCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY3R4KTsKK2dib29sZWFuIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl90cmFja251bWJlcl91bmlxdWUgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqCisgICAgY29tbW9uLCBndWludDY0IG51bSk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9NQVRST1NLQV9SRUFEX0NPTU1PTl9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS5jIGIvZ3N0L21hdHJvc2thL21hdHJvc2thLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU0Mzk3MgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qIEdTdHJlYW1lciBNYXRyb3NrYSBtdXhlci9kZW11eGVyCisgKiAoYykgMjAwMyBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKgorICogbWF0cm9za2EuYzogcGx1Z2luIGxvYWRlcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgIm1hdHJvc2thLWRlbXV4LmgiCisjaW5jbHVkZSAibWF0cm9za2EtcGFyc2UuaCIKKyNpbmNsdWRlICJtYXRyb3NrYS1yZWFkLWNvbW1vbi5oIgorI2luY2x1ZGUgIm1hdHJvc2thLW11eC5oIgorI2luY2x1ZGUgIm1hdHJvc2thLWlkcy5oIgorI2luY2x1ZGUgIndlYm0tbXV4LmgiCisKKyNpbmNsdWRlIDxnc3QvcGJ1dGlscy9wYnV0aWxzLmg+CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgZ2Jvb2xlYW4gcmV0OworCisgIGdzdF9wYl91dGlsc19pbml0ICgpOworCisgIGdzdF9tYXRyb3NrYV9yZWdpc3Rlcl90YWdzICgpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChtYXRyb3NrYXJlYWRjb21tb25fZGVidWcsICJtYXRyb3NrYXJlYWRjb21tb24iLCAwLAorICAgICAgIk1hdHJvc2thIGRlbXV4ZXIvcGFyc2VyIHNoYXJlZCBkZWJ1ZyIpOworCisgIHJldCA9IGdzdF9tYXRyb3NrYV9kZW11eF9wbHVnaW5faW5pdCAocGx1Z2luKTsKKyAgcmV0ICY9IGdzdF9tYXRyb3NrYV9wYXJzZV9wbHVnaW5faW5pdCAocGx1Z2luKTsKKyAgcmV0ICY9IGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJtYXRyb3NrYW11eCIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICBHU1RfVFlQRV9NQVRST1NLQV9NVVgpOworICByZXQgJj0gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIndlYm1tdXgiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgR1NUX1RZUEVfV0VCTV9NVVgpOworCisgIHJldHVybiByZXQ7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBtYXRyb3NrYSwKKyAgICAiTWF0cm9za2EgYW5kIFdlYk0gc3RyZWFtIGhhbmRsaW5nIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgIkxHUEwiLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2EvbWVzb24uYnVpbGQgYi9nc3QvbWF0cm9za2EvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUzODZjZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tYXRyb3NrYS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDI0IEBACittYXRyb3NrYV9zb3VyY2VzID0gWworICAnZWJtbC1yZWFkLmMnLAorICAnZWJtbC13cml0ZS5jJywKKyAgJ21hdHJvc2thLmMnLAorICAnbWF0cm9za2EtZGVtdXguYycsCisgICdtYXRyb3NrYS1wYXJzZS5jJywKKyAgJ21hdHJvc2thLWlkcy5jJywKKyAgJ21hdHJvc2thLW11eC5jJywKKyAgJ21hdHJvc2thLXJlYWQtY29tbW9uLmMnLAorICAnd2VibS1tdXguYycsCisgICdsem8uYycsCitdCisKK2dzdG1hdHJvc2thID0gbGlicmFyeSgnZ3N0bWF0cm9za2EnLAorICBtYXRyb3NrYV9zb3VyY2VzLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGxpbmtfYXJncyA6IG5vc2VoX2xpbmtfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0cGJ1dGlsc19kZXAsIGdzdGF1ZGlvX2RlcCwgZ3N0cmlmZl9kZXAsCisgICAgICAgICAgICAgICAgICBnc3R2aWRlb19kZXAsIGdzdHRhZ19kZXAsIGdzdGJhc2VfZGVwLAorICAgICAgICAgICAgICAgICAgZ3N0X2RlcCwgemxpYl9kZXAsIGJ6MmxpYiwgbGlibV0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2Evd2VibS1tdXguYyBiL2dzdC9tYXRyb3NrYS93ZWJtLW11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1Yzg2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbWF0cm9za2Evd2VibS1tdXguYwpAQCAtMCwwICsxLDEwMSBAQAorLyogR1N0cmVhbWVyIFdlYk0gbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC13ZWJtbXV4CisgKgorICogd2VibW11eCBtdXhlcyBWUDggdmlkZW8gYW5kIFZvcmJpcyBhdWRpbyBzdHJlYW1zIGludG8gYSBXZWJNIGZpbGUuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHdlYm1tdXggbmFtZT1tdXggISBmaWxlc2luayBsb2NhdGlvbj1uZXdmaWxlLndlYm0gICAgICAgICBcCisgKiAgIHVyaWRlY29kZWJpbiB1cmk9ZmlsZTovLy9wYXRoL3RvL3NvbWVmaWxlLm9ndiBuYW1lPWRlbXV4ICAgICAgICAgICAgICAgIFwKKyAqICAgZGVtdXguICEgdmlkZW9jb252ZXJ0ICEgdnA4ZW5jICEgcXVldWUgISBtdXgudmlkZW9fMCAgICBcCisgKiAgIGRlbXV4LiAhIHByb2dyZXNzcmVwb3J0ICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yYXRlICEgdm9yYmlzZW5jICEgcXVldWUgISBtdXguYXVkaW9fMAorICogXXwgVGhpcyBwaXBlbGluZSByZS1lbmNvZGVzIGEgdmlkZW8gZmlsZSBvZiBhbnkgZm9ybWF0IGludG8gYSBXZWJNIGZpbGUuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgd2VibW11eCBuYW1lPW11eCAhIGZpbGVzaW5rIGxvY2F0aW9uPXRlc3Qud2VibSAgICAgICAgICAgIFwKKyAqICAgdmlkZW90ZXN0c3JjIG51bS1idWZmZXJzPTI1MCAhIHZpZGVvL3gtcmF3LGZyYW1lcmF0ZT0yNS8xICEgdmlkZW9jb252ZXJ0ICEgdnA4ZW5jICEgcXVldWUgISBtdXgudmlkZW9fMCBcCisgKiAgIGF1ZGlvdGVzdHNyYyBzYW1wbGVzcGVyYnVmZmVyPTQ0MTAwIG51bS1idWZmZXJzPTEwICEgYXVkaW8veC1yYXcscmF0ZT00NDEwMCAhIHZvcmJpc2VuYyAhIHF1ZXVlICEgbXV4LmF1ZGlvXzAKKyAqIF18IFRoaXMgcGlwZWxpbmUgbXV4ZXMgYSB0ZXN0IHZpZGVvIGFuZCBhIHNpbmUgd2F2ZSBpbnRvIGEgV2ViTSBmaWxlLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJ3ZWJtLW11eC5oIgorCisjZGVmaW5lIENPTU1PTl9WSURFT19DQVBTIFwKKyAgIndpZHRoID0gKGludCkgWyAxNiwgNDA5NiBdLCAiIFwKKyAgImhlaWdodCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIiBcCisgICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMCwgTUFYIF0iCisKKyNkZWZpbmUgQ09NTU9OX0FVRElPX0NBUFMgXAorICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIE1BWCBdLCAiIFwKKyAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdIgorCitHX0RFRklORV9UWVBFIChHc3RXZWJNTXV4LCBnc3Rfd2VibV9tdXgsIEdTVF9UWVBFX01BVFJPU0tBX01VWCk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSB3ZWJtX3NyY190ZW1wbCA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby93ZWJtOyBhdWRpby93ZWJtIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgd2VibV92aWRlb3NpbmtfdGVtcGwgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgidmlkZW9fJXUiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC12cDgsICIgQ09NTU9OX1ZJREVPX0NBUFMgIjsiCisgICAgICAgICJ2aWRlby94LXZwOSwgIiBDT01NT05fVklERU9fQ0FQUyAiOyIgInZpZGVvL3gtYXYxLCAiIENPTU1PTl9WSURFT19DQVBTKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSB3ZWJtX2F1ZGlvc2lua190ZW1wbCA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJhdWRpb18ldSIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfUkVRVUVTVCwKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXZvcmJpcywgIiBDT01NT05fQVVESU9fQ0FQUyAiOyIKKyAgICAgICAgImF1ZGlvL3gtb3B1cywgIiBDT01NT05fQVVESU9fQ0FQUykKKyAgICApOworCitzdGF0aWMgdm9pZAorZ3N0X3dlYm1fbXV4X2NsYXNzX2luaXQgKEdzdFdlYk1NdXhDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJndlYm1fdmlkZW9zaW5rX3RlbXBsKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmd2VibV9hdWRpb3NpbmtfdGVtcGwpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJndlYm1fc3JjX3RlbXBsKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIldlYk0gbXV4ZXIiLAorICAgICAgIkNvZGVjL011eGVyIiwKKyAgICAgICJNdXhlcyB2aWRlbyBhbmQgYXVkaW8gc3RyZWFtcyBpbnRvIGEgV2ViTSBzdHJlYW0iLAorICAgICAgIkdTdHJlYW1lciBtYWludGFpbmVycyA8Z3N0cmVhbWVyLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZz4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF93ZWJtX211eF9pbml0IChHc3RXZWJNTXV4ICogbXV4KQoreworICBHU1RfTUFUUk9TS0FfTVVYIChtdXgpLT5kb2N0eXBlID0gR1NUX01BVFJPU0tBX0RPQ1RZUEVfV0VCTTsKKyAgR1NUX01BVFJPU0tBX01VWCAobXV4KS0+aXNfd2VibSA9IFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2Evd2VibS1tdXguaCBiL2dzdC9tYXRyb3NrYS93ZWJtLW11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZWU4NDQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbWF0cm9za2Evd2VibS1tdXguaApAQCAtMCwwICsxLDQ5IEBACisvKiBHU3RyZWFtZXIgV2ViTSBtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfV0VCTV9NVVhfSF9fCisjZGVmaW5lIF9fR1NUX1dFQk1fTVVYX0hfXworCisjaW5jbHVkZSAibWF0cm9za2EtbXV4LmgiCisKKyNkZWZpbmUgR1NUX1RZUEVfV0VCTV9NVVggXAorICAoZ3N0X3dlYm1fbXV4X2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfV0VCTV9NVVgob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX1dFQk1fTVVYLCBHc3RXZWJNTXV4KSkKKyNkZWZpbmUgR1NUX1dFQk1fTVVYX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfV0VCTV9NVVgsIEdzdFdlYk1NdXhDbGFzcykpCisjZGVmaW5lIEdTVF9JU19XRUJNX01VWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfV0VCTV9NVVgpKQorI2RlZmluZSBHU1RfSVNfV0VCTV9NVVhfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9XRUJNX01VWCkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RXZWJNTXV4IEdzdFdlYk1NdXg7Cit0eXBlZGVmIHN0cnVjdCBfR3N0V2ViTU11eENsYXNzIEdzdFdlYk1NdXhDbGFzczsKKworc3RydWN0IF9Hc3RXZWJNTXV4IHsKKyAgR3N0TWF0cm9za2FNdXggbWF0cm9za2FtdXg7Cit9OworCitzdHJ1Y3QgX0dzdFdlYk1NdXhDbGFzcyB7CisgIEdzdE1hdHJvc2thTXV4Q2xhc3MgbWF0cm9za2FtdXhjbGFzczsKK307CisKK0dUeXBlICAgZ3N0X3dlYm1fbXV4X2dldF90eXBlICh2b2lkKTsKKworI2VuZGlmIC8qIF9fR1NUX1dFQk1fTVVYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L21lc29uLmJ1aWxkIGIvZ3N0L21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZGY1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbWVzb24uYnVpbGQKQEAgLTAsMCArMSw0MyBAQAorc3ViZGlyKCdhbHBoYScpCitzdWJkaXIoJ2FwZXRhZycpCitzdWJkaXIoJ2F1ZGlvZngnKQorc3ViZGlyKCdhdWRpb3BhcnNlcnMnKQorc3ViZGlyKCdhdXBhcnNlJykKK3N1YmRpcignYXV0b2RldGVjdCcpCitzdWJkaXIoJ2F2aScpCitzdWJkaXIoJ2N1dHRlcicpCitzdWJkaXIoJ2RlYnVndXRpbHMnKQorc3ViZGlyKCdkZWludGVybGFjZScpCitzdWJkaXIoJ2R0bWYnKQorc3ViZGlyKCdlZmZlY3R2JykKK3N1YmRpcignZXF1YWxpemVyJykKK3N1YmRpcignZmx2JykKK3N1YmRpcignZmx4JykKK3N1YmRpcignZ29vbScpCitzdWJkaXIoJ2dvb20yazEnKQorc3ViZGlyKCdpY3lkZW11eCcpCitzdWJkaXIoJ2lkM2RlbXV4JykKK3N1YmRpcignaW1hZ2VmcmVlemUnKQorc3ViZGlyKCdpbnRlcmxlYXZlJykKK3N1YmRpcignaXNvbXA0JykKK3N1YmRpcignbGF3JykKK3N1YmRpcignbGV2ZWwnKQorc3ViZGlyKCdtYXRyb3NrYScpCitzdWJkaXIoJ21vbm9zY29wZScpCitzdWJkaXIoJ211bHRpZmlsZScpCitzdWJkaXIoJ211bHRpcGFydCcpCitzdWJkaXIoJ3JlcGxheWdhaW4nKQorc3ViZGlyKCdydHAnKQorc3ViZGlyKCdydHBtYW5hZ2VyJykKK3N1YmRpcigncnRzcCcpCitzdWJkaXIoJ3NoYXBld2lwZScpCitzdWJkaXIoJ3NtcHRlJykKK3N1YmRpcignc3BlY3RydW0nKQorc3ViZGlyKCd1ZHAnKQorc3ViZGlyKCd2aWRlb2JveCcpCitzdWJkaXIoJ3ZpZGVvY3JvcCcpCitzdWJkaXIoJ3ZpZGVvZmlsdGVyJykKK3N1YmRpcigndmlkZW9taXhlcicpCitzdWJkaXIoJ3dhdmVuYycpCitzdWJkaXIoJ3dhdnBhcnNlJykKK3N1YmRpcigneTRtJykKZGlmZiAtLWdpdCBhL2dzdC9tb25vc2NvcGUvLmdpdGlnbm9yZSBiL2dzdC9tb25vc2NvcGUvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGY1ZWQzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21vbm9zY29wZS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNyBAQAorTWFrZWZpbGUKK01ha2VmaWxlLmluCisqLm8KKyoubG8KKyoubGEKKy5kZXBzCisubGlicwpkaWZmIC0tZ2l0IGEvZ3N0L21vbm9zY29wZS9NYWtlZmlsZS5hbSBiL2dzdC9tb25vc2NvcGUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkYTg4NAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tb25vc2NvcGUvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw5IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3Rtb25vc2NvcGUubGEKKworbGliZ3N0bW9ub3Njb3BlX2xhX1NPVVJDRVMgPSBnc3Rtb25vc2NvcGUuYyBtb25vc2NvcGUuYyBjb252b2x2ZS5jCisKK25vaW5zdF9IRUFERVJTID0gZ3N0bW9ub3Njb3BlLmggbW9ub3Njb3BlLmggY29udm9sdmUuaAorCitsaWJnc3Rtb25vc2NvcGVfbGFfQ0ZMQUdTID0gJChHU1RfQ0ZMQUdTKSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykKK2xpYmdzdG1vbm9zY29wZV9sYV9MSUJBREQgPSAkKEdTVF9MSUJTKSAkKEdTVF9CQVNFX0xJQlMpCitsaWJnc3Rtb25vc2NvcGVfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQpkaWZmIC0tZ2l0IGEvZ3N0L21vbm9zY29wZS9SRUFETUUgYi9nc3QvbW9ub3Njb3BlL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWZmMGMwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21vbm9zY29wZS9SRUFETUUKQEAgLTAsMCArMSw5IEBACitUaGlzIGlzIGEgdmlzdWFsaXphdGlvbiBiYXNlZCBvbiBvbiB0aGUgbW9ub3Njb3BlIG91dHB1dCBwbHVnaW4gZnJvbQorYWxzYXBsYXllci4KKworVGhlIG1vbm9zY29wZSBjb252b2x1dGlvbiBtYXRjaGluZyBjb2RlIHdhcyB3cml0dGVuIGJ5IFJhbHBoIExvYWRlci4KKworVGhlIG1vbm9zY29wZS5jIGFuZCBtb25vc2NvcGUuaCBmaWxlcyBhcmUgdW5kZXIgdGhlIEJTRCBsaWNlbnNlICh3aXRob3V0IGFkdmVydGlzaW5nIGNsYXVzZSkuCisKK1RoaXMgaW1wbGVtZW50YXRpb24gaXMgdGFrZW4gZnJvbSBhbHNhcGxheWVyIHZlcnNpb24gMC45OS41NCwgYXQKK2h0dHA6Ly93d3cuYWxzYXBsYXllci5vcmcvCmRpZmYgLS1naXQgYS9nc3QvbW9ub3Njb3BlL2NvbnZvbHZlLmMgYi9nc3QvbW9ub3Njb3BlL2NvbnZvbHZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYzZTc5NwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tb25vc2NvcGUvY29udm9sdmUuYwpAQCAtMCwwICsxLDM2MyBAQAorLyogS2FyYXRzdWJhIGNvbnZvbHV0aW9uCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OSBSYWxwaCBMb2FkZXIgPHN1Y2tmaXNoQGlodWcuY28ubno+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICoKKyAqIE5vdGU6IDd0aCBEZWNlbWJlciAyMDA0OiBUaGlzIGZpbGUgdXNlZCB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLAorICogICAgICAgYnV0IHdlIGdvdCBwZXJtaXNzaW9uIGZyb20gUmFscCBMb2FkZXIgdG8gcmVsaWNlbnNlIGl0IHRvIExHUEwuCisgKgorICogICRJZCQKKyAqCisgKi8KKworLyogVGhlIGFsZ29yaXRobSBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nLiAgRm9yIHRoZSBjb252b2x1dGlvbiBvZiBhIHBhaXIKKyAqIG9mIHBhaXJzLCAoYSxiKSAqIChjLGQpID0gKDAsIGEuYywgYS5kK2IuYywgYi5kKSwgd2UgY2FuIHJlZHVjZSB0aGUgZm91cgorICogbXVsdGlwbGljYXRpb25zIHRvIHRocmVlLCBieSB0aGUgZm9ybXVsYWUgYS5kK2IuYyA9IChhK2IpLihjK2QpIC0gYS5jIC0KKyAqIGIuZC4gIEEgc2ltaWxhciByZWxhdGlvbiBlbmFibGVzIHVzIHRvIGNvbXB1dGUgYSAybiBieSAybiBjb252b2x1dGlvbgorICogdXNpbmcgMyBuIGJ5IG4gY29udm9sdXRpb25zLCBhbmQgdGh1cyBhIDJebiBieSAyXm4gY29udm9sdXRpb24gdXNpbmcgM15uCisgKiBtdWx0aXBsaWNhdGlvbnMgKGFzIG9wcG9zZWQgdG8gdGhlIDRebiB0aGF0IHRoZSBxdWFkcmF0aWMgYWxnb3JpdGhtCisgKiB0YWtlcy4gKi8KKworLyogRm9yIGxhcmdlIG4sIHRoaXMgaXMgc2xvd2VyIHRoYW4gdGhlIE8obiBsb2cgbikgdGhhdCB0aGUgRkZUIG1ldGhvZAorICogdGFrZXMsIGJ1dCB3ZSBhdm9pZCB1c2luZyBjb21wbGV4IG51bWJlcnMsIGFuZCB3ZSBvbmx5IGhhdmUgdG8gY29tcHV0ZQorICogb25lIGNvbnZvbHV0aW9uLCBhcyBvcHBvc2VkIHRvIDMgRkZUcy4gIFdlIGhhdmUgZ29vZCBsb2NhbGl0eS1vZi0KKyAqIHJlZmVyZW5jZSBhcyB3ZWxsLCB3aGljaCB3aWxsIGhlbHAgb24gQ1BVcyB3aXRoIHRpbnkgY2FjaGVzLiAgKi8KKworLyogRS5nLiwgZm9yIGEgNTEyIHggNTEyIGNvbnZvbHV0aW9uLCB0aGUgRkZUIG1ldGhvZCB0YWtlcyA1NSAqIDUxMiA9IDI4MTYwCisgKiAocmVhbCkgbXVsdGlwbGljYXRpb25zLCBhcyBvcHBvc2VkIHRvIDNeOSA9IDE5NjgzIGZvciB0aGUgS2FyYXRzdWJhCisgKiBhbGdvcml0aG0uICBXZSBhY3R1YWxseSB3YW50IDI1NyBvdXRwdXRzIG9mIGEgMjU2IHggNTEyIGNvbnZvbHV0aW9uOworICogdGhhdCBkb2Vzbid0IGFwcGVhciB0byBnaXZlIGFuIGVhc3kgYWR2YW50YWdlIGZvciB0aGUgRkZUIGFsZ29yaXRobSwgYnV0CisgKiBmb3IgdGhlIEthcmF0c3ViYSBhbGdvcml0aG0sIGl0J3MgZWFzeSB0byB1c2UgdHdvIDI1NiB4IDI1NgorICogY29udm9sdXRpb25zLCB0YWtpbmcgMiB4IDNeOCA9IDEyMzEyIG11bHRpcGxpY2F0aW9ucy4gIFtUaGlzIGRpZmZlcmVuY2UKKyAqIGlzIHRoYXQgdGhlIEZGVCBtZXRob2QgIndyYXBzIiB0aGUgYXJyYXlzLCBkb2luZyBhIDJebiB4IDJebiAtPiAyXm4sCisgKiB3aGlsZSB0aGUgS2FyYXRzdWJhIGFsZ29yaXRobSBwYWRzIHdpdGggemVyb3MsIGRvaW5nIDJebiB4IDJebiAtPiAyLjJebgorICogLSAxXS4gKi8KKworLyogVGhlcmUncyBhIGJpZyBsaWUgYWJvdmUsIGFjdHVhbGx5Li4uIGZvciBhIDR4NCBjb252b2x1dGlvbiwgaXQncyBxdWlja2VyCisgKiB0byBkbyBpdCB1c2luZyAxNiBtdWx0aXBsaWNhdGlvbnMgdGhhbiB0aGUgbW9yZSBjb21wbGV4IEthcmF0c3ViYQorICogYWxnb3JpdGhtLi4uICBTbyB0aGUgcmVjdXJzaW9uIGJvdHRvbXMgb3V0IGF0IDR4NHMuICBUaGlzIGluY3JlYXNlcyB0aGUKKyAqIG51bWJlciBvZiBtdWx0aXBsaWNhdGlvbnMgYnkgYSBmYWN0b3Igb2YgMTYvOSwgYnV0IHJlZHVjZXMgdGhlIG92ZXJoZWFkcworICogZHJhbWF0aWNhbGx5LiAqLworCisvKiBUaGUgY29udm9sdXRpb24gYWxnb3JpdGhtIGlzIGltcGxlbWVudGVkIGFzIGEgc3RhY2sgbWFjaGluZS4gIFdlIGhhdmUgYQorICogc3RhY2sgb2YgY29tbWFuZHMsIGVhY2ggaW4gb25lIG9mIHRoZSBmb3JtcyAiZG8gYSAyXm4geCAyXm4KKyAqIGNvbnZvbHV0aW9uIiwgb3IgImNvbWJpbmUgdGhlc2UgdGhyZWUgbGVuZ3RoIDJebiBvdXRwdXRzIGludG8gb25lCisgKiAyXntuKzF9IG91dHB1dC4iICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImNvbnZvbHZlLmgiCisKK3R5cGVkZWYgdW5pb24gc3RhY2tfZW50cnlfcworeworICBzdHJ1Y3QKKyAgeworICAgIGNvbnN0IGRvdWJsZSAqbGVmdCwgKnJpZ2h0OworICAgIGRvdWJsZSAqb3V0OworICB9CisgIHY7CisgIHN0cnVjdAorICB7CisgICAgZG91YmxlICptYWluLCAqbnVsbDsKKyAgfQorICBiOworCit9CitzdGFja19lbnRyeTsKKworc3RydWN0IF9zdHJ1Y3RfY29udm9sdmVfc3RhdGUKK3sKKyAgaW50IGRlcHRoLCBzbWFsbCwgYmlnLCBzdGFja19zaXplOworICBkb3VibGUgKmxlZnQ7CisgIGRvdWJsZSAqcmlnaHQ7CisgIGRvdWJsZSAqc2NyYXRjaDsKKyAgc3RhY2tfZW50cnkgKnN0YWNrOworfTsKKworLyoKKyAqIEluaXRpYWxpc2F0aW9uIHJvdXRpbmUgLSBzZXRzIHVwIHRhYmxlcyBhbmQgc3BhY2UgdG8gd29yayBpbi4KKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIGludGVybmFsIHN0YXRlLCB0byBiZSB1c2VkIHdoZW4gcGVyZm9ybWluZyBjYWxscy4KKyAqIE9uIGVycm9yLCByZXR1cm5zIE5VTEwuCisgKiBUaGUgcG9pbnRlciBzaG91bGQgYmUgZnJlZWQgd2hlbiBpdCBpcyBmaW5pc2hlZCB3aXRoLCBieSBjb252b2x2ZV9jbG9zZSgpLgorICovCitjb252b2x2ZV9zdGF0ZSAqCitjb252b2x2ZV9pbml0IChpbnQgZGVwdGgpCit7CisgIGNvbnZvbHZlX3N0YXRlICpzdGF0ZTsKKworICBzdGF0ZSA9IG1hbGxvYyAoc2l6ZW9mIChjb252b2x2ZV9zdGF0ZSkpOworICBzdGF0ZS0+ZGVwdGggPSBkZXB0aDsKKyAgc3RhdGUtPnNtYWxsID0gKDEgPDwgZGVwdGgpOworICBzdGF0ZS0+YmlnID0gKDIgPDwgZGVwdGgpOworICBzdGF0ZS0+c3RhY2tfc2l6ZSA9IGRlcHRoICogMzsKKyAgc3RhdGUtPmxlZnQgPSBjYWxsb2MgKHN0YXRlLT5iaWcsIHNpemVvZiAoZG91YmxlKSk7CisgIHN0YXRlLT5yaWdodCA9IGNhbGxvYyAoc3RhdGUtPnNtYWxsICogMywgc2l6ZW9mIChkb3VibGUpKTsKKyAgc3RhdGUtPnNjcmF0Y2ggPSBjYWxsb2MgKHN0YXRlLT5zbWFsbCAqIDMsIHNpemVvZiAoZG91YmxlKSk7CisgIHN0YXRlLT5zdGFjayA9IGNhbGxvYyAoc3RhdGUtPnN0YWNrX3NpemUgKyAxLCBzaXplb2YgKHN0YWNrX2VudHJ5KSk7CisgIHJldHVybiBzdGF0ZTsKK30KKworLyoKKyAqIEZyZWUgdGhlIHN0YXRlIGFsbG9jYXRlZCB3aXRoIGNvbnZvbHZlX2luaXQoKS4KKyAqLwordm9pZAorY29udm9sdmVfY2xvc2UgKGNvbnZvbHZlX3N0YXRlICogc3RhdGUpCit7CisgIGZyZWUgKHN0YXRlLT5sZWZ0KTsKKyAgZnJlZSAoc3RhdGUtPnJpZ2h0KTsKKyAgZnJlZSAoc3RhdGUtPnNjcmF0Y2gpOworICBmcmVlIChzdGF0ZS0+c3RhY2spOworICBmcmVlIChzdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitjb252b2x2ZV80IChkb3VibGUgKm91dCwgY29uc3QgZG91YmxlICpsZWZ0LCBjb25zdCBkb3VibGUgKnJpZ2h0KQorLyogVGhpcyBkb2VzIGEgNHg0IC0+IDcgY29udm9sdXRpb24uICBGb3Igd2hhdCBpdCdzIHdvcnRoLCB0aGUgc2xpZ2h0bHkgb2RkCisgKiBvcmRlcmluZyBnaXZlcyBhYm91dCBhIDElIHNwZWVkIHVwIG9uIG15IFBlbnRpdW0gSUkuICovCit7CisgIGRvdWJsZSBsMCwgbDEsIGwyLCBsMywgcjAsIHIxLCByMiwgcjM7CisgIGRvdWJsZSBhOworCisgIGwwID0gbGVmdFswXTsKKyAgcjAgPSByaWdodFswXTsKKyAgYSA9IGwwICogcjA7CisgIGwxID0gbGVmdFsxXTsKKyAgcjEgPSByaWdodFsxXTsKKyAgb3V0WzBdID0gYTsKKyAgYSA9IChsMCAqIHIxKSArIChsMSAqIHIwKTsKKyAgbDIgPSBsZWZ0WzJdOworICByMiA9IHJpZ2h0WzJdOworICBvdXRbMV0gPSBhOworICBhID0gKGwwICogcjIpICsgKGwxICogcjEpICsgKGwyICogcjApOworICBsMyA9IGxlZnRbM107CisgIHIzID0gcmlnaHRbM107CisgIG91dFsyXSA9IGE7CisKKyAgb3V0WzNdID0gKGwwICogcjMpICsgKGwxICogcjIpICsgKGwyICogcjEpICsgKGwzICogcjApOworICBvdXRbNF0gPSAobDEgKiByMykgKyAobDIgKiByMikgKyAobDMgKiByMSk7CisgIG91dFs1XSA9IChsMiAqIHIzKSArIChsMyAqIHIyKTsKKyAgb3V0WzZdID0gbDMgKiByMzsKK30KKworc3RhdGljIHZvaWQKK2NvbnZvbHZlX3J1biAoc3RhY2tfZW50cnkgKiB0b3AsIHVuc2lnbmVkIHNpemUsIGRvdWJsZSAqc2NyYXRjaCkKKy8qIEludGVycHJldCBhIHN0YWNrIG9mIGNvbW1hbmRzLiAgVGhlIHN0YWNrIHN0YXJ0cyB3aXRoIHR3byBlbnRyaWVzOyB0aGUKKyAqIGNvbnZvbHV0aW9uIHRvIGRvLCBhbmQgYW4gaWxsZWdhbCBlbnRyeSB1c2VkIHRvIG1hcmsgdGhlIHN0YWNrIHRvcC4gIFRoZQorICogc2l6ZSBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gZWFjaCBpbnB1dCwgYW5kIG11c3QgYmUgYSBwb3dlciBvZiAyLAorICogYW5kIGF0IGxlYXN0IDguICBJdCBpcyBPSyB0byBoYXZlIG91dCBlcXVhbCB0byBsZWZ0IGFuZC9vciByaWdodC4KKyAqIHNjcmF0Y2ggbXVzdCBoYXZlIGxlbmd0aCAzKnNpemUuICBUaGUgbnVtYmVyIG9mIHN0YWNrIGVudHJpZXMgbmVlZGVkIGlzCisgKiAzbi00IHdoZXJlIHNpemU9Ml5uLiAqLworeworICBkbyB7CisgICAgY29uc3QgZG91YmxlICpsZWZ0OworICAgIGNvbnN0IGRvdWJsZSAqcmlnaHQ7CisgICAgZG91YmxlICpvdXQ7CisKKyAgICAvKiBXaGVuIHdlIGdldCBoZXJlLCB0aGUgc3RhY2sgdG9wIGlzIGFsd2F5cyBhIGNvbnZvbHZlLAorICAgICAqIHdpdGggc2l6ZSA+IDQuICBTbyB3ZSB3aWxsIHNwbGl0IGl0LiAgV2UgcmVwZWF0ZWRseSBzcGxpdAorICAgICAqIHRoZSB0b3AgZW50cnkgdW50aWwgd2UgZ2V0IHRvIHNpemUgPSA0LiAqLworCisgICAgbGVmdCA9IHRvcC0+di5sZWZ0OworICAgIHJpZ2h0ID0gdG9wLT52LnJpZ2h0OworICAgIG91dCA9IHRvcC0+di5vdXQ7CisgICAgdG9wKys7CisKKyAgICBkbyB7CisgICAgICBkb3VibGUgKnNfbGVmdCwgKnNfcmlnaHQ7CisgICAgICBpbnQgaTsKKworICAgICAgLyogSGFsdmUgdGhlIHNpemUuICovCisgICAgICBzaXplID4+PSAxOworCisgICAgICAvKiBBbGxvY2F0ZSB0aGUgc2NyYXRjaCBhcmVhcy4gKi8KKyAgICAgIHNfbGVmdCA9IHNjcmF0Y2ggKyBzaXplICogMzsKKyAgICAgIC8qIHNfcmlnaHQgaXMgYSBsZW5ndGggMipzaXplIGJ1ZmZlciBhbHNvIHVzZWQgZm9yCisgICAgICAgKiBpbnRlcm1lZGlhdGUgb3V0cHV0LiAqLworICAgICAgc19yaWdodCA9IHNjcmF0Y2ggKyBzaXplICogNDsKKworICAgICAgLyogQ3JlYXRlIHRoZSBpbnRlcm1lZGlhdGUgZmFjdG9ycy4gKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgZG91YmxlIGwgPSBsZWZ0W2ldICsgbGVmdFtpICsgc2l6ZV07CisgICAgICAgIGRvdWJsZSByID0gcmlnaHRbaV0gKyByaWdodFtpICsgc2l6ZV07CisKKyAgICAgICAgc19sZWZ0W2kgKyBzaXplXSA9IHI7CisgICAgICAgIHNfbGVmdFtpXSA9IGw7CisgICAgICB9CisKKyAgICAgIC8qIFB1c2ggdGhlIGNvbWJpbmUgZW50cnkgb250byB0aGUgc3RhY2suICovCisgICAgICB0b3AgLT0gMzsKKyAgICAgIHRvcFsyXS5iLm1haW4gPSBvdXQ7CisgICAgICB0b3BbMl0uYi5udWxsID0gTlVMTDsKKworICAgICAgLyogUHVzaCB0aGUgbG93IGVudHJ5IG9udG8gdGhlIHN0YWNrLiAgVGhpcyBtdXN0IGJlCisgICAgICAgKiB0aGUgbGFzdCBvZiB0aGUgdGhyZWUgc3ViLWNvbnZvbHV0aW9ucywgYmVjYXVzZQorICAgICAgICogaXQgbWF5IG92ZXJ3cml0ZSB0aGUgYXJndW1lbnRzLiAqLworICAgICAgdG9wWzFdLnYubGVmdCA9IGxlZnQ7CisgICAgICB0b3BbMV0udi5yaWdodCA9IHJpZ2h0OworICAgICAgdG9wWzFdLnYub3V0ID0gb3V0OworCisgICAgICAvKiBQdXNoIHRoZSBtaWQgZW50cnkgb250byB0aGUgc3RhY2suICovCisgICAgICB0b3BbMF0udi5sZWZ0ID0gc19sZWZ0OworICAgICAgdG9wWzBdLnYucmlnaHQgPSBzX3JpZ2h0OworICAgICAgdG9wWzBdLnYub3V0ID0gc19yaWdodDsKKworICAgICAgLyogTGVhdmUgdGhlIGhpZ2ggZW50cnkgaW4gdmFyaWFibGVzLiAqLworICAgICAgbGVmdCArPSBzaXplOworICAgICAgcmlnaHQgKz0gc2l6ZTsKKyAgICAgIG91dCArPSBzaXplICogMjsKKworICAgIH0gd2hpbGUgKHNpemUgPiA0KTsKKworICAgIC8qIFdoZW4gd2UgZ2V0IGhlcmUsIHRoZSBzdGFjayB0b3AgaXMgYSBncm91cCBvZiAzCisgICAgICogY29udm9sdmVzLCB3aXRoIHNpemUgPSA0LCBmb2xsb3dlZCBieSBzb21lIGNvbWJpbmVzLiAgKi8KKyAgICBjb252b2x2ZV80IChvdXQsIGxlZnQsIHJpZ2h0KTsKKyAgICBjb252b2x2ZV80ICh0b3BbMF0udi5vdXQsIHRvcFswXS52LmxlZnQsIHRvcFswXS52LnJpZ2h0KTsKKyAgICBjb252b2x2ZV80ICh0b3BbMV0udi5vdXQsIHRvcFsxXS52LmxlZnQsIHRvcFsxXS52LnJpZ2h0KTsKKyAgICB0b3AgKz0gMjsKKworICAgIC8qIE5vdyBwcm9jZXNzIGNvbWJpbmVzLiAqLworICAgIGRvIHsKKyAgICAgIC8qIGIubWFpbiBpcyB0aGUgb3V0cHV0IGJ1ZmZlciwgbWlkIGlzIHRoZSBtaWRkbGUKKyAgICAgICAqIHBhcnQgd2hpY2ggbmVlZHMgdG8gYmUgYWRqdXN0ZWQgaW4gcGxhY2UsIGFuZAorICAgICAgICogdGhlbiBmb2xkZWQgYmFjayBpbnRvIHRoZSBvdXRwdXQuICBXZSBkbyB0aGlzIGluCisgICAgICAgKiBhIHNsaWdodGx5IHN0cmFuZ2Ugd2F5LCBzbyBhcyB0byBhdm9pZCBoYXZpbmcKKyAgICAgICAqIHR3byBsb29wcy4gKi8KKyAgICAgIGRvdWJsZSAqb3V0ID0gdG9wLT5iLm1haW47CisgICAgICBkb3VibGUgKm1pZCA9IHNjcmF0Y2ggKyBzaXplICogNDsKKyAgICAgIHVuc2lnbmVkIGludCBpOworCisgICAgICB0b3ArKzsKKyAgICAgIG91dFtzaXplICogMiAtIDFdID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplIC0gMTsgaSsrKSB7CisgICAgICAgIGRvdWJsZSBsbzsKKyAgICAgICAgZG91YmxlIGhpOworCisgICAgICAgIGxvID0gbWlkWzBdIC0gKG91dFswXSArIG91dFsyICogc2l6ZV0pICsgb3V0W3NpemVdOworICAgICAgICBoaSA9IG1pZFtzaXplXSAtIChvdXRbc2l6ZV0gKyBvdXRbMyAqIHNpemVdKSArIG91dFsyICogc2l6ZV07CisgICAgICAgIG91dFtzaXplXSA9IGxvOworICAgICAgICBvdXRbMiAqIHNpemVdID0gaGk7CisgICAgICAgIG91dCsrOworICAgICAgICBtaWQrKzsKKyAgICAgIH0KKyAgICAgIHNpemUgPDw9IDE7CisgICAgfSB3aGlsZSAodG9wLT5iLm51bGwgPT0gTlVMTCk7CisgIH0gd2hpbGUgKHRvcC0+Yi5tYWluICE9IE5VTEwpOworfQorCisvKgorICogY29udm9sdmVfbWF0Y2g6CisgKiBAbGFzdGNob2ljZTogYW4gYXJyYXkgb2Ygc2l6ZSBTTUFMTC4KKyAqIEBpbnB1dDogYW4gYXJyYXkgb2Ygc2l6ZSBCSUcgKDIqU01BTEwpCisgKiBAc3RhdGU6IGEgKG5vbi1OVUxMKSBwb2ludGVyIHJldHVybmVkIGJ5IGNvbnZvbHZlX2luaXQuCisgKgorICogV2UgZmluZCB0aGUgY29udGlndW91cyBTTUFMTC1zaXplIHN1Yi1hcnJheSBvZiBpbnB1dCB0aGF0IGJlc3QgbWF0Y2hlcworICogbGFzdGNob2ljZS4gQSBtZWFzdXJlIG9mIGhvdyBnb29kIGEgc3ViLWFycmF5IGlzIGNvbXBhcmVkIHdpdGggdGhlIGxhc3RjaG9pY2UKKyAqIGlzIGdpdmVuIGJ5IHRoZSBzdW0gb2YgdGhlIHByb2R1Y3RzIG9mIGVhY2ggcGFpciBvZiBlbnRyaWVzLiAgV2UgbWF4aW1pc2UKKyAqIHRoYXQsIGJ5IHRha2luZyBhbiBhcHByb3ByaWF0ZSBjb252b2x1dGlvbiwgYW5kIHRoZW4gZmluZGluZyB0aGUgbWF4aW11bQorICogZW50cnkgaW4gdGhlIGNvbnZvbHV0aW9ucy4KKyAqCisgKiBSZXR1cm46IHRoZSBwb3NpdGlvbiBvZiB0aGUgYmVzdCBtYXRjaAorICovCitpbnQKK2NvbnZvbHZlX21hdGNoIChjb25zdCBpbnQgKmxhc3RjaG9pY2UsIGNvbnN0IHNob3J0ICppbnB1dCwKKyAgICBjb252b2x2ZV9zdGF0ZSAqIHN0YXRlKQoreworICBkb3VibGUgYXZnID0gMDsKKyAgZG91YmxlIGJlc3Q7CisgIGludCBwID0gMDsKKyAgaW50IGk7CisgIGRvdWJsZSAqbGVmdCA9IHN0YXRlLT5sZWZ0OworICBkb3VibGUgKnJpZ2h0ID0gc3RhdGUtPnJpZ2h0OworICBkb3VibGUgKnNjcmF0Y2ggPSBzdGF0ZS0+c2NyYXRjaDsKKyAgc3RhY2tfZW50cnkgKnRvcCA9IHN0YXRlLT5zdGFjayArIChzdGF0ZS0+c3RhY2tfc2l6ZSAtIDEpOworCisgIGZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+YmlnOyBpKyspCisgICAgbGVmdFtpXSA9IGlucHV0W2ldOworCisgIGZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+c21hbGw7IGkrKykgeworICAgIGRvdWJsZSBhID0gbGFzdGNob2ljZVsoc3RhdGUtPnNtYWxsIC0gMSkgLSBpXTsKKworICAgIHJpZ2h0W2ldID0gYTsKKyAgICBhdmcgKz0gYTsKKyAgfQorCisgIC8qIFdlIGFkanVzdCB0aGUgc21hbGxlciBvZiB0aGUgdHdvIGlucHV0IGFycmF5cyB0byBoYXZlIGF2ZXJhZ2UKKyAgICogdmFsdWUgMC4gIFRoaXMgbWFrZXMgdGhlIGV2ZW50dWFsIHJlc3VsdCBpbnNlbnNpdGl2ZSB0byBib3RoCisgICAqIGNvbnN0YW50IG9mZnNldHMgYW5kIHBvc2l0aXZlIG11bHRpcGxpZXJzIG9mIHRoZSBpbnB1dHMuICovCisgIGF2ZyAvPSBzdGF0ZS0+c21hbGw7CisgIGZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+c21hbGw7IGkrKykKKyAgICByaWdodFtpXSAtPSBhdmc7CisgIC8qIEVuZC1vZi1zdGFjayBtYXJrZXIuICovCisgIHRvcFsxXS5iLm51bGwgPSBzY3JhdGNoOworICB0b3BbMV0uYi5tYWluID0gTlVMTDsKKyAgLyogVGhlIGxvdyAoc21hbGwgeCBzbWFsbCkgcGFydCwgb2Ygd2hpY2ggd2Ugd2FudCB0aGUgaGlnaCBvdXRwdXRzLiAqLworICB0b3AtPnYubGVmdCA9IGxlZnQ7CisgIHRvcC0+di5yaWdodCA9IHJpZ2h0OworICB0b3AtPnYub3V0ID0gcmlnaHQgKyBzdGF0ZS0+c21hbGw7CisgIGNvbnZvbHZlX3J1biAodG9wLCBzdGF0ZS0+c21hbGwsIHNjcmF0Y2gpOworCisgIC8qIFRoZSBoaWdoIChzbWFsbCB4IHNtYWxsKSBwYXJ0LCBvZiB3aGljaCB3ZSB3YW50IHRoZSBsb3cgb3V0cHV0cy4gKi8KKyAgdG9wLT52LmxlZnQgPSBsZWZ0ICsgc3RhdGUtPnNtYWxsOworICB0b3AtPnYucmlnaHQgPSByaWdodDsKKyAgdG9wLT52Lm91dCA9IHJpZ2h0OworICBjb252b2x2ZV9ydW4gKHRvcCwgc3RhdGUtPnNtYWxsLCBzY3JhdGNoKTsKKworICAvKiBOb3cgZmluZCB0aGUgYmVzdCBwb3NpdGlvbiBhbW91bmdzIHRoaXMuICBBcGFydCBmcm9tIHRoZSBmaXJzdAorICAgKiBhbmQgbGFzdCwgdGhlIHJlcXVpcmVkIGNvbnZvbHV0aW9uIG91dHB1dHMgYXJlIGZvcm1lZCBieSBhZGRpbmcKKyAgICogb3V0cHV0cyBmcm9tIHRoZSB0d28gY29udm9sdXRpb25zIGFib3ZlLiAqLworICBiZXN0ID0gcmlnaHRbc3RhdGUtPmJpZyAtIDFdOworICByaWdodFtzdGF0ZS0+YmlnICsgc3RhdGUtPnNtYWxsIC0gMV0gPSAwOworICBwID0gLTE7CisgIGZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+c21hbGw7IGkrKykgeworICAgIGRvdWJsZSBhID0gcmlnaHRbaV0gKyByaWdodFtpICsgc3RhdGUtPmJpZ107CisKKyAgICBpZiAoYSA+IGJlc3QpIHsKKyAgICAgIGJlc3QgPSBhOworICAgICAgcCA9IGk7CisgICAgfQorICB9CisgIHArKzsKKworI2lmIDAKKyAgeworICAgIC8qIFRoaXMgaXMgc29tZSBkZWJ1Z2dpbmcgY29kZS4uLiAqLworICAgIGJlc3QgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+c21hbGw7IGkrKykKKyAgICAgIGJlc3QgKz0gKChkb3VibGUpIGlucHV0W2kgKyBwXSkgKiAoKGRvdWJsZSkgbGFzdGNob2ljZVtpXSAtIGF2Zyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IHN0YXRlLT5zbWFsbDsgaSsrKSB7CisgICAgICBkb3VibGUgdG90ID0gMDsKKyAgICAgIHVuc2lnbmVkIGludCBqOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgc3RhdGUtPnNtYWxsOyBqKyspCisgICAgICAgIHRvdCArPSAoKGRvdWJsZSkgaW5wdXRbaSArIGpdKSAqICgoZG91YmxlKSBsYXN0Y2hvaWNlW2pdIC0gYXZnKTsKKyAgICAgIGlmICh0b3QgPiBiZXN0KQorICAgICAgICBwcmludGYgKCIoJWkpIiwgaSk7CisgICAgICBpZiAodG90ICE9IGxlZnRbaSArIChzdGF0ZS0+c21hbGwgLSAxKV0pCisgICAgICAgIHByaW50ZiAoIiEiKTsKKyAgICB9CisKKyAgICBwcmludGYgKCIlaVxuIiwgcCk7CisgIH0KKyNlbmRpZgorCisgIHJldHVybiBwOworfQpkaWZmIC0tZ2l0IGEvZ3N0L21vbm9zY29wZS9jb252b2x2ZS5oIGIvZ3N0L21vbm9zY29wZS9jb252b2x2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YTdmMDUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbW9ub3Njb3BlL2NvbnZvbHZlLmgKQEAgLTAsMCArMSw0OCBAQAorLyogY29udm9sdmUuaDogSGVhZGVyIGZvciBjb252b2x1dGlvbnMuCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OSBSYWxwaCBMb2FkZXIgPHN1Y2tmaXNoQGlodWcuY28ubno+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICoKKyAqIE5vdGU6IDd0aCBEZWNlbWJlciAyMDA0OiBUaGlzIGZpbGUgdXNlZCB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLAorICogICAgICAgYnV0IHdlIGdvdCBwZXJtaXNzaW9uIGZyb20gUmFscCBMb2FkZXIgdG8gcmVsaWNlbnNlIGl0IHRvIExHUEwuCisgKgorICoKKyAqLworCisjaWZuZGVmIENPTlZPTFZFX0gKKyNkZWZpbmUgQ09OVk9MVkVfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIENvbnZvbHV0aW9uIHN0YXRlICovCit0eXBlZGVmIHN0cnVjdCBfc3RydWN0X2NvbnZvbHZlX3N0YXRlIGNvbnZvbHZlX3N0YXRlOworCitjb252b2x2ZV9zdGF0ZSAqY29udm9sdmVfaW5pdCAoaW50IGRlcHRoKTsKK3ZvaWQgY29udm9sdmVfY2xvc2UgKGNvbnZvbHZlX3N0YXRlICogc3RhdGUpOworCitpbnQgY29udm9sdmVfbWF0Y2ggKGNvbnN0IGludCAqIGxhc3RjaG9pY2UsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0IGludCAqIGlucHV0LAorICAgICAgICAgICAgICAgICAgICBjb252b2x2ZV9zdGF0ZSAqIHN0YXRlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jIGIvZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2JkZTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYwpAQCAtMCwwICsxLDU4MSBAQAorLyogZ3N0bW9ub3Njb3BlLmM6IGltcGxlbWVudGF0aW9uIG9mIG1vbm9zY29wZSBkcmF3aW5nIGVsZW1lbnQKKyAqIENvcHlyaWdodCAoQykgPDIwMDI+IFJpY2hhcmQgQm91bHRvbiA8cmljaGFyZEB0YXJ0YXJ1cy5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbSBhdCBmbHVlbmRvIGRvdCBjb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtbW9ub3Njb3BlCisgKiBAc2VlX2Fsc286IGdvb20KKyAqCisgKiBNb25vc2NvcGUgaXMgYW4gYXVkaW8gdmlzdWFsaXNhdGlvbiBlbGVtZW50LiBJdCBjcmVhdGVzIGEgY29sb3VyZWQKKyAqIGN1cnZlIG9mIHRoZSBhdWRpbyBzaWduYWwgbGlrZSBvbiBhbiBvc2NpbGxvc2NvcGUuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyAhIGF1ZGlvY29udmVydCAhIG1vbm9zY29wZSAhIHZpZGVvY29udmVydCAhIHhpbWFnZXNpbmsKKyAqIF18CisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdzdG1vbm9zY29wZS5oIgorI2luY2x1ZGUgIm1vbm9zY29wZS5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChtb25vc2NvcGVfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgbW9ub3Njb3BlX2RlYnVnCisKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19CSUdfRU5ESUFOCisjZGVmaW5lIFJHQl9PUkRFUiAieFJHQiIKKyNlbHNlCisjZGVmaW5lIFJHQl9PUkRFUiAiQkdSeCIKKyNlbmRpZgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIFJHQl9PUkRFUiAiLCAiCisgICAgICAgICJ3aWR0aCA9ICIgR19TVFJJTkdJRlkgKHNjb3BlX3dpZHRoKSAiLCAiCisgICAgICAgICJoZWlnaHQgPSAiIEdfU1RSSU5HSUZZIChzY29wZV9oZWlnaHQpICIsICIKKyAgICAgICAgImZyYW1lcmF0ZSA9ICIgR1NUX1ZJREVPX0ZQU19SQU5HRSkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoUzE2KSAiLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyA4MDAwLCA5NjAwMCBdLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkIikKKyAgICApOworCisKKyNkZWZpbmUgZ3N0X21vbm9zY29wZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RNb25vc2NvcGUsIGdzdF9tb25vc2NvcGUsIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgdm9pZCBnc3RfbW9ub3Njb3BlX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9tb25vc2NvcGVfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21vbm9zY29wZV9zcmNfc2V0Y2FwcyAoR3N0TW9ub3Njb3BlICogbW9ubywgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIGdib29sZWFuIGdzdF9tb25vc2NvcGVfc2lua19zZXRjYXBzIChHc3RNb25vc2NvcGUgKiBtb25vLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyB2b2lkIGdzdF9tb25vc2NvcGVfcmVzZXQgKEdzdE1vbm9zY29wZSAqIG1vbm9zY29wZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21vbm9zY29wZV9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbW9ub3Njb3BlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X21vbm9zY29wZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgdm9pZAorZ3N0X21vbm9zY29wZV9jbGFzc19pbml0IChHc3RNb25vc2NvcGVDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfbW9ub3Njb3BlX2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21vbm9zY29wZV9jaGFuZ2Vfc3RhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIk1vbm9zY29wZSIsCisgICAgICAiVmlzdWFsaXphdGlvbiIsCisgICAgICAiRGlzcGxheXMgYSBoaWdobHkgc3RhYmlsaXNlZCB3YXZlZm9ybSBvZiBhdWRpbyBpbnB1dCIsCisgICAgICAiUmljaGFyZCBCb3VsdG9uIDxyaWNoYXJkQHRhcnRhcnVzLm9yZz4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tb25vc2NvcGVfaW5pdCAoR3N0TW9ub3Njb3BlICogbW9ub3Njb3BlKQoreworICBtb25vc2NvcGUtPnNpbmtwYWQgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzaW5rX3RlbXBsYXRlLCAic2luayIpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAobW9ub3Njb3BlLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tb25vc2NvcGVfY2hhaW4pKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKG1vbm9zY29wZS0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbW9ub3Njb3BlX3NpbmtfZXZlbnQpKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKG1vbm9zY29wZSksIG1vbm9zY29wZS0+c2lua3BhZCk7CisKKyAgbW9ub3Njb3BlLT5zcmNwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNyY190ZW1wbGF0ZSwgInNyYyIpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAobW9ub3Njb3BlLT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21vbm9zY29wZV9zcmNfZXZlbnQpKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKG1vbm9zY29wZSksIG1vbm9zY29wZS0+c3JjcGFkKTsKKworICBtb25vc2NvcGUtPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgIG1vbm9zY29wZS0+bmV4dF90cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIG1vbm9zY29wZS0+YnBzID0gc2l6ZW9mIChnaW50MTYpOworCisgIC8qIHJlc2V0IHRoZSBpbml0aWFsIHZpZGVvIHN0YXRlICovCisgIG1vbm9zY29wZS0+d2lkdGggPSBzY29wZV93aWR0aDsKKyAgbW9ub3Njb3BlLT5oZWlnaHQgPSBzY29wZV9oZWlnaHQ7CisgIG1vbm9zY29wZS0+ZnBzX251bSA9IDI1OyAgICAgIC8qIGRlc2lyZWQgZnJhbWUgcmF0ZSAqLworICBtb25vc2NvcGUtPmZwc19kZW5vbSA9IDE7CisgIG1vbm9zY29wZS0+dmlzc3RhdGUgPSBOVUxMOworCisgIC8qIHJlc2V0IHRoZSBpbml0aWFsIGF1ZGlvIHN0YXRlICovCisgIG1vbm9zY29wZS0+cmF0ZSA9IEdTVF9BVURJT19ERUZfUkFURTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tb25vc2NvcGVfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdE1vbm9zY29wZSAqbW9ub3Njb3BlID0gR1NUX01PTk9TQ09QRSAob2JqZWN0KTsKKworICBpZiAobW9ub3Njb3BlLT52aXNzdGF0ZSkKKyAgICBtb25vc2NvcGVfY2xvc2UgKG1vbm9zY29wZS0+dmlzc3RhdGUpOworCisgIGdfb2JqZWN0X3VucmVmIChtb25vc2NvcGUtPmFkYXB0ZXIpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tb25vc2NvcGVfcmVzZXQgKEdzdE1vbm9zY29wZSAqIG1vbm9zY29wZSkKK3sKKyAgbW9ub3Njb3BlLT5uZXh0X3RzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBnc3RfYWRhcHRlcl9jbGVhciAobW9ub3Njb3BlLT5hZGFwdGVyKTsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJm1vbm9zY29wZS0+c2VnbWVudCwgR1NUX0ZPUk1BVF9VTkRFRklORUQpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAobW9ub3Njb3BlKTsKKyAgbW9ub3Njb3BlLT5wcm9wb3J0aW9uID0gMS4wOworICBtb25vc2NvcGUtPmVhcmxpZXN0X3RpbWUgPSAtMTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKG1vbm9zY29wZSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21vbm9zY29wZV9zaW5rX3NldGNhcHMgKEdzdE1vbm9zY29wZSAqIG1vbm9zY29wZSwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAicmF0ZSIsICZtb25vc2NvcGUtPnJhdGUpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG1vbm9zY29wZSwgInNhbXBsZSByYXRlID0gJWQiLCBtb25vc2NvcGUtPnJhdGUpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbW9ub3Njb3BlX3NyY19zZXRjYXBzIChHc3RNb25vc2NvcGUgKiBtb25vc2NvcGUsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAid2lkdGgiLCAmbW9ub3Njb3BlLT53aWR0aCk7CisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiaGVpZ2h0IiwgJm1vbm9zY29wZS0+aGVpZ2h0KTsKKyAgZ3N0X3N0cnVjdHVyZV9nZXRfZnJhY3Rpb24gKHN0cnVjdHVyZSwgImZyYW1lcmF0ZSIsICZtb25vc2NvcGUtPmZwc19udW0sCisgICAgICAmbW9ub3Njb3BlLT5mcHNfZGVub20pOworCisgIG1vbm9zY29wZS0+b3V0c2l6ZSA9IG1vbm9zY29wZS0+d2lkdGggKiBtb25vc2NvcGUtPmhlaWdodCAqIDQ7CisgIG1vbm9zY29wZS0+ZnJhbWVfZHVyYXRpb24gPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChHU1RfU0VDT05ELAorICAgICAgbW9ub3Njb3BlLT5mcHNfZGVub20sIG1vbm9zY29wZS0+ZnBzX251bSk7CisgIG1vbm9zY29wZS0+c3BmID0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKG1vbm9zY29wZS0+cmF0ZSwgbW9ub3Njb3BlLT5mcHNfZGVub20sCisgICAgICBtb25vc2NvcGUtPmZwc19udW0pOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG1vbm9zY29wZSwgImRpbWVuc2lvbiAlZHglZCwgZnJhbWVyYXRlICVkLyVkLCBzcGYgJWQiLAorICAgICAgbW9ub3Njb3BlLT53aWR0aCwgbW9ub3Njb3BlLT5oZWlnaHQsIG1vbm9zY29wZS0+ZnBzX251bSwKKyAgICAgIG1vbm9zY29wZS0+ZnBzX2Rlbm9tLCBtb25vc2NvcGUtPnNwZik7CisKKyAgaWYgKG1vbm9zY29wZS0+dmlzc3RhdGUpIHsKKyAgICBtb25vc2NvcGVfY2xvc2UgKG1vbm9zY29wZS0+dmlzc3RhdGUpOworICAgIG1vbm9zY29wZS0+dmlzc3RhdGUgPSBOVUxMOworICB9CisKKyAgbW9ub3Njb3BlLT52aXNzdGF0ZSA9IG1vbm9zY29wZV9pbml0IChtb25vc2NvcGUtPndpZHRoLCBtb25vc2NvcGUtPmhlaWdodCk7CisKKyAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAobW9ub3Njb3BlLT5zcmNwYWQsIGNhcHMpOworCisgIHJldHVybiByZXMgJiYgKG1vbm9zY29wZS0+dmlzc3RhdGUgIT0gTlVMTCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21vbm9zY29wZV9zcmNfbmVnb3RpYXRlIChHc3RNb25vc2NvcGUgKiBtb25vc2NvcGUpCit7CisgIEdzdENhcHMgKm90aGVyY2FwcywgKnRhcmdldDsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdENhcHMgKnRlbXBsOworICBHc3RRdWVyeSAqcXVlcnk7CisgIEdzdEJ1ZmZlclBvb2wgKnBvb2w7CisgIEdzdFN0cnVjdHVyZSAqY29uZmlnOworICBndWludCBzaXplLCBtaW4sIG1heDsKKworICB0ZW1wbCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChtb25vc2NvcGUtPnNyY3BhZCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAobW9ub3Njb3BlLCAicGVyZm9ybWluZyBuZWdvdGlhdGlvbiIpOworCisgIC8qIHNlZSB3aGF0IHRoZSBwZWVyIGNhbiBkbyAqLworICBvdGhlcmNhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAobW9ub3Njb3BlLT5zcmNwYWQsIE5VTEwpOworICBpZiAob3RoZXJjYXBzKSB7CisgICAgdGFyZ2V0ID0gZ3N0X2NhcHNfaW50ZXJzZWN0IChvdGhlcmNhcHMsIHRlbXBsKTsKKyAgICBnc3RfY2Fwc191bnJlZiAob3RoZXJjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGVtcGwpOworCisgICAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5ICh0YXJnZXQpKQorICAgICAgZ290byBub19mb3JtYXQ7CisKKyAgICB0YXJnZXQgPSBnc3RfY2Fwc190cnVuY2F0ZSAodGFyZ2V0KTsKKyAgfSBlbHNlIHsKKyAgICB0YXJnZXQgPSB0ZW1wbDsKKyAgfQorCisgIHRhcmdldCA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKHRhcmdldCk7CisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHRhcmdldCwgMCk7CisgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfaW50IChzdHJ1Y3R1cmUsICJ3aWR0aCIsIDMyMCk7CisgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfaW50IChzdHJ1Y3R1cmUsICJoZWlnaHQiLCAyNDApOworICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ZyYWN0aW9uIChzdHJ1Y3R1cmUsICJmcmFtZXJhdGUiLCAyNSwgMSk7CisKKyAgZ3N0X21vbm9zY29wZV9zcmNfc2V0Y2FwcyAobW9ub3Njb3BlLCB0YXJnZXQpOworCisgIC8qIHRyeSB0byBnZXQgYSBidWZmZXJwb29sIG5vdyAqLworICAvKiBmaW5kIGEgcG9vbCBmb3IgdGhlIG5lZ290aWF0ZWQgY2FwcyBub3cgKi8KKyAgcXVlcnkgPSBnc3RfcXVlcnlfbmV3X2FsbG9jYXRpb24gKHRhcmdldCwgVFJVRSk7CisKKyAgaWYgKCFnc3RfcGFkX3BlZXJfcXVlcnkgKG1vbm9zY29wZS0+c3JjcGFkLCBxdWVyeSkpIHsKKyAgfQorCisgIGlmIChnc3RfcXVlcnlfZ2V0X25fYWxsb2NhdGlvbl9wb29scyAocXVlcnkpID4gMCkgeworICAgIC8qIHdlIGdvdCBjb25maWd1cmF0aW9uIGZyb20gb3VyIHBlZXIsIHBhcnNlIHRoZW0gKi8KKyAgICBnc3RfcXVlcnlfcGFyc2VfbnRoX2FsbG9jYXRpb25fcG9vbCAocXVlcnksIDAsICZwb29sLCAmc2l6ZSwgJm1pbiwgJm1heCk7CisgIH0gZWxzZSB7CisgICAgcG9vbCA9IE5VTEw7CisgICAgc2l6ZSA9IG1vbm9zY29wZS0+b3V0c2l6ZTsKKyAgICBtaW4gPSBtYXggPSAwOworICB9CisKKyAgaWYgKHBvb2wgPT0gTlVMTCkgeworICAgIC8qIHdlIGRpZCBub3QgZ2V0IGEgcG9vbCwgbWFrZSBvbmUgb3Vyc2VsdmVzIHRoZW4gKi8KKyAgICBwb29sID0gZ3N0X2J1ZmZlcl9wb29sX25ldyAoKTsKKyAgfQorCisgIGNvbmZpZyA9IGdzdF9idWZmZXJfcG9vbF9nZXRfY29uZmlnIChwb29sKTsKKyAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19zZXRfcGFyYW1zIChjb25maWcsIHRhcmdldCwgc2l6ZSwgbWluLCBtYXgpOworICBnc3RfYnVmZmVyX3Bvb2xfc2V0X2NvbmZpZyAocG9vbCwgY29uZmlnKTsKKworICBpZiAobW9ub3Njb3BlLT5wb29sKSB7CisgICAgZ3N0X2J1ZmZlcl9wb29sX3NldF9hY3RpdmUgKG1vbm9zY29wZS0+cG9vbCwgVFJVRSk7CisgICAgZ3N0X29iamVjdF91bnJlZiAobW9ub3Njb3BlLT5wb29sKTsKKyAgfQorICBtb25vc2NvcGUtPnBvb2wgPSBwb29sOworCisgIC8qIGFuZCBhY3RpdmF0ZSAqLworICBnc3RfYnVmZmVyX3Bvb2xfc2V0X2FjdGl2ZSAocG9vbCwgVFJVRSk7CisKKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisgIGdzdF9jYXBzX3VucmVmICh0YXJnZXQpOworCisgIHJldHVybiBUUlVFOworCitub19mb3JtYXQ6CisgIHsKKyAgICBnc3RfY2Fwc191bnJlZiAodGFyZ2V0KTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogbWFrZSBzdXJlIHdlIGFyZSBuZWdvdGlhdGVkICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZW5zdXJlX25lZ290aWF0ZWQgKEdzdE1vbm9zY29wZSAqIG1vbm9zY29wZSkKK3sKKyAgZ2Jvb2xlYW4gcmVjb25maWd1cmU7CisKKyAgcmVjb25maWd1cmUgPSBnc3RfcGFkX2NoZWNrX3JlY29uZmlndXJlIChtb25vc2NvcGUtPnNyY3BhZCk7CisKKyAgLyogd2UgZG9uJ3Qga25vdyBhbiBvdXRwdXQgZm9ybWF0IHlldCwgcGljayBvbmUgKi8KKyAgaWYgKHJlY29uZmlndXJlIHx8ICFnc3RfcGFkX2hhc19jdXJyZW50X2NhcHMgKG1vbm9zY29wZS0+c3JjcGFkKSkgeworICAgIGlmICghZ3N0X21vbm9zY29wZV9zcmNfbmVnb3RpYXRlIChtb25vc2NvcGUpKSB7CisgICAgICBnc3RfcGFkX21hcmtfcmVjb25maWd1cmUgKG1vbm9zY29wZS0+c3JjcGFkKTsKKyAgICAgIGlmIChHU1RfUEFEX0lTX0ZMVVNISU5HIChtb25vc2NvcGUtPnNyY3BhZCkpCisgICAgICAgIHJldHVybiBHU1RfRkxPV19GTFVTSElORzsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICAgIH0KKyAgfQorICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbW9ub3Njb3BlX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogaW5idWYpCit7CisgIEdzdEZsb3dSZXR1cm4gZmxvd19yZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0TW9ub3Njb3BlICptb25vc2NvcGU7CisKKyAgbW9ub3Njb3BlID0gR1NUX01PTk9TQ09QRSAocGFyZW50KTsKKworICBpZiAobW9ub3Njb3BlLT5yYXRlID09IDApIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChpbmJ1Zik7CisgICAgZmxvd19yZXQgPSBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIC8qIE1ha2Ugc3VyZSBoYXZlIGFuIG91dHB1dCBmb3JtYXQgKi8KKyAgZmxvd19yZXQgPSBlbnN1cmVfbmVnb3RpYXRlZCAobW9ub3Njb3BlKTsKKyAgaWYgKGZsb3dfcmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoaW5idWYpOworICAgIGdvdG8gb3V0OworICB9CisKKyAgLyogZG9uJ3QgdHJ5IHRvIGNvbWJpbmUgc2FtcGxlcyBmcm9tIGRpc2NvbnQgYnVmZmVyICovCisgIGlmIChHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChpbmJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpKSB7CisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKG1vbm9zY29wZS0+YWRhcHRlcik7CisgICAgbW9ub3Njb3BlLT5uZXh0X3RzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgfQorCisgIC8qIE1hdGNoIHRpbWVzdGFtcHMgZnJvbSB0aGUgaW5jb21pbmcgYXVkaW8gKi8KKyAgaWYgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZikgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICBtb25vc2NvcGUtPm5leHRfdHMgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWYpOworCisgIEdTVF9MT0dfT0JKRUNUIChtb25vc2NvcGUsCisgICAgICAiaW4gYnVmZmVyIGhhcyAlIiBHX0dTSVpFX0ZPUk1BVCAiIHNhbXBsZXMsIHRzPSUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGluYnVmKSAvIG1vbm9zY29wZS0+YnBzLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmKSkpOworCisgIGdzdF9hZGFwdGVyX3B1c2ggKG1vbm9zY29wZS0+YWRhcHRlciwgaW5idWYpOworICBpbmJ1ZiA9IE5VTEw7CisKKyAgLyogQ29sbGVjdCBzYW1wbGVzIHVudGlsIHdlIGhhdmUgZW5vdWdoIGZvciBhbiBvdXRwdXQgZnJhbWUgKi8KKyAgd2hpbGUgKGZsb3dfcmV0ID09IEdTVF9GTE9XX09LKSB7CisgICAgZ2ludDE2ICpzYW1wbGVzOworICAgIEdzdEJ1ZmZlciAqb3V0YnVmID0gTlVMTDsKKyAgICBndWludDMyICpwaXhlbHMsIGF2YWlsLCBieXRlc3BlcmZyYW1lOworCisgICAgYXZhaWwgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKG1vbm9zY29wZS0+YWRhcHRlcik7CisgICAgR1NUX0xPR19PQkpFQ1QgKG1vbm9zY29wZSwgImJ5dGVzIGF2YWlsIG5vdyAldSIsIGF2YWlsKTsKKworICAgIGJ5dGVzcGVyZnJhbWUgPSBtb25vc2NvcGUtPnNwZiAqIG1vbm9zY29wZS0+YnBzOworICAgIGlmIChhdmFpbCA8IGJ5dGVzcGVyZnJhbWUpCisgICAgICBicmVhazsKKworICAgIC8qIEZJWE1FOiBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCBRb1MsIHdlIGFyZSBza2lwcGluZyB3YXkgdG9vIG11Y2gKKyAgICAgKiBzdHVmZiBldmVuIHdpdGggdmVyeSBsb3cgQ1BVIGxvYWRzICovCisjaWYgMAorICAgIGlmIChtb25vc2NvcGUtPm5leHRfdHMgIT0gLTEpIHsKKyAgICAgIGdib29sZWFuIG5lZWRfc2tpcDsKKyAgICAgIGdpbnQ2NCBxb3N0aW1lOworCisgICAgICBxb3N0aW1lID0gZ3N0X3NlZ21lbnRfdG9fcnVubmluZ190aW1lICgmbW9ub3Njb3BlLT5zZWdtZW50LAorICAgICAgICAgIEdTVF9GT1JNQVRfVElNRSwgbW9ub3Njb3BlLT5uZXh0X3RzKTsKKworICAgICAgR1NUX09CSkVDVF9MT0NLIChtb25vc2NvcGUpOworICAgICAgLyogY2hlY2sgZm9yIFFvUywgZG9uJ3QgY29tcHV0ZSBidWZmZXJzIHRoYXQgYXJlIGtub3duIHRvIGJlIGxhdGUgKi8KKyAgICAgIG5lZWRfc2tpcCA9CisgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKG1vbm9zY29wZS0+ZWFybGllc3RfdGltZSkgJiYKKyAgICAgICAgICBxb3N0aW1lIDw9IG1vbm9zY29wZS0+ZWFybGllc3RfdGltZTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChtb25vc2NvcGUpOworCisgICAgICBpZiAobmVlZF9za2lwKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobW9ub3Njb3BlLAorICAgICAgICAgICAgIlFvUzogc2tpcCB0czogJSIgR1NUX1RJTUVfRk9STUFUICIsIGVhcmxpZXN0OiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChxb3N0aW1lKSwgR1NUX1RJTUVfQVJHUyAobW9ub3Njb3BlLT5lYXJsaWVzdF90aW1lKSk7CisgICAgICAgIGdvdG8gc2tpcDsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIHNhbXBsZXMgPSAoZ2ludDE2ICopIGdzdF9hZGFwdGVyX21hcCAobW9ub3Njb3BlLT5hZGFwdGVyLCBieXRlc3BlcmZyYW1lKTsKKworICAgIGlmIChtb25vc2NvcGUtPnNwZiA8IGNvbnZvbHZlcl9iaWcpIHsKKyAgICAgIGdpbnQxNiBpbl9kYXRhW2NvbnZvbHZlcl9iaWddLCBpOworICAgICAgZ2RvdWJsZSBzY2FsZSA9IChnZG91YmxlKSBtb25vc2NvcGUtPnNwZiAvIChnZG91YmxlKSBjb252b2x2ZXJfYmlnOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udm9sdmVyX2JpZzsgKytpKSB7CisgICAgICAgIGdkb3VibGUgb2ZmID0gKGdkb3VibGUpIGkgKiBzY2FsZTsKKyAgICAgICAgaW5fZGF0YVtpXSA9IHNhbXBsZXNbTUlOICgoZ3VpbnQpIG9mZiwgbW9ub3Njb3BlLT5zcGYpXTsKKyAgICAgIH0KKyAgICAgIHBpeGVscyA9IG1vbm9zY29wZV91cGRhdGUgKG1vbm9zY29wZS0+dmlzc3RhdGUsIGluX2RhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBub3QgcmVhbGx5IGNvcnJlY3QsIGJ1dCBsb29rcyBtdWNoIHByZXR0aWVyICovCisgICAgICBwaXhlbHMgPSBtb25vc2NvcGVfdXBkYXRlIChtb25vc2NvcGUtPnZpc3N0YXRlLCBzYW1wbGVzKTsKKyAgICB9CisKKyAgICBHU1RfTE9HX09CSkVDVCAobW9ub3Njb3BlLCAiYWxsb2NhdGluZyBvdXRwdXQgYnVmZmVyIik7CisgICAgZmxvd19yZXQgPSBnc3RfYnVmZmVyX3Bvb2xfYWNxdWlyZV9idWZmZXIgKG1vbm9zY29wZS0+cG9vbCwgJm91dGJ1ZiwgTlVMTCk7CisgICAgaWYgKGZsb3dfcmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgICBnc3RfYWRhcHRlcl91bm1hcCAobW9ub3Njb3BlLT5hZGFwdGVyKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGdzdF9idWZmZXJfZmlsbCAob3V0YnVmLCAwLCBwaXhlbHMsIG1vbm9zY29wZS0+b3V0c2l6ZSk7CisKKyAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSA9IG1vbm9zY29wZS0+bmV4dF90czsKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gbW9ub3Njb3BlLT5mcmFtZV9kdXJhdGlvbjsKKworICAgIGZsb3dfcmV0ID0gZ3N0X3BhZF9wdXNoIChtb25vc2NvcGUtPnNyY3BhZCwgb3V0YnVmKTsKKworI2lmIDAKKyAgc2tpcDoKKyNlbmRpZgorCisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChtb25vc2NvcGUtPm5leHRfdHMpKQorICAgICAgbW9ub3Njb3BlLT5uZXh0X3RzICs9IG1vbm9zY29wZS0+ZnJhbWVfZHVyYXRpb247CisKKyAgICBnc3RfYWRhcHRlcl9mbHVzaCAobW9ub3Njb3BlLT5hZGFwdGVyLCBieXRlc3BlcmZyYW1lKTsKKyAgfQorCitvdXQ6CisKKyAgcmV0dXJuIGZsb3dfcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tb25vc2NvcGVfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdE1vbm9zY29wZSAqbW9ub3Njb3BlOworICBnYm9vbGVhbiByZXM7CisKKyAgbW9ub3Njb3BlID0gR1NUX01PTk9TQ09QRSAocGFyZW50KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVEFSVDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAobW9ub3Njb3BlLT5zcmNwYWQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6CisgICAgICBnc3RfbW9ub3Njb3BlX3Jlc2V0IChtb25vc2NvcGUpOworICAgICAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChtb25vc2NvcGUtPnNyY3BhZCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDoKKyAgICB7CisgICAgICAvKiB0aGUgbmV3c2VnbWVudCB2YWx1ZXMgYXJlIHVzZWQgdG8gY2xpcCB0aGUgaW5wdXQgc2FtcGxlcworICAgICAgICogYW5kIHRvIGNvbnZlcnQgdGhlIGluY29tbWluZyB0aW1lc3RhbXBzIHRvIHJ1bm5pbmcgdGltZSBzbworICAgICAgICogd2UgY2FuIGRvIFFvUyAqLworICAgICAgZ3N0X2V2ZW50X2NvcHlfc2VnbWVudCAoZXZlbnQsICZtb25vc2NvcGUtPnNlZ21lbnQpOworCisgICAgICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKG1vbm9zY29wZS0+c3JjcGFkLCBldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfY2FwcyAoZXZlbnQsICZjYXBzKTsKKyAgICAgIGdzdF9tb25vc2NvcGVfc2lua19zZXRjYXBzIChtb25vc2NvcGUsIGNhcHMpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICByZXMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKG1vbm9zY29wZS0+c3JjcGFkLCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21vbm9zY29wZV9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RNb25vc2NvcGUgKm1vbm9zY29wZTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIG1vbm9zY29wZSA9IEdTVF9NT05PU0NPUEUgKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfUU9TOnsKKyAgICAgIGdkb3VibGUgcHJvcG9ydGlvbjsKKyAgICAgIEdzdENsb2NrVGltZURpZmYgZGlmZjsKKyAgICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9xb3MgKGV2ZW50LCBOVUxMLCAmcHJvcG9ydGlvbiwgJmRpZmYsICZ0aW1lc3RhbXApOworCisgICAgICAvKiBzYXZlIHN0dWZmIGZvciB0aGUgX2NoYWluKCkgZnVuY3Rpb24gKi8KKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAobW9ub3Njb3BlKTsKKyAgICAgIG1vbm9zY29wZS0+cHJvcG9ydGlvbiA9IHByb3BvcnRpb247CisgICAgICBpZiAoZGlmZiA+PSAwKQorICAgICAgICAvKiB3ZSdyZSBsYXRlLCB0aGlzIGlzIGEgZ29vZCBlc3RpbWF0ZSBmb3IgbmV4dCBkaXNwbGF5YWJsZQorICAgICAgICAgKiBmcmFtZSAoc2VlIHBhcnQtcW9zLnR4dCkgKi8KKyAgICAgICAgbW9ub3Njb3BlLT5lYXJsaWVzdF90aW1lID0KKyAgICAgICAgICAgIHRpbWVzdGFtcCArIDIgKiBkaWZmICsgbW9ub3Njb3BlLT5mcmFtZV9kdXJhdGlvbjsKKyAgICAgIGVsc2UKKyAgICAgICAgbW9ub3Njb3BlLT5lYXJsaWVzdF90aW1lID0gdGltZXN0YW1wICsgZGlmZjsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChtb25vc2NvcGUpOworCisgICAgICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKG1vbm9zY29wZS0+c2lua3BhZCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKG1vbm9zY29wZS0+c2lua3BhZCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9tb25vc2NvcGVfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0TW9ub3Njb3BlICptb25vc2NvcGUgPSBHU1RfTU9OT1NDT1BFIChlbGVtZW50KTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGdzdF9tb25vc2NvcGVfcmVzZXQgKG1vbm9zY29wZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgaWYgKG1vbm9zY29wZS0+cG9vbCkgeworICAgICAgICBnc3RfYnVmZmVyX3Bvb2xfc2V0X2FjdGl2ZSAobW9ub3Njb3BlLT5wb29sLCBGQUxTRSk7CisgICAgICAgIGdzdF9vYmplY3RfcmVwbGFjZSAoKEdzdE9iamVjdCAqKikgJiBtb25vc2NvcGUtPnBvb2wsIE5VTEwpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChtb25vc2NvcGVfZGVidWcsICJtb25vc2NvcGUiLCAwLAorICAgICAgIm1vbm9zY29wZSBlbGVtZW50Iik7CisKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJtb25vc2NvcGUiLAorICAgICAgR1NUX1JBTktfTk9ORSwgR1NUX1RZUEVfTU9OT1NDT1BFKTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIG1vbm9zY29wZSwKKyAgICAiTW9ub3Njb3BlIHZpc3VhbGl6YXRpb24iLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9nc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5oIGIvZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjZhNmQyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuaApAQCAtMCwwICsxLDgzIEBACisvKiBHU3RyZWFtZXIgbW9ub3Njb3BlIHZpc3VhbGlzYXRpb24gZWxlbWVudAorICogQ29weXJpZ2h0IChDKSA8MjAwMj4gUmljaGFyZCBCb3VsdG9uIDxyaWNoYXJkQHRhcnRhcnVzLm9yZz4KKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBXaW0gVGF5bWFucyA8d2ltIGF0IGZsdWVuZG8gZG90IGNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX01PTk9TQ09QRV9fCisjZGVmaW5lIF9fR1NUX01PTk9TQ09QRV9fCisKK0dfQkVHSU5fREVDTFMKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisKKyNkZWZpbmUgR1NUX1RZUEVfTU9OT1NDT1BFICAgICAgICAgICAgKGdzdF9tb25vc2NvcGVfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX01PTk9TQ09QRShvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX01PTk9TQ09QRSxHc3RNb25vc2NvcGUpKQorI2RlZmluZSBHU1RfTU9OT1NDT1BFX0NMQVNTKGtsYXNzKSAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9NT05PU0NPUEUsR3N0TW9ub3Njb3BlQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfTU9OT1NDT1BFKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfTU9OT1NDT1BFKSkKKyNkZWZpbmUgR1NUX0lTX01PTk9TQ09QRV9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfTU9OT1NDT1BFKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE1vbm9zY29wZSBHc3RNb25vc2NvcGU7Cit0eXBlZGVmIHN0cnVjdCBfR3N0TW9ub3Njb3BlQ2xhc3MgR3N0TW9ub3Njb3BlQ2xhc3M7CisKK3N0cnVjdCBfR3N0TW9ub3Njb3BlCit7CisgIEdzdEVsZW1lbnQgZWxlbWVudDsKKworICAvKiBwYWRzICovCisgIEdzdFBhZCAgICAgICpzaW5rcGFkOworICBHc3RQYWQgICAgICAqc3JjcGFkOworCisgIEdzdEFkYXB0ZXIgICphZGFwdGVyOworCisgIGd1aW50NjQgICAgICBuZXh0X3RzOyAgICAgICAgICAgICAvKiBleHBlY3RlZCB0aW1lc3RhbXAgb2YgdGhlIG5leHQgZnJhbWUgKi8KKyAgZ3VpbnQ2NCAgICAgIGZyYW1lX2R1cmF0aW9uOyAgICAgIC8qIHZpZGVvIGZyYW1lIGR1cmF0aW9uICAgICovCisgIGdpbnQgICAgICAgICByYXRlOyAgICAgICAgICAgICAgICAvKiBzYW1wbGUgcmF0ZSAgICAgICAgICAgICAqLworICBndWludCAgICAgICAgYnBzOyAgICAgICAgICAgICAgICAgLyogYnl0ZXMgcGVyIHNhbXBsZSAgICAgICAgKi8KKyAgZ3VpbnQgICAgICAgIHNwZjsgICAgICAgICAgICAgICAgIC8qIHNhbXBsZXMgcGVyIHZpZGVvIGZyYW1lICovCisgIEdzdEJ1ZmZlclBvb2wgKnBvb2w7CisKKyAgR3N0U2VnbWVudCAgIHNlZ21lbnQ7CisKKyAgLyogUW9TIHN0dWZmICovLyogd2l0aCBMT0NLICovCisgIGdkb3VibGUgICAgICBwcm9wb3J0aW9uOworICBHc3RDbG9ja1RpbWUgZWFybGllc3RfdGltZTsKKworICAvKiB2aWRlbyBzdGF0ZSAqLworICBnaW50ICAgICAgICAgZnBzX251bTsKKyAgZ2ludCAgICAgICAgIGZwc19kZW5vbTsKKyAgZ2ludCAgICAgICAgIHdpZHRoOworICBnaW50ICAgICAgICAgaGVpZ2h0OworICBndWludCAgICAgICAgb3V0c2l6ZTsKKworICAvKiB2aXN1YWxpc2F0aW9uIHN0YXRlICovCisgIHN0cnVjdCBtb25vc2NvcGVfc3RhdGUgKnZpc3N0YXRlOworfTsKKworc3RydWN0IF9Hc3RNb25vc2NvcGVDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X21vbm9zY29wZV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9NT05PU0NPUEVfXyAqLworCmRpZmYgLS1naXQgYS9nc3QvbW9ub3Njb3BlL21lc29uLmJ1aWxkIGIvZ3N0L21vbm9zY29wZS9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWFkMTkxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21vbm9zY29wZS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDEwIEBACitnc3Rtb25vc2NvcGUgPSBsaWJyYXJ5KCdnc3Rtb25vc2NvcGUnLAorICAnZ3N0bW9ub3Njb3BlLmMnLAorICAnbW9ub3Njb3BlLmMnLAorICAnY29udm9sdmUuYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0YmFzZV9kZXAsIGdzdGF1ZGlvX2RlcCwgZ3N0dmlkZW9fZGVwXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKZGlmZiAtLWdpdCBhL2dzdC9tb25vc2NvcGUvbW9ub3Njb3BlLmMgYi9nc3QvbW9ub3Njb3BlL21vbm9zY29wZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MDA4NzkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbW9ub3Njb3BlL21vbm9zY29wZS5jCkBAIC0wLDAgKzEsMTY4IEBACisvKiAgbW9ub3Njb3BlLmNwcAorICogIENvcHlyaWdodCAoQykgMjAwMiBSaWNoYXJkIEJvdWx0b24gPHJpY2hhcmRAdGFydGFydXMub3JnPgorICogIENvcHlyaWdodCAoQykgMTk5OC0yMDAxIEFuZHkgTG8gQSBGb2UgPGFuZHlAYWxzYXBsYXllci5vcmc+CisgKiAgT3JpZ2luYWwgY29kZSBieSBUaW5pYyBVcm8KKyAqCisgKiAgVGhpcyBjb2RlIGlzIGNvcGllZCBmcm9tIEFsc2FwbGF5ZXIuIFRoZSBvcmdpbmFsIGNvZGUgd2FzIGJ5IFRpbmljIFVybyBhbmQgdW5kZXIKKyAqICB0aGUgQlNEIGxpY2Vuc2Ugd2l0aG91dCBhIGFkdmVydGlzaWcgY2xhdXNlLiBBbmR5IExvIEEgRm9lIHRoZW4gcmVsaWNlbnNlZCB0aGUKKyAqICBjb2RlIHdoZW4gaGUgdXNlZCBpdCBmb3IgQWxzYXBsYXllciB0byBHUEwgd2l0aCBUaW5pYydzIHBlcm1pc3Npb24uIFJpY2hhcmQgQm91bHRvbgorICogIHRoZW4gdG9vayB0aGlzIGNvZGUgYW5kIG1hZGUgYSBHUEwgcGx1Z2luIG91dCBvZiBpdC4KKyAqCisgKiAgN3RoIERlY2VtYmVyIDIwMDQgQ2hyaXN0aWFuIFNjaGFsbGVyOiBSaWNoYXJkIEJvdWx0b24gYW5kIEFuZHkgTG8gQSBGb2UgZ2F2ZQorICogIHBlcm1pc3Npb24gdG8gcmVsaWNlbnNlIHRoZWlyIGNoYW5nZXMgdW5kZXIgQlNEIGxpY2Vuc2Ugc28gd2Ugd2hlcmUgYWJsZSB0byByZXN0b3JlIHRoZQorICogIGNvZGUgdG8gVGluaWMncyBvcmlnaW5hbCBCU0QgbGljZW5zZS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgdW5kZXIgd2hhdCBpcyBrbm93biBhcyB0aGUgQlNEIGxpY2Vuc2U6CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgaQorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mCisgKiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdAorICogb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworICogT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZCisgKiBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAibW9ub3Njb3BlLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIHZvaWQKK2NvbG9yc19pbml0IChndWludDMyICogY29sb3JzKQoreworICBpbnQgaTsKKyAgaW50IGhxID0gKHNjb3BlX2hlaWdodCAvIDQpOworICBpbnQgaHExID0gaHEgLSAxOworICBpbnQgaGgxID0gKHNjb3BlX2hlaWdodCAvIDIpIC0gMTsKKyAgZG91YmxlIHNjbCA9ICgyNTYuMCAvIChkb3VibGUpIGhxKTsKKworICBmb3IgKGkgPSAwOyBpIDwgaHE7IGkrKykgeworICAgIC8qIGdyZWVuIHRvIHllbGxvdyAqLworICAgIGNvbG9yc1tpXSA9ICgoaW50KSAoaSAqIHNjbCkgPDwgMTYpICsgKDI1NSA8PCA4KTsKKyAgICAvKiB5ZWxsb3cgdG8gcmVkICovCisgICAgY29sb3JzW2kgKyBocTFdID0gKDI1NSA8PCAxNikgKyAoKGludCkgKChocTEgLSBpKSAqIHNjbCkgPDwgOCk7CisgIH0KKyAgY29sb3JzW2hoMV0gPSAoNDAgPDwgMTYpICsgKDc1IDw8IDgpOworfQorCitzdHJ1Y3QgbW9ub3Njb3BlX3N0YXRlICoKK21vbm9zY29wZV9pbml0IChndWludDMyIHJlc3gsIGd1aW50MzIgcmVzeSkKK3sKKyAgc3RydWN0IG1vbm9zY29wZV9zdGF0ZSAqc3RhdGVwdHI7CisKKyAgLyogSSBkaWRuJ3QgcHJvZ3JhbSBtb25vc2NvcGUgdG8gb25seSBkbyAyNTYqMTI4LCBidXQgaXQgd29ya3MgdGhhdCB3YXkgKi8KKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlc3ggPT0gc2NvcGVfd2lkdGgsIDApOworICBnX3JldHVybl92YWxfaWZfZmFpbCAocmVzeSA9PSBzY29wZV9oZWlnaHQsIDApOworICBzdGF0ZXB0ciA9IGNhbGxvYyAoMSwgc2l6ZW9mIChzdHJ1Y3QgbW9ub3Njb3BlX3N0YXRlKSk7CisgIGlmIChzdGF0ZXB0ciA9PSAwKQorICAgIHJldHVybiAwOworICBzdGF0ZXB0ci0+Y3N0YXRlID0gY29udm9sdmVfaW5pdCAoY29udm9sdmVyX2RlcHRoKTsKKyAgY29sb3JzX2luaXQgKHN0YXRlcHRyLT5jb2xvcnMpOworICByZXR1cm4gc3RhdGVwdHI7Cit9CisKK3ZvaWQKK21vbm9zY29wZV9jbG9zZSAoc3RydWN0IG1vbm9zY29wZV9zdGF0ZSAqc3RhdGVwdHIpCit7CisgIGNvbnZvbHZlX2Nsb3NlIChzdGF0ZXB0ci0+Y3N0YXRlKTsKKyAgZnJlZSAoc3RhdGVwdHIpOworfQorCitndWludDMyICoKK21vbm9zY29wZV91cGRhdGUgKHN0cnVjdCBtb25vc2NvcGVfc3RhdGUgKnN0YXRlcHRyLCBnaW50MTYgZGF0YVtjb252b2x2ZXJfYmlnXSkKK3sKKyAgLyogUmVhbGx5LCB3ZSB3YW50IHNhbXBsZXMgZXZlbmx5IHNwcmVhZCBvdmVyIHRoZSBhdmFpbGFibGUgZGF0YS4KKyAgICogSnVzdCB0YWtpbmcgYSBjb250aW51b3VzIGNodW5rIHdpbGwgZG8gZm9yIG5vdywgdGhvdWdoLiAqLworICBpbnQgaTsKKyAgaW50IGZvbywgYmFyOworICBpbnQgYXZnOworICBpbnQgaDsKKyAgaW50IGhoID0gKHNjb3BlX2hlaWdodCAvIDIpOworICBpbnQgaGgxID0gaGggLSAxOworICBndWludDMyICpsb2M7CisKKyAgZG91YmxlIGZhY3RvcjsKKyAgaW50IG1heCA9IDE7CisgIHNob3J0ICp0aGlzRXEgPSBzdGF0ZXB0ci0+Y29weUVxOworCisgIG1lbWNweSAodGhpc0VxLCBkYXRhLCBzaXplb2YgKHNob3J0KSAqIGNvbnZvbHZlcl9iaWcpOworICB0aGlzRXEgKz0gY29udm9sdmVfbWF0Y2ggKHN0YXRlcHRyLT5hdmdFcSwgdGhpc0VxLCBzdGF0ZXB0ci0+Y3N0YXRlKTsKKworICBtZW1zZXQgKHN0YXRlcHRyLT5kaXNwbGF5LCAwLCBzY29wZV93aWR0aCAqIHNjb3BlX2hlaWdodCAqIHNpemVvZiAoZ3VpbnQzMikpOworICBmb3IgKGkgPSAwOyBpIDwgY29udm9sdmVyX3NtYWxsOyBpKyspIHsKKyAgICBhdmcgPSAodGhpc0VxW2ldICsgc3RhdGVwdHItPmF2Z0VxW2ldKSA+PiAxOworICAgIHN0YXRlcHRyLT5hdmdFcVtpXSA9IGF2ZzsKKyAgICBhdmcgPSBhYnMgKGF2Zyk7CisgICAgbWF4ID0gTUFYIChtYXgsIGF2Zyk7CisgIH0KKyAgLyogcnVubmluZyBhdmVyYWdlLCA0IHZhbHVlcyBpcyBlbm91Z2ggdG8gbWFrZSBpdCBmb2xsb3cgdm9sdW1lIGNoYW5nZXMKKyAgICogaWYgdGhpcyB2YWx1ZSBpcyB0b28gbGFyZ2UgaXQgd2lsbCBjb252ZXJnZSBzbG93bHkKKyAgICovCisgIHN0YXRlcHRyLT5hdmdNYXggKz0gKG1heCAvIDQpIC0gKHN0YXRlcHRyLT5hdmdNYXggLyA0KTsKKworICAvKiBpbnB1dCBpcyArLy0gYXZnTWF4LCBvdXRwdXQgaXMgKy8tIGhoICovCisgIGlmIChzdGF0ZXB0ci0+YXZnTWF4KSB7CisgICAgZmFjdG9yID0gKGdkb3VibGUpIGhoIC8gc3RhdGVwdHItPmF2Z01heDsKKyAgfSBlbHNlIHsKKyAgICBmYWN0b3IgPSAxLjA7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgc2NvcGVfd2lkdGg7IGkrKykgeworICAgIC8qIHNjYWxlIDE2Yml0IHNpZ25lZCBhdWRpbyB2YWx1ZXMgdG8gc2NvcGVfaGVpZ2h0ICovCisgICAgZm9vID0gc3RhdGVwdHItPmF2Z0VxW2ldICogZmFjdG9yOworICAgIGZvbyA9IENMQU1QIChmb28sIC1oaDEsIGhoMSk7CisgICAgYmFyID0gKGkgKyAoKGZvbyArIGhoKSAqIHNjb3BlX3dpZHRoKSk7CisgICAgaWYgKChiYXIgPiAwKSAmJiAoYmFyIDwgKHNjb3BlX3dpZHRoICogc2NvcGVfaGVpZ2h0KSkpIHsKKyAgICAgIGxvYyA9IHN0YXRlcHRyLT5kaXNwbGF5ICsgYmFyOworICAgICAgLyogZHJhdyB1cCAvIGRvd24gYmFycyAqLworICAgICAgaWYgKGZvbyA8IDApIHsKKyAgICAgICAgZm9yIChoID0gMDsgaCA8PSAoLWZvbyk7IGgrKykgeworICAgICAgICAgICpsb2MgPSBzdGF0ZXB0ci0+Y29sb3JzW2hdOworICAgICAgICAgIGxvYyArPSBzY29wZV93aWR0aDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChoID0gMDsgaCA8PSBmb287IGgrKykgeworICAgICAgICAgICpsb2MgPSBzdGF0ZXB0ci0+Y29sb3JzW2hdOworICAgICAgICAgIGxvYyAtPSBzY29wZV93aWR0aDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIERyYXcgZ3JpZC4gKi8KKyAgeworICAgIGd1aW50MzIgZ3JheSA9IHN0YXRlcHRyLT5jb2xvcnNbaGgxXTsKKworICAgIGZvciAoaSA9IDE2OyBpIDwgc2NvcGVfaGVpZ2h0OyBpICs9IDE2KSB7CisgICAgICBmb3IgKGggPSAwOyBoIDwgc2NvcGVfd2lkdGg7IGggKz0gMikgeworICAgICAgICBzdGF0ZXB0ci0+ZGlzcGxheVsoaSAqIHNjb3BlX3dpZHRoKSArIGhdID0gZ3JheTsKKyAgICAgICAgaWYgKGkgPT0gaGgpCisgICAgICAgICAgc3RhdGVwdHItPmRpc3BsYXlbKGkgKiBzY29wZV93aWR0aCkgKyBoICsgMV0gPSBncmF5OworICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSAxNjsgaSA8IHNjb3BlX3dpZHRoOyBpICs9IDE2KSB7CisgICAgICBmb3IgKGggPSAwOyBoIDwgc2NvcGVfaGVpZ2h0OyBoICs9IDIpIHsKKyAgICAgICAgc3RhdGVwdHItPmRpc3BsYXlbaSArIChoICogc2NvcGVfd2lkdGgpXSA9IGdyYXk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBzdGF0ZXB0ci0+ZGlzcGxheTsKK30KZGlmZiAtLWdpdCBhL2dzdC9tb25vc2NvcGUvbW9ub3Njb3BlLmggYi9nc3QvbW9ub3Njb3BlL21vbm9zY29wZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmODRkYzkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbW9ub3Njb3BlL21vbm9zY29wZS5oCkBAIC0wLDAgKzEsMjcgQEAKKyNpZm5kZWYgX01PTk9TQ09QRV9ICisjZGVmaW5lIF9NT05PU0NPUEVfSAorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgImNvbnZvbHZlLmgiCisKKyNkZWZpbmUgY29udm9sdmVyX2RlcHRoIDgKKyNkZWZpbmUgY29udm9sdmVyX3NtYWxsICgxIDw8IGNvbnZvbHZlcl9kZXB0aCkKKyNkZWZpbmUgY29udm9sdmVyX2JpZyAoMiA8PCBjb252b2x2ZXJfZGVwdGgpCisjZGVmaW5lIHNjb3BlX3dpZHRoIDI1NgorI2RlZmluZSBzY29wZV9oZWlnaHQgMTI4CisKK3N0cnVjdCBtb25vc2NvcGVfc3RhdGUgeworICBzaG9ydCBjb3B5RXFbY29udm9sdmVyX2JpZ107CisgIGludCBhdmdFcVtjb252b2x2ZXJfc21hbGxdOyAgICAgIC8qIGEgcnVubmluZyBhdmVyYWdlIG9mIHRoZSBsYXN0IGZldy4gKi8KKyAgaW50IGF2Z01heDsgICAgICAgICAgICAgICAgICAgICAvKiBydW5uaW5nIGF2ZXJhZ2Ugb2YgbWF4IHNhbXBsZS4gKi8KKyAgZ3VpbnQzMiBkaXNwbGF5W3Njb3BlX3dpZHRoICogc2NvcGVfaGVpZ2h0XTsKKworICBjb252b2x2ZV9zdGF0ZSAqY3N0YXRlOworICBndWludDMyIGNvbG9yc1tzY29wZV9oZWlnaHQgLyAyXTsKK307CisKK3N0cnVjdCBtb25vc2NvcGVfc3RhdGUgKiBtb25vc2NvcGVfaW5pdCAoZ3VpbnQzMiByZXN4LCBndWludDMyIHJlc3kpOworZ3VpbnQzMiAqIG1vbm9zY29wZV91cGRhdGUgKHN0cnVjdCBtb25vc2NvcGVfc3RhdGUgKiBzdGF0ZXB0ciwgZ2ludDE2IGRhdGEgW2NvbnZvbHZlcl9iaWddKTsKK3ZvaWQgbW9ub3Njb3BlX2Nsb3NlIChzdHJ1Y3QgbW9ub3Njb3BlX3N0YXRlICogc3RhdGVwdHIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvTWFrZWZpbGUuYW0gYi9nc3QvbXVsdGlmaWxlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZThhMTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbXVsdGlmaWxlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzEgQEAKKworcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0bXVsdGlmaWxlLmxhCisKK2xpYmdzdG11bHRpZmlsZV9sYV9TT1VSQ0VTID0gXAorCWdzdG11bHRpZmlsZXNpbmsuYyAgIFwKKwlnc3RtdWx0aWZpbGVzcmMuYyAgICBcCisJZ3N0bXVsdGlmaWxlLmMgICAgICAgXAorCWdzdHNwbGl0ZmlsZXNyYy5jICAgIFwKKwlnc3RzcGxpdG11eHNpbmsuYyAgICBcCisJZ3N0c3BsaXRtdXhwYXJ0cmVhZGVyLmMgXAorCWdzdHNwbGl0bXV4c3JjLmMgXAorCWdzdHNwbGl0dXRpbHMuYyAgICBcCisJcGF0dGVybnNwZWMuYworbGliZ3N0bXVsdGlmaWxlX2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpICQoR0lPX0NGTEFHUykKK2xpYmdzdG11bHRpZmlsZV9sYV9MSUJBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R2aWRlby1AR1NUX0FQSV9WRVJTSU9OQCAkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoR0lPX0xJQlMpCitsaWJnc3RtdWx0aWZpbGVfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdG11bHRpZmlsZXNyYy5oIGdzdG11bHRpZmlsZXNpbmsuaCBnc3RzcGxpdGZpbGVzcmMuaCBnc3RzcGxpdG11eHNpbmsuaCBcCisJZ3N0c3BsaXRtdXhzcmMuaCBnc3RzcGxpdG11eHBhcnRyZWFkZXIuaCBnc3RzcGxpdHV0aWxzLmggcGF0dGVybnNwZWMuaAorCitub2luc3RfUFJPR1JBTVMgPSB0ZXN0LXNwbGl0bXV4LXBhcnQtcmVhZGVyCisKK3Rlc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfU09VUkNFUyA9IFwKKwl0ZXN0LXNwbGl0bXV4cGFydHJlYWRlci5jIFwKKwlnc3RzcGxpdG11eHBhcnRyZWFkZXIuYyBcCisJZ3N0c3BsaXRtdXhzcmMuYyBcCisJZ3N0c3BsaXR1dGlscy5jIFwKKwlwYXR0ZXJuc3BlYy5jCit0ZXN0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpICQoR0lPX0NGTEFHUykKK3Rlc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R2aWRlby1AR1NUX0FQSV9WRVJTSU9OQCAkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoR0lPX0xJQlMpCit0ZXN0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlLmMgYi9nc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYmI2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZS5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgICAgICAyMDAwIFdpbSBUYXltYW5zIDx3dGF5QGNoZWxsby5iZT4KKyAqICAgICAgICAgICAgICAgICAgICAyMDA2IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwNiBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBnc3RtdWx0aWZpbGVzaW5rLmM6CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJnc3RtdWx0aWZpbGVzaW5rLmgiCisjaW5jbHVkZSAiZ3N0bXVsdGlmaWxlc3JjLmgiCisjaW5jbHVkZSAiZ3N0c3BsaXRmaWxlc3JjLmgiCisjaW5jbHVkZSAiZ3N0c3BsaXRtdXhzaW5rLmgiCisjaW5jbHVkZSAiZ3N0c3BsaXRtdXhzcmMuaCIKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAibXVsdGlmaWxlc3JjIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgIGdzdF9tdWx0aV9maWxlX3NyY19nZXRfdHlwZSAoKSk7CisgIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJtdWx0aWZpbGVzaW5rIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgIGdzdF9tdWx0aV9maWxlX3NpbmtfZ2V0X3R5cGUgKCkpOworICBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAic3BsaXRmaWxlc3JjIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgIGdzdF9zcGxpdF9maWxlX3NyY19nZXRfdHlwZSAoKSk7CisKKyAgaWYgKCFyZWdpc3Rlcl9zcGxpdG11eHNpbmsgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghcmVnaXN0ZXJfc3BsaXRtdXhzcmMgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgbXVsdGlmaWxlLAorICAgICJSZWFkcy9Xcml0ZXMgYnVmZmVycyBmcm9tL3RvIHNlcXVlbnRpYWxseSBuYW1lZCBmaWxlcyIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKTsKZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jIGIvZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJhNTVlZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jCkBAIC0wLDAgKzEsMTEyOSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICAgICAgIDIwMDAgV2ltIFRheW1hbnMgPHd0YXlAY2hlbGxvLmJlPgorICogICAgICAgICAgICAgICAgICAgIDIwMDYgV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAyMDA2IERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogICAgICAgICAgICAgICAgICAgIDIwMTEgQ29sbGFib3JhIEx0ZC4gPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorICogICAgICAgICAgICAgICAgICAgIDIwMTUgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBnc3RtdWx0aWZpbGVzaW5rLmM6CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LW11bHRpZmlsZXNpbmsKKyAqIEBzZWVfYWxzbzogI0dzdEZpbGVTcmMKKyAqCisgKiBXcml0ZSBpbmNvbWluZyBkYXRhIHRvIGEgc2VyaWVzIG9mIHNlcXVlbnRpYWxseS1uYW1lZCBmaWxlcy4KKyAqCisgKiBUaGlzIGVsZW1lbnQgaXMgdXN1YWxseSB1c2VkIHdpdGggZGF0YSB3aGVyZSBlYWNoIGJ1ZmZlciBpcyBhbgorICogaW5kZXBlbmRlbnQgdW5pdCBvZiBkYXRhIGluIGl0cyBvd24gcmlnaHQgKGUuZy4gcmF3IHZpZGVvIGJ1ZmZlcnMgb3IKKyAqIGVuY29kZWQgSlBFRyBvciBQTkcgaW1hZ2VzKSBvciB3aXRoIHN0cmVhbWFibGUgY29udGFpbmVyIGZvcm1hdHMgc3VjaAorICogYXMgTVBFRy1UUyBvciBNUEVHLVBTLgorICoKKyAqIEl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgdGhpcyBlbGVtZW50IHRvIGNyZWF0ZSBpbmRlcGVuZGVudGx5IHBsYXlhYmxlCisgKiBtcDQgZmlsZXMsIHVzZSB0aGUgc3BsaXRtdXhzaW5rIGVsZW1lbnQgZm9yIHRoYXQgaW5zdGVhZC4KKyAqCisgKiBUaGUgZmlsZW5hbWUgcHJvcGVydHkgc2hvdWxkIGNvbnRhaW4gYSBzdHJpbmcgd2l0aCBhIFwlZCBwbGFjZWhvbGRlciB0aGF0IHdpbGwKKyAqIGJlIHN1YnN0aXR1dGVkIHdpdGggdGhlIGluZGV4IGZvciBlYWNoIGZpbGVuYW1lLgorICoKKyAqIElmIHRoZSAjR3N0TXVsdGlGaWxlU2luazpwb3N0LW1lc3NhZ2VzIHByb3BlcnR5IGlzICVUUlVFLCBpdCBzZW5kcyBhbiBhcHBsaWNhdGlvbgorICogbWVzc2FnZSBuYW1lZAorICogPGNsYXNzbmFtZT4mcXVvdDtHc3RNdWx0aUZpbGVTaW5rJnF1b3Q7PC9jbGFzc25hbWU+IGFmdGVyIHdyaXRpbmcgZWFjaAorICogYnVmZmVyLgorICoKKyAqIFRoZSBtZXNzYWdlJ3Mgc3RydWN0dXJlIGNvbnRhaW5zIHRoZXNlIGZpZWxkczoKKyAqIDxpdGVtaXplZGxpc3Q+CisgKiA8bGlzdGl0ZW0+CisgKiAgIDxwYXJhPgorICogICAjZ2NoYXIgKgorICogICA8Y2xhc3NuYW1lPiZxdW90O2ZpbGVuYW1lJnF1b3Q7PC9jbGFzc25hbWU+OgorICogICB0aGUgZmlsZW5hbWUgd2hlcmUgdGhlIGJ1ZmZlciB3YXMgd3JpdHRlbi4KKyAqICAgPC9wYXJhPgorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgICNnaW50CisgKiAgIDxjbGFzc25hbWU+JnF1b3Q7aW5kZXgmcXVvdDs8L2NsYXNzbmFtZT46CisgKiAgIHRoZSBpbmRleCBvZiB0aGUgYnVmZmVyLgorICogICA8L3BhcmE+CisgKiA8L2xpc3RpdGVtPgorICogPGxpc3RpdGVtPgorICogICA8cGFyYT4KKyAqICAgI0dzdENsb2NrVGltZQorICogICA8Y2xhc3NuYW1lPiZxdW90O3RpbWVzdGFtcCZxdW90OzwvY2xhc3NuYW1lPjoKKyAqICAgdGhlIHRpbWVzdGFtcCBvZiB0aGUgYnVmZmVyLgorICogICA8L3BhcmE+CisgKiA8L2xpc3RpdGVtPgorICogPGxpc3RpdGVtPgorICogICA8cGFyYT4KKyAqICAgI0dzdENsb2NrVGltZQorICogICA8Y2xhc3NuYW1lPiZxdW90O3N0cmVhbS10aW1lJnF1b3Q7PC9jbGFzc25hbWU+OgorICogICB0aGUgc3RyZWFtIHRpbWUgb2YgdGhlIGJ1ZmZlci4KKyAqICAgPC9wYXJhPgorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgICNHc3RDbG9ja1RpbWUKKyAqICAgPGNsYXNzbmFtZT4mcXVvdDtydW5uaW5nLXRpbWUmcXVvdDs8L2NsYXNzbmFtZT46CisgKiAgIHRoZSBydW5uaW5nX3RpbWUgb2YgdGhlIGJ1ZmZlci4KKyAqICAgPC9wYXJhPgorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgICNHc3RDbG9ja1RpbWUKKyAqICAgPGNsYXNzbmFtZT4mcXVvdDtkdXJhdGlvbiZxdW90OzwvY2xhc3NuYW1lPjoKKyAqICAgdGhlIGR1cmF0aW9uIG9mIHRoZSBidWZmZXIuCisgKiAgIDwvcGFyYT4KKyAqIDwvbGlzdGl0ZW0+CisgKiA8bGlzdGl0ZW0+CisgKiAgIDxwYXJhPgorICogICAjZ3VpbnQ2NAorICogICA8Y2xhc3NuYW1lPiZxdW90O29mZnNldCZxdW90OzwvY2xhc3NuYW1lPjoKKyAqICAgdGhlIG9mZnNldCBvZiB0aGUgYnVmZmVyIHRoYXQgdHJpZ2dlcmVkIHRoZSBtZXNzYWdlLgorICogICA8L3BhcmE+CisgKiA8L2xpc3RpdGVtPgorICogPGxpc3RpdGVtPgorICogICA8cGFyYT4KKyAqICAgI2d1aW50NjQKKyAqICAgPGNsYXNzbmFtZT4mcXVvdDtvZmZzZXQtZW5kJnF1b3Q7PC9jbGFzc25hbWU+OgorICogICB0aGUgb2Zmc2V0LWVuZCBvZiB0aGUgYnVmZmVyIHRoYXQgdHJpZ2dlcmVkIHRoZSBtZXNzYWdlLgorICogICA8L3BhcmE+CisgKiA8L2xpc3RpdGVtPgorICogPC9pdGVtaXplZGxpc3Q+CisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyAhIG11bHRpZmlsZXNpbmsKKyAqIGdzdC1sYXVuY2gtMS4wIHZpZGVvdGVzdHNyYyAhIG11bHRpZmlsZXNpbmsgcG9zdC1tZXNzYWdlcz10cnVlIGxvY2F0aW9uPSJmcmFtZSVkIgorICogXXwKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdsaWIvZ3N0ZGlvLmg+CisjaW5jbHVkZSAiZ3N0bXVsdGlmaWxlc2luay5oIgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9tdWx0aV9maWxlX3NpbmtfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X211bHRpX2ZpbGVfc2lua19kZWJ1ZworCisjZGVmaW5lIERFRkFVTFRfTE9DQVRJT04gIiUwNWQiCisjZGVmaW5lIERFRkFVTFRfSU5ERVggMAorI2RlZmluZSBERUZBVUxUX1BPU1RfTUVTU0FHRVMgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9ORVhUX0ZJTEUgR1NUX01VTFRJX0ZJTEVfU0lOS19ORVhUX0JVRkZFUgorI2RlZmluZSBERUZBVUxUX01BWF9GSUxFUyAwCisjZGVmaW5lIERFRkFVTFRfTUFYX0ZJTEVfU0laRSBHX0dVSU5UNjRfQ09OU1RBTlQoMioxMDI0KjEwMjQqMTAyNCkKKyNkZWZpbmUgREVGQVVMVF9NQVhfRklMRV9EVVJBVElPTiBHU1RfQ0xPQ0tfVElNRV9OT05FCisjZGVmaW5lIERFRkFVTFRfQUdHUkVHQVRFX0dPUFMgRkFMU0UKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTE9DQVRJT04sCisgIFBST1BfSU5ERVgsCisgIFBST1BfUE9TVF9NRVNTQUdFUywKKyAgUFJPUF9ORVhUX0ZJTEUsCisgIFBST1BfTUFYX0ZJTEVTLAorICBQUk9QX01BWF9GSUxFX1NJWkUsCisgIFBST1BfTUFYX0ZJTEVfRFVSQVRJT04sCisgIFBST1BfQUdHUkVHQVRFX0dPUFMKK307CisKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aV9maWxlX3NpbmtfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgdm9pZCBnc3RfbXVsdGlfZmlsZV9zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aV9maWxlX3NpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X211bHRpX2ZpbGVfc2lua19zdGFydCAoR3N0QmFzZVNpbmsgKiBic2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X211bHRpX2ZpbGVfc2lua19zdG9wIChHc3RCYXNlU2luayAqIHNpbmspOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X211bHRpX2ZpbGVfc2lua19yZW5kZXIgKEdzdEJhc2VTaW5rICogc2luaywKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X211bHRpX2ZpbGVfc2lua19yZW5kZXJfbGlzdCAoR3N0QmFzZVNpbmsgKiBzaW5rLAorICAgIEdzdEJ1ZmZlckxpc3QgKiBidWZmZXJfbGlzdCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X211bHRpX2ZpbGVfc2lua19zZXRfY2FwcyAoR3N0QmFzZVNpbmsgKiBzaW5rLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbXVsdGlfZmlsZV9zaW5rX29wZW5fbmV4dF9maWxlIChHc3RNdWx0aUZpbGVTaW5rICoKKyAgICBtdWx0aWZpbGVzaW5rKTsKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aV9maWxlX3NpbmtfY2xvc2VfZmlsZSAoR3N0TXVsdGlGaWxlU2luayAqIG11bHRpZmlsZXNpbmssCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aV9maWxlX3NpbmtfYWRkX29sZF9maWxlIChHc3RNdWx0aUZpbGVTaW5rICogbXVsdGlmaWxlc2luaywKKyAgICBnY2hhciAqIGZuKTsKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aV9maWxlX3NpbmtfZW5zdXJlX21heF9maWxlcyAoR3N0TXVsdGlGaWxlU2luayAqCisgICAgbXVsdGlmaWxlc2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X211bHRpX2ZpbGVfc2lua19ldmVudCAoR3N0QmFzZVNpbmsgKiBzaW5rLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCisjZGVmaW5lIEdTVF9UWVBFX01VTFRJX0ZJTEVfU0lOS19ORVhUIChnc3RfbXVsdGlfZmlsZV9zaW5rX25leHRfZ2V0X3R5cGUgKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9tdWx0aV9maWxlX3NpbmtfbmV4dF9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIG11bHRpX2ZpbGVfc2lua19uZXh0X3R5cGUgPSAwOworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSBuZXh0X3R5cGVzW10gPSB7CisgICAge0dTVF9NVUxUSV9GSUxFX1NJTktfTkVYVF9CVUZGRVIsICJOZXcgZmlsZSBmb3IgZWFjaCBidWZmZXIiLCAiYnVmZmVyIn0sCisgICAge0dTVF9NVUxUSV9GSUxFX1NJTktfTkVYVF9ESVNDT05ULCAiTmV3IGZpbGUgYWZ0ZXIgZWFjaCBkaXNjb250aW51aXR5IiwKKyAgICAgICAgImRpc2NvbnQifSwKKyAgICB7R1NUX01VTFRJX0ZJTEVfU0lOS19ORVhUX0tFWV9GUkFNRSwgIk5ldyBmaWxlIGF0IGVhY2gga2V5IGZyYW1lICIKKyAgICAgICAgICAiKFVzZWZ1bCBmb3IgTVBFRy1UUyBzZWdtZW50aW5nKSIsICJrZXktZnJhbWUifSwKKyAgICB7R1NUX01VTFRJX0ZJTEVfU0lOS19ORVhUX0tFWV9VTklUX0VWRU5ULAorICAgICAgICAiTmV3IGZpbGUgYWZ0ZXIgYSBmb3JjZSBrZXkgdW5pdCBldmVudCIsICJrZXktdW5pdC1ldmVudCJ9LAorICAgIHtHU1RfTVVMVElfRklMRV9TSU5LX05FWFRfTUFYX1NJWkUsICJOZXcgZmlsZSB3aGVuIHRoZSBjb25maWd1cmVkIG1heGltdW0gIgorICAgICAgICAgICJmaWxlIHNpemUgd291bGQgYmUgZXhjZWVkZWQgd2l0aCB0aGUgbmV4dCBidWZmZXIgb3IgYnVmZmVyIGxpc3QiLAorICAgICAgICAibWF4LXNpemUifSwKKyAgICB7R1NUX01VTFRJX0ZJTEVfU0lOS19ORVhUX01BWF9EVVJBVElPTiwKKyAgICAgICAgICAiTmV3IGZpbGUgd2hlbiB0aGUgY29uZmlndXJlZCBtYXhpbXVtICIKKyAgICAgICAgICAiZmlsZSBkdXJhdGlvbiB3b3VsZCBiZSBleGNlZWRlZCB3aXRoIHRoZSBuZXh0IGJ1ZmZlciBvciBidWZmZXIgbGlzdCIsCisgICAgICAgICJtYXgtZHVyYXRpb24ifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0KKyAgfTsKKworICBpZiAoIW11bHRpX2ZpbGVfc2lua19uZXh0X3R5cGUpIHsKKyAgICBtdWx0aV9maWxlX3NpbmtfbmV4dF90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdE11bHRpRmlsZVNpbmtOZXh0IiwgbmV4dF90eXBlcyk7CisgIH0KKworICByZXR1cm4gbXVsdGlfZmlsZV9zaW5rX25leHRfdHlwZTsKK30KKworI2RlZmluZSBnc3RfbXVsdGlfZmlsZV9zaW5rX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdE11bHRpRmlsZVNpbmssIGdzdF9tdWx0aV9maWxlX3NpbmssIEdTVF9UWVBFX0JBU0VfU0lOSyk7CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGlfZmlsZV9zaW5rX2NsYXNzX2luaXQgKEdzdE11bHRpRmlsZVNpbmtDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBHc3RCYXNlU2lua0NsYXNzICpnc3RiYXNlc2lua19jbGFzcyA9IEdTVF9CQVNFX1NJTktfQ0xBU1MgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfbXVsdGlfZmlsZV9zaW5rX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X211bHRpX2ZpbGVfc2lua19nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9MT0NBVElPTiwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJsb2NhdGlvbiIsICJGaWxlIExvY2F0aW9uIiwKKyAgICAgICAgICAiTG9jYXRpb24gb2YgdGhlIGZpbGUgdG8gd3JpdGUiLCBOVUxMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSU5ERVgsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiaW5kZXgiLCAiSW5kZXgiLAorICAgICAgICAgICJJbmRleCB0byB1c2Ugd2l0aCBsb2NhdGlvbiBwcm9wZXJ0eSB0byBjcmVhdGUgZmlsZSBuYW1lcy4gIFRoZSAiCisgICAgICAgICAgImluZGV4IGlzIGluY3JlbWVudGVkIGJ5IG9uZSBmb3IgZWFjaCBidWZmZXIgd3JpdHRlbi4iLAorICAgICAgICAgIDAsIEdfTUFYSU5ULCBERUZBVUxUX0lOREVYLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0TXVsdGlGaWxlU2luazpwb3N0LW1lc3NhZ2VzOgorICAgKgorICAgKiBQb3N0IGEgbWVzc2FnZSBvbiB0aGUgR3N0QnVzIGZvciBlYWNoIGZpbGUuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BPU1RfTUVTU0FHRVMsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInBvc3QtbWVzc2FnZXMiLCAiUG9zdCBNZXNzYWdlcyIsCisgICAgICAgICAgIlBvc3QgYSBtZXNzYWdlIGZvciBlYWNoIGZpbGUgd2l0aCBpbmZvcm1hdGlvbiBvZiB0aGUgYnVmZmVyIiwKKyAgICAgICAgICBERUZBVUxUX1BPU1RfTUVTU0FHRVMsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0TXVsdGlGaWxlU2luazpuZXh0LWZpbGU6CisgICAqCisgICAqIFdoZW4gdG8gc3RhcnQgYSBuZXcgZmlsZS4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTkVYVF9GSUxFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJuZXh0LWZpbGUiLCAiTmV4dCBGaWxlIiwKKyAgICAgICAgICAiV2hlbiB0byBzdGFydCBhIG5ldyBmaWxlIiwKKyAgICAgICAgICBHU1RfVFlQRV9NVUxUSV9GSUxFX1NJTktfTkVYVCwgREVGQVVMVF9ORVhUX0ZJTEUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKworICAvKioKKyAgICogR3N0TXVsdGlGaWxlU2luazptYXgtZmlsZXM6CisgICAqCisgICAqIE1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRvIGtlZXAgb24gZGlzay4gT25jZSB0aGUgbWF4aW11bSBpcyByZWFjaGVkLCBvbGQKKyAgICogZmlsZXMgc3RhcnQgdG8gYmUgZGVsZXRlZCB0byBtYWtlIHJvb20gZm9yIG5ldyBvbmVzLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfRklMRVMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm1heC1maWxlcyIsICJNYXggZmlsZXMiLAorICAgICAgICAgICJNYXhpbXVtIG51bWJlciBvZiBmaWxlcyB0byBrZWVwIG9uIGRpc2suIE9uY2UgdGhlIG1heGltdW0gaXMgcmVhY2hlZCwiCisgICAgICAgICAgIm9sZCBmaWxlcyBzdGFydCB0byBiZSBkZWxldGVkIHRvIG1ha2Ugcm9vbSBmb3IgbmV3IG9uZXMuIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIERFRkFVTFRfTUFYX0ZJTEVTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RNdWx0aUZpbGVTaW5rOm1heC1maWxlLXNpemU6CisgICAqCisgICAqIE1heGltdW0gZmlsZSBzaXplIGJlZm9yZSBzdGFydGluZyBhIG5ldyBmaWxlIGluIG1heC1zaXplIG1vZGUuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01BWF9GSUxFX1NJWkUsCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgibWF4LWZpbGUtc2l6ZSIsICJNYXhpbXVtIEZpbGUgU2l6ZSIsCisgICAgICAgICAgIk1heGltdW0gZmlsZSBzaXplIGJlZm9yZSBzdGFydGluZyBhIG5ldyBmaWxlIGluIG1heC1zaXplIG1vZGUiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVDY0LCBERUZBVUxUX01BWF9GSUxFX1NJWkUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdE11bHRpRmlsZVNpbms6bWF4LWZpbGUtZHVyYXRpb246CisgICAqCisgICAqIE1heGltdW0gZmlsZSBzaXplIGJlZm9yZSBzdGFydGluZyBhIG5ldyBmaWxlIGluIG1heC1zaXplIG1vZGUuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01BWF9GSUxFX0RVUkFUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoIm1heC1maWxlLWR1cmF0aW9uIiwgIk1heGltdW0gRmlsZSBEdXJhdGlvbiIsCisgICAgICAgICAgIk1heGltdW0gZmlsZSBkdXJhdGlvbiBiZWZvcmUgc3RhcnRpbmcgYSBuZXcgZmlsZSBpbiBtYXgtc2l6ZSBtb2RlICIKKyAgICAgICAgICAiKGluIG5hbm9zZWNvbmRzKSIsIDAsIEdfTUFYVUlOVDY0LCBERUZBVUxUX01BWF9GSUxFX0RVUkFUSU9OLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RNdWx0aUZpbGVTaW5rOmFnZ3JlZ2F0ZS1nb3BzOgorICAgKgorICAgKiBXaGV0aGVyIHRvIGFnZ3JlZ2F0ZSBjb21wbGV0ZSBHT1BzIGJlZm9yZSBkb2luZyBhbnkgcHJvY2Vzc2luZy4gU2V0IHRoaXMKKyAgICogdG8gVFJVRSB0byBtYWtlIHN1cmUgZWFjaCBuZXcgZmlsZSBzdGFydHMgd2l0aCBhIGtleWZyYW1lLiBUaGlzIHJlcXVpcmVzCisgICAqIHRoZSB1cHN0cmVhbSBlbGVtZW50IHRvIGZsYWcgYnVmZmVycyBjb250YWluaW5nIGtleSB1bml0cyBhbmQgZGVsdGEKKyAgICogdW5pdHMgY29ycmVjdGx5LiBBdCBsZWFzdCB0aGUgTVBFRy1QUyBhbmQgTVBFRy1UUyBtdXhlcnMgc2hvdWxkIGJlIGRvaW5nCisgICAqIHRoaXMuCisgICAqCisgICAqIFNpbmNlOiAxLjYKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQUdHUkVHQVRFX0dPUFMsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImFnZ3JlZ2F0ZS1nb3BzIiwgIkFnZ3JlZ2F0ZSBHT1BzIiwKKyAgICAgICAgICAiV2hldGhlciB0byBhZ2dyZWdhdGUgR09QcyBhbmQgcHJvY2VzcyB0aGVtIGFzIGEgd2hvbGUgd2l0aG91dCAiCisgICAgICAgICAgInNwbGl0dGluZyIsIERFRkFVTFRfQUdHUkVHQVRFX0dPUFMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfbXVsdGlfZmlsZV9zaW5rX2ZpbmFsaXplOworCisgIGdzdGJhc2VzaW5rX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbXVsdGlfZmlsZV9zaW5rX3N0YXJ0KTsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X211bHRpX2ZpbGVfc2lua19zdG9wKTsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnJlbmRlciA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbXVsdGlfZmlsZV9zaW5rX3JlbmRlcik7CisgIGdzdGJhc2VzaW5rX2NsYXNzLT5yZW5kZXJfbGlzdCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X211bHRpX2ZpbGVfc2lua19yZW5kZXJfbGlzdCk7CisgIGdzdGJhc2VzaW5rX2NsYXNzLT5zZXRfY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X211bHRpX2ZpbGVfc2lua19zZXRfY2Fwcyk7CisgIGdzdGJhc2VzaW5rX2NsYXNzLT5ldmVudCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbXVsdGlfZmlsZV9zaW5rX2V2ZW50KTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X211bHRpX2ZpbGVfc2lua19kZWJ1ZywgIm11bHRpZmlsZXNpbmsiLCAwLAorICAgICAgIm11bHRpZmlsZXNpbmsgZWxlbWVudCIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIk11bHRpLUZpbGUgU2luayIsCisgICAgICAiU2luay9GaWxlIiwKKyAgICAgICJXcml0ZSBidWZmZXJzIHRvIGEgc2VxdWVudGlhbGx5IG5hbWVkIHNldCBvZiBmaWxlcyIsCisgICAgICAiRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGlfZmlsZV9zaW5rX2luaXQgKEdzdE11bHRpRmlsZVNpbmsgKiBtdWx0aWZpbGVzaW5rKQoreworICBtdWx0aWZpbGVzaW5rLT5maWxlbmFtZSA9IGdfc3RyZHVwIChERUZBVUxUX0xPQ0FUSU9OKTsKKyAgbXVsdGlmaWxlc2luay0+aW5kZXggPSBERUZBVUxUX0lOREVYOworICBtdWx0aWZpbGVzaW5rLT5wb3N0X21lc3NhZ2VzID0gREVGQVVMVF9QT1NUX01FU1NBR0VTOworICBtdWx0aWZpbGVzaW5rLT5tYXhfZmlsZXMgPSBERUZBVUxUX01BWF9GSUxFUzsKKyAgbXVsdGlmaWxlc2luay0+bWF4X2ZpbGVfc2l6ZSA9IERFRkFVTFRfTUFYX0ZJTEVfU0laRTsKKyAgbXVsdGlmaWxlc2luay0+bWF4X2ZpbGVfZHVyYXRpb24gPSBERUZBVUxUX01BWF9GSUxFX0RVUkFUSU9OOworCisgIG11bHRpZmlsZXNpbmstPmFnZ3JlZ2F0ZV9nb3BzID0gREVGQVVMVF9BR0dSRUdBVEVfR09QUzsKKyAgbXVsdGlmaWxlc2luay0+Z29wX2FkYXB0ZXIgPSBOVUxMOworCisgIGdzdF9iYXNlX3Npbmtfc2V0X3N5bmMgKEdTVF9CQVNFX1NJTksgKG11bHRpZmlsZXNpbmspLCBGQUxTRSk7CisKKyAgbXVsdGlmaWxlc2luay0+bmV4dF9zZWdtZW50ID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgbXVsdGlmaWxlc2luay0+Zm9yY2Vfa2V5X3VuaXRfY291bnQgPSAtMTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aV9maWxlX3NpbmtfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdE11bHRpRmlsZVNpbmsgKnNpbmsgPSBHU1RfTVVMVElfRklMRV9TSU5LIChvYmplY3QpOworCisgIGdfZnJlZSAoc2luay0+ZmlsZW5hbWUpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbXVsdGlfZmlsZV9zaW5rX3NldF9sb2NhdGlvbiAoR3N0TXVsdGlGaWxlU2luayAqIHNpbmssCisgICAgY29uc3QgZ2NoYXIgKiBsb2NhdGlvbikKK3sKKyAgZ19mcmVlIChzaW5rLT5maWxlbmFtZSk7CisgIC8qIEZJWE1FOiB2YWxpZGF0ZSBsb2NhdGlvbiB0byBoYXZlIGp1c3Qgb25lICVkICovCisgIHNpbmstPmZpbGVuYW1lID0gZ19zdHJkdXAgKGxvY2F0aW9uKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aV9maWxlX3Npbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE11bHRpRmlsZVNpbmsgKnNpbmsgPSBHU1RfTVVMVElfRklMRV9TSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MT0NBVElPTjoKKyAgICAgIGdzdF9tdWx0aV9maWxlX3Npbmtfc2V0X2xvY2F0aW9uIChzaW5rLCBnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSU5ERVg6CisgICAgICBzaW5rLT5pbmRleCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BPU1RfTUVTU0FHRVM6CisgICAgICBzaW5rLT5wb3N0X21lc3NhZ2VzID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05FWFRfRklMRToKKyAgICAgIHNpbmstPm5leHRfZmlsZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfRklMRVM6CisgICAgICBzaW5rLT5tYXhfZmlsZXMgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX0ZJTEVfU0laRToKKyAgICAgIHNpbmstPm1heF9maWxlX3NpemUgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfRklMRV9EVVJBVElPTjoKKyAgICAgIHNpbmstPm1heF9maWxlX2R1cmF0aW9uID0gZ192YWx1ZV9nZXRfdWludDY0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQUdHUkVHQVRFX0dPUFM6CisgICAgICBzaW5rLT5hZ2dyZWdhdGVfZ29wcyA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aV9maWxlX3NpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE11bHRpRmlsZVNpbmsgKnNpbmsgPSBHU1RfTVVMVElfRklMRV9TSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MT0NBVElPTjoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNpbmstPmZpbGVuYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JTkRFWDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHNpbmstPmluZGV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QT1NUX01FU1NBR0VTOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNpbmstPnBvc3RfbWVzc2FnZXMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05FWFRfRklMRToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBzaW5rLT5uZXh0X2ZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9GSUxFUzoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzaW5rLT5tYXhfZmlsZXMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9GSUxFX1NJWkU6CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCBzaW5rLT5tYXhfZmlsZV9zaXplKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfRklMRV9EVVJBVElPTjoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHNpbmstPm1heF9maWxlX2R1cmF0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9BR0dSRUdBVEVfR09QUzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBzaW5rLT5hZ2dyZWdhdGVfZ29wcyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X211bHRpX2ZpbGVfc2lua19zdGFydCAoR3N0QmFzZVNpbmsgKiBic2luaykKK3sKKyAgR3N0TXVsdGlGaWxlU2luayAqc2luayA9IEdTVF9NVUxUSV9GSUxFX1NJTksgKGJzaW5rKTsKKworICBpZiAoc2luay0+YWdncmVnYXRlX2dvcHMpCisgICAgc2luay0+Z29wX2FkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgIHNpbmstPnBvdGVudGlhbF9uZXh0X2dvcCA9IE5VTEw7CisgIHNpbmstPmZpbGVfcHRzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBnX3F1ZXVlX2luaXQgKCZzaW5rLT5vbGRfZmlsZXMpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWx0aV9maWxlX3Npbmtfc3RvcCAoR3N0QmFzZVNpbmsgKiBzaW5rKQoreworICBHc3RNdWx0aUZpbGVTaW5rICptdWx0aWZpbGVzaW5rOworICBpbnQgaTsKKworICBtdWx0aWZpbGVzaW5rID0gR1NUX01VTFRJX0ZJTEVfU0lOSyAoc2luayk7CisKKyAgaWYgKG11bHRpZmlsZXNpbmstPmZpbGUgIT0gTlVMTCkgeworICAgIGZjbG9zZSAobXVsdGlmaWxlc2luay0+ZmlsZSk7CisgICAgbXVsdGlmaWxlc2luay0+ZmlsZSA9IE5VTEw7CisgIH0KKworICBpZiAobXVsdGlmaWxlc2luay0+c3RyZWFtaGVhZGVycykgeworICAgIGZvciAoaSA9IDA7IGkgPCBtdWx0aWZpbGVzaW5rLT5uX3N0cmVhbWhlYWRlcnM7IGkrKykgeworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAobXVsdGlmaWxlc2luay0+c3RyZWFtaGVhZGVyc1tpXSk7CisgICAgfQorICAgIGdfZnJlZSAobXVsdGlmaWxlc2luay0+c3RyZWFtaGVhZGVycyk7CisgICAgbXVsdGlmaWxlc2luay0+c3RyZWFtaGVhZGVycyA9IE5VTEw7CisgIH0KKworICBpZiAobXVsdGlmaWxlc2luay0+Z29wX2FkYXB0ZXIgIT0gTlVMTCkgeworICAgIGdfb2JqZWN0X3VucmVmIChtdWx0aWZpbGVzaW5rLT5nb3BfYWRhcHRlcik7CisgICAgbXVsdGlmaWxlc2luay0+Z29wX2FkYXB0ZXIgPSBOVUxMOworICB9CisKKyAgaWYgKG11bHRpZmlsZXNpbmstPnBvdGVudGlhbF9uZXh0X2dvcCAhPSBOVUxMKSB7CisgICAgZ19saXN0X2ZyZWVfZnVsbCAobXVsdGlmaWxlc2luay0+cG90ZW50aWFsX25leHRfZ29wLAorICAgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9idWZmZXJfdW5yZWYpOworICAgIG11bHRpZmlsZXNpbmstPnBvdGVudGlhbF9uZXh0X2dvcCA9IE5VTEw7CisgIH0KKworICBtdWx0aWZpbGVzaW5rLT5mb3JjZV9rZXlfdW5pdF9jb3VudCA9IC0xOworCisgIGdfcXVldWVfZm9yZWFjaCAoJm11bHRpZmlsZXNpbmstPm9sZF9maWxlcywgKEdGdW5jKSBnX2ZyZWUsIE5VTEwpOworICBnX3F1ZXVlX2NsZWFyICgmbXVsdGlmaWxlc2luay0+b2xkX2ZpbGVzKTsKKworICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X211bHRpX2ZpbGVfc2lua19wb3N0X21lc3NhZ2VfZnVsbCAoR3N0TXVsdGlGaWxlU2luayAqIG11bHRpZmlsZXNpbmssCisgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCwgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uLCBHc3RDbG9ja1RpbWUgb2Zmc2V0LAorICAgIEdzdENsb2NrVGltZSBvZmZzZXRfZW5kLCBHc3RDbG9ja1RpbWUgcnVubmluZ190aW1lLAorICAgIEdzdENsb2NrVGltZSBzdHJlYW1fdGltZSwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKworICBpZiAoIW11bHRpZmlsZXNpbmstPnBvc3RfbWVzc2FnZXMpCisgICAgcmV0dXJuOworCisgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAoIkdzdE11bHRpRmlsZVNpbmsiLAorICAgICAgImZpbGVuYW1lIiwgR19UWVBFX1NUUklORywgZmlsZW5hbWUsCisgICAgICAiaW5kZXgiLCBHX1RZUEVfSU5ULCBtdWx0aWZpbGVzaW5rLT5pbmRleCwKKyAgICAgICJ0aW1lc3RhbXAiLCBHX1RZUEVfVUlOVDY0LCB0aW1lc3RhbXAsCisgICAgICAic3RyZWFtLXRpbWUiLCBHX1RZUEVfVUlOVDY0LCBzdHJlYW1fdGltZSwKKyAgICAgICJydW5uaW5nLXRpbWUiLCBHX1RZUEVfVUlOVDY0LCBydW5uaW5nX3RpbWUsCisgICAgICAiZHVyYXRpb24iLCBHX1RZUEVfVUlOVDY0LCBkdXJhdGlvbiwKKyAgICAgICJvZmZzZXQiLCBHX1RZUEVfVUlOVDY0LCBvZmZzZXQsCisgICAgICAib2Zmc2V0LWVuZCIsIEdfVFlQRV9VSU5UNjQsIG9mZnNldF9lbmQsIE5VTEwpOworCisgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAobXVsdGlmaWxlc2luayksCisgICAgICBnc3RfbWVzc2FnZV9uZXdfZWxlbWVudCAoR1NUX09CSkVDVF9DQVNUIChtdWx0aWZpbGVzaW5rKSwgcykpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X211bHRpX2ZpbGVfc2lua19wb3N0X21lc3NhZ2VfZnJvbV90aW1lIChHc3RNdWx0aUZpbGVTaW5rICogbXVsdGlmaWxlc2luaywKKyAgICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBHc3RDbG9ja1RpbWUgZHVyYXRpb24sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICBHc3RDbG9ja1RpbWUgcnVubmluZ190aW1lLCBzdHJlYW1fdGltZTsKKyAgZ3VpbnQ2NCBvZmZzZXQsIG9mZnNldF9lbmQ7CisgIEdzdFNlZ21lbnQgKnNlZ21lbnQ7CisgIEdzdEZvcm1hdCBmb3JtYXQ7CisKKyAgaWYgKCFtdWx0aWZpbGVzaW5rLT5wb3N0X21lc3NhZ2VzKQorICAgIHJldHVybjsKKworICBzZWdtZW50ID0gJkdTVF9CQVNFX1NJTksgKG11bHRpZmlsZXNpbmspLT5zZWdtZW50OworICBmb3JtYXQgPSBzZWdtZW50LT5mb3JtYXQ7CisKKyAgb2Zmc2V0ID0gLTE7CisgIG9mZnNldF9lbmQgPSAtMTsKKworICBydW5uaW5nX3RpbWUgPSBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKHNlZ21lbnQsIGZvcm1hdCwgdGltZXN0YW1wKTsKKyAgc3RyZWFtX3RpbWUgPSBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoc2VnbWVudCwgZm9ybWF0LCB0aW1lc3RhbXApOworCisgIGdzdF9tdWx0aV9maWxlX3NpbmtfcG9zdF9tZXNzYWdlX2Z1bGwgKG11bHRpZmlsZXNpbmssIHRpbWVzdGFtcCwgZHVyYXRpb24sCisgICAgICBvZmZzZXQsIG9mZnNldF9lbmQsIHJ1bm5pbmdfdGltZSwgc3RyZWFtX3RpbWUsIGZpbGVuYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aV9maWxlX3NpbmtfcG9zdF9tZXNzYWdlIChHc3RNdWx0aUZpbGVTaW5rICogbXVsdGlmaWxlc2luaywKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICBHc3RDbG9ja1RpbWUgZHVyYXRpb24sIHRpbWVzdGFtcDsKKyAgR3N0Q2xvY2tUaW1lIHJ1bm5pbmdfdGltZSwgc3RyZWFtX3RpbWU7CisgIGd1aW50NjQgb2Zmc2V0LCBvZmZzZXRfZW5kOworICBHc3RTZWdtZW50ICpzZWdtZW50OworICBHc3RGb3JtYXQgZm9ybWF0OworCisgIGlmICghbXVsdGlmaWxlc2luay0+cG9zdF9tZXNzYWdlcykKKyAgICByZXR1cm47CisKKyAgc2VnbWVudCA9ICZHU1RfQkFTRV9TSU5LIChtdWx0aWZpbGVzaW5rKS0+c2VnbWVudDsKKyAgZm9ybWF0ID0gc2VnbWVudC0+Zm9ybWF0OworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpOworICBkdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcik7CisgIG9mZnNldCA9IEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpOworICBvZmZzZXRfZW5kID0gR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWZmZXIpOworCisgIHJ1bm5pbmdfdGltZSA9IGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoc2VnbWVudCwgZm9ybWF0LCB0aW1lc3RhbXApOworICBzdHJlYW1fdGltZSA9IGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lIChzZWdtZW50LCBmb3JtYXQsIHRpbWVzdGFtcCk7CisKKyAgZ3N0X211bHRpX2ZpbGVfc2lua19wb3N0X21lc3NhZ2VfZnVsbCAobXVsdGlmaWxlc2luaywgdGltZXN0YW1wLCBkdXJhdGlvbiwKKyAgICAgIG9mZnNldCwgb2Zmc2V0X2VuZCwgcnVubmluZ190aW1lLCBzdHJlYW1fdGltZSwgZmlsZW5hbWUpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWx0aV9maWxlX3Npbmtfd3JpdGVfc3RyZWFtX2hlYWRlcnMgKEdzdE11bHRpRmlsZVNpbmsgKiBzaW5rKQoreworICBpbnQgaTsKKworICBpZiAoc2luay0+c3RyZWFtaGVhZGVycyA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIC8qIHdlIHdhbnQgdG8gd3JpdGUgdGhlc2UgYXQgdGhlIGJlZ2lubmluZyAqLworICBnX2Fzc2VydCAoc2luay0+Y3VyX2ZpbGVfc2l6ZSA9PSAwKTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2luay0+bl9zdHJlYW1oZWFkZXJzOyBpKyspIHsKKyAgICBHc3RCdWZmZXIgKmhkcjsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBpbnQgcmV0OworCisgICAgaGRyID0gc2luay0+c3RyZWFtaGVhZGVyc1tpXTsKKyAgICBnc3RfYnVmZmVyX21hcCAoaGRyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIHJldCA9IGZ3cml0ZSAobWFwLmRhdGEsIG1hcC5zaXplLCAxLCBzaW5rLT5maWxlKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChoZHIsICZtYXApOworCisgICAgaWYgKHJldCAhPSAxKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgc2luay0+Y3VyX2ZpbGVfc2l6ZSArPSBtYXAuc2l6ZTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X211bHRpX2ZpbGVfc2lua193cml0ZV9idWZmZXIgKEdzdE11bHRpRmlsZVNpbmsgKiBtdWx0aWZpbGVzaW5rLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdjaGFyICpmaWxlbmFtZTsKKyAgZ2Jvb2xlYW4gcmV0OworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKyAgZ2Jvb2xlYW4gZmlyc3RfZmlsZSA9IFRSVUU7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICBzd2l0Y2ggKG11bHRpZmlsZXNpbmstPm5leHRfZmlsZSkgeworICAgIGNhc2UgR1NUX01VTFRJX0ZJTEVfU0lOS19ORVhUX0JVRkZFUjoKKyAgICAgIGdzdF9tdWx0aV9maWxlX3NpbmtfZW5zdXJlX21heF9maWxlcyAobXVsdGlmaWxlc2luayk7CisKKyAgICAgIGZpbGVuYW1lID0gZ19zdHJkdXBfcHJpbnRmIChtdWx0aWZpbGVzaW5rLT5maWxlbmFtZSwKKyAgICAgICAgICBtdWx0aWZpbGVzaW5rLT5pbmRleCk7CisgICAgICByZXQgPSBnX2ZpbGVfc2V0X2NvbnRlbnRzIChmaWxlbmFtZSwgKGNoYXIgKikgbWFwLmRhdGEsIG1hcC5zaXplLCAmZXJyb3IpOworICAgICAgaWYgKCFyZXQpCisgICAgICAgIGdvdG8gd3JpdGVfZXJyb3I7CisKKyAgICAgIGdzdF9tdWx0aV9maWxlX3NpbmtfcG9zdF9tZXNzYWdlIChtdWx0aWZpbGVzaW5rLCBidWZmZXIsIGZpbGVuYW1lKTsKKworICAgICAgZ3N0X211bHRpX2ZpbGVfc2lua19hZGRfb2xkX2ZpbGUgKG11bHRpZmlsZXNpbmssIGZpbGVuYW1lKTsKKworICAgICAgbXVsdGlmaWxlc2luay0+aW5kZXgrKzsKKworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTVVMVElfRklMRV9TSU5LX05FWFRfRElTQ09OVDoKKyAgICAgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKGJ1ZmZlcikpIHsKKyAgICAgICAgaWYgKG11bHRpZmlsZXNpbmstPmZpbGUpCisgICAgICAgICAgZ3N0X211bHRpX2ZpbGVfc2lua19jbG9zZV9maWxlIChtdWx0aWZpbGVzaW5rLCBidWZmZXIpOworICAgICAgfQorCisgICAgICBpZiAobXVsdGlmaWxlc2luay0+ZmlsZSA9PSBOVUxMKSB7CisgICAgICAgIGlmICghZ3N0X211bHRpX2ZpbGVfc2lua19vcGVuX25leHRfZmlsZSAobXVsdGlmaWxlc2luaykpCisgICAgICAgICAgZ290byBzdGRpb193cml0ZV9lcnJvcjsKKyAgICAgIH0KKworICAgICAgcmV0ID0gZndyaXRlIChtYXAuZGF0YSwgbWFwLnNpemUsIDEsIG11bHRpZmlsZXNpbmstPmZpbGUpOworICAgICAgaWYgKHJldCAhPSAxKQorICAgICAgICBnb3RvIHN0ZGlvX3dyaXRlX2Vycm9yOworCisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NVUxUSV9GSUxFX1NJTktfTkVYVF9LRVlfRlJBTUU6CisgICAgICBpZiAobXVsdGlmaWxlc2luay0+bmV4dF9zZWdtZW50ID09IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICAgICAgaWYgKEdTVF9CVUZGRVJfVElNRVNUQU1QX0lTX1ZBTElEIChidWZmZXIpKSB7CisgICAgICAgICAgbXVsdGlmaWxlc2luay0+bmV4dF9zZWdtZW50ID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcikgKworICAgICAgICAgICAgICAxMCAqIEdTVF9TRUNPTkQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKEdTVF9CVUZGRVJfVElNRVNUQU1QX0lTX1ZBTElEIChidWZmZXIpICYmCisgICAgICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcikgPj0gbXVsdGlmaWxlc2luay0+bmV4dF9zZWdtZW50ICYmCisgICAgICAgICAgIUdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpKSB7CisgICAgICAgIGlmIChtdWx0aWZpbGVzaW5rLT5maWxlKSB7CisgICAgICAgICAgZmlyc3RfZmlsZSA9IEZBTFNFOworICAgICAgICAgIGdzdF9tdWx0aV9maWxlX3NpbmtfY2xvc2VfZmlsZSAobXVsdGlmaWxlc2luaywgYnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBtdWx0aWZpbGVzaW5rLT5uZXh0X3NlZ21lbnQgKz0gMTAgKiBHU1RfU0VDT05EOworICAgICAgfQorCisgICAgICBpZiAobXVsdGlmaWxlc2luay0+ZmlsZSA9PSBOVUxMKSB7CisgICAgICAgIGlmICghZ3N0X211bHRpX2ZpbGVfc2lua19vcGVuX25leHRfZmlsZSAobXVsdGlmaWxlc2luaykpCisgICAgICAgICAgZ290byBzdGRpb193cml0ZV9lcnJvcjsKKworICAgICAgICBpZiAoIWZpcnN0X2ZpbGUpCisgICAgICAgICAgZ3N0X211bHRpX2ZpbGVfc2lua193cml0ZV9zdHJlYW1faGVhZGVycyAobXVsdGlmaWxlc2luayk7CisgICAgICB9CisKKyAgICAgIHJldCA9IGZ3cml0ZSAobWFwLmRhdGEsIG1hcC5zaXplLCAxLCBtdWx0aWZpbGVzaW5rLT5maWxlKTsKKyAgICAgIGlmIChyZXQgIT0gMSkKKyAgICAgICAgZ290byBzdGRpb193cml0ZV9lcnJvcjsKKworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTVVMVElfRklMRV9TSU5LX05FWFRfS0VZX1VOSVRfRVZFTlQ6CisgICAgICBpZiAobXVsdGlmaWxlc2luay0+ZmlsZSA9PSBOVUxMKSB7CisgICAgICAgIGlmICghZ3N0X211bHRpX2ZpbGVfc2lua19vcGVuX25leHRfZmlsZSAobXVsdGlmaWxlc2luaykpCisgICAgICAgICAgZ290byBzdGRpb193cml0ZV9lcnJvcjsKKworICAgICAgICAvKiB3ZSBkb24ndCBuZWVkIHRvIHdyaXRlIHN0cmVhbSBoZWFkZXJzIGhlcmUsIHRoZXkgd2lsbCBiZSBpbnNlcnRlZCBpbgorICAgICAgICAgKiB0aGUgc3RyZWFtIGJ5IHVwc3RyZWFtIGVsZW1lbnRzIGlmIGtleSB1bml0IGV2ZW50cyBoYXZlCisgICAgICAgICAqIGFsbF9oZWFkZXJzPXRydWUgc2V0CisgICAgICAgICAqLworICAgICAgfQorCisgICAgICByZXQgPSBmd3JpdGUgKG1hcC5kYXRhLCBtYXAuc2l6ZSwgMSwgbXVsdGlmaWxlc2luay0+ZmlsZSk7CisKKyAgICAgIGlmIChyZXQgIT0gMSkKKyAgICAgICAgZ290byBzdGRpb193cml0ZV9lcnJvcjsKKworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTVVMVElfRklMRV9TSU5LX05FWFRfTUFYX1NJWkU6eworICAgICAgZ3VpbnQ2NCBuZXdfc2l6ZTsKKworICAgICAgbmV3X3NpemUgPSBtdWx0aWZpbGVzaW5rLT5jdXJfZmlsZV9zaXplICsgbWFwLnNpemU7CisgICAgICBpZiAobmV3X3NpemUgPiBtdWx0aWZpbGVzaW5rLT5tYXhfZmlsZV9zaXplKSB7CisKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChtdWx0aWZpbGVzaW5rLCAiY3VycmVudCBzaXplOiAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgICAiLCBuZXdfc2l6ZTogJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBtYXguIHNpemUgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgIG11bHRpZmlsZXNpbmstPmN1cl9maWxlX3NpemUsIG5ld19zaXplLAorICAgICAgICAgICAgbXVsdGlmaWxlc2luay0+bWF4X2ZpbGVfc2l6ZSk7CisKKyAgICAgICAgaWYgKG11bHRpZmlsZXNpbmstPmZpbGUgIT0gTlVMTCkgeworICAgICAgICAgIGZpcnN0X2ZpbGUgPSBGQUxTRTsKKyAgICAgICAgICBnc3RfbXVsdGlfZmlsZV9zaW5rX2Nsb3NlX2ZpbGUgKG11bHRpZmlsZXNpbmssIGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKG11bHRpZmlsZXNpbmstPmZpbGUgPT0gTlVMTCkgeworICAgICAgICBpZiAoIWdzdF9tdWx0aV9maWxlX3Npbmtfb3Blbl9uZXh0X2ZpbGUgKG11bHRpZmlsZXNpbmspKQorICAgICAgICAgIGdvdG8gc3RkaW9fd3JpdGVfZXJyb3I7CisKKyAgICAgICAgaWYgKCFmaXJzdF9maWxlKQorICAgICAgICAgIGdzdF9tdWx0aV9maWxlX3Npbmtfd3JpdGVfc3RyZWFtX2hlYWRlcnMgKG11bHRpZmlsZXNpbmspOworICAgICAgfQorCisgICAgICByZXQgPSBmd3JpdGUgKG1hcC5kYXRhLCBtYXAuc2l6ZSwgMSwgbXVsdGlmaWxlc2luay0+ZmlsZSk7CisKKyAgICAgIGlmIChyZXQgIT0gMSkKKyAgICAgICAgZ290byBzdGRpb193cml0ZV9lcnJvcjsKKworICAgICAgbXVsdGlmaWxlc2luay0+Y3VyX2ZpbGVfc2l6ZSArPSBtYXAuc2l6ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9NVUxUSV9GSUxFX1NJTktfTkVYVF9NQVhfRFVSQVRJT046eworICAgICAgR3N0Q2xvY2tUaW1lIG5ld19kdXJhdGlvbiA9IDA7CisKKyAgICAgIGlmIChHU1RfQlVGRkVSX1BUU19JU19WQUxJRCAoYnVmZmVyKQorICAgICAgICAgICYmIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChtdWx0aWZpbGVzaW5rLT5maWxlX3B0cykpIHsKKyAgICAgICAgLyogVGhlIG5ldyBkdXJhdGlvbiB3aWxsIGV4dGVuZCB0byB0aGlzIG5ldyBidWZmZXIgcHRzIC4uLiAqLworICAgICAgICBuZXdfZHVyYXRpb24gPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKSAtIG11bHRpZmlsZXNpbmstPmZpbGVfcHRzOworICAgICAgICAvKiAuLi4gYW5kIGR1cmF0aW9uIChpZiBpdCBoYXMgb25lKSAqLworICAgICAgICBpZiAoR1NUX0JVRkZFUl9EVVJBVElPTl9JU19WQUxJRCAoYnVmZmVyKSkKKyAgICAgICAgICBuZXdfZHVyYXRpb24gKz0gR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKTsKKyAgICAgIH0KKworICAgICAgaWYgKG5ld19kdXJhdGlvbiA+IG11bHRpZmlsZXNpbmstPm1heF9maWxlX2R1cmF0aW9uKSB7CisKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChtdWx0aWZpbGVzaW5rLAorICAgICAgICAgICAgIm5ld19kdXJhdGlvbjogJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBtYXguIGR1cmF0aW9uICUiCisgICAgICAgICAgICBHX0dVSU5UNjRfRk9STUFULCBuZXdfZHVyYXRpb24sIG11bHRpZmlsZXNpbmstPm1heF9maWxlX2R1cmF0aW9uKTsKKworICAgICAgICBpZiAobXVsdGlmaWxlc2luay0+ZmlsZSAhPSBOVUxMKSB7CisgICAgICAgICAgZmlyc3RfZmlsZSA9IEZBTFNFOworICAgICAgICAgIGdzdF9tdWx0aV9maWxlX3NpbmtfY2xvc2VfZmlsZSAobXVsdGlmaWxlc2luaywgYnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAobXVsdGlmaWxlc2luay0+ZmlsZSA9PSBOVUxMKSB7CisgICAgICAgIGlmICghZ3N0X211bHRpX2ZpbGVfc2lua19vcGVuX25leHRfZmlsZSAobXVsdGlmaWxlc2luaykpCisgICAgICAgICAgZ290byBzdGRpb193cml0ZV9lcnJvcjsKKworICAgICAgICBtdWx0aWZpbGVzaW5rLT5maWxlX3B0cyA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworICAgICAgICBpZiAoIWZpcnN0X2ZpbGUpCisgICAgICAgICAgZ3N0X211bHRpX2ZpbGVfc2lua193cml0ZV9zdHJlYW1faGVhZGVycyAobXVsdGlmaWxlc2luayk7CisgICAgICB9CisKKyAgICAgIHJldCA9IGZ3cml0ZSAobWFwLmRhdGEsIG1hcC5zaXplLCAxLCBtdWx0aWZpbGVzaW5rLT5maWxlKTsKKworICAgICAgaWYgKHJldCAhPSAxKQorICAgICAgICBnb3RvIHN0ZGlvX3dyaXRlX2Vycm9yOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICB9CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIC8qIEVSUk9SUyAqLword3JpdGVfZXJyb3I6CisgIHsKKyAgICBzd2l0Y2ggKGVycm9yLT5jb2RlKSB7CisgICAgICBjYXNlIEdfRklMRV9FUlJPUl9OT1NQQzp7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtdWx0aWZpbGVzaW5rLCBSRVNPVVJDRSwgTk9fU1BBQ0VfTEVGVCwgKE5VTEwpLAorICAgICAgICAgICAgKE5VTEwpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OnsKKyAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKG11bHRpZmlsZXNpbmssIFJFU09VUkNFLCBXUklURSwKKyAgICAgICAgICAgICgiRXJyb3Igd2hpbGUgd3JpdGluZyB0byBmaWxlIFwiJXNcIi4iLCBmaWxlbmFtZSksCisgICAgICAgICAgICAoIiVzIiwgZ19zdHJlcnJvciAoZXJybm8pKSk7CisgICAgICB9CisgICAgfQorICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgIGdfZnJlZSAoZmlsZW5hbWUpOworCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK3N0ZGlvX3dyaXRlX2Vycm9yOgorICBzd2l0Y2ggKGVycm5vKSB7CisgICAgY2FzZSBFTk9TUEM6CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAobXVsdGlmaWxlc2luaywgUkVTT1VSQ0UsIE5PX1NQQUNFX0xFRlQsCisgICAgICAgICAgKCJFcnJvciB3aGlsZSB3cml0aW5nIHRvIGZpbGUuIiksICgiJXMiLCBnX3N0cmVycm9yIChlcnJubykpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAobXVsdGlmaWxlc2luaywgUkVTT1VSQ0UsIFdSSVRFLAorICAgICAgICAgICgiRXJyb3Igd2hpbGUgd3JpdGluZyB0byBmaWxlLiIpLCAoIiVzIiwgZ19zdHJlcnJvciAoZXJybm8pKSk7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X211bHRpX2ZpbGVfc2lua19yZW5kZXIgKEdzdEJhc2VTaW5rICogYnNpbmssIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0TXVsdGlGaWxlU2luayAqc2luayA9IEdTVF9NVUxUSV9GSUxFX1NJTksgKGJzaW5rKTsKKyAgR3N0Rmxvd1JldHVybiBmbG93ID0gR1NUX0ZMT1dfT0s7CisgIGdib29sZWFuIGtleV91bml0LCBoZWFkZXI7CisKKyAgaGVhZGVyID0gR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmZmVyLCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSKTsKKyAga2V5X3VuaXQgPSAhR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmZmVyLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisKKyAgaWYgKHNpbmstPmFnZ3JlZ2F0ZV9nb3BzKSB7CisgICAgR3N0QnVmZmVyICpnb3BfYnVmZmVyID0gTlVMTDsKKyAgICBndWludCBhdmFpbDsKKworICAgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChzaW5rLT5nb3BfYWRhcHRlcik7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoc2luaywgImFnZ3JlZ2F0ZSBHT1A6IHJlY2VpdmVkICVzJXMgdW5pdCBidWZmZXI6ICIKKyAgICAgICAgIiUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICAoa2V5X3VuaXQpID8gImtleSIgOiAiZGVsdGEiLCAoaGVhZGVyKSA/ICIgaGVhZGVyIiA6ICIiLCBidWZmZXIpOworCisgICAgLyogSWYgaXQncyBhIGhlYWRlciBidWZmZXIsIGl0IG1pZ2h0IHBvdGVudGlhbGx5IGJlIGZvciB0aGUgbmV4dCBHT1AgKi8KKyAgICBpZiAoaGVhZGVyKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc2luaywgIkFjY3VtdWxhdGluZyBidWZmZXIgdG8gcG90ZW50aWFsIG5leHQgR09QIik7CisgICAgICBzaW5rLT5wb3RlbnRpYWxfbmV4dF9nb3AgPQorICAgICAgICAgIGdfbGlzdF9hcHBlbmQgKHNpbmstPnBvdGVudGlhbF9uZXh0X2dvcCwgZ3N0X2J1ZmZlcl9yZWYgKGJ1ZmZlcikpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoa2V5X3VuaXQgJiYgYXZhaWwgPiAwKSB7CisgICAgICAgIEdzdENsb2NrVGltZSBwdHMsIGR0czsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHNpbmssICJHcmFiYmluZyBwZW5kaW5nIGNvbXBsZXRlZCBHT1AiKTsKKyAgICAgICAgcHRzID0gZ3N0X2FkYXB0ZXJfcHJldl9wdHNfYXRfb2Zmc2V0IChzaW5rLT5nb3BfYWRhcHRlciwgMCwgTlVMTCk7CisgICAgICAgIGR0cyA9IGdzdF9hZGFwdGVyX3ByZXZfZHRzX2F0X29mZnNldCAoc2luay0+Z29wX2FkYXB0ZXIsIDAsIE5VTEwpOworICAgICAgICBnb3BfYnVmZmVyID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHNpbmstPmdvcF9hZGFwdGVyLCBhdmFpbCk7CisgICAgICAgIEdTVF9CVUZGRVJfUFRTIChnb3BfYnVmZmVyKSA9IHB0czsKKyAgICAgICAgR1NUX0JVRkZFUl9EVFMgKGdvcF9idWZmZXIpID0gZHRzOworICAgICAgfQorCisgICAgICAvKiBqdXN0IGFjY3VtdWxhdGUgdGhlIGJ1ZmZlciAqLworICAgICAgaWYgKHNpbmstPnBvdGVudGlhbF9uZXh0X2dvcCkgeworICAgICAgICBHTGlzdCAqdG1wOworICAgICAgICBHU1RfTE9HX09CSkVDVCAoc2luaywKKyAgICAgICAgICAgICJDYXJyeWluZyBvdmVyIHBlbmRpbmcgbmV4dCBHT1AgZGF0YSBpbnRvIGFkYXB0ZXIiKTsKKyAgICAgICAgLyogSWYgd2UgaGF2ZSBwZW5kaW5nIGRhdGEsIHB1dCB0aGF0IGZpcnN0IGluIHRoZSBhZGFwdGVyICovCisgICAgICAgIGZvciAodG1wID0gc2luay0+cG90ZW50aWFsX25leHRfZ29wOyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkgeworICAgICAgICAgIEdzdEJ1ZmZlciAqdG1wYiA9IChHc3RCdWZmZXIgKikgdG1wLT5kYXRhOworICAgICAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKHNpbmstPmdvcF9hZGFwdGVyLCB0bXBiKTsKKyAgICAgICAgfQorICAgICAgICBnX2xpc3RfZnJlZSAoc2luay0+cG90ZW50aWFsX25leHRfZ29wKTsKKyAgICAgICAgc2luay0+cG90ZW50aWFsX25leHRfZ29wID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzaW5rLCAic3RvcmluZyBidWZmZXIgaW4gYWRhcHRlciIpOworICAgICAgZ3N0X2FkYXB0ZXJfcHVzaCAoc2luay0+Z29wX2FkYXB0ZXIsIGdzdF9idWZmZXJfcmVmIChidWZmZXIpKTsKKworICAgICAgaWYgKGdvcF9idWZmZXIgIT0gTlVMTCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAid3JpdGluZyBvdXQgcGVuZGluZyBHT1AsICV1IGJ5dGVzIiwgYXZhaWwpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLAorICAgICAgICAgICAgImdvcCBidWZmZXIgcHRzOiUiIEdTVF9USU1FX0ZPUk1BVCAiIGR0czolIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAgICIgZHVyYXRpb246JSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9QVFMgKGdvcF9idWZmZXIpKSwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFRTIChnb3BfYnVmZmVyKSksCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RVUkFUSU9OIChnb3BfYnVmZmVyKSkpOworICAgICAgICBmbG93ID0gZ3N0X211bHRpX2ZpbGVfc2lua193cml0ZV9idWZmZXIgKHNpbmssIGdvcF9idWZmZXIpOworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChnb3BfYnVmZmVyKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZmxvdyA9IGdzdF9tdWx0aV9maWxlX3Npbmtfd3JpdGVfYnVmZmVyIChzaW5rLCBidWZmZXIpOworICB9CisgIHJldHVybiBmbG93OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2J1ZmZlcl9saXN0X2NvcHlfZGF0YSAoR3N0QnVmZmVyICoqIGJ1ZiwgZ3VpbnQgaWR4LCBncG9pbnRlciBkYXRhKQoreworICBHc3RCdWZmZXIgKmRlc3QgPSBkYXRhOworICBndWludCBudW0sIGk7CisKKyAgaWYgKGlkeCA9PSAwKQorICAgIGdzdF9idWZmZXJfY29weV9pbnRvIChkZXN0LCAqYnVmLCBHU1RfQlVGRkVSX0NPUFlfTUVUQURBVEEsIDAsIC0xKTsKKworICBudW0gPSBnc3RfYnVmZmVyX25fbWVtb3J5ICgqYnVmKTsKKyAgZm9yIChpID0gMDsgaSA8IG51bTsgKytpKSB7CisgICAgR3N0TWVtb3J5ICptZW07CisKKyAgICBtZW0gPSBnc3RfYnVmZmVyX2dldF9tZW1vcnkgKCpidWYsIGkpOworICAgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAoZGVzdCwgbWVtKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBPdXIgYXNzdW1wdGlvbiBmb3Igbm93IGlzIHRoYXQgdGhlIGJ1ZmZlcnMgaW4gYSBidWZmZXIgbGlzdCBzaG91bGQgYWx3YXlzCisgKiBlbmQgdXAgaW4gdGhlIHNhbWUgZmlsZS4gSWYgc29tZW9uZSB3YW50cyBkaWZmZXJlbnQgYmVoYXZpb3VyLCB0aGV5J2xsIGp1c3QKKyAqIGhhdmUgdG8gYWRkIGEgcHJvcGVydHkgZm9yIHRoYXQuICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X211bHRpX2ZpbGVfc2lua19yZW5kZXJfbGlzdCAoR3N0QmFzZVNpbmsgKiBzaW5rLCBHc3RCdWZmZXJMaXN0ICogbGlzdCkKK3sKKyAgR3N0QnVmZmVyICpidWY7CisgIGd1aW50IHNpemU7CisKKyAgc2l6ZSA9IGdzdF9idWZmZXJfbGlzdF9jYWxjdWxhdGVfc2l6ZSAobGlzdCk7CisgIEdTVF9MT0dfT0JKRUNUIChzaW5rLCAidG90YWwgc2l6ZSBvZiBidWZmZXIgbGlzdCAlcDogJXUiLCBsaXN0LCBzaXplKTsKKworICAvKiBjb3B5IGFsbCBidWZmZXJzIGluIHRoZSBsaXN0IGludG8gb25lIHNpbmdsZSBidWZmZXIsIHNvIHdlIGNhbiB1c2UKKyAgICogdGhlIG5vcm1hbCByZW5kZXIgZnVuY3Rpb24gKEZJWE1FOiBvcHRpbWlzZSB0byBhdm9pZCB0aGUgbWVtY3B5KSAqLworICBidWYgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgZ3N0X2J1ZmZlcl9saXN0X2ZvcmVhY2ggKGxpc3QsIGJ1ZmZlcl9saXN0X2NvcHlfZGF0YSwgYnVmKTsKKyAgZ19hc3NlcnQgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikgPT0gc2l6ZSk7CisKKyAgZ3N0X211bHRpX2ZpbGVfc2lua19yZW5kZXIgKHNpbmssIGJ1Zik7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWx0aV9maWxlX3Npbmtfc2V0X2NhcHMgKEdzdEJhc2VTaW5rICogc2luaywgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdE11bHRpRmlsZVNpbmsgKm11bHRpZmlsZXNpbms7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworCisgIG11bHRpZmlsZXNpbmsgPSBHU1RfTVVMVElfRklMRV9TSU5LIChzaW5rKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgaWYgKHN0cnVjdHVyZSkgeworICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWU7CisKKyAgICB2YWx1ZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJzdHJlYW1oZWFkZXIiKTsKKworICAgIGlmIChHU1RfVkFMVUVfSE9MRFNfQVJSQVkgKHZhbHVlKSkgeworICAgICAgaW50IGk7CisKKyAgICAgIGlmIChtdWx0aWZpbGVzaW5rLT5zdHJlYW1oZWFkZXJzKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtdWx0aWZpbGVzaW5rLT5uX3N0cmVhbWhlYWRlcnM7IGkrKykgeworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG11bHRpZmlsZXNpbmstPnN0cmVhbWhlYWRlcnNbaV0pOworICAgICAgICB9CisgICAgICAgIGdfZnJlZSAobXVsdGlmaWxlc2luay0+c3RyZWFtaGVhZGVycyk7CisgICAgICB9CisKKyAgICAgIG11bHRpZmlsZXNpbmstPm5fc3RyZWFtaGVhZGVycyA9IGdzdF92YWx1ZV9hcnJheV9nZXRfc2l6ZSAodmFsdWUpOworICAgICAgbXVsdGlmaWxlc2luay0+c3RyZWFtaGVhZGVycyA9CisgICAgICAgICAgZ19tYWxsb2MgKHNpemVvZiAoR3N0QnVmZmVyICopICogbXVsdGlmaWxlc2luay0+bl9zdHJlYW1oZWFkZXJzKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG11bHRpZmlsZXNpbmstPm5fc3RyZWFtaGVhZGVyczsgaSsrKSB7CisgICAgICAgIG11bHRpZmlsZXNpbmstPnN0cmVhbWhlYWRlcnNbaV0gPQorICAgICAgICAgICAgZ3N0X2J1ZmZlcl9yZWYgKGdzdF92YWx1ZV9nZXRfYnVmZmVyIChnc3RfdmFsdWVfYXJyYXlfZ2V0X3ZhbHVlCisgICAgICAgICAgICAgICAgKHZhbHVlLCBpKSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBUYWtlcyBvd25lcnNoaXAgb2YgdGhlIGZpbGVuYW1lIHN0cmluZyAqLworc3RhdGljIHZvaWQKK2dzdF9tdWx0aV9maWxlX3NpbmtfYWRkX29sZF9maWxlIChHc3RNdWx0aUZpbGVTaW5rICogbXVsdGlmaWxlc2luaywgZ2NoYXIgKiBmbikKK3sKKyAgLyogT25seSBhZGQgZmlsZSB0byB0aGUgbGlzdCBpZiBhIG1heF9maWxlcyBsaW1pdCBpcyBzZXQsIG90aGVyd2lzZSB3ZSBuZXZlcgorICAgKiBwcnVuZSB0aGUgbGlzdCBhbmQgbWVtb3J5IGp1c3QgYnVpbGRzIHVwIHVudGlsIHRoZSBwaXBlbGluZSBpcyBzdG9wcGVkLiAqLworICBpZiAobXVsdGlmaWxlc2luay0+bWF4X2ZpbGVzID4gMCkgeworICAgIGdfcXVldWVfcHVzaF90YWlsICgmbXVsdGlmaWxlc2luay0+b2xkX2ZpbGVzLCBmbik7CisgIH0gZWxzZSB7CisgICAgZ19mcmVlIChmbik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aV9maWxlX3NpbmtfZW5zdXJlX21heF9maWxlcyAoR3N0TXVsdGlGaWxlU2luayAqIG11bHRpZmlsZXNpbmspCit7CisgIGd1aW50IG1heF9maWxlcyA9IG11bHRpZmlsZXNpbmstPm1heF9maWxlczsKKworICBpZiAobWF4X2ZpbGVzID09IDApCisgICAgcmV0dXJuOworCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZtdWx0aWZpbGVzaW5rLT5vbGRfZmlsZXMpID49IG1heF9maWxlcykgeworICAgIGdjaGFyICpmaWxlbmFtZTsKKworICAgIGZpbGVuYW1lID0gZ19xdWV1ZV9wb3BfaGVhZCAoJm11bHRpZmlsZXNpbmstPm9sZF9maWxlcyk7CisgICAgZ19yZW1vdmUgKGZpbGVuYW1lKTsKKyAgICBnX2ZyZWUgKGZpbGVuYW1lKTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWx0aV9maWxlX3NpbmtfZXZlbnQgKEdzdEJhc2VTaW5rICogc2luaywgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0TXVsdGlGaWxlU2luayAqbXVsdGlmaWxlc2luazsKKyAgZ2NoYXIgKmZpbGVuYW1lOworCisgIG11bHRpZmlsZXNpbmsgPSBHU1RfTVVMVElfRklMRV9TSU5LIChzaW5rKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9DVVNUT01fRE9XTlNUUkVBTToKKyAgICB7CisgICAgICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBkdXJhdGlvbjsKKyAgICAgIEdzdENsb2NrVGltZSBydW5uaW5nX3RpbWUsIHN0cmVhbV90aW1lOworICAgICAgZ3VpbnQ2NCBvZmZzZXQsIG9mZnNldF9lbmQ7CisgICAgICBnYm9vbGVhbiBhbGxfaGVhZGVyczsKKyAgICAgIGd1aW50IGNvdW50OworCisgICAgICBpZiAobXVsdGlmaWxlc2luay0+bmV4dF9maWxlICE9IEdTVF9NVUxUSV9GSUxFX1NJTktfTkVYVF9LRVlfVU5JVF9FVkVOVCB8fAorICAgICAgICAgICFnc3RfdmlkZW9fZXZlbnRfaXNfZm9yY2Vfa2V5X3VuaXQgKGV2ZW50KSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGdzdF92aWRlb19ldmVudF9wYXJzZV9kb3duc3RyZWFtX2ZvcmNlX2tleV91bml0IChldmVudCwgJnRpbWVzdGFtcCwKKyAgICAgICAgICAmc3RyZWFtX3RpbWUsICZydW5uaW5nX3RpbWUsICZhbGxfaGVhZGVycywgJmNvdW50KTsKKworICAgICAgaWYgKG11bHRpZmlsZXNpbmstPmZvcmNlX2tleV91bml0X2NvdW50ICE9IC0xICYmCisgICAgICAgICAgbXVsdGlmaWxlc2luay0+Zm9yY2Vfa2V5X3VuaXRfY291bnQgPT0gY291bnQpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBtdWx0aWZpbGVzaW5rLT5mb3JjZV9rZXlfdW5pdF9jb3VudCA9IGNvdW50OworCisgICAgICBpZiAobXVsdGlmaWxlc2luay0+ZmlsZSkgeworICAgICAgICBkdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICAgIG9mZnNldCA9IG9mZnNldF9lbmQgPSAtMTsKKyAgICAgICAgZmlsZW5hbWUgPSBnX3N0cmR1cF9wcmludGYgKG11bHRpZmlsZXNpbmstPmZpbGVuYW1lLAorICAgICAgICAgICAgbXVsdGlmaWxlc2luay0+aW5kZXgpOworCisgICAgICAgIGdzdF9tdWx0aV9maWxlX3NpbmtfY2xvc2VfZmlsZSAobXVsdGlmaWxlc2luaywgTlVMTCk7CisKKyAgICAgICAgZ3N0X211bHRpX2ZpbGVfc2lua19wb3N0X21lc3NhZ2VfZnVsbCAobXVsdGlmaWxlc2luaywgdGltZXN0YW1wLAorICAgICAgICAgICAgZHVyYXRpb24sIG9mZnNldCwgb2Zmc2V0X2VuZCwgcnVubmluZ190aW1lLCBzdHJlYW1fdGltZSwgZmlsZW5hbWUpOworICAgICAgICBnX2ZyZWUgKGZpbGVuYW1lKTsKKyAgICAgIH0KKworICAgICAgaWYgKG11bHRpZmlsZXNpbmstPmZpbGUgPT0gTlVMTCkgeworICAgICAgICBpZiAoIWdzdF9tdWx0aV9maWxlX3Npbmtfb3Blbl9uZXh0X2ZpbGUgKG11bHRpZmlsZXNpbmspKQorICAgICAgICAgIGdvdG8gc3RkaW9fd3JpdGVfZXJyb3I7CisgICAgICB9CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgICBpZiAobXVsdGlmaWxlc2luay0+YWdncmVnYXRlX2dvcHMpIHsKKyAgICAgICAgR3N0QnVmZmVyICpidWYgPSBnc3RfYnVmZmVyX25ldyAoKTsKKworICAgICAgICAvKiBwdXNoIGtleSB1bml0IGJ1ZmZlciB0byBmb3JjZSB3cml0aW5nIG91dCB0aGUgcGVuZGluZyBHT1AgZGF0YSAqLworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHNpbmssICJFT1MsIHdyaXRlIHBlbmRpbmcgR09QIGRhdGEiKTsKKyAgICAgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKTsKKyAgICAgICAgZ3N0X211bHRpX2ZpbGVfc2lua19yZW5kZXIgKHNpbmssIGJ1Zik7CisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICB9CisgICAgICBpZiAobXVsdGlmaWxlc2luay0+ZmlsZSkgeworICAgICAgICBnY2hhciAqZmlsZW5hbWU7CisKKyAgICAgICAgZmlsZW5hbWUgPSBnX3N0cmR1cF9wcmludGYgKG11bHRpZmlsZXNpbmstPmZpbGVuYW1lLAorICAgICAgICAgICAgbXVsdGlmaWxlc2luay0+aW5kZXgpOworCisgICAgICAgIGdzdF9tdWx0aV9maWxlX3NpbmtfY2xvc2VfZmlsZSAobXVsdGlmaWxlc2luaywgTlVMTCk7CisKKyAgICAgICAgZ3N0X211bHRpX2ZpbGVfc2lua19wb3N0X21lc3NhZ2VfZnJvbV90aW1lIChtdWx0aWZpbGVzaW5rLAorICAgICAgICAgICAgR1NUX0JBU0VfU0lOSyAobXVsdGlmaWxlc2luayktPnNlZ21lbnQucG9zaXRpb24sIC0xLCBmaWxlbmFtZSk7CisgICAgICAgIGdfZnJlZSAoZmlsZW5hbWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKK291dDoKKyAgcmV0dXJuIEdTVF9CQVNFX1NJTktfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmV2ZW50IChzaW5rLCBldmVudCk7CisKKyAgLyogRVJST1JTICovCitzdGRpb193cml0ZV9lcnJvcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtdWx0aWZpbGVzaW5rLCBSRVNPVVJDRSwgV1JJVEUsCisgICAgICAgICgiRXJyb3Igd2hpbGUgd3JpdGluZyB0byBmaWxlLiIpLCAoTlVMTCkpOworICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWx0aV9maWxlX3Npbmtfb3Blbl9uZXh0X2ZpbGUgKEdzdE11bHRpRmlsZVNpbmsgKiBtdWx0aWZpbGVzaW5rKQoreworICBjaGFyICpmaWxlbmFtZTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAobXVsdGlmaWxlc2luay0+ZmlsZSA9PSBOVUxMLCBGQUxTRSk7CisKKyAgZ3N0X211bHRpX2ZpbGVfc2lua19lbnN1cmVfbWF4X2ZpbGVzIChtdWx0aWZpbGVzaW5rKTsKKworICBmaWxlbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAobXVsdGlmaWxlc2luay0+ZmlsZW5hbWUsIG11bHRpZmlsZXNpbmstPmluZGV4KTsKKyAgbXVsdGlmaWxlc2luay0+ZmlsZSA9IGdfZm9wZW4gKGZpbGVuYW1lLCAid2IiKTsKKyAgaWYgKG11bHRpZmlsZXNpbmstPmZpbGUgPT0gTlVMTCkgeworICAgIGdfZnJlZSAoZmlsZW5hbWUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIEdTVF9JTkZPX09CSkVDVCAobXVsdGlmaWxlc2luaywgIm9wZW5pbmcgZmlsZSAlcyIsIGZpbGVuYW1lKTsKKworICBnc3RfbXVsdGlfZmlsZV9zaW5rX2FkZF9vbGRfZmlsZSAobXVsdGlmaWxlc2luaywgZmlsZW5hbWUpOworCisgIG11bHRpZmlsZXNpbmstPmN1cl9maWxlX3NpemUgPSAwOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aV9maWxlX3NpbmtfY2xvc2VfZmlsZSAoR3N0TXVsdGlGaWxlU2luayAqIG11bHRpZmlsZXNpbmssCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBjaGFyICpmaWxlbmFtZTsKKworICBmY2xvc2UgKG11bHRpZmlsZXNpbmstPmZpbGUpOworICBtdWx0aWZpbGVzaW5rLT5maWxlID0gTlVMTDsKKworICBpZiAoYnVmZmVyKSB7CisgICAgZmlsZW5hbWUgPSBnX3N0cmR1cF9wcmludGYgKG11bHRpZmlsZXNpbmstPmZpbGVuYW1lLCBtdWx0aWZpbGVzaW5rLT5pbmRleCk7CisgICAgZ3N0X211bHRpX2ZpbGVfc2lua19wb3N0X21lc3NhZ2UgKG11bHRpZmlsZXNpbmssIGJ1ZmZlciwgZmlsZW5hbWUpOworICAgIGdfZnJlZSAoZmlsZW5hbWUpOworICB9CisKKyAgbXVsdGlmaWxlc2luay0+aW5kZXgrKzsKK30KZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oIGIvZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmZTUzMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oCkBAIC0wLDAgKzEsMTE4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwMCBXaW0gVGF5bWFucyA8d3RheUBjaGVsbG8uYmU+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwNiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICogICAgICAgICAgICAgICAgICAgIDIwMDYgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogZ3N0bXVsdGlmaWxlc2luay5oOgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfTVVMVElGSUxFU0lOS19IX18KKyNkZWZpbmUgX19HU1RfTVVMVElGSUxFU0lOS19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9iYXNlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9NVUxUSV9GSUxFX1NJTksgXAorICAoZ3N0X211bHRpX2ZpbGVfc2lua19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfTVVMVElfRklMRV9TSU5LKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfTVVMVElfRklMRV9TSU5LLEdzdE11bHRpRmlsZVNpbmspKQorI2RlZmluZSBHU1RfTVVMVElfRklMRV9TSU5LX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX01VTFRJX0ZJTEVfU0lOSyxHc3RNdWx0aUZpbGVTaW5rQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfTVVMVElfRklMRV9TSU5LKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfTVVMVElfRklMRV9TSU5LKSkKKyNkZWZpbmUgR1NUX0lTX01VTFRJX0ZJTEVfU0lOS19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9NVUxUSV9GSUxFX1NJTkspKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0TXVsdGlGaWxlU2luayBHc3RNdWx0aUZpbGVTaW5rOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE11bHRpRmlsZVNpbmtDbGFzcyBHc3RNdWx0aUZpbGVTaW5rQ2xhc3M7CisKKy8qKgorICogR3N0TXVsdGlGaWxlU2lua05leHQ6CisgKiBAR1NUX01VTFRJX0ZJTEVfU0lOS19ORVhUX0JVRkZFUjogTmV3IGZpbGUgZm9yIGVhY2ggYnVmZmVyCisgKiBAR1NUX01VTFRJX0ZJTEVfU0lOS19ORVhUX0RJU0NPTlQ6IE5ldyBmaWxlIGFmdGVyIGVhY2ggZGlzY29udGludWl0eQorICogQEdTVF9NVUxUSV9GSUxFX1NJTktfTkVYVF9LRVlfRlJBTUU6IE5ldyBmaWxlIGF0IGVhY2gga2V5IGZyYW1lCisgKiAgKFVzZWZ1bCBmb3IgTVBFRy1UUyBzZWdtZW50aW5nKQorICogQEdTVF9NVUxUSV9GSUxFX1NJTktfTkVYVF9LRVlfVU5JVF9FVkVOVDogTmV3IGZpbGUgYWZ0ZXIgYSBmb3JjZSBrZXkgdW5pdAorICogIGV2ZW50CisgKiBAR1NUX01VTFRJX0ZJTEVfU0lOS19ORVhUX01BWF9TSVpFOiBOZXcgZmlsZSB3aGVuIHRoZSBjb25maWd1cmVkIG1heGltdW0gZmlsZQorICogIHNpemUgd291bGQgYmUgZXhjZWVkZWQgd2l0aCB0aGUgbmV4dCBidWZmZXIgb3IgYnVmZmVyIGxpc3QKKyAqIEBHU1RfTVVMVElfRklMRV9TSU5LX05FWFRfTUFYX0RVUkFUSU9OOiBOZXcgZmlsZSB3aGVuIHRoZSBjb25maWd1cmVkIG1heGltdW0gZHVyYXRpb24KKyAqICB3b3VsZCBiZSBleGNlZWRlZCB3aXRoIHRoZSBuZXh0IGJ1ZmZlciBvciBidWZmZXIgbGlzdAorICoKKyAqIEZpbGUgc3BsaXR0aW5nIG1vZGVzLgorICovCit0eXBlZGVmIGVudW0geworICBHU1RfTVVMVElfRklMRV9TSU5LX05FWFRfQlVGRkVSLAorICBHU1RfTVVMVElfRklMRV9TSU5LX05FWFRfRElTQ09OVCwKKyAgR1NUX01VTFRJX0ZJTEVfU0lOS19ORVhUX0tFWV9GUkFNRSwKKyAgR1NUX01VTFRJX0ZJTEVfU0lOS19ORVhUX0tFWV9VTklUX0VWRU5ULAorICBHU1RfTVVMVElfRklMRV9TSU5LX05FWFRfTUFYX1NJWkUsCisgIEdTVF9NVUxUSV9GSUxFX1NJTktfTkVYVF9NQVhfRFVSQVRJT04KK30gR3N0TXVsdGlGaWxlU2lua05leHQ7CisKK3N0cnVjdCBfR3N0TXVsdGlGaWxlU2luaworeworICBHc3RCYXNlU2luayBwYXJlbnQ7CisKKyAgZ2NoYXIgKmZpbGVuYW1lOworICBnaW50IGluZGV4OworICBnYm9vbGVhbiBwb3N0X21lc3NhZ2VzOworICBHc3RNdWx0aUZpbGVTaW5rTmV4dCBuZXh0X2ZpbGU7CisgIEZJTEUgKmZpbGU7CisKKyAgZ3VpbnQgbWF4X2ZpbGVzOworICBHUXVldWUgb2xkX2ZpbGVzOyAgICAgICAgLyoga2VlcCB0cmFjayBvZiBvbGQgZmlsZXMgZm9yIG1heF9maWxlcyBoYW5kbGluZyAqLworCisgIGdpbnQ2NCBuZXh0X3NlZ21lbnQ7CisKKyAgaW50IG5fc3RyZWFtaGVhZGVyczsKKyAgR3N0QnVmZmVyICoqc3RyZWFtaGVhZGVyczsKKyAgZ3VpbnQgZm9yY2Vfa2V5X3VuaXRfY291bnQ7CisKKyAgZ3VpbnQ2NCBjdXJfZmlsZV9zaXplOworICBndWludDY0IG1heF9maWxlX3NpemU7CisKKyAgR3N0Q2xvY2tUaW1lIGZpbGVfcHRzOworICBHc3RDbG9ja1RpbWUgbWF4X2ZpbGVfZHVyYXRpb247CisKKyAgZ2Jvb2xlYW4gYWdncmVnYXRlX2dvcHM7CisgIEdzdEFkYXB0ZXIgKmdvcF9hZGFwdGVyOyAgLyogdG8gYWdncmVnYXRlIEdPUHMgKi8KKyAgR0xpc3QgKnBvdGVudGlhbF9uZXh0X2dvcDsJLyogVG8gZGV0ZWN0IGZhbHNlLXBvc2l0aXZlcyAqLworfTsKKworc3RydWN0IF9Hc3RNdWx0aUZpbGVTaW5rQ2xhc3MKK3sKKyAgR3N0QmFzZVNpbmtDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfbXVsdGlfZmlsZV9zaW5rX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX01VTFRJRklMRVNJTktfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jIGIvZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWQxYTFiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYwpAQCAtMCwwICsxLDU3MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogZ3N0bXVsdGlmaWxlc3JjLmM6CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LW11bHRpZmlsZXNyYworICogQHNlZV9hbHNvOiAjR3N0RmlsZVNyYworICoKKyAqIFJlYWRzIGJ1ZmZlcnMgZnJvbSBzZXF1ZW50aWFsbHkgbmFtZWQgZmlsZXMuIElmIHVzZWQgdG9nZXRoZXIgd2l0aCBhbiBpbWFnZQorICogZGVjb2Rlciwgb25lIG5lZWRzIHRvIHVzZSB0aGUgI0dzdE11bHRpRmlsZVNyYzpjYXBzIHByb3BlcnR5IG9yIGEgY2Fwc2ZpbHRlcgorICogdG8gZm9yY2UgdG8gY2FwcyBjb250YWluaW5nIGEgZnJhbWVyYXRlLiBPdGhlcndpc2UgaW1hZ2UgZGVjb2RlcnMgc2VuZCBFT1MKKyAqIGFmdGVyIHRoZSBmaXJzdCBwaWN0dXJlLiBXZSBhbHNvIG5lZWQgYSB2aWRlb3JhdGUgZWxlbWVudCB0byBzZXQgdGltZXN0YW1wcworICogb24gYWxsIGJ1ZmZlcnMgYWZ0ZXIgdGhlIGZpcnN0IG9uZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGZyYW1lcmF0ZS4KKyAqCisgKiBGaWxlIG5hbWVzIGFyZSBjcmVhdGVkIGJ5IHJlcGxhY2luZyAiXCVkIiB3aXRoIHRoZSBpbmRleCB1c2luZyBwcmludGYoKS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgbXVsdGlmaWxlc3JjIGxvY2F0aW9uPSJpbWcuJTA0ZC5wbmciIGluZGV4PTAgY2Fwcz0iaW1hZ2UvcG5nLGZyYW1lcmF0ZT1cKGZyYWN0aW9uXCkxMi8xIiAhIFwKKyAqICAgICBwbmdkZWMgISB2aWRlb2NvbnZlcnQgISB2aWRlb3JhdGUgISB0aGVvcmFlbmMgISBvZ2dtdXggISBcCisgKiAgICAgZmlsZXNpbmsgbG9jYXRpb249ImltYWdlcy5vZ2ciCisgKiBdfCBUaGlzIHBpcGVsaW5lIGNyZWF0ZXMgYSB2aWRlbyBmaWxlICJpbWFnZXMub2dnIiBieSBqb2luaW5nIG11bHRpcGxlIFBORworICogZmlsZXMgbmFtZWQgaW1nLjAwMDAucG5nLCBpbWcuMDAwMS5wbmcsIGV0Yy4KKyAqIDwvcmVmc2VjdDI+CisqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdG11bHRpZmlsZXNyYy5oIgorCisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9tdWx0aV9maWxlX3NyY19jcmVhdGUgKEdzdFB1c2hTcmMgKiBzcmMsCisgICAgR3N0QnVmZmVyICoqIGJ1ZmZlcik7CisKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aV9maWxlX3NyY19kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIHZvaWQgZ3N0X211bHRpX2ZpbGVfc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aV9maWxlX3NyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X211bHRpX2ZpbGVfc3JjX2dldGNhcHMgKEdzdEJhc2VTcmMgKiBzcmMsIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9tdWx0aV9maWxlX3NyY19xdWVyeSAoR3N0QmFzZVNyYyAqIHNyYywgR3N0UXVlcnkgKiBxdWVyeSk7CitzdGF0aWMgdm9pZCBnc3RfbXVsdGlfZmlsZV9zcmNfdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwKKyAgICBncG9pbnRlciBpZmFjZV9kYXRhKTsKKworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X211bHRpX2ZpbGVfc3JjX3BhZF90ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9tdWx0aV9maWxlX3NyY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfbXVsdGlfZmlsZV9zcmNfZGVidWcKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTE9DQVRJT04sCisgIFBST1BfSU5ERVgsCisgIFBST1BfU1RBUlRfSU5ERVgsCisgIFBST1BfU1RPUF9JTkRFWCwKKyAgUFJPUF9DQVBTLAorICBQUk9QX0xPT1AKK307CisKKyNkZWZpbmUgREVGQVVMVF9MT0NBVElPTiAiJTA1ZCIKKyNkZWZpbmUgREVGQVVMVF9JTkRFWCAwCisKKyNkZWZpbmUgZ3N0X211bHRpX2ZpbGVfc3JjX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RNdWx0aUZpbGVTcmMsIGdzdF9tdWx0aV9maWxlX3NyYywgR1NUX1RZUEVfUFVTSF9TUkMsCisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9VUklfSEFORExFUiwKKyAgICAgICAgZ3N0X211bHRpX2ZpbGVfc3JjX3VyaV9oYW5kbGVyX2luaXQpKTsKKworCitzdGF0aWMgZ2Jvb2xlYW4KK2lzX3NlZWthYmxlIChHc3RCYXNlU3JjICogc3JjKQoreworICBHc3RNdWx0aUZpbGVTcmMgKm1mcyA9IEdTVF9NVUxUSV9GSUxFX1NSQyAoc3JjKTsKKworICBpZiAobWZzLT5mcHNfbiAhPSAtMSkKKyAgICByZXR1cm4gVFJVRTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZG9fc2VlayAoR3N0QmFzZVNyYyAqIGJzcmMsIEdzdFNlZ21lbnQgKiBzZWdtZW50KQoreworICBnYm9vbGVhbiByZXZlcnNlOworICBHc3RDbG9ja1RpbWUgcG9zaXRpb247CisgIEdzdE11bHRpRmlsZVNyYyAqc3JjOworCisgIHNyYyA9IEdTVF9NVUxUSV9GSUxFX1NSQyAoYnNyYyk7CisKKyAgc2VnbWVudC0+dGltZSA9IHNlZ21lbnQtPnN0YXJ0OworICBwb3NpdGlvbiA9IHNlZ21lbnQtPnBvc2l0aW9uOworICByZXZlcnNlID0gc2VnbWVudC0+cmF0ZSA8IDA7CisKKyAgaWYgKHJldmVyc2UpIHsKKyAgICBHU1RfRklYTUVfT0JKRUNUIChzcmMsICJIYW5kbGUgcmV2ZXJzZSBwbGF5YmFjayIpOworCisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogbm93IG1vdmUgdG8gdGhlIHBvc2l0aW9uIGluZGljYXRlZCAqLworICBpZiAoc3JjLT5mcHNfbikgeworICAgIHNyYy0+aW5kZXggPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHBvc2l0aW9uLAorICAgICAgICBzcmMtPmZwc19uLCBzcmMtPmZwc19kICogR1NUX1NFQ09ORCk7CisgIH0gZWxzZSB7CisgICAgc3JjLT5pbmRleCA9IDA7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJObyBGUFMgc2V0LCBjYW4gbm90IHNlZWsiKTsKKworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X211bHRpX2ZpbGVfc3JjX2NsYXNzX2luaXQgKEdzdE11bHRpRmlsZVNyY0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdzdFB1c2hTcmNDbGFzcyAqZ3N0cHVzaHNyY19jbGFzcyA9IEdTVF9QVVNIX1NSQ19DTEFTUyAoa2xhc3MpOworICBHc3RCYXNlU3JjQ2xhc3MgKmdzdGJhc2VzcmNfY2xhc3MgPSBHU1RfQkFTRV9TUkNfQ0xBU1MgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfbXVsdGlfZmlsZV9zcmNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfbXVsdGlfZmlsZV9zcmNfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTE9DQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgibG9jYXRpb24iLCAiRmlsZSBMb2NhdGlvbiIsCisgICAgICAgICAgIlBhdHRlcm4gdG8gY3JlYXRlIGZpbGUgbmFtZXMgb2YgaW5wdXQgZmlsZXMuICBGaWxlIG5hbWVzIGFyZSAiCisgICAgICAgICAgImNyZWF0ZWQgYnkgY2FsbGluZyBzcHJpbnRmKCkgd2l0aCB0aGUgcGF0dGVybiBhbmQgdGhlIGN1cnJlbnQgIgorICAgICAgICAgICJpbmRleC4iLCBERUZBVUxUX0xPQ0FUSU9OLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0lOREVYLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImluZGV4IiwgIkZpbGUgSW5kZXgiLAorICAgICAgICAgICJJbmRleCB0byB1c2Ugd2l0aCBsb2NhdGlvbiBwcm9wZXJ0eSB0byBjcmVhdGUgZmlsZSBuYW1lcy4gIFRoZSAiCisgICAgICAgICAgImluZGV4IGlzIGluY3JlbWVudGVkIGJ5IG9uZSBmb3IgZWFjaCBidWZmZXIgcmVhZC4iLAorICAgICAgICAgIDAsIElOVF9NQVgsIERFRkFVTFRfSU5ERVgsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU1RBUlRfSU5ERVgsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgic3RhcnQtaW5kZXgiLCAiU3RhcnQgSW5kZXgiLAorICAgICAgICAgICJTdGFydCB2YWx1ZSBvZiBpbmRleC4gIFRoZSBpbml0aWFsIHZhbHVlIG9mIGluZGV4IGNhbiBiZSBzZXQgIgorICAgICAgICAgICJlaXRoZXIgYnkgc2V0dGluZyBpbmRleCBvciBzdGFydC1pbmRleC4gIFdoZW4gdGhlIGVuZCBvZiB0aGUgbG9vcCAiCisgICAgICAgICAgImlzIHJlYWNoZWQsIHRoZSBpbmRleCB3aWxsIGJlIHNldCB0byB0aGUgdmFsdWUgc3RhcnQtaW5kZXguIiwKKyAgICAgICAgICAwLCBJTlRfTUFYLCBERUZBVUxUX0lOREVYLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NUT1BfSU5ERVgsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgic3RvcC1pbmRleCIsICJTdG9wIEluZGV4IiwKKyAgICAgICAgICAiU3RvcCB2YWx1ZSBvZiBpbmRleC4gIFRoZSBzcGVjaWFsIHZhbHVlIC0xIG1lYW5zIG5vIHN0b3AuIiwKKyAgICAgICAgICAtMSwgSU5UX01BWCwgREVGQVVMVF9JTkRFWCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DQVBTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgiY2FwcyIsICJDYXBzIiwKKyAgICAgICAgICAiQ2FwcyBkZXNjcmliaW5nIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEuIiwKKyAgICAgICAgICBHU1RfVFlQRV9DQVBTLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9MT09QLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJsb29wIiwgIkxvb3AiLAorICAgICAgICAgICJXaGV0aGVyIHRvIHJlcGVhdCBmcm9tIHRoZSBiZWdpbm5pbmcgd2hlbiBhbGwgZmlsZXMgaGF2ZSBiZWVuIHJlYWQuIiwKKyAgICAgICAgICBGQUxTRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF9tdWx0aV9maWxlX3NyY19kaXNwb3NlOworCisgIGdzdGJhc2VzcmNfY2xhc3MtPmdldF9jYXBzID0gZ3N0X211bHRpX2ZpbGVfc3JjX2dldGNhcHM7CisgIGdzdGJhc2VzcmNfY2xhc3MtPnF1ZXJ5ID0gZ3N0X211bHRpX2ZpbGVfc3JjX3F1ZXJ5OworICBnc3RiYXNlc3JjX2NsYXNzLT5pc19zZWVrYWJsZSA9IGlzX3NlZWthYmxlOworICBnc3RiYXNlc3JjX2NsYXNzLT5kb19zZWVrID0gZG9fc2VlazsKKworICBnc3RwdXNoc3JjX2NsYXNzLT5jcmVhdGUgPSBnc3RfbXVsdGlfZmlsZV9zcmNfY3JlYXRlOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfbXVsdGlfZmlsZV9zcmNfZGVidWcsICJtdWx0aWZpbGVzcmMiLCAwLAorICAgICAgIm11bHRpZmlsZXNyYyBlbGVtZW50Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X211bHRpX2ZpbGVfc3JjX3BhZF90ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJNdWx0aS1GaWxlIFNvdXJjZSIsCisgICAgICAiU291cmNlL0ZpbGUiLCAiUmVhZCBhIHNlcXVlbnRpYWxseSBuYW1lZCBzZXQgb2YgZmlsZXMgaW50byBidWZmZXJzIiwKKyAgICAgICJEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aV9maWxlX3NyY19pbml0IChHc3RNdWx0aUZpbGVTcmMgKiBtdWx0aWZpbGVzcmMpCit7CisgIG11bHRpZmlsZXNyYy0+c3RhcnRfaW5kZXggPSBERUZBVUxUX0lOREVYOworICBtdWx0aWZpbGVzcmMtPmluZGV4ID0gREVGQVVMVF9JTkRFWDsKKyAgbXVsdGlmaWxlc3JjLT5zdG9wX2luZGV4ID0gLTE7CisgIG11bHRpZmlsZXNyYy0+ZmlsZW5hbWUgPSBnX3N0cmR1cCAoREVGQVVMVF9MT0NBVElPTik7CisgIG11bHRpZmlsZXNyYy0+c3VjY2Vzc2Z1bF9yZWFkID0gRkFMU0U7CisgIG11bHRpZmlsZXNyYy0+ZnBzX24gPSBtdWx0aWZpbGVzcmMtPmZwc19kID0gLTE7CisKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aV9maWxlX3NyY19kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RNdWx0aUZpbGVTcmMgKnNyYyA9IEdTVF9NVUxUSV9GSUxFX1NSQyAob2JqZWN0KTsKKworICBnX2ZyZWUgKHNyYy0+ZmlsZW5hbWUpOworICBzcmMtPmZpbGVuYW1lID0gTlVMTDsKKyAgaWYgKHNyYy0+Y2FwcykKKyAgICBnc3RfY2Fwc191bnJlZiAoc3JjLT5jYXBzKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X211bHRpX2ZpbGVfc3JjX2dldGNhcHMgKEdzdEJhc2VTcmMgKiBzcmMsIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdE11bHRpRmlsZVNyYyAqbXVsdGlfZmlsZV9zcmMgPSBHU1RfTVVMVElfRklMRV9TUkMgKHNyYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicmV0dXJuaW5nICUiIEdTVF9QVFJfRk9STUFULCBtdWx0aV9maWxlX3NyYy0+Y2Fwcyk7CisKKyAgaWYgKG11bHRpX2ZpbGVfc3JjLT5jYXBzKSB7CisgICAgaWYgKGZpbHRlcikKKyAgICAgIHJldHVybiBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCBtdWx0aV9maWxlX3NyYy0+Y2FwcywKKyAgICAgICAgICBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBnc3RfY2Fwc19yZWYgKG11bHRpX2ZpbGVfc3JjLT5jYXBzKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZmlsdGVyKQorICAgICAgcmV0dXJuIGdzdF9jYXBzX3JlZiAoZmlsdGVyKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gZ3N0X2NhcHNfbmV3X2FueSAoKTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWx0aV9maWxlX3NyY19xdWVyeSAoR3N0QmFzZVNyYyAqIHNyYywgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RNdWx0aUZpbGVTcmMgKm1mc3JjOworCisgIG1mc3JjID0gR1NUX01VTFRJX0ZJTEVfU1JDIChzcmMpOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX1BPU0lUSU9OOgorICAgIHsKKyAgICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9wb3NpdGlvbiAocXVlcnksICZmb3JtYXQsIE5VTEwpOworICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0JVRkZFUlM6CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICAgIGdzdF9xdWVyeV9zZXRfcG9zaXRpb24gKHF1ZXJ5LCBmb3JtYXQsCisgICAgICAgICAgICAgIG1mc3JjLT5pbmRleCAtIG1mc3JjLT5zdGFydF9pbmRleCk7CisgICAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXMgPSBHU1RfQkFTRV9TUkNfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnF1ZXJ5IChzcmMsIHF1ZXJ5KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gR1NUX0JBU0VfU1JDX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5xdWVyeSAoc3JjLCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWx0aV9maWxlX3NyY19zZXRfbG9jYXRpb24gKEdzdE11bHRpRmlsZVNyYyAqIHNyYywgY29uc3QgZ2NoYXIgKiBsb2NhdGlvbikKK3sKKyAgZ19mcmVlIChzcmMtPmZpbGVuYW1lKTsKKyAgaWYgKGxvY2F0aW9uICE9IE5VTEwpIHsKKyAgICBzcmMtPmZpbGVuYW1lID0gZ19zdHJkdXAgKGxvY2F0aW9uKTsKKyAgfSBlbHNlIHsKKyAgICBzcmMtPmZpbGVuYW1lID0gTlVMTDsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X211bHRpX2ZpbGVfc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RNdWx0aUZpbGVTcmMgKnNyYyA9IEdTVF9NVUxUSV9GSUxFX1NSQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTE9DQVRJT046CisgICAgICBnc3RfbXVsdGlfZmlsZV9zcmNfc2V0X2xvY2F0aW9uIChzcmMsIGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JTkRFWDoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3JjKTsKKyAgICAgIC8qIGluZGV4IHdhcyByZWFsbHkgbWVhbnQgdG8gYmUgcmVhZC1vbmx5LCBidXQgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5CisgICAgICAgKiB3ZSBzZXQgc3RhcnRfaW5kZXggdG8gbWFrZSBpdCB3b3JrIGFzIGl0IHVzZWQgdG8gKi8KKyAgICAgIGlmICghR1NUX09CSkVDVF9GTEFHX0lTX1NFVCAoc3JjLCBHU1RfQkFTRV9TUkNfRkxBR19TVEFSVEVEKSkKKyAgICAgICAgc3JjLT5zdGFydF9pbmRleCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgZWxzZQorICAgICAgICBzcmMtPmluZGV4ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc3JjKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVEFSVF9JTkRFWDoKKyAgICAgIHNyYy0+c3RhcnRfaW5kZXggPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVE9QX0lOREVYOgorICAgICAgc3JjLT5zdG9wX2luZGV4ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0FQUzoKKyAgICB7CisgICAgICBHc3RTdHJ1Y3R1cmUgKnN0ID0gTlVMTDsKKyAgICAgIGNvbnN0IEdzdENhcHMgKmNhcHMgPSBnc3RfdmFsdWVfZ2V0X2NhcHMgKHZhbHVlKTsKKyAgICAgIEdzdENhcHMgKm5ld19jYXBzOworCisgICAgICBpZiAoY2FwcyA9PSBOVUxMKSB7CisgICAgICAgIG5ld19jYXBzID0gZ3N0X2NhcHNfbmV3X2FueSAoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5ld19jYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgICAgICB9CisgICAgICBnc3RfY2Fwc19yZXBsYWNlICgmc3JjLT5jYXBzLCBuZXdfY2Fwcyk7CisgICAgICBnc3RfcGFkX3NldF9jYXBzIChHU1RfQkFTRV9TUkNfUEFEIChzcmMpLCBuZXdfY2Fwcyk7CisKKyAgICAgIGlmIChuZXdfY2FwcyAmJiBnc3RfY2Fwc19nZXRfc2l6ZSAobmV3X2NhcHMpID09IDEgJiYKKyAgICAgICAgICAoc3QgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChuZXdfY2FwcywgMCkpCisgICAgICAgICAgJiYgZ3N0X3N0cnVjdHVyZV9nZXRfZnJhY3Rpb24gKHN0LCAiZnJhbWVyYXRlIiwgJnNyYy0+ZnBzX24sCisgICAgICAgICAgICAgICZzcmMtPmZwc19kKSkgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHNyYywgIlNldGluZyBmcmFtZXJhdGUgdG8gJWQvJWQiLCBzcmMtPmZwc19uLAorICAgICAgICAgICAgc3JjLT5mcHNfZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcmMtPmZwc19uID0gLTE7CisgICAgICAgIHNyYy0+ZnBzX2QgPSAtMTsKKyAgICAgIH0KKyAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTE9PUDoKKyAgICAgIHNyYy0+bG9vcCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aV9maWxlX3NyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0TXVsdGlGaWxlU3JjICpzcmMgPSBHU1RfTVVMVElfRklMRV9TUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xPQ0FUSU9OOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc3JjLT5maWxlbmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSU5ERVg6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBzcmMtPmluZGV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVEFSVF9JTkRFWDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHNyYy0+c3RhcnRfaW5kZXgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NUT1BfSU5ERVg6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBzcmMtPnN0b3BfaW5kZXgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NBUFM6CisgICAgICBnc3RfdmFsdWVfc2V0X2NhcHMgKHZhbHVlLCBzcmMtPmNhcHMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0xPT1A6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgc3JjLT5sb29wKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdjaGFyICoKK2dzdF9tdWx0aV9maWxlX3NyY19nZXRfZmlsZW5hbWUgKEdzdE11bHRpRmlsZVNyYyAqIG11bHRpZmlsZXNyYykKK3sKKyAgZ2NoYXIgKmZpbGVuYW1lOworCisgIEdTVF9ERUJVRyAoIiVkIiwgbXVsdGlmaWxlc3JjLT5pbmRleCk7CisgIGZpbGVuYW1lID0gZ19zdHJkdXBfcHJpbnRmIChtdWx0aWZpbGVzcmMtPmZpbGVuYW1lLCBtdWx0aWZpbGVzcmMtPmluZGV4KTsKKworICByZXR1cm4gZmlsZW5hbWU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbXVsdGlfZmlsZV9zcmNfY3JlYXRlIChHc3RQdXNoU3JjICogc3JjLCBHc3RCdWZmZXIgKiogYnVmZmVyKQoreworICBHc3RNdWx0aUZpbGVTcmMgKm11bHRpZmlsZXNyYzsKKyAgZ3NpemUgc2l6ZTsKKyAgZ2NoYXIgKmRhdGE7CisgIGdjaGFyICpmaWxlbmFtZTsKKyAgR3N0QnVmZmVyICpidWY7CisgIGdib29sZWFuIHJldDsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisKKyAgbXVsdGlmaWxlc3JjID0gR1NUX01VTFRJX0ZJTEVfU1JDIChzcmMpOworCisgIGlmIChtdWx0aWZpbGVzcmMtPmluZGV4IDwgbXVsdGlmaWxlc3JjLT5zdGFydF9pbmRleCkgeworICAgIG11bHRpZmlsZXNyYy0+aW5kZXggPSBtdWx0aWZpbGVzcmMtPnN0YXJ0X2luZGV4OworICB9CisKKyAgaWYgKG11bHRpZmlsZXNyYy0+c3RvcF9pbmRleCAhPSAtMSAmJgorICAgICAgbXVsdGlmaWxlc3JjLT5pbmRleCA+IG11bHRpZmlsZXNyYy0+c3RvcF9pbmRleCkgeworICAgIGlmIChtdWx0aWZpbGVzcmMtPmxvb3ApCisgICAgICBtdWx0aWZpbGVzcmMtPmluZGV4ID0gbXVsdGlmaWxlc3JjLT5zdGFydF9pbmRleDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gR1NUX0ZMT1dfRU9TOworICB9CisKKyAgZmlsZW5hbWUgPSBnc3RfbXVsdGlfZmlsZV9zcmNfZ2V0X2ZpbGVuYW1lIChtdWx0aWZpbGVzcmMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG11bHRpZmlsZXNyYywgInJlYWRpbmcgZnJvbSBmaWxlIFwiJXNcIi4iLCBmaWxlbmFtZSk7CisKKyAgcmV0ID0gZ19maWxlX2dldF9jb250ZW50cyAoZmlsZW5hbWUsICZkYXRhLCAmc2l6ZSwgJmVycm9yKTsKKyAgaWYgKCFyZXQpIHsKKyAgICBpZiAobXVsdGlmaWxlc3JjLT5zdWNjZXNzZnVsX3JlYWQpIHsKKyAgICAgIC8qIElmIHdlJ3ZlIHJlYWQgYXQgbGVhc3Qgb25lIGJ1ZmZlciBzdWNjZXNzZnVsbHksIG5vdCBmaW5kaW5nIHRoZQorICAgICAgICogbmV4dCBmaWxlIGlzIEVPUy4gKi8KKyAgICAgIGdfZnJlZSAoZmlsZW5hbWUpOworICAgICAgaWYgKGVycm9yICE9IE5VTEwpCisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworCisgICAgICBpZiAobXVsdGlmaWxlc3JjLT5sb29wKSB7CisgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgICAgbXVsdGlmaWxlc3JjLT5pbmRleCA9IG11bHRpZmlsZXNyYy0+c3RhcnRfaW5kZXg7CisKKyAgICAgICAgZmlsZW5hbWUgPSBnc3RfbXVsdGlfZmlsZV9zcmNfZ2V0X2ZpbGVuYW1lIChtdWx0aWZpbGVzcmMpOworICAgICAgICByZXQgPSBnX2ZpbGVfZ2V0X2NvbnRlbnRzIChmaWxlbmFtZSwgJmRhdGEsICZzaXplLCAmZXJyb3IpOworICAgICAgICBpZiAoIXJldCkgeworICAgICAgICAgIGdfZnJlZSAoZmlsZW5hbWUpOworICAgICAgICAgIGlmIChlcnJvciAhPSBOVUxMKQorICAgICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisKKyAgICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRU9TOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRU9TOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBnb3RvIGhhbmRsZV9lcnJvcjsKKyAgICB9CisgIH0KKworICBtdWx0aWZpbGVzcmMtPnN1Y2Nlc3NmdWxfcmVhZCA9IFRSVUU7CisgIG11bHRpZmlsZXNyYy0+aW5kZXgrKzsKKworICBidWYgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgZ3N0X2J1ZmZlcl9hcHBlbmRfbWVtb3J5IChidWYsCisgICAgICBnc3RfbWVtb3J5X25ld193cmFwcGVkICgwLCBkYXRhLCBzaXplLCAwLCBzaXplLCBkYXRhLCBnX2ZyZWUpKTsKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikgPSBtdWx0aWZpbGVzcmMtPm9mZnNldDsKKyAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWYpID0gbXVsdGlmaWxlc3JjLT5vZmZzZXQgKyBzaXplOworICBtdWx0aWZpbGVzcmMtPm9mZnNldCArPSBzaXplOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG11bHRpZmlsZXNyYywgInJlYWQgZmlsZSBcIiVzXCIuIiwgZmlsZW5hbWUpOworCisgIGdfZnJlZSAoZmlsZW5hbWUpOworICAqYnVmZmVyID0gYnVmOworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKK2hhbmRsZV9lcnJvcjoKKyAgeworICAgIGlmIChlcnJvciAhPSBOVUxMKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAobXVsdGlmaWxlc3JjLCBSRVNPVVJDRSwgUkVBRCwKKyAgICAgICAgICAoIkVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSBmaWxlIFwiJXNcIi4iLCBmaWxlbmFtZSksCisgICAgICAgICAgKCIlcyIsIGVycm9yLT5tZXNzYWdlKSk7CisgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKG11bHRpZmlsZXNyYywgUkVTT1VSQ0UsIFJFQUQsCisgICAgICAgICAgKCJFcnJvciB3aGlsZSByZWFkaW5nIGZyb20gZmlsZSBcIiVzXCIuIiwgZmlsZW5hbWUpLAorICAgICAgICAgICgiJXMiLCBnX3N0cmVycm9yIChlcnJubykpKTsKKyAgICB9CisgICAgZ19mcmVlIChmaWxlbmFtZSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyBHc3RVUklUeXBlCitnc3RfbXVsdGlfZmlsZV9zcmNfdXJpX2dldF90eXBlIChHVHlwZSB0eXBlKQoreworICByZXR1cm4gR1NUX1VSSV9TUkM7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqY29uc3QgKgorZ3N0X211bHRpX2ZpbGVfc3JjX3VyaV9nZXRfcHJvdG9jb2xzIChHVHlwZSB0eXBlKQoreworICBzdGF0aWMgY29uc3QgZ2NoYXIgKnByb3RvY29sc1tdID0geyAibXVsdGlmaWxlIiwgTlVMTCB9OworCisgIHJldHVybiAoY29uc3QgZ2NoYXIgKiBjb25zdCAqKSBwcm90b2NvbHM7Cit9CisKK3N0YXRpYyBnY2hhciAqCitnc3RfbXVsdGlfZmlsZV9zcmNfdXJpX2dldF91cmkgKEdzdFVSSUhhbmRsZXIgKiBoYW5kbGVyKQoreworICBHc3RNdWx0aUZpbGVTcmMgKnNyYyA9IEdTVF9NVUxUSV9GSUxFX1NSQyAoaGFuZGxlcik7CisgIGdjaGFyICpyZXQ7CisKKyAgR1NUX09CSkVDVF9MT0NLIChzcmMpOworICBpZiAoc3JjLT5maWxlbmFtZSAhPSBOVUxMKSB7CisgICAgR3N0VXJpICp1cmkgPSBnc3RfdXJpX25ldyAoIm11bHRpZmxlIiwgTlVMTCwgTlVMTCwgR1NUX1VSSV9OT19QT1JULAorICAgICAgICBzcmMtPmZpbGVuYW1lLCBOVUxMLCBOVUxMKTsKKworICAgIHJldCA9IGdzdF91cmlfdG9fc3RyaW5nICh1cmkpOworICAgIGdzdF91cmlfdW5yZWYgKHVyaSk7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gTlVMTDsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoc3JjKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWx0aV9maWxlX3NyY191cmlfc2V0X3VyaSAoR3N0VVJJSGFuZGxlciAqIGhhbmRsZXIsIGNvbnN0IGdjaGFyICogdXJpLAorICAgIEdFcnJvciAqKiBlcnJvcikKK3sKKyAgR3N0TXVsdGlGaWxlU3JjICpzcmMgPSBHU1RfTVVMVElfRklMRV9TUkMgKGhhbmRsZXIpOworICBHc3RVcmkgKmdzdHVyaTsKKyAgZ2NoYXIgKnBhdGg7CisKKyAgZ3N0dXJpID0gZ3N0X3VyaV9mcm9tX3N0cmluZyAodXJpKTsKKyAgaWYgKGdzdHVyaSA9PSBOVUxMKQorICAgIGdvdG8gaW52YWxpZF91cmk7CisKKyAgLyogVGhpcyBzaG91bGQgZ2V0IHVzIHRoZSB1bmVzY2FwZWQgcGF0aCAqLworICBwYXRoID0gZ3N0X3VyaV9nZXRfcGF0aCAoZ3N0dXJpKTsKKyAgaWYgKHBhdGggPT0gTlVMTCkKKyAgICBnb3RvIGludmFsaWRfdXJpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoc3JjKTsKKyAgZ3N0X211bHRpX2ZpbGVfc3JjX3NldF9sb2NhdGlvbiAoc3JjLCBwYXRoKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7CisKKyAgZ19mcmVlIChwYXRoKTsKKyAgZ3N0X3VyaV91bnJlZiAoZ3N0dXJpKTsKKworICByZXR1cm4gVFJVRTsKKworLyogRVJST1JTICovCitpbnZhbGlkX3VyaToKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiSW52YWxpZCBtdWx0aWZpbGUgVVJJICclcyciLCB1cmkpOworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgR1NUX1VSSV9FUlJPUiwgR1NUX1VSSV9FUlJPUl9CQURfVVJJLAorICAgICAgICAiSW52YWxpZCBtdWx0aWZpbGUgVVJJIik7CisgICAgaWYgKGdzdHVyaSkKKyAgICAgIGdzdF91cmlfdW5yZWYgKGdzdHVyaSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGlfZmlsZV9zcmNfdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwgZ3BvaW50ZXIgaWZhY2VfZGF0YSkKK3sKKyAgR3N0VVJJSGFuZGxlckludGVyZmFjZSAqaWZhY2UgPSAoR3N0VVJJSGFuZGxlckludGVyZmFjZSAqKSBnX2lmYWNlOworCisgIGlmYWNlLT5nZXRfdHlwZSA9IGdzdF9tdWx0aV9maWxlX3NyY191cmlfZ2V0X3R5cGU7CisgIGlmYWNlLT5nZXRfcHJvdG9jb2xzID0gZ3N0X211bHRpX2ZpbGVfc3JjX3VyaV9nZXRfcHJvdG9jb2xzOworICBpZmFjZS0+Z2V0X3VyaSA9IGdzdF9tdWx0aV9maWxlX3NyY191cmlfZ2V0X3VyaTsKKyAgaWZhY2UtPnNldF91cmkgPSBnc3RfbXVsdGlfZmlsZV9zcmNfdXJpX3NldF91cmk7Cit9CmRpZmYgLS1naXQgYS9nc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5oIGIvZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWI5NzMwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuaApAQCAtMCwwICsxLDcyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBnc3RtdWx0aWZpbGVzcmMuYzoKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX01VTFRJRklMRVNSQ19IX18KKyNkZWZpbmUgX19HU1RfTVVMVElGSUxFU1JDX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdHB1c2hzcmMuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX01VTFRJX0ZJTEVfU1JDIFwKKyAgKGdzdF9tdWx0aV9maWxlX3NyY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfTVVMVElfRklMRV9TUkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9NVUxUSV9GSUxFX1NSQyxHc3RNdWx0aUZpbGVTcmMpKQorI2RlZmluZSBHU1RfTVVMVElfRklMRV9TUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfTVVMVElfRklMRV9TUkMsR3N0TXVsdGlGaWxlU3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfTVVMVElfRklMRV9TUkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9NVUxUSV9GSUxFX1NSQykpCisjZGVmaW5lIEdTVF9JU19NVUxUSV9GSUxFX1NSQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9NVUxUSV9GSUxFX1NSQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RNdWx0aUZpbGVTcmMgR3N0TXVsdGlGaWxlU3JjOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE11bHRpRmlsZVNyY0NsYXNzIEdzdE11bHRpRmlsZVNyY0NsYXNzOworCitzdHJ1Y3QgX0dzdE11bHRpRmlsZVNyYworeworICBHc3RQdXNoU3JjIHBhcmVudDsKKworICBnY2hhciAqZmlsZW5hbWU7CisgIGludCBzdGFydF9pbmRleDsKKyAgaW50IHN0b3BfaW5kZXg7CisgIGludCBpbmRleDsKKworICBpbnQgb2Zmc2V0OworCisgIGdib29sZWFuIGxvb3A7CisKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Jvb2xlYW4gc3VjY2Vzc2Z1bF9yZWFkOworCisgIGdpbnQgZnBzX24sIGZwc19kOworfTsKKworc3RydWN0IF9Hc3RNdWx0aUZpbGVTcmNDbGFzcworeworICBHc3RQdXNoU3JjQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X211bHRpX2ZpbGVfc3JjX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX01VTFRJRklMRVNSQ19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRmaWxlc3JjLmMgYi9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0ZmlsZXNyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMmQwZjgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0ZmlsZXNyYy5jCkBAIC0wLDAgKzEsNTk4IEBACisvKiBHU3RyZWFtZXIgU3BsaXQgRmlsZSBTb3VyY2UKKyAqIENvcHlyaWdodCAoQykgMjAxMSBDb2xsYWJvcmEgTHRkLiA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LXNwbGl0ZmlsZXNyYworICogQHNlZV9hbHNvOiAjR3N0RmlsZVNyYywgI0dzdE11bHRpRmlsZVNyYworICoKKyAqIFJlYWRzIGRhdGEgZnJvbSBtdWx0aXBsZSBmaWxlcywgcHJlc2VudGluZyB0aG9zZSBmaWxlcyBhcyBvbmUgY29udGludW91cworICogZmlsZSB0byBkb3duc3RyZWFtIGVsZW1lbnRzLiBUaGlzIGlzIHVzZWZ1bCBmb3IgcmVhZGluZyBhIGxhcmdlIGZpbGUgdGhhdAorICogaGFkIHRvIGJlIHNwbGl0IGludG8gbXVsdGlwbGUgcGFydHMgZHVlIHRvIGZpbGVzeXN0ZW0gZmlsZSBzaXplIGxpbWl0YXRpb25zLAorICogZm9yIGV4YW1wbGUuCisgKgorICogVGhlIGZpbGVzIHRvIHNlbGVjdCBhcmUgY2hvc2VuIHZpYSB0aGUgbG9jYXRpb24gcHJvcGVydHksIHdoaWNoIHN1cHBvcnRzCisgKiAoYW5kIGV4cGVjdHMpIHNoZWxsLXN0eWxlIHdpbGRjYXJkcyAoYnV0IG9ubHkgZm9yIHRoZSBmaWxlbmFtZSwgbm90IGZvcgorICogZGlyZWN0b3JpZXMpLiBUaGUgcmVzdWx0cyB3aWxsIGJlIHNvcnRlZC4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHNwbGl0ZmlsZXNyYyBsb2NhdGlvbj0iL3BhdGgvdG8vcGFydC0qLm1wZyIgISBkZWNvZGViaW4gISAuLi4KKyAqIF18IFBsYXlzIHRoZSBkaWZmZXJlbnQgcGFydHMgYXMgaWYgdGhleSB3ZXJlIG9uZSBzaW5nbGUgTVBFRyBmaWxlLgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHBsYXliaW4gdXJpPSJzcGxpdGZpbGU6Ly9wYXRoL3RvL2Zvby5hdmkuKiIKKyAqIF18IFBsYXlzIHRoZSBkaWZmZXJlbnQgcGFydHMgYXMgaWYgdGhleSB3ZXJlIG9uZSBzaW5nbGUgQVZJIGZpbGUuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0c3BsaXRmaWxlc3JjLmgiCisjaW5jbHVkZSAiZ3N0c3BsaXR1dGlscy5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2VudW0KK3sKKyAgUFJPUF9MT0NBVElPTiA9IDEKK307CisKKyNkZWZpbmUgREVGQVVMVF9MT0NBVElPTiBOVUxMCisKK3N0YXRpYyB2b2lkIGdzdF9zcGxpdF9maWxlX3NyY191cmlfaGFuZGxlcl9pbml0IChncG9pbnRlciBnX2lmYWNlLAorICAgIGdwb2ludGVyIGlmYWNlX2RhdGEpOworc3RhdGljIHZvaWQgZ3N0X3NwbGl0X2ZpbGVfc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9zcGxpdF9maWxlX3NyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3Rfc3BsaXRfZmlsZV9zcmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmopOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NwbGl0X2ZpbGVfc3JjX3N0YXJ0IChHc3RCYXNlU3JjICogYmFzZXNyYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NwbGl0X2ZpbGVfc3JjX3N0b3AgKEdzdEJhc2VTcmMgKiBiYXNlc3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc3BsaXRfZmlsZV9zcmNfY2FuX3NlZWsgKEdzdEJhc2VTcmMgKiBiYXNlc3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc3BsaXRfZmlsZV9zcmNfZ2V0X3NpemUgKEdzdEJhc2VTcmMgKiBiYXNlc3JjLCBndWludDY0ICogcyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NwbGl0X2ZpbGVfc3JjX3VubG9jayAoR3N0QmFzZVNyYyAqIGJhc2VzcmMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3NwbGl0X2ZpbGVfc3JjX2NyZWF0ZSAoR3N0QmFzZVNyYyAqIGJhc2VzcmMsCisgICAgZ3VpbnQ2NCBvZmZzZXQsIGd1aW50IHNpemUsIEdzdEJ1ZmZlciAqKiBidWZmZXIpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3NwbGl0X2ZpbGVfc3JjX3BhZF90ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHNwbGl0ZmlsZXNyY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBzcGxpdGZpbGVzcmNfZGVidWcKKworCitHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoR3N0U3BsaXRGaWxlU3JjLCBnc3Rfc3BsaXRfZmlsZV9zcmMsIEdTVF9UWVBFX0JBU0VfU1JDLAorICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfVVJJX0hBTkRMRVIsCisgICAgICAgIGdzdF9zcGxpdF9maWxlX3NyY191cmlfaGFuZGxlcl9pbml0KSk7CisKKyNpZmRlZiBHX09TX1dJTjMyCisjZGVmaW5lIFdJTjMyX0JMVVJCICIgTG9jYXRpb24gc3RyaW5nIG11c3QgYmUgaW4gVVRGLTggZW5jb2RpbmcgKG9uIFdpbmRvd3MpLiIKKyNlbHNlCisjZGVmaW5lIFdJTjMyX0JMVVJCICAgICAgICAgICAgIC8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorZ3N0X3NwbGl0X2ZpbGVfc3JjX2NsYXNzX2luaXQgKEdzdFNwbGl0RmlsZVNyY0NsYXNzICoga2xhc3MpCit7CisgIEdzdEJhc2VTcmNDbGFzcyAqZ3N0YmFzZXNyY19jbGFzcyA9IEdTVF9CQVNFX1NSQ19DTEFTUyAoa2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9zcGxpdF9maWxlX3NyY19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9zcGxpdF9maWxlX3NyY19nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3NwbGl0X2ZpbGVfc3JjX2ZpbmFsaXplOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTE9DQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgibG9jYXRpb24iLCAiRmlsZSBMb2NhdGlvbiIsCisgICAgICAgICAgIldpbGRjYXJkIHBhdHRlcm4gdG8gbWF0Y2ggZmlsZSBuYW1lcyBvZiB0aGUgaW5wdXQgZmlsZXMuIElmICIKKyAgICAgICAgICAidGhlIGxvY2F0aW9uIGlzIGFuIGFic29sdXRlIHBhdGggb3IgY29udGFpbnMgZGlyZWN0b3J5IGNvbXBvbmVudHMsICIKKyAgICAgICAgICAib25seSB0aGUgYmFzZSBmaWxlIG5hbWUgcGFydCB3aWxsIGJlIGNvbnNpZGVyZWQgZm9yIHBhdHRlcm4gIgorICAgICAgICAgICJtYXRjaGluZy4gVGhlIHJlc3VsdHMgd2lsbCBiZSBzb3J0ZWQuIiBXSU4zMl9CTFVSQiwKKyAgICAgICAgICBERUZBVUxUX0xPQ0FUSU9OLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RiYXNlc3JjX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3BsaXRfZmlsZV9zcmNfc3RhcnQpOworICBnc3RiYXNlc3JjX2NsYXNzLT5zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zcGxpdF9maWxlX3NyY19zdG9wKTsKKyAgZ3N0YmFzZXNyY19jbGFzcy0+Y3JlYXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zcGxpdF9maWxlX3NyY19jcmVhdGUpOworICBnc3RiYXNlc3JjX2NsYXNzLT5nZXRfc2l6ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3BsaXRfZmlsZV9zcmNfZ2V0X3NpemUpOworICBnc3RiYXNlc3JjX2NsYXNzLT51bmxvY2sgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NwbGl0X2ZpbGVfc3JjX3VubG9jayk7CisgIGdzdGJhc2VzcmNfY2xhc3MtPmlzX3NlZWthYmxlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3BsaXRfZmlsZV9zcmNfY2FuX3NlZWspOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChzcGxpdGZpbGVzcmNfZGVidWcsICJzcGxpdGZpbGVzcmMiLCAwLAorICAgICAgInNwbGl0ZmlsZXNyYyBlbGVtZW50Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3NwbGl0X2ZpbGVfc3JjX3BhZF90ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlNwbGl0LUZpbGUgU291cmNlIiwKKyAgICAgICJTb3VyY2UvRmlsZSIsCisgICAgICAiUmVhZCBhIHNlcXVlbnRpYWxseSBuYW1lZCBzZXQgb2YgZmlsZXMgYXMgaWYgaXQgd2FzIG9uZSBsYXJnZSBmaWxlIiwKKyAgICAgICJUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGxpdF9maWxlX3NyY19pbml0IChHc3RTcGxpdEZpbGVTcmMgKiBzcGxpdGZpbGVzcmMpCit7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRfZmlsZV9zcmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmopCit7CisgIEdzdFNwbGl0RmlsZVNyYyAqc3JjID0gR1NUX1NQTElUX0ZJTEVfU1JDIChvYmopOworCisgIGdfZnJlZSAoc3JjLT5sb2NhdGlvbik7CisgIHNyYy0+bG9jYXRpb24gPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChnc3Rfc3BsaXRfZmlsZV9zcmNfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iaik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NwbGl0X2ZpbGVfc3JjX2Nhbl9zZWVrIChHc3RCYXNlU3JjICogYmFzZXNyYykKK3sKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NwbGl0X2ZpbGVfc3JjX3VubG9jayAoR3N0QmFzZVNyYyAqIGJhc2VzcmMpCit7CisgIC8qIFRoaXMgaXMgbm90IGFjdHVhbGx5IHRoYXQgdXNlZnVsLCBzaW5jZSBhbGwgbm9ybWFsIGZpbGUKKyAgICogb3BlcmF0aW9ucyBhcmUgZnVsbHkgYmxvY2tpbmcgYW55d2F5ICovCisjaWYgMAorICBHc3RTcGxpdEZpbGVTcmMgKnNyYyA9IEdTVF9TUExJVF9GSUxFX1NSQyAoYmFzZXNyYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY2FuY2VsbGluZyBwZW5kaW5nIEkvTyBvcGVyYXRpb24gaWYgdGhlcmUgaXMgb25lIik7CisgIC8qIGdfY2FuY2VsbGFibGVfY2FuY2VsIChzcmMtPmNhbmNlbGxhYmxlKTsgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZG9uZSIpOworI2VuZGlmCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NwbGl0X2ZpbGVfc3JjX2dldF9zaXplIChHc3RCYXNlU3JjICogYmFzZXNyYywgZ3VpbnQ2NCAqIHNpemUpCit7CisgIEdzdFNwbGl0RmlsZVNyYyAqc3JjID0gR1NUX1NQTElUX0ZJTEVfU1JDIChiYXNlc3JjKTsKKworICAqc2l6ZSA9IHNyYy0+cGFydHNbc3JjLT5udW1fcGFydHMgLSAxXS5zdG9wICsgMTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRfZmlsZV9zcmNfc2V0X2xvY2F0aW9uIChHc3RTcGxpdEZpbGVTcmMgKiBzcmMsIGNvbnN0IGNoYXIgKmxvY2F0aW9uKQoreworICBHU1RfT0JKRUNUX0xPQ0sgKHNyYyk7CisgIGdfZnJlZSAoc3JjLT5sb2NhdGlvbik7CisKKyAgaWYgKGxvY2F0aW9uICE9IE5VTEwgJiYgZ19zdHJfaGFzX3ByZWZpeCAobG9jYXRpb24sICJzcGxpdGZpbGU6Ly8iKSkKKyAgICBzcmMtPmxvY2F0aW9uID0gZ3N0X3VyaV9nZXRfbG9jYXRpb24gKGxvY2F0aW9uKTsKKyAgZWxzZQorICAgIHNyYy0+bG9jYXRpb24gPSBnX3N0cmR1cCAobG9jYXRpb24pOworI2lmZGVmIEdfT1NfV0lOMzIKKyAgaWYgKCFnX3V0ZjhfdmFsaWRhdGUgKHNyYy0+bG9jYXRpb24sIC0xLCBOVUxMKSkgeworICAgIGdfd2FybmluZyAoInNwbGl0ZmlsZXNyYyAnbG9jYXRpb24nIHByb3BlcnR5IG11c3QgYmUgaW4gVVRGLTggIgorICAgICAgICAiZW5jb2Rpbmcgb24gV2luZG93cyIpOworICB9CisjZW5kaWYKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRfZmlsZV9zcmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFNwbGl0RmlsZVNyYyAqc3JjID0gR1NUX1NQTElUX0ZJTEVfU1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MT0NBVElPTjoKKyAgICAgIGdzdF9zcGxpdF9maWxlX3NyY19zZXRfbG9jYXRpb24gKHNyYywgZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwbGl0X2ZpbGVfc3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTcGxpdEZpbGVTcmMgKnNyYyA9IEdTVF9TUExJVF9GSUxFX1NSQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTE9DQVRJT046CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNyYyk7CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzcmMtPmxvY2F0aW9uKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcmMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zcGxpdF9maWxlX3NyY19zdGFydCAoR3N0QmFzZVNyYyAqIGJhc2VzcmMpCit7CisgIEdzdFNwbGl0RmlsZVNyYyAqc3JjID0gR1NUX1NQTElUX0ZJTEVfU1JDIChiYXNlc3JjKTsKKyAgR0NhbmNlbGxhYmxlICpjYW5jZWw7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworICBndWludDY0IG9mZnNldDsKKyAgR0Vycm9yICplcnIgPSBOVUxMOworICBnY2hhciAqYmFzZW5hbWUgPSBOVUxMOworICBnY2hhciAqZGlybmFtZSA9IE5VTEw7CisgIGdjaGFyICoqZmlsZXM7CisgIGd1aW50IGk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChzcmMpOworICBpZiAoc3JjLT5sb2NhdGlvbiAhPSBOVUxMICYmIHNyYy0+bG9jYXRpb25bMF0gIT0gJ1wwJykgeworICAgIGJhc2VuYW1lID0gZ19wYXRoX2dldF9iYXNlbmFtZSAoc3JjLT5sb2NhdGlvbik7CisgICAgZGlybmFtZSA9IGdfcGF0aF9nZXRfZGlybmFtZSAoc3JjLT5sb2NhdGlvbik7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7CisKKyAgZmlsZXMgPSBnc3Rfc3BsaXRfdXRpbF9maW5kX2ZpbGVzIChkaXJuYW1lLCBiYXNlbmFtZSwgJmVycik7CisKKyAgaWYgKGZpbGVzID09IE5VTEwgfHwgKmZpbGVzID09IE5VTEwpCisgICAgZ290byBub19maWxlczsKKworICBzcmMtPm51bV9wYXJ0cyA9IGdfc3Rydl9sZW5ndGggKGZpbGVzKTsKKyAgc3JjLT5wYXJ0cyA9IGdfbmV3MCAoR3N0RmlsZVBhcnQsIHNyYy0+bnVtX3BhcnRzKTsKKworICBjYW5jZWwgPSBzcmMtPmNhbmNlbGxhYmxlOworCisgIG9mZnNldCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBzcmMtPm51bV9wYXJ0czsgKytpKSB7CisgICAgR0ZpbGVJbnB1dFN0cmVhbSAqc3RyZWFtOworICAgIEdGaWxlSW5mbyAqaW5mbzsKKyAgICBnb2Zmc2V0IHNpemU7CisgICAgR0ZpbGUgKmZpbGU7CisKKyAgICBmaWxlID0gZ19maWxlX25ld19mb3JfcGF0aCAoZmlsZXNbaV0pOworICAgIHN0cmVhbSA9IGdfZmlsZV9yZWFkIChmaWxlLCBjYW5jZWwsICZlcnIpOworICAgIGdfb2JqZWN0X3VucmVmIChmaWxlKTsKKworICAgIGlmIChlcnIgIT0gTlVMTCkKKyAgICAgIGdvdG8gb3Blbl9yZWFkX2Vycm9yOworCisgICAgaW5mbyA9IGdfZmlsZV9pbnB1dF9zdHJlYW1fcXVlcnlfaW5mbyAoc3RyZWFtLCAic3RhbmRhcmQ6OioiLCBOVUxMLCAmZXJyKTsKKyAgICBpZiAoZXJyICE9IE5VTEwpIHsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChzdHJlYW0pOworICAgICAgZ290byBxdWVyeV9pbmZvX2Vycm9yOworICAgIH0KKworICAgIHNpemUgPSBnX2ZpbGVfaW5mb19nZXRfc2l6ZSAoaW5mbyk7CisgICAgZ19vYmplY3RfdW5yZWYgKGluZm8pOworCisgICAgc3JjLT5wYXJ0c1tpXS5zdHJlYW0gPSBzdHJlYW07CisgICAgc3JjLT5wYXJ0c1tpXS5wYXRoID0gZ19zdHJkdXAgKGZpbGVzW2ldKTsKKyAgICBzcmMtPnBhcnRzW2ldLnN0YXJ0ID0gb2Zmc2V0OworICAgIHNyYy0+cGFydHNbaV0uc3RvcCA9IG9mZnNldCArIHNpemUgLSAxOworCisgICAgR1NUX0RFQlVHICgiWyUwMTAiIEdfR1VJTlQ2NF9GT1JNQVQgIi0lMDEwIiBHX0dVSU5UNjRfRk9STUFUICJdICVzIiwKKyAgICAgICAgc3JjLT5wYXJ0c1tpXS5zdGFydCwgc3JjLT5wYXJ0c1tpXS5zdG9wLCBzcmMtPnBhcnRzW2ldLnBhdGgpOworCisgICAgb2Zmc2V0ICs9IHNpemU7CisgIH0KKworICBHU1RfSU5GTyAoIlN1Y2Nlc3NmdWxseSBvcGVuZWQgJXUgZmlsZSBwYXJ0cyBmb3IgcmVhZGluZyIsIHNyYy0+bnVtX3BhcnRzKTsKKworICBzcmMtPmN1cl9wYXJ0ID0gMDsKKworICBzcmMtPmNhbmNlbGxhYmxlID0gZ19jYW5jZWxsYWJsZV9uZXcgKCk7CisKKyAgcmV0ID0gVFJVRTsKKworZG9uZToKKyAgaWYgKGVyciAhPSBOVUxMKQorICAgIGdfZXJyb3JfZnJlZSAoZXJyKTsKKyAgZ19zdHJmcmVldiAoZmlsZXMpOworICBnX2ZyZWUgKGJhc2VuYW1lKTsKKyAgZ19mcmVlIChkaXJuYW1lKTsKKyAgcmV0dXJuIHJldDsKKworLyogRVJST1JTICovCitub19maWxlczoKKyAgeworICAgIGlmIChlcnItPmNvZGUgPT0gR19JT19FUlJPUl9DQU5DRUxMRUQpCisgICAgICBnb3RvIGNhbmNlbGxlZDsKKworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBPUEVOX1JFQUQsICgiJXMiLCBlcnItPm1lc3NhZ2UpLAorICAgICAgICAoIkZhaWxlZCB0byBmaW5kIGZpbGVzIGluICclcycgZm9yIHBhdHRlcm4gJyVzJyIsCisgICAgICAgICAgICBHU1RfU1RSX05VTEwgKGRpcm5hbWUpLCBHU1RfU1RSX05VTEwgKGJhc2VuYW1lKSkpOworICAgIGdvdG8gZG9uZTsKKyAgfQorb3Blbl9yZWFkX2Vycm9yOgorICB7CisgICAgaWYgKGVyci0+Y29kZSA9PSBHX0lPX0VSUk9SX0NBTkNFTExFRCkKKyAgICAgIGdvdG8gY2FuY2VsbGVkOworCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwgKCIlcyIsIGVyci0+bWVzc2FnZSksCisgICAgICAgICgiRmFpbGVkIHRvIG9wZW4gZmlsZSAnJXMnIGZvciByZWFkaW5nIiwgZmlsZXNbaV0pKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK3F1ZXJ5X2luZm9fZXJyb3I6CisgIHsKKyAgICBpZiAoZXJyLT5jb2RlID09IEdfSU9fRVJST1JfQ0FOQ0VMTEVEKQorICAgICAgZ290byBjYW5jZWxsZWQ7CisKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgT1BFTl9SRUFELCAoIiVzIiwgZXJyLT5tZXNzYWdlKSwKKyAgICAgICAgKCJGYWlsZWQgdG8gcXVlcnkgaW5mbyBmb3IgZmlsZSAnJXMnIiwgZmlsZXNbaV0pKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK2NhbmNlbGxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIkkvTyBvcGVyYXRpb24gY2FuY2VsbGVkIGZyb20gYW5vdGhlciB0aHJlYWQiKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BsaXRfZmlsZV9zcmNfc3RvcCAoR3N0QmFzZVNyYyAqIGJhc2VzcmMpCit7CisgIEdzdFNwbGl0RmlsZVNyYyAqc3JjID0gR1NUX1NQTElUX0ZJTEVfU1JDIChiYXNlc3JjKTsKKyAgZ3VpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgc3JjLT5udW1fcGFydHM7ICsraSkgeworICAgIGlmIChzcmMtPnBhcnRzW2ldLnN0cmVhbSAhPSBOVUxMKQorICAgICAgZ19vYmplY3RfdW5yZWYgKHNyYy0+cGFydHNbaV0uc3RyZWFtKTsKKyAgICBnX2ZyZWUgKHNyYy0+cGFydHNbaV0ucGF0aCk7CisgIH0KKyAgZ19mcmVlIChzcmMtPnBhcnRzKTsKKyAgc3JjLT5wYXJ0cyA9IE5VTEw7CisgIHNyYy0+bnVtX3BhcnRzID0gMDsKKworICBnX29iamVjdF91bnJlZiAoc3JjLT5jYW5jZWxsYWJsZSk7CisgIHNyYy0+Y2FuY2VsbGFibGUgPSBOVUxMOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2ludAorZ3N0X3NwbGl0X2ZpbGVfc3JjX3BhcnRfc2VhcmNoIChHc3RGaWxlUGFydCAqIHBhcnQsIGd1aW50NjQgKiBvZmZzZXQsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBpZiAoKm9mZnNldCA+IHBhcnQtPnN0b3ApCisgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgIC8qIFRoZSB0YXJnZXQgaXMgYWZ0ZXIgdGhpcyBwYXJ0ICovCisgIGVsc2UgaWYgKCpvZmZzZXQgPCBwYXJ0LT5zdGFydCkKKyAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAgICAgLyogVGhlIHRhcmdldCBpcyBiZWZvcmUgdGhpcyBwYXJ0ICovCisgIGVsc2UKKyAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgdGFyZ2V0IHBhcnQgKi8KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BsaXRfZmlsZV9zcmNfZmluZF9wYXJ0X2Zvcl9vZmZzZXQgKEdzdFNwbGl0RmlsZVNyYyAqIHNyYywgZ3VpbnQ2NCBvZmZzZXQsCisgICAgZ3VpbnQgKiBwYXJ0X251bWJlcikKK3sKKyAgZ2Jvb2xlYW4gcmVzID0gVFJVRTsKKyAgR3N0RmlsZVBhcnQgKnBhcnQ7CisKKyAgcGFydCA9CisgICAgICBnc3RfdXRpbF9hcnJheV9iaW5hcnlfc2VhcmNoIChzcmMtPnBhcnRzLCBzcmMtPm51bV9wYXJ0cywKKyAgICAgIHNpemVvZiAoR3N0RmlsZVBhcnQpLAorICAgICAgKEdDb21wYXJlRGF0YUZ1bmMpIGdzdF9zcGxpdF9maWxlX3NyY19wYXJ0X3NlYXJjaCwKKyAgICAgIEdTVF9TRUFSQ0hfTU9ERV9BRlRFUiwgJm9mZnNldCwgTlVMTCk7CisKKyAgaWYgKHBhcnQpCisgICAgKnBhcnRfbnVtYmVyID0gcGFydCAtIHNyYy0+cGFydHM7CisgIGVsc2UKKyAgICByZXMgPSBGQUxTRTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NwbGl0X2ZpbGVfc3JjX2NyZWF0ZSAoR3N0QmFzZVNyYyAqIGJhc2VzcmMsIGd1aW50NjQgb2Zmc2V0LCBndWludCBzaXplLAorICAgIEdzdEJ1ZmZlciAqKiBidWZmZXIpCit7CisgIEdzdFNwbGl0RmlsZVNyYyAqc3JjID0gR1NUX1NQTElUX0ZJTEVfU1JDIChiYXNlc3JjKTsKKyAgR3N0RmlsZVBhcnQgY3VyX3BhcnQ7CisgIEdJbnB1dFN0cmVhbSAqc3RyZWFtOworICBHQ2FuY2VsbGFibGUgKmNhbmNlbDsKKyAgR1NlZWthYmxlICpzZWVrYWJsZTsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgZ3VpbnQ2NCByZWFkX29mZnNldDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQgdG9fcmVhZDsKKworICBjdXJfcGFydCA9IHNyYy0+cGFydHNbc3JjLT5jdXJfcGFydF07CisgIGlmIChvZmZzZXQgPCBjdXJfcGFydC5zdGFydCB8fCBvZmZzZXQgPiBjdXJfcGFydC5zdG9wKSB7CisgICAgaWYgKCFnc3Rfc3BsaXRfZmlsZV9zcmNfZmluZF9wYXJ0X2Zvcl9vZmZzZXQgKHNyYywgb2Zmc2V0LCAmc3JjLT5jdXJfcGFydCkpCisgICAgICByZXR1cm4gR1NUX0ZMT1dfRU9TOworICAgIGN1cl9wYXJ0ID0gc3JjLT5wYXJ0c1tzcmMtPmN1cl9wYXJ0XTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICJjdXJyZW50IHBhcnQ6ICV1ICglIiBHX0dVSU5UNjRfRk9STUFUICIgLSAiCisgICAgICAiJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCAlcykiLCBzcmMtPmN1cl9wYXJ0LCBjdXJfcGFydC5zdGFydCwKKyAgICAgIGN1cl9wYXJ0LnN0b3AsIGN1cl9wYXJ0LnBhdGgpOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCBzaXplLCBOVUxMKTsKKworICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSA9IG9mZnNldDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworCisgIGNhbmNlbCA9IHNyYy0+Y2FuY2VsbGFibGU7CisKKyAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgZ3VpbnQ2NCBieXRlc190b19lbmRfb2ZfcGFydDsKKyAgICBnc2l6ZSByZWFkID0gMDsKKworICAgIC8qIHdlIHdhbnQgdGhlIG9mZnNldCBpbnRvIHRoZSBmaWxlIHBhcnQgKi8KKyAgICByZWFkX29mZnNldCA9IG9mZnNldCAtIGN1cl9wYXJ0LnN0YXJ0OworCisgICAgR1NUX0xPRyAoIlJlYWRpbmcgcGFydCAlMDN1IGZyb20gb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiAoJXMpIiwKKyAgICAgICAgc3JjLT5jdXJfcGFydCwgcmVhZF9vZmZzZXQsIGN1cl9wYXJ0LnBhdGgpOworCisgICAgLyogRklYTUU6IG9ubHkgc2VlayB3aGVuIG5lZWRlZCAoaG9wZWZ1bGx5IGdpbyBpcyBzbWFydCkgKi8KKyAgICBzZWVrYWJsZSA9IEdfU0VFS0FCTEUgKGN1cl9wYXJ0LnN0cmVhbSk7CisgICAgaWYgKCFnX3NlZWthYmxlX3NlZWsgKHNlZWthYmxlLCByZWFkX29mZnNldCwgR19TRUVLX1NFVCwgY2FuY2VsLCAmZXJyKSkKKyAgICAgIGdvdG8gc2Vla19mYWlsZWQ7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAibm93OiAlIiBHX0dVSU5UNjRfRk9STUFULCBnX3NlZWthYmxlX3RlbGwgKHNlZWthYmxlKSk7CisKKyAgICBieXRlc190b19lbmRfb2ZfcGFydCA9IChjdXJfcGFydC5zdG9wIC0gY3VyX3BhcnQuc3RhcnQpICsgMSAtIHJlYWRfb2Zmc2V0OworICAgIHRvX3JlYWQgPSBNSU4gKHNpemUsIGJ5dGVzX3RvX2VuZF9vZl9wYXJ0KTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICJyZWFkaW5nICV1IGJ5dGVzIGZyb20gcGFydCAldSAoYnl0ZXMgdG8gZW5kIG9mICIKKyAgICAgICAgInBhcnQ6ICV1KSIsIHRvX3JlYWQsIHNyYy0+Y3VyX3BhcnQsIChndWludCkgYnl0ZXNfdG9fZW5kX29mX3BhcnQpOworCisgICAgc3RyZWFtID0gR19JTlBVVF9TVFJFQU0gKGN1cl9wYXJ0LnN0cmVhbSk7CisKKyAgICAvKiBOQjogd2Ugd29uJ3QgdHJ5IHRvIHJlYWQgYmV5b25kIEVPRiAqLworICAgIGlmICghZ19pbnB1dF9zdHJlYW1fcmVhZF9hbGwgKHN0cmVhbSwgZGF0YSwgdG9fcmVhZCwgJnJlYWQsIGNhbmNlbCwgJmVycikpCisgICAgICBnb3RvIHJlYWRfZmFpbGVkOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgInJlYWQgJXUgYnl0ZXMiLCAoZ3VpbnQpIHJlYWQpOworCisgICAgZGF0YSArPSByZWFkOworICAgIHNpemUgLT0gcmVhZDsKKyAgICBvZmZzZXQgKz0gcmVhZDsKKworICAgIC8qIGFyZSB3ZSBkb25lPyAqLworICAgIGlmIChzaXplID09IDApCisgICAgICBicmVhazsKKworICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIldSBieXRlcyBsZWZ0IHRvIHJlYWQgZm9yIHRoaXMgY2h1bmsiLCBzaXplKTsKKworICAgIC8qIGNvcm5lciBjYXNlLCB0aGlzIHNob3VsZCBuZXZlciByZWFsbHkgaGFwcGVuIChhc3N1bWluZyBiYXNlc3JjIGNsaXBzCisgICAgICogcmVxdWVzdHMgYmV5b25kIHRoZSBmaWxlIHNpemUpICovCisgICAgaWYgKHJlYWQgPCB0b19yZWFkKSB7CisgICAgICBpZiAoc3JjLT5jdXJfcGFydCA9PSBzcmMtPm51bV9wYXJ0cyAtIDEpIHsKKyAgICAgICAgLyogbGFzdCBmaWxlIHBhcnQsIHN0b3AgcmVhZGluZyBhbmQgdHJ1bmNhdGUgYnVmZmVyICovCisgICAgICAgIGdzdF9idWZmZXJfc2V0X3NpemUgKGJ1Ziwgb2Zmc2V0IC0gR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikpOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdvdG8gZmlsZV9wYXJ0X2NoYW5nZWQ7CisgICAgICB9CisgICAgfQorCisgICAgKytzcmMtPmN1cl9wYXJ0OworICAgIGN1cl9wYXJ0ID0gc3JjLT5wYXJ0c1tzcmMtPmN1cl9wYXJ0XTsKKyAgfQorCisgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmKSA9IG9mZnNldDsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgICpidWZmZXIgPSBidWY7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICJyZWFkICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMgaW50byBidWYgJXAiLAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSwgYnVmKTsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCisvKiBFUlJPUlMgKi8KK3NlZWtfZmFpbGVkOgorICB7CisgICAgaWYgKGVyci0+Y29kZSA9PSBHX0lPX0VSUk9SX0NBTkNFTExFRCkKKyAgICAgIGdvdG8gY2FuY2VsbGVkOworCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIFNFRUssIChOVUxMKSwKKyAgICAgICAgKCJTZWVrIHRvICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBpbiAlcyBmYWlsZWQiLCByZWFkX29mZnNldCwKKyAgICAgICAgICAgIGN1cl9wYXJ0LnBhdGgpKTsKKyAgICBnX2Vycm9yX2ZyZWUgKGVycik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK3JlYWRfZmFpbGVkOgorICB7CisgICAgaWYgKGVyci0+Y29kZSA9PSBHX0lPX0VSUk9SX0NBTkNFTExFRCkKKyAgICAgIGdvdG8gY2FuY2VsbGVkOworCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIFJFQUQsICgiJXMiLCBlcnItPm1lc3NhZ2UpLAorICAgICAgICAoIlJlYWQgZnJvbSAlIiBHX0dVSU5UNjRfRk9STUFUICIgaW4gJXMgZmFpbGVkIiwgcmVhZF9vZmZzZXQsCisgICAgICAgICAgICBjdXJfcGFydC5wYXRoKSk7CisgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CitmaWxlX3BhcnRfY2hhbmdlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBSRUFELAorICAgICAgICAoIlJlYWQgZXJyb3Igd2hpbGUgcmVhZGluZyBmaWxlIHBhcnQgJXMiLCBjdXJfcGFydC5wYXRoKSwKKyAgICAgICAgKCJTaG9ydCByZWFkIGluIGZpbGUgcGFydCwgZmlsZSBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIHNpbmNlIHN0YXJ0IikpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CitjYW5jZWxsZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJJL08gb3BlcmF0aW9uIGNhbmNlbGxlZCBmcm9tIGFub3RoZXIgdGhyZWFkIik7CisgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICB9Cit9CisKK3N0YXRpYyBHc3RVUklUeXBlCitnc3Rfc3BsaXRfZmlsZV9zcmNfdXJpX2dldF90eXBlIChHVHlwZSB0eXBlKQoreworICByZXR1cm4gR1NUX1VSSV9TUkM7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqY29uc3QgKgorZ3N0X3NwbGl0X2ZpbGVfc3JjX3VyaV9nZXRfcHJvdG9jb2xzIChHVHlwZSB0eXBlKQoreworICBzdGF0aWMgY29uc3QgZ2NoYXIgKnByb3RvY29sc1tdID0geyAic3BsaXRmaWxlIiwgTlVMTCB9OworCisgIHJldHVybiAoY29uc3QgZ2NoYXIgKiBjb25zdCAqKSBwcm90b2NvbHM7Cit9CisKK3N0YXRpYyBnY2hhciAqCitnc3Rfc3BsaXRfZmlsZV9zcmNfdXJpX2dldF91cmkgKEdzdFVSSUhhbmRsZXIgKiBoYW5kbGVyKQoreworICBHc3RTcGxpdEZpbGVTcmMgKnNyYyA9IEdTVF9TUExJVF9GSUxFX1NSQyAoaGFuZGxlcik7CisgIGdjaGFyICpyZXQ7CisKKyAgR1NUX09CSkVDVF9MT0NLIChzcmMpOworICBpZiAoc3JjLT5sb2NhdGlvbiAhPSBOVUxMKQorICAgIHJldCA9IGdfc3RyZHVwX3ByaW50ZiAoInNwbGl0ZmlsZTovLyVzIiwgc3JjLT5sb2NhdGlvbik7CisgIGVsc2UKKyAgICByZXQgPSBOVUxMOworICBHU1RfT0JKRUNUX1VOTE9DSyAoc3JjKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zcGxpdF9maWxlX3NyY191cmlfc2V0X3VyaSAoR3N0VVJJSGFuZGxlciAqIGhhbmRsZXIsIGNvbnN0IGdjaGFyICogdXJpLAorICAgIEdFcnJvciAqKiBlcnJvcikKK3sKKyAgR3N0U3BsaXRGaWxlU3JjICpzcmMgPSBHU1RfU1BMSVRfRklMRV9TUkMgKGhhbmRsZXIpOworCisgIGdzdF9zcGxpdF9maWxlX3NyY19zZXRfbG9jYXRpb24gKHNyYywgdXJpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGxpdF9maWxlX3NyY191cmlfaGFuZGxlcl9pbml0IChncG9pbnRlciBnX2lmYWNlLCBncG9pbnRlciBpZmFjZV9kYXRhKQoreworICBHc3RVUklIYW5kbGVySW50ZXJmYWNlICppZmFjZSA9IChHc3RVUklIYW5kbGVySW50ZXJmYWNlICopIGdfaWZhY2U7CisKKyAgaWZhY2UtPmdldF90eXBlID0gZ3N0X3NwbGl0X2ZpbGVfc3JjX3VyaV9nZXRfdHlwZTsKKyAgaWZhY2UtPmdldF9wcm90b2NvbHMgPSBnc3Rfc3BsaXRfZmlsZV9zcmNfdXJpX2dldF9wcm90b2NvbHM7CisgIGlmYWNlLT5nZXRfdXJpID0gZ3N0X3NwbGl0X2ZpbGVfc3JjX3VyaV9nZXRfdXJpOworICBpZmFjZS0+c2V0X3VyaSA9IGdzdF9zcGxpdF9maWxlX3NyY191cmlfc2V0X3VyaTsKK30KZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRmaWxlc3JjLmggYi9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0ZmlsZXNyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYWJkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0ZmlsZXNyYy5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qIEdTdHJlYW1lciBTcGxpdCBGaWxlIFNvdXJjZQorICogQ29weXJpZ2h0IChDKSAyMDExIENvbGxhYm9yYSBMdGQuIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmbmRlZiBfX0dTVF9TUExJVF9GSUxFX1NSQ19IX18KKyNkZWZpbmUgX19HU1RfU1BMSVRfRklMRV9TUkNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXNyYy5oPgorI2luY2x1ZGUgPGdpby9naW8uaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1NQTElUX0ZJTEVfU1JDIFwKKyAgKGdzdF9zcGxpdF9maWxlX3NyY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfU1BMSVRfRklMRV9TUkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9TUExJVF9GSUxFX1NSQyxHc3RTcGxpdEZpbGVTcmMpKQorI2RlZmluZSBHU1RfU1BMSVRfRklMRV9TUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfU1BMSVRfRklMRV9TUkMsR3N0U3BsaXRGaWxlU3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfU1BMSVRfRklMRV9TUkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9TUExJVF9GSUxFX1NSQykpCisjZGVmaW5lIEdTVF9JU19TUExJVF9GSUxFX1NSQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9TUExJVF9GSUxFX1NSQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RGaWxlUGFydCBHc3RGaWxlUGFydDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RTcGxpdEZpbGVTcmMgR3N0U3BsaXRGaWxlU3JjOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFNwbGl0RmlsZVNyY0NsYXNzIEdzdFNwbGl0RmlsZVNyY0NsYXNzOworCitzdHJ1Y3QgX0dzdEZpbGVQYXJ0Cit7CisgIEdGaWxlSW5wdXRTdHJlYW0gICpzdHJlYW07CisgIGdjaGFyICAgICAgICAgICAgICpwYXRoOworICBndWludDY0ICAgICAgICAgICAgc3RhcnQ7IC8qIGluY2x1c2l2ZSAqLworICBndWludDY0ICAgICAgICAgICAgc3RvcDsgIC8qIGluY2x1c2l2ZSAqLworfTsKKworc3RydWN0IF9Hc3RTcGxpdEZpbGVTcmMKK3sKKyAgR3N0QmFzZVNyYyAgIHBhcmVudDsKKworICBnY2hhciAgICAgICAqbG9jYXRpb247ICAvKiBPQkpFQ1RfTE9DSyAqLworCisgIEdzdEZpbGVQYXJ0ICpwYXJ0czsKKyAgZ3VpbnQgICAgICAgIG51bV9wYXJ0czsKKworICBndWludCAgICAgICAgY3VyX3BhcnQ7ICAvKiBwYXJ0IHVzZWQgbGFzdCAobGlrZWx5IGFsc28gdG8gYmUgdXNlZCBuZXh0KSAqLworCisgIEdDYW5jZWxsYWJsZSAqY2FuY2VsbGFibGU7IC8qIHNvIHdlIGNhbiBpbnRlcnJ1cHQgYmxvY2tpbmcgb3BlcmF0aW9ucyAqLworfTsKKworc3RydWN0IF9Hc3RTcGxpdEZpbGVTcmNDbGFzcworeworICBHc3RCYXNlU3JjQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3NwbGl0X2ZpbGVfc3JjX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1NQTElUX0ZJTEVfU1JDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuYyBiL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhwYXJ0cmVhZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUxNzFjYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhwYXJ0cmVhZGVyLmMKQEAgLTAsMCArMSwxMzcwIEBACisvKiBHU3RyZWFtZXIgU3BsaXQgRGVtdXhlciBiaW4gdGhhdCByZWNvbWJpbmVzIGZpbGVzIGNyZWF0ZWQgYnkKKyAqIHRoZSBzcGxpdG11eHNpbmsgZWxlbWVudC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDwyMDE0PiBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnc3RzcGxpdG11eHNyYy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChzcGxpdG11eF9wYXJ0X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHNwbGl0bXV4X3BhcnRfZGVidWcKKworI2RlZmluZSBTUExJVE1VWF9QQVJUX0xPQ0socCkgZ19tdXRleF9sb2NrKCYocCktPmxvY2spCisjZGVmaW5lIFNQTElUTVVYX1BBUlRfVU5MT0NLKHApIGdfbXV0ZXhfdW5sb2NrKCYocCktPmxvY2spCisjZGVmaW5lIFNQTElUTVVYX1BBUlRfV0FJVChwKSBnX2NvbmRfd2FpdCAoJihwKS0+aW5hY3RpdmVfY29uZCwgJihwKS0+bG9jaykKKyNkZWZpbmUgU1BMSVRNVVhfUEFSVF9CUk9BRENBU1QocCkgZ19jb25kX2Jyb2FkY2FzdCAoJihwKS0+aW5hY3RpdmVfY29uZCkKKworI2RlZmluZSBTUExJVE1VWF9QQVJUX1RZUEVfTE9DSyhwKSBnX211dGV4X2xvY2soJihwKS0+dHlwZV9sb2NrKQorI2RlZmluZSBTUExJVE1VWF9QQVJUX1RZUEVfVU5MT0NLKHApIGdfbXV0ZXhfdW5sb2NrKCYocCktPnR5cGVfbG9jaykKKworZW51bQoreworICBTSUdOQUxfUFJFUEFSRUQsCisgIExBU1RfU0lHTkFMCit9OworCitzdGF0aWMgZ3VpbnQgcGFydF9yZWFkZXJfc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAgfTsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFNwbGl0TXV4UGFydFBhZAoreworICBHc3RQYWQgcGFyZW50OworCisgIC8qIFJlYWRlciB3ZSBiZWxvbmcgdG8gKi8KKyAgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpyZWFkZXI7CisgIC8qIE91dHB1dCBzcGxpdG11eHNyYyBzb3VyY2UgcGFkICovCisgIEdzdFBhZCAqdGFyZ2V0OworCisgIEdzdERhdGFRdWV1ZSAqcXVldWU7CisKKyAgZ2Jvb2xlYW4gaXNfZW9zOworICBnYm9vbGVhbiBmbHVzaGluZzsKKyAgZ2Jvb2xlYW4gc2Vlbl9idWZmZXI7CisKKyAgZ2Jvb2xlYW4gaXNfc3BhcnNlOworICBHc3RDbG9ja1RpbWUgbWF4X3RzOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgR3N0U2VnbWVudCBvcmlnX3NlZ21lbnQ7CisgIEdzdENsb2NrVGltZSBpbml0aWFsX3RzX29mZnNldDsKK30gR3N0U3BsaXRNdXhQYXJ0UGFkOworCit0eXBlZGVmIHN0cnVjdCBfR3N0U3BsaXRNdXhQYXJ0UGFkQ2xhc3MKK3sKKyAgR3N0UGFkQ2xhc3MgcGFyZW50OworfSBHc3RTcGxpdE11eFBhcnRQYWRDbGFzczsKKworc3RhdGljIEdUeXBlIGdzdF9zcGxpdG11eF9wYXJ0X3BhZF9nZXRfdHlwZSAodm9pZCk7CisjZGVmaW5lIFNQTElUTVVYX1RZUEVfUEFSVF9QQUQgZ3N0X3NwbGl0bXV4X3BhcnRfcGFkX2dldF90eXBlKCkKKyNkZWZpbmUgU1BMSVRNVVhfUEFSVF9QQURfQ0FTVChwKSAoKEdzdFNwbGl0TXV4UGFydFBhZCAqKShwKSkKKworc3RhdGljIHZvaWQgc3BsaXRtdXhfcGFydF9wYWRfY29uc3RydWN0ZWQgKEdPYmplY3QgKiBwYWQpOworc3RhdGljIHZvaWQgc3BsaXRtdXhfcGFydF9wYWRfZmluYWxpemUgKEdPYmplY3QgKiBwYWQpOworc3RhdGljIHZvaWQgaGFuZGxlX2J1ZmZlcl9tZWFzdXJpbmcgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlciwKKyAgICBHc3RTcGxpdE11eFBhcnRQYWQgKiBwYXJ0X3BhZCwgR3N0QnVmZmVyICogYnVmKTsKKworc3RhdGljIGdib29sZWFuIHNwbGl0bXV4X2RhdGFfcXVldWVfaXNfZnVsbF9jYiAoR3N0RGF0YVF1ZXVlICogcXVldWUsCisgICAgZ3VpbnQgdmlzaWJsZSwgZ3VpbnQgYnl0ZXMsIGd1aW50NjQgdGltZSwgZ3BvaW50ZXIgY2hlY2tkYXRhKTsKK3N0YXRpYyB2b2lkIHR5cGVfZm91bmQgKEdzdEVsZW1lbnQgKiB0eXBlZmluZCwgZ3VpbnQgcHJvYmFiaWxpdHksCisgICAgR3N0Q2FwcyAqIGNhcHMsIEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlcik7CitzdGF0aWMgdm9pZCBjaGVja19pZl9wYWRzX2NvbGxlY3RlZCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcmVhZGVyKTsKKworLyogQ2FsbGVkIHdpdGggcmVhZGVyIGxvY2sgaGVsZCAqLworc3RhdGljIGdib29sZWFuCitoYXZlX2VtcHR5X3F1ZXVlIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIpCit7CisgIEdMaXN0ICpjdXI7CisKKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHJlYWRlci0+cGFkcyk7IGN1ciAhPSBOVUxMOyBjdXIgPSBnX2xpc3RfbmV4dCAoY3VyKSkgeworICAgIEdzdFNwbGl0TXV4UGFydFBhZCAqcGFydF9wYWQgPSBTUExJVE1VWF9QQVJUX1BBRF9DQVNUIChjdXItPmRhdGEpOworICAgIGlmIChwYXJ0X3BhZC0+aXNfZW9zKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocGFydF9wYWQsICJQYWQgaXMgRU9TIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgaWYgKGdzdF9kYXRhX3F1ZXVlX2lzX2VtcHR5IChwYXJ0X3BhZC0+cXVldWUpKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocGFydF9wYWQsICJRdWV1ZSBpcyBlbXB0eSIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiBDYWxsZWQgd2l0aCByZWFkZXIgbG9jayBoZWxkICovCitzdGF0aWMgZ2Jvb2xlYW4KK2Jsb2NrX3VudGlsX2Nhbl9wdXNoIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIpCit7CisgIHdoaWxlIChyZWFkZXItPnJ1bm5pbmcpIHsKKyAgICBpZiAocmVhZGVyLT5mbHVzaGluZykKKyAgICAgIGdvdG8gb3V0OworICAgIGlmIChyZWFkZXItPmFjdGl2ZSAmJiBoYXZlX2VtcHR5X3F1ZXVlIChyZWFkZXIpKQorICAgICAgZ290byBvdXQ7CisKKyAgICBHU1RfTE9HX09CSkVDVCAocmVhZGVyLAorICAgICAgICAiV2FpdGluZyBmb3IgYWN0aXZhdGlvbiBvciBlbXB0eSBxdWV1ZSBvbiByZWFkZXIgJXMiLCByZWFkZXItPnBhdGgpOworICAgIFNQTElUTVVYX1BBUlRfV0FJVCAocmVhZGVyKTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChyZWFkZXIsICJEb25lIHdhaXRpbmcgb24gcmVhZGVyICVzIGFjdGl2ZSAlZCBmbHVzaGluZyAlZCIsCisgICAgICByZWFkZXItPnBhdGgsIHJlYWRlci0+YWN0aXZlLCByZWFkZXItPmZsdXNoaW5nKTsKK291dDoKKyAgcmV0dXJuIHJlYWRlci0+YWN0aXZlICYmICFyZWFkZXItPmZsdXNoaW5nOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX2J1ZmZlcl9tZWFzdXJpbmcgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlciwKKyAgICBHc3RTcGxpdE11eFBhcnRQYWQgKiBwYXJ0X3BhZCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RDbG9ja1RpbWVEaWZmIHRzID0gR1NUX0NMT0NLX1NUSU1FX05PTkU7CisgIEdzdENsb2NrVGltZURpZmYgb2Zmc2V0OworCisgIGlmIChyZWFkZXItPnByZXBfc3RhdGUgPT0gUEFSVF9TVEFURV9QUkVQQVJJTkdfQ09MTEVDVF9TVFJFQU1TICYmCisgICAgICAhcGFydF9wYWQtPnNlZW5fYnVmZmVyKSB7CisgICAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgYnVmZmVyIG9uIHRoZSBwYWQgaW4gdGhlIGNvbGxlY3Rfc3RyZWFtcyBzdGF0ZSwKKyAgICAgKiB0aGVuIGNhbGN1bGF0ZSBpbml0YWwgb2Zmc2V0IGJhc2VkIG9uIHJ1bm5pbmcgdGltZSBvZiB0aGlzIHNlZ21lbnQgKi8KKyAgICBwYXJ0X3BhZC0+aW5pdGlhbF90c19vZmZzZXQgPQorICAgICAgICBwYXJ0X3BhZC0+b3JpZ19zZWdtZW50LnN0YXJ0ICsgcGFydF9wYWQtPm9yaWdfc2VnbWVudC5iYXNlIC0KKyAgICAgICAgcGFydF9wYWQtPm9yaWdfc2VnbWVudC50aW1lOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJlYWRlciwKKyAgICAgICAgIkluaXRpYWwgVFMgb2Zmc2V0IGZvciBwYWQgJSIgR1NUX1BUUl9GT1JNQVQgIiBub3cgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBwYXJ0X3BhZCwgR1NUX1RJTUVfQVJHUyAocGFydF9wYWQtPmluaXRpYWxfdHNfb2Zmc2V0KSk7CisgIH0KKyAgcGFydF9wYWQtPnNlZW5fYnVmZmVyID0gVFJVRTsKKworICAvKiBBZGp1c3QgYnVmZmVyIHRpbWVzdGFtcHMgKi8KKyAgb2Zmc2V0ID0gcmVhZGVyLT5zdGFydF9vZmZzZXQgKyBwYXJ0X3BhZC0+c2VnbWVudC5iYXNlOworICBvZmZzZXQgLT0gcGFydF9wYWQtPmluaXRpYWxfdHNfb2Zmc2V0OworCisgIC8qIFVwZGF0ZSB0aGUgc3RvcmVkIG1heCBkdXJhdGlvbiBvbiB0aGUgcGFkLAorICAgKiBhbHdheXMgcHJlZmVycmluZyBtYWtpbmcgRFRTIGNvbnRpZ3VvdXMKKyAgICogd2hlcmUgcG9zc2libGUgKi8KKyAgaWYgKEdTVF9CVUZGRVJfRFRTX0lTX1ZBTElEIChidWYpKQorICAgIHRzID0gR1NUX0JVRkZFUl9EVFMgKGJ1ZikgKyBvZmZzZXQ7CisgIGVsc2UgaWYgKEdTVF9CVUZGRVJfUFRTX0lTX1ZBTElEIChidWYpKQorICAgIHRzID0gR1NUX0JVRkZFUl9QVFMgKGJ1ZikgKyBvZmZzZXQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocmVhZGVyLCAiUGFkICUiIEdTVF9QVFJfRk9STUFUCisgICAgICAiIGluY29taW5nIFBUUyAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIgRFRTICUiIEdTVF9USU1FX0ZPUk1BVCAiIG9mZnNldCBieSAlIiBHU1RfU1RJTUVfRk9STUFUCisgICAgICAiIHRvICUiIEdTVF9TVElNRV9GT1JNQVQsIHBhcnRfcGFkLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVFMgKGJ1ZikpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9QVFMgKGJ1ZikpLAorICAgICAgR1NUX1NUSU1FX0FSR1MgKG9mZnNldCksIEdTVF9TVElNRV9BUkdTICh0cykpOworCisgIGlmIChHU1RfQ0xPQ0tfU1RJTUVfSVNfVkFMSUQgKHRzKSkgeworICAgIGlmIChHU1RfQlVGRkVSX0RVUkFUSU9OX0lTX1ZBTElEIChidWYpKQorICAgICAgdHMgKz0gR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKTsKKworICAgIGlmIChHU1RfQ0xPQ0tfU1RJTUVfSVNfVkFMSUQgKHRzKQorICAgICAgICAmJiB0cyA+IChHc3RDbG9ja1RpbWVEaWZmKSBwYXJ0X3BhZC0+bWF4X3RzKSB7CisgICAgICBwYXJ0X3BhZC0+bWF4X3RzID0gdHM7CisgICAgICBHU1RfTE9HX09CSkVDVCAocmVhZGVyLAorICAgICAgICAgICJwYWQgJSIgR1NUX1BUUl9GT1JNQVQgIiBtYXggVFMgbm93ICUiIEdTVF9USU1FX0ZPUk1BVCwgcGFydF9wYWQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocGFydF9wYWQtPm1heF90cykpOworICAgIH0KKyAgfQorICAvKiBJcyBpdCB0aW1lIHRvIG1vdmUgdG8gbWVhc3VyaW5nIHN0YXRlIHlldD8gKi8KKyAgY2hlY2tfaWZfcGFkc19jb2xsZWN0ZWQgKHJlYWRlcik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorc3BsaXRtdXhfZGF0YV9xdWV1ZV9pc19mdWxsX2NiIChHc3REYXRhUXVldWUgKiBxdWV1ZSwKKyAgICBndWludCB2aXNpYmxlLCBndWludCBieXRlcywgZ3VpbnQ2NCB0aW1lLCBncG9pbnRlciBjaGVja2RhdGEpCit7CisgIC8qIEFyYml0cmFyeSBzYWZldHkgbGltaXQuIElmIHdlIGhpdCBpdCwgcGxheWJhY2sgaXMgbGlrZWx5IHRvIHN0YWxsICovCisgIGlmICh0aW1lID4gMjAgKiBHU1RfU0VDT05EKQorICAgIHJldHVybiBUUlVFOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitzcGxpdG11eF9wYXJ0X2ZyZWVfcXVldWVfaXRlbSAoR3N0RGF0YVF1ZXVlSXRlbSAqIGl0ZW0pCit7CisgIGdzdF9taW5pX29iamVjdF91bnJlZiAoaXRlbS0+b2JqZWN0KTsKKyAgZ19zbGljZV9mcmVlIChHc3REYXRhUXVldWVJdGVtLCBpdGVtKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK3NwbGl0bXV4X3BhcnRfcGFkX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RTcGxpdE11eFBhcnRQYWQgKnBhcnRfcGFkID0gU1BMSVRNVVhfUEFSVF9QQURfQ0FTVCAocGFkKTsKKyAgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpyZWFkZXIgPSBwYXJ0X3BhZC0+cmVhZGVyOworICBHc3REYXRhUXVldWVJdGVtICppdGVtOworICBHc3RDbG9ja1RpbWVEaWZmIG9mZnNldDsKKworICBHU1RfTE9HX09CSkVDVCAocmVhZGVyLCAiUGFkICUiIEdTVF9QVFJfRk9STUFUICIgJSIgR1NUX1BUUl9GT1JNQVQsIHBhZCwgYnVmKTsKKyAgU1BMSVRNVVhfUEFSVF9MT0NLIChyZWFkZXIpOworCisgIGlmIChyZWFkZXItPnByZXBfc3RhdGUgPT0gUEFSVF9TVEFURV9QUkVQQVJJTkdfQ09MTEVDVF9TVFJFQU1TIHx8CisgICAgICByZWFkZXItPnByZXBfc3RhdGUgPT0gUEFSVF9TVEFURV9QUkVQQVJJTkdfTUVBU1VSRV9TVFJFQU1TKSB7CisgICAgaGFuZGxlX2J1ZmZlcl9tZWFzdXJpbmcgKHJlYWRlciwgcGFydF9wYWQsIGJ1Zik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KKworICBpZiAoIWJsb2NrX3VudGlsX2Nhbl9wdXNoIChyZWFkZXIpKSB7CisgICAgLyogRmx1c2hpbmcgKi8KKyAgICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBHU1RfRkxPV19GTFVTSElORzsKKyAgfQorCisgIC8qIEFkanVzdCBidWZmZXIgdGltZXN0YW1wcyAqLworICBvZmZzZXQgPSByZWFkZXItPnN0YXJ0X29mZnNldCArIHBhcnRfcGFkLT5zZWdtZW50LmJhc2U7CisgIG9mZnNldCAtPSBwYXJ0X3BhZC0+aW5pdGlhbF90c19vZmZzZXQ7CisKKyAgaWYgKEdTVF9CVUZGRVJfUFRTX0lTX1ZBTElEIChidWYpKQorICAgIEdTVF9CVUZGRVJfUFRTIChidWYpICs9IG9mZnNldDsKKyAgaWYgKEdTVF9CVUZGRVJfRFRTX0lTX1ZBTElEIChidWYpKQorICAgIEdTVF9CVUZGRVJfRFRTIChidWYpICs9IG9mZnNldDsKKworICAvKiBXZSBhcmUgYWN0aXZlLCBhbmQgb25lIHF1ZXVlIGlzIGVtcHR5LCBwbGFjZSB0aGlzIGJ1ZmZlciBpbgorICAgKiB0aGUgZGF0YXF1ZXVlICovCisgIEdTVF9MT0dfT0JKRUNUIChyZWFkZXIsICJFbnF1ZXVlaW5nIGJ1ZmZlciAlIiBHU1RfUFRSX0ZPUk1BVCwgYnVmKTsKKyAgaXRlbSA9IGdfc2xpY2VfbmV3IChHc3REYXRhUXVldWVJdGVtKTsKKyAgaXRlbS0+ZGVzdHJveSA9IChHRGVzdHJveU5vdGlmeSkgc3BsaXRtdXhfcGFydF9mcmVlX3F1ZXVlX2l0ZW07CisgIGl0ZW0tPm9iamVjdCA9IEdTVF9NSU5JX09CSkVDVCAoYnVmKTsKKyAgaXRlbS0+c2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisgIGl0ZW0tPmR1cmF0aW9uID0gR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKTsKKyAgaWYgKGl0ZW0tPmR1cmF0aW9uID09IEdTVF9DTE9DS19USU1FX05PTkUpCisgICAgaXRlbS0+ZHVyYXRpb24gPSAwOworICBpdGVtLT52aXNpYmxlID0gVFJVRTsKKworICBnc3Rfb2JqZWN0X3JlZiAocGFydF9wYWQpOworCisgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworCisgIGlmICghZ3N0X2RhdGFfcXVldWVfcHVzaCAocGFydF9wYWQtPnF1ZXVlLCBpdGVtKSkgeworICAgIHNwbGl0bXV4X3BhcnRfZnJlZV9xdWV1ZV9pdGVtIChpdGVtKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwYXJ0X3BhZCk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICB9CisKKyAgZ3N0X29iamVjdF91bnJlZiAocGFydF9wYWQpOworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKKy8qIENhbGxlZCB3aXRoIHNwbGl0bXV4IHBhcnQgbG9jayBoZWxkICovCitzdGF0aWMgZ2Jvb2xlYW4KK3NwbGl0bXV4X3BhcnRfaXNfZW9zX2xvY2tlZCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcGFydCkKK3sKKyAgR0xpc3QgKmN1cjsKKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHBhcnQtPnBhZHMpOyBjdXIgIT0gTlVMTDsgY3VyID0gZ19saXN0X25leHQgKGN1cikpIHsKKyAgICBHc3RTcGxpdE11eFBhcnRQYWQgKnBhcnRfcGFkID0gU1BMSVRNVVhfUEFSVF9QQURfQ0FTVCAoY3VyLT5kYXRhKTsKKyAgICBpZiAoIXBhcnRfcGFkLT5pc19lb3MpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitzcGxpdG11eF9wYXJ0X2lzX3ByZXJvbGxlZF9sb2NrZWQgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHBhcnQpCit7CisgIEdMaXN0ICpjdXI7CisgIEdTVF9MT0dfT0JKRUNUIChwYXJ0LCAiQ2hlY2tpbmcgZm9yIHByZXJvbGwiKTsKKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHBhcnQtPnBhZHMpOyBjdXIgIT0gTlVMTDsgY3VyID0gZ19saXN0X25leHQgKGN1cikpIHsKKyAgICBHc3RTcGxpdE11eFBhcnRQYWQgKnBhcnRfcGFkID0gU1BMSVRNVVhfUEFSVF9QQURfQ0FTVCAoY3VyLT5kYXRhKTsKKyAgICBpZiAoIXBhcnRfcGFkLT5zZWVuX2J1ZmZlcikgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhcnQsICJQYXJ0IHBhZCAlIiBHU1RfUFRSX0ZPUk1BVCAiIGlzIG5vdCBwcmVyb2xsZWQiLAorICAgICAgICAgIHBhcnRfcGFkKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKyAgR1NUX0xPR19PQkpFQ1QgKHBhcnQsICJQYXJ0IGlzIHByZXJvbGxlZCIpOworICByZXR1cm4gVFJVRTsKK30KKworCitnYm9vbGVhbgorZ3N0X3NwbGl0bXV4X3BhcnRfaXNfZW9zIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIpCit7CisgIGdib29sZWFuIHJlczsKKworICBTUExJVE1VWF9QQVJUX0xPQ0sgKHJlYWRlcik7CisgIHJlcyA9IHNwbGl0bXV4X3BhcnRfaXNfZW9zX2xvY2tlZCAocmVhZGVyKTsKKyAgU1BMSVRNVVhfUEFSVF9VTkxPQ0sgKHJlYWRlcik7CisKKyAgcmV0dXJuIHJlczsKK30KKworLyogQ2FsbGVkIHdpdGggc3BsaXRtdXggcGFydCBsb2NrIGhlbGQgKi8KK3N0YXRpYyBnYm9vbGVhbgorc3BsaXRtdXhfaXNfZmx1c2hpbmcgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlcikKK3sKKyAgR0xpc3QgKmN1cjsKKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHJlYWRlci0+cGFkcyk7IGN1ciAhPSBOVUxMOyBjdXIgPSBnX2xpc3RfbmV4dCAoY3VyKSkgeworICAgIEdzdFNwbGl0TXV4UGFydFBhZCAqcGFydF9wYWQgPSBTUExJVE1VWF9QQVJUX1BBRF9DQVNUIChjdXItPmRhdGEpOworICAgIGlmIChwYXJ0X3BhZC0+Zmx1c2hpbmcpCisgICAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitzcGxpdG11eF9wYXJ0X3BhZF9ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFNwbGl0TXV4UGFydFBhZCAqcGFydF9wYWQgPSBTUExJVE1VWF9QQVJUX1BBRF9DQVNUIChwYWQpOworICBHc3RTcGxpdE11eFBhcnRSZWFkZXIgKnJlYWRlciA9IHBhcnRfcGFkLT5yZWFkZXI7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIFNwbGl0TXV4U3JjUGFkICp0YXJnZXQ7CisgIEdzdERhdGFRdWV1ZUl0ZW0gKml0ZW07CisKKyAgU1BMSVRNVVhfUEFSVF9MT0NLIChyZWFkZXIpOworCisgIHRhcmdldCA9IGdzdF9vYmplY3RfcmVmIChwYXJ0X3BhZC0+dGFyZ2V0KTsKKworICBHU1RfTE9HX09CSkVDVCAocmVhZGVyLCAiUGFkICUiIEdTVF9QVFJfRk9STUFUICIgZXZlbnQgJSIgR1NUX1BUUl9GT1JNQVQsIHBhZCwKKyAgICAgIGV2ZW50KTsKKworICBpZiAocGFydF9wYWQtPmZsdXNoaW5nICYmIEdTVF9FVkVOVF9UWVBFIChldmVudCkgIT0gR1NUX0VWRU5UX0ZMVVNIX1NUT1ApCisgICAgZ290byBkcm9wX2V2ZW50OworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1NUUkVBTV9TVEFSVDp7CisgICAgICBHc3RTdHJlYW1GbGFncyBmbGFnczsKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9zdHJlYW1fZmxhZ3MgKGV2ZW50LCAmZmxhZ3MpOworICAgICAgcGFydF9wYWQtPmlzX3NwYXJzZSA9IChmbGFncyAmIEdTVF9TVFJFQU1fRkxBR19TUEFSU0UpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6eworICAgICAgR3N0U2VnbWVudCAqc2VnID0gJnBhcnRfcGFkLT5zZWdtZW50OworCisgICAgICBHU1RfTE9HX09CSkVDVCAocGFkLCAiUmVjZWl2ZWQgc2VnbWVudCAlIiBHU1RfUFRSX0ZPUk1BVCwgZXZlbnQpOworCisgICAgICBnc3RfZXZlbnRfY29weV9zZWdtZW50IChldmVudCwgc2VnKTsKKyAgICAgIGdzdF9ldmVudF9jb3B5X3NlZ21lbnQgKGV2ZW50LCAmcGFydF9wYWQtPm9yaWdfc2VnbWVudCk7CisKKyAgICAgIGlmIChzZWctPmZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUpCisgICAgICAgIGdvdG8gd3Jvbmdfc2VnbWVudDsKKworICAgICAgLyogQWRqdXN0IHNlZ21lbnQgKi8KKyAgICAgIC8qIEFkanVzdCBzdGFydC9zdG9wIHNvIHRoZSBvdmVyYWxsIGZpbGUgaXMgMCArIHN0YXJ0X29mZnNldCBiYXNlZCAqLworICAgICAgaWYgKHNlZy0+c3RvcCAhPSAtMSkgeworICAgICAgICBzZWctPnN0b3AgLT0gc2VnLT5zdGFydDsKKyAgICAgICAgc2VnLT5zdG9wICs9IHNlZy0+dGltZSArIHJlYWRlci0+c3RhcnRfb2Zmc2V0OworICAgICAgfQorICAgICAgc2VnLT5zdGFydCA9IHNlZy0+dGltZSArIHJlYWRlci0+c3RhcnRfb2Zmc2V0OworICAgICAgc2VnLT50aW1lICs9IHJlYWRlci0+c3RhcnRfb2Zmc2V0OworICAgICAgc2VnLT5wb3NpdGlvbiArPSByZWFkZXItPnN0YXJ0X29mZnNldDsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgIkFkanVzdGVkIHNlZ21lbnQgbm93ICUiIEdTVF9QVFJfRk9STUFULCBldmVudCk7CisKKyAgICAgIC8qIFJlcGxhY2UgZXZlbnQgKi8KKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKHNlZyk7CisKKyAgICAgIGlmIChyZWFkZXItPnByZXBfc3RhdGUgIT0gUEFSVF9TVEFURV9QUkVQQVJJTkdfQ09MTEVDVF9TVFJFQU1TCisgICAgICAgICAgJiYgcmVhZGVyLT5wcmVwX3N0YXRlICE9IFBBUlRfU1RBVEVfUFJFUEFSSU5HX01FQVNVUkVfU1RSRUFNUykKKyAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogT25seSBkbyBmdXJ0aGVyIHN0dWZmIHdpdGggc2VnbWVudHMgZHVyaW5nIGluaXRpYWwgbWVhc3VyaW5nICovCisKKyAgICAgIC8qIFRha2UgdGhlIGZpcnN0IHNlZ21lbnQgZnJvbSB0aGUgZmlyc3QgcGFydCAqLworICAgICAgaWYgKHRhcmdldC0+c2VnbWVudC5mb3JtYXQgPT0gR1NUX0ZPUk1BVF9VTkRFRklORUQpIHsKKyAgICAgICAgZ3N0X3NlZ21lbnRfY29weV9pbnRvIChzZWcsICZ0YXJnZXQtPnNlZ21lbnQpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChyZWFkZXIsCisgICAgICAgICAgICAiVGFyZ2V0IHBhZCBzZWdtZW50IG5vdyAlIiBHU1RfU0VHTUVOVF9GT1JNQVQsICZ0YXJnZXQtPnNlZ21lbnQpOworICAgICAgfQorCisgICAgICBpZiAoc2VnLT5zdG9wICE9IC0xICYmIHRhcmdldC0+c2VnbWVudC5zdG9wICE9IC0xKSB7CisgICAgICAgIEdzdENsb2NrVGltZSBzdG9wID0gc2VnLT5iYXNlICsgc2VnLT5zdG9wOworICAgICAgICBpZiAoc3RvcCA+IHRhcmdldC0+c2VnbWVudC5zdG9wKSB7CisgICAgICAgICAgdGFyZ2V0LT5zZWdtZW50LnN0b3AgPSBzdG9wOworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJlYWRlciwKKyAgICAgICAgICAgICAgIkFkanVzdGluZyBzZWdtZW50IHN0b3AgYnkgJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICAgICAgICIgb3V0cHV0IG5vdyAlIiBHU1RfU0VHTUVOVF9GT1JNQVQsCisgICAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHJlYWRlci0+c3RhcnRfb2Zmc2V0KSwgJnRhcmdldC0+c2VnbWVudCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJGb3J3YXJkaW5nIHNlZ21lbnQgJSIgR1NUX1BUUl9GT1JNQVQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6eworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJ0X3BhZCwKKyAgICAgICAgICAiU3RhdGUgJXUgRU9TIGV2ZW50LiBNYXhUUyBzZWVuICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICByZWFkZXItPnByZXBfc3RhdGUsIEdTVF9USU1FX0FSR1MgKHBhcnRfcGFkLT5tYXhfdHMpKTsKKworICAgICAgaWYgKHJlYWRlci0+cHJlcF9zdGF0ZSA9PSBQQVJUX1NUQVRFX1BSRVBBUklOR19DT0xMRUNUX1NUUkVBTVMgfHwKKyAgICAgICAgICByZWFkZXItPnByZXBfc3RhdGUgPT0gUEFSVF9TVEFURV9QUkVQQVJJTkdfTUVBU1VSRV9TVFJFQU1TKSB7CisgICAgICAgIC8qIE1hcmsgdGhpcyBwYWQgYXMgRU9TICovCisgICAgICAgIHBhcnRfcGFkLT5pc19lb3MgPSBUUlVFOworICAgICAgICBpZiAoc3BsaXRtdXhfcGFydF9pc19lb3NfbG9ja2VkIChyZWFkZXIpKSB7CisgICAgICAgICAgLyogRmluaXNoZWQgbWVhc3VyaW5nIHRoaW5ncywgc2V0IHN0YXRlIGFuZCB0ZWxsIHRoZSBzdGF0ZSBjaGFuZ2UgZnVuYworICAgICAgICAgICAqIHNvIGl0IGNhbiBzZWVrIGJhY2sgdG8gdGhlIHN0YXJ0ICovCisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHJlYWRlciwKKyAgICAgICAgICAgICAgIkVPUyB3aGlsZSBtZWFzdXJpbmcgc3RyZWFtcy4gUmVzZXR0aW5nIGZvciByZWFkeSIpOworICAgICAgICAgIHJlYWRlci0+cHJlcF9zdGF0ZSA9IFBBUlRfU1RBVEVfUFJFUEFSSU5HX1JFU0VUX0ZPUl9SRUFEWTsKKyAgICAgICAgICBTUExJVE1VWF9QQVJUX0JST0FEQ0FTVCAocmVhZGVyKTsKKyAgICAgICAgfQorICAgICAgICBnb3RvIGRyb3BfZXZlbnQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RBUlQ6CisgICAgICByZWFkZXItPmZsdXNoaW5nID0gVFJVRTsKKyAgICAgIHBhcnRfcGFkLT5mbHVzaGluZyA9IFRSVUU7CisgICAgICBHU1RfTE9HX09CSkVDVCAocmVhZGVyLCAiUGFkICUiIEdTVF9QVFJfRk9STUFUICIgZmx1c2hpbmcgZGF0YXF1ZXVlIiwKKyAgICAgICAgICBwYXJ0X3BhZCk7CisgICAgICBnc3RfZGF0YV9xdWV1ZV9zZXRfZmx1c2hpbmcgKHBhcnRfcGFkLT5xdWV1ZSwgVFJVRSk7CisgICAgICBTUExJVE1VWF9QQVJUX0JST0FEQ0FTVCAocmVhZGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6eworICAgICAgZ3N0X2RhdGFfcXVldWVfc2V0X2ZsdXNoaW5nIChwYXJ0X3BhZC0+cXVldWUsIEZBTFNFKTsKKyAgICAgIGdzdF9kYXRhX3F1ZXVlX2ZsdXNoIChwYXJ0X3BhZC0+cXVldWUpOworICAgICAgcGFydF9wYWQtPnNlZW5fYnVmZmVyID0gRkFMU0U7CisgICAgICBwYXJ0X3BhZC0+Zmx1c2hpbmcgPSBGQUxTRTsKKyAgICAgIHBhcnRfcGFkLT5pc19lb3MgPSBGQUxTRTsKKworICAgICAgcmVhZGVyLT5mbHVzaGluZyA9IHNwbGl0bXV4X2lzX2ZsdXNoaW5nIChyZWFkZXIpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHJlYWRlciwKKyAgICAgICAgICAiJXMgcGFkICUiIEdTVF9QVFJfRk9STUFUICIgZmx1c2hfc3RvcC4gT3ZlcmFsbCBmbHVzaGluZz0lZCIsCisgICAgICAgICAgcmVhZGVyLT5wYXRoLCBwYWQsIHJlYWRlci0+Zmx1c2hpbmcpOworICAgICAgU1BMSVRNVVhfUEFSVF9CUk9BRENBU1QgKHJlYWRlcik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRG9uJ3Qgc2VuZCBldmVudHMgZG93bnN0cmVhbSB3aGlsZSBwcmVwYXJpbmcgKi8KKyAgaWYgKHJlYWRlci0+cHJlcF9zdGF0ZSAhPSBQQVJUX1NUQVRFX1JFQURZKQorICAgIGdvdG8gZHJvcF9ldmVudDsKKworICAvKiBEb24ndCBwYXNzIGZsdXNoIGV2ZW50cyAtIHRob3NlIGFyZSBkb25lIGJ5IHRoZSBwYXJlbnQgKi8KKyAgaWYgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX0ZMVVNIX1NUQVJUIHx8CisgICAgICBHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID09IEdTVF9FVkVOVF9GTFVTSF9TVE9QKQorICAgIGdvdG8gZHJvcF9ldmVudDsKKworICBpZiAoIWJsb2NrX3VudGlsX2Nhbl9wdXNoIChyZWFkZXIpKQorICAgIGdvdG8gZHJvcF9ldmVudDsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9HQVA6eworICAgICAgLyogRklYTUU6IERyb3AgaW5pdGlhbCBnYXAgKGlmIGFueSkgaW4gZWFjaCBzZWdtZW50LCBub3QgYWxsIEdBUHMgKi8KKyAgICAgIGdvdG8gZHJvcF9ldmVudDsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogV2UgYXJlIGFjdGl2ZSwgYW5kIG9uZSBxdWV1ZSBpcyBlbXB0eSwgcGxhY2UgdGhpcyBidWZmZXIgaW4KKyAgICogdGhlIGRhdGFxdWV1ZSAqLworICBnc3Rfb2JqZWN0X3JlZiAocGFydF9wYWQtPnF1ZXVlKTsKKyAgU1BMSVRNVVhfUEFSVF9VTkxPQ0sgKHJlYWRlcik7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHJlYWRlciwgIkVucXVldWVpbmcgZXZlbnQgJSIgR1NUX1BUUl9GT1JNQVQsIGV2ZW50KTsKKyAgaXRlbSA9IGdfc2xpY2VfbmV3IChHc3REYXRhUXVldWVJdGVtKTsKKyAgaXRlbS0+ZGVzdHJveSA9IChHRGVzdHJveU5vdGlmeSkgc3BsaXRtdXhfcGFydF9mcmVlX3F1ZXVlX2l0ZW07CisgIGl0ZW0tPm9iamVjdCA9IEdTVF9NSU5JX09CSkVDVCAoZXZlbnQpOworICBpdGVtLT5zaXplID0gMDsKKyAgaXRlbS0+ZHVyYXRpb24gPSAwOworICBpZiAoaXRlbS0+ZHVyYXRpb24gPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICBpdGVtLT5kdXJhdGlvbiA9IDA7CisgIGl0ZW0tPnZpc2libGUgPSBGQUxTRTsKKworICBpZiAoIWdzdF9kYXRhX3F1ZXVlX3B1c2ggKHBhcnRfcGFkLT5xdWV1ZSwgaXRlbSkpIHsKKyAgICBzcGxpdG11eF9wYXJ0X2ZyZWVfcXVldWVfaXRlbSAoaXRlbSk7CisgICAgcmV0ID0gRkFMU0U7CisgIH0KKworICBnc3Rfb2JqZWN0X3VucmVmIChwYXJ0X3BhZC0+cXVldWUpOworICBnc3Rfb2JqZWN0X3VucmVmICh0YXJnZXQpOworCisgIHJldHVybiByZXQ7Cit3cm9uZ19zZWdtZW50OgorICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgZ3N0X29iamVjdF91bnJlZiAodGFyZ2V0KTsKKyAgU1BMSVRNVVhfUEFSVF9VTkxPQ0sgKHJlYWRlcik7CisgIEdTVF9FTEVNRU5UX0VSUk9SIChyZWFkZXIsIFNUUkVBTSwgRkFJTEVELCAoTlVMTCksCisgICAgICAoIlJlY2VpdmVkIG5vbi10aW1lIHNlZ21lbnQgLSByZWFkZXIgJXMgcGFkICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICAgIHJlYWRlci0+cGF0aCwgcGFkKSk7CisgIHJldHVybiBGQUxTRTsKK2Ryb3BfZXZlbnQ6CisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJEcm9wcGluZyBldmVudCAlIiBHU1RfUFRSX0ZPUk1BVAorICAgICAgIiBmcm9tICUiIEdTVF9QVFJfRk9STUFUICIgb24gJSIgR1NUX1BUUl9GT1JNQVQsIGV2ZW50LCBwYWQsIHRhcmdldCk7CisgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICBnc3Rfb2JqZWN0X3VucmVmICh0YXJnZXQpOworICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorc3BsaXRtdXhfcGFydF9wYWRfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RTcGxpdE11eFBhcnRQYWQgKnBhcnRfcGFkID0gU1BMSVRNVVhfUEFSVF9QQURfQ0FTVCAocGFkKTsKKyAgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpyZWFkZXIgPSBwYXJ0X3BhZC0+cmVhZGVyOworICBHc3RQYWQgKnRhcmdldDsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisgIGdib29sZWFuIGFjdGl2ZTsKKworICBTUExJVE1VWF9QQVJUX0xPQ0sgKHJlYWRlcik7CisgIHRhcmdldCA9IGdzdF9vYmplY3RfcmVmIChwYXJ0X3BhZC0+dGFyZ2V0KTsKKyAgYWN0aXZlID0gcmVhZGVyLT5hY3RpdmU7CisgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworCisgIGlmIChhY3RpdmUpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocGFkLCAiRm9yd2FyZGluZyBxdWVyeSAlIiBHU1RfUFRSX0ZPUk1BVAorICAgICAgICAiIGZyb20gJSIgR1NUX1BUUl9GT1JNQVQgIiBvbiAlIiBHU1RfUFRSX0ZPUk1BVCwgcXVlcnksIHBhZCwgdGFyZ2V0KTsKKworICAgIHJldCA9IGdzdF9wYWRfcXVlcnkgKHRhcmdldCwgcXVlcnkpOworICB9CisKKyAgZ3N0X29iamVjdF91bnJlZiAodGFyZ2V0KTsKKworICByZXR1cm4gcmV0OworfQorCitHX0RFRklORV9UWVBFIChHc3RTcGxpdE11eFBhcnRQYWQsIGdzdF9zcGxpdG11eF9wYXJ0X3BhZCwgR1NUX1RZUEVfUEFEKTsKKworc3RhdGljIHZvaWQKK3NwbGl0bXV4X3BhcnRfcGFkX2NvbnN0cnVjdGVkIChHT2JqZWN0ICogcGFkKQoreworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoR1NUX1BBRCAocGFkKSwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChzcGxpdG11eF9wYXJ0X3BhZF9jaGFpbikpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoR1NUX1BBRCAocGFkKSwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChzcGxpdG11eF9wYXJ0X3BhZF9ldmVudCkpOworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAoR1NUX1BBRCAocGFkKSwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChzcGxpdG11eF9wYXJ0X3BhZF9xdWVyeSkpOworCisgIEdfT0JKRUNUX0NMQVNTIChnc3Rfc3BsaXRtdXhfcGFydF9wYWRfcGFyZW50X2NsYXNzKS0+Y29uc3RydWN0ZWQgKHBhZCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfcGFydF9wYWRfY2xhc3NfaW5pdCAoR3N0U3BsaXRNdXhQYXJ0UGFkQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2tsYXNzID0gKEdPYmplY3RDbGFzcyAqKSAoa2xhc3MpOworCisgIGdvYmplY3Rfa2xhc3MtPmNvbnN0cnVjdGVkID0gc3BsaXRtdXhfcGFydF9wYWRfY29uc3RydWN0ZWQ7CisgIGdvYmplY3Rfa2xhc3MtPmZpbmFsaXplID0gc3BsaXRtdXhfcGFydF9wYWRfZmluYWxpemU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfcGFydF9wYWRfaW5pdCAoR3N0U3BsaXRNdXhQYXJ0UGFkICogcGFkKQoreworICBwYWQtPnF1ZXVlID0gZ3N0X2RhdGFfcXVldWVfbmV3IChzcGxpdG11eF9kYXRhX3F1ZXVlX2lzX2Z1bGxfY2IsCisgICAgICBOVUxMLCBOVUxMLCBwYWQpOworICBnc3Rfc2VnbWVudF9pbml0ICgmcGFkLT5zZWdtZW50LCBHU1RfRk9STUFUX1VOREVGSU5FRCk7CisgIGdzdF9zZWdtZW50X2luaXQgKCZwYWQtPm9yaWdfc2VnbWVudCwgR1NUX0ZPUk1BVF9VTkRFRklORUQpOworfQorCitzdGF0aWMgdm9pZAorc3BsaXRtdXhfcGFydF9wYWRfZmluYWxpemUgKEdPYmplY3QgKiBvYmopCit7CisgIEdzdFNwbGl0TXV4UGFydFBhZCAqcGFkID0gKEdzdFNwbGl0TXV4UGFydFBhZCAqKSAob2JqKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChvYmosICJmaW5hbGl6ZSIpOworICBnc3RfZGF0YV9xdWV1ZV9zZXRfZmx1c2hpbmcgKHBhZC0+cXVldWUsIFRSVUUpOworICBnc3RfZGF0YV9xdWV1ZV9mbHVzaCAocGFkLT5xdWV1ZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1RfQ0FTVCAocGFkLT5xdWV1ZSkpOworICBwYWQtPnF1ZXVlID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAoZ3N0X3NwbGl0bXV4X3BhcnRfcGFkX3BhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmopOworfQorCitzdGF0aWMgdm9pZAorbmV3X2RlY29kZWRfcGFkX2FkZGVkX2NiIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkLAorICAgIEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHBhcnQpOworc3RhdGljIHZvaWQgbm9fbW9yZV9wYWRzIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcmVhZGVyKTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NlbmRfZXZlbnQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIHZvaWQgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NldF9mbHVzaGluZ19sb2NrZWQgKEdzdFNwbGl0TXV4UGFydFJlYWRlcgorICAgICogcGFydCwgZ2Jvb2xlYW4gZmx1c2hpbmcpOworc3RhdGljIHZvaWQgYnVzX2hhbmRsZXIgKEdzdEJpbiAqIGJpbiwgR3N0TWVzc2FnZSAqIG1zZyk7CitzdGF0aWMgdm9pZCBzcGxpdG11eF9wYXJ0X3JlYWRlcl9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyB2b2lkIHNwbGl0bXV4X3BhcnRfcmVhZGVyX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyB2b2lkIHNwbGl0bXV4X3BhcnRfcmVhZGVyX3Jlc2V0IChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIpOworCisjZGVmaW5lIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RTcGxpdE11eFBhcnRSZWFkZXIsIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlciwKKyAgICBHU1RfVFlQRV9QSVBFTElORSk7CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfY2xhc3NfaW5pdCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2tsYXNzID0gKEdPYmplY3RDbGFzcyAqKSAoa2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RCaW5DbGFzcyAqZ3N0YmluX2NsYXNzID0gKEdzdEJpbkNsYXNzICopIGtsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChzcGxpdG11eF9wYXJ0X2RlYnVnLCAic3BsaXRtdXhwYXJ0cmVhZGVyIiwgMCwKKyAgICAgICJTcGxpdCBGaWxlIERlbXV4aW5nIFNvdXJjZSBoZWxwZXIiKTsKKworICBnb2JqZWN0X2tsYXNzLT5kaXNwb3NlID0gc3BsaXRtdXhfcGFydF9yZWFkZXJfZGlzcG9zZTsKKyAgZ29iamVjdF9rbGFzcy0+ZmluYWxpemUgPSBzcGxpdG11eF9wYXJ0X3JlYWRlcl9maW5hbGl6ZTsKKworICBwYXJ0X3JlYWRlcl9zaWduYWxzW1NJR05BTF9QUkVQQVJFRF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgicHJlcGFyZWQiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0ZJUlNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFNwbGl0TXV4UGFydFJlYWRlckNsYXNzLAorICAgICAgICAgIHByZXBhcmVkKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX1ZPSUQsIEdfVFlQRV9OT05FLCAwKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2NoYW5nZV9zdGF0ZTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+c2VuZF9ldmVudCA9IGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9zZW5kX2V2ZW50OworCisgIGdzdGJpbl9jbGFzcy0+aGFuZGxlX21lc3NhZ2UgPSBidXNfaGFuZGxlcjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9pbml0IChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIpCit7CisgIEdzdEVsZW1lbnQgKnR5cGVmaW5kOworCisgIHJlYWRlci0+YWN0aXZlID0gRkFMU0U7CisgIHJlYWRlci0+ZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIGdfY29uZF9pbml0ICgmcmVhZGVyLT5pbmFjdGl2ZV9jb25kKTsKKyAgZ19tdXRleF9pbml0ICgmcmVhZGVyLT5sb2NrKTsKKyAgZ19tdXRleF9pbml0ICgmcmVhZGVyLT50eXBlX2xvY2spOworCisgIC8qIEZJWE1FOiBDcmVhdGUgZWxlbWVudHMgb24gYSBzdGF0ZSBjaGFuZ2UgKi8KKyAgcmVhZGVyLT5zcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmaWxlc3JjIiwgTlVMTCk7CisgIGlmIChyZWFkZXItPnNyYyA9PSBOVUxMKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocmVhZGVyLCAiRmFpbGVkIHRvIGNyZWF0ZSBmaWxlc3JjIGVsZW1lbnQiKTsKKyAgICByZXR1cm47CisgIH0KKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU5fQ0FTVCAocmVhZGVyKSwgcmVhZGVyLT5zcmMpOworCisgIHR5cGVmaW5kID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidHlwZWZpbmQiLCBOVUxMKTsKKyAgaWYgKCF0eXBlZmluZCkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJlYWRlciwKKyAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgdHlwZWZpbmQgZWxlbWVudCAtIGNoZWNrIHlvdXIgaW5zdGFsbGF0aW9uIik7CisgICAgcmV0dXJuOworICB9CisKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU5fQ0FTVCAocmVhZGVyKSwgdHlwZWZpbmQpOworICByZWFkZXItPnR5cGVmaW5kID0gdHlwZWZpbmQ7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rX3BhZHMgKHJlYWRlci0+c3JjLCBOVUxMLCB0eXBlZmluZCwgInNpbmsiKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJlYWRlciwKKyAgICAgICAgIkZhaWxlZCB0byBsaW5rIHR5cGVmaW5kIGVsZW1lbnQgLSBjaGVjayB5b3VyIGluc3RhbGxhdGlvbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJlYWRlci0+dHlwZWZpbmQsICJoYXZlLXR5cGUiLCBHX0NBTExCQUNLICh0eXBlX2ZvdW5kKSwKKyAgICAgIHJlYWRlcik7Cit9CisKK3N0YXRpYyB2b2lkCitzcGxpdG11eF9wYXJ0X3JlYWRlcl9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RTcGxpdE11eFBhcnRSZWFkZXIgKnJlYWRlciA9IChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKikgb2JqZWN0OworCisgIHNwbGl0bXV4X3BhcnRfcmVhZGVyX3Jlc2V0IChyZWFkZXIpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorc3BsaXRtdXhfcGFydF9yZWFkZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFNwbGl0TXV4UGFydFJlYWRlciAqcmVhZGVyID0gKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqKSBvYmplY3Q7CisKKyAgZ19jb25kX2NsZWFyICgmcmVhZGVyLT5pbmFjdGl2ZV9jb25kKTsKKyAgZ19tdXRleF9jbGVhciAoJnJlYWRlci0+bG9jayk7CisgIGdfbXV0ZXhfY2xlYXIgKCZyZWFkZXItPnR5cGVfbG9jayk7CisKKyAgZ19mcmVlIChyZWFkZXItPnBhdGgpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3NwbGl0bXV4X3BhcnRfcmVhZGVyX3Jlc2V0IChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIpCit7CisgIEdMaXN0ICpjdXI7CisKKyAgU1BMSVRNVVhfUEFSVF9MT0NLIChyZWFkZXIpOworICBmb3IgKGN1ciA9IGdfbGlzdF9maXJzdCAocmVhZGVyLT5wYWRzKTsgY3VyICE9IE5VTEw7IGN1ciA9IGdfbGlzdF9uZXh0IChjdXIpKSB7CisgICAgR3N0UGFkICpwYWQgPSBHU1RfUEFEX0NBU1QgKGN1ci0+ZGF0YSk7CisgICAgZ3N0X3BhZF9zZXRfYWN0aXZlIChHU1RfUEFEX0NBU1QgKHBhZCksIEZBTFNFKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChHU1RfT0JKRUNUX0NBU1QgKHBhZCkpOworICB9CisKKyAgZ19saXN0X2ZyZWUgKHJlYWRlci0+cGFkcyk7CisgIHJlYWRlci0+cGFkcyA9IE5VTEw7CisgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworfQorCitzdGF0aWMgR3N0U3BsaXRNdXhQYXJ0UGFkICoKK2dzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9uZXdfcHJveHlfcGFkIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIsCisgICAgR3N0UGFkICogdGFyZ2V0KQoreworICBHc3RTcGxpdE11eFBhcnRQYWQgKnBhZCA9IGdfb2JqZWN0X25ldyAoU1BMSVRNVVhfVFlQRV9QQVJUX1BBRCwKKyAgICAgICJuYW1lIiwgR1NUX1BBRF9OQU1FICh0YXJnZXQpLAorICAgICAgImRpcmVjdGlvbiIsIEdTVF9QQURfU0lOSywKKyAgICAgIE5VTEwpOworICBwYWQtPnRhcmdldCA9IHRhcmdldDsKKyAgcGFkLT5yZWFkZXIgPSByZWFkZXI7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChHU1RfUEFEX0NBU1QgKHBhZCksIFRSVUUpOworCisgIHJldHVybiBwYWQ7Cit9CisKK3N0YXRpYyB2b2lkCituZXdfZGVjb2RlZF9wYWRfYWRkZWRfY2IgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RQYWQgKiBwYWQsCisgICAgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcmVhZGVyKQoreworICBHc3RQYWQgKm91dF9wYWQgPSBOVUxMOworICBHc3RTcGxpdE11eFBhcnRQYWQgKnByb3h5X3BhZDsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0UGFkTGlua1JldHVybiBsaW5rX3JldDsKKworICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChwYWQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJlYWRlciwgImZpbGUgJXMgbmV3IGRlY29kZWQgcGFkICUiIEdTVF9QVFJfRk9STUFUCisgICAgICAiIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIHJlYWRlci0+cGF0aCwgcGFkLCBjYXBzKTsKKworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgLyogTG9vayB1cCBvciBjcmVhdGUgdGhlIG91dHB1dCBwYWQgKi8KKyAgaWYgKHJlYWRlci0+Z2V0X3BhZF9jYikKKyAgICBvdXRfcGFkID0gcmVhZGVyLT5nZXRfcGFkX2NiIChyZWFkZXIsIHBhZCwgcmVhZGVyLT5jYl9kYXRhKTsKKyAgaWYgKG91dF9wYWQgPT0gTlVMTCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJlYWRlciwKKyAgICAgICAgIk5vIG91dHB1dCBwYWQgZm9yICUiIEdTVF9QVFJfRk9STUFUICIuIElnbm9yaW5nIiwgcGFkKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBDcmVhdGUgb3VyIHByb3h5IHBhZCB0byBpbnRlcmFjdCB3aXRoIHRoaXMgbmV3IHBhZCAqLworICBwcm94eV9wYWQgPSBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfbmV3X3Byb3h5X3BhZCAocmVhZGVyLCBvdXRfcGFkKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocmVhZGVyLAorICAgICAgImNyZWF0ZWQgcHJveHkgcGFkICUiIEdTVF9QVFJfRk9STUFUICIgZm9yIHRhcmdldCAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIHByb3h5X3BhZCwgb3V0X3BhZCk7CisKKyAgbGlua19yZXQgPSBnc3RfcGFkX2xpbmsgKHBhZCwgR1NUX1BBRCAocHJveHlfcGFkKSk7CisgIGlmIChsaW5rX3JldCAhPSBHU1RfUEFEX0xJTktfT0spIHsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwcm94eV9wYWQpOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChyZWFkZXIsIFNUUkVBTSwgRkFJTEVELCAoTlVMTCksCisgICAgICAgICgiRmFpbGVkIHRvIGxpbmsgcHJveHkgcGFkIGZvciBzdHJlYW0gcGFydCAlcyBwYWQgJSIgR1NUX1BUUl9GT1JNQVQKKyAgICAgICAgICAgICIgcmV0ICVkIiwgcmVhZGVyLT5wYXRoLCBwYWQsIGxpbmtfcmV0KSk7CisgICAgcmV0dXJuOworICB9CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJlYWRlciwKKyAgICAgICJuZXcgZGVjb2RlZCBwYWQgJSIgR1NUX1BUUl9GT1JNQVQgIiBsaW5rZWQgdG8gJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBwYWQsIHByb3h5X3BhZCk7CisKKyAgU1BMSVRNVVhfUEFSVF9MT0NLIChyZWFkZXIpOworICByZWFkZXItPnBhZHMgPSBnX2xpc3RfcHJlcGVuZCAocmVhZGVyLT5wYWRzLCBwcm94eV9wYWQpOworICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfc2VuZF9ldmVudCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFNwbGl0TXV4UGFydFJlYWRlciAqcmVhZGVyID0gKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqKSBlbGVtZW50OworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKyAgR3N0UGFkICpwYWQgPSBOVUxMOworCisgIC8qIFNlbmQgZXZlbnQgdG8gdGhlIGZpcnN0IHNvdXJjZSBwYWQgd2UgZm91bmQgKi8KKyAgU1BMSVRNVVhfUEFSVF9MT0NLIChyZWFkZXIpOworICBpZiAocmVhZGVyLT5wYWRzKSB7CisgICAgR3N0UGFkICpwcm94eV9wYWQgPSBHU1RfUEFEX0NBU1QgKHJlYWRlci0+cGFkcy0+ZGF0YSk7CisgICAgcGFkID0gZ3N0X3BhZF9nZXRfcGVlciAocHJveHlfcGFkKTsKKyAgfQorICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKKworICBpZiAocGFkKSB7CisgICAgcmV0ID0gZ3N0X3BhZF9zZW5kX2V2ZW50IChwYWQsIGV2ZW50KTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworICB9IGVsc2UgeworICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogQ2FsbGVkIHdpdGggbG9jayBoZWxkLiBTZWVrcyB0byBhbiAnaW50ZXJuYWwnIHRpbWUgZnJvbSAwIHRvIGxlbmd0aCBvZiB0aGlzIHBpZWNlICovCitzdGF0aWMgdm9pZAorZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NlZWtfdG9fdGltZV9sb2NrZWQgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlciwKKyAgICBHc3RDbG9ja1RpbWUgdGltZSkKK3sKKyAgU1BMSVRNVVhfUEFSVF9VTkxPQ0sgKHJlYWRlcik7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJlYWRlciwgIlNlZWtpbmcgdG8gdGltZSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTICh0aW1lKSk7CisgIGdzdF9lbGVtZW50X3NlZWsgKEdTVF9FTEVNRU5UX0NBU1QgKHJlYWRlciksIDEuMCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgR1NUX1NFRUtfRkxBR19GTFVTSCB8IEdTVF9TRUVLX0ZMQUdfQUNDVVJBVEUsIEdTVF9TRUVLX1RZUEVfU0VULCB0aW1lLAorICAgICAgR1NUX1NFRUtfVFlQRV9FTkQsIDApOworCisgIFNQTElUTVVYX1BBUlRfTE9DSyAocmVhZGVyKTsKKworICAvKiBXYWl0IGZvciBmbHVzaCB0byBmaW5pc2gsIHNvIG9sZCBkYXRhIGlzIGdvbmUgKi8KKyAgd2hpbGUgKHJlYWRlci0+Zmx1c2hpbmcpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocmVhZGVyLCAiJXMgV2FpdGluZyBmb3IgZmx1c2ggdG8gZmluaXNoIiwgcmVhZGVyLT5wYXRoKTsKKyAgICBTUExJVE1VWF9QQVJUX1dBSVQgKHJlYWRlcik7CisgIH0KK30KKworLyogTWFwIHRoZSBwYXNzZWQgc2VnbWVudCB0byAnaW50ZXJuYWwnIHRpbWUgZnJvbSAwIHRvIGxlbmd0aCBvZiB0aGlzIHBpZWNlIGFuZCBzZWVrLiBMb2NrIGNhbm5vdCBiZSBoZWxkICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9zZWVrX3RvX3NlZ21lbnQgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlciwKKyAgICBHc3RTZWdtZW50ICogdGFyZ2V0X3NlZywgR3N0U2Vla0ZsYWdzIGV4dHJhX2ZsYWdzKQoreworICBHc3RTZWVrRmxhZ3MgZmxhZ3M7CisgIEdzdENsb2NrVGltZSBzdGFydCA9IDAsIHN0b3AgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIGZsYWdzID0gdGFyZ2V0X3NlZy0+ZmxhZ3MgfCBHU1RfU0VFS19GTEFHX0ZMVVNIIHwgZXh0cmFfZmxhZ3M7CisKKyAgU1BMSVRNVVhfUEFSVF9MT0NLIChyZWFkZXIpOworICBpZiAodGFyZ2V0X3NlZy0+c3RhcnQgPj0gcmVhZGVyLT5zdGFydF9vZmZzZXQpCisgICAgc3RhcnQgPSB0YXJnZXRfc2VnLT5zdGFydCAtIHJlYWRlci0+c3RhcnRfb2Zmc2V0OworICAvKiBJZiB0aGUgc2VnbWVudCBzdG9wIGlzIHdpdGhpbiB0aGlzIHBhcnQsIGRvbid0IHBsYXkgdG8gdGhlIGVuZCAqLworICBpZiAodGFyZ2V0X3NlZy0+c3RvcCAhPSAtMSAmJgorICAgICAgdGFyZ2V0X3NlZy0+c3RvcCA8IHJlYWRlci0+c3RhcnRfb2Zmc2V0ICsgcmVhZGVyLT5kdXJhdGlvbikKKyAgICBzdG9wID0gdGFyZ2V0X3NlZy0+c3RvcCAtIHJlYWRlci0+c3RhcnRfb2Zmc2V0OworCisgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJlYWRlciwKKyAgICAgICJTZWVraW5nIHJhdGUgJWYgZm9ybWF0ICVkIGZsYWdzIDB4JXggc3RhcnQgJSIgR1NUX1RJTUVfRk9STUFUICIgc3RvcCAlIgorICAgICAgR1NUX1RJTUVfRk9STUFULCB0YXJnZXRfc2VnLT5yYXRlLCB0YXJnZXRfc2VnLT5mb3JtYXQsIGZsYWdzLAorICAgICAgR1NUX1RJTUVfQVJHUyAoc3RhcnQpLCBHU1RfVElNRV9BUkdTIChzdG9wKSk7CisKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3NlZWsgKEdTVF9FTEVNRU5UX0NBU1QgKHJlYWRlciksIHRhcmdldF9zZWctPnJhdGUsCisgICAgICB0YXJnZXRfc2VnLT5mb3JtYXQsIGZsYWdzLCBHU1RfU0VFS19UWVBFX1NFVCwgc3RhcnQsIEdTVF9TRUVLX1RZUEVfU0VULAorICAgICAgc3RvcCk7Cit9CisKKy8qIENhbGxlZCB3aXRoIGxvY2sgaGVsZCAqLworc3RhdGljIHZvaWQKK2dzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9tZWFzdXJlX3N0cmVhbXMgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlcikKK3sKKyAgLyogVHJpZ2dlciBhIGZsdXNoaW5nIHNlZWsgdG8gbmVhciB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBydW4gZWFjaCBzdHJlYW0KKyAgICogdG8gRU9TIGluIG9yZGVyIHRvIGZpbmQgdGhlIHNtYWxsZXN0IGVuZCB0aW1lc3RhbXAgdG8gc3RhcnQgdGhlIG5leHQKKyAgICogZmlsZSBmcm9tCisgICAqLworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHJlYWRlci0+ZHVyYXRpb24pCisgICAgICAmJiByZWFkZXItPmR1cmF0aW9uID4gR1NUX1NFQ09ORCkgeworICAgIEdzdENsb2NrVGltZSBzZWVrX3RzID0gcmVhZGVyLT5kdXJhdGlvbiAtICgwLjUgKiBHU1RfU0VDT05EKTsKKyAgICBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfc2Vla190b190aW1lX2xvY2tlZCAocmVhZGVyLCBzZWVrX3RzKTsKKyAgfQorCisgIC8qIFdhaXQgZm9yIHRoaW5ncyB0byBoYXBwZW4gKi8KKyAgd2hpbGUgKHJlYWRlci0+cHJlcF9zdGF0ZSA9PSBQQVJUX1NUQVRFX1BSRVBBUklOR19NRUFTVVJFX1NUUkVBTVMpCisgICAgU1BMSVRNVVhfUEFSVF9XQUlUIChyZWFkZXIpOworCisgIGlmIChyZWFkZXItPnByZXBfc3RhdGUgPT0gUEFSVF9TVEFURV9QUkVQQVJJTkdfUkVTRVRfRk9SX1JFQURZKSB7CisgICAgLyogRmlyZSB0aGUgcHJlcGFyZWQgc2lnbmFsIGFuZCBnbyB0byBSRUFEWSBzdGF0ZSAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJlYWRlciwKKyAgICAgICAgIlN0cmVhbSBtZWFzdXJpbmcgY29tcGxldGUuIEZpbGUgJXMgaXMgbm93IHJlYWR5LiBGaXJpbmcgcHJlcGFyZWQgc2lnbmFsIiwKKyAgICAgICAgcmVhZGVyLT5wYXRoKTsKKyAgICByZWFkZXItPnByZXBfc3RhdGUgPSBQQVJUX1NUQVRFX1JFQURZOworICAgIGdfc2lnbmFsX2VtaXQgKHJlYWRlciwgcGFydF9yZWFkZXJfc2lnbmFsc1tTSUdOQUxfUFJFUEFSRURdLCAwLCBOVUxMKTsKKyAgfQorfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCitmaW5kX2RlbXV4ZXIgKEdzdENhcHMgKiBjYXBzKQoreworICBHTGlzdCAqZmFjdG9yaWVzID0KKyAgICAgIGdzdF9lbGVtZW50X2ZhY3RvcnlfbGlzdF9nZXRfZWxlbWVudHMgKEdTVF9FTEVNRU5UX0ZBQ1RPUllfVFlQRV9ERU1VWEVSLAorICAgICAgR1NUX1JBTktfTUFSR0lOQUwpOworICBHTGlzdCAqY29tcGF0X2VsZW1lbnRzOworICBHc3RFbGVtZW50ICplID0gTlVMTDsKKworICBpZiAoZmFjdG9yaWVzID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgY29tcGF0X2VsZW1lbnRzID0KKyAgICAgIGdzdF9lbGVtZW50X2ZhY3RvcnlfbGlzdF9maWx0ZXIgKGZhY3RvcmllcywgY2FwcywgR1NUX1BBRF9TSU5LLCBUUlVFKTsKKworICBpZiAoY29tcGF0X2VsZW1lbnRzKSB7CisgICAgLyogSnVzdCB0YWtlIHRoZSBmaXJzdCAoaGlnaGVzdCByYW5rZWQpIG9wdGlvbiAqLworICAgIEdzdEVsZW1lbnRGYWN0b3J5ICpmYWN0b3J5ID0KKyAgICAgICAgR1NUX0VMRU1FTlRfRkFDVE9SWV9DQVNUIChjb21wYXRfZWxlbWVudHMtPmRhdGEpOworICAgIGUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X2NyZWF0ZSAoZmFjdG9yeSwgTlVMTCk7CisgICAgZ3N0X3BsdWdpbl9mZWF0dXJlX2xpc3RfZnJlZSAoY29tcGF0X2VsZW1lbnRzKTsKKyAgfQorCisgIGlmIChmYWN0b3JpZXMpCisgICAgZ3N0X3BsdWdpbl9mZWF0dXJlX2xpc3RfZnJlZSAoZmFjdG9yaWVzKTsKKworICByZXR1cm4gZTsKK30KKworc3RhdGljIHZvaWQKK3R5cGVfZm91bmQgKEdzdEVsZW1lbnQgKiB0eXBlZmluZCwgZ3VpbnQgcHJvYmFiaWxpdHksCisgICAgR3N0Q2FwcyAqIGNhcHMsIEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlcikKK3sKKyAgR3N0RWxlbWVudCAqZGVtdXg7CisKKyAgR1NUX0lORk9fT0JKRUNUIChyZWFkZXIsICJHb3QgdHlwZSAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgLyogdHlwZWZpbmQgZm91bmQgYSB0eXBlLiBMb29rIGZvciB0aGUgZGVtdXhlciB0byBoYW5kbGUgaXQgKi8KKyAgZGVtdXggPSByZWFkZXItPmRlbXV4ID0gZmluZF9kZW11eGVyIChjYXBzKTsKKyAgaWYgKHJlYWRlci0+ZGVtdXggPT0gTlVMTCkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJlYWRlciwgIkZhaWxlZCB0byBjcmVhdGUgZGVtdXhlciBlbGVtZW50Iik7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogQ29ubmVjdCB0byBkZW11eCBzaWduYWxzICovCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGRlbXV4LAorICAgICAgInBhZC1hZGRlZCIsIEdfQ0FMTEJBQ0sgKG5ld19kZWNvZGVkX3BhZF9hZGRlZF9jYiksIHJlYWRlcik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGRlbXV4LCAibm8tbW9yZS1wYWRzIiwgR19DQUxMQkFDSyAobm9fbW9yZV9wYWRzKSwgcmVhZGVyKTsKKworICBnc3RfZWxlbWVudF9zZXRfbG9ja2VkX3N0YXRlIChkZW11eCwgVFJVRSk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOX0NBU1QgKHJlYWRlciksIGRlbXV4KTsKKyAgZ3N0X2VsZW1lbnRfbGlua19wYWRzIChyZWFkZXItPnR5cGVmaW5kLCAic3JjIiwgZGVtdXgsIE5VTEwpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHJlYWRlci0+ZGVtdXgsIEdTVF9TVEFURV9UQVJHRVQgKHJlYWRlcikpOworICBnc3RfZWxlbWVudF9zZXRfbG9ja2VkX3N0YXRlIChkZW11eCwgRkFMU0UpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfaWZfcGFkc19jb2xsZWN0ZWQgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlcikKK3sKKyAgaWYgKHJlYWRlci0+cHJlcF9zdGF0ZSA9PSBQQVJUX1NUQVRFX1BSRVBBUklOR19DT0xMRUNUX1NUUkVBTVMpIHsKKyAgICAvKiBDaGVjayB3ZSBoYXZlIGFsbCBwYWRzIGFuZCBlYWNoIHBhZCBoYXMgc2VlbiBhIGJ1ZmZlciAqLworICAgIGlmIChyZWFkZXItPm5vX21vcmVfcGFkcyAmJiBzcGxpdG11eF9wYXJ0X2lzX3ByZXJvbGxlZF9sb2NrZWQgKHJlYWRlcikpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJlYWRlciwKKyAgICAgICAgICAibm8gbW9yZSBwYWRzIC0gZmlsZSAlcy4gTWVhc3VyaW5nIHN0cmVhbSBsZW5ndGgiLCByZWFkZXItPnBhdGgpOworICAgICAgcmVhZGVyLT5wcmVwX3N0YXRlID0gUEFSVF9TVEFURV9QUkVQQVJJTkdfTUVBU1VSRV9TVFJFQU1TOworICAgICAgU1BMSVRNVVhfUEFSVF9CUk9BRENBU1QgKHJlYWRlcik7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitub19tb3JlX3BhZHMgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIpCit7CisgIEdzdENsb2NrVGltZSBkdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIEdMaXN0ICpjdXI7CisgIC8qIFF1ZXJ5IHRoZSBtaW5pbXVtIGR1cmF0aW9uIG9mIGFueSBwYWQgaW4gdGhpcyBwaWVjZSBhbmQgc3RvcmUgaXQuCisgICAqIEZJWE1FOiBPbmx5IGNvbnNpZGVyIGF1ZGlvIGFuZCB2aWRlbyAqLworICBTUExJVE1VWF9QQVJUX0xPQ0sgKHJlYWRlcik7CisgIGZvciAoY3VyID0gZ19saXN0X2ZpcnN0IChyZWFkZXItPnBhZHMpOyBjdXIgIT0gTlVMTDsgY3VyID0gZ19saXN0X25leHQgKGN1cikpIHsKKyAgICBHc3RQYWQgKnRhcmdldCA9IEdTVF9QQURfQ0FTVCAoY3VyLT5kYXRhKTsKKyAgICBpZiAodGFyZ2V0KSB7CisgICAgICBnaW50NjQgY3VyX2R1cmF0aW9uOworICAgICAgaWYgKGdzdF9wYWRfcGVlcl9xdWVyeV9kdXJhdGlvbiAodGFyZ2V0LCBHU1RfRk9STUFUX1RJTUUsICZjdXJfZHVyYXRpb24pKSB7CisgICAgICAgIEdTVF9JTkZPX09CSkVDVCAocmVhZGVyLAorICAgICAgICAgICAgImZpbGUgJXMgcGFkICUiIEdTVF9QVFJfRk9STUFUICIgZHVyYXRpb24gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgcmVhZGVyLT5wYXRoLCB0YXJnZXQsIEdTVF9USU1FX0FSR1MgKGN1cl9kdXJhdGlvbikpOworICAgICAgICBpZiAoY3VyX2R1cmF0aW9uIDwgZHVyYXRpb24pCisgICAgICAgICAgZHVyYXRpb24gPSBjdXJfZHVyYXRpb247CisgICAgICB9CisgICAgfQorICB9CisgIEdTVF9JTkZPX09CSkVDVCAocmVhZGVyLCAiZmlsZSAlcyBkdXJhdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICByZWFkZXItPnBhdGgsIEdTVF9USU1FX0FSR1MgKGR1cmF0aW9uKSk7CisgIHJlYWRlci0+ZHVyYXRpb24gPSAoR3N0Q2xvY2tUaW1lKSBkdXJhdGlvbjsKKworICByZWFkZXItPm5vX21vcmVfcGFkcyA9IFRSVUU7CisKKyAgY2hlY2tfaWZfcGFkc19jb2xsZWN0ZWQgKHJlYWRlcik7CisgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworfQorCitnYm9vbGVhbgorZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NyY19xdWVyeSAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcGFydCwKKyAgICBHc3RQYWQgKiBzcmNfcGFkLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RQYWQgKnRhcmdldCA9IE5VTEw7CisgIGdib29sZWFuIHJldDsKKyAgR0xpc3QgKmN1cjsKKworICBTUExJVE1VWF9QQVJUX0xPQ0sgKHBhcnQpOworICAvKiBGaW5kIHRoZSBwYWQgY29ycmVzcG9uZGluZyB0byB0aGUgdmlzaWJsZSBvdXRwdXQgdGFyZ2V0IHBhZCAqLworICBmb3IgKGN1ciA9IGdfbGlzdF9maXJzdCAocGFydC0+cGFkcyk7IGN1ciAhPSBOVUxMOyBjdXIgPSBnX2xpc3RfbmV4dCAoY3VyKSkgeworICAgIEdzdFNwbGl0TXV4UGFydFBhZCAqcGFydF9wYWQgPSBTUExJVE1VWF9QQVJUX1BBRF9DQVNUIChjdXItPmRhdGEpOworICAgIGlmIChwYXJ0X3BhZC0+dGFyZ2V0ID09IHNyY19wYWQpIHsKKyAgICAgIHRhcmdldCA9IGdzdF9vYmplY3RfcmVmIChHU1RfT0JKRUNUX0NBU1QgKHBhcnRfcGFkKSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgU1BMSVRNVVhfUEFSVF9VTkxPQ0sgKHBhcnQpOworCisgIGlmICh0YXJnZXQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0ID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5ICh0YXJnZXQsIHF1ZXJ5KTsKKworICBpZiAocmV0ID09IEZBTFNFKQorICAgIGdvdG8gb3V0OworCisgIC8qIFBvc3QtbWFzc2FnaW5nIG9mIHF1ZXJpZXMgKi8KKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfUE9TSVRJT046eworICAgICAgR3N0Rm9ybWF0IGZtdDsKKyAgICAgIGdpbnQ2NCBwb3NpdGlvbjsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3Bvc2l0aW9uIChxdWVyeSwgJmZtdCwgJnBvc2l0aW9uKTsKKyAgICAgIGlmIChmbXQgIT0gR1NUX0ZPUk1BVF9USU1FKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBTUExJVE1VWF9QQVJUX0xPQ0sgKHBhcnQpOworICAgICAgcG9zaXRpb24gKz0gcGFydC0+c3RhcnRfb2Zmc2V0OworICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhcnQsICJQb3NpdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocG9zaXRpb24pKTsKKyAgICAgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChwYXJ0KTsKKworICAgICAgZ3N0X3F1ZXJ5X3NldF9wb3NpdGlvbiAocXVlcnksIGZtdCwgcG9zaXRpb24pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCitvdXQ6CisgIGdzdF9vYmplY3RfdW5yZWYgKHRhcmdldCk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RTcGxpdE11eFBhcnRSZWFkZXIgKnJlYWRlciA9IChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKikgZWxlbWVudDsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWTp7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDp7CisgICAgICAvKiBIb2xkIHRoZSBzcGxpdG11eCB0eXBlIGxvY2sgdW50aWwgYWZ0ZXIgdGhlCisgICAgICAgKiBwYXJlbnQgc3RhdGUgY2hhbmdlIGZ1bmN0aW9uIGhhcyBmaW5pc2hlZAorICAgICAgICogY2hhbmdpbmcgdGhlIHN0YXRlcyBvZiB0aGluZ3MsIGFuZCB0eXBlIGZpbmRpbmcgY2FuIGNvbnRpbnVlICovCisgICAgICBTUExJVE1VWF9QQVJUX0xPQ0sgKHJlYWRlcik7CisgICAgICBnX29iamVjdF9zZXQgKHJlYWRlci0+c3JjLCAibG9jYXRpb24iLCByZWFkZXItPnBhdGgsIE5VTEwpOworICAgICAgcmVhZGVyLT5wcmVwX3N0YXRlID0gUEFSVF9TVEFURV9QUkVQQVJJTkdfQ09MTEVDVF9TVFJFQU1TOworICAgICAgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NldF9mbHVzaGluZ19sb2NrZWQgKHJlYWRlciwgRkFMU0UpOworICAgICAgcmVhZGVyLT5ydW5uaW5nID0gVFJVRTsKKyAgICAgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworICAgICAgU1BMSVRNVVhfUEFSVF9UWVBFX0xPQ0sgKHJlYWRlcik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIFNQTElUTVVYX1BBUlRfTE9DSyAocmVhZGVyKTsKKyAgICAgIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9zZXRfZmx1c2hpbmdfbG9ja2VkIChyZWFkZXIsIFRSVUUpOworICAgICAgcmVhZGVyLT5ydW5uaW5nID0gRkFMU0U7CisgICAgICBTUExJVE1VWF9QQVJUX0JST0FEQ0FTVCAocmVhZGVyKTsKKyAgICAgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgU1BMSVRNVVhfUEFSVF9MT0NLIChyZWFkZXIpOworICAgICAgcmVhZGVyLT5hY3RpdmUgPSBGQUxTRTsKKyAgICAgIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9zZXRfZmx1c2hpbmdfbG9ja2VkIChyZWFkZXIsIFRSVUUpOworICAgICAgU1BMSVRNVVhfUEFSVF9CUk9BRENBU1QgKHJlYWRlcik7CisgICAgICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkgeworICAgIGlmICh0cmFuc2l0aW9uID09IEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEKSB7CisgICAgICAvKiBNYWtlIHN1cmUgdG8gcmVsZWFzZSB0aGUgbG9jayB3ZSB0b29rIGFib3ZlICovCisgICAgICBTUExJVE1VWF9QQVJUX1RZUEVfVU5MT0NLIChyZWFkZXIpOworICAgIH0KKyAgICBnb3RvIGJlYWNoOworICB9CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIC8qIFNsZWVwIGFuZCB3YWl0IHVudGlsIGFsbCBzdHJlYW1zIGhhdmUgYmVlbiBjb2xsZWN0ZWQsIHRoZW4gZG8gdGhlIHNlZWtzCisgICAgICAgKiB0byBtZWFzdXJlIHRoZSBzdHJlYW0gbGVuZ3Rocy4gVGhpcyB0b29rIHRoZSB0eXBlIGxvY2sgYWJvdmUsCisgICAgICAgKiBidXQgaXQncyBPSyB0byByZWxlYXNlIGl0IG5vdyBhbmQgbGV0IHR5cGVmaW5kaW5nIGhhcHBlbi4uLiAqLworICAgICAgU1BMSVRNVVhfUEFSVF9UWVBFX1VOTE9DSyAocmVhZGVyKTsKKworICAgICAgU1BMSVRNVVhfUEFSVF9MT0NLIChyZWFkZXIpOworCisgICAgICB3aGlsZSAocmVhZGVyLT5wcmVwX3N0YXRlID09IFBBUlRfU1RBVEVfUFJFUEFSSU5HX0NPTExFQ1RfU1RSRUFNUykgeworICAgICAgICBHU1RfTE9HX09CSkVDVCAocmVhZGVyLCAiV2FpdGluZyB0byBjb2xsZWN0IGFsbCBvdXRwdXQgc3RyZWFtcyIpOworICAgICAgICBTUExJVE1VWF9QQVJUX1dBSVQgKHJlYWRlcik7CisgICAgICB9CisKKyAgICAgIGlmIChyZWFkZXItPnByZXBfc3RhdGUgPT0gUEFSVF9TVEFURV9QUkVQQVJJTkdfTUVBU1VSRV9TVFJFQU1TIHx8CisgICAgICAgICAgcmVhZGVyLT5wcmVwX3N0YXRlID09IFBBUlRfU1RBVEVfUFJFUEFSSU5HX1JFU0VUX0ZPUl9SRUFEWSkgeworICAgICAgICBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfbWVhc3VyZV9zdHJlYW1zIChyZWFkZXIpOworICAgICAgfSBlbHNlIGlmIChyZWFkZXItPnByZXBfc3RhdGUgPT0gUEFSVF9TVEFURV9GQUlMRUQpCisgICAgICAgIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRTsKKyAgICAgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19QTEFZSU5HOgorICAgICAgU1BMSVRNVVhfUEFSVF9MT0NLIChyZWFkZXIpOworICAgICAgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NldF9mbHVzaGluZ19sb2NrZWQgKHJlYWRlciwgRkFMU0UpOworICAgICAgcmVhZGVyLT5hY3RpdmUgPSBUUlVFOworICAgICAgU1BMSVRNVVhfUEFSVF9CUk9BRENBU1QgKHJlYWRlcik7CisgICAgICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgcmVhZGVyLT5wcmVwX3N0YXRlID0gUEFSVF9TVEFURV9OVUxMOworICAgICAgc3BsaXRtdXhfcGFydF9yZWFkZXJfcmVzZXQgKHJlYWRlcik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworYmVhY2g6CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorY2hlY2tfYnVzX21lc3NhZ2VzIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiBwYXJ0KQoreworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKyAgR3N0QnVzICpidXM7CisgIEdzdE1lc3NhZ2UgKm07CisKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAoR1NUX0VMRU1FTlRfQ0FTVCAocGFydCkpOworICB3aGlsZSAoKG0gPSBnc3RfYnVzX3BvcCAoYnVzKSkgIT0gTlVMTCkgeworICAgIGlmIChHU1RfTUVTU0FHRV9UWVBFIChtKSA9PSBHU1RfTUVTU0FHRV9FUlJPUikgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhcnQsICJHb3QgZXJyb3IgbWVzc2FnZSB3aGlsZSBwcmVwYXJpbmcuIEZhaWxpbmcuIik7CisgICAgICBnc3RfbWVzc2FnZV91bnJlZiAobSk7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIGdzdF9tZXNzYWdlX3VucmVmIChtKTsKKyAgfQorICByZXQgPSBUUlVFOworZG9uZToKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9wcmVwYXJlIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiBwYXJ0KQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcmV0ID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChHU1RfRUxFTUVOVF9DQVNUIChwYXJ0KSwgR1NUX1NUQVRFX1BBVVNFRCk7CisKKyAgaWYgKHJldCAhPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBjaGVja19idXNfbWVzc2FnZXMgKHBhcnQpOworfQorCit2b2lkCitnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfdW5wcmVwYXJlIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiBwYXJ0KQoreworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKEdTVF9FTEVNRU5UX0NBU1QgKHBhcnQpLCBHU1RfU1RBVEVfTlVMTCk7Cit9CisKK3ZvaWQKK2dzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9zZXRfbG9jYXRpb24gKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlciwKKyAgICBjb25zdCBnY2hhciAqIHBhdGgpCit7CisgIHJlYWRlci0+cGF0aCA9IGdfc3RyZHVwIChwYXRoKTsKK30KKworZ2Jvb2xlYW4KK2dzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9hY3RpdmF0ZSAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcmVhZGVyLAorICAgIEdzdFNlZ21lbnQgKiBzZWcsIEdzdFNlZWtGbGFncyBleHRyYV9mbGFncykKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAocmVhZGVyLCAiQWN0aXZhdGluZyBwYXJ0IHJlYWRlciIpOworCisgIGlmICghZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NlZWtfdG9fc2VnbWVudCAocmVhZGVyLCBzZWcsIGV4dHJhX2ZsYWdzKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJlYWRlciwgIkZhaWxlZCB0byBzZWVrIHBhcnQgdG8gJSIgR1NUX1NFR01FTlRfRk9STUFULAorICAgICAgICBzZWcpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChHU1RfRUxFTUVOVF9DQVNUIChyZWFkZXIpLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChyZWFkZXIsICJGYWlsZWQgdG8gc2V0IHN0YXRlIHRvIFBMQVlJTkciKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfaXNfYWN0aXZlIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiBwYXJ0KQoreworICBnYm9vbGVhbiByZXQ7CisKKyAgU1BMSVRNVVhfUEFSVF9MT0NLIChwYXJ0KTsKKyAgcmV0ID0gcGFydC0+YWN0aXZlOworICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocGFydCk7CisKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZAorZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2RlYWN0aXZhdGUgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlcikKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAocmVhZGVyLCAiRGVhY3RpdmF0aW5nIHJlYWRlciIpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKEdTVF9FTEVNRU5UX0NBU1QgKHJlYWRlciksIEdTVF9TVEFURV9QQVVTRUQpOworfQorCit2b2lkCitnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfc2V0X2ZsdXNoaW5nX2xvY2tlZCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcmVhZGVyLAorICAgIGdib29sZWFuIGZsdXNoaW5nKQoreworICBHTGlzdCAqY3VyOworCisgIEdTVF9MT0dfT0JKRUNUIChyZWFkZXIsICIlcyBkYXRhcXVldWVzIiwKKyAgICAgIGZsdXNoaW5nID8gIkZsdXNoaW5nIiA6ICJEb25lIGZsdXNoaW5nIik7CisgIGZvciAoY3VyID0gZ19saXN0X2ZpcnN0IChyZWFkZXItPnBhZHMpOyBjdXIgIT0gTlVMTDsgY3VyID0gZ19saXN0X25leHQgKGN1cikpIHsKKyAgICBHc3RTcGxpdE11eFBhcnRQYWQgKnBhcnRfcGFkID0gU1BMSVRNVVhfUEFSVF9QQURfQ0FTVCAoY3VyLT5kYXRhKTsKKyAgICBnc3RfZGF0YV9xdWV1ZV9zZXRfZmx1c2hpbmcgKHBhcnRfcGFkLT5xdWV1ZSwgZmx1c2hpbmcpOworICAgIGlmIChmbHVzaGluZykKKyAgICAgIGdzdF9kYXRhX3F1ZXVlX2ZsdXNoIChwYXJ0X3BhZC0+cXVldWUpOworICB9Cit9OworCit2b2lkCitnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfc2V0X2NhbGxiYWNrcyAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcmVhZGVyLAorICAgIGdwb2ludGVyIGNiX2RhdGEsIEdzdFNwbGl0TXV4UGFydFJlYWRlclBhZENiIGdldF9wYWRfY2IpCit7CisgIHJlYWRlci0+Y2JfZGF0YSA9IGNiX2RhdGE7CisgIHJlYWRlci0+Z2V0X3BhZF9jYiA9IGdldF9wYWRfY2I7Cit9CisKK0dzdENsb2NrVGltZQorZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2dldF9lbmRfb2Zmc2V0IChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIpCit7CisgIEdMaXN0ICpjdXI7CisgIEdzdENsb2NrVGltZSByZXQgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIFNQTElUTVVYX1BBUlRfTE9DSyAocmVhZGVyKTsKKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHJlYWRlci0+cGFkcyk7IGN1ciAhPSBOVUxMOyBjdXIgPSBnX2xpc3RfbmV4dCAoY3VyKSkgeworICAgIEdzdFNwbGl0TXV4UGFydFBhZCAqcGFydF9wYWQgPSBTUExJVE1VWF9QQVJUX1BBRF9DQVNUIChjdXItPmRhdGEpOworICAgIGlmICghcGFydF9wYWQtPmlzX3NwYXJzZSAmJiBwYXJ0X3BhZC0+bWF4X3RzIDwgcmV0KQorICAgICAgcmV0ID0gcGFydF9wYWQtPm1heF90czsKKyAgfQorCisgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworCisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQKK2dzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9zZXRfc3RhcnRfb2Zmc2V0IChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIsCisgICAgR3N0Q2xvY2tUaW1lIG9mZnNldCkKK3sKKyAgU1BMSVRNVVhfUEFSVF9MT0NLIChyZWFkZXIpOworICByZWFkZXItPnN0YXJ0X29mZnNldCA9IG9mZnNldDsKKyAgR1NUX0lORk9fT0JKRUNUIChyZWFkZXIsICJUUyBvZmZzZXQgbm93ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKG9mZnNldCkpOworICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKK30KKworR3N0Q2xvY2tUaW1lCitnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfZ2V0X3N0YXJ0X29mZnNldCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcmVhZGVyKQoreworICBHc3RDbG9ja1RpbWUgcmV0ID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBTUExJVE1VWF9QQVJUX0xPQ0sgKHJlYWRlcik7CisgIHJldCA9IHJlYWRlci0+c3RhcnRfb2Zmc2V0OworICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKKworICByZXR1cm4gcmV0OworfQorCitHc3RDbG9ja1RpbWUKK2dzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9nZXRfZHVyYXRpb24gKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlcikKK3sKKyAgR3N0Q2xvY2tUaW1lIGR1cjsKKworICBTUExJVE1VWF9QQVJUX0xPQ0sgKHJlYWRlcik7CisgIGR1ciA9IHJlYWRlci0+ZHVyYXRpb247CisgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworCisgIHJldHVybiBkdXI7Cit9CisKK0dzdFBhZCAqCitnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfbG9va3VwX3BhZCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcmVhZGVyLAorICAgIEdzdFBhZCAqIHRhcmdldCkKK3sKKyAgR3N0UGFkICpyZXN1bHQgPSBOVUxMOworICBHTGlzdCAqY3VyOworCisgIFNQTElUTVVYX1BBUlRfTE9DSyAocmVhZGVyKTsKKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHJlYWRlci0+cGFkcyk7IGN1ciAhPSBOVUxMOyBjdXIgPSBnX2xpc3RfbmV4dCAoY3VyKSkgeworICAgIEdzdFNwbGl0TXV4UGFydFBhZCAqcGFydF9wYWQgPSBTUExJVE1VWF9QQVJUX1BBRF9DQVNUIChjdXItPmRhdGEpOworICAgIGlmIChwYXJ0X3BhZC0+dGFyZ2V0ID09IHRhcmdldCkgeworICAgICAgcmVzdWx0ID0gKEdzdFBhZCAqKSBnc3Rfb2JqZWN0X3JlZiAocGFydF9wYWQpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK0dzdEZsb3dSZXR1cm4KK2dzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9wb3AgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlciwgR3N0UGFkICogcGFkLAorICAgIEdzdERhdGFRdWV1ZUl0ZW0gKiogaXRlbSkKK3sKKyAgR3N0U3BsaXRNdXhQYXJ0UGFkICpwYXJ0X3BhZCA9IChHc3RTcGxpdE11eFBhcnRQYWQgKikgKHBhZCk7CisgIEdzdERhdGFRdWV1ZSAqcTsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgLyogR2V0IG9uZSBpdGVtIGZyb20gdGhlIGFwcHJvcHJpYXRlIGRhdGFxdWV1ZSAqLworICBTUExJVE1VWF9QQVJUX0xPQ0sgKHJlYWRlcik7CisgIGlmIChyZWFkZXItPnByZXBfc3RhdGUgPT0gUEFSVF9TVEFURV9GQUlMRUQpIHsKKyAgICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KKworICBxID0gZ3N0X29iamVjdF9yZWYgKHBhcnRfcGFkLT5xdWV1ZSk7CisKKyAgLyogSGF2ZSB0byBkcm9wIHRoZSBsb2NrIGFyb3VuZCBwb3AsIHNvIHdlIGNhbiBiZSB3b2tlbiB1cCBmb3IgZmx1c2ggKi8KKyAgU1BMSVRNVVhfUEFSVF9VTkxPQ0sgKHJlYWRlcik7CisgIGlmICghZ3N0X2RhdGFfcXVldWVfcG9wIChxLCBpdGVtKSB8fCAoKml0ZW0gPT0gTlVMTCkpIHsKKyAgICByZXQgPSBHU1RfRkxPV19GTFVTSElORzsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIFNQTElUTVVYX1BBUlRfTE9DSyAocmVhZGVyKTsKKworICBTUExJVE1VWF9QQVJUX0JST0FEQ0FTVCAocmVhZGVyKTsKKyAgaWYgKEdTVF9JU19FVkVOVCAoKCppdGVtKS0+b2JqZWN0KSkgeworICAgIEdzdEV2ZW50ICplID0gKEdzdEV2ZW50ICopICgoKml0ZW0pLT5vYmplY3QpOworICAgIC8qIE1hcmsgdGhpcyBwYWQgYXMgRU9TICovCisgICAgaWYgKEdTVF9FVkVOVF9UWVBFIChlKSA9PSBHU1RfRVZFTlRfRU9TKQorICAgICAgcGFydF9wYWQtPmlzX2VvcyA9IFRSVUU7CisgIH0KKworICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKKworICByZXQgPSBHU1RfRkxPV19PSzsKK291dDoKKyAgZ3N0X29iamVjdF91bnJlZiAocSk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfaGFuZGxlciAoR3N0QmluICogYmluLCBHc3RNZXNzYWdlICogbWVzc2FnZSkKK3sKKyAgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpyZWFkZXIgPSAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICopIGJpbjsKKworICBzd2l0Y2ggKEdTVF9NRVNTQUdFX1RZUEUgKG1lc3NhZ2UpKSB7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FUlJPUjoKKyAgICAgIC8qIE1ha2Ugc3VyZSB0byBzZXQgdGhlIHN0YXRlIHRvIGZhaWxlZCBhbmQgd2FrZSB1cCB0aGUgbGlzdGVuZXIKKyAgICAgICAqIG9uIGVycm9yICovCisgICAgICBTUExJVE1VWF9QQVJUX0xPQ0sgKHJlYWRlcik7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChyZWFkZXIsICJHb3QgZXJyb3IgbWVzc2FnZSBmcm9tIGNoaWxkICUiIEdTVF9QVFJfRk9STUFUCisgICAgICAgICAgIiBtYXJraW5nIHRoaXMgcmVhZGVyIGFzIGZhaWxlZCIsIEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSkpOworICAgICAgcmVhZGVyLT5wcmVwX3N0YXRlID0gUEFSVF9TVEFURV9GQUlMRUQ7CisgICAgICBTUExJVE1VWF9QQVJUX0JST0FEQ0FTVCAocmVhZGVyKTsKKyAgICAgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgR1NUX0JJTl9DTEFTUyAocGFyZW50X2NsYXNzKS0+aGFuZGxlX21lc3NhZ2UgKGJpbiwgbWVzc2FnZSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4cGFydHJlYWRlci5oIGIvZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2I4YjVjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuaApAQCAtMCwwICsxLDExOSBAQAorLyogR1N0cmVhbWVyIFNwbGl0IE11eGVkIEZpbGUgU291cmNlIC0gUGFydCByZWFkZXIKKyAqIENvcHlyaWdodCAoQykgMjAxNCBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmbmRlZiBfX0dTVF9TUExJVE1VWF9QQVJUX1JFQURFUl9IX18KKyNkZWZpbmUgX19HU1RfU1BMSVRNVVhfUEFSVF9SRUFERVJfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0ZGF0YXF1ZXVlLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9TUExJVE1VWF9QQVJUX1JFQURFUiBcCisgIChnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1NQTElUTVVYX1BBUlRfUkVBREVSKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfU1BMSVRNVVhfUEFSVF9SRUFERVIsR3N0U3BsaXRNdXhTcmMpKQorI2RlZmluZSBHU1RfU1BMSVRNVVhfUEFSVF9SRUFERVJfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfU1BMSVRNVVhfUEFSVF9SRUFERVIsR3N0U3BsaXRNdXhTcmNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19TUExJVE1VWF9QQVJUX1JFQURFUihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1NQTElUTVVYX1BBUlRfUkVBREVSKSkKKyNkZWZpbmUgR1NUX0lTX1NQTElUTVVYX1BBUlRfUkVBREVSX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1NQTElUTVVYX1BBUlRfUkVBREVSKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFNwbGl0TXV4UGFydFJlYWRlciBHc3RTcGxpdE11eFBhcnRSZWFkZXI7Cit0eXBlZGVmIHN0cnVjdCBfR3N0U3BsaXRNdXhQYXJ0UmVhZGVyQ2xhc3MgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyQ2xhc3M7Cit0eXBlZGVmIHN0cnVjdCBfU3BsaXRNdXhTcmNQYWQgU3BsaXRNdXhTcmNQYWQ7Cit0eXBlZGVmIHN0cnVjdCBfU3BsaXRNdXhTcmNQYWRDbGFzcyBTcGxpdE11eFNyY1BhZENsYXNzOworCit0eXBlZGVmIGVudW0KK3sKKyAgUEFSVF9TVEFURV9OVUxMLAorICBQQVJUX1NUQVRFX1BSRVBBUklOR19DT0xMRUNUX1NUUkVBTVMsCisgIFBBUlRfU1RBVEVfUFJFUEFSSU5HX01FQVNVUkVfU1RSRUFNUywKKyAgUEFSVF9TVEFURV9QUkVQQVJJTkdfUkVTRVRfRk9SX1JFQURZLAorICBQQVJUX1NUQVRFX1JFQURZLAorICBQQVJUX1NUQVRFX0ZBSUxFRCwKK30gR3N0U3BsaXRNdXhQYXJ0U3RhdGU7CisKK3R5cGVkZWYgR3N0UGFkICooKkdzdFNwbGl0TXV4UGFydFJlYWRlclBhZENiKShHc3RTcGxpdE11eFBhcnRSZWFkZXIgKnJlYWRlciwgR3N0UGFkICpzcmNfcGFkLCBncG9pbnRlciBjYl9kYXRhKTsKKworc3RydWN0IF9Hc3RTcGxpdE11eFBhcnRSZWFkZXIKK3sKKyAgR3N0UGlwZWxpbmUgcGFyZW50OworCisgIEdzdFNwbGl0TXV4UGFydFN0YXRlIHByZXBfc3RhdGU7CisKKyAgZ2NoYXIgKnBhdGg7CisKKyAgR3N0RWxlbWVudCAqc3JjOworICBHc3RFbGVtZW50ICp0eXBlZmluZDsKKyAgR3N0RWxlbWVudCAqZGVtdXg7CisKKyAgZ2Jvb2xlYW4gYWN0aXZlOworICBnYm9vbGVhbiBydW5uaW5nOworICBnYm9vbGVhbiBwcmVwYXJlZDsKKyAgZ2Jvb2xlYW4gZmx1c2hpbmc7CisgIGdib29sZWFuIG5vX21vcmVfcGFkczsKKworICBHc3RDbG9ja1RpbWUgZHVyYXRpb247CisgIEdzdENsb2NrVGltZSBzdGFydF9vZmZzZXQ7CisKKyAgR0xpc3QgKnBhZHM7CisKKyAgR0NvbmQgaW5hY3RpdmVfY29uZDsKKyAgR011dGV4IGxvY2s7CisgIEdNdXRleCB0eXBlX2xvY2s7CisKKyAgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyUGFkQ2IgZ2V0X3BhZF9jYjsKKyAgZ3BvaW50ZXIgY2JfZGF0YTsKK307CisKK3N0cnVjdCBfR3N0U3BsaXRNdXhQYXJ0UmVhZGVyQ2xhc3MKK3sKKyAgR3N0UGlwZWxpbmVDbGFzcyBwYXJlbnRfY2xhc3M7CisKKyAgdm9pZCAoKnByZXBhcmVkKSAgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqcmVhZGVyKTsKKyAgdm9pZCAoKmVuZF9vZl9wYXJ0KSAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpyZWFkZXIpOworfTsKKworR1R5cGUgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2dldF90eXBlICh2b2lkKTsKKwordm9pZCBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfc2V0X2NhbGxiYWNrcyAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpyZWFkZXIsCisgICAgZ3BvaW50ZXIgY2JfZGF0YSwgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyUGFkQ2IgZ2V0X3BhZF9jYik7CitnYm9vbGVhbiBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfcHJlcGFyZSAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpwYXJ0KTsKK3ZvaWQgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3VucHJlcGFyZSAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpwYXJ0KTsKK3ZvaWQgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NldF9sb2NhdGlvbiAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpyZWFkZXIsCisgICAgY29uc3QgZ2NoYXIgKnBhdGgpOworZ2Jvb2xlYW4gZ3N0X3NwbGl0bXV4X3BhcnRfaXNfZW9zIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKnJlYWRlcik7CisKK2dib29sZWFuIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9hY3RpdmF0ZSAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpwYXJ0LCBHc3RTZWdtZW50ICpzZWcsIEdzdFNlZWtGbGFncyBleHRyYV9mbGFncyk7Cit2b2lkIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9kZWFjdGl2YXRlIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKnBhcnQpOworZ2Jvb2xlYW4gZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2lzX2FjdGl2ZSAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpwYXJ0KTsKKworZ2Jvb2xlYW4gZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NyY19xdWVyeSAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpwYXJ0LCBHc3RQYWQgKnNyY19wYWQsIEdzdFF1ZXJ5ICogcXVlcnkpOwordm9pZCBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfc2V0X3N0YXJ0X29mZnNldCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpwYXJ0LCBHc3RDbG9ja1RpbWUgb2Zmc2V0KTsKK0dzdENsb2NrVGltZSBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfZ2V0X3N0YXJ0X29mZnNldCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpwYXJ0KTsKK0dzdENsb2NrVGltZSBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfZ2V0X2VuZF9vZmZzZXQgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqcGFydCk7CitHc3RDbG9ja1RpbWUgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2dldF9kdXJhdGlvbiAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcmVhZGVyKTsKKworR3N0UGFkICpnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfbG9va3VwX3BhZCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpyZWFkZXIsIEdzdFBhZCAqdGFyZ2V0KTsKK0dzdEZsb3dSZXR1cm4gZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3BvcCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpyZWFkZXIsIEdzdFBhZCAqcGFydF9wYWQsIEdzdERhdGFRdWV1ZUl0ZW0gKiogaXRlbSk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYyBiL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUzNzkzMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmMKQEAgLTAsMCArMSwyNTAwIEBACisvKiBHU3RyZWFtZXIgTXV4ZXIgYmluIHRoYXQgc3BsaXRzIG91dHB1dCBzdHJlYW0gYnkgc2l6ZS90aW1lCisgKiBDb3B5cmlnaHQgKEMpIDwyMDE0PiBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1zcGxpdG11eHNpbmsKKyAqIEBzaG9ydF9kZXNjcmlwdGlvbjogTXV4ZXIgd3JhcHBlciBmb3Igc3BsaXR0aW5nIG91dHB1dCBzdHJlYW0gYnkgc2l6ZSBvciB0aW1lCisgKgorICogVGhpcyBlbGVtZW50IHdyYXBzIGEgbXV4ZXIgYW5kIGEgc2luaywgYW5kIHN0YXJ0cyBhIG5ldyBmaWxlIHdoZW4gdGhlIG11eAorICogY29udGVudHMgYXJlIGFib3V0IHRvIGNyb3NzIGEgdGhyZXNob2xkIG9mIG1heGltdW0gc2l6ZSBvZiBtYXhpbXVtIHRpbWUsCisgKiBzcGxpdHRpbmcgYXQgdmlkZW8ga2V5ZnJhbWUgYm91bmRhcmllcy4gRXhhY3RseSBvbmUgaW5wdXQgdmlkZW8gc3RyZWFtCisgKiBjYW4gYmUgbXV4ZWQsIHdpdGggYXMgbWFueSBhY2NvbXBhbnlpbmcgYXVkaW8gYW5kIHN1YnRpdGxlIHN0cmVhbXMgYXMKKyAqIGRlc2lyZWQuCisgKgorICogQnkgZGVmYXVsdCwgaXQgdXNlcyBtcDRtdXggYW5kIGZpbGVzaW5rLCBidXQgdGhleSBjYW4gYmUgY2hhbmdlZCB2aWEKKyAqIHRoZSAnbXV4ZXInIGFuZCAnc2luaycgcHJvcGVydGllcy4KKyAqCisgKiBUaGUgbWluaW11bSBmaWxlIHNpemUgaXMgMSBHT1AsIGhvd2V2ZXIgLSBzbyBsaW1pdHMgbWF5IGJlIG92ZXJydW4gaWYgdGhlCisgKiBkaXN0YW5jZSBiZXR3ZWVuIGFueSAyIGtleWZyYW1lcyBpcyBsYXJnZXIgdGhhbiB0aGUgbGltaXRzLgorICoKKyAqIElmIGEgdmlkZW8gc3RyZWFtIGlzIGF2YWlsYWJsZSwgdGhlIHNwbGl0dGluZyBwcm9jZXNzIGlzIGRyaXZlbiBieSB0aGUgdmlkZW8KKyAqIHN0cmVhbSBjb250ZW50cywgYW5kIHRoZSB2aWRlbyBzdHJlYW0gbXVzdCBjb250YWluIGNsb3NlZCBHT1BzIGZvciB0aGUgb3V0cHV0CisgKiBmaWxlIHBhcnRzIHRvIGJlIHBsYXllZCBpbmRpdmlkdWFsbHkgY29ycmVjdGx5LiBJbiB0aGUgYWJzZW5jZSBvZiBhIHZpZGVvCisgKiBzdHJlYW0sIHRoZSBmaXJzdCBhdmFpbGFibGUgc3RyZWFtIGlzIHVzZWQgYXMgcmVmZXJlbmNlIGZvciBzeW5jaHJvbml6YXRpb24uCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtZSB2NGwyc3JjIG51bS1idWZmZXJzPTUwMCAhIHZpZGVvL3gtcmF3LHdpZHRoPTMyMCxoZWlnaHQ9MjQwICEgdmlkZW9jb252ZXJ0ICEgcXVldWUgISB0aW1lb3ZlcmxheSAhIHgyNjRlbmMga2V5LWludC1tYXg9MTAgISBoMjY0cGFyc2UgISBzcGxpdG11eHNpbmsgbG9jYXRpb249dmlkZW8lMDJkLm1vdiBtYXgtc2l6ZS10aW1lPTEwMDAwMDAwMDAwIG1heC1zaXplLWJ5dGVzPTEwMDAwMDAKKyAqIF18CisgKiBSZWNvcmRzIGEgdmlkZW8gc3RyZWFtIGNhcHR1cmVkIGZyb20gYSB2NGwyIGRldmljZSBhbmQgbXV4ZXMgaXQgaW50bworICogSVNPIG1wNCBmaWxlcywgc3BsaXR0aW5nIGFzIG5lZWRlZCB0byBsaW1pdCBzaXplL2R1cmF0aW9uIHRvIDEwIHNlY29uZHMKKyAqIGFuZCAxTUIgbWF4aW11bSBzaXplLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnbGliL2dzdGRpby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgImdzdHNwbGl0bXV4c2luay5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChzcGxpdG11eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBzcGxpdG11eF9kZWJ1ZworCisjZGVmaW5lIEdTVF9TUExJVE1VWF9MT0NLKHMpIGdfbXV0ZXhfbG9jaygmKHMpLT5sb2NrKQorI2RlZmluZSBHU1RfU1BMSVRNVVhfVU5MT0NLKHMpIGdfbXV0ZXhfdW5sb2NrKCYocyktPmxvY2spCisjZGVmaW5lIEdTVF9TUExJVE1VWF9XQUlUX0lOUFVUKHMpIGdfY29uZF93YWl0ICgmKHMpLT5pbnB1dF9jb25kLCAmKHMpLT5sb2NrKQorI2RlZmluZSBHU1RfU1BMSVRNVVhfQlJPQURDQVNUX0lOUFVUKHMpIGdfY29uZF9icm9hZGNhc3QgKCYocyktPmlucHV0X2NvbmQpCisKKyNkZWZpbmUgR1NUX1NQTElUTVVYX1dBSVRfT1VUUFVUKHMpIGdfY29uZF93YWl0ICgmKHMpLT5vdXRwdXRfY29uZCwgJihzKS0+bG9jaykKKyNkZWZpbmUgR1NUX1NQTElUTVVYX0JST0FEQ0FTVF9PVVRQVVQocykgZ19jb25kX2Jyb2FkY2FzdCAoJihzKS0+b3V0cHV0X2NvbmQpCisKK3N0YXRpYyB2b2lkIHNwbGl0X25vdyAoR3N0U3BsaXRNdXhTaW5rICogc3BsaXRtdXgpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MT0NBVElPTiwKKyAgUFJPUF9NQVhfU0laRV9USU1FLAorICBQUk9QX01BWF9TSVpFX0JZVEVTLAorICBQUk9QX01BWF9TSVpFX1RJTUVDT0RFLAorICBQUk9QX1NFTkRfS0VZRlJBTUVfUkVRVUVTVFMsCisgIFBST1BfTUFYX0ZJTEVTLAorICBQUk9QX01VWEVSX09WRVJIRUFELAorICBQUk9QX1VTRV9ST0JVU1RfTVVYSU5HLAorICBQUk9QX0FMSUdOTUVOVF9USFJFU0hPTEQsCisgIFBST1BfTVVYRVIsCisgIFBST1BfU0lOSworfTsKKworI2RlZmluZSBERUZBVUxUX01BWF9TSVpFX1RJTUUgICAgICAgMAorI2RlZmluZSBERUZBVUxUX01BWF9TSVpFX0JZVEVTICAgICAgMAorI2RlZmluZSBERUZBVUxUX01BWF9GSUxFUyAgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX01VWEVSX09WRVJIRUFEICAgICAgMC4wMgorI2RlZmluZSBERUZBVUxUX1NFTkRfS0VZRlJBTUVfUkVRVUVTVFMgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9BTElHTk1FTlRfVEhSRVNIT0xEIDAKKyNkZWZpbmUgREVGQVVMVF9NVVhFUiAibXA0bXV4IgorI2RlZmluZSBERUZBVUxUX1NJTksgImZpbGVzaW5rIgorI2RlZmluZSBERUZBVUxUX1VTRV9ST0JVU1RfTVVYSU5HIEZBTFNFCisKK2VudW0KK3sKKyAgU0lHTkFMX0ZPUk1BVF9MT0NBVElPTiwKKyAgU0lHTkFMX0ZPUk1BVF9MT0NBVElPTl9GVUxMLAorICBTSUdOQUxfU1BMSVRfTk9XLAorICBTSUdOQUxfTEFTVAorfTsKKworc3RhdGljIGd1aW50IHNpZ25hbHNbU0lHTkFMX0xBU1RdOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgdmlkZW9fc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInZpZGVvIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9SRVFVRVNULAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGF1ZGlvX3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJhdWRpb18ldSIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfUkVRVUVTVCwKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzdWJ0aXRsZV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3VidGl0bGVfJXUiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK3N0YXRpYyBHUXVhcmsgUEFEX0NPTlRFWFQ7CisKK3N0YXRpYyB2b2lkCitfZG9faW5pdCAodm9pZCkKK3sKKyAgUEFEX0NPTlRFWFQgPSBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyAoInBhZC1jb250ZXh0Iik7Cit9CisKKyNkZWZpbmUgZ3N0X3NwbGl0bXV4X3NpbmtfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9FWFRFTkRFRCAoR3N0U3BsaXRNdXhTaW5rLCBnc3Rfc3BsaXRtdXhfc2luaywgR1NUX1RZUEVfQklOLCAwLAorICAgIF9kb19pbml0ICgpKTsKKworc3RhdGljIGdib29sZWFuIGNyZWF0ZV9tdXhlciAoR3N0U3BsaXRNdXhTaW5rICogc3BsaXRtdXgpOworc3RhdGljIGdib29sZWFuIGNyZWF0ZV9zaW5rIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCk7CitzdGF0aWMgdm9pZCBnc3Rfc3BsaXRtdXhfc2lua19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3Rfc3BsaXRtdXhfc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3Rfc3BsaXRtdXhfc2lua19kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyB2b2lkIGdzdF9zcGxpdG11eF9zaW5rX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIEdzdFBhZCAqZ3N0X3NwbGl0bXV4X3NpbmtfcmVxdWVzdF9uZXdfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLCBjb25zdCBnY2hhciAqIG5hbWUsIGNvbnN0IEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyB2b2lkIGdzdF9zcGxpdG11eF9zaW5rX3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9zcGxpdG11eF9zaW5rX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyB2b2lkIGJ1c19oYW5kbGVyIChHc3RCaW4gKiBiaW4sIEdzdE1lc3NhZ2UgKiBtc2cpOworc3RhdGljIHZvaWQgc2V0X25leHRfZmlsZW5hbWUgKEdzdFNwbGl0TXV4U2luayAqIHNwbGl0bXV4LCBNcVN0cmVhbUN0eCAqIGN0eCk7CitzdGF0aWMgdm9pZCBzdGFydF9uZXh0X2ZyYWdtZW50IChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCwgTXFTdHJlYW1DdHggKiBjdHgpOworc3RhdGljIHZvaWQgbXFfc3RyZWFtX2N0eF91bnJlZiAoTXFTdHJlYW1DdHggKiBjdHgpOworc3RhdGljIHZvaWQgZ3Jvd19ibG9ja2VkX3F1ZXVlcyAoR3N0U3BsaXRNdXhTaW5rICogc3BsaXRtdXgpOworCitzdGF0aWMgdm9pZCBnc3Rfc3BsaXRtdXhfc2lua19lbnN1cmVfbWF4X2ZpbGVzIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCk7CitzdGF0aWMgR3N0RWxlbWVudCAqY3JlYXRlX2VsZW1lbnQgKEdzdFNwbGl0TXV4U2luayAqIHNwbGl0bXV4LAorICAgIGNvbnN0IGdjaGFyICogZmFjdG9yeSwgY29uc3QgZ2NoYXIgKiBuYW1lLCBnYm9vbGVhbiBsb2NrZWQpOworCitzdGF0aWMgdm9pZCBkb19hc3luY19kb25lIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCk7CisKK3N0YXRpYyBNcVN0cmVhbUJ1ZiAqCittcV9zdHJlYW1fYnVmX25ldyAodm9pZCkKK3sKKyAgcmV0dXJuIGdfc2xpY2VfbmV3MCAoTXFTdHJlYW1CdWYpOworfQorCitzdGF0aWMgdm9pZAorbXFfc3RyZWFtX2J1Zl9mcmVlIChNcVN0cmVhbUJ1ZiAqIGRhdGEpCit7CisgIGdfc2xpY2VfZnJlZSAoTXFTdHJlYW1CdWYsIGRhdGEpOworfQorCitzdGF0aWMgU3BsaXRNdXhPdXRwdXRDb21tYW5kICoKK291dF9jbWRfYnVmX25ldyAodm9pZCkKK3sKKyAgcmV0dXJuIGdfc2xpY2VfbmV3MCAoU3BsaXRNdXhPdXRwdXRDb21tYW5kKTsKK30KKworc3RhdGljIHZvaWQKK291dF9jbWRfYnVmX2ZyZWUgKFNwbGl0TXV4T3V0cHV0Q29tbWFuZCAqIGRhdGEpCit7CisgIGdfc2xpY2VfZnJlZSAoU3BsaXRNdXhPdXRwdXRDb21tYW5kLCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGxpdG11eF9zaW5rX2NsYXNzX2luaXQgKEdzdFNwbGl0TXV4U2lua0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdEJpbkNsYXNzICpnc3RiaW5fY2xhc3MgPSAoR3N0QmluQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3NwbGl0bXV4X3Npbmtfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfc3BsaXRtdXhfc2lua19nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3Rfc3BsaXRtdXhfc2lua19kaXNwb3NlOworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9zcGxpdG11eF9zaW5rX2ZpbmFsaXplOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiU3BsaXQgTXV4aW5nIEJpbiIsICJHZW5lcmljL0Jpbi9NdXhlciIsCisgICAgICAiQ29udmVuaWVuY2UgYmluIHRoYXQgbXV4ZXMgaW5jb21pbmcgc3RyZWFtcyBpbnRvIG11bHRpcGxlIHRpbWUvc2l6ZSBsaW1pdGVkIGZpbGVzIiwKKyAgICAgICJKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZ2aWRlb19zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmYXVkaW9fc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJnN1YnRpdGxlX3NpbmtfdGVtcGxhdGUpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NwbGl0bXV4X3NpbmtfY2hhbmdlX3N0YXRlKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cmVxdWVzdF9uZXdfcGFkID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3BsaXRtdXhfc2lua19yZXF1ZXN0X25ld19wYWQpOworICBnc3RlbGVtZW50X2NsYXNzLT5yZWxlYXNlX3BhZCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NwbGl0bXV4X3NpbmtfcmVsZWFzZV9wYWQpOworCisgIGdzdGJpbl9jbGFzcy0+aGFuZGxlX21lc3NhZ2UgPSBidXNfaGFuZGxlcjsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0xPQ0FUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImxvY2F0aW9uIiwgIkZpbGUgT3V0cHV0IFBhdHRlcm4iLAorICAgICAgICAgICJGb3JtYXQgc3RyaW5nIHBhdHRlcm4gZm9yIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZXMgdG8gd3JpdGUgKGUuZy4gdmlkZW8lMDVkLm1wNCkiLAorICAgICAgICAgIE5VTEwsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01VWEVSX09WRVJIRUFELAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoIm11eC1vdmVyaGVhZCIsICJNdXhpbmcgT3ZlcmhlYWQiLAorICAgICAgICAgICJFeHRyYSBzaXplIG92ZXJoZWFkIG9mIG11eGluZyAoMC4wMiA9IDIlKSIsIDAuMCwgMS4wLAorICAgICAgICAgIERFRkFVTFRfTVVYRVJfT1ZFUkhFQUQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX1NJWkVfVElNRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJtYXgtc2l6ZS10aW1lIiwgIk1heC4gc2l6ZSAobnMpIiwKKyAgICAgICAgICAiTWF4LiBhbW91bnQgb2YgdGltZSBwZXIgZmlsZSAoaW4gbnMsIDA9ZGlzYWJsZSkiLCAwLCBHX01BWFVJTlQ2NCwKKyAgICAgICAgICBERUZBVUxUX01BWF9TSVpFX1RJTUUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01BWF9TSVpFX0JZVEVTLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoIm1heC1zaXplLWJ5dGVzIiwgIk1heC4gc2l6ZSBieXRlcyIsCisgICAgICAgICAgIk1heC4gYW1vdW50IG9mIGRhdGEgcGVyIGZpbGUgKGluIGJ5dGVzLCAwPWRpc2FibGUpIiwgMCwgR19NQVhVSU5UNjQsCisgICAgICAgICAgREVGQVVMVF9NQVhfU0laRV9CWVRFUywgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX1NJWkVfVElNRUNPREUsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgibWF4LXNpemUtdGltZWNvZGUiLCAiTWF4aW11bSB0aW1lY29kZSBkaWZmZXJlbmNlIiwKKyAgICAgICAgICAiTWF4aW11bSBkaWZmZXJlbmNlIGluIHRpbWVjb2RlIGJldHdlZW4gZmlyc3QgYW5kIGxhc3QgZnJhbWUuICIKKyAgICAgICAgICAiU2VwYXJhdG9yIGlzIGFzc3VtZWQgdG8gYmUgXCI6XCIgZXZlcnl3aGVyZSAoZS5nLiAwMTowMDowMDowMCkuICIKKyAgICAgICAgICAiV2lsbCBvbmx5IGJlIGVmZmVjdGl2ZSBpZiBhIHRpbWVjb2RlIHRyYWNrIGlzIHByZXNlbnQuIiwKKyAgICAgICAgICBOVUxMLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TRU5EX0tFWUZSQU1FX1JFUVVFU1RTLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJzZW5kLWtleWZyYW1lLXJlcXVlc3RzIiwKKyAgICAgICAgICAiUmVxdWVzdCBrZXlmcmFtZXMgYXQgbWF4LXNpemUtdGltZSIsCisgICAgICAgICAgIlJlcXVlc3QgYSBrZXlmcmFtZSBldmVyeSBtYXgtc2l6ZS10aW1lIG5zIHRvIHRyeSBzcGxpdHRpbmcgYXQgdGhhdCBwb2ludC4gIgorICAgICAgICAgICJOZWVkcyBtYXgtc2l6ZS1ieXRlcyB0byBiZSAwIGluIG9yZGVyIHRvIGJlIGVmZmVjdGl2ZS4iLAorICAgICAgICAgIERFRkFVTFRfU0VORF9LRVlGUkFNRV9SRVFVRVNUUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfRklMRVMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm1heC1maWxlcyIsICJNYXggZmlsZXMiLAorICAgICAgICAgICJNYXhpbXVtIG51bWJlciBvZiBmaWxlcyB0byBrZWVwIG9uIGRpc2suIE9uY2UgdGhlIG1heGltdW0gaXMgcmVhY2hlZCwiCisgICAgICAgICAgIm9sZCBmaWxlcyBzdGFydCB0byBiZSBkZWxldGVkIHRvIG1ha2Ugcm9vbSBmb3IgbmV3IG9uZXMuIiwgMCwKKyAgICAgICAgICBHX01BWFVJTlQsIERFRkFVTFRfTUFYX0ZJTEVTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0FMSUdOTUVOVF9USFJFU0hPTEQsCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgiYWxpZ25tZW50LXRocmVzaG9sZCIsICJBbGlnbm1lbnQgdGhyZXNob2xkIChucykiLAorICAgICAgICAgICJBbGxvdyBub24tcmVmZXJlbmNlIHN0cmVhbXMgdG8gYmUgdGhhdCBtYW55IG5zIGJlZm9yZSB0aGUgcmVmZXJlbmNlIgorICAgICAgICAgICIgc3RyZWFtIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQ2NCwgREVGQVVMVF9BTElHTk1FTlRfVEhSRVNIT0xELAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTVVYRVIsCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgibXV4ZXIiLCAiTXV4ZXIiLAorICAgICAgICAgICJUaGUgbXV4ZXIgZWxlbWVudCB0byB1c2UgKE5VTEwgPSBkZWZhdWx0IG1wNG11eCkiLAorICAgICAgICAgIEdTVF9UWVBFX0VMRU1FTlQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NJTkssCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgic2luayIsICJTaW5rIiwKKyAgICAgICAgICAiVGhlIHNpbmsgZWxlbWVudCAob3IgZWxlbWVudCBjaGFpbikgdG8gdXNlIChOVUxMID0gZGVmYXVsdCBmaWxlc2luaykiLAorICAgICAgICAgIEdTVF9UWVBFX0VMRU1FTlQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVVNFX1JPQlVTVF9NVVhJTkcsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInVzZS1yb2J1c3QtbXV4aW5nIiwKKyAgICAgICAgICAiU3VwcG9ydCByb2J1c3QtbXV4aW5nIG1vZGUgb2Ygc29tZSBtdXhlcnMiLAorICAgICAgICAgICJDaGVjayBpZiBtdXhlcnMgc3VwcG9ydCByb2J1c3QgbXV4aW5nIHZpYSB0aGUgcmVzZXJ2ZWQtbWF4LWR1cmF0aW9uIGFuZCAiCisgICAgICAgICAgInJlc2VydmVkLWR1cmF0aW9uLXJlbWFpbmluZyBwcm9wZXJ0aWVzIGFuZCB1c2UgdGhlbSBpZiBzby4gIgorICAgICAgICAgICIoT25seSBwcmVzZW50IG9uIHF0bXV4IGFuZCBtcDRtdXggZm9yIG5vdykuIHNwbGl0bXV4c2luayBtYXkgdGhlbiBhbHNvICIKKyAgICAgICAgICAiIGNyZWF0ZSBuZXcgZnJhZ21lbnRzIGlmIHRoZSByZXNlcnZlZCBoZWFkZXIgc3BhY2UgaXMgYWJvdXQgdG8gb3ZlcmZsb3cuICIKKyAgICAgICAgICAiTm90ZSB0aGlzIGRvZXMgbm90IHNldCByZXNlcnZlZC1tb292LXVwZGF0ZS1wZXJpb2QgLSBhcHBzIHNob3VsZCBkbyB0aGF0IG1hbnVhbGx5IiwKKyAgICAgICAgICBERUZBVUxUX1VTRV9ST0JVU1RfTVVYSU5HLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RTcGxpdE11eFNpbms6OmZvcm1hdC1sb2NhdGlvbjoKKyAgICogQHNwbGl0bXV4OiB0aGUgI0dzdFNwbGl0TXV4U2luaworICAgKiBAZnJhZ21lbnRfaWQ6IHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGZpbGUgdG8gYmUgY3JlYXRlZAorICAgKgorICAgKiBSZXR1cm5zOiB0aGUgbG9jYXRpb24gdG8gYmUgdXNlZCBmb3IgdGhlIG5leHQgb3V0cHV0IGZpbGUKKyAgICovCisgIHNpZ25hbHNbU0lHTkFMX0ZPUk1BVF9MT0NBVElPTl0gPQorICAgICAgZ19zaWduYWxfbmV3ICgiZm9ybWF0LWxvY2F0aW9uIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBHX1RZUEVfU1RSSU5HLCAxLCBHX1RZUEVfVUlOVCk7CisKKyAgLyoqCisgICAqIEdzdFNwbGl0TXV4U2luazo6Zm9ybWF0LWxvY2F0aW9uLWZ1bGw6CisgICAqIEBzcGxpdG11eDogdGhlICNHc3RTcGxpdE11eFNpbmsKKyAgICogQGZyYWdtZW50X2lkOiB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBmaWxlIHRvIGJlIGNyZWF0ZWQKKyAgICogQGZpcnN0X3NhbXBsZTogQSAjR3N0U2FtcGxlIGNvbnRhaW5pbmcgdGhlIGZpcnN0IGJ1ZmZlcgorICAgKiAgIGZyb20gdGhlIHJlZmVyZW5jZSBzdHJlYW0gaW4gdGhlIG5ldyBmaWxlCisgICAqCisgICAqIFJldHVybnM6IHRoZSBsb2NhdGlvbiB0byBiZSB1c2VkIGZvciB0aGUgbmV4dCBvdXRwdXQgZmlsZQorICAgKi8KKyAgc2lnbmFsc1tTSUdOQUxfRk9STUFUX0xPQ0FUSU9OX0ZVTExdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoImZvcm1hdC1sb2NhdGlvbi1mdWxsIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBHX1RZUEVfU1RSSU5HLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdTVF9UWVBFX1NBTVBMRSk7CisKKyAgLyoqCisgICAqIEdzdFNwbGl0TXV4U2luazo6c3BsaXQtbm93OgorICAgKiBAc3BsaXRtdXg6IHRoZSAjR3N0U3BsaXRNdXhTaW5rCisgICAqCisgICAqIFdoZW4gY2FsbGVkIGJ5IHRoZSB1c2VyLCB0aGlzIGFjdGlvbiBzaWduYWwgc3BsaXRzIHRoZSB2aWRlbyBmaWxlIChhbmQgYmVnaW5zIGEgbmV3IG9uZSkgaW1tZWRpYXRlbHkuCisgICAqCisgICAqCisgICAqIFNpbmNlOiAxLjE0CisgICAqLworCisgIHNpZ25hbHNbU0lHTkFMX1NQTElUX05PV10gPQorICAgICAgZ19zaWduYWxfbmV3ICgic3BsaXQtbm93IiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFNwbGl0TXV4U2lua0NsYXNzLAorICAgICAgICAgIHNwbGl0X25vdyksIE5VTEwsIE5VTEwsIE5VTEwsIEdfVFlQRV9OT05FLCAwKTsKKworICBrbGFzcy0+c3BsaXRfbm93ID0gc3BsaXRfbm93OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwbGl0bXV4X3NpbmtfaW5pdCAoR3N0U3BsaXRNdXhTaW5rICogc3BsaXRtdXgpCit7CisgIGdfbXV0ZXhfaW5pdCAoJnNwbGl0bXV4LT5sb2NrKTsKKyAgZ19jb25kX2luaXQgKCZzcGxpdG11eC0+aW5wdXRfY29uZCk7CisgIGdfY29uZF9pbml0ICgmc3BsaXRtdXgtPm91dHB1dF9jb25kKTsKKyAgZ19xdWV1ZV9pbml0ICgmc3BsaXRtdXgtPm91dF9jbWRfcSk7CisKKyAgc3BsaXRtdXgtPm11eF9vdmVyaGVhZCA9IERFRkFVTFRfTVVYRVJfT1ZFUkhFQUQ7CisgIHNwbGl0bXV4LT50aHJlc2hvbGRfdGltZSA9IERFRkFVTFRfTUFYX1NJWkVfVElNRTsKKyAgc3BsaXRtdXgtPnRocmVzaG9sZF9ieXRlcyA9IERFRkFVTFRfTUFYX1NJWkVfQllURVM7CisgIHNwbGl0bXV4LT5tYXhfZmlsZXMgPSBERUZBVUxUX01BWF9GSUxFUzsKKyAgc3BsaXRtdXgtPnNlbmRfa2V5ZnJhbWVfcmVxdWVzdHMgPSBERUZBVUxUX1NFTkRfS0VZRlJBTUVfUkVRVUVTVFM7CisgIHNwbGl0bXV4LT5uZXh0X21heF90Y190aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgc3BsaXRtdXgtPmFsaWdubWVudF90aHJlc2hvbGQgPSBERUZBVUxUX0FMSUdOTUVOVF9USFJFU0hPTEQ7CisgIHNwbGl0bXV4LT51c2Vfcm9idXN0X211eGluZyA9IERFRkFVTFRfVVNFX1JPQlVTVF9NVVhJTkc7CisKKyAgc3BsaXRtdXgtPnRocmVzaG9sZF90aW1lY29kZV9zdHIgPSBOVUxMOworCisgIEdTVF9PQkpFQ1RfRkxBR19TRVQgKHNwbGl0bXV4LCBHU1RfRUxFTUVOVF9GTEFHX1NJTkspOworICBzcGxpdG11eC0+c3BsaXRfbm93ID0gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfcmVzZXQgKEdzdFNwbGl0TXV4U2luayAqIHNwbGl0bXV4KQoreworICBpZiAoc3BsaXRtdXgtPm11eGVyKSB7CisgICAgZ3N0X2VsZW1lbnRfc2V0X2xvY2tlZF9zdGF0ZSAoc3BsaXRtdXgtPm11eGVyLCBUUlVFKTsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNwbGl0bXV4LT5tdXhlciwgR1NUX1NUQVRFX05VTEwpOworICAgIGdzdF9iaW5fcmVtb3ZlIChHU1RfQklOIChzcGxpdG11eCksIHNwbGl0bXV4LT5tdXhlcik7CisgIH0KKyAgaWYgKHNwbGl0bXV4LT5hY3RpdmVfc2luaykgeworICAgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKHNwbGl0bXV4LT5hY3RpdmVfc2luaywgVFJVRSk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzcGxpdG11eC0+YWN0aXZlX3NpbmssIEdTVF9TVEFURV9OVUxMKTsKKyAgICBnc3RfYmluX3JlbW92ZSAoR1NUX0JJTiAoc3BsaXRtdXgpLCBzcGxpdG11eC0+YWN0aXZlX3NpbmspOworICB9CisKKyAgc3BsaXRtdXgtPnNpbmsgPSBzcGxpdG11eC0+YWN0aXZlX3NpbmsgPSBzcGxpdG11eC0+bXV4ZXIgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwbGl0bXV4X3NpbmtfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0U3BsaXRNdXhTaW5rICpzcGxpdG11eCA9IEdTVF9TUExJVE1VWF9TSU5LIChvYmplY3QpOworCisgIC8qIENhbGxpbmcgcGFyZW50IGRpc3Bvc2UgaW52YWxpZGF0ZXMgYWxsIGNoaWxkIHBvaW50ZXJzICovCisgIHNwbGl0bXV4LT5zaW5rID0gc3BsaXRtdXgtPmFjdGl2ZV9zaW5rID0gc3BsaXRtdXgtPm11eGVyID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGxpdG11eF9zaW5rX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RTcGxpdE11eFNpbmsgKnNwbGl0bXV4ID0gR1NUX1NQTElUTVVYX1NJTksgKG9iamVjdCk7CisgIGdfY29uZF9jbGVhciAoJnNwbGl0bXV4LT5pbnB1dF9jb25kKTsKKyAgZ19jb25kX2NsZWFyICgmc3BsaXRtdXgtPm91dHB1dF9jb25kKTsKKyAgZ19tdXRleF9jbGVhciAoJnNwbGl0bXV4LT5sb2NrKTsKKyAgZ19xdWV1ZV9mb3JlYWNoICgmc3BsaXRtdXgtPm91dF9jbWRfcSwgKEdGdW5jKSBvdXRfY21kX2J1Zl9mcmVlLCBOVUxMKTsKKyAgZ19xdWV1ZV9jbGVhciAoJnNwbGl0bXV4LT5vdXRfY21kX3EpOworCisgIGlmIChzcGxpdG11eC0+cHJvdmlkZWRfc2luaykKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzcGxpdG11eC0+cHJvdmlkZWRfc2luayk7CisgIGlmIChzcGxpdG11eC0+cHJvdmlkZWRfbXV4ZXIpCisgICAgZ3N0X29iamVjdF91bnJlZiAoc3BsaXRtdXgtPnByb3ZpZGVkX211eGVyKTsKKworICBpZiAoc3BsaXRtdXgtPnRocmVzaG9sZF90aW1lY29kZV9zdHIpCisgICAgZ19mcmVlIChzcGxpdG11eC0+dGhyZXNob2xkX3RpbWVjb2RlX3N0cik7CisKKyAgZ19mcmVlIChzcGxpdG11eC0+bG9jYXRpb24pOworCisgIC8qIE1ha2Ugc3VyZSB0byBmcmVlIGFueSB1bi1yZWxlYXNlZCBjb250ZXh0cyAqLworICBnX2xpc3RfZm9yZWFjaCAoc3BsaXRtdXgtPmNvbnRleHRzLCAoR0Z1bmMpIG1xX3N0cmVhbV9jdHhfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoc3BsaXRtdXgtPmNvbnRleHRzKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKKy8qCisgKiBTZXQgYW55IHRpbWUgdGhyZXNob2xkIHRvIHRoZSBtdXhlciwgaWYgaXQgaGFzCisgKiByZXNlcnZlZC1tYXgtZHVyYXRpb24gYW5kIHJlc2VydmVkLWR1cmF0aW9uLXJlbWFpbmluZworICogcHJvcGVydGllcy4gQ2FsbGVkIHdoZW4gY3JlYXRpbmcvY2xhaW1pbmcgdGhlIG11eGVyCisgKiBpbiBjcmVhdGVfZWxlbWVudHMoKSAqLworc3RhdGljIHZvaWQKK3VwZGF0ZV9tdXhlcl9wcm9wZXJ0aWVzIChHc3RTcGxpdE11eFNpbmsgKiBzaW5rKQoreworICBHT2JqZWN0Q2xhc3MgKmtsYXNzOworICBHc3RDbG9ja1RpbWUgdGhyZXNob2xkX3RpbWU7CisKKyAgc2luay0+bXV4ZXJfaGFzX3Jlc2VydmVkX3Byb3BzID0gRkFMU0U7CisgIGlmIChzaW5rLT5tdXhlciA9PSBOVUxMKQorICAgIHJldHVybjsKKyAga2xhc3MgPSBHX09CSkVDVF9HRVRfQ0xBU1MgKHNpbmstPm11eGVyKTsKKyAgaWYgKGdfb2JqZWN0X2NsYXNzX2ZpbmRfcHJvcGVydHkgKGtsYXNzLCAicmVzZXJ2ZWQtbWF4LWR1cmF0aW9uIikgPT0gTlVMTCkKKyAgICByZXR1cm47CisgIGlmIChnX29iamVjdF9jbGFzc19maW5kX3Byb3BlcnR5IChrbGFzcywKKyAgICAgICAgICAicmVzZXJ2ZWQtZHVyYXRpb24tcmVtYWluaW5nIikgPT0gTlVMTCkKKyAgICByZXR1cm47CisgIHNpbmstPm11eGVyX2hhc19yZXNlcnZlZF9wcm9wcyA9IFRSVUU7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNpbmssICJTZXR0aW5nIG11eGVyIHJlc2VydmVkIHRpbWUgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoc2luay0+dGhyZXNob2xkX3RpbWUpKTsKKyAgR1NUX09CSkVDVF9MT0NLIChzaW5rKTsKKyAgdGhyZXNob2xkX3RpbWUgPSBzaW5rLT50aHJlc2hvbGRfdGltZTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNpbmspOworCisgIGlmICh0aHJlc2hvbGRfdGltZSA+IDApIHsKKyAgICAvKiBUZWxsIHRoZSBtdXhlciBob3cgbXVjaCBzcGFjZSB0byByZXNlcnZlICovCisgICAgR3N0Q2xvY2tUaW1lIG11eGVyX3RocmVzaG9sZCA9IHRocmVzaG9sZF90aW1lOworICAgIGdfb2JqZWN0X3NldCAoc2luay0+bXV4ZXIsICJyZXNlcnZlZC1tYXgtZHVyYXRpb24iLCBtdXhlcl90aHJlc2hvbGQsIE5VTEwpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfc2lua19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0U3BsaXRNdXhTaW5rICpzcGxpdG11eCA9IEdTVF9TUExJVE1VWF9TSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MT0NBVElPTjp7CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGdfZnJlZSAoc3BsaXRtdXgtPmxvY2F0aW9uKTsKKyAgICAgIHNwbGl0bXV4LT5sb2NhdGlvbiA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfTUFYX1NJWkVfQllURVM6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIHNwbGl0bXV4LT50aHJlc2hvbGRfYnl0ZXMgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX1NJWkVfVElNRToKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgc3BsaXRtdXgtPnRocmVzaG9sZF90aW1lID0gZ192YWx1ZV9nZXRfdWludDY0ICh2YWx1ZSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc3BsaXRtdXgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9TSVpFX1RJTUVDT0RFOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChzcGxpdG11eCk7CisgICAgICBzcGxpdG11eC0+dGhyZXNob2xkX3RpbWVjb2RlX3N0ciA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TRU5EX0tFWUZSQU1FX1JFUVVFU1RTOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChzcGxpdG11eCk7CisgICAgICBzcGxpdG11eC0+c2VuZF9rZXlmcmFtZV9yZXF1ZXN0cyA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX0ZJTEVTOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChzcGxpdG11eCk7CisgICAgICBzcGxpdG11eC0+bWF4X2ZpbGVzID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NVVhFUl9PVkVSSEVBRDoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgc3BsaXRtdXgtPm11eF9vdmVyaGVhZCA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VfUk9CVVNUX01VWElORzoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgc3BsaXRtdXgtPnVzZV9yb2J1c3RfbXV4aW5nID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGlmIChzcGxpdG11eC0+dXNlX3JvYnVzdF9tdXhpbmcpCisgICAgICAgIHVwZGF0ZV9tdXhlcl9wcm9wZXJ0aWVzIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQUxJR05NRU5UX1RIUkVTSE9MRDoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgc3BsaXRtdXgtPmFsaWdubWVudF90aHJlc2hvbGQgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0lOSzoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgaWYgKHNwbGl0bXV4LT5wcm92aWRlZF9zaW5rKQorICAgICAgICBnc3Rfb2JqZWN0X3VucmVmIChzcGxpdG11eC0+cHJvdmlkZWRfc2luayk7CisgICAgICBzcGxpdG11eC0+cHJvdmlkZWRfc2luayA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOworICAgICAgZ3N0X29iamVjdF9yZWZfc2luayAoc3BsaXRtdXgtPnByb3ZpZGVkX3NpbmspOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NVVhFUjoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgaWYgKHNwbGl0bXV4LT5wcm92aWRlZF9tdXhlcikKKyAgICAgICAgZ3N0X29iamVjdF91bnJlZiAoc3BsaXRtdXgtPnByb3ZpZGVkX211eGVyKTsKKyAgICAgIHNwbGl0bXV4LT5wcm92aWRlZF9tdXhlciA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOworICAgICAgZ3N0X29iamVjdF9yZWZfc2luayAoc3BsaXRtdXgtPnByb3ZpZGVkX211eGVyKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0U3BsaXRNdXhTaW5rICpzcGxpdG11eCA9IEdTVF9TUExJVE1VWF9TSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MT0NBVElPTjoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc3BsaXRtdXgtPmxvY2F0aW9uKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX1NJWkVfQllURVM6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHNwbGl0bXV4LT50aHJlc2hvbGRfYnl0ZXMpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfU0laRV9USU1FOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChzcGxpdG11eCk7CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCBzcGxpdG11eC0+dGhyZXNob2xkX3RpbWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfU0laRV9USU1FQ09ERToKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc3BsaXRtdXgtPnRocmVzaG9sZF90aW1lY29kZV9zdHIpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TRU5EX0tFWUZSQU1FX1JFUVVFU1RTOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChzcGxpdG11eCk7CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgc3BsaXRtdXgtPnNlbmRfa2V5ZnJhbWVfcmVxdWVzdHMpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfRklMRVM6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzcGxpdG11eC0+bWF4X2ZpbGVzKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTVVYRVJfT1ZFUkhFQUQ6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIHNwbGl0bXV4LT5tdXhfb3ZlcmhlYWQpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VfUk9CVVNUX01VWElORzoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNwbGl0bXV4LT51c2Vfcm9idXN0X211eGluZyk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc3BsaXRtdXgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FMSUdOTUVOVF9USFJFU0hPTEQ6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHNwbGl0bXV4LT5hbGlnbm1lbnRfdGhyZXNob2xkKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0lOSzoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc3BsaXRtdXgtPnByb3ZpZGVkX3NpbmspOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NVVhFUjoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc3BsaXRtdXgtPnByb3ZpZGVkX211eGVyKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIENvbnZlbmllbmNlIGZ1bmN0aW9uICovCitzdGF0aWMgaW5saW5lIEdzdENsb2NrVGltZURpZmYKK215X3NlZ21lbnRfdG9fcnVubmluZ190aW1lIChHc3RTZWdtZW50ICogc2VnbWVudCwgR3N0Q2xvY2tUaW1lIHZhbCkKK3sKKyAgR3N0Q2xvY2tUaW1lRGlmZiByZXMgPSBHU1RfQ0xPQ0tfU1RJTUVfTk9ORTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHZhbCkpIHsKKyAgICBnYm9vbGVhbiBzaWduID0KKyAgICAgICAgZ3N0X3NlZ21lbnRfdG9fcnVubmluZ190aW1lX2Z1bGwgKHNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgdmFsLCAmdmFsKTsKKyAgICBpZiAoc2lnbiA+IDApCisgICAgICByZXMgPSB2YWw7CisgICAgZWxzZSBpZiAoc2lnbiA8IDApCisgICAgICByZXMgPSAtdmFsOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBNcVN0cmVhbUN0eCAqCittcV9zdHJlYW1fY3R4X25ldyAoR3N0U3BsaXRNdXhTaW5rICogc3BsaXRtdXgpCit7CisgIE1xU3RyZWFtQ3R4ICpjdHg7CisKKyAgY3R4ID0gZ19uZXcwIChNcVN0cmVhbUN0eCwgMSk7CisgIGdfYXRvbWljX2ludF9zZXQgKCZjdHgtPnJlZmNvdW50LCAxKTsKKyAgY3R4LT5zcGxpdG11eCA9IHNwbGl0bXV4OworICBnc3Rfc2VnbWVudF9pbml0ICgmY3R4LT5pbl9zZWdtZW50LCBHU1RfRk9STUFUX1VOREVGSU5FRCk7CisgIGdzdF9zZWdtZW50X2luaXQgKCZjdHgtPm91dF9zZWdtZW50LCBHU1RfRk9STUFUX1VOREVGSU5FRCk7CisgIGN0eC0+aW5fcnVubmluZ190aW1lID0gY3R4LT5vdXRfcnVubmluZ190aW1lID0gR1NUX0NMT0NLX1NUSU1FX05PTkU7CisgIGdfcXVldWVfaW5pdCAoJmN0eC0+cXVldWVkX2J1ZnMpOworICByZXR1cm4gY3R4OworfQorCitzdGF0aWMgdm9pZAorbXFfc3RyZWFtX2N0eF9mcmVlIChNcVN0cmVhbUN0eCAqIGN0eCkKK3sKKyAgaWYgKGN0eC0+cSkgeworICAgIGdfc2lnbmFsX2hhbmRsZXJfZGlzY29ubmVjdCAoY3R4LT5xLCBjdHgtPnFfb3ZlcnJ1bl9pZCk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X2xvY2tlZF9zdGF0ZSAoY3R4LT5xLCBUUlVFKTsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGN0eC0+cSwgR1NUX1NUQVRFX05VTEwpOworICAgIGdzdF9iaW5fcmVtb3ZlIChHU1RfQklOIChjdHgtPnNwbGl0bXV4KSwgY3R4LT5xKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChjdHgtPnEpOworICB9CisgIGdzdF9idWZmZXJfcmVwbGFjZSAoJmN0eC0+cHJldl9pbl9rZXlmcmFtZSwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGN0eC0+c2lua3BhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGN0eC0+c3JjcGFkKTsKKyAgZ19xdWV1ZV9mb3JlYWNoICgmY3R4LT5xdWV1ZWRfYnVmcywgKEdGdW5jKSBtcV9zdHJlYW1fYnVmX2ZyZWUsIE5VTEwpOworICBnX3F1ZXVlX2NsZWFyICgmY3R4LT5xdWV1ZWRfYnVmcyk7CisgIGdfZnJlZSAoY3R4KTsKK30KKworc3RhdGljIHZvaWQKK21xX3N0cmVhbV9jdHhfdW5yZWYgKE1xU3RyZWFtQ3R4ICogY3R4KQoreworICBpZiAoZ19hdG9taWNfaW50X2RlY19hbmRfdGVzdCAoJmN0eC0+cmVmY291bnQpKQorICAgIG1xX3N0cmVhbV9jdHhfZnJlZSAoY3R4KTsKK30KKworc3RhdGljIHZvaWQKK21xX3N0cmVhbV9jdHhfcmVmIChNcVN0cmVhbUN0eCAqIGN0eCkKK3sKKyAgZ19hdG9taWNfaW50X2luYyAoJmN0eC0+cmVmY291bnQpOworfQorCitzdGF0aWMgdm9pZAorX3BhZF9ibG9ja19kZXN0cm95X3Npbmtfbm90aWZ5IChNcVN0cmVhbUN0eCAqIGN0eCkKK3sKKyAgY3R4LT5zaW5rX3BhZF9ibG9ja19pZCA9IDA7CisgIG1xX3N0cmVhbV9jdHhfdW5yZWYgKGN0eCk7Cit9CisKK3N0YXRpYyB2b2lkCitfcGFkX2Jsb2NrX2Rlc3Ryb3lfc3JjX25vdGlmeSAoTXFTdHJlYW1DdHggKiBjdHgpCit7CisgIGN0eC0+c3JjX3BhZF9ibG9ja19pZCA9IDA7CisgIG1xX3N0cmVhbV9jdHhfdW5yZWYgKGN0eCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZW5kX2ZyYWdtZW50X29wZW5lZF9jbG9zZWRfbXNnIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCwgZ2Jvb2xlYW4gb3BlbmVkKQoreworICBnY2hhciAqbG9jYXRpb24gPSBOVUxMOworICBHc3RNZXNzYWdlICptc2c7CisgIGNvbnN0IGdjaGFyICptc2dfbmFtZSA9IG9wZW5lZCA/CisgICAgICAic3BsaXRtdXhzaW5rLWZyYWdtZW50LW9wZW5lZCIgOiAic3BsaXRtdXhzaW5rLWZyYWdtZW50LWNsb3NlZCI7CisKKyAgZ19vYmplY3RfZ2V0IChzcGxpdG11eC0+c2luaywgImxvY2F0aW9uIiwgJmxvY2F0aW9uLCBOVUxMKTsKKworICBtc2cgPSBnc3RfbWVzc2FnZV9uZXdfZWxlbWVudCAoR1NUX09CSkVDVCAoc3BsaXRtdXgpLAorICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKG1zZ19uYW1lLAorICAgICAgICAgICJsb2NhdGlvbiIsIEdfVFlQRV9TVFJJTkcsIGxvY2F0aW9uLAorICAgICAgICAgICJydW5uaW5nLXRpbWUiLCBHU1RfVFlQRV9DTE9DS19USU1FLAorICAgICAgICAgIHNwbGl0bXV4LT5yZWZlcmVuY2VfY3R4LT5vdXRfcnVubmluZ190aW1lLCBOVUxMKSk7CisgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAoc3BsaXRtdXgpLCBtc2cpOworCisgIGdfZnJlZSAobG9jYXRpb24pOworfQorCisvKiBDYWxsZWQgd2l0aCBsb2NrIGhlbGQsIGRyb3BzIHRoZSBsb2NrIHRvIHNlbmQgRU9TIHRvIHRoZQorICogcGFkCisgKi8KK3N0YXRpYyB2b2lkCitzZW5kX2VvcyAoR3N0U3BsaXRNdXhTaW5rICogc3BsaXRtdXgsIE1xU3RyZWFtQ3R4ICogY3R4KQoreworICBHc3RFdmVudCAqZW9zOworICBHc3RQYWQgKnBhZDsKKworICBlb3MgPSBnc3RfZXZlbnRfbmV3X2VvcyAoKTsKKyAgcGFkID0gZ3N0X3BhZF9nZXRfcGVlciAoY3R4LT5zcmNwYWQpOworCisgIGN0eC0+b3V0X2VvcyA9IFRSVUU7CisKKyAgR1NUX0lORk9fT0JKRUNUIChzcGxpdG11eCwgIlNlbmRpbmcgRU9TIG9uICUiIEdTVF9QVFJfRk9STUFULCBwYWQpOworICBHU1RfU1BMSVRNVVhfVU5MT0NLIChzcGxpdG11eCk7CisgIGdzdF9wYWRfc2VuZF9ldmVudCAocGFkLCBlb3MpOworICBHU1RfU1BMSVRNVVhfTE9DSyAoc3BsaXRtdXgpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7Cit9CisKKy8qIENhbGxlZCB3aXRoIHNwbGl0bXV4IGxvY2sgaGVsZCB0byBjaGVjayBpZiB0aGlzIG91dHB1dAorICogY29udGV4dCBuZWVkcyB0byBzbGVlcCB0byB3YWl0IGZvciB0aGUgcmVsZWFzZSBvZiB0aGUKKyAqIG5leHQgR09QLCBvciB0byBzZW5kIEVPUyB0byBjbG9zZSBvdXQgdGhlIGN1cnJlbnQgZmlsZQorICovCitzdGF0aWMgdm9pZAorY29tcGxldGVfb3Jfd2FpdF9vbl9vdXQgKEdzdFNwbGl0TXV4U2luayAqIHNwbGl0bXV4LCBNcVN0cmVhbUN0eCAqIGN0eCkKK3sKKyAgaWYgKGN0eC0+Y2Fwc19jaGFuZ2UpCisgICAgcmV0dXJuOworCisgIGRvIHsKKyAgICAvKiBXaGVuIGZpcnN0IHN0YXJ0aW5nIHVwLCB0aGUgcmVmZXJlbmNlIHN0cmVhbSBoYXMgdG8gb3V0cHV0CisgICAgICogdGhlIGZpcnN0IGJ1ZmZlciB0byBwcmVwYXJlIHRoZSBtdXhlciBhbmQgc2luayAqLworICAgIGdib29sZWFuIGNhbl9vdXRwdXQgPSAoY3R4LT5pc19yZWZlcmVuY2UgfHwgc3BsaXRtdXgtPnJlYWR5X2Zvcl9vdXRwdXQpOworICAgIEdzdENsb2NrVGltZURpZmYgbXlfbWF4X291dF9ydW5uaW5nX3RpbWUgPSBzcGxpdG11eC0+bWF4X291dF9ydW5uaW5nX3RpbWU7CisKKyAgICBpZiAoIShzcGxpdG11eC0+bWF4X291dF9ydW5uaW5nX3RpbWUgPT0gMCB8fAorICAgICAgICAgICAgc3BsaXRtdXgtPm1heF9vdXRfcnVubmluZ190aW1lID09IEdTVF9DTE9DS19TVElNRV9OT05FIHx8CisgICAgICAgICAgICBzcGxpdG11eC0+YWxpZ25tZW50X3RocmVzaG9sZCA9PSAwIHx8CisgICAgICAgICAgICBzcGxpdG11eC0+bWF4X291dF9ydW5uaW5nX3RpbWUgPCBzcGxpdG11eC0+YWxpZ25tZW50X3RocmVzaG9sZCkpIHsKKyAgICAgIG15X21heF9vdXRfcnVubmluZ190aW1lIC09IHNwbGl0bXV4LT5hbGlnbm1lbnRfdGhyZXNob2xkOworICAgICAgR1NUX0xPR19PQkpFQ1QgKGN0eC0+c3JjcGFkLAorICAgICAgICAgICJNYXggb3V0IHJ1bm5pbmcgdGltZSBjdXJyZW50bHkgJSIgR1NUX1NUSU1FX0ZPUk1BVAorICAgICAgICAgICIsIHdpdGggdGhyZXNob2xkIGFwcGxpZWQgaXQgaXMgJSIgR1NUX1NUSU1FX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfU1RJTUVfQVJHUyAoc3BsaXRtdXgtPm1heF9vdXRfcnVubmluZ190aW1lKSwKKyAgICAgICAgICBHU1RfU1RJTUVfQVJHUyAobXlfbWF4X291dF9ydW5uaW5nX3RpbWUpKTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5mbHVzaGluZworICAgICAgICB8fCBzcGxpdG11eC0+b3V0cHV0X3N0YXRlID09IFNQTElUTVVYX09VVFBVVF9TVEFURV9TVE9QUEVEKQorICAgICAgcmV0dXJuOworCisgICAgR1NUX0xPR19PQkpFQ1QgKGN0eC0+c3JjcGFkLAorICAgICAgICAiQ2hlY2tpbmcgcnVubmluZyB0aW1lICUiIEdTVF9TVElNRV9GT1JNQVQgIiBhZ2FpbnN0IG1heCAlIgorICAgICAgICBHU1RfU1RJTUVfRk9STUFULCBHU1RfU1RJTUVfQVJHUyAoY3R4LT5vdXRfcnVubmluZ190aW1lKSwKKyAgICAgICAgR1NUX1NUSU1FX0FSR1MgKG15X21heF9vdXRfcnVubmluZ190aW1lKSk7CisKKyAgICBpZiAoY2FuX291dHB1dCkgeworICAgICAgaWYgKHNwbGl0bXV4LT5tYXhfb3V0X3J1bm5pbmdfdGltZSA9PSBHU1RfQ0xPQ0tfU1RJTUVfTk9ORSB8fAorICAgICAgICAgIGN0eC0+b3V0X3J1bm5pbmdfdGltZSA8IG15X21heF9vdXRfcnVubmluZ190aW1lKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChzcGxpdG11eC0+b3V0cHV0X3N0YXRlKSB7CisgICAgICAgIGNhc2UgU1BMSVRNVVhfT1VUUFVUX1NUQVRFX09VVFBVVF9HT1A6CisgICAgICAgICAgLyogV2Ugb25seSBnZXQgaGVyZSBpZiB3ZSd2ZSBmaW5pc2hlZCBvdXRwdXR0aW5nIGEgR09QIGFuZCBuZWVkIHRvIGtub3cKKyAgICAgICAgICAgKiB3aGF0IHRvIGRvIG5leHQgKi8KKyAgICAgICAgICBzcGxpdG11eC0+b3V0cHV0X3N0YXRlID0gU1BMSVRNVVhfT1VUUFVUX1NUQVRFX0FXQUlUSU5HX0NPTU1BTkQ7CisgICAgICAgICAgR1NUX1NQTElUTVVYX0JST0FEQ0FTVF9PVVRQVVQgKHNwbGl0bXV4KTsKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBjYXNlIFNQTElUTVVYX09VVFBVVF9TVEFURV9FTkRJTkdfRklMRToKKyAgICAgICAgICAvKiBXZSd2ZSByZWFjaGVkIHRoZSBtYXggb3V0IHJ1bm5pbmdfdGltZSB0byBnZXQgaGVyZSwgc28gZW5kIHRoaXMgZmlsZSBub3cgKi8KKyAgICAgICAgICBpZiAoY3R4LT5vdXRfZW9zID09IEZBTFNFKSB7CisgICAgICAgICAgICBzZW5kX2VvcyAoc3BsaXRtdXgsIGN0eCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1BMSVRNVVhfT1VUUFVUX1NUQVRFX1NUQVJUX05FWFRfRklMRToKKyAgICAgICAgICBpZiAoY3R4LT5pc19yZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIC8qIFNwZWNpYWwgaGFuZGxpbmcgb24gdGhlIHJlZmVyZW5jZSBjdHggdG8gc3RhcnQgbmV3IGZyYWdtZW50cworICAgICAgICAgICAgICogYW5kIGNvbGxlY3QgY29tbWFuZHMgZnJvbSB0aGUgY29tbWFuZCBxdWV1ZSAqLworICAgICAgICAgICAgLyogZHJvcHMgdGhlIHNwbGl0bXV4IGxvY2sgYnJpZWZseTogKi8KKyAgICAgICAgICAgIHN0YXJ0X25leHRfZnJhZ21lbnQgKHNwbGl0bXV4LCBjdHgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1BMSVRNVVhfT1VUUFVUX1NUQVRFX0FXQUlUSU5HX0NPTU1BTkQ6eworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIFNwbGl0TXV4T3V0cHV0Q29tbWFuZCAqY21kID0KKyAgICAgICAgICAgICAgICBnX3F1ZXVlX3BvcF90YWlsICgmc3BsaXRtdXgtPm91dF9jbWRfcSk7CisgICAgICAgICAgICBpZiAoY21kICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgLyogSWYgd2UgcG9wIHRoZSBsYXN0IGNvbW1hbmQsIHdlIG5lZWQgdG8gbWFrZSBvdXIgcXVldWVzIGJpZ2dlciAqLworICAgICAgICAgICAgICBpZiAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmc3BsaXRtdXgtPm91dF9jbWRfcSkgPT0gMCkKKyAgICAgICAgICAgICAgICBncm93X2Jsb2NrZWRfcXVldWVzIChzcGxpdG11eCk7CisKKyAgICAgICAgICAgICAgaWYgKGNtZC0+c3RhcnRfbmV3X2ZyYWdtZW50KSB7CisgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3BsaXRtdXgsICJHb3QgY21kIHRvIHN0YXJ0IG5ldyBmcmFnbWVudCIpOworICAgICAgICAgICAgICAgIHNwbGl0bXV4LT5vdXRwdXRfc3RhdGUgPSBTUExJVE1VWF9PVVRQVVRfU1RBVEVfRU5ESU5HX0ZJTEU7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICAgICAgICAgICAgICJHb3QgbmV3IG91dHB1dCBjbWQgZm9yIHRpbWUgJSIgR1NUX1NUSU1FX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgR1NUX1NUSU1FX0FSR1MgKGNtZC0+bWF4X291dHB1dF90cykpOworCisgICAgICAgICAgICAgICAgLyogRXh0ZW5kIHRoZSBvdXRwdXQgcmFuZ2UgaW1tZWRpYXRlbHkgKi8KKyAgICAgICAgICAgICAgICBzcGxpdG11eC0+bWF4X291dF9ydW5uaW5nX3RpbWUgPSBjbWQtPm1heF9vdXRwdXRfdHM7CisgICAgICAgICAgICAgICAgc3BsaXRtdXgtPm91dHB1dF9zdGF0ZSA9IFNQTElUTVVYX09VVFBVVF9TVEFURV9PVVRQVVRfR09QOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIEdTVF9TUExJVE1VWF9CUk9BRENBU1RfT1VUUFVUIChzcGxpdG11eCk7CisKKyAgICAgICAgICAgICAgb3V0X2NtZF9idWZfZnJlZSAoY21kKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBHU1RfU1BMSVRNVVhfV0FJVF9PVVRQVVQgKHNwbGl0bXV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IHdoaWxlIChzcGxpdG11eC0+b3V0cHV0X3N0YXRlID09CisgICAgICAgICAgICAgIFNQTElUTVVYX09VVFBVVF9TVEFURV9BV0FJVElOR19DT01NQU5EKTsKKyAgICAgICAgICAvKiBsb29wIGFuZCByZS1jaGVjayB0aGUgc3RhdGUgKi8KKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNQTElUTVVYX09VVFBVVF9TVEFURV9TVE9QUEVEOgorICAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGN0eC0+c3JjcGFkLAorICAgICAgICAiU2xlZXBpbmcgZm9yIHJ1bm5pbmcgdGltZSAlIgorICAgICAgICBHU1RfU1RJTUVfRk9STUFUICIgKG1heCAlIiBHU1RfU1RJTUVfRk9STUFUICIpIG9yIHN0YXRlIGNoYW5nZS4iLAorICAgICAgICBHU1RfU1RJTUVfQVJHUyAoY3R4LT5vdXRfcnVubmluZ190aW1lKSwKKyAgICAgICAgR1NUX1NUSU1FX0FSR1MgKHNwbGl0bXV4LT5tYXhfb3V0X3J1bm5pbmdfdGltZSkpOworICAgIEdTVF9TUExJVE1VWF9XQUlUX09VVFBVVCAoc3BsaXRtdXgpOworICAgIEdTVF9JTkZPX09CSkVDVCAoY3R4LT5zcmNwYWQsCisgICAgICAgICJXb2tlbiBmb3IgbmV3IG1heCBydW5uaW5nIHRpbWUgJSIgR1NUX1NUSU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1NUSU1FX0FSR1MgKHNwbGl0bXV4LT5tYXhfb3V0X3J1bm5pbmdfdGltZSkpOworICB9CisgIHdoaWxlICgxKTsKK30KKworc3RhdGljIEdzdENsb2NrVGltZQorY2FsY3VsYXRlX25leHRfbWF4X3RpbWVjb2RlIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCwKKyAgICBjb25zdCBHc3RWaWRlb1RpbWVDb2RlICogY3VyX3RjKQoreworICBHc3RWaWRlb1RpbWVDb2RlICp0YXJnZXRfdGM7CisgIEdzdFZpZGVvVGltZUNvZGVJbnRlcnZhbCAqdGNfaW50ZXI7CisgIEdzdENsb2NrVGltZSBjdXJfdGNfdGltZSwgdGFyZ2V0X3RjX3RpbWUsIG5leHRfbWF4X3RjX3RpbWU7CisKKyAgaWYgKGN1cl90YyA9PSBOVUxMIHx8IHNwbGl0bXV4LT50aHJlc2hvbGRfdGltZWNvZGVfc3RyID09IE5VTEwpCisgICAgcmV0dXJuIEdTVF9DTE9DS19USU1FX05PTkU7CisKKyAgdGNfaW50ZXIgPQorICAgICAgZ3N0X3ZpZGVvX3RpbWVfY29kZV9pbnRlcnZhbF9uZXdfZnJvbV9zdHJpbmcKKyAgICAgIChzcGxpdG11eC0+dGhyZXNob2xkX3RpbWVjb2RlX3N0cik7CisgIHRhcmdldF90YyA9IGdzdF92aWRlb190aW1lX2NvZGVfYWRkX2ludGVydmFsIChjdXJfdGMsIHRjX2ludGVyKTsKKyAgZ3N0X3ZpZGVvX3RpbWVfY29kZV9pbnRlcnZhbF9mcmVlICh0Y19pbnRlcik7CisKKyAgLyogQ29udmVydCB0byBucyAqLworICB0YXJnZXRfdGNfdGltZSA9IGdzdF92aWRlb190aW1lX2NvZGVfbnNlY19zaW5jZV9kYWlseV9qYW0gKHRhcmdldF90Yyk7CisgIGN1cl90Y190aW1lID0gZ3N0X3ZpZGVvX3RpbWVfY29kZV9uc2VjX3NpbmNlX2RhaWx5X2phbSAoY3VyX3RjKTsKKworICAvKiBBZGQgZnJhZ21lbnRfc3RhcnRfdGltZSwgYWNjb3VudGluZyBmb3Igd3JhcGFyb3VuZCAqLworICBpZiAodGFyZ2V0X3RjX3RpbWUgPj0gY3VyX3RjX3RpbWUpIHsKKyAgICBuZXh0X21heF90Y190aW1lID0KKyAgICAgICAgdGFyZ2V0X3RjX3RpbWUgLSBjdXJfdGNfdGltZSArIHNwbGl0bXV4LT5mcmFnbWVudF9zdGFydF90aW1lOworICB9IGVsc2UgeworICAgIEdzdENsb2NrVGltZSBkYXlfaW5fbnMgPSAyNCAqIDYwICogNjAgKiBHU1RfU0VDT05EOworCisgICAgbmV4dF9tYXhfdGNfdGltZSA9CisgICAgICAgIGRheV9pbl9ucyAtIGN1cl90Y190aW1lICsgdGFyZ2V0X3RjX3RpbWUgKworICAgICAgICBzcGxpdG11eC0+ZnJhZ21lbnRfc3RhcnRfdGltZTsKKyAgfQorICBHU1RfSU5GT19PQkpFQ1QgKHNwbGl0bXV4LCAiTmV4dCBtYXggVEMgdGltZTogJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAiIGZyb20gcmVmIFRDOiAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKG5leHRfbWF4X3RjX3RpbWUpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoY3VyX3RjX3RpbWUpKTsKKyAgZ3N0X3ZpZGVvX3RpbWVfY29kZV9mcmVlICh0YXJnZXRfdGMpOworCisgIHJldHVybiBuZXh0X21heF90Y190aW1lOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3JlcXVlc3RfbmV4dF9rZXlmcmFtZSAoR3N0U3BsaXRNdXhTaW5rICogc3BsaXRtdXgsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0RXZlbnQgKmV2OworICBHc3RDbG9ja1RpbWUgdGFyZ2V0X3RpbWU7CisgIGdib29sZWFuIHRpbWVjb2RlX2Jhc2VkID0gRkFMU0U7CisKKyAgc3BsaXRtdXgtPm5leHRfbWF4X3RjX3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBpZiAoc3BsaXRtdXgtPnRocmVzaG9sZF90aW1lY29kZV9zdHIpIHsKKyAgICBHc3RWaWRlb1RpbWVDb2RlTWV0YSAqdGNfbWV0YTsKKworICAgIGlmIChidWZmZXIgIT0gTlVMTCkgeworICAgICAgdGNfbWV0YSA9IGdzdF9idWZmZXJfZ2V0X3ZpZGVvX3RpbWVfY29kZV9tZXRhIChidWZmZXIpOworICAgICAgaWYgKHRjX21ldGEpIHsKKyAgICAgICAgc3BsaXRtdXgtPm5leHRfbWF4X3RjX3RpbWUgPQorICAgICAgICAgICAgY2FsY3VsYXRlX25leHRfbWF4X3RpbWVjb2RlIChzcGxpdG11eCwgJnRjX21ldGEtPnRjKTsKKyAgICAgICAgdGltZWNvZGVfYmFzZWQgPSAoc3BsaXRtdXgtPm5leHRfbWF4X3RjX3RpbWUgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFRoaXMgY2FuIGhhcHBlbiBpbiB0aGUgcHJlc2VuY2Ugb2YgR0FQIGV2ZW50cyB0aGF0IHRyaWdnZXIKKyAgICAgICAqIGEgbmV3IGZyYWdtZW50IHN0YXJ0ICovCisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNwbGl0bXV4LAorICAgICAgICAgICJObyBidWZmZXIgYXZhaWxhYmxlIHRvIGNhbGN1bGF0ZSBuZXh0IHRpbWVjb2RlIik7CisgICAgfQorICB9CisKKyAgaWYgKHNwbGl0bXV4LT5zZW5kX2tleWZyYW1lX3JlcXVlc3RzID09IEZBTFNFCisgICAgICB8fCAoc3BsaXRtdXgtPnRocmVzaG9sZF90aW1lID09IDAgJiYgIXRpbWVjb2RlX2Jhc2VkKQorICAgICAgfHwgc3BsaXRtdXgtPnRocmVzaG9sZF9ieXRlcyAhPSAwKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICh0aW1lY29kZV9iYXNlZCkgeworICAgIC8qIFdlIG1pZ2h0IGhhdmUgcm91bmRpbmcgZXJyb3JzOiBhaW0gc2xpZ2h0bHkgZWFybGllciAqLworICAgIHRhcmdldF90aW1lID0gc3BsaXRtdXgtPm5leHRfbWF4X3RjX3RpbWUgLSA1ICogR1NUX1VTRUNPTkQ7CisgIH0gZWxzZSB7CisgICAgdGFyZ2V0X3RpbWUgPSBzcGxpdG11eC0+ZnJhZ21lbnRfc3RhcnRfdGltZSArIHNwbGl0bXV4LT50aHJlc2hvbGRfdGltZTsKKyAgfQorICBldiA9IGdzdF92aWRlb19ldmVudF9uZXdfdXBzdHJlYW1fZm9yY2Vfa2V5X3VuaXQgKHRhcmdldF90aW1lLCBUUlVFLCAwKTsKKyAgR1NUX0lORk9fT0JKRUNUIChzcGxpdG11eCwgIlJlcXVlc3RpbmcgbmV4dCBrZXlmcmFtZSBhdCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTICh0YXJnZXRfdGltZSkpOworICByZXR1cm4gZ3N0X3BhZF9wdXNoX2V2ZW50IChzcGxpdG11eC0+cmVmZXJlbmNlX2N0eC0+c2lua3BhZCwgZXYpOworfQorCitzdGF0aWMgR3N0UGFkUHJvYmVSZXR1cm4KK2hhbmRsZV9tcV9vdXRwdXQgKEdzdFBhZCAqIHBhZCwgR3N0UGFkUHJvYmVJbmZvICogaW5mbywgTXFTdHJlYW1DdHggKiBjdHgpCit7CisgIEdzdFNwbGl0TXV4U2luayAqc3BsaXRtdXggPSBjdHgtPnNwbGl0bXV4OworICBNcVN0cmVhbUJ1ZiAqYnVmX2luZm8gPSBOVUxMOworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJGaXJlZCBwcm9iZSB0eXBlIDB4JXgiLCBpbmZvLT50eXBlKTsKKworICAvKiBGSVhNRTogSGFuZGxlIGJ1ZmZlciBsaXN0cywgdW50aWwgdGhlbiBtYWtlIGl0IGNsZWFyIHRoZXkgd29uJ3Qgd29yayAqLworICBpZiAoaW5mby0+dHlwZSAmIEdTVF9QQURfUFJPQkVfVFlQRV9CVUZGRVJfTElTVCkgeworICAgIGdfd2FybmluZyAoIkJ1ZmZlciBsaXN0IGhhbmRsaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworICAgIHJldHVybiBHU1RfUEFEX1BST0JFX0RST1A7CisgIH0KKyAgaWYgKGluZm8tPnR5cGUgJiBHU1RfUEFEX1BST0JFX1RZUEVfRVZFTlRfRE9XTlNUUkVBTSB8fAorICAgICAgaW5mby0+dHlwZSAmIEdTVF9QQURfUFJPQkVfVFlQRV9FVkVOVF9GTFVTSCkgeworICAgIEdzdEV2ZW50ICpldmVudCA9IGdzdF9wYWRfcHJvYmVfaW5mb19nZXRfZXZlbnQgKGluZm8pOworICAgIGdib29sZWFuIGxvY2tlZCA9IEZBTFNFOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgIkV2ZW50ICUiIEdTVF9QVFJfRk9STUFULCBldmVudCk7CisKKyAgICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6CisgICAgICAgIGdzdF9ldmVudF9jb3B5X3NlZ21lbnQgKGV2ZW50LCAmY3R4LT5vdXRfc2VnbWVudCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgICAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgICAgbG9ja2VkID0gVFJVRTsKKyAgICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJmN0eC0+b3V0X3NlZ21lbnQsIEdTVF9GT1JNQVRfVU5ERUZJTkVEKTsKKyAgICAgICAgZ19xdWV1ZV9mb3JlYWNoICgmY3R4LT5xdWV1ZWRfYnVmcywgKEdGdW5jKSBtcV9zdHJlYW1fYnVmX2ZyZWUsIE5VTEwpOworICAgICAgICBnX3F1ZXVlX2NsZWFyICgmY3R4LT5xdWV1ZWRfYnVmcyk7CisgICAgICAgIGN0eC0+Zmx1c2hpbmcgPSBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVEFSVDoKKyAgICAgICAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgICAgbG9ja2VkID0gVFJVRTsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgIkZsdXNoIHN0YXJ0Iik7CisgICAgICAgIGN0eC0+Zmx1c2hpbmcgPSBUUlVFOworICAgICAgICBHU1RfU1BMSVRNVVhfQlJPQURDQVNUX09VVFBVVCAoc3BsaXRtdXgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgICAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgICAgbG9ja2VkID0gVFJVRTsKKyAgICAgICAgaWYgKHNwbGl0bXV4LT5vdXRwdXRfc3RhdGUgPT0gU1BMSVRNVVhfT1VUUFVUX1NUQVRFX1NUT1BQRUQpCisgICAgICAgICAgZ290byBiZWFjaDsKKyAgICAgICAgY3R4LT5vdXRfZW9zID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9FVkVOVF9HQVA6eworICAgICAgICBHc3RDbG9ja1RpbWUgZ2FwX3RzOworICAgICAgICBHc3RDbG9ja1RpbWVEaWZmIHJ0aW1lOworCisgICAgICAgIGdzdF9ldmVudF9wYXJzZV9nYXAgKGV2ZW50LCAmZ2FwX3RzLCBOVUxMKTsKKyAgICAgICAgaWYgKGdhcF90cyA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIEdTVF9TUExJVE1VWF9MT0NLIChzcGxpdG11eCk7CisgICAgICAgIGxvY2tlZCA9IFRSVUU7CisKKyAgICAgICAgaWYgKHNwbGl0bXV4LT5vdXRwdXRfc3RhdGUgPT0gU1BMSVRNVVhfT1VUUFVUX1NUQVRFX1NUT1BQRUQpCisgICAgICAgICAgZ290byBiZWFjaDsKKworICAgICAgICAvKiBXaGVuIHdlIGdldCBhIGdhcCBldmVudCBvbiB0aGUKKyAgICAgICAgICogcmVmZXJlbmNlIHN0cmVhbSBhbmQgd2UncmUgdHJ5aW5nIHRvIG9wZW4gYQorICAgICAgICAgKiBuZXcgZmlsZSwgd2UgbmVlZCB0byBzdG9yZSBpdCB1bnRpbCB3ZSBnZXQKKyAgICAgICAgICogdGhlIGJ1ZmZlciBhZnRlcndhcmRzCisgICAgICAgICAqLworICAgICAgICBpZiAoY3R4LT5pc19yZWZlcmVuY2UgJiYKKyAgICAgICAgICAgIChzcGxpdG11eC0+b3V0cHV0X3N0YXRlICE9IFNQTElUTVVYX09VVFBVVF9TVEFURV9PVVRQVVRfR09QKSkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgIlN0b3JpbmcgR0FQIGV2ZW50IHVudGlsIGJ1ZmZlciBhcnJpdmVzIik7CisgICAgICAgICAgZ3N0X2V2ZW50X3JlcGxhY2UgKCZjdHgtPnBlbmRpbmdfZ2FwLCBldmVudCk7CisgICAgICAgICAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICAgICAgICAgIHJldHVybiBHU1RfUEFEX1BST0JFX0hBTkRMRUQ7CisgICAgICAgIH0KKworICAgICAgICBydGltZSA9IG15X3NlZ21lbnRfdG9fcnVubmluZ190aW1lICgmY3R4LT5vdXRfc2VnbWVudCwgZ2FwX3RzKTsKKworICAgICAgICBHU1RfTE9HX09CSkVDVCAocGFkLCAiSGF2ZSBHQVAgdy8gdHMgJSIgR1NUX1NUSU1FX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9TVElNRV9BUkdTIChydGltZSkpOworCisgICAgICAgIGlmIChydGltZSAhPSBHU1RfQ0xPQ0tfU1RJTUVfTk9ORSkgeworICAgICAgICAgIGN0eC0+b3V0X3J1bm5pbmdfdGltZSA9IHJ0aW1lOworICAgICAgICAgIGNvbXBsZXRlX29yX3dhaXRfb25fb3V0IChzcGxpdG11eCwgY3R4KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgR1NUX0VWRU5UX0NVU1RPTV9ET1dOU1RSRUFNOnsKKyAgICAgICAgY29uc3QgR3N0U3RydWN0dXJlICpzOworICAgICAgICBHc3RDbG9ja1RpbWVEaWZmIHRzID0gMDsKKworICAgICAgICBzID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUgKGV2ZW50KTsKKyAgICAgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAic3BsaXRtdXhzaW5rLXVuYmxvY2siKSkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQ2NCAocywgInRpbWVzdGFtcCIsICZ0cyk7CisKKyAgICAgICAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgICAgbG9ja2VkID0gVFJVRTsKKworICAgICAgICBpZiAoc3BsaXRtdXgtPm91dHB1dF9zdGF0ZSA9PSBTUExJVE1VWF9PVVRQVVRfU1RBVEVfU1RPUFBFRCkKKyAgICAgICAgICBnb3RvIGJlYWNoOworICAgICAgICBjdHgtPm91dF9ydW5uaW5nX3RpbWUgPSB0czsKKyAgICAgICAgaWYgKCFjdHgtPmlzX3JlZmVyZW5jZSkKKyAgICAgICAgICBjb21wbGV0ZV9vcl93YWl0X29uX291dCAoc3BsaXRtdXgsIGN0eCk7CisgICAgICAgIEdTVF9TUExJVE1VWF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgICAgcmV0dXJuIEdTVF9QQURfUFJPQkVfRFJPUDsKKyAgICAgIH0KKyAgICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6eworICAgICAgICBHc3RQYWQgKnBlZXI7CisKKyAgICAgICAgaWYgKCFjdHgtPmlzX3JlZmVyZW5jZSkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBwZWVyID0gZ3N0X3BhZF9nZXRfcGVlciAocGFkKTsKKyAgICAgICAgaWYgKHBlZXIpIHsKKyAgICAgICAgICBnYm9vbGVhbiBvayA9IGdzdF9wYWRfc2VuZF9ldmVudCAocGVlciwgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpKTsKKworICAgICAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHBlZXIpOworCisgICAgICAgICAgaWYgKG9rKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBUaGlzIGlzIGluIHRoZSBjYXNlIHRoZSBtdXhlciBkb2Vzbid0IGFsbG93IHRoaXMgY2hhbmdlIG9mIGNhcHMgKi8KKyAgICAgICAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgICAgbG9ja2VkID0gVFJVRTsKKyAgICAgICAgY3R4LT5jYXBzX2NoYW5nZSA9IFRSVUU7CisKKyAgICAgICAgaWYgKHNwbGl0bXV4LT5vdXRwdXRfc3RhdGUgIT0gU1BMSVRNVVhfT1VUUFVUX1NUQVRFX1NUQVJUX05FWFRfRklMRSkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNwbGl0bXV4LAorICAgICAgICAgICAgICAiTmV3IGNhcHMgd2VyZSBub3QgYWNjZXB0ZWQuIFN3aXRjaGluZyBvdXRwdXQgZmlsZSIpOworICAgICAgICAgIGlmIChjdHgtPm91dF9lb3MgPT0gRkFMU0UpIHsKKyAgICAgICAgICAgIHNwbGl0bXV4LT5vdXRwdXRfc3RhdGUgPSBTUExJVE1VWF9PVVRQVVRfU1RBVEVfRU5ESU5HX0ZJTEU7CisgICAgICAgICAgICBHU1RfU1BMSVRNVVhfQlJPQURDQVNUX09VVFBVVCAoc3BsaXRtdXgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIExldHMgaXQgZmFsbCB0aHJvdWdoLCBpZiBpdCBmYWlscyBhZ2FpbiwgdGhlbiB0aGUgbXV4ZXIganVzdCBjYW4ndAorICAgICAgICAgKiBzdXBwb3J0IHRoaXMgZm9ybWF0LCBidXQgYXQgbGVhc3Qgd2UgaGF2ZSBhIGNsb3NlZCBmaWxlLgorICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSBldmVudHMgYXJlbid0IHBhc3NlZAorICAgICAqIHVudGlsIHRoZSBtdXhlciAvIHNpbmsgYXJlIHJlYWR5IGZvciBpdCAqLworICAgIGlmICghbG9ja2VkKQorICAgICAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICBpZiAoIWN0eC0+aXNfcmVmZXJlbmNlKQorICAgICAgY29tcGxldGVfb3Jfd2FpdF9vbl9vdXQgKHNwbGl0bXV4LCBjdHgpOworICAgIEdTVF9TUExJVE1VWF9VTkxPQ0sgKHNwbGl0bXV4KTsKKworICAgIC8qIERvbid0IHRyeSB0byBmb3J3YXJkIHN0aWNreSBldmVudHMgYmVmb3JlIHRoZSBuZXh0IGJ1ZmZlciBpcyB0aGVyZQorICAgICAqIGJlY2F1c2UgaXQgd291bGQgY2F1c2UgYSBuZXcgZmlsZSB0byBiZSBjcmVhdGVkIHdpdGhvdXQgdGhlIGZpcnN0CisgICAgICogYnVmZmVyIGJlaW5nIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBpZiAoY3R4LT5jYXBzX2NoYW5nZSAmJiBHU1RfRVZFTlRfSVNfU1RJQ0tZIChldmVudCkpIHsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgcmV0dXJuIEdTVF9QQURfUFJPQkVfSEFORExFRDsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybiBHU1RfUEFEX1BST0JFX1BBU1M7CisgIH0KKworICAvKiBBbGxvdyBldmVyeXRoaW5nIHRocm91Z2ggdW50aWwgdGhlIGNvbmZpZ3VyZWQgbmV4dCBzdG9wcGluZyBwb2ludCAqLworICBHU1RfU1BMSVRNVVhfTE9DSyAoc3BsaXRtdXgpOworCisgIGJ1Zl9pbmZvID0gZ19xdWV1ZV9wb3BfdGFpbCAoJmN0eC0+cXVldWVkX2J1ZnMpOworICBpZiAoYnVmX2luZm8gPT0gTlVMTCkKKyAgICAvKiBDYW4gb25seSBoYXBwZW4gZHVlIHRvIGEgcG9vcmx5IHRpbWVkIGZsdXNoICovCisgICAgZ290byBiZWFjaDsKKworICAvKiBJZiB3ZSBoYXZlIHBvcHBlZCBhIGtleWZyYW1lLCBkZWNyZW1lbnQgdGhlIHF1ZXVlZF9nb3AgY291bnQgKi8KKyAgaWYgKGJ1Zl9pbmZvLT5rZXlmcmFtZSAmJiBzcGxpdG11eC0+cXVldWVkX2tleWZyYW1lcyA+IDApCisgICAgc3BsaXRtdXgtPnF1ZXVlZF9rZXlmcmFtZXMtLTsKKworICBjdHgtPm91dF9ydW5uaW5nX3RpbWUgPSBidWZfaW5mby0+cnVuX3RzOworICBjdHgtPmN1cl9vdXRfYnVmZmVyID0gZ3N0X3BhZF9wcm9iZV9pbmZvX2dldF9idWZmZXIgKGluZm8pOworCisgIEdTVF9MT0dfT0JKRUNUIChzcGxpdG11eCwKKyAgICAgICJQYWQgJSIgR1NUX1BUUl9GT1JNQVQgIiBidWZmZXIgd2l0aCBydW4gVFMgJSIgR1NUX1NUSU1FX0ZPUk1BVAorICAgICAgIiBzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBwYWQsIEdTVF9TVElNRV9BUkdTIChjdHgtPm91dF9ydW5uaW5nX3RpbWUpLCBidWZfaW5mby0+YnVmX3NpemUpOworCisgIGN0eC0+Y2Fwc19jaGFuZ2UgPSBGQUxTRTsKKworICBjb21wbGV0ZV9vcl93YWl0X29uX291dCAoc3BsaXRtdXgsIGN0eCk7CisKKyAgc3BsaXRtdXgtPm11eGVkX291dF9ieXRlcyArPSBidWZfaW5mby0+YnVmX3NpemU7CisKKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZiA9IGdzdF9wYWRfcHJvYmVfaW5mb19nZXRfYnVmZmVyIChpbmZvKTsKKyAgICBHU1RfTE9HX09CSkVDVCAocGFkLCAiUmV0dXJuaW5nIHRvIHBhc3MgYnVmZmVyICUiIEdTVF9QVFJfRk9STUFUCisgICAgICAgICIgcnVuIHRzICUiIEdTVF9TVElNRV9GT1JNQVQsIGJ1ZiwKKyAgICAgICAgR1NUX1NUSU1FX0FSR1MgKGN0eC0+b3V0X3J1bm5pbmdfdGltZSkpOworICB9CisjZW5kaWYKKworICBjdHgtPmN1cl9vdXRfYnVmZmVyID0gTlVMTDsKKyAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworCisgIC8qIHBlbmRpbmdfZ2FwIGlzIHByb3RlY3RlZCBieSB0aGUgU1RSRUFNIGxvY2sgKi8KKyAgaWYgKGN0eC0+cGVuZGluZ19nYXApIHsKKyAgICAvKiBJZiB3ZSBwcmV2aW91c2x5IHN0b3JlZCBhIGdhcCBldmVudCwgc2VuZCBpdCBub3cgKi8KKyAgICBHc3RQYWQgKnBlZXIgPSBnc3RfcGFkX2dldF9wZWVyIChjdHgtPnNyY3BhZCk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcGxpdG11eCwKKyAgICAgICAgIlBhZCAlIiBHU1RfUFRSX0ZPUk1BVCAiIHNlbmRpbmcgcGVuZGluZyBHQVAgZXZlbnQiLCBjdHgtPnNyY3BhZCk7CisKKyAgICBnc3RfcGFkX3NlbmRfZXZlbnQgKHBlZXIsIGN0eC0+cGVuZGluZ19nYXApOworICAgIGN0eC0+cGVuZGluZ19nYXAgPSBOVUxMOworCisgICAgZ3N0X29iamVjdF91bnJlZiAocGVlcik7CisgIH0KKworICBtcV9zdHJlYW1fYnVmX2ZyZWUgKGJ1Zl9pbmZvKTsKKworICByZXR1cm4gR1NUX1BBRF9QUk9CRV9QQVNTOworCitiZWFjaDoKKyAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICByZXR1cm4gR1NUX1BBRF9QUk9CRV9EUk9QOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3Jlc2VuZF9zdGlja3kgKEdzdFBhZCAqIHBhZCwgR3N0RXZlbnQgKiogZXZlbnQsIEdzdFBhZCAqIHBlZXIpCit7CisgIHJldHVybiBnc3RfcGFkX3NlbmRfZXZlbnQgKHBlZXIsIGdzdF9ldmVudF9yZWYgKCpldmVudCkpOworfQorCitzdGF0aWMgdm9pZAorcmVzdGFydF9jb250ZXh0IChNcVN0cmVhbUN0eCAqIGN0eCwgR3N0U3BsaXRNdXhTaW5rICogc3BsaXRtdXgpCit7CisgIEdzdFBhZCAqcGVlciA9IGdzdF9wYWRfZ2V0X3BlZXIgKGN0eC0+c3JjcGFkKTsKKworICBnc3RfcGFkX3N0aWNreV9ldmVudHNfZm9yZWFjaCAoY3R4LT5zcmNwYWQsCisgICAgICAoR3N0UGFkU3RpY2t5RXZlbnRzRm9yZWFjaEZ1bmN0aW9uKSAocmVzZW5kX3N0aWNreSksIHBlZXIpOworCisgIC8qIENsZWFyIEVPUyBmbGFnIGlmIG5vdCBhY3R1YWxseSBFT1MgKi8KKyAgY3R4LT5vdXRfZW9zID0gR1NUX1BBRF9JU19FT1MgKGN0eC0+c3JjcGFkKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChwZWVyKTsKK30KKworLyogQ2FsbGVkIHdpdGggbG9jayBoZWxkIHdoZW4gYSBmcmFnbWVudAorICogcmVhY2hlcyBFT1MgYW5kIGl0IGlzIHRpbWUgdG8gcmVzdGFydAorICogYSBuZXcgZnJhZ21lbnQKKyAqLworc3RhdGljIHZvaWQKK3N0YXJ0X25leHRfZnJhZ21lbnQgKEdzdFNwbGl0TXV4U2luayAqIHNwbGl0bXV4LCBNcVN0cmVhbUN0eCAqIGN0eCkKK3sKKyAgR3N0RWxlbWVudCAqbXV4ZXIsICpzaW5rOworCisgIC8qIDEgY2hhbmdlIHRvIG5ldyBmaWxlICovCisgIHNwbGl0bXV4LT5zd2l0Y2hpbmdfZnJhZ21lbnQgPSBUUlVFOworCisgIC8qIFdlIG5lZWQgdG8gZHJvcCB0aGUgc3BsaXRtdXggbG9jayB0byBhY3F1aXJlIHRoZSBzdGF0ZSBsb2NrCisgICAqIGhlcmUgYW5kIGVuc3VyZSB0aGVyZSdzIG5vIHJhY3kgc3RhdGUgY2hhbmdlIGdvaW5nIG9uIGVsc2V3aGVyZSAqLworICBtdXhlciA9IGdzdF9vYmplY3RfcmVmIChzcGxpdG11eC0+bXV4ZXIpOworICBzaW5rID0gZ3N0X29iamVjdF9yZWYgKHNwbGl0bXV4LT5hY3RpdmVfc2luayk7CisKKyAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICBHU1RfU1RBVEVfTE9DSyAoc3BsaXRtdXgpOworCisgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKG11eGVyLCBUUlVFKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2xvY2tlZF9zdGF0ZSAoc2luaywgVFJVRSk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAobXV4ZXIsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzaW5rLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgaWYgKHNwbGl0bXV4LT5tdXhlZF9vdXRfYnl0ZXMgPiAwIHx8IHNwbGl0bXV4LT5mcmFnbWVudF9pZCA9PSAwKQorICAgIHNldF9uZXh0X2ZpbGVuYW1lIChzcGxpdG11eCwgY3R4KTsKKyAgc3BsaXRtdXgtPm11eGVkX291dF9ieXRlcyA9IDA7CisgIEdTVF9TUExJVE1VWF9VTkxPQ0sgKHNwbGl0bXV4KTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNpbmssIEdTVF9TVEFURV9UQVJHRVQgKHNwbGl0bXV4KSk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAobXV4ZXIsIEdTVF9TVEFURV9UQVJHRVQgKHNwbGl0bXV4KSk7CisgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKG11eGVyLCBGQUxTRSk7CisgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKHNpbmssIEZBTFNFKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rKTsKKyAgZ3N0X29iamVjdF91bnJlZiAobXV4ZXIpOworCisgIEdTVF9TUExJVE1VWF9MT0NLIChzcGxpdG11eCk7CisgIEdTVF9TVEFURV9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgc3BsaXRtdXgtPnN3aXRjaGluZ19mcmFnbWVudCA9IEZBTFNFOworICBkb19hc3luY19kb25lIChzcGxpdG11eCk7CisKKyAgc3BsaXRtdXgtPnJlYWR5X2Zvcl9vdXRwdXQgPSBUUlVFOworCisgIGdfbGlzdF9mb3JlYWNoIChzcGxpdG11eC0+Y29udGV4dHMsIChHRnVuYykgcmVzdGFydF9jb250ZXh0LCBzcGxpdG11eCk7CisKKyAgc2VuZF9mcmFnbWVudF9vcGVuZWRfY2xvc2VkX21zZyAoc3BsaXRtdXgsIFRSVUUpOworCisgIC8qIEZJWE1FOiBJcyB0aGlzIGFsd2F5cyB0aGUgY29ycmVjdCBuZXh0IHN0YXRlPyAqLworICBzcGxpdG11eC0+b3V0cHV0X3N0YXRlID0gU1BMSVRNVVhfT1VUUFVUX1NUQVRFX0FXQUlUSU5HX0NPTU1BTkQ7CisgIEdTVF9TUExJVE1VWF9CUk9BRENBU1RfT1VUUFVUIChzcGxpdG11eCk7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfaGFuZGxlciAoR3N0QmluICogYmluLCBHc3RNZXNzYWdlICogbWVzc2FnZSkKK3sKKyAgR3N0U3BsaXRNdXhTaW5rICpzcGxpdG11eCA9IEdTVF9TUExJVE1VWF9TSU5LIChiaW4pOworCisgIHN3aXRjaCAoR1NUX01FU1NBR0VfVFlQRSAobWVzc2FnZSkpIHsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VPUzoKKyAgICAgIC8qIElmIHRoZSBzdGF0ZSBpcyBkcmFpbmluZyBvdXQgdGhlIGN1cnJlbnQgZmlsZSwgZHJvcCB0aGlzIEVPUyAqLworICAgICAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKworICAgICAgc2VuZF9mcmFnbWVudF9vcGVuZWRfY2xvc2VkX21zZyAoc3BsaXRtdXgsIEZBTFNFKTsKKworICAgICAgaWYgKHNwbGl0bXV4LT5vdXRwdXRfc3RhdGUgPT0gU1BMSVRNVVhfT1VUUFVUX1NUQVRFX0VORElOR19GSUxFKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNwbGl0bXV4LCAiQ2F1Z2h0IEVPUyBhdCBlbmQgb2YgZnJhZ21lbnQsIGRyb3BwaW5nIik7CisgICAgICAgIHNwbGl0bXV4LT5vdXRwdXRfc3RhdGUgPSBTUExJVE1VWF9PVVRQVVRfU1RBVEVfU1RBUlRfTkVYVF9GSUxFOworICAgICAgICBHU1RfU1BMSVRNVVhfQlJPQURDQVNUX09VVFBVVCAoc3BsaXRtdXgpOworCisgICAgICAgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICAgICAgICByZXR1cm47CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcGxpdG11eCwKKyAgICAgICAgICAgICJQYXNzaW5nIEVPUyBtZXNzYWdlLiBPdXRwdXQgc3RhdGUgJWQgbWF4X291dF9ydW5uaW5nX3RpbWUgJSIKKyAgICAgICAgICAgIEdTVF9TVElNRV9GT1JNQVQsIHNwbGl0bXV4LT5vdXRwdXRfc3RhdGUsCisgICAgICAgICAgICBHU1RfU1RJTUVfQVJHUyAoc3BsaXRtdXgtPm1heF9vdXRfcnVubmluZ190aW1lKSk7CisgICAgICB9CisgICAgICBHU1RfU1BMSVRNVVhfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0FTWU5DX1NUQVJUOgorICAgIGNhc2UgR1NUX01FU1NBR0VfQVNZTkNfRE9ORToKKyAgICAgIC8qIElnbm9yZSBzdGF0ZSBjaGFuZ2VzIGZyb20gb3VyIGNoaWxkcmVuIHdoaWxlIHN3aXRjaGluZyAqLworICAgICAgaWYgKHNwbGl0bXV4LT5zd2l0Y2hpbmdfZnJhZ21lbnQpIHsKKyAgICAgICAgaWYgKEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSkgPT0gKEdzdE9iamVjdCAqKSBzcGxpdG11eC0+YWN0aXZlX3NpbmsKKyAgICAgICAgICAgIHx8IEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSkgPT0gKEdzdE9iamVjdCAqKSBzcGxpdG11eC0+bXV4ZXIpIHsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICAgICAgICJJZ25vcmluZyBzdGF0ZSBjaGFuZ2UgZnJvbSBjaGlsZCAlIiBHU1RfUFRSX0ZPUk1BVAorICAgICAgICAgICAgICAiIHdoaWxlIHN3aXRjaGluZyIsIEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSkpOworICAgICAgICAgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01FU1NBR0VfV0FSTklORzoKKyAgICB7CisgICAgICBHRXJyb3IgKmdlcnJvciA9IE5VTEw7CisKKyAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX3dhcm5pbmcgKG1lc3NhZ2UsICZnZXJyb3IsIE5VTEwpOworCisgICAgICBpZiAoZ19lcnJvcl9tYXRjaGVzIChnZXJyb3IsIEdTVF9TVFJFQU1fRVJST1IsIEdTVF9TVFJFQU1fRVJST1JfRk9STUFUKSkgeworICAgICAgICBHTGlzdCAqaXRlbTsKKyAgICAgICAgZ2Jvb2xlYW4gY2Fwc19jaGFuZ2UgPSBGQUxTRTsKKworICAgICAgICBHU1RfU1BMSVRNVVhfTE9DSyAoc3BsaXRtdXgpOworCisgICAgICAgIGZvciAoaXRlbSA9IHNwbGl0bXV4LT5jb250ZXh0czsgaXRlbTsgaXRlbSA9IGl0ZW0tPm5leHQpIHsKKyAgICAgICAgICBNcVN0cmVhbUN0eCAqY3R4ID0gaXRlbS0+ZGF0YTsKKworICAgICAgICAgIGlmIChjdHgtPmNhcHNfY2hhbmdlKSB7CisgICAgICAgICAgICBjYXBzX2NoYW5nZSA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBHU1RfU1BMSVRNVVhfVU5MT0NLIChzcGxpdG11eCk7CisKKyAgICAgICAgaWYgKGNhcHNfY2hhbmdlKSB7CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHNwbGl0bXV4LAorICAgICAgICAgICAgICAiSWdub3Jpbmcgd2FybmluZyBjaGFuZ2UgZnJvbSBjaGlsZCAlIiBHU1RfUFRSX0ZPUk1BVAorICAgICAgICAgICAgICAiIHdoaWxlIHN3aXRjaGluZyBjYXBzIiwgR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKSk7CisgICAgICAgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIEdTVF9CSU5fQ0xBU1MgKHBhcmVudF9jbGFzcyktPmhhbmRsZV9tZXNzYWdlIChiaW4sIG1lc3NhZ2UpOworfQorCitzdGF0aWMgdm9pZAorY3R4X3NldF91bmJsb2NrIChNcVN0cmVhbUN0eCAqIGN0eCkKK3sKKyAgY3R4LT5uZWVkX3VuYmxvY2sgPSBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK25lZWRfbmV3X2ZyYWdtZW50IChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCwKKyAgICBHc3RDbG9ja1RpbWUgcXVldWVkX3RpbWUsIEdzdENsb2NrVGltZSBxdWV1ZWRfZ29wX3RpbWUsCisgICAgZ3VpbnQ2NCBxdWV1ZWRfYnl0ZXMpCit7CisgIGd1aW50NjQgdGhyZXNoX2J5dGVzOworICBHc3RDbG9ja1RpbWUgdGhyZXNoX3RpbWU7CisgIGdib29sZWFuIGNoZWNrX3JvYnVzdF9tdXhpbmc7CisKKyAgR1NUX09CSkVDVF9MT0NLIChzcGxpdG11eCk7CisgIHRocmVzaF9ieXRlcyA9IHNwbGl0bXV4LT50aHJlc2hvbGRfYnl0ZXM7CisgIHRocmVzaF90aW1lID0gc3BsaXRtdXgtPnRocmVzaG9sZF90aW1lOworICBjaGVja19yb2J1c3RfbXV4aW5nID0gc3BsaXRtdXgtPnVzZV9yb2J1c3RfbXV4aW5nCisgICAgICAmJiBzcGxpdG11eC0+bXV4ZXJfaGFzX3Jlc2VydmVkX3Byb3BzOworICBHU1RfT0JKRUNUX1VOTE9DSyAoc3BsaXRtdXgpOworCisgIC8qIEhhdmUgd2UgbXV4ZWQgYW55dGhpbmcgaW50byB0aGUgbmV3IGZpbGUgYXQgYWxsPyAqLworICBpZiAoc3BsaXRtdXgtPmZyYWdtZW50X3RvdGFsX2J5dGVzIDw9IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIFVzZXIgdG9sZCB1cyB0byBzcGxpdCBub3cgKi8KKyAgaWYgKGdfYXRvbWljX2ludF9nZXQgKCYoc3BsaXRtdXgtPnNwbGl0X25vdykpID09IFRSVUUpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKHRocmVzaF9ieXRlcyA+IDAgJiYgcXVldWVkX2J5dGVzID49IHRocmVzaF9ieXRlcykKKyAgICByZXR1cm4gVFJVRTsgICAgICAgICAgICAgICAgLyogV291bGQgb3ZlcnJ1biBieXRlIGxpbWl0ICovCisKKyAgaWYgKHRocmVzaF90aW1lID4gMCAmJiBxdWV1ZWRfdGltZSA+PSB0aHJlc2hfdGltZSkKKyAgICByZXR1cm4gVFJVRTsgICAgICAgICAgICAgICAgLyogV291bGQgb3ZlcnJ1biBieXRlIGxpbWl0ICovCisKKyAgLyogVGltZWNvZGUtYmFzZWQgdGhyZXNob2xkIGFjY291bnRzIGZvciBwb3NzaWJsZSByb3VuZGluZyBlcnJvcnM6CisgICAqIDV1cyBzaG91bGQgYmUgYmlnZ2VyIHRoYW4gYWxsIHBvc3NpYmxlIHJvdW5kaW5nIGVycm9ycyBidXQgbm93aGVyZSBuZWFyCisgICAqIGJpZyBlbm91Z2ggdG8gc2tpcCB0byBhbm90aGVyIGZyYW1lICovCisgIGlmIChzcGxpdG11eC0+bmV4dF9tYXhfdGNfdGltZSAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FICYmCisgICAgICBzcGxpdG11eC0+cmVmZXJlbmNlX2N0eC0+aW5fcnVubmluZ190aW1lID4KKyAgICAgIHNwbGl0bXV4LT5uZXh0X21heF90Y190aW1lICsgNSAqIEdTVF9VU0VDT05EKQorICAgIHJldHVybiBUUlVFOyAgICAgICAgICAgICAgICAvKiBUaW1lY29kZSB0aHJlc2hvbGQgKi8KKworICBpZiAoY2hlY2tfcm9idXN0X211eGluZykgeworICAgIEdzdENsb2NrVGltZSBtdXhfcmVzZXJ2ZWRfcmVtYWluOworCisgICAgZ19vYmplY3RfZ2V0IChzcGxpdG11eC0+bXV4ZXIsCisgICAgICAgICJyZXNlcnZlZC1kdXJhdGlvbi1yZW1haW5pbmciLCAmbXV4X3Jlc2VydmVkX3JlbWFpbiwgTlVMTCk7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICJNdXhlciByb2J1c3QgbXV4aW5nIHJlcG9ydCAtICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICAgIiByZW1haW5pbmcuIE5ldyBHT1Agd291bGQgZW5xdWV1ZSAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICBtdXhfcmVzZXJ2ZWRfcmVtYWluLCBxdWV1ZWRfZ29wX3RpbWUpOworCisgICAgaWYgKHF1ZXVlZF9nb3BfdGltZSA+PSBtdXhfcmVzZXJ2ZWRfcmVtYWluKSB7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKHNwbGl0bXV4LAorICAgICAgICAgICJGaWxlIGlzIGFib3V0IHRvIHJ1biBvdXQgb2YgaGVhZGVyIHJvb20gLSAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgIiByZW1haW5pbmcuIE5ldyBHT1Agd291bGQgZW5xdWV1ZSAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgIi4gU3dpdGNoaW5nIHRvIG5ldyBmaWxlIiwgbXV4X3Jlc2VydmVkX3JlbWFpbiwgcXVldWVkX2dvcF90aW1lKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorCisgIC8qIENvbnRpbnVlIGFuZCBtdXggdGhpcyBHT1AgKi8KKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiBDYWxsZWQgd2l0aCBzcGxpdG11eCBsb2NrIGhlbGQgKi8KKy8qIENhbGxlZCB3aGVuIGVudGVyaW5nIFByb2Nlc3NpbmdDb21wbGV0ZUdvcCBzdGF0ZQorICogQXNzZXNzIGlmIG1xIGNvbnRlbnRzIG92ZXJmbG93ZWQgdGhlIGN1cnJlbnQgZmlsZQorICogICAtPiBJZiB5ZXMsIG5lZWQgdG8gc3dpdGNoIHRvIG5ldyBmaWxlCisgKiAgIC0+IGlmIG5vLCBzZXQgbWF4X291dF9ydW5uaW5nX3RpbWUgdG8gbGV0IHRoaXMgR09QIGluIGFuZAorICogICAgICBnbyB0byBDT0xMRUNUSU5HX0dPUF9TVEFSVCBzdGF0ZQorICovCitzdGF0aWMgdm9pZAoraGFuZGxlX2dhdGhlcmVkX2dvcCAoR3N0U3BsaXRNdXhTaW5rICogc3BsaXRtdXgpCit7CisgIGd1aW50NjQgcXVldWVkX2J5dGVzOworICBHc3RDbG9ja1RpbWVEaWZmIHF1ZXVlZF90aW1lID0gMDsKKyAgR3N0Q2xvY2tUaW1lRGlmZiBxdWV1ZWRfZ29wX3RpbWUgPSAwOworICBHc3RDbG9ja1RpbWVEaWZmIG5ld19vdXRfdHMgPSBzcGxpdG11eC0+cmVmZXJlbmNlX2N0eC0+aW5fcnVubmluZ190aW1lOworICBTcGxpdE11eE91dHB1dENvbW1hbmQgKmNtZDsKKworICAvKiBBc3Nlc3MgaWYgdGhlIG11bHRpcXVldWUgY29udGVudHMgb3ZlcmZsb3dlZCB0aGUgY3VycmVudCBmaWxlICovCisgIC8qIFdoZW4gY29uc2lkZXJpbmcgaWYgYSBuZXdseSBnYXRoZXJlZCBHT1Agb3ZlcmZsb3dzCisgICAqIHRoZSB0aW1lIGxpbWl0IGZvciB0aGUgZmlsZSwgb25seSBjb25zaWRlciB0aGUgcnVubmluZyB0aW1lIG9mIHRoZQorICAgKiByZWZlcmVuY2Ugc3RyZWFtLiBPdGhlciBzdHJlYW1zIG1pZ2h0IGhhdmUgcnVuIGFoZWFkIGEgbGl0dGxlIGJpdCwKKyAgICogYnV0IGV4dHJhIHBpZWNlcyB3b24ndCBiZSByZWxlYXNlZCB0byB0aGUgbXV4ZXIgYmV5b25kIHRoZSByZWZlcmVuY2UKKyAgICogc3RyZWFtIGN1dC1vZmYgYW55d2F5IC0gc28gaXQgZm9ybXMgdGhlIGxpbWl0LiAqLworICBxdWV1ZWRfYnl0ZXMgPSBzcGxpdG11eC0+ZnJhZ21lbnRfdG90YWxfYnl0ZXMgKyBzcGxpdG11eC0+Z29wX3RvdGFsX2J5dGVzOworICBxdWV1ZWRfdGltZSA9IHNwbGl0bXV4LT5yZWZlcmVuY2VfY3R4LT5pbl9ydW5uaW5nX3RpbWU7CisgIC8qIHF1ZXVlZF9nb3BfdGltZSB0cmFja3MgaG93IG11Y2ggdW53cml0dGVuIGRhdGEgdGhlcmUgaXMgd2FpdGluZyB0bworICAgKiBiZSB3cml0dGVuIHRvIHRoaXMgZnJhZ21lbnQgaW5jbHVkaW5nIHRoaXMgR09QICovCisgIGlmIChzcGxpdG11eC0+cmVmZXJlbmNlX2N0eC0+b3V0X3J1bm5pbmdfdGltZSAhPSBHU1RfQ0xPQ0tfU1RJTUVfTk9ORSkKKyAgICBxdWV1ZWRfZ29wX3RpbWUgPQorICAgICAgICBzcGxpdG11eC0+cmVmZXJlbmNlX2N0eC0+aW5fcnVubmluZ190aW1lIC0KKyAgICAgICAgc3BsaXRtdXgtPnJlZmVyZW5jZV9jdHgtPm91dF9ydW5uaW5nX3RpbWU7CisgIGVsc2UKKyAgICBxdWV1ZWRfZ29wX3RpbWUgPQorICAgICAgICBzcGxpdG11eC0+cmVmZXJlbmNlX2N0eC0+aW5fcnVubmluZ190aW1lIC0gc3BsaXRtdXgtPmdvcF9zdGFydF90aW1lOworCisgIEdTVF9MT0dfT0JKRUNUIChzcGxpdG11eCwgIiBxdWV1ZWRfYnl0ZXMgJSIgR19HVUlOVDY0X0ZPUk1BVCwgcXVldWVkX2J5dGVzKTsKKworICBnX2Fzc2VydCAocXVldWVkX2dvcF90aW1lID49IDApOworICBnX2Fzc2VydCAocXVldWVkX3RpbWUgPj0gc3BsaXRtdXgtPmZyYWdtZW50X3N0YXJ0X3RpbWUpOworCisgIHF1ZXVlZF90aW1lIC09IHNwbGl0bXV4LT5mcmFnbWVudF9zdGFydF90aW1lOworICBpZiAocXVldWVkX3RpbWUgPCBxdWV1ZWRfZ29wX3RpbWUpCisgICAgcXVldWVkX2dvcF90aW1lID0gcXVldWVkX3RpbWU7CisKKyAgLyogRXhwYW5kIHF1ZXVlZCBieXRlcyBlc3RpbWF0ZSBieSBtdXhlciBvdmVyaGVhZCAqLworICBxdWV1ZWRfYnl0ZXMgKz0gKHF1ZXVlZF9ieXRlcyAqIHNwbGl0bXV4LT5tdXhfb3ZlcmhlYWQpOworCisgIEdTVF9MT0dfT0JKRUNUIChzcGxpdG11eCwgIm1xIGF0IFRTICUiIEdTVF9TVElNRV9GT1JNQVQKKyAgICAgICIgYnl0ZXMgJSIgR19HVUlOVDY0X0ZPUk1BVCwgR1NUX1NUSU1FX0FSR1MgKHF1ZXVlZF90aW1lKSwgcXVldWVkX2J5dGVzKTsKKyAgaWYgKHNwbGl0bXV4LT5uZXh0X21heF90Y190aW1lICE9IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICJ0aW1lY29kZSBtcSBUUyAlIiBHU1RfVElNRV9GT1JNQVQgIiB2cyB0YXJnZXQgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChzcGxpdG11eC0+cmVmZXJlbmNlX2N0eC0+aW5fcnVubmluZ190aW1lKSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoc3BsaXRtdXgtPm5leHRfbWF4X3RjX3RpbWUgKyA1ICogR1NUX1VTRUNPTkQpKTsKKyAgfQorCisgIC8qIENoZWNrIGZvciBvdmVycnVuIC0gaGF2ZSB3ZSBvdXRwdXQgYXQgbGVhc3Qgb25lIGJ5dGUgYW5kIG92ZXJydW4KKyAgICogZWl0aGVyIHRocmVzaG9sZD8gKi8KKyAgaWYgKG5lZWRfbmV3X2ZyYWdtZW50IChzcGxpdG11eCwgcXVldWVkX3RpbWUsIHF1ZXVlZF9nb3BfdGltZSwgcXVldWVkX2J5dGVzKSkgeworICAgIGdfYXRvbWljX2ludF9zZXQgKCYoc3BsaXRtdXgtPnNwbGl0X25vdyksIEZBTFNFKTsKKyAgICAvKiBUZWxsIHRoZSBvdXRwdXQgc2lkZSB0byBzdGFydCBhIG5ldyBmcmFnbWVudCAqLworICAgIEdTVF9JTkZPX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICJUaGlzIEdPUCAoZHVyICUiIEdTVF9TVElNRV9GT1JNQVQKKyAgICAgICAgIikgd291bGQgb3ZlcmZsb3cgdGhlIGZyYWdtZW50LCBTZW5kaW5nIHN0YXJ0X25ld19mcmFnbWVudCBjbWQiLAorICAgICAgICBHU1RfU1RJTUVfQVJHUyAoc3BsaXRtdXgtPnJlZmVyZW5jZV9jdHgtPmluX3J1bm5pbmdfdGltZSAtCisgICAgICAgICAgICBzcGxpdG11eC0+Z29wX3N0YXJ0X3RpbWUpKTsKKyAgICBjbWQgPSBvdXRfY21kX2J1Zl9uZXcgKCk7CisgICAgY21kLT5zdGFydF9uZXdfZnJhZ21lbnQgPSBUUlVFOworICAgIGdfcXVldWVfcHVzaF9oZWFkICgmc3BsaXRtdXgtPm91dF9jbWRfcSwgY21kKTsKKyAgICBHU1RfU1BMSVRNVVhfQlJPQURDQVNUX09VVFBVVCAoc3BsaXRtdXgpOworCisgICAgbmV3X291dF90cyA9IHNwbGl0bXV4LT5yZWZlcmVuY2VfY3R4LT5pbl9ydW5uaW5nX3RpbWU7CisgICAgc3BsaXRtdXgtPmZyYWdtZW50X3N0YXJ0X3RpbWUgPSBzcGxpdG11eC0+Z29wX3N0YXJ0X3RpbWU7CisgICAgc3BsaXRtdXgtPmZyYWdtZW50X3RvdGFsX2J5dGVzID0gMDsKKworICAgIGlmIChyZXF1ZXN0X25leHRfa2V5ZnJhbWUgKHNwbGl0bXV4LAorICAgICAgICAgICAgc3BsaXRtdXgtPnJlZmVyZW5jZV9jdHgtPnByZXZfaW5fa2V5ZnJhbWUpID09IEZBTFNFKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNwbGl0bXV4LAorICAgICAgICAgICJDb3VsZCBub3QgcmVxdWVzdCBhIGtleWZyYW1lLiBGaWxlcyBtYXkgbm90IHNwbGl0IGF0IHRoZSBleGFjdCBsb2NhdGlvbiB0aGV5IHNob3VsZCIpOworICAgIH0KKyAgICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZzcGxpdG11eC0+cmVmZXJlbmNlX2N0eC0+cHJldl9pbl9rZXlmcmFtZSwgTlVMTCk7CisgIH0KKworICAvKiBBbmQgc2V0IHVwIHRvIGNvbGxlY3QgdGhlIG5leHQgR09QICovCisgIGlmICghc3BsaXRtdXgtPnJlZmVyZW5jZV9jdHgtPmluX2VvcykgeworICAgIHNwbGl0bXV4LT5pbnB1dF9zdGF0ZSA9IFNQTElUTVVYX0lOUFVUX1NUQVRFX0NPTExFQ1RJTkdfR09QX1NUQVJUOworICAgIHNwbGl0bXV4LT5nb3Bfc3RhcnRfdGltZSA9IG5ld19vdXRfdHM7CisgIH0gZWxzZSB7CisgICAgLyogVGhpcyBpcyBwcm9iYWJseSBhbHJlYWR5IHRoZSBjdXJyZW50IHN0YXRlLCBidXQganVzdCBpbiBjYXNlOiAqLworICAgIHNwbGl0bXV4LT5pbnB1dF9zdGF0ZSA9IFNQTElUTVVYX0lOUFVUX1NUQVRFX0ZJTklTSElOR19VUDsKKyAgICBuZXdfb3V0X3RzID0gR1NUX0NMT0NLX1NUSU1FX05PTkU7ICAvKiBFT1MgcnVucyB1bnRpbCBmb3JldmVyICovCisgIH0KKworICAvKiBBbmQgd2FrZSBhbGwgaW5wdXQgY29udGV4dHMgdG8gc2VuZCBhIHdha2UtdXAgZXZlbnQgKi8KKyAgZ19saXN0X2ZvcmVhY2ggKHNwbGl0bXV4LT5jb250ZXh0cywgKEdGdW5jKSBjdHhfc2V0X3VuYmxvY2ssIE5VTEwpOworICBHU1RfU1BMSVRNVVhfQlJPQURDQVNUX0lOUFVUIChzcGxpdG11eCk7CisKKyAgLyogTm93IGVpdGhlciB3YXkgLSBlaXRoZXIgdGhlcmUgd2FzIG5vIG92ZXJmbG93LCBvciB3ZSByZXF1ZXN0ZWQgYSBuZXcgZnJhZ21lbnQ6IHJlbGVhc2UgdGhpcyBHT1AgKi8KKyAgc3BsaXRtdXgtPmZyYWdtZW50X3RvdGFsX2J5dGVzICs9IHNwbGl0bXV4LT5nb3BfdG90YWxfYnl0ZXM7CisKKyAgaWYgKHNwbGl0bXV4LT5nb3BfdG90YWxfYnl0ZXMgPiAwKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNwbGl0bXV4LAorICAgICAgICAiUmVsZWFzaW5nIEdPUCB0byBvdXRwdXQuIEJ5dGVzIGluIGZyYWdtZW50IG5vdyAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICIgdGltZSAlIiBHU1RfU1RJTUVfRk9STUFULAorICAgICAgICBzcGxpdG11eC0+ZnJhZ21lbnRfdG90YWxfYnl0ZXMsIEdTVF9TVElNRV9BUkdTIChxdWV1ZWRfdGltZSkpOworCisgICAgLyogU2VuZCB0aGlzIEdPUCB0byB0aGUgb3V0cHV0IGNvbW1hbmQgcXVldWUgKi8KKyAgICBjbWQgPSBvdXRfY21kX2J1Zl9uZXcgKCk7CisgICAgY21kLT5zdGFydF9uZXdfZnJhZ21lbnQgPSBGQUxTRTsKKyAgICBjbWQtPm1heF9vdXRwdXRfdHMgPSBuZXdfb3V0X3RzOworICAgIEdTVF9MT0dfT0JKRUNUIChzcGxpdG11eCwgIlNlbmRpbmcgR09QIGNtZCB0byBvdXRwdXQgZm9yIFRTICUiCisgICAgICAgIEdTVF9TVElNRV9GT1JNQVQsIEdTVF9TVElNRV9BUkdTIChuZXdfb3V0X3RzKSk7CisgICAgZ19xdWV1ZV9wdXNoX2hlYWQgKCZzcGxpdG11eC0+b3V0X2NtZF9xLCBjbWQpOworCisgICAgR1NUX1NQTElUTVVYX0JST0FEQ0FTVF9PVVRQVVQgKHNwbGl0bXV4KTsKKyAgfQorCisgIHNwbGl0bXV4LT5nb3BfdG90YWxfYnl0ZXMgPSAwOworfQorCisvKiBDYWxsZWQgd2l0aCBzcGxpdG11eCBsb2NrIGhlbGQgKi8KKy8qIENhbGxlZCBmcm9tIGVhY2ggaW5wdXQgcGFkIHdoZW4gaXQgaXMgaGFzIGFsbCB0aGUgcGllY2VzCisgKiBmb3IgYSBHT1Agb3IgRU9TLCBzdGFydGluZyB3aXRoIHRoZSByZWZlcmVuY2UgcGFkIHdoaWNoIGhhcyBzZXQgdGhlCisgKiBzcGxpdG11eC0+bWF4X2luX3J1bm5pbmdfdGltZQorICovCitzdGF0aWMgdm9pZAorY2hlY2tfY29tcGxldGVkX2dvcCAoR3N0U3BsaXRNdXhTaW5rICogc3BsaXRtdXgsIE1xU3RyZWFtQ3R4ICogY3R4KQoreworICBHTGlzdCAqY3VyOworICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgLyogT24gRU5ESU5HX0ZJTEUsIHRoZSByZWZlcmVuY2Ugc3RyZWFtIHNlbmRzIGEgY29tbWFuZCB0byBzdGFydCBhIG5ldworICAgKiBmcmFnbWVudCwgdGhlbiByZWxlYXNlcyB0aGUgR09QIGZvciBvdXRwdXQgaW4gdGhlIG5ldyBmcmFnbWVudC4KKyAgICogIElmIHNvbWVzIHN0cmVhbXMgcmVjZWl2ZWQgbm8gYnVmZmVyIGR1cmluZyB0aGUgbGFzdCBHT1AgdGhhdCBvdmVycmFuLAorICAgKiBiZWNhdXNlIGl0cyBuZXh0IGJ1ZmZlciBoYXMgYSB0aW1lc3RhbXAgYmlnZ2VyIHRoYW4KKyAgICogY3R4LT5tYXhfaW5fcnVubmluZ190aW1lLCBpdHMgcXVldWUgaXMgZW1wdHkuIEluIHRoYXQgY2FzZSB0aGUgb25seQorICAgKiB3YXkgdG8gd2FrZXVwIHRoZSBvdXRwdXQgdGhyZWFkIGlzIGJ5IGluamVjdGluZyBhbiBldmVudCBpbiB0aGUKKyAgICogcXVldWUuIFRoaXMgdXN1YWxseSBoYXBwZW4gd2l0aCBzdWJ0aXRsZSBzdHJlYW1zLgorICAgKiBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MzcxMS4gKi8KKyAgaWYgKGN0eC0+bmVlZF91bmJsb2NrKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGN0eC0+c2lua3BhZCwgIlNlbmRpbmcgc3BsaXRtdXhzaW5rLXVuYmxvY2sgZXZlbnQiKTsKKyAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX0RPV05TVFJFQU0gfAorICAgICAgICBHU1RfRVZFTlRfVFlQRV9TRVJJQUxJWkVELAorICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoInNwbGl0bXV4c2luay11bmJsb2NrIiwgInRpbWVzdGFtcCIsCisgICAgICAgICAgICBHX1RZUEVfSU5UNjQsIHNwbGl0bXV4LT5tYXhfaW5fcnVubmluZ190aW1lLCBOVUxMKSk7CisKKyAgICBHU1RfU1BMSVRNVVhfVU5MT0NLIChzcGxpdG11eCk7CisgICAgZ3N0X3BhZF9zZW5kX2V2ZW50IChjdHgtPnNpbmtwYWQsIGV2ZW50KTsKKyAgICBHU1RfU1BMSVRNVVhfTE9DSyAoc3BsaXRtdXgpOworCisgICAgY3R4LT5uZWVkX3VuYmxvY2sgPSBGQUxTRTsKKyAgICBHU1RfU1BMSVRNVVhfQlJPQURDQVNUX0lOUFVUIChzcGxpdG11eCk7CisgICAgLyogc3RhdGUgbWF5IGhhdmUgY2hhbmdlZCB3aGlsZSB3ZSB3ZXJlIHVubG9ja2VkLiBMb29wIGFnYWluIGlmIHNvICovCisgICAgaWYgKHNwbGl0bXV4LT5pbnB1dF9zdGF0ZSAhPSBTUExJVE1VWF9JTlBVVF9TVEFURV9XQUlUSU5HX0dPUF9DT0xMRUNUKQorICAgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHNwbGl0bXV4LT5pbnB1dF9zdGF0ZSA9PSBTUExJVE1VWF9JTlBVVF9TVEFURV9XQUlUSU5HX0dPUF9DT0xMRUNUKSB7CisgICAgZ2Jvb2xlYW4gcmVhZHkgPSBUUlVFOworCisgICAgLyogSXRlcmF0ZSBlYWNoIHBhZCwgYW5kIGNoZWNrIHRoYXQgdGhlIGlucHV0IHJ1bm5pbmcgdGltZSBpcyBhdCBsZWFzdAorICAgICAqIHVwIHRvIHRoZSByZWZlcmVuY2UgcnVubmluZyB0aW1lLCBhbmQgaWYgc28gaGFuZGxlIHRoZSBjb2xsZWN0ZWQgR09QICovCisgICAgR1NUX0xPR19PQkpFQ1QgKHNwbGl0bXV4LCAiQ2hlY2tpbmcgR09QIGNvbGxlY3RlZCwgTWF4IGluIHJ1bm5pbmcgdGltZSAlIgorICAgICAgICBHU1RfU1RJTUVfRk9STUFUICIgY3R4ICVwIiwKKyAgICAgICAgR1NUX1NUSU1FX0FSR1MgKHNwbGl0bXV4LT5tYXhfaW5fcnVubmluZ190aW1lKSwgY3R4KTsKKyAgICBmb3IgKGN1ciA9IGdfbGlzdF9maXJzdCAoc3BsaXRtdXgtPmNvbnRleHRzKTsgY3VyICE9IE5VTEw7CisgICAgICAgIGN1ciA9IGdfbGlzdF9uZXh0IChjdXIpKSB7CisgICAgICBNcVN0cmVhbUN0eCAqdG1wY3R4ID0gKE1xU3RyZWFtQ3R4ICopIChjdXItPmRhdGEpOworCisgICAgICBHU1RfTE9HX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICAgIkNvbnRleHQgJXAgKHNyYyBwYWQgJSIgR1NUX1BUUl9GT1JNQVQgIikgVFMgJSIgR1NUX1NUSU1FX0ZPUk1BVAorICAgICAgICAgICIgRU9TICVkIiwgdG1wY3R4LCB0bXBjdHgtPnNyY3BhZCwKKyAgICAgICAgICBHU1RfU1RJTUVfQVJHUyAodG1wY3R4LT5pbl9ydW5uaW5nX3RpbWUpLCB0bXBjdHgtPmluX2Vvcyk7CisKKyAgICAgIGlmIChzcGxpdG11eC0+bWF4X2luX3J1bm5pbmdfdGltZSAhPSBHU1RfQ0xPQ0tfU1RJTUVfTk9ORSAmJgorICAgICAgICAgIHRtcGN0eC0+aW5fcnVubmluZ190aW1lIDwgc3BsaXRtdXgtPm1heF9pbl9ydW5uaW5nX3RpbWUgJiYKKyAgICAgICAgICAhdG1wY3R4LT5pbl9lb3MpIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHNwbGl0bXV4LAorICAgICAgICAgICAgIkNvbnRleHQgJXAgKHNyYyBwYWQgJSIgR1NUX1BUUl9GT1JNQVQgIikgbm90IHJlYWR5LiBXZSdsbCBzbGVlcCIsCisgICAgICAgICAgICB0bXBjdHgsIHRtcGN0eC0+c3JjcGFkKTsKKyAgICAgICAgcmVhZHkgPSBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmIChyZWFkeSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICAgIkNvbGxlY3RlZCBHT1AgaXMgY29tcGxldGUuIFByb2Nlc3NpbmcgKGN0eCAlcCkiLCBjdHgpOworICAgICAgLyogQWxsIHBhZHMgaGF2ZSBhIGNvbXBsZXRlIEdPUCwgcmVsZWFzZSBpdCBpbnRvIHRoZSBtdWx0aXF1ZXVlICovCisgICAgICBoYW5kbGVfZ2F0aGVyZWRfZ29wIChzcGxpdG11eCk7CisgICAgfQorICB9CisKKyAgLyogSWYgdXBzdHJlYW0gcmVhY2hlZCBFT1Mgd2UgYXJlIG5vdCBleHBlY3RpbmcgbW9yZSBkYXRhLCBubyBuZWVkIHRvIHdhaXQKKyAgICogaGVyZS4gKi8KKyAgaWYgKGN0eC0+aW5fZW9zKQorICAgIHJldHVybjsKKworICAvKiBTb21lIHBhZCBpcyBub3QgeWV0IHJlYWR5LCBvciBHT1AgaXMgYmVpbmcgcHVzaGVkCisgICAqIGVpdGhlciB3YXksIHNsZWVwIGFuZCB3YWl0IHRvIGdldCB3b2tlbiAqLworICB3aGlsZSAoc3BsaXRtdXgtPmlucHV0X3N0YXRlID09IFNQTElUTVVYX0lOUFVUX1NUQVRFX1dBSVRJTkdfR09QX0NPTExFQ1QgJiYKKyAgICAgICFjdHgtPmZsdXNoaW5nICYmCisgICAgICAoY3R4LT5pbl9ydW5uaW5nX3RpbWUgPj0gc3BsaXRtdXgtPm1heF9pbl9ydW5uaW5nX3RpbWUpICYmCisgICAgICAoc3BsaXRtdXgtPm1heF9pbl9ydW5uaW5nX3RpbWUgIT0gR1NUX0NMT0NLX1NUSU1FX05PTkUpKSB7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoc3BsaXRtdXgsICJTbGVlcGluZyBmb3IgR09QIGNvbGxlY3Rpb24gKGN0eCAlcCkiLCBjdHgpOworICAgIEdTVF9TUExJVE1VWF9XQUlUX0lOUFVUIChzcGxpdG11eCk7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNwbGl0bXV4LCAiRG9uZSB3YWl0aW5nIGZvciBjb21wbGV0ZSBHT1AgKGN0eCAlcCkiLCBjdHgpOworICB9Cit9CisKK3N0YXRpYyBHc3RQYWRQcm9iZVJldHVybgoraGFuZGxlX21xX2lucHV0IChHc3RQYWQgKiBwYWQsIEdzdFBhZFByb2JlSW5mbyAqIGluZm8sIE1xU3RyZWFtQ3R4ICogY3R4KQoreworICBHc3RTcGxpdE11eFNpbmsgKnNwbGl0bXV4ID0gY3R4LT5zcGxpdG11eDsKKyAgR3N0QnVmZmVyICpidWY7CisgIE1xU3RyZWFtQnVmICpidWZfaW5mbyA9IE5VTEw7CisgIEdzdENsb2NrVGltZSB0czsKKyAgZ2Jvb2xlYW4gbG9vcF9hZ2FpbjsKKyAgZ2Jvb2xlYW4ga2V5ZnJhbWUgPSBGQUxTRTsKKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiRmlyZWQgcHJvYmUgdHlwZSAweCV4IiwgaW5mby0+dHlwZSk7CisKKyAgLyogRklYTUU6IEhhbmRsZSBidWZmZXIgbGlzdHMsIHVudGlsIHRoZW4gbWFrZSBpdCBjbGVhciB0aGV5IHdvbid0IHdvcmsgKi8KKyAgaWYgKGluZm8tPnR5cGUgJiBHU1RfUEFEX1BST0JFX1RZUEVfQlVGRkVSX0xJU1QpIHsKKyAgICBnX3dhcm5pbmcgKCJCdWZmZXIgbGlzdCBoYW5kbGluZyBub3QgaW1wbGVtZW50ZWQiKTsKKyAgICByZXR1cm4gR1NUX1BBRF9QUk9CRV9EUk9QOworICB9CisgIGlmIChpbmZvLT50eXBlICYgR1NUX1BBRF9QUk9CRV9UWVBFX0VWRU5UX0RPV05TVFJFQU0gfHwKKyAgICAgIGluZm8tPnR5cGUgJiBHU1RfUEFEX1BST0JFX1RZUEVfRVZFTlRfRkxVU0gpIHsKKyAgICBHc3RFdmVudCAqZXZlbnQgPSBnc3RfcGFkX3Byb2JlX2luZm9fZ2V0X2V2ZW50IChpbmZvKTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJFdmVudCAlIiBHU1RfUFRSX0ZPUk1BVCwgZXZlbnQpOworCisgICAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgICAgICBnc3RfZXZlbnRfY29weV9zZWdtZW50IChldmVudCwgJmN0eC0+aW5fc2VnbWVudCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgICAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJmN0eC0+aW5fc2VnbWVudCwgR1NUX0ZPUk1BVF9VTkRFRklORUQpOworICAgICAgICBjdHgtPmluX2VvcyA9IEZBTFNFOworICAgICAgICBjdHgtPmluX3J1bm5pbmdfdGltZSA9IEdTVF9DTE9DS19TVElNRV9OT05FOworICAgICAgICBHU1RfU1BMSVRNVVhfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfRVZFTlRfRU9TOgorICAgICAgICBHU1RfU1BMSVRNVVhfTE9DSyAoc3BsaXRtdXgpOworICAgICAgICBjdHgtPmluX2VvcyA9IFRSVUU7CisKKyAgICAgICAgaWYgKHNwbGl0bXV4LT5pbnB1dF9zdGF0ZSA9PSBTUExJVE1VWF9JTlBVVF9TVEFURV9TVE9QUEVEKQorICAgICAgICAgIGdvdG8gYmVhY2g7CisKKyAgICAgICAgaWYgKGN0eC0+aXNfcmVmZXJlbmNlKSB7CisgICAgICAgICAgR1NUX0lORk9fT0JKRUNUIChzcGxpdG11eCwgIkdvdCBSZWZlcmVuY2UgRU9TLiBGaW5pc2hpbmcgdXAiKTsKKyAgICAgICAgICAvKiBjaGVja19jb21wbGV0ZWRfZ29wIHdpbGwgYWN0IGFzIGlmIHRoaXMgaXMgYSBuZXcga2V5ZnJhbWUgd2l0aCBpbmZpbml0ZSB0aW1lc3RhbXAgKi8KKyAgICAgICAgICBzcGxpdG11eC0+aW5wdXRfc3RhdGUgPSBTUExJVE1VWF9JTlBVVF9TVEFURV9XQUlUSU5HX0dPUF9DT0xMRUNUOworICAgICAgICAgIC8qIFdha2UgdXAgb3RoZXIgaW5wdXQgcGFkcyB0byBjb2xsZWN0IHRoaXMgR09QICovCisgICAgICAgICAgR1NUX1NQTElUTVVYX0JST0FEQ0FTVF9JTlBVVCAoc3BsaXRtdXgpOworICAgICAgICAgIGNoZWNrX2NvbXBsZXRlZF9nb3AgKHNwbGl0bXV4LCBjdHgpOworICAgICAgICB9IGVsc2UgaWYgKHNwbGl0bXV4LT5pbnB1dF9zdGF0ZSA9PQorICAgICAgICAgICAgU1BMSVRNVVhfSU5QVVRfU1RBVEVfV0FJVElOR19HT1BfQ09MTEVDVCkgeworICAgICAgICAgIC8qIElmIHdlIGFyZSB3YWl0aW5nIGZvciBhIEdPUCB0byBiZSBjb21wbGV0ZWQgKGllLCBmb3IgYXV4CisgICAgICAgICAgICogcGFkcyB0byBjYXRjaCB1cCksIHRoZW4gdGhpcyBwYWQgaXMgY29tcGxldGUsIHNvIGNoZWNrCisgICAgICAgICAgICogaWYgdGhlIHdob2xlIEdPUCBpcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBjaGVja19jb21wbGV0ZWRfZ29wIChzcGxpdG11eCwgY3R4KTsKKyAgICAgICAgfQorICAgICAgICBHU1RfU1BMSVRNVVhfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfRVZFTlRfR0FQOnsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIGdhcF90czsKKyAgICAgICAgR3N0Q2xvY2tUaW1lRGlmZiBydGltZTsKKworICAgICAgICBnc3RfZXZlbnRfcGFyc2VfZ2FwIChldmVudCwgJmdhcF90cywgTlVMTCk7CisgICAgICAgIGlmIChnYXBfdHMgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBHU1RfU1BMSVRNVVhfTE9DSyAoc3BsaXRtdXgpOworCisgICAgICAgIGlmIChzcGxpdG11eC0+aW5wdXRfc3RhdGUgPT0gU1BMSVRNVVhfSU5QVVRfU1RBVEVfU1RPUFBFRCkKKyAgICAgICAgICBnb3RvIGJlYWNoOworICAgICAgICBydGltZSA9IG15X3NlZ21lbnRfdG9fcnVubmluZ190aW1lICgmY3R4LT5pbl9zZWdtZW50LCBnYXBfdHMpOworCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJIYXZlIEdBUCB3LyB0cyAlIiBHU1RfU1RJTUVfRk9STUFULAorICAgICAgICAgICAgR1NUX1NUSU1FX0FSR1MgKHJ0aW1lKSk7CisKKyAgICAgICAgaWYgKGN0eC0+aXNfcmVmZXJlbmNlCisgICAgICAgICAgICAmJiBzcGxpdG11eC0+ZnJhZ21lbnRfc3RhcnRfdGltZSA9PSBHU1RfQ0xPQ0tfU1RJTUVfTk9ORSkgeworICAgICAgICAgIHNwbGl0bXV4LT5nb3Bfc3RhcnRfdGltZSA9IHNwbGl0bXV4LT5mcmFnbWVudF9zdGFydF90aW1lID0gcnRpbWU7CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHNwbGl0bXV4LCAiTXV4IHN0YXJ0IHRpbWUgbm93ICUiIEdTVF9TVElNRV9GT1JNQVQsCisgICAgICAgICAgICAgIEdTVF9TVElNRV9BUkdTIChzcGxpdG11eC0+ZnJhZ21lbnRfc3RhcnRfdGltZSkpOworICAgICAgICAgIC8qIEFsc28gdGFrZSB0aGlzIGFzIHRoZSBmaXJzdCBzdGFydCB0aW1lIHdoZW4gc3RhcnRpbmcgdXAsCisgICAgICAgICAgICogc28gdGhhdCB3ZSBzdGFydCBjb3VudGluZyBvdmVyZmxvdyBmcm9tIHRoZSBmaXJzdCBmcmFtZSAqLworICAgICAgICAgIGlmICghR1NUX0NMT0NLX1NUSU1FX0lTX1ZBTElEIChzcGxpdG11eC0+bWF4X2luX3J1bm5pbmdfdGltZSkpCisgICAgICAgICAgICBzcGxpdG11eC0+bWF4X2luX3J1bm5pbmdfdGltZSA9IHNwbGl0bXV4LT5mcmFnbWVudF9zdGFydF90aW1lOworICAgICAgICB9CisKKyAgICAgICAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gR1NUX1BBRF9QUk9CRV9QQVNTOworICB9IGVsc2UgaWYgKGluZm8tPnR5cGUgJiBHU1RfUEFEX1BST0JFX1RZUEVfUVVFUllfRE9XTlNUUkVBTSkgeworICAgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKEdTVF9RVUVSWSAoaW5mby0+ZGF0YSkpKSB7CisgICAgICBjYXNlIEdTVF9RVUVSWV9BTExPQ0FUSU9OOgorICAgICAgICByZXR1cm4gR1NUX1BBRF9QUk9CRV9EUk9QOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEdTVF9QQURfUFJPQkVfUEFTUzsKKyAgICB9CisgIH0KKworICBidWYgPSBnc3RfcGFkX3Byb2JlX2luZm9fZ2V0X2J1ZmZlciAoaW5mbyk7CisgIGJ1Zl9pbmZvID0gbXFfc3RyZWFtX2J1Zl9uZXcgKCk7CisKKyAgaWYgKEdTVF9CVUZGRVJfUFRTX0lTX1ZBTElEIChidWYpKQorICAgIHRzID0gR1NUX0JVRkZFUl9QVFMgKGJ1Zik7CisgIGVsc2UKKyAgICB0cyA9IEdTVF9CVUZGRVJfRFRTIChidWYpOworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJCdWZmZXIgVFMgaXMgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTICh0cykpOworCisgIEdTVF9TUExJVE1VWF9MT0NLIChzcGxpdG11eCk7CisKKyAgaWYgKHNwbGl0bXV4LT5pbnB1dF9zdGF0ZSA9PSBTUExJVE1VWF9JTlBVVF9TVEFURV9TVE9QUEVEKQorICAgIGdvdG8gYmVhY2g7CisKKyAgLyogSWYgdGhpcyBidWZmZXIgaGFzIGEgdGltZXN0YW1wLCBhZHZhbmNlIHRoZSBpbnB1dCB0aW1lc3RhbXAgb2YgdGhlCisgICAqIHN0cmVhbSAqLworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHRzKSkgeworICAgIEdzdENsb2NrVGltZURpZmYgcnVubmluZ190aW1lID0KKyAgICAgICAgbXlfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZjdHgtPmluX3NlZ21lbnQsIHRzKTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJCdWZmZXIgcnVubmluZyBUUyBpcyAlIiBHU1RfU1RJTUVfRk9STUFULAorICAgICAgICBHU1RfU1RJTUVfQVJHUyAocnVubmluZ190aW1lKSk7CisKKyAgICBpZiAoR1NUX0NMT0NLX1NUSU1FX0lTX1ZBTElEIChydW5uaW5nX3RpbWUpCisgICAgICAgICYmIHJ1bm5pbmdfdGltZSA+IGN0eC0+aW5fcnVubmluZ190aW1lKQorICAgICAgY3R4LT5pbl9ydW5uaW5nX3RpbWUgPSBydW5uaW5nX3RpbWU7CisgIH0KKworICAvKiBUcnkgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBydW5uaW5nIHRpbWUgKi8KKyAgaWYgKCFHU1RfQ0xPQ0tfU1RJTUVfSVNfVkFMSUQgKGN0eC0+aW5fcnVubmluZ190aW1lKSkgeworICAgIGN0eC0+aW5fcnVubmluZ190aW1lID0KKyAgICAgICAgbXlfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZjdHgtPmluX3NlZ21lbnQsIGN0eC0+aW5fc2VnbWVudC5zdGFydCk7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiaW4gcnVubmluZyB0aW1lIG5vdyAlIiBHU1RfU1RJTUVfRk9STUFULAorICAgICAgR1NUX1NUSU1FX0FSR1MgKGN0eC0+aW5fcnVubmluZ190aW1lKSk7CisKKyAgYnVmX2luZm8tPnJ1bl90cyA9IGN0eC0+aW5fcnVubmluZ190aW1lOworICBidWZfaW5mby0+YnVmX3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpOworICBidWZfaW5mby0+ZHVyYXRpb24gPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpOworCisgIC8qIGluaXRpYWxpemUgZnJhZ21lbnRfc3RhcnRfdGltZSAqLworICBpZiAoY3R4LT5pc19yZWZlcmVuY2UKKyAgICAgICYmIHNwbGl0bXV4LT5mcmFnbWVudF9zdGFydF90aW1lID09IEdTVF9DTE9DS19TVElNRV9OT05FKSB7CisgICAgc3BsaXRtdXgtPmdvcF9zdGFydF90aW1lID0gc3BsaXRtdXgtPmZyYWdtZW50X3N0YXJ0X3RpbWUgPSBidWZfaW5mby0+cnVuX3RzOworICAgIEdTVF9MT0dfT0JKRUNUIChzcGxpdG11eCwgIk11eCBzdGFydCB0aW1lIG5vdyAlIiBHU1RfU1RJTUVfRk9STUFULAorICAgICAgICBHU1RfU1RJTUVfQVJHUyAoc3BsaXRtdXgtPmZyYWdtZW50X3N0YXJ0X3RpbWUpKTsKKyAgICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZjdHgtPnByZXZfaW5fa2V5ZnJhbWUsIGJ1Zik7CisKKyAgICAvKiBBbHNvIHRha2UgdGhpcyBhcyB0aGUgZmlyc3Qgc3RhcnQgdGltZSB3aGVuIHN0YXJ0aW5nIHVwLAorICAgICAqIHNvIHRoYXQgd2Ugc3RhcnQgY291bnRpbmcgb3ZlcmZsb3cgZnJvbSB0aGUgZmlyc3QgZnJhbWUgKi8KKyAgICBpZiAoIUdTVF9DTE9DS19TVElNRV9JU19WQUxJRCAoc3BsaXRtdXgtPm1heF9pbl9ydW5uaW5nX3RpbWUpKQorICAgICAgc3BsaXRtdXgtPm1heF9pbl9ydW5uaW5nX3RpbWUgPSBzcGxpdG11eC0+ZnJhZ21lbnRfc3RhcnRfdGltZTsKKyAgICBpZiAocmVxdWVzdF9uZXh0X2tleWZyYW1lIChzcGxpdG11eCwgY3R4LT5wcmV2X2luX2tleWZyYW1lKSA9PSBGQUxTRSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcGxpdG11eCwKKyAgICAgICAgICAiQ291bGQgbm90IHJlcXVlc3QgYSBrZXlmcmFtZS4gRmlsZXMgbWF5IG5vdCBzcGxpdCBhdCB0aGUgZXhhY3QgbG9jYXRpb24gdGhleSBzaG91bGQiKTsKKyAgICB9CisgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmc3BsaXRtdXgtPnJlZmVyZW5jZV9jdHgtPnByZXZfaW5fa2V5ZnJhbWUsIE5VTEwpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiQnVmIFRTICUiIEdTVF9TVElNRV9GT1JNQVQKKyAgICAgICIgdG90YWwgR09QIGJ5dGVzICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBHU1RfU1RJTUVfQVJHUyAoYnVmX2luZm8tPnJ1bl90cyksIHNwbGl0bXV4LT5nb3BfdG90YWxfYnl0ZXMpOworCisgIGxvb3BfYWdhaW4gPSBUUlVFOworICBkbyB7CisgICAgaWYgKGN0eC0+Zmx1c2hpbmcpCisgICAgICBicmVhazsKKworICAgIHN3aXRjaCAoc3BsaXRtdXgtPmlucHV0X3N0YXRlKSB7CisgICAgICBjYXNlIFNQTElUTVVYX0lOUFVUX1NUQVRFX0NPTExFQ1RJTkdfR09QX1NUQVJUOgorICAgICAgICBpZiAoY3R4LT5pc19yZWZlcmVuY2UpIHsKKyAgICAgICAgICAvKiBJZiBhIGtleWZyYW1lLCB3ZSBoYXZlIGEgY29tcGxldGUgR09QICovCisgICAgICAgICAgaWYgKEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpIHx8CisgICAgICAgICAgICAgICFHU1RfQ0xPQ0tfU1RJTUVfSVNfVkFMSUQgKGN0eC0+aW5fcnVubmluZ190aW1lKSB8fAorICAgICAgICAgICAgICBzcGxpdG11eC0+bWF4X2luX3J1bm5pbmdfdGltZSA+PSBjdHgtPmluX3J1bm5pbmdfdGltZSkgeworICAgICAgICAgICAgLyogUGFzcyB0aGlzIGJ1ZmZlciB0aHJvdWdoICovCisgICAgICAgICAgICBsb29wX2FnYWluID0gRkFMU0U7CisgICAgICAgICAgICAvKiBBbGxvdyBvdGhlciBpbnB1dCBwYWRzIHRvIGNhdGNoIHVwIHRvIGhlcmUgdG9vICovCisgICAgICAgICAgICBzcGxpdG11eC0+bWF4X2luX3J1bm5pbmdfdGltZSA9IGN0eC0+aW5fcnVubmluZ190aW1lOworICAgICAgICAgICAgR1NUX1NQTElUTVVYX0JST0FEQ0FTVF9JTlBVVCAoc3BsaXRtdXgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIEdTVF9JTkZPX09CSkVDVCAocGFkLAorICAgICAgICAgICAgICAiSGF2ZSBrZXlmcmFtZSB3aXRoIHJ1bm5pbmcgdGltZSAlIiBHU1RfU1RJTUVfRk9STUFULAorICAgICAgICAgICAgICBHU1RfU1RJTUVfQVJHUyAoY3R4LT5pbl9ydW5uaW5nX3RpbWUpKTsKKyAgICAgICAgICBrZXlmcmFtZSA9IFRSVUU7CisgICAgICAgICAgc3BsaXRtdXgtPmlucHV0X3N0YXRlID0gU1BMSVRNVVhfSU5QVVRfU1RBVEVfV0FJVElOR19HT1BfQ09MTEVDVDsKKyAgICAgICAgICBzcGxpdG11eC0+bWF4X2luX3J1bm5pbmdfdGltZSA9IGN0eC0+aW5fcnVubmluZ190aW1lOworICAgICAgICAgIC8qIFdha2UgdXAgb3RoZXIgaW5wdXQgcGFkcyB0byBjb2xsZWN0IHRoaXMgR09QICovCisgICAgICAgICAgR1NUX1NQTElUTVVYX0JST0FEQ0FTVF9JTlBVVCAoc3BsaXRtdXgpOworICAgICAgICAgIGNoZWNrX2NvbXBsZXRlZF9nb3AgKHNwbGl0bXV4LCBjdHgpOworICAgICAgICAgIC8qIFN0b3JlIHRoaXMgbmV3IGtleWZyYW1lIHRvIHJlbWVtYmVyIHRoZSBzdGFydCBvZiBHT1AgKi8KKyAgICAgICAgICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZjdHgtPnByZXZfaW5fa2V5ZnJhbWUsIGJ1Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogUGFzcyB0aGlzIGJ1ZmZlciBpZiB0aGUgcmVmZXJlbmNlIGN0eCBpcyBmYXIgZW5vdWdoIGFoZWFkICovCisgICAgICAgICAgaWYgKGN0eC0+aW5fcnVubmluZ190aW1lIDwgc3BsaXRtdXgtPm1heF9pbl9ydW5uaW5nX3RpbWUpIHsKKyAgICAgICAgICAgIGxvb3BfYWdhaW4gPSBGQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIFdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIGEga2V5ZnJhbWUgb24gdGhlIHJlZmVyZW5jZSBwYWQsIHNsZWVwICovCisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgIlNsZWVwaW5nIGZvciBHT1Agc3RhcnQiKTsKKyAgICAgICAgICBHU1RfU1BMSVRNVVhfV0FJVF9JTlBVVCAoc3BsaXRtdXgpOworICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwYWQsCisgICAgICAgICAgICAgICJEb25lIHNsZWVwaW5nIGZvciBHT1Agc3RhcnQgaW5wdXQgc3RhdGUgbm93ICVkIiwKKyAgICAgICAgICAgICAgc3BsaXRtdXgtPmlucHV0X3N0YXRlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU1BMSVRNVVhfSU5QVVRfU1RBVEVfV0FJVElOR19HT1BfQ09MTEVDVDp7CisgICAgICAgIC8qIFdlJ3JlIGNvbGxlY3RpbmcgYSBHT1AuIElmIHRoaXMgaXMgdGhlIHJlZmVyZW5jZSBjb250ZXh0LAorICAgICAgICAgKiB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoaXMgaXMgYSBrZXlmcmFtZSB0aGF0IG1hcmtzIHRoZSBzdGFydAorICAgICAgICAgKiBvZiB0aGUgbmV4dCBHT1AuIElmIGl0IGlzLCBpdCBtYXJrcyB0aGUgZW5kIG9mIHRoZSBHT1Agd2UncmUKKyAgICAgICAgICogY29sbGVjdGluZywgc28gc2xlZXAgYW5kIHdhaXQgdW50aWwgYWxsIHRoZSBvdGhlciBwYWRzIGFsc28KKyAgICAgICAgICogcmVhY2ggdGhhdCB0aW1lc3RhbXAgLSBhdCB3aGljaCBwb2ludCwgd2UgaGF2ZSBhbiBlbnRpcmUgR09QCisgICAgICAgICAqIGFuZCBlaXRoZXIgZ28gdG8gRU5ESU5HX0ZJTEUgb3IgcmVsZWFzZSB0aGlzIEdPUCB0byB0aGUgbXV4ZXIgYW5kCisgICAgICAgICAqIGdvIGJhY2sgdG8gQ09MTEVDVF9HT1BfU1RBUlQuICovCisKKyAgICAgICAgLyogSWYgd2Ugb3ZlcnJhbiB0aGUgdGFyZ2V0IHRpbWVzdGFtcCwgaXQgbWlnaHQgYmUgdGltZSB0byBwcm9jZXNzCisgICAgICAgICAqIHRoZSBHT1AsIG90aGVyd2lzZSBiYWlsIG91dCBmb3IgbW9yZSBkYXRhCisgICAgICAgICAqLworICAgICAgICBHU1RfTE9HX09CSkVDVCAocGFkLAorICAgICAgICAgICAgIkNoZWNraW5nIFRTICUiIEdTVF9TVElNRV9GT1JNQVQgIiBhZ2FpbnN0IG1heCAlIgorICAgICAgICAgICAgR1NUX1NUSU1FX0ZPUk1BVCwgR1NUX1NUSU1FX0FSR1MgKGN0eC0+aW5fcnVubmluZ190aW1lKSwKKyAgICAgICAgICAgIEdTVF9TVElNRV9BUkdTIChzcGxpdG11eC0+bWF4X2luX3J1bm5pbmdfdGltZSkpOworCisgICAgICAgIGlmIChjdHgtPmluX3J1bm5pbmdfdGltZSA8IHNwbGl0bXV4LT5tYXhfaW5fcnVubmluZ190aW1lKSB7CisgICAgICAgICAgbG9vcF9hZ2FpbiA9IEZBTFNFOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhZCwKKyAgICAgICAgICAgICJDb2xsZWN0ZWQgbGFzdCBwYWNrZXQgb2YgR09QLiBDaGVja2luZyBvdGhlciBwYWRzIik7CisgICAgICAgIGNoZWNrX2NvbXBsZXRlZF9nb3AgKHNwbGl0bXV4LCBjdHgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgU1BMSVRNVVhfSU5QVVRfU1RBVEVfRklOSVNISU5HX1VQOgorICAgICAgICBsb29wX2FnYWluID0gRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgbG9vcF9hZ2FpbiA9IEZBTFNFOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgd2hpbGUgKGxvb3BfYWdhaW4pOworCisgIGlmIChrZXlmcmFtZSkgeworICAgIHNwbGl0bXV4LT5xdWV1ZWRfa2V5ZnJhbWVzKys7CisgICAgYnVmX2luZm8tPmtleWZyYW1lID0gVFJVRTsKKyAgfQorCisgIC8qIFVwZGF0ZSB0b3RhbCBpbnB1dCBieXRlIGNvdW50ZXIgZm9yIG92ZXJmbG93IGRldGVjdCAqLworICBzcGxpdG11eC0+Z29wX3RvdGFsX2J5dGVzICs9IGJ1Zl9pbmZvLT5idWZfc2l6ZTsKKworICAvKiBOb3cgYWRkIHRoaXMgYnVmZmVyIHRvIHRoZSBxdWV1ZSBqdXN0IGJlZm9yZSByZXR1cm5pbmcgKi8KKyAgZ19xdWV1ZV9wdXNoX2hlYWQgKCZjdHgtPnF1ZXVlZF9idWZzLCBidWZfaW5mbyk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgIlJldHVybmluZyB0byBxdWV1ZSBidWZmZXIgJSIgR1NUX1BUUl9GT1JNQVQKKyAgICAgICIgcnVuIHRzICUiIEdTVF9TVElNRV9GT1JNQVQsIGJ1ZiwgR1NUX1NUSU1FX0FSR1MgKGN0eC0+aW5fcnVubmluZ190aW1lKSk7CisKKyAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICByZXR1cm4gR1NUX1BBRF9QUk9CRV9QQVNTOworCitiZWFjaDoKKyAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICBpZiAoYnVmX2luZm8pCisgICAgbXFfc3RyZWFtX2J1Zl9mcmVlIChidWZfaW5mbyk7CisgIHJldHVybiBHU1RfUEFEX1BST0JFX1BBU1M7Cit9CisKK3N0YXRpYyB2b2lkCitncm93X2Jsb2NrZWRfcXVldWVzIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCkKK3sKKyAgR0xpc3QgKmN1cjsKKworICAvKiBTY2FuIG90aGVyIHF1ZXVlcyBmb3IgZnVsbC1uZXNzIGFuZCBncm93IHRoZW0gKi8KKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHNwbGl0bXV4LT5jb250ZXh0cyk7CisgICAgICBjdXIgIT0gTlVMTDsgY3VyID0gZ19saXN0X25leHQgKGN1cikpIHsKKyAgICBNcVN0cmVhbUN0eCAqdG1wY3R4ID0gKE1xU3RyZWFtQ3R4ICopIChjdXItPmRhdGEpOworICAgIGd1aW50IGN1cl9saW1pdDsKKyAgICBndWludCBjdXJfbGVuID0gZ19xdWV1ZV9nZXRfbGVuZ3RoICgmdG1wY3R4LT5xdWV1ZWRfYnVmcyk7CisKKyAgICBnX29iamVjdF9nZXQgKHRtcGN0eC0+cSwgIm1heC1zaXplLWJ1ZmZlcnMiLCAmY3VyX2xpbWl0LCBOVUxMKTsKKyAgICBHU1RfTE9HX09CSkVDVCAodG1wY3R4LT5xLCAiUXVldWUgbGVuICV1IiwgY3VyX2xlbik7CisKKyAgICBpZiAoY3VyX2xlbiA+PSBjdXJfbGltaXQpIHsKKyAgICAgIGN1cl9saW1pdCA9IGN1cl9sZW4gKyAxOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAodG1wY3R4LT5xLAorICAgICAgICAgICJRdWV1ZSBvdmVyZmxvd2VkIGFuZCBuZWVkcyBlbmxhcmdpbmcuIEdyb3dpbmcgdG8gJXUgYnVmZmVycyIsCisgICAgICAgICAgY3VyX2xpbWl0KTsKKyAgICAgIGdfb2JqZWN0X3NldCAodG1wY3R4LT5xLCAibWF4LXNpemUtYnVmZmVycyIsIGN1cl9saW1pdCwgTlVMTCk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfcV91bmRlcnJ1biAoR3N0RWxlbWVudCAqIHEsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgTXFTdHJlYW1DdHggKmN0eCA9IChNcVN0cmVhbUN0eCAqKSAodXNlcl9kYXRhKTsKKyAgR3N0U3BsaXRNdXhTaW5rICpzcGxpdG11eCA9IGN0eC0+c3BsaXRtdXg7CisKKyAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocSwKKyAgICAgICJRdWV1ZSByZXBvcnRlZCB1bmRlcnJ1biB3aXRoICVkIGtleWZyYW1lcyBhbmQgJWQgY21kcyBlbnF1ZXVlZCIsCisgICAgICBzcGxpdG11eC0+cXVldWVkX2tleWZyYW1lcywgZ19xdWV1ZV9nZXRfbGVuZ3RoICgmc3BsaXRtdXgtPm91dF9jbWRfcSkpOworICBncm93X2Jsb2NrZWRfcXVldWVzIChzcGxpdG11eCk7CisgIEdTVF9TUExJVE1VWF9VTkxPQ0sgKHNwbGl0bXV4KTsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9xX292ZXJydW4gKEdzdEVsZW1lbnQgKiBxLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIE1xU3RyZWFtQ3R4ICpjdHggPSAoTXFTdHJlYW1DdHggKikgKHVzZXJfZGF0YSk7CisgIEdzdFNwbGl0TXV4U2luayAqc3BsaXRtdXggPSBjdHgtPnNwbGl0bXV4OworICBnYm9vbGVhbiBhbGxvd19ncm93ID0gRkFMU0U7CisKKyAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocSwKKyAgICAgICJRdWV1ZSByZXBvcnRlZCBvdmVycnVuIHdpdGggJWQga2V5ZnJhbWVzIGFuZCAlZCBjbWRzIGVucXVldWVkIiwKKyAgICAgIHNwbGl0bXV4LT5xdWV1ZWRfa2V5ZnJhbWVzLCBnX3F1ZXVlX2dldF9sZW5ndGggKCZzcGxpdG11eC0+b3V0X2NtZF9xKSk7CisKKyAgaWYgKHNwbGl0bXV4LT5xdWV1ZWRfa2V5ZnJhbWVzIDwgMikgeworICAgIC8qIExlc3MgdGhhbiBhIGZ1bGwgR09QIHF1ZXVlZCwgZ3JvdyB0aGUgcXVldWUgKi8KKyAgICBhbGxvd19ncm93ID0gVFJVRTsKKyAgfSBlbHNlIGlmIChnX3F1ZXVlX2dldF9sZW5ndGggKCZzcGxpdG11eC0+b3V0X2NtZF9xKSA8IDEpIHsKKyAgICBhbGxvd19ncm93ID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICAvKiBJZiBhbm90aGVyIHF1ZXVlIGlzIHN0YXJ2ZWQsIGdyb3cgKi8KKyAgICBHTGlzdCAqY3VyOworICAgIGZvciAoY3VyID0gZ19saXN0X2ZpcnN0IChzcGxpdG11eC0+Y29udGV4dHMpOworICAgICAgICBjdXIgIT0gTlVMTDsgY3VyID0gZ19saXN0X25leHQgKGN1cikpIHsKKyAgICAgIE1xU3RyZWFtQ3R4ICp0bXBjdHggPSAoTXFTdHJlYW1DdHggKikgKGN1ci0+ZGF0YSk7CisgICAgICBpZiAodG1wY3R4ICE9IGN0eCAmJiBnX3F1ZXVlX2dldF9sZW5ndGggKCZ0bXBjdHgtPnF1ZXVlZF9idWZzKSA8IDEpIHsKKyAgICAgICAgYWxsb3dfZ3JvdyA9IFRSVUU7CisgICAgICB9CisgICAgfQorICB9CisgIEdTVF9TUExJVE1VWF9VTkxPQ0sgKHNwbGl0bXV4KTsKKworICBpZiAoYWxsb3dfZ3JvdykgeworICAgIGd1aW50IGN1cl9saW1pdDsKKworICAgIGdfb2JqZWN0X2dldCAocSwgIm1heC1zaXplLWJ1ZmZlcnMiLCAmY3VyX2xpbWl0LCBOVUxMKTsKKyAgICBjdXJfbGltaXQrKzsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHEsCisgICAgICAgICJRdWV1ZSBvdmVyZmxvd2VkIGFuZCBuZWVkcyBlbmxhcmdpbmcuIEdyb3dpbmcgdG8gJXUgYnVmZmVycyIsCisgICAgICAgIGN1cl9saW1pdCk7CisKKyAgICBnX29iamVjdF9zZXQgKHEsICJtYXgtc2l6ZS1idWZmZXJzIiwgY3VyX2xpbWl0LCBOVUxMKTsKKyAgfQorfQorCitzdGF0aWMgR3N0UGFkICoKK2dzdF9zcGxpdG11eF9zaW5rX3JlcXVlc3RfbmV3X3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0UGFkVGVtcGxhdGUgKiB0ZW1wbCwgY29uc3QgZ2NoYXIgKiBuYW1lLCBjb25zdCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3BsaXRNdXhTaW5rICpzcGxpdG11eCA9IChHc3RTcGxpdE11eFNpbmsgKikgZWxlbWVudDsKKyAgR3N0UGFkVGVtcGxhdGUgKm11eF90ZW1wbGF0ZSA9IE5VTEw7CisgIEdzdFBhZCAqcmVzID0gTlVMTDsKKyAgR3N0RWxlbWVudCAqcTsKKyAgR3N0UGFkICpxX3NpbmsgPSBOVUxMLCAqcV9zcmMgPSBOVUxMOworICBnY2hhciAqZ25hbWU7CisgIGdib29sZWFuIGlzX3ZpZGVvID0gRkFMU0U7CisgIE1xU3RyZWFtQ3R4ICpjdHg7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZWxlbWVudCwgInRlbXBsOiVzLCBuYW1lOiVzIiwgdGVtcGwtPm5hbWVfdGVtcGxhdGUsIG5hbWUpOworCisgIEdTVF9TUExJVE1VWF9MT0NLIChzcGxpdG11eCk7CisgIGlmICghY3JlYXRlX211eGVyIChzcGxpdG11eCkpCisgICAgZ290byBmYWlsOworCisgIGlmICh0ZW1wbC0+bmFtZV90ZW1wbGF0ZSkgeworICAgIGlmIChnX3N0cl9lcXVhbCAodGVtcGwtPm5hbWVfdGVtcGxhdGUsICJ2aWRlbyIpKSB7CisgICAgICBpZiAoc3BsaXRtdXgtPmhhdmVfdmlkZW8pCisgICAgICAgIGdvdG8gYWxyZWFkeV9oYXZlX3ZpZGVvOworCisgICAgICAvKiBGSVhNRTogTG9vayBmb3IgYSBwYWQgdGVtcGxhdGUgd2l0aCBtYXRjaGluZyBjYXBzLCByYXRoZXIgdGhhbiBieSBuYW1lICovCisgICAgICBtdXhfdGVtcGxhdGUgPQorICAgICAgICAgIGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKEdTVF9FTEVNRU5UX0dFVF9DTEFTUworICAgICAgICAgIChzcGxpdG11eC0+bXV4ZXIpLCAidmlkZW9fJXUiKTsKKworICAgICAgLyogRmFsbGJhY2sgdG8gZmluZCBzaW5rIHBhZCB0ZW1wbGF0ZXMgbmFtZWQgJ3ZpZGVvJyAoZmx2bXV4KSAqLworICAgICAgaWYgKCFtdXhfdGVtcGxhdGUpIHsKKyAgICAgICAgbXV4X3RlbXBsYXRlID0KKyAgICAgICAgICAgIGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKEdTVF9FTEVNRU5UX0dFVF9DTEFTUworICAgICAgICAgICAgKHNwbGl0bXV4LT5tdXhlciksICJ2aWRlbyIpOworICAgICAgfQorICAgICAgaXNfdmlkZW8gPSBUUlVFOworICAgICAgbmFtZSA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgIG11eF90ZW1wbGF0ZSA9CisgICAgICAgICAgZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoR1NUX0VMRU1FTlRfR0VUX0NMQVNTCisgICAgICAgICAgKHNwbGl0bXV4LT5tdXhlciksIHRlbXBsLT5uYW1lX3RlbXBsYXRlKTsKKworICAgICAgLyogRmFsbGJhY2sgdG8gZmluZCBzaW5rIHBhZCB0ZW1wbGF0ZXMgbmFtZWQgJ2F1ZGlvJyAoZmx2bXV4KSAqLworICAgICAgaWYgKCFtdXhfdGVtcGxhdGUpIHsKKyAgICAgICAgbXV4X3RlbXBsYXRlID0KKyAgICAgICAgICAgIGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKEdTVF9FTEVNRU5UX0dFVF9DTEFTUworICAgICAgICAgICAgKHNwbGl0bXV4LT5tdXhlciksICJhdWRpbyIpOworICAgICAgICBuYW1lID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG11eF90ZW1wbGF0ZSA9PSBOVUxMKSB7CisgICAgICAvKiBGYWxsYmFjayB0byBmaW5kIHNpbmsgcGFkIHRlbXBsYXRlcyBuYW1lZCAnc2lua18lZCcgKG1wZWd0c211eCkgKi8KKyAgICAgIG11eF90ZW1wbGF0ZSA9CisgICAgICAgICAgZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoR1NUX0VMRU1FTlRfR0VUX0NMQVNTCisgICAgICAgICAgKHNwbGl0bXV4LT5tdXhlciksICJzaW5rXyVkIik7CisgICAgICBuYW1lID0gTlVMTDsKKyAgICB9CisgIH0KKworICByZXMgPSBnc3RfZWxlbWVudF9yZXF1ZXN0X3BhZCAoc3BsaXRtdXgtPm11eGVyLCBtdXhfdGVtcGxhdGUsIG5hbWUsIGNhcHMpOworICBpZiAocmVzID09IE5VTEwpCisgICAgZ290byBmYWlsOworCisgIGlmIChpc192aWRlbykKKyAgICBnbmFtZSA9IGdfc3RyZHVwICgidmlkZW8iKTsKKyAgZWxzZSBpZiAobmFtZSA9PSBOVUxMKQorICAgIGduYW1lID0gZ3N0X3BhZF9nZXRfbmFtZSAocmVzKTsKKyAgZWxzZQorICAgIGduYW1lID0gZ19zdHJkdXAgKG5hbWUpOworCisgIGlmICgocSA9IGNyZWF0ZV9lbGVtZW50IChzcGxpdG11eCwgInF1ZXVlIiwgTlVMTCwgRkFMU0UpKSA9PSBOVUxMKQorICAgIGdvdG8gZmFpbDsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHEsIEdTVF9TVEFURV9UQVJHRVQgKHNwbGl0bXV4KSk7CisKKyAgZ19vYmplY3Rfc2V0IChxLCAibWF4LXNpemUtYnl0ZXMiLCAwLCAibWF4LXNpemUtdGltZSIsIChndWludDY0KSAoMCksCisgICAgICAibWF4LXNpemUtYnVmZmVycyIsIDUsIE5VTEwpOworCisgIHFfc2luayA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChxLCAic2luayIpOworICBxX3NyYyA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChxLCAic3JjIik7CisKKyAgaWYgKGdzdF9wYWRfbGluayAocV9zcmMsIHJlcykgIT0gR1NUX1BBRF9MSU5LX09LKSB7CisgICAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAoc3BsaXRtdXgtPm11eGVyLCByZXMpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1QgKHJlcykpOworICAgIGdvdG8gZmFpbDsKKyAgfQorCisgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1QgKHJlcykpOworCisgIGN0eCA9IG1xX3N0cmVhbV9jdHhfbmV3IChzcGxpdG11eCk7CisgIC8qIENvbnRleHQgaG9sZHMgYSByZWY6ICovCisgIGN0eC0+cSA9IGdzdF9vYmplY3RfcmVmIChxKTsKKyAgY3R4LT5zcmNwYWQgPSBxX3NyYzsKKyAgY3R4LT5zaW5rcGFkID0gcV9zaW5rOworICBjdHgtPnFfb3ZlcnJ1bl9pZCA9CisgICAgICBnX3NpZ25hbF9jb25uZWN0IChxLCAib3ZlcnJ1biIsIChHQ2FsbGJhY2spIGhhbmRsZV9xX292ZXJydW4sIGN0eCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHEsICJ1bmRlcnJ1biIsIChHQ2FsbGJhY2spIGhhbmRsZV9xX3VuZGVycnVuLCBjdHgpOworCisgIG1xX3N0cmVhbV9jdHhfcmVmIChjdHgpOworICBjdHgtPnNyY19wYWRfYmxvY2tfaWQgPQorICAgICAgZ3N0X3BhZF9hZGRfcHJvYmUgKHFfc3JjLAorICAgICAgR1NUX1BBRF9QUk9CRV9UWVBFX0RBVEFfRE9XTlNUUkVBTSB8IEdTVF9QQURfUFJPQkVfVFlQRV9FVkVOVF9GTFVTSCwKKyAgICAgIChHc3RQYWRQcm9iZUNhbGxiYWNrKSBoYW5kbGVfbXFfb3V0cHV0LCBjdHgsIChHRGVzdHJveU5vdGlmeSkKKyAgICAgIF9wYWRfYmxvY2tfZGVzdHJveV9zcmNfbm90aWZ5KTsKKyAgaWYgKGlzX3ZpZGVvICYmIHNwbGl0bXV4LT5yZWZlcmVuY2VfY3R4ICE9IE5VTEwpIHsKKyAgICBzcGxpdG11eC0+cmVmZXJlbmNlX2N0eC0+aXNfcmVmZXJlbmNlID0gRkFMU0U7CisgICAgc3BsaXRtdXgtPnJlZmVyZW5jZV9jdHggPSBOVUxMOworICB9CisgIGlmIChzcGxpdG11eC0+cmVmZXJlbmNlX2N0eCA9PSBOVUxMKSB7CisgICAgc3BsaXRtdXgtPnJlZmVyZW5jZV9jdHggPSBjdHg7CisgICAgY3R4LT5pc19yZWZlcmVuY2UgPSBUUlVFOworICB9CisKKyAgcmVzID0gZ3N0X2dob3N0X3BhZF9uZXdfZnJvbV90ZW1wbGF0ZSAoZ25hbWUsIHFfc2luaywgdGVtcGwpOworICBnX29iamVjdF9zZXRfcWRhdGEgKChHT2JqZWN0ICopIChyZXMpLCBQQURfQ09OVEVYVCwgY3R4KTsKKworICBtcV9zdHJlYW1fY3R4X3JlZiAoY3R4KTsKKyAgY3R4LT5zaW5rX3BhZF9ibG9ja19pZCA9CisgICAgICBnc3RfcGFkX2FkZF9wcm9iZSAocV9zaW5rLAorICAgICAgR1NUX1BBRF9QUk9CRV9UWVBFX0RBVEFfRE9XTlNUUkVBTSB8IEdTVF9QQURfUFJPQkVfVFlQRV9FVkVOVF9GTFVTSCB8CisgICAgICBHU1RfUEFEX1BST0JFX1RZUEVfUVVFUllfRE9XTlNUUkVBTSwKKyAgICAgIChHc3RQYWRQcm9iZUNhbGxiYWNrKSBoYW5kbGVfbXFfaW5wdXQsIGN0eCwgKEdEZXN0cm95Tm90aWZ5KQorICAgICAgX3BhZF9ibG9ja19kZXN0cm95X3Npbmtfbm90aWZ5KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcGxpdG11eCwgIlJlcXVlc3QgcGFkICUiIEdTVF9QVFJfRk9STUFUCisgICAgICAiIGZlZWRzIHF1ZXVlIHBhZCAlIiBHU1RfUFRSX0ZPUk1BVCwgcmVzLCBxX3NpbmspOworCisgIHNwbGl0bXV4LT5jb250ZXh0cyA9IGdfbGlzdF9wcmVwZW5kIChzcGxpdG11eC0+Y29udGV4dHMsIGN0eCk7CisKKyAgZ19mcmVlIChnbmFtZSk7CisKKyAgaWYgKGlzX3ZpZGVvKQorICAgIHNwbGl0bXV4LT5oYXZlX3ZpZGVvID0gVFJVRTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJlcywgVFJVRSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGVsZW1lbnQsIHJlcyk7CisKKyAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworCisgIHJldHVybiByZXM7CitmYWlsOgorICBHU1RfU1BMSVRNVVhfVU5MT0NLIChzcGxpdG11eCk7CisKKyAgaWYgKHFfc2luaykKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChxX3NpbmspOworICBpZiAocV9zcmMpCisgICAgZ3N0X29iamVjdF91bnJlZiAocV9zcmMpOworICByZXR1cm4gTlVMTDsKK2FscmVhZHlfaGF2ZV92aWRlbzoKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3BsaXRtdXgsICJ2aWRlbyBzaW5rIHBhZCBhbHJlYWR5IHJlcXVlc3RlZCIpOworICBHU1RfU1BMSVRNVVhfVU5MT0NLIChzcGxpdG11eCk7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwbGl0bXV4X3NpbmtfcmVsZWFzZV9wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RQYWQgKiBwYWQpCit7CisgIEdzdFNwbGl0TXV4U2luayAqc3BsaXRtdXggPSAoR3N0U3BsaXRNdXhTaW5rICopIGVsZW1lbnQ7CisgIEdzdFBhZCAqbXV4cGFkID0gTlVMTDsKKyAgTXFTdHJlYW1DdHggKmN0eCA9CisgICAgICAoTXFTdHJlYW1DdHggKikgKGdfb2JqZWN0X2dldF9xZGF0YSAoKEdPYmplY3QgKikgKHBhZCksIFBBRF9DT05URVhUKSk7CisKKyAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKworICBpZiAoc3BsaXRtdXgtPm11eGVyID09IE5VTEwpCisgICAgZ290byBmYWlsOyAgICAgICAgICAgICAgICAgIC8qIEVsZW1lbnRzIGRvbid0IGV4aXN0IHlldCAtIG5vdGhpbmcgdG8gcmVsZWFzZSAqLworCisgIEdTVF9JTkZPX09CSkVDVCAocGFkLCAicmVsZWFzaW5nIHJlcXVlc3QgcGFkIik7CisKKyAgbXV4cGFkID0gZ3N0X3BhZF9nZXRfcGVlciAoY3R4LT5zcmNwYWQpOworCisgIC8qIFJlbW92ZSB0aGUgY29udGV4dCBmcm9tIG91ciBjb25zaWRlcmF0aW9uICovCisgIHNwbGl0bXV4LT5jb250ZXh0cyA9IGdfbGlzdF9yZW1vdmUgKHNwbGl0bXV4LT5jb250ZXh0cywgY3R4KTsKKworICBpZiAoY3R4LT5zaW5rX3BhZF9ibG9ja19pZCkKKyAgICBnc3RfcGFkX3JlbW92ZV9wcm9iZSAoY3R4LT5zaW5rcGFkLCBjdHgtPnNpbmtfcGFkX2Jsb2NrX2lkKTsKKworICBpZiAoY3R4LT5zcmNfcGFkX2Jsb2NrX2lkKQorICAgIGdzdF9wYWRfcmVtb3ZlX3Byb2JlIChjdHgtPnNyY3BhZCwgY3R4LT5zcmNfcGFkX2Jsb2NrX2lkKTsKKworICAvKiBDYW4gcmVsZWFzZSB0aGUgY29udGV4dCBub3cgKi8KKyAgbXFfc3RyZWFtX2N0eF91bnJlZiAoY3R4KTsKKyAgaWYgKGN0eCA9PSBzcGxpdG11eC0+cmVmZXJlbmNlX2N0eCkKKyAgICBzcGxpdG11eC0+cmVmZXJlbmNlX2N0eCA9IE5VTEw7CisKKyAgLyogUmVsZWFzZSBhbmQgZnJlZSB0aGUgbXV4ZXIgaW5wdXQgKi8KKyAgaWYgKG11eHBhZCkgeworICAgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKHNwbGl0bXV4LT5tdXhlciwgbXV4cGFkKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChtdXhwYWQpOworICB9CisKKyAgaWYgKEdTVF9QQURfUEFEX1RFTVBMQVRFIChwYWQpICYmCisgICAgICBnX3N0cl9lcXVhbCAoR1NUX1BBRF9URU1QTEFURV9OQU1FX1RFTVBMQVRFIChHU1RfUEFEX1BBRF9URU1QTEFURQorICAgICAgICAgICAgICAocGFkKSksICJ2aWRlbyIpKQorICAgIHNwbGl0bXV4LT5oYXZlX3ZpZGVvID0gRkFMU0U7CisKKyAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoZWxlbWVudCwgcGFkKTsKKworICAvKiBSZXNldCB0aGUgaW50ZXJuYWwgZWxlbWVudHMgb25seSBhZnRlciBhbGwgcmVxdWVzdCBwYWRzIGFyZSByZWxlYXNlZCAqLworICBpZiAoc3BsaXRtdXgtPmNvbnRleHRzID09IE5VTEwpCisgICAgZ3N0X3NwbGl0bXV4X3Jlc2V0IChzcGxpdG11eCk7CisKK2ZhaWw6CisgIEdTVF9TUExJVE1VWF9VTkxPQ0sgKHNwbGl0bXV4KTsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorY3JlYXRlX2VsZW1lbnQgKEdzdFNwbGl0TXV4U2luayAqIHNwbGl0bXV4LAorICAgIGNvbnN0IGdjaGFyICogZmFjdG9yeSwgY29uc3QgZ2NoYXIgKiBuYW1lLCBnYm9vbGVhbiBsb2NrZWQpCit7CisgIEdzdEVsZW1lbnQgKnJldCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoZmFjdG9yeSwgbmFtZSk7CisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIGdfd2FybmluZyAoIkZhaWxlZCB0byBjcmVhdGUgJXMgLSBzcGxpdG11eHNpbmsgd2lsbCBub3Qgd29yayIsIG5hbWUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKGxvY2tlZCkgeworICAgIC8qIEVuc3VyZSB0aGUgc2luayBzdGFydHMgaW4gbG9ja2VkIHN0YXRlIGFuZCBOVUxMIC0gaXQgd2lsbCBiZSBjaGFuZ2VkCisgICAgICogYnkgdGhlIGZpbGVuYW1lIHNldHRpbmcgY29kZSAqLworICAgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKHJldCwgVFJVRSk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChyZXQsIEdTVF9TVEFURV9OVUxMKTsKKyAgfQorCisgIGlmICghZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHNwbGl0bXV4KSwgcmV0KSkgeworICAgIGdfd2FybmluZyAoIkNvdWxkIG5vdCBhZGQgJXMgZWxlbWVudCAtIHNwbGl0bXV4c2luayB3aWxsIG5vdCB3b3JrIiwgbmFtZSk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocmV0KTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorY3JlYXRlX211eGVyIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCkKK3sKKyAgLyogQ3JlYXRlIGludGVybmFsIGVsZW1lbnRzICovCisgIGlmIChzcGxpdG11eC0+bXV4ZXIgPT0gTlVMTCkgeworICAgIEdzdEVsZW1lbnQgKnByb3ZpZGVkX211eGVyID0gTlVMTDsKKworICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgIGlmIChzcGxpdG11eC0+cHJvdmlkZWRfbXV4ZXIgIT0gTlVMTCkKKyAgICAgIHByb3ZpZGVkX211eGVyID0gZ3N0X29iamVjdF9yZWYgKHNwbGl0bXV4LT5wcm92aWRlZF9tdXhlcik7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKworICAgIGlmIChwcm92aWRlZF9tdXhlciA9PSBOVUxMKSB7CisgICAgICBpZiAoKHNwbGl0bXV4LT5tdXhlciA9CisgICAgICAgICAgICAgIGNyZWF0ZV9lbGVtZW50IChzcGxpdG11eCwgIm1wNG11eCIsICJtdXhlciIsIEZBTFNFKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsOworICAgIH0gZWxzZSB7CisgICAgICAvKiBFbnN1cmUgaXQncyBub3QgaW4gbG9ja2VkIHN0YXRlICh3ZSBtaWdodCBiZSByZXVzaW5nIGFuIG9sZCBlbGVtZW50KSAqLworICAgICAgZ3N0X2VsZW1lbnRfc2V0X2xvY2tlZF9zdGF0ZSAocHJvdmlkZWRfbXV4ZXIsIEZBTFNFKTsKKyAgICAgIGlmICghZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHNwbGl0bXV4KSwgcHJvdmlkZWRfbXV4ZXIpKSB7CisgICAgICAgIGdfd2FybmluZyAoIkNvdWxkIG5vdCBhZGQgbXV4ZXIgZWxlbWVudCAtIHNwbGl0bXV4c2luayB3aWxsIG5vdCB3b3JrIik7CisgICAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHByb3ZpZGVkX211eGVyKTsKKyAgICAgICAgZ290byBmYWlsOworICAgICAgfQorCisgICAgICBzcGxpdG11eC0+bXV4ZXIgPSBwcm92aWRlZF9tdXhlcjsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHByb3ZpZGVkX211eGVyKTsKKyAgICB9CisKKyAgICBpZiAoc3BsaXRtdXgtPnVzZV9yb2J1c3RfbXV4aW5nKSB7CisgICAgICB1cGRhdGVfbXV4ZXJfcHJvcGVydGllcyAoc3BsaXRtdXgpOworICAgIH0KKyAgfQorCisgIHJldHVybiBUUlVFOworZmFpbDoKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCitmaW5kX3NpbmsgKEdzdEVsZW1lbnQgKiBlKQoreworICBHc3RFbGVtZW50ICpyZXMgPSBOVUxMOworICBHc3RJdGVyYXRvciAqaXRlcjsKKyAgZ2Jvb2xlYW4gZG9uZSA9IEZBTFNFOworICBHVmFsdWUgZGF0YSA9IHsgMCwgfTsKKworICBpZiAoIUdTVF9JU19CSU4gKGUpKQorICAgIHJldHVybiBlOworCisgIGlmIChnX29iamVjdF9jbGFzc19maW5kX3Byb3BlcnR5IChHX09CSkVDVF9HRVRfQ0xBU1MgKGUpLCAibG9jYXRpb24iKSAhPSBOVUxMKQorICAgIHJldHVybiBlOworCisgIGl0ZXIgPSBnc3RfYmluX2l0ZXJhdGVfc2lua3MgKEdTVF9CSU4gKGUpKTsKKyAgd2hpbGUgKCFkb25lKSB7CisgICAgc3dpdGNoIChnc3RfaXRlcmF0b3JfbmV4dCAoaXRlciwgJmRhdGEpKSB7CisgICAgICBjYXNlIEdTVF9JVEVSQVRPUl9PSzoKKyAgICAgIHsKKyAgICAgICAgR3N0RWxlbWVudCAqY2hpbGQgPSBnX3ZhbHVlX2dldF9vYmplY3QgKCZkYXRhKTsKKyAgICAgICAgaWYgKGdfb2JqZWN0X2NsYXNzX2ZpbmRfcHJvcGVydHkgKEdfT0JKRUNUX0dFVF9DTEFTUyAoY2hpbGQpLAorICAgICAgICAgICAgICAgICJsb2NhdGlvbiIpICE9IE5VTEwpIHsKKyAgICAgICAgICByZXMgPSBjaGlsZDsKKyAgICAgICAgICBkb25lID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBnX3ZhbHVlX3Jlc2V0ICgmZGF0YSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBHU1RfSVRFUkFUT1JfUkVTWU5DOgorICAgICAgICBnc3RfaXRlcmF0b3JfcmVzeW5jIChpdGVyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9JVEVSQVRPUl9ET05FOgorICAgICAgICBkb25lID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9JVEVSQVRPUl9FUlJPUjoKKyAgICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBnX3ZhbHVlX3Vuc2V0ICgmZGF0YSk7CisgIGdzdF9pdGVyYXRvcl9mcmVlIChpdGVyKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2NyZWF0ZV9zaW5rIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCkKK3sKKyAgR3N0RWxlbWVudCAqcHJvdmlkZWRfc2luayA9IE5VTEw7CisKKyAgaWYgKHNwbGl0bXV4LT5hY3RpdmVfc2luayA9PSBOVUxMKSB7CisKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICBpZiAoc3BsaXRtdXgtPnByb3ZpZGVkX3NpbmsgIT0gTlVMTCkKKyAgICAgIHByb3ZpZGVkX3NpbmsgPSBnc3Rfb2JqZWN0X3JlZiAoc3BsaXRtdXgtPnByb3ZpZGVkX3NpbmspOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisKKyAgICBpZiAocHJvdmlkZWRfc2luayA9PSBOVUxMKSB7CisgICAgICBpZiAoKHNwbGl0bXV4LT5zaW5rID0KKyAgICAgICAgICAgICAgY3JlYXRlX2VsZW1lbnQgKHNwbGl0bXV4LCBERUZBVUxUX1NJTkssICJzaW5rIiwgVFJVRSkpID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgIHNwbGl0bXV4LT5hY3RpdmVfc2luayA9IHNwbGl0bXV4LT5zaW5rOworICAgIH0gZWxzZSB7CisgICAgICAvKiBFbnN1cmUgdGhlIHNpbmsgc3RhcnRzIGluIGxvY2tlZCBzdGF0ZSBhbmQgTlVMTCAtIGl0IHdpbGwgYmUgY2hhbmdlZAorICAgICAgICogYnkgdGhlIGZpbGVuYW1lIHNldHRpbmcgY29kZSAqLworICAgICAgZ3N0X2VsZW1lbnRfc2V0X2xvY2tlZF9zdGF0ZSAocHJvdmlkZWRfc2luaywgVFJVRSk7CisgICAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHByb3ZpZGVkX3NpbmssIEdTVF9TVEFURV9OVUxMKTsKKyAgICAgIGlmICghZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHNwbGl0bXV4KSwgcHJvdmlkZWRfc2luaykpIHsKKyAgICAgICAgZ193YXJuaW5nICgiQ291bGQgbm90IGFkZCBzaW5rIGVsZW1lbnRzIC0gc3BsaXRtdXhzaW5rIHdpbGwgbm90IHdvcmsiKTsKKyAgICAgICAgZ3N0X29iamVjdF91bnJlZiAocHJvdmlkZWRfc2luayk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgIH0KKworICAgICAgc3BsaXRtdXgtPmFjdGl2ZV9zaW5rID0gcHJvdmlkZWRfc2luazsKKworICAgICAgLyogVGhlIGJpbiBob2xkcyBhIHJlZiBub3csIHdlIGNhbiBkcm9wIG91ciB0bXAgcmVmICovCisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChwcm92aWRlZF9zaW5rKTsKKworICAgICAgLyogRmluZCB0aGUgc2luayBlbGVtZW50ICovCisgICAgICBzcGxpdG11eC0+c2luayA9IGZpbmRfc2luayAoc3BsaXRtdXgtPmFjdGl2ZV9zaW5rKTsKKyAgICAgIGlmIChzcGxpdG11eC0+c2luayA9PSBOVUxMKSB7CisgICAgICAgIGdfd2FybmluZworICAgICAgICAgICAgKCJDb3VsZCBub3QgbG9jYXRlIHNpbmsgZWxlbWVudCBpbiBwcm92aWRlZCBzaW5rIC0gc3BsaXRtdXhzaW5rIHdpbGwgbm90IHdvcmsiKTsKKyAgICAgICAgZ290byBmYWlsOworICAgICAgfQorICAgIH0KKworI2lmIDEKKyAgICBpZiAoZ19vYmplY3RfY2xhc3NfZmluZF9wcm9wZXJ0eSAoR19PQkpFQ1RfR0VUX0NMQVNTIChzcGxpdG11eC0+c2luayksCisgICAgICAgICAgICAiYXN5bmMiKSAhPSBOVUxMKSB7CisgICAgICAvKiBhc3luYyBjaGlsZCBlbGVtZW50cyBhcmUgY2F1c2luZyBzdGF0ZSBjaGFuZ2UgcmFjZXMgYW5kIHdlaXJkCisgICAgICAgKiBmYWlsdXJlcywgc28gbGV0J3MgdHJ5IGFuZCB0dXJuIHRoYXQgb2ZmICovCisgICAgICBnX29iamVjdF9zZXQgKHNwbGl0bXV4LT5zaW5rLCAiYXN5bmMiLCBGQUxTRSwgTlVMTCk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIWdzdF9lbGVtZW50X2xpbmsgKHNwbGl0bXV4LT5tdXhlciwgc3BsaXRtdXgtPmFjdGl2ZV9zaW5rKSkgeworICAgICAgZ193YXJuaW5nICgiRmFpbGVkIHRvIGxpbmsgbXV4ZXIgYW5kIHNpbmstIHNwbGl0bXV4c2luayB3aWxsIG5vdCB3b3JrIik7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFRSVUU7CitmYWlsOgorICByZXR1cm4gRkFMU0U7Cit9CisKKyNpZmRlZiBfX0dOVUNfXworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2Zvcm1hdC1ub25saXRlcmFsIgorI2VuZGlmCitzdGF0aWMgdm9pZAorc2V0X25leHRfZmlsZW5hbWUgKEdzdFNwbGl0TXV4U2luayAqIHNwbGl0bXV4LCBNcVN0cmVhbUN0eCAqIGN0eCkKK3sKKyAgZ2NoYXIgKmZuYW1lID0gTlVMTDsKKyAgR3N0U2FtcGxlICpzYW1wbGU7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgZ3N0X3NwbGl0bXV4X3NpbmtfZW5zdXJlX21heF9maWxlcyAoc3BsaXRtdXgpOworCisgIGlmIChjdHgtPmN1cl9vdXRfYnVmZmVyID09IE5VTEwpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNwbGl0bXV4LCAiU3RhcnRpbmcgbmV4dCBmaWxlIHdpdGhvdXQgYnVmZmVyIik7CisgIH0KKworICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChjdHgtPnNyY3BhZCk7CisgIHNhbXBsZSA9IGdzdF9zYW1wbGVfbmV3IChjdHgtPmN1cl9vdXRfYnVmZmVyLCBjYXBzLCAmY3R4LT5vdXRfc2VnbWVudCwgTlVMTCk7CisgIGdfc2lnbmFsX2VtaXQgKHNwbGl0bXV4LCBzaWduYWxzW1NJR05BTF9GT1JNQVRfTE9DQVRJT05fRlVMTF0sIDAsCisgICAgICBzcGxpdG11eC0+ZnJhZ21lbnRfaWQsIHNhbXBsZSwgJmZuYW1lKTsKKyAgZ3N0X3NhbXBsZV91bnJlZiAoc2FtcGxlKTsKKyAgaWYgKGNhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGlmIChmbmFtZSA9PSBOVUxMKSB7CisgICAgLyogRmFsbGJhY2sgdG8gdGhlIG9sZCBzaWduYWwgaWYgdGhlIG5ldyBvbmUgcmV0dXJuZWQgbm90aGluZyAqLworICAgIGdfc2lnbmFsX2VtaXQgKHNwbGl0bXV4LCBzaWduYWxzW1NJR05BTF9GT1JNQVRfTE9DQVRJT05dLCAwLAorICAgICAgICBzcGxpdG11eC0+ZnJhZ21lbnRfaWQsICZmbmFtZSk7CisgIH0KKworICBpZiAoIWZuYW1lKQorICAgIGZuYW1lID0gc3BsaXRtdXgtPmxvY2F0aW9uID8KKyAgICAgICAgZ19zdHJkdXBfcHJpbnRmIChzcGxpdG11eC0+bG9jYXRpb24sIHNwbGl0bXV4LT5mcmFnbWVudF9pZCkgOiBOVUxMOworCisgIGlmIChmbmFtZSkgeworICAgIEdTVF9JTkZPX09CSkVDVCAoc3BsaXRtdXgsICJTZXR0aW5nIGZpbGUgdG8gJXMiLCBmbmFtZSk7CisgICAgZ19vYmplY3Rfc2V0IChzcGxpdG11eC0+c2luaywgImxvY2F0aW9uIiwgZm5hbWUsIE5VTEwpOworICAgIGdfZnJlZSAoZm5hbWUpOworCisgICAgc3BsaXRtdXgtPmZyYWdtZW50X2lkKys7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2RvX2FzeW5jX3N0YXJ0IChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCkKK3sKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKworICBpZiAoIXNwbGl0bXV4LT5uZWVkX2FzeW5jX3N0YXJ0KSB7CisgICAgR1NUX0lORk9fT0JKRUNUIChzcGxpdG11eCwgIm5vIGFzeW5jX3N0YXJ0IG5lZWRlZCIpOworICAgIHJldHVybjsKKyAgfQorCisgIHNwbGl0bXV4LT5hc3luY19wZW5kaW5nID0gVFJVRTsKKworICBHU1RfSU5GT19PQkpFQ1QgKHNwbGl0bXV4LCAiU2VuZGluZyBhc3luY19zdGFydCBtZXNzYWdlIik7CisgIG1lc3NhZ2UgPSBnc3RfbWVzc2FnZV9uZXdfYXN5bmNfc3RhcnQgKEdTVF9PQkpFQ1RfQ0FTVCAoc3BsaXRtdXgpKTsKKyAgR1NUX0JJTl9DTEFTUyAocGFyZW50X2NsYXNzKS0+aGFuZGxlX21lc3NhZ2UgKEdTVF9CSU5fQ0FTVAorICAgICAgKHNwbGl0bXV4KSwgbWVzc2FnZSk7Cit9CisKK3N0YXRpYyB2b2lkCitkb19hc3luY19kb25lIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCkKK3sKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKworICBpZiAoc3BsaXRtdXgtPmFzeW5jX3BlbmRpbmcpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHNwbGl0bXV4LCAiU2VuZGluZyBhc3luY19kb25lIG1lc3NhZ2UiKTsKKyAgICBtZXNzYWdlID0KKyAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2FzeW5jX2RvbmUgKEdTVF9PQkpFQ1RfQ0FTVCAoc3BsaXRtdXgpLAorICAgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKyAgICBHU1RfQklOX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5oYW5kbGVfbWVzc2FnZSAoR1NUX0JJTl9DQVNUCisgICAgICAgIChzcGxpdG11eCksIG1lc3NhZ2UpOworCisgICAgc3BsaXRtdXgtPmFzeW5jX3BlbmRpbmcgPSBGQUxTRTsKKyAgfQorCisgIHNwbGl0bXV4LT5uZWVkX2FzeW5jX3N0YXJ0ID0gRkFMU0U7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3NwbGl0bXV4X3NpbmtfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RTcGxpdE11eFNpbmsgKnNwbGl0bXV4ID0gKEdzdFNwbGl0TXV4U2luayAqKSBlbGVtZW50OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOnsKKyAgICAgIEdTVF9TUExJVE1VWF9MT0NLIChzcGxpdG11eCk7CisgICAgICBpZiAoIWNyZWF0ZV9tdXhlciAoc3BsaXRtdXgpIHx8ICFjcmVhdGVfc2luayAoc3BsaXRtdXgpKSB7CisgICAgICAgIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRTsKKyAgICAgICAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICAgICAgICBnb3RvIGJlYWNoOworICAgICAgfQorICAgICAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICAgICAgc3BsaXRtdXgtPmZyYWdtZW50X2lkID0gMDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOnsKKyAgICAgIEdTVF9TUExJVE1VWF9MT0NLIChzcGxpdG11eCk7CisgICAgICAvKiBTdGFydCBieSBjb2xsZWN0aW5nIG9uZSBpbnB1dCBvbiBlYWNoIHBhZCAqLworICAgICAgc3BsaXRtdXgtPmlucHV0X3N0YXRlID0gU1BMSVRNVVhfSU5QVVRfU1RBVEVfQ09MTEVDVElOR19HT1BfU1RBUlQ7CisgICAgICBzcGxpdG11eC0+b3V0cHV0X3N0YXRlID0gU1BMSVRNVVhfT1VUUFVUX1NUQVRFX1NUQVJUX05FWFRfRklMRTsKKyAgICAgIHNwbGl0bXV4LT5tYXhfaW5fcnVubmluZ190aW1lID0gR1NUX0NMT0NLX1NUSU1FX05PTkU7CisgICAgICBzcGxpdG11eC0+Z29wX3N0YXJ0X3RpbWUgPSBzcGxpdG11eC0+ZnJhZ21lbnRfc3RhcnRfdGltZSA9CisgICAgICAgICAgR1NUX0NMT0NLX1NUSU1FX05PTkU7CisgICAgICBzcGxpdG11eC0+bXV4ZWRfb3V0X2J5dGVzID0gMDsKKyAgICAgIHNwbGl0bXV4LT5yZWFkeV9mb3Jfb3V0cHV0ID0gRkFMU0U7CisgICAgICBHU1RfU1BMSVRNVVhfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdfYXRvbWljX2ludF9zZXQgKCYoc3BsaXRtdXgtPnNwbGl0X25vdyksIEZBTFNFKTsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIEdTVF9TUExJVE1VWF9MT0NLIChzcGxpdG11eCk7CisgICAgICBzcGxpdG11eC0+b3V0cHV0X3N0YXRlID0gU1BMSVRNVVhfT1VUUFVUX1NUQVRFX1NUT1BQRUQ7CisgICAgICBzcGxpdG11eC0+aW5wdXRfc3RhdGUgPSBTUExJVE1VWF9JTlBVVF9TVEFURV9TVE9QUEVEOworICAgICAgLyogV2FrZSB1cCBhbnkgYmxvY2tlZCB0aHJlYWRzICovCisgICAgICBHU1RfTE9HX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICAgIlN0YXRlIGNoYW5nZSAtPiBOVUxMIG9yIFJFQURZLiBXYWtpbmcgdGhyZWFkcyIpOworICAgICAgR1NUX1NQTElUTVVYX0JST0FEQ0FTVF9JTlBVVCAoc3BsaXRtdXgpOworICAgICAgR1NUX1NQTElUTVVYX0JST0FEQ0FTVF9PVVRQVVQgKHNwbGl0bXV4KTsKKyAgICAgIEdTVF9TUExJVE1VWF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkKKyAgICBnb3RvIGJlYWNoOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QTEFZSU5HX1RPX1BBVVNFRDoKKyAgICAgIHNwbGl0bXV4LT5uZWVkX2FzeW5jX3N0YXJ0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6eworICAgICAgLyogQ2hhbmdlIHN0YXRlIGFzeW5jLCBiZWNhdXNlIG91ciBjaGlsZCBzaW5rIG1pZ2h0IG5vdAorICAgICAgICogYmUgcmVhZHkgdG8gZG8gdGhhdCBmb3IgdXMgeWV0IGlmIGl0J3Mgc3RhdGUgaXMgc3RpbGwgbG9ja2VkICovCisKKyAgICAgIHNwbGl0bXV4LT5uZWVkX2FzeW5jX3N0YXJ0ID0gVFJVRTsKKyAgICAgIC8qIHdlIHdhbnQgdG8gZ28gYXN5bmMgdG8gUEFVU0VEIHVudGlsIHdlIG1hbmFnZWQgdG8gY29uZmlndXJlIGFuZCBhZGQgdGhlCisgICAgICAgKiBzaW5rICovCisgICAgICBHU1RfU1BMSVRNVVhfTE9DSyAoc3BsaXRtdXgpOworICAgICAgZG9fYXN5bmNfc3RhcnQgKHNwbGl0bXV4KTsKKyAgICAgIEdTVF9TUExJVE1VWF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfQVNZTkM7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBHU1RfU1BMSVRNVVhfTE9DSyAoc3BsaXRtdXgpOworICAgICAgc3BsaXRtdXgtPmZyYWdtZW50X2lkID0gMDsKKyAgICAgIC8qIFJlc2V0IGludGVybmFsIGVsZW1lbnRzIG9ubHkgaWYgbm8gcGFkIGNvbnRleHRzIGFyZSB1c2luZyB0aGVtICovCisgICAgICBpZiAoc3BsaXRtdXgtPmNvbnRleHRzID09IE5VTEwpCisgICAgICAgIGdzdF9zcGxpdG11eF9yZXNldCAoc3BsaXRtdXgpOworICAgICAgZG9fYXN5bmNfZG9uZSAoc3BsaXRtdXgpOworICAgICAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKK2JlYWNoOgorICBpZiAodHJhbnNpdGlvbiA9PSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFkgJiYKKyAgICAgIHJldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpIHsKKyAgICAvKiBDbGVhbnVwIGVsZW1lbnRzIG9uIGZhaWxlZCB0cmFuc2l0aW9uIG91dCBvZiBOVUxMICovCisgICAgZ3N0X3NwbGl0bXV4X3Jlc2V0IChzcGxpdG11eCk7CisgICAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICBkb19hc3luY19kb25lIChzcGxpdG11eCk7CisgICAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCityZWdpc3Rlcl9zcGxpdG11eHNpbmsgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHNwbGl0bXV4X2RlYnVnLCAic3BsaXRtdXhzaW5rIiwgMCwKKyAgICAgICJTcGxpdCBGaWxlIE11eGluZyBTaW5rIik7CisKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJzcGxpdG11eHNpbmsiLCBHU1RfUkFOS19OT05FLAorICAgICAgR1NUX1RZUEVfU1BMSVRNVVhfU0lOSyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfc2lua19lbnN1cmVfbWF4X2ZpbGVzIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCkKK3sKKyAgaWYgKHNwbGl0bXV4LT5tYXhfZmlsZXMgJiYgc3BsaXRtdXgtPmZyYWdtZW50X2lkID49IHNwbGl0bXV4LT5tYXhfZmlsZXMpIHsKKyAgICBzcGxpdG11eC0+ZnJhZ21lbnRfaWQgPSAwOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitzcGxpdF9ub3cgKEdzdFNwbGl0TXV4U2luayAqIHNwbGl0bXV4KQoreworICBnX2F0b21pY19pbnRfc2V0ICgmKHNwbGl0bXV4LT5zcGxpdF9ub3cpLCBUUlVFKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmggYi9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYjkwNjUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oCkBAIC0wLDAgKzEsMTg0IEBACisvKiBHU3RyZWFtZXIgc3BsaXQgbXV4ZXIgYmluCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9TUExJVE1VWFNJTktfSF9fCisjZGVmaW5lIF9fR1NUX1NQTElUTVVYU0lOS19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcGJ1dGlscy9wYnV0aWxzLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfU1BMSVRNVVhfU0lOSyAgICAgICAgICAgICAgIChnc3Rfc3BsaXRtdXhfc2lua19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfU1BMSVRNVVhfU0lOSyhvYmopICAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1NQTElUTVVYX1NJTkssR3N0U3BsaXRNdXhTaW5rKSkKKyNkZWZpbmUgR1NUX1NQTElUTVVYX1NJTktfQ0xBU1Moa2xhc3MpICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1NQTElUTVVYX1NJTkssR3N0U3BsaXRNdXhTaW5rQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfU1BMSVRNVVhfU0lOSyhvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1NQTElUTVVYX1NJTkspKQorI2RlZmluZSBHU1RfSVNfU1BMSVRNVVhfU0lOS19DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfU1BMSVRNVVhfU0lOSykpCit0eXBlZGVmIHN0cnVjdCBfR3N0U3BsaXRNdXhTaW5rIEdzdFNwbGl0TXV4U2luazsKK3R5cGVkZWYgc3RydWN0IF9Hc3RTcGxpdE11eFNpbmtDbGFzcyBHc3RTcGxpdE11eFNpbmtDbGFzczsKKworR1R5cGUgZ3N0X3NwbGl0bXV4X3NpbmtfZ2V0X3R5cGUgKHZvaWQpOworZ2Jvb2xlYW4gcmVnaXN0ZXJfc3BsaXRtdXhzaW5rIChHc3RQbHVnaW4gKiBwbHVnaW4pOworCit0eXBlZGVmIGVudW0gX1NwbGl0TXV4SW5wdXRTdGF0ZQoreworICBTUExJVE1VWF9JTlBVVF9TVEFURV9TVE9QUEVELAorICBTUExJVE1VWF9JTlBVVF9TVEFURV9DT0xMRUNUSU5HX0dPUF9TVEFSVCwgICAgLyogV2FpdGluZyBmb3IgdGhlIG5leHQgcmVmIGN0eCBrZXlmcmFtZSAqLworICBTUExJVE1VWF9JTlBVVF9TVEFURV9XQUlUSU5HX0dPUF9DT0xMRUNULCAgICAgLyogV2FpdGluZyBmb3IgYWxsIHN0cmVhbXMgdG8gY29sbGVjdCBHT1AgKi8KKyAgU1BMSVRNVVhfSU5QVVRfU1RBVEVfRklOSVNISU5HX1VQICAgICAgICAgICAgIC8qIEdvdCBFT1MgZnJvbSByZWZlcmVuY2UgY3R4LCBzZW5kIGV2ZXJ5dGhpbmcgKi8KK30gU3BsaXRNdXhJbnB1dFN0YXRlOworCit0eXBlZGVmIGVudW0gX1NwbGl0TXV4T3V0cHV0U3RhdGUKK3sKKyAgU1BMSVRNVVhfT1VUUFVUX1NUQVRFX1NUT1BQRUQsCisgIFNQTElUTVVYX09VVFBVVF9TVEFURV9BV0FJVElOR19DT01NQU5ELCAgICAgICAvKiBXYWl0aW5nIGZpcnN0IGNvbW1hbmQgcGFja2V0IGZyb20gaW5wdXQgKi8KKyAgU1BMSVRNVVhfT1VUUFVUX1NUQVRFX09VVFBVVF9HT1AsICAgICAvKiBPdXRwdXR0aW5nIGEgY29sbGVjdGVkIEdPUCAqLworICBTUExJVE1VWF9PVVRQVVRfU1RBVEVfRU5ESU5HX0ZJTEUsICAgIC8qIEZpbmlzaGluZyB0aGUgY3VycmVudCBmcmFnbWVudCAqLworICBTUExJVE1VWF9PVVRQVVRfU1RBVEVfU1RBUlRfTkVYVF9GSUxFIC8qIFJlc3RhcnRpbmcgYWZ0ZXIgRU5ESU5HX0ZJTEUgKi8KK30gU3BsaXRNdXhPdXRwdXRTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgX1NwbGl0TXV4T3V0cHV0Q29tbWFuZAoreworICBnYm9vbGVhbiBzdGFydF9uZXdfZnJhZ21lbnQ7ICAvKiBXaGV0aGVyIHRvIHN0YXJ0IGEgbmV3IGZyYWdtZW50IGJlZm9yZSBhZHZhbmNpbmcgb3V0cHV0IHRzICovCisgIEdzdENsb2NrVGltZURpZmYgbWF4X291dHB1dF90czsgICAgICAgLyogU2V0IHRoZSBsaW1pdCB0byBzdG9wIEdPUCBvdXRwdXQgKi8KK30gU3BsaXRNdXhPdXRwdXRDb21tYW5kOworCit0eXBlZGVmIHN0cnVjdCBfTXFTdHJlYW1CdWYKK3sKKyAgZ2Jvb2xlYW4ga2V5ZnJhbWU7CisgIEdzdENsb2NrVGltZURpZmYgcnVuX3RzOworICBndWludDY0IGJ1Zl9zaXplOworICBHc3RDbG9ja1RpbWUgZHVyYXRpb247Cit9IE1xU3RyZWFtQnVmOworCit0eXBlZGVmIHN0cnVjdCBfTXFTdHJlYW1DdHgKK3sKKyAgZ2ludCByZWZjb3VudDsKKworICBHc3RTcGxpdE11eFNpbmsgKnNwbGl0bXV4OworCisgIGd1aW50IHFfb3ZlcnJ1bl9pZDsKKyAgZ3VpbnQgc2lua19wYWRfYmxvY2tfaWQ7CisgIGd1aW50IHNyY19wYWRfYmxvY2tfaWQ7CisKKyAgZ2Jvb2xlYW4gaXNfcmVmZXJlbmNlOworCisgIGdib29sZWFuIGZsdXNoaW5nOworICBnYm9vbGVhbiBpbl9lb3M7CisgIGdib29sZWFuIG91dF9lb3M7CisgIGdib29sZWFuIG5lZWRfdW5ibG9jazsKKyAgZ2Jvb2xlYW4gY2Fwc19jaGFuZ2U7CisKKyAgR3N0U2VnbWVudCBpbl9zZWdtZW50OworICBHc3RTZWdtZW50IG91dF9zZWdtZW50OworCisgIEdzdENsb2NrVGltZURpZmYgaW5fcnVubmluZ190aW1lOworICBHc3RDbG9ja1RpbWVEaWZmIG91dF9ydW5uaW5nX3RpbWU7CisKKyAgR3N0QnVmZmVyICpwcmV2X2luX2tleWZyYW1lOyAvKiBzdG9yZSBrZXlmcmFtZSBmb3IgZWFjaCBHT1AgKi8KKworICBHc3RFbGVtZW50ICpxOworICBHUXVldWUgcXVldWVkX2J1ZnM7CisKKyAgR3N0UGFkICpzaW5rcGFkOworICBHc3RQYWQgKnNyY3BhZDsKKworICBHc3RCdWZmZXIgKmN1cl9vdXRfYnVmZmVyOworICBHc3RFdmVudCAqcGVuZGluZ19nYXA7Cit9IE1xU3RyZWFtQ3R4OworCitzdHJ1Y3QgX0dzdFNwbGl0TXV4U2luaworeworICBHc3RCaW4gcGFyZW50OworCisgIEdNdXRleCBsb2NrOworICBHQ29uZCBpbnB1dF9jb25kOworICBHQ29uZCBvdXRwdXRfY29uZDsKKworICBnZG91YmxlIG11eF9vdmVyaGVhZDsKKworICBHc3RDbG9ja1RpbWUgdGhyZXNob2xkX3RpbWU7CisgIGd1aW50NjQgdGhyZXNob2xkX2J5dGVzOworICBndWludCBtYXhfZmlsZXM7CisgIGdib29sZWFuIHNlbmRfa2V5ZnJhbWVfcmVxdWVzdHM7CisgIGdjaGFyICp0aHJlc2hvbGRfdGltZWNvZGVfc3RyOworICBHc3RDbG9ja1RpbWUgbmV4dF9tYXhfdGNfdGltZTsKKyAgR3N0Q2xvY2tUaW1lIGFsaWdubWVudF90aHJlc2hvbGQ7CisKKyAgR3N0RWxlbWVudCAqbXV4ZXI7CisgIEdzdEVsZW1lbnQgKnNpbms7CisKKyAgR3N0RWxlbWVudCAqcHJvdmlkZWRfbXV4ZXI7CisKKyAgR3N0RWxlbWVudCAqcHJvdmlkZWRfc2luazsKKyAgR3N0RWxlbWVudCAqYWN0aXZlX3Npbms7CisKKyAgZ2Jvb2xlYW4gcmVhZHlfZm9yX291dHB1dDsKKworICBnY2hhciAqbG9jYXRpb247CisgIGd1aW50IGZyYWdtZW50X2lkOworCisgIEdMaXN0ICpjb250ZXh0czsKKworICBTcGxpdE11eElucHV0U3RhdGUgaW5wdXRfc3RhdGU7CisgIEdzdENsb2NrVGltZURpZmYgbWF4X2luX3J1bm5pbmdfdGltZTsKKyAgLyogTnVtYmVyIG9mIGJ5dGVzIHNlbnQgdG8gdGhlCisgICAqIGN1cnJlbnQgZnJhZ21lbnQgKi8KKyAgZ3VpbnQ2NCBmcmFnbWVudF90b3RhbF9ieXRlczsKKyAgLyogTnVtYmVyIG9mIGJ5dGVzIHdlJ3ZlIGNvbGxlY3RlZCBpbnRvCisgICAqIHRoZSBHT1AgdGhhdCdzIGJlaW5nIGNvbGxlY3RlZCAqLworICBndWludDY0IGdvcF90b3RhbF9ieXRlczsKKyAgLyogU3RhcnQgdGltZSBvZiB0aGUgY3VycmVudCBmcmFnbWVudCAqLworICBHc3RDbG9ja1RpbWVEaWZmIGZyYWdtZW50X3N0YXJ0X3RpbWU7CisgIC8qIFN0YXJ0IHRpbWUgb2YgdGhlIGN1cnJlbnQgR09QICovCisgIEdzdENsb2NrVGltZURpZmYgZ29wX3N0YXJ0X3RpbWU7CisKKyAgR1F1ZXVlIG91dF9jbWRfcTsgICAgICAgICAgICAgLyogUXVldWUgb2YgY29tbWFuZHMgZm9yIG91dHB1dCB0aHJlYWQgKi8KKworICBTcGxpdE11eE91dHB1dFN0YXRlIG91dHB1dF9zdGF0ZTsKKyAgR3N0Q2xvY2tUaW1lRGlmZiBtYXhfb3V0X3J1bm5pbmdfdGltZTsKKworICBndWludDY0IG11eGVkX291dF9ieXRlczsKKworICBNcVN0cmVhbUN0eCAqcmVmZXJlbmNlX2N0eDsKKyAgLyogQ291bnQgb2YgcXVldWVkIGtleWZyYW1lcyBpbiB0aGUgcmVmZXJlbmNlIGN0eCAqLworICBndWludCBxdWV1ZWRfa2V5ZnJhbWVzOworCisgIGdib29sZWFuIHN3aXRjaGluZ19mcmFnbWVudDsKKworICBnYm9vbGVhbiBoYXZlX3ZpZGVvOworCisgIGdib29sZWFuIG5lZWRfYXN5bmNfc3RhcnQ7CisgIGdib29sZWFuIGFzeW5jX3BlbmRpbmc7CisKKyAgZ2Jvb2xlYW4gdXNlX3JvYnVzdF9tdXhpbmc7CisgIGdib29sZWFuIG11eGVyX2hhc19yZXNlcnZlZF9wcm9wczsKKworICBnYm9vbGVhbiBzcGxpdF9ub3c7Cit9OworCitzdHJ1Y3QgX0dzdFNwbGl0TXV4U2lua0NsYXNzCit7CisgIEdzdEJpbkNsYXNzIHBhcmVudF9jbGFzczsKKworICAvKiBhY3Rpb25zICovCisgIHZvaWQgICAgICgqc3BsaXRfbm93KSAgIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCk7Cit9OworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1NQTElUTVVYU0lOS19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYyBiL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjFlZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNyYy5jCkBAIC0wLDAgKzEsMTI3MSBAQAorLyogR1N0cmVhbWVyIFNwbGl0IERlbXV4ZXIgYmluIHRoYXQgcmVjb21iaW5lcyBmaWxlcyBjcmVhdGVkIGJ5CisgKiB0aGUgc3BsaXRtdXhzaW5rIGVsZW1lbnQuCisgKgorICogQ29weXJpZ2h0IChDKSA8MjAxND4gSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtc3BsaXRtdXhzcmMKKyAqIEBzaG9ydF9kZXNjcmlwdGlvbjogU3BsaXQgRGVtdXhlciBiaW4gdGhhdCByZWNvbWJpbmVzIGZpbGVzIGNyZWF0ZWQgYnkKKyAqIHRoZSBzcGxpdG11eHNpbmsgZWxlbWVudC4KKyAqCisgKiBUaGlzIGVsZW1lbnQgcmVhZHMgYSBzZXQgb2YgaW5wdXQgZmlsZXMgY3JlYXRlZCBieSB0aGUgc3BsaXRtdXhzaW5rIGVsZW1lbnQKKyAqIGNvbnRhaW5pbmcgY29udGlndW91cyBlbGVtZW50YXJ5IHN0cmVhbXMgc3BsaXQgYWNyb3NzIG11bHRpcGxlIGZpbGVzLgorICoKKyAqIFRoaXMgZWxlbWVudCBpcyBzaW1pbGFyIHRvIHNwbGl0ZmlsZXNyYywgZXhjZXB0IHRoYXQgaXQgcmVjb21iaW5lcyB0aGUKKyAqIHN0cmVhbXMgaW4gZWFjaCBmaWxlIHBhcnQgYXQgdGhlIGRlbXV4ZWQgZWxlbWVudGFyeSBsZXZlbCwgcmF0aGVyIHRoYW4KKyAqIGFzIGEgc2luZ2xlIGxhcmdlciBieXRlc3RyZWFtLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgc3BsaXRtdXhzcmMgbG9jYXRpb249dmlkZW8qLm1vdiAhIGRlY29kZWJpbiAhIHh2aW1hZ2VzaW5rCisgKiBdfCBEZW11eCBlYWNoIGZpbGUgcGFydCBhbmQgb3V0cHV0IHRoZSB2aWRlbyBzdHJlYW0gYXMgb25lIGNvbnRpbnVvdXMgc3RyZWFtCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgcGxheWJpbiB1cmk9InNwbGl0bXV4Oi8vcGF0aC90by9mb28ubXA0LioiCisgKiBdfCBQbGF5IGJhY2sgYSBzZXQgb2YgZmlsZXMgY3JlYXRlZCBieSBzcGxpdG11eHNpbmsKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0c3BsaXRtdXhzcmMuaCIKKyNpbmNsdWRlICJnc3RzcGxpdHV0aWxzLmgiCisKKyNpbmNsdWRlICIuLi8uLi9nc3QtbGlicy9nc3QvZ3N0LWkxOG4tcGx1Z2luLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWSAoc3BsaXRtdXhfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgc3BsaXRtdXhfZGVidWcKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTE9DQVRJT04KK307CisKK2VudW0KK3sKKyAgU0lHTkFMX0ZPUk1BVF9MT0NBVElPTiwKKyAgU0lHTkFMX0xBU1QKK307CisKK3N0YXRpYyBndWludCBzaWduYWxzW1NJR05BTF9MQVNUXTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHZpZGVvX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInZpZGVvIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGF1ZGlvX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoImF1ZGlvXyV1IiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHN1YnRpdGxlX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInN1YnRpdGxlXyV1IiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9zcGxpdG11eF9zcmNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyB2b2lkIGdzdF9zcGxpdG11eF9zcmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3NwbGl0bXV4X3NyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3Rfc3BsaXRtdXhfc3JjX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X3NwbGl0bXV4X3NyY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NwbGl0bXV4X3NyY19zdGFydCAoR3N0U3BsaXRNdXhTcmMgKiBzcGxpdG11eCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NwbGl0bXV4X3NyY19zdG9wIChHc3RTcGxpdE11eFNyYyAqIHNwbGl0bXV4KTsKK3N0YXRpYyB2b2lkIHNwbGl0bXV4X3NyY19wYWRfY29uc3RydWN0ZWQgKEdPYmplY3QgKiBwYWQpOworc3RhdGljIGdib29sZWFuIHNwbGl0bXV4X3NyY19wYWRfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIHNwbGl0bXV4X3NyY19wYWRfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworc3RhdGljIHZvaWQgc3BsaXRtdXhfc3JjX3VyaV9oYW5kbGVyX2luaXQgKGdwb2ludGVyIGdfaWZhY2UsCisgICAgZ3BvaW50ZXIgaWZhY2VfZGF0YSk7CisKKworc3RhdGljIEdzdFBhZCAqZ3N0X3NwbGl0bXV4X2ZpbmRfb3V0cHV0X3BhZCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcGFydCwKKyAgICBHc3RQYWQgKiBwYWQsIEdzdFNwbGl0TXV4U3JjICogc3BsaXRtdXgpOworc3RhdGljIHZvaWQgZ3N0X3NwbGl0bXV4X3BhcnRfcHJlcGFyZWQgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlciwKKyAgICBHc3RTcGxpdE11eFNyYyAqIHNwbGl0bXV4KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc3BsaXRtdXhfZW5kX29mX3BhcnQgKEdzdFNwbGl0TXV4U3JjICogc3BsaXRtdXgsCisgICAgU3BsaXRNdXhTcmNQYWQgKiBwYWQpOworc3RhdGljIGdib29sZWFuIGdzdF9zcGxpdG11eF9jaGVja19uZXdfY2FwcyAoU3BsaXRNdXhTcmNQYWQgKiBzcGxpdHBhZCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworI2RlZmluZSBfZG9faW5pdCBcCisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFKEdTVF9UWVBFX1VSSV9IQU5ETEVSLCBzcGxpdG11eF9zcmNfdXJpX2hhbmRsZXJfaW5pdCk7CisjZGVmaW5lIGdzdF9zcGxpdG11eF9zcmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworCitHX0RFRklORV9UWVBFX0VYVEVOREVEIChHc3RTcGxpdE11eFNyYywgZ3N0X3NwbGl0bXV4X3NyYywgR1NUX1RZUEVfQklOLCAwLAorICAgIF9kb19pbml0KTsKKworc3RhdGljIEdzdFVSSVR5cGUKK3NwbGl0bXV4X3NyY191cmlfZ2V0X3R5cGUgKEdUeXBlIHR5cGUpCit7CisgIHJldHVybiBHU1RfVVJJX1NSQzsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyICpjb25zdCAqCitzcGxpdG11eF9zcmNfdXJpX2dldF9wcm90b2NvbHMgKEdUeXBlIHR5cGUpCit7CisgIHN0YXRpYyBjb25zdCBnY2hhciAqcHJvdG9jb2xzW10gPSB7ICJzcGxpdG11eCIsIE5VTEwgfTsKKworICByZXR1cm4gcHJvdG9jb2xzOworfQorCitzdGF0aWMgZ2NoYXIgKgorc3BsaXRtdXhfc3JjX3VyaV9nZXRfdXJpIChHc3RVUklIYW5kbGVyICogaGFuZGxlcikKK3sKKyAgR3N0U3BsaXRNdXhTcmMgKnNwbGl0bXV4ID0gR1NUX1NQTElUTVVYX1NSQyAoaGFuZGxlcik7CisgIGdjaGFyICpyZXQgPSBOVUxMOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICBpZiAoc3BsaXRtdXgtPmxvY2F0aW9uKQorICAgIHJldCA9IGdfc3RyZHVwX3ByaW50ZiAoInNwbGl0bXV4Oi8vJXMiLCBzcGxpdG11eC0+bG9jYXRpb24pOworICBHU1RfT0JKRUNUX1VOTE9DSyAoc3BsaXRtdXgpOworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3NwbGl0bXV4X3NyY191cmlfc2V0X3VyaSAoR3N0VVJJSGFuZGxlciAqIGhhbmRsZXIsIGNvbnN0IGdjaGFyICogdXJpLAorICAgIEdFcnJvciAqKiBlcnIpCit7CisgIEdzdFNwbGl0TXV4U3JjICpzcGxpdG11eCA9IEdTVF9TUExJVE1VWF9TUkMgKGhhbmRsZXIpOworICBnY2hhciAqcHJvdG9jb2wsICpsb2NhdGlvbjsKKworICBwcm90b2NvbCA9IGdzdF91cmlfZ2V0X3Byb3RvY29sICh1cmkpOworICBpZiAocHJvdG9jb2wgPT0gTlVMTCB8fCAhZ19zdHJfZXF1YWwgKHByb3RvY29sLCAic3BsaXRtdXgiKSkKKyAgICBnb3RvIHdyb25nX3VyaTsKKyAgZ19mcmVlIChwcm90b2NvbCk7CisKKyAgbG9jYXRpb24gPSBnc3RfdXJpX2dldF9sb2NhdGlvbiAodXJpKTsKKyAgR1NUX09CSkVDVF9MT0NLIChzcGxpdG11eCk7CisgIGdfZnJlZSAoc3BsaXRtdXgtPmxvY2F0aW9uKTsKKyAgc3BsaXRtdXgtPmxvY2F0aW9uID0gbG9jYXRpb247CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisKKyAgcmV0dXJuIFRSVUU7CisKK3dyb25nX3VyaToKKyAgZ19mcmVlIChwcm90b2NvbCk7CisgIEdTVF9FTEVNRU5UX0VSUk9SIChzcGxpdG11eCwgUkVTT1VSQ0UsIFJFQUQsIChOVUxMKSwKKyAgICAgICgiRXJyb3IgcGFyc2luZyB1cmkgJXMiLCB1cmkpKTsKKyAgZ19zZXRfZXJyb3JfbGl0ZXJhbCAoZXJyLCBHU1RfVVJJX0VSUk9SLCBHU1RfVVJJX0VSUk9SX0JBRF9VUkksCisgICAgICAiQ291bGQgbm90IHBhcnNlIHNwbGl0bXV4IFVSSSIpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitzcGxpdG11eF9zcmNfdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwgZ3BvaW50ZXIgaWZhY2VfZGF0YSkKK3sKKyAgR3N0VVJJSGFuZGxlckludGVyZmFjZSAqaWZhY2UgPSAoR3N0VVJJSGFuZGxlckludGVyZmFjZSAqKSAoZ19pZmFjZSk7CisKKyAgaWZhY2UtPmdldF90eXBlID0gc3BsaXRtdXhfc3JjX3VyaV9nZXRfdHlwZTsKKyAgaWZhY2UtPmdldF9wcm90b2NvbHMgPSBzcGxpdG11eF9zcmNfdXJpX2dldF9wcm90b2NvbHM7CisgIGlmYWNlLT5zZXRfdXJpID0gc3BsaXRtdXhfc3JjX3VyaV9zZXRfdXJpOworICBpZmFjZS0+Z2V0X3VyaSA9IHNwbGl0bXV4X3NyY191cmlfZ2V0X3VyaTsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3NwbGl0bXV4X3NyY19jbGFzc19pbml0IChHc3RTcGxpdE11eFNyY0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3NwbGl0bXV4X3NyY19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9zcGxpdG11eF9zcmNfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X3NwbGl0bXV4X3NyY19kaXNwb3NlOworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9zcGxpdG11eF9zcmNfZmluYWxpemU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJTcGxpdCBGaWxlIERlbXV4aW5nIEJpbiIsICJHZW5lcmljL0Jpbi9EZW11eGVyIiwKKyAgICAgICJTb3VyY2UgdGhhdCByZWFkcyBhIHNldCBvZiBmaWxlcyBjcmVhdGVkIGJ5IHNwbGl0bXV4c2luayIsCisgICAgICAiSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmdmlkZW9fc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmYXVkaW9fc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmc3VidGl0bGVfc3JjX3RlbXBsYXRlKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zcGxpdG11eF9zcmNfY2hhbmdlX3N0YXRlKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0xPQ0FUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImxvY2F0aW9uIiwgIkZpbGUgSW5wdXQgUGF0dGVybiIsCisgICAgICAgICAgIkdsb2IgcGF0dGVybiBmb3IgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaWxlcyB0byByZWFkIiwgTlVMTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0U3BsaXRNdXhTcmM6OmZvcm1hdC1sb2NhdGlvbjoKKyAgICogQHNwbGl0bXV4OiB0aGUgI0dzdFNwbGl0TXV4U3JjCisgICAqCisgICAqIFJldHVybnM6IEEgTlVMTC10ZXJtaW5hdGVkIHNvcnRlZCBhcnJheSBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlCisgICAqICAgZmlsZW5hbWVzIG9mIHRoZSBpbnB1dCBmaWxlcy4gVGhlIGFycmF5IHdpbGwgYmUgZnJlZWQgaW50ZXJuYWxseQorICAgKiAgIHVzaW5nIGdfc3RyZnJlZXYoKQorICAgKgorICAgKiBTaW5jZTogMS44CisgICAqLworICBzaWduYWxzW1NJR05BTF9GT1JNQVRfTE9DQVRJT05dID0KKyAgICAgIGdfc2lnbmFsX25ldyAoImZvcm1hdC1sb2NhdGlvbiIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgR19UWVBFX1NUUlYsIDApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwbGl0bXV4X3NyY19pbml0IChHc3RTcGxpdE11eFNyYyAqIHNwbGl0bXV4KQoreworICBnX211dGV4X2luaXQgKCZzcGxpdG11eC0+bG9jayk7CisgIGdfbXV0ZXhfaW5pdCAoJnNwbGl0bXV4LT5wYWRzX2xvY2spOworICBzcGxpdG11eC0+dG90YWxfZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBnc3Rfc2VnbWVudF9pbml0ICgmc3BsaXRtdXgtPnBsYXlfc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGxpdG11eF9zcmNfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0U3BsaXRNdXhTcmMgKnNwbGl0bXV4ID0gR1NUX1NQTElUTVVYX1NSQyAob2JqZWN0KTsKKyAgR0xpc3QgKmN1cjsKKworICBTUExJVE1VWF9TUkNfUEFEU19MT0NLIChzcGxpdG11eCk7CisKKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHNwbGl0bXV4LT5wYWRzKTsKKyAgICAgIGN1ciAhPSBOVUxMOyBjdXIgPSBnX2xpc3RfbmV4dCAoY3VyKSkgeworICAgIEdzdFBhZCAqcGFkID0gR1NUX1BBRCAoY3VyLT5kYXRhKTsKKyAgICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChHU1RfRUxFTUVOVCAoc3BsaXRtdXgpLCBwYWQpOworICB9CisgIGdfbGlzdF9mcmVlIChzcGxpdG11eC0+cGFkcyk7CisgIHNwbGl0bXV4LT5wYWRzID0gTlVMTDsKKyAgU1BMSVRNVVhfU1JDX1BBRFNfVU5MT0NLIChzcGxpdG11eCk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfc3JjX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RTcGxpdE11eFNyYyAqc3BsaXRtdXggPSBHU1RfU1BMSVRNVVhfU1JDIChvYmplY3QpOworICBnX211dGV4X2NsZWFyICgmc3BsaXRtdXgtPmxvY2spOworICBnX211dGV4X2NsZWFyICgmc3BsaXRtdXgtPnBhZHNfbG9jayk7CisgIGdfZnJlZSAoc3BsaXRtdXgtPmxvY2F0aW9uKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTcGxpdE11eFNyYyAqc3BsaXRtdXggPSBHU1RfU1BMSVRNVVhfU1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MT0NBVElPTjp7CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGdfZnJlZSAoc3BsaXRtdXgtPmxvY2F0aW9uKTsKKyAgICAgIHNwbGl0bXV4LT5sb2NhdGlvbiA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfc3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTcGxpdE11eFNyYyAqc3BsaXRtdXggPSBHU1RfU1BMSVRNVVhfU1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MT0NBVElPTjoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc3BsaXRtdXgtPmxvY2F0aW9uKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3NwbGl0bXV4X3NyY19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdFNwbGl0TXV4U3JjICpzcGxpdG11eCA9IChHc3RTcGxpdE11eFNyYyAqKSBlbGVtZW50OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOnsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOnsKKyAgICAgIGlmICghZ3N0X3NwbGl0bXV4X3NyY19zdGFydCAoc3BsaXRtdXgpKQorICAgICAgICByZXR1cm4gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICAvKiBNYWtlIHN1cmUgdGhlIGVsZW1lbnQgd2lsbCBzaHV0IGRvd24gKi8KKyAgICAgIGlmICghZ3N0X3NwbGl0bXV4X3NyY19zdG9wIChzcGxpdG11eCkpCisgICAgICAgIHJldHVybiBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICoKK2dzdF9zcGxpdG11eF9wYXJ0X2NyZWF0ZSAoR3N0U3BsaXRNdXhTcmMgKiBzcGxpdG11eCwgY2hhciAqZmlsZW5hbWUpCit7CisgIEdzdFNwbGl0TXV4UGFydFJlYWRlciAqcjsKKworICByID0gZ19vYmplY3RfbmV3IChHU1RfVFlQRV9TUExJVE1VWF9QQVJUX1JFQURFUiwgTlVMTCk7CisKKyAgZ19zaWduYWxfY29ubmVjdCAociwgInByZXBhcmVkIiwgKEdDYWxsYmFjaykgZ3N0X3NwbGl0bXV4X3BhcnRfcHJlcGFyZWQsCisgICAgICBzcGxpdG11eCk7CisKKyAgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NldF9jYWxsYmFja3MgKHIsIHNwbGl0bXV4LAorICAgICAgKEdzdFNwbGl0TXV4UGFydFJlYWRlclBhZENiKSBnc3Rfc3BsaXRtdXhfZmluZF9vdXRwdXRfcGFkKTsKKyAgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NldF9sb2NhdGlvbiAociwgZmlsZW5hbWUpOworCisgIHJldHVybiByOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zcGxpdG11eF9jaGVja19uZXdfY2FwcyAoU3BsaXRNdXhTcmNQYWQgKiBzcGxpdHBhZCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0Q2FwcyAqY3VyY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoKEdzdFBhZCAqKSAoc3BsaXRwYWQpKTsKKyAgR3N0Q2FwcyAqbmV3Y2FwczsKKyAgR3N0Q2FwcyAqdG1wY2FwczsKKyAgR3N0Q2FwcyAqdG1wY3VyY2FwczsKKworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisKKyAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmbmV3Y2Fwcyk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNwbGl0cGFkLCAiQ29tcGFyaW5nIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQKKyAgICAgICIgYW5kICUiIEdTVF9QVFJfRk9STUFULCBjdXJjYXBzLCBuZXdjYXBzKTsKKworICBpZiAoY3VyY2FwcyA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIC8qIElmIGNhcHMgYXJlIGV4YWN0bHkgZXF1YWwgZXhpdCBlYXJseSAqLworICBpZiAoZ3N0X2NhcHNfaXNfZXF1YWwgKGN1cmNhcHMsIG5ld2NhcHMpKSB7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGN1cmNhcHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIE1vcmUgZXh0ZW5zaXZlIGNoZWNrLCBpZ25vcmUgY2hhbmdlcyBpbiBmcmFtZXJhdGUsIGJlY2F1c2UKKyAgICogZGVtdXhlcnMgZ2V0IHRoYXQgd3JvbmcgKi8KKyAgdG1wY2FwcyA9IGdzdF9jYXBzX2NvcHkgKG5ld2NhcHMpOworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAodG1wY2FwcywgMCk7CisgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzLCAiZnJhbWVyYXRlIik7CisKKyAgdG1wY3VyY2FwcyA9IGdzdF9jYXBzX2NvcHkgKGN1cmNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY3VyY2Fwcyk7CisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlICh0bXBjdXJjYXBzLCAwKTsKKyAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJmcmFtZXJhdGUiKTsKKworICAvKiBOb3cgY2hlY2sgaWYgdGhlc2UgZmlsdGVyZWQgY2FwcyBhcmUgZXF1YWwgKi8KKyAgaWYgKGdzdF9jYXBzX2lzX2VxdWFsICh0bXBjdXJjYXBzLCB0bXBjYXBzKSkgeworICAgIEdTVF9JTkZPX09CSkVDVCAoc3BsaXRwYWQsICJJZ25vcmluZyBmcmFtZXJhdGUtb25seSBjYXBzIGNoYW5nZSIpOworICAgIHJlcyA9IEZBTFNFOworICB9CisKKyAgZ3N0X2NhcHNfdW5yZWYgKHRtcGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAodG1wY3VyY2Fwcyk7CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfaGFuZGxlX2V2ZW50IChHc3RTcGxpdE11eFNyYyAqIHNwbGl0bXV4LAorICAgIFNwbGl0TXV4U3JjUGFkICogc3BsaXRwYWQsIEdzdFBhZCAqIHBhcnRfcGFkLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TVFJFQU1fU1RBUlQ6eworICAgICAgaWYgKHNwbGl0cGFkLT5zZW50X3N0cmVhbV9zdGFydCkKKyAgICAgICAgZ290byBkcm9wX2V2ZW50OworICAgICAgc3BsaXRwYWQtPnNlbnRfc3RyZWFtX3N0YXJ0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6eworICAgICAgaWYgKGdzdF9zcGxpdG11eF9lbmRfb2ZfcGFydCAoc3BsaXRtdXgsIHNwbGl0cGFkKSkKKyAgICAgICAgLy8gQ29udGludWluZyB0byBuZXh0IHBhcnQsIGRyb3AgdGhlIEVPUworICAgICAgICBnb3RvIGRyb3BfZXZlbnQ7CisgICAgICBpZiAoc3BsaXRtdXgtPnNlZ21lbnRfc2VxbnVtKQorICAgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZXZlbnQsIHNwbGl0bXV4LT5zZWdtZW50X3NlcW51bSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDp7CisgICAgICBHc3RDbG9ja1RpbWUgZHVyYXRpb247CisgICAgICBHc3RTZWdtZW50IHNlZzsKKworICAgICAgZ3N0X2V2ZW50X2NvcHlfc2VnbWVudCAoZXZlbnQsICZzZWcpOworCisgICAgICBzcGxpdHBhZC0+c2VnbWVudC5wb3NpdGlvbiA9IHNlZy5wb3NpdGlvbjsKKworICAgICAgaWYgKHNwbGl0cGFkLT5zZW50X3NlZ21lbnQpCisgICAgICAgIGdvdG8gZHJvcF9ldmVudDsgICAgICAgIC8qIFdlIGFscmVhZHkgZm9yd2FyZGVkIGEgc2VnbWVudCBldmVudCAqLworCisgICAgICAvKiBDYWxjdWxhdGUgb3V0cHV0IHNlZ21lbnQgKi8KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcGxpdHBhZCwgIlBhZCBzZWcgJSIgR1NUX1NFR01FTlRfRk9STUFUCisgICAgICAgICAgIiBnb3Qgc2VnICUiIEdTVF9TRUdNRU5UX0ZPUk1BVAorICAgICAgICAgICIgcGxheSBzZWcgJSIgR1NUX1NFR01FTlRfRk9STUFULAorICAgICAgICAgICZzcGxpdHBhZC0+c2VnbWVudCwgJnNlZywgJnNwbGl0bXV4LT5wbGF5X3NlZ21lbnQpOworCisgICAgICAvKiBJZiBwbGF5aW5nIGZvcndhcmQsIHRha2UgdGhlIHN0b3AgdGltZSBmcm9tIHRoZSBvdmVyYWxsCisgICAgICAgKiBzZWcgb3IgcGxheV9zZWdtZW50ICovCisgICAgICBpZiAoc3BsaXRtdXgtPnBsYXlfc2VnbWVudC5yYXRlID4gMC4wKSB7CisgICAgICAgIGlmIChzcGxpdG11eC0+cGxheV9zZWdtZW50LnN0b3AgIT0gLTEpCisgICAgICAgICAgc2VnLnN0b3AgPSBzcGxpdG11eC0+cGxheV9zZWdtZW50LnN0b3A7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzZWcuc3RvcCA9IHNwbGl0cGFkLT5zZWdtZW50LnN0b3A7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBSZXZlcnNlIHBsYXliYWNrIGZyb20gc3RvcCB0aW1lIHRvIHN0YXJ0IHRpbWUgKi8KKyAgICAgICAgLyogU2VlIGlmIGFuIGVuZCBwb2ludCB3YXMgcmVxdWVzdGVkIGluIHRoZSBzZWVrICovCisgICAgICAgIGlmIChzcGxpdG11eC0+cGxheV9zZWdtZW50LnN0YXJ0ICE9IC0xKSB7CisgICAgICAgICAgc2VnLnN0YXJ0ID0gc3BsaXRtdXgtPnBsYXlfc2VnbWVudC5zdGFydDsKKyAgICAgICAgICBzZWcudGltZSA9IHNwbGl0bXV4LT5wbGF5X3NlZ21lbnQudGltZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZWcuc3RhcnQgPSBzcGxpdHBhZC0+c2VnbWVudC5zdGFydDsKKyAgICAgICAgICBzZWcudGltZSA9IHNwbGl0cGFkLT5zZWdtZW50LnRpbWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgR1NUX09CSkVDVF9MT0NLIChzcGxpdG11eCk7CisgICAgICBkdXJhdGlvbiA9IHNwbGl0bXV4LT50b3RhbF9kdXJhdGlvbjsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisKKyAgICAgIGlmIChkdXJhdGlvbiA+IDApCisgICAgICAgIHNlZy5kdXJhdGlvbiA9IGR1cmF0aW9uOworICAgICAgZWxzZQorICAgICAgICBzZWcuZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgICAgICBHU1RfSU5GT19PQkpFQ1QgKHNwbGl0cGFkLAorICAgICAgICAgICJGb3J3YXJkaW5nIHNlZ21lbnQgJSIgR1NUX1NFR01FTlRfRk9STUFULCAmc2VnKTsKKworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZyk7CisgICAgICBpZiAoc3BsaXRtdXgtPnNlZ21lbnRfc2VxbnVtKQorICAgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZXZlbnQsIHNwbGl0bXV4LT5zZWdtZW50X3NlcW51bSk7CisgICAgICBzcGxpdHBhZC0+c2VudF9zZWdtZW50ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9DQVBTOnsKKyAgICAgIGlmICghZ3N0X3NwbGl0bXV4X2NoZWNrX25ld19jYXBzIChzcGxpdHBhZCwgZXZlbnQpKQorICAgICAgICBnb3RvIGRyb3BfZXZlbnQ7CisgICAgICBzcGxpdHBhZC0+c2VudF9jYXBzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBnc3RfcGFkX3B1c2hfZXZlbnQgKChHc3RQYWQgKikgKHNwbGl0cGFkKSwgZXZlbnQpOworICByZXR1cm47Citkcm9wX2V2ZW50OgorICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NwbGl0bXV4X2hhbmRsZV9idWZmZXIgKEdzdFNwbGl0TXV4U3JjICogc3BsaXRtdXgsCisgICAgU3BsaXRNdXhTcmNQYWQgKiBzcGxpdHBhZCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBpZiAoc3BsaXRwYWQtPmNsZWFyX25leHRfZGlzY29udCkgeworICAgIEdTVF9MT0dfT0JKRUNUIChzcGxpdHBhZCwgIkNsZWFyaW5nIGRpc2NvbnQgZmxhZyBvbiBidWZmZXIiKTsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfVU5TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgIHNwbGl0cGFkLT5jbGVhcl9uZXh0X2Rpc2NvbnQgPSBGQUxTRTsKKyAgfQorICBpZiAoc3BsaXRwYWQtPnNldF9uZXh0X2Rpc2NvbnQpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoc3BsaXRwYWQsICJTZXR0aW5nIGRpc2NvbnQgZmxhZyBvbiBidWZmZXIiKTsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICBzcGxpdHBhZC0+c2V0X25leHRfZGlzY29udCA9IEZBTFNFOworICB9CisKKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChHU1RfUEFEX0NBU1QgKHNwbGl0cGFkKSwgYnVmKTsKKworICBHU1RfTE9HX09CSkVDVCAoc3BsaXRwYWQsICJQYWQgcHVzaCByZXR1cm5lZCAlZCIsIHJldCk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfcGFkX2xvb3AgKEdzdFBhZCAqIHBhZCkKK3sKKyAgLyogR2V0IG9uZSBldmVudC9idWZmZXIgZnJvbSB0aGUgYXNzb2NpYXRlZCBwYXJ0IGFuZCBwdXNoICovCisgIFNwbGl0TXV4U3JjUGFkICpzcGxpdHBhZCA9IChTcGxpdE11eFNyY1BhZCAqKSAocGFkKTsKKyAgR3N0U3BsaXRNdXhTcmMgKnNwbGl0bXV4ID0gKEdzdFNwbGl0TXV4U3JjICopIGdzdF9wYWRfZ2V0X3BhcmVudCAocGFkKTsKKyAgR3N0RGF0YVF1ZXVlSXRlbSAqaXRlbSA9IE5VTEw7CisgIEdzdFNwbGl0TXV4UGFydFJlYWRlciAqcmVhZGVyID0gc3BsaXRwYWQtPnJlYWRlcjsKKyAgR3N0UGFkICpwYXJ0X3BhZDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgR1NUX09CSkVDVF9MT0NLIChzcGxpdHBhZCk7CisgIGlmIChzcGxpdHBhZC0+cGFydF9wYWQgPT0gTlVMTCkgeworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdHBhZCk7CisgICAgcmV0dXJuOworICB9CisgIHBhcnRfcGFkID0gZ3N0X29iamVjdF9yZWYgKHNwbGl0cGFkLT5wYXJ0X3BhZCk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdHBhZCk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNwbGl0cGFkLCAiUG9wcGluZyBkYXRhIHF1ZXVlIGl0ZW0gZnJvbSAlIiBHU1RfUFRSX0ZPUk1BVAorICAgICAgIiBwYWQgJSIgR1NUX1BUUl9GT1JNQVQsIHJlYWRlciwgcGFydF9wYWQpOworICByZXQgPSBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfcG9wIChyZWFkZXIsIHBhcnRfcGFkLCAmaXRlbSk7CisgIGlmIChyZXQgPT0gR1NUX0ZMT1dfRVJST1IpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKHJldCA9PSBHU1RfRkxPV19GTFVTSElORyB8fCBpdGVtID09IE5VTEwpCisgICAgZ290byBmbHVzaGluZzsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcGxpdHBhZCwgIkdvdCBkYXRhIHF1ZXVlIGl0ZW0gJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBpdGVtLT5vYmplY3QpOworCisgIGlmIChHU1RfSVNfRVZFTlQgKGl0ZW0tPm9iamVjdCkpIHsKKyAgICBHc3RFdmVudCAqZXZlbnQgPSAoR3N0RXZlbnQgKikgKGl0ZW0tPm9iamVjdCk7CisgICAgZ3N0X3NwbGl0bXV4X2hhbmRsZV9ldmVudCAoc3BsaXRtdXgsIHNwbGl0cGFkLCBwYXJ0X3BhZCwgZXZlbnQpOworICB9IGVsc2UgeworICAgIEdzdEJ1ZmZlciAqYnVmID0gKEdzdEJ1ZmZlciAqKSAoaXRlbS0+b2JqZWN0KTsKKyAgICBHc3RGbG93UmV0dXJuIHJldCA9IGdzdF9zcGxpdG11eF9oYW5kbGVfYnVmZmVyIChzcGxpdG11eCwgc3BsaXRwYWQsIGJ1Zik7CisgICAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSyAmJiByZXQgIT0gR1NUX0ZMT1dfRU9TKSkgeworICAgICAgLyogU3RvcCBpbW1lZGlhdGVseSBvbiBlcnJvciBvciBmbHVzaGluZyAqLworICAgICAgR1NUX0lORk9fT0JKRUNUIChzcGxpdHBhZCwgIlN0b3BwaW5nIGR1ZSB0byBwYWRfcHVzaCgpIHJlc3VsdCAlZCIsIHJldCk7CisgICAgICBnc3RfcGFkX3BhdXNlX3Rhc2sgKHBhZCk7CisgICAgICBpZiAocmV0IDwgR1NUX0ZMT1dfRU9TIHx8IHJldCA9PSBHU1RfRkxPV19OT1RfTElOS0VEKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0ZMT1dfRVJST1IgKHNwbGl0bXV4LCByZXQpOworICAgICAgfQorICAgIH0KKyAgfQorICBnX3NsaWNlX2ZyZWUgKEdzdERhdGFRdWV1ZUl0ZW0sIGl0ZW0pOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHBhcnRfcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3BsaXRtdXgpOworICByZXR1cm47CisKK2Vycm9yOgorICAvKiBGYWxsIHRocm91Z2ggKi8KKyAgR1NUX0VMRU1FTlRfRVJST1IgKHNwbGl0bXV4LCBSRVNPVVJDRSwgT1BFTl9SRUFELCAoTlVMTCksCisgICAgICAoIkVycm9yIHJlYWRpbmcgcGFydCBmaWxlICVzIiwgR1NUX1NUUl9OVUxMIChyZWFkZXItPnBhdGgpKSk7CitmbHVzaGluZzoKKyAgZ3N0X3BhZF9wYXVzZV90YXNrIChwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYXJ0X3BhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNwbGl0bXV4KTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zcGxpdG11eF9zcmNfYWN0aXZhdGVfcGFydCAoR3N0U3BsaXRNdXhTcmMgKiBzcGxpdG11eCwgZ3VpbnQgcGFydCwKKyAgICBHc3RTZWVrRmxhZ3MgZXh0cmFfZmxhZ3MpCit7CisgIEdMaXN0ICpjdXI7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3BsaXRtdXgsICJBY3RpdmF0aW5nIHBhcnQgJWQiLCBwYXJ0KTsKKworICBzcGxpdG11eC0+Y3VyX3BhcnQgPSBwYXJ0OworICBpZiAoIWdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9hY3RpdmF0ZSAoc3BsaXRtdXgtPnBhcnRzW3BhcnRdLAorICAgICAgICAgICZzcGxpdG11eC0+cGxheV9zZWdtZW50LCBleHRyYV9mbGFncykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIFNQTElUTVVYX1NSQ19QQURTX0xPQ0sgKHNwbGl0bXV4KTsKKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHNwbGl0bXV4LT5wYWRzKTsKKyAgICAgIGN1ciAhPSBOVUxMOyBjdXIgPSBnX2xpc3RfbmV4dCAoY3VyKSkgeworICAgIFNwbGl0TXV4U3JjUGFkICpzcGxpdHBhZCA9IChTcGxpdE11eFNyY1BhZCAqKSAoY3VyLT5kYXRhKTsKKyAgICBzcGxpdHBhZC0+Y3VyX3BhcnQgPSBwYXJ0OworICAgIHNwbGl0cGFkLT5yZWFkZXIgPSBzcGxpdG11eC0+cGFydHNbc3BsaXRwYWQtPmN1cl9wYXJ0XTsKKyAgICBpZiAoc3BsaXRwYWQtPnBhcnRfcGFkKQorICAgICAgZ3N0X29iamVjdF91bnJlZiAoc3BsaXRwYWQtPnBhcnRfcGFkKTsKKyAgICBzcGxpdHBhZC0+cGFydF9wYWQgPQorICAgICAgICBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfbG9va3VwX3BhZCAoc3BsaXRwYWQtPnJlYWRlciwKKyAgICAgICAgKEdzdFBhZCAqKSAoc3BsaXRwYWQpKTsKKworICAgIC8qIE1ha2Ugc3VyZSB3ZSBzdGFydCB3aXRoIGEgRElTQ09OVCAqLworICAgIHNwbGl0cGFkLT5zZXRfbmV4dF9kaXNjb250ID0gVFJVRTsKKyAgICBzcGxpdHBhZC0+Y2xlYXJfbmV4dF9kaXNjb250ID0gRkFMU0U7CisKKyAgICBnc3RfcGFkX3N0YXJ0X3Rhc2sgKEdTVF9QQUQgKHNwbGl0cGFkKSwKKyAgICAgICAgKEdzdFRhc2tGdW5jdGlvbikgZ3N0X3NwbGl0bXV4X3BhZF9sb29wLCBzcGxpdHBhZCwgTlVMTCk7CisgIH0KKyAgU1BMSVRNVVhfU1JDX1BBRFNfVU5MT0NLIChzcGxpdG11eCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NwbGl0bXV4X3NyY19zdGFydCAoR3N0U3BsaXRNdXhTcmMgKiBzcGxpdG11eCkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgZ2NoYXIgKmJhc2VuYW1lID0gTlVMTDsKKyAgZ2NoYXIgKmRpcm5hbWUgPSBOVUxMOworICBnY2hhciAqKmZpbGVzOworICBHc3RDbG9ja1RpbWUgbmV4dF9vZmZzZXQgPSAwOworICBndWludCBpOworICBHc3RDbG9ja1RpbWUgdG90YWxfZHVyYXRpb24gPSAwOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNwbGl0bXV4LCAiU3RhcnRpbmciKTsKKworICBnX3NpZ25hbF9lbWl0IChzcGxpdG11eCwgc2lnbmFsc1tTSUdOQUxfRk9STUFUX0xPQ0FUSU9OXSwgMCwgJmZpbGVzKTsKKworICBpZiAoZmlsZXMgPT0gTlVMTCB8fCAqZmlsZXMgPT0gTlVMTCkgeworICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgIGlmIChzcGxpdG11eC0+bG9jYXRpb24gIT0gTlVMTCAmJiBzcGxpdG11eC0+bG9jYXRpb25bMF0gIT0gJ1wwJykgeworICAgICAgYmFzZW5hbWUgPSBnX3BhdGhfZ2V0X2Jhc2VuYW1lIChzcGxpdG11eC0+bG9jYXRpb24pOworICAgICAgZGlybmFtZSA9IGdfcGF0aF9nZXRfZGlybmFtZSAoc3BsaXRtdXgtPmxvY2F0aW9uKTsKKyAgICB9CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKworICAgIGdfc3RyZnJlZXYgKGZpbGVzKTsKKyAgICBmaWxlcyA9IGdzdF9zcGxpdF91dGlsX2ZpbmRfZmlsZXMgKGRpcm5hbWUsIGJhc2VuYW1lLCAmZXJyKTsKKworICAgIGlmIChmaWxlcyA9PSBOVUxMIHx8ICpmaWxlcyA9PSBOVUxMKQorICAgICAgZ290byBub19maWxlczsKKyAgfQorCisgIFNQTElUTVVYX1NSQ19MT0NLIChzcGxpdG11eCk7CisgIHNwbGl0bXV4LT5wYWRzX2NvbXBsZXRlID0gRkFMU0U7CisgIHNwbGl0bXV4LT5ydW5uaW5nID0gVFJVRTsKKyAgU1BMSVRNVVhfU1JDX1VOTE9DSyAoc3BsaXRtdXgpOworCisgIHNwbGl0bXV4LT5udW1fcGFydHMgPSBnX3N0cnZfbGVuZ3RoIChmaWxlcyk7CisKKyAgc3BsaXRtdXgtPnBhcnRzID0gZ19uZXcwIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiwgc3BsaXRtdXgtPm51bV9wYXJ0cyk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNwbGl0bXV4LT5udW1fcGFydHM7IGkrKykgeworICAgIHNwbGl0bXV4LT5wYXJ0c1tpXSA9IGdzdF9zcGxpdG11eF9wYXJ0X2NyZWF0ZSAoc3BsaXRtdXgsIGZpbGVzW2ldKTsKKyAgICBpZiAoc3BsaXRtdXgtPnBhcnRzW2ldID09IE5VTEwpCisgICAgICBicmVhazsKKworICAgIC8qIEZpZ3VyZSBvdXQgdGhlIG5leHQgb2Zmc2V0IC0gdGhlIHNtYWxsZXN0IG9uZSAqLworICAgIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9zZXRfc3RhcnRfb2Zmc2V0IChzcGxpdG11eC0+cGFydHNbaV0sIG5leHRfb2Zmc2V0KTsKKyAgICBpZiAoIWdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9wcmVwYXJlIChzcGxpdG11eC0+cGFydHNbaV0pKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNwbGl0bXV4LAorICAgICAgICAgICJGYWlsZWQgdG8gcHJlcGFyZSBmaWxlIHBhcnQgJXMuIENhbm5vdCBwbGF5IHBhc3QgdGhlcmUuIiwgZmlsZXNbaV0pOworICAgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoc3BsaXRtdXgsIFJFU09VUkNFLCBSRUFELCAoTlVMTCksCisgICAgICAgICAgKCJGYWlsZWQgdG8gcHJlcGFyZSBmaWxlIHBhcnQgJXMuIENhbm5vdCBwbGF5IHBhc3QgdGhlcmUuIiwKKyAgICAgICAgICAgICAgZmlsZXNbaV0pKTsKKyAgICAgIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl91bnByZXBhcmUgKHNwbGl0bXV4LT5wYXJ0c1tpXSk7CisgICAgICBnX29iamVjdF91bnJlZiAoc3BsaXRtdXgtPnBhcnRzW2ldKTsKKyAgICAgIHNwbGl0bXV4LT5wYXJ0c1tpXSA9IE5VTEw7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBFeHRlbmQgb3VyIHRvdGFsIGR1cmF0aW9uIHRvIGNvdmVyIHRoaXMgcGFydCAqLworICAgIHRvdGFsX2R1cmF0aW9uID0KKyAgICAgICAgbmV4dF9vZmZzZXQgKworICAgICAgICBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfZ2V0X2R1cmF0aW9uIChzcGxpdG11eC0+cGFydHNbaV0pOworICAgIHNwbGl0bXV4LT5wbGF5X3NlZ21lbnQuZHVyYXRpb24gPSB0b3RhbF9kdXJhdGlvbjsKKworICAgIG5leHRfb2Zmc2V0ID0gZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2dldF9lbmRfb2Zmc2V0IChzcGxpdG11eC0+cGFydHNbaV0pOworICB9CisKKyAgLyogVXBkYXRlIHRvdGFsX2R1cmF0aW9uIHN0YXRlIHZhcmlhYmxlICovCisgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICBzcGxpdG11eC0+dG90YWxfZHVyYXRpb24gPSB0b3RhbF9kdXJhdGlvbjsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKworICAvKiBTdG9yZSBob3cgbWFueSBwYXJ0cyB3ZSBhY3R1YWxseSBjcmVhdGVkICovCisgIHNwbGl0bXV4LT5udW1fcGFydHMgPSBpOworCisgIGlmIChzcGxpdG11eC0+bnVtX3BhcnRzIDwgMSkKKyAgICBnb3RvIGZhaWxlZF9wYXJ0OworCisgIC8qIEFsbCBkb25lIHByZXBhcmluZywgYWN0aXZhdGUgdGhlIGZpcnN0IHBhcnQgKi8KKyAgR1NUX0lORk9fT0JKRUNUIChzcGxpdG11eCwKKyAgICAgICJBbGwgcGFydHMgcHJlcGFyZWQuIFRvdGFsIGR1cmF0aW9uICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiBBY3RpdmF0aW5nIGZpcnN0IHBhcnQiLCBHU1RfVElNRV9BUkdTICh0b3RhbF9kdXJhdGlvbikpOworICByZXQgPSBnc3Rfc3BsaXRtdXhfc3JjX2FjdGl2YXRlX3BhcnQgKHNwbGl0bXV4LCAwLCBHU1RfU0VFS19GTEFHX05PTkUpOworICBpZiAocmV0ID09IEZBTFNFKQorICAgIGdvdG8gZmFpbGVkX2ZpcnN0X3BhcnQ7Citkb25lOgorICBpZiAoZXJyICE9IE5VTEwpCisgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICBnX3N0cmZyZWV2IChmaWxlcyk7CisgIGdfZnJlZSAoYmFzZW5hbWUpOworICBnX2ZyZWUgKGRpcm5hbWUpOworCisgIHJldHVybiByZXQ7CisKKy8qIEVSUk9SUyAqLworbm9fZmlsZXM6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3BsaXRtdXgsIFJFU09VUkNFLCBPUEVOX1JFQUQsICgiJXMiLCBlcnItPm1lc3NhZ2UpLAorICAgICAgICAoIkZhaWxlZCB0byBmaW5kIGZpbGVzIGluICclcycgZm9yIHBhdHRlcm4gJyVzJyIsCisgICAgICAgICAgICBHU1RfU1RSX05VTEwgKGRpcm5hbWUpLCBHU1RfU1RSX05VTEwgKGJhc2VuYW1lKSkpOworICAgIGdvdG8gZG9uZTsKKyAgfQorZmFpbGVkX3BhcnQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3BsaXRtdXgsIFJFU09VUkNFLCBPUEVOX1JFQUQsIChOVUxMKSwKKyAgICAgICAgKCJGYWlsZWQgdG8gb3BlbiBhbnkgZmlsZXMgZm9yIHJlYWRpbmciKSk7CisgICAgZ290byBkb25lOworICB9CitmYWlsZWRfZmlyc3RfcGFydDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcGxpdG11eCwgUkVTT1VSQ0UsIE9QRU5fUkVBRCwgKE5VTEwpLAorICAgICAgICAoIkZhaWxlZCB0byBhY3RpdmF0ZSBmaXJzdCBwYXJ0IGZvciBwbGF5YmFjayIpKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BsaXRtdXhfc3JjX3N0b3AgKEdzdFNwbGl0TXV4U3JjICogc3BsaXRtdXgpCit7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIGd1aW50IGk7CisgIEdMaXN0ICpjdXIsICpwYWRzX2xpc3Q7CisKKyAgU1BMSVRNVVhfU1JDX0xPQ0sgKHNwbGl0bXV4KTsKKyAgaWYgKCFzcGxpdG11eC0+cnVubmluZykKKyAgICBnb3RvIG91dDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcGxpdG11eCwgIlN0b3BwaW5nIik7CisKKyAgLyogU3RvcCBhbmQgZGVzdHJveSBhbGwgcGFydHMgICovCisgIGZvciAoaSA9IDA7IGkgPCBzcGxpdG11eC0+bnVtX3BhcnRzOyBpKyspIHsKKyAgICBpZiAoc3BsaXRtdXgtPnBhcnRzW2ldID09IE5VTEwpCisgICAgICBjb250aW51ZTsKKyAgICBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfdW5wcmVwYXJlIChzcGxpdG11eC0+cGFydHNbaV0pOworICAgIGdfb2JqZWN0X3VucmVmIChzcGxpdG11eC0+cGFydHNbaV0pOworICAgIHNwbGl0bXV4LT5wYXJ0c1tpXSA9IE5VTEw7CisgIH0KKworICBTUExJVE1VWF9TUkNfUEFEU19MT0NLIChzcGxpdG11eCk7CisgIHBhZHNfbGlzdCA9IHNwbGl0bXV4LT5wYWRzOworICBzcGxpdG11eC0+cGFkcyA9IE5VTEw7CisgIFNQTElUTVVYX1NSQ19QQURTX1VOTE9DSyAoc3BsaXRtdXgpOworCisgIFNQTElUTVVYX1NSQ19VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHBhZHNfbGlzdCk7IGN1ciAhPSBOVUxMOyBjdXIgPSBnX2xpc3RfbmV4dCAoY3VyKSkgeworICAgIFNwbGl0TXV4U3JjUGFkICp0bXAgPSAoU3BsaXRNdXhTcmNQYWQgKikgKGN1ci0+ZGF0YSk7CisgICAgZ3N0X3BhZF9zdG9wX3Rhc2sgKEdTVF9QQUQgKHRtcCkpOworICAgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKEdTVF9FTEVNRU5UIChzcGxpdG11eCksIEdTVF9QQUQgKHRtcCkpOworICB9CisgIGdfbGlzdF9mcmVlIChwYWRzX2xpc3QpOworICBTUExJVE1VWF9TUkNfTE9DSyAoc3BsaXRtdXgpOworCisgIGdfZnJlZSAoc3BsaXRtdXgtPnBhcnRzKTsKKyAgc3BsaXRtdXgtPnBhcnRzID0gTlVMTDsKKyAgc3BsaXRtdXgtPm51bV9wYXJ0cyA9IDA7CisgIHNwbGl0bXV4LT5ydW5uaW5nID0gRkFMU0U7CisgIHNwbGl0bXV4LT50b3RhbF9kdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIC8qIFJlc2V0IHBsYXliYWNrIHNlZ21lbnQgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNwbGl0bXV4LT5wbGF5X3NlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CitvdXQ6CisgIFNQTElUTVVYX1NSQ19VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgcmV0dXJuIHJldDsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0U3BsaXRNdXhTcmMgKnNwbGl0bXV4OworICBTcGxpdE11eFNyY1BhZCAqc3BsaXRwYWQ7Cit9IFNwbGl0TXV4QW5kUGFkOworCitzdGF0aWMgZ2Jvb2xlYW4KK2hhbmRsZV9zdGlja3lfZXZlbnRzIChHc3RQYWQgKiBwYWQsIEdzdEV2ZW50ICoqIGV2ZW50LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIFNwbGl0TXV4QW5kUGFkICpzcGxpdG11eF9hbmRfcGFkOworICBHc3RTcGxpdE11eFNyYyAqc3BsaXRtdXg7CisgIFNwbGl0TXV4U3JjUGFkICpzcGxpdHBhZDsKKworICBzcGxpdG11eF9hbmRfcGFkID0gdXNlcl9kYXRhOworICBzcGxpdG11eCA9IHNwbGl0bXV4X2FuZF9wYWQtPnNwbGl0bXV4OworICBzcGxpdHBhZCA9IHNwbGl0bXV4X2FuZF9wYWQtPnNwbGl0cGFkOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNwbGl0cGFkLCAiaGFuZGxlIHN0aWNreSBldmVudCAlIiBHU1RfUFRSX0ZPUk1BVCwgKmV2ZW50KTsKKyAgZ3N0X2V2ZW50X3JlZiAoKmV2ZW50KTsKKyAgZ3N0X3NwbGl0bXV4X2hhbmRsZV9ldmVudCAoc3BsaXRtdXgsIHNwbGl0cGFkLCBwYWQsICpldmVudCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RQYWQgKgorZ3N0X3NwbGl0bXV4X2ZpbmRfb3V0cHV0X3BhZCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcGFydCwgR3N0UGFkICogcGFkLAorICAgIEdzdFNwbGl0TXV4U3JjICogc3BsaXRtdXgpCit7CisgIEdMaXN0ICpjdXI7CisgIGdjaGFyICpwYWRfbmFtZSA9IGdzdF9wYWRfZ2V0X25hbWUgKHBhZCk7CisgIEdzdFBhZCAqdGFyZ2V0ID0gTlVMTDsKKyAgZ2Jvb2xlYW4gaXNfbmV3X3BhZCA9IEZBTFNFOworCisgIFNQTElUTVVYX1NSQ19MT0NLIChzcGxpdG11eCk7CisgIFNQTElUTVVYX1NSQ19QQURTX0xPQ0sgKHNwbGl0bXV4KTsKKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHNwbGl0bXV4LT5wYWRzKTsKKyAgICAgIGN1ciAhPSBOVUxMOyBjdXIgPSBnX2xpc3RfbmV4dCAoY3VyKSkgeworICAgIEdzdFBhZCAqdG1wID0gKEdzdFBhZCAqKSAoY3VyLT5kYXRhKTsKKyAgICBpZiAoZ19zdHJfZXF1YWwgKEdTVF9QQURfTkFNRSAodG1wKSwgcGFkX25hbWUpKSB7CisgICAgICB0YXJnZXQgPSB0bXA7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAodGFyZ2V0ID09IE5VTEwgJiYgIXNwbGl0bXV4LT5wYWRzX2NvbXBsZXRlKSB7CisgICAgU3BsaXRNdXhBbmRQYWQgc3BsaXRtdXhfYW5kX3BhZDsKKworICAgIC8qIE5vIHBhZCBmb3VuZCwgY3JlYXRlIG9uZSAqLworICAgIHRhcmdldCA9IGdfb2JqZWN0X25ldyAoU1BMSVRNVVhfVFlQRV9TUkNfUEFELAorICAgICAgICAibmFtZSIsIHBhZF9uYW1lLCAiZGlyZWN0aW9uIiwgR1NUX1BBRF9TUkMsIE5VTEwpOworICAgIHNwbGl0bXV4LT5wYWRzID0gZ19saXN0X3ByZXBlbmQgKHNwbGl0bXV4LT5wYWRzLCB0YXJnZXQpOworCisgICAgZ3N0X3BhZF9zZXRfYWN0aXZlICh0YXJnZXQsIFRSVUUpOworCisgICAgc3BsaXRtdXhfYW5kX3BhZC5zcGxpdG11eCA9IHNwbGl0bXV4OworICAgIHNwbGl0bXV4X2FuZF9wYWQuc3BsaXRwYWQgPSAoU3BsaXRNdXhTcmNQYWQgKikgdGFyZ2V0OworICAgIGdzdF9wYWRfc3RpY2t5X2V2ZW50c19mb3JlYWNoIChwYWQsIGhhbmRsZV9zdGlja3lfZXZlbnRzLAorICAgICAgICAmc3BsaXRtdXhfYW5kX3BhZCk7CisgICAgaXNfbmV3X3BhZCA9IFRSVUU7CisgIH0KKyAgU1BMSVRNVVhfU1JDX1BBRFNfVU5MT0NLIChzcGxpdG11eCk7CisgIFNQTElUTVVYX1NSQ19VTkxPQ0sgKHNwbGl0bXV4KTsKKworICBnX2ZyZWUgKHBhZF9uYW1lKTsKKworICBpZiAodGFyZ2V0ID09IE5VTEwpCisgICAgZ290byBwYWRfbm90X2ZvdW5kOworCisgIGlmIChpc19uZXdfcGFkKQorICAgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHNwbGl0bXV4KSwgdGFyZ2V0KTsKKworICByZXR1cm4gdGFyZ2V0OworCitwYWRfbm90X2ZvdW5kOgorICBHU1RfRUxFTUVOVF9FUlJPUiAoc3BsaXRtdXgsIFNUUkVBTSwgRkFJTEVELCAoTlVMTCksCisgICAgICAoIlN0cmVhbSBwYXJ0ICVzIGNvbnRhaW5zIGV4dHJhIHVua25vd24gcGFkICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICAgIHBhcnQtPnBhdGgsIHBhZCkpOworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGxpdG11eF9wYXJ0X3ByZXBhcmVkIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIsCisgICAgR3N0U3BsaXRNdXhTcmMgKiBzcGxpdG11eCkKK3sKKyAgZ2Jvb2xlYW4gbmVlZF9ub19tb3JlX3BhZHM7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNwbGl0bXV4LCAiUGFydCAlIiBHU1RfUFRSX0ZPUk1BVCAiIHByZXBhcmVkIiwgcmVhZGVyKTsKKyAgU1BMSVRNVVhfU1JDX0xPQ0sgKHNwbGl0bXV4KTsKKyAgbmVlZF9ub19tb3JlX3BhZHMgPSAhc3BsaXRtdXgtPnBhZHNfY29tcGxldGU7CisgIHNwbGl0bXV4LT5wYWRzX2NvbXBsZXRlID0gVFJVRTsKKyAgU1BMSVRNVVhfU1JDX1VOTE9DSyAoc3BsaXRtdXgpOworCisgIGlmIChuZWVkX25vX21vcmVfcGFkcykgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNwbGl0bXV4LCAiU2lnbmFsbGluZyBuby1tb3JlLXBhZHMiKTsKKyAgICBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgKEdTVF9FTEVNRU5UX0NBU1QgKHNwbGl0bXV4KSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGxpdG11eF9wdXNoX2V2ZW50IChHc3RTcGxpdE11eFNyYyAqIHNwbGl0bXV4LCBHc3RFdmVudCAqIGUsCisgICAgZ3VpbnQzMiBzZXFudW0pCit7CisgIEdMaXN0ICpjdXI7CisKKyAgaWYgKHNlcW51bSkKKyAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZSwgc2VxbnVtKTsKKworICBTUExJVE1VWF9TUkNfUEFEU19MT0NLIChzcGxpdG11eCk7CisgIGZvciAoY3VyID0gZ19saXN0X2ZpcnN0IChzcGxpdG11eC0+cGFkcyk7CisgICAgICBjdXIgIT0gTlVMTDsgY3VyID0gZ19saXN0X25leHQgKGN1cikpIHsKKyAgICBHc3RQYWQgKnBhZCA9IEdTVF9QQURfQ0FTVCAoY3VyLT5kYXRhKTsKKyAgICBnc3RfZXZlbnRfcmVmIChlKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHBhZCwgZSk7CisgIH0KKyAgU1BMSVRNVVhfU1JDX1BBRFNfVU5MT0NLIChzcGxpdG11eCk7CisKKyAgZ3N0X2V2ZW50X3VucmVmIChlKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGxpdG11eF9wdXNoX2ZsdXNoX3N0b3AgKEdzdFNwbGl0TXV4U3JjICogc3BsaXRtdXgsIGd1aW50MzIgc2VxbnVtKQoreworICBHc3RFdmVudCAqZSA9IGdzdF9ldmVudF9uZXdfZmx1c2hfc3RvcCAoVFJVRSk7CisgIEdMaXN0ICpjdXI7CisKKyAgaWYgKHNlcW51bSkKKyAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZSwgc2VxbnVtKTsKKworICBTUExJVE1VWF9TUkNfUEFEU19MT0NLIChzcGxpdG11eCk7CisgIGZvciAoY3VyID0gZ19saXN0X2ZpcnN0IChzcGxpdG11eC0+cGFkcyk7CisgICAgICBjdXIgIT0gTlVMTDsgY3VyID0gZ19saXN0X25leHQgKGN1cikpIHsKKyAgICBTcGxpdE11eFNyY1BhZCAqdGFyZ2V0ID0gKFNwbGl0TXV4U3JjUGFkICopIChjdXItPmRhdGEpOworCisgICAgZ3N0X2V2ZW50X3JlZiAoZSk7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChHU1RfUEFEX0NBU1QgKHRhcmdldCksIGUpOworICAgIHRhcmdldC0+c2VudF9jYXBzID0gRkFMU0U7CisgICAgdGFyZ2V0LT5zZW50X3N0cmVhbV9zdGFydCA9IEZBTFNFOworICAgIHRhcmdldC0+c2VudF9zZWdtZW50ID0gRkFMU0U7CisgIH0KKyAgU1BMSVRNVVhfU1JDX1BBRFNfVU5MT0NLIChzcGxpdG11eCk7CisKKyAgZ3N0X2V2ZW50X3VucmVmIChlKTsKK30KKworLyogQ2FsbGJhY2sgZm9yIHdoZW4gYSBwYXJ0IGZpbmlzaGVzIGFuZCB3ZSBuZWVkIHRvIG1vdmUgdG8gdGhlIG5leHQgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NwbGl0bXV4X2VuZF9vZl9wYXJ0IChHc3RTcGxpdE11eFNyYyAqIHNwbGl0bXV4LCBTcGxpdE11eFNyY1BhZCAqIHNwbGl0cGFkKQoreworICBnaW50IG5leHRfcGFydCA9IC0xOworICBnaW50IGN1cl9wYXJ0ID0gc3BsaXRwYWQtPmN1cl9wYXJ0OworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKworICBpZiAoc3BsaXRtdXgtPnBsYXlfc2VnbWVudC5yYXRlID49IDAuMCkgeworICAgIGlmIChjdXJfcGFydCArIDEgPCBzcGxpdG11eC0+bnVtX3BhcnRzKQorICAgICAgbmV4dF9wYXJ0ID0gY3VyX3BhcnQgKyAxOworICAgIC8qIE1ha2Ugc3VyZSB0aGUgdHJhbnNpdGlvbiBpcyBzZWFtbGVzcyAqLworICAgIHNwbGl0cGFkLT5zZXRfbmV4dF9kaXNjb250ID0gRkFMU0U7CisgICAgc3BsaXRwYWQtPmNsZWFyX25leHRfZGlzY29udCA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgLyogUmV2ZXJzZSBwbGF5IC0gbW92ZSB0byBwcmV2aW91cyBzZWdtZW50ICovCisgICAgaWYgKGN1cl9wYXJ0ID4gMCkgeworICAgICAgbmV4dF9wYXJ0ID0gY3VyX3BhcnQgLSAxOworICAgICAgLyogTm9uLXNlYW1sZXNzIHRyYW5zaXRpb24gaW4gcmV2ZXJzZSAqLworICAgICAgc3BsaXRwYWQtPnNldF9uZXh0X2Rpc2NvbnQgPSBUUlVFOworICAgICAgc3BsaXRwYWQtPmNsZWFyX25leHRfZGlzY29udCA9IEZBTFNFOworICAgIH0KKyAgfQorCisgIFNQTElUTVVYX1NSQ19MT0NLIChzcGxpdG11eCk7CisKKyAgLyogSWYgYWxsIHBhZHMgYXJlIGRvbmUgd2l0aCB0aGlzIHBhcnQsIGRlYWN0aXZhdGUgaXQgKi8KKyAgaWYgKGdzdF9zcGxpdG11eF9wYXJ0X2lzX2VvcyAoc3BsaXRtdXgtPnBhcnRzW3NwbGl0cGFkLT5jdXJfcGFydF0pKQorICAgIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9kZWFjdGl2YXRlIChzcGxpdG11eC0+cGFydHNbY3VyX3BhcnRdKTsKKworICBpZiAoc3BsaXRtdXgtPnBsYXlfc2VnbWVudC5yYXRlID49IDAuMCkgeworICAgIGlmIChzcGxpdG11eC0+cGxheV9zZWdtZW50LnN0b3AgIT0gLTEpIHsKKyAgICAgIEdzdENsb2NrVGltZSBwYXJ0X2VuZCA9CisgICAgICAgICAgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2dldF9lbmRfb2Zmc2V0IChzcGxpdG11eC0+cGFydHNbY3VyX3BhcnRdKTsKKyAgICAgIGlmIChwYXJ0X2VuZCA+PSBzcGxpdG11eC0+cGxheV9zZWdtZW50LnN0b3ApIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICAgICAiU3RvcCBwb3NpdGlvbiB3YXMgd2l0aGluIHRoYXQgcGFydC4gRmluaXNoaW5nIik7CisgICAgICAgIG5leHRfcGFydCA9IC0xOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoc3BsaXRtdXgtPnBsYXlfc2VnbWVudC5zdGFydCAhPSAtMSkgeworICAgICAgR3N0Q2xvY2tUaW1lIHBhcnRfc3RhcnQgPQorICAgICAgICAgIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9nZXRfc3RhcnRfb2Zmc2V0IChzcGxpdG11eC0+cGFydHNbY3VyX3BhcnRdKTsKKyAgICAgIGlmIChwYXJ0X3N0YXJ0IDw9IHNwbGl0bXV4LT5wbGF5X3NlZ21lbnQuc3RhcnQpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICAgICAiU3RhcnQgcG9zaXRpb24gJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICAgICAiIHdhcyB3aXRoaW4gdGhhdCBwYXJ0LiBGaW5pc2hpbmciLAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoc3BsaXRtdXgtPnBsYXlfc2VnbWVudC5zdGFydCkpOworICAgICAgICBuZXh0X3BhcnQgPSAtMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAobmV4dF9wYXJ0ICE9IC0xKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3BsaXRtdXgsICJBdCBFT1Mgb24gcGFkICUiIEdTVF9QVFJfRk9STUFUCisgICAgICAgICIgbW92aW5nIHRvIHBhcnQgJWQiLCBzcGxpdHBhZCwgbmV4dF9wYXJ0KTsKKyAgICBzcGxpdHBhZC0+Y3VyX3BhcnQgPSBuZXh0X3BhcnQ7CisgICAgc3BsaXRwYWQtPnJlYWRlciA9IHNwbGl0bXV4LT5wYXJ0c1tzcGxpdHBhZC0+Y3VyX3BhcnRdOworICAgIGlmIChzcGxpdHBhZC0+cGFydF9wYWQpCisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChzcGxpdHBhZC0+cGFydF9wYWQpOworICAgIHNwbGl0cGFkLT5wYXJ0X3BhZCA9CisgICAgICAgIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9sb29rdXBfcGFkIChzcGxpdHBhZC0+cmVhZGVyLAorICAgICAgICAoR3N0UGFkICopIChzcGxpdHBhZCkpOworCisgICAgaWYgKHNwbGl0bXV4LT5jdXJfcGFydCAhPSBuZXh0X3BhcnQpIHsKKyAgICAgIGlmICghZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2lzX2FjdGl2ZSAoc3BsaXRwYWQtPnJlYWRlcikpIHsKKyAgICAgICAgR3N0U2VnbWVudCB0bXA7CisgICAgICAgIC8qIElmIG1vdmluZyBiYWNrd2FyZCBpbnRvIGEgbmV3IHBhcnQsIHNldCBzdG9wCisgICAgICAgICAqIHRvIC0xIHRvIGVuc3VyZSB3ZSBwbGF5IHRoZSBlbnRpcmUgZmlsZSAtIHdvcmthcm91bmQKKyAgICAgICAgICogYSBidWcgaW4gcXRkZW11eCB0aGF0IG1pc3NlcyBiaXRzIGF0IHRoZSBlbmQgKi8KKyAgICAgICAgZ3N0X3NlZ21lbnRfY29weV9pbnRvICgmc3BsaXRtdXgtPnBsYXlfc2VnbWVudCwgJnRtcCk7CisgICAgICAgIGlmICh0bXAucmF0ZSA8IDApCisgICAgICAgICAgdG1wLnN0b3AgPSAtMTsKKworICAgICAgICAvKiBUaGlzIGlzIHRoZSBmaXJzdCBwYWQgdG8gbW92ZSB0byB0aGUgbmV3IHBhcnQsIGFjdGl2YXRlIGl0ICovCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNwbGl0cGFkLAorICAgICAgICAgICAgIkZpcnN0IHBhZCB0byBjaGFuZ2UgcGFydC4gQWN0aXZhdGluZyBwYXJ0ICVkIHdpdGggc2VnICUiCisgICAgICAgICAgICBHU1RfU0VHTUVOVF9GT1JNQVQsIG5leHRfcGFydCwgJnRtcCk7CisgICAgICAgIGlmICghZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2FjdGl2YXRlIChzcGxpdHBhZC0+cmVhZGVyLCAmdG1wLAorICAgICAgICAgICAgICAgIEdTVF9TRUVLX0ZMQUdfTk9ORSkpCisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIH0KKyAgICAgIHNwbGl0bXV4LT5jdXJfcGFydCA9IG5leHRfcGFydDsKKyAgICB9CisgICAgcmVzID0gVFJVRTsKKyAgfQorCisgIFNQTElUTVVYX1NSQ19VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgcmV0dXJuIHJlczsKK2Vycm9yOgorICBTUExJVE1VWF9TUkNfVU5MT0NLIChzcGxpdG11eCk7CisgIEdTVF9FTEVNRU5UX0VSUk9SIChzcGxpdG11eCwgUkVTT1VSQ0UsIFJFQUQsIChOVUxMKSwKKyAgICAgICgiRmFpbGVkIHRvIGFjdGl2YXRlIHBhcnQgJWQiLCBzcGxpdG11eC0+Y3VyX3BhcnQpKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitHX0RFRklORV9UWVBFIChTcGxpdE11eFNyY1BhZCwgc3BsaXRtdXhfc3JjX3BhZCwgR1NUX1RZUEVfUEFEKTsKKworc3RhdGljIHZvaWQKK3NwbGl0bXV4X3NyY19wYWRfY29uc3RydWN0ZWQgKEdPYmplY3QgKiBwYWQpCit7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChHU1RfUEFEIChwYWQpLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKHNwbGl0bXV4X3NyY19wYWRfZXZlbnQpKTsKKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKEdTVF9QQUQgKHBhZCksCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoc3BsaXRtdXhfc3JjX3BhZF9xdWVyeSkpOworCisgIEdfT0JKRUNUX0NMQVNTIChzcGxpdG11eF9zcmNfcGFkX3BhcmVudF9jbGFzcyktPmNvbnN0cnVjdGVkIChwYWQpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwbGl0bXV4X3NyY19wYWRfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgU3BsaXRNdXhTcmNQYWQgKnBhZCA9IChTcGxpdE11eFNyY1BhZCAqKSAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHBhZCk7CisgIGlmIChwYWQtPnBhcnRfcGFkKSB7CisgICAgZ3N0X29iamVjdF91bnJlZiAocGFkLT5wYXJ0X3BhZCk7CisgICAgcGFkLT5wYXJ0X3BhZCA9IE5VTEw7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHBhZCk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHNwbGl0bXV4X3NyY19wYWRfcGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3NwbGl0bXV4X3NyY19wYWRfY2xhc3NfaW5pdCAoU3BsaXRNdXhTcmNQYWRDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3Rfa2xhc3MgPSAoR09iamVjdENsYXNzICopIChrbGFzcyk7CisKKyAgZ29iamVjdF9rbGFzcy0+Y29uc3RydWN0ZWQgPSBzcGxpdG11eF9zcmNfcGFkX2NvbnN0cnVjdGVkOworICBnb2JqZWN0X2tsYXNzLT5kaXNwb3NlID0gZ3N0X3NwbGl0bXV4X3NyY19wYWRfZGlzcG9zZTsKK30KKworc3RhdGljIHZvaWQKK3NwbGl0bXV4X3NyY19wYWRfaW5pdCAoU3BsaXRNdXhTcmNQYWQgKiBwYWQpCit7Cit9CisKKy8qIEV2ZW50IGhhbmRsZXIgZm9yIHNvdXJjZSBwYWRzLiBQcm94eSBldmVudHMgaW50byB0aGUgY2hpbGQKKyAqIHBhcnRzIGFzIG5lZWRlZAorICovCitzdGF0aWMgZ2Jvb2xlYW4KK3NwbGl0bXV4X3NyY19wYWRfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RTcGxpdE11eFNyYyAqc3BsaXRtdXggPSBHU1RfU1BMSVRNVVhfU1JDIChwYXJlbnQpOworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYXJlbnQsICJldmVudCAlIiBHU1RfUFRSX0ZPUk1BVAorICAgICAgIiBvbiAlIiBHU1RfUFRSX0ZPUk1BVCwgZXZlbnQsIHBhZCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzp7CisgICAgICBHc3RGb3JtYXQgZm9ybWF0OworICAgICAgZ2RvdWJsZSByYXRlOworICAgICAgR3N0U2Vla0ZsYWdzIGZsYWdzOworICAgICAgR3N0U2Vla1R5cGUgc3RhcnRfdHlwZSwgc3RvcF90eXBlOworICAgICAgZ2ludDY0IHN0YXJ0LCBzdG9wOworICAgICAgZ3VpbnQzMiBzZXFudW07CisgICAgICBnaW50IGk7CisgICAgICBHc3RDbG9ja1RpbWUgcGFydF9zdGFydCwgcG9zaXRpb247CisgICAgICBHTGlzdCAqY3VyOworICAgICAgR3N0U2VnbWVudCB0bXA7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgJnJhdGUsICZmb3JtYXQsICZmbGFncywKKyAgICAgICAgICAmc3RhcnRfdHlwZSwgJnN0YXJ0LCAmc3RvcF90eXBlLCAmc3RvcCk7CisKKyAgICAgIGlmIChmb3JtYXQgIT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNwbGl0bXV4LCAiY2FuIG9ubHkgc2VlayBvbiBUSU1FIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICB9CisgICAgICAvKiBGSVhNRTogU3VwcG9ydCBub24tZmx1c2hpbmcgc2Vla3MsIHdoaWNoIG1pZ2h0IG5ldmVyIHdha2UgdXAgKi8KKyAgICAgIGlmICghKGZsYWdzICYgR1NUX1NFRUtfRkxBR19GTFVTSCkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3BsaXRtdXgsICJPbmx5IGZsdXNoaW5nIHNlZWtzIHN1cHBvcnRlZCIpOworICAgICAgICBnb3RvIGVycm9yOworICAgICAgfQorICAgICAgc2VxbnVtID0gZ3N0X2V2ZW50X2dldF9zZXFudW0gKGV2ZW50KTsKKworICAgICAgU1BMSVRNVVhfU1JDX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGlmICghc3BsaXRtdXgtPnJ1bm5pbmcgfHwgc3BsaXRtdXgtPm51bV9wYXJ0cyA8IDEpIHsKKyAgICAgICAgLyogTm90IHN0YXJ0ZWQgeWV0ICovCisgICAgICAgIFNQTElUTVVYX1NSQ19VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIH0KKworICAgICAgZ3N0X3NlZ21lbnRfY29weV9pbnRvICgmc3BsaXRtdXgtPnBsYXlfc2VnbWVudCwgJnRtcCk7CisKKyAgICAgIGlmICghZ3N0X3NlZ21lbnRfZG9fc2VlayAoJnRtcCwgcmF0ZSwKKyAgICAgICAgICAgICAgZm9ybWF0LCBmbGFncywgc3RhcnRfdHlwZSwgc3RhcnQsIHN0b3BfdHlwZSwgc3RvcCwgTlVMTCkpIHsKKyAgICAgICAgLyogSW52YWxpZCBzZWVrIHJlcXVlc3RlZCwgaWdub3JlIGl0ICovCisgICAgICAgIFNQTElUTVVYX1NSQ19VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIH0KKyAgICAgIHBvc2l0aW9uID0gdG1wLnBvc2l0aW9uOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcGxpdG11eCwgIlBlcmZvcm1pbmcgc2VlayB3aXRoIHNlZyAlIgorICAgICAgICAgIEdTVF9TRUdNRU5UX0ZPUk1BVCwgJnRtcCk7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNwbGl0bXV4LAorICAgICAgICAgICJIYW5kbGluZyBmbHVzaGluZyBzZWVrLiBTZW5kaW5nIGZsdXNoIHN0YXJ0Iik7CisKKyAgICAgIC8qIFNlbmQgZmx1c2hfc3RhcnQgKi8KKyAgICAgIGdzdF9zcGxpdG11eF9wdXNoX2V2ZW50IChzcGxpdG11eCwgZ3N0X2V2ZW50X25ld19mbHVzaF9zdGFydCAoKSwgc2VxbnVtKTsKKworICAgICAgLyogU3RvcCBhbGwgcGFydHMsIHdoaWNoIHdpbGwgd29yayBiZWNhdXNlIG9mIHRoZSBmbHVzaCAqLworICAgICAgU1BMSVRNVVhfU1JDX1BBRFNfTE9DSyAoc3BsaXRtdXgpOworICAgICAgU1BMSVRNVVhfU1JDX1VOTE9DSyAoc3BsaXRtdXgpOworICAgICAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHNwbGl0bXV4LT5wYWRzKTsKKyAgICAgICAgICBjdXIgIT0gTlVMTDsgY3VyID0gZ19saXN0X25leHQgKGN1cikpIHsKKyAgICAgICAgU3BsaXRNdXhTcmNQYWQgKnRhcmdldCA9IChTcGxpdE11eFNyY1BhZCAqKSAoY3VyLT5kYXRhKTsKKyAgICAgICAgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpyZWFkZXIgPSBzcGxpdG11eC0+cGFydHNbdGFyZ2V0LT5jdXJfcGFydF07CisgICAgICAgIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9kZWFjdGl2YXRlIChyZWFkZXIpOworICAgICAgfQorCisgICAgICAvKiBTaHV0IGRvd24gcGFkIHRhc2tzICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcGxpdG11eCwgIlBhdXNpbmcgcGFkIHRhc2tzIik7CisgICAgICBmb3IgKGN1ciA9IGdfbGlzdF9maXJzdCAoc3BsaXRtdXgtPnBhZHMpOworICAgICAgICAgIGN1ciAhPSBOVUxMOyBjdXIgPSBnX2xpc3RfbmV4dCAoY3VyKSkgeworICAgICAgICBHc3RQYWQgKnNwbGl0cGFkID0gKEdzdFBhZCAqKSAoY3VyLT5kYXRhKTsKKyAgICAgICAgZ3N0X3BhZF9wYXVzZV90YXNrIChHU1RfUEFEIChzcGxpdHBhZCkpOworICAgICAgfQorICAgICAgU1BMSVRNVVhfU1JDX1BBRFNfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBTUExJVE1VWF9TUkNfTE9DSyAoc3BsaXRtdXgpOworCisgICAgICAvKiBTZW5kIGZsdXNoIHN0b3AgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNwbGl0bXV4LCAiU2VuZGluZyBmbHVzaCBzdG9wIik7CisgICAgICBnc3Rfc3BsaXRtdXhfcHVzaF9mbHVzaF9zdG9wIChzcGxpdG11eCwgc2VxbnVtKTsKKworICAgICAgLyogRXZlcnl0aGluZyBpcyBzdG9wcGVkLCBzbyB1cGRhdGUgdGhlIHBsYXlfc2VnbWVudCAqLworICAgICAgZ3N0X3NlZ21lbnRfY29weV9pbnRvICgmdG1wLCAmc3BsaXRtdXgtPnBsYXlfc2VnbWVudCk7CisgICAgICBzcGxpdG11eC0+c2VnbWVudF9zZXFudW0gPSBzZXFudW07CisKKyAgICAgIC8qIFdvcmsgb3V0IHdoZXJlIHRvIHN0YXJ0IGZyb20gbm93ICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgc3BsaXRtdXgtPm51bV9wYXJ0czsgaSsrKSB7CisgICAgICAgIEdzdFNwbGl0TXV4UGFydFJlYWRlciAqcmVhZGVyID0gc3BsaXRtdXgtPnBhcnRzW2ldOworICAgICAgICBHc3RDbG9ja1RpbWUgcGFydF9lbmQgPQorICAgICAgICAgICAgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2dldF9lbmRfb2Zmc2V0IChyZWFkZXIpOworCisgICAgICAgIGlmIChwYXJ0X2VuZCA+IHBvc2l0aW9uKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGkgPT0gc3BsaXRtdXgtPm51bV9wYXJ0cykKKyAgICAgICAgaSA9IHNwbGl0bXV4LT5udW1fcGFydHMgLSAxOworCisgICAgICBwYXJ0X3N0YXJ0ID0KKyAgICAgICAgICBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfZ2V0X3N0YXJ0X29mZnNldCAoc3BsaXRtdXgtPnBhcnRzW2ldKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICAgIlNlZWsgdG8gdGltZSAlIiBHU1RfVElNRV9GT1JNQVQgIiBsYW5kZWQgaW4gcGFydCAlZCBvZmZzZXQgJSIKKyAgICAgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHBvc2l0aW9uKSwKKyAgICAgICAgICBpLCBHU1RfVElNRV9BUkdTIChwb3NpdGlvbiAtIHBhcnRfc3RhcnQpKTsKKworICAgICAgcmV0ID0gZ3N0X3NwbGl0bXV4X3NyY19hY3RpdmF0ZV9wYXJ0IChzcGxpdG11eCwgaSwgZmxhZ3MpOworICAgICAgU1BMSVRNVVhfU1JDX1VOTE9DSyAoc3BsaXRtdXgpOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKK2Vycm9yOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3NwbGl0bXV4X3NyY19wYWRfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICAvKiBRdWVyeSBoYW5kbGVyIGZvciBzb3VyY2UgcGFkcy4gUHJveHkgcXVlcmllcyBpbnRvIHRoZSBjaGlsZAorICAgKiBwYXJ0cyBhcyBuZWVkZWQKKyAgICovCisgIEdzdFNwbGl0TXV4U3JjICpzcGxpdG11eCA9IEdTVF9TUExJVE1VWF9TUkMgKHBhcmVudCk7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIEdTVF9MT0dfT0JKRUNUIChwYXJlbnQsICJxdWVyeSAlIiBHU1RfUFRSX0ZPUk1BVAorICAgICAgIiBvbiAlIiBHU1RfUFRSX0ZPUk1BVCwgcXVlcnksIHBhZCk7CisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0NBUFM6CisgICAgY2FzZSBHU1RfUVVFUllfUE9TSVRJT046eworICAgICAgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpwYXJ0OworICAgICAgU3BsaXRNdXhTcmNQYWQgKmFueXBhZDsKKworICAgICAgU1BMSVRNVVhfU1JDX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIFNQTElUTVVYX1NSQ19QQURTX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGFueXBhZCA9IChTcGxpdE11eFNyY1BhZCAqKSAoc3BsaXRtdXgtPnBhZHMtPmRhdGEpOworICAgICAgcGFydCA9IHNwbGl0bXV4LT5wYXJ0c1thbnlwYWQtPmN1cl9wYXJ0XTsKKyAgICAgIHJldCA9IGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9zcmNfcXVlcnkgKHBhcnQsIHBhZCwgcXVlcnkpOworICAgICAgU1BMSVRNVVhfU1JDX1BBRFNfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBTUExJVE1VWF9TUkNfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfRFVSQVRJT046eworICAgICAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uOworICAgICAgR3N0Rm9ybWF0IGZtdDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2R1cmF0aW9uIChxdWVyeSwgJmZtdCwgTlVMTCk7CisgICAgICBpZiAoZm10ICE9IEdTVF9GT1JNQVRfVElNRSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgZHVyYXRpb24gPSBzcGxpdG11eC0+dG90YWxfZHVyYXRpb247CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc3BsaXRtdXgpOworCisgICAgICBpZiAoZHVyYXRpb24gPiAwICYmIGR1cmF0aW9uICE9IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICAgICAgZ3N0X3F1ZXJ5X3NldF9kdXJhdGlvbiAocXVlcnksIEdTVF9GT1JNQVRfVElNRSwgZHVyYXRpb24pOworICAgICAgICByZXQgPSBUUlVFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX1NFRUtJTkc6eworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3NlZWtpbmcgKHF1ZXJ5LCAmZm9ybWF0LCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgIGlmIChmb3JtYXQgIT0gR1NUX0ZPUk1BVF9USU1FKQorICAgICAgICBicmVhazsKKworICAgICAgR1NUX09CSkVDVF9MT0NLIChzcGxpdG11eCk7CisgICAgICBnc3RfcXVlcnlfc2V0X3NlZWtpbmcgKHF1ZXJ5LCBHU1RfRk9STUFUX1RJTUUsIFRSVUUsIDAsCisgICAgICAgICAgc3BsaXRtdXgtPnRvdGFsX2R1cmF0aW9uKTsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc3BsaXRtdXgpOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKKworZ2Jvb2xlYW4KK3JlZ2lzdGVyX3NwbGl0bXV4c3JjIChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChzcGxpdG11eF9kZWJ1ZywgInNwbGl0bXV4c3JjIiwgMCwKKyAgICAgICJTcGxpdCBGaWxlIERlbXV4aW5nIFNvdXJjZSIpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAic3BsaXRtdXhzcmMiLCBHU1RfUkFOS19OT05FLAorICAgICAgR1NUX1RZUEVfU1BMSVRNVVhfU1JDKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuaCBiL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjM0YzkwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNyYy5oCkBAIC0wLDAgKzEsMTA5IEBACisvKiBHU3RyZWFtZXIgU3BsaXQgTXV4ZWQgRmlsZSBTb3VyY2UKKyAqIENvcHlyaWdodCAoQykgMjAxNCBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmbmRlZiBfX0dTVF9TUExJVE1VWF9TUkNfSF9fCisjZGVmaW5lIF9fR1NUX1NQTElUTVVYX1NSQ19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImdzdHNwbGl0bXV4cGFydHJlYWRlci5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfU1BMSVRNVVhfU1JDIFwKKyAgKGdzdF9zcGxpdG11eF9zcmNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1NQTElUTVVYX1NSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1NQTElUTVVYX1NSQyxHc3RTcGxpdE11eFNyYykpCisjZGVmaW5lIEdTVF9TUExJVE1VWF9TUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfU1BMSVRNVVhfU1JDLEdzdFNwbGl0TXV4U3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfU1BMSVRNVVhfU1JDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfU1BMSVRNVVhfU1JDKSkKKyNkZWZpbmUgR1NUX0lTX1NQTElUTVVYX1NSQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9TUExJVE1VWF9TUkMpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0U3BsaXRNdXhTcmMgR3N0U3BsaXRNdXhTcmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0U3BsaXRNdXhTcmNDbGFzcyBHc3RTcGxpdE11eFNyY0NsYXNzOworCitzdHJ1Y3QgX0dzdFNwbGl0TXV4U3JjCit7CisgIEdzdEJpbiBwYXJlbnQ7CisKKyAgR011dGV4IGxvY2s7CisgIGdib29sZWFuICAgICBydW5uaW5nOworCisgIGdjaGFyICAgICAgICpsb2NhdGlvbjsgIC8qIE9CSkVDVF9MT0NLICovCisKKyAgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICoqcGFydHM7CisgIGd1aW50ICAgICAgICBudW1fcGFydHM7CisgIGd1aW50ICAgICAgICBjdXJfcGFydDsKKworICBnYm9vbGVhbiBwYWRzX2NvbXBsZXRlOworICBHTXV0ZXggcGFkc19sb2NrOworICBHTGlzdCAgKnBhZHM7IC8qIHBhZHNfbG9jayAqLworCisgIEdzdENsb2NrVGltZSB0b3RhbF9kdXJhdGlvbjsKKyAgR3N0U2VnbWVudCBwbGF5X3NlZ21lbnQ7CisgIGd1aW50MzIgc2VnbWVudF9zZXFudW07Cit9OworCitzdHJ1Y3QgX0dzdFNwbGl0TXV4U3JjQ2xhc3MKK3sKKyAgR3N0QmluQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgc3BsaXRtdXhfc3JjX3BhZF9nZXRfdHlwZSAodm9pZCk7CisjZGVmaW5lIFNQTElUTVVYX1RZUEVfU1JDX1BBRCBzcGxpdG11eF9zcmNfcGFkX2dldF90eXBlKCkKKyNkZWZpbmUgU1BMSVRNVVhfU1JDX1BBRF9DQVNUKHApICgoU3BsaXRNdXhTcmNQYWQgKikocCkpCisjZGVmaW5lIFNQTElUTVVYX1NSQ19QQUQob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxTUExJVE1VWF9UWVBFX1NSQ19QQUQsU3BsaXRNdXhTcmNQYWQpKQorCitzdHJ1Y3QgX1NwbGl0TXV4U3JjUGFkCit7CisgIEdzdFBhZCBwYXJlbnQ7CisKKyAgZ3VpbnQgY3VyX3BhcnQ7CisgIEdzdFNwbGl0TXV4UGFydFJlYWRlciAqcmVhZGVyOworICBHc3RQYWQgKnBhcnRfcGFkOworCisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBnYm9vbGVhbiBzZXRfbmV4dF9kaXNjb250OworICBnYm9vbGVhbiBjbGVhcl9uZXh0X2Rpc2NvbnQ7CisKKyAgZ2Jvb2xlYW4gc2VudF9zdHJlYW1fc3RhcnQ7CisgIGdib29sZWFuIHNlbnRfY2FwczsKKyAgZ2Jvb2xlYW4gc2VudF9zZWdtZW50OworfTsKKworc3RydWN0IF9TcGxpdE11eFNyY1BhZENsYXNzCit7CisgIEdzdFBhZENsYXNzIHBhcmVudDsKK307CisKK0dUeXBlIGdzdF9zcGxpdG11eF9zcmNfZ2V0X3R5cGUgKHZvaWQpOworZ2Jvb2xlYW4gcmVnaXN0ZXJfc3BsaXRtdXhzcmMgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKKyNkZWZpbmUgU1BMSVRNVVhfU1JDX0xPQ0socykgZ19tdXRleF9sb2NrKCYocyktPmxvY2spCisjZGVmaW5lIFNQTElUTVVYX1NSQ19VTkxPQ0socykgZ19tdXRleF91bmxvY2soJihzKS0+bG9jaykKKworI2RlZmluZSBTUExJVE1VWF9TUkNfUEFEU19MT0NLKHMpIGdfbXV0ZXhfbG9jaygmKHMpLT5wYWRzX2xvY2spCisjZGVmaW5lIFNQTElUTVVYX1NSQ19QQURTX1VOTE9DSyhzKSBnX211dGV4X3VubG9jaygmKHMpLT5wYWRzX2xvY2spCisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9TUExJVE1VWF9TUkNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0dXRpbHMuYyBiL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXR1dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMDg4YTUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0dXRpbHMuYwpAQCAtMCwwICsxLDEwNSBAQAorLyogR1N0cmVhbWVyIFNwbGl0IFNvdXJjZSBVdGlsaXR5IEZ1bmN0aW9ucworICogQ29weXJpZ2h0IChDKSAyMDExIENvbGxhYm9yYSBMdGQuIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCAoQykgMjAxNCBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0c3BsaXR1dGlscy5oIgorI2luY2x1ZGUgInBhdHRlcm5zcGVjLmgiCisKK3N0YXRpYyBpbnQKK2dzdF9zcGxpdF91dGlsX2FycmF5X3NvcnRmdW5jIChnY2hhciAqKiBhLCBnY2hhciAqKiBiKQoreworICByZXR1cm4gc3RyY21wICgqYSwgKmIpOworfQorCitnY2hhciAqKgorZ3N0X3NwbGl0X3V0aWxfZmluZF9maWxlcyAoY29uc3QgZ2NoYXIgKiBkaXJuYW1lLAorICAgIGNvbnN0IGdjaGFyICogYmFzZW5hbWUsIEdFcnJvciAqKiBlcnIpCit7CisgIFBhdHRlcm5TcGVjICpwc3BlYzsKKyAgR1B0ckFycmF5ICpmaWxlczsKKyAgY29uc3QgZ2NoYXIgKm5hbWU7CisgIEdEaXIgKmRpcjsKKworICBpZiAoZGlybmFtZSA9PSBOVUxMIHx8IGJhc2VuYW1lID09IE5VTEwpCisgICAgZ290byBpbnZhbGlkX2xvY2F0aW9uOworCisgIEdTVF9JTkZPICgiY2hlY2tpbmcgaW4gZGlyZWN0b3J5ICclcycgZm9yIHBhdHRlcm4gJyVzJyIsIGRpcm5hbWUsIGJhc2VuYW1lKTsKKworICBkaXIgPSBnX2Rpcl9vcGVuIChkaXJuYW1lLCAwLCBlcnIpOworICBpZiAoZGlyID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKERFRkFVTFRfUEFUVEVSTl9NQVRDSF9NT0RFID09IE1BVENIX01PREVfVVRGOCAmJgorICAgICAgIWdfdXRmOF92YWxpZGF0ZSAoYmFzZW5hbWUsIC0xLCBOVUxMKSkgeworICAgIGdvdG8gbm90X3V0Zjg7CisgIH0KKworICAvKiBtb2RlIHdpbGwgYmUgQVVUTyBvbiBsaW51eC91bml4IGFuZCBVVEY4IG9uIHdpbjMyICovCisgIHBzcGVjID0gcGF0dGVybl9zcGVjX25ldyAoYmFzZW5hbWUsIERFRkFVTFRfUEFUVEVSTl9NQVRDSF9NT0RFKTsKKworICBmaWxlcyA9IGdfcHRyX2FycmF5X25ldyAoKTsKKworICB3aGlsZSAoKG5hbWUgPSBnX2Rpcl9yZWFkX25hbWUgKGRpcikpKSB7CisgICAgR1NUX1RSQUNFICgiY2hlY2s6ICVzIiwgbmFtZSk7CisgICAgaWYgKHBhdHRlcm5fbWF0Y2hfc3RyaW5nIChwc3BlYywgbmFtZSkpIHsKKyAgICAgIEdTVF9ERUJVRyAoIm1hdGNoOiAlcyIsIG5hbWUpOworICAgICAgZ19wdHJfYXJyYXlfYWRkIChmaWxlcywgZ19idWlsZF9maWxlbmFtZSAoZGlybmFtZSwgbmFtZSwgTlVMTCkpOworICAgIH0KKyAgfQorCisgIGlmIChmaWxlcy0+bGVuID09IDApCisgICAgZ290byBub19tYXRjaGVzOworCisgIGdfcHRyX2FycmF5X3NvcnQgKGZpbGVzLCAoR0NvbXBhcmVGdW5jKSBnc3Rfc3BsaXRfdXRpbF9hcnJheV9zb3J0ZnVuYyk7CisgIGdfcHRyX2FycmF5X2FkZCAoZmlsZXMsIE5VTEwpOworCisgIHBhdHRlcm5fc3BlY19mcmVlIChwc3BlYyk7CisgIGdfZGlyX2Nsb3NlIChkaXIpOworCisgIHJldHVybiAoZ2NoYXIgKiopIGdfcHRyX2FycmF5X2ZyZWUgKGZpbGVzLCBGQUxTRSk7CisKKy8qIEVSUk9SUyAqLworaW52YWxpZF9sb2NhdGlvbjoKKyAgeworICAgIGdfc2V0X2Vycm9yX2xpdGVyYWwgKGVyciwgR19GSUxFX0VSUk9SLCBHX0ZJTEVfRVJST1JfSU5WQUwsCisgICAgICAgICJObyBmaWxlbmFtZSBzcGVjaWZpZWQuIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK25vdF91dGY4OgorICB7CisgICAgZ19kaXJfY2xvc2UgKGRpcik7CisgICAgZ19zZXRfZXJyb3JfbGl0ZXJhbCAoZXJyLCBHX0ZJTEVfRVJST1IsIEdfRklMRV9FUlJPUl9JTlZBTCwKKyAgICAgICAgIkZpbGVuYW1lIHBhdHRlcm4gbXVzdCBiZSBVVEYtOCBvbiBXaW5kb3dzLiIpOworICAgIHJldHVybiBOVUxMOworICB9Citub19tYXRjaGVzOgorICB7CisgICAgcGF0dGVybl9zcGVjX2ZyZWUgKHBzcGVjKTsKKyAgICBnX2Rpcl9jbG9zZSAoZGlyKTsKKyAgICBnX3NldF9lcnJvcl9saXRlcmFsIChlcnIsIEdfRklMRV9FUlJPUiwgR19GSUxFX0VSUk9SX05PRU5ULAorICAgICAgICAiRm91bmQgbm8gZmlsZXMgbWF0Y2hpbmcgdGhlIHBhdHRlcm4uIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXR1dGlscy5oIGIvZ3N0L211bHRpZmlsZS9nc3RzcGxpdHV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM3OGIyMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXR1dGlscy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qIEdTdHJlYW1lciBTcGxpdCBTb3VyY2UgVXRpbGl0eSBGdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoQykgMjAxMSBDb2xsYWJvcmEgTHRkLiA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9TUExJVFVUSUxTX0hfXworI2RlZmluZSBfX0dTVF9TUExJVFVUSUxTX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNpZmRlZiBHX09TX1dJTjMyCisjZGVmaW5lIERFRkFVTFRfUEFUVEVSTl9NQVRDSF9NT0RFIE1BVENIX01PREVfVVRGOAorI2Vsc2UKKyNkZWZpbmUgREVGQVVMVF9QQVRURVJOX01BVENIX01PREUgTUFUQ0hfTU9ERV9BVVRPCisjZW5kaWYKKworZ2NoYXIgKioKK2dzdF9zcGxpdF91dGlsX2ZpbmRfZmlsZXMgKGNvbnN0IGdjaGFyICogZGlybmFtZSwKKyAgICBjb25zdCBnY2hhciAqIGJhc2VuYW1lLCBHRXJyb3IgKiogZXJyKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvbXVsdGlmaWxlL21lc29uLmJ1aWxkIGIvZ3N0L211bHRpZmlsZS9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWU0NzM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpZmlsZS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDM3IEBACittdWx0aWZpbGVfc291cmNlcyA9IFsKKyAgJ2dzdG11bHRpZmlsZXNpbmsuYycsCisgICdnc3RtdWx0aWZpbGVzcmMuYycsCisgICdnc3RtdWx0aWZpbGUuYycsCisgICdnc3RzcGxpdGZpbGVzcmMuYycsCisgICdnc3RzcGxpdG11eHBhcnRyZWFkZXIuYycsCisgICdnc3RzcGxpdG11eHNpbmsuYycsCisgICdnc3RzcGxpdG11eHNyYy5jJywKKyAgJ2dzdHNwbGl0dXRpbHMuYycsCisgICdwYXR0ZXJuc3BlYy5jJywKK10KKworZ3N0bXVsdGlmaWxlID0gbGlicmFyeSgnZ3N0bXVsdGlmaWxlJywKKyAgbXVsdGlmaWxlX3NvdXJjZXMsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0dmlkZW9fZGVwLCBnc3RiYXNlX2RlcCwKKyAgICAgICAgICAgICAgICAgIGdzdHBidXRpbHNfZGVwLCBnaW9fZGVwXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKKwordGVzdF9zcGxpdG11eHBhcnRyZWFkZXJfc291cmNlcyA9IFsKKyAgJ3Rlc3Qtc3BsaXRtdXhwYXJ0cmVhZGVyLmMnLAorICAnZ3N0c3BsaXRtdXhwYXJ0cmVhZGVyLmMnLAorICAnZ3N0c3BsaXRtdXhzcmMuYycsCisgICdnc3RzcGxpdHV0aWxzLmMnLAorICAncGF0dGVybnNwZWMuYycsCitdCisKK2V4ZWN1dGFibGUoJ3Rlc3Qtc3BsaXRtdXhwYXJ0cmVhZGVyJywKKyAgdGVzdF9zcGxpdG11eHBhcnRyZWFkZXJfc291cmNlcywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luYywgbGlic2luY10sCisgIGRlcGVuZGVuY2llcyA6IFtnc3R0YWdfZGVwLCBnc3RiYXNlX2RlcF0sCisgIGluc3RhbGwgOiBmYWxzZSwKKykKZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvcGF0dGVybnNwZWMuYyBiL2dzdC9tdWx0aWZpbGUvcGF0dGVybnNwZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDhhYWJhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpZmlsZS9wYXR0ZXJuc3BlYy5jCkBAIC0wLDAgKzEsMzM0IEBACisvKiBHUGF0dGVybiBjb3B5IHRoYXQgc3VwcG9ydHMgcmF3IChub24tdXRmOCkgbWF0Y2hpbmcKKyAqIGJhc2VkIG9uOiBHTElCIC0gTGlicmFyeSBvZiB1c2VmdWwgcm91dGluZXMgZm9yIEMgcHJvZ3JhbW1pbmcKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCAxOTk5ICBQZXRlciBNYXR0aXMsIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAicGF0dGVybnNwZWMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordHlwZWRlZiBlbnVtCit7CisgIE1BVENIX0FMTCwgICAgICAgICAgICAgICAgICAgIC8qICIqQT9BKiIgKi8KKyAgTUFUQ0hfQUxMX1RBSUwsICAgICAgICAgICAgICAgLyogIipBP0FBIiAqLworICBNQVRDSF9IRUFELCAgICAgICAgICAgICAgICAgICAvKiAiQUFBQSoiICovCisgIE1BVENIX1RBSUwsICAgICAgICAgICAgICAgICAgIC8qICIqQUFBQSIgKi8KKyAgTUFUQ0hfRVhBQ1QsICAgICAgICAgICAgICAgICAgLyogIkFBQUFBIiAqLworICBNQVRDSF9MQVNUCit9IE1hdGNoVHlwZTsKKworc3RydWN0IF9QYXR0ZXJuU3BlYworeworICBNYXRjaE1vZGUgbWF0Y2hfbW9kZTsKKyAgTWF0Y2hUeXBlIG1hdGNoX3R5cGU7CisgIGd1aW50IHBhdHRlcm5fbGVuZ3RoOworICBndWludCBtaW5fbGVuZ3RoOworICBndWludCBtYXhfbGVuZ3RoOworICBnY2hhciAqcGF0dGVybjsKK307CisKK3N0YXRpYyBpbmxpbmUgZ2NoYXIgKgorcmF3X3N0cnJldmVyc2UgKGNvbnN0IGdjaGFyICogc3RyLCBnc3NpemUgc2l6ZSkKK3sKKyAgZ19hc3NlcnQgKHNpemUgPiAwKTsKKyAgcmV0dXJuIGdfc3RycmV2ZXJzZSAoZ19zdHJuZHVwIChzdHIsIHNpemUpKTsKK30KKworc3RhdGljIGlubGluZSBnYm9vbGVhbgorcGF0dGVybl9waF9tYXRjaCAoY29uc3QgZ2NoYXIgKiBtYXRjaF9wYXR0ZXJuLCBNYXRjaE1vZGUgbWF0Y2hfbW9kZSwKKyAgICBjb25zdCBnY2hhciAqIG1hdGNoX3N0cmluZywgZ2Jvb2xlYW4gKiB3aWxkY2FyZF9yZWFjaGVkX3ApCit7CisgIHJlZ2lzdGVyIGNvbnN0IGdjaGFyICpwYXR0ZXJuLCAqc3RyaW5nOworICByZWdpc3RlciBnY2hhciBjaDsKKworICBwYXR0ZXJuID0gbWF0Y2hfcGF0dGVybjsKKyAgc3RyaW5nID0gbWF0Y2hfc3RyaW5nOworCisgIGNoID0gKnBhdHRlcm47CisgIHBhdHRlcm4rKzsKKyAgd2hpbGUgKGNoKSB7CisgICAgc3dpdGNoIChjaCkgeworICAgICAgY2FzZSAnPyc6CisgICAgICAgIGlmICghKnN0cmluZykKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChtYXRjaF9tb2RlID09IE1BVENIX01PREVfVVRGOCkKKyAgICAgICAgICBzdHJpbmcgPSBnX3V0ZjhfbmV4dF9jaGFyIChzdHJpbmcpOworICAgICAgICBlbHNlCisgICAgICAgICAgKytzdHJpbmc7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICcqJzoKKyAgICAgICAgKndpbGRjYXJkX3JlYWNoZWRfcCA9IFRSVUU7CisgICAgICAgIGRvIHsKKyAgICAgICAgICBjaCA9ICpwYXR0ZXJuOworICAgICAgICAgIHBhdHRlcm4rKzsKKyAgICAgICAgICBpZiAoY2ggPT0gJz8nKSB7CisgICAgICAgICAgICBpZiAoISpzdHJpbmcpCisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIGlmIChtYXRjaF9tb2RlID09IE1BVENIX01PREVfVVRGOCkKKyAgICAgICAgICAgICAgc3RyaW5nID0gZ191dGY4X25leHRfY2hhciAoc3RyaW5nKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgKytzdHJpbmc7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdoaWxlIChjaCA9PSAnKicgfHwgY2ggPT0gJz8nKTsKKyAgICAgICAgaWYgKCFjaCkKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgZG8geworICAgICAgICAgIGdib29sZWFuIG5leHRfd2lsZGNhcmRfcmVhY2hlZCA9IEZBTFNFOworICAgICAgICAgIHdoaWxlIChjaCAhPSAqc3RyaW5nKSB7CisgICAgICAgICAgICBpZiAoISpzdHJpbmcpCisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIGlmIChtYXRjaF9tb2RlID09IE1BVENIX01PREVfVVRGOCkKKyAgICAgICAgICAgICAgc3RyaW5nID0gZ191dGY4X25leHRfY2hhciAoc3RyaW5nKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgKytzdHJpbmc7CisgICAgICAgICAgfQorICAgICAgICAgIHN0cmluZysrOworICAgICAgICAgIGlmIChwYXR0ZXJuX3BoX21hdGNoIChwYXR0ZXJuLCBtYXRjaF9tb2RlLCBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAmbmV4dF93aWxkY2FyZF9yZWFjaGVkKSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgIGlmIChuZXh0X3dpbGRjYXJkX3JlYWNoZWQpCisgICAgICAgICAgICAvKiB0aGUgZm9ydGhjb21pbmcgcGF0dGVybiBzdWJzdHJpbmcgdXAgdG8gdGhlIG5leHQgd2lsZGNhcmQgaGFzCisgICAgICAgICAgICAgKiBiZWVuIG1hdGNoZWQsIGJ1dCBhIG1pc21hdGNoIG9jY291cmVkIGZvciB0aGUgcmVzdCBvZiB0aGUKKyAgICAgICAgICAgICAqIHBhdHRlcm4sIGZvbGxvd2luZyB0aGUgbmV4dCB3aWxkY2FyZC4KKyAgICAgICAgICAgICAqIHRoZXJlJ3Mgbm8gbmVlZCB0byBhZHZhbmNlIHRoZSBjdXJyZW50IG1hdGNoIHBvc2l0aW9uIGFueQorICAgICAgICAgICAgICogZnVydGhlciBpZiB0aGUgcmVzdCBwYXR0ZXJuIHdpbGwgbm90IG1hdGNoLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKCpzdHJpbmcpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGNoID09ICpzdHJpbmcpCisgICAgICAgICAgc3RyaW5nKys7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNoID0gKnBhdHRlcm47CisgICAgcGF0dGVybisrOworICB9CisKKyAgcmV0dXJuICpzdHJpbmcgPT0gMDsKK30KKworc3RhdGljIGdib29sZWFuCitwYXR0ZXJuX21hdGNoIChQYXR0ZXJuU3BlYyAqIHBzcGVjLCBndWludCBzdHJpbmdfbGVuZ3RoLAorICAgIGNvbnN0IGdjaGFyICogc3RyaW5nLCBjb25zdCBnY2hhciAqIHN0cmluZ19yZXZlcnNlZCkKK3sKKyAgTWF0Y2hNb2RlIG1hdGNoX21vZGU7CisKKyAgZ19hc3NlcnQgKHBzcGVjICE9IE5VTEwpOworICBnX2Fzc2VydCAoc3RyaW5nICE9IE5VTEwpOworCisgIGlmIChzdHJpbmdfbGVuZ3RoIDwgcHNwZWMtPm1pbl9sZW5ndGggfHwgc3RyaW5nX2xlbmd0aCA+IHBzcGVjLT5tYXhfbGVuZ3RoKQorICAgIHJldHVybiBGQUxTRTsKKworICBtYXRjaF9tb2RlID0gcHNwZWMtPm1hdGNoX21vZGU7CisgIGlmIChtYXRjaF9tb2RlID09IE1BVENIX01PREVfQVVUTykgeworICAgIGlmICghZ191dGY4X3ZhbGlkYXRlIChzdHJpbmcsIHN0cmluZ19sZW5ndGgsIE5VTEwpKQorICAgICAgbWF0Y2hfbW9kZSA9IE1BVENIX01PREVfUkFXOworICAgIGVsc2UKKyAgICAgIG1hdGNoX21vZGUgPSBNQVRDSF9NT0RFX1VURjg7CisgIH0KKworICBzd2l0Y2ggKHBzcGVjLT5tYXRjaF90eXBlKSB7CisgICAgICBnYm9vbGVhbiBkdW1teTsKKyAgICBjYXNlIE1BVENIX0FMTDoKKyAgICAgIHJldHVybiBwYXR0ZXJuX3BoX21hdGNoIChwc3BlYy0+cGF0dGVybiwgbWF0Y2hfbW9kZSwgc3RyaW5nLCAmZHVtbXkpOworICAgIGNhc2UgTUFUQ0hfQUxMX1RBSUw6CisgICAgICBpZiAoc3RyaW5nX3JldmVyc2VkKQorICAgICAgICByZXR1cm4gcGF0dGVybl9waF9tYXRjaCAocHNwZWMtPnBhdHRlcm4sIG1hdGNoX21vZGUsIHN0cmluZ19yZXZlcnNlZCwKKyAgICAgICAgICAgICZkdW1teSk7CisgICAgICBlbHNlIHsKKyAgICAgICAgZ2Jvb2xlYW4gcmVzdWx0OworICAgICAgICBnY2hhciAqdG1wOworICAgICAgICBpZiAobWF0Y2hfbW9kZSA9PSBNQVRDSF9NT0RFX1VURjgpIHsKKyAgICAgICAgICB0bXAgPSBnX3V0Zjhfc3RycmV2ZXJzZSAoc3RyaW5nLCBzdHJpbmdfbGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0bXAgPSByYXdfc3RycmV2ZXJzZSAoc3RyaW5nLCBzdHJpbmdfbGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBwYXR0ZXJuX3BoX21hdGNoIChwc3BlYy0+cGF0dGVybiwgbWF0Y2hfbW9kZSwgdG1wLCAmZHVtbXkpOworICAgICAgICBnX2ZyZWUgKHRtcCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgY2FzZSBNQVRDSF9IRUFEOgorICAgICAgaWYgKHBzcGVjLT5wYXR0ZXJuX2xlbmd0aCA9PSBzdHJpbmdfbGVuZ3RoKQorICAgICAgICByZXR1cm4gbWVtY21wIChwc3BlYy0+cGF0dGVybiwgc3RyaW5nLCBzdHJpbmdfbGVuZ3RoKSA9PSAwOworICAgICAgZWxzZSBpZiAocHNwZWMtPnBhdHRlcm5fbGVuZ3RoKQorICAgICAgICByZXR1cm4gbWVtY21wIChwc3BlYy0+cGF0dGVybiwgc3RyaW5nLCBwc3BlYy0+cGF0dGVybl9sZW5ndGgpID09IDA7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgTUFUQ0hfVEFJTDoKKyAgICAgIGlmIChwc3BlYy0+cGF0dGVybl9sZW5ndGgpCisgICAgICAgIC8qIGNvbXBhcmUgaW5jbC4gTlVMIHRlcm1pbmF0b3IgKi8KKyAgICAgICAgcmV0dXJuIG1lbWNtcCAocHNwZWMtPnBhdHRlcm4sCisgICAgICAgICAgICBzdHJpbmcgKyAoc3RyaW5nX2xlbmd0aCAtIHBzcGVjLT5wYXR0ZXJuX2xlbmd0aCksCisgICAgICAgICAgICBwc3BlYy0+cGF0dGVybl9sZW5ndGggKyAxKSA9PSAwOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICBjYXNlIE1BVENIX0VYQUNUOgorICAgICAgaWYgKHBzcGVjLT5wYXR0ZXJuX2xlbmd0aCAhPSBzdHJpbmdfbGVuZ3RoKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBtZW1jbXAgKHBzcGVjLT5wYXR0ZXJuLCBzdHJpbmcsIHN0cmluZ19sZW5ndGgpID09IDA7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChwc3BlYy0+bWF0Y2hfdHlwZSA8IE1BVENIX0xBU1QsIEZBTFNFKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitQYXR0ZXJuU3BlYyAqCitwYXR0ZXJuX3NwZWNfbmV3IChjb25zdCBnY2hhciAqIHBhdHRlcm4sIE1hdGNoTW9kZSBtYXRjaF9tb2RlKQoreworICBQYXR0ZXJuU3BlYyAqcHNwZWM7CisgIGdib29sZWFuIHNlZW5fam9rZXIgPSBGQUxTRSwgc2Vlbl93aWxkY2FyZCA9IEZBTFNFLCBtb3JlX3dpbGRjYXJkcyA9IEZBTFNFOworICBnaW50IGh3X3BvcyA9IC0xLCB0d19wb3MgPSAtMSwgaGpfcG9zID0gLTEsIHRqX3BvcyA9IC0xOworICBnYm9vbGVhbiBmb2xsb3dzX3dpbGRjYXJkID0gRkFMU0U7CisgIGd1aW50IHBlbmRpbmdfam9rZXJzID0gMDsKKyAgY29uc3QgZ2NoYXIgKnM7CisgIGdjaGFyICpkOworICBndWludCBpOworCisgIGdfYXNzZXJ0IChwYXR0ZXJuICE9IE5VTEwpOworICBnX2Fzc2VydCAobWF0Y2hfbW9kZSAhPSBNQVRDSF9NT0RFX1VURjgKKyAgICAgIHx8IGdfdXRmOF92YWxpZGF0ZSAocGF0dGVybiwgLTEsIE5VTEwpKTsKKworICAvKiBjYW5vbmljYWxpemUgcGF0dGVybiBhbmQgY29sbGVjdCBuZWNlc3Nhcnkgc3RhdHMgKi8KKyAgcHNwZWMgPSBnX25ldyAoUGF0dGVyblNwZWMsIDEpOworICBwc3BlYy0+bWF0Y2hfbW9kZSA9IG1hdGNoX21vZGU7CisgIHBzcGVjLT5wYXR0ZXJuX2xlbmd0aCA9IHN0cmxlbiAocGF0dGVybik7CisgIHBzcGVjLT5taW5fbGVuZ3RoID0gMDsKKyAgcHNwZWMtPm1heF9sZW5ndGggPSAwOworICBwc3BlYy0+cGF0dGVybiA9IGdfbmV3IChnY2hhciwgcHNwZWMtPnBhdHRlcm5fbGVuZ3RoICsgMSk7CisKKyAgaWYgKHBzcGVjLT5tYXRjaF9tb2RlID09IE1BVENIX01PREVfQVVUTykgeworICAgIGlmICghZ191dGY4X3ZhbGlkYXRlIChwYXR0ZXJuLCAtMSwgTlVMTCkpCisgICAgICBwc3BlYy0+bWF0Y2hfbW9kZSA9IE1BVENIX01PREVfUkFXOworICB9CisKKyAgZCA9IHBzcGVjLT5wYXR0ZXJuOworICBmb3IgKGkgPSAwLCBzID0gcGF0dGVybjsgKnMgIT0gMDsgcysrKSB7CisgICAgc3dpdGNoICgqcykgeworICAgICAgY2FzZSAnKic6CisgICAgICAgIGlmIChmb2xsb3dzX3dpbGRjYXJkKSB7IC8qIGNvbXByZXNzIG11bHRpcGxlIHdpbGRjYXJkcyAqLworICAgICAgICAgIHBzcGVjLT5wYXR0ZXJuX2xlbmd0aC0tOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvbGxvd3Nfd2lsZGNhcmQgPSBUUlVFOworICAgICAgICBpZiAoaHdfcG9zIDwgMCkKKyAgICAgICAgICBod19wb3MgPSBpOworICAgICAgICB0d19wb3MgPSBpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJz8nOgorICAgICAgICBwZW5kaW5nX2pva2VycysrOworICAgICAgICBwc3BlYy0+bWluX2xlbmd0aCsrOworICAgICAgICBpZiAocHNwZWMtPm1hdGNoX21vZGUgPT0gTUFUQ0hfTU9ERV9SQVcpIHsKKyAgICAgICAgICBwc3BlYy0+bWF4X2xlbmd0aCArPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBzcGVjLT5tYXhfbGVuZ3RoICs9IDQ7ICAgICAgIC8qIG1heGltdW0gVVRGLTggY2hhcmFjdGVyIGxlbmd0aCAqLworICAgICAgICB9CisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZm9yICg7IHBlbmRpbmdfam9rZXJzOyBwZW5kaW5nX2pva2Vycy0tLCBpKyspIHsKKyAgICAgICAgICAqZCsrID0gJz8nOworICAgICAgICAgIGlmIChoal9wb3MgPCAwKQorICAgICAgICAgICAgaGpfcG9zID0gaTsKKyAgICAgICAgICB0al9wb3MgPSBpOworICAgICAgICB9CisgICAgICAgIGZvbGxvd3Nfd2lsZGNhcmQgPSBGQUxTRTsKKyAgICAgICAgcHNwZWMtPm1pbl9sZW5ndGgrKzsKKyAgICAgICAgcHNwZWMtPm1heF9sZW5ndGgrKzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICpkKysgPSAqczsKKyAgICBpKys7CisgIH0KKyAgZm9yICg7IHBlbmRpbmdfam9rZXJzOyBwZW5kaW5nX2pva2Vycy0tKSB7CisgICAgKmQrKyA9ICc/JzsKKyAgICBpZiAoaGpfcG9zIDwgMCkKKyAgICAgIGhqX3BvcyA9IGk7CisgICAgdGpfcG9zID0gaTsKKyAgfQorICAqZCsrID0gMDsKKyAgc2Vlbl9qb2tlciA9IGhqX3BvcyA+PSAwOworICBzZWVuX3dpbGRjYXJkID0gaHdfcG9zID49IDA7CisgIG1vcmVfd2lsZGNhcmRzID0gc2Vlbl93aWxkY2FyZCAmJiBod19wb3MgIT0gdHdfcG9zOworICBpZiAoc2Vlbl93aWxkY2FyZCkKKyAgICBwc3BlYy0+bWF4X2xlbmd0aCA9IEdfTUFYVUlOVDsKKworICAvKiBzcGVjaWFsIGNhc2Ugc29sZSBoZWFkL3RhaWwgd2lsZGNhcmQgb3IgZXhhY3QgbWF0Y2hlcyAqLworICBpZiAoIXNlZW5fam9rZXIgJiYgIW1vcmVfd2lsZGNhcmRzKSB7CisgICAgaWYgKHBzcGVjLT5wYXR0ZXJuWzBdID09ICcqJykgeworICAgICAgcHNwZWMtPm1hdGNoX3R5cGUgPSBNQVRDSF9UQUlMOworICAgICAgbWVtbW92ZSAocHNwZWMtPnBhdHRlcm4sIHBzcGVjLT5wYXR0ZXJuICsgMSwgLS1wc3BlYy0+cGF0dGVybl9sZW5ndGgpOworICAgICAgcHNwZWMtPnBhdHRlcm5bcHNwZWMtPnBhdHRlcm5fbGVuZ3RoXSA9IDA7CisgICAgICByZXR1cm4gcHNwZWM7CisgICAgfQorICAgIGlmIChwc3BlYy0+cGF0dGVybl9sZW5ndGggPiAwICYmCisgICAgICAgIHBzcGVjLT5wYXR0ZXJuW3BzcGVjLT5wYXR0ZXJuX2xlbmd0aCAtIDFdID09ICcqJykgeworICAgICAgcHNwZWMtPm1hdGNoX3R5cGUgPSBNQVRDSF9IRUFEOworICAgICAgcHNwZWMtPnBhdHRlcm5bLS1wc3BlYy0+cGF0dGVybl9sZW5ndGhdID0gMDsKKyAgICAgIHJldHVybiBwc3BlYzsKKyAgICB9CisgICAgaWYgKCFzZWVuX3dpbGRjYXJkKSB7CisgICAgICBwc3BlYy0+bWF0Y2hfdHlwZSA9IE1BVENIX0VYQUNUOworICAgICAgcmV0dXJuIHBzcGVjOworICAgIH0KKyAgfQorCisgIC8qIG5vdyBqdXN0IG5lZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBoZWFkIG9yIHRhaWwgbWF0Y2ggc3RhcnQgKi8KKyAgdHdfcG9zID0gcHNwZWMtPnBhdHRlcm5fbGVuZ3RoIC0gMSAtIHR3X3BvczsgIC8qIGxhc3QgcG9zIHRvIHRhaWwgZGlzdGFuY2UgKi8KKyAgdGpfcG9zID0gcHNwZWMtPnBhdHRlcm5fbGVuZ3RoIC0gMSAtIHRqX3BvczsgIC8qIGxhc3QgcG9zIHRvIHRhaWwgZGlzdGFuY2UgKi8KKyAgaWYgKHNlZW5fd2lsZGNhcmQpCisgICAgcHNwZWMtPm1hdGNoX3R5cGUgPSB0d19wb3MgPiBod19wb3MgPyBNQVRDSF9BTExfVEFJTCA6IE1BVENIX0FMTDsKKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2Vlbl9qb2tlciAqLworICAgIHBzcGVjLT5tYXRjaF90eXBlID0gdGpfcG9zID4gaGpfcG9zID8gTUFUQ0hfQUxMX1RBSUwgOiBNQVRDSF9BTEw7CisgIGlmIChwc3BlYy0+bWF0Y2hfdHlwZSA9PSBNQVRDSF9BTExfVEFJTCkgeworICAgIGdjaGFyICp0bXAgPSBwc3BlYy0+cGF0dGVybjsKKworICAgIGlmIChwc3BlYy0+bWF0Y2hfbW9kZSA9PSBNQVRDSF9NT0RFX1JBVykgeworICAgICAgcHNwZWMtPnBhdHRlcm4gPSByYXdfc3RycmV2ZXJzZSAocHNwZWMtPnBhdHRlcm4sIHBzcGVjLT5wYXR0ZXJuX2xlbmd0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBzcGVjLT5wYXR0ZXJuID0KKyAgICAgICAgICBnX3V0Zjhfc3RycmV2ZXJzZSAocHNwZWMtPnBhdHRlcm4sIHBzcGVjLT5wYXR0ZXJuX2xlbmd0aCk7CisgICAgfQorICAgIGdfZnJlZSAodG1wKTsKKyAgfQorICByZXR1cm4gcHNwZWM7Cit9CisKK3ZvaWQKK3BhdHRlcm5fc3BlY19mcmVlIChQYXR0ZXJuU3BlYyAqIHBzcGVjKQoreworICBnX2Fzc2VydCAocHNwZWMgIT0gTlVMTCk7CisKKyAgZ19mcmVlIChwc3BlYy0+cGF0dGVybik7CisgIGdfZnJlZSAocHNwZWMpOworfQorCitnYm9vbGVhbgorcGF0dGVybl9tYXRjaF9zdHJpbmcgKFBhdHRlcm5TcGVjICogcHNwZWMsIGNvbnN0IGdjaGFyICogc3RyaW5nKQoreworICByZXR1cm4gcGF0dGVybl9tYXRjaCAocHNwZWMsIHN0cmxlbiAoc3RyaW5nKSwgc3RyaW5nLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvcGF0dGVybnNwZWMuaCBiL2dzdC9tdWx0aWZpbGUvcGF0dGVybnNwZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmI5YjQwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpZmlsZS9wYXR0ZXJuc3BlYy5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qIEdQYXR0ZXJuIGNvcHkgdGhhdCBzdXBwb3J0cyByYXcgKG5vbi11dGY4KSBtYXRjaGluZworICogYmFzZWQgb246IEdMSUIgLSBMaWJyYXJ5IG9mIHVzZWZ1bCByb3V0aW5lcyBmb3IgQyBwcm9ncmFtbWluZworICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsIDE5OTkgIFBldGVyIE1hdHRpcywgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19QQVRURVJOX1NQRUNfSF9fCisjZGVmaW5lIF9fUEFUVEVSTl9TUEVDX0hfXworCisjaW5jbHVkZSA8Z2xpYi5oPgorCitHX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgZW51bQoreworICBNQVRDSF9NT0RFX0FVVE8gPSAwLAorICBNQVRDSF9NT0RFX1VURjgsCisgIE1BVENIX01PREVfUkFXCit9IE1hdGNoTW9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgX1BhdHRlcm5TcGVjIFBhdHRlcm5TcGVjOworCitQYXR0ZXJuU3BlYyAqIHBhdHRlcm5fc3BlY19uZXcgICAgICAgKGNvbnN0IGdjaGFyICAqIHBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoTW9kZSAgICAgIG1hdGNoX21vZGUpOworCit2b2lkICAgICAgICAgIHBhdHRlcm5fc3BlY19mcmVlICAgICAgKFBhdHRlcm5TcGVjICAqIHBzcGVjKTsKKworZ2Jvb2xlYW4gICAgICBwYXR0ZXJuX21hdGNoX3N0cmluZyAgIChQYXR0ZXJuU3BlYyAgKiBwc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICogc3RyaW5nKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fUEFUVEVSTl9TUEVDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L211bHRpZmlsZS90ZXN0LXNwbGl0bXV4cGFydHJlYWRlci5jIGIvZ3N0L211bHRpZmlsZS90ZXN0LXNwbGl0bXV4cGFydHJlYWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NzU2YTYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbXVsdGlmaWxlL3Rlc3Qtc3BsaXRtdXhwYXJ0cmVhZGVyLmMKQEAgLTAsMCArMSwxMDQgQEAKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSAiZ3N0c3BsaXRtdXhwYXJ0cmVhZGVyLmgiCisjaW5jbHVkZSAiZ3N0c3BsaXRtdXhzcmMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX0VYVEVSTiAoc3BsaXRtdXhfZGVidWcpOworCitzdGF0aWMgY29uc3QgZ2NoYXIgKmNvbnN0IHBhdGggPSAib3V0MDAxLm1wNCI7CisKK3R5cGVkZWYgc3RydWN0IF9DdXN0b21EYXRhCit7CisgIEdzdFNwbGl0TXV4UGFydFJlYWRlciAqcmVhZGVyOworICBHTWFpbkxvb3AgKm1haW5fbG9vcDsKKyAgR3N0QnVzICpidXM7Cit9IEN1c3RvbURhdGE7CisKK3N0YXRpYyB2b2lkCitwYXJ0X3ByZXBhcmVkIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIpCit7CisgIGdfcHJpbnQgKCJQYXJ0IHByZXBhcmVkXG4iKTsKK30KKworc3RhdGljIGdib29sZWFuCitoYW5kbGVfbWVzc2FnZSAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbXNnLCBDdXN0b21EYXRhICogZGF0YSkKK3sKKyAgR0Vycm9yICplcnI7CisgIGdjaGFyICpkZWJ1Z19pbmZvOworCisgIHN3aXRjaCAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfRVJST1I6CisgICAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobXNnLCAmZXJyLCAmZGVidWdfaW5mbyk7CisgICAgICBnX3ByaW50ICgiRXJyb3IgcmVjZWl2ZWQgZnJvbSBlbGVtZW50ICVzOiAlc1xuIiwKKyAgICAgICAgICBHU1RfT0JKRUNUX05BTUUgKG1zZy0+c3JjKSwgZXJyLT5tZXNzYWdlKTsKKyAgICAgIGdfcHJpbnQgKCJEZWJ1Z2dpbmcgaW5mb3JtYXRpb246ICVzXG4iLCBkZWJ1Z19pbmZvID8gZGVidWdfaW5mbyA6ICJub25lIik7CisgICAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICAgIGdfZnJlZSAoZGVidWdfaW5mbyk7CisgICAgICBnX21haW5fbG9vcF9xdWl0IChkYXRhLT5tYWluX2xvb3ApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FT1M6CisgICAgICBnX3ByaW50ICgiRW5kLU9mLVN0cmVhbSByZWFjaGVkLlxuIik7CisgICAgICBnX21haW5fbG9vcF9xdWl0IChkYXRhLT5tYWluX2xvb3ApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorc3RhcnRfcmVhZGVyIChDdXN0b21EYXRhICogZGF0YSkKK3sKKyAgZ19wcmludCAoIlByZXBhcmluZyBwYXJ0IHJlYWRlciBmb3IgJXNcbiIsIHBhdGgpOworICBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfcHJlcGFyZSAoZGF0YS0+cmVhZGVyKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgR3N0UGFkICoKK2hhbmRsZV9nZXRfcGFkIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIsIEdzdFBhZCAqIHNyY19wYWQsCisgICAgQ3VzdG9tRGF0YSAqIGRhdGEpCit7CisgIC8qIENyZWF0ZSBhIGR1bW15IHRhcmdldCBwYWQgZm9yIHRoZSByZWFkZXIgKi8KKyAgR3N0UGFkICpuZXdfcGFkID0gZ19vYmplY3RfbmV3IChTUExJVE1VWF9UWVBFX1NSQ19QQUQsCisgICAgICAibmFtZSIsIEdTVF9QQURfTkFNRSAoc3JjX3BhZCksICJkaXJlY3Rpb24iLCBHU1RfUEFEX1NSQywgTlVMTCk7CisKKyAgZ19wcmludCAoIkNyZWF0aW5nIG5ldyBkdW1teSBwYWQgJXNcbiIsIEdTVF9QQURfTkFNRSAoc3JjX3BhZCkpOworCisgIHJldHVybiBuZXdfcGFkOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgQ3VzdG9tRGF0YSBkYXRhOworCisgIGdzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIGRhdGEubWFpbl9sb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisKKyAgZGF0YS5yZWFkZXIgPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX1NQTElUTVVYX1BBUlRfUkVBREVSLCBOVUxMKTsKKyAgZGF0YS5idXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChHU1RfRUxFTUVOVF9DQVNUIChkYXRhLnJlYWRlcikpOworCisgIC8qIExpc3RlbiBmb3IgYnVzIG1lc3NhZ2VzICovCisgIGdzdF9idXNfYWRkX3dhdGNoIChkYXRhLmJ1cywgKEdzdEJ1c0Z1bmMpIGhhbmRsZV9tZXNzYWdlLCAmZGF0YSk7CisKKyAgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NldF9sb2NhdGlvbiAoZGF0YS5yZWFkZXIsIHBhdGgpOworCisgIC8qIENvbm5lY3QgdG8gcHJlcGFyZSBzaWduYWwgKi8KKyAgZ19zaWduYWxfY29ubmVjdCAoZGF0YS5yZWFkZXIsICJwcmVwYXJlZCIsIChHQ2FsbGJhY2spIHBhcnRfcHJlcGFyZWQsICZkYXRhKTsKKyAgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NldF9jYWxsYmFja3MgKGRhdGEucmVhZGVyLCAmZGF0YSwKKyAgICAgIChHc3RTcGxpdE11eFBhcnRSZWFkZXJQYWRDYikgaGFuZGxlX2dldF9wYWQpOworCisgIGdfaWRsZV9hZGQgKChHU291cmNlRnVuYykgc3RhcnRfcmVhZGVyLCAmZGF0YSk7CisKKyAgLyogUnVuIG1haW5sb29wICovCisgIGdfbWFpbl9sb29wX3J1biAoZGF0YS5tYWluX2xvb3ApOworCisgIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl91bnByZXBhcmUgKGRhdGEucmVhZGVyKTsKKworICBnX21haW5fbG9vcF91bnJlZiAoZGF0YS5tYWluX2xvb3ApOworICBnc3Rfb2JqZWN0X3VucmVmIChkYXRhLmJ1cyk7CisgIGdfb2JqZWN0X3VucmVmIChkYXRhLnJlYWRlcik7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9nc3QvbXVsdGlwYXJ0L01ha2VmaWxlLmFtIGIvZ3N0L211bHRpcGFydC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzczMGU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpcGFydC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDggQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdG11bHRpcGFydC5sYQorCitsaWJnc3RtdWx0aXBhcnRfbGFfU09VUkNFUyA9IG11bHRpcGFydC5jIG11bHRpcGFydGRlbXV4LmMgbXVsdGlwYXJ0bXV4LmMKK2xpYmdzdG11bHRpcGFydF9sYV9DRkxBR1MgPSAkKEdTVF9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKQorbGliZ3N0bXVsdGlwYXJ0X2xhX0xJQkFERCA9ICQoR1NUX0xJQlMpICQoR1NUX0JBU0VfTElCUykKK2xpYmdzdG11bHRpcGFydF9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gbXVsdGlwYXJ0ZGVtdXguaCBtdWx0aXBhcnRtdXguaApkaWZmIC0tZ2l0IGEvZ3N0L211bHRpcGFydC9tZXNvbi5idWlsZCBiL2dzdC9tdWx0aXBhcnQvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFhY2E2MgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tdWx0aXBhcnQvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxMCBAQAorZ3N0bXVsdGlwYXJ0ID0gbGlicmFyeSgnZ3N0bXVsdGlwYXJ0JywKKyAgJ211bHRpcGFydC5jJywKKyAgJ211bHRpcGFydGRlbXV4LmMnLAorICAnbXVsdGlwYXJ0bXV4LmMnLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdGJhc2VfZGVwXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKZGlmZiAtLWdpdCBhL2dzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0LmMgYi9nc3QvbXVsdGlwYXJ0L211bHRpcGFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZjEwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbXVsdGlwYXJ0L211bHRpcGFydC5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJtdWx0aXBhcnRkZW11eC5oIgorI2luY2x1ZGUgIm11bHRpcGFydG11eC5oIgorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIGdzdF9tdWx0aXBhcnRfZGVtdXhfcGx1Z2luX2luaXQgKHBsdWdpbik7CisgIGdzdF9tdWx0aXBhcnRfbXV4X3BsdWdpbl9pbml0IChwbHVnaW4pOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgbXVsdGlwYXJ0LAorICAgICJtdWx0aXBhcnQgc3RyZWFtIG1hbmlwdWxhdGlvbiIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sIEdTVF9MSUNFTlNFLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmMgYi9nc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlNjdjMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYwpAQCAtMCwwICsxLDgxMCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA0IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogZ3N0bXVsdGlwYXJ0ZGVtdXguYzogbXVsdGlwYXJ0IHN0cmVhbSBkZW11eGVyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtbXVsdGlwYXJ0ZGVtdXgKKyAqIEBzZWVfYWxzbzogI0dzdE11bHRpcGFydE11eAorICoKKyAqIE11bHRpcGFydERlbXV4IHVzZXMgdGhlIENvbnRlbnQtdHlwZSBmaWVsZCBvZiBpbmNvbWluZyBidWZmZXJzIHRvIGRlbXV4IGFuZCAKKyAqIHB1c2ggZGF0YSB0byBkeW5hbWljIHNvdXJjZSBwYWRzLiBNb3N0IG9mIHRoZSB0aW1lIG11bHRpcGFydCBzdHJlYW1zIGFyZSAKKyAqIHNlcXVlbnRpYWwgSlBFRyBmcmFtZXMgZ2VuZXJhdGVkIGZyb20gYSBsaXZlIHNvdXJjZSBzdWNoIGFzIGEgbmV0d29yayBzb3VyY2UKKyAqIG9yIGEgY2FtZXJhLgorICoKKyAqIFRoZSBvdXRwdXQgYnVmZmVycyBvZiB0aGUgbXVsdGlwYXJ0ZGVtdXggdHlwaWNhbGx5IGhhdmUgbm8gdGltZXN0YW1wcyBhbmQgYXJlCisgKiB1c3VhbGx5IHBsYXllZCBhcyBmYXN0IGFzIHBvc3NpYmxlIChhdCB0aGUgcmF0ZSB0aGF0IHRoZSBzb3VyY2UgcHJvdmlkZXMgdGhlCisgKiBkYXRhKS4KKyAqCisgKiB0aGUgY29udGVudCBpbiBtdWx0aXBhcnQgZmlsZXMgaXMgc2VwYXJhdGVkIHdpdGggYSBib3VuZGFyeSBzdHJpbmcgdGhhdCBjYW4KKyAqIGJlIGNvbmZpZ3VyZWQgc3BlY2lmaWNhbGx5IHdpdGggdGhlICNHc3RNdWx0aXBhcnREZW11eDpib3VuZGFyeSBwcm9wZXJ0eQorICogb3RoZXJ3aXNlIGl0IHdpbGwgYmUgYXV0b2RldGVjdGVkLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5TYW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPS90bXAvdGVzdC5tdWx0aXBhcnQgISBtdWx0aXBhcnRkZW11eCAhIGltYWdlL2pwZWcsZnJhbWVyYXRlPVwoZnJhY3Rpb25cKTUvMSAhIGpwZWdwYXJzZSAhIGpwZWdkZWMgISB2aWRlb2NvbnZlcnQgISBhdXRvdmlkZW9zaW5rCisgKiBdfCBhIHNpbXBsZSBwaXBlbGluZSB0byBkZW11eCBhIG11bHRpcGFydCBmaWxlIG11eGVkIHdpdGggI0dzdE11bHRpcGFydE11eAorICogY29udGFpbmluZyBKUEVHIGZyYW1lcy4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAibXVsdGlwYXJ0ZGVtdXguaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X211bHRpcGFydF9kZW11eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfbXVsdGlwYXJ0X2RlbXV4X2RlYnVnCisKKyNkZWZpbmUgREVGQVVMVF9CT1VOREFSWQkJTlVMTAorI2RlZmluZSBERUZBVUxUX1NJTkdMRV9TVFJFQU0JRkFMU0UKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQk9VTkRBUlksCisgIFBST1BfU0lOR0xFX1NUUkVBTQorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIG11bHRpcGFydF9kZW11eF9zcmNfdGVtcGxhdGVfZmFjdG9yeSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyY18ldSIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9TT01FVElNRVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBtdWx0aXBhcnRfZGVtdXhfc2lua190ZW1wbGF0ZV9mYWN0b3J5ID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoIm11bHRpcGFydC94LW1peGVkLXJlcGxhY2UiKQorICAgICk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IGdjaGFyICprZXk7CisgIGNvbnN0IGdjaGFyICp2YWw7Cit9IEdzdE5hbWVzTWFwOworCisvKiBjb252ZXJ0IGZyb20gbWltZSB0eXBlcyB0byBnc3Qgc3RydWN0dXJlIG5hbWVzLiBBZGQgbW9yZSB3aGVuIG5lZWRlZC4gVGhlCisgKiBtaW1lLXR5cGUgaXMgc3RvcmVkIGFzIGxvd2VyY2FzZSAqLworc3RhdGljIGNvbnN0IEdzdE5hbWVzTWFwIGdzdG5hbWVzW10gPSB7CisgIC8qIFJGQyAyMDQ2IHNheXMgYXVkaW8vYmFzaWMgaXMgbXVsYXcsIG1vbm8sIDgwMDBIeiAqLworICB7ImF1ZGlvL2Jhc2ljIiwgImF1ZGlvL3gtbXVsYXcsIGNoYW5uZWxzPTEsIHJhdGU9ODAwMCJ9LAorICB7ImF1ZGlvL2c3MjYtMTYiLAorICAgICAgImF1ZGlvL3gtYWRwY20sIGJpdHJhdGU9MTYwMDAsIGxheW91dD1nNzI2LCBjaGFubmVscz0xLCByYXRlPTgwMDAifSwKKyAgeyJhdWRpby9nNzI2LTI0IiwKKyAgICAgICJhdWRpby94LWFkcGNtLCBiaXRyYXRlPTI0MDAwLCBsYXlvdXQ9ZzcyNiwgY2hhbm5lbHM9MSwgcmF0ZT04MDAwIn0sCisgIHsiYXVkaW8vZzcyNi0zMiIsCisgICAgICAiYXVkaW8veC1hZHBjbSwgYml0cmF0ZT0zMjAwMCwgbGF5b3V0PWc3MjYsIGNoYW5uZWxzPTEsIHJhdGU9ODAwMCJ9LAorICB7ImF1ZGlvL2c3MjYtNDAiLAorICAgICAgImF1ZGlvL3gtYWRwY20sIGJpdHJhdGU9NDAwMDAsIGxheW91dD1nNzI2LCBjaGFubmVscz0xLCByYXRlPTgwMDAifSwKKyAgLyogUGFuYXNvbmljIE5ldHdvcmsgQ2FtZXJhcyBub24tc3RhbmRhcmQgdHlwZXMgKi8KKyAgeyJhdWRpby9nNzI2IiwKKyAgICAgICJhdWRpby94LWFkcGNtLCBiaXRyYXRlPTMyMDAwLCBsYXlvdXQ9ZzcyNiwgY2hhbm5lbHM9MSwgcmF0ZT04MDAwIn0sCisgIHtOVUxMLCBOVUxMfQorfTsKKworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfbXVsdGlwYXJ0X2RlbXV4X2NoYWluIChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWYpOworc3RhdGljIGdib29sZWFuIGdzdF9tdWx0aXBhcnRfZGVtdXhfZXZlbnQgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X211bHRpcGFydF9kZW11eF9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKgorICAgIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgdm9pZCBnc3RfbXVsdGlwYXJ0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIHZvaWQgZ3N0X211bHRpcGFydF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aXBhcnRfZGVtdXhfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CisKKyNkZWZpbmUgZ3N0X211bHRpcGFydF9kZW11eF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RNdWx0aXBhcnREZW11eCwgZ3N0X211bHRpcGFydF9kZW11eCwgR1NUX1RZUEVfRUxFTUVOVCk7CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGlwYXJ0X2RlbXV4X2NsYXNzX2luaXQgKEdzdE11bHRpcGFydERlbXV4Q2xhc3MgKiBrbGFzcykKK3sKKyAgaW50IGk7CisKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X211bHRpcGFydF9kZW11eF9kaXNwb3NlOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfbXVsdGlwYXJ0X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X211bHRpcGFydF9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9CT1VOREFSWSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJib3VuZGFyeSIsICJCb3VuZGFyeSIsCisgICAgICAgICAgIlRoZSBib3VuZGFyeSBzdHJpbmcgc2VwYXJhdGluZyBkYXRhLCBhdXRvbWF0aWMgaWYgTlVMTCIsCisgICAgICAgICAgREVGQVVMVF9CT1VOREFSWSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RNdWx0aXBhcnREZW11eDpzaW5nbGUtc3RyZWFtOgorICAgKgorICAgKiBBc3N1bWUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBzdHJlYW0gd2hvc2UgY29udGVudC10eXBlIHdpbGwKKyAgICogbm90IGNoYW5nZSBhbmQgZW1pdCBuby1tb3JlLXBhZHMgYXMgc29vbiBhcyB0aGUgZmlyc3QgYm91bmRhcnkKKyAgICogY29udGVudCBpcyBwYXJzZWQsIGRlY29kZWQsIGFuZCBwYWRzIGFyZSBsaW5rZWQuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NJTkdMRV9TVFJFQU0sCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInNpbmdsZS1zdHJlYW0iLCAiU2luZ2xlIFN0cmVhbSIsCisgICAgICAgICAgIkFzc3VtZSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIHN0cmVhbSB3aG9zZSBjb250ZW50LXR5cGUgd2lsbCBub3QgY2hhbmdlIGFuZCBlbWl0IG5vLW1vcmUtcGFkcyBhcyBzb29uIGFzIHRoZSBmaXJzdCBib3VuZGFyeSBjb250ZW50IGlzIHBhcnNlZCwgZGVjb2RlZCwgYW5kIHBhZHMgYXJlIGxpbmtlZCIsCisgICAgICAgICAgREVGQVVMVF9TSU5HTEVfU1RSRUFNLCBHX1BBUkFNX1JFQURXUklURSkpOworCisgIC8qIHBvcHVsYXRlIGdzdCBuYW1lcyBhbmQgbWltZSB0eXBlcyBwYWlycyAqLworICBrbGFzcy0+Z3N0bmFtZXMgPSBnX2hhc2hfdGFibGVfbmV3IChnX3N0cl9oYXNoLCBnX3N0cl9lcXVhbCk7CisgIGZvciAoaSA9IDA7IGdzdG5hbWVzW2ldLmtleTsgaSsrKSB7CisgICAgZ19oYXNoX3RhYmxlX2luc2VydCAoa2xhc3MtPmdzdG5hbWVzLCAoZ3BvaW50ZXIpIGdzdG5hbWVzW2ldLmtleSwKKyAgICAgICAgKGdwb2ludGVyKSBnc3RuYW1lc1tpXS52YWwpOworICB9CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X211bHRpcGFydF9kZW11eF9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmbXVsdGlwYXJ0X2RlbXV4X3NpbmtfdGVtcGxhdGVfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJm11bHRpcGFydF9kZW11eF9zcmNfdGVtcGxhdGVfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJNdWx0aXBhcnQgZGVtdXhlciIsCisgICAgICAiQ29kZWMvRGVtdXhlciIsICJkZW11eCBtdWx0aXBhcnQgc3RyZWFtcyIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4sIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aXBhcnRfZGVtdXhfaW5pdCAoR3N0TXVsdGlwYXJ0RGVtdXggKiBtdWx0aXBhcnQpCit7CisgIC8qIGNyZWF0ZSB0aGUgc2luayBwYWQgKi8KKyAgbXVsdGlwYXJ0LT5zaW5rcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmbXVsdGlwYXJ0X2RlbXV4X3NpbmtfdGVtcGxhdGVfZmFjdG9yeSwKKyAgICAgICJzaW5rIik7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKG11bHRpcGFydCksIG11bHRpcGFydC0+c2lua3BhZCk7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChtdWx0aXBhcnQtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X211bHRpcGFydF9kZW11eF9jaGFpbikpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAobXVsdGlwYXJ0LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tdWx0aXBhcnRfZGVtdXhfZXZlbnQpKTsKKworICBtdWx0aXBhcnQtPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgIG11bHRpcGFydC0+Ym91bmRhcnkgPSBERUZBVUxUX0JPVU5EQVJZOworICBtdWx0aXBhcnQtPm1pbWVfdHlwZSA9IE5VTEw7CisgIG11bHRpcGFydC0+Y29udGVudF9sZW5ndGggPSAtMTsKKyAgbXVsdGlwYXJ0LT5oZWFkZXJfY29tcGxldGVkID0gRkFMU0U7CisgIG11bHRpcGFydC0+c2NhbnBvcyA9IDA7CisgIG11bHRpcGFydC0+c2luZ2xlU3RyZWFtID0gREVGQVVMVF9TSU5HTEVfU1RSRUFNOworICBtdWx0aXBhcnQtPmhhdmVfZ3JvdXBfaWQgPSBGQUxTRTsKKyAgbXVsdGlwYXJ0LT5ncm91cF9pZCA9IEdfTUFYVUlOVDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aXBhcnRfZGVtdXhfcmVtb3ZlX3NyY19wYWRzIChHc3RNdWx0aXBhcnREZW11eCAqIGRlbXV4KQoreworICB3aGlsZSAoZGVtdXgtPnNyY3BhZHMgIT0gTlVMTCkgeworICAgIEdzdE11bHRpcGFydFBhZCAqbXBwYWQgPSBkZW11eC0+c3JjcGFkcy0+ZGF0YTsKKworICAgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKEdTVF9FTEVNRU5UIChkZW11eCksIG1wcGFkLT5wYWQpOworICAgIGdfZnJlZSAobXBwYWQtPm1pbWUpOworICAgIGdfZnJlZSAobXBwYWQpOworICAgIGRlbXV4LT5zcmNwYWRzID0gZ19zbGlzdF9kZWxldGVfbGluayAoZGVtdXgtPnNyY3BhZHMsIGRlbXV4LT5zcmNwYWRzKTsKKyAgfQorICBkZW11eC0+c3JjcGFkcyA9IE5VTEw7CisgIGRlbXV4LT5udW1wYWRzID0gMDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aXBhcnRfZGVtdXhfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0TXVsdGlwYXJ0RGVtdXggKmRlbXV4ID0gR1NUX01VTFRJUEFSVF9ERU1VWCAob2JqZWN0KTsKKworICBpZiAoZGVtdXgtPmFkYXB0ZXIgIT0gTlVMTCkKKyAgICBnX29iamVjdF91bnJlZiAoZGVtdXgtPmFkYXB0ZXIpOworICBkZW11eC0+YWRhcHRlciA9IE5VTEw7CisgIGdfZnJlZSAoZGVtdXgtPmJvdW5kYXJ5KTsKKyAgZGVtdXgtPmJvdW5kYXJ5ID0gTlVMTDsKKyAgZ19mcmVlIChkZW11eC0+bWltZV90eXBlKTsKKyAgZGVtdXgtPm1pbWVfdHlwZSA9IE5VTEw7CisgIGdzdF9tdWx0aXBhcnRfZGVtdXhfcmVtb3ZlX3NyY19wYWRzIChkZW11eCk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqCitnc3RfbXVsdGlwYXJ0X2RlbXV4X2dldF9nc3RuYW1lIChHc3RNdWx0aXBhcnREZW11eCAqIGRlbXV4LCBnY2hhciAqIG1pbWV0eXBlKQoreworICBHc3RNdWx0aXBhcnREZW11eENsYXNzICprbGFzczsKKyAgY29uc3QgZ2NoYXIgKmdzdG5hbWU7CisKKyAga2xhc3MgPSBHU1RfTVVMVElQQVJUX0RFTVVYX0dFVF9DTEFTUyAoZGVtdXgpOworCisgIC8qIHVzZSBoYXNodGFibGUgdG8gY29udmVydCB0byBnc3QgbmFtZSAqLworICBnc3RuYW1lID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAoa2xhc3MtPmdzdG5hbWVzLCBtaW1ldHlwZSk7CisgIGlmIChnc3RuYW1lID09IE5VTEwpIHsKKyAgICAvKiBubyBnc3QgbmFtZSBtYXBwaW5nLCB1c2UgbWltZSB0eXBlICovCisgICAgZ3N0bmFtZSA9IG1pbWV0eXBlOworICB9CisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZ3N0IG5hbWUgZm9yICVzIGlzICVzIiwgbWltZXR5cGUsIGdzdG5hbWUpOworICByZXR1cm4gZ3N0bmFtZTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tdWx0aXBhcnRfY29tYmluZV9mbG93cyAoR3N0TXVsdGlwYXJ0RGVtdXggKiBkZW11eCwgR3N0TXVsdGlwYXJ0UGFkICogcGFkLAorICAgIEdzdEZsb3dSZXR1cm4gcmV0KQoreworICBHU0xpc3QgKndhbGs7CisKKyAgLyogc3RvcmUgdGhlIHZhbHVlICovCisgIHBhZC0+bGFzdF9yZXQgPSByZXQ7CisKKyAgLyogYW55IG90aGVyIGVycm9yIHRoYXQgaXMgbm90LWxpbmtlZCBjYW4gYmUgcmV0dXJuZWQgcmlnaHQKKyAgICogYXdheSAqLworICBpZiAocmV0ICE9IEdTVF9GTE9XX05PVF9MSU5LRUQpCisgICAgZ290byBkb25lOworCisgIC8qIG9ubHkgcmV0dXJuIE5PVF9MSU5LRUQgaWYgYWxsIG90aGVyIHBhZHMgcmV0dXJuZWQgTk9UX0xJTktFRCAqLworICBmb3IgKHdhbGsgPSBkZW11eC0+c3JjcGFkczsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RNdWx0aXBhcnRQYWQgKm9wYWQgPSAoR3N0TXVsdGlwYXJ0UGFkICopIHdhbGstPmRhdGE7CisKKyAgICByZXQgPSBvcGFkLT5sYXN0X3JldDsKKyAgICAvKiBzb21lIG90aGVyIHJldHVybiB2YWx1ZSAobXVzdCBiZSBTVUNDRVNTIGJ1dCB3ZSBjYW4gcmV0dXJuCisgICAgICogb3RoZXIgdmFsdWVzIGFzIHdlbGwpICovCisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19OT1RfTElOS0VEKQorICAgICAgZ290byBkb25lOworICB9CisgIC8qIGlmIHdlIGdldCBoZXJlLCBhbGwgb3RoZXIgcGFkcyB3ZXJlIHVubGlua2VkIGFuZCB3ZSByZXR1cm4KKyAgICogTk9UX0xJTktFRCB0aGVuICovCitkb25lOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0TXVsdGlwYXJ0UGFkICoKK2dzdF9tdWx0aXBhcnRfZmluZF9wYWRfYnlfbWltZSAoR3N0TXVsdGlwYXJ0RGVtdXggKiBkZW11eCwgZ2NoYXIgKiBtaW1lLAorICAgIGdib29sZWFuICogY3JlYXRlZCkKK3sKKyAgR1NMaXN0ICp3YWxrOworCisgIHdhbGsgPSBkZW11eC0+c3JjcGFkczsKKyAgd2hpbGUgKHdhbGspIHsKKyAgICBHc3RNdWx0aXBhcnRQYWQgKnBhZCA9IChHc3RNdWx0aXBhcnRQYWQgKikgd2Fsay0+ZGF0YTsKKworICAgIGlmICghc3RyY21wIChwYWQtPm1pbWUsIG1pbWUpKSB7CisgICAgICBpZiAoY3JlYXRlZCkgeworICAgICAgICAqY3JlYXRlZCA9IEZBTFNFOworICAgICAgfQorICAgICAgcmV0dXJuIHBhZDsKKyAgICB9CisKKyAgICB3YWxrID0gd2Fsay0+bmV4dDsKKyAgfQorICAvKiBwYWQgbm90IGZvdW5kLCBjcmVhdGUgaXQgKi8KKyAgeworICAgIEdzdFBhZCAqcGFkOworICAgIEdzdE11bHRpcGFydFBhZCAqbXBwYWQ7CisgICAgZ2NoYXIgKm5hbWU7CisgICAgY29uc3QgZ2NoYXIgKmNhcHNuYW1lOworICAgIEdzdENhcHMgKmNhcHM7CisgICAgZ2NoYXIgKnN0cmVhbV9pZDsKKyAgICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgICBtcHBhZCA9IGdfbmV3MCAoR3N0TXVsdGlwYXJ0UGFkLCAxKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiY3JlYXRpbmcgcGFkIHdpdGggbWltZTogJXMiLCBtaW1lKTsKKworICAgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzcmNfJXUiLCBkZW11eC0+bnVtcGFkcyk7CisgICAgcGFkID0KKyAgICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZtdWx0aXBhcnRfZGVtdXhfc3JjX3RlbXBsYXRlX2ZhY3RvcnksCisgICAgICAgIG5hbWUpOworICAgIGdfZnJlZSAobmFtZSk7CisKKyAgICBtcHBhZC0+cGFkID0gcGFkOworICAgIG1wcGFkLT5taW1lID0gZ19zdHJkdXAgKG1pbWUpOworICAgIG1wcGFkLT5sYXN0X3JldCA9IEdTVF9GTE9XX09LOworICAgIG1wcGFkLT5sYXN0X3RzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICBtcHBhZC0+ZGlzY29udCA9IFRSVUU7CisKKyAgICBkZW11eC0+c3JjcGFkcyA9IGdfc2xpc3RfcHJlcGVuZCAoZGVtdXgtPnNyY3BhZHMsIG1wcGFkKTsKKyAgICBkZW11eC0+bnVtcGFkcysrOworCisgICAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAocGFkKTsKKyAgICBnc3RfcGFkX3NldF9hY3RpdmUgKHBhZCwgVFJVRSk7CisKKyAgICAvKiBwcmVwYXJlIGFuZCBzZW5kIHN0cmVhbS1zdGFydCAqLworICAgIGlmICghZGVtdXgtPmhhdmVfZ3JvdXBfaWQpIHsKKyAgICAgIGV2ZW50ID0gZ3N0X3BhZF9nZXRfc3RpY2t5X2V2ZW50IChkZW11eC0+c2lua3BhZCwKKyAgICAgICAgICBHU1RfRVZFTlRfU1RSRUFNX1NUQVJULCAwKTsKKworICAgICAgaWYgKGV2ZW50KSB7CisgICAgICAgIGRlbXV4LT5oYXZlX2dyb3VwX2lkID0KKyAgICAgICAgICAgIGdzdF9ldmVudF9wYXJzZV9ncm91cF9pZCAoZXZlbnQsICZkZW11eC0+Z3JvdXBfaWQpOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIH0gZWxzZSBpZiAoIWRlbXV4LT5oYXZlX2dyb3VwX2lkKSB7CisgICAgICAgIGRlbXV4LT5oYXZlX2dyb3VwX2lkID0gVFJVRTsKKyAgICAgICAgZGVtdXgtPmdyb3VwX2lkID0gZ3N0X3V0aWxfZ3JvdXBfaWRfbmV4dCAoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdHJlYW1faWQgPSBnc3RfcGFkX2NyZWF0ZV9zdHJlYW1faWQgKHBhZCwKKyAgICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCBkZW11eC0+bWltZV90eXBlKTsKKworICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKHN0cmVhbV9pZCk7CisgICAgaWYgKGRlbXV4LT5oYXZlX2dyb3VwX2lkKQorICAgICAgZ3N0X2V2ZW50X3NldF9ncm91cF9pZCAoZXZlbnQsIGRlbXV4LT5ncm91cF9pZCk7CisKKyAgICBnc3RfcGFkX3N0b3JlX3N0aWNreV9ldmVudCAocGFkLCBldmVudCk7CisgICAgZ19mcmVlIChzdHJlYW1faWQpOworICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworCisgICAgLyogdGFrZSB0aGUgbWltZSB0eXBlLCBjb252ZXJ0IGl0IHRvIHRoZSBjYXBzIG5hbWUgKi8KKyAgICBjYXBzbmFtZSA9IGdzdF9tdWx0aXBhcnRfZGVtdXhfZ2V0X2dzdG5hbWUgKGRlbXV4LCBtaW1lKTsKKyAgICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKGNhcHNuYW1lKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImNhcHMgZm9yIHBhZDogJXMiLCBjYXBzbmFtZSk7CisgICAgZ3N0X3BhZF9zZXRfY2FwcyAocGFkLCBjYXBzKTsKKyAgICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChkZW11eCksIHBhZCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgaWYgKGNyZWF0ZWQpIHsKKyAgICAgICpjcmVhdGVkID0gVFJVRTsKKyAgICB9CisKKyAgICBpZiAoZGVtdXgtPnNpbmdsZVN0cmVhbSkgeworICAgICAgZ3N0X2VsZW1lbnRfbm9fbW9yZV9wYWRzIChHU1RfRUxFTUVOVF9DQVNUIChkZW11eCkpOworICAgIH0KKworICAgIHJldHVybiBtcHBhZDsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dldF9saW5lX2VuZCAoY29uc3QgZ3VpbnQ4ICogZGF0YSwgY29uc3QgZ3VpbnQ4ICogZGF0YWVuZCwgZ3VpbnQ4ICoqIGVuZCwKKyAgICBndWludDggKiogbmV4dCkKK3sKKyAgZ3VpbnQ4ICp4OworICBnYm9vbGVhbiBmb3VuZHIgPSBGQUxTRTsKKworICBmb3IgKHggPSAoZ3VpbnQ4ICopIGRhdGE7IHggPCBkYXRhZW5kOyB4KyspIHsKKyAgICBpZiAoKnggPT0gJ1xyJykgeworICAgICAgZm91bmRyID0gVFJVRTsKKyAgICB9IGVsc2UgaWYgKCp4ID09ICdcbicpIHsKKyAgICAgICplbmQgPSB4IC0gKGZvdW5kciA/IDEgOiAwKTsKKyAgICAgICpuZXh0ID0geCArIDE7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZ3VpbnQKK2dldF9taW1lX2xlbiAoY29uc3QgZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgbWF4bGVuKQoreworICBndWludDggKng7CisKKyAgeCA9IChndWludDggKikgZGF0YTsKKyAgd2hpbGUgKCp4ICE9ICdcMCcgJiYgKnggIT0gJ1xyJyAmJiAqeCAhPSAnXG4nICYmICp4ICE9ICc7JykgeworICAgIHgrKzsKKyAgfQorICByZXR1cm4geCAtIGRhdGE7Cit9CisKK3N0YXRpYyBnaW50CittdWx0aXBhcnRfcGFyc2VfaGVhZGVyIChHc3RNdWx0aXBhcnREZW11eCAqIG11bHRpcGFydCkKK3sKKyAgY29uc3QgZ3VpbnQ4ICpkYXRhOworICBjb25zdCBndWludDggKmRhdGFlbmQ7CisgIGdjaGFyICpib3VuZGFyeTsKKyAgaW50IGJvdW5kYXJ5X2xlbjsKKyAgaW50IGRhdGFsZW47CisgIGd1aW50OCAqcG9zOworICBndWludDggKmVuZCwgKm5leHQ7CisKKyAgZGF0YWxlbiA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAobXVsdGlwYXJ0LT5hZGFwdGVyKTsKKyAgZGF0YSA9IGdzdF9hZGFwdGVyX21hcCAobXVsdGlwYXJ0LT5hZGFwdGVyLCBkYXRhbGVuKTsKKyAgZGF0YWVuZCA9IGRhdGEgKyBkYXRhbGVuOworCisgIC8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlLCBwb3MgZW5kcG9zaXRpb24gc2hvdWxkIGF0IGxlYXN0IGxlYXZlIHNwYWNlIGZvcgorICAgKiB0aGUgYm91bmRhcnkgYW5kIGEgXG4gKi8KKyAgZm9yIChwb3MgPSAoZ3VpbnQ4ICopIGRhdGE7IHBvcyA8IGRhdGFlbmQgLSA0ICYmIGdfYXNjaWlfaXNzcGFjZSAoKnBvcyk7CisgICAgICBwb3MrKyk7CisKKyAgaWYgKHBvcyA+PSBkYXRhZW5kIC0gNCkKKyAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworCisgIGlmIChHX1VOTElLRUxZIChwb3NbMF0gIT0gJy0nIHx8IHBvc1sxXSAhPSAnLScpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAobXVsdGlwYXJ0LCAiTm8gYm91bmRhcnkgYXZhaWxhYmxlIik7CisgICAgZ290byB3cm9uZ19oZWFkZXI7CisgIH0KKworICAvKiBGaXJzdCB0aGUgYm91bmRhcnkgKi8KKyAgaWYgKCFnZXRfbGluZV9lbmQgKHBvcywgZGF0YWVuZCwgJmVuZCwgJm5leHQpKQorICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisKKyAgLyogSWdub3JlIHRoZSBsZWFkaW5nIC0tICovCisgIGJvdW5kYXJ5X2xlbiA9IGVuZCAtIHBvcyAtIDI7CisgIGJvdW5kYXJ5ID0gKGdjaGFyICopIHBvcyArIDI7CisgIGlmIChib3VuZGFyeV9sZW4gPCAxKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAobXVsdGlwYXJ0LCAiTm8gYm91bmRhcnkgYXZhaWxhYmxlIik7CisgICAgZ290byB3cm9uZ19oZWFkZXI7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAobXVsdGlwYXJ0LT5ib3VuZGFyeSA9PSBOVUxMKSkgeworICAgIC8qIEZpcnN0IHRpbWUgd2Ugc2VlIHRoZSBib3VuZGFyeSwgY29weSBpdCAqLworICAgIG11bHRpcGFydC0+Ym91bmRhcnkgPSBnX3N0cm5kdXAgKGJvdW5kYXJ5LCBib3VuZGFyeV9sZW4pOworICAgIG11bHRpcGFydC0+Ym91bmRhcnlfbGVuID0gYm91bmRhcnlfbGVuOworICB9IGVsc2UgaWYgKEdfVU5MSUtFTFkgKGJvdW5kYXJ5X2xlbiAhPSBtdWx0aXBhcnQtPmJvdW5kYXJ5X2xlbikpIHsKKyAgICAvKiBTb21ldGhpbmcgb2RkIGlzIGdvaW5nIG9uLCBlaXRoZXIgdGhlIGJvdW5kYXJ5IGluZGljYXRlZCBFT1Mgb3IgaXQncworICAgICAqIGludmFsaWQgKi8KKyAgICBpZiAoR19VTkxJS0VMWSAoYm91bmRhcnlfbGVuID09IG11bHRpcGFydC0+Ym91bmRhcnlfbGVuICsgMiAmJgorICAgICAgICAgICAgIXN0cm5jbXAgKGJvdW5kYXJ5LCBtdWx0aXBhcnQtPmJvdW5kYXJ5LCBtdWx0aXBhcnQtPmJvdW5kYXJ5X2xlbikgJiYKKyAgICAgICAgICAgICFzdHJuY21wIChib3VuZGFyeSArIG11bHRpcGFydC0+Ym91bmRhcnlfbGVuLCAiLS0iLCAyKSkpCisgICAgICBnb3RvIGVvczsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11bHRpcGFydCwKKyAgICAgICAgIkJvdW5kYXJ5IGxlbmd0aCBkb2Vzbid0IG1hdGNoIGRldGVjdGVkIGJvdW5kYXJ5ICglZCA8PiAlZCIsCisgICAgICAgIGJvdW5kYXJ5X2xlbiwgbXVsdGlwYXJ0LT5ib3VuZGFyeV9sZW4pOworICAgIGdvdG8gd3JvbmdfaGVhZGVyOworICB9IGVsc2UgaWYgKEdfVU5MSUtFTFkgKHN0cm5jbXAgKGJvdW5kYXJ5LCBtdWx0aXBhcnQtPmJvdW5kYXJ5LCBib3VuZGFyeV9sZW4pKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11bHRpcGFydCwgIkJvdW5kYXJ5IGRvZXNuJ3QgbWF0Y2ggcHJldmlvdXMgYm91bmRhcnkiKTsKKyAgICBnb3RvIHdyb25nX2hlYWRlcjsKKyAgfQorCisgIHBvcyA9IG5leHQ7CisgIHdoaWxlIChnZXRfbGluZV9lbmQgKHBvcywgZGF0YWVuZCwgJmVuZCwgJm5leHQpKSB7CisgICAgZ3VpbnQgbGVuID0gZW5kIC0gcG9zOworCisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAvKiBlbXB0eSBsaW5lLCBkYXRhIHN0YXJ0cyBiZWhpbmQgdXMgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11bHRpcGFydCwKKyAgICAgICAgICAiUGFyc2VkIHRoZSBoZWFkZXIgLSBib3VuZGFyeTogJXMsIG1pbWUtdHlwZTogJXMsIGNvbnRlbnQtbGVuZ3RoOiAlZCIsCisgICAgICAgICAgbXVsdGlwYXJ0LT5ib3VuZGFyeSwgbXVsdGlwYXJ0LT5taW1lX3R5cGUsIG11bHRpcGFydC0+Y29udGVudF9sZW5ndGgpOworICAgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKG11bHRpcGFydC0+YWRhcHRlcik7CisgICAgICByZXR1cm4gbmV4dCAtIGRhdGE7CisgICAgfQorCisgICAgaWYgKGxlbiA+PSAxNCAmJiAhZ19hc2NpaV9zdHJuY2FzZWNtcCAoImNvbnRlbnQtdHlwZToiLCAoZ2NoYXIgKikgcG9zLCAxMykpIHsKKyAgICAgIGd1aW50IG1pbWVfbGVuOworCisgICAgICAvKiBvbmx5IHRha2UgdGhlIG1pbWUgdHlwZSB1cCB0byB0aGUgZmlyc3QgOyBpZiBhbnkuIEFmdGVyIDsgdGhlcmUgY2FuIGJlCisgICAgICAgKiBwcm9wZXJ0aWVzIHRoYXQgd2UgZG9uJ3QgaGFuZGxlIHlldC4gKi8KKyAgICAgIG1pbWVfbGVuID0gZ2V0X21pbWVfbGVuIChwb3MgKyAxNCwgbGVuIC0gMTQpOworCisgICAgICBnX2ZyZWUgKG11bHRpcGFydC0+bWltZV90eXBlKTsKKyAgICAgIG11bHRpcGFydC0+bWltZV90eXBlID0gZ19hc2NpaV9zdHJkb3duICgoZ2NoYXIgKikgcG9zICsgMTQsIG1pbWVfbGVuKTsKKyAgICB9IGVsc2UgaWYgKGxlbiA+PSAxNSAmJgorICAgICAgICAhZ19hc2NpaV9zdHJuY2FzZWNtcCAoImNvbnRlbnQtbGVuZ3RoOiIsIChnY2hhciAqKSBwb3MsIDE1KSkgeworICAgICAgbXVsdGlwYXJ0LT5jb250ZW50X2xlbmd0aCA9CisgICAgICAgICAgZ19hc2NpaV9zdHJ0b3VsbCAoKGdjaGFyICopIHBvcyArIDE1LCBOVUxMLCAxMCk7CisgICAgfQorICAgIHBvcyA9IG5leHQ7CisgIH0KKworbmVlZF9tb3JlX2RhdGE6CisgIEdTVF9ERUJVR19PQkpFQ1QgKG11bHRpcGFydCwgIk5lZWQgbW9yZSBkYXRhIGZvciB0aGUgaGVhZGVyIik7CisgIGdzdF9hZGFwdGVyX3VubWFwIChtdWx0aXBhcnQtPmFkYXB0ZXIpOworCisgIHJldHVybiBNVUxUSVBBUlRfTkVFRF9NT1JFX0RBVEE7CisKK3dyb25nX2hlYWRlcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtdWx0aXBhcnQsIFNUUkVBTSwgREVNVVgsIChOVUxMKSwKKyAgICAgICAgKCJCb3VuZGFyeSBub3QgZm91bmQgaW4gdGhlIG11bHRpcGFydCBoZWFkZXIiKSk7CisgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKG11bHRpcGFydC0+YWRhcHRlcik7CisgICAgcmV0dXJuIE1VTFRJUEFSVF9EQVRBX0VSUk9SOworICB9Citlb3M6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChtdWx0aXBhcnQsICJ3ZSBhcmUgRU9TIik7CisgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKG11bHRpcGFydC0+YWRhcHRlcik7CisgICAgcmV0dXJuIE1VTFRJUEFSVF9EQVRBX0VPUzsKKyAgfQorfQorCitzdGF0aWMgZ2ludAorbXVsdGlwYXJ0X2ZpbmRfYm91bmRhcnkgKEdzdE11bHRpcGFydERlbXV4ICogbXVsdGlwYXJ0LCBnaW50ICogZGF0YWxlbikKK3sKKyAgLyogQWRhcHRvciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgZGF0YSAqLworICBjb25zdCBndWludDggKmRhdGEsICpwb3M7CisgIGNvbnN0IGd1aW50OCAqZGF0YWVuZDsKKyAgZ2ludCBsZW47CisKKyAgaWYgKG11bHRpcGFydC0+Y29udGVudF9sZW5ndGggPj0gMCkgeworICAgIC8qIGZhc3QgcGF0aCwga25vd24gY29udGVudCBsZW5ndGggOikgKi8KKyAgICBsZW4gPSBtdWx0aXBhcnQtPmNvbnRlbnRfbGVuZ3RoOworICAgIGlmIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKG11bHRpcGFydC0+YWRhcHRlcikgPj0gbGVuICsgMikgeworICAgICAgKmRhdGFsZW4gPSBsZW47CisgICAgICBkYXRhID0gZ3N0X2FkYXB0ZXJfbWFwIChtdWx0aXBhcnQtPmFkYXB0ZXIsIGxlbiArIDEpOworCisgICAgICAvKiBJZiBkYXRhW2xlbl0gY29udGFpbnMgXHIgdGhlbiBhc3N1bWUgYSBuZXdsaW5lIGlzIFxyXG4gKi8KKyAgICAgIGlmIChkYXRhW2xlbl0gPT0gJ1xyJykKKyAgICAgICAgbGVuICs9IDI7CisgICAgICBlbHNlIGlmIChkYXRhW2xlbl0gPT0gJ1xuJykKKyAgICAgICAgbGVuICs9IDE7CisKKyAgICAgIGdzdF9hZGFwdGVyX3VubWFwIChtdWx0aXBhcnQtPmFkYXB0ZXIpOworICAgICAgLyogRG9uJ3QgY2hlY2sgaWYgYm91bmRhcnkgaXMgYWN0dWFsbHkgdGhlcmUsIGJ1dCBsZXQgdGhlIGhlYWRlciBwYXJzaW5nCisgICAgICAgKiBiYWlsIG91dCBpZiBpdCBpc24ndCAqLworICAgICAgcmV0dXJuIGxlbjsKKyAgICB9IGVsc2UgeworICAgICAgLyogbmVlZCBtb3JlIGRhdGEgKi8KKyAgICAgIHJldHVybiBNVUxUSVBBUlRfTkVFRF9NT1JFX0RBVEE7CisgICAgfQorICB9CisKKyAgbGVuID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChtdWx0aXBhcnQtPmFkYXB0ZXIpOworICBpZiAobGVuID09IDApCisgICAgcmV0dXJuIE1VTFRJUEFSVF9ORUVEX01PUkVfREFUQTsKKyAgZGF0YSA9IGdzdF9hZGFwdGVyX21hcCAobXVsdGlwYXJ0LT5hZGFwdGVyLCBsZW4pOworICBkYXRhZW5kID0gZGF0YSArIGxlbjsKKworICBmb3IgKHBvcyA9IGRhdGEgKyBtdWx0aXBhcnQtPnNjYW5wb3M7CisgICAgICBwb3MgPD0gZGF0YWVuZCAtIG11bHRpcGFydC0+Ym91bmRhcnlfbGVuIC0gMjsgcG9zKyspIHsKKyAgICBpZiAoKnBvcyA9PSAnLScgJiYgcG9zWzFdID09ICctJyAmJgorICAgICAgICAhc3RybmNtcCAoKGdjaGFyICopIHBvcyArIDIsCisgICAgICAgICAgICBtdWx0aXBhcnQtPmJvdW5kYXJ5LCBtdWx0aXBhcnQtPmJvdW5kYXJ5X2xlbikpIHsKKyAgICAgIC8qIEZvdW5kIHRoZSBib3VuZGFyeSEgQ2hlY2sgaWYgdGhlcmUgd2FzIGEgbmV3bGluZSBiZWZvcmUgdGhlIGJvdW5kYXJ5ICovCisgICAgICBsZW4gPSBwb3MgLSBkYXRhOworICAgICAgaWYgKHBvcyAtIDIgPiBkYXRhICYmIHBvc1stMl0gPT0gJ1xyJykKKyAgICAgICAgbGVuIC09IDI7CisgICAgICBlbHNlIGlmIChwb3MgLSAxID4gZGF0YSAmJiBwb3NbLTFdID09ICdcbicpCisgICAgICAgIGxlbiAtPSAxOworICAgICAgKmRhdGFsZW4gPSBsZW47CisKKyAgICAgIGdzdF9hZGFwdGVyX3VubWFwIChtdWx0aXBhcnQtPmFkYXB0ZXIpOworICAgICAgbXVsdGlwYXJ0LT5zY2FucG9zID0gMDsKKyAgICAgIHJldHVybiBwb3MgLSBkYXRhOworICAgIH0KKyAgfQorICBnc3RfYWRhcHRlcl91bm1hcCAobXVsdGlwYXJ0LT5hZGFwdGVyKTsKKyAgbXVsdGlwYXJ0LT5zY2FucG9zID0gcG9zIC0gZGF0YTsKKyAgcmV0dXJuIE1VTFRJUEFSVF9ORUVEX01PUkVfREFUQTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbXVsdGlwYXJ0X2RlbXV4X2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0TXVsdGlwYXJ0RGVtdXggKm11bHRpcGFydDsKKworICBtdWx0aXBhcnQgPSBHU1RfTVVMVElQQVJUX0RFTVVYIChwYXJlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgIGlmICghbXVsdGlwYXJ0LT5zcmNwYWRzKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtdWx0aXBhcnQsIFNUUkVBTSwgV1JPTkdfVFlQRSwKKyAgICAgICAgICAgICgiVGhpcyBzdHJlYW0gY29udGFpbnMgbm8gdmFsaWQgc3RyZWFtcy4iKSwKKyAgICAgICAgICAgICgiR290IEVPUyBiZWZvcmUgYWRkaW5nIGFueSBwYWRzIikpOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbXVsdGlwYXJ0X2RlbXV4X2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RNdWx0aXBhcnREZW11eCAqbXVsdGlwYXJ0OworICBHc3RBZGFwdGVyICphZGFwdGVyOworICBnaW50IHNpemUgPSAxOworICBHc3RGbG93UmV0dXJuIHJlczsKKworICBtdWx0aXBhcnQgPSBHU1RfTVVMVElQQVJUX0RFTVVYIChwYXJlbnQpOworICBhZGFwdGVyID0gbXVsdGlwYXJ0LT5hZGFwdGVyOworCisgIHJlcyA9IEdTVF9GTE9XX09LOworCisgIGlmIChHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKSkgeworICAgIEdTTGlzdCAqbDsKKworICAgIGZvciAobCA9IG11bHRpcGFydC0+c3JjcGFkczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgeworICAgICAgR3N0TXVsdGlwYXJ0UGFkICpzcmNwYWQgPSBsLT5kYXRhOworCisgICAgICBzcmNwYWQtPmRpc2NvbnQgPSBUUlVFOworICAgIH0KKyAgICBnc3RfYWRhcHRlcl9jbGVhciAoYWRhcHRlcik7CisgIH0KKyAgZ3N0X2FkYXB0ZXJfcHVzaCAoYWRhcHRlciwgYnVmKTsKKworICB3aGlsZSAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChhZGFwdGVyKSA+IDApIHsKKyAgICBHc3RNdWx0aXBhcnRQYWQgKnNyY3BhZDsKKyAgICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgICBnYm9vbGVhbiBjcmVhdGVkOworICAgIGdpbnQgZGF0YWxlbjsKKworICAgIGlmIChHX1VOTElLRUxZICghbXVsdGlwYXJ0LT5oZWFkZXJfY29tcGxldGVkKSkgeworICAgICAgaWYgKChzaXplID0gbXVsdGlwYXJ0X3BhcnNlX2hlYWRlciAobXVsdGlwYXJ0KSkgPCAwKSB7CisgICAgICAgIGdvdG8gbm9kYXRhOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGFkYXB0ZXIsIHNpemUpOworICAgICAgICBtdWx0aXBhcnQtPmhlYWRlcl9jb21wbGV0ZWQgPSBUUlVFOworICAgICAgfQorICAgIH0KKyAgICBpZiAoKHNpemUgPSBtdWx0aXBhcnRfZmluZF9ib3VuZGFyeSAobXVsdGlwYXJ0LCAmZGF0YWxlbikpIDwgMCkgeworICAgICAgZ290byBub2RhdGE7CisgICAgfQorCisgICAgLyogSW52YWxpZGF0ZSBoZWFkZXIgaW5mbyAqLworICAgIG11bHRpcGFydC0+aGVhZGVyX2NvbXBsZXRlZCA9IEZBTFNFOworICAgIG11bHRpcGFydC0+Y29udGVudF9sZW5ndGggPSAtMTsKKworICAgIGlmIChHX1VOTElLRUxZIChkYXRhbGVuIDw9IDApKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChtdWx0aXBhcnQsICJza2lwcGluZyBlbXB0eSBjb250ZW50LiIpOworICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGFkYXB0ZXIsIHNpemUgLSBkYXRhbGVuKTsKKyAgICB9IGVsc2UgaWYgKEdfVU5MSUtFTFkgKCFtdWx0aXBhcnQtPm1pbWVfdHlwZSkpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11bHRpcGFydCwgImNvbnRlbnQgaGFzIG5vIE1JTUUgdHlwZS4iKTsKKyAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChhZGFwdGVyLCBzaXplIC0gZGF0YWxlbik7CisgICAgfSBlbHNlIHsKKyAgICAgIEdzdENsb2NrVGltZSB0czsKKworICAgICAgc3JjcGFkID0KKyAgICAgICAgICBnc3RfbXVsdGlwYXJ0X2ZpbmRfcGFkX2J5X21pbWUgKG11bHRpcGFydCwKKyAgICAgICAgICBtdWx0aXBhcnQtPm1pbWVfdHlwZSwgJmNyZWF0ZWQpOworCisgICAgICB0cyA9IGdzdF9hZGFwdGVyX3ByZXZfcHRzIChhZGFwdGVyLCBOVUxMKTsKKyAgICAgIG91dGJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChhZGFwdGVyLCBkYXRhbGVuKTsKKyAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChhZGFwdGVyLCBzaXplIC0gZGF0YWxlbik7CisKKyAgICAgIGlmIChjcmVhdGVkKSB7CisgICAgICAgIEdzdFRhZ0xpc3QgKnRhZ3M7CisgICAgICAgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICAgICAgICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKworICAgICAgICAvKiBQdXNoIG5ldyBzZWdtZW50LCBmaXJzdCBidWZmZXIgaGFzIDAgdGltZXN0YW1wICovCisgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3JjcGFkLT5wYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKworICAgICAgICB0YWdzID0gZ3N0X3RhZ19saXN0X25ldyAoR1NUX1RBR19DT05UQUlORVJfRk9STUFULCAiTXVsdGlwYXJ0IiwgTlVMTCk7CisgICAgICAgIGdzdF90YWdfbGlzdF9zZXRfc2NvcGUgKHRhZ3MsIEdTVF9UQUdfU0NPUEVfR0xPQkFMKTsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzcmNwYWQtPnBhZCwgZ3N0X2V2ZW50X25ld190YWcgKHRhZ3MpKTsKKyAgICAgIH0KKworICAgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChvdXRidWYpOworICAgICAgaWYgKHNyY3BhZC0+bGFzdF90cyA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FIHx8IHNyY3BhZC0+bGFzdF90cyAhPSB0cykgeworICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSA9IHRzOworICAgICAgICBzcmNwYWQtPmxhc3RfdHMgPSB0czsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICAgIH0KKworICAgICAgaWYgKHNyY3BhZC0+ZGlzY29udCkgeworICAgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICAgICAgc3JjcGFkLT5kaXNjb250ID0gRkFMU0U7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfQlVGRkVSX0ZMQUdfVU5TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgICAgfQorCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChtdWx0aXBhcnQsCisgICAgICAgICAgInB1c2hpbmcgYnVmZmVyIHdpdGggdGltZXN0YW1wICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSkpOworICAgICAgcmVzID0gZ3N0X3BhZF9wdXNoIChzcmNwYWQtPnBhZCwgb3V0YnVmKTsKKyAgICAgIHJlcyA9IGdzdF9tdWx0aXBhcnRfY29tYmluZV9mbG93cyAobXVsdGlwYXJ0LCBzcmNwYWQsIHJlcyk7CisgICAgICBpZiAocmVzICE9IEdTVF9GTE9XX09LKQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworbm9kYXRhOgorICBpZiAoR19VTkxJS0VMWSAoc2l6ZSA9PSBNVUxUSVBBUlRfREFUQV9FUlJPUikpCisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICBpZiAoR19VTkxJS0VMWSAoc2l6ZSA9PSBNVUxUSVBBUlRfREFUQV9FT1MpKQorICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfbXVsdGlwYXJ0X2RlbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0TXVsdGlwYXJ0RGVtdXggKm11bHRpcGFydDsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIG11bHRpcGFydCA9IEdTVF9NVUxUSVBBUlRfREVNVVggKGVsZW1lbnQpOworCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkKKyAgICByZXR1cm4gcmV0OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QTEFZSU5HX1RPX1BBVVNFRDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBtdWx0aXBhcnQtPmhlYWRlcl9jb21wbGV0ZWQgPSBGQUxTRTsKKyAgICAgIGdfZnJlZSAobXVsdGlwYXJ0LT5ib3VuZGFyeSk7CisgICAgICBtdWx0aXBhcnQtPmJvdW5kYXJ5ID0gTlVMTDsKKyAgICAgIGdfZnJlZSAobXVsdGlwYXJ0LT5taW1lX3R5cGUpOworICAgICAgbXVsdGlwYXJ0LT5taW1lX3R5cGUgPSBOVUxMOworICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKG11bHRpcGFydC0+YWRhcHRlcik7CisgICAgICBtdWx0aXBhcnQtPmNvbnRlbnRfbGVuZ3RoID0gLTE7CisgICAgICBtdWx0aXBhcnQtPnNjYW5wb3MgPSAwOworICAgICAgZ3N0X211bHRpcGFydF9kZW11eF9yZW1vdmVfc3JjX3BhZHMgKG11bHRpcGFydCk7CisgICAgICBtdWx0aXBhcnQtPmhhdmVfZ3JvdXBfaWQgPSBGQUxTRTsKKyAgICAgIG11bHRpcGFydC0+Z3JvdXBfaWQgPSBHX01BWFVJTlQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aXBhcnRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE11bHRpcGFydERlbXV4ICpmaWx0ZXI7CisKKyAgZmlsdGVyID0gR1NUX01VTFRJUEFSVF9ERU1VWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQk9VTkRBUlk6CisgICAgICAvKiBOb3QgcmVhbGx5IHRoYXQgdXNlZnVsIGFueW1vcmUgYXMgd2UgY2FuIHJlbGlhYmx5IGF1dG9zY2FuICovCisgICAgICBnX2ZyZWUgKGZpbHRlci0+Ym91bmRhcnkpOworICAgICAgZmlsdGVyLT5ib3VuZGFyeSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgaWYgKGZpbHRlci0+Ym91bmRhcnkgIT0gTlVMTCkgeworICAgICAgICBmaWx0ZXItPmJvdW5kYXJ5X2xlbiA9IHN0cmxlbiAoZmlsdGVyLT5ib3VuZGFyeSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0lOR0xFX1NUUkVBTToKKyAgICAgIGZpbHRlci0+c2luZ2xlU3RyZWFtID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X211bHRpcGFydF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0TXVsdGlwYXJ0RGVtdXggKmZpbHRlcjsKKworICBmaWx0ZXIgPSBHU1RfTVVMVElQQVJUX0RFTVVYIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9CT1VOREFSWToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIGZpbHRlci0+Ym91bmRhcnkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NJTkdMRV9TVFJFQU06CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZmlsdGVyLT5zaW5nbGVTdHJlYW0pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisKKworZ2Jvb2xlYW4KK2dzdF9tdWx0aXBhcnRfZGVtdXhfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9tdWx0aXBhcnRfZGVtdXhfZGVidWcsCisgICAgICAibXVsdGlwYXJ0ZGVtdXgiLCAwLCAibXVsdGlwYXJ0IGRlbXV4ZXIiKTsKKworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIm11bHRpcGFydGRlbXV4IiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgIEdTVF9UWVBFX01VTFRJUEFSVF9ERU1VWCk7Cit9CmRpZmYgLS1naXQgYS9nc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmggYi9nc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I4MWE4MwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguaApAQCAtMCwwICsxLDExMCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA0IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogZ3N0bXVsdGlwYXJ0ZGVtdXguaDogbXVsdGlwYXJ0IHN0cmVhbSBkZW11eGVyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9NVUxUSVBBUlRfREVNVVhfXworI2RlZmluZSBfX0dTVF9NVUxUSVBBUlRfREVNVVhfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfTVVMVElQQVJUX0RFTVVYIChnc3RfbXVsdGlwYXJ0X2RlbXV4X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9NVUxUSVBBUlRfREVNVVgob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfTVVMVElQQVJUX0RFTVVYLCBHc3RNdWx0aXBhcnREZW11eCkpCisjZGVmaW5lIEdTVF9NVUxUSVBBUlRfREVNVVhfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX01VTFRJUEFSVF9ERU1VWCwgR3N0TXVsdGlwYXJ0RGVtdXgpKQorI2RlZmluZSBHU1RfTVVMVElQQVJUX0RFTVVYX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfTVVMVElQQVJUX0RFTVVYLCBHc3RNdWx0aXBhcnREZW11eENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX01VTFRJUEFSVF9ERU1VWChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9NVUxUSVBBUlRfREVNVVgpKQorI2RlZmluZSBHU1RfSVNfTVVMVElQQVJUX0RFTVVYX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9NVUxUSVBBUlRfREVNVVgpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0TXVsdGlwYXJ0RGVtdXggR3N0TXVsdGlwYXJ0RGVtdXg7Cit0eXBlZGVmIHN0cnVjdCBfR3N0TXVsdGlwYXJ0RGVtdXhDbGFzcyBHc3RNdWx0aXBhcnREZW11eENsYXNzOworCisjZGVmaW5lIE1VTFRJUEFSVF9ORUVEX01PUkVfREFUQSAtMQorI2RlZmluZSBNVUxUSVBBUlRfREFUQV9FUlJPUiAgICAgLTIKKyNkZWZpbmUgTVVMVElQQVJUX0RBVEFfRU9TICAgICAgIC0zCisKKy8qIGFsbCBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIG9uZSBtdWx0aXBhcnQgc3RyZWFtICovCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RQYWQgKnBhZDsgICAgICAgICAgICAgICAgICAvKiByZWZlcmVuY2UgZm9yIHRoaXMgcGFkIGlzIGhlbGQgYnkgZWxlbWVudCB3ZSBiZWxvbmcgdG8gKi8KKworICBnY2hhciAqbWltZTsKKworICBHc3RDbG9ja1RpbWUgIGxhc3RfdHM7ICAgICAgICAvKiBsYXN0IHRpbWVzdGFtcCB0byBtYWtlIHN1cmUgd2UgZG9uJ3Qgc2VuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0d28gYnVmZmVycyB3aXRoIHRoZSBzYW1lIHRpbWVzdGFtcCAqLworICBHc3RGbG93UmV0dXJuIGxhc3RfcmV0OworCisgIGdib29sZWFuICAgICAgZGlzY29udDsKK30KK0dzdE11bHRpcGFydFBhZDsKKworLyoqCisgKiBHc3RNdWx0aXBhcnREZW11eDoKKyAqCisgKiBUaGUgb3BhcXVlICNHc3RNdWx0aXBhcnREZW11eCBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0TXVsdGlwYXJ0RGVtdXgKK3sKKyAgR3N0RWxlbWVudCBlbGVtZW50OworCisgIC8qIHBhZCAqLworICBHc3RQYWQgKnNpbmtwYWQ7CisKKyAgR1NMaXN0ICpzcmNwYWRzOworICBndWludCBudW1wYWRzOworCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisKKyAgLyogSGVhZGVyIGluZm9ybWF0aW9uIG9mIHRoZSBjdXJyZW50IGZyYW1lICovCisgIGdib29sZWFuIGhlYWRlcl9jb21wbGV0ZWQ7CisgIGdjaGFyICpib3VuZGFyeTsKKyAgZ3VpbnQgYm91bmRhcnlfbGVuOworICBnY2hhciAqbWltZV90eXBlOworICBnaW50IGNvbnRlbnRfbGVuZ3RoOworCisgIC8qIEluZGV4IGluc2lkZSB0aGUgY3VycmVudCBkYXRhIHdoZW4gbWFudWFsbHkgbG9va2luZyBmb3IgdGhlIGJvdW5kYXJ5ICovCisgIGdpbnQgc2NhbnBvczsKKworICBnYm9vbGVhbiBzaW5nbGVTdHJlYW07CisKKyAgLyogdG8gaGFuZGxlIHN0cmVhbS1zdGFydCAqLworICBnYm9vbGVhbiBoYXZlX2dyb3VwX2lkOworICBndWludCBncm91cF9pZDsKK307CisKK3N0cnVjdCBfR3N0TXVsdGlwYXJ0RGVtdXhDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworCisgIEdIYXNoVGFibGUgKmdzdG5hbWVzOworfTsKKworR1R5cGUgZ3N0X211bHRpcGFydF9kZW11eF9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9tdWx0aXBhcnRfZGVtdXhfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9NVUxUSVBBUlRfREVNVVhfXyAqLworCmRpZmYgLS1naXQgYS9nc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jIGIvZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjI3MWZmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYwpAQCAtMCwwICsxLDY5NSBAQAorLyogbXVsdGlwYXJ0IG11eGVyIHBsdWdpbiBmb3IgR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1tdWx0aXBhcnRtdXgKKyAqCisgKiBNdWx0aXBhcnRNdXggdXNlcyB0aGUgI0dzdENhcHMgb2YgdGhlIHNpbmsgcGFkIGFzIHRoZSBDb250ZW50LXR5cGUgZmllbGQgZm9yCisgKiBpbmNvbWluZyBidWZmZXJzIHdoZW4gbXV4aW5nIHRoZW0gdG8gYSBtdWx0aXBhcnQgc3RyZWFtLiBNb3N0IG9mIHRoZSB0aW1lIAorICogbXVsdGlwYXJ0IHN0cmVhbXMgYXJlIHNlcXVlbnRpYWwgSlBFRyBmcmFtZXMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPlNhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHZpZGVvdGVzdHNyYyAhIHZpZGVvL3gtcmF3LCBmcmFtZXJhdGU9JyhmcmFjdGlvbiknNS8xICEganBlZ2VuYyAhIG11bHRpcGFydG11eCAhIGZpbGVzaW5rIGxvY2F0aW9uPS90bXAvdGVzdC5tdWx0aXBhcnQKKyAqIF18IGEgcGlwZWxpbmUgdG8gbXV4IDUgSlBFRyBmcmFtZXMgcGVyIHNlY29uZCBpbnRvIGEgbXVsdGlwYXJ0IHN0cmVhbQorICogc3RvcmVkIHRvIGEgZmlsZS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworLyogRklYTUU6IGRyb3AvbWVyZ2UgdGFnIGV2ZW50cywgb3IgYXQgbGVhc3Qgc2VuZCB0aGVtIGRlbGF5ZWQgYWZ0ZXIgc3RyZWFtLXN0YXJ0ICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJtdWx0aXBhcnRtdXguaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X211bHRpcGFydF9tdXhfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X211bHRpcGFydF9tdXhfZGVidWcKKworI2RlZmluZSBERUZBVUxUX0JPVU5EQVJZICAgICAgICAiVGhpc1JhbmRvbVN0cmluZyIKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQk9VTkRBUlkKKyAgICAgIC8qIEZJTEwgTUUgKi8KK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJtdWx0aXBhcnQveC1taXhlZC1yZXBsYWNlIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rXyV1IiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9SRVFVRVNULAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkgICAgICAgICAvKiB3ZSBjYW4gdGFrZSBhbnl0aGluZywgcmVhbGx5ICovCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgZ2NoYXIgKmtleTsKKyAgY29uc3QgZ2NoYXIgKnZhbDsKK30gTWltZVR5cGVNYXA7CisKKy8qIGNvbnZlcnQgZnJvbSBnc3Qgc3RydWN0dXJlIG5hbWVzIHRvIG1pbWUgdHlwZXMuIEFkZCBtb3JlIHdoZW4gbmVlZGVkLiAqLworc3RhdGljIGNvbnN0IE1pbWVUeXBlTWFwIG1pbWV0eXBlc1tdID0geworICB7ImF1ZGlvL3gtbXVsYXciLCAiYXVkaW8vYmFzaWMifSwKKyAge05VTEwsIE5VTEx9Cit9OworCitzdGF0aWMgdm9pZCBnc3RfbXVsdGlwYXJ0X211eF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbXVsdGlwYXJ0X211eF9oYW5kbGVfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RQYWQgKmdzdF9tdWx0aXBhcnRfbXV4X3JlcXVlc3RfbmV3X3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0UGFkVGVtcGxhdGUgKiB0ZW1wbCwgY29uc3QgZ2NoYXIgKiBuYW1lLCBjb25zdCBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X211bHRpcGFydF9tdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9tdWx0aXBhcnRfbXV4X3NpbmtfZXZlbnQgKEdzdENvbGxlY3RQYWRzICogcGFkcywKKyAgICBHc3RDb2xsZWN0RGF0YSAqIHBhZCwgR3N0RXZlbnQgKiBldmVudCwgR3N0TXVsdGlwYXJ0TXV4ICogbXV4KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9tdWx0aXBhcnRfbXV4X2NvbGxlY3RlZCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLAorICAgIEdzdE11bHRpcGFydE11eCAqIG11eCk7CisKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aXBhcnRfbXV4X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aXBhcnRfbXV4X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworI2RlZmluZSBnc3RfbXVsdGlwYXJ0X211eF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RNdWx0aXBhcnRNdXgsIGdzdF9tdWx0aXBhcnRfbXV4LCBHU1RfVFlQRV9FTEVNRU5UKTsKKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aXBhcnRfbXV4X2NsYXNzX2luaXQgKEdzdE11bHRpcGFydE11eENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBnaW50IGk7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIHBhcmVudF9jbGFzcyA9IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X211bHRpcGFydF9tdXhfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9tdWx0aXBhcnRfbXV4X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X211bHRpcGFydF9tdXhfc2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQk9VTkRBUlksCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiYm91bmRhcnkiLCAiQm91bmRhcnkiLCAiQm91bmRhcnkgc3RyaW5nIiwKKyAgICAgICAgICBERUZBVUxUX0JPVU5EQVJZLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5yZXF1ZXN0X25ld19wYWQgPSBnc3RfbXVsdGlwYXJ0X211eF9yZXF1ZXN0X25ld19wYWQ7CisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9tdWx0aXBhcnRfbXV4X2NoYW5nZV9zdGF0ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNyY19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX2ZhY3RvcnkpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJNdWx0aXBhcnQgbXV4ZXIiLAorICAgICAgIkNvZGVjL011eGVyIiwgIm11eCBtdWx0aXBhcnQgc3RyZWFtcyIsICJXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPiIpOworCisgIC8qIHBvcHVsYXRlIG1pbWUgdHlwZXMgKi8KKyAga2xhc3MtPm1pbWV0eXBlcyA9IGdfaGFzaF90YWJsZV9uZXcgKGdfc3RyX2hhc2gsIGdfc3RyX2VxdWFsKTsKKyAgZm9yIChpID0gMDsgbWltZXR5cGVzW2ldLmtleTsgaSsrKSB7CisgICAgZ19oYXNoX3RhYmxlX2luc2VydCAoa2xhc3MtPm1pbWV0eXBlcywgKGdwb2ludGVyKSBtaW1ldHlwZXNbaV0ua2V5LAorICAgICAgICAoZ3BvaW50ZXIpIG1pbWV0eXBlc1tpXS52YWwpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGlwYXJ0X211eF9pbml0IChHc3RNdWx0aXBhcnRNdXggKiBtdWx0aXBhcnRfbXV4KQoreworICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChtdWx0aXBhcnRfbXV4KTsKKworICBtdWx0aXBhcnRfbXV4LT5zcmNwYWQgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV90ZW1wbGF0ZSAoZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsCisgICAgICAgICAgInNyYyIpLCAic3JjIik7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChtdWx0aXBhcnRfbXV4LT5zcmNwYWQsCisgICAgICBnc3RfbXVsdGlwYXJ0X211eF9oYW5kbGVfc3JjX2V2ZW50KTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKG11bHRpcGFydF9tdXgpLCBtdWx0aXBhcnRfbXV4LT5zcmNwYWQpOworCisgIG11bHRpcGFydF9tdXgtPmJvdW5kYXJ5ID0gZ19zdHJkdXAgKERFRkFVTFRfQk9VTkRBUlkpOworCisgIG11bHRpcGFydF9tdXgtPmNvbGxlY3QgPSBnc3RfY29sbGVjdF9wYWRzX25ldyAoKTsKKyAgZ3N0X2NvbGxlY3RfcGFkc19zZXRfZXZlbnRfZnVuY3Rpb24gKG11bHRpcGFydF9tdXgtPmNvbGxlY3QsCisgICAgICAoR3N0Q29sbGVjdFBhZHNFdmVudEZ1bmN0aW9uKQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tdWx0aXBhcnRfbXV4X3NpbmtfZXZlbnQpLCBtdWx0aXBhcnRfbXV4KTsKKyAgZ3N0X2NvbGxlY3RfcGFkc19zZXRfZnVuY3Rpb24gKG11bHRpcGFydF9tdXgtPmNvbGxlY3QsCisgICAgICAoR3N0Q29sbGVjdFBhZHNGdW5jdGlvbikgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tdWx0aXBhcnRfbXV4X2NvbGxlY3RlZCksCisgICAgICBtdWx0aXBhcnRfbXV4KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aXBhcnRfbXV4X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RNdWx0aXBhcnRNdXggKm11bHRpcGFydF9tdXg7CisKKyAgbXVsdGlwYXJ0X211eCA9IEdTVF9NVUxUSVBBUlRfTVVYIChvYmplY3QpOworCisgIGdfZnJlZSAobXVsdGlwYXJ0X211eC0+Ym91bmRhcnkpOworCisgIGlmIChtdWx0aXBhcnRfbXV4LT5jb2xsZWN0KQorICAgIGdzdF9vYmplY3RfdW5yZWYgKG11bHRpcGFydF9tdXgtPmNvbGxlY3QpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIEdzdFBhZCAqCitnc3RfbXVsdGlwYXJ0X211eF9yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsIGNvbnN0IGdjaGFyICogcmVxX25hbWUsIGNvbnN0IEdzdENhcHMgKiBjYXBzKQoreworICBHc3RNdWx0aXBhcnRNdXggKm11bHRpcGFydF9tdXg7CisgIEdzdFBhZCAqbmV3cGFkOworICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChlbGVtZW50KTsKKyAgZ2NoYXIgKm5hbWU7CisKKyAgaWYgKHRlbXBsICE9IGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLCAic2lua18ldSIpKQorICAgIGdvdG8gd3JvbmdfdGVtcGxhdGU7CisKKyAgbXVsdGlwYXJ0X211eCA9IEdTVF9NVUxUSVBBUlRfTVVYIChlbGVtZW50KTsKKworICAvKiBjcmVhdGUgbmV3IHBhZCB3aXRoIHRoZSBuYW1lICovCisgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzaW5rXyV1IiwgbXVsdGlwYXJ0X211eC0+bnVtcGFkcyk7CisgIG5ld3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKHRlbXBsLCBuYW1lKTsKKyAgZ19mcmVlIChuYW1lKTsKKworICAvKiBjb25zdHJ1Y3Qgb3VyIG93biB3cmFwcGVyIGRhdGEgc3RydWN0dXJlIGZvciB0aGUgcGFkIHRvCisgICAqIGtlZXAgdHJhY2sgb2YgaXRzIHN0YXR1cyAqLworICB7CisgICAgR3N0TXVsdGlwYXJ0UGFkRGF0YSAqbXVsdGlwYXJ0cGFkOworCisgICAgbXVsdGlwYXJ0cGFkID0gKEdzdE11bHRpcGFydFBhZERhdGEgKikKKyAgICAgICAgZ3N0X2NvbGxlY3RfcGFkc19hZGRfcGFkIChtdWx0aXBhcnRfbXV4LT5jb2xsZWN0LCBuZXdwYWQsCisgICAgICAgIHNpemVvZiAoR3N0TXVsdGlwYXJ0UGFkRGF0YSksIE5VTEwsIFRSVUUpOworCisgICAgLyogc2F2ZSBhIHBvaW50ZXIgdG8gb3VyIGRhdGEgaW4gdGhlIHBhZCAqLworICAgIG11bHRpcGFydHBhZC0+cGFkID0gbmV3cGFkOworICAgIGdzdF9wYWRfc2V0X2VsZW1lbnRfcHJpdmF0ZSAobmV3cGFkLCBtdWx0aXBhcnRwYWQpOworICAgIG11bHRpcGFydF9tdXgtPm51bXBhZHMrKzsKKyAgfQorCisgIC8qIGFkZCB0aGUgcGFkIHRvIHRoZSBlbGVtZW50ICovCisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGVsZW1lbnQsIG5ld3BhZCk7CisKKyAgcmV0dXJuIG5ld3BhZDsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX3RlbXBsYXRlOgorICB7CisgICAgZ193YXJuaW5nICgibXVsdGlwYXJ0X211eDogdGhpcyBpcyBub3Qgb3VyIHRlbXBsYXRlISIpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKKy8qIGhhbmRsZSBldmVudHMgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X211bHRpcGFydF9tdXhfaGFuZGxlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0RXZlbnRUeXBlIHR5cGU7CisKKyAgdHlwZSA9IGV2ZW50ID8gR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSA6IEdTVF9FVkVOVF9VTktOT1dOOworCisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1NFRUs6CisgICAgICAvKiBkaXNhYmxlIHNlZWtpbmcgZm9yIG5vdyAqLworICAgICAgcmV0dXJuIEZBTFNFOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqCitnc3RfbXVsdGlwYXJ0X211eF9nZXRfbWltZSAoR3N0TXVsdGlwYXJ0TXV4ICogbXV4LCBHc3RTdHJ1Y3R1cmUgKiBzKQoreworICBHc3RNdWx0aXBhcnRNdXhDbGFzcyAqa2xhc3M7CisgIGNvbnN0IGdjaGFyICptaW1lOworICBjb25zdCBnY2hhciAqbmFtZTsKKyAgZ2ludCByYXRlOworICBnaW50IGNoYW5uZWxzOworICBnaW50IGJpdHJhdGUgPSAwOworCisgIGtsYXNzID0gR1NUX01VTFRJUEFSVF9NVVhfR0VUX0NMQVNTIChtdXgpOworCisgIG5hbWUgPSBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzKTsKKworICAvKiB1c2UgaGFzaHRhYmxlIHRvIGNvbnZlcnQgdG8gbWltZSB0eXBlICovCisgIG1pbWUgPSBnX2hhc2hfdGFibGVfbG9va3VwIChrbGFzcy0+bWltZXR5cGVzLCBuYW1lKTsKKyAgaWYgKG1pbWUgPT0gTlVMTCkgeworICAgIGlmICghc3RyY21wIChuYW1lLCAiYXVkaW8veC1hZHBjbSIpKQorICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzLCAiYml0cmF0ZSIsICZiaXRyYXRlKTsKKworICAgIHN3aXRjaCAoYml0cmF0ZSkgeworICAgICAgY2FzZSAxNjAwMDoKKyAgICAgICAgbWltZSA9ICJhdWRpby9HNzI2LTE2IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI0MDAwOgorICAgICAgICBtaW1lID0gImF1ZGlvL0c3MjYtMjQiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzIwMDA6CisgICAgICAgIG1pbWUgPSAiYXVkaW8vRzcyNi0zMiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0MDAwMDoKKyAgICAgICAgbWltZSA9ICJhdWRpby9HNzI2LTQwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBubyBtaW1lIHR5cGUgbWFwcGluZywgdXNlIG5hbWUgKi8KKyAgICAgICAgbWltZSA9IG5hbWU7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAvKiBSRkMyMDQ2IHJlcXVpcmVzIGF1ZGlvL2Jhc2ljIHRvIGJlIG11bGF3IDgwMDBIeiBtb25vICovCisgIGlmIChnX2FzY2lpX3N0cmNhc2VjbXAgKG1pbWUsICJhdWRpby9iYXNpYyIpID09IDApIHsKKyAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzLCAicmF0ZSIsICZyYXRlKSAmJgorICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJjaGFubmVscyIsICZjaGFubmVscykpIHsKKyAgICAgIGlmIChyYXRlICE9IDgwMDAgfHwgY2hhbm5lbHMgIT0gMSkgeworICAgICAgICBtaW1lID0gbmFtZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgbWltZSA9IG5hbWU7CisgICAgfQorICB9CisgIHJldHVybiBtaW1lOworfQorCisvKgorICogR2l2ZW4gdHdvIHBhZHMsIGNvbXBhcmUgdGhlIGJ1ZmZlcnMgcXVldWVkIG9uIGl0IGFuZCByZXR1cm4gMCBpZiB0aGV5IGhhdmUKKyAqIGFuIGVxdWFsIHByaW9yaXR5LCAxIGlmIHRoZSBuZXcgcGFkIGlzIGJldHRlciwgLTEgaWYgdGhlIG9sZCBwYWQgaXMgYmV0dGVyIAorICovCitzdGF0aWMgZ2ludAorZ3N0X211bHRpcGFydF9tdXhfY29tcGFyZV9wYWRzIChHc3RNdWx0aXBhcnRNdXggKiBtdWx0aXBhcnRfbXV4LAorICAgIEdzdE11bHRpcGFydFBhZERhdGEgKiBvbGQsIEdzdE11bHRpcGFydFBhZERhdGEgKiBuZXcpCit7CisgIGd1aW50NjQgb2xkdGltZSwgbmV3dGltZTsKKworICAvKiBpZiB0aGUgb2xkIHBhZCBkb2Vzbid0IGNvbnRhaW4gYW55dGhpbmcgb3IgaXMgZXZlbiBOVUxMLCByZXR1cm4gCisgICAqIHRoZSBuZXcgcGFkIGFzIGJlc3QgY2FuZGlkYXRlIGFuZCB2aWNlIHZlcnNhICovCisgIGlmIChvbGQgPT0gTlVMTCB8fCBvbGQtPmJ1ZmZlciA9PSBOVUxMKQorICAgIHJldHVybiAxOworICBpZiAobmV3ID09IE5VTEwgfHwgbmV3LT5idWZmZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChvbGQtPmR0c190aW1lc3RhbXApICYmCisgICAgICBHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAobmV3LT5kdHNfdGltZXN0YW1wKSkgeworICAgIG9sZHRpbWUgPSBvbGQtPmR0c190aW1lc3RhbXA7CisgICAgbmV3dGltZSA9IG5ldy0+ZHRzX3RpbWVzdGFtcDsKKyAgfSBlbHNlIHsKKyAgICBvbGR0aW1lID0gb2xkLT5wdHNfdGltZXN0YW1wOworICAgIG5ld3RpbWUgPSBuZXctPnB0c190aW1lc3RhbXA7CisgIH0KKworICAvKiBubyB0aW1lc3RhbXAgb24gb2xkIGJ1ZmZlciwgaXQgbXVzdCBnbyBmaXJzdCAqLworICBpZiAob2xkdGltZSA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgIHJldHVybiAtMTsKKworICAvKiBubyB0aW1lc3RhbXAgb24gbmV3IGJ1ZmZlciwgaXQgbXVzdCBnbyBmaXJzdCAqLworICBpZiAobmV3dGltZSA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgIHJldHVybiAxOworCisgIC8qIG9sZCBidWZmZXIgaGFzIGhpZ2hlciB0aW1lc3RhbXAsIG5ldyBvbmUgc2hvdWxkIGdvIGZpcnN0ICovCisgIGlmIChuZXd0aW1lIDwgb2xkdGltZSkKKyAgICByZXR1cm4gMTsKKyAgLyogbmV3IGJ1ZmZlciBoYXMgaGlnaGVyIHRpbWVzdGFtcCwgb2xkIG9uZSBzaG91bGQgZ28gZmlyc3QgKi8KKyAgZWxzZSBpZiAobmV3dGltZSA+IG9sZHRpbWUpCisgICAgcmV0dXJuIC0xOworCisgIC8qIHNhbWUgcHJpb3JpdHkgaWYgYWxsIG9mIHRoZSBhYm92ZSBmYWlsZWQgKi8KKyAgcmV0dXJuIDA7Cit9CisKKy8qIG1ha2Ugc3VyZSBhIGJ1ZmZlciBpcyBxdWV1ZWQgb24gYWxsIHBhZHMsIHJldHVybnMgYSBwb2ludGVyIHRvIGFuIG11bHRpcGFydHBhZAorICogdGhhdCBob2xkcyB0aGUgYmVzdCBidWZmZXIgb3IgTlVMTCB3aGVuIG5vIHBhZCB3YXMgdXNhYmxlICovCitzdGF0aWMgR3N0TXVsdGlwYXJ0UGFkRGF0YSAqCitnc3RfbXVsdGlwYXJ0X211eF9xdWV1ZV9wYWRzIChHc3RNdWx0aXBhcnRNdXggKiBtdXgpCit7CisgIEdTTGlzdCAqd2FsayA9IE5VTEw7CisgIEdzdE11bHRpcGFydFBhZERhdGEgKmJlc3RwYWQgPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfTVVMVElQQVJUX01VWCAobXV4KSwgTlVMTCk7CisKKyAgLyogdHJ5IHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgYnVmZmVyIGZyb20gZWFjaCB1c2FibGUgcGFkIGZpcnN0ICovCisgIHdhbGsgPSBtdXgtPmNvbGxlY3QtPmRhdGE7CisgIHdoaWxlICh3YWxrKSB7CisgICAgR3N0Q29sbGVjdERhdGEgKmRhdGEgPSAoR3N0Q29sbGVjdERhdGEgKikgd2Fsay0+ZGF0YTsKKyAgICBHc3RNdWx0aXBhcnRQYWREYXRhICpwYWQgPSAoR3N0TXVsdGlwYXJ0UGFkRGF0YSAqKSBkYXRhOworCisgICAgd2FsayA9IGdfc2xpc3RfbmV4dCAod2Fsayk7CisKKyAgICAvKiB0cnkgdG8gZ2V0IGEgbmV3IGJ1ZmZlciBmb3IgdGhpcyBwYWQgaWYgbmVlZGVkIGFuZCBwb3NzaWJsZSAqLworICAgIGlmIChwYWQtPmJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICBHc3RCdWZmZXIgKmJ1ZiA9IE5VTEw7CisKKyAgICAgIGJ1ZiA9IGdzdF9jb2xsZWN0X3BhZHNfcG9wIChtdXgtPmNvbGxlY3QsIGRhdGEpOworCisgICAgICAvKiBTdG9yZSB0aW1lc3RhbXBzIHdpdGggc2VnbWVudF9zdGFydCBhbmQgcHJlcm9sbCAqLworICAgICAgaWYgKGJ1ZiAmJiBHU1RfQlVGRkVSX1BUU19JU19WQUxJRCAoYnVmKSkgeworICAgICAgICBwYWQtPnB0c190aW1lc3RhbXAgPQorICAgICAgICAgICAgZ3N0X3NlZ21lbnRfdG9fcnVubmluZ190aW1lICgmZGF0YS0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICAgICAgR1NUX0JVRkZFUl9QVFMgKGJ1ZikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGFkLT5wdHNfdGltZXN0YW1wID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICAgIH0KKyAgICAgIGlmIChidWYgJiYgR1NUX0JVRkZFUl9EVFNfSVNfVkFMSUQgKGJ1ZikpIHsKKyAgICAgICAgcGFkLT5kdHNfdGltZXN0YW1wID0KKyAgICAgICAgICAgIGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJmRhdGEtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgICAgIEdTVF9CVUZGRVJfRFRTIChidWYpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBhZC0+ZHRzX3RpbWVzdGFtcCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICB9CisKKworICAgICAgcGFkLT5idWZmZXIgPSBidWY7CisgICAgfQorCisgICAgLyogd2Ugc2hvdWxkIGhhdmUgYSBidWZmZXIgbm93LCBzZWUgaWYgaXQgaXMgdGhlIGJlc3Qgc3RyZWFtIHRvCisgICAgICogcHVsbCBvbiAqLworICAgIGlmIChwYWQtPmJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICBpZiAoZ3N0X211bHRpcGFydF9tdXhfY29tcGFyZV9wYWRzIChtdXgsIGJlc3RwYWQsIHBhZCkgPiAwKSB7CisgICAgICAgIGJlc3RwYWQgPSBwYWQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGJlc3RwYWQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X211bHRpcGFydF9tdXhfc2lua19ldmVudCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLCBHc3RDb2xsZWN0RGF0YSAqIGRhdGEsCisgICAgR3N0RXZlbnQgKiBldmVudCwgR3N0TXVsdGlwYXJ0TXV4ICogbXV4KQoreworICBnYm9vbGVhbiByZXQ7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICB7CisgICAgICBtdXgtPm5lZWRfc2VnbWVudCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gZ3N0X2NvbGxlY3RfcGFkc19ldmVudF9kZWZhdWx0IChwYWRzLCBkYXRhLCBldmVudCwgRkFMU0UpOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qIGJhc2ljIGlkZWE6CisgKgorICogMSkgZmluZCBhIHBhZCB0byBwdWxsIG9uLCB0aGlzIGlzIGRvbmUgYnkgcHVsbGluZyBvbiBhbGwgcGFkcyBhbmQKKyAqICAgIGxvb2tpbmcgYXQgdGhlIGJ1ZmZlcnMgdG8gZGVjaWRlIHdoaWNoIG9uZSBzaG91bGQgYmUgbXV4ZWQgZmlyc3QuCisgKiAyKSBjcmVhdGUgYSBuZXcgYnVmZmVyIGZvciB0aGUgaGVhZGVyCisgKiAzKSBwdXNoIGJvdGggYnVmZmVycyBvbiBiZXN0IHBhZCwgZ28gdG8gMQorICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X211bHRpcGFydF9tdXhfY29sbGVjdGVkIChHc3RDb2xsZWN0UGFkcyAqIHBhZHMsIEdzdE11bHRpcGFydE11eCAqIG11eCkKK3sKKyAgR3N0TXVsdGlwYXJ0UGFkRGF0YSAqYmVzdDsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ2NoYXIgKmhlYWRlciA9IE5VTEw7CisgIHNpemVfdCBoZWFkZXJsZW47CisgIEdzdEJ1ZmZlciAqaGVhZGVyYnVmID0gTlVMTDsKKyAgR3N0QnVmZmVyICpmb290ZXJidWYgPSBOVUxMOworICBHc3RCdWZmZXIgKmRhdGFidWYgPSBOVUxMOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZSA9IE5VTEw7CisgIEdzdENhcHMgKmNhcHM7CisgIGNvbnN0IGdjaGFyICptaW1lOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgImFsbCBwYWRzIGFyZSBjb2xsZWN0ZWQiKTsKKworICBpZiAobXV4LT5uZWVkX3N0cmVhbV9zdGFydCkgeworICAgIGdjaGFyIHNfaWRbMzJdOworCisgICAgLyogc3RyZWFtLXN0YXJ0IChGSVhNRTogY3JlYXRlIGlkIGJhc2VkIG9uIGlucHV0IGlkcykgKi8KKyAgICBnX3NucHJpbnRmIChzX2lkLCBzaXplb2YgKHNfaWQpLCAibXVsdGlwYXJ0bXV4LSUwOHgiLCBnX3JhbmRvbV9pbnQgKCkpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAobXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0IChzX2lkKSk7CisKKyAgICBtdXgtPm5lZWRfc3RyZWFtX3N0YXJ0ID0gRkFMU0U7CisgIH0KKworICAvKiBxdWV1ZSBidWZmZXJzIG9uIGFsbCBwYWRzOyBmaW5kIGEgYnVmZmVyIHdpdGggdGhlIGxvd2VzdCB0aW1lc3RhbXAgKi8KKyAgYmVzdCA9IGdzdF9tdWx0aXBhcnRfbXV4X3F1ZXVlX3BhZHMgKG11eCk7CisgIGlmICghYmVzdCkKKyAgICAvKiBFT1MgKi8KKyAgICBnb3RvIGVvczsKKyAgZWxzZSBpZiAoIWJlc3QtPmJ1ZmZlcikKKyAgICBnb3RvIGJ1ZmZlcl9lcnJvcjsKKworICAvKiBJZiBub3QgbmVnb3RpYXRlZCB5ZXQgc2V0IGNhcHMgb24gc3JjIHBhZCAqLworICBpZiAoIW11eC0+bmVnb3RpYXRlZCkgeworICAgIEdzdENhcHMgKm5ld2NhcHM7CisKKyAgICBuZXdjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoIm11bHRpcGFydC94LW1peGVkLXJlcGxhY2UiLAorICAgICAgICAiYm91bmRhcnkiLCBHX1RZUEVfU1RSSU5HLCBtdXgtPmJvdW5kYXJ5LCBOVUxMKTsKKworICAgIGlmICghZ3N0X3BhZF9zZXRfY2FwcyAobXV4LT5zcmNwYWQsIG5ld2NhcHMpKSB7CisgICAgICBnc3RfY2Fwc191bnJlZiAobmV3Y2Fwcyk7CisgICAgICBnb3RvIG5lZ29fZXJyb3I7CisgICAgfQorCisgICAgZ3N0X2NhcHNfdW5yZWYgKG5ld2NhcHMpOworICAgIG11eC0+bmVnb3RpYXRlZCA9IFRSVUU7CisgIH0KKworICAvKiBzZWUgaWYgd2UgbmVlZCB0byBwdXNoIGEgc2VnbWVudCAqLworICBpZiAobXV4LT5uZWVkX3NlZ21lbnQpIHsKKyAgICBHc3RDbG9ja1RpbWUgdGltZTsKKyAgICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgICBpZiAoYmVzdC0+ZHRzX3RpbWVzdGFtcCAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgICB0aW1lID0gYmVzdC0+ZHRzX3RpbWVzdGFtcDsKKyAgICB9IGVsc2UgaWYgKGJlc3QtPnB0c190aW1lc3RhbXAgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgICAgdGltZSA9IGJlc3QtPnB0c190aW1lc3RhbXA7CisgICAgfSBlbHNlIHsKKyAgICAgIHRpbWUgPSAwOworICAgIH0KKworICAgIC8qIGZvciB0aGUgc2VnbWVudCwgd2UgdGFrZSB0aGUgZmlyc3QgdGltZXN0YW1wIHdlIHNlZSwgd2UgZG9uJ3Qga25vdyB0aGUKKyAgICAgKiBsZW5ndGggYW5kIHRoZSBwb3NpdGlvbiBpcyAwICovCisgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgICAgc2VnbWVudC5zdGFydCA9IHRpbWU7CisKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKG11eC0+c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSk7CisKKyAgICBtdXgtPm5lZWRfc2VnbWVudCA9IEZBTFNFOworICB9CisKKyAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoYmVzdC0+cGFkKTsKKyAgaWYgKGNhcHMgPT0gTlVMTCkKKyAgICBnb3RvIG5vX2NhcHM7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGlmICghc3RydWN0dXJlKSB7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIGdvdG8gbm9fY2FwczsKKyAgfQorCisgIC8qIGdldCB0aGUgbWltZSB0eXBlIGZvciB0aGUgc3RydWN0dXJlICovCisgIG1pbWUgPSBnc3RfbXVsdGlwYXJ0X211eF9nZXRfbWltZSAobXV4LCBzdHJ1Y3R1cmUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgaGVhZGVyID0gZ19zdHJkdXBfcHJpbnRmICgiLS0lc1xyXG5Db250ZW50LVR5cGU6ICVzXHJcbiIKKyAgICAgICJDb250ZW50LUxlbmd0aDogJSIgR19HU0laRV9GT1JNQVQgIlxyXG5cclxuIiwKKyAgICAgIG11eC0+Ym91bmRhcnksIG1pbWUsIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJlc3QtPmJ1ZmZlcikpOworICBoZWFkZXJsZW4gPSBzdHJsZW4gKGhlYWRlcik7CisKKyAgaGVhZGVyYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIGhlYWRlcmxlbiwgTlVMTCk7CisgIGdzdF9idWZmZXJfZmlsbCAoaGVhZGVyYnVmLCAwLCBoZWFkZXIsIGhlYWRlcmxlbik7CisgIGdfZnJlZSAoaGVhZGVyKTsKKworICAvKiB0aGUgaGVhZGVyIGhhcyB0aGUgc2FtZSB0aW1lc3RhbXBzIGFzIHRoZSBkYXRhIGJ1ZmZlciAod2hpY2ggd2Ugd2lsbCBwdXNoCisgICAqIGJlbG93KSBhbmQgaGFzIGEgZHVyYXRpb24gb2YgMCAqLworICBHU1RfQlVGRkVSX1BUUyAoaGVhZGVyYnVmKSA9IGJlc3QtPnB0c190aW1lc3RhbXA7CisgIEdTVF9CVUZGRVJfRFRTIChoZWFkZXJidWYpID0gYmVzdC0+ZHRzX3RpbWVzdGFtcDsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAoaGVhZGVyYnVmKSA9IDA7CisgIEdTVF9CVUZGRVJfT0ZGU0VUIChoZWFkZXJidWYpID0gbXV4LT5vZmZzZXQ7CisgIG11eC0+b2Zmc2V0ICs9IGhlYWRlcmxlbjsKKyAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChoZWFkZXJidWYpID0gbXV4LT5vZmZzZXQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAicHVzaGluZyAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIGhlYWRlciBidWZmZXIiLAorICAgICAgaGVhZGVybGVuKTsKKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChtdXgtPnNyY3BhZCwgaGVhZGVyYnVmKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAvKiBwdXNoIGFsd2F5cyB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGJ1ZmZlciwgZXZlbiBhZnRlciBhbiBlcnJvciwgc28gd2UKKyAgICAgKiBkb24ndCBuZWVkIHRvIHVucmVmIGhlYWRlcmJ1ZiBoZXJlLiAqLworICAgIGdvdG8gYmVhY2g7CisKKyAgLyogdGFrZSBiZXN0LT5idWZmZXIsIHdlIGRvbid0IG5lZWQgdG8gdW5yZWYgaXQgbGF0ZXIgYXMgd2Ugd2lsbCBwdXNoIGl0CisgICAqIG5vdy4gKi8KKyAgZGF0YWJ1ZiA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoYmVzdC0+YnVmZmVyKTsKKyAgYmVzdC0+YnVmZmVyID0gTlVMTDsKKworICAvKiB3ZSBuZWVkIHRvIHVwZGF0ZWQgdGhlIHRpbWVzdGFtcHMgdG8gbWF0Y2ggdGhlIHJ1bm5pbmdfdGltZSAqLworICBHU1RfQlVGRkVSX1BUUyAoZGF0YWJ1ZikgPSBiZXN0LT5wdHNfdGltZXN0YW1wOworICBHU1RfQlVGRkVSX0RUUyAoZGF0YWJ1ZikgPSBiZXN0LT5kdHNfdGltZXN0YW1wOworICBHU1RfQlVGRkVSX09GRlNFVCAoZGF0YWJ1ZikgPSBtdXgtPm9mZnNldDsKKyAgbXV4LT5vZmZzZXQgKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZGF0YWJ1Zik7CisgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoZGF0YWJ1ZikgPSBtdXgtPm9mZnNldDsKKyAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoZGF0YWJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgInB1c2hpbmcgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyBkYXRhIGJ1ZmZlciIsCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChkYXRhYnVmKSk7CisgIHJldCA9IGdzdF9wYWRfcHVzaCAobXV4LT5zcmNwYWQsIGRhdGFidWYpOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIC8qIHB1c2ggYWx3YXlzIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgYnVmZmVyLCBldmVuIGFmdGVyIGFuIGVycm9yLCBzbyB3ZQorICAgICAqIGRvbid0IG5lZWQgdG8gdW5yZWYgaGVhZGVyYnVmIGhlcmUuICovCisgICAgZ290byBiZWFjaDsKKworICBmb290ZXJidWYgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgMiwgTlVMTCk7CisgIGdzdF9idWZmZXJfZmlsbCAoZm9vdGVyYnVmLCAwLCAiXHJcbiIsIDIpOworCisgIC8qIHRoZSBmb290ZXIgaGFzIHRoZSBzYW1lIHRpbWVzdGFtcHMgYXMgdGhlIGRhdGEgYnVmZmVyIGFuZCBoYXMgYQorICAgKiBkdXJhdGlvbiBvZiAwICovCisgIEdTVF9CVUZGRVJfUFRTIChmb290ZXJidWYpID0gYmVzdC0+cHRzX3RpbWVzdGFtcDsKKyAgR1NUX0JVRkZFUl9EVFMgKGZvb3RlcmJ1ZikgPSBiZXN0LT5kdHNfdGltZXN0YW1wOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChmb290ZXJidWYpID0gMDsKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKGZvb3RlcmJ1ZikgPSBtdXgtPm9mZnNldDsKKyAgbXV4LT5vZmZzZXQgKz0gMjsKKyAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChmb290ZXJidWYpID0gbXV4LT5vZmZzZXQ7CisgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGZvb3RlcmJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgInB1c2hpbmcgMiBieXRlcyBmb290ZXIgYnVmZmVyIik7CisgIHJldCA9IGdzdF9wYWRfcHVzaCAobXV4LT5zcmNwYWQsIGZvb3RlcmJ1Zik7CisKK2JlYWNoOgorICBpZiAoYmVzdCAmJiBiZXN0LT5idWZmZXIpIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChiZXN0LT5idWZmZXIpOworICAgIGJlc3QtPmJ1ZmZlciA9IE5VTEw7CisgIH0KKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK2J1ZmZlcl9lcnJvcjoKKyAgeworICAgIC8qIFRoZXJlIGlzIGEgYmVzdCBidXQgbm8gYnVmZmVyLCB0aGlzIGlzIG5vdCBxdWl0ZSByaWdodC4uICovCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG11eCwgU1RSRUFNLCBGQUlMRUQsIChOVUxMKSwgKCJpbnRlcm5hbCBtdXhpbmcgZXJyb3IiKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBiZWFjaDsKKyAgfQorZW9zOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAiUHVzaGluZyBFT1MiKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKG11eC0+c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgIGdvdG8gYmVhY2g7CisgIH0KK25lZ29fZXJyb3I6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgImZhaWxlZCB0byBzZXQgY2FwcyIpOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtdXgsIENPUkUsIE5FR09USUFUSU9OLCAoTlVMTCksIChOVUxMKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisgICAgZ290byBiZWFjaDsKKyAgfQorbm9fY2FwczoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXV4LCAibm8gY2FwcyBvbiB0aGUgaW5jb21pbmcgYnVmZmVyICVwIiwgYmVzdC0+YnVmZmVyKTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAobXV4LCBDT1JFLCBORUdPVElBVElPTiwgKE5VTEwpLCAoTlVMTCkpOworICAgIHJldCA9IEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICAgIGdvdG8gYmVhY2g7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aXBhcnRfbXV4X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RNdWx0aXBhcnRNdXggKm11eDsKKworICBtdXggPSBHU1RfTVVMVElQQVJUX01VWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQk9VTkRBUlk6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBtdXgtPmJvdW5kYXJ5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aXBhcnRfbXV4X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RNdWx0aXBhcnRNdXggKm11eDsKKworICBtdXggPSBHU1RfTVVMVElQQVJUX01VWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQk9VTkRBUlk6CisgICAgICBnX2ZyZWUgKG11eC0+Ym91bmRhcnkpOworICAgICAgbXV4LT5ib3VuZGFyeSA9IGdfc3RyZHVwIChnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X211bHRpcGFydF9tdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0TXVsdGlwYXJ0TXV4ICptdWx0aXBhcnRfbXV4OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgbXVsdGlwYXJ0X211eCA9IEdTVF9NVUxUSVBBUlRfTVVYIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgbXVsdGlwYXJ0X211eC0+b2Zmc2V0ID0gMDsKKyAgICAgIG11bHRpcGFydF9tdXgtPm5lZ290aWF0ZWQgPSBGQUxTRTsKKyAgICAgIG11bHRpcGFydF9tdXgtPm5lZWRfc2VnbWVudCA9IFRSVUU7CisgICAgICBtdWx0aXBhcnRfbXV4LT5uZWVkX3N0cmVhbV9zdGFydCA9IFRSVUU7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChtdWx0aXBhcnRfbXV4LCAic3RhcnRpbmcgY29sbGVjdCBwYWRzIik7CisgICAgICBnc3RfY29sbGVjdF9wYWRzX3N0YXJ0IChtdWx0aXBhcnRfbXV4LT5jb2xsZWN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChtdWx0aXBhcnRfbXV4LCAic3RvcHBpbmcgY29sbGVjdCBwYWRzIik7CisgICAgICBnc3RfY29sbGVjdF9wYWRzX3N0b3AgKG11bHRpcGFydF9tdXgtPmNvbGxlY3QpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisgIGlmIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKQorICAgIHJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9tdWx0aXBhcnRfbXV4X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfbXVsdGlwYXJ0X211eF9kZWJ1ZywgIm11bHRpcGFydG11eCIsIDAsCisgICAgICAibXVsdGlwYXJ0IG11eGVyIik7CisKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJtdWx0aXBhcnRtdXgiLCBHU1RfUkFOS19OT05FLAorICAgICAgR1NUX1RZUEVfTVVMVElQQVJUX01VWCk7Cit9CmRpZmYgLS1naXQgYS9nc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5oIGIvZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjQ0ZjVhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguaApAQCAtMCwwICsxLDk4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIGdzdG11bHRpcGFydG11eC5oOiBtdWx0aXBhcnQgc3RyZWFtIG11eGVyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9NVUxUSVBBUlRfTVVYX18KKyNkZWZpbmUgX19HU1RfTVVMVElQQVJUX01VWF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Y29sbGVjdHBhZHMuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfTVVMVElQQVJUX01VWCAoZ3N0X211bHRpcGFydF9tdXhfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX01VTFRJUEFSVF9NVVgob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfTVVMVElQQVJUX01VWCwgR3N0TXVsdGlwYXJ0TXV4KSkKKyNkZWZpbmUgR1NUX01VTFRJUEFSVF9NVVhfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX01VTFRJUEFSVF9NVVgsIEdzdE11bHRpcGFydE11eCkpCisjZGVmaW5lIEdTVF9NVUxUSVBBUlRfTVVYX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfTVVMVElQQVJUX01VWCwgR3N0TXVsdGlwYXJ0TXV4Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfTVVMVElQQVJUX01VWChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9NVUxUSVBBUlRfTVVYKSkKKyNkZWZpbmUgR1NUX0lTX01VTFRJUEFSVF9NVVhfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX01VTFRJUEFSVF9NVVgpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0TXVsdGlwYXJ0TXV4IEdzdE11bHRpcGFydE11eDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RNdWx0aXBhcnRNdXhDbGFzcyBHc3RNdWx0aXBhcnRNdXhDbGFzczsKKworLyogYWxsIGluZm9ybWF0aW9uIG5lZWRlZCBmb3Igb25lIG11bHRpcGFydCBzdHJlYW0gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIEdzdENvbGxlY3REYXRhIGNvbGxlY3Q7ICAgICAgIC8qIHdlIGV4dGVuZCB0aGUgQ29sbGVjdERhdGEgKi8KKworICBHc3RCdWZmZXIgKmJ1ZmZlcjsgICAgICAgICAgICAvKiB0aGUgcXVldWVkIGJ1ZmZlciBmb3IgdGhpcyBwYWQgKi8KKyAgR3N0Q2xvY2tUaW1lIHB0c190aW1lc3RhbXA7ICAgLyogaXRzIHB0cyB0aW1lc3RhbXAsIGNvbnZlcnRlZCB0byBydW5uaW5nX3RpbWUgc28gdGhhdCB3ZSBjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdGx5IHNvcnQgb3ZlciBtdWx0aXBsZSBzZWdtZW50cy4gKi8KKyAgR3N0Q2xvY2tUaW1lIGR0c190aW1lc3RhbXA7ICAgLyogaXRzIGR0cyB0aW1lc3RhbXAsIGNvbnZlcnRlZCB0byBydW5uaW5nX3RpbWUgc28gdGhhdCB3ZSBjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdGx5IHNvcnQgb3ZlciBtdWx0aXBsZSBzZWdtZW50cy4gKi8KKyAgR3N0UGFkICpwYWQ7Cit9CitHc3RNdWx0aXBhcnRQYWREYXRhOworCisvKioKKyAqIEdzdE11bHRpcGFydE11eDoKKyAqCisgKiBUaGUgb3BhcXVlICNHc3RNdWx0aXBhcnRNdXggc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdE11bHRpcGFydE11eAoreworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgLyogcGFkICovCisgIEdzdFBhZCAqc3JjcGFkOworCisgIC8qIHNpbmtwYWRzICovCisgIEdzdENvbGxlY3RQYWRzICpjb2xsZWN0OworCisgIGdpbnQgbnVtcGFkczsKKworICAvKiBvZmZzZXQgaW4gc3RyZWFtICovCisgIGd1aW50NjQgb2Zmc2V0OworCisgIC8qIGJvdW5kYXJ5IHN0cmluZyAqLworICBnY2hhciAqYm91bmRhcnk7CisKKyAgZ2Jvb2xlYW4gbmVnb3RpYXRlZDsKKyAgZ2Jvb2xlYW4gbmVlZF9zZWdtZW50OworICBnYm9vbGVhbiBuZWVkX3N0cmVhbV9zdGFydDsKK307CisKK3N0cnVjdCBfR3N0TXVsdGlwYXJ0TXV4Q2xhc3MKK3sKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudF9jbGFzczsKKworICBHSGFzaFRhYmxlICptaW1ldHlwZXM7Cit9OworCitHVHlwZSBnc3RfbXVsdGlwYXJ0X211eF9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9tdWx0aXBhcnRfbXV4X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfTVVMVElQQVJUX01VWF9fICovCisKZGlmZiAtLWdpdCBhL2dzdC9yZXBsYXlnYWluL01ha2VmaWxlLmFtIGIvZ3N0L3JlcGxheWdhaW4vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlMjQwNgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9yZXBsYXlnYWluL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjIgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdHJlcGxheWdhaW4ubGEKKworbGliZ3N0cmVwbGF5Z2Fpbl9sYV9TT1VSQ0VTID0gXAorCWdzdHJnYW5hbHlzaXMuYyAgICAgICBcCisJZ3N0cmdsaW1pdGVyLmMgICAgICAgIFwKKwlnc3RyZ3ZvbHVtZS5jICAgICAgICAgXAorCXJlcGxheWdhaW4uYyAgICAgICAgICBcCisJcmdhbmFseXNpcy5jCitsaWJnc3RyZXBsYXlnYWluX2xhX0NGTEFHUyAgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdHJlcGxheWdhaW5fbGFfTElCQUREICA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RwYnV0aWxzLSQoR1NUX0FQSV9WRVJTSU9OKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKVwKKwkkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoTElCTSkKK2xpYmdzdHJlcGxheWdhaW5fbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCisjIGhlYWRlcnMgd2UgbmVlZCBidXQgZG9uJ3Qgd2FudCBpbnN0YWxsZWQKK25vaW5zdF9IRUFERVJTID0gICAgICAgICBcCisJZ3N0cmdhbmFseXNpcy5oICBcCisJZ3N0cmdsaW1pdGVyLmggICBcCisJZ3N0cmd2b2x1bWUuaCAgICBcCisJcmVwbGF5Z2Fpbi5oICAgICBcCisJcmdhbmFseXNpcy5oCmRpZmYgLS1naXQgYS9nc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmMgYi9nc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE0OTAxZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9yZXBsYXlnYWluL2dzdHJnYW5hbHlzaXMuYwpAQCAtMCwwICsxLDcwOSBAQAorLyogR1N0cmVhbWVyIFJlcGxheUdhaW4gYW5hbHlzaXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVuZSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorICogCisgKiBnc3RyZ2FuYWx5c2lzLmM6IEVsZW1lbnQgdGhhdCBwZXJmb3JtcyB0aGUgUmVwbGF5R2FpbiBhbmFseXNpcworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJnYW5hbHlzaXMKKyAqIEBzZWVfYWxzbzogI0dzdFJnVm9sdW1lCisgKgorICogVGhpcyBlbGVtZW50IGFuYWx5emVzIHJhdyBhdWRpbyBzYW1wbGUgZGF0YSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHByb3Bvc2VkCisgKiA8dWxpbmsgdXJsPSJodHRwOi8vcmVwbGF5Z2Fpbi5vcmciPlJlcGxheUdhaW4gc3RhbmRhcmQ8L3VsaW5rPiBmb3IKKyAqIGNhbGN1bGF0aW5nIHRoZSBpZGVhbCByZXBsYXkgZ2FpbiBmb3IgbXVzaWMgdHJhY2tzIGFuZCBhbGJ1bXMuICBUaGUgZWxlbWVudAorICogaXMgZGVzaWduZWQgYXMgYSBwYXNzLXRocm91Z2ggZmlsdGVyIHRoYXQgbmV2ZXIgbW9kaWZpZXMgYW55IGRhdGEuICBBcyBpdAorICogcmVjZWl2ZXMgYW4gRU9TIGV2ZW50LCBpdCBmaW5hbGl6ZXMgdGhlIG9uZ29pbmcgYW5hbHlzaXMgYW5kIGdlbmVyYXRlcyBhIHRhZworICogbGlzdCBjb250YWluaW5nIHRoZSByZXN1bHRzLiAgSXQgaXMgc2VudCBkb3duc3RyZWFtIHdpdGggYSB0YWcgZXZlbnQgYW5kCisgKiBwb3N0ZWQgb24gdGhlIG1lc3NhZ2UgYnVzIHdpdGggYSB0YWcgbWVzc2FnZS4gIFRoZSBFT1MgZXZlbnQgaXMgZm9yd2FyZGVkIGFzCisgKiBub3JtYWwgYWZ0ZXJ3YXJkcy4gIFJlc3VsdCB0YWcgbGlzdHMgYXQgbGVhc3QgY29udGFpbiB0aGUgdGFncworICogI0dTVF9UQUdfVFJBQ0tfR0FJTiwgI0dTVF9UQUdfVFJBQ0tfUEVBSyBhbmQgI0dTVF9UQUdfUkVGRVJFTkNFX0xFVkVMLgorICogCisgKiBCZWNhdXNlIHRoZSBnZW5lcmF0ZWQgbWV0YWRhdGEgdGFncyBiZWNvbWUgYXZhaWxhYmxlIGF0IHRoZSBlbmQgb2Ygc3RyZWFtcywKKyAqIGRvd25zdHJlYW0gbXV4ZXIgYW5kIGVuY29kZXIgZWxlbWVudHMgYXJlIG5vcm1hbGx5IHVuYWJsZSB0byBzYXZlIHRoZW0gaW4KKyAqIHRoZWlyIG91dHB1dCBzaW5jZSB0aGV5IGdlbmVyYWxseSBzYXZlIG1ldGFkYXRhIGluIHRoZSBmaWxlIGhlYWRlci4KKyAqIFRoZXJlZm9yZSwgaXQgaXMgb2Z0ZW4gbmVjZXNzYXJ5IHRoYXQgYXBwbGljYXRpb25zIHJlYWQgdGhlIHJlc3VsdHMgaW4gYSBidXMKKyAqIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSB0YWcgbWVzc2FnZS4gIE9idGFpbmluZyB0aGUgdmFsdWVzIHRoaXMgd2F5IGlzIGFsd2F5cworICogbmVlZGVkIGZvciBhbGJ1bSBwcm9jZXNzaW5nIChzZWUgI0dzdFJnQW5hbHlzaXM6bnVtLXRyYWNrcyBwcm9wZXJ0eSkgc2luY2UKKyAqIHRoZSBhbGJ1bSBnYWluIGFuZCBwZWFrIHZhbHVlcyBuZWVkIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhbGwgdHJhY2tzIG9mIGFuCisgKiBhbGJ1bSwgbm90IGp1c3QgdGhlIGxhc3Qgb25lLgorICogCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC10IGF1ZGlvdGVzdHNyYyB3YXZlPXNpbmUgbnVtLWJ1ZmZlcnM9NTEyICEgcmdhbmFseXNpcyAhIGZha2VzaW5rCisgKiBdfCBBbmFseXplIGEgc2ltcGxlIHRlc3Qgd2F2ZWZvcm0KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdCBmaWxlc3JjIGxvY2F0aW9uPWZpbGVuYW1lLmV4dCAhIGRlY29kZWJpbiBcCisgKiAgICAgISBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgcmdhbmFseXNpcyAhIGZha2VzaW5rCisgKiBdfCBBbmFseXplIGEgZ2l2ZW4gZmlsZQorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC10IGdub21ldmZzc3JjIGxvY2F0aW9uPWh0dHA6Ly9yZXBsYXlnYWluLmh5ZHJvZ2VuYXVkaW8ub3JnL3JlZl9waW5rLndhdiBcCisgKiAgICAgISB3YXZwYXJzZSAhIHJnYW5hbHlzaXMgISBmYWtlc2luaworICogXXwgQW5hbHl6ZSB0aGUgcGluayBub2lzZSByZWZlcmVuY2UgZmlsZQorICogPHBhcmE+CisgKiBUaGUgYWJvdmUgbGF1bmNoIGxpbmUgeWllbGRzIGEgcmVzdWx0IGdhaW4gb2YgKzYgZEIgKGluc3RlYWQgb2YgdGhlIGV4cGVjdGVkCisgKiArMCBkQikuICBUaGlzIGlzIG5vdCBpbiBlcnJvciwgcmVmZXIgdG8gdGhlICNHc3RSZ0FuYWx5c2lzOnJlZmVyZW5jZS1sZXZlbAorICogcHJvcGVydHkgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqIDwvcGFyYT4KKyAqIDwvcmVmc2VjdDI+CisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+QWNrbm93bGVkZ2VtZW50czwvdGl0bGU+CisgKiA8cGFyYT4KKyAqIFRoaXMgZWxlbWVudCBpcyBiYXNlZCBvbiBjb2RlIHVzZWQgaW4gdGhlIDx1bGluaworICogdXJsPSJodHRwOi8vc2plbmcub3JnL3ZvcmJpc2dhaW4uaHRtbCI+dm9yYmlzZ2FpbjwvdWxpbms+IHByb2dyYW0gYW5kIG1hbnkKKyAqIG90aGVycy4gIFRoZSByZWxldmFudCBwYXJ0cyBhcmUgY29weXJpZ2h0ZWQgYnkgRGF2aWQgUm9iaW5zb24sIEdsZW4gU2F3eWVyCisgKiBhbmQgRnJhbmsgS2xlbW0uCisgKiA8L3BhcmE+CisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJnc3RyZ2FuYWx5c2lzLmgiCisjaW5jbHVkZSAicmVwbGF5Z2Fpbi5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfcmdfYW5hbHlzaXNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3JnX2FuYWx5c2lzX2RlYnVnCisKKy8qIERlZmF1bHQgcHJvcGVydHkgdmFsdWUuICovCisjZGVmaW5lIEZPUkNFRF9ERUZBVUxUIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9NRVNTQUdFIEZBTFNFCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX05VTV9UUkFDS1MsCisgIFBST1BfRk9SQ0VELAorICBQUk9QX1JFRkVSRU5DRV9MRVZFTCwKKyAgUFJPUF9NRVNTQUdFCit9OworCisvKiBUaGUgUmVwbGF5R2FpbiBhbGdvcml0aG0gaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIG1vbm8gYW5kIHN0ZXJlbworICogYXVkaW8uICBUaGUgdXNlZCBpbXBsZW1lbnRhdGlvbiBoYXMgZmlsdGVyIGNvZWZmaWNpZW50cyBmb3IgdGhlCisgKiAidXN1YWwiIHNhbXBsZSByYXRlcyBpbiB0aGUgODAwMCB0byA0ODAwMCBIeiByYW5nZS4gKi8KKyNkZWZpbmUgUkVQTEFZX0dBSU5fQ0FQUyAiYXVkaW8veC1yYXcsIiBcCisgICJmb3JtYXQgPSAoc3RyaW5nKSB7ICJHU1RfQVVESU9fTkUoRjMyKSIsIkdTVF9BVURJT19ORShTMTYpIiB9LCAiICAgICBcCisgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJjaGFubmVscyA9IChpbnQpIDEsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJyYXRlID0gKGludCkgeyA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCAiICAgICBcCisgICI0NDEwMCwgNDgwMDAgfTsgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhdWRpby94LXJhdywiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJmb3JtYXQgPSAoc3RyaW5nKSB7ICJHU1RfQVVESU9fTkUoRjMyKSIsIkdTVF9BVURJT19ORShTMTYpIiB9LCAiICAgICBcCisgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJjaGFubmVscyA9IChpbnQpIDIsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJjaGFubmVsLW1hc2sgPSAoYml0bWFzaykgMHgzLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJyYXRlID0gKGludCkgeyA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCAiICAgICBcCisgICI0NDEwMCwgNDgwMDAgfSIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoUkVQTEFZX0dBSU5fQ0FQUykpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChSRVBMQVlfR0FJTl9DQVBTKSk7CisKKyNkZWZpbmUgZ3N0X3JnX2FuYWx5c2lzX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJnQW5hbHlzaXMsIGdzdF9yZ19hbmFseXNpcywgR1NUX1RZUEVfQkFTRV9UUkFOU0ZPUk0pOworCitzdGF0aWMgdm9pZCBnc3RfcmdfYW5hbHlzaXNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3JnX2FuYWx5c2lzX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9yZ19hbmFseXNpc19zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UpOworc3RhdGljIGdib29sZWFuIGdzdF9yZ19hbmFseXNpc19zZXRfY2FwcyAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UsCisgICAgR3N0Q2FwcyAqIGluY2FwcywgR3N0Q2FwcyAqIG91dGNhcHMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3JnX2FuYWx5c2lzX3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UsCisgICAgR3N0QnVmZmVyICogYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcmdfYW5hbHlzaXNfc2lua19ldmVudCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3JnX2FuYWx5c2lzX3N0b3AgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlKTsKKworc3RhdGljIHZvaWQgZ3N0X3JnX2FuYWx5c2lzX2hhbmRsZV90YWdzIChHc3RSZ0FuYWx5c2lzICogZmlsdGVyLAorICAgIGNvbnN0IEdzdFRhZ0xpc3QgKiB0YWdfbGlzdCk7CitzdGF0aWMgdm9pZCBnc3RfcmdfYW5hbHlzaXNfaGFuZGxlX2VvcyAoR3N0UmdBbmFseXNpcyAqIGZpbHRlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3JnX2FuYWx5c2lzX3RyYWNrX3Jlc3VsdCAoR3N0UmdBbmFseXNpcyAqIGZpbHRlciwKKyAgICBHc3RUYWdMaXN0ICoqIHRhZ19saXN0KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcmdfYW5hbHlzaXNfYWxidW1fcmVzdWx0IChHc3RSZ0FuYWx5c2lzICogZmlsdGVyLAorICAgIEdzdFRhZ0xpc3QgKiogdGFnX2xpc3QpOworCitzdGF0aWMgdm9pZAorZ3N0X3JnX2FuYWx5c2lzX2NsYXNzX2luaXQgKEdzdFJnQW5hbHlzaXNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzICp0cmFuc19jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3JnX2FuYWx5c2lzX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3JnX2FuYWx5c2lzX2dldF9wcm9wZXJ0eTsKKworICAvKioKKyAgICogR3N0UmdBbmFseXNpczpudW0tdHJhY2tzOgorICAgKgorICAgKiBOdW1iZXIgb2YgcmVtYWluaW5nIGFsYnVtIHRyYWNrcy4KKyAgICogCisgICAqIEFuYWx5emluZyBzZXZlcmFsIHN0cmVhbXMgc2VxdWVudGlhbGx5IGFuZCBhc3NpZ25pbmcgdGhlbSBhIGNvbW1vbiByZXN1bHQKKyAgICogZ2FpbiBpcyBrbm93biBhcyAiYWxidW0gcHJvY2Vzc2luZyIuICBJZiB0aGlzIGdhaW4gaXMgdXNlZCBkdXJpbmcgcGxheWJhY2sKKyAgICogKGJ5IHN3aXRjaGluZyB0byAiYWxidW0gbW9kZSIpLCBhbGwgdHJhY2tzIG9mIGFuIGFsYnVtIHJlY2VpdmUgdGhlIHNhbWUKKyAgICogYW1wbGlmaWNhdGlvbi4gIFRoaXMga2VlcHMgdGhlIHJlbGF0aXZlIHZvbHVtZSBsZXZlbHMgYmV0d2VlbiB0aGUgdHJhY2tzCisgICAqIGludGFjdC4gIFRvIGVuYWJsZSB0aGlzLCBzZXQgdGhpcyBwcm9wZXJ0eSB0byB0aGUgbnVtYmVyIG9mIHN0cmVhbXMgdGhhdAorICAgKiB3aWxsIGJlIHByb2Nlc3NlZCBhcyBhbGJ1bSB0cmFja3MuCisgICAqCisgICAqIEV2ZXJ5IHRpbWUgYW4gRU9TIGV2ZW50IGlzIHJlY2VpdmVkLCB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBpcworICAgKiBkZWNyZW1lbnRlZCBieSBvbmUuICBBcyBpdCByZWFjaGVzIHplcm8sIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgbGFzdCB0cmFjaworICAgKiBvZiB0aGUgYWxidW0gZmluaXNoZWQuICBUaGUgdGFnIGxpc3QgZm9yIHRoZSBmaW5hbCBzdHJlYW0gd2lsbCBjb250YWluIHRoZQorICAgKiBhZGRpdGlvbmFsIHRhZ3MgI0dTVF9UQUdfQUxCVU1fR0FJTiBhbmQgI0dTVF9UQUdfQUxCVU1fUEVBSy4gIEFsbCBvdGhlcgorICAgKiBzdHJlYW1zIGp1c3QgZ2V0IHRoZSB0d28gdHJhY2sgdGFncyBwb3N0ZWQgYmVjYXVzZSB0aGUgdmFsdWVzIGZvciB0aGUgYWxidW0KKyAgICogdGFncyBhcmUgbm90IGtub3duIGJlZm9yZSBhbGwgdHJhY2tzIGFyZSBhbmFseXplZC4gIEFwcGxpY2F0aW9ucyBuZWVkIHRvCisgICAqIGVuc3VyZSB0aGF0IHRoZSBhbGJ1bSBnYWluIGFuZCBwZWFrIHZhbHVlcyBhcmUgYWxzbyBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAqIG90aGVyIHRyYWNrcyB3aGVuIHN0b3JpbmcgdGhlIHJlc3VsdHMuCisgICAqCisgICAqIElmIHRoZSB0b3RhbCBudW1iZXIgb2YgYWxidW0gdHJhY2tzIGlzIHVua25vd24gYmVmb3JlaGFuZCwganVzdCBlbnN1cmUgdGhhdAorICAgKiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDEgYmVmb3JlIGVhY2ggdHJhY2sgc3RhcnRzLiAgVGhlbiBiZWZvcmUgdGhlIGVuZAorICAgKiBvZiB0aGUgbGFzdCB0cmFjaywgc2V0IGl0IHRvIHRoZSB2YWx1ZSAxLgorICAgKgorICAgKiBUbyBwZXJmb3JtIGFsYnVtIHByb2Nlc3NpbmcsIHRoZSBlbGVtZW50IGhhcyB0byBwcmVzZXJ2ZSBkYXRhIGJldHdlZW4KKyAgICogc3RyZWFtcy4gIFRoaXMgY2Fubm90IHN1cnZpdmUgYSBzdGF0ZSBjaGFuZ2UgdG8gdGhlIE5VTEwgb3IgUkVBRFkgc3RhdGUuCisgICAqIElmIHlvdSBjaGFuZ2UgeW91ciBwaXBlbGluZSdzIHN0YXRlIHRvIE5VTEwgb3IgUkVBRFkgYmV0d2VlbiB0cmFja3MsIGxvY2sKKyAgICogdGhlIGVsZW1lbnQncyBzdGF0ZSB1c2luZyBnc3RfZWxlbWVudF9zZXRfbG9ja2VkX3N0YXRlKCkgd2hlbiBpdCBpcyBpbgorICAgKiBQQVVTRUQgb3IgUExBWUlORy4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTlVNX1RSQUNLUywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJudW0tdHJhY2tzIiwgIk51bWJlciBvZiBhbGJ1bSB0cmFja3MiLAorICAgICAgICAgICJOdW1iZXIgb2YgcmVtYWluaW5nIGFsYnVtIHRyYWNrcyIsIDAsIEdfTUFYSU5ULCAwLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0UmdBbmFseXNpczpmb3JjZWQ6CisgICAqCisgICAqIFdoZXRoZXIgdG8gYW5hbHl6ZSBzdHJlYW1zIGV2ZW4gd2hlbiBSZXBsYXlHYWluIHRhZ3MgZXhpc3QuCisgICAqCisgICAqIEZvciBhc3Npc3RpbmcgdHJhbnNjb2Rlci9jb252ZXJ0ZXIgYXBwbGljYXRpb25zLCB0aGUgZWxlbWVudCBjYW4gc2lsZW50bHkKKyAgICogc2tpcCB0aGUgcHJvY2Vzc2luZyBvZiBzdHJlYW1zIHRoYXQgYWxyZWFkeSBjb250YWluIHRoZSBuZWNlc3NhcnkgdGFncy4KKyAgICogRGF0YSB3aWxsIGZsb3cgYXMgdXN1YWwgYnV0IHRoZSBlbGVtZW50IHdpbGwgbm90IGNvbnN1bWUgQ1BVIHRpbWUgYW5kIHdpbGwKKyAgICogbm90IGdlbmVyYXRlIHJlc3VsdCB0YWdzLiAgVG8gZW5hYmxlIHBvc3NpYmxlIHNraXBwaW5nLCBzZXQgdGhpcyBwcm9wZXJ0eQorICAgKiB0byAlRkFMU0UuCisgICAqCisgICAqIElmIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCA8bGluayBsaW5rZW5kPSJHc3RSZ0FuYWx5c2lzLS1udW0tdHJhY2tzIj5hbGJ1bQorICAgKiBwcm9jZXNzaW5nPC9saW5rPiwgdGhlIGVsZW1lbnQgd2lsbCBza2lwIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGFsYnVtCisgICAqIHRyYWNrcyBpZiBhIGZ1bGwgc2V0IG9mIHRhZ3MgaXMgZm91bmQgZm9yIHRoZSBmaXJzdCB0cmFjay4gIElmIGEgc3Vic2VxdWVudAorICAgKiB0cmFjayBvZiB0aGUgYWxidW0gaXMgbWlzc2luZyB0YWdzLCBwcm9jZXNzaW5nIGNhbm5vdCBzdGFydCBhZ2Fpbi4gIElmIHRoaXMKKyAgICogaXMgdW5kZXNpcmVkLCB0aGUgYXBwbGljYXRpb24gaGFzIHRvIHNjYW4gYWxsIGZpbGVzIGJlZm9yZWhhbmQgYW5kIGVuYWJsZQorICAgKiBmb3JjaW5nIG9mIHByb2Nlc3NpbmcgaWYgbmVlZGVkLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9GT1JDRUQsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImZvcmNlZCIsICJGb3JjZWQiLAorICAgICAgICAgICJBbmFseXplIGV2ZW4gaWYgUmVwbGF5R2FpbiB0YWdzIGV4aXN0IiwKKyAgICAgICAgICBGT1JDRURfREVGQVVMVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RSZ0FuYWx5c2lzOnJlZmVyZW5jZS1sZXZlbDoKKyAgICoKKyAgICogUmVmZXJlbmNlIGxldmVsIFtkQl0uCisgICAqCisgICAqIEFuYWx5emluZyB0aGUgUmVwbGF5R2FpbiBwaW5rIG5vaXNlIHJlZmVyZW5jZSB3YXZlZm9ybSBjb21wdXRlcyBhIHJlc3VsdCBvZgorICAgKiArNiBkQiBpbnN0ZWFkIG9mIHRoZSBleHBlY3RlZCAwIGRCLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBkZWZhdWx0IHJlZmVyZW5jZQorICAgKiBsZXZlbCBpcyA4OSBkQi4gIFRvIG9idGFpbiB2YWx1ZXMgYXMgbGluZWQgb3V0IGluIHRoZSBvcmlnaW5hbCBwcm9wb3NhbCBvZgorICAgKiBSZXBsYXlHYWluLCBzZXQgdGhpcyBwcm9wZXJ0eSB0byA4My4KKyAgICoKKyAgICogQWxtb3N0IGFsbCBzb2Z0d2FyZSB1c2VzIDg5IGRCIGFzIGEgcmVmZXJlbmNlIGhvd2V2ZXIsIGFuZCB0aGlzIHZhbHVlIGhhcworICAgKiBiZWNvbWUgdGhlIG5ldyBvZmZpY2lhbCB2YWx1ZS4gIFRoYXQgaXMgdG8gc2F5LCB3aGlsZSB0aGUgY2hhbmdlIGhhcyBiZWVuCisgICAqIGFjY2xhaW1lZCBieSB0aGUgYXV0aG9yIG9mIHRoZSBSZXBsYXlHYWluIHByb3Bvc2FsLCB0aGUgPHVsaW5rCisgICAqIHVybD0iaHR0cDovL3JlcGxheWdhaW4ub3JnIj53ZWJwYWdlPC91bGluaz4gaXMgc3RpbGwgb3V0ZGF0ZWQgYXQgdGhlIHRpbWUKKyAgICogb2YgdGhpcyB3cml0aW5nLgorICAgKgorICAgKiBUaGUgdmFsdWUgd2FzIGNoYW5nZWQgYmVjYXVzZSB0aGUgb3JpZ2luYWwgcHJvcG9zYWwgcmVjb21tZW5kcyBhIGRlZmF1bHQKKyAgICogcHJlLWFtcCB2YWx1ZSBvZiArNiBkQiBmb3IgcGxheWJhY2suICBUaGlzIHNlZW1lZCBhIGJpdCBvZGQsIGFzIGl0IG1lYW5zCisgICAqIHRoYXQgdGhlIGFsZ29yaXRobSBoYXMgdGhlIGdlbmVyYWwgdGVuZGVuY3kgdG8gcHJvZHVjZSBhZGp1c3RtZW50IHZhbHVlcworICAgKiB0aGF0IGFyZSA2IGRCIHRvbyBsb3cuICBCdW1waW5nIHRoZSByZWZlcmVuY2UgbGV2ZWwgYnkgNiBkQiBjb21wZW5zYXRlZCBmb3IKKyAgICogdGhpcy4KKyAgICoKKyAgICogVGhlIHByb2JsZW0gb2YgdGhlIHJlZmVyZW5jZSBsZXZlbCBiZWluZyBhbWJpZ3VvdXMgZm9yIGxhY2sgb2YgY29uY2lzZQorICAgKiBzdGFuZGFyZGl6YXRpb24gaXMgdG8gYmUgc29sdmVkIGJ5IGFkb3B0aW5nIHRoZSAjR1NUX1RBR19SRUZFUkVOQ0VfTEVWRUwKKyAgICogdGFnLCB3aGljaCBhbGxvd3MgdG8gc3RvcmUgdGhlIHVzZWQgdmFsdWUgYWxvbmdzaWRlIHRoZSBnYWluIHZhbHVlcy4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkVGRVJFTkNFX0xFVkVMLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoInJlZmVyZW5jZS1sZXZlbCIsICJSZWZlcmVuY2UgbGV2ZWwiLAorICAgICAgICAgICJSZWZlcmVuY2UgbGV2ZWwgW2RCXSIsIDAuMCwgMTUwLiwgUkdfUkVGRVJFTkNFX0xFVkVMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfTUVTU0FHRSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgibWVzc2FnZSIsICJNZXNzYWdlIiwKKyAgICAgICAgICAiUG9zdCBzdGF0aWNzIG1lc3NhZ2VzIiwKKyAgICAgICAgICBERUZBVUxUX01FU1NBR0UsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICB0cmFuc19jbGFzcyA9IChHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKikga2xhc3M7CisgIHRyYW5zX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcmdfYW5hbHlzaXNfc3RhcnQpOworICB0cmFuc19jbGFzcy0+c2V0X2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3JnX2FuYWx5c2lzX3NldF9jYXBzKTsKKyAgdHJhbnNfY2xhc3MtPnRyYW5zZm9ybV9pcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcmdfYW5hbHlzaXNfdHJhbnNmb3JtX2lwKTsKKyAgdHJhbnNfY2xhc3MtPnNpbmtfZXZlbnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3JnX2FuYWx5c2lzX3NpbmtfZXZlbnQpOworICB0cmFuc19jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcmdfYW5hbHlzaXNfc3RvcCk7CisgIHRyYW5zX2NsYXNzLT5wYXNzdGhyb3VnaF9vbl9zYW1lX2NhcHMgPSBUUlVFOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc3JjX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNpbmtfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJSZXBsYXlHYWluIGFuYWx5c2lzIiwKKyAgICAgICJGaWx0ZXIvQW5hbHl6ZXIvQXVkaW8iLAorICAgICAgIlBlcmZvcm0gdGhlIFJlcGxheUdhaW4gYW5hbHlzaXMiLAorICAgICAgIlJlblx4YzNceGE5IFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9yZ19hbmFseXNpc19kZWJ1ZywgInJnYW5hbHlzaXMiLCAwLAorICAgICAgIlJlcGxheUdhaW4gYW5hbHlzaXMgZWxlbWVudCIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JnX2FuYWx5c2lzX2luaXQgKEdzdFJnQW5hbHlzaXMgKiBmaWx0ZXIpCit7CisgIEdzdEJhc2VUcmFuc2Zvcm0gKmJhc2UgPSBHU1RfQkFTRV9UUkFOU0ZPUk0gKGZpbHRlcik7CisKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9nYXBfYXdhcmUgKGJhc2UsIFRSVUUpOworCisgIGZpbHRlci0+bnVtX3RyYWNrcyA9IDA7CisgIGZpbHRlci0+Zm9yY2VkID0gRk9SQ0VEX0RFRkFVTFQ7CisgIGZpbHRlci0+bWVzc2FnZSA9IERFRkFVTFRfTUVTU0FHRTsKKyAgZmlsdGVyLT5yZWZlcmVuY2VfbGV2ZWwgPSBSR19SRUZFUkVOQ0VfTEVWRUw7CisKKyAgZmlsdGVyLT5jdHggPSBOVUxMOworICBmaWx0ZXItPmFuYWx5emUgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JnX2FuYWx5c2lzX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSZ0FuYWx5c2lzICpmaWx0ZXIgPSBHU1RfUkdfQU5BTFlTSVMgKG9iamVjdCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTlVNX1RSQUNLUzoKKyAgICAgIGZpbHRlci0+bnVtX3RyYWNrcyA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZPUkNFRDoKKyAgICAgIGZpbHRlci0+Zm9yY2VkID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JFRkVSRU5DRV9MRVZFTDoKKyAgICAgIGZpbHRlci0+cmVmZXJlbmNlX2xldmVsID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUVTU0FHRToKKyAgICAgIGZpbHRlci0+bWVzc2FnZSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGZpbHRlcik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcmdfYW5hbHlzaXNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJnQW5hbHlzaXMgKmZpbHRlciA9IEdTVF9SR19BTkFMWVNJUyAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGZpbHRlcik7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9OVU1fVFJBQ0tTOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZmlsdGVyLT5udW1fdHJhY2tzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GT1JDRUQ6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZmlsdGVyLT5mb3JjZWQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JFRkVSRU5DRV9MRVZFTDoKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIGZpbHRlci0+cmVmZXJlbmNlX2xldmVsKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NRVNTQUdFOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIGZpbHRlci0+bWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JnX2FuYWx5c2lzX3Bvc3RfbWVzc2FnZSAoZ3BvaW50ZXIgcmdhbmFseXNpcywgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCwKKyAgICBHc3RDbG9ja1RpbWUgZHVyYXRpb24sIGdkb3VibGUgcmdsZXZlbCkKK3sKKyAgR3N0UmdBbmFseXNpcyAqZmlsdGVyID0gR1NUX1JHX0FOQUxZU0lTIChyZ2FuYWx5c2lzKTsKKyAgaWYgKGZpbHRlci0+bWVzc2FnZSkgeworICAgIEdzdE1lc3NhZ2UgKm07CisKKyAgICBtID0gZ3N0X21lc3NhZ2VfbmV3X2VsZW1lbnQgKEdTVF9PQkpFQ1RfQ0FTVCAocmdhbmFseXNpcyksCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgicmdhbmFseXNpcyIsCisgICAgICAgICAgICAidGltZXN0YW1wIiwgR19UWVBFX1VJTlQ2NCwgdGltZXN0YW1wLAorICAgICAgICAgICAgImR1cmF0aW9uIiwgR19UWVBFX1VJTlQ2NCwgZHVyYXRpb24sCisgICAgICAgICAgICAicmdsZXZlbCIsIEdfVFlQRV9ET1VCTEUsIHJnbGV2ZWwsIE5VTEwpKTsKKworICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAocmdhbmFseXNpcyksIG0pOworICB9Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3RfcmdfYW5hbHlzaXNfc3RhcnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlKQoreworICBHc3RSZ0FuYWx5c2lzICpmaWx0ZXIgPSBHU1RfUkdfQU5BTFlTSVMgKGJhc2UpOworCisgIGZpbHRlci0+aWdub3JlX3RhZ3MgPSBGQUxTRTsKKyAgZmlsdGVyLT5za2lwID0gRkFMU0U7CisgIGZpbHRlci0+aGFzX3RyYWNrX2dhaW4gPSBGQUxTRTsKKyAgZmlsdGVyLT5oYXNfdHJhY2tfcGVhayA9IEZBTFNFOworICBmaWx0ZXItPmhhc19hbGJ1bV9nYWluID0gRkFMU0U7CisgIGZpbHRlci0+aGFzX2FsYnVtX3BlYWsgPSBGQUxTRTsKKworICBmaWx0ZXItPmN0eCA9IHJnX2FuYWx5c2lzX25ldyAoKTsKKyAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworICByZ19hbmFseXNpc19pbml0X3NpbGVuY2VfZGV0ZWN0aW9uIChmaWx0ZXItPmN0eCwgZ3N0X3JnX2FuYWx5c2lzX3Bvc3RfbWVzc2FnZSwKKyAgICAgIGZpbHRlcik7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworICBmaWx0ZXItPmFuYWx5emUgPSBOVUxMOworCisgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICJzdGFydGVkIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3JnX2FuYWx5c2lzX3NldF9jYXBzIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwgR3N0Q2FwcyAqIGluX2NhcHMsCisgICAgR3N0Q2FwcyAqIG91dF9jYXBzKQoreworICBHc3RSZ0FuYWx5c2lzICpmaWx0ZXIgPSBHU1RfUkdfQU5BTFlTSVMgKGJhc2UpOworICBHc3RBdWRpb0luZm8gaW5mbzsKKyAgZ2ludCByYXRlLCBjaGFubmVsczsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZmlsdGVyLT5jdHggIT0gTlVMTCwgRkFMU0UpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwKKyAgICAgICJzZXRfY2FwcyBpbiAlIiBHU1RfUFRSX0ZPUk1BVCAiIG91dCAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIGluX2NhcHMsIG91dF9jYXBzKTsKKworICBpZiAoIWdzdF9hdWRpb19pbmZvX2Zyb21fY2FwcyAoJmluZm8sIGluX2NhcHMpKQorICAgIGdvdG8gaW52YWxpZF9mb3JtYXQ7CisKKyAgcmF0ZSA9IEdTVF9BVURJT19JTkZPX1JBVEUgKCZpbmZvKTsKKworICBpZiAoIXJnX2FuYWx5c2lzX3NldF9zYW1wbGVfcmF0ZSAoZmlsdGVyLT5jdHgsIHJhdGUpKQorICAgIGdvdG8gaW52YWxpZF9mb3JtYXQ7CisKKyAgY2hhbm5lbHMgPSBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJmluZm8pOworCisgIGlmIChjaGFubmVscyA8IDEgfHwgY2hhbm5lbHMgPiAyKQorICAgIGdvdG8gaW52YWxpZF9mb3JtYXQ7CisKKyAgc3dpdGNoIChHU1RfQVVESU9fSU5GT19GT1JNQVQgKCZpbmZvKSkgeworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GMzI6CisgICAgICAvKiBUaGUgZGVwdGggaXMgbm90IHZhcmlhYmxlIGZvciBmbG9hdCBmb3JtYXRzIG9mIGNvdXJzZS4gIEl0IGp1c3QKKyAgICAgICAqIG1ha2VzIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb24gbmljZSBhbmQgc2ltcGxlIGlmIHRoZQorICAgICAgICogcmdfYW5hbHlzaXNfYW5hbHl6ZV8qIGZ1bmN0aW9ucyBoYXZlIGEgY29tbW9uIHNpZ25hdHVyZS4gKi8KKyAgICAgIGZpbHRlci0+ZGVwdGggPSBzaXplb2YgKGdmbG9hdCkgKiA4OworCisgICAgICBpZiAoY2hhbm5lbHMgPT0gMSkKKyAgICAgICAgZmlsdGVyLT5hbmFseXplID0gcmdfYW5hbHlzaXNfYW5hbHl6ZV9tb25vX2Zsb2F0OworICAgICAgZWxzZQorICAgICAgICBmaWx0ZXItPmFuYWx5emUgPSByZ19hbmFseXNpc19hbmFseXplX3N0ZXJlb19mbG9hdDsKKworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MxNjoKKyAgICAgIGZpbHRlci0+ZGVwdGggPSBzaXplb2YgKGdpbnQxNikgKiA4OworCisgICAgICBpZiAoY2hhbm5lbHMgPT0gMSkKKyAgICAgICAgZmlsdGVyLT5hbmFseXplID0gcmdfYW5hbHlzaXNfYW5hbHl6ZV9tb25vX2ludDE2OworICAgICAgZWxzZQorICAgICAgICBmaWx0ZXItPmFuYWx5emUgPSByZ19hbmFseXNpc19hbmFseXplX3N0ZXJlb19pbnQxNjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnb3RvIGludmFsaWRfZm9ybWF0OworICB9CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRXJyb3JzLiAqLworaW52YWxpZF9mb3JtYXQ6CisgIHsKKyAgICBmaWx0ZXItPmFuYWx5emUgPSBOVUxMOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChmaWx0ZXIsIENPUkUsIE5FR09USUFUSU9OLAorICAgICAgICAoIkludmFsaWQgaW5jb21pbmcgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGluX2NhcHMpLCAoTlVMTCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3JnX2FuYWx5c2lzX3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0UmdBbmFseXNpcyAqZmlsdGVyID0gR1NUX1JHX0FOQUxZU0lTIChiYXNlKTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGZpbHRlci0+Y3R4ICE9IE5VTEwsIEdTVF9GTE9XX0ZMVVNISU5HKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGZpbHRlci0+YW5hbHl6ZSAhPSBOVUxMLCBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRCk7CisKKyAgaWYgKGZpbHRlci0+c2tpcCkKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgR1NUX0xPR19PQkpFQ1QgKGZpbHRlciwgInByb2Nlc3NpbmcgYnVmZmVyIG9mIHNpemUgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICBtYXAuc2l6ZSk7CisKKyAgcmdfYW5hbHlzaXNfc3RhcnRfYnVmZmVyIChmaWx0ZXItPmN0eCwgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikpOworICBmaWx0ZXItPmFuYWx5emUgKGZpbHRlci0+Y3R4LCBtYXAuZGF0YSwgbWFwLnNpemUsIGZpbHRlci0+ZGVwdGgpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9yZ19hbmFseXNpc19zaW5rX2V2ZW50IChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UmdBbmFseXNpcyAqZmlsdGVyID0gR1NUX1JHX0FOQUxZU0lTIChiYXNlKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZmlsdGVyLT5jdHggIT0gTlVMTCwgVFJVRSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisKKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKGZpbHRlciwgInJlY2VpdmVkIEVPUyBldmVudCIpOworCisgICAgICBnc3RfcmdfYW5hbHlzaXNfaGFuZGxlX2VvcyAoZmlsdGVyKTsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKGZpbHRlciwgInBhc3Npbmcgb24gRU9TIGV2ZW50Iik7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9UQUc6CisgICAgeworICAgICAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisKKyAgICAgIC8qIFRoZSByZWZlcmVuY2UgdG8gdGhlIHRhZyBsaXN0IGlzIGJvcnJvd2VkLiAqLworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3RhZyAoZXZlbnQsICZ0YWdfbGlzdCk7CisgICAgICBnc3RfcmdfYW5hbHlzaXNfaGFuZGxlX3RhZ3MgKGZpbHRlciwgdGFnX2xpc3QpOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2lua19ldmVudCAoYmFzZSwgZXZlbnQpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9yZ19hbmFseXNpc19zdG9wIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSkKK3sKKyAgR3N0UmdBbmFseXNpcyAqZmlsdGVyID0gR1NUX1JHX0FOQUxZU0lTIChiYXNlKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZmlsdGVyLT5jdHggIT0gTlVMTCwgRkFMU0UpOworCisgIHJnX2FuYWx5c2lzX2Rlc3Ryb3kgKGZpbHRlci0+Y3R4KTsKKyAgZmlsdGVyLT5jdHggPSBOVUxMOworCisgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICJzdG9wcGVkIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIEZJWE1FOiBoYW5kbGUgZ2xvYmFsIHZzLiBzdHJlYW0tdGFncz8gKi8KK3N0YXRpYyB2b2lkCitnc3RfcmdfYW5hbHlzaXNfaGFuZGxlX3RhZ3MgKEdzdFJnQW5hbHlzaXMgKiBmaWx0ZXIsCisgICAgY29uc3QgR3N0VGFnTGlzdCAqIHRhZ19saXN0KQoreworICBnYm9vbGVhbiBhbGJ1bV9wcm9jZXNzaW5nID0gKGZpbHRlci0+bnVtX3RyYWNrcyA+IDApOworICBnZG91YmxlIGR1bW15OworCisgIGlmICghYWxidW1fcHJvY2Vzc2luZykKKyAgICBmaWx0ZXItPmlnbm9yZV90YWdzID0gRkFMU0U7CisKKyAgaWYgKGZpbHRlci0+c2tpcCAmJiBhbGJ1bV9wcm9jZXNzaW5nKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAiaWdub3JpbmcgdGFnIGV2ZW50OiBza2lwcGluZyBhbGJ1bSIpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmIChmaWx0ZXItPnNraXApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsICJpZ25vcmluZyB0YWcgZXZlbnQ6IHNraXBwaW5nIHRyYWNrIik7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKGZpbHRlci0+aWdub3JlX3RhZ3MpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsICJpZ25vcmluZyB0YWcgZXZlbnQ6IGNhbm5vdCBza2lwIGFueXdheXMiKTsKKyAgICByZXR1cm47CisgIH0KKworICBmaWx0ZXItPmhhc190cmFja19nYWluIHw9IGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwKKyAgICAgIEdTVF9UQUdfVFJBQ0tfR0FJTiwgJmR1bW15KTsKKyAgZmlsdGVyLT5oYXNfdHJhY2tfcGVhayB8PSBnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZSAodGFnX2xpc3QsCisgICAgICBHU1RfVEFHX1RSQUNLX1BFQUssICZkdW1teSk7CisgIGZpbHRlci0+aGFzX2FsYnVtX2dhaW4gfD0gZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKHRhZ19saXN0LAorICAgICAgR1NUX1RBR19BTEJVTV9HQUlOLCAmZHVtbXkpOworICBmaWx0ZXItPmhhc19hbGJ1bV9wZWFrIHw9IGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwKKyAgICAgIEdTVF9UQUdfQUxCVU1fUEVBSywgJmR1bW15KTsKKworICBpZiAoIShmaWx0ZXItPmhhc190cmFja19nYWluICYmIGZpbHRlci0+aGFzX3RyYWNrX3BlYWspKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAidHJhY2sgdGFncyBub3QgY29tcGxldGUgeWV0Iik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGFsYnVtX3Byb2Nlc3NpbmcgJiYgIShmaWx0ZXItPmhhc19hbGJ1bV9nYWluICYmIGZpbHRlci0+aGFzX2FsYnVtX3BlYWspKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAiYWxidW0gdGFncyBub3QgY29tcGxldGUgeWV0Iik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGZpbHRlci0+Zm9yY2VkKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLAorICAgICAgICAiZXhpc3RpbmcgdGFncyBhcmUgc3VmZmljaWVudCwgYnV0IHByb2Nlc3NpbmcgYW55d2F5IChmb3JjZWQpIik7CisgICAgcmV0dXJuOworICB9CisKKyAgZmlsdGVyLT5za2lwID0gVFJVRTsKKyAgcmdfYW5hbHlzaXNfcmVzZXQgKGZpbHRlci0+Y3R4KTsKKworICBpZiAoIWFsYnVtX3Byb2Nlc3NpbmcpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsCisgICAgICAgICJleGlzdGluZyB0YWdzIGFyZSBzdWZmaWNpZW50LCB3aWxsIG5vdCBwcm9jZXNzIHRoaXMgdHJhY2siKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsCisgICAgICAgICJleGlzdGluZyB0YWdzIGFyZSBzdWZmaWNpZW50LCB3aWxsIG5vdCBwcm9jZXNzIHRoaXMgYWxidW0iKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3JnX2FuYWx5c2lzX2hhbmRsZV9lb3MgKEdzdFJnQW5hbHlzaXMgKiBmaWx0ZXIpCit7CisgIGdib29sZWFuIGFsYnVtX3Byb2Nlc3NpbmcgPSAoZmlsdGVyLT5udW1fdHJhY2tzID4gMCk7CisgIGdib29sZWFuIGFsYnVtX2ZpbmlzaGVkID0gKGZpbHRlci0+bnVtX3RyYWNrcyA9PSAxKTsKKyAgZ2Jvb2xlYW4gYWxidW1fc2tpcHBpbmcgPSBhbGJ1bV9wcm9jZXNzaW5nICYmIGZpbHRlci0+c2tpcDsKKworICBmaWx0ZXItPmhhc190cmFja19nYWluID0gRkFMU0U7CisgIGZpbHRlci0+aGFzX3RyYWNrX3BlYWsgPSBGQUxTRTsKKworICBpZiAoYWxidW1fZmluaXNoZWQpIHsKKyAgICBmaWx0ZXItPmlnbm9yZV90YWdzID0gRkFMU0U7CisgICAgZmlsdGVyLT5za2lwID0gRkFMU0U7CisgICAgZmlsdGVyLT5oYXNfYWxidW1fZ2FpbiA9IEZBTFNFOworICAgIGZpbHRlci0+aGFzX2FsYnVtX3BlYWsgPSBGQUxTRTsKKyAgfSBlbHNlIGlmICghYWxidW1fc2tpcHBpbmcpIHsKKyAgICBmaWx0ZXItPnNraXAgPSBGQUxTRTsKKyAgfQorCisgIC8qIFdlIG1pZ2h0IGhhdmUganVzdCBmdWxseSBwcm9jZXNzZWQgYSB0cmFjayBiZWNhdXNlIGl0IGhhcworICAgKiBpbmNvbXBsZXRlIHRhZ3MuICBJZiB3ZSBkbyBhbGJ1bSBwcm9jZXNzaW5nIGFuZCBhbGxvdyBza2lwcGluZworICAgKiAobm90IGZvcmNlZCksIHByZXZlbnQgc3dpdGNoaW5nIHRvIHNraXBwaW5nIGlmIGEgbGF0ZXIgdHJhY2sgd2l0aAorICAgKiBmdWxsIHRhZ3MgY29tZXMgYWxvbmc6ICovCisgIGlmICghZmlsdGVyLT5mb3JjZWQgJiYgYWxidW1fcHJvY2Vzc2luZyAmJiAhYWxidW1fZmluaXNoZWQpCisgICAgZmlsdGVyLT5pZ25vcmVfdGFncyA9IFRSVUU7CisKKyAgaWYgKCFmaWx0ZXItPnNraXApIHsKKyAgICBHc3RUYWdMaXN0ICp0YWdfbGlzdCA9IE5VTEw7CisgICAgZ2Jvb2xlYW4gdHJhY2tfc3VjY2VzczsKKyAgICBnYm9vbGVhbiBhbGJ1bV9zdWNjZXNzID0gRkFMU0U7CisKKyAgICB0cmFja19zdWNjZXNzID0gZ3N0X3JnX2FuYWx5c2lzX3RyYWNrX3Jlc3VsdCAoZmlsdGVyLCAmdGFnX2xpc3QpOworCisgICAgaWYgKGFsYnVtX2ZpbmlzaGVkKQorICAgICAgYWxidW1fc3VjY2VzcyA9IGdzdF9yZ19hbmFseXNpc19hbGJ1bV9yZXN1bHQgKGZpbHRlciwgJnRhZ19saXN0KTsKKyAgICBlbHNlIGlmICghYWxidW1fcHJvY2Vzc2luZykKKyAgICAgIHJnX2FuYWx5c2lzX3Jlc2V0X2FsYnVtIChmaWx0ZXItPmN0eCk7CisKKyAgICBpZiAodHJhY2tfc3VjY2VzcyB8fCBhbGJ1bV9zdWNjZXNzKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAicG9zdGluZyB0YWcgbGlzdCB3aXRoIHJlc3VsdHMiKTsKKyAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ19saXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgICBHU1RfVEFHX1JFRkVSRU5DRV9MRVZFTCwgZmlsdGVyLT5yZWZlcmVuY2VfbGV2ZWwsIE5VTEwpOworICAgICAgLyogVGhpcyB0YWtlcyBvd25lcnNoaXAgb2Ygb3VyIHJlZmVyZW5jZSB0byB0aGUgbGlzdCAqLworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChHU1RfQkFTRV9UUkFOU0ZPUk1fU1JDX1BBRCAoZmlsdGVyKSwKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X3RhZyAodGFnX2xpc3QpKTsKKyAgICAgIHRhZ19saXN0ID0gTlVMTDsKKyAgICB9CisgIH0KKworICBpZiAoYWxidW1fcHJvY2Vzc2luZykgeworICAgIGZpbHRlci0+bnVtX3RyYWNrcy0tOworCisgICAgaWYgKCFhbGJ1bV9maW5pc2hlZCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAiYWxidW0gbm90IGZpbmlzaGVkIHlldCAobnVtLXRyYWNrcyBpcyBub3cgJXUpIiwKKyAgICAgICAgICBmaWx0ZXItPm51bV90cmFja3MpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsICJhbGJ1bSBmaW5pc2hlZCAobnVtLXRyYWNrcyBpcyBub3cgMCkiKTsKKyAgICB9CisgIH0KKworICBpZiAoYWxidW1fcHJvY2Vzc2luZykKKyAgICBnX29iamVjdF9ub3RpZnkgKEdfT0JKRUNUIChmaWx0ZXIpLCAibnVtLXRyYWNrcyIpOworfQorCisvKiBGSVhNRTogcmV0dXJuIHRhZyBsaXN0IChsaXN0cz8pIGJhc2VkIG9uIGlucHV0IHRhZ3MuLiAqLworc3RhdGljIGdib29sZWFuCitnc3RfcmdfYW5hbHlzaXNfdHJhY2tfcmVzdWx0IChHc3RSZ0FuYWx5c2lzICogZmlsdGVyLCBHc3RUYWdMaXN0ICoqIHRhZ19saXN0KQoreworICBnYm9vbGVhbiB0cmFja19zdWNjZXNzOworICBnZG91YmxlIHRyYWNrX2dhaW4sIHRyYWNrX3BlYWs7CisKKyAgdHJhY2tfc3VjY2VzcyA9IHJnX2FuYWx5c2lzX3RyYWNrX3Jlc3VsdCAoZmlsdGVyLT5jdHgsICZ0cmFja19nYWluLAorICAgICAgJnRyYWNrX3BlYWspOworCisgIGlmICh0cmFja19zdWNjZXNzKSB7CisgICAgdHJhY2tfZ2FpbiArPSBmaWx0ZXItPnJlZmVyZW5jZV9sZXZlbCAtIFJHX1JFRkVSRU5DRV9MRVZFTDsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGZpbHRlciwgInRyYWNrIGdhaW4gaXMgJSsuMmYgZEIsIHBlYWsgJS42ZiIsIHRyYWNrX2dhaW4sCisgICAgICAgIHRyYWNrX3BlYWspOworICB9IGVsc2UgeworICAgIEdTVF9JTkZPX09CSkVDVCAoZmlsdGVyLCAidHJhY2sgd2FzIHRvbyBzaG9ydCB0byBhbmFseXplIik7CisgIH0KKworICBpZiAodHJhY2tfc3VjY2VzcykgeworICAgIGlmICgqdGFnX2xpc3QgPT0gTlVMTCkKKyAgICAgICp0YWdfbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAoKnRhZ19saXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgR1NUX1RBR19UUkFDS19QRUFLLCB0cmFja19wZWFrLCBHU1RfVEFHX1RSQUNLX0dBSU4sIHRyYWNrX2dhaW4sIE5VTEwpOworICB9CisKKyAgcmV0dXJuIHRyYWNrX3N1Y2Nlc3M7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3JnX2FuYWx5c2lzX2FsYnVtX3Jlc3VsdCAoR3N0UmdBbmFseXNpcyAqIGZpbHRlciwgR3N0VGFnTGlzdCAqKiB0YWdfbGlzdCkKK3sKKyAgZ2Jvb2xlYW4gYWxidW1fc3VjY2VzczsKKyAgZ2RvdWJsZSBhbGJ1bV9nYWluLCBhbGJ1bV9wZWFrOworCisgIGFsYnVtX3N1Y2Nlc3MgPSByZ19hbmFseXNpc19hbGJ1bV9yZXN1bHQgKGZpbHRlci0+Y3R4LCAmYWxidW1fZ2FpbiwKKyAgICAgICZhbGJ1bV9wZWFrKTsKKworICBpZiAoYWxidW1fc3VjY2VzcykgeworICAgIGFsYnVtX2dhaW4gKz0gZmlsdGVyLT5yZWZlcmVuY2VfbGV2ZWwgLSBSR19SRUZFUkVOQ0VfTEVWRUw7CisgICAgR1NUX0lORk9fT0JKRUNUIChmaWx0ZXIsICJhbGJ1bSBnYWluIGlzICUrLjJmIGRCLCBwZWFrICUuNmYiLCBhbGJ1bV9nYWluLAorICAgICAgICBhbGJ1bV9wZWFrKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGZpbHRlciwgImFsYnVtIHdhcyB0b28gc2hvcnQgdG8gYW5hbHl6ZSIpOworICB9CisKKyAgaWYgKGFsYnVtX3N1Y2Nlc3MpIHsKKyAgICBpZiAoKnRhZ19saXN0ID09IE5VTEwpCisgICAgICAqdGFnX2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAgIGdzdF90YWdfbGlzdF9hZGQgKCp0YWdfbGlzdCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsCisgICAgICAgIEdTVF9UQUdfQUxCVU1fUEVBSywgYWxidW1fcGVhaywgR1NUX1RBR19BTEJVTV9HQUlOLCBhbGJ1bV9nYWluLCBOVUxMKTsKKyAgfQorCisgIHJldHVybiBhbGJ1bV9zdWNjZXNzOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3JlcGxheWdhaW4vZ3N0cmdhbmFseXNpcy5oIGIvZ3N0L3JlcGxheWdhaW4vZ3N0cmdhbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNjhlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmgKQEAgLTAsMCArMSw4NiBAQAorLyogR1N0cmVhbWVyIFJlcGxheUdhaW4gYW5hbHlzaXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVuZSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorICoKKyAqIGdzdHJnYW5hbHlzaXMuaDogRWxlbWVudCB0aGF0IHBlcmZvcm1zIHRoZSBSZXBsYXlHYWluIGFuYWx5c2lzCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfX0dTVF9SR19BTkFMWVNJU19IX18KKyNkZWZpbmUgX19HU1RfUkdfQU5BTFlTSVNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorCisjaW5jbHVkZSAicmdhbmFseXNpcy5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUkdfQU5BTFlTSVMgXAorICAoZ3N0X3JnX2FuYWx5c2lzX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SR19BTkFMWVNJUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JHX0FOQUxZU0lTLEdzdFJnQW5hbHlzaXMpKQorI2RlZmluZSBHU1RfUkdfQU5BTFlTSVNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUkdfQU5BTFlTSVMsR3N0UmdBbmFseXNpc0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JHX0FOQUxZU0lTKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUkdfQU5BTFlTSVMpKQorI2RlZmluZSBHU1RfSVNfUkdfQU5BTFlTSVNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUkdfQU5BTFlTSVMpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFJnQW5hbHlzaXMgR3N0UmdBbmFseXNpczsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSZ0FuYWx5c2lzQ2xhc3MgR3N0UmdBbmFseXNpc0NsYXNzOworCisvKioKKyAqIEdzdFJnQW5hbHlzaXM6CisgKgorICogT3BhcXVlIGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdFJnQW5hbHlzaXMKK3sKKyAgR3N0QmFzZVRyYW5zZm9ybSBlbGVtZW50OworCisgIC8qPCBwcml2YXRlID4qLworCisgIFJnQW5hbHlzaXNDdHggKmN0eDsKKyAgdm9pZCAoKmFuYWx5emUpIChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBnY29uc3Rwb2ludGVyIGRhdGEsIGdzaXplIHNpemUsCisgICAgICBndWludCBkZXB0aCk7CisgIGdpbnQgZGVwdGg7CisKKyAgLyogUHJvcGVydHkgdmFsdWVzLiAqLworICBndWludCBudW1fdHJhY2tzOworICBnZG91YmxlIHJlZmVyZW5jZV9sZXZlbDsKKyAgZ2Jvb2xlYW4gZm9yY2VkOworICBnYm9vbGVhbiBtZXNzYWdlOworCisgIC8qIFN0YXRlIG1hY2hpbmVyeSBmb3Igc2tpcHBpbmcuICovCisgIGdib29sZWFuIGlnbm9yZV90YWdzOworICBnYm9vbGVhbiBza2lwOworICBnYm9vbGVhbiBoYXNfdHJhY2tfZ2FpbjsKKyAgZ2Jvb2xlYW4gaGFzX3RyYWNrX3BlYWs7CisgIGdib29sZWFuIGhhc19hbGJ1bV9nYWluOworICBnYm9vbGVhbiBoYXNfYWxidW1fcGVhazsKK307CisKK3N0cnVjdCBfR3N0UmdBbmFseXNpc0NsYXNzCit7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcmdfYW5hbHlzaXNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUkdfQU5BTFlTSVNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYyBiL2dzdC9yZXBsYXlnYWluL2dzdHJnbGltaXRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMDRlN2QKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYwpAQCAtMCwwICsxLDE5OSBAQAorLyogR1N0cmVhbWVyIFJlcGxheUdhaW4gbGltaXRlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZW5lIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisgKiAKKyAqIGdzdHJnbGltaXRlci5jOiBFbGVtZW50IHRvIGFwcGx5IHNpZ25hbCBjb21wcmVzc2lvbiB0byByYXcgYXVkaW8gZGF0YQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJnbGltaXRlcgorICogQHNlZV9hbHNvOiAjR3N0UmdWb2x1bWUKKyAqCisgKiBUaGlzIGVsZW1lbnQgYXBwbGllcyBzaWduYWwgY29tcHJlc3Npb24vbGltaXRpbmcgdG8gcmF3IGF1ZGlvIGRhdGEuICBJdAorICogcGVyZm9ybXMgc3RyaWN0IGhhcmQgbGltaXRpbmcgd2l0aCBzb2Z0LWtuZWUgY2hhcmFjdGVyaXN0aWNzLCB1c2luZyBhCisgKiB0aHJlc2hvbGQgb2YgLTYgZEIuICBUaGlzIHR5cGUgb2YgZmlsdGVyIGlzIG1lbnRpb25lZCBpbiB0aGUgcHJvcG9zZWQgPHVsaW5rCisgKiB1cmw9Imh0dHA6Ly9yZXBsYXlnYWluLm9yZyI+UmVwbGF5R2FpbiBzdGFuZGFyZDwvdWxpbms+LgorICogCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj1maWxlbmFtZS5leHQgISBkZWNvZGViaW4gISBhdWRpb2NvbnZlcnQgXAorICogICAgICAgICAgICAhIHJndm9sdW1lIHByZS1hbXA9Ni4wIGhlYWRyb29tPTEwLjAgISByZ2xpbWl0ZXIgXAorICogICAgICAgICAgICAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhbHNhc2luaworICogXXxQbGF5YmFjayBvZiBhIGZpbGUKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgImdzdHJnbGltaXRlci5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfcmdfbGltaXRlcl9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfcmdfbGltaXRlcl9kZWJ1ZworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9FTkFCTEVELAorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoRjMyKSAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSB7IGludGVybGVhdmVkLCBub24taW50ZXJsZWF2ZWQgfSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbMSwgTUFYXSwgIiAicmF0ZSA9IChpbnQpIFsxLCBNQVhdIikpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChGMzIpICIsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIHsgaW50ZXJsZWF2ZWQsIG5vbi1pbnRlcmxlYXZlZH0sICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgWzEsIE1BWF0sICIgInJhdGUgPSAoaW50KSBbMSwgTUFYXSIpKTsKKworI2RlZmluZSBnc3RfcmdfbGltaXRlcl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSZ0xpbWl0ZXIsIGdzdF9yZ19saW1pdGVyLCBHU1RfVFlQRV9CQVNFX1RSQU5TRk9STSk7CisKK3N0YXRpYyB2b2lkIGdzdF9yZ19saW1pdGVyX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9yZ19saW1pdGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3JnX2xpbWl0ZXJfdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwKKyAgICBHc3RCdWZmZXIgKiBidWYpOworCitzdGF0aWMgdm9pZAorZ3N0X3JnX2xpbWl0ZXJfY2xhc3NfaW5pdCAoR3N0UmdMaW1pdGVyQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqdHJhbnNfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9yZ19saW1pdGVyX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3JnX2xpbWl0ZXJfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRU5BQkxFRCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZW5hYmxlZCIsICJFbmFibGVkIiwgIkVuYWJsZSBwcm9jZXNzaW5nIiwgVFJVRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICB0cmFuc19jbGFzcyA9IEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAoa2xhc3MpOworICB0cmFuc19jbGFzcy0+dHJhbnNmb3JtX2lwID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9yZ19saW1pdGVyX3RyYW5zZm9ybV9pcCk7CisgIHRyYW5zX2NsYXNzLT5wYXNzdGhyb3VnaF9vbl9zYW1lX2NhcHMgPSBGQUxTRTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNyY19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzaW5rX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiUmVwbGF5R2FpbiBsaW1pdGVyIiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L0F1ZGlvIiwKKyAgICAgICJBcHBseSBzaWduYWwgY29tcHJlc3Npb24gdG8gcmF3IGF1ZGlvIGRhdGEiLAorICAgICAgIlJlblx4YzNceGE5IFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9yZ19saW1pdGVyX2RlYnVnLCAicmdsaW1pdGVyIiwgMCwKKyAgICAgICJSZXBsYXlHYWluIGxpbWl0ZXIgZWxlbWVudCIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JnX2xpbWl0ZXJfaW5pdCAoR3N0UmdMaW1pdGVyICogZmlsdGVyKQoreworICBHc3RCYXNlVHJhbnNmb3JtICpiYXNlID0gR1NUX0JBU0VfVFJBTlNGT1JNIChmaWx0ZXIpOworCisgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfcGFzc3Rocm91Z2ggKGJhc2UsIEZBTFNFKTsKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9nYXBfYXdhcmUgKGJhc2UsIFRSVUUpOworCisgIGZpbHRlci0+ZW5hYmxlZCA9IFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcmdfbGltaXRlcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UmdMaW1pdGVyICpmaWx0ZXIgPSBHU1RfUkdfTElNSVRFUiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfRU5BQkxFRDoKKyAgICAgIGZpbHRlci0+ZW5hYmxlZCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfcGFzc3Rocm91Z2ggKEdTVF9CQVNFX1RSQU5TRk9STSAoZmlsdGVyKSwKKyAgICAgICAgICAhZmlsdGVyLT5lbmFibGVkKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9yZ19saW1pdGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSZ0xpbWl0ZXIgKmZpbHRlciA9IEdTVF9SR19MSU1JVEVSIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9FTkFCTEVEOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIGZpbHRlci0+ZW5hYmxlZCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKyNkZWZpbmUgTElNSVQgMS4wCisjZGVmaW5lIFRIUkVTIDAuNSAgICAgICAgICAgICAgIC8qIGNhLiAtNiBkQiAqLworI2RlZmluZSBDT01QTCAwLjUgICAgICAgICAgICAgICAvKiBMSU1JVCAtIFRIUkVTSCAqLworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3JnX2xpbWl0ZXJfdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RSZ0xpbWl0ZXIgKmZpbHRlciA9IEdTVF9SR19MSU1JVEVSIChiYXNlKTsKKyAgZ2Zsb2F0ICppbnB1dDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50IGNvdW50OworICBndWludCBpOworCisgIGlmICghZmlsdGVyLT5lbmFibGVkKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICBpZiAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfR0FQKSkKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgaW5wdXQgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBjb3VudCA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikgLyBzaXplb2YgKGdmbG9hdCk7CisKKyAgZm9yIChpID0gY291bnQ7IGktLTspIHsKKyAgICBpZiAoKmlucHV0ID4gVEhSRVMpCisgICAgICAqaW5wdXQgPSB0YW5oZiAoKCppbnB1dCAtIFRIUkVTKSAvIENPTVBMKSAqIENPTVBMICsgVEhSRVM7CisgICAgZWxzZSBpZiAoKmlucHV0IDwgLVRIUkVTKQorICAgICAgKmlucHV0ID0gdGFuaGYgKCgqaW5wdXQgKyBUSFJFUykgLyBDT01QTCkgKiBDT01QTCAtIFRIUkVTOworICAgIGlucHV0Kys7CisgIH0KKworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KZGlmZiAtLWdpdCBhL2dzdC9yZXBsYXlnYWluL2dzdHJnbGltaXRlci5oIGIvZ3N0L3JlcGxheWdhaW4vZ3N0cmdsaW1pdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNiZDgwNAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9yZXBsYXlnYWluL2dzdHJnbGltaXRlci5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qIEdTdHJlYW1lciBSZXBsYXlHYWluIGxpbWl0ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVuZSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorICoKKyAqIGdzdHJnbGltaXRlci5oOiBFbGVtZW50IHRvIGFwcGx5IHNpZ25hbCBjb21wcmVzc2lvbiB0byByYXcgYXVkaW8gZGF0YQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX19HU1RfUkdfTElNSVRFUl9IX18KKyNkZWZpbmUgX19HU1RfUkdfTElNSVRFUl9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisKKyNkZWZpbmUgR1NUX1RZUEVfUkdfTElNSVRFUiBcCisgIChnc3RfcmdfbGltaXRlcl9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUkdfTElNSVRFUihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JHX0xJTUlURVIsR3N0UmdMaW1pdGVyKSkKKyNkZWZpbmUgR1NUX1JHX0xJTUlURVJfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUkdfTElNSVRFUixHc3RSZ0xpbWl0ZXJDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SR19MSU1JVEVSKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUkdfTElNSVRFUikpCisjZGVmaW5lIEdTVF9JU19SR19MSU1JVEVSX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JHX0xJTUlURVIpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UmdMaW1pdGVyIEdzdFJnTGltaXRlcjsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSZ0xpbWl0ZXJDbGFzcyBHc3RSZ0xpbWl0ZXJDbGFzczsKKworLyoqCisgKiBHc3RSZ0xpbWl0ZXI6CisgKgorICogT3BhcXVlIGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdFJnTGltaXRlcgoreworICBHc3RCYXNlVHJhbnNmb3JtIGVsZW1lbnQ7CisKKyAgLyo8IHByaXZhdGUgPiovCisKKyAgZ2Jvb2xlYW4gZW5hYmxlZDsKK307CisKK3N0cnVjdCBfR3N0UmdMaW1pdGVyQ2xhc3MKK3sKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9yZ19saW1pdGVyX2dldF90eXBlICh2b2lkKTsKKworI2VuZGlmIC8qIF9fR1NUX1JHX0xJTUlURVJfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcmVwbGF5Z2Fpbi9nc3RyZ3ZvbHVtZS5jIGIvZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzRmMjgxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYwpAQCAtMCwwICsxLDY4NiBAQAorLyogR1N0cmVhbWVyIFJlcGxheUdhaW4gdm9sdW1lIGFkanVzdG1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVuZSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorICogCisgKiBnc3RyZ3ZvbHVtZS5jOiBFbGVtZW50IHRvIGFwcGx5IFJlcGxheUdhaW4gdm9sdW1lIGFkanVzdG1lbnQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1yZ3ZvbHVtZQorICogQHNlZV9hbHNvOiAjR3N0UmdMaW1pdGVyLCAjR3N0UmdBbmFseXNpcworICoKKyAqIFRoaXMgZWxlbWVudCBhcHBsaWVzIHZvbHVtZSBjaGFuZ2VzIHRvIHN0cmVhbXMgYXMgbGluZWQgb3V0IGluIHRoZSBwcm9wb3NlZAorICogPHVsaW5rIHVybD0iaHR0cDovL3JlcGxheWdhaW4ub3JnIj5SZXBsYXlHYWluIHN0YW5kYXJkPC91bGluaz4uICBJdAorICogaW50ZXJwcmV0cyB0aGUgUmVwbGF5R2FpbiBtZXRhIGRhdGEgdGFncyBhbmQgY2FycmllcyBvdXQgdGhlIGFkanVzdG1lbnQgKGJ5CisgKiB1c2luZyBhIHZvbHVtZSBlbGVtZW50IGludGVybmFsbHkpLiAgVGhlIHJlbGV2YW50IHRhZ3MgYXJlOgorICogPGl0ZW1pemVkbGlzdD4KKyAqIDxsaXN0aXRlbT4jR1NUX1RBR19UUkFDS19HQUlOPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4jR1NUX1RBR19UUkFDS19QRUFLPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4jR1NUX1RBR19BTEJVTV9HQUlOPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4jR1NUX1RBR19BTEJVTV9QRUFLPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4jR1NUX1RBR19SRUZFUkVOQ0VfTEVWRUw8L2xpc3RpdGVtPgorICogPC9pdGVtaXplZGxpc3Q+CisgKiBUaGUgaW5mb3JtYXRpb24gY2FycmllZCBieSB0aGVzZSB0YWdzIG11c3QgaGF2ZSBiZWVuIGNhbGN1bGF0ZWQgYmVmb3JlaGFuZCBieQorICogcGVyZm9ybWluZyB0aGUgUmVwbGF5R2FpbiBhbmFseXNpcy4gIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIDxsaW5rCisgKiBsaW5rZW5kPSJHc3RSZ0FuYWx5c2lzIj5yZ2FuYWx5c2lzPC9saW5rPiBlbGVtZW50LgorICogCisgKiBUaGUgc2lnbmFsIGNvbXByZXNzaW9uL2xpbWl0aW5nIHJlY29tbWVuZGF0aW9ucyBvdXRsaW5lZCBpbiB0aGUgcHJvcG9zZWQKKyAqIHN0YW5kYXJkIGFyZSBub3QgaW1wbGVtZW50ZWQgYnkgdGhpcyBlbGVtZW50LiAgVGhpcyBoYXMgdG8gYmUgaGFuZGxlZCBieQorICogc2VwYXJhdGUgZWxlbWVudHMgYmVjYXVzZSBhcHBsaWNhdGlvbnMgbWlnaHQgd2FudCB0byBoYXZlIGFkZGl0aW9uYWwgZmlsdGVycworICogYmV0d2VlbiB0aGUgdm9sdW1lIGFkanVzdG1lbnQgYW5kIHRoZSBsaW1pdGluZyBzdGFnZS4gIEEgYmFzaWMgbGltaXRlciBpcworICogaW5jbHVkZWQgd2l0aCB0aGlzIHBsdWdpbjogVGhlIDxsaW5rIGxpbmtlbmQ9IkdzdFJnTGltaXRlciI+cmdsaW1pdGVyPC9saW5rPgorICogZWxlbWVudCBhcHBsaWVzIC02IGRCIGhhcmQgbGltaXRpbmcgYXMgbWVudGlvbmVkIGluIHRoZSBSZXBsYXlHYWluIHN0YW5kYXJkLgorICogCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj1maWxlbmFtZS5leHQgISBkZWNvZGViaW4gISBhdWRpb2NvbnZlcnQgXAorICogICAgICEgcmd2b2x1bWUgISBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgYWxzYXNpbmsKKyAqIF18IFBsYXliYWNrIG9mIGEgZmlsZQorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3BidXRpbHMvcGJ1dGlscy5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImdzdHJndm9sdW1lLmgiCisjaW5jbHVkZSAicmVwbGF5Z2Fpbi5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3Rfcmdfdm9sdW1lX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9yZ192b2x1bWVfZGVidWcKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQUxCVU1fTU9ERSwKKyAgUFJPUF9IRUFEUk9PTSwKKyAgUFJPUF9QUkVfQU1QLAorICBQUk9QX0ZBTExCQUNLX0dBSU4sCisgIFBST1BfVEFSR0VUX0dBSU4sCisgIFBST1BfUkVTVUxUX0dBSU4KK307CisKKyNkZWZpbmUgREVGQVVMVF9BTEJVTV9NT0RFIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9IRUFEUk9PTSAwLjAKKyNkZWZpbmUgREVGQVVMVF9QUkVfQU1QIDAuMAorI2RlZmluZSBERUZBVUxUX0ZBTExCQUNLX0dBSU4gMC4wCisKKyNkZWZpbmUgREJfVE9fTElORUFSKHgpIHBvdyAoMTAuLCAoeCkgLyAyMC4pCisjZGVmaW5lIExJTkVBUl9UT19EQih4KSAoMjAuICogbG9nMTAgKHgpKQorCisjZGVmaW5lIEdBSU5fRk9STUFUICIrLjAyZiBkQiIKKyNkZWZpbmUgUEVBS19GT1JNQVQgIi4wNmYiCisKKyNkZWZpbmUgVkFMSURfR0FJTih4KSAoKHgpID4gLTYwLjAwICYmICh4KSA8IDYwLjAwKQorI2RlZmluZSBWQUxJRF9QRUFLKHgpICgoeCkgPiAwLikKKworLyogU2FtZSB0ZW1wbGF0ZSBjYXBzIGFzIEdzdFZvbHVtZSwgZm9yIEkgZG9uJ3QgbGlrZSBoYXZpbmcganVzdCBBTlkgY2Fwcy4gKi8KKworI2RlZmluZSBGT1JNQVQgInsgIkdTVF9BVURJT19ORShGMzIpIiwiR1NUX0FVRElPX05FKFMxNikiIH0iCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgRk9STUFUICIsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIHsgaW50ZXJsZWF2ZWQsIG5vbi1pbnRlcmxlYXZlZCB9LCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxLCBNQVggXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIE1BWCBdIikpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEZPUk1BVCAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSB7IGludGVybGVhdmVkLCBub24taW50ZXJsZWF2ZWQgfSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIgImNoYW5uZWxzID0gKGludCkgWyAxLCBNQVggXSIpKTsKKworI2RlZmluZSBnc3Rfcmdfdm9sdW1lX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJnVm9sdW1lLCBnc3Rfcmdfdm9sdW1lLCBHU1RfVFlQRV9CSU4pOworCitzdGF0aWMgdm9pZCBnc3Rfcmdfdm9sdW1lX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9yZ192b2x1bWVfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3JnX3ZvbHVtZV9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9yZ192b2x1bWVfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfcmdfdm9sdW1lX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCitzdGF0aWMgR3N0RXZlbnQgKmdzdF9yZ192b2x1bWVfdGFnX2V2ZW50IChHc3RSZ1ZvbHVtZSAqIHNlbGYsIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIHZvaWQgZ3N0X3JnX3ZvbHVtZV9yZXNldCAoR3N0UmdWb2x1bWUgKiBzZWxmKTsKK3N0YXRpYyB2b2lkIGdzdF9yZ192b2x1bWVfdXBkYXRlX2dhaW4gKEdzdFJnVm9sdW1lICogc2VsZik7CitzdGF0aWMgaW5saW5lIHZvaWQgZ3N0X3JnX3ZvbHVtZV9kZXRlcm1pbmVfZ2FpbiAoR3N0UmdWb2x1bWUgKiBzZWxmLAorICAgIGdkb3VibGUgKiB0YXJnZXRfZ2FpbiwgZ2RvdWJsZSAqIHJlc3VsdF9nYWluKTsKKworc3RhdGljIHZvaWQKK2dzdF9yZ192b2x1bWVfY2xhc3NfaW5pdCAoR3N0UmdWb2x1bWVDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKyAgR3N0QmluQ2xhc3MgKmJpbl9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3Rfcmdfdm9sdW1lX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3JnX3ZvbHVtZV9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3Rfcmdfdm9sdW1lX2Rpc3Bvc2U7CisKKyAgLyoqCisgICAqIEdzdFJnVm9sdW1lOmFsYnVtLW1vZGU6CisgICAqCisgICAqIFdoZXRoZXIgdG8gcHJlZmVyIGFsYnVtIGdhaW4gb3ZlciB0cmFjayBnYWluLgorICAgKgorICAgKiBJZiBzZXQgdG8gJVRSVUUsIHVzZSBhbGJ1bSBnYWluIGluc3RlYWQgb2YgdHJhY2sgZ2FpbiBpZiBib3RoIGFyZQorICAgKiBhdmFpbGFibGUuICBUaGlzIGtlZXBzIHRoZSByZWxhdGl2ZSBsb3VkbmVzcyBsZXZlbHMgb2YgdHJhY2tzIGZyb20gdGhlIHNhbWUKKyAgICogYWxidW0gaW50YWN0LgorICAgKgorICAgKiBJZiBzZXQgdG8gJUZBTFNFLCB0cmFjayBtb2RlIGlzIHVzZWQgaW5zdGVhZC4gIFRoaXMgZWZmZWN0aXZlbHkgbGVhZHMgdG8KKyAgICogbW9yZSBleHRlbnNpdmUgbm9ybWFsaXphdGlvbi4KKyAgICoKKyAgICogSWYgYWxidW0gbW9kZSBpcyBlbmFibGVkIGJ1dCB0aGUgYWxidW0gZ2FpbiB0YWcgaXMgYWJzZW50IGluIHRoZSBzdHJlYW0sCisgICAqIHRoZSB0cmFjayBnYWluIGlzIHVzZWQgaW5zdGVhZC4gIElmIGJvdGggZ2FpbiB0YWdzIGFyZSBtaXNzaW5nLCB0aGUgdmFsdWUKKyAgICogb2YgdGhlICNHc3RSZ1ZvbHVtZTpmYWxsYmFjay1nYWluIHByb3BlcnR5IGlzIHVzZWQgaW5zdGVhZC4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQUxCVU1fTU9ERSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiYWxidW0tbW9kZSIsICJBbGJ1bSBtb2RlIiwKKyAgICAgICAgICAiUHJlZmVyIGFsYnVtIG92ZXIgdHJhY2sgZ2FpbiIsIERFRkFVTFRfQUxCVU1fTU9ERSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgLyoqCisgICAqIEdzdFJnVm9sdW1lOmhlYWRyb29tOgorICAgKgorICAgKiBFeHRyYSBoZWFkcm9vbSBbZEJdLiAgVGhpcyBjb250cm9scyB0aGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBvdXRwdXQgY2FuCisgICAqIGV4Y2VlZCBkaWdpdGFsIGZ1bGwgc2NhbGUuCisgICAqCisgICAqIE9ubHkgc2V0IHRoaXMgdG8gYSB2YWx1ZSBncmVhdGVyIHRoYW4gMC4wIGlmIHNpZ25hbCBjb21wcmVzc2lvbi9saW1pdGluZyBvZgorICAgKiBhIHN1aXRhYmxlIGZvcm0gaXMgYXBwbGllZCB0byB0aGUgb3V0cHV0IChvciBvdXRwdXQgaXMgYnJvdWdodCBpbnRvIHRoZQorICAgKiBjb3JyZWN0IHJhbmdlIGJ5IHNvbWUgb3RoZXIgdHJhbnNmb3JtYXRpb24pLgorICAgKgorICAgKiBUaGlzIGVsZW1lbnQgaW50ZXJuYWxseSB1c2VzIGEgdm9sdW1lIGVsZW1lbnQsIHdoaWNoIGFsc28gc3VwcG9ydHMKKyAgICogb3BlcmF0aW5nIG9uIGludGVnZXIgYXVkaW8gZm9ybWF0cy4gIFRoZXNlIGZvcm1hdHMgZG8gbm90IGFsbG93IGV4Y2VlZGluZworICAgKiBkaWdpdGFsIGZ1bGwgc2NhbGUuICBJZiBleHRyYSBoZWFkcm9vbSBpcyB1c2VkLCBtYWtlIHN1cmUgdGhhdCB0aGUgcmF3CisgICAqIGF1ZGlvIGRhdGEgZm9ybWF0IGlzIGZsb2F0aW5nIHBvaW50IChGMzIpLiAgT3RoZXJ3aXNlLAorICAgKiBjbGlwcGluZyBkaXN0b3J0aW9uIG1pZ2h0IGJlIGludHJvZHVjZWQgYXMgcGFydCBvZiB0aGUgdm9sdW1lIGFkanVzdG1lbnQKKyAgICogaXRzZWxmLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9IRUFEUk9PTSwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJoZWFkcm9vbSIsICJIZWFkcm9vbSIsICJFeHRyYSBoZWFkcm9vbSBbZEJdIiwKKyAgICAgICAgICAwLiwgNjAuLCBERUZBVUxUX0hFQURST09NLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0UmdWb2x1bWU6cHJlLWFtcDoKKyAgICoKKyAgICogQWRkaXRpb25hbCBnYWluIHRvIGFwcGx5IGdsb2JhbGx5IFtkQl0uICBUaGlzIGNvbnRyb2xzIHRoZSB0cmFkZS1vZmYKKyAgICogYmV0d2VlbiB1bmlmb3JtaXR5IG9mIG5vcm1hbGl6YXRpb24gYW5kIHV0aWxpemF0aW9uIG9mIGF2YWlsYWJsZSBkeW5hbWljCisgICAqIHJhbmdlLgorICAgKgorICAgKiBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgdmFsdWUgaXMgMCBkQiBiZWNhdXNlIHRoZSBSZXBsYXlHYWluIHJlZmVyZW5jZSB2YWx1ZQorICAgKiB3YXMgYWRqdXN0ZWQgYnkgKzYgZEIgKGZyb20gODMgdG8gODkgZEIpLiAgQXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLCB0aGUKKyAgICogPHVsaW5rIHVybD0iaHR0cDovL3JlcGxheWdhaW4ub3JnIj53ZWJwYWdlPC91bGluaz4gaXMgc3RpbGwgb3V0ZGF0ZWQgYW5kCisgICAqIGRvZXMgbm90IHJlZmxlY3QgdGhpcyBjaGFuZ2UgaG93ZXZlci4gIFdoZXJlIHRoZSBvcmlnaW5hbCBwcm9wb3NhbCBzdGF0ZXMKKyAgICogdGhhdCBhIHByb3BlciBkZWZhdWx0IHByZS1hbXAgdmFsdWUgaXMgKzYgZEIsIHRoaXMgdHJhbnNsYXRlcyB0byB0aGUgdXNlZCAwCisgICAqIGRCLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QUkVfQU1QLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoInByZS1hbXAiLCAiUHJlLWFtcCIsICJFeHRyYSBnYWluIFtkQl0iLAorICAgICAgICAgIC02MC4sIDYwLiwgREVGQVVMVF9QUkVfQU1QLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0UmdWb2x1bWU6ZmFsbGJhY2stZ2FpbjoKKyAgICoKKyAgICogRmFsbGJhY2sgZ2FpbiBbZEJdIGZvciBzdHJlYW1zIG1pc3NpbmcgUmVwbGF5R2FpbiB0YWdzLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9GQUxMQkFDS19HQUlOLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoImZhbGxiYWNrLWdhaW4iLCAiRmFsbGJhY2sgZ2FpbiIsCisgICAgICAgICAgIkdhaW4gZm9yIHN0cmVhbXMgbWlzc2luZyB0YWdzIFtkQl0iLAorICAgICAgICAgIC02MC4sIDYwLiwgREVGQVVMVF9GQUxMQkFDS19HQUlOLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0UmdWb2x1bWU6cmVzdWx0LWdhaW46CisgICAqCisgICAqIEFwcGxpZWQgZ2FpbiBbZEJdLiAgVGhpcyBnYWluIGlzIGFwcGxpZWQgdG8gcHJvY2Vzc2VkIGJ1ZmZlciBkYXRhLgorICAgKgorICAgKiBUaGlzIGlzIHNldCB0byB0aGUgI0dzdFJnVm9sdW1lOnRhcmdldC1nYWluIGlmIGFtcGxpZmljYXRpb24gYnkgdGhhdCBhbW91bnQKKyAgICogY2FuIGJlIGFwcGxpZWQgc2FmZWx5LiAiU2FmZWx5IiBtZWFucyB0aGF0IHRoZSB2b2x1bWUgYWRqdXN0bWVudCBkb2VzIG5vdAorICAgKiBpbmZsaWN0IGNsaXBwaW5nIGRpc3RvcnRpb24uICBTaG91bGQgdGhpcyBub3QgYmUgdGhlIGNhc2UsIHRoZSByZXN1bHQgZ2FpbgorICAgKiBpcyBzZXQgdG8gYW4gYXBwcm9wcmlhdGVseSByZWR1Y2VkIHZhbHVlIChieSBhcHBseWluZyBwZWFrIG5vcm1hbGl6YXRpb24pLgorICAgKiBUaGUgcHJvcG9zZWQgc3RhbmRhcmQgY2FsbHMgdGhpcyAiY2xpcHBpbmcgcHJldmVudGlvbiIuCisgICAqCisgICAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0IGFuZCByZXN1bHQgZ2FpbiByZWZsZWN0cyB0aGUgbmVjZXNzYXJ5IGFtb3VudAorICAgKiBvZiByZWR1Y3Rpb24uICBBcHBsaWNhdGlvbnMgY2FuIG1ha2UgdXNlIG9mIHRoaXMgaW5mb3JtYXRpb24gdG8gdGVtcG9yYXJpbHkKKyAgICogcmVkdWNlIHRoZSAjR3N0UmdWb2x1bWU6cHJlLWFtcCBmb3Igc3Vic2VxdWVudCBzdHJlYW1zLCBhcyByZWNvbW1lbmRlZCBieQorICAgKiB0aGUgUmVwbGF5R2FpbiBzdGFuZGFyZC4KKyAgICoKKyAgICogTm90ZSB0aGF0IHRhcmdldCBhbmQgcmVzdWx0IGdhaW4gZGlmZmVyaW5nIGZvciBhIGdyZWF0IG1ham9yaXR5IG9mIHN0cmVhbXMKKyAgICogaW5kaWNhdGVzIGEgcHJvYmxlbTogV2hhdCBoYXBwZW5zIGluIHRoaXMgY2FzZSBpcyB0aGF0IG1vc3Qgc3RyZWFtcyByZWNlaXZlCisgICAqIHBlYWsgbm9ybWFsaXphdGlvbiBpbnN0ZWFkIG9mIGFtcGxpZmljYXRpb24gYnkgdGhlIGlkZWFsIHJlcGxheSBnYWluLiAgVG8KKyAgICogcHJldmVudCB0aGlzLCB0aGUgI0dzdFJnVm9sdW1lOnByZS1hbXAgaGFzIHRvIGJlIGxvd2VyZWQgYW5kL29yIGEgbGltaXRlcgorICAgKiBoYXMgdG8gYmUgdXNlZCB3aGljaCBmYWNpbGl0YXRlcyB0aGUgdXNlIG9mICNHc3RSZ1ZvbHVtZTpoZWFkcm9vbS4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkVTVUxUX0dBSU4sCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgicmVzdWx0LWdhaW4iLCAiUmVzdWx0LWdhaW4iLCAiQXBwbGllZCBnYWluIFtkQl0iLAorICAgICAgICAgIC0xMjAuLCAxMjAuLCAwLiwgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgLyoqCisgICAqIEdzdFJnVm9sdW1lOnRhcmdldC1nYWluOgorICAgKgorICAgKiBBcHBsaWNhYmxlIGdhaW4gW2RCXS4gIFRoaXMgZ2FpbiBpcyBzdXBwb3NlZCB0byBiZSBhcHBsaWVkLgorICAgKgorICAgKiBEZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSAjR3N0UmdWb2x1bWU6YWxidW0tbW9kZSBwcm9wZXJ0eSBhbmQgdGhlCisgICAqIHByZXNlbmNlIG9mIFJlcGxheUdhaW4gdGFncyBpbiB0aGUgc3RyZWFtLCB0aGlzIGlzIHNldCBhY2NvcmRpbmcgdG8gb25lIG9mCisgICAqIHRoZXNlIHNpbXBsZSBmb3JtdWxhczoKKyAgICoKKyAgICogPGl0ZW1pemVkbGlzdD4KKyAgICogPGxpc3RpdGVtPiNHc3RSZ1ZvbHVtZTpwcmUtYW1wICsgYWxidW0gZ2FpbiBvZiB0aGUgc3RyZWFtPC9saXN0aXRlbT4KKyAgICogPGxpc3RpdGVtPiNHc3RSZ1ZvbHVtZTpwcmUtYW1wICsgdHJhY2sgZ2FpbiBvZiB0aGUgc3RyZWFtPC9saXN0aXRlbT4KKyAgICogPGxpc3RpdGVtPiNHc3RSZ1ZvbHVtZTpwcmUtYW1wICsgI0dzdFJnVm9sdW1lOmZhbGxiYWNrLWdhaW48L2xpc3RpdGVtPgorICAgKiA8L2l0ZW1pemVkbGlzdD4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVEFSR0VUX0dBSU4sCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgidGFyZ2V0LWdhaW4iLCAiVGFyZ2V0LWdhaW4iLAorICAgICAgICAgICJBcHBsaWNhYmxlIGdhaW4gW2RCXSIsIC0xMjAuLCAxMjAuLCAwLiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3JnX3ZvbHVtZV9jaGFuZ2Vfc3RhdGUpOworCisgIGJpbl9jbGFzcyA9IChHc3RCaW5DbGFzcyAqKSBrbGFzczsKKyAgLyogU2V0dGluZyB0aGVzZSB0byBOVUxMIG1ha2VzIGdzdF9iaW5fYWRkIGFuZCBfcmVtb3ZlIHJlZnVzZSB0byBsZXQgYW55b25lCisgICAqIG1lc3Mgd2l0aCBvdXIgaW50ZXJuYWxzLiAqLworICBiaW5fY2xhc3MtPmFkZF9lbGVtZW50ID0gTlVMTDsKKyAgYmluX2NsYXNzLT5yZW1vdmVfZWxlbWVudCA9IE5VTEw7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiUmVwbGF5R2FpbiB2b2x1bWUiLAorICAgICAgIkZpbHRlci9FZmZlY3QvQXVkaW8iLAorICAgICAgIkFwcGx5IFJlcGxheUdhaW4gdm9sdW1lIGFkanVzdG1lbnQiLAorICAgICAgIlJlblx4YzNceGE5IFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9yZ192b2x1bWVfZGVidWcsICJyZ3ZvbHVtZSIsIDAsCisgICAgICAiUmVwbGF5R2FpbiB2b2x1bWUgZWxlbWVudCIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JnX3ZvbHVtZV9pbml0IChHc3RSZ1ZvbHVtZSAqIHNlbGYpCit7CisgIEdPYmplY3RDbGFzcyAqdm9sdW1lX2NsYXNzOworICBHc3RQYWQgKnZvbHVtZV9wYWQsICpnaG9zdF9wYWQ7CisKKyAgc2VsZi0+YWxidW1fbW9kZSA9IERFRkFVTFRfQUxCVU1fTU9ERTsKKyAgc2VsZi0+aGVhZHJvb20gPSBERUZBVUxUX0hFQURST09NOworICBzZWxmLT5wcmVfYW1wID0gREVGQVVMVF9QUkVfQU1QOworICBzZWxmLT5mYWxsYmFja19nYWluID0gREVGQVVMVF9GQUxMQkFDS19HQUlOOworICBzZWxmLT50YXJnZXRfZ2FpbiA9IDAuMDsKKyAgc2VsZi0+cmVzdWx0X2dhaW4gPSAwLjA7CisKKyAgc2VsZi0+dm9sdW1lX2VsZW1lbnQgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2b2x1bWUiLCAicmd2b2x1bWUtdm9sdW1lIik7CisgIGlmIChHX1VOTElLRUxZIChzZWxmLT52b2x1bWVfZWxlbWVudCA9PSBOVUxMKSkgeworICAgIEdzdE1lc3NhZ2UgKm1zZzsKKworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc2VsZiwgImNvdWxkIG5vdCBjcmVhdGUgdm9sdW1lIGVsZW1lbnQiKTsKKyAgICBtc2cgPSBnc3RfbWlzc2luZ19lbGVtZW50X21lc3NhZ2VfbmV3IChHU1RfRUxFTUVOVF9DQVNUIChzZWxmKSwgInZvbHVtZSIpOworICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAoc2VsZiksIG1zZyk7CisKKyAgICAvKiBOb3RoaW5nIGVsc2UgdG8gZG8sIHdlIHdpbGwgcmVmdXNlIHRoZSBzdGF0ZSBjaGFuZ2UgZnJvbSBOVUxMIHRvIFJFQURZIHRvCisgICAgICogaW5kaWNhdGUgdGhhdCBzb21ldGhpbmcgd2VudCB2ZXJ5IHdyb25nLiAgSXQgaXMgZG91YnRmdWwgdGhhdCBzb21lb25lCisgICAgICogYXR0ZW1wdHMgY2hhbmdpbmcgb3VyIHN0YXRlIHRob3VnaCwgc2luY2Ugd2UgZW5kIHVwIGhhdmluZyBubyBwYWRzISAqLworICAgIHJldHVybjsKKyAgfQorCisgIHZvbHVtZV9jbGFzcyA9IEdfT0JKRUNUX0dFVF9DTEFTUyAoR19PQkpFQ1QgKHNlbGYtPnZvbHVtZV9lbGVtZW50KSk7CisgIHNlbGYtPm1heF92b2x1bWUgPSBHX1BBUkFNX1NQRUNfRE9VQkxFCisgICAgICAoZ19vYmplY3RfY2xhc3NfZmluZF9wcm9wZXJ0eSAodm9sdW1lX2NsYXNzLCAidm9sdW1lIikpLT5tYXhpbXVtOworCisgIEdTVF9CSU5fQ0xBU1MgKHBhcmVudF9jbGFzcyktPmFkZF9lbGVtZW50IChHU1RfQklOX0NBU1QgKHNlbGYpLAorICAgICAgc2VsZi0+dm9sdW1lX2VsZW1lbnQpOworCisgIHZvbHVtZV9wYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc2VsZi0+dm9sdW1lX2VsZW1lbnQsICJzaW5rIik7CisgIGdob3N0X3BhZCA9IGdzdF9naG9zdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKCJzaW5rIiwgdm9sdW1lX3BhZCwKKyAgICAgIEdTVF9QQURfUEFEX1RFTVBMQVRFICh2b2x1bWVfcGFkKSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHZvbHVtZV9wYWQpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoZ2hvc3RfcGFkLCBnc3Rfcmdfdm9sdW1lX3NpbmtfZXZlbnQpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChzZWxmKSwgZ2hvc3RfcGFkKTsKKworICB2b2x1bWVfcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNlbGYtPnZvbHVtZV9lbGVtZW50LCAic3JjIik7CisgIGdob3N0X3BhZCA9IGdzdF9naG9zdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKCJzcmMiLCB2b2x1bWVfcGFkLAorICAgICAgR1NUX1BBRF9QQURfVEVNUExBVEUgKHZvbHVtZV9wYWQpKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodm9sdW1lX3BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHNlbGYpLCBnaG9zdF9wYWQpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JnX3ZvbHVtZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UmdWb2x1bWUgKnNlbGYgPSBHU1RfUkdfVk9MVU1FIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9BTEJVTV9NT0RFOgorICAgICAgc2VsZi0+YWxidW1fbW9kZSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9IRUFEUk9PTToKKyAgICAgIHNlbGYtPmhlYWRyb29tID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUFJFX0FNUDoKKyAgICAgIHNlbGYtPnByZV9hbXAgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GQUxMQkFDS19HQUlOOgorICAgICAgc2VsZi0+ZmFsbGJhY2tfZ2FpbiA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorCisgIGdzdF9yZ192b2x1bWVfdXBkYXRlX2dhaW4gKHNlbGYpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JnX3ZvbHVtZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UmdWb2x1bWUgKnNlbGYgPSBHU1RfUkdfVk9MVU1FIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9BTEJVTV9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNlbGYtPmFsYnVtX21vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0hFQURST09NOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgc2VsZi0+aGVhZHJvb20pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BSRV9BTVA6CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCBzZWxmLT5wcmVfYW1wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GQUxMQkFDS19HQUlOOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgc2VsZi0+ZmFsbGJhY2tfZ2Fpbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEFSR0VUX0dBSU46CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCBzZWxmLT50YXJnZXRfZ2Fpbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVTVUxUX0dBSU46CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCBzZWxmLT5yZXN1bHRfZ2Fpbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfcmdfdm9sdW1lX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJnVm9sdW1lICpzZWxmID0gR1NUX1JHX1ZPTFVNRSAob2JqZWN0KTsKKworICBpZiAoc2VsZi0+dm9sdW1lX2VsZW1lbnQgIT0gTlVMTCkgeworICAgIC8qIE1hbnVhbGx5IHJlbW92ZSBvdXIgY2hpbGQgdXNpbmcgdGhlIGJpbiBpbXBsZW1lbnRhdGlvbiBvZiByZW1vdmVfZWxlbWVudC4KKyAgICAgKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHdlIHByZXZlbnQgZ3N0X2Jpbl9yZW1vdmUgZnJvbSB3b3JraW5nLCB3aGljaCB0aGUKKyAgICAgKiBwYXJlbnQgZGlzcG9zZSBoYW5kbGVyIHdvdWxkIHVzZSBpZiB3ZSBoYWQgYW55IGNoaWxkcmVuIGxlZnQuICovCisgICAgR1NUX0JJTl9DTEFTUyAocGFyZW50X2NsYXNzKS0+cmVtb3ZlX2VsZW1lbnQgKEdTVF9CSU5fQ0FTVCAoc2VsZiksCisgICAgICAgIHNlbGYtPnZvbHVtZV9lbGVtZW50KTsKKyAgICBzZWxmLT52b2x1bWVfZWxlbWVudCA9IE5VTEw7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3Rfcmdfdm9sdW1lX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJnVm9sdW1lICpzZWxmID0gR1NUX1JHX1ZPTFVNRSAoZWxlbWVudCk7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJlczsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKworICAgICAgaWYgKEdfVU5MSUtFTFkgKHNlbGYtPnZvbHVtZV9lbGVtZW50ID09IE5VTEwpKSB7CisgICAgICAgIC8qIENyZWF0aW5nIG91ciBjaGlsZCB2b2x1bWUgZWxlbWVudCBpbiBfaW5pdCBmYWlsZWQuICovCisgICAgICAgIHJldHVybiBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisKKyAgICAgIGdzdF9yZ192b2x1bWVfcmVzZXQgKHNlbGYpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXMgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICByZXR1cm4gcmVzOworfQorCisvKiBFdmVudCBmdW5jdGlvbiBmb3IgdGhlIGdob3N0IHNpbmsgcGFkLiAqLworc3RhdGljIGdib29sZWFuCitnc3Rfcmdfdm9sdW1lX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSZ1ZvbHVtZSAqc2VsZjsKKyAgR3N0RXZlbnQgKnNlbmRfZXZlbnQgPSBldmVudDsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHNlbGYgPSBHU1RfUkdfVk9MVU1FIChwYXJlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1RBRzoKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNlbGYsICJyZWNlaXZlZCB0YWcgZXZlbnQiKTsKKworICAgICAgc2VuZF9ldmVudCA9IGdzdF9yZ192b2x1bWVfdGFnX2V2ZW50IChzZWxmLCBldmVudCk7CisKKyAgICAgIGlmIChzZW5kX2V2ZW50ID09IE5VTEwpCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChzZWxmLCAiYWxsIHRhZ3MgaGFuZGxlZCwgZHJvcHBpbmcgZXZlbnQiKTsKKworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisKKyAgICAgIGdzdF9yZ192b2x1bWVfcmVzZXQgKHNlbGYpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoR19MSUtFTFkgKHNlbmRfZXZlbnQgIT0gTlVMTCkpCisgICAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgc2VuZF9ldmVudCk7CisgIGVsc2UKKyAgICByZXMgPSBUUlVFOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RFdmVudCAqCitnc3Rfcmdfdm9sdW1lX3RhZ19ldmVudCAoR3N0UmdWb2x1bWUgKiBzZWxmLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RUYWdMaXN0ICp0YWdfbGlzdDsKKyAgZ2Jvb2xlYW4gaGFzX3RyYWNrX2dhaW4sIGhhc190cmFja19wZWFrLCBoYXNfYWxidW1fZ2FpbiwgaGFzX2FsYnVtX3BlYWs7CisgIGdib29sZWFuIGhhc19yZWZfbGV2ZWw7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGV2ZW50ICE9IE5VTEwsIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSA9PSBHU1RfRVZFTlRfVEFHLCBldmVudCk7CisKKyAgZ3N0X2V2ZW50X3BhcnNlX3RhZyAoZXZlbnQsICZ0YWdfbGlzdCk7CisKKyAgaWYgKGdzdF90YWdfbGlzdF9pc19lbXB0eSAodGFnX2xpc3QpKQorICAgIHJldHVybiBldmVudDsKKworICBoYXNfdHJhY2tfZ2FpbiA9IGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwgR1NUX1RBR19UUkFDS19HQUlOLAorICAgICAgJnNlbGYtPnRyYWNrX2dhaW4pOworICBoYXNfdHJhY2tfcGVhayA9IGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwgR1NUX1RBR19UUkFDS19QRUFLLAorICAgICAgJnNlbGYtPnRyYWNrX3BlYWspOworICBoYXNfYWxidW1fZ2FpbiA9IGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwgR1NUX1RBR19BTEJVTV9HQUlOLAorICAgICAgJnNlbGYtPmFsYnVtX2dhaW4pOworICBoYXNfYWxidW1fcGVhayA9IGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwgR1NUX1RBR19BTEJVTV9QRUFLLAorICAgICAgJnNlbGYtPmFsYnVtX3BlYWspOworICBoYXNfcmVmX2xldmVsID0gZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKHRhZ19saXN0LCBHU1RfVEFHX1JFRkVSRU5DRV9MRVZFTCwKKyAgICAgICZzZWxmLT5yZWZlcmVuY2VfbGV2ZWwpOworCisgIGlmICghaGFzX3RyYWNrX2dhaW4gJiYgIWhhc190cmFja19wZWFrICYmICFoYXNfYWxidW1fZ2FpbiAmJiAhaGFzX2FsYnVtX3BlYWspCisgICAgcmV0dXJuIGV2ZW50OworCisgIGlmIChoYXNfcmVmX2xldmVsICYmIChoYXNfdHJhY2tfZ2FpbiB8fCBoYXNfYWxidW1fZ2FpbikKKyAgICAgICYmIChBQlMgKHNlbGYtPnJlZmVyZW5jZV9sZXZlbCAtIFJHX1JFRkVSRU5DRV9MRVZFTCkgPiAxLmUtNikpIHsKKyAgICAvKiBMb2cgYSBtZXNzYWdlIHN0YXRpbmcgdGhlIGFtb3VudCBvZiBhZGp1c3RtZW50IHRoYXQgaXMgYXBwbGllZCBiZWxvdy4gKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgICAiY29tcGVuc2F0aW5nIGZvciByZWZlcmVuY2UgbGV2ZWwgZGlmZmVyZW5jZSBieSAlIiBHQUlOX0ZPUk1BVCwKKyAgICAgICAgUkdfUkVGRVJFTkNFX0xFVkVMIC0gc2VsZi0+cmVmZXJlbmNlX2xldmVsKTsKKyAgfQorICBpZiAoaGFzX3RyYWNrX2dhaW4pIHsKKyAgICBzZWxmLT50cmFja19nYWluICs9IFJHX1JFRkVSRU5DRV9MRVZFTCAtIHNlbGYtPnJlZmVyZW5jZV9sZXZlbDsKKyAgfQorICBpZiAoaGFzX2FsYnVtX2dhaW4pIHsKKyAgICBzZWxmLT5hbGJ1bV9nYWluICs9IFJHX1JFRkVSRU5DRV9MRVZFTCAtIHNlbGYtPnJlZmVyZW5jZV9sZXZlbDsKKyAgfQorCisgIC8qIElnbm9yZSB2YWx1ZXMgdGhhdCBhcmUgb2J2aW91c2x5IGludmFsaWQuICovCisgIGlmIChHX1VOTElLRUxZIChoYXNfdHJhY2tfZ2FpbiAmJiAhVkFMSURfR0FJTiAoc2VsZi0+dHJhY2tfZ2FpbikpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwKKyAgICAgICAgImlnbm9yaW5nIGJvZ3VzIHRyYWNrIGdhaW4gdmFsdWUgJSIgR0FJTl9GT1JNQVQsIHNlbGYtPnRyYWNrX2dhaW4pOworICAgIGhhc190cmFja19nYWluID0gRkFMU0U7CisgIH0KKyAgaWYgKEdfVU5MSUtFTFkgKGhhc190cmFja19wZWFrICYmICFWQUxJRF9QRUFLIChzZWxmLT50cmFja19wZWFrKSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgICAiaWdub3JpbmcgYm9ndXMgdHJhY2sgcGVhayB2YWx1ZSAlIiBQRUFLX0ZPUk1BVCwgc2VsZi0+dHJhY2tfcGVhayk7CisgICAgaGFzX3RyYWNrX3BlYWsgPSBGQUxTRTsKKyAgfQorICBpZiAoR19VTkxJS0VMWSAoaGFzX2FsYnVtX2dhaW4gJiYgIVZBTElEX0dBSU4gKHNlbGYtPmFsYnVtX2dhaW4pKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICJpZ25vcmluZyBib2d1cyBhbGJ1bSBnYWluIHZhbHVlICUiIEdBSU5fRk9STUFULCBzZWxmLT5hbGJ1bV9nYWluKTsKKyAgICBoYXNfYWxidW1fZ2FpbiA9IEZBTFNFOworICB9CisgIGlmIChHX1VOTElLRUxZIChoYXNfYWxidW1fcGVhayAmJiAhVkFMSURfUEVBSyAoc2VsZi0+YWxidW1fcGVhaykpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwKKyAgICAgICAgImlnbm9yaW5nIGJvZ3VzIGFsYnVtIHBlYWsgdmFsdWUgJSIgUEVBS19GT1JNQVQsIHNlbGYtPmFsYnVtX3BlYWspOworICAgIGhhc19hbGJ1bV9wZWFrID0gRkFMU0U7CisgIH0KKworICAvKiBDbGFtcCBwZWFrcyA+MS4wLiAgRmxvYXQgYmFzZWQgZGVjb2RlcnMgY2FuIHByb2R1Y2Ugc3B1cmlvdXMgc2FtcGxlcyA+MS4wLAorICAgKiBjdXR0aW5nIHRoZXNlIGZpbGVzIGJhY2sgdG8gMS4wIHNob3VsZCBub3QgY2F1c2UgYW55IGF1ZGlibGUgZGlzdG9ydGlvbi4KKyAgICogVGhpcyBpcyBtb3N0IG9mdGVuIHNlZW4gd2l0aCBWb3JiaXMgZmlsZXMuICovCisgIGlmIChoYXNfdHJhY2tfcGVhayAmJiBzZWxmLT50cmFja19wZWFrID4gMS4pIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgICAiY2xhbXBpbmcgdHJhY2sgcGVhayAlIiBQRUFLX0ZPUk1BVCAiIHRvIDEuMCIsIHNlbGYtPnRyYWNrX3BlYWspOworICAgIHNlbGYtPnRyYWNrX3BlYWsgPSAxLjA7CisgIH0KKyAgaWYgKGhhc19hbGJ1bV9wZWFrICYmIHNlbGYtPmFsYnVtX3BlYWsgPiAxLikgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICJjbGFtcGluZyBhbGJ1bSBwZWFrICUiIFBFQUtfRk9STUFUICIgdG8gMS4wIiwgc2VsZi0+YWxidW1fcGVhayk7CisgICAgc2VsZi0+YWxidW1fcGVhayA9IDEuMDsKKyAgfQorCisgIHNlbGYtPmhhc190cmFja19nYWluIHw9IGhhc190cmFja19nYWluOworICBzZWxmLT5oYXNfdHJhY2tfcGVhayB8PSBoYXNfdHJhY2tfcGVhazsKKyAgc2VsZi0+aGFzX2FsYnVtX2dhaW4gfD0gaGFzX2FsYnVtX2dhaW47CisgIHNlbGYtPmhhc19hbGJ1bV9wZWFrIHw9IGhhc19hbGJ1bV9wZWFrOworCisgIHRhZ19saXN0ID0gZ3N0X3RhZ19saXN0X2NvcHkgKHRhZ19saXN0KTsKKyAgZ3N0X3RhZ19saXN0X3JlbW92ZV90YWcgKHRhZ19saXN0LCBHU1RfVEFHX1RSQUNLX0dBSU4pOworICBnc3RfdGFnX2xpc3RfcmVtb3ZlX3RhZyAodGFnX2xpc3QsIEdTVF9UQUdfVFJBQ0tfUEVBSyk7CisgIGdzdF90YWdfbGlzdF9yZW1vdmVfdGFnICh0YWdfbGlzdCwgR1NUX1RBR19BTEJVTV9HQUlOKTsKKyAgZ3N0X3RhZ19saXN0X3JlbW92ZV90YWcgKHRhZ19saXN0LCBHU1RfVEFHX0FMQlVNX1BFQUspOworICBnc3RfdGFnX2xpc3RfcmVtb3ZlX3RhZyAodGFnX2xpc3QsIEdTVF9UQUdfUkVGRVJFTkNFX0xFVkVMKTsKKworICBnc3Rfcmdfdm9sdW1lX3VwZGF0ZV9nYWluIChzZWxmKTsKKworICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgaWYgKGdzdF90YWdfbGlzdF9pc19lbXB0eSAodGFnX2xpc3QpKSB7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gZ3N0X2V2ZW50X25ld190YWcgKHRhZ19saXN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9yZ192b2x1bWVfcmVzZXQgKEdzdFJnVm9sdW1lICogc2VsZikKK3sKKyAgc2VsZi0+aGFzX3RyYWNrX2dhaW4gPSBGQUxTRTsKKyAgc2VsZi0+aGFzX3RyYWNrX3BlYWsgPSBGQUxTRTsKKyAgc2VsZi0+aGFzX2FsYnVtX2dhaW4gPSBGQUxTRTsKKyAgc2VsZi0+aGFzX2FsYnVtX3BlYWsgPSBGQUxTRTsKKworICBzZWxmLT5yZWZlcmVuY2VfbGV2ZWwgPSBSR19SRUZFUkVOQ0VfTEVWRUw7CisKKyAgZ3N0X3JnX3ZvbHVtZV91cGRhdGVfZ2FpbiAoc2VsZik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfcmdfdm9sdW1lX3VwZGF0ZV9nYWluIChHc3RSZ1ZvbHVtZSAqIHNlbGYpCit7CisgIGdkb3VibGUgdGFyZ2V0X2dhaW4sIHJlc3VsdF9nYWluLCByZXN1bHRfdm9sdW1lOworICBnYm9vbGVhbiB0YXJnZXRfZ2Fpbl9jaGFuZ2VkLCByZXN1bHRfZ2Fpbl9jaGFuZ2VkOworCisgIGdzdF9yZ192b2x1bWVfZGV0ZXJtaW5lX2dhaW4gKHNlbGYsICZ0YXJnZXRfZ2FpbiwgJnJlc3VsdF9nYWluKTsKKworICByZXN1bHRfdm9sdW1lID0gREJfVE9fTElORUFSIChyZXN1bHRfZ2Fpbik7CisKKyAgLyogRW5zdXJlIHRoYXQgdGhlIHJlc3VsdCB2b2x1bWUgaXMgd2l0aGluIHRoZSByYW5nZSB0aGF0IHRoZSB2b2x1bWUgZWxlbWVudAorICAgKiBjYW4gaGFuZGxlLiAgQ3VycmVudGx5LCB0aGUgbGltaXQgaXMgMTAuICgrMjAgZEIpLCB3aGljaCBzaG91bGQgbm90IGJlCisgICAqIHJlc3RyaWN0aXZlLiAqLworICBpZiAoR19VTkxJS0VMWSAocmVzdWx0X3ZvbHVtZSA+IHNlbGYtPm1heF92b2x1bWUpKSB7CisgICAgR1NUX0lORk9fT0JKRUNUIChzZWxmLAorICAgICAgICAiY2Fubm90IGhhbmRsZSByZXN1bHQgZ2FpbiBvZiAlIiBHQUlOX0ZPUk1BVCAiICglMC42ZiksIGFkanVzdGluZyIsCisgICAgICAgIHJlc3VsdF9nYWluLCByZXN1bHRfdm9sdW1lKTsKKworICAgIHJlc3VsdF92b2x1bWUgPSBzZWxmLT5tYXhfdm9sdW1lOworICAgIHJlc3VsdF9nYWluID0gTElORUFSX1RPX0RCIChyZXN1bHRfdm9sdW1lKTsKKyAgfQorCisgIC8qIERpcmVjdCBjb21wYXJpc29uIGlzIE9LIGluIHRoaXMgY2FzZS4gKi8KKyAgaWYgKHRhcmdldF9nYWluID09IHJlc3VsdF9nYWluKSB7CisgICAgR1NUX0lORk9fT0JKRUNUIChzZWxmLAorICAgICAgICAicmVzdWx0IGdhaW4gaXMgJSIgR0FJTl9GT1JNQVQgIiAoJTAuNmYpLCBtYXRjaGluZyB0YXJnZXQiLAorICAgICAgICByZXN1bHRfZ2FpbiwgcmVzdWx0X3ZvbHVtZSk7CisgIH0gZWxzZSB7CisgICAgR1NUX0lORk9fT0JKRUNUIChzZWxmLAorICAgICAgICAicmVzdWx0IGdhaW4gaXMgJSIgR0FJTl9GT1JNQVQgIiAoJTAuNmYpLCB0YXJnZXQgaXMgJSIgR0FJTl9GT1JNQVQsCisgICAgICAgIHJlc3VsdF9nYWluLCByZXN1bHRfdm9sdW1lLCB0YXJnZXRfZ2Fpbik7CisgIH0KKworICB0YXJnZXRfZ2Fpbl9jaGFuZ2VkID0gKHNlbGYtPnRhcmdldF9nYWluICE9IHRhcmdldF9nYWluKTsKKyAgcmVzdWx0X2dhaW5fY2hhbmdlZCA9IChzZWxmLT5yZXN1bHRfZ2FpbiAhPSByZXN1bHRfZ2Fpbik7CisKKyAgc2VsZi0+dGFyZ2V0X2dhaW4gPSB0YXJnZXRfZ2FpbjsKKyAgc2VsZi0+cmVzdWx0X2dhaW4gPSByZXN1bHRfZ2FpbjsKKworICBnX29iamVjdF9zZXQgKHNlbGYtPnZvbHVtZV9lbGVtZW50LCAidm9sdW1lIiwgcmVzdWx0X3ZvbHVtZSwgTlVMTCk7CisKKyAgaWYgKHRhcmdldF9nYWluX2NoYW5nZWQpCisgICAgZ19vYmplY3Rfbm90aWZ5ICgoR09iamVjdCAqKSBzZWxmLCAidGFyZ2V0LWdhaW4iKTsKKyAgaWYgKHJlc3VsdF9nYWluX2NoYW5nZWQpCisgICAgZ19vYmplY3Rfbm90aWZ5ICgoR09iamVjdCAqKSBzZWxmLCAicmVzdWx0LWdhaW4iKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitnc3Rfcmdfdm9sdW1lX2RldGVybWluZV9nYWluIChHc3RSZ1ZvbHVtZSAqIHNlbGYsIGdkb3VibGUgKiB0YXJnZXRfZ2FpbiwKKyAgICBnZG91YmxlICogcmVzdWx0X2dhaW4pCit7CisgIGdkb3VibGUgZ2FpbiwgcGVhazsKKworICBpZiAoIXNlbGYtPmhhc190cmFja19nYWluICYmICFzZWxmLT5oYXNfYWxidW1fZ2FpbikgeworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgInVzaW5nIGZhbGxiYWNrIGdhaW4iKTsKKyAgICBnYWluID0gc2VsZi0+ZmFsbGJhY2tfZ2FpbjsKKyAgICBwZWFrID0gMS4wOworCisgIH0gZWxzZSBpZiAoKHNlbGYtPmFsYnVtX21vZGUgJiYgc2VsZi0+aGFzX2FsYnVtX2dhaW4pCisgICAgICB8fCAoIXNlbGYtPmFsYnVtX21vZGUgJiYgIXNlbGYtPmhhc190cmFja19nYWluKSkgeworCisgICAgZ2FpbiA9IHNlbGYtPmFsYnVtX2dhaW47CisgICAgaWYgKEdfTElLRUxZIChzZWxmLT5oYXNfYWxidW1fcGVhaykpIHsKKyAgICAgIHBlYWsgPSBzZWxmLT5hbGJ1bV9wZWFrOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiYWxidW0gcGVhayBtaXNzaW5nLCBhc3N1bWluZyAxLjAiKTsKKyAgICAgIHBlYWsgPSAxLjA7CisgICAgfQorICAgIC8qIEZhbGxpbmcgYmFjayBmcm9tIHRyYWNrIHRvIGFsYnVtIGdhaW4gc2hvdWxkbid0IHJlYWxseSBoYXBwZW4uICovCisgICAgaWYgKEdfVU5MSUtFTFkgKCFzZWxmLT5hbGJ1bV9tb2RlKSkKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoc2VsZiwgImZhbGxpbmcgYmFjayB0byBhbGJ1bSBnYWluIik7CisKKyAgfSBlbHNlIHsKKyAgICAvKiAhYWxidW1fbW9kZSAmJiAhaGFzX2FsYnVtX2dhaW4gfHwgYWxidW1fbW9kZSAmJiBoYXNfdHJhY2tfZ2FpbiAqLworCisgICAgZ2FpbiA9IHNlbGYtPnRyYWNrX2dhaW47CisgICAgaWYgKEdfTElLRUxZIChzZWxmLT5oYXNfdHJhY2tfcGVhaykpIHsKKyAgICAgIHBlYWsgPSBzZWxmLT50cmFja19wZWFrOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAidHJhY2sgcGVhayBtaXNzaW5nLCBhc3N1bWluZyAxLjAiKTsKKyAgICAgIHBlYWsgPSAxLjA7CisgICAgfQorICAgIGlmIChzZWxmLT5hbGJ1bV9tb2RlKQorICAgICAgR1NUX0lORk9fT0JKRUNUIChzZWxmLCAiZmFsbGluZyBiYWNrIHRvIHRyYWNrIGdhaW4iKTsKKyAgfQorCisgIGdhaW4gKz0gc2VsZi0+cHJlX2FtcDsKKworICAqdGFyZ2V0X2dhaW4gPSBnYWluOworICAqcmVzdWx0X2dhaW4gPSBnYWluOworCisgIGlmIChMSU5FQVJfVE9fREIgKHBlYWspICsgZ2FpbiA+IHNlbGYtPmhlYWRyb29tKSB7CisgICAgKnJlc3VsdF9nYWluID0gTElORUFSX1RPX0RCICgxLiAvIHBlYWspICsgc2VsZi0+aGVhZHJvb207CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9yZXBsYXlnYWluL2dzdHJndm9sdW1lLmggYi9nc3QvcmVwbGF5Z2Fpbi9nc3RyZ3ZvbHVtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYTVhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcmVwbGF5Z2Fpbi9nc3RyZ3ZvbHVtZS5oCkBAIC0wLDAgKzEsODggQEAKKy8qIEdTdHJlYW1lciBSZXBsYXlHYWluIHZvbHVtZSBhZGp1c3RtZW50CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlbmUgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKyAqCisgKiBnc3RyZ3ZvbHVtZS5oOiBFbGVtZW50IHRvIGFwcGx5IFJlcGxheUdhaW4gdm9sdW1lIGFkanVzdG1lbnQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9fR1NUX1JHX1ZPTFVNRV9IX18KKyNkZWZpbmUgX19HU1RfUkdfVk9MVU1FX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUkdfVk9MVU1FIFwKKyAgKGdzdF9yZ192b2x1bWVfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JHX1ZPTFVNRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JHX1ZPTFVNRSxHc3RSZ1ZvbHVtZSkpCisjZGVmaW5lIEdTVF9SR19WT0xVTUVfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUkdfVk9MVU1FLEdzdFJnVm9sdW1lQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUkdfVk9MVU1FKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUkdfVk9MVU1FKSkKKyNkZWZpbmUgR1NUX0lTX1JHX1ZPTFVNRV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SR19WT0xVTUUpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UmdWb2x1bWUgR3N0UmdWb2x1bWU7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UmdWb2x1bWVDbGFzcyBHc3RSZ1ZvbHVtZUNsYXNzOworCisvKioKKyAqIEdzdFJnVm9sdW1lOgorICoKKyAqIE9wYXF1ZSBkYXRhIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IF9Hc3RSZ1ZvbHVtZQoreworICBHc3RCaW4gYmluOworCisgIC8qPCBwcml2YXRlID4qLworCisgIEdzdEVsZW1lbnQgKnZvbHVtZV9lbGVtZW50OworICBnZG91YmxlIG1heF92b2x1bWU7CisKKyAgZ2Jvb2xlYW4gYWxidW1fbW9kZTsKKyAgZ2RvdWJsZSBoZWFkcm9vbTsKKyAgZ2RvdWJsZSBwcmVfYW1wOworICBnZG91YmxlIGZhbGxiYWNrX2dhaW47CisKKyAgZ2RvdWJsZSB0YXJnZXRfZ2FpbjsKKyAgZ2RvdWJsZSByZXN1bHRfZ2FpbjsKKworICBnZG91YmxlIHRyYWNrX2dhaW47CisgIGdkb3VibGUgdHJhY2tfcGVhazsKKyAgZ2RvdWJsZSBhbGJ1bV9nYWluOworICBnZG91YmxlIGFsYnVtX3BlYWs7CisKKyAgZ2Jvb2xlYW4gaGFzX3RyYWNrX2dhaW47CisgIGdib29sZWFuIGhhc190cmFja19wZWFrOworICBnYm9vbGVhbiBoYXNfYWxidW1fZ2FpbjsKKyAgZ2Jvb2xlYW4gaGFzX2FsYnVtX3BlYWs7CisKKyAgZ2RvdWJsZSByZWZlcmVuY2VfbGV2ZWw7Cit9OworCitzdHJ1Y3QgX0dzdFJnVm9sdW1lQ2xhc3MKK3sKKyAgR3N0QmluQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3JnX3ZvbHVtZV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SR19WT0xVTUVfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcmVwbGF5Z2Fpbi9tZXNvbi5idWlsZCBiL2dzdC9yZXBsYXlnYWluL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NDM3YTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcmVwbGF5Z2Fpbi9tZXNvbi5idWlsZApAQCAtMCwwICsxLDE3IEBACityZXBsYXlnYWluX3NvdXJjZXMgPSBbCisgICdnc3RyZ2FuYWx5c2lzLmMnLAorICAnZ3N0cmdsaW1pdGVyLmMnLAorICAnZ3N0cmd2b2x1bWUuYycsCisgICdyZXBsYXlnYWluLmMnLAorICAncmdhbmFseXNpcy5jJywKK10KKworZ3N0cmVwbGF5Z2FpbiA9IGxpYnJhcnkoJ2dzdHJlcGxheWdhaW4nLAorICByZXBsYXlnYWluX3NvdXJjZXMsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0X2RlcCwgZ3N0YmFzZV9kZXAsIGdzdHBidXRpbHNfZGVwLCBnc3RhdWRpb19kZXAsIGxpYm1dLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQorCmRpZmYgLS1naXQgYS9nc3QvcmVwbGF5Z2Fpbi9yZXBsYXlnYWluLmMgYi9nc3QvcmVwbGF5Z2Fpbi9yZXBsYXlnYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I0OTllZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9yZXBsYXlnYWluL3JlcGxheWdhaW4uYwpAQCAtMCwwICsxLDUzIEBACisvKiBHU3RyZWFtZXIgUmVwbGF5R2FpbiBwbHVnaW4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVuZSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorICogCisgKiByZXBsYXlnYWluLmM6IFBsdWdpbiBwcm92aWRpbmcgUmVwbGF5R2FpbiByZWxhdGVkIGVsZW1lbnRzCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisjaW5jbHVkZSAiZ3N0cmdhbmFseXNpcy5oIgorI2luY2x1ZGUgImdzdHJnbGltaXRlci5oIgorI2luY2x1ZGUgImdzdHJndm9sdW1lLmgiCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicmdhbmFseXNpcyIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfUkdfQU5BTFlTSVMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJyZ2xpbWl0ZXIiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX1JHX0xJTUlURVIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJyZ3ZvbHVtZSIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfUkdfVk9MVU1FKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwgR1NUX1ZFUlNJT05fTUlOT1IsIHJlcGxheWdhaW4sCisgICAgIlJlcGxheUdhaW4gdm9sdW1lIG5vcm1hbGl6YXRpb24iLCBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsCisgICAgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKTsKZGlmZiAtLWdpdCBhL2dzdC9yZXBsYXlnYWluL3JlcGxheWdhaW4uaCBiL2dzdC9yZXBsYXlnYWluL3JlcGxheWdhaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWJlODg4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3JlcGxheWdhaW4vcmVwbGF5Z2Fpbi5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIEdTdHJlYW1lciBSZXBsYXlHYWluIHBsdWdpbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBSZW5lIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisgKgorICogcmVwbGF5Z2Fpbi5oOiBQbHVnaW4gcHJvdmlkaW5nIFJlcGxheUdhaW4gcmVsYXRlZCBlbGVtZW50cworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX19SRVBMQVlHQUlOX0hfXworI2RlZmluZSBfX1JFUExBWUdBSU5fSF9fCisKK0dfQkVHSU5fREVDTFMKKworLyogUmVmZXJlbmNlIGxldmVsIChpbiBkQlNQTCkuICBUaGUgMjAwMSBwcm9wb3NhbCBzcGVjaWZpZXMgODMuICBUaGlzIHdhcworICogY2hhbmdlZCBsYXRlciBpbiBhbGwgaW1wbGVtZW50YXRpb25zIHRvIDg5LCB3aGljaCBpcyB0aGUgbmV3LCBvZmZpY2FsIHZhbHVlOgorICogRGF2aWQgUm9iaW5zb24gYWNrbm93bGVkZ2VkIHRoZSBjaGFuZ2UgYnV0IGRpZG4ndCB1cGRhdGUgdGhlIHdlYnNpdGUgeWV0LiAqLworCisjZGVmaW5lIFJHX1JFRkVSRU5DRV9MRVZFTCA4OS4KKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fUkVQTEFZR0FJTl9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9yZXBsYXlnYWluL3JnYW5hbHlzaXMuYyBiL2dzdC9yZXBsYXlnYWluL3JnYW5hbHlzaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDQwMzc2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3JlcGxheWdhaW4vcmdhbmFseXNpcy5jCkBAIC0wLDAgKzEsODI0IEBACisvKiBHU3RyZWFtZXIgUmVwbGF5R2FpbiBhbmFseXNpcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBSZW5lIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgRGF2aWQgUm9iaW5zb24gPERhdmlkQFJvYmluc29uLm9yZz4KKyAqICAgICAgICAgICAgICAgICAgICBHbGVuIFNhd3llciA8Z2xlbnNhd3llckBob3RtYWlsLmNvbT4KKyAqCisgKiByZ2FuYWx5c2lzLmM6IEFuYWx5emUgcmF3IGF1ZGlvIGRhdGEgaW4gYWNjb3JkYW5jZSB3aXRoIFJlcGxheUdhaW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKiBCYXNlZCBvbiBjb2RlIHdpdGggQ29weXJpZ2h0IChDKSAyMDAxIERhdmlkIFJvYmluc29uCisgKiA8RGF2aWRAUm9iaW5zb24ub3JnPiBhbmQgR2xlbiBTYXd5ZXIgPGdsZW5zYXd5ZXJAaG90bWFpbC5jb20+LAorICogd2hpY2ggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExHUEwgYXMgcGFydCBvZiB0aGUgdm9yYmlzZ2FpbgorICogcHJvZ3JhbS4gIFRoZSBvcmlnaW5hbCBjb2RlIGFsc28gbWVudGlvbnMgRnJhbmsgS2xlbW0KKyAqIChodHRwOi8vd3d3LnVuaS1qZW5hLmRlL35wZmsvbXBwLykgZm9yIGhhdmluZyBjb250cmlidXRlZCBsb3RzIG9mCisgKiBnb29kIGNvZGUuICBTcGVjaWZpY2FsbHksIHRoaXMgaXMgYmFzZWQgb24gdGhlIGZpbGUKKyAqICJnYWluX2FuYWx5c2lzLmMiIGZyb20gdm9yYmlzZ2FpbiB2ZXJzaW9uIDAuMzQuCisgKi8KKworLyogUm9vbSBmb3IgZnV0dXJlIGltcHJvdmVtZW50OiBNb25vIGRhdGEgaXMgY3VycmVudGx5IGluIGZhY3QgY29waWVkCisgKiB0byB0d28gY2hhbm5lbHMgd2hpY2ggZ2V0IHByb2Nlc3NlZCBub3JtYWxseS4gIFRoaXMgbWVhbnMgdGhhdCBtb25vCisgKiBpbnB1dCBkYXRhIGlzIHByb2Nlc3NlZCB0d2ljZS4KKyAqLworCisvKiBIZWxwZnVsIGluZm9ybWF0aW9uIGZvciB1bmRlcnN0YW5kaW5nIHRoaXMgY29kZTogVGhlIHR3byBJSVIKKyAqIGZpbHRlcnMgZGVwZW5kIG9uIHByZXZpb3VzIGlucHV0IF9hbmRfIHByZXZpb3VzIG91dHB1dCBzYW1wbGVzICh1cAorICogdG8gdGhlIGZpbHRlcidzIG9yZGVyIG51bWJlciBvZiBzYW1wbGVzKS4gIFRoaXMgZXhwbGFpbnMgdGhlIHdob2xlCisgKiBsb3Qgb2YgbWVtY3B5J2luZyBkb25lIGluIHJnX2FuYWx5c2lzX2FuYWx5emUgYW5kIHdoeSB0aGUgY29udGV4dAorICogaG9sZHMgc28gbWFueSBidWZmZXJzLgorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaW5jbHVkZSAicmdhbmFseXNpcy5oIgorCisjZGVmaW5lIFlVTEVfT1JERVIgICAgICAgICAxMAorI2RlZmluZSBCVVRURVJfT1JERVIgICAgICAgIDIKKy8qIFBlcmNlbnRpbGUgd2hpY2ggaXMgbG91ZGVyIHRoYW4gdGhlIHByb3Bvc2VkIGxldmVsOiAqLworI2RlZmluZSBSTVNfUEVSQ0VOVElMRSAgICAgOTUKKy8qIER1cmF0aW9uIG9mIFJNUyB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzOiAqLworI2RlZmluZSBSTVNfV0lORE9XX01TRUNTICAgNTAKKy8qIEhpc3RvZ3JhbSBhcnJheSBlbGVtZW50cyBwZXIgZEI6ICovCisjZGVmaW5lIFNURVBTX1BFUl9EQiAgICAgIDEwMAorLyogSGlzdG9ncmFtIHVwcGVyIGJvdW5kIGluIGRCIChub3JtYWwgbWF4LiB2YWx1ZXMgaW4gdGhlIHdpbGQgYXJlCisgKiBhc3N1bWVkIHRvIGJlIGFyb3VuZCA3MCwgODAgZEIpOiAqLworI2RlZmluZSBNQVhfREIgICAgICAgICAgICAxMjAKKy8qIENhbGlicmF0aW9uIHZhbHVlOiAqLworI2RlZmluZSBQSU5LX1JFRiAgICAgICAgICAgNjQuODIgICAgICAgIC8qIDI5ODY0MDg4Mzc5NSAqLworCisjZGVmaW5lIE1BWF9PUkRFUiAgICAgICAgIE1BWCAoQlVUVEVSX09SREVSLCBZVUxFX09SREVSKQorI2RlZmluZSBNQVhfU0FNUExFX1JBVEUgICA0ODAwMAorLyogVGhlICsgOTk5IGhhcyB0aGUgZWZmZWN0IG9mIGNlaWwoKWluZzogKi8KKyNkZWZpbmUgTUFYX1NBTVBMRV9XSU5ET1cgKGd1aW50KSBcCisgICgoTUFYX1NBTVBMRV9SQVRFICogUk1TX1dJTkRPV19NU0VDUyArIDk5OSkgLyAxMDAwKQorCisvKiBBbmFseXNpcyByZXN1bHQgYWNjdW11bGF0b3IuICovCisKK3N0cnVjdCBfUmdBbmFseXNpc0FjYworeworICBndWludDMyIGhpc3RvZ3JhbVtTVEVQU19QRVJfREIgKiBNQVhfREJdOworICBnZG91YmxlIHBlYWs7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfUmdBbmFseXNpc0FjYyBSZ0FuYWx5c2lzQWNjOworCisvKiBBbmFseXNpcyBjb250ZXh0LiAqLworCitzdHJ1Y3QgX1JnQW5hbHlzaXNDdHgKK3sKKyAgLyogRmlsdGVyIGJ1ZmZlcnMgZm9yIGxlZnQgY2hhbm5lbC4gKi8KKyAgZ2Zsb2F0IGlucHJlYnVmX2xbTUFYX09SREVSICogMl07CisgIGdmbG9hdCAqaW5wcmVfbDsKKyAgZ2Zsb2F0IHN0ZXBidWZfbFtNQVhfU0FNUExFX1dJTkRPVyArIE1BWF9PUkRFUl07CisgIGdmbG9hdCAqc3RlcF9sOworICBnZmxvYXQgb3V0YnVmX2xbTUFYX1NBTVBMRV9XSU5ET1cgKyBNQVhfT1JERVJdOworICBnZmxvYXQgKm91dF9sOworICAvKiBGaWx0ZXIgYnVmZmVycyBmb3IgcmlnaHQgY2hhbm5lbC4gKi8KKyAgZ2Zsb2F0IGlucHJlYnVmX3JbTUFYX09SREVSICogMl07CisgIGdmbG9hdCAqaW5wcmVfcjsKKyAgZ2Zsb2F0IHN0ZXBidWZfcltNQVhfU0FNUExFX1dJTkRPVyArIE1BWF9PUkRFUl07CisgIGdmbG9hdCAqc3RlcF9yOworICBnZmxvYXQgb3V0YnVmX3JbTUFYX1NBTVBMRV9XSU5ET1cgKyBNQVhfT1JERVJdOworICBnZmxvYXQgKm91dF9yOworCisgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWNoIGR1cmF0aW9uIG9mIHRoZSBSTVMgd2luZG93OiAqLworICBndWludCB3aW5kb3dfbl9zYW1wbGVzOworICAvKiBQcm9ncmVzcyBvZiB0aGUgcnVubmluZyB3aW5kb3c6ICovCisgIGd1aW50IHdpbmRvd19uX3NhbXBsZXNfZG9uZTsKKyAgZ2RvdWJsZSB3aW5kb3dfc3F1YXJlX3N1bTsKKworICBnaW50IHNhbXBsZV9yYXRlOworICBnaW50IHNhbXBsZV9yYXRlX2luZGV4OworCisgIFJnQW5hbHlzaXNBY2MgdHJhY2s7CisgIFJnQW5hbHlzaXNBY2MgYWxidW07CisgIHZvaWQgKCpwb3N0X21lc3NhZ2UpIChncG9pbnRlciBhbmFseXNpcywKKyAgICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIEdzdENsb2NrVGltZSBkdXJhdGlvbiwgZ2RvdWJsZSByZ2xldmVsKTsKKyAgZ3BvaW50ZXIgYW5hbHlzaXM7CisgIC8qIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGN1cnJlbnQgaW5jb21pbmcgYnVmZmVyLiAqLworICBHc3RDbG9ja1RpbWUgYnVmZmVyX3RpbWVzdGFtcDsKKyAgLyogTnVtYmVyIG9mIHNhbXBsZXMgcHJvY2Vzc2VkIGluIGN1cnJlbnQgYnVmZmVyLCBkdXJpbmcgZW1pdF9zaWduYWwsCisgICAgIHRoaXMgd2lsbCBhbHdheXMgYmUgb24gYW4gUk1TIHdpbmRvdyBib3VuZGFyeS4gKi8KKyAgZ3VpbnQgYnVmZmVyX25fc2FtcGxlc19kb25lOworfTsKKworLyogRmlsdGVyIGNvZWZmaWNpZW50cyBmb3IgdGhlIElJUiBmaWx0ZXJzIHRoYXQgZm9ybSB0aGUgZXF1YWwKKyAqIGxvdWRuZXNzIGZpbHRlci4gIFhGaWx0ZXJbY3R4LT5zYW1wbGVfcmF0ZV9pbmRleF0gZ2l2ZXMgdGhlIGFycmF5CisgKiBvZiB0aGUgWCBjb2VmZmljaWVudHMgKEEgb3IgQikgZm9yIHRoZSBjb25maWd1cmVkIHNhbXBsZSByYXRlLiAqLworCisjaWZkZWYgX01TQ19WRVIKKy8qIERpc2FibGUgZG91YmxlLXRvLWZsb2F0IHdhcm5pbmc6ICovCisvKiBBIGJldHRlciBzb2x1dGlvbiB3b3VsZCBiZSB0byBhcHBlbmQgJ2YnIHRvIGVhY2ggY29uc3RhbnQsIGJ1dCB0aGF0CisgKiBtYWtlcyB0aGUgY29kZSB1Z2x5LiAqLworI3ByYWdtYSB3YXJuaW5nICggZGlzYWJsZSA6IDQzMDUgKQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBnZmxvYXQgQVl1bGVbOV1bMTFdID0geworICB7MS4sIC0zLjg0NjY0NjE3MTE4MDY3LCA3LjgxNTAxNjUzMDA1NTM4LCAtMTEuMzQxNzAzNTUxMzIwNDIsCisgICAgICAgIDEzLjA1NTA0MjE5MzI3NTQ1LCAtMTIuMjg3NTk4OTUxNDUyOTQsIDkuNDgyOTM4MDYzMTk3OTAsCisgICAgICAgIC01Ljg3MjU3ODYxNzc1OTk5LCAyLjc1NDY1ODYxODc0NjEzLCAtMC44Njk4NDM3NjU5MzU1MSwKKyAgICAgIDAuMTM5MTkzMTQ1Njc0MzJ9LAorICB7MS4sIC0zLjQ3ODQ1OTQ4NTUwMDcxLCA2LjM2MzE3Nzc3NTY2MTQ4LCAtOC41NDc1MTUyNzQ3MTg3NCwgOS40NzY5MzYwNzgwMTI4MCwKKyAgICAgICAgLTguODE0OTg2ODEzNzAxNTUsIDYuODU0MDE1NDA5MzY5OTgsIC00LjM5NDcwOTk2MDc5NTU5LAorICAgICAgMi4xOTYxMTY4NDg5MDc3NCwgLTAuNzUxMDQzMDI0NTE0MzIsIDAuMTMxNDkzMTc5NTg4MDh9LAorICB7MS4sIC0yLjM3ODk4ODM0OTczMDg0LCAyLjg0ODY4MTUxMTU2MzI3LCAtMi42NDU3NzE3MDIyOTgyNSwgMi4yMzY5NzY1NzQ1MTcxMywKKyAgICAgICAgLTEuNjcxNDgxNTMzNjc2MDIsIDEuMDA1OTU5NTQ4MDg1NDcsIC0wLjQ1OTUzNDU4MDU0OTgzLAorICAgICAgMC4xNjM3ODE2NDg1ODU5NiwgLTAuMDUwMzIwNzc3MTcxMzEsIDAuMDIzNDc4OTc0MDcwMjB9LAorICB7MS4sIC0xLjYxMjczMTY1MTM3MjQ3LCAxLjA3OTc3NDkyMjU5OTcwLCAtMC4yNTY1NjI1Nzc1NDA3MCwKKyAgICAgICAgLTAuMTYyNzY3MTkxMjA0NDAsIC0wLjIyNjM4ODkzNzczOTA2LCAwLjM5MTIwODAwNzg4Mjg0LAorICAgICAgICAtMC4yMjEzODEzODk1NDkyNSwgMC4wNDUwMDIzNTM4NzM1MiwgMC4wMjAwNTg1MTgwNjUwMSwKKyAgICAgIDAuMDAzMDI0MzkwOTU3NDF9LAorICB7MS4sIC0xLjQ5ODU4OTc5MzY3Nzk5LCAwLjg3MzUwMjcxNDE4MTg4LCAwLjEyMjA1MDIyMzA4MDg0LCAtMC44MDc3NDk0NDY3MTQzOCwKKyAgICAgICAgMC40Nzg1NDc5NDU2MjMyNiwgLTAuMTI0NTM0NTgxNDAwMTksIC0wLjA0MDY3NTEwMTk3MDE0LAorICAgICAgMC4wODMzMzc1NTI4NDEwNywgLTAuMDQyMzczNDgwMjU3NDYsIDAuMDI5NzcyMDczMTk5MjV9LAorICB7MS4sIC0wLjYyODIwNjE5MjMzNjcxLCAwLjI5NjYxNzgzNzA2MzY2LCAtMC4zNzI1NjM3Mjk0MjQwMCwgMC4wMDIxMzc2Nzg1NzEyNCwKKyAgICAgICAgLTAuNDIwMjk4MjAxNzA5MTgsIDAuMjIxOTk2NTA1NjQ4MjQsIDAuMDA2MTM0MjQzNTA2ODIsIDAuMDY3NDc2MjA3NDQ2ODMsCisgICAgICAwLjA1Nzg0ODIwMzc1ODAxLCAwLjAzMjIyNzU0MDcyMTczfSwKKyAgezEuLCAtMS4wNDgwMDMzNTEyNjM0OSwgMC4yOTE1NjMxMTk3MTI0OSwgLTAuMjY4MDYwMDEwNDI5NDcsIDAuMDA4MTk5OTk2NDU4NTgsCisgICAgICAgIDAuNDUwNTQ3MzQ1MDUwMDgsIC0wLjMzMDMyNDAzMzE0MDA2LCAwLjA2NzM5MzY4MzMzMTEwLAorICAgICAgLTAuMDQ3ODQyNTQyMjkwMzMsIDAuMDE2Mzk5MDc4MzYxODksIDAuMDE4MDczNjQzMjM1NzN9LAorICB7MS4sIC0wLjUxMDM1MzI3MDk1MTg0LCAtMC4zMTg2MzU2MzMyNTI0NSwgLTAuMjAyNTY0MTM0ODQ0NzcsCisgICAgICAgIDAuMTQ3MjgxNTQxMzQzMzAsIDAuMzg5NTI2Mzk5Nzg5OTksIC0wLjIzMzEzMjcxODgwODY4LAorICAgICAgICAtMC4wNTI0NjAxOTAyNDQ2MywgLTAuMDI1MDU5NjE3MjQwNTMsIDAuMDI0NDIzNTczMTYwOTksCisgICAgICAwLjAxODE4ODAxMTExNTAzfSwKKyAgezEuLCAtMC4yNTA0OTg3MTk1NjAyMCwgLTAuNDMxOTM5NDIzMTExMTQsIC0wLjAzNDI0NjgxMDE3Njc1LAorICAgICAgICAtMC4wNDY3ODMyODc4NDI0MiwgMC4yNjQwODMwMDIwMDk1NSwgMC4xNTExMzEzMDUzMzIxNiwKKyAgICAgICAgLTAuMTc1NTY0OTMzNjY0NDksIC0wLjE4ODIzMDA5MjYyMTE1LCAwLjA1NDc3NzIwNDI4Njc0LAorICAgICAgMC4wNDcwNDQwOTY4ODEyMH0KK307CisKK3N0YXRpYyBjb25zdCBnZmxvYXQgQll1bGVbOV1bMTFdID0geworICB7MC4wMzg1NzU5OTQzNTIwMCwgLTAuMDIxNjAzNjcxODQxODUsIC0wLjAwMTIzMzk1MzE2ODUxLCAtMC4wMDAwOTI5MTY3Nzk1OSwKKyAgICAgICAgLTAuMDE2NTUyNjAzNDE2MTksIDAuMDIxNjE1MjY4NDMyNzQsIC0wLjAyMDc0MDQ1MjE1Mjg1LAorICAgICAgMC4wMDU5NDI5ODA2NTEyNSwgMC4wMDMwNjQyODAyMzE5MSwgMC4wMDAxMjAyNTMyMjAyNywgMC4wMDI4ODQ2MzY4MzkxNn0sCisgIHswLjA1NDE4NjU2NDA2NDMwLCAtMC4wMjkxMTAwNzgwODk0OCwgLTAuMDA4NDg3MDkzNzk4NTEsIC0wLjAwODUxMTY1NjQ1NDY5LAorICAgICAgICAtMC4wMDgzNDk5MDkwNDkzNiwgMC4wMjI0NTI5MzI1MzMzOSwgLTAuMDI1OTYzMzg1MTI5MTUsCisgICAgICAgIDAuMDE2MjQ4NjQ5NjI5NzUsIC0wLjAwMjQwODc5MDUxNTg0LCAwLjAwNjc0NjEzNjgyMjQ3LAorICAgICAgLTAuMDAxODc3NjM3NzczNjJ9LAorICB7MC4xNTQ1NzI5OTY4MTkyNCwgLTAuMDkzMzEwNDkwNTYzMTUsIC0wLjA2MjQ3ODgwMTUzNjUzLCAwLjAyMTYzNTQxODg4Nzk4LAorICAgICAgICAtMC4wNTU4ODM5MzMyOTg1NiwgMC4wNDc4MTQ3NjY3NDkyMSwgMC4wMDIyMjMxMjU5Nzc0MywgMC4wMzE3NDA5MjU0MDA0OSwKKyAgICAgIC0wLjAxMzkwNTg5NDIxODk4LCAwLjAwNjUxNDIwNjY3ODMxLCAtMC4wMDg4MTM2MjczMzgzOX0sCisgIHswLjMwMjk2OTA3MzE5MzI3LCAtMC4yMjYxMzk4ODY4MjEyMywgLTAuMDg1ODczMjM3MzA3NzIsIDAuMDMyODI5MzAxNzI2NjQsCisgICAgICAgIC0wLjAwOTE1NzAyOTMzNDM0LCAtMC4wMjM2NDE0MTIwMjUyMiwgLTAuMDA1ODQ0NTYwMzk5MTMsCisgICAgICAgIDAuMDYyNzYxMDEzMjE3NDksIC0wLjAwMDAwODI4MDg2NzQ4LCAwLjAwMjA1ODYxODg1NTY0LAorICAgICAgLTAuMDI5NTAxMzQ5ODMyODd9LAorICB7MC4zMzY0MjMwNDg1NjEzMiwgLTAuMjU1NzIyNDE0MjU1NzAsIC0wLjExODI4NTcwMTc3NTU1LCAwLjExOTIxMTQ4Njc1MjAzLAorICAgICAgICAtMC4wNzgzNDQ4OTYwOTQ3OSwgLTAuMDA0Njk5Nzc5MTQzODAsIC0wLjAwNTg5NTAwMjI0NDQwLAorICAgICAgICAwLjA1NzI0MjI4MTQwMzUxLCAwLjAwODMyMDQzOTgwNzczLCAtMC4wMTYzNTM4MTM4NDU0MCwKKyAgICAgIC0wLjAxNzYwMTc2NTY4MTUwfSwKKyAgezAuNDQ5MTUyNTY2MDg0NTAsIC0wLjE0MzUxNzU3NDY0NTQ3LCAtMC4yMjc4NDM5NDQyOTc0OSwgLTAuMDE0MTkxNDAxMDA1NTEsCisgICAgICAgIDAuMDQwNzgyNjI3OTcxMzksIC0wLjEyMzk4MTYzMzgxNzQ4LCAwLjA0MDk3NTY1MTM1NjQ4LCAwLjEwNDc4NTAzNjAwMjUxLAorICAgICAgLTAuMDE4NjM4ODc4MTA5MjcsIC0wLjAzMTkzNDI4NDM4OTE1LCAwLjAwNTQxOTA3NzQ4NzA3fSwKKyAgezAuNTY2MTk0NzA3NTc2NDEsIC0wLjc1NDY0NDU2OTM5MzAyLCAwLjE2MjQyMTM3NzQyMjMwLCAwLjE2NzQ0MjQzNDkzNjcyLAorICAgICAgICAtMC4xODkwMTYwNDE5OTYwOSwgMC4zMDkzMTc4Mjg0MTgzMCwgLTAuMjc1NjI5NjE5ODYyMjQsCisgICAgICAgIDAuMDA2NDczMTA2NzcyNDYsIDAuMDg2NDc1MDM3ODAzNTEsIC0wLjAzNzg4OTg0NTU0ODQwLAorICAgICAgLTAuMDA1ODgyMTU0NDM0MjF9LAorICB7MC41ODEwMDQ5NDk2MDU1MywgLTAuNTMxNzQ5MDkwNTg1NzgsIC0wLjE0Mjg5Nzk5MDM0MjUzLCAwLjE3NTIwNzA0ODM1NTIyLAorICAgICAgICAwLjAyMzc3OTQ1MjE3NjE1LCAwLjE1NTU4NDQ5MTM1NTczLCAtMC4yNTM0NDc5MDA1OTM1MywgMC4wMTYyODQ2MjQwNjMzMywKKyAgICAgIDAuMDY5MjA0Njc3NjM5NTksIC0wLjAzNzIxNjExMzk1ODAxLCAtMC4wMDc0OTYxODc5NzE3Mn0sCisgIHswLjUzNjQ4Nzg5MjU1MTA1LCAtMC40MjE2MzAzNDM1MDY5NiwgLTAuMDAyNzU5NTM2MTE5MjksIDAuMDQyNjc4NDIyMTk0MTUsCisgICAgICAgIC0wLjEwMjE0ODY0MTc5Njc2LCAwLjE0NTkwNzcyMjg5Mzg4LCAtMC4wMjQ1OTg2NDg1OTM0NSwKKyAgICAgICAgLTAuMTEyMDIzMTUxOTUzODgsIC0wLjA0MDYwMDM0MTI3MDAwLCAwLjA0Nzg4NjY1NTQ4MTgwLAorICAgICAgLTAuMDIyMTc5MzY4MDExMzR9Cit9OworCitzdGF0aWMgY29uc3QgZ2Zsb2F0IEFCdXR0ZXJbOV1bM10gPSB7CisgIHsxLiwgLTEuOTcyMjMzNzI5MTk1MjcsIDAuOTcyNjEzOTY5MzEzMDZ9LAorICB7MS4sIC0xLjk2OTc3ODU1NTgyNjE4LCAwLjk3MDIyODQ3NTY2MzUwfSwKKyAgezEuLCAtMS45NTgzNTM4MDk3NTM5OCwgMC45NTkyMDM0OTk2NTQ1OX0sCisgIHsxLiwgLTEuOTUwMDI3NTkxNDk4NzgsIDAuOTUxMjQ2MTM2Njk4MzV9LAorICB7MS4sIC0xLjk0NTYxMDIzNTY2NTI3LCAwLjk0NzA1MDcwNDI2MTE4fSwKKyAgezEuLCAtMS45Mjc4MzI4Njk3NzAzNiwgMC45MzAzNDc3NTIzNDI2OH0sCisgIHsxLiwgLTEuOTE4NTg5NTMwMzM3ODQsIDAuOTIxNzc2MTg3NjgzODF9LAorICB7MS4sIC0xLjkxNTQyMTA4MDc0NzgwLCAwLjkxODg1NTU4MzIzNjI1fSwKKyAgezEuLCAtMS44ODkwMzMwNzkzOTQ1MiwgMC44OTQ4NzQzNDQ2MTY2NH0KK307CisKK3N0YXRpYyBjb25zdCBnZmxvYXQgQkJ1dHRlcls5XVszXSA9IHsKKyAgezAuOTg2MjExOTI0NjI3MDgsIC0xLjk3MjQyMzg0OTI1NDE2LCAwLjk4NjIxMTkyNDYyNzA4fSwKKyAgezAuOTg1MDAxNzU3ODcyNDIsIC0xLjk3MDAwMzUxNTc0NDg0LCAwLjk4NTAwMTc1Nzg3MjQyfSwKKyAgezAuOTc5Mzg5MzI3MzUyMTQsIC0xLjk1ODc3ODY1NDcwNDI4LCAwLjk3OTM4OTMyNzM1MjE0fSwKKyAgezAuOTc1MzE4NDMyMDQ5MjgsIC0xLjk1MDYzNjg2NDA5ODU3LCAwLjk3NTMxODQzMjA0OTI4fSwKKyAgezAuOTczMTY1MjM0OTgxNjEsIC0xLjk0NjMzMDQ2OTk2MzIzLCAwLjk3MzE2NTIzNDk4MTYxfSwKKyAgezAuOTY0NTQ1MTU1NTI4MjYsIC0xLjkyOTA5MDMxMTA1NjUyLCAwLjk2NDU0NTE1NTUyODI2fSwKKyAgezAuOTYwMDkxNDI5NTA1NDEsIC0xLjkyMDE4Mjg1OTAxMDgyLCAwLjk2MDA5MTQyOTUwNTQxfSwKKyAgezAuOTU4NTY5MTY1OTk2MDEsIC0xLjkxNzEzODMzMTk5MjAzLCAwLjk1ODU2OTE2NTk5NjAxfSwKKyAgezAuOTQ1OTc2ODU2MDAyNzksIC0xLjg5MTk1MzcxMjAwNTU4LCAwLjk0NTk3Njg1NjAwMjc5fQorfTsKKworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcgKCBkZWZhdWx0IDogNDMwNSApCisjZW5kaWYKKworLyogRmlsdGVyIGZ1bmN0aW9ucy4gIFRoZXNlIGFjY2VzcyBlbGVtZW50cyB3aXRoIG5lZ2F0aXZlIGluZGljZXMgb2YKKyAqIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGFycmF5cyAodXAgdG8gdGhlIGZpbHRlcidzIG9yZGVyKS4gKi8KKworLyogRm9yIG11Y2ggYmV0dGVyIHBlcmZvcm1hbmNlLCB0aGUgZnVuY3Rpb24gYmVsb3cgaGFzIGJlZW4KKyAqIGltcGxlbWVudGVkIGJ5IHVucm9sbGluZyB0aGUgaW5uZXIgbG9vcCBmb3Igb3VyIHR3byB1c2UgY2FzZXMuICovCisKKy8qCisgKiBzdGF0aWMgaW5saW5lIHZvaWQKKyAqIGFwcGx5X2ZpbHRlciAoY29uc3QgZ2Zsb2F0ICogaW5wdXQsIGdmbG9hdCAqIG91dHB1dCwgZ3VpbnQgbl9zYW1wbGVzLAorICogICAgIGNvbnN0IGdmbG9hdCAqIGEsIGNvbnN0IGdmbG9hdCAqIGIsIGd1aW50IG9yZGVyKQorICogeworICogICBnZmxvYXQgeTsKKyAqICAgZ2ludCBpLCBrOworICogCisgKiAgIGZvciAoaSA9IDA7IGkgPCBuX3NhbXBsZXM7IGkrKykgeworICogICAgIHkgPSBpbnB1dFtpXSAqIGJbMF07CisgKiAgICAgZm9yIChrID0gMTsgayA8PSBvcmRlcjsgaysrKQorICogICAgICAgeSArPSBpbnB1dFtpIC0ga10gKiBiW2tdIC0gb3V0cHV0W2kgLSBrXSAqIGFba107CisgKiAgICAgb3V0cHV0W2ldID0geTsKKyAqICAgfQorICogfQorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAoreXVsZV9maWx0ZXIgKGNvbnN0IGdmbG9hdCAqIGlucHV0LCBnZmxvYXQgKiBvdXRwdXQsCisgICAgY29uc3QgZ2Zsb2F0ICogYSwgY29uc3QgZ2Zsb2F0ICogYikKK3sKKyAgLyogMWUtMTAgaXMgYWRkZWQgYmVsb3cgdG8gYXZvaWQgcnVubmluZyBpbnRvIGRlbm9ybWFscyB3aGVuIG9wZXJhdGluZyBvbgorICAgKiBuZWFyIHNpbGVuY2UuICovCisKKyAgb3V0cHV0WzBdID0gMWUtMTAgKyBpbnB1dFswXSAqIGJbMF0KKyAgICAgICsgaW5wdXRbLTFdICogYlsxXSAtIG91dHB1dFstMV0gKiBhWzFdCisgICAgICArIGlucHV0Wy0yXSAqIGJbMl0gLSBvdXRwdXRbLTJdICogYVsyXQorICAgICAgKyBpbnB1dFstM10gKiBiWzNdIC0gb3V0cHV0Wy0zXSAqIGFbM10KKyAgICAgICsgaW5wdXRbLTRdICogYls0XSAtIG91dHB1dFstNF0gKiBhWzRdCisgICAgICArIGlucHV0Wy01XSAqIGJbNV0gLSBvdXRwdXRbLTVdICogYVs1XQorICAgICAgKyBpbnB1dFstNl0gKiBiWzZdIC0gb3V0cHV0Wy02XSAqIGFbNl0KKyAgICAgICsgaW5wdXRbLTddICogYls3XSAtIG91dHB1dFstN10gKiBhWzddCisgICAgICArIGlucHV0Wy04XSAqIGJbOF0gLSBvdXRwdXRbLThdICogYVs4XQorICAgICAgKyBpbnB1dFstOV0gKiBiWzldIC0gb3V0cHV0Wy05XSAqIGFbOV0KKyAgICAgICsgaW5wdXRbLTEwXSAqIGJbMTBdIC0gb3V0cHV0Wy0xMF0gKiBhWzEwXTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitidXR0ZXJfZmlsdGVyIChjb25zdCBnZmxvYXQgKiBpbnB1dCwgZ2Zsb2F0ICogb3V0cHV0LAorICAgIGNvbnN0IGdmbG9hdCAqIGEsIGNvbnN0IGdmbG9hdCAqIGIpCit7CisgIG91dHB1dFswXSA9IGlucHV0WzBdICogYlswXQorICAgICAgKyBpbnB1dFstMV0gKiBiWzFdIC0gb3V0cHV0Wy0xXSAqIGFbMV0KKyAgICAgICsgaW5wdXRbLTJdICogYlsyXSAtIG91dHB1dFstMl0gKiBhWzJdOworfQorCisvKiBCZWNhdXNlIGJ1dHRlcl9maWx0ZXIgYW5kIHl1bGVfZmlsdGVyIGFyZSBpbmxpbmVkLCB0aGlzIGZ1bmN0aW9uIGlzCisgKiBhIGJpdCBibG93bi11cCAoY29kZS1zaXplIHdpc2UpLCBidXQgbm90IGlubGluaW5nIGdpdmVzIGEgY2EuIDQwJQorICogcGVyZm9ybWFuY2UgcGVuYWx0eS4gKi8KKworc3RhdGljIGlubGluZSB2b2lkCithcHBseV9maWx0ZXJzIChjb25zdCBSZ0FuYWx5c2lzQ3R4ICogY3R4LCBjb25zdCBnZmxvYXQgKiBpbnB1dF9sLAorICAgIGNvbnN0IGdmbG9hdCAqIGlucHV0X3IsIGd1aW50IG5fc2FtcGxlcykKK3sKKyAgY29uc3QgZ2Zsb2F0ICpheXVsZSA9IEFZdWxlW2N0eC0+c2FtcGxlX3JhdGVfaW5kZXhdOworICBjb25zdCBnZmxvYXQgKmJ5dWxlID0gQll1bGVbY3R4LT5zYW1wbGVfcmF0ZV9pbmRleF07CisgIGNvbnN0IGdmbG9hdCAqYWJ1dHRlciA9IEFCdXR0ZXJbY3R4LT5zYW1wbGVfcmF0ZV9pbmRleF07CisgIGNvbnN0IGdmbG9hdCAqYmJ1dHRlciA9IEJCdXR0ZXJbY3R4LT5zYW1wbGVfcmF0ZV9pbmRleF07CisgIGdpbnQgcG9zID0gY3R4LT53aW5kb3dfbl9zYW1wbGVzX2RvbmU7CisgIGdpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbl9zYW1wbGVzOyBpKyssIHBvcysrKSB7CisgICAgeXVsZV9maWx0ZXIgKGlucHV0X2wgKyBpLCBjdHgtPnN0ZXBfbCArIHBvcywgYXl1bGUsIGJ5dWxlKTsKKyAgICBidXR0ZXJfZmlsdGVyIChjdHgtPnN0ZXBfbCArIHBvcywgY3R4LT5vdXRfbCArIHBvcywgYWJ1dHRlciwgYmJ1dHRlcik7CisKKyAgICB5dWxlX2ZpbHRlciAoaW5wdXRfciArIGksIGN0eC0+c3RlcF9yICsgcG9zLCBheXVsZSwgYnl1bGUpOworICAgIGJ1dHRlcl9maWx0ZXIgKGN0eC0+c3RlcF9yICsgcG9zLCBjdHgtPm91dF9yICsgcG9zLCBhYnV0dGVyLCBiYnV0dGVyKTsKKyAgfQorfQorCisvKiBDbGVhciBmaWx0ZXIgYnVmZmVyIHN0YXRlIGFuZCBjdXJyZW50IFJNUyB3aW5kb3cuICovCisKK3N0YXRpYyB2b2lkCityZXNldF9maWx0ZXJzIChSZ0FuYWx5c2lzQ3R4ICogY3R4KQoreworICBnaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9PUkRFUjsgaSsrKSB7CisKKyAgICBjdHgtPmlucHJlYnVmX2xbaV0gPSAwLjsKKyAgICBjdHgtPnN0ZXBidWZfbFtpXSA9IDAuOworICAgIGN0eC0+b3V0YnVmX2xbaV0gPSAwLjsKKworICAgIGN0eC0+aW5wcmVidWZfcltpXSA9IDAuOworICAgIGN0eC0+c3RlcGJ1Zl9yW2ldID0gMC47CisgICAgY3R4LT5vdXRidWZfcltpXSA9IDAuOworICB9CisKKyAgY3R4LT53aW5kb3dfc3F1YXJlX3N1bSA9IDAuOworICBjdHgtPndpbmRvd19uX3NhbXBsZXNfZG9uZSA9IDA7Cit9CisKKy8qIEFjY3VtdWxhdG9yIGZ1bmN0aW9ucy4gKi8KKworLyogQWRkIHR3byBhY2N1bXVsYXRvcnMgaW4tcGxhY2UuICBUaGUgc3VtIGlzIGRlZmluZWQgYXMgdGhlIHJlc3VsdCBvZgorICogdGhlIHZlY3RvciBzdW0gb2YgdGhlIGhpc3RvZ3JhbSBhcnJheSBhbmQgdGhlIG1heGltdW0gdmFsdWUgb2YgdGhlCisgKiBwZWFrIGZpZWxkLiAgVGh1cyAiYWRkaW5nIiB0aGUgYWNjdW11bGF0b3JzIGZvciBhbGwgdHJhY2tzIHlpZWxkcworICogdGhlIGNvcnJlY3QgcmVzdWx0IGZvciBvYnRhaW5pbmcgdGhlIGFsYnVtIGdhaW4gYW5kIHBlYWsuICovCisKK3N0YXRpYyB2b2lkCithY2N1bXVsYXRvcl9hZGQgKFJnQW5hbHlzaXNBY2MgKiBhY2MsIGNvbnN0IFJnQW5hbHlzaXNBY2MgKiBhY2Nfb3RoZXIpCit7CisgIGdpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTIChhY2MtPmhpc3RvZ3JhbSk7IGkrKykKKyAgICBhY2MtPmhpc3RvZ3JhbVtpXSArPSBhY2Nfb3RoZXItPmhpc3RvZ3JhbVtpXTsKKworICBhY2MtPnBlYWsgPSBNQVggKGFjYy0+cGVhaywgYWNjX290aGVyLT5wZWFrKTsKK30KKworLyogUmVzZXQgYW4gYWNjdW11bGF0b3IgdG8gemVyby4gKi8KKworc3RhdGljIHZvaWQKK2FjY3VtdWxhdG9yX2NsZWFyIChSZ0FuYWx5c2lzQWNjICogYWNjKQoreworICBtZW1zZXQgKGFjYy0+aGlzdG9ncmFtLCAwLCBzaXplb2YgKGFjYy0+aGlzdG9ncmFtKSk7CisgIGFjYy0+cGVhayA9IDAuOworfQorCisvKiBPYnRhaW4gZmluYWwgYW5hbHlzaXMgcmVzdWx0IGZyb20gYW4gYWNjdW11bGF0b3IuICBSZXR1cm5zIFRSVUUgb24KKyAqIHN1Y2Nlc3MsIEZBTFNFIG9uIGVycm9yIChpZiBhY2N1bXVsYXRvciBpcyBzdGlsbCB6ZXJvKS4gKi8KKworc3RhdGljIGdib29sZWFuCithY2N1bXVsYXRvcl9yZXN1bHQgKGNvbnN0IFJnQW5hbHlzaXNBY2MgKiBhY2MsIGdkb3VibGUgKiByZXN1bHRfZ2FpbiwKKyAgICBnZG91YmxlICogcmVzdWx0X3BlYWspCit7CisgIGd1aW50MzIgc3VtID0gMDsKKyAgZ3VpbnQzMiB1cHBlcjsKKyAgZ3VpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTIChhY2MtPmhpc3RvZ3JhbSk7IGkrKykKKyAgICBzdW0gKz0gYWNjLT5oaXN0b2dyYW1baV07CisKKyAgaWYgKHN1bSA9PSAwKQorICAgIC8qIEFsbCBlbnRyaWVzIGFyZSAwOiBXZSBnb3QgbGVzcyB0aGFuIDUwbXMgb2YgZGF0YS4gKi8KKyAgICByZXR1cm4gRkFMU0U7CisKKyAgdXBwZXIgPSAoZ3VpbnQzMikgY2VpbCAoc3VtICogKDEuIC0gKGdkb3VibGUpIChSTVNfUEVSQ0VOVElMRSAvIDEwMC4pKSk7CisKKyAgZm9yIChpID0gR19OX0VMRU1FTlRTIChhY2MtPmhpc3RvZ3JhbSk7IGktLTspIHsKKyAgICBpZiAodXBwZXIgPD0gYWNjLT5oaXN0b2dyYW1baV0pCisgICAgICBicmVhazsKKyAgICB1cHBlciAtPSBhY2MtPmhpc3RvZ3JhbVtpXTsKKyAgfQorCisgIGlmIChyZXN1bHRfcGVhayAhPSBOVUxMKQorICAgICpyZXN1bHRfcGVhayA9IGFjYy0+cGVhazsKKyAgaWYgKHJlc3VsdF9nYWluICE9IE5VTEwpCisgICAgKnJlc3VsdF9nYWluID0gUElOS19SRUYgLSAoZ2RvdWJsZSkgaSAvIFNURVBTX1BFUl9EQjsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogRnVuY3Rpb25zIHRoYXQgb3BlcmF0ZSBvbiBjb250ZXh0cywgZm9yIGV4dGVybmFsIHVzYWdlLiAqLworCisvKiBDcmVhdGUgYSBuZXcgY29udGV4dC4gIEJlZm9yZSBpdCBjYW4gYmUgdXNlZCwgYSBzYW1wbGUgcmF0ZSBtdXN0IGJlCisgKiBjb25maWd1cmVkIHVzaW5nIHJnX2FuYWx5c2lzX3NldF9zYW1wbGVfcmF0ZS4gKi8KKworUmdBbmFseXNpc0N0eCAqCityZ19hbmFseXNpc19uZXcgKHZvaWQpCit7CisgIFJnQW5hbHlzaXNDdHggKmN0eDsKKworICBjdHggPSBnX25ldyAoUmdBbmFseXNpc0N0eCwgMSk7CisKKyAgY3R4LT5pbnByZV9sID0gY3R4LT5pbnByZWJ1Zl9sICsgTUFYX09SREVSOworICBjdHgtPnN0ZXBfbCA9IGN0eC0+c3RlcGJ1Zl9sICsgTUFYX09SREVSOworICBjdHgtPm91dF9sID0gY3R4LT5vdXRidWZfbCArIE1BWF9PUkRFUjsKKworICBjdHgtPmlucHJlX3IgPSBjdHgtPmlucHJlYnVmX3IgKyBNQVhfT1JERVI7CisgIGN0eC0+c3RlcF9yID0gY3R4LT5zdGVwYnVmX3IgKyBNQVhfT1JERVI7CisgIGN0eC0+b3V0X3IgPSBjdHgtPm91dGJ1Zl9yICsgTUFYX09SREVSOworCisgIGN0eC0+c2FtcGxlX3JhdGUgPSAwOworCisgIGFjY3VtdWxhdG9yX2NsZWFyICgmY3R4LT50cmFjayk7CisgIGFjY3VtdWxhdG9yX2NsZWFyICgmY3R4LT5hbGJ1bSk7CisKKyAgcmV0dXJuIGN0eDsKK30KKworc3RhdGljIHZvaWQKK3Jlc2V0X3NpbGVuY2VfZGV0ZWN0aW9uIChSZ0FuYWx5c2lzQ3R4ICogY3R4KQoreworICBjdHgtPmJ1ZmZlcl90aW1lc3RhbXAgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBjdHgtPmJ1ZmZlcl9uX3NhbXBsZXNfZG9uZSA9IDA7Cit9CisKKy8qIEFkYXB0IHRvIGdpdmVuIHNhbXBsZSByYXRlLiAgRG9lcyBub3RoaW5nIGlmIGFscmVhZHkgdGhlIGN1cnJlbnQKKyAqIHJhdGUgKHJldHVybnMgVFJVRSB0aGVuKS4gIFJldHVybnMgRkFMU0Ugb25seSBpZiBnaXZlbiBzYW1wbGUgcmF0ZQorICogaXMgbm90IHN1cHBvcnRlZC4gIElmIHRoZSBjb25maWd1cmVkIHJhdGUgY2hhbmdlcywgdGhlIGxhc3QKKyAqIHVucHJvY2Vzc2VkIGluY29tcGxldGUgNTBtcyBjaHVuayBvZiBkYXRhIGlzIGRyb3BwZWQgYmVjYXVzZSB0aGUKKyAqIGZpbHRlcnMgYXJlIHJlc2V0LiAqLworCitnYm9vbGVhbgorcmdfYW5hbHlzaXNfc2V0X3NhbXBsZV9yYXRlIChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBnaW50IHNhbXBsZV9yYXRlKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAoY3R4ICE9IE5VTEwsIEZBTFNFKTsKKworICBpZiAoY3R4LT5zYW1wbGVfcmF0ZSA9PSBzYW1wbGVfcmF0ZSkKKyAgICByZXR1cm4gVFJVRTsKKworICBzd2l0Y2ggKHNhbXBsZV9yYXRlKSB7CisgICAgY2FzZSA0ODAwMDoKKyAgICAgIGN0eC0+c2FtcGxlX3JhdGVfaW5kZXggPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0NDEwMDoKKyAgICAgIGN0eC0+c2FtcGxlX3JhdGVfaW5kZXggPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjAwMDoKKyAgICAgIGN0eC0+c2FtcGxlX3JhdGVfaW5kZXggPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDAwMDoKKyAgICAgIGN0eC0+c2FtcGxlX3JhdGVfaW5kZXggPSAzOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjA1MDoKKyAgICAgIGN0eC0+c2FtcGxlX3JhdGVfaW5kZXggPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjAwMDoKKyAgICAgIGN0eC0+c2FtcGxlX3JhdGVfaW5kZXggPSA1OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjAwMDoKKyAgICAgIGN0eC0+c2FtcGxlX3JhdGVfaW5kZXggPSA2OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMTAyNToKKyAgICAgIGN0eC0+c2FtcGxlX3JhdGVfaW5kZXggPSA3OworICAgICAgYnJlYWs7CisgICAgY2FzZSA4MDAwOgorICAgICAgY3R4LT5zYW1wbGVfcmF0ZV9pbmRleCA9IDg7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgY3R4LT5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOworICAvKiBUaGUgKyA5OTkgaGFzIHRoZSBlZmZlY3Qgb2YgY2VpbCgpaW5nOiAqLworICBjdHgtPndpbmRvd19uX3NhbXBsZXMgPSAoZ3VpbnQpICgoc2FtcGxlX3JhdGUgKiBSTVNfV0lORE9XX01TRUNTICsgOTk5KQorICAgICAgLyAxMDAwKTsKKworICByZXNldF9maWx0ZXJzIChjdHgpOworICByZXNldF9zaWxlbmNlX2RldGVjdGlvbiAoY3R4KTsKKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorcmdfYW5hbHlzaXNfaW5pdF9zaWxlbmNlX2RldGVjdGlvbiAoUmdBbmFseXNpc0N0eCAqIGN0eCwKKyAgICB2b2lkICgqcG9zdF9tZXNzYWdlKSAoZ3BvaW50ZXIgYW5hbHlzaXMsIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsCisgICAgICAgIEdzdENsb2NrVGltZSBkdXJhdGlvbiwgZ2RvdWJsZSByZ2xldmVsKSwgZ3BvaW50ZXIgYW5hbHlzaXMpCit7CisgIGN0eC0+cG9zdF9tZXNzYWdlID0gcG9zdF9tZXNzYWdlOworICBjdHgtPmFuYWx5c2lzID0gYW5hbHlzaXM7CisgIHJlc2V0X3NpbGVuY2VfZGV0ZWN0aW9uIChjdHgpOworfQorCit2b2lkCityZ19hbmFseXNpc19zdGFydF9idWZmZXIgKFJnQW5hbHlzaXNDdHggKiBjdHgsIEdzdENsb2NrVGltZSBidWZmZXJfdGltZXN0YW1wKQoreworICBjdHgtPmJ1ZmZlcl90aW1lc3RhbXAgPSBidWZmZXJfdGltZXN0YW1wOworICBjdHgtPmJ1ZmZlcl9uX3NhbXBsZXNfZG9uZSA9IDA7Cit9CisKK3ZvaWQKK3JnX2FuYWx5c2lzX2Rlc3Ryb3kgKFJnQW5hbHlzaXNDdHggKiBjdHgpCit7CisgIGdfZnJlZSAoY3R4KTsKK30KKworLyogRW50cnkgcG9pbnRzIGZvciBhbmFseXppbmcgc2FtcGxlIGRhdGEgaW4gY29tbW9uIHJhdyBkYXRhIGZvcm1hdHMuCisgKiBUaGUgc3RlcmVvIGZvcm1hdCBmdW5jdGlvbnMgZXhwZWN0IGludGVybGVhdmVkIGZyYW1lcy4gIEl0IGlzCisgKiBwb3NzaWJsZSB0byBwYXNzIGRhdGEgaW4gZGlmZmVyZW50IGZvcm1hdHMgZm9yIHRoZSBzYW1lIGNvbnRleHQsCisgKiB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zLiAgQWxsIGZ1bmN0aW9ucyBoYXZlIHRoZSBzYW1lIHNpZ25hdHVyZTsKKyAqIHRoZSBkZXB0aCBhcmd1bWVudCBmb3IgdGhlIGZsb2F0IGZ1bmN0aW9ucyBpcyBub3QgdmFyaWFibGUgYW5kIG11c3QKKyAqIGJlIGdpdmVuIHRoZSB2YWx1ZSAzMi4gKi8KKwordm9pZAorcmdfYW5hbHlzaXNfYW5hbHl6ZV9tb25vX2Zsb2F0IChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBnY29uc3Rwb2ludGVyIGRhdGEsCisgICAgZ3NpemUgc2l6ZSwgZ3VpbnQgZGVwdGgpCit7CisgIGdmbG9hdCBjb252X3NhbXBsZXNbNTEyXTsKKyAgY29uc3QgZ2Zsb2F0ICpzYW1wbGVzID0gKGdmbG9hdCAqKSBkYXRhOworICBndWludCBuX3NhbXBsZXMgPSBzaXplIC8gc2l6ZW9mIChnZmxvYXQpOworICBnaW50IGk7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoZGVwdGggPT0gMzIpOworICBnX3JldHVybl9pZl9mYWlsIChzaXplICUgc2l6ZW9mIChnZmxvYXQpID09IDApOworCisgIHdoaWxlIChuX3NhbXBsZXMpIHsKKyAgICBnaW50IG4gPSBNSU4gKG5fc2FtcGxlcywgR19OX0VMRU1FTlRTIChjb252X3NhbXBsZXMpKTsKKworICAgIG5fc2FtcGxlcyAtPSBuOworICAgIG1lbWNweSAoY29udl9zYW1wbGVzLCBzYW1wbGVzLCBuICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBjdHgtPnRyYWNrLnBlYWsgPSBNQVggKGN0eC0+dHJhY2sucGVhaywgZmFicyAoY29udl9zYW1wbGVzW2ldKSk7CisgICAgICBjb252X3NhbXBsZXNbaV0gKj0gMzI3NjguOworICAgIH0KKyAgICBzYW1wbGVzICs9IG47CisgICAgcmdfYW5hbHlzaXNfYW5hbHl6ZSAoY3R4LCBjb252X3NhbXBsZXMsIE5VTEwsIG4pOworICB9Cit9CisKK3ZvaWQKK3JnX2FuYWx5c2lzX2FuYWx5emVfc3RlcmVvX2Zsb2F0IChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBnY29uc3Rwb2ludGVyIGRhdGEsCisgICAgZ3NpemUgc2l6ZSwgZ3VpbnQgZGVwdGgpCit7CisgIGdmbG9hdCBjb252X3NhbXBsZXNfbFsyNTZdOworICBnZmxvYXQgY29udl9zYW1wbGVzX3JbMjU2XTsKKyAgY29uc3QgZ2Zsb2F0ICpzYW1wbGVzID0gKGdmbG9hdCAqKSBkYXRhOworICBndWludCBuX2ZyYW1lcyA9IHNpemUgLyAoc2l6ZW9mIChnZmxvYXQpICogMik7CisgIGdpbnQgaTsKKworICBnX3JldHVybl9pZl9mYWlsIChkZXB0aCA9PSAzMik7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKHNpemUgJSAoc2l6ZW9mIChnZmxvYXQpICogMikgPT0gMCk7CisKKyAgd2hpbGUgKG5fZnJhbWVzKSB7CisgICAgZ2ludCBuID0gTUlOIChuX2ZyYW1lcywgR19OX0VMRU1FTlRTIChjb252X3NhbXBsZXNfbCkpOworCisgICAgbl9mcmFtZXMgLT0gbjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBnZmxvYXQgb2xkX3NhbXBsZTsKKworICAgICAgb2xkX3NhbXBsZSA9IHNhbXBsZXNbMiAqIGldOworICAgICAgY3R4LT50cmFjay5wZWFrID0gTUFYIChjdHgtPnRyYWNrLnBlYWssIGZhYnMgKG9sZF9zYW1wbGUpKTsKKyAgICAgIGNvbnZfc2FtcGxlc19sW2ldID0gb2xkX3NhbXBsZSAqIDMyNzY4LjsKKworICAgICAgb2xkX3NhbXBsZSA9IHNhbXBsZXNbMiAqIGkgKyAxXTsKKyAgICAgIGN0eC0+dHJhY2sucGVhayA9IE1BWCAoY3R4LT50cmFjay5wZWFrLCBmYWJzIChvbGRfc2FtcGxlKSk7CisgICAgICBjb252X3NhbXBsZXNfcltpXSA9IG9sZF9zYW1wbGUgKiAzMjc2OC47CisgICAgfQorICAgIHNhbXBsZXMgKz0gMiAqIG47CisgICAgcmdfYW5hbHlzaXNfYW5hbHl6ZSAoY3R4LCBjb252X3NhbXBsZXNfbCwgY29udl9zYW1wbGVzX3IsIG4pOworICB9Cit9CisKK3ZvaWQKK3JnX2FuYWx5c2lzX2FuYWx5emVfbW9ub19pbnQxNiAoUmdBbmFseXNpc0N0eCAqIGN0eCwgZ2NvbnN0cG9pbnRlciBkYXRhLAorICAgIGdzaXplIHNpemUsIGd1aW50IGRlcHRoKQoreworICBnZmxvYXQgY29udl9zYW1wbGVzWzUxMl07CisgIGdpbnQzMiBwZWFrX3NhbXBsZSA9IDA7CisgIGNvbnN0IGdpbnQxNiAqc2FtcGxlcyA9IChnaW50MTYgKikgZGF0YTsKKyAgZ3VpbnQgbl9zYW1wbGVzID0gc2l6ZSAvIHNpemVvZiAoZ2ludDE2KTsKKyAgZ2ludCBzaGlmdCA9IDEgPDwgKHNpemVvZiAoZ2ludDE2KSAqIDggLSBkZXB0aCk7CisgIGdpbnQgaTsKKworICBnX3JldHVybl9pZl9mYWlsIChkZXB0aCA8PSAoc2l6ZW9mIChnaW50MTYpICogOCkpOworICBnX3JldHVybl9pZl9mYWlsIChzaXplICUgc2l6ZW9mIChnaW50MTYpID09IDApOworCisgIHdoaWxlIChuX3NhbXBsZXMpIHsKKyAgICBnaW50IG4gPSBNSU4gKG5fc2FtcGxlcywgR19OX0VMRU1FTlRTIChjb252X3NhbXBsZXMpKTsKKworICAgIG5fc2FtcGxlcyAtPSBuOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIGdpbnQxNiBvbGRfc2FtcGxlID0gc2FtcGxlc1tpXSAqIHNoaWZ0OworCisgICAgICBwZWFrX3NhbXBsZSA9IE1BWCAocGVha19zYW1wbGUsIEFCUyAoKGdpbnQzMikgb2xkX3NhbXBsZSkpOworICAgICAgY29udl9zYW1wbGVzW2ldID0gKGdmbG9hdCkgb2xkX3NhbXBsZTsKKyAgICB9CisgICAgc2FtcGxlcyArPSBuOworICAgIHJnX2FuYWx5c2lzX2FuYWx5emUgKGN0eCwgY29udl9zYW1wbGVzLCBOVUxMLCBuKTsKKyAgfQorICBjdHgtPnRyYWNrLnBlYWsgPSBNQVggKGN0eC0+dHJhY2sucGVhaywKKyAgICAgIChnZG91YmxlKSBwZWFrX3NhbXBsZSAvICgoZ2RvdWJsZSkgKDF1IDw8IDE1KSkpOworfQorCit2b2lkCityZ19hbmFseXNpc19hbmFseXplX3N0ZXJlb19pbnQxNiAoUmdBbmFseXNpc0N0eCAqIGN0eCwgZ2NvbnN0cG9pbnRlciBkYXRhLAorICAgIGdzaXplIHNpemUsIGd1aW50IGRlcHRoKQoreworICBnZmxvYXQgY29udl9zYW1wbGVzX2xbMjU2XTsKKyAgZ2Zsb2F0IGNvbnZfc2FtcGxlc19yWzI1Nl07CisgIGdpbnQzMiBwZWFrX3NhbXBsZSA9IDA7CisgIGNvbnN0IGdpbnQxNiAqc2FtcGxlcyA9IChnaW50MTYgKikgZGF0YTsKKyAgZ3VpbnQgbl9mcmFtZXMgPSBzaXplIC8gKHNpemVvZiAoZ2ludDE2KSAqIDIpOworICBnaW50IHNoaWZ0ID0gMSA8PCAoc2l6ZW9mIChnaW50MTYpICogOCAtIGRlcHRoKTsKKyAgZ2ludCBpOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKGRlcHRoIDw9IChzaXplb2YgKGdpbnQxNikgKiA4KSk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKHNpemUgJSAoc2l6ZW9mIChnaW50MTYpICogMikgPT0gMCk7CisKKyAgd2hpbGUgKG5fZnJhbWVzKSB7CisgICAgZ2ludCBuID0gTUlOIChuX2ZyYW1lcywgR19OX0VMRU1FTlRTIChjb252X3NhbXBsZXNfbCkpOworCisgICAgbl9mcmFtZXMgLT0gbjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBnaW50MTYgb2xkX3NhbXBsZTsKKworICAgICAgb2xkX3NhbXBsZSA9IHNhbXBsZXNbMiAqIGldICogc2hpZnQ7CisgICAgICBwZWFrX3NhbXBsZSA9IE1BWCAocGVha19zYW1wbGUsIEFCUyAoKGdpbnQzMikgb2xkX3NhbXBsZSkpOworICAgICAgY29udl9zYW1wbGVzX2xbaV0gPSAoZ2Zsb2F0KSBvbGRfc2FtcGxlOworCisgICAgICBvbGRfc2FtcGxlID0gc2FtcGxlc1syICogaSArIDFdICogc2hpZnQ7CisgICAgICBwZWFrX3NhbXBsZSA9IE1BWCAocGVha19zYW1wbGUsIEFCUyAoKGdpbnQzMikgb2xkX3NhbXBsZSkpOworICAgICAgY29udl9zYW1wbGVzX3JbaV0gPSAoZ2Zsb2F0KSBvbGRfc2FtcGxlOworICAgIH0KKyAgICBzYW1wbGVzICs9IDIgKiBuOworICAgIHJnX2FuYWx5c2lzX2FuYWx5emUgKGN0eCwgY29udl9zYW1wbGVzX2wsIGNvbnZfc2FtcGxlc19yLCBuKTsKKyAgfQorICBjdHgtPnRyYWNrLnBlYWsgPSBNQVggKGN0eC0+dHJhY2sucGVhaywKKyAgICAgIChnZG91YmxlKSBwZWFrX3NhbXBsZSAvICgoZ2RvdWJsZSkgKDF1IDw8IDE1KSkpOworfQorCisvKiBBbmFseXplIHRoZSBnaXZlbiBjaHVuayBvZiBzYW1wbGVzLiAgVGhlIHNhbXBsZSBkYXRhIGlzIGdpdmVuIGluCisgKiBmbG9hdGluZyBwb2ludCBmb3JtYXQgYnV0IHNob3VsZCBiZSBzY2FsZWQgc3VjaCB0aGF0IHRoZSB2YWx1ZXMKKyAqICsvLTMyNzY4LjAgY29ycmVzcG9uZCB0byB0aGUgLTBkQkZTIHJlZmVyZW5jZSBhbXBsaXR1ZGUuCisgKgorICogc2FtcGxlc19sOiBCdWZmZXIgd2l0aCBzYW1wbGUgZGF0YSBmb3IgdGhlIGxlZnQgY2hhbm5lbCBvciBvZiB0aGUKKyAqIG1vbm8gY2hhbm5lbC4KKyAqCisgKiBzYW1wbGVzX3I6IEJ1ZmZlciB3aXRoIHNhbXBsZSBkYXRhIGZvciB0aGUgcmlnaHQgY2hhbm5lbCBvciBOVUxMCisgKiBmb3IgbW9uby4KKyAqCisgKiBuX3NhbXBsZXM6IE51bWJlciBvZiBzYW1wbGVzIHBhc3NlZCBpbiBlYWNoIGJ1ZmZlci4KKyAqLworCit2b2lkCityZ19hbmFseXNpc19hbmFseXplIChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBjb25zdCBnZmxvYXQgKiBzYW1wbGVzX2wsCisgICAgY29uc3QgZ2Zsb2F0ICogc2FtcGxlc19yLCBndWludCBuX3NhbXBsZXMpCit7CisgIGNvbnN0IGdmbG9hdCAqaW5wdXRfbCwgKmlucHV0X3I7CisgIGd1aW50IG5fc2FtcGxlc19kb25lOworICBnaW50IGk7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoY3R4ICE9IE5VTEwpOworICBnX3JldHVybl9pZl9mYWlsIChzYW1wbGVzX2wgIT0gTlVMTCk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKGN0eC0+c2FtcGxlX3JhdGUgIT0gMCk7CisKKyAgaWYgKG5fc2FtcGxlcyA9PSAwKQorICAgIHJldHVybjsKKworICBpZiAoc2FtcGxlc19yID09IE5VTEwpCisgICAgLyogTW9uby4gKi8KKyAgICBzYW1wbGVzX3IgPSBzYW1wbGVzX2w7CisKKyAgbWVtY3B5IChjdHgtPmlucHJlX2wsIHNhbXBsZXNfbCwKKyAgICAgIE1JTiAobl9zYW1wbGVzLCBNQVhfT1JERVIpICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgbWVtY3B5IChjdHgtPmlucHJlX3IsIHNhbXBsZXNfciwKKyAgICAgIE1JTiAobl9zYW1wbGVzLCBNQVhfT1JERVIpICogc2l6ZW9mIChnZmxvYXQpKTsKKworICBuX3NhbXBsZXNfZG9uZSA9IDA7CisgIHdoaWxlIChuX3NhbXBsZXNfZG9uZSA8IG5fc2FtcGxlcykgeworICAgIC8qIExpbWl0IG51bWJlciBvZiBzYW1wbGVzIHRvIGJlIHByb2Nlc3NlZCBpbiB0aGlzIGl0ZXJhdGlvbiB0bworICAgICAqIHRoZSBudW1iZXIgbmVlZGVkIHRvIGNvbXBsZXRlIHRoZSBuZXh0IHdpbmRvdzogKi8KKyAgICBndWludCBuX3NhbXBsZXNfY3VycmVudCA9IE1JTiAobl9zYW1wbGVzIC0gbl9zYW1wbGVzX2RvbmUsCisgICAgICAgIGN0eC0+d2luZG93X25fc2FtcGxlcyAtIGN0eC0+d2luZG93X25fc2FtcGxlc19kb25lKTsKKworICAgIGlmIChuX3NhbXBsZXNfZG9uZSA8IE1BWF9PUkRFUikgeworICAgICAgaW5wdXRfbCA9IGN0eC0+aW5wcmVfbCArIG5fc2FtcGxlc19kb25lOworICAgICAgaW5wdXRfciA9IGN0eC0+aW5wcmVfciArIG5fc2FtcGxlc19kb25lOworICAgICAgbl9zYW1wbGVzX2N1cnJlbnQgPSBNSU4gKG5fc2FtcGxlc19jdXJyZW50LCBNQVhfT1JERVIgLSBuX3NhbXBsZXNfZG9uZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlucHV0X2wgPSBzYW1wbGVzX2wgKyBuX3NhbXBsZXNfZG9uZTsKKyAgICAgIGlucHV0X3IgPSBzYW1wbGVzX3IgKyBuX3NhbXBsZXNfZG9uZTsKKyAgICB9CisKKyAgICBhcHBseV9maWx0ZXJzIChjdHgsIGlucHV0X2wsIGlucHV0X3IsIG5fc2FtcGxlc19jdXJyZW50KTsKKworICAgIC8qIFVwZGF0ZSB0aGUgc3F1YXJlIHN1bS4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbl9zYW1wbGVzX2N1cnJlbnQ7IGkrKykKKyAgICAgIGN0eC0+d2luZG93X3NxdWFyZV9zdW0gKz0gY3R4LT5vdXRfbFtjdHgtPndpbmRvd19uX3NhbXBsZXNfZG9uZSArIGldCisgICAgICAgICAgKiBjdHgtPm91dF9sW2N0eC0+d2luZG93X25fc2FtcGxlc19kb25lICsgaV0KKyAgICAgICAgICArIGN0eC0+b3V0X3JbY3R4LT53aW5kb3dfbl9zYW1wbGVzX2RvbmUgKyBpXQorICAgICAgICAgICogY3R4LT5vdXRfcltjdHgtPndpbmRvd19uX3NhbXBsZXNfZG9uZSArIGldOworCisgICAgY3R4LT53aW5kb3dfbl9zYW1wbGVzX2RvbmUgKz0gbl9zYW1wbGVzX2N1cnJlbnQ7CisgICAgY3R4LT5idWZmZXJfbl9zYW1wbGVzX2RvbmUgKz0gbl9zYW1wbGVzX2N1cnJlbnQ7CisKKyAgICBnX3JldHVybl9pZl9mYWlsIChjdHgtPndpbmRvd19uX3NhbXBsZXNfZG9uZSA8PSBjdHgtPndpbmRvd19uX3NhbXBsZXMpOworCisgICAgaWYgKGN0eC0+d2luZG93X25fc2FtcGxlc19kb25lID09IGN0eC0+d2luZG93X25fc2FtcGxlcykgeworICAgICAgLyogR2V0IHRoZSBSb290IE1lYW4gU3F1YXJlIChSTVMpIGZvciB0aGlzIHNldCBvZiBzYW1wbGVzLiAqLworICAgICAgZ2RvdWJsZSB2YWwgPSBTVEVQU19QRVJfREIgKiAxMC4gKiBsb2cxMCAoY3R4LT53aW5kb3dfc3F1YXJlX3N1bSAvCisgICAgICAgICAgY3R4LT53aW5kb3dfbl9zYW1wbGVzICogMC41ICsgMS5lLTM3KTsKKyAgICAgIGdpbnQgaXZhbCA9IENMQU1QICgoZ2ludCkgdmFsLCAwLAorICAgICAgICAgIChnaW50KSBHX05fRUxFTUVOVFMgKGN0eC0+dHJhY2suaGlzdG9ncmFtKSAtIDEpOworICAgICAgLyogQ29tcHV0ZSB0aGUgcGVyLXdpbmRvdyBnYWluICovCisgICAgICBjb25zdCBnZG91YmxlIGdhaW4gPSBQSU5LX1JFRiAtIChnZG91YmxlKSBpdmFsIC8gU1RFUFNfUEVSX0RCOworICAgICAgY29uc3QgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCA9IGN0eC0+YnVmZmVyX3RpbWVzdGFtcAorICAgICAgICAgICsgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludF9jZWlsIChHU1RfU0VDT05ELAorICAgICAgICAgIGN0eC0+YnVmZmVyX25fc2FtcGxlc19kb25lLAorICAgICAgICAgIGN0eC0+c2FtcGxlX3JhdGUpCisgICAgICAgICAgLSBSTVNfV0lORE9XX01TRUNTICogR1NUX01TRUNPTkQ7CisKKyAgICAgIGN0eC0+cG9zdF9tZXNzYWdlIChjdHgtPmFuYWx5c2lzLCB0aW1lc3RhbXAsCisgICAgICAgICAgUk1TX1dJTkRPV19NU0VDUyAqIEdTVF9NU0VDT05ELCAtZ2Fpbik7CisKKworICAgICAgY3R4LT50cmFjay5oaXN0b2dyYW1baXZhbF0rKzsKKyAgICAgIGN0eC0+d2luZG93X3NxdWFyZV9zdW0gPSAwLjsKKyAgICAgIGN0eC0+d2luZG93X25fc2FtcGxlc19kb25lID0gMDsKKworICAgICAgLyogTm8gbmVlZCBmb3IgbWVtbW92ZSBoZXJlLCB0aGUgYXJlYXMgbmV2ZXIgb3ZlcmxhcDogRXZlbiBmb3IKKyAgICAgICAqIHRoZSBzbWFsbGVzdCBzYW1wbGUgcmF0ZSwgdGhlIG51bWJlciBvZiBzYW1wbGVzIG5lZWRlZCBmb3IKKyAgICAgICAqIHRoZSB3aW5kb3cgaXMgZ3JlYXRlciB0aGFuIE1BWF9PUkRFUi4gKi8KKworICAgICAgbWVtY3B5IChjdHgtPnN0ZXBidWZfbCwgY3R4LT5zdGVwYnVmX2wgKyBjdHgtPndpbmRvd19uX3NhbXBsZXMsCisgICAgICAgICAgTUFYX09SREVSICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgICAgIG1lbWNweSAoY3R4LT5vdXRidWZfbCwgY3R4LT5vdXRidWZfbCArIGN0eC0+d2luZG93X25fc2FtcGxlcywKKyAgICAgICAgICBNQVhfT1JERVIgKiBzaXplb2YgKGdmbG9hdCkpOworCisgICAgICBtZW1jcHkgKGN0eC0+c3RlcGJ1Zl9yLCBjdHgtPnN0ZXBidWZfciArIGN0eC0+d2luZG93X25fc2FtcGxlcywKKyAgICAgICAgICBNQVhfT1JERVIgKiBzaXplb2YgKGdmbG9hdCkpOworICAgICAgbWVtY3B5IChjdHgtPm91dGJ1Zl9yLCBjdHgtPm91dGJ1Zl9yICsgY3R4LT53aW5kb3dfbl9zYW1wbGVzLAorICAgICAgICAgIE1BWF9PUkRFUiAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgICAgfQorCisgICAgbl9zYW1wbGVzX2RvbmUgKz0gbl9zYW1wbGVzX2N1cnJlbnQ7CisgIH0KKworICBpZiAobl9zYW1wbGVzID49IE1BWF9PUkRFUikgeworCisgICAgbWVtY3B5IChjdHgtPmlucHJlYnVmX2wsIHNhbXBsZXNfbCArIG5fc2FtcGxlcyAtIE1BWF9PUkRFUiwKKyAgICAgICAgTUFYX09SREVSICogc2l6ZW9mIChnZmxvYXQpKTsKKworICAgIG1lbWNweSAoY3R4LT5pbnByZWJ1Zl9yLCBzYW1wbGVzX3IgKyBuX3NhbXBsZXMgLSBNQVhfT1JERVIsCisgICAgICAgIE1BWF9PUkRFUiAqIHNpemVvZiAoZ2Zsb2F0KSk7CisKKyAgfSBlbHNlIHsKKworICAgIG1lbW1vdmUgKGN0eC0+aW5wcmVidWZfbCwgY3R4LT5pbnByZWJ1Zl9sICsgbl9zYW1wbGVzLAorICAgICAgICAoTUFYX09SREVSIC0gbl9zYW1wbGVzKSAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgICAgbWVtY3B5IChjdHgtPmlucHJlYnVmX2wgKyBNQVhfT1JERVIgLSBuX3NhbXBsZXMsIHNhbXBsZXNfbCwKKyAgICAgICAgbl9zYW1wbGVzICogc2l6ZW9mIChnZmxvYXQpKTsKKworICAgIG1lbW1vdmUgKGN0eC0+aW5wcmVidWZfciwgY3R4LT5pbnByZWJ1Zl9yICsgbl9zYW1wbGVzLAorICAgICAgICAoTUFYX09SREVSIC0gbl9zYW1wbGVzKSAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgICAgbWVtY3B5IChjdHgtPmlucHJlYnVmX3IgKyBNQVhfT1JERVIgLSBuX3NhbXBsZXMsIHNhbXBsZXNfciwKKyAgICAgICAgbl9zYW1wbGVzICogc2l6ZW9mIChnZmxvYXQpKTsKKworICB9Cit9CisKKy8qIE9idGFpbiB0cmFjayBnYWluIGFuZCBwZWFrLiAgUmV0dXJucyBUUlVFIG9uIHN1Y2Nlc3MuICBDYW4gZmFpbCBpZgorICogbm90IGVub3VnaCBzYW1wbGVzIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBVcGRhdGVzIGFsYnVtIGFjY3VtdWxhdG9yLgorICogUmVzZXRzIHRyYWNrIGFjY3VtdWxhdG9yLiAqLworCitnYm9vbGVhbgorcmdfYW5hbHlzaXNfdHJhY2tfcmVzdWx0IChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBnZG91YmxlICogZ2FpbiwgZ2RvdWJsZSAqIHBlYWspCit7CisgIGdib29sZWFuIHJlc3VsdDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoY3R4ICE9IE5VTEwsIEZBTFNFKTsKKworICBhY2N1bXVsYXRvcl9hZGQgKCZjdHgtPmFsYnVtLCAmY3R4LT50cmFjayk7CisgIHJlc3VsdCA9IGFjY3VtdWxhdG9yX3Jlc3VsdCAoJmN0eC0+dHJhY2ssIGdhaW4sIHBlYWspOworICBhY2N1bXVsYXRvcl9jbGVhciAoJmN0eC0+dHJhY2spOworCisgIHJlc2V0X2ZpbHRlcnMgKGN0eCk7CisgIHJlc2V0X3NpbGVuY2VfZGV0ZWN0aW9uIChjdHgpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIE9idGFpbiBhbGJ1bSBnYWluIGFuZCBwZWFrLiAgUmV0dXJucyBUUlVFIG9uIHN1Y2Nlc3MuICBDYW4gZmFpbCBpZgorICogbm90IGVub3VnaCBzYW1wbGVzIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBSZXNldHMgYWxidW0KKyAqIGFjY3VtdWxhdG9yLiAqLworCitnYm9vbGVhbgorcmdfYW5hbHlzaXNfYWxidW1fcmVzdWx0IChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBnZG91YmxlICogZ2FpbiwgZ2RvdWJsZSAqIHBlYWspCit7CisgIGdib29sZWFuIHJlc3VsdDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoY3R4ICE9IE5VTEwsIEZBTFNFKTsKKworICByZXN1bHQgPSBhY2N1bXVsYXRvcl9yZXN1bHQgKCZjdHgtPmFsYnVtLCBnYWluLCBwZWFrKTsKKyAgYWNjdW11bGF0b3JfY2xlYXIgKCZjdHgtPmFsYnVtKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkCityZ19hbmFseXNpc19yZXNldF9hbGJ1bSAoUmdBbmFseXNpc0N0eCAqIGN0eCkKK3sKKyAgYWNjdW11bGF0b3JfY2xlYXIgKCZjdHgtPmFsYnVtKTsKK30KKworLyogUmVzZXQgaW50ZXJuYWwgYnVmZmVycyBhcyB3ZWxsIGFzIHRyYWNrIGFuZCBhbGJ1bSBhY2N1bXVsYXRvcnMuCisgKiBDb25maWd1cmVkIHNhbXBsZSByYXRlIGlzIGtlcHQgaW50YWN0LiAqLworCit2b2lkCityZ19hbmFseXNpc19yZXNldCAoUmdBbmFseXNpc0N0eCAqIGN0eCkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoY3R4ICE9IE5VTEwpOworCisgIHJlc2V0X2ZpbHRlcnMgKGN0eCk7CisgIGFjY3VtdWxhdG9yX2NsZWFyICgmY3R4LT50cmFjayk7CisgIGFjY3VtdWxhdG9yX2NsZWFyICgmY3R4LT5hbGJ1bSk7CisgIHJlc2V0X3NpbGVuY2VfZGV0ZWN0aW9uIChjdHgpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3JlcGxheWdhaW4vcmdhbmFseXNpcy5oIGIvZ3N0L3JlcGxheWdhaW4vcmdhbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1N2FkMGEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcmVwbGF5Z2Fpbi9yZ2FuYWx5c2lzLmgKQEAgLTAsMCArMSw2MyBAQAorLyogR1N0cmVhbWVyIFJlcGxheUdhaW4gYW5hbHlzaXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVuZSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDAxIERhdmlkIFJvYmluc29uIDxEYXZpZEBSb2JpbnNvbi5vcmc+CisgKiAgICAgICAgICAgICAgICAgICAgR2xlbiBTYXd5ZXIgPGdsZW5zYXd5ZXJAaG90bWFpbC5jb20+CisgKgorICogcmdhbmFseXNpcy5oOiBBbmFseXplIHJhdyBhdWRpbyBkYXRhIGluIGFjY29yZGFuY2Ugd2l0aCBSZXBsYXlHYWluCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfX1JHX0FOQUxZU0lTX0hfXworI2RlZmluZSBfX1JHX0FOQUxZU0lTX0hfXworCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfUmdBbmFseXNpc0N0eCBSZ0FuYWx5c2lzQ3R4OworCitSZ0FuYWx5c2lzQ3R4ICpyZ19hbmFseXNpc19uZXcgKHZvaWQpOworZ2Jvb2xlYW4gcmdfYW5hbHlzaXNfc2V0X3NhbXBsZV9yYXRlIChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBnaW50IHNhbXBsZV9yYXRlKTsKK3ZvaWQgcmdfYW5hbHlzaXNfYW5hbHl6ZV9tb25vX2Zsb2F0IChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBnY29uc3Rwb2ludGVyIGRhdGEsCisgICAgZ3NpemUgc2l6ZSwgZ3VpbnQgZGVwdGgpOwordm9pZCByZ19hbmFseXNpc19hbmFseXplX3N0ZXJlb19mbG9hdCAoUmdBbmFseXNpc0N0eCAqIGN0eCwgZ2NvbnN0cG9pbnRlciBkYXRhLAorICAgIGdzaXplIHNpemUsIGd1aW50IGRlcHRoKTsKK3ZvaWQgcmdfYW5hbHlzaXNfYW5hbHl6ZV9tb25vX2ludDE2IChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBnY29uc3Rwb2ludGVyIGRhdGEsCisgICAgZ3NpemUgc2l6ZSwgZ3VpbnQgZGVwdGgpOwordm9pZCByZ19hbmFseXNpc19hbmFseXplX3N0ZXJlb19pbnQxNiAoUmdBbmFseXNpc0N0eCAqIGN0eCwgZ2NvbnN0cG9pbnRlciBkYXRhLAorICAgIGdzaXplIHNpemUsIGd1aW50IGRlcHRoKTsKK3ZvaWQgcmdfYW5hbHlzaXNfYW5hbHl6ZSAoUmdBbmFseXNpc0N0eCAqIGN0eCwgY29uc3QgZ2Zsb2F0ICogc2FtcGxlc19sLAorICAgIGNvbnN0IGdmbG9hdCAqIHNhbXBsZXNfciwgZ3VpbnQgbl9zYW1wbGVzKTsKK2dib29sZWFuIHJnX2FuYWx5c2lzX3RyYWNrX3Jlc3VsdCAoUmdBbmFseXNpc0N0eCAqIGN0eCwgZ2RvdWJsZSAqIGdhaW4sCisgICAgZ2RvdWJsZSAqIHBlYWspOworZ2Jvb2xlYW4gcmdfYW5hbHlzaXNfYWxidW1fcmVzdWx0IChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBnZG91YmxlICogZ2FpbiwKKyAgICBnZG91YmxlICogcGVhayk7Cit2b2lkIHJnX2FuYWx5c2lzX2luaXRfc2lsZW5jZV9kZXRlY3Rpb24gKAorICAgIFJnQW5hbHlzaXNDdHggKiBjdHgsCisgICAgdm9pZCAoKnBvc3RfbWVzc2FnZSkgKGdwb2ludGVyIGFuYWx5c2lzLCBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBHc3RDbG9ja1RpbWUgZHVyYXRpb24sIGdkb3VibGUgcmdsZXZlbCksCisgICAgZ3BvaW50ZXIgYW5hbHlzaXMpOwordm9pZCByZ19hbmFseXNpc19zdGFydF9idWZmZXIgKFJnQW5hbHlzaXNDdHggKiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0Q2xvY2tUaW1lIGJ1ZmZlcl90aW1lc3RhbXApOwordm9pZCByZ19hbmFseXNpc19yZXNldF9hbGJ1bSAoUmdBbmFseXNpc0N0eCAqIGN0eCk7Cit2b2lkIHJnX2FuYWx5c2lzX3Jlc2V0IChSZ0FuYWx5c2lzQ3R4ICogY3R4KTsKK3ZvaWQgcmdfYW5hbHlzaXNfZGVzdHJveSAoUmdBbmFseXNpc0N0eCAqIGN0eCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX1JHX0FOQUxZU0lTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9NYWtlZmlsZS5hbSBiL2dzdC9ydHAvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IyYWZkNQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyMDkgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdHJ0cC5sYQorCitsaWJnc3RydHBfbGFfU09VUkNFUyA9IFwKKwlkYm9vbGh1ZmYuYyBcCisJZm52MWhhc2guYyBcCisJZ3N0cnRwLmMgXAorCWdzdHJ0cGNoYW5uZWxzLmMgXAorCWdzdHJ0cGFjM2RlcGF5LmMgXAorCWdzdHJ0cGFjM3BheS5jIFwKKwlnc3RydHBidmRlcGF5LmMgXAorCWdzdHJ0cGJ2cGF5LmMgXAorCWdzdHJ0cGNlbHRkZXBheS5jIFwKKwlnc3RydHBjZWx0cGF5LmMgXAorCWdzdHJ0cGR2ZGVwYXkuYyBcCisJZ3N0cnRwZHZwYXkuYyBcCisJZ3N0cnRwZ3N0ZGVwYXkuYyBcCisJZ3N0cnRwZ3N0cGF5LmMgXAorCWdzdHJ0cGlsYmNkZXBheS5jIFwKKwlnc3RydHBpbGJjcGF5LmMgXAorCWdzdHJ0cG1wYWRlcGF5LmMgXAorCWdzdHJ0cG1wYXBheS5jIFwKKwlnc3RydHBtcGFyb2J1c3RkZXBheS5jIFwKKwlnc3RydHBtcHZkZXBheS5jIFwKKwlnc3RydHBtcHZwYXkuYyBcCisJZ3N0cnRwcGNtYWRlcGF5LmMgXAorCWdzdHJ0cHBjbXVkZXBheS5jIFwKKwlnc3RydHBwY211cGF5LmMgXAorCWdzdHJ0cHBjbWFwYXkuYyBcCisJZ3N0cnRwZzcyMmRlcGF5LmMgXAorCWdzdHJ0cGc3MjJwYXkuYyBcCisJZ3N0cnRwZzcyM2RlcGF5LmMgXAorCWdzdHJ0cGc3MjNwYXkuYyBcCisJZ3N0cnRwZzcyNnBheS5jIFwKKwlnc3RydHBnNzI2ZGVwYXkuYyBcCisJZ3N0cnRwZzcyOXBheS5jIFwKKwlnc3RydHBnNzI5ZGVwYXkuYyBcCisJZ3N0cnRwZ3NtZGVwYXkuYyBcCisJZ3N0cnRwZ3NtcGF5LmMgXAorCWdzdHJ0cGFtcmRlcGF5LmMgXAorCWdzdHJ0cGFtcnBheS5jIFwKKwlnc3RydHBoMjYxcGF5LmMgXAorCWdzdHJ0cGgyNjFkZXBheS5jIFwKKwlnc3RydHBoMjYzcGRlcGF5LmMgXAorCWdzdHJ0cGgyNjNwcGF5LmMgXAorCWdzdHJ0cGgyNjNkZXBheS5jIFwKKwlnc3RydHBoMjYzcGF5LmMgXAorCWdzdHJ0cGgyNjRkZXBheS5jIFwKKwlnc3RydHBoMjY0cGF5LmMgXAorCWdzdHJ0cGgyNjVkZXBheS5jIFwKKwlnc3RydHBoMjY1cGF5LmMgXAorCWdzdHJ0cGoya2RlcGF5LmMgXAorCWdzdHJ0cGoya3BheS5jIFwKKwlnc3RydHBqcGVnZGVwYXkuYyBcCisJZ3N0cnRwanBlZ3BheS5jIFwKKwlnc3RydHBrbHZkZXBheS5jIFwKKwlnc3RydHBrbHZwYXkuYyBcCisJZ3N0cnRwTDhkZXBheS5jIFwKKwlnc3RydHBMOHBheS5jIFwKKwlnc3RydHBMMTZkZXBheS5jIFwKKwlnc3RydHBMMTZwYXkuYyBcCisJZ3N0cnRwTDI0ZGVwYXkuYyBcCisJZ3N0cnRwTDI0cGF5LmMgXAorCWdzdGFzdGVyaXNraDI2My5jIFwKKwlnc3RydHBtcDFzZGVwYXkuYyBcCisJZ3N0cnRwbXAydGRlcGF5LmMgXAorCWdzdHJ0cG1wMnRwYXkuYyBcCisJZ3N0cnRwbXA0dmRlcGF5LmMgXAorCWdzdHJ0cG1wNHZwYXkuYyBcCisJZ3N0cnRwbXA0Z2RlcGF5LmMgXAorCWdzdHJ0cG1wNGdwYXkuYyBcCisJZ3N0cnRwbXA0YWRlcGF5LmMgXAorCWdzdHJ0cG1wNGFwYXkuYyBcCisJZ3N0cnRwb3B1c2RlcGF5LmMgXAorCWdzdHJ0cG9wdXNwYXkuYyBcCisJZ3N0cnRwcWNlbHBkZXBheS5jIFwKKwlnc3RydHBxZG1kZXBheS5jIFwKKwlnc3RydHBzYmNkZXBheS5jIFwKKwlnc3RydHBzYmNwYXkuYyBcCisJZ3N0cnRwc2lyZW5wYXkuYyBcCisJZ3N0cnRwc2lyZW5kZXBheS5jIFwKKwlnc3RydHBzcGVleGRlcGF5LmMgXAorCWdzdHJ0cHNwZWV4cGF5LmMgXAorCWdzdHJ0cHN2M3ZkZXBheS5jIFwKKwlnc3RydHB0aGVvcmFkZXBheS5jIFwKKwlnc3RydHB0aGVvcmFwYXkuYyBcCisJZ3N0cnRwdm9yYmlzZGVwYXkuYyBcCisJZ3N0cnRwdm9yYmlzcGF5LmMgIFwKKwlnc3RydHB2cDhkZXBheS5jIFwKKwlnc3RydHB2cDhwYXkuYyBcCisJZ3N0cnRwdnA5ZGVwYXkuYyBcCisJZ3N0cnRwdnA5cGF5LmMgXAorCWdzdHJ0cHZyYXdkZXBheS5jICBcCisJZ3N0cnRwdnJhd3BheS5jIFwKKwlnc3RydHBzdHJlYW1wYXkuYyBcCisJZ3N0cnRwc3RyZWFtZGVwYXkuYyBcCisJZ3N0cnRwdXRpbHMuYworCitsaWJnc3RydHBfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9DRkxBR1MpIC1EdnA4X25vcm09Z3N0X3J0cHZwOF92cDhfbm9ybSBcCisJLUR2cDhkeF9zdGFydF9kZWNvZGU9Z3N0X3J0cHZwOF92cDhkeF9zdGFydF9kZWNvZGUgXAorCS1EdnA4ZHhfYm9vbF9kZWNvZGVyX2ZpbGw9Z3N0X3J0cHZwOF92cDhkeF9ib29sX2RlY29kZXJfZmlsbAorCitsaWJnc3RydHBfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIFwKKwktbGdzdGF1ZGlvLUBHU1RfQVBJX1ZFUlNJT05AIFwKKwktbGdzdHZpZGVvLUBHU1RfQVBJX1ZFUlNJT05AIFwKKwktbGdzdHRhZy1AR1NUX0FQSV9WRVJTSU9OQCBcCisJLWxnc3RydHAtQEdTVF9BUElfVkVSU0lPTkAgXAorCS1sZ3N0cGJ1dGlscy1AR1NUX0FQSV9WRVJTSU9OQCBcCisJJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSBcCisJJChMSUJNKQorbGliZ3N0cnRwX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykgCisKK25vaW5zdF9IRUFERVJTID0JCQlcCisJZGJvb2xodWZmLmggXAorCWZudjFoYXNoLmggXAorCWdzdHJ0cGNoYW5uZWxzLmggXAorCWdzdHJ0cEw4ZGVwYXkuaCBcCisJZ3N0cnRwTDhwYXkuaCBcCisJZ3N0cnRwTDE2ZGVwYXkuaCBcCisJZ3N0cnRwTDE2cGF5LmggXAorCWdzdHJ0cEwyNGRlcGF5LmggXAorCWdzdHJ0cEwyNHBheS5oIFwKKwlnc3RydHBhYzNkZXBheS5oIFwKKwlnc3RydHBhYzNwYXkuaCBcCisJZ3N0cnRwYnZkZXBheS5oIFwKKwlnc3RydHBidnBheS5oIFwKKwlnc3RydHBjZWx0cGF5LmgJXAorCWdzdHJ0cGNlbHRkZXBheS5oIFwKKwlnc3RydHBkdmRlcGF5LmggXAorCWdzdHJ0cGR2cGF5LmggXAorCWdzdHJ0cGFtcmRlcGF5LmggXAorCWdzdHJ0cGFtcnBheS5oIAlcCisJZ3N0cnRwZ3N0ZGVwYXkuaCBcCisJZ3N0cnRwZ3N0cGF5LmggCVwKKwlnc3RydHBpbGJjZGVwYXkuaCBcCisJZ3N0cnRwaWxiY3BheS5oIFwKKwlnc3RydHBwY21hZGVwYXkuaCBcCisJZ3N0cnRwcGNtdWRlcGF5LmggXAorCWdzdHJ0cHBjbXVwYXkuaCBcCisJZ3N0cnRwcGNtYXBheS5oIFwKKwlnc3RydHBnNzIyZGVwYXkuaCBcCisJZ3N0cnRwZzcyMnBheS5oIFwKKwlnc3RydHBnNzIzZGVwYXkuaFwKKwlnc3RydHBnNzIzcGF5LmggXAorCWdzdHJ0cGc3MjZkZXBheS5oIFwKKwlnc3RydHBnNzI2cGF5LmggXAorCWdzdHJ0cGc3MjlkZXBheS5oIFwKKwlnc3RydHBnNzI5cGF5LmggXAorCWdzdHJ0cGdzbWRlcGF5LmggXAorCWdzdHJ0cGdzbXBheS5oIAlcCisJZ3N0cnRwbXBhZGVwYXkuaCBcCisJZ3N0cnRwbXBhcm9idXN0ZGVwYXkuaCBcCisJZ3N0cnRwbXBhcGF5LmggXAorCWdzdHJ0cG1wdmRlcGF5LmggXAorCWdzdHJ0cG1wdnBheS5oIFwKKwlnc3RydHBoMjYxcGF5LmggXAorCWdzdHJ0cGgyNjFkZXBheS5oIFwKKwlnc3RydHBoMjYzcGRlcGF5LmggXAorCWdzdHJ0cGgyNjNwcGF5LmggXAorCWdzdHJ0cGgyNjNkZXBheS5oIFwKKwlnc3RydHBoMjYzcGF5LmggXAorCWdzdHJ0cGgyNjRkZXBheS5oIFwKKwlnc3RydHBoMjY0cGF5LmggXAorCWdzdHJ0cGgyNjVkZXBheS5oIFwKKwlnc3RydHBoMjY1cGF5LmggXAorCWdzdHJ0cGgyNjV0eXBlcy5oIFwKKwlnc3RydHBqMmtkZXBheS5oIFwKKwlnc3RydHBqMmtwYXkuaCBcCisJZ3N0cnRwajJrY29tbW9uLmggXAorCWdzdHJ0cGpwZWdkZXBheS5oIFwKKwlnc3RydHBqcGVncGF5LmggXAorCWdzdHJ0cGtsdmRlcGF5LmggXAorCWdzdHJ0cGtsdnBheS5oIFwKKwlnc3RydHBtcDFzZGVwYXkuaCBcCisJZ3N0cnRwbXAydGRlcGF5LmggXAorCWdzdHJ0cG1wMnRwYXkuaCBcCisJZ3N0cnRwbXA0dmRlcGF5LmggXAorCWdzdHJ0cG1wNHZwYXkuaAlcCisJZ3N0cnRwbXA0Z2RlcGF5LmggXAorCWdzdHJ0cG1wNGdwYXkuaAlcCisJZ3N0cnRwbXA0YWRlcGF5LmggXAorCWdzdHJ0cG1wNGFwYXkuaCBcCisJZ3N0cnRwb3B1c2RlcGF5LmggXAorCWdzdHJ0cG9wdXNwYXkuaCBcCisJZ3N0YXN0ZXJpc2toMjYzLmggXAorCWdzdHJ0cHFjZWxwZGVwYXkuaCBcCisJZ3N0cnRwcWRtZGVwYXkuaCBcCisJZ3N0cnRwc2JjZGVwYXkuaCBcCisJZ3N0cnRwc2JjcGF5LmggXAorCWdzdHJ0cHNpcmVucGF5LmggXAorCWdzdHJ0cHNpcmVuZGVwYXkuaCBcCisJZ3N0cnRwc3BlZXhkZXBheS5oIFwKKwlnc3RydHBzcGVleHBheS5oIFwKKwlnc3RydHBzdjN2ZGVwYXkuaCBcCisJZ3N0cnRwdGhlb3JhZGVwYXkuaCBcCisJZ3N0cnRwdGhlb3JhcGF5LmggXAorCWdzdHJ0cHZvcmJpc2RlcGF5LmggXAorCWdzdHJ0cHZvcmJpc3BheS5oIFwKKwlnc3RydHB2cDhkZXBheS5oIFwKKwlnc3RydHB2cDhwYXkuaCBcCisJZ3N0cnRwdnA5ZGVwYXkuaCBcCisJZ3N0cnRwdnA5cGF5LmggXAorCWdzdHJ0cHZyYXdkZXBheS5oIFwKKwlnc3RydHB2cmF3cGF5LmggXAorCWdzdHJ0cHN0cmVhbXBheS5oIFwKKwlnc3RydHBzdHJlYW1kZXBheS5oIFwKKwlnc3RydHB1dGlscy5oCisKK0VYVFJBX0RJU1QgPSBkYm9vbGh1ZmYuTElDRU5TRQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9SRUFETUUgYi9nc3QvcnRwL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTQzMTFlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9SRUFETUUKQEAgLTAsMCArMSwzOTggQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHNvbWUgUlRQIHBheWxvYWRlcnMvZGVwYXlsb2FkZXJzIGZvciBkaWZmZXJlbnQgcGF5bG9hZAordHlwZXMuIFVzZSBvbmUgcGF5bG9hZGVyL2RlcGF5bG9kZXIgcGFpciBwZXIgcGF5bG9hZC4gSWYgc2V2ZXJhbCBwYXlsb2FkcyBjYW4gYmUKK3BheWxvYWRlZC9kZXBheWxvYWRlZCBieSB0aGUgc2FtZSBlbGVtZW50LCBtYWtlIGRpZmZlcmVudCBjb3BpZXMgb2YgaXQsIG9uZSBmb3IKK2VhY2ggcGF5bG9hZC4KKworVGhlIGFwcGxpY2F0aW9uL3gtcnRwIG1pbWUgdHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGb3IgdmFsaWQgUlRQIHBhY2tldHMgZW5jYXBzdWxhdGVkIGluIEdzdEJ1ZmZlcnMsIHdlIHVzZSB0aGUgY2FwcyB3aXRoCittaW1lIHR5cGUgYXBwbGljYXRpb24veC1ydHAuCisKK1RoZSBmb2xsb3dpbmcgZmllbGRzIGNhbiBvciBtdXN0ICgqKSBiZSBzcGVjaWZpZWQgaW4gdGhlIHN0cnVjdHVyZToKKworICogbWVkaWE6IChTdHJpbmcpIFsgImF1ZGlvIiwgInZpZGVvIiwgImFwcGxpY2F0aW9uIiwgImRhdGEiLCAiY29udHJvbCIgXQorICAgICBEZWZpbmVkIGluIFJGQyAyMzI3IGluIHRoZSBTRFAgbWVkaWEgYW5ub3VuY2VtZW50IGZpZWxkLgorICAgICBDb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KKworICogcGF5bG9hZDogKGludCkgWzAsIDEyN10KKyAgICAgRm9yIGF1ZGlvIGFuZCB2aWRlbywgdGhlc2Ugd2lsbCBub3JtYWxseSBiZSBhIG1lZGlhIHBheWxvYWQgdHlwZSBhcyAKKyAgICAgZGVmaW5lZCBpbiB0aGUgUlRQIEF1ZGlvL1ZpZGVvIFByb2ZpbGUuIEZvciBkeW5hbWljYWx5IGFsbG9jYXRlZCAKKyAgICAgcGF5bG9hZCB0eXBlcywgdGhpcyB2YWx1ZSB3aWxsIGJlID49IDk2IGFuZCB0aGUgZW5jb2RpbmctbmFtZSBtdXN0IGJlCisgICAgIHNldC4KKworICogY2xvY2stcmF0ZTogKGludCkgWzAgLSBNQVhJTlRdCisgICAgVGhlIFJUUCBjbG9jayByYXRlLiAKKworICAgZW5jb2RpbmctbmFtZTogKFN0cmluZykgQU5ZCisgICAgIHR5cGljYWxseSBzZWNvbmQgcGFydCBvZiB0aGUgbWltZSB0eXBlLiBleC4gTVA0Vi1FUy4gb25seSByZXF1aXJlZCBpZgorICAgICBwYXlsb2FkIHR5cGUgPj0gOTYuIENvbnZlcnRlZCB0byB1cHBlciBjYXNlLgorCisgICBlbmNvZGluZy1wYXJhbXM6IChTdHJpbmcpIEFOWQorICAgICBleHRyYSBlbmNvZGluZyBwYXJhbWV0ZXJzIChhcyBpbiB0aGUgU0RQIGE9cnRwbWFwOiBmaWVsZCkuIG9ubHkgcmVxdWlyZWQKKyAgICAgaWYgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgb2YgdGhlIGVuY29kaW5nLW5hbWUuCisgICAgIENvbnZlcnRlZCB0byBsb3dlci1jYXNlLgorICAgICAKKyAgIHNzcmM6ICh1aW50KSBbMCAtIE1BWElOVF0KKyAgICBUaGUgc3NyYyB2YWx1ZSBjdXJyZW50bHkgaW4gdXNlLiAoZGVmYXVsdCA9IHRoZSBTU1JDIG9mIHRoZSBmaXJzdCBSVFAKKyAgICBwYWNrZXQpCisKKyAgIHRpbWVzdGFtcC1vZmZzZXQ6ICh1aW50KSBbMCAtIE1BWElOVF0KKyAgICBUaGUgUlRQIHRpbWUgcmVwcmVzZW50aW5nIHRpbWUgbnB0LXN0YXJ0LiAoZGVmYXVsdCA9IHJ0cHRpbWUgb2YgZmlyc3QgUlRQCisgICAgcGFja2V0KS4KKworICAgc2VxbnVtLW9mZnNldDogKHVpbnQpIFswIC0gTUFYSU5UXQorICAgIFRoZSBSVFAgc2VxdWVuY2UgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgZmlyc3QgcnRwIHBhY2tldC4gV2hlbiB0aGlzCisgICAgcGFyYW1ldGVyIGlzIGdpdmVuLCBhbGwgc2VxdWVuY2UgbnVtYmVycyBiZWxvdyB0aGlzIHNlcW51bSBzaG91bGQgYmUKKyAgICBpZ25vcmVkLiAoZGVmYXVsdCA9IHNlcW51bSBvZiBmaXJzdCBSVFAgcGFja2V0KS4KKworICAgbnB0LXN0YXJ0OiAodWludDY0KSBbMCAtIE1BWElOVF0KKyAgICBUaGUgTm9ybWFsIFBsYXkgVGltZSBmb3IgY2xvY2stYmFzZS4gVGhpcyBpcyB0aGUgcG9zaXRpb24gaW4gdGhlIHN0cmVhbSBhbmQKKyAgICBpcyBiZXR3ZWVuIDAgYW5kIHRoZSBkdXJhdGlvbiBvZiB0aGUgc3RyZWFtLiBUaGlzIHZhbHVlIGlzIGV4cHJlc3NlZCBpbgorICAgIG5hbm9zZWNvbmRzIEdzdENsb2NrVGltZS4gKGRlZmF1bHQgPSAwKQorCisgICBucHQtc3RvcDogKHVpbnQ2NCkgWzAgLSBNQVhJTlRdIAorICAgIFRoZSBsYXN0IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0uIFRoaXMgdmFsdWUgaXMgZXhwcmVzc2VkIGluIG5hbm9zZWNvbmRzCisgICAgR3N0Q2xvY2tUaW1lLiAoZGVmYXVsdCA9IC0xLCBzdG9wIHVua25vd24pCisKKyAgIHBsYXktc3BlZWQ6IChnZG91YmxlKSBbLU1JTiAtIE1BWF0KKyAgICBUaGUgaW50ZW5kZWQgcGxheWJhY2sgc3BlZWQgb2YgdGhlIHN0cmVhbS4gVGhlIGNsaWVudCBpcyBkZWxpdmVyZWQgZGF0YSBhdAorICAgIHRoZSBhZGp1c3RlZCBzcGVlZC4gVGhlIGNsaWVudCBzaG91bGQgYWRqdXN0IGl0cyBwbGF5YmFjayBzcGVlZCB3aXRoIHRoaXMKKyAgICB2YWx1ZSBhbmQgdGh1cyBjb3JyZXNwb25kcyB0byB0aGUgR1N0cmVhbWVyIHJhdGUgZmllbGQgaW4gdGhlIE5FV1NFR01FTlQKKyAgICBldmVudC4gKGRlZmF1bHQgPSAxLjApCisgICAgCisgICBwbGF5LXNjYWxlOiAoZ2RvdWJsZSkgWy1NSU4gLSBNQVhdCisgICAgVGhlIHJhdGUgYWxyZWFkeSBhcHBsaWVkIHRvIHRoZSBzdHJlYW0uIFRoZSBjbGllbnQgaXMgZGVsaXZlcmVkIGEgc3RyZWFtCisgICAgdGhhdCBpcyBzY2FsZWQgYnkgdGhpcyBhbW91bnQuIFRoaXMgdmFsdWUgaXMgdXNlZCB0byBhZGp1c3QgcG9zaXRpb24KKyAgICByZXBvcnRpbmcgYW5kIGNvcnJlc3BvbmRzIHRvIHRoZSBHU3RyZWFtIGFwcGxpZWQtcmF0ZSBmaWVsZCBpbiB0aGUKKyAgICBORVdTRUdNRU5UIGV2ZW50LiAoZGVmYXVsdCA9IDEuMCkKKworICAgbWF4cHRpbWU6ICh1aW50KSBbMCwgTUFYXQorICAgIFRoZSBtYXhwdGltZSBhcyBkZWZpbmVkIGluIFJGQyA0NTY2LCB0aGlzIGRlZmluZXMgdGhlIG1heGltdW0gc2l6ZSBvZiBhCisgICAgcGFja2V0LiBJdCBvdmVycmlkZXMgdGhlIG1heC1wdGltZSBwcm9wZXJ0eSBvZiBwYXlsb2FkZXJzLgorCisgICBPcHRpb25hbCBwYXJhbWV0ZXJzIGFzIGtleS92YWx1ZSBwYWlycywgbWVkaWEgdHlwZSBzcGVjaWZpYy4gVGhlIHZhbHVlIHR5cGUKKyAgIHNob3VsZCBiZSBvZiB0eXBlIEdfVFlQRV9TVFJJTkcuIFRoZSBrZXkgaXMgY29udmVydGVkIHRvIGxvd2VyLWNhc2UuIFRoZQorICAgdmFsdWUgaXMgbGVmdCBpbiBpdHMgb3JpZ2luYWwgY2FzZS4KKyAgIEEgcGFyYW1ldGVyIHdpdGggbm8gdmFsdWUgaXMgY29udmVydGVkIHRvIDxwYXJhbT49MS4KKworIEV4YW1wbGU6CisKKyAgImFwcGxpY2F0aW9uL3gtcnRwIiwKKyAgICAgICJtZWRpYSIsIEdfVFlQRV9TVFJJTkcsICJhdWRpbyIsCQktLgorICAgICAgInBheWxvYWQiLCBHX1RZUEVfSU5ULCA5NiwgICAgICAgICAgICAgICAgIHwgLSByZXF1aXJlZAorICAgICAgImNsb2NrLXJhdGUiLCBHX1RZUEVfSU5ULCA4MDAwLCAgICAgICAgICAgLScKKyAgICAgICJlbmNvZGluZy1uYW1lIiwgR19UWVBFX1NUUklORywgIkFNUiIsICAgIC0uIC0gcmVxdWlyZWQgc2luY2UgcGF5bG9hZCA+PSA5NgorICAgICAgImVuY29kaW5nLXBhcmFtcyIsIEdfVFlQRV9TVFJJTkcsICIxIiwJLScgLSBvcHRpb25hbCBwYXJhbSBmb3IgQU1SCisgICAgICAib2N0ZXQtYWxpZ24iLCBHX1RZUEVfU1RSSU5HLCAiMSIsCS0uCisgICAgICAiY3JjIiwgR19UWVBFX1NUUklORywgIjAiLCAgICAgICAgICAgICAgICAgfAorICAgICAgInJvYnVzdC1zb3J0aW5nIiwgR19UWVBFX1NUUklORywgIjAiLCAgICAgIHwgIEFNUiBzcGVjaWZpYyBwYXJhbXMuCisgICAgICAiaW50ZXJsZWF2aW5nIiwgR19UWVBFX1NUUklORywgIjAiLCAgICAgICAtJworICAKKyBNYXBwaW5nIG9mIGNhcHMgdG8gYW5kIGZyb20gU0RQIGZpZWxkczoKKworICAgbT08bWVkaWE+IDx1ZHAgcG9ydD4gUlRQL0FWUCA8cGF5bG9hZD4gICAgICAgLV0gbWVkaWEgYW5kIHBheWxvYWQgZnJvbSBjYXBzCisgICBhPXJ0cG1hcDo8cGF5bG9hZD4gPGVuY29kaW5nLW5hbWU+LzxjbG9jay1yYXRlPlsvPGVuY29kaW5nLXBhcmFtcz5dCisgICAgICAgICAgICAgIC0+IHdoZW4gPHBheWxvYWQ+ID49IDk2CisgICBhPWZtdHA6PHBheWxvYWQ+IDxwYXJhbT49PHZhbHVlPjsuLi4KKworIEZvciBhYm92ZSBjYXBzOgorCisgICBtPWF1ZGlvIDx1ZHAgcG9ydD4gUlRQL0FWUCA5NgorICAgYT1ydHBtYXA6OTYgQU1SLzgwMDAvMQorICAgYT1mbXRwOjk2IG9jdGV0LWFsaWduPTE7Y3JjPTA7cm9idXN0LXNvcnRpbmc9MDtpbnRlcmxlYXZpbmc9MAorCisgQXR0cmlidXRlcyBhcmUgY29udmVydGVkIGFzIGZvbGxvd3M6CisKKyAgSUFOQSByZWdpc3RlcmVkIGF0dHJpYnV0ZSBuYW1lcyBhcmUgcHJlcGVuZGVkIHdpdGggJ2EtJyBiZWZvcmUgcHV0dGluZyB0aGVtIGluCisgIHRoZSBjYXBzLiBVbnJlZ2lzdGVyZWQga2V5cyAoc3RhcnRpbmcgd2l0aCAneC0nKSBhcmUgY29waWVkIGRpcmVjdGx5IGludG8gdGhlCisgIGNhcHMuCisKKyBpbiBSVFNQLCB0aGUgU1NSQyBpcyBhbHNvIHNlbnQuCisKKyBUaGUgb3B0aW9uYWwgcGFyYW1ldGVycyBpbiB0aGUgU0RQIGZpZWxkcyBhcmUgY2FzZSBpbnNlbnNpdGl2ZS4gSW4gdGhlIGNhcHMgd2UKKyBhbHdheXMgdXNlIHRoZSBsb3dlcmNhc2UgbmFtZXMgc28gdGhhdCB0aGUgU0RQIC0+IGNhcHMgbWFwcGluZyByZW1haW5zCisgcG9zc2libGUuCisKKyBNYXBwaW5nIG9mIGNhcHMgdG8gTkVXU0VHTUVOVDoKKworICByYXRlOiAgICAgICAgIDxwbGF5LXNwZWVkPgorICBhcHBsaWVkLXJhdGU6IDxwbGF5LXNjYWxlPgorICBmb3JtYXQ6ICAgICAgIEdTVF9GT1JNQVRfVElNRQorICBzdGFydDogICAgICAgIDxjbG9jay1iYXNlPiAqIEdTVF9TRUNPTkQgLyA8Y2xvY2stcmF0ZT4KKyAgc3RvcDogICAgICAgICBpZiA8bnRwLXN0b3A+ICE9IC0xCisgICAgICAgICAgICAgICAgICA8bnB0LXN0b3A+IC0gPG5wdC1zdGFydD4gKyBzdGFydAorCQllbHNlIAorCQkgIC0xCisgIHRpbWU6ICAgICAgICAgPG5wdC1zdGFydD4KKworCitUaW1lc3RhbXBpbmcKKy0tLS0tLS0tLS0tLQorCitSVFAgaW4gR1N0cmVhbWVyIHVzZXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgUlRQIHRpbWVzdGFtcHMgYW5kIEdTdHJlYW1lciBidWZmZXIKK3RpbWVzdGFtcHMgdG8gZW5zdXJlIHByb3BlciBzeW5jaHJvbmlzYXRpb24gYXQgdGhlIHNlbmRlciBhbmQgdGhlIHJlY2VpdmVyIGVuZC4KKworSW4gUlRQIGFwcGxpY2F0aW9ucywgdGhlIHN5bmNocm9uaXNhdGlvbiBpcyBtb3N0IGNvbXBsZXggYXQgdGhlIHJlY2VpdmVyIHNpZGUuCisKK0F0IHRoZSBzZW5kZXIgc2lkZSwgdGhlIFJUUCB0aW1lc3RhbXBzIGFyZSBnZW5lcmF0ZWQgaW4gdGhlIHBheWxvYWRlcnMgYmFzZWQgb24KK0dTdHJlYW1lciB0aW1lc3RhbXBzLiBBdCB0aGUgcmVjZWl2ZXIsIEdTdHJlYW1lciB0aW1lc3RhbXBzIGFyZSByZWNvbnN0cnVjdGVkCitmcm9tIHRoZSBSVFAgdGltZXN0YW1wcyBhbmQgdGhlIEdTdHJlYW1lciB0aW1lc3RhbXBzIGluIHRoZSBqaXR0ZXJidWZmZXIuIFRoaXMKK3Byb2Nlc3MgaXMgZXhwbGFpbmVkIGluIG1vcmUgZGV0YWlsIGJlbG93LgorCis9IHN5bmNocm9uaXNhdGlvbiBhdCB0aGUgc2VuZGVyCisKK0luZGl2aWR1YWwgc3RyZWFtcyBhdCB0aGUgc2VuZGVyIGFyZSBzeW5jaHJvbmlzZWQgdXNpbmcgR1N0cmVhbWVyIHRpbWVzdGFtcHMuCitUaGUgcGF5bG9hZGVyIGF0IHRoZSBzZW5kZXIgd2lsbCBjb252ZXJ0IHRoZSBHU3RyZWFtZXIgdGltZXN0YW1wIGludG8gYW4gUlRQCit0aW1lc3RhbXAgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtdWxhOgorCisgICBSVFAgPSAoKFJUIC0gUlQtYmFzZSkgKiBjbG9jay1yYXRlIC8gR1NUX1NFQ09ORCkgKyBSVFAtb2Zmc2V0CisKKyAgUlRQOiAgICAgICAgdGhlIFJUUCB0aW1lc3RhbXAgZm9yIHRoZSBzdHJlYW0uIFRoaXMgdmFsdWUgaXMgdHJ1bmNhdGVkIHRvCisgICAgICAgICAgICAgIDMyIGJpdHMuCisgIFJUOiAgICAgICAgIHRoZSBHU3RyZWFtZXIgcnVubmluZyB0aW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRpbWVzdGFtcCBvZiB0aGUKKyAgICAgICAgICAgICAgcGFja2V0IHRvIHBheWxvYWQKKyAgUlQtYmFzZTogICAgdGhlIEdTdHJlYW1lciBydW5uaW5nIHRpbWUgb2YgdGhlIGZpcnN0IHBhY2tldCBlbmNvZGVkCisgIGNsb2NrLXJhdGU6IHRoZSBjbG9jay1yYXRlIG9mIHRoZSBzdHJlYW0KKyAgUlRQLW9mZnNldDogYSByYW5kb20gUlRQIG9mZnNldAorCitUaGUgUlRQIHRpbWVzdGFtcCBjb3JyZXNwb25kaW5nIHRvIFJULWJhc2UgaXMgdGhlIGNsb2NrLWJhc2UgKHNlZSBjYXBzIGFib3ZlKS4gCisKK0luIGFkZGl0aW9uIHRvIHNldHRpbmcgYW4gUlRQIHRpbWVzdGFtcCBpbiB0aGUgUlRQIHBhY2tldCwgdGhlIHBheWxvYWRlciBpcyBhbHNvCityZXNwb25zaWJsZSBmb3IgcHV0dGluZyB0aGUgR1N0cmVhbWVyIHRpbWVzdGFtcCBvbiB0aGUgcmVzdWx0aW5nIG91dHB1dCBidWZmZXIuCitUaGlzIHRpbWVzdGFtcCBpcyB1c2VkIGZvciBmdXJ0aGVyIHN5bmNocm9uaXNhdGlvbiBhdCB0aGUgc2VuZGVyIHBpcGVsaW5lLCBzdWNoCithcyBmb3Igc2VuZGluZyBvdXQgdGhlIHBhY2tldCBvbiB0aGUgbmV0d29yay4KKworTm90aWNlIHRoYXQgdGhlIGFic29sdXRlIHRpbWluZyBpbmZvcm1hdGlvbiBpcyBsb3N0OyBpZiB0aGUgc2VuZGVyIGlzIHNlbmRpbmcKK211bHRpcGxlIHN0cmVhbXMsIHRoZSBSVFAgdGltZXN0YW1wcyBpbiB0aGUgcGFja2V0cyBkbyBub3QgY29udGFpbiBlbm91Z2gKK2luZm9ybWF0aW9uIHRvIHN5bmNocm9uaXplIHRoZW0gaW4gdGhlIHJlY2VpdmVyLiBUaGUgcmVjZWl2ZXIgY2FuIGhvd2V2ZXIgdXNlCit0aGUgUlRQIHRpbWVzdGFtcHMgdG8gcmVjb25zdHJ1Y3QgdGhlIHRpbWluZyBvZiB0aGUgc3RyZWFtIGFzIGl0IHdhcyBjcmVhdGVkIGJ5Cit0aGUgc2VuZGVyIGFjY29yZGluZyB0byB0aGUgc2VuZGVyJ3MgY2xvY2suCisKK0JlY2F1c2UgdGhlIHBheWxvYWRlZCBwYWNrZXQgY29udGFpbnMgYm90aCBhbiBSVFAgdGltZXN0YW1wIGFuZCBhIEdTdHJlYW1lcgordGltZXN0YW1wLCBpdCBpcyBwb3NzaWJsZSBmb3IgYW4gUlRQIHNlc3Npb24gbWFuYWdlciB0byBkZXJpdmUgdGhlIHJlbGF0aW9uCitiZXR3ZWVuIHRoZSBSVFAgYW5kIEdTVCB0aW1lc3RhbXBzLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgYnkgYSBzZXNzaW9uCittYW5hZ2VyIHRvIGNyZWF0ZSBTUiByZXBvcnRzLiBUaGUgTlRQIHRpbWUgaW4gdGhlIHJlcG9ydCB3aWxsIGNvbnRhaW4gdGhlCitydW5uaW5nIHRpbWUgY29udmVydGVkIHRvIE5UUCB0aW1lIGFuZCB0aGUgY29ycmVzcG9uZGluZyBSVFAgdGltZXN0YW1wLgorCitOb3RlIHRoYXQgYXQgdGhlIHNlbmRlciBzaWRlLCB0aGUgUlRQIGFuZCBHU3RyZWFtZXIgdGltZXN0YW1wIGJvdGggaW5jcmVtZW50IGF0Cit0aGUgc2FtZSByYXRlLCB0aGUgc2VuZGVyIHJhdGUuIFRoaXMgcmF0ZSBkZXBlbmRzIG9uIHRoZSBnbG9iYWwgcGlwZWxpbmUgY2xvY2sKK29mIHRoZSBzZW5kZXIuIAorCitTb21lIHBpcGVsaW5lcyB0byBpbGx1c3RyYXRlIHRoZSBwcm9jZXNzOgorCisgICAgZ3N0LWxhdW5jaC0xLjAgdjRsMnNyYyAhIHZpZGVvY29udmVydCAhIGF2ZW5jX2gyNjNwICEgcnRwaDI2M3BwYXkgISB1ZHBzaW5rCisKKyAgdjRsMnNyYyBwdXRzIGEgR1N0cmVhbWVyIHRpbWVzdGFtcCBvbiB0aGUgdmlkZW8gZnJhbWVzIGJhc2Ugb24gdGhlIGN1cnJlbnQKKyAgcnVubmluZ190aW1lLiBUaGUgZW5jb2RlciBlbmNvZGVzIGFuZCBwYXNzZWQgdGhlIHRpbWVzdGFtcCBvbi4gVGhlIHBheWxvYWRlcgorICBnZW5lcmF0ZXMgYW4gUlRQIHRpbWVzdGFtcCB1c2luZyB0aGUgYWJvdmUgZm9ybXVsYSBhbmQgcHV0cyBpdCBpbiB0aGUgUlRQCisgIHBhY2tldC4gSXQgYWxzbyBjb3BpZXMgdGhlIGluY29tbWluZyBHU3RyZWFtZXIgdGltZXN0YW1wIG9uIHRoZSBvdXRwdXQgUlRQCisgIHBhY2tldC4gdWRwc2luayBzeW5jaHJvbml6ZXMgb24gdGhlIGdzdHJlYW1lciB0aW1lc3RhbXAgYmVmb3JlIHB1c2hpbmcgb3V0IHRoZQorICBwYWNrZXQuIAorCisKKz0gc3luY2hyb25pc2F0aW9uIGF0IHRoZSByZWNlaXZlcgorCitUaGUgcmVjZWl2ZXIgaXMgcmVzcG9uc2libGUgZm9yIHRpbWVzdGFtcGluZyB0aGUgcmVjZWl2ZWQgUlRQIHBhY2tldCB3aXRoIHRoZQorcnVubmluZ190aW1lIG9mIHRoZSBjbG9jayBhdCB0aGUgdGltZSB0aGUgcGFja2V0IHdhcyByZWNlaXZlZC4gVGhpcyBHU3RyZWFtZXIKK3RpbWVzdGFtcCByZWZsZWN0cyB0aGUgcmVjZWl2ZXIgcmF0ZSBhbmQgZGVwZW5kcyBvbiB0aGUgZ2xvYmFsIHBpcGVsaW5lIGNsb2NrIG9mCit0aGUgcmVjZWl2ZXIuIFRoZSBnc3RyZWFtZXIgdGltZXN0YW1wIG9mIHRoZSByZWNlaXZlZCBSVFAgcGFja2V0IGNvbnRhaW5zIGEKK2NlcnRhaW4gYW1vdW50IG9mIGppdHRlciBpbnRyb2R1Y2VkIGJ5IHRoZSBuZXR3b3JrLgorCitUaGUgbW9zdCBzaW1wbGUgb3B0aW9uIGZvciB0aGUgcmVjZWl2ZXIgaXMgdG8gZGVwYXlsb2FkIHRoZSBSVFAgcGFja2V0IGFuZCBwbGF5CitpdCBiYWNrIGFzIHNvb24gYXMgcG9zc2libGUsIHRoaXMgaXMgd2l0aCB0aGUgdGltZXN0YW1wIHdoZW4gaXQgd2FzIHJlY2VpdmVkCitmcm9tIHRoZSBuZXR3b3JrLiBGb3IgdGhlIGFib3ZlIHNlbmRlciBwaXBlbGluZSB0aGlzIHdvdWxkIGJlIGRvbmUgd2l0aCB0aGUKK2ZvbGxvd2luZyBwaXBlbGluZToKKworICAgIGdzdC1sYXVuY2gtMS4wIHVkcHNyYyBjYXBzPSJhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywKKyAgICAgIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjMtMTk5OCIgISBydHBoMjYzcGRlcGF5ICEKKyAgICAgIGF2ZGVjX2gyNjMgISBhdXRvdmlkZW9zaW5rCisKK0l0IGlzIGltcG9ydGFudCB0aGF0IHRoZSBkZXBheWxvYWRlciBjb3BpZXMgdGhlIGluY29tbWluZyBHU3RyZWFtZXIgdGltZXN0YW1wCitkaXJlY3RseSB0byB0aGUgZGVwYXlsb2FkZWQgb3V0cHV0IGJ1ZmZlci4gSXQgc2hvdWxkIG5ldmVyIGF0dGVtcHQgdG8gcGVyZm9ybQorYW55IGxvZ2ljIHdpdGggdGhlIFJUUCB0aW1lc3RhbXAsIHRoaXMgdGFzayBpcyBmb3IgdGhlIGppdHRlcmJ1ZmZlciBhcyB3ZSB3aWxsCitzZWUgbmV4dC4KKworVGhlIGFib3ZlIHBpcGVsaW5lIGRvZXMgbm90IGF0dGVtcHQgdG8gZGVhbCB3aXRoIHJlb3JkZXJlZCBwYWNrZXRzIG9yIG5ldHdvcmsKK2ppdHRlciwgd2hpY2ggY291bGQgcmVzdWx0IGluIGplcmt5IHBsYXliYWNrIGluIHRoZSBjYXNlIG9mIGhpZ2ggaml0dGVyIG9yCitjb3JydXB0ZWQgdmlkZW8gaW4gdGhlIGNhc2Ugb2YgcGFja2V0IGxvc3Mgb3IgcmVvcmRlcmluZy4gVGhpcyBmdW5jdGlvbmFsaXR5IGlzCitwZXJmb3JtZWQgYnkgdGhlIGdzdHJ0cGppdHRlcmJ1ZmZlciBpbiBHU3RyZWFtZXIuCisKK1RoZSB0YXNrIG9mIHRoZSBnc3RydHBqaXR0ZXJidWZmZXIgZWxlbWVudCBpcyB0bzoKKworIC0gZGVhbCB3aXRoIHJlb3JkZXJlZCBwYWNrZXRzIGJhc2VkIG9uIHRoZSBzZXFudW0KKyAtIGNhbGN1bGF0ZSB0aGUgZHJpZnQgYmV0d2VlbiB0aGUgc2VuZGVyIGFuZCByZWNlaXZlciBjbG9ja3MgdXNpbmcgdGhlCisgICBHU3RyZWFtZXIgdGltZXN0YW1wcyAocmVjZWl2ZXIgY2xvY2sgcmF0ZSkgYW5kIFJUUCB0aW1lc3RhbXBzIChzZW5kZXIgY2xvY2sKKyAgIHJhdGUpLgorCitUbyBkZWFsIHdpdGggcmVvcmRlcmVkIHBhY2tldCwgdGhlIGppdHRlcmJ1ZmZlciBob2xkcyBvbiB0byB0aGUgcmVjZWl2ZWQgUlRQCitwYWNrZXRzIGluIGEgcXVldWUgZm9yIGEgY29uZmlndXJhYmxlIGFtb3VudCBvZiB0aW1lLCBjYWxsZWQgdGhlIGxhdGVuY3kuCisKK1RoZSBqaXR0ZXJidWZmZXIgYWxzbyBlbGltaW5hdGVzIG5ldHdvcmsgaml0dGVyIGFuZCB0aGVuIHRyYWNrcyB0aGUgZHJpZnQKK2JldHdlZW4gdGhlIGxvY2FsIGNsb2NrIChhcyBleHByZXNzZWQgaW4gdGhlIEdTdHJlYW1lciB0aW1lc3RhbXBzKSBhbmQgdGhlCityZW1vdGUgY2xvY2sgKGFzIGV4cHJlc3NlZCBpbiB0aGUgUlRQIHRpbWVzdGFtcHMpLiBJdCB3aWxsIHJlbW92ZSB0aGUgaml0dGVyCithbmQgd2lsbCBhcHBseSB0aGUgZHJpZnQgY29ycmVjdGlvbiB0byB0aGUgR1N0cmVhbWVyIHRpbWVzdGFtcCBiZWZvcmUgcHVzaGluZwordGhlIGJ1ZmZlciBkb3duc3RyZWFtLiBUaGUgcmVzdWx0IGlzIHRoYXQgdGhlIGRlcGF5bG9hZGVyIHJlY2VpdmVzIGEgc21vb3RoZWQKK0dTdHJlYW1lciB0aW1lc3RhbXAgb24gdGhlIFJUUCBwYWNrZXQsIHdoaWNoIGlzIGNvcGllZCB0byB0aGUgZGVwYXlsb2FkZWQgZGF0YS4KKworVGhlIGZvbGxvd2luZyBwaXBlbGluZSBpbGx1c3RyYXRlcyBhIHJlY2VpdmVyIHdpdGggYSBqaXR0ZXJidWZmZXIuCisKKyAgICBnc3QtbGF1bmNoLTEuMCB1ZHBzcmMgY2Fwcz0iYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sCisgICAgICBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylIMjYzLTE5OTgiICEKKyAgICAgIHJ0cGppdHRlcmJ1ZmZlciBsYXRlbmN5PTEwMCAhIHJ0cGgyNjNwZGVwYXkgISAgYXZkZWNfaDI2MyAhIGF1dG92aWRlb3NpbmsKKworVGhlIGxhdGVuY3kgcHJvcGVydHkgb24gdGhlIGppdHRlcmJ1ZmZlciBjb250cm9scyB0aGUgYW1vdW50IG9mIGRlbGF5IChpbgorbWlsbGlzZWNvbmRzKSB0byBhcHBseSB0byB0aGUgb3V0Z29pbmcgcGFja2V0cy4gQSBoaWdoZXIgbGF0ZW5jeSB3aWxsIHByb2R1Y2UKK3Ntb290aGVyIHBsYXliYWNrIGluIG5ldHdvcmtzIHdpdGggaGlnaCBqaXR0ZXIgYnV0IGNhdXNlIGEgaGlnaGVyIGxhdGVuY3kuCitDaG9vc2luZyBhIGdvb2QgdmFsdWUgZm9yIHRoZSBsYXRlbmN5IGlzIGEgdHJhZGVvZmYgYmV0d2VlbiB0aGUgcXVhbGl0eSBhbmQKK2xhdGVuY3kuIFRoZSBiZXR0ZXIgdGhlIG5ldHdvcmssIHRoZSBsb3dlciB0aGUgbGF0ZW5jeSBjYW4gYmUgc2V0LgorCisKK3VzYWdlIHdpdGggVURQCistLS0tLS0tLS0tLS0tLQorCitUbyBjb3JyZWN0bHkgYW5kIGNvbXBsZXRlbHkgdXNlIHRoZSBSVFAgcGF5bG9hZGVycyBvbiB0aGUgc2VuZGVyIGFuZCB0aGUKK3JlY2VpdmVyIHlvdSBuZWVkIHRvIHdyaXRlIGFuIGFwcGxpY2F0aW9uLiBJdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYSBmdWxsCitibG93biBSVFAgc2VydmVyIHdpdGggYSBzaW5nbGUgZ3N0LWxhdW5jaC0xLjAgbGluZS4KKworVGhhdCBzYWlkLCBpdCBpcyBwb3NzaWJsZSB0byBkbyBzb21ldGhpbmcgZnVuY3Rpb25hbCB3aXRoIGEgZmV3IGdzdC1sYXVuY2gKK2xpbmVzLiBUaGUgYmlnZ2VzdCBwcm9ibGVtIHdoZW4gY29uc3RydWN0aW5nIGEgY29ycmVjdCBnc3QtbGF1bmNoLTEuMCBsaW5lIGxpZXMgb24KK3RoZSByZWNlaXZlciBlbmQuIAorCitUaGUgcmVjZWl2ZXIgbmVlZHMgdG8ga25vdyBhYm91dCB0aGUgdHlwZSBvZiB0aGUgUlRQIGRhdGEgYWxvbmcgd2l0aCBhIHNldCBvZgorUlRQIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c3VhbGx5IHRyYW5zbWl0dGVkIHRvIHRoZQorY2xpZW50IHVzaW5nIHNvbWUgc29ydCBvZiBzZXNzaW9uIGRlc2NyaXB0aW9uIGxhbmd1YWdlIChTRFApIG92ZXIgc29tZSByZWxpYWJsZQorY2hhbm5lbCAoSFRUUC9SVFNQLy4uLikuICAKKworQWxsIG9mIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzIHRvIGNvbm5lY3QgYW5kIHVzZSB0aGUgUlRQIHNlc3Npb24gb24gdGhlCitzZXJ2ZXIgY2FuIGJlIGZvdW5kIGluIHRoZSBjYXBzIG9uIHRoZSBzZXJ2ZXIgZW5kLiBUaGUgY2xpZW50IHJlY2VpdmVzIHRoaXMKK2luZm9ybWF0aW9uIGluIHNvbWUgd2F5IChjYXBzIGFyZSBjb252ZXJ0ZWQgdG8gYW5kIGZyb20gU0RQLCBhcyBleHBsYWluZWQgYWJvdmUsCitmb3IgZXhhbXBsZSkuCisKK1NvbWUgZ3N0LWxhdW5jaC0xLjAgbGluZXM6CisKKyAgZ3N0LWxhdW5jaC0xLjAgLXYgdmlkZW90ZXN0c3JjICEgdmlkZW9jb252ZXJ0ICEgYXZlbmNfaDI2M3AgISBydHBoMjYzcHBheSAhIHVkcHNpbmsKKworICAgU2V0dGluZyBwaXBlbGluZSB0byBQQVVTRUQgLi4uCisgICAvcGlwZWxpbmUwL3ZpZGVvdGVzdHNyYzAuc3JjOiBjYXBzID0gdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUk0MjAsCisgICB3aWR0aD0oaW50KTMyMCwgaGVpZ2h0PShpbnQpMjQwLCBmcmFtZXJhdGU9KGZyYWN0aW9uKTMwLzEKKyAgIFBpcGVsaW5lIGlzIFBSRVJPTExJTkcgLi4uCisgICAuLi4uCisgICAvcGlwZWxpbmUwL3VkcHNpbmswLnNpbms6IGNhcHMgPSBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywKKyAgIHBheWxvYWQ9KGludCk5NiwgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpSDI2My0xOTk4LAorICAgc3NyYz0oZ3VpbnQpNTI3ODQyMzQ1LCBjbG9jay1iYXNlPShndWludCkxMTUwNzc2OTQxLCBzZXFudW0tYmFzZT0oZ3VpbnQpMzA5ODIKKyAgIC4uLi4KKyAgIFBpcGVsaW5lIGlzIFBSRVJPTExFRCAuLi4KKyAgIFNldHRpbmcgcGlwZWxpbmUgdG8gUExBWUlORyAuLi4KKyAgIE5ldyBjbG9jazogR3N0U3lzdGVtQ2xvY2sKKworIFdyaXRlIGRvd24gdGhlIGNhcHMgb24gdGhlIHVkcHNpbmsgYW5kIHNldCB0aGVtIGFzIHRoZSBjYXBzIG9mIHRoZSBVRFAgCisgcmVjZWl2ZXI6CisKKyAgZ3N0LWxhdW5jaC0xLjAgLXYgdWRwc3JjIGNhcHM9ImFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLAorICBwYXlsb2FkPShpbnQpOTYsIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjMtMTk5OCwKKyAgc3NyYz0oZ3VpbnQpNTI3ODQyMzQ1LCBjbG9jay1iYXNlPShndWludCkxMTUwNzc2OTQxLCBzZXFudW0tYmFzZT0oZ3VpbnQpMzA5ODIiCisgICEgcnRwaDI2M3BkZXBheSAhIGF2ZGVjX2gyNjMgISBhdXRvdmlkZW9zaW5rCisKKyBUaGUgcmVjZWl2ZXIgbm93IGRpc3BsYXlzIGFuIGgyNjMgaW1hZ2UuIFNpbmNlIHRoZXJlIGlzIG5vIGppdHRlcmJ1ZmZlciBpbiB0aGUKKyBwaXBlbGluZSwgZnJhbWVzIHdpbGwgYmUgZGlzcGxheWVkIGF0IHRoZSB0aW1lIHdoZW4gdGhleSBhcmUgcmVjZWl2ZWQuIFRoaXMgY2FuCisgcmVzdWx0IGluIGplcmt5IHBsYXliYWNrIGluIHRoZSBjYXNlIG9mIGhpZ2ggbmV0d29yayBqaXR0ZXIgb3IgY3VycnVwdGVkIHZpZGVvCisgd2hlbiBwYWNrZXRzIGFyZSBkcm9wcGVkIG9yIHJlb3JkZXJlZC4KKworIFN0cmVhbSBhIHF1aWNrdGltZSBmaWxlIHdpdGggbXBlZzQgdmlkZW8gYW5kIEFBQyBhdWRpbyBvbiBwb3J0IDUwMDAgYW5kIHBvcnQKKyA1MDAyLgorCisgIGdzdC1sYXVuY2gtMS4wIC12IGZpbGVzcmMgbG9jYXRpb249fi9kYXRhL3NpbmNpdHkubXA0ICEgcXRkZW11eCBuYW1lPWQgISBxdWV1ZSAhIHJ0cG1wNHZwYXkgISB1ZHBzaW5rIHBvcnQ9NTAwMAorICAgICAgICAgICAgICAgICAgICAgICAgIGQuICEgcXVldWUgISBydHBtcDRncGF5ICEgdWRwc2luayBwb3J0PTUwMDIKKyAgICAuLi4uCisgICAgL3BpcGVsaW5lMC91ZHBzaW5rMC5zaW5rOiBjYXBzID0gYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sCisgICAgcGF5bG9hZD0oaW50KTk2LCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylNUDRWLUVTLAorICAgIHNzcmM9KGd1aW50KTExNjI3MDM3MDMsIGNsb2NrLWJhc2U9KGd1aW50KTgxNjEzNTgzNSwgc2VxbnVtLWJhc2U9KGd1aW50KTkyOTQsCisgICAgcHJvZmlsZS1sZXZlbC1pZD0oc3RyaW5nKTMsIGNvbmZpZz0oc3RyaW5nKTAwMDAwMWIwMDMwMDAwMDFiNTA5MDAwMDAxMDAwMDAwMDEyMDAwODZjNWQ0YzMwN2QzMTQwNDNjMTQ2MzAwMDAwMWIyNTg3NjY5NDQzMDMwMzMzNAorICAgIC9waXBlbGluZTAvdWRwc2luazEuc2luazogY2FwcyA9IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLAorICAgIHBheWxvYWQ9KGludCk5NiwgY2xvY2stcmF0ZT0oaW50KTQ0MTAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpTVBFRzQtR0VORVJJQywKKyAgICBzc3JjPShndWludCkzMjQ2MTQ5ODk4LCBjbG9jay1iYXNlPShndWludCk0MTM0NTE0MDU4LCBzZXFudW0tYmFzZT0oZ3VpbnQpNTc2MzMsCisgICAgZW5jb2RpbmctcGFyYW1zPShzdHJpbmcpMiwgc3RyZWFtdHlwZT0oc3RyaW5nKTUsIHByb2ZpbGUtbGV2ZWwtaWQ9KHN0cmluZykxLAorICAgIG1vZGU9KHN0cmluZylhYWMtaGJyLCBjb25maWc9KHN0cmluZykxMjEwLCBzaXplbGVuZ3RoPShzdHJpbmcpMTMsCisgICAgaW5kZXhsZW5ndGg9KHN0cmluZykzLCBpbmRleGRlbHRhbGVuZ3RoPShzdHJpbmcpMworICAgIC4uLi4KKworIEFnYWluIGNvcHkgdGhlIGNhcHMgb24gYm90aCBzaW5rcyB0byB0aGUgcmVjZWl2ZXIgbGF1bmNoIGxpbmUKKworICAgIGdzdC1sYXVuY2gtMS4wCisgICAgIHVkcHNyYyBwb3J0PTUwMDAgY2Fwcz0iYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIHBheWxvYWQ9KGludCk5NiwKKyAgICAgIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKU1QNFYtRVMsIHNzcmM9KGd1aW50KTExNjI3MDM3MDMsCisgICAgICBjbG9jay1iYXNlPShndWludCk4MTYxMzU4MzUsIHNlcW51bS1iYXNlPShndWludCk5Mjk0LCBwcm9maWxlLWxldmVsLWlkPShzdHJpbmcpMywKKyAgICAgIGNvbmZpZz0oc3RyaW5nKTAwMDAwMWIwMDMwMDAwMDFiNTA5MDAwMDAxMDAwMDAwMDEyMDAwODZjNWQ0YzMwN2QzMTQwNDNjMTQ2MzAwMDAwMWIyNTg3NjY5NDQzMDMwMzMzNCIKKyAgICAgICEgcnRwbXA0dmRlcGF5ICEgZmZkZWNfbXBlZzQgISBhdXRvdmlkZW9zaW5rIHN5bmM9ZmFsc2UKKyAgICAgdWRwc3JjIHBvcnQ9NTAwMiBjYXBzPSJhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KTk2LAorICAgICAgY2xvY2stcmF0ZT0oaW50KTQ0MTAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpTVBFRzQtR0VORVJJQywgc3NyYz0oZ3VpbnQpMzI0NjE0OTg5OCwKKyAgICAgIGNsb2NrLWJhc2U9KGd1aW50KTQxMzQ1MTQwNTgsIHNlcW51bS1iYXNlPShndWludCk1NzYzMywgZW5jb2RpbmctcGFyYW1zPShzdHJpbmcpMiwKKyAgICAgIHN0cmVhbXR5cGU9KHN0cmluZyk1LCBwcm9maWxlLWxldmVsLWlkPShzdHJpbmcpMSwgbW9kZT0oc3RyaW5nKWFhYy1oYnIsCisgICAgICBjb25maWc9KHN0cmluZykxMjEwLCBzaXplbGVuZ3RoPShzdHJpbmcpMTMsIGluZGV4bGVuZ3RoPShzdHJpbmcpMywKKyAgICAgIGluZGV4ZGVsdGFsZW5ndGg9KHN0cmluZykzIiAKKyAgICAgICEgcnRwbXA0Z2RlcGF5ICEgZmFhZCAhIGFsc2FzaW5rIHN5bmM9ZmFsc2UKKworIFRoZSBjYXBzIG9uIHRoZSB1ZHBzaW5rcyBjYW4gYmUgcmV0cmlldmVkIHdoZW4gdGhlIHNlcnZlciBwaXBlbGluZSBwcmVyb2xsZWQgdG8KKyBQQVVTRUQuCisKKyBUaGUgYWJvdmUgcGlwZWxpbmUgc2V0cyBzeW5jPWZhbHNlIG9uIHRoZSBhdWRpbyBhbmQgdmlkZW8gc2luayB3aGljaCBtZWFucyB0aGF0Cisgbm8gc3luY2hyb25pc2F0aW9uIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBzaW5rcywgdGhleSBwbGF5IHRoZSBkYXRhIHdoZW4gaXQKKyBhcnJpdmVzLiBJZiB5b3Ugd2FudCB0byBlbmFibGUgc3luY2hyb25pc2F0aW9uIGluIHRoZSBzaW5rcyBpdCBpcyBoaWdobHkKKyByZWNvbW1lbmRlZCB0byB1c2UgYSBnc3RydHBqaXR0ZXJidWZmZXIgYWZ0ZXIgdGhlIHVkcHNyYyBlbGVtZW50cy4gCisgCisgRXZlbiB3aGVuIHN5bmMgaXMgZW5hYmxlZCwgdGhlIHR3byBkaWZmZXJlbnQgc3RyZWFtcyB3aWxsIG5vdCBwbGF5IHN5bmNocm9uaXNlZAorIGFnYWluc3QgZWFjaG90aGVyIGJlY2F1c2UgdGhlIHJlY2VpdmVyIGRvZXMgbm90IGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvCisgcGVyZm9ybSB0aGlzIHRhc2suIEZvciB0aGlzIHlvdSBuZWVkIHRvIGFkZCB0aGUgcnRwYmluIGVsZW1lbnQgaW4gYm90aCB0aGUKKyBzZW5kZXIgYW5kIHJlY2VpdmVyIHBpcGVsaW5lIGFuZCB1c2UgYWRkaXRpb25hbCBzb3VyY2VzIGFuZCBzaW5rcyB0byB0cmFuc21pdAorIFJUQ1AgcGFja2V0cyB1c2VkIGZvciBpbnRlci1zdHJlYW0gc3luY2hyb25pc2F0aW9uLgorCisgVGhlIGNhcHMgb24gdGhlIHJlY2VpdmVyIHNpZGUgY2FuIGJlIHNldCBvbiB0aGUgVURQIHNvdXJjZSBlbGVtZW50cyB3aGVuIHRoZQorIHBpcGVsaW5lIHdlbnQgdG8gUEFVU0VELiBJbiB0aGF0IHN0YXRlIG5vIGRhdGEgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgVURQIHNvdXJjZXMKKyBhcyB0aGV5IGFyZSBsaXZlIHNvdXJjZXMgYW5kIG9ubHkgcHJvZHVjZSBkYXRhIGluIFBMQVlJTkcuCisKKworUmVsZXZhbnQgUkZDcworLS0tLS0tLS0tLS0tLQorCiszNTUwIFJUUDogQSBUcmFuc3BvcnQgUHJvdG9jb2wgZm9yIFJlYWwtVGltZSBBcHBsaWNhdGlvbnMuICggMTg4OSBPYnNvbGV0ZSApCisKKzIxOTggUlRQIFBheWxvYWQgZm9yIFJlZHVuZGFudCBBdWRpbyBEYXRhLgorMzExOSBBIE1vcmUgTG9zcy1Ub2xlcmFudCBSVFAgUGF5bG9hZCBGb3JtYXQgZm9yIE1QMyBBdWRpby4KKworMjc5MyBSVFAgUGF5bG9hZCBmb3IgVGV4dCBDb252ZXJzYXRpb24uCisKKzIwMzIgUlRQIFBheWxvYWQgRm9ybWF0IGZvciBILjI2MSBWaWRlbyBTdHJlYW1zLgorMjE5MCBSVFAgUGF5bG9hZCBGb3JtYXQgZm9yIEguMjYzIFZpZGVvIFN0cmVhbXMuCisyMjUwIFJUUCBQYXlsb2FkIEZvcm1hdCBmb3IgTVBFRzEvTVBFRzIgVmlkZW8uCisyMzQzIFJUUCBQYXlsb2FkIEZvcm1hdCBmb3IgQnVuZGxlZCBNUEVHLgorMjQyOSBSVFAgUGF5bG9hZCBGb3JtYXQgZm9yIHRoZSAxOTk4IFZlcnNpb24gb2YgSVRVLVQgUmVjLiBILjI2MyBWaWRlbworMjQzMSBSVFAgUGF5bG9hZCBGb3JtYXQgZm9yIEJULjY1NiBWaWRlbyBFbmNvZGluZy4KKzI0MzUgUlRQIFBheWxvYWQgRm9ybWF0IGZvciBKUEVHLWNvbXByZXNzZWQgVmlkZW8uCiszMDE2IFJUUCBQYXlsb2FkIEZvcm1hdCBmb3IgTVBFRy00IEF1ZGlvL1Zpc3VhbCBTdHJlYW1zLgorMzA0NyBSVFAgUGF5bG9hZCBGb3JtYXQgZm9yIElUVS1UIFJlY29tbWVuZGF0aW9uIEcuNzIyLjEuCiszMTg5IFJUUCBQYXlsb2FkIEZvcm1hdCBmb3IgRFYgKElFQyA2MTgzNCkgVmlkZW8uCiszMTkwIFJUUCBQYXlsb2FkIEZvcm1hdCBmb3IgMTItYml0IERBVCBBdWRpbyBhbmQgMjAtIGFuZCAyNC1iaXQgTGluZWFyIFNhbXBsZWQgQXVkaW8uCiszMzg5IFJlYWwtdGltZSBUcmFuc3BvcnQgUHJvdG9jb2wgKFJUUCkgUGF5bG9hZCBmb3IgQ29tZm9ydCBOb2lzZSAoQ04pCisyNzMzIEFuIFJUUCBQYXlsb2FkIEZvcm1hdCBmb3IgR2VuZXJpYyBGb3J3YXJkIEVycm9yIENvcnJlY3Rpb24uCisyODMzIFJUUCBQYXlsb2FkIGZvciBEVE1GIERpZ2l0cywgVGVsZXBob255IFRvbmVzIGFuZCBUZWxlcGhvbnkKKyAgICAgU2lnbmFscy4KKzI4NjIgUlRQIFBheWxvYWQgRm9ybWF0IGZvciBSZWFsLVRpbWUgUG9pbnRlcnMuCiszMzUxIFJUUCBQcm9maWxlIGZvciBBdWRpbyBhbmQgVmlkZW8gQ29uZmVyZW5jZXMgd2l0aCBNaW5pbWFsIENvbnRyb2wuICggMTg5MCBPYnNvbGV0ZSApCiszNTU1IE1JTUUgVHlwZSBSZWdpc3RyYXRpb24gb2YgUlRQIFBheWxvYWQgRm9ybWF0cy4KKworMjUwOCBDb21wcmVzc2luZyBJUC9VRFAvUlRQIEhlYWRlcnMgZm9yIExvdy1TcGVlZCBTZXJpYWwgTGlua3MuCisxMzA1IE5ldHdvcmsgVGltZSBQcm90b2NvbCAoVmVyc2lvbiAzKSBTcGVjaWZpY2F0aW9uLCBJbXBsZW1lbnRhdGlvbiBhbmQgQW5hbHlzaXMuCiszMzM5IERhdGUgYW5kIFRpbWUgb24gdGhlIEludGVybmV0OiBUaW1lc3RhbXBzLgorMjI0NiBUaGUgVExTIFByb3RvY29sIFZlcnNpb24gMS4wCiszNTQ2IFRyYW5zcG9ydCBMYXllciBTZWN1cml0eSAoVExTKSBFeHRlbnNpb25zLiAoIFVwZGF0ZXMgMjI0NiApCisKK2RvIHdlIGNhcmU/CistLS0tLS0tLS0tLQorCisyMDI5IFJUUCBQYXlsb2FkIEZvcm1hdCBvZiBTdW4ncyBDZWxsQiBWaWRlbyBFbmNvZGluZy4KKwordXNlZnVsCistLS0tLS0KKworaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9ydHAtcGFyYW1ldGVycwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9UT0RPIGIvZ3N0L3J0cC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNjVhOWMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL1RPRE8KQEAgLTAsMCArMSwxNSBAQAorKiBNUEVHNCBoZWFkZXIKKyAgLSBmZm1wZWcgbXBlZzQgZGVjb2RlciBnaXZlcyBlcnJvciBtZXNzYWdlIHdoZW4gc2VuZGluZyBvbmx5IHRoZSBjb25maWcKKyAgICBzdHJpbmcsIHBhcnNpbmcgaXMgT0ssIGVycm9yIGp1c3QgbWVhbnMgbm8gcGljdHVyZSB3YXMgZm91bmQgaW4gdGhlCisgICAgc3RyZWFtLgorCisqIGNvbXBhcmUgSDI2MyBlbmNvZGVycyBhbmQgSDI2MysKKworKiBiZXR0ZXIgUlRQIHBhY2tldGl6aW5nIGZvciBoMjYzCisKKyogYml0cmF0ZSB0dW5pbmcgaW4gZmZtcGVnCisgIC0gZml4ZWQgdGhlIHFtYXggdmFsdWVzIHNvIHdlIGNhbiBxdWFudGl6ZSBtb3JlLgorCisqIG1ha2UgZmZtcGVnIG5lZ290aWF0ZSBvbmx5IHdpdGggYWNjZXB0ZWQgZnJhbWVyYXRlcworCisKZGlmZiAtLWdpdCBhL2dzdC9ydHAvZGJvb2xodWZmLkxJQ0VOU0UgYi9nc3QvcnRwL2Rib29saHVmZi5MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZTRlNmYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2Rib29saHVmZi5MSUNFTlNFCkBAIC0wLDAgKzEsMjkgQEAKK0NvcHlyaWdodCAoYykgMjAxMCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisKKyAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICAgIGRpc3RyaWJ1dGlvbi4KKworICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKKyAgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCitBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZGJvb2xodWZmLmMgYi9nc3QvcnRwL2Rib29saHVmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMGZjOGYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2Rib29saHVmZi5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBkYm9vbGh1ZmYuTElDRU5TRSBmaWxlIGluIHRoaXMgZGlyZWN0b3J5LgorICogIFNlZSB0aGUgbGlidnB4IG9yaWdpbmFsIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiwKKyAqICBpbmNsdWRpbmcgcGF0ZW50IGluZm9ybWF0aW9uLCBhbmQgYXV0aG9yIGluZm9ybWF0aW9uLgorICovCisKKworI2luY2x1ZGUgImRib29saHVmZi5oIgorCisjaWZkZWYgX01TQ19WRVIKK19fZGVjbHNwZWMgKGFsaWduICgxNikpCisgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgdnA4X25vcm1bMjU2XSA9IHsKKyNlbHNlCitjb25zdCB1bnNpZ25lZCBjaGFyIHZwOF9ub3JtWzI1Nl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDE2KSkpID0geworI2VuZGlmCiswLCA3LCA2LCA2LCA1LCA1LCA1LCA1LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKKworaW50Cit2cDhkeF9zdGFydF9kZWNvZGUgKEJPT0xfREVDT0RFUiAqIGJyLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV9zeikKK3sKKyAgYnItPnVzZXJfYnVmZmVyX2VuZCA9IHNvdXJjZSArIHNvdXJjZV9zejsKKyAgYnItPnVzZXJfYnVmZmVyID0gc291cmNlOworICBici0+dmFsdWUgPSAwOworICBici0+Y291bnQgPSAtODsKKyAgYnItPnJhbmdlID0gMjU1OworCisgIGlmIChzb3VyY2Vfc3ogJiYgIXNvdXJjZSkKKyAgICByZXR1cm4gMTsKKworICAvKiBQb3B1bGF0ZSB0aGUgYnVmZmVyICovCisgIHZwOGR4X2Jvb2xfZGVjb2Rlcl9maWxsIChicik7CisKKyAgcmV0dXJuIDA7Cit9CisKKwordm9pZAordnA4ZHhfYm9vbF9kZWNvZGVyX2ZpbGwgKEJPT0xfREVDT0RFUiAqIGJyKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWZwdHI7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmVuZDsKKyAgVlA4X0JEX1ZBTFVFIHZhbHVlOworICBpbnQgY291bnQ7CisgIGJ1ZmVuZCA9IGJyLT51c2VyX2J1ZmZlcl9lbmQ7CisgIGJ1ZnB0ciA9IGJyLT51c2VyX2J1ZmZlcjsKKyAgdmFsdWUgPSBici0+dmFsdWU7CisgIGNvdW50ID0gYnItPmNvdW50OworCisgIFZQOERYX0JPT0xfREVDT0RFUl9GSUxMIChjb3VudCwgdmFsdWUsIGJ1ZnB0ciwgYnVmZW5kKTsKKworICBici0+dXNlcl9idWZmZXIgPSBidWZwdHI7CisgIGJyLT52YWx1ZSA9IHZhbHVlOworICBici0+Y291bnQgPSBjb3VudDsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZGJvb2xodWZmLmggYi9nc3QvcnRwL2Rib29saHVmZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYTQ1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2Rib29saHVmZi5oCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgZGJvb2xodWZmLkxJQ0VOU0UgZmlsZSBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqICBTZWUgdGhlIGxpYnZweCBvcmlnaW5hbCBkaXN0cmlidXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24sCisgKiAgaW5jbHVkaW5nIHBhdGVudCBpbmZvcm1hdGlvbiwgYW5kIGF1dGhvciBpbmZvcm1hdGlvbi4KKyAqLworCisKKyNpZm5kZWYgREJPT0xIVUZGX0gKKyNkZWZpbmUgREJPT0xIVUZGX0gKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxnbGliLmg+CisKK3R5cGVkZWYgc2l6ZV90IFZQOF9CRF9WQUxVRTsKKworIyBkZWZpbmUgVlA4X0JEX1ZBTFVFX1NJWkUgKChpbnQpc2l6ZW9mKFZQOF9CRF9WQUxVRSkqQ0hBUl9CSVQpCisvKlRoaXMgaXMgbWVhbnQgdG8gYmUgYSBsYXJnZSwgcG9zaXRpdmUgY29uc3RhbnQgdGhhdCBjYW4gc3RpbGwgYmUgZWZmaWNpZW50bHkKKyAgIGxvYWRlZCBhcyBhbiBpbW1lZGlhdGUgKG9uIHBsYXRmb3JtcyBsaWtlIEFSTSwgZm9yIGV4YW1wbGUpLgorICBFdmVuIHJlbGF0aXZlbHkgbW9kZXN0IHZhbHVlcyBsaWtlIDEwMCB3b3VsZCB3b3JrIGZpbmUuKi8KKyMgZGVmaW5lIFZQOF9MT1RTX09GX0JJVFMgKDB4NDAwMDAwMDApCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcl9idWZmZXJfZW5kOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVzZXJfYnVmZmVyOworICAgIFZQOF9CRF9WQUxVRSAgICAgICAgIHZhbHVlOworICAgIGludCAgICAgICAgICAgICAgICAgIGNvdW50OworICAgIHVuc2lnbmVkIGludCAgICAgICAgIHJhbmdlOworfSBCT09MX0RFQ09ERVI7CisKKyNpZmRlZiBfTVNDX1ZFUgorX19kZWNsc3BlYyhhbGlnbigxNikpIGV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIHZwOF9ub3JtWzI1Nl07CisjZWxzZQorZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgdnA4X25vcm1bMjU2XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpOworI2VuZGlmCisKK2ludCB2cDhkeF9zdGFydF9kZWNvZGUoQk9PTF9ERUNPREVSICpiciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc291cmNlX3N6KTsKKwordm9pZCB2cDhkeF9ib29sX2RlY29kZXJfZmlsbChCT09MX0RFQ09ERVIgKmJyKTsKKworLypUaGUgcmVmaWxsIGxvb3AgaXMgdXNlZCBpbiBzZXZlcmFsIHBsYWNlcywgc28gZGVmaW5lIGl0IGluIGEgbWFjcm8gdG8gbWFrZQorICAgc3VyZSB0aGV5J3JlIGFsbCBjb25zaXN0ZW50LgorICBBbiBpbmxpbmUgZnVuY3Rpb24gd291bGQgYmUgY2xlYW5lciwgYnV0IGhhcyBhIHNpZ25pZmljYW50IHBlbmFsdHksIGJlY2F1c2UKKyAgIG11bHRpcGxlIEJPT0xfREVDT0RFUiBmaWVsZHMgbXVzdCBiZSBtb2RpZmllZCwgYW5kIHRoZSBjb21waWxlciBpcyBub3Qgc21hcnQKKyAgIGVub3VnaCB0byBlbGltaW5hdGUgdGhlIHN0b3JlcyB0byB0aG9zZSBmaWVsZHMgYW5kIHRoZSBzdWJzZXF1ZW50IHJlbG9hZHMKKyAgIGZyb20gdGhlbSB3aGVuIGlubGluaW5nIHRoZSBmdW5jdGlvbi4qLworI2RlZmluZSBWUDhEWF9CT09MX0RFQ09ERVJfRklMTChfY291bnQsX3ZhbHVlLF9idWZwdHIsX2J1ZmVuZCkgXAorICAgIGRvIFwKKyAgICB7IFwKKyAgICAgICAgaW50IHNoaWZ0ID0gVlA4X0JEX1ZBTFVFX1NJWkUgLSA4IC0gKChfY291bnQpICsgOCk7IFwKKyAgICAgICAgaW50IGxvb3BfZW5kLCB4OyBcCisgICAgICAgIHNpemVfdCBiaXRzX2xlZnQgPSAoKF9idWZlbmQpLShfYnVmcHRyKSkqQ0hBUl9CSVQ7IFwKKyAgICAgICAgXAorICAgICAgICB4ID0gc2hpZnQgKyBDSEFSX0JJVCAtIGJpdHNfbGVmdDsgXAorICAgICAgICBsb29wX2VuZCA9IDA7IFwKKyAgICAgICAgaWYoeCA+PSAwKSBcCisgICAgICAgIHsgXAorICAgICAgICAgICAgKF9jb3VudCkgKz0gVlA4X0xPVFNfT0ZfQklUUzsgXAorICAgICAgICAgICAgbG9vcF9lbmQgPSB4OyBcCisgICAgICAgICAgICBpZighYml0c19sZWZ0KSBicmVhazsgXAorICAgICAgICB9IFwKKyAgICAgICAgd2hpbGUoc2hpZnQgPj0gbG9vcF9lbmQpIFwKKyAgICAgICAgeyBcCisgICAgICAgICAgICAoX2NvdW50KSArPSBDSEFSX0JJVDsgXAorICAgICAgICAgICAgKF92YWx1ZSkgfD0gKFZQOF9CRF9WQUxVRSkqKF9idWZwdHIpKysgPDwgc2hpZnQ7IFwKKyAgICAgICAgICAgIHNoaWZ0IC09IENIQVJfQklUOyBcCisgICAgICAgIH0gXAorICAgIH0gXAorICAgIHdoaWxlKDApIFwKKworCitzdGF0aWMgaW50IHZwOGR4X2RlY29kZV9ib29sKEJPT0xfREVDT0RFUiAqYnIsIGludCBwcm9iYWJpbGl0eSkgeworICAgIHVuc2lnbmVkIGludCBiaXQgPSAwOworICAgIFZQOF9CRF9WQUxVRSB2YWx1ZTsKKyAgICB1bnNpZ25lZCBpbnQgc3BsaXQ7CisgICAgVlA4X0JEX1ZBTFVFIGJpZ3NwbGl0OworICAgIGludCBjb3VudDsKKyAgICB1bnNpZ25lZCBpbnQgcmFuZ2U7CisKKyAgICBzcGxpdCA9IDEgKyAoKChici0+cmFuZ2UgLSAxKSAqIHByb2JhYmlsaXR5KSA+PiA4KTsKKworICAgIGlmKGJyLT5jb3VudCA8IDApCisgICAgICAgIHZwOGR4X2Jvb2xfZGVjb2Rlcl9maWxsKGJyKTsKKworICAgIHZhbHVlID0gYnItPnZhbHVlOworICAgIGNvdW50ID0gYnItPmNvdW50OworCisgICAgYmlnc3BsaXQgPSAoVlA4X0JEX1ZBTFVFKXNwbGl0IDw8IChWUDhfQkRfVkFMVUVfU0laRSAtIDgpOworCisgICAgcmFuZ2UgPSBzcGxpdDsKKworICAgIGlmICh2YWx1ZSA+PSBiaWdzcGxpdCkKKyAgICB7CisgICAgICAgIHJhbmdlID0gYnItPnJhbmdlIC0gc3BsaXQ7CisgICAgICAgIHZhbHVlID0gdmFsdWUgLSBiaWdzcGxpdDsKKyAgICAgICAgYml0ID0gMTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBzaGlmdCA9IHZwOF9ub3JtW3JhbmdlXTsKKyAgICAgICAgcmFuZ2UgPDw9IHNoaWZ0OworICAgICAgICB2YWx1ZSA8PD0gc2hpZnQ7CisgICAgICAgIGNvdW50IC09IHNoaWZ0OworICAgIH0KKyAgICBici0+dmFsdWUgPSB2YWx1ZTsKKyAgICBici0+Y291bnQgPSBjb3VudDsKKyAgICBici0+cmFuZ2UgPSByYW5nZTsKKworICAgIHJldHVybiBiaXQ7Cit9CisKK3N0YXRpYyBHX0dOVUNfVU5VU0VEIGludCB2cDhfZGVjb2RlX3ZhbHVlKEJPT0xfREVDT0RFUiAqYnIsIGludCBiaXRzKQoreworICAgIGludCB6ID0gMDsKKyAgICBpbnQgYml0OworCisgICAgZm9yIChiaXQgPSBiaXRzIC0gMTsgYml0ID49IDA7IGJpdC0tKQorICAgIHsKKyAgICAgICAgeiB8PSAodnA4ZHhfZGVjb2RlX2Jvb2woYnIsIDB4ODApIDw8IGJpdCk7CisgICAgfQorCisgICAgcmV0dXJuIHo7Cit9CisKK3N0YXRpYyBHX0dOVUNfVU5VU0VEIGludCB2cDhkeF9ib29sX2Vycm9yKEJPT0xfREVDT0RFUiAqYnIpCit7CisgICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFZhcmlhYmxlICdjb3VudCcgc3RvcmVzIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgJ3ZhbHVlJyBidWZmZXIsIG1pbnVzCisgICAgICogOC4gVGhlIHRvcCBieXRlIGlzIHBhcnQgb2YgdGhlIGFsZ29yaXRobSwgYW5kIHRoZSByZW1haW5kZXIgaXMgYnVmZmVyZWQKKyAgICAgKiB0byBiZSBzaGlmdGVkIGludG8gaXQuIFNvIGlmIGNvdW50ID09IDgsIHRoZSB0b3AgMTYgYml0cyBvZiAndmFsdWUnIGFyZQorICAgICAqIG9jY3VwaWVkLCA4IGZvciB0aGUgYWxnb3JpdGhtIGFuZCA4IGluIHRoZSBidWZmZXIuCisgICAgICoKKyAgICAgKiBXaGVuIHJlYWRpbmcgYSBieXRlIGZyb20gdGhlIHVzZXIncyBidWZmZXIsIGNvdW50IGlzIGZpbGxlZCB3aXRoIDggYW5kCisgICAgICogb25lIGJ5dGUgaXMgZmlsbGVkIGludG8gdGhlIHZhbHVlIGJ1ZmZlci4gV2hlbiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZQorICAgICAqIGRhdGEsIGNvdW50IGlzIGFkZGl0aW9uYWxseSBmaWxsZWQgd2l0aCBWUDhfTE9UU19PRl9CSVRTLiBTbyB3aGVuCisgICAgICogY291bnQgPT0gVlA4X0xPVFNfT0ZfQklUUyAtIDEsIHRoZSB1c2VyJ3MgZGF0YSBoYXMgYmVlbiBleGhhdXN0ZWQuCisgICAgICovCisgICAgaWYgKChici0+Y291bnQgPiBWUDhfQkRfVkFMVUVfU0laRSkgJiYgKGJyLT5jb3VudCA8IFZQOF9MT1RTX09GX0JJVFMpKQorICAgIHsKKyAgICAgICAvKiBXZSBoYXZlIHRyaWVkIHRvIGRlY29kZSBiaXRzIGFmdGVyIHRoZSBlbmQgb2YKKyAgICAgICAgKiBzdHJlYW0gd2FzIGVuY291bnRlcmVkLgorICAgICAgICAqLworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBObyBlcnJvci4gKi8KKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9mbnYxaGFzaC5jIGIvZ3N0L3J0cC9mbnYxaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ODViYjIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2ZudjFoYXNoLmMKQEAgLTAsMCArMSw2MyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaW5jbHVkZSAiZm52MWhhc2guaCIKKworLyogVGhpcyBmaWxlIGltcGxlbWVudHMgRk5WLTEgaGFzaGluZyB1c2VkIGluIHRoZSBPZ2cgcGF5bG9hZCBlbmNvZGVycworICogdG8gZ2VuZXJhdGUgdGhlIDI0LWJpdCBpZGVudCB2YWx1ZSBiYXNlZCBvbiB0aGUgaGVhZGVyIHBhZ2VzLgorICogU2VlIGh0dHA6Ly9pc3RoZS5jb20vY2hvbmdvL3RlY2gvY29tcC9mbnYvCisgKi8KKworI2RlZmluZSBNQVNLXzI0ICgoKGd1aW50MzIpIDEgPDwgMjQpIC0xKQorCisjZGVmaW5lIEZOVjFfSEFTSF8zMl9JTklUICgoZ3VpbnQzMikgMHg4MTFDOURDNUwpCisvLzIxNjYxMzYyNjFMKQorI2RlZmluZSBGTlYxX0hBU0hfMzJfUFJJTUUgMTY3Nzc2MTkKKworZ3VpbnQzMgorZm52MV9oYXNoXzMyX25ldyAodm9pZCkKK3sKKyAgcmV0dXJuIEZOVjFfSEFTSF8zMl9JTklUOworfQorCitndWludDMyCitmbnYxX2hhc2hfMzJfdXBkYXRlIChndWludDMyIGhhc2gsIGNvbnN0IGd1Y2hhciAqIGRhdGEsIGd1aW50IGxlbmd0aCkKK3sKKyAgZ3VpbnQgaTsKKyAgY29uc3QgZ3VjaGFyICpwID0gZGF0YTsKKworICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2ksICsrcCkgeworICAgIGhhc2ggKj0gRk5WMV9IQVNIXzMyX1BSSU1FOworICAgIGhhc2ggXj0gKnA7CisgIH0KKworICByZXR1cm4gaGFzaDsKK30KKworZ3VpbnQzMgorZm52MV9oYXNoXzMyX3RvXzI0IChndWludDMyIGhhc2gpCit7CisgIHJldHVybiAoaGFzaCA+PiAyNCkgXiAoaGFzaCAmIE1BU0tfMjQpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9mbnYxaGFzaC5oIGIvZ3N0L3J0cC9mbnYxaGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNDcwNjcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2ZudjFoYXNoLmgKQEAgLTAsMCArMSwzNiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfRk5WMV9IQVNIX0hfXworI2RlZmluZSBfX0dTVF9GTlYxX0hBU0hfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCitndWludDMyIGZudjFfaGFzaF8zMl9uZXcgKHZvaWQpOworZ3VpbnQzMiBmbnYxX2hhc2hfMzJfdXBkYXRlIChndWludDMyIGhhc2gsIGNvbnN0IGd1Y2hhciAqZGF0YSwgZ3VpbnQgbGVuZ3RoKTsKK2d1aW50MzIgZm52MV9oYXNoXzMyX3RvXzI0IChndWludDMyIGhhc2gpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfRk5WMV9IQVNIX0hfXyAqLworCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jIGIvZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWE3ZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYwpAQCAtMCwwICsxLDIzMCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgImdzdGFzdGVyaXNraDI2My5oIgorCisjZGVmaW5lIEdTVF9BU1RFUklTS0gyNjNfSEVBREVSX0xFTiA2CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBc3Rlcmlza0gyNjNIZWFkZXIKK3sKKyAgZ3VpbnQzMiB0aW1lc3RhbXA7ICAgICAgICAgICAgLyogVGltZXN0YW1wICovCisgIGd1aW50MTYgbGVuZ3RoOyAgICAgICAgICAgICAgIC8qIExlbmd0aCAqLworfSBHc3RBc3Rlcmlza0gyNjNIZWFkZXI7CisKKyNkZWZpbmUgR1NUX0FTVEVSSVNLSDI2M19IRUFERVJfVElNRVNUQU1QKGRhdGEpICgoKEdzdEFzdGVyaXNrSDI2M0hlYWRlciAqKShkYXRhKSktPnRpbWVzdGFtcCkKKyNkZWZpbmUgR1NUX0FTVEVSSVNLSDI2M19IRUFERVJfTEVOR1RIKGRhdGEpICgoKEdzdEFzdGVyaXNrSDI2M0hlYWRlciAqKShkYXRhKSktPmxlbmd0aCkKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9hc3Rlcmlza2gyNjNfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LWFzdGVyaXNraDI2MyIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9hc3Rlcmlza2gyNjNfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSBbIDk2LCAxMjcgXSwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJIMjYzLTE5OThcIiIpCisgICAgKTsKKworc3RhdGljIHZvaWQgZ3N0X2FzdGVyaXNraDI2M19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9hc3Rlcmlza2gyNjNfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfYXN0ZXJpc2toMjYzX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKKyNkZWZpbmUgZ3N0X2FzdGVyaXNraDI2M19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RBc3Rlcmlza2gyNjMsIGdzdF9hc3Rlcmlza2gyNjMsIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgdm9pZAorZ3N0X2FzdGVyaXNraDI2M19jbGFzc19pbml0IChHc3RBc3Rlcmlza2gyNjNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfYXN0ZXJpc2toMjYzX2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9hc3Rlcmlza2gyNjNfY2hhbmdlX3N0YXRlOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9hc3Rlcmlza2gyNjNfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X2FzdGVyaXNraDI2M19zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBBc3RlcmlzayBIMjYzIGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBIMjYzIHZpZGVvIGZyb20gUlRQIGFuZCBlbmNvZGVzIGluIEFzdGVyaXNrIEgyNjMgZm9ybWF0IiwKKyAgICAgICJOZWlsIFN0cmF0Zm9yZCA8bmVpbHNAdmlwYWRpYS5jb20+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXN0ZXJpc2toMjYzX2luaXQgKEdzdEFzdGVyaXNraDI2MyAqIGFzdGVyaXNraDI2MykKK3sKKyAgYXN0ZXJpc2toMjYzLT5zcmNwYWQgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZnc3RfYXN0ZXJpc2toMjYzX3NyY190ZW1wbGF0ZSwgInNyYyIpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoYXN0ZXJpc2toMjYzKSwgYXN0ZXJpc2toMjYzLT5zcmNwYWQpOworCisgIGFzdGVyaXNraDI2My0+c2lua3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJmdzdF9hc3Rlcmlza2gyNjNfc2lua190ZW1wbGF0ZSwKKyAgICAgICJzaW5rIik7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChhc3Rlcmlza2gyNjMtPnNpbmtwYWQsIGdzdF9hc3Rlcmlza2gyNjNfY2hhaW4pOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoYXN0ZXJpc2toMjYzKSwgYXN0ZXJpc2toMjYzLT5zaW5rcGFkKTsKKworICBhc3Rlcmlza2gyNjMtPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXN0ZXJpc2toMjYzX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RBc3Rlcmlza2gyNjMgKmFzdGVyaXNraDI2MzsKKworICBhc3Rlcmlza2gyNjMgPSBHU1RfQVNURVJJU0tfSDI2MyAob2JqZWN0KTsKKworICBnX29iamVjdF91bnJlZiAoYXN0ZXJpc2toMjYzLT5hZGFwdGVyKTsKKyAgYXN0ZXJpc2toMjYzLT5hZGFwdGVyID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYXN0ZXJpc2toMjYzX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RBc3Rlcmlza2gyNjMgKmFzdGVyaXNraDI2MzsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIGFzdGVyaXNraDI2MyA9IEdTVF9BU1RFUklTS19IMjYzIChwYXJlbnQpOworCisgIHsKKyAgICBnaW50IHBheWxvYWRfbGVuOworICAgIGd1aW50OCAqcGF5bG9hZDsKKyAgICBnYm9vbGVhbiBNOworICAgIGd1aW50MzIgdGltZXN0YW1wOworICAgIGd1aW50MzIgc2FtcGxlczsKKyAgICBndWludDE2IGFzdGVyaXNrX2xlbjsKKyAgICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICBpZiAoIWdzdF9ydHBfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1JFQUQsICZydHApKQorICAgICAgZ290byBiYWRfcGFja2V0OworCisgICAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKCZydHApOworICAgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisKKyAgICBNID0gZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAoJnJ0cCk7CisgICAgdGltZXN0YW1wID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3RpbWVzdGFtcCAoJnJ0cCk7CisKKyAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHBheWxvYWRfbGVuICsKKyAgICAgICAgR1NUX0FTVEVSSVNLSDI2M19IRUFERVJfTEVOKTsKKworICAgIC8qIGJ1aWxkIHRoZSBhc3RlcmlzayBoZWFkZXIgKi8KKyAgICBhc3Rlcmlza19sZW4gPSBwYXlsb2FkX2xlbjsKKyAgICBpZiAoTSkKKyAgICAgIGFzdGVyaXNrX2xlbiB8PSAweDgwMDA7CisgICAgaWYgKCFhc3Rlcmlza2gyNjMtPmxhc3R0cykKKyAgICAgIGFzdGVyaXNraDI2My0+bGFzdHRzID0gdGltZXN0YW1wOworICAgIHNhbXBsZXMgPSB0aW1lc3RhbXAgLSBhc3Rlcmlza2gyNjMtPmxhc3R0czsKKyAgICBhc3Rlcmlza2gyNjMtPmxhc3R0cyA9IHRpbWVzdGFtcDsKKworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgIEdTVF9BU1RFUklTS0gyNjNfSEVBREVSX1RJTUVTVEFNUCAobWFwLmRhdGEpID0gZ19odG9ubCAoc2FtcGxlcyk7CisgICAgR1NUX0FTVEVSSVNLSDI2M19IRUFERVJfTEVOR1RIIChtYXAuZGF0YSkgPSBnX2h0b25zIChhc3Rlcmlza19sZW4pOworCisgICAgLyogY29weSB0aGUgZGF0YSBpbnRvIHBsYWNlICovCisgICAgbWVtY3B5IChtYXAuZGF0YSArIEdTVF9BU1RFUklTS0gyNjNfSEVBREVSX0xFTiwgcGF5bG9hZCwgcGF5bG9hZF9sZW4pOworCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gdGltZXN0YW1wOworICAgIGlmICghZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChhc3Rlcmlza2gyNjMtPnNyY3BhZCkpIHsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgIGNhcHMgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoYXN0ZXJpc2toMjYzLT5zcmNwYWQpOworICAgICAgZ3N0X3BhZF9zZXRfY2FwcyAoYXN0ZXJpc2toMjYzLT5zcmNwYWQsIGNhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIH0KKworICAgIHJldCA9IGdzdF9wYWRfcHVzaCAoYXN0ZXJpc2toMjYzLT5zcmNwYWQsIG91dGJ1Zik7CisKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICB9CisKKyAgcmV0dXJuIHJldDsKKworYmFkX3BhY2tldDoKKyAgeworICAgIEdTVF9ERUJVRyAoIlBhY2tldCBkb2VzIG5vdCB2YWxpZGF0ZSIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2FzdGVyaXNraDI2M19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RBc3Rlcmlza2gyNjMgKmFzdGVyaXNraDI2MzsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIGFzdGVyaXNraDI2MyA9IEdTVF9BU1RFUklTS19IMjYzIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGFzdGVyaXNraDI2My0+YWRhcHRlcik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICAvKgorICAgICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgIGJyZWFrOworICAgICBkZWZhdWx0OgorICAgICBicmVhazsKKyAgICAgfQorICAgKi8KKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9hc3Rlcmlza2gyNjNfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJhc3Rlcmlza2gyNjMiLAorICAgICAgR1NUX1JBTktfTk9ORSwgR1NUX1RZUEVfQVNURVJJU0tfSDI2Myk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdGFzdGVyaXNraDI2My5oIGIvZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzk1MjNkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuaApAQCAtMCwwICsxLDY1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9BU1RFUklTS19IMjYzX0hfXworI2RlZmluZSBfX0dTVF9BU1RFUklTS19IMjYzX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0FTVEVSSVNLX0gyNjMgXAorICAoZ3N0X2FzdGVyaXNraDI2M19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVNURVJJU0tfSDI2MyhvYmopIFwKKyAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVNURVJJU0tfSDI2MyxHc3RBc3Rlcmlza2gyNjMpKQorI2RlZmluZSBHU1RfQVNURVJJU0tfSDI2M19DTEFTUyhrbGFzcykgXAorIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0FTVEVSSVNLX0gyNjMsR3N0QXN0ZXJpc2toMjYzQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQVNURVJJU0tfSDI2MyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0FTVEVSSVNLX0gyNjMpKQorI2RlZmluZSBHU1RfSVNfQVNURVJJU0tfSDI2M19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9BU1RFUklTS19IMjYzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEFzdGVyaXNraDI2MyBHc3RBc3Rlcmlza2gyNjM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXN0ZXJpc2toMjYzQ2xhc3MgR3N0QXN0ZXJpc2toMjYzQ2xhc3M7CisKK3N0cnVjdCBfR3N0QXN0ZXJpc2toMjYzCit7CisgIEdzdEVsZW1lbnQgZWxlbWVudDsKKworICBHc3RQYWQgKnNpbmtwYWQ7CisgIEdzdFBhZCAqc3JjcGFkOworCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisKKyAgZ3VpbnQzMiBsYXN0dHM7Cit9OworCitzdHJ1Y3QgX0dzdEFzdGVyaXNraDI2M0NsYXNzCit7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfYXN0ZXJpc2toMjYzX2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X2FzdGVyaXNraDI2M19wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0FTVEVSSVNLX0gyNjNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cC5jIGIvZ3N0L3J0cC9nc3RydHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjBlZjU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHAuYwpAQCAtMCwwICsxLDM5OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC90YWcvdGFnLmg+CisKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCisjaW5jbHVkZSAiZ3N0cnRwYWMzZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBhYzNwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBidmRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwYnZwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBjZWx0ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBjZWx0cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwZHZkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cGR2cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwZ3N0ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBnc3RwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBpbGJjZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBpbGJjcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwcGNtdXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHBjbWFwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBwY21hZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBwY211ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBnNzIyZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBnNzIycGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwZzcyM2RlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwZzcyM3BheS5oIgorI2luY2x1ZGUgImdzdHJ0cGc3MjZkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cGc3MjZwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBnNzI5ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBnNzI5cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwZ3NtcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwZ3NtZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBhbXJwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBhbXJkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cG1wYXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cG1wYWRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwbXBhcm9idXN0ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBtcHZkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cG1wdnBheS5oIgorI2luY2x1ZGUgImdzdHJ0cG9wdXNkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cG9wdXNwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBoMjYxcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwaDI2MWRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwaDI2M3BkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cGgyNjNwcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwaDI2M2RlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwaDI2M3BheS5oIgorI2luY2x1ZGUgImdzdHJ0cGgyNjRkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cGgyNjRwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBoMjY1ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBoMjY1cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwajJrZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBqMmtwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBqcGVnZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBqcGVncGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwa2x2ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBrbHZwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBMOGRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwTDhwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBMMTZkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cEwxNnBheS5oIgorI2luY2x1ZGUgImdzdHJ0cEwyNGRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwTDI0cGF5LmgiCisjaW5jbHVkZSAiZ3N0YXN0ZXJpc2toMjYzLmgiCisjaW5jbHVkZSAiZ3N0cnRwbXAxc2RlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwbXAydGRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwbXAydHBheS5oIgorI2luY2x1ZGUgImdzdHJ0cG1wNHZkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cG1wNHZwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBtcDRhZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBtcDRhcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwbXA0Z2RlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwbXA0Z3BheS5oIgorI2luY2x1ZGUgImdzdHJ0cHFjZWxwZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBxZG1kZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHNiY2RlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwc2JjcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwc2lyZW5wYXkuaCIKKyNpbmNsdWRlICJnc3RydHBzaXJlbmRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwc3BlZXhwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBzcGVleGRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwc3YzdmRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdGhlb3JhZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB0aGVvcmFwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB2b3JiaXNkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHZvcmJpc3BheS5oIgorI2luY2x1ZGUgImdzdHJ0cHZwOGRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdnA4cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdnA5ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB2cDlwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB2cmF3ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB2cmF3cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwc3RyZWFtcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwc3RyZWFtZGVwYXkuaCIKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBnc3RfdGFnX2ltYWdlX3R5cGVfZ2V0X3R5cGUgKCk7CisKKyAgcnRwX3F1YXJrX21ldGFfdGFnX3ZpZGVvID0KKyAgICAgIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nIChHU1RfTUVUQV9UQUdfVklERU9fU1RSKTsKKyAgcnRwX3F1YXJrX21ldGFfdGFnX2F1ZGlvID0KKyAgICAgIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nIChHU1RfTUVUQV9UQUdfQVVESU9fU1RSKTsKKworICBpZiAoIWdzdF9ydHBfYWMzX2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfYWMzX3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2J2X2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfYnZfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfY2VsdF9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2NlbHRfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfZHZfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9kdl9wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9nc3RfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9nc3RfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfaWxiY19wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9pbGJjX2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfZzcyMl9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2c3MjJfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfZzcyM19kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2c3MjNfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfZzcyNl9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2c3MjZfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfZzcyOV9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2c3MjlfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfZ3NtX2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfZ3NtX3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2Ftcl9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2Ftcl9wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9wY21hX2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfcGNtdV9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3BjbXVfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfcGNtYV9wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9tcGFfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9tcGFfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX21wdl9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX21wdl9wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9vcHVzX2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfb3B1c19wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9oMjYxX3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2gyNjFfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9oMjYzcF9wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9oMjYzcF9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2gyNjNfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9oMjYzX3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2gyNjRfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9oMjY0X3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2gyNjVfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9oMjY1X3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2oya19kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2oya19wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9qcGVnX2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfanBlZ19wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9rbHZfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9rbHZfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfTDhfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfTDhfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9MMTZfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfTDE2X2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfTDI0X3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX0wyNF9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfYXN0ZXJpc2toMjYzX3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfbXAxc19kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX21wMnRfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9tcDJ0X3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX21wNHZfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfbXA0dl9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX21wNGFfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfbXA0YV9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX21wNGdfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9tcDRnX3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3FjZWxwX2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfcWRtMl9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3NiY19kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3NiY19wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9zaXJlbl9wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9zaXJlbl9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3NwZWV4X3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3NwZWV4X2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfc3Yzdl9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3RoZW9yYV9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3RoZW9yYV9wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF92b3JiaXNfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF92b3JiaXNfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfdnA4X2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfdnA4X3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3ZwOV9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3ZwOV9wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF92cmF3X2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfdnJhd19wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9zdHJlYW1fcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfc3RyZWFtX2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHJ0cCwKKyAgICAiUmVhbC10aW1lIHByb3RvY29sIHBsdWdpbnMiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cEwxNmRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cEwxNmRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxZjE2ZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYwpAQCAtMCwwICsxLDI4NSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cEwxNmRlcGF5CisgKiBAc2VlX2Fsc286IHJ0cEwxNnBheQorICoKKyAqIEV4dHJhY3QgcmF3IGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQyAzNTUxLgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMzU1MS50eHQKKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdWRwc3JjIGNhcHM9J2FwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpNDQxMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylMMTYsIGVuY29kaW5nLXBhcmFtcz0oc3RyaW5nKTEsIGNoYW5uZWxzPShpbnQpMSwgcGF5bG9hZD0oaW50KTk2JyAhIHJ0cEwxNmRlcGF5ICEgcHVsc2VzaW5rCisgKiBdfCBUaGlzIGV4YW1wbGUgcGlwZWxpbmUgd2lsbCBkZXBheWxvYWQgYW4gUlRQIHJhdyBhdWRpbyBzdHJlYW0uIFJlZmVyIHRvCisgKiB0aGUgcnRwTDE2cGF5IGV4YW1wbGUgdG8gY3JlYXRlIHRoZSBSVFAgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSAiZ3N0cnRwTDE2ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBjaGFubmVscy5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cEwxNmRlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBMMTZkZXBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfTDE2X2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIFMxNkJFLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIgImNoYW5uZWxzID0gKGludCkgWyAxLCBNQVggXSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfTDE2X2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIiAiY2xvY2stcmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIKKyAgICAgICAgLyogImNoYW5uZWxzID0gKGludCkgWzEsIE1BWF0iICAqLworICAgICAgICAvKiAiZW1waGFzaXMgPSAoc3RyaW5nKSBBTlkiICovCisgICAgICAgIC8qICJjaGFubmVsLW9yZGVyID0gKHN0cmluZykgQU5ZIiAqLworICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTDE2XCI7IgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgeyAiIEdTVF9SVFBfUEFZTE9BRF9MMTZfU1RFUkVPX1NUUklORyAiLCAiCisgICAgICAgIEdTVF9SVFBfUEFZTE9BRF9MMTZfTU9OT19TVFJJTkcgIiB9LCIgImNsb2NrLXJhdGUgPSAoaW50KSBbIDEsIE1BWCBdIgorICAgICAgICAvKiAiY2hhbm5lbHMgPSAoaW50KSBbMSwgTUFYXSIgKi8KKyAgICAgICAgLyogImVtcGhhc2lzID0gKHN0cmluZykgQU5ZIiAqLworICAgICAgICAvKiAiY2hhbm5lbC1vcmRlciA9IChzdHJpbmcpIEFOWSIgKi8KKyAgICApCisgICAgKTsKKworI2RlZmluZSBnc3RfcnRwX0wxNl9kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBMMTZEZXBheSwgZ3N0X3J0cF9MMTZfZGVwYXksIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX0wxNl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfTDE2X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfTDE2X2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEwxNkRlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9MMTZfZGVwYXlfc2V0Y2FwczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+cHJvY2Vzc19ydHBfcGFja2V0ID0gZ3N0X3J0cF9MMTZfZGVwYXlfcHJvY2VzczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX0wxNl9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX0wxNl9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBhdWRpbyBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgcmF3IGF1ZGlvIGZyb20gUlRQIHBhY2tldHMiLAorICAgICAgIlplZXNoYW4gQWxpIDx6YWsxNDdAeWFob28uY29tPiwiICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBMMTZkZXBheV9kZWJ1ZywgInJ0cEwxNmRlcGF5IiwgMCwKKyAgICAgICJSYXcgQXVkaW8gUlRQIERlcGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX0wxNl9kZXBheV9pbml0IChHc3RSdHBMMTZEZXBheSAqIHJ0cEwxNmRlcGF5KQoreworfQorCitzdGF0aWMgZ2ludAorZ3N0X3J0cF9MMTZfZGVwYXlfcGFyc2VfaW50IChHc3RTdHJ1Y3R1cmUgKiBzdHJ1Y3R1cmUsIGNvbnN0IGdjaGFyICogZmllbGQsCisgICAgZ2ludCBkZWYpCit7CisgIGNvbnN0IGdjaGFyICpzdHI7CisgIGdpbnQgcmVzOworCisgIGlmICgoc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsIGZpZWxkKSkpCisgICAgcmV0dXJuIGF0b2kgKHN0cik7CisKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCBmaWVsZCwgJnJlcykpCisgICAgcmV0dXJuIHJlczsKKworICByZXR1cm4gZGVmOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfTDE2X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgR3N0UnRwTDE2RGVwYXkgKnJ0cEwxNmRlcGF5OworICBnaW50IGNsb2NrX3JhdGUsIHBheWxvYWQ7CisgIGdpbnQgY2hhbm5lbHM7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIGdib29sZWFuIHJlczsKKyAgY29uc3QgZ2NoYXIgKmNoYW5uZWxfb3JkZXI7CisgIGNvbnN0IEdzdFJUUENoYW5uZWxPcmRlciAqb3JkZXI7CisgIEdzdEF1ZGlvSW5mbyAqaW5mbzsKKworICBydHBMMTZkZXBheSA9IEdTVF9SVFBfTDE2X0RFUEFZIChkZXBheWxvYWQpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIHBheWxvYWQgPSA5NjsKKyAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJwYXlsb2FkIiwgJnBheWxvYWQpOworICBzd2l0Y2ggKHBheWxvYWQpIHsKKyAgICBjYXNlIEdTVF9SVFBfUEFZTE9BRF9MMTZfU1RFUkVPOgorICAgICAgY2hhbm5lbHMgPSAyOworICAgICAgY2xvY2tfcmF0ZSA9IDQ0MTAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUlRQX1BBWUxPQURfTDE2X01PTk86CisgICAgICBjaGFubmVscyA9IDE7CisgICAgICBjbG9ja19yYXRlID0gNDQxMDA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogbm8gZml4ZWQgbWFwcGluZywgd2UgbmVlZCBjbG9jay1yYXRlICovCisgICAgICBjaGFubmVscyA9IDA7CisgICAgICBjbG9ja19yYXRlID0gMDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogY2FwcyBjYW4gb3ZlcndyaXRlIGRlZmF1bHRzICovCisgIGNsb2NrX3JhdGUgPQorICAgICAgZ3N0X3J0cF9MMTZfZGVwYXlfcGFyc2VfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgY2xvY2tfcmF0ZSk7CisgIGlmIChjbG9ja19yYXRlID09IDApCisgICAgZ290byBub19jbG9ja3JhdGU7CisKKyAgY2hhbm5lbHMgPQorICAgICAgZ3N0X3J0cF9MMTZfZGVwYXlfcGFyc2VfaW50IChzdHJ1Y3R1cmUsICJlbmNvZGluZy1wYXJhbXMiLCBjaGFubmVscyk7CisgIGlmIChjaGFubmVscyA9PSAwKSB7CisgICAgY2hhbm5lbHMgPSBnc3RfcnRwX0wxNl9kZXBheV9wYXJzZV9pbnQgKHN0cnVjdHVyZSwgImNoYW5uZWxzIiwgY2hhbm5lbHMpOworICAgIGlmIChjaGFubmVscyA9PSAwKSB7CisgICAgICAvKiBjaGFubmVscyBkZWZhdWx0cyB0byAxIG90aGVyd2lzZSAqLworICAgICAgY2hhbm5lbHMgPSAxOworICAgIH0KKyAgfQorCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgaW5mbyA9ICZydHBMMTZkZXBheS0+aW5mbzsKKyAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoaW5mbyk7CisgIGluZm8tPmZpbmZvID0gZ3N0X2F1ZGlvX2Zvcm1hdF9nZXRfaW5mbyAoR1NUX0FVRElPX0ZPUk1BVF9TMTZCRSk7CisgIGluZm8tPnJhdGUgPSBjbG9ja19yYXRlOworICBpbmZvLT5jaGFubmVscyA9IGNoYW5uZWxzOworICBpbmZvLT5icGYgPSAoaW5mby0+ZmluZm8tPndpZHRoIC8gOCkgKiBjaGFubmVsczsKKworICAvKiBhZGQgY2hhbm5lbCBwb3NpdGlvbnMgKi8KKyAgY2hhbm5lbF9vcmRlciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiY2hhbm5lbC1vcmRlciIpOworCisgIG9yZGVyID0gZ3N0X3J0cF9jaGFubmVsc19nZXRfYnlfb3JkZXIgKGNoYW5uZWxzLCBjaGFubmVsX29yZGVyKTsKKyAgcnRwTDE2ZGVwYXktPm9yZGVyID0gb3JkZXI7CisgIGlmIChvcmRlcikgeworICAgIG1lbWNweSAoaW5mby0+cG9zaXRpb24sIG9yZGVyLT5wb3MsCisgICAgICAgIHNpemVvZiAoR3N0QXVkaW9DaGFubmVsUG9zaXRpb24pICogY2hhbm5lbHMpOworICAgIGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uc190b192YWxpZF9vcmRlciAoaW5mby0+cG9zaXRpb24sIGluZm8tPmNoYW5uZWxzKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBMMTZkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJVbmtub3duIGNoYW5uZWwgb3JkZXIgJyVzJyBmb3IgJWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgR1NUX1NUUl9OVUxMIChjaGFubmVsX29yZGVyKSwgY2hhbm5lbHMpKTsKKyAgICAvKiBjcmVhdGUgZGVmYXVsdCBOT05FIGxheW91dCAqLworICAgIGdzdF9ydHBfY2hhbm5lbHNfY3JlYXRlX2RlZmF1bHQgKGNoYW5uZWxzLCBpbmZvLT5wb3NpdGlvbik7CisgIH0KKworICBzcmNjYXBzID0gZ3N0X2F1ZGlvX2luZm9fdG9fY2FwcyAoaW5mbyk7CisgIHJlcyA9IGdzdF9wYWRfc2V0X2NhcHMgKGRlcGF5bG9hZC0+c3JjcGFkLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitub19jbG9ja3JhdGU6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkZXBheWxvYWQsICJubyBjbG9jay1yYXRlIHNwZWNpZmllZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfTDE2X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0UnRwTDE2RGVwYXkgKnJ0cEwxNmRlcGF5OworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ2ludCBwYXlsb2FkX2xlbjsKKyAgZ2Jvb2xlYW4gbWFya2VyOworCisgIHJ0cEwxNmRlcGF5ID0gR1NUX1JUUF9MMTZfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisKKyAgaWYgKHBheWxvYWRfbGVuIDw9IDApCisgICAgZ290byBlbXB0eV9wYWNrZXQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwTDE2ZGVwYXksICJnb3QgcGF5bG9hZCBvZiAlZCBieXRlcyIsIHBheWxvYWRfbGVuKTsKKworICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9idWZmZXIgKHJ0cCk7CisgIG1hcmtlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCk7CisKKyAgaWYgKG1hcmtlcikgeworICAgIC8qIG1hcmsgdGFsayBzcHVydCB3aXRoIFJFU1lOQyAqLworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX1JFU1lOQyk7CisgIH0KKworICBvdXRidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKG91dGJ1Zik7CisgIGlmIChydHBMMTZkZXBheS0+b3JkZXIgJiYKKyAgICAgICFnc3RfYXVkaW9fYnVmZmVyX3Jlb3JkZXJfY2hhbm5lbHMgKG91dGJ1ZiwKKyAgICAgICAgICBydHBMMTZkZXBheS0+aW5mby5maW5mby0+Zm9ybWF0LCBydHBMMTZkZXBheS0+aW5mby5jaGFubmVscywKKyAgICAgICAgICBydHBMMTZkZXBheS0+aW5mby5wb3NpdGlvbiwgcnRwTDE2ZGVwYXktPm9yZGVyLT5wb3MpKSB7CisgICAgZ290byByZW9yZGVyX2ZhaWxlZDsKKyAgfQorCisgIGdzdF9ydHBfZHJvcF9ub25fYXVkaW9fbWV0YSAocnRwTDE2ZGVwYXksIG91dGJ1Zik7CisKKyAgcmV0dXJuIG91dGJ1ZjsKKworICAvKiBFUlJPUlMgKi8KK2VtcHR5X3BhY2tldDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cEwxNmRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJFbXB0eSBQYXlsb2FkLiIpLCAoTlVMTCkpOworICAgIHJldHVybiBOVUxMOworICB9CityZW9yZGVyX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChydHBMMTZkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgICgiQ2hhbm5lbCByZW9yZGVyaW5nIGZhaWxlZC4iKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3J0cF9MMTZfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBMMTZkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9MMTZfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNWQ0Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cEwxNmRlcGF5LmgKQEAgLTAsMCArMSw2NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0wxNl9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0wxNl9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgImdzdHJ0cGNoYW5uZWxzLmgiCisKK0dfQkVHSU5fREVDTFMKKworLyogU3RhbmRhcmQgbWFjcm9zIGZvciBkZWZpbmluZyB0eXBlcyBmb3IgdGhpcyBlbGVtZW50LiAgKi8KKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0wxNl9ERVBBWSBcCisgIChnc3RfcnRwX0wxNl9kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0wxNl9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9MMTZfREVQQVksR3N0UnRwTDE2RGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX0wxNl9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTDE2X0RFUEFZLEdzdFJ0cEwxNkRlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0wxNl9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9MMTZfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0wxNl9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTDE2X0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEwxNkRlcGF5IEdzdFJ0cEwxNkRlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEwxNkRlcGF5Q2xhc3MgR3N0UnRwTDE2RGVwYXlDbGFzczsKKworLyogRGVmaW5pdGlvbiBvZiBzdHJ1Y3R1cmUgc3RvcmluZyBkYXRhIGZvciB0aGlzIGVsZW1lbnQuICovCitzdHJ1Y3QgX0dzdFJ0cEwxNkRlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworCisgIEdzdEF1ZGlvSW5mbyBpbmZvOworICBjb25zdCBHc3RSVFBDaGFubmVsT3JkZXIgKm9yZGVyOworfTsKKworLyogU3RhbmRhcmQgZGVmaW5pdGlvbiBkZWZpbmluZyBhIGNsYXNzIGZvciB0aGlzIGVsZW1lbnQuICovCitzdHJ1Y3QgX0dzdFJ0cEwxNkRlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfTDE2X2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9MMTZfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfTDE2X0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBMMTZwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwTDE2cGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc4M2E2NQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwTDE2cGF5LmMKQEAgLTAsMCArMSwyNjMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1ydHBMMTZwYXkKKyAqIEBzZWVfYWxzbzogcnRwTDE2ZGVwYXkKKyAqCisgKiBQYXlsb2FkIHJhdyBhdWRpbyBpbnRvIFJUUCBwYWNrZXRzIGFjY29yZGluZyB0byBSRkMgMzU1MS4KKyAqIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBzZWU6IGh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzM1NTEudHh0CisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyAhIGF1ZGlvY29udmVydCAhIHJ0cEwxNnBheSAhIHVkcHNpbmsKKyAqIF18IFRoaXMgZXhhbXBsZSBwaXBlbGluZSB3aWxsIHBheWxvYWQgcmF3IGF1ZGlvLiBSZWZlciB0bworICogdGhlIHJ0cEwxNmRlcGF5IGV4YW1wbGUgdG8gZGVwYXlsb2FkIGFuZCBwbGF5IHRoZSBSVFAgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworI2luY2x1ZGUgImdzdHJ0cEwxNnBheS5oIgorI2luY2x1ZGUgImdzdHJ0cGNoYW5uZWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cEwxNnBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwTDE2cGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9MMTZfcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIFMxNkJFLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIgImNoYW5uZWxzID0gKGludCkgWyAxLCBNQVggXSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfTDE2X3BheV9zcmNfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSBbIDk2LCAxMjcgXSwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkwxNlwiLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIFsgMSwgTUFYIF07IgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJMMTZcIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0wxNl9TVEVSRU9fU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA0NDEwMDsiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkwxNlwiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfTDE2X01PTk9fU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA0NDEwMCIpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfTDE2X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfcnRwX0wxNl9wYXlfZ2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBydHBwYXlsb2FkLAorICAgIEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGZpbHRlcik7CitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9MMTZfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKKworI2RlZmluZSBnc3RfcnRwX0wxNl9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwTDE2UGF5LCBnc3RfcnRwX0wxNl9wYXksIEdTVF9UWVBFX1JUUF9CQVNFX0FVRElPX1BBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9MMTZfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEwxNlBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9MMTZfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5nZXRfY2FwcyA9IGdzdF9ydHBfTDE2X3BheV9nZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2J1ZmZlciA9IGdzdF9ydHBfTDE2X3BheV9oYW5kbGVfYnVmZmVyOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfTDE2X3BheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX0wxNl9wYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgYXVkaW8gcGF5bG9hZGVyIiwgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZC1lbmNvZGUgUmF3IGF1ZGlvIGludG8gUlRQIHBhY2tldHMgKFJGQyAzNTUxKSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwTDE2cGF5X2RlYnVnLCAicnRwTDE2cGF5IiwgMCwKKyAgICAgICJMMTYgUlRQIFBheWxvYWRlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9MMTZfcGF5X2luaXQgKEdzdFJ0cEwxNlBheSAqIHJ0cEwxNnBheSkKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZCAqcnRwYmFzZWF1ZGlvcGF5bG9hZDsKKworICBydHBiYXNlYXVkaW9wYXlsb2FkID0gR1NUX1JUUF9CQVNFX0FVRElPX1BBWUxPQUQgKHJ0cEwxNnBheSk7CisKKyAgLyogdGVsbCBydHBiYXNlYXVkaW9wYXlsb2FkIHRoYXQgdGhpcyBpcyBhIHNhbXBsZSBiYXNlZCBjb2RlYyAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfc2FtcGxlX2Jhc2VkIChydHBiYXNlYXVkaW9wYXlsb2FkKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX0wxNl9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFJ0cEwxNlBheSAqcnRwTDE2cGF5OworICBnYm9vbGVhbiByZXM7CisgIGdjaGFyICpwYXJhbXM7CisgIEdzdEF1ZGlvSW5mbyAqaW5mbzsKKyAgY29uc3QgR3N0UlRQQ2hhbm5lbE9yZGVyICpvcmRlcjsKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZCAqcnRwYmFzZWF1ZGlvcGF5bG9hZDsKKworICBydHBiYXNlYXVkaW9wYXlsb2FkID0gR1NUX1JUUF9CQVNFX0FVRElPX1BBWUxPQUQgKGJhc2VwYXlsb2FkKTsKKyAgcnRwTDE2cGF5ID0gR1NUX1JUUF9MMTZfUEFZIChiYXNlcGF5bG9hZCk7CisKKyAgaW5mbyA9ICZydHBMMTZwYXktPmluZm87CisgIGdzdF9hdWRpb19pbmZvX2luaXQgKGluZm8pOworICBpZiAoIWdzdF9hdWRpb19pbmZvX2Zyb21fY2FwcyAoaW5mbywgY2FwcykpCisgICAgZ290byBpbnZhbGlkX2NhcHM7CisKKyAgb3JkZXIgPSBnc3RfcnRwX2NoYW5uZWxzX2dldF9ieV9wb3MgKGluZm8tPmNoYW5uZWxzLCBpbmZvLT5wb3NpdGlvbik7CisgIHJ0cEwxNnBheS0+b3JkZXIgPSBvcmRlcjsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAoYmFzZXBheWxvYWQsICJhdWRpbyIsIFRSVUUsICJMMTYiLAorICAgICAgaW5mby0+cmF0ZSk7CisgIHBhcmFtcyA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgaW5mby0+Y2hhbm5lbHMpOworCisgIGlmICghb3JkZXIgJiYgaW5mby0+Y2hhbm5lbHMgPiAyKSB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwTDE2cGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIlVua25vd24gY2hhbm5lbCBvcmRlciBmb3IgJWQgY2hhbm5lbHMiLCBpbmZvLT5jaGFubmVscykpOworICB9CisKKyAgaWYgKG9yZGVyICYmIG9yZGVyLT5uYW1lKSB7CisgICAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLAorICAgICAgICAiZW5jb2RpbmctcGFyYW1zIiwgR19UWVBFX1NUUklORywgcGFyYW1zLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULAorICAgICAgICBpbmZvLT5jaGFubmVscywgImNoYW5uZWwtb3JkZXIiLCBHX1RZUEVfU1RSSU5HLCBvcmRlci0+bmFtZSwgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLAorICAgICAgICAiZW5jb2RpbmctcGFyYW1zIiwgR19UWVBFX1NUUklORywgcGFyYW1zLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULAorICAgICAgICBpbmZvLT5jaGFubmVscywgTlVMTCk7CisgIH0KKworICBnX2ZyZWUgKHBhcmFtcyk7CisKKyAgLyogb2N0ZXQtcGVyLXNhbXBsZSBpcyAyICogY2hhbm5lbHMgZm9yIEwxNiAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfc2FtcGxlX29wdGlvbnMgKHJ0cGJhc2VhdWRpb3BheWxvYWQsCisgICAgICAyICogaW5mby0+Y2hhbm5lbHMpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX2NhcHM6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBMMTZwYXksICJpbnZhbGlkIGNhcHMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3J0cF9MMTZfcGF5X2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcnRwcGF5bG9hZCwgR3N0UGFkICogcGFkLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKm90aGVycGFkY2FwczsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHBhZCk7CisKKyAgb3RoZXJwYWRjYXBzID0gZ3N0X3BhZF9nZXRfYWxsb3dlZF9jYXBzIChydHBwYXlsb2FkLT5zcmNwYWQpOworICBpZiAob3RoZXJwYWRjYXBzKSB7CisgICAgaWYgKCFnc3RfY2Fwc19pc19lbXB0eSAob3RoZXJwYWRjYXBzKSkgeworICAgICAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgICAgICBnaW50IGNoYW5uZWxzOworICAgICAgZ2ludCBwdDsKKyAgICAgIGdpbnQgcmF0ZTsKKworICAgICAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAob3RoZXJwYWRjYXBzLCAwKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChjYXBzKTsKKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2hhbm5lbHMiLCAmY2hhbm5lbHMpKSB7CisgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIGNoYW5uZWxzLCBOVUxMKTsKKyAgICAgIH0gZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJwYXlsb2FkIiwgJnB0KSkgeworICAgICAgICBpZiAocHQgPT0gR1NUX1JUUF9QQVlMT0FEX0wxNl9TVEVSRU8pCisgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMiwgTlVMTCk7CisgICAgICAgIGVsc2UgaWYgKHB0ID09IEdTVF9SVFBfUEFZTE9BRF9MMTZfTU9OTykKKyAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgICAgIH0KKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZyYXRlKSkgeworICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAicmF0ZSIsIEdfVFlQRV9JTlQsIHJhdGUsIE5VTEwpOworICAgICAgfSBlbHNlIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgInBheWxvYWQiLCAmcHQpKSB7CisgICAgICAgIGlmIChwdCA9PSBHU1RfUlRQX1BBWUxPQURfTDE2X1NURVJFTyB8fCBwdCA9PSBHU1RfUlRQX1BBWUxPQURfTDE2X01PTk8pCisgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgInJhdGUiLCBHX1RZUEVfSU5ULCA0NDEwMCwgTlVMTCk7CisgICAgICB9CisKKyAgICB9CisgICAgZ3N0X2NhcHNfdW5yZWYgKG90aGVycGFkY2Fwcyk7CisgIH0KKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqdGNhcHMgPSBjYXBzOworCisgICAgY2FwcyA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHRjYXBzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmICh0Y2Fwcyk7CisgIH0KKworICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfTDE2X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UnRwTDE2UGF5ICpydHBMMTZwYXk7CisKKyAgcnRwTDE2cGF5ID0gR1NUX1JUUF9MMTZfUEFZIChiYXNlcGF5bG9hZCk7CisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoYnVmZmVyKTsKKworICBpZiAocnRwTDE2cGF5LT5vcmRlciAmJgorICAgICAgIWdzdF9hdWRpb19idWZmZXJfcmVvcmRlcl9jaGFubmVscyAoYnVmZmVyLCBydHBMMTZwYXktPmluZm8uZmluZm8tPmZvcm1hdCwKKyAgICAgICAgICBydHBMMTZwYXktPmluZm8uY2hhbm5lbHMsIHJ0cEwxNnBheS0+aW5mby5wb3NpdGlvbiwKKyAgICAgICAgICBydHBMMTZwYXktPm9yZGVyLT5wb3MpKSB7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgcmV0dXJuIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5oYW5kbGVfYnVmZmVyIChiYXNlcGF5bG9hZCwKKyAgICAgIGJ1ZmZlcik7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX0wxNl9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBMMTZwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfTDE2X1BBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cEwxNnBheS5oIGIvZ3N0L3J0cC9nc3RydHBMMTZwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGYzNzAyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBMMTZwYXkuaApAQCAtMCwwICsxLDYzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfTDE2X1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0wxNl9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlYXVkaW9wYXlsb2FkLmg+CisKKyNpbmNsdWRlICJnc3RydHBjaGFubmVscy5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0wxNl9QQVkgXAorICAoZ3N0X3J0cF9MMTZfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfTDE2X1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9MMTZfUEFZLEdzdFJ0cEwxNlBheSkpCisjZGVmaW5lIEdTVF9SVFBfTDE2X1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTDE2X1BBWSxHc3RSdHBMMTZQYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfTDE2X1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9MMTZfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9MMTZfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9MMTZfUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEwxNlBheSBHc3RSdHBMMTZQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTDE2UGF5Q2xhc3MgR3N0UnRwTDE2UGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwTDE2UGF5Cit7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgcGF5bG9hZDsKKworICBHc3RBdWRpb0luZm8gaW5mbzsKKyAgY29uc3QgR3N0UlRQQ2hhbm5lbE9yZGVyICpvcmRlcjsKK307CisKK3N0cnVjdCBfR3N0UnRwTDE2UGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfTDE2X3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfTDE2X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9MMTZfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBMMjRkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBMMjRkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMjhlZTgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cEwyNGRlcGF5LmMKQEAgLTAsMCArMSwyNjQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1ydHBMMjRkZXBheQorICogQHNlZV9hbHNvOiBydHBMMjRwYXkKKyAqCisgKiBFeHRyYWN0IHJhdyBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIGFjY29yZGluZyB0byBSRkMgMzE5MCwgc2VjdGlvbiA0LgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMzE5MC50eHQKKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdWRwc3JjIGNhcHM9J2FwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpNDQxMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylMMjQsIGVuY29kaW5nLXBhcmFtcz0oc3RyaW5nKTEsIGNoYW5uZWxzPShpbnQpMSwgcGF5bG9hZD0oaW50KTk2JyAhIHJ0cEwyNGRlcGF5ICEgcHVsc2VzaW5rCisgKiBdfCBUaGlzIGV4YW1wbGUgcGlwZWxpbmUgd2lsbCBkZXBheWxvYWQgYW4gUlRQIHJhdyBhdWRpbyBzdHJlYW0uIFJlZmVyIHRvCisgKiB0aGUgcnRwTDI0cGF5IGV4YW1wbGUgdG8gY3JlYXRlIHRoZSBSVFAgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSAiZ3N0cnRwTDI0ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBjaGFubmVscy5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cEwyNGRlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBMMjRkZXBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfTDI0X2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIFMyNEJFLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIgImNoYW5uZWxzID0gKGludCkgWyAxLCBNQVggXSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfTDI0X2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiICJjbG9jay1yYXRlID0gKGludCkgWyAxLCBNQVggXSwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTDI0XCIiKQorICAgICk7CisKKyNkZWZpbmUgZ3N0X3J0cF9MMjRfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwTDI0RGVwYXksIGdzdF9ydHBfTDI0X2RlcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9MMjRfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX0wyNF9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX0wyNF9kZXBheV9jbGFzc19pbml0IChHc3RSdHBMMjREZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfTDI0X2RlcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfTDI0X2RlcGF5X3Byb2Nlc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9MMjRfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9MMjRfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgYXVkaW8gZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIHJhdyAyNC1iaXQgYXVkaW8gZnJvbSBSVFAgcGFja2V0cyIsCisgICAgICAiWmVlc2hhbiBBbGkgPHphazE0N0B5YWhvby5jb20+LCIgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+LCIKKyAgICAgICJEYXZpZCBIb2xyb3lkIDxkYXZlQGJhZGdlcnMtaW4tZm9pbC5jby51az4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwTDI0ZGVwYXlfZGVidWcsICJydHBMMjRkZXBheSIsIDAsCisgICAgICAiUmF3IEF1ZGlvIFJUUCBEZXBheWxvYWRlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9MMjRfZGVwYXlfaW5pdCAoR3N0UnRwTDI0RGVwYXkgKiBydHBMMjRkZXBheSkKK3sKK30KKworc3RhdGljIGdpbnQKK2dzdF9ydHBfTDI0X2RlcGF5X3BhcnNlX2ludCAoR3N0U3RydWN0dXJlICogc3RydWN0dXJlLCBjb25zdCBnY2hhciAqIGZpZWxkLAorICAgIGdpbnQgZGVmKQoreworICBjb25zdCBnY2hhciAqc3RyOworICBnaW50IHJlczsKKworICBpZiAoKHN0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCBmaWVsZCkpKQorICAgIHJldHVybiBhdG9pIChzdHIpOworCisgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgZmllbGQsICZyZXMpKQorICAgIHJldHVybiByZXM7CisKKyAgcmV0dXJuIGRlZjsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX0wyNF9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdFJ0cEwyNERlcGF5ICpydHBMMjRkZXBheTsKKyAgZ2ludCBjbG9ja19yYXRlLCBwYXlsb2FkOworICBnaW50IGNoYW5uZWxzOworICBHc3RDYXBzICpzcmNjYXBzOworICBnYm9vbGVhbiByZXM7CisgIGNvbnN0IGdjaGFyICpjaGFubmVsX29yZGVyOworICBjb25zdCBHc3RSVFBDaGFubmVsT3JkZXIgKm9yZGVyOworICBHc3RBdWRpb0luZm8gKmluZm87CisKKyAgcnRwTDI0ZGVwYXkgPSBHU1RfUlRQX0wyNF9ERVBBWSAoZGVwYXlsb2FkKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBwYXlsb2FkID0gOTY7CisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAicGF5bG9hZCIsICZwYXlsb2FkKTsKKyAgLyogbm8gZml4ZWQgbWFwcGluZywgd2UgbmVlZCBjbG9jay1yYXRlICovCisgIGNoYW5uZWxzID0gMDsKKyAgY2xvY2tfcmF0ZSA9IDA7CisKKyAgLyogY2FwcyBjYW4gb3ZlcndyaXRlIGRlZmF1bHRzICovCisgIGNsb2NrX3JhdGUgPQorICAgICAgZ3N0X3J0cF9MMjRfZGVwYXlfcGFyc2VfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgY2xvY2tfcmF0ZSk7CisgIGlmIChjbG9ja19yYXRlID09IDApCisgICAgZ290byBub19jbG9ja3JhdGU7CisKKyAgY2hhbm5lbHMgPQorICAgICAgZ3N0X3J0cF9MMjRfZGVwYXlfcGFyc2VfaW50IChzdHJ1Y3R1cmUsICJlbmNvZGluZy1wYXJhbXMiLCBjaGFubmVscyk7CisgIGlmIChjaGFubmVscyA9PSAwKSB7CisgICAgY2hhbm5lbHMgPSBnc3RfcnRwX0wyNF9kZXBheV9wYXJzZV9pbnQgKHN0cnVjdHVyZSwgImNoYW5uZWxzIiwgY2hhbm5lbHMpOworICAgIGlmIChjaGFubmVscyA9PSAwKSB7CisgICAgICAvKiBjaGFubmVscyBkZWZhdWx0cyB0byAxIG90aGVyd2lzZSAqLworICAgICAgY2hhbm5lbHMgPSAxOworICAgIH0KKyAgfQorCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgaW5mbyA9ICZydHBMMjRkZXBheS0+aW5mbzsKKyAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoaW5mbyk7CisgIGluZm8tPmZpbmZvID0gZ3N0X2F1ZGlvX2Zvcm1hdF9nZXRfaW5mbyAoR1NUX0FVRElPX0ZPUk1BVF9TMjRCRSk7CisgIGluZm8tPnJhdGUgPSBjbG9ja19yYXRlOworICBpbmZvLT5jaGFubmVscyA9IGNoYW5uZWxzOworICBpbmZvLT5icGYgPSAoaW5mby0+ZmluZm8tPndpZHRoIC8gOCkgKiBjaGFubmVsczsKKworICAvKiBhZGQgY2hhbm5lbCBwb3NpdGlvbnMgKi8KKyAgY2hhbm5lbF9vcmRlciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiY2hhbm5lbC1vcmRlciIpOworCisgIG9yZGVyID0gZ3N0X3J0cF9jaGFubmVsc19nZXRfYnlfb3JkZXIgKGNoYW5uZWxzLCBjaGFubmVsX29yZGVyKTsKKyAgcnRwTDI0ZGVwYXktPm9yZGVyID0gb3JkZXI7CisgIGlmIChvcmRlcikgeworICAgIG1lbWNweSAoaW5mby0+cG9zaXRpb24sIG9yZGVyLT5wb3MsCisgICAgICAgIHNpemVvZiAoR3N0QXVkaW9DaGFubmVsUG9zaXRpb24pICogY2hhbm5lbHMpOworICAgIGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uc190b192YWxpZF9vcmRlciAoaW5mby0+cG9zaXRpb24sIGluZm8tPmNoYW5uZWxzKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBMMjRkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJVbmtub3duIGNoYW5uZWwgb3JkZXIgJyVzJyBmb3IgJWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgR1NUX1NUUl9OVUxMIChjaGFubmVsX29yZGVyKSwgY2hhbm5lbHMpKTsKKyAgICAvKiBjcmVhdGUgZGVmYXVsdCBOT05FIGxheW91dCAqLworICAgIGdzdF9ydHBfY2hhbm5lbHNfY3JlYXRlX2RlZmF1bHQgKGNoYW5uZWxzLCBpbmZvLT5wb3NpdGlvbik7CisgIH0KKworICBzcmNjYXBzID0gZ3N0X2F1ZGlvX2luZm9fdG9fY2FwcyAoaW5mbyk7CisgIHJlcyA9IGdzdF9wYWRfc2V0X2NhcHMgKGRlcGF5bG9hZC0+c3JjcGFkLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitub19jbG9ja3JhdGU6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkZXBheWxvYWQsICJubyBjbG9jay1yYXRlIHNwZWNpZmllZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfTDI0X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0UnRwTDI0RGVwYXkgKnJ0cEwyNGRlcGF5OworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ2ludCBwYXlsb2FkX2xlbjsKKyAgZ2Jvb2xlYW4gbWFya2VyOworCisgIHJ0cEwyNGRlcGF5ID0gR1NUX1JUUF9MMjRfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisKKyAgaWYgKHBheWxvYWRfbGVuIDw9IDApCisgICAgZ290byBlbXB0eV9wYWNrZXQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwTDI0ZGVwYXksICJnb3QgcGF5bG9hZCBvZiAlZCBieXRlcyIsIHBheWxvYWRfbGVuKTsKKworICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9idWZmZXIgKHJ0cCk7CisgIG1hcmtlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCk7CisKKyAgaWYgKG1hcmtlcikgeworICAgIC8qIG1hcmsgdGFsayBzcHVydCB3aXRoIFJFU1lOQyAqLworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX1JFU1lOQyk7CisgIH0KKworICBvdXRidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKG91dGJ1Zik7CisgIGlmIChvdXRidWYpIHsKKyAgICBnc3RfcnRwX2Ryb3Bfbm9uX2F1ZGlvX21ldGEgKHJ0cEwyNGRlcGF5LCBvdXRidWYpOworICB9CisgIGlmIChydHBMMjRkZXBheS0+b3JkZXIgJiYKKyAgICAgICFnc3RfYXVkaW9fYnVmZmVyX3Jlb3JkZXJfY2hhbm5lbHMgKG91dGJ1ZiwKKyAgICAgICAgICBydHBMMjRkZXBheS0+aW5mby5maW5mby0+Zm9ybWF0LCBydHBMMjRkZXBheS0+aW5mby5jaGFubmVscywKKyAgICAgICAgICBydHBMMjRkZXBheS0+aW5mby5wb3NpdGlvbiwgcnRwTDI0ZGVwYXktPm9yZGVyLT5wb3MpKSB7CisgICAgZ290byByZW9yZGVyX2ZhaWxlZDsKKyAgfQorCisgIHJldHVybiBvdXRidWY7CisKKyAgLyogRVJST1JTICovCitlbXB0eV9wYWNrZXQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBMMjRkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgICgiRW1wdHkgUGF5bG9hZC4iKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorcmVvcmRlcl9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocnRwTDI0ZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIkNoYW5uZWwgcmVvcmRlcmluZyBmYWlsZWQuIiksIChOVUxMKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfTDI0X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwTDI0ZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfTDI0X0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwTDI0ZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwTDI0ZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGUwMGU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBMMjRkZXBheS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9MMjRfREVQQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9MMjRfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJnc3RydHBjaGFubmVscy5oIgorCitHX0JFR0lOX0RFQ0xTCisKKy8qIFN0YW5kYXJkIG1hY3JvcyBmb3IgZGVmaW5pbmcgdHlwZXMgZm9yIHRoaXMgZWxlbWVudC4gICovCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9MMjRfREVQQVkgXAorICAoZ3N0X3J0cF9MMjRfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9MMjRfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfTDI0X0RFUEFZLEdzdFJ0cEwyNERlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9MMjRfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0wyNF9ERVBBWSxHc3RSdHBMMjREZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9MMjRfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfTDI0X0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9MMjRfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0wyNF9ERVBBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBMMjREZXBheSBHc3RSdHBMMjREZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBMMjREZXBheUNsYXNzIEdzdFJ0cEwyNERlcGF5Q2xhc3M7CisKKy8qIERlZmluaXRpb24gb2Ygc3RydWN0dXJlIHN0b3JpbmcgZGF0YSBmb3IgdGhpcyBlbGVtZW50LiAqLworc3RydWN0IF9Hc3RSdHBMMjREZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKKworICBHc3RBdWRpb0luZm8gaW5mbzsKKyAgY29uc3QgR3N0UlRQQ2hhbm5lbE9yZGVyICpvcmRlcjsKK307CisKKy8qIFN0YW5kYXJkIGRlZmluaXRpb24gZGVmaW5pbmcgYSBjbGFzcyBmb3IgdGhpcyBlbGVtZW50LiAqLworc3RydWN0IF9Hc3RSdHBMMjREZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX0wyNF9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfTDI0X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0wyNF9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwTDI0cGF5LmMgYi9nc3QvcnRwL2dzdHJ0cEwyNHBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNmJkNDQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cEwyNHBheS5jCkBAIC0wLDAgKzEsMjQ0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwTDI0cGF5CisgKiBAc2VlX2Fsc286IHJ0cEwyNGRlcGF5CisgKgorICogUGF5bG9hZCByYXcgMjQtYml0IGF1ZGlvIGludG8gUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQyAzMTkwLCBzZWN0aW9uIDQuCisgKiBGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gc2VlOiBodHRwOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmMzMTkwLnR4dAorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBhdWRpb3Rlc3RzcmMgISBhdWRpb2NvbnZlcnQgISBydHBMMjRwYXkgISB1ZHBzaW5rCisgKiBdfCBUaGlzIGV4YW1wbGUgcGlwZWxpbmUgd2lsbCBwYXlsb2FkIHJhdyBhdWRpby4gUmVmZXIgdG8KKyAqIHRoZSBydHBMMjRkZXBheSBleGFtcGxlIHRvIGRlcGF5bG9hZCBhbmQgcGxheSB0aGUgUlRQIHN0cmVhbS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKKyNpbmNsdWRlICJnc3RydHBMMjRwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBjaGFubmVscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBMMjRwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cEwyNHBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfTDI0X3BheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSBTMjRCRSwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgTUFYIF0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX0wyNF9wYXlfc3JjX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgWyA5NiwgMTI3IF0sICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJMMjRcIiwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIE1BWCBdOyIpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfTDI0X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfcnRwX0wyNF9wYXlfZ2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBydHBwYXlsb2FkLAorICAgIEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGZpbHRlcik7CitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9MMjRfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKKworI2RlZmluZSBnc3RfcnRwX0wyNF9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwTDI0UGF5LCBnc3RfcnRwX0wyNF9wYXksIEdTVF9UWVBFX1JUUF9CQVNFX0FVRElPX1BBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9MMjRfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEwyNFBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9MMjRfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5nZXRfY2FwcyA9IGdzdF9ydHBfTDI0X3BheV9nZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2J1ZmZlciA9IGdzdF9ydHBfTDI0X3BheV9oYW5kbGVfYnVmZmVyOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfTDI0X3BheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX0wyNF9wYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgYXVkaW8gcGF5bG9hZGVyIiwgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZC1lbmNvZGUgUmF3IDI0LWJpdCBhdWRpbyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgMzE5MCkiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+LCIKKyAgICAgICJEYXZpZCBIb2xyb3lkIDxkYXZlQGJhZGdlcnMtaW4tZm9pbC5jby51az4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwTDI0cGF5X2RlYnVnLCAicnRwTDI0cGF5IiwgMCwKKyAgICAgICJMMjQgUlRQIFBheWxvYWRlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9MMjRfcGF5X2luaXQgKEdzdFJ0cEwyNFBheSAqIHJ0cEwyNHBheSkKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZCAqcnRwYmFzZWF1ZGlvcGF5bG9hZDsKKworICBydHBiYXNlYXVkaW9wYXlsb2FkID0gR1NUX1JUUF9CQVNFX0FVRElPX1BBWUxPQUQgKHJ0cEwyNHBheSk7CisKKyAgLyogdGVsbCBydHBiYXNlYXVkaW9wYXlsb2FkIHRoYXQgdGhpcyBpcyBhIHNhbXBsZSBiYXNlZCBjb2RlYyAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfc2FtcGxlX2Jhc2VkIChydHBiYXNlYXVkaW9wYXlsb2FkKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX0wyNF9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFJ0cEwyNFBheSAqcnRwTDI0cGF5OworICBnYm9vbGVhbiByZXM7CisgIGdjaGFyICpwYXJhbXM7CisgIEdzdEF1ZGlvSW5mbyAqaW5mbzsKKyAgY29uc3QgR3N0UlRQQ2hhbm5lbE9yZGVyICpvcmRlcjsKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZCAqcnRwYmFzZWF1ZGlvcGF5bG9hZDsKKworICBydHBiYXNlYXVkaW9wYXlsb2FkID0gR1NUX1JUUF9CQVNFX0FVRElPX1BBWUxPQUQgKGJhc2VwYXlsb2FkKTsKKyAgcnRwTDI0cGF5ID0gR1NUX1JUUF9MMjRfUEFZIChiYXNlcGF5bG9hZCk7CisKKyAgaW5mbyA9ICZydHBMMjRwYXktPmluZm87CisgIGdzdF9hdWRpb19pbmZvX2luaXQgKGluZm8pOworICBpZiAoIWdzdF9hdWRpb19pbmZvX2Zyb21fY2FwcyAoaW5mbywgY2FwcykpCisgICAgZ290byBpbnZhbGlkX2NhcHM7CisKKyAgb3JkZXIgPSBnc3RfcnRwX2NoYW5uZWxzX2dldF9ieV9wb3MgKGluZm8tPmNoYW5uZWxzLCBpbmZvLT5wb3NpdGlvbik7CisgIHJ0cEwyNHBheS0+b3JkZXIgPSBvcmRlcjsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAoYmFzZXBheWxvYWQsICJhdWRpbyIsIFRSVUUsICJMMjQiLAorICAgICAgaW5mby0+cmF0ZSk7CisgIHBhcmFtcyA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgaW5mby0+Y2hhbm5lbHMpOworCisgIGlmICghb3JkZXIgJiYgaW5mby0+Y2hhbm5lbHMgPiAyKSB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwTDI0cGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIlVua25vd24gY2hhbm5lbCBvcmRlciBmb3IgJWQgY2hhbm5lbHMiLCBpbmZvLT5jaGFubmVscykpOworICB9CisKKyAgaWYgKG9yZGVyICYmIG9yZGVyLT5uYW1lKSB7CisgICAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLAorICAgICAgICAiZW5jb2RpbmctcGFyYW1zIiwgR19UWVBFX1NUUklORywgcGFyYW1zLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULAorICAgICAgICBpbmZvLT5jaGFubmVscywgImNoYW5uZWwtb3JkZXIiLCBHX1RZUEVfU1RSSU5HLCBvcmRlci0+bmFtZSwgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLAorICAgICAgICAiZW5jb2RpbmctcGFyYW1zIiwgR19UWVBFX1NUUklORywgcGFyYW1zLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULAorICAgICAgICBpbmZvLT5jaGFubmVscywgTlVMTCk7CisgIH0KKworICBnX2ZyZWUgKHBhcmFtcyk7CisKKyAgLyogb2N0ZXQtcGVyLXNhbXBsZSBpcyAzICogY2hhbm5lbHMgZm9yIEwyNCAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfc2FtcGxlX29wdGlvbnMgKHJ0cGJhc2VhdWRpb3BheWxvYWQsCisgICAgICAzICogaW5mby0+Y2hhbm5lbHMpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX2NhcHM6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBMMjRwYXksICJpbnZhbGlkIGNhcHMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3J0cF9MMjRfcGF5X2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcnRwcGF5bG9hZCwgR3N0UGFkICogcGFkLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKm90aGVycGFkY2FwczsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHBhZCk7CisKKyAgb3RoZXJwYWRjYXBzID0gZ3N0X3BhZF9nZXRfYWxsb3dlZF9jYXBzIChydHBwYXlsb2FkLT5zcmNwYWQpOworICBpZiAob3RoZXJwYWRjYXBzKSB7CisgICAgaWYgKCFnc3RfY2Fwc19pc19lbXB0eSAob3RoZXJwYWRjYXBzKSkgeworICAgICAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgICAgICBnaW50IGNoYW5uZWxzOworICAgICAgZ2ludCByYXRlOworCisgICAgICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChvdGhlcnBhZGNhcHMsIDApOworICAgICAgY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGNhcHMpOworCisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsICZjaGFubmVscykpIHsKKyAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgY2hhbm5lbHMsIE5VTEwpOworICAgICAgfQorCisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJnJhdGUpKSB7CisgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJyYXRlIiwgR19UWVBFX0lOVCwgcmF0ZSwgTlVMTCk7CisgICAgICB9CisKKyAgICB9CisgICAgZ3N0X2NhcHNfdW5yZWYgKG90aGVycGFkY2Fwcyk7CisgIH0KKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqdGNhcHMgPSBjYXBzOworCisgICAgY2FwcyA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHRjYXBzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmICh0Y2Fwcyk7CisgIH0KKworICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfTDI0X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UnRwTDI0UGF5ICpydHBMMjRwYXk7CisKKyAgcnRwTDI0cGF5ID0gR1NUX1JUUF9MMjRfUEFZIChiYXNlcGF5bG9hZCk7CisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoYnVmZmVyKTsKKworICBpZiAocnRwTDI0cGF5LT5vcmRlciAmJgorICAgICAgIWdzdF9hdWRpb19idWZmZXJfcmVvcmRlcl9jaGFubmVscyAoYnVmZmVyLCBydHBMMjRwYXktPmluZm8uZmluZm8tPmZvcm1hdCwKKyAgICAgICAgICBydHBMMjRwYXktPmluZm8uY2hhbm5lbHMsIHJ0cEwyNHBheS0+aW5mby5wb3NpdGlvbiwKKyAgICAgICAgICBydHBMMjRwYXktPm9yZGVyLT5wb3MpKSB7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgcmV0dXJuIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5oYW5kbGVfYnVmZmVyIChiYXNlcGF5bG9hZCwKKyAgICAgIGJ1ZmZlcik7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX0wyNF9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBMMjRwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfTDI0X1BBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cEwyNHBheS5oIGIvZ3N0L3J0cC9nc3RydHBMMjRwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzM5NWFkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBMMjRwYXkuaApAQCAtMCwwICsxLDYzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfTDI0X1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0wyNF9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlYXVkaW9wYXlsb2FkLmg+CisKKyNpbmNsdWRlICJnc3RydHBjaGFubmVscy5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0wyNF9QQVkgXAorICAoZ3N0X3J0cF9MMjRfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfTDI0X1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9MMjRfUEFZLEdzdFJ0cEwyNFBheSkpCisjZGVmaW5lIEdTVF9SVFBfTDI0X1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTDI0X1BBWSxHc3RSdHBMMjRQYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfTDI0X1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9MMjRfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9MMjRfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9MMjRfUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEwyNFBheSBHc3RSdHBMMjRQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTDI0UGF5Q2xhc3MgR3N0UnRwTDI0UGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwTDI0UGF5Cit7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgcGF5bG9hZDsKKworICBHc3RBdWRpb0luZm8gaW5mbzsKKyAgY29uc3QgR3N0UlRQQ2hhbm5lbE9yZGVyICpvcmRlcjsKK307CisKK3N0cnVjdCBfR3N0UnRwTDI0UGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfTDI0X3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfTDI0X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9MMjRfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBMOGRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cEw4ZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yjk1MjBhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBMOGRlcGF5LmMKQEAgLTAsMCArMSwyNjcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMTU+IEdFIEludGVsbGlnZW50IFBsYXRmb3JtcyBFbWJlZGRlZCBTeXN0ZW1zLCBJbmMuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwTDhkZXBheQorICogQHNlZV9hbHNvOiBydHBMOHBheQorICoKKyAqIEV4dHJhY3QgcmF3IGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQyAzNTUxLgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMzU1MS50eHQKKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaCB1ZHBzcmMgY2Fwcz0nYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIGNsb2NrLXJhdGU9KGludCk0NDEwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUw4LCBlbmNvZGluZy1wYXJhbXM9KHN0cmluZykxLCBjaGFubmVscz0oaW50KTEsIHBheWxvYWQ9KGludCk5NicgISBydHBMOGRlcGF5ICEgcHVsc2VzaW5rCisgKiBdfCBUaGlzIGV4YW1wbGUgcGlwZWxpbmUgd2lsbCBkZXBheWxvYWQgYW4gUlRQIHJhdyBhdWRpbyBzdHJlYW0uIFJlZmVyIHRvCisgKiB0aGUgcnRwTDhwYXkgZXhhbXBsZSB0byBjcmVhdGUgdGhlIFJUUCBzdHJlYW0uCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJnc3RydHBMOGRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwY2hhbm5lbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwTDhkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwTDhkZXBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfTDhfZGVwYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgVTgsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxLCBNQVggXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIE1BWCBdIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9MOF9kZXBheV9zaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBhdWRpbywgY2xvY2stcmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIKKyAgICAgICAgLyogImNoYW5uZWxzID0gKGludCkgWzEsIE1BWF0iICAqLworICAgICAgICAvKiAiZW1waGFzaXMgPSAoc3RyaW5nKSBBTlkiICovCisgICAgICAgIC8qICJjaGFubmVsLW9yZGVyID0gKHN0cmluZykgQU5ZIiAqLworICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIEw4OyIpCisgICAgKTsKKworI2RlZmluZSBnc3RfcnRwX0w4X2RlcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cEw4RGVwYXksIGdzdF9ydHBfTDhfZGVwYXksIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX0w4X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9MOF9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX0w4X2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEw4RGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX0w4X2RlcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3MgPSBnc3RfcnRwX0w4X2RlcGF5X3Byb2Nlc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgIGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldCAoJmdzdF9ydHBfTDhfZGVwYXlfc3JjX3RlbXBsYXRlKSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICBnc3Rfc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXQgKCZnc3RfcnRwX0w4X2RlcGF5X3NpbmtfdGVtcGxhdGUpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBhdWRpbyBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgcmF3IGF1ZGlvIGZyb20gUlRQIHBhY2tldHMiLAorICAgICAgIlplZXNoYW4gQWxpIDx6YWsxNDdAeWFob28uY29tPiwiICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiwgIgorICAgICAgIkdFIEludGVsbGlnZW50IFBsYXRmb3JtcyBFbWJlZGRlZCBTeXN0ZW1zLCBJbmMuIik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cEw4ZGVwYXlfZGVidWcsICJydHBMOGRlcGF5IiwgMCwKKyAgICAgICJSYXcgQXVkaW8gUlRQIERlcGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX0w4X2RlcGF5X2luaXQgKEdzdFJ0cEw4RGVwYXkgKiBydHBMOGRlcGF5KQoreworfQorCitzdGF0aWMgZ2ludAorZ3N0X3J0cF9MOF9kZXBheV9wYXJzZV9pbnQgKEdzdFN0cnVjdHVyZSAqIHN0cnVjdHVyZSwgY29uc3QgZ2NoYXIgKiBmaWVsZCwKKyAgICBnaW50IGRlZikKK3sKKyAgY29uc3QgZ2NoYXIgKnN0cjsKKyAgZ2ludCByZXM7CisKKyAgaWYgKChzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgZmllbGQpKSkKKyAgICByZXR1cm4gYXRvaSAoc3RyKTsKKworICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsIGZpZWxkLCAmcmVzKSkKKyAgICByZXR1cm4gcmVzOworCisgIHJldHVybiBkZWY7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9MOF9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdFJ0cEw4RGVwYXkgKnJ0cEw4ZGVwYXk7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKyAgZ2ludCBjaGFubmVsczsKKyAgR3N0Q2FwcyAqc3JjY2FwczsKKyAgZ2Jvb2xlYW4gcmVzOworICBjb25zdCBnY2hhciAqY2hhbm5lbF9vcmRlcjsKKyAgY29uc3QgR3N0UlRQQ2hhbm5lbE9yZGVyICpvcmRlcjsKKyAgR3N0QXVkaW9JbmZvICppbmZvOworCisgIHJ0cEw4ZGVwYXkgPSBHU1RfUlRQX0w4X0RFUEFZIChkZXBheWxvYWQpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIC8qIG5vIGZpeGVkIG1hcHBpbmcsIHdlIG5lZWQgY2xvY2stcmF0ZSAqLworICBjaGFubmVscyA9IDA7CisgIGNsb2NrX3JhdGUgPSAwOworCisgIC8qIGNhcHMgY2FuIG92ZXJ3cml0ZSBkZWZhdWx0cyAqLworICBjbG9ja19yYXRlID0gZ3N0X3J0cF9MOF9kZXBheV9wYXJzZV9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCBjbG9ja19yYXRlKTsKKyAgaWYgKGNsb2NrX3JhdGUgPT0gMCkKKyAgICBnb3RvIG5vX2Nsb2NrcmF0ZTsKKworICBjaGFubmVscyA9CisgICAgICBnc3RfcnRwX0w4X2RlcGF5X3BhcnNlX2ludCAoc3RydWN0dXJlLCAiZW5jb2RpbmctcGFyYW1zIiwgY2hhbm5lbHMpOworICBpZiAoY2hhbm5lbHMgPT0gMCkgeworICAgIGNoYW5uZWxzID0gZ3N0X3J0cF9MOF9kZXBheV9wYXJzZV9pbnQgKHN0cnVjdHVyZSwgImNoYW5uZWxzIiwgY2hhbm5lbHMpOworICAgIGlmIChjaGFubmVscyA9PSAwKSB7CisgICAgICAvKiBjaGFubmVscyBkZWZhdWx0cyB0byAxIG90aGVyd2lzZSAqLworICAgICAgY2hhbm5lbHMgPSAxOworICAgIH0KKyAgfQorCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgaW5mbyA9ICZydHBMOGRlcGF5LT5pbmZvOworICBnc3RfYXVkaW9faW5mb19pbml0IChpbmZvKTsKKyAgaW5mby0+ZmluZm8gPSBnc3RfYXVkaW9fZm9ybWF0X2dldF9pbmZvIChHU1RfQVVESU9fRk9STUFUX1U4KTsKKyAgaW5mby0+cmF0ZSA9IGNsb2NrX3JhdGU7CisgIGluZm8tPmNoYW5uZWxzID0gY2hhbm5lbHM7CisgIGluZm8tPmJwZiA9IChpbmZvLT5maW5mby0+d2lkdGggLyA4KSAqIGNoYW5uZWxzOworCisgIC8qIGFkZCBjaGFubmVsIHBvc2l0aW9ucyAqLworICBjaGFubmVsX29yZGVyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJjaGFubmVsLW9yZGVyIik7CisKKyAgb3JkZXIgPSBnc3RfcnRwX2NoYW5uZWxzX2dldF9ieV9vcmRlciAoY2hhbm5lbHMsIGNoYW5uZWxfb3JkZXIpOworICBydHBMOGRlcGF5LT5vcmRlciA9IG9yZGVyOworICBpZiAob3JkZXIpIHsKKyAgICBtZW1jcHkgKGluZm8tPnBvc2l0aW9uLCBvcmRlci0+cG9zLAorICAgICAgICBzaXplb2YgKEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uKSAqIGNoYW5uZWxzKTsKKyAgICBnc3RfYXVkaW9fY2hhbm5lbF9wb3NpdGlvbnNfdG9fdmFsaWRfb3JkZXIgKGluZm8tPnBvc2l0aW9uLCBpbmZvLT5jaGFubmVscyk7CisgIH0gZWxzZSB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwTDhkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJVbmtub3duIGNoYW5uZWwgb3JkZXIgJyVzJyBmb3IgJWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgR1NUX1NUUl9OVUxMIChjaGFubmVsX29yZGVyKSwgY2hhbm5lbHMpKTsKKyAgICAvKiBjcmVhdGUgZGVmYXVsdCBOT05FIGxheW91dCAqLworICAgIGdzdF9ydHBfY2hhbm5lbHNfY3JlYXRlX2RlZmF1bHQgKGNoYW5uZWxzLCBpbmZvLT5wb3NpdGlvbik7CisgIH0KKworICBzcmNjYXBzID0gZ3N0X2F1ZGlvX2luZm9fdG9fY2FwcyAoaW5mbyk7CisgIHJlcyA9IGdzdF9wYWRfc2V0X2NhcHMgKGRlcGF5bG9hZC0+c3JjcGFkLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitub19jbG9ja3JhdGU6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkZXBheWxvYWQsICJubyBjbG9jay1yYXRlIHNwZWNpZmllZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfTDhfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RSdHBMOERlcGF5ICpydHBMOGRlcGF5OworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ2ludCBwYXlsb2FkX2xlbjsKKyAgZ2Jvb2xlYW4gbWFya2VyOworICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisKKyAgcnRwTDhkZXBheSA9IEdTVF9SVFBfTDhfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgZ3N0X3J0cF9idWZmZXJfbWFwIChidWYsIEdTVF9NQVBfUkVBRCwgJnJ0cCk7CisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuICgmcnRwKTsKKworICBpZiAocGF5bG9hZF9sZW4gPD0gMCkKKyAgICBnb3RvIGVtcHR5X3BhY2tldDsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBMOGRlcGF5LCAiZ290IHBheWxvYWQgb2YgJWQgYnl0ZXMiLCBwYXlsb2FkX2xlbik7CisKKyAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfYnVmZmVyICgmcnRwKTsKKyAgbWFya2VyID0gZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAoJnJ0cCk7CisKKyAgaWYgKG1hcmtlcikgeworICAgIC8qIG1hcmsgdGFsayBzcHVydCB3aXRoIFJFU1lOQyAqLworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX1JFU1lOQyk7CisgIH0KKworICBvdXRidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKG91dGJ1Zik7CisgIGlmIChydHBMOGRlcGF5LT5vcmRlciAmJgorICAgICAgIWdzdF9hdWRpb19idWZmZXJfcmVvcmRlcl9jaGFubmVscyAob3V0YnVmLAorICAgICAgICAgIHJ0cEw4ZGVwYXktPmluZm8uZmluZm8tPmZvcm1hdCwgcnRwTDhkZXBheS0+aW5mby5jaGFubmVscywKKyAgICAgICAgICBydHBMOGRlcGF5LT5pbmZvLnBvc2l0aW9uLCBydHBMOGRlcGF5LT5vcmRlci0+cG9zKSkgeworICAgIGdvdG8gcmVvcmRlcl9mYWlsZWQ7CisgIH0KKworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgcmV0dXJuIG91dGJ1ZjsKKworICAvKiBFUlJPUlMgKi8KK2VtcHR5X3BhY2tldDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cEw4ZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIkVtcHR5IFBheWxvYWQuIiksIChOVUxMKSk7CisgICAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworICAgIHJldHVybiBOVUxMOworICB9CityZW9yZGVyX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChydHBMOGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJDaGFubmVsIHJlb3JkZXJpbmcgZmFpbGVkLiIpLCAoTlVMTCkpOworICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3J0cF9MOF9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cEw4ZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfTDhfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBMOGRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cEw4ZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmQ5YmVjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBMOGRlcGF5LmgKQEAgLTAsMCArMSw2NSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAxNT4gR0UgSW50ZWxsaWdlbnQgUGxhdGZvcm1zIEVtYmVkZGVkIFN5c3RlbXMsIEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9MOF9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0w4X0RFUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSAiZ3N0cnRwY2hhbm5lbHMuaCIKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9MOF9ERVBBWSBcCisgIChnc3RfcnRwX0w4X2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfTDhfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfTDhfREVQQVksR3N0UnRwTDhEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfTDhfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0w4X0RFUEFZLEdzdFJ0cEw4RGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfTDhfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfTDhfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0w4X0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9MOF9ERVBBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBMOERlcGF5IEdzdFJ0cEw4RGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTDhEZXBheUNsYXNzIEdzdFJ0cEw4RGVwYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBMOERlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworCisgIEdzdEF1ZGlvSW5mbyBpbmZvOworICBjb25zdCBHc3RSVFBDaGFubmVsT3JkZXIgKm9yZGVyOworfTsKKworc3RydWN0IF9Hc3RSdHBMOERlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfTDhfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX0w4X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0w4X0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBMOHBheS5jIGIvZ3N0L3J0cC9nc3RydHBMOHBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZTdiMjIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cEw4cGF5LmMKQEAgLTAsMCArMSwyNTAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMTU+IEdFIEludGVsbGlnZW50IFBsYXRmb3JtcyBFbWJlZGRlZCBTeXN0ZW1zLCBJbmMuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwTDhwYXkKKyAqIEBzZWVfYWxzbzogcnRwTDhkZXBheQorICoKKyAqIFBheWxvYWQgcmF3IGF1ZGlvIGludG8gUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQyAzNTUxLgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMzU1MS50eHQKKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaCAtdiBhdWRpb3Rlc3RzcmMgISBhdWRpb2NvbnZlcnQgISBydHBMOHBheSAhIHVkcHNpbmsKKyAqIF18IFRoaXMgZXhhbXBsZSBwaXBlbGluZSB3aWxsIHBheWxvYWQgcmF3IGF1ZGlvLiBSZWZlciB0bworICogdGhlIHJ0cEw4ZGVwYXkgZXhhbXBsZSB0byBkZXBheWxvYWQgYW5kIHBsYXkgdGhlIFJUUCBzdHJlYW0uCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCisjaW5jbHVkZSAiZ3N0cnRwTDhwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBjaGFubmVscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBMOHBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwTDhwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX0w4X3BheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSBVOCwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgTUFYIF0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX0w4X3BheV9zcmNfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBhdWRpbywgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgTDgsICIgImNoYW5uZWxzID0gKGludCkgWyAxLCBNQVggXTsiKQorICAgICk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX0w4X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfcnRwX0w4X3BheV9nZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHJ0cHBheWxvYWQsCisgICAgR3N0UGFkICogcGFkLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX0w4X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKKyNkZWZpbmUgZ3N0X3J0cF9MOF9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwTDhQYXksIGdzdF9ydHBfTDhfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9BVURJT19QQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfTDhfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEw4UGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzICpnc3RydHBiYXNlcGF5bG9hZF9jbGFzczsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX0w4X3BheV9zZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+Z2V0X2NhcHMgPSBnc3RfcnRwX0w4X3BheV9nZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2J1ZmZlciA9IGdzdF9ydHBfTDhfcGF5X2hhbmRsZV9idWZmZXI7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgIGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldCAoJmdzdF9ydHBfTDhfcGF5X3NyY190ZW1wbGF0ZSkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgZ3N0X3N0YXRpY19wYWRfdGVtcGxhdGVfZ2V0ICgmZ3N0X3J0cF9MOF9wYXlfc2lua190ZW1wbGF0ZSkpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIGF1ZGlvIHBheWxvYWRlciIsICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBheWxvYWQtZW5jb2RlIFJhdyBhdWRpbyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgMzU1MSkiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+LCAiCisgICAgICAiR0UgSW50ZWxsaWdlbnQgUGxhdGZvcm1zIEVtYmVkZGVkIFN5c3RlbXMsIEluYy4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwTDhwYXlfZGVidWcsICJydHBMOHBheSIsIDAsICJMOCBSVFAgUGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX0w4X3BheV9pbml0IChHc3RSdHBMOFBheSAqIHJ0cEw4cGF5KQoreworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkICpydHBiYXNlYXVkaW9wYXlsb2FkOworCisgIHJ0cGJhc2VhdWRpb3BheWxvYWQgPSBHU1RfUlRQX0JBU0VfQVVESU9fUEFZTE9BRCAocnRwTDhwYXkpOworCisgIC8qIHRlbGwgcnRwYmFzZWF1ZGlvcGF5bG9hZCB0aGF0IHRoaXMgaXMgYSBzYW1wbGUgYmFzZWQgY29kZWMgKi8KKyAgZ3N0X3J0cF9iYXNlX2F1ZGlvX3BheWxvYWRfc2V0X3NhbXBsZV9iYXNlZCAocnRwYmFzZWF1ZGlvcGF5bG9hZCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9MOF9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFJ0cEw4UGF5ICpydHBMOHBheTsKKyAgZ2Jvb2xlYW4gcmVzOworICBnY2hhciAqcGFyYW1zOworICBHc3RBdWRpb0luZm8gKmluZm87CisgIGNvbnN0IEdzdFJUUENoYW5uZWxPcmRlciAqb3JkZXI7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgKnJ0cGJhc2VhdWRpb3BheWxvYWQ7CisKKyAgcnRwYmFzZWF1ZGlvcGF5bG9hZCA9IEdTVF9SVFBfQkFTRV9BVURJT19QQVlMT0FEIChiYXNlcGF5bG9hZCk7CisgIHJ0cEw4cGF5ID0gR1NUX1JUUF9MOF9QQVkgKGJhc2VwYXlsb2FkKTsKKworICBpbmZvID0gJnJ0cEw4cGF5LT5pbmZvOworICBnc3RfYXVkaW9faW5mb19pbml0IChpbmZvKTsKKyAgaWYgKCFnc3RfYXVkaW9faW5mb19mcm9tX2NhcHMgKGluZm8sIGNhcHMpKQorICAgIGdvdG8gaW52YWxpZF9jYXBzOworCisgIG9yZGVyID0gZ3N0X3J0cF9jaGFubmVsc19nZXRfYnlfcG9zIChpbmZvLT5jaGFubmVscywgaW5mby0+cG9zaXRpb24pOworICBydHBMOHBheS0+b3JkZXIgPSBvcmRlcjsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAoYmFzZXBheWxvYWQsICJhdWRpbyIsIFRSVUUsICJMOCIsCisgICAgICBpbmZvLT5yYXRlKTsKKyAgcGFyYW1zID0gZ19zdHJkdXBfcHJpbnRmICgiJWQiLCBpbmZvLT5jaGFubmVscyk7CisKKyAgaWYgKCFvcmRlciAmJiBpbmZvLT5jaGFubmVscyA+IDIpIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBMOHBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJVbmtub3duIGNoYW5uZWwgb3JkZXIgZm9yICVkIGNoYW5uZWxzIiwgaW5mby0+Y2hhbm5lbHMpKTsKKyAgfQorCisgIGlmIChvcmRlciAmJiBvcmRlci0+bmFtZSkgeworICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChiYXNlcGF5bG9hZCwKKyAgICAgICAgImVuY29kaW5nLXBhcmFtcyIsIEdfVFlQRV9TVFJJTkcsIHBhcmFtcywgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwKKyAgICAgICAgaW5mby0+Y2hhbm5lbHMsICJjaGFubmVsLW9yZGVyIiwgR19UWVBFX1NUUklORywgb3JkZXItPm5hbWUsIE5VTEwpOworICB9IGVsc2UgeworICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChiYXNlcGF5bG9hZCwKKyAgICAgICAgImVuY29kaW5nLXBhcmFtcyIsIEdfVFlQRV9TVFJJTkcsIHBhcmFtcywgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwKKyAgICAgICAgaW5mby0+Y2hhbm5lbHMsIE5VTEwpOworICB9CisKKyAgZ19mcmVlIChwYXJhbXMpOworCisgIC8qIG9jdGV0LXBlci1zYW1wbGUgaXMgIyBjaGFubmVscyBmb3IgTDggKi8KKyAgZ3N0X3J0cF9iYXNlX2F1ZGlvX3BheWxvYWRfc2V0X3NhbXBsZV9vcHRpb25zIChydHBiYXNlYXVkaW9wYXlsb2FkLAorICAgICAgaW5mby0+Y2hhbm5lbHMpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX2NhcHM6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBMOHBheSwgImludmFsaWQgY2FwcyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfcnRwX0w4X3BheV9nZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHJ0cHBheWxvYWQsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RDYXBzICpvdGhlcnBhZGNhcHM7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgY2FwcyA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChwYWQpOworCisgIG90aGVycGFkY2FwcyA9IGdzdF9wYWRfZ2V0X2FsbG93ZWRfY2FwcyAocnRwcGF5bG9hZC0+c3JjcGFkKTsKKyAgaWYgKG90aGVycGFkY2FwcykgeworICAgIGlmICghZ3N0X2NhcHNfaXNfZW1wdHkgKG90aGVycGFkY2FwcykpIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICAgICAgZ2ludCBjaGFubmVsczsKKyAgICAgIGdpbnQgcmF0ZTsKKworICAgICAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAob3RoZXJwYWRjYXBzLCAwKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChjYXBzKTsKKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2hhbm5lbHMiLCAmY2hhbm5lbHMpKSB7CisgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIGNoYW5uZWxzLCBOVUxMKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFN1cHBvcnQgYW55IG51bWJlciBvZiBjaGFubmVscywgaWYgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkICovCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzdHJ1Y3R1cmUsICJjaGFubmVscyIpOworICAgICAgfQorCisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJnJhdGUpKSB7CisgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJyYXRlIiwgR19UWVBFX0lOVCwgcmF0ZSwgTlVMTCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBTdXBwb3J0IGFueSByYXRlLCBpZiBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQgKi8KKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHN0cnVjdHVyZSwgInJhdGUiKTsKKyAgICAgIH0KKworICAgIH0KKyAgICBnc3RfY2Fwc191bnJlZiAob3RoZXJwYWRjYXBzKTsKKyAgfQorCisgIGlmIChmaWx0ZXIpIHsKKyAgICBHc3RDYXBzICp0Y2FwcyA9IGNhcHM7CisKKyAgICBjYXBzID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgdGNhcHMsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHRjYXBzKTsKKyAgfQorCisgIHJldHVybiBjYXBzOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9MOF9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJ0cEw4UGF5ICpydHBMOHBheTsKKworICBydHBMOHBheSA9IEdTVF9SVFBfTDhfUEFZIChiYXNlcGF5bG9hZCk7CisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoYnVmZmVyKTsKKworICBpZiAocnRwTDhwYXktPm9yZGVyICYmCisgICAgICAhZ3N0X2F1ZGlvX2J1ZmZlcl9yZW9yZGVyX2NoYW5uZWxzIChidWZmZXIsIHJ0cEw4cGF5LT5pbmZvLmZpbmZvLT5mb3JtYXQsCisgICAgICAgICAgcnRwTDhwYXktPmluZm8uY2hhbm5lbHMsIHJ0cEw4cGF5LT5pbmZvLnBvc2l0aW9uLAorICAgICAgICAgIHJ0cEw4cGF5LT5vcmRlci0+cG9zKSkgeworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIHJldHVybiBHU1RfUlRQX0JBU0VfUEFZTE9BRF9DTEFTUyAocGFyZW50X2NsYXNzKS0+aGFuZGxlX2J1ZmZlciAoYmFzZXBheWxvYWQsCisgICAgICBidWZmZXIpOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9MOF9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBMOHBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9MOF9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBMOHBheS5oIGIvZ3N0L3J0cC9nc3RydHBMOHBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4M2ViMmYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cEw4cGF5LmgKQEAgLTAsMCArMSw2NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAxNT4gR0UgSW50ZWxsaWdlbnQgUGxhdGZvcm1zIEVtYmVkZGVkIFN5c3RlbXMsIEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9MOF9QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9MOF9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlYXVkaW9wYXlsb2FkLmg+CisKKyNpbmNsdWRlICJnc3RydHBjaGFubmVscy5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0w4X1BBWSBcCisgIChnc3RfcnRwX0w4X3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0w4X1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9MOF9QQVksR3N0UnRwTDhQYXkpKQorI2RlZmluZSBHU1RfUlRQX0w4X1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTDhfUEFZLEdzdFJ0cEw4UGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0w4X1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9MOF9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0w4X1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTDhfUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEw4UGF5IEdzdFJ0cEw4UGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEw4UGF5Q2xhc3MgR3N0UnRwTDhQYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBMOFBheQoreworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkIHBheWxvYWQ7CisKKyAgR3N0QXVkaW9JbmZvIGluZm87CisgIGNvbnN0IEdzdFJUUENoYW5uZWxPcmRlciAqb3JkZXI7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cEw4UGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfTDhfcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9MOF9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfTDhfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMmIzYmEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmMKQEAgLTAsMCArMSwxODAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1ydHBhYzNkZXBheQorICogQHNlZV9hbHNvOiBydHBhYzNwYXkKKyAqCisgKiBFeHRyYWN0IEFDMyBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIGFjY29yZGluZyB0byBSRkMgNDE4NC4KKyAqIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBzZWU6IGh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzQxODQudHh0CisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHVkcHNyYyBjYXBzPSdhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgY2xvY2stcmF0ZT0oaW50KTQ0MTAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpQUMzLCBwYXlsb2FkPShpbnQpOTYnICEgcnRwYWMzZGVwYXkgISBhNTJkZWMgISBwdWxzZXNpbmsKKyAqIF18IFRoaXMgZXhhbXBsZSBwaXBlbGluZSB3aWxsIGRlcGF5bG9hZCBhbmQgZGVjb2RlIGFuIFJUUCBBQzMgc3RyZWFtLiBSZWZlciB0bworICogdGhlIHJ0cGFjM3BheSBleGFtcGxlIHRvIGNyZWF0ZSB0aGUgUlRQIHN0cmVhbS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0cnRwYWMzZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBhYzNkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwYWMzZGVwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2FjM19kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL2FjMyIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfYWMzX2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgeyAzMjAwMCwgNDQxMDAsIDQ4MDAwIH0sICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkFDM1wiIikKKyAgICApOworCitHX0RFRklORV9UWVBFIChHc3RSdHBBQzNEZXBheSwgZ3N0X3J0cF9hYzNfZGVwYXksIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2FjM19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfYWMzX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfYWMzX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEFDM0RlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfYWMzX2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfYWMzX2RlcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIEFDMyBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgQUMzIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgKFJGQyA0MTg0KSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfYWMzX2RlcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfYWMzX2RlcGF5X3Byb2Nlc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGFjM2RlcGF5X2RlYnVnLCAicnRwYWMzZGVwYXkiLCAwLAorICAgICAgIkFDMyBBdWRpbyBSVFAgRGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfYWMzX2RlcGF5X2luaXQgKEdzdFJ0cEFDM0RlcGF5ICogcnRwYWMzZGVwYXkpCit7CisgIC8qIG5lZWRlZCBiZWNhdXNlIG9mIEdfREVGSU5FX1RZUEUgKi8KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2FjM19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKyAgR3N0Q2FwcyAqc3JjY2FwczsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSA5MDAwMDsgICAgICAgICAvKiBkZWZhdWx0ICovCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby9hYzMiKTsKKyAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoZGVwYXlsb2FkLT5zcmNwYWQsIHNyY2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX2FjM19kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cEFDM0RlcGF5ICpydHBhYzNkZXBheTsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIGd1aW50OCAqcGF5bG9hZDsKKyAgZ3VpbnQxNiBGVCwgTkY7CisKKyAgcnRwYWMzZGVwYXkgPSBHU1RfUlRQX0FDM19ERVBBWSAoZGVwYXlsb2FkKTsKKworICBpZiAoZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApIDwgMikKKyAgICBnb3RvIGVtcHR5X3BhY2tldDsKKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisKKyAgLyogc3RyaXAgb2ZmIGhlYWRlcgorICAgKgorICAgKiAgMCAgICAgICAgICAgICAgICAgICAxCisgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1CisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgIE1CWiAgICB8IEZUfCAgICAgICBORiAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqLworICBGVCA9IHBheWxvYWRbMF0gJiAweDM7CisgIE5GID0gcGF5bG9hZFsxXTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBhYzNkZXBheSwgIkZUOiAlZCwgTkY6ICVkIiwgRlQsIE5GKTsKKworICAvKiBXZSBkb24ndCBib3RoZXIgd2l0aCBmcmFnbWVudGVkIHBhY2tldHMgeWV0ICovCisgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3N1YmJ1ZmZlciAocnRwLCAyLCAtMSk7CisKKyAgaWYgKG91dGJ1ZikgeworICAgIGdzdF9ydHBfZHJvcF9ub25fYXVkaW9fbWV0YSAocnRwYWMzZGVwYXksIG91dGJ1Zik7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwYWMzZGVwYXksICJwdXNoaW5nIGJ1ZmZlciBvZiBzaXplICUiIEdfR1NJWkVfRk9STUFULAorICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWYpKTsKKyAgfQorCisgIHJldHVybiBvdXRidWY7CisKKyAgLyogRVJST1JTICovCitlbXB0eV9wYWNrZXQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBhYzNkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgICgiRW1wdHkgUGF5bG9hZC4iKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3J0cF9hYzNfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBhYzNkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9BQzNfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NGJiMTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmgKQEAgLTAsMCArMSw1OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0FDM19ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0FDM19ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9BQzNfREVQQVkgXAorICAoZ3N0X3J0cF9hYzNfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9BQzNfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfQUMzX0RFUEFZLEdzdFJ0cEFDM0RlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9BQzNfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0FDM19ERVBBWSxHc3RSdHBBQzNEZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9BQzNfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfQUMzX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9BQzNfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0FDM19ERVBBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBBQzNEZXBheSBHc3RSdHBBQzNEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBBQzNEZXBheUNsYXNzIEdzdFJ0cEFDM0RlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwQUMzRGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cEFDM0RlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfYWMzX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9hYzNfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfQUMzX0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBhYzNwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwYWMzcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcwMjBkYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwYWMzcGF5LmMKQEAgLTAsMCArMSw0NzcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAxMD4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1ydHBhYzNwYXkKKyAqIEBzZWVfYWxzbzogcnRwYWMzZGVwYXkKKyAqCisgKiBQYXlsb2FkIEFDMyBhdWRpbyBpbnRvIFJUUCBwYWNrZXRzIGFjY29yZGluZyB0byBSRkMgNDE4NC4KKyAqIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBzZWU6IGh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzQxODQudHh0CisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyAhIGF2ZW5jX2FjMyAhIHJ0cGFjM3BheSAhIHVkcHNpbmsKKyAqIF18IFRoaXMgZXhhbXBsZSBwaXBlbGluZSB3aWxsIGVuY29kZSBhbmQgcGF5bG9hZCBBQzMgc3RyZWFtLiBSZWZlciB0bworICogdGhlIHJ0cGFjM2RlcGF5IGV4YW1wbGUgdG8gZGVwYXlsb2FkIGFuZCBkZWNvZGUgdGhlIFJUUCBzdHJlYW0uCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSAiZ3N0cnRwYWMzcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwYWMzcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBhYzNwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2FjM19wYXlfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8vYWMzOyAiICJhdWRpby94LWFjMzsgIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9hYzNfcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIHsgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJBQzNcIiIpCisgICAgKTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9hYzNfcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfYWMzX3BheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9hYzNfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9hYzNfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfYWMzX3BheV9mbHVzaCAoR3N0UnRwQUMzUGF5ICogcnRwYWMzcGF5KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfYWMzX3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKKworI2RlZmluZSBnc3RfcnRwX2FjM19wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwQUMzUGF5LCBnc3RfcnRwX2FjM19wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9hYzNfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEFDM1BheUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzICpnc3RydHBiYXNlcGF5bG9hZF9jbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwYWMzcGF5X2RlYnVnLCAicnRwYWMzcGF5IiwgMCwKKyAgICAgICJBQzMgQXVkaW8gUlRQIERlcGF5bG9hZGVyIik7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9hYzNfcGF5X2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfYWMzX3BheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9hYzNfcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfYWMzX3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBBQzMgYXVkaW8gcGF5bG9hZGVyIiwgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZCBBQzMgYXVkaW8gYXMgUlRQIHBhY2tldHMgKFJGQyA0MTg0KSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2FjM19wYXlfc2V0Y2FwczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNpbmtfZXZlbnQgPSBnc3RfcnRwX2FjM19wYXlfc2lua19ldmVudDsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX2FjM19wYXlfaGFuZGxlX2J1ZmZlcjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfYWMzX3BheV9pbml0IChHc3RSdHBBQzNQYXkgKiBydHBhYzNwYXkpCit7CisgIHJ0cGFjM3BheS0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfYWMzX3BheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwQUMzUGF5ICpydHBhYzNwYXk7CisKKyAgcnRwYWMzcGF5ID0gR1NUX1JUUF9BQzNfUEFZIChvYmplY3QpOworCisgIGdfb2JqZWN0X3VucmVmIChydHBhYzNwYXktPmFkYXB0ZXIpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfYWMzX3BheV9yZXNldCAoR3N0UnRwQUMzUGF5ICogcGF5KQoreworICBwYXktPmZpcnN0X3RzID0gLTE7CisgIHBheS0+ZHVyYXRpb24gPSAwOworICBnc3RfYWRhcHRlcl9jbGVhciAocGF5LT5hZGFwdGVyKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocGF5LCAicmVzZXQgZGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2FjM19wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBnaW50IHJhdGU7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJyYXRlIiwgJnJhdGUpKQorICAgIHJhdGUgPSA5MDAwMDsgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHBheWxvYWQsICJhdWRpbyIsIFRSVUUsICJBQzMiLCByYXRlKTsKKyAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHBheWxvYWQsIE5VTEwpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9hYzNfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RSdHBBQzNQYXkgKnJ0cGFjM3BheTsKKworICBydHBhYzNwYXkgPSBHU1RfUlRQX0FDM19QQVkgKHBheWxvYWQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgIC8qIG1ha2Ugc3VyZSB3ZSBwdXNoIHRoZSBsYXN0IHBhY2tldHMgaW4gdGhlIGFkYXB0ZXIgb24gRU9TICovCisgICAgICBnc3RfcnRwX2FjM19wYXlfZmx1c2ggKHJ0cGFjM3BheSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ3N0X3J0cF9hYzNfcGF5X3Jlc2V0IChydHBhYzNwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmVzID0gR1NUX1JUUF9CQVNFX1BBWUxPQURfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNpbmtfZXZlbnQgKHBheWxvYWQsIGV2ZW50KTsKKworICByZXR1cm4gcmVzOworfQorCitzdHJ1Y3QgZnJtc2l6ZV9zCit7CisgIGd1aW50MTYgYml0X3JhdGU7CisgIGd1aW50MTYgZnJtX3NpemVbM107Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZybXNpemVfcyBmcm1zaXplY29kX3RibFtdID0geworICB7MzIsIHs2NCwgNjksIDk2fX0sCisgIHszMiwgezY0LCA3MCwgOTZ9fSwKKyAgezQwLCB7ODAsIDg3LCAxMjB9fSwKKyAgezQwLCB7ODAsIDg4LCAxMjB9fSwKKyAgezQ4LCB7OTYsIDEwNCwgMTQ0fX0sCisgIHs0OCwgezk2LCAxMDUsIDE0NH19LAorICB7NTYsIHsxMTIsIDEyMSwgMTY4fX0sCisgIHs1NiwgezExMiwgMTIyLCAxNjh9fSwKKyAgezY0LCB7MTI4LCAxMzksIDE5Mn19LAorICB7NjQsIHsxMjgsIDE0MCwgMTkyfX0sCisgIHs4MCwgezE2MCwgMTc0LCAyNDB9fSwKKyAgezgwLCB7MTYwLCAxNzUsIDI0MH19LAorICB7OTYsIHsxOTIsIDIwOCwgMjg4fX0sCisgIHs5NiwgezE5MiwgMjA5LCAyODh9fSwKKyAgezExMiwgezIyNCwgMjQzLCAzMzZ9fSwKKyAgezExMiwgezIyNCwgMjQ0LCAzMzZ9fSwKKyAgezEyOCwgezI1NiwgMjc4LCAzODR9fSwKKyAgezEyOCwgezI1NiwgMjc5LCAzODR9fSwKKyAgezE2MCwgezMyMCwgMzQ4LCA0ODB9fSwKKyAgezE2MCwgezMyMCwgMzQ5LCA0ODB9fSwKKyAgezE5MiwgezM4NCwgNDE3LCA1NzZ9fSwKKyAgezE5MiwgezM4NCwgNDE4LCA1NzZ9fSwKKyAgezIyNCwgezQ0OCwgNDg3LCA2NzJ9fSwKKyAgezIyNCwgezQ0OCwgNDg4LCA2NzJ9fSwKKyAgezI1NiwgezUxMiwgNTU3LCA3Njh9fSwKKyAgezI1NiwgezUxMiwgNTU4LCA3Njh9fSwKKyAgezMyMCwgezY0MCwgNjk2LCA5NjB9fSwKKyAgezMyMCwgezY0MCwgNjk3LCA5NjB9fSwKKyAgezM4NCwgezc2OCwgODM1LCAxMTUyfX0sCisgIHszODQsIHs3NjgsIDgzNiwgMTE1Mn19LAorICB7NDQ4LCB7ODk2LCA5NzUsIDEzNDR9fSwKKyAgezQ0OCwgezg5NiwgOTc2LCAxMzQ0fX0sCisgIHs1MTIsIHsxMDI0LCAxMTE0LCAxNTM2fX0sCisgIHs1MTIsIHsxMDI0LCAxMTE1LCAxNTM2fX0sCisgIHs1NzYsIHsxMTUyLCAxMjUzLCAxNzI4fX0sCisgIHs1NzYsIHsxMTUyLCAxMjU0LCAxNzI4fX0sCisgIHs2NDAsIHsxMjgwLCAxMzkzLCAxOTIwfX0sCisgIHs2NDAsIHsxMjgwLCAxMzk0LCAxOTIwfX0KK307CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2FjM19wYXlfZmx1c2ggKEdzdFJ0cEFDM1BheSAqIHJ0cGFjM3BheSkKK3sKKyAgZ3VpbnQgYXZhaWwsIEZULCBORiwgbXR1OworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgLyogdGhlIGRhdGEgYXZhaWxhYmxlIGluIHRoZSBhZGFwdGVyIGlzIGVpdGhlciBzbWFsbGVyCisgICAqIHRoYW4gdGhlIE1UVSBvciBiaWdnZXIuIEluIHRoZSBjYXNlIGl0IGlzIHNtYWxsZXIsIHRoZSBjb21wbGV0ZQorICAgKiBhZGFwdGVyIGNvbnRlbnRzIGNhbiBiZSBwdXQgaW4gb25lIHBhY2tldC4gSW4gdGhlIGNhc2UgdGhlCisgICAqIGFkYXB0ZXIgaGFzIG1vcmUgdGhhbiBvbmUgTVRVLCB3ZSBuZWVkIHRvIHNwbGl0IHRoZSBBQzMgZGF0YQorICAgKiBvdmVyIG11bHRpcGxlIHBhY2tldHMuICovCisgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBhYzNwYXktPmFkYXB0ZXIpOworCisgIHJldCA9IEdTVF9GTE9XX09LOworCisgIEZUID0gMDsKKyAgLyogbnVtYmVyIG9mIGZyYW1lcyAqLworICBORiA9IHJ0cGFjM3BheS0+TkY7CisKKyAgbXR1ID0gR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVIChydHBhYzNwYXkpOworCisgIEdTVF9MT0dfT0JKRUNUIChydHBhYzNwYXksICJmbHVzaGluZyAldSBieXRlcyIsIGF2YWlsKTsKKworICB3aGlsZSAoYXZhaWwgPiAwKSB7CisgICAgZ3VpbnQgdG93cml0ZTsKKyAgICBndWludDggKnBheWxvYWQ7CisgICAgZ3VpbnQgcGF5bG9hZF9sZW47CisgICAgZ3VpbnQgcGFja2V0X2xlbjsKKyAgICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMLCB9OworICAgIEdzdEJ1ZmZlciAqcGF5bG9hZF9idWZmZXI7CisKKyAgICAvKiB0aGlzIHdpbGwgYmUgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgcGFja2V0ICovCisgICAgcGFja2V0X2xlbiA9IGdzdF9ydHBfYnVmZmVyX2NhbGNfcGFja2V0X2xlbiAoMiArIGF2YWlsLCAwLCAwKTsKKworICAgIC8qIGZpbGwgb25lIE1UVSBvciBhbGwgYXZhaWxhYmxlIGJ5dGVzICovCisgICAgdG93cml0ZSA9IE1JTiAocGFja2V0X2xlbiwgbXR1KTsKKworICAgIC8qIHRoaXMgaXMgdGhlIHBheWxvYWQgbGVuZ3RoICovCisgICAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BheWxvYWRfbGVuICh0b3dyaXRlLCAwLCAwKTsKKworICAgIC8qIGNyZWF0ZSBidWZmZXIgdG8gaG9sZCB0aGUgcGF5bG9hZCAqLworICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoMiwgMCwgMCk7CisKKyAgICBpZiAoRlQgPT0gMCkgeworICAgICAgLyogY2hlY2sgaWYgaXQgYWxsIGZpdHMgKi8KKyAgICAgIGlmICh0b3dyaXRlIDwgcGFja2V0X2xlbikgeworICAgICAgICBndWludCBtYXhsZW47CisKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGFjM3BheSwgIndlIG5lZWQgdG8gZnJhZ21lbnQiKTsKKyAgICAgICAgLyogY2hlY2sgaWYgd2Ugd2lsbCBiZSBhYmxlIHRvIHB1dCBhdCBsZWFzdCA1Lzh0aCBvZiB0aGUgdG90YWwKKyAgICAgICAgICogZnJhbWUgaW4gdGhpcyBmaXJzdCBmcmFtZS4gKi8KKyAgICAgICAgaWYgKChhdmFpbCAqIDUpIC8gOCA+PSAocGF5bG9hZF9sZW4gLSAyKSkKKyAgICAgICAgICBGVCA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBGVCA9IDI7CisgICAgICAgIC8qIGNoZWNrIGhvdyBtYW55IGZyYWdtZW50cyB3ZSB3aWxsIG5lZWQgKi8KKyAgICAgICAgbWF4bGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYXlsb2FkX2xlbiAobXR1IC0gMiwgMCwgMCk7CisgICAgICAgIE5GID0gKGF2YWlsICsgbWF4bGVuIC0gMSkgLyBtYXhsZW47CisgICAgICB9CisgICAgfSBlbHNlIGlmIChGVCAhPSAzKSB7CisgICAgICAvKiByZW1haW5pbmcgZnJhZ21lbnQgKi8KKyAgICAgIEZUID0gMzsKKyAgICB9CisKKyAgICAvKgorICAgICAqICAwICAgICAgICAgICAgICAgICAgIDEKKyAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNQorICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAqIHwgICAgTUJaICAgIHwgRlR8ICAgICAgIE5GICAgICAgfAorICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAqCisgICAgICogRlQ6IDA6IG9uZSBvciBtb3JlIGNvbXBsZXRlIGZyYW1lcworICAgICAqICAgICAxOiBpbml0aWFsIDUvOCBmcmFnbWVudAorICAgICAqICAgICAyOiBpbml0aWFsIGZyYWdtZW50IG5vdCA1LzgKKyAgICAgKiAgICAgMzogb3RoZXIgZnJhZ21lbnQKKyAgICAgKiBORjogYW1vdW50IG9mIGZyYW1lcyBpZiBGVCA9IDAsIGVsc2UgbnVtYmVyIG9mIGZyYWdtZW50cy4KKyAgICAgKi8KKyAgICBnc3RfcnRwX2J1ZmZlcl9tYXAgKG91dGJ1ZiwgR1NUX01BUF9XUklURSwgJnJ0cCk7CisgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGFjM3BheSwgIkZUICV1LCBORiAldSIsIEZULCBORik7CisgICAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKTsKKyAgICBwYXlsb2FkWzBdID0gKEZUICYgMyk7CisgICAgcGF5bG9hZFsxXSA9IE5GOworICAgIHBheWxvYWRfbGVuIC09IDI7CisKKyAgICBpZiAoYXZhaWwgPT0gcGF5bG9hZF9sZW4pCisgICAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBUUlVFKTsKKyAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgICBwYXlsb2FkX2J1ZmZlciA9CisgICAgICAgIGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyX2Zhc3QgKHJ0cGFjM3BheS0+YWRhcHRlciwgcGF5bG9hZF9sZW4pOworCisgICAgZ3N0X3J0cF9jb3B5X2F1ZGlvX21ldGEgKHJ0cGFjM3BheSwgb3V0YnVmLCBwYXlsb2FkX2J1ZmZlcik7CisKKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAob3V0YnVmLCBwYXlsb2FkX2J1ZmZlcik7CisKKyAgICBhdmFpbCAtPSBwYXlsb2FkX2xlbjsKKworICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gcnRwYWMzcGF5LT5maXJzdF90czsKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gcnRwYWMzcGF5LT5kdXJhdGlvbjsKKworICAgIHJldCA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBhYzNwYXkpLCBvdXRidWYpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfYWMzX3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UnRwQUMzUGF5ICpydHBhYzNwYXk7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBnc2l6ZSBhdmFpbCwgbGVmdCwgTkY7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKnA7CisgIGd1aW50IHBhY2tldF9sZW47CisgIEdzdENsb2NrVGltZSBkdXJhdGlvbiwgdGltZXN0YW1wOworCisgIHJ0cGFjM3BheSA9IEdTVF9SVFBfQUMzX1BBWSAoYmFzZXBheWxvYWQpOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGR1cmF0aW9uID0gR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKTsKKyAgdGltZXN0YW1wID0gR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcik7CisKKyAgaWYgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAoYnVmZmVyKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGFjM3BheSwgIkRJU0NPTlQiKTsKKyAgICBnc3RfcnRwX2FjM19wYXlfcmVzZXQgKHJ0cGFjM3BheSk7CisgIH0KKworICAvKiBjb3VudCB0aGUgYW1vdW50IG9mIGluY29tbWluZyBwYWNrZXRzICovCisgIE5GID0gMDsKKyAgbGVmdCA9IG1hcC5zaXplOworICBwID0gbWFwLmRhdGE7CisgIHdoaWxlIChUUlVFKSB7CisgICAgZ3VpbnQgYnNpZCwgZnNjb2QsIGZybXNpemVjb2QsIGZyYW1lX3NpemU7CisKKyAgICBpZiAobGVmdCA8IDYpCisgICAgICBicmVhazsKKworICAgIGlmIChwWzBdICE9IDB4MGIgfHwgcFsxXSAhPSAweDc3KQorICAgICAgYnJlYWs7CisKKyAgICBic2lkID0gcFs1XSA+PiAzOworICAgIGlmIChic2lkID4gOCkKKyAgICAgIGJyZWFrOworCisgICAgZnJtc2l6ZWNvZCA9IHBbNF0gJiAweDNmOworICAgIGZzY29kID0gcFs0XSA+PiA2OworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwYWMzcGF5LCAiZnNjb2QgJXUsICV1IiwgZnNjb2QsIGZybXNpemVjb2QpOworCisgICAgaWYgKGZzY29kID49IDMgfHwgZnJtc2l6ZWNvZCA+PSAzOCkKKyAgICAgIGJyZWFrOworCisgICAgZnJhbWVfc2l6ZSA9IGZybXNpemVjb2RfdGJsW2ZybXNpemVjb2RdLmZybV9zaXplW2ZzY29kXSAqIDI7CisgICAgaWYgKGZyYW1lX3NpemUgPiBsZWZ0KQorICAgICAgYnJlYWs7CisKKyAgICBORisrOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGFjM3BheSwgImZvdW5kIGZyYW1lICUiIEdfR1NJWkVfRk9STUFUICIgb2Ygc2l6ZSAldSIsCisgICAgICAgIE5GLCBmcmFtZV9zaXplKTsKKworICAgIHAgKz0gZnJhbWVfc2l6ZTsKKyAgICBsZWZ0IC09IGZyYW1lX3NpemU7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgaWYgKE5GID09IDApCisgICAgZ290byBub19mcmFtZXM7CisKKyAgYXZhaWwgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHJ0cGFjM3BheS0+YWRhcHRlcik7CisKKyAgLyogZ2V0IHBhY2tldCBsZW5ndGggb2YgcHJldmlvdXMgZGF0YSBhbmQgdGhpcyBuZXcgZGF0YSwKKyAgICogcGF5bG9hZCBsZW5ndGggaW5jbHVkZXMgYSA0IGJ5dGUgaGVhZGVyICovCisgIHBhY2tldF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BhY2tldF9sZW4gKDIgKyBhdmFpbCArIG1hcC5zaXplLCAwLCAwKTsKKworICAvKiBpZiB0aGlzIGJ1ZmZlciBpcyBnb2luZyB0byBvdmVyZmxvdyB0aGUgcGFja2V0LCBmbHVzaCB3aGF0IHdlCisgICAqIGhhdmUuICovCisgIGlmIChnc3RfcnRwX2Jhc2VfcGF5bG9hZF9pc19maWxsZWQgKGJhc2VwYXlsb2FkLAorICAgICAgICAgIHBhY2tldF9sZW4sIHJ0cGFjM3BheS0+ZHVyYXRpb24gKyBkdXJhdGlvbikpIHsKKyAgICByZXQgPSBnc3RfcnRwX2FjM19wYXlfZmx1c2ggKHJ0cGFjM3BheSk7CisgICAgYXZhaWwgPSAwOworICB9IGVsc2UgeworICAgIHJldCA9IEdTVF9GTE9XX09LOworICB9CisKKyAgaWYgKGF2YWlsID09IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBhYzNwYXksCisgICAgICAgICJmaXJzdCBwYWNrZXQsIHNhdmUgdGltZXN0YW1wICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSk7CisgICAgcnRwYWMzcGF5LT5maXJzdF90cyA9IHRpbWVzdGFtcDsKKyAgICBydHBhYzNwYXktPmR1cmF0aW9uID0gMDsKKyAgICBydHBhYzNwYXktPk5GID0gMDsKKyAgfQorCisgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGFjM3BheS0+YWRhcHRlciwgYnVmZmVyKTsKKyAgcnRwYWMzcGF5LT5kdXJhdGlvbiArPSBkdXJhdGlvbjsKKyAgcnRwYWMzcGF5LT5ORiArPSBORjsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworbm9fZnJhbWVzOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChydHBhYzNwYXksICJubyB2YWxpZCBBQzMgZnJhbWVzIGZvdW5kIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9hYzNfcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cEFDM1BheSAqcnRwYWMzcGF5OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRwYWMzcGF5ID0gR1NUX1JUUF9BQzNfUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X3J0cF9hYzNfcGF5X3Jlc2V0IChydHBhYzNwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9ydHBfYWMzX3BheV9yZXNldCAocnRwYWMzcGF5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9hYzNfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwYWMzcGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX0FDM19QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBhYzNwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwYWMzcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEzMWVhYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwYWMzcGF5LmgKQEAgLTAsMCArMSw2NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDEwPiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0FDM19QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9BQzNfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZXBheWxvYWQuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfQUMzX1BBWSBcCisgIChnc3RfcnRwX2FjM19wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9BQzNfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0FDM19QQVksR3N0UnRwQUMzUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9BQzNfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9BQzNfUEFZLEdzdFJ0cEFDM1BheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9BQzNfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0FDM19QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0FDM19QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0FDM19QQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwQUMzUGF5IEdzdFJ0cEFDM1BheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBBQzNQYXlDbGFzcyBHc3RSdHBBQzNQYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBBQzNQYXkKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWQgcGF5bG9hZDsKKworICBHc3RBZGFwdGVyICphZGFwdGVyOworICBHc3RDbG9ja1RpbWUgZmlyc3RfdHM7CisgIEdzdENsb2NrVGltZSBkdXJhdGlvbjsKKyAgZ3VpbnQgTkY7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cEFDM1BheUNsYXNzCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9hYzNfcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9hYzNfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0FDM19QQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E3Yzc5NwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYwpAQCAtMCwwICsxLDQ3OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cGFtcmRlcGF5CisgKiBAc2VlX2Fsc286IHJ0cGFtcnBheQorICoKKyAqIEV4dHJhY3QgQU1SIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQyAzMjY3LgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMzI2Ny50eHQKKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdWRwc3JjIGNhcHM9J2FwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpODAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUFNUiwgZW5jb2RpbmctcGFyYW1zPShzdHJpbmcpMSwgb2N0ZXQtYWxpZ249KHN0cmluZykxLCBwYXlsb2FkPShpbnQpOTYnICEgcnRwYW1yZGVwYXkgISBhbXJuYmRlYyAhIHB1bHNlc2luaworICogXXwgVGhpcyBleGFtcGxlIHBpcGVsaW5lIHdpbGwgZGVwYXlsb2FkIGFuZCBkZWNvZGUgYW4gUlRQIEFNUiBzdHJlYW0uIFJlZmVyIHRvCisgKiB0aGUgcnRwYW1ycGF5IGV4YW1wbGUgdG8gY3JlYXRlIHRoZSBSVFAgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisvKgorICogUkZDIDMyNjcgLSBSZWFsLVRpbWUgVHJhbnNwb3J0IFByb3RvY29sIChSVFApIFBheWxvYWQgRm9ybWF0IGFuZCBGaWxlCisgKiBTdG9yYWdlIEZvcm1hdCBmb3IgdGhlIEFkYXB0aXZlIE11bHRpLVJhdGUgKEFNUikgYW5kIEFkYXB0aXZlIE11bHRpLVJhdGUKKyAqIFdpZGViYW5kIChBTVItV0IpIEF1ZGlvIENvZGVjcy4KKyAqCisgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdzdHJ0cGFtcmRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwYW1yZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cGFtcmRlcGF5X2RlYnVnKQorCisvKiBSdHBBTVJEZXBheSBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKK2VudW0KK3sKKyAgUFJPUF8wCit9OworCisvKiBpbnB1dCBpcyBhbiBSVFAgcGFja2V0CisgKgorICogcGFyYW1zIHNlZSBSRkMgMzI2Nywgc2VjdGlvbiA4LjEKKyAqLworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfYW1yX2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkFNUlwiLCAiCisgICAgICAgIC8qIFRoaXMgaXMgdGhlIGRlZmF1bHQsIHNvIHRoZSBwZWVyIGRvZXNuJ3QgaGF2ZSB0byBzcGVjaWZ5IGl0CisgICAgICAgICAqICJlbmNvZGluZy1wYXJhbXMgPSAoc3RyaW5nKSBcIjFcIiwgIiAqLworICAgICAgICAvKiBOT1RFIHRoYXQgYWxsIHZhbHVlcyBtdXN0IGJlIHN0cmluZ3MgaW4gb3JkZSB0byBiZSBhYmxlIHRvIGRvIFNEUCA8LT4KKyAgICAgICAgICogR3N0Q2FwcyBtYXBwaW5nLiAqLworICAgICAgICAib2N0ZXQtYWxpZ24gPSAoc3RyaW5nKSBcIjFcIjsiCisgICAgICAgIC8qIGZvbGxvd2luZyBvcHRpb25zIGFyZSBub3QgbmVlZGVkIGZvciBhIGRlY29kZXIKKyAgICAgICAgICoKKyAgICAgICAgICJjcmMgPSAoc3RyaW5nKSB7IFwiMFwiLCBcIjFcIiB9LCAiCisgICAgICAgICAicm9idXN0LXNvcnRpbmcgPSAoc3RyaW5nKSBcIjBcIiwgIgorICAgICAgICAgImludGVybGVhdmluZyA9IChzdHJpbmcpIFwiMFwiOyIKKyAgICAgICAgICJtb2RlLXNldCA9IChpbnQpIFsgMCwgNyBdLCAiCisgICAgICAgICAibW9kZS1jaGFuZ2UtcGVyaW9kID0gKGludCkgWyAxLCBNQVggXSwgIgorICAgICAgICAgIm1vZGUtY2hhbmdlLW5laWdoYm9yID0gKGJvb2xlYW4pIHsgVFJVRSwgRkFMU0UgfSwgIgorICAgICAgICAgIm1heHB0aW1lID0gKGludCkgWyAyMCwgTUFYIF0sICIKKyAgICAgICAgICJwdGltZSA9IChpbnQpIFsgMjAsIE1BWCBdIgorICAgICAgICAgKi8KKyAgICAgICAgImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDE2MDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJBTVItV0JcIiwgIgorICAgICAgICAvKiBUaGlzIGlzIHRoZSBkZWZhdWx0LCBzbyB0aGUgcGVlciBkb2Vzbid0IGhhdmUgdG8gc3BlY2lmeSBpdAorICAgICAgICAgKiAiZW5jb2RpbmctcGFyYW1zID0gKHN0cmluZykgXCIxXCIsICIgKi8KKyAgICAgICAgLyogTk9URSB0aGF0IGFsbCB2YWx1ZXMgbXVzdCBiZSBzdHJpbmdzIGluIG9yZGUgdG8gYmUgYWJsZSB0byBkbyBTRFAgPC0+CisgICAgICAgICAqIEdzdENhcHMgbWFwcGluZy4gKi8KKyAgICAgICAgIm9jdGV0LWFsaWduID0gKHN0cmluZykgXCIxXCI7IgorICAgICAgICAvKiBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgbm90IG5lZWRlZCBmb3IgYSBkZWNvZGVyCisgICAgICAgICAqCisgICAgICAgICAiY3JjID0gKHN0cmluZykgeyBcIjBcIiwgXCIxXCIgfSwgIgorICAgICAgICAgInJvYnVzdC1zb3J0aW5nID0gKHN0cmluZykgXCIwXCIsICIKKyAgICAgICAgICJpbnRlcmxlYXZpbmcgPSAoc3RyaW5nKSBcIjBcIiIKKyAgICAgICAgICJtb2RlLXNldCA9IChpbnQpIFsgMCwgNyBdLCAiCisgICAgICAgICAibW9kZS1jaGFuZ2UtcGVyaW9kID0gKGludCkgWyAxLCBNQVggXSwgIgorICAgICAgICAgIm1vZGUtY2hhbmdlLW5laWdoYm9yID0gKGJvb2xlYW4pIHsgVFJVRSwgRkFMU0UgfSwgIgorICAgICAgICAgIm1heHB0aW1lID0gKGludCkgWyAyMCwgTUFYIF0sICIKKyAgICAgICAgICJwdGltZSA9IChpbnQpIFsgMjAsIE1BWCBdIgorICAgICAgICAgKi8KKyAgICApCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfYW1yX2RlcGF5X3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL0FNUiwgIiAiY2hhbm5lbHMgPSAoaW50KSAxLCIgInJhdGUgPSAoaW50KSA4MDAwOyIKKyAgICAgICAgImF1ZGlvL0FNUi1XQiwgIiAiY2hhbm5lbHMgPSAoaW50KSAxLCIgInJhdGUgPSAoaW50KSAxNjAwMCIpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfYW1yX2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9hbXJfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworCisjZGVmaW5lIGdzdF9ydHBfYW1yX2RlcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cEFNUkRlcGF5LCBnc3RfcnRwX2Ftcl9kZXBheSwgR1NUX1RZUEVfUlRQX0JBU0VfREVQQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfYW1yX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEFNUkRlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfYW1yX2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfYW1yX2RlcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIEFNUiBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgQU1SIG9yIEFNUi1XQiBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMzI2NykiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+cHJvY2Vzc19ydHBfcGFja2V0ID0gZ3N0X3J0cF9hbXJfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2Ftcl9kZXBheV9zZXRjYXBzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBhbXJkZXBheV9kZWJ1ZywgInJ0cGFtcmRlcGF5IiwgMCwKKyAgICAgICJBTVIvQU1SLVdCIFJUUCBEZXBheWxvYWRlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9hbXJfZGVwYXlfaW5pdCAoR3N0UnRwQU1SRGVwYXkgKiBydHBhbXJkZXBheSkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCAqZGVwYXlsb2FkOworCisgIGRlcGF5bG9hZCA9IEdTVF9SVFBfQkFTRV9ERVBBWUxPQUQgKHJ0cGFtcmRlcGF5KTsKKworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NSQ1BBRCAoZGVwYXlsb2FkKSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9hbXJfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBHc3RDYXBzICpzcmNjYXBzOworICBHc3RSdHBBTVJEZXBheSAqcnRwYW1yZGVwYXk7CisgIGNvbnN0IGdjaGFyICpwYXJhbXM7CisgIGNvbnN0IGdjaGFyICpzdHIsICp0eXBlOworICBnaW50IGNsb2NrX3JhdGUsIG5lZWRfY2xvY2tfcmF0ZTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHJ0cGFtcmRlcGF5ID0gR1NUX1JUUF9BTVJfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgLyogZmlndXJlIG91dCB0aGUgbW9kZSBmaXJzdCBhbmQgc2V0IHRoZSBjbG9jayByYXRlcyAqLworICBpZiAoKHN0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZW5jb2RpbmctbmFtZSIpKSkgeworICAgIGlmIChzdHJjbXAgKHN0ciwgIkFNUiIpID09IDApIHsKKyAgICAgIHJ0cGFtcmRlcGF5LT5tb2RlID0gR1NUX1JUUF9BTVJfRFBfTU9ERV9OQjsKKyAgICAgIG5lZWRfY2xvY2tfcmF0ZSA9IDgwMDA7CisgICAgICB0eXBlID0gImF1ZGlvL0FNUiI7CisgICAgfSBlbHNlIGlmIChzdHJjbXAgKHN0ciwgIkFNUi1XQiIpID09IDApIHsKKyAgICAgIHJ0cGFtcmRlcGF5LT5tb2RlID0gR1NUX1JUUF9BTVJfRFBfTU9ERV9XQjsKKyAgICAgIG5lZWRfY2xvY2tfcmF0ZSA9IDE2MDAwOworICAgICAgdHlwZSA9ICJhdWRpby9BTVItV0IiOworICAgIH0gZWxzZQorICAgICAgZ290byBpbnZhbGlkX21vZGU7CisgIH0gZWxzZQorICAgIGdvdG8gaW52YWxpZF9tb2RlOworCisgIGlmICghKHN0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAib2N0ZXQtYWxpZ24iKSkpCisgICAgcnRwYW1yZGVwYXktPm9jdGV0X2FsaWduID0gRkFMU0U7CisgIGVsc2UKKyAgICBydHBhbXJkZXBheS0+b2N0ZXRfYWxpZ24gPSAoYXRvaSAoc3RyKSA9PSAxKTsKKworICBpZiAoIShzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImNyYyIpKSkKKyAgICBydHBhbXJkZXBheS0+Y3JjID0gRkFMU0U7CisgIGVsc2UKKyAgICBydHBhbXJkZXBheS0+Y3JjID0gKGF0b2kgKHN0cikgPT0gMSk7CisKKyAgaWYgKHJ0cGFtcmRlcGF5LT5jcmMpIHsKKyAgICAvKiBjcmMgbW9kZSBpbXBsaWVzIG9jdGV0IGFsaWduZWQgbW9kZSAqLworICAgIHJ0cGFtcmRlcGF5LT5vY3RldF9hbGlnbiA9IFRSVUU7CisgIH0KKworICBpZiAoIShzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgInJvYnVzdC1zb3J0aW5nIikpKQorICAgIHJ0cGFtcmRlcGF5LT5yb2J1c3Rfc29ydGluZyA9IEZBTFNFOworICBlbHNlCisgICAgcnRwYW1yZGVwYXktPnJvYnVzdF9zb3J0aW5nID0gKGF0b2kgKHN0cikgPT0gMSk7CisKKyAgaWYgKHJ0cGFtcmRlcGF5LT5yb2J1c3Rfc29ydGluZykgeworICAgIC8qIHJvYnVzdF9zb3J0aW5nIG1vZGUgaW1wbGllcyBvY3RldCBhbGlnbmVkIG1vZGUgKi8KKyAgICBydHBhbXJkZXBheS0+b2N0ZXRfYWxpZ24gPSBUUlVFOworICB9CisKKyAgaWYgKCEoc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJpbnRlcmxlYXZpbmciKSkpCisgICAgcnRwYW1yZGVwYXktPmludGVybGVhdmluZyA9IEZBTFNFOworICBlbHNlCisgICAgcnRwYW1yZGVwYXktPmludGVybGVhdmluZyA9IChhdG9pIChzdHIpID09IDEpOworCisgIGlmIChydHBhbXJkZXBheS0+aW50ZXJsZWF2aW5nKSB7CisgICAgLyogaW50ZXJsZWF2aW5nIG1vZGUgaW1wbGllcyBvY3RldCBhbGlnbmVkIG1vZGUgKi8KKyAgICBydHBhbXJkZXBheS0+b2N0ZXRfYWxpZ24gPSBUUlVFOworICB9CisKKyAgaWYgKCEocGFyYW1zID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJlbmNvZGluZy1wYXJhbXMiKSkpCisgICAgcnRwYW1yZGVwYXktPmNoYW5uZWxzID0gMTsKKyAgZWxzZSB7CisgICAgcnRwYW1yZGVwYXktPmNoYW5uZWxzID0gYXRvaSAocGFyYW1zKTsKKyAgfQorCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSBuZWVkX2Nsb2NrX3JhdGU7CisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgLyogd2UgcmVxdWlyZSAxIGNoYW5uZWwsIDgwMDAgSHosIG9jdGV0IGFsaWduZWQsIG5vIENSQywKKyAgICogbm8gcm9idXN0IHNvcnRpbmcsIG5vIGludGVybGVhdmluZyBmb3Igbm93ICovCisgIGlmIChydHBhbXJkZXBheS0+Y2hhbm5lbHMgIT0gMSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChjbG9ja19yYXRlICE9IG5lZWRfY2xvY2tfcmF0ZSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChydHBhbXJkZXBheS0+b2N0ZXRfYWxpZ24gIT0gVFJVRSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChydHBhbXJkZXBheS0+cm9idXN0X3NvcnRpbmcgIT0gRkFMU0UpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAocnRwYW1yZGVwYXktPmludGVybGVhdmluZyAhPSBGQUxTRSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKHR5cGUsCisgICAgICAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBydHBhbXJkZXBheS0+Y2hhbm5lbHMsCisgICAgICAicmF0ZSIsIEdfVFlQRV9JTlQsIGNsb2NrX3JhdGUsIE5VTEwpOworICByZXMgPSBnc3RfcGFkX3NldF9jYXBzIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NSQ1BBRCAoZGVwYXlsb2FkKSwgc3JjY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworaW52YWxpZF9tb2RlOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwYW1yZGVwYXksICJpbnZhbGlkIGVuY29kaW5nLW5hbWUiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogLTEgaXMgaW52YWxpZCAqLworc3RhdGljIGNvbnN0IGdpbnQgbmJfZnJhbWVfc2l6ZVsxNl0gPSB7CisgIDEyLCAxMywgMTUsIDE3LCAxOSwgMjAsIDI2LCAzMSwKKyAgNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMAorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgd2JfZnJhbWVfc2l6ZVsxNl0gPSB7CisgIDE3LCAyMywgMzIsIDM2LCA0MCwgNDYsIDUwLCA1OCwKKyAgNjAsIDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMAorfTsKKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX2Ftcl9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cEFNUkRlcGF5ICpydHBhbXJkZXBheTsKKyAgY29uc3QgZ2ludCAqZnJhbWVfc2l6ZTsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBnaW50IHBheWxvYWRfbGVuOworICBHc3RNYXBJbmZvIG1hcDsKKworICBydHBhbXJkZXBheSA9IEdTVF9SVFBfQU1SX0RFUEFZIChkZXBheWxvYWQpOworCisgIC8qIHNldHVwIGZyYW1lIHNpemUgcG9pbnRlciAqLworICBpZiAocnRwYW1yZGVwYXktPm1vZGUgPT0gR1NUX1JUUF9BTVJfRFBfTU9ERV9OQikKKyAgICBmcmFtZV9zaXplID0gbmJfZnJhbWVfc2l6ZTsKKyAgZWxzZQorICAgIGZyYW1lX3NpemUgPSB3Yl9mcmFtZV9zaXplOworCisgIC8qIHdoZW4gd2UgZ2V0IGhlcmUsIDEgY2hhbm5lbCwgODAwMC8xNjAwMCBIeiwgb2N0ZXQgYWxpZ25lZCwgbm8gQ1JDLAorICAgKiBubyByb2J1c3Qgc29ydGluZywgbm8gaW50ZXJsZWF2aW5nIGRhdGEgaXMgdG8gYmUgZGVwYXlsb2FkZWQgKi8KKyAgeworICAgIGd1aW50OCAqcGF5bG9hZCwgKnAsICpkcDsKKyAgICBnaW50IGksIG51bV9wYWNrZXRzLCBudW1fbm9uZW1wdHlfcGFja2V0czsKKyAgICBnaW50IGFtcl9sZW47CisgICAgZ2ludCBJTEwsIElMUDsKKworICAgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworCisgICAgLyogbmVlZCBhdCBsZWFzdCAyIGJ5dGVzIGZvciB0aGUgaGVhZGVyICovCisgICAgaWYgKHBheWxvYWRfbGVuIDwgMikKKyAgICAgIGdvdG8gdG9vX3NtYWxsOworCisgICAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkIChydHApOworCisgICAgLyogZGVwYXkgQ01SLiBUaGUgQ01SIGlzIHVzZWQgYnkgdGhlIHNlbmRlciB0byByZXF1ZXN0CisgICAgICogYSBuZXcgZW5jb2RpbmcgbW9kZS4KKyAgICAgKgorICAgICAqICAwIDEgMiAzIDQgNSA2IDcKKyAgICAgKiArLSstKy0rLSstKy0rLSstKworICAgICAqIHwgQ01SICAgfFJ8UnxSfFJ8CisgICAgICogKy0rLSstKy0rLSstKy0rLSsKKyAgICAgKi8KKyAgICAvKiBDTVIgPSAocGF5bG9hZFswXSAmIDB4ZjApID4+IDQ7ICovCisKKyAgICAvKiBzdHJpcCBDTVIgaGVhZGVyIG5vdywgcGFjayBGVCBhbmQgdGhlIGRhdGEgZm9yIHRoZSBkZWNvZGVyICovCisgICAgcGF5bG9hZF9sZW4gLT0gMTsKKyAgICBwYXlsb2FkICs9IDE7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBhbXJkZXBheSwgInBheWxvYWQgbGVuICVkIiwgcGF5bG9hZF9sZW4pOworCisgICAgaWYgKHJ0cGFtcmRlcGF5LT5pbnRlcmxlYXZpbmcpIHsKKyAgICAgIElMTCA9IChwYXlsb2FkWzBdICYgMHhmMCkgPj4gNDsKKyAgICAgIElMUCA9IChwYXlsb2FkWzBdICYgMHgwZik7CisKKyAgICAgIHBheWxvYWRfbGVuIC09IDE7CisgICAgICBwYXlsb2FkICs9IDE7CisKKyAgICAgIGlmIChJTFAgPiBJTEwpCisgICAgICAgIGdvdG8gd3JvbmdfaW50ZXJsZWF2aW5nOworICAgIH0KKworICAgIC8qCisgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNgorICAgICAqICstKy0rLSstKy0rLSstKy0rLi4KKyAgICAgKiB8RnwgIEZUICAgfFF8UHxQfCBtb3JlIEZULi4KKyAgICAgKiArLSstKy0rLSstKy0rLSstKy4uCisgICAgICovCisgICAgLyogY291bnQgbnVtYmVyIG9mIHBhY2tldHMgYnkgY291bnRpbmcgdGhlIEZUcy4gQWxzbworICAgICAqIGNvdW50IG51bWJlciBvZiBhbXIgZGF0YSBieXRlcyBhbmQgbnVtYmVyIG9mIG5vbi1lbXB0eQorICAgICAqIHBhY2tldHMgKHRoaXMgaXMgYWxzbyB0aGUgbnVtYmVyIG9mIENSQ3MgaWYgcHJlc2VudCkuICovCisgICAgYW1yX2xlbiA9IDA7CisgICAgbnVtX25vbmVtcHR5X3BhY2tldHMgPSAwOworICAgIG51bV9wYWNrZXRzID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGF5bG9hZF9sZW47IGkrKykgeworICAgICAgZ2ludCBmcl9zaXplOworICAgICAgZ3VpbnQ4IEZUOworCisgICAgICBGVCA9IChwYXlsb2FkW2ldICYgMHg3OCkgPj4gMzsKKworICAgICAgZnJfc2l6ZSA9IGZyYW1lX3NpemVbRlRdOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwYW1yZGVwYXksICJmcmFtZSBzaXplICVkIiwgZnJfc2l6ZSk7CisgICAgICBpZiAoZnJfc2l6ZSA9PSAtMSkKKyAgICAgICAgZ290byB3cm9uZ19mcmFtZXNpemU7CisKKyAgICAgIGlmIChmcl9zaXplID4gMCkgeworICAgICAgICBhbXJfbGVuICs9IGZyX3NpemU7CisgICAgICAgIG51bV9ub25lbXB0eV9wYWNrZXRzKys7CisgICAgICB9CisgICAgICBudW1fcGFja2V0cysrOworCisgICAgICBpZiAoKHBheWxvYWRbaV0gJiAweDgwKSA9PSAwKQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocnRwYW1yZGVwYXktPmNyYykgeworICAgICAgLyogZGF0YSBsZW4gKyBDUkMgbGVuICsgaGVhZGVyIGJ5dGVzIHNob3VsZCBiZSBzbWFsbGVyIHRoYW4gcGF5bG9hZF9sZW4gKi8KKyAgICAgIGlmIChudW1fcGFja2V0cyArIG51bV9ub25lbXB0eV9wYWNrZXRzICsgYW1yX2xlbiA+IHBheWxvYWRfbGVuKQorICAgICAgICBnb3RvIHdyb25nX2xlbmd0aF8xOworICAgIH0gZWxzZSB7CisgICAgICAvKiBkYXRhIGxlbiArIGhlYWRlciBieXRlcyBzaG91bGQgYmUgc21hbGxlciB0aGFuIHBheWxvYWRfbGVuICovCisgICAgICBpZiAobnVtX3BhY2tldHMgKyBhbXJfbGVuID4gcGF5bG9hZF9sZW4pCisgICAgICAgIGdvdG8gd3JvbmdfbGVuZ3RoXzI7CisgICAgfQorCisgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChwYXlsb2FkX2xlbik7CisKKyAgICAvKiBwb2ludCB0byBkZXN0aW5hdGlvbiAqLworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworCisgICAgLyogcG9pbnQgdG8gZmlyc3QgZGF0YSBwYWNrZXQgKi8KKyAgICBwID0gbWFwLmRhdGE7CisgICAgZHAgPSBwYXlsb2FkICsgbnVtX3BhY2tldHM7CisgICAgaWYgKHJ0cGFtcmRlcGF5LT5jcmMpIHsKKyAgICAgIC8qIHNraXAgQ1JDIGlmIHByZXNlbnQgKi8KKyAgICAgIGRwICs9IG51bV9ub25lbXB0eV9wYWNrZXRzOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFja2V0czsgaSsrKSB7CisgICAgICBnaW50IGZyX3NpemU7CisKKyAgICAgIC8qIGNvcHkgRlQsIGNsZWFyIEYgYml0ICovCisgICAgICAqcCsrID0gcGF5bG9hZFtpXSAmIDB4N2Y7CisKKyAgICAgIGZyX3NpemUgPSBmcmFtZV9zaXplWyhwYXlsb2FkW2ldICYgMHg3OCkgPj4gM107CisgICAgICBpZiAoZnJfc2l6ZSA+IDApIHsKKyAgICAgICAgLyogY29weSBkYXRhIHBhY2tldCwgRklYTUUsIGNhbGMgQ1JDIGhlcmUuICovCisgICAgICAgIG1lbWNweSAocCwgZHAsIGZyX3NpemUpOworCisgICAgICAgIHAgKz0gZnJfc2l6ZTsKKyAgICAgICAgZHAgKz0gZnJfc2l6ZTsKKyAgICAgIH0KKyAgICB9CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICAgIC8qIHdlIGNhbiBzZXQgdGhlIGR1cmF0aW9uIGJlY2F1c2UgZWFjaCBwYWNrZXQgaXMgMjAgbWlsbGlzZWNvbmRzICovCisgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9IG51bV9wYWNrZXRzICogMjAgKiBHU1RfTVNFQ09ORDsKKworICAgIGlmIChnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApKSB7CisgICAgICAvKiBtYXJrZXIgYml0IG1hcmtzIGEgYnVmZmVyIGFmdGVyIGEgdGFsa3NwdXJ0LiAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAibWFya2VyIGJpdCB3YXMgc2V0Iik7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19SRVNZTkMpOworICAgIH0KKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgInB1c2hpbmcgYnVmZmVyIG9mIHNpemUgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZikpOworCisgICAgZ3N0X3J0cF9jb3B5X2F1ZGlvX21ldGEgKHJ0cGFtcmRlcGF5LCBvdXRidWYsIHJ0cC0+YnVmZmVyKTsKKyAgfQorCisgIHJldHVybiBvdXRidWY7CisKKyAgLyogRVJST1JTICovCit0b29fc21hbGw6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBhbXJkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJBTVIgUlRQIHBheWxvYWQgdG9vIHNtYWxsICglZCkiLCBwYXlsb2FkX2xlbikpOworICAgIGdvdG8gYmFkX3BhY2tldDsKKyAgfQord3JvbmdfaW50ZXJsZWF2aW5nOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwYW1yZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiQU1SIFJUUCB3cm9uZyBpbnRlcmxlYXZpbmciKSk7CisgICAgZ290byBiYWRfcGFja2V0OworICB9Cit3cm9uZ19mcmFtZXNpemU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBhbXJkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJBTVIgUlRQIGZyYW1lIHNpemUgPT0gLTEiKSk7CisgICAgZ290byBiYWRfcGFja2V0OworICB9Cit3cm9uZ19sZW5ndGhfMToKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cGFtcmRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIkFNUiBSVFAgd3JvbmcgbGVuZ3RoIDEiKSk7CisgICAgZ290byBiYWRfcGFja2V0OworICB9Cit3cm9uZ19sZW5ndGhfMjoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cGFtcmRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIkFNUiBSVFAgd3JvbmcgbGVuZ3RoIDIiKSk7CisgICAgZ290byBiYWRfcGFja2V0OworICB9CitiYWRfcGFja2V0OgorICB7CisgICAgLyogbm8gZmF0YWwgZXJyb3IgKi8KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3J0cF9hbXJfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBhbXJkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9BTVJfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiODA2MzQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmgKQEAgLTAsMCArMSw3NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0FNUl9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0FNUl9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9BTVJfREVQQVkgXAorICAoZ3N0X3J0cF9hbXJfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9BTVJfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfQU1SX0RFUEFZLEdzdFJ0cEFNUkRlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9BTVJfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0FNUl9ERVBBWSxHc3RSdHBBTVJEZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9BTVJfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfQU1SX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9BTVJfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0FNUl9ERVBBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBBTVJEZXBheSBHc3RSdHBBTVJEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBBTVJEZXBheUNsYXNzIEdzdFJ0cEFNUkRlcGF5Q2xhc3M7CisKK3R5cGVkZWYgZW51bSB7CisgIEdTVF9SVFBfQU1SX0RQX01PREVfSU5WQUxJRCA9IDAsCisgIEdTVF9SVFBfQU1SX0RQX01PREVfTkIgICAgICA9IDEsCisgIEdTVF9SVFBfQU1SX0RQX01PREVfV0IgICAgICA9IDIKK30gR3N0UnRwQU1SRGVwYXlNb2RlOworCitzdHJ1Y3QgX0dzdFJ0cEFNUkRlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworCisgIEdzdFJ0cEFNUkRlcGF5TW9kZSBtb2RlOworCisgIGdib29sZWFuIG9jdGV0X2FsaWduOworICBndWludDggICBtb2RlX3NldDsKKyAgZ2ludCAgICAgbW9kZV9jaGFuZ2VfcGVyaW9kOworICBnYm9vbGVhbiBtb2RlX2NoYW5nZV9uZWlnaGJvcjsKKyAgZ2ludCAgICAgbWF4cHRpbWU7CisgIGdib29sZWFuIGNyYzsKKyAgZ2Jvb2xlYW4gcm9idXN0X3NvcnRpbmc7CisgIGdib29sZWFuIGludGVybGVhdmluZzsKKyAgZ2ludCAgICAgcHRpbWU7CisgIGdpbnQgICAgIGNoYW5uZWxzOworfTsKKworc3RydWN0IF9Hc3RSdHBBTVJEZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX2Ftcl9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfYW1yX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0FNUl9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwYW1ycGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGFtcnBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNzBmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGFtcnBheS5jCkBAIC0wLDAgKzEsNDYzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwYW1ycGF5CisgKiBAc2VlX2Fsc286IHJ0cGFtcmRlcGF5CisgKgorICogUGF5bG9hZCBBTVIgYXVkaW8gaW50byBSVFAgcGFja2V0cyBhY2NvcmRpbmcgdG8gUkZDIDMyNjcuCisgKiBGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gc2VlOiBodHRwOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmMzMjY3LnR4dAorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBhdWRpb3Rlc3RzcmMgISBhbXJuYmVuYyAhIHJ0cGFtcnBheSAhIHVkcHNpbmsKKyAqIF18IFRoaXMgZXhhbXBsZSBwaXBlbGluZSB3aWxsIGVuY29kZSBhbmQgcGF5bG9hZCBhbiBBTVIgc3RyZWFtLiBSZWZlciB0bworICogdGhlIHJ0cGFtcmRlcGF5IGV4YW1wbGUgdG8gZGVwYXlsb2FkIGFuZCBkZWNvZGUgdGhlIFJUUCBzdHJlYW0uCisgKiA8L3JlZnNlY3QyPgorICovCisKKy8qIHJlZmVyZW5jZXM6CisgKgorICogUkZDIDMyNjcgLSBSZWFsLVRpbWUgVHJhbnNwb3J0IFByb3RvY29sIChSVFApIFBheWxvYWQgRm9ybWF0IGFuZCBGaWxlCisgKiAgICBTdG9yYWdlIEZvcm1hdCBmb3IgdGhlIEFkYXB0aXZlIE11bHRpLVJhdGUgKEFNUikgYW5kIEFkYXB0aXZlCisgKiAgICBNdWx0aS1SYXRlIFdpZGViYW5kIChBTVItV0IpIEF1ZGlvIENvZGVjcy4KKyAqCisgKiBFVFNJIFRTIDEyNiAyMDEgVjYuMC4wICgyMDA0LTEyKSAtIERpZ2l0YWwgY2VsbHVsYXIgdGVsZWNvbW11bmljYXRpb25zIHN5c3RlbSAoUGhhc2UgMispOworICogICAgICAgICAgICAgICAgIFVuaXZlcnNhbCBNb2JpbGUgVGVsZWNvbW11bmljYXRpb25zIFN5c3RlbSAoVU1UUyk7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQU1SIHNwZWVjaCBjb2RlYywgd2lkZWJhbmQ7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lIHN0cnVjdHVyZQorICogICAgICAgICAgICAgICAgICAgICgzR1BQIFRTIDI2LjIwMSB2ZXJzaW9uIDYuMC4wIFJlbGVhc2UgNikKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgImdzdHJ0cGFtcnBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cGFtcnBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwYW1ycGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9hbXJfcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL0FNUiwgY2hhbm5lbHM9KGludCkxLCByYXRlPShpbnQpODAwMDsgIgorICAgICAgICAiYXVkaW8vQU1SLVdCLCBjaGFubmVscz0oaW50KTEsIHJhdGU9KGludCkxNjAwMCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfYW1yX3BheV9zcmNfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMCwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiQU1SXCIsICIKKyAgICAgICAgImVuY29kaW5nLXBhcmFtcyA9IChzdHJpbmcpIFwiMVwiLCAiCisgICAgICAgICJvY3RldC1hbGlnbiA9IChzdHJpbmcpIFwiMVwiLCAiCisgICAgICAgICJjcmMgPSAoc3RyaW5nKSBcIjBcIiwgIgorICAgICAgICAicm9idXN0LXNvcnRpbmcgPSAoc3RyaW5nKSBcIjBcIiwgIgorICAgICAgICAiaW50ZXJsZWF2aW5nID0gKHN0cmluZykgXCIwXCIsICIKKyAgICAgICAgIm1vZGUtc2V0ID0gKGludCkgWyAwLCA3IF0sICIKKyAgICAgICAgIm1vZGUtY2hhbmdlLXBlcmlvZCA9IChpbnQpIFsgMSwgTUFYIF0sICIKKyAgICAgICAgIm1vZGUtY2hhbmdlLW5laWdoYm9yID0gKHN0cmluZykgeyBcIjBcIiwgXCIxXCIgfSwgIgorICAgICAgICAibWF4cHRpbWUgPSAoaW50KSBbIDIwLCBNQVggXSwgIiAicHRpbWUgPSAoaW50KSBbIDIwLCBNQVggXTsiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgMTYwMDAsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkFNUi1XQlwiLCAiCisgICAgICAgICJlbmNvZGluZy1wYXJhbXMgPSAoc3RyaW5nKSBcIjFcIiwgIgorICAgICAgICAib2N0ZXQtYWxpZ24gPSAoc3RyaW5nKSBcIjFcIiwgIgorICAgICAgICAiY3JjID0gKHN0cmluZykgXCIwXCIsICIKKyAgICAgICAgInJvYnVzdC1zb3J0aW5nID0gKHN0cmluZykgXCIwXCIsICIKKyAgICAgICAgImludGVybGVhdmluZyA9IChzdHJpbmcpIFwiMFwiLCAiCisgICAgICAgICJtb2RlLXNldCA9IChpbnQpIFsgMCwgNyBdLCAiCisgICAgICAgICJtb2RlLWNoYW5nZS1wZXJpb2QgPSAoaW50KSBbIDEsIE1BWCBdLCAiCisgICAgICAgICJtb2RlLWNoYW5nZS1uZWlnaGJvciA9IChzdHJpbmcpIHsgXCIwXCIsIFwiMVwiIH0sICIKKyAgICAgICAgIm1heHB0aW1lID0gKGludCkgWyAyMCwgTUFYIF0sICIgInB0aW1lID0gKGludCkgWyAyMCwgTUFYIF0iKQorICAgICk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2Ftcl9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX2Ftcl9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2Ftcl9wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKKyNkZWZpbmUgZ3N0X3J0cF9hbXJfcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cEFNUlBheSwgZ3N0X3J0cF9hbXJfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9QQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfYW1yX3BheV9jbGFzc19pbml0IChHc3RSdHBBTVJQYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfYW1yX3BheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9hbXJfcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfYW1yX3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUlRQIEFNUiBwYXlsb2FkZXIiLAorICAgICAgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZC1lbmNvZGUgQU1SIG9yIEFNUi1XQiBhdWRpbyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgMzI2NykiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9hbXJfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9hbXJfcGF5X2hhbmRsZV9idWZmZXI7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGFtcnBheV9kZWJ1ZywgInJ0cGFtcnBheSIsIDAsCisgICAgICAiQU1SL0FNUi1XQiBSVFAgUGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2Ftcl9wYXlfaW5pdCAoR3N0UnRwQU1SUGF5ICogcnRwYW1ycGF5KQoreworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9hbXJfcGF5X3Jlc2V0IChHc3RSdHBBTVJQYXkgKiBwYXkpCit7CisgIHBheS0+bmV4dF9ydHBfdGltZSA9IDA7CisgIHBheS0+Zmlyc3RfdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBwYXktPmZpcnN0X3J0cF90aW1lID0gMDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2Ftcl9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFJ0cEFNUlBheSAqcnRwYW1ycGF5OworICBnYm9vbGVhbiByZXM7CisgIGNvbnN0IEdzdFN0cnVjdHVyZSAqczsKKyAgY29uc3QgZ2NoYXIgKnN0cjsKKworICBydHBhbXJwYXkgPSBHU1RfUlRQX0FNUl9QQVkgKGJhc2VwYXlsb2FkKTsKKworICAvKiBmaWd1cmUgb3V0IHRoZSBtb2RlIE5hcnJvdyBvciBXaWRlYmFuZCAqLworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGlmICgoc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocykpKSB7CisgICAgaWYgKHN0cmNtcCAoc3RyLCAiYXVkaW8vQU1SIikgPT0gMCkKKyAgICAgIHJ0cGFtcnBheS0+bW9kZSA9IEdTVF9SVFBfQU1SX1BfTU9ERV9OQjsKKyAgICBlbHNlIGlmIChzdHJjbXAgKHN0ciwgImF1ZGlvL0FNUi1XQiIpID09IDApCisgICAgICBydHBhbXJwYXktPm1vZGUgPSBHU1RfUlRQX0FNUl9QX01PREVfV0I7CisgICAgZWxzZQorICAgICAgZ290byB3cm9uZ190eXBlOworICB9IGVsc2UKKyAgICBnb3RvIHdyb25nX3R5cGU7CisKKyAgaWYgKHJ0cGFtcnBheS0+bW9kZSA9PSBHU1RfUlRQX0FNUl9QX01PREVfTkIpCisgICAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKGJhc2VwYXlsb2FkLCAiYXVkaW8iLCBUUlVFLCAiQU1SIiwgODAwMCk7CisgIGVsc2UKKyAgICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAoYmFzZXBheWxvYWQsICJhdWRpbyIsIFRSVUUsICJBTVItV0IiLAorICAgICAgICAxNjAwMCk7CisKKyAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLAorICAgICAgImVuY29kaW5nLXBhcmFtcyIsIEdfVFlQRV9TVFJJTkcsICIxIiwgIm9jdGV0LWFsaWduIiwgR19UWVBFX1NUUklORywgIjEiLAorICAgICAgLyogZG9uJ3Qgc2V0IHRoZSBkZWZhdWx0cworICAgICAgICoKKyAgICAgICAqICJjcmMiLCBHX1RZUEVfU1RSSU5HLCAiMCIsCisgICAgICAgKiAicm9idXN0LXNvcnRpbmciLCBHX1RZUEVfU1RSSU5HLCAiMCIsCisgICAgICAgKiAiaW50ZXJsZWF2aW5nIiwgR19UWVBFX1NUUklORywgIjAiLAorICAgICAgICovCisgICAgICBOVUxMKTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLword3JvbmdfdHlwZToKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGFtcnBheSwgInVuc3VwcG9ydGVkIG1lZGlhIHR5cGUgJyVzJyIsCisgICAgICAgIEdTVF9TVFJfTlVMTCAoc3RyKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2Ftcl9wYXlfcmVjYWxjX3J0cF90aW1lIChHc3RSdHBBTVJQYXkgKiBydHBhbXJwYXksCisgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCkKK3sKKyAgLyogcmUtc3luYyBydHAgdGltZSAqLworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHJ0cGFtcnBheS0+Zmlyc3RfdHMpICYmCisgICAgICBHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAodGltZXN0YW1wKSAmJiB0aW1lc3RhbXAgPj0gcnRwYW1ycGF5LT5maXJzdF90cykgeworICAgIEdzdENsb2NrVGltZSBkaWZmOworICAgIGd1aW50MzIgcnRwZGlmZjsKKworICAgIC8qIGludGVycG9sYXRlIHRvIHJlcHJvZHVjZSBnYXAgZnJvbSBzdGFydCwgcmF0aGVyIHRoYW4gaW50ZXJtZWRpYXRlCisgICAgICogaW50ZXJ2YWxzIHRvIGF2b2lkIHJvdW5kdXAgYWNjdW11bGF0aW9uIGVycm9ycyAqLworICAgIGRpZmYgPSB0aW1lc3RhbXAgLSBydHBhbXJwYXktPmZpcnN0X3RzOworICAgIHJ0cGRpZmYgPSAoKGRpZmYgLyBHU1RfTVNFQ09ORCkgKiA4KSA8PAorICAgICAgICAocnRwYW1ycGF5LT5tb2RlID09IEdTVF9SVFBfQU1SX1BfTU9ERV9XQik7CisgICAgcnRwYW1ycGF5LT5uZXh0X3J0cF90aW1lID0gcnRwYW1ycGF5LT5maXJzdF9ydHBfdGltZSArIHJ0cGRpZmY7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwYW1ycGF5LAorICAgICAgICAiZWxhcHNlZCB0aW1lICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBydHAgJSIgR19HVUlOVDMyX0ZPUk1BVCAiLCAiCisgICAgICAgICJuZXcgb2Zmc2V0ICUiIEdfR1VJTlQzMl9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGRpZmYpLCBydHBkaWZmLAorICAgICAgICBydHBhbXJwYXktPm5leHRfcnRwX3RpbWUpOworICB9Cit9CisKKy8qIC0xIGlzIGludmFsaWQgKi8KK3N0YXRpYyBjb25zdCBnaW50IG5iX2ZyYW1lX3NpemVbMTZdID0geworICAxMiwgMTMsIDE1LCAxNywgMTksIDIwLCAyNiwgMzEsCisgIDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAKK307CisKK3N0YXRpYyBjb25zdCBnaW50IHdiX2ZyYW1lX3NpemVbMTZdID0geworICAxNywgMjMsIDMyLCAzNiwgNDAsIDQ2LCA1MCwgNTgsCisgIDYwLCA1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAKK307CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2Ftcl9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJ0cEFNUlBheSAqcnRwYW1ycGF5OworICBjb25zdCBnaW50ICpmcmFtZV9zaXplOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ3VpbnQgcGF5bG9hZF9sZW47CisgIEdzdE1hcEluZm8gbWFwOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ3VpbnQ4ICpwYXlsb2FkLCAqcHRyLCAqcGF5bG9hZF9hbXI7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIGR1cmF0aW9uOworICBndWludCBwYWNrZXRfbGVuLCBtdHU7CisgIGdpbnQgaSwgbnVtX3BhY2tldHMsIG51bV9ub25lbXB0eV9wYWNrZXRzOworICBnaW50IGFtcl9sZW47CisgIGdib29sZWFuIHNpZCA9IEZBTFNFOworICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisKKyAgcnRwYW1ycGF5ID0gR1NUX1JUUF9BTVJfUEFZIChiYXNlcGF5bG9hZCk7CisgIG10dSA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEX01UVSAocnRwYW1ycGF5KTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworICBkdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcik7CisKKyAgLyogc2V0dXAgZnJhbWUgc2l6ZSBwb2ludGVyICovCisgIGlmIChydHBhbXJwYXktPm1vZGUgPT0gR1NUX1JUUF9BTVJfUF9NT0RFX05CKQorICAgIGZyYW1lX3NpemUgPSBuYl9mcmFtZV9zaXplOworICBlbHNlCisgICAgZnJhbWVfc2l6ZSA9IHdiX2ZyYW1lX3NpemU7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXBheWxvYWQsICJnb3QgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyIsIG1hcC5zaXplKTsKKworICAvKiBGSVhNRSwgb25seQorICAgKiBvY3RldCBhbGlnbmVkLCBubyBpbnRlcmxlYXZpbmcsIHNpbmdsZSBjaGFubmVsLCBubyBDUkMsCisgICAqIG5vIHJvYnVzdC1zb3J0aW5nLiBUbyBmaXggdGhpcyB5b3UgbmVlZCB0byBpbXBsZW1lbnQgdGhlIGRvd25zdHJlYW0KKyAgICogbmVnb3RpYXRpb24gZnVuY3Rpb24uICovCisKKyAgLyogZmlyc3QgY291bnQgbnVtYmVyIG9mIHBhY2tldHMgYW5kIHRvdGFsIGFtciBmcmFtZSBzaXplICovCisgIGFtcl9sZW4gPSBudW1fcGFja2V0cyA9IG51bV9ub25lbXB0eV9wYWNrZXRzID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IG1hcC5zaXplOyBpKyspIHsKKyAgICBndWludDggRlQ7CisgICAgZ2ludCBmcl9zaXplOworCisgICAgRlQgPSAobWFwLmRhdGFbaV0gJiAweDc4KSA+PiAzOworCisgICAgZnJfc2l6ZSA9IGZyYW1lX3NpemVbRlRdOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLCAiZnJhbWUgdHlwZSAlZCwgZnJhbWUgc2l6ZSAlZCIsIEZULCBmcl9zaXplKTsKKyAgICAvKiBGSVhNRSwgd2UgZG9uJ3QgaGFuZGxlIHRoaXMgeWV0Li4gKi8KKyAgICBpZiAoZnJfc2l6ZSA8PSAwKQorICAgICAgZ290byB3cm9uZ19zaXplOworCisgICAgaWYgKGZyX3NpemUgPT0gNSkKKyAgICAgIHNpZCA9IFRSVUU7CisKKyAgICBhbXJfbGVuICs9IGZyX3NpemU7CisgICAgbnVtX25vbmVtcHR5X3BhY2tldHMrKzsKKyAgICBudW1fcGFja2V0cysrOworICAgIGkgKz0gZnJfc2l6ZTsKKyAgfQorICBpZiAoYW1yX2xlbiA+IG1hcC5zaXplKQorICAgIGdvdG8gaW5jb21wbGV0ZV9mcmFtZTsKKworICAvKiB3ZSBuZWVkIG9uZSBleHRyYSBieXRlIGZvciB0aGUgQ01SLCB0aGUgVG9DIGlzIGluIHRoZSBpbnB1dAorICAgKiBkYXRhICovCisgIHBheWxvYWRfbGVuID0gbWFwLnNpemUgKyAxOworCisgIC8qIGdldCBwYWNrZXQgbGVuIHRvIGNoZWNrIGFnYWluc3QgTVRVICovCisgIHBhY2tldF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BhY2tldF9sZW4gKHBheWxvYWRfbGVuLCAwLCAwKTsKKyAgaWYgKHBhY2tldF9sZW4gPiBtdHUpCisgICAgZ290byB0b29fYmlnOworCisgIC8qIG5vdyBhbGxvYyBvdXRwdXQgYnVmZmVyICovCisgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAocGF5bG9hZF9sZW4sIDAsIDApOworCisgIGdzdF9ydHBfYnVmZmVyX21hcCAob3V0YnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKworICAvKiBjb3B5IHRpbWVzdGFtcCAqLworICBHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSA9IHRpbWVzdGFtcDsKKworICBpZiAoZHVyYXRpb24gIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gZHVyYXRpb247CisgIGVsc2UgeworICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPSBudW1fcGFja2V0cyAqIDIwICogR1NUX01TRUNPTkQ7CisgIH0KKworICBpZiAoR1NUX0JVRkZFUl9JU19ESVNDT05UIChidWZmZXIpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXBheWxvYWQsICJkaXNjb250LCBzZXR0aW5nIG1hcmtlciBiaXQiKTsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBUUlVFKTsKKyAgICBnc3RfcnRwX2Ftcl9wYXlfcmVjYWxjX3J0cF90aW1lIChydHBhbXJwYXksIHRpbWVzdGFtcCk7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoc2lkKSkgeworICAgIGdzdF9ydHBfYW1yX3BheV9yZWNhbGNfcnRwX3RpbWUgKHJ0cGFtcnBheSwgdGltZXN0YW1wKTsKKyAgfQorCisgIC8qIHBlcmZlY3QgcnRwdGltZSAqLworICBpZiAoR19VTkxJS0VMWSAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChydHBhbXJwYXktPmZpcnN0X3RzKSkpIHsKKyAgICBydHBhbXJwYXktPmZpcnN0X3RzID0gdGltZXN0YW1wOworICAgIHJ0cGFtcnBheS0+Zmlyc3RfcnRwX3RpbWUgPSBydHBhbXJwYXktPm5leHRfcnRwX3RpbWU7CisgIH0KKyAgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZikgPSBydHBhbXJwYXktPm5leHRfcnRwX3RpbWU7CisgIHJ0cGFtcnBheS0+bmV4dF9ydHBfdGltZSArPQorICAgICAgKG51bV9wYWNrZXRzICogMTYwKSA8PCAocnRwYW1ycGF5LT5tb2RlID09IEdTVF9SVFBfQU1SX1BfTU9ERV9XQik7CisKKyAgLyogZ2V0IHBheWxvYWQsIHRoaXMgaXMgbm93IHdyaXRhYmxlICovCisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisKKyAgLyogICAwIDEgMiAzIDQgNSA2IDcKKyAgICogICstKy0rLSstKy0rLSstKy0rCisgICAqICB8ICBDTVIgIHxSfFJ8UnxSfAorICAgKiAgKy0rLSstKy0rLSstKy0rLSsKKyAgICovCisgIHBheWxvYWRbMF0gPSAweEYwOyAgICAgICAgICAgIC8qIENNUiwgbm8gc3BlY2lmaWMgbW9kZSByZXF1ZXN0ZWQgKi8KKworICAvKiB0aGlzIGlzIHdoZXJlIHdlIGNvcHkgdGhlIEFNUiBkYXRhLCBhZnRlciBudW1fcGFja2V0cyBGVHMgYW5kIHRoZQorICAgKiBDTVIuICovCisgIHBheWxvYWRfYW1yID0gcGF5bG9hZCArIG51bV9wYWNrZXRzICsgMTsKKworICAvKiBjb3B5IGRhdGEgaW4gcGF5bG9hZCwgZmlyc3Qgd2UgY29weSBhbGwgdGhlIEZUcyB0aGVuIGFsbAorICAgKiB0aGUgQU1SIGRhdGEuIFRoZSBsYXN0IEZUIGhhcyB0byBoYXZlIHRoZSBGIGZsYWcgY2xlYXJlZC4gKi8KKyAgcHRyID0gbWFwLmRhdGE7CisgIGZvciAoaSA9IDE7IGkgPD0gbnVtX3BhY2tldHM7IGkrKykgeworICAgIGd1aW50OCBGVDsKKyAgICBnaW50IGZyX3NpemU7CisKKyAgICAvKiAgIDAgMSAyIDMgNCA1IDYgNworICAgICAqICArLSstKy0rLSstKy0rLSstKworICAgICAqICB8RnwgIEZUICAgfFF8UHxQfCBtb3JlIEZULi4uCisgICAgICogICstKy0rLSstKy0rLSstKy0rCisgICAgICovCisgICAgRlQgPSAoKnB0ciAmIDB4NzgpID4+IDM7CisKKyAgICBmcl9zaXplID0gZnJhbWVfc2l6ZVtGVF07CisKKyAgICBpZiAoaSA9PSBudW1fcGFja2V0cykKKyAgICAgIC8qIGxhc3QgcGFja2V0LCBjbGVhciBGIGZsYWcgKi8KKyAgICAgIHBheWxvYWRbaV0gPSAqcHRyICYgMHg3ZjsKKyAgICBlbHNlCisgICAgICAvKiBzZXQgRiBmbGFnICovCisgICAgICBwYXlsb2FkW2ldID0gKnB0ciB8IDB4ODA7CisKKyAgICBtZW1jcHkgKHBheWxvYWRfYW1yLCAmcHRyWzFdLCBmcl9zaXplKTsKKworICAgIC8qIGFsbCBzaXplcyBhcmUgPiAwIHNpbmNlIHdlIGNoZWNrZWQgZm9yIHRoYXQgYWJvdmUgKi8KKyAgICBwdHIgKz0gZnJfc2l6ZSArIDE7CisgICAgcGF5bG9hZF9hbXIgKz0gZnJfc2l6ZTsKKyAgfQorCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICBnc3RfcnRwX2NvcHlfYXVkaW9fbWV0YSAocnRwYW1ycGF5LCBvdXRidWYsIGJ1ZmZlcik7CisKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoIChiYXNlcGF5bG9hZCwgb3V0YnVmKTsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLword3Jvbmdfc2l6ZToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChiYXNlcGF5bG9hZCwgU1RSRUFNLCBGT1JNQVQsCisgICAgICAgIChOVUxMKSwgKCJyZWNlaXZlZCBBTVIgZnJhbWUgd2l0aCBzaXplIDw9IDAiKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CitpbmNvbXBsZXRlX2ZyYW1lOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGJhc2VwYXlsb2FkLCBTVFJFQU0sIEZPUk1BVCwKKyAgICAgICAgKE5VTEwpLCAoInJlY2VpdmVkIGluY29tcGxldGUgQU1SIGZyYW1lcyIpKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK3Rvb19iaWc6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYmFzZXBheWxvYWQsIFNUUkVBTSwgRk9STUFULAorICAgICAgICAoTlVMTCksICgicmVjZWl2ZWQgdG9vIG1hbnkgQU1SIGZyYW1lcyBmb3IgTVRVIikpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfYW1yX3BheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1M7CisKKyAgLyogaGFuZGxlIHVwd2FyZHMgc3RhdGUgY2hhbmdlcyBoZXJlICovCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIC8qIGhhbmRsZSBkb3dud2FyZHMgc3RhdGUgY2hhbmdlcyAqLworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3J0cF9hbXJfcGF5X3Jlc2V0IChHU1RfUlRQX0FNUl9QQVkgKGVsZW1lbnQpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2Ftcl9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBhbXJwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfQU1SX1BBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGFtcnBheS5oIGIvZ3N0L3J0cC9nc3RydHBhbXJwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2RmMWNlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBhbXJwYXkuaApAQCAtMCwwICsxLDcwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfQU1SX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0FNUl9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9BTVJfUEFZIFwKKyAgKGdzdF9ydHBfYW1yX3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0FNUl9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfQU1SX1BBWSxHc3RSdHBBTVJQYXkpKQorI2RlZmluZSBHU1RfUlRQX0FNUl9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0FNUl9QQVksR3N0UnRwQU1SUGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0FNUl9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfQU1SX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfQU1SX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfQU1SX1BBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBBTVJQYXkgR3N0UnRwQU1SUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEFNUlBheUNsYXNzIEdzdFJ0cEFNUlBheUNsYXNzOworCit0eXBlZGVmIGVudW0geworICBHU1RfUlRQX0FNUl9QX01PREVfSU5WQUxJRCA9IDAsCisgIEdTVF9SVFBfQU1SX1BfTU9ERV9OQiAgICAgID0gMSwKKyAgR1NUX1JUUF9BTVJfUF9NT0RFX1dCICAgICAgPSAyCit9IEdzdFJ0cEFNUlBheU1vZGU7CisKK3N0cnVjdCBfR3N0UnRwQU1SUGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkIHBheWxvYWQ7CisKKyAgR3N0UnRwQU1SUGF5TW9kZSBtb2RlOworICBHc3RDbG9ja1RpbWUgZmlyc3RfdHM7CisgIGd1aW50MzIgZmlyc3RfcnRwX3RpbWU7CisgIGd1aW50MzIgbmV4dF9ydHBfdGltZTsKK307CisKK3N0cnVjdCBfR3N0UnRwQU1SUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX2Ftcl9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2Ftcl9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfQU1SX1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwYnZkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBidmRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBmYWY4MwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwYnZkZXBheS5jCkBAIC0wLDAgKzEsMTkwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwYnZkZXBheQorICogQHNlZV9hbHNvOiBydHBidnBheQorICoKKyAqIEV4dHJhY3QgQnJvYWRjb21Wb2ljZSBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIGFjY29yZGluZyB0byBSRkMgNDI5OC4KKyAqIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBzZWU6IGh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzQyOTgudHh0CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSAiZ3N0cnRwYnZkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2J2X2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDAsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkJWMTZcIjsgIgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgMTYwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkJWMzJcIiIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfYnZfZGVwYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LWJ2LCAiICJtb2RlID0gKGludCkgeyAxNiwgMzIgfSIpCisgICAgKTsKKworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9idl9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9idl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworI2RlZmluZSBnc3RfcnRwX2J2X2RlcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJUUEJWRGVwYXksIGdzdF9ydHBfYnZfZGVwYXksIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2J2X2RlcGF5X2NsYXNzX2luaXQgKEdzdFJUUEJWRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9idl9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2J2X2RlcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIEJyb2FkY29tVm9pY2UgZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIEJyb2FkY29tVm9pY2UgYXVkaW8gZnJvbSBSVFAgcGFja2V0cyAoUkZDIDQyOTgpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPiIpOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfYnZfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2J2X2RlcGF5X3NldGNhcHM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2J2X2RlcGF5X2luaXQgKEdzdFJUUEJWRGVwYXkgKiBydHBidmRlcGF5KQoreworICBydHBidmRlcGF5LT5tb2RlID0gLTE7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9idl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UlRQQlZEZXBheSAqcnRwYnZkZXBheSA9IEdTVF9SVFBfQlZfREVQQVkgKGRlcGF5bG9hZCk7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBjb25zdCBnY2hhciAqbW9kZV9zdHIgPSBOVUxMOworICBnaW50IG1vZGUsIGNsb2NrX3JhdGUsIGV4cGVjdGVkX3JhdGU7CisgIGdib29sZWFuIHJldDsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBtb2RlX3N0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZW5jb2RpbmctbmFtZSIpOworICBpZiAoIW1vZGVfc3RyKQorICAgIGdvdG8gbm9fbW9kZTsKKworICBpZiAoIXN0cmNtcCAobW9kZV9zdHIsICJCVjE2IikpIHsKKyAgICBtb2RlID0gMTY7CisgICAgZXhwZWN0ZWRfcmF0ZSA9IDgwMDA7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAobW9kZV9zdHIsICJCVjMyIikpIHsKKyAgICBtb2RlID0gMzI7CisgICAgZXhwZWN0ZWRfcmF0ZSA9IDE2MDAwOworICB9IGVsc2UKKyAgICBnb3RvIGludmFsaWRfbW9kZTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkKKyAgICBjbG9ja19yYXRlID0gZXhwZWN0ZWRfcmF0ZTsKKyAgZWxzZSBpZiAoY2xvY2tfcmF0ZSAhPSBleHBlY3RlZF9yYXRlKQorICAgIGdvdG8gd3JvbmdfcmF0ZTsKKworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworICBydHBidmRlcGF5LT5tb2RlID0gbW9kZTsKKworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtYnYiLAorICAgICAgIm1vZGUiLCBHX1RZUEVfSU5ULCBydHBidmRlcGF5LT5tb2RlLCBOVUxMKTsKKyAgcmV0ID0gZ3N0X3BhZF9zZXRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKGRlcGF5bG9hZCksIHNyY2NhcHMpOworCisgIEdTVF9ERUJVRyAoInNldCBjYXBzIG9uIHNvdXJjZTogJSIgR1NUX1BUUl9GT1JNQVQgIiAocmV0PSVkKSIsIHNyY2NhcHMsIHJldCk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworbm9fbW9kZToKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGJ2ZGVwYXksICJkaWQgbm90IHJlY2VpdmUgYW4gZW5jb2RpbmctbmFtZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQoraW52YWxpZF9tb2RlOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwYnZkZXBheSwKKyAgICAgICAgImludmFsaWQgZW5jb2RpbmctbmFtZSwgZXhwZWN0ZWQgQlYxNiBvciBCVjMyLCBnb3QgJXMiLCBtb2RlX3N0cik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit3cm9uZ19yYXRlOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwYnZkZXBheSwgImludmFsaWQgY2xvY2stcmF0ZSwgZXhwZWN0ZWQgJWQsIGdvdCAlZCIsCisgICAgICAgIGV4cGVjdGVkX3JhdGUsIGNsb2NrX3JhdGUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfYnZfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ2Jvb2xlYW4gbWFya2VyOworCisgIG1hcmtlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCk7CisKKyAgR1NUX0RFQlVHICgicHJvY2VzcyA6IGdvdCAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzLCBtYXJrICVkIHRzICV1IHNlcW4gJWQiLAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAocnRwLT5idWZmZXIpLCBtYXJrZXIsCisgICAgICBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wIChydHApLCBnc3RfcnRwX2J1ZmZlcl9nZXRfc2VxIChydHApKTsKKworICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9idWZmZXIgKHJ0cCk7CisKKyAgaWYgKG1hcmtlciAmJiBvdXRidWYpIHsKKyAgICAvKiBtYXJrIHN0YXJ0IG9mIHRhbGtzcHVydCB3aXRoIFJFU1lOQyAqLworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX1JFU1lOQyk7CisgIH0KKworICBpZiAob3V0YnVmKSB7CisgICAgZ3N0X3J0cF9kcm9wX25vbl9hdWRpb19tZXRhIChkZXBheWxvYWQsIG91dGJ1Zik7CisgIH0KKworICByZXR1cm4gb3V0YnVmOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9idl9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGJ2ZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfQlZfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBidmRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTMwNjgyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBidmRlcGF5LmgKQEAgLTAsMCArMSw2MCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0JWX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfQlZfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUEJWRGVwYXkgR3N0UlRQQlZEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBCVkRlcGF5Q2xhc3MgR3N0UlRQQlZEZXBheUNsYXNzOworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9CVl9ERVBBWSBcCisgIChnc3RfcnRwX2J2X2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfQlZfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfQlZfREVQQVksR3N0UlRQQlZEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfQlZfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0JWX0RFUEFZLEdzdFJUUEJWRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfQlZfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfQlZfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0JWX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9CVl9ERVBBWSkpCisKK3N0cnVjdCBfR3N0UlRQQlZEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKKworICBnaW50IG1vZGU7Cit9OworCitzdHJ1Y3QgX0dzdFJUUEJWRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9idl9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfYnZfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfQlZfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGJ2cGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGJ2cGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwMjAxNQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwYnZwYXkuYwpAQCAtMCwwICsxLDIzOSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cGJ2cGF5CisgKiBAc2VlX2Fsc286IHJ0cGJ2ZGVwYXkKKyAqCisgKiBQYXlsb2FkIEJyb2FkY29tVm9pY2UgYXVkaW8gaW50byBSVFAgcGFja2V0cyBhY2NvcmRpbmcgdG8gUkZDIDQyOTguCisgKiBGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gc2VlOiBodHRwOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM0Mjk4LnR4dAorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgImdzdHJ0cGJ2cGF5LmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cGJ2cGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBidnBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfYnZfcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1idiwgIiAibW9kZSA9IChpbnQpIHsxNiwgMzJ9IikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9idl9wYXlfc3JjX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDAsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkJWMTZcIjsiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgMTYwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkJWMzJcIiIpCisgICAgKTsKKworCitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3J0cF9idl9wYXlfc2lua19nZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0UGFkICogcGFkLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2J2X3BheV9zaW5rX3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CisKKyNkZWZpbmUgZ3N0X3J0cF9idl9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UlRQQlZQYXksIGdzdF9ydHBfYnZfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9BVURJT19QQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfYnZfcGF5X2NsYXNzX2luaXQgKEdzdFJUUEJWUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzICpnc3RydHBiYXNlcGF5bG9hZF9jbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwYnZwYXlfZGVidWcsICJydHBidnBheSIsIDAsCisgICAgICAiQnJvYWRjb21Wb2ljZSBhdWRpbyBSVFAgcGF5bG9hZGVyIik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9idl9wYXlfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfYnZfcGF5X3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlJUUCBCViBQYXlsb2FkZXIiLAorICAgICAgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGFja2V0aXplIEJyb2FkY29tVm9pY2UgYXVkaW8gc3RyZWFtcyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgNDI5OCkiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9idl9wYXlfc2lua19zZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+Z2V0X2NhcHMgPSBnc3RfcnRwX2J2X3BheV9zaW5rX2dldGNhcHM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2J2X3BheV9pbml0IChHc3RSVFBCVlBheSAqIHJ0cGJ2cGF5KQoreworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkICpydHBiYXNlYXVkaW9wYXlsb2FkOworCisgIHJ0cGJhc2VhdWRpb3BheWxvYWQgPSBHU1RfUlRQX0JBU0VfQVVESU9fUEFZTE9BRCAocnRwYnZwYXkpOworCisgIHJ0cGJ2cGF5LT5tb2RlID0gLTE7CisKKyAgLyogdGVsbCBydHBiYXNlYXVkaW9wYXlsb2FkIHRoYXQgdGhpcyBpcyBhIGZyYW1lIGJhc2VkIGNvZGVjICovCisgIGdzdF9ydHBfYmFzZV9hdWRpb19wYXlsb2FkX3NldF9mcmFtZV9iYXNlZCAocnRwYmFzZWF1ZGlvcGF5bG9hZCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9idl9wYXlfc2lua19zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHJ0cGJhc2VwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UlRQQlZQYXkgKnJ0cGJ2cGF5OworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkICpydHBiYXNlYXVkaW9wYXlsb2FkOworICBnaW50IG1vZGU7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBjb25zdCBjaGFyICpwYXlsb2FkX25hbWU7CisKKyAgcnRwYnZwYXkgPSBHU1RfUlRQX0JWX1BBWSAocnRwYmFzZXBheWxvYWQpOworICBydHBiYXNlYXVkaW9wYXlsb2FkID0gR1NUX1JUUF9CQVNFX0FVRElPX1BBWUxPQUQgKHJ0cGJhc2VwYXlsb2FkKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBwYXlsb2FkX25hbWUgPSBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzdHJ1Y3R1cmUpOworICBpZiAoZ19hc2NpaV9zdHJjYXNlY21wICgiYXVkaW8veC1idiIsIHBheWxvYWRfbmFtZSkpCisgICAgZ290byB3cm9uZ19jYXBzOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJtb2RlIiwgJm1vZGUpKQorICAgIGdvdG8gbm9fbW9kZTsKKworICBpZiAobW9kZSAhPSAxNiAmJiBtb2RlICE9IDMyKQorICAgIGdvdG8gd3JvbmdfbW9kZTsKKworICBpZiAobW9kZSA9PSAxNikgeworICAgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChydHBiYXNlcGF5bG9hZCwgImF1ZGlvIiwgVFJVRSwgIkJWMTYiLAorICAgICAgICA4MDAwKTsKKyAgICBydHBiYXNlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IDgwMDA7CisgIH0gZWxzZSB7CisgICAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHJ0cGJhc2VwYXlsb2FkLCAiYXVkaW8iLCBUUlVFLCAiQlYzMiIsCisgICAgICAgIDE2MDAwKTsKKyAgICBydHBiYXNlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IDE2MDAwOworICB9CisKKyAgLyogc2V0IG9wdGlvbnMgZm9yIHRoaXMgZnJhbWUgYmFzZWQgYXVkaW8gY29kZWMgKi8KKyAgZ3N0X3J0cF9iYXNlX2F1ZGlvX3BheWxvYWRfc2V0X2ZyYW1lX29wdGlvbnMgKHJ0cGJhc2VhdWRpb3BheWxvYWQsCisgICAgICBtb2RlLCBtb2RlID09IDE2ID8gMTAgOiAyMCk7CisKKyAgaWYgKG1vZGUgIT0gcnRwYnZwYXktPm1vZGUgJiYgcnRwYnZwYXktPm1vZGUgIT0gLTEpCisgICAgZ290byBtb2RlX2NoYW5nZWQ7CisKKyAgcnRwYnZwYXktPm1vZGUgPSBtb2RlOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLword3JvbmdfY2FwczoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGJ2cGF5LCAiZXhwZWN0ZWQgYXVkaW8veC1idiwgcmVjZWl2ZWQgJXMiLAorICAgICAgICBwYXlsb2FkX25hbWUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fbW9kZToKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGJ2cGF5LCAiZGlkIG5vdCByZWNlaXZlIGEgbW9kZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQord3JvbmdfbW9kZToKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGJ2cGF5LCAibW9kZSBtdXN0IGJlIDE2IG9yIDMyLCByZWNlaXZlZCAlZCIsIG1vZGUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbW9kZV9jaGFuZ2VkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwYnZwYXksICJNb2RlIGhhcyBjaGFuZ2VkIGZyb20gJWQgdG8gJWQhICIKKyAgICAgICAgIk1vZGUgY2Fubm90IGNoYW5nZSB3aGlsZSBzdHJlYW1pbmciLCBydHBidnBheS0+bW9kZSwgbW9kZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qIHdlIHJldHVybiB0aGUgcGFkdGVtcGxhdGUgY2FwcyB3aXRoIHRoZSBtb2RlIGZpZWxkIGZpeGF0ZWQgdG8gYSB2YWx1ZSBpZiB3ZQorICogY2FuICovCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfcnRwX2J2X3BheV9zaW5rX2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcnRwcGF5bG9hZCwgR3N0UGFkICogcGFkLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKm90aGVycGFkY2FwczsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHBhZCk7CisKKyAgb3RoZXJwYWRjYXBzID0gZ3N0X3BhZF9nZXRfYWxsb3dlZF9jYXBzIChydHBwYXlsb2FkLT5zcmNwYWQpOworICBpZiAob3RoZXJwYWRjYXBzKSB7CisgICAgaWYgKCFnc3RfY2Fwc19pc19lbXB0eSAob3RoZXJwYWRjYXBzKSkgeworICAgICAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgICAgICBjb25zdCBnY2hhciAqbW9kZV9zdHI7CisgICAgICBnaW50IG1vZGU7CisKKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKG90aGVycGFkY2FwcywgMCk7CisKKyAgICAgIC8qIGNvbnN0cnVjdCBtb2RlLCBpZiB3ZSBjYW4gKi8KKyAgICAgIG1vZGVfc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJlbmNvZGluZy1uYW1lIik7CisgICAgICBpZiAobW9kZV9zdHIpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAgKG1vZGVfc3RyLCAiQlYxNiIpKQorICAgICAgICAgIG1vZGUgPSAxNjsKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCAobW9kZV9zdHIsICJCVjMyIikpCisgICAgICAgICAgbW9kZSA9IDMyOworICAgICAgICBlbHNlCisgICAgICAgICAgbW9kZSA9IC0xOworCisgICAgICAgIGlmIChtb2RlID09IDE2IHx8IG1vZGUgPT0gMzIpIHsKKyAgICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoY2Fwcyk7CisgICAgICAgICAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHN0cnVjdHVyZSwgIm1vZGUiLCBHX1RZUEVfSU5ULCBtb2RlLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBnc3RfY2Fwc191bnJlZiAob3RoZXJwYWRjYXBzKTsKKyAgfQorCisgIGlmIChmaWx0ZXIpIHsKKyAgICBHc3RDYXBzICp0bXA7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBwYXlsb2FkLCAiSW50ZXJzZWN0ICUiIEdTVF9QVFJfRk9STUFUICIgYW5kIGZpbHRlciAlIgorICAgICAgICBHU1RfUFRSX0ZPUk1BVCwgY2FwcywgZmlsdGVyKTsKKyAgICB0bXAgPSBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCBjYXBzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICBjYXBzID0gdG1wOworICB9CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2J2X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGJ2cGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX0JWX1BBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGJ2cGF5LmggYi9nc3QvcnRwL2dzdHJ0cGJ2cGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk3NjZjYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwYnZwYXkuaApAQCAtMCwwICsxLDYwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfQlZfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfQlZfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWF1ZGlvcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0JWX1BBWSBcCisgIChnc3RfcnRwX2J2X3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0JWX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9CVl9QQVksR3N0UlRQQlZQYXkpKQorI2RlZmluZSBHU1RfUlRQX0JWX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfQlZfUEFZLEdzdFJUUEJWUGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0JWX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9CVl9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0JWX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfQlZfUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUEJWUGF5IEdzdFJUUEJWUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUEJWUGF5Q2xhc3MgR3N0UlRQQlZQYXlDbGFzczsKKworc3RydWN0IF9Hc3RSVFBCVlBheQoreworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkIGF1ZGlvcGF5bG9hZDsKKworICBnaW50IG1vZGU7Cit9OworCitzdHJ1Y3QgX0dzdFJUUEJWUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfYnZfcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9idl9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfQlZfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBjZWx0ZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdjMTdmMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmMKQEAgLTAsMCArMSwyNzYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJnc3RydHBjZWx0ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBjZWx0ZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cGNlbHRkZXBheV9kZWJ1ZykKKworLyogUnRwQ0VMVERlcGF5IHNpZ25hbHMgYW5kIGFyZ3MgKi8KKworI2RlZmluZSBERUZBVUxUX0ZSQU1FU0laRSAgICAgICA0ODAKKyNkZWZpbmUgREVGQVVMVF9DSEFOTkVMUyAgICAgICAgMQorI2RlZmluZSBERUZBVUxUX0NMT0NLUkFURSAgICAgICAzMjAwMAorCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKK2VudW0KK3sKKyAgUFJPUF8wCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9jZWx0X2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gIChpbnQpIFszMjAwMCwgNDgwMDBdLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJDRUxUXCIiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2NlbHRfZGVwYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LWNlbHQiKQorICAgICk7CisKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfY2VsdF9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9jZWx0X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworCisjZGVmaW5lIGdzdF9ydHBfY2VsdF9kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBDRUxURGVwYXksIGdzdF9ydHBfY2VsdF9kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9jZWx0X2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cENFTFREZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBjZWx0ZGVwYXlfZGVidWcsICJydHBjZWx0ZGVwYXkiLCAwLAorICAgICAgIkNFTFQgUlRQIERlcGF5bG9hZGVyIik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfY2VsdF9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2NlbHRfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgQ0VMVCBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgQ0VMVCBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfY2VsdF9kZXBheV9wcm9jZXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfY2VsdF9kZXBheV9zZXRjYXBzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9jZWx0X2RlcGF5X2luaXQgKEdzdFJ0cENFTFREZXBheSAqIHJ0cGNlbHRkZXBheSkKK3sKK30KKworLyogbGVuIDQgYnl0ZXMgTEUsCisgKiB2ZW5kb3Igc3RyaW5nIChsZW4gYnl0ZXMpLAorICogdXNlcl9sZW4gNCAoMCkgYnl0ZXMgTEUKKyAqLworc3RhdGljIGNvbnN0IGdjaGFyIGdzdF9ydHBfY2VsdF9jb21tZW50W10gPQorICAgICJcMDQ1XDBcMFwwRGVwYXlsb2FkZWQgd2l0aCBHU3RyZWFtZXIgY2VsdGRlcGF5XDBcMFwwXDAiOworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfY2VsdF9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdFJ0cENFTFREZXBheSAqcnRwY2VsdGRlcGF5OworICBnaW50IGNsb2NrX3JhdGUsIG5iX2NoYW5uZWxzID0gMCwgZnJhbWVfc2l6ZSA9IDA7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ4ICpwdHI7CisgIGNvbnN0IGdjaGFyICpwYXJhbXM7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIGdib29sZWFuIHJlczsKKworICBydHBjZWx0ZGVwYXkgPSBHU1RfUlRQX0NFTFRfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgZ290byBub19jbG9ja3JhdGU7CisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgaWYgKChwYXJhbXMgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImVuY29kaW5nLXBhcmFtcyIpKSkKKyAgICBuYl9jaGFubmVscyA9IGF0b2kgKHBhcmFtcyk7CisgIGlmICghbmJfY2hhbm5lbHMpCisgICAgbmJfY2hhbm5lbHMgPSBERUZBVUxUX0NIQU5ORUxTOworCisgIGlmICgocGFyYW1zID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJmcmFtZS1zaXplIikpKQorICAgIGZyYW1lX3NpemUgPSBhdG9pIChwYXJhbXMpOworICBpZiAoIWZyYW1lX3NpemUpCisgICAgZnJhbWVfc2l6ZSA9IERFRkFVTFRfRlJBTUVTSVpFOworICBydHBjZWx0ZGVwYXktPmZyYW1lX3NpemUgPSBmcmFtZV9zaXplOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgImNsb2NrLXJhdGU9JWQgY2hhbm5lbHM9JWQgZnJhbWUtc2l6ZT0lZCIsCisgICAgICBjbG9ja19yYXRlLCBuYl9jaGFubmVscywgZnJhbWVfc2l6ZSk7CisKKyAgLyogY29uc3RydWN0IG1pbmltYWwgaGVhZGVyIGFuZCBjb21tZW50IHBhY2tldCBmb3IgdGhlIGRlY29kZXIgKi8KKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg2MCk7CisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBwdHIgPSBtYXAuZGF0YTsKKyAgbWVtY3B5IChwdHIsICJDRUxUICAgICIsIDgpOworICBwdHIgKz0gODsKKyAgbWVtY3B5IChwdHIsICIxLjEuMTIiLCA3KTsKKyAgcHRyICs9IDIwOworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChwdHIsIDB4ODAwMDAwMDYpOyAgICAgICAgLyogdmVyc2lvbiAqLworICBwdHIgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAocHRyLCA1Nik7ICAgICAgICAvKiBoZWFkZXJfc2l6ZSAqLworICBwdHIgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAocHRyLCBjbG9ja19yYXRlKTsgICAgICAgIC8qIHJhdGUgKi8KKyAgcHRyICs9IDQ7CisgIEdTVF9XUklURV9VSU5UMzJfTEUgKHB0ciwgbmJfY2hhbm5lbHMpOyAgICAgICAvKiBjaGFubmVscyAqLworICBwdHIgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAocHRyLCBmcmFtZV9zaXplKTsgICAgICAgIC8qIGZyYW1lLXNpemUgKi8KKyAgcHRyICs9IDQ7CisgIEdTVF9XUklURV9VSU5UMzJfTEUgKHB0ciwgLTEpOyAgICAgICAgLyogb3ZlcmxhcCAqLworICBwdHIgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAocHRyLCAtMSk7ICAgICAgICAvKiBieXRlc19wZXJfcGFja2V0ICovCisgIHB0ciArPSA0OworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChwdHIsIDApOyAvKiBleHRyYSBoZWFkZXJzICovCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby94LWNlbHQiKTsKKyAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoZGVwYXlsb2FkLT5zcmNwYWQsIHNyY2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgZ3N0X3J0cF9iYXNlX2RlcGF5bG9hZF9wdXNoIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEIChydHBjZWx0ZGVwYXkpLCBidWYpOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZW9mIChnc3RfcnRwX2NlbHRfY29tbWVudCkpOworICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgZ3N0X3J0cF9jZWx0X2NvbW1lbnQsIHNpemVvZiAoZ3N0X3J0cF9jZWx0X2NvbW1lbnQpKTsKKworICBnc3RfcnRwX2Jhc2VfZGVwYXlsb2FkX3B1c2ggKEdTVF9SVFBfQkFTRV9ERVBBWUxPQUQgKHJ0cGNlbHRkZXBheSksIGJ1Zik7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK25vX2Nsb2NrcmF0ZToKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlcGF5bG9hZCwgIm5vIGNsb2NrLXJhdGUgc3BlY2lmaWVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9jZWx0X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBndWludDggKnBheWxvYWQ7CisgIGd1aW50IG9mZnNldCwgcG9zLCBwYXlsb2FkX2xlbiwgdG90YWxfc2l6ZSwgc2l6ZTsKKyAgZ3VpbnQ4IHM7CisgIGdpbnQgY2xvY2tfcmF0ZSA9IDAsIGZyYW1lX3NpemUgPSAwOworICBHc3RDbG9ja1RpbWUgZnJhbWVzaXplX25zID0gMCwgdGltZXN0YW1wOworICBndWludCBuID0gMDsKKyAgR3N0UnRwQ0VMVERlcGF5ICpydHBjZWx0ZGVwYXk7CisKKyAgcnRwY2VsdGRlcGF5ID0gR1NUX1JUUF9DRUxUX0RFUEFZIChkZXBheWxvYWQpOworICBjbG9ja19yYXRlID0gZGVwYXlsb2FkLT5jbG9ja19yYXRlOworICBmcmFtZV9zaXplID0gcnRwY2VsdGRlcGF5LT5mcmFtZV9zaXplOworICBmcmFtZXNpemVfbnMgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChmcmFtZV9zaXplLCBHU1RfU0VDT05ELCBjbG9ja19yYXRlKTsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1BUUyAocnRwLT5idWZmZXIpOworCisgIEdTVF9MT0dfT0JKRUNUIChkZXBheWxvYWQsCisgICAgICAiZ290ICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMsIG1hcmsgJWQgdHMgJXUgc2VxbiAlZCIsCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChydHAtPmJ1ZmZlciksIGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCksCisgICAgICBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wIChydHApLCBnc3RfcnRwX2J1ZmZlcl9nZXRfc2VxIChydHApKTsKKworICBHU1RfTE9HX09CSkVDVCAoZGVwYXlsb2FkLCAiZ290IGNsb2NrLXJhdGU9JWQsIGZyYW1lX3NpemU9JWQsICIKKyAgICAgICJfbnM9JSIgR1NUX1RJTUVfRk9STUFUICIsIHRpbWVzdGFtcD0lIiBHU1RfVElNRV9GT1JNQVQsIGNsb2NrX3JhdGUsCisgICAgICBmcmFtZV9zaXplLCBHU1RfVElNRV9BUkdTIChmcmFtZXNpemVfbnMpLCBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApKTsKKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworCisgIC8qIGZpcnN0IGNvdW50IGhvdyBtYW55IGJ5dGVzIGFyZSBjb25zdW1lZCBieSB0aGUgc2l6ZSBoZWFkZXJzIGFuZCBtYWtlIG9mZnNldAorICAgKiBwb2ludCB0byB0aGUgZmlyc3QgZGF0YSBieXRlICovCisgIHRvdGFsX3NpemUgPSAwOworICBvZmZzZXQgPSAwOworICB3aGlsZSAodG90YWxfc2l6ZSA8IHBheWxvYWRfbGVuKSB7CisgICAgZG8geworICAgICAgcyA9IHBheWxvYWRbb2Zmc2V0KytdOworICAgICAgdG90YWxfc2l6ZSArPSBzICsgMTsKKyAgICB9IHdoaWxlIChzID09IDB4ZmYpOworICB9CisKKyAgLyogb2Zmc2V0IGlzIG5vdyBwb2ludGluZyB0byB0aGUgcGF5bG9hZCAqLworICB0b3RhbF9zaXplID0gMDsKKyAgcG9zID0gMDsKKyAgd2hpbGUgKHRvdGFsX3NpemUgPCBwYXlsb2FkX2xlbikgeworICAgIG4rKzsKKyAgICBzaXplID0gMDsKKyAgICBkbyB7CisgICAgICBzID0gcGF5bG9hZFtwb3MrK107CisgICAgICBzaXplICs9IHM7CisgICAgICB0b3RhbF9zaXplICs9IHMgKyAxOworICAgIH0gd2hpbGUgKHMgPT0gMHhmZik7CisKKyAgICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgKHJ0cCwgb2Zmc2V0LCBzaXplKTsKKyAgICBvZmZzZXQgKz0gc2l6ZTsKKworICAgIGlmIChmcmFtZV9zaXplICE9IC0xICYmIGNsb2NrX3JhdGUgIT0gLTEpIHsKKyAgICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gdGltZXN0YW1wICsgZnJhbWVzaXplX25zICogbjsKKyAgICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPSBmcmFtZXNpemVfbnM7CisgICAgfQorICAgIEdTVF9MT0dfT0JKRUNUIChkZXBheWxvYWQsICJwdXNoIHRpbWVzdGFtcD0lIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiwgZHVyYXRpb249JSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikpKTsKKworICAgIGdzdF9ydHBfZHJvcF9ub25fYXVkaW9fbWV0YSAoZGVwYXlsb2FkLCBvdXRidWYpOworCisgICAgZ3N0X3J0cF9iYXNlX2RlcGF5bG9hZF9wdXNoIChkZXBheWxvYWQsIG91dGJ1Zik7CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfY2VsdF9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGNlbHRkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9DRUxUX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MDVjNjgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSAKKyAqLworIAorI2lmbmRlZiBfX0dTVF9SVFBfQ0VMVF9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0NFTFRfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cENFTFREZXBheSBHc3RSdHBDRUxURGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwQ0VMVERlcGF5Q2xhc3MgR3N0UnRwQ0VMVERlcGF5Q2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0NFTFRfREVQQVkgXAorICAoZ3N0X3J0cF9jZWx0X2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfQ0VMVF9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9DRUxUX0RFUEFZLEdzdFJ0cENFTFREZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfQ0VMVF9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfQ0VMVF9ERVBBWSxHc3RSdHBDRUxURGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfQ0VMVF9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9DRUxUX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9DRUxUX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9DRUxUX0RFUEFZKSkKKworc3RydWN0IF9Hc3RSdHBDRUxURGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7CisgIGdpbnQgZnJhbWVfc2l6ZTsKK307CisKK3N0cnVjdCBfR3N0UnRwQ0VMVERlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfY2VsdF9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfY2VsdF9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9DRUxUX0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGNlbHRwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDk4ODk3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmMKQEAgLTAsMCArMSw1MDIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJnc3RydHBjZWx0cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwY2VsdHBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwY2VsdHBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfY2VsdF9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LWNlbHQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDMyMDAwLCA2NDAwMCBdLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIFsxLCAyXSwgIiAiZnJhbWUtc2l6ZSA9IChpbnQpIFsgNjQsIDUxMiBdIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9jZWx0X3BheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAgKGludCkgWyAzMjAwMCwgNDgwMDAgXSwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiQ0VMVFwiIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2NlbHRfcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfY2VsdF9wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfY2VsdF9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfcnRwX2NlbHRfcGF5X2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9jZWx0X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqCisgICAgcGF5bG9hZCwgR3N0QnVmZmVyICogYnVmZmVyKTsKKworI2RlZmluZSBnc3RfcnRwX2NlbHRfcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cENFTFRQYXksIGdzdF9ydHBfY2VsdF9wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9jZWx0X3BheV9jbGFzc19pbml0IChHc3RSdHBDRUxUUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBjZWx0cGF5X2RlYnVnLCAicnRwY2VsdHBheSIsIDAsCisgICAgICAiQ0VMVCBSVFAgUGF5bG9hZGVyIik7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9jZWx0X3BheV9maW5hbGl6ZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfcnRwX2NlbHRfcGF5X2NoYW5nZV9zdGF0ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2NlbHRfcGF5X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2NlbHRfcGF5X3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlJUUCBDRUxUIHBheWxvYWRlciIsCisgICAgICAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYXlsb2FkLWVuY29kZXMgQ0VMVCBhdWRpbyBpbnRvIGEgUlRQIHBhY2tldCIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2NlbHRfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5nZXRfY2FwcyA9IGdzdF9ydHBfY2VsdF9wYXlfZ2V0Y2FwczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX2NlbHRfcGF5X2hhbmRsZV9idWZmZXI7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2NlbHRfcGF5X2luaXQgKEdzdFJ0cENFTFRQYXkgKiBydHBjZWx0cGF5KQoreworICBydHBjZWx0cGF5LT5xdWV1ZSA9IGdfcXVldWVfbmV3ICgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9jZWx0X3BheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwQ0VMVFBheSAqcnRwY2VsdHBheTsKKworICBydHBjZWx0cGF5ID0gR1NUX1JUUF9DRUxUX1BBWSAob2JqZWN0KTsKKworICBnX3F1ZXVlX2ZyZWUgKHJ0cGNlbHRwYXktPnF1ZXVlKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2NlbHRfcGF5X2NsZWFyX3F1ZXVlZCAoR3N0UnRwQ0VMVFBheSAqIHJ0cGNlbHRwYXkpCit7CisgIEdzdEJ1ZmZlciAqYnVmOworCisgIHdoaWxlICgoYnVmID0gZ19xdWV1ZV9wb3BfaGVhZCAocnRwY2VsdHBheS0+cXVldWUpKSkKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgIHJ0cGNlbHRwYXktPmJ5dGVzID0gMDsKKyAgcnRwY2VsdHBheS0+c2J5dGVzID0gMDsKKyAgcnRwY2VsdHBheS0+cWR1cmF0aW9uID0gMDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfY2VsdF9wYXlfYWRkX3F1ZXVlZCAoR3N0UnRwQ0VMVFBheSAqIHJ0cGNlbHRwYXksIEdzdEJ1ZmZlciAqIGJ1ZmZlciwKKyAgICBndWludCBzc2l6ZSwgZ3VpbnQgc2l6ZSwgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uKQoreworICBnX3F1ZXVlX3B1c2hfdGFpbCAocnRwY2VsdHBheS0+cXVldWUsIGJ1ZmZlcik7CisgIHJ0cGNlbHRwYXktPnNieXRlcyArPSBzc2l6ZTsKKyAgcnRwY2VsdHBheS0+Ynl0ZXMgKz0gc2l6ZTsKKyAgLyogb25seSBhZGQgZHVyYXRpb25zIHdoZW4gd2UgaGF2ZSBhIHZhbGlkIHByZXZpb3VzIGR1cmF0aW9uICovCisgIGlmIChydHBjZWx0cGF5LT5xZHVyYXRpb24gIT0gLTEpIHsKKyAgICBpZiAoZHVyYXRpb24gIT0gLTEpCisgICAgICAvKiBvbmx5IGFkZCB2YWxpZCBkdXJhdGlvbnMgKi8KKyAgICAgIHJ0cGNlbHRwYXktPnFkdXJhdGlvbiArPSBkdXJhdGlvbjsKKyAgICBlbHNlCisgICAgICAvKiBpZiB3ZSBhZGQgYSBidWZmZXIgd2l0aG91dCB2YWxpZCBkdXJhdGlvbiwgb3VyIHRvdGFsIHF1ZXVlZCBkdXJhdGlvbgorICAgICAgICogYmVjb21lcyB1bmtub3duICovCisgICAgICBydHBjZWx0cGF5LT5xZHVyYXRpb24gPSAtMTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfY2VsdF9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgLyogZG9uJ3QgY29uZmlndXJlIHlldCwgd2Ugd2FpdCBmb3IgdGhlIGlkZW50IHBhY2tldCAqLworICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfcnRwX2NlbHRfcGF5X2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0UGFkICogcGFkLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKm90aGVycGFkY2FwczsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgY29uc3QgZ2NoYXIgKnBhcmFtczsKKworICBjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHBhZCk7CisKKyAgb3RoZXJwYWRjYXBzID0gZ3N0X3BhZF9nZXRfYWxsb3dlZF9jYXBzIChwYXlsb2FkLT5zcmNwYWQpOworICBpZiAob3RoZXJwYWRjYXBzKSB7CisgICAgaWYgKCFnc3RfY2Fwc19pc19lbXB0eSAob3RoZXJwYWRjYXBzKSkgeworICAgICAgR3N0U3RydWN0dXJlICpwczsKKyAgICAgIEdzdFN0cnVjdHVyZSAqczsKKyAgICAgIGdpbnQgY2xvY2tfcmF0ZSA9IDAsIGZyYW1lX3NpemUgPSAwLCBjaGFubmVscyA9IDE7CisKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChjYXBzKTsKKworICAgICAgcHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChvdGhlcnBhZGNhcHMsIDApOworICAgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChwcywgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpIHsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGRfbmVhcmVzdF9pbnQgKHMsICJyYXRlIiwgY2xvY2tfcmF0ZSk7CisgICAgICB9CisKKyAgICAgIGlmICgocGFyYW1zID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChwcywgImZyYW1lLXNpemUiKSkpCisgICAgICAgIGZyYW1lX3NpemUgPSBhdG9pIChwYXJhbXMpOworICAgICAgaWYgKGZyYW1lX3NpemUpCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiZnJhbWUtc2l6ZSIsIEdfVFlQRV9JTlQsIGZyYW1lX3NpemUsIE5VTEwpOworCisgICAgICBpZiAoKHBhcmFtcyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocHMsICJlbmNvZGluZy1wYXJhbXMiKSkpIHsKKyAgICAgICAgY2hhbm5lbHMgPSBhdG9pIChwYXJhbXMpOworICAgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ludCAocywgImNoYW5uZWxzIiwgY2hhbm5lbHMpOworICAgICAgfQorCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXlsb2FkLCAiY2xvY2stcmF0ZT0lZCBmcmFtZS1zaXplPSVkIGNoYW5uZWxzPSVkIiwKKyAgICAgICAgICBjbG9ja19yYXRlLCBmcmFtZV9zaXplLCBjaGFubmVscyk7CisgICAgfQorICAgIGdzdF9jYXBzX3VucmVmIChvdGhlcnBhZGNhcHMpOworICB9CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKnRtcDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJJbnRlcnNlY3QgJSIgR1NUX1BUUl9GT1JNQVQgIiBhbmQgZmlsdGVyICUiCisgICAgICAgIEdTVF9QVFJfRk9STUFULCBjYXBzLCBmaWx0ZXIpOworICAgIHRtcCA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIGNhcHMsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIGNhcHMgPSB0bXA7CisgIH0KKworICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2NlbHRfcGF5X3BhcnNlX2lkZW50IChHc3RSdHBDRUxUUGF5ICogcnRwY2VsdHBheSwKKyAgICBjb25zdCBndWludDggKiBkYXRhLCBndWludCBzaXplKQoreworICBndWludDMyIHZlcnNpb24sIGhlYWRlcl9zaXplLCByYXRlLCBuYl9jaGFubmVscywgZnJhbWVfc2l6ZSwgb3ZlcmxhcDsKKyAgZ3VpbnQzMiBieXRlc19wZXJfcGFja2V0OworICBHc3RSVFBCYXNlUGF5bG9hZCAqcGF5bG9hZDsKKyAgZ2NoYXIgKmNzdHIsICpmc3N0cjsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIC8qIHdlIG5lZWQgdGhlIGhlYWRlciBzdHJpbmcgKDgpLCB0aGUgdmVyc2lvbiBzdHJpbmcgKDIwKSwgdGhlIHZlcnNpb24KKyAgICogYW5kIHRoZSBoZWFkZXIgbGVuZ3RoLiAqLworICBpZiAoc2l6ZSA8IDM2KQorICAgIGdvdG8gdG9vX3NtYWxsOworCisgIGlmICghZ19zdHJfaGFzX3ByZWZpeCAoKGNvbnN0IGdjaGFyICopIGRhdGEsICJDRUxUICAgICIpKQorICAgIGdvdG8gd3JvbmdfaGVhZGVyOworCisgIC8qIHNraXAgaGVhZGVyIGFuZCB2ZXJzaW9uIHN0cmluZyAqLworICBkYXRhICs9IDI4OworCisgIHZlcnNpb24gPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEpOworICBHU1RfREVCVUdfT0JKRUNUIChydHBjZWx0cGF5LCAidmVyc2lvbiAlMDh4IiwgdmVyc2lvbik7CisjaWYgMAorICBpZiAodmVyc2lvbiAhPSAxKQorICAgIGdvdG8gd3JvbmdfdmVyc2lvbjsKKyNlbmRpZgorCisgIGRhdGEgKz0gNDsKKyAgLyogZW5zdXJlIHNpemVzICovCisgIGhlYWRlcl9zaXplID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKyAgaWYgKGhlYWRlcl9zaXplIDwgNTYpCisgICAgZ290byBoZWFkZXJfdG9vX3NtYWxsOworCisgIGlmIChzaXplIDwgaGVhZGVyX3NpemUpCisgICAgZ290byBwYXlsb2FkX3Rvb19zbWFsbDsKKworICBkYXRhICs9IDQ7CisgIHJhdGUgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEpOworICBkYXRhICs9IDQ7CisgIG5iX2NoYW5uZWxzID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKyAgZGF0YSArPSA0OworICBmcmFtZV9zaXplID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKyAgZGF0YSArPSA0OworICBvdmVybGFwID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKyAgZGF0YSArPSA0OworICBieXRlc19wZXJfcGFja2V0ID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBjZWx0cGF5LCAicmF0ZSAlZCwgbmJfY2hhbm5lbHMgJWQsIGZyYW1lX3NpemUgJWQiLAorICAgICAgcmF0ZSwgbmJfY2hhbm5lbHMsIGZyYW1lX3NpemUpOworICBHU1RfREVCVUdfT0JKRUNUIChydHBjZWx0cGF5LCAib3ZlcmxhcCAlZCwgYnl0ZXNfcGVyX3BhY2tldCAlZCIsCisgICAgICBvdmVybGFwLCBieXRlc19wZXJfcGFja2V0KTsKKworICBwYXlsb2FkID0gR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHJ0cGNlbHRwYXkpOworCisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChwYXlsb2FkLCAiYXVkaW8iLCBGQUxTRSwgIkNFTFQiLCByYXRlKTsKKyAgY3N0ciA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgbmJfY2hhbm5lbHMpOworICBmc3N0ciA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgZnJhbWVfc2l6ZSk7CisgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChwYXlsb2FkLCAiZW5jb2RpbmctcGFyYW1zIiwKKyAgICAgIEdfVFlQRV9TVFJJTkcsIGNzdHIsICJmcmFtZS1zaXplIiwgR19UWVBFX1NUUklORywgZnNzdHIsIE5VTEwpOworICBnX2ZyZWUgKGNzdHIpOworICBnX2ZyZWUgKGZzc3RyKTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLwordG9vX3NtYWxsOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwY2VsdHBheSwKKyAgICAgICAgImlkZW50IHBhY2tldCB0b28gc21hbGwsIG5lZWQgYXQgbGVhc3QgMzIgYnl0ZXMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3dyb25nX2hlYWRlcjoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGNlbHRwYXksCisgICAgICAgICJpZGVudCBwYWNrZXQgZG9lcyBub3Qgc3RhcnQgd2l0aCBcIkNFTFQgICAgXCIiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyNpZiAwCit3cm9uZ192ZXJzaW9uOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwY2VsdHBheSwgImNhbiBvbmx5IGhhbmRsZSB2ZXJzaW9uIDEsIGhhdmUgdmVyc2lvbiAlZCIsCisgICAgICAgIHZlcnNpb24pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorI2VuZGlmCitoZWFkZXJfdG9vX3NtYWxsOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwY2VsdHBheSwKKyAgICAgICAgImhlYWRlciBzaXplIHRvbyBzbWFsbCwgbmVlZCBhdCBsZWFzdCA4MCBieXRlcywgIiAiZ290IG9ubHkgJWQiLAorICAgICAgICBoZWFkZXJfc2l6ZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitwYXlsb2FkX3Rvb19zbWFsbDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGNlbHRwYXksCisgICAgICAgICJwYXlsb2FkIHRvbyBzbWFsbCwgbmVlZCBhdCBsZWFzdCAlZCBieXRlcywgZ290IG9ubHkgJWQiLCBoZWFkZXJfc2l6ZSwKKyAgICAgICAgc2l6ZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2NlbHRfcGF5X2ZsdXNoX3F1ZXVlZCAoR3N0UnRwQ0VMVFBheSAqIHJ0cGNlbHRwYXkpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RCdWZmZXIgKmJ1ZiwgKm91dGJ1ZjsKKyAgZ3VpbnQ4ICpwYXlsb2FkLCAqc3BheWxvYWQ7CisgIGd1aW50IHBheWxvYWRfbGVuOworICBHc3RDbG9ja1RpbWUgZHVyYXRpb247CisgIEdzdFJUUEJ1ZmZlciBydHAgPSB7IE5VTEwsIH07CisKKyAgcGF5bG9hZF9sZW4gPSBydHBjZWx0cGF5LT5ieXRlcyArIHJ0cGNlbHRwYXktPnNieXRlczsKKyAgZHVyYXRpb24gPSBydHBjZWx0cGF5LT5xZHVyYXRpb247CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwY2VsdHBheSwgImZsdXNoaW5nIG91dCAldSwgZHVyYXRpb24gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgcGF5bG9hZF9sZW4sIEdTVF9USU1FX0FSR1MgKHJ0cGNlbHRwYXktPnFkdXJhdGlvbikpOworCisgIC8qIGdldCBhIGJpZyBlbm91Z2ggcGFja2V0IGZvciB0aGUgc2l6ZXMgKyBwYXlsb2FkcyAqLworICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKHBheWxvYWRfbGVuLCAwLCAwKTsKKworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gZHVyYXRpb247CisKKyAgZ3N0X3J0cF9idWZmZXJfbWFwIChvdXRidWYsIEdTVF9NQVBfV1JJVEUsICZydHApOworCisgIC8qIHBvaW50IHRvIHRoZSBwYXlsb2FkIGZvciBzaXplIGhlYWRlcnMgYW5kIGRhdGEgKi8KKyAgc3BheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisgIHBheWxvYWQgPSBzcGF5bG9hZCArIHJ0cGNlbHRwYXktPnNieXRlczsKKworICB3aGlsZSAoKGJ1ZiA9IGdfcXVldWVfcG9wX2hlYWQgKHJ0cGNlbHRwYXktPnF1ZXVlKSkpIHsKKyAgICBndWludCBzaXplOworCisgICAgLyogY29weSBmaXJzdCB0aW1lc3RhbXAgdG8gb3V0cHV0ICovCisgICAgaWYgKEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID09IC0xKQorICAgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSBHU1RfQlVGRkVSX1BUUyAoYnVmKTsKKworICAgIC8qIHdyaXRlIHRoZSBzaXplIHRvIHRoZSBoZWFkZXIgKi8KKyAgICBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKyAgICB3aGlsZSAoc2l6ZSA+IDB4ZmYpIHsKKyAgICAgICpzcGF5bG9hZCsrID0gMHhmZjsKKyAgICAgIHNpemUgLT0gMHhmZjsKKyAgICB9CisgICAgKnNwYXlsb2FkKysgPSBzaXplOworCisgICAgLyogY29weSBwYXlsb2FkICovCisgICAgc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChidWYsIDAsIHBheWxvYWQsIHNpemUpOworICAgIHBheWxvYWQgKz0gc2l6ZTsKKworICAgIGdzdF9ydHBfY29weV9hdWRpb19tZXRhIChydHBjZWx0cGF5LCBvdXRidWYsIGJ1Zik7CisKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICB9CisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICAvKiB3ZSBjb25zdW1lZCBpdCBhbGwgKi8KKyAgcnRwY2VsdHBheS0+Ynl0ZXMgPSAwOworICBydHBjZWx0cGF5LT5zYnl0ZXMgPSAwOworICBydHBjZWx0cGF5LT5xZHVyYXRpb24gPSAwOworCisgIHJldCA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBjZWx0cGF5KSwgb3V0YnVmKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9jZWx0X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdFJ0cENFTFRQYXkgKnJ0cGNlbHRwYXk7CisgIGdzaXplIHBheWxvYWRfbGVuOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uLCBwYWNrZXRfZHVyOworICBndWludCBpLCBzc2l6ZSwgcGFja2V0X2xlbjsKKworICBydHBjZWx0cGF5ID0gR1NUX1JUUF9DRUxUX1BBWSAoYmFzZXBheWxvYWQpOworCisgIHJldCA9IEdTVF9GTE9XX09LOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgc3dpdGNoIChydHBjZWx0cGF5LT5wYWNrZXQpIHsKKyAgICBjYXNlIDA6CisgICAgICAvKiBpZGVudCBwYWNrZXQuIFdlIG5lZWQgdG8gcGFyc2UgdGhlIGhlYWRlcnMgdG8gY29uc3RydWN0IHRoZSBSVFAKKyAgICAgICAqIHByb3BlcnRpZXMuICovCisgICAgICBpZiAoIWdzdF9ydHBfY2VsdF9wYXlfcGFyc2VfaWRlbnQgKHJ0cGNlbHRwYXksIG1hcC5kYXRhLCBtYXAuc2l6ZSkpCisgICAgICAgIGdvdG8gcGFyc2VfZXJyb3I7CisKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICBjYXNlIDE6CisgICAgICAvKiBjb21tZW50IHBhY2tldCwgd2UgaWdub3JlIGl0ICovCisgICAgICBnb3RvIGNsZWFudXA7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIG90aGVyIHBhY2tldHMgZ28gaW4gdGhlIHBheWxvYWQgKi8KKyAgICAgIGJyZWFrOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKKyAgZHVyYXRpb24gPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpOworCisgIEdTVF9MT0dfT0JKRUNUIChydHBjZWx0cGF5LAorICAgICAgImdvdCBidWZmZXIgb2YgZHVyYXRpb24gJSIgR1NUX1RJTUVfRk9STUFUICIsIHNpemUgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChkdXJhdGlvbiksIG1hcC5zaXplKTsKKworICAvKiBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHNpemUgZmllbGQgYW5kIHRoZSBwYXlsb2FkICovCisgIHNzaXplID0gMTsKKyAgZm9yIChpID0gbWFwLnNpemU7IGkgPiAweGZmOyBpIC09IDB4ZmYpCisgICAgc3NpemUrKzsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBjZWx0cGF5LCAiYnl0ZXMgZm9yIHNpemUgJXUiLCBzc2l6ZSk7CisKKyAgLyogY2FsY3VsYXRlIHdoYXQgdGhlIG5ldyBzaXplIGFuZCBkdXJhdGlvbiB3b3VsZCBiZSBvZiB0aGUgcGFja2V0ICovCisgIHBheWxvYWRfbGVuID0gc3NpemUgKyBtYXAuc2l6ZSArIHJ0cGNlbHRwYXktPmJ5dGVzICsgcnRwY2VsdHBheS0+c2J5dGVzOworICBpZiAocnRwY2VsdHBheS0+cWR1cmF0aW9uICE9IC0xICYmIGR1cmF0aW9uICE9IC0xKQorICAgIHBhY2tldF9kdXIgPSBydHBjZWx0cGF5LT5xZHVyYXRpb24gKyBkdXJhdGlvbjsKKyAgZWxzZQorICAgIHBhY2tldF9kdXIgPSAwOworCisgIHBhY2tldF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BhY2tldF9sZW4gKHBheWxvYWRfbGVuLCAwLCAwKTsKKworICBpZiAoZ3N0X3J0cF9iYXNlX3BheWxvYWRfaXNfZmlsbGVkIChiYXNlcGF5bG9hZCwgcGFja2V0X2xlbiwgcGFja2V0X2R1cikpIHsKKyAgICAvKiBzaXplIG9yIGR1cmF0aW9uIHdvdWxkIG92ZXJmbG93IHRoZSBwYWNrZXQsIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YSAqLworICAgIHJldCA9IGdzdF9ydHBfY2VsdF9wYXlfZmx1c2hfcXVldWVkIChydHBjZWx0cGF5KTsKKyAgfQorCisgIC8qIHF1ZXVlIHRoZSBwYWNrZXQgKi8KKyAgZ3N0X3J0cF9jZWx0X3BheV9hZGRfcXVldWVkIChydHBjZWx0cGF5LCBidWZmZXIsIHNzaXplLCBtYXAuc2l6ZSwgZHVyYXRpb24pOworCitkb25lOgorICBydHBjZWx0cGF5LT5wYWNrZXQrKzsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworY2xlYW51cDoKKyAgeworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgZ290byBkb25lOworICB9CitwYXJzZV9lcnJvcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChydHBjZWx0cGF5LCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLAorICAgICAgICAoIkVycm9yIHBhcnNpbmcgZmlyc3QgaWRlbnRpZmljYXRpb24gcGFja2V0LiIpKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfY2VsdF9wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0UnRwQ0VMVFBheSAqcnRwY2VsdHBheTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHJ0cGNlbHRwYXkgPSBHU1RfUlRQX0NFTFRfUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBydHBjZWx0cGF5LT5wYWNrZXQgPSAwOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9ydHBfY2VsdF9wYXlfY2xlYXJfcXVldWVkIChydHBjZWx0cGF5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2NlbHRfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwY2VsdHBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9DRUxUX1BBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGNlbHRwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwY2VsdHBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZGQwZWMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGNlbHRwYXkuaApAQCAtMCwwICsxLDYyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1JUUF9DRUxUX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0NFTFRfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwQ0VMVFBheSBHc3RSdHBDRUxUUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cENFTFRQYXlDbGFzcyBHc3RSdHBDRUxUUGF5Q2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0NFTFRfUEFZIFwKKyAgKGdzdF9ydHBfY2VsdF9wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9DRUxUX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9DRUxUX1BBWSxHc3RSdHBDRUxUUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9DRUxUX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfQ0VMVF9QQVksR3N0UnRwQ0VMVFBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9DRUxUX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9DRUxUX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfQ0VMVF9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0NFTFRfUEFZKSkKKworc3RydWN0IF9Hc3RSdHBDRUxUUGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkIHBheWxvYWQ7CisKKyAgZ3VpbnQ2NCBwYWNrZXQ7CisKKyAgLyogcXVldWUgdG8gaG9sZCBwYWNrZXRzICovCisgIEdRdWV1ZSAgICAgICpxdWV1ZTsKKyAgZ3VpbnQgICAgICAgIHNieXRlczsgICAgLyogYnl0ZXMgcXVldWVkIGZvciBzaXplcyAqLworICBndWludCAgICAgICAgYnl0ZXM7ICAgICAvKiBieXRlcyBxdWV1ZWQgZm9yIGRhdGEgKi8KKyAgR3N0Q2xvY2tUaW1lIHFkdXJhdGlvbjsgLyogcXVldWVkIGR1cmF0aW9uICovCit9OworCitzdHJ1Y3QgX0dzdFJ0cENFTFRQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfY2VsdF9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2NlbHRfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0NFTFRfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBjaGFubmVscy5jIGIvZ3N0L3J0cC9nc3RydHBjaGFubmVscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MjEyOTMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGNoYW5uZWxzLmMKQEAgLTAsMCArMSwzMTAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOD4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnc3RydHBjaGFubmVscy5oIgorCisvKiAKKyAqIFJUUCBjaGFubmVsIHBvc2l0aW9ucyBhcyBkaXNjdXNzZWQgaW4gUkZDIDM1NTEgYW5kIGFsc28gUkZDIDM1NTUKKyAqCisgKiBXZSBjYW4ndCByZWFsbHkgcmVwcmVzZW50IHRoZSBkZXNjcmliZWQgY2hhbm5lbCBwb3NpdGlvbnMgaW4gR1N0cmVhbWVyIGJ1dCB3ZQorICogaW1wbGVtZW50IGEgKHZlcnkgcm91Z2gpIGFwcHJveGltYXRpb24gaGVyZS4KKyAqLworCitzdGF0aWMgY29uc3QgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zXzRfMVtdID0geworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX1JJR0hUCit9OworCitzdGF0aWMgY29uc3QgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zXzRfMltdID0geworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSLAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxCit9OworCitzdGF0aWMgY29uc3QgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zXzRfM1tdID0geworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSLAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxCit9OworCitzdGF0aWMgY29uc3QgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zXzVfMVtdID0geworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX1JJR0hULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIKK307CisKK3N0YXRpYyBjb25zdCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBwb3NfNl8xW10gPSB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1NJREVfUklHSFQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMQorfTsKKworc3RhdGljIGNvbnN0IEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHBvc182XzJbXSA9IHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMSwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX1JJR0hUCit9OworCitzdGF0aWMgY29uc3QgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zXzhfMVtdID0geworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSLAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxLAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1NJREVfUklHSFQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVAorfTsKKworc3RhdGljIGNvbnN0IEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHBvc184XzJbXSA9IHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMSwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX1JJR0hULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0xFRlQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfUklHSFQKK307CisKK3N0YXRpYyBjb25zdCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBwb3NfOF8zW10gPSB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0xGRTEsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1NJREVfTEVGVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9SSUdIVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX1JJR0hUCit9OworCitzdGF0aWMgY29uc3QgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zX2RlZl8xW10gPSB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX01PTk8KK307CisKK3N0YXRpYyBjb25zdCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBwb3NfZGVmXzJbXSA9IHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQKK307CisKK3N0YXRpYyBjb25zdCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBwb3NfZGVmXzNbXSA9IHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUgorfTsKKworc3RhdGljIGNvbnN0IEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHBvc19kZWZfNFtdID0geworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxCit9OworCitzdGF0aWMgY29uc3QgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zX2RlZl81W10gPSB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1NJREVfTEVGVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9SSUdIVAorfTsKKworc3RhdGljIGNvbnN0IEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHBvc19kZWZfNltdID0geworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9SSUdIVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0xGRTEKK307CisKK2NvbnN0IEdzdFJUUENoYW5uZWxPcmRlciBnc3RfcnRwX2NoYW5uZWxfb3JkZXJzW10gPSB7CisgIC8qIDQgY2hhbm5lbHMgKi8KKyAgeyJEVi5MUkxzUnMiLCA0LCBwb3NfNF8xfSwKKyAgeyJEVi5MUkNTIiwgNCwgcG9zXzRfMn0sCisgIHsiRFYuTFJDV28iLCA0LCBwb3NfNF8zfSwKKyAgLyogNSBjaGFubmVscyAqLworICB7IkRWLkxSTHNSc0MiLCA1LCBwb3NfNV8xfSwKKyAgLyogNiBjaGFubmVscyAqLworICB7IkRWLkxSTHNSc0NTIiwgNiwgcG9zXzZfMX0sCisgIHsiRFYuTG1peFJtaXhUV29RMVEyIiwgNiwgcG9zXzZfMn0sCisgIC8qIDggY2hhbm5lbHMgKi8KKyAgeyJEVi5MUkNXb0xzUnNMbWl4Um1peCIsIDgsIHBvc184XzF9LAorICB7IkRWLkxSQ1dvTHMxUnMxTHMyUnMyIiwgOCwgcG9zXzhfMn0sCisgIHsiRFYuTFJDV29Mc1JzTGNSYyIsIDgsIHBvc184XzN9LAorCisgIC8qIGRlZmF1bHQgbGF5b3V0cyAqLworICB7TlVMTCwgMSwgcG9zX2RlZl8xfSwKKyAge05VTEwsIDIsIHBvc19kZWZfMn0sCisgIHtOVUxMLCAzLCBwb3NfZGVmXzN9LAorICB7TlVMTCwgNCwgcG9zX2RlZl80fSwKKyAge05VTEwsIDUsIHBvc19kZWZfNX0sCisgIHtOVUxMLCA2LCBwb3NfZGVmXzZ9LAorCisgIC8qIHRlcm1pbmF0b3IsIGludmFsaWQgZW50cnkgKi8KKyAge05VTEwsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGdib29sZWFuCitjaGVja19jaGFubmVscyAoY29uc3QgR3N0UlRQQ2hhbm5lbE9yZGVyICogb3JkZXIsCisgICAgY29uc3QgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gKiBwb3MpCit7CisgIGdpbnQgaSwgajsKKyAgZ2Jvb2xlYW4gcmVzID0gVFJVRTsKKworICBmb3IgKGkgPSAwOyBpIDwgb3JkZXItPmNoYW5uZWxzOyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgb3JkZXItPmNoYW5uZWxzOyBqKyspIHsKKyAgICAgIGlmIChvcmRlci0+cG9zW2pdID09IHBvc1tpXSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChqID09IG9yZGVyLT5jaGFubmVscykKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIGdzdF9ydHBfY2hhbm5lbHNfZ2V0X2J5X3BvczoKKyAqIEBjaGFubmVsczogdGhlIGFtb3VudCBvZiBjaGFubmVscworICogQHBvczogYSBjaGFubmVsIGxheW91dAorICoKKyAqIFJldHVybiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjaGFubmVsIGxheW91dC4KKyAqCisgKiBSZXR1cm5zOiBhICNHc3RSVFBDaGFubmVsT3JkZXIgd2l0aCB0aGUgY2hhbm5lbCBpbmZvcm1hdGlvbiBvciBOVUxMIHdoZW4gQHBvcworICogaXMgbm90IGEgdmFsaWQgbGF5b3V0LgorICovCitjb25zdCBHc3RSVFBDaGFubmVsT3JkZXIgKgorZ3N0X3J0cF9jaGFubmVsc19nZXRfYnlfcG9zIChnaW50IGNoYW5uZWxzLCBjb25zdCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiAqIHBvcykKK3sKKyAgZ2ludCBpOworICBjb25zdCBHc3RSVFBDaGFubmVsT3JkZXIgKnJlcyA9IE5VTEw7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBvcyAhPSBOVUxMLCBOVUxMKTsKKworICBmb3IgKGkgPSAwOyBjaGFubmVsX29yZGVyc1tpXS5wb3M7IGkrKykgeworICAgIGlmIChjaGFubmVsX29yZGVyc1tpXS5jaGFubmVscyAhPSBjaGFubmVscykKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKGNoZWNrX2NoYW5uZWxzICgmY2hhbm5lbF9vcmRlcnNbaV0sIHBvcykpIHsKKyAgICAgIHJlcyA9ICZjaGFubmVsX29yZGVyc1tpXTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIGdzdF9ydHBfY2hhbm5lbHNfY3JlYXRlX2RlZmF1bHQ6CisgKiBAY2hhbm5lbHM6IHRoZSBhbW91bnQgb2YgY2hhbm5lbHMKKyAqIEBvcmRlcjogYSBjaGFubmVsIG9yZGVyCisgKgorICogR2V0IHRoZSBjaGFubmVsIG9yZGVyIGluZm8gdGhlIEBvcmRlciBhbmQgQGNoYW5uZWxzLgorICoKKyAqIFJldHVybnM6IGEgI0dzdFJUUENoYW5uZWxPcmRlciB3aXRoIHRoZSBjaGFubmVsIGluZm9ybWF0aW9uIG9yIE5VTEwgd2hlbgorICogQG9yZGVyIGlzIG5vdCBhIGtub3cgbGF5b3V0IGZvciBAY2hhbm5lbHMuCisgKi8KK2NvbnN0IEdzdFJUUENoYW5uZWxPcmRlciAqCitnc3RfcnRwX2NoYW5uZWxzX2dldF9ieV9vcmRlciAoZ2ludCBjaGFubmVscywgY29uc3QgZ2NoYXIgKiBvcmRlcikKK3sKKyAgZ2ludCBpOworICBjb25zdCBHc3RSVFBDaGFubmVsT3JkZXIgKnJlcyA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgY2hhbm5lbF9vcmRlcnNbaV0ucG9zOyBpKyspIHsKKyAgICBpZiAoY2hhbm5lbF9vcmRlcnNbaV0uY2hhbm5lbHMgIT0gY2hhbm5lbHMpCisgICAgICBjb250aW51ZTsKKworICAgIC8qIG5vIG5hbWUgYnV0IGNoYW5uZWxzIG1hdGNoLCBjb250aW51ZSAqLworICAgIGlmICghY2hhbm5lbF9vcmRlcnNbaV0ubmFtZSB8fCAhb3JkZXIpIHsKKyAgICAgIHJlcyA9ICZjaGFubmVsX29yZGVyc1tpXTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIGNvbXBhcmUgbmFtZXMgKi8KKyAgICBpZiAoZ19hc2NpaV9zdHJjYXNlY21wIChjaGFubmVsX29yZGVyc1tpXS5uYW1lLCBvcmRlcikpIHsKKyAgICAgIHJlcyA9ICZjaGFubmVsX29yZGVyc1tpXTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIGdzdF9ydHBfY2hhbm5lbHNfZ2V0X2J5X2luZGV4OgorICogQGNoYW5uZWxzOiB0aGUgYW1vdW50IG9mIGNoYW5uZWxzCisgKiBAaWR4OiB0aGUgY2hhbm5lbCBpbmRleCB0byByZXRyaWV2ZQorICoKKyAqIEdldCB0aGUgYWxsb3dlZCBjaGFubmVsIG9yZGVyIGRlc2NyaXB0aW9ucyBmb3IgQGNoYW5uZWxzLiBAaWR4IGNhbiBiZSB1c2VkIHRvCisgKiByZXRyaWV2ZSB0aGUgZGVzaXJlZCBpbmRleC4KKyAqCisgKiBSZXR1cm5zOiBhICNHc3RSVFBDaGFubmVsT3JkZXIgYXQgQGlkeCwgTlVMTCB3aGVuIHRoZXJlIGFyZSBubyB2YWxpZCBjaGFubmVsCisgKiBvcmRlcnMuCisgKi8KK2NvbnN0IEdzdFJUUENoYW5uZWxPcmRlciAqCitnc3RfcnRwX2NoYW5uZWxzX2dldF9ieV9pbmRleCAoZ2ludCBjaGFubmVscywgZ3VpbnQgaWR4KQoreworICBnaW50IGk7CisgIGNvbnN0IEdzdFJUUENoYW5uZWxPcmRlciAqcmVzID0gTlVMTDsKKworICBmb3IgKGkgPSAwOyBjaGFubmVsX29yZGVyc1tpXS5wb3M7IGkrKykgeworICAgIGlmIChjaGFubmVsX29yZGVyc1tpXS5jaGFubmVscyAhPSBjaGFubmVscykKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKGlkeCA9PSAwKSB7CisgICAgICByZXMgPSAmY2hhbm5lbF9vcmRlcnNbaV07CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWR4LS07CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworCisvKioKKyAqIGdzdF9ydHBfY2hhbm5lbHNfY3JlYXRlX2RlZmF1bHQ6CisgKiBAY2hhbm5lbHM6IHRoZSBhbW91bnQgb2YgY2hhbm5lbHMKKyAqCisgKiBDcmVhdGUgYSBkZWZhdWx0IG5vbmUgY2hhbm5lbCBtYXBwaW5nIGZvciBAY2hhbm5lbHMuCisgKgorICogUmV0dXJuczogYSAjR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gd2l0aCBhbGwgdGhlIGNoYW5uZWwgcG9zaXRpb24gaW5mbyBzZXQgdG8KKyAqICNHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FLgorICovCit2b2lkCitnc3RfcnRwX2NoYW5uZWxzX2NyZWF0ZV9kZWZhdWx0IChnaW50IGNoYW5uZWxzLCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiAqIHBvc24pCit7CisgIGdpbnQgaTsKKworICBnX3JldHVybl9pZl9mYWlsIChjaGFubmVscyA+IDApOworCisgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKQorICAgIHBvc25baV0gPSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBjaGFubmVscy5oIGIvZ3N0L3J0cC9nc3RydHBjaGFubmVscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkM2Y1MzAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGNoYW5uZWxzLmgKQEAgLTAsMCArMSw0NiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA4PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaWZuZGVmIF9fR1NUX1JUUF9DSEFOTkVMU19IX18KKyNkZWZpbmUgX19HU1RfUlRQX0NIQU5ORUxTX0hfXworCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBnY2hhciAgICAgICAgICAgICAgICAgICAqbmFtZTsKKyAgZ2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzOworICBjb25zdCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiAqcG9zOworfSBHc3RSVFBDaGFubmVsT3JkZXI7CisKKyNkZWZpbmUgY2hhbm5lbF9vcmRlcnMgZ3N0X3J0cF9jaGFubmVsX29yZGVycworR19HTlVDX0lOVEVSTkFMIGV4dGVybiBjb25zdCBHc3RSVFBDaGFubmVsT3JkZXIgZ3N0X3J0cF9jaGFubmVsX29yZGVyc1tdOworCitjb25zdCBHc3RSVFBDaGFubmVsT3JkZXIgKiAgIGdzdF9ydHBfY2hhbm5lbHNfZ2V0X2J5X3BvcyAgICAgKGdpbnQgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uICpwb3MpOworY29uc3QgR3N0UlRQQ2hhbm5lbE9yZGVyICogICBnc3RfcnRwX2NoYW5uZWxzX2dldF9ieV9vcmRlciAgIChnaW50IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqb3JkZXIpOworY29uc3QgR3N0UlRQQ2hhbm5lbE9yZGVyICogICBnc3RfcnRwX2NoYW5uZWxzX2dldF9ieV9pbmRleCAgIChnaW50IGNoYW5uZWxzLCBndWludCBpZHgpOworCit2b2lkICAgICAgICAgICAgICAgICAgICAgICAgIGdzdF9ydHBfY2hhbm5lbHNfY3JlYXRlX2RlZmF1bHQgKGdpbnQgY2hhbm5lbHMsIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uICpwb3MpOworCisjZW5kaWYgLyogX19HU1RfUlRQX0NIQU5ORUxTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBkdmRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGR2ZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjM1YjcxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBkdmRlcGF5LmMKQEAgLTAsMCArMSw0MjUgQEAKKy8qIEZhcnNpZ2h0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWFyY2VsIE1vcmVhdXggPG1hcmNlbG1Ac3BhY2VsYWJzLm5sPgorICogICAgICAgICAgIChDKSAyMDA4IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIFJUUCBEViBkZXBheWxvYWRlci4KKyAqCisgKiBJbXBvcnRhbnQgbm90ZSBmb3IgTlRTQy11c2VyczoKKyAqCisgKiBCZWNhdXNlIHRoZSBhdXRob3IgdXNlcyBQQUwgdmlkZW8sIGFuZCBoZSBkb2VzIG5vdCBoYXZlIHByb3BlciBEVgorICogZG9jdW1lbnRhdGlvbiAodGhlIERWIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGlzIG5vdCBmcmVlbHkgYXZhaWxhYmxlKSwKKyAqIHRoaXMgY29kZSBtYXkgdmVyeSB3ZWxsIGNvbnRhaW4gUEFMLXNwZWNpZmljIGFzc3VtcHRpb25zLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJnc3RydHBkdmRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZIChydHBkdmRlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBkdmRlcGF5X2RlYnVnKQorLyogRmlsdGVyIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAsCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1kdiIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIHsgXCJ2aWRlb1wiLCBcImF1ZGlvXCIgfSwiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJEVlwiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsIgorICAgICAgICAiZW5jb2RlID0gKHN0cmluZykgeyBcIlNELVZDUi81MjUtNjBcIiwgXCJTRC1WQ1IvNjI1LTUwXCIsIFwiSEQtVkNSLzExMjUtNjBcIiwiCisgICAgICAgICJcIkhELVZDUi8xMjUwLTUwXCIsIFwiU0RMLVZDUi81MjUtNjBcIiwgXCJTREwtVkNSLzYyNS01MFwiLCIKKyAgICAgICAgIlwiMzA2TS81MjUtNjBcIiwgXCIzMDZNLzYyNS01MFwiLCBcIjMxNE0tMjUvNTI1LTYwXCIsIgorICAgICAgICAiXCIzMTRNLTI1LzYyNS01MFwiLCBcIjMxNE0tNTAvNTI1LTYwXCIsIFwiMzE0TS01MC82MjUtNTBcIiB9IgorICAgICAgICAvKiBvcHRpb25hbCBwYXJhbWV0ZXJzIGNhbid0IGdvIGluIHRoZSB0ZW1wbGF0ZQorICAgICAgICAgKiAiYXVkaW8gPSAoc3RyaW5nKSB7IFwiYnVuZGxlZFwiLCBcIm5vbmVcIiB9IgorICAgICAgICAgKi8KKyAgICApCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2R2X2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX2R2X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBiYXNlLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9kdl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworI2RlZmluZSBnc3RfcnRwX2R2X2RlcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJUUERWRGVwYXksIGdzdF9ydHBfZHZfZGVwYXksIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHZfZGVwYXlfY2xhc3NfaW5pdCAoR3N0UlRQRFZEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9CisgICAgICAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBkdmRlcGF5X2RlYnVnLCAicnRwZHZkZXBheSIsIDAsCisgICAgICAiRFYgUlRQIERlcGF5bG9hZGVyIik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2R2X2RlcGF5X2NoYW5nZV9zdGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua19mYWN0b3J5KTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUlRQIERWIERlcGF5bG9hZGVyIiwKKyAgICAgICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRGVwYXlsb2FkcyBEViBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMzE4OSkiLAorICAgICAgIk1hcmNlbCBNb3JlYXV4IDxtYXJjZWxtQHNwYWNlbGFicy5ubD4sIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+cHJvY2Vzc19ydHBfcGFja2V0ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2R2X2RlcGF5X3Byb2Nlc3MpOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kdl9kZXBheV9zZXRjYXBzKTsKK30KKworLyogaW5pdGlhbGl6ZSB0aGUgbmV3IGVsZW1lbnQKKyAqIGluc3RhbnRpYXRlIHBhZHMgYW5kIGFkZCB0aGVtIHRvIGVsZW1lbnQKKyAqIHNldCBmdW5jdGlvbnMKKyAqIGluaXRpYWxpemUgc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfcnRwX2R2X2RlcGF5X2luaXQgKEdzdFJUUERWRGVwYXkgKiBmaWx0ZXIpCit7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcGFyc2VfZW5jb2RlIChHc3RSVFBEVkRlcGF5ICogcnRwZHZkZXBheSwgY29uc3QgZ2NoYXIgKiBlbmNvZGUpCit7CisgIHJ0cGR2ZGVwYXktPndpZHRoID0gNzIwOworICBpZiAoIXN0cmNtcCAoZW5jb2RlLCAiMzE0TS0yNS81MjUtNjAiKSkgeworICAgIHJ0cGR2ZGVwYXktPmZyYW1lX3NpemUgPSAyNDAwMDA7CisgICAgcnRwZHZkZXBheS0+aGVpZ2h0ID0gNDgwOworICAgIHJ0cGR2ZGVwYXktPnJhdGVfbnVtID0gMzAwMDA7CisgICAgcnRwZHZkZXBheS0+cmF0ZV9kZW5vbSA9IDEwMDE7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoZW5jb2RlLCAiU0QtVkNSLzUyNS02MCIpKSB7CisgICAgcnRwZHZkZXBheS0+ZnJhbWVfc2l6ZSA9IDEyMDAwMDsKKyAgICBydHBkdmRlcGF5LT5oZWlnaHQgPSA0ODA7CisgICAgcnRwZHZkZXBheS0+cmF0ZV9udW0gPSAzMDAwMDsKKyAgICBydHBkdmRlcGF5LT5yYXRlX2Rlbm9tID0gMTAwMTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChlbmNvZGUsICIzMTRNLTUwLzYyNS01MCIpKSB7CisgICAgcnRwZHZkZXBheS0+ZnJhbWVfc2l6ZSA9IDI4ODAwMDsKKyAgICBydHBkdmRlcGF5LT5oZWlnaHQgPSA1NzY7CisgICAgcnRwZHZkZXBheS0+cmF0ZV9udW0gPSAyNTsKKyAgICBydHBkdmRlcGF5LT5yYXRlX2Rlbm9tID0gMTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChlbmNvZGUsICJTRC1WQ1IvNjI1LTUwIikpIHsKKyAgICBydHBkdmRlcGF5LT5mcmFtZV9zaXplID0gMTQ0MDAwOworICAgIHJ0cGR2ZGVwYXktPmhlaWdodCA9IDU3NjsKKyAgICBydHBkdmRlcGF5LT5yYXRlX251bSA9IDI1OworICAgIHJ0cGR2ZGVwYXktPnJhdGVfZGVub20gPSAxOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGVuY29kZSwgIjMxNE0tMjUvNjI1LTUwIikpIHsKKyAgICBydHBkdmRlcGF5LT5mcmFtZV9zaXplID0gMTQ0MDAwOworICAgIHJ0cGR2ZGVwYXktPmhlaWdodCA9IDU3NjsKKyAgICBydHBkdmRlcGF5LT5yYXRlX251bSA9IDI1OworICAgIHJ0cGR2ZGVwYXktPnJhdGVfZGVub20gPSAxOworICB9IGVsc2UKKyAgICBydHBkdmRlcGF5LT5mcmFtZV9zaXplID0gLTE7CisKKyAgcmV0dXJuIHJ0cGR2ZGVwYXktPmZyYW1lX3NpemUgIT0gLTE7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9kdl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdFJUUERWRGVwYXkgKnJ0cGR2ZGVwYXk7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKyAgZ2Jvb2xlYW4gc3lzdGVtc3RyZWFtLCByZXQ7CisgIGNvbnN0IGdjaGFyICplbmNvZGUsICptZWRpYTsKKworICBydHBkdmRlcGF5ID0gR1NUX1JUUF9EVl9ERVBBWSAoZGVwYXlsb2FkKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkKKyAgICBjbG9ja19yYXRlID0gOTAwMDA7ICAgICAgICAgLyogZGVmYXVsdCAqLworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIC8qIHdlIHJlYWxseSBuZWVkIHRoZSBlbmNvZGUgcHJvcGVydHkgdG8gZmlndXJlIG91dCB0aGUgZnJhbWUgc2l6ZSwgaXQncyBhbHNvCisgICAqIHJlcXVpcmVkIGJ5IHRoZSBzcGVjICovCisgIGlmICghKGVuY29kZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZW5jb2RlIikpKQorICAgIGdvdG8gbm9fZW5jb2RlOworCisgIC8qIGZpZ3VyZSBvdXQgdGhlIHNpemUgb2Ygb25lIGZyYW1lICovCisgIGlmICghcGFyc2VfZW5jb2RlIChydHBkdmRlcGF5LCBlbmNvZGUpKQorICAgIGdvdG8gdW5rbm93bl9lbmNvZGU7CisKKyAgLyogY2hlY2sgdGhlIG1lZGlhLCB0aGlzIHRlbGxzIHVzIHRoYXQgdGhlIHN0cmVhbSBoYXMgdmlkZW8gb3Igbm90ICovCisgIGlmICghKG1lZGlhID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJtZWRpYSIpKSkKKyAgICBnb3RvIG5vX21lZGlhOworCisgIHN5c3RlbXN0cmVhbSA9IEZBTFNFOworCisgIGlmICghc3RyY21wIChtZWRpYSwgImF1ZGlvIikpIHsKKyAgICAvKiB3ZSBuZWVkIGEgZGVtdXhlciBmb3IgYXVkaW8gb25seSAqLworICAgIHN5c3RlbXN0cmVhbSA9IFRSVUU7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWVkaWEsICJ2aWRlbyIpKSB7CisgICAgY29uc3QgZ2NoYXIgKmF1ZGlvOworCisgICAgLyogY2hlY2sgdGhlIG9wdGlvbmFsIGF1ZGlvIGZpZWxkLCBpZiBpdCdzIHByZXNlbnQgYW5kIHNldCB0byBidW5kbGVkLCB3ZQorICAgICAqIGFyZSBkZWFsaW5nIHdpdGggYSBzeXN0ZW0gc3RyZWFtLiAqLworICAgIGlmICgoYXVkaW8gPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImF1ZGlvIikpKSB7CisgICAgICBpZiAoIXN0cmNtcCAoYXVkaW8sICJidW5kbGVkIikpCisgICAgICAgIHN5c3RlbXN0cmVhbSA9IFRSVUU7CisgICAgfQorICB9CisKKyAgLyogYWxsb2NhdGUgYWNjdW11bGF0b3IgKi8KKyAgcnRwZHZkZXBheS0+YWNjID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChydHBkdmRlcGF5LT5mcmFtZV9zaXplKTsKKworICAvKiBJbml0aWFsaXplIHRoZSBuZXcgYWNjdW11bGF0b3IgZnJhbWUuCisgICAqIElmIHRoZSBwcmV2aW91cyBmcmFtZSBleGlzdHMsIGNvcHkgdGhhdCBpbnRvIHRoZSBhY2N1bXVsYXRvciBmcmFtZS4KKyAgICogVGhpcyB3YXksIG1pc3NpbmcgcGFja2V0cyBpbiB0aGUgc3RyZWFtIHdvbid0IHNob3cgdXAgYmFkbHkuICovCisgIGdzdF9idWZmZXJfbWVtc2V0IChydHBkdmRlcGF5LT5hY2MsIDAsIDAsIHJ0cGR2ZGVwYXktPmZyYW1lX3NpemUpOworCisgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1kdiIsCisgICAgICAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIHN5c3RlbXN0cmVhbSwKKyAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHJ0cGR2ZGVwYXktPndpZHRoLAorICAgICAgImhlaWdodCIsIEdfVFlQRV9JTlQsIHJ0cGR2ZGVwYXktPmhlaWdodCwKKyAgICAgICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTiwgcnRwZHZkZXBheS0+cmF0ZV9udW0sCisgICAgICBydHBkdmRlcGF5LT5yYXRlX2Rlbm9tLCBOVUxMKTsKKyAgcmV0ID0gZ3N0X3BhZF9zZXRfY2FwcyAoZGVwYXlsb2FkLT5zcmNwYWQsIHNyY2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK25vX2VuY29kZToKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGR2ZGVwYXksICJyZXF1aXJlZCBlbmNvZGUgcHJvcGVydHkgbm90IGZvdW5kIGluIGNhcHMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3Vua25vd25fZW5jb2RlOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwZHZkZXBheSwgInVua25vd24gZW5jb2RlIHByb3BlcnR5ICVzIGZvdW5kIiwgZW5jb2RlKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX21lZGlhOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwZHZkZXBheSwgInJlcXVpcmVkIG1lZGlhIHByb3BlcnR5IG5vdCBmb3VuZCBpbiBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qIEEgRFYgZnJhbWUgY29uc2lzdHMgb2YgYSBidW5jaCBvZiA4MC1ieXRlIERJRiBibG9ja3MuCisgKiBFYWNoIERJRiBibG9jayBjb250YWlucyBhIDMtYnl0ZSBoZWFkZXIgdGVsbGluZyB3aGVyZSBpbiB0aGUgRFYgZnJhbWUgdGhlCisgKiBESUYgYmxvY2sgc2hvdWxkIGdvLiBXZSB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBjYWxjdWxhdGUgaXRzIHBvc2l0aW9uLgorICovCitzdGF0aWMgZ3VpbnQKK2NhbGN1bGF0ZV9kaWZibG9ja19sb2NhdGlvbiAoZ3VpbnQ4ICogYmxvY2spCit7CisgIGdpbnQgYmxvY2tfdHlwZSwgZGlmX3NlcXVlbmNlLCBkaWZfYmxvY2s7CisgIGd1aW50IGxvY2F0aW9uOworCisgIGJsb2NrX3R5cGUgPSBibG9ja1swXSA+PiA1OworICBkaWZfc2VxdWVuY2UgPSBibG9ja1sxXSA+PiA0OworICBkaWZfYmxvY2sgPSBibG9ja1syXTsKKworICBsb2NhdGlvbiA9IGRpZl9zZXF1ZW5jZSAqIDE1MDsKKworICBzd2l0Y2ggKGJsb2NrX3R5cGUpIHsKKyAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAvKiBIZWFkZXIgYmxvY2ssIG5vIG9mZnNldCAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgLyogU3ViY29kZSBibG9jayAqLworICAgICAgbG9jYXRpb24gKz0gKDEgKyBkaWZfYmxvY2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgLyogVkFVWCBibG9jayAqLworICAgICAgbG9jYXRpb24gKz0gKDMgKyBkaWZfYmxvY2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgLyogQXVkaW8gYmxvY2sgKi8KKyAgICAgIGxvY2F0aW9uICs9ICg2ICsgZGlmX2Jsb2NrICogMTYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OiAgICAgICAgICAgICAgICAgICAgLyogVmlkZW8gYmxvY2sgKi8KKyAgICAgIGxvY2F0aW9uICs9ICg3ICsgKGRpZl9ibG9jayAvIDE1KSArIGRpZl9ibG9jayk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAvKiBTb21ldGhpbmcgYm9ndXMgKi8KKyAgICAgIEdTVF9ERUJVRyAoIlVOS05PV04gQkxPQ0siKTsKKyAgICAgIGxvY2F0aW9uID0gLTE7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gbG9jYXRpb247Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZm9yZWFjaF9tZXRhZGF0YV9kcm9wIChHc3RCdWZmZXIgKiBpbmJ1ZiwgR3N0TWV0YSAqKiBtZXRhLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgICptZXRhID0gTlVMTDsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFByb2Nlc3Mgb25lIFJUUCBwYWNrZXQuIEFjY3VtdWxhdGUgUlRQIHBheWxvYWQgaW4gdGhlIHByb3BlciBwbGFjZSBpbiBhIERWCisgKiBmcmFtZSwgYW5kIHJldHVybiB0aGF0IGZyYW1lIGlmIHdlIGRldGVjdCBhIG5ldyBmcmFtZSwgb3IgTlVMTCBvdGhlcndpc2UuCisgKiBXZSBhc3N1bWUgYSBEViBmcmFtZSBpcyAxNDQwMDAgYnl0ZXMuIFRoYXQgc2hvdWxkIGFjY29tb2RhdGUgUEFMIGFzIHdlbGwgYXMKKyAqIE5UU0MuCisgKi8KK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9kdl9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogYmFzZSwgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RCdWZmZXIgKm91dCA9IE5VTEw7CisgIGd1aW50OCAqcGF5bG9hZDsKKyAgZ3VpbnQzMiBydHBfdHM7CisgIGd1aW50IHBheWxvYWRfbGVuLCBsb2NhdGlvbjsKKyAgR3N0UlRQRFZEZXBheSAqZHZkZXBheSA9IEdTVF9SVFBfRFZfREVQQVkgKGJhc2UpOworICBnYm9vbGVhbiBtYXJrZXI7CisgIEdzdE1hcEluZm8gbWFwOworCisgIG1hcmtlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCk7CisKKyAgLyogQ2hlY2sgaWYgdGhlIHJlY2VpdmVkIHBhY2tldCBjb250YWlucyAodGhlIHN0YXJ0IG9mKSBhIG5ldyBmcmFtZSwgd2UgZG8KKyAgICogdGhpcyBieSBjaGVja2luZyB0aGUgUlRQIHRpbWVzdGFtcC4gKi8KKyAgcnRwX3RzID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3RpbWVzdGFtcCAocnRwKTsKKworICAvKiB3ZSBjYW5ub3QgY29weSB0aGUgcGFja2V0IHlldCBpZiB0aGUgbWFya2VyIGlzIHNldCwgd2Ugd2lsbCBkbyB0aGF0IGJlbG93CisgICAqIGFmdGVyIHRha2luZyBvdXQgdGhlIGRhdGEgKi8KKyAgaWYgKGR2ZGVwYXktPnByZXZfdHMgIT0gLTEgJiYgcnRwX3RzICE9IGR2ZGVwYXktPnByZXZfdHMgJiYgIW1hcmtlcikgeworICAgIC8qIHRoZSB0aW1lc3RhbXAgY2hhbmdlZCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR2ZGVwYXksICJuZXcgZnJhbWUgd2l0aCB0cyAldSwgb2xkIHRzICV1IiwgcnRwX3RzLAorICAgICAgICBkdmRlcGF5LT5wcmV2X3RzKTsKKworICAgIC8qIHJldHVybiBjb3B5IG9mIGFjY3VtdWxhdG9yLiAqLworICAgIG91dCA9IGdzdF9idWZmZXJfY29weSAoZHZkZXBheS0+YWNjKTsKKyAgICBnc3RfYnVmZmVyX2ZvcmVhY2hfbWV0YSAoZHZkZXBheS0+YWNjLCBmb3JlYWNoX21ldGFkYXRhX2Ryb3AsIE5VTEwpOworICB9CisKKyAgLyogRXh0cmFjdCB0aGUgcGF5bG9hZCAqLworICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAocnRwKTsKKyAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkIChydHApOworCisgIC8qIGNvcHkgYWxsIERJRiBjaHVua3MgaW4gdGhlaXIgcGxhY2UuICovCisgIGdzdF9idWZmZXJfbWFwIChkdmRlcGF5LT5hY2MsICZtYXAsIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgd2hpbGUgKHBheWxvYWRfbGVuID49IDgwKSB7CisgICAgZ3VpbnQgb2Zmc2V0OworCisgICAgLyogQ2FsY3VsYXRlIHdoZXJlIGluIHRoZSBmcmFtZSB0aGUgcGF5bG9hZCBzaG91bGQgZ28gKi8KKyAgICBsb2NhdGlvbiA9IGNhbGN1bGF0ZV9kaWZibG9ja19sb2NhdGlvbiAocGF5bG9hZCk7CisKKyAgICBpZiAobG9jYXRpb24gPCA2KSB7CisgICAgICAvKiBwYXJ0IG9mIGEgaGVhZGVyLCBzZXQgdGhlIGZsYWcgdG8gbWFyayB0aGF0IHdlIGhhdmUgdGhlIGhlYWRlci4gKi8KKyAgICAgIGR2ZGVwYXktPmhlYWRlcl9tYXNrIHw9ICgxIDw8IGxvY2F0aW9uKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChkdmRlcGF5LCAiZ290IGhlYWRlciBhdCBsb2NhdGlvbiAlZCwgbm93ICUwMngiLCBsb2NhdGlvbiwKKyAgICAgICAgICBkdmRlcGF5LT5oZWFkZXJfbWFzayk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChkdmRlcGF5LCAiZ290IGJsb2NrIGF0IGxvY2F0aW9uICVkIiwgbG9jYXRpb24pOworICAgIH0KKworICAgIGlmIChsb2NhdGlvbiAhPSAtMSkgeworICAgICAgLyogZ2V0IHRoZSBieXRlIG9mZnNldCBvZiB0aGUgZGlmIGJsb2NrICovCisgICAgICBvZmZzZXQgPSBsb2NhdGlvbiAqIDgwOworCisgICAgICAvKiBBbmQgY29weSBpdCBpbiwgcHJvdmlkZWQgdGhlIGxvY2F0aW9uIGlzIHNhbmUuICovCisgICAgICBpZiAob2Zmc2V0IDw9IGR2ZGVwYXktPmZyYW1lX3NpemUgLSA4MCkgeworICAgICAgICBtZW1jcHkgKG1hcC5kYXRhICsgb2Zmc2V0LCBwYXlsb2FkLCA4MCk7CisgICAgICAgIGdzdF9ydHBfY29weV9tZXRhIChHU1RfRUxFTUVOVF9DQVNUIChkdmRlcGF5KSwgZHZkZXBheS0+YWNjLAorICAgICAgICAgICAgcnRwLT5idWZmZXIsIDApOworICAgICAgfQorICAgIH0KKworICAgIHBheWxvYWQgKz0gODA7CisgICAgcGF5bG9hZF9sZW4gLT0gODA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoZHZkZXBheS0+YWNjLCAmbWFwKTsKKworICBpZiAobWFya2VyKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZHZkZXBheSwgIm1hcmtlciBiaXQgY29tcGxldGUgZnJhbWUgJXUiLCBydHBfdHMpOworICAgIC8qIG9ubHkgY29weSB0aGUgZnJhbWUgd2hlbiB3ZSBoYXZlIGEgY29tcGxldGUgaGVhZGVyICovCisgICAgaWYgKGR2ZGVwYXktPmhlYWRlcl9tYXNrID09IDB4M2YpIHsKKyAgICAgIC8qIFRoZSBtYXJrZXIgbWFya3MgdGhlIGVuZCBvZiBhIGZyYW1lIHRoYXQgd2UgbmVlZCB0byBwdXNoLiBUaGUgbmV4dCBmcmFtZQorICAgICAgICogd2lsbCBjaGFuZ2UgdGhlIHRpbWVzdGFtcCBidXQgd2Ugd29uJ3QgY29weSB0aGUgYWNjdW11bGF0b3IgYWdhaW4gYmVjYXVzZQorICAgICAgICogd2Ugc2V0IHRoZSBwcmV2X3RzIHRvIC0xLiAqLworICAgICAgb3V0ID0gZ3N0X2J1ZmZlcl9jb3B5IChkdmRlcGF5LT5hY2MpOworICAgICAgZ3N0X2J1ZmZlcl9mb3JlYWNoX21ldGEgKGR2ZGVwYXktPmFjYywgZm9yZWFjaF9tZXRhZGF0YV9kcm9wLCBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkdmRlcGF5LCAid2FpdGluZyBmb3IgZnJhbWUgaGVhZGVycyAlMDJ4IiwKKyAgICAgICAgICBkdmRlcGF5LT5oZWFkZXJfbWFzayk7CisgICAgfQorICAgIGR2ZGVwYXktPnByZXZfdHMgPSAtMTsKKyAgfSBlbHNlIHsKKyAgICAvKiBzYXZlIGxhc3QgdGltZXN0YW1wICovCisgICAgZHZkZXBheS0+cHJldl90cyA9IHJ0cF90czsKKyAgfQorICByZXR1cm4gb3V0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9kdl9kZXBheV9yZXNldCAoR3N0UlRQRFZEZXBheSAqIGRlcGF5KQoreworICBpZiAoZGVwYXktPmFjYykKKyAgICBnc3RfYnVmZmVyX3VucmVmIChkZXBheS0+YWNjKTsKKyAgZGVwYXktPmFjYyA9IE5VTEw7CisKKyAgZGVwYXktPnByZXZfdHMgPSAtMTsKKyAgZGVwYXktPmhlYWRlcl9tYXNrID0gMDsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2R2X2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0UlRQRFZEZXBheSAqZGVwYXkgPSBHU1RfUlRQX0RWX0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X3J0cF9kdl9kZXBheV9yZXNldCAoZGVwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0NBTExfUEFSRU5UX1dJVEhfREVGQVVMVCAoR1NUX0VMRU1FTlRfQ0xBU1MsIGNoYW5nZV9zdGF0ZSwKKyAgICAgIChlbGVtZW50LCB0cmFuc2l0aW9uKSwgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3J0cF9kdl9kZXBheV9yZXNldCAoZGVwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2R2X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwZHZkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9EVl9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGR2ZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwZHZkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZTViOTcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGR2ZGVwYXkuaApAQCAtMCwwICsxLDY2IEBACisvKiBGYXJzaWdodAorICogQ29weXJpZ2h0IChDKSAyMDA2IE1hcmNlbCBNb3JlYXV4IDxtYXJjZWxtQHNwYWNlbGFicy5ubD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUUlRQRFZERVBBWV9IX18KKyNkZWZpbmUgX19HU1RSVFBEVkRFUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qICNkZWZpbmUncyBkb24ndCBsaWtlIHdoaXRlc3BhY2V5IGJpdHMgKi8KKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0RWX0RFUEFZIChnc3RfcnRwX2R2X2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfRFZfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfRFZfREVQQVksR3N0UlRQRFZEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfRFZfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0RWX0RFUEFZLEdzdFJUUERWRGVwYXkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0RWX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0RWX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9EVl9ERVBBWV9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0RWX0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUERWRGVwYXkgICAgICBHc3RSVFBEVkRlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUERWRGVwYXlDbGFzcyBHc3RSVFBEVkRlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UlRQRFZEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIHBhcmVudDsKKworICBHc3RCdWZmZXIgKmFjYzsKKyAgZ3VpbnQgZnJhbWVfc2l6ZTsKKyAgZ3VpbnQzMiBwcmV2X3RzOworICBndWludDggaGVhZGVyX21hc2s7CisKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnaW50IHJhdGVfbnVtLCByYXRlX2Rlbm9tOworfTsKKworc3RydWN0IF9Hc3RSVFBEVkRlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfZHZfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2R2X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RSVFBEVkRFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBkdnBheS5jIGIvZ3N0L3J0cC9nc3RydHBkdnBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MDg4MDYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGR2cGF5LmMKQEAgLTAsMCArMSwzOTcgQEAKKy8qIEZhcnNpZ2h0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWFyY2VsIE1vcmVhdXggPG1hcmNlbG1Ac3BhY2VsYWJzLm5sPgorICogICAgICAgICAgIChDKSAyMDA4IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCisjaW5jbHVkZSAiZ3N0cnRwZHZwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUlkgKHJ0cGR2cGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBkdnBheV9kZWJ1ZykKKworI2RlZmluZSBERUZBVUxUX01PREUgR1NUX0RWX1BBWV9NT0RFX1ZJREVPCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9NT0RFCit9OworCisvKiB0YWtlcyBib3RoIHN5c3RlbSBhbmQgbm9uLXN5c3RlbSBzdHJlYW1zICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9kdl9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LWR2IikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9kdl9wYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSB7IFwidmlkZW9cIiwgXCJhdWRpb1wiIH0gLCIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJEVlwiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsIgorICAgICAgICAiZW5jb2RlID0gKHN0cmluZykgeyBcIlNELVZDUi81MjUtNjBcIiwgXCJTRC1WQ1IvNjI1LTUwXCIsIFwiSEQtVkNSLzExMjUtNjBcIiwiCisgICAgICAgICJcIkhELVZDUi8xMjUwLTUwXCIsIFwiU0RMLVZDUi81MjUtNjBcIiwgXCJTREwtVkNSLzYyNS01MFwiLCIKKyAgICAgICAgIlwiMzA2TS81MjUtNjBcIiwgXCIzMDZNLzYyNS01MFwiLCBcIjMxNE0tMjUvNTI1LTYwXCIsIgorICAgICAgICAiXCIzMTRNLTI1LzYyNS01MFwiLCBcIjMxNE0tNTAvNTI1LTYwXCIsIFwiMzE0TS01MC82MjUtNTBcIiB9IgorICAgICAgICAvKiBvcHRpb25hbCBwYXJhbWV0ZXJzIGNhbid0IGdvIGluIHRoZSB0ZW1wbGF0ZQorICAgICAgICAgKiAiYXVkaW8gPSAoc3RyaW5nKSB7IFwiYnVuZGxlZFwiLCBcIm5vbmVcIiB9IgorICAgICAgICAgKi8KKyAgICApCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfZHZfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX2R2X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKKworI2RlZmluZSBHU1RfVFlQRV9EVl9QQVlfTU9ERSAoZ3N0X2R2X3BheV9tb2RlX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9kdl9wYXlfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGR2X3BheV9tb2RlX3R5cGUgPSAwOworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSBkdl9wYXlfbW9kZXNbXSA9IHsKKyAgICB7R1NUX0RWX1BBWV9NT0RFX1ZJREVPLCAiVmlkZW8gb25seSIsICJ2aWRlbyJ9LAorICAgIHtHU1RfRFZfUEFZX01PREVfQlVORExFRCwgIlZpZGVvIGFuZCBBdWRpbyBidW5kbGVkIiwgImJ1bmRsZWQifSwKKyAgICB7R1NUX0RWX1BBWV9NT0RFX0FVRElPLCAiQXVkaW8gb25seSIsICJhdWRpbyJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIWR2X3BheV9tb2RlX3R5cGUpIHsKKyAgICBkdl9wYXlfbW9kZV90eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdERWUGF5TW9kZSIsIGR2X3BheV9tb2Rlcyk7CisgIH0KKyAgcmV0dXJuIGR2X3BheV9tb2RlX3R5cGU7Cit9CisKKworc3RhdGljIHZvaWQgZ3N0X2R2X3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfZHZfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworI2RlZmluZSBnc3RfcnRwX2R2X3BheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSVFBEVlBheSwgZ3N0X3J0cF9kdl9wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9kdl9wYXlfY2xhc3NfaW5pdCAoR3N0UlRQRFZQYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGR2cGF5X2RlYnVnLCAicnRwZHZwYXkiLCAwLCAiRFYgUlRQIFBheWxvYWRlciIpOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfZHZfcGF5X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2R2X3BheV9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJtb2RlIiwgIk1vZGUiLAorICAgICAgICAgICJUaGUgcGF5bG9hZCBtb2RlIG9mIHBheWxvYWRpbmciLAorICAgICAgICAgIEdTVF9UWVBFX0RWX1BBWV9NT0RFLCBERUZBVUxUX01PREUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9kdl9wYXlfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZHZfcGF5X3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlJUUCBEViBQYXlsb2FkZXIiLAorICAgICAgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZHMgRFYgaW50byBSVFAgcGFja2V0cyAoUkZDIDMxODkpIiwKKyAgICAgICJNYXJjZWwgTW9yZWF1eCA8bWFyY2VsbUBzcGFjZWxhYnMubmw+LCBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfZHZfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9kdl9wYXlfaGFuZGxlX2J1ZmZlcjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHZfcGF5X2luaXQgKEdzdFJUUERWUGF5ICogcnRwZHZwYXkpCit7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZHZfcGF5X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSVFBEVlBheSAqcnRwZHZwYXkgPSBHU1RfUlRQX0RWX1BBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTU9ERToKKyAgICAgIHJ0cGR2cGF5LT5tb2RlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2R2X3BheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UlRQRFZQYXkgKnJ0cGR2cGF5ID0gR1NUX1JUUF9EVl9QQVkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01PREU6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgcnRwZHZwYXktPm1vZGUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfZHZfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIC8qIFdlIGRvbid0IGRvIGFueXRoaW5nIGhlcmUsIGJ1dCB3ZSBjb3VsZCBjaGVjayBpZiBpdCdzIGEgc3lzdGVtIHN0cmVhbSBhbmQgaWYKKyAgICogaXQncyBub3QsIGRlZmF1bHQgdG8gc2VuZGluZyB0aGUgdmlkZW8gb25seS4gV2Ugd2lsbCBuZWdvdGlhdGUgZG93bnN0cmVhbQorICAgKiBjYXBzIHdoZW4gd2UgZ2V0IHRvIHNlZSB0aGUgZmlyc3QgZnJhbWUuICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2R2X3BheV9uZWdvdGlhdGUgKEdzdFJUUERWUGF5ICogcnRwZHZwYXksIGd1aW50OCAqIGRhdGEsIGdzaXplIHNpemUpCit7CisgIGNvbnN0IGdjaGFyICplbmNvZGUsICptZWRpYTsKKyAgZ2Jvb2xlYW4gYXVkaW9fYnVuZGxlZCwgcmVzOworCisgIGlmICgoZGF0YVszXSAmIDB4ODApID09IDApIHsgIC8qIERTRiBmbGFnICovCisgICAgLyogaXQncyBhbiBOVFNDIGZvcm1hdCAqLworICAgIGlmICgoZGF0YVs4MCAqIDUgKyA0OCArIDNdICYgMHg0KSAmJiAoZGF0YVs4MCAqIDUgKyA0OF0gPT0gMHg2MCkpIHsgLyogNDoyOjIgc2FtcGxpbmcgKi8KKyAgICAgIC8qIE5UU0MgNTBNYnBzICovCisgICAgICBlbmNvZGUgPSAiMzE0TS0yNS81MjUtNjAiOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiA0OjE6MSBzYW1wbGluZyAqLworICAgICAgLyogTlRTQyAyNU1icHMgKi8KKyAgICAgIGVuY29kZSA9ICJTRC1WQ1IvNTI1LTYwIjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogaXQncyBhIFBBTCBmb3JtYXQgKi8KKyAgICBpZiAoKGRhdGFbODAgKiA1ICsgNDggKyAzXSAmIDB4NCkgJiYgKGRhdGFbODAgKiA1ICsgNDhdID09IDB4NjApKSB7IC8qIDQ6MjoyIHNhbXBsaW5nICovCisgICAgICAvKiBQQUwgNTBNYnBzICovCisgICAgICBlbmNvZGUgPSAiMzE0TS01MC82MjUtNTAiOworICAgIH0gZWxzZSBpZiAoKGRhdGFbNV0gJiAweDA3KSA9PSAwKSB7IC8qIEFQVCBmbGFnICovCisgICAgICAvKiBQQUwgMjVNYnBzIDQ6MjowICovCisgICAgICBlbmNvZGUgPSAiU0QtVkNSLzYyNS01MCI7CisgICAgfSBlbHNlCisgICAgICAvKiBQQUwgMjVNYnBzIDQ6MToxICovCisgICAgICBlbmNvZGUgPSAiMzE0TS0yNS82MjUtNTAiOworICB9CisKKyAgbWVkaWEgPSAidmlkZW8iOworICBhdWRpb19idW5kbGVkID0gRkFMU0U7CisKKyAgc3dpdGNoIChydHBkdnBheS0+bW9kZSkgeworICAgIGNhc2UgR1NUX0RWX1BBWV9NT0RFX0FVRElPOgorICAgICAgbWVkaWEgPSAiYXVkaW8iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRFZfUEFZX01PREVfQlVORExFRDoKKyAgICAgIGF1ZGlvX2J1bmRsZWQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwZHZwYXkpLCBtZWRpYSwKKyAgICAgIFRSVUUsICJEViIsIDkwMDAwKTsKKworICBpZiAoYXVkaW9fYnVuZGxlZCkgeworICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwZHZwYXkpLAorICAgICAgICAiZW5jb2RlIiwgR19UWVBFX1NUUklORywgZW5jb2RlLAorICAgICAgICAiYXVkaW8iLCBHX1RZUEVfU1RSSU5HLCAiYnVuZGxlZCIsIE5VTEwpOworICB9IGVsc2UgeworICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwZHZwYXkpLAorICAgICAgICAiZW5jb2RlIiwgR19UWVBFX1NUUklORywgZW5jb2RlLCBOVUxMKTsKKyAgfQorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2luY2x1ZGVfZGlmIChHc3RSVFBEVlBheSAqIHJ0cGR2cGF5LCBndWludDggKiBkYXRhKQoreworICBnaW50IGJsb2NrX3R5cGU7CisgIGdib29sZWFuIHJlczsKKworICBibG9ja190eXBlID0gZGF0YVswXSA+PiA1OworCisgIHN3aXRjaCAoYmxvY2tfdHlwZSkgeworICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgIC8qIEhlYWRlciBibG9jayAqLworICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgIC8qIFN1YmNvZGUgYmxvY2sgKi8KKyAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAvKiBWQVVYIGJsb2NrICovCisgICAgICAvKiBhbHdheXMgaW5jbHVkZSB0aGVzZSBibG9ja3MgKi8KKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAvKiBBdWRpbyBibG9jayAqLworICAgICAgLyogbmV2ZXIgaW5jbHVkZSBhdWRpbyBpZiB3ZSBhcmUgZG9pbmcgdmlkZW8gb25seSAqLworICAgICAgaWYgKHJ0cGR2cGF5LT5tb2RlID09IEdTVF9EVl9QQVlfTU9ERV9WSURFTykKKyAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICBlbHNlCisgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6ICAgICAgICAgICAgICAgICAgICAvKiBWaWRlbyBibG9jayAqLworICAgICAgLyogbmV2ZXIgaW5jbHVkZSB2aWRlbyBpZiB3ZSBhcmUgZG9pbmcgYXVkaW8gb25seSAqLworICAgICAgaWYgKHJ0cGR2cGF5LT5tb2RlID09IEdTVF9EVl9QQVlfTU9ERV9BVURJTykKKyAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICBlbHNlCisgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAvKiBTb21ldGhpbmcgYm9ndXMsIGp1c3QgaWdub3JlICovCisgICAgICByZXMgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKKy8qIEdldCBhIERWIGZyYW1lLCBjaG9wIGl0IHVwIGluIHBpZWNlcywgYW5kIHB1c2ggdGhlIHBpZWNlcyB0byB0aGUgUlRQIGxheWVyLgorICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9kdl9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJUUERWUGF5ICpydHBkdnBheTsKKyAgZ3VpbnQgbWF4X3BheWxvYWRfc2l6ZTsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGdpbnQgaGRybGVuOworICBnc2l6ZSBzaXplOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ4ICpkYXRhOworICBndWludDggKmRlc3Q7CisgIGd1aW50IGZpbGxlZDsKKyAgR3N0UlRQQnVmZmVyIHJ0cCA9IHsgTlVMTCwgfTsKKworICBydHBkdnBheSA9IEdTVF9SVFBfRFZfUEFZIChiYXNlcGF5bG9hZCk7CisKKyAgaGRybGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19oZWFkZXJfbGVuICgwKTsKKyAgLyogRFYgZnJhbWVzIGFyZSBtYWRlIHVwIGZyb20gYSBidW5jaCBvZiBESUYgYmxvY2tzLiBESUYgYmxvY2tzIGFyZSA4MCBieXRlcworICAgKiBlYWNoLCBhbmQgd2Ugc2hvdWxkIHB1dCBhbiBpbnRlZ3JhbCBudW1iZXIgb2YgdGhlbSBpbiBlYWNoIFJUUCBwYWNrZXQuCisgICAqIFRoZXJlZm9yZSwgd2Ugcm91bmQgdGhlIGF2YWlsYWJsZSByb29tIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgODAuCisgICAqCisgICAqIFRoZSBhdmFpbGFibGUgcm9vbSBpcyBqdXN0IHRoZSBwYWNrZXQgTVRVLCBtaW51cyB0aGUgUlRQIGhlYWRlciBsZW5ndGguICovCisgIG1heF9wYXlsb2FkX3NpemUgPSAoKEdTVF9SVFBfQkFTRV9QQVlMT0FEX01UVSAocnRwZHZwYXkpIC0gaGRybGVuKSAvIDgwKSAqIDgwOworCisgIC8qIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciB0byB0cmFuc21pdC4gKi8KKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpKSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHJ0cGR2cGF5LCBDT1JFLCBGQUlMRUQsCisgICAgICAgIChOVUxMKSwgKCJGYWlsZWQgdG8gbWFwIGJ1ZmZlciIpKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorICBkYXRhID0gbWFwLmRhdGE7CisgIHNpemUgPSBtYXAuc2l6ZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBkdnBheSwKKyAgICAgICJEViBSVFAgcGF5bG9hZGVyIGdvdCBidWZmZXIgb2YgJSIgR19HU0laRV9GT1JNQVQKKyAgICAgICIgYnl0ZXMsIHNwbGl0dGluZyBpbiAldSBieXRlICIgInBheWxvYWQgZnJhZ21lbnRzLCBhdCB0aW1lICUiCisgICAgICBHU1RfVElNRV9GT1JNQVQsIHNpemUsIG1heF9wYXlsb2FkX3NpemUsCisgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKSkpOworCisgIGlmICghcnRwZHZwYXktPm5lZ290aWF0ZWQpIHsKKyAgICBnc3RfZHZfcGF5X25lZ290aWF0ZSAocnRwZHZwYXksIGRhdGEsIHNpemUpOworICAgIC8qIGlmIHdlIGhhdmUgbm90IHlldCBzY2FubmVkIHRoZSBzdHJlYW0gZm9yIGl0cyB0eXBlLCBkbyBzbyBub3cgKi8KKyAgICBydHBkdnBheS0+bmVnb3RpYXRlZCA9IFRSVUU7CisgIH0KKworICBvdXRidWYgPSBOVUxMOworICBkZXN0ID0gTlVMTDsKKyAgZmlsbGVkID0gMDsKKworICAvKiB3aGlsZSB3ZSBoYXZlIGEgY29tcGxldGUgRElGIGNodW5rcyBsZWZ0ICovCisgIHdoaWxlIChzaXplID49IDgwKSB7CisgICAgLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyLCBzZXQgdGhlIHRpbWVzdGFtcCAqLworICAgIGlmIChvdXRidWYgPT0gTlVMTCkgeworICAgICAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChtYXhfcGF5bG9hZF9zaXplLCAwLCAwKTsKKyAgICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcik7CisKKyAgICAgIGlmICghZ3N0X3J0cF9idWZmZXJfbWFwIChvdXRidWYsIEdTVF9NQVBfV1JJVEUsICZydHApKSB7CisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1Zik7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChydHBkdnBheSwgQ09SRSwgRkFJTEVELAorICAgICAgICAgICAgKE5VTEwpLCAoIkZhaWxlZCB0byBtYXAgUlRQIGJ1ZmZlciIpKTsKKyAgICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICB9CisgICAgICBkZXN0ID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHApOworICAgICAgZmlsbGVkID0gMDsKKyAgICB9CisKKyAgICAvKiBpbnNwZWN0IHRoZSBESUYgY2h1bmssIGlmIHdlIGRvbid0IG5lZWQgdG8gaW5jbHVkZSBpdCwgc2tpcCB0byB0aGUgbmV4dCBvbmUuICovCisgICAgaWYgKGluY2x1ZGVfZGlmIChydHBkdnBheSwgZGF0YSkpIHsKKyAgICAgIC8qIGNvcHkgZGF0YSBpbiBwYWNrZXQgKi8KKyAgICAgIG1lbWNweSAoZGVzdCwgZGF0YSwgODApOworCisgICAgICBkZXN0ICs9IDgwOworICAgICAgZmlsbGVkICs9IDgwOworICAgIH0KKworICAgIC8qIGdvIHRvIG5leHQgZGlmIGNodW5rICovCisgICAgc2l6ZSAtPSA4MDsKKyAgICBkYXRhICs9IDgwOworCisgICAgLyogcHVzaCBvdXQgdGhlIGJ1ZmZlciBpZiB0aGUgbmV4dCBvbmUgd291bGQgZXhjZWVkIHRoZSBtYXggcGFja2V0IHNpemUgb3IKKyAgICAgKiB3aGVuIHdlIGFyZSBwdXNoaW5nIHRoZSBsYXN0IHBhY2tldCAqLworICAgIGlmIChmaWxsZWQgKyA4MCA+IG1heF9wYXlsb2FkX3NpemUgfHwgc2l6ZSA8IDgwKSB7CisgICAgICBpZiAoc2l6ZSA8IDE2MCkgeworICAgICAgICBndWludCBobGVuOworCisgICAgICAgIC8qIHNldCBtYXJrZXIgKi8KKyAgICAgICAgZ3N0X3J0cF9idWZmZXJfc2V0X21hcmtlciAoJnJ0cCwgVFJVRSk7CisKKyAgICAgICAgLyogc2hyaW5rIGJ1ZmZlciB0byBsYXN0IHBhY2tldCAqLworICAgICAgICBobGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X2hlYWRlcl9sZW4gKCZydHApOworICAgICAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfcGFja2V0X2xlbiAoJnJ0cCwgaGxlbiArIGZpbGxlZCk7CisgICAgICB9CisKKyAgICAgIC8qIFB1c2ggb3V0IHRoZSBjcmVhdGVkIHBpZWNlLCBhbmQgY2hlY2sgZm9yIGVycm9ycy4gKi8KKyAgICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgICAgIGdzdF9ydHBfY29weV9tZXRhIChHU1RfRUxFTUVOVF9DQVNUIChiYXNlcGF5bG9hZCksIG91dGJ1ZiwgYnVmZmVyLCAwKTsKKyAgICAgIHJldCA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKGJhc2VwYXlsb2FkLCBvdXRidWYpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIG91dGJ1ZiA9IE5VTEw7CisgICAgfQorICB9CisKK2JlYWNoOgorICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2R2X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGR2cGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX0RWX1BBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGR2cGF5LmggYi9nc3QvcnRwL2dzdHJ0cGR2cGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMyNTBhOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwZHZwYXkuaApAQCAtMCwwICsxLDY5IEBACisvKiBGYXJzaWdodAorICogQ29weXJpZ2h0IChDKSAyMDA2IE1hcmNlbCBNb3JlYXV4IDxtYXJjZWxtQHNwYWNlbGFicy5ubD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RSVFBEVlBBWV9IX18KKyNkZWZpbmUgX19HU1RSVFBEVlBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUERWUGF5IEdzdFJUUERWUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUERWUGF5Q2xhc3MgR3N0UlRQRFZQYXlDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfRFZfUEFZIFwKKyAgKGdzdF9ydHBfZHZfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfRFZfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0RWX1BBWSxHc3RSVFBEVlBheSkpCisjZGVmaW5lIEdTVF9SVFBfRFZfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9EVl9QQVksR3N0UlRQRFZQYXkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0RWX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9EVl9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0RWX1BBWV9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0RWX1BBWSkpCisKK3R5cGVkZWYgZW51bQoreworICBHU1RfRFZfUEFZX01PREVfVklERU8sCisgIEdTVF9EVl9QQVlfTU9ERV9CVU5ETEVELAorICBHU1RfRFZfUEFZX01PREVfQVVESU8KK30gR3N0RFZQYXlNb2RlOworCitzdHJ1Y3QgX0dzdFJUUERWUGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkIHBheWxvYWQ7CisKKyAgZ2Jvb2xlYW4gbmVnb3RpYXRlZDsKKyAgR3N0RFZQYXlNb2RlIG1vZGU7Cit9OworCitzdHJ1Y3QgX0dzdFJUUERWUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX2R2X3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfZHZfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RSVFBEVlBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwZzcyMmRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGc3MjJkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMjVlZWYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGc3MjJkZXBheS5jCkBAIC0wLDAgKzEsMjYyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgImdzdHJ0cGc3MjJkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cGNoYW5uZWxzLmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwZzcyMmRlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBnNzIyZGVwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2c3MjJfZGVwYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby9HNzIyLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxLCBNQVggXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIE1BWCBdIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9nNzIyX2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIiAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDAsICIKKyAgICAgICAgLyogImNoYW5uZWxzID0gKGludCkgWzEsIE1BWF0iICAqLworICAgICAgICAvKiAiY2hhbm5lbC1vcmRlciA9IChzdHJpbmcpIEFOWSIgKi8KKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkc3MjJcIjsiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9HNzIyX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgWyAxLCBNQVggXSIKKyAgICAgICAgLyogImNoYW5uZWxzID0gKGludCkgWzEsIE1BWF0iICovCisgICAgICAgIC8qICJlbXBoYXNpcyA9IChzdHJpbmcpIEFOWSIgKi8KKyAgICAgICAgLyogImNoYW5uZWwtb3JkZXIgPSAoc3RyaW5nKSBBTlkiICovCisgICAgKQorICAgICk7CisKKyNkZWZpbmUgZ3N0X3J0cF9nNzIyX2RlcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cEc3MjJEZXBheSwgZ3N0X3J0cF9nNzIyX2RlcGF5LAorICAgIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2c3MjJfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX2c3MjJfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nNzIyX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEc3MjJEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBnNzIyZGVwYXlfZGVidWcsICJydHBnNzIyZGVwYXkiLCAwLAorICAgICAgIkc3MjIgUlRQIERlcGF5bG9hZGVyIik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZzcyMl9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2c3MjJfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgYXVkaW8gZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIEc3MjIgYXVkaW8gZnJvbSBSVFAgcGFja2V0cyIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfZzcyMl9kZXBheV9zZXRjYXBzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX2c3MjJfZGVwYXlfcHJvY2VzczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZzcyMl9kZXBheV9pbml0IChHc3RSdHBHNzIyRGVwYXkgKiBydHBnNzIyZGVwYXkpCit7Cit9CisKK3N0YXRpYyBnaW50Citnc3RfcnRwX2c3MjJfZGVwYXlfcGFyc2VfaW50IChHc3RTdHJ1Y3R1cmUgKiBzdHJ1Y3R1cmUsIGNvbnN0IGdjaGFyICogZmllbGQsCisgICAgZ2ludCBkZWYpCit7CisgIGNvbnN0IGdjaGFyICpzdHI7CisgIGdpbnQgcmVzOworCisgIGlmICgoc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsIGZpZWxkKSkpCisgICAgcmV0dXJuIGF0b2kgKHN0cik7CisKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCBmaWVsZCwgJnJlcykpCisgICAgcmV0dXJuIHJlczsKKworICByZXR1cm4gZGVmOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfZzcyMl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdFJ0cEc3MjJEZXBheSAqcnRwZzcyMmRlcGF5OworICBnaW50IGNsb2NrX3JhdGUsIHBheWxvYWQsIHNhbXBsZXJhdGU7CisgIGdpbnQgY2hhbm5lbHM7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIGdib29sZWFuIHJlczsKKyNpZiAwCisgIGNvbnN0IGdjaGFyICpjaGFubmVsX29yZGVyOworICBjb25zdCBHc3RSVFBDaGFubmVsT3JkZXIgKm9yZGVyOworI2VuZGlmCisKKyAgcnRwZzcyMmRlcGF5ID0gR1NUX1JUUF9HNzIyX0RFUEFZIChkZXBheWxvYWQpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIHBheWxvYWQgPSA5NjsKKyAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJwYXlsb2FkIiwgJnBheWxvYWQpOworICBzd2l0Y2ggKHBheWxvYWQpIHsKKyAgICBjYXNlIEdTVF9SVFBfUEFZTE9BRF9HNzIyOgorICAgICAgY2hhbm5lbHMgPSAxOworICAgICAgY2xvY2tfcmF0ZSA9IDgwMDA7CisgICAgICBzYW1wbGVyYXRlID0gMTYwMDA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogbm8gZml4ZWQgbWFwcGluZywgd2UgbmVlZCBjbG9jay1yYXRlICovCisgICAgICBjaGFubmVscyA9IDA7CisgICAgICBjbG9ja19yYXRlID0gMDsKKyAgICAgIHNhbXBsZXJhdGUgPSAwOworICAgICAgYnJlYWs7CisgIH0KKworICAvKiBjYXBzIGNhbiBvdmVyd3JpdGUgZGVmYXVsdHMgKi8KKyAgY2xvY2tfcmF0ZSA9CisgICAgICBnc3RfcnRwX2c3MjJfZGVwYXlfcGFyc2VfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgY2xvY2tfcmF0ZSk7CisgIGlmIChjbG9ja19yYXRlID09IDApCisgICAgZ290byBub19jbG9ja3JhdGU7CisKKyAgaWYgKGNsb2NrX3JhdGUgPT0gODAwMCkKKyAgICBzYW1wbGVyYXRlID0gMTYwMDA7CisKKyAgaWYgKHNhbXBsZXJhdGUgPT0gMCkKKyAgICBzYW1wbGVyYXRlID0gY2xvY2tfcmF0ZTsKKworICBjaGFubmVscyA9CisgICAgICBnc3RfcnRwX2c3MjJfZGVwYXlfcGFyc2VfaW50IChzdHJ1Y3R1cmUsICJlbmNvZGluZy1wYXJhbXMiLCBjaGFubmVscyk7CisgIGlmIChjaGFubmVscyA9PSAwKSB7CisgICAgY2hhbm5lbHMgPSBnc3RfcnRwX2c3MjJfZGVwYXlfcGFyc2VfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsIGNoYW5uZWxzKTsKKyAgICBpZiAoY2hhbm5lbHMgPT0gMCkgeworICAgICAgLyogY2hhbm5lbHMgZGVmYXVsdHMgdG8gMSBvdGhlcndpc2UgKi8KKyAgICAgIGNoYW5uZWxzID0gMTsKKyAgICB9CisgIH0KKworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworICBydHBnNzIyZGVwYXktPnJhdGUgPSBzYW1wbGVyYXRlOworICBydHBnNzIyZGVwYXktPmNoYW5uZWxzID0gY2hhbm5lbHM7CisKKyAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby9HNzIyIiwKKyAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgc2FtcGxlcmF0ZSwgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgY2hhbm5lbHMsIE5VTEwpOworCisgIC8qIEZJWE1FOiBEbyBzb21ldGhpbmcgd2l0aCB0aGUgY2hhbm5lbCBvcmRlciAqLworI2lmIDAKKyAgLyogYWRkIGNoYW5uZWwgcG9zaXRpb25zICovCisgIGNoYW5uZWxfb3JkZXIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImNoYW5uZWwtb3JkZXIiKTsKKworICBvcmRlciA9IGdzdF9ydHBfY2hhbm5lbHNfZ2V0X2J5X29yZGVyIChjaGFubmVscywgY2hhbm5lbF9vcmRlcik7CisgIGlmIChvcmRlcikgeworICAgIGdzdF9hdWRpb19zZXRfY2hhbm5lbF9wb3NpdGlvbnMgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHNyY2NhcHMsIDApLAorICAgICAgICBvcmRlci0+cG9zKTsKKyAgfSBlbHNlIHsKKyAgICBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiAqcG9zOworCisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwZzcyMmRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIlVua25vd24gY2hhbm5lbCBvcmRlciAnJXMnIGZvciAlZCBjaGFubmVscyIsCisgICAgICAgICAgICBHU1RfU1RSX05VTEwgKGNoYW5uZWxfb3JkZXIpLCBjaGFubmVscykpOworICAgIC8qIGNyZWF0ZSBkZWZhdWx0IE5PTkUgbGF5b3V0ICovCisgICAgcG9zID0gZ3N0X3J0cF9jaGFubmVsc19jcmVhdGVfZGVmYXVsdCAoY2hhbm5lbHMpOworICAgIGdzdF9hdWRpb19zZXRfY2hhbm5lbF9wb3NpdGlvbnMgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHNyY2NhcHMsIDApLCBwb3MpOworICAgIGdfZnJlZSAocG9zKTsKKyAgfQorI2VuZGlmCisKKyAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoZGVwYXlsb2FkLT5zcmNwYWQsIHNyY2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK25vX2Nsb2NrcmF0ZToKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlcGF5bG9hZCwgIm5vIGNsb2NrLXJhdGUgc3BlY2lmaWVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9nNzIyX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0UnRwRzcyMkRlcGF5ICpydHBnNzIyZGVwYXk7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBnaW50IHBheWxvYWRfbGVuOworICBnYm9vbGVhbiBtYXJrZXI7CisKKyAgcnRwZzcyMmRlcGF5ID0gR1NUX1JUUF9HNzIyX0RFUEFZIChkZXBheWxvYWQpOworCisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworCisgIGlmIChwYXlsb2FkX2xlbiA8PSAwKQorICAgIGdvdG8gZW1wdHlfcGFja2V0OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGc3MjJkZXBheSwgImdvdCBwYXlsb2FkIG9mICVkIGJ5dGVzIiwgcGF5bG9hZF9sZW4pOworCisgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2J1ZmZlciAocnRwKTsKKyAgbWFya2VyID0gZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAocnRwKTsKKworICBpZiAobWFya2VyICYmIG91dGJ1ZikgeworICAgIC8qIG1hcmsgdGFsayBzcHVydCB3aXRoIFJFU1lOQyAqLworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX1JFU1lOQyk7CisgIH0KKworICBpZiAob3V0YnVmKSB7CisgICAgZ3N0X3J0cF9kcm9wX25vbl9hdWRpb19tZXRhIChydHBnNzIyZGVwYXksIG91dGJ1Zik7CisgIH0KKworICByZXR1cm4gb3V0YnVmOworCisgIC8qIEVSUk9SUyAqLworZW1wdHlfcGFja2V0OgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwZzcyMmRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJFbXB0eSBQYXlsb2FkLiIpLCAoTlVMTCkpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2c3MjJfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBnNzIyZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfRzcyMl9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGc3MjJkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjZmZmEwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuaApAQCAtMCwwICsxLDY0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMTA+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfRzcyMl9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0c3MjJfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworLyogU3RhbmRhcmQgbWFjcm9zIGZvciBkZWZpbmluZyB0eXBlcyBmb3IgdGhpcyBlbGVtZW50LiAgKi8KKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0c3MjJfREVQQVkgXAorICAoZ3N0X3J0cF9nNzIyX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfRzcyMl9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9HNzIyX0RFUEFZLEdzdFJ0cEc3MjJEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfRzcyMl9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfRzcyMl9ERVBBWSxHc3RSdHBHNzIyRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfRzcyMl9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9HNzIyX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9HNzIyX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HNzIyX0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEc3MjJEZXBheSBHc3RSdHBHNzIyRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwRzcyMkRlcGF5Q2xhc3MgR3N0UnRwRzcyMkRlcGF5Q2xhc3M7CisKKy8qIERlZmluaXRpb24gb2Ygc3RydWN0dXJlIHN0b3JpbmcgZGF0YSBmb3IgdGhpcyBlbGVtZW50LiAqLworc3RydWN0IF9Hc3RSdHBHNzIyRGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7CisKKyAgZ3VpbnQgcmF0ZTsKKyAgZ3VpbnQgY2hhbm5lbHM7Cit9OworCisvKiBTdGFuZGFyZCBkZWZpbml0aW9uIGRlZmluaW5nIGEgY2xhc3MgZm9yIHRoaXMgZWxlbWVudC4gKi8KK3N0cnVjdCBfR3N0UnRwRzcyMkRlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfZzcyMl9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfZzcyMl9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9HNzIyX0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBnNzIycGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGc3MjJwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGI3ZjU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnNzIycGF5LmMKQEAgLTAsMCArMSwyMzcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAxMD4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworI2luY2x1ZGUgImdzdHJ0cGc3MjJwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBjaGFubmVscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBnNzIycGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBnNzIycGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9nNzIyX3BheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL0c3MjIsICIgInJhdGUgPSAoaW50KSAxNjAwMCwgIiAiY2hhbm5lbHMgPSAoaW50KSAxIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9nNzIyX3BheV9zcmNfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkc3MjJcIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0c3MjJfU1RSSU5HICIsICIKKyAgICAgICAgImVuY29kaW5nLXBhcmFtcyA9IChzdHJpbmcpIDEsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA4MDAwOyAiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkc3MjJcIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImVuY29kaW5nLXBhcmFtcyA9IChzdHJpbmcpIDEsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA4MDAwIikKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9nNzIyX3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfcnRwX2c3MjJfcGF5X2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcnRwcGF5bG9hZCwKKyAgICBHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBmaWx0ZXIpOworCisjZGVmaW5lIGdzdF9ydHBfZzcyMl9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwRzcyMlBheSwgZ3N0X3J0cF9nNzIyX3BheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9BVURJT19QQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZzcyMl9wYXlfY2xhc3NfaW5pdCAoR3N0UnRwRzcyMlBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGc3MjJwYXlfZGVidWcsICJydHBnNzIycGF5IiwgMCwKKyAgICAgICJHNzIyIFJUUCBQYXlsb2FkZXIiKTsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2c3MjJfcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZzcyMl9wYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgYXVkaW8gcGF5bG9hZGVyIiwgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZC1lbmNvZGUgUmF3IGF1ZGlvIGludG8gUlRQIHBhY2tldHMgKFJGQyAzNTUxKSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2c3MjJfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5nZXRfY2FwcyA9IGdzdF9ydHBfZzcyMl9wYXlfZ2V0Y2FwczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZzcyMl9wYXlfaW5pdCAoR3N0UnRwRzcyMlBheSAqIHJ0cGc3MjJwYXkpCit7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgKnJ0cGJhc2VhdWRpb3BheWxvYWQ7CisKKyAgcnRwYmFzZWF1ZGlvcGF5bG9hZCA9IEdTVF9SVFBfQkFTRV9BVURJT19QQVlMT0FEIChydHBnNzIycGF5KTsKKworICBHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwZzcyMnBheSktPnB0ID0gR1NUX1JUUF9QQVlMT0FEX0c3MjI7CisKKyAgLyogdGVsbCBydHBiYXNlYXVkaW9wYXlsb2FkIHRoYXQgdGhpcyBpcyBhIHNhbXBsZSBiYXNlZCBjb2RlYyAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfc2FtcGxlX2Jhc2VkIChydHBiYXNlYXVkaW9wYXlsb2FkKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2c3MjJfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RSdHBHNzIyUGF5ICpydHBnNzIycGF5OworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2ludCByYXRlLCBjaGFubmVscywgY2xvY2tfcmF0ZTsKKyAgZ2Jvb2xlYW4gcmVzOworICBnY2hhciAqcGFyYW1zOworI2lmIDAKKyAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gKnBvczsKKyAgY29uc3QgR3N0UlRQQ2hhbm5lbE9yZGVyICpvcmRlcjsKKyNlbmRpZgorICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkICpydHBiYXNlYXVkaW9wYXlsb2FkOworCisgIHJ0cGJhc2VhdWRpb3BheWxvYWQgPSBHU1RfUlRQX0JBU0VfQVVESU9fUEFZTE9BRCAoYmFzZXBheWxvYWQpOworICBydHBnNzIycGF5ID0gR1NUX1JUUF9HNzIyX1BBWSAoYmFzZXBheWxvYWQpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIC8qIGZpcnN0IHBhcnNlIGlucHV0IGNhcHMgKi8KKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgInJhdGUiLCAmcmF0ZSkpCisgICAgZ290byBub19yYXRlOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsICZjaGFubmVscykpCisgICAgZ290byBub19jaGFubmVsczsKKworICAvKiBGSVhNRTogRG8gc29tZXRoaW5nIHdpdGggdGhlIGNoYW5uZWwgcG9zaXRpb25zICovCisjaWYgMAorICAvKiBnZXQgdGhlIGNoYW5uZWwgb3JkZXIgKi8KKyAgcG9zID0gZ3N0X2F1ZGlvX2dldF9jaGFubmVsX3Bvc2l0aW9ucyAoc3RydWN0dXJlKTsKKyAgaWYgKHBvcykKKyAgICBvcmRlciA9IGdzdF9ydHBfY2hhbm5lbHNfZ2V0X2J5X3BvcyAoY2hhbm5lbHMsIHBvcyk7CisgIGVsc2UKKyAgICBvcmRlciA9IE5VTEw7CisjZW5kaWYKKworICAvKiBDbG9jayByYXRlIGlzIGFsd2F5cyA4MDAwIEh6IGZvciBHNzIyIGFjY29yZGluZyB0bworICAgKiBSRkMgMzU1MSBhbHRob3VnaCB0aGUgc2FtcGxpbmcgcmF0ZSBpcyAxNjAwMCBIeiAqLworICBjbG9ja19yYXRlID0gODAwMDsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAoYmFzZXBheWxvYWQsICJhdWRpbyIsCisgICAgICBiYXNlcGF5bG9hZC0+cHQgIT0gR1NUX1JUUF9QQVlMT0FEX0c3MjIsICJHNzIyIiwgY2xvY2tfcmF0ZSk7CisgIHBhcmFtcyA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgY2hhbm5lbHMpOworCisjaWYgMAorICBpZiAoIW9yZGVyICYmIGNoYW5uZWxzID4gMikgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cGc3MjJwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiVW5rbm93biBjaGFubmVsIG9yZGVyIGZvciAlZCBjaGFubmVscyIsIGNoYW5uZWxzKSk7CisgIH0KKworICBpZiAob3JkZXIgJiYgb3JkZXItPm5hbWUpIHsKKyAgICByZXMgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAoYmFzZXBheWxvYWQsCisgICAgICAgICJlbmNvZGluZy1wYXJhbXMiLCBHX1RZUEVfU1RSSU5HLCBwYXJhbXMsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsCisgICAgICAgIGNoYW5uZWxzLCAiY2hhbm5lbC1vcmRlciIsIEdfVFlQRV9TVFJJTkcsIG9yZGVyLT5uYW1lLCBOVUxMKTsKKyAgfSBlbHNlIHsKKyNlbmRpZgorICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChiYXNlcGF5bG9hZCwKKyAgICAgICAgImVuY29kaW5nLXBhcmFtcyIsIEdfVFlQRV9TVFJJTkcsIHBhcmFtcywgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwKKyAgICAgICAgY2hhbm5lbHMsIE5VTEwpOworI2lmIDAKKyAgfQorI2VuZGlmCisKKyAgZ19mcmVlIChwYXJhbXMpOworI2lmIDAKKyAgZ19mcmVlIChwb3MpOworI2VuZGlmCisKKyAgcnRwZzcyMnBheS0+cmF0ZSA9IHJhdGU7CisgIHJ0cGc3MjJwYXktPmNoYW5uZWxzID0gY2hhbm5lbHM7CisKKyAgLyogYml0cy1wZXItc2FtcGxlIGlzIDQgKiBjaGFubmVscyBmb3IgRzcyMiwgYnV0IGFzIHRoZSBSVFAgY2xvY2sgcnVucyBhdAorICAgKiBoYWxmIHNwZWVkICg4IGluc3RlYWQgb2YgMTYga2h6KSwgcHJldGVuZCBpdCdzIDggYml0cyBwZXIgc2FtcGxlCisgICAqIGNoYW5uZWxzLiAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfc2FtcGxlYml0c19vcHRpb25zIChydHBiYXNlYXVkaW9wYXlsb2FkLAorICAgICAgOCAqIHJ0cGc3MjJwYXktPmNoYW5uZWxzKTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworbm9fcmF0ZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGc3MjJwYXksICJubyByYXRlIGdpdmVuIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19jaGFubmVsczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGc3MjJwYXksICJubyBjaGFubmVscyBnaXZlbiIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfcnRwX2c3MjJfcGF5X2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcnRwcGF5bG9hZCwgR3N0UGFkICogcGFkLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKm90aGVycGFkY2FwczsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBvdGhlcnBhZGNhcHMgPSBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgKHJ0cHBheWxvYWQtPnNyY3BhZCk7CisgIGNhcHMgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAocGFkKTsKKworICBpZiAob3RoZXJwYWRjYXBzKSB7CisgICAgaWYgKCFnc3RfY2Fwc19pc19lbXB0eSAob3RoZXJwYWRjYXBzKSkgeworICAgICAgY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGNhcHMpOworICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMSwgTlVMTCk7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAicmF0ZSIsIEdfVFlQRV9JTlQsIDE2MDAwLCBOVUxMKTsKKyAgICB9CisgICAgZ3N0X2NhcHNfdW5yZWYgKG90aGVycGFkY2Fwcyk7CisgIH0KKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqdG1wOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwcGF5bG9hZCwgIkludGVyc2VjdCAlIiBHU1RfUFRSX0ZPUk1BVCAiIGFuZCBmaWx0ZXIgJSIKKyAgICAgICAgR1NUX1BUUl9GT1JNQVQsIGNhcHMsIGZpbHRlcik7CisgICAgdG1wID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgY2FwcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgY2FwcyA9IHRtcDsKKyAgfQorCisgIHJldHVybiBjYXBzOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9nNzIyX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGc3MjJwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfRzcyMl9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBnNzIycGF5LmggYi9nc3QvcnRwL2dzdHJ0cGc3MjJwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjM4Mjg2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnNzIycGF5LmgKQEAgLTAsMCArMSw2MSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDEwPiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0c3MjJfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfRzcyMl9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlYXVkaW9wYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfRzcyMl9QQVkgXAorICAoZ3N0X3J0cF9nNzIyX3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0c3MjJfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjJfUEFZLEdzdFJ0cEc3MjJQYXkpKQorI2RlZmluZSBHU1RfUlRQX0c3MjJfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HNzIyX1BBWSxHc3RSdHBHNzIyUGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0c3MjJfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjJfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9HNzIyX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfRzcyMl9QQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwRzcyMlBheSBHc3RSdHBHNzIyUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEc3MjJQYXlDbGFzcyBHc3RSdHBHNzIyUGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwRzcyMlBheQoreworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkIHBheWxvYWQ7CisKKyAgZ2ludCByYXRlOworICBnaW50IGNoYW5uZWxzOworfTsKKworc3RydWN0IF9Hc3RSdHBHNzIyUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfZzcyMl9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2c3MjJfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0c3MjJfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwZzcyM2RlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxZDlhZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwZzcyM2RlcGF5LmMKQEAgLTAsMCArMSwyMjMgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgPDIwMTA+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0cnRwZzcyM2RlcGF5LmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cGc3MjNkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwZzcyM2RlcGF5X2RlYnVnKQorCisKKy8qIHJlZmVyZW5jZXM6CisgKgorICogUkZDIDM1NTEgKDQuNS4zKQorICovCisKK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAKK307CisKKy8qIGlucHV0IGlzIGFuIFJUUCBwYWNrZXQKKyAqCisgKi8KK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2c3MjNfZGVwYXlfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMCwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiRzcyM1wiOyAiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9HNzIzX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfZzcyM19kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL0c3MjMsICIgImNoYW5uZWxzID0gKGludCkgMSwiICJyYXRlID0gKGludCkgODAwMCIpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfZzcyM19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfZzcyM19kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CisKKyNkZWZpbmUgZ3N0X3J0cF9nNzIzX2RlcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cEc3MjNEZXBheSwgZ3N0X3J0cF9nNzIzX2RlcGF5LAorICAgIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2c3MjNfZGVwYXlfY2xhc3NfaW5pdCAoR3N0UnRwRzcyM0RlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGc3MjNkZXBheV9kZWJ1ZywgInJ0cGc3MjNkZXBheSIsIDAsCisgICAgICAiRy43MjMgUlRQIERlcGF5bG9hZGVyIik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZzcyM19kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2c3MjNfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgRy43MjMgZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIEcuNzIzIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgKFJGQyAzNTUxKSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX2c3MjNfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2c3MjNfZGVwYXlfc2V0Y2FwczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZzcyM19kZXBheV9pbml0IChHc3RSdHBHNzIzRGVwYXkgKiBydHBnNzIzZGVwYXkpCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgKmRlcGF5bG9hZDsKKworICBkZXBheWxvYWQgPSBHU1RfUlRQX0JBU0VfREVQQVlMT0FEIChydHBnNzIzZGVwYXkpOworCisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2c3MjNfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBHc3RDYXBzICpzcmNjYXBzOworICBHc3RSdHBHNzIzRGVwYXkgKnJ0cGc3MjNkZXBheTsKKyAgY29uc3QgZ2NoYXIgKnBhcmFtczsKKyAgZ2ludCBjbG9ja19yYXRlLCBjaGFubmVsczsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIHJ0cGc3MjNkZXBheSA9IEdTVF9SVFBfRzcyM19ERVBBWSAoZGVwYXlsb2FkKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoIShwYXJhbXMgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImVuY29kaW5nLXBhcmFtcyIpKSkKKyAgICBjaGFubmVscyA9IDE7CisgIGVsc2UgeworICAgIGNoYW5uZWxzID0gYXRvaSAocGFyYW1zKTsKKyAgfQorCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSA4MDAwOworCisgIGlmIChjaGFubmVscyAhPSAxKQorICAgIGdvdG8gd3JvbmdfY2hhbm5lbHM7CisKKyAgaWYgKGNsb2NrX3JhdGUgIT0gODAwMCkKKyAgICBnb3RvIHdyb25nX2Nsb2NrX3JhdGU7CisKKyAgZGVwYXlsb2FkLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL0c3MjMiLAorICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgY2hhbm5lbHMsICJyYXRlIiwgR19UWVBFX0lOVCwgY2xvY2tfcmF0ZSwgTlVMTCk7CisgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCit3cm9uZ19jaGFubmVsczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGc3MjNkZXBheSwgImV4cGVjdGVkIDEgY2hhbm5lbCwgZ290ICVkIiwgY2hhbm5lbHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQord3JvbmdfY2xvY2tfcmF0ZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGc3MjNkZXBheSwgImV4cGVjdGVkIDgwMDAgY2xvY2stcmF0ZSwgZ290ICVkIiwKKyAgICAgICAgY2xvY2tfcmF0ZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX2c3MjNfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RSdHBHNzIzRGVwYXkgKnJ0cGc3MjNkZXBheTsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBnaW50IHBheWxvYWRfbGVuOworICBnYm9vbGVhbiBtYXJrZXI7CisKKyAgcnRwZzcyM2RlcGF5ID0gR1NUX1JUUF9HNzIzX0RFUEFZIChkZXBheWxvYWQpOworCisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworCisgIC8qIEF0IGxlYXN0IDQgYnl0ZXMgKi8KKyAgaWYgKHBheWxvYWRfbGVuIDwgNCkKKyAgICBnb3RvIHRvb19zbWFsbDsKKworICBHU1RfTE9HX09CSkVDVCAocnRwZzcyM2RlcGF5LCAicGF5bG9hZCBsZW4gJWQiLCBwYXlsb2FkX2xlbik7CisKKyAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfYnVmZmVyIChydHApOworICBtYXJrZXIgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApOworCisgIGlmIChtYXJrZXIpIHsKKyAgICAvKiBtYXJrZXIgYml0IHN0YXJ0cyB0YWxrc3B1cnQgKi8KKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19SRVNZTkMpOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRlcGF5bG9hZCwgInB1c2hpbmcgYnVmZmVyIG9mIHNpemUgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWYpKTsKKworICByZXR1cm4gb3V0YnVmOworCisgIC8qIEVSUk9SUyAqLwordG9vX3NtYWxsOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwZzcyM2RlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIkc3MjMgUlRQIHBheWxvYWQgdG9vIHNtYWxsICglZCkiLCBwYXlsb2FkX2xlbikpOworICAgIGdvdG8gYmFkX3BhY2tldDsKKyAgfQorYmFkX3BhY2tldDoKKyAgeworICAgIC8qIG5vIGZhdGFsIGVycm9yICovCisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfZzcyM19kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGc3MjNkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9HNzIzX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwZzcyM2RlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cGc3MjNkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOTQyYjMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGc3MjNkZXBheS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgPDIwMTA+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfRzcyM19ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0c3MjNfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfRzcyM19ERVBBWSBcCisgIChnc3RfcnRwX2c3MjNfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9HNzIzX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjNfREVQQVksR3N0UnRwRzcyM0RlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9HNzIzX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HNzIzX0RFUEFZLEdzdFJ0cEc3MjNEZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9HNzIzX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjNfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0c3MjNfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0c3MjNfREVQQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwRzcyM0RlcGF5IEdzdFJ0cEc3MjNEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBHNzIzRGVwYXlDbGFzcyBHc3RSdHBHNzIzRGVwYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBHNzIzRGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cEc3MjNEZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX2c3MjNfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2c3MjNfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfRzcyM19ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwZzcyM3BheS5jIGIvZ3N0L3J0cC9nc3RydHBnNzIzcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I2ZGZmNQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwZzcyM3BheS5jCkBAIC0wLDAgKzEsMzA3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBDb2xsYWJvcmEgTHRkCisgKiAgQGF1dGhvcjogT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJnc3RydHBnNzIzcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworI2RlZmluZSBHNzIzX0ZSQU1FX0RVUkFUSU9OICgzMCAqIEdTVF9NU0VDT05EKQorCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9nNzIzX3BheV9zZXRfY2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfZzcyM19wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKgorICAgIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2c3MjNfcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8vRzcyMywgIiAgICAgLyogYWNjb3JkaW5nIHRvIFJGQyAzNTUxICovCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgInJhdGUgPSAoaW50KSA4MDAwIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9nNzIzX3BheV9zcmNfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9HNzIzX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMCwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiRzcyM1wiOyAiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiRzcyM1wiIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2c3MjNfcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfZzcyM19wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworI2RlZmluZSBnc3RfcnRwX2c3MjNfcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJUUEc3MjNQYXksIGdzdF9ydHBfZzcyM19wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nNzIzX3BheV9jbGFzc19pbml0IChHc3RSVFBHNzIzUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKnBheWxvYWRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX2c3MjNfcGF5X2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfZzcyM19wYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZzcyM19wYXlfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZzcyM19wYXlfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBHLjcyMyBwYXlsb2FkZXIiLCAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYWNrZXRpemUgRy43MjMgYXVkaW8gaW50byBSVFAgcGFja2V0cyIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfZzcyM19wYXlfc2V0X2NhcHM7CisgIHBheWxvYWRfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX2c3MjNfcGF5X2hhbmRsZV9idWZmZXI7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2c3MjNfcGF5X2luaXQgKEdzdFJUUEc3MjNQYXkgKiBwYXkpCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkICpwYXlsb2FkID0gR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHBheSk7CisKKyAgcGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworCisgIHBheWxvYWQtPnB0ID0gR1NUX1JUUF9QQVlMT0FEX0c3MjM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2c3MjNfcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSVFBHNzIzUGF5ICpwYXk7CisKKyAgcGF5ID0gR1NUX1JUUF9HNzIzX1BBWSAob2JqZWN0KTsKKworICBnX29iamVjdF91bnJlZiAocGF5LT5hZGFwdGVyKTsKKyAgcGF5LT5hZGFwdGVyID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2c3MjNfcGF5X3NldF9jYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBnYm9vbGVhbiByZXM7CisKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHBheWxvYWQsICJhdWRpbyIsCisgICAgICBwYXlsb2FkLT5wdCAhPSBHU1RfUlRQX1BBWUxPQURfRzcyMywgIkc3MjMiLCA4MDAwKTsKKyAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHBheWxvYWQsIE5VTEwpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2c3MjNfcGF5X2ZsdXNoIChHc3RSVFBHNzIzUGF5ICogcGF5KQoreworICBHc3RCdWZmZXIgKm91dGJ1ZiwgKnBheWxvYWRfYnVmOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ3VpbnQgYXZhaWw7CisgIEdzdFJUUEJ1ZmZlciBydHAgPSB7IE5VTEwgfTsKKworICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocGF5LT5hZGFwdGVyKTsKKworICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKDAsIDAsIDApOworCisgIGdzdF9ydHBfYnVmZmVyX21hcCAob3V0YnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKworICBHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSA9IHBheS0+dGltZXN0YW1wOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gcGF5LT5kdXJhdGlvbjsKKworICAvKiBjb3B5IEc3MjMgZGF0YSBhcyBwYXlsb2FkICovCisgIHBheWxvYWRfYnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXJfZmFzdCAocGF5LT5hZGFwdGVyLCBhdmFpbCk7CisKKyAgcGF5LT50aW1lc3RhbXAgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBwYXktPmR1cmF0aW9uID0gMDsKKworICAvKiBzZXQgZGlzY29udCBhbmQgbWFya2VyICovCisgIGlmIChwYXktPmRpc2NvbnQpIHsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBUUlVFKTsKKyAgICBwYXktPmRpc2NvbnQgPSBGQUxTRTsKKyAgfQorICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisgIGdzdF9ydHBfY29weV9hdWRpb19tZXRhIChwYXksIG91dGJ1ZiwgcGF5bG9hZF9idWYpOworCisgIG91dGJ1ZiA9IGdzdF9idWZmZXJfYXBwZW5kIChvdXRidWYsIHBheWxvYWRfYnVmKTsKKworICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoIChHU1RfUlRQX0JBU0VfUEFZTE9BRCAocGF5KSwgb3V0YnVmKTsKKworICByZXR1cm4gcmV0OworfQorCisvKiAwMCAgICBoaWdoLXJhdGUgc3BlZWNoICg2LjMga2IvcykgICAgICAgICAgICAyNAorICogMDEgICAgbG93LXJhdGUgc3BlZWNoICAoNS4zIGtiL3MpICAgICAgICAgICAgMjAKKyAqIDEwICAgIFNJRCBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisgKiAxMSAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgKi8KK3N0YXRpYyBjb25zdCBndWludCBzaXplX3RhYls0XSA9IHsKKyAgMjQsIDIwLCA0LCAwCit9OworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9nNzIzX3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCBIRFI7CisgIEdzdFJUUEc3MjNQYXkgKnBheTsKKyAgR3N0Q2xvY2tUaW1lIHBhY2tldF9kdXIsIHRpbWVzdGFtcDsKKyAgZ3VpbnQgcGF5bG9hZF9sZW4sIHBhY2tldF9sZW47CisKKyAgcGF5ID0gR1NUX1JUUF9HNzIzX1BBWSAocGF5bG9hZCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgdGltZXN0YW1wID0gR1NUX0JVRkZFUl9QVFMgKGJ1Zik7CisKKyAgaWYgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAoYnVmKSkgeworICAgIC8qIGZsdXNoIGV2ZXJ5dGhpbmcgb24gZGlzY29udCAqLworICAgIGdzdF9hZGFwdGVyX2NsZWFyIChwYXktPmFkYXB0ZXIpOworICAgIHBheS0+dGltZXN0YW1wID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICBwYXktPmR1cmF0aW9uID0gMDsKKyAgICBwYXktPmRpc2NvbnQgPSBUUlVFOworICB9CisKKyAgLyogc2hvdWxkIGJlIG9uZSBvZiB0aGVzZSBzaXplcyAqLworICBpZiAobWFwLnNpemUgIT0gNCAmJiBtYXAuc2l6ZSAhPSAyMCAmJiBtYXAuc2l6ZSAhPSAyNCkKKyAgICBnb3RvIGludmFsaWRfc2l6ZTsKKworICAvKiBjaGVjayBzaXplIGJ5IGxvb2tpbmcgYXQgdGhlIGhlYWRlciBiaXRzICovCisgIEhEUiA9IG1hcC5kYXRhWzBdICYgMHgzOworICBpZiAoc2l6ZV90YWJbSERSXSAhPSBtYXAuc2l6ZSkKKyAgICBnb3RvIHdyb25nX3NpemU7CisKKyAgLyogY2FsY3VsYXRlIHBhY2tldCBzaXplIGFuZCBkdXJhdGlvbiAqLworICBwYXlsb2FkX2xlbiA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocGF5LT5hZGFwdGVyKSArIG1hcC5zaXplOworICBwYWNrZXRfZHVyID0gcGF5LT5kdXJhdGlvbiArIEc3MjNfRlJBTUVfRFVSQVRJT047CisgIHBhY2tldF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BhY2tldF9sZW4gKHBheWxvYWRfbGVuLCAwLCAwKTsKKworICBpZiAoZ3N0X3J0cF9iYXNlX3BheWxvYWRfaXNfZmlsbGVkIChwYXlsb2FkLCBwYWNrZXRfbGVuLCBwYWNrZXRfZHVyKSkgeworICAgIC8qIHNpemUgb3IgZHVyYXRpb24gd291bGQgb3ZlcmZsb3cgdGhlIHBhY2tldCwgZmx1c2ggdGhlIHF1ZXVlZCBkYXRhICovCisgICAgcmV0ID0gZ3N0X3J0cF9nNzIzX3BheV9mbHVzaCAocGF5KTsKKyAgfQorCisgIC8qIHVwZGF0ZSB0aW1lc3RhbXAsIHdlIGtlZXAgdGhlIHRpbWVzdGFtcCBmb3IgdGhlIGZpcnN0IHBhY2tldCBpbiB0aGUgYWRhcHRlcgorICAgKiBidXQgYXJlIGFibGUgdG8gY2FsY3VsYXRlIGl0IGZyb20gbmV4dCBwYWNrZXRzLiAqLworICBpZiAodGltZXN0YW1wICE9IEdTVF9DTE9DS19USU1FX05PTkUgJiYgcGF5LT50aW1lc3RhbXAgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgIGlmICh0aW1lc3RhbXAgPiBwYXktPmR1cmF0aW9uKQorICAgICAgcGF5LT50aW1lc3RhbXAgPSB0aW1lc3RhbXAgLSBwYXktPmR1cmF0aW9uOworICAgIGVsc2UKKyAgICAgIHBheS0+dGltZXN0YW1wID0gMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIC8qIGFkZCBwYWNrZXQgdG8gdGhlIHF1ZXVlICovCisgIGdzdF9hZGFwdGVyX3B1c2ggKHBheS0+YWRhcHRlciwgYnVmKTsKKyAgcGF5LT5kdXJhdGlvbiA9IHBhY2tldF9kdXI7CisKKyAgLyogY2hlY2sgaWYgd2UgY2FuIGZsdXNoIG5vdyAqLworICBpZiAocGF5LT5kdXJhdGlvbiA+PSBwYXlsb2FkLT5taW5fcHRpbWUpIHsKKyAgICByZXQgPSBnc3RfcnRwX2c3MjNfcGF5X2ZsdXNoIChwYXkpOworICB9CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBXQVJOSU5HUyAqLworaW52YWxpZF9zaXplOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocGF5LCBTVFJFQU0sIFdST05HX1RZUEUsCisgICAgICAgICgiSW52YWxpZCBpbnB1dCBidWZmZXIgc2l6ZSIpLAorICAgICAgICAoIklucHV0IHNpemUgc2hvdWxkIGJlIDQsIDIwIG9yIDI0LCBnb3QgJSIgR19HU0laRV9GT1JNQVQsIG1hcC5zaXplKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQord3Jvbmdfc2l6ZToKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHBheSwgU1RSRUFNLCBXUk9OR19UWVBFLAorICAgICAgICAoIldyb25nIGlucHV0IGJ1ZmZlciBzaXplIiksCisgICAgICAgICgiRXhwZWN0ZWQgaW5wdXQgYnVmZmVyIHNpemUgJXUgYnV0IGdvdCAlIiBHX0dTSVpFX0ZPUk1BVCwKKyAgICAgICAgICAgIHNpemVfdGFiW0hEUl0sIG1hcC5zaXplKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfZzcyM19wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RSVFBHNzIzUGF5ICpwYXk7CisKKyAgcGF5ID0gR1NUX1JUUF9HNzIzX1BBWSAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChwYXktPmFkYXB0ZXIpOworICAgICAgcGF5LT50aW1lc3RhbXAgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgICAgcGF5LT5kdXJhdGlvbiA9IDA7CisgICAgICBwYXktPmRpc2NvbnQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChwYXktPmFkYXB0ZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLypQbHVnaW4gaW5pdCBmdW5jdGlvbnMqLworZ2Jvb2xlYW4KK2dzdF9ydHBfZzcyM19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBnNzIzcGF5IiwgR1NUX1JBTktfU0VDT05EQVJZLAorICAgICAgZ3N0X3J0cF9nNzIzX3BheV9nZXRfdHlwZSAoKSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGc3MjNwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwZzcyM3BheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ODA3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGc3MjNwYXkuaApAQCAtMCwwICsxLDY0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBDb2xsYWJvcmEgTHRkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfRzcyM19QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9HNzIzX1BBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VhdWRpb3BheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9HNzIzX1BBWSBcCisgIChnc3RfcnRwX2c3MjNfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfRzcyM19QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfRzcyM19QQVksR3N0UlRQRzcyM1BheSkpCisjZGVmaW5lIEdTVF9SVFBfRzcyM19QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0c3MjNfUEFZLEdzdFJUUEc3MjNQYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfRzcyM19QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfRzcyM19QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0c3MjNfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HNzIzX1BBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBHNzIzUGF5IEdzdFJUUEc3MjNQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQRzcyM1BheUNsYXNzIEdzdFJUUEc3MjNQYXlDbGFzczsKKworc3RydWN0IF9Hc3RSVFBHNzIzUGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkIHBheWxvYWQ7CisKKyAgR3N0QWRhcHRlciAgKmFkYXB0ZXI7CisgIEdzdENsb2NrVGltZSBkdXJhdGlvbjsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKyAgZ2Jvb2xlYW4gZGlzY29udDsKK307CisKK3N0cnVjdCBfR3N0UlRQRzcyM1BheUNsYXNzCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9nNzIzX3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfZzcyM19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfRzcyM19QQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWYxOTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYwpAQCAtMCwwICsxLDM5MyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA1IFplZXNoYW4gQWxpIDx6ZWVuaXhAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA4IEF4aXMgQ29tbXVuaWNhdGlvbnMgPGRldi1nc3RyZWFtZXJAYXhpcy5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJnc3RydHBnNzI2ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBnNzI2ZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cGc3MjZkZXBheV9kZWJ1ZykKKworI2RlZmluZSBERUZBVUxUX0JJVF9SQVRFIDMyMDAwCisjZGVmaW5lIERFRkFVTFRfQkxPQ0tfQUxJR04gNAorI2RlZmluZSBTQU1QTEVfUkFURSA4MDAwCisjZGVmaW5lIExBWU9VVF9HNzI2ICJnNzI2IgorCisvKiBSdHBHNzI2RGVwYXkgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCisjZGVmaW5lIERFRkFVTFRfRk9SQ0VfQUFMMglUUlVFCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0ZPUkNFX0FBTDIKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2c3MjZfZGVwYXlfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgeyBcIkc3MjZcIiwgXCJHNzI2LTE2XCIsIFwiRzcyNi0yNFwiLCBcIkc3MjYtMzJcIiwgXCJHNzI2LTQwXCIsICIKKyAgICAgICAgIlwiQUFMMi1HNzI2LTE2XCIsIFwiQUFMMi1HNzI2LTI0XCIsIFwiQUFMMi1HNzI2LTMyXCIsIFwiQUFMMi1HNzI2LTQwXCIgfSwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDA7IikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9nNzI2X2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1hZHBjbSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiCisgICAgICAgICJyYXRlID0gKGludCkgODAwMCwgIgorICAgICAgICAiYml0cmF0ZSA9IChpbnQpIHsgMTYwMDAsIDI0MDAwLCAzMjAwMCwgNDAwMDAgfSwgIgorICAgICAgICAiYmxvY2tfYWxpZ24gPSAoaW50KSB7IDIsIDMsIDQsIDUgfSwgIiAibGF5b3V0ID0gKHN0cmluZykgXCJnNzI2XCIiKQorICAgICk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfZzcyNl9kZXBheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX2c3MjZfZGVwYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX2c3MjZfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfZzcyNl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworI2RlZmluZSBnc3RfcnRwX2c3MjZfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwRzcyNkRlcGF5LCBnc3RfcnRwX2c3MjZfZGVwYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfREVQQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZzcyNl9kZXBheV9jbGFzc19pbml0IChHc3RSdHBHNzI2RGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBnNzI2ZGVwYXlfZGVidWcsICJydHBnNzI2ZGVwYXkiLCAwLAorICAgICAgIkcuNzI2IFJUUCBEZXBheWxvYWRlciIpOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9nNzI2X2RlcGF5X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9nNzI2X2RlcGF5X2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0ZPUkNFX0FBTDIsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImZvcmNlLWFhbDIiLCAiRm9yY2UgQUFMMiIsCisgICAgICAgICAgIkZvcmNlIEFBTDIgZGVjb2RpbmcgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBiYWQgcGF5bG9hZGVycyIsCisgICAgICAgICAgREVGQVVMVF9GT1JDRV9BQUwyLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2c3MjZfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9nNzI2X2RlcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIEcuNzI2IGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBHLjcyNiBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIiwKKyAgICAgICJBeGlzIENvbW11bmljYXRpb25zIDxkZXYtZ3N0cmVhbWVyQGF4aXMuY29tPiIpOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfZzcyNl9kZXBheV9wcm9jZXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfZzcyNl9kZXBheV9zZXRjYXBzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nNzI2X2RlcGF5X2luaXQgKEdzdFJ0cEc3MjZEZXBheSAqIHJ0cEc3MjZkZXBheSkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCAqZGVwYXlsb2FkOworCisgIGRlcGF5bG9hZCA9IEdTVF9SVFBfQkFTRV9ERVBBWUxPQUQgKHJ0cEc3MjZkZXBheSk7CisKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKGRlcGF5bG9hZCkpOworCisgIHJ0cEc3MjZkZXBheS0+Zm9yY2VfYWFsMiA9IERFRkFVTFRfRk9SQ0VfQUFMMjsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2c3MjZfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBnYm9vbGVhbiByZXQ7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKyAgY29uc3QgZ2NoYXIgKmVuY29kaW5nX25hbWU7CisgIEdzdFJ0cEc3MjZEZXBheSAqZGVwYXk7CisKKyAgZGVwYXkgPSBHU1RfUlRQX0c3MjZfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgY2xvY2tfcmF0ZSA9IDgwMDA7ICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgZGVwYXlsb2FkLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICBkZXBheS0+YWFsMiA9IEZBTFNFOworICBlbmNvZGluZ19uYW1lID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJlbmNvZGluZy1uYW1lIik7CisgIGlmIChlbmNvZGluZ19uYW1lID09IE5VTEwgfHwgZ19hc2NpaV9zdHJjYXNlY21wIChlbmNvZGluZ19uYW1lLCAiRzcyNiIpID09IDApIHsKKyAgICBkZXBheS0+Yml0cmF0ZSA9IERFRkFVTFRfQklUX1JBVEU7CisgICAgZGVwYXktPmJsb2NrX2FsaWduID0gREVGQVVMVF9CTE9DS19BTElHTjsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZ19zdHJfaGFzX3ByZWZpeCAoZW5jb2RpbmdfbmFtZSwgIkFBTDItIikpIHsKKyAgICAgIGRlcGF5LT5hYWwyID0gVFJVRTsKKyAgICAgIGVuY29kaW5nX25hbWUgKz0gNTsKKyAgICB9CisgICAgaWYgKGdfYXNjaWlfc3RyY2FzZWNtcCAoZW5jb2RpbmdfbmFtZSwgIkc3MjYtMTYiKSA9PSAwKSB7CisgICAgICBkZXBheS0+Yml0cmF0ZSA9IDE2MDAwOworICAgICAgZGVwYXktPmJsb2NrX2FsaWduID0gMjsKKyAgICB9IGVsc2UgaWYgKGdfYXNjaWlfc3RyY2FzZWNtcCAoZW5jb2RpbmdfbmFtZSwgIkc3MjYtMjQiKSA9PSAwKSB7CisgICAgICBkZXBheS0+Yml0cmF0ZSA9IDI0MDAwOworICAgICAgZGVwYXktPmJsb2NrX2FsaWduID0gMzsKKyAgICB9IGVsc2UgaWYgKGdfYXNjaWlfc3RyY2FzZWNtcCAoZW5jb2RpbmdfbmFtZSwgIkc3MjYtMzIiKSA9PSAwKSB7CisgICAgICBkZXBheS0+Yml0cmF0ZSA9IDMyMDAwOworICAgICAgZGVwYXktPmJsb2NrX2FsaWduID0gNDsKKyAgICB9IGVsc2UgaWYgKGdfYXNjaWlfc3RyY2FzZWNtcCAoZW5jb2RpbmdfbmFtZSwgIkc3MjYtNDAiKSA9PSAwKSB7CisgICAgICBkZXBheS0+Yml0cmF0ZSA9IDQwMDAwOworICAgICAgZGVwYXktPmJsb2NrX2FsaWduID0gNTsKKyAgICB9IGVsc2UKKyAgICAgIGdvdG8gdW5rbm93bl9lbmNvZGluZzsKKyAgfQorCisgIEdTVF9ERUJVRyAoIlJUUCBHLjcyNiBkZXBheWxvYWRlciwgYml0cmF0ZSBzZXQgdG8gJWRcbiIsIGRlcGF5LT5iaXRyYXRlKTsKKworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtYWRwY20iLAorICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMSwKKyAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgY2xvY2tfcmF0ZSwKKyAgICAgICJiaXRyYXRlIiwgR19UWVBFX0lOVCwgZGVwYXktPmJpdHJhdGUsCisgICAgICAiYmxvY2tfYWxpZ24iLCBHX1RZUEVfSU5ULCBkZXBheS0+YmxvY2tfYWxpZ24sCisgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgTEFZT1VUX0c3MjYsIE5VTEwpOworCisgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCit1bmtub3duX2VuY29kaW5nOgorICB7CisgICAgR1NUX1dBUk5JTkcgKCJDb3VsZCBub3QgZGV0ZXJtaW5lIGJpdHJhdGUgZnJvbSBlbmNvZGluZy1uYW1lICglcykiLAorICAgICAgICBlbmNvZGluZ19uYW1lKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfZzcyNl9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cEc3MjZEZXBheSAqZGVwYXk7CisgIEdzdEJ1ZmZlciAqb3V0YnVmID0gTlVMTDsKKyAgZ2Jvb2xlYW4gbWFya2VyOworCisgIGRlcGF5ID0gR1NUX1JUUF9HNzI2X0RFUEFZIChkZXBheWxvYWQpOworCisgIG1hcmtlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCk7CisKKyAgR1NUX0RFQlVHICgicHJvY2VzcyA6IGdvdCAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzLCBtYXJrICVkIHRzICV1IHNlcW4gJWQiLAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAocnRwLT5idWZmZXIpLCBtYXJrZXIsCisgICAgICBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wIChydHApLCBnc3RfcnRwX2J1ZmZlcl9nZXRfc2VxIChydHApKTsKKworICBpZiAoZGVwYXktPmFhbDIgfHwgZGVwYXktPmZvcmNlX2FhbDIpIHsKKyAgICAvKiBBQUwyLCB3ZSBjYW4ganVzdCBjb3B5IHRoZSBieXRlcyAqLworICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2J1ZmZlciAocnRwKTsKKyAgICBpZiAoIW91dGJ1ZikKKyAgICAgIGdvdG8gYmFkX2xlbjsKKyAgICBnc3RfcnRwX2Ryb3Bfbm9uX2F1ZGlvX21ldGEgKGRlcGF5LCBvdXRidWYpOworICB9IGVsc2UgeworICAgIGd1aW50OCAqaW4sICpvdXQsIHRtcDsKKyAgICBndWludCBsZW47CisgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICBpbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkIChydHApOworICAgIGxlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAocnRwKTsKKworICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2J1ZmZlciAocnRwKTsKKyAgICBpZiAoIW91dGJ1ZikKKyAgICAgIGdvdG8gYmFkX2xlbjsKKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKG91dGJ1Zik7CisKKyAgICBnc3RfcnRwX2Ryb3Bfbm9uX2F1ZGlvX21ldGEgKGRlcGF5LCBvdXRidWYpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgICAgb3V0ID0gbWFwLmRhdGE7CisKKyAgICAvKiB3ZSBuZWVkIHRvIHJlc2h1ZmZsZSB0aGUgYnl0ZXMsIGlucHV0IGlzIGFsd2F5cyBvZiB0aGUgZm9ybQorICAgICAqIEEgQiBDIEQgLi4uIHdpdGggdGhlIG51bWJlciBvZiBiaXRzIGRlcGVuZGluZyBvbiB0aGUgYml0cmF0ZS4gKi8KKyAgICBzd2l0Y2ggKGRlcGF5LT5iaXRyYXRlKSB7CisgICAgICBjYXNlIDE2MDAwOgorICAgICAgeworICAgICAgICAvKiAgMCAgICAgICAgICAgICAgIAorICAgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0KKyAgICAgICAgICogfEQgRHxDIEN8QiBCfEEgQXwgLi4uCisgICAgICAgICAqIHwwIDF8MCAxfDAgMXwwIDF8CisgICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLQorICAgICAgICAgKi8KKyAgICAgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgICB0bXAgPSAqaW4rKzsKKyAgICAgICAgICAqb3V0KysgPSAoKHRtcCAmIDB4YzApID4+IDYpIHwKKyAgICAgICAgICAgICAgKCh0bXAgJiAweDMwKSA+PiAyKSB8ICgodG1wICYgMHgwYykgPDwgMikgfCAoKHRtcCAmIDB4MDMpIDw8IDYpOworICAgICAgICAgIGxlbi0tOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAyNDAwMDoKKyAgICAgIHsKKyAgICAgICAgLyogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyCisgICAgICAgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMworICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLQorICAgICAgICAgKiB8QyBDfEIgQiBCfEEgQSBBfEZ8RSBFIEV8RCBEIER8Q3xIIEggSHxHIEcgR3xGIEZ8IC4uLgorICAgICAgICAgKiB8MSAyfDAgMSAyfDAgMSAyfDJ8MCAxIDJ8MCAxIDJ8MHwwIDEgMnwwIDEgMnwwIDF8CisgICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstCisgICAgICAgICAqLworICAgICAgICB3aGlsZSAobGVuID4gMikgeworICAgICAgICAgIHRtcCA9ICppbisrOworICAgICAgICAgICpvdXQrKyA9ICgodG1wICYgMHhlMCkgPj4gNSkgfAorICAgICAgICAgICAgICAoKHRtcCAmIDB4MWMpIDw8IDEpIHwgKCh0bXAgJiAweDAzKSA8PCA2KTsKKyAgICAgICAgICB0bXAgPSAqaW4rKzsKKyAgICAgICAgICAqb3V0KysgPSAoKHRtcCAmIDB4ODApID4+IDcpIHwKKyAgICAgICAgICAgICAgKCh0bXAgJiAweDcwKSA+PiAzKSB8ICgodG1wICYgMHgwZSkgPDwgNCkgfCAoKHRtcCAmIDB4MDEpIDw8IDcpOworICAgICAgICAgIHRtcCA9ICppbisrOworICAgICAgICAgICpvdXQrKyA9ICgodG1wICYgMHhjMCkgPj4gNikgfAorICAgICAgICAgICAgICAoKHRtcCAmIDB4MzgpID4+IDEpIHwgKCh0bXAgJiAweDA3KSA8PCA1KTsKKyAgICAgICAgICBsZW4gLT0gMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgMzIwMDA6CisgICAgICB7CisgICAgICAgIC8qICAwICAgICAgICAgICAgICAgICAgIDEKKyAgICAgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUKKyAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLQorICAgICAgICAgKiB8QiBCIEIgQnxBIEEgQSBBfEQgRCBEIER8QyBDIEMgQ3wgLi4uCisgICAgICAgICAqIHwwIDEgMiAzfDAgMSAyIDN8MCAxIDIgM3wwIDEgMiAzfAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstCisgICAgICAgICAqLworICAgICAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICAgIHRtcCA9ICppbisrOworICAgICAgICAgICpvdXQrKyA9ICgodG1wICYgMHhmMCkgPj4gNCkgfCAoKHRtcCAmIDB4MGYpIDw8IDQpOworICAgICAgICAgIGxlbi0tOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSA0MDAwMDoKKyAgICAgIHsKKyAgICAgICAgLyogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgICAgICAgICAgNAorICAgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwCisgICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0KKyAgICAgICAgICogfEIgQiBCfEEgQSBBIEEgQXxEfEMgQyBDIEMgQ3xCIEJ8RSBFIEUgRXxEIEQgRCBEfEcgR3xGIEYgRiBGIEZ8RXxIIEggSCBIIEh8RyBHIEd8CisgICAgICAgICAqIHwyIDMgNHwwIDEgMiAzIDR8NHwwIDEgMiAzIDR8MCAxfDEgMiAzIDR8MCAxIDIgM3wzIDR8MCAxIDIgMyA0fDB8MCAxIDIgMyA0fDAgMSAyfCAgIAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstCisgICAgICAgICAqLworICAgICAgICB3aGlsZSAobGVuID4gNCkgeworICAgICAgICAgIHRtcCA9ICppbisrOworICAgICAgICAgICpvdXQrKyA9ICgodG1wICYgMHhmOCkgPj4gMykgfCAoKHRtcCAmIDB4MDcpIDw8IDUpOworICAgICAgICAgIHRtcCA9ICppbisrOworICAgICAgICAgICpvdXQrKyA9ICgodG1wICYgMHhjMCkgPj4gNikgfAorICAgICAgICAgICAgICAoKHRtcCAmIDB4M2UpIDw8IDEpIHwgKCh0bXAgJiAweDAxKSA8PCA3KTsKKyAgICAgICAgICB0bXAgPSAqaW4rKzsKKyAgICAgICAgICAqb3V0KysgPSAoKHRtcCAmIDB4ZjApID4+IDQpIHwgKCh0bXAgJiAweDBmKSA8PCA0KTsKKyAgICAgICAgICB0bXAgPSAqaW4rKzsKKyAgICAgICAgICAqb3V0KysgPSAoKHRtcCAmIDB4ODApID4+IDcpIHwKKyAgICAgICAgICAgICAgKCh0bXAgJiAweDdjKSA+PiAxKSB8ICgodG1wICYgMHgwMykgPDwgNik7CisgICAgICAgICAgdG1wID0gKmluKys7CisgICAgICAgICAgKm91dCsrID0gKCh0bXAgJiAweGUwKSA+PiA1KSB8ICgodG1wICYgMHgxZikgPDwgMyk7CisgICAgICAgICAgbGVuIC09IDU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm1hcCk7CisgIH0KKworICBpZiAobWFya2VyKSB7CisgICAgLyogbWFyayBzdGFydCBvZiB0YWxrc3B1cnQgd2l0aCBSRVNZTkMgKi8KKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19SRVNZTkMpOworICB9CisKKyAgcmV0dXJuIG91dGJ1ZjsKKworYmFkX2xlbjoKKyAgeworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2c3MjZfZGVwYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cEc3MjZEZXBheSAqcnRwZzcyNmRlcGF5OworCisgIHJ0cGc3MjZkZXBheSA9IEdTVF9SVFBfRzcyNl9ERVBBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfRk9SQ0VfQUFMMjoKKyAgICAgIHJ0cGc3MjZkZXBheS0+Zm9yY2VfYWFsMiA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZzcyNl9kZXBheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwRzcyNkRlcGF5ICpydHBnNzI2ZGVwYXk7CisKKyAgcnRwZzcyNmRlcGF5ID0gR1NUX1JUUF9HNzI2X0RFUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9GT1JDRV9BQUwyOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHJ0cGc3MjZkZXBheS0+Zm9yY2VfYWFsMik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2c3MjZfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBnNzI2ZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfRzcyNl9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWZkMmVkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuaApAQCAtMCwwICsxLDU4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNSBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA4IEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIgPGRldi1nc3RyZWFtZXJAYXhpcy5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9HNzI2X0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfRzcyNl9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwRzcyNkRlcGF5IEdzdFJ0cEc3MjZEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBHNzI2RGVwYXlDbGFzcyBHc3RSdHBHNzI2RGVwYXlDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfRzcyNl9ERVBBWSBcCisgIChnc3RfcnRwX2c3MjZfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9HNzI2X0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjZfREVQQVksR3N0UnRwRzcyNkRlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9HNzI2X0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HNzI2X0RFUEFZLEdzdFJ0cEc3MjZEZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9HNzI2X0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjZfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0c3MjZfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0c3MjZfREVQQVkpKQorCitzdHJ1Y3QgX0dzdFJ0cEc3MjZEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKKworICBnYm9vbGVhbiBhYWwyOworICBnYm9vbGVhbiBmb3JjZV9hYWwyOworICBnaW50IGJpdHJhdGU7CisgIGd1aW50IGJsb2NrX2FsaWduOworfTsKKworc3RydWN0IF9Hc3RSdHBHNzI2RGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9nNzI2X2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9nNzI2X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1JUUF9HNzI2X0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGc3MjZwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzE2ZTUxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmMKQEAgLTAsMCArMSw0MjIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAxOTk5IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbiA8a2FpLnZlaG1hbmVuQG5va2lhLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNywyMDA4IEF4aXMgQ29tbXVuaWNhdGlvbnMgPGRldi1nc3RyZWFtZXJAYXhpcy5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCisjaW5jbHVkZSAiZ3N0cnRwZzcyNnBheS5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBnNzI2cGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBnNzI2cGF5X2RlYnVnKQorCisjZGVmaW5lIERFRkFVTFRfRk9SQ0VfQUFMMiAgICAgIFRSVUUKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfRk9SQ0VfQUFMMgorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfZzcyNl9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LWFkcGNtLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSA4MDAwLCAiCisgICAgICAgICJiaXRyYXRlID0gKGludCkgeyAxNjAwMCwgMjQwMDAsIDMyMDAwLCA0MDAwMCB9LCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBcImc3MjZcIiIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfZzcyNl9wYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMCwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIHsgXCJHNzI2LTE2XCIsIFwiRzcyNi0yNFwiLCBcIkc3MjYtMzJcIiwgXCJHNzI2LTQwXCIsICIKKyAgICAgICAgIiAgICBcIkFBTDItRzcyNi0xNlwiLCBcIkFBTDItRzcyNi0yNFwiLCBcIkFBTDItRzcyNi0zMlwiLCBcIkFBTDItRzcyNi00MFwiIH0gIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2c3MjZfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfZzcyNl9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9nNzI2X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9nNzI2X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqCisgICAgcGF5bG9hZCwgR3N0QnVmZmVyICogYnVmZmVyKTsKKworI2RlZmluZSBnc3RfcnRwX2c3MjZfcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cEc3MjZQYXksIGdzdF9ydHBfZzcyNl9wYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfQVVESU9fUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2c3MjZfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEc3MjZQYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9ydHBfZzcyNl9wYXlfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcnRwX2c3MjZfcGF5X2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0ZPUkNFX0FBTDIsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImZvcmNlLWFhbDIiLCAiRm9yY2UgQUFMMiIsCisgICAgICAgICAgIkZvcmNlIEFBTDIgZW5jb2RpbmcgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBiYWQgZGVwYXlsb2FkZXJzIiwKKyAgICAgICAgICBERUZBVUxUX0ZPUkNFX0FBTDIsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZzcyNl9wYXlfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZzcyNl9wYXlfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBHLjcyNiBwYXlsb2FkZXIiLCAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYXlsb2FkLWVuY29kZXMgRy43MjYgYXVkaW8gaW50byBhIFJUUCBwYWNrZXQiLAorICAgICAgIkF4aXMgQ29tbXVuaWNhdGlvbnMgPGRldi1nc3RyZWFtZXJAYXhpcy5jb20+Iik7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9nNzI2X3BheV9zZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2J1ZmZlciA9IGdzdF9ydHBfZzcyNl9wYXlfaGFuZGxlX2J1ZmZlcjsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwZzcyNnBheV9kZWJ1ZywgInJ0cGc3MjZwYXkiLCAwLAorICAgICAgIkcuNzI2IFJUUCBQYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZzcyNl9wYXlfaW5pdCAoR3N0UnRwRzcyNlBheSAqIHJ0cGc3MjZwYXkpCit7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgKnJ0cGJhc2VhdWRpb3BheWxvYWQ7CisKKyAgcnRwYmFzZWF1ZGlvcGF5bG9hZCA9IEdTVF9SVFBfQkFTRV9BVURJT19QQVlMT0FEIChydHBnNzI2cGF5KTsKKworICBHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwZzcyNnBheSktPmNsb2NrX3JhdGUgPSA4MDAwOworCisgIHJ0cGc3MjZwYXktPmZvcmNlX2FhbDIgPSBERUZBVUxUX0ZPUkNFX0FBTDI7CisKKyAgLyogc2FtcGxlIGJhc2VkIGNvZGVjICovCisgIGdzdF9ydHBfYmFzZV9hdWRpb19wYXlsb2FkX3NldF9zYW1wbGVfYmFzZWQgKHJ0cGJhc2VhdWRpb3BheWxvYWQpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfZzcyNl9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2NoYXIgKmVuY29kaW5nX25hbWU7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkICpydHBiYXNlYXVkaW9wYXlsb2FkOworICBHc3RSdHBHNzI2UGF5ICpwYXk7CisgIEdzdENhcHMgKnBlZXJjYXBzOworICBnYm9vbGVhbiByZXM7CisKKyAgcnRwYmFzZWF1ZGlvcGF5bG9hZCA9IEdTVF9SVFBfQkFTRV9BVURJT19QQVlMT0FEIChwYXlsb2FkKTsKKyAgcGF5ID0gR1NUX1JUUF9HNzI2X1BBWSAocGF5bG9hZCk7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImJpdHJhdGUiLCAmcGF5LT5iaXRyYXRlKSkKKyAgICBwYXktPmJpdHJhdGUgPSAzMjAwMDsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYXlsb2FkLCAidXNpbmcgYml0cmF0ZSAlZCIsIHBheS0+Yml0cmF0ZSk7CisKKyAgcGF5LT5hYWwyID0gRkFMU0U7CisKKyAgLyogZmlyc3Qgc2VlIHdoYXQgd2UgY2FuIGRvIHdpdGggdGhlIGJpdHJhdGUgKi8KKyAgc3dpdGNoIChwYXktPmJpdHJhdGUpIHsKKyAgICBjYXNlIDE2MDAwOgorICAgICAgZW5jb2RpbmdfbmFtZSA9IGdfc3RyZHVwICgiRzcyNi0xNiIpOworICAgICAgZ3N0X3J0cF9iYXNlX2F1ZGlvX3BheWxvYWRfc2V0X3NhbXBsZWJpdHNfb3B0aW9ucyAocnRwYmFzZWF1ZGlvcGF5bG9hZCwKKyAgICAgICAgICAyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjQwMDA6CisgICAgICBlbmNvZGluZ19uYW1lID0gZ19zdHJkdXAgKCJHNzI2LTI0Iik7CisgICAgICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfc2FtcGxlYml0c19vcHRpb25zIChydHBiYXNlYXVkaW9wYXlsb2FkLAorICAgICAgICAgIDMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjAwMDoKKyAgICAgIGVuY29kaW5nX25hbWUgPSBnX3N0cmR1cCAoIkc3MjYtMzIiKTsKKyAgICAgIGdzdF9ydHBfYmFzZV9hdWRpb19wYXlsb2FkX3NldF9zYW1wbGViaXRzX29wdGlvbnMgKHJ0cGJhc2VhdWRpb3BheWxvYWQsCisgICAgICAgICAgNCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQwMDAwOgorICAgICAgZW5jb2RpbmdfbmFtZSA9IGdfc3RyZHVwICgiRzcyNi00MCIpOworICAgICAgZ3N0X3J0cF9iYXNlX2F1ZGlvX3BheWxvYWRfc2V0X3NhbXBsZWJpdHNfb3B0aW9ucyAocnRwYmFzZWF1ZGlvcGF5bG9hZCwKKyAgICAgICAgICA1KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnb3RvIGludmFsaWRfYml0cmF0ZTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJzZWxlY3RlZCBiYXNlIGVuY29kaW5nICVzIiwgZW5jb2RpbmdfbmFtZSk7CisKKyAgLyogbm93IHNlZSBpZiB3ZSBuZWVkIHRvIHByb2R1Y2UgQUFMMiBvciBub3QgKi8KKyAgcGVlcmNhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAocGF5bG9hZC0+c3JjcGFkLCBOVUxMKTsKKyAgaWYgKHBlZXJjYXBzKSB7CisgICAgR3N0Q2FwcyAqZmlsdGVyLCAqaW50ZXJzZWN0OworICAgIGdjaGFyICpjYXBzc3RyOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocGF5bG9hZCwgImhhdmUgcGVlcmNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIHBlZXJjYXBzKTsKKworICAgIGNhcHNzdHIgPSBnX3N0cmR1cF9wcmludGYgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA4MDAwLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgJXM7ICIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDAsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBBQUwyLSVzIiwgZW5jb2RpbmdfbmFtZSwgZW5jb2RpbmdfbmFtZSk7CisgICAgZmlsdGVyID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKGNhcHNzdHIpOworICAgIGdfZnJlZSAoY2Fwc3N0cik7CisgICAgZ19mcmVlIChlbmNvZGluZ19uYW1lKTsKKworICAgIC8qIGludGVyc2VjdCB0byBmaWx0ZXIgKi8KKyAgICBpbnRlcnNlY3QgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHBlZXJjYXBzLCBmaWx0ZXIpOworICAgIGdzdF9jYXBzX3VucmVmIChwZWVyY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGZpbHRlcik7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXlsb2FkLCAiaW50ZXJzZWN0ZWQgdG8gJSIgR1NUX1BUUl9GT1JNQVQsIGludGVyc2VjdCk7CisKKyAgICBpZiAoIWludGVyc2VjdCkKKyAgICAgIGdvdG8gbm9fZm9ybWF0OworICAgIGlmIChnc3RfY2Fwc19pc19lbXB0eSAoaW50ZXJzZWN0KSkgeworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGludGVyc2VjdCk7CisgICAgICBnb3RvIG5vX2Zvcm1hdDsKKyAgICB9CisKKyAgICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChpbnRlcnNlY3QsIDApOworCisgICAgLyogbm93IHNlZSB3aGF0IGVuY29kaW5nIG5hbWUgd2Ugc2V0dGxlZCBvbiwgd2UgbmVlZCB0byBkdXAgYmVjYXVzZSB0aGUKKyAgICAgKiBzdHJpbmcgZ29lcyBhd2F5IHdoZW4gd2UgdW5yZWYgdGhlIGludGVyc2VjdGlvbiBiZWxvdy4gKi8KKyAgICBlbmNvZGluZ19uYW1lID0KKyAgICAgICAgZ19zdHJkdXAgKGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZW5jb2RpbmctbmFtZSIpKTsKKworICAgIC8qIGlmIHdlIG1hbmFnZWQgdG8gbmVnb3RpYXRlIHRvIEFBTDIsIHdlIGRlZmluYXRseSBhcmUgZ29pbmcgdG8gZG8gQUFMMgorICAgICAqIGVuY29kaW5nLiBFbHNlIHdlIG9ubHkgZW5jb2RlIEFBTDIgd2hlbiBleHBsaWNpdGx5IHNldCBieSB0aGUKKyAgICAgKiBwcm9wZXJ0eS4gKi8KKyAgICBpZiAoZ19zdHJfaGFzX3ByZWZpeCAoZW5jb2RpbmdfbmFtZSwgIkFBTDItIikpCisgICAgICBwYXktPmFhbDIgPSBUUlVFOworICAgIGVsc2UKKyAgICAgIHBheS0+YWFsMiA9IHBheS0+Zm9yY2VfYWFsMjsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJmaW5hbCBlbmNvZGluZyAlcywgQUFMMiAlZCIsIGVuY29kaW5nX25hbWUsCisgICAgICAgIHBheS0+YWFsMik7CisKKyAgICBnc3RfY2Fwc191bnJlZiAoaW50ZXJzZWN0KTsKKyAgfSBlbHNlIHsKKyAgICAvKiBkb3duc3RyZWFtIGNhbiBkbyBhbnl0aGluZyBidXQgd2UgcHJlZmVyIHRoZSBiZXR0ZXIgc3VwcG9ydGVkIG5vbi1BQUwyICovCisgICAgcGF5LT5hYWwyID0gcGF5LT5mb3JjZV9hYWwyOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJubyBwZWVyIGNhcHMsIEFBTDIgJWQiLCBwYXktPmFhbDIpOworICB9CisKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHBheWxvYWQsICJhdWRpbyIsIFRSVUUsIGVuY29kaW5nX25hbWUsCisgICAgICA4MDAwKTsKKyAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHBheWxvYWQsIE5VTEwpOworCisgIGdfZnJlZSAoZW5jb2RpbmdfbmFtZSk7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfYml0cmF0ZToKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBheWxvYWQsICJpbnZhbGlkIGJpdHJhdGUgJWQgc3BlY2lmaWVkIiwgcGF5LT5iaXRyYXRlKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX2Zvcm1hdDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBheWxvYWQsICJjb3VsZCBub3QgbmVnb3RpYXRlIGZvcm1hdCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9nNzI2X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXM7CisgIEdzdFJ0cEc3MjZQYXkgKnBheTsKKworICBwYXkgPSBHU1RfUlRQX0c3MjZfUEFZIChwYXlsb2FkKTsKKworICBpZiAoIXBheS0+YWFsMikgeworICAgIEdzdE1hcEluZm8gbWFwOworICAgIGd1aW50OCAqZGF0YSwgdG1wOworICAgIGdzaXplIHNpemU7CisKKyAgICAvKiBmb3Igbm9uIEFBTDIsIHdlIG5lZWQgdG8gcmVzaHVmZmxlIHRoZSBieXRlcywgd2UgY2FuIGRvIHRoaXMgaW4tcGxhY2UKKyAgICAgKiB3aGVuIHRoZSBidWZmZXIgaXMgd3JpdGFibGUuICovCisgICAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChidWZmZXIpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEV1JJVEUpOworICAgIGRhdGEgPSBtYXAuZGF0YTsKKyAgICBzaXplID0gbWFwLnNpemU7CisKKyAgICBHU1RfTE9HX09CSkVDVCAocGF5LCAicGFja2luZyAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIG9mIGRhdGEiLCBtYXAuc2l6ZSk7CisKKyAgICAvKiB3ZSBuZWVkIHRvIHJlc2h1ZmZsZSB0aGUgYnl0ZXMsIG91dHB1dCBpcyBvZiB0aGUgZm9ybToKKyAgICAgKiBBIEIgQyBEIC4uIHdpdGggdGhlIG51bWJlciBvZiBiaXRzIGRlcGVuZGluZyBvbiB0aGUgYml0cmF0ZS4gKi8KKyAgICBzd2l0Y2ggKHBheS0+Yml0cmF0ZSkgeworICAgICAgY2FzZSAxNjAwMDoKKyAgICAgIHsKKyAgICAgICAgLyogIDAgICAgICAgICAgICAgICAKKyAgICAgICAgICogIDAgMSAyIDMgNCA1IDYgNyAKKyAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstCisgICAgICAgICAqIHxEIER8QyBDfEIgQnxBIEF8IC4uLgorICAgICAgICAgKiB8MCAxfDAgMXwwIDF8MCAxfAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0KKyAgICAgICAgICovCisgICAgICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICAgIHRtcCA9ICpkYXRhOworICAgICAgICAgICpkYXRhKysgPSAoKHRtcCAmIDB4YzApID4+IDYpIHwKKyAgICAgICAgICAgICAgKCh0bXAgJiAweDMwKSA+PiAyKSB8ICgodG1wICYgMHgwYykgPDwgMikgfCAoKHRtcCAmIDB4MDMpIDw8IDYpOworICAgICAgICAgIHNpemUtLTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgMjQwMDA6CisgICAgICB7CisgICAgICAgIC8qICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMgorICAgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMKKyAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0KKyAgICAgICAgICogfEMgQ3xCIEIgQnxBIEEgQXxGfEUgRSBFfEQgRCBEfEN8SCBIIEh8RyBHIEd8RiBGfCAuLi4KKyAgICAgICAgICogfDEgMnwwIDEgMnwwIDEgMnwyfDAgMSAyfDAgMSAyfDB8MCAxIDJ8MCAxIDJ8MCAxfAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLQorICAgICAgICAgKi8KKyAgICAgICAgd2hpbGUgKHNpemUgPiAyKSB7CisgICAgICAgICAgdG1wID0gKmRhdGE7CisgICAgICAgICAgKmRhdGErKyA9ICgodG1wICYgMHhjMCkgPj4gNikgfAorICAgICAgICAgICAgICAoKHRtcCAmIDB4MzgpID4+IDEpIHwgKCh0bXAgJiAweDA3KSA8PCA1KTsKKyAgICAgICAgICB0bXAgPSAqZGF0YTsKKyAgICAgICAgICAqZGF0YSsrID0gKCh0bXAgJiAweDgwKSA+PiA3KSB8CisgICAgICAgICAgICAgICgodG1wICYgMHg3MCkgPj4gMykgfCAoKHRtcCAmIDB4MGUpIDw8IDQpIHwgKCh0bXAgJiAweDAxKSA8PCA3KTsKKyAgICAgICAgICB0bXAgPSAqZGF0YTsKKyAgICAgICAgICAqZGF0YSsrID0gKCh0bXAgJiAweGUwKSA+PiA1KSB8CisgICAgICAgICAgICAgICgodG1wICYgMHgxYykgPj4gMikgfCAoKHRtcCAmIDB4MDMpIDw8IDYpOworICAgICAgICAgIHNpemUgLT0gMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgMzIwMDA6CisgICAgICB7CisgICAgICAgIC8qICAwICAgICAgICAgICAgICAgICAgIDEKKyAgICAgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUKKyAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLQorICAgICAgICAgKiB8QiBCIEIgQnxBIEEgQSBBfEQgRCBEIER8QyBDIEMgQ3wgLi4uCisgICAgICAgICAqIHwwIDEgMiAzfDAgMSAyIDN8MCAxIDIgM3wwIDEgMiAzfAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstCisgICAgICAgICAqLworICAgICAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgICB0bXAgPSAqZGF0YTsKKyAgICAgICAgICAqZGF0YSsrID0gKCh0bXAgJiAweGYwKSA+PiA0KSB8ICgodG1wICYgMHgwZikgPDwgNCk7CisgICAgICAgICAgc2l6ZS0tOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSA0MDAwMDoKKyAgICAgIHsKKyAgICAgICAgLyogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgICAgICAgICAgNAorICAgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwCisgICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0KKyAgICAgICAgICogfEIgQiBCfEEgQSBBIEEgQXxEfEMgQyBDIEMgQ3xCIEJ8RSBFIEUgRXxEIEQgRCBEfEcgR3xGIEYgRiBGIEZ8RXxIIEggSCBIIEh8RyBHIEd8CisgICAgICAgICAqIHwyIDMgNHwwIDEgMiAzIDR8NHwwIDEgMiAzIDR8MCAxfDEgMiAzIDR8MCAxIDIgM3wzIDR8MCAxIDIgMyA0fDB8MCAxIDIgMyA0fDAgMSAyfCAgIAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstCisgICAgICAgICAqLworICAgICAgICB3aGlsZSAoc2l6ZSA+IDQpIHsKKyAgICAgICAgICB0bXAgPSAqZGF0YTsKKyAgICAgICAgICAqZGF0YSsrID0gKCh0bXAgJiAweGUwKSA+PiA1KSB8ICgodG1wICYgMHgxZikgPDwgMyk7CisgICAgICAgICAgdG1wID0gKmRhdGE7CisgICAgICAgICAgKmRhdGErKyA9ICgodG1wICYgMHg4MCkgPj4gNykgfAorICAgICAgICAgICAgICAoKHRtcCAmIDB4N2MpID4+IDIpIHwgKCh0bXAgJiAweDAzKSA8PCA2KTsKKyAgICAgICAgICB0bXAgPSAqZGF0YTsKKyAgICAgICAgICAqZGF0YSsrID0gKCh0bXAgJiAweGYwKSA+PiA0KSB8ICgodG1wICYgMHgwZikgPDwgNCk7CisgICAgICAgICAgdG1wID0gKmRhdGE7CisgICAgICAgICAgKmRhdGErKyA9ICgodG1wICYgMHhjMCkgPj4gNikgfAorICAgICAgICAgICAgICAoKHRtcCAmIDB4M2UpIDw8IDIpIHwgKCh0bXAgJiAweDAxKSA8PCA3KTsKKyAgICAgICAgICB0bXAgPSAqZGF0YTsKKyAgICAgICAgICAqZGF0YSsrID0gKCh0bXAgJiAweGY4KSA+PiAzKSB8ICgodG1wICYgMHgwNykgPDwgNSk7CisgICAgICAgICAgc2l6ZSAtPSA1OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICB9CisKKyAgcmVzID0KKyAgICAgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5oYW5kbGVfYnVmZmVyIChwYXlsb2FkLAorICAgICAgYnVmZmVyKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nNzI2X3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwRzcyNlBheSAqcnRwZzcyNnBheTsKKworICBydHBnNzI2cGF5ID0gR1NUX1JUUF9HNzI2X1BBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfRk9SQ0VfQUFMMjoKKyAgICAgIHJ0cGc3MjZwYXktPmZvcmNlX2FhbDIgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2c3MjZfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSdHBHNzI2UGF5ICpydHBnNzI2cGF5OworCisgIHJ0cGc3MjZwYXkgPSBHU1RfUlRQX0c3MjZfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9GT1JDRV9BQUwyOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHJ0cGc3MjZwYXktPmZvcmNlX2FhbDIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3J0cF9nNzI2X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGc3MjZwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfRzcyNl9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmggYi9nc3QvcnRwL2dzdHJ0cGc3MjZwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWRiZmE0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmgKQEAgLTAsMCArMSw1NSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNywyMDA4IEF4aXMgQ29tbXVuaWNhdGlvbnMgPGRldi1nc3RyZWFtZXJAYXhpcy5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9HNzI2X1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0c3MjZfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWF1ZGlvcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTIHR5cGVkZWYgc3RydWN0IF9Hc3RSdHBHNzI2UGF5IEdzdFJ0cEc3MjZQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwRzcyNlBheUNsYXNzIEdzdFJ0cEc3MjZQYXlDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfRzcyNl9QQVkgXAorICAoZ3N0X3J0cF9nNzI2X3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0c3MjZfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjZfUEFZLEdzdFJ0cEc3MjZQYXkpKQorI2RlZmluZSBHU1RfUlRQX0c3MjZfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HNzI2X1BBWSxHc3RSdHBHNzI2UGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0c3MjZfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjZfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9HNzI2X1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfRzcyNl9QQVkpKQorCitzdHJ1Y3QgX0dzdFJ0cEc3MjZQYXkKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZCBhdWRpb3BheWxvYWQ7CisKKyAgZ2Jvb2xlYW4gYWFsMjsKKyAgZ2Jvb2xlYW4gZm9yY2VfYWFsMjsKKyAgZ2ludCBiaXRyYXRlOworfTsKKworc3RydWN0IF9Hc3RSdHBHNzI2UGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfZzcyNl9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2c3MjZfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1JUUF9HNzI2X1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YzFjNGQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jCkBAIC0wLDAgKzEsMjI1IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnc3RydHBnNzI5ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBnNzI5ZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cGc3MjlkZXBheV9kZWJ1ZykKKworCisvKiByZWZlcmVuY2VzOgorICoKKyAqIFJGQyAzNTUxICg0LjUuNikKKyAqLworCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKK2VudW0KK3sKKyAgUFJPUF8wCit9OworCisvKiBpbnB1dCBpcyBhbiBSVFAgcGFja2V0CisgKgorICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9nNzI5X2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDAsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkc3MjlcIjsgIgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRzcyOV9TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2c3MjlfZGVwYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby9HNzI5LCAiICJjaGFubmVscyA9IChpbnQpIDEsIiAicmF0ZSA9IChpbnQpIDgwMDAiKQorICAgICk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2c3MjlfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX2c3MjlfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworCisjZGVmaW5lIGdzdF9ydHBfZzcyOV9kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBHNzI5RGVwYXksIGdzdF9ydHBfZzcyOV9kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nNzI5X2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEc3MjlEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBnNzI5ZGVwYXlfZGVidWcsICJydHBnNzI5ZGVwYXkiLCAwLAorICAgICAgIkcuNzI5IFJUUCBEZXBheWxvYWRlciIpOworCisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2c3MjlfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9nNzI5X2RlcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIEcuNzI5IGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBHLjcyOSBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMzU1MSkiLAorICAgICAgIkxhdXJlbnQgR2xheWFsIDxzcGdsZWdsZUB5YWhvby5mcj4iKTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX2c3MjlfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2c3MjlfZGVwYXlfc2V0Y2FwczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZzcyOV9kZXBheV9pbml0IChHc3RSdHBHNzI5RGVwYXkgKiBydHBnNzI5ZGVwYXkpCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgKmRlcGF5bG9hZDsKKworICBkZXBheWxvYWQgPSBHU1RfUlRQX0JBU0VfREVQQVlMT0FEIChydHBnNzI5ZGVwYXkpOworCisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2c3MjlfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBHc3RDYXBzICpzcmNjYXBzOworICBHc3RSdHBHNzI5RGVwYXkgKnJ0cGc3MjlkZXBheTsKKyAgY29uc3QgZ2NoYXIgKnBhcmFtczsKKyAgZ2ludCBjbG9ja19yYXRlLCBjaGFubmVsczsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIHJ0cGc3MjlkZXBheSA9IEdTVF9SVFBfRzcyOV9ERVBBWSAoZGVwYXlsb2FkKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoIShwYXJhbXMgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImVuY29kaW5nLXBhcmFtcyIpKSkKKyAgICBjaGFubmVscyA9IDE7CisgIGVsc2UgeworICAgIGNoYW5uZWxzID0gYXRvaSAocGFyYW1zKTsKKyAgfQorCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSA4MDAwOworCisgIGlmIChjaGFubmVscyAhPSAxKQorICAgIGdvdG8gd3JvbmdfY2hhbm5lbHM7CisKKyAgaWYgKGNsb2NrX3JhdGUgIT0gODAwMCkKKyAgICBnb3RvIHdyb25nX2Nsb2NrX3JhdGU7CisKKyAgZGVwYXlsb2FkLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL0c3MjkiLAorICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgY2hhbm5lbHMsICJyYXRlIiwgR19UWVBFX0lOVCwgY2xvY2tfcmF0ZSwgTlVMTCk7CisgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCit3cm9uZ19jaGFubmVsczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGc3MjlkZXBheSwgImV4cGVjdGVkIDEgY2hhbm5lbCwgZ290ICVkIiwgY2hhbm5lbHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQord3JvbmdfY2xvY2tfcmF0ZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGc3MjlkZXBheSwgImV4cGVjdGVkIDgwMDAgY2xvY2stcmF0ZSwgZ290ICVkIiwKKyAgICAgICAgY2xvY2tfcmF0ZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9nNzI5X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0UnRwRzcyOURlcGF5ICpydHBnNzI5ZGVwYXk7CisgIEdzdEJ1ZmZlciAqb3V0YnVmID0gTlVMTDsKKyAgZ2ludCBwYXlsb2FkX2xlbjsKKyAgZ2Jvb2xlYW4gbWFya2VyOworCisgIHJ0cGc3MjlkZXBheSA9IEdTVF9SVFBfRzcyOV9ERVBBWSAoZGVwYXlsb2FkKTsKKworICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAocnRwKTsKKworICAvKiBBdCBsZWFzdCAyIGJ5dGVzIChDTkcgZnJvbSBHNzI5IEFubmV4IEIpICovCisgIGlmIChwYXlsb2FkX2xlbiA8IDIpIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBnNzI5ZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiRzcyOSBSVFAgcGF5bG9hZCB0b28gc21hbGwgKCVkKSIsIHBheWxvYWRfbGVuKSk7CisgICAgZ290byBiYWRfcGFja2V0OworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHJ0cGc3MjlkZXBheSwgInBheWxvYWQgbGVuICVkIiwgcGF5bG9hZF9sZW4pOworCisgIGlmICgocGF5bG9hZF9sZW4gJSAxMCkgPT0gMikgeworICAgIEdTVF9MT0dfT0JKRUNUIChydHBnNzI5ZGVwYXksICJHNzI5IHBheWxvYWQgY29udGFpbnMgQ05HIGZyYW1lIik7CisgIH0KKworICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9idWZmZXIgKHJ0cCk7CisgIG1hcmtlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCk7CisKKyAgaWYgKG1hcmtlcikgeworICAgIC8qIG1hcmtlciBiaXQgc3RhcnRzIHRhbGtzcHVydCAqLworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX1JFU1lOQyk7CisgIH0KKworICBnc3RfcnRwX2Ryb3Bfbm9uX2F1ZGlvX21ldGEgKGRlcGF5bG9hZCwgb3V0YnVmKTsKKworICBHU1RfTE9HX09CSkVDVCAoZGVwYXlsb2FkLCAicHVzaGluZyBidWZmZXIgb2Ygc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZikpOworCisgIHJldHVybiBvdXRidWY7CisKKyAgLyogRVJST1JTICovCitiYWRfcGFja2V0OgorICB7CisgICAgLyogbm8gZmF0YWwgZXJyb3IgKi8KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3J0cF9nNzI5X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwZzcyOWRlcGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX0c3MjlfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzNTYyZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5LmgKQEAgLTAsMCArMSw2MSBAQAorLyogR1N0cmVhbWVyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfRzcyOV9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0c3MjlfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfRzcyOV9ERVBBWSBcCisgIChnc3RfcnRwX2c3MjlfZGVwYXlfZ2V0X3R5cGUoKSkKKyAgCisjZGVmaW5lIEdTVF9SVFBfRzcyOV9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9HNzI5X0RFUEFZLEdzdFJ0cEc3MjlEZXBheSkpCisgIAorI2RlZmluZSBHU1RfUlRQX0c3MjlfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0c3MjlfREVQQVksR3N0UnRwRzcyOURlcGF5Q2xhc3MpKQorICAKKyNkZWZpbmUgR1NUX0lTX1JUUF9HNzI5X0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjlfREVQQVkpKQorICAKKyNkZWZpbmUgR1NUX0lTX1JUUF9HNzI5X0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HNzI5X0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEc3MjlEZXBheSBHc3RSdHBHNzI5RGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwRzcyOURlcGF5Q2xhc3MgR3N0UnRwRzcyOURlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwRzcyOURlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworfTsKKworc3RydWN0IF9Hc3RSdHBHNzI5RGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9nNzI5X2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9nNzI5X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0c3MjlfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwZzcyOXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OGZhNjQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYwpAQCAtMCwwICsxLDM5NiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gQ29sbGFib3JhIEx0ZAorICogIEBhdXRob3I6IE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBUaGlzIHBheWxvYWRlciBhc3N1bWVzIHRoYXQgdGhlIGRhdGEgd2lsbCBBTFdBWVMgY29tZSBhcyB6ZXJvIG9yIG1vcmUKKyAqIDEwIGJ5dGVzIGZyYW1lIG9mIGF1ZGlvIGZvbGxvd2VkIGJ5IDAgb3IgMSAyIGJ5dGUgZnJhbWUgb2Ygc2lsZW5jZS4KKyAqIEFueSBvdGhlciBidWZmZXIgZm9ybWF0IHdvbid0IHdvcmsKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgImdzdHJ0cGc3MjlwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBnNzI5cGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBnNzI5cGF5X2RlYnVnKQorCisjZGVmaW5lIEc3MjlfRlJBTUVfU0laRSAxMAorI2RlZmluZSBHNzI5Ql9DTl9GUkFNRV9TSVpFIDIKKyNkZWZpbmUgRzcyOV9GUkFNRV9EVVJBVElPTiAoMTAgKiBHU1RfTVNFQ09ORCkKKyNkZWZpbmUgRzcyOV9GUkFNRV9EVVJBVElPTl9NUyAoMTApCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9nNzI5X3BheV9zZXRfY2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9nNzI5X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9nNzI5X3BheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfZzcyOV9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby9HNzI5LCAiICAgICAvKiBhY2NvcmRpbmcgdG8gUkZDIDM1NTUgKi8KKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAicmF0ZSA9IChpbnQpIDgwMDAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2c3MjlfcGF5X3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0c3MjlfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA4MDAwLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJHNzI5XCI7ICIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA4MDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJHNzI5XCIiKQorICAgICk7CisKKyNkZWZpbmUgZ3N0X3J0cF9nNzI5X3BheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSVFBHNzI5UGF5LCBnc3RfcnRwX2c3MjlfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9QQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZzcyOV9wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJUUEc3MjlQYXkgKnBheSA9IEdTVF9SVFBfRzcyOV9QQVkgKG9iamVjdCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHBheS0+YWRhcHRlcik7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nNzI5X3BheV9jbGFzc19pbml0IChHc3RSVFBHNzI5UGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqcGF5bG9hZF9jbGFzcyA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChrbGFzcyk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGc3MjlwYXlfZGVidWcsICJydHBnNzI5cGF5IiwgMCwKKyAgICAgICJHLjcyOSBSVFAgUGF5bG9hZGVyIik7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX2c3MjlfcGF5X2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfZzcyOV9wYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZzcyOV9wYXlfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZzcyOV9wYXlfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBHLjcyOSBwYXlsb2FkZXIiLCAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYWNrZXRpemUgRy43MjkgYXVkaW8gaW50byBSVFAgcGFja2V0cyIsCisgICAgICAiT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2c3MjlfcGF5X3NldF9jYXBzOworICBwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9nNzI5X3BheV9oYW5kbGVfYnVmZmVyOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nNzI5X3BheV9pbml0IChHc3RSVFBHNzI5UGF5ICogcGF5KQoreworICBHc3RSVFBCYXNlUGF5bG9hZCAqcGF5bG9hZCA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEIChwYXkpOworCisgIHBheWxvYWQtPnB0ID0gR1NUX1JUUF9QQVlMT0FEX0c3Mjk7CisKKyAgcGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nNzI5X3BheV9yZXNldCAoR3N0UlRQRzcyOVBheSAqIHBheSkKK3sKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHBheS0+YWRhcHRlcik7CisgIHBheS0+ZGlzY29udCA9IEZBTFNFOworICBwYXktPm5leHRfcnRwX3RpbWUgPSAwOworICBwYXktPmZpcnN0X3RzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgcGF5LT5maXJzdF9ydHBfdGltZSA9IDA7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9nNzI5X3BheV9zZXRfY2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2Jvb2xlYW4gcmVzOworCisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChwYXlsb2FkLCAiYXVkaW8iLAorICAgICAgcGF5bG9hZC0+cHQgIT0gR1NUX1JUUF9QQVlMT0FEX0c3MjksICJHNzI5IiwgODAwMCk7CisKKyAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHBheWxvYWQsIE5VTEwpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2c3MjlfcGF5X3B1c2ggKEdzdFJUUEc3MjlQYXkgKiBydHBnNzI5cGF5LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkICpiYXNlcGF5bG9hZDsKKyAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uOworICBndWludCBmcmFtZXM7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0UlRQQnVmZmVyIHJ0cCA9IHsgTlVMTCB9OworICBndWludCBwYXlsb2FkX2xlbiA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisKKyAgYmFzZXBheWxvYWQgPSBHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwZzcyOXBheSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwZzcyOXBheSwgIlB1c2hpbmcgJWQgYnl0ZXMgdHMgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgcGF5bG9hZF9sZW4sIEdTVF9USU1FX0FSR1MgKHJ0cGc3MjlwYXktPm5leHRfdHMpKTsKKworICAvKiBjcmVhdGUgYnVmZmVyIHRvIGhvbGQgdGhlIHBheWxvYWQgKi8KKyAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlICgwLCAwLCAwKTsKKworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKG91dGJ1ZiwgR1NUX01BUF9SRUFEV1JJVEUsICZydHApOworCisgIC8qIHNldCBtZXRhZGF0YSAqLworICBmcmFtZXMgPQorICAgICAgKHBheWxvYWRfbGVuIC8gRzcyOV9GUkFNRV9TSVpFKSArICgocGF5bG9hZF9sZW4gJSBHNzI5X0ZSQU1FX1NJWkUpID4+IDEpOworICBkdXJhdGlvbiA9IGZyYW1lcyAqIEc3MjlfRlJBTUVfRFVSQVRJT047CisgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gcnRwZzcyOXBheS0+bmV4dF90czsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9IGR1cmF0aW9uOworICBHU1RfQlVGRkVSX09GRlNFVCAob3V0YnVmKSA9IHJ0cGc3MjlwYXktPm5leHRfcnRwX3RpbWU7CisgIHJ0cGc3MjlwYXktPm5leHRfdHMgKz0gZHVyYXRpb247CisgIHJ0cGc3MjlwYXktPm5leHRfcnRwX3RpbWUgKz0gZnJhbWVzICogODA7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHJ0cGc3MjlwYXktPmRpc2NvbnQpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXBheWxvYWQsICJkaXNjb250LCBzZXR0aW5nIG1hcmtlciBiaXQiKTsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBUUlVFKTsKKyAgICBydHBnNzI5cGF5LT5kaXNjb250ID0gRkFMU0U7CisgIH0KKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgIC8qIGFwcGVuZCBwYXlsb2FkICovCisgIGdzdF9ydHBfY29weV9hdWRpb19tZXRhIChiYXNlcGF5bG9hZCwgb3V0YnVmLCBidWYpOworICBvdXRidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAob3V0YnVmLCBidWYpOworCisgIHJldCA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKGJhc2VwYXlsb2FkLCBvdXRidWYpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2c3MjlfcGF5X3JlY2FsY19ydHBfdGltZSAoR3N0UlRQRzcyOVBheSAqIHJ0cGc3MjlwYXksIEdzdENsb2NrVGltZSB0aW1lKQoreworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHJ0cGc3MjlwYXktPmZpcnN0X3RzKQorICAgICAgJiYgR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHRpbWUpICYmIHRpbWUgPj0gcnRwZzcyOXBheS0+Zmlyc3RfdHMpIHsKKyAgICBHc3RDbG9ja1RpbWUgZGlmZjsKKyAgICBndWludDMyIHJ0cGRpZmY7CisKKyAgICBkaWZmID0gdGltZSAtIHJ0cGc3MjlwYXktPmZpcnN0X3RzOworICAgIHJ0cGRpZmYgPSAoZGlmZiAvIEdTVF9NU0VDT05EKSAqIDg7CisgICAgcnRwZzcyOXBheS0+bmV4dF9ydHBfdGltZSA9IHJ0cGc3MjlwYXktPmZpcnN0X3J0cF90aW1lICsgcnRwZGlmZjsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBnNzI5cGF5LAorICAgICAgICAiZWxhcHNlZCB0aW1lICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBydHAgJSIgR19HVUlOVDMyX0ZPUk1BVCAiLCAiCisgICAgICAgICJuZXcgb2Zmc2V0ICUiIEdfR1VJTlQzMl9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGRpZmYpLCBydHBkaWZmLAorICAgICAgICBydHBnNzI5cGF5LT5uZXh0X3J0cF90aW1lKTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9nNzI5X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0UlRQRzcyOVBheSAqcnRwZzcyOXBheSA9IEdTVF9SVFBfRzcyOV9QQVkgKHBheWxvYWQpOworICBHc3RBZGFwdGVyICphZGFwdGVyID0gTlVMTDsKKyAgZ3VpbnQgcGF5bG9hZF9sZW47CisgIGd1aW50IGF2YWlsYWJsZTsKKyAgZ3VpbnQgbWF4cHRpbWVfb2N0ZXRzID0gR19NQVhVSU5UOworICBndWludCBtaW5wdGltZV9vY3RldHMgPSAwOworICBndWludCBtaW5fcGF5bG9hZF9sZW47CisgIGd1aW50IG1heF9wYXlsb2FkX2xlbjsKKyAgZ3NpemUgc2l6ZTsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKworICBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKworICBpZiAoc2l6ZSAlIEc3MjlfRlJBTUVfU0laRSAhPSAwICYmCisgICAgICBzaXplICUgRzcyOV9GUkFNRV9TSVpFICE9IEc3MjlCX0NOX0ZSQU1FX1NJWkUpCisgICAgZ290byBpbnZhbGlkX3NpemU7CisKKyAgLyogbWF4IG51bWJlciBvZiBieXRlcyBiYXNlZCBvbiBnaXZlbiBwdGltZSwgaGFzIHRvIGJlIG11bHRpcGxlIG9mCisgICAqIGZyYW1lX2R1cmF0aW9uICovCisgIGlmIChwYXlsb2FkLT5tYXhfcHRpbWUgIT0gLTEpIHsKKyAgICBndWludCBwdGltZV9tcyA9IHBheWxvYWQtPm1heF9wdGltZSAvIEdTVF9NU0VDT05EOworCisgICAgbWF4cHRpbWVfb2N0ZXRzID0gRzcyOV9GUkFNRV9TSVpFICoKKyAgICAgICAgKGludCkgKHB0aW1lX21zIC8gRzcyOV9GUkFNRV9EVVJBVElPTl9NUyk7CisKKyAgICBpZiAobWF4cHRpbWVfb2N0ZXRzIDwgRzcyOV9GUkFNRV9TSVpFKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBheWxvYWQsICJHaXZlbiBwdGltZSAlIiBHX0dJTlQ2NF9GT1JNQVQKKyAgICAgICAgICAiIGlzIHNtYWxsZXIgdGhhbiBtaW5pbXVtICVkIG5zLCBvdmVyd3JpdGluZyB0byBtaW5pbXVtIiwKKyAgICAgICAgICBwYXlsb2FkLT5tYXhfcHRpbWUsIEc3MjlfRlJBTUVfRFVSQVRJT05fTVMpOworICAgICAgbWF4cHRpbWVfb2N0ZXRzID0gRzcyOV9GUkFNRV9TSVpFOworICAgIH0KKyAgfQorCisgIG1heF9wYXlsb2FkX2xlbiA9IE1JTiAoCisgICAgICAvKiBNVFUgbWF4ICovCisgICAgICAoaW50KSAoZ3N0X3J0cF9idWZmZXJfY2FsY19wYXlsb2FkX2xlbiAoR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVCisgICAgICAgICAgICAgIChwYXlsb2FkKSwgMCwgMCkgLyBHNzI5X0ZSQU1FX1NJWkUpCisgICAgICAqIEc3MjlfRlJBTUVfU0laRSwKKyAgICAgIC8qIHB0aW1lIG1heCAqLworICAgICAgbWF4cHRpbWVfb2N0ZXRzKTsKKworICAvKiBtaW4gbnVtYmVyIG9mIGJ5dGVzIGJhc2VkIG9uIGEgZ2l2ZW4gcHRpbWUsIGhhcyB0byBiZSBhIG11bHRpcGxlCisgICAgIG9mIGZyYW1lIGR1cmF0aW9uICovCisgIHsKKyAgICBndWludDY0IG1pbl9wdGltZSA9IHBheWxvYWQtPm1pbl9wdGltZTsKKworICAgIG1pbl9wdGltZSA9IG1pbl9wdGltZSAvIEdTVF9NU0VDT05EOworICAgIG1pbnB0aW1lX29jdGV0cyA9IEc3MjlfRlJBTUVfU0laRSAqCisgICAgICAgIChpbnQpIChtaW5fcHRpbWUgLyBHNzI5X0ZSQU1FX0RVUkFUSU9OX01TKTsKKyAgfQorCisgIG1pbl9wYXlsb2FkX2xlbiA9IE1BWCAobWlucHRpbWVfb2N0ZXRzLCBHNzI5X0ZSQU1FX1NJWkUpOworCisgIGlmIChtaW5fcGF5bG9hZF9sZW4gPiBtYXhfcGF5bG9hZF9sZW4pIHsKKyAgICBtaW5fcGF5bG9hZF9sZW4gPSBtYXhfcGF5bG9hZF9sZW47CisgIH0KKworICAvKiBJZiB0aGUgcHRpbWUgaXMgc3BlY2lmaWVkIGluIHRoZSBjYXBzLCB0cmllZCB0byBhZGhlcmUgdG8gaXQgZXhhY3RseSAqLworICBpZiAocGF5bG9hZC0+cHRpbWUpIHsKKyAgICBndWludDY0IHB0aW1lID0gcGF5bG9hZC0+cHRpbWUgLyBHU1RfTVNFQ09ORDsKKyAgICBndWludCBwdGltZV9pbl9ieXRlcyA9IEc3MjlfRlJBTUVfU0laRSAqCisgICAgICAgIChndWludCkgKHB0aW1lIC8gRzcyOV9GUkFNRV9EVVJBVElPTl9NUyk7CisKKyAgICAvKiBjbGlwIHRvIGNvbXB1dGVkIG1pbiBhbmQgbWF4IGxlbmd0aHMgKi8KKyAgICBwdGltZV9pbl9ieXRlcyA9IE1BWCAobWluX3BheWxvYWRfbGVuLCBwdGltZV9pbl9ieXRlcyk7CisgICAgcHRpbWVfaW5fYnl0ZXMgPSBNSU4gKG1heF9wYXlsb2FkX2xlbiwgcHRpbWVfaW5fYnl0ZXMpOworCisgICAgbWluX3BheWxvYWRfbGVuID0gbWF4X3BheWxvYWRfbGVuID0gcHRpbWVfaW5fYnl0ZXM7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocGF5bG9hZCwKKyAgICAgICJDYWxjdWxhdGVkIG1pbl9wYXlsb2FkX2xlbiAldSBhbmQgbWF4X3BheWxvYWRfbGVuICV1IiwKKyAgICAgIG1pbl9wYXlsb2FkX2xlbiwgbWF4X3BheWxvYWRfbGVuKTsKKworICBhZGFwdGVyID0gcnRwZzcyOXBheS0+YWRhcHRlcjsKKyAgYXZhaWxhYmxlID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChhZGFwdGVyKTsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1BUUyAoYnVmKTsKKworICAvKiByZXN5bmMgcnRwIHRpbWUgb24gZGlzY29udCBvciBhIGRpc2NvbnRpbnVvdXMgY24gcGFja2V0ICovCisgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKGJ1ZikpIHsKKyAgICAvKiBmbHVzaCByZW1haW5kZXIgKi8KKyAgICBpZiAoYXZhaWxhYmxlID4gMCkgeworICAgICAgZ3N0X3J0cF9nNzI5X3BheV9wdXNoIChydHBnNzI5cGF5LAorICAgICAgICAgIGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyX2Zhc3QgKGFkYXB0ZXIsIGF2YWlsYWJsZSkpOworICAgICAgYXZhaWxhYmxlID0gMDsKKyAgICB9CisgICAgcnRwZzcyOXBheS0+ZGlzY29udCA9IFRSVUU7CisgICAgZ3N0X3J0cF9nNzI5X3BheV9yZWNhbGNfcnRwX3RpbWUgKHJ0cGc3MjlwYXksIHRpbWVzdGFtcCk7CisgIH0KKworICBpZiAoc2l6ZSA8IEc3MjlfRlJBTUVfU0laRSkKKyAgICBnc3RfcnRwX2c3MjlfcGF5X3JlY2FsY19ydHBfdGltZSAocnRwZzcyOXBheSwgdGltZXN0YW1wKTsKKworICBpZiAoR19VTkxJS0VMWSAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChydHBnNzI5cGF5LT5maXJzdF90cykpKSB7CisgICAgcnRwZzcyOXBheS0+Zmlyc3RfdHMgPSB0aW1lc3RhbXA7CisgICAgcnRwZzcyOXBheS0+Zmlyc3RfcnRwX3RpbWUgPSBydHBnNzI5cGF5LT5uZXh0X3J0cF90aW1lOworICB9CisKKyAgLyogbGV0J3MgcmVzZXQgdGhlIGJhc2UgdGltZXN0YW1wIHdoZW4gdGhlIGFkYXB0ZXIgaXMgZW1wdHkgKi8KKyAgaWYgKGF2YWlsYWJsZSA9PSAwKQorICAgIHJ0cGc3MjlwYXktPm5leHRfdHMgPSB0aW1lc3RhbXA7CisKKyAgaWYgKGF2YWlsYWJsZSA9PSAwICYmIHNpemUgPj0gbWluX3BheWxvYWRfbGVuICYmIHNpemUgPD0gbWF4X3BheWxvYWRfbGVuKSB7CisgICAgcmV0ID0gZ3N0X3J0cF9nNzI5X3BheV9wdXNoIChydHBnNzI5cGF5LCBidWYpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICBnc3RfYWRhcHRlcl9wdXNoIChhZGFwdGVyLCBidWYpOworICBhdmFpbGFibGUgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGFkYXB0ZXIpOworCisgIC8qIGFzIGxvbmcgYXMgd2UgaGF2ZSBmdWxsIGZyYW1lcyAqLworICAvKiB0aGlzIGxvb3Agd2lsbCBwdXNoIGFsbCBhdmFpbGFibGUgYnVmZmVycyB0aWxsIHRoZSBsYXN0IGZyYW1lICovCisgIHdoaWxlIChhdmFpbGFibGUgPj0gbWluX3BheWxvYWRfbGVuIHx8CisgICAgICBhdmFpbGFibGUgJSBHNzI5X0ZSQU1FX1NJWkUgPT0gRzcyOUJfQ05fRlJBTUVfU0laRSkgeworICAgIC8qIFdlIHNlbmQgYXMgbXVjaCBhcyB3ZSBjYW4gKi8KKyAgICBpZiAoYXZhaWxhYmxlIDw9IG1heF9wYXlsb2FkX2xlbikgeworICAgICAgcGF5bG9hZF9sZW4gPSBhdmFpbGFibGU7CisgICAgfSBlbHNlIHsKKyAgICAgIHBheWxvYWRfbGVuID0gTUlOIChtYXhfcGF5bG9hZF9sZW4sCisgICAgICAgICAgKGF2YWlsYWJsZSAvIEc3MjlfRlJBTUVfU0laRSkgKiBHNzI5X0ZSQU1FX1NJWkUpOworICAgIH0KKworICAgIHJldCA9IGdzdF9ydHBfZzcyOV9wYXlfcHVzaCAocnRwZzcyOXBheSwKKyAgICAgICAgZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXJfZmFzdCAoYWRhcHRlciwgcGF5bG9hZF9sZW4pKTsKKyAgICBhdmFpbGFibGUgLT0gcGF5bG9hZF9sZW47CisgIH0KKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworaW52YWxpZF9zaXplOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBheWxvYWQsIFNUUkVBTSwgV1JPTkdfVFlQRSwKKyAgICAgICAgKCJJbnZhbGlkIGlucHV0IGJ1ZmZlciBzaXplIiksCisgICAgICAgICgiSW52YWxpZCBidWZmZXIgc2l6ZSwgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YiCisgICAgICAgICAgICAiIEc3MjlfRlJBTUVfU0laRSgxMCkgd2l0aCBhbiBvcHRpb25hbCBHNzI5Ql9DTl9GUkFNRV9TSVpFKDIpIgorICAgICAgICAgICAgIiBhZGRlZCB0byBpdCwgYnV0IGl0IGlzICUiIEdfR1NJWkVfRk9STUFULCBzaXplKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2c3MjlfcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUzsKKworICAvKiBoYW5kbGUgdXB3YXJkcyBzdGF0ZSBjaGFuZ2VzIGhlcmUgKi8KKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgLyogaGFuZGxlIGRvd253YXJkcyBzdGF0ZSBjaGFuZ2VzICovCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3RfcnRwX2c3MjlfcGF5X3Jlc2V0IChHU1RfUlRQX0c3MjlfUEFZIChlbGVtZW50KSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9nNzI5X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGc3MjlwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfRzcyOV9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmggYi9nc3QvcnRwL2dzdHJ0cGc3MjlwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjkyNDYwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmgKQEAgLTAsMCArMSw2NiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gQ29sbGFib3JhIEx0ZAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0c3MjlfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfRzcyOV9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlYXVkaW9wYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfRzcyOV9QQVkgXAorICAoZ3N0X3J0cF9nNzI5X3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0c3MjlfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjlfUEFZLEdzdFJUUEc3MjlQYXkpKQorI2RlZmluZSBHU1RfUlRQX0c3MjlfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HNzI5X1BBWSxHc3RSVFBHNzI5UGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0c3MjlfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjlfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9HNzI5X1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfRzcyOV9QQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQRzcyOVBheSBHc3RSVFBHNzI5UGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUEc3MjlQYXlDbGFzcyBHc3RSVFBHNzI5UGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UlRQRzcyOVBheQoreworICBHc3RSVFBCYXNlUGF5bG9hZCBwYXlsb2FkOworCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisgIEdzdENsb2NrVGltZSBuZXh0X3RzOworICBndWludDMyIG5leHRfcnRwX3RpbWU7CisgIEdzdENsb2NrVGltZSBmaXJzdF90czsKKyAgZ3VpbnQzMiBmaXJzdF9ydHBfdGltZTsKKyAgZ2Jvb2xlYW4gZGlzY29udDsKK307CisKK3N0cnVjdCBfR3N0UlRQRzcyOVBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9nNzI5X3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfZzcyOV9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfRzcyOV9QQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3YzYxOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuYwpAQCAtMCwwICsxLDE1MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gWmVlc2hhbiBBbGkgPHplZW5peEBnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgImdzdHJ0cGdzbWRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwZ3NtZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cGdzbWRlcGF5X2RlYnVnKQorCisvKiBSVFBHU01EZXBheSBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2dzbV9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtZ3NtLCAiICJyYXRlID0gKGludCkgODAwMCwgIiAiY2hhbm5lbHMgPSAxIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9nc21fZGVwYXlfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiR1NNXCI7IgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfR1NNX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMCIpCisgICAgKTsKKworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9nc21fZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIF9kZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2dzbV9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogX2RlcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CisKKyNkZWZpbmUgZ3N0X3J0cF9nc21fZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UlRQR1NNRGVwYXksIGdzdF9ydHBfZ3NtX2RlcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nc21fZGVwYXlfY2xhc3NfaW5pdCAoR3N0UlRQR1NNRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZV9kZXBheWxvYWRfY2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VfZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2dzbV9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2dzbV9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBHU00gZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIEdTTSBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIiwgIlplZXNoYW4gQWxpIDx6ZWVuaXhAZ21haWwuY29tPiIpOworCisgIGdzdHJ0cGJhc2VfZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX2dzbV9kZXBheV9wcm9jZXNzOworICBnc3RydHBiYXNlX2RlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2dzbV9kZXBheV9zZXRjYXBzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBnc21kZXBheV9kZWJ1ZywgInJ0cGdzbWRlcGF5IiwgMCwKKyAgICAgICJHU00gQXVkaW8gUlRQIERlcGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2dzbV9kZXBheV9pbml0IChHc3RSVFBHU01EZXBheSAqIHJ0cGdzbWRlcGF5KQoreworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfZ3NtX2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RDYXBzICpzcmNjYXBzOworICBnYm9vbGVhbiByZXQ7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBnaW50IGNsb2NrX3JhdGU7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgY2xvY2tfcmF0ZSA9IDgwMDA7ICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgZGVwYXlsb2FkLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtZ3NtIiwKKyAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDEsICJyYXRlIiwgR19UWVBFX0lOVCwgY2xvY2tfcmF0ZSwgTlVMTCk7CisgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9nc21fZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RCdWZmZXIgKm91dGJ1ZiA9IE5VTEw7CisgIGdib29sZWFuIG1hcmtlcjsKKworICBtYXJrZXIgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApOworCisgIEdTVF9ERUJVRyAoInByb2Nlc3MgOiBnb3QgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcywgbWFyayAlZCB0cyAldSBzZXFuICVkIiwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKHJ0cC0+YnVmZmVyKSwgbWFya2VyLAorICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X3RpbWVzdGFtcCAocnRwKSwgZ3N0X3J0cF9idWZmZXJfZ2V0X3NlcSAocnRwKSk7CisKKyAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfYnVmZmVyIChydHApOworCisgIGlmIChtYXJrZXIgJiYgb3V0YnVmKSB7CisgICAgLyogbWFyayBzdGFydCBvZiB0YWxrc3B1cnQgd2l0aCBSRVNZTkMgKi8KKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19SRVNZTkMpOworICB9CisKKyAgaWYgKG91dGJ1ZikgeworICAgIGdzdF9ydHBfZHJvcF9ub25fYXVkaW9fbWV0YSAoZGVwYXlsb2FkLCBvdXRidWYpOworICB9CisKKyAgcmV0dXJuIG91dGJ1ZjsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfZ3NtX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwZ3NtZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfR1NNX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDI4YWEwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnc21kZXBheS5oCkBAIC0wLDAgKzEsNTggQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9HU01fREVQQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9HU01fREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUEdTTURlcGF5IEdzdFJUUEdTTURlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUEdTTURlcGF5Q2xhc3MgR3N0UlRQR1NNRGVwYXlDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfR1NNX0RFUEFZIFwKKyAgKGdzdF9ydHBfZ3NtX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfR1NNX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0dTTV9ERVBBWSxHc3RSVFBHU01EZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfR1NNX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HU01fREVQQVksR3N0UlRQR1NNRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfR1NNX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0dTTV9ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfR1NNX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HU01fREVQQVkpKQorCitzdHJ1Y3QgX0dzdFJUUEdTTURlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgX2RlcGF5bG9hZDsKK307CisKK3N0cnVjdCBfR3N0UlRQR1NNRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9nc21fZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2dzbV9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9HU01fREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGdzbXBheS5jIGIvZ3N0L3J0cC9nc3RydHBnc21wYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTIzOWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnc21wYXkuYwpAQCAtMCwwICsxLDE4MSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gWmVlc2hhbiBBbGkgPHplZW5peEBnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSAiZ3N0cnRwZ3NtcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwZ3NtcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBnc21wYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2dzbV9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LWdzbSwgIiAicmF0ZSA9IChpbnQpIDgwMDAsICIgImNoYW5uZWxzID0gKGludCkgMSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfZ3NtX3BheV9zcmNfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9HU01fU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA4MDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJHU01cIjsgIgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkdTTVwiIikKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9nc21fcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX2dzbV9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKKyNkZWZpbmUgZ3N0X3J0cF9nc21fcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJUUEdTTVBheSwgZ3N0X3J0cF9nc21fcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9QQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZ3NtX3BheV9jbGFzc19pbml0IChHc3RSVFBHU01QYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBnc21wYXlfZGVidWcsICJydHBnc21wYXkiLCAwLAorICAgICAgIkdTTSBBdWRpbyBSVFAgUGF5bG9hZGVyIik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9nc21fcGF5X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2dzbV9wYXlfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUlRQIEdTTSBwYXlsb2FkZXIiLAorICAgICAgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZC1lbmNvZGVzIEdTTSBhdWRpbyBpbnRvIGEgUlRQIHBhY2tldCIsCisgICAgICAiWmVlc2hhbiBBbGkgPHplZW5peEBnbWFpbC5jb20+Iik7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9nc21fcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9nc21fcGF5X2hhbmRsZV9idWZmZXI7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2dzbV9wYXlfaW5pdCAoR3N0UlRQR1NNUGF5ICogcnRwZ3NtcGF5KQoreworICBHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwZ3NtcGF5KS0+Y2xvY2tfcmF0ZSA9IDgwMDA7CisgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX1BUIChydHBnc21wYXkpID0gR1NUX1JUUF9QQVlMT0FEX0dTTTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2dzbV9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgY29uc3QgY2hhciAqc3RuYW1lOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIHN0bmFtZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHN0cnVjdHVyZSk7CisKKyAgaWYgKHN0cmNtcCAoImF1ZGlvL3gtZ3NtIiwgc3RuYW1lKSkKKyAgICBnb3RvIGludmFsaWRfdHlwZTsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAocGF5bG9hZCwgImF1ZGlvIiwKKyAgICAgIHBheWxvYWQtPnB0ICE9IEdTVF9SVFBfUEFZTE9BRF9HU00sICJHU00iLCA4MDAwKTsKKyAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHBheWxvYWQsIE5VTEwpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX3R5cGU6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBheWxvYWQsICJpbnZhbGlkIG1lZGlhIHR5cGUgcmVjZWl2ZWQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfZ3NtX3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UlRQR1NNUGF5ICpydHBnc21wYXk7CisgIGd1aW50IHBheWxvYWRfbGVuOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCwgZHVyYXRpb247CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIHJ0cGdzbXBheSA9IEdTVF9SVFBfR1NNX1BBWSAoYmFzZXBheWxvYWQpOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworICBkdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcik7CisKKyAgLyogRklYTUUsIG9ubHkgb25lIEdTTSBmcmFtZSBwZXIgUlRQIHBhY2tldCBmb3Igbm93ICovCisgIHBheWxvYWRfbGVuID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKTsKKworICAvKiBGSVhNRSwganVzdCBlcnJvciBvdXQgZm9yIG5vdyAqLworICBpZiAocGF5bG9hZF9sZW4gPiBHU1RfUlRQX0JBU0VfUEFZTE9BRF9NVFUgKHJ0cGdzbXBheSkpCisgICAgZ290byB0b29fYmlnOworCisgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoMCwgMCwgMCk7CisKKyAgLyogY29weSB0aW1lc3RhbXAgYW5kIGR1cmF0aW9uICovCisgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gdGltZXN0YW1wOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gZHVyYXRpb247CisKKyAgZ3N0X3J0cF9jb3B5X2F1ZGlvX21ldGEgKHJ0cGdzbXBheSwgb3V0YnVmLCBidWZmZXIpOworCisgIC8qIGFwcGVuZCBwYXlsb2FkICovCisgIG91dGJ1ZiA9IGdzdF9idWZmZXJfYXBwZW5kIChvdXRidWYsIGJ1ZmZlcik7CisKKyAgR1NUX0RFQlVHICgiZ3N0X3J0cF9nc21fcGF5X2NoYWluOiBwdXNoaW5nIGJ1ZmZlciBvZiBzaXplICUiIEdfR1NJWkVfRk9STUFULAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAob3V0YnVmKSk7CisKKyAgcmV0ID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfcHVzaCAoYmFzZXBheWxvYWQsIG91dGJ1Zik7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK3Rvb19iaWc6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocnRwZ3NtcGF5LCBTVFJFQU0sIEVOQ09ERSwgKE5VTEwpLAorICAgICAgICAoInBheWxvYWRfbGVuICV1ID4gbXR1ICV1IiwgcGF5bG9hZF9sZW4sCisgICAgICAgICAgICBHU1RfUlRQX0JBU0VfUEFZTE9BRF9NVFUgKHJ0cGdzbXBheSkpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfZ3NtX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGdzbXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9HU01fUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwZ3NtcGF5LmggYi9nc3QvcnRwL2dzdHJ0cGdzbXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NDM3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGdzbXBheS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfUlRQX0dTTV9QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9HU01fUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQR1NNUGF5IEdzdFJUUEdTTVBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBHU01QYXlDbGFzcyBHc3RSVFBHU01QYXlDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfR1NNX1BBWSBcCisgIChnc3RfcnRwX2dzbV9wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9HU01fUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0dTTV9QQVksR3N0UlRQR1NNUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9HU01fUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HU01fUEFZLEdzdFJUUEdTTVBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9HU01fUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0dTTV9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0dTTV9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0dTTV9QQVkpKQorCitzdHJ1Y3QgX0dzdFJUUEdTTVBheQoreworICBHc3RSVFBCYXNlUGF5bG9hZCBwYXlsb2FkOworfTsKKworc3RydWN0IF9Hc3RSVFBHU01QYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfZ3NtX3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfZ3NtX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9HU01fUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMDU3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmMKQEAgLTAsMCArMSw2MjAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAxMD4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ3N0cnRwZ3N0ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBnc3RkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwZ3N0ZGVwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2dzdF9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9nc3RfZGVwYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImFwcGxpY2F0aW9uXCIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiWC1HU1RcIiIpCisgICAgKTsKKworI2RlZmluZSBnc3RfcnRwX2dzdF9kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBHU1REZXBheSwgZ3N0X3J0cF9nc3RfZGVwYXksIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfZ3N0X2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfZ3N0X2RlcGF5X2hhbmRsZV9ldmVudCAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfZ3N0X2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfZ3N0X2RlcGF5X3Jlc2V0IChHc3RSdHBHU1REZXBheSAqIHJ0cGdzdGRlcGF5LCBnYm9vbGVhbgorICAgIGZ1bGwpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfZ3N0X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9nc3RfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nc3RfZGVwYXlfY2xhc3NfaW5pdCAoR3N0UnRwR1NURGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBnc3RkZXBheV9kZWJ1ZywgInJ0cGdzdGRlcGF5IiwgMCwKKyAgICAgICJHc3RyZWFtZXIgUlRQIERlcGF5bG9hZGVyIik7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfZ3N0X2RlcGF5X2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfZ3N0X2RlcGF5X2NoYW5nZV9zdGF0ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2dzdF9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2dzdF9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIkdTdHJlYW1lciBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrIiwKKyAgICAgICJFeHRyYWN0cyBHU3RyZWFtZXIgYnVmZmVycyBmcm9tIFJUUCBwYWNrZXRzIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPmhhbmRsZV9ldmVudCA9IGdzdF9ydHBfZ3N0X2RlcGF5X2hhbmRsZV9ldmVudDsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2dzdF9kZXBheV9zZXRjYXBzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX2dzdF9kZXBheV9wcm9jZXNzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nc3RfZGVwYXlfaW5pdCAoR3N0UnRwR1NURGVwYXkgKiBydHBnc3RkZXBheSkKK3sKKyAgcnRwZ3N0ZGVwYXktPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2dzdF9kZXBheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwR1NURGVwYXkgKnJ0cGdzdGRlcGF5OworCisgIHJ0cGdzdGRlcGF5ID0gR1NUX1JUUF9HU1RfREVQQVkgKG9iamVjdCk7CisKKyAgZ3N0X3J0cF9nc3RfZGVwYXlfcmVzZXQgKHJ0cGdzdGRlcGF5LCBUUlVFKTsKKyAgZ19vYmplY3RfdW5yZWYgKHJ0cGdzdGRlcGF5LT5hZGFwdGVyKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitzdG9yZV9jYWNoZSAoR3N0UnRwR1NURGVwYXkgKiBydHBnc3RkZXBheSwgZ3VpbnQgQ1YsIEdzdENhcHMgKiBjYXBzKQoreworICBpZiAocnRwZ3N0ZGVwYXktPkNWX2NhY2hlW0NWXSkKKyAgICBnc3RfY2Fwc191bnJlZiAocnRwZ3N0ZGVwYXktPkNWX2NhY2hlW0NWXSk7CisgIHJ0cGdzdGRlcGF5LT5DVl9jYWNoZVtDVl0gPSBjYXBzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nc3RfZGVwYXlfcmVzZXQgKEdzdFJ0cEdTVERlcGF5ICogcnRwZ3N0ZGVwYXksIGdib29sZWFuIGZ1bGwpCit7CisgIGd1aW50IGk7CisKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGdzdGRlcGF5LT5hZGFwdGVyKTsKKyAgaWYgKGZ1bGwpIHsKKyAgICBydHBnc3RkZXBheS0+Y3VycmVudF9DViA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgIHN0b3JlX2NhY2hlIChydHBnc3RkZXBheSwgaSwgTlVMTCk7CisgICAgZ19mcmVlIChydHBnc3RkZXBheS0+c3RyZWFtX2lkKTsKKyAgICBydHBnc3RkZXBheS0+c3RyZWFtX2lkID0gTlVMTDsKKyAgICBpZiAocnRwZ3N0ZGVwYXktPnRhZ3MpCisgICAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHJ0cGdzdGRlcGF5LT50YWdzKTsKKyAgICBydHBnc3RkZXBheS0+dGFncyA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2dzdF9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UnRwR1NURGVwYXkgKnJ0cGdzdGRlcGF5OworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2ludCBjbG9ja19yYXRlOworICBnYm9vbGVhbiByZXM7CisgIGNvbnN0IGdjaGFyICpjYXBzZW5jOworCisgIHJ0cGdzdGRlcGF5ID0gR1NUX1JUUF9HU1RfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgY2xvY2tfcmF0ZSA9IDkwMDAwOworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIGNhcHNlbmMgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImNhcHMiKTsKKyAgaWYgKGNhcHNlbmMpIHsKKyAgICBHc3RDYXBzICpvdXRjYXBzOworICAgIGdzaXplIG91dF9sZW47CisgICAgZ2NoYXIgKmNhcHNzdHI7CisgICAgY29uc3QgZ2NoYXIgKmNhcHN2ZXI7CisgICAgZ3VpbnQgQ1Y7CisKKyAgICAvKiBkZWNvZGUgY2FwcyAqLworICAgIGNhcHNzdHIgPSAoZ2NoYXIgKikgZ19iYXNlNjRfZGVjb2RlIChjYXBzZW5jLCAmb3V0X2xlbik7CisgICAgb3V0Y2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChjYXBzc3RyKTsKKyAgICBnX2ZyZWUgKGNhcHNzdHIpOworCisgICAgLyogcGFyc2UgdmVyc2lvbiAqLworICAgIGNhcHN2ZXIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImNhcHN2ZXJzaW9uIik7CisgICAgaWYgKGNhcHN2ZXIpIHsKKyAgICAgIENWID0gYXRvaSAoY2Fwc3Zlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIG5vIHZlcnNpb24sIGFzc3VtZSAwICovCisgICAgICBDViA9IDA7CisgICAgfQorICAgIC8qIHN0b3JlIGluIGNhY2hlICovCisgICAgcnRwZ3N0ZGVwYXktPmN1cnJlbnRfQ1YgPSBDVjsKKyAgICBnc3RfY2Fwc19yZWYgKG91dGNhcHMpOworICAgIHN0b3JlX2NhY2hlIChydHBnc3RkZXBheSwgQ1YsIG91dGNhcHMpOworCisgICAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoZGVwYXlsb2FkLT5zcmNwYWQsIG91dGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChvdXRjYXBzKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5bG9hZCwgIm5vIGNhcHMgZ2l2ZW4iKTsKKyAgICBydHBnc3RkZXBheS0+Y3VycmVudF9DViA9IC0xOworICAgIHJlcyA9IFRSVUU7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3JlYWRfbGVuZ3RoIChHc3RSdHBHU1REZXBheSAqIHJ0cGdzdGRlcGF5LCBndWludDggKiBkYXRhLCBndWludCBzaXplLAorICAgIGd1aW50ICogbGVuZ3RoLCBndWludCAqIHNraXApCit7CisgIGd1aW50IGIsIGxlbiwgb2Zmc2V0OworCisgIC8qIHN0YXJ0IHJlYWRpbmcgdGhlIGxlbmd0aCwgd2UgbmVlZCB0aGlzIHRvIHNraXAgdG8gdGhlIGRhdGEgbGF0ZXIgKi8KKyAgbGVuID0gb2Zmc2V0ID0gMDsKKyAgZG8geworICAgIGlmIChvZmZzZXQgPj0gc2l6ZSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBiID0gZGF0YVtvZmZzZXQrK107CisgICAgbGVuID0gKGxlbiA8PCA3KSB8IChiICYgMHg3Zik7CisgIH0gd2hpbGUgKGIgJiAweDgwKTsKKworICAvKiBjaGVjayByZW1haW5pbmcgYnVmZmVyIHNpemUgKi8KKyAgaWYgKHNpemUgLSBvZmZzZXQgPCBsZW4pCisgICAgcmV0dXJuIEZBTFNFOworCisgICpsZW5ndGggPSBsZW47CisgICpza2lwID0gb2Zmc2V0OworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCityZWFkX2NhcHMgKEdzdFJ0cEdTVERlcGF5ICogcnRwZ3N0ZGVwYXksIEdzdEJ1ZmZlciAqIGJ1ZiwgZ3VpbnQgKiBza2lwKQoreworICBndWludCBvZmZzZXQsIGxlbmd0aDsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBnc3RkZXBheSwgImJ1ZmZlciBzaXplICUiIEdfR1NJWkVfRk9STUFULCBtYXAuc2l6ZSk7CisKKyAgaWYgKCFyZWFkX2xlbmd0aCAocnRwZ3N0ZGVwYXksIG1hcC5kYXRhLCBtYXAuc2l6ZSwgJmxlbmd0aCwgJm9mZnNldCkpCisgICAgZ290byB0b29fc21hbGw7CisKKyAgaWYgKGxlbmd0aCA9PSAwIHx8IG1hcC5kYXRhW29mZnNldCArIGxlbmd0aCAtIDFdICE9ICdcMCcpCisgICAgZ290byBpbnZhbGlkX2J1ZmZlcjsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBnc3RkZXBheSwgInBhcnNpbmcgY2FwcyAlcyIsICZtYXAuZGF0YVtvZmZzZXRdKTsKKworICAvKiBwYXJzZSBhbmQgc3RvcmUgaW4gY2FjaGUgKi8KKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nICgoZ2NoYXIgKikgJiBtYXAuZGF0YVtvZmZzZXRdKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICAqc2tpcCA9IGxlbmd0aCArIG9mZnNldDsKKworICByZXR1cm4gY2FwczsKKwordG9vX3NtYWxsOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwZ3N0ZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIkJ1ZmZlciB0b28gc21hbGwuIiksIChOVUxMKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQoraW52YWxpZF9idWZmZXI6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBnc3RkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgICgiY2FwcyBzdHJpbmcgbm90IDAtdGVybWluYXRlZC4iKSwgKE5VTEwpKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyBHc3RFdmVudCAqCityZWFkX2V2ZW50IChHc3RSdHBHU1REZXBheSAqIHJ0cGdzdGRlcGF5LCBndWludCB0eXBlLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZiwgZ3VpbnQgKiBza2lwKQoreworICBndWludCBvZmZzZXQsIGxlbmd0aDsKKyAgR3N0U3RydWN0dXJlICpzOworICBHc3RFdmVudCAqZXZlbnQ7CisgIEdzdEV2ZW50VHlwZSBldHlwZTsKKyAgZ2NoYXIgKmVuZDsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBnc3RkZXBheSwgImJ1ZmZlciBzaXplICUiIEdfR1NJWkVfRk9STUFULCBtYXAuc2l6ZSk7CisKKyAgaWYgKCFyZWFkX2xlbmd0aCAocnRwZ3N0ZGVwYXksIG1hcC5kYXRhLCBtYXAuc2l6ZSwgJmxlbmd0aCwgJm9mZnNldCkpCisgICAgZ290byB0b29fc21hbGw7CisKKyAgaWYgKGxlbmd0aCA9PSAwKQorICAgIGdvdG8gaW52YWxpZF9idWZmZXI7CisgIC8qIGJhY2t3YXJkIGNvbXBhdCwgb2xkIHBheWxvYWRlciBkaWQgbm90IHB1dCAwLWJ5dGUgYXQgdGhlIGVuZCAqLworICBpZiAobWFwLmRhdGFbb2Zmc2V0ICsgbGVuZ3RoIC0gMV0gIT0gJ1wwJworICAgICAgJiYgbWFwLmRhdGFbb2Zmc2V0ICsgbGVuZ3RoIC0gMV0gIT0gJzsnKQorICAgIGdvdG8gaW52YWxpZF9idWZmZXI7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwZ3N0ZGVwYXksICJwYXJzaW5nIGV2ZW50ICVzIiwgJm1hcC5kYXRhW29mZnNldF0pOworCisgIC8qIHBhcnNlICovCisgIHMgPSBnc3Rfc3RydWN0dXJlX2Zyb21fc3RyaW5nICgoZ2NoYXIgKikgJiBtYXAuZGF0YVtvZmZzZXRdLCAmZW5kKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICBpZiAocyA9PSBOVUxMKQorICAgIGdvdG8gcGFyc2VfZmFpbGVkOworCisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgMToKKyAgICAgIGV0eXBlID0gR1NUX0VWRU5UX1RBRzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGV0eXBlID0gR1NUX0VWRU5UX0NVU1RPTV9ET1dOU1RSRUFNOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgZXR5cGUgPSBHU1RfRVZFTlRfQ1VTVE9NX0JPVEg7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBldHlwZSA9IEdTVF9FVkVOVF9TVFJFQU1fU1RBUlQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ290byB1bmtub3duX2V2ZW50OworICB9CisgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19jdXN0b20gKGV0eXBlLCBzKTsKKworICAqc2tpcCA9IGxlbmd0aCArIG9mZnNldDsKKworICByZXR1cm4gZXZlbnQ7CisKK3Rvb19zbWFsbDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cGdzdGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJCdWZmZXIgdG9vIHNtYWxsLiIpLCAoTlVMTCkpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2ludmFsaWRfYnVmZmVyOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwZ3N0ZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoImV2ZW50IHN0cmluZyBub3QgMC10ZXJtaW5hdGVkLiIpLCAoTlVMTCkpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK3BhcnNlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwZ3N0ZGVwYXksICJjb3VsZCBub3QgcGFyc2UgZXZlbnQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQordW5rbm93bl9ldmVudDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGdzdGRlcGF5LCAidW5rbm93biBldmVudCB0eXBlIik7CisgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChzKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorc3RvcmVfZXZlbnQgKEdzdFJ0cEdTVERlcGF5ICogcnRwZ3N0ZGVwYXksIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIGRvX3B1c2ggPSBGQUxTRTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9UQUc6CisgICAgeworICAgICAgR3N0VGFnTGlzdCAqb2xkLCAqdGFnczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3RhZyAoZXZlbnQsICZ0YWdzKTsKKworICAgICAgb2xkID0gcnRwZ3N0ZGVwYXktPnRhZ3M7CisgICAgICBpZiAoIW9sZCB8fCAhZ3N0X3RhZ19saXN0X2lzX2VxdWFsIChvbGQsIHRhZ3MpKSB7CisgICAgICAgIGRvX3B1c2ggPSBUUlVFOworICAgICAgICBpZiAob2xkKQorICAgICAgICAgIGdzdF90YWdfbGlzdF91bnJlZiAob2xkKTsKKyAgICAgICAgcnRwZ3N0ZGVwYXktPnRhZ3MgPSBnc3RfdGFnX2xpc3RfcmVmICh0YWdzKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9DVVNUT01fRE9XTlNUUkVBTToKKyAgICBjYXNlIEdTVF9FVkVOVF9DVVNUT01fQk9USDoKKyAgICAgIC8qIGFsd2F5cyBwdXNoIGN1c3RvbSBldmVudHMgKi8KKyAgICAgIGRvX3B1c2ggPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfU1RSRUFNX1NUQVJUOgorICAgIHsKKyAgICAgIGdjaGFyICpvbGQ7CisgICAgICBjb25zdCBnY2hhciAqc3RyZWFtX2lkID0gTlVMTDsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3N0cmVhbV9zdGFydCAoZXZlbnQsICZzdHJlYW1faWQpOworCisgICAgICBvbGQgPSBydHBnc3RkZXBheS0+c3RyZWFtX2lkOworICAgICAgaWYgKCFvbGQgfHwgZ19zdHJjbXAwIChvbGQsIHN0cmVhbV9pZCkpIHsKKyAgICAgICAgZG9fcHVzaCA9IFRSVUU7CisgICAgICAgIGdfZnJlZSAob2xkKTsKKyAgICAgICAgcnRwZ3N0ZGVwYXktPnN0cmVhbV9pZCA9IGdfc3RyZHVwIChzdHJlYW1faWQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAvKiB1bmtub3duIGV2ZW50LCBkb24ndCBwdXNoICovCisgICAgICBicmVhazsKKyAgfQorICBpZiAoZG9fcHVzaCkKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQUQgKHJ0cGdzdGRlcGF5KS0+c3JjcGFkLCBldmVudCk7CisgIGVsc2UKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX2dzdF9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cEdTVERlcGF5ICpydHBnc3RkZXBheTsKKyAgR3N0QnVmZmVyICpzdWJidWYsICpvdXRidWYgPSBOVUxMOworICBnaW50IHBheWxvYWRfbGVuOworICBndWludDggKnBheWxvYWQ7CisgIGd1aW50IENWLCBmcmFnX29mZnNldCwgYXZhaWwsIG9mZnNldDsKKworICBydHBnc3RkZXBheSA9IEdTVF9SVFBfR1NUX0RFUEFZIChkZXBheWxvYWQpOworCisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworCisgIGlmIChwYXlsb2FkX2xlbiA8PSA4KQorICAgIGdvdG8gZW1wdHlfcGFja2V0OworCisgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKHJ0cC0+YnVmZmVyKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwZ3N0ZGVwYXksICJESVNDT05ULCBjbGVhciBhZGFwdGVyIik7CisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGdzdGRlcGF5LT5hZGFwdGVyKTsKKyAgfQorCisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAocnRwKTsKKworICAvKiBzdHJpcCBvZmYgaGVhZGVyCisgICAqCisgICAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfEN8IENWICB8RHwwfDB8MHwgICAgIEVUWVBFICAgICB8ICBNQlogICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ19vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICovCisgIGZyYWdfb2Zmc2V0ID0KKyAgICAgIChwYXlsb2FkWzRdIDw8IDI0KSB8IChwYXlsb2FkWzVdIDw8IDE2KSB8IChwYXlsb2FkWzZdIDw8IDgpIHwgcGF5bG9hZFs3XTsKKworICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwZ3N0ZGVwYXktPmFkYXB0ZXIpOworICBpZiAoYXZhaWwgIT0gZnJhZ19vZmZzZXQpCisgICAgZ290byB3cm9uZ19mcmFnOworCisgIC8qIHN1YmJ1ZmZlciBza2lwcGluZyB0aGUgOCBoZWFkZXIgYnl0ZXMgKi8KKyAgc3ViYnVmID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfc3ViYnVmZmVyIChydHAsIDgsIC0xKTsKKyAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRwZ3N0ZGVwYXktPmFkYXB0ZXIsIHN1YmJ1Zik7CisKKyAgb2Zmc2V0ID0gMDsKKyAgaWYgKGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCkpIHsKKyAgICBndWludCBhdmFpbDsKKyAgICBHc3RDYXBzICpvdXRjYXBzOworCisgICAgLyogdGFrZSB0aGUgYnVmZmVyICovCisgICAgYXZhaWwgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHJ0cGdzdGRlcGF5LT5hZGFwdGVyKTsKKyAgICBvdXRidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRwZ3N0ZGVwYXktPmFkYXB0ZXIsIGF2YWlsKTsKKworICAgIENWID0gKHBheWxvYWRbMF0gPj4gNCkgJiAweDc7CisKKyAgICBpZiAocGF5bG9hZFswXSAmIDB4ODApIHsKKyAgICAgIGd1aW50IHNpemU7CisKKyAgICAgIC8qIEMgYml0LCB3ZSBoYXZlIGlubGluZSBjYXBzICovCisgICAgICBvdXRjYXBzID0gcmVhZF9jYXBzIChydHBnc3RkZXBheSwgb3V0YnVmLCAmc2l6ZSk7CisgICAgICBpZiAob3V0Y2FwcyA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vX2NhcHM7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGdzdGRlcGF5LAorICAgICAgICAgICJpbmxpbmUgY2FwcyAldSwgbGVuZ3RoICV1LCAlIiBHU1RfUFRSX0ZPUk1BVCwgQ1YsIHNpemUsIG91dGNhcHMpOworCisgICAgICBzdG9yZV9jYWNoZSAocnRwZ3N0ZGVwYXksIENWLCBvdXRjYXBzKTsKKworICAgICAgLyogc2tpcCBjYXBzICovCisgICAgICBvZmZzZXQgKz0gc2l6ZTsKKyAgICAgIGF2YWlsIC09IHNpemU7CisgICAgfQorICAgIGlmIChwYXlsb2FkWzFdKSB7CisgICAgICBndWludCBzaXplOworICAgICAgR3N0RXZlbnQgKmV2ZW50OworCisgICAgICAvKiB3ZSBoYXZlIGFuIGV2ZW50ICovCisgICAgICBldmVudCA9IHJlYWRfZXZlbnQgKHJ0cGdzdGRlcGF5LCBwYXlsb2FkWzFdLCBvdXRidWYsICZzaXplKTsKKyAgICAgIGlmIChldmVudCA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vX2V2ZW50OworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBnc3RkZXBheSwKKyAgICAgICAgICAiaW5saW5lIGV2ZW50LCBsZW5ndGggJXUsICUiIEdTVF9QVFJfRk9STUFULCBzaXplLCBldmVudCk7CisKKyAgICAgIHN0b3JlX2V2ZW50IChydHBnc3RkZXBheSwgZXZlbnQpOworCisgICAgICAvKiBubyBidWZmZXIgYWZ0ZXIgZXZlbnQgKi8KKyAgICAgIGF2YWlsID0gMDsKKyAgICB9CisKKyAgICBpZiAoYXZhaWwpIHsKKyAgICAgIGlmIChvZmZzZXQgIT0gMCkgeworICAgICAgICBHc3RCdWZmZXIgKnRlbXA7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwZ3N0ZGVwYXksICJzdWIgYnVmZmVyOiBvZmZzZXQgJXUsIHNpemUgJXUiLCBvZmZzZXQsCisgICAgICAgICAgICBhdmFpbCk7CisKKyAgICAgICAgdGVtcCA9CisgICAgICAgICAgICBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChvdXRidWYsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIG9mZnNldCwgYXZhaWwpOworCisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1Zik7CisgICAgICAgIG91dGJ1ZiA9IHRlbXA7CisgICAgICB9CisKKyAgICAgIC8qIHNlZSB3aGF0IGNhcHMgd2UgbmVlZCAqLworICAgICAgaWYgKENWICE9IHJ0cGdzdGRlcGF5LT5jdXJyZW50X0NWKSB7CisgICAgICAgIC8qIHdlIG5lZWQgdG8gc3dpdGNoIGNhcHMsIGNoZWNrIGlmIHdlIGhhdmUgdGhlIGNhcHMgKi8KKyAgICAgICAgaWYgKChvdXRjYXBzID0gcnRwZ3N0ZGVwYXktPkNWX2NhY2hlW0NWXSkgPT0gTlVMTCkKKyAgICAgICAgICBnb3RvIG1pc3NpbmdfY2FwczsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBnc3RkZXBheSwKKyAgICAgICAgICAgICJuZWVkIGNhcHMgc3dpdGNoIGZyb20gJXUgdG8gJXUsICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICAgICAgcnRwZ3N0ZGVwYXktPmN1cnJlbnRfQ1YsIENWLCBvdXRjYXBzKTsKKworICAgICAgICAvKiBhbmQgc2V0IGNhcHMgKi8KKyAgICAgICAgaWYgKGdzdF9wYWRfc2V0X2NhcHMgKGRlcGF5bG9hZC0+c3JjcGFkLCBvdXRjYXBzKSkKKyAgICAgICAgICBydHBnc3RkZXBheS0+Y3VycmVudF9DViA9IENWOworICAgICAgfQorCisgICAgICBpZiAocGF5bG9hZFswXSAmIDB4OCkKKyAgICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1Zik7CisgICAgICBvdXRidWYgPSBOVUxMOworICAgIH0KKyAgfQorCisgIGlmIChvdXRidWYpIHsKKyAgICBnc3RfcnRwX2Ryb3BfbWV0YSAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwZ3N0ZGVwYXkpLCBvdXRidWYsIDApOworICB9CisKKyAgcmV0dXJuIG91dGJ1ZjsKKworICAvKiBFUlJPUlMgKi8KK2VtcHR5X3BhY2tldDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cGdzdGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJFbXB0eSBQYXlsb2FkLiIpLCAoTlVMTCkpOworICAgIHJldHVybiBOVUxMOworICB9Cit3cm9uZ19mcmFnOgorICB7CisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGdzdGRlcGF5LT5hZGFwdGVyKTsKKyAgICBHU1RfTE9HX09CSkVDVCAocnRwZ3N0ZGVwYXksICJ3cm9uZyBmcmFnbWVudCwgc2tpcHBpbmciKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorbm9fY2FwczoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwZ3N0ZGVwYXksICJmYWlsZWQgdG8gcGFyc2UgY2FwcyIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1Zik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK25vX2V2ZW50OgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChydHBnc3RkZXBheSwgImZhaWxlZCB0byBwYXJzZSBldmVudCIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1Zik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK21pc3NpbmdfY2FwczoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cGdzdGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJNaXNzaW5nIGNhcHMgJXUuIiwgQ1YpLCAoTlVMTCkpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1Zik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2dzdF9kZXBheV9oYW5kbGVfZXZlbnQgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheSwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UnRwR1NURGVwYXkgKnJ0cGdzdGRlcGF5OworCisgIHJ0cGdzdGRlcGF5ID0gR1NUX1JUUF9HU1RfREVQQVkgKGRlcGF5KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ3N0X3J0cF9nc3RfZGVwYXlfcmVzZXQgKHJ0cGdzdGRlcGF5LCBGQUxTRSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4KKyAgICAgIEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmhhbmRsZV9ldmVudCAoZGVwYXksIGV2ZW50KTsKK30KKworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfZ3N0X2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cEdTVERlcGF5ICpydHBnc3RkZXBheTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHJ0cGdzdGRlcGF5ID0gR1NUX1JUUF9HU1RfREVQQVkgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfcnRwX2dzdF9kZXBheV9yZXNldCAocnRwZ3N0ZGVwYXksIFRSVUUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9ydHBfZ3N0X2RlcGF5X3Jlc2V0IChydHBnc3RkZXBheSwgVFJVRSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworCitnYm9vbGVhbgorZ3N0X3J0cF9nc3RfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBnc3RkZXBheSIsCisgICAgICBHU1RfUkFOS19NQVJHSU5BTCwgR1NUX1RZUEVfUlRQX0dTVF9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI4ZjJjNgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuaApAQCAtMCwwICsxLDY2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMTA+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfR1NUX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfR1NUX0RFUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9HU1RfREVQQVkgXAorICAoZ3N0X3J0cF9nc3RfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9HU1RfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfR1NUX0RFUEFZLEdzdFJ0cEdTVERlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9HU1RfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0dTVF9ERVBBWSxHc3RSdHBHU1REZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9HU1RfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfR1NUX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9HU1RfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0dTVF9ERVBBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBHU1REZXBheSBHc3RSdHBHU1REZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBHU1REZXBheUNsYXNzIEdzdFJ0cEdTVERlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwR1NURGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7CisKKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKKyAgZ3VpbnQgY3VycmVudF9DVjsKKyAgR3N0Q2FwcyAqQ1ZfY2FjaGVbOF07CisKKyAgR3N0VGFnTGlzdCAqdGFnczsKKyAgZ2NoYXIgKnN0cmVhbV9pZDsKK307CisKK3N0cnVjdCBfR3N0UnRwR1NURGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9nc3RfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2dzdF9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9HU1RfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGdzdHBheS5jIGIvZ3N0L3J0cC9nc3RydHBnc3RwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTUxMWY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnc3RwYXkuYwpAQCAtMCwwICsxLDY2MSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDEwPiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCisjaW5jbHVkZSAiZ3N0cnRwZ3N0cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3J0cF9wYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3J0cF9wYXlfZGVidWcKKworLyoKKyAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfEN8IENWICB8RHwwfDB8MHwgICAgIEVUWVBFICAgICB8ICBNQlogICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnX29mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqCisgKiBDOiBjYXBzIGlubGluZWQgZmxhZworICogICBXaGVuIEMgc2V0LCBmaXJzdCBwYXJ0IG9mIHBheWxvYWQgY29udGFpbnMgY2FwcyBkZWZpbml0aW9uLiBDYXBzIGRlZmluaXRpb24KKyAqICAgc3RhcnRzIHdpdGggdmFyaWFibGUtbGVuZ3RoIGxlbmd0aCBwcmVmaXggYW5kIHRoZW4gYSBzdHJpbmcgb2YgdGhhdCBsZW5ndGguCisgKiAgIHRoZSBsZW5ndGggaXMgZW5jb2RlZCBpbiBiaWcgZW5kaWFuIDcgYml0IGNodW5rcywgdGhlIHRvcCAxIGJpdCBvZiBhIGJ5dGUKKyAqICAgaXMgdGhlIGNvbnRpbnVhdGlvbiBtYXJrZXIgYW5kIHRoZSA3IG5leHQgYml0cyB0aGUgZGF0YS4gQSBjb250aW51YXRpb24KKyAqICAgbWFya2VyIG9mIDEgbWVhbnMgdGhhdCB0aGUgbmV4dCBieXRlIGNvbnRhaW5zIG1vcmUgZGF0YS4KKyAqCisgKiBDVjogY2FwcyB2ZXJzaW9uLCAwID0gY2FwcyBmcm9tIFNEUCwgMSAtIDcgaW5saW5lZCBjYXBzCisgKiBEOiBkZWx0YSB1bml0IGJ1ZmZlcgorICogRVRZUEU6IHR5cGUgb2YgZXZlbnQuIFBheWxvYWQgY29udGFpbnMgdGhlIGV2ZW50LCBwcmVmaXhlZCB3aXRoIGEKKyAqICAgICAgICB2YXJpYWJsZSBsZW5ndGggZmllbGQuCisgKiAgIDAgPSBOTyBldmVudAorICogICAxID0gR1NUX0VWRU5UX1RBRworICogICAyID0gR1NUX0VWRU5UX0NVU1RPTV9ET1dOU1RSRUFNCisgKiAgIDMgPSBHU1RfRVZFTlRfQ1VTVE9NX0JPVEgKKyAqICAgNCA9IEdTVF9FVkVOVF9TVFJFQU1fU1RBUlQKKyAqLworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9nc3RfcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2dzdF9wYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImFwcGxpY2F0aW9uXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIlgtR1NUXCIiKQorICAgICk7CisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0NPTkZJR19JTlRFUlZBTAorfTsKKworI2RlZmluZSBERUZBVUxUX0NPTkZJR19JTlRFUlZBTAkJICAgICAgMAorCitzdGF0aWMgdm9pZCBnc3RfcnRwX2dzdF9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9nc3RfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfZ3N0X3BheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iaik7CitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9nc3RfcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2dzdF9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfZ3N0X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2dzdF9wYXlfc2lua19ldmVudCAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCisjZGVmaW5lIGdzdF9ydHBfZ3N0X3BheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBHU1RQYXksIGdzdF9ydHBfZ3N0X3BheSwgR1NUX1RZUEVfUlRQX0JBU0VfUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2dzdF9wYXlfY2xhc3NfaW5pdCAoR3N0UnRwR1NUUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX2dzdF9wYXlfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcnRwX2dzdF9wYXlfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfZ3N0X3BheV9maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLAorICAgICAgUFJPUF9DT05GSUdfSU5URVJWQUwsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoImNvbmZpZy1pbnRlcnZhbCIsCisgICAgICAgICAgIkNhcHMvVGFncyBTZW5kIEludGVydmFsIiwKKyAgICAgICAgICAiSW50ZXJ2YWwgZm9yIHNlbmRpbmcgY2FwcyBhbmQgVEFHIGV2ZW50cyBpbiBzZWNvbmRzICgwID0gZGlzYWJsZWQpIiwKKyAgICAgICAgICAwLCAzNjAwLCBERUZBVUxUX0NPTkZJR19JTlRFUlZBTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpCisgICAgICApOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfZ3N0X3BheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9nc3RfcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZ3N0X3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBHU3RyZWFtZXIgcGF5bG9hZGVyIiwgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZCBHU3RyZWFtZXIgYnVmZmVycyBhcyBSVFAgcGFja2V0cyIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2dzdF9wYXlfc2V0Y2FwczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX2dzdF9wYXlfaGFuZGxlX2J1ZmZlcjsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNpbmtfZXZlbnQgPSBnc3RfcnRwX2dzdF9wYXlfc2lua19ldmVudDsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3J0cF9wYXlfZGVidWcsICJydHBnc3RwYXkiLCAwLAorICAgICAgInJ0cGdzdHBheSBlbGVtZW50Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2dzdF9wYXlfaW5pdCAoR3N0UnRwR1NUUGF5ICogcnRwZ3N0cGF5KQoreworICBydHBnc3RwYXktPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgIHJ0cGdzdHBheS0+cGVuZGluZ19idWZmZXJzID0gTlVMTDsKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBnc3RwYXkpLAorICAgICAgImFwcGxpY2F0aW9uIiwgVFJVRSwgIlgtR1NUIiwgOTAwMDApOworICBydHBnc3RwYXktPmxhc3RfY29uZmlnID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgcnRwZ3N0cGF5LT50YWdsaXN0ID0gTlVMTDsKKyAgcnRwZ3N0cGF5LT5jb25maWdfaW50ZXJ2YWwgPSBERUZBVUxUX0NPTkZJR19JTlRFUlZBTDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZ3N0X3BheV9yZXNldCAoR3N0UnRwR1NUUGF5ICogcnRwZ3N0cGF5LCBnYm9vbGVhbiBmdWxsKQoreworICBydHBnc3RwYXktPmxhc3RfY29uZmlnID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGdzdHBheS0+YWRhcHRlcik7CisgIHJ0cGdzdHBheS0+ZmxhZ3MgJj0gMHg3MDsKKyAgcnRwZ3N0cGF5LT5ldHlwZSA9IDA7CisgIGlmIChydHBnc3RwYXktPnBlbmRpbmdfYnVmZmVycykKKyAgICBnX2xpc3RfZnJlZV9mdWxsIChydHBnc3RwYXktPnBlbmRpbmdfYnVmZmVycywKKyAgICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnc3RfYnVmZmVyX2xpc3RfdW5yZWYpOworICBydHBnc3RwYXktPnBlbmRpbmdfYnVmZmVycyA9IE5VTEw7CisgIGlmIChmdWxsKSB7CisgICAgaWYgKHJ0cGdzdHBheS0+dGFnbGlzdCkKKyAgICAgIGdzdF90YWdfbGlzdF91bnJlZiAocnRwZ3N0cGF5LT50YWdsaXN0KTsKKyAgICBydHBnc3RwYXktPnRhZ2xpc3QgPSBOVUxMOworICAgIGdfZnJlZSAocnRwZ3N0cGF5LT5zdHJlYW1faWQpOworICAgIHJ0cGdzdHBheS0+c3RyZWFtX2lkID0gTlVMTDsKKyAgICBydHBnc3RwYXktPmN1cnJlbnRfQ1YgPSAwOworICAgIHJ0cGdzdHBheS0+bmV4dF9DViA9IDA7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZ3N0X3BheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iaikKK3sKKyAgR3N0UnRwR1NUUGF5ICpydHBnc3RwYXk7CisKKyAgcnRwZ3N0cGF5ID0gR1NUX1JUUF9HU1RfUEFZIChvYmopOworCisgIGdzdF9ydHBfZ3N0X3BheV9yZXNldCAocnRwZ3N0cGF5LCBUUlVFKTsKKworICBnX29iamVjdF91bnJlZiAocnRwZ3N0cGF5LT5hZGFwdGVyKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iaik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2dzdF9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cEdTVFBheSAqcnRwZ3N0cGF5OworCisgIHJ0cGdzdHBheSA9IEdTVF9SVFBfR1NUX1BBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ09ORklHX0lOVEVSVkFMOgorICAgICAgcnRwZ3N0cGF5LT5jb25maWdfaW50ZXJ2YWwgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2dzdF9wYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cEdTVFBheSAqcnRwZ3N0cGF5OworCisgIHJ0cGdzdHBheSA9IEdTVF9SVFBfR1NUX1BBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ09ORklHX0lOVEVSVkFMOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0cGdzdHBheS0+Y29uZmlnX2ludGVydmFsKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2dzdF9wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0UnRwR1NUUGF5ICpydHBnc3RwYXk7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBydHBnc3RwYXkgPSBHU1RfUlRQX0dTVF9QQVkgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfcnRwX2dzdF9wYXlfcmVzZXQgKHJ0cGdzdHBheSwgVFJVRSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3J0cF9nc3RfcGF5X3Jlc2V0IChydHBnc3RwYXksIFRSVUUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgUlRQX0hFQURFUl9MRU4gMTIKKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2dzdF9wYXlfY3JlYXRlX2Zyb21fYWRhcHRlciAoR3N0UnRwR1NUUGF5ICogcnRwZ3N0cGF5LAorICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXApCit7CisgIGd1aW50IGF2YWlsLCBtdHU7CisgIGd1aW50IGZyYWdfb2Zmc2V0OworICBHc3RCdWZmZXJMaXN0ICpsaXN0OworCisgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBnc3RwYXktPmFkYXB0ZXIpOworICBpZiAoYXZhaWwgPT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbXR1ID0gR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVIChydHBnc3RwYXkpOworCisgIGxpc3QgPSBnc3RfYnVmZmVyX2xpc3RfbmV3X3NpemVkICgoYXZhaWwgLyAobXR1IC0gKFJUUF9IRUFERVJfTEVOICsgOCkpKSArIDEpOworICBmcmFnX29mZnNldCA9IDA7CisKKyAgd2hpbGUgKGF2YWlsKSB7CisgICAgZ3VpbnQgdG93cml0ZTsKKyAgICBndWludDggKnBheWxvYWQ7CisgICAgZ3VpbnQgcGF5bG9hZF9sZW47CisgICAgZ3VpbnQgcGFja2V0X2xlbjsKKyAgICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisgICAgR3N0QnVmZmVyICpwYXlidWY7CisKKworICAgIC8qIHRoaXMgd2lsbCBiZSB0aGUgdG90YWwgbGVuZ2h0IG9mIHRoZSBwYWNrZXQgKi8KKyAgICBwYWNrZXRfbGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYWNrZXRfbGVuICg4ICsgYXZhaWwsIDAsIDApOworCisgICAgLyogZmlsbCBvbmUgTVRVIG9yIGFsbCBhdmFpbGFibGUgYnl0ZXMgKi8KKyAgICB0b3dyaXRlID0gTUlOIChwYWNrZXRfbGVuLCBtdHUpOworCisgICAgLyogdGhpcyBpcyB0aGUgcGF5bG9hZCBsZW5ndGggKi8KKyAgICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2NhbGNfcGF5bG9hZF9sZW4gKHRvd3JpdGUsIDAsIDApOworCisgICAgLyogY3JlYXRlIGJ1ZmZlciB0byBob2xkIHRoZSBoZWFkZXIgKi8KKyAgICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKDgsIDAsIDApOworCisgICAgZ3N0X3J0cF9idWZmZXJfbWFwIChvdXRidWYsIEdTVF9NQVBfV1JJVEUsICZydHApOworICAgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBnc3RwYXksICJuZXcgcGFja2V0IGxlbiAldSwgZnJhZyAldSIsIHBhY2tldF9sZW4sCisgICAgICAgIGZyYWdfb2Zmc2V0KTsKKworICAgIC8qCisgICAgICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgKiB8Q3wgQ1YgIHxEfDB8MHwwfCAgICAgRVRZUEUgICAgIHwgIE1CWiAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ19vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAqLworICAgIHBheWxvYWRbMF0gPSBydHBnc3RwYXktPmZsYWdzOworICAgIHBheWxvYWRbMV0gPSBydHBnc3RwYXktPmV0eXBlOworICAgIHBheWxvYWRbMl0gPSBwYXlsb2FkWzNdID0gMDsKKyAgICBwYXlsb2FkWzRdID0gZnJhZ19vZmZzZXQgPj4gMjQ7CisgICAgcGF5bG9hZFs1XSA9IGZyYWdfb2Zmc2V0ID4+IDE2OworICAgIHBheWxvYWRbNl0gPSBmcmFnX29mZnNldCA+PiA4OworICAgIHBheWxvYWRbN10gPSBmcmFnX29mZnNldCAmIDB4ZmY7CisKKyAgICBwYXlsb2FkICs9IDg7CisgICAgcGF5bG9hZF9sZW4gLT0gODsKKworICAgIGZyYWdfb2Zmc2V0ICs9IHBheWxvYWRfbGVuOworICAgIGF2YWlsIC09IHBheWxvYWRfbGVuOworCisgICAgaWYgKGF2YWlsID09IDApCisgICAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBUUlVFKTsKKworICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICAgIC8qIGNyZWF0ZSBhIG5ldyBidWYgdG8gaG9sZCB0aGUgcGF5bG9hZCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGdzdHBheSwgInRha2UgJXUgYnl0ZXMgZnJvbSBhZGFwdGVyIiwgcGF5bG9hZF9sZW4pOworICAgIHBheWJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyX2Zhc3QgKHJ0cGdzdHBheS0+YWRhcHRlciwgcGF5bG9hZF9sZW4pOworCisgICAgLyogY3JlYXRlIGEgbmV3IGdyb3VwIHRvIGhvbGQgdGhlIHJ0cCBoZWFkZXIgYW5kIHRoZSBwYXlsb2FkICovCisgICAgZ3N0X3J0cF9jb3B5X21ldGEgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cGdzdHBheSksIG91dGJ1ZiwgcGF5YnVmLCAwKTsKKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAob3V0YnVmLCBwYXlidWYpOworCisgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSB0aW1lc3RhbXA7CisKKyAgICAvKiBhbmQgYWRkIHRvIGxpc3QgKi8KKyAgICBnc3RfYnVmZmVyX2xpc3RfaW5zZXJ0IChsaXN0LCAtMSwgb3V0YnVmKTsKKyAgfQorCisgIHJ0cGdzdHBheS0+ZmxhZ3MgJj0gMHg3MDsKKyAgcnRwZ3N0cGF5LT5ldHlwZSA9IDA7CisgIHJ0cGdzdHBheS0+cGVuZGluZ19idWZmZXJzID0gZ19saXN0X2FwcGVuZCAocnRwZ3N0cGF5LT5wZW5kaW5nX2J1ZmZlcnMsIGxpc3QpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9nc3RfcGF5X2ZsdXNoIChHc3RSdHBHU1RQYXkgKiBydHBnc3RwYXksIEdzdENsb2NrVGltZSB0aW1lc3RhbXApCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdMaXN0ICppdGVyOworCisgIGdzdF9ydHBfZ3N0X3BheV9jcmVhdGVfZnJvbV9hZGFwdGVyIChydHBnc3RwYXksIHRpbWVzdGFtcCk7CisKKyAgaXRlciA9IHJ0cGdzdHBheS0+cGVuZGluZ19idWZmZXJzOworICB3aGlsZSAoaXRlcikgeworICAgIEdzdEJ1ZmZlckxpc3QgKmxpc3QgPSBpdGVyLT5kYXRhOworCisgICAgcnRwZ3N0cGF5LT5wZW5kaW5nX2J1ZmZlcnMgPSBpdGVyID0KKyAgICAgICAgZ19saXN0X2RlbGV0ZV9saW5rIChydHBnc3RwYXktPnBlbmRpbmdfYnVmZmVycywgaXRlcik7CisKKyAgICAvKiBwdXNoIHRoZSB3aG9sZSBidWZmZXIgbGlzdCBhdCBvbmNlICovCisgICAgcmV0ID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfcHVzaF9saXN0IChHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwZ3N0cGF5KSwKKyAgICAgICAgbGlzdCk7CisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCittYWtlX2RhdGFfYnVmZmVyIChHc3RSdHBHU1RQYXkgKiBydHBnc3RwYXksIGdjaGFyICogZGF0YSwgZ3VpbnQgc2l6ZSkKK3sKKyAgZ3VpbnQgcGxlbjsKKyAgZ3VpbnQ4ICpwdHI7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHc3RNYXBJbmZvIG1hcDsKKworICAvKiBjYWxjdWxhdGUgbGVuZ3RoICovCisgIHBsZW4gPSAxOworICB3aGlsZSAoc2l6ZSA+PiAoNyAqIHBsZW4pKQorICAgIHBsZW4rKzsKKworICBvdXRidWYgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgcGxlbiArIHNpemUsIE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBwdHIgPSBtYXAuZGF0YTsKKworICAvKiB3cml0ZSBsZW5ndGggKi8KKyAgd2hpbGUgKHBsZW4pIHsKKyAgICBwbGVuLS07CisgICAgKnB0cisrID0gKChwbGVuID4gMCkgPyAweDgwIDogMCkgfCAoKHNpemUgPj4gKDcgKiBwbGVuKSkgJiAweDdmKTsKKyAgfQorICAvKiBjb3B5IGRhdGEgKi8KKyAgbWVtY3B5IChwdHIsIGRhdGEsIHNpemUpOworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWYsICZtYXApOworCisgIHJldHVybiBvdXRidWY7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2dzdF9wYXlfc2VuZF9jYXBzIChHc3RSdHBHU1RQYXkgKiBydHBnc3RwYXksIGd1aW50OCBjdiwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIGdjaGFyICpjYXBzc3RyOworICBndWludCBjYXBzbGVuOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKworICBpZiAocnRwZ3N0cGF5LT5mbGFncyAmICgxIDw8IDcpKQorICAgIHJldHVybjsKKworICBjYXBzc3RyID0gZ3N0X2NhcHNfdG9fc3RyaW5nIChjYXBzKTsKKyAgY2Fwc2xlbiA9IHN0cmxlbiAoY2Fwc3N0cik7CisgIC8qIGZvciAwIGJ5dGUgKi8KKyAgY2Fwc2xlbisrOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGdzdHBheSwgInNlbmRpbmcgY2Fwcz0lcyIsIGNhcHNzdHIpOworCisgIC8qIG1ha2UgYSBkYXRhIGJ1ZmZlciBvZiBpdCAqLworICBvdXRidWYgPSBtYWtlX2RhdGFfYnVmZmVyIChydHBnc3RwYXksIGNhcHNzdHIsIGNhcHNsZW4pOworICBnX2ZyZWUgKGNhcHNzdHIpOworCisgIC8qIHN0b3JlIGluIGFkYXB0ZXIsIHdlIGRvbid0IGZsdXNoIHlldCwgYnVmZmVyIG1pZ2h0IGZvbGxvdyAqLworICBydHBnc3RwYXktPmZsYWdzID0gKDEgPDwgNykgfCAoY3YgPDwgNCk7CisgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGdzdHBheS0+YWRhcHRlciwgb3V0YnVmKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2dzdF9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UnRwR1NUUGF5ICpydHBnc3RwYXk7CisgIGdib29sZWFuIHJlczsKKyAgZ2NoYXIgKmNhcHNzdHIsICpjYXBzZW5jLCAqY2Fwc3ZlcjsKKyAgZ3VpbnQgY2Fwc2xlbjsKKworICBydHBnc3RwYXkgPSBHU1RfUlRQX0dTVF9QQVkgKHBheWxvYWQpOworCisgIGNhcHNzdHIgPSBnc3RfY2Fwc190b19zdHJpbmcgKGNhcHMpOworICBjYXBzbGVuID0gc3RybGVuIChjYXBzc3RyKTsKKworICAvKiBlbmNvZGUgd2l0aG91dCAwIGJ5dGUgKi8KKyAgY2Fwc2VuYyA9IGdfYmFzZTY0X2VuY29kZSAoKGd1Y2hhciAqKSBjYXBzc3RyLCBjYXBzbGVuKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocGF5bG9hZCwgImNhcHM9JXMsIGNhcHMoYmFzZTY0KT0lcyIsIGNhcHNzdHIsIGNhcHNlbmMpOworICBnX2ZyZWUgKGNhcHNzdHIpOworCisgIC8qIFNlbmQgdGhlIG5ldyBjYXBzICovCisgIHJ0cGdzdHBheS0+Y3VycmVudF9DViA9IHJ0cGdzdHBheS0+bmV4dF9DVjsKKyAgcnRwZ3N0cGF5LT5uZXh0X0NWID0gKHJ0cGdzdHBheS0+bmV4dF9DViArIDEpICYgMHg3OworICBnc3RfcnRwX2dzdF9wYXlfc2VuZF9jYXBzIChydHBnc3RwYXksIHJ0cGdzdHBheS0+Y3VycmVudF9DViwgY2Fwcyk7CisKKyAgLyogbWFrZSBjYXBzIGZvciBTRFAgKi8KKyAgY2Fwc3ZlciA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgcnRwZ3N0cGF5LT5jdXJyZW50X0NWKTsKKyAgcmVzID0KKyAgICAgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChwYXlsb2FkLCAiY2FwcyIsIEdfVFlQRV9TVFJJTkcsIGNhcHNlbmMsCisgICAgICAiY2Fwc3ZlcnNpb24iLCBHX1RZUEVfU1RSSU5HLCBjYXBzdmVyLCBOVUxMKTsKKyAgZ19mcmVlIChjYXBzZW5jKTsKKyAgZ19mcmVlIChjYXBzdmVyKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nc3RfcGF5X3NlbmRfZXZlbnQgKEdzdFJ0cEdTVFBheSAqIHJ0cGdzdHBheSwgZ3VpbnQgZXR5cGUsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzOworICBnY2hhciAqZXN0cjsKKyAgZ3VpbnQgZWxlbjsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisKKyAgLyogQ3JlYXRlIHRoZSBzdGFuZGFsb25lIGNhcHMgcGFja2V0IGlmIGFuIGlubGluZWQgY2FwcyB3YXMgcGVuZGluZyAqLworICBnc3RfcnRwX2dzdF9wYXlfY3JlYXRlX2Zyb21fYWRhcHRlciAocnRwZ3N0cGF5LCBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKworICBzID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUgKGV2ZW50KTsKKworICBlc3RyID0gZ3N0X3N0cnVjdHVyZV90b19zdHJpbmcgKHMpOworICBlbGVuID0gc3RybGVuIChlc3RyKTsKKyAgLyogZm9yIDAgYnl0ZSAqLworICBlbGVuKys7CisgIG91dGJ1ZiA9IG1ha2VfZGF0YV9idWZmZXIgKHJ0cGdzdHBheSwgZXN0ciwgZWxlbik7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGdzdHBheSwgInNlbmRpbmcgZXZlbnQ9JXMiLCBlc3RyKTsKKyAgZ19mcmVlIChlc3RyKTsKKworICBydHBnc3RwYXktPmV0eXBlID0gZXR5cGU7CisgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGdzdHBheS0+YWRhcHRlciwgb3V0YnVmKTsKKyAgLyogQ3JlYXRlIHRoZSBldmVudCBwYWNrZXQgbm93IHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggZGF0YS9jYXBzIHBhY2tldHMgKi8KKyAgZ3N0X3J0cF9nc3RfcGF5X2NyZWF0ZV9mcm9tX2FkYXB0ZXIgKHJ0cGdzdHBheSwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9nc3RfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmV0OworICBHc3RSdHBHU1RQYXkgKnJ0cGdzdHBheTsKKyAgZ3VpbnQgZXR5cGUgPSAwOworCisgIHJ0cGdzdHBheSA9IEdTVF9SVFBfR1NUX1BBWSAocGF5bG9hZCk7CisKKyAgcmV0ID0KKyAgICAgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChwYXlsb2FkLAorICAgICAgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ3N0X3J0cF9nc3RfcGF5X3Jlc2V0IChydHBnc3RwYXksIEZBTFNFKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX1RBRzp7CisgICAgICBHc3RUYWdMaXN0ICp0YWdzOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfdGFnIChldmVudCwgJnRhZ3MpOworCisgICAgICBpZiAoZ3N0X3RhZ19saXN0X2dldF9zY29wZSAodGFncykgPT0gR1NUX1RBR19TQ09QRV9TVFJFQU0pIHsKKyAgICAgICAgR3N0VGFnTGlzdCAqb2xkOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGdzdHBheSwgInN0b3Jpbmcgc3RyZWFtIHRhZ3MgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgICAgICB0YWdzKTsKKyAgICAgICAgaWYgKChvbGQgPSBydHBnc3RwYXktPnRhZ2xpc3QpKQorICAgICAgICAgIGdzdF90YWdfbGlzdF91bnJlZiAob2xkKTsKKyAgICAgICAgcnRwZ3N0cGF5LT50YWdsaXN0ID0gZ3N0X3RhZ19saXN0X3JlZiAodGFncyk7CisgICAgICB9CisgICAgICBldHlwZSA9IDE7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX0RPV05TVFJFQU06CisgICAgICBldHlwZSA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9DVVNUT01fQk9USDoKKyAgICAgIGV0eXBlID0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX1NUUkVBTV9TVEFSVDp7CisgICAgICBjb25zdCBnY2hhciAqc3RyZWFtX2lkID0gTlVMTDsKKworICAgICAgaWYgKHJ0cGdzdHBheS0+dGFnbGlzdCkKKyAgICAgICAgZ3N0X3RhZ19saXN0X3VucmVmIChydHBnc3RwYXktPnRhZ2xpc3QpOworICAgICAgcnRwZ3N0cGF5LT50YWdsaXN0ID0gTlVMTDsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3N0cmVhbV9zdGFydCAoZXZlbnQsICZzdHJlYW1faWQpOworICAgICAgaWYgKHN0cmVhbV9pZCkgeworICAgICAgICBnX2ZyZWUgKHJ0cGdzdHBheS0+c3RyZWFtX2lkKTsKKyAgICAgICAgcnRwZ3N0cGF5LT5zdHJlYW1faWQgPSBnX3N0cmR1cCAoc3RyZWFtX2lkKTsKKyAgICAgIH0KKyAgICAgIGV0eXBlID0gNDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGdzdHBheSwgIm5vIGV2ZW50IGZvciAlcyIsCisgICAgICAgICAgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKyAgICAgIGJyZWFrOworICB9CisgIGlmIChldHlwZSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGdzdHBheSwgIm1ha2UgZXZlbnQgdHlwZSAlZCBmb3IgJXMiLAorICAgICAgICBldHlwZSwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKyAgICBnc3RfcnRwX2dzdF9wYXlfc2VuZF9ldmVudCAocnRwZ3N0cGF5LCBldHlwZSwgZXZlbnQpOworICAgIC8qIERvIG5vdCBzZW5kIHN0cmVhbS1zdGFydCByaWdodCBhd2F5IHNpbmNlIGNhcHMvbmV3LXNlZ21lbnQgd2VyZSBub3QgeWV0CisgICAgICAgc2VudCwgc28gb3VyIGRhdGEgd291bGQgYmUgY29uc2lkZXJlZCBpbnZhbGlkICovCisgICAgaWYgKGV0eXBlICE9IDQpIHsKKyAgICAgIC8qIGZsdXNoIHRoZSBhZGFwdGVyIGltbWVkaWF0ZWx5ICovCisgICAgICBnc3RfcnRwX2dzdF9wYXlfZmx1c2ggKHJ0cGdzdHBheSwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgICAgfQorICB9CisKKyAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZ3N0X3BheV9zZW5kX2NvbmZpZyAoR3N0UnRwR1NUUGF5ICogcnRwZ3N0cGF5LCBHc3RDbG9ja1RpbWUgdGltZXN0YW1wKQoreworICBHc3RQYWQgKnBhZCA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NJTktQQUQgKHJ0cGdzdHBheSk7CisgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworICBHc3RFdmVudCAqdGFnID0gTlVMTDsKKyAgR3N0RXZlbnQgKnN0cmVhbV9zdGFydCA9IE5VTEw7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwZ3N0cGF5LCAidGltZSB0byBzZW5kIGNvbmZpZyIpOworICAvKiBTZW5kIHRhZ3MgKi8KKyAgaWYgKHJ0cGdzdHBheS0+dGFnbGlzdCAmJiAhZ3N0X3RhZ19saXN0X2lzX2VtcHR5IChydHBnc3RwYXktPnRhZ2xpc3QpKQorICAgIHRhZyA9IGdzdF9ldmVudF9uZXdfdGFnIChnc3RfdGFnX2xpc3RfcmVmIChydHBnc3RwYXktPnRhZ2xpc3QpKTsKKyAgaWYgKHRhZykgeworICAgIC8qIFNlbmQgc3RhcnQtc3RyZWFtIHRvIGNsZWFyIHRhZ3MgKi8KKyAgICBpZiAocnRwZ3N0cGF5LT5zdHJlYW1faWQpCisgICAgICBzdHJlYW1fc3RhcnQgPSBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAocnRwZ3N0cGF5LT5zdHJlYW1faWQpOworICAgIGlmIChzdHJlYW1fc3RhcnQpIHsKKyAgICAgIGdzdF9ydHBfZ3N0X3BheV9zZW5kX2V2ZW50IChydHBnc3RwYXksIDQsIHN0cmVhbV9zdGFydCk7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKHN0cmVhbV9zdGFydCk7CisgICAgfQorICAgIGdzdF9ydHBfZ3N0X3BheV9zZW5kX2V2ZW50IChydHBnc3RwYXksIDEsIHRhZyk7CisgICAgZ3N0X2V2ZW50X3VucmVmICh0YWcpOworICB9CisgIC8qIHNlbmQgY2FwcyAqLworICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChwYWQpOworICBpZiAoY2FwcykgeworICAgIGdzdF9ydHBfZ3N0X3BheV9zZW5kX2NhcHMgKHJ0cGdzdHBheSwgcnRwZ3N0cGF5LT5jdXJyZW50X0NWLCBjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIH0KKyAgcnRwZ3N0cGF5LT5sYXN0X2NvbmZpZyA9IHRpbWVzdGFtcDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfZ3N0X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdFJ0cEdTVFBheSAqcnRwZ3N0cGF5OworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworCisgIHJ0cGdzdHBheSA9IEdTVF9SVFBfR1NUX1BBWSAoYmFzZXBheWxvYWQpOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworCisgIC8qIGNoZWNrIGlmIHdlIG5lZWQgdG8gc2VuZCB0aGUgY2FwcyBhbmQgdGFnbGlzdCBub3cgKi8KKyAgaWYgKHJ0cGdzdHBheS0+Y29uZmlnX2ludGVydmFsID4gMCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGdzdHBheSwKKyAgICAgICAgInRpbWVzdGFtcCAlIiBHU1RfVElNRV9GT1JNQVQgIiwgbGFzdCBjb25maWcgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApLCBHU1RfVElNRV9BUkdTIChydHBnc3RwYXktPmxhc3RfY29uZmlnKSk7CisKKyAgICBpZiAodGltZXN0YW1wICE9IEdTVF9DTE9DS19USU1FX05PTkUgJiYKKyAgICAgICAgcnRwZ3N0cGF5LT5sYXN0X2NvbmZpZyAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgICBndWludDY0IGRpZmY7CisKKyAgICAgIC8qIGNhbGN1bGF0ZSBkaWZmIGJldHdlZW4gbGFzdCBTUFMvUFBTIGluIG1pbGxpc2Vjb25kcyAqLworICAgICAgaWYgKHRpbWVzdGFtcCA+IHJ0cGdzdHBheS0+bGFzdF9jb25maWcpCisgICAgICAgIGRpZmYgPSB0aW1lc3RhbXAgLSBydHBnc3RwYXktPmxhc3RfY29uZmlnOworICAgICAgZWxzZQorICAgICAgICBkaWZmID0gMDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwZ3N0cGF5LAorICAgICAgICAgICJpbnRlcnZhbCBzaW5jZSBsYXN0IGNvbmZpZyAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGRpZmYpKTsKKworICAgICAgLyogYmlnZ2VyIHRoYW4gaW50ZXJ2YWwsIHF1ZXVlIFNQUy9QUFMgKi8KKyAgICAgIGlmIChHU1RfVElNRV9BU19TRUNPTkRTIChkaWZmKSA+PSBydHBnc3RwYXktPmNvbmZpZ19pbnRlcnZhbCkKKyAgICAgICAgZ3N0X3J0cF9nc3RfcGF5X3NlbmRfY29uZmlnIChydHBnc3RwYXksIHRpbWVzdGFtcCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdzdF9ydHBfZ3N0X3BheV9zZW5kX2NvbmZpZyAocnRwZ3N0cGF5LCB0aW1lc3RhbXApOworICAgIH0KKyAgfQorCisgIC8qIGNhcHMgYWx3YXlzIGZyb20gU0RQIGZvciBub3cgKi8KKyAgaWYgKEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpKQorICAgIHJ0cGdzdHBheS0+ZmxhZ3MgfD0gKDEgPDwgMyk7CisKKyAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRwZ3N0cGF5LT5hZGFwdGVyLCBidWZmZXIpOworICByZXQgPSBnc3RfcnRwX2dzdF9wYXlfZmx1c2ggKHJ0cGdzdHBheSwgdGltZXN0YW1wKTsKKworICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9nc3RfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwZ3N0cGF5IiwKKyAgICAgIEdTVF9SQU5LX05PTkUsIEdTVF9UWVBFX1JUUF9HU1RfUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwZ3N0cGF5LmggYi9nc3QvcnRwL2dzdHJ0cGdzdHBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMjcyYjIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGdzdHBheS5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAxMD4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9HU1RfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfR1NUX1BBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VwYXlsb2FkLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0dTVF9QQVkgXAorICAoZ3N0X3J0cF9nc3RfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfR1NUX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9HU1RfUEFZLEdzdFJ0cEdTVFBheSkpCisjZGVmaW5lIEdTVF9SVFBfR1NUX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfR1NUX1BBWSxHc3RSdHBHU1RQYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfR1NUX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9HU1RfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9HU1RfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HU1RfUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEdTVFBheSBHc3RSdHBHU1RQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwR1NUUGF5Q2xhc3MgR3N0UnRwR1NUUGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwR1NUUGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkIHBheWxvYWQ7CisKKyAgR0xpc3QgKnBlbmRpbmdfYnVmZmVyczsgLyogR3N0QnVmZmVyTGlzdCAqLworICBHc3RBZGFwdGVyICphZGFwdGVyOworICBndWludDggZmxhZ3M7CisgIGd1aW50OCBldHlwZTsKKworICBndWludDggY3VycmVudF9DVjsgLyogQ1YgZmllbGQgb2YgaW5jb21pbmcgY2FwcyovCisgIGd1aW50OCBuZXh0X0NWOworCisgIGdjaGFyICpzdHJlYW1faWQ7CisgIEdzdFRhZ0xpc3QgKnRhZ2xpc3Q7CisgIGd1aW50IGNvbmZpZ19pbnRlcnZhbDsKKyAgR3N0Q2xvY2tUaW1lIGxhc3RfY29uZmlnOworfTsKKworc3RydWN0IF9Hc3RSdHBHU1RQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfZ3N0X3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfZ3N0X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9HU1RfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBoMjYxZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwaDI2MWRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQzNzIyOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwaDI2MWRlcGF5LmMKQEAgLTAsMCArMSwyOTQgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgPDIwMTQ+IFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cGgyNjFkZXBheQorICogQHNlZV9hbHNvOiBydHBoMjYxcGF5CisgKgorICogRXh0cmFjdCBlbmNvZGVkIEguMjYxIHZpZGVvIGZyYW1lcyBmcm9tIFJUUCBwYWNrZXRzIGFjY29yZGluZyB0byBSRkMgNDU4Ny4KKyAqIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBzZWU6IGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM0NTg3LnR4dAorICoKKyAqIFRoZSBkZXBheWxvYWRlciB0YWtlcyBhbiBSVFAgcGFja2V0IGFuZCBleHRyYWN0cyBpdHMgSC4yNjEgc3RyZWFtLiBJdAorICogYWdncmVnYXRlcyB0aGUgZXh0cmFjdGVkIHN0cmVhbSB1bnRpbCBhIGNvbXBsZXRlIGZyYW1lIGlzIHJlY2VpdmVkIGJlZm9yZQorICogaXQgcHVzaGVzIGl0IGRvd25zdHJlYW0uCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHVkcHNyYyBjYXBzPSdhcHBsaWNhdGlvbi94LXJ0cCwgcGF5bG9hZD0zMScgISBydHBoMjYxZGVwYXkgISBhdmRlY19oMjYxICEgYXV0b3ZpZGVvc2luaworICogXXwgVGhpcyBleGFtcGxlIHBpcGVsaW5lIHdpbGwgZGVwYXlsb2FkIGFuZCBkZWNvZGUgYW4gUlRQIEguMjYxIHZpZGVvIHN0cmVhbS4KKyAqIFJlZmVyIHRvIHRoZSBydHBoMjYxcGF5IGV4YW1wbGUgdG8gY3JlYXRlIHRoZSBSVFAgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlICJnc3RydHBoMjYxZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBoMjYxcGF5LmgiICAgICAgLyogR3N0UnRwSDI2MVBheUhlYWRlciAqLworI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cGgyNjFkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwaDI2MWRlcGF5X2RlYnVnKQorCitzdGF0aWMgY29uc3QgZ3VpbnQ4IE5PX0xFRlRPVkVSID0gMHhGRjsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2MV9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtaDI2MSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2MV9kZXBheV9zaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9IMjYxX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkgyNjFcIjsgIgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJIMjYxXCIiKQorICAgICk7CisKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cEgyNjFEZXBheSwgZ3N0X3J0cF9oMjYxX2RlcGF5LAorICAgIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3RfcnRwX2gyNjFfZGVwYXlfcGFyZW50X2NsYXNzCisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9oMjYxX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0UnRwSDI2MURlcGF5ICpkZXBheTsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBnaW50IHBheWxvYWRfbGVuOworICBndWludDggKnBheWxvYWQ7CisgIGNvbnN0IGd1aW50IGhlYWRlcl9sZW4gPSBHU1RfUlRQX0gyNjFfUEFZTE9BRF9IRUFERVJfTEVOOworICBnYm9vbGVhbiBtYXJrZXI7CisgIEdzdFJ0cEgyNjFQYXlIZWFkZXIgKmhlYWRlcjsKKworICBkZXBheSA9IEdTVF9SVFBfSDI2MV9ERVBBWSAoZGVwYXlsb2FkKTsKKworICBpZiAoR1NUX0JVRkZFUl9JU19ESVNDT05UIChydHAtPmJ1ZmZlcikpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheSwgIkRpc2NvbnQgYnVmZmVyLCBmbHVzaGluZyBhZGFwdGVyIik7CisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGRlcGF5LT5hZGFwdGVyKTsKKyAgICBkZXBheS0+bGVmdG92ZXIgPSBOT19MRUZUT1ZFUjsKKyAgICBkZXBheS0+c3RhcnQgPSBGQUxTRTsKKyAgfQorCisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisKKyAgbWFya2VyID0gZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAocnRwKTsKKworICBpZiAocGF5bG9hZF9sZW4gPCBoZWFkZXJfbGVuICsgMSkgeworICAgIC8qIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgYnl0ZSBwYXlsb2FkICovCisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZXBheSwgIkRyb3BwaW5nIHBhY2tldCB3aXRoIGludmFsaWQgcGF5bG9hZCBsZW5ndGgiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGhlYWRlciA9IChHc3RSdHBIMjYxUGF5SGVhZGVyICopIHBheWxvYWQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXksCisgICAgICAicGF5bG9hZF9sZW46ICVkLCBoZWFkZXJfbGVuOiAlZCwgc2JpdDogJWQsIGViaXQ6ICVkLCBtYXJrZXIgJWQiLAorICAgICAgcGF5bG9hZF9sZW4sIGhlYWRlcl9sZW4sIGhlYWRlci0+c2JpdCwgaGVhZGVyLT5lYml0LCBtYXJrZXIpOworCisgIHBheWxvYWQgKz0gaGVhZGVyX2xlbjsKKyAgcGF5bG9hZF9sZW4gLT0gaGVhZGVyX2xlbjsKKworICBpZiAoIWRlcGF5LT5zdGFydCkgeworICAgIC8qIENoZWNrIGZvciBwaWN0dXJlIHN0YXJ0IGNvZGUgKi8KKyAgICBndWludDMyIGJpdHMgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKHBheWxvYWQpIDw8IGhlYWRlci0+c2JpdDsKKyAgICBpZiAocGF5bG9hZF9sZW4gPiA0ICYmIGJpdHMgPj4gMTIgPT0gMHgxMCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXksICJGb3VuZCBwaWN0dXJlIHN0YXJ0IGNvZGUiKTsKKyAgICAgIGRlcGF5LT5zdGFydCA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5LCAiTm8gcGljdHVyZSBzdGFydCBjb2RlIHlldCwgc2tpcHBpbmcgcGF5bG9hZCIpOworICAgICAgZ290byBza2lwOworICAgIH0KKyAgfQorCisgIGlmIChoZWFkZXItPnNiaXQgIT0gMCkgeworICAgIC8qIFRha2UgdGhlIGxlZnRvdmVyIGZyb20gcHJldmlvdXMgcGFja2V0IGFuZCBtZXJnZSBpdCBhdCB0aGUgYmVnaW5uaW5nICovCisgICAgcGF5bG9hZFswXSAmPSAweEZGID4+IGhlYWRlci0+c2JpdDsKKyAgICBpZiAoZGVwYXktPmxlZnRvdmVyICE9IE5PX0xFRlRPVkVSKSB7CisgICAgICAvKiBIYXBwZW5zIGlmIHNiaXQgaXMgc2V0IGZvciBmaXJzdCBwYWNrZXQgaW4gZnJhbWUuIFRoZW4gcHJldmlvdXMgYnl0ZQorICAgICAgICogaGFzIGFscmVhZHkgYmVlbiBmbHVzaGVkLiAqLworICAgICAgcGF5bG9hZFswXSB8PSBkZXBheS0+bGVmdG92ZXI7CisgICAgfQorICAgIGRlcGF5LT5sZWZ0b3ZlciA9IE5PX0xFRlRPVkVSOworICB9CisKKyAgaWYgKGhlYWRlci0+ZWJpdCA9PSAwKSB7CisgICAgLyogSC4yNjEgc3RyZWFtIGVuZHMgb24gYnl0ZSBib3VuZGFyeSwgdGFrZSBlbnRpcmUgcGFja2V0ICovCisgICAgZ3N0X2FkYXB0ZXJfcHVzaCAoZGVwYXktPmFkYXB0ZXIsCisgICAgICAgIGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3N1YmJ1ZmZlciAocnRwLCBoZWFkZXJfbGVuLCBwYXlsb2FkX2xlbikpOworICB9IGVsc2UgeworICAgIC8qIFRha2UgdGhlIGVudGlyZSBidWZmZXIgZXhjZXB0IGZvciB0aGUgbGFzdCBieXRlLCB3aGljaCB3aWxsIGJlIGtlcHQgdG8KKyAgICAgKiBtZXJnZSB3aXRoIG5leHQgcGFja2V0ICovCisgICAgZ3N0X2FkYXB0ZXJfcHVzaCAoZGVwYXktPmFkYXB0ZXIsCisgICAgICAgIGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3N1YmJ1ZmZlciAocnRwLCBoZWFkZXJfbGVuLAorICAgICAgICAgICAgcGF5bG9hZF9sZW4gLSAxKSk7CisgICAgZGVwYXktPmxlZnRvdmVyID0gcGF5bG9hZFtwYXlsb2FkX2xlbiAtIDFdICYgKDB4RkYgPDwgaGVhZGVyLT5lYml0KTsKKyAgfQorCitza2lwOgorICBpZiAobWFya2VyKSB7CisgICAgaWYgKGRlcGF5LT5zdGFydCkgeworICAgICAgZ3VpbnQgYXZhaWw7CisKKyAgICAgIGlmIChkZXBheS0+bGVmdG92ZXIgIT0gTk9fTEVGVE9WRVIpIHsKKyAgICAgICAgR3N0QnVmZmVyICpidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEpOworICAgICAgICBnc3RfYnVmZmVyX21lbXNldCAoYnVmLCAwLCBkZXBheS0+bGVmdG92ZXIsIDEpOworICAgICAgICBnc3RfYWRhcHRlcl9wdXNoIChkZXBheS0+YWRhcHRlciwgYnVmKTsKKyAgICAgICAgZGVwYXktPmxlZnRvdmVyID0gTk9fTEVGVE9WRVI7CisgICAgICB9CisKKyAgICAgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZXBheS0+YWRhcHRlcik7CisgICAgICBvdXRidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoZGVwYXktPmFkYXB0ZXIsIGF2YWlsKTsKKyAgICAgIGdzdF9ydHBfZHJvcF9ub25fdmlkZW9fbWV0YSAoZGVwYXksIG91dGJ1Zik7CisKKyAgICAgIC8qIE5vdGUgdGhhdCB0aGUgSSBmbGFnIGRvZXMgbm90IG1lYW4gaW50cmEgZnJhbWUsIGJ1dCB0aGF0IHRoZSBlbnRpcmUKKyAgICAgICAqIHN0cmVhbSBpcyBpbnRyYSBjb2RlZC4gKi8KKyAgICAgIGlmIChoZWFkZXItPmkpCisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgICAgICBlbHNlCisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheSwgIlB1c2hpbmcgb3V0IGEgYnVmZmVyIG9mICV1IGJ5dGVzIiwgYXZhaWwpOworICAgICAgZGVwYXktPnN0YXJ0ID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIGRlcGF5LT5zdGFydCA9IFRSVUU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIG91dGJ1ZjsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2gyNjFfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGZpbHRlciwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKnNyY2NhcHM7CisKKyAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJ2aWRlby94LWgyNjEiKTsKKyAgZ3N0X3BhZF9zZXRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKGZpbHRlciksIHNyY2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9oMjYxX2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0UnRwSDI2MURlcGF5ICpkZXBheTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIGRlcGF5ID0gR1NUX1JUUF9IMjYxX0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfYWRhcHRlcl9jbGVhciAoZGVwYXktPmFkYXB0ZXIpOworICAgICAgZGVwYXktPnN0YXJ0ID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYxX2RlcGF5X2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cEgyNjFEZXBheSAqZGVwYXk7CisKKyAgZGVwYXkgPSBHU1RfUlRQX0gyNjFfREVQQVkgKG9iamVjdCk7CisKKyAgaWYgKGRlcGF5LT5hZGFwdGVyKSB7CisgICAgZ3N0X29iamVjdF91bnJlZiAoZGVwYXktPmFkYXB0ZXIpOworICAgIGRlcGF5LT5hZGFwdGVyID0gTlVMTDsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYxX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEgyNjFEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9DTEFTUyAoa2xhc3MpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfaDI2MV9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2gyNjFfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgSDI2MSBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgSDI2MSB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgNDU4NykiLAorICAgICAgIlN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPiIpOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfaDI2MV9kZXBheV9wcm9jZXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfaDI2MV9kZXBheV9zZXRjYXBzOworCisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3RfcnRwX2gyNjFfZGVwYXlfZGlzcG9zZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfcnRwX2gyNjFfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBoMjYxZGVwYXlfZGVidWcsICJydHBoMjYxZGVwYXkiLCAwLAorICAgICAgIkgyNjEgVmlkZW8gUlRQIERlcGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjFfZGVwYXlfaW5pdCAoR3N0UnRwSDI2MURlcGF5ICogZGVwYXkpCit7CisgIGRlcGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworICBkZXBheS0+bGVmdG92ZXIgPSBOT19MRUZUT1ZFUjsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2MV9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGgyNjFkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9IMjYxX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwaDI2MWRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cGgyNjFkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4N2Y4MTcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGgyNjFkZXBheS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAxND4gU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfSDI2MV9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0gyNjFfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9IMjYxX0RFUEFZIFwKKyAgKGdzdF9ydHBfaDI2MV9kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0gyNjFfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfSDI2MV9ERVBBWSxHc3RSdHBIMjYxRGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX0gyNjFfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0gyNjFfREVQQVksR3N0UnRwSDI2MURlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0gyNjFfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfSDI2MV9ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfSDI2MV9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSDI2MV9ERVBBWSkpCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSDI2MURlcGF5IEdzdFJ0cEgyNjFEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBIMjYxRGVwYXlDbGFzcyBHc3RSdHBIMjYxRGVwYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBIMjYxRGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7CisKKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKKyAgZ2Jvb2xlYW4gc3RhcnQ7CisgIGd1aW50OCBsZWZ0b3ZlcjsKK307CisKK3N0cnVjdCBfR3N0UnRwSDI2MURlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfaDI2MV9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfaDI2MV9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9SVFBfSDI2MV9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwaDI2MXBheS5jIGIvZ3N0L3J0cC9nc3RydHBoMjYxcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU5MmQxMQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwaDI2MXBheS5jCkBAIC0wLDAgKzEsMTA3MSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDE0PiBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwaDI2MXBheQorICogQHNlZV9hbHNvOiBydHBoMjYxZGVwYXkKKyAqCisgKiBQYXlsb2FkIGVuY29kZWQgSC4yNjEgdmlkZW8gZnJhbWVzIGludG8gUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQyA0NTg3LgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzQ1ODcudHh0CisgKgorICogVGhlIHBheWxvYWRlciB0YWtlcyBhIEguMjYxIGZyYW1lLCBwYXJzZXMgaXQgYW5kIHNwbGl0cyBpdCBpbnRvIGZyYWdtZW50cworICogb24gTUIgYm91bmRhcmllcyBpbiBvcmRlciB0byBtYXRjaCBjb25maWd1cmVkIE1UVSBzaXplLiBGb3IgZWFjaCBmcmFnbWVudAorICogYW4gUlRQIHBhY2tldCBpcyBjb25zdHJ1Y3RlZCB3aXRoIGFuIFJUUCBwYWNrZXQgaGVhZGVyIGZvbGxvd2VkIGJ5IHRoZQorICogZnJhZ21lbnQuIEluIGFkZGl0aW9uIHRoZSBwYXlsb2FkZXIgd2lsbCBtYWtlIHN1cmUgdGhlIHBhY2tldGl6ZWQgSC4yNjEKKyAqIHN0cmVhbSBhcHBlYXJzIGFzIGEgY29udGludW91cyBiaXQtc3RyZWFtIGFmdGVyIGRlcGFja2V0aXphdGlvbiBieSBzaGlmdGluZworICogdGhlIGVuY29kZWQgYml0LXN0cmVhbSBvZiBhIGZyYW1lIHRvIGFsaWduIHdpdGggdGhlIGxhc3Qgc2lnbmlmaWNhbnQgYml0IG9mCisgKiB0aGUgcHJldmlvdXMgZnJhbWUuIFRoaXMgaGVscHMgaW50ZXJvcGVyYWJpbGl0eSBpbiB0aGUgY2FzZSB3aGVyZSB0aGUKKyAqIGVuY29kZXIgZG9lcyBub3QgcHJvZHVjZSBhIGNvbnRpbnVvdXMgYml0LXN0cmVhbSBidXQgdGhlIGRlY29kZXIgcmVxdWlyZXMKKyAqIGl0LgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB2aWRlb3Rlc3RzcmMgISBhdmVuY19oMjYxICEgcnRwaDI2MXBheSAhIHVkcHNpbmsKKyAqIF18IFRoaXMgd2lsbCBlbmNvZGUgYSB0ZXN0IHZpZGVvIGFuZCBwYXlsb2FkIGl0LiBSZWZlciB0byB0aGUgcnRwaDI2MWRlcGF5CisgKiBleGFtcGxlIHRvIGRlcGF5bG9hZCBhbmQgcGxheSB0aGUgUlRQIHN0cmVhbS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RydHBoMjYxcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJpdHJlYWRlci5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBoMjYxcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBoMjYxcGF5X2RlYnVnKQorCisjZGVmaW5lIEdTVF9SVFBfSEVBREVSX0xFTiAxMgorI2RlZmluZSBHU1RfUlRQX0gyNjFfUEFZTE9BRF9IRUFERVJfTEVOIDQKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2MV9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LWgyNjEiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2gyNjFfcGF5X3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0gyNjFfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiSDI2MVwiOyAiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkgyNjFcIiIpCisgICAgKTsKKworR19ERUZJTkVfVFlQRSAoR3N0UnRwSDI2MVBheSwgZ3N0X3J0cF9oMjYxX3BheSwgR1NUX1RZUEVfUlRQX0JBU0VfUEFZTE9BRCk7CisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3RfcnRwX2gyNjFfcGF5X3BhcmVudF9jbGFzcworCit0eXBlZGVmIHN0cnVjdAoreworICBndWludDMyIG1iYTsKKyAgZ3VpbnQzMiBtdHlwZTsKKyAgZ3VpbnQzMiBxdWFudDsKKyAgZ2ludCBtdng7CisgIGdpbnQgbXZ5OworICBndWludCBlbmRwb3M7CisgIGdpbnQgZ29ibjsKK30gTWFjcm9ibG9jazsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgTWFjcm9ibG9jayBsYXN0OworICBndWludCBzdGFydHBvczsKKyAgZ3VpbnQgZW5kcG9zOworICBndWludDMyIGduOworICBndWludDMyIGdxdWFudDsKK30gR29iOworCisjZGVmaW5lIFBTQ19MRU4gMjAKKyNkZWZpbmUgVFJfTEVOIDUKKyNkZWZpbmUgUFRZUEVfTEVOIDYKKyNkZWZpbmUgR0JTQ19MRU4gMTYKKyNkZWZpbmUgR05fTEVOIDQKKyNkZWZpbmUgR1FVQU5UX0xFTiA1CisjZGVmaW5lIEdFSV9MRU4gMQorI2RlZmluZSBHU1BBUkVfTEVOIDgKKyNkZWZpbmUgTVFVQU5UX0xFTiA1CisjZGVmaW5lIE1BWF9OVU1fR09CIDEyCisKK3R5cGVkZWYgZW51bQoreworICBQQVJTRV9FTkRfT0ZfQlVGRkVSID0gLTIsCisgIFBBUlNFX0VSUk9SID0gLTEsCisgIFBBUlNFX09LID0gMCwKKyAgUEFSU0VfRU5EX09GX0ZSQU1FLAorICBQQVJTRV9FTkRfT0ZfR09CLAorfSBQYXJzZVJldHVybjsKKworCisjZGVmaW5lIFNLSVBfQklUUyhicixuYml0cykgR19TVE1UX1NUQVJUIHsgICAgICBcCisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9za2lwIChiciwgbmJpdHMpKSAgICAgICBcCisgICAgICByZXR1cm4gUEFSU0VfRU5EX09GX0JVRkZFUjsgICAgICAgICAgICAgICBcCisgIH0gR19TVE1UX0VORAorCisjZGVmaW5lIEdFVF9CSVRTKGJyLHZhbCxuYml0cykgR19TVE1UX1NUQVJUIHsgICAgICAgICAgICAgXAorICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDMyIChiciwgdmFsLCBuYml0cykpIFwKKyAgICAgIHJldHVybiBQQVJTRV9FTkRfT0ZfQlVGRkVSOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gR19TVE1UX0VORAorCisvKiBVbmNoZWNrZWQgc2luY2Ugd2UgcGVlayBvdXRzaWRlIHRoZSBidWZmZXIuIE9rIGJlY2F1c2Ugb2YgcGFkZGluZy4gKi8KKyNkZWZpbmUgUEVFS19CSVRTKGJyLHZhbCxuYml0cykgR19TVE1UX1NUQVJUIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqdmFsID0gZ3N0X2JpdF9yZWFkZXJfcGVla19iaXRzX3VpbnQxNl91bmNoZWNrZWQgKGJyLCBuYml0cyk7IFwKKyAgfSBHX1NUTVRfRU5ECisKKworI2RlZmluZSBNQkFfU1RVRkZJTkcgMzQKKyNkZWZpbmUgTUJBX1NUQVJUX0NPREUgMzUKKyNkZWZpbmUgTUJBX0xFTiAzNQorI2RlZmluZSBNQkFfV0lEIDQKKy8qIFtjb2RlLCBtYXNrLCBuYml0cywgbWJhXSAqLworc3RhdGljIGNvbnN0IGd1aW50MTYgbWJhX3RhYmxlW01CQV9MRU5dW01CQV9XSURdID0geworICB7MHg4MDAwLCAweDgwMDAsIDEsIDF9LAorICB7MHg2MDAwLCAweGUwMDAsIDMsIDJ9LAorICB7MHg0MDAwLCAweGUwMDAsIDMsIDN9LAorICB7MHgzMDAwLCAweGYwMDAsIDQsIDR9LAorICB7MHgyMDAwLCAweGYwMDAsIDQsIDV9LAorICB7MHgxODAwLCAweGY4MDAsIDUsIDZ9LAorICB7MHgxMDAwLCAweGY4MDAsIDUsIDd9LAorICB7MHgwZTAwLCAweGZlMDAsIDcsIDh9LAorICB7MHgwYzAwLCAweGZlMDAsIDcsIDl9LAorICB7MHgwYjAwLCAweGZmMDAsIDgsIDEwfSwKKyAgezB4MGEwMCwgMHhmZjAwLCA4LCAxMX0sCisgIHsweDA5MDAsIDB4ZmYwMCwgOCwgMTJ9LAorICB7MHgwODAwLCAweGZmMDAsIDgsIDEzfSwKKyAgezB4MDcwMCwgMHhmZjAwLCA4LCAxNH0sCisgIHsweDA2MDAsIDB4ZmYwMCwgOCwgMTV9LAorICB7MHgwNWMwLCAweGZmYzAsIDEwLCAxNn0sCisgIHsweDA1ODAsIDB4ZmZjMCwgMTAsIDE3fSwKKyAgezB4MDU0MCwgMHhmZmMwLCAxMCwgMTh9LAorICB7MHgwNTAwLCAweGZmYzAsIDEwLCAxOX0sCisgIHsweDA0YzAsIDB4ZmZjMCwgMTAsIDIwfSwKKyAgezB4MDQ4MCwgMHhmZmMwLCAxMCwgMjF9LAorICB7MHgwNDYwLCAweGZmZTAsIDExLCAyMn0sCisgIHsweDA0NDAsIDB4ZmZlMCwgMTEsIDIzfSwKKyAgezB4MDQyMCwgMHhmZmUwLCAxMSwgMjR9LAorICB7MHgwNDAwLCAweGZmZTAsIDExLCAyNX0sCisgIHsweDAzZTAsIDB4ZmZlMCwgMTEsIDI2fSwKKyAgezB4MDNjMCwgMHhmZmUwLCAxMSwgMjd9LAorICB7MHgwM2EwLCAweGZmZTAsIDExLCAyOH0sCisgIHsweDAzODAsIDB4ZmZlMCwgMTEsIDI5fSwKKyAgezB4MDM2MCwgMHhmZmUwLCAxMSwgMzB9LAorICB7MHgwMzQwLCAweGZmZTAsIDExLCAzMX0sCisgIHsweDAzMjAsIDB4ZmZlMCwgMTEsIDMyfSwKKyAgezB4MDMwMCwgMHhmZmUwLCAxMSwgMzN9LAorICB7MHgwMWUwLCAweGZmZTAsIDExLCBNQkFfU1RVRkZJTkd9LAorICB7MHgwMDAxLCAweGZmZmYsIDE2LCBNQkFfU1RBUlRfQ09ERX0sCit9OworCisjZGVmaW5lIE1UWVBFX0lOVFJBICAgICgxIDw8IDApCisjZGVmaW5lIE1UWVBFX0lOVEVSICAgICgxIDw8IDEpCisjZGVmaW5lIE1UWVBFX01DICAgICAgICgxIDw8IDIpCisjZGVmaW5lIE1UWVBFX0ZJTCAgICAgICgxIDw8IDMpCisjZGVmaW5lIE1UWVBFX01RVUFOVCAgICgxIDw8IDQpCisjZGVmaW5lIE1UWVBFX01WRCAgICAgICgxIDw8IDUpCisjZGVmaW5lIE1UWVBFX0NCUCAgICAgICgxIDw8IDYpCisjZGVmaW5lIE1UWVBFX1RDT0VGRiAgICgxIDw8IDcpCisjZGVmaW5lIE1UWVBFX0xFTiAxMAorI2RlZmluZSBNVFlQRV9XSUQgNAorLyogW2NvZGUsIG1hc2ssIG5iaXRzLCBmbGFnc10gKi8KK3N0YXRpYyBjb25zdCBndWludDE2IG10eXBlX3RhYmxlW01UWVBFX0xFTl1bTVRZUEVfV0lEXSA9IHsKKyAgezB4ODAwMCwgMHg4MDAwLCAxLCBNVFlQRV9JTlRFUiB8IE1UWVBFX0NCUCB8IE1UWVBFX1RDT0VGRn0sCisgIHsweDQwMDAsIDB4YzAwMCwgMiwKKyAgICAgIE1UWVBFX0lOVEVSIHwgTVRZUEVfTUMgfCBNVFlQRV9GSUwgfCBNVFlQRV9NVkQgfCBNVFlQRV9DQlAgfAorICAgICAgICBNVFlQRV9UQ09FRkZ9LAorICB7MHgyMDAwLCAweGUwMDAsIDMsIE1UWVBFX0lOVEVSIHwgTVRZUEVfTUMgfCBNVFlQRV9GSUwgfCBNVFlQRV9NVkR9LAorICB7MHgxMDAwLCAweGYwMDAsIDQsIE1UWVBFX0lOVFJBIHwgTVRZUEVfVENPRUZGfSwKKyAgezB4MDgwMCwgMHhmODAwLCA1LCBNVFlQRV9JTlRFUiB8IE1UWVBFX01RVUFOVCB8IE1UWVBFX0NCUCB8IE1UWVBFX1RDT0VGRn0sCisgIHsweDA0MDAsIDB4ZmMwMCwgNiwKKyAgICAgIE1UWVBFX0lOVEVSIHwgTVRZUEVfTUMgfCBNVFlQRV9GSUwgfCBNVFlQRV9NUVVBTlQgfCBNVFlQRV9NVkQgfAorICAgICAgICBNVFlQRV9DQlAgfCBNVFlQRV9UQ09FRkZ9LAorICB7MHgwMjAwLCAweGZlMDAsIDcsIE1UWVBFX0lOVFJBIHwgTVRZUEVfTVFVQU5UIHwgTVRZUEVfVENPRUZGfSwKKyAgezB4MDEwMCwgMHhmZjAwLCA4LAorICAgICAgTVRZUEVfSU5URVIgfCBNVFlQRV9NQyB8IE1UWVBFX01WRCB8IE1UWVBFX0NCUCB8IE1UWVBFX1RDT0VGRn0sCisgIHsweDAwODAsIDB4ZmY4MCwgOSwgTVRZUEVfSU5URVIgfCBNVFlQRV9NQyB8IE1UWVBFX01WRH0sCisgIHsweDAwNDAsIDB4ZmZjMCwgMTAsCisgICAgICBNVFlQRV9JTlRFUiB8IE1UWVBFX01DIHwgTVRZUEVfTVFVQU5UIHwgTVRZUEVfTVZEIHwgTVRZUEVfQ0JQIHwKKyAgICAgICAgTVRZUEVfVENPRUZGfSwKK307CisKKyNkZWZpbmUgTVZEX0xFTiAzMgorI2RlZmluZSBNVkRfV0lEIDUKKy8qIFtjb2RlLCBtYXNrLCBuYml0cywgbXZkMSwgbXZkMl0gKi8KK3N0YXRpYyBjb25zdCBndWludDE2IG12ZF90YWJsZVtNVkRfTEVOXVtNVkRfV0lEXSA9IHsKKyAgezB4ODAwMCwgMHg4MDAwLCAxLCAwLCAwfSwKKyAgezB4NjAwMCwgMHhlMDAwLCAzLCAtMSwgLTF9LAorICB7MHg0MDAwLCAweGUwMDAsIDMsIDEsIDF9LAorICB7MHgzMDAwLCAweGYwMDAsIDQsIC0yLCAzMH0sCisgIHsweDIwMDAsIDB4ZjAwMCwgNCwgMiwgLTMwfSwKKyAgezB4MTgwMCwgMHhmODAwLCA1LCAtMywgMjl9LAorICB7MHgxMDAwLCAweGY4MDAsIDUsIDMsIC0yOX0sCisgIHsweDBlMDAsIDB4ZmUwMCwgNywgLTQsIDI4fSwKKyAgezB4MGMwMCwgMHhmZTAwLCA3LCA0LCAtMjh9LAorICB7MHgwNzAwLCAweGZmMDAsIDgsIC03LCAyNX0sCisgIHsweDA5MDAsIDB4ZmYwMCwgOCwgLTYsIDI2fSwKKyAgezB4MGIwMCwgMHhmZjAwLCA4LCAtNSwgMjd9LAorICB7MHgwYTAwLCAweGZmMDAsIDgsIDUsIC0yN30sCisgIHsweDA4MDAsIDB4ZmYwMCwgOCwgNiwgLTI2fSwKKyAgezB4MDYwMCwgMHhmZjAwLCA4LCA3LCAtMjV9LAorICB7MHgwNGMwLCAweGZmYzAsIDEwLCAtMTAsIDIyfSwKKyAgezB4MDU0MCwgMHhmZmMwLCAxMCwgLTksIDIzfSwKKyAgezB4MDVjMCwgMHhmZmMwLCAxMCwgLTgsIDI0fSwKKyAgezB4MDU4MCwgMHhmZmMwLCAxMCwgOCwgLTI0fSwKKyAgezB4MDUwMCwgMHhmZmMwLCAxMCwgOSwgLTIzfSwKKyAgezB4MDQ4MCwgMHhmZmMwLCAxMCwgMTAsIC0yMn0sCisgIHsweDAzMjAsIDB4ZmZlMCwgMTEsIC0xNiwgMTZ9LAorICB7MHgwMzYwLCAweGZmZTAsIDExLCAtMTUsIDE3fSwKKyAgezB4MDNhMCwgMHhmZmUwLCAxMSwgLTE0LCAxOH0sCisgIHsweDAzZTAsIDB4ZmZlMCwgMTEsIC0xMywgMTl9LAorICB7MHgwNDIwLCAweGZmZTAsIDExLCAtMTIsIDIwfSwKKyAgezB4MDQ2MCwgMHhmZmUwLCAxMSwgLTExLCAyMX0sCisgIHsweDA0NDAsIDB4ZmZlMCwgMTEsIDExLCAtMjF9LAorICB7MHgwNDAwLCAweGZmZTAsIDExLCAxMiwgLTIwfSwKKyAgezB4MDNjMCwgMHhmZmUwLCAxMSwgMTMsIC0xOX0sCisgIHsweDAzODAsIDB4ZmZlMCwgMTEsIDE0LCAtMTh9LAorICB7MHgwMzQwLCAweGZmZTAsIDExLCAxNSwgLTE3fSwKK307CisKKyNkZWZpbmUgQ0JQX0xFTiA2MworLyogW2NvZGUsIG1hc2ssIG5iaXRzLCBjYnBdICovCitzdGF0aWMgY29uc3QgZ3VpbnQxNiBjYnBfdGFibGVbQ0JQX0xFTl1bNF0gPSB7CisgIHsweGUwMDAsIDB4ZTAwMCwgMywgNjB9LAorICB7MHhkMDAwLCAweGYwMDAsIDQsIDR9LAorICB7MHhjMDAwLCAweGYwMDAsIDQsIDh9LAorICB7MHhiMDAwLCAweGYwMDAsIDQsIDE2fSwKKyAgezB4YTAwMCwgMHhmMDAwLCA0LCAzMn0sCisgIHsweDk4MDAsIDB4ZjgwMCwgNSwgMTJ9LAorICB7MHg5MDAwLCAweGY4MDAsIDUsIDQ4fSwKKyAgezB4ODgwMCwgMHhmODAwLCA1LCAyMH0sCisgIHsweDgwMDAsIDB4ZjgwMCwgNSwgNDB9LAorICB7MHg3ODAwLCAweGY4MDAsIDUsIDI4fSwKKyAgezB4NzAwMCwgMHhmODAwLCA1LCA0NH0sCisgIHsweDY4MDAsIDB4ZjgwMCwgNSwgNTJ9LAorICB7MHg2MDAwLCAweGY4MDAsIDUsIDU2fSwKKyAgezB4NTgwMCwgMHhmODAwLCA1LCAxfSwKKyAgezB4NTAwMCwgMHhmODAwLCA1LCA2MX0sCisgIHsweDQ4MDAsIDB4ZjgwMCwgNSwgMn0sCisgIHsweDQwMDAsIDB4ZjgwMCwgNSwgNjJ9LAorICB7MHgzYzAwLCAweGZjMDAsIDYsIDI0fSwKKyAgezB4MzgwMCwgMHhmYzAwLCA2LCAzNn0sCisgIHsweDM0MDAsIDB4ZmMwMCwgNiwgM30sCisgIHsweDMwMDAsIDB4ZmMwMCwgNiwgNjN9LAorICB7MHgyZTAwLCAweGZlMDAsIDcsIDV9LAorICB7MHgyYzAwLCAweGZlMDAsIDcsIDl9LAorICB7MHgyYTAwLCAweGZlMDAsIDcsIDE3fSwKKyAgezB4MjgwMCwgMHhmZTAwLCA3LCAzM30sCisgIHsweDI2MDAsIDB4ZmUwMCwgNywgNn0sCisgIHsweDI0MDAsIDB4ZmUwMCwgNywgMTB9LAorICB7MHgyMjAwLCAweGZlMDAsIDcsIDE4fSwKKyAgezB4MjAwMCwgMHhmZTAwLCA3LCAzNH0sCisgIHsweDFmMDAsIDB4ZmYwMCwgOCwgN30sCisgIHsweDFlMDAsIDB4ZmYwMCwgOCwgMTF9LAorICB7MHgxZDAwLCAweGZmMDAsIDgsIDE5fSwKKyAgezB4MWMwMCwgMHhmZjAwLCA4LCAzNX0sCisgIHsweDFiMDAsIDB4ZmYwMCwgOCwgMTN9LAorICB7MHgxYTAwLCAweGZmMDAsIDgsIDQ5fSwKKyAgezB4MTkwMCwgMHhmZjAwLCA4LCAyMX0sCisgIHsweDE4MDAsIDB4ZmYwMCwgOCwgNDF9LAorICB7MHgxNzAwLCAweGZmMDAsIDgsIDE0fSwKKyAgezB4MTYwMCwgMHhmZjAwLCA4LCA1MH0sCisgIHsweDE1MDAsIDB4ZmYwMCwgOCwgMjJ9LAorICB7MHgxNDAwLCAweGZmMDAsIDgsIDQyfSwKKyAgezB4MTMwMCwgMHhmZjAwLCA4LCAxNX0sCisgIHsweDEyMDAsIDB4ZmYwMCwgOCwgNTF9LAorICB7MHgxMTAwLCAweGZmMDAsIDgsIDIzfSwKKyAgezB4MTAwMCwgMHhmZjAwLCA4LCA0M30sCisgIHsweDBmMDAsIDB4ZmYwMCwgOCwgMjV9LAorICB7MHgwZTAwLCAweGZmMDAsIDgsIDM3fSwKKyAgezB4MGQwMCwgMHhmZjAwLCA4LCAyNn0sCisgIHsweDBjMDAsIDB4ZmYwMCwgOCwgMzh9LAorICB7MHgwYjAwLCAweGZmMDAsIDgsIDI5fSwKKyAgezB4MGEwMCwgMHhmZjAwLCA4LCA0NX0sCisgIHsweDA5MDAsIDB4ZmYwMCwgOCwgNTN9LAorICB7MHgwODAwLCAweGZmMDAsIDgsIDU3fSwKKyAgezB4MDcwMCwgMHhmZjAwLCA4LCAzMH0sCisgIHsweDA2MDAsIDB4ZmYwMCwgOCwgNDZ9LAorICB7MHgwNTAwLCAweGZmMDAsIDgsIDU0fSwKKyAgezB4MDQwMCwgMHhmZjAwLCA4LCA1OH0sCisgIHsweDAzODAsIDB4ZmY4MCwgOSwgMzF9LAorICB7MHgwMzAwLCAweGZmODAsIDksIDQ3fSwKKyAgezB4MDI4MCwgMHhmZjgwLCA5LCA1NX0sCisgIHsweDAyMDAsIDB4ZmY4MCwgOSwgNTl9LAorICB7MHgwMTgwLCAweGZmODAsIDksIDI3fSwKKyAgezB4MDEwMCwgMHhmZjgwLCA5LCAzOX0sCit9OworCisjZGVmaW5lIFRDT0VGRl9FT0IgMHhmZmZmCisjZGVmaW5lIFRDT0VGRl9FU0MgMHhmZmZlCisjZGVmaW5lIFRDT0VGRl9MRU4gNjUKKy8qIFtjb2RlLCBtYXNrLCBuYml0cywgcnVuLCBsZXZlbF0gKi8KK3N0YXRpYyBjb25zdCBndWludDE2IHRjb2VmZl90YWJsZVtUQ09FRkZfTEVOXVs1XSA9IHsKKyAgezB4ODAwMCwgMHhjMDAwLCAyLCBUQ09FRkZfRU9CLCAwfSwgICAvKiBOb3QgYXZhaWxhYmxlIGZvciBmaXJzdCBjb2VmZiAqLworICAvKiB7MHg4MDAwLCAweDgwMDAsICAyLCAgMCwgIDF9LCAqLy8qIEF2YWlsYWJsZSBvbmx5IGZvciBmaXJzdCBJbnRlciBjb2VmZiAqLworICB7MHhjMDAwLCAweGMwMDAsIDMsIDAsIDF9LCAgICAvKiBOb3QgYXZhaWxhYmxlIGZvciBmaXJzdCBjb2VmZiAqLworICB7MHg2MDAwLCAweGUwMDAsIDQsIDEsIDF9LAorICB7MHg0MDAwLCAweGYwMDAsIDUsIDAsIDJ9LAorICB7MHg1MDAwLCAweGYwMDAsIDUsIDIsIDF9LAorICB7MHgyODAwLCAweGY4MDAsIDYsIDAsIDN9LAorICB7MHgzODAwLCAweGY4MDAsIDYsIDMsIDF9LAorICB7MHgzMDAwLCAweGY4MDAsIDYsIDQsIDF9LAorICB7MHgwNDAwLCAweGZjMDAsIDYsIFRDT0VGRl9FU0MsIDB9LAorICB7MHgxODAwLCAweGZjMDAsIDcsIDEsIDJ9LAorICB7MHgxYzAwLCAweGZjMDAsIDcsIDUsIDF9LAorICB7MHgxNDAwLCAweGZjMDAsIDcsIDYsIDF9LAorICB7MHgxMDAwLCAweGZjMDAsIDcsIDcsIDF9LAorICB7MHgwYzAwLCAweGZlMDAsIDgsIDAsIDR9LAorICB7MHgwODAwLCAweGZlMDAsIDgsIDIsIDJ9LAorICB7MHgwZTAwLCAweGZlMDAsIDgsIDgsIDF9LAorICB7MHgwYTAwLCAweGZlMDAsIDgsIDksIDF9LAorICB7MHgyNjAwLCAweGZmMDAsIDksIDAsIDV9LAorICB7MHgyMTAwLCAweGZmMDAsIDksIDAsIDZ9LAorICB7MHgyNTAwLCAweGZmMDAsIDksIDEsIDN9LAorICB7MHgyNDAwLCAweGZmMDAsIDksIDMsIDJ9LAorICB7MHgyNzAwLCAweGZmMDAsIDksIDEwLCAxfSwKKyAgezB4MjMwMCwgMHhmZjAwLCA5LCAxMSwgMX0sCisgIHsweDIyMDAsIDB4ZmYwMCwgOSwgMTIsIDF9LAorICB7MHgyMDAwLCAweGZmMDAsIDksIDEzLCAxfSwKKyAgezB4MDI4MCwgMHhmZmMwLCAxMSwgMCwgN30sCisgIHsweDAzMDAsIDB4ZmZjMCwgMTEsIDEsIDR9LAorICB7MHgwMmMwLCAweGZmYzAsIDExLCAyLCAzfSwKKyAgezB4MDNjMCwgMHhmZmMwLCAxMSwgNCwgMn0sCisgIHsweDAyNDAsIDB4ZmZjMCwgMTEsIDUsIDJ9LAorICB7MHgwMzgwLCAweGZmYzAsIDExLCAxNCwgMX0sCisgIHsweDAzNDAsIDB4ZmZjMCwgMTEsIDE1LCAxfSwKKyAgezB4MDIwMCwgMHhmZmMwLCAxMSwgMTYsIDF9LAorICB7MHgwMWQwLCAweGZmZjAsIDEzLCAwLCA4fSwKKyAgezB4MDE4MCwgMHhmZmYwLCAxMywgMCwgOX0sCisgIHsweDAxMzAsIDB4ZmZmMCwgMTMsIDAsIDEwfSwKKyAgezB4MDEwMCwgMHhmZmYwLCAxMywgMCwgMTF9LAorICB7MHgwMWIwLCAweGZmZjAsIDEzLCAxLCA1fSwKKyAgezB4MDE0MCwgMHhmZmYwLCAxMywgMiwgNH0sCisgIHsweDAxYzAsIDB4ZmZmMCwgMTMsIDMsIDN9LAorICB7MHgwMTIwLCAweGZmZjAsIDEzLCA0LCAzfSwKKyAgezB4MDFlMCwgMHhmZmYwLCAxMywgNiwgMn0sCisgIHsweDAxNTAsIDB4ZmZmMCwgMTMsIDcsIDJ9LAorICB7MHgwMTEwLCAweGZmZjAsIDEzLCA4LCAyfSwKKyAgezB4MDFmMCwgMHhmZmYwLCAxMywgMTcsIDF9LAorICB7MHgwMWEwLCAweGZmZjAsIDEzLCAxOCwgMX0sCisgIHsweDAxOTAsIDB4ZmZmMCwgMTMsIDE5LCAxfSwKKyAgezB4MDE3MCwgMHhmZmYwLCAxMywgMjAsIDF9LAorICB7MHgwMTYwLCAweGZmZjAsIDEzLCAyMSwgMX0sCisgIHsweDAwZDAsIDB4ZmZmOCwgMTQsIDAsIDEyfSwKKyAgezB4MDBjOCwgMHhmZmY4LCAxNCwgMCwgMTN9LAorICB7MHgwMGMwLCAweGZmZjgsIDE0LCAwLCAxNH0sCisgIHsweDAwYjgsIDB4ZmZmOCwgMTQsIDAsIDE1fSwKKyAgezB4MDBiMCwgMHhmZmY4LCAxNCwgMSwgNn0sCisgIHsweDAwYTgsIDB4ZmZmOCwgMTQsIDEsIDd9LAorICB7MHgwMGEwLCAweGZmZjgsIDE0LCAyLCA1fSwKKyAgezB4MDA5OCwgMHhmZmY4LCAxNCwgMywgNH0sCisgIHsweDAwOTAsIDB4ZmZmOCwgMTQsIDUsIDN9LAorICB7MHgwMDg4LCAweGZmZjgsIDE0LCA5LCAyfSwKKyAgezB4MDA4MCwgMHhmZmY4LCAxNCwgMTAsIDJ9LAorICB7MHgwMGY4LCAweGZmZjgsIDE0LCAyMiwgMX0sCisgIHsweDAwZjAsIDB4ZmZmOCwgMTQsIDIzLCAxfSwKKyAgezB4MDBlOCwgMHhmZmY4LCAxNCwgMjQsIDF9LAorICB7MHgwMGUwLCAweGZmZjgsIDE0LCAyNSwgMX0sCisgIHsweDAwZDgsIDB4ZmZmOCwgMTQsIDI2LCAxfSwKK307CisKK3N0YXRpYyBQYXJzZVJldHVybgorZGVjb2RlX21iYSAoR3N0Qml0UmVhZGVyICogYnIsIGdpbnQgKiBtYmEpCit7CisgIGdpbnQgaTsKKyAgZ3VpbnQxNiBjb2RlOworCisgICptYmEgPSAtMTsKKyAgZG8geworICAgIFBFRUtfQklUUyAoYnIsICZjb2RlLCAxNik7CisgICAgZm9yIChpID0gMDsgaSA8IE1CQV9MRU47IGkrKykgeworICAgICAgaWYgKChjb2RlICYgbWJhX3RhYmxlW2ldWzFdKSA9PSBtYmFfdGFibGVbaV1bMF0pIHsKKyAgICAgICAgKm1iYSA9IG1iYV90YWJsZVtpXVszXTsKKworICAgICAgICBpZiAoKm1iYSA9PSBNQkFfU1RBUlRfQ09ERSkKKyAgICAgICAgICByZXR1cm4gUEFSU0VfRU5EX09GX0dPQjsKKyAgICAgICAgU0tJUF9CSVRTIChiciwgbWJhX3RhYmxlW2ldWzJdKTsKKyAgICAgICAgaWYgKCptYmEgIT0gTUJBX1NUVUZGSU5HKQorICAgICAgICAgIHJldHVybiBQQVJTRV9PSzsKKyAgICAgIH0KKyAgICB9CisgIH0gd2hpbGUgKCptYmEgPT0gTUJBX1NUVUZGSU5HKTsKKworICAvKiAweDAgaW5kaWNhdGVzIGVuZCBvZiBmcmFtZSBzaW5jZSB3ZSBhcHBlbmRlZCAwLWJ5dGVzICovCisgIGlmIChjb2RlID09IDB4MCkKKyAgICByZXR1cm4gUEFSU0VfRU5EX09GX0ZSQU1FOworCisgIHJldHVybiBQQVJTRV9FUlJPUjsKK30KKworc3RhdGljIFBhcnNlUmV0dXJuCitkZWNvZGVfbXR5cGUgKEdzdEJpdFJlYWRlciAqIGJyLCBndWludCAqIG10eXBlKQoreworICBnaW50IGk7CisgIGd1aW50MTYgY29kZTsKKworICBQRUVLX0JJVFMgKGJyLCAmY29kZSwgMTYpOworICBmb3IgKGkgPSAwOyBpIDwgTVRZUEVfTEVOOyBpKyspIHsKKyAgICBpZiAoKGNvZGUgJiBtdHlwZV90YWJsZVtpXVsxXSkgPT0gbXR5cGVfdGFibGVbaV1bMF0pIHsKKyAgICAgIFNLSVBfQklUUyAoYnIsIG10eXBlX3RhYmxlW2ldWzJdKTsKKyAgICAgICptdHlwZSA9IG10eXBlX3RhYmxlW2ldWzNdOworICAgICAgcmV0dXJuIFBBUlNFX09LOworICAgIH0KKyAgfQorCisgIHJldHVybiBQQVJTRV9FUlJPUjsKK30KKworc3RhdGljIFBhcnNlUmV0dXJuCitkZWNvZGVfbXZkIChHc3RCaXRSZWFkZXIgKiBiciwgZ2ludCAqIG12ZDEsIGdpbnQgKiBtdmQyKQoreworICBnaW50IGk7CisgIGd1aW50MTYgY29kZTsKKworICBQRUVLX0JJVFMgKGJyLCAmY29kZSwgMTYpOworICBmb3IgKGkgPSAwOyBpIDwgTVZEX0xFTjsgaSsrKSB7CisgICAgaWYgKChjb2RlICYgbXZkX3RhYmxlW2ldWzFdKSA9PSBtdmRfdGFibGVbaV1bMF0pIHsKKyAgICAgIFNLSVBfQklUUyAoYnIsIG12ZF90YWJsZVtpXVsyXSk7CisgICAgICAqbXZkMSA9IChnaW50MTYpIG12ZF90YWJsZVtpXVszXTsKKyAgICAgICptdmQyID0gKGdpbnQxNikgbXZkX3RhYmxlW2ldWzRdOworICAgICAgcmV0dXJuIFBBUlNFX09LOworICAgIH0KKyAgfQorCisgIHJldHVybiBQQVJTRV9FUlJPUjsKK30KKworc3RhdGljIFBhcnNlUmV0dXJuCitkZWNvZGVfY2JwIChHc3RCaXRSZWFkZXIgKiBiciwgZ3VpbnQgKiBjYnApCit7CisgIGdpbnQgaTsKKyAgZ3VpbnQxNiBjb2RlOworCisgIFBFRUtfQklUUyAoYnIsICZjb2RlLCAxNik7CisgIGZvciAoaSA9IDA7IGkgPCBDQlBfTEVOOyBpKyspIHsKKyAgICBpZiAoKGNvZGUgJiBjYnBfdGFibGVbaV1bMV0pID09IGNicF90YWJsZVtpXVswXSkgeworICAgICAgU0tJUF9CSVRTIChiciwgY2JwX3RhYmxlW2ldWzJdKTsKKyAgICAgICpjYnAgPSBjYnBfdGFibGVbaV1bM107CisgICAgICByZXR1cm4gUEFSU0VfT0s7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFBBUlNFX0VSUk9SOworfQorCitzdGF0aWMgUGFyc2VSZXR1cm4KK2RlY29kZV90Y29lZmYgKEdzdEJpdFJlYWRlciAqIGJyLCBndWludCBtdHlwZSkKK3sKKyAgZ2ludCBpOworICBndWludDE2IGNvZGU7CisgIGdib29sZWFuIGVvYjsKKworICAvKiBTcGVjaWFsIGhhbmRsaW5nIG9mIGZpcnN0IGNvZWZmICovCisgIGlmIChtdHlwZSAmIE1UWVBFX0lOVEVSKSB7CisgICAgLyogSW50ZXIsIGRpZmZlcmVudCB2bGMgc2luY2UgRU9CIGlzIG5vdCBhbGxvd2VkICovCisgICAgUEVFS19CSVRTIChiciwgJmNvZGUsIDE2KTsKKyAgICBpZiAoY29kZSAmIDB4ODAwMCkgeworICAgICAgU0tJUF9CSVRTIChiciwgMik7CisgICAgICBHU1RfVFJBQ0UgKCJ0Y29lZmYgZmlyc3QgaW50ZXIgc3BlY2lhbCIpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBGYWxsdGhyb3VnaC4gTGV0IHRoZSBmaXJzdCBjb2VmZiBiZSBoYW5kbGVkIGxpa2Ugb3RoZXIgY29lZmZzIHNpbmNlCisgICAgICAgKiB0aGUgdmxjIGlzIHRoZSBzYW1lIGFzIGxvbmcgYXMgdGhlIGZpcnN0IGJpdCBpcyBub3Qgc2V0LiAqLworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBJbnRyYSwgZmlyc3QgY29lZmYgaXMgZml4ZWQgOC1iaXQgKi8KKyAgICBHU1RfVFJBQ0UgKCJ0Y29lZmYgZmlyc3QgaW50cmEgc3BlY2lhbCIpOworICAgIFNLSVBfQklUUyAoYnIsIDgpOworICB9CisKKyAgLyogQmxvY2sgbXVzdCBlbmQgd2l0aCBFT0IuICovCisgIGVvYiA9IEZBTFNFOworICB3aGlsZSAoIWVvYikgeworICAgIFBFRUtfQklUUyAoYnIsICZjb2RlLCAxNik7CisgICAgZm9yIChpID0gMDsgaSA8IFRDT0VGRl9MRU47IGkrKykgeworICAgICAgaWYgKChjb2RlICYgdGNvZWZmX3RhYmxlW2ldWzFdKSA9PSB0Y29lZmZfdGFibGVbaV1bMF0pIHsKKyAgICAgICAgR1NUX1RSQUNFICgidGNvZWZmIHZsY1slZF0sIHJ1bj0lZCwgbGV2ZWw9JWQiLCBpLCB0Y29lZmZfdGFibGVbaV1bM10sCisgICAgICAgICAgICB0Y29lZmZfdGFibGVbaV1bNF0pOworICAgICAgICBTS0lQX0JJVFMgKGJyLCB0Y29lZmZfdGFibGVbaV1bMl0pOworICAgICAgICBpZiAodGNvZWZmX3RhYmxlW2ldWzNdID09IFRDT0VGRl9FT0IpIHsKKyAgICAgICAgICBlb2IgPSBUUlVFOworICAgICAgICB9IGVsc2UgaWYgKHRjb2VmZl90YWJsZVtpXVszXSA9PSBUQ09FRkZfRVNDKSB7CisjaWYgMAorICAgICAgICAgIGd1aW50MTYgdmFsOworICAgICAgICAgIHZhbCA9IGdzdF9iaXRfcmVhZGVyX3BlZWtfYml0c191aW50MTZfdW5jaGVja2VkIChiciwgNiArIDgpOworICAgICAgICAgIEdTVF9UUkFDRSAoImVzYyBydW49JWQsIGxldmVsPSVkIiwgdmFsID4+IDgsIChnaW50OCkgKHZhbCAmIDB4ZmYpKTsKKyNlbmRpZgorICAgICAgICAgIFNLSVBfQklUUyAoYnIsIDYgKyA4KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGkgPT0gVENPRUZGX0xFTikKKyAgICAgIC8qIE5vIG1hdGNoaW5nIFZMQyAqLworICAgICAgcmV0dXJuIFBBUlNFX0VSUk9SOworICB9CisKKyAgcmV0dXJuIFBBUlNFX09LOworfQorCitzdGF0aWMgZ2ludAorZmluZF9waWN0dXJlX2hlYWRlcl9vZmZzZXQgKGNvbnN0IGd1aW50OCAqIGRhdGEsIGdzaXplIHNpemUpCit7CisgIGdpbnQgaTsKKyAgZ3VpbnQzMiB2YWw7CisKKyAgaWYgKHNpemUgPCA0KQorICAgIHJldHVybiAtMTsKKworICB2YWwgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEpOworICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgaWYgKCh2YWwgPj4gKDEyIC0gaSkpID09IDB4MTApCisgICAgICByZXR1cm4gaTsKKyAgfQorCisgIHJldHVybiAtMTsKK30KKworc3RhdGljIFBhcnNlUmV0dXJuCitwYXJzZV9waWN0dXJlX2hlYWRlciAoR3N0UnRwSDI2MVBheSAqIHBheSwgR3N0Qml0UmVhZGVyICogYnIsIGdpbnQgKiBudW1fZ29iKQoreworICBndWludDMyIHZhbDsKKworICBHRVRfQklUUyAoYnIsICZ2YWwsIFBTQ19MRU4pOworICBpZiAodmFsICE9IDB4MTApCisgICAgcmV0dXJuIFBBUlNFX0VSUk9SOworICBTS0lQX0JJVFMgKGJyLCBUUl9MRU4pOworICBHRVRfQklUUyAoYnIsICZ2YWwsIFBUWVBFX0xFTik7CisgICpudW1fZ29iID0gKHZhbCAmIDB4MDQpID09IDAgPyAzIDogMTI7CisKKyAgcmV0dXJuIFBBUlNFX09LOworfQorCitzdGF0aWMgUGFyc2VSZXR1cm4KK3BhcnNlX2dvYl9oZWFkZXIgKEdzdFJ0cEgyNjFQYXkgKiBwYXksIEdzdEJpdFJlYWRlciAqIGJyLCBHb2IgKiBnb2IpCit7CisgIGd1aW50MzIgdmFsOworCisgIEdFVF9CSVRTIChiciwgJnZhbCwgR0JTQ19MRU4pOworICBpZiAodmFsICE9IDB4MDEpCisgICAgcmV0dXJuIFBBUlNFX0VSUk9SOworICBHRVRfQklUUyAoYnIsICZnb2ItPmduLCBHTl9MRU4pOworICBHU1RfVFJBQ0VfT0JKRUNUIChwYXksICJQYXJzaW5nIEdPQiAlZCIsIGdvYi0+Z24pOworCisgIEdFVF9CSVRTIChiciwgJmdvYi0+Z3F1YW50LCBHUVVBTlRfTEVOKTsKKyAgR1NUX1RSQUNFX09CSkVDVCAocGF5LCAiR1FVQU5UICVkIiwgZ29iLT5ncXVhbnQpOworICBHRVRfQklUUyAoYnIsICZ2YWwsIEdFSV9MRU4pOworICB3aGlsZSAodmFsICE9IDApIHsKKyAgICBTS0lQX0JJVFMgKGJyLCBHU1BBUkVfTEVOKTsKKyAgICBHRVRfQklUUyAoYnIsICZ2YWwsIEdFSV9MRU4pOworICB9CisKKyAgcmV0dXJuIFBBUlNFX09LOworfQorCitzdGF0aWMgUGFyc2VSZXR1cm4KK3BhcnNlX21iIChHc3RSdHBIMjYxUGF5ICogcGF5LCBHc3RCaXRSZWFkZXIgKiBiciwgY29uc3QgTWFjcm9ibG9jayAqIHByZXYsCisgICAgTWFjcm9ibG9jayAqIG1iKQoreworICBnaW50IG1iYV9kaWZmOworICBndWludCBjYnA7CisgIFBhcnNlUmV0dXJuIHJldDsKKworICBjYnAgPSAweDNmOworICBtYi0+cXVhbnQgPSBwcmV2LT5xdWFudDsKKworICBpZiAoKHJldCA9IGRlY29kZV9tYmEgKGJyLCAmbWJhX2RpZmYpKSAhPSBQQVJTRV9PSykKKyAgICByZXR1cm4gcmV0OworICBtYi0+bWJhID0gcHJldi0+bWJhID09IDAgPyBtYmFfZGlmZiA6IHByZXYtPm1iYSArIG1iYV9kaWZmOworICBHU1RfVFJBQ0VfT0JKRUNUIChwYXksICJQYXJzZSBNQkEgJWQgKG1iYV9kaWZmICVkKSIsIG1iLT5tYmEsIG1iYV9kaWZmKTsKKworICBpZiAoKHJldCA9IGRlY29kZV9tdHlwZSAoYnIsICZtYi0+bXR5cGUpKSAhPSBQQVJTRV9PSykKKyAgICByZXR1cm4gcmV0OworICBHU1RfVFJBQ0VfT0JKRUNUIChwYXksCisgICAgICAiTVRZUEU6IGludGVyICVkLCBtYyAlZCwgZmlsICVkLCBtcXVhbnQgJWQsIG12ZCAlZCwgY2JwICVkLCB0Y29lZmYgJWQiLAorICAgICAgKG1iLT5tdHlwZSAmIE1UWVBFX0lOVEVSKSAhPSAwLCAobWItPm10eXBlICYgTVRZUEVfTUMpICE9IDAsCisgICAgICAobWItPm10eXBlICYgTVRZUEVfRklMKSAhPSAwLCAobWItPm10eXBlICYgTVRZUEVfTVFVQU5UKSAhPSAwLAorICAgICAgKG1iLT5tdHlwZSAmIE1UWVBFX01WRCkgIT0gMCwgKG1iLT5tdHlwZSAmIE1UWVBFX0NCUCkgIT0gMCwKKyAgICAgIChtYi0+bXR5cGUgJiBNVFlQRV9UQ09FRkYpICE9IDApOworCisgIGlmIChtYi0+bXR5cGUgJiBNVFlQRV9NUVVBTlQpIHsKKyAgICBHRVRfQklUUyAoYnIsICZtYi0+cXVhbnQsIE1RVUFOVF9MRU4pOworICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHBheSwgIk1RVUFOVDogJWQiLCBtYi0+cXVhbnQpOworICB9CisKKyAgaWYgKG1iLT5tdHlwZSAmIE1UWVBFX01WRCkgeworICAgIGdpbnQgaSwgcG12WzJdLCBtdlsyXTsKKworICAgIGlmIChtYi0+bWJhID09IDEgfHwgbWItPm1iYSA9PSAxMiB8fCBtYi0+bWJhID09IDIzIHx8IG1iYV9kaWZmICE9IDEgfHwKKyAgICAgICAgKHByZXYtPm10eXBlICYgTVRZUEVfSU5URVIpID09IDApIHsKKyAgICAgIHBtdlswXSA9IDA7CisgICAgICBwbXZbMV0gPSAwOworICAgIH0gZWxzZSB7CisgICAgICBwbXZbMF0gPSBwcmV2LT5tdng7CisgICAgICBwbXZbMV0gPSBwcmV2LT5tdnk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgIGdpbnQgbXZkMSwgbXZkMjsKKyAgICAgIGlmICgocmV0ID0gZGVjb2RlX212ZCAoYnIsICZtdmQxLCAmbXZkMikpICE9IFBBUlNFX09LKQorICAgICAgICByZXR1cm4gcmV0OworICAgICAgaWYgKEFCUyAocG12W2ldICsgbXZkMSkgPD0gMTUpCisgICAgICAgIG12W2ldID0gcG12W2ldICsgbXZkMTsKKyAgICAgIGVsc2UKKyAgICAgICAgbXZbaV0gPSBwbXZbaV0gKyBtdmQyOworICAgIH0KKyAgICBtYi0+bXZ4ID0gbXZbMF07CisgICAgbWItPm12eSA9IG12WzFdOworICB9IGVsc2UgeworICAgIG1iLT5tdnggPSAwOworICAgIG1iLT5tdnkgPSAwOworICB9CisKKyAgaWYgKG1iLT5tdHlwZSAmIE1UWVBFX0NCUCkgeworICAgIGlmICgocmV0ID0gZGVjb2RlX2NicCAoYnIsICZjYnApKSAhPSBQQVJTRV9PSykKKyAgICAgIHJldHVybiByZXQ7CisgIH0KKworICAvKiBCbG9jayBsYXllciAqLworICBpZiAobWItPm10eXBlICYgTVRZUEVfVENPRUZGKSB7CisgICAgZ2ludCBibG9jazsKKyAgICBmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCA2OyBibG9jaysrKSB7CisgICAgICBpZiAoY2JwICYgKDEgPDwgKDUgLSBibG9jaykpKSB7CisgICAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHBheSwgIkRlY29kZSBUQ09FRkYgZm9yIGJsb2NrICVkIiwgYmxvY2spOworICAgICAgICBpZiAoKHJldCA9IGRlY29kZV90Y29lZmYgKGJyLCBtYi0+bXR5cGUpKSAhPSBQQVJTRV9PSykKKyAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgfQorICAgIH0KKyAgfQorCisgIG1iLT5lbmRwb3MgPSBnc3RfYml0X3JlYWRlcl9nZXRfcG9zIChicik7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogUGFyc2UgbWFjcm9ibG9ja3MgdW50aWwgdGhlIG5leHQgTUIgdGhhdCBleGNlZWRzIG1heHBvcy4gQXQgbGVhc3Qgb25lIE1CIGlzCisgKiBpbmNsdWRlZCBldmVuIGlmIGl0IGV4Y2VlZHMgbWF4cG9zLiBSZXR1cm5zIGVuZHBvcyBvZiBsYXN0IGluY2x1ZGVkIE1CLiAqLworc3RhdGljIFBhcnNlUmV0dXJuCitwYXJzZV9tYl91bnRpbF9wb3MgKEdzdFJ0cEgyNjFQYXkgKiBwYXksIEdzdEJpdFJlYWRlciAqIGJyLCBHb2IgKiBnb2IsCisgICAgZ3VpbnQgKiBlbmRwb3MpCit7CisgIFBhcnNlUmV0dXJuIHJldDsKKyAgZ2ludCBjb3VudCA9IDA7CisgIGdib29sZWFuIHN0b3AgPSBGQUxTRTsKKyAgZ3VpbnQgbWF4cG9zID0gKmVuZHBvczsKKyAgTWFjcm9ibG9jayBtYjsKKworICBHU1RfTE9HX09CSkVDVCAocGF5LCAiUGFyc2UgdW50aWwgcG9zICV1LCBzdGFydCBhdCBwb3MgJXUsIGdvYm4gJWQsIG1iYSAlZCIsCisgICAgICBtYXhwb3MsIGdzdF9iaXRfcmVhZGVyX2dldF9wb3MgKGJyKSwgZ29iLT5nbiwgZ29iLT5sYXN0Lm1iYSk7CisKKyAgd2hpbGUgKCFzdG9wKSB7CisgICAgcmV0ID0gcGFyc2VfbWIgKHBheSwgYnIsICZnb2ItPmxhc3QsICZtYik7CisKKyAgICBzd2l0Y2ggKHJldCkgeworICAgICAgY2FzZSBQQVJTRV9PSzoKKyAgICAgICAgaWYgKG1iLmVuZHBvcyA+IG1heHBvcyAmJiBjb3VudCA+IDApIHsKKyAgICAgICAgICAvKiBEb24ndCBpbmNsdWRlIGN1cnJlbnQgTUIgKi8KKyAgICAgICAgICBzdG9wID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBVcGRhdGUgdG8gaW5jbHVkZSBjdXJyZW50IE1CICovCisgICAgICAgICAgKmVuZHBvcyA9IG1iLmVuZHBvczsKKyAgICAgICAgICBnb2ItPmxhc3QgPSBtYjsKKyAgICAgICAgICBjb3VudCsrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBBUlNFX0VORF9PRl9GUkFNRToKKyAgICAgICAgKmVuZHBvcyA9IGdzdF9iaXRfcmVhZGVyX2dldF9wb3MgKGJyKTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGF5LCAiRW5kIG9mIGZyYW1lIGF0IHBvcyAldSAobGFzdCBHT0JOICVkIE1CQSAlZCkiLAorICAgICAgICAgICAgKmVuZHBvcywgZ29iLT5nbiwgZ29iLT5sYXN0Lm1iYSk7CisgICAgICAgIHN0b3AgPSBUUlVFOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQQVJTRV9FTkRfT0ZfR09COgorICAgICAgICAvKiBOb3RlIHRoYXQgYSBHT0IgY2FuIGNvbnRhaW4gbm90aGluZywgc28gd2UgbWF5IGdldCBoZXJlIG9uIHRoZSBmaXJzdAorICAgICAgICAgKiBpdGVyYXRpb24uICovCisgICAgICAgICplbmRwb3MgPSBnb2ItPmxhc3QubWJhID09IDAgPworICAgICAgICAgICAgZ29iLT5zdGFydHBvcyA6IGdzdF9iaXRfcmVhZGVyX2dldF9wb3MgKGJyKTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGF5LCAiRW5kIG9mIGdvYiBhdCBwb3MgJXUgKGxhc3QgR09CTiAlZCBNQkEgJWQpIiwKKyAgICAgICAgICAgICplbmRwb3MsIGdvYi0+Z24sIGdvYi0+bGFzdC5tYmEpOworICAgICAgICBzdG9wID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUEFSU0VfRU5EX09GX0JVRkZFUjoKKyAgICAgIGNhc2UgUEFSU0VfRVJST1I6CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGF5LCAiRmFpbGVkIHRvIHBhcnNlIHN0cmVhbSAocmVhc29uICVkKSIsIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGdvYi0+bGFzdC5nb2JuID0gZ29iLT5nbjsKKworICBpZiAocmV0ID09IFBBUlNFX09LKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocGF5LAorICAgICAgICAiU3BsaXQgR09CTiAlZCBhZnRlciBNQkEgJWQgKGVuZHBvcyAldSwgbWF4cG9zICV1LCBuZXh0cG9zICV1KSIsCisgICAgICAgIGdvYi0+Z24sIGdvYi0+bGFzdC5tYmEsICplbmRwb3MsIG1heHBvcywgbWIuZW5kcG9zKTsKKyAgICBnc3RfYml0X3JlYWRlcl9zZXRfcG9zIChiciwgKmVuZHBvcyk7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ3VpbnQKK2JpdHJhbmdlX3RvX2J5dGVzIChndWludCBmaXJzdCwgZ3VpbnQgbGFzdCkKK3sKKyAgcmV0dXJuIChHU1RfUk9VTkRfVVBfOCAobGFzdCkgLSBHU1RfUk9VTkRfRE9XTl84IChmaXJzdCkpIC8gODsKK30KKworLyogRmluZCBuZXh0IDE2LWJpdCBHT0Igc3RhcnQgY29kZSAoMHgwMDAxKSwgd2hpY2ggbWF5IG5vdCBiZSBieXRlIGFsaWduZWQuCisgKiBSZXR1cm5zIHRoZSBiaXQgb2Zmc2V0IG9mIHRoZSBmaXJzdCBiaXQgb2YgR0JTQy4gKi8KK3N0YXRpYyBnc3NpemUKK2ZpbmRfZ29iIChHc3RSdHBIMjYxUGF5ICogcGF5LCBjb25zdCBndWludDggKiBkYXRhLCBndWludCBzaXplLCBndWludCBwb3MpCit7CisgIGdzc2l6ZSByZXQgPSAtMTsKKyAgZ3VpbnQgb2Zmc2V0OworCisgIEdTVF9MT0dfT0JKRUNUIChwYXksICJTZWFyY2ggZm9yIEdPQiBmcm9tIHBvcyAldSIsIHBvcyk7CisKKyAgZm9yIChvZmZzZXQgPSBwb3MgLyA4OyBvZmZzZXQgPCBzaXplIC0gMTsgb2Zmc2V0KyspIHsKKyAgICBpZiAoZGF0YVtvZmZzZXRdID09IDB4MCkgeworICAgICAgZ2ludCBtc2IgPSBnX2JpdF9udGhfbXNmIChkYXRhW29mZnNldCArIDFdLCA4KTsKKyAgICAgIGdpbnQgbHNiID0gb2Zmc2V0ID4gMCA/IGdfYml0X250aF9sc2YgKGRhdGFbb2Zmc2V0IC0gMV0sIC0xKSA6IDA7CisgICAgICBpZiAobHNiID09IC0xKQorICAgICAgICBsc2IgPSA4OworICAgICAgaWYgKG1zYiA+PSAwICYmIGxzYiA+PSBtc2IpIHsKKyAgICAgICAgcmV0ID0gb2Zmc2V0ICogOCAtIG1zYjsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBheSwgIkZvdW5kIEdPQiBzdGFydCBjb2RlIGF0IGJpdHBvcyAlIgorICAgICAgICAgICAgR19HU1NJWkVfRk9STUFUICIgKCUwMnggJTAyeCAlMDJ4KSIsIHJldCwKKyAgICAgICAgICAgIG9mZnNldCA+IDAgPyBkYXRhW29mZnNldCAtIDFdIDogMCwgZGF0YVtvZmZzZXRdLCBkYXRhW29mZnNldCArIDFdKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogU2NhbnMgYWZ0ZXIgYWxsIEdPQiBzdGFydCBjb2RlcyBhbmQgaW5pdGFsaXplcyB0aGUgR09CIHN0cnVjdHVyZSB3aXRoIHN0YXJ0CisgKiBhbmQgZW5kIHBvc2l0aW9ucy4gKi8KK3N0YXRpYyBQYXJzZVJldHVybgorZ3N0X3J0cF9oMjYxX3BheV9pbml0X2dvYnMgKEdzdFJ0cEgyNjFQYXkgKiBwYXksIEdvYiAqIGdvYnMsIGdpbnQgbnVtX2dvYnMsCisgICAgY29uc3QgZ3VpbnQ4ICogYml0cywgZ2ludCBsZW4sIGd1aW50IHBvcykKK3sKKyAgZ2ludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fZ29iczsgaSsrKSB7CisgICAgZ3NzaXplIGdvYnBvcyA9IGZpbmRfZ29iIChwYXksIGJpdHMsIGxlbiwgcG9zKTsKKyAgICBpZiAoZ29icG9zID09IC0xKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBheSwgIkZvdW5kIG9ubHkgJWQgb2YgJWQgR09CcyIsIGksIG51bV9nb2JzKTsKKyAgICAgIHJldHVybiBQQVJTRV9FUlJPUjsKKyAgICB9CisgICAgR1NUX0xPR19PQkpFQ1QgKHBheSwgIkZvdW5kIEdPQiAlZCBhdCBwb3MgJSIgR19HU1NJWkVfRk9STUFULCBpLCBnb2Jwb3MpOworICAgIHBvcyA9IGdvYnBvcyArIEdCU0NfTEVOOworCisgICAgZ29ic1tpXS5zdGFydHBvcyA9IGdvYnBvczsKKyAgICBpZiAoaSA+IDApCisgICAgICBnb2JzW2kgLSAxXS5lbmRwb3MgPSBnb2Jwb3M7CisgIH0KKyAgZ29ic1tudW1fZ29icyAtIDFdLmVuZHBvcyA9IGxlbiAqIDg7CisKKyAgcmV0dXJuIFBBUlNFX09LOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9oMjYxX3BheV9mcmFnbWVudF9wdXNoIChHc3RSdHBIMjYxUGF5ICogcGF5LCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgY29uc3QgZ3VpbnQ4ICogYml0cywgZ3VpbnQgc3RhcnQsIGd1aW50IGVuZCwKKyAgICBjb25zdCBNYWNyb2Jsb2NrICogbGFzdF9tYl9pbl9wcmV2aW91c19wYWNrZXQsIGdib29sZWFuIG1hcmtlcikKK3sKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIGd1aW50OCAqcGF5bG9hZDsKKyAgR3N0UnRwSDI2MVBheUhlYWRlciAqaGVhZGVyOworICBnaW50IG5ieXRlczsKKyAgY29uc3QgTWFjcm9ibG9jayAqbGFzdCA9IGxhc3RfbWJfaW5fcHJldmlvdXNfcGFja2V0OworICBHc3RSVFBCdWZmZXIgcnRwID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKworICBuYnl0ZXMgPSBiaXRyYW5nZV90b19ieXRlcyAoc3RhcnQsIGVuZCk7CisKKyAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChuYnl0ZXMgKworICAgICAgR1NUX1JUUF9IMjYxX1BBWUxPQURfSEVBREVSX0xFTiwgMCwgMCk7CisgIGdzdF9ydHBfYnVmZmVyX21hcCAob3V0YnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKyAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKTsKKyAgaGVhZGVyID0gKEdzdFJ0cEgyNjFQYXlIZWFkZXIgKikgcGF5bG9hZDsKKworICBtZW1zZXQgKGhlYWRlciwgMCwgR1NUX1JUUF9IMjYxX1BBWUxPQURfSEVBREVSX0xFTik7CisgIGhlYWRlci0+diA9IDE7CisgIGhlYWRlci0+c2JpdCA9IHN0YXJ0ICYgNzsKKyAgaGVhZGVyLT5lYml0ID0gKDggLSAoZW5kICYgNykpICYgNzsKKworICBpZiAobGFzdCAhPSBOVUxMICYmIGxhc3QtPm1iYSAhPSAwICYmIGxhc3QtPm1iYSAhPSAzMykgeworICAgIC8qIE5PVEU6IE1WRCBhc3N1bWVzIHRoYXQgd2UncmUgcnVubmluZyBvbiAyJ3MgY29tcGxlbWVudCBhcmNoaXRlY3R1cmUgKi8KKyAgICBndWludCBtYmFwID0gbGFzdC0+bWJhIC0gMTsKKyAgICBoZWFkZXItPmdvYm4gPSBsYXN0LT5nb2JuOworICAgIGhlYWRlci0+bWJhcDEgPSBtYmFwID4+IDE7CisgICAgaGVhZGVyLT5tYmFwMiA9IG1iYXAgJiAxOworICAgIGhlYWRlci0+cXVhbnQgPSBsYXN0LT5xdWFudDsKKyAgICBoZWFkZXItPmhtdmQxID0gbGFzdC0+bXZ4ID4+IDM7CisgICAgaGVhZGVyLT5obXZkMiA9IGxhc3QtPm12eCAmIDc7CisgICAgaGVhZGVyLT52bXZkID0gbGFzdC0+bXZ5OworICB9CisKKyAgbWVtY3B5IChwYXlsb2FkICsgR1NUX1JUUF9IMjYxX1BBWUxPQURfSEVBREVSX0xFTiwKKyAgICAgIGJpdHMgKyBHU1RfUk9VTkRfRE9XTl84IChzdGFydCkgLyA4LCBuYnl0ZXMpOworCisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpID0gcGF5LT50aW1lc3RhbXA7CisgIGdzdF9ydHBfYnVmZmVyX3NldF9tYXJrZXIgKCZydHAsIG1hcmtlcik7CisgIHBheS0+b2Zmc2V0ID0gZW5kICYgNzsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYXksCisgICAgICAiUHVzaCBmcmFnbWVudCwgYnl0ZXMgJWQsIHNiaXQgJWQsIGViaXQgJWQsIGdvYm4gJWQsIG1iYXAgJWQsIG1hcmtlciAlZCIsCisgICAgICBuYnl0ZXMsIGhlYWRlci0+c2JpdCwgaGVhZGVyLT5lYml0LCBsYXN0ICE9IE5VTEwgPyBsYXN0LT5nb2JuIDogMCwKKyAgICAgIGxhc3QgIT0gTlVMTCA/IE1BWCAobGFzdC0+bWJhIC0gMSwgMCkgOiAwLCBtYXJrZXIpOworCisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocGF5LCBvdXRidWYsIGJ1ZmZlcik7CisKKyAgcmV0dXJuIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NBU1QgKHBheSksIG91dGJ1Zik7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2gyNjFfcGFja2V0aXplX2FuZF9wdXNoIChHc3RSdHBIMjYxUGF5ICogcGF5LCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgY29uc3QgZ3VpbnQ4ICogYml0cywgZ3NpemUgbGVuKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RCaXRSZWFkZXIgYnJfOworICBHc3RCaXRSZWFkZXIgKmJyID0gJmJyXzsKKyAgZ3VpbnQgbWF4X3BheWxvYWRfc2l6ZSA9CisgICAgICBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BheWxvYWRfbGVuIChHU1RfUlRQX0JBU0VfUEFZTE9BRF9NVFUgKHBheSkgLQorICAgICAgR1NUX1JUUF9IMjYxX1BBWUxPQURfSEVBREVSX0xFTiwgMCwgMCk7CisgIGd1aW50IHN0YXJ0cG9zOworICBnaW50IG51bV9nb2JzID0gMDsKKyAgR29iIGdvYnNbTUFYX05VTV9HT0JdOworICBHb2IgKmdvYjsKKyAgTWFjcm9ibG9jayBsYXN0X21iX2luX3ByZXZpb3VzX3BhY2tldCA9IHsgMCB9OworICBnYm9vbGVhbiBtYXJrZXI7CisgIFBhcnNlUmV0dXJuIHJlc3VsdDsKKworICBnc3RfYml0X3JlYWRlcl9pbml0IChiciwgYml0cywgbGVuKTsKKyAgZ3N0X2JpdF9yZWFkZXJfc2V0X3BvcyAoYnIsIHBheS0+b2Zmc2V0KTsKKyAgc3RhcnRwb3MgPSBwYXktPm9mZnNldDsKKworICBpZiAocGFyc2VfcGljdHVyZV9oZWFkZXIgKHBheSwgYnIsICZudW1fZ29icykgPCBQQVJTRV9PSykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGF5LCAiRmFpbGVkIHRvIHBhcnNlIHBpY3R1cmUgaGVhZGVyIik7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIGlmIChnc3RfcnRwX2gyNjFfcGF5X2luaXRfZ29icyAocGF5LCBnb2JzLCBudW1fZ29icywgYml0cywgbGVuLAorICAgICAgICAgIGdzdF9iaXRfcmVhZGVyX2dldF9wb3MgKGJyKSkgPCBQQVJTRV9PSykKKyAgICBnb3RvIGJlYWNoOworCisgIC8qIFNwbGl0LCBjcmVhdGUgYW5kIHB1c2ggcGFja2V0cyAqLworICBnb2IgPSBnb2JzOworICBtYXJrZXIgPSBGQUxTRTsKKyAgd2hpbGUgKG1hcmtlciA9PSBGQUxTRSAmJiByZXQgPT0gR1NUX0ZMT1dfT0spIHsKKyAgICBndWludCBlbmRwb3M7CisKKyAgICAvKiBDaGVjayBpZiB0aGVyZSBpcyB3cmFwIGFyb3VuZCBiZWNhdXNlIG9mIGV4dHJlbWVseSBoaWdoIE1UVSAqLworICAgIGVuZHBvcyA9IEdTVF9ST1VORF9ET1dOXzggKHN0YXJ0cG9zKSArIG1heF9wYXlsb2FkX3NpemUgKiA4OworICAgIGlmIChlbmRwb3MgPCBzdGFydHBvcykKKyAgICAgIGVuZHBvcyA9IEdfTUFYVUlOVDsKKworICAgIEdTVF9MT0dfT0JKRUNUIChwYXksICJOZXh0IHBhY2tldCBzdGFydHBvcyAldSBtYXhwb3MgJXUiLCBzdGFydHBvcywgZW5kcG9zKTsKKworICAgIC8qIEZpbmQgdGhlIGxhc3QgR09CIHRoYXQgZG9lcyBub3QgY29tcGxldGVseSBmaXQgaW4gcGFja2V0ICovCisgICAgZm9yICg7IGdvYiA8ICZnb2JzW251bV9nb2JzIC0gMV07IGdvYisrKSB7CisgICAgICBpZiAoYml0cmFuZ2VfdG9fYnl0ZXMgKHN0YXJ0cG9zLCBnb2ItPmVuZHBvcykgPiBtYXhfcGF5bG9hZF9zaXplKSB7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwYXksICJTcGxpdCBnb2IgKHN0YXJ0ICV1LCBlbmQgJXUpIiwKKyAgICAgICAgICAgIGdvYi0+c3RhcnRwb3MsIGdvYi0+ZW5kcG9zKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0YXJ0cG9zIDw9IGdvYi0+c3RhcnRwb3MpIHsKKyAgICAgIC8qIEZhc3QtZm9yd2FyZCB1bnRpbCBzdGFydCBvZiBHT0IgKi8KKyAgICAgIGdzdF9iaXRfcmVhZGVyX3NldF9wb3MgKGJyLCBnb2ItPnN0YXJ0cG9zKTsKKyAgICAgIGlmIChwYXJzZV9nb2JfaGVhZGVyIChwYXksIGJyLCBnb2IpIDwgUEFSU0VfT0spIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXksICJGYWlsZWQgdG8gcGFyc2UgR09CIGhlYWRlciIpOworICAgICAgICBnb3RvIGJlYWNoOworICAgICAgfQorICAgICAgZ29iLT5sYXN0Lm1iYSA9IDA7CisgICAgICBnb2ItPmxhc3QuZ29ibiA9IGdvYi0+Z247CisgICAgICBnb2ItPmxhc3QucXVhbnQgPSBnb2ItPmdxdWFudDsKKyAgICB9CisKKyAgICAvKiBQYXJzZSBNQnMgdG8gZmluZCBwb3NpdGlvbiB3aGVyZSB0byBzcGxpdC4gQ2FuIG9ubHkgYmUgZG9uZSBvbiBhZnRlciBNQgorICAgICAqIG9yIGF0IEdPQiBib3VuZGFyeS4gKi8KKyAgICByZXN1bHQgPSBwYXJzZV9tYl91bnRpbF9wb3MgKHBheSwgYnIsIGdvYiwgJmVuZHBvcyk7CisgICAgaWYgKHJlc3VsdCA8IFBBUlNFX09LKQorICAgICAgZ290byBiZWFjaDsKKworICAgIG1hcmtlciA9IHJlc3VsdCA9PSBQQVJTRV9FTkRfT0ZfRlJBTUU7CisgICAgcmV0ID0gZ3N0X3J0cF9oMjYxX3BheV9mcmFnbWVudF9wdXNoIChwYXksIGJ1ZmZlciwgYml0cywgc3RhcnRwb3MsIGVuZHBvcywKKyAgICAgICAgJmxhc3RfbWJfaW5fcHJldmlvdXNfcGFja2V0LCBtYXJrZXIpOworCisgICAgbGFzdF9tYl9pbl9wcmV2aW91c19wYWNrZXQgPSBnb2ItPmxhc3Q7CisgICAgaWYgKGVuZHBvcyA9PSBnb2ItPmVuZHBvcykKKyAgICAgIGdvYisrOworICAgIHN0YXJ0cG9zID0gZW5kcG9zOworICB9CisKK2JlYWNoOgorICByZXR1cm4gcmV0OworfQorCisvKiBTaGlmdCBidWZmZXIgdG8gcGFja2V0aXplIGEgY29udGludW91cyBzdHJlYW0gb2YgYml0cyAobm90IGJ5dGVzKS4gU29tZQorICogcGF5bG9hZGVycy9kZWNvZGVycyBhcmUgdmVyeSBwaWNreSBhYm91dCBjb3JyZWN0IHNiaXQvZWJpdCBmb3IgZnJhbWVzLiAqLworc3RhdGljIGd1aW50OCAqCitnc3RfcnRwX2gyNjFfcGF5X3NoaWZ0X2J1ZmZlciAoR3N0UnRwSDI2MVBheSAqIHBheSwgY29uc3QgZ3VpbnQ4ICogZGF0YSwKKyAgICBnc2l6ZSBzaXplLCBnaW50IG9mZnNldCwgZ3NpemUgKiBuZXdzaXplKQoreworICAvKiBJbiBvcmRlciB0byByZWFkIHZhcmlhYmxlIGxlbmd0aCBjb2RlcyBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIGJ1ZmZlcgorICAgKiB3aWhvdXQgcGVla2luZyBpbnRvIHBvc3NpYmx5IHVuYWxsb2NhdGVkIGRhdGEsIHdlIHBhZCB3aXRoIGV4dHJhIDAncworICAgKiB3aGljaCB3aWxsIGdlbmVyYXRlIGFuIGludmFsaWQgY29kZSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICovCisgIGd1aW50IHBhZCA9IDQ7CisgIGdzaXplIGFsbG9jc2l6ZSA9IHNpemUgKyBwYWQ7CisgIGd1aW50OCAqYml0cyA9IGdfbWFsbG9jIChhbGxvY3NpemUpOworICBnaW50IGk7CisKKyAgaWYgKG9mZnNldCA9PSAwKSB7CisgICAgbWVtY3B5IChiaXRzLCBkYXRhLCBzaXplKTsKKyAgICAqbmV3c2l6ZSA9IHNpemU7CisgIH0gZWxzZSBpZiAob2Zmc2V0ID4gMCkgeworICAgIGJpdHNbMF0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgIGJpdHNbaV0gfD0gZGF0YVtpXSA+PiBvZmZzZXQ7CisgICAgICBiaXRzW2kgKyAxXSA9IGRhdGFbaV0gPDwgKDggLSBvZmZzZXQpOworICAgIH0KKyAgICAqbmV3c2l6ZSA9IHNpemUgKyAxOworICB9IGVsc2UgeworICAgIGdpbnQgc2hpZnQgPSAtb2Zmc2V0OworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplIC0gMTsgaSsrKQorICAgICAgYml0c1tpXSA9IChkYXRhW2ldIDw8IHNoaWZ0KSB8IChkYXRhW2kgKyAxXSA+PiAoOCAtIHNoaWZ0KSk7CisgICAgYml0c1tpXSA9IGRhdGFbaV0gPDwgc2hpZnQ7CisgICAgKm5ld3NpemUgPSBzaXplOworICB9CisgIGZvciAoaSA9ICpuZXdzaXplOyBpIDwgYWxsb2NzaXplOyBpKyspCisgICAgYml0c1tpXSA9IDA7CisKKyAgcmV0dXJuIGJpdHM7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2gyNjFfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RSdHBIMjYxUGF5ICpwYXkgPSBHU1RfUlRQX0gyNjFfUEFZIChwYXlsb2FkKTsKKyAgZ3NpemUgbGVuOworICBndWludDggKmJpdHM7CisgIGdpbnQgcHNjX29mZnNldCwgc2hpZnQ7CisgIEdzdE1hcEluZm8gbWFwOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBheSwgIkhhbmRsZSBidWZmZXIgb2Ygc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcikpOworCisgIHBheS0+dGltZXN0YW1wID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcik7CisKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpIHx8ICFtYXAuZGF0YSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGF5LCAiRmFpbGVkIHRvIG1hcCBidWZmZXIiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KKworICBwc2Nfb2Zmc2V0ID0gZmluZF9waWN0dXJlX2hlYWRlcl9vZmZzZXQgKG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgIGlmIChwc2Nfb2Zmc2V0IDwgMCkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGF5LCAiRmFpbGVkIHRvIGZpbmQgcGljdHVyZSBoZWFkZXIgb2Zmc2V0Iik7CisgICAgZ290byBiZWFjaDsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXksICJQaWN0dXJlIGhlYWRlciBvZmZzZXQ6ICVkIiwgcHNjX29mZnNldCk7CisgIH0KKworICBzaGlmdCA9IHBheS0+b2Zmc2V0IC0gcHNjX29mZnNldDsKKyAgYml0cyA9IGdzdF9ydHBfaDI2MV9wYXlfc2hpZnRfYnVmZmVyIChwYXksIG1hcC5kYXRhLCBtYXAuc2l6ZSwgc2hpZnQsICZsZW4pOworICByZXQgPSBnc3RfcnRwX2gyNjFfcGFja2V0aXplX2FuZF9wdXNoIChwYXksIGJ1ZmZlciwgYml0cywgbGVuKTsKKyAgZ19mcmVlIChiaXRzKTsKKworYmVhY2g6CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2gyNjFfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIGdib29sZWFuIHJlczsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAocGF5bG9hZCwgInZpZGVvIiwKKyAgICAgIHBheWxvYWQtPnB0ICE9IEdTVF9SVFBfUEFZTE9BRF9IMjYxLCAiSDI2MSIsIDkwMDAwKTsKKyAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHBheWxvYWQsIE5VTEwpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjFfcGF5X2luaXQgKEdzdFJ0cEgyNjFQYXkgKiBwYXkpCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkICpwYXlsb2FkID0gR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHBheSk7CisgIHBheWxvYWQtPnB0ID0gR1NUX1JUUF9QQVlMT0FEX0gyNjE7CisgIHBheS0+b2Zmc2V0ID0gMDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2MV9wYXlfY2xhc3NfaW5pdCAoR3N0UnRwSDI2MVBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gR1NUX1JUUF9CQVNFX1BBWUxPQURfQ0xBU1MgKGtsYXNzKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2gyNjFfcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfaDI2MV9wYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgSDI2MSBwYWNrZXQgcGF5bG9hZGVyIiwgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZC1lbmNvZGVzIEgyNjEgdmlkZW8gaW4gUlRQIHBhY2tldHMgKFJGQyA0NTg3KSIsCisgICAgICAiU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+Iik7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9oMjYxX3BheV9zZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2J1ZmZlciA9IGdzdF9ydHBfaDI2MV9wYXlfaGFuZGxlX2J1ZmZlcjsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwaDI2MXBheV9kZWJ1ZywgInJ0cGgyNjFwYXkiLCAwLAorICAgICAgIkgyNjEgUlRQIFBheWxvYWRlciIpOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9oMjYxX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGgyNjFwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfSDI2MV9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBoMjYxcGF5LmggYi9nc3QvcnRwL2dzdHJ0cGgyNjFwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWU0YmYyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBoMjYxcGF5LmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAxND4gU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQXV0aG9yOiBEZWphbiBTYWtlbHNhayBzYWhlbEBraWJlcnBpcGEub3JnCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfSDI2MV9QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9IMjYxX1BBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VwYXlsb2FkLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9IMjYxX1BBWSAgICAgICAgICAgICAgICAgICBcCisgIChnc3RfcnRwX2gyNjFfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfSDI2MV9QQVkob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfSDI2MV9QQVksR3N0UnRwSDI2MVBheSkpCisjZGVmaW5lIEdTVF9SVFBfSDI2MV9QQVlfQ0xBU1Moa2xhc3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9IMjYxX1BBWSxHc3RSdHBIMjYxUGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0gyNjFfUEFZKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0gyNjFfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9IMjYxX1BBWV9DTEFTUyhrbGFzcykgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0gyNjFfUEFZKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBIMjYxUGF5Q2xhc3MgR3N0UnRwSDI2MVBheUNsYXNzOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjFQYXkgR3N0UnRwSDI2MVBheTsKKworc3RydWN0IF9Hc3RSdHBIMjYxUGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkIHBheWxvYWQ7CisKKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKKyAgZ2ludCBvZmZzZXQ7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cEgyNjFQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBIMjYxUGF5SGVhZGVyCit7CisjaWYgR19CWVRFX09SREVSID09IEdfTElUVExFX0VORElBTgorICB1bnNpZ25lZCBpbnQgdjoxOyAgICAgICAgICAgICAvKiBNb3Rpb24gdmVjdG9yIGZsYWcgKi8KKyAgdW5zaWduZWQgaW50IGk6MTsgICAgICAgICAgICAgLyogSW50cmEgZW5jb2RlZCBkYXRhICovCisgIHVuc2lnbmVkIGludCBlYml0OjM7ICAgICAgICAgIC8qIEVuZCBwb3NpdGlvbiAqLworICB1bnNpZ25lZCBpbnQgc2JpdDozOyAgICAgICAgICAvKiBTdGFydCBwb3NpdGlvbiAqLworCisgIHVuc2lnbmVkIGludCBtYmFwMTo0OyAgICAgICAgIC8qIE1CIGFkZHJlc3MgcHJlZGljdG9yIC0gcGFydDEgKi8KKyAgdW5zaWduZWQgaW50IGdvYm46NDsgICAgICAgICAgLyogR09CIG51bWJlciAqLworCisgIHVuc2lnbmVkIGludCBobXZkMToyOyAgICAgICAgIC8qIEhvcml6b250YWwgbW90aW9uIHZlY3RvciBkYXRhIC0gcGFydDEgKi8KKyAgdW5zaWduZWQgaW50IHF1YW50OjU7ICAgICAgICAgLyogUXVhbnRpemVyICovCisgIHVuc2lnbmVkIGludCBtYmFwMjoxOyAgICAgICAgIC8qIE1CIGFkZHJlc3MgcHJlZGljdG9yIC0gcGFydDIgKi8KKworICB1bnNpZ25lZCBpbnQgdm12ZDo1OyAgICAgICAgICAvKiBIb3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgZGF0YSAtIHBhcnQxICovCisgIHVuc2lnbmVkIGludCBobXZkMjozOyAgICAgICAgIC8qIFZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgZGF0YSAqLworI2VsaWYgR19CWVRFX09SREVSID09IEdfQklHX0VORElBTgorICB1bnNpZ25lZCBpbnQgc2JpdDozOyAgICAgICAgICAvKiBTdGFydCBwb3NpdGlvbiAqLworICB1bnNpZ25lZCBpbnQgZWJpdDozOyAgICAgICAgICAvKiBFbmQgcG9zaXRpb24gKi8KKyAgdW5zaWduZWQgaW50IGk6MTsgICAgICAgICAgICAgLyogSW50cmEgZW5jb2RlZCBkYXRhICovCisgIHVuc2lnbmVkIGludCB2OjE7ICAgICAgICAgICAgIC8qIE1vdGlvbiB2ZWN0b3IgZmxhZyAqLworCisgIHVuc2lnbmVkIGludCBnb2JuOjQ7ICAgICAgICAgIC8qIEdPQiBudW1iZXIgKi8KKyAgdW5zaWduZWQgaW50IG1iYXAxOjQ7ICAgICAgICAgLyogTUIgYWRkcmVzcyBwcmVkaWN0b3IgLSBwYXJ0MSAqLworCisgIHVuc2lnbmVkIGludCBtYmFwMjoxOyAgICAgICAgIC8qIE1CIGFkZHJlc3MgcHJlZGljdG9yIC0gcGFydDIgKi8KKyAgdW5zaWduZWQgaW50IHF1YW50OjU7ICAgICAgICAgLyogUXVhbnRpemVyICovCisgIHVuc2lnbmVkIGludCBobXZkMToyOyAgICAgICAgIC8qIEhvcml6b250YWwgbW90aW9uIHZlY3RvciBkYXRhIC0gcGFydDEgKi8KKworICB1bnNpZ25lZCBpbnQgaG12ZDI6MzsgICAgICAgICAvKiBWZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGRhdGEgKi8KKyAgdW5zaWduZWQgaW50IHZtdmQ6NTsgICAgICAgICAgLyogSG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGRhdGEgLSBwYXJ0MSAqLworI2Vsc2UKKyNlcnJvciAiR19CWVRFX09SREVSIHNob3VsZCBiZSBiaWcgb3IgbGl0dGxlIGVuZGlhbi4iCisjZW5kaWYKK30gR3N0UnRwSDI2MVBheUhlYWRlcjsKKyNkZWZpbmUgR1NUX1JUUF9IMjYxX1BBWUxPQURfSEVBREVSX0xFTiA0CisKK0dUeXBlIGdzdF9ydHBfaDI2MV9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2gyNjFfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1JUUF9IMjYxX1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NmY5MTcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5jCkBAIC0wLDAgKzEsNDQ3IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IDIwMDcgQ29sbGFib3JhIEx0ZCwKKyAqICBAYXV0aG9yOiBQaGlsaXBwZSBLYWxhZiA8cGhpbGlwcGUua2FsYWZAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKiAgICAgICAgICAgICAgIDwyMDA3PiBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgImdzdHJ0cGgyNjNkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cGgyNjNkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwaDI2M2RlcGF5X2RlYnVnKQorCisjZGVmaW5lIEdTVF9SRkMyMTkwQV9IRUFERVJfTEVOIDQKKyNkZWZpbmUgR1NUX1JGQzIxOTBCX0hFQURFUl9MRU4gOAorI2RlZmluZSBHU1RfUkZDMjE5MENfSEVBREVSX0xFTiAxMgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9oMjYzX2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1oMjYzLCAiCisgICAgICAgICJ2YXJpYW50ID0gKHN0cmluZykgXCJpdHVcIiwgIiAiaDI2M3ZlcnNpb24gPSAoc3RyaW5nKSBcImgyNjNcIiIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2M19kZXBheV9zaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9IMjYzX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDA7ICIKKyAgICAgICAgLyogb3B0aW9uYWwgU0RQIGF0dHJpYnV0ZToKKyAgICAgICAgICogImEtZnJhbWVzaXplID0gKHN0cmluZykgXCIxMjM0LTEyMzRcIiwgIgorICAgICAgICAgKi8KKyAgICAgICAgImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJIMjYzXCIiCisgICAgICAgIC8qIG9wdGlvbmFsIFNEUCBhdHRyaWJ1dGU6CisgICAgICAgICAqICJhLWZyYW1lc2l6ZSA9IChzdHJpbmcpIFwiMTIzNC0xMjM0XCIsICIKKyAgICAgICAgICovCisgICAgKQorICAgICk7CisKKyNkZWZpbmUgZ3N0X3J0cF9oMjYzX2RlcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cEgyNjNEZXBheSwgZ3N0X3J0cF9oMjYzX2RlcGF5LAorICAgIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2M19kZXBheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX2gyNjNfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9oMjYzX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKK2dib29sZWFuIGdzdF9ydHBfaDI2M19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZmlsdGVyLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2M19kZXBheV9jbGFzc19pbml0IChHc3RSdHBIMjYzRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBoMjYzZGVwYXlfZGVidWcsICJydHBoMjYzZGVwYXkiLCAwLAorICAgICAgIkgyNjMgVmlkZW8gUlRQIERlcGF5bG9hZGVyIik7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfaDI2M19kZXBheV9maW5hbGl6ZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfcnRwX2gyNjNfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfaDI2M19kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2gyNjNfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgSDI2MyBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgSDI2MyB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMjE5MCkiLAorICAgICAgIlBoaWxpcHBlIEthbGFmIDxwaGlsaXBwZS5rYWxhZkBjb2xsYWJvcmEuY28udWs+LCAiCisgICAgICAiRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4iKTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX2gyNjNfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2gyNjNfZGVwYXlfc2V0Y2FwczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2M19kZXBheV9pbml0IChHc3RSdHBIMjYzRGVwYXkgKiBydHBoMjYzZGVwYXkpCit7CisgIHJ0cGgyNjNkZXBheS0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKKworICBydHBoMjYzZGVwYXktPm9mZnNldCA9IDA7CisgIHJ0cGgyNjNkZXBheS0+bGVmdG92ZXIgPSAwOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYzX2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSdHBIMjYzRGVwYXkgKnJ0cGgyNjNkZXBheTsKKworICBydHBoMjYzZGVwYXkgPSBHU1RfUlRQX0gyNjNfREVQQVkgKG9iamVjdCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHJ0cGgyNjNkZXBheS0+YWRhcHRlcik7CisgIHJ0cGgyNjNkZXBheS0+YWRhcHRlciA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2M19wYXJzZV9mcmFtZXNpemUgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBmaWx0ZXIsCisgICAgY29uc3QgZ2NoYXIgKiBtZWRpYV9hdHRyLCBHc3RDYXBzICogc3JjY2FwcykKK3sKKyAgZ2NoYXIgKmRpbWVuc2lvbiwgKmVuZHB0cjsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBHc3RTdHJ1Y3R1cmUgKmQ7CisKKyAgd2lkdGggPSBnX2FzY2lpX3N0cnRvdWxsIChtZWRpYV9hdHRyLCAmZW5kcHRyLCAxMCk7CisgIGlmICh3aWR0aCA8PSAwKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZmlsdGVyLAorICAgICAgICAiRnJhbWVzaXplIG1lZGlhIGF0dHJpYnV0ZSB3aWR0aCBvdXQgb2YgdmFsaWQgcmFuZ2UiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0gZWxzZSBpZiAoKmVuZHB0ciAhPSAnLScpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChmaWx0ZXIsCisgICAgICAgICJGcmFtZXNpemUgbWVkaWEgYXR0cmlidXRlIGhhcyBpbnZhbGlkIGRpbWVuc2lvbiBzZXBhcmF0b3IiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBkaW1lbnNpb24gPSBlbmRwdHIgKyAxOworICBoZWlnaHQgPSBnX2FzY2lpX3N0cnRvdWxsIChkaW1lbnNpb24sICZlbmRwdHIsIDEwKTsKKyAgaWYgKGhlaWdodCA8PSAwKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZmlsdGVyLAorICAgICAgICAiRnJhbWVzaXplIG1lZGlhIGF0dHJpYnV0ZSBoZWlnaHQgb3V0IG9mIHZhbGlkIHJhbmdlIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9IGVsc2UgaWYgKCplbmRwdHIgIT0gJ1wwJykgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGZpbHRlciwKKyAgICAgICAgIkZyYW1lc2l6ZSBtZWRpYSBhdHRyaWJ1dGUgdW5leHBlY3RlZGx5IGhhcyB0cmFpbGluZyBjaGFyYWN0ZXJzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgZCA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHNyY2NhcHMsIDApOworICBnc3Rfc3RydWN0dXJlX3NldCAoZCwgIndpZHRoIiwgR19UWVBFX0lOVCwgd2lkdGgsICJoZWlnaHQiLCBHX1RZUEVfSU5ULAorICAgICAgaGVpZ2h0LCBOVUxMKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2M19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZmlsdGVyLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0Q2FwcyAqc3JjY2FwczsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgZ2ludCBjbG9ja19yYXRlOworICBjb25zdCBnY2hhciAqZnJhbWVzaXplOworCisgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1oMjYzIiwKKyAgICAgICJ2YXJpYW50IiwgR19UWVBFX1NUUklORywgIml0dSIsCisgICAgICAiaDI2M3ZlcnNpb24iLCBHX1RZUEVfU1RSSU5HLCAiaDI2MyIsIE5VTEwpOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSA5MDAwMDsgICAgICAgICAvKiBkZWZhdWx0ICovCisgIGZpbHRlci0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgZnJhbWVzaXplID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJhLWZyYW1lc2l6ZSIpOworICBpZiAoZnJhbWVzaXplICE9IE5VTEwpIHsKKyAgICBpZiAoIWdzdF9ydHBfaDI2M19wYXJzZV9mcmFtZXNpemUgKGZpbHRlciwgZnJhbWVzaXplLCBzcmNjYXBzKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorCisgIGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChmaWx0ZXIpLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfaDI2M19kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cEgyNjNEZXBheSAqcnRwaDI2M2RlcGF5OworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ2ludCBwYXlsb2FkX2xlbjsKKyAgZ3VpbnQ4ICpwYXlsb2FkOworICBndWludCBoZWFkZXJfbGVuOworICBndWludCBTQklULCBFQklUOworICBnYm9vbGVhbiBGLCBQLCBNOworICBnYm9vbGVhbiBJOworCisgIHJ0cGgyNjNkZXBheSA9IEdTVF9SVFBfSDI2M19ERVBBWSAoZGVwYXlsb2FkKTsKKworICAvKiBmbHVzaCByZW1haW5pbmcgZGF0YSBvbiBkaXNjb250ICovCisgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKHJ0cC0+YnVmZmVyKSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChkZXBheWxvYWQsICJEaXNjb250IGJ1ZmZlciwgZmx1c2hpbmcgYWRhcHRlciIpOworICAgIGdzdF9hZGFwdGVyX2NsZWFyIChydHBoMjYzZGVwYXktPmFkYXB0ZXIpOworICAgIHJ0cGgyNjNkZXBheS0+b2Zmc2V0ID0gMDsKKyAgICBydHBoMjYzZGVwYXktPmxlZnRvdmVyID0gMDsKKyAgICBydHBoMjYzZGVwYXktPnN0YXJ0ID0gRkFMU0U7CisgIH0KKworICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAocnRwKTsKKyAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkIChydHApOworCisgIE0gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApOworCisgIGlmIChwYXlsb2FkX2xlbiA8IDEpCisgICAgZ290byB0b29fc21hbGw7CisKKyAgLyogTGV0J3Mgc2VlIHdoYXQgbW9kZSB3ZSBhcmUgdXNpbmcgKi8KKyAgRiA9IChwYXlsb2FkWzBdICYgMHg4MCkgPT0gMHg4MDsKKyAgUCA9IChwYXlsb2FkWzBdICYgMHg0MCkgPT0gMHg0MDsKKworICAvKiBCaXQgc2hpZnRpbmcgKi8KKyAgU0JJVCA9IChwYXlsb2FkWzBdICYgMHgzOCkgPj4gMzsKKyAgRUJJVCA9IChwYXlsb2FkWzBdICYgMHgwNyk7CisKKyAgLyogRmlndXJlIG91dCBoZWFkZXIgbGVuZ3RoIGFuZCBJLWZsYWcgKi8KKyAgaWYgKEYgPT0gMCkgeworICAgIC8qIEYgPT0gMCBhbmQgUCA9PSAwIG9yIDEKKyAgICAgKiBtb2RlIEEgKi8KKyAgICBoZWFkZXJfbGVuID0gR1NUX1JGQzIxOTBBX0hFQURFUl9MRU47CisgICAgR1NUX0xPRyAoIk1vZGUgQSIpOworCisgICAgLyogMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAqIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICogfEZ8UHxTQklUIHxFQklUIHwgU1JDIHxJfFV8U3xBfFIgICAgICB8REJRfCBUUkIgfCAgICBUUiAgICAgICAgIHwKKyAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAqLworICAgIGlmIChwYXlsb2FkX2xlbiA8PSBoZWFkZXJfbGVuKQorICAgICAgZ290byB0b29fc21hbGw7CisgICAgSSA9IChwYXlsb2FkWzFdICYgMHgxMCkgPT0gMHgxMDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoUCA9PSAwKSB7CisgICAgICAvKiBGID09IDEgYW5kIFAgPT0gMAorICAgICAgICogbW9kZSBCICovCisgICAgICBoZWFkZXJfbGVuID0gR1NUX1JGQzIxOTBCX0hFQURFUl9MRU47CisgICAgICBHU1RfTE9HICgiTW9kZSBCIik7CisKKyAgICAgIC8qIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgICAqIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAqIHxGfFB8U0JJVCB8RUJJVCB8IFNSQyB8IFFVQU5UICAgfCAgR09CTiAgIHwgICBNQkEgICAgICAgICAgIHxSICB8CisgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICogfEl8VXxTfEF8IEhNVjEgICAgICAgIHwgVk1WMSAgICAgICAgfCBITVYyICAgICAgICB8IFZNVjIgICAgICAgIHwKKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKi8KKyAgICAgIGlmIChwYXlsb2FkX2xlbiA8PSBoZWFkZXJfbGVuKQorICAgICAgICBnb3RvIHRvb19zbWFsbDsKKyAgICAgIEkgPSAocGF5bG9hZFs0XSAmIDB4ODApID09IDB4ODA7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEYgPT0gMSBhbmQgUCA9PSAxCisgICAgICAgKiBtb2RlIEMgKi8KKyAgICAgIGhlYWRlcl9sZW4gPSBHU1RfUkZDMjE5MENfSEVBREVSX0xFTjsKKyAgICAgIEdTVF9MT0cgKCJNb2RlIEMiKTsKKworICAgICAgLyogMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAgICogMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICogfEZ8UHxTQklUIHxFQklUIHwgU1JDIHwgUVVBTlQgICB8ICBHT0JOICAgfCAgIE1CQSAgICAgICAgICAgfFIgIHwKKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKiB8SXxVfFN8QXwgSE1WMSAgICAgICAgfCBWTVYxICAgICAgICB8IEhNVjIgICAgICAgIHwgVk1WMiAgICAgICAgfAorICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAqIHwgUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfERCUXwgVFJCIHwgICAgVFIgICAgICAgICB8CisgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICovCisgICAgICBpZiAocGF5bG9hZF9sZW4gPD0gaGVhZGVyX2xlbikKKyAgICAgICAgZ290byB0b29fc21hbGw7CisgICAgICBJID0gKHBheWxvYWRbNF0gJiAweDgwKSA9PSAweDgwOworICAgIH0KKyAgfQorCisgIEdTVF9MT0cgKCJGL1AvTS9JIDogJWQvJWQvJWQvJWQiLCBGLCBQLCBNLCBJKTsKKyAgR1NUX0xPRyAoIlNCSVQgOiAlZCAsIEVCSVQgOiAlZCIsIFNCSVQsIEVCSVQpOworICBHU1RfTE9HICgicGF5bG9hZF9sZW4gOiAlZCwgaGVhZGVyX2xlbiA6ICVkICwgbGVmdG92ZXIgOiAweCV4IiwKKyAgICAgIHBheWxvYWRfbGVuLCBoZWFkZXJfbGVuLCBydHBoMjYzZGVwYXktPmxlZnRvdmVyKTsKKworICAvKiBza2lwIGhlYWRlciAqLworICBwYXlsb2FkICs9IGhlYWRlcl9sZW47CisgIHBheWxvYWRfbGVuIC09IGhlYWRlcl9sZW47CisKKyAgaWYgKCFydHBoMjYzZGVwYXktPnN0YXJ0KSB7CisgICAgLyogb25seSBtb2RlIEEgc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGVyZSBpcyBhIHBpY3R1cmUgc3RhcnQgY29kZSwgYnV0CisgICAgICogYnVnZ3kgcGF5bG9hZGVycyBtYXkgc2VuZCBtb2RlIEIvQyBpbiBzdGFydCBvZiBmcmFtZSAqLworICAgIGlmIChwYXlsb2FkX2xlbiA+IDQgJiYgKEdTVF9SRUFEX1VJTlQzMl9CRSAocGF5bG9hZCkgPj4gMTAgPT0gMHgyMCkpIHsKKyAgICAgIEdTVF9ERUJVRyAoIk1vZGUgJWMgd2l0aCBQU0MgPT4gZnJhbWUgc3RhcnQiLCAiQUJDIltGICsgUF0pOworICAgICAgcnRwaDI2M2RlcGF5LT5zdGFydCA9IFRSVUU7CisgICAgICBpZiAoKCEgIShwYXlsb2FkWzRdICYgMHgwMikpICE9IEkpIHsKKyAgICAgICAgR1NUX0RFQlVHICgiV3JvbmcgUGljdHVyZSBDb2RpbmcgVHlwZSBGbGFnIGluIHJ0cCBoZWFkZXIiKTsKKyAgICAgICAgSSA9ICFJOworICAgICAgfQorICAgICAgcnRwaDI2M2RlcGF5LT5wc2NfSSA9IEk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVRyAoIm5vIGZyYW1lIHN0YXJ0IHlldCwgc2tpcHBpbmcgcGF5bG9hZCIpOworICAgICAgZ290byBza2lwOworICAgIH0KKyAgfQorCisgIC8qIG9ubHkgdHJ1c3QgSSBpbmZvIGZyb20gTW9kZSBBIHN0YXJ0aW5nIHBhY2tldAorICAgKiBmcm9tIGJ1Z2d5IHBheWxvYWRlcnMgb3IgaHcgKi8KKyAgSSA9IHJ0cGgyNjNkZXBheS0+cHNjX0k7CisKKyAgaWYgKFNCSVQpIHsKKyAgICAvKiB0YWtlIHRoZSBsZWZ0b3ZlciBhbmQgbWVyZ2UgaXQgYXQgdGhlIGJlZ2lubmluZywgRklYTUUgbWFrZSB0aGUgYnVmZmVyCisgICAgICogZGF0YSB3cml0YWJsZS4gKi8KKyAgICBHU1RfTE9HICgicGF5bG9hZFswXSA6IDB4JXgiLCBwYXlsb2FkWzBdKTsKKyAgICBwYXlsb2FkWzBdICY9IDB4RkYgPj4gU0JJVDsKKyAgICBHU1RfTE9HICgicGF5bG9hZFswXSA6IDB4JXgiLCBwYXlsb2FkWzBdKTsKKyAgICBwYXlsb2FkWzBdIHw9IHJ0cGgyNjNkZXBheS0+bGVmdG92ZXI7CisgICAgR1NUX0xPRyAoInBheWxvYWRbMF0gOiAweCV4IiwgcGF5bG9hZFswXSk7CisgICAgcnRwaDI2M2RlcGF5LT5sZWZ0b3ZlciA9IDA7CisgICAgcnRwaDI2M2RlcGF5LT5vZmZzZXQgPSAwOworICB9CisKKyAgaWYgKCFFQklUKSB7CisgICAgR3N0QnVmZmVyICp0bXA7CisKKyAgICAvKiBUYWtlIHRoZSBlbnRpcmUgYnVmZmVyICovCisgICAgdG1wID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfc3ViYnVmZmVyIChydHAsIGhlYWRlcl9sZW4sIHBheWxvYWRfbGVuKTsKKyAgICBnc3RfYWRhcHRlcl9wdXNoIChydHBoMjYzZGVwYXktPmFkYXB0ZXIsIHRtcCk7CisgIH0gZWxzZSB7CisgICAgR3N0QnVmZmVyICp0bXA7CisKKyAgICAvKiBUYWtlIHRoZSBlbnRpcmUgYnVmZmVyIGV4Y2VwdCBmb3IgdGhlIGxhc3QgYnl0ZSAqLworICAgIHRtcCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3N1YmJ1ZmZlciAocnRwLCBoZWFkZXJfbGVuLAorICAgICAgICBwYXlsb2FkX2xlbiAtIDEpOworICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGgyNjNkZXBheS0+YWRhcHRlciwgdG1wKTsKKworICAgIC8qIFB1dCB0aGUgbGFzdCBieXRlIGludG8gdGhlIGxlZnRvdmVyICovCisgICAgR1NUX0RFQlVHICgicGF5bG9hZFtwYXlsb2FkX2xlbiAtIDFdIDogMHgleCIsIHBheWxvYWRbcGF5bG9hZF9sZW4gLSAxXSk7CisgICAgR1NUX0RFQlVHICgibWFzayA6IDB4JXgiLCAweEZGIDw8IEVCSVQpOworICAgIHJ0cGgyNjNkZXBheS0+bGVmdG92ZXIgPSAocGF5bG9hZFtwYXlsb2FkX2xlbiAtIDFdID4+IEVCSVQpIDw8IEVCSVQ7CisgICAgcnRwaDI2M2RlcGF5LT5vZmZzZXQgPSAxOworICAgIEdTVF9ERUJVRyAoImxlZnRvdmVyIDogMHgleCIsIHJ0cGgyNjNkZXBheS0+bGVmdG92ZXIpOworICB9CisKK3NraXA6CisgIGlmIChNKSB7CisgICAgaWYgKHJ0cGgyNjNkZXBheS0+c3RhcnQpIHsKKyAgICAgIC8qIGZyYW1lIGlzIGNvbXBsZXRlZCAqLworICAgICAgZ3VpbnQgYXZhaWw7CisKKyAgICAgIGlmIChydHBoMjYzZGVwYXktPm9mZnNldCkgeworICAgICAgICAvKiBwdXNoIGluIHRoZSBsZWZ0b3ZlciAqLworICAgICAgICBHc3RCdWZmZXIgKmJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMSk7CisKKyAgICAgICAgR1NUX0RFQlVHICgiUHVzaGluZyBsZWZ0b3ZlciBpbiBhZGFwdGVyIik7CisgICAgICAgIGdzdF9idWZmZXJfZmlsbCAoYnVmLCAwLCAmcnRwaDI2M2RlcGF5LT5sZWZ0b3ZlciwgMSk7CisgICAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGgyNjNkZXBheS0+YWRhcHRlciwgYnVmKTsKKyAgICAgIH0KKworICAgICAgYXZhaWwgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHJ0cGgyNjNkZXBheS0+YWRhcHRlcik7CisgICAgICBvdXRidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRwaDI2M2RlcGF5LT5hZGFwdGVyLCBhdmFpbCk7CisKKyAgICAgIGlmIChJKQorICAgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKTsKKworICAgICAgR1NUX0RFQlVHICgiUHVzaGluZyBvdXQgYSBidWZmZXIgb2YgJWQgYnl0ZXMiLCBhdmFpbCk7CisKKyAgICAgIGdzdF9ydHBfZHJvcF9ub25fdmlkZW9fbWV0YSAocnRwaDI2M2RlcGF5LCBvdXRidWYpOworCisgICAgICBnc3RfcnRwX2Jhc2VfZGVwYXlsb2FkX3B1c2ggKGRlcGF5bG9hZCwgb3V0YnVmKTsKKyAgICAgIHJ0cGgyNjNkZXBheS0+b2Zmc2V0ID0gMDsKKyAgICAgIHJ0cGgyNjNkZXBheS0+bGVmdG92ZXIgPSAwOworICAgICAgcnRwaDI2M2RlcGF5LT5zdGFydCA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICBydHBoMjYzZGVwYXktPnN0YXJ0ID0gVFJVRTsKKyAgICB9CisgIH0KKworICByZXR1cm4gTlVMTDsKKwordG9vX3NtYWxsOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwaDI2M2RlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJQYWNrZXQgcGF5bG9hZCB3YXMgdG9vIHNtYWxsIiksIChOVUxMKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2gyNjNfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RSdHBIMjYzRGVwYXkgKnJ0cGgyNjNkZXBheTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHJ0cGgyNjNkZXBheSA9IEdTVF9SVFBfSDI2M19ERVBBWSAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGgyNjNkZXBheS0+YWRhcHRlcik7CisgICAgICBydHBoMjYzZGVwYXktPnN0YXJ0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2gyNjNfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBoMjYzZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfSDI2M19ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDljYTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuaApAQCAtMCwwICsxLDY2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfSDI2M19ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0gyNjNfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0gyNjNfREVQQVkgXAorICAoZ3N0X3J0cF9oMjYzX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfSDI2M19ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9IMjYzX0RFUEFZLEdzdFJ0cEgyNjNEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfSDI2M19ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSDI2M19ERVBBWSxHc3RSdHBIMjYzRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfSDI2M19ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9IMjYzX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9IMjYzX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9IMjYzX0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjNEZXBheSBHc3RSdHBIMjYzRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSDI2M0RlcGF5Q2xhc3MgR3N0UnRwSDI2M0RlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwSDI2M0RlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworCisgIGd1aW50OCBvZmZzZXQ7CS8qIG9mZnNldCB0byBhcHBseSB0byBuZXh0IHBheWxvYWQgKi8KKyAgZ3VpbnQ4IGxlZnRvdmVyOwkvKiBsZWZ0b3ZlciBmcm9tIHByZXZpb3VzIHBheWxvYWQgKGlmIG9mZnNldCAhPSAwKSAqLworICBnYm9vbGVhbiBwc2NfSTsgICAgICAgLyogUGljdHVyZS1Db2RpbmctVHlwZSA9PSBJIGZyb20gUGljdHVyZSBTdGFydCBDb2RlIHBhY2tldCAqLworICBHc3RBZGFwdGVyICphZGFwdGVyOworICBnYm9vbGVhbiBzdGFydDsKK307CisKK3N0cnVjdCBfR3N0UnRwSDI2M0RlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfaDI2M19kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfaDI2M19kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9IMjYzX0RFUEFZX0hfXyAqLworCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwaDI2M3BheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNjNiY2QKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYwpAQCAtMCwwICsxLDE4NjkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDg+IERlamFuIFNha2Vsc2FrIDxkZWphbi5zYWtlbHNha0BtYXJhbmQuc2k+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBKYW5pbiBLb2xlbmMgIDxqYW5pbi5rb2xlbmNAbWFyYW5kLnNpPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSAiZ3N0cnRwaDI2M3BheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK3R5cGVkZWYgZW51bQoreworICBHU1RfSDI2M19GUkFNRV9UWVBFX0kgPSAwLAorICBHU1RfSDI2M19GUkFNRV9UWVBFX1AgPSAxLAorICBHU1RfSDI2M19GUkFNRV9UWVBFX1BCID0gMgorfSBHc3RSdHBIMjYzUGF5RnJhbWVUeXBlOworCit0eXBlZGVmIGVudW0KK3sKKyAgR1NUX1JUUF9IMjYzX1BBWUxPQURfUElDVFVSRV9GT1JNQVRfUkVTMSA9IDAsCisgIEdTVF9SVFBfSDI2M19QQVlMT0FEX1BJQ1RVUkVfRk9STUFUX1NRQ0lGID0gMSwKKyAgR1NUX1JUUF9IMjYzX1BBWUxPQURfUElDVFVSRV9GT1JNQVRfUUNJRiA9IDIsCisgIEdTVF9SVFBfSDI2M19QQVlMT0FEX1BJQ1RVUkVfRk9STUFUX0NJRiA9IDMsCisgIEdTVF9SVFBfSDI2M19QQVlMT0FEX1BJQ1RVUkVfRk9STUFUXzRDSUYgPSA0LAorICBHU1RfUlRQX0gyNjNfUEFZTE9BRF9QSUNUVVJFX0ZPUk1BVF8xNkNJRiA9IDUsCisgIEdTVF9SVFBfSDI2M19QQVlMT0FEX1BJQ1RVUkVfRk9STUFUX1JFUzIgPSA2LAorICBHU1RfSDI2M19QQVlMT0FEX1BJQ1RVUkVfRk9STUFUX1BMVVMgPSA3Cit9IEdzdFJ0cEgyNjNQYXlQaWN0dXJlRm9ybWF0OworCitzdGF0aWMgY29uc3QgZ3VpbnQgZm9ybWF0X3Byb3BzWzhdWzJdID0geyB7MjU0LCAyNTR9LAorezYsIDh9LAorezksIDExfSwKK3sxOCwgMjJ9LAorezE4LCA4OH0sCit7MTgsIDM1Mn0sCit7MjU0LCAyNTR9LAorezI1NSwgMjU1fQorfTsKKworLyoKKyAqIEktZnJhbWUgTUNCUEMgdGFibGU6IGNvZGUsIG1hc2ssIG5iaXRzLCBjYiwgY3IsIG1iIHR5cGUgLT4gMTAgPSB1bmRlZmluZWQgKGJlY2F1c2Ugd2UgaGF2ZSBndWludCkKKyAqLworI2RlZmluZSBNQ0JQQ19JX0xFTiA5CisjZGVmaW5lIE1DQlBDX0lfV0lEIDYKK3N0YXRpYyBjb25zdCBndWludDMyIG1jYnBjX0lbOV1bNl0gPSB7CisgIHsweDgwMDAsIDB4ODAwMCwgMSwgMCwgMCwgM30sCisgIHsweDIwMDAsIDB4ZTAwMCwgMywgMCwgMSwgM30sCisgIHsweDQwMDAsIDB4ZTAwMCwgMywgMSwgMCwgM30sCisgIHsweDYwMDAsIDB4ZTAwMCwgMywgMSwgMSwgM30sCisgIHsweDEwMDAsIDB4ZjAwMCwgNCwgMCwgMCwgNH0sCisgIHsweDA0MDAsIDB4ZmMwMCwgNiwgMCwgMSwgNH0sCisgIHsweDA4MDAsIDB4ZmMwMCwgNiwgMSwgMCwgNH0sCisgIHsweDBjMDAsIDB4ZmMwMCwgNiwgMSwgMSwgNH0sCisgIHsweDAwODAsIDB4ZmY4MCwgOSwgMTAsIDEwLCAxMH0KK307CisKKy8qCisgKiBQLWZyYW1lIE1DQlBDIHRhYmxlOiBjb2RlLCBtYXNrLCBuYml0cywgY2IsIGNyLCBtYiB0eXBlIC0+IDEwID0gdW5kZWZpbmVkIChiZWNhdXNlIHdlIGhhdmUgZ3VpbnQpCisgKi8KKyNkZWZpbmUgTUNCUENfUF9MRU4gMjEKKyNkZWZpbmUgTUNCUENfUF9XSUQgNgorc3RhdGljIGNvbnN0IGd1aW50MTYgbWNicGNfUFsyMV1bNl0gPSB7CisgIHsweDgwMDAsIDB4ODAwMCwgMSwgMCwgMCwgMH0sCisgIHsweDMwMDAsIDB4ZjAwMCwgNCwgMCwgMSwgMH0sCisgIHsweDIwMDAsIDB4ZjAwMCwgNCwgMSwgMCwgMH0sCisgIHsweDE0MDAsIDB4ZmMwMCwgNiwgMSwgMSwgMH0sCisgIHsweDYwMDAsIDB4ZTAwMCwgMywgMCwgMCwgMX0sCisgIHsweDBlMDAsIDB4ZmUwMCwgNywgMCwgMSwgMX0sCisgIHsweDBjMDAsIDB4ZmUwMCwgNywgMSwgMCwgMX0sCisgIHsweDAyODAsIDB4ZmY4MCwgOSwgMSwgMSwgMX0sCisgIHsweDQwMDAsIDB4ZTAwMCwgMywgMCwgMCwgMn0sCisgIHsweDBhMDAsIDB4ZmUwMCwgNywgMCwgMSwgMn0sCisgIHsweDA4MDAsIDB4ZmUwMCwgNywgMSwgMCwgMn0sCisgIHsweDA1MDAsIDB4ZmYwMCwgOCwgMSwgMSwgMn0sCisgIHsweDE4MDAsIDB4ZjgwMCwgNSwgMCwgMCwgM30sCisgIHsweDA0MDAsIDB4ZmYwMCwgOCwgMCwgMSwgM30sCisgIHsweDAzMDAsIDB4ZmYwMCwgOCwgMSwgMCwgM30sCisgIHsweDA2MDAsIDB4ZmUwMCwgNywgMSwgMSwgM30sCisgIHsweDEwMDAsIDB4ZmMwMCwgNiwgMCwgMCwgNH0sCisgIHsweDAyMDAsIDB4ZmY4MCwgOSwgMCwgMSwgNH0sCisgIHsweDAxODAsIDB4ZmY4MCwgOSwgMSwgMCwgNH0sCisgIHsweDAxMDAsIDB4ZmY4MCwgOSwgMSwgMSwgNH0sCisgIHsweDAwODAsIDB4ZmY4MCwgOSwgMTAsIDEwLCAxMH0KK307CisKKy8qCisgKiBJLWZyYW1lIENCUFkgKGNvZGUsIG1hc2ssIG5iaXRzLCBZMCwgWTEsIFkyLCBZMykKKyAqLworI2RlZmluZSBDQlBZX0xFTiAxNgorI2RlZmluZSBDQlBZX1dJRCA3CitzdGF0aWMgY29uc3QgZ3VpbnQ4IGNicHlfSVsxNl1bN10gPSB7CisgIHsweDMwLCAweGYwLCA0LCAwLCAwLCAwLCAwfSwKKyAgezB4MjgsIDB4ZjgsIDUsIDAsIDAsIDAsIDF9LAorICB7MHgyMCwgMHhmOCwgNSwgMCwgMCwgMSwgMH0sCisgIHsweDkwLCAweGYwLCA0LCAwLCAwLCAxLCAxfSwKKyAgezB4MTgsIDB4ZjgsIDUsIDAsIDEsIDAsIDB9LAorICB7MHg3MCwgMHhmMCwgNCwgMCwgMSwgMCwgMX0sCisgIHsweDA4LCAweGZjLCA2LCAwLCAxLCAxLCAwfSwKKyAgezB4YjAsIDB4ZjAsIDQsIDAsIDEsIDEsIDF9LAorICB7MHgxMCwgMHhmOCwgNSwgMSwgMCwgMCwgMH0sCisgIHsweDBjLCAweGZjLCA2LCAxLCAwLCAwLCAxfSwKKyAgezB4NTAsIDB4ZjAsIDQsIDEsIDAsIDEsIDB9LAorICB7MHhhMCwgMHhmMCwgNCwgMSwgMCwgMSwgMX0sCisgIHsweDQwLCAweGYwLCA0LCAxLCAxLCAwLCAwfSwKKyAgezB4ODAsIDB4ZjAsIDQsIDEsIDEsIDAsIDF9LAorICB7MHg2MCwgMHhmMCwgNCwgMSwgMSwgMSwgMH0sCisgIHsweGMwLCAweGMwLCAyLCAxLCAxLCAxLCAxfQorfTsKKworLyoKKyAqIFAtZnJhbWUgQ0JQWSAoY29kZSwgbWFzaywgbmJpdHMsIFkwLCBZMSwgWTIsIFkzKQorICovCitzdGF0aWMgY29uc3QgZ3VpbnQ4IGNicHlfUFsxNl1bN10gPSB7CisgIHsweDMwLCAweGYwLCA0LCAxLCAxLCAxLCAxfSwKKyAgezB4MjgsIDB4ZjgsIDUsIDEsIDEsIDEsIDB9LAorICB7MHgyMCwgMHhmOCwgNSwgMSwgMSwgMCwgMX0sCisgIHsweDkwLCAweGYwLCA0LCAxLCAxLCAwLCAwfSwKKyAgezB4MTgsIDB4ZjgsIDUsIDEsIDAsIDEsIDF9LAorICB7MHg3MCwgMHhmMCwgNCwgMSwgMCwgMSwgMH0sCisgIHsweDA4LCAweGZjLCA2LCAxLCAwLCAwLCAxfSwKKyAgezB4YjAsIDB4ZjAsIDQsIDEsIDAsIDAsIDB9LAorICB7MHgxMCwgMHhmOCwgNSwgMCwgMSwgMSwgMX0sCisgIHsweDBjLCAweGZjLCA2LCAwLCAxLCAxLCAwfSwKKyAgezB4NTAsIDB4ZjAsIDQsIDAsIDEsIDAsIDF9LAorICB7MHhhMCwgMHhmMCwgNCwgMCwgMSwgMCwgMH0sCisgIHsweDQwLCAweGYwLCA0LCAwLCAwLCAxLCAxfSwKKyAgezB4ODAsIDB4ZjAsIDQsIDAsIDAsIDEsIDB9LAorICB7MHg2MCwgMHhmMCwgNCwgMCwgMCwgMCwgMX0sCisgIHsweGMwLCAweGMwLCAyLCAwLCAwLCAwLCAwfQorfTsKKworLyoKKyAqIEJsb2NrIFRDT0VGIHRhYmxlIChjb2RlLCBtYXNrLCBuYml0cywgTEFTVCwgUlVOLCBMRVZFTCkKKyAqLworI2RlZmluZSBUQ09FRl9MRU4gMTAzCisjZGVmaW5lIFRDT0VGX1dJRCA2CitzdGF0aWMgY29uc3QgZ3VpbnQxNiB0Y29lZlsxMDNdWzZdID0geworICB7MHg4MDAwLCAweGMwMDAsIDMsIDAsIDAsIDF9LAorICB7MHhmMDAwLCAweGYwMDAsIDUsIDAsIDAsIDJ9LAorICB7MHg1NDAwLCAweGZjMDAsIDcsIDAsIDAsIDN9LAorICB7MHgyZTAwLCAweGZlMDAsIDgsIDAsIDAsIDR9LAorICB7MHgxZjAwLCAweGZmMDAsIDksIDAsIDAsIDV9LAorICB7MHgxMjgwLCAweGZmODAsIDEwLCAwLCAwLCA2fSwKKyAgezB4MTIwMCwgMHhmZjgwLCAxMCwgMCwgMCwgN30sCisgIHsweDA4NDAsIDB4ZmZjMCwgMTEsIDAsIDAsIDh9LAorICB7MHgwODAwLCAweGZmYzAsIDExLCAwLCAwLCA5fSwKKyAgezB4MDBlMCwgMHhmZmUwLCAxMiwgMCwgMCwgMTB9LCAgICAgICAvLzEwCisgIHsweDAwYzAsIDB4ZmZlMCwgMTIsIDAsIDAsIDExfSwKKyAgezB4MDQwMCwgMHhmZmUwLCAxMiwgMCwgMCwgMTJ9LAorICB7MHhjMDAwLCAweGUwMDAsIDQsIDAsIDEsIDF9LAorICB7MHg1MDAwLCAweGZjMDAsIDcsIDAsIDEsIDJ9LAorICB7MHgxZTAwLCAweGZmMDAsIDksIDAsIDEsIDN9LAorICB7MHgwM2MwLCAweGZmYzAsIDExLCAwLCAxLCA0fSwKKyAgezB4MDQyMCwgMHhmZmUwLCAxMiwgMCwgMSwgNX0sCisgIHsweDA1MDAsIDB4ZmZmMCwgMTMsIDAsIDEsIDZ9LAorICB7MHhlMDAwLCAweGYwMDAsIDUsIDAsIDIsIDF9LAorICB7MHgxZDAwLCAweGZmMDAsIDksIDAsIDIsIDJ9LCAvLzIwCisgIHsweDAzODAsIDB4ZmZjMCwgMTEsIDAsIDIsIDN9LAorICB7MHgwNTEwLCAweGZmZjAsIDEzLCAwLCAyLCA0fSwKKyAgezB4NjgwMCwgMHhmODAwLCA2LCAwLCAzLCAxfSwKKyAgezB4MTE4MCwgMHhmZjgwLCAxMCwgMCwgMywgMn0sCisgIHsweDAzNDAsIDB4ZmZjMCwgMTEsIDAsIDMsIDN9LAorICB7MHg2MDAwLCAweGY4MDAsIDYsIDAsIDQsIDF9LAorICB7MHgxMTAwLCAweGZmODAsIDEwLCAwLCA0LCAyfSwKKyAgezB4MDUyMCwgMHhmZmYwLCAxMywgMCwgNCwgM30sCisgIHsweDU4MDAsIDB4ZjgwMCwgNiwgMCwgNSwgMX0sCisgIHsweDAzMDAsIDB4ZmZjMCwgMTEsIDAsIDUsIDJ9LCAgICAgICAgLy8gMzAKKyAgezB4MDUzMCwgMHhmZmYwLCAxMywgMCwgNSwgM30sCisgIHsweDRjMDAsIDB4ZmMwMCwgNywgMCwgNiwgMX0sCisgIHsweDAyYzAsIDB4ZmZjMCwgMTEsIDAsIDYsIDJ9LAorICB7MHgwNTQwLCAweGZmZjAsIDEzLCAwLCA2LCAzfSwKKyAgezB4NDgwMCwgMHhmYzAwLCA3LCAwLCA3LCAxfSwKKyAgezB4MDI4MCwgMHhmZmMwLCAxMSwgMCwgNywgMn0sCisgIHsweDQ0MDAsIDB4ZmMwMCwgNywgMCwgOCwgMX0sCisgIHsweDAyNDAsIDB4ZmZjMCwgMTEsIDAsIDgsIDJ9LAorICB7MHg0MDAwLCAweGZjMDAsIDcsIDAsIDksIDF9LAorICB7MHgwMjAwLCAweGZmYzAsIDExLCAwLCA5LCAyfSwgICAgICAgIC8vIDQwCisgIHsweDJjMDAsIDB4ZmUwMCwgOCwgMCwgMTAsIDF9LAorICB7MHgwNTUwLCAweGZmZjAsIDEzLCAwLCAxMCwgMn0sCisgIHsweDJhMDAsIDB4ZmUwMCwgOCwgMCwgMTEsIDF9LAorICB7MHgyODAwLCAweGZlMDAsIDgsIDAsIDEyLCAxfSwKKyAgezB4MWMwMCwgMHhmZjAwLCA5LCAwLCAxMywgMX0sCisgIHsweDFiMDAsIDB4ZmYwMCwgOSwgMCwgMTQsIDF9LAorICB7MHgxMDgwLCAweGZmODAsIDEwLCAwLCAxNSwgMX0sCisgIHsweDEwMDAsIDB4ZmY4MCwgMTAsIDAsIDE2LCAxfSwKKyAgezB4MGY4MCwgMHhmZjgwLCAxMCwgMCwgMTcsIDF9LAorICB7MHgwZjAwLCAweGZmODAsIDEwLCAwLCAxOCwgMX0sICAgICAgIC8vIDUwCisgIHsweDBlODAsIDB4ZmY4MCwgMTAsIDAsIDE5LCAxfSwKKyAgezB4MGUwMCwgMHhmZjgwLCAxMCwgMCwgMjAsIDF9LAorICB7MHgwZDgwLCAweGZmODAsIDEwLCAwLCAyMSwgMX0sCisgIHsweDBkMDAsIDB4ZmY4MCwgMTAsIDAsIDIyLCAxfSwKKyAgezB4MDQ0MCwgMHhmZmUwLCAxMiwgMCwgMjMsIDF9LAorICB7MHgwNDYwLCAweGZmZTAsIDEyLCAwLCAyNCwgMX0sCisgIHsweDA1NjAsIDB4ZmZmMCwgMTMsIDAsIDI1LCAxfSwKKyAgezB4MDU3MCwgMHhmZmYwLCAxMywgMCwgMjYsIDF9LAorICB7MHg3MDAwLCAweGYwMDAsIDUsIDEsIDAsIDF9LAorICB7MHgwYzgwLCAweGZmODAsIDEwLCAxLCAwLCAyfSwgICAgICAgIC8vIDYwCisgIHsweDAwYTAsIDB4ZmZlMCwgMTIsIDEsIDAsIDN9LAorICB7MHgzYzAwLCAweGZjMDAsIDcsIDEsIDEsIDF9LAorICB7MHgwMDgwLCAweGZmZTAsIDEyLCAxLCAxLCAyfSwKKyAgezB4MzgwMCwgMHhmYzAwLCA3LCAxLCAyLCAxfSwKKyAgezB4MzQwMCwgMHhmYzAwLCA3LCAxLCAzLCAxfSwKKyAgezB4MzAwMCwgMHhmYzAwLCA3LCAxLCA0LCAxfSwKKyAgezB4MjYwMCwgMHhmZTAwLCA4LCAxLCA1LCAxfSwKKyAgezB4MjQwMCwgMHhmZTAwLCA4LCAxLCA2LCAxfSwKKyAgezB4MjIwMCwgMHhmZTAwLCA4LCAxLCA3LCAxfSwKKyAgezB4MjAwMCwgMHhmZTAwLCA4LCAxLCA4LCAxfSwgLy8gNzAKKyAgezB4MWEwMCwgMHhmZjAwLCA5LCAxLCA5LCAxfSwKKyAgezB4MTkwMCwgMHhmZjAwLCA5LCAxLCAxMCwgMX0sCisgIHsweDE4MDAsIDB4ZmYwMCwgOSwgMSwgMTEsIDF9LAorICB7MHgxNzAwLCAweGZmMDAsIDksIDEsIDEyLCAxfSwKKyAgezB4MTYwMCwgMHhmZjAwLCA5LCAxLCAxMywgMX0sCisgIHsweDE1MDAsIDB4ZmYwMCwgOSwgMSwgMTQsIDF9LAorICB7MHgxNDAwLCAweGZmMDAsIDksIDEsIDE1LCAxfSwKKyAgezB4MTMwMCwgMHhmZjAwLCA5LCAxLCAxNiwgMX0sCisgIHsweDBjMDAsIDB4ZmY4MCwgMTAsIDEsIDE3LCAxfSwKKyAgezB4MGI4MCwgMHhmZjgwLCAxMCwgMSwgMTgsIDF9LCAgICAgICAvLyA4MAorICB7MHgwYjAwLCAweGZmODAsIDEwLCAxLCAxOSwgMX0sCisgIHsweDBhODAsIDB4ZmY4MCwgMTAsIDEsIDIwLCAxfSwKKyAgezB4MGEwMCwgMHhmZjgwLCAxMCwgMSwgMjEsIDF9LAorICB7MHgwOTgwLCAweGZmODAsIDEwLCAxLCAyMiwgMX0sCisgIHsweDA5MDAsIDB4ZmY4MCwgMTAsIDEsIDIzLCAxfSwKKyAgezB4MDg4MCwgMHhmZjgwLCAxMCwgMSwgMjQsIDF9LAorICB7MHgwMWMwLCAweGZmYzAsIDExLCAxLCAyNSwgMX0sCisgIHsweDAxODAsIDB4ZmZjMCwgMTEsIDEsIDI2LCAxfSwKKyAgezB4MDE0MCwgMHhmZmMwLCAxMSwgMSwgMjcsIDF9LAorICB7MHgwMTAwLCAweGZmYzAsIDExLCAxLCAyOCwgMX0sICAgICAgIC8vIDkwCisgIHsweDA0ODAsIDB4ZmZlMCwgMTIsIDEsIDI5LCAxfSwKKyAgezB4MDRhMCwgMHhmZmUwLCAxMiwgMSwgMzAsIDF9LAorICB7MHgwNGMwLCAweGZmZTAsIDEyLCAxLCAzMSwgMX0sCisgIHsweDA0ZTAsIDB4ZmZlMCwgMTIsIDEsIDMyLCAxfSwKKyAgezB4MDU4MCwgMHhmZmYwLCAxMywgMSwgMzMsIDF9LAorICB7MHgwNTkwLCAweGZmZjAsIDEzLCAxLCAzNCwgMX0sCisgIHsweDA1YTAsIDB4ZmZmMCwgMTMsIDEsIDM1LCAxfSwKKyAgezB4MDViMCwgMHhmZmYwLCAxMywgMSwgMzYsIDF9LAorICB7MHgwNWMwLCAweGZmZjAsIDEzLCAxLCAzNywgMX0sCisgIHsweDA1ZDAsIDB4ZmZmMCwgMTMsIDEsIDM4LCAxfSwgICAgICAgLy8gMTAwCisgIHsweDA1ZTAsIDB4ZmZmMCwgMTMsIDEsIDM5LCAxfSwKKyAgezB4MDVmMCwgMHhmZmYwLCAxMywgMSwgNDAsIDF9LAorICB7MHgwNjAwLCAweGZlMDAsIDcsIDAsIDB4ZmZmZiwgMHhmZmZmfQorfTsKKworLyoKKyAqIE1vdGlvbiB2ZWN0b3IgY29kZSB0YWJsZSAoQ29kZSwgbWFzaywgbmJpdHMsIHZlY3RvciAoaGFsZnBpeGVsLCB0d28ncyBjb21wbGVtZW50KSwgZGlmZiAoaGFsZnBpeGVsLCB0d28ncyBjb21wbGVtZW50KSkKKyAqLworI2RlZmluZSBNVkRfTEVOIDY0CisjZGVmaW5lIE1WRF9XSUQgNQorc3RhdGljIGNvbnN0IGd1aW50MTYgbXZkWzY0XVs1XSA9IHsKKyAgezB4MDAyOCwgMHhmZmY4LCAxMywgMHgwMDYwLCAweDAwMjB9LAorICB7MHgwMDM4LCAweGZmZjgsIDEzLCAweDAwNjEsIDB4MDAyMX0sCisgIHsweDAwNTAsIDB4ZmZmMCwgMTIsIDB4MDA2MiwgMHgwMDIyfSwKKyAgezB4MDA3MCwgMHhmZmYwLCAxMiwgMHgwMDYzLCAweDAwMjN9LAorICB7MHgwMDkwLCAweGZmZjAsIDEyLCAweDAwNjQsIDB4MDAyNH0sCisgIHsweDAwYjAsIDB4ZmZmMCwgMTIsIDB4MDA2NSwgMHgwMDI1fSwKKyAgezB4MDBkMCwgMHhmZmYwLCAxMiwgMHgwMDY2LCAweDAwMjZ9LAorICB7MHgwMGYwLCAweGZmZjAsIDEyLCAweDAwNjcsIDB4MDAyN30sCisgIHsweDAxMjAsIDB4ZmZlMCwgMTEsIDB4MDA2OCwgMHgwMDI4fSwKKyAgezB4MDE2MCwgMHhmZmUwLCAxMSwgMHgwMDY5LCAweDAwMjl9LAorICB7MHgwMWEwLCAweGZmZTAsIDExLCAweDAwNmEsIDB4MDAyYX0sCisgIHsweDAxZTAsIDB4ZmZlMCwgMTEsIDB4MDA2YiwgMHgwMDJifSwKKyAgezB4MDIyMCwgMHhmZmUwLCAxMSwgMHgwMDZjLCAweDAwMmN9LAorICB7MHgwMjYwLCAweGZmZTAsIDExLCAweDAwNmQsIDB4MDAyZH0sCisgIHsweDAyYTAsIDB4ZmZlMCwgMTEsIDB4MDA2ZSwgMHgwMDJlfSwKKyAgezB4MDJlMCwgMHhmZmUwLCAxMSwgMHgwMDZmLCAweDAwMmZ9LAorICB7MHgwMzIwLCAweGZmZTAsIDExLCAweDAwNzAsIDB4MDAzMH0sCisgIHsweDAzNjAsIDB4ZmZlMCwgMTEsIDB4MDA3MSwgMHgwMDMxfSwKKyAgezB4MDNhMCwgMHhmZmUwLCAxMSwgMHgwMDcyLCAweDAwMzJ9LAorICB7MHgwM2UwLCAweGZmZTAsIDExLCAweDAwNzMsIDB4MDAzM30sCisgIHsweDA0MjAsIDB4ZmZlMCwgMTEsIDB4MDA3NCwgMHgwMDM0fSwKKyAgezB4MDQ2MCwgMHhmZmUwLCAxMSwgMHgwMDc1LCAweDAwMzV9LAorICB7MHgwNGMwLCAweGZmYzAsIDEwLCAweDAwNzYsIDB4MDAzNn0sCisgIHsweDA1NDAsIDB4ZmZjMCwgMTAsIDB4MDA3NywgMHgwMDM3fSwKKyAgezB4MDVjMCwgMHhmZmMwLCAxMCwgMHgwMDc4LCAweDAwMzh9LAorICB7MHgwNzAwLCAweGZmMDAsIDgsIDB4MDA3OSwgMHgwMDM5fSwKKyAgezB4MDkwMCwgMHhmZjAwLCA4LCAweDAwN2EsIDB4MDAzYX0sCisgIHsweDBiMDAsIDB4ZmYwMCwgOCwgMHgwMDdiLCAweDAwM2J9LAorICB7MHgwZTAwLCAweGZlMDAsIDcsIDB4MDA3YywgMHgwMDNjfSwKKyAgezB4MTgwMCwgMHhmODAwLCA1LCAweDAwN2QsIDB4MDAzZH0sCisgIHsweDMwMDAsIDB4ZjAwMCwgNCwgMHgwMDdlLCAweDAwM2V9LAorICB7MHg2MDAwLCAweGUwMDAsIDMsIDB4MDA3ZiwgMHgwMDNmfSwKKyAgezB4ODAwMCwgMHg4MDAwLCAxLCAweDAwMDAsIDB4MDAwMH0sCisgIHsweDQwMDAsIDB4ZTAwMCwgMywgMHgwMDAxLCAweDAwNDF9LAorICB7MHgyMDAwLCAweGYwMDAsIDQsIDB4MDAwMiwgMHgwMDQyfSwKKyAgezB4MTAwMCwgMHhmODAwLCA1LCAweDAwMDMsIDB4MDA0M30sCisgIHsweDBjMDAsIDB4ZmUwMCwgNywgMHgwMDA0LCAweDAwNDR9LAorICB7MHgwYTAwLCAweGZmMDAsIDgsIDB4MDAwNSwgMHgwMDQ1fSwKKyAgezB4MDgwMCwgMHhmZjAwLCA4LCAweDAwMDYsIDB4MDA0Nn0sCisgIHsweDA2MDAsIDB4ZmYwMCwgOCwgMHgwMDA3LCAweDAwNDd9LAorICB7MHgwNTgwLCAweGZmYzAsIDEwLCAweDAwMDgsIDB4MDA0OH0sCisgIHsweDA1MDAsIDB4ZmZjMCwgMTAsIDB4MDAwOSwgMHgwMDQ5fSwKKyAgezB4MDQ4MCwgMHhmZmMwLCAxMCwgMHgwMDBhLCAweDAwNGF9LAorICB7MHgwNDQwLCAweGZmZTAsIDExLCAweDAwMGIsIDB4MDA0Yn0sCisgIHsweDA0MDAsIDB4ZmZlMCwgMTEsIDB4MDAwYywgMHgwMDRjfSwKKyAgezB4MDNjMCwgMHhmZmUwLCAxMSwgMHgwMDBkLCAweDAwNGR9LAorICB7MHgwMzgwLCAweGZmZTAsIDExLCAweDAwMGUsIDB4MDA0ZX0sCisgIHsweDAzNDAsIDB4ZmZlMCwgMTEsIDB4MDAwZiwgMHgwMDRmfSwKKyAgezB4MDMwMCwgMHhmZmUwLCAxMSwgMHgwMDEwLCAweDAwNTB9LAorICB7MHgwMmMwLCAweGZmZTAsIDExLCAweDAwMTEsIDB4MDA1MX0sCisgIHsweDAyODAsIDB4ZmZlMCwgMTEsIDB4MDAxMiwgMHgwMDUyfSwKKyAgezB4MDI0MCwgMHhmZmUwLCAxMSwgMHgwMDEzLCAweDAwNTN9LAorICB7MHgwMjAwLCAweGZmZTAsIDExLCAweDAwMTQsIDB4MDA1NH0sCisgIHsweDAxYzAsIDB4ZmZlMCwgMTEsIDB4MDAxNSwgMHgwMDU1fSwKKyAgezB4MDE4MCwgMHhmZmUwLCAxMSwgMHgwMDE2LCAweDAwNTZ9LAorICB7MHgwMTQwLCAweGZmZTAsIDExLCAweDAwMTcsIDB4MDA1N30sCisgIHsweDAxMDAsIDB4ZmZlMCwgMTEsIDB4MDAxOCwgMHgwMDU4fSwKKyAgezB4MDBlMCwgMHhmZmYwLCAxMiwgMHgwMDE5LCAweDAwNTl9LAorICB7MHgwMGMwLCAweGZmZjAsIDEyLCAweDAwMWEsIDB4MDA1YX0sCisgIHsweDAwYTAsIDB4ZmZmMCwgMTIsIDB4MDAxYiwgMHgwMDVifSwKKyAgezB4MDA4MCwgMHhmZmYwLCAxMiwgMHgwMDFjLCAweDAwNWN9LAorICB7MHgwMDYwLCAweGZmZjAsIDEyLCAweDAwMWQsIDB4MDA1ZH0sCisgIHsweDAwNDAsIDB4ZmZmMCwgMTIsIDB4MDAxZSwgMHgwMDVlfSwKKyAgezB4MDAzMCwgMHhmZmY4LCAxMywgMHgwMDFmLCAweDAwNWZ9Cit9OworCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBoMjYzcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBoMjYzcGF5X2RlYnVnKQorCisjZGVmaW5lIEdTVF9SVFBfSEVBREVSX0xFTiAxMgorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9NT0RFX0FfT05MWQorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2M19wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LWgyNjMsICIKKyAgICAgICAgInZhcmlhbnQgPSAoc3RyaW5nKSBcIml0dVwiLCAiICJoMjYzdmVyc2lvbiA9IChzdHJpbmcpIFwiaDI2M1wiIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9oMjYzX3BheV9zcmNfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9IMjYzX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkgyNjNcIjsgIgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJIMjYzXCIiKQorICAgICk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2M19wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9oMjYzX3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9oMjYzX3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX2gyNjNfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfaDI2M19wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKgorICAgIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2M19wYXlfYm91bmRyeV9pbml0IChHc3RSdHBIMjYzUGF5Qm91bmRyeSAqIGJvdW5kcnksCisgICAgZ3VpbnQ4ICogc3RhcnQsIGd1aW50OCAqIGVuZCwgZ3VpbnQ4IHNiaXQsIGd1aW50OCBlYml0KTsKK3N0YXRpYyBHc3RSdHBIMjYzUGF5R29iICpnc3RfcnRwX2gyNjNfcGF5X2dvYl9uZXcgKEdzdFJ0cEgyNjNQYXlCb3VuZHJ5ICoKKyAgICBib3VuZHJ5LCBndWludCBnb2JuKTsKK3N0YXRpYyBHc3RSdHBIMjYzUGF5TUIgKmdzdF9ydHBfaDI2M19wYXlfbWJfbmV3IChHc3RSdHBIMjYzUGF5Qm91bmRyeSAqIGJvdW5kcnksCisgICAgZ3VpbnQgbWJhKTsKK3N0YXRpYyBHc3RSdHBIMjYzUGF5UGFja2FnZSAqZ3N0X3J0cF9oMjYzX3BheV9wYWNrYWdlX25ld19lbXB0eSAoKTsKK3N0YXRpYyBHc3RSdHBIMjYzUGF5UGFja2FnZSAqZ3N0X3J0cF9oMjYzX3BheV9wYWNrYWdlX25ldyAoZ3VpbnQ4ICogc3RhcnQsCisgICAgZ3VpbnQ4ICogZW5kLCBndWludCBsZW5ndGgsIGd1aW50OCBzYml0LCBndWludDggZWJpdCwgR3N0QnVmZmVyICogb3V0YnVmLAorICAgIGdib29sZWFuIG1hcmtlcik7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2M19wYXlfbWJfZGVzdHJveSAoR3N0UnRwSDI2M1BheU1CICogbWIpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9oMjYzX3BheV9nb2JfZGVzdHJveSAoR3N0UnRwSDI2M1BheUdvYiAqIGdvYiwgZ3VpbnQgaW5kKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2M19wYXlfY29udGV4dF9kZXN0cm95IChHc3RSdHBIMjYzUGF5Q29udGV4dCAqIGNvbnRleHQsCisgICAgZ3VpbnQgaW5kKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2M19wYXlfcGFja2FnZV9kZXN0cm95IChHc3RSdHBIMjYzUGF5UGFja2FnZSAqIHBhY2spOworCisjZGVmaW5lIGdzdF9ydHBfaDI2M19wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwSDI2M1BheSwgZ3N0X3J0cF9oMjYzX3BheSwgR1NUX1RZUEVfUlRQX0JBU0VfUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjNfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEgyNjNQYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9oMjYzX3BheV9maW5hbGl6ZTsKKworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2gyNjNfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9oMjYzX3BheV9oYW5kbGVfYnVmZmVyOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX2gyNjNfcGF5X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9oMjYzX3BheV9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIFBST1BfTU9ERV9BX09OTFksIGdfcGFyYW1fc3BlY19ib29sZWFuICgibW9kZWEtb25seSIsCisgICAgICAgICAgIkZyYWdtZW50IHBhY2tldHMgaW4gbW9kZSBBIE9ubHkiLAorICAgICAgICAgICJEaXNhYmxlIHBhY2tldGl6YXRpb24gbW9kZXMgQiBhbmQgQyIsIERFRkFVTFRfTU9ERV9BLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfaDI2M19wYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9oMjYzX3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBIMjYzIHBhY2tldCBwYXlsb2FkZXIiLCAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYXlsb2FkLWVuY29kZXMgSDI2MyB2aWRlbyBpbiBSVFAgcGFja2V0cyAoUkZDIDIxOTApIiwKKyAgICAgICJOZWlsIFN0cmF0Zm9yZCA8bmVpbHNAdmlwYWRpYS5jb20+IgorICAgICAgIkRlamFuIFNha2Vsc2FrIDxkZWphbi5zYWtlbHNha0BtYXJhbmQuc2k+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGgyNjNwYXlfZGVidWcsICJydHBoMjYzcGF5IiwgMCwKKyAgICAgICJIMjYzIFJUUCBQYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2M19wYXlfaW5pdCAoR3N0UnRwSDI2M1BheSAqIHJ0cGgyNjNwYXkpCit7CisgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX1BUIChydHBoMjYzcGF5KSA9IEdTVF9SVFBfUEFZTE9BRF9IMjYzOworICBydHBoMjYzcGF5LT5wcm9wX3BheWxvYWRfbW9kZSA9IERFRkFVTFRfTU9ERV9BOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYzX3BheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwSDI2M1BheSAqcnRwaDI2M3BheTsKKworICBydHBoMjYzcGF5ID0gR1NUX1JUUF9IMjYzX1BBWSAob2JqZWN0KTsKKworICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZydHBoMjYzcGF5LT5jdXJyZW50X2J1ZmZlciwgTlVMTCk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2M19wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2NoYXIgKmZyYW1lc2l6ZSA9IE5VTEw7CisgIGdib29sZWFuIHJlczsKKworICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHMsICJ3aWR0aCIpICYmCisgICAgICBnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgImhlaWdodCIpKSB7CisgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJ3aWR0aCIsICZ3aWR0aCkgfHwgd2lkdGggPD0gMCkgeworICAgICAgZ290byBpbnZhbGlkX2RpbWVuc2lvbjsKKyAgICB9CisKKyAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImhlaWdodCIsICZoZWlnaHQpIHx8IGhlaWdodCA8PSAwKSB7CisgICAgICBnb3RvIGludmFsaWRfZGltZW5zaW9uOworICAgIH0KKworICAgIGZyYW1lc2l6ZSA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkLSVkIiwgd2lkdGgsIGhlaWdodCk7CisgIH0KKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAocGF5bG9hZCwgInZpZGVvIiwKKyAgICAgIHBheWxvYWQtPnB0ICE9IEdTVF9SVFBfUEFZTE9BRF9IMjYzLCAiSDI2MyIsIDkwMDAwKTsKKworICBpZiAoZnJhbWVzaXplICE9IE5VTEwpIHsKKyAgICByZXMgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAocGF5bG9hZCwKKyAgICAgICAgImEtZnJhbWVzaXplIiwgR19UWVBFX1NUUklORywgZnJhbWVzaXplLCBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICByZXMgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAocGF5bG9hZCwgTlVMTCk7CisgIH0KKyAgZ19mcmVlIChmcmFtZXNpemUpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX2RpbWVuc2lvbjoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBheWxvYWQsICJJbnZhbGlkIHdpZHRoL2hlaWdodCBmcm9tIGNhcHMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2M19wYXlfY29udGV4dF9kZXN0cm95IChHc3RSdHBIMjYzUGF5Q29udGV4dCAqIGNvbnRleHQsIGd1aW50IGluZCkKK3sKKyAgaWYgKCFjb250ZXh0KQorICAgIHJldHVybjsKKworICBpZiAoY29udGV4dC0+Z29icykgeworICAgIGd1aW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZm9ybWF0X3Byb3BzW2luZF1bMF07IGkrKykgeworICAgICAgaWYgKGNvbnRleHQtPmdvYnNbaV0pIHsKKyAgICAgICAgZ3N0X3J0cF9oMjYzX3BheV9nb2JfZGVzdHJveSAoY29udGV4dC0+Z29ic1tpXSwgaW5kKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnX2ZyZWUgKGNvbnRleHQtPmdvYnMpOworICB9CisKKyAgZ19mcmVlIChjb250ZXh0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2M19wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cEgyNjNQYXkgKnJ0cGgyNjNwYXk7CisKKyAgcnRwaDI2M3BheSA9IEdTVF9SVFBfSDI2M19QQVkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01PREVfQV9PTkxZOgorICAgICAgcnRwaDI2M3BheS0+cHJvcF9wYXlsb2FkX21vZGUgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjNfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSdHBIMjYzUGF5ICpydHBoMjYzcGF5OworCisgIHJ0cGgyNjNwYXkgPSBHU1RfUlRQX0gyNjNfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFX0FfT05MWToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBydHBoMjYzcGF5LT5wcm9wX3BheWxvYWRfbW9kZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RSdHBIMjYzUGF5UGFja2FnZSAqCitnc3RfcnRwX2gyNjNfcGF5X3BhY2thZ2VfbmV3X2VtcHR5ICh2b2lkKQoreworICByZXR1cm4gKEdzdFJ0cEgyNjNQYXlQYWNrYWdlICopIGdfbWFsbG9jMCAoc2l6ZW9mIChHc3RSdHBIMjYzUGF5UGFja2FnZSkpOworfQorCitzdGF0aWMgR3N0UnRwSDI2M1BheVBhY2thZ2UgKgorZ3N0X3J0cF9oMjYzX3BheV9wYWNrYWdlX25ldyAoZ3VpbnQ4ICogc3RhcnQsIGd1aW50OCAqIGVuZCwgZ3VpbnQgbGVuZ3RoLAorICAgIGd1aW50OCBzYml0LCBndWludDggZWJpdCwgR3N0QnVmZmVyICogb3V0YnVmLCBnYm9vbGVhbiBtYXJrZXIpCit7CisKKyAgR3N0UnRwSDI2M1BheVBhY2thZ2UgKnBhY2thZ2U7CisKKyAgcGFja2FnZSA9IGdzdF9ydHBfaDI2M19wYXlfcGFja2FnZV9uZXdfZW1wdHkgKCk7CisKKyAgcGFja2FnZS0+cGF5bG9hZF9zdGFydCA9IHN0YXJ0OworICBwYWNrYWdlLT5wYXlsb2FkX2VuZCA9IGVuZDsKKyAgcGFja2FnZS0+cGF5bG9hZF9sZW4gPSBsZW5ndGg7CisgIHBhY2thZ2UtPnNiaXQgPSBzYml0OworICBwYWNrYWdlLT5lYml0ID0gZWJpdDsKKyAgcGFja2FnZS0+b3V0YnVmID0gb3V0YnVmOworICBwYWNrYWdlLT5tYXJrZXIgPSBtYXJrZXI7CisKKyAgcmV0dXJuIHBhY2thZ2U7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjNfcGF5X3BhY2thZ2VfZGVzdHJveSAoR3N0UnRwSDI2M1BheVBhY2thZ2UgKiBwYWNrKQoreworICBpZiAocGFjaykKKyAgICBnX2ZyZWUgKHBhY2spOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYzX3BheV9ib3VuZHJ5X2luaXQgKEdzdFJ0cEgyNjNQYXlCb3VuZHJ5ICogYm91bmRyeSwKKyAgICBndWludDggKiBzdGFydCwgZ3VpbnQ4ICogZW5kLCBndWludDggc2JpdCwgZ3VpbnQ4IGViaXQpCit7CisgIGJvdW5kcnktPnN0YXJ0ID0gc3RhcnQ7CisgIGJvdW5kcnktPmVuZCA9IGVuZDsKKyAgYm91bmRyeS0+c2JpdCA9IHNiaXQ7CisgIGJvdW5kcnktPmViaXQgPSBlYml0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYzX3BheV9zcGxhdF9oZWFkZXJfQSAoZ3VpbnQ4ICogaGVhZGVyLAorICAgIEdzdFJ0cEgyNjNQYXlQYWNrYWdlICogcGFja2FnZSwgR3N0UnRwSDI2M1BheVBpYyAqIHBpY2xheWVyKQoreworCisgIEdzdFJ0cEgyNjNQYXlBSGVhZGVyICphX2hlYWRlcjsKKworICBhX2hlYWRlciA9IChHc3RSdHBIMjYzUGF5QUhlYWRlciAqKSBoZWFkZXI7CisKKyAgYV9oZWFkZXItPmYgPSAwOworICBhX2hlYWRlci0+cCA9IDA7CisgIGFfaGVhZGVyLT5zYml0ID0gcGFja2FnZS0+c2JpdDsKKyAgYV9oZWFkZXItPmViaXQgPSBwYWNrYWdlLT5lYml0OworICBhX2hlYWRlci0+c3JjID0gR1NUX0gyNjNfUElDVFVSRUxBWUVSX1BMU1JDIChwaWNsYXllcik7CisgIGFfaGVhZGVyLT5pID0gR1NUX0gyNjNfUElDVFVSRUxBWUVSX1BMVFlQRSAocGljbGF5ZXIpOworICBhX2hlYWRlci0+dSA9IEdTVF9IMjYzX1BJQ1RVUkVMQVlFUl9QTFVNViAocGljbGF5ZXIpOworICBhX2hlYWRlci0+cyA9IEdTVF9IMjYzX1BJQ1RVUkVMQVlFUl9QTFNBQyAocGljbGF5ZXIpOworICBhX2hlYWRlci0+YSA9IEdTVF9IMjYzX1BJQ1RVUkVMQVlFUl9QTEFQIChwaWNsYXllcik7CisgIGFfaGVhZGVyLT5yMSA9IDA7CisgIGFfaGVhZGVyLT5yMiA9IDA7CisgIGFfaGVhZGVyLT5kYnEgPSAwOworICBhX2hlYWRlci0+dHJiID0gMDsKKyAgYV9oZWFkZXItPnRyID0gMDsKKworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYzX3BheV9zcGxhdF9oZWFkZXJfQiAoZ3VpbnQ4ICogaGVhZGVyLAorICAgIEdzdFJ0cEgyNjNQYXlQYWNrYWdlICogcGFja2FnZSwgR3N0UnRwSDI2M1BheVBpYyAqIHBpY2xheWVyKQoreworCisgIEdzdFJ0cEgyNjNQYXlCSGVhZGVyICpiX2hlYWRlcjsKKworICBiX2hlYWRlciA9IChHc3RSdHBIMjYzUGF5QkhlYWRlciAqKSBoZWFkZXI7CisKKyAgYl9oZWFkZXItPmYgPSAxOworICBiX2hlYWRlci0+cCA9IDA7CisgIGJfaGVhZGVyLT5zYml0ID0gcGFja2FnZS0+c2JpdDsKKyAgYl9oZWFkZXItPmViaXQgPSBwYWNrYWdlLT5lYml0OworICBiX2hlYWRlci0+c3JjID0gR1NUX0gyNjNfUElDVFVSRUxBWUVSX1BMU1JDIChwaWNsYXllcik7CisgIGJfaGVhZGVyLT5xdWFudCA9IHBhY2thZ2UtPnF1YW50OworICBiX2hlYWRlci0+Z29ibiA9IHBhY2thZ2UtPmdvYm47CisgIGJfaGVhZGVyLT5tYmExID0gcGFja2FnZS0+bWJhID4+IDY7CisgIGJfaGVhZGVyLT5tYmEyID0gcGFja2FnZS0+bWJhICYgMHgwMDNmOworICBiX2hlYWRlci0+ciA9IDA7CisgIGJfaGVhZGVyLT5pID0gR1NUX0gyNjNfUElDVFVSRUxBWUVSX1BMVFlQRSAocGljbGF5ZXIpOworICBiX2hlYWRlci0+dSA9IEdTVF9IMjYzX1BJQ1RVUkVMQVlFUl9QTFVNViAocGljbGF5ZXIpOworICBiX2hlYWRlci0+cyA9IEdTVF9IMjYzX1BJQ1RVUkVMQVlFUl9QTFNBQyAocGljbGF5ZXIpOworICBiX2hlYWRlci0+YSA9IEdTVF9IMjYzX1BJQ1RVUkVMQVlFUl9QTEFQIChwaWNsYXllcik7CisKKyAgYl9oZWFkZXItPmhtdjExID0gMDsKKyAgYl9oZWFkZXItPmhtdjEyID0gMDsKKyAgYl9oZWFkZXItPnZtdjExID0gMDsKKyAgYl9oZWFkZXItPnZtdjEyID0gMDsKKyAgYl9oZWFkZXItPmhtdjIxID0gMDsKKyAgYl9oZWFkZXItPmhtdjIyID0gMDsKKyAgYl9oZWFkZXItPnZtdjIxID0gMDsKKworICBpZiAocGFja2FnZS0+bm12ZCA+IDApIHsKKyAgICAvL212ZFswXQorICAgIGJfaGVhZGVyLT5obXYxMSA9IChwYWNrYWdlLT5tdmRbMF0gJiAweDdmKSA+PiAzOworICAgIGJfaGVhZGVyLT5obXYxMiA9IChwYWNrYWdlLT5tdmRbMF0gJiAweDA3KTsKKyAgICAvL212ZFsxXQorICAgIGJfaGVhZGVyLT52bXYxMSA9IChwYWNrYWdlLT5tdmRbMV0gJiAweDA3ZikgPj4gMjsKKyAgICBiX2hlYWRlci0+dm12MTIgPSAocGFja2FnZS0+bXZkWzFdICYgMHgwMyk7CisKKyAgICBpZiAocGFja2FnZS0+bm12ZCA9PSA4KSB7CisgICAgICAvL212ZFs0XQorICAgICAgYl9oZWFkZXItPmhtdjIxID0gKHBhY2thZ2UtPm12ZFs0XSAmIDB4N2YpID4+IDE7CisgICAgICBiX2hlYWRlci0+aG12MjIgPSAocGFja2FnZS0+bXZkWzRdICYgMHgwMSk7CisgICAgICAvL212ZFs1XQorICAgICAgYl9oZWFkZXItPnZtdjIxID0gKHBhY2thZ2UtPm12ZFs1XSAmIDB4N2YpOworICAgIH0KKyAgfQorCit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9oMjYzX3BheV9nb2JmaW5kZXIgKEdzdFJ0cEgyNjNQYXkgKiBydHBoMjYzcGF5LAorICAgIEdzdFJ0cEgyNjNQYXlCb3VuZHJ5ICogYm91bmRyeSkKK3sKKyAgZ3VpbnQ4ICpjdXJyZW50OworICBndWludCByYW5nZTsKKyAgZ3VpbnQgaTsKKworICBjdXJyZW50ID0gYm91bmRyeS0+ZW5kICsgMTsKKyAgcmFuZ2UgPSAocnRwaDI2M3BheS0+ZGF0YSAtIGN1cnJlbnQpICsgcnRwaDI2M3BheS0+YXZhaWxhYmxlX2RhdGE7CisKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgIlNlYXJjaGluZyBmb3IgbmV4dCBHT0IsIGRhdGE6JXAsIGxlbjoldSwgcGF5bG9hZF9sZW46JXAsIgorICAgICAgIiBjdXJyZW50OiVwLCByYW5nZToldSIsIHJ0cGgyNjNwYXktPmRhdGEsIHJ0cGgyNjNwYXktPmF2YWlsYWJsZV9kYXRhLAorICAgICAgYm91bmRyeS0+ZW5kICsgMSwgY3VycmVudCwgcmFuZ2UpOworCisgIC8qIElmIHdlIGFyZSBwYXN0IHRoZSBlbmQsIHN0b3AgKi8KKyAgaWYgKGN1cnJlbnQgPj0gcnRwaDI2M3BheS0+ZGF0YSArIHJ0cGgyNjNwYXktPmF2YWlsYWJsZV9kYXRhKQorICAgIHJldHVybiBGQUxTRTsKKworICBmb3IgKGkgPSAzOyBpIDwgcmFuZ2UgLSAzOyBpKyspIHsKKyAgICBpZiAoKGN1cnJlbnRbaV0gPT0gMHgwKSAmJgorICAgICAgICAoY3VycmVudFtpICsgMV0gPT0gMHgwKSAmJiAoY3VycmVudFtpICsgMl0gPj4gNyA9PSAweDEpKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2M3BheSwgIkdPQiBlbmQgZm91bmQgYXQ6ICVwIHN0YXJ0OiAlcCBsZW46ICV1IiwKKyAgICAgICAgICBjdXJyZW50ICsgaSAtIDEsIGJvdW5kcnktPmVuZCArIDEsCisgICAgICAgICAgKGd1aW50KSAoY3VycmVudCArIGkgLSBib3VuZHJ5LT5lbmQgKyAyKSk7CisgICAgICBnc3RfcnRwX2gyNjNfcGF5X2JvdW5kcnlfaW5pdCAoYm91bmRyeSwgYm91bmRyeS0+ZW5kICsgMSwgY3VycmVudCArIGkgLSAxLAorICAgICAgICAgIDAsIDApOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgIkNvdWxkbid0IGZpbmQgYW55IG5ldyBHQlNDIGluIHRoaXMgZnJhbWUsIHJhbmdlOiV1IiwgcmFuZ2UpOworCisgIGdzdF9ydHBfaDI2M19wYXlfYm91bmRyeV9pbml0IChib3VuZHJ5LCBib3VuZHJ5LT5lbmQgKyAxLAorICAgICAgKGd1aW50OCAqKSAocnRwaDI2M3BheS0+ZGF0YSArIHJ0cGgyNjNwYXktPmF2YWlsYWJsZV9kYXRhIC0gMSksIDAsIDApOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0UnRwSDI2M1BheUdvYiAqCitnc3RfcnRwX2gyNjNfcGF5X2dvYl9uZXcgKEdzdFJ0cEgyNjNQYXlCb3VuZHJ5ICogYm91bmRyeSwgZ3VpbnQgZ29ibikKK3sKKyAgR3N0UnRwSDI2M1BheUdvYiAqZ29iOworCisgIGdvYiA9IChHc3RSdHBIMjYzUGF5R29iICopIGdfbWFsbG9jMCAoc2l6ZW9mIChHc3RSdHBIMjYzUGF5R29iKSk7CisKKyAgZ29iLT5zdGFydCA9IGJvdW5kcnktPnN0YXJ0OworICBnb2ItPmVuZCA9IGJvdW5kcnktPmVuZDsKKyAgZ29iLT5sZW5ndGggPSBib3VuZHJ5LT5lbmQgLSBib3VuZHJ5LT5zdGFydCArIDE7CisgIGdvYi0+ZWJpdCA9IGJvdW5kcnktPmViaXQ7CisgIGdvYi0+c2JpdCA9IGJvdW5kcnktPnNiaXQ7CisgIGdvYi0+Z29ibiA9IGdvYm47CisgIGdvYi0+cXVhbnQgPSAwOworICBnb2ItPm1hY3JvYmxvY2tzID0gTlVMTDsKKyAgZ29iLT5ubWFjcm9ibG9jcyA9IDA7CisKKyAgcmV0dXJuIGdvYjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2M19wYXlfZ29iX2Rlc3Ryb3kgKEdzdFJ0cEgyNjNQYXlHb2IgKiBnb2IsIGd1aW50IGluZCkKK3sKKworICBpZiAoIWdvYikKKyAgICByZXR1cm47CisKKyAgaWYgKGdvYi0+bWFjcm9ibG9ja3MpIHsKKworICAgIGd1aW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ29iLT5ubWFjcm9ibG9jczsgaSsrKSB7CisgICAgICBnc3RfcnRwX2gyNjNfcGF5X21iX2Rlc3Ryb3kgKGdvYi0+bWFjcm9ibG9ja3NbaV0pOworICAgIH0KKworICAgIGdfZnJlZSAoZ29iLT5tYWNyb2Jsb2Nrcyk7CisgIH0KKworICBnX2ZyZWUgKGdvYik7Cit9CisKKy8qCisgKiBkZWNvZGUgTUNCUEMgZm9yIEkgZnJhbWVzIGFuZCByZXR1cm4gaW5kZXggaW4gdGFibGUgb3IgLTEgaWYgbm90IGZvdW5kCisgKi8KK3N0YXRpYyBnaW50Citnc3RfcnRwX2gyNjNfcGF5X2RlY29kZV9tY2JwY19JIChHc3RSdHBIMjYzUGF5ICogcnRwaDI2M3BheSwgZ3VpbnQzMiB2YWx1ZSkKK3sKKworICBnaW50IGk7CisgIGd1aW50MTYgY29kZTsKKworICBjb2RlID0gdmFsdWUgPj4gMTY7CisKKyAgR1NUX1RSQUNFX09CSkVDVCAocnRwaDI2M3BheSwgInZhbHVlOjB4JTA4eCwgY29kZToweCUwNHgiLCB2YWx1ZSwgY29kZSk7CisKKyAgZm9yIChpID0gMDsgaSA8IE1DQlBDX0lfTEVOOyBpKyspIHsKKyAgICBpZiAoKGNvZGUgJiBtY2JwY19JW2ldWzFdKSA9PSBtY2JwY19JW2ldWzBdKSB7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgIH0KKworICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJDb3VsZG4ndCBmaW5kIGNvZGUsIHJldHVybmluZyAtMSIpOworCisgIHJldHVybiAtMTsKK30KKworLyoKKyAqIGRlY29kZSBNQ0JQQyBmb3IgUCBmcmFtZXMgYW5kIHJldHVybiBpbmRleCBpbiB0YWJsZSBvciAtMSBpZiBub3QgZm91bmQKKyAqLworc3RhdGljIGdpbnQKK2dzdF9ydHBfaDI2M19wYXlfZGVjb2RlX21jYnBjX1AgKEdzdFJ0cEgyNjNQYXkgKiBydHBoMjYzcGF5LCBndWludDMyIHZhbHVlKQoreworCisgIGdpbnQgaTsKKyAgZ3VpbnQxNiBjb2RlOworCisgIGNvZGUgPSB2YWx1ZSA+PiAxNjsKKworICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAidmFsdWU6MHglMDh4LCBjb2RlOjB4JTA0eCIsIHZhbHVlLCBjb2RlKTsKKworICBmb3IgKGkgPSAwOyBpIDwgTUNCUENfUF9MRU47IGkrKykgeworICAgIGlmICgoY29kZSAmIG1jYnBjX1BbaV1bMV0pID09IG1jYnBjX1BbaV1bMF0pIHsKKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgfQorCisgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwaDI2M3BheSwgIkNvdWxkbid0IGZpbmQgY29kZSwgcmV0dXJuaW5nIC0xIik7CisKKyAgcmV0dXJuIC0xOworfQorCisvKgorICogZGVjb2RlIENCUFkgYW5kIHJldHVybiBpbmRleCBpbiB0YWJsZSBvciAtMSBpZiBub3QgZm91bmQKKyAqLworc3RhdGljIGdpbnQKK2dzdF9ydHBfaDI2M19wYXlfZGVjb2RlX2NicHkgKEdzdFJ0cEgyNjNQYXkgKiBydHBoMjYzcGF5LCBndWludDMyIHZhbHVlLAorICAgIGNvbnN0IGd1aW50OCBjYnB5X3RhYmxlWzE2XVs3XSkKK3sKKworICBnaW50IGk7CisgIGd1aW50OCBjb2RlOworCisgIGNvZGUgPSB2YWx1ZSA+PiAyNDsKKworICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAidmFsdWU6MHglMDh4LCBjb2RlOjB4JTA0eCIsIHZhbHVlLCBjb2RlKTsKKworICBmb3IgKGkgPSAwOyBpIDwgQ0JQWV9MRU47IGkrKykgeworICAgIGlmICgoY29kZSAmIGNicHlfdGFibGVbaV1bMV0pID09IGNicHlfdGFibGVbaV1bMF0pIHsKKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgfQorCisgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwaDI2M3BheSwgIkNvdWxkbid0IGZpbmQgY29kZSwgcmV0dXJuaW5nIC0xIik7CisKKyAgcmV0dXJuIC0xOworfQorCisvKgorICogZGVjb2RlIE1WRCBhbmQgcmV0dXJuIGluZGV4IGluIHRhYmxlIG9yIC0xIGlmIG5vdCBmb3VuZAorICovCitzdGF0aWMgZ2ludAorZ3N0X3J0cF9oMjYzX3BheV9kZWNvZGVfbXZkIChHc3RSdHBIMjYzUGF5ICogcnRwaDI2M3BheSwgZ3VpbnQzMiB2YWx1ZSkKK3sKKworICBnaW50IGk7CisgIGd1aW50MTYgY29kZTsKKworICBjb2RlID0gdmFsdWUgPj4gMTY7CisKKyAgR1NUX1RSQUNFX09CSkVDVCAocnRwaDI2M3BheSwgInZhbHVlOjB4JTA4eCwgY29kZToweCUwNHgiLCB2YWx1ZSwgY29kZSk7CisKKyAgZm9yIChpID0gMDsgaSA8IE1WRF9MRU47IGkrKykgeworICAgIGlmICgoY29kZSAmIG12ZFtpXVsxXSkgPT0gbXZkW2ldWzBdKSB7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgIH0KKworICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJDb3VsZG4ndCBmaW5kIGNvZGUsIHJldHVybmluZyAtMSIpOworCisgIHJldHVybiAtMTsKK30KKworLyoKKyAqIGRlY29kZSBUQ09FRiBhbmQgcmV0dXJuIGluZGV4IGluIHRhYmxlIG9yIC0xIGlmIG5vdCBmb3VuZAorICovCitzdGF0aWMgZ2ludAorZ3N0X3J0cF9oMjYzX3BheV9kZWNvZGVfdGNvZWYgKEdzdFJ0cEgyNjNQYXkgKiBydHBoMjYzcGF5LCBndWludDMyIHZhbHVlKQoreworCisgIGdpbnQgaTsKKyAgZ3VpbnQxNiBjb2RlOworCisgIGNvZGUgPSB2YWx1ZSA+PiAxNjsKKworICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAidmFsdWU6MHglMDh4LCBjb2RlOjB4JTA0eCIsIHZhbHVlLCBjb2RlKTsKKworICBmb3IgKGkgPSAwOyBpIDwgVENPRUZfTEVOOyBpKyspIHsKKyAgICBpZiAoKGNvZGUgJiB0Y29lZltpXVsxXSkgPT0gdGNvZWZbaV1bMF0pIHsKKyAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJ0Y29lZiBpcyAlZCIsIGkpOworICAgICAgcmV0dXJuIGk7CisgICAgfQorICB9CisKKyAgR1NUX1dBUk5JTkdfT0JKRUNUIChydHBoMjYzcGF5LCAiQ291bGRuJ3QgZmluZCBjb2RlLCByZXR1cm5pbmcgLTEiKTsKKworICByZXR1cm4gLTE7Cit9CisKKy8qCisgKiB0aGUgMzItYml0IHJlZ2lzdGVyIGlzIGxpa2UgYSB3aW5kb3cgdGhhdCB3ZSBtb3ZlIHJpZ2h0IGZvciAibW92ZV9iaXRzIiB0byBnZXQgdGhlIG5leHQgdiAiZGF0YSIgaDI2MyBmaWVsZAorICogInJlc3RfYml0cyIgdGVsbHMgaG93IG1hbnkgYml0cyBpbiB0aGUgImRhdGEiIGJ5dGUgYWRkcmVzcyBhcmUgc3RpbGwgbm90IHVzZWQKKyAqLworCitzdGF0aWMgZ2ludAorZ3N0X3J0cF9oMjYzX3BheV9tb3ZlX3dpbmRvd19yaWdodCAoR3N0UnRwSDI2M1BheSAqIHJ0cGgyNjNwYXksCisgICAgR3N0UnRwSDI2M1BheUNvbnRleHQgKiBjb250ZXh0LCBndWludCBuLCBndWludCByZXN0X2JpdHMsCisgICAgZ3VpbnQ4ICoqIG9yaWdfZGF0YSwgZ3VpbnQ4ICoqIGRhdGFfZW5kKQoreworCisgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksCisgICAgICAiTW92aW5nIHdpbmRvdzogMHglMDh4IGZyb206ICVwIGZvciAlZCBiaXRzLCByZXN0X2JpdHM6ICVkLCBkYXRhX2VuZCAlcCIsCisgICAgICBjb250ZXh0LT53aW5kb3csIGNvbnRleHQtPndpbl9lbmQsIG4sIHJlc3RfYml0cywgKmRhdGFfZW5kKTsKKworICBpZiAobiA9PSAwKQorICAgIHJldHVybiByZXN0X2JpdHM7CisKKyAgd2hpbGUgKG4gIT0gMCB8fCBjb250ZXh0LT53aW5fZW5kID09ICgoKmRhdGFfZW5kKSArIDEpKSB7CisgICAgZ3VpbnQ4IGIgPSBjb250ZXh0LT53aW5fZW5kIDw9ICpkYXRhX2VuZCA/ICpjb250ZXh0LT53aW5fZW5kIDogMDsKKyAgICBpZiAocmVzdF9iaXRzID09IDApIHsKKyAgICAgIGlmIChuID4gOCkgeworICAgICAgICBjb250ZXh0LT53aW5kb3cgPSAoY29udGV4dC0+d2luZG93IDw8IDgpIHwgYjsKKyAgICAgICAgbiAtPSA4OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29udGV4dC0+d2luZG93ID0gKGNvbnRleHQtPndpbmRvdyA8PCBuKSB8IChiID4+ICg4IC0gbikpOworICAgICAgICByZXN0X2JpdHMgPSA4IC0gbjsKKyAgICAgICAgaWYgKHJlc3RfYml0cyA9PSAwKQorICAgICAgICAgIGNvbnRleHQtPndpbl9lbmQrKzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChuID4gcmVzdF9iaXRzKSB7CisgICAgICAgIGNvbnRleHQtPndpbmRvdyA9IChjb250ZXh0LT53aW5kb3cgPDwgcmVzdF9iaXRzKSB8CisgICAgICAgICAgICAoYiAmICgoKGd1aW50KSBwb3cgKDIuMCwgKGRvdWJsZSkgcmVzdF9iaXRzKSkgLSAxKSk7CisgICAgICAgIG4gLT0gcmVzdF9iaXRzOworICAgICAgICByZXN0X2JpdHMgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29udGV4dC0+d2luZG93ID0gKGNvbnRleHQtPndpbmRvdyA8PCBuKSB8CisgICAgICAgICAgICAoKGIgJiAoKChndWludCkgcG93ICgyLjAsIChkb3VibGUpIHJlc3RfYml0cykpIC0gMSkpID4+CisgICAgICAgICAgICAocmVzdF9iaXRzIC0gbikpOworICAgICAgICByZXN0X2JpdHMgLT0gbjsKKyAgICAgICAgaWYgKHJlc3RfYml0cyA9PSAwKQorICAgICAgICAgIGNvbnRleHQtPndpbl9lbmQrKzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgY29udGV4dC0+d2luX2VuZCsrOworICB9CisKKyAgKm9yaWdfZGF0YSA9IGNvbnRleHQtPndpbl9lbmQgLSA0OworCisgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksCisgICAgICAiV2luZG93IG1vdmVkIHRvICVwIHdpdGggdmFsdWU6IDB4JTA4eCBhbmQgb3JpZ19kYXRhOiAlcCByZXN0X2JpdHM6ICVkIiwKKyAgICAgIGNvbnRleHQtPndpbl9lbmQsIGNvbnRleHQtPndpbmRvdywgKm9yaWdfZGF0YSwgcmVzdF9iaXRzKTsKKyAgcmV0dXJuIHJlc3RfYml0czsKK30KKworLyoKKyAqIEZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IE1CIChlbmQgb2YgdGhlIGN1cnJlbnQgTUIpCisgKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgZXhjZXNzIGJpdHMgYW5kIHN0b3JlcyB0aGUgZW5kIG9mIHRoZSBNQiBpbiBlbmQKKyAqIGRhdGEgbXVzdCBiZSBwbGFjZWQgb24gZmlyc3QgTUIgYnl0ZQorICovCitzdGF0aWMgR3N0UnRwSDI2M1BheU1CICoKK2dzdF9ydHBfaDI2M19wYXlfQl9tYmZpbmRlciAoR3N0UnRwSDI2M1BheSAqIHJ0cGgyNjNwYXksCisgICAgR3N0UnRwSDI2M1BheUNvbnRleHQgKiBjb250ZXh0LCBHc3RSdHBIMjYzUGF5R29iICogZ29iLAorICAgIEdzdFJ0cEgyNjNQYXlNQiAqIG1hY3JvYmxvY2ssIGd1aW50IG1iYSkKK3sKKyAgZ3VpbnQgbWJfdHlwZV9pbmRleDsKKyAgZ3VpbnQgY2JweV90eXBlX2luZGV4OworICBndWludCB0Y29lZl90eXBlX2luZGV4OworICBHc3RSdHBIMjYzUGF5TUIgKm1hYzsKKyAgR3N0UnRwSDI2M1BheUJvdW5kcnkgYm91bmRyeTsKKworICBnc3RfcnRwX2gyNjNfcGF5X2JvdW5kcnlfaW5pdCAoJmJvdW5kcnksIG1hY3JvYmxvY2stPmVuZCwKKyAgICAgIG1hY3JvYmxvY2stPmVuZCwgOCAtIG1hY3JvYmxvY2stPmViaXQsIG1hY3JvYmxvY2stPmViaXQpOworICBtYWMgPSBnc3RfcnRwX2gyNjNfcGF5X21iX25ldyAoJmJvdW5kcnksIG1iYSk7CisKKyAgaWYgKG1hYy0+c2JpdCA9PSA4KSB7CisgICAgbWFjLT5zdGFydCsrOworLy8gICAgIG1hYy0+ZW5kKys7CisgICAgbWFjLT5zYml0ID0gMDsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgImN1cnJlbnRfcG9zOiVwLCBlbmQ6JXAsIHJlc3RfYml0czolZCwgd2luZG93OjB4JTA4eCIsIG1hYy0+c3RhcnQsCisgICAgICBtYWMtPmVuZCwgbWFjcm9ibG9jay0+ZWJpdCwgY29udGV4dC0+d2luZG93KTsKKworICBpZiAoY29udGV4dC0+cGljbGF5ZXItPnB0eXBlX3BpY3R5cGUgPT0gMCkgeworICAgIC8vV2UgaGF2ZSBhbiBJIGZyYW1lCisgICAgZ2ludCBpOworICAgIGd1aW50IGxhc3Q7CisgICAgZ3VpbnQgaW5kOworCisgICAgLy9TdGVwIDIgZGVjb2RlIE1DQlBDIEkKKyAgICBtYl90eXBlX2luZGV4ID0KKyAgICAgICAgZ3N0X3J0cF9oMjYzX3BheV9kZWNvZGVfbWNicGNfSSAocnRwaDI2M3BheSwgY29udGV4dC0+d2luZG93KTsKKworICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJNQ0JQQyBpbmRleDogJWQiLCBtYl90eXBlX2luZGV4KTsKKyAgICBpZiAobWJfdHlwZV9pbmRleCA9PSAtMSkgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwaDI2M3BheSwgIk1CIGluZGV4IHNob3VsZG4ndCBiZSAtMSBpbiB3aW5kb3c6ICUwOHgiLAorICAgICAgICAgIGNvbnRleHQtPndpbmRvdyk7CisgICAgICBnb3RvIGJlYWNoOworICAgIH0KKworICAgIG1hYy0+ZWJpdCA9CisgICAgICAgIGdzdF9ydHBfaDI2M19wYXlfbW92ZV93aW5kb3dfcmlnaHQgKHJ0cGgyNjNwYXksIGNvbnRleHQsCisgICAgICAgIG1jYnBjX0lbbWJfdHlwZV9pbmRleF1bMl0sIG1hYy0+ZWJpdCwgJm1hYy0+ZW5kLCAmZ29iLT5lbmQpOworCisgICAgbWFjLT5tYl90eXBlID0gbWNicGNfSVttYl90eXBlX2luZGV4XVs1XTsKKworICAgIGlmIChtYl90eXBlX2luZGV4ID09IDgpIHsKKyAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJTdHVmZmluZyBza2lwcGluZyByZXN0IG9mIE1CIGhlYWRlciIpOworICAgICAgcmV0dXJuIG1hYzsKKyAgICB9CisgICAgLy9TdGVwIDMgZGVjb2RlIENCUFkgSQorICAgIGNicHlfdHlwZV9pbmRleCA9CisgICAgICAgIGdzdF9ydHBfaDI2M19wYXlfZGVjb2RlX2NicHkgKHJ0cGgyNjNwYXksIGNvbnRleHQtPndpbmRvdywgY2JweV9JKTsKKworICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJDQlBZIGluZGV4OiAlZCIsIGNicHlfdHlwZV9pbmRleCk7CisgICAgaWYgKGNicHlfdHlwZV9pbmRleCA9PSAtMSkgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwaDI2M3BheSwKKyAgICAgICAgICAiQ0JQWSBpbmRleCBzaG91bGRuJ3QgYmUgLTEgaW4gd2luZG93OiAlMDh4IiwgY29udGV4dC0+d2luZG93KTsKKyAgICAgIGdvdG8gYmVhY2g7CisgICAgfQorCisgICAgbWFjLT5lYml0ID0KKyAgICAgICAgZ3N0X3J0cF9oMjYzX3BheV9tb3ZlX3dpbmRvd19yaWdodCAocnRwaDI2M3BheSwgY29udGV4dCwKKyAgICAgICAgY2JweV9JW2NicHlfdHlwZV9pbmRleF1bMl0sIG1hYy0+ZWJpdCwgJm1hYy0+ZW5kLCAmZ29iLT5lbmQpOworCisgICAgLy9TdGVwIDQgZGVjb2RlIHJlc3Qgb2YgTUIKKyAgICAvL01CIHR5cGUgMSBhbmQgNCBoYXZlIERRVUFOVCAtIHdlIHN0b3JlIGl0IGZvciBwYWNrYWdpbmcgcHVycG9zZXMKKyAgICBpZiAobWNicGNfSVttYl90eXBlX2luZGV4XVs1XSA9PSA0KSB7CisgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAiU2hpZnRpbmcgRFFVQU5UIik7CisKKyAgICAgIG1hYy0+cXVhbnQgPSAoY29udGV4dC0+d2luZG93ID4+IDMwKTsKKworICAgICAgbWFjLT5lYml0ID0KKyAgICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X21vdmVfd2luZG93X3JpZ2h0IChydHBoMjYzcGF5LCBjb250ZXh0LCAyLCBtYWMtPmViaXQsCisgICAgICAgICAgJm1hYy0+ZW5kLCAmZ29iLT5lbmQpOworICAgIH0KKyAgICAvL1N0ZXAgNSBnbyB0cm91Z2ggdGhlIGJsb2NrcyAtIGRlY29kZSBEQyBhbmQgVENPRUYKKyAgICBsYXN0ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTl9CTE9DS1M7IGkrKykgeworCisgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAiRGVjb2RpbmcgSU5UUkFEQyBhbmQgVENPRUYsIGk6JWQiLCBpKTsKKyAgICAgIG1hYy0+ZWJpdCA9CisgICAgICAgICAgZ3N0X3J0cF9oMjYzX3BheV9tb3ZlX3dpbmRvd19yaWdodCAocnRwaDI2M3BheSwgY29udGV4dCwgOCwgbWFjLT5lYml0LAorICAgICAgICAgICZtYWMtPmVuZCwgJmdvYi0+ZW5kKTsKKworICAgICAgaWYgKGkgPiAzKSB7CisgICAgICAgIGluZCA9IG1jYnBjX0lbbWJfdHlwZV9pbmRleF1baSAtIDFdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kID0gY2JweV9JW2NicHlfdHlwZV9pbmRleF1baSArIDNdOworICAgICAgfQorCisgICAgICBpZiAoaW5kID09IDEpIHsKKyAgICAgICAgd2hpbGUgKGxhc3QgPT0gMCkgeworICAgICAgICAgIHRjb2VmX3R5cGVfaW5kZXggPQorICAgICAgICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X2RlY29kZV90Y29lZiAocnRwaDI2M3BheSwgY29udGV4dC0+d2luZG93KTsKKworICAgICAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJUQ09FRiBpbmRleDogJWQiLCB0Y29lZl90eXBlX2luZGV4KTsKKyAgICAgICAgICBpZiAodGNvZWZfdHlwZV9pbmRleCA9PSAtMSkgeworICAgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwaDI2M3BheSwKKyAgICAgICAgICAgICAgICAiVENPRUYgaW5kZXggc2hvdWxkbid0IGJlIC0xIGluIHdpbmRvdzogJTA4eCIsIGNvbnRleHQtPndpbmRvdyk7CisgICAgICAgICAgICBnb3RvIGJlYWNoOworICAgICAgICAgIH0KKyAgICAgICAgICBtYWMtPmViaXQgPQorICAgICAgICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X21vdmVfd2luZG93X3JpZ2h0IChydHBoMjYzcGF5LCBjb250ZXh0LAorICAgICAgICAgICAgICB0Y29lZlt0Y29lZl90eXBlX2luZGV4XVsyXSwgbWFjLT5lYml0LCAmbWFjLT5lbmQsICZnb2ItPmVuZCk7CisKKyAgICAgICAgICBsYXN0ID0gdGNvZWZbdGNvZWZfdHlwZV9pbmRleF1bM107CisgICAgICAgICAgaWYgKHRjb2VmX3R5cGVfaW5kZXggPT0gMTAyKSB7CisgICAgICAgICAgICBpZiAoKGNvbnRleHQtPndpbmRvdyAmIDB4ODAwMDAwMDApID09IDB4ODAwMDAwMDApCisgICAgICAgICAgICAgIGxhc3QgPSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBsYXN0ID0gMDsKKworICAgICAgICAgICAgbWFjLT5lYml0ID0KKyAgICAgICAgICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X21vdmVfd2luZG93X3JpZ2h0IChydHBoMjYzcGF5LCBjb250ZXh0LCAxNSwKKyAgICAgICAgICAgICAgICBtYWMtPmViaXQsICZtYWMtPmVuZCwgJmdvYi0+ZW5kKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbGFzdCA9IDA7CisgICAgICB9CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgLy9XZSBoYXZlIGEgUCBmcmFtZQorICAgIGd1aW50IGk7CisgICAgZ3VpbnQgbGFzdDsKKyAgICBndWludCBpbmQ7CisKKyAgICAvL1N0ZXAgMSBjaGVjayBDT0QKKyAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAiQ2hlY2tpbmcgZm9yIENPRCIpOworICAgIGlmICgoY29udGV4dC0+d2luZG93ICYgMHg4MDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkgeworICAgICAgLy9UaGUgTUIgaXMgbm90IGNvZGVkCisgICAgICBtYWMtPmViaXQgPQorICAgICAgICAgIGdzdF9ydHBfaDI2M19wYXlfbW92ZV93aW5kb3dfcmlnaHQgKHJ0cGgyNjNwYXksIGNvbnRleHQsIDEsIG1hYy0+ZWJpdCwKKyAgICAgICAgICAmbWFjLT5lbmQsICZnb2ItPmVuZCk7CisgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAiQ09PT09PT09PT09PRCA9IDEiKTsKKworICAgICAgcmV0dXJuIG1hYzsKKyAgICB9IGVsc2UgeworICAgICAgLy9UaGUgTUIgaXMgY29kZWQKKyAgICAgIG1hYy0+ZWJpdCA9CisgICAgICAgICAgZ3N0X3J0cF9oMjYzX3BheV9tb3ZlX3dpbmRvd19yaWdodCAocnRwaDI2M3BheSwgY29udGV4dCwgMSwgbWFjLT5lYml0LAorICAgICAgICAgICZtYWMtPmVuZCwgJmdvYi0+ZW5kKTsKKyAgICB9CisKKyAgICAvL1N0ZXAgMiBkZWNvZGUgTUNCUEMgUAorICAgIG1iX3R5cGVfaW5kZXggPQorICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X2RlY29kZV9tY2JwY19QIChydHBoMjYzcGF5LCBjb250ZXh0LT53aW5kb3cpOworCisgICAgR1NUX1RSQUNFX09CSkVDVCAocnRwaDI2M3BheSwgIk1DQlBDIGluZGV4OiAlZCIsIG1iX3R5cGVfaW5kZXgpOworICAgIGlmIChtYl90eXBlX2luZGV4ID09IC0xKSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChydHBoMjYzcGF5LCAiTUIgaW5kZXggc2hvdWxkbid0IGJlIC0xIGluIHdpbmRvdzogJTA4eCIsCisgICAgICAgICAgY29udGV4dC0+d2luZG93KTsKKyAgICAgIGdvdG8gYmVhY2g7CisgICAgfQorICAgIG1hYy0+ZWJpdCA9CisgICAgICAgIGdzdF9ydHBfaDI2M19wYXlfbW92ZV93aW5kb3dfcmlnaHQgKHJ0cGgyNjNwYXksIGNvbnRleHQsCisgICAgICAgIG1jYnBjX1BbbWJfdHlwZV9pbmRleF1bMl0sIG1hYy0+ZWJpdCwgJm1hYy0+ZW5kLCAmZ29iLT5lbmQpOworCisgICAgbWFjLT5tYl90eXBlID0gbWNicGNfUFttYl90eXBlX2luZGV4XVs1XTsKKworICAgIGlmIChtYl90eXBlX2luZGV4ID09IDIwKSB7CisgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAiU3R1ZmZpbmcgc2tpcHBpbmcgcmVzdCBvZiBNQiBoZWFkZXIiKTsKKyAgICAgIHJldHVybiBtYWM7CisgICAgfQorICAgIC8vU3RlcCAzIGRlY29kZSBDQlBZIFAKKyAgICBjYnB5X3R5cGVfaW5kZXggPQorICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X2RlY29kZV9jYnB5IChydHBoMjYzcGF5LCBjb250ZXh0LT53aW5kb3csIGNicHlfUCk7CisKKyAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAiQ0JQWSBpbmRleDogJWQiLCBjYnB5X3R5cGVfaW5kZXgpOworICAgIGlmIChjYnB5X3R5cGVfaW5kZXggPT0gLTEpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGgyNjNwYXksCisgICAgICAgICAgIkNCUFkgaW5kZXggc2hvdWxkbid0IGJlIC0xIGluIHdpbmRvdzogJTA4eCIsIGNvbnRleHQtPndpbmRvdyk7CisgICAgICBnb3RvIGJlYWNoOworICAgIH0KKyAgICBtYWMtPmViaXQgPQorICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X21vdmVfd2luZG93X3JpZ2h0IChydHBoMjYzcGF5LCBjb250ZXh0LAorICAgICAgICBjYnB5X1BbY2JweV90eXBlX2luZGV4XVsyXSwgbWFjLT5lYml0LCAmbWFjLT5lbmQsICZnb2ItPmVuZCk7CisKKyAgICAvL01CIHR5cGUgMSBhbmQgNCBoYXZlIERRVUFOVCAtIHdlIGFkZCBpdCB0byBNQiBvYmplY3QgYW5kIGp1bXAgb3ZlcgorICAgIGlmIChtY2JwY19QW21iX3R5cGVfaW5kZXhdWzVdID09IDQgfHwgbWNicGNfUFttYl90eXBlX2luZGV4XVs1XSA9PSAxKSB7CisgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAiU2hpZnRpbmcgRFFVQU5UIik7CisKKyAgICAgIG1hYy0+cXVhbnQgPSBjb250ZXh0LT53aW5kb3cgPj4gMzA7CisKKyAgICAgIG1hYy0+ZWJpdCA9CisgICAgICAgICAgZ3N0X3J0cF9oMjYzX3BheV9tb3ZlX3dpbmRvd19yaWdodCAocnRwaDI2M3BheSwgY29udGV4dCwgMiwgbWFjLT5lYml0LAorICAgICAgICAgICZtYWMtPmVuZCwgJmdvYi0+ZW5kKTsKKyAgICB9CisgICAgLy9NQiB0eXBlcyA8IDMgaGF2ZSBNVkQxLTQKKyAgICBpZiAobWNicGNfUFttYl90eXBlX2luZGV4XVs1XSA8IDMpIHsKKworICAgICAgZ3VpbnQgbm12ZDsKKyAgICAgIGdpbnQgajsKKworICAgICAgbm12ZCA9IDI7CisgICAgICBpZiAobWNicGNfUFttYl90eXBlX2luZGV4XVs1XSA9PSAyKQorICAgICAgICBubXZkID0gODsKKworICAgICAgZm9yIChqID0gMDsgaiA8IG5tdmQ7IGorKykgeworICAgICAgICBndWludCBtdmRfdHlwZTsKKworICAgICAgICBtdmRfdHlwZSA9IGdzdF9ydHBfaDI2M19wYXlfZGVjb2RlX212ZCAocnRwaDI2M3BheSwgY29udGV4dC0+d2luZG93KTsKKworICAgICAgICBpZiAobXZkX3R5cGUgPT0gLTEpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgICAgICAgICAiTVZEMS00IGluZGV4IHNob3VsZG4ndCBiZSAtMSBpbiB3aW5kb3c6ICUwOHgiLCBjb250ZXh0LT53aW5kb3cpOworICAgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICAgIH0KKyAgICAgICAgLy9zZXQgdGhlIE1CIG12ZCB2YWx1ZXMKKyAgICAgICAgbWFjLT5tdmRbal0gPSBtdmRbbXZkX3R5cGVdWzNdOworCisgICAgICAgIG1hYy0+ZWJpdCA9CisgICAgICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X21vdmVfd2luZG93X3JpZ2h0IChydHBoMjYzcGF5LCBjb250ZXh0LAorICAgICAgICAgICAgbXZkW212ZF90eXBlXVsyXSwgbWFjLT5lYml0LCAmbWFjLT5lbmQsICZnb2ItPmVuZCk7CisgICAgICB9CisKKworICAgIH0KKyAgICAvL1N0ZXAgNSBnbyB0cm91Z2ggdGhlIGJsb2NrcyAtIGRlY29kZSBEQyBhbmQgVENPRUYKKyAgICBsYXN0ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTl9CTE9DS1M7IGkrKykgeworCisgICAgICAvL2lmIE1CIHR5cGUgMyBvciA0IHRoZW4gSU5UUkFEQyBjb2VmIGFyZSBwcmVzZW50IGluIGJsb2NrcworICAgICAgaWYgKG1jYnBjX1BbbWJfdHlwZV9pbmRleF1bNV0gPiAyKSB7CisgICAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJJTlRSQURDIGNvZWY6ICVkIiwgaSk7CisgICAgICAgIG1hYy0+ZWJpdCA9CisgICAgICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X21vdmVfd2luZG93X3JpZ2h0IChydHBoMjYzcGF5LCBjb250ZXh0LCA4LAorICAgICAgICAgICAgbWFjLT5lYml0LCAmbWFjLT5lbmQsICZnb2ItPmVuZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAiSU5UUkFEQyBjb2VmIGlzIG5vdCBwcmVzZW50Iik7CisgICAgICB9CisKKyAgICAgIC8vY2hlY2sgaWYgdGhlIGJsb2NrIGhhcyBUQ09FRgorICAgICAgaWYgKGkgPiAzKSB7CisgICAgICAgIGluZCA9IG1jYnBjX1BbbWJfdHlwZV9pbmRleF1baSAtIDFdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1jYnBjX1BbbWJfdHlwZV9pbmRleF1bNV0gPiAyKSB7CisgICAgICAgICAgaW5kID0gY2JweV9JW2NicHlfdHlwZV9pbmRleF1baSArIDNdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZCA9IGNicHlfUFtjYnB5X3R5cGVfaW5kZXhdW2kgKyAzXTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoaW5kID09IDEpIHsKKyAgICAgICAgd2hpbGUgKGxhc3QgPT0gMCkgeworICAgICAgICAgIHRjb2VmX3R5cGVfaW5kZXggPQorICAgICAgICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X2RlY29kZV90Y29lZiAocnRwaDI2M3BheSwgY29udGV4dC0+d2luZG93KTsKKworICAgICAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJUQ09FRiBpbmRleDogJWQiLCB0Y29lZl90eXBlX2luZGV4KTsKKyAgICAgICAgICBpZiAodGNvZWZfdHlwZV9pbmRleCA9PSAtMSkgeworICAgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwaDI2M3BheSwKKyAgICAgICAgICAgICAgICAiVENPRUYgaW5kZXggc2hvdWxkbid0IGJlIC0xIGluIHdpbmRvdzogJTA4eCIsIGNvbnRleHQtPndpbmRvdyk7CisgICAgICAgICAgICBnb3RvIGJlYWNoOworICAgICAgICAgIH0KKworICAgICAgICAgIG1hYy0+ZWJpdCA9CisgICAgICAgICAgICAgIGdzdF9ydHBfaDI2M19wYXlfbW92ZV93aW5kb3dfcmlnaHQgKHJ0cGgyNjNwYXksIGNvbnRleHQsCisgICAgICAgICAgICAgIHRjb2VmW3Rjb2VmX3R5cGVfaW5kZXhdWzJdLCBtYWMtPmViaXQsICZtYWMtPmVuZCwgJmdvYi0+ZW5kKTsKKworICAgICAgICAgIGxhc3QgPSB0Y29lZlt0Y29lZl90eXBlX2luZGV4XVszXTsKKyAgICAgICAgICBpZiAodGNvZWZfdHlwZV9pbmRleCA9PSAxMDIpIHsKKyAgICAgICAgICAgIGlmICgoY29udGV4dC0+d2luZG93ICYgMHg4MDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkKKyAgICAgICAgICAgICAgbGFzdCA9IDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGxhc3QgPSAwOworCisgICAgICAgICAgICBtYWMtPmViaXQgPQorICAgICAgICAgICAgICAgIGdzdF9ydHBfaDI2M19wYXlfbW92ZV93aW5kb3dfcmlnaHQgKHJ0cGgyNjNwYXksIGNvbnRleHQsIDE1LAorICAgICAgICAgICAgICAgIG1hYy0+ZWJpdCwgJm1hYy0+ZW5kLCAmZ29iLT5lbmQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsYXN0ID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBtYWMtPmxlbmd0aCA9IG1hYy0+ZW5kIC0gbWFjLT5zdGFydCArIDE7CisKKyAgcmV0dXJuIG1hYzsKKworYmVhY2g6CisgIGdzdF9ydHBfaDI2M19wYXlfbWJfZGVzdHJveSAobWFjKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBHc3RSdHBIMjYzUGF5TUIgKgorZ3N0X3J0cF9oMjYzX3BheV9tYl9uZXcgKEdzdFJ0cEgyNjNQYXlCb3VuZHJ5ICogYm91bmRyeSwgZ3VpbnQgbWJhKQoreworICBHc3RSdHBIMjYzUGF5TUIgKm1iOworICBnaW50IGk7CisKKyAgbWIgPSAoR3N0UnRwSDI2M1BheU1CICopIGdfbWFsbG9jMCAoc2l6ZW9mIChHc3RSdHBIMjYzUGF5TUIpKTsKKworICBtYi0+c3RhcnQgPSBib3VuZHJ5LT5zdGFydDsKKyAgbWItPmVuZCA9IGJvdW5kcnktPmVuZDsKKyAgbWItPmxlbmd0aCA9IGJvdW5kcnktPmVuZCAtIGJvdW5kcnktPnN0YXJ0ICsgMTsKKyAgbWItPnNiaXQgPSBib3VuZHJ5LT5zYml0OworICBtYi0+ZWJpdCA9IGJvdW5kcnktPmViaXQ7CisgIG1iLT5tYmEgPSBtYmE7CisKKyAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICBtYi0+bXZkW2ldID0gMDsKKworICByZXR1cm4gbWI7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjNfcGF5X21iX2Rlc3Ryb3kgKEdzdFJ0cEgyNjNQYXlNQiAqIG1iKQoreworICBpZiAoIW1iKQorICAgIHJldHVybjsKKworICBnX2ZyZWUgKG1iKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfaDI2M19wYXlfcHVzaCAoR3N0UnRwSDI2M1BheSAqIHJ0cGgyNjNwYXksCisgICAgR3N0UnRwSDI2M1BheUNvbnRleHQgKiBjb250ZXh0LCBHc3RSdHBIMjYzUGF5UGFja2FnZSAqIHBhY2thZ2UpCit7CisKKyAgLyoKKyAgICogU3BsYXQgdGhlIHBheWxvYWQgaGVhZGVyIHZhbHVlcworICAgKi8KKyAgZ3VpbnQ4ICpoZWFkZXI7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisKKyAgZ3N0X3J0cF9idWZmZXJfbWFwIChwYWNrYWdlLT5vdXRidWYsIEdTVF9NQVBfV1JJVEUsICZydHApOworCisgIGhlYWRlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKTsKKworICBzd2l0Y2ggKHBhY2thZ2UtPm1vZGUpIHsKKyAgICBjYXNlIEdTVF9SVFBfSDI2M19QQVlMT0FEX0hFQURFUl9NT0RFX0E6CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2M3BheSwgIlB1c2hpbmcgQSBwYWNrZXQiKTsKKyAgICAgIGdzdF9ydHBfaDI2M19wYXlfc3BsYXRfaGVhZGVyX0EgKGhlYWRlciwgcGFja2FnZSwgY29udGV4dC0+cGljbGF5ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUlRQX0gyNjNfUEFZTE9BRF9IRUFERVJfTU9ERV9COgorICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJQdXNoaW5nIEIgcGFja2V0Iik7CisgICAgICBnc3RfcnRwX2gyNjNfcGF5X3NwbGF0X2hlYWRlcl9CIChoZWFkZXIsIHBhY2thZ2UsIGNvbnRleHQtPnBpY2xheWVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1JUUF9IMjYzX1BBWUxPQURfSEVBREVSX01PREVfQzoKKyAgICAgIC8vZ3N0X3J0cF9oMjYzX3BheV9zcGxhdF9oZWFkZXJfQyhoZWFkZXIsIHBhY2thZ2UsIGNvbnRleHQtPnBpY2xheWVyKTsKKyAgICAgIC8vYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIC8qCisgICAqIHRpbWVzdGFtcCB0aGUgYnVmZmVyCisgICAqLworICBHU1RfQlVGRkVSX1BUUyAocGFja2FnZS0+b3V0YnVmKSA9IHJ0cGgyNjNwYXktPmZpcnN0X3RzOworCisgIGdzdF9ydHBfYnVmZmVyX3NldF9tYXJrZXIgKCZydHAsIHBhY2thZ2UtPm1hcmtlcik7CisgIGlmIChwYWNrYWdlLT5tYXJrZXIpCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BheSwgIk1hcmtlciBzZXQhIik7CisKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgIC8qCisgICAqIENvcHkgdGhlIHBheWxvYWQgZGF0YSBpbiB0aGUgYnVmZmVyCisgICAqLworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LCAiQ29weWluZyBtZW1vcnkiKTsKKyAgZ3N0X2J1ZmZlcl9jb3B5X2ludG8gKHBhY2thZ2UtPm91dGJ1ZiwgcnRwaDI2M3BheS0+Y3VycmVudF9idWZmZXIsCisgICAgICBHU1RfQlVGRkVSX0NPUFlfTUVNT1JZLCBwYWNrYWdlLT5wYXlsb2FkX3N0YXJ0IC0gcnRwaDI2M3BheS0+bWFwLmRhdGEsCisgICAgICBwYWNrYWdlLT5wYXlsb2FkX2xlbik7CisgIGdzdF9ydHBfY29weV92aWRlb19tZXRhIChydHBoMjYzcGF5LCBwYWNrYWdlLT5vdXRidWYsCisgICAgICBydHBoMjYzcGF5LT5jdXJyZW50X2J1ZmZlcik7CisKKyAgcmV0ID0KKyAgICAgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBoMjYzcGF5KSwKKyAgICAgIHBhY2thZ2UtPm91dGJ1Zik7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJQYWNrYWdlIHB1c2hlZCwgcmV0dXJuaW5nIik7CisKKyAgZ3N0X3J0cF9oMjYzX3BheV9wYWNrYWdlX2Rlc3Ryb3kgKHBhY2thZ2UpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2gyNjNfcGF5X0FfZnJhZ21lbnRfcHVzaCAoR3N0UnRwSDI2M1BheSAqIHJ0cGgyNjNwYXksCisgICAgR3N0UnRwSDI2M1BheUNvbnRleHQgKiBjb250ZXh0LCBndWludCBmaXJzdCwgZ3VpbnQgbGFzdCkKK3sKKworICBHc3RSdHBIMjYzUGF5UGFja2FnZSAqcGFjazsKKworICBwYWNrID0gZ3N0X3J0cF9oMjYzX3BheV9wYWNrYWdlX25ld19lbXB0eSAoKTsKKworICBwYWNrLT5wYXlsb2FkX3N0YXJ0ID0gY29udGV4dC0+Z29ic1tmaXJzdF0tPnN0YXJ0OworICBwYWNrLT5zYml0ID0gY29udGV4dC0+Z29ic1tmaXJzdF0tPnNiaXQ7CisgIHBhY2stPmViaXQgPSBjb250ZXh0LT5nb2JzW2xhc3RdLT5lYml0OworICBwYWNrLT5wYXlsb2FkX2xlbiA9CisgICAgICAoY29udGV4dC0+Z29ic1tsYXN0XS0+ZW5kIC0gY29udGV4dC0+Z29ic1tmaXJzdF0tPnN0YXJ0KSArIDE7CisgIHBhY2stPm1hcmtlciA9IEZBTFNFOworCisgIGlmIChsYXN0ID09IGNvbnRleHQtPm5vX2dvYnMgLSAxKSB7CisgICAgcGFjay0+bWFya2VyID0gVFJVRTsKKyAgfQorCisgIHBhY2stPmdvYm4gPSBjb250ZXh0LT5nb2JzW2ZpcnN0XS0+Z29ibjsKKyAgcGFjay0+bW9kZSA9IEdTVF9SVFBfSDI2M19QQVlMT0FEX0hFQURFUl9NT0RFX0E7CisgIHBhY2stPm91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAocGFjay0+bW9kZSwgMCwgMCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BheSwgIlNlbmRpbmcgbGVuOiVkIGRhdGEgdG8gcHVzaCBmdW5jdGlvbiIsCisgICAgICBwYWNrLT5wYXlsb2FkX2xlbik7CisKKyAgcmV0dXJuIGdzdF9ydHBfaDI2M19wYXlfcHVzaCAocnRwaDI2M3BheSwgY29udGV4dCwgcGFjayk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2gyNjNfcGF5X0JfZnJhZ21lbnRfcHVzaCAoR3N0UnRwSDI2M1BheSAqIHJ0cGgyNjNwYXksCisgICAgR3N0UnRwSDI2M1BheUNvbnRleHQgKiBjb250ZXh0LCBHc3RSdHBIMjYzUGF5R29iICogZ29iLCBndWludCBmaXJzdCwKKyAgICBndWludCBsYXN0LCBHc3RSdHBIMjYzUGF5Qm91bmRyeSAqIGJvdW5kcnkpCit7CisKKyAgR3N0UnRwSDI2M1BheVBhY2thZ2UgKnBhY2s7CisgIGd1aW50IG12OworCisgIHBhY2sgPSBnc3RfcnRwX2gyNjNfcGF5X3BhY2thZ2VfbmV3X2VtcHR5ICgpOworCisgIHBhY2stPnBheWxvYWRfc3RhcnQgPSBnb2ItPm1hY3JvYmxvY2tzW2ZpcnN0XS0+c3RhcnQ7CisgIHBhY2stPnNiaXQgPSBnb2ItPm1hY3JvYmxvY2tzW2ZpcnN0XS0+c2JpdDsKKyAgaWYgKGZpcnN0ID09IDApIHsKKyAgICBwYWNrLT5wYXlsb2FkX3N0YXJ0ID0gYm91bmRyeS0+c3RhcnQ7CisgICAgcGFjay0+c2JpdCA9IGJvdW5kcnktPnNiaXQ7CisgICAgcGFjay0+cXVhbnQgPSBnb2ItPnF1YW50OworICB9IGVsc2UgeworICAgIHBhY2stPnF1YW50ID0gZ29iLT5tYWNyb2Jsb2Nrc1tmaXJzdF0tPnF1YW50OworICB9CisgIHBhY2stPnBheWxvYWRfZW5kID0gZ29iLT5tYWNyb2Jsb2Nrc1tsYXN0XS0+ZW5kOworCisgIHBhY2stPmViaXQgPSBnb2ItPm1hY3JvYmxvY2tzW2xhc3RdLT5lYml0OworICBwYWNrLT5tYmEgPSBnb2ItPm1hY3JvYmxvY2tzW2ZpcnN0XS0+bWJhOworICBwYWNrLT5nb2JuID0gZ29iLT5nb2JuOworICBwYWNrLT5tb2RlID0gR1NUX1JUUF9IMjYzX1BBWUxPQURfSEVBREVSX01PREVfQjsKKyAgcGFjay0+bm12ZCA9IDA7CisKKyAgaWYgKGdvYi0+bWFjcm9ibG9ja3NbZmlyc3RdLT5tYl90eXBlIDwgMykgeworICAgIGlmIChnb2ItPm1hY3JvYmxvY2tzW2ZpcnN0XS0+bWJfdHlwZSA9PSAyKQorICAgICAgcGFjay0+bm12ZCA9IDg7CisgICAgZWxzZSBpZiAoZ29iLT5tYWNyb2Jsb2Nrc1tmaXJzdF0tPm1iX3R5cGUgPCAyKQorICAgICAgcGFjay0+bm12ZCA9IDI7CisKKyAgICBmb3IgKG12ID0gMDsgbXYgPCBwYWNrLT5ubXZkOyBtdisrKQorICAgICAgcGFjay0+bXZkW212XSA9IGdvYi0+bWFjcm9ibG9ja3NbZmlyc3RdLT5tdmRbbXZdOworICB9CisKKyAgcGFjay0+bWFya2VyID0gRkFMU0U7CisgIGlmIChsYXN0ID09IGdvYi0+bm1hY3JvYmxvY3MgLSAxKSB7CisgICAgcGFjay0+ZWJpdCA9IDA7CisgIH0KKworICBpZiAoKGZvcm1hdF9wcm9wc1tjb250ZXh0LT5waWNsYXllci0+cHR5cGVfc3JjZm9ybWF0XVswXSAtIDEgPT0gZ29iLT5nb2JuKQorICAgICAgJiYgKGxhc3QgPT0gZ29iLT5ubWFjcm9ibG9jcyAtIDEpKSB7CisgICAgcGFjay0+bWFya2VyID0gVFJVRTsKKyAgfQorCisgIHBhY2stPnBheWxvYWRfbGVuID0gcGFjay0+cGF5bG9hZF9lbmQgLSBwYWNrLT5wYXlsb2FkX3N0YXJ0ICsgMTsKKyAgcGFjay0+b3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChwYWNrLT5tb2RlLCAwLCAwKTsKKworICByZXR1cm4gZ3N0X3J0cF9oMjYzX3BheV9wdXNoIChydHBoMjYzcGF5LCBjb250ZXh0LCBwYWNrKTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2M19wYXlfbW9kZV9CX2ZyYWdtZW50IChHc3RSdHBIMjYzUGF5ICogcnRwaDI2M3BheSwKKyAgICBHc3RSdHBIMjYzUGF5Q29udGV4dCAqIGNvbnRleHQsIEdzdFJ0cEgyNjNQYXlHb2IgKiBnb2IpCit7CisKKworICAgIC8qLS0tLS0tLS0tLSBNT0RFIEIgTU9ERSBGUkFHTUVOVEFUSU9OIC0tLS0tLS0tLS0qLworICBHc3RSdHBIMjYzUGF5TUIgKm1hYywgKm1hYzA7CisgIGd1aW50IG1heF9wYXlsb2FkX3NpemU7CisgIEdzdFJ0cEgyNjNQYXlCb3VuZHJ5IGJvdW5kcnk7CisgIGd1aW50IG1iOworICBndWludDggZWJpdDsKKworICBndWludCBmaXJzdCA9IDA7CisgIGd1aW50IHBheWxvYWRfbGVuOworCisgIG1heF9wYXlsb2FkX3NpemUgPQorICAgICAgY29udGV4dC0+bXR1IC0gR1NUX1JUUF9IMjYzX1BBWUxPQURfSEVBREVSX01PREVfQiAtIEdTVF9SVFBfSEVBREVSX0xFTjsKKworICBnc3RfcnRwX2gyNjNfcGF5X2JvdW5kcnlfaW5pdCAoJmJvdW5kcnksIGdvYi0+c3RhcnQsIGdvYi0+c3RhcnQsIGdvYi0+c2JpdCwKKyAgICAgIDApOworCisgIGdvYi0+bWFjcm9ibG9ja3MgPQorICAgICAgKEdzdFJ0cEgyNjNQYXlNQiAqKikgZ19tYWxsb2MwIChzaXplb2YgKEdzdFJ0cEgyNjNQYXlNQiAqKSAqCisgICAgICBmb3JtYXRfcHJvcHNbY29udGV4dC0+cGljbGF5ZXItPnB0eXBlX3NyY2Zvcm1hdF1bMV0pOworCisgIEdTVF9MT0dfT0JKRUNUIChydHBoMjYzcGF5LCAiR09CIGlzbid0IFBCIGZyYW1lLCBhcHBseWluZyBtb2RlIEIiKTsKKworICAvL2luaXRpYWxpemluZyB3aW5kb3cKKyAgY29udGV4dC0+d2luX2VuZCA9IGJvdW5kcnkuZW5kOworICBpZiAoZ3N0X3J0cF9oMjYzX3BheV9tb3ZlX3dpbmRvd19yaWdodCAocnRwaDI2M3BheSwgY29udGV4dCwgMzIsIGJvdW5kcnkuZWJpdCwKKyAgICAgICAgICAmYm91bmRyeS5lbmQsICZnb2ItPmVuZCkgIT0gMCkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGgyNjNwYXksCisgICAgICAgICJUaGUgcmVzdCBvZiB0aGUgYml0cyBzaG91bGQgYmUgMCwgZXhpdGluZywgYmVjYXVzZSBzb21ldGhpbmcgYmFkIGhhcHBlbmQiKTsKKyAgICBnb3RvIGRlY29kZV9lcnJvcjsKKyAgfQorICAvL1RoZSBmaXJzdCBHT0Igb2YgYSBmcmFtZSAiaGFzIG5vIiBhY3R1YWwgaGVhZGVyIC0gUElDVFVSRSBoZWFkZXIgaXMgaGlzIGhlYWRlcgorICBpZiAoZ29iLT5nb2JuID09IDApIHsKKyAgICBndWludCBzaGlmdDsKKyAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2M3BheSwgIkluaXRpYWwgR09CIik7CisgICAgc2hpZnQgPSA0MzsKKworICAgIGJvdW5kcnkuZWJpdCA9CisgICAgICAgIGdzdF9ydHBfaDI2M19wYXlfbW92ZV93aW5kb3dfcmlnaHQgKHJ0cGgyNjNwYXksIGNvbnRleHQsIHNoaWZ0LAorICAgICAgICBib3VuZHJ5LmViaXQsICZib3VuZHJ5LmVuZCwgJmdvYi0+ZW5kKTsKKworICAgIC8vV2UgbmVlZCBQUVVBTlQgZm9yIG1vZGUgQiBwYWNrYWdlcyAtIHNvIHdlIHN0b3JlIGl0CisgICAgZ29iLT5xdWFudCA9IGNvbnRleHQtPndpbmRvdyA+PiAyNzsKKworICAgIC8vaWYgUENNID09IDEsIHRoZW4gUFNCSSBpcyBwcmVzZW50IC0gaGVhZGVyIGhhcyA1MSBiaXRzCisgICAgLy9zaGlmdCBmb3IgUFFVQU5UICg1KSBhbmQgUENNICgxKSA9IDYgYml0cworICAgIHNoaWZ0ID0gNjsKKyAgICBpZiAoY29udGV4dC0+Y3BtID09IDEpCisgICAgICBzaGlmdCArPSAyOworICAgIGJvdW5kcnkuZWJpdCA9CisgICAgICAgIGdzdF9ydHBfaDI2M19wYXlfbW92ZV93aW5kb3dfcmlnaHQgKHJ0cGgyNjNwYXksIGNvbnRleHQsIHNoaWZ0LAorICAgICAgICBib3VuZHJ5LmViaXQsICZib3VuZHJ5LmVuZCwgJmdvYi0+ZW5kKTsKKworICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJ3aW5kb3c6IDB4JTA4eCIsIGNvbnRleHQtPndpbmRvdyk7CisKKyAgICAvL1NoaWZ0aW5nIHRoZSBQRUkgYW5kIFBTUEFSRSBmaWVsZHMKKyAgICB3aGlsZSAoKGNvbnRleHQtPndpbmRvdyAmIDB4ODAwMDAwMDApID09IDB4ODAwMDAwMDApIHsKKyAgICAgIGJvdW5kcnkuZWJpdCA9CisgICAgICAgICAgZ3N0X3J0cF9oMjYzX3BheV9tb3ZlX3dpbmRvd19yaWdodCAocnRwaDI2M3BheSwgY29udGV4dCwgOSwKKyAgICAgICAgICBib3VuZHJ5LmViaXQsICZib3VuZHJ5LmVuZCwgJmdvYi0+ZW5kKTsKKyAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJ3aW5kb3c6IDB4JTA4eCIsIGNvbnRleHQtPndpbmRvdyk7CisgICAgfQorCisgICAgLy9zaGlmdCB0aGUgbGFzdCBQRUkgZmllbGQKKyAgICBib3VuZHJ5LmViaXQgPQorICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X21vdmVfd2luZG93X3JpZ2h0IChydHBoMjYzcGF5LCBjb250ZXh0LCAxLAorICAgICAgICBib3VuZHJ5LmViaXQsICZib3VuZHJ5LmVuZCwgJmdvYi0+ZW5kKTsKKworICB9IGVsc2UgeworICAgIC8vc2tpcHBpbmcgR09CcyAyNCBoZWFkZXIgYml0cyArIDUgR1FVQU5UCisgICAgZ3VpbnQgc2hpZnQgPSAyNDsKKworICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJJTlRFUiBHT0IiKTsKKworICAgIC8vaWYgQ1BNID09IDEsIHRoZXJlIGFyZSAyIG1vcmUgYml0cyBpbiB0aGUgaGVhZGVyIC0gR1NCSSBoZWFkZXIgaXMgMzEgYml0cyBsb25nCisgICAgaWYgKGNvbnRleHQtPmNwbSA9PSAxKQorICAgICAgc2hpZnQgKz0gMjsKKworICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJ3aW5kb3c6IDB4JTA4eCIsIGNvbnRleHQtPndpbmRvdyk7CisgICAgYm91bmRyeS5lYml0ID0KKyAgICAgICAgZ3N0X3J0cF9oMjYzX3BheV9tb3ZlX3dpbmRvd19yaWdodCAocnRwaDI2M3BheSwgY29udGV4dCwgc2hpZnQsCisgICAgICAgIGJvdW5kcnkuZWJpdCwgJmJvdW5kcnkuZW5kLCAmZ29iLT5lbmQpOworCisgICAgLy9XZSBuZWVkIEdRVUFOVCBmb3IgbW9kZSBCIHBhY2thZ2VzIC0gc28gd2Ugc3RvcmUgaXQKKyAgICBnb2ItPnF1YW50ID0gY29udGV4dC0+d2luZG93ID4+IDI3OworCisgICAgc2hpZnQgPSA1OworICAgIGJvdW5kcnkuZWJpdCA9CisgICAgICAgIGdzdF9ydHBfaDI2M19wYXlfbW92ZV93aW5kb3dfcmlnaHQgKHJ0cGgyNjNwYXksIGNvbnRleHQsIHNoaWZ0LAorICAgICAgICBib3VuZHJ5LmViaXQsICZib3VuZHJ5LmVuZCwgJmdvYi0+ZW5kKTsKKworICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJ3aW5kb3c6IDB4JTA4eCIsIGNvbnRleHQtPndpbmRvdyk7CisgIH0KKworICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAiR1FVQU5UIElTOiAlMDh4IiwgZ29iLT5xdWFudCk7CisKKyAgLy8gV2UgYXJlIG9uIE1CIGxheWVyCisKKyAgbWFjID0gbWFjMCA9IGdzdF9ydHBfaDI2M19wYXlfbWJfbmV3ICgmYm91bmRyeSwgMCk7CisgIGZvciAobWIgPSAwOyBtYiA8IGZvcm1hdF9wcm9wc1tjb250ZXh0LT5waWNsYXllci0+cHR5cGVfc3JjZm9ybWF0XVsxXTsgbWIrKykgeworCisgICAgR1NUX1RSQUNFX09CSkVDVCAocnRwaDI2M3BheSwKKyAgICAgICAgIj09PT09PT09PT09PT09PT0gU1RBUlQgTUIgJWQgPT09PT09PT09PT09PT09PT0iLCBtYik7CisKKyAgICAvL0ZpbmQgbmV4dCBtYWNyb2Jsb2NrIGJvdW5kYXJpZXMKKyAgICBlYml0ID0gbWFjLT5lYml0OworICAgIGlmICghKG1hYyA9CisgICAgICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X0JfbWJmaW5kZXIgKHJ0cGgyNjNwYXksIGNvbnRleHQsIGdvYiwgbWFjLCBtYikpKSB7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBoMjYzcGF5LCAiRXJyb3IgZGVjb2RpbmcgTUIgLSBzYml0OiAlZCIsIDggLSBlYml0KTsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGgyNjNwYXksICJFcnJvciBkZWNvZGluZyBpbiBHT0IiKTsKKworICAgICAgZ3N0X3J0cF9oMjYzX3BheV9tYl9kZXN0cm95IChtYWMwKTsKKyAgICAgIGdvdG8gZGVjb2RlX2Vycm9yOworICAgIH0KKworICAgIC8qIFN0b3JlIG1hY3JvYmxvY2sgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyBhbmQgZGVsZXRlIG9sZCBNQiBpZiBhbnkgKi8KKyAgICBnc3RfcnRwX2gyNjNfcGF5X21iX2Rlc3Ryb3kgKGdvYi0+bWFjcm9ibG9ja3NbbWJdKTsKKyAgICBnb2ItPm1hY3JvYmxvY2tzW21iXSA9IG1hYzsKKworICAgIC8vSWYgbWJfdHlwZSA9PSBzdHVmZmluZywgZG9uJ3QgaW5jcmVtZW50IHRoZSBtYiBhZGRyZXNzCisgICAgaWYgKG1hYy0+bWJfdHlwZSA9PSAxMCkgeworICAgICAgbWItLTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0gZWxzZSB7CisgICAgICBnb2ItPm5tYWNyb2Jsb2NzKys7CisgICAgfQorCisgICAgaWYgKG1hYy0+ZW5kID49IGdvYi0+ZW5kKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2M3BheSwgIk5vIG1vcmUgTUJzIGluIHRoaXMgR09CIik7CisgICAgICBpZiAoIW1hYy0+ZWJpdCkgeworICAgICAgICBtYWMtPmVuZC0tOworICAgICAgfQorICAgICAgZ29iLT5lbmQgPSBtYWMtPmVuZDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgICAiRm91bmQgTUI6IG1iYTogJWQgc3RhcnQ6ICVwIGVuZDogJXAgbGVuOiAlZCBzYml0OiAlZCBlYml0OiAlZCIsCisgICAgICAgIG1hYy0+bWJhLCBtYWMtPnN0YXJ0LCBtYWMtPmVuZCwgbWFjLT5sZW5ndGgsIG1hYy0+c2JpdCwgbWFjLT5lYml0KTsKKyAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgICAiPT09PT09PT09PT09PT09PSBFTkQgTUIgJWQgPT09PT09PT09PT09PT09PT0iLCBtYik7CisgIH0KKyAgZ3N0X3J0cF9oMjYzX3BheV9tYl9kZXN0cm95IChtYWMwKTsKKworICBtYiA9IDA7CisgIGZpcnN0ID0gMDsKKyAgcGF5bG9hZF9sZW4gPSBib3VuZHJ5LmVuZCAtIGJvdW5kcnkuc3RhcnQgKyAxOworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTkVXIFBBQ0tBR0UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICB3aGlsZSAobWIgPCBnb2ItPm5tYWNyb2Jsb2NzKSB7CisgICAgaWYgKHBheWxvYWRfbGVuICsgZ29iLT5tYWNyb2Jsb2Nrc1ttYl0tPmxlbmd0aCA8IG1heF9wYXlsb2FkX3NpemUpIHsKKworICAgICAgLy9GSVhNRTogcGF5bG9hZF9sZW4gaXMgbm90IHRoZSByZWFsIGxlbmd0aCAtPiBpZ25vcmluZyBzYml0L2ViaXQKKyAgICAgIHBheWxvYWRfbGVuICs9IGdvYi0+bWFjcm9ibG9ja3NbbWJdLT5sZW5ndGg7CisgICAgICBtYisrOworCisgICAgfSBlbHNlIHsKKyAgICAgIC8vRklYTUU6IHdlIHNob3VsZCBpbmNsdWRlIHRoZSBsYXN0IGZldyBiaXRzIG9mIHRoZSBHT0IgaW4gdGhlIHBhY2thZ2UgLSBkbyB3ZSBkbyB0aGF0IG5vdz8KKyAgICAgIC8vR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BheSwgIlB1c2hpbmcgR09CUyAlZCB0byAlZCBiZWNhdXNlIHBheWxvYWQgc2l6ZSBpcyAlZCIsIGZpcnN0LAorICAgICAgLy8gICAgZmlyc3QgPT0gbWIgLSAxLCBwYXlsb2FkX2xlbik7CisKKyAgICAgIC8vIEZJWE1FOiBzZWdmYXVsdCBpZiBtYiA9PSAwIChmaXJzdCBNQiBpcyBsYXJnZXIgdGhhbiBtYXhfcGF5bG9hZF9zaXplKQorICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BheSwgIlB1c2ggQiBtb2RlIGZyYWdtZW50IGZyb20gbWIgJWQgdG8gJWQiLAorICAgICAgICAgIGZpcnN0LCBtYiAtIDEpOworICAgICAgaWYgKGdzdF9ydHBfaDI2M19wYXlfQl9mcmFnbWVudF9wdXNoIChydHBoMjYzcGF5LCBjb250ZXh0LCBnb2IsIGZpcnN0LAorICAgICAgICAgICAgICBtYiAtIDEsICZib3VuZHJ5KSkgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChydHBoMjYzcGF5LCAiT29vb3BzLCB0aGVyZSB3YXMgYW4gZXJyb3Igc2VuZGluZyIpOworICAgICAgICBnb3RvIGRlY29kZV9lcnJvcjsKKyAgICAgIH0KKworICAgICAgcGF5bG9hZF9sZW4gPSAwOworICAgICAgZmlyc3QgPSBtYjsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwYXksCisgICAgICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRU5EIFBBQ0tBR0UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BheSwKKyAgICAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBORVcgUEFDS0FHRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgfQorICB9CisKKyAgLyogUHVzaCByZXN0ICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJSZW1haW5kZXIgZmlyc3Q6ICVkLCBNQjogJWQiLCBmaXJzdCwgbWIpOworICBpZiAocGF5bG9hZF9sZW4gIT0gMCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJQdXNoIEIgbW9kZSBmcmFnbWVudCBmcm9tIG1iICVkIHRvICVkIiwKKyAgICAgICAgZmlyc3QsIG1iIC0gMSk7CisgICAgaWYgKGdzdF9ydHBfaDI2M19wYXlfQl9mcmFnbWVudF9wdXNoIChydHBoMjYzcGF5LCBjb250ZXh0LCBnb2IsIGZpcnN0LAorICAgICAgICAgICAgbWIgLSAxLCAmYm91bmRyeSkpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGgyNjNwYXksICJPb29vcHMsIHRoZXJlIHdhcyBhbiBlcnJvciBzZW5kaW5nISIpOworICAgICAgZ290byBkZWNvZGVfZXJyb3I7CisgICAgfQorICB9CisKKyAgICAvKi0tLS0tLS0tLS0gRU5EIE9GIE1PREUgQiBGUkFHTUVOVEFUSU9OIC0tLS0tLS0tLS0qLworCisgIHJldHVybiBUUlVFOworCitkZWNvZGVfZXJyb3I6CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfaDI2M19zZW5kX2VudGlyZV9mcmFtZSAoR3N0UnRwSDI2M1BheSAqIHJ0cGgyNjNwYXksCisgICAgR3N0UnRwSDI2M1BheUNvbnRleHQgKiBjb250ZXh0KQoreworICBHc3RSdHBIMjYzUGF5UGFja2FnZSAqcGFjazsKKyAgcGFjayA9CisgICAgICBnc3RfcnRwX2gyNjNfcGF5X3BhY2thZ2VfbmV3IChydHBoMjYzcGF5LT5kYXRhLAorICAgICAgcnRwaDI2M3BheS0+ZGF0YSArIHJ0cGgyNjNwYXktPmF2YWlsYWJsZV9kYXRhLAorICAgICAgcnRwaDI2M3BheS0+YXZhaWxhYmxlX2RhdGEsIDAsIDAsIE5VTEwsIFRSVUUpOworICBwYWNrLT5tb2RlID0gR1NUX1JUUF9IMjYzX1BBWUxPQURfSEVBREVSX01PREVfQTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LCAiQXZhaWxhYmxlIGRhdGE6ICVkIiwKKyAgICAgIHJ0cGgyNjNwYXktPmF2YWlsYWJsZV9kYXRhKTsKKworICBwYWNrLT5vdXRidWYgPQorICAgICAgZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChHU1RfUlRQX0gyNjNfUEFZTE9BRF9IRUFERVJfTU9ERV9BLCAwLCAwKTsKKworICByZXR1cm4gZ3N0X3J0cF9oMjYzX3BheV9wdXNoIChydHBoMjYzcGF5LCBjb250ZXh0LCBwYWNrKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfaDI2M19wYXlfZmx1c2ggKEdzdFJ0cEgyNjNQYXkgKiBydHBoMjYzcGF5KQoreworCisgIC8qCisgICAqIEZJWE1FOiBHU1RVRiBiaXRzIGFyZSBpZ25vcmVkIHJpZ2h0IG5vdywKKyAgICogIC0gbm90IHVzaW5nIEVCSVQvU0JJVCBwYXlsb2FkIGhlYWRlciBmaWVsZHMgaW4gbW9kZSBBIGZyYWdtZW50YXRpb24gLSBmZm1wZWcgZG9lc24ndCBuZWVkIHRoZW0sIGJ1dCBvdGhlcnM/CisgICAqLworCisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RSdHBIMjYzUGF5Q29udGV4dCAqY29udGV4dDsKKyAgZ2ludCBpOworCisgIHJldCA9IDA7CisgIGNvbnRleHQgPSAoR3N0UnRwSDI2M1BheUNvbnRleHQgKikgZ19tYWxsb2MwIChzaXplb2YgKEdzdFJ0cEgyNjNQYXlDb250ZXh0KSk7CisgIGNvbnRleHQtPm10dSA9CisgICAgICBydHBoMjYzcGF5LT5wYXlsb2FkLm10dSAtIChNVFVfU0VDVVJJVFlfT0ZGU0VUICsgR1NUX1JUUF9IRUFERVJfTEVOICsKKyAgICAgIEdTVF9SVFBfSDI2M19QQVlMT0FEX0hFQURFUl9NT0RFX0MpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJNVFU6ICVkIiwgY29udGV4dC0+bXR1KTsKKyAgcnRwaDI2M3BheS0+YXZhaWxhYmxlX2RhdGEgPSBnc3RfYnVmZmVyX2dldF9zaXplIChydHBoMjYzcGF5LT5jdXJyZW50X2J1ZmZlcik7CisgIGlmIChydHBoMjYzcGF5LT5hdmFpbGFibGVfZGF0YSA9PSAwKSB7CisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgZ290byBlbmQ7CisgIH0KKworICAvKiBHZXQgYSBwb2ludGVyIHRvIGFsbCB0aGUgZGF0YSBmb3IgdGhlIGZyYW1lICovCisgIGdzdF9idWZmZXJfbWFwIChydHBoMjYzcGF5LT5jdXJyZW50X2J1ZmZlciwgJnJ0cGgyNjNwYXktPm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcnRwaDI2M3BheS0+ZGF0YSA9IChndWludDggKikgcnRwaDI2M3BheS0+bWFwLmRhdGE7CisKKyAgLyogUGljdHVyZSBoZWFkZXIgKi8KKyAgY29udGV4dC0+cGljbGF5ZXIgPSAoR3N0UnRwSDI2M1BheVBpYyAqKSBydHBoMjYzcGF5LT5kYXRhOworCisgIGlmIChjb250ZXh0LT5waWNsYXllci0+cHR5cGVfcGljdHlwZSA9PSAwKQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJXZSBnb3QgYW4gSS1mcmFtZSIpOworICBlbHNlCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BheSwgIldlIGdvdCBhIFAtZnJhbWUiKTsKKworICBjb250ZXh0LT5jcG0gPSBydHBoMjYzcGF5LT5kYXRhWzZdID4+IDc7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BheSwgIkNQTTogJWQiLCBjb250ZXh0LT5jcG0pOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJQYXlsb2FkIGxlbmd0aCBpczogJWQiLAorICAgICAgcnRwaDI2M3BheS0+YXZhaWxhYmxlX2RhdGEpOworCisgIC8qCisgICAqIC0gTU9ERSBBIC0gSWYgbm9ybWFsLCBJIGFuZCBQIGZyYW1lcywgIC0+IG1vZGUgQQorICAgKiAgIC0gR09CIGxheWVyIGZyYWdtZW50YXRpb24KKyAgICogLSBNT0RFIEIgLSBJZiBub3JtYWwsIEkgYW5kIFAgZnJhbWVzLCBidXQgR09CcyA+IG10dQorICAgKiAgIC0gTUIgbGF5ZXIgZnJhZ21lbnRhdGlvbgorICAgKiAtIE1PREUgQyAtIEZvciBQIGZyYW1lcyB3aXRoIFBCIG9wdGlvbiwgYnV0IEdPQnMgPiBtdHUKKyAgICogICAtIE1CIGxheWVyIGZyYWdtZW50YXRpb24KKyAgICovCisgIGlmIChydHBoMjYzcGF5LT5hdmFpbGFibGVfZGF0YSArIEdTVF9SVFBfSDI2M19QQVlMT0FEX0hFQURFUl9NT0RFX0EgKworICAgICAgR1NUX1JUUF9IRUFERVJfTEVOIDwgY29udGV4dC0+bXR1KSB7CisgICAgcmV0ID0gZ3N0X3J0cF9oMjYzX3NlbmRfZW50aXJlX2ZyYW1lIChydHBoMjYzcGF5LCBjb250ZXh0KTsKKyAgfSBlbHNlIHsKKworICAgICAgLyotLS0tLS0tLS0tIEZSQUdNRU5USU5HIFRIRSBGUkFNRSBCRUNBVVNFIFRPTyBMQVJHRSBUTyBGSVQgSU4gTVRVIC0tLS0tLS0tLS0qLworICAgIEdzdFJ0cEgyNjNQYXlCb3VuZHJ5IGJvdW5kOworICAgIGdpbnQgZmlyc3Q7CisgICAgZ3VpbnQgcGF5bG9hZF9sZW47CisgICAgZ2Jvb2xlYW4gZm9yY2VhID0gRkFMU0U7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LCAiRnJhbWUgdG9vIGxhcmdlIGZvciBNVFUiKTsKKyAgICAvKgorICAgICAqIExldCdzIGdvIHRyb3VnaCBhbGwgdGhlIGRhdGEgYW5kIGZyYWdtZW50IGl0IHVudGlsbCBlbmQgaXMgcmVhY2hlZAorICAgICAqLworCisgICAgZ3N0X3J0cF9oMjYzX3BheV9ib3VuZHJ5X2luaXQgKCZib3VuZCwgTlVMTCwgcnRwaDI2M3BheS0+ZGF0YSAtIDEsIDAsIDApOworICAgIGNvbnRleHQtPmdvYnMgPQorICAgICAgICAoR3N0UnRwSDI2M1BheUdvYiAqKikgZ19tYWxsb2MwIChmb3JtYXRfcHJvcHNbY29udGV4dC0+cGljbGF5ZXItPgorICAgICAgICAgICAgcHR5cGVfc3JjZm9ybWF0XVswXSAqIHNpemVvZiAoR3N0UnRwSDI2M1BheUdvYiAqKSk7CisKKworICAgIGZvciAoaSA9IDA7IGkgPCBmb3JtYXRfcHJvcHNbY29udGV4dC0+cGljbGF5ZXItPnB0eXBlX3NyY2Zvcm1hdF1bMF07IGkrKykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BheSwgIlNlYXJjaGluZyBmb3IgZ29iICVkIiwgaSk7CisgICAgICBpZiAoIWdzdF9ydHBfaDI2M19wYXlfZ29iZmluZGVyIChydHBoMjYzcGF5LCAmYm91bmQpKSB7CisgICAgICAgIGlmIChpIDw9IDEpIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cGgyNjNwYXksCisgICAgICAgICAgICAgICJObyBHT0IncyB3ZXJlIGZvdW5kIGluIGRhdGEgc3RyZWFtISBQbGVhc2UgZW5hYmxlIFJUUCBtb2RlIGluIGVuY29kZXIuIEZvcmNpbmcgbW9kZSBBIGZvciBub3cuIik7CisgICAgICAgICAgcmV0ID0gZ3N0X3J0cF9oMjYzX3NlbmRfZW50aXJlX2ZyYW1lIChydHBoMjYzcGF5LCBjb250ZXh0KTsKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiB0cnkgdG8gc2VuZCBmcmFnbWVudHMgY29ycmVzcG9uZGluZyB0byBmb3VuZCBHT0JzICovCisgICAgICAgICAgZm9yY2VhID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjb250ZXh0LT5nb2JzW2ldID0gZ3N0X3J0cF9oMjYzX3BheV9nb2JfbmV3ICgmYm91bmQsIGkpOworICAgICAgLy9GSVhNRSAtIGVuY29kZXJzIG1heSBnZW5lcmF0ZSBhbiBFT1MgZ29iIHRoYXQgaGFzIHRvIGJlIHByb2Nlc3NlZAorICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BheSwKKyAgICAgICAgICAiR29iIHZhbHVlcyBhcmU6IGdvYm46ICVkLCBzdGFydDogJXAgbGVuOiAlZCBlYml0OiAlZCBzYml0OiAlZCIsIGksCisgICAgICAgICAgY29udGV4dC0+Z29ic1tpXS0+c3RhcnQsIGNvbnRleHQtPmdvYnNbaV0tPmxlbmd0aCwKKyAgICAgICAgICBjb250ZXh0LT5nb2JzW2ldLT5lYml0LCBjb250ZXh0LT5nb2JzW2ldLT5zYml0KTsKKyAgICB9CisgICAgLyogTk9URSBzb21lIHBsYWNlcyBtYXkgc3RpbGwgYXNzdW1lIHRoaXMgdG8gYmUgdGhlIG1heCBwb3NzaWJsZSAqLworICAgIGNvbnRleHQtPm5vX2dvYnMgPSBpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJGb3VuZCAlZCBHT0JTIG9mIG1heGltdW0gJWQiLAorICAgICAgICBjb250ZXh0LT5ub19nb2JzLCBmb3JtYXRfcHJvcHNbY29udGV4dC0+cGljbGF5ZXItPnB0eXBlX3NyY2Zvcm1hdF1bMF0pOworCisgICAgLy8gTWFrZSBwYWNrYWdlcyBzbWFsbGVyIHRoYW4gTVRVCisgICAgLy8gICBBIG1vZGUKKyAgICAvLyAtIGlmICggR09CID4gTVRVKSAtPiBCIG1vZGUgfHwgQyBtb2RlCisgICAgLy8gICBQdXNoIHBhY2thZ2VzCisKKyAgICBmaXJzdCA9IDA7CisgICAgcGF5bG9hZF9sZW4gPSAwOworICAgIGkgPSAwOworICAgIHdoaWxlIChpIDwgY29udGV4dC0+bm9fZ29icykgeworCisgICAgICBpZiAoY29udGV4dC0+Z29ic1tpXS0+bGVuZ3RoID49IGNvbnRleHQtPm10dSkgeworICAgICAgICBpZiAocGF5bG9hZF9sZW4gPT0gMCkgeworCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BheSwgIkdPQiBsZW4gPiBNVFUiKTsKKyAgICAgICAgICBpZiAocnRwaDI2M3BheS0+cHJvcF9wYXlsb2FkX21vZGUgfHwgZm9yY2VhKSB7CisgICAgICAgICAgICBwYXlsb2FkX2xlbiA9IGNvbnRleHQtPmdvYnNbaV0tPmxlbmd0aDsKKyAgICAgICAgICAgIGdvdG8gZm9yY2VfYTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFjb250ZXh0LT5waWNsYXllci0+cHR5cGVfcGJtb2RlKSB7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LCAiTU9ERSBCIG9uIEdPQiAlZCBuZWVkZWQiLCBpKTsKKyAgICAgICAgICAgIGlmICghZ3N0X3J0cF9oMjYzX3BheV9tb2RlX0JfZnJhZ21lbnQgKHJ0cGgyNjNwYXksIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmdvYnNbaV0pKSB7CisgICAgICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGgyNjNwYXksCisgICAgICAgICAgICAgICAgICAiVGhlcmUgd2FzIGFuIGVycm9yIGZyYWdtZW50aW5nIGluIG1vZGUgQiIpOworICAgICAgICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vSU1QTEVNRU5UIEMgbW9kZQorICAgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwaDI2M3BheSwKKyAgICAgICAgICAgICAgICAiTU9ERSBDIG9uIEdPQiAlZCBuZWVkZWQsIGJ1dCBub3Qgc3VwcG9ydGVkIHlldCIsIGkpOworICAgICAgICAgICAgLyppZighZ3N0X3J0cF9oMjYzX3BheV9tb2RlX0NfZnJhZ21lbnQocnRwaDI2M3BheSwgY29udGV4dCwgY29udGV4dC0+Z29ic1tpXSkpIHsKKyAgICAgICAgICAgICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgICAgICAgICAgICAgR1NUX0VSUk9SKCJUaGVyZSB3YXMgYW4gZXJyb3IgZnJhZ21lbnRpbmcgaW4gbW9kZSBDIik7CisgICAgICAgICAgICAgICBnb3RvIGRlY29kZV9lcnJvcjsKKyAgICAgICAgICAgICAgIH0gKi8KKyAgICAgICAgICAgIGdvdG8gZGVjb2RlX2Vycm9yOworICAgICAgICAgIH0KKyAgICAgICAgZGVjb2RlX2Vycm9yOgorICAgICAgICAgIGkrKzsKKyAgICAgICAgICBmaXJzdCA9IGk7CisgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIHBheWxvYWRfYV9wdXNoOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChwYXlsb2FkX2xlbiArIGNvbnRleHQtPmdvYnNbaV0tPmxlbmd0aCA8IGNvbnRleHQtPm10dSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LCAiR09CICVkIGZpbGxzIG10dSIsIGkpOworICAgICAgICBwYXlsb2FkX2xlbiArPSBjb250ZXh0LT5nb2JzW2ldLT5sZW5ndGg7CisgICAgICAgIGkrKzsKKyAgICAgICAgaWYgKGkgPT0gY29udGV4dC0+bm9fZ29icykgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJMQVNUIEdPQiAlZCIsIGkpOworICAgICAgICAgIGdvdG8gcGF5bG9hZF9hX3B1c2g7CisgICAgICAgIH0KKworICAgICAgfSBlbHNlIHsKKyAgICAgIHBheWxvYWRfYV9wdXNoOgorICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgICAgICAgIlB1c2hpbmcgR09CUyAlZCB0byAlZCBiZWNhdXNlIHBheWxvYWQgc2l6ZSBpcyAlZCIsIGZpcnN0LAorICAgICAgICAgICAgZmlyc3QgPT0gaSA/IGkgOiBpIC0gMSwgcGF5bG9hZF9sZW4pOworICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X0FfZnJhZ21lbnRfcHVzaCAocnRwaDI2M3BheSwgY29udGV4dCwgZmlyc3QsCisgICAgICAgICAgICBmaXJzdCA9PSBpID8gaSA6IGkgLSAxKTsKKyAgICAgICAgcGF5bG9hZF9sZW4gPSAwOworICAgICAgICBmaXJzdCA9IGk7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKworICAgIGZvcmNlX2E6CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgICAgICJQdXNoaW5nIEdPQlMgJWQgdG8gJWQgYmVjYXVzZSBwYXlsb2FkIHNpemUgaXMgJWQiLCBmaXJzdCwgaSwKKyAgICAgICAgICBwYXlsb2FkX2xlbik7CisgICAgICBnc3RfcnRwX2gyNjNfcGF5X0FfZnJhZ21lbnRfcHVzaCAocnRwaDI2M3BheSwgY29udGV4dCwgZmlyc3QsIGkpOworICAgICAgcGF5bG9hZF9sZW4gPSAwOworICAgICAgaSsrOworICAgICAgZmlyc3QgPSBpOworICAgIH0KKworCisgIH0vKi0tLS0tLS0tLS0gRU5EIE9GIEZSQUdNRU5UQVRJT04gLS0tLS0tLS0tLSovCisKKyAgLyogRmx1c2ggdGhlIGlucHV0IGJ1ZmZlciBkYXRhICovCisKK2VuZDoKKyAgZ3N0X3J0cF9oMjYzX3BheV9jb250ZXh0X2Rlc3Ryb3kgKGNvbnRleHQsCisgICAgICBjb250ZXh0LT5waWNsYXllci0+cHR5cGVfc3JjZm9ybWF0KTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAocnRwaDI2M3BheS0+Y3VycmVudF9idWZmZXIsICZydHBoMjYzcGF5LT5tYXApOworICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZydHBoMjYzcGF5LT5jdXJyZW50X2J1ZmZlciwgTlVMTCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfaDI2M19wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisKKyAgR3N0UnRwSDI2M1BheSAqcnRwaDI2M3BheTsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgcnRwaDI2M3BheSA9IEdTVF9SVFBfSDI2M19QQVkgKHBheWxvYWQpOworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tIE5FVyBGUkFNRSAtLS0tLS0tLS0tLS0tLS0iKTsKKworICBydHBoMjYzcGF5LT5maXJzdF90cyA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworCisgIGdzdF9idWZmZXJfcmVwbGFjZSAoJnJ0cGgyNjNwYXktPmN1cnJlbnRfYnVmZmVyLCBidWZmZXIpOworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgIC8qIHdlIGFsd2F5cyBlbmNvZGUgYW5kIGZsdXNoIGEgZnVsbCBwaWN0dXJlICovCisgIHJldCA9IGdzdF9ydHBfaDI2M19wYXlfZmx1c2ggKHJ0cGgyNjNwYXkpOworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tIEVORCBGUkFNRSAtLS0tLS0tLS0tLS0tLS0iKTsKKworICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9oMjYzX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGgyNjNwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfSDI2M19QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmggYi9nc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWJmYzg3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmgKQEAgLTAsMCArMSw0MTUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKiBBdXRob3I6IERlamFuIFNha2Vsc2FrIHNhaGVsQGtpYmVycGlwYS5vcmcKKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9IMjYzX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0gyNjNfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworI2RlZmluZSBHU1RfVFlQRV9SVFBfSDI2M19QQVkgXAorICAoZ3N0X3J0cF9oMjYzX3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0gyNjNfUEFZKG9iaikgXAorIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfSDI2M19QQVksR3N0UnRwSDI2M1BheSkpCisjZGVmaW5lIEdTVF9SVFBfSDI2M19QQVlfQ0xBU1Moa2xhc3MpIFwKKyAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSDI2M19QQVksR3N0UnRwSDI2M1BheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9IMjYzX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9IMjYzX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfSDI2M19QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0gyNjNfUEFZKSkKKy8vIGJsb2NrcyBwZXIgbWFjcm9ibG9jaworI2RlZmluZSBOX0JMT0NLUyA2CisjZGVmaW5lIERFRkFVTFRfTU9ERV9BIEZBTFNFCisjZGVmaW5lIE1UVV9TRUNVUklUWV9PRkZTRVQgNTAKKyAgICB0eXBlZGVmIGVudW0gX0dzdFJ0cEgyNjNQYXlIZWFkZXJNb2RlCit7CisgIEdTVF9SVFBfSDI2M19QQVlMT0FEX0hFQURFUl9NT0RFX0EgPSA0LAorICBHU1RfUlRQX0gyNjNfUEFZTE9BRF9IRUFERVJfTU9ERV9CID0gOCwKKyAgR1NUX1JUUF9IMjYzX1BBWUxPQURfSEVBREVSX01PREVfQyA9IDEyCit9IEdzdFJ0cEgyNjNQYXlIZWFkZXJNb2RlOworCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSDI2M1BheUNvbnRleHQgR3N0UnRwSDI2M1BheUNvbnRleHQ7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSDI2M1BheVBpYyBHc3RSdHBIMjYzUGF5UGljOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjNQYXlDbGFzcyBHc3RSdHBIMjYzUGF5Q2xhc3M7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSDI2M1BheSBHc3RSdHBIMjYzUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjNQYXlCb3VuZHJ5IEdzdFJ0cEgyNjNQYXlCb3VuZHJ5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjNQYXlNQiBHc3RSdHBIMjYzUGF5TUI7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSDI2M1BheUdvYiBHc3RSdHBIMjYzUGF5R29iOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjNQYXlQYWNrYWdlIEdzdFJ0cEgyNjNQYXlQYWNrYWdlOworCisvL3R5cGVkZWYgZW51bSBfR3N0UnRwSDI2M1BheUhlYWRlck1vZGUgR3N0UnRwSDI2M1BheUhlYWRlck1vZGU7CisKK3N0cnVjdCBfR3N0UnRwSDI2M1BheQoreworICBHc3RSVFBCYXNlUGF5bG9hZCBwYXlsb2FkOworCisgIEdzdEJ1ZmZlciAqY3VycmVudF9idWZmZXI7CisgIEdzdE1hcEluZm8gbWFwOworCisgIEdzdENsb2NrVGltZSBmaXJzdF90czsKKyAgZ2Jvb2xlYW4gcHJvcF9wYXlsb2FkX21vZGU7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQgYXZhaWxhYmxlX2RhdGE7CisKK307CisKK3N0cnVjdCBfR3N0UnRwSDI2M1BheUNvbnRleHQKK3sKKyAgR3N0UnRwSDI2M1BheVBpYyAqcGljbGF5ZXI7CisKKyAgZ3VpbnQgbXR1OworICBndWludCB3aW5kb3c7CisgIGd1aW50OCAqd2luX2VuZDsKKyAgZ3VpbnQ4IGNwbTsKKworICBndWludCBub19nb2JzOworICBHc3RSdHBIMjYzUGF5R29iICoqZ29iczsKKworfTsKKworc3RydWN0IF9Hc3RSdHBIMjYzUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSDI2M1BheUFIZWFkZXIKK3sKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOCisgIHVuc2lnbmVkIGludCBlYml0OjM7ICAgICAgICAgIC8qIEVuZCBwb3NpdGlvbiAqLworICB1bnNpZ25lZCBpbnQgc2JpdDozOyAgICAgICAgICAvKiBTdGFydCBwb3NpdGlvbiAqLworICB1bnNpZ25lZCBpbnQgcDoxOyAgICAgICAgICAgICAvKiBQQi1mcmFtZXMgbW9kZSAqLworICB1bnNpZ25lZCBpbnQgZjoxOyAgICAgICAgICAgICAvKiBmbGFnIGJpdCAqLworCisgIHVuc2lnbmVkIGludCByMToxOyAgICAgICAgICAgIC8qIFJlc2VydmVkICovCisgIHVuc2lnbmVkIGludCBhOjE7ICAgICAgICAgICAgIC8qIEFkdmFuY2VkIFByZWRpY3Rpb24gKi8KKyAgdW5zaWduZWQgaW50IHM6MTsgICAgICAgICAgICAgLyogc3ludGF4IGJhc2VkIGFyaXRobWV0aWMgY29kaW5nICovCisgIHVuc2lnbmVkIGludCB1OjE7ICAgICAgICAgICAgIC8qIFVucmVzdHJpY3RlZCBtb3Rpb24gdmVjdG9yICovCisgIHVuc2lnbmVkIGludCBpOjE7ICAgICAgICAgICAgIC8qIFBpY3R1cmUgY29kaW5nIHR5cGUgKi8KKyAgdW5zaWduZWQgaW50IHNyYzozOyAgICAgICAgICAgLyogU291cmNlIGZvcm1hdCAqLworCisgIHVuc2lnbmVkIGludCB0cmI6MzsgICAgICAgICAgIC8qIFRlbXBvcmFsIHJlZiBmb3IgQiBmcmFtZSAqLworICB1bnNpZ25lZCBpbnQgZGJxOjI7ICAgICAgICAgICAvKiBEaWZmZXJlbnRpYWwgUXVhbnRpc2F0aW9uIHBhcmFtZXRlciAqLworICB1bnNpZ25lZCBpbnQgcjI6MzsgICAgICAgICAgICAvKiBSZXNlcnZlZCAqLworI2VsaWYgR19CWVRFX09SREVSID09IEdfQklHX0VORElBTgorICB1bnNpZ25lZCBpbnQgZjoxOyAgICAgICAgICAgICAvKiBmbGFnIGJpdCAqLworICB1bnNpZ25lZCBpbnQgcDoxOyAgICAgICAgICAgICAvKiBQQi1mcmFtZXMgbW9kZSAqLworICB1bnNpZ25lZCBpbnQgc2JpdDozOyAgICAgICAgICAvKiBTdGFydCBwb3NpdGlvbiAqLworICB1bnNpZ25lZCBpbnQgZWJpdDozOyAgICAgICAgICAvKiBFbmQgcG9zaXRpb24gKi8KKworICB1bnNpZ25lZCBpbnQgc3JjOjM7ICAgICAgICAgICAvKiBTb3VyY2UgZm9ybWF0ICovCisgIHVuc2lnbmVkIGludCBpOjE7ICAgICAgICAgICAgIC8qIFBpY3R1cmUgY29kaW5nIHR5cGUgKi8KKyAgdW5zaWduZWQgaW50IHU6MTsgICAgICAgICAgICAgLyogVW5yZXN0cmljdGVkIG1vdGlvbiB2ZWN0b3IgKi8KKyAgdW5zaWduZWQgaW50IHM6MTsgICAgICAgICAgICAgLyogc3ludGF4IGJhc2VkIGFyaXRobWV0aWMgY29kaW5nICovCisgIHVuc2lnbmVkIGludCBhOjE7ICAgICAgICAgICAgIC8qIEFkdmFuY2VkIFByZWRpY3Rpb24gKi8KKyAgdW5zaWduZWQgaW50IHIxOjE7ICAgICAgICAgICAgLyogUmVzZXJ2ZWQgKi8KKworICB1bnNpZ25lZCBpbnQgcjI6MzsgICAgICAgICAgICAvKiBSZXNlcnZlZCAqLworICB1bnNpZ25lZCBpbnQgZGJxOjI7ICAgICAgICAgICAvKiBEaWZmZXJlbnRpYWwgUXVhbnRpc2F0aW9uIHBhcmFtZXRlciAqLworICB1bnNpZ25lZCBpbnQgdHJiOjM7ICAgICAgICAgICAvKiBUZW1wb3JhbCByZWYgZm9yIEIgZnJhbWUgKi8KKyNlbHNlCisjZXJyb3IgIkdfQllURV9PUkRFUiBzaG91bGQgYmUgYmlnIG9yIGxpdHRsZSBlbmRpYW4uIgorI2VuZGlmCisgIHVuc2lnbmVkIGludCB0cjo4OyAgICAgICAgICAgIC8qIFRlbXBvcmFsIHJlZiBmb3IgUCBmcmFtZSAqLworfSBHc3RSdHBIMjYzUGF5QUhlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjNQYXlCSGVhZGVyCit7CisjaWYgR19CWVRFX09SREVSID09IEdfTElUVExFX0VORElBTgorICB1bnNpZ25lZCBpbnQgZWJpdDozOyAgICAgICAgICAvKiBFbmQgcG9zaXRpb24gKi8KKyAgdW5zaWduZWQgaW50IHNiaXQ6MzsgICAgICAgICAgLyogU3RhcnQgcG9zaXRpb24gKi8KKyAgdW5zaWduZWQgaW50IHA6MTsgICAgICAgICAgICAgLyogUEItZnJhbWVzIG1vZGUgKi8KKyAgdW5zaWduZWQgaW50IGY6MTsgICAgICAgICAgICAgLyogZmxhZyBiaXQgKi8KKworICB1bnNpZ25lZCBpbnQgcXVhbnQ6NTsgICAgICAgICAvKiBRdWFudGl6YXRpb24gdmFsdWUgZm9yIGZpcnN0IE1CICovCisgIHVuc2lnbmVkIGludCBzcmM6MzsgICAgICAgICAgIC8qIFNvdXJjZSBmb3JtYXQgKi8KKworICB1bnNpZ25lZCBpbnQgbWJhMTozOyAgICAgICAgICAvKiBBZGRyZXNzIG9mIGZpcnN0IE1CIHN0YXJ0aW5nIGNvdW50IGZyb20gMCAtIHBhcnQxICovCisgIHVuc2lnbmVkIGludCBnb2JuOjU7ICAgICAgICAgIC8qIEdPQiBudW1iZXIgaW4gZWZmZWN0IGF0IHN0YXJ0IG9mIHBhY2tldCAqLworCisgIHVuc2lnbmVkIGludCByOjI7ICAgICAgICAgICAgIC8qIFJlc2VydmVkICovCisgIHVuc2lnbmVkIGludCBtYmEyOjY7ICAgICAgICAgIC8qIEFkZHJlc3Mgb2YgZmlyc3QgTUIgc3RhcnRpbmcgY291bnQgZnJvbSAwIC0gcGFydDIgKi8KKworICB1bnNpZ25lZCBpbnQgaG12MTE6NDsgICAgICAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAxIC0gcGFydCAxICovCisgIHVuc2lnbmVkIGludCBhOjE7ICAgICAgICAgICAgIC8qIEFkdmFuY2VkIFByZWRpY3Rpb24gKi8KKyAgdW5zaWduZWQgaW50IHM6MTsgICAgICAgICAgICAgLyogc3ludGF4IGJhc2VkIGFyaXRobWV0aWMgY29kaW5nICovCisgIHVuc2lnbmVkIGludCB1OjE7ICAgICAgICAgICAgIC8qIFVucmVzdHJpY3RlZCBtb3Rpb24gdmVjdG9yICovCisgIHVuc2lnbmVkIGludCBpOjE7ICAgICAgICAgICAgIC8qIFBpY3R1cmUgY29kaW5nIHR5cGUgKi8KKworICB1bnNpZ25lZCBpbnQgdm12MTE6NTsgICAgICAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHByZWRpY3RvciBmb3IgTUIgMSAtIHBhcnQgMSAqLworICB1bnNpZ25lZCBpbnQgaG12MTI6MzsgICAgICAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAxIC0gcGFydCAyICovCisKKyAgdW5zaWduZWQgaW50IGhtdjIxOjY7ICAgICAgICAgLyogaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIHByZWRpY3RvciBmb3IgTUIgMyAtIHBhcnQgMSAqLworICB1bnNpZ25lZCBpbnQgdm12MTI6MjsgICAgICAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHByZWRpY3RvciBmb3IgTUIgMSAtIHBhcnQgMiAqLworCisgIHVuc2lnbmVkIGludCB2bXYyMTo3OyAgICAgICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAzICovCisgIHVuc2lnbmVkIGludCBobXYyMjoxOyAgICAgICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBwcmVkaWN0b3IgZm9yIE1CIDMgLSBwYXJ0IDIgKi8KKworI2VsaWYgR19CWVRFX09SREVSID09IEdfQklHX0VORElBTgorICB1bnNpZ25lZCBpbnQgZjoxOyAgICAgICAgICAgICAvKiBmbGFnIGJpdCAqLworICB1bnNpZ25lZCBpbnQgcDoxOyAgICAgICAgICAgICAvKiBQQi1mcmFtZXMgbW9kZSAqLworICB1bnNpZ25lZCBpbnQgc2JpdDozOyAgICAgICAgICAvKiBTdGFydCBwb3NpdGlvbiAqLworICB1bnNpZ25lZCBpbnQgZWJpdDozOyAgICAgICAgICAvKiBFbmQgcG9zaXRpb24gKi8KKworICB1bnNpZ25lZCBpbnQgc3JjOjM7ICAgICAgICAgICAvKiBTb3VyY2UgZm9ybWF0ICovCisgIHVuc2lnbmVkIGludCBxdWFudDo1OyAgICAgICAgIC8qIFF1YW50aXphdGlvbiB2YWx1ZSBmb3IgZmlyc3QgTUIgKi8KKworICB1bnNpZ25lZCBpbnQgZ29ibjo1OyAgICAgICAgICAvKiBHT0IgbnVtYmVyIGluIGVmZmVjdCBhdCBzdGFydCBvZiBwYWNrZXQgKi8KKyAgdW5zaWduZWQgaW50IG1iYTE6MzsgICAgICAgICAgLyogQWRkcmVzcyBvZiBmaXJzdCBNQiBzdGFydGluZyBjb3VudCBmcm9tIDAgLSBwYXJ0MSAqLworCisgIHVuc2lnbmVkIGludCBtYmEyOjY7ICAgICAgICAgIC8qIEFkZHJlc3Mgb2YgZmlyc3QgTUIgc3RhcnRpbmcgY291bnQgZnJvbSAwIC0gcGFydDIgKi8KKyAgdW5zaWduZWQgaW50IHI6MjsgICAgICAgICAgICAgLyogUmVzZXJ2ZWQgKi8KKworICB1bnNpZ25lZCBpbnQgaToxOyAgICAgICAgICAgICAvKiBQaWN0dXJlIGNvZGluZyB0eXBlICovCisgIHVuc2lnbmVkIGludCB1OjE7ICAgICAgICAgICAgIC8qIFVucmVzdHJpY3RlZCBtb3Rpb24gdmVjdG9yICovCisgIHVuc2lnbmVkIGludCBzOjE7ICAgICAgICAgICAgIC8qIHN5bnRheCBiYXNlZCBhcml0aG1ldGljIGNvZGluZyAqLworICB1bnNpZ25lZCBpbnQgYToxOyAgICAgICAgICAgICAvKiBBZHZhbmNlZCBQcmVkaWN0aW9uICovCisgIHVuc2lnbmVkIGludCBobXYxMTo0OyAgICAgICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBwcmVkaWN0b3IgZm9yIE1CIDEgLSBwYXJ0IDEgKi8KKworICB1bnNpZ25lZCBpbnQgaG12MTI6MzsgICAgICAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAxIC0gcGFydCAyICovCisgIHVuc2lnbmVkIGludCB2bXYxMTo1OyAgICAgICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAxIC0gcGFydCAxICovCisKKyAgdW5zaWduZWQgaW50IHZtdjEyOjI7ICAgICAgICAgLyogdmVydGljYWwgbW90aW9uIHZlY3RvciBwcmVkaWN0b3IgZm9yIE1CIDEgLSBwYXJ0IDIgKi8KKyAgdW5zaWduZWQgaW50IGhtdjIxOjY7ICAgICAgICAgLyogaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIHByZWRpY3RvciBmb3IgTUIgMyAtIHBhcnQgMSAqLworCisgIHVuc2lnbmVkIGludCBobXYyMjoxOyAgICAgICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBwcmVkaWN0b3IgZm9yIE1CIDMgLSBwYXJ0IDIgKi8KKyAgdW5zaWduZWQgaW50IHZtdjIxOjc7ICAgICAgICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAzICovCisjZWxzZQorI2Vycm9yICJHX0JZVEVfT1JERVIgc2hvdWxkIGJlIGJpZyBvciBsaXR0bGUgZW5kaWFuLiIKKyNlbmRpZgorfSBHc3RSdHBIMjYzUGF5QkhlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjNQYXlDSGVhZGVyCit7CisjaWYgR19CWVRFX09SREVSID09IEdfTElUVExFX0VORElBTgorICB1bnNpZ25lZCBpbnQgZWJpdDozOyAgICAgICAgICAvKiBFbmQgcG9zaXRpb24gKi8KKyAgdW5zaWduZWQgaW50IHNiaXQ6MzsgICAgICAgICAgLyogU3RhcnQgcG9zaXRpb24gKi8KKyAgdW5zaWduZWQgaW50IHA6MTsgICAgICAgICAgICAgLyogUEItZnJhbWVzIG1vZGUgKi8KKyAgdW5zaWduZWQgaW50IGY6MTsgICAgICAgICAgICAgLyogZmxhZyBiaXQgKi8KKworICB1bnNpZ25lZCBpbnQgcXVhbnQ6NTsgICAgICAgICAvKiBRdWFudGl6YXRpb24gdmFsdWUgZm9yIGZpcnN0IE1CICovCisgIHVuc2lnbmVkIGludCBzcmM6MzsgICAgICAgICAgIC8qIFNvdXJjZSBmb3JtYXQgKi8KKworICB1bnNpZ25lZCBpbnQgbWJhMTozOyAgICAgICAgICAvKiBBZGRyZXNzIG9mIGZpcnN0IE1CIHN0YXJ0aW5nIGNvdW50IGZyb20gMCAtIHBhcnQxICovCisgIHVuc2lnbmVkIGludCBnb2JuOjU7ICAgICAgICAgIC8qIEdPQiBudW1iZXIgaW4gZWZmZWN0IGF0IHN0YXJ0IG9mIHBhY2tldCAqLworCisgIHVuc2lnbmVkIGludCByOjI7ICAgICAgICAgICAgIC8qIFJlc2VydmVkICovCisgIHVuc2lnbmVkIGludCBtYmEyOjY7ICAgICAgICAgIC8qIEFkZHJlc3Mgb2YgZmlyc3QgTUIgc3RhcnRpbmcgY291bnQgZnJvbSAwIC0gcGFydDIgKi8KKworICB1bnNpZ25lZCBpbnQgaG12MTE6NDsgICAgICAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAxIC0gcGFydCAxICovCisgIHVuc2lnbmVkIGludCBhOjE7ICAgICAgICAgICAgIC8qIEFkdmFuY2VkIFByZWRpY3Rpb24gKi8KKyAgdW5zaWduZWQgaW50IHM6MTsgICAgICAgICAgICAgLyogc3ludGF4IGJhc2VkIGFyaXRobWV0aWMgY29kaW5nICovCisgIHVuc2lnbmVkIGludCB1OjE7ICAgICAgICAgICAgIC8qIFVucmVzdHJpY3RlZCBtb3Rpb24gdmVjdG9yICovCisgIHVuc2lnbmVkIGludCBpOjE7ICAgICAgICAgICAgIC8qIFBpY3R1cmUgY29kaW5nIHR5cGUgKi8KKworICB1bnNpZ25lZCBpbnQgdm12MTE6NTsgICAgICAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHByZWRpY3RvciBmb3IgTUIgMSAtIHBhcnQgMSAqLworICB1bnNpZ25lZCBpbnQgaG12MTI6MzsgICAgICAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAxIC0gcGFydCAyICovCisKKyAgdW5zaWduZWQgaW50IGhtdjIxOjY7ICAgICAgICAgLyogaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIHByZWRpY3RvciBmb3IgTUIgMyAtIHBhcnQgMSAqLworICB1bnNpZ25lZCBpbnQgdm12MTI6MjsgICAgICAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHByZWRpY3RvciBmb3IgTUIgMSAtIHBhcnQgMiAqLworCisgIHVuc2lnbmVkIGludCB2bXYyMTo3OyAgICAgICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAzICovCisgIHVuc2lnbmVkIGludCBobXYyMjoxOyAgICAgICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBwcmVkaWN0b3IgZm9yIE1CIDMgLSBwYXJ0IDIgKi8KKworICB1bnNpZ25lZCBpbnQgcnIxOjg7ICAgICAgICAgICAvKiByZXNlcnZlZCAqLworCisgIHVuc2lnbmVkIGludCBycjI6ODsgICAgICAgICAgIC8qIHJlc2VydmVkICovCisKKyAgdW5zaWduZWQgaW50IHRyYjozOyAgICAgICAgICAgLyogVGVtcG9yYWwgUmVmZXJlbmNlIGZvciB0aGUgQiAqLworICB1bnNpZ25lZCBpbnQgZGJxOjI7ICAgICAgICAgICAvKiBEaWZmZXJlbnRpYWwgcXVhbnRpemF0aW9uIHBhcmFtZXRlciAqLworICB1bnNpZ25lZCBpbnQgcnIzOjM7ICAgICAgICAgICAvKiByZXNlcnZlZCAqLworCisgIHVuc2lnbmVkIGludCB0cjo4OyAgICAgICAgICAgIC8qIFRlbXBvcmFsIFJlZmVyZW5jZSBmb3IgdGhlIFAgZnJhbWUgKi8KKworI2VsaWYgR19CWVRFX09SREVSID09IEdfQklHX0VORElBTgorICB1bnNpZ25lZCBpbnQgZjoxOyAgICAgICAgICAgICAvKiBmbGFnIGJpdCAqLworICB1bnNpZ25lZCBpbnQgcDoxOyAgICAgICAgICAgICAvKiBQQi1mcmFtZXMgbW9kZSAqLworICB1bnNpZ25lZCBpbnQgc2JpdDozOyAgICAgICAgICAvKiBTdGFydCBwb3NpdGlvbiAqLworICB1bnNpZ25lZCBpbnQgZWJpdDozOyAgICAgICAgICAvKiBFbmQgcG9zaXRpb24gKi8KKworICB1bnNpZ25lZCBpbnQgc3JjOjM7ICAgICAgICAgICAvKiBTb3VyY2UgZm9ybWF0ICovCisgIHVuc2lnbmVkIGludCBxdWFudDo1OyAgICAgICAgIC8qIFF1YW50aXphdGlvbiB2YWx1ZSBmb3IgZmlyc3QgTUIgKi8KKworICB1bnNpZ25lZCBpbnQgZ29ibjo1OyAgICAgICAgICAvKiBHT0IgbnVtYmVyIGluIGVmZmVjdCBhdCBzdGFydCBvZiBwYWNrZXQgKi8KKyAgdW5zaWduZWQgaW50IG1iYTE6MzsgICAgICAgICAgLyogQWRkcmVzcyBvZiBmaXJzdCBNQiBzdGFydGluZyBjb3VudCBmcm9tIDAgLSBwYXJ0MSAqLworCisgIHVuc2lnbmVkIGludCBtYmEyOjY7ICAgICAgICAgIC8qIEFkZHJlc3Mgb2YgZmlyc3QgTUIgc3RhcnRpbmcgY291bnQgZnJvbSAwIC0gcGFydDIgKi8KKyAgdW5zaWduZWQgaW50IHI6MjsgICAgICAgICAgICAgLyogUmVzZXJ2ZWQgKi8KKworICB1bnNpZ25lZCBpbnQgaToxOyAgICAgICAgICAgICAvKiBQaWN0dXJlIGNvZGluZyB0eXBlICovCisgIHVuc2lnbmVkIGludCB1OjE7ICAgICAgICAgICAgIC8qIFVucmVzdHJpY3RlZCBtb3Rpb24gdmVjdG9yICovCisgIHVuc2lnbmVkIGludCBzOjE7ICAgICAgICAgICAgIC8qIHN5bnRheCBiYXNlZCBhcml0aG1ldGljIGNvZGluZyAqLworICB1bnNpZ25lZCBpbnQgYToxOyAgICAgICAgICAgICAvKiBBZHZhbmNlZCBQcmVkaWN0aW9uICovCisgIHVuc2lnbmVkIGludCBobXYxMTo0OyAgICAgICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBwcmVkaWN0b3IgZm9yIE1CIDEgLSBwYXJ0IDEgKi8KKworICB1bnNpZ25lZCBpbnQgaG12MTI6MzsgICAgICAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAxIC0gcGFydCAyICovCisgIHVuc2lnbmVkIGludCB2bXYxMTo1OyAgICAgICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAxIC0gcGFydCAxICovCisKKyAgdW5zaWduZWQgaW50IHZtdjEyOjI7ICAgICAgICAgLyogdmVydGljYWwgbW90aW9uIHZlY3RvciBwcmVkaWN0b3IgZm9yIE1CIDEgLSBwYXJ0IDIgKi8KKyAgdW5zaWduZWQgaW50IGhtdjIxOjY7ICAgICAgICAgLyogaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIHByZWRpY3RvciBmb3IgTUIgMyAtIHBhcnQgMSAqLworCisgIHVuc2lnbmVkIGludCBobXYyMjoxOyAgICAgICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBwcmVkaWN0b3IgZm9yIE1CIDMgLSBwYXJ0IDIgKi8KKyAgdW5zaWduZWQgaW50IHZtdjIxOjc7ICAgICAgICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAzICovCisgIHVuc2lnbmVkIGludCBycjE6ODsgICAgICAgICAgIC8qIHJlc2VydmVkICovCisgIHVuc2lnbmVkIGludCBycjI6ODsgICAgICAgICAgIC8qIHJlc2VydmVkICovCisKKyAgdW5zaWduZWQgaW50IHJyMzozOyAgICAgICAgICAgLyogcmVzZXJ2ZWQgKi8KKyAgdW5zaWduZWQgaW50IGRicToyOyAgICAgICAgICAgLyogRGlmZmVyZW50aWFsIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKi8KKyAgdW5zaWduZWQgaW50IHRyYjozOyAgICAgICAgICAgLyogVGVtcG9yYWwgUmVmZXJlbmNlIGZvciB0aGUgQiAqLworCisgIHVuc2lnbmVkIGludCB0cjo4OyAgICAgICAgICAgIC8qIFRlbXBvcmFsIFJlZmVyZW5jZSBmb3IgdGhlIFAgZnJhbWUgKi8KKyNlbHNlCisjZXJyb3IgIkdfQllURV9PUkRFUiBzaG91bGQgYmUgYmlnIG9yIGxpdHRsZSBlbmRpYW4uIgorI2VuZGlmCit9IEdzdFJ0cEgyNjNQYXlDSGVhZGVyOworCitzdHJ1Y3QgX0dzdFJ0cEgyNjNQYXlQaWMKK3sKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOCisgIHVuc2lnbmVkIGludCBwc2MxOjE2OworCisgIHVuc2lnbmVkIGludCB0cjE6MjsKKyAgdW5zaWduZWQgaW50IHBzYzI6NjsKKworICB1bnNpZ25lZCBpbnQgcHR5cGVfMjYzOjE7CisgIHVuc2lnbmVkIGludCBwdHlwZV9zdGFydDoxOworICB1bnNpZ25lZCBpbnQgdHIyOjY7CisKKyAgdW5zaWduZWQgaW50IHB0eXBlX3Vtdm1vZGU6MTsKKyAgdW5zaWduZWQgaW50IHB0eXBlX3BpY3R5cGU6MTsKKyAgdW5zaWduZWQgaW50IHB0eXBlX3NyY2Zvcm1hdDozOworICB1bnNpZ25lZCBpbnQgcHR5cGVfZnJlZXplOjE7CisgIHVuc2lnbmVkIGludCBwdHlwZV9jYW1lcmE6MTsKKyAgdW5zaWduZWQgaW50IHB0eXBlX3NwbGl0OjE7CisKKyAgdW5zaWduZWQgaW50IHBxdWFudDo1OworICB1bnNpZ25lZCBpbnQgcHR5cGVfcGJtb2RlOjE7CisgIHVuc2lnbmVkIGludCBwdHlwZV9hcG1vZGU6MTsKKyAgdW5zaWduZWQgaW50IHB0eXBlX3NhY21vZGU6MTsKKworI2VsaWYgR19CWVRFX09SREVSID09IEdfQklHX0VORElBTgorICB1bnNpZ25lZCBpbnQgcHNjMToxNjsKKworICB1bnNpZ25lZCBpbnQgcHNjMjo2OworICB1bnNpZ25lZCBpbnQgdHIxOjI7CisKKyAgdW5zaWduZWQgaW50IHRyMjo2OworICB1bnNpZ25lZCBpbnQgcHR5cGVfc3RhcnQ6MjsKKworICB1bnNpZ25lZCBpbnQgcHR5cGVfc3BsaXQ6MTsKKyAgdW5zaWduZWQgaW50IHB0eXBlX2NhbWVyYToxOworICB1bnNpZ25lZCBpbnQgcHR5cGVfZnJlZXplOjE7CisgIHVuc2lnbmVkIGludCBwdHlwZV9zcmNmb3JtYXQ6MzsKKyAgdW5zaWduZWQgaW50IHB0eXBlX3BpY3R5cGU6MTsKKyAgdW5zaWduZWQgaW50IHB0eXBlX3Vtdm1vZGU6MTsKKworICB1bnNpZ25lZCBpbnQgcHR5cGVfc2FjbW9kZToxOworICB1bnNpZ25lZCBpbnQgcHR5cGVfYXBtb2RlOjE7CisgIHVuc2lnbmVkIGludCBwdHlwZV9wYm1vZGU6MTsKKyAgdW5zaWduZWQgaW50IHBxdWFudDo1OworCisjZWxzZQorI2Vycm9yICJHX0JZVEVfT1JERVIgc2hvdWxkIGJlIGJpZyBvciBsaXR0bGUgZW5kaWFuLiIKKyNlbmRpZgorfTsKKworc3RydWN0IF9Hc3RSdHBIMjYzUGF5Qm91bmRyeQoreworCisgIGd1aW50OCAqc3RhcnQ7CisgIGd1aW50OCAqZW5kOworICBndWludDggc2JpdDsKKyAgZ3VpbnQ4IGViaXQ7CisKK307CisKK3N0cnVjdCBfR3N0UnRwSDI2M1BheU1CCit7CisgIGd1aW50OCAqc3RhcnQ7CisgIGd1aW50OCAqZW5kOworICBndWludDggc2JpdDsKKyAgZ3VpbnQ4IGViaXQ7CisgIGd1aW50IGxlbmd0aDsKKworICBndWludDggbWJfdHlwZTsKKyAgZ3VpbnQgcXVhbnQ7CisKKyAgZ3VpbnQgbWJhOworICBndWludDggbXZkWzEwXTsKK307CisKK3N0cnVjdCBfR3N0UnRwSDI2M1BheUdvYgoreworICBndWludDggKnN0YXJ0OworICBndWludDggKmVuZDsKKyAgZ3VpbnQgbGVuZ3RoOworICBndWludDggc2JpdDsKKyAgZ3VpbnQ4IGViaXQ7CisKKyAgZ3VpbnQgZ29ibjsKKyAgZ3VpbnQgcXVhbnQ7CisKKyAgR3N0UnRwSDI2M1BheU1CICoqbWFjcm9ibG9ja3M7CisgIGd1aW50IG5tYWNyb2Jsb2NzOworfTsKKworc3RydWN0IF9Hc3RSdHBIMjYzUGF5UGFja2FnZQoreworICBndWludDggKnBheWxvYWRfc3RhcnQ7CisgIGd1aW50OCAqcGF5bG9hZF9lbmQ7CisgIGd1aW50IHBheWxvYWRfbGVuOworICBndWludDggc2JpdDsKKyAgZ3VpbnQ4IGViaXQ7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBnYm9vbGVhbiBtYXJrZXI7CisKKyAgR3N0UnRwSDI2M1BheUhlYWRlck1vZGUgbW9kZTsKKworICAvKgorICAgKiAgbW9kZSBCLEMgZGF0YQorICAgKi8KKworICBndWludDE2IG1iYTsKKyAgZ3VpbnQgbm12ZDsKKyAgZ3VpbnQ4IG12ZFsxMF07CisgIGd1aW50IGdvYm47CisgIGd1aW50IHF1YW50OworfTsKKworI2RlZmluZSBHU1RfSDI2M19QSUNUVVJFTEFZRVJfUExTUkMoYnVmKSAoKChHc3RSdHBIMjYzUGF5UGljICopKGJ1ZikpLT5wdHlwZV9zcmNmb3JtYXQpCisjZGVmaW5lIEdTVF9IMjYzX1BJQ1RVUkVMQVlFUl9QTFRZUEUoYnVmKSAoKChHc3RSdHBIMjYzUGF5UGljICopKGJ1ZikpLT5wdHlwZV9waWN0eXBlKQorI2RlZmluZSBHU1RfSDI2M19QSUNUVVJFTEFZRVJfUExVTVYoYnVmKSAoKChHc3RSdHBIMjYzUGF5UGljICopKGJ1ZikpLT5wdHlwZV91bXZtb2RlKQorI2RlZmluZSBHU1RfSDI2M19QSUNUVVJFTEFZRVJfUExTQUMoYnVmKSAoKChHc3RSdHBIMjYzUGF5UGljICopKGJ1ZikpLT5wdHlwZV9zYWNtb2RlKQorI2RlZmluZSBHU1RfSDI2M19QSUNUVVJFTEFZRVJfUExBUChidWYpICgoKEdzdFJ0cEgyNjNQYXlQaWMgKikoYnVmKSktPnB0eXBlX2FwbW9kZSkKKworLyoKKyAqIFRPRE86IFBCIGZyYW1lIHJlbGV2YW50IHRhYmxlcworICovCisKKyNkZWZpbmUgR1NUX1JUUF9IMjYzX1BBWV9FTkQoc3RhcnQsIGxlbikgKCgoZ3VpbnQ4ICopc3RhcnQpICsgKChndWludClsZW4pKQorI2RlZmluZSBHU1RfUlRQX0gyNjNfUEFZX0dPQk4oZ29iKSAoKCgoKGd1aW50OCAqKSBnb2IpWzJdID4+IDIpICYgMHgxZikKKworR1R5cGUgZ3N0X3J0cF9oMjYzX3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfaDI2M19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYgLyogX19HU1RfUlRQX0gyNjNfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWZjNDBjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmMKQEAgLTAsMCArMSw0MDMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlICJnc3RydHBoMjYzcGRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwaDI2M3BkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwaDI2M3BkZXBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2M3BfZGVwYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LWgyNjMsICIgInZhcmlhbnQgPSAoc3RyaW5nKSBcIml0dVwiICIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2M3BfZGVwYXlfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgWzEsIE1BWF0sICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkgyNjMtMTk5OFwiOyAiCisgICAgICAgIC8qIG9wdGlvbmFsIHBhcmFtcyAqLworICAgICAgICAvKiBOT1RFIGFsbCBvcHRpb25hbCBTRFAgcGFyYW1zIG11c3QgYmUgc3RyaW5ncyBpbiB0aGUgY2FwcyAqLworICAgICAgICAvKgorICAgICAgICAgICAic3FjaWYgPSAoc3RyaW5nKSBbMSwgMzJdLCAiCisgICAgICAgICAgICJxY2lmID0gKHN0cmluZykgWzEsIDMyXSwgIgorICAgICAgICAgICAiY2lmID0gKHN0cmluZykgWzEsIDMyXSwgIgorICAgICAgICAgICAiY2lmNCA9IChzdHJpbmcpIFsxLCAzMl0sICIKKyAgICAgICAgICAgImNpZjE2ID0gKHN0cmluZykgWzEsIDMyXSwgIgorICAgICAgICAgICAiY3VzdG9tID0gKHN0cmluZykgQU5ZLCAiCisgICAgICAgICAgICJmID0gKHN0cmluZykgezAsIDF9LCIKKyAgICAgICAgICAgImkgPSAoc3RyaW5nKSB7MCwgMX0sIgorICAgICAgICAgICAiaiA9IChzdHJpbmcpIHswLCAxfSwiCisgICAgICAgICAgICJ0ID0gKHN0cmluZykgezAsIDF9LCIKKyAgICAgICAgICAgImsgPSAoc3RyaW5nKSB7MSwgMiwgMywgNH0sIgorICAgICAgICAgICAibiA9IChzdHJpbmcpIHsxLCAyLCAzLCA0fSwiCisgICAgICAgICAgICJwID0gKHN0cmluZykgQU5ZLCIKKyAgICAgICAgICAgInBhciA9IChzdHJpbmcpIEFOWSwgIgorICAgICAgICAgICAiY3BjZiA9IChzdHJpbmcpIEFOWSwgIgorICAgICAgICAgICAiYnBwID0gKHN0cmluZykgWzAsIDY1NTM2XSwgIgorICAgICAgICAgICAiaHJkID0gKHN0cmluZykgezAsIDF9OyAiCisgICAgICAgICAqLworICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgWzEsIE1BWF0sICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkgyNjMtMjAwMFwiICIKKyAgICAgICAgLyogb3B0aW9uYWwgcGFyYW1zICovCisgICAgICAgIC8qIE5PVEUgYWxsIG9wdGlvbmFsIFNEUCBwYXJhbXMgbXVzdCBiZSBzdHJpbmdzIGluIHRoZSBjYXBzICovCisgICAgICAgIC8qCisgICAgICAgICAgICJwcm9maWxlID0gKHN0cmluZykgWzAsIDEwXSwgIgorICAgICAgICAgICAibGV2ZWwgPSAoc3RyaW5nKSB7MTAsIDIwLCAzMCwgNDAsIDQ1LCA1MCwgNjAsIDcwfSwgIgorICAgICAgICAgICAiaW50ZXJsYWNlID0gKHN0cmluZykgezAsIDF9OyIKKyAgICAgICAgICovCisgICAgKQorICAgICk7CisKKyNkZWZpbmUgZ3N0X3J0cF9oMjYzcF9kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBIMjYzUERlcGF5LCBnc3RfcnRwX2gyNjNwX2RlcGF5LAorICAgIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2M3BfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9oMjYzcF9kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKgorICAgIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX2gyNjNwX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKK2dib29sZWFuIGdzdF9ydHBfaDI2M3BfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGZpbHRlciwKKyAgICBHc3RDYXBzICogY2Fwcyk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjNwX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEgyNjNQRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX2gyNjNwX2RlcGF5X2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfaDI2M3BfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfaDI2M3BfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9oMjYzcF9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBIMjYzIGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBIMjYzLysvKysgdmlkZW8gZnJvbSBSVFAgcGFja2V0cyAoUkZDIDQ2MjkpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfaDI2M3BfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2gyNjNwX2RlcGF5X3NldGNhcHM7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGgyNjNwZGVwYXlfZGVidWcsICJydHBoMjYzcGRlcGF5IiwgMCwKKyAgICAgICJIMjYzKyBWaWRlbyBSVFAgRGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2M3BfZGVwYXlfaW5pdCAoR3N0UnRwSDI2M1BEZXBheSAqIHJ0cGgyNjNwZGVwYXkpCit7CisgIHJ0cGgyNjNwZGVwYXktPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjNwX2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSdHBIMjYzUERlcGF5ICpydHBoMjYzcGRlcGF5OworCisgIHJ0cGgyNjNwZGVwYXkgPSBHU1RfUlRQX0gyNjNQX0RFUEFZIChvYmplY3QpOworCisgIGdfb2JqZWN0X3VucmVmIChydHBoMjYzcGRlcGF5LT5hZGFwdGVyKTsKKyAgcnRwaDI2M3BkZXBheS0+YWRhcHRlciA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9oMjYzcF9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZmlsdGVyLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0Q2FwcyAqc3JjY2FwcyA9IE5VTEw7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKyAgY29uc3QgZ2NoYXIgKmVuY29kaW5nX25hbWUgPSBOVUxMOworICBnYm9vbGVhbiByZXM7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgY2xvY2tfcmF0ZSA9IDkwMDAwOyAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgZmlsdGVyLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICBlbmNvZGluZ19uYW1lID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJlbmNvZGluZy1uYW1lIik7CisgIGlmIChlbmNvZGluZ19uYW1lID09IE5VTEwpCisgICAgZ290byBub19lbmNvZGluZ19uYW1lOworCisgIGlmIChnX2FzY2lpX3N0cmNhc2VjbXAgKGVuY29kaW5nX25hbWUsICJIMjYzLTIwMDAiKSA9PSAwKSB7CisgICAgLyogYWx3YXlzIGgyNjMrKyAqLworICAgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1oMjYzIiwKKyAgICAgICAgInZhcmlhbnQiLCBHX1RZUEVfU1RSSU5HLCAiaXR1IiwKKyAgICAgICAgImgyNjN2ZXJzaW9uIiwgR19UWVBFX1NUUklORywgImgyNjNwcCIsIE5VTEwpOworICB9IGVsc2UgaWYgKGdfYXNjaWlfc3RyY2FzZWNtcCAoZW5jb2RpbmdfbmFtZSwgIkgyNjMtMTk5OCIpID09IDApIHsKKyAgICAvKiB0aGlzIGNhbiBiZSBIMjYzIG9yIEgyNjMrIGRlcGVuZGluZyBvbiBkZWZpbmVkIGFwcGVuZGl4ZXMgaW4gdGhlIG9wdGlvbmFsCisgICAgICogU0RQIHBhcmFtcyAqLworICAgIGNvbnN0IGdjaGFyICpGLCAqSSwgKkosICpULCAqSywgKk4sICpQOworICAgIGdib29sZWFuIGlzX2gyNjNwID0gRkFMU0U7CisKKyAgICBGID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJmIik7CisgICAgaWYgKEYpCisgICAgICBpZiAoZ19hc2NpaV9zdHJjYXNlY21wIChGLCAiMSIpID09IDApCisgICAgICAgIGlzX2gyNjNwID0gVFJVRTsKKyAgICBJID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJpIik7CisgICAgaWYgKEkpCisgICAgICBpZiAoZ19hc2NpaV9zdHJjYXNlY21wIChJLCAiMSIpID09IDApCisgICAgICAgIGlzX2gyNjNwID0gVFJVRTsKKyAgICBKID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJqIik7CisgICAgaWYgKEopCisgICAgICBpZiAoZ19hc2NpaV9zdHJjYXNlY21wIChKLCAiMSIpID09IDApCisgICAgICAgIGlzX2gyNjNwID0gVFJVRTsKKyAgICBUID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJ0Iik7CisgICAgaWYgKFQpCisgICAgICBpZiAoZ19hc2NpaV9zdHJjYXNlY21wIChULCAiMSIpID09IDApCisgICAgICAgIGlzX2gyNjNwID0gVFJVRTsKKyAgICBLID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJrIik7CisgICAgaWYgKEspCisgICAgICBpc19oMjYzcCA9IFRSVUU7CisgICAgTiA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAibiIpOworICAgIGlmIChOKQorICAgICAgaXNfaDI2M3AgPSBUUlVFOworICAgIFAgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgInAiKTsKKyAgICBpZiAoUCkKKyAgICAgIGlzX2gyNjNwID0gVFJVRTsKKworICAgIGlmIChpc19oMjYzcCkgeworICAgICAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWgyNjMiLAorICAgICAgICAgICJ2YXJpYW50IiwgR19UWVBFX1NUUklORywgIml0dSIsCisgICAgICAgICAgImgyNjN2ZXJzaW9uIiwgR19UWVBFX1NUUklORywgImgyNjNwIiwgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1oMjYzIiwKKyAgICAgICAgICAidmFyaWFudCIsIEdfVFlQRV9TVFJJTkcsICJpdHUiLAorICAgICAgICAgICJoMjYzdmVyc2lvbiIsIEdfVFlQRV9TVFJJTkcsICJoMjYzIiwgTlVMTCk7CisgICAgfQorICB9CisgIGlmICghc3JjY2FwcykKKyAgICBnb3RvIG5vX2NhcHM7CisKKyAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKGZpbHRlciksIHNyY2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK25vX2VuY29kaW5nX25hbWU6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChmaWx0ZXIsICJubyBlbmNvZGluZy1uYW1lIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19jYXBzOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZmlsdGVyLCAiaW52YWxpZCBlbmNvZGluZy1uYW1lIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9oMjYzcF9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0UnRwSDI2M1BEZXBheSAqcnRwaDI2M3BkZXBheTsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIGdpbnQgcGF5bG9hZF9sZW47CisgIGd1aW50OCAqcGF5bG9hZDsKKyAgZ2Jvb2xlYW4gUCwgViwgTTsKKyAgZ3VpbnQgaGVhZGVyX2xlbjsKKyAgZ3VpbnQ4IFBMRU4sIFBFQklUOworCisgIHJ0cGgyNjNwZGVwYXkgPSBHU1RfUlRQX0gyNjNQX0RFUEFZIChkZXBheWxvYWQpOworCisgIC8qIGZsdXNoIHJlbWFpbmluZyBkYXRhIG9uIGRpc2NvbnQgKi8KKyAgaWYgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAocnRwLT5idWZmZXIpKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGRlcGF5bG9hZCwgIkRJU0NPTlQsIGZsdXNoaW5nIGFkYXB0ZXIiKTsKKyAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRwaDI2M3BkZXBheS0+YWRhcHRlcik7CisgICAgcnRwaDI2M3BkZXBheS0+d2FpdF9zdGFydCA9IFRSVUU7CisgIH0KKworICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAocnRwKTsKKyAgaGVhZGVyX2xlbiA9IDI7CisKKyAgaWYgKHBheWxvYWRfbGVuIDwgaGVhZGVyX2xlbikKKyAgICBnb3RvIHRvb19zbWFsbDsKKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisKKyAgTSA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCk7CisKKyAgLyogIDAgICAgICAgICAgICAgICAgICAgMQorICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNQorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgIFJSICAgIHxQfFZ8ICAgUExFTiAgICB8UEVCSVR8CisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKi8KKyAgUCA9IChwYXlsb2FkWzBdICYgMHgwNCkgPT0gMHgwNDsKKyAgViA9IChwYXlsb2FkWzBdICYgMHgwMikgPT0gMHgwMjsKKyAgUExFTiA9ICgocGF5bG9hZFswXSAmIDB4MSkgPDwgNSkgfCAocGF5bG9hZFsxXSA+PiAzKTsKKyAgUEVCSVQgPSBwYXlsb2FkWzFdICYgMHg3OworCisgIEdTVF9MT0dfT0JKRUNUIChkZXBheWxvYWQsICJQICVkLCBWICVkLCBQTEVOICVkLCBQRUJJVCAlZCIsIFAsIFYsIFBMRU4sCisgICAgICBQRUJJVCk7CisKKyAgaWYgKFYpIHsKKyAgICBoZWFkZXJfbGVuKys7CisgIH0KKyAgaWYgKFBMRU4pIHsKKyAgICBoZWFkZXJfbGVuICs9IFBMRU47CisgIH0KKworICBpZiAoKCFQICYmIHBheWxvYWRfbGVuIDwgaGVhZGVyX2xlbikgfHwgKFAgJiYgcGF5bG9hZF9sZW4gPCBoZWFkZXJfbGVuIC0gMikpCisgICAgZ290byB0b29fc21hbGw7CisKKyAgaWYgKFApIHsKKyAgICBydHBoMjYzcGRlcGF5LT53YWl0X3N0YXJ0ID0gRkFMU0U7CisgICAgaGVhZGVyX2xlbiAtPSAyOworICB9CisKKyAgaWYgKHJ0cGgyNjNwZGVwYXktPndhaXRfc3RhcnQpCisgICAgZ290byB3YWl0aW5nX3N0YXJ0OworCisgIGlmIChwYXlsb2FkX2xlbiA8IGhlYWRlcl9sZW4pCisgICAgZ290byB0b29fc21hbGw7CisKKyAgLyogRklYTUUgZG8gbm90IGlnbm9yZSB0aGUgVlJDIGhlYWRlciAoU2VlIFJGQyAyNDI5IHNlY3Rpb24gNC4yKSAqLworICAvKiBGSVhNRSBhY3R1YWxseSB1c2UgdGhlIFJUUCBwaWN0dXJlIGhlYWRlciB3aGVuIGl0IGlzIGxvc3QgaW4gdGhlIG5ldHdvcmsgKi8KKyAgLyogZm9yIG5vdyBzdHJpcCBvZmYgaGVhZGVyICovCisgIHBheWxvYWRfbGVuIC09IGhlYWRlcl9sZW47CisKKyAgaWYgKE0pIHsKKyAgICAvKiBmcmFtZSBpcyBjb21wbGV0ZWQ6IGFwcGVuZCB0byBwcmV2aW91cywgcHVzaCBpdCBvdXQgKi8KKyAgICBndWludCBsZW4sIHBhZGxlbjsKKyAgICBndWludCBhdmFpbDsKKyAgICBHc3RCdWZmZXIgKnBhZGJ1ZjsKKworICAgIEdTVF9MT0dfT0JKRUNUIChkZXBheWxvYWQsICJGcmFtZSBjb21wbGV0ZSIpOworCisgICAgb3V0YnVmID0KKyAgICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfc3ViYnVmZmVyIChydHAsIGhlYWRlcl9sZW4sIHBheWxvYWRfbGVuKTsKKyAgICBpZiAoUCkKKyAgICAgIGdzdF9idWZmZXJfbWVtc2V0IChvdXRidWYsIDAsIDAsIDIpOworICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGgyNjNwZGVwYXktPmFkYXB0ZXIsIG91dGJ1Zik7CisgICAgb3V0YnVmID0gTlVMTDsKKworICAgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBoMjYzcGRlcGF5LT5hZGFwdGVyKTsKKyAgICBsZW4gPSBhdmFpbCArIHBheWxvYWRfbGVuOworICAgIHBhZGxlbiA9IChsZW4gJSA0KSArIDQ7CisKKyAgICBpZiAoYXZhaWwgPT0gMCkKKyAgICAgIGdvdG8gZW1wdHlfZnJhbWU7CisKKyAgICBvdXRidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRwaDI2M3BkZXBheS0+YWRhcHRlciwgYXZhaWwpOworICAgIGlmIChwYWRsZW4pIHsKKyAgICAgIHBhZGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAocGFkbGVuKTsKKyAgICAgIGdzdF9idWZmZXJfbWVtc2V0IChwYWRidWYsIDAsIDAsIHBhZGxlbik7CisgICAgICBvdXRidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAob3V0YnVmLCBwYWRidWYpOworICAgIH0KKworICAgIGdzdF9ydHBfZHJvcF9ub25fdmlkZW9fbWV0YSAocnRwaDI2M3BkZXBheSwgb3V0YnVmKTsKKworICAgIHJldHVybiBvdXRidWY7CisgIH0gZWxzZSB7CisgICAgLyogZnJhbWUgbm90IGNvbXBsZXRlZDogc3RvcmUgaW4gYWRhcHRlciAqLworICAgIEdTVF9MT0dfT0JKRUNUIChkZXBheWxvYWQsICJGcmFtZSBpbmNvbXBsZXRlLCBzdG9yaW5nICVkIiwgcGF5bG9hZF9sZW4pOworCisgICAgb3V0YnVmID0KKyAgICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfc3ViYnVmZmVyIChydHAsIGhlYWRlcl9sZW4sIHBheWxvYWRfbGVuKTsKKyAgICBpZiAoUCkKKyAgICAgIGdzdF9idWZmZXJfbWVtc2V0IChvdXRidWYsIDAsIDAsIDIpOworICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGgyNjNwZGVwYXktPmFkYXB0ZXIsIG91dGJ1Zik7CisgIH0KKyAgcmV0dXJuIE5VTEw7CisKK3Rvb19zbWFsbDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cGgyNjNwZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIlBhY2tldCBwYXlsb2FkIHdhcyB0b28gc21hbGwiKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQord2FpdGluZ19zdGFydDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwZGVwYXksICJ3YWl0aW5nIGZvciBwaWN0dXJlIHN0YXJ0Iik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2VtcHR5X2ZyYW1lOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChydHBoMjYzcGRlcGF5LCAiRGVwYXlsb2FkZWQgZnJhbWUgaXMgZW1wdHksIGRyb3BwaW5nIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2gyNjNwX2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0UnRwSDI2M1BEZXBheSAqcnRwaDI2M3BkZXBheTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHJ0cGgyNjNwZGVwYXkgPSBHU1RfUlRQX0gyNjNQX0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRwaDI2M3BkZXBheS0+YWRhcHRlcik7CisgICAgICBydHBoMjYzcGRlcGF5LT53YWl0X3N0YXJ0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2gyNjNwX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwaDI2M3BkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9IMjYzUF9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZGIyYjAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuaApAQCAtMCwwICsxLDYyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfSDI2M1BfREVQQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9IMjYzUF9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfSDI2M1BfREVQQVkgXAorICAoZ3N0X3J0cF9oMjYzcF9kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0gyNjNQX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0gyNjNQX0RFUEFZLEdzdFJ0cEgyNjNQRGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX0gyNjNQX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9IMjYzUF9ERVBBWSxHc3RSdHBIMjYzUERlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0gyNjNQX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0gyNjNQX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9IMjYzUF9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSDI2M1BfREVQQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSDI2M1BEZXBheSBHc3RSdHBIMjYzUERlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjNQRGVwYXlDbGFzcyBHc3RSdHBIMjYzUERlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwSDI2M1BEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKKworICBHc3RBZGFwdGVyICphZGFwdGVyOworICBnYm9vbGVhbiAgICB3YWl0X3N0YXJ0OworfTsKKworc3RydWN0IF9Hc3RSdHBIMjYzUERlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfaDI2M3BfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2gyNjNwX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0gyNjNQX0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jIGIvZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3M2YwMGUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmMKQEAgLTAsMCArMSw4MTQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSAiZ3N0cnRwaDI2M3BwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCisjZGVmaW5lIERFRkFVTFRfRlJBR01FTlRBVElPTl9NT0RFICAgR1NUX0ZSQUdNRU5UQVRJT05fTU9ERV9OT1JNQUwKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfRlJBR01FTlRBVElPTl9NT0RFCit9OworCisjZGVmaW5lIEdTVF9UWVBFX0ZSQUdNRU5UQVRJT05fTU9ERSAoZ3N0X2ZyYWdtZW50YXRpb25fbW9kZV9nZXRfdHlwZSgpKQorc3RhdGljIEdUeXBlCitnc3RfZnJhZ21lbnRhdGlvbl9tb2RlX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgZnJhZ21lbnRhdGlvbl9tb2RlX3R5cGUgPSAwOworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSBmcmFnbWVudGF0aW9uX21vZGVbXSA9IHsKKyAgICB7R1NUX0ZSQUdNRU5UQVRJT05fTU9ERV9OT1JNQUwsICJOb3JtYWwiLCAibm9ybWFsIn0sCisgICAge0dTVF9GUkFHTUVOVEFUSU9OX01PREVfU1lOQywgIkZyYWdtZW50IGF0IHN5bmMgcG9pbnRzIiwgInN5bmMifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0sCisgIH07CisKKyAgaWYgKCFmcmFnbWVudGF0aW9uX21vZGVfdHlwZSkgeworICAgIGZyYWdtZW50YXRpb25fbW9kZV90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdEZyYWdtZW50YXRpb25Nb2RlIiwgZnJhZ21lbnRhdGlvbl9tb2RlKTsKKyAgfQorICByZXR1cm4gZnJhZ21lbnRhdGlvbl9tb2RlX3R5cGU7Cit9CisKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwaDI2M3BwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgcnRwaDI2M3BwYXlfZGVidWcKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2M3BfcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1oMjYzLCB2YXJpYW50ID0gKHN0cmluZykgaXR1IikKKyAgICApOworCisvKgorICogV2UgYWxzbyByZXR1cm4gdGhlc2UgaW4gZ2V0Y2FwcygpIGFzIHJlcXVpcmVkIGJ5IHRoZSBTRFAgY2FwcworICoKKyAqIHdpZHRoID0gKGludCkgWzE2LCA0MDk2XQorICogaGVpZ2h0ID0gKGludCkgWzE2LCA0MDk2XQorICogImFubmV4LWYgPSAoYm9vbGVhbikge3RydWUsIGZhbHNlfSwiCisgKiAiYW5uZXgtaSA9IChib29sZWFuKSB7dHJ1ZSwgZmFsc2V9LCIKKyAqICJhbm5leC1qID0gKGJvb2xlYW4pIHt0cnVlLCBmYWxzZX0sIgorICogImFubmV4LWwgPSAoYm9vbGVhbikge3RydWUsIGZhbHNlfSwiCisgKiAiYW5uZXgtdCA9IChib29sZWFuKSB7dHJ1ZSwgZmFsc2V9LCIKKyAqICJhbm5leC12ID0gKGJvb2xlYW4pIHt0cnVlLCBmYWxzZX0iKQorICovCisKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2M3BfcGF5X3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiSDI2My0xOTk4XCI7ICIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiSDI2My0yMDAwXCIiKQorICAgICk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2M3BfcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9oMjYzcF9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9oMjYzcF9wYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9oMjYzcF9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfcnRwX2gyNjNwX3BheV9zaW5rX2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9oMjYzcF9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKgorICAgIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKKyNkZWZpbmUgZ3N0X3J0cF9oMjYzcF9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwSDI2M1BQYXksIGdzdF9ydHBfaDI2M3BfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9QQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2M3BfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEgyNjNQUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfaDI2M3BfcGF5X2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX2gyNjNwX3BheV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9ydHBfaDI2M3BfcGF5X2dldF9wcm9wZXJ0eTsKKworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2gyNjNwX3BheV9zZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+Z2V0X2NhcHMgPSBnc3RfcnRwX2gyNjNwX3BheV9zaW5rX2dldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9oMjYzcF9wYXlfaGFuZGxlX2J1ZmZlcjsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLAorICAgICAgUFJPUF9GUkFHTUVOVEFUSU9OX01PREUsIGdfcGFyYW1fc3BlY19lbnVtICgiZnJhZ21lbnRhdGlvbi1tb2RlIiwKKyAgICAgICAgICAiRnJhZ21lbnRhdGlvbiBNb2RlIiwKKyAgICAgICAgICAiUGFja2V0IEZyYWdtZW50YXRpb24gTW9kZSIsIEdTVF9UWVBFX0ZSQUdNRU5UQVRJT05fTU9ERSwKKyAgICAgICAgICBERUZBVUxUX0ZSQUdNRU5UQVRJT05fTU9ERSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2gyNjNwX3BheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2gyNjNwX3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUlRQIEgyNjMgcGF5bG9hZGVyIiwKKyAgICAgICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBheWxvYWQtZW5jb2RlcyBIMjYzLysvKysgdmlkZW8gaW4gUlRQIHBhY2tldHMgKFJGQyA0NjI5KSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwaDI2M3BwYXlfZGVidWcsICJydHBoMjYzcHBheSIsCisgICAgICAwLCAicnRwaDI2M3BwYXkgKFJGQyA0NjI5KSIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYzcF9wYXlfaW5pdCAoR3N0UnRwSDI2M1BQYXkgKiBydHBoMjYzcHBheSkKK3sKKyAgcnRwaDI2M3BwYXktPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisKKyAgcnRwaDI2M3BwYXktPmZyYWdtZW50YXRpb25fbW9kZSA9IERFRkFVTFRfRlJBR01FTlRBVElPTl9NT0RFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYzcF9wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cEgyNjNQUGF5ICpydHBoMjYzcHBheTsKKworICBydHBoMjYzcHBheSA9IEdTVF9SVFBfSDI2M1BfUEFZIChvYmplY3QpOworCisgIGdfb2JqZWN0X3VucmVmIChydHBoMjYzcHBheS0+YWRhcHRlcik7CisgIHJ0cGgyNjNwcGF5LT5hZGFwdGVyID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9oMjYzcF9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RDYXBzICpwZWVyY2FwczsKKyAgZ2NoYXIgKmVuY29kaW5nX25hbWUgPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChnc3RfY2Fwc19pc19maXhlZCAoY2FwcyksIEZBTFNFKTsKKworICBwZWVyY2FwcyA9CisgICAgICBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAoR1NUX1JUUF9CQVNFX1BBWUxPQURfU1JDUEFEIChwYXlsb2FkKSwgTlVMTCk7CisgIGlmIChwZWVyY2FwcykgeworICAgIEdzdENhcHMgKnRjYXBzID0KKyAgICAgICAgZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NSQ1BBRCAocGF5bG9hZCkpOworICAgIEdzdENhcHMgKmludGVyc2VjdCA9IGdzdF9jYXBzX2ludGVyc2VjdCAocGVlcmNhcHMsIHRjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGNhcHMpOworCisgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICBpZiAoIWdzdF9jYXBzX2lzX2VtcHR5IChpbnRlcnNlY3QpKSB7CisgICAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChpbnRlcnNlY3QsIDApOworICAgICAgZW5jb2RpbmdfbmFtZSA9IGdfc3RyZHVwIChnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJlbmNvZGluZy1uYW1lIikpOworICAgIH0KKyAgICBnc3RfY2Fwc191bnJlZiAoaW50ZXJzZWN0KTsKKyAgfQorCisgIGlmICghZW5jb2RpbmdfbmFtZSkKKyAgICBlbmNvZGluZ19uYW1lID0gZ19zdHJkdXAgKCJIMjYzLTE5OTgiKTsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAocGF5bG9hZCwgInZpZGVvIiwgVFJVRSwKKyAgICAgIChnY2hhciAqKSBlbmNvZGluZ19uYW1lLCA5MDAwMCk7CisgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChwYXlsb2FkLCBOVUxMKTsKKyAgZ19mcmVlIChlbmNvZGluZ19uYW1lKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitjYXBzX2FwcGVuZCAoR3N0Q2FwcyAqIGNhcHMsIEdzdFN0cnVjdHVyZSAqIGluX3MsIGd1aW50IHgsIGd1aW50IHksIGd1aW50IG1waSkKK3sKKyAgR3N0U3RydWN0dXJlICpzOworCisgIGlmICghaW5fcykKKyAgICByZXR1cm4gY2FwczsKKworICBpZiAobXBpIDwgMSB8fCBtcGkgPiAzMikKKyAgICByZXR1cm4gY2FwczsKKworICBzID0gZ3N0X3N0cnVjdHVyZV9jb3B5IChpbl9zKTsKKworICBnc3Rfc3RydWN0dXJlX3NldCAocywKKyAgICAgICJ3aWR0aCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgeCwKKyAgICAgICJoZWlnaHQiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIHksCisgICAgICAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT05fUkFOR0UsIDAsIDEsIDMwMDAwLCAxMDAxICogbXBpLCBOVUxMKTsKKworICBjYXBzID0gZ3N0X2NhcHNfbWVyZ2Vfc3RydWN0dXJlIChjYXBzLCBzKTsKKworICByZXR1cm4gY2FwczsKK30KKworCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfcnRwX2gyNjNwX3BheV9zaW5rX2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0UGFkICogcGFkLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdFJ0cEgyNjNQUGF5ICpydHBoMjYzcHBheTsKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEwsICp0ZW1wbDsKKyAgR3N0Q2FwcyAqcGVlcmNhcHMgPSBOVUxMOworICBHc3RDYXBzICppbnRlcnNlY3QgPSBOVUxMOworICBndWludCBpOworCisgIHJ0cGgyNjNwcGF5ID0gR1NUX1JUUF9IMjYzUF9QQVkgKHBheWxvYWQpOworCisgIHBlZXJjYXBzID0KKyAgICAgIGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChHU1RfUlRQX0JBU0VfUEFZTE9BRF9TUkNQQUQgKHBheWxvYWQpLCBOVUxMKTsKKworICAvKiBpZiB3ZSdyZSBqdXN0IG91dHB1dHRpbmcgdG8gdWRwc2luayBvciBmYWtlc2luayBvciBzbywgd2Ugc2hvdWxkIGFsc28KKyAgICogYWNjZXB0IGFueSBpbnB1dCBjb21wYXRpYmxlIHdpdGggb3VyIHNpbmsgdGVtcGxhdGUgY2FwcyAqLworICBpZiAoIXBlZXJjYXBzIHx8IGdzdF9jYXBzX2lzX2FueSAocGVlcmNhcHMpKSB7CisgICAgaWYgKHBlZXJjYXBzKQorICAgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICBjYXBzID0KKyAgICAgICAgZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NJTktQQUQgKHBheWxvYWQpKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICAvKiBXZSBiYXNpY2FsbHkgbmVlZCB0byBkaWZmZXJlbnRpYXRlIHR3byB1c2UtY2FzZXMgaGVyZTogT25lIHdoZXJlIHRoZXJlJ3MKKyAgICogYSBjYXBzZmlsdGVyIGFmdGVyIHRoZSBwYXlsb2FkZXIgd2l0aCBjYXBzIGNyZWF0ZWQgZnJvbSBhbiBTRFA7IGluIHRoaXMKKyAgICogY2FzZSB0aGUgZmlsdGVyIGNhcHMgYXJlIGZpeGVkIGFuZCB3ZSB3YW50IHRvIHNpZ25hbCB0byBhbiBlbmNvZGVyIHdoYXQKKyAgICogd2Ugd2FudCBpdCB0byBwcm9kdWNlLiBUaGUgc2Vjb25kIGNhc2UgaXMgc2ltcGx5IHBheWxvYWRlciAhIGRlcGF5bG9hZGVyCisgICAqIHdoZXJlIHdlIGFyZSBkZWFsaW5nIHdpdGggdGhlIGRlcGF5bG9hZGVyJ3MgdGVtcGxhdGUgY2Fwcy4gSW4gdGhpcyBjYXNlCisgICAqIHdlIHNob3VsZCBhY2NlcHQgYW55IGlucHV0IGNvbXBhdGlibGUgd2l0aCBvdXIgc2luayB0ZW1wbGF0ZSBjYXBzLiAqLworICBpZiAoIWdzdF9jYXBzX2lzX2ZpeGVkIChwZWVyY2FwcykpIHsKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcmNhcHMpOworICAgIGNhcHMgPQorICAgICAgICBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX1JUUF9CQVNFX1BBWUxPQURfU0lOS1BBRCAocGF5bG9hZCkpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIHRlbXBsID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NSQ1BBRCAocGF5bG9hZCkpOworICBpbnRlcnNlY3QgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHBlZXJjYXBzLCB0ZW1wbCk7CisgIGdzdF9jYXBzX3VucmVmIChwZWVyY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmICh0ZW1wbCk7CisKKyAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChpbnRlcnNlY3QpKQorICAgIHJldHVybiBpbnRlcnNlY3Q7CisKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKyAgZm9yIChpID0gMDsgaSA8IGdzdF9jYXBzX2dldF9zaXplIChpbnRlcnNlY3QpOyBpKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChpbnRlcnNlY3QsIGkpOworICAgIGNvbnN0IGdjaGFyICplbmNvZGluZ19uYW1lID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAiZW5jb2RpbmctbmFtZSIpOworCisgICAgaWYgKCFzdHJjbXAgKGVuY29kaW5nX25hbWUsICJIMjYzLTIwMDAiKSkgeworICAgICAgY29uc3QgZ2NoYXIgKnByb2ZpbGVfc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAicHJvZmlsZSIpOworICAgICAgY29uc3QgZ2NoYXIgKmxldmVsX3N0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgImxldmVsIik7CisgICAgICBpbnQgcHJvZmlsZSA9IDA7CisgICAgICBpbnQgbGV2ZWwgPSAwOworCisgICAgICBpZiAocHJvZmlsZV9zdHIgJiYgbGV2ZWxfc3RyKSB7CisgICAgICAgIGdib29sZWFuIGkgPSBGQUxTRSwgaiA9IEZBTFNFLCBsID0gRkFMU0UsIHQgPSBGQUxTRSwgZiA9IEZBTFNFLAorICAgICAgICAgICAgdiA9IEZBTFNFOworICAgICAgICBHc3RTdHJ1Y3R1cmUgKm5ld19zID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJ2aWRlby94LWgyNjMiLAorICAgICAgICAgICAgInZhcmlhbnQiLCBHX1RZUEVfU1RSSU5HLCAiaXR1IiwKKyAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgIHByb2ZpbGUgPSBhdG9pIChwcm9maWxlX3N0cik7CisgICAgICAgIGxldmVsID0gYXRvaSAobGV2ZWxfc3RyKTsKKworICAgICAgICAvKiBUaGVzZSBwcm9maWxlcyBhcmUgZGVmaW5lZCBpbiB0aGUgSC4yNjMgQW5uZXggWCAqLworICAgICAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAvKiBUaGUgQmFzZWxpbmUgUHJvZmlsZSAoUHJvZmlsZSAwKSAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgLyogSC4zMjAgQ29kaW5nIEVmZmljaWVuY3kgVmVyc2lvbiAyIEJhY2t3YXJkLUNvbXBhdGliaWxpdHkgUHJvZmlsZQorICAgICAgICAgICAgICogKFByb2ZpbGUgMSkKKyAgICAgICAgICAgICAqIEJhc2VsaW5lICsgQW5uZXhlcyBJLCBKLCBMLjQgYW5kIFQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaSA9IGogPSBsID0gdCA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAvKiBWZXJzaW9uIDEgQmFja3dhcmQtQ29tcGF0aWJpbGl0eSBQcm9maWxlIChQcm9maWxlIDIpCisgICAgICAgICAgICAgKiBCYXNlbGluZSArIEFubmV4IEYKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaSA9IGogPSBsID0gdCA9IGYgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgLyogVmVyc2lvbiAyIEludGVyYWN0aXZlIGFuZCBTdHJlYW1pbmcgV2lyZWxlc3MgUHJvZmlsZQorICAgICAgICAgICAgICogQmFzZWxpbmUgKyBBbm5leGVzIEksIEosIFQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaSA9IGogPSB0ID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIC8qIFZlcnNpb24gMyBJbnRlcmFjdGl2ZSBhbmQgU3RyZWFtaW5nIFdpcmVsZXNzIFByb2ZpbGUgKFByb2ZpbGUgNCkKKyAgICAgICAgICAgICAqIEJhc2VsaW5lICsgQW5uZXhlcyBJLCBKLCBULCBWLCBXLjYuMy44LAorICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiBNaXNzaW5nIFcuNi4zLjggKi8KKyAgICAgICAgICAgIGkgPSBqID0gdCA9IHYgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgLyogQ29udmVyc2F0aW9uYWwgSGlnaCBDb21wcmVzc2lvbiBQcm9maWxlIChQcm9maWxlIDUpCisgICAgICAgICAgICAgKiBCYXNlbGluZSArIEFubmV4ZXMgRiwgSSwgSiwgTC40LCBULCBELCBVCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qIE1pc3NpbmcgRCwgVSAqLworICAgICAgICAgICAgZiA9IGkgPSBqID0gbCA9IHQgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgLyogQ29udmVyc2F0aW9uYWwgSW50ZXJuZXQgUHJvZmlsZSAoUHJvZmlsZSA2KQorICAgICAgICAgICAgICogQmFzZWxpbmUgKyBBbm5leGVzIEYsIEksIEosIEwuNCwgVCwgRCwgVSBhbmQKKyAgICAgICAgICAgICAqIEsgd2l0aCBhcmJpdHJhdHJ5IHNsaWNlIG9yZGVyaW5nCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qIE1pc3NpbmcgRCwgVSwgSyB3aXRoIGFyYml0cmF0cnkgc2xpY2Ugb3JkZXJpbmcgKi8KKyAgICAgICAgICAgIGYgPSBpID0gaiA9IGwgPSB0ID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIC8qIENvbnZlcnNhdGlvbmFsIEludGVybGFjZSBQcm9maWxlIChQcm9maWxlIDcpCisgICAgICAgICAgICAgKiBCYXNlbGluZSArIEFubmV4ZXMgRiwgSSwgSiwgTC40LCBULCBELCBVLCAgVy42LjMuMTEKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogTWlzc2luZyBELCBVLCBXLjYuMy4xMSAqLworICAgICAgICAgICAgZiA9IGkgPSBqID0gbCA9IHQgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgLyogSGlnaCBMYXRlbmN5IFByb2ZpbGUgKFByb2ZpbGUgOCkKKyAgICAgICAgICAgICAqIEJhc2VsaW5lICsgQW5uZXhlcyBGLCBJLCBKLCBMLjQsIFQsIEQsIFUsIFAuNSwgTy4xLjEgYW5kCisgICAgICAgICAgICAgKiBLIHdpdGggYXJiaXRyYXRyeSBzbGljZSBvcmRlcmluZworICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiBNaXNzaW5nIEQsIFUsIFAuNSwgTy4xLjEgKi8KKyAgICAgICAgICAgIGYgPSBpID0gaiA9IGwgPSB0ID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKworICAgICAgICBpZiAoZiB8fCBpIHx8IGogfHwgdCB8fCBsIHx8IHYpIHsKKyAgICAgICAgICBHVmFsdWUgbGlzdCA9IHsgMCB9OworICAgICAgICAgIEdWYWx1ZSB2c3RyID0geyAwIH07CisKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZsaXN0LCBHU1RfVFlQRV9MSVNUKTsKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZ2c3RyLCBHX1RZUEVfU1RSSU5HKTsKKworICAgICAgICAgIGdfdmFsdWVfc2V0X3N0YXRpY19zdHJpbmcgKCZ2c3RyLCAiaDI2MyIpOworICAgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJmxpc3QsICZ2c3RyKTsKKyAgICAgICAgICBnX3ZhbHVlX3NldF9zdGF0aWNfc3RyaW5nICgmdnN0ciwgImgyNjNwIik7CisgICAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmbGlzdCwgJnZzdHIpOworCisgICAgICAgICAgaWYgKGwgfHwgdikgeworICAgICAgICAgICAgZ192YWx1ZV9zZXRfc3RhdGljX3N0cmluZyAoJnZzdHIsICJoMjYzcHAiKTsKKyAgICAgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJmxpc3QsICZ2c3RyKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ192YWx1ZV91bnNldCAoJnZzdHIpOworCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKG5ld19zLCAiaDI2M3ZlcnNpb24iLCAmbGlzdCk7CisgICAgICAgICAgZ192YWx1ZV91bnNldCAoJmxpc3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfcywgImgyNjN2ZXJzaW9uIiwgR19UWVBFX1NUUklORywgImgyNjMiLCBOVUxMKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKCFmKQorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfcywgImFubmV4LWYiLCBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworICAgICAgICBpZiAoIWkpCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG5ld19zLCAiYW5uZXgtaSIsIEdfVFlQRV9CT09MRUFOLCBGQUxTRSwgTlVMTCk7CisgICAgICAgIGlmICghaikKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAobmV3X3MsICJhbm5leC1qIiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgICAgICAgaWYgKCF0KQorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfcywgImFubmV4LXQiLCBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworICAgICAgICBpZiAoIWwpCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG5ld19zLCAiYW5uZXgtbCIsIEdfVFlQRV9CT09MRUFOLCBGQUxTRSwgTlVMTCk7CisgICAgICAgIGlmICghdikKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAobmV3X3MsICJhbm5leC12IiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKworCisgICAgICAgIGlmIChsZXZlbCA8PSAxMCB8fCBsZXZlbCA9PSA0NSkgeworICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfcywKKyAgICAgICAgICAgICAgIndpZHRoIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCAxNzYsCisgICAgICAgICAgICAgICJoZWlnaHQiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIDE0NCwKKyAgICAgICAgICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OX1JBTkdFLCAwLCAxLCAzMDAwMCwgMjAwMiwgTlVMTCk7CisgICAgICAgICAgY2FwcyA9IGdzdF9jYXBzX21lcmdlX3N0cnVjdHVyZSAoY2FwcywgbmV3X3MpOworICAgICAgICB9IGVsc2UgaWYgKGxldmVsIDw9IDIwKSB7CisgICAgICAgICAgR3N0U3RydWN0dXJlICpzX2NvcHkgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKG5ld19zKTsKKworICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfcywKKyAgICAgICAgICAgICAgIndpZHRoIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCAzNTIsCisgICAgICAgICAgICAgICJoZWlnaHQiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIDI4OCwKKyAgICAgICAgICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OX1JBTkdFLCAwLCAxLCAzMDAwMCwgMjAwMiwgTlVMTCk7CisgICAgICAgICAgY2FwcyA9IGdzdF9jYXBzX21lcmdlX3N0cnVjdHVyZSAoY2FwcywgbmV3X3MpOworCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHNfY29weSwKKyAgICAgICAgICAgICAgIndpZHRoIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCAxNzYsCisgICAgICAgICAgICAgICJoZWlnaHQiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIDE0NCwKKyAgICAgICAgICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OX1JBTkdFLCAwLCAxLCAzMDAwMCwgMTAwMSwgTlVMTCk7CisgICAgICAgICAgY2FwcyA9IGdzdF9jYXBzX21lcmdlX3N0cnVjdHVyZSAoY2Fwcywgc19jb3B5KTsKKyAgICAgICAgfSBlbHNlIGlmIChsZXZlbCA8PSA0MCkgeworCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG5ld19zLAorICAgICAgICAgICAgICAid2lkdGgiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIDM1MiwKKyAgICAgICAgICAgICAgImhlaWdodCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgMjg4LAorICAgICAgICAgICAgICAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT05fUkFOR0UsIDAsIDEsIDMwMDAwLCAxMDAxLCBOVUxMKTsKKyAgICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbWVyZ2Vfc3RydWN0dXJlIChjYXBzLCBuZXdfcyk7CisgICAgICAgIH0gZWxzZSBpZiAobGV2ZWwgPD0gNTApIHsKKyAgICAgICAgICBHc3RTdHJ1Y3R1cmUgKnNfY29weSA9IGdzdF9zdHJ1Y3R1cmVfY29weSAobmV3X3MpOworCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG5ld19zLAorICAgICAgICAgICAgICAid2lkdGgiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIDM1MiwKKyAgICAgICAgICAgICAgImhlaWdodCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgMjg4LAorICAgICAgICAgICAgICAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT05fUkFOR0UsIDAsIDEsIDUwLCAxLCBOVUxMKTsKKyAgICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbWVyZ2Vfc3RydWN0dXJlIChjYXBzLCBuZXdfcyk7CisKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoc19jb3B5LAorICAgICAgICAgICAgICAid2lkdGgiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIDM1MiwKKyAgICAgICAgICAgICAgImhlaWdodCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgMjQwLAorICAgICAgICAgICAgICAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT05fUkFOR0UsIDAsIDEsIDYwMDAwLCAxMDAxLCBOVUxMKTsKKyAgICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbWVyZ2Vfc3RydWN0dXJlIChjYXBzLCBzX2NvcHkpOworICAgICAgICB9IGVsc2UgaWYgKGxldmVsIDw9IDYwKSB7CisgICAgICAgICAgR3N0U3RydWN0dXJlICpzX2NvcHkgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKG5ld19zKTsKKworICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfcywKKyAgICAgICAgICAgICAgIndpZHRoIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCA3MjAsCisgICAgICAgICAgICAgICJoZWlnaHQiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIDI4OCwKKyAgICAgICAgICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OX1JBTkdFLCAwLCAxLCA1MCwgMSwgTlVMTCk7CisgICAgICAgICAgY2FwcyA9IGdzdF9jYXBzX21lcmdlX3N0cnVjdHVyZSAoY2FwcywgbmV3X3MpOworCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHNfY29weSwKKyAgICAgICAgICAgICAgIndpZHRoIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCA3MjAsCisgICAgICAgICAgICAgICJoZWlnaHQiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIDI0MCwKKyAgICAgICAgICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OX1JBTkdFLCAwLCAxLCA2MDAwMCwgMTAwMSwgTlVMTCk7CisgICAgICAgICAgY2FwcyA9IGdzdF9jYXBzX21lcmdlX3N0cnVjdHVyZSAoY2Fwcywgc19jb3B5KTsKKyAgICAgICAgfSBlbHNlIGlmIChsZXZlbCA8PSA3MCkgeworICAgICAgICAgIEdzdFN0cnVjdHVyZSAqc19jb3B5ID0gZ3N0X3N0cnVjdHVyZV9jb3B5IChuZXdfcyk7CisKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAobmV3X3MsCisgICAgICAgICAgICAgICJ3aWR0aCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgNzIwLAorICAgICAgICAgICAgICAiaGVpZ2h0IiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCA1NzYsCisgICAgICAgICAgICAgICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTl9SQU5HRSwgMCwgMSwgNTAsIDEsIE5VTEwpOworICAgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19tZXJnZV9zdHJ1Y3R1cmUgKGNhcHMsIG5ld19zKTsKKworICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzX2NvcHksCisgICAgICAgICAgICAgICJ3aWR0aCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgNzIwLAorICAgICAgICAgICAgICAiaGVpZ2h0IiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCA0ODAsCisgICAgICAgICAgICAgICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTl9SQU5HRSwgMCwgMSwgNjAwMDAsIDEwMDEsIE5VTEwpOworICAgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19tZXJnZV9zdHJ1Y3R1cmUgKGNhcHMsIHNfY29weSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY2FwcyA9IGdzdF9jYXBzX21lcmdlX3N0cnVjdHVyZSAoY2FwcywgbmV3X3MpOworICAgICAgICB9CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdzdFN0cnVjdHVyZSAqbmV3X3MgPSBnc3Rfc3RydWN0dXJlX25ldyAoInZpZGVvL3gtaDI2MyIsCisgICAgICAgICAgICAidmFyaWFudCIsIEdfVFlQRV9TVFJJTkcsICJpdHUiLAorICAgICAgICAgICAgImgyNjN2ZXJzaW9uIiwgR19UWVBFX1NUUklORywgImgyNjMiLAorICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BwYXksICJObyBwcm9maWxlIG9yIGxldmVsIHNwZWNpZmllZCIKKyAgICAgICAgICAgICIgZm9yIEgyNjMtMjAwMCwgZGVmYXVsdGluZyB0byBiYXNlbGluZSBIMjYzIik7CisKKyAgICAgICAgY2FwcyA9IGdzdF9jYXBzX21lcmdlX3N0cnVjdHVyZSAoY2FwcywgbmV3X3MpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBnYm9vbGVhbiBmID0gRkFMU0UsIGkgPSBGQUxTRSwgaiA9IEZBTFNFLCB0ID0gRkFMU0U7CisgICAgICAvKiBGSVhNRTogZmZtcGVnIHN1cHBvcnQgdGhlIEFwcGVuZGl4IEsgdG9vLCBob3cgZG8gd2UgZXhwcmVzcyBpdCA/CisgICAgICAgKiAgIGd1aW50IGs7CisgICAgICAgKi8KKyAgICAgIGNvbnN0IGdjaGFyICpzdHI7CisgICAgICBHc3RTdHJ1Y3R1cmUgKm5ld19zID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJ2aWRlby94LWgyNjMiLAorICAgICAgICAgICJ2YXJpYW50IiwgR19UWVBFX1NUUklORywgIml0dSIsCisgICAgICAgICAgTlVMTCk7CisgICAgICBnYm9vbGVhbiBhZGRlZCA9IEZBTFNFOworCisgICAgICBzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJmIik7CisgICAgICBpZiAoc3RyICYmICFzdHJjbXAgKHN0ciwgIjEiKSkKKyAgICAgICAgZiA9IFRSVUU7CisKKyAgICAgIHN0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgImkiKTsKKyAgICAgIGlmIChzdHIgJiYgIXN0cmNtcCAoc3RyLCAiMSIpKQorICAgICAgICBpID0gVFJVRTsKKworICAgICAgc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAiaiIpOworICAgICAgaWYgKHN0ciAmJiAhc3RyY21wIChzdHIsICIxIikpCisgICAgICAgIGogPSBUUlVFOworCisgICAgICBzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJ0Iik7CisgICAgICBpZiAoc3RyICYmICFzdHJjbXAgKHN0ciwgIjEiKSkKKyAgICAgICAgdCA9IFRSVUU7CisKKyAgICAgIGlmIChmIHx8IGkgfHwgaiB8fCB0KSB7CisgICAgICAgIEdWYWx1ZSBsaXN0ID0geyAwIH07CisgICAgICAgIEdWYWx1ZSB2c3RyID0geyAwIH07CisKKyAgICAgICAgZ192YWx1ZV9pbml0ICgmbGlzdCwgR1NUX1RZUEVfTElTVCk7CisgICAgICAgIGdfdmFsdWVfaW5pdCAoJnZzdHIsIEdfVFlQRV9TVFJJTkcpOworCisgICAgICAgIGdfdmFsdWVfc2V0X3N0YXRpY19zdHJpbmcgKCZ2c3RyLCAiaDI2MyIpOworICAgICAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfdmFsdWUgKCZsaXN0LCAmdnN0cik7CisgICAgICAgIGdfdmFsdWVfc2V0X3N0YXRpY19zdHJpbmcgKCZ2c3RyLCAiaDI2M3AiKTsKKyAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmbGlzdCwgJnZzdHIpOworICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdnN0cik7CisKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKG5ld19zLCAiaDI2M3ZlcnNpb24iLCAmbGlzdCk7CisgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZsaXN0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfcywgImgyNjN2ZXJzaW9uIiwgR19UWVBFX1NUUklORywgImgyNjMiLCBOVUxMKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFmKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAobmV3X3MsICJhbm5leC1mIiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgICAgIGlmICghaSkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG5ld19zLCAiYW5uZXgtaSIsIEdfVFlQRV9CT09MRUFOLCBGQUxTRSwgTlVMTCk7CisgICAgICBpZiAoIWopCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfcywgImFubmV4LWoiLCBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworICAgICAgaWYgKCF0KQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAobmV3X3MsICJhbm5leC10IiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKworCisgICAgICBzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJjdXN0b20iKTsKKyAgICAgIGlmIChzdHIpIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHhtYXgsIHltYXgsIG1waTsKKyAgICAgICAgaWYgKHNzY2FuZiAoc3RyLCAiJXUsJXUsJXUiLCAmeG1heCwgJnltYXgsICZtcGkpID09IDMpIHsKKyAgICAgICAgICBpZiAoeG1heCAlIDQgJiYgeW1heCAlIDQgJiYgbXBpID49IDEgJiYgbXBpIDw9IDMyKSB7CisgICAgICAgICAgICBjYXBzID0gY2Fwc19hcHBlbmQgKGNhcHMsIG5ld19zLCB4bWF4LCB5bWF4LCBtcGkpOworICAgICAgICAgICAgYWRkZWQgPSBUUlVFOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cGgyNjNwcGF5LCAiSW52YWxpZCBjdXN0b20gZnJhbWVzaXplL01QSSIKKyAgICAgICAgICAgICAgICAiICV1IHggJXUgYXQgJXUsIGlnbm9yaW5nIiwgeG1heCwgeW1heCwgbXBpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChydHBoMjYzcHBheSwgIkludmFsaWQgY3VzdG9tIGZyYW1lc2l6ZS9NUEk6ICVzLCIKKyAgICAgICAgICAgICAgIiBpZ25vcmluZyIsIHN0cik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAiMTZjaWYiKTsKKyAgICAgIGlmIChzdHIpIHsKKyAgICAgICAgaW50IG1waSA9IGF0b2kgKHN0cik7CisgICAgICAgIGNhcHMgPSBjYXBzX2FwcGVuZCAoY2FwcywgbmV3X3MsIDE0MDgsIDExNTIsIG1waSk7CisgICAgICAgIGFkZGVkID0gVFJVRTsKKyAgICAgIH0KKworICAgICAgc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAiNGNpZiIpOworICAgICAgaWYgKHN0cikgeworICAgICAgICBpbnQgbXBpID0gYXRvaSAoc3RyKTsKKyAgICAgICAgY2FwcyA9IGNhcHNfYXBwZW5kIChjYXBzLCBuZXdfcywgNzA0LCA1NzYsIG1waSk7CisgICAgICAgIGFkZGVkID0gVFJVRTsKKyAgICAgIH0KKworICAgICAgc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAiY2lmIik7CisgICAgICBpZiAoc3RyKSB7CisgICAgICAgIGludCBtcGkgPSBhdG9pIChzdHIpOworICAgICAgICBjYXBzID0gY2Fwc19hcHBlbmQgKGNhcHMsIG5ld19zLCAzNTIsIDI4OCwgbXBpKTsKKyAgICAgICAgYWRkZWQgPSBUUlVFOworICAgICAgfQorCisgICAgICBzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJxY2lmIik7CisgICAgICBpZiAoc3RyKSB7CisgICAgICAgIGludCBtcGkgPSBhdG9pIChzdHIpOworICAgICAgICBjYXBzID0gY2Fwc19hcHBlbmQgKGNhcHMsIG5ld19zLCAxNzYsIDE0NCwgbXBpKTsKKyAgICAgICAgYWRkZWQgPSBUUlVFOworICAgICAgfQorCisgICAgICBzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJzcWNpZiIpOworICAgICAgaWYgKHN0cikgeworICAgICAgICBpbnQgbXBpID0gYXRvaSAoc3RyKTsKKyAgICAgICAgY2FwcyA9IGNhcHNfYXBwZW5kIChjYXBzLCBuZXdfcywgMTI4LCA5NiwgbXBpKTsKKyAgICAgICAgYWRkZWQgPSBUUlVFOworICAgICAgfQorCisgICAgICBpZiAoYWRkZWQpCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAobmV3X3MpOworICAgICAgZWxzZQorICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbWVyZ2Vfc3RydWN0dXJlIChjYXBzLCBuZXdfcyk7CisgICAgfQorICB9CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGludGVyc2VjdCk7CisKK2RvbmU6CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKnRtcDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJJbnRlcnNlY3QgJSIgR1NUX1BUUl9GT1JNQVQgIiBhbmQgZmlsdGVyICUiCisgICAgICAgIEdTVF9QVFJfRk9STUFULCBjYXBzLCBmaWx0ZXIpOworICAgIHRtcCA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIGNhcHMsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIGNhcHMgPSB0bXA7CisgIH0KKworICByZXR1cm4gY2FwczsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYzcF9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cEgyNjNQUGF5ICpydHBoMjYzcHBheTsKKworICBydHBoMjYzcHBheSA9IEdTVF9SVFBfSDI2M1BfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9GUkFHTUVOVEFUSU9OX01PREU6CisgICAgICBydHBoMjYzcHBheS0+ZnJhZ21lbnRhdGlvbl9tb2RlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYzcF9wYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cEgyNjNQUGF5ICpydHBoMjYzcHBheTsKKworICBydHBoMjYzcHBheSA9IEdTVF9SVFBfSDI2M1BfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9GUkFHTUVOVEFUSU9OX01PREU6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgcnRwaDI2M3BwYXktPmZyYWdtZW50YXRpb25fbW9kZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2gyNjNwX3BheV9mbHVzaCAoR3N0UnRwSDI2M1BQYXkgKiBydHBoMjYzcHBheSkKK3sKKyAgZ3VpbnQgYXZhaWw7CisgIEdzdEJ1ZmZlckxpc3QgKmxpc3QgPSBOVUxMOworICBHc3RCdWZmZXIgKm91dGJ1ZiA9IE5VTEw7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBnYm9vbGVhbiBmcmFnbWVudGVkID0gRkFMU0U7CisKKyAgYXZhaWwgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHJ0cGgyNjNwcGF5LT5hZGFwdGVyKTsKKyAgaWYgKGF2YWlsID09IDApCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIGZyYWdtZW50ZWQgPSBGQUxTRTsKKyAgLyogVGhpcyBhbGdvcml0aG0gYXNzdW1lcyB0aGUgSDI2My8rLysrIGVuY29kZXIgc2VuZHMgY29tcGxldGUgZnJhbWVzIGluIGVhY2gKKyAgICogYnVmZmVyICovCisgIC8qIFdpdGggRnJhZ21lbnRhdGlvbiBNb2RlIGF0IEdTVF9GUkFHTUVOVEFUSU9OX01PREVfTk9STUFMOgorICAgKiAgVGhpcyBhbGdvcml0aG0gaW1wbGVtZW50cyB0aGUgRm9sbG93LW9uIHBhY2tldHMgbWV0aG9kIGZvciBwYWNrZXRpemF0aW9uLgorICAgKiAgVGhpcyBhc3N1bWVzIGxvdyBwYWNrZXQgbG9zcyBuZXR3b3JrLiAKKyAgICogV2l0aCBGcmFnbWVudGF0aW9uIE1vZGUgYXQgR1NUX0ZSQUdNRU5UQVRJT05fTU9ERV9TWU5DOgorICAgKiAgVGhpcyBhbGdvcml0aG0gc2VwYXJhdGVzIGxhcmdlIGZyYW1lcyBhdCBzeW5jaHJvbmlzYXRpb24gcG9pbnRzIChTZWdtZW50cykKKyAgICogIChTZWUgUkZDIDQ2Mjkgc2VjdGlvbiA2KS4gSXQgd291bGQgYmUgaW50ZXJlc3RpbmcgdG8gaGF2ZSBhIHByb3BlcnR5IHN1Y2ggYXMgbmV0d29yaworICAgKiAgcXVhbGl0eSB0byBzZWxlY3QgYmV0d2VlbiBib3RoIHBhY2tldGl6YXRpb24gbWV0aG9kcyAqLworICAvKiBUT0RPIEFkZCBWUkMgc3VwcHJ0IChTZWUgUkZDIDQ2Mjkgc2VjdGlvbiA1LjIpICovCisKKyAgd2hpbGUgKGF2YWlsID4gMCkgeworICAgIGd1aW50IHRvd3JpdGU7CisgICAgZ3VpbnQ4ICpwYXlsb2FkOworICAgIGdpbnQgaGVhZGVyX2xlbjsKKyAgICBndWludCBuZXh0X2dvcCA9IDA7CisgICAgZ2Jvb2xlYW4gZm91bmRfZ29iID0gRkFMU0U7CisgICAgR3N0UlRQQnVmZmVyIHJ0cCA9IHsgTlVMTCB9OworICAgIEdzdEJ1ZmZlciAqcGF5bG9hZF9idWY7CisKKyAgICBpZiAocnRwaDI2M3BwYXktPmZyYWdtZW50YXRpb25fbW9kZSA9PSBHU1RfRlJBR01FTlRBVElPTl9NT0RFX1NZTkMpIHsKKyAgICAgIC8qIHN0YXJ0IGFmdGVyIDFzdCBnb3AgcG9zc2libGUgKi8KKworICAgICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhIGdvYiBvciBlb3MgLCBlb3NzYnMgKi8KKyAgICAgIC8qIEZJWE1FIEVPUyBhbmQgRU9TU0JTIHBhY2tldHMgc2hvdWxkIG5ldmVyIGNvbnRhaW4gYW55IGdvYnMgYW5kIHZpY2UtdmVyc2EgKi8KKyAgICAgIG5leHRfZ29wID0KKyAgICAgICAgICBnc3RfYWRhcHRlcl9tYXNrZWRfc2Nhbl91aW50MzIgKHJ0cGgyNjNwcGF5LT5hZGFwdGVyLCAweGZmZmY4MDAwLAorICAgICAgICAgIDB4MDAwMDgwMDAsIDAsIGF2YWlsKTsKKyAgICAgIGlmIChuZXh0X2dvcCA9PSAwKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwcGF5LCAiIEZvdW5kIEdPQiBoZWFkZXIiKTsKKyAgICAgICAgZm91bmRfZ29iID0gVFJVRTsKKyAgICAgIH0KKworICAgICAgLyogRmluZCBuZXh0IGFuZCBjdXQgdGhlIHBhY2tldCBhY2NvcmRpbmdseSAqLworICAgICAgLyogVE9ETyB3ZSBzaG91bGQgZ2V0IGFzIG1hbnkgZ29icyBhcyBwb3NzaWJsZSB1bnRpbCBNVFUgaXMgcmVhY2hlZCwgdGhpcworICAgICAgICogY29kZSBzZWVtcyB0byBqdXN0IGdldCBvbmUgR09CIHBlciBwYWNrZXQgKi8KKyAgICAgIGlmIChuZXh0X2dvcCA9PSAwICYmIGF2YWlsID4gMykKKyAgICAgICAgbmV4dF9nb3AgPQorICAgICAgICAgICAgZ3N0X2FkYXB0ZXJfbWFza2VkX3NjYW5fdWludDMyIChydHBoMjYzcHBheS0+YWRhcHRlciwgMHhmZmZmODAwMCwKKyAgICAgICAgICAgIDB4MDAwMDgwMDAsIDMsIGF2YWlsIC0gMyk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcHBheSwgIiBOZXh0IEdPQiBEZXRlY3RlZCBhdCA6ICAlZCIsIG5leHRfZ29wKTsKKyAgICAgIGlmIChuZXh0X2dvcCA9PSAtMSkKKyAgICAgICAgbmV4dF9nb3AgPSAwOworICAgIH0KKworICAgIC8qIGZvciBwaWN0dXJlIHN0YXJ0IGZyYW1lcyAobm9uLWZyYWdtZW50ZWQpLCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgZmlyc3QKKyAgICAgKiB0d28gMHgwMCBieXRlcyBhbmQgc2V0IFA9MSAqLworICAgIGlmICghZnJhZ21lbnRlZCB8fCBmb3VuZF9nb2IpIHsKKyAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChydHBoMjYzcHBheS0+YWRhcHRlciwgMik7CisgICAgICBhdmFpbCAtPSAyOworICAgIH0KKyAgICBoZWFkZXJfbGVuID0gMjsKKworICAgIHRvd3JpdGUgPSBNSU4gKGF2YWlsLCBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BheWxvYWRfbGVuCisgICAgICAgIChHU1RfUlRQX0JBU0VfUEFZTE9BRF9NVFUgKHJ0cGgyNjNwcGF5KSAtIGhlYWRlcl9sZW4sIDAsIDApKTsKKworICAgIGlmIChuZXh0X2dvcCA+IDApCisgICAgICB0b3dyaXRlID0gTUlOIChuZXh0X2dvcCwgdG93cml0ZSk7CisKKyAgICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKGhlYWRlcl9sZW4sIDAsIDApOworCisgICAgZ3N0X3J0cF9idWZmZXJfbWFwIChvdXRidWYsIEdTVF9NQVBfV1JJVEUsICZydHApOworICAgIC8qIGxhc3QgZnJhZ21lbnQgZ2V0cyB0aGUgbWFya2VyIGJpdCBzZXQgKi8KKyAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBhdmFpbCA+IHRvd3JpdGUgPyAwIDogMSk7CisKKyAgICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHApOworCisgICAgLyogIDAgICAgICAgICAgICAgICAgICAgMQorICAgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1CisgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICogfCAgIFJSICAgIHxQfFZ8ICAgUExFTiAgICB8UEVCSVR8CisgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICovCisgICAgLyogaWYgZnJhZ21lbnRlZCBvciBnb3AgaGVhZGVyICwgd3JpdGUgcCBiaXQgPTEgKi8KKyAgICBwYXlsb2FkWzBdID0gKGZyYWdtZW50ZWQgJiYgIWZvdW5kX2dvYikgPyAweDAwIDogMHgwNDsKKyAgICBwYXlsb2FkWzFdID0gMDsKKworICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gcnRwaDI2M3BwYXktPmZpcnN0X3RpbWVzdGFtcDsKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gcnRwaDI2M3BwYXktPmZpcnN0X2R1cmF0aW9uOworICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICAgIHBheWxvYWRfYnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXJfZmFzdCAocnRwaDI2M3BwYXktPmFkYXB0ZXIsIHRvd3JpdGUpOworICAgIGdzdF9ydHBfY29weV92aWRlb19tZXRhIChydHBoMjYzcHBheSwgb3V0YnVmLCBwYXlsb2FkX2J1Zik7CisgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKG91dGJ1ZiwgcGF5bG9hZF9idWYpOworICAgIGF2YWlsIC09IHRvd3JpdGU7CisKKyAgICAvKiBJZiBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlIGFuZCB0aGlzIGlzIG91ciBmaXJzdCBpdGVyYXRpb24sCisgICAgICogd2UgY3JlYXRlIGEgYnVmZmVyIGxpc3QgYW5kIHJlbWVtYmVyIHRoYXQgd2UncmUgZnJhZ21lbnRlZC4KKyAgICAgKgorICAgICAqIElmIHdlJ3JlIGZyYWdtZW50ZWQgYWxyZWFkeSwgYWRkIGJ1ZmZlcnMgdG8gdGhlIHByZXZpb3VzbHkKKyAgICAgKiBjcmVhdGVkIGJ1ZmZlciBsaXN0LgorICAgICAqCisgICAgICogT3RoZXJ3aXNlIGZyYWdtZW50ZWQgd2lsbCBiZSBGQUxTRSBhbmQgd2UganVzdCBwdXNoIHRoZSBzaW5nbGUgb3V0cHV0CisgICAgICogYnVmZmVyLCBhbmQgbm8gbGlzdCBpcyBhbGxvY2F0ZWQuCisgICAgICovCisgICAgaWYgKGF2YWlsICYmICFmcmFnbWVudGVkKSB7CisgICAgICBmcmFnbWVudGVkID0gVFJVRTsKKyAgICAgIGxpc3QgPSBnc3RfYnVmZmVyX2xpc3RfbmV3ICgpOworICAgICAgZ3N0X2J1ZmZlcl9saXN0X2FkZCAobGlzdCwgb3V0YnVmKTsKKyAgICB9IGVsc2UgaWYgKGZyYWdtZW50ZWQpIHsKKyAgICAgIGdzdF9idWZmZXJfbGlzdF9hZGQgKGxpc3QsIG91dGJ1Zik7CisgICAgfQorICB9CisKKyAgaWYgKGZyYWdtZW50ZWQpIHsKKyAgICByZXQgPQorICAgICAgICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoX2xpc3QgKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBoMjYzcHBheSksCisgICAgICAgIGxpc3QpOworICB9IGVsc2UgeworICAgIHJldCA9CisgICAgICAgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBoMjYzcHBheSksIG91dGJ1Zik7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9oMjYzcF9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UnRwSDI2M1BQYXkgKnJ0cGgyNjNwcGF5OworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBydHBoMjYzcHBheSA9IEdTVF9SVFBfSDI2M1BfUEFZIChwYXlsb2FkKTsKKworICBydHBoMjYzcHBheS0+Zmlyc3RfdGltZXN0YW1wID0gR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcik7CisgIHJ0cGgyNjNwcGF5LT5maXJzdF9kdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcik7CisKKyAgLyogd2UgYWx3YXlzIGVuY29kZSBhbmQgZmx1c2ggYSBmdWxsIHBpY3R1cmUgKi8KKyAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRwaDI2M3BwYXktPmFkYXB0ZXIsIGJ1ZmZlcik7CisgIHJldCA9IGdzdF9ydHBfaDI2M3BfcGF5X2ZsdXNoIChydHBoMjYzcHBheSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2M3BfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwaDI2M3BwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfSDI2M1BfUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2VjOGI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9IMjYzUF9QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9IMjYzUF9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9IMjYzUF9QQVkgXAorICAoZ3N0X3J0cF9oMjYzcF9wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9IMjYzUF9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfSDI2M1BfUEFZLEdzdFJ0cEgyNjNQUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9IMjYzUF9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0gyNjNQX1BBWSxHc3RSdHBIMjYzUFBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9IMjYzUF9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfSDI2M1BfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9IMjYzUF9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0gyNjNQX1BBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBIMjYzUFBheSBHc3RSdHBIMjYzUFBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBIMjYzUFBheUNsYXNzIEdzdFJ0cEgyNjNQUGF5Q2xhc3M7CisKK3R5cGVkZWYgZW51bQoreworICBHU1RfRlJBR01FTlRBVElPTl9NT0RFX05PUk1BTCA9IDAsCisgIEdTVF9GUkFHTUVOVEFUSU9OX01PREVfU1lOQyAgID0gMQorfSBHc3RGcmFnbWVudGF0aW9uTW9kZTsKKworc3RydWN0IF9Hc3RSdHBIMjYzUFBheQoreworICBHc3RSVFBCYXNlUGF5bG9hZCAgICBwYXlsb2FkOworCisgIEdzdEFkYXB0ZXIgICAgICAgICAgKmFkYXB0ZXI7CisgIEdzdENsb2NrVGltZSAgICAgICAgIGZpcnN0X3RpbWVzdGFtcDsKKyAgR3N0Q2xvY2tUaW1lICAgICAgICAgZmlyc3RfZHVyYXRpb247CisgIEdzdEZyYWdtZW50YXRpb25Nb2RlIGZyYWdtZW50YXRpb25fbW9kZTsKK307CisKK3N0cnVjdCBfR3N0UnRwSDI2M1BQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfaDI2M3BfcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9oMjYzcF9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfSDI2M1BfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNlMzgyMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmMKQEAgLTAsMCArMSwxMzI5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Yml0cmVhZGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvcGJ1dGlscy9wYnV0aWxzLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSAiZ3N0cnRwaDI2NGRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwaDI2NGRlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBoMjY0ZGVwYXlfZGVidWcpCisKKy8qIFRoaXMgaXMgd2hhdCB3ZSdsbCBkZWZhdWx0IHRvIHdoZW4gZG93bnN0cmVhbSBoYXNuJ3QKKyAqIGV4cHJlc3NlZCBhIHJlc3RyaWN0aW9uIG9yIHByZWZlcmVuY2UgdmlhIGNhcHMgKi8KKyNkZWZpbmUgREVGQVVMVF9CWVRFX1NUUkVBTSAgIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9BQ0NFU1NfVU5JVCAgIEZBTFNFCisKKy8qIDMgemVybyBieXRlcyBzeW5jd29yZCAqLworc3RhdGljIGNvbnN0IGd1aW50OCBzeW5jX2J5dGVzW10gPSB7IDAsIDAsIDAsIDEgfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2NF9kZXBheV9zcmNfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LWgyNjQsICIKKyAgICAgICAgInN0cmVhbS1mb3JtYXQgPSAoc3RyaW5nKSBhdmMsIGFsaWdubWVudCA9IChzdHJpbmcpIGF1OyAiCisgICAgICAgICJ2aWRlby94LWgyNjQsICIKKyAgICAgICAgInN0cmVhbS1mb3JtYXQgPSAoc3RyaW5nKSBieXRlLXN0cmVhbSwgYWxpZ25tZW50ID0gKHN0cmluZykgeyBuYWwsIGF1IH0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2gyNjRfZGVwYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiSDI2NFwiIikKKyAgICAgICAgLyoqIG9wdGlvbmFsIHBhcmFtZXRlcnMgKiovCisgICAgLyogInByb2ZpbGUtbGV2ZWwtaWQgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICAvKiAibWF4LW1icHMgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICAvKiAibWF4LWZzID0gKHN0cmluZykgQU5ZLCAiICovCisgICAgLyogIm1heC1jcGIgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICAvKiAibWF4LWRwYiA9IChzdHJpbmcpIEFOWSwgIiAqLworICAgIC8qICJtYXgtYnIgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICAvKiAicmVkdW5kYW50LXBpYy1jYXAgPSAoc3RyaW5nKSB7IFwiMFwiLCBcIjFcIiB9LCAiICovCisgICAgLyogInNwcm9wLXBhcmFtZXRlci1zZXRzID0gKHN0cmluZykgQU5ZLCAiICovCisgICAgLyogInBhcmFtZXRlci1hZGQgPSAoc3RyaW5nKSB7IFwiMFwiLCBcIjFcIiB9LCAiICovCisgICAgLyogInBhY2tldGl6YXRpb24tbW9kZSA9IChzdHJpbmcpIHsgXCIwXCIsIFwiMVwiLCBcIjJcIiB9LCAiICovCisgICAgLyogInNwcm9wLWludGVybGVhdmluZy1kZXB0aCA9IChzdHJpbmcpIEFOWSwgIiAqLworICAgIC8qICJzcHJvcC1kZWludC1idWYtcmVxID0gKHN0cmluZykgQU5ZLCAiICovCisgICAgLyogImRlaW50LWJ1Zi1jYXAgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICAvKiAic3Byb3AtaW5pdC1idWYtdGltZSA9IChzdHJpbmcpIEFOWSwgIiAqLworICAgIC8qICJzcHJvcC1tYXgtZG9uLWRpZmYgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICAvKiAibWF4LXJjbWQtbmFsdS1zaXplID0gKHN0cmluZykgQU5ZICIgKi8KKyAgICApOworCisjZGVmaW5lIGdzdF9ydHBfaDI2NF9kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBIMjY0RGVwYXksIGdzdF9ydHBfaDI2NF9kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2gyNjRfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9oMjY0X2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfaDI2NF9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9oMjY0X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBmaWx0ZXIsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfaDI2NF9kZXBheV9oYW5kbGVfZXZlbnQgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheSwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NF9kZXBheV9jbGFzc19pbml0IChHc3RSdHBIMjY0RGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX2gyNjRfZGVwYXlfZmluYWxpemU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9oMjY0X2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfaDI2NF9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBIMjY0IGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBIMjY0IHZpZGVvIGZyb20gUlRQIHBhY2tldHMgKFJGQyAzOTg0KSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3J0cF9oMjY0X2RlcGF5X2NoYW5nZV9zdGF0ZTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX2gyNjRfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2gyNjRfZGVwYXlfc2V0Y2FwczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2V2ZW50ID0gZ3N0X3J0cF9oMjY0X2RlcGF5X2hhbmRsZV9ldmVudDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NF9kZXBheV9pbml0IChHc3RSdHBIMjY0RGVwYXkgKiBydHBoMjY0ZGVwYXkpCit7CisgIHJ0cGgyNjRkZXBheS0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKKyAgcnRwaDI2NGRlcGF5LT5waWN0dXJlX2FkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgIHJ0cGgyNjRkZXBheS0+Ynl0ZV9zdHJlYW0gPSBERUZBVUxUX0JZVEVfU1RSRUFNOworICBydHBoMjY0ZGVwYXktPm1lcmdlID0gREVGQVVMVF9BQ0NFU1NfVU5JVDsKKyAgcnRwaDI2NGRlcGF5LT5zcHMgPSBnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKAorICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnc3RfYnVmZmVyX3VucmVmKTsKKyAgcnRwaDI2NGRlcGF5LT5wcHMgPSBnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKAorICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnc3RfYnVmZmVyX3VucmVmKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NF9kZXBheV9yZXNldCAoR3N0UnRwSDI2NERlcGF5ICogcnRwaDI2NGRlcGF5LCBnYm9vbGVhbiBoYXJkKQoreworICBnc3RfYWRhcHRlcl9jbGVhciAocnRwaDI2NGRlcGF5LT5hZGFwdGVyKTsKKyAgcnRwaDI2NGRlcGF5LT53YWl0X3N0YXJ0ID0gVFJVRTsKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGgyNjRkZXBheS0+cGljdHVyZV9hZGFwdGVyKTsKKyAgcnRwaDI2NGRlcGF5LT5waWN0dXJlX3N0YXJ0ID0gRkFMU0U7CisgIHJ0cGgyNjRkZXBheS0+bGFzdF9rZXlmcmFtZSA9IEZBTFNFOworICBydHBoMjY0ZGVwYXktPmxhc3RfdHMgPSAwOworICBydHBoMjY0ZGVwYXktPmN1cnJlbnRfZnVfdHlwZSA9IDA7CisgIHJ0cGgyNjRkZXBheS0+bmV3X2NvZGVjX2RhdGEgPSBGQUxTRTsKKyAgZ19wdHJfYXJyYXlfc2V0X3NpemUgKHJ0cGgyNjRkZXBheS0+c3BzLCAwKTsKKyAgZ19wdHJfYXJyYXlfc2V0X3NpemUgKHJ0cGgyNjRkZXBheS0+cHBzLCAwKTsKKworICBpZiAoaGFyZCkgeworICAgIGlmIChydHBoMjY0ZGVwYXktPmFsbG9jYXRvciAhPSBOVUxMKSB7CisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChydHBoMjY0ZGVwYXktPmFsbG9jYXRvcik7CisgICAgICBydHBoMjY0ZGVwYXktPmFsbG9jYXRvciA9IE5VTEw7CisgICAgfQorICAgIGdzdF9hbGxvY2F0aW9uX3BhcmFtc19pbml0ICgmcnRwaDI2NGRlcGF5LT5wYXJhbXMpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjRfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cEgyNjREZXBheSAqcnRwaDI2NGRlcGF5OworCisgIHJ0cGgyNjRkZXBheSA9IEdTVF9SVFBfSDI2NF9ERVBBWSAob2JqZWN0KTsKKworICBpZiAocnRwaDI2NGRlcGF5LT5jb2RlY19kYXRhKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKHJ0cGgyNjRkZXBheS0+Y29kZWNfZGF0YSk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHJ0cGgyNjRkZXBheS0+YWRhcHRlcik7CisgIGdfb2JqZWN0X3VucmVmIChydHBoMjY0ZGVwYXktPnBpY3R1cmVfYWRhcHRlcik7CisKKyAgZ19wdHJfYXJyYXlfZnJlZSAocnRwaDI2NGRlcGF5LT5zcHMsIFRSVUUpOworICBnX3B0cl9hcnJheV9mcmVlIChydHBoMjY0ZGVwYXktPnBwcywgVFJVRSk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY0X2RlcGF5X25lZ290aWF0ZSAoR3N0UnRwSDI2NERlcGF5ICogcnRwaDI2NGRlcGF5KQoreworICBHc3RDYXBzICpjYXBzOworICBnaW50IGJ5dGVfc3RyZWFtID0gLTE7CisgIGdpbnQgbWVyZ2UgPSAtMTsKKworICBjYXBzID0KKyAgICAgIGdzdF9wYWRfZ2V0X2FsbG93ZWRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKHJ0cGgyNjRkZXBheSkpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRkZXBheSwgImFsbG93ZWQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIGlmIChjYXBzKSB7CisgICAgaWYgKGdzdF9jYXBzX2dldF9zaXplIChjYXBzKSA+IDApIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICAgICAgY29uc3QgZ2NoYXIgKnN0ciA9IE5VTEw7CisKKyAgICAgIGlmICgoc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAic3RyZWFtLWZvcm1hdCIpKSkgeworICAgICAgICBpZiAoc3RyY21wIChzdHIsICJhdmMiKSA9PSAwKSB7CisgICAgICAgICAgYnl0ZV9zdHJlYW0gPSBGQUxTRTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAgKHN0ciwgImJ5dGUtc3RyZWFtIikgPT0gMCkgeworICAgICAgICAgIGJ5dGVfc3RyZWFtID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0ZGVwYXksICJ1bmtub3duIHN0cmVhbS1mb3JtYXQ6ICVzIiwgc3RyKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoKHN0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgImFsaWdubWVudCIpKSkgeworICAgICAgICBpZiAoc3RyY21wIChzdHIsICJhdSIpID09IDApIHsKKyAgICAgICAgICBtZXJnZSA9IFRSVUU7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wIChzdHIsICJuYWwiKSA9PSAwKSB7CisgICAgICAgICAgbWVyZ2UgPSBGQUxTRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0ZGVwYXksICJ1bmtub3duIGFsaWdubWVudDogJXMiLCBzdHIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgfQorCisgIGlmIChieXRlX3N0cmVhbSAhPSAtMSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRkZXBheSwgImRvd25zdHJlYW0gcmVxdWlyZXMgYnl0ZS1zdHJlYW0gJWQiLAorICAgICAgICBieXRlX3N0cmVhbSk7CisgICAgcnRwaDI2NGRlcGF5LT5ieXRlX3N0cmVhbSA9IGJ5dGVfc3RyZWFtOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRkZXBheSwgImRlZmF1bHRpbmcgdG8gYnl0ZS1zdHJlYW0gJWQiLAorICAgICAgICBERUZBVUxUX0JZVEVfU1RSRUFNKTsKKyAgICBydHBoMjY0ZGVwYXktPmJ5dGVfc3RyZWFtID0gREVGQVVMVF9CWVRFX1NUUkVBTTsKKyAgfQorICBpZiAobWVyZ2UgIT0gLTEpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0ZGVwYXksICJkb3duc3RyZWFtIHJlcXVpcmVzIG1lcmdlICVkIiwgbWVyZ2UpOworICAgIHJ0cGgyNjRkZXBheS0+bWVyZ2UgPSBtZXJnZTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0ZGVwYXksICJkZWZhdWx0aW5nIHRvIG1lcmdlICVkIiwKKyAgICAgICAgREVGQVVMVF9BQ0NFU1NfVU5JVCk7CisgICAgcnRwaDI2NGRlcGF5LT5tZXJnZSA9IERFRkFVTFRfQUNDRVNTX1VOSVQ7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitwYXJzZV9zcHMgKEdzdE1hcEluZm8gKiBtYXAsIGd1aW50MzIgKiBzcHNfaWQpCit7CisgIEdzdEJpdFJlYWRlciBiciA9IEdTVF9CSVRfUkVBREVSX0lOSVQgKG1hcC0+ZGF0YSArIDQsCisgICAgICBtYXAtPnNpemUgLSA0KTsKKworICBpZiAobWFwLT5zaXplIDwgNSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3JlYWRfZ29sb21iICgmYnIsIHNwc19pZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BhcnNlX3BwcyAoR3N0TWFwSW5mbyAqIG1hcCwgZ3VpbnQzMiAqIHNwc19pZCwgZ3VpbnQzMiAqIHBwc19pZCkKK3sKKyAgR3N0Qml0UmVhZGVyIGJyID0gR1NUX0JJVF9SRUFERVJfSU5JVCAobWFwLT5kYXRhICsgMSwKKyAgICAgIG1hcC0+c2l6ZSAtIDEpOworCisgIGlmIChtYXAtPnNpemUgPCAyKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfcmVhZF9nb2xvbWIgKCZiciwgcHBzX2lkKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghZ3N0X3J0cF9yZWFkX2dvbG9tYiAoJmJyLCBzcHNfaWQpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2gyNjRfZGVwYXlfc2V0X291dHB1dF9jYXBzIChHc3RSdHBIMjY0RGVwYXkgKiBydHBoMjY0ZGVwYXksCisgICAgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdEFsbG9jYXRpb25QYXJhbXMgcGFyYW1zOworICBHc3RBbGxvY2F0b3IgKmFsbG9jYXRvciA9IE5VTEw7CisgIEdzdFBhZCAqc3JjcGFkOworICBnYm9vbGVhbiByZXM7CisKKyAgZ3N0X2FsbG9jYXRpb25fcGFyYW1zX2luaXQgKCZwYXJhbXMpOworCisgIHNyY3BhZCA9IEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChydHBoMjY0ZGVwYXkpOworCisgIHJlcyA9IGdzdF9wYWRfc2V0X2NhcHMgKHNyY3BhZCwgY2Fwcyk7CisKKyAgaWYgKHJlcykgeworICAgIEdzdFF1ZXJ5ICpxdWVyeTsKKworICAgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19hbGxvY2F0aW9uIChjYXBzLCBUUlVFKTsKKyAgICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeSAoc3JjcGFkLCBxdWVyeSkpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRkZXBheSwgImRvd25zdHJlYW0gQUxMT0NBVElPTiBxdWVyeSBmYWlsZWQiKTsKKyAgICB9CisKKyAgICBpZiAoZ3N0X3F1ZXJ5X2dldF9uX2FsbG9jYXRpb25fcGFyYW1zIChxdWVyeSkgPiAwKSB7CisgICAgICBnc3RfcXVlcnlfcGFyc2VfbnRoX2FsbG9jYXRpb25fcGFyYW0gKHF1ZXJ5LCAwLCAmYWxsb2NhdG9yLCAmcGFyYW1zKTsKKyAgICB9CisKKyAgICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKyAgfQorCisgIGlmIChydHBoMjY0ZGVwYXktPmFsbG9jYXRvcikKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChydHBoMjY0ZGVwYXktPmFsbG9jYXRvcik7CisKKyAgcnRwaDI2NGRlcGF5LT5hbGxvY2F0b3IgPSBhbGxvY2F0b3I7CisgIHJ0cGgyNjRkZXBheS0+cGFyYW1zID0gcGFyYW1zOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9oMjY0X3NldF9zcmNfY2FwcyAoR3N0UnRwSDI2NERlcGF5ICogcnRwaDI2NGRlcGF5KQoreworICBnYm9vbGVhbiByZXMgPSBUUlVFOworICBHc3RDYXBzICpzcmNjYXBzOworICBHc3RDYXBzICpvbGRfY2FwczsKKyAgR3N0UGFkICpzcmNwYWQ7CisKKyAgaWYgKCFydHBoMjY0ZGVwYXktPmJ5dGVfc3RyZWFtICYmCisgICAgICAoIXJ0cGgyNjRkZXBheS0+bmV3X2NvZGVjX2RhdGEgfHwKKyAgICAgICAgICBydHBoMjY0ZGVwYXktPnNwcy0+bGVuID09IDAgfHwgcnRwaDI2NGRlcGF5LT5wcHMtPmxlbiA9PSAwKSkKKyAgICByZXR1cm4gVFJVRTsKKworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtaDI2NCIsCisgICAgICAic3RyZWFtLWZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICBydHBoMjY0ZGVwYXktPmJ5dGVfc3RyZWFtID8gImJ5dGUtc3RyZWFtIiA6ICJhdmMiLAorICAgICAgImFsaWdubWVudCIsIEdfVFlQRV9TVFJJTkcsIHJ0cGgyNjRkZXBheS0+bWVyZ2UgPyAiYXUiIDogIm5hbCIsIE5VTEwpOworCisgIGlmICghcnRwaDI2NGRlcGF5LT5ieXRlX3N0cmVhbSkgeworICAgIEdzdEJ1ZmZlciAqY29kZWNfZGF0YTsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBHc3RNYXBJbmZvIG5hbG1hcDsKKyAgICBndWludDggKmRhdGE7CisgICAgZ3VpbnQgbGVuOworICAgIGd1aW50IG5ld19zaXplOworICAgIGd1aW50IGk7CisgICAgZ3VjaGFyIGxldmVsID0gMDsKKyAgICBndWNoYXIgcHJvZmlsZV9jb21wYXQgPSBHX01BWFVJTlQ4OworCisgICAgLyogc3RhcnQgd2l0aCA3IGJ5dGVzIGhlYWRlciAqLworICAgIGxlbiA9IDc7CisgICAgLyogY291bnQgc3BzICYgcHBzICovCisgICAgZm9yIChpID0gMDsgaSA8IHJ0cGgyNjRkZXBheS0+c3BzLT5sZW47IGkrKykKKyAgICAgIGxlbiArPSAyICsgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjRkZXBheS0+c3BzLCBpKSk7CisgICAgZm9yIChpID0gMDsgaSA8IHJ0cGgyNjRkZXBheS0+cHBzLT5sZW47IGkrKykKKyAgICAgIGxlbiArPSAyICsgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjRkZXBheS0+cHBzLCBpKSk7CisKKyAgICBjb2RlY19kYXRhID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChsZW4pOworICAgIGdzdF9idWZmZXJfbWFwIChjb2RlY19kYXRhLCAmbWFwLCBHU1RfTUFQX1JFQURXUklURSk7CisgICAgZGF0YSA9IG1hcC5kYXRhOworCisgICAgLyogOCBiaXRzIHZlcnNpb24gPT0gMSAqLworICAgICpkYXRhKysgPSAxOworCisgICAgLyogQWNjb3JkaW5nIHRvOiBJU08vSUVDIDE0NDk2LTE1OjIwMDQoRSkgc2VjdGlvbiA1LjIuNC4xCisgICAgICogVGhlIGxldmVsIGlzIHRoZSBtYXggbGV2ZWwgb2YgYWxsIFNQU2VzCisgICAgICogQSBwcm9maWxlIGNvbXBhdCBiaXQgY2FuIG9ubHkgYmUgc2V0IGlmIGFsbCBTUFNlcyBpbmNsdWRlIHRoYXQgYml0CisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IHJ0cGgyNjRkZXBheS0+c3BzLT5sZW47IGkrKykgeworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGdfcHRyX2FycmF5X2luZGV4IChydHBoMjY0ZGVwYXktPnNwcywgaSksICZuYWxtYXAsCisgICAgICAgICAgR1NUX01BUF9SRUFEKTsKKyAgICAgIHByb2ZpbGVfY29tcGF0ICY9IG5hbG1hcC5kYXRhWzJdOworICAgICAgbGV2ZWwgPSBNQVggKGxldmVsLCBuYWxtYXAuZGF0YVszXSk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NGRlcGF5LT5zcHMsIGkpLCAmbmFsbWFwKTsKKyAgICB9CisKKyAgICAvKiBBc3N1bWUgYWxsIFNQU2VzIHVzZSB0aGUgc2FtZSBwcm9maWxlLCBzbyBleHRyYWN0IGZyb20gdGhlIGZpcnN0IFNQUyAqLworICAgIGdzdF9idWZmZXJfbWFwIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NGRlcGF5LT5zcHMsIDApLCAmbmFsbWFwLAorICAgICAgICBHU1RfTUFQX1JFQUQpOworICAgICpkYXRhKysgPSBuYWxtYXAuZGF0YVsxXTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NGRlcGF5LT5zcHMsIDApLCAmbmFsbWFwKTsKKyAgICAqZGF0YSsrID0gcHJvZmlsZV9jb21wYXQ7CisgICAgKmRhdGErKyA9IGxldmVsOworCisgICAgLyogNiBiaXRzIHJlc2VydmVkIHwgMiBiaXRzIGxlbmd0aFNpemVNaW51c09uICovCisgICAgKmRhdGErKyA9IDB4ZmY7CisgICAgLyogMyBiaXRzIHJlc2VydmVkIHwgNSBiaXRzIG51bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzICovCisgICAgKmRhdGErKyA9IDB4ZTAgfCAocnRwaDI2NGRlcGF5LT5zcHMtPmxlbiAmIDB4MWYpOworCisgICAgLyogY29weSBhbGwgU1BTICovCisgICAgZm9yIChpID0gMDsgaSA8IHJ0cGgyNjRkZXBheS0+c3BzLT5sZW47IGkrKykgeworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGdfcHRyX2FycmF5X2luZGV4IChydHBoMjY0ZGVwYXktPnNwcywgaSksICZuYWxtYXAsCisgICAgICAgICAgR1NUX01BUF9SRUFEKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NGRlcGF5LCAiY29weSBTUFMgJWQgb2YgbGVuZ3RoICV1IiwgaSwKKyAgICAgICAgICAoZ3VpbnQpIG5hbG1hcC5zaXplKTsKKyAgICAgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEsIG5hbG1hcC5zaXplKTsKKyAgICAgIGRhdGEgKz0gMjsKKyAgICAgIG1lbWNweSAoZGF0YSwgbmFsbWFwLmRhdGEsIG5hbG1hcC5zaXplKTsKKyAgICAgIGRhdGEgKz0gbmFsbWFwLnNpemU7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NGRlcGF5LT5zcHMsIGkpLCAmbmFsbWFwKTsKKyAgICB9CisKKyAgICAvKiA4IGJpdHMgbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0cyAqLworICAgICpkYXRhKysgPSBydHBoMjY0ZGVwYXktPnBwcy0+bGVuOworICAgIC8qIGNvcHkgYWxsIFBQUyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBydHBoMjY0ZGVwYXktPnBwcy0+bGVuOyBpKyspIHsKKyAgICAgIGdzdF9idWZmZXJfbWFwIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NGRlcGF5LT5wcHMsIGkpLCAmbmFsbWFwLAorICAgICAgICAgIEdTVF9NQVBfUkVBRCk7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRkZXBheSwgImNvcHkgUFBTICVkIG9mIGxlbmd0aCAldSIsIGksCisgICAgICAgICAgKGd1aW50KSBuYWxtYXAuc2l6ZSk7CisgICAgICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhLCBuYWxtYXAuc2l6ZSk7CisgICAgICBkYXRhICs9IDI7CisgICAgICBtZW1jcHkgKGRhdGEsIG5hbG1hcC5kYXRhLCBuYWxtYXAuc2l6ZSk7CisgICAgICBkYXRhICs9IG5hbG1hcC5zaXplOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjRkZXBheS0+cHBzLCBpKSwgJm5hbG1hcCk7CisgICAgfQorCisgICAgbmV3X3NpemUgPSBkYXRhIC0gbWFwLmRhdGE7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoY29kZWNfZGF0YSwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl9zZXRfc2l6ZSAoY29kZWNfZGF0YSwgbmV3X3NpemUpOworCisgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoc3JjY2FwcywKKyAgICAgICAgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIGNvZGVjX2RhdGEsIE5VTEwpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGNvZGVjX2RhdGEpOworICB9CisKKyAgLyogU2V0IHByb2ZpbGUgYSBsZXZlbCBmcm9tIFNQUyAqLworICB7CisgICAgZ2ludCBpOworICAgIEdzdEJ1ZmZlciAqbWF4X2xldmVsX3NwcyA9IE5VTEw7CisgICAgZ2ludCBsZXZlbCA9IDA7CisgICAgR3N0TWFwSW5mbyBuYWxtYXA7CisKKyAgICAvKiBHZXQgdGhlIFNQUyB3aXRoIHRoZSBoaWdoZXN0IGxldmVsLiBXZSBhc3N1bWUKKyAgICAgKiBhbGwgU1BTIGhhdmUgdGhlIHNhbWUgcHJvZmlsZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBydHBoMjY0ZGVwYXktPnNwcy0+bGVuOyBpKyspIHsKKyAgICAgIGdzdF9idWZmZXJfbWFwIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NGRlcGF5LT5zcHMsIGkpLCAmbmFsbWFwLAorICAgICAgICAgIEdTVF9NQVBfUkVBRCk7CisgICAgICBpZiAobGV2ZWwgPT0gMCB8fCBsZXZlbCA8IG5hbG1hcC5kYXRhWzNdKSB7CisgICAgICAgIG1heF9sZXZlbF9zcHMgPSBnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NGRlcGF5LT5zcHMsIGkpOworICAgICAgICBsZXZlbCA9IG5hbG1hcC5kYXRhWzNdOworICAgICAgfQorICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjRkZXBheS0+c3BzLCBpKSwgJm5hbG1hcCk7CisgICAgfQorCisgICAgaWYgKG1heF9sZXZlbF9zcHMpIHsKKyAgICAgIGdzdF9idWZmZXJfbWFwIChtYXhfbGV2ZWxfc3BzLCAmbmFsbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgZ3N0X2NvZGVjX3V0aWxzX2gyNjRfY2Fwc19zZXRfbGV2ZWxfYW5kX3Byb2ZpbGUgKHNyY2NhcHMsIG5hbG1hcC5kYXRhICsgMSwKKyAgICAgICAgICBuYWxtYXAuc2l6ZSAtIDEpOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAobWF4X2xldmVsX3NwcywgJm5hbG1hcCk7CisgICAgfQorICB9CisKKyAgc3JjcGFkID0gR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKHJ0cGgyNjRkZXBheSk7CisKKyAgb2xkX2NhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHNyY3BhZCk7CisKKyAgaWYgKG9sZF9jYXBzID09IE5VTEwgfHwgIWdzdF9jYXBzX2lzX2VxdWFsIChzcmNjYXBzLCBvbGRfY2FwcykpIHsKKyAgICByZXMgPSBnc3RfcnRwX2gyNjRfZGVwYXlfc2V0X291dHB1dF9jYXBzIChydHBoMjY0ZGVwYXksIHNyY2NhcHMpOworICB9CisKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIC8qIEluc2VydCBTUFMgYW5kIFBQUyBpbnRvIHRoZSBzdHJlYW0gb24gbmV4dCBvcHBvcnR1bml0eSAoaWYgYnl0ZXN0cmVhbSkgKi8KKyAgaWYgKHJ0cGgyNjRkZXBheS0+Ynl0ZV9zdHJlYW0KKyAgICAgICYmIChydHBoMjY0ZGVwYXktPnNwcy0+bGVuID4gMCB8fCBydHBoMjY0ZGVwYXktPnBwcy0+bGVuID4gMCkpIHsKKyAgICBnaW50IGk7CisgICAgR3N0QnVmZmVyICpjb2RlY19kYXRhOworICAgIEdzdE1hcEluZm8gbWFwOworICAgIGd1aW50OCAqZGF0YTsKKyAgICBndWludCBsZW4gPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IHJ0cGgyNjRkZXBheS0+c3BzLT5sZW47IGkrKykgeworICAgICAgbGVuICs9IDQgKyBnc3RfYnVmZmVyX2dldF9zaXplIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NGRlcGF5LT5zcHMsIGkpKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcnRwaDI2NGRlcGF5LT5wcHMtPmxlbjsgaSsrKSB7CisgICAgICBsZW4gKz0gNCArIGdzdF9idWZmZXJfZ2V0X3NpemUgKGdfcHRyX2FycmF5X2luZGV4IChydHBoMjY0ZGVwYXktPnBwcywgaSkpOworICAgIH0KKworICAgIGNvZGVjX2RhdGEgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGxlbik7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKGNvZGVjX2RhdGEsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgIGRhdGEgPSBtYXAuZGF0YTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBydHBoMjY0ZGVwYXktPnNwcy0+bGVuOyBpKyspIHsKKyAgICAgIEdzdEJ1ZmZlciAqc3BzX2J1ZiA9IGdfcHRyX2FycmF5X2luZGV4IChydHBoMjY0ZGVwYXktPnNwcywgaSk7CisgICAgICBndWludCBzcHNfc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKHNwc19idWYpOworCisgICAgICBpZiAocnRwaDI2NGRlcGF5LT5ieXRlX3N0cmVhbSkKKyAgICAgICAgbWVtY3B5IChkYXRhLCBzeW5jX2J5dGVzLCBzaXplb2YgKHN5bmNfYnl0ZXMpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSwgc3BzX3NpemUpOworICAgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChzcHNfYnVmLCAwLCBkYXRhICsgNCwgLTEpOworICAgICAgZGF0YSArPSA0ICsgc3BzX3NpemU7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHJ0cGgyNjRkZXBheS0+cHBzLT5sZW47IGkrKykgeworICAgICAgR3N0QnVmZmVyICpwcHNfYnVmID0gZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjRkZXBheS0+cHBzLCBpKTsKKyAgICAgIGd1aW50IHBwc19zaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAocHBzX2J1Zik7CisKKyAgICAgIGlmIChydHBoMjY0ZGVwYXktPmJ5dGVfc3RyZWFtKQorICAgICAgICBtZW1jcHkgKGRhdGEsIHN5bmNfYnl0ZXMsIHNpemVvZiAoc3luY19ieXRlcykpOworICAgICAgZWxzZQorICAgICAgICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhLCBwcHNfc2l6ZSk7CisgICAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKHBwc19idWYsIDAsIGRhdGEgKyA0LCAtMSk7CisgICAgICBkYXRhICs9IDQgKyBwcHNfc2l6ZTsKKyAgICB9CisKKyAgICBnc3RfYnVmZmVyX3VubWFwIChjb2RlY19kYXRhLCAmbWFwKTsKKyAgICBpZiAocnRwaDI2NGRlcGF5LT5jb2RlY19kYXRhKQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocnRwaDI2NGRlcGF5LT5jb2RlY19kYXRhKTsKKyAgICBydHBoMjY0ZGVwYXktPmNvZGVjX2RhdGEgPSBjb2RlY19kYXRhOworICB9CisKKyAgaWYgKHJlcykKKyAgICBydHBoMjY0ZGVwYXktPm5ld19jb2RlY19kYXRhID0gRkFMU0U7CisKKyAgcmV0dXJuIHJlczsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2NF9hZGRfc3BzX3BwcyAoR3N0RWxlbWVudCAqIHJ0cGgyNjQsIEdQdHJBcnJheSAqIHNwc19hcnJheSwKKyAgICBHUHRyQXJyYXkgKiBwcHNfYXJyYXksIEdzdEJ1ZmZlciAqIG5hbCkKK3sKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1Y2hhciB0eXBlOworICBndWludCBpOworCisgIGdzdF9idWZmZXJfbWFwIChuYWwsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgdHlwZSA9IG1hcC5kYXRhWzBdICYgMHgxZjsKKworICBpZiAodHlwZSA9PSA3KSB7CisgICAgZ3VpbnQzMiBzcHNfaWQ7CisKKyAgICBpZiAoIXBhcnNlX3NwcyAoJm1hcCwgJnNwc19pZCkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwaDI2NCwgIkludmFsaWQgU1BTLCIKKyAgICAgICAgICAiIGNhbid0IHBhcnNlIHNlcV9wYXJhbWV0ZXJfc2V0X2lkIik7CisgICAgICBnb3RvIGRyb3A7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHNwc19hcnJheS0+bGVuOyBpKyspIHsKKyAgICAgIEdzdEJ1ZmZlciAqc3BzID0gZ19wdHJfYXJyYXlfaW5kZXggKHNwc19hcnJheSwgaSk7CisgICAgICBHc3RNYXBJbmZvIHNwc21hcDsKKyAgICAgIGd1aW50MzIgdG1wX3Nwc19pZDsKKworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKHNwcywgJnNwc21hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgIHBhcnNlX3NwcyAoJnNwc21hcCwgJnRtcF9zcHNfaWQpOworCisgICAgICBpZiAoc3BzX2lkID09IHRtcF9zcHNfaWQpIHsKKyAgICAgICAgaWYgKG1hcC5zaXplID09IHNwc21hcC5zaXplICYmCisgICAgICAgICAgICBtZW1jbXAgKG1hcC5kYXRhLCBzcHNtYXAuZGF0YSwgc3BzbWFwLnNpemUpID09IDApIHsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2NCwgIlVuY2hhbmdlZCBTUFMgJXUsIG5vdCB1cGRhdGluZyIsIHNwc19pZCk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoc3BzLCAmc3BzbWFwKTsKKyAgICAgICAgICBnb3RvIGRyb3A7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoc3BzLCAmc3BzbWFwKTsKKyAgICAgICAgICBnX3B0cl9hcnJheV9yZW1vdmVfaW5kZXhfZmFzdCAoc3BzX2FycmF5LCBpKTsKKyAgICAgICAgICBnX3B0cl9hcnJheV9hZGQgKHNwc19hcnJheSwgbmFsKTsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2NCwgIk1vZGlmaWVkIFNQUyAldSwgcmVwbGFjaW5nIiwgc3BzX2lkKTsKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKHNwcywgJnNwc21hcCk7CisgICAgfQorICAgIEdTVF9MT0dfT0JKRUNUIChydHBoMjY0LCAiQWRkaW5nIG5ldyBTUFMgJXUiLCBzcHNfaWQpOworICAgIGdfcHRyX2FycmF5X2FkZCAoc3BzX2FycmF5LCBuYWwpOworICB9IGVsc2UgaWYgKHR5cGUgPT0gOCkgeworICAgIGd1aW50MzIgc3BzX2lkOworICAgIGd1aW50MzIgcHBzX2lkOworCisgICAgaWYgKCFwYXJzZV9wcHMgKCZtYXAsICZzcHNfaWQsICZwcHNfaWQpKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cGgyNjQsICJJbnZhbGlkIFBQUywiCisgICAgICAgICAgIiBjYW4ndCBwYXJzZSBzZXFfcGFyYW1ldGVyX3NldF9pZCBvciBwaWNfcGFyYW1ldGVyX3NldF9pZCIpOworICAgICAgZ290byBkcm9wOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBwcHNfYXJyYXktPmxlbjsgaSsrKSB7CisgICAgICBHc3RCdWZmZXIgKnBwcyA9IGdfcHRyX2FycmF5X2luZGV4IChwcHNfYXJyYXksIGkpOworICAgICAgR3N0TWFwSW5mbyBwcHNtYXA7CisgICAgICBndWludDMyIHRtcF9zcHNfaWQ7CisgICAgICBndWludDMyIHRtcF9wcHNfaWQ7CisKKworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKHBwcywgJnBwc21hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgIHBhcnNlX3BwcyAoJnBwc21hcCwgJnRtcF9zcHNfaWQsICZ0bXBfcHBzX2lkKTsKKworICAgICAgaWYgKHBwc19pZCA9PSB0bXBfcHBzX2lkKSB7CisgICAgICAgIGlmIChtYXAuc2l6ZSA9PSBwcHNtYXAuc2l6ZSAmJgorICAgICAgICAgICAgbWVtY21wIChtYXAuZGF0YSwgcHBzbWFwLmRhdGEsIHBwc21hcC5zaXplKSA9PSAwKSB7CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGgyNjQsICJVbmNoYW5nZWQgUFBTICV1OiV1LCBub3QgdXBkYXRpbmciLCBzcHNfaWQsCisgICAgICAgICAgICAgIHBwc19pZCk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAocHBzLCAmcHBzbWFwKTsKKyAgICAgICAgICBnb3RvIGRyb3A7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAocHBzLCAmcHBzbWFwKTsKKyAgICAgICAgICBnX3B0cl9hcnJheV9yZW1vdmVfaW5kZXhfZmFzdCAocHBzX2FycmF5LCBpKTsKKyAgICAgICAgICBnX3B0cl9hcnJheV9hZGQgKHBwc19hcnJheSwgbmFsKTsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2NCwgIk1vZGlmaWVkIFBQUyAldToldSwgcmVwbGFjaW5nIiwKKyAgICAgICAgICAgICAgc3BzX2lkLCBwcHNfaWQpOworICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAocHBzLCAmcHBzbWFwKTsKKyAgICB9CisgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGgyNjQsICJBZGRpbmcgbmV3IFBQUyAldTolaSIsIHNwc19pZCwgcHBzX2lkKTsKKyAgICBnX3B0cl9hcnJheV9hZGQgKHBwc19hcnJheSwgbmFsKTsKKyAgfSBlbHNlIHsKKyAgICBnb3RvIGRyb3A7CisgIH0KKworZG9uZToKKyAgZ3N0X2J1ZmZlcl91bm1hcCAobmFsLCAmbWFwKTsKKworICByZXR1cm4gVFJVRTsKKworZHJvcDoKKyAgZ3N0X2J1ZmZlcl91bm1hcCAobmFsLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAobmFsKTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NF9kZXBheV9hZGRfc3BzX3BwcyAoR3N0UnRwSDI2NERlcGF5ICogcnRwaDI2NGRlcGF5LCBHc3RCdWZmZXIgKiBuYWwpCit7CisgIGlmIChnc3RfcnRwX2gyNjRfYWRkX3Nwc19wcHMgKEdTVF9FTEVNRU5UIChydHBoMjY0ZGVwYXkpLAorICAgICAgICAgIHJ0cGgyNjRkZXBheS0+c3BzLCBydHBoMjY0ZGVwYXktPnBwcywgbmFsKSkKKyAgICBydHBoMjY0ZGVwYXktPm5ld19jb2RlY19kYXRhID0gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2gyNjRfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgR3N0UnRwSDI2NERlcGF5ICpydHBoMjY0ZGVwYXk7CisgIGNvbnN0IGdjaGFyICpwczsKKyAgR3N0QnVmZmVyICpjb2RlY19kYXRhOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ4ICpwdHI7CisKKyAgcnRwaDI2NGRlcGF5ID0gR1NUX1JUUF9IMjY0X0RFUEFZIChkZXBheWxvYWQpOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSA5MDAwMDsKKyAgZGVwYXlsb2FkLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICAvKiBCYXNlNjQgZW5jb2RlZCwgY29tbWEgc2VwYXJhdGVkIGNvbmZpZyBOQUxzICovCisgIHBzID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJzcHJvcC1wYXJhbWV0ZXItc2V0cyIpOworCisgIC8qIG5lZ290aWF0ZSB3aXRoIGRvd25zdHJlYW0gdy5yLnQuIG91dHB1dCBmb3JtYXQgYW5kIGFsaWdubWVudCAqLworICBnc3RfcnRwX2gyNjRfZGVwYXlfbmVnb3RpYXRlIChydHBoMjY0ZGVwYXkpOworCisgIGlmIChydHBoMjY0ZGVwYXktPmJ5dGVfc3RyZWFtICYmIHBzICE9IE5VTEwpIHsKKyAgICAvKiBmb3IgYnl0ZXN0cmVhbSB3ZSBvbmx5IG5lZWQgdGhlIHBhcmFtZXRlciBzZXRzIGJ1dCB3ZSBkb24ndCBlcnJvciBvdXQKKyAgICAgKiB3aGVuIHRoZXkgYXJlIG5vdCB0aGVyZSwgd2UgYXNzdW1lIHRoZXkgYXJlIGluIHRoZSBzdHJlYW0uICovCisgICAgZ2NoYXIgKipwYXJhbXM7CisgICAgZ3VpbnQgbGVuLCB0b3RhbDsKKyAgICBnaW50IGk7CisKKyAgICBwYXJhbXMgPSBnX3N0cnNwbGl0IChwcywgIiwiLCAwKTsKKworICAgIC8qIGNvdW50IHRvdGFsIG51bWJlciBvZiBieXRlcyBpbiBiYXNlNjQuIEFsc28gaW5jbHVkZSB0aGUgc3luYyBieXRlcyBpbgorICAgICAqIGZyb250IG9mIHRoZSBwYXJhbXMuICovCisgICAgbGVuID0gMDsKKyAgICBmb3IgKGkgPSAwOyBwYXJhbXNbaV07IGkrKykgeworICAgICAgbGVuICs9IHN0cmxlbiAocGFyYW1zW2ldKTsKKyAgICAgIGxlbiArPSBzaXplb2YgKHN5bmNfYnl0ZXMpOworICAgIH0KKyAgICAvKiB3ZSBzZXJpb3VzbHkgb3ZlcnNob290IHRoZSBsZW5ndGgsIGJ1dCBpdCdzIGZpbmUuICovCisgICAgY29kZWNfZGF0YSA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobGVuKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChjb2RlY19kYXRhLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICBwdHIgPSBtYXAuZGF0YTsKKyAgICB0b3RhbCA9IDA7CisgICAgZm9yIChpID0gMDsgcGFyYW1zW2ldOyBpKyspIHsKKyAgICAgIGd1aW50IHNhdmUgPSAwOworICAgICAgZ2ludCBzdGF0ZSA9IDA7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgImRlY29kaW5nIHBhcmFtICVkICglcykiLCBpLCBwYXJhbXNbaV0pOworICAgICAgbWVtY3B5IChwdHIsIHN5bmNfYnl0ZXMsIHNpemVvZiAoc3luY19ieXRlcykpOworICAgICAgcHRyICs9IHNpemVvZiAoc3luY19ieXRlcyk7CisgICAgICBsZW4gPQorICAgICAgICAgIGdfYmFzZTY0X2RlY29kZV9zdGVwIChwYXJhbXNbaV0sIHN0cmxlbiAocGFyYW1zW2ldKSwgcHRyLCAmc3RhdGUsCisgICAgICAgICAgJnNhdmUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAiZGVjb2RlZCAlZCBieXRlcyIsIGxlbik7CisgICAgICB0b3RhbCArPSBsZW4gKyBzaXplb2YgKHN5bmNfYnl0ZXMpOworICAgICAgcHRyICs9IGxlbjsKKyAgICB9CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoY29kZWNfZGF0YSwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl9yZXNpemUgKGNvZGVjX2RhdGEsIDAsIHRvdGFsKTsKKyAgICBnX3N0cmZyZWV2IChwYXJhbXMpOworCisgICAgLyoga2VlcCB0aGUgY29kZWNfZGF0YSwgd2UgbmVlZCB0byBzZW5kIGl0IGFzIHRoZSBmaXJzdCBidWZmZXIuIFdlIGNhbm5vdAorICAgICAqIHB1c2ggaXQgaW4gdGhlIGFkYXB0ZXIgYmVjYXVzZSB0aGUgYWRhcHRlciBtaWdodCBiZSBmbHVzaGVkIG9uIGRpc2NvbnQuCisgICAgICovCisgICAgaWYgKHJ0cGgyNjRkZXBheS0+Y29kZWNfZGF0YSkKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHJ0cGgyNjRkZXBheS0+Y29kZWNfZGF0YSk7CisgICAgcnRwaDI2NGRlcGF5LT5jb2RlY19kYXRhID0gY29kZWNfZGF0YTsKKyAgfSBlbHNlIGlmICghcnRwaDI2NGRlcGF5LT5ieXRlX3N0cmVhbSkgeworICAgIGdjaGFyICoqcGFyYW1zOworICAgIGdpbnQgaTsKKworICAgIGlmIChwcyA9PSBOVUxMKQorICAgICAgZ290byBpbmNvbXBsZXRlX2NhcHM7CisKKyAgICBwYXJhbXMgPSBnX3N0cnNwbGl0IChwcywgIiwiLCAwKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgIndlIGhhdmUgJWQgcGFyYW1zIiwgZ19zdHJ2X2xlbmd0aCAocGFyYW1zKSk7CisKKyAgICAvKiBzdGFydCB3aXRoIDcgYnl0ZXMgaGVhZGVyICovCisgICAgZm9yIChpID0gMDsgcGFyYW1zW2ldOyBpKyspIHsKKyAgICAgIEdzdEJ1ZmZlciAqbmFsOworICAgICAgR3N0TWFwSW5mbyBuYWxtYXA7CisgICAgICBnc2l6ZSBuYWxfbGVuOworICAgICAgZ3VpbnQgc2F2ZSA9IDA7CisgICAgICBnaW50IHN0YXRlID0gMDsKKworICAgICAgbmFsX2xlbiA9IHN0cmxlbiAocGFyYW1zW2ldKTsKKyAgICAgIGlmIChuYWxfbGVuID09IDApIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZXBheWxvYWQsICJlbXB0eSBwYXJhbSAnJXMnICgjJWQpIiwgcGFyYW1zW2ldLCBpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBuYWwgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG5hbF9sZW4pOworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKG5hbCwgJm5hbG1hcCwgR1NUX01BUF9SRUFEV1JJVEUpOworCisgICAgICBuYWxfbGVuID0KKyAgICAgICAgICBnX2Jhc2U2NF9kZWNvZGVfc3RlcCAocGFyYW1zW2ldLCBuYWxfbGVuLCBuYWxtYXAuZGF0YSwgJnN0YXRlLCAmc2F2ZSk7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgImFkZGluZyBwYXJhbSAlZCBhcyAlcyIsIGksCisgICAgICAgICAgKChuYWxtYXAuZGF0YVswXSAmIDB4MWYpID09IDcpID8gIlNQUyIgOiAiUFBTIik7CisKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKG5hbCwgJm5hbG1hcCk7CisgICAgICBnc3RfYnVmZmVyX3NldF9zaXplIChuYWwsIG5hbF9sZW4pOworCisgICAgICBnc3RfcnRwX2gyNjRfZGVwYXlfYWRkX3Nwc19wcHMgKHJ0cGgyNjRkZXBheSwgbmFsKTsKKyAgICB9CisgICAgZ19zdHJmcmVldiAocGFyYW1zKTsKKworICAgIGlmIChydHBoMjY0ZGVwYXktPnNwcy0+bGVuID09IDAgfHwgcnRwaDI2NGRlcGF5LT5wcHMtPmxlbiA9PSAwKQorICAgICAgZ290byBpbmNvbXBsZXRlX2NhcHM7CisgIH0KKworICByZXR1cm4gZ3N0X3J0cF9oMjY0X3NldF9zcmNfY2FwcyAocnRwaDI2NGRlcGF5KTsKKworICAvKiBFUlJPUlMgKi8KK2luY29tcGxldGVfY2FwczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgIndlIGhhdmUgaW5jb21wbGV0ZSBjYXBzLCIKKyAgICAgICAgIiBkb2luZyBzZXRjYXBzIGxhdGVyIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX2gyNjRfZGVwYXlfYWxsb2NhdGVfb3V0cHV0X2J1ZmZlciAoR3N0UnRwSDI2NERlcGF5ICogZGVwYXksIGdzaXplIHNpemUpCit7CisgIEdzdEJ1ZmZlciAqYnVmZmVyID0gTlVMTDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc2l6ZSA+IDAsIE5VTEwpOworCisgIEdTVF9MT0dfT0JKRUNUIChkZXBheSwgIndhbnQgb3V0cHV0IGJ1ZmZlciBvZiAldSBieXRlcyIsIChndWludCkgc2l6ZSk7CisKKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKGRlcGF5LT5hbGxvY2F0b3IsIHNpemUsICZkZXBheS0+cGFyYW1zKTsKKyAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgR1NUX0lORk9fT0JKRUNUIChkZXBheSwgImNvdWxkbid0IGFsbG9jYXRlIG91dHB1dCBidWZmZXIiKTsKKyAgICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgc2l6ZSwgTlVMTCk7CisgIH0KKworICByZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfaDI2NF9jb21wbGV0ZV9hdSAoR3N0UnRwSDI2NERlcGF5ICogcnRwaDI2NGRlcGF5LAorICAgIEdzdENsb2NrVGltZSAqIG91dF90aW1lc3RhbXAsIGdib29sZWFuICogb3V0X2tleWZyYW1lKQoreworICBHc3RCdWZmZXJMaXN0ICpsaXN0OworICBHc3RNYXBJbmZvIG91dG1hcDsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIGd1aW50IG91dHNpemUsIG9mZnNldCA9IDA7CisgIGdpbnQgYiwgbl9idWZzLCBtLCBuX21lbTsKKworICAvKiB3ZSBoYWQgYSBwaWN0dXJlIGluIHRoZSBhZGFwdGVyIGFuZCB3ZSBjb21wbGV0ZWQgaXQgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NGRlcGF5LCAidGFraW5nIGNvbXBsZXRlZCBBVSIpOworICBvdXRzaXplID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBoMjY0ZGVwYXktPnBpY3R1cmVfYWRhcHRlcik7CisKKyAgb3V0YnVmID0gZ3N0X3J0cF9oMjY0X2RlcGF5X2FsbG9jYXRlX291dHB1dF9idWZmZXIgKHJ0cGgyNjRkZXBheSwgb3V0c2l6ZSk7CisKKyAgaWYgKG91dGJ1ZiA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZiwgJm91dG1hcCwgR1NUX01BUF9XUklURSkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbGlzdCA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyX2xpc3QgKHJ0cGgyNjRkZXBheS0+cGljdHVyZV9hZGFwdGVyLCBvdXRzaXplKTsKKworICBuX2J1ZnMgPSBnc3RfYnVmZmVyX2xpc3RfbGVuZ3RoIChsaXN0KTsKKyAgZm9yIChiID0gMDsgYiA8IG5fYnVmczsgKytiKSB7CisgICAgR3N0QnVmZmVyICpidWYgPSBnc3RfYnVmZmVyX2xpc3RfZ2V0IChsaXN0LCBiKTsKKworICAgIG5fbWVtID0gZ3N0X2J1ZmZlcl9uX21lbW9yeSAoYnVmKTsKKyAgICBmb3IgKG0gPSAwOyBtIDwgbl9tZW07ICsrbSkgeworICAgICAgR3N0TWVtb3J5ICptZW0gPSBnc3RfYnVmZmVyX3BlZWtfbWVtb3J5IChidWYsIG0pOworICAgICAgZ3NpemUgbWVtX3NpemUgPSBnc3RfbWVtb3J5X2dldF9zaXplcyAobWVtLCBOVUxMLCBOVUxMKTsKKyAgICAgIEdzdE1hcEluZm8gbWVtX21hcDsKKworICAgICAgaWYgKGdzdF9tZW1vcnlfbWFwIChtZW0sICZtZW1fbWFwLCBHU1RfTUFQX1JFQUQpKSB7CisgICAgICAgIG1lbWNweSAob3V0bWFwLmRhdGEgKyBvZmZzZXQsIG1lbV9tYXAuZGF0YSwgbWVtX3NpemUpOworICAgICAgICBnc3RfbWVtb3J5X3VubWFwIChtZW0sICZtZW1fbWFwKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1lbXNldCAob3V0bWFwLmRhdGEgKyBvZmZzZXQsIDAsIG1lbV9zaXplKTsKKyAgICAgIH0KKyAgICAgIG9mZnNldCArPSBtZW1fc2l6ZTsKKyAgICB9CisKKyAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwaDI2NGRlcGF5LCBvdXRidWYsIGJ1Zik7CisgIH0KKyAgZ3N0X2J1ZmZlcl9saXN0X3VucmVmIChsaXN0KTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmb3V0bWFwKTsKKworICAqb3V0X3RpbWVzdGFtcCA9IHJ0cGgyNjRkZXBheS0+bGFzdF90czsKKyAgKm91dF9rZXlmcmFtZSA9IHJ0cGgyNjRkZXBheS0+bGFzdF9rZXlmcmFtZTsKKworICBydHBoMjY0ZGVwYXktPmxhc3Rfa2V5ZnJhbWUgPSBGQUxTRTsKKyAgcnRwaDI2NGRlcGF5LT5waWN0dXJlX3N0YXJ0ID0gRkFMU0U7CisKKyAgcmV0dXJuIG91dGJ1ZjsKK30KKworLyogU1BTL1BQUy9JRFIgY29uc2lkZXJlZCBrZXksIGFsbCBvdGhlcnMgREVMVEE7CisgKiBzbyBkb3duc3RyZWFtIHdhaXRpbmcgZm9yIGtleWZyYW1lIGNhbiBwaWNrIHVwIGF0IFNQUy9QUFMvSURSICovCisjZGVmaW5lIE5BTF9UWVBFX0lTX0tFWShudCkgKCgobnQpID09IDUpIHx8ICgobnQpID09IDcpIHx8ICgobnQpID09IDgpKQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY0X2RlcGF5X2hhbmRsZV9uYWwgKEdzdFJ0cEgyNjREZXBheSAqIHJ0cGgyNjRkZXBheSwgR3N0QnVmZmVyICogbmFsLAorICAgIEdzdENsb2NrVGltZSBpbl90aW1lc3RhbXAsIGdib29sZWFuIG1hcmtlcikKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCAqZGVwYXlsb2FkID0gR1NUX1JUUF9CQVNFX0RFUEFZTE9BRCAocnRwaDI2NGRlcGF5KTsKKyAgZ2ludCBuYWxfdHlwZTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdEJ1ZmZlciAqb3V0YnVmID0gTlVMTDsKKyAgR3N0Q2xvY2tUaW1lIG91dF90aW1lc3RhbXA7CisgIGdib29sZWFuIGtleWZyYW1lLCBvdXRfa2V5ZnJhbWU7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG5hbCwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgaWYgKEdfVU5MSUtFTFkgKG1hcC5zaXplIDwgNSkpCisgICAgZ290byBzaG9ydF9uYWw7CisKKyAgbmFsX3R5cGUgPSBtYXAuZGF0YVs0XSAmIDB4MWY7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRkZXBheSwgImhhbmRsZSBOQUwgdHlwZSAlZCIsIG5hbF90eXBlKTsKKworICBrZXlmcmFtZSA9IE5BTF9UWVBFX0lTX0tFWSAobmFsX3R5cGUpOworCisgIG91dF9rZXlmcmFtZSA9IGtleWZyYW1lOworICBvdXRfdGltZXN0YW1wID0gaW5fdGltZXN0YW1wOworCisgIGlmICghcnRwaDI2NGRlcGF5LT5ieXRlX3N0cmVhbSkgeworICAgIGlmIChuYWxfdHlwZSA9PSA3IHx8IG5hbF90eXBlID09IDgpIHsKKyAgICAgIGdzdF9ydHBfaDI2NF9kZXBheV9hZGRfc3BzX3BwcyAocnRwaDI2NGRlcGF5LAorICAgICAgICAgIGdzdF9idWZmZXJfY29weV9yZWdpb24gKG5hbCwgR1NUX0JVRkZFUl9DT1BZX0FMTCwKKyAgICAgICAgICAgICAgNCwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAobmFsKSAtIDQpKTsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKG5hbCwgJm1hcCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChuYWwpOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAocnRwaDI2NGRlcGF5LT5zcHMtPmxlbiA9PSAwIHx8IHJ0cGgyNjRkZXBheS0+cHBzLT5sZW4gPT0gMCkgeworICAgICAgLyogRG93biBwdXNoIGRvd24gYW55IGJ1ZmZlciBpbiBub24tYnl0ZXN0cmVhbSBtb2RlIGlmIHRoZSBTUFMvUFBTIGhhdmVuJ3QKKyAgICAgICAqIGdvIHRocm91Z2ggeWV0CisgICAgICAgKi8KKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TSU5LUEFEIChkZXBheWxvYWQpLAorICAgICAgICAgIGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNLAorICAgICAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoIkdzdEZvcmNlS2V5VW5pdCIsCisgICAgICAgICAgICAgICAgICAiYWxsLWhlYWRlcnMiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCkpKTsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKG5hbCwgJm1hcCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChuYWwpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChydHBoMjY0ZGVwYXktPm5ld19jb2RlY19kYXRhICYmCisgICAgICAgIHJ0cGgyNjRkZXBheS0+c3BzLT5sZW4gPiAwICYmIHJ0cGgyNjRkZXBheS0+cHBzLT5sZW4gPiAwKQorICAgICAgZ3N0X3J0cF9oMjY0X3NldF9zcmNfY2FwcyAocnRwaDI2NGRlcGF5KTsKKyAgfQorCisKKyAgaWYgKHJ0cGgyNjRkZXBheS0+bWVyZ2UpIHsKKyAgICBnYm9vbGVhbiBzdGFydCA9IEZBTFNFLCBjb21wbGV0ZSA9IEZBTFNFOworCisgICAgLyogbWFya2VyIGJpdCBpc24ndCBtYW5kYXRvcnkgc28gaW4gdGhlIGZvbGxvd2luZyBjb2RlIHdlIHRyeSB0byBndWVzcworICAgICAqIGFuIEFVIGJvdW5kYXJ5IGJ5IGRldGVjdGluZyBhIG5ldyBwaWN0dXJlIHN0YXJ0ICovCisgICAgaWYgKCFtYXJrZXIpIHsKKyAgICAgIC8qIGNvbnNpZGVyIGEgY29kZWQgc2xpY2VzIChJRFIgb3Igbm90KSB0byBzdGFydCBhIHBpY3R1cmUsCisgICAgICAgKiAoc28gZW5kaW5nIHRoZSBwcmV2aW91cyBvbmUpIGlmIGZpcnN0X21iX2luX3NsaWNlID09IDAKKyAgICAgICAqIChub24tMCBpcyBwYXJ0IG9mIHByZXZpb3VzIG9uZSkgKi8KKyAgICAgIC8qIE5PVEUgdGhpcyBpcyBub3QgZW50aXJlbHkgYWNjb3JkaW5nIHRvIEFjY2VzcyBVbml0IHNwZWNzIGluIDcuNC4xLjIuNCwKKyAgICAgICAqIGJ1dCBpbiBwcmFjdGljZSBpdCB3b3JrcyBpbiBzYW5lIGNhc2VzLCBuZWVkcyBub3QgbXVjaCBwYXJzaW5nLAorICAgICAgICogYW5kIGFsc28gd29ya3Mgd2l0aCBicm9rZW4gZnJhbWVfbnVtIGluIE5BTCAod2hlcmUgc3BlYy13aXNlIHdvdWxkIGZhaWwpICovCisgICAgICAvKiBGSVhNRTogdGhpcyBjb2RlIGlzbid0IGNvcnJlY3QgZm9yIGludGVybGFjZWQgY29udGVudCBhcyBBVXMgc2hvdWxkIGJlCisgICAgICAgKiBjb25zdHJ1Y3RlZCB3aXRoIHBhaXJzIG9mIGZpZWxkcyBhbmQgdGhlIGd1ZXNzIGhlcmUgd2lsbCBqdXN0IHB1c2ggb3V0CisgICAgICAgKiBBVXMgd2l0aCBhIHNpbmdsZSBmaWVsZCBpbiBpdCAqLworICAgICAgaWYgKG5hbF90eXBlID09IDEgfHwgbmFsX3R5cGUgPT0gMiB8fCBuYWxfdHlwZSA9PSA1KSB7CisgICAgICAgIC8qIHdlIGhhdmUgYSBwaWN0dXJlIHN0YXJ0ICovCisgICAgICAgIHN0YXJ0ID0gVFJVRTsKKyAgICAgICAgaWYgKG1hcC5kYXRhWzVdICYgMHg4MCkgeworICAgICAgICAgIC8qIGZpcnN0X21iX2luX3NsaWNlID09IDAgY29tcGxldGVzIGEgcGljdHVyZSAqLworICAgICAgICAgIGNvbXBsZXRlID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChuYWxfdHlwZSA+PSA2ICYmIG5hbF90eXBlIDw9IDkpIHsKKyAgICAgICAgLyogU0VJLCBTUFMsIFBQUywgQVUgdGVybWluYXRlIHBpY3R1cmUgKi8KKyAgICAgICAgY29tcGxldGUgPSBUUlVFOworICAgICAgfQorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAic3RhcnQgJWQsIGNvbXBsZXRlICVkIiwgc3RhcnQsIGNvbXBsZXRlKTsKKworICAgICAgaWYgKGNvbXBsZXRlICYmIHJ0cGgyNjRkZXBheS0+cGljdHVyZV9zdGFydCkKKyAgICAgICAgb3V0YnVmID0gZ3N0X3J0cF9oMjY0X2NvbXBsZXRlX2F1IChydHBoMjY0ZGVwYXksICZvdXRfdGltZXN0YW1wLAorICAgICAgICAgICAgJm91dF9rZXlmcmFtZSk7CisgICAgfQorICAgIC8qIGFkZCB0byBhZGFwdGVyICovCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAobmFsLCAmbWFwKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgImFkZGluZyBOQUwgdG8gcGljdHVyZSBhZGFwdGVyIik7CisgICAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRwaDI2NGRlcGF5LT5waWN0dXJlX2FkYXB0ZXIsIG5hbCk7CisgICAgcnRwaDI2NGRlcGF5LT5sYXN0X3RzID0gaW5fdGltZXN0YW1wOworICAgIHJ0cGgyNjRkZXBheS0+bGFzdF9rZXlmcmFtZSB8PSBrZXlmcmFtZTsKKyAgICBydHBoMjY0ZGVwYXktPnBpY3R1cmVfc3RhcnQgfD0gc3RhcnQ7CisKKyAgICBpZiAobWFya2VyKQorICAgICAgb3V0YnVmID0gZ3N0X3J0cF9oMjY0X2NvbXBsZXRlX2F1IChydHBoMjY0ZGVwYXksICZvdXRfdGltZXN0YW1wLAorICAgICAgICAgICZvdXRfa2V5ZnJhbWUpOworICB9IGVsc2UgeworICAgIC8qIG5vIG1lcmdlLCBvdXRwdXQgaXMgaW5wdXQgbmFsICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAidXNpbmcgTkFMIGFzIG91dHB1dCIpOworICAgIG91dGJ1ZiA9IG5hbDsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChuYWwsICZtYXApOworICB9CisKKyAgaWYgKG91dGJ1ZikgeworICAgIC8qIHByZXBlbmQgY29kZWNfZGF0YSAqLworICAgIGlmIChydHBoMjY0ZGVwYXktPmNvZGVjX2RhdGEpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgInByZXBlbmRpbmcgY29kZWNfZGF0YSIpOworICAgICAgZ3N0X3J0cF9jb3B5X3ZpZGVvX21ldGEgKHJ0cGgyNjRkZXBheSwgcnRwaDI2NGRlcGF5LT5jb2RlY19kYXRhLCBvdXRidWYpOworICAgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKHJ0cGgyNjRkZXBheS0+Y29kZWNfZGF0YSwgb3V0YnVmKTsKKyAgICAgIHJ0cGgyNjRkZXBheS0+Y29kZWNfZGF0YSA9IE5VTEw7CisgICAgICBvdXRfa2V5ZnJhbWUgPSBUUlVFOworICAgIH0KKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKG91dGJ1Zik7CisKKyAgICBnc3RfcnRwX2Ryb3Bfbm9uX3ZpZGVvX21ldGEgKHJ0cGgyNjRkZXBheSwgb3V0YnVmKTsKKworICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gb3V0X3RpbWVzdGFtcDsKKworICAgIGlmIChvdXRfa2V5ZnJhbWUpCisgICAgICBHU1RfQlVGRkVSX0ZMQUdfVU5TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworICAgIGVsc2UKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgICAgZ3N0X3J0cF9iYXNlX2RlcGF5bG9hZF9wdXNoIChkZXBheWxvYWQsIG91dGJ1Zik7CisgIH0KKworICByZXR1cm47CisKKyAgLyogRVJST1JTICovCitzaG9ydF9uYWw6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5bG9hZCwgImRyb3BwaW5nIHNob3J0IE5BTCIpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKG5hbCwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAobmFsKTsKKyAgICByZXR1cm47CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NF9maW5pc2hfZnJhZ21lbnRhdGlvbl91bml0IChHc3RSdHBIMjY0RGVwYXkgKiBydHBoMjY0ZGVwYXkpCit7CisgIGd1aW50IG91dHNpemU7CisgIEdzdE1hcEluZm8gbWFwOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKworICBvdXRzaXplID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBoMjY0ZGVwYXktPmFkYXB0ZXIpOworICBvdXRidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRwaDI2NGRlcGF5LT5hZGFwdGVyLCBvdXRzaXplKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NGRlcGF5LCAib3V0cHV0ICVkIGJ5dGVzIiwgb3V0c2l6ZSk7CisKKyAgaWYgKHJ0cGgyNjRkZXBheS0+Ynl0ZV9zdHJlYW0pIHsKKyAgICBtZW1jcHkgKG1hcC5kYXRhLCBzeW5jX2J5dGVzLCBzaXplb2YgKHN5bmNfYnl0ZXMpKTsKKyAgfSBlbHNlIHsKKyAgICBvdXRzaXplIC09IDQ7CisgICAgbWFwLmRhdGFbMF0gPSAob3V0c2l6ZSA+PiAyNCk7CisgICAgbWFwLmRhdGFbMV0gPSAob3V0c2l6ZSA+PiAxNik7CisgICAgbWFwLmRhdGFbMl0gPSAob3V0c2l6ZSA+PiA4KTsKKyAgICBtYXAuZGF0YVszXSA9IChvdXRzaXplKTsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWYsICZtYXApOworCisgIHJ0cGgyNjRkZXBheS0+Y3VycmVudF9mdV90eXBlID0gMDsKKworICBnc3RfcnRwX2gyNjRfZGVwYXlfaGFuZGxlX25hbCAocnRwaDI2NGRlcGF5LCBvdXRidWYsCisgICAgICBydHBoMjY0ZGVwYXktPmZ1X3RpbWVzdGFtcCwgcnRwaDI2NGRlcGF5LT5mdV9tYXJrZXIpOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfaDI2NF9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cEgyNjREZXBheSAqcnRwaDI2NGRlcGF5OworICBHc3RCdWZmZXIgKm91dGJ1ZiA9IE5VTEw7CisgIGd1aW50OCBuYWxfdW5pdF90eXBlOworCisgIHJ0cGgyNjRkZXBheSA9IEdTVF9SVFBfSDI2NF9ERVBBWSAoZGVwYXlsb2FkKTsKKworICAvKiBmbHVzaCByZW1haW5pbmcgZGF0YSBvbiBkaXNjb250ICovCisgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKHJ0cC0+YnVmZmVyKSkgeworICAgIGdzdF9hZGFwdGVyX2NsZWFyIChydHBoMjY0ZGVwYXktPmFkYXB0ZXIpOworICAgIHJ0cGgyNjRkZXBheS0+d2FpdF9zdGFydCA9IFRSVUU7CisgICAgcnRwaDI2NGRlcGF5LT5jdXJyZW50X2Z1X3R5cGUgPSAwOworICB9CisKKyAgeworICAgIGdpbnQgcGF5bG9hZF9sZW47CisgICAgZ3VpbnQ4ICpwYXlsb2FkOworICAgIGd1aW50IGhlYWRlcl9sZW47CisgICAgZ3VpbnQ4IG5hbF9yZWZfaWRjOworICAgIEdzdE1hcEluZm8gbWFwOworICAgIGd1aW50IG91dHNpemUsIG5hbHVfc2l6ZTsKKyAgICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworICAgIGdib29sZWFuIG1hcmtlcjsKKworICAgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChydHAtPmJ1ZmZlcik7CisKKyAgICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAocnRwKTsKKyAgICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisgICAgbWFya2VyID0gZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAocnRwKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRkZXBheSwgInJlY2VpdmluZyAlZCBieXRlcyIsIHBheWxvYWRfbGVuKTsKKworICAgIGlmIChwYXlsb2FkX2xlbiA9PSAwKQorICAgICAgZ290byBlbXB0eV9wYWNrZXQ7CisKKyAgICAvKiArLS0tLS0tLS0tLS0tLS0tKworICAgICAqIHwwfDF8MnwzfDR8NXw2fDd8CisgICAgICogKy0rLSstKy0rLSstKy0rLSsKKyAgICAgKiB8RnxOUkl8ICBUeXBlICAgfAorICAgICAqICstLS0tLS0tLS0tLS0tLS0rCisgICAgICoKKyAgICAgKiBGIG11c3QgYmUgMC4KKyAgICAgKi8KKyAgICBuYWxfcmVmX2lkYyA9IChwYXlsb2FkWzBdICYgMHg2MCkgPj4gNTsKKyAgICBuYWxfdW5pdF90eXBlID0gcGF5bG9hZFswXSAmIDB4MWY7CisKKyAgICAvKiBhdCBsZWFzdCBvbmUgYnl0ZSBoZWFkZXIgd2l0aCB0eXBlICovCisgICAgaGVhZGVyX2xlbiA9IDE7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0ZGVwYXksICJOUkkgJWQsIFR5cGUgJWQiLCBuYWxfcmVmX2lkYywKKyAgICAgICAgbmFsX3VuaXRfdHlwZSk7CisKKyAgICAvKiBJZiBGVSB1bml0IHdhcyBiZWluZyBwcm9jZXNzZWQsIGJ1dCB0aGUgY3VycmVudCBuYWwgaXMgb2YgYSBkaWZmZXJlbnQKKyAgICAgKiB0eXBlLiAgQXNzdW1lIHRoYXQgdGhlIHJlbW90ZSBwYXlsb2FkZXIgaXMgYnVnZ3kgKGRpZG4ndCBzZXQgdGhlIGVuZCBiaXQKKyAgICAgKiB3aGVuIHRoZSBGVSBlbmRlZCkgYW5kIHNlbmQgb3V0IHdoYXQgd2UgZ2F0aGVyZWQgdGh1c2ZhciAqLworICAgIGlmIChHX1VOTElLRUxZIChydHBoMjY0ZGVwYXktPmN1cnJlbnRfZnVfdHlwZSAhPSAwICYmCisgICAgICAgICAgICBuYWxfdW5pdF90eXBlICE9IHJ0cGgyNjRkZXBheS0+Y3VycmVudF9mdV90eXBlKSkKKyAgICAgIGdzdF9ydHBfaDI2NF9maW5pc2hfZnJhZ21lbnRhdGlvbl91bml0IChydHBoMjY0ZGVwYXkpOworCisgICAgc3dpdGNoIChuYWxfdW5pdF90eXBlKSB7CisgICAgICBjYXNlIDA6CisgICAgICBjYXNlIDMwOgorICAgICAgY2FzZSAzMToKKyAgICAgICAgLyogdW5kZWZpbmVkICovCisgICAgICAgIGdvdG8gdW5kZWZpbmVkX3R5cGU7CisgICAgICBjYXNlIDI1OgorICAgICAgICAvKiBTVEFQLUIgICAgU2luZ2xlLXRpbWUgYWdncmVnYXRpb24gcGFja2V0ICAgICA1LjcuMSAqLworICAgICAgICAvKiAyIGJ5dGUgZXh0cmEgaGVhZGVyIGZvciBET04gKi8KKyAgICAgICAgaGVhZGVyX2xlbiArPSAyOworICAgICAgICAvKiBmYWxsdGhyb3VnaCAqLworICAgICAgY2FzZSAyNDoKKyAgICAgIHsKKyAgICAgICAgLyogc3RyaXAgaGVhZGVycyAqLworICAgICAgICBwYXlsb2FkICs9IGhlYWRlcl9sZW47CisgICAgICAgIHBheWxvYWRfbGVuIC09IGhlYWRlcl9sZW47CisKKyAgICAgICAgcnRwaDI2NGRlcGF5LT53YWl0X3N0YXJ0ID0gRkFMU0U7CisKKworICAgICAgICAvKiBTVEFQLUEgICAgU2luZ2xlLXRpbWUgYWdncmVnYXRpb24gcGFja2V0ICAgICA1LjcuMSAqLworICAgICAgICB3aGlsZSAocGF5bG9hZF9sZW4gPiAyKSB7CisgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgMQorICAgICAgICAgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1CisgICAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICogfCAgICAgICAgIE5BTFUgU2l6ZSAgICAgICAgICAgICB8CisgICAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICovCisgICAgICAgICAgbmFsdV9zaXplID0gKHBheWxvYWRbMF0gPDwgOCkgfCBwYXlsb2FkWzFdOworCisgICAgICAgICAgLyogZG9udCBpbmNsdWRlIG5hbHVfc2l6ZSAqLworICAgICAgICAgIGlmIChuYWx1X3NpemUgPiAocGF5bG9hZF9sZW4gLSAyKSkKKyAgICAgICAgICAgIG5hbHVfc2l6ZSA9IHBheWxvYWRfbGVuIC0gMjsKKworICAgICAgICAgIG91dHNpemUgPSBuYWx1X3NpemUgKyBzaXplb2YgKHN5bmNfYnl0ZXMpOworICAgICAgICAgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAob3V0c2l6ZSk7CisKKyAgICAgICAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICAgICAgICBpZiAocnRwaDI2NGRlcGF5LT5ieXRlX3N0cmVhbSkgeworICAgICAgICAgICAgbWVtY3B5IChtYXAuZGF0YSwgc3luY19ieXRlcywgc2l6ZW9mIChzeW5jX2J5dGVzKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1hcC5kYXRhWzBdID0gbWFwLmRhdGFbMV0gPSAwOworICAgICAgICAgICAgbWFwLmRhdGFbMl0gPSBwYXlsb2FkWzBdOworICAgICAgICAgICAgbWFwLmRhdGFbM10gPSBwYXlsb2FkWzFdOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIHN0cmlwIE5BTFUgc2l6ZSAqLworICAgICAgICAgIHBheWxvYWQgKz0gMjsKKyAgICAgICAgICBwYXlsb2FkX2xlbiAtPSAyOworCisgICAgICAgICAgbWVtY3B5IChtYXAuZGF0YSArIHNpemVvZiAoc3luY19ieXRlcyksIHBheWxvYWQsIG5hbHVfc2l6ZSk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICAgICAgICAgIGdzdF9ydHBfY29weV92aWRlb19tZXRhIChydHBoMjY0ZGVwYXksIG91dGJ1ZiwgcnRwLT5idWZmZXIpOworCisgICAgICAgICAgZ3N0X3J0cF9oMjY0X2RlcGF5X2hhbmRsZV9uYWwgKHJ0cGgyNjRkZXBheSwgb3V0YnVmLCB0aW1lc3RhbXAsCisgICAgICAgICAgICAgIG1hcmtlcik7CisKKyAgICAgICAgICBwYXlsb2FkICs9IG5hbHVfc2l6ZTsKKyAgICAgICAgICBwYXlsb2FkX2xlbiAtPSBuYWx1X3NpemU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDI2OgorICAgICAgICAvKiBNVEFQMTYgICAgTXVsdGktdGltZSBhZ2dyZWdhdGlvbiBwYWNrZXQgICAgICA1LjcuMiAqLworICAgICAgICAvLyBoZWFkZXJfbGVuID0gNTsKKyAgICAgICAgLyogZmFsbHRocm91Z2gsIG5vdCBpbXBsZW1lbnRlZCAqLworICAgICAgY2FzZSAyNzoKKyAgICAgICAgLyogTVRBUDI0ICAgIE11bHRpLXRpbWUgYWdncmVnYXRpb24gcGFja2V0ICAgICAgNS43LjIgKi8KKyAgICAgICAgLy8gaGVhZGVyX2xlbiA9IDY7CisgICAgICAgIGdvdG8gbm90X2ltcGxlbWVudGVkOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjg6CisgICAgICBjYXNlIDI5OgorICAgICAgeworICAgICAgICAvKiBGVS1BICAgICAgRnJhZ21lbnRhdGlvbiB1bml0ICAgICAgICAgICAgICAgICA1LjggKi8KKyAgICAgICAgLyogRlUtQiAgICAgIEZyYWdtZW50YXRpb24gdW5pdCAgICAgICAgICAgICAgICAgNS44ICovCisgICAgICAgIGdib29sZWFuIFMsIEU7CisKKyAgICAgICAgLyogKy0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICogfDB8MXwyfDN8NHw1fDZ8N3wKKyAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICogfFN8RXxSfCAgVHlwZSAgIHwKKyAgICAgICAgICogKy0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICoKKyAgICAgICAgICogUiBpcyByZXNlcnZlZCBhbmQgYWx3YXlzIDAKKyAgICAgICAgICovCisgICAgICAgIFMgPSAocGF5bG9hZFsxXSAmIDB4ODApID09IDB4ODA7CisgICAgICAgIEUgPSAocGF5bG9hZFsxXSAmIDB4NDApID09IDB4NDA7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NGRlcGF5LCAiUyAlZCwgRSAlZCIsIFMsIEUpOworCisgICAgICAgIGlmIChydHBoMjY0ZGVwYXktPndhaXRfc3RhcnQgJiYgIVMpCisgICAgICAgICAgZ290byB3YWl0aW5nX3N0YXJ0OworCisgICAgICAgIGlmIChTKSB7CisgICAgICAgICAgLyogTkFMIHVuaXQgc3RhcnRzIGhlcmUgKi8KKyAgICAgICAgICBndWludDggbmFsX2hlYWRlcjsKKworICAgICAgICAgIC8qIElmIGEgbmV3IEZVIHVuaXQgc3RhcnRlZCwgd2hpbGUgc3RpbGwgcHJvY2Vzc2luZyBhbiBvbGRlciBvbmUuCisgICAgICAgICAgICogQXNzdW1lIHRoYXQgdGhlIHJlbW90ZSBwYXlsb2FkZXIgaXMgYnVnZ3kgKGRvZXNuJ3Qgc2V0IHRoZSBlbmQKKyAgICAgICAgICAgKiBiaXQpIGFuZCBzZW5kIG91dCB3aGF0IHdlJ3ZlIGdhdGhlcmVkIHRodXNmYXIgKi8KKyAgICAgICAgICBpZiAoR19VTkxJS0VMWSAocnRwaDI2NGRlcGF5LT5jdXJyZW50X2Z1X3R5cGUgIT0gMCkpCisgICAgICAgICAgICBnc3RfcnRwX2gyNjRfZmluaXNoX2ZyYWdtZW50YXRpb25fdW5pdCAocnRwaDI2NGRlcGF5KTsKKworICAgICAgICAgIHJ0cGgyNjRkZXBheS0+Y3VycmVudF9mdV90eXBlID0gbmFsX3VuaXRfdHlwZTsKKyAgICAgICAgICBydHBoMjY0ZGVwYXktPmZ1X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKworICAgICAgICAgIHJ0cGgyNjRkZXBheS0+d2FpdF9zdGFydCA9IEZBTFNFOworCisgICAgICAgICAgLyogcmVjb25zdHJ1Y3QgTkFMIGhlYWRlciAqLworICAgICAgICAgIG5hbF9oZWFkZXIgPSAocGF5bG9hZFswXSAmIDB4ZTApIHwgKHBheWxvYWRbMV0gJiAweDFmKTsKKworICAgICAgICAgIC8qIHN0cmlwIHR5cGUgaGVhZGVyLCBrZWVwIEZVIGhlYWRlciwgd2UnbGwgcmV1c2UgaXQgdG8gcmVjb25zdHJ1Y3QKKyAgICAgICAgICAgKiB0aGUgTkFMIGhlYWRlci4gKi8KKyAgICAgICAgICBwYXlsb2FkICs9IDE7CisgICAgICAgICAgcGF5bG9hZF9sZW4gLT0gMTsKKworICAgICAgICAgIG5hbHVfc2l6ZSA9IHBheWxvYWRfbGVuOworICAgICAgICAgIG91dHNpemUgPSBuYWx1X3NpemUgKyBzaXplb2YgKHN5bmNfYnl0ZXMpOworICAgICAgICAgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAob3V0c2l6ZSk7CisKKyAgICAgICAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICAgICAgICBtZW1jcHkgKG1hcC5kYXRhICsgc2l6ZW9mIChzeW5jX2J5dGVzKSwgcGF5bG9hZCwgbmFsdV9zaXplKTsKKyAgICAgICAgICBtYXAuZGF0YVtzaXplb2YgKHN5bmNfYnl0ZXMpXSA9IG5hbF9oZWFkZXI7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICAgICAgICAgIGdzdF9ydHBfY29weV92aWRlb19tZXRhIChydHBoMjY0ZGVwYXksIG91dGJ1ZiwgcnRwLT5idWZmZXIpOworCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NGRlcGF5LCAicXVldWVpbmcgJWQgYnl0ZXMiLCBvdXRzaXplKTsKKworICAgICAgICAgIC8qIGFuZCBhc3NlbWJsZSBpbiB0aGUgYWRhcHRlciAqLworICAgICAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGgyNjRkZXBheS0+YWRhcHRlciwgb3V0YnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBzdHJpcCBvZmYgRlUgaW5kaWNhdG9yIGFuZCBGVSBoZWFkZXIgYnl0ZXMgKi8KKyAgICAgICAgICBwYXlsb2FkICs9IDI7CisgICAgICAgICAgcGF5bG9hZF9sZW4gLT0gMjsKKworICAgICAgICAgIG91dHNpemUgPSBwYXlsb2FkX2xlbjsKKyAgICAgICAgICBvdXRidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG91dHNpemUpOworICAgICAgICAgIGdzdF9idWZmZXJfZmlsbCAob3V0YnVmLCAwLCBwYXlsb2FkLCBvdXRzaXplKTsKKworICAgICAgICAgIGdzdF9ydHBfY29weV92aWRlb19tZXRhIChydHBoMjY0ZGVwYXksIG91dGJ1ZiwgcnRwLT5idWZmZXIpOworCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NGRlcGF5LCAicXVldWVpbmcgJWQgYnl0ZXMiLCBvdXRzaXplKTsKKworICAgICAgICAgIC8qIGFuZCBhc3NlbWJsZSBpbiB0aGUgYWRhcHRlciAqLworICAgICAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGgyNjRkZXBheS0+YWRhcHRlciwgb3V0YnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dGJ1ZiA9IE5VTEw7CisgICAgICAgIHJ0cGgyNjRkZXBheS0+ZnVfbWFya2VyID0gbWFya2VyOworCisgICAgICAgIC8qIGlmIE5BTCB1bml0IGVuZHMsIGZsdXNoIHRoZSBhZGFwdGVyICovCisgICAgICAgIGlmIChFKQorICAgICAgICAgIGdzdF9ydHBfaDI2NF9maW5pc2hfZnJhZ21lbnRhdGlvbl91bml0IChydHBoMjY0ZGVwYXkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICB7CisgICAgICAgIHJ0cGgyNjRkZXBheS0+d2FpdF9zdGFydCA9IEZBTFNFOworCisgICAgICAgIC8qIDEtMjMgICBOQUwgdW5pdCAgU2luZ2xlIE5BTCB1bml0IHBhY2tldCBwZXIgSC4yNjQgICA1LjYgKi8KKyAgICAgICAgLyogdGhlIGVudGlyZSBwYXlsb2FkIGlzIHRoZSBvdXRwdXQgYnVmZmVyICovCisgICAgICAgIG5hbHVfc2l6ZSA9IHBheWxvYWRfbGVuOworICAgICAgICBvdXRzaXplID0gbmFsdV9zaXplICsgc2l6ZW9mIChzeW5jX2J5dGVzKTsKKyAgICAgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChvdXRzaXplKTsKKworICAgICAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICAgICAgaWYgKHJ0cGgyNjRkZXBheS0+Ynl0ZV9zdHJlYW0pIHsKKyAgICAgICAgICBtZW1jcHkgKG1hcC5kYXRhLCBzeW5jX2J5dGVzLCBzaXplb2YgKHN5bmNfYnl0ZXMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtYXAuZGF0YVswXSA9IG1hcC5kYXRhWzFdID0gMDsKKyAgICAgICAgICBtYXAuZGF0YVsyXSA9IG5hbHVfc2l6ZSA+PiA4OworICAgICAgICAgIG1hcC5kYXRhWzNdID0gbmFsdV9zaXplICYgMHhmZjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkgKG1hcC5kYXRhICsgc2l6ZW9mIChzeW5jX2J5dGVzKSwgcGF5bG9hZCwgbmFsdV9zaXplKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICAgICAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwaDI2NGRlcGF5LCBvdXRidWYsIHJ0cC0+YnVmZmVyKTsKKworICAgICAgICBnc3RfcnRwX2gyNjRfZGVwYXlfaGFuZGxlX25hbCAocnRwaDI2NGRlcGF5LCBvdXRidWYsIHRpbWVzdGFtcCwgbWFya2VyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIE5VTEw7CisKKyAgLyogRVJST1JTICovCitlbXB0eV9wYWNrZXQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0ZGVwYXksICJlbXB0eSBwYWNrZXQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQordW5kZWZpbmVkX3R5cGU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBoMjY0ZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiVW5kZWZpbmVkIHBhY2tldCB0eXBlIikpOworICAgIHJldHVybiBOVUxMOworICB9Cit3YWl0aW5nX3N0YXJ0OgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NGRlcGF5LCAid2FpdGluZyBmb3Igc3RhcnQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorbm90X2ltcGxlbWVudGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHJ0cGgyNjRkZXBheSwgU1RSRUFNLCBGT1JNQVQsCisgICAgICAgIChOVUxMKSwgKCJOQUwgdW5pdCB0eXBlICVkIG5vdCBzdXBwb3J0ZWQgeWV0IiwgbmFsX3VuaXRfdHlwZSkpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9oMjY0X2RlcGF5X2hhbmRsZV9ldmVudCAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBIMjY0RGVwYXkgKnJ0cGgyNjRkZXBheTsKKworICBydHBoMjY0ZGVwYXkgPSBHU1RfUlRQX0gyNjRfREVQQVkgKGRlcGF5KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ3N0X3J0cF9oMjY0X2RlcGF5X3Jlc2V0IChydHBoMjY0ZGVwYXksIEZBTFNFKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybgorICAgICAgR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9DTEFTUyAocGFyZW50X2NsYXNzKS0+aGFuZGxlX2V2ZW50IChkZXBheSwgZXZlbnQpOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfaDI2NF9kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cEgyNjREZXBheSAqcnRwaDI2NGRlcGF5OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRwaDI2NGRlcGF5ID0gR1NUX1JUUF9IMjY0X0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfcnRwX2gyNjRfZGVwYXlfcmVzZXQgKHJ0cGgyNjRkZXBheSwgVFJVRSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3J0cF9oMjY0X2RlcGF5X3Jlc2V0IChydHBoMjY0ZGVwYXksIFRSVUUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2NF9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwaDI2NGRlcGF5X2RlYnVnLCAicnRwaDI2NGRlcGF5IiwgMCwKKyAgICAgICJIMjY0IFZpZGVvIFJUUCBEZXBheWxvYWRlciIpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwaDI2NGRlcGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX0gyNjRfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0MTMxMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmgKQEAgLTAsMCArMSw4OSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0gyNjRfREVQQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9IMjY0X0RFUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9IMjY0X0RFUEFZIFwKKyAgKGdzdF9ydHBfaDI2NF9kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0gyNjRfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfSDI2NF9ERVBBWSxHc3RSdHBIMjY0RGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX0gyNjRfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0gyNjRfREVQQVksR3N0UnRwSDI2NERlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0gyNjRfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfSDI2NF9ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfSDI2NF9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSDI2NF9ERVBBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBIMjY0RGVwYXkgR3N0UnRwSDI2NERlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjREZXBheUNsYXNzIEdzdFJ0cEgyNjREZXBheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cEgyNjREZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKKworICBnYm9vbGVhbiAgICBieXRlX3N0cmVhbTsKKworICBHc3RCdWZmZXIgICpjb2RlY19kYXRhOworICBHc3RBZGFwdGVyICphZGFwdGVyOworICBnYm9vbGVhbiAgICB3YWl0X3N0YXJ0OworCisgIC8qIG5hbCBtZXJnaW5nICovCisgIGdib29sZWFuICAgIG1lcmdlOworICBHc3RBZGFwdGVyICpwaWN0dXJlX2FkYXB0ZXI7CisgIGdib29sZWFuICAgIHBpY3R1cmVfc3RhcnQ7CisgIEdzdENsb2NrVGltZSBsYXN0X3RzOworICBnYm9vbGVhbiAgICBsYXN0X2tleWZyYW1lOworCisgIC8qIFdvcmsgYXJvdW5kIGJyb2tlbiBwYXlsb2FkZXJzIHdydC4gRlUtQSAmIEZVLUIgKi8KKyAgZ3VpbnQ4IGN1cnJlbnRfZnVfdHlwZTsKKyAgR3N0Q2xvY2tUaW1lIGZ1X3RpbWVzdGFtcDsKKyAgZ2Jvb2xlYW4gZnVfbWFya2VyOworCisgIC8qIG1pc2MgKi8KKyAgR1B0ckFycmF5ICpzcHM7CisgIEdQdHJBcnJheSAqcHBzOworICBnYm9vbGVhbiBuZXdfY29kZWNfZGF0YTsKKworICAvKiBkb3duc3RyZWFtIGFsbG9jYXRvciAqLworICBHc3RBbGxvY2F0b3IgKmFsbG9jYXRvcjsKKyAgR3N0QWxsb2NhdGlvblBhcmFtcyBwYXJhbXM7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cEgyNjREZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX2gyNjRfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2gyNjRfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK2dib29sZWFuIGdzdF9ydHBfaDI2NF9hZGRfc3BzX3BwcyAoR3N0RWxlbWVudCAqIHJ0cGgyNjQsIEdQdHJBcnJheSAqIHNwcywKKyAgICBHUHRyQXJyYXkgKiBwcHMsIEdzdEJ1ZmZlciAqIG5hbCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfSDI2NF9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwaDI2NHBheS5jIGIvZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNmMDgwYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwaDI2NHBheS5jCkBAIC0wLDAgKzEsMTQyNCBAQAorLyogZXg6IHNldCB0YWJzdG9wPTIgc2hpZnR3aWR0aD0yIGV4cGFuZHRhYjogKi8KKy8qIEdTdHJlYW1lcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9wYnV0aWxzL3BidXRpbHMuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworLyogSW5jbHVkZWQgdG8gbm90IGR1cGxpY2F0ZSBnc3RfcnRwX2gyNjRfYWRkX3Nwc19wcHMgKCkgKi8KKyNpbmNsdWRlICJnc3RydHBoMjY0ZGVwYXkuaCIKKworI2luY2x1ZGUgImdzdHJ0cGgyNjRwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCisKKyNkZWZpbmUgSURSX1RZUEVfSUQgIDUKKyNkZWZpbmUgU1BTX1RZUEVfSUQgIDcKKyNkZWZpbmUgUFBTX1RZUEVfSUQgIDgKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwaDI2NHBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwaDI2NHBheV9kZWJ1ZykKKworLyogcmVmZXJlbmNlczoKKyAqCisgKiBSRkMgMzk4NAorICovCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2gyNjRfcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtaDI2NCwgIgorICAgICAgICAic3RyZWFtLWZvcm1hdCA9IChzdHJpbmcpIGF2YywgYWxpZ25tZW50ID0gKHN0cmluZykgYXU7IgorICAgICAgICAidmlkZW8veC1oMjY0LCAiCisgICAgICAgICJzdHJlYW0tZm9ybWF0ID0gKHN0cmluZykgYnl0ZS1zdHJlYW0sIGFsaWdubWVudCA9IChzdHJpbmcpIHsgbmFsLCBhdSB9IikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9oMjY0X3BheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiSDI2NFwiIikKKyAgICApOworCisjZGVmaW5lIERFRkFVTFRfU1BST1BfUEFSQU1FVEVSX1NFVFMgICAgTlVMTAorI2RlZmluZSBERUZBVUxUX0NPTkZJR19JTlRFUlZBTAkJICAgICAgMAorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9TUFJPUF9QQVJBTUVURVJfU0VUUywKKyAgUFJPUF9DT05GSUdfSU5URVJWQUwKK307CisKKyNkZWZpbmUgSVNfQUNDRVNTX1VOSVQoeCkgKCgoeCkgPiAweDAwKSAmJiAoKHgpIDwgMHgwNikpCisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2NF9wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2gyNjRfcGF5X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2NF9wYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3J0cF9oMjY0X3BheV9nZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0UGFkICogcGFkLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2gyNjRfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9oMjY0X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBhZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfaDI2NF9wYXlfc2lua19ldmVudCAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfaDI2NF9wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworI2RlZmluZSBnc3RfcnRwX2gyNjRfcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cEgyNjRQYXksIGdzdF9ydHBfaDI2NF9wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY0X3BheV9jbGFzc19pbml0IChHc3RSdHBIMjY0UGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX2gyNjRfcGF5X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9oMjY0X3BheV9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIFBST1BfU1BST1BfUEFSQU1FVEVSX1NFVFMsIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJzcHJvcC1wYXJhbWV0ZXItc2V0cyIsCisgICAgICAgICAgInNwcm9wLXBhcmFtZXRlci1zZXRzIiwKKyAgICAgICAgICAiVGhlIGJhc2U2NCBzcHJvcC1wYXJhbWV0ZXItc2V0cyB0byBzZXQgaW4gb3V0IGNhcHMgKHNldCB0byBOVUxMIHRvICIKKyAgICAgICAgICAiZXh0cmFjdCBmcm9tIHN0cmVhbSkiLAorICAgICAgICAgIERFRkFVTFRfU1BST1BfUEFSQU1FVEVSX1NFVFMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR19QQVJBTV9ERVBSRUNBVEVEKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIFBST1BfQ09ORklHX0lOVEVSVkFMLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImNvbmZpZy1pbnRlcnZhbCIsCisgICAgICAgICAgIlNQUyBQUFMgU2VuZCBJbnRlcnZhbCIsCisgICAgICAgICAgIlNlbmQgU1BTIGFuZCBQUFMgSW5zZXJ0aW9uIEludGVydmFsIGluIHNlY29uZHMgKHNwcm9wIHBhcmFtZXRlciBzZXRzICIKKyAgICAgICAgICAid2lsbCBiZSBtdWx0aXBsZXhlZCBpbiB0aGUgZGF0YSBzdHJlYW0gd2hlbiBkZXRlY3RlZC4pICIKKyAgICAgICAgICAiKDAgPSBkaXNhYmxlZCwgLTEgPSBzZW5kIHdpdGggZXZlcnkgSURSIGZyYW1lKSIsCisgICAgICAgICAgLTEsIDM2MDAsIERFRkFVTFRfQ09ORklHX0lOVEVSVkFMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykKKyAgICAgICk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX2gyNjRfcGF5X2ZpbmFsaXplOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfaDI2NF9wYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9oMjY0X3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUlRQIEgyNjQgcGF5bG9hZGVyIiwKKyAgICAgICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBheWxvYWQtZW5jb2RlIEgyNjQgdmlkZW8gaW50byBSVFAgcGFja2V0cyAoUkZDIDM5ODQpIiwKKyAgICAgICJMYXVyZW50IEdsYXlhbCA8c3BnbGVnbGVAeWFob28uZnI+Iik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2gyNjRfcGF5X2NoYW5nZV9zdGF0ZSk7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPmdldF9jYXBzID0gZ3N0X3J0cF9oMjY0X3BheV9nZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2gyNjRfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9oMjY0X3BheV9oYW5kbGVfYnVmZmVyOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2lua19ldmVudCA9IGdzdF9ydHBfaDI2NF9wYXlfc2lua19ldmVudDsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwaDI2NHBheV9kZWJ1ZywgInJ0cGgyNjRwYXkiLCAwLAorICAgICAgIkgyNjQgUlRQIFBheWxvYWRlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY0X3BheV9pbml0IChHc3RSdHBIMjY0UGF5ICogcnRwaDI2NHBheSkKK3sKKyAgcnRwaDI2NHBheS0+cXVldWUgPSBnX2FycmF5X25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKGd1aW50KSk7CisgIHJ0cGgyNjRwYXktPnByb2ZpbGUgPSAwOworICBydHBoMjY0cGF5LT5zcHMgPSBnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKAorICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnc3RfYnVmZmVyX3VucmVmKTsKKyAgcnRwaDI2NHBheS0+cHBzID0gZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jICgKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgIHJ0cGgyNjRwYXktPmxhc3Rfc3BzcHBzID0gLTE7CisgIHJ0cGgyNjRwYXktPnNwc3Bwc19pbnRlcnZhbCA9IERFRkFVTFRfQ09ORklHX0lOVEVSVkFMOworICBydHBoMjY0cGF5LT5kZWx0YV91bml0ID0gRkFMU0U7CisgIHJ0cGgyNjRwYXktPmRpc2NvbnQgPSBGQUxTRTsKKworICBydHBoMjY0cGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY0X3BheV9jbGVhcl9zcHNfcHBzIChHc3RSdHBIMjY0UGF5ICogcnRwaDI2NHBheSkKK3sKKyAgZ19wdHJfYXJyYXlfc2V0X3NpemUgKHJ0cGgyNjRwYXktPnNwcywgMCk7CisgIGdfcHRyX2FycmF5X3NldF9zaXplIChydHBoMjY0cGF5LT5wcHMsIDApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY0X3BheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwSDI2NFBheSAqcnRwaDI2NHBheTsKKworICBydHBoMjY0cGF5ID0gR1NUX1JUUF9IMjY0X1BBWSAob2JqZWN0KTsKKworICBnX2FycmF5X2ZyZWUgKHJ0cGgyNjRwYXktPnF1ZXVlLCBUUlVFKTsKKworICBnX3B0cl9hcnJheV9mcmVlIChydHBoMjY0cGF5LT5zcHMsIFRSVUUpOworICBnX3B0cl9hcnJheV9mcmVlIChydHBoMjY0cGF5LT5wcHMsIFRSVUUpOworCisgIGdfZnJlZSAocnRwaDI2NHBheS0+c3Byb3BfcGFyYW1ldGVyX3NldHMpOworCisgIGdfb2JqZWN0X3VucmVmIChydHBoMjY0cGF5LT5hZGFwdGVyKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciBhbGxfbGV2ZWxzW11bNF0gPSB7CisgICIxIiwKKyAgIjFiIiwKKyAgIjEuMSIsCisgICIxLjIiLAorICAiMS4zIiwKKyAgIjIiLAorICAiMi4xIiwKKyAgIjIuMiIsCisgICIzIiwKKyAgIjMuMSIsCisgICIzLjIiLAorICAiNCIsCisgICI0LjEiLAorICAiNC4yIiwKKyAgIjUiLAorICAiNS4xIgorfTsKKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3J0cF9oMjY0X3BheV9nZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RDYXBzICp0ZW1wbGF0ZV9jYXBzOworICBHc3RDYXBzICphbGxvd2VkX2NhcHM7CisgIEdzdENhcHMgKmNhcHMsICppY2FwczsKKyAgZ2Jvb2xlYW4gYXBwZW5kX3VucmVzdHJpY3RlZDsKKyAgZ3VpbnQgaTsKKworICBhbGxvd2VkX2NhcHMgPQorICAgICAgZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NSQ1BBRCAocGF5bG9hZCksIE5VTEwpOworCisgIGlmIChhbGxvd2VkX2NhcHMgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICB0ZW1wbGF0ZV9jYXBzID0KKyAgICAgIGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldF9jYXBzICgmZ3N0X3J0cF9oMjY0X3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBpZiAoZ3N0X2NhcHNfaXNfYW55IChhbGxvd2VkX2NhcHMpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX3JlZiAodGVtcGxhdGVfY2Fwcyk7CisgICAgZ290byBkb25lOworICB9CisKKyAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChhbGxvd2VkX2NhcHMpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX3JlZiAoYWxsb3dlZF9jYXBzKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIGFwcGVuZF91bnJlc3RyaWN0ZWQgPSBGQUxTRTsKKyAgZm9yIChpID0gMDsgaSA8IGdzdF9jYXBzX2dldF9zaXplIChhbGxvd2VkX2NhcHMpOyBpKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChhbGxvd2VkX2NhcHMsIGkpOworICAgIEdzdFN0cnVjdHVyZSAqbmV3X3MgPSBnc3Rfc3RydWN0dXJlX25ld19lbXB0eSAoInZpZGVvL3gtaDI2NCIpOworICAgIGNvbnN0IGdjaGFyICpwcm9maWxlX2xldmVsX2lkOworCisgICAgcHJvZmlsZV9sZXZlbF9pZCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgInByb2ZpbGUtbGV2ZWwtaWQiKTsKKworICAgIGlmIChwcm9maWxlX2xldmVsX2lkICYmIHN0cmxlbiAocHJvZmlsZV9sZXZlbF9pZCkgPT0gNikgeworICAgICAgY29uc3QgZ2NoYXIgKnByb2ZpbGU7CisgICAgICBjb25zdCBnY2hhciAqbGV2ZWw7CisgICAgICBsb25nIGludCBzcHNpbnQ7CisgICAgICBndWludDggc3BzWzNdOworCisgICAgICBzcHNpbnQgPSBzdHJ0b2wgKHByb2ZpbGVfbGV2ZWxfaWQsIE5VTEwsIDE2KTsKKyAgICAgIHNwc1swXSA9IHNwc2ludCA+PiAxNjsKKyAgICAgIHNwc1sxXSA9IHNwc2ludCA+PiA4OworICAgICAgc3BzWzJdID0gc3BzaW50OworCisgICAgICBwcm9maWxlID0gZ3N0X2NvZGVjX3V0aWxzX2gyNjRfZ2V0X3Byb2ZpbGUgKHNwcywgMyk7CisgICAgICBsZXZlbCA9IGdzdF9jb2RlY191dGlsc19oMjY0X2dldF9sZXZlbCAoc3BzLCAzKTsKKworICAgICAgaWYgKHByb2ZpbGUgJiYgbGV2ZWwpIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBheWxvYWQsICJJbiBjYXBzLCBoYXZlIHByb2ZpbGUgJXMgYW5kIGxldmVsICVzIiwKKyAgICAgICAgICAgIHByb2ZpbGUsIGxldmVsKTsKKworICAgICAgICBpZiAoIXN0cmNtcCAocHJvZmlsZSwgImNvbnN0cmFpbmVkLWJhc2VsaW5lIikpCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG5ld19zLCAicHJvZmlsZSIsIEdfVFlQRV9TVFJJTkcsIHByb2ZpbGUsIE5VTEwpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBHVmFsdWUgdmFsID0geyAwLCB9OworICAgICAgICAgIEdWYWx1ZSBwcm9maWxlcyA9IHsgMCwgfTsKKworICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJnByb2ZpbGVzLCBHU1RfVFlQRV9MSVNUKTsKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZ2YWwsIEdfVFlQRV9TVFJJTkcpOworCisgICAgICAgICAgZ192YWx1ZV9zZXRfc3RhdGljX3N0cmluZyAoJnZhbCwgcHJvZmlsZSk7CisgICAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmcHJvZmlsZXMsICZ2YWwpOworCisgICAgICAgICAgZ192YWx1ZV9zZXRfc3RhdGljX3N0cmluZyAoJnZhbCwgImNvbnN0cmFpbmVkLWJhc2VsaW5lIik7CisgICAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmcHJvZmlsZXMsICZ2YWwpOworCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV90YWtlX3ZhbHVlIChuZXdfcywgInByb2ZpbGUiLCAmcHJvZmlsZXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdHJjbXAgKGxldmVsLCAiMSIpKQorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfcywgImxldmVsIiwgR19UWVBFX1NUUklORywgbGV2ZWwsIE5VTEwpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBHVmFsdWUgbGV2ZWxzID0geyAwLCB9OworICAgICAgICAgIEdWYWx1ZSB2YWwgPSB7IDAsIH07CisgICAgICAgICAgaW50IGo7CisKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZsZXZlbHMsIEdTVF9UWVBFX0xJU1QpOworICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR19UWVBFX1NUUklORyk7CisKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgR19OX0VMRU1FTlRTIChhbGxfbGV2ZWxzKTsgaisrKSB7CisgICAgICAgICAgICBnX3ZhbHVlX3NldF9zdGF0aWNfc3RyaW5nICgmdmFsLCBhbGxfbGV2ZWxzW2pdKTsKKyAgICAgICAgICAgIGdzdF92YWx1ZV9saXN0X3ByZXBlbmRfdmFsdWUgKCZsZXZlbHMsICZ2YWwpOworICAgICAgICAgICAgaWYgKCFzdHJjbXAgKGxldmVsLCBhbGxfbGV2ZWxzW2pdKSkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfdGFrZV92YWx1ZSAobmV3X3MsICJsZXZlbCIsICZsZXZlbHMpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBJbnZhbGlkIHByb2ZpbGUtbGV2ZWwtaWQgbWVhbnMgYmFzZWxpbmUgKi8KKworICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAobmV3X3MsCisgICAgICAgICAgICAicHJvZmlsZSIsIEdfVFlQRV9TVFJJTkcsICJjb25zdHJhaW5lZC1iYXNlbGluZSIsIE5VTEwpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiBObyBwcm9maWxlLWxldmVsLWlkIG1lYW5zIGJhc2VsaW5lIG9yIHVucmVzdHJpY3RlZCAqLworCisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAobmV3X3MsCisgICAgICAgICAgInByb2ZpbGUiLCBHX1RZUEVfU1RSSU5HLCAiY29uc3RyYWluZWQtYmFzZWxpbmUiLCBOVUxMKTsKKyAgICAgIGFwcGVuZF91bnJlc3RyaWN0ZWQgPSBUUlVFOworICAgIH0KKworICAgIGNhcHMgPSBnc3RfY2Fwc19tZXJnZV9zdHJ1Y3R1cmUgKGNhcHMsIG5ld19zKTsKKyAgfQorCisgIGlmIChhcHBlbmRfdW5yZXN0cmljdGVkKSB7CisgICAgY2FwcyA9CisgICAgICAgIGdzdF9jYXBzX21lcmdlX3N0cnVjdHVyZSAoY2FwcywgZ3N0X3N0cnVjdHVyZV9uZXcgKCJ2aWRlby94LWgyNjQiLCBOVUxMLAorICAgICAgICAgICAgTlVMTCkpOworICB9CisKKyAgaWNhcHMgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKGNhcHMsIHRlbXBsYXRlX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGNhcHMgPSBpY2FwczsKKworZG9uZToKKyAgaWYgKGZpbHRlcikgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJJbnRlcnNlY3QgJSIgR1NUX1BUUl9GT1JNQVQgIiBhbmQgZmlsdGVyICUiCisgICAgICAgIEdTVF9QVFJfRk9STUFULCBjYXBzLCBmaWx0ZXIpOworICAgIGljYXBzID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgY2FwcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgY2FwcyA9IGljYXBzOworICB9CisKKyAgZ3N0X2NhcHNfdW5yZWYgKHRlbXBsYXRlX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoYWxsb3dlZF9jYXBzKTsKKworICBHU1RfTE9HX09CSkVDVCAocGF5bG9hZCwgInJldHVybmluZyBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKyAgcmV0dXJuIGNhcHM7Cit9CisKKy8qIHRha2UgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIFNQUyBhbmQgUFBTIGxpc3RzIGFuZCBzZXQgdGhlbSBvbiB0aGUgY2FwcyBhcworICogc3Byb3AtcGFyYW1ldGVyLXNldHMgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9oMjY0X3BheV9zZXRfc3BzX3BwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCkKK3sKKyAgR3N0UnRwSDI2NFBheSAqcGF5bG9hZGVyID0gR1NUX1JUUF9IMjY0X1BBWSAoYmFzZXBheWxvYWQpOworICBnY2hhciAqcHJvZmlsZTsKKyAgZ2NoYXIgKnNldDsKKyAgR1N0cmluZyAqc3Byb3BzOworICBndWludCBjb3VudDsKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQgaTsKKworICBzcHJvcHMgPSBnX3N0cmluZ19uZXcgKCIiKTsKKyAgY291bnQgPSAwOworCisgIC8qIGJ1aWxkIHRoZSBzcHJvcC1wYXJhbWV0ZXItc2V0cyAqLworICBmb3IgKGkgPSAwOyBpIDwgcGF5bG9hZGVyLT5zcHMtPmxlbjsgaSsrKSB7CisgICAgR3N0QnVmZmVyICpzcHNfYnVmID0KKyAgICAgICAgR1NUX0JVRkZFUl9DQVNUIChnX3B0cl9hcnJheV9pbmRleCAocGF5bG9hZGVyLT5zcHMsIGkpKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChzcHNfYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIHNldCA9IGdfYmFzZTY0X2VuY29kZSAobWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChzcHNfYnVmLCAmbWFwKTsKKworICAgIGdfc3RyaW5nX2FwcGVuZF9wcmludGYgKHNwcm9wcywgIiVzJXMiLCBjb3VudCA/ICIsIiA6ICIiLCBzZXQpOworICAgIGdfZnJlZSAoc2V0KTsKKyAgICBjb3VudCsrOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBwYXlsb2FkZXItPnBwcy0+bGVuOyBpKyspIHsKKyAgICBHc3RCdWZmZXIgKnBwc19idWYgPQorICAgICAgICBHU1RfQlVGRkVSX0NBU1QgKGdfcHRyX2FycmF5X2luZGV4IChwYXlsb2FkZXItPnBwcywgaSkpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKHBwc19idWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgc2V0ID0gZ19iYXNlNjRfZW5jb2RlIChtYXAuZGF0YSwgbWFwLnNpemUpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKHBwc19idWYsICZtYXApOworCisgICAgZ19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoc3Byb3BzLCAiJXMlcyIsIGNvdW50ID8gIiwiIDogIiIsIHNldCk7CisgICAgZ19mcmVlIChzZXQpOworICAgIGNvdW50Kys7CisgIH0KKworICBpZiAoR19MSUtFTFkgKGNvdW50KSkgeworICAgIGlmIChwYXlsb2FkZXItPnByb2ZpbGUgIT0gMCkgeworICAgICAgLyogcHJvZmlsZSBpcyAyNCBiaXQuIEZvcmNlIGl0IHRvIHJlc3BlY3QgdGhlIGxpbWl0ICovCisgICAgICBwcm9maWxlID0gZ19zdHJkdXBfcHJpbnRmICgiJTA2eCIsIHBheWxvYWRlci0+cHJvZmlsZSAmIDB4ZmZmZmZmKTsKKyAgICAgIC8qIGNvbWJpbmUgaW50byBvdXRwdXQgY2FwcyAqLworICAgICAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLAorICAgICAgICAgICJwYWNrZXRpemF0aW9uLW1vZGUiLCBHX1RZUEVfU1RSSU5HLCAiMSIsCisgICAgICAgICAgInByb2ZpbGUtbGV2ZWwtaWQiLCBHX1RZUEVfU1RSSU5HLCBwcm9maWxlLAorICAgICAgICAgICJzcHJvcC1wYXJhbWV0ZXItc2V0cyIsIEdfVFlQRV9TVFJJTkcsIHNwcm9wcy0+c3RyLCBOVUxMKTsKKyAgICAgIGdfZnJlZSAocHJvZmlsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChiYXNlcGF5bG9hZCwKKyAgICAgICAgICAicGFja2V0aXphdGlvbi1tb2RlIiwgR19UWVBFX1NUUklORywgIjEiLAorICAgICAgICAgICJzcHJvcC1wYXJhbWV0ZXItc2V0cyIsIEdfVFlQRV9TVFJJTkcsIHNwcm9wcy0+c3RyLCBOVUxMKTsKKyAgICB9CisKKyAgfSBlbHNlIHsKKyAgICByZXMgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAoYmFzZXBheWxvYWQsIE5VTEwpOworICB9CisgIGdfc3RyaW5nX2ZyZWUgKHNwcm9wcywgVFJVRSk7CisKKyAgcmV0dXJuIHJlczsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2NF9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFJ0cEgyNjRQYXkgKnJ0cGgyNjRwYXk7CisgIEdzdFN0cnVjdHVyZSAqc3RyOworICBjb25zdCBHVmFsdWUgKnZhbHVlOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ4ICpkYXRhOworICBnc2l6ZSBzaXplOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgY29uc3QgZ2NoYXIgKmFsaWdubWVudCwgKnN0cmVhbV9mb3JtYXQ7CisKKyAgcnRwaDI2NHBheSA9IEdTVF9SVFBfSDI2NF9QQVkgKGJhc2VwYXlsb2FkKTsKKworICBzdHIgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICAvKiB3ZSBjYW4gb25seSBzZXQgdGhlIG91dHB1dCBjYXBzIHdoZW4gd2UgZm91bmQgdGhlIHNwcm9wcyBhbmQgcHJvZmlsZQorICAgKiBOQUxzICovCisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChiYXNlcGF5bG9hZCwgInZpZGVvIiwgVFJVRSwgIkgyNjQiLCA5MDAwMCk7CisKKyAgcnRwaDI2NHBheS0+YWxpZ25tZW50ID0gR1NUX0gyNjRfQUxJR05NRU5UX1VOS05PV047CisgIGFsaWdubWVudCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RyLCAiYWxpZ25tZW50Iik7CisgIGlmIChhbGlnbm1lbnQpIHsKKyAgICBpZiAoZ19zdHJfZXF1YWwgKGFsaWdubWVudCwgImF1IikpCisgICAgICBydHBoMjY0cGF5LT5hbGlnbm1lbnQgPSBHU1RfSDI2NF9BTElHTk1FTlRfQVU7CisgICAgaWYgKGdfc3RyX2VxdWFsIChhbGlnbm1lbnQsICJuYWwiKSkKKyAgICAgIHJ0cGgyNjRwYXktPmFsaWdubWVudCA9IEdTVF9IMjY0X0FMSUdOTUVOVF9OQUw7CisgIH0KKworICBydHBoMjY0cGF5LT5zdHJlYW1fZm9ybWF0ID0gR1NUX0gyNjRfU1RSRUFNX0ZPUk1BVF9VTktOT1dOOworICBzdHJlYW1fZm9ybWF0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHIsICJzdHJlYW0tZm9ybWF0Iik7CisgIGlmIChzdHJlYW1fZm9ybWF0KSB7CisgICAgaWYgKGdfc3RyX2VxdWFsIChzdHJlYW1fZm9ybWF0LCAiYXZjIikpCisgICAgICBydHBoMjY0cGF5LT5zdHJlYW1fZm9ybWF0ID0gR1NUX0gyNjRfU1RSRUFNX0ZPUk1BVF9BVkM7CisgICAgaWYgKGdfc3RyX2VxdWFsIChzdHJlYW1fZm9ybWF0LCAiYnl0ZS1zdHJlYW0iKSkKKyAgICAgIHJ0cGgyNjRwYXktPnN0cmVhbV9mb3JtYXQgPSBHU1RfSDI2NF9TVFJFQU1fRk9STUFUX0JZVEVTVFJFQU07CisgIH0KKworICAvKiBwYWNrZXRpemVkIEFWQyB2aWRlbyBoYXMgYSBjb2RlY19kYXRhICovCisgIGlmICgodmFsdWUgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RyLCAiY29kZWNfZGF0YSIpKSkgeworICAgIGd1aW50IG51bV9zcHMsIG51bV9wcHM7CisgICAgZ2ludCBpLCBuYWxfc2l6ZTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRwYXksICJoYXZlIHBhY2tldGl6ZWQgaDI2NCIpOworCisgICAgYnVmZmVyID0gZ3N0X3ZhbHVlX2dldF9idWZmZXIgKHZhbHVlKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgZGF0YSA9IG1hcC5kYXRhOworICAgIHNpemUgPSBtYXAuc2l6ZTsKKworICAgIC8qIHBhcnNlIHRoZSBhdmNDIGRhdGEgKi8KKyAgICBpZiAoc2l6ZSA8IDcpCisgICAgICBnb3RvIGF2Y2NfdG9vX3NtYWxsOworICAgIC8qIHBhcnNlIHRoZSB2ZXJzaW9uLCB0aGlzIG11c3QgYmUgMSAqLworICAgIGlmIChkYXRhWzBdICE9IDEpCisgICAgICBnb3RvIHdyb25nX3ZlcnNpb247CisKKyAgICAvKiBBVkNQcm9maWxlSW5kaWNhdGlvbiAqLworICAgIC8qIHByb2ZpbGVfY29tcGF0ICovCisgICAgLyogQVZDTGV2ZWxJbmRpY2F0aW9uICovCisgICAgcnRwaDI2NHBheS0+cHJvZmlsZSA9IChkYXRhWzFdIDw8IDE2KSB8IChkYXRhWzJdIDw8IDgpIHwgZGF0YVszXTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0cGF5LCAicHJvZmlsZSAlMDZ4IiwgcnRwaDI2NHBheS0+cHJvZmlsZSk7CisKKyAgICAvKiA2IGJpdHMgcmVzZXJ2ZWQgfCAyIGJpdHMgbGVuZ3RoU2l6ZU1pbnVzT25lICovCisgICAgLyogdGhpcyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGZyb250IG9mIHRoZSBOQUwgdW5pdHMgdG8gbWFyayB0aGVpcgorICAgICAqIGxlbmd0aCAqLworICAgIHJ0cGgyNjRwYXktPm5hbF9sZW5ndGhfc2l6ZSA9IChkYXRhWzRdICYgMHgwMykgKyAxOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRwYXksICJuYWwgbGVuZ3RoICV1IiwgcnRwaDI2NHBheS0+bmFsX2xlbmd0aF9zaXplKTsKKyAgICAvKiAzIGJpdHMgcmVzZXJ2ZWQgfCA1IGJpdHMgbnVtT2ZTZXF1ZW5jZVBhcmFtZXRlclNldHMgKi8KKyAgICBudW1fc3BzID0gZGF0YVs1XSAmIDB4MWY7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NHBheSwgIm51bSBTUFMgJXUiLCBudW1fc3BzKTsKKworICAgIGRhdGEgKz0gNjsKKyAgICBzaXplIC09IDY7CisKKyAgICAvKiBjcmVhdGUgdGhlIHNwcm9wLXBhcmFtZXRlci1zZXRzICovCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9zcHM7IGkrKykgeworICAgICAgR3N0QnVmZmVyICpzcHNfYnVmOworCisgICAgICBpZiAoc2l6ZSA8IDIpCisgICAgICAgIGdvdG8gYXZjY19lcnJvcjsKKworICAgICAgbmFsX3NpemUgPSAoZGF0YVswXSA8PCA4KSB8IGRhdGFbMV07CisgICAgICBkYXRhICs9IDI7CisgICAgICBzaXplIC09IDI7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBoMjY0cGF5LCAiU1BTICVkIHNpemUgJWQiLCBpLCBuYWxfc2l6ZSk7CisKKyAgICAgIGlmIChzaXplIDwgbmFsX3NpemUpCisgICAgICAgIGdvdG8gYXZjY19lcnJvcjsKKworICAgICAgLyogbWFrZSBhIGJ1ZmZlciBvdXQgb2YgaXQgYW5kIGFkZCB0byBTUFMgbGlzdCAqLworICAgICAgc3BzX2J1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobmFsX3NpemUpOworICAgICAgZ3N0X2J1ZmZlcl9maWxsIChzcHNfYnVmLCAwLCBkYXRhLCBuYWxfc2l6ZSk7CisgICAgICBnc3RfcnRwX2gyNjRfYWRkX3Nwc19wcHMgKEdTVF9FTEVNRU5UIChydHBoMjY0cGF5KSwgcnRwaDI2NHBheS0+c3BzLAorICAgICAgICAgIHJ0cGgyNjRwYXktPnBwcywgc3BzX2J1Zik7CisgICAgICBkYXRhICs9IG5hbF9zaXplOworICAgICAgc2l6ZSAtPSBuYWxfc2l6ZTsKKyAgICB9CisgICAgaWYgKHNpemUgPCAxKQorICAgICAgZ290byBhdmNjX2Vycm9yOworCisgICAgLyogOCBiaXRzIG51bU9mUGljdHVyZVBhcmFtZXRlclNldHMgKi8KKyAgICBudW1fcHBzID0gZGF0YVswXTsKKyAgICBkYXRhICs9IDE7CisgICAgc2l6ZSAtPSAxOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NHBheSwgIm51bSBQUFMgJXUiLCBudW1fcHBzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BwczsgaSsrKSB7CisgICAgICBHc3RCdWZmZXIgKnBwc19idWY7CisKKyAgICAgIGlmIChzaXplIDwgMikKKyAgICAgICAgZ290byBhdmNjX2Vycm9yOworCisgICAgICBuYWxfc2l6ZSA9IChkYXRhWzBdIDw8IDgpIHwgZGF0YVsxXTsKKyAgICAgIGRhdGEgKz0gMjsKKyAgICAgIHNpemUgLT0gMjsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGgyNjRwYXksICJQUFMgJWQgc2l6ZSAlZCIsIGksIG5hbF9zaXplKTsKKworICAgICAgaWYgKHNpemUgPCBuYWxfc2l6ZSkKKyAgICAgICAgZ290byBhdmNjX2Vycm9yOworCisgICAgICAvKiBtYWtlIGEgYnVmZmVyIG91dCBvZiBpdCBhbmQgYWRkIHRvIFBQUyBsaXN0ICovCisgICAgICBwcHNfYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChuYWxfc2l6ZSk7CisgICAgICBnc3RfYnVmZmVyX2ZpbGwgKHBwc19idWYsIDAsIGRhdGEsIG5hbF9zaXplKTsKKyAgICAgIGdzdF9ydHBfaDI2NF9hZGRfc3BzX3BwcyAoR1NUX0VMRU1FTlQgKHJ0cGgyNjRwYXkpLCBydHBoMjY0cGF5LT5zcHMsCisgICAgICAgICAgcnRwaDI2NHBheS0+cHBzLCBwcHNfYnVmKTsKKworICAgICAgZGF0YSArPSBuYWxfc2l6ZTsKKyAgICAgIHNpemUgLT0gbmFsX3NpemU7CisgICAgfQorCisgICAgLyogYW5kIHVwZGF0ZSB0aGUgY2FwcyB3aXRoIHRoZSBjb2xsZWN0ZWQgZGF0YSAqLworICAgIGlmICghZ3N0X3J0cF9oMjY0X3BheV9zZXRfc3BzX3BwcyAoYmFzZXBheWxvYWQpKQorICAgICAgZ290byBzZXRfc3BzX3Bwc19mYWlsZWQ7CisKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRwYXksICJoYXZlIGJ5dGVzdHJlYW0gaDI2NCIpOworICB9CisKKyAgcmV0dXJuIFRSVUU7CisKK2F2Y2NfdG9vX3NtYWxsOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwaDI2NHBheSwgImF2Y0Mgc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCAiIDwgNyIsIHNpemUpOworICAgIGdvdG8gZXJyb3I7CisgIH0KK3dyb25nX3ZlcnNpb246CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChydHBoMjY0cGF5LCAid3JvbmcgYXZjQyB2ZXJzaW9uIik7CisgICAgZ290byBlcnJvcjsKKyAgfQorYXZjY19lcnJvcjoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGgyNjRwYXksICJhdmNDIHRvbyBzbWFsbCAiKTsKKyAgICBnb3RvIGVycm9yOworICB9CitzZXRfc3BzX3Bwc19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChydHBoMjY0cGF5LCAiZmFpbGVkIHRvIHNldCBzcHMvcHBzIik7CisgICAgZ290byBlcnJvcjsKKyAgfQorZXJyb3I6CisgIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY0X3BheV9wYXJzZV9zcHJvcF9wYXJhbWV0ZXJfc2V0cyAoR3N0UnRwSDI2NFBheSAqIHJ0cGgyNjRwYXkpCit7CisgIGNvbnN0IGdjaGFyICpwczsKKyAgZ2NoYXIgKipwYXJhbXM7CisgIGd1aW50IGxlbjsKKyAgZ2ludCBpOworICBHc3RCdWZmZXIgKmJ1ZjsKKworICBwcyA9IHJ0cGgyNjRwYXktPnNwcm9wX3BhcmFtZXRlcl9zZXRzOworICBpZiAocHMgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgZ3N0X3J0cF9oMjY0X3BheV9jbGVhcl9zcHNfcHBzIChydHBoMjY0cGF5KTsKKworICBwYXJhbXMgPSBnX3N0cnNwbGl0IChwcywgIiwiLCAwKTsKKyAgbGVuID0gZ19zdHJ2X2xlbmd0aCAocGFyYW1zKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0cGF5LCAid2UgaGF2ZSAlZCBwYXJhbXMiLCBsZW4pOworCisgIGZvciAoaSA9IDA7IHBhcmFtc1tpXTsgaSsrKSB7CisgICAgZ3NpemUgbmFsX2xlbjsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBndWludDggKm5hbHA7CisgICAgZ3VpbnQgc2F2ZSA9IDA7CisgICAgZ2ludCBzdGF0ZSA9IDA7CisKKyAgICBuYWxfbGVuID0gc3RybGVuIChwYXJhbXNbaV0pOworICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobmFsX2xlbik7CisKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICBuYWxwID0gbWFwLmRhdGE7CisgICAgbmFsX2xlbiA9IGdfYmFzZTY0X2RlY29kZV9zdGVwIChwYXJhbXNbaV0sIG5hbF9sZW4sIG5hbHAsICZzdGF0ZSwgJnNhdmUpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl9yZXNpemUgKGJ1ZiwgMCwgbmFsX2xlbik7CisKKyAgICBpZiAoIW5hbF9sZW4pIHsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBnc3RfcnRwX2gyNjRfYWRkX3Nwc19wcHMgKEdTVF9FTEVNRU5UIChydHBoMjY0cGF5KSwgcnRwaDI2NHBheS0+c3BzLAorICAgICAgICBydHBoMjY0cGF5LT5wcHMsIGJ1Zik7CisgIH0KKyAgZ19zdHJmcmVldiAocGFyYW1zKTsKK30KKworc3RhdGljIGd1aW50CituZXh0X3N0YXJ0X2NvZGUgKGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUpCit7CisgIC8qIEJveWVyLU1vb3JlIHN0cmluZyBtYXRjaGluZyBhbGdvcml0aG0sIGluIGEgZGVnZW5lcmF0aXZlCisgICAqIHNlbnNlIGJlY2F1c2Ugb3VyIHNlYXJjaCAnYWxwaGFiZXQnIGlzIGJpbmFyeSAtIDAgJiAxIG9ubHkuCisgICAqIFRoaXMgYWxsb3cgdXMgdG8gc2ltcGxpZnkgdGhlIGdlbmVyYWwgQk0gYWxnb3JpdGhtIHRvIGEgdmVyeQorICAgKiBzaW1wbGUgZm9ybS4gKi8KKyAgLyogYXNzdW1lIDEgaXMgaW4gdGhlIDN0aCBieXRlICovCisgIGd1aW50IG9mZnNldCA9IDI7CisKKyAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKKyAgICBpZiAoMSA9PSBkYXRhW29mZnNldF0pIHsKKyAgICAgIHVuc2lnbmVkIGludCBzaGlmdCA9IG9mZnNldDsKKworICAgICAgaWYgKDAgPT0gZGF0YVstLXNoaWZ0XSkgeworICAgICAgICBpZiAoMCA9PSBkYXRhWy0tc2hpZnRdKSB7CisgICAgICAgICAgcmV0dXJuIHNoaWZ0OworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBUaGUganVtcCBpcyBhbHdheXMgMyBiZWNhdXNlIG9mIHRoZSAxIHByZXZpb3VzbHkgbWF0Y2hlZC4KKyAgICAgICAqIEFsbCB0aGUgMCdzIG11c3QgYmUgYWZ0ZXIgdGhpcyAnMScgbWF0Y2hlZCBhdCBvZmZzZXQgKi8KKyAgICAgIG9mZnNldCArPSAzOworICAgIH0gZWxzZSBpZiAoMCA9PSBkYXRhW29mZnNldF0pIHsKKyAgICAgIC8qIG1heWJlIG5leHQgYnl0ZSBpcyAxPyAqLworICAgICAgb2Zmc2V0Kys7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGNhbiBqdW1wIDMgYnl0ZXMgZm9yd2FyZCAqLworICAgICAgb2Zmc2V0ICs9IDM7CisgICAgfQorICAgIC8qIGF0IGVhY2ggaXRlcmF0aW9uLCB3ZSByZXNjYW4gaW4gYSBiYWNrd2FyZCBtYW5uZXIgdW50aWwKKyAgICAgKiB3ZSBtYXRjaCAwLjAuMSBpbiByZXZlcnNlIG9yZGVyLiBTaW5jZSBvdXIgc2VhcmNoIHN0cmluZworICAgICAqIGhhcyBvbmx5IDIgJ2FscGFiZXRzJyAoaS5lLiAwICYgMSksIHdlIGtub3cgdGhhdCBhbnkKKyAgICAgKiBtaXNtYXRjaCB3aWxsIGZvcmNlIHVzIHRvIHNoaWZ0IGEgZml4ZWQgbnVtYmVyIG9mIHN0ZXBzICovCisgIH0KKyAgR1NUX0RFQlVHICgiQ2Fubm90IGZpbmQgbmV4dCBOQUwgc3RhcnQgY29kZS4gcmV0dXJuaW5nICV1Iiwgc2l6ZSk7CisKKyAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9oMjY0X3BheV9kZWNvZGVfbmFsIChHc3RSdHBIMjY0UGF5ICogcGF5bG9hZGVyLAorICAgIGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsIEdzdENsb2NrVGltZSBkdHMsIEdzdENsb2NrVGltZSBwdHMpCit7CisgIGd1aW50OCBoZWFkZXIsIHR5cGU7CisgIGdib29sZWFuIHVwZGF0ZWQ7CisKKyAgLyogZGVmYXVsdCBpcyBubyB1cGRhdGUgKi8KKyAgdXBkYXRlZCA9IEZBTFNFOworCisgIEdTVF9ERUJVRyAoIk5BTCBwYXlsb2FkIGxlbj0ldSIsIHNpemUpOworCisgIGhlYWRlciA9IGRhdGFbMF07CisgIHR5cGUgPSBoZWFkZXIgJiAweDFmOworCisgIC8qIFdlIHJlY29yZCB0aGUgdGltZXN0YW1wIG9mIHRoZSBsYXN0IFNQUy9QUFMgc28KKyAgICogdGhhdCB3ZSBjYW4gaW5zZXJ0IHRoZW0gYXQgcmVndWxhciBpbnRlcnZhbHMgYW5kIHdoZW4gbmVlZGVkLiAqLworICBpZiAoU1BTX1RZUEVfSUQgPT0gdHlwZSB8fCBQUFNfVFlQRV9JRCA9PSB0eXBlKSB7CisgICAgR3N0QnVmZmVyICpuYWw7CisKKyAgICAvKiB0cmFpbGluZyAweDAgYXJlIG5vdCBwYXJ0IG9mIHRoZSBTUFMvUFBTICovCisgICAgd2hpbGUgKHNpemUgPiAwICYmIGRhdGFbc2l6ZSAtIDFdID09IDB4MCkKKyAgICAgIHNpemUtLTsKKworICAgIC8qIGVuY29kZSB0aGUgZW50aXJlIFNQUyBOQUwgaW4gYmFzZTY0ICovCisgICAgR1NUX0RFQlVHICgiRm91bmQgJXMgJXggJXggJXggTGVuPSV1IiwgdHlwZSA9PSBTUFNfVFlQRV9JRCA/ICJTUFMiIDogIlBQUyIsCisgICAgICAgIChoZWFkZXIgPj4gNyksIChoZWFkZXIgPj4gNSkgJiAzLCB0eXBlLCBzaXplKTsKKworICAgIG5hbCA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCBzaXplLCBOVUxMKTsKKyAgICBnc3RfYnVmZmVyX2ZpbGwgKG5hbCwgMCwgZGF0YSwgc2l6ZSk7CisKKyAgICB1cGRhdGVkID0gZ3N0X3J0cF9oMjY0X2FkZF9zcHNfcHBzIChHU1RfRUxFTUVOVCAocGF5bG9hZGVyKSwKKyAgICAgICAgcGF5bG9hZGVyLT5zcHMsIHBheWxvYWRlci0+cHBzLCBuYWwpOworCisgICAgLyogcmVtZW1iZXIgd2hlbiB3ZSBsYXN0IHNhdyBTUFMgKi8KKyAgICBpZiAodXBkYXRlZCAmJiBwdHMgIT0gLTEpCisgICAgICBwYXlsb2FkZXItPmxhc3Rfc3BzcHBzID0gcHRzOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVRyAoIk5BTDogJXggJXggJXggTGVuID0gJXUiLCAoaGVhZGVyID4+IDcpLAorICAgICAgICAoaGVhZGVyID4+IDUpICYgMywgdHlwZSwgc2l6ZSk7CisgIH0KKworICByZXR1cm4gdXBkYXRlZDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfaDI2NF9wYXlfcGF5bG9hZF9uYWwgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0QnVmZmVyICogcGF5YnVmLCBHc3RDbG9ja1RpbWUgZHRzLCBHc3RDbG9ja1RpbWUgcHRzLCBnYm9vbGVhbiBlbmRfb2ZfYXUsCisgICAgZ2Jvb2xlYW4gZGVsdGFfdW5pdCwgZ2Jvb2xlYW4gZGlzY29udCk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2gyNjRfcGF5X3NlbmRfc3BzX3BwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RSdHBIMjY0UGF5ICogcnRwaDI2NHBheSwgR3N0Q2xvY2tUaW1lIGR0cywgR3N0Q2xvY2tUaW1lIHB0cykKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ2Jvb2xlYW4gc2VudF9hbGxfc3BzX3BwcyA9IFRSVUU7CisgIGd1aW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IHJ0cGgyNjRwYXktPnNwcy0+bGVuOyBpKyspIHsKKyAgICBHc3RCdWZmZXIgKnNwc19idWYgPQorICAgICAgICBHU1RfQlVGRkVSX0NBU1QgKGdfcHRyX2FycmF5X2luZGV4IChydHBoMjY0cGF5LT5zcHMsIGkpKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRwYXksICJpbnNlcnRpbmcgU1BTIGluIHRoZSBzdHJlYW0iKTsKKyAgICAvKiByZXNlbmQgU1BTICovCisgICAgcmV0ID0gZ3N0X3J0cF9oMjY0X3BheV9wYXlsb2FkX25hbCAoYmFzZXBheWxvYWQsIGdzdF9idWZmZXJfcmVmIChzcHNfYnVmKSwKKyAgICAgICAgZHRzLCBwdHMsIEZBTFNFLCBGQUxTRSwgRkFMU0UpOworICAgIC8qIE5vdCBjcml0aWNhbCBoZXJlOyBidXQgdGhyb3cgYSB3YXJuaW5nICovCisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgICAgc2VudF9hbGxfc3BzX3BwcyA9IEZBTFNFOworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChiYXNlcGF5bG9hZCwgIlByb2JsZW0gcHVzaGluZyBTUFMiKTsKKyAgICB9CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IHJ0cGgyNjRwYXktPnBwcy0+bGVuOyBpKyspIHsKKyAgICBHc3RCdWZmZXIgKnBwc19idWYgPQorICAgICAgICBHU1RfQlVGRkVSX0NBU1QgKGdfcHRyX2FycmF5X2luZGV4IChydHBoMjY0cGF5LT5wcHMsIGkpKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRwYXksICJpbnNlcnRpbmcgUFBTIGluIHRoZSBzdHJlYW0iKTsKKyAgICAvKiByZXNlbmQgUFBTICovCisgICAgcmV0ID0gZ3N0X3J0cF9oMjY0X3BheV9wYXlsb2FkX25hbCAoYmFzZXBheWxvYWQsIGdzdF9idWZmZXJfcmVmIChwcHNfYnVmKSwKKyAgICAgICAgZHRzLCBwdHMsIEZBTFNFLCBGQUxTRSwgRkFMU0UpOworICAgIC8qIE5vdCBjcml0aWNhbCBoZXJlOyBidXQgdGhyb3cgYSB3YXJuaW5nICovCisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgICAgc2VudF9hbGxfc3BzX3BwcyA9IEZBTFNFOworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChiYXNlcGF5bG9hZCwgIlByb2JsZW0gcHVzaGluZyBQUFMiKTsKKyAgICB9CisgIH0KKworICBpZiAocHRzICE9IC0xICYmIHNlbnRfYWxsX3Nwc19wcHMpCisgICAgcnRwaDI2NHBheS0+bGFzdF9zcHNwcHMgPSBwdHM7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogQGRlbHRhX3VuaXQ6IGlmICVGQUxTRSB0aGUgZmlyc3QgcGFja2V0IHNlbnQgd29uJ3QgaGF2ZSB0aGUKKyAqIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUIGZsYWcuCisgKiBAZGlzY29udDogaWYgJVRSVUUgdGhlIGZpcnN0IHBhY2tldCBzZW50IHdpbGwgaGF2ZSB0aGUKKyAqIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UIGZsYWcuCisgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2gyNjRfcGF5X3BheWxvYWRfbmFsIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIHBheWJ1ZiwgR3N0Q2xvY2tUaW1lIGR0cywgR3N0Q2xvY2tUaW1lIHB0cywgZ2Jvb2xlYW4gZW5kX29mX2F1LAorICAgIGdib29sZWFuIGRlbHRhX3VuaXQsIGdib29sZWFuIGRpc2NvbnQpCit7CisgIEdzdFJ0cEgyNjRQYXkgKnJ0cGgyNjRwYXk7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBndWludDggbmFsSGVhZGVyOworICBndWludDggbmFsVHlwZTsKKyAgZ3VpbnQgcGFja2V0X2xlbiwgcGF5bG9hZF9sZW4sIG10dTsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIGd1aW50OCAqcGF5bG9hZDsKKyAgR3N0QnVmZmVyTGlzdCAqbGlzdCA9IE5VTEw7CisgIGdib29sZWFuIHNlbmRfc3BzcHBzOworICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisgIGd1aW50IHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChwYXlidWYpOworCisgIHJ0cGgyNjRwYXkgPSBHU1RfUlRQX0gyNjRfUEFZIChiYXNlcGF5bG9hZCk7CisgIG10dSA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEX01UVSAocnRwaDI2NHBheSk7CisKKyAgZ3N0X2J1ZmZlcl9leHRyYWN0IChwYXlidWYsIDAsICZuYWxIZWFkZXIsIDEpOworICBuYWxUeXBlID0gbmFsSGVhZGVyICYgMHgxZjsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0cGF5LCAiUHJvY2Vzc2luZyBCdWZmZXIgd2l0aCBOQUwgVFlQRT0lZCIsIG5hbFR5cGUpOworCisgIC8qIHNob3VsZCBzZXQgc3JjIGNhcHMgYmVmb3JlIHB1c2hpbmcgc3R1ZmYsCisgICAqIGFuZCBpZiB3ZSBkaWQgbm90IHNlZSBlbm91Z2ggU1BTL1BQUywgdGhhdCBtYXkgbm90IGJlIHRoZSBjYXNlICovCisgIGlmIChHX1VOTElLRUxZICghZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChHU1RfUlRQX0JBU0VfUEFZTE9BRF9TUkNQQUQKKyAgICAgICAgICAgICAgKGJhc2VwYXlsb2FkKSkpKQorICAgIGdzdF9ydHBfaDI2NF9wYXlfc2V0X3Nwc19wcHMgKGJhc2VwYXlsb2FkKTsKKworICBzZW5kX3Nwc3BwcyA9IEZBTFNFOworCisgIC8qIGNoZWNrIGlmIHdlIG5lZWQgdG8gZW1pdCBhbiBTUFMvUFBTIG5vdyAqLworICBpZiAobmFsVHlwZSA9PSBJRFJfVFlQRV9JRCAmJiBydHBoMjY0cGF5LT5zcHNwcHNfaW50ZXJ2YWwgPiAwKSB7CisgICAgaWYgKHJ0cGgyNjRwYXktPmxhc3Rfc3BzcHBzICE9IC0xKSB7CisgICAgICBndWludDY0IGRpZmY7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBoMjY0cGF5LAorICAgICAgICAgICJub3cgJSIgR1NUX1RJTUVfRk9STUFUICIsIGxhc3QgU1BTL1BQUyAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocHRzKSwgR1NUX1RJTUVfQVJHUyAocnRwaDI2NHBheS0+bGFzdF9zcHNwcHMpKTsKKworICAgICAgLyogY2FsY3VsYXRlIGRpZmYgYmV0d2VlbiBsYXN0IFNQUy9QUFMgaW4gbWlsbGlzZWNvbmRzICovCisgICAgICBpZiAocHRzID4gcnRwaDI2NHBheS0+bGFzdF9zcHNwcHMpCisgICAgICAgIGRpZmYgPSBwdHMgLSBydHBoMjY0cGF5LT5sYXN0X3Nwc3BwczsKKyAgICAgIGVsc2UKKyAgICAgICAgZGlmZiA9IDA7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRwYXksCisgICAgICAgICAgImludGVydmFsIHNpbmNlIGxhc3QgU1BTL1BQUyAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZGlmZikpOworCisgICAgICAvKiBiaWdnZXIgdGhhbiBpbnRlcnZhbCwgcXVldWUgU1BTL1BQUyAqLworICAgICAgaWYgKEdTVF9USU1FX0FTX1NFQ09ORFMgKGRpZmYpID49IHJ0cGgyNjRwYXktPnNwc3Bwc19pbnRlcnZhbCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0cGF5LCAidGltZSB0byBzZW5kIFNQUy9QUFMiKTsKKyAgICAgICAgc2VuZF9zcHNwcHMgPSBUUlVFOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiBubyBrbm93IHByZXZpb3VzIFNQUy9QUFMgdGltZSwgc2VuZCBub3cgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRwYXksICJubyBwcmV2aW91cyBTUFMvUFBTIHRpbWUsIHNlbmQgbm93Iik7CisgICAgICBzZW5kX3Nwc3BwcyA9IFRSVUU7CisgICAgfQorICB9IGVsc2UgaWYgKG5hbFR5cGUgPT0gSURSX1RZUEVfSUQgJiYgcnRwaDI2NHBheS0+c3BzcHBzX2ludGVydmFsID09IC0xKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NHBheSwgInNlbmRpbmcgU1BTL1BQUyBiZWZvcmUgY3VycmVudCBJRFIgZnJhbWUiKTsKKyAgICAvKiBzZW5kIFNQUy9QUFMgYmVmb3JlIGV2ZXJ5IElEUiBmcmFtZSAqLworICAgIHNlbmRfc3BzcHBzID0gVFJVRTsKKyAgfQorCisgIGlmIChzZW5kX3Nwc3BwcyB8fCBydHBoMjY0cGF5LT5zZW5kX3Nwc3BwcykgeworICAgIC8qIHdlIG5lZWQgdG8gc2VuZCBTUFMvUFBTIG5vdyBmaXJzdC4gRklYTUUsIGRvbid0IHVzZSB0aGUgcHRzIGZvcgorICAgICAqIGNoZWNraW5nIHdoZW4gd2UgbmVlZCB0byBzZW5kIFNQUy9QUFMgYnV0IGNvbnZlcnQgdG8gcnVubmluZ190aW1lIGZpcnN0LiAqLworICAgIHJ0cGgyNjRwYXktPnNlbmRfc3BzcHBzID0gRkFMU0U7CisgICAgcmV0ID0gZ3N0X3J0cF9oMjY0X3BheV9zZW5kX3Nwc19wcHMgKGJhc2VwYXlsb2FkLCBydHBoMjY0cGF5LCBkdHMsIHB0cyk7CisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocGF5YnVmKTsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorICB9CisKKyAgcGFja2V0X2xlbiA9IGdzdF9ydHBfYnVmZmVyX2NhbGNfcGFja2V0X2xlbiAoc2l6ZSwgMCwgMCk7CisKKyAgaWYgKHBhY2tldF9sZW4gPCBtdHUpIHsKKyAgICAvKiB3aWxsIGZpdCBpbiBvbmUgcGFja2V0ICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXBheWxvYWQsCisgICAgICAgICJOQUwgVW5pdCBmaXQgaW4gb25lIHBhY2tldCBkYXRhc2l6ZT0lZCBtdHU9JWQiLCBzaXplLCBtdHUpOworCisgICAgLyogY3JlYXRlIGJ1ZmZlciB3aXRob3V0IHBheWxvYWQgY29udGFpbmluZyBvbmx5IHRoZSBSVFAgaGVhZGVyCisgICAgICogKG1lbW9yeSBibG9jayBhdCBpbmRleCAwKSAqLworICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoMCwgMCwgMCk7CisKKyAgICBnc3RfcnRwX2J1ZmZlcl9tYXAgKG91dGJ1ZiwgR1NUX01BUF9XUklURSwgJnJ0cCk7CisKKyAgICAvKiBvbmx5IHNldCB0aGUgbWFya2VyIGJpdCBvbiBwYWNrZXRzIGNvbnRhaW5pbmcgYWNjZXNzIHVuaXRzICovCisgICAgaWYgKElTX0FDQ0VTU19VTklUIChuYWxUeXBlKSAmJiBlbmRfb2ZfYXUpIHsKKyAgICAgIGdzdF9ydHBfYnVmZmVyX3NldF9tYXJrZXIgKCZydHAsIDEpOworICAgIH0KKworICAgIC8qIHRpbWVzdGFtcCB0aGUgb3V0YnVmZmVyICovCisgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSBwdHM7CisgICAgR1NUX0JVRkZFUl9EVFMgKG91dGJ1ZikgPSBkdHM7CisKKyAgICBpZiAoIWRlbHRhX3VuaXQpCisgICAgICAvKiBPbmx5IHRoZSBmaXJzdCBwYWNrZXQgc2VudCBzaG91bGQgbm90IGhhdmUgdGhlIGZsYWcgKi8KKyAgICAgIGRlbHRhX3VuaXQgPSBUUlVFOworICAgIGVsc2UKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgICAgaWYgKGRpc2NvbnQpIHsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgICAgLyogT25seSB0aGUgZmlyc3QgcGFja2V0IHNlbnQgc2hvdWxkIGhhdmUgdGhlIGZsYWcgKi8KKyAgICAgIGRpc2NvbnQgPSBGQUxTRTsKKyAgICB9CisKKyAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgICAvKiBpbnNlcnQgcGF5bG9hZCBtZW1vcnkgYmxvY2sgKi8KKyAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwaDI2NHBheSwgb3V0YnVmLCBwYXlidWYpOworICAgIG91dGJ1ZiA9IGdzdF9idWZmZXJfYXBwZW5kIChvdXRidWYsIHBheWJ1Zik7CisKKyAgICAvKiBwdXNoIHRoZSBidWZmZXIgdG8gdGhlIG5leHQgZWxlbWVudCAqLworICAgIHJldCA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKGJhc2VwYXlsb2FkLCBvdXRidWYpOworICB9IGVsc2UgeworICAgIC8qIGZyYWdtZW50YXRpb24gVW5pdHMgRlUtQSAqLworICAgIGd1aW50IGxpbWl0ZWRTaXplOworICAgIGludCBpaSA9IDAsIHN0YXJ0ID0gMSwgZW5kID0gMCwgcG9zID0gMDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLAorICAgICAgICAiTkFMIFVuaXQgRE9FUyBOT1QgZml0IGluIG9uZSBwYWNrZXQgZGF0YXNpemU9JWQgbXR1PSVkIiwgc2l6ZSwgbXR1KTsKKworICAgIHBvcysrOworICAgIHNpemUtLTsKKworICAgIHJldCA9IEdTVF9GTE9XX09LOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXBheWxvYWQsICJVc2luZyBGVS1BIGZyYWdtZW50YXRpb24gZm9yIGRhdGEgc2l6ZT0lZCIsCisgICAgICAgIHNpemUpOworCisgICAgLyogV2Uga2VlcCAyIGJ5dGVzIGZvciBGVSBpbmRpY2F0b3IgYW5kIEZVIEhlYWRlciAqLworICAgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYXlsb2FkX2xlbiAobXR1IC0gMiwgMCwgMCk7CisKKyAgICBsaXN0ID0gZ3N0X2J1ZmZlcl9saXN0X25ld19zaXplZCAoKHNpemUgLyBwYXlsb2FkX2xlbikgKyAxKTsKKworICAgIHdoaWxlIChlbmQgPT0gMCkgeworICAgICAgbGltaXRlZFNpemUgPSBzaXplIDwgcGF5bG9hZF9sZW4gPyBzaXplIDogcGF5bG9hZF9sZW47CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChiYXNlcGF5bG9hZCwKKyAgICAgICAgICAiSW5zaWRlICBGVS1BIGZyYWdtZW50YXRpb24gbGltaXRlZFNpemU9JWQgaXRlcmF0aW9uPSVkIiwgbGltaXRlZFNpemUsCisgICAgICAgICAgaWkpOworCisgICAgICAvKiB1c2UgYnVmZmVyIGxpc3RzCisgICAgICAgKiBjcmVhdGUgYnVmZmVyIHdpdGhvdXQgcGF5bG9hZCBjb250YWluaW5nIG9ubHkgdGhlIFJUUCBoZWFkZXIKKyAgICAgICAqIChtZW1vcnkgYmxvY2sgYXQgaW5kZXggMCkgKi8KKyAgICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoMiwgMCwgMCk7CisKKyAgICAgIGdzdF9ydHBfYnVmZmVyX21hcCAob3V0YnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKworICAgICAgR1NUX0JVRkZFUl9EVFMgKG91dGJ1ZikgPSBkdHM7CisgICAgICBHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSA9IHB0czsKKyAgICAgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisKKyAgICAgIGlmIChsaW1pdGVkU2l6ZSA9PSBzaXplKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLCAiZW5kIHNpemU9JWQgaXRlcmF0aW9uPSVkIiwgc2l6ZSwgaWkpOworICAgICAgICBlbmQgPSAxOworICAgICAgfQorICAgICAgaWYgKElTX0FDQ0VTU19VTklUIChuYWxUeXBlKSkgeworICAgICAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBlbmQgJiYgZW5kX29mX2F1KTsKKyAgICAgIH0KKworICAgICAgLyogRlUgaW5kaWNhdG9yICovCisgICAgICBwYXlsb2FkWzBdID0gKG5hbEhlYWRlciAmIDB4NjApIHwgMjg7CisKKyAgICAgIC8qIEZVIEhlYWRlciAqLworICAgICAgcGF5bG9hZFsxXSA9IChzdGFydCA8PCA3KSB8IChlbmQgPDwgNikgfCAobmFsSGVhZGVyICYgMHgxZik7CisKKyAgICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICAgICAgLyogaW5zZXJ0IHBheWxvYWQgbWVtb3J5IGJsb2NrICovCisgICAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwaDI2NHBheSwgb3V0YnVmLCBwYXlidWYpOworICAgICAgZ3N0X2J1ZmZlcl9jb3B5X2ludG8gKG91dGJ1ZiwgcGF5YnVmLCBHU1RfQlVGRkVSX0NPUFlfTUVNT1JZLCBwb3MsCisgICAgICAgICAgbGltaXRlZFNpemUpOworCisgICAgICBpZiAoIWRlbHRhX3VuaXQpCisgICAgICAgIC8qIE9ubHkgdGhlIGZpcnN0IHBhY2tldCBzZW50IHNob3VsZCBub3QgaGF2ZSB0aGUgZmxhZyAqLworICAgICAgICBkZWx0YV91bml0ID0gVFJVRTsKKyAgICAgIGVsc2UKKyAgICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisKKyAgICAgIGlmIChkaXNjb250KSB7CisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgICAgICAvKiBPbmx5IHRoZSBmaXJzdCBwYWNrZXQgc2VudCBzaG91bGQgaGF2ZSB0aGUgZmxhZyAqLworICAgICAgICBkaXNjb250ID0gRkFMU0U7CisgICAgICB9CisKKyAgICAgIC8qIGFkZCB0aGUgYnVmZmVyIHRvIHRoZSBidWZmZXIgbGlzdCAqLworICAgICAgZ3N0X2J1ZmZlcl9saXN0X2FkZCAobGlzdCwgb3V0YnVmKTsKKworCisgICAgICBzaXplIC09IGxpbWl0ZWRTaXplOworICAgICAgcG9zICs9IGxpbWl0ZWRTaXplOworICAgICAgaWkrKzsKKyAgICAgIHN0YXJ0ID0gMDsKKyAgICB9CisKKyAgICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoX2xpc3QgKGJhc2VwYXlsb2FkLCBsaXN0KTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChwYXlidWYpOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2gyNjRfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSdHBIMjY0UGF5ICpydHBoMjY0cGF5OworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ3NpemUgc2l6ZTsKKyAgZ3VpbnQgbmFsX2xlbiwgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGNvbnN0IGd1aW50OCAqZGF0YTsKKyAgR3N0Q2xvY2tUaW1lIGR0cywgcHRzOworICBHQXJyYXkgKm5hbF9xdWV1ZTsKKyAgZ2Jvb2xlYW4gYXZjOworICBHc3RCdWZmZXIgKnBheWJ1ZiA9IE5VTEw7CisgIGdzaXplIHNraXA7CisgIGdib29sZWFuIGRlbGF5ZWRfbm90X2RlbHRhX3VuaXQgPSBGQUxTRTsKKyAgZ2Jvb2xlYW4gZGVsYXllZF9kaXNjb250ID0gRkFMU0U7CisKKyAgcnRwaDI2NHBheSA9IEdTVF9SVFBfSDI2NF9QQVkgKGJhc2VwYXlsb2FkKTsKKworICAvKiB0aGUgaW5wdXQgYnVmZmVyIGNvbnRhaW5zIG9uZSBvciBtb3JlIE5BTCB1bml0cyAqLworCisgIGF2YyA9IHJ0cGgyNjRwYXktPnN0cmVhbV9mb3JtYXQgPT0gR1NUX0gyNjRfU1RSRUFNX0ZPUk1BVF9BVkM7CisKKyAgaWYgKGF2YykgeworICAgIC8qIEluIEFWQyBtb2RlLCB0aGVyZSBpcyBubyBhZGFwdGVyLCBzbyBub3RoaWduIHRvIGZsdXNoICovCisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgZGF0YSA9IG1hcC5kYXRhOworICAgIHNpemUgPSBtYXAuc2l6ZTsKKyAgICBwdHMgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKTsKKyAgICBkdHMgPSBHU1RfQlVGRkVSX0RUUyAoYnVmZmVyKTsKKyAgICBydHBoMjY0cGF5LT5kZWx0YV91bml0ID0gR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmZmVyLAorICAgICAgICBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgICAgcnRwaDI2NHBheS0+ZGlzY29udCA9IEdTVF9CVUZGRVJfSVNfRElTQ09OVCAoYnVmZmVyKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChiYXNlcGF5bG9hZCwgImdvdCAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIiwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgZHRzID0gZ3N0X2FkYXB0ZXJfcHJldl9kdHMgKHJ0cGgyNjRwYXktPmFkYXB0ZXIsIE5VTEwpOworICAgIHB0cyA9IGdzdF9hZGFwdGVyX3ByZXZfcHRzIChydHBoMjY0cGF5LT5hZGFwdGVyLCBOVUxMKTsKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICBpZiAoIUdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpKSB7CisgICAgICAgIGlmIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHJ0cGgyNjRwYXktPmFkYXB0ZXIpID09IDApCisgICAgICAgICAgcnRwaDI2NHBheS0+ZGVsdGFfdW5pdCA9IEZBTFNFOworICAgICAgICBlbHNlCisgICAgICAgICAgLyogVGhpcyBidWZmZXIgY29udGFpbnMgYSBrZXkgZnJhbWUgYnV0IHRoZSBhZGFwdGVyIGlzbid0IGVtcHR5LiBTbworICAgICAgICAgICAqIHdlJ2xsIHB1cmdlIGl0IGZpcnN0IGJ5IHNlbmRpbmcgYSBmaXJzdCBwYWNrZXQgYW5kIHRoZW4gdGhlIHNlY29uZAorICAgICAgICAgICAqIG9uZSB3b24ndCBoYXZlIHRoZSBERUxUQV9VTklUIGZsYWcuICovCisgICAgICAgICAgZGVsYXllZF9ub3RfZGVsdGFfdW5pdCA9IFRSVUU7CisgICAgICB9CisKKyAgICAgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKGJ1ZmZlcikpIHsKKyAgICAgICAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwaDI2NHBheS0+YWRhcHRlcikgPT0gMCkKKyAgICAgICAgICBydHBoMjY0cGF5LT5kaXNjb250ID0gVFJVRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIC8qIFRoaXMgYnVmZmVyIGhhcyB0aGUgRElTQ09OVCBmbGFnIGJ1dCB0aGUgYWRhcHRlciBpc24ndCBlbXB0eS4gU28KKyAgICAgICAgICAgKiB3ZSdsbCBwdXJnZSBpdCBmaXJzdCBieSBzZW5kaW5nIGEgZmlyc3QgcGFja2V0IGFuZCB0aGVuIHRoZSBzZWNvbmQKKyAgICAgICAgICAgKiBvbmUgd2lsbCBoYXZlIHRoZSBESVNDT05UIGZsYWcgc2V0LiAqLworICAgICAgICAgIGRlbGF5ZWRfZGlzY29udCA9IFRSVUU7CisgICAgICB9CisKKyAgICAgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGR0cykpCisgICAgICAgIGR0cyA9IEdTVF9CVUZGRVJfRFRTIChidWZmZXIpOworICAgICAgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAocHRzKSkKKyAgICAgICAgcHRzID0gR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcik7CisKKyAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGgyNjRwYXktPmFkYXB0ZXIsIGJ1ZmZlcik7CisgICAgfQorICAgIHNpemUgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHJ0cGgyNjRwYXktPmFkYXB0ZXIpOworICAgIC8qIE5vdGhpbmcgdG8gZG8gaGVyZSBpZiB0aGUgYWRhcHRlciBpcyBlbXB0eSwgZS5nLiBvbiBFT1MgKi8KKyAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgIGRhdGEgPSBnc3RfYWRhcHRlcl9tYXAgKHJ0cGgyNjRwYXktPmFkYXB0ZXIsIHNpemUpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLAorICAgICAgICAiZ290ICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMgKCUiIEdfR1NJWkVfRk9STUFUICIpIiwgc2l6ZSwKKyAgICAgICAgYnVmZmVyID8gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSA6IDApOworICB9CisKKyAgcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgLyogbm93IGxvb3Agb3ZlciBhbGwgTkFMIHVuaXRzIGFuZCBwdXQgdGhlbSBpbiBhIHBhY2tldAorICAgKiBGSVhNRSwgd2Ugc2hvdWxkIHJlYWxseSB0cnkgdG8gcGFjayBtdWx0aXBsZSBOQUwgdW5pdHMgaW50byBvbmUgUlRQIHBhY2tldAorICAgKiBpZiB3ZSBjYW4sIGVzcGVjaWFsbHkgZm9yIHRoZSBjb25maWcgcGFja2V0cyB0aGF0IHdvbnQndCBjYXVzZSBkZWNvZGVyIAorICAgKiBsYXRlbmN5LiAqLworICBpZiAoYXZjKSB7CisgICAgZ3VpbnQgbmFsX2xlbmd0aF9zaXplOworICAgIGdzaXplIG9mZnNldCA9IDA7CisKKyAgICBuYWxfbGVuZ3RoX3NpemUgPSBydHBoMjY0cGF5LT5uYWxfbGVuZ3RoX3NpemU7CisKKyAgICB3aGlsZSAoc2l6ZSA+IG5hbF9sZW5ndGhfc2l6ZSkgeworICAgICAgZ2ludCBpOworICAgICAgZ2Jvb2xlYW4gZW5kX29mX2F1ID0gRkFMU0U7CisKKyAgICAgIG5hbF9sZW4gPSAwOworICAgICAgZm9yIChpID0gMDsgaSA8IG5hbF9sZW5ndGhfc2l6ZTsgaSsrKSB7CisgICAgICAgIG5hbF9sZW4gPSAoKG5hbF9sZW4gPDwgOCkgKyBkYXRhW2ldKTsKKyAgICAgIH0KKworICAgICAgLyogc2tpcCB0aGUgbGVuZ3RoIGJ5dGVzLCBtYWtlIHN1cmUgd2UgZG9uJ3QgcnVuIHBhc3QgdGhlIGJ1ZmZlciBzaXplICovCisgICAgICBkYXRhICs9IG5hbF9sZW5ndGhfc2l6ZTsKKyAgICAgIG9mZnNldCArPSBuYWxfbGVuZ3RoX3NpemU7CisgICAgICBzaXplIC09IG5hbF9sZW5ndGhfc2l6ZTsKKworICAgICAgaWYgKHNpemUgPj0gbmFsX2xlbikgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChiYXNlcGF5bG9hZCwgImdvdCBOQUwgb2Ygc2l6ZSAldSIsIG5hbF9sZW4pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmFsX2xlbiA9IHNpemU7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLCAiZ290IGluY29tcGxldGUgTkFMIG9mIHNpemUgJXUiLAorICAgICAgICAgICAgbmFsX2xlbik7CisgICAgICB9CisKKyAgICAgIC8qIElmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgdGhlbiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZQorICAgICAgICogYWNjZXNzIHVuaXQKKyAgICAgICAqLworICAgICAgaWYgKHJ0cGgyNjRwYXktPmFsaWdubWVudCA9PSBHU1RfSDI2NF9BTElHTk1FTlRfQVUKKyAgICAgICAgICAmJiBzaXplIC0gbmFsX2xlbiA8PSBuYWxfbGVuZ3RoX3NpemUpIHsKKyAgICAgICAgZW5kX29mX2F1ID0gVFJVRTsKKyAgICAgIH0KKworICAgICAgcGF5YnVmID0gZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAoYnVmZmVyLCBHU1RfQlVGRkVSX0NPUFlfQUxMLCBvZmZzZXQsCisgICAgICAgICAgbmFsX2xlbik7CisgICAgICByZXQgPQorICAgICAgICAgIGdzdF9ydHBfaDI2NF9wYXlfcGF5bG9hZF9uYWwgKGJhc2VwYXlsb2FkLCBwYXlidWYsIGR0cywgcHRzLAorICAgICAgICAgIGVuZF9vZl9hdSwgcnRwaDI2NHBheS0+ZGVsdGFfdW5pdCwgcnRwaDI2NHBheS0+ZGlzY29udCk7CisKKyAgICAgIGlmICghcnRwaDI2NHBheS0+ZGVsdGFfdW5pdCkKKyAgICAgICAgLyogT25seSB0aGUgZmlyc3Qgb3V0Z29pbmcgcGFja2V0IGRvZXNuJ3QgaGF2ZSB0aGUgREVMVEFfVU5JVCBmbGFnICovCisgICAgICAgIHJ0cGgyNjRwYXktPmRlbHRhX3VuaXQgPSBUUlVFOworCisgICAgICBpZiAocnRwaDI2NHBheS0+ZGlzY29udCkKKyAgICAgICAgLyogT25seSB0aGUgZmlyc3Qgb3V0Z29pbmcgcGFja2V0IGhhdmUgdGhlIERJU0NPTlQgZmxhZyAqLworICAgICAgICBydHBoMjY0cGF5LT5kaXNjb250ID0gRkFMU0U7CisKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGJyZWFrOworCisgICAgICBkYXRhICs9IG5hbF9sZW47CisgICAgICBvZmZzZXQgKz0gbmFsX2xlbjsKKyAgICAgIHNpemUgLT0gbmFsX2xlbjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ3VpbnQgbmV4dDsKKyAgICBnYm9vbGVhbiB1cGRhdGUgPSBGQUxTRTsKKworICAgIC8qIGdldCBvZmZzZXQgb2YgZmlyc3Qgc3RhcnQgY29kZSAqLworICAgIG5leHQgPSBuZXh0X3N0YXJ0X2NvZGUgKGRhdGEsIHNpemUpOworCisgICAgLyogc2tpcCB0byBzdGFydCBjb2RlLCBpZiBubyBzdGFydCBjb2RlIGlzIGZvdW5kLCBuZXh0IHdpbGwgYmUgc2l6ZSBhbmQgd2UKKyAgICAgKiB3aWxsIG5vdCBjb2xsZWN0IGRhdGEuICovCisgICAgZGF0YSArPSBuZXh0OworICAgIHNpemUgLT0gbmV4dDsKKyAgICBuYWxfcXVldWUgPSBydHBoMjY0cGF5LT5xdWV1ZTsKKyAgICBza2lwID0gbmV4dDsKKworICAgIC8qIGFycmF5IG11c3QgYmUgZW1wdHkgd2hlbiB3ZSBnZXQgaGVyZSAqLworICAgIGdfYXNzZXJ0IChuYWxfcXVldWUtPmxlbiA9PSAwKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLAorICAgICAgICAiZm91bmQgZmlyc3Qgc3RhcnQgYXQgJXUsIGJ5dGVzIGxlZnQgJSIgR19HU0laRV9GT1JNQVQsIG5leHQsIHNpemUpOworCisgICAgLyogZmlyc3QgcGFzcyB0byBsb2NhdGUgTkFMcyBhbmQgcGFyc2UgU1BTL1BQUyAqLworICAgIHdoaWxlIChzaXplID4gNCkgeworICAgICAgLyogc2tpcCBzdGFydCBjb2RlICovCisgICAgICBkYXRhICs9IDM7CisgICAgICBzaXplIC09IDM7CisKKyAgICAgIC8qIHVzZSBuZXh0X3N0YXJ0X2NvZGUoKSB0byBzY2FuIGJ1ZmZlci4KKyAgICAgICAqIG5leHRfc3RhcnRfY29kZSgpIHJldHVybnMgdGhlIG9mZnNldCBpbiBkYXRhLCAKKyAgICAgICAqIHN0YXJ0aW5nIGZyb20gemVybyB0byB0aGUgZmlyc3QgYnl0ZSBvZiAwLjAuMC4xCisgICAgICAgKiBJZiBubyBzdGFydCBjb2RlIGlzIGZvdW5kLCBpdCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgCisgICAgICAgKiAnc2l6ZScgcGFyYW1ldGVyLiAKKyAgICAgICAqIGRhdGEgaXMgdW5jaGFuZ2VkIGJ5IHRoZSBjYWxsIHRvIG5leHRfc3RhcnRfY29kZSgpCisgICAgICAgKi8KKyAgICAgIG5leHQgPSBuZXh0X3N0YXJ0X2NvZGUgKGRhdGEsIHNpemUpOworCisgICAgICAvKiBuYWwgb3IgYXUgYWxpZ25lZCBpbnB1dCBuZWVkcyBubyBkZWxheWluZyB1bnRpbCBuZXh0IHRpbWUgKi8KKyAgICAgIGlmIChuZXh0ID09IHNpemUgJiYgYnVmZmVyICE9IE5VTEwgJiYKKyAgICAgICAgICBydHBoMjY0cGF5LT5hbGlnbm1lbnQgPT0gR1NUX0gyNjRfQUxJR05NRU5UX1VOS05PV04pIHsKKyAgICAgICAgLyogRGlkbid0IGZpbmQgdGhlIHN0YXJ0IG9mIG5leHQgTkFMIGFuZCBpdCdzIG5vdCBFT1MsCisgICAgICAgICAqIGhhbmRsZSBpdCBuZXh0IHRpbWUgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8qIG5hbCBsZW5ndGggaXMgZGlzdGFuY2UgdG8gbmV4dCBzdGFydCBjb2RlICovCisgICAgICBuYWxfbGVuID0gbmV4dDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXBheWxvYWQsICJmb3VuZCBuZXh0IHN0YXJ0IGF0ICV1IG9mIHNpemUgJXUiLCBuZXh0LAorICAgICAgICAgIG5hbF9sZW4pOworCisgICAgICBpZiAocnRwaDI2NHBheS0+c3Byb3BfcGFyYW1ldGVyX3NldHMgIT0gTlVMTCkgeworICAgICAgICAvKiBleHBsaWNpdGx5IHNldCBwcm9maWxlIGFuZCBzcHJvcCwgdXNlIHRob3NlICovCisgICAgICAgIGlmIChydHBoMjY0cGF5LT51cGRhdGVfY2FwcykgeworICAgICAgICAgIGlmICghZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLAorICAgICAgICAgICAgICAgICAgInNwcm9wLXBhcmFtZXRlci1zZXRzIiwgR19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgIHJ0cGgyNjRwYXktPnNwcm9wX3BhcmFtZXRlcl9zZXRzLCBOVUxMKSkKKyAgICAgICAgICAgIGdvdG8gY2Fwc19yZWplY3RlZDsKKworICAgICAgICAgIC8qIHBhcnNlIFNQUyBhbmQgUFBTIGZyb20gcHJvdmlkZWQgcGFyYW1ldGVyIHNldCAoZm9yIGluc2VydGlvbikgKi8KKyAgICAgICAgICBnc3RfcnRwX2gyNjRfcGF5X3BhcnNlX3Nwcm9wX3BhcmFtZXRlcl9zZXRzIChydHBoMjY0cGF5KTsKKworICAgICAgICAgIHJ0cGgyNjRwYXktPnVwZGF0ZV9jYXBzID0gRkFMU0U7CisKKyAgICAgICAgICBHU1RfREVCVUcgKCJvdXRjYXBzIHVwZGF0ZTogc3Byb3AtcGFyYW1ldGVyLXNldHM9JXMiLAorICAgICAgICAgICAgICBydHBoMjY0cGF5LT5zcHJvcF9wYXJhbWV0ZXJfc2V0cyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFdlIGtub3cgb3VyIHN0cmVhbSBpcyBhIHZhbGlkIEgyNjQgTkFMIHBhY2tldCwKKyAgICAgICAgICogZ28gcGFyc2UgaXQgZm9yIFNQUy9QUFMgdG8gZW5yaWNoIHRoZSBjYXBzICovCisgICAgICAgIC8qIG9yZGVyOiBtYWtlIHN1cmUgdG8gY2hlY2sgbmFsICovCisgICAgICAgIHVwZGF0ZSA9CisgICAgICAgICAgICBnc3RfcnRwX2gyNjRfcGF5X2RlY29kZV9uYWwgKHJ0cGgyNjRwYXksIGRhdGEsIG5hbF9sZW4sIGR0cywgcHRzKQorICAgICAgICAgICAgfHwgdXBkYXRlOworICAgICAgfQorICAgICAgLyogbW92ZSB0byBuZXh0IE5BTCBwYWNrZXQgKi8KKyAgICAgIGRhdGEgKz0gbmFsX2xlbjsKKyAgICAgIHNpemUgLT0gbmFsX2xlbjsKKworICAgICAgZ19hcnJheV9hcHBlbmRfdmFsIChuYWxfcXVldWUsIG5hbF9sZW4pOworICAgIH0KKworICAgIC8qIGlmIGhhcyBuZXcgU1BTICYgUFBTLCB1cGRhdGUgdGhlIG91dHB1dCBjYXBzICovCisgICAgaWYgKEdfVU5MSUtFTFkgKHVwZGF0ZSkpCisgICAgICBpZiAoIWdzdF9ydHBfaDI2NF9wYXlfc2V0X3Nwc19wcHMgKGJhc2VwYXlsb2FkKSkKKyAgICAgICAgZ290byBjYXBzX3JlamVjdGVkOworCisgICAgLyogc2Vjb25kIHBhc3MgdG8gcGF5bG9hZCBhbmQgcHVzaCAqLworCisgICAgaWYgKG5hbF9xdWV1ZS0+bGVuICE9IDApCisgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAocnRwaDI2NHBheS0+YWRhcHRlciwgc2tpcCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmFsX3F1ZXVlLT5sZW47IGkrKykgeworICAgICAgZ3VpbnQgc2l6ZTsKKyAgICAgIGdib29sZWFuIGVuZF9vZl9hdSA9IEZBTFNFOworCisgICAgICBuYWxfbGVuID0gZ19hcnJheV9pbmRleCAobmFsX3F1ZXVlLCBndWludCwgaSk7CisgICAgICAvKiBza2lwIHN0YXJ0IGNvZGUgKi8KKyAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChydHBoMjY0cGF5LT5hZGFwdGVyLCAzKTsKKworICAgICAgLyogVHJpbSB0aGUgZW5kIHVubGVzcyB3ZSdyZSB0aGUgbGFzdCBOQUwgaW4gdGhlIHN0cmVhbS4KKyAgICAgICAqIEluIGNhc2Ugd2UncmUgbm90IGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3ZSBrbm93IHRoZSBuZXh0IGJsb2NrCisgICAgICAgKiBzdGFydHMgd2l0aCAweDAwMDAwMSBzbyBhbGwgdGhlIDB4MDAgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGlzIG9uZSBhcmUKKyAgICAgICAqIHRyYWlsaW5nIDB4MCB0aGF0IGNhbiBiZSBkaXNjYXJkZWQgKi8KKyAgICAgIHNpemUgPSBuYWxfbGVuOworICAgICAgZGF0YSA9IGdzdF9hZGFwdGVyX21hcCAocnRwaDI2NHBheS0+YWRhcHRlciwgc2l6ZSk7CisgICAgICBpZiAoaSArIDEgIT0gbmFsX3F1ZXVlLT5sZW4gfHwgYnVmZmVyICE9IE5VTEwpCisgICAgICAgIGZvciAoOyBzaXplID4gMSAmJiBkYXRhW3NpemUgLSAxXSA9PSAweDA7IHNpemUtLSkKKyAgICAgICAgICAvKiBza2lwICovIDsKKworCisgICAgICAvKiBJZiBpdCdzIHRoZSBsYXN0IG5hbCB1bml0IHdlIGhhdmUgaW4gbm9uLWJ5dGVzdHJlYW0gbW9kZSwgd2UgY2FuCisgICAgICAgKiBhc3N1bWUgaXQncyB0aGUgZW5kIG9mIGFuIGFjY2Vzcy11bml0CisgICAgICAgKgorICAgICAgICogRklYTUU6IFdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgbmV4dCBwYWNrZXQgb3IgRU9TIHRvCisgICAgICAgKiBhY3R1YWxseSBwYXlsb2FkIHRoZSBOQUwgc28gd2UgY2FuIGtub3cgaWYgdGhlIGN1cnJlbnQgTkFMIGlzCisgICAgICAgKiB0aGUgbGFzdCBvbmUgb2YgYW4gYWNjZXNzIHVuaXQgb3Igbm90IGlmIHdlIGFyZSBpbiBieXRlc3RyZWFtIG1vZGUKKyAgICAgICAqLworICAgICAgaWYgKChydHBoMjY0cGF5LT5hbGlnbm1lbnQgPT0gR1NUX0gyNjRfQUxJR05NRU5UX0FVIHx8IGJ1ZmZlciA9PSBOVUxMKSAmJgorICAgICAgICAgIGkgPT0gbmFsX3F1ZXVlLT5sZW4gLSAxKQorICAgICAgICBlbmRfb2ZfYXUgPSBUUlVFOworICAgICAgcGF5YnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHJ0cGgyNjRwYXktPmFkYXB0ZXIsIHNpemUpOworICAgICAgZ19hc3NlcnQgKHBheWJ1Zik7CisKKyAgICAgIC8qIHB1dCB0aGUgZGF0YSBpbiBvbmUgb3IgbW9yZSBSVFAgcGFja2V0cyAqLworICAgICAgcmV0ID0KKyAgICAgICAgICBnc3RfcnRwX2gyNjRfcGF5X3BheWxvYWRfbmFsIChiYXNlcGF5bG9hZCwgcGF5YnVmLCBkdHMsIHB0cywKKyAgICAgICAgICBlbmRfb2ZfYXUsIHJ0cGgyNjRwYXktPmRlbHRhX3VuaXQsIHJ0cGgyNjRwYXktPmRpc2NvbnQpOworCisgICAgICBpZiAoZGVsYXllZF9ub3RfZGVsdGFfdW5pdCkgeworICAgICAgICBydHBoMjY0cGF5LT5kZWx0YV91bml0ID0gRkFMU0U7CisgICAgICAgIGRlbGF5ZWRfbm90X2RlbHRhX3VuaXQgPSBGQUxTRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIE9ubHkgdGhlIGZpcnN0IG91dGdvaW5nIHBhY2tldCBkb2Vzbid0IGhhdmUgdGhlIERFTFRBX1VOSVQgZmxhZyAqLworICAgICAgICBydHBoMjY0cGF5LT5kZWx0YV91bml0ID0gVFJVRTsKKyAgICAgIH0KKworICAgICAgaWYgKGRlbGF5ZWRfZGlzY29udCkgeworICAgICAgICBydHBoMjY0cGF5LT5kaXNjb250ID0gVFJVRTsKKyAgICAgICAgZGVsYXllZF9kaXNjb250ID0gRkFMU0U7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBPbmx5IHRoZSBmaXJzdCBvdXRnb2luZyBwYWNrZXQgaGF2ZSB0aGUgRElTQ09OVCBmbGFnICovCisgICAgICAgIHJ0cGgyNjRwYXktPmRpc2NvbnQgPSBGQUxTRTsKKyAgICAgIH0KKworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLyogbW92ZSB0byBuZXh0IE5BTCBwYWNrZXQgKi8KKyAgICAgIC8qIFNraXBzIHRoZSB0cmFpbGluZyB6ZXJvcyAqLworICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKHJ0cGgyNjRwYXktPmFkYXB0ZXIsIG5hbF9sZW4gLSBzaXplKTsKKyAgICB9CisgICAgZ19hcnJheV9zZXRfc2l6ZSAobmFsX3F1ZXVlLCAwKTsKKyAgfQorCitkb25lOgorICBpZiAoYXZjKSB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICB9IGVsc2UgeworICAgIGdzdF9hZGFwdGVyX3VubWFwIChydHBoMjY0cGF5LT5hZGFwdGVyKTsKKyAgfQorCisgIHJldHVybiByZXQ7CisKK2NhcHNfcmVqZWN0ZWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGJhc2VwYXlsb2FkLCAiQ291bGQgbm90IHNldCBvdXRjYXBzIik7CisgICAgZ19hcnJheV9zZXRfc2l6ZSAobmFsX3F1ZXVlLCAwKTsKKyAgICByZXQgPSBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2gyNjRfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnM7CisgIEdzdFJ0cEgyNjRQYXkgKnJ0cGgyNjRwYXkgPSBHU1RfUlRQX0gyNjRfUEFZIChwYXlsb2FkKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGgyNjRwYXktPmFkYXB0ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX0RPV05TVFJFQU06CisgICAgICBzID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUgKGV2ZW50KTsKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiR3N0Rm9yY2VLZXlVbml0IikpIHsKKyAgICAgICAgZ2Jvb2xlYW4gcmVzZW5kX2NvZGVjX2RhdGE7CisKKyAgICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2Jvb2xlYW4gKHMsICJhbGwtaGVhZGVycyIsCisgICAgICAgICAgICAgICAgJnJlc2VuZF9jb2RlY19kYXRhKSAmJiByZXNlbmRfY29kZWNfZGF0YSkKKyAgICAgICAgICBydHBoMjY0cGF5LT5zZW5kX3Nwc3BwcyA9IFRSVUU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgeworICAgICAgLyogY2FsbCBoYW5kbGVfYnVmZmVyIHdpdGggTlVMTCB0byBmbHVzaCBsYXN0IE5BTCBmcm9tIGFkYXB0ZXIKKyAgICAgICAqIGluIGJ5dGUtc3RyZWFtIG1vZGUKKyAgICAgICAqLworICAgICAgZ3N0X3J0cF9oMjY0X3BheV9oYW5kbGVfYnVmZmVyIChwYXlsb2FkLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9TVFJFQU1fU1RBUlQ6CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0cGF5LCAiTmV3IHN0cmVhbSBkZXRlY3RlZCA9PiBDbGVhciBTUFMgYW5kIFBQUyIpOworICAgICAgZ3N0X3J0cF9oMjY0X3BheV9jbGVhcl9zcHNfcHBzIChydHBoMjY0cGF5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJlcyA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChwYXlsb2FkLCBldmVudCk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2gyNjRfcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0UnRwSDI2NFBheSAqcnRwaDI2NHBheSA9IEdTVF9SVFBfSDI2NF9QQVkgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBydHBoMjY0cGF5LT5zZW5kX3Nwc3BwcyA9IEZBTFNFOworICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGgyNjRwYXktPmFkYXB0ZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIHJ0cGgyNjRwYXktPmxhc3Rfc3BzcHBzID0gLTE7CisgICAgICBnc3RfcnRwX2gyNjRfcGF5X2NsZWFyX3Nwc19wcHMgKHJ0cGgyNjRwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NF9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cEgyNjRQYXkgKnJ0cGgyNjRwYXk7CisKKyAgcnRwaDI2NHBheSA9IEdTVF9SVFBfSDI2NF9QQVkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1NQUk9QX1BBUkFNRVRFUl9TRVRTOgorICAgICAgZ19mcmVlIChydHBoMjY0cGF5LT5zcHJvcF9wYXJhbWV0ZXJfc2V0cyk7CisgICAgICBydHBoMjY0cGF5LT5zcHJvcF9wYXJhbWV0ZXJfc2V0cyA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgcnRwaDI2NHBheS0+dXBkYXRlX2NhcHMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NPTkZJR19JTlRFUlZBTDoKKyAgICAgIHJ0cGgyNjRwYXktPnNwc3Bwc19pbnRlcnZhbCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY0X3BheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwSDI2NFBheSAqcnRwaDI2NHBheTsKKworICBydHBoMjY0cGF5ID0gR1NUX1JUUF9IMjY0X1BBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU1BST1BfUEFSQU1FVEVSX1NFVFM6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBydHBoMjY0cGF5LT5zcHJvcF9wYXJhbWV0ZXJfc2V0cyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ09ORklHX0lOVEVSVkFMOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgcnRwaDI2NHBheS0+c3BzcHBzX2ludGVydmFsKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2NF9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBoMjY0cGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX0gyNjRfUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwaDI2NHBheS5oIGIvZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhNWU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwaDI2NHBheS5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9IMjY0X1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0gyNjRfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfSDI2NF9QQVkgXAorICAoZ3N0X3J0cF9oMjY0X3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0gyNjRfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0gyNjRfUEFZLEdzdFJ0cEgyNjRQYXkpKQorI2RlZmluZSBHU1RfUlRQX0gyNjRfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9IMjY0X1BBWSxHc3RSdHBIMjY0UGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0gyNjRfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0gyNjRfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9IMjY0X1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSDI2NF9QQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSDI2NFBheSBHc3RSdHBIMjY0UGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjRQYXlDbGFzcyBHc3RSdHBIMjY0UGF5Q2xhc3M7CisKK3R5cGVkZWYgZW51bQoreworICBHU1RfSDI2NF9TVFJFQU1fRk9STUFUX1VOS05PV04sCisgIEdTVF9IMjY0X1NUUkVBTV9GT1JNQVRfQllURVNUUkVBTSwKKyAgR1NUX0gyNjRfU1RSRUFNX0ZPUk1BVF9BVkMKK30gR3N0SDI2NFN0cmVhbUZvcm1hdDsKKwordHlwZWRlZiBlbnVtCit7CisgIEdTVF9IMjY0X0FMSUdOTUVOVF9VTktOT1dOLAorICBHU1RfSDI2NF9BTElHTk1FTlRfTkFMLAorICBHU1RfSDI2NF9BTElHTk1FTlRfQVUKK30gR3N0SDI2NEFsaWdubWVudDsKKworc3RydWN0IF9Hc3RSdHBIMjY0UGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkIHBheWxvYWQ7CisKKyAgZ3VpbnQgcHJvZmlsZTsKKyAgR1B0ckFycmF5ICpzcHMsICpwcHM7CisKKyAgR3N0SDI2NFN0cmVhbUZvcm1hdCBzdHJlYW1fZm9ybWF0OworICBHc3RIMjY0QWxpZ25tZW50IGFsaWdubWVudDsKKyAgZ3VpbnQgbmFsX2xlbmd0aF9zaXplOworICBHQXJyYXkgKnF1ZXVlOworCisgIGdjaGFyICpzcHJvcF9wYXJhbWV0ZXJfc2V0czsKKyAgZ2Jvb2xlYW4gdXBkYXRlX2NhcHM7CisKKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKKworICBnaW50IHNwc3Bwc19pbnRlcnZhbDsKKyAgZ2Jvb2xlYW4gc2VuZF9zcHNwcHM7CisgIEdzdENsb2NrVGltZSBsYXN0X3Nwc3BwczsKKworICAvKiBUUlVFIGlmIHRoZSBuZXh0IE5BTFUgcHJvY2Vzc2VkIHNob3VsZCBoYXZlIHRoZSBERUxUQV9VTklUIGZsYWcgKi8KKyAgZ2Jvb2xlYW4gZGVsdGFfdW5pdDsKKyAgLyogVFJVRSBpZiB0aGUgbmV4dCBOQUxVIHByb2Nlc3NlZCBzaG91bGQgaGF2ZSB0aGUgRElTQ09OVCBmbGFnICovCisgIGdib29sZWFuIGRpc2NvbnQ7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cEgyNjRQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfaDI2NF9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2gyNjRfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0gyNjRfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1M2RmZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmMKQEAgLTAsMCArMSwxNjE0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDE0PiBKdXJnZW4gU2xvd2FjayA8anVyZ2Vuc2xvd2Fja0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Yml0cmVhZGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlICJnc3RydHBoMjY1ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBoMjY1ZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cGgyNjVkZXBheV9kZWJ1ZykKKworLyogVGhpcyBpcyB3aGF0IHdlJ2xsIGRlZmF1bHQgdG8gd2hlbiBkb3duc3RyZWFtIGhhc24ndAorICogZXhwcmVzc2VkIGEgcmVzdHJpY3Rpb24gb3IgcHJlZmVyZW5jZSB2aWEgY2FwcyAqLworI2RlZmluZSBERUZBVUxUX1NUUkVBTV9GT1JNQVQgR1NUX0gyNjVfU1RSRUFNX0ZPUk1BVF9CWVRFU1RSRUFNCisjZGVmaW5lIERFRkFVTFRfQUNDRVNTX1VOSVQgICBGQUxTRQorCisvKiAzIHplcm8gYnl0ZXMgc3luY3dvcmQgKi8KK3N0YXRpYyBjb25zdCBndWludDggc3luY19ieXRlc1tdID0geyAwLCAwLCAwLCAxIH07CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2gyNjVfZGVwYXlfc3JjX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTCisgICAgKCJ2aWRlby94LWgyNjUsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylodmMxLCBhbGlnbm1lbnQ9KHN0cmluZylhdTsgIgorICAgICAgICAvKiBGSVhNRTogaGV2MSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCB5ZXQgKi8KKyAgICAgICAgLyogInZpZGVvL3gtaDI2NSwgIgorICAgICAgICAgICAic3RyZWFtLWZvcm1hdCA9IChzdHJpbmcpIGhldjEsIGFsaWdubWVudCA9IChzdHJpbmcpIGF1OyAiICovCisgICAgICAgICJ2aWRlby94LWgyNjUsICIKKyAgICAgICAgInN0cmVhbS1mb3JtYXQgPSAoc3RyaW5nKSBieXRlLXN0cmVhbSwgYWxpZ25tZW50ID0gKHN0cmluZykgeyBuYWwsIGF1IH0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2gyNjVfZGVwYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiSDI2NVwiIikKKyAgICAgICAgLyoqIG9wdGlvbmFsIHBhcmFtZXRlcnMgKiovCisgICAgLyogInByb2ZpbGUtc3BhY2UgPSAoaW50KSBbIDAsIDMgXSwgIiAqLworICAgIC8qICJwcm9maWxlLWlkID0gKGludCkgWyAwLCAzMSBdLCAiICovCisgICAgLyogInRpZXItZmxhZyA9IChpbnQpIFsgMCwgMSBdLCAiICovCisgICAgLyogImxldmVsLWlkID0gKGludCkgWyAwLCAyNTUgXSwgIiAqLworICAgIC8qICJpbnRlcm9wLWNvbnN0cmFpbnRzID0gKHN0cmluZykgQU5ZLCAiICovCisgICAgLyogInByb2ZpbGUtY29tcGF0aWJpbGl0eS1pbmRpY2F0b3IgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICAvKiAic3Byb3Atc3ViLWxheWVyLWlkID0gKGludCkgWyAwLCA2IF0sICIgKi8KKyAgICAvKiAicmVjdi1zdWItbGF5ZXItaWQgPSAoaW50KSBbIDAsIDYgXSwgIiAqLworICAgIC8qICJtYXgtcmVjdi1sZXZlbC1pZCA9IChpbnQpIFsgMCwgMjU1IF0sICIgKi8KKyAgICAvKiAidHgtbW9kZSA9IChzdHJpbmcpIHtNU1QgLCBTU1R9LCAiICovCisgICAgLyogInNwcm9wLXZwcyA9IChzdHJpbmcpIEFOWSwgIiAqLworICAgIC8qICJzcHJvcC1zcHMgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICAvKiAic3Byb3AtcHBzID0gKHN0cmluZykgQU5ZLCAiICovCisgICAgLyogInNwcm9wLXNlaSA9IChzdHJpbmcpIEFOWSwgIiAqLworICAgIC8qICJtYXgtbHNyID0gKGludCkgQU5ZLCAiICovLyogTVVTVCBiZSBpbiB0aGUgcmFuZ2Ugb2YgTWF4THVtYVNSIHRvIDE2ICogTWF4THVtYVNSLCBpbmNsdXNpdmUgKi8KKyAgICAvKiAibWF4LWxwcyA9IChpbnQpIEFOWSwgIiAqLy8qIE1VU1QgYmUgaW4gdGhlIHJhbmdlIG9mIE1heEx1bWFQUyB0byAxNiAqIE1heEx1bWFQUywgaW5jbHVzaXZlICovCisgICAgLyogIm1heC1jcGIgPSAoaW50KSBBTlksICIgKi8vKiBNVVNUIGJlIGluIHRoZSByYW5nZSBvZiBNYXhDUEIgdG8gMTYgKiBNYXhDUEIsIGluY2x1c2l2ZSAqLworICAgIC8qICJtYXgtZHBiID0gKGludCkgWzEsIDE2XSwgIiAqLworICAgIC8qICJtYXgtYnIgPSAoaW50KSBBTlksICIgKi8vKiBNVVNUIGJlIGluIHRoZSByYW5nZSBvZiBNYXhCUiB0byAxNiAqIE1heEJSLCBpbmNsdXNpdmUsIGZvciB0aGUgaGlnaGVzdCBsZXZlbCAqLworICAgIC8qICJtYXgtdHIgPSAoaW50KSBBTlksICIgKi8vKiBNVVNUIGJlIGluIHRoZSByYW5nZSBvZiBNYXhUaWxlUm93cyB0byAxNiAqIE1heFRpbGVSb3dzLCBpbmNsdXNpdmUsIGZvciB0aGUgaGlnaGVzdCBsZXZlbCAqLworICAgIC8qICJtYXgtdGMgPSAoaW50KSBBTlksICIgKi8vKiBNVVNUIGJlIGluIHRoZSByYW5nZSBvZiBNYXhUaWxlQ29scyB0byAxNiAqIE1heFRpbGVDb2xzLCBpbmNsdXNpdmUsIGZvciB0aGUgaGlnaGVzdCBsZXZlbCAqLworICAgIC8qICJtYXgtZnBzID0gKGludCkgQU5ZLCAiICovCisgICAgLyogInNwcm9wLW1heC1kb24tZGlmZiA9IChpbnQpIFswLCAzMjc2N10sICIgKi8KKyAgICAvKiAic3Byb3AtZGVwYWNrLWJ1Zi1uYWx1cyA9IChpbnQpIFswLCAzMjc2N10sICIgKi8KKyAgICAvKiAic3Byb3AtZGVwYWNrLWJ1Zi1uYWx1cyA9IChpbnQpIFswLCA0Mjk0OTY3Mjk1XSwgIiAqLworICAgIC8qICJkZXBhY2stYnVmLWNhcCA9IChpbnQpIFsxLCA0Mjk0OTY3Mjk1XSwgIiAqLworICAgIC8qICJzcHJvcC1zZWdtZW50YXRpb24taWQgPSAoaW50KSBbMCwgM10sICIgKi8KKyAgICAvKiAic3Byb3Atc3BhdGlhbC1zZWdtZW50YXRpb24taWRjID0gKHN0cmluZykgQU5ZLCAiICovCisgICAgLyogImRlYy1wYXJhbGxlbC1jYXAgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICApOworCisjZGVmaW5lIGdzdF9ydHBfaDI2NV9kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBIMjY1RGVwYXksIGdzdF9ydHBfaDI2NV9kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2gyNjVfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9oMjY1X2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfaDI2NV9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9oMjY1X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBmaWx0ZXIsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfaDI2NV9kZXBheV9oYW5kbGVfZXZlbnQgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheSwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NV9kZXBheV9jbGFzc19pbml0IChHc3RSdHBIMjY1RGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX2gyNjVfZGVwYXlfZmluYWxpemU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9oMjY1X2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfaDI2NV9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBIMjY1IGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBIMjY1IHZpZGVvIGZyb20gUlRQIHBhY2tldHMgKFJGQyA3Nzk4KSIsCisgICAgICAiSnVyZ2VuIFNsb3dhY2sgPGp1cmdlbnNsb3dhY2tAZ21haWwuY29tPiIpOworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfcnRwX2gyNjVfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfaDI2NV9kZXBheV9wcm9jZXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfaDI2NV9kZXBheV9zZXRjYXBzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5oYW5kbGVfZXZlbnQgPSBnc3RfcnRwX2gyNjVfZGVwYXlfaGFuZGxlX2V2ZW50OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY1X2RlcGF5X2luaXQgKEdzdFJ0cEgyNjVEZXBheSAqIHJ0cGgyNjVkZXBheSkKK3sKKyAgcnRwaDI2NWRlcGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworICBydHBoMjY1ZGVwYXktPnBpY3R1cmVfYWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKKyAgcnRwaDI2NWRlcGF5LT5vdXRwdXRfZm9ybWF0ID0gREVGQVVMVF9TVFJFQU1fRk9STUFUOworICBydHBoMjY1ZGVwYXktPmJ5dGVfc3RyZWFtID0KKyAgICAgIChERUZBVUxUX1NUUkVBTV9GT1JNQVQgPT0gR1NUX0gyNjVfU1RSRUFNX0ZPUk1BVF9CWVRFU1RSRUFNKTsKKyAgcnRwaDI2NWRlcGF5LT5zdHJlYW1fZm9ybWF0ID0gTlVMTDsKKyAgcnRwaDI2NWRlcGF5LT5tZXJnZSA9IERFRkFVTFRfQUNDRVNTX1VOSVQ7CisgIHJ0cGgyNjVkZXBheS0+dnBzID0gZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jICgKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgIHJ0cGgyNjVkZXBheS0+c3BzID0gZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jICgKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgIHJ0cGgyNjVkZXBheS0+cHBzID0gZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jICgKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjVfZGVwYXlfcmVzZXQgKEdzdFJ0cEgyNjVEZXBheSAqIHJ0cGgyNjVkZXBheSwgZ2Jvb2xlYW4gaGFyZCkKK3sKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGgyNjVkZXBheS0+YWRhcHRlcik7CisgIHJ0cGgyNjVkZXBheS0+d2FpdF9zdGFydCA9IFRSVUU7CisgIGdzdF9hZGFwdGVyX2NsZWFyIChydHBoMjY1ZGVwYXktPnBpY3R1cmVfYWRhcHRlcik7CisgIHJ0cGgyNjVkZXBheS0+cGljdHVyZV9zdGFydCA9IEZBTFNFOworICBydHBoMjY1ZGVwYXktPmxhc3Rfa2V5ZnJhbWUgPSBGQUxTRTsKKyAgcnRwaDI2NWRlcGF5LT5sYXN0X3RzID0gMDsKKyAgcnRwaDI2NWRlcGF5LT5jdXJyZW50X2Z1X3R5cGUgPSAwOworICBydHBoMjY1ZGVwYXktPm5ld19jb2RlY19kYXRhID0gRkFMU0U7CisgIGdfcHRyX2FycmF5X3NldF9zaXplIChydHBoMjY1ZGVwYXktPnZwcywgMCk7CisgIGdfcHRyX2FycmF5X3NldF9zaXplIChydHBoMjY1ZGVwYXktPnNwcywgMCk7CisgIGdfcHRyX2FycmF5X3NldF9zaXplIChydHBoMjY1ZGVwYXktPnBwcywgMCk7CisKKyAgaWYgKGhhcmQpIHsKKyAgICBpZiAocnRwaDI2NWRlcGF5LT5hbGxvY2F0b3IgIT0gTlVMTCkgeworICAgICAgZ3N0X29iamVjdF91bnJlZiAocnRwaDI2NWRlcGF5LT5hbGxvY2F0b3IpOworICAgICAgcnRwaDI2NWRlcGF5LT5hbGxvY2F0b3IgPSBOVUxMOworICAgIH0KKyAgICBnc3RfYWxsb2NhdGlvbl9wYXJhbXNfaW5pdCAoJnJ0cGgyNjVkZXBheS0+cGFyYW1zKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY1X2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSdHBIMjY1RGVwYXkgKnJ0cGgyNjVkZXBheTsKKworICBydHBoMjY1ZGVwYXkgPSBHU1RfUlRQX0gyNjVfREVQQVkgKG9iamVjdCk7CisKKyAgaWYgKHJ0cGgyNjVkZXBheS0+Y29kZWNfZGF0YSkKKyAgICBnc3RfYnVmZmVyX3VucmVmIChydHBoMjY1ZGVwYXktPmNvZGVjX2RhdGEpOworCisgIGdfb2JqZWN0X3VucmVmIChydHBoMjY1ZGVwYXktPmFkYXB0ZXIpOworICBnX29iamVjdF91bnJlZiAocnRwaDI2NWRlcGF5LT5waWN0dXJlX2FkYXB0ZXIpOworCisgIGdfcHRyX2FycmF5X2ZyZWUgKHJ0cGgyNjVkZXBheS0+dnBzLCBUUlVFKTsKKyAgZ19wdHJfYXJyYXlfZnJlZSAocnRwaDI2NWRlcGF5LT5zcHMsIFRSVUUpOworICBnX3B0cl9hcnJheV9mcmVlIChydHBoMjY1ZGVwYXktPnBwcywgVFJVRSk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGdjaGFyICoKK3N0cmVhbV9mb3JtYXRfZ2V0X25pY2sgKEdzdEgyNjVTdHJlYW1Gb3JtYXQgZm10KQoreworICBzd2l0Y2ggKGZtdCkgeworICAgIGNhc2UgR1NUX0gyNjVfU1RSRUFNX0ZPUk1BVF9CWVRFU1RSRUFNOgorICAgICAgcmV0dXJuICJieXRlLXN0cmVhbSI7CisgICAgY2FzZSBHU1RfSDI2NV9TVFJFQU1fRk9STUFUX0hWQzE6CisgICAgICByZXR1cm4gImh2YzEiOworICAgIGNhc2UgR1NUX0gyNjVfU1RSRUFNX0ZPUk1BVF9IRVYxOgorICAgICAgcmV0dXJuICJoZXYxIjsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuICJ1bmtub3duIjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NV9kZXBheV9uZWdvdGlhdGUgKEdzdFJ0cEgyNjVEZXBheSAqIHJ0cGgyNjVkZXBheSkKK3sKKyAgR3N0SDI2NVN0cmVhbUZvcm1hdCBzdHJlYW1fZm9ybWF0ID0gR1NUX0gyNjVfU1RSRUFNX0ZPUk1BVF9VTktOT1dOOworICBHc3RDYXBzICpjYXBzOworICBnaW50IG1lcmdlID0gLTE7CisKKyAgY2FwcyA9CisgICAgICBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChydHBoMjY1ZGVwYXkpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1ZGVwYXksICJhbGxvd2VkIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICBpZiAoY2FwcykgeworICAgIGlmIChnc3RfY2Fwc19nZXRfc2l6ZSAoY2FwcykgPiAwKSB7CisgICAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgICAgIGNvbnN0IGdjaGFyICpzdHIgPSBOVUxMOworCisgICAgICBpZiAoKHN0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgInN0cmVhbS1mb3JtYXQiKSkpIHsKKyAgICAgICAgcnRwaDI2NWRlcGF5LT5zdHJlYW1fZm9ybWF0ID0gZ19pbnRlcm5fc3RyaW5nIChzdHIpOworCisgICAgICAgIGlmIChzdHJjbXAgKHN0ciwgImhldjEiKSA9PSAwKSB7CisgICAgICAgICAgc3RyZWFtX2Zvcm1hdCA9IEdTVF9IMjY1X1NUUkVBTV9GT1JNQVRfSEVWMTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAgKHN0ciwgImh2YzEiKSA9PSAwKSB7CisgICAgICAgICAgc3RyZWFtX2Zvcm1hdCA9IEdTVF9IMjY1X1NUUkVBTV9GT1JNQVRfSFZDMTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAgKHN0ciwgImJ5dGUtc3RyZWFtIikgPT0gMCkgeworICAgICAgICAgIHN0cmVhbV9mb3JtYXQgPSBHU1RfSDI2NV9TVFJFQU1fRk9STUFUX0JZVEVTVFJFQU07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LCAidW5rbm93biBzdHJlYW0tZm9ybWF0OiAlcyIsIHN0cik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKChzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJhbGlnbm1lbnQiKSkpIHsKKyAgICAgICAgaWYgKHN0cmNtcCAoc3RyLCAiYXUiKSA9PSAwKSB7CisgICAgICAgICAgbWVyZ2UgPSBUUlVFOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCAoc3RyLCAibmFsIikgPT0gMCkgeworICAgICAgICAgIG1lcmdlID0gRkFMU0U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LCAidW5rbm93biBhbGlnbm1lbnQ6ICVzIiwgc3RyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIH0KKworICBpZiAoc3RyZWFtX2Zvcm1hdCAhPSBHU1RfSDI2NV9TVFJFQU1fRk9STUFUX1VOS05PV04pIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1ZGVwYXksICJkb3duc3RyZWFtIHdhbnRzIHN0cmVhbS1mb3JtYXQgJXMiLAorICAgICAgICBzdHJlYW1fZm9ybWF0X2dldF9uaWNrIChzdHJlYW1fZm9ybWF0KSk7CisgICAgcnRwaDI2NWRlcGF5LT5vdXRwdXRfZm9ybWF0ID0gc3RyZWFtX2Zvcm1hdDsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1ZGVwYXksICJkZWZhdWx0aW5nIHRvIG91dHB1dCBzdHJlYW0tZm9ybWF0ICVzIiwKKyAgICAgICAgc3RyZWFtX2Zvcm1hdF9nZXRfbmljayAoREVGQVVMVF9TVFJFQU1fRk9STUFUKSk7CisgICAgcnRwaDI2NWRlcGF5LT5zdHJlYW1fZm9ybWF0ID0KKyAgICAgICAgc3RyZWFtX2Zvcm1hdF9nZXRfbmljayAoREVGQVVMVF9TVFJFQU1fRk9STUFUKTsKKyAgICBydHBoMjY1ZGVwYXktPm91dHB1dF9mb3JtYXQgPSBERUZBVUxUX1NUUkVBTV9GT1JNQVQ7CisgIH0KKyAgcnRwaDI2NWRlcGF5LT5ieXRlX3N0cmVhbSA9CisgICAgICAocnRwaDI2NWRlcGF5LT5vdXRwdXRfZm9ybWF0ID09IEdTVF9IMjY1X1NUUkVBTV9GT1JNQVRfQllURVNUUkVBTSk7CisKKyAgaWYgKG1lcmdlICE9IC0xKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LCAiZG93bnN0cmVhbSByZXF1aXJlcyBtZXJnZSAlZCIsIG1lcmdlKTsKKyAgICBydHBoMjY1ZGVwYXktPm1lcmdlID0gbWVyZ2U7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LCAiZGVmYXVsdGluZyB0byBtZXJnZSAlZCIsCisgICAgICAgIERFRkFVTFRfQUNDRVNTX1VOSVQpOworICAgIHJ0cGgyNjVkZXBheS0+bWVyZ2UgPSBERUZBVUxUX0FDQ0VTU19VTklUOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcGFyc2Vfc3BzIChHc3RNYXBJbmZvICogbWFwLCBndWludDMyICogc3BzX2lkKQoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUbyBwYXJzZSBzZXFfcGFyYW1ldGVyX3NldF9pZCAqLworICBHc3RCaXRSZWFkZXIgYnIgPSBHU1RfQklUX1JFQURFUl9JTklUIChtYXAtPmRhdGEgKyAxNSwKKyAgICAgIG1hcC0+c2l6ZSAtIDE1KTsKKworICBHU1RfTUVNRFVNUCAoIlNQUyIsIG1hcC0+ZGF0YSwgbWFwLT5zaXplKTsKKworICBpZiAobWFwLT5zaXplIDwgMTYpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9yZWFkX2dvbG9tYiAoJmJyLCBzcHNfaWQpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitwYXJzZV9wcHMgKEdzdE1hcEluZm8gKiBtYXAsIGd1aW50MzIgKiBzcHNfaWQsIGd1aW50MzIgKiBwcHNfaWQpCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRvIHBhcnNlIHBpY3R1cmVfcGFyYW1ldGVyX3NldF9pZCAqLworICBHc3RCaXRSZWFkZXIgYnIgPSBHU1RfQklUX1JFQURFUl9JTklUIChtYXAtPmRhdGEgKyAyLAorICAgICAgbWFwLT5zaXplIC0gMik7CisKKyAgR1NUX01FTURVTVAgKCJQUFMiLCBtYXAtPmRhdGEsIG1hcC0+c2l6ZSk7CisKKyAgaWYgKG1hcC0+c2l6ZSA8IDMpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9yZWFkX2dvbG9tYiAoJmJyLCBwcHNfaWQpKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKCFnc3RfcnRwX3JlYWRfZ29sb21iICgmYnIsIHNwc19pZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2NV9kZXBheV9zZXRfb3V0cHV0X2NhcHMgKEdzdFJ0cEgyNjVEZXBheSAqIHJ0cGgyNjVkZXBheSwKKyAgICBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0QWxsb2NhdGlvblBhcmFtcyBwYXJhbXM7CisgIEdzdEFsbG9jYXRvciAqYWxsb2NhdG9yID0gTlVMTDsKKyAgR3N0UGFkICpzcmNwYWQ7CisgIGdib29sZWFuIHJlczsKKworICBnc3RfYWxsb2NhdGlvbl9wYXJhbXNfaW5pdCAoJnBhcmFtcyk7CisKKyAgc3JjcGFkID0gR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKHJ0cGgyNjVkZXBheSk7CisKKyAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoc3JjcGFkLCBjYXBzKTsKKworICBpZiAocmVzKSB7CisgICAgR3N0UXVlcnkgKnF1ZXJ5OworCisgICAgcXVlcnkgPSBnc3RfcXVlcnlfbmV3X2FsbG9jYXRpb24gKGNhcHMsIFRSVUUpOworICAgIGlmICghZ3N0X3BhZF9wZWVyX3F1ZXJ5IChzcmNwYWQsIHF1ZXJ5KSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LCAiZG93bnN0cmVhbSBBTExPQ0FUSU9OIHF1ZXJ5IGZhaWxlZCIpOworICAgIH0KKworICAgIGlmIChnc3RfcXVlcnlfZ2V0X25fYWxsb2NhdGlvbl9wYXJhbXMgKHF1ZXJ5KSA+IDApIHsKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9udGhfYWxsb2NhdGlvbl9wYXJhbSAocXVlcnksIDAsICZhbGxvY2F0b3IsICZwYXJhbXMpOworICAgIH0KKworICAgIGdzdF9xdWVyeV91bnJlZiAocXVlcnkpOworICB9CisKKyAgaWYgKHJ0cGgyNjVkZXBheS0+YWxsb2NhdG9yKQorICAgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cGgyNjVkZXBheS0+YWxsb2NhdG9yKTsKKworICBydHBoMjY1ZGVwYXktPmFsbG9jYXRvciA9IGFsbG9jYXRvcjsKKyAgcnRwaDI2NWRlcGF5LT5wYXJhbXMgPSBwYXJhbXM7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2gyNjVfc2V0X3NyY19jYXBzIChHc3RSdHBIMjY1RGVwYXkgKiBydHBoMjY1ZGVwYXkpCit7CisgIGdib29sZWFuIHJlcywgdXBkYXRlX2NhcHM7CisgIEdzdENhcHMgKm9sZF9jYXBzOworICBHc3RDYXBzICpzcmNjYXBzOworICBHc3RQYWQgKnNyY3BhZDsKKworICBpZiAoIXJ0cGgyNjVkZXBheS0+Ynl0ZV9zdHJlYW0gJiYKKyAgICAgICghcnRwaDI2NWRlcGF5LT5uZXdfY29kZWNfZGF0YSB8fAorICAgICAgICAgIHJ0cGgyNjVkZXBheS0+dnBzLT5sZW4gPT0gMCB8fCBydHBoMjY1ZGVwYXktPnNwcy0+bGVuID09IDAKKyAgICAgICAgICB8fCBydHBoMjY1ZGVwYXktPnBwcy0+bGVuID09IDApKQorICAgIHJldHVybiBUUlVFOworCisgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1oMjY1IiwKKyAgICAgICJzdHJlYW0tZm9ybWF0IiwgR19UWVBFX1NUUklORywgcnRwaDI2NWRlcGF5LT5zdHJlYW1fZm9ybWF0LAorICAgICAgImFsaWdubWVudCIsIEdfVFlQRV9TVFJJTkcsIHJ0cGgyNjVkZXBheS0+bWVyZ2UgPyAiYXUiIDogIm5hbCIsIE5VTEwpOworCisgIGlmICghcnRwaDI2NWRlcGF5LT5ieXRlX3N0cmVhbSkgeworICAgIEdzdEJ1ZmZlciAqY29kZWNfZGF0YTsKKyAgICBnaW50IGkgPSAwOworICAgIGdpbnQgbGVuOworICAgIGd1aW50IG51bV92cHMgPSBydHBoMjY1ZGVwYXktPnZwcy0+bGVuOworICAgIGd1aW50IG51bV9zcHMgPSBydHBoMjY1ZGVwYXktPnNwcy0+bGVuOworICAgIGd1aW50IG51bV9wcHMgPSBydHBoMjY1ZGVwYXktPnBwcy0+bGVuOworICAgIEdzdE1hcEluZm8gbWFwLCBuYWxtYXA7CisgICAgZ3VpbnQ4ICpkYXRhOworICAgIGd1aW50OCBudW1fYXJyYXlzID0gMDsKKyAgICBndWludCBuZXdfc2l6ZTsKKyAgICBHc3RCaXRSZWFkZXIgYnI7CisgICAgZ3VpbnQzMiB0bXA7CisgICAgZ3VpbnQ4IHRtcDggPSAwOworICAgIGd1aW50MzIgbWF4X3N1Yl9sYXllcnNfbWludXMxLCB0ZW1wb3JhbF9pZF9uZXN0aW5nX2ZsYWcsIGNocm9tYV9mb3JtYXRfaWRjLAorICAgICAgICBiaXRfZGVwdGhfbHVtYV9taW51czgsIGJpdF9kZXB0aF9jaHJvbWFfbWludXM4LAorICAgICAgICBtaW5fc3BhdGlhbF9zZWdtZW50YXRpb25faWRjOworCisgICAgLyogRml4bWU6IEN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgbm90IGVtYmVkZGluZyBTRUkgaW4gY29kZWNfZGF0YSAqLworCisgICAgaWYgKG51bV9zcHMgPT0gMCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIC8qIHN0YXJ0IHdpdGggMjMgYnl0ZXMgaGVhZGVyICovCisgICAgbGVuID0gMjM7CisKKyAgICBudW1fYXJyYXlzID0gKG51bV92cHMgPiAwKSArIChudW1fc3BzID4gMCkgKyAobnVtX3BwcyA+IDApOworICAgIGxlbiArPSAzICogbnVtX2FycmF5czsKKworICAgIC8qIGFkZCBzaXplIG9mIHZwcywgc3BzICYgcHBzICovCisgICAgZm9yIChpID0gMDsgaSA8IG51bV92cHM7IGkrKykKKyAgICAgIGxlbiArPSAyICsgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjVkZXBheS0+dnBzLCBpKSk7CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9zcHM7IGkrKykKKyAgICAgIGxlbiArPSAyICsgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjVkZXBheS0+c3BzLCBpKSk7CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9wcHM7IGkrKykKKyAgICAgIGxlbiArPSAyICsgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjVkZXBheS0+cHBzLCBpKSk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1ZGVwYXksCisgICAgICAgICJjb25zdHJ1Y3RpbmcgY29kZWNfZGF0YTogbnVtX3ZwcyA9JWQgbnVtX3Nwcz0lZCwgbnVtX3Bwcz0lZCIsIG51bV92cHMsCisgICAgICAgIG51bV9zcHMsIG51bV9wcHMpOworCisgICAgY29kZWNfZGF0YSA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobGVuKTsKKyAgICBnc3RfYnVmZmVyX21hcCAoY29kZWNfZGF0YSwgJm1hcCwgR1NUX01BUF9SRUFEV1JJVEUpOworICAgIGRhdGEgPSBtYXAuZGF0YTsKKworICAgIG1lbXNldCAoZGF0YSwgMCwgbWFwLnNpemUpOworCisgICAgLyogUGFyc2luZyBzcHMgdG8gZ2V0IHRoZSBpbmZvIHJlcXVpcmVkIGZ1cnRoZXIgb24gKi8KKworICAgIGdzdF9idWZmZXJfbWFwIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NWRlcGF5LT5zcHMsIDApLCAmbmFsbWFwLAorICAgICAgICBHU1RfTUFQX1JFQUQpOworCisgICAgbWF4X3N1Yl9sYXllcnNfbWludXMxID0gKChuYWxtYXAuZGF0YVsyXSkgPj4gMSkgJiAweDA3OworICAgIHRlbXBvcmFsX2lkX25lc3RpbmdfZmxhZyA9IG5hbG1hcC5kYXRhWzJdICYgMHgwMTsKKworICAgIGdzdF9iaXRfcmVhZGVyX2luaXQgKCZiciwgbmFsbWFwLmRhdGEgKyAxNSwgbmFsbWFwLnNpemUgLSAxNSk7CisKKyAgICBnc3RfcnRwX3JlYWRfZ29sb21iICgmYnIsICZ0bXApOyAgICAvKiBzcHNfc2VxX3BhcmFtZXRlcl9zZXRfaWQgKi8KKyAgICBnc3RfcnRwX3JlYWRfZ29sb21iICgmYnIsICZjaHJvbWFfZm9ybWF0X2lkYyk7ICAgICAgLyogY2hyb21hX2Zvcm1hdF9pZGMgKi8KKworICAgIGlmIChjaHJvbWFfZm9ybWF0X2lkYyA9PSAzKQorCisgICAgICBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoJmJyLCAmdG1wOCwgMSk7ICAgIC8qIHNlcGFyYXRlX2NvbG91cl9wbGFuZV9mbGFnICovCisKKyAgICBnc3RfcnRwX3JlYWRfZ29sb21iICgmYnIsICZ0bXApOyAgICAvKiBwaWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzICovCisgICAgZ3N0X3J0cF9yZWFkX2dvbG9tYiAoJmJyLCAmdG1wKTsgICAgLyogcGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXMgKi8KKworICAgIGdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4ICgmYnIsICZ0bXA4LCAxKTsgICAgICAvKiBjb25mb3JtYW5jZV93aW5kb3dfZmxhZyAqLworICAgIGlmICh0bXA4KSB7CisgICAgICBnc3RfcnRwX3JlYWRfZ29sb21iICgmYnIsICZ0bXApOyAgLyogY29uZl93aW5fbGVmdF9vZmZzZXQgKi8KKyAgICAgIGdzdF9ydHBfcmVhZF9nb2xvbWIgKCZiciwgJnRtcCk7ICAvKiBjb25mX3dpbl9yaWdodF9vZmZzZXQgKi8KKyAgICAgIGdzdF9ydHBfcmVhZF9nb2xvbWIgKCZiciwgJnRtcCk7ICAvKiBjb25mX3dpbl90b3Bfb2Zmc2V0ICovCisgICAgICBnc3RfcnRwX3JlYWRfZ29sb21iICgmYnIsICZ0bXApOyAgLyogY29uZl93aW5fYm90dG9tX29mZnNldCAqLworICAgIH0KKworICAgIGdzdF9ydHBfcmVhZF9nb2xvbWIgKCZiciwgJmJpdF9kZXB0aF9sdW1hX21pbnVzOCk7ICAvKiBiaXRfZGVwdGhfbHVtYV9taW51czggKi8KKyAgICBnc3RfcnRwX3JlYWRfZ29sb21iICgmYnIsICZiaXRfZGVwdGhfY2hyb21hX21pbnVzOCk7ICAgICAgICAvKiBiaXRfZGVwdGhfY2hyb21hX21pbnVzOCAqLworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LAorICAgICAgICAiSWdub3JpbmcgbWluX3NwYXRpYWxfc2VnbWVudGF0aW9uIGZvciBub3cgKGFzc3VtaW5nIHplcm8pIik7CisKKyAgICBtaW5fc3BhdGlhbF9zZWdtZW50YXRpb25faWRjID0gMDsgICAvKiBOT1RFIC0gd2UgaWdub3JlIHRoaXMgZm9yIG5vdywgYnV0IGluIGEgcGVyZmVjdCB3b3JsZCwgd2Ugc2hvdWxkIGNvbnRpbnVlIHBhcnNpbmcgdG8gb2J0YWluIHRoZSByZWFsIHZhbHVlICovCisKKyAgICBnc3RfYnVmZmVyX3VubWFwIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NWRlcGF5LT5zcHMsIDApLCAmbmFsbWFwKTsKKworICAgIC8qIEhFVkNEZWNvZGVyQ29uZmlndXJhdGlvblZlcnNpb24gPSAxICovCisgICAgZGF0YVswXSA9IDE7CisKKyAgICAvKiBDb3B5IGZyb20gcHJvZmlsZV90aWVyX2xldmVsIChSZWMuIElUVS1UIEguMjY1ICgwNC8yMDEzKSBzZWN0aW9uIDcuMy4zCisgICAgICoKKyAgICAgKiBwcm9maWxlX3NwYWNlIHwgdGllcl9mbGF0IHwgcHJvZmlsZV9pZGMgfAorICAgICAqIHByb2ZpbGVfY29tcGF0aWJpbGl0eV9mbGFncyB8IGNvbnN0cmFpbnRfaW5kaWNhdG9yX2ZsYWdzIHwKKyAgICAgKiBsZXZlbF9pZGMgfCBwcm9ncmVzc2l2ZV9zb3VyY2VfZmxhZyB8IGludGVybGFjZWRfc291cmNlX2ZsYWcKKyAgICAgKiBub25fcGFja2VkX2NvbnN0cmFpbnRfZmxhZyB8IGZyYW1lX29ubHlfY29uc3RyYWludF9mbGFnCisgICAgICogcmVzZXJ2ZWRfemVyb180NGJpdHMgfCBsZXZlbF9pZGMgKi8KKyAgICBnc3RfYnVmZmVyX21hcCAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjVkZXBheS0+c3BzLCAwKSwgJm5hbG1hcCwKKyAgICAgICAgR1NUX01BUF9SRUFEKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykKKyAgICAgIGRhdGFbaSArIDFdID0gbmFsbWFwLmRhdGFbaV07CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjVkZXBheS0+c3BzLCAwKSwgJm5hbG1hcCk7CisKKyAgICAvKiBtaW5fc3BhdGlhbF9zZWdtZW50YXRpb25faWRjICovCisgICAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoZGF0YSArIDEzLCBtaW5fc3BhdGlhbF9zZWdtZW50YXRpb25faWRjKTsKKyAgICBkYXRhWzEzXSB8PSAweGYwOworICAgIGRhdGFbMTVdID0gMHhmYzsgICAgICAgICAgICAvKiBrZWVwaW5nIHBhcnJhbGxlbGlzbVR5cGUgYXMgemVybyAodW5rbm93bikgKi8KKyAgICBkYXRhWzE2XSA9IDB4ZmMgfCBjaHJvbWFfZm9ybWF0X2lkYzsKKyAgICBkYXRhWzE3XSA9IDB4ZjggfCBiaXRfZGVwdGhfbHVtYV9taW51czg7CisgICAgZGF0YVsxOF0gPSAweGY4IHwgYml0X2RlcHRoX2Nocm9tYV9taW51czg7CisgICAgZGF0YVsxOV0gPSAweDAwOyAgICAgICAgICAgIC8qIGtlZXAgYXZnRnJhbWVSYXRlIGFzIHVuc3BlY2lmaWVkICovCisgICAgZGF0YVsyMF0gPSAweDAwOyAgICAgICAgICAgIC8qIGtlZXAgYXZnRnJhbWVSYXRlIGFzIHVuc3BlY2lmaWVkICovCisgICAgLyogY29uc3RGcmFtZVJhdGUoMiBiaXRzKTogMCwgc3RyZWFtIG1heSBvciBtYXkgbm90IGJlIG9mIGNvbnN0YW50IGZyYW1lcmF0ZQorICAgICAqIG51bVRlbXBvcmFsTGF5ZXJzICgzIGJpdHMpOiBudW1iZXIgb2YgdGVtcG9yYWwgbGF5ZXJzLCB2YWx1ZSBmcm9tIFNQUworICAgICAqIFRlbXBvcmFsSWROZXN0ZWQgKDEgYml0KTogc3BzX3RlbXBvcmFsX2lkX25lc3RpbmdfZmxhZyBmcm9tIFNQUworICAgICAqIGxlbmd0aFNpemVNaW51c09uZSAoMiBiaXRzKTogcGx1cyAxIGluZGljYXRlcyB0aGUgbGVuZ3RoIG9mIHRoZSBOQUxVbml0TGVuZ3RoICovCisgICAgLyogd2UgYWx3YXlzIG91dHB1dCBOQUxzIHdpdGggNC1ieXRlIG5hbCB1bml0IGxlbmd0aCBtYXJrZXJzIChvciBzeW5jIGNvZGUpICovCisgICAgZGF0YVsyMV0gPSBydHBoMjY1ZGVwYXktPmJ5dGVfc3RyZWFtID8gMHgwMCA6IDB4MDM7CisgICAgZGF0YVsyMV0gfD0gKChtYXhfc3ViX2xheWVyc19taW51czEgKyAxKSA8PCAzKTsKKyAgICBkYXRhWzIxXSB8PSAodGVtcG9yYWxfaWRfbmVzdGluZ19mbGFnIDw8IDIpOworICAgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDIyLCBudW1fYXJyYXlzKTsgICAgLyogbnVtT2ZBcnJheXMgKi8KKworICAgIGRhdGEgKz0gMjM7CisKKyAgICAvKiBjb3B5IGFsbCBWUFMgKi8KKyAgICBpZiAobnVtX3ZwcyA+IDApIHsKKyAgICAgIC8qIGFycmF5X2NvbXBsZXRlbmVzcyB8IHJlc2VydmVkX3plcm8gYml0IHwgbmFsX3VuaXRfdHlwZSAqLworICAgICAgZGF0YVswXSA9IDB4MDAgfCAweDIwOworICAgICAgZGF0YSsrOworCisgICAgICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhLCBudW1fdnBzKTsKKyAgICAgIGRhdGEgKz0gMjsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG51bV92cHM7IGkrKykgeworICAgICAgICBnc2l6ZSBuYWxfc2l6ZSA9CisgICAgICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NWRlcGF5LT52cHMsIGkpKTsKKyAgICAgICAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoZGF0YSwgbmFsX3NpemUpOworICAgICAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKGdfcHRyX2FycmF5X2luZGV4IChydHBoMjY1ZGVwYXktPnZwcywgaSksIDAsCisgICAgICAgICAgICBkYXRhICsgMiwgbmFsX3NpemUpOworICAgICAgICBkYXRhICs9IDIgKyBuYWxfc2l6ZTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LCAiQ29waWVkIFZQUyAlZCBvZiBsZW5ndGggJXUiLCBpLAorICAgICAgICAgICAgKGd1aW50KSBuYWxfc2l6ZSk7CisgICAgICB9CisgICAgfQorCisgICAgLyogY29weSBhbGwgU1BTICovCisgICAgaWYgKG51bV9zcHMgPiAwKSB7CisgICAgICAvKiBhcnJheV9jb21wbGV0ZW5lc3MgfCByZXNlcnZlZF96ZXJvIGJpdCB8IG5hbF91bml0X3R5cGUgKi8KKyAgICAgIGRhdGFbMF0gPSAweDAwIHwgMHgyMTsKKyAgICAgIGRhdGErKzsKKworICAgICAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoZGF0YSwgbnVtX3Nwcyk7CisgICAgICBkYXRhICs9IDI7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc3BzOyBpKyspIHsKKyAgICAgICAgZ3NpemUgbmFsX3NpemUgPQorICAgICAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjVkZXBheS0+c3BzLCBpKSk7CisgICAgICAgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEsIG5hbF9zaXplKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NWRlcGF5LT5zcHMsIGkpLCAwLAorICAgICAgICAgICAgZGF0YSArIDIsIG5hbF9zaXplKTsKKyAgICAgICAgZGF0YSArPSAyICsgbmFsX3NpemU7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVkZXBheSwgIkNvcGllZCBTUFMgJWQgb2YgbGVuZ3RoICV1IiwgaSwKKyAgICAgICAgICAgIChndWludCkgbmFsX3NpemUpOworICAgICAgfQorICAgIH0KKworICAgIC8qIGNvcHkgYWxsIFBQUyAqLworICAgIGlmIChudW1fcHBzID4gMCkgeworICAgICAgLyogYXJyYXlfY29tcGxldGVuZXNzIHwgcmVzZXJ2ZWRfemVybyBiaXQgfCBuYWxfdW5pdF90eXBlICovCisgICAgICBkYXRhWzBdID0gMHgwMCB8IDB4MjI7CisgICAgICBkYXRhKys7CisKKyAgICAgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEsIG51bV9wcHMpOworICAgICAgZGF0YSArPSAyOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BwczsgaSsrKSB7CisgICAgICAgIGdzaXplIG5hbF9zaXplID0KKyAgICAgICAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGdfcHRyX2FycmF5X2luZGV4IChydHBoMjY1ZGVwYXktPnBwcywgaSkpOworICAgICAgICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhLCBuYWxfc2l6ZSk7CisgICAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjVkZXBheS0+cHBzLCBpKSwgMCwKKyAgICAgICAgICAgIGRhdGEgKyAyLCBuYWxfc2l6ZSk7CisgICAgICAgIGRhdGEgKz0gMiArIG5hbF9zaXplOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1ZGVwYXksICJDb3BpZWQgUFBTICVkIG9mIGxlbmd0aCAldSIsIGksCisgICAgICAgICAgICAoZ3VpbnQpIG5hbF9zaXplKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBuZXdfc2l6ZSA9IGRhdGEgLSBtYXAuZGF0YTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChjb2RlY19kYXRhLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3NldF9zaXplIChjb2RlY19kYXRhLCBuZXdfc2l6ZSk7CisKKyAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChzcmNjYXBzLAorICAgICAgICAiY29kZWNfZGF0YSIsIEdTVF9UWVBFX0JVRkZFUiwgY29kZWNfZGF0YSwgTlVMTCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoY29kZWNfZGF0YSk7CisgIH0KKworICBzcmNwYWQgPSBHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NSQ1BBRCAocnRwaDI2NWRlcGF5KTsKKworICBvbGRfY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoc3JjcGFkKTsKKyAgaWYgKG9sZF9jYXBzICE9IE5VTEwpIHsKKworICAgIC8qIE9ubHkgdXBkYXRlIHRoZSBjYXBzIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC4gRm9yCisgICAgICogQVZDIHdlIGRvbid0IHVwZGF0ZSBjYXBzIGlmIG9ubHkgdGhlIGNvZGVjX2RhdGEKKyAgICAgKiBjaGFuZ2VzLiBUaGlzIGlzIHRoZSBzYW1lIGJlaGF2aW91ciBhcyBpbiBoMjY0cGFyc2UKKyAgICAgKiBhbmQgZ3N0cnRwaDI2NGRlcGF5CisgICAgICovCisgICAgaWYgKHJ0cGgyNjVkZXBheS0+Ynl0ZV9zdHJlYW0pIHsKKyAgICAgIHVwZGF0ZV9jYXBzID0gIWdzdF9jYXBzX2lzX2VxdWFsIChzcmNjYXBzLCBvbGRfY2Fwcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdzdENhcHMgKnRtcF9jYXBzID0gZ3N0X2NhcHNfY29weSAoc3JjY2Fwcyk7CisgICAgICBHc3RTdHJ1Y3R1cmUgKm9sZF9zLCAqdG1wX3M7CisKKyAgICAgIG9sZF9zID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAob2xkX2NhcHMsIDApOworICAgICAgdG1wX3MgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlICh0bXBfY2FwcywgMCk7CisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKG9sZF9zLCAiY29kZWNfZGF0YSIpKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAodG1wX3MsICJjb2RlY19kYXRhIiwKKyAgICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChvbGRfcywgImNvZGVjX2RhdGEiKSk7CisKKyAgICAgIHVwZGF0ZV9jYXBzID0gIWdzdF9jYXBzX2lzX2VxdWFsIChvbGRfY2FwcywgdG1wX2NhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKHRtcF9jYXBzKTsKKyAgICB9CisgICAgZ3N0X2NhcHNfdW5yZWYgKG9sZF9jYXBzKTsKKyAgfSBlbHNlIHsKKyAgICB1cGRhdGVfY2FwcyA9IFRSVUU7CisgIH0KKworICBpZiAodXBkYXRlX2NhcHMpIHsKKyAgICByZXMgPSBnc3RfcnRwX2gyNjVfZGVwYXlfc2V0X291dHB1dF9jYXBzIChydHBoMjY1ZGVwYXksIHNyY2NhcHMpOworICB9IGVsc2UgeworICAgIHJlcyA9IFRSVUU7CisgIH0KKworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgLyogSW5zZXJ0IFNQUyBhbmQgUFBTIGludG8gdGhlIHN0cmVhbSBvbiBuZXh0IG9wcG9ydHVuaXR5ICovCisgIGlmIChydHBoMjY1ZGVwYXktPm91dHB1dF9mb3JtYXQgIT0gR1NUX0gyNjVfU1RSRUFNX0ZPUk1BVF9IVkMxCisgICAgICAmJiAocnRwaDI2NWRlcGF5LT5zcHMtPmxlbiA+IDAgfHwgcnRwaDI2NWRlcGF5LT5wcHMtPmxlbiA+IDApKSB7CisgICAgZ2ludCBpOworICAgIEdzdEJ1ZmZlciAqY29kZWNfZGF0YTsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBndWludDggKmRhdGE7CisgICAgZ3VpbnQgbGVuID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBydHBoMjY1ZGVwYXktPnNwcy0+bGVuOyBpKyspIHsKKyAgICAgIGxlbiArPSA0ICsgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjVkZXBheS0+c3BzLCBpKSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHJ0cGgyNjVkZXBheS0+cHBzLT5sZW47IGkrKykgeworICAgICAgbGVuICs9IDQgKyBnc3RfYnVmZmVyX2dldF9zaXplIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NWRlcGF5LT5wcHMsIGkpKTsKKyAgICB9CisKKyAgICBjb2RlY19kYXRhID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChsZW4pOworICAgIGdzdF9idWZmZXJfbWFwIChjb2RlY19kYXRhLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICBkYXRhID0gbWFwLmRhdGE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcnRwaDI2NWRlcGF5LT5zcHMtPmxlbjsgaSsrKSB7CisgICAgICBHc3RCdWZmZXIgKnNwc19idWYgPSBnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NWRlcGF5LT5zcHMsIGkpOworICAgICAgZ3VpbnQgc3BzX3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChzcHNfYnVmKTsKKworICAgICAgaWYgKHJ0cGgyNjVkZXBheS0+Ynl0ZV9zdHJlYW0pCisgICAgICAgIG1lbWNweSAoZGF0YSwgc3luY19ieXRlcywgc2l6ZW9mIChzeW5jX2J5dGVzKSk7CisgICAgICBlbHNlCisgICAgICAgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEsIHNwc19zaXplKTsKKyAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoc3BzX2J1ZiwgMCwgZGF0YSArIDQsIC0xKTsKKyAgICAgIGRhdGEgKz0gNCArIHNwc19zaXplOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBydHBoMjY1ZGVwYXktPnBwcy0+bGVuOyBpKyspIHsKKyAgICAgIEdzdEJ1ZmZlciAqcHBzX2J1ZiA9IGdfcHRyX2FycmF5X2luZGV4IChydHBoMjY1ZGVwYXktPnBwcywgaSk7CisgICAgICBndWludCBwcHNfc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKHBwc19idWYpOworCisgICAgICBpZiAocnRwaDI2NWRlcGF5LT5ieXRlX3N0cmVhbSkKKyAgICAgICAgbWVtY3B5IChkYXRhLCBzeW5jX2J5dGVzLCBzaXplb2YgKHN5bmNfYnl0ZXMpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSwgcHBzX3NpemUpOworICAgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChwcHNfYnVmLCAwLCBkYXRhICsgNCwgLTEpOworICAgICAgZGF0YSArPSA0ICsgcHBzX3NpemU7CisgICAgfQorCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoY29kZWNfZGF0YSwgJm1hcCk7CisgICAgaWYgKHJ0cGgyNjVkZXBheS0+Y29kZWNfZGF0YSkKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHJ0cGgyNjVkZXBheS0+Y29kZWNfZGF0YSk7CisgICAgcnRwaDI2NWRlcGF5LT5jb2RlY19kYXRhID0gY29kZWNfZGF0YTsKKyAgfQorCisgIGlmIChyZXMpCisgICAgcnRwaDI2NWRlcGF5LT5uZXdfY29kZWNfZGF0YSA9IEZBTFNFOworCisgIHJldHVybiByZXM7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2gyNjVfYWRkX3Zwc19zcHNfcHBzIChHc3RFbGVtZW50ICogcnRwaDI2NSwgR1B0ckFycmF5ICogdnBzX2FycmF5LAorICAgIEdQdHJBcnJheSAqIHNwc19hcnJheSwgR1B0ckFycmF5ICogcHBzX2FycmF5LCBHc3RCdWZmZXIgKiBuYWwpCit7CisgIEdzdE1hcEluZm8gbWFwOworICBndWNoYXIgdHlwZTsKKyAgZ3VpbnQgaTsKKworICBnc3RfYnVmZmVyX21hcCAobmFsLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIHR5cGUgPSAobWFwLmRhdGFbMF0gPj4gMSkgJiAweDNmOworCisgIGlmICh0eXBlID09IEdTVF9IMjY1X1ZQU19OVVQpIHsKKyAgICBndWludDMyIHZwc19pZCA9IChtYXAuZGF0YVsyXSA+PiA0KSAmIDB4MGY7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdnBzX2FycmF5LT5sZW47IGkrKykgeworICAgICAgR3N0QnVmZmVyICp2cHMgPSBnX3B0cl9hcnJheV9pbmRleCAodnBzX2FycmF5LCBpKTsKKyAgICAgIEdzdE1hcEluZm8gdnBzbWFwOworICAgICAgZ3VpbnQzMiB0bXBfdnBzX2lkOworCisgICAgICBnc3RfYnVmZmVyX21hcCAodnBzLCAmdnBzbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgdG1wX3Zwc19pZCA9ICh2cHNtYXAuZGF0YVsyXSA+PiA0KSAmIDB4MGY7CisKKyAgICAgIGlmICh2cHNfaWQgPT0gdG1wX3Zwc19pZCkgeworICAgICAgICBpZiAobWFwLnNpemUgPT0gdnBzbWFwLnNpemUgJiYKKyAgICAgICAgICAgIG1lbWNtcCAobWFwLmRhdGEsIHZwc21hcC5kYXRhLCB2cHNtYXAuc2l6ZSkgPT0gMCkgeworICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBoMjY1LCAiVW5jaGFuZ2VkIFZQUyAldSwgbm90IHVwZGF0aW5nIiwgdnBzX2lkKTsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VubWFwICh2cHMsICZ2cHNtYXApOworICAgICAgICAgIGdvdG8gZHJvcDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VubWFwICh2cHMsICZ2cHNtYXApOworICAgICAgICAgIGdfcHRyX2FycmF5X3JlbW92ZV9pbmRleF9mYXN0ICh2cHNfYXJyYXksIGkpOworICAgICAgICAgIGdfcHRyX2FycmF5X2FkZCAodnBzX2FycmF5LCBuYWwpOworICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBoMjY1LCAiTW9kaWZpZWQgVlBTICV1LCByZXBsYWNpbmciLCB2cHNfaWQpOworICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAodnBzLCAmdnBzbWFwKTsKKyAgICB9CisgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGgyNjUsICJBZGRpbmcgbmV3IFZQUyAldSIsIHZwc19pZCk7CisgICAgZ19wdHJfYXJyYXlfYWRkICh2cHNfYXJyYXksIG5hbCk7CisgIH0gZWxzZSBpZiAodHlwZSA9PSBHU1RfSDI2NV9TUFNfTlVUKSB7CisgICAgZ3VpbnQzMiBzcHNfaWQ7CisKKyAgICBpZiAoIXBhcnNlX3NwcyAoJm1hcCwgJnNwc19pZCkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwaDI2NSwgIkludmFsaWQgU1BTLCIKKyAgICAgICAgICAiIGNhbid0IHBhcnNlIHNlcV9wYXJhbWV0ZXJfc2V0X2lkIik7CisgICAgICBnb3RvIGRyb3A7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHNwc19hcnJheS0+bGVuOyBpKyspIHsKKyAgICAgIEdzdEJ1ZmZlciAqc3BzID0gZ19wdHJfYXJyYXlfaW5kZXggKHNwc19hcnJheSwgaSk7CisgICAgICBHc3RNYXBJbmZvIHNwc21hcDsKKyAgICAgIGd1aW50MzIgdG1wX3Nwc19pZDsKKworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKHNwcywgJnNwc21hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgIHBhcnNlX3NwcyAoJnNwc21hcCwgJnRtcF9zcHNfaWQpOworCisgICAgICBpZiAoc3BzX2lkID09IHRtcF9zcHNfaWQpIHsKKyAgICAgICAgaWYgKG1hcC5zaXplID09IHNwc21hcC5zaXplICYmCisgICAgICAgICAgICBtZW1jbXAgKG1hcC5kYXRhLCBzcHNtYXAuZGF0YSwgc3BzbWFwLnNpemUpID09IDApIHsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2NSwgIlVuY2hhbmdlZCBTUFMgJXUsIG5vdCB1cGRhdGluZyIsIHNwc19pZCk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoc3BzLCAmc3BzbWFwKTsKKyAgICAgICAgICBnb3RvIGRyb3A7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoc3BzLCAmc3BzbWFwKTsKKyAgICAgICAgICBnX3B0cl9hcnJheV9yZW1vdmVfaW5kZXhfZmFzdCAoc3BzX2FycmF5LCBpKTsKKyAgICAgICAgICBnX3B0cl9hcnJheV9hZGQgKHNwc19hcnJheSwgbmFsKTsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2NSwgIk1vZGlmaWVkIFNQUyAldSwgcmVwbGFjaW5nIiwgc3BzX2lkKTsKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKHNwcywgJnNwc21hcCk7CisgICAgfQorICAgIEdTVF9MT0dfT0JKRUNUIChydHBoMjY1LCAiQWRkaW5nIG5ldyBTUFMgJXUiLCBzcHNfaWQpOworICAgIGdfcHRyX2FycmF5X2FkZCAoc3BzX2FycmF5LCBuYWwpOworICB9IGVsc2UgaWYgKHR5cGUgPT0gR1NUX0gyNjVfUFBTX05VVCkgeworICAgIGd1aW50MzIgc3BzX2lkOworICAgIGd1aW50MzIgcHBzX2lkOworCisgICAgaWYgKCFwYXJzZV9wcHMgKCZtYXAsICZzcHNfaWQsICZwcHNfaWQpKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cGgyNjUsICJJbnZhbGlkIFBQUywiCisgICAgICAgICAgIiBjYW4ndCBwYXJzZSBzZXFfcGFyYW1ldGVyX3NldF9pZCBvciBwaWNfcGFyYW1ldGVyX3NldF9pZCIpOworICAgICAgZ290byBkcm9wOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBwcHNfYXJyYXktPmxlbjsgaSsrKSB7CisgICAgICBHc3RCdWZmZXIgKnBwcyA9IGdfcHRyX2FycmF5X2luZGV4IChwcHNfYXJyYXksIGkpOworICAgICAgR3N0TWFwSW5mbyBwcHNtYXA7CisgICAgICBndWludDMyIHRtcF9zcHNfaWQ7CisgICAgICBndWludDMyIHRtcF9wcHNfaWQ7CisKKworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKHBwcywgJnBwc21hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgIHBhcnNlX3BwcyAoJnBwc21hcCwgJnRtcF9zcHNfaWQsICZ0bXBfcHBzX2lkKTsKKworICAgICAgaWYgKHBwc19pZCA9PSB0bXBfcHBzX2lkKSB7CisgICAgICAgIGlmIChtYXAuc2l6ZSA9PSBwcHNtYXAuc2l6ZSAmJgorICAgICAgICAgICAgbWVtY21wIChtYXAuZGF0YSwgcHBzbWFwLmRhdGEsIHBwc21hcC5zaXplKSA9PSAwKSB7CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGgyNjUsICJVbmNoYW5nZWQgUFBTICV1OiV1LCBub3QgdXBkYXRpbmciLCBzcHNfaWQsCisgICAgICAgICAgICAgIHBwc19pZCk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAocHBzLCAmcHBzbWFwKTsKKyAgICAgICAgICBnb3RvIGRyb3A7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAocHBzLCAmcHBzbWFwKTsKKyAgICAgICAgICBnX3B0cl9hcnJheV9yZW1vdmVfaW5kZXhfZmFzdCAocHBzX2FycmF5LCBpKTsKKyAgICAgICAgICBnX3B0cl9hcnJheV9hZGQgKHBwc19hcnJheSwgbmFsKTsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2NSwgIk1vZGlmaWVkIFBQUyAldToldSwgcmVwbGFjaW5nIiwKKyAgICAgICAgICAgICAgc3BzX2lkLCBwcHNfaWQpOworICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAocHBzLCAmcHBzbWFwKTsKKyAgICB9CisgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGgyNjUsICJBZGRpbmcgbmV3IFBQUyAldTolaSIsIHNwc19pZCwgcHBzX2lkKTsKKyAgICBnX3B0cl9hcnJheV9hZGQgKHBwc19hcnJheSwgbmFsKTsKKyAgfSBlbHNlIHsKKyAgICBnb3RvIGRyb3A7CisgIH0KKworZG9uZToKKyAgZ3N0X2J1ZmZlcl91bm1hcCAobmFsLCAmbWFwKTsKKworICByZXR1cm4gVFJVRTsKKworZHJvcDoKKyAgZ3N0X2J1ZmZlcl91bm1hcCAobmFsLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAobmFsKTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NV9kZXBheV9hZGRfdnBzX3Nwc19wcHMgKEdzdFJ0cEgyNjVEZXBheSAqIHJ0cGgyNjVkZXBheSwKKyAgICBHc3RCdWZmZXIgKiBuYWwpCit7CisgIGlmIChnc3RfcnRwX2gyNjVfYWRkX3Zwc19zcHNfcHBzIChHU1RfRUxFTUVOVCAocnRwaDI2NWRlcGF5KSwKKyAgICAgICAgICBydHBoMjY1ZGVwYXktPnZwcywgcnRwaDI2NWRlcGF5LT5zcHMsIHJ0cGgyNjVkZXBheS0+cHBzLCBuYWwpKQorICAgIHJ0cGgyNjVkZXBheS0+bmV3X2NvZGVjX2RhdGEgPSBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2NV9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2ludCBjbG9ja19yYXRlOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBHc3RSdHBIMjY1RGVwYXkgKnJ0cGgyNjVkZXBheTsKKyAgY29uc3QgZ2NoYXIgKnZwczsKKyAgY29uc3QgZ2NoYXIgKnNwczsKKyAgY29uc3QgZ2NoYXIgKnBwczsKKyAgZ2NoYXIgKnBzOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ4ICpwdHI7CisKKyAgcnRwaDI2NWRlcGF5ID0gR1NUX1JUUF9IMjY1X0RFUEFZIChkZXBheWxvYWQpOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSA5MDAwMDsKKyAgZGVwYXlsb2FkLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICAvKiBCYXNlNjQgZW5jb2RlZCwgY29tbWEgc2VwYXJhdGVkIGNvbmZpZyBOQUxzICovCisgIHZwcyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAic3Byb3AtdnBzIik7CisgIHNwcyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAic3Byb3Atc3BzIik7CisgIHBwcyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAic3Byb3AtcHBzIik7CisgIGlmICh2cHMgPT0gTlVMTCB8fCBzcHMgPT0gTlVMTCB8fCBwcHMgPT0gTlVMTCkgeworICAgIHBzID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICBwcyA9IGdfc3RyZHVwX3ByaW50ZiAoIiVzLCVzLCVzIiwgdnBzLCBzcHMsIHBwcyk7CisgIH0KKworICAvKiBuZWdvdGlhdGUgd2l0aCBkb3duc3RyZWFtIHcuci50LiBvdXRwdXQgZm9ybWF0IGFuZCBhbGlnbm1lbnQgKi8KKyAgZ3N0X3J0cF9oMjY1X2RlcGF5X25lZ290aWF0ZSAocnRwaDI2NWRlcGF5KTsKKworICBpZiAocnRwaDI2NWRlcGF5LT5ieXRlX3N0cmVhbSAmJiBwcyAhPSBOVUxMKSB7CisgICAgLyogZm9yIGJ5dGVzdHJlYW0gd2Ugb25seSBuZWVkIHRoZSBwYXJhbWV0ZXIgc2V0cyBidXQgd2UgZG9uJ3QgZXJyb3Igb3V0CisgICAgICogd2hlbiB0aGV5IGFyZSBub3QgdGhlcmUsIHdlIGFzc3VtZSB0aGV5IGFyZSBpbiB0aGUgc3RyZWFtLiAqLworICAgIGdjaGFyICoqcGFyYW1zOworICAgIEdzdEJ1ZmZlciAqY29kZWNfZGF0YTsKKyAgICBndWludCBsZW4sIHRvdGFsOworICAgIGdpbnQgaTsKKworICAgIHBhcmFtcyA9IGdfc3Ryc3BsaXQgKHBzLCAiLCIsIDApOworCisgICAgLyogY291bnQgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGluIGJhc2U2NC4gQWxzbyBpbmNsdWRlIHRoZSBzeW5jIGJ5dGVzIGluCisgICAgICogZnJvbnQgb2YgdGhlIHBhcmFtcy4gKi8KKyAgICBsZW4gPSAwOworICAgIGZvciAoaSA9IDA7IHBhcmFtc1tpXTsgaSsrKSB7CisgICAgICBsZW4gKz0gc3RybGVuIChwYXJhbXNbaV0pOworICAgICAgbGVuICs9IHNpemVvZiAoc3luY19ieXRlcyk7CisgICAgfQorICAgIC8qIHdlIHNlcmlvdXNseSBvdmVyc2hvb3QgdGhlIGxlbmd0aCwgYnV0IGl0J3MgZmluZS4gKi8KKyAgICBjb2RlY19kYXRhID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChsZW4pOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKGNvZGVjX2RhdGEsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgIHB0ciA9IG1hcC5kYXRhOworICAgIHRvdGFsID0gMDsKKyAgICBmb3IgKGkgPSAwOyBwYXJhbXNbaV07IGkrKykgeworICAgICAgZ3VpbnQgc2F2ZSA9IDA7CisgICAgICBnaW50IHN0YXRlID0gMDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAiZGVjb2RpbmcgcGFyYW0gJWQgKCVzKSIsIGksIHBhcmFtc1tpXSk7CisgICAgICBtZW1jcHkgKHB0ciwgc3luY19ieXRlcywgc2l6ZW9mIChzeW5jX2J5dGVzKSk7CisgICAgICBwdHIgKz0gc2l6ZW9mIChzeW5jX2J5dGVzKTsKKyAgICAgIGxlbiA9CisgICAgICAgICAgZ19iYXNlNjRfZGVjb2RlX3N0ZXAgKHBhcmFtc1tpXSwgc3RybGVuIChwYXJhbXNbaV0pLCBwdHIsICZzdGF0ZSwKKyAgICAgICAgICAmc2F2ZSk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsICJkZWNvZGVkICVkIGJ5dGVzIiwgbGVuKTsKKyAgICAgIHRvdGFsICs9IGxlbiArIHNpemVvZiAoc3luY19ieXRlcyk7CisgICAgICBwdHIgKz0gbGVuOworICAgIH0KKyAgICBnc3RfYnVmZmVyX3VubWFwIChjb2RlY19kYXRhLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3Jlc2l6ZSAoY29kZWNfZGF0YSwgMCwgdG90YWwpOworICAgIGdfc3RyZnJlZXYgKHBhcmFtcyk7CisKKyAgICAvKiBrZWVwIHRoZSBjb2RlY19kYXRhLCB3ZSBuZWVkIHRvIHNlbmQgaXQgYXMgdGhlIGZpcnN0IGJ1ZmZlci4gV2UgY2Fubm90CisgICAgICogcHVzaCBpdCBpbiB0aGUgYWRhcHRlciBiZWNhdXNlIHRoZSBhZGFwdGVyIG1pZ2h0IGJlIGZsdXNoZWQgb24gZGlzY29udC4KKyAgICAgKi8KKyAgICBpZiAocnRwaDI2NWRlcGF5LT5jb2RlY19kYXRhKQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocnRwaDI2NWRlcGF5LT5jb2RlY19kYXRhKTsKKyAgICBydHBoMjY1ZGVwYXktPmNvZGVjX2RhdGEgPSBjb2RlY19kYXRhOworICB9IGVsc2UgaWYgKCFydHBoMjY1ZGVwYXktPmJ5dGVfc3RyZWFtKSB7CisgICAgZ2NoYXIgKipwYXJhbXM7CisgICAgZ2ludCBpOworCisgICAgaWYgKHBzID09IE5VTEwpCisgICAgICBnb3RvIGluY29tcGxldGVfY2FwczsKKworICAgIHBhcmFtcyA9IGdfc3Ryc3BsaXQgKHBzLCAiLCIsIDApOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAid2UgaGF2ZSAlZCBwYXJhbXMiLCBnX3N0cnZfbGVuZ3RoIChwYXJhbXMpKTsKKworICAgIC8qIHN0YXJ0IHdpdGggMjMgYnl0ZXMgaGVhZGVyICovCisgICAgZm9yIChpID0gMDsgcGFyYW1zW2ldOyBpKyspIHsKKyAgICAgIEdzdEJ1ZmZlciAqbmFsOworICAgICAgR3N0TWFwSW5mbyBuYWxtYXA7CisgICAgICBnc2l6ZSBuYWxfbGVuOworICAgICAgZ3VpbnQgc2F2ZSA9IDA7CisgICAgICBnaW50IHN0YXRlID0gMDsKKworICAgICAgbmFsX2xlbiA9IHN0cmxlbiAocGFyYW1zW2ldKTsKKyAgICAgIGlmIChuYWxfbGVuID09IDApIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZXBheWxvYWQsICJlbXB0eSBwYXJhbSAnJXMnICgjJWQpIiwgcGFyYW1zW2ldLCBpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBuYWwgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG5hbF9sZW4pOworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKG5hbCwgJm5hbG1hcCwgR1NUX01BUF9SRUFEV1JJVEUpOworCisgICAgICBuYWxfbGVuID0KKyAgICAgICAgICBnX2Jhc2U2NF9kZWNvZGVfc3RlcCAocGFyYW1zW2ldLCBuYWxfbGVuLCBuYWxtYXAuZGF0YSwgJnN0YXRlLCAmc2F2ZSk7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgImFkZGluZyBwYXJhbSAlZCBhcyAlcyIsIGksCisgICAgICAgICAgKCgobmFsbWFwLmRhdGFbMF0gPj4gMSkgJiAweDNmKSA9PQorICAgICAgICAgICAgICAzMikgPyAiVlBTIiA6ICgoKG5hbG1hcC5kYXRhWzBdID4+IDEpICYgMHgzZikgPT0KKyAgICAgICAgICAgICAgMzMpID8gIlNQUyIgOiAiUFBTIik7CisKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKG5hbCwgJm5hbG1hcCk7CisgICAgICBnc3RfYnVmZmVyX3NldF9zaXplIChuYWwsIG5hbF9sZW4pOworCisgICAgICBnc3RfcnRwX2gyNjVfZGVwYXlfYWRkX3Zwc19zcHNfcHBzIChydHBoMjY1ZGVwYXksIG5hbCk7CisgICAgfQorICAgIGdfc3RyZnJlZXYgKHBhcmFtcyk7CisKKyAgICBpZiAocnRwaDI2NWRlcGF5LT52cHMtPmxlbiA9PSAwIHx8IHJ0cGgyNjVkZXBheS0+c3BzLT5sZW4gPT0gMCB8fAorICAgICAgICBydHBoMjY1ZGVwYXktPnBwcy0+bGVuID09IDApIHsKKyAgICAgIGdvdG8gaW5jb21wbGV0ZV9jYXBzOworICAgIH0KKyAgfQorCisgIGdfZnJlZSAocHMpOworCisgIHJldHVybiBnc3RfcnRwX2gyNjVfc2V0X3NyY19jYXBzIChydHBoMjY1ZGVwYXkpOworCisgIC8qIEVSUk9SUyAqLworaW5jb21wbGV0ZV9jYXBzOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAid2UgaGF2ZSBpbmNvbXBsZXRlIGNhcHMsIgorICAgICAgICAiIGRvaW5nIHNldGNhcHMgbGF0ZXIiKTsKKyAgICBnX2ZyZWUgKHBzKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfaDI2NV9kZXBheV9hbGxvY2F0ZV9vdXRwdXRfYnVmZmVyIChHc3RSdHBIMjY1RGVwYXkgKiBkZXBheSwgZ3NpemUgc2l6ZSkKK3sKKyAgR3N0QnVmZmVyICpidWZmZXIgPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzaXplID4gMCwgTlVMTCk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRlcGF5LCAid2FudCBvdXRwdXQgYnVmZmVyIG9mICV1IGJ5dGVzIiwgKGd1aW50KSBzaXplKTsKKworICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoZGVwYXktPmFsbG9jYXRvciwgc2l6ZSwgJmRlcGF5LT5wYXJhbXMpOworICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGRlcGF5LCAiY291bGRuJ3QgYWxsb2NhdGUgb3V0cHV0IGJ1ZmZlciIpOworICAgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCBzaXplLCBOVUxMKTsKKyAgfQorCisgIHJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9oMjY1X2NvbXBsZXRlX2F1IChHc3RSdHBIMjY1RGVwYXkgKiBydHBoMjY1ZGVwYXksCisgICAgR3N0Q2xvY2tUaW1lICogb3V0X3RpbWVzdGFtcCwgZ2Jvb2xlYW4gKiBvdXRfa2V5ZnJhbWUpCit7CisgIEdzdEJ1ZmZlckxpc3QgKmxpc3Q7CisgIEdzdE1hcEluZm8gb3V0bWFwOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ3VpbnQgb3V0c2l6ZSwgb2Zmc2V0ID0gMDsKKyAgZ2ludCBiLCBuX2J1ZnMsIG0sIG5fbWVtOworCisgIC8qIHdlIGhhZCBhIHBpY3R1cmUgaW4gdGhlIGFkYXB0ZXIgYW5kIHdlIGNvbXBsZXRlZCBpdCAqLworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1ZGVwYXksICJ0YWtpbmcgY29tcGxldGVkIEFVIik7CisgIG91dHNpemUgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHJ0cGgyNjVkZXBheS0+cGljdHVyZV9hZGFwdGVyKTsKKworICBvdXRidWYgPSBnc3RfcnRwX2gyNjVfZGVwYXlfYWxsb2NhdGVfb3V0cHV0X2J1ZmZlciAocnRwaDI2NWRlcGF5LCBvdXRzaXplKTsKKworICBpZiAob3V0YnVmID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmb3V0bWFwLCBHU1RfTUFQX1dSSVRFKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBsaXN0ID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXJfbGlzdCAocnRwaDI2NWRlcGF5LT5waWN0dXJlX2FkYXB0ZXIsIG91dHNpemUpOworCisgIG5fYnVmcyA9IGdzdF9idWZmZXJfbGlzdF9sZW5ndGggKGxpc3QpOworICBmb3IgKGIgPSAwOyBiIDwgbl9idWZzOyArK2IpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZiA9IGdzdF9idWZmZXJfbGlzdF9nZXQgKGxpc3QsIGIpOworCisgICAgbl9tZW0gPSBnc3RfYnVmZmVyX25fbWVtb3J5IChidWYpOworICAgIGZvciAobSA9IDA7IG0gPCBuX21lbTsgKyttKSB7CisgICAgICBHc3RNZW1vcnkgKm1lbSA9IGdzdF9idWZmZXJfcGVla19tZW1vcnkgKGJ1ZiwgbSk7CisgICAgICBnc2l6ZSBtZW1fc2l6ZSA9IGdzdF9tZW1vcnlfZ2V0X3NpemVzIChtZW0sIE5VTEwsIE5VTEwpOworICAgICAgR3N0TWFwSW5mbyBtZW1fbWFwOworCisgICAgICBpZiAoZ3N0X21lbW9yeV9tYXAgKG1lbSwgJm1lbV9tYXAsIEdTVF9NQVBfUkVBRCkpIHsKKyAgICAgICAgbWVtY3B5IChvdXRtYXAuZGF0YSArIG9mZnNldCwgbWVtX21hcC5kYXRhLCBtZW1fc2l6ZSk7CisgICAgICAgIGdzdF9tZW1vcnlfdW5tYXAgKG1lbSwgJm1lbV9tYXApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtc2V0IChvdXRtYXAuZGF0YSArIG9mZnNldCwgMCwgbWVtX3NpemUpOworICAgICAgfQorICAgICAgb2Zmc2V0ICs9IG1lbV9zaXplOworICAgIH0KKworICAgIGdzdF9ydHBfY29weV92aWRlb19tZXRhIChydHBoMjY1ZGVwYXksIG91dGJ1ZiwgYnVmKTsKKyAgfQorICBnc3RfYnVmZmVyX2xpc3RfdW5yZWYgKGxpc3QpOworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWYsICZvdXRtYXApOworCisgICpvdXRfdGltZXN0YW1wID0gcnRwaDI2NWRlcGF5LT5sYXN0X3RzOworICAqb3V0X2tleWZyYW1lID0gcnRwaDI2NWRlcGF5LT5sYXN0X2tleWZyYW1lOworCisgIHJ0cGgyNjVkZXBheS0+bGFzdF9rZXlmcmFtZSA9IEZBTFNFOworICBydHBoMjY1ZGVwYXktPnBpY3R1cmVfc3RhcnQgPSBGQUxTRTsKKworICByZXR1cm4gb3V0YnVmOworfQorCisvKiBWUFMvU1BTL1BQUy9SQURML1RTQS9SQVNML0lEUi9DUkEgaXMgY29uc2lkZXJlZCBrZXksIGFsbCBvdGhlcnMgREVMVEE7CisgKiBzbyBkb3duc3RyZWFtIHdhaXRpbmcgZm9yIGtleWZyYW1lIGNhbiBwaWNrIHVwIGF0IFZQUy9TUFMvUFBTL0lEUiAqLworCisjZGVmaW5lIE5BTF9UWVBFX0lTX1BBUkFNRVRFUl9TRVQobnQpICgJCSgobnQpID09IEdTVF9IMjY1X1ZQU19OVVQpXAorCQkJCQkJCQkJCXx8ICAoKG50KSA9PSBHU1RfSDI2NV9TUFNfTlVUKVwKKwkJCQkJCQkJCQl8fCAgKChudCkgPT0gR1NUX0gyNjVfUFBTX05VVCkJCQkJKQorCisjZGVmaW5lIE5BTF9UWVBFX0lTX0NPREVEX1NMSUNFX1NFR01FTlQobnQpICgJCSgobnQpID09IEdTVF9IMjY1X05BTF9TTElDRV9UUkFJTF9OKVwKKwkJCQkJCQkJCQkJCXx8IAkoKG50KSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfVFJBSUxfUilcCisJCQkJCQkJCQkJCQl8fCAgKChudCkgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX1RTQV9OKVwKKwkJCQkJCQkJCQkJCXx8ICAoKG50KSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfVFNBX1IpXAorCQkJCQkJCQkJCQkJfHwgICgobnQpID09IEdTVF9IMjY1X05BTF9TTElDRV9TVFNBX04pXAorCQkJCQkJCQkJCQkJfHwgICgobnQpID09IEdTVF9IMjY1X05BTF9TTElDRV9TVFNBX1IpXAorCQkJCQkJCQkJCQkJfHwgICgobnQpID09IEdTVF9IMjY1X05BTF9TTElDRV9SQVNMX04pXAorCQkJCQkJCQkJCQkJfHwgICgobnQpID09IEdTVF9IMjY1X05BTF9TTElDRV9SQVNMX1IpXAorCQkJCQkJCQkJCQkJfHwgICgobnQpID09IEdTVF9IMjY1X05BTF9TTElDRV9CTEFfV19MUClcCisJCQkJCQkJCQkJCQl8fCAgKChudCkgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX0JMQV9XX1JBREwpXAorCQkJCQkJCQkJCQkJfHwgICgobnQpID09IEdTVF9IMjY1X05BTF9TTElDRV9CTEFfTl9MUClcCisJCQkJCQkJCQkJCQl8fCAgKChudCkgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX0lEUl9XX1JBREwpXAorCQkJCQkJCQkJCQkJfHwgICgobnQpID09IEdTVF9IMjY1X05BTF9TTElDRV9JRFJfTl9MUClcCisJCQkJCQkJCQkJCQl8fCAgKChudCkgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX0NSQV9OVVQpCQkpCisKKy8qIEludHJhIHJhbmRvbSBhY2Nlc3MgcG9pbnQgKi8KKyNkZWZpbmUgTkFMX1RZUEVfSVNfSVJBUChudCkgICAoKChudCkgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX0JMQV9XX0xQKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChudCkgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX0JMQV9XX1JBREwpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChudCkgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX0JMQV9OX0xQKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChudCkgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX0lEUl9XX1JBREwpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChudCkgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX0lEUl9OX0xQKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChudCkgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX0NSQV9OVVQpKQorCisjZGVmaW5lIE5BTF9UWVBFX0lTX0tFWShudCkgKE5BTF9UWVBFX0lTX1BBUkFNRVRFUl9TRVQobnQpIHx8IE5BTF9UWVBFX0lTX0lSQVAobnQpKQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY1X2RlcGF5X2hhbmRsZV9uYWwgKEdzdFJ0cEgyNjVEZXBheSAqIHJ0cGgyNjVkZXBheSwgR3N0QnVmZmVyICogbmFsLAorICAgIEdzdENsb2NrVGltZSBpbl90aW1lc3RhbXAsIGdib29sZWFuIG1hcmtlcikKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCAqZGVwYXlsb2FkID0gR1NUX1JUUF9CQVNFX0RFUEFZTE9BRCAocnRwaDI2NWRlcGF5KTsKKyAgZ2ludCBuYWxfdHlwZTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdEJ1ZmZlciAqb3V0YnVmID0gTlVMTDsKKyAgR3N0Q2xvY2tUaW1lIG91dF90aW1lc3RhbXA7CisgIGdib29sZWFuIGtleWZyYW1lLCBvdXRfa2V5ZnJhbWU7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG5hbCwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgaWYgKEdfVU5MSUtFTFkgKG1hcC5zaXplIDwgNSkpCisgICAgZ290byBzaG9ydF9uYWw7CisKKyAgbmFsX3R5cGUgPSAobWFwLmRhdGFbNF0gPj4gMSkgJiAweDNmOworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1ZGVwYXksICJoYW5kbGUgTkFMIHR5cGUgJWQgKFJUUCBtYXJrZXIgYml0ICVkKSIsCisgICAgICBuYWxfdHlwZSwgbWFya2VyKTsKKworICBrZXlmcmFtZSA9IE5BTF9UWVBFX0lTX0tFWSAobmFsX3R5cGUpOworCisgIG91dF9rZXlmcmFtZSA9IGtleWZyYW1lOworICBvdXRfdGltZXN0YW1wID0gaW5fdGltZXN0YW1wOworCisgIGlmICghcnRwaDI2NWRlcGF5LT5ieXRlX3N0cmVhbSkgeworICAgIGlmIChOQUxfVFlQRV9JU19QQVJBTUVURVJfU0VUIChuYWxfdHlwZSkpIHsKKyAgICAgIGdzdF9ydHBfaDI2NV9kZXBheV9hZGRfdnBzX3Nwc19wcHMgKHJ0cGgyNjVkZXBheSwKKyAgICAgICAgICBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChuYWwsIEdTVF9CVUZGRVJfQ09QWV9BTEwsCisgICAgICAgICAgICAgIDQsIGdzdF9idWZmZXJfZ2V0X3NpemUgKG5hbCkgLSA0KSk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChuYWwsICZtYXApOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAobmFsKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKHJ0cGgyNjVkZXBheS0+c3BzLT5sZW4gPT0gMCB8fCBydHBoMjY1ZGVwYXktPnBwcy0+bGVuID09IDApIHsKKyAgICAgIC8qIERvd24gcHVzaCBkb3duIGFueSBidWZmZXIgaW4gbm9uLWJ5dGVzdHJlYW0gbW9kZSBpZiB0aGUgU1BTL1BQUyBoYXZlbid0CisgICAgICAgKiBnbyB0aHJvdWdoIHlldAorICAgICAgICovCisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU0lOS1BBRCAoZGVwYXlsb2FkKSwKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwKKyAgICAgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJHc3RGb3JjZUtleVVuaXQiLAorICAgICAgICAgICAgICAgICAgImFsbC1oZWFkZXJzIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpKSk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChuYWwsICZtYXApOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAobmFsKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocnRwaDI2NWRlcGF5LT5uZXdfY29kZWNfZGF0YSAmJgorICAgICAgICBydHBoMjY1ZGVwYXktPnNwcy0+bGVuID4gMCAmJiBydHBoMjY1ZGVwYXktPnBwcy0+bGVuID4gMCkKKyAgICAgIGdzdF9ydHBfaDI2NV9zZXRfc3JjX2NhcHMgKHJ0cGgyNjVkZXBheSk7CisgIH0KKworICBpZiAocnRwaDI2NWRlcGF5LT5tZXJnZSkgeworICAgIGdib29sZWFuIHN0YXJ0ID0gRkFMU0UsIGNvbXBsZXRlID0gRkFMU0U7CisKKyAgICAvKiBtYXJrZXIgYml0IGlzbid0IG1hbmRhdG9yeSBzbyBpbiB0aGUgZm9sbG93aW5nIGNvZGUgd2UgdHJ5IHRvIGRldGVjdAorICAgICAqIGFuIEFVIGJvdW5kYXJ5IChzZWUgSC4yNjUgc3BlYyBzZWN0aW9uIDcuNC4yLjQuNCkgKi8KKyAgICBpZiAoIW1hcmtlcikgeworICAgICAgaWYgKE5BTF9UWVBFX0lTX0NPREVEX1NMSUNFX1NFR01FTlQgKG5hbF90eXBlKSkgeworICAgICAgICAvKiBBIE5BTCB1bml0IChYKSBlbmRzIGFuIGFjY2VzcyB1bml0IGlmIHRoZSBuZXh0LW9jY3VycmluZyBWQ0wgTkFMIHVuaXQgKFkpIGhhcyB0aGUgaGlnaC1vcmRlciBiaXQgb2YgdGhlIGZpcnN0IGJ5dGUgYWZ0ZXIgaXRzIE5BTCB1bml0IGhlYWRlciBlcXVhbCB0byAxICovCisgICAgICAgIHN0YXJ0ID0gVFJVRTsKKyAgICAgICAgaWYgKCgobWFwLmRhdGFbNl0gPj4gNykgJiAweDAxKSA9PSAxKSB7CisgICAgICAgICAgY29tcGxldGUgPSBUUlVFOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKChuYWxfdHlwZSA+PSAzMiAmJiBuYWxfdHlwZSA8PSAzNSkKKyAgICAgICAgICB8fCBuYWxfdHlwZSA9PSAzOSB8fCAobmFsX3R5cGUgPj0gNDEgJiYgbmFsX3R5cGUgPD0gNDQpCisgICAgICAgICAgfHwgKG5hbF90eXBlID49IDQ4ICYmIG5hbF90eXBlIDw9IDU1KSkgeworICAgICAgICAvKiBWUFMsIFNQUywgUFBTLCBTRUksIC4uLiB0ZXJtaW5hdGUgYW4gYWNjZXNzIHVuaXQgKi8KKyAgICAgICAgY29tcGxldGUgPSBUUlVFOworICAgICAgfQorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAic3RhcnQgJWQsIGNvbXBsZXRlICVkIiwgc3RhcnQsIGNvbXBsZXRlKTsKKworICAgICAgaWYgKGNvbXBsZXRlICYmIHJ0cGgyNjVkZXBheS0+cGljdHVyZV9zdGFydCkKKyAgICAgICAgb3V0YnVmID0gZ3N0X3J0cF9oMjY1X2NvbXBsZXRlX2F1IChydHBoMjY1ZGVwYXksICZvdXRfdGltZXN0YW1wLAorICAgICAgICAgICAgJm91dF9rZXlmcmFtZSk7CisgICAgfQorICAgIC8qIGFkZCB0byBhZGFwdGVyICovCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAobmFsLCAmbWFwKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgImFkZGluZyBOQUwgdG8gcGljdHVyZSBhZGFwdGVyIik7CisgICAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRwaDI2NWRlcGF5LT5waWN0dXJlX2FkYXB0ZXIsIG5hbCk7CisgICAgcnRwaDI2NWRlcGF5LT5sYXN0X3RzID0gaW5fdGltZXN0YW1wOworICAgIHJ0cGgyNjVkZXBheS0+bGFzdF9rZXlmcmFtZSB8PSBrZXlmcmFtZTsKKyAgICBydHBoMjY1ZGVwYXktPnBpY3R1cmVfc3RhcnQgfD0gc3RhcnQ7CisKKyAgICBpZiAobWFya2VyKQorICAgICAgb3V0YnVmID0gZ3N0X3J0cF9oMjY1X2NvbXBsZXRlX2F1IChydHBoMjY1ZGVwYXksICZvdXRfdGltZXN0YW1wLAorICAgICAgICAgICZvdXRfa2V5ZnJhbWUpOworICB9IGVsc2UgeworICAgIC8qIG5vIG1lcmdlLCBvdXRwdXQgaXMgaW5wdXQgbmFsICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAidXNpbmcgTkFMIGFzIG91dHB1dCIpOworICAgIG91dGJ1ZiA9IG5hbDsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChuYWwsICZtYXApOworICB9CisKKyAgaWYgKG91dGJ1ZikgeworICAgIC8qIHByZXBlbmQgY29kZWNfZGF0YSAqLworICAgIGlmIChydHBoMjY1ZGVwYXktPmNvZGVjX2RhdGEpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgInByZXBlbmRpbmcgY29kZWNfZGF0YSIpOworICAgICAgZ3N0X3J0cF9jb3B5X3ZpZGVvX21ldGEgKHJ0cGgyNjVkZXBheSwgcnRwaDI2NWRlcGF5LT5jb2RlY19kYXRhLCBvdXRidWYpOworICAgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKHJ0cGgyNjVkZXBheS0+Y29kZWNfZGF0YSwgb3V0YnVmKTsKKyAgICAgIHJ0cGgyNjVkZXBheS0+Y29kZWNfZGF0YSA9IE5VTEw7CisgICAgICBvdXRfa2V5ZnJhbWUgPSBUUlVFOworICAgIH0KKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKG91dGJ1Zik7CisKKyAgICBnc3RfcnRwX2Ryb3Bfbm9uX3ZpZGVvX21ldGEgKHJ0cGgyNjVkZXBheSwgb3V0YnVmKTsKKworICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gb3V0X3RpbWVzdGFtcDsKKworICAgIGlmIChvdXRfa2V5ZnJhbWUpCisgICAgICBHU1RfQlVGRkVSX0ZMQUdfVU5TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworICAgIGVsc2UKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgICAgZ3N0X3J0cF9iYXNlX2RlcGF5bG9hZF9wdXNoIChkZXBheWxvYWQsIG91dGJ1Zik7CisgIH0KKworICByZXR1cm47CisKKyAgLyogRVJST1JTICovCitzaG9ydF9uYWw6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5bG9hZCwgImRyb3BwaW5nIHNob3J0IE5BTCIpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKG5hbCwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAobmFsKTsKKyAgICByZXR1cm47CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NV9maW5pc2hfZnJhZ21lbnRhdGlvbl91bml0IChHc3RSdHBIMjY1RGVwYXkgKiBydHBoMjY1ZGVwYXkpCit7CisgIGd1aW50IG91dHNpemU7CisgIEdzdE1hcEluZm8gbWFwOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKworICBvdXRzaXplID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBoMjY1ZGVwYXktPmFkYXB0ZXIpOworICBnX2Fzc2VydCAob3V0c2l6ZSA+PSA0KTsKKworICBvdXRidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRwaDI2NWRlcGF5LT5hZGFwdGVyLCBvdXRzaXplKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LCAib3V0cHV0ICVkIGJ5dGVzIiwgb3V0c2l6ZSk7CisKKyAgaWYgKHJ0cGgyNjVkZXBheS0+Ynl0ZV9zdHJlYW0pIHsKKyAgICBtZW1jcHkgKG1hcC5kYXRhLCBzeW5jX2J5dGVzLCBzaXplb2YgKHN5bmNfYnl0ZXMpKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0JFIChtYXAuZGF0YSwgb3V0c2l6ZSAtIDQpOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm1hcCk7CisKKyAgcnRwaDI2NWRlcGF5LT5jdXJyZW50X2Z1X3R5cGUgPSAwOworCisgIGdzdF9ydHBfaDI2NV9kZXBheV9oYW5kbGVfbmFsIChydHBoMjY1ZGVwYXksIG91dGJ1ZiwKKyAgICAgIHJ0cGgyNjVkZXBheS0+ZnVfdGltZXN0YW1wLCBydHBoMjY1ZGVwYXktPmZ1X21hcmtlcik7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9oMjY1X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0UnRwSDI2NURlcGF5ICpydHBoMjY1ZGVwYXk7CisgIEdzdEJ1ZmZlciAqb3V0YnVmID0gTlVMTDsKKyAgZ3VpbnQ4IG5hbF91bml0X3R5cGU7CisKKyAgcnRwaDI2NWRlcGF5ID0gR1NUX1JUUF9IMjY1X0RFUEFZIChkZXBheWxvYWQpOworCisgIC8qIGZsdXNoIHJlbWFpbmluZyBkYXRhIG9uIGRpc2NvbnQgKi8KKyAgaWYgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAocnRwLT5idWZmZXIpKSB7CisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGgyNjVkZXBheS0+YWRhcHRlcik7CisgICAgcnRwaDI2NWRlcGF5LT53YWl0X3N0YXJ0ID0gVFJVRTsKKyAgICBydHBoMjY1ZGVwYXktPmN1cnJlbnRfZnVfdHlwZSA9IDA7CisgIH0KKworICB7CisgICAgZ2ludCBwYXlsb2FkX2xlbjsKKyAgICBndWludDggKnBheWxvYWQ7CisgICAgZ3VpbnQgaGVhZGVyX2xlbjsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBndWludCBvdXRzaXplLCBuYWx1X3NpemU7CisgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKyAgICBnYm9vbGVhbiBtYXJrZXI7CisgICAgZ3VpbnQ4IG51aF9sYXllcl9pZCwgbnVoX3RlbXBvcmFsX2lkX3BsdXMxOworICAgIGd1aW50OCBTLCBFOworICAgIGd1aW50MTYgbmFsX2hlYWRlcjsKKyNpZiAwCisgICAgZ2Jvb2xlYW4gZG9ubF9wcmVzZW50ID0gRkFMU0U7CisjZW5kaWYKKworICAgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChydHAtPmJ1ZmZlcik7CisKKyAgICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAocnRwKTsKKyAgICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisgICAgbWFya2VyID0gZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAocnRwKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVkZXBheSwgInJlY2VpdmluZyAlZCBieXRlcyIsIHBheWxvYWRfbGVuKTsKKworICAgIGlmIChwYXlsb2FkX2xlbiA9PSAwKQorICAgICAgZ290byBlbXB0eV9wYWNrZXQ7CisKKyAgICAvKiArLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKKyAgICAgKiB8MHwxfDJ8M3w0fDV8Nnw3fDB8MXwyfDN8NHw1fDZ8N3wKKyAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgKiB8RnwgICBUeXBlICAgIHwgIExheWVySWQgIHwgVElEIHwKKyAgICAgKiArLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgKgorICAgICAqIEYgbXVzdCBiZSAwLgorICAgICAqCisgICAgICovCisgICAgbmFsX3VuaXRfdHlwZSA9IChwYXlsb2FkWzBdID4+IDEpICYgMHgzZjsKKyAgICBudWhfbGF5ZXJfaWQgPSAoKHBheWxvYWRbMF0gJiAweDAxKSA8PCA1KSB8IChwYXlsb2FkWzFdID4+IDMpOyAgICAgIC8qIHNob3VsZCBiZSB6ZXJvIGZvciBub3cgYnV0IHRoaXMgY291bGQgY2hhbmdlIGluIGZ1dHVyZSBIRVZDIGV4dGVuc2lvbnMgKi8KKyAgICBudWhfdGVtcG9yYWxfaWRfcGx1czEgPSBwYXlsb2FkWzFdICYgMHgwMzsKKworICAgIC8qIEF0IGxlYXN0IHR3byBieXRlIGhlYWRlciB3aXRoIHR5cGUgKi8KKyAgICBoZWFkZXJfbGVuID0gMjsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVkZXBheSwKKyAgICAgICAgIk5BTCBoZWFkZXIgbmFsX3VuaXRfdHlwZSAlZCwgbnVoX3RlbXBvcmFsX2lkX3BsdXMxICVkIiwgbmFsX3VuaXRfdHlwZSwKKyAgICAgICAgbnVoX3RlbXBvcmFsX2lkX3BsdXMxKTsKKworICAgIEdTVF9GSVhNRV9PQkpFQ1QgKHJ0cGgyNjVkZXBheSwgIkFzc3VtaW5nIERPTkwgZmllbGQgaXMgbm90IHByZXNlbnQiKTsKKworICAgIC8qIEZJWE1FIC0gYXNzdW1pbmcgRE9OTCBmaWVsZCBpcyBub3QgcHJlc2VudCBmb3Igbm93ICovCisgICAgLypkb25sX3ByZXNlbnQgPSAodHgtbW9kZSA9PSAiTVNUIikgfHwgKHNwcm9wLW1heC1kb24tZGlmZiA+IDApOyAqLworCisgICAgLyogSWYgRlUgdW5pdCB3YXMgYmVpbmcgcHJvY2Vzc2VkLCBidXQgdGhlIGN1cnJlbnQgbmFsIGlzIG9mIGEgZGlmZmVyZW50CisgICAgICogdHlwZS4gIEFzc3VtZSB0aGF0IHRoZSByZW1vdGUgcGF5bG9hZGVyIGlzIGJ1Z2d5IChkaWRuJ3Qgc2V0IHRoZSBlbmQgYml0CisgICAgICogd2hlbiB0aGUgRlUgZW5kZWQpIGFuZCBzZW5kIG91dCB3aGF0IHdlIGdhdGhlcmVkIHRodXNmYXIgKi8KKyAgICBpZiAoR19VTkxJS0VMWSAocnRwaDI2NWRlcGF5LT5jdXJyZW50X2Z1X3R5cGUgIT0gMCAmJgorICAgICAgICAgICAgbmFsX3VuaXRfdHlwZSAhPSBydHBoMjY1ZGVwYXktPmN1cnJlbnRfZnVfdHlwZSkpCisgICAgICBnc3RfcnRwX2gyNjVfZmluaXNoX2ZyYWdtZW50YXRpb25fdW5pdCAocnRwaDI2NWRlcGF5KTsKKworICAgIHN3aXRjaCAobmFsX3VuaXRfdHlwZSkgeworICAgICAgY2FzZSA0ODoKKyAgICAgIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LCAiUHJvY2Vzc2luZyBhZ2dyZWdhdGlvbiBwYWNrZXQiKTsKKworICAgICAgICAvKiBBZ2dyZWdhdGlvbiBwYWNrZXQgKHNlY3Rpb24gNC43KSAqLworCisgICAgICAgIC8qICBBbiBleGFtcGxlIG9mIGFuIEFQIHBhY2tldCBjb250YWluaW5nIHR3byBhZ2dyZWdhdGlvbiB1bml0cworICAgICAgICAgICB3aXRob3V0IHRoZSBET05MIGFuZCBET05EIGZpZWxkcworCisgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIFJUUCBIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgIHwgICBQYXlsb2FkSGRyIChUeXBlPTQ4KSAgICAgICAgfCAgICAgICAgIE5BTFUgMSBTaXplICAgICAgICAgICB8CisgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgIHwgICAgICAgICAgTkFMVSAxIEhEUiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyAgICAgICAgIE5BTFUgMSBEYXRhICAgICAgICAgICB8CisgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgLiAuIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICsgICAgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgIHwgIC4gLiAuICAgICAgICB8IE5BTFUgMiBTaXplICAgICAgICAgICAgICAgICAgIHwgTkFMVSAyIEhEUiAgICB8CisgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgIHwgTkFMVSAyIEhEUiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rICAgICAgICAgICAgICBOQUxVIDIgRGF0YSAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgLiAuIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOi4uLk9QVElPTkFMIFJUUCBwYWRkaW5nICAgICAgICB8CisgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAqLworCisgICAgICAgIC8qIHN0cmlwIGhlYWRlcnMgKi8KKyAgICAgICAgcGF5bG9hZCArPSBoZWFkZXJfbGVuOworICAgICAgICBwYXlsb2FkX2xlbiAtPSBoZWFkZXJfbGVuOworCisgICAgICAgIHJ0cGgyNjVkZXBheS0+d2FpdF9zdGFydCA9IEZBTFNFOworCisjaWYgMAorICAgICAgICBpZiAoZG9ubF9wcmVzZW50KQorICAgICAgICAgIGdvdG8gbm90X2ltcGxlbWVudGVkX2RvbmxfcHJlc2VudDsKKyNlbmRpZgorCisgICAgICAgIHdoaWxlIChwYXlsb2FkX2xlbiA+IDIpIHsKKworICAgICAgICAgIG5hbHVfc2l6ZSA9IChwYXlsb2FkWzBdIDw8IDgpIHwgcGF5bG9hZFsxXTsKKworICAgICAgICAgIC8qIGRvbnQgaW5jbHVkZSBuYWx1X3NpemUgKi8KKyAgICAgICAgICBpZiAobmFsdV9zaXplID4gKHBheWxvYWRfbGVuIC0gMikpCisgICAgICAgICAgICBuYWx1X3NpemUgPSBwYXlsb2FkX2xlbiAtIDI7CisKKyAgICAgICAgICBvdXRzaXplID0gbmFsdV9zaXplICsgc2l6ZW9mIChzeW5jX2J5dGVzKTsKKyAgICAgICAgICBvdXRidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG91dHNpemUpOworCisgICAgICAgICAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgICAgICAgICAgaWYgKHJ0cGgyNjVkZXBheS0+Ynl0ZV9zdHJlYW0pIHsKKyAgICAgICAgICAgIG1lbWNweSAobWFwLmRhdGEsIHN5bmNfYnl0ZXMsIHNpemVvZiAoc3luY19ieXRlcykpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfV1JJVEVfVUlOVDMyX0JFIChtYXAuZGF0YSwgbmFsdV9zaXplKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBzdHJpcCBOQUxVIHNpemUgKi8KKyAgICAgICAgICBwYXlsb2FkICs9IDI7CisgICAgICAgICAgcGF5bG9hZF9sZW4gLT0gMjsKKworICAgICAgICAgIG1lbWNweSAobWFwLmRhdGEgKyBzaXplb2YgKHN5bmNfYnl0ZXMpLCBwYXlsb2FkLCBuYWx1X3NpemUpOworICAgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm1hcCk7CisKKyAgICAgICAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwaDI2NWRlcGF5LCBvdXRidWYsIHJ0cC0+YnVmZmVyKTsKKworICAgICAgICAgIGdzdF9ydHBfaDI2NV9kZXBheV9oYW5kbGVfbmFsIChydHBoMjY1ZGVwYXksIG91dGJ1ZiwgdGltZXN0YW1wLAorICAgICAgICAgICAgICBtYXJrZXIpOworCisgICAgICAgICAgcGF5bG9hZCArPSBuYWx1X3NpemU7CisgICAgICAgICAgcGF5bG9hZF9sZW4gLT0gbmFsdV9zaXplOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSA0OToKKyAgICAgIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LCAiUHJvY2Vzc2luZyBGcmFnbWVudGF0aW9uIFVuaXQiKTsKKworICAgICAgICAvKiBGcmFnbWVudGF0aW9uIHVuaXRzIChGVXMpICBTZWN0aW9uIDQuOCAqLworCisgICAgICAgIC8qICAgIFRoZSBzdHJ1Y3R1cmUgb2YgYSBGcmFnbWVudGF0aW9uIFVuaXQgKEZVKQorICAgICAgICAgKgorICAgICAgICAgKiAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICB8ICAgIFBheWxvYWRIZHIgKFR5cGU9NDkpICAgICAgIHwgICBGVSBoZWFkZXIgICB8IERPTkwgKGNvbmQpICAgfAorICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLXwKKyAgICAgICAgIHwgRE9OTCAoY29uZCkgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICB8LSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBGVSBwYXlsb2FkICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Li4uT1BUSU9OQUwgUlRQIHBhZGRpbmcgICAgICAgIHwKKyAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAqCisgICAgICAgICAqCisgICAgICAgICAqLworCisgICAgICAgIC8qIHN0cmlwIGhlYWRlcnMgKi8KKyAgICAgICAgcGF5bG9hZCArPSBoZWFkZXJfbGVuOworICAgICAgICBwYXlsb2FkX2xlbiAtPSBoZWFkZXJfbGVuOworCisgICAgICAgIC8qIHByb2Nlc3NpbmcgRlUgaGVhZGVyICovCisgICAgICAgIFMgPSAocGF5bG9hZFswXSAmIDB4ODApID09IDB4ODA7CisgICAgICAgIEUgPSAocGF5bG9hZFswXSAmIDB4NDApID09IDB4NDA7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LAorICAgICAgICAgICAgIkZVIGhlYWRlciB3aXRoIFMgJWQsIEUgJWQsIG5hbF91bml0X3R5cGUgJWQiLCBTLCBFLAorICAgICAgICAgICAgcGF5bG9hZFswXSAmIDB4M2YpOworCisgICAgICAgIGlmIChydHBoMjY1ZGVwYXktPndhaXRfc3RhcnQgJiYgIVMpCisgICAgICAgICAgZ290byB3YWl0aW5nX3N0YXJ0OworCisjaWYgMAorICAgICAgICBpZiAoZG9ubF9wcmVzZW50KQorICAgICAgICAgIGdvdG8gbm90X2ltcGxlbWVudGVkX2RvbmxfcHJlc2VudDsKKyNlbmRpZgorCisgICAgICAgIGlmIChTKSB7CisKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1ZGVwYXksICJTdGFydCBvZiBGcmFnbWVudGF0aW9uIFVuaXQiKTsKKworICAgICAgICAgIC8qIElmIGEgbmV3IEZVIHVuaXQgc3RhcnRlZCwgd2hpbGUgc3RpbGwgcHJvY2Vzc2luZyBhbiBvbGRlciBvbmUuCisgICAgICAgICAgICogQXNzdW1lIHRoYXQgdGhlIHJlbW90ZSBwYXlsb2FkZXIgaXMgYnVnZ3kgKGRvZXNuJ3Qgc2V0IHRoZSBlbmQKKyAgICAgICAgICAgKiBiaXQpIGFuZCBzZW5kIG91dCB3aGF0IHdlJ3ZlIGdhdGhlcmVkIHRodXNmYXIgKi8KKyAgICAgICAgICBpZiAoR19VTkxJS0VMWSAocnRwaDI2NWRlcGF5LT5jdXJyZW50X2Z1X3R5cGUgIT0gMCkpCisgICAgICAgICAgICBnc3RfcnRwX2gyNjVfZmluaXNoX2ZyYWdtZW50YXRpb25fdW5pdCAocnRwaDI2NWRlcGF5KTsKKworICAgICAgICAgIHJ0cGgyNjVkZXBheS0+Y3VycmVudF9mdV90eXBlID0gbmFsX3VuaXRfdHlwZTsKKyAgICAgICAgICBydHBoMjY1ZGVwYXktPmZ1X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKworICAgICAgICAgIHJ0cGgyNjVkZXBheS0+d2FpdF9zdGFydCA9IEZBTFNFOworCisgICAgICAgICAgLyogcmVjb25zdHJ1Y3QgTkFMIGhlYWRlciAqLworICAgICAgICAgIG5hbF9oZWFkZXIgPQorICAgICAgICAgICAgICAoKHBheWxvYWRbMF0gJiAweDNmKSA8PCA5KSB8IChudWhfbGF5ZXJfaWQgPDwgMykgfAorICAgICAgICAgICAgICBudWhfdGVtcG9yYWxfaWRfcGx1czE7CisKKyAgICAgICAgICAvKiBnbyBiYWNrIG9uZSBieXRlIHNvIHdlIGNhbiBjb3B5IHRoZSBwYXlsb2FkICsgdHdvIGJ5dGVzIG1vcmUgaW4gdGhlIGZyb250IHdoaWNoCisgICAgICAgICAgICogd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgbmFsX2hlYWRlcgorICAgICAgICAgICAqLworICAgICAgICAgIHBheWxvYWQgLT0gMTsKKyAgICAgICAgICBwYXlsb2FkX2xlbiArPSAxOworCisgICAgICAgICAgbmFsdV9zaXplID0gcGF5bG9hZF9sZW47CisgICAgICAgICAgb3V0c2l6ZSA9IG5hbHVfc2l6ZSArIHNpemVvZiAoc3luY19ieXRlcyk7CisgICAgICAgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChvdXRzaXplKTsKKworICAgICAgICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgICAgICAgIGlmIChydHBoMjY1ZGVwYXktPmJ5dGVfc3RyZWFtKSB7CisgICAgICAgICAgICBHU1RfV1JJVEVfVUlOVDMyX0JFIChtYXAuZGF0YSwgMHgwMDAwMDAwMSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIHdpbGwgYmUgZml4ZWQgdXAgaW4gZmluaXNoX2ZyYWdtZW50YXRpb25fdW5pdCgpICovCisgICAgICAgICAgICBHU1RfV1JJVEVfVUlOVDMyX0JFIChtYXAuZGF0YSwgMHhmZmZmZmZmZik7CisgICAgICAgICAgfQorICAgICAgICAgIG1lbWNweSAobWFwLmRhdGEgKyBzaXplb2YgKHN5bmNfYnl0ZXMpLCBwYXlsb2FkLCBuYWx1X3NpemUpOworICAgICAgICAgIG1hcC5kYXRhWzRdID0gbmFsX2hlYWRlciA+PiA4OworICAgICAgICAgIG1hcC5kYXRhWzVdID0gbmFsX2hlYWRlciAmIDB4ZmY7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICAgICAgICAgIGdzdF9ydHBfY29weV92aWRlb19tZXRhIChydHBoMjY1ZGVwYXksIG91dGJ1ZiwgcnRwLT5idWZmZXIpOworCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LCAicXVldWVpbmcgJWQgYnl0ZXMiLCBvdXRzaXplKTsKKworICAgICAgICAgIC8qIGFuZCBhc3NlbWJsZSBpbiB0aGUgYWRhcHRlciAqLworICAgICAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGgyNjVkZXBheS0+YWRhcHRlciwgb3V0YnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVkZXBheSwKKyAgICAgICAgICAgICAgIkZvbGxvd2luZyBwYXJ0IG9mIEZyYWdtZW50YXRpb24gVW5pdCIpOworCisgICAgICAgICAgLyogc3RyaXAgb2ZmIEZVIGhlYWRlciBieXRlICovCisgICAgICAgICAgcGF5bG9hZCArPSAxOworICAgICAgICAgIHBheWxvYWRfbGVuIC09IDE7CisKKyAgICAgICAgICBvdXRzaXplID0gcGF5bG9hZF9sZW47CisgICAgICAgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChvdXRzaXplKTsKKyAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKG91dGJ1ZiwgMCwgcGF5bG9hZCwgb3V0c2l6ZSk7CisKKyAgICAgICAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwaDI2NWRlcGF5LCBvdXRidWYsIHJ0cC0+YnVmZmVyKTsKKworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVkZXBheSwgInF1ZXVlaW5nICVkIGJ5dGVzIiwgb3V0c2l6ZSk7CisKKyAgICAgICAgICAvKiBhbmQgYXNzZW1ibGUgaW4gdGhlIGFkYXB0ZXIgKi8KKyAgICAgICAgICBnc3RfYWRhcHRlcl9wdXNoIChydHBoMjY1ZGVwYXktPmFkYXB0ZXIsIG91dGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBvdXRidWYgPSBOVUxMOworICAgICAgICBydHBoMjY1ZGVwYXktPmZ1X21hcmtlciA9IG1hcmtlcjsKKworICAgICAgICAvKiBpZiBOQUwgdW5pdCBlbmRzLCBmbHVzaCB0aGUgYWRhcHRlciAqLworICAgICAgICBpZiAoRSkgeworICAgICAgICAgIGdzdF9ydHBfaDI2NV9maW5pc2hfZnJhZ21lbnRhdGlvbl91bml0IChydHBoMjY1ZGVwYXkpOworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVkZXBheSwgIkVuZCBvZiBGcmFnbWVudGF0aW9uIFVuaXQiKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgNTA6CisgICAgICAgIGdvdG8gbm90X2ltcGxlbWVudGVkOyAgIC8qIFBBQ0kgcGFja2V0cyAgU2VjdGlvbiA0LjkgKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICB7CisgICAgICAgIHJ0cGgyNjVkZXBheS0+d2FpdF9zdGFydCA9IEZBTFNFOworCisgICAgICAgIC8qIEFsbCBvdGhlciBjYXNlczogU2luZ2xlIE5BTCB1bml0IHBhY2tldCAgIFNlY3Rpb24gNC42ICovCisgICAgICAgIC8qIHRoZSBlbnRpcmUgcGF5bG9hZCBpcyB0aGUgb3V0cHV0IGJ1ZmZlciAqLworCisjaWYgMAorICAgICAgICBpZiAoZG9ubF9wcmVzZW50KQorICAgICAgICAgIGdvdG8gbm90X2ltcGxlbWVudGVkX2RvbmxfcHJlc2VudDsKKyNlbmRpZgorCisgICAgICAgIG5hbHVfc2l6ZSA9IHBheWxvYWRfbGVuOworICAgICAgICBvdXRzaXplID0gbmFsdV9zaXplICsgc2l6ZW9mIChzeW5jX2J5dGVzKTsKKyAgICAgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChvdXRzaXplKTsKKworICAgICAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICAgICAgaWYgKHJ0cGgyNjVkZXBheS0+Ynl0ZV9zdHJlYW0pIHsKKyAgICAgICAgICBtZW1jcHkgKG1hcC5kYXRhLCBzeW5jX2J5dGVzLCBzaXplb2YgKHN5bmNfYnl0ZXMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfV1JJVEVfVUlOVDMyX0JFIChtYXAuZGF0YSwgbmFsdV9zaXplKTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkgKG1hcC5kYXRhICsgNCwgcGF5bG9hZCwgbmFsdV9zaXplKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICAgICAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwaDI2NWRlcGF5LCBvdXRidWYsIHJ0cC0+YnVmZmVyKTsKKworICAgICAgICBnc3RfcnRwX2gyNjVfZGVwYXlfaGFuZGxlX25hbCAocnRwaDI2NWRlcGF5LCBvdXRidWYsIHRpbWVzdGFtcCwgbWFya2VyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIE5VTEw7CisKKyAgLyogRVJST1JTICovCitlbXB0eV9wYWNrZXQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1ZGVwYXksICJlbXB0eSBwYWNrZXQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQord2FpdGluZ19zdGFydDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVkZXBheSwgIndhaXRpbmcgZm9yIHN0YXJ0Iik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNpZiAwCitub3RfaW1wbGVtZW50ZWRfZG9ubF9wcmVzZW50OgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHJ0cGgyNjVkZXBheSwgU1RSRUFNLCBGT1JNQVQsCisgICAgICAgIChOVUxMKSwgKCJET05MIGZpZWxkIHByZXNlbnQgbm90IHN1cHBvcnRlZCB5ZXQiKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorbm90X2ltcGxlbWVudGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHJ0cGgyNjVkZXBheSwgU1RSRUFNLCBGT1JNQVQsCisgICAgICAgIChOVUxMKSwgKCJOQUwgdW5pdCB0eXBlICVkIG5vdCBzdXBwb3J0ZWQgeWV0IiwgbmFsX3VuaXRfdHlwZSkpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9oMjY1X2RlcGF5X2hhbmRsZV9ldmVudCAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBIMjY1RGVwYXkgKnJ0cGgyNjVkZXBheTsKKworICBydHBoMjY1ZGVwYXkgPSBHU1RfUlRQX0gyNjVfREVQQVkgKGRlcGF5KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ3N0X3J0cF9oMjY1X2RlcGF5X3Jlc2V0IChydHBoMjY1ZGVwYXksIEZBTFNFKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybgorICAgICAgR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9DTEFTUyAocGFyZW50X2NsYXNzKS0+aGFuZGxlX2V2ZW50IChkZXBheSwgZXZlbnQpOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfaDI2NV9kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cEgyNjVEZXBheSAqcnRwaDI2NWRlcGF5OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRwaDI2NWRlcGF5ID0gR1NUX1JUUF9IMjY1X0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfcnRwX2gyNjVfZGVwYXlfcmVzZXQgKHJ0cGgyNjVkZXBheSwgVFJVRSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3J0cF9oMjY1X2RlcGF5X3Jlc2V0IChydHBoMjY1ZGVwYXksIFRSVUUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2NV9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwaDI2NWRlcGF5X2RlYnVnLCAicnRwaDI2NWRlcGF5IiwgMCwKKyAgICAgICJIMjY1IFZpZGVvIFJUUCBEZXBheWxvYWRlciIpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwaDI2NWRlcGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX0gyNjVfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YxNzY5NAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMTQ+IEp1cmdlbiBTbG93YWNrIDxqdXJnZW5zbG93YWNrQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9IMjY1X0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfSDI2NV9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisjaW5jbHVkZSAiZ3N0cnRwaDI2NXR5cGVzLmgiCisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0gyNjVfREVQQVkgXAorICAoZ3N0X3J0cF9oMjY1X2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfSDI2NV9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9IMjY1X0RFUEFZLEdzdFJ0cEgyNjVEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfSDI2NV9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSDI2NV9ERVBBWSxHc3RSdHBIMjY1RGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfSDI2NV9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9IMjY1X0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9IMjY1X0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9IMjY1X0RFUEFZKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBIMjY1RGVwYXkgR3N0UnRwSDI2NURlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjVEZXBheUNsYXNzIEdzdFJ0cEgyNjVEZXBheUNsYXNzOworCisjZGVmaW5lIEdTVF9IMjY1X1ZQU19OVVQgMzIKKyNkZWZpbmUgR1NUX0gyNjVfU1BTX05VVCAzMworI2RlZmluZSBHU1RfSDI2NV9QUFNfTlVUIDM0CisKK3R5cGVkZWYgZW51bQoreworICBHU1RfSDI2NV9TVFJFQU1fRk9STUFUX1VOS05PV04sCisgIEdTVF9IMjY1X1NUUkVBTV9GT1JNQVRfQllURVNUUkVBTSwKKyAgR1NUX0gyNjVfU1RSRUFNX0ZPUk1BVF9IVkMxLAorICBHU1RfSDI2NV9TVFJFQU1fRk9STUFUX0hFVjEKK30gR3N0SDI2NVN0cmVhbUZvcm1hdDsKKworc3RydWN0IF9Hc3RSdHBIMjY1RGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7CisKKyAgY29uc3QgZ2NoYXIgKnN0cmVhbV9mb3JtYXQ7CisgIEdzdEgyNjVTdHJlYW1Gb3JtYXQgb3V0cHV0X2Zvcm1hdDsgIC8qIGJ5dGVzdHJlYW0sIGh2YzEgb3IgaGV2MSAqLworICBnYm9vbGVhbiBieXRlX3N0cmVhbTsKKworICBHc3RCdWZmZXIgKmNvZGVjX2RhdGE7CisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisgIGdib29sZWFuIHdhaXRfc3RhcnQ7CisKKyAgLyogbmFsIG1lcmdpbmcgKi8KKyAgZ2Jvb2xlYW4gbWVyZ2U7CisgIEdzdEFkYXB0ZXIgKnBpY3R1cmVfYWRhcHRlcjsKKyAgZ2Jvb2xlYW4gcGljdHVyZV9zdGFydDsKKyAgR3N0Q2xvY2tUaW1lIGxhc3RfdHM7CisgIGdib29sZWFuIGxhc3Rfa2V5ZnJhbWU7CisKKyAgLyogV29yayBhcm91bmQgYnJva2VuIHBheWxvYWRlcnMgd3J0LiBGcmFnbWVudGF0aW9uIFVuaXRzICovCisgIGd1aW50OCBjdXJyZW50X2Z1X3R5cGU7CisgIEdzdENsb2NrVGltZSBmdV90aW1lc3RhbXA7CisgIGdib29sZWFuIGZ1X21hcmtlcjsKKworICAvKiBtaXNjICovCisgIEdQdHJBcnJheSAqdnBzOworICBHUHRyQXJyYXkgKnNwczsKKyAgR1B0ckFycmF5ICpwcHM7CisgIGdib29sZWFuIG5ld19jb2RlY19kYXRhOworCisgIC8qIGRvd25zdHJlYW0gYWxsb2NhdG9yICovCisgIEdzdEFsbG9jYXRvciAqYWxsb2NhdG9yOworICBHc3RBbGxvY2F0aW9uUGFyYW1zIHBhcmFtczsKK307CisKK3N0cnVjdCBfR3N0UnRwSDI2NURlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQ7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHUXVhcmsgY29weV90YWc7Cit9IENvcHlNZXRhRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudDsKKyAgR1F1YXJrIGtlZXBfdGFnOworfSBEcm9wTWV0YURhdGE7CisKK0dUeXBlIGdzdF9ydHBfaDI2NV9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfaDI2NV9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9oMjY1X2FkZF92cHNfc3BzX3BwcyAoR3N0RWxlbWVudCAqIHJ0cGgyNjUsIEdQdHJBcnJheSAqIHZwcywKKyAgICBHUHRyQXJyYXkgKiBzcHMsIEdQdHJBcnJheSAqIHBwcywgR3N0QnVmZmVyICogbmFsKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9SVFBfSDI2NV9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwaDI2NXBheS5jIGIvZ3N0L3J0cC9nc3RydHBoMjY1cGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE1OTdlMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwaDI2NXBheS5jCkBAIC0wLDAgKzEsMTQzOCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAxND4gSnVyZ2VuIFNsb3dhY2sgPGp1cmdlbnNsb3dhY2tAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9wYnV0aWxzL3BidXRpbHMuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworLyogSW5jbHVkZWQgdG8gbm90IGR1cGxpY2F0ZSBnc3RfcnRwX2gyNjVfYWRkX3Zwc19zcHNfcHBzICgpICovCisjaW5jbHVkZSAiZ3N0cnRwaDI2NWRlcGF5LmgiCisKKyNpbmNsdWRlICJnc3RydHBoMjY1cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwaDI2NXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwaDI2NXBheV9kZWJ1ZykKKworLyogcmVmZXJlbmNlczoKKyAqCisgKiBJbnRlcm5ldCBEcmFmdCBSVFAgUGF5bG9hZCBGb3JtYXQgZm9yIEhpZ2ggRWZmaWNpZW5jeSBWaWRlbyBDb2RpbmcKKyAqCisgKiAgICAgICAgICAgICAgICAgICBkcmFmdC1pZXRmLXBheWxvYWQtcnRwLWgyNjUtMDMudHh0CisgKgorICogVGhpcyBkcmFmdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYW4gUkZDLCBzbyBzb21lIGRldGFpbHMgbWF5IGNoYW5nZS4KKyAqCisgKi8KKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2NV9wYXlfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgKKyAgICAgICAgLyogb25seSBodmMxIGFuZCBieXRlLXN0cmVhbSBmb3JtYXRzIHN1cHBvcnRlZCBmb3Igbm93ICovCisgICAgICAgICJ2aWRlby94LWgyNjUsIHN0cmVhbS1mb3JtYXQgPSAoc3RyaW5nKSBodmMxLCBhbGlnbm1lbnQgPSAoc3RyaW5nKSBhdTsgIgorICAgICAgICAvKiAidmlkZW8veC1oMjY1LCAiCisgICAgICAgICAgICJzdHJlYW0tZm9ybWF0ID0gKHN0cmluZykgaGV2MSwgYWxpZ25tZW50ID0gKHN0cmluZykgYXU7ICIgKi8KKyAgICAgICAgInZpZGVvL3gtaDI2NSwgc3RyZWFtLWZvcm1hdCA9IChzdHJpbmcpIGJ5dGUtc3RyZWFtLCAiCisgICAgICAgICJhbGlnbm1lbnQgPSAoc3RyaW5nKSB7IG5hbCwgYXUgfSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2NV9wYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkgyNjVcIiIpCisgICAgICAgICAgICAgICAgLyoqIG9wdGlvbmFsIHBhcmFtZXRlcnMgKiovCisgICAgLyogInByb2ZpbGUtc3BhY2UgPSAoaW50KSBbIDAsIDMgXSwgIiAqLworICAgIC8qICJwcm9maWxlLWlkID0gKGludCkgWyAwLCAzMSBdLCAiICovCisgICAgLyogInRpZXItZmxhZyA9IChpbnQpIFsgMCwgMSBdLCAiICovCisgICAgLyogImxldmVsLWlkID0gKGludCkgWyAwLCAyNTUgXSwgIiAqLworICAgIC8qICJpbnRlcm9wLWNvbnN0cmFpbnRzID0gKHN0cmluZykgQU5ZLCAiICovCisgICAgLyogInByb2ZpbGUtY29tcGF0aWJpbGl0eS1pbmRpY2F0b3IgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICAvKiAic3Byb3Atc3ViLWxheWVyLWlkID0gKGludCkgWyAwLCA2IF0sICIgKi8KKyAgICAvKiAicmVjdi1zdWItbGF5ZXItaWQgPSAoaW50KSBbIDAsIDYgXSwgIiAqLworICAgIC8qICJtYXgtcmVjdi1sZXZlbC1pZCA9IChpbnQpIFsgMCwgMjU1IF0sICIgKi8KKyAgICAvKiAidHgtbW9kZSA9IChzdHJpbmcpIHtNU1QgLCBTU1R9LCAiICovCisgICAgLyogInNwcm9wLXZwcyA9IChzdHJpbmcpIEFOWSwgIiAqLworICAgIC8qICJzcHJvcC1zcHMgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICAvKiAic3Byb3AtcHBzID0gKHN0cmluZykgQU5ZLCAiICovCisgICAgLyogInNwcm9wLXNlaSA9IChzdHJpbmcpIEFOWSwgIiAqLworICAgIC8qICJtYXgtbHNyID0gKGludCkgQU5ZLCAiICovLyogTVVTVCBiZSBpbiB0aGUgcmFuZ2Ugb2YgTWF4THVtYVNSIHRvIDE2ICogTWF4THVtYVNSLCBpbmNsdXNpdmUgKi8KKyAgICAvKiAibWF4LWxwcyA9IChpbnQpIEFOWSwgIiAqLy8qIE1VU1QgYmUgaW4gdGhlIHJhbmdlIG9mIE1heEx1bWFQUyB0byAxNiAqIE1heEx1bWFQUywgaW5jbHVzaXZlICovCisgICAgLyogIm1heC1jcGIgPSAoaW50KSBBTlksICIgKi8vKiBNVVNUIGJlIGluIHRoZSByYW5nZSBvZiBNYXhDUEIgdG8gMTYgKiBNYXhDUEIsIGluY2x1c2l2ZSAqLworICAgIC8qICJtYXgtZHBiID0gKGludCkgWzEsIDE2XSwgIiAqLworICAgIC8qICJtYXgtYnIgPSAoaW50KSBBTlksICIgKi8vKiBNVVNUIGJlIGluIHRoZSByYW5nZSBvZiBNYXhCUiB0byAxNiAqIE1heEJSLCBpbmNsdXNpdmUsIGZvciB0aGUgaGlnaGVzdCBsZXZlbCAqLworICAgIC8qICJtYXgtdHIgPSAoaW50KSBBTlksICIgKi8vKiBNVVNUIGJlIGluIHRoZSByYW5nZSBvZiBNYXhUaWxlUm93cyB0byAxNiAqIE1heFRpbGVSb3dzLCBpbmNsdXNpdmUsIGZvciB0aGUgaGlnaGVzdCBsZXZlbCAqLworICAgIC8qICJtYXgtdGMgPSAoaW50KSBBTlksICIgKi8vKiBNVVNUIGJlIGluIHRoZSByYW5nZSBvZiBNYXhUaWxlQ29scyB0byAxNiAqIE1heFRpbGVDb2xzLCBpbmNsdXNpdmUsIGZvciB0aGUgaGlnaGVzdCBsZXZlbCAqLworICAgIC8qICJtYXgtZnBzID0gKGludCkgQU5ZLCAiICovCisgICAgLyogInNwcm9wLW1heC1kb24tZGlmZiA9IChpbnQpIFswLCAzMjc2N10sICIgKi8KKyAgICAvKiAic3Byb3AtZGVwYWNrLWJ1Zi1uYWx1cyA9IChpbnQpIFswLCAzMjc2N10sICIgKi8KKyAgICAvKiAic3Byb3AtZGVwYWNrLWJ1Zi1uYWx1cyA9IChpbnQpIFswLCA0Mjk0OTY3Mjk1XSwgIiAqLworICAgIC8qICJkZXBhY2stYnVmLWNhcCA9IChpbnQpIFsxLCA0Mjk0OTY3Mjk1XSwgIiAqLworICAgIC8qICJzcHJvcC1zZWdtZW50YXRpb24taWQgPSAoaW50KSBbMCwgM10sICIgKi8KKyAgICAvKiAic3Byb3Atc3BhdGlhbC1zZWdtZW50YXRpb24taWRjID0gKHN0cmluZykgQU5ZLCAiICovCisgICAgLyogImRlYy1wYXJhbGxlbC1jYXAgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICApOworCisjZGVmaW5lIERFRkFVTFRfQ09ORklHX0lOVEVSVkFMCQkgICAgICAwCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0NPTkZJR19JTlRFUlZBTAorfTsKKworI2RlZmluZSBJU19BQ0NFU1NfVU5JVCh4KSAoKCh4KSA+PSAweDAwKSAmJiAoKHgpIDwgMHgyMCkpCisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2NV9wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2gyNjVfcGF5X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2NV9wYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3J0cF9oMjY1X3BheV9nZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0UGFkICogcGFkLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2gyNjVfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9oMjY1X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBhZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfaDI2NV9wYXlfc2lua19ldmVudCAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfaDI2NV9wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworI2RlZmluZSBnc3RfcnRwX2gyNjVfcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cEgyNjVQYXksIGdzdF9ydHBfaDI2NV9wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY1X3BheV9jbGFzc19pbml0IChHc3RSdHBIMjY1UGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX2gyNjVfcGF5X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9oMjY1X3BheV9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIFBST1BfQ09ORklHX0lOVEVSVkFMLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImNvbmZpZy1pbnRlcnZhbCIsCisgICAgICAgICAgIlZQUyBTUFMgUFBTIFNlbmQgSW50ZXJ2YWwiLAorICAgICAgICAgICJTZW5kIFZQUywgU1BTIGFuZCBQUFMgSW5zZXJ0aW9uIEludGVydmFsIGluIHNlY29uZHMgKHNwcm9wIHBhcmFtZXRlciBzZXRzICIKKyAgICAgICAgICAid2lsbCBiZSBtdWx0aXBsZXhlZCBpbiB0aGUgZGF0YSBzdHJlYW0gd2hlbiBkZXRlY3RlZC4pICIKKyAgICAgICAgICAiKDAgPSBkaXNhYmxlZCwgLTEgPSBzZW5kIHdpdGggZXZlcnkgSURSIGZyYW1lKSIsCisgICAgICAgICAgLTEsIDM2MDAsIERFRkFVTFRfQ09ORklHX0lOVEVSVkFMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykKKyAgICAgICk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX2gyNjVfcGF5X2ZpbmFsaXplOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfaDI2NV9wYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9oMjY1X3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUlRQIEgyNjUgcGF5bG9hZGVyIiwKKyAgICAgICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBheWxvYWQtZW5jb2RlIEgyNjUgdmlkZW8gaW50byBSVFAgcGFja2V0cyAoUkZDIDc3OTgpIiwKKyAgICAgICJKdXJnZW4gU2xvd2FjayA8anVyZ2Vuc2xvd2Fja0BnbWFpbC5jb20+Iik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2gyNjVfcGF5X2NoYW5nZV9zdGF0ZSk7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPmdldF9jYXBzID0gZ3N0X3J0cF9oMjY1X3BheV9nZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2gyNjVfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9oMjY1X3BheV9oYW5kbGVfYnVmZmVyOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2lua19ldmVudCA9IGdzdF9ydHBfaDI2NV9wYXlfc2lua19ldmVudDsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwaDI2NXBheV9kZWJ1ZywgInJ0cGgyNjVwYXkiLCAwLAorICAgICAgIkgyNjUgUlRQIFBheWxvYWRlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY1X3BheV9pbml0IChHc3RSdHBIMjY1UGF5ICogcnRwaDI2NXBheSkKK3sKKyAgcnRwaDI2NXBheS0+cXVldWUgPSBnX2FycmF5X25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKGd1aW50KSk7CisgIHJ0cGgyNjVwYXktPnNwcyA9IGdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoCisgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9idWZmZXJfdW5yZWYpOworICBydHBoMjY1cGF5LT5wcHMgPSBnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKAorICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnc3RfYnVmZmVyX3VucmVmKTsKKyAgcnRwaDI2NXBheS0+dnBzID0gZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jICgKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgIHJ0cGgyNjVwYXktPmxhc3RfdnBzX3Nwc19wcHMgPSAtMTsKKyAgcnRwaDI2NXBheS0+dnBzX3Nwc19wcHNfaW50ZXJ2YWwgPSBERUZBVUxUX0NPTkZJR19JTlRFUlZBTDsKKworICBydHBoMjY1cGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY1X3BheV9jbGVhcl92cHNfc3BzX3BwcyAoR3N0UnRwSDI2NVBheSAqIHJ0cGgyNjVwYXkpCit7CisgIGdfcHRyX2FycmF5X3NldF9zaXplIChydHBoMjY1cGF5LT52cHMsIDApOworICBnX3B0cl9hcnJheV9zZXRfc2l6ZSAocnRwaDI2NXBheS0+c3BzLCAwKTsKKyAgZ19wdHJfYXJyYXlfc2V0X3NpemUgKHJ0cGgyNjVwYXktPnBwcywgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjVfcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSdHBIMjY1UGF5ICpydHBoMjY1cGF5OworCisgIHJ0cGgyNjVwYXkgPSBHU1RfUlRQX0gyNjVfUEFZIChvYmplY3QpOworCisgIGdfYXJyYXlfZnJlZSAocnRwaDI2NXBheS0+cXVldWUsIFRSVUUpOworCisgIGdfcHRyX2FycmF5X2ZyZWUgKHJ0cGgyNjVwYXktPnNwcywgVFJVRSk7CisgIGdfcHRyX2FycmF5X2ZyZWUgKHJ0cGgyNjVwYXktPnBwcywgVFJVRSk7CisgIGdfcHRyX2FycmF5X2ZyZWUgKHJ0cGgyNjVwYXktPnZwcywgVFJVRSk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHJ0cGgyNjVwYXktPmFkYXB0ZXIpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyIGFsbF9sZXZlbHNbXVs0XSA9IHsKKyAgIjEiLAorICAiMiIsCisgICIyLjEiLAorICAiMyIsCisgICIzLjEiLAorICAiNCIsCisgICI0LjEiLAorICAiNSIsCisgICI1LjEiLAorICAiNS4yIiwKKyAgIjYiLAorICAiNi4xIiwKKyAgIjYuMiIKK307CisKK3N0YXRpYyBnYm9vbGVhbgorcGFyc2VfZmllbGQgKEdzdFN0cnVjdHVyZSAqIHMsIGNvbnN0IGdjaGFyICogZmllbGQsIGd1bG9uZyBtaW4sIGd1bG9uZyBtYXgsCisgICAgZ3VpbnQ4ICogcmVzdWx0KQoreworICBjb25zdCBnY2hhciAqc3RyOworCisgIGdfYXNzZXJ0IChyZXN1bHQgIT0gTlVMTCk7CisKKyAgc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCBmaWVsZCk7CisgIGlmIChzdHIgIT0gTlVMTCAmJiAqc3RyICE9ICdcMCcpIHsKKyAgICBndWxvbmcgdmFsdWU7CisgICAgZ2NoYXIgKmVuZDsKKworICAgIHZhbHVlID0gc3RydG91bCAoc3RyLCAmZW5kLCAxMCk7CisgICAgaWYgKCplbmQgPT0gJ1wwJyAmJiB2YWx1ZSA+PSBtaW4gJiYgdmFsdWUgPD0gbWF4KSB7CisgICAgICAqcmVzdWx0ID0gKGd1aW50OCkgdmFsdWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9ydHBfaDI2NV9wYXlfZ2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RQYWQgKiBwYWQsCisgICAgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0Q2FwcyAqdGVtcGxhdGVfY2FwczsKKyAgR3N0Q2FwcyAqYWxsb3dlZF9jYXBzOworICBHc3RDYXBzICpjYXBzOworICBHc3RDYXBzICppY2FwczsKKyAgZ3VpbnQgaTsKKworICBhbGxvd2VkX2NhcHMgPQorICAgICAgZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NSQ1BBRCAocGF5bG9hZCksIE5VTEwpOworCisgIGlmIChhbGxvd2VkX2NhcHMgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICB0ZW1wbGF0ZV9jYXBzID0KKyAgICAgIGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldF9jYXBzICgmZ3N0X3J0cF9oMjY1X3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBpZiAoZ3N0X2NhcHNfaXNfYW55IChhbGxvd2VkX2NhcHMpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX3JlZiAodGVtcGxhdGVfY2Fwcyk7CisgICAgZ290byBkb25lOworICB9CisKKyAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChhbGxvd2VkX2NhcHMpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX3JlZiAoYWxsb3dlZF9jYXBzKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworICBmb3IgKGkgPSAwOyBpIDwgZ3N0X2NhcHNfZ2V0X3NpemUgKGFsbG93ZWRfY2Fwcyk7IGkrKykgeworICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGFsbG93ZWRfY2FwcywgaSk7CisgICAgR3N0U3RydWN0dXJlICpuZXdfcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5ICgidmlkZW8veC1oMjY1Iik7CisgICAgZ3VpbnQ4IHB0bFsxMl0gPSB7IDAsIH07CisgICAgZ3VpbnQ4IHZhbHVlOworCisgICAgaWYgKHBhcnNlX2ZpZWxkIChzLCAicHJvZmlsZS1pZCIsIDAsIDMxLCAmdmFsdWUpKSB7CisgICAgICBjb25zdCBnY2hhciAqcHJvZmlsZTsKKworICAgICAgcHRsWzBdID0gdmFsdWU7CisgICAgICBwcm9maWxlID0gZ3N0X2NvZGVjX3V0aWxzX2gyNjVfZ2V0X3Byb2ZpbGUgKHB0bCwgc2l6ZW9mIChwdGwpKTsKKyAgICAgIGlmIChwcm9maWxlICE9IE5VTEwpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGF5bG9hZCwgInByb2ZpbGUgJXMiLCBwcm9maWxlKTsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG5ld19zLCAicHJvZmlsZSIsIEdfVFlQRV9TVFJJTkcsIHByb2ZpbGUsIE5VTEwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXlsb2FkLCAiaW52YWxpZCBwcm9maWxlLWlkICVkIGluIGNhcHMiLCB2YWx1ZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJubyB2YWxpZCBwcm9maWxlLWlkIGluIGNhcHMiKTsKKyAgICB9CisKKyAgICBpZiAocGFyc2VfZmllbGQgKHMsICJ0aWVyLWZsYWciLCAwLCAxLCAmdmFsdWUpKSB7CisgICAgICBjb25zdCBnY2hhciAqdGllcjsKKworICAgICAgcHRsWzBdIHw9IHZhbHVlIDw8IDU7CisgICAgICB0aWVyID0gZ3N0X2NvZGVjX3V0aWxzX2gyNjVfZ2V0X3RpZXIgKHB0bCwgc2l6ZW9mIChwdGwpKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJ0aWVyICVzIiwgdGllcik7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAobmV3X3MsICJ0aWVyIiwgR19UWVBFX1NUUklORywgdGllciwgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJubyB2YWxpZCB0aWVyLWZsYWcgaW4gY2FwcyIpOworICAgIH0KKworICAgIGlmIChwYXJzZV9maWVsZCAocywgImxldmVsLWlkIiwgMCwgMjU1LCAmdmFsdWUpKSB7CisgICAgICBjb25zdCBnY2hhciAqbGV2ZWw7CisKKyAgICAgIHB0bFsxMV0gPSB2YWx1ZTsKKyAgICAgIGxldmVsID0gZ3N0X2NvZGVjX3V0aWxzX2gyNjVfZ2V0X2xldmVsIChwdGwsIHNpemVvZiAocHRsKSk7CisgICAgICBpZiAobGV2ZWwgIT0gTlVMTCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXlsb2FkLCAibGV2ZWwgJXMiLCBsZXZlbCk7CisgICAgICAgIGlmIChzdHJjbXAgKGxldmVsLCAiMSIpID09IDApIHsKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAobmV3X3MsICJsZXZlbCIsIEdfVFlQRV9TVFJJTkcsIGxldmVsLCBOVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHVmFsdWUgbGV2ZWxzID0geyAwLCB9OworICAgICAgICAgIEdWYWx1ZSB2YWwgPSB7IDAsIH07CisgICAgICAgICAgaW50IGo7CisKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZsZXZlbHMsIEdTVF9UWVBFX0xJU1QpOworICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR19UWVBFX1NUUklORyk7CisKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgR19OX0VMRU1FTlRTIChhbGxfbGV2ZWxzKTsgaisrKSB7CisgICAgICAgICAgICBnX3ZhbHVlX3NldF9zdGF0aWNfc3RyaW5nICgmdmFsLCBhbGxfbGV2ZWxzW2pdKTsKKyAgICAgICAgICAgIGdzdF92YWx1ZV9saXN0X3ByZXBlbmRfdmFsdWUgKCZsZXZlbHMsICZ2YWwpOworICAgICAgICAgICAgaWYgKCFzdHJjbXAgKGxldmVsLCBhbGxfbGV2ZWxzW2pdKSkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfdGFrZV92YWx1ZSAobmV3X3MsICJsZXZlbCIsICZsZXZlbHMpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBheWxvYWQsICJpbnZhbGlkIGxldmVsLWlkICVkIGluIGNhcHMiLCB2YWx1ZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJubyB2YWxpZCBsZXZlbC1pZCBpbiBjYXBzIik7CisgICAgfQorCisgICAgY2FwcyA9IGdzdF9jYXBzX21lcmdlX3N0cnVjdHVyZSAoY2FwcywgbmV3X3MpOworICB9CisKKyAgaWNhcHMgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKGNhcHMsIHRlbXBsYXRlX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGNhcHMgPSBpY2FwczsKKworZG9uZToKKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqdG1wOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocGF5bG9hZCwgIkludGVyc2VjdCAlIiBHU1RfUFRSX0ZPUk1BVCAiIGFuZCBmaWx0ZXIgJSIKKyAgICAgICAgR1NUX1BUUl9GT1JNQVQsIGNhcHMsIGZpbHRlcik7CisgICAgdG1wID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgY2FwcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgY2FwcyA9IHRtcDsKKyAgfQorCisgIGdzdF9jYXBzX3VucmVmICh0ZW1wbGF0ZV9jYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGFsbG93ZWRfY2Fwcyk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBheWxvYWQsICJyZXR1cm5pbmcgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisgIHJldHVybiBjYXBzOworfQorCisvKiB0YWtlIHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCBWUFMsIFNQUyBhbmQgUFBTIGxpc3RzIGFuZCBzZXQgdGhlbSBvbiB0aGUKKyAqIGNhcHMgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9oMjY1X3BheV9zZXRfdnBzX3Nwc19wcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQpCit7CisgIEdzdFJ0cEgyNjVQYXkgKnBheWxvYWRlciA9IEdTVF9SVFBfSDI2NV9QQVkgKGJhc2VwYXlsb2FkKTsKKyAgZ2NoYXIgKnNldDsKKyAgR1N0cmluZyAqdnBzOworICBHU3RyaW5nICpzcHM7CisgIEdTdHJpbmcgKnBwczsKKyAgZ3VpbnQgY291bnQ7CisgIGdib29sZWFuIHJlczsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50IGk7CisKKyAgdnBzID0gZ19zdHJpbmdfbmV3ICgiIik7CisgIHNwcyA9IGdfc3RyaW5nX25ldyAoIiIpOworICBwcHMgPSBnX3N0cmluZ19uZXcgKCIiKTsKKyAgY291bnQgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCBwYXlsb2FkZXItPnZwcy0+bGVuOyBpKyspIHsKKyAgICBHc3RCdWZmZXIgKnZwc19idWYgPQorICAgICAgICBHU1RfQlVGRkVSX0NBU1QgKGdfcHRyX2FycmF5X2luZGV4IChwYXlsb2FkZXItPnZwcywgaSkpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKHZwc19idWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgc2V0ID0gZ19iYXNlNjRfZW5jb2RlIChtYXAuZGF0YSwgbWFwLnNpemUpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKHZwc19idWYsICZtYXApOworCisgICAgZ19zdHJpbmdfYXBwZW5kX3ByaW50ZiAodnBzLCAiJXMlcyIsIGkgPyAiLCIgOiAiIiwgc2V0KTsKKyAgICBnX2ZyZWUgKHNldCk7CisgICAgY291bnQrKzsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgcGF5bG9hZGVyLT5zcHMtPmxlbjsgaSsrKSB7CisgICAgR3N0QnVmZmVyICpzcHNfYnVmID0KKyAgICAgICAgR1NUX0JVRkZFUl9DQVNUIChnX3B0cl9hcnJheV9pbmRleCAocGF5bG9hZGVyLT5zcHMsIGkpKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChzcHNfYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIHNldCA9IGdfYmFzZTY0X2VuY29kZSAobWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChzcHNfYnVmLCAmbWFwKTsKKworICAgIGdfc3RyaW5nX2FwcGVuZF9wcmludGYgKHNwcywgIiVzJXMiLCBpID8gIiwiIDogIiIsIHNldCk7CisgICAgZ19mcmVlIChzZXQpOworICAgIGNvdW50Kys7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IHBheWxvYWRlci0+cHBzLT5sZW47IGkrKykgeworICAgIEdzdEJ1ZmZlciAqcHBzX2J1ZiA9CisgICAgICAgIEdTVF9CVUZGRVJfQ0FTVCAoZ19wdHJfYXJyYXlfaW5kZXggKHBheWxvYWRlci0+cHBzLCBpKSk7CisKKyAgICBnc3RfYnVmZmVyX21hcCAocHBzX2J1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBzZXQgPSBnX2Jhc2U2NF9lbmNvZGUgKG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAocHBzX2J1ZiwgJm1hcCk7CisKKyAgICBnX3N0cmluZ19hcHBlbmRfcHJpbnRmIChwcHMsICIlcyVzIiwgaSA/ICIsIiA6ICIiLCBzZXQpOworICAgIGdfZnJlZSAoc2V0KTsKKyAgICBjb3VudCsrOworICB9CisKKyAgaWYgKEdfTElLRUxZIChjb3VudCkpIHsKKyAgICAvKiBjb21iaW5lIGludG8gb3V0cHV0IGNhcHMgKi8KKyAgICByZXMgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAoYmFzZXBheWxvYWQsCisgICAgICAgICJzcHJvcC12cHMiLCBHX1RZUEVfU1RSSU5HLCB2cHMtPnN0ciwKKyAgICAgICAgInNwcm9wLXNwcyIsIEdfVFlQRV9TVFJJTkcsIHNwcy0+c3RyLAorICAgICAgICAic3Byb3AtcHBzIiwgR19UWVBFX1NUUklORywgcHBzLT5zdHIsIE5VTEwpOworICB9IGVsc2UgeworICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChiYXNlcGF5bG9hZCwgTlVMTCk7CisgIH0KKyAgZ19zdHJpbmdfZnJlZSAodnBzLCBUUlVFKTsKKyAgZ19zdHJpbmdfZnJlZSAoc3BzLCBUUlVFKTsKKyAgZ19zdHJpbmdfZnJlZSAocHBzLCBUUlVFKTsKKworICByZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9oMjY1X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UnRwSDI2NVBheSAqcnRwaDI2NXBheTsKKyAgR3N0U3RydWN0dXJlICpzdHI7CisgIGNvbnN0IEdWYWx1ZSAqdmFsdWU7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKmRhdGE7CisgIGdzaXplIHNpemU7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBjb25zdCBnY2hhciAqYWxpZ25tZW50LCAqc3RyZWFtX2Zvcm1hdDsKKyAgZ3VpbnQ4IG51bV9hcnJheXM7CisKKyAgcnRwaDI2NXBheSA9IEdTVF9SVFBfSDI2NV9QQVkgKGJhc2VwYXlsb2FkKTsKKworICBzdHIgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICAvKiB3ZSBjYW4gb25seSBzZXQgdGhlIG91dHB1dCBjYXBzIHdoZW4gd2UgZm91bmQgdGhlIHNwcm9wcyBhbmQgcHJvZmlsZQorICAgKiBOQUxzICovCisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChiYXNlcGF5bG9hZCwgInZpZGVvIiwgVFJVRSwgIkgyNjUiLCA5MDAwMCk7CisKKyAgcnRwaDI2NXBheS0+YWxpZ25tZW50ID0gR1NUX0gyNjVfQUxJR05NRU5UX1VOS05PV047CisgIGFsaWdubWVudCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RyLCAiYWxpZ25tZW50Iik7CisgIGlmIChhbGlnbm1lbnQpIHsKKyAgICBpZiAoZ19zdHJfZXF1YWwgKGFsaWdubWVudCwgImF1IikpCisgICAgICBydHBoMjY1cGF5LT5hbGlnbm1lbnQgPSBHU1RfSDI2NV9BTElHTk1FTlRfQVU7CisgICAgaWYgKGdfc3RyX2VxdWFsIChhbGlnbm1lbnQsICJuYWwiKSkKKyAgICAgIHJ0cGgyNjVwYXktPmFsaWdubWVudCA9IEdTVF9IMjY1X0FMSUdOTUVOVF9OQUw7CisgIH0KKworICBydHBoMjY1cGF5LT5zdHJlYW1fZm9ybWF0ID0gR1NUX0gyNjVfU1RSRUFNX0ZPUk1BVF9VTktOT1dOOworICBzdHJlYW1fZm9ybWF0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHIsICJzdHJlYW0tZm9ybWF0Iik7CisgIGlmIChzdHJlYW1fZm9ybWF0KSB7CisgICAgaWYgKGdfc3RyX2VxdWFsIChzdHJlYW1fZm9ybWF0LCAiaHZjMSIpKQorICAgICAgcnRwaDI2NXBheS0+c3RyZWFtX2Zvcm1hdCA9IEdTVF9IMjY1X1NUUkVBTV9GT1JNQVRfSFZDMTsKKyAgICBpZiAoZ19zdHJfZXF1YWwgKHN0cmVhbV9mb3JtYXQsICJoZXYxIikpCisgICAgICBydHBoMjY1cGF5LT5zdHJlYW1fZm9ybWF0ID0gR1NUX0gyNjVfU1RSRUFNX0ZPUk1BVF9IRVYxOworICAgIGlmIChnX3N0cl9lcXVhbCAoc3RyZWFtX2Zvcm1hdCwgImJ5dGUtc3RyZWFtIikpCisgICAgICBydHBoMjY1cGF5LT5zdHJlYW1fZm9ybWF0ID0gR1NUX0gyNjVfU1RSRUFNX0ZPUk1BVF9CWVRFU1RSRUFNOworICB9CisKKyAgLyogcGFja2V0aXplZCBIRVZDIHZpZGVvIGhhcyBhIGNvZGVjX2RhdGEgKi8KKyAgaWYgKCh2YWx1ZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHIsICJjb2RlY19kYXRhIikpKSB7CisgICAgZ3VpbnQgbnVtX3ZwcywgbnVtX3NwcywgbnVtX3BwczsKKyAgICBnaW50IGksIGosIG5hbF9zaXplOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NXBheSwgImhhdmUgcGFja2V0aXplZCBoMjY1Iik7CisKKyAgICBidWZmZXIgPSBnc3RfdmFsdWVfZ2V0X2J1ZmZlciAodmFsdWUpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBkYXRhID0gbWFwLmRhdGE7CisgICAgc2l6ZSA9IG1hcC5zaXplOworCisgICAgLyogcGFyc2UgdGhlIGhldmNDIGRhdGEgKi8KKyAgICBpZiAoc2l6ZSA8IDIzKQorICAgICAgZ290byBoZXZjY190b29fc21hbGw7CisgICAgLyogSEVWQ0RlY29kZXJDb25maWd1cmF0aW9uVmVyc2lvbiAobXVzdCBiZSAxKSAqLworICAgIGlmIChkYXRhWzBdICE9IDEpCisgICAgICBnb3RvIHdyb25nX3ZlcnNpb247CisKKyAgICAvKiBwcm9maWxlX3NwYWNlIHwgdGllcl9mbGFnIHwgcHJvZmlsZV9pZGMgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAicHJvZmlsZSAlMDZ4IiwgZGF0YVsxXSk7CisKKyAgICAvKiBwcm9maWxlX2NvbXBhdGliaWxpdHlfZmxhZ3MgKi8KKyAgICBmb3IgKGkgPSAyOyBpIDwgNjsgaSsrKSB7CisgICAgICBmb3IgKGogPSA3OyBqID49IDA7IGotLSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAicHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWcgJTA2eCIsCisgICAgICAgICAgICAoZGF0YVtpXSA+PiBqKSAmIDEpOworICAgICAgfQorICAgIH0KKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVwYXksICJwcm9ncmVzc2l2ZV9zb3VyY2VfZmxhZyAlMDZ4IiwKKyAgICAgICAgKGRhdGFbNl0gPj4gNykgJiAxKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAiaW50ZXJsYWNlZF9zb3VyY2VfZmxhZyAlMDZ4IiwKKyAgICAgICAgKGRhdGFbNl0gPj4gNikgJiAxKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAibm9uX3BhY2tlZF9jb25zdHJhaW50X2ZsYWcgJTA2eCIsCisgICAgICAgIChkYXRhWzZdID4+IDUpICYgMSk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NXBheSwgImZyYW1lX29ubHlfY29uc3RyYWludF9mbGFnICUwNngiLAorICAgICAgICAoZGF0YVs2XSA+PiA0KSAmIDEpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NXBheSwgImxldmVsX2lkYyAlMDZ4IiwgZGF0YVsxMl0pOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NXBheSwgIm1pbl9zcGF0aWFsX3NlZ21lbnRhdGlvbl9pZGMgJTA2eCIsCisgICAgICAgICgoZGF0YVsxM10gXiAweGYwKSA8PCA4KSArIGRhdGFbMTRdKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAicGFycmFsbGVsaXNtVHlwZSAlMDZ4IChpZ25vcmVkIGJ5IHBhbG9hZGVyKSIsCisgICAgICAgIGRhdGFbMTVdKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVwYXksICJzcHNfY2hyb21hX2Zvcm1hdF9pZGMgJTA2eCIsCisgICAgICAgIGRhdGFbMTZdIF4gMHhmYyk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NXBheSwgImJpdF9kZXB0aF9sdW1hX21pbnVzOCAlMDZ4IiwKKyAgICAgICAgZGF0YVsxN10gXiAweGY4KTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAiYml0X2RlcHRoX2Nocm9tYV9taW51czggJTA2eCIsCisgICAgICAgIGRhdGFbMThdIF4gMHhmOCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NXBheSwgImF2Z0ZyYW1lUmF0ZSAlMDZ4IiwgZGF0YVsxOV0pOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVwYXksICJhdmdGcmFtZVJhdGUgJTA2eCIsIGRhdGFbMjBdKTsKKworICAgIC8qIGNvbnN0RnJhbWVSYXRlKDIgYml0cyk6IDAsIHN0cmVhbSBtYXkgb3IgbWF5IG5vdCBiZSBvZiBjb25zdGFudCBmcmFtZXJhdGUKKyAgICAgKiBudW1UZW1wb3JhbExheWVycyAoMyBiaXRzKTogbnVtYmVyIG9mIHRlbXBvcmFsIGxheWVycywgdmFsdWUgZnJvbSBTUFMKKyAgICAgKiBUZW1wb3JhbElkTmVzdGVkICgxIGJpdCk6IHNwc190ZW1wb3JhbF9pZF9uZXN0aW5nX2ZsYWcgZnJvbSBTUFMKKyAgICAgKiBsZW5ndGhTaXplTWludXNPbmUgKDIgYml0cyk6IHBsdXMgMSBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiB0aGUgTkFMVW5pdExlbmd0aCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVwYXksICJjb25zdEZyYW1lUmF0ZSAlMDZ4IiwKKyAgICAgICAgKGRhdGFbMjFdID4+IDYpICYgMHgwMyk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NXBheSwgIm51bVRlbXBvcmFsTGF5ZXJzICUwNngiLAorICAgICAgICAoZGF0YVsyMV0gPj4gMykgJiAweDA3KTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAidGVtcG9yYWxfaWRfbmVzdGluZ19mbGFnICUwNngiLAorICAgICAgICAoZGF0YVsyMV0gPj4gMikgJiAweDAxKTsKKworICAgIHJ0cGgyNjVwYXktPm5hbF9sZW5ndGhfc2l6ZSA9IChkYXRhWzIxXSAmIDB4MykgKyAxOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVwYXksICJuYWwgbGVuZ3RoICV1IiwgcnRwaDI2NXBheS0+bmFsX2xlbmd0aF9zaXplKTsKKworICAgIG51bV9hcnJheXMgPSBHU1RfUkVBRF9VSU5UOCAoZGF0YSArIDIyKTsKKworICAgIGRhdGEgKz0gMjM7CisgICAgc2l6ZSAtPSAyMzsKKworICAgIGlmIChudW1fYXJyYXlzID4gMCkgeworICAgICAgaWYgKChkYXRhWzBdICYgMHgzZikgPT0gMHgyMCkgeyAgIC8qIFZQUyAqLworCisgICAgICAgIGRhdGErKzsKKyAgICAgICAgbnVtX3ZwcyA9IGRhdGFbMF0gPDwgOCB8IGRhdGFbMV07CisgICAgICAgIGRhdGEgKz0gMjsKKyAgICAgICAgc2l6ZSAtPSAyOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdnBzOyBpKyspIHsKKworICAgICAgICAgIEdzdEJ1ZmZlciAqdnBzX2J1ZjsKKworICAgICAgICAgIGlmIChzaXplIDwgMikKKyAgICAgICAgICAgIGdvdG8gaGV2Y2NfZXJyb3I7CisKKyAgICAgICAgICBuYWxfc2l6ZSA9IChkYXRhWzBdIDw8IDgpIHwgZGF0YVsxXTsKKyAgICAgICAgICBkYXRhICs9IDI7CisgICAgICAgICAgc2l6ZSAtPSAyOworCisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGgyNjVwYXksICJWUFMgJWQgc2l6ZSAlZCIsIGksIG5hbF9zaXplKTsKKworICAgICAgICAgIGlmIChzaXplIDwgbmFsX3NpemUpCisgICAgICAgICAgICBnb3RvIGhldmNjX2Vycm9yOworCisgICAgICAgICAgLyogbWFrZSBhIGJ1ZmZlciBvdXQgb2YgaXQgYW5kIGFkZCB0byBWUFMgbGlzdCAqLworICAgICAgICAgIHZwc19idWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG5hbF9zaXplKTsKKyAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKHZwc19idWYsIDAsIGRhdGEsIG5hbF9zaXplKTsKKyAgICAgICAgICBnc3RfcnRwX2gyNjVfYWRkX3Zwc19zcHNfcHBzIChHU1RfRUxFTUVOVCAocnRwaDI2NXBheSksCisgICAgICAgICAgICAgIHJ0cGgyNjVwYXktPnZwcywgcnRwaDI2NXBheS0+c3BzLCBydHBoMjY1cGF5LT5wcHMsIHZwc19idWYpOworICAgICAgICAgIGRhdGEgKz0gbmFsX3NpemU7CisgICAgICAgICAgc2l6ZSAtPSBuYWxfc2l6ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAtLW51bV9hcnJheXM7CisgICAgfQorCisgICAgaWYgKG51bV9hcnJheXMgPiAwKSB7CisgICAgICBpZiAoKGRhdGFbMF0gJiAweDNmKSA9PSAweDIxKSB7ICAgLyogU1BTICovCisKKyAgICAgICAgZGF0YSsrOworICAgICAgICBudW1fc3BzID0gZGF0YVswXSA8PCA4IHwgZGF0YVsxXTsKKyAgICAgICAgZGF0YSArPSAyOworICAgICAgICBzaXplIC09IDI7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9zcHM7IGkrKykgeworCisgICAgICAgICAgR3N0QnVmZmVyICpzcHNfYnVmOworCisgICAgICAgICAgaWYgKHNpemUgPCAyKQorICAgICAgICAgICAgZ290byBoZXZjY19lcnJvcjsKKworICAgICAgICAgIG5hbF9zaXplID0gKGRhdGFbMF0gPDwgOCkgfCBkYXRhWzFdOworICAgICAgICAgIGRhdGEgKz0gMjsKKyAgICAgICAgICBzaXplIC09IDI7CisKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2NXBheSwgIlNQUyAlZCBzaXplICVkIiwgaSwgbmFsX3NpemUpOworCisgICAgICAgICAgaWYgKHNpemUgPCBuYWxfc2l6ZSkKKyAgICAgICAgICAgIGdvdG8gaGV2Y2NfZXJyb3I7CisKKyAgICAgICAgICAvKiBtYWtlIGEgYnVmZmVyIG91dCBvZiBpdCBhbmQgYWRkIHRvIFNQUyBsaXN0ICovCisgICAgICAgICAgc3BzX2J1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobmFsX3NpemUpOworICAgICAgICAgIGdzdF9idWZmZXJfZmlsbCAoc3BzX2J1ZiwgMCwgZGF0YSwgbmFsX3NpemUpOworICAgICAgICAgIGdzdF9ydHBfaDI2NV9hZGRfdnBzX3Nwc19wcHMgKEdTVF9FTEVNRU5UIChydHBoMjY1cGF5KSwKKyAgICAgICAgICAgICAgcnRwaDI2NXBheS0+dnBzLCBydHBoMjY1cGF5LT5zcHMsIHJ0cGgyNjVwYXktPnBwcywgc3BzX2J1Zik7CisgICAgICAgICAgZGF0YSArPSBuYWxfc2l6ZTsKKyAgICAgICAgICBzaXplIC09IG5hbF9zaXplOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC0tbnVtX2FycmF5czsKKyAgICB9CisKKyAgICBpZiAobnVtX2FycmF5cyA+IDApIHsKKyAgICAgIGlmICgoZGF0YVswXSAmIDB4M2YpID09IDB4MjIpIHsgICAvKiBQUFMgKi8KKworICAgICAgICBkYXRhKys7CisgICAgICAgIG51bV9wcHMgPSBkYXRhWzBdIDw8IDggfCBkYXRhWzFdOworICAgICAgICBkYXRhICs9IDI7CisgICAgICAgIHNpemUgLT0gMjsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BwczsgaSsrKSB7CisKKyAgICAgICAgICBHc3RCdWZmZXIgKnBwc19idWY7CisKKyAgICAgICAgICBpZiAoc2l6ZSA8IDIpCisgICAgICAgICAgICBnb3RvIGhldmNjX2Vycm9yOworCisgICAgICAgICAgbmFsX3NpemUgPSAoZGF0YVswXSA8PCA4KSB8IGRhdGFbMV07CisgICAgICAgICAgZGF0YSArPSAyOworICAgICAgICAgIHNpemUgLT0gMjsKKworICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBoMjY1cGF5LCAiUFBTICVkIHNpemUgJWQiLCBpLCBuYWxfc2l6ZSk7CisKKyAgICAgICAgICBpZiAoc2l6ZSA8IG5hbF9zaXplKQorICAgICAgICAgICAgZ290byBoZXZjY19lcnJvcjsKKworICAgICAgICAgIC8qIG1ha2UgYSBidWZmZXIgb3V0IG9mIGl0IGFuZCBhZGQgdG8gUFBTIGxpc3QgKi8KKyAgICAgICAgICBwcHNfYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChuYWxfc2l6ZSk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl9maWxsIChwcHNfYnVmLCAwLCBkYXRhLCBuYWxfc2l6ZSk7CisgICAgICAgICAgZ3N0X3J0cF9oMjY1X2FkZF92cHNfc3BzX3BwcyAoR1NUX0VMRU1FTlQgKHJ0cGgyNjVwYXkpLAorICAgICAgICAgICAgICBydHBoMjY1cGF5LT52cHMsIHJ0cGgyNjVwYXktPnNwcywgcnRwaDI2NXBheS0+cHBzLCBwcHNfYnVmKTsKKyAgICAgICAgICBkYXRhICs9IG5hbF9zaXplOworICAgICAgICAgIHNpemUgLT0gbmFsX3NpemU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLS1udW1fYXJyYXlzOworICAgIH0KKworICAgIC8qIGFuZCB1cGRhdGUgdGhlIGNhcHMgd2l0aCB0aGUgY29sbGVjdGVkIGRhdGEgKi8KKyAgICBpZiAoIWdzdF9ydHBfaDI2NV9wYXlfc2V0X3Zwc19zcHNfcHBzIChiYXNlcGF5bG9hZCkpCisgICAgICBnb3RvIHNldF92cHNfc3BzX3Bwc19mYWlsZWQ7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAiQ2FwcyBoYXZlIGJlZW4gc2V0Iik7CisKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVwYXksICJoYXZlIGJ5dGVzdHJlYW0gaDI2NSIpOworICB9CisKKyAgcmV0dXJuIFRSVUU7CisKK2hldmNjX3Rvb19zbWFsbDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGgyNjVwYXksICJoZXZjQyBzaXplICUiIEdfR1NJWkVfRk9STUFUICIgPCA3Iiwgc2l6ZSk7CisgICAgZ290byBlcnJvcjsKKyAgfQord3JvbmdfdmVyc2lvbjoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGgyNjVwYXksICJ3cm9uZyBoZXZjQyB2ZXJzaW9uIik7CisgICAgZ290byBlcnJvcjsKKyAgfQoraGV2Y2NfZXJyb3I6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChydHBoMjY1cGF5LCAiaGV2Y0MgdG9vIHNtYWxsICIpOworICAgIGdvdG8gZXJyb3I7CisgIH0KK3NldF92cHNfc3BzX3Bwc19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChydHBoMjY1cGF5LCAiZmFpbGVkIHRvIHNldCB2cHMvc3BzL3BwcyIpOworICAgIGdvdG8gZXJyb3I7CisgIH0KK2Vycm9yOgorICB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGd1aW50CituZXh0X3N0YXJ0X2NvZGUgKGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUpCit7CisgIC8qIEJveWVyLU1vb3JlIHN0cmluZyBtYXRjaGluZyBhbGdvcml0aG0sIGluIGEgZGVnZW5lcmF0aXZlCisgICAqIHNlbnNlIGJlY2F1c2Ugb3VyIHNlYXJjaCAnYWxwaGFiZXQnIGlzIGJpbmFyeSAtIDAgJiAxIG9ubHkuCisgICAqIFRoaXMgYWxsb3cgdXMgdG8gc2ltcGxpZnkgdGhlIGdlbmVyYWwgQk0gYWxnb3JpdGhtIHRvIGEgdmVyeQorICAgKiBzaW1wbGUgZm9ybS4gKi8KKyAgLyogYXNzdW1lIDEgaXMgaW4gdGhlIDNyZCBieXRlICovCisgIGd1aW50IG9mZnNldCA9IDI7CisKKyAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKKyAgICBpZiAoMSA9PSBkYXRhW29mZnNldF0pIHsKKyAgICAgIHVuc2lnbmVkIGludCBzaGlmdCA9IG9mZnNldDsKKworICAgICAgaWYgKDAgPT0gZGF0YVstLXNoaWZ0XSkgeworICAgICAgICBpZiAoMCA9PSBkYXRhWy0tc2hpZnRdKSB7CisgICAgICAgICAgcmV0dXJuIHNoaWZ0OworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBUaGUganVtcCBpcyBhbHdheXMgMyBiZWNhdXNlIG9mIHRoZSAxIHByZXZpb3VzbHkgbWF0Y2hlZC4KKyAgICAgICAqIEFsbCB0aGUgMCdzIG11c3QgYmUgYWZ0ZXIgdGhpcyAnMScgbWF0Y2hlZCBhdCBvZmZzZXQgKi8KKyAgICAgIG9mZnNldCArPSAzOworICAgIH0gZWxzZSBpZiAoMCA9PSBkYXRhW29mZnNldF0pIHsKKyAgICAgIC8qIG1heWJlIG5leHQgYnl0ZSBpcyAxPyAqLworICAgICAgb2Zmc2V0Kys7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGNhbiBqdW1wIDMgYnl0ZXMgZm9yd2FyZCAqLworICAgICAgb2Zmc2V0ICs9IDM7CisgICAgfQorICAgIC8qIGF0IGVhY2ggaXRlcmF0aW9uLCB3ZSByZXNjYW4gaW4gYSBiYWNrd2FyZCBtYW5uZXIgdW50aWwKKyAgICAgKiB3ZSBtYXRjaCAwLjAuMSBpbiByZXZlcnNlIG9yZGVyLiBTaW5jZSBvdXIgc2VhcmNoIHN0cmluZworICAgICAqIGhhcyBvbmx5IDIgJ2FscGFiZXRzJyAoaS5lLiAwICYgMSksIHdlIGtub3cgdGhhdCBhbnkKKyAgICAgKiBtaXNtYXRjaCB3aWxsIGZvcmNlIHVzIHRvIHNoaWZ0IGEgZml4ZWQgbnVtYmVyIG9mIHN0ZXBzICovCisgIH0KKyAgR1NUX0RFQlVHICgiQ2Fubm90IGZpbmQgbmV4dCBOQUwgc3RhcnQgY29kZS4gcmV0dXJuaW5nICV1Iiwgc2l6ZSk7CisKKyAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9oMjY1X3BheV9kZWNvZGVfbmFsIChHc3RSdHBIMjY1UGF5ICogcGF5bG9hZGVyLAorICAgIGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsIEdzdENsb2NrVGltZSBkdHMsIEdzdENsb2NrVGltZSBwdHMpCit7CisgIGd1aW50OCB0eXBlOworICBnYm9vbGVhbiB1cGRhdGVkOworCisgIC8qIGRlZmF1bHQgaXMgbm8gdXBkYXRlICovCisgIHVwZGF0ZWQgPSBGQUxTRTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYXlsb2FkZXIsICJOQUwgcGF5bG9hZCBzaXplICV1Iiwgc2l6ZSk7CisKKyAgdHlwZSA9IChkYXRhWzBdID4+IDEpICYgMHgzZjsKKworICAvKiBXZSByZWNvcmQgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBTUFMvUFBTIHNvCisgICAqIHRoYXQgd2UgY2FuIGluc2VydCB0aGVtIGF0IHJlZ3VsYXIgaW50ZXJ2YWxzIGFuZCB3aGVuIG5lZWRlZC4gKi8KKyAgaWYgKEdTVF9IMjY1X05BTF9WUFMgPT0gdHlwZSB8fCBHU1RfSDI2NV9OQUxfU1BTID09IHR5cGUKKyAgICAgIHx8IEdTVF9IMjY1X05BTF9QUFMgPT0gdHlwZSkgeworICAgIEdzdEJ1ZmZlciAqbmFsOworCisgICAgLyogdHJhaWxpbmcgMHgwIGFyZSBub3QgcGFydCBvZiB0aGUgVlBTL1NQUy9QUFMgKi8KKyAgICB3aGlsZSAoc2l6ZSA+IDAgJiYgZGF0YVtzaXplIC0gMV0gPT0gMHgwKQorICAgICAgc2l6ZS0tOworCisgICAgLyogZW5jb2RlIHRoZSBlbnRpcmUgTkFMIGluIGJhc2U2NCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWRlciwgImZvdW5kICVzICh0eXBlIDB4JXgpLCBzaXplICV1IiwKKyAgICAgICAgdHlwZSA9PSBHU1RfSDI2NV9OQUxfVlBTID8gIlZQUyIgOiB0eXBlID09IEdTVF9IMjY1X05BTF9TUFMgPworICAgICAgICAiU1BTIiA6ICJQUFMiLCB0eXBlLCBzaXplKTsKKworICAgIG5hbCA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCBzaXplLCBOVUxMKTsKKyAgICBnc3RfYnVmZmVyX2ZpbGwgKG5hbCwgMCwgZGF0YSwgc2l6ZSk7CisKKyAgICB1cGRhdGVkID0gZ3N0X3J0cF9oMjY1X2FkZF92cHNfc3BzX3BwcyAoR1NUX0VMRU1FTlQgKHBheWxvYWRlciksCisgICAgICAgIHBheWxvYWRlci0+dnBzLCBwYXlsb2FkZXItPnNwcywgcGF5bG9hZGVyLT5wcHMsIG5hbCk7CisKKyAgICAvKiByZW1lbWJlciB3aGVuIHdlIGxhc3Qgc2F3IFZQUyAqLworICAgIGlmICh1cGRhdGVkICYmIHB0cyAhPSAtMSkKKyAgICAgIHBheWxvYWRlci0+bGFzdF92cHNfc3BzX3BwcyA9IHB0czsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXlsb2FkZXIsICJOQUxVIHR5cGUgMHgleCwgc2l6ZSAldSIsIHR5cGUsIHNpemUpOworICB9CisKKyAgcmV0dXJuIHVwZGF0ZWQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2gyNjVfcGF5X3BheWxvYWRfbmFsIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdQdHJBcnJheSAqIHBheWJ1ZnMsIEdzdENsb2NrVGltZSBkdHMsIEdzdENsb2NrVGltZSBwdHMpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9oMjY1X3BheV9zZW5kX3Zwc19zcHNfcHBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdFJ0cEgyNjVQYXkgKiBydHBoMjY1cGF5LCBHc3RDbG9ja1RpbWUgZHRzLCBHc3RDbG9ja1RpbWUgcHRzKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBnYm9vbGVhbiBzZW50X2FsbF92cHNfc3BzX3BwcyA9IFRSVUU7CisgIGd1aW50IGk7CisgIEdQdHJBcnJheSAqYnVmczsKKworICBidWZzID0gZ19wdHJfYXJyYXlfbmV3ICgpOworCisgIGZvciAoaSA9IDA7IGkgPCBydHBoMjY1cGF5LT52cHMtPmxlbjsgaSsrKSB7CisgICAgR3N0QnVmZmVyICp2cHNfYnVmID0KKyAgICAgICAgR1NUX0JVRkZFUl9DQVNUIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NXBheS0+dnBzLCBpKSk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAiaW5zZXJ0aW5nIFZQUyBpbiB0aGUgc3RyZWFtIik7CisgICAgZ19wdHJfYXJyYXlfYWRkIChidWZzLCBnc3RfYnVmZmVyX3JlZiAodnBzX2J1ZikpOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBydHBoMjY1cGF5LT5zcHMtPmxlbjsgaSsrKSB7CisgICAgR3N0QnVmZmVyICpzcHNfYnVmID0KKyAgICAgICAgR1NUX0JVRkZFUl9DQVNUIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NXBheS0+c3BzLCBpKSk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAiaW5zZXJ0aW5nIFNQUyBpbiB0aGUgc3RyZWFtIik7CisgICAgZ19wdHJfYXJyYXlfYWRkIChidWZzLCBnc3RfYnVmZmVyX3JlZiAoc3BzX2J1ZikpOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBydHBoMjY1cGF5LT5wcHMtPmxlbjsgaSsrKSB7CisgICAgR3N0QnVmZmVyICpwcHNfYnVmID0KKyAgICAgICAgR1NUX0JVRkZFUl9DQVNUIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NXBheS0+cHBzLCBpKSk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAiaW5zZXJ0aW5nIFBQUyBpbiB0aGUgc3RyZWFtIik7CisgICAgZ19wdHJfYXJyYXlfYWRkIChidWZzLCBnc3RfYnVmZmVyX3JlZiAocHBzX2J1ZikpOworICB9CisKKyAgcmV0ID0gZ3N0X3J0cF9oMjY1X3BheV9wYXlsb2FkX25hbCAoYmFzZXBheWxvYWQsIGJ1ZnMsIGR0cywgcHRzKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgIC8qIG5vdCBjcml0aWNhbCBidXQgd2FybiAqLworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYmFzZXBheWxvYWQsICJmYWlsZWQgcHVzaGluZyBWUFMvU1BTL1BQUyIpOworCisgICAgc2VudF9hbGxfdnBzX3Nwc19wcHMgPSBGQUxTRTsKKyAgfQorCisgIGlmIChwdHMgIT0gLTEgJiYgc2VudF9hbGxfdnBzX3Nwc19wcHMpCisgICAgcnRwaDI2NXBheS0+bGFzdF92cHNfc3BzX3BwcyA9IHB0czsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9oMjY1X3BheV9wYXlsb2FkX25hbCAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHUHRyQXJyYXkgKiBwYXlidWZzLCBHc3RDbG9ja1RpbWUgZHRzLCBHc3RDbG9ja1RpbWUgcHRzKQoreworICBHc3RSdHBIMjY1UGF5ICpydHBoMjY1cGF5OworICBndWludCBtdHU7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBnaW50IGk7CisgIGdib29sZWFuIHNlbnRfcHM7CisKKyAgcnRwaDI2NXBheSA9IEdTVF9SVFBfSDI2NV9QQVkgKGJhc2VwYXlsb2FkKTsKKyAgbXR1ID0gR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVIChydHBoMjY1cGF5KTsKKworICAvKiBzaG91bGQgc2V0IHNyYyBjYXBzIGJlZm9yZSBwdXNoaW5nIHN0dWZmLAorICAgKiBhbmQgaWYgd2UgZGlkIG5vdCBzZWUgZW5vdWdoIFZQUy9TUFMvUFBTLCB0aGF0IG1heSBub3QgYmUgdGhlIGNhc2UgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKCFnc3RfcGFkX2hhc19jdXJyZW50X2NhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NSQ1BBRAorICAgICAgICAgICAgICAoYmFzZXBheWxvYWQpKSkpCisgICAgZ3N0X3J0cF9oMjY1X3BheV9zZXRfdnBzX3Nwc19wcHMgKGJhc2VwYXlsb2FkKTsKKworICByZXQgPSBHU1RfRkxPV19PSzsKKyAgc2VudF9wcyA9IEZBTFNFOworICBmb3IgKGkgPSAwOyBpIDwgcGF5YnVmcy0+bGVuOyBpKyspIHsKKyAgICBndWludDggbmFsSGVhZGVyWzJdOworICAgIGd1aW50OCBuYWxUeXBlOworICAgIGd1aW50IHBhY2tldF9sZW4sIHBheWxvYWRfbGVuOworICAgIEdzdEJ1ZmZlciAqcGF5YnVmOworICAgIEdzdEJ1ZmZlciAqb3V0YnVmOworICAgIGd1aW50OCAqcGF5bG9hZDsKKyAgICBHc3RCdWZmZXJMaXN0ICpvdXRsaXN0ID0gTlVMTDsKKyAgICBnYm9vbGVhbiBzZW5kX3BzOworICAgIEdzdFJUUEJ1ZmZlciBydHAgPSB7IE5VTEwgfTsKKyAgICBndWludCBzaXplOworCisgICAgcGF5YnVmID0gZ19wdHJfYXJyYXlfaW5kZXggKHBheWJ1ZnMsIGkpOworCisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgICAgLyogdW5yZWYgYnVmZmVycyB0aGF0IHdpbGwgbm90IGJlIHBheWxvYWRlZCBhZnRlciBhIGZsb3cgZXJyb3IgKi8KKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHBheWJ1Zik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAocGF5YnVmKTsKKyAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKHBheWJ1ZiwgMCwgbmFsSGVhZGVyLCAyKTsKKyAgICBuYWxUeXBlID0gKG5hbEhlYWRlclswXSA+PiAxKSAmIDB4M2Y7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAiUHJvY2Vzc2luZyBCdWZmZXIgd2l0aCBOQUwgVFlQRT0lZCIsCisgICAgICAgIG5hbFR5cGUpOworCisgICAgc2VuZF9wcyA9IEZBTFNFOworCisgICAgLyogY2hlY2sgaWYgd2UgbmVlZCB0byBlbWl0IGFuIFZQUy9TUFMvUFBTIG5vdyAqLworICAgIGlmICgobmFsVHlwZSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfVFJBSUxfTikKKyAgICAgICAgfHwgKG5hbFR5cGUgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX1RSQUlMX1IpCisgICAgICAgIHx8IChuYWxUeXBlID09IEdTVF9IMjY1X05BTF9TTElDRV9UU0FfTikKKyAgICAgICAgfHwgKG5hbFR5cGUgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX1RTQV9SKQorICAgICAgICB8fCAobmFsVHlwZSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfU1RTQV9OKQorICAgICAgICB8fCAobmFsVHlwZSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfU1RTQV9SKQorICAgICAgICB8fCAobmFsVHlwZSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfUkFTTF9OKQorICAgICAgICB8fCAobmFsVHlwZSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfUkFTTF9SKQorICAgICAgICB8fCAobmFsVHlwZSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfQkxBX1dfTFApCisgICAgICAgIHx8IChuYWxUeXBlID09IEdTVF9IMjY1X05BTF9TTElDRV9CTEFfV19SQURMKQorICAgICAgICB8fCAobmFsVHlwZSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfQkxBX05fTFApCisgICAgICAgIHx8IChuYWxUeXBlID09IEdTVF9IMjY1X05BTF9TTElDRV9JRFJfV19SQURMKQorICAgICAgICB8fCAobmFsVHlwZSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfSURSX05fTFApCisgICAgICAgIHx8IChuYWxUeXBlID09IEdTVF9IMjY1X05BTF9TTElDRV9DUkFfTlVUKSkgeworICAgICAgaWYgKHJ0cGgyNjVwYXktPnZwc19zcHNfcHBzX2ludGVydmFsID4gMCkgeworICAgICAgICBpZiAocnRwaDI2NXBheS0+bGFzdF92cHNfc3BzX3BwcyAhPSAtMSkgeworICAgICAgICAgIGd1aW50NjQgZGlmZjsKKworICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBoMjY1cGF5LAorICAgICAgICAgICAgICAibm93ICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBsYXN0IFZQUy9TUFMvUFBTICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocHRzKSwKKyAgICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocnRwaDI2NXBheS0+bGFzdF92cHNfc3BzX3BwcykpOworCisgICAgICAgICAgLyogY2FsY3VsYXRlIGRpZmYgYmV0d2VlbiBsYXN0IFNQUy9QUFMgaW4gbWlsbGlzZWNvbmRzICovCisgICAgICAgICAgaWYgKHB0cyA+IHJ0cGgyNjVwYXktPmxhc3RfdnBzX3Nwc19wcHMpCisgICAgICAgICAgICBkaWZmID0gcHRzIC0gcnRwaDI2NXBheS0+bGFzdF92cHNfc3BzX3BwczsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBkaWZmID0gMDsKKworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVwYXksCisgICAgICAgICAgICAgICJpbnRlcnZhbCBzaW5jZSBsYXN0IFZQUy9TUFMvUFBTICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZGlmZikpOworCisgICAgICAgICAgLyogYmlnZ2VyIHRoYW4gaW50ZXJ2YWwsIHF1ZXVlIFNQUy9QUFMgKi8KKyAgICAgICAgICBpZiAoR1NUX1RJTUVfQVNfU0VDT05EUyAoZGlmZikgPj0gcnRwaDI2NXBheS0+dnBzX3Nwc19wcHNfaW50ZXJ2YWwpIHsKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVwYXksICJ0aW1lIHRvIHNlbmQgVlBTL1NQUy9QUFMiKTsKKyAgICAgICAgICAgIHNlbmRfcHMgPSBUUlVFOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBubyBrbm93biBwcmV2aW91cyBTUFMvUFBTIHRpbWUsIHNlbmQgbm93ICovCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NXBheSwKKyAgICAgICAgICAgICAgIm5vIHByZXZpb3VzIFZQUy9TUFMvUFBTIHRpbWUsIHNlbmQgbm93Iik7CisgICAgICAgICAgc2VuZF9wcyA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAocnRwaDI2NXBheS0+dnBzX3Nwc19wcHNfaW50ZXJ2YWwgPT0gLTEKKyAgICAgICAgICAmJiAobmFsVHlwZSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfSURSX1dfUkFETAorICAgICAgICAgICAgICB8fCBuYWxUeXBlID09IEdTVF9IMjY1X05BTF9TTElDRV9JRFJfTl9MUCkpIHsKKyAgICAgICAgLyogc2VuZCBWUFMvU1BTL1BQUyBiZWZvcmUgZXZlcnkgSURSIGZyYW1lICovCisgICAgICAgIHNlbmRfcHMgPSBUUlVFOworICAgICAgfQorICAgIH0KKworICAgIGlmICghc2VudF9wcyAmJiAoc2VuZF9wcyB8fCBydHBoMjY1cGF5LT5zZW5kX3Zwc19zcHNfcHBzKSkgeworICAgICAgLyogd2UgbmVlZCB0byBzZW5kIFNQUy9QUFMgbm93IGZpcnN0LiBGSVhNRSwgZG9uJ3QgdXNlIHRoZSBwdHMgZm9yCisgICAgICAgKiBjaGVja2luZyB3aGVuIHdlIG5lZWQgdG8gc2VuZCBTUFMvUFBTIGJ1dCBjb252ZXJ0IHRvIHJ1bm5pbmdfdGltZQorICAgICAgICogZmlyc3QgKi8KKyAgICAgIHJ0cGgyNjVwYXktPnNlbmRfdnBzX3Nwc19wcHMgPSBGQUxTRTsKKyAgICAgIHNlbnRfcHMgPSBUUlVFOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NXBheSwgInNlbmRpbmcgVlBTL1NQUy9QUFMgYmVmb3JlIGN1cnJlbnQgZnJhbWUiKTsKKyAgICAgIHJldCA9CisgICAgICAgICAgZ3N0X3J0cF9oMjY1X3BheV9zZW5kX3Zwc19zcHNfcHBzIChiYXNlcGF5bG9hZCwgcnRwaDI2NXBheSwgZHRzLCBwdHMpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChwYXlidWYpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwYWNrZXRfbGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYWNrZXRfbGVuIChzaXplLCAwLCAwKTsKKworICAgIGlmIChwYWNrZXRfbGVuIDwgbXR1KSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LAorICAgICAgICAgICJOQUwgVW5pdCBmaXQgaW4gb25lIHBhY2tldCBkYXRhc2l6ZT0lZCBtdHU9JWQiLCBzaXplLCBtdHUpOworICAgICAgLyogd2lsbCBmaXQgaW4gb25lIHBhY2tldCAqLworCisgICAgICAvKiB1c2UgYnVmZmVyIGxpc3RzCisgICAgICAgKiBjcmVhdGUgYnVmZmVyIHdpdGhvdXQgcGF5bG9hZCBjb250YWluaW5nIG9ubHkgdGhlIFJUUCBoZWFkZXIKKyAgICAgICAqIChtZW1vcnkgYmxvY2sgYXQgaW5kZXggMCkgKi8KKyAgICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoMCwgMCwgMCk7CisKKyAgICAgIGdzdF9ydHBfYnVmZmVyX21hcCAob3V0YnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKworICAgICAgLyogb25seSBzZXQgdGhlIG1hcmtlciBiaXQgb24gcGFja2V0cyBjb250YWluaW5nIGFjY2VzcyB1bml0cyAqLworICAgICAgaWYgKGkgPT0gcGF5YnVmcy0+bGVuIC0gMQorICAgICAgICAgICYmIHJ0cGgyNjVwYXktPmFsaWdubWVudCA9PSBHU1RfSDI2NV9BTElHTk1FTlRfQVUKKyAgICAgICAgICAmJiBJU19BQ0NFU1NfVU5JVCAobmFsVHlwZSkpIHsKKyAgICAgICAgZ3N0X3J0cF9idWZmZXJfc2V0X21hcmtlciAoJnJ0cCwgMSk7CisgICAgICB9CisKKyAgICAgIC8qIHRpbWVzdGFtcCB0aGUgb3V0YnVmZmVyICovCisgICAgICBHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSA9IHB0czsKKyAgICAgIEdTVF9CVUZGRVJfRFRTIChvdXRidWYpID0gZHRzOworCisgICAgICAvKiBpbnNlcnQgcGF5bG9hZCBtZW1vcnkgYmxvY2sgKi8KKyAgICAgIGdzdF9ydHBfY29weV92aWRlb19tZXRhIChydHBoMjY1cGF5LCBvdXRidWYsIHBheWJ1Zik7CisgICAgICBvdXRidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAob3V0YnVmLCBwYXlidWYpOworCisgICAgICBvdXRsaXN0ID0gZ3N0X2J1ZmZlcl9saXN0X25ldyAoKTsKKworICAgICAgLyogYWRkIHRoZSBidWZmZXIgdG8gdGhlIGJ1ZmZlciBsaXN0ICovCisgICAgICBnc3RfYnVmZmVyX2xpc3RfYWRkIChvdXRsaXN0LCBvdXRidWYpOworCisgICAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgICAgIC8qIHB1c2ggdGhlIGxpc3QgdG8gdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgcGlwZSAqLworICAgICAgcmV0ID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfcHVzaF9saXN0IChiYXNlcGF5bG9hZCwgb3V0bGlzdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGZyYWdtZW50YXRpb24gVW5pdHMgKi8KKyAgICAgIGd1aW50IGxpbWl0ZWRTaXplOworICAgICAgaW50IGlpID0gMCwgc3RhcnQgPSAxLCBlbmQgPSAwLCBwb3MgPSAwOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChiYXNlcGF5bG9hZCwKKyAgICAgICAgICAiTkFMIFVuaXQgRE9FUyBOT1QgZml0IGluIG9uZSBwYWNrZXQgZGF0YXNpemU9JWQgbXR1PSVkIiwgc2l6ZSwgbXR1KTsKKworICAgICAgcG9zICs9IDI7CisgICAgICBzaXplIC09IDI7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLCAiVXNpbmcgRlUgZnJhZ21lbnRhdGlvbiBmb3IgZGF0YSBzaXplPSVkIiwKKyAgICAgICAgICBzaXplKTsKKworICAgICAgLyogV2Uga2VlcCAzIGJ5dGVzIGZvciBQYXlsb2FkSGRyIGFuZCBGVSBIZWFkZXIgKi8KKyAgICAgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYXlsb2FkX2xlbiAobXR1IC0gMywgMCwgMCk7CisKKyAgICAgIG91dGxpc3QgPSBnc3RfYnVmZmVyX2xpc3RfbmV3ICgpOworCisgICAgICB3aGlsZSAoZW5kID09IDApIHsKKyAgICAgICAgbGltaXRlZFNpemUgPSBzaXplIDwgcGF5bG9hZF9sZW4gPyBzaXplIDogcGF5bG9hZF9sZW47CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLAorICAgICAgICAgICAgIkluc2lkZSAgRlUgZnJhZ21lbnRhdGlvbiBsaW1pdGVkU2l6ZT0lZCBpdGVyYXRpb249JWQiLCBsaW1pdGVkU2l6ZSwKKyAgICAgICAgICAgIGlpKTsKKworICAgICAgICAvKiB1c2UgYnVmZmVyIGxpc3RzCisgICAgICAgICAqIGNyZWF0ZSBidWZmZXIgd2l0aG91dCBwYXlsb2FkIGNvbnRhaW5pbmcgb25seSB0aGUgUlRQIGhlYWRlcgorICAgICAgICAgKiAobWVtb3J5IGJsb2NrIGF0IGluZGV4IDApLCBhbmQgd2l0aCBzcGFjZSBmb3IgUGF5bG9hZEhkciBhbmQgRlUgaGVhZGVyICovCisgICAgICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoMywgMCwgMCk7CisKKyAgICAgICAgZ3N0X3J0cF9idWZmZXJfbWFwIChvdXRidWYsIEdTVF9NQVBfV1JJVEUsICZydHApOworCisgICAgICAgIEdTVF9CVUZGRVJfRFRTIChvdXRidWYpID0gZHRzOworICAgICAgICBHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSA9IHB0czsKKyAgICAgICAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKTsKKworICAgICAgICBpZiAobGltaXRlZFNpemUgPT0gc2l6ZSkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLCAiZW5kIHNpemU9JWQgaXRlcmF0aW9uPSVkIiwgc2l6ZSwgaWkpOworICAgICAgICAgIGVuZCA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvKiBQYXlsb2FkSGRyICh0eXBlID0gNDkpICovCisgICAgICAgIHBheWxvYWRbMF0gPSAobmFsSGVhZGVyWzBdICYgMHg4MSkgfCAoNDkgPDwgMSk7CisgICAgICAgIHBheWxvYWRbMV0gPSBuYWxIZWFkZXJbMV07CisKKyAgICAgICAgLyogc2V0IHRoZSBtYXJrZXIgYml0IG9uIHRoZSBsYXN0IHBhY2tldCBvZiBhbiBhY2Nlc3MgdW5pdCAqLworICAgICAgICBpZiAoSVNfQUNDRVNTX1VOSVQgKG5hbFR5cGUpKSB7CisgICAgICAgICAgZ3N0X3J0cF9idWZmZXJfc2V0X21hcmtlciAoJnJ0cCwKKyAgICAgICAgICAgICAgZW5kICYmIGkgPT0gcGF5YnVmcy0+bGVuIC0gMQorICAgICAgICAgICAgICAmJiBydHBoMjY1cGF5LT5hbGlnbm1lbnQgPT0gR1NUX0gyNjVfQUxJR05NRU5UX0FVKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZVIEhlYWRlciAqLworICAgICAgICBwYXlsb2FkWzJdID0gKHN0YXJ0IDw8IDcpIHwgKGVuZCA8PCA2KSB8IChuYWxUeXBlICYgMHgzZik7CisKKyAgICAgICAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgICAgICAgIC8qIGluc2VydCBwYXlsb2FkIG1lbW9yeSBibG9jayAqLworICAgICAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwaDI2NXBheSwgb3V0YnVmLCBwYXlidWYpOworICAgICAgICBnc3RfYnVmZmVyX2NvcHlfaW50byAob3V0YnVmLCBwYXlidWYsIEdTVF9CVUZGRVJfQ09QWV9NRU1PUlksIHBvcywKKyAgICAgICAgICAgIGxpbWl0ZWRTaXplKTsKKyAgICAgICAgLyogYWRkIHRoZSBidWZmZXIgdG8gdGhlIGJ1ZmZlciBsaXN0ICovCisgICAgICAgIGdzdF9idWZmZXJfbGlzdF9hZGQgKG91dGxpc3QsIG91dGJ1Zik7CisKKyAgICAgICAgc2l6ZSAtPSBsaW1pdGVkU2l6ZTsKKyAgICAgICAgcG9zICs9IGxpbWl0ZWRTaXplOworICAgICAgICBpaSsrOworICAgICAgICBzdGFydCA9IDA7CisgICAgICB9CisKKyAgICAgIHJldCA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2hfbGlzdCAoYmFzZXBheWxvYWQsIG91dGxpc3QpOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocGF5YnVmKTsKKyAgICB9CisgIH0KKworICBnX3B0cl9hcnJheV9mcmVlIChwYXlidWZzLCBUUlVFKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9oMjY1X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UnRwSDI2NVBheSAqcnRwaDI2NXBheTsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIGdzaXplIHNpemU7CisgIGd1aW50IG5hbF9sZW4sIGk7CisgIEdzdE1hcEluZm8gbWFwOworICBjb25zdCBndWludDggKmRhdGE7CisgIEdzdENsb2NrVGltZSBkdHMsIHB0czsKKyAgR0FycmF5ICpuYWxfcXVldWU7CisgIGdib29sZWFuIGhldmM7CisgIEdzdEJ1ZmZlciAqcGF5YnVmID0gTlVMTDsKKyAgZ3NpemUgc2tpcDsKKworICBydHBoMjY1cGF5ID0gR1NUX1JUUF9IMjY1X1BBWSAoYmFzZXBheWxvYWQpOworCisgIC8qIHRoZSBpbnB1dCBidWZmZXIgY29udGFpbnMgb25lIG9yIG1vcmUgTkFMIHVuaXRzICovCisKKyAgaGV2YyA9IChydHBoMjY1cGF5LT5zdHJlYW1fZm9ybWF0ID09IEdTVF9IMjY1X1NUUkVBTV9GT1JNQVRfSEVWMSkKKyAgICAgIHx8IChydHBoMjY1cGF5LT5zdHJlYW1fZm9ybWF0ID09IEdTVF9IMjY1X1NUUkVBTV9GT1JNQVRfSFZDMSk7CisKKyAgaWYgKGhldmMpIHsKKyAgICAvKiBJbiBoZXZjIG1vZGUsIHRoZXJlIGlzIG5vIGFkYXB0ZXIsIHNvIG5vdGhpbmcgdG8gZmx1c2ggKi8KKyAgICBpZiAoYnVmZmVyID09IE5VTEwpCisgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBkYXRhID0gbWFwLmRhdGE7CisgICAgc2l6ZSA9IG1hcC5zaXplOworICAgIHB0cyA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworICAgIGR0cyA9IEdTVF9CVUZGRVJfRFRTIChidWZmZXIpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLCAiZ290ICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMiLCBzaXplKTsKKyAgfSBlbHNlIHsKKyAgICBkdHMgPSBnc3RfYWRhcHRlcl9wcmV2X2R0cyAocnRwaDI2NXBheS0+YWRhcHRlciwgTlVMTCk7CisgICAgcHRzID0gZ3N0X2FkYXB0ZXJfcHJldl9wdHMgKHJ0cGgyNjVwYXktPmFkYXB0ZXIsIE5VTEwpOworICAgIGlmIChidWZmZXIpIHsKKyAgICAgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGR0cykpCisgICAgICAgIGR0cyA9IEdTVF9CVUZGRVJfRFRTIChidWZmZXIpOworICAgICAgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAocHRzKSkKKyAgICAgICAgcHRzID0gR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcik7CisKKyAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGgyNjVwYXktPmFkYXB0ZXIsIGJ1ZmZlcik7CisgICAgfQorICAgIHNpemUgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHJ0cGgyNjVwYXktPmFkYXB0ZXIpOworICAgIC8qIE5vdGhpbmcgdG8gZG8gaGVyZSBpZiB0aGUgYWRhcHRlciBpcyBlbXB0eSwgZS5nLiBvbiBFT1MgKi8KKyAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgIGRhdGEgPSBnc3RfYWRhcHRlcl9tYXAgKHJ0cGgyNjVwYXktPmFkYXB0ZXIsIHNpemUpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLAorICAgICAgICAiZ290ICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMgKCUiIEdfR1NJWkVfRk9STUFUICIpIiwgc2l6ZSwKKyAgICAgICAgYnVmZmVyID8gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSA6IDApOworICB9CisKKyAgcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgLyogbm93IGxvb3Agb3ZlciBhbGwgTkFMIHVuaXRzIGFuZCBwdXQgdGhlbSBpbiBhIHBhY2tldAorICAgKiBGSVhNRSwgd2Ugc2hvdWxkIHJlYWxseSB0cnkgdG8gcGFjayBtdWx0aXBsZSBOQUwgdW5pdHMgaW50byBvbmUgUlRQIHBhY2tldAorICAgKiBpZiB3ZSBjYW4sIGVzcGVjaWFsbHkgZm9yIHRoZSBjb25maWcgcGFja2V0cyB0aGF0IHdvbnQndCBjYXVzZSBkZWNvZGVyCisgICAqIGxhdGVuY3kuICovCisgIGlmIChoZXZjKSB7CisgICAgZ3VpbnQgbmFsX2xlbmd0aF9zaXplOworICAgIGdzaXplIG9mZnNldCA9IDA7CisgICAgR1B0ckFycmF5ICpwYXlidWZzOworCisgICAgcGF5YnVmcyA9IGdfcHRyX2FycmF5X25ldyAoKTsKKyAgICBuYWxfbGVuZ3RoX3NpemUgPSBydHBoMjY1cGF5LT5uYWxfbGVuZ3RoX3NpemU7CisKKyAgICB3aGlsZSAoc2l6ZSA+IG5hbF9sZW5ndGhfc2l6ZSkgeworICAgICAgZ2ludCBpOworCisgICAgICBuYWxfbGVuID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuYWxfbGVuZ3RoX3NpemU7IGkrKykgeworICAgICAgICBuYWxfbGVuID0gKChuYWxfbGVuIDw8IDgpICsgZGF0YVtpXSk7CisgICAgICB9CisKKyAgICAgIC8qIHNraXAgdGhlIGxlbmd0aCBieXRlcywgbWFrZSBzdXJlIHdlIGRvbid0IHJ1biBwYXN0IHRoZSBidWZmZXIgc2l6ZSAqLworICAgICAgZGF0YSArPSBuYWxfbGVuZ3RoX3NpemU7CisgICAgICBvZmZzZXQgKz0gbmFsX2xlbmd0aF9zaXplOworICAgICAgc2l6ZSAtPSBuYWxfbGVuZ3RoX3NpemU7CisKKyAgICAgIGlmIChzaXplID49IG5hbF9sZW4pIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXBheWxvYWQsICJnb3QgTkFMIG9mIHNpemUgJXUiLCBuYWxfbGVuKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5hbF9sZW4gPSBzaXplOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChiYXNlcGF5bG9hZCwgImdvdCBpbmNvbXBsZXRlIE5BTCBvZiBzaXplICV1IiwKKyAgICAgICAgICAgIG5hbF9sZW4pOworICAgICAgfQorCisgICAgICBwYXlidWYgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIG9mZnNldCwKKyAgICAgICAgICBuYWxfbGVuKTsKKyAgICAgIGdfcHRyX2FycmF5X2FkZCAocGF5YnVmcywgcGF5YnVmKTsKKworICAgICAgZGF0YSArPSBuYWxfbGVuOworICAgICAgb2Zmc2V0ICs9IG5hbF9sZW47CisgICAgICBzaXplIC09IG5hbF9sZW47CisgICAgfQorICAgIHJldCA9IGdzdF9ydHBfaDI2NV9wYXlfcGF5bG9hZF9uYWwgKGJhc2VwYXlsb2FkLCBwYXlidWZzLCBkdHMsIHB0cyk7CisgIH0gZWxzZSB7CisgICAgZ3VpbnQgbmV4dDsKKyAgICBnYm9vbGVhbiB1cGRhdGUgPSBGQUxTRTsKKyAgICBHUHRyQXJyYXkgKnBheWJ1ZnM7CisKKyAgICAvKiBnZXQgb2Zmc2V0IG9mIGZpcnN0IHN0YXJ0IGNvZGUgKi8KKyAgICBuZXh0ID0gbmV4dF9zdGFydF9jb2RlIChkYXRhLCBzaXplKTsKKworICAgIC8qIHNraXAgdG8gc3RhcnQgY29kZSwgaWYgbm8gc3RhcnQgY29kZSBpcyBmb3VuZCwgbmV4dCB3aWxsIGJlIHNpemUgYW5kIHdlCisgICAgICogd2lsbCBub3QgY29sbGVjdCBkYXRhLiAqLworICAgIGRhdGEgKz0gbmV4dDsKKyAgICBzaXplIC09IG5leHQ7CisgICAgbmFsX3F1ZXVlID0gcnRwaDI2NXBheS0+cXVldWU7CisgICAgc2tpcCA9IG5leHQ7CisKKyAgICAvKiBhcnJheSBtdXN0IGJlIGVtcHR5IHdoZW4gd2UgZ2V0IGhlcmUgKi8KKyAgICBnX2Fzc2VydCAobmFsX3F1ZXVlLT5sZW4gPT0gMCk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChiYXNlcGF5bG9hZCwKKyAgICAgICAgImZvdW5kIGZpcnN0IHN0YXJ0IGF0ICV1LCBieXRlcyBsZWZ0ICUiIEdfR1NJWkVfRk9STUFULCBuZXh0LCBzaXplKTsKKworICAgIHBheWJ1ZnMgPSBnX3B0cl9hcnJheV9uZXcgKCk7CisKKyAgICAvKiBmaXJzdCBwYXNzIHRvIGxvY2F0ZSBOQUxzIGFuZCBwYXJzZSBWUFMvU1BTL1BQUyAqLworICAgIHdoaWxlIChzaXplID4gNCkgeworICAgICAgLyogc2tpcCBzdGFydCBjb2RlICovCisgICAgICBkYXRhICs9IDM7CisgICAgICBzaXplIC09IDM7CisKKyAgICAgIC8qIHVzZSBuZXh0X3N0YXJ0X2NvZGUoKSB0byBzY2FuIGJ1ZmZlci4KKyAgICAgICAqIG5leHRfc3RhcnRfY29kZSgpIHJldHVybnMgdGhlIG9mZnNldCBpbiBkYXRhLAorICAgICAgICogc3RhcnRpbmcgZnJvbSB6ZXJvIHRvIHRoZSBmaXJzdCBieXRlIG9mIDAuMC4wLjEKKyAgICAgICAqIElmIG5vIHN0YXJ0IGNvZGUgaXMgZm91bmQsIGl0IHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZQorICAgICAgICogJ3NpemUnIHBhcmFtZXRlci4KKyAgICAgICAqIGRhdGEgaXMgdW5jaGFuZ2VkIGJ5IHRoZSBjYWxsIHRvIG5leHRfc3RhcnRfY29kZSgpCisgICAgICAgKi8KKyAgICAgIG5leHQgPSBuZXh0X3N0YXJ0X2NvZGUgKGRhdGEsIHNpemUpOworCisgICAgICBpZiAobmV4dCA9PSBzaXplICYmIGJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgIC8qIERpZG4ndCBmaW5kIHRoZSBzdGFydCBvZiBuZXh0IE5BTCBhbmQgaXQncyBub3QgRU9TLAorICAgICAgICAgKiBoYW5kbGUgaXQgbmV4dCB0aW1lICovCisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvKiBuYWwgbGVuZ3RoIGlzIGRpc3RhbmNlIHRvIG5leHQgc3RhcnQgY29kZSAqLworICAgICAgbmFsX2xlbiA9IG5leHQ7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLCAiZm91bmQgbmV4dCBzdGFydCBhdCAldSBvZiBzaXplICV1IiwgbmV4dCwKKyAgICAgICAgICBuYWxfbGVuKTsKKworICAgICAgLyogV2Uga25vdyBvdXIgc3RyZWFtIGlzIGEgdmFsaWQgSDI2NSBOQUwgcGFja2V0LAorICAgICAgICogZ28gcGFyc2UgaXQgZm9yIFZQUy9TUFMvUFBTIHRvIGVucmljaCB0aGUgY2FwcyAqLworICAgICAgLyogb3JkZXI6IG1ha2Ugc3VyZSB0byBjaGVjayBuYWwgKi8KKyAgICAgIHVwZGF0ZSA9IGdzdF9ydHBfaDI2NV9wYXlfZGVjb2RlX25hbCAocnRwaDI2NXBheSwgZGF0YSwgbmFsX2xlbiwgZHRzLCBwdHMpCisgICAgICAgICAgfHwgdXBkYXRlOworCisgICAgICAvKiBtb3ZlIHRvIG5leHQgTkFMIHBhY2tldCAqLworICAgICAgZGF0YSArPSBuYWxfbGVuOworICAgICAgc2l6ZSAtPSBuYWxfbGVuOworCisgICAgICBnX2FycmF5X2FwcGVuZF92YWwgKG5hbF9xdWV1ZSwgbmFsX2xlbik7CisgICAgfQorCisgICAgLyogaWYgaGFzIG5ldyBWUFMsIFNQUyAmIFBQUywgdXBkYXRlIHRoZSBvdXRwdXQgY2FwcyAqLworICAgIGlmIChHX1VOTElLRUxZICh1cGRhdGUpKQorICAgICAgaWYgKCFnc3RfcnRwX2gyNjVfcGF5X3NldF92cHNfc3BzX3BwcyAoYmFzZXBheWxvYWQpKQorICAgICAgICBnb3RvIGNhcHNfcmVqZWN0ZWQ7CisKKyAgICAvKiBzZWNvbmQgcGFzcyB0byBwYXlsb2FkIGFuZCBwdXNoICovCisKKyAgICBpZiAobmFsX3F1ZXVlLT5sZW4gIT0gMCkKKyAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChydHBoMjY1cGF5LT5hZGFwdGVyLCBza2lwKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYWxfcXVldWUtPmxlbjsgaSsrKSB7CisgICAgICBndWludCBzaXplOworCisgICAgICBuYWxfbGVuID0gZ19hcnJheV9pbmRleCAobmFsX3F1ZXVlLCBndWludCwgaSk7CisgICAgICAvKiBza2lwIHN0YXJ0IGNvZGUgKi8KKyAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChydHBoMjY1cGF5LT5hZGFwdGVyLCAzKTsKKworICAgICAgLyogVHJpbSB0aGUgZW5kIHVubGVzcyB3ZSdyZSB0aGUgbGFzdCBOQUwgaW4gdGhlIHN0cmVhbS4KKyAgICAgICAqIEluIGNhc2Ugd2UncmUgbm90IGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3ZSBrbm93IHRoZSBuZXh0IGJsb2NrCisgICAgICAgKiBzdGFydHMgd2l0aCAweDAwMDAwMSBzbyBhbGwgdGhlIDB4MDAgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGlzIG9uZSBhcmUKKyAgICAgICAqIHRyYWlsaW5nIDB4MCB0aGF0IGNhbiBiZSBkaXNjYXJkZWQgKi8KKyAgICAgIHNpemUgPSBuYWxfbGVuOworICAgICAgZGF0YSA9IGdzdF9hZGFwdGVyX21hcCAocnRwaDI2NXBheS0+YWRhcHRlciwgc2l6ZSk7CisgICAgICBpZiAoaSArIDEgIT0gbmFsX3F1ZXVlLT5sZW4gfHwgYnVmZmVyICE9IE5VTEwpCisgICAgICAgIGZvciAoOyBzaXplID4gMSAmJiBkYXRhW3NpemUgLSAxXSA9PSAweDA7IHNpemUtLSkKKyAgICAgICAgICAvKiBza2lwICovIDsKKworICAgICAgLyogRklYTUU6IFdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgbmV4dCBwYWNrZXQgb3IgRU9TIHRvCisgICAgICAgKiBhY3R1YWxseSBwYXlsb2FkIHRoZSBOQUwgc28gd2UgY2FuIGtub3cgaWYgdGhlIGN1cnJlbnQgTkFMIGlzCisgICAgICAgKiB0aGUgbGFzdCBvbmUgb2YgYW4gYWNjZXNzIHVuaXQgb3Igbm90IGlmIHdlIGFyZSBpbiBieXRlc3RyZWFtIG1vZGUKKyAgICAgICAqLworCisgICAgICBwYXlidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRwaDI2NXBheS0+YWRhcHRlciwgc2l6ZSk7CisgICAgICBnX2Fzc2VydCAocGF5YnVmKTsKKyAgICAgIGdfcHRyX2FycmF5X2FkZCAocGF5YnVmcywgcGF5YnVmKTsKKworICAgICAgLyogbW92ZSB0byBuZXh0IE5BTCBwYWNrZXQgKi8KKyAgICAgIC8qIFNraXBzIHRoZSB0cmFpbGluZyB6ZXJvcyAqLworICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKHJ0cGgyNjVwYXktPmFkYXB0ZXIsIG5hbF9sZW4gLSBzaXplKTsKKyAgICB9CisgICAgLyogcHV0IHRoZSBkYXRhIGluIG9uZSBvciBtb3JlIFJUUCBwYWNrZXRzICovCisgICAgcmV0ID0gZ3N0X3J0cF9oMjY1X3BheV9wYXlsb2FkX25hbCAoYmFzZXBheWxvYWQsIHBheWJ1ZnMsIGR0cywgcHRzKTsKKyAgICBnX2FycmF5X3NldF9zaXplIChuYWxfcXVldWUsIDApOworICB9CisKK2RvbmU6CisgIGlmIChoZXZjKSB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICB9IGVsc2UgeworICAgIGdzdF9hZGFwdGVyX3VubWFwIChydHBoMjY1cGF5LT5hZGFwdGVyKTsKKyAgfQorCisgIHJldHVybiByZXQ7CisKK2NhcHNfcmVqZWN0ZWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGJhc2VwYXlsb2FkLCAiQ291bGQgbm90IHNldCBvdXRjYXBzIik7CisgICAgZ19hcnJheV9zZXRfc2l6ZSAobmFsX3F1ZXVlLCAwKTsKKyAgICByZXQgPSBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2gyNjVfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnM7CisgIEdzdFJ0cEgyNjVQYXkgKnJ0cGgyNjVwYXkgPSBHU1RfUlRQX0gyNjVfUEFZIChwYXlsb2FkKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGgyNjVwYXktPmFkYXB0ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX0RPV05TVFJFQU06CisgICAgICBzID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUgKGV2ZW50KTsKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiR3N0Rm9yY2VLZXlVbml0IikpIHsKKyAgICAgICAgZ2Jvb2xlYW4gcmVzZW5kX2NvZGVjX2RhdGE7CisKKyAgICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2Jvb2xlYW4gKHMsICJhbGwtaGVhZGVycyIsCisgICAgICAgICAgICAgICAgJnJlc2VuZF9jb2RlY19kYXRhKSAmJiByZXNlbmRfY29kZWNfZGF0YSkKKyAgICAgICAgICBydHBoMjY1cGF5LT5zZW5kX3Zwc19zcHNfcHBzID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICB7CisgICAgICAvKiBjYWxsIGhhbmRsZV9idWZmZXIgd2l0aCBOVUxMIHRvIGZsdXNoIGxhc3QgTkFMIGZyb20gYWRhcHRlcgorICAgICAgICogaW4gYnl0ZS1zdHJlYW0gbW9kZQorICAgICAgICovCisgICAgICBnc3RfcnRwX2gyNjVfcGF5X2hhbmRsZV9idWZmZXIgKHBheWxvYWQsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX1NUUkVBTV9TVEFSVDoKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVwYXksCisgICAgICAgICAgIk5ldyBzdHJlYW0gZGV0ZWN0ZWQgPT4gQ2xlYXIgVlBTLCBTUFMgYW5kIFBQUyIpOworICAgICAgZ3N0X3J0cF9oMjY1X3BheV9jbGVhcl92cHNfc3BzX3BwcyAocnRwaDI2NXBheSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXMgPSBHU1RfUlRQX0JBU0VfUEFZTE9BRF9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2lua19ldmVudCAocGF5bG9hZCwgZXZlbnQpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9oMjY1X3BheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdFJ0cEgyNjVQYXkgKnJ0cGgyNjVwYXkgPSBHU1RfUlRQX0gyNjVfUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgcnRwaDI2NXBheS0+c2VuZF92cHNfc3BzX3BwcyA9IEZBTFNFOworICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGgyNjVwYXktPmFkYXB0ZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIHJ0cGgyNjVwYXktPmxhc3RfdnBzX3Nwc19wcHMgPSAtMTsKKyAgICAgIGdzdF9ydHBfaDI2NV9wYXlfY2xlYXJfdnBzX3Nwc19wcHMgKHJ0cGgyNjVwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NV9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cEgyNjVQYXkgKnJ0cGgyNjVwYXk7CisKKyAgcnRwaDI2NXBheSA9IEdTVF9SVFBfSDI2NV9QQVkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0NPTkZJR19JTlRFUlZBTDoKKyAgICAgIHJ0cGgyNjVwYXktPnZwc19zcHNfcHBzX2ludGVydmFsID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjVfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSdHBIMjY1UGF5ICpydHBoMjY1cGF5OworCisgIHJ0cGgyNjVwYXkgPSBHU1RfUlRQX0gyNjVfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DT05GSUdfSU5URVJWQUw6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBydHBoMjY1cGF5LT52cHNfc3BzX3Bwc19pbnRlcnZhbCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2gyNjVfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwaDI2NXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9IMjY1X1BBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGgyNjVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwaDI2NXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNDJmYmEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGgyNjVwYXkuaApAQCAtMCwwICsxLDc4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDE0PiBKdXJnZW4gU2xvd2FjayA8anVyZ2Vuc2xvd2Fja0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfSDI2NV9QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9IMjY1X1BBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorI2luY2x1ZGUgImdzdHJ0cGgyNjV0eXBlcy5oIgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9IMjY1X1BBWSBcCisgIChnc3RfcnRwX2gyNjVfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfSDI2NV9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfSDI2NV9QQVksR3N0UnRwSDI2NVBheSkpCisjZGVmaW5lIEdTVF9SVFBfSDI2NV9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0gyNjVfUEFZLEdzdFJ0cEgyNjVQYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfSDI2NV9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfSDI2NV9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0gyNjVfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9IMjY1X1BBWSkpCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSDI2NVBheSBHc3RSdHBIMjY1UGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjVQYXlDbGFzcyBHc3RSdHBIMjY1UGF5Q2xhc3M7CisKK3R5cGVkZWYgZW51bQoreworICBHU1RfSDI2NV9BTElHTk1FTlRfVU5LTk9XTiwKKyAgR1NUX0gyNjVfQUxJR05NRU5UX05BTCwKKyAgR1NUX0gyNjVfQUxJR05NRU5UX0FVCit9IEdzdEgyNjVBbGlnbm1lbnQ7CisKK3N0cnVjdCBfR3N0UnRwSDI2NVBheQoreworICBHc3RSVFBCYXNlUGF5bG9hZCBwYXlsb2FkOworCisgIEdQdHJBcnJheSAqc3BzLCAqcHBzLCAqdnBzOworCisgIEdzdEgyNjVTdHJlYW1Gb3JtYXQgc3RyZWFtX2Zvcm1hdDsKKyAgR3N0SDI2NUFsaWdubWVudCBhbGlnbm1lbnQ7CisgIGd1aW50IG5hbF9sZW5ndGhfc2l6ZTsKKyAgR0FycmF5ICpxdWV1ZTsKKworICBHc3RBZGFwdGVyICphZGFwdGVyOworCisgIGdpbnQgdnBzX3Nwc19wcHNfaW50ZXJ2YWw7CisgIGdib29sZWFuIHNlbmRfdnBzX3Nwc19wcHM7CisgIEdzdENsb2NrVGltZSBsYXN0X3Zwc19zcHNfcHBzOworfTsKKworc3RydWN0IF9Hc3RSdHBIMjY1UGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX2gyNjVfcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9oMjY1X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9SVFBfSDI2NV9QQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGgyNjV0eXBlcy5oIGIvZ3N0L3J0cC9nc3RydHBoMjY1dHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjY5MmU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBoMjY1dHlwZXMuaApAQCAtMCwwICsxLDc2IEBACisvKiBHU3RyZWFtZXIgSC4yNjUgcGFyc2VyIHR5cGVzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxMyBTcmVlcmVuaiBCYWxhY2hhbmRyYW4gPHNyZWVyZW5qLmJhbGFjaGFuZHJhbkBpbnRlbC5jb20+CisgKgorICogIENvbnRhY3Q6IFNyZWVyZW5qIEJhbGFjaGFuZHJhbiA8c3JlZXJlbmouYmFsYWNoYW5kcmFuQGludGVsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9IMjY1X1RZUEVTX0hfXworI2RlZmluZSBfX0dTVF9SVFBfSDI2NV9UWVBFU19IX18KKworI2luY2x1ZGUgPGdsaWIuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIGVudW0KK3sKKyAgR1NUX0gyNjVfTkFMX1NMSUNFX1RSQUlMX04gICAgPSAwLAorICBHU1RfSDI2NV9OQUxfU0xJQ0VfVFJBSUxfUiAgICA9IDEsCisgIEdTVF9IMjY1X05BTF9TTElDRV9UU0FfTiAgICAgID0gMiwKKyAgR1NUX0gyNjVfTkFMX1NMSUNFX1RTQV9SICAgICAgPSAzLAorICBHU1RfSDI2NV9OQUxfU0xJQ0VfU1RTQV9OICAgICA9IDQsCisgIEdTVF9IMjY1X05BTF9TTElDRV9TVFNBX1IgICAgID0gNSwKKyAgR1NUX0gyNjVfTkFMX1NMSUNFX1JBRExfTiAgICAgPSA2LAorICBHU1RfSDI2NV9OQUxfU0xJQ0VfUkFETF9SICAgICA9IDcsCisgIEdTVF9IMjY1X05BTF9TTElDRV9SQVNMX04gICAgID0gOCwKKyAgR1NUX0gyNjVfTkFMX1NMSUNFX1JBU0xfUiAgICAgPSA5LAorICBHU1RfSDI2NV9OQUxfU0xJQ0VfQkxBX1dfTFAgICA9IDE2LAorICBHU1RfSDI2NV9OQUxfU0xJQ0VfQkxBX1dfUkFETCA9IDE3LAorICBHU1RfSDI2NV9OQUxfU0xJQ0VfQkxBX05fTFAgICA9IDE4LAorICBHU1RfSDI2NV9OQUxfU0xJQ0VfSURSX1dfUkFETCA9IDE5LAorICBHU1RfSDI2NV9OQUxfU0xJQ0VfSURSX05fTFAgICA9IDIwLAorICBHU1RfSDI2NV9OQUxfU0xJQ0VfQ1JBX05VVCAgICA9IDIxLAorICBHU1RfSDI2NV9OQUxfVlBTICAgICAgICAgICAgICA9IDMyLAorICBHU1RfSDI2NV9OQUxfU1BTICAgICAgICAgICAgICA9IDMzLAorICBHU1RfSDI2NV9OQUxfUFBTICAgICAgICAgICAgICA9IDM0LAorICBHU1RfSDI2NV9OQUxfQVVEICAgICAgICAgICAgICA9IDM1LAorICBHU1RfSDI2NV9OQUxfRU9TICAgICAgICAgICAgICA9IDM2LAorICBHU1RfSDI2NV9OQUxfRU9CICAgICAgICAgICAgICA9IDM3LAorICBHU1RfSDI2NV9OQUxfRkQgICAgICAgICAgICAgICA9IDM4LAorICBHU1RfSDI2NV9OQUxfUFJFRklYX1NFSSAgICAgICA9IDM5LAorICBHU1RfSDI2NV9OQUxfU1VGRklYX1NFSSAgICAgICA9IDQwCit9IEdzdEgyNjVOYWxVbml0VHlwZTsKKworI2RlZmluZSBSRVNFUlZFRF9OT05fSVJBUF9TVUJMQVlFUl9OQUxfVFlQRV9NSU4gMTAKKyNkZWZpbmUgUkVTRVJWRURfTk9OX0lSQVBfU1VCTEFZRVJfTkFMX1RZUEVfTUFYIDE1CisKKyNkZWZpbmUgUkVTRVJWRURfSVJBUF9OQUxfVFlQRV9NSU4gMjIKKyNkZWZpbmUgUkVTRVJWRURfSVJBUF9OQUxfVFlQRV9NQVggMjMKKworI2RlZmluZSBSRVNFUlZFRF9OT05fSVJBUF9OQUxfVFlQRV9NSU4gMjQKKyNkZWZpbmUgUkVTRVJWRURfTk9OX0lSQVBfTkFMX1RZUEVfTUFYIDMxCisKKyNkZWZpbmUgUkVTRVJWRURfTk9OX1ZDTF9OQUxfVFlQRV9NSU4gNDEKKyNkZWZpbmUgUkVTRVJWRURfTk9OX1ZDTF9OQUxfVFlQRV9NQVggNDcKKworI2RlZmluZSBVTlNQRUNJRklFRF9OT05fVkNMX05BTF9UWVBFX01JTiA0OAorI2RlZmluZSBVTlNQRUNJRklFRF9OT05fVkNMX05BTF9UWVBFX01BWCA2MworCitHX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZGU0ODMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jCkBAIC0wLDAgKzEsMjM3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFBoaWxpcHBlIEtoYWxhZiA8YnVyZ2VyQHNwZWVkeS5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgImdzdHJ0cGlsYmNkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKKy8qIFJ0cGlMQkNEZXBheSBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKKyNkZWZpbmUgREVGQVVMVF9NT0RFIEdTVF9JTEJDX01PREVfMzAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTU9ERQorfTsKKworLyogRklYTUUsIG1vZGUgc2hvdWxkIGJlIHN0cmluZyBiZWNhdXNlIGl0IGlzIGEgcGFyYW1ldGVyIGluIFNEUCBmbXRwICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9pbGJjX2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiSUxCQ1wiIikKKyAgICAvKiAibW9kZSA9IChzdHJpbmcpIHsgXCIyMFwiLCBcIjMwXCIgfSIgKi8KKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9pbGJjX2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1pTEJDLCAiICJtb2RlID0gKGludCkgeyAyMCwgMzAgfSIpCisgICAgKTsKKworc3RhdGljIHZvaWQgZ3N0X2lsYmNfZGVwYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2lsYmNfZGVwYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX2lsYmNfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfaWxiY19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworI2RlZmluZSBnc3RfcnRwX2lsYmNfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UlRQaUxCQ0RlcGF5LCBnc3RfcnRwX2lsYmNfZGVwYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfREVQQVlMT0FEKTsKKworI2RlZmluZSBHU1RfVFlQRV9JTEJDX01PREUgKGdzdF9pbGJjX21vZGVfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X2lsYmNfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGlsYmNfbW9kZV90eXBlID0gMDsKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgaWxiY19tb2Rlc1tdID0geworICAgIHtHU1RfSUxCQ19NT0RFXzIwLCAiMjBtcyBmcmFtZXMiLCAiMjBtcyJ9LAorICAgIHtHU1RfSUxCQ19NT0RFXzMwLCAiMzBtcyBmcmFtZXMiLCAiMzBtcyJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIWlsYmNfbW9kZV90eXBlKSB7CisgICAgaWxiY19tb2RlX3R5cGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiaUxCQ01vZGUiLCBpbGJjX21vZGVzKTsKKyAgfQorICByZXR1cm4gaWxiY19tb2RlX3R5cGU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2lsYmNfZGVwYXlfY2xhc3NfaW5pdCAoR3N0UlRQaUxCQ0RlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9pbGJjX2RlcGF5X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2lsYmNfZGVwYXlfZ2V0X3Byb3BlcnR5OworCisgIC8qIEZJWE1FLCBtb2RlIGlzIGluIHRoZSBjYXBzICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTU9ERSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgibW9kZSIsICJNb2RlIiwgImlMQkMgZnJhbWUgbW9kZSIsCisgICAgICAgICAgR1NUX1RZUEVfSUxCQ19NT0RFLCBERUZBVUxUX01PREUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9pbGJjX2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfaWxiY19kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBpTEJDIGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBpTEJDIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgKFJGQyAzOTUyKSIsCisgICAgICAiUGhpbGlwcGUgS2FsYWYgPHBoaWxpcHBlLmthbGFmQGNvbGxhYm9yYS5jby51az4iKTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX2lsYmNfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2lsYmNfZGVwYXlfc2V0Y2FwczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaWxiY19kZXBheV9pbml0IChHc3RSVFBpTEJDRGVwYXkgKiBydHBpbGJjZGVwYXkpCit7CisgIC8qIFNldCBkZWZhdWx0IG1vZGUgKi8KKyAgcnRwaWxiY2RlcGF5LT5tb2RlID0gREVGQVVMVF9NT0RFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfaWxiY19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UlRQaUxCQ0RlcGF5ICpydHBpbGJjZGVwYXkgPSBHU1RfUlRQX0lMQkNfREVQQVkgKGRlcGF5bG9hZCk7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBjb25zdCBnY2hhciAqbW9kZV9zdHIgPSBOVUxMOworICBnaW50IG1vZGUsIGNsb2NrX3JhdGU7CisgIGdib29sZWFuIHJldDsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBtb2RlID0gcnRwaWxiY2RlcGF5LT5tb2RlOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSA4MDAwOworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIC8qIHBhcnNlIG1vZGUsIGlmIHdlIGNhbiAqLworICBtb2RlX3N0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAibW9kZSIpOworICBpZiAobW9kZV9zdHIpIHsKKyAgICBtb2RlID0gc3RydG9sIChtb2RlX3N0ciwgTlVMTCwgMTApOworICAgIGlmIChtb2RlICE9IDIwICYmIG1vZGUgIT0gMzApCisgICAgICBtb2RlID0gcnRwaWxiY2RlcGF5LT5tb2RlOworICB9CisKKyAgcnRwaWxiY2RlcGF5LT5tb2RlID0gbW9kZTsKKworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtaUxCQyIsCisgICAgICAibW9kZSIsIEdfVFlQRV9JTlQsIHJ0cGlsYmNkZXBheS0+bW9kZSwgTlVMTCk7CisgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBzcmNjYXBzKTsKKworICBHU1RfREVCVUcgKCJzZXQgY2FwcyBvbiBzb3VyY2U6ICUiIEdTVF9QVFJfRk9STUFUICIgKHJldD0lZCkiLCBzcmNjYXBzLCByZXQpOworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX2lsYmNfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ2Jvb2xlYW4gbWFya2VyOworCisgIG1hcmtlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCk7CisKKyAgR1NUX0RFQlVHICgicHJvY2VzcyA6IGdvdCAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzLCBtYXJrICVkIHRzICV1IHNlcW4gJWQiLAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAocnRwLT5idWZmZXIpLCBtYXJrZXIsCisgICAgICBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wIChydHApLCBnc3RfcnRwX2J1ZmZlcl9nZXRfc2VxIChydHApKTsKKworICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9idWZmZXIgKHJ0cCk7CisKKyAgaWYgKG1hcmtlciAmJiBvdXRidWYpIHsKKyAgICAvKiBtYXJrIHN0YXJ0IG9mIHRhbGtzcHVydCB3aXRoIFJFU1lOQyAqLworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX1JFU1lOQyk7CisgIH0KKworICBpZiAob3V0YnVmKSB7CisgICAgZ3N0X3J0cF9kcm9wX25vbl9hdWRpb19tZXRhIChkZXBheWxvYWQsIG91dGJ1Zik7CisgIH0KKworICByZXR1cm4gb3V0YnVmOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2lsYmNfZGVwYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJUUGlMQkNEZXBheSAqcnRwaWxiY2RlcGF5ID0gR1NUX1JUUF9JTEJDX0RFUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgcnRwaWxiY2RlcGF5LT5tb2RlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2lsYmNfZGVwYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJUUGlMQkNEZXBheSAqcnRwaWxiY2RlcGF5ID0gR1NUX1JUUF9JTEJDX0RFUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHJ0cGlsYmNkZXBheS0+bW9kZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2lsYmNfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBpbGJjZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfSUxCQ19ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWZkMjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuaApAQCAtMCwwICsxLDY1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFBoaWxpcHBlIEtoYWxhZiA8YnVyZ2VyQHNwZWVkeS5vcmc+IAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0lMQkNfREVQQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9JTEJDX0RFUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBpTEJDRGVwYXkgR3N0UlRQaUxCQ0RlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUGlMQkNEZXBheUNsYXNzIEdzdFJUUGlMQkNEZXBheUNsYXNzOworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9JTEJDX0RFUEFZIFwKKyAgKGdzdF9ydHBfaWxiY19kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0lMQkNfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfSUxCQ19ERVBBWSxHc3RSVFBpTEJDRGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX0lMQkNfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0lMQkNfREVQQVksR3N0UlRQaUxCQ0RlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0lMQkNfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfSUxCQ19ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfSUxCQ19ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSUxCQ19ERVBBWSkpCisgIAordHlwZWRlZiBlbnVtIHsKKyAgR1NUX0lMQkNfTU9ERV8yMCA9IDIwLAorICBHU1RfSUxCQ19NT0RFXzMwID0gMzAKK30gR3N0aUxCQ01vZGU7IAorCitzdHJ1Y3QgX0dzdFJUUGlMQkNEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKKworICBHc3RpTEJDTW9kZSBtb2RlOworfTsKKworc3RydWN0IF9Hc3RSVFBpTEJDRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9pbGJjX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9pbGJjX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0lMQkNfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwaWxiY3BheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYzdkOTMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYwpAQCAtMCwwICsxLDIyOCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBQaGlsaXBwZSBLaGFsYWYgPGJ1cmdlckBzcGVlZHkub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlICJnc3RydHBpbGJjcGF5LmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cGlsYmNwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cGlsYmNwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2lsYmNfcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1pTEJDLCAiICJtb2RlID0gKGludCkgezIwLCAzMH0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2lsYmNfcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDAsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIklMQkNcIiwgIgorICAgICAgICAibW9kZSA9IChzdHJpbmcpIHsgXCIyMFwiLCBcIjMwXCIgfSIpCisgICAgKTsKKworCitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3J0cF9pbGJjX3BheV9zaW5rX2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfaWxiY19wYXlfc2lua19zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworCisjZGVmaW5lIGdzdF9ydHBfaWxiY19wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UlRQSUxCQ1BheSwgZ3N0X3J0cF9pbGJjX3BheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9BVURJT19QQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaWxiY19wYXlfY2xhc3NfaW5pdCAoR3N0UlRQSUxCQ1BheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGlsYmNwYXlfZGVidWcsICJydHBpbGJjcGF5IiwgMCwKKyAgICAgICJpTEJDIGF1ZGlvIFJUUCBwYXlsb2FkZXIiKTsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2lsYmNfcGF5X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2lsYmNfcGF5X3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlJUUCBpTEJDIFBheWxvYWRlciIsCisgICAgICAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYWNrZXRpemUgaUxCQyBhdWRpbyBzdHJlYW1zIGludG8gUlRQIHBhY2tldHMiLAorICAgICAgIlBoaWxpcHBlIEthbGFmIDxwaGlsaXBwZS5rYWxhZkBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9pbGJjX3BheV9zaW5rX3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5nZXRfY2FwcyA9IGdzdF9ydHBfaWxiY19wYXlfc2lua19nZXRjYXBzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9pbGJjX3BheV9pbml0IChHc3RSVFBJTEJDUGF5ICogcnRwaWxiY3BheSkKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWQgKnJ0cGJhc2VwYXlsb2FkOworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkICpydHBiYXNlYXVkaW9wYXlsb2FkOworCisgIHJ0cGJhc2VwYXlsb2FkID0gR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHJ0cGlsYmNwYXkpOworICBydHBiYXNlYXVkaW9wYXlsb2FkID0gR1NUX1JUUF9CQVNFX0FVRElPX1BBWUxPQUQgKHJ0cGlsYmNwYXkpOworCisgIC8qIHdlIGRvbid0IHNldCB0aGUgcGF5bG9hZCB0eXBlLCBpdCBzaG91bGQgYmUgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiB1c2luZworICAgKiB0aGUgcHQgcHJvcGVydHkgb3IgdGhlIGRlZmF1bHQgOTYgd2lsbCBiZSB1c2VkICovCisgIHJ0cGJhc2VwYXlsb2FkLT5jbG9ja19yYXRlID0gODAwMDsKKworICBydHBpbGJjcGF5LT5tb2RlID0gLTE7CisKKyAgLyogdGVsbCBydHBiYXNlYXVkaW9wYXlsb2FkIHRoYXQgdGhpcyBpcyBhIGZyYW1lIGJhc2VkIGNvZGVjICovCisgIGdzdF9ydHBfYmFzZV9hdWRpb19wYXlsb2FkX3NldF9mcmFtZV9iYXNlZCAocnRwYmFzZWF1ZGlvcGF5bG9hZCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9pbGJjX3BheV9zaW5rX3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcnRwYmFzZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFJUUElMQkNQYXkgKnJ0cGlsYmNwYXk7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgKnJ0cGJhc2VhdWRpb3BheWxvYWQ7CisgIGdib29sZWFuIHJldDsKKyAgZ2ludCBtb2RlOworICBnY2hhciAqbW9kZV9zdHI7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBjb25zdCBjaGFyICpwYXlsb2FkX25hbWU7CisKKyAgcnRwaWxiY3BheSA9IEdTVF9SVFBfSUxCQ19QQVkgKHJ0cGJhc2VwYXlsb2FkKTsKKyAgcnRwYmFzZWF1ZGlvcGF5bG9hZCA9IEdTVF9SVFBfQkFTRV9BVURJT19QQVlMT0FEIChydHBiYXNlcGF5bG9hZCk7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgcGF5bG9hZF9uYW1lID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAoc3RydWN0dXJlKTsKKyAgaWYgKGdfYXNjaWlfc3RyY2FzZWNtcCAoImF1ZGlvL3gtaUxCQyIsIHBheWxvYWRfbmFtZSkpCisgICAgZ290byB3cm9uZ19jYXBzOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJtb2RlIiwgJm1vZGUpKQorICAgIGdvdG8gbm9fbW9kZTsKKworICBpZiAobW9kZSAhPSAyMCAmJiBtb2RlICE9IDMwKQorICAgIGdvdG8gd3JvbmdfbW9kZTsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAocnRwYmFzZXBheWxvYWQsICJhdWRpbyIsIFRSVUUsICJJTEJDIiwKKyAgICAgIDgwMDApOworICAvKiBzZXQgb3B0aW9ucyBmb3IgdGhpcyBmcmFtZSBiYXNlZCBhdWRpbyBjb2RlYyAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfZnJhbWVfb3B0aW9ucyAocnRwYmFzZWF1ZGlvcGF5bG9hZCwKKyAgICAgIG1vZGUsIG1vZGUgPT0gMzAgPyA1MCA6IDM4KTsKKworICBtb2RlX3N0ciA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgbW9kZSk7CisgIHJldCA9CisgICAgICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAocnRwYmFzZXBheWxvYWQsICJtb2RlIiwgR19UWVBFX1NUUklORywKKyAgICAgIG1vZGVfc3RyLCBOVUxMKTsKKyAgZ19mcmVlIChtb2RlX3N0cik7CisKKyAgaWYgKG1vZGUgIT0gcnRwaWxiY3BheS0+bW9kZSAmJiBydHBpbGJjcGF5LT5tb2RlICE9IC0xKQorICAgIGdvdG8gbW9kZV9jaGFuZ2VkOworCisgIHJ0cGlsYmNwYXktPm1vZGUgPSBtb2RlOworCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCit3cm9uZ19jYXBzOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwaWxiY3BheSwgImV4cGVjdGVkIGF1ZGlvL3gtaUxCQywgcmVjZWl2ZWQgJXMiLAorICAgICAgICBwYXlsb2FkX25hbWUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fbW9kZToKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGlsYmNwYXksICJkaWQgbm90IHJlY2VpdmUgYSBtb2RlIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit3cm9uZ19tb2RlOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwaWxiY3BheSwgIm1vZGUgbXVzdCBiZSAyMCBvciAzMCwgcmVjZWl2ZWQgJWQiLCBtb2RlKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK21vZGVfY2hhbmdlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGlsYmNwYXksICJNb2RlIGhhcyBjaGFuZ2VkIGZyb20gJWQgdG8gJWQhICIKKyAgICAgICAgIk1vZGUgY2Fubm90IGNoYW5nZSB3aGlsZSBzdHJlYW1pbmciLCBydHBpbGJjcGF5LT5tb2RlLCBtb2RlKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogd2UgcmV0dXJuIHRoZSBwYWR0ZW1wbGF0ZSBjYXBzIHdpdGggdGhlIG1vZGUgZmllbGQgZml4YXRlZCB0byBhIHZhbHVlIGlmIHdlCisgKiBjYW4gKi8KK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9ydHBfaWxiY19wYXlfc2lua19nZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHJ0cHBheWxvYWQsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RDYXBzICpvdGhlcnBhZGNhcHM7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgb3RoZXJwYWRjYXBzID0gZ3N0X3BhZF9nZXRfYWxsb3dlZF9jYXBzIChydHBwYXlsb2FkLT5zcmNwYWQpOworICBjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHBhZCk7CisKKyAgaWYgKG90aGVycGFkY2FwcykgeworICAgIGlmICghZ3N0X2NhcHNfaXNfZW1wdHkgKG90aGVycGFkY2FwcykpIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICAgICAgY29uc3QgZ2NoYXIgKm1vZGVfc3RyOworICAgICAgZ2ludCBtb2RlOworCisgICAgICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChvdGhlcnBhZGNhcHMsIDApOworCisgICAgICAvKiBwYXJzZSBtb2RlLCBpZiB3ZSBjYW4gKi8KKyAgICAgIG1vZGVfc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJtb2RlIik7CisgICAgICBpZiAobW9kZV9zdHIpIHsKKyAgICAgICAgbW9kZSA9IHN0cnRvbCAobW9kZV9zdHIsIE5VTEwsIDEwKTsKKyAgICAgICAgaWYgKG1vZGUgPT0gMjAgfHwgbW9kZSA9PSAzMCkgeworICAgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChjYXBzKTsKKyAgICAgICAgICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoc3RydWN0dXJlLCAibW9kZSIsIEdfVFlQRV9JTlQsIG1vZGUsIE5VTEwpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGdzdF9jYXBzX3VucmVmIChvdGhlcnBhZGNhcHMpOworICB9CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKnRtcDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHBheWxvYWQsICJJbnRlcnNlY3QgJSIgR1NUX1BUUl9GT1JNQVQgIiBhbmQgZmlsdGVyICUiCisgICAgICAgIEdTVF9QVFJfRk9STUFULCBjYXBzLCBmaWx0ZXIpOworICAgIHRtcCA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIGNhcHMsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIGNhcHMgPSB0bXA7CisgIH0KKworICByZXR1cm4gY2FwczsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfaWxiY19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBpbGJjcGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX0lMQkNfUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwaWxiY3BheS5oIGIvZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzNjNjMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwaWxiY3BheS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gUGhpbGlwcGUgS2hhbGFmIDxidXJnZXJAc3BlZWR5Lm9yZz4gCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfSUxCQ19QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9JTEJDX1BBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VhdWRpb3BheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9JTEJDX1BBWSBcCisgIChnc3RfcnRwX2lsYmNfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfSUxCQ19QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfSUxCQ19QQVksR3N0UlRQSUxCQ1BheSkpCisjZGVmaW5lIEdTVF9SVFBfSUxCQ19QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0lMQkNfUEFZLEdzdFJUUElMQkNQYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfSUxCQ19QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfSUxCQ19QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0lMQkNfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9JTEJDX1BBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBJTEJDUGF5IEdzdFJUUElMQkNQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQSUxCQ1BheUNsYXNzIEdzdFJUUElMQkNQYXlDbGFzczsKKworc3RydWN0IF9Hc3RSVFBJTEJDUGF5Cit7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgYXVkaW9wYXlsb2FkOworCisgIGdpbnQgbW9kZTsKK307CisKK3N0cnVjdCBfR3N0UlRQSUxCQ1BheUNsYXNzCit7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX2lsYmNfcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9pbGJjX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9JTEJDX1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwajJrY29tbW9uLmggYi9nc3QvcnRwL2dzdHJ0cGoya2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZjFiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGoya2NvbW1vbi5oCkBAIC0wLDAgKzEsMTAyIEBACisvKiBHU3RyZWFtZXIKKyogQ29weXJpZ2h0IChDKSAyMDA5IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisqCisqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisqLworCisKKyNpZm5kZWYgX19HU1RfUlRQX0oyS19DT01NT05fSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9KMktfQ09NTU9OX0hfXworCisKKworLyogU2FtcGxpbmcgdmFsdWVzIGZyb20gUkZDIDUzNzEgZm9yIEpQRUcgMjAwMCBvdmVyIFJUUCA6IGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL3JmYzUzNzEvQworCitSR0I6ICBzdGFuZGFyZCBSZWQsIEdyZWVuLCBCbHVlIGNvbG9yIHNwYWNlLgorCitCR1I6ICBzdGFuZGFyZCBCbHVlLCBHcmVlbiwgUmVkIGNvbG9yIHNwYWNlLgorCitSR0JBOiAgc3RhbmRhcmQgUmVkLCBHcmVlbiwgQmx1ZSwgQWxwaGEgY29sb3Igc3BhY2UuCisKK0JHUkE6ICBzdGFuZGFyZCBCbHVlLCBHcmVlbiwgUmVkLCBBbHBoYSBjb2xvciBzcGFjZS4KKworWUNiQ3ItNDo0OjQ6ICBzdGFuZGFyZCBZQ2JDciBjb2xvciBzcGFjZTsgbm8gc3Vic2FtcGxpbmcuCisKK1lDYkNyLTQ6MjoyOiAgc3RhbmRhcmQgWUNiQ3IgY29sb3Igc3BhY2U7IENiIGFuZCBDciBhcmUgc3Vic2FtcGxlZCBob3Jpem9udGFsbHkgYnkgMS8yLgorCitZQ2JDci00OjI6MDogIHN0YW5kYXJkIFlDYkNyIGNvbG9yIHNwYWNlOyBDYiBhbmQgQ3IgYXJlIHN1YnNhbXBsZWQgaG9yaXpvbnRhbGx5IGFuZCB2ZXJ0aWNhbGx5IGJ5IDEvMi4KKworWUNiQ3ItNDoxOjE6ICBzdGFuZGFyZCBZQ2JDciBjb2xvciBzcGFjZTsgQ2IgYW5kIENyIGFyZSBzdWJzYW1wbGVkIHZlcnRpY2FsbHkgYnkgMS80LgorCitHUkFZU0NBTEU6ICBiYXNpY2FsbHksIGEgc2luZ2xlIGNvbXBvbmVudCBpbWFnZSBvZiBqdXN0IG11bHRpbGV2ZWxzIG9mIGdyZXkuCisqLworCisKKyNkZWZpbmUgR1NUX1JUUF9KMktfUkdCICAgICAgICJSR0IiCisjZGVmaW5lIEdTVF9SVFBfSjJLX0JHUiAgICAgICAiQkdSIgorI2RlZmluZSBHU1RfUlRQX0oyS19SR0JBICAgICAgIlJHQkEiCisjZGVmaW5lIEdTVF9SVFBfSjJLX0JHUkEgICAgICAiQkdSQSIKKyNkZWZpbmUgR1NUX1JUUF9KMktfWUJSQSAgIAkgICJZQ2JDckEiCisjZGVmaW5lIEdTVF9SVFBfSjJLX1lCUjQ0NCAgICAiWUNiQ3ItNDo0OjQiCisjZGVmaW5lIEdTVF9SVFBfSjJLX1lCUjQyMiAgICAiWUNiQ3ItNDoyOjIiCisjZGVmaW5lIEdTVF9SVFBfSjJLX1lCUjQyMCAgICAiWUNiQ3ItNDoyOjAiCisjZGVmaW5lIEdTVF9SVFBfSjJLX1lCUjQxMCAgICAiWUNiQ3ItNDoxOjAiCisjZGVmaW5lIEdTVF9SVFBfSjJLX0dSQVlTQ0FMRSAiR1JBWVNDQUxFIgorCisjZGVmaW5lIEdTVF9SVFBfSjJLX1NBTVBMSU5HX0xJU1QgInNhbXBsaW5nID0gKHN0cmluZykge1wiUkdCXCIsIFwiQkdSXCIsIFwiUkdCQVwiLCBcIkJHUkFcIiwgXCJZQ2JDckFcIiwgXCJZQ2JDci00OjQ6NFwiLCBcIllDYkNyLTQ6MjoyXCIsIFwiWUNiQ3ItNDoyOjBcIiwgXCJZQ2JDci00OjE6MVwiLCBcIkdSQVlTQ0FMRVwifSIKKwordHlwZWRlZiBlbnVtCit7CisKKyAgR1NUX1JUUF9TQU1QTElOR19OT05FLAorICBHU1RfUlRQX1NBTVBMSU5HX1JHQiwKKyAgR1NUX1JUUF9TQU1QTElOR19CR1IsCisgIEdTVF9SVFBfU0FNUExJTkdfUkdCQSwKKyAgR1NUX1JUUF9TQU1QTElOR19CR1JBLAorICBHU1RfUlRQX1NBTVBMSU5HX1lCUkEsCisgIEdTVF9SVFBfU0FNUExJTkdfWUJSNDQ0LAorICBHU1RfUlRQX1NBTVBMSU5HX1lCUjQyMiwKKyAgR1NUX1JUUF9TQU1QTElOR19ZQlI0MjAsCisgIEdTVF9SVFBfU0FNUExJTkdfWUJSNDEwLAorICBHU1RfUlRQX1NBTVBMSU5HX0dSQVlTQ0FMRQorfSBHc3RSdHBTYW1wbGluZzsKKworCisvKgorKiBHc3RSdHBKMktNYXJrZXI6CisqIEBHU1RfSjJLX01BUktFUjogUHJlZml4IGZvciBKUEVHIDIwMDAgbWFya2VyCisqIEBHU1RfSjJLX01BUktFUl9TT0M6IFN0YXJ0IG9mIENvZGVzdHJlYW0KKyogQEdTVF9KMktfTUFSS0VSX1NPVDogU3RhcnQgb2YgdGlsZQorKiBAR1NUX0oyS19NQVJLRVJfRU9DOiBFbmQgb2YgQ29kZXN0cmVhbQorKgorKiBJZGVudGlmaWVycyBmb3IgbWFya2VycyBpbiBKUEVHIDIwMDAgY29kZSBzdHJlYW1zCisqLwordHlwZWRlZiBlbnVtCit7CisgIEdTVF9KMktfTUFSS0VSID0gMHhGRiwKKyAgR1NUX0oyS19NQVJLRVJfU09DID0gMHg0RiwKKyAgR1NUX0oyS19NQVJLRVJfU09UID0gMHg5MCwKKyAgR1NUX0oyS19NQVJLRVJfU09QID0gMHg5MSwKKyAgR1NUX0oyS19NQVJLRVJfRVBIID0gMHg5MiwKKyAgR1NUX0oyS19NQVJLRVJfU09EID0gMHg5MywKKyAgR1NUX0oyS19NQVJLRVJfRU9DID0gMHhEOQorfSBHc3RSdHBKMktNYXJrZXI7CisKKworI2RlZmluZSBHU1RfUlRQX0oyS19IRUFERVJfU0laRSA4CisKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9KMktfQ09NTU9OX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMGRkMzQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGoya2RlcGF5LmMKQEAgLTAsMCArMSw2NjcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyAvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1ydHBqMmtkZXBheQorICoKKyAqIERlcGF5bG9hZCBhbiBSVFAtcGF5bG9hZGVkIEpQRUcgMjAwMCBpbWFnZSBpbnRvIFJUUCBwYWNrZXRzIGFjY29yZGluZyB0byBSRkMgNTM3MQorICogYW5kIFJGQyA1MzcyLgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvcmZjNTM3MS8KKyAqIGFuZCBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9yZmM1MzcyLworICovCisKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0cnRwajJrY29tbW9uLmgiCisjaW5jbHVkZSAiZ3N0cnRwajJrZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBqMmtkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwajJrZGVwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2oya19kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImltYWdlL3gtanBjLCAiCisgICAgICAgICJjb2xvcnNwYWNlID0gKHN0cmluZykgeyBzUkdCLCBzWVVWLCBHUkFZIH0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2oya19kZXBheV9zaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIgorICAgICAgICBHU1RfUlRQX0oyS19TQU1QTElOR19MSVNUICIsIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiSlBFRzIwMDBcIjsiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIgorICAgICAgICAiY29sb3JzcGFjZSA9IChzdHJpbmcpIHsgc1JHQiwgc1lVViwgR1JBWSB9LCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJKUEVHMjAwMFwiOyIpCisgICAgKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTEFTVAorfTsKKworI2RlZmluZSBnc3RfcnRwX2oya19kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBKMktEZXBheSwgZ3N0X3J0cF9qMmtfZGVwYXksIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfajJrX2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9qMmtfZGVwYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9qMmtfZGVwYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfajJrX2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2oya19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfajJrX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfajJrX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEoyS0RlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9qMmtfZGVwYXlfZmluYWxpemU7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9qMmtfZGVwYXlfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcnRwX2oya19kZXBheV9nZXRfcHJvcGVydHk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9qMmtfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9qMmtfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgSlBFRyAyMDAwIGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBKUEVHIDIwMDAgdmlkZW8gZnJvbSBSVFAgcGFja2V0cyAoUkZDIDUzNzEpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfajJrX2RlcGF5X2NoYW5nZV9zdGF0ZTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfajJrX2RlcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfajJrX2RlcGF5X3Byb2Nlc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGoya2RlcGF5X2RlYnVnLCAicnRwajJrZGVwYXkiLCAwLAorICAgICAgIkoySyBWaWRlbyBSVFAgRGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfajJrX2RlcGF5X2luaXQgKEdzdFJ0cEoyS0RlcGF5ICogcnRwajJrZGVwYXkpCit7CisgIHJ0cGoya2RlcGF5LT5wdV9hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworICBydHBqMmtkZXBheS0+dF9hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworICBydHBqMmtkZXBheS0+Zl9hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworfQorCitzdGF0aWMgdm9pZAorc3RvcmVfbWhlYWRlciAoR3N0UnRwSjJLRGVwYXkgKiBydHBqMmtkZXBheSwgZ3VpbnQgaWR4LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdEJ1ZmZlciAqb2xkOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGoya2RlcGF5LCAic3RvcmluZyBtYWluIGhlYWRlciAlcCBhdCBpbmRleCAldSIsIGJ1ZiwKKyAgICAgIGlkeCk7CisgIGlmICgob2xkID0gcnRwajJrZGVwYXktPk1IW2lkeF0pKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKG9sZCk7CisgIHJ0cGoya2RlcGF5LT5NSFtpZHhdID0gYnVmOworfQorCitzdGF0aWMgdm9pZAorY2xlYXJfbWhlYWRlcnMgKEdzdFJ0cEoyS0RlcGF5ICogcnRwajJrZGVwYXkpCit7CisgIGd1aW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICBzdG9yZV9taGVhZGVyIChydHBqMmtkZXBheSwgaSwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2oya19kZXBheV9yZXNldCAoR3N0UnRwSjJLRGVwYXkgKiBydHBqMmtkZXBheSkKK3sKKyAgY2xlYXJfbWhlYWRlcnMgKHJ0cGoya2RlcGF5KTsKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGoya2RlcGF5LT5wdV9hZGFwdGVyKTsKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGoya2RlcGF5LT50X2FkYXB0ZXIpOworICBnc3RfYWRhcHRlcl9jbGVhciAocnRwajJrZGVwYXktPmZfYWRhcHRlcik7CisgIHJ0cGoya2RlcGF5LT5uZXh0X2ZyYWcgPSAwOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9qMmtfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cEoyS0RlcGF5ICpydHBqMmtkZXBheTsKKworICBydHBqMmtkZXBheSA9IEdTVF9SVFBfSjJLX0RFUEFZIChvYmplY3QpOworCisgIGNsZWFyX21oZWFkZXJzIChydHBqMmtkZXBheSk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHJ0cGoya2RlcGF5LT5wdV9hZGFwdGVyKTsKKyAgZ19vYmplY3RfdW5yZWYgKHJ0cGoya2RlcGF5LT50X2FkYXB0ZXIpOworICBnX29iamVjdF91bnJlZiAocnRwajJrZGVwYXktPmZfYWRhcHRlcik7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfajJrX2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZSA9IE5VTEw7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKyAgR3N0Q2FwcyAqb3V0Y2FwcyA9IE5VTEw7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworICBjb25zdCBnY2hhciAqY29sb3JzcGFjZSA9IE5VTEw7CisgIGNvbnN0IGdjaGFyICpzYW1wbGluZyA9IE5VTEw7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgY2xvY2tfcmF0ZSA9IDkwMDAwOworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIHNhbXBsaW5nID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJzYW1wbGluZyIpOworICBpZiAoc2FtcGxpbmcpIHsKKyAgICBpZiAoIXN0cmNtcCAoc2FtcGxpbmcsIEdTVF9SVFBfSjJLX1JHQikgfHwKKyAgICAgICAgIXN0cmNtcCAoc2FtcGxpbmcsIEdTVF9SVFBfSjJLX1JHQkEpIHx8CisgICAgICAgICFzdHJjbXAgKHNhbXBsaW5nLCBHU1RfUlRQX0oyS19CR1IpIHx8CisgICAgICAgICFzdHJjbXAgKHNhbXBsaW5nLCBHU1RfUlRQX0oyS19CR1JBKSkKKyAgICAgIGNvbG9yc3BhY2UgPSAic1JHQiI7CisgICAgZWxzZSBpZiAoIXN0cmNtcCAoc2FtcGxpbmcsIEdTVF9SVFBfSjJLX0dSQVlTQ0FMRSkpCisgICAgICBjb2xvcnNwYWNlID0gIkdSQVkiOworICAgIGVsc2UKKyAgICAgIGNvbG9yc3BhY2UgPSAic1lVViI7CisgIH0gZWxzZSB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoZGVwYXlsb2FkLCBTVFJFQU0sIERFTVVYLCBOVUxMLAorICAgICAgICAoIk5vbi1jb21wbGlhbnQgc3RyZWFtOiBzYW1wbGluZyBmaWVsZCBtaXNzaW5nLiBGcmFtZXMgbXkgYXBwZWFyIGluY29ycmVjdCIpKTsKKyAgICBjb2xvcnNwYWNlID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJjb2xvcnNwYWNlIik7CisgICAgaWYgKCFzdHJjbXAgKGNvbG9yc3BhY2UsICJHUkFZIikpIHsKKyAgICAgIHNhbXBsaW5nID0gR1NUX1JUUF9KMktfR1JBWVNDQUxFOworICAgIH0KKyAgfQorCisgIG91dGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiaW1hZ2UveC1qcGMiLAorICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLCAwLCAxLAorICAgICAgImZpZWxkcyIsIEdfVFlQRV9JTlQsIDEsICJjb2xvcnNwYWNlIiwgR19UWVBFX1NUUklORywgY29sb3JzcGFjZSwgTlVMTCk7CisKKyAgaWYgKHNhbXBsaW5nKQorICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKG91dGNhcHMsICJzYW1wbGluZyIsIEdfVFlQRV9TVFJJTkcsIHNhbXBsaW5nLCBOVUxMKTsKKworICByZXMgPSBnc3RfcGFkX3NldF9jYXBzIChkZXBheWxvYWQtPnNyY3BhZCwgb3V0Y2Fwcyk7CisKKyAgZ3N0X2NhcHNfdW5yZWYgKG91dGNhcHMpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2oya19kZXBheV9jbGVhcl9wdSAoR3N0UnRwSjJLRGVwYXkgKiBydHBqMmtkZXBheSkKK3sKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGoya2RlcGF5LT5wdV9hZGFwdGVyKTsKKyAgcnRwajJrZGVwYXktPmhhdmVfc3luYyA9IEZBTFNFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9qMmtfZGVwYXlfZmx1c2hfcHUgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQpCit7CisgIEdzdFJ0cEoyS0RlcGF5ICpydHBqMmtkZXBheTsKKyAgR3N0QnVmZmVyICptaGVhZGVyOworICBndWludCBhdmFpbCwgTUhGLCBtaF9pZDsKKworICBydHBqMmtkZXBheSA9IEdTVF9SVFBfSjJLX0RFUEFZIChkZXBheWxvYWQpOworCisgIC8qIHRha2UgYWxsIGF2YWlsYWJsZSBidWZmZXJzICovCisgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBqMmtkZXBheS0+cHVfYWRhcHRlcik7CisgIGlmIChhdmFpbCA9PSAwKQorICAgIGdvdG8gZG9uZTsKKworICBNSEYgPSBydHBqMmtkZXBheS0+cHVfTUhGOworICBtaF9pZCA9IHJ0cGoya2RlcGF5LT5sYXN0X21oX2lkOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGoya2RlcGF5LCAiZmx1c2hpbmcgUFUgb2Ygc2l6ZSAldSIsIGF2YWlsKTsKKworICBpZiAoTUhGID09IDApIHsKKyAgICBHTGlzdCAqcGFja2V0cywgKndhbGs7CisKKyAgICBwYWNrZXRzID0gZ3N0X2FkYXB0ZXJfdGFrZV9saXN0IChydHBqMmtkZXBheS0+cHVfYWRhcHRlciwgYXZhaWwpOworICAgIC8qIGFwcGVuZCBwYWNrZXRzICovCisgICAgZm9yICh3YWxrID0gcGFja2V0czsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgICAgR3N0QnVmZmVyICpidWYgPSBHU1RfQlVGRkVSX0NBU1QgKHdhbGstPmRhdGEpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwajJrZGVwYXksCisgICAgICAgICAgImFwcGVuZCBwdSBwYWNrZXQgb2Ygc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCwKKyAgICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpKTsKKyAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGoya2RlcGF5LT50X2FkYXB0ZXIsIGJ1Zik7CisgICAgfQorICAgIGdfbGlzdF9mcmVlIChwYWNrZXRzKTsKKyAgfSBlbHNlIHsKKyAgICAvKiB3ZSBoYXZlIGEgaGVhZGVyICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwajJrZGVwYXksICJrZWVwaW5nIGhlYWRlciAldSIsIG1oX2lkKTsKKyAgICAvKiB3ZSBtYW5hZ2VkIHRvIHNlZSB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgaGVhZGVyLCB0YWtlIGFsbCBmcm9tCisgICAgICogYWRhcHRlciBhbmQga2VlcCBpbiBoZWFkZXIgICovCisgICAgbWhlYWRlciA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChydHBqMmtkZXBheS0+cHVfYWRhcHRlciwgYXZhaWwpOworCisgICAgc3RvcmVfbWhlYWRlciAocnRwajJrZGVwYXksIG1oX2lkLCBtaGVhZGVyKTsKKyAgfQorCitkb25lOgorICBydHBqMmtkZXBheS0+aGF2ZV9zeW5jID0gRkFMU0U7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9qMmtfZGVwYXlfZmx1c2hfdGlsZSAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCkKK3sKKyAgR3N0UnRwSjJLRGVwYXkgKnJ0cGoya2RlcGF5OworICBndWludCBhdmFpbCwgbWhfaWQ7CisgIEdMaXN0ICpwYWNrZXRzLCAqd2FsazsKKyAgZ3VpbnQ4IGVuZFsyXTsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdEJ1ZmZlciAqYnVmOworCisgIHJ0cGoya2RlcGF5ID0gR1NUX1JUUF9KMktfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgLyogZmx1c2ggcGVuZGluZyBQVSAqLworICBnc3RfcnRwX2oya19kZXBheV9mbHVzaF9wdSAoZGVwYXlsb2FkKTsKKworICAvKiB0YWtlIGFsbCBhdmFpbGFibGUgYnVmZmVycyAqLworICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwajJrZGVwYXktPnRfYWRhcHRlcik7CisgIGlmIChhdmFpbCA9PSAwKQorICAgIGdvdG8gZG9uZTsKKworICBtaF9pZCA9IHJ0cGoya2RlcGF5LT5sYXN0X21oX2lkOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGoya2RlcGF5LCAiZmx1c2hpbmcgdGlsZSBvZiBzaXplICV1IiwgYXZhaWwpOworCisgIGlmIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHJ0cGoya2RlcGF5LT5mX2FkYXB0ZXIpID09IDApIHsKKyAgICBHc3RCdWZmZXIgKm1oZWFkZXI7CisKKyAgICAvKiB3ZSBuZWVkIGEgaGVhZGVyIG5vdyAqLworICAgIGlmICgobWhlYWRlciA9IHJ0cGoya2RlcGF5LT5NSFttaF9pZF0pID09IE5VTEwpCisgICAgICBnb3RvIHdhaXRpbmdfaGVhZGVyOworCisgICAgLyogcHVzaCBoZWFkZXIgaW4gdGhlIGFkYXB0ZXIgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBqMmtkZXBheSwgInB1c2hpbmcgaGVhZGVyICV1IiwgbWhfaWQpOworICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGoya2RlcGF5LT5mX2FkYXB0ZXIsIGdzdF9idWZmZXJfcmVmIChtaGVhZGVyKSk7CisgIH0KKworICAvKiBjaGVjayBmb3IgbGFzdCBieXRlcyAqLworICBnc3RfYWRhcHRlcl9jb3B5IChydHBqMmtkZXBheS0+dF9hZGFwdGVyLCBlbmQsIGF2YWlsIC0gMiwgMik7CisKKyAgLyogbm93IGFwcGVuZCB0aGUgdGlsZSBwYWNrZXRzIHRvIHRoZSBmcmFtZSAqLworICBwYWNrZXRzID0gZ3N0X2FkYXB0ZXJfdGFrZV9saXN0IChydHBqMmtkZXBheS0+dF9hZGFwdGVyLCBhdmFpbCk7CisgIGZvciAod2FsayA9IHBhY2tldHM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBidWYgPSBHU1RfQlVGRkVSX0NBU1QgKHdhbGstPmRhdGEpOworCisgICAgaWYgKHdhbGsgPT0gcGFja2V0cykgeworICAgICAgLyogZmlyc3QgYnVmZmVyIHNob3VsZCBjb250YWluIHRoZSBTT1QgKi8KKyAgICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgICAgIGlmIChtYXAuc2l6ZSA8IDEyKQorICAgICAgICBnb3RvIGludmFsaWRfdGlsZTsKKworICAgICAgaWYgKG1hcC5kYXRhWzBdID09IEdTVF9KMktfTUFSS0VSICYmIG1hcC5kYXRhWzFdID09IEdTVF9KMktfTUFSS0VSX1NPVCkgeworICAgICAgICBndWludCBQc290LCBuUHNvdDsKKworICAgICAgICBpZiAoZW5kWzBdID09IEdTVF9KMktfTUFSS0VSICYmIGVuZFsxXSA9PSBHU1RfSjJLX01BUktFUl9FT0MpCisgICAgICAgICAgblBzb3QgPSBhdmFpbCAtIDI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBuUHNvdCA9IGF2YWlsOworCisgICAgICAgIFBzb3QgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKCZtYXAuZGF0YVs2XSk7CisgICAgICAgIGlmIChQc290ICE9IG5Qc290ICYmIFBzb3QgIT0gMCkgeworICAgICAgICAgIC8qIFBzb3QgbXVzdCBtYXRjaCB0aGUgc2l6ZSBvZiB0aGUgdGlsZSAqLworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGoya2RlcGF5LCAic2V0IFBzb3QgZnJvbSAldSB0byAldSIsIFBzb3QsIG5Qc290KTsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgICAgICAgICAgYnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChidWYpOworCisgICAgICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgICAgICAgICAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoJm1hcC5kYXRhWzZdLCBuUHNvdCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgfQorCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwajJrZGVwYXksICJhcHBlbmQgcHUgcGFja2V0IG9mIHNpemUgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikpOworICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGoya2RlcGF5LT5mX2FkYXB0ZXIsIGJ1Zik7CisgIH0KKyAgZ19saXN0X2ZyZWUgKHBhY2tldHMpOworCitkb25lOgorICBydHBqMmtkZXBheS0+bGFzdF90aWxlID0gLTE7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBlcnJvcnMgKi8KK3dhaXRpbmdfaGVhZGVyOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwajJrZGVwYXksICJ3YWl0aW5nIGZvciBoZWFkZXIgJXUiLCBtaF9pZCk7CisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGoya2RlcGF5LT50X2FkYXB0ZXIpOworICAgIHJ0cGoya2RlcGF5LT5sYXN0X3RpbGUgPSAtMTsKKyAgICByZXR1cm4gcmV0OworICB9CitpbnZhbGlkX3RpbGU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBqMmtkZXBheSwgU1RSRUFNLCBERUNPREUsICgiSW52YWxpZCB0aWxlIiksIChOVUxMKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRwajJrZGVwYXktPnRfYWRhcHRlcik7CisgICAgcnRwajJrZGVwYXktPmxhc3RfdGlsZSA9IC0xOworICAgIHJldHVybiByZXQ7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfajJrX2RlcGF5X2ZsdXNoX2ZyYW1lIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkKQoreworICBHc3RSdHBKMktEZXBheSAqcnRwajJrZGVwYXk7CisgIGd1aW50OCBlbmRbMl07CisgIGd1aW50IGF2YWlsOworCisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgcnRwajJrZGVwYXkgPSBHU1RfUlRQX0oyS19ERVBBWSAoZGVwYXlsb2FkKTsKKworICAvKiBmbHVzaCBwZW5kaW5nIHRpbGUgKi8KKyAgZ3N0X3J0cF9qMmtfZGVwYXlfZmx1c2hfdGlsZSAoZGVwYXlsb2FkKTsKKworICAvKiBsYXN0IGJ1ZmZlciB0YWtlIGFsbCBkYXRhIG91dCBvZiB0aGUgYWRhcHRlciAqLworICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwajJrZGVwYXktPmZfYWRhcHRlcik7CisgIGlmIChhdmFpbCA9PSAwKQorICAgIGdvdG8gZG9uZTsKKworICBpZiAoYXZhaWwgPiAyKSB7CisgICAgR3N0QnVmZmVyICpvdXRidWY7CisKKyAgICAvKiB0YWtlIHRoZSBsYXN0IGJ5dGVzIG9mIHRoZSBKUEVHIDIwMDAgZGF0YSB0byBzZWUgaWYgdGhlcmUgaXMgYW4gRU9DCisgICAgICogbWFya2VyICovCisgICAgZ3N0X2FkYXB0ZXJfY29weSAocnRwajJrZGVwYXktPmZfYWRhcHRlciwgZW5kLCBhdmFpbCAtIDIsIDIpOworCisgICAgaWYgKGVuZFswXSAhPSBHU1RfSjJLX01BUktFUiAmJiBlbmRbMV0gIT0gR1NUX0oyS19NQVJLRVJfRU9DKSB7CisgICAgICBlbmRbMF0gPSBHU1RfSjJLX01BUktFUjsKKyAgICAgIGVuZFsxXSA9IEdTVF9KMktfTUFSS0VSX0VPQzsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwajJrZGVwYXksICJubyBFT0MgbWFya2VyLCBhZGRpbmcgb25lIik7CisKKyAgICAgIC8qIG5vIEVPSSBtYXJrZXIsIGFkZCBvbmUgKi8KKyAgICAgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMik7CisgICAgICBnc3RfYnVmZmVyX2ZpbGwgKG91dGJ1ZiwgMCwgZW5kLCAyKTsKKworICAgICAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRwajJrZGVwYXktPmZfYWRhcHRlciwgb3V0YnVmKTsKKyAgICAgIGF2YWlsICs9IDI7CisgICAgfQorCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwajJrZGVwYXksICJwdXNoaW5nIGJ1ZmZlciBvZiAldSBieXRlcyIsIGF2YWlsKTsKKyAgICBvdXRidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRwajJrZGVwYXktPmZfYWRhcHRlciwgYXZhaWwpOworICAgIGdzdF9ydHBfZHJvcF9ub25fdmlkZW9fbWV0YSAoZGVwYXlsb2FkLCBvdXRidWYpOworICAgIHJldCA9IGdzdF9ydHBfYmFzZV9kZXBheWxvYWRfcHVzaCAoZGVwYXlsb2FkLCBvdXRidWYpOworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwajJrZGVwYXksICJlbXB0eSBwYWNrZXQiKTsKKyAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRwajJrZGVwYXktPmZfYWRhcHRlcik7CisgIH0KKworICAvKiB3ZSBhY2NlcHQgYW55IG1oX2lkIG5vdyAqLworICBydHBqMmtkZXBheS0+bGFzdF9taF9pZCA9IC0xOworCisgIC8qIHJlc2V0IHN0YXRlICovCisgIHJ0cGoya2RlcGF5LT5uZXh0X2ZyYWcgPSAwOworICBydHBqMmtkZXBheS0+aGF2ZV9zeW5jID0gRkFMU0U7CisKK2RvbmU6CisgIC8qIHdlIGNhbid0IGtlZXAgaGVhZGVycyB3aXRoIG1oX2lkIG9mIDAgKi8KKyAgc3RvcmVfbWhlYWRlciAocnRwajJrZGVwYXksIDAsIE5VTEwpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9qMmtfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RSdHBKMktEZXBheSAqcnRwajJrZGVwYXk7CisgIGd1aW50OCAqcGF5bG9hZDsKKyAgZ3VpbnQgTUhGLCBtaF9pZCwgZnJhZ19vZmZzZXQsIHRpbGUsIHBheWxvYWRfbGVuLCBqMmtsZW47CisgIGdpbnQgZ2FwOworICBndWludDMyIHJ0cHRpbWU7CisKKyAgcnRwajJrZGVwYXkgPSBHU1RfUlRQX0oyS19ERVBBWSAoZGVwYXlsb2FkKTsKKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworCisgIC8qIHdlIG5lZWQgYXQgbGVhc3QgYSBoZWFkZXIgKi8KKyAgaWYgKHBheWxvYWRfbGVuIDwgR1NUX1JUUF9KMktfSEVBREVSX1NJWkUpCisgICAgZ290byBlbXB0eV9wYWNrZXQ7CisKKyAgcnRwdGltZSA9IGdzdF9ydHBfYnVmZmVyX2dldF90aW1lc3RhbXAgKHJ0cCk7CisKKyAgLyogbmV3IHRpbWVzdGFtcCBtYXJrcyBuZXcgZnJhbWUgKi8KKyAgaWYgKHJ0cGoya2RlcGF5LT5sYXN0X3J0cHRpbWUgIT0gcnRwdGltZSkgeworICAgIHJ0cGoya2RlcGF5LT5sYXN0X3J0cHRpbWUgPSBydHB0aW1lOworICAgIC8qIGZsdXNoIHBlbmRpbmcgZnJhbWUgKi8KKyAgICBnc3RfcnRwX2oya19kZXBheV9mbHVzaF9mcmFtZSAoZGVwYXlsb2FkKTsKKyAgfQorCisgIC8qCisgICAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfHRwIHxNSEZ8bWhfaWR8VHwgICAgIHByaW9yaXR5ICB8ICAgICAgICAgICB0aWxlIG51bWJlciAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfHJlc2VydmVkICAgICAgIHwgICAgICAgICAgICAgZnJhZ21lbnQgb2Zmc2V0ICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICovCisgIE1IRiA9IChwYXlsb2FkWzBdICYgMHgzMCkgPj4gNDsKKyAgbWhfaWQgPSAocGF5bG9hZFswXSAmIDB4ZSkgPj4gMTsKKworICBpZiAocnRwajJrZGVwYXktPmxhc3RfbWhfaWQgPT0gLTEpCisgICAgcnRwajJrZGVwYXktPmxhc3RfbWhfaWQgPSBtaF9pZDsKKyAgZWxzZSBpZiAocnRwajJrZGVwYXktPmxhc3RfbWhfaWQgIT0gbWhfaWQpCisgICAgZ290byB3cm9uZ19taF9pZDsKKworICB0aWxlID0gKHBheWxvYWRbMl0gPDwgOCkgfCBwYXlsb2FkWzNdOworICBmcmFnX29mZnNldCA9IChwYXlsb2FkWzVdIDw8IDE2KSB8IChwYXlsb2FkWzZdIDw8IDgpIHwgcGF5bG9hZFs3XTsKKyAgajJrbGVuID0gcGF5bG9hZF9sZW4gLSBHU1RfUlRQX0oyS19IRUFERVJfU0laRTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBqMmtkZXBheSwgIk1IRiAldSwgdGlsZSAldSwgZnJhZyAldSwgZXhwZWN0ZWQgJXUiLCBNSEYsCisgICAgICB0aWxlLCBmcmFnX29mZnNldCwgcnRwajJrZGVwYXktPm5leHRfZnJhZyk7CisKKyAgLyogY2FsY3VsYXRlIHRoZSBnYXAgYmV0d2VlbiBleHBlY3RlZCBmcmFnICovCisgIGdhcCA9IGZyYWdfb2Zmc2V0IC0gcnRwajJrZGVwYXktPm5leHRfZnJhZzsKKyAgLyogY2FsY3VsYXRlIG5leHQgZnJhZyAqLworICBydHBqMmtkZXBheS0+bmV4dF9mcmFnID0gZnJhZ19vZmZzZXQgKyBqMmtsZW47CisKKyAgaWYgKGdhcCAhPSAwKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwajJrZGVwYXksICJkaXNjb250IG9mICVkLCBjbGVhciBQVSIsIGdhcCk7CisgICAgLyogZGlzY29udCwgY2xlYXIgcHUgYWRhcHRlciBhbmQgcmVzeW5jICovCisgICAgZ3N0X3J0cF9qMmtfZGVwYXlfY2xlYXJfcHUgKHJ0cGoya2RlcGF5KTsKKyAgfQorCisgIC8qIGNoZWNrIGZvciBzeW5jIGNvZGUgKi8KKyAgaWYgKGoya2xlbiA+IDIgJiYgcGF5bG9hZFtHU1RfUlRQX0oyS19IRUFERVJfU0laRV0gPT0gR1NUX0oyS19NQVJLRVIpIHsKKyAgICBndWludCBtYXJrZXIgPSBwYXlsb2FkW0dTVF9SVFBfSjJLX0hFQURFUl9TSVpFICsgMV07CisKKyAgICAvKiBwYWNrZXRzIG11c3Qgc3RhcnQgd2l0aCBTT0MsIFNPVCBvciBTT1AgKi8KKyAgICBzd2l0Y2ggKG1hcmtlcikgeworICAgICAgY2FzZSBHU1RfSjJLX01BUktFUl9TT0M6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGoya2RlcGF5LCAiZm91bmQgU09DIHBhY2tldCIpOworICAgICAgICAvKiBmbHVzaCB0aGUgcHJldmlvdXMgZnJhbWUsIHNob3VsZCBoYXZlIGhhcHBlbmVkIHdoZW4gdGhlIHRpbWVzdGFtcAorICAgICAgICAgKiBjaGFuZ2VkIGFib3ZlLiAqLworICAgICAgICBnc3RfcnRwX2oya19kZXBheV9mbHVzaF9mcmFtZSAoZGVwYXlsb2FkKTsKKyAgICAgICAgcnRwajJrZGVwYXktPmhhdmVfc3luYyA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfSjJLX01BUktFUl9TT1Q6CisgICAgICAgIC8qIGZsdXNoIHRoZSBwcmV2aW91cyB0aWxlICovCisgICAgICAgIGdzdF9ydHBfajJrX2RlcGF5X2ZsdXNoX3RpbGUgKGRlcGF5bG9hZCk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGoya2RlcGF5LCAiZm91bmQgU09UIHBhY2tldCIpOworICAgICAgICBydHBqMmtkZXBheS0+aGF2ZV9zeW5jID0gVFJVRTsKKyAgICAgICAgLyogd2Ugc3luYyBvbiB0aGUgdGlsZSBub3cgKi8KKyAgICAgICAgcnRwajJrZGVwYXktPmxhc3RfdGlsZSA9IHRpbGU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfSjJLX01BUktFUl9TT1A6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGoya2RlcGF5LCAiZm91bmQgU09QIHBhY2tldCIpOworICAgICAgICAvKiBmbHVzaCB0aGUgcHJldmlvdXMgUFUgKi8KKyAgICAgICAgZ3N0X3J0cF9qMmtfZGVwYXlfZmx1c2hfcHUgKGRlcGF5bG9hZCk7CisgICAgICAgIGlmIChydHBqMmtkZXBheS0+bGFzdF90aWxlICE9IHRpbGUpIHsKKyAgICAgICAgICAvKiB3cm9uZyB0aWxlLCB3ZSBsb3NlIHN5bmMgYW5kIHdlIG5lZWQgYSBuZXcgU09UIG9yIFNPQyB0byByZWdhaW4KKyAgICAgICAgICAgKiBzeW5jLiBGaXJzdCBmbHVzaCBvdXQgdGhlIHByZXZpb3VzIHRpbGUgaWYgd2UgaGF2ZSBvbmUuICovCisgICAgICAgICAgaWYgKHJ0cGoya2RlcGF5LT5sYXN0X3RpbGUgIT0gLTEpCisgICAgICAgICAgICBnc3RfcnRwX2oya19kZXBheV9mbHVzaF90aWxlIChkZXBheWxvYWQpOworICAgICAgICAgIC8qIG5vdyB3ZSBoYXZlIG5vIG1vcmUgdmFsaWQgdGlsZSBhbmQgbm8gc3luYyAqLworICAgICAgICAgIHJ0cGoya2RlcGF5LT5sYXN0X3RpbGUgPSAtMTsKKyAgICAgICAgICBydHBqMmtkZXBheS0+aGF2ZV9zeW5jID0gRkFMU0U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcnRwajJrZGVwYXktPmhhdmVfc3luYyA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBqMmtkZXBheSwgIm5vIHN5bmMgcGFja2V0IDB4JTAyZCIsIG1hcmtlcik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChydHBqMmtkZXBheS0+aGF2ZV9zeW5jKSB7CisgICAgR3N0QnVmZmVyICpwdV9mcmFnOworCisgICAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwajJrZGVwYXktPnB1X2FkYXB0ZXIpID09IDApIHsKKyAgICAgIC8qIGZpcnN0IHBhcnQgb2YgcHUsIHJlY29yZCBzdGF0ZSAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwajJrZGVwYXksICJmaXJzdCBQVSIpOworICAgICAgcnRwajJrZGVwYXktPnB1X01IRiA9IE1IRjsKKyAgICB9CisgICAgLyogYW5kIHB1c2ggaW4gcHUgYWRhcHRlciAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGoya2RlcGF5LCAicHVzaCBwdSBvZiBzaXplICV1IGluIGFkYXB0ZXIiLCBqMmtsZW4pOworICAgIHB1X2ZyYWcgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgKHJ0cCwgOCwgLTEpOworICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGoya2RlcGF5LT5wdV9hZGFwdGVyLCBwdV9mcmFnKTsKKworICAgIGlmIChNSEYgJiAyKSB7CisgICAgICAvKiBsYXN0IHBhcnQgb2YgbWFpbiBoZWFkZXIgcmVjZWl2ZWQsIHdlIGNhbiBmbHVzaCBpdCAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwajJrZGVwYXksICJoZWFkZXIgZW5kLCBmbHVzaCBwdSIpOworICAgICAgZ3N0X3J0cF9qMmtfZGVwYXlfZmx1c2hfcHUgKGRlcGF5bG9hZCk7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGoya2RlcGF5LCAiZGlzY2FyZCBwYWNrZXQsIG5vIHN5bmMiKTsKKyAgfQorCisgIC8qIG1hcmtlciBiaXQgZmluaXNoZXMgdGhlIGZyYW1lICovCisgIGlmIChnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwajJrZGVwYXksICJtYXJrZXIgc2V0LCBsYXN0IGJ1ZmZlciIpOworICAgIC8qIHRoZW4gZmx1c2ggZnJhbWUgKi8KKyAgICBnc3RfcnRwX2oya19kZXBheV9mbHVzaF9mcmFtZSAoZGVwYXlsb2FkKTsKKyAgfQorCisgIHJldHVybiBOVUxMOworCisgIC8qIEVSUk9SUyAqLworZW1wdHlfcGFja2V0OgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwajJrZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIkVtcHR5IFBheWxvYWQuIiksIChOVUxMKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK3dyb25nX21oX2lkOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwajJrZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIkludmFsaWQgbWhfaWQgJXUsIGV4cGVjdGVkICV1IiwgbWhfaWQsIHJ0cGoya2RlcGF5LT5sYXN0X21oX2lkKSwKKyAgICAgICAgKE5VTEwpKTsKKyAgICBnc3RfcnRwX2oya19kZXBheV9jbGVhcl9wdSAocnRwajJrZGVwYXkpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2oya19kZXBheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9qMmtfZGVwYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2oya19kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RSdHBKMktEZXBheSAqcnRwajJrZGVwYXk7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBydHBqMmtkZXBheSA9IEdTVF9SVFBfSjJLX0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfcnRwX2oya19kZXBheV9yZXNldCAocnRwajJrZGVwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9ydHBfajJrX2RlcGF5X3Jlc2V0IChydHBqMmtkZXBheSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9qMmtfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBqMmtkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9KMktfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYzc0MzMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGoya2RlcGF5LmgKQEAgLTAsMCArMSw3MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0oyS19ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0oyS19ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0oyS19ERVBBWSBcCisgIChnc3RfcnRwX2oya19kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0oyS19ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9KMktfREVQQVksR3N0UnRwSjJLRGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX0oyS19ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSjJLX0RFUEFZLEdzdFJ0cEoyS0RlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0oyS19ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9KMktfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0oyS19ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSjJLX0RFUEFZKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBKMktEZXBheSBHc3RSdHBKMktEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBKMktEZXBheUNsYXNzIEdzdFJ0cEoyS0RlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwSjJLRGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7CisKKyAgZ3VpbnQ2NCBsYXN0X3J0cHRpbWU7CisgIGd1aW50IGxhc3RfbWhfaWQ7CisgIGd1aW50IGxhc3RfdGlsZTsKKworICBHc3RCdWZmZXIgKk1IWzhdOworCisgIGd1aW50IHB1X01IRjsKKyAgR3N0QWRhcHRlciAqcHVfYWRhcHRlcjsKKyAgR3N0QWRhcHRlciAqdF9hZGFwdGVyOworICBHc3RBZGFwdGVyICpmX2FkYXB0ZXI7CisKKyAgZ3VpbnQgbmV4dF9mcmFnOworICBnYm9vbGVhbiBoYXZlX3N5bmM7CisKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworfTsKKworc3RydWN0IF9Hc3RSdHBKMktEZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX2oya19kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfajJrX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1JUUF9KMktfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGoya3BheS5jIGIvZ3N0L3J0cC9nc3RydHBqMmtwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWM2YzAzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBqMmtwYXkuYwpAQCAtMCwwICsxLDU2OSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisgLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwajJrcGF5CisgKgorICogUGF5bG9hZCBlbmNvZGUgSlBFRyAyMDAwIGltYWdlcyBpbnRvIFJUUCBwYWNrZXRzIGFjY29yZGluZyB0byBSRkMgNTM3MQorICogYW5kIFJGQyA1MzcyLgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvcmZjNTM3MS8KKyAqIGFuZCBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9yZmM1MzcyLworICoKKyAqIFRoZSBwYXlsb2FkZXIgdGFrZXMgYSBKUEVHIDIwMDAgaW1hZ2UsIHNjYW5zIGl0IGZvciAicGFja2V0aXphdGlvbgorICogdW5pdHMiIGFuZCBjb25zdHJ1Y3RzIHRoZSBSVFAgcGFja2V0IGhlYWRlciBmb2xsb3dlZCBieSB0aGUgSlBFRyAyMDAwCisgKiBjb2Rlc3RyZWFtLiBBICJwYWNrZXRpemF0aW9uIHVuaXQiIGlzIGRlZmluZWQgYXMgZWl0aGVyIGEgSlBFRyAyMDAwIG1haW4gaGVhZGVyLAorICogYSBKUEVHIDIwMDAgdGlsZS1wYXJ0IGhlYWRlciwgb3IgYSBKUEVHIDIwMDAgcGFja2V0LgorICoKKyAqCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgImdzdHJ0cGoya2NvbW1vbi5oIgorI2luY2x1ZGUgImdzdHJ0cGoya3BheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2oya19wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJpbWFnZS94LWpwYywgIiBHU1RfUlRQX0oyS19TQU1QTElOR19MSVNUKQorICAgICk7CisKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfajJrX3BheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICIgIG1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICIgIHBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICIgIGNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIgorICAgICAgICBHU1RfUlRQX0oyS19TQU1QTElOR19MSVNUICIsIiAiICBlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJKUEVHMjAwMFwiIikKKyAgICApOworCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBqMmtwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cGoya3BheV9kZWJ1ZykKKworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MQVNUCit9OworCit0eXBlZGVmIHN0cnVjdAoreworICBndWludCB0cDoyOworICBndWludCBNSEY6MjsKKyAgZ3VpbnQgbWhfaWQ6MzsKKyAgZ3VpbnQgVDoxOworICBndWludCBwcmlvcml0eTo4OworICBndWludCB0aWxlOjE2OworICBndWludCBvZmZzZXQ6MjQ7Cit9IFJ0cEoyS0hlYWRlcjsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9qMmtfcGF5X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfajJrX3BheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2oya19wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfajJrX3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBhZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworCisjZGVmaW5lIGdzdF9ydHBfajJrX3BheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBKMktQYXksIGdzdF9ydHBfajJrX3BheSwgR1NUX1RZUEVfUlRQX0JBU0VfUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2oya19wYXlfY2xhc3NfaW5pdCAoR3N0UnRwSjJLUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX2oya19wYXlfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcnRwX2oya19wYXlfZ2V0X3Byb3BlcnR5OworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfajJrX3BheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2oya19wYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgSlBFRyAyMDAwIHBheWxvYWRlciIsICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBheWxvYWQtZW5jb2RlcyBKUEVHIDIwMDAgcGljdHVyZXMgaW50byBSVFAgcGFja2V0cyAoUkZDIDUzNzEpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfajJrX3BheV9zZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2J1ZmZlciA9IGdzdF9ydHBfajJrX3BheV9oYW5kbGVfYnVmZmVyOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBqMmtwYXlfZGVidWcsICJydHBqMmtwYXkiLCAwLAorICAgICAgIkpQRUcgMjAwMCBSVFAgUGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2oya19wYXlfaW5pdCAoR3N0UnRwSjJLUGF5ICogcGF5KQoreworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfajJrX3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpjYXBzX3N0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBnYm9vbGVhbiByZXM7CisgIGdpbnQgd2lkdGggPSAwLCBoZWlnaHQgPSAwOworICBjb25zdCBnY2hhciAqc2FtcGxpbmcgPSBOVUxMOworCisgIGdib29sZWFuIGhhc193aWR0aCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoY2Fwc19zdHJ1Y3R1cmUsICJ3aWR0aCIsICZ3aWR0aCk7CisgIGdib29sZWFuIGhhc19oZWlnaHQgPQorICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChjYXBzX3N0cnVjdHVyZSwgImhlaWdodCIsICZoZWlnaHQpOworCisKKyAgLyogc2FtcGxpbmcgaXMgYSByZXF1aXJlZCBmaWVsZCAqLworICBzYW1wbGluZyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoY2Fwc19zdHJ1Y3R1cmUsICJzYW1wbGluZyIpOworCisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChiYXNlcGF5bG9hZCwgInZpZGVvIiwgVFJVRSwgIkpQRUcyMDAwIiwKKyAgICAgIDkwMDAwKTsKKworICBpZiAoaGFzX3dpZHRoICYmIGhhc19oZWlnaHQpCisgICAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLAorICAgICAgICAic2FtcGxpbmciLCBHX1RZUEVfU1RSSU5HLCBzYW1wbGluZywgIndpZHRoIiwgR19UWVBFX0lOVCwgd2lkdGgsCisgICAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBoZWlnaHQsIE5VTEwpOworICBlbHNlCisgICAgcmVzID0KKyAgICAgICAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLCAic2FtcGxpbmciLAorICAgICAgICBHX1RZUEVfU1RSSU5HLCBzYW1wbGluZywgTlVMTCk7CisgIHJldHVybiByZXM7Cit9CisKKworc3RhdGljIGd1aW50Citnc3RfcnRwX2oya19wYXlfaGVhZGVyX3NpemUgKGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IG9mZnNldCkKK3sKKyAgcmV0dXJuIGRhdGFbb2Zmc2V0XSA8PCA4IHwgZGF0YVtvZmZzZXQgKyAxXTsKK30KKworCitzdGF0aWMgR3N0UnRwSjJLTWFya2VyCitnc3RfcnRwX2oya19wYXlfc2Nhbl9tYXJrZXIgKGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsIGd1aW50ICogb2Zmc2V0KQoreworICB3aGlsZSAoKGRhdGFbKCpvZmZzZXQpKytdICE9IEdTVF9KMktfTUFSS0VSKSAmJiAoKCpvZmZzZXQpIDwgc2l6ZSkpOworCisgIGlmIChHX1VOTElLRUxZICgoKm9mZnNldCkgPj0gc2l6ZSkpIHsKKyAgICByZXR1cm4gR1NUX0oyS19NQVJLRVJfRU9DOworICB9IGVsc2UgeworICAgIGd1aW50OCBtYXJrZXIgPSBkYXRhWygqb2Zmc2V0KSsrXTsKKyAgICByZXR1cm4gKEdzdFJ0cEoyS01hcmtlcikgbWFya2VyOworICB9Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIFJ0cEoyS0hlYWRlciBoZWFkZXI7CisgIGdib29sZWFuIG11bHRpX3RpbGU7CisgIGdib29sZWFuIGJpdHN0cmVhbTsKKyAgZ3VpbnQgbmV4dF9zb3Q7CisgIGdib29sZWFuIGZvcmNlX3BhY2tldDsKK30gUnRwSjJLU3RhdGU7CisKKworLyogTm90ZTogVGhlIHN0YW5kYXJkIHJlY29tbWVuZHMgdGhhdCBoZWFkZXJzIGJlIHB1dCBpbiB0aGVpciBvd24gUlRQIHBhY2tldHMsIHNvIHdlIGZvbGxvdworICogdGhpcyByZWNvbW1lbmRhdGlvbiBpbiB0aGUgY29kZS4gQWxzbywgdGhpcyBtZXRob2QgZ3JvdXBzIHRvZ2V0aGVyIGFsbCBKMksgcGFja2V0cworICogZm9yIGEgdGlsZSBwYXJ0IGFuZCB0cmVhdHMgdGhpcyBncm91cCBhcyBhIHBhY2tldGl6YXRpb24gdW5pdC4gQWNjb3JkaW5nIHRvIHRoZSBSRkMsCisgKiBvbmx5IGFuIGluZGl2aWR1YWwgSjJLIHBhY2tldCBpcyBjb25zaWRlcmVkIGEgcGFja2V0aXphdGlvbiB1bml0LgorICovCisKK3N0YXRpYyBndWludAorZmluZF9wdV9lbmQgKEdzdFJ0cEoyS1BheSAqIHBheSwgY29uc3QgZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgc2l6ZSwKKyAgICBndWludCBvZmZzZXQsIFJ0cEoyS1N0YXRlICogc3RhdGUpCit7CisgIGdib29sZWFuIGN1dF9zb3AgPSBGQUxTRTsKKyAgR3N0UnRwSjJLTWFya2VyIG1hcmtlcjsKKworICAvKiBwYXJzZSB0aGUgajJrIGhlYWRlciBmb3IgJ3N0YXJ0IG9mIGNvZGVzdHJlYW0nICovCisgIEdTVF9MT0dfT0JKRUNUIChwYXksICJjaGVja2luZyBmcm9tIG9mZnNldCAldSIsIG9mZnNldCk7CisgIHdoaWxlIChvZmZzZXQgPCBzaXplKSB7CisgICAgbWFya2VyID0gZ3N0X3J0cF9qMmtfcGF5X3NjYW5fbWFya2VyIChkYXRhLCBzaXplLCAmb2Zmc2V0KTsKKworICAgIGlmIChzdGF0ZS0+Yml0c3RyZWFtKSB7CisgICAgICAvKiBwYXJzaW5nIGJpdHN0cmVhbSwgb25seSBsb29rIGZvciBTT1AgKi8KKyAgICAgIHN3aXRjaCAobWFya2VyKSB7CisgICAgICAgIGNhc2UgR1NUX0oyS19NQVJLRVJfU09QOgorICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwYXksICJmb3VuZCBTT1AgYXQgJXUiLCBvZmZzZXQpOworICAgICAgICAgIGlmIChjdXRfc29wKQorICAgICAgICAgICAgcmV0dXJuIG9mZnNldCAtIDI7CisgICAgICAgICAgY3V0X3NvcCA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0oyS19NQVJLRVJfRVBIOgorICAgICAgICAgIC8qIGp1c3Qgc2tpcCBvdmVyIEVQSCAqLworICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwYXksICJmb3VuZCBFUEggYXQgJXUiLCBvZmZzZXQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGlmIChvZmZzZXQgPj0gc3RhdGUtPm5leHRfc290KSB7CisgICAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocGF5LCAicmVhY2hlZCBuZXh0IFNPVCBhdCAldSIsIG9mZnNldCk7CisgICAgICAgICAgICBzdGF0ZS0+Yml0c3RyZWFtID0gRkFMU0U7CisgICAgICAgICAgICBzdGF0ZS0+Zm9yY2VfcGFja2V0ID0gVFJVRTsKKyAgICAgICAgICAgIGlmIChtYXJrZXIgPT0gR1NUX0oyS19NQVJLRVJfRU9DICYmIHN0YXRlLT5uZXh0X3NvdCArIDIgPD0gc2l6ZSkKKyAgICAgICAgICAgICAgLyogaW5jbHVkZSBFT0MgYnV0IG5ldmVyIGdvIHBhc3QgdGhlIG1heCBzaXplICovCisgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS0+bmV4dF9zb3QgKyAyOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICByZXR1cm4gc3RhdGUtPm5leHRfc290OworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoIChtYXJrZXIpIHsKKyAgICAgICAgY2FzZSBHU1RfSjJLX01BUktFUl9TT0M6CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBheSwgImZvdW5kIFNPQyBhdCAldSIsIG9mZnNldCk7CisgICAgICAgICAgLyogc3RhcnQgb2ZmIGJ5IGFzc3VtaW5nIHRoYXQgd2Ugd2lsbCBmaXQgdGhlIGVudGlyZSBoZWFkZXIKKyAgICAgICAgICAgICBpbnRvIHRoZSBSVFAgcGF5bG9hZCAqLworICAgICAgICAgIHN0YXRlLT5oZWFkZXIuTUhGID0gMzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfSjJLX01BUktFUl9TT1Q6CisgICAgICAgIHsKKyAgICAgICAgICBndWludCBsZW4sIFBzb3QsIHRpbGU7CisKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocGF5LCAiZm91bmQgU09UIGF0ICV1Iiwgb2Zmc2V0KTsKKyAgICAgICAgICAvKiBTT1QgZm9yIGZpcnN0IHRpbGUgcGFydCBpbiBjb2RlIHN0cmVhbToKKyAgICAgICAgICAgICBmb3JjZSBjbG9zZSBvZiBjdXJyZW50IFJUUCBwYWNrZXQsIHNvIHRoYXQgaXQKKyAgICAgICAgICAgICBvbmx5IGNvbnRhaW5zIG1haW4gaGVhZGVyICAqLworICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZGVyLk1IRikgeworICAgICAgICAgICAgc3RhdGUtPmZvcmNlX3BhY2tldCA9IFRSVUU7CisgICAgICAgICAgICByZXR1cm4gb2Zmc2V0IC0gMjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBwYXJzZSBTT1QgYnV0IGRvIHNvbWUgc2FuaXR5IGNoZWNrcyBmaXJzdCAqLworICAgICAgICAgIGxlbiA9IGdzdF9ydHBfajJrX3BheV9oZWFkZXJfc2l6ZSAoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocGF5LCAiU09UIGxlbmd0aCAldSIsIGxlbik7CisgICAgICAgICAgaWYgKGxlbiA8IDgpCisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgICBpZiAob2Zmc2V0ICsgbGVuID49IHNpemUpCisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKworICAgICAgICAgIC8qIElzb3QgKi8KKyAgICAgICAgICB0aWxlID0gR1NUX1JFQURfVUlOVDE2X0JFICgmZGF0YVtvZmZzZXQgKyAyXSk7CisKKyAgICAgICAgICBpZiAoIXN0YXRlLT5tdWx0aV90aWxlKSB7CisgICAgICAgICAgICAvKiB3ZSBoYXZlIGRldGVjdGVkIG11bHRpcGxlIHRpbGVzIGluIHRoaXMgcnRwIHBhY2tldCA6IHRpbGUgYml0IGlzIG5vdyBpbnZhbGlkICovCisgICAgICAgICAgICBpZiAoc3RhdGUtPmhlYWRlci5UID09IDAgJiYgc3RhdGUtPmhlYWRlci50aWxlICE9IHRpbGUpIHsKKyAgICAgICAgICAgICAgc3RhdGUtPmhlYWRlci5UID0gMTsKKyAgICAgICAgICAgICAgc3RhdGUtPm11bHRpX3RpbGUgPSBUUlVFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3RhdGUtPmhlYWRlci5UID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgc3RhdGUtPmhlYWRlci50aWxlID0gdGlsZTsKKworICAgICAgICAgIC8qIE5vdGU6IFRpbGUgcGFydHMgZnJvbSBtdWx0aXBsZSB0aWxlcyBpbiBzaW5nbGUgUlRQIHBhY2tldCAKKyAgICAgICAgICAgICB3aWxsIG1ha2UgVCBpbnZhbGlkLgorICAgICAgICAgICAgIFRoaXMgY2Fubm90IGhhcHBlbiBpbiBvdXIgY2FzZSBzaW5jZSB3ZSBhbHdheXMKKyAgICAgICAgICAgICBzZW5kIHRpbGUgaGVhZGVycyBpbiB0aGVpciBvd24gUlRQIHBhY2tldHMsIHNvIHdlIGNhbm5vdCBtaXgKKyAgICAgICAgICAgICB0aWxlIHBhcnRzIGluIGEgc2luZ2xlIFJUUCBwYWNrZXQgICovCisKKyAgICAgICAgICAvKiBQc290OiBvZmZzZXQgb2YgbmV4dCB0aWxlLiBJZiBpdCdzIDAsIG5leHQgdGlsZSBnb2VzIGFsbCB0aGUgd2F5CisgICAgICAgICAgICAgdG8gdGhlIGVuZCBvZiB0aGUgZGF0YSAqLworICAgICAgICAgIFBzb3QgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKCZkYXRhW29mZnNldCArIDRdKTsKKyAgICAgICAgICBpZiAoUHNvdCA9PSAwKQorICAgICAgICAgICAgc3RhdGUtPm5leHRfc290ID0gc2l6ZTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzdGF0ZS0+bmV4dF9zb3QgPSBvZmZzZXQgLSAyICsgUHNvdDsKKworICAgICAgICAgIG9mZnNldCArPSBsZW47CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBheSwgIklzb3QgJXUsIFBzb3QgJXUsIG5leHQgJXUiLCBzdGF0ZS0+aGVhZGVyLnRpbGUsCisgICAgICAgICAgICAgIFBzb3QsIHN0YXRlLT5uZXh0X3NvdCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBHU1RfSjJLX01BUktFUl9TT0Q6CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBheSwgImZvdW5kIFNPRCBhdCAldSIsIG9mZnNldCk7CisgICAgICAgICAgLyogZ28gdG8gYml0c3RyZWFtIHBhcnNpbmcgKi8KKyAgICAgICAgICBzdGF0ZS0+Yml0c3RyZWFtID0gVFJVRTsKKyAgICAgICAgICAvKiBjdXQgYXQgdGhlIG5leHQgU09QIG9yIGVsc2UgaW5jbHVkZSBhbGwgZGF0YSAqLworICAgICAgICAgIGN1dF9zb3AgPSBUUlVFOworICAgICAgICAgIC8qIGZvcmNlIGEgbmV3IHBhY2tldCB3aGVuIHdlIHNlZSBTT1AsIHRoaXMgY2FuIGJlIG9wdGlvbmFsIGJ1dCB0aGUKKyAgICAgICAgICAgKiBzcGVjIHJlY29tbWVuZHMgcGFja2luZyBoZWFkZXJzIHNlcGFyYXRlbHkgKi8KKyAgICAgICAgICBzdGF0ZS0+Zm9yY2VfcGFja2V0ID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfSjJLX01BUktFUl9FT0M6CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBheSwgImZvdW5kIEVPQyBhdCAldSIsIG9mZnNldCk7CisgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgIGd1aW50IGxlbiA9IGdzdF9ydHBfajJrX3BheV9oZWFkZXJfc2l6ZSAoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocGF5LCAic2tpcCAweCUwMnggbGVuICV1IiwgbWFya2VyLCBsZW4pOworICAgICAgICAgIG9mZnNldCArPSBsZW47CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgR1NUX0RFQlVHX09CSkVDVCAocGF5LCAicmVhY2hlZCBlbmQgb2YgZGF0YSIpOworICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfajJrX3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UnRwSjJLUGF5ICpwYXk7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgIFJ0cEoyS1N0YXRlIHN0YXRlOworICBHc3RCdWZmZXJMaXN0ICpsaXN0ID0gTlVMTDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50IG10dSwgbWF4X3NpemU7CisgIGd1aW50IG9mZnNldDsKKyAgZ3VpbnQgZW5kLCBwb3M7CisKKyAgcGF5ID0gR1NUX1JUUF9KMktfUEFZIChiYXNlcGF5bG9hZCk7CisgIG10dSA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEX01UVSAocGF5KTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKTsKKyAgb2Zmc2V0ID0gcG9zID0gZW5kID0gMDsKKworICBHU1RfTE9HX09CSkVDVCAocGF5LAorICAgICAgImdvdCBidWZmZXIgc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCAiLCB0aW1lc3RhbXAgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgbWFwLnNpemUsIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIC8qIGRvIHNvbWUgaGVhZGVyIGRlZmF1bHRzIGZpcnN0ICovCisgIHN0YXRlLmhlYWRlci50cCA9IDA7ICAgICAgICAgIC8qIG9ubHkgcHJvZ3Jlc3NpdmUgc2NhbiAqLworICBzdGF0ZS5oZWFkZXIuTUhGID0gMDsgICAgICAgICAvKiBubyBoZWFkZXIgKi8KKyAgc3RhdGUuaGVhZGVyLm1oX2lkID0gMDsgICAgICAgLyogYWx3YXlzIDAgZm9yIG5vdyAqLworICBzdGF0ZS5oZWFkZXIuVCA9IDE7ICAgICAgICAgICAvKiBpbnZhbGlkIHRpbGUsIGJlY2F1c2Ugd2UgYWx3YXlzIGJlZ2luIHdpdGggdGhlIG1haW4gaGVhZGVyICovCisgIHN0YXRlLmhlYWRlci5wcmlvcml0eSA9IDI1NTsgIC8qIGFsd2F5cyAyNTUgZm9yIG5vdyAqLworICBzdGF0ZS5oZWFkZXIudGlsZSA9IDB4ZmZmZjsgICAvKiBubyB0aWxlIG51bWJlciAqLworICBzdGF0ZS5oZWFkZXIub2Zmc2V0ID0gMDsgICAgICAvKiBvZmZzZXQgb2YgMCAqLworICBzdGF0ZS5tdWx0aV90aWxlID0gRkFMU0U7CisgIHN0YXRlLmJpdHN0cmVhbSA9IEZBTFNFOworICBzdGF0ZS5uZXh0X3NvdCA9IDA7CisgIHN0YXRlLmZvcmNlX3BhY2tldCA9IEZBTFNFOworCisgIC8qIGdldCBtYXggcGFja2V0IGxlbmd0aCAqLworICBtYXhfc2l6ZSA9CisgICAgICBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BheWxvYWRfbGVuIChtdHUgLSBHU1RfUlRQX0oyS19IRUFERVJfU0laRSwgMCwgMCk7CisKKyAgbGlzdCA9IGdzdF9idWZmZXJfbGlzdF9uZXdfc2l6ZWQgKChtdHUgLyBtYXhfc2l6ZSkgKyAxKTsKKworICBkbyB7CisgICAgR3N0QnVmZmVyICpvdXRidWY7CisgICAgZ3VpbnQ4ICpoZWFkZXI7CisgICAgZ3VpbnQgcGF5bG9hZF9zaXplOworICAgIGd1aW50IHB1X3NpemU7CisgICAgR3N0UlRQQnVmZmVyIHJ0cCA9IHsgTlVMTCB9OworCisgICAgLyogdHJ5IHRvIHBhY2sgYXMgbXVjaCBhcyB3ZSBjYW4gKi8KKyAgICBkbyB7CisgICAgICAvKiBzZWUgaG93IG11Y2ggd2UgaGF2ZSBzY2FubmVkIGFscmVhZHkgKi8KKyAgICAgIHB1X3NpemUgPSBlbmQgLSBvZmZzZXQ7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXksICJzY2FubmVkIHB1IHNpemUgJXUiLCBwdV9zaXplKTsKKworICAgICAgLyogd2UgbmVlZCB0byBtYWtlIGEgbmV3IHBhY2tldCAqLworICAgICAgaWYgKHN0YXRlLmZvcmNlX3BhY2tldCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXksICJuZWVkIHRvIGZvcmNlIGEgbmV3IHBhY2tldCIpOworICAgICAgICBzdGF0ZS5mb3JjZV9wYWNrZXQgPSBGQUxTRTsKKyAgICAgICAgcG9zID0gZW5kOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLyogZWxzZSBzZWUgaWYgd2UgaGF2ZSBlbm91Z2ggKi8KKyAgICAgIGlmIChwdV9zaXplID4gbWF4X3NpemUpIHsKKyAgICAgICAgaWYgKHBvcyAhPSBvZmZzZXQpCisgICAgICAgICAgLyogdGhlIHBhY2tldCBiZWNhbWUgdG9vIGxhcmdlLCB1c2UgcHJldmlvdXMgc2NhbnBvcyAqLworICAgICAgICAgIHB1X3NpemUgPSBwb3MgLSBvZmZzZXQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAvKiB0aGUgYWxyZWFkeSBzY2FubmVkIGRhdGEgd2FzIGFscmVhZHkgdG9vIGJpZywgbWFrZSBzdXJlIHdlIHN0YXJ0CisgICAgICAgICAgICogc2Nhbm5pbmcgZnJvbSB0aGUgbGFzdCBzZWFyY2hlZCBwb3NpdGlvbiAqLworICAgICAgICAgIHBvcyA9IGVuZDsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXksICJtYXggc2l6ZSBleGNlZWRlZCBwdV9zaXplICV1IiwgcHVfc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBwb3MgPSBlbmQ7CisKKyAgICAgIC8qIGV4aXQgd2hlbiBmaW5pc2hlZCAqLworICAgICAgaWYgKHBvcyA9PSBtYXAuc2l6ZSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIHNjYW4gbmV4dCBwYWNrZXRpemF0aW9uIHVuaXQgYW5kIGZpbGwgaW4gdGhlIGhlYWRlciAqLworICAgICAgZW5kID0gZmluZF9wdV9lbmQgKHBheSwgbWFwLmRhdGEsIG1hcC5zaXplLCBwb3MsICZzdGF0ZSk7CisgICAgfSB3aGlsZSAoVFJVRSk7CisKKyAgICB3aGlsZSAocHVfc2l6ZSA+IDApIHsKKyAgICAgIGd1aW50IHBhY2tldF9zaXplLCBkYXRhX3NpemU7CisgICAgICBHc3RCdWZmZXIgKnBheWJ1ZjsKKworICAgICAgLyogY2FsY3VsYXRlIHRoZSBwYWNrZXQgc2l6ZSAqLworICAgICAgcGFja2V0X3NpemUgPQorICAgICAgICAgIGdzdF9ydHBfYnVmZmVyX2NhbGNfcGFja2V0X2xlbiAocHVfc2l6ZSArIEdTVF9SVFBfSjJLX0hFQURFUl9TSVpFLCAwLAorICAgICAgICAgIDApOworCisgICAgICBpZiAocGFja2V0X3NpemUgPiBtdHUpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGF5LCAibmVlZGVkIHBhY2tldCBzaXplICV1IGNsYW1wZWQgdG8gTVRVICV1IiwKKyAgICAgICAgICAgIHBhY2tldF9zaXplLCBtdHUpOworICAgICAgICBwYWNrZXRfc2l6ZSA9IG10dTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheSwgIm5lZWRlZCBwYWNrZXQgc2l6ZSAldSBmaXRzIGluIE1UVSAldSIsCisgICAgICAgICAgICBwYWNrZXRfc2l6ZSwgbXR1KTsKKyAgICAgIH0KKworICAgICAgLyogZ2V0IHRvdGFsIHBheWxvYWQgc2l6ZSBhbmQgZGF0YSBzaXplICovCisgICAgICBwYXlsb2FkX3NpemUgPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BheWxvYWRfbGVuIChwYWNrZXRfc2l6ZSwgMCwgMCk7CisgICAgICBkYXRhX3NpemUgPSBwYXlsb2FkX3NpemUgLSBHU1RfUlRQX0oyS19IRUFERVJfU0laRTsKKworICAgICAgLyogbWFrZSBidWZmZXIgZm9yIGhlYWRlciAqLworICAgICAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChHU1RfUlRQX0oyS19IRUFERVJfU0laRSwgMCwgMCk7CisKKyAgICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gdGltZXN0YW1wOworCisgICAgICBnc3RfcnRwX2J1ZmZlcl9tYXAgKG91dGJ1ZiwgR1NUX01BUF9XUklURSwgJnJ0cCk7CisKKyAgICAgIC8qIGdldCBwb2ludGVyIHRvIGhlYWRlciAqLworICAgICAgaGVhZGVyID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHApOworCisgICAgICBwdV9zaXplIC09IGRhdGFfc2l6ZTsKKworICAgICAgLyogcmVhY2hlZCB0aGUgZW5kIG9mIGEgcGFja2V0aXphdGlvbiB1bml0ICovCisgICAgICBpZiAocHVfc2l6ZSA9PSAwICYmIGVuZCA+PSBtYXAuc2l6ZSkgeworICAgICAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBUUlVFKTsKKyAgICAgIH0KKyAgICAgIC8qIElmIHdlIHdlcmUgcHJvY2Vzc2luZyBhIGhlYWRlciwgc2VlIGlmIGFsbCBmaXRzIGluIG9uZSBSVFAgcGFja2V0CisgICAgICAgICBvciBpZiB3ZSBoYXZlIHRvIGZyYWdtZW50IGl0ICovCisgICAgICBpZiAoc3RhdGUuaGVhZGVyLk1IRikgeworICAgICAgICBzd2l0Y2ggKHN0YXRlLmhlYWRlci5NSEYpIHsKKyAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBpZiAocHVfc2l6ZSA+IDApCisgICAgICAgICAgICAgIHN0YXRlLmhlYWRlci5NSEYgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgaWYgKHB1X3NpemUgPT0gMCkKKyAgICAgICAgICAgICAgc3RhdGUuaGVhZGVyLk1IRiA9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyoKKyAgICAgICAqIFJ0cEoyS0hlYWRlcjoKKyAgICAgICAqIEB0cDogdHlwZSAoMCBwcm9ncmVzc2l2ZSwgMSBvZGQgZmllbGQsIDIgZXZlbiBmaWVsZCkKKyAgICAgICAqIEBNSEY6IE1haW4gSGVhZGVyIEZsYWcKKyAgICAgICAqIEBtaF9pZDogTWFpbiBIZWFkZXIgSWRlbnRpZmljYXRpb24KKyAgICAgICAqIEBUOiBUaWxlIGZpZWxkIGludmFsaWRhdGlvbiBmbGFnCisgICAgICAgKiBAcHJpb3JpdHk6IHByaW9yaXR5CisgICAgICAgKiBAdGlsZSBudW1iZXI6IHRoZSB0aWxlIG51bWJlciBvZiB0aGUgcGF5bG9hZAorICAgICAgICogQHJlc2VydmVkOiBzZXQgdG8gMAorICAgICAgICogQGZyYWdtZW50IG9mZnNldDogdGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IHBheWxvYWQKKyAgICAgICAqCisgICAgICAgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAqIHx0cCB8TUhGfG1oX2lkfFR8ICAgICBwcmlvcml0eSAgfCAgICAgICAgICAgdGlsZSBudW1iZXIgICAgICAgICB8CisgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICogfHJlc2VydmVkICAgICAgIHwgICAgICAgICAgICAgZnJhZ21lbnQgb2Zmc2V0ICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKi8KKyAgICAgIGhlYWRlclswXSA9IChzdGF0ZS5oZWFkZXIudHAgPDwgNikgfCAoc3RhdGUuaGVhZGVyLk1IRiA8PCA0KSB8CisgICAgICAgICAgKHN0YXRlLmhlYWRlci5taF9pZCA8PCAxKSB8IHN0YXRlLmhlYWRlci5UOworICAgICAgaGVhZGVyWzFdID0gc3RhdGUuaGVhZGVyLnByaW9yaXR5OworICAgICAgaGVhZGVyWzJdID0gc3RhdGUuaGVhZGVyLnRpbGUgPj4gODsKKyAgICAgIGhlYWRlclszXSA9IHN0YXRlLmhlYWRlci50aWxlICYgMHhmZjsKKyAgICAgIGhlYWRlcls0XSA9IDA7CisgICAgICBoZWFkZXJbNV0gPSBzdGF0ZS5oZWFkZXIub2Zmc2V0ID4+IDE2OworICAgICAgaGVhZGVyWzZdID0gKHN0YXRlLmhlYWRlci5vZmZzZXQgPj4gOCkgJiAweGZmOworICAgICAgaGVhZGVyWzddID0gc3RhdGUuaGVhZGVyLm9mZnNldCAmIDB4ZmY7CisKKyAgICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICAgICAgLyogbWFrZSBzdWJidWZmZXIgb2YgajJrIGRhdGEgKi8KKyAgICAgIHBheWJ1ZiA9IGdzdF9idWZmZXJfY29weV9yZWdpb24gKGJ1ZmZlciwgR1NUX0JVRkZFUl9DT1BZX0FMTCwKKyAgICAgICAgICBvZmZzZXQsIGRhdGFfc2l6ZSk7CisgICAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAoYmFzZXBheWxvYWQsIG91dGJ1ZiwgcGF5YnVmKTsKKyAgICAgIG91dGJ1ZiA9IGdzdF9idWZmZXJfYXBwZW5kIChvdXRidWYsIHBheWJ1Zik7CisKKyAgICAgIGdzdF9idWZmZXJfbGlzdF9hZGQgKGxpc3QsIG91dGJ1Zik7CisKKyAgICAgIC8qIHJlc2V0IG11bHRpX3RpbGUgKi8KKyAgICAgIHN0YXRlLm11bHRpX3RpbGUgPSBGQUxTRTsKKworCisgICAgICAvKiBzZXQgTUhGIHRvIHplcm8gaWYgdGhlcmUgaXMgbm8gbW9yZSBtYWluIGhlYWRlciB0byBwcm9jZXNzICovCisgICAgICBpZiAoc3RhdGUuaGVhZGVyLk1IRiAmIDIpCisgICAgICAgIHN0YXRlLmhlYWRlci5NSEYgPSAwOworCisgICAgICAvKiB0aWxlIGlzIHZhbGlkLCBpZiB0aGVyZSBpcyBubyBtb3JlIGhlYWRlciB0byBwcm9jZXNzICovCisgICAgICBpZiAoIXN0YXRlLmhlYWRlci5NSEYpCisgICAgICAgIHN0YXRlLmhlYWRlci5UID0gMDsKKworCisgICAgICBvZmZzZXQgKz0gZGF0YV9zaXplOworICAgICAgc3RhdGUuaGVhZGVyLm9mZnNldCA9IG9mZnNldDsKKyAgICB9CisgICAgb2Zmc2V0ID0gcG9zOworICB9IHdoaWxlIChvZmZzZXQgPCBtYXAuc2l6ZSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICAvKiBwdXNoIHRoZSB3aG9sZSBidWZmZXIgbGlzdCBhdCBvbmNlICovCisgIHJldCA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2hfbGlzdCAoYmFzZXBheWxvYWQsIGxpc3QpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2oya19wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfajJrX3BheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3J0cF9qMmtfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwajJrcGF5IiwgR1NUX1JBTktfU0VDT05EQVJZLAorICAgICAgR1NUX1RZUEVfUlRQX0oyS19QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBqMmtwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwajJrcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRmNTI5NQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwajJrcGF5LmgKQEAgLTAsMCArMSw1OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9KMktfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfSjJLX1BBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0oyS19QQVkgXAorICAoZ3N0X3J0cF9qMmtfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfSjJLX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9KMktfUEFZLEdzdFJ0cEoyS1BheSkpCisjZGVmaW5lIEdTVF9SVFBfSjJLX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSjJLX1BBWSxHc3RSdHBKMktQYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfSjJLX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9KMktfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9KMktfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9KMktfUEFZKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBKMktQYXkgR3N0UnRwSjJLUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEoyS1BheUNsYXNzIEdzdFJ0cEoyS1BheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cEoyS1BheQoreworICBHc3RSVFBCYXNlUGF5bG9hZCBwYXlsb2FkOworCisgIGdpbnQgaGVpZ2h0OworICBnaW50IHdpZHRoOworfTsKKworc3RydWN0IF9Hc3RSdHBKMktQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfajJrX3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfajJrX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9SVFBfSjJLX1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Mjc0ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jCkBAIC0wLDAgKzEsNzk5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDg+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0cnRwanBlZ2RlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwanBlZ2RlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBqcGVnZGVwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2pwZWdfZGVwYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJpbWFnZS9qcGVnIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9qcGVnX2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJKUEVHXCI7ICIKKyAgICAgICAgLyogb3B0aW9uYWwgU0RQIGF0dHJpYnV0ZXMgKi8KKyAgICAgICAgLyoKKyAgICAgICAgICogImEtZnJhbWVyYXRlID0gKHN0cmluZykgMC4wMCwgIgorICAgICAgICAgKiAieC1mcmFtZXJhdGUgPSAoc3RyaW5nKSAwLjAwLCAiCisgICAgICAgICAqICJ4LWRpbWVuc2lvbnMgPSAoc3RyaW5nKSBcIjEyMzQsMTIzNFwiLCAiCisgICAgICAgICAqLworICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfSlBFR19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwIgorICAgICAgICAvKiBvcHRpb25hbCBTRFAgYXR0cmlidXRlcyAqLworICAgICAgICAvKgorICAgICAgICAgKiAiYS1mcmFtZXJhdGUgPSAoc3RyaW5nKSAwLjAwLCAiCisgICAgICAgICAqICJ4LWZyYW1lcmF0ZSA9IChzdHJpbmcpIDAuMDAsICIKKyAgICAgICAgICogIngtZGltZW5zaW9ucyA9IChzdHJpbmcpIFwiMTIzNCwxMjM0XCIiCisgICAgICAgICAqLworICAgICkKKyAgICApOworCisjZGVmaW5lIGdzdF9ydHBfanBlZ19kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBKUEVHRGVwYXksIGdzdF9ydHBfanBlZ19kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2pwZWdfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9qcGVnX2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2pwZWdfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX2pwZWdfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9qcGVnX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEpQRUdEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfanBlZ19kZXBheV9maW5hbGl6ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2pwZWdfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9qcGVnX2RlcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIEpQRUcgZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIEpQRUcgdmlkZW8gZnJvbSBSVFAgcGFja2V0cyAoUkZDIDI0MzUpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfanBlZ19kZXBheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2pwZWdfZGVwYXlfc2V0Y2FwczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+cHJvY2Vzc19ydHBfcGFja2V0ID0gZ3N0X3J0cF9qcGVnX2RlcGF5X3Byb2Nlc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGpwZWdkZXBheV9kZWJ1ZywgInJ0cGpwZWdkZXBheSIsIDAsCisgICAgICAiSlBFRyBWaWRlbyBSVFAgRGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfanBlZ19kZXBheV9pbml0IChHc3RSdHBKUEVHRGVwYXkgKiBydHBqcGVnZGVwYXkpCit7CisgIHJ0cGpwZWdkZXBheS0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfanBlZ19kZXBheV9yZXNldCAoR3N0UnRwSlBFR0RlcGF5ICogZGVwYXkpCit7CisgIGdpbnQgaTsKKworICBkZXBheS0+d2lkdGggPSAwOworICBkZXBheS0+aGVpZ2h0ID0gMDsKKyAgZGVwYXktPm1lZGlhX3dpZHRoID0gMDsKKyAgZGVwYXktPm1lZGlhX2hlaWdodCA9IDA7CisgIGRlcGF5LT5mcmF0ZV9udW0gPSAwOworICBkZXBheS0+ZnJhdGVfZGVub20gPSAxOworICBkZXBheS0+ZGlzY29udCA9IFRSVUU7CisKKyAgZm9yIChpID0gMDsgaSA8IDI1NTsgaSsrKSB7CisgICAgZ19mcmVlIChkZXBheS0+cXRhYmxlc1tpXSk7CisgICAgZGVwYXktPnF0YWJsZXNbaV0gPSBOVUxMOworICB9CisKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGRlcGF5LT5hZGFwdGVyKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfanBlZ19kZXBheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwSlBFR0RlcGF5ICpydHBqcGVnZGVwYXk7CisKKyAgcnRwanBlZ2RlcGF5ID0gR1NUX1JUUF9KUEVHX0RFUEFZIChvYmplY3QpOworCisgIGdzdF9ydHBfanBlZ19kZXBheV9yZXNldCAocnRwanBlZ2RlcGF5KTsKKworICBnX29iamVjdF91bnJlZiAocnRwanBlZ2RlcGF5LT5hZGFwdGVyKTsKKyAgcnRwanBlZ2RlcGF5LT5hZGFwdGVyID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQgemlnemFnW10gPSB7CisgIDAsIDEsIDgsIDE2LCA5LCAyLCAzLCAxMCwKKyAgMTcsIDI0LCAzMiwgMjUsIDE4LCAxMSwgNCwgNSwKKyAgMTIsIDE5LCAyNiwgMzMsIDQwLCA0OCwgNDEsIDM0LAorICAyNywgMjAsIDEzLCA2LCA3LCAxNCwgMjEsIDI4LAorICAzNSwgNDIsIDQ5LCA1NiwgNTcsIDUwLCA0MywgMzYsCisgIDI5LCAyMiwgMTUsIDIzLCAzMCwgMzcsIDQ0LCA1MSwKKyAgNTgsIDU5LCA1MiwgNDUsIDM4LCAzMSwgMzksIDQ2LAorICA1MywgNjAsIDYxLCA1NCwgNDcsIDU1LCA2MiwgNjMKK307CisKKy8qCisgKiBUYWJsZSBLLjEgZnJvbSBKUEVHIHNwZWMuCisgKi8KK3N0YXRpYyBjb25zdCBpbnQganBlZ19sdW1hX3F1YW50aXplcls2NF0gPSB7CisgIDE2LCAxMSwgMTAsIDE2LCAyNCwgNDAsIDUxLCA2MSwKKyAgMTIsIDEyLCAxNCwgMTksIDI2LCA1OCwgNjAsIDU1LAorICAxNCwgMTMsIDE2LCAyNCwgNDAsIDU3LCA2OSwgNTYsCisgIDE0LCAxNywgMjIsIDI5LCA1MSwgODcsIDgwLCA2MiwKKyAgMTgsIDIyLCAzNywgNTYsIDY4LCAxMDksIDEwMywgNzcsCisgIDI0LCAzNSwgNTUsIDY0LCA4MSwgMTA0LCAxMTMsIDkyLAorICA0OSwgNjQsIDc4LCA4NywgMTAzLCAxMjEsIDEyMCwgMTAxLAorICA3MiwgOTIsIDk1LCA5OCwgMTEyLCAxMDAsIDEwMywgOTkKK307CisKKy8qCisgKiBUYWJsZSBLLjIgZnJvbSBKUEVHIHNwZWMuCisgKi8KK3N0YXRpYyBjb25zdCBpbnQganBlZ19jaHJvbWFfcXVhbnRpemVyWzY0XSA9IHsKKyAgMTcsIDE4LCAyNCwgNDcsIDk5LCA5OSwgOTksIDk5LAorICAxOCwgMjEsIDI2LCA2NiwgOTksIDk5LCA5OSwgOTksCisgIDI0LCAyNiwgNTYsIDk5LCA5OSwgOTksIDk5LCA5OSwKKyAgNDcsIDY2LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LAorICA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksCisgIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwKKyAgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LAorICA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTkKK307CisKKy8qIENhbGwgTWFrZVRhYmxlcyB3aXRoIHRoZSBRIGZhY3RvciBhbmQgYSBndWludDhbMTI4XSByZXR1cm4gYXJyYXkKKyAqLworc3RhdGljIHZvaWQKK01ha2VUYWJsZXMgKEdzdFJ0cEpQRUdEZXBheSAqIHJ0cGpwZWdkZXBheSwgZ2ludCBRLCBndWludDggcXRhYmxlWzEyOF0pCit7CisgIGdpbnQgaTsKKyAgZ3VpbnQgZmFjdG9yOworCisgIGZhY3RvciA9IENMQU1QIChRLCAxLCA5OSk7CisKKyAgaWYgKFEgPCA1MCkKKyAgICBRID0gNTAwMCAvIGZhY3RvcjsKKyAgZWxzZQorICAgIFEgPSAyMDAgLSBmYWN0b3IgKiAyOworCisgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgZ2ludCBscSA9IChqcGVnX2x1bWFfcXVhbnRpemVyW3ppZ3phZ1tpXV0gKiBRICsgNTApIC8gMTAwOworICAgIGdpbnQgY3EgPSAoanBlZ19jaHJvbWFfcXVhbnRpemVyW3ppZ3phZ1tpXV0gKiBRICsgNTApIC8gMTAwOworCisgICAgLyogTGltaXQgdGhlIHF1YW50aXplcnMgdG8gMSA8PSBxIDw9IDI1NSAqLworICAgIHF0YWJsZVtpXSA9IENMQU1QIChscSwgMSwgMjU1KTsKKyAgICBxdGFibGVbaSArIDY0XSA9IENMQU1QIChjcSwgMSwgMjU1KTsKKyAgfQorfQorCitzdGF0aWMgY29uc3QgZ3VpbnQ4IGx1bV9kY19jb2RlbGVuc1tdID0geworICAwLCAxLCA1LCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwCit9OworCitzdGF0aWMgY29uc3QgZ3VpbnQ4IGx1bV9kY19zeW1ib2xzW10gPSB7CisgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMQorfTsKKworc3RhdGljIGNvbnN0IGd1aW50OCBsdW1fYWNfY29kZWxlbnNbXSA9IHsKKyAgMCwgMiwgMSwgMywgMywgMiwgNCwgMywgNSwgNSwgNCwgNCwgMCwgMCwgMSwgMHg3ZAorfTsKKworc3RhdGljIGNvbnN0IGd1aW50OCBsdW1fYWNfc3ltYm9sc1tdID0geworICAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLAorICAweDIxLCAweDMxLCAweDQxLCAweDA2LCAweDEzLCAweDUxLCAweDYxLCAweDA3LAorICAweDIyLCAweDcxLCAweDE0LCAweDMyLCAweDgxLCAweDkxLCAweGExLCAweDA4LAorICAweDIzLCAweDQyLCAweGIxLCAweGMxLCAweDE1LCAweDUyLCAweGQxLCAweGYwLAorICAweDI0LCAweDMzLCAweDYyLCAweDcyLCAweDgyLCAweDA5LCAweDBhLCAweDE2LAorICAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDI1LCAweDI2LCAweDI3LCAweDI4LAorICAweDI5LCAweDJhLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LAorICAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LAorICAweDRhLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LAorICAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LAorICAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LAorICAweDdhLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LAorICAweDhhLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LAorICAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LAorICAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LAorICAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LAorICAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLCAweGQyLCAweGQzLCAweGQ0LAorICAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLCAweGUxLCAweGUyLAorICAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLAorICAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LAorICAweGY5LCAweGZhCit9OworCitzdGF0aWMgY29uc3QgZ3VpbnQ4IGNobV9kY19jb2RlbGVuc1tdID0geworICAwLCAzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwCit9OworCitzdGF0aWMgY29uc3QgZ3VpbnQ4IGNobV9kY19zeW1ib2xzW10gPSB7CisgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMQorfTsKKworc3RhdGljIGNvbnN0IGd1aW50OCBjaG1fYWNfY29kZWxlbnNbXSA9IHsKKyAgMCwgMiwgMSwgMiwgNCwgNCwgMywgNCwgNywgNSwgNCwgNCwgMCwgMSwgMiwgMHg3NworfTsKKworc3RhdGljIGNvbnN0IGd1aW50OCBjaG1fYWNfc3ltYm9sc1tdID0geworICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDExLCAweDA0LCAweDA1LCAweDIxLAorICAweDMxLCAweDA2LCAweDEyLCAweDQxLCAweDUxLCAweDA3LCAweDYxLCAweDcxLAorICAweDEzLCAweDIyLCAweDMyLCAweDgxLCAweDA4LCAweDE0LCAweDQyLCAweDkxLAorICAweGExLCAweGIxLCAweGMxLCAweDA5LCAweDIzLCAweDMzLCAweDUyLCAweGYwLAorICAweDE1LCAweDYyLCAweDcyLCAweGQxLCAweDBhLCAweDE2LCAweDI0LCAweDM0LAorICAweGUxLCAweDI1LCAweGYxLCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDI2LAorICAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDM1LCAweDM2LCAweDM3LCAweDM4LAorICAweDM5LCAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LAorICAweDQ5LCAweDRhLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LAorICAweDU5LCAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LAorICAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LAorICAweDc5LCAweDdhLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LAorICAweDg4LCAweDg5LCAweDhhLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LAorICAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LCAweGE1LAorICAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LAorICAweGI1LCAweGI2LCAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLAorICAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLCAweGQyLAorICAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLAorICAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LAorICAweGVhLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LAorICAweGY5LCAweGZhCit9OworCitzdGF0aWMgZ3VpbnQ4ICoKK01ha2VRdWFudEhlYWRlciAoZ3VpbnQ4ICogcCwgZ3VpbnQ4ICogcXQsIGdpbnQgc2l6ZSwgZ2ludCB0YWJsZU5vKQoreworICAqcCsrID0gMHhmZjsKKyAgKnArKyA9IDB4ZGI7ICAgICAgICAgICAgICAgICAgLyogRFFUICovCisgICpwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBtc2IgKi8KKyAgKnArKyA9IHNpemUgKyAzOyAgICAgICAgICAgICAgLyogbGVuZ3RoIGxzYiAqLworICAqcCsrID0gdGFibGVObzsKKyAgbWVtY3B5IChwLCBxdCwgc2l6ZSk7CisKKyAgcmV0dXJuIChwICsgc2l6ZSk7Cit9CisKK3N0YXRpYyBndWludDggKgorTWFrZUh1ZmZtYW5IZWFkZXIgKGd1aW50OCAqIHAsIGNvbnN0IGd1aW50OCAqIGNvZGVsZW5zLCBpbnQgbmNvZGVzLAorICAgIGNvbnN0IGd1aW50OCAqIHN5bWJvbHMsIGludCBuc3ltYm9scywgaW50IHRhYmxlTm8sIGludCB0YWJsZUNsYXNzKQoreworICAqcCsrID0gMHhmZjsKKyAgKnArKyA9IDB4YzQ7ICAgICAgICAgICAgICAgICAgLyogREhUICovCisgICpwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBtc2IgKi8KKyAgKnArKyA9IDMgKyBuY29kZXMgKyBuc3ltYm9sczsgLyogbGVuZ3RoIGxzYiAqLworICAqcCsrID0gKHRhYmxlQ2xhc3MgPDwgNCkgfCB0YWJsZU5vOworICBtZW1jcHkgKHAsIGNvZGVsZW5zLCBuY29kZXMpOworICBwICs9IG5jb2RlczsKKyAgbWVtY3B5IChwLCBzeW1ib2xzLCBuc3ltYm9scyk7CisgIHAgKz0gbnN5bWJvbHM7CisKKyAgcmV0dXJuIChwKTsKK30KKworc3RhdGljIGd1aW50OCAqCitNYWtlRFJJSGVhZGVyIChndWludDggKiBwLCBndWludDE2IGRyaSkKK3sKKyAgKnArKyA9IDB4ZmY7CisgICpwKysgPSAweGRkOyAgICAgICAgICAgICAgICAgIC8qIERSSSAqLworICAqcCsrID0gMHgwOyAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggbXNiICovCisgICpwKysgPSA0OyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBsc2IgKi8KKyAgKnArKyA9IGRyaSA+PiA4OyAgICAgICAgICAgICAgLyogZHJpIG1zYiAqLworICAqcCsrID0gZHJpICYgMHhmZjsgICAgICAgICAgICAvKiBkcmkgbHNiICovCisKKyAgcmV0dXJuIChwKTsKK30KKworLyoKKyAqICBBcmd1bWVudHM6CisgKiAgICB0eXBlLCB3aWR0aCwgaGVpZ2h0OiBhcyBzdXBwbGllZCBpbiBSVFAvSlBFRyBoZWFkZXIKKyAqICAgIHF0OiBxdWFudGl6YXRpb24gdGFibGVzIGFzIGVpdGhlciBkZXJpdmVkIGZyb20KKyAqICAgICAgICB0aGUgUSBmaWVsZCB1c2luZyBNYWtlVGFibGVzKCkgb3IgYXMgc3BlY2lmaWVkCisgKiAgICAgICAgaW4gc2VjdGlvbiA0LjIuCisgKiAgICBkcmk6IHJlc3RhcnQgaW50ZXJ2YWwgaW4gTUNVcywgb3IgMCBpZiBubyByZXN0YXJ0cy4KKyAqCisgKiAgICBwOiBwb2ludGVyIHRvIHJldHVybiBhcmVhCisgKgorICogIFJldHVybiB2YWx1ZToKKyAqICAgIFRoZSBsZW5ndGggb2YgdGhlIGdlbmVyYXRlZCBoZWFkZXJzLgorICoKKyAqICAgIEdlbmVyYXRlIGEgZnJhbWUgYW5kIHNjYW4gaGVhZGVycyB0aGF0IGNhbiBiZSBwcmVwZW5kZWQgdG8gdGhlCisgKiAgICBSVFAvSlBFRyBkYXRhIHBheWxvYWQgdG8gcHJvZHVjZSBhIEpQRUcgY29tcHJlc3NlZCBpbWFnZSBpbgorICogICAgaW50ZXJjaGFuZ2UgZm9ybWF0IChleGNlcHQgZm9yIHBvc3NpYmxlIHRyYWlsaW5nIGdhcmJhZ2UgYW5kCisgKiAgICBhYnNlbmNlIG9mIGFuIEVPSSBtYXJrZXIgdG8gdGVybWluYXRlIHRoZSBzY2FuKS4KKyAqLworc3RhdGljIGd1aW50CitNYWtlSGVhZGVycyAoZ3VpbnQ4ICogcCwgaW50IHR5cGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgZ3VpbnQ4ICogcXQsCisgICAgZ3VpbnQgcHJlY2lzaW9uLCBndWludDE2IGRyaSkKK3sKKyAgZ3VpbnQ4ICpzdGFydCA9IHA7CisgIGdpbnQgc2l6ZTsKKworICAqcCsrID0gMHhmZjsKKyAgKnArKyA9IDB4ZDg7ICAgICAgICAgICAgICAgICAgLyogU09JICovCisKKyAgc2l6ZSA9ICgocHJlY2lzaW9uICYgMSkgPyAxMjggOiA2NCk7CisgIHAgPSBNYWtlUXVhbnRIZWFkZXIgKHAsIHF0LCBzaXplLCAwKTsKKyAgcXQgKz0gc2l6ZTsKKworICBzaXplID0gKChwcmVjaXNpb24gJiAyKSA/IDEyOCA6IDY0KTsKKyAgcCA9IE1ha2VRdWFudEhlYWRlciAocCwgcXQsIHNpemUsIDEpOworICBxdCArPSBzaXplOworCisgIGlmIChkcmkgIT0gMCkKKyAgICBwID0gTWFrZURSSUhlYWRlciAocCwgZHJpKTsKKworICAqcCsrID0gMHhmZjsKKyAgKnArKyA9IDB4YzA7ICAgICAgICAgICAgICAgICAgLyogU09GICovCisgICpwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBtc2IgKi8KKyAgKnArKyA9IDE3OyAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIGxzYiAqLworICAqcCsrID0gODsgICAgICAgICAgICAgICAgICAgICAvKiA4LWJpdCBwcmVjaXNpb24gKi8KKyAgKnArKyA9IGhlaWdodCA+PiA4OyAgICAgICAgICAgLyogaGVpZ2h0IG1zYiAqLworICAqcCsrID0gaGVpZ2h0OyAgICAgICAgICAgICAgICAvKiBoZWlnaHQgbHNiICovCisgICpwKysgPSB3aWR0aCA+PiA4OyAgICAgICAgICAgIC8qIHdpZHRoIG1zYiAqLworICAqcCsrID0gd2lkdGg7ICAgICAgICAgICAgICAgICAvKiB3aWR0aCBsc2IgKi8KKyAgKnArKyA9IDM7ICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvbXBvbmVudHMgKi8KKyAgKnArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogY29tcCAwICovCisgIGlmICgodHlwZSAmIDB4M2YpID09IDApCisgICAgKnArKyA9IDB4MjE7ICAgICAgICAgICAgICAgIC8qIGhzYW1wID0gMiwgdnNhbXAgPSAxICovCisgIGVsc2UKKyAgICAqcCsrID0gMHgyMjsgICAgICAgICAgICAgICAgLyogaHNhbXAgPSAyLCB2c2FtcCA9IDIgKi8KKyAgKnArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogcXVhbnQgdGFibGUgMCAqLworICAqcCsrID0gMTsgICAgICAgICAgICAgICAgICAgICAvKiBjb21wIDEgKi8KKyAgKnArKyA9IDB4MTE7ICAgICAgICAgICAgICAgICAgLyogaHNhbXAgPSAxLCB2c2FtcCA9IDEgKi8KKyAgKnArKyA9IDE7ICAgICAgICAgICAgICAgICAgICAgLyogcXVhbnQgdGFibGUgMSAqLworICAqcCsrID0gMjsgICAgICAgICAgICAgICAgICAgICAvKiBjb21wIDIgKi8KKyAgKnArKyA9IDB4MTE7ICAgICAgICAgICAgICAgICAgLyogaHNhbXAgPSAxLCB2c2FtcCA9IDEgKi8KKyAgKnArKyA9IDE7ICAgICAgICAgICAgICAgICAgICAgLyogcXVhbnQgdGFibGUgMSAqLworCisgIHAgPSBNYWtlSHVmZm1hbkhlYWRlciAocCwgbHVtX2RjX2NvZGVsZW5zLAorICAgICAgc2l6ZW9mIChsdW1fZGNfY29kZWxlbnMpLCBsdW1fZGNfc3ltYm9scywgc2l6ZW9mIChsdW1fZGNfc3ltYm9scyksIDAsIDApOworICBwID0gTWFrZUh1ZmZtYW5IZWFkZXIgKHAsIGx1bV9hY19jb2RlbGVucywKKyAgICAgIHNpemVvZiAobHVtX2FjX2NvZGVsZW5zKSwgbHVtX2FjX3N5bWJvbHMsIHNpemVvZiAobHVtX2FjX3N5bWJvbHMpLCAwLCAxKTsKKyAgcCA9IE1ha2VIdWZmbWFuSGVhZGVyIChwLCBjaG1fZGNfY29kZWxlbnMsCisgICAgICBzaXplb2YgKGNobV9kY19jb2RlbGVucyksIGNobV9kY19zeW1ib2xzLCBzaXplb2YgKGNobV9kY19zeW1ib2xzKSwgMSwgMCk7CisgIHAgPSBNYWtlSHVmZm1hbkhlYWRlciAocCwgY2htX2FjX2NvZGVsZW5zLAorICAgICAgc2l6ZW9mIChjaG1fYWNfY29kZWxlbnMpLCBjaG1fYWNfc3ltYm9scywgc2l6ZW9mIChjaG1fYWNfc3ltYm9scyksIDEsIDEpOworCisgICpwKysgPSAweGZmOworICAqcCsrID0gMHhkYTsgICAgICAgICAgICAgICAgICAvKiBTT1MgKi8KKyAgKnArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG1zYiAqLworICAqcCsrID0gMTI7ICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggbHNiICovCisgICpwKysgPSAzOyAgICAgICAgICAgICAgICAgICAgIC8qIDMgY29tcG9uZW50cyAqLworICAqcCsrID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBjb21wIDAgKi8KKyAgKnArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogaHVmZm1hbiB0YWJsZSAwICovCisgICpwKysgPSAxOyAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXAgMSAqLworICAqcCsrID0gMHgxMTsgICAgICAgICAgICAgICAgICAvKiBodWZmbWFuIHRhYmxlIDEgKi8KKyAgKnArKyA9IDI7ICAgICAgICAgICAgICAgICAgICAgLyogY29tcCAyICovCisgICpwKysgPSAweDExOyAgICAgICAgICAgICAgICAgIC8qIGh1ZmZtYW4gdGFibGUgMSAqLworICAqcCsrID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBEQ1QgY29lZmYgKi8KKyAgKnArKyA9IDYzOyAgICAgICAgICAgICAgICAgICAgLyogbGFzdCBEQ1QgY29lZmYgKi8KKyAgKnArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogc3VjZXNzaXZlIGFwcHJveC4gKi8KKworICByZXR1cm4gKHAgLSBzdGFydCk7Cit9OworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfanBlZ19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UnRwSlBFR0RlcGF5ICpydHBqcGVnZGVwYXk7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBnaW50IGNsb2NrX3JhdGU7CisgIGNvbnN0IGdjaGFyICptZWRpYV9hdHRyOworCisgIHJ0cGpwZWdkZXBheSA9IEdTVF9SVFBfSlBFR19ERVBBWSAoZGVwYXlsb2FkKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwanBlZ2RlcGF5LCAiQ2FwcyBzZXQ6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkKKyAgICBjbG9ja19yYXRlID0gOTAwMDA7CisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgLyogcmVzZXQgZGVmYXVsdHMgKi8KKyAgcnRwanBlZ2RlcGF5LT53aWR0aCA9IDA7CisgIHJ0cGpwZWdkZXBheS0+aGVpZ2h0ID0gMDsKKyAgcnRwanBlZ2RlcGF5LT5tZWRpYV93aWR0aCA9IDA7CisgIHJ0cGpwZWdkZXBheS0+bWVkaWFfaGVpZ2h0ID0gMDsKKyAgcnRwanBlZ2RlcGF5LT5mcmF0ZV9udW0gPSAwOworICBydHBqcGVnZGVwYXktPmZyYXRlX2Rlbm9tID0gMTsKKworICAvKiBjaGVjayBmb3Igb3B0aW9uYWwgU0RQIGF0dHJpYnV0ZXMgKi8KKyAgaWYgKChtZWRpYV9hdHRyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJ4LWRpbWVuc2lvbnMiKSkpIHsKKyAgICBnaW50IHcsIGg7CisKKyAgICBpZiAoc3NjYW5mIChtZWRpYV9hdHRyLCAiJWQsJWQiLCAmdywgJmgpID09IDIpIHsKKyAgICAgIHJ0cGpwZWdkZXBheS0+bWVkaWFfd2lkdGggPSB3OworICAgICAgcnRwanBlZ2RlcGF5LT5tZWRpYV9oZWlnaHQgPSBoOworICAgIH0KKyAgfQorCisgIC8qIHRyeSB0byBnZXQgYSBmcmFtZXJhdGUgKi8KKyAgbWVkaWFfYXR0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiYS1mcmFtZXJhdGUiKTsKKyAgaWYgKCFtZWRpYV9hdHRyKQorICAgIG1lZGlhX2F0dHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgIngtZnJhbWVyYXRlIik7CisKKyAgaWYgKG1lZGlhX2F0dHIpIHsKKyAgICBHVmFsdWUgc3JjID0geyAwIH07CisgICAgR1ZhbHVlIGRlc3QgPSB7IDAgfTsKKyAgICBnY2hhciAqczsKKworICAgIC8qIGNhbm9uaWNhbGlzZSBmbG9hdGluZyBwb2ludCBzdHJpbmcgc28gd2UgY2FuIGhhbmRsZSBmcmFtZXJhdGUgc3RyaW5ncworICAgICAqIGluIHRoZSBmb3JtICIyNC45MzAiIG9yICIyNCw5MzAiIGlycmVzcGVjdGl2ZSBvZiB0aGUgY3VycmVudCBsb2NhbGUgKi8KKyAgICBzID0gZ19zdHJkdXAgKG1lZGlhX2F0dHIpOworICAgIGdfc3RyZGVsaW1pdCAocywgIiwiLCAnLicpOworCisgICAgLyogY29udmVydCB0aGUgZmxvYXQgdG8gYSBmcmFjdGlvbiAqLworICAgIGdfdmFsdWVfaW5pdCAoJnNyYywgR19UWVBFX0RPVUJMRSk7CisgICAgZ192YWx1ZV9zZXRfZG91YmxlICgmc3JjLCBnX2FzY2lpX3N0cnRvZCAocywgTlVMTCkpOworICAgIGdfdmFsdWVfaW5pdCAoJmRlc3QsIEdTVF9UWVBFX0ZSQUNUSU9OKTsKKyAgICBnX3ZhbHVlX3RyYW5zZm9ybSAoJnNyYywgJmRlc3QpOworCisgICAgcnRwanBlZ2RlcGF5LT5mcmF0ZV9udW0gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX251bWVyYXRvciAoJmRlc3QpOworICAgIHJ0cGpwZWdkZXBheS0+ZnJhdGVfZGVub20gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX2Rlbm9taW5hdG9yICgmZGVzdCk7CisKKyAgICBnX2ZyZWUgKHMpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9qcGVnX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0UnRwSlBFR0RlcGF5ICpydHBqcGVnZGVwYXk7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBnaW50IHBheWxvYWRfbGVuLCBoZWFkZXJfbGVuOworICBndWludDggKnBheWxvYWQ7CisgIGd1aW50IGZyYWdfb2Zmc2V0OworICBnaW50IFE7CisgIGd1aW50IHR5cGUsIHdpZHRoLCBoZWlnaHQ7CisgIGd1aW50MTYgZHJpLCBwcmVjaXNpb24sIGxlbmd0aDsKKyAgZ3VpbnQ4ICpxdGFibGU7CisKKyAgcnRwanBlZ2RlcGF5ID0gR1NUX1JUUF9KUEVHX0RFUEFZIChkZXBheWxvYWQpOworCisgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKHJ0cC0+YnVmZmVyKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgIkRJU0NPTlQsIHJlc2V0IGFkYXB0ZXIiKTsKKyAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRwanBlZ2RlcGF5LT5hZGFwdGVyKTsKKyAgICBydHBqcGVnZGVwYXktPmRpc2NvbnQgPSBUUlVFOworICB9CisKKyAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisKKyAgaWYgKHBheWxvYWRfbGVuIDwgOCkKKyAgICBnb3RvIGVtcHR5X3BhY2tldDsKKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisgIGhlYWRlcl9sZW4gPSAwOworCisgIC8qICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCBUeXBlLXNwZWNpZmljIHwgICAgICAgICAgICAgIEZyYWdtZW50IE9mZnNldCAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgIFR5cGUgICAgIHwgICAgICAgUSAgICAgICB8ICAgICBXaWR0aCAgICAgfCAgICAgSGVpZ2h0ICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICovCisgIGZyYWdfb2Zmc2V0ID0gKHBheWxvYWRbMV0gPDwgMTYpIHwgKHBheWxvYWRbMl0gPDwgOCkgfCBwYXlsb2FkWzNdOworICB0eXBlID0gcGF5bG9hZFs0XTsKKyAgUSA9IHBheWxvYWRbNV07CisgIHdpZHRoID0gcGF5bG9hZFs2XSAqIDg7CisgIGhlaWdodCA9IHBheWxvYWRbN10gKiA4OworCisgIC8qIHNhdyBhIHBhY2tldCB3aXRoIGZyYWdtZW50IG9mZnNldCA+IDAgYW5kIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBkYXRhIHF1ZXVlZAorICAgKiB1cCAobW9zdCBpbXBvcnRhbnRseSwgd2UgZG9uJ3QgaGF2ZSBhIGhlYWRlciBmb3IgdGhpcyBkYXRhKSAtLSBkcm9wIGl0CisgICAqIFhYWDogbWF5YmUgd2UgY2FuIGNoZWNrIGlmIHRoZSBqcGVnIGlzIHByb2dyZXNzaXZlIGFuZCBzYWx2YWdlIHRoZSBkYXRhPworICAgKiBYWFg6IG5vdCBpbXBsZW1lbnRlZCB5ZXQgYmVjYXVzZSBqcGVnZW5jIGNhbid0IGNyZWF0ZSBwcm9ncmVzc2l2ZSBqcGVncyAqLworICBpZiAoZnJhZ19vZmZzZXQgPiAwICYmIGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwanBlZ2RlcGF5LT5hZGFwdGVyKSA9PSAwKQorICAgIGdvdG8gbm9faGVhZGVyX3BhY2tldDsKKworICAvKiBhbGxvdyBmcmFtZSBkaW1lbnNpb25zID4gMjA0MCwgcGFzc2VkIGluIFNEUCBzZXNzaW9uIG9yIG1lZGlhIGF0dHJpYnV0ZXMKKyAgICogZnJvbSBnc3RydHNwc3JjLmMgKGdzdF9ydHNwc3JjX3NkcF9hdHRyaWJ1dGVzX3RvX2NhcHMpLCBvciBpbiBjYXBzICovCisgIGlmICghd2lkdGgpCisgICAgd2lkdGggPSBydHBqcGVnZGVwYXktPm1lZGlhX3dpZHRoOworCisgIGlmICghaGVpZ2h0KQorICAgIGhlaWdodCA9IHJ0cGpwZWdkZXBheS0+bWVkaWFfaGVpZ2h0OworCisgIGlmICh3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKQorICAgIGdvdG8gaW52YWxpZF9kaW1lbnNpb247CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwanBlZ2RlcGF5LCAiZnJhZyAldSwgdHlwZSAldSwgUSAlZCwgd2lkdGggJXUsIGhlaWdodCAldSIsCisgICAgICBmcmFnX29mZnNldCwgdHlwZSwgUSwgd2lkdGgsIGhlaWdodCk7CisKKyAgaGVhZGVyX2xlbiArPSA4OworICBwYXlsb2FkICs9IDg7CisgIHBheWxvYWRfbGVuIC09IDg7CisKKyAgZHJpID0gMDsKKyAgaWYgKHR5cGUgPiA2MykgeworICAgIGlmIChwYXlsb2FkX2xlbiA8IDQpCisgICAgICBnb3RvIGVtcHR5X3BhY2tldDsKKworICAgIC8qICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICogfCAgICAgICBSZXN0YXJ0IEludGVydmFsICAgICAgICB8RnxMfCAgICAgICBSZXN0YXJ0IENvdW50ICAgICAgIHwKKyAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAqLworICAgIGRyaSA9IChwYXlsb2FkWzBdIDw8IDgpIHwgcGF5bG9hZFsxXTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGpwZWdkZXBheSwgIkRSSSAlIiBHX0dVSU5UMTZfRk9STUFULCBkcmkpOworCisgICAgcGF5bG9hZCArPSA0OworICAgIGhlYWRlcl9sZW4gKz0gNDsKKyAgICBwYXlsb2FkX2xlbiAtPSA0OworICB9CisKKyAgaWYgKFEgPj0gMTI4ICYmIGZyYWdfb2Zmc2V0ID09IDApIHsKKyAgICBpZiAocGF5bG9hZF9sZW4gPCA0KQorICAgICAgZ290byBlbXB0eV9wYWNrZXQ7CisKKyAgICAvKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAqIHwgICAgICBNQlogICAgICB8ICAgUHJlY2lzaW9uICAgfCAgICAgICAgICAgICBMZW5ndGggICAgICAgICAgICB8CisgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgKiB8ICAgICAgICAgICAgICAgICAgICBRdWFudGl6YXRpb24gVGFibGUgRGF0YSAgICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgKi8KKyAgICBwcmVjaXNpb24gPSBwYXlsb2FkWzFdOworICAgIGxlbmd0aCA9IChwYXlsb2FkWzJdIDw8IDgpIHwgcGF5bG9hZFszXTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGpwZWdkZXBheSwgInByZWNpc2lvbiAlMDR4LCBsZW5ndGggJSIgR19HVUlOVDE2X0ZPUk1BVCwKKyAgICAgICAgcHJlY2lzaW9uLCBsZW5ndGgpOworCisgICAgaWYgKFEgPT0gMjU1ICYmIGxlbmd0aCA9PSAwKQorICAgICAgZ290byBlbXB0eV9wYWNrZXQ7CisKKyAgICBwYXlsb2FkICs9IDQ7CisgICAgaGVhZGVyX2xlbiArPSA0OworICAgIHBheWxvYWRfbGVuIC09IDQ7CisKKyAgICBpZiAobGVuZ3RoID4gcGF5bG9hZF9sZW4pCisgICAgICBnb3RvIGVtcHR5X3BhY2tldDsKKworICAgIGlmIChsZW5ndGggPiAwKQorICAgICAgcXRhYmxlID0gcGF5bG9hZDsKKyAgICBlbHNlCisgICAgICBxdGFibGUgPSBydHBqcGVnZGVwYXktPnF0YWJsZXNbUV07CisKKyAgICBwYXlsb2FkICs9IGxlbmd0aDsKKyAgICBoZWFkZXJfbGVuICs9IGxlbmd0aDsKKyAgICBwYXlsb2FkX2xlbiAtPSBsZW5ndGg7CisgIH0gZWxzZSB7CisgICAgbGVuZ3RoID0gMDsKKyAgICBxdGFibGUgPSBOVUxMOworICAgIHByZWNpc2lvbiA9IDA7CisgIH0KKworICBpZiAoZnJhZ19vZmZzZXQgPT0gMCkgeworICAgIEdzdE1hcEluZm8gbWFwOworICAgIGd1aW50IHNpemU7CisKKyAgICBpZiAocnRwanBlZ2RlcGF5LT53aWR0aCAhPSB3aWR0aCB8fCBydHBqcGVnZGVwYXktPmhlaWdodCAhPSBoZWlnaHQpIHsKKyAgICAgIEdzdENhcHMgKm91dGNhcHM7CisKKyAgICAgIG91dGNhcHMgPQorICAgICAgICAgIGdzdF9jYXBzX25ld19zaW1wbGUgKCJpbWFnZS9qcGVnIiwgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLAorICAgICAgICAgIHJ0cGpwZWdkZXBheS0+ZnJhdGVfbnVtLCBydHBqcGVnZGVwYXktPmZyYXRlX2Rlbm9tLCAid2lkdGgiLAorICAgICAgICAgIEdfVFlQRV9JTlQsIHdpZHRoLCAiaGVpZ2h0IiwgR19UWVBFX0lOVCwgaGVpZ2h0LCBOVUxMKTsKKyAgICAgIGdzdF9wYWRfc2V0X2NhcHMgKGRlcGF5bG9hZC0+c3JjcGFkLCBvdXRjYXBzKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChvdXRjYXBzKTsKKworICAgICAgcnRwanBlZ2RlcGF5LT53aWR0aCA9IHdpZHRoOworICAgICAgcnRwanBlZ2RlcGF5LT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgfQorCisgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGpwZWdkZXBheSwgImZpcnN0IHBhY2tldCwgbGVuZ3RoICUiIEdfR1VJTlQxNl9GT1JNQVQsCisgICAgICAgIGxlbmd0aCk7CisKKyAgICAvKiBmaXJzdCBwYWNrZXQgKi8KKyAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgIGlmIChRIDwgMTI4KSB7CisgICAgICAgIC8qIG5vIHF1YW50IHRhYmxlLCBzZWUgaWYgd2UgaGF2ZSBvbmUgY2FjaGVkICovCisgICAgICAgIHF0YWJsZSA9IHJ0cGpwZWdkZXBheS0+cXRhYmxlc1tRXTsKKyAgICAgICAgaWYgKCFxdGFibGUpIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBqcGVnZGVwYXksICJtYWtpbmcgUSAlZCB0YWJsZSIsIFEpOworICAgICAgICAgIC8qIG1ha2UgYW5kIGNhY2hlIHRoZSB0YWJsZSAqLworICAgICAgICAgIHF0YWJsZSA9IGdfbmV3IChndWludDgsIDEyOCk7CisgICAgICAgICAgTWFrZVRhYmxlcyAocnRwanBlZ2RlcGF5LCBRLCBxdGFibGUpOworICAgICAgICAgIHJ0cGpwZWdkZXBheS0+cXRhYmxlc1tRXSA9IHF0YWJsZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBqcGVnZGVwYXksICJ1c2luZyBjYWNoZWQgdGFibGUgZm9yIFEgJWQiLCBRKTsKKyAgICAgICAgfQorICAgICAgICAvKiBhbGwgOCBiaXQgcXVhbnRpemVycyAqLworICAgICAgICBwcmVjaXNpb24gPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFxdGFibGUpCisgICAgICAgICAgZ290byBub19xdGFibGU7CisgICAgICB9CisgICAgfQorCisgICAgLyogSSB0aGluayB3ZSBjYW4gZ2V0IGhlcmUgd2l0aCBhIE5VTEwgcXRhYmxlLCBzbyBtYWtlIHN1cmUgd2UgZG9uJ3QKKyAgICAgICBnbyBkZXJlZmVyZW5jaW5nIGl0IGluIE1ha2VIZWFkZXJzIGlmIHdlIGRvICovCisgICAgaWYgKCFxdGFibGUpCisgICAgICBnb3RvIG5vX3F0YWJsZTsKKworICAgIC8qIG1heCBoZWFkZXIgbGVuZ3RoLCBzaG91bGQgYmUgYmlnIGVub3VnaCAqLworICAgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTAwMCk7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgICAgc2l6ZSA9IE1ha2VIZWFkZXJzIChtYXAuZGF0YSwgdHlwZSwgd2lkdGgsIGhlaWdodCwgcXRhYmxlLCBwcmVjaXNpb24sIGRyaSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3Jlc2l6ZSAob3V0YnVmLCAwLCBzaXplKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGpwZWdkZXBheSwgInB1c2hpbmcgJXUgYnl0ZXMgb2YgaGVhZGVyIiwgc2l6ZSk7CisKKyAgICBnc3RfYWRhcHRlcl9wdXNoIChydHBqcGVnZGVwYXktPmFkYXB0ZXIsIG91dGJ1Zik7CisgIH0KKworICAvKiB0YWtlIEpQRUcgZGF0YSwgcHVzaCBpbiB0aGUgYWRhcHRlciAqLworICBHU1RfREVCVUdfT0JKRUNUIChydHBqcGVnZGVwYXksICJwdXNoaW5nIGRhdGEgYXQgb2Zmc2V0ICVkIiwgaGVhZGVyX2xlbik7CisgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3N1YmJ1ZmZlciAocnRwLCBoZWFkZXJfbGVuLCAtMSk7CisgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGpwZWdkZXBheS0+YWRhcHRlciwgb3V0YnVmKTsKKyAgb3V0YnVmID0gTlVMTDsKKworICBpZiAoZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAocnRwKSkgeworICAgIGd1aW50IGF2YWlsOworICAgIGd1aW50OCBlbmRbMl07CisgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICAvKiBsYXN0IGJ1ZmZlciB0YWtlIGFsbCBkYXRhIG91dCBvZiB0aGUgYWRhcHRlciAqLworICAgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBqcGVnZGVwYXktPmFkYXB0ZXIpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGpwZWdkZXBheSwgIm1hcmtlciBzZXQsIGxhc3QgYnVmZmVyIik7CisKKyAgICBpZiAoYXZhaWwgPCAyKQorICAgICAgZ290byBpbnZhbGlkX3BhY2tldDsKKworICAgIC8qIHRha2UgdGhlIGxhc3QgYnl0ZXMgb2YgdGhlIGpwZWcgZGF0YSB0byBzZWUgaWYgdGhlcmUgaXMgYW4gRU9JCisgICAgICogbWFya2VyICovCisgICAgZ3N0X2FkYXB0ZXJfY29weSAocnRwanBlZ2RlcGF5LT5hZGFwdGVyLCBlbmQsIGF2YWlsIC0gMiwgMik7CisKKyAgICBpZiAoZW5kWzBdICE9IDB4ZmYgJiYgZW5kWzFdICE9IDB4ZDkpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGpwZWdkZXBheSwgIm5vIEVPSSBtYXJrZXIsIGFkZGluZyBvbmUiKTsKKworICAgICAgLyogbm8gRU9JIG1hcmtlciwgYWRkIG9uZSAqLworICAgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgyKTsKKyAgICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgICAgbWFwLmRhdGFbMF0gPSAweGZmOworICAgICAgbWFwLmRhdGFbMV0gPSAweGQ5OworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICAgICAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRwanBlZ2RlcGF5LT5hZGFwdGVyLCBvdXRidWYpOworICAgICAgYXZhaWwgKz0gMjsKKyAgICB9CisgICAgb3V0YnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHJ0cGpwZWdkZXBheS0+YWRhcHRlciwgYXZhaWwpOworCisgICAgaWYgKHJ0cGpwZWdkZXBheS0+ZGlzY29udCkgeworICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgICBydHBqcGVnZGVwYXktPmRpc2NvbnQgPSBGQUxTRTsKKyAgICB9CisKKyAgICBnc3RfcnRwX2Ryb3Bfbm9uX3ZpZGVvX21ldGEgKHJ0cGpwZWdkZXBheSwgb3V0YnVmKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGpwZWdkZXBheSwgInJldHVybmluZyAldSBieXRlcyIsIGF2YWlsKTsKKyAgfQorCisgIHJldHVybiBvdXRidWY7CisKKyAgLyogRVJST1JTICovCitlbXB0eV9wYWNrZXQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBqcGVnZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIkVtcHR5IFBheWxvYWQuIiksIChOVUxMKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2ludmFsaWRfZGltZW5zaW9uOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwanBlZ2RlcGF5LCBTVFJFQU0sIEZPUk1BVCwKKyAgICAgICAgKCJJbnZhbGlkIERpbWVuc2lvbiAlZHglZC4iLCB3aWR0aCwgaGVpZ2h0KSwgKE5VTEwpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorbm9fcXRhYmxlOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChydHBqcGVnZGVwYXksICJubyBxdGFibGUiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQoraW52YWxpZF9wYWNrZXQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cGpwZWdkZXBheSwgImludmFsaWQgcGFja2V0Iik7CisgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKHJ0cGpwZWdkZXBheS0+YWRhcHRlciwKKyAgICAgICAgZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBqcGVnZGVwYXktPmFkYXB0ZXIpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorbm9faGVhZGVyX3BhY2tldDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwanBlZ2RlcGF5LAorICAgICAgICAiZGlzY2FyZGluZyBkYXRhIHBhY2tldHMgcmVjZWl2ZWQgd2hlbiB3ZSBoYXZlIG5vIGhlYWRlciIpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2pwZWdfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RSdHBKUEVHRGVwYXkgKnJ0cGpwZWdkZXBheTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHJ0cGpwZWdkZXBheSA9IEdTVF9SVFBfSlBFR19ERVBBWSAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGdzdF9ydHBfanBlZ19kZXBheV9yZXNldCAocnRwanBlZ2RlcGF5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworCitnYm9vbGVhbgorZ3N0X3J0cF9qcGVnX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwanBlZ2RlcGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX0pQRUdfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3NGYxMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmgKQEAgLTAsMCArMSw3MCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0pQRUdfREVQQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9KUEVHX0RFUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9KUEVHX0RFUEFZIFwKKyAgKGdzdF9ydHBfanBlZ19kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0pQRUdfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfSlBFR19ERVBBWSxHc3RSdHBKUEVHRGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX0pQRUdfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0pQRUdfREVQQVksR3N0UnRwSlBFR0RlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0pQRUdfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfSlBFR19ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfSlBFR19ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSlBFR19ERVBBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBKUEVHRGVwYXkgR3N0UnRwSlBFR0RlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEpQRUdEZXBheUNsYXNzIEdzdFJ0cEpQRUdEZXBheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cEpQRUdEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKKworICBHc3RBZGFwdGVyICphZGFwdGVyOworICBnYm9vbGVhbiAgICBkaXNjb250OworCisgIC8qIGNhY2hlZCBxdWFudCB0YWJsZXMgKi8KKyAgZ3VpbnQ4ICogcXRhYmxlc1syNTVdOworICBnaW50IGZyYXRlX251bTsKKyAgZ2ludCBmcmF0ZV9kZW5vbTsKKyAgZ2ludCBtZWRpYV93aWR0aDsKKyAgZ2ludCBtZWRpYV9oZWlnaHQ7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKK307CisKK3N0cnVjdCBfR3N0UnRwSlBFR0RlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfanBlZ19kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfanBlZ19kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9KUEVHX0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBqcGVncGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTkzMDE2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBqcGVncGF5LmMKQEAgLTAsMCArMSwxMDA2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBeGlzIENvbW11bmljYXRpb25zIDxkZXYtZ3N0cmVhbWVyQGF4aXMuY29tPgorICogQGF1dGhvciBCam9ybiBPc3RieSA8Ympvcm4ub3N0YnlAYXhpcy5jb20+CisgKiBAYXV0aG9yIFBldGVyIEtqZWxsZXJzdGVkdCA8cGV0ZXIua2plbGxlcnN0ZWR0QGF4aXMuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cGpwZWdwYXkKKyAqCisgKiBQYXlsb2FkIGVuY29kZSBKUEVHIHBpY3R1cmVzIGludG8gUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQyAyNDM1LgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMjQzNS50eHQKKyAqCisgKiBUaGUgcGF5bG9hZGVyIHRha2VzIGEgSlBFRyBwaWN0dXJlLCBzY2FucyB0aGUgaGVhZGVyIGZvciBxdWFudGl6YXRpb24KKyAqIHRhYmxlcyAoaWYgbmVlZGVkKSBhbmQgY29uc3RydWN0cyB0aGUgUlRQIHBhY2tldCBoZWFkZXIgZm9sbG93ZWQgYnkKKyAqIHRoZSBhY3R1YWwgSlBFRyBlbnRyb3B5IHNjYW4uCisgKgorICogVGhlIHBheWxvYWRlciBhc3N1bWVzIHRoYXQgY29ycmVjdCB3aWR0aCBhbmQgaGVpZ2h0IGlzIGZvdW5kIGluIHRoZSBjYXBzLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworI2luY2x1ZGUgImdzdHJ0cGpwZWdwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9qcGVnX3BheV9zaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJpbWFnZS9qcGVnOyAiICJ2aWRlby94LWpwZWciKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2pwZWdfcGF5X3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICIgIG1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICIgIHBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9KUEVHX1NUUklORyAiLCAiCisgICAgICAgICIgIGNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgICAiCisgICAgICAgICIgIGVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkpQRUdcIiwgIgorICAgICAgICAiICB3aWR0aCA9IChpbnQpIFsgMSwgNjU1MzYgXSwgIiAiICBoZWlnaHQgPSAoaW50KSBbIDEsIDY1NTM2IF07ICIKKyAgICAgICAgIiBhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAiICBtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAiICBwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiICBjbG9jay1yYXRlID0gKGludCkgOTAwMDAsICAgIgorICAgICAgICAiICBlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJKUEVHXCIsICIKKyAgICAgICAgIiAgd2lkdGggPSAoaW50KSBbIDEsIDY1NTM2IF0sICIgIiAgaGVpZ2h0ID0gKGludCkgWyAxLCA2NTUzNiBdIikKKyAgICApOworCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBqcGVncGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBqcGVncGF5X2RlYnVnKQorCisvKgorICogUVVBTlRfUFJFRklYX0xFTjoKKyAqCisgKiBQcmVmaXggbGVuZ3RoIGluIHRoZSBoZWFkZXIgYmVmb3JlIHRoZSBxdWFudGl6YXRpb24gdGFibGVzOgorICogVHdvIHNpemUgYnl0ZXMgYW5kIG9uZSBieXRlIGZvciBwcmVjaXNpb24KKyAqLworI2RlZmluZSBRVUFOVF9QUkVGSVhfTEVOICAgICAzCisKKwordHlwZWRlZiBlbnVtIF9SdHBKcGVnTWFya2VyIFJ0cEpwZWdNYXJrZXI7CisKKy8qCisgKiBSdHBKcGVnTWFya2VyOgorICogQEpQRUdfTUFSS0VSOiBQcmVmaXggZm9yIEpQRUcgbWFya2VyCisgKiBASlBFR19NQVJLRVJfU09JOiBTdGFydCBvZiBJbWFnZSBtYXJrZXIKKyAqIEBKUEVHX01BUktFUl9KRklGOiBKRklGIG1hcmtlcgorICogQEpQRUdfTUFSS0VSX0NNVDogQ29tbWVudCBtYXJrZXIKKyAqIEBKUEVHX01BUktFUl9EUVQ6IERlZmluZSBRdWFudGl6YXRpb24gVGFibGUgbWFya2VyCisgKiBASlBFR19NQVJLRVJfU09GOiBTdGFydCBvZiBGcmFtZSBtYXJrZXIKKyAqIEBKUEVHX01BUktFUl9ESFQ6IERlZmluZSBIdWZmbWFuIFRhYmxlIG1hcmtlcgorICogQEpQRUdfTUFSS0VSX1NPUzogU3RhcnQgb2YgU2NhbiBtYXJrZXIKKyAqIEBKUEVHX01BUktFUl9FT0k6IEVuZCBvZiBJbWFnZSBtYXJrZXIKKyAqIEBKUEVHX01BUktFUl9EUkk6IERlZmluZSBSZXN0YXJ0IEludGVydmFsIG1hcmtlcgorICogQEpQRUdfTUFSS0VSX0gyNjQ6IEgyNjQgbWFya2VyCisgKgorICogSWRlbnRpZmVycyBmb3IgbWFya2VycyBpbiBKUEVHIGhlYWRlcgorICovCitlbnVtIF9SdHBKcGVnTWFya2VyCit7CisgIEpQRUdfTUFSS0VSID0gMHhGRiwKKyAgSlBFR19NQVJLRVJfU09JID0gMHhEOCwKKyAgSlBFR19NQVJLRVJfSkZJRiA9IDB4RTAsCisgIEpQRUdfTUFSS0VSX0NNVCA9IDB4RkUsCisgIEpQRUdfTUFSS0VSX0RRVCA9IDB4REIsCisgIEpQRUdfTUFSS0VSX1NPRiA9IDB4QzAsCisgIEpQRUdfTUFSS0VSX0RIVCA9IDB4QzQsCisgIEpQRUdfTUFSS0VSX0pQRyA9IDB4QzgsCisgIEpQRUdfTUFSS0VSX1NPUyA9IDB4REEsCisgIEpQRUdfTUFSS0VSX0VPSSA9IDB4RDksCisgIEpQRUdfTUFSS0VSX0RSSSA9IDB4REQsCisgIEpQRUdfTUFSS0VSX0FQUDAgPSAweEUwLAorICBKUEVHX01BUktFUl9IMjY0ID0gMHhFNCwgICAgICAvKiBBUFA0ICovCisgIEpQRUdfTUFSS0VSX0FQUDE1ID0gMHhFRiwKKyAgSlBFR19NQVJLRVJfSlBHMCA9IDB4RjAsCisgIEpQRUdfTUFSS0VSX0pQRzEzID0gMHhGRAorfTsKKworI2RlZmluZSBERUZBVUxUX0pQRUdfUVVBTlQgICAgMjU1CisKKyNkZWZpbmUgREVGQVVMVF9KUEVHX1FVQUxJVFkgIDI1NQorI2RlZmluZSBERUZBVUxUX0pQRUdfVFlQRSAgICAgMQorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9KUEVHX1FVQUxJVFksCisgIFBST1BfSlBFR19UWVBFCit9OworCitlbnVtCit7CisgIFFfVEFCTEVfMCA9IDAsCisgIFFfVEFCTEVfMSwKKyAgUV9UQUJMRV9NQVggICAgICAgICAgICAgICAgICAgLyogb25seSBzdXBwb3J0IGZvciB0d28gdGFibGVzIGF0IHRoZSBtb21lbnQgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IF9SdHBKcGVnSGVhZGVyIFJ0cEpwZWdIZWFkZXI7CisKKy8qCisgKiBSdHBKcGVnSGVhZGVyOgorICogQHR5cGVfc3BlYzogdHlwZSBzcGVjaWZpYworICogQG9mZnNldDogZnJhZ21lbnQgb2Zmc2V0CisgKiBAdHlwZTogdHlwZSBmaWVsZAorICogQHE6IHF1YW50aXphdGlvbiB0YWJsZSBmb3IgdGhpcyBmcmFtZQorICogQHdpZHRoOiB3aWR0aCBvZiBpbWFnZSBpbiA4LXBpeGVsIG11bHRpcGxlcworICogQGhlaWdodDogaGVpZ2h0IG9mIGltYWdlIGluIDgtcGl4ZWwgbXVsdGlwbGVzCisgKgorICogMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICogMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCBUeXBlLXNwZWNpZmljIHwgICAgICAgICAgICAgIEZyYWdtZW50IE9mZnNldCAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgVHlwZSAgICAgfCAgICAgICBRICAgICAgIHwgICAgIFdpZHRoICAgICB8ICAgICBIZWlnaHQgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqLworc3RydWN0IF9SdHBKcGVnSGVhZGVyCit7CisgIGd1aW50IHR5cGVfc3BlYzo4OworICBndWludCBvZmZzZXQ6MjQ7CisgIGd1aW50OCB0eXBlOworICBndWludDggcTsKKyAgZ3VpbnQ4IHdpZHRoOworICBndWludDggaGVpZ2h0OworfTsKKworLyoKKyAqIFJ0cFF1YW50SGVhZGVyCisgKiBAbWJ6OiBtdXN0IGJlIHplcm8KKyAqIEBwcmVjaXNpb246IHNwZWNpZnkgc2l6ZSBvZiBxdWFudGl6YXRpb24gdGFibGVzCisgKiBAbGVuZ3RoOiBsZW5ndGggb2YgcXVhbnRpemF0aW9uIGRhdGEKKyAqCisgKiAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKiAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgTUJaICAgICAgfCAgIFByZWNpc2lvbiAgIHwgICAgICAgICAgICAgTGVuZ3RoICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgIFF1YW50aXphdGlvbiBUYWJsZSBEYXRhICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ3VpbnQ4IG1iejsKKyAgZ3VpbnQ4IHByZWNpc2lvbjsKKyAgZ3VpbnQxNiBsZW5ndGg7Cit9IFJ0cFF1YW50SGVhZGVyOworCit0eXBlZGVmIHN0cnVjdAoreworICBndWludDggc2l6ZTsKKyAgY29uc3QgZ3VpbnQ4ICpkYXRhOworfSBSdHBRdWFudFRhYmxlOworCisvKgorICogUnRwUmVzdGFydE1hcmtlckhlYWRlcjoKKyAqIEByZXN0YXJ0SW50ZXJ2YWw6IG51bWJlciBvZiBNQ1VzIHRoYXQgYXBwZWFyIGJldHdlZW4gcmVzdGFydCBtYXJrZXJzCisgKiBAcmVzdGFydEZpcnN0TGFzdENvdW50OiBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmaXJzdCBwYWNrZXQgbWFyayBpbiB0aGUgY2h1bmsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgcGFja2V0IG1hcmsgaW4gdGhlIGNodW5rIGFuZCB0aGUgcG9zaXRpb24gb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCByZXN0YXJ0IGludGVydmFsIGluIHRoZSBjdXJyZW50ICJjaHVuayIKKyAqCisgKiAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKiAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAgfCAgICAgICBSZXN0YXJ0IEludGVydmFsICAgICAgICB8RnxMfCAgICAgICBSZXN0YXJ0IENvdW50ICAgICAgIHwKKyAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICoKKyAqICBUaGUgcmVzdGFydCBtYXJrZXIgaGVhZGVyIGlzIGltcGxlbWVudGVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nCisgKiAgbWV0aG9kb2xvZ3kgc3BlY2lmaWVkIGluIHNlY3Rpb24gMy4xLjcgb2YgcmZjMjQzNS50eHQuCisgKgorICogICJJZiB0aGUgcmVzdGFydCBpbnRlcnZhbHMgaW4gYSBmcmFtZSBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgYWxpZ25lZAorICogIHdpdGggcGFja2V0IGJvdW5kYXJpZXMsIHRoZSBGIChmaXJzdCkgYW5kIEwgKGxhc3QpIGJpdHMgTVVTVCBiZSBzZXQKKyAqICB0byAxIGFuZCB0aGUgUmVzdGFydCBDb3VudCBNVVNUIGJlIHNldCB0byAweDNGRkYuICBUaGlzIGluZGljYXRlcworICogIHRoYXQgYSByZWNlaXZlciBNVVNUIHJlYXNzZW1ibGUgdGhlIGVudGlyZSBmcmFtZSBiZWZvcmUgZGVjb2RpbmcgaXQuIgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBndWludDE2IHJlc3RhcnRfaW50ZXJ2YWw7CisgIGd1aW50MTYgcmVzdGFydF9jb3VudDsKK30gUnRwUmVzdGFydE1hcmtlckhlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ3VpbnQ4IGlkOworICBndWludDggc2FtcDsKKyAgZ3VpbnQ4IHF0OworfSBDb21wSW5mbzsKKworLyogRklYTUU6IHJlc3RhcnQgbWFya2VyIGhlYWRlciBjdXJyZW50bHkgdW5zdXBwb3J0ZWQgKi8KKworc3RhdGljIHZvaWQgZ3N0X3J0cF9qcGVnX3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfanBlZ19wYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9qcGVnX3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9qcGVnX3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBhZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworCisjZGVmaW5lIGdzdF9ydHBfanBlZ19wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwSlBFR1BheSwgZ3N0X3J0cF9qcGVnX3BheSwgR1NUX1RZUEVfUlRQX0JBU0VfUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2pwZWdfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEpQRUdQYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9ydHBfanBlZ19wYXlfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcnRwX2pwZWdfcGF5X2dldF9wcm9wZXJ0eTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2pwZWdfcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfanBlZ19wYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlJUUCBKUEVHIHBheWxvYWRlciIsCisgICAgICAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYXlsb2FkLWVuY29kZXMgSlBFRyBwaWN0dXJlcyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgMjQzNSkiLAorICAgICAgIkF4aXMgQ29tbXVuaWNhdGlvbnMgPGRldi1nc3RyZWFtZXJAYXhpcy5jb20+Iik7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9qcGVnX3BheV9zZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2J1ZmZlciA9IGdzdF9ydHBfanBlZ19wYXlfaGFuZGxlX2J1ZmZlcjsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0pQRUdfUVVBTElUWSwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJxdWFsaXR5IiwgIlF1YWxpdHkiLAorICAgICAgICAgICJRdWFsaXR5IGZhY3RvciBvbiBKUEVHIGRhdGEgKHVudXNlZCkiLCAwLCAyNTUsIDI1NSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0pQRUdfVFlQRSwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ0eXBlIiwgIlR5cGUiLAorICAgICAgICAgICJEZWZhdWx0IEpQRUcgVHlwZSwgb3ZlcndyaXR0ZW4gYnkgU09GIHdoZW4gcHJlc2VudCIsIDAsIDI1NSwKKyAgICAgICAgICBERUZBVUxUX0pQRUdfVFlQRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGpwZWdwYXlfZGVidWcsICJydHBqcGVncGF5IiwgMCwKKyAgICAgICJNb3Rpb24gSlBFRyBSVFAgUGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2pwZWdfcGF5X2luaXQgKEdzdFJ0cEpQRUdQYXkgKiBwYXkpCit7CisgIHBheS0+cXVhbGl0eSA9IERFRkFVTFRfSlBFR19RVUFMSVRZOworICBwYXktPnF1YW50ID0gREVGQVVMVF9KUEVHX1FVQU5UOworICBwYXktPnR5cGUgPSBERUZBVUxUX0pQRUdfVFlQRTsKKyAgcGF5LT53aWR0aCA9IC0xOworICBwYXktPmhlaWdodCA9IC0xOworCisgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX1BUIChwYXkpID0gR1NUX1JUUF9QQVlMT0FEX0pQRUc7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9qcGVnX3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpjYXBzX3N0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBHc3RSdHBKUEVHUGF5ICpwYXk7CisgIGdib29sZWFuIHJlczsKKyAgZ2ludCB3aWR0aCA9IC0xLCBoZWlnaHQgPSAtMTsKKyAgZ2ludCBudW0gPSAwLCBkZW5vbTsKKyAgZ2NoYXIgKnJhdGUgPSBOVUxMOworICBnY2hhciAqZGltID0gTlVMTDsKKworICBwYXkgPSBHU1RfUlRQX0pQRUdfUEFZIChiYXNlcGF5bG9hZCk7CisKKyAgLyogdGhlc2UgcHJvcGVydGllcyBhcmUgbWFuZGF0b3J5LCBidXQgdGhleSBtaWdodCBiZSBhZGp1c3RlZCBieSB0aGUgU09GLCBpZiB0aGVyZQorICAgKiBpcyBvbmUuICovCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChjYXBzX3N0cnVjdHVyZSwgImhlaWdodCIsICZoZWlnaHQpIHx8IGhlaWdodCA8PSAwKSB7CisgICAgZ290byBpbnZhbGlkX2RpbWVuc2lvbjsKKyAgfQorCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChjYXBzX3N0cnVjdHVyZSwgIndpZHRoIiwgJndpZHRoKSB8fCB3aWR0aCA8PSAwKSB7CisgICAgZ290byBpbnZhbGlkX2RpbWVuc2lvbjsKKyAgfQorCisgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9mcmFjdGlvbiAoY2Fwc19zdHJ1Y3R1cmUsICJmcmFtZXJhdGUiLCAmbnVtLCAmZGVub20pICYmCisgICAgICAobnVtIDwgMCB8fCBkZW5vbSA8PSAwKSkgeworICAgIGdvdG8gaW52YWxpZF9mcmFtZXJhdGU7CisgIH0KKworICBpZiAoaGVpZ2h0ID4gMjA0MCB8fCB3aWR0aCA+IDIwNDApIHsKKyAgICBwYXktPmhlaWdodCA9IDA7CisgICAgcGF5LT53aWR0aCA9IDA7CisgIH0gZWxzZSB7CisgICAgcGF5LT5oZWlnaHQgPSBHU1RfUk9VTkRfVVBfOCAoaGVpZ2h0KSAvIDg7CisgICAgcGF5LT53aWR0aCA9IEdTVF9ST1VORF9VUF84ICh3aWR0aCkgLyA4OworICB9CisKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKGJhc2VwYXlsb2FkLCAidmlkZW8iLAorICAgICAgYmFzZXBheWxvYWQtPnB0ICE9IEdTVF9SVFBfUEFZTE9BRF9KUEVHLCAiSlBFRyIsIDkwMDAwKTsKKworICBpZiAobnVtID4gMCkgeworICAgIGdkb3VibGUgZnJhbWVyYXRlOworICAgIGdzdF91dGlsX2ZyYWN0aW9uX3RvX2RvdWJsZSAobnVtLCBkZW5vbSwgJmZyYW1lcmF0ZSk7CisgICAgcmF0ZSA9IGdfc3RyZHVwX3ByaW50ZiAoIiVmIiwgZnJhbWVyYXRlKTsKKyAgfQorCisgIGlmIChwYXktPndpZHRoID09IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXksCisgICAgICAgICJ3aWR0aCBvciBoZWlnaHQgYXJlIGdyZWF0ZXIgdGhhbiAyMDQwLCBhZGRpbmcgeC1kaW1lbnNpb25zIHRvIGNhcHMiKTsKKyAgICBkaW0gPSBnX3N0cmR1cF9wcmludGYgKCIlZCwlZCIsIHdpZHRoLCBoZWlnaHQpOworICB9CisKKyAgaWYgKHJhdGUgIT0gTlVMTCAmJiBkaW0gIT0gTlVMTCkgeworICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChiYXNlcGF5bG9hZCwgImEtZnJhbWVyYXRlIiwKKyAgICAgICAgR19UWVBFX1NUUklORywgcmF0ZSwgIngtZGltZW5zaW9ucyIsIEdfVFlQRV9TVFJJTkcsIGRpbSwgTlVMTCk7CisgIH0gZWxzZSBpZiAocmF0ZSAhPSBOVUxMICYmIGRpbSA9PSBOVUxMKSB7CisgICAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLCAiYS1mcmFtZXJhdGUiLAorICAgICAgICBHX1RZUEVfU1RSSU5HLCByYXRlLCBOVUxMKTsKKyAgfSBlbHNlIGlmIChyYXRlID09IE5VTEwgJiYgZGltICE9IE5VTEwpIHsKKyAgICByZXMgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAoYmFzZXBheWxvYWQsICJ4LWRpbWVuc2lvbnMiLAorICAgICAgICBHX1RZUEVfU1RSSU5HLCBkaW0sIE5VTEwpOworICB9IGVsc2UgeworICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChiYXNlcGF5bG9hZCwgTlVMTCk7CisgIH0KKworICBnX2ZyZWUgKGRpbSk7CisgIGdfZnJlZSAocmF0ZSk7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfZGltZW5zaW9uOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocGF5LCAiSW52YWxpZCB3aWR0aC9oZWlnaHQgZnJvbSBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbnZhbGlkX2ZyYW1lcmF0ZToKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBheSwgIkludmFsaWQgZnJhbWVyYXRlIGZyb20gY2FwcyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ3VpbnQKK2dzdF9ydHBfanBlZ19wYXlfaGVhZGVyX3NpemUgKGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IG9mZnNldCkKK3sKKyAgcmV0dXJuIGRhdGFbb2Zmc2V0XSA8PCA4IHwgZGF0YVtvZmZzZXQgKyAxXTsKK30KKworc3RhdGljIGd1aW50Citnc3RfcnRwX2pwZWdfcGF5X3JlYWRfcXVhbnRfdGFibGUgKGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsCisgICAgZ3VpbnQgb2Zmc2V0LCBSdHBRdWFudFRhYmxlIHRhYmxlc1tdKQoreworICBndWludCBxdWFudF9zaXplLCB0YWJfc2l6ZTsKKyAgZ3VpbnQ4IHByZWM7CisgIGd1aW50OCBpZDsKKworICBpZiAob2Zmc2V0ICsgMiA+IHNpemUpCisgICAgZ290byB0b29fc21hbGw7CisKKyAgcXVhbnRfc2l6ZSA9IGdzdF9ydHBfanBlZ19wYXlfaGVhZGVyX3NpemUgKGRhdGEsIG9mZnNldCk7CisgIGlmIChxdWFudF9zaXplIDwgMikKKyAgICBnb3RvIHNtYWxsX3F1YW50X3NpemU7CisKKyAgLyogY2xhbXAgdG8gYXZhaWxhYmxlIGRhdGEgKi8KKyAgaWYgKG9mZnNldCArIHF1YW50X3NpemUgPiBzaXplKQorICAgIHF1YW50X3NpemUgPSBzaXplIC0gb2Zmc2V0OworCisgIG9mZnNldCArPSAyOworICBxdWFudF9zaXplIC09IDI7CisKKyAgd2hpbGUgKHF1YW50X3NpemUgPiAwKSB7CisgICAgLyogbm90IGVub3VnaCB0byByZWFkIHRoZSBpZCAqLworICAgIGlmIChvZmZzZXQgKyAxID4gc2l6ZSkKKyAgICAgIGJyZWFrOworCisgICAgaWQgPSBkYXRhW29mZnNldF0gJiAweDBmOworICAgIGlmIChpZCA9PSAxNSkKKyAgICAgIC8qIGludmFsaWQgaWQgcmVjZWl2ZWQgLSBjb3JydXB0IGRhdGEgKi8KKyAgICAgIGdvdG8gaW52YWxpZF9pZDsKKworICAgIHByZWMgPSAoZGF0YVtvZmZzZXRdICYgMHhmMCkgPj4gNDsKKyAgICBpZiAocHJlYykKKyAgICAgIHRhYl9zaXplID0gMTI4OworICAgIGVsc2UKKyAgICAgIHRhYl9zaXplID0gNjQ7CisKKyAgICAvKiB0aGVyZSBpcyBub3QgZW5vdWdoIGZvciB0aGUgdGFibGUgKi8KKyAgICBpZiAocXVhbnRfc2l6ZSA8IHRhYl9zaXplICsgMSkKKyAgICAgIGdvdG8gbm9fdGFibGU7CisKKyAgICBHU1RfTE9HICgicmVhZCBxdWFudCB0YWJsZSAlZCwgdGFiX3NpemUgJWQsIHByZWMgJTAyeCIsIGlkLCB0YWJfc2l6ZSwgcHJlYyk7CisKKyAgICB0YWJsZXNbaWRdLnNpemUgPSB0YWJfc2l6ZTsKKyAgICB0YWJsZXNbaWRdLmRhdGEgPSAmZGF0YVtvZmZzZXQgKyAxXTsKKworICAgIHRhYl9zaXplICs9IDE7CisgICAgcXVhbnRfc2l6ZSAtPSB0YWJfc2l6ZTsKKyAgICBvZmZzZXQgKz0gdGFiX3NpemU7CisgIH0KK2RvbmU6CisgIHJldHVybiBvZmZzZXQgKyBxdWFudF9zaXplOworCisgIC8qIEVSUk9SUyAqLwordG9vX3NtYWxsOgorICB7CisgICAgR1NUX1dBUk5JTkcgKCJub3QgZW5vdWdoIGRhdGEiKTsKKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorc21hbGxfcXVhbnRfc2l6ZToKKyAgeworICAgIEdTVF9XQVJOSU5HICgicXVhbnRfc2l6ZSB0b28gc21hbGwgKCV1IDwgMikiLCBxdWFudF9zaXplKTsKKyAgICByZXR1cm4gc2l6ZTsKKyAgfQoraW52YWxpZF9pZDoKKyAgeworICAgIEdTVF9XQVJOSU5HICgiaW52YWxpZCBpZCIpOworICAgIGdvdG8gZG9uZTsKKyAgfQorbm9fdGFibGU6CisgIHsKKyAgICBHU1RfV0FSTklORyAoIm5vdCBlbm91Z2ggZGF0YSBmb3IgdGFibGUgKCV1IDwgJXUpIiwgcXVhbnRfc2l6ZSwKKyAgICAgICAgdGFiX3NpemUgKyAxKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2pwZWdfcGF5X3JlYWRfc29mIChHc3RSdHBKUEVHUGF5ICogcGF5LCBjb25zdCBndWludDggKiBkYXRhLAorICAgIGd1aW50IHNpemUsIGd1aW50ICogb2Zmc2V0LCBDb21wSW5mbyBpbmZvW10sIFJ0cFF1YW50VGFibGUgdGFibGVzW10sCisgICAgZ3Vsb25nIHRhYmxlc19lbGVtZW50cykKK3sKKyAgZ3VpbnQgc29mX3NpemUsIG9mZjsKKyAgZ3VpbnQgd2lkdGgsIGhlaWdodCwgaW5mb2xlbjsKKyAgQ29tcEluZm8gZWxlbTsKKyAgZ2ludCBpLCBqOworCisgIG9mZiA9ICpvZmZzZXQ7CisKKyAgLyogd2UgbmVlZCBhdCBsZWFzdCAxNyBieXRlcyBmb3IgdGhlIFNPRiAqLworICBpZiAob2ZmICsgMTcgPiBzaXplKQorICAgIGdvdG8gd3Jvbmdfc2l6ZTsKKworICBzb2Zfc2l6ZSA9IGdzdF9ydHBfanBlZ19wYXlfaGVhZGVyX3NpemUgKGRhdGEsIG9mZik7CisgIGlmIChzb2Zfc2l6ZSA8IDE3KQorICAgIGdvdG8gd3JvbmdfbGVuZ3RoOworCisgICpvZmZzZXQgKz0gc29mX3NpemU7CisKKyAgLyogc2tpcCBzaXplICovCisgIG9mZiArPSAyOworCisgIC8qIHByZWNpc2lvbiBzaG91bGQgYmUgOCAqLworICBpZiAoZGF0YVtvZmYrK10gIT0gOCkKKyAgICBnb3RvIGJhZF9wcmVjaXNpb247CisKKyAgLyogcmVhZCBkaW1lbnNpb25zICovCisgIGhlaWdodCA9IGRhdGFbb2ZmXSA8PCA4IHwgZGF0YVtvZmYgKyAxXTsKKyAgd2lkdGggPSBkYXRhW29mZiArIDJdIDw8IDggfCBkYXRhW29mZiArIDNdOworICBvZmYgKz0gNDsKKworICBHU1RfTE9HX09CSkVDVCAocGF5LCAiZ290IGRpbWVuc2lvbnMgJXV4JXUiLCBoZWlnaHQsIHdpZHRoKTsKKworICBpZiAoaGVpZ2h0ID09IDApIHsKKyAgICBnb3RvIGludmFsaWRfZGltZW5zaW9uOworICB9CisgIGlmIChoZWlnaHQgPiAyMDQwKSB7CisgICAgaGVpZ2h0ID0gMDsKKyAgfQorICBpZiAod2lkdGggPT0gMCkgeworICAgIGdvdG8gaW52YWxpZF9kaW1lbnNpb247CisgIH0KKyAgaWYgKHdpZHRoID4gMjA0MCkgeworICAgIHdpZHRoID0gMDsKKyAgfQorCisgIGlmIChoZWlnaHQgPT0gMCB8fCB3aWR0aCA9PSAwKSB7CisgICAgcGF5LT5oZWlnaHQgPSAwOworICAgIHBheS0+d2lkdGggPSAwOworICB9IGVsc2UgeworICAgIHBheS0+aGVpZ2h0ID0gR1NUX1JPVU5EX1VQXzggKGhlaWdodCkgLyA4OworICAgIHBheS0+d2lkdGggPSBHU1RfUk9VTkRfVVBfOCAod2lkdGgpIC8gODsKKyAgfQorCisgIC8qIHdlIG9ubHkgc3VwcG9ydCAzIGNvbXBvbmVudHMgKi8KKyAgaWYgKGRhdGFbb2ZmKytdICE9IDMpCisgICAgZ290byBiYWRfY29tcG9uZW50czsKKworICBpbmZvbGVuID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgIGVsZW0uaWQgPSBkYXRhW29mZisrXTsKKyAgICBlbGVtLnNhbXAgPSBkYXRhW29mZisrXTsKKyAgICBlbGVtLnF0ID0gZGF0YVtvZmYrK107CisgICAgR1NUX0xPR19PQkpFQ1QgKHBheSwgImdvdCBjb21wICVkLCBzYW1wICUwMngsIHF0ICVkIiwgZWxlbS5pZCwgZWxlbS5zYW1wLAorICAgICAgICBlbGVtLnF0KTsKKyAgICAvKiBpbnNlcnRpb24gc29ydCBmcm9tIHRoZSBsYXN0IGVsZW1lbnQgdG8gdGhlIGZpcnN0ICovCisgICAgZm9yIChqID0gaW5mb2xlbjsgaiA+IDE7IGotLSkgeworICAgICAgaWYgKEdfTElLRUxZIChpbmZvW2ogLSAxXS5pZCA8IGVsZW0uaWQpKQorICAgICAgICBicmVhazsKKyAgICAgIGluZm9bal0gPSBpbmZvW2ogLSAxXTsKKyAgICB9CisgICAgaW5mb1tqXSA9IGVsZW07CisgICAgaW5mb2xlbisrOworICB9CisKKyAgLyogc2VlIHRoYXQgdGhlIGNvbXBvbmVudHMgYXJlIHN1cHBvcnRlZCAqLworICBpZiAoaW5mb1swXS5zYW1wID09IDB4MjEpCisgICAgcGF5LT50eXBlID0gMDsKKyAgZWxzZSBpZiAoaW5mb1swXS5zYW1wID09IDB4MjIpCisgICAgcGF5LT50eXBlID0gMTsKKyAgZWxzZQorICAgIGdvdG8gaW52YWxpZF9jb21wOworCisgIGlmICghKGluZm9bMV0uc2FtcCA9PSAweDExKSkKKyAgICBnb3RvIGludmFsaWRfY29tcDsKKworICBpZiAoIShpbmZvWzJdLnNhbXAgPT0gMHgxMSkpCisgICAgZ290byBpbnZhbGlkX2NvbXA7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCit3cm9uZ19zaXplOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocGF5LCBTVFJFQU0sIEZPUk1BVCwKKyAgICAgICAgKCJXcm9uZyBzaXplICV1IChuZWVkZWQgJXUpLiIsIHNpemUsIG9mZiArIDE3KSwgKE5VTEwpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3dyb25nX2xlbmd0aDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHBheSwgU1RSRUFNLCBGT1JNQVQsCisgICAgICAgICgiV3JvbmcgU09GIGxlbmd0aCAldS4iLCBzb2Zfc2l6ZSksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitiYWRfcHJlY2lzaW9uOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocGF5LCBTVFJFQU0sIEZPUk1BVCwKKyAgICAgICAgKCJXcm9uZyBwcmVjaXNpb24sIGV4cGVjdGluZyA4LiIpLCAoTlVMTCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQoraW52YWxpZF9kaW1lbnNpb246CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChwYXksIFNUUkVBTSwgRk9STUFULAorICAgICAgICAoIldyb25nIGRpbWVuc2lvbiwgc2l6ZSAldXgldSIsIHdpZHRoLCBoZWlnaHQpLCAoTlVMTCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorYmFkX2NvbXBvbmVudHM6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChwYXksIFNUUkVBTSwgRk9STUFULAorICAgICAgICAoIldyb25nIG51bWJlciBvZiBjb21wb25lbnRzIiksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbnZhbGlkX2NvbXA6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChwYXksIFNUUkVBTSwgRk9STUFULCAoIkludmFsaWQgY29tcG9uZW50IiksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9qcGVnX3BheV9yZWFkX2RyaSAoR3N0UnRwSlBFR1BheSAqIHBheSwgY29uc3QgZ3VpbnQ4ICogZGF0YSwKKyAgICBndWludCBzaXplLCBndWludCAqIG9mZnNldCwgUnRwUmVzdGFydE1hcmtlckhlYWRlciAqIGRyaSkKK3sKKyAgZ3VpbnQgZHJpX3NpemUsIG9mZjsKKworICBvZmYgPSAqb2Zmc2V0OworCisgIC8qIHdlIG5lZWQgYXQgbGVhc3QgNCBieXRlcyBmb3IgdGhlIERSSSAqLworICBpZiAob2ZmICsgNCA+IHNpemUpCisgICAgZ290byB3cm9uZ19zaXplOworCisgIGRyaV9zaXplID0gZ3N0X3J0cF9qcGVnX3BheV9oZWFkZXJfc2l6ZSAoZGF0YSwgb2ZmKTsKKyAgaWYgKGRyaV9zaXplIDwgNCkKKyAgICBnb3RvIHdyb25nX2xlbmd0aDsKKworICAqb2Zmc2V0ICs9IGRyaV9zaXplOworICBvZmYgKz0gMjsKKworICBkcmktPnJlc3RhcnRfaW50ZXJ2YWwgPSBnX2h0b25zICgoZGF0YVtvZmZdIDw8IDgpIHwgKGRhdGFbb2ZmICsgMV0pKTsKKyAgZHJpLT5yZXN0YXJ0X2NvdW50ID0gZ19odG9ucyAoMHhGRkZGKTsKKworICByZXR1cm4gZHJpLT5yZXN0YXJ0X2ludGVydmFsID4gMDsKKword3Jvbmdfc2l6ZToKKyAgeworICAgIEdTVF9XQVJOSU5HICgibm90IGVub3VnaCBkYXRhIGZvciBEUkkiKTsKKyAgICAqb2Zmc2V0ID0gc2l6ZTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3dyb25nX2xlbmd0aDoKKyAgeworICAgIEdTVF9XQVJOSU5HICgiRFJJIHNpemUgdG9vIHNtYWxsICgldSkiLCBkcmlfc2l6ZSk7CisgICAgKm9mZnNldCArPSBkcmlfc2l6ZTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIFJ0cEpwZWdNYXJrZXIKK2dzdF9ydHBfanBlZ19wYXlfc2Nhbl9tYXJrZXIgKGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsIGd1aW50ICogb2Zmc2V0KQoreworICB3aGlsZSAoKGRhdGFbKCpvZmZzZXQpKytdICE9IEpQRUdfTUFSS0VSKSAmJiAoKCpvZmZzZXQpIDwgc2l6ZSkpOworCisgIGlmIChHX1VOTElLRUxZICgoKm9mZnNldCkgPj0gc2l6ZSkpIHsKKyAgICBHU1RfTE9HICgiZm91bmQgRU9JIG1hcmtlciIpOworICAgIHJldHVybiBKUEVHX01BUktFUl9FT0k7CisgIH0gZWxzZSB7CisgICAgZ3VpbnQ4IG1hcmtlcjsKKworICAgIG1hcmtlciA9IGRhdGFbKm9mZnNldF07CisgICAgR1NUX0xPRyAoImZvdW5kIDB4JTAyeCBtYXJrZXIgYXQgb2Zmc2V0ICV1IiwgbWFya2VyLCAqb2Zmc2V0KTsKKyAgICAoKm9mZnNldCkrKzsKKyAgICByZXR1cm4gbWFya2VyOworICB9Cit9CisKKyNkZWZpbmUgUlRQX0hFQURFUl9MRU4gMTIKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfanBlZ19wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJ0cEpQRUdQYXkgKnBheTsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgUnRwSnBlZ0hlYWRlciBqcGVnX2hlYWRlcjsKKyAgUnRwUXVhbnRIZWFkZXIgcXVhbnRfaGVhZGVyOworICBSdHBSZXN0YXJ0TWFya2VySGVhZGVyIHJlc3RhcnRfbWFya2VyX2hlYWRlcjsKKyAgUnRwUXVhbnRUYWJsZSB0YWJsZXNbMTVdID0geyB7MCwgTlVMTH0sIH07CisgIENvbXBJbmZvIGluZm9bM10gPSB7IHswLH0sIH07CisgIGd1aW50IHF1YW50X2RhdGFfc2l6ZTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3NpemUgc2l6ZTsKKyAgZ3VpbnQgbXR1LCBtYXhfcGF5bG9hZF9zaXplOworICBndWludCBieXRlc19sZWZ0OworICBndWludCBqcGVnX2hlYWRlcl9zaXplID0gMDsKKyAgZ3VpbnQgb2Zmc2V0OworICBnYm9vbGVhbiBmcmFtZV9kb25lOworICBnYm9vbGVhbiBzb3NfZm91bmQsIHNvZl9mb3VuZCwgZHF0X2ZvdW5kLCBkcmlfZm91bmQ7CisgIGdpbnQgaTsKKyAgR3N0QnVmZmVyTGlzdCAqbGlzdCA9IE5VTEw7CisgIGdib29sZWFuIGRpc2NvbnQ7CisKKyAgcGF5ID0gR1NUX1JUUF9KUEVHX1BBWSAoYmFzZXBheWxvYWQpOworICBtdHUgPSBHU1RfUlRQX0JBU0VfUEFZTE9BRF9NVFUgKHBheSk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworICBzaXplID0gbWFwLnNpemU7CisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworICBvZmZzZXQgPSAwOworICBkaXNjb250ID0gR1NUX0JVRkZFUl9JU19ESVNDT05UIChidWZmZXIpOworCisgIEdTVF9MT0dfT0JKRUNUIChwYXksICJnb3QgYnVmZmVyIHNpemUgJSIgR19HU0laRV9GT1JNQVQKKyAgICAgICIgLCB0aW1lc3RhbXAgJSIgR1NUX1RJTUVfRk9STUFULCBzaXplLCBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApKTsKKworICAvKiBwYXJzZSB0aGUganBlZyBoZWFkZXIgZm9yICdzdGFydCBvZiBzY2FuJyBhbmQgcmVhZCBxdWFudCB0YWJsZXMgaWYgbmVlZGVkICovCisgIHNvc19mb3VuZCA9IEZBTFNFOworICBkcXRfZm91bmQgPSBGQUxTRTsKKyAgc29mX2ZvdW5kID0gRkFMU0U7CisgIGRyaV9mb3VuZCA9IEZBTFNFOworCisgIHdoaWxlICghc29zX2ZvdW5kICYmIChvZmZzZXQgPCBzaXplKSkgeworICAgIGdpbnQgbWFya2VyOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHBheSwgImNoZWNraW5nIGZyb20gb2Zmc2V0ICV1Iiwgb2Zmc2V0KTsKKyAgICBzd2l0Y2ggKChtYXJrZXIgPSBnc3RfcnRwX2pwZWdfcGF5X3NjYW5fbWFya2VyIChkYXRhLCBzaXplLCAmb2Zmc2V0KSkpIHsKKyAgICAgIGNhc2UgSlBFR19NQVJLRVJfSkZJRjoKKyAgICAgIGNhc2UgSlBFR19NQVJLRVJfQ01UOgorICAgICAgY2FzZSBKUEVHX01BUktFUl9ESFQ6CisgICAgICBjYXNlIEpQRUdfTUFSS0VSX0gyNjQ6CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwYXksICJza2lwcGluZyBtYXJrZXIiKTsKKyAgICAgICAgb2Zmc2V0ICs9IGdzdF9ydHBfanBlZ19wYXlfaGVhZGVyX3NpemUgKGRhdGEsIG9mZnNldCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBKUEVHX01BUktFUl9TT0Y6CisgICAgICAgIGlmICghZ3N0X3J0cF9qcGVnX3BheV9yZWFkX3NvZiAocGF5LCBkYXRhLCBzaXplLCAmb2Zmc2V0LCBpbmZvLCB0YWJsZXMsCisgICAgICAgICAgICAgICAgR19OX0VMRU1FTlRTICh0YWJsZXMpKSkKKyAgICAgICAgICBnb3RvIGludmFsaWRfZm9ybWF0OworICAgICAgICBzb2ZfZm91bmQgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSlBFR19NQVJLRVJfRFFUOgorICAgICAgICBHU1RfTE9HICgiRFFUIGZvdW5kIik7CisgICAgICAgIG9mZnNldCA9IGdzdF9ydHBfanBlZ19wYXlfcmVhZF9xdWFudF90YWJsZSAoZGF0YSwgc2l6ZSwgb2Zmc2V0LCB0YWJsZXMpOworICAgICAgICBkcXRfZm91bmQgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSlBFR19NQVJLRVJfU09TOgorICAgICAgICBzb3NfZm91bmQgPSBUUlVFOworICAgICAgICBHU1RfTE9HX09CSkVDVCAocGF5LCAiU09TIGZvdW5kIik7CisgICAgICAgIGpwZWdfaGVhZGVyX3NpemUgPSBvZmZzZXQgKyBnc3RfcnRwX2pwZWdfcGF5X2hlYWRlcl9zaXplIChkYXRhLCBvZmZzZXQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSlBFR19NQVJLRVJfRU9JOgorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBheSwgIkVPSSByZWFjaGVkIGJlZm9yZSBTT1MhIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBKUEVHX01BUktFUl9TT0k6CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwYXksICJTT0kgZm91bmQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEpQRUdfTUFSS0VSX0RSSToKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBheSwgIkRSSSBmb3VuZCIpOworICAgICAgICBpZiAoZ3N0X3J0cF9qcGVnX3BheV9yZWFkX2RyaSAocGF5LCBkYXRhLCBzaXplLCAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICZyZXN0YXJ0X21hcmtlcl9oZWFkZXIpKQorICAgICAgICAgIGRyaV9mb3VuZCA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKG1hcmtlciA9PSBKUEVHX01BUktFUl9KUEcgfHwKKyAgICAgICAgICAgIChtYXJrZXIgPj0gSlBFR19NQVJLRVJfSlBHMCAmJiBtYXJrZXIgPD0gSlBFR19NQVJLRVJfSlBHMTMpIHx8CisgICAgICAgICAgICAobWFya2VyID49IEpQRUdfTUFSS0VSX0FQUDAgJiYgbWFya2VyIDw9IEpQRUdfTUFSS0VSX0FQUDE1KSkgeworICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwYXksICJza2lwcGluZyBtYXJrZXIiKTsKKyAgICAgICAgICBvZmZzZXQgKz0gZ3N0X3J0cF9qcGVnX3BheV9oZWFkZXJfc2l6ZSAoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfRklYTUVfT0JKRUNUIChwYXksICJ1bmhhbmRsZWQgbWFya2VyIDB4JTAyeCIsIG1hcmtlcik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmICghZHF0X2ZvdW5kIHx8ICFzb2ZfZm91bmQpCisgICAgZ290byB1bnN1cHBvcnRlZF9qcGVnOworCisgIC8qIGJ5IG5vdyB3ZSBzaG91bGQgZWl0aGVyIGhhdmUgbmVnb3RpYXRlZCB0aGUgd2lkdGgvaGVpZ2h0IG9yIHRoZSBTT0YgaGVhZGVyCisgICAqIHNob3VsZCBoYXZlIGZpbGxlZCB1cyBpbiAqLworICBpZiAocGF5LT53aWR0aCA8IDAgfHwgcGF5LT5oZWlnaHQgPCAwKSB7CisgICAgZ290byBub19kaW1lbnNpb247CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocGF5LCAiaGVhZGVyIHNpemUgJXUiLCBqcGVnX2hlYWRlcl9zaXplKTsKKworICBzaXplIC09IGpwZWdfaGVhZGVyX3NpemU7CisgIGRhdGEgKz0ganBlZ19oZWFkZXJfc2l6ZTsKKyAgb2Zmc2V0ID0gMDsKKworICBpZiAoZHJpX2ZvdW5kKQorICAgIHBheS0+dHlwZSArPSA2NDsKKworICAvKiBwcmVwYXJlIHN0dWZmIGZvciB0aGUganBlZyBoZWFkZXIgKi8KKyAganBlZ19oZWFkZXIudHlwZV9zcGVjID0gMDsKKyAganBlZ19oZWFkZXIudHlwZSA9IHBheS0+dHlwZTsKKyAganBlZ19oZWFkZXIucSA9IHBheS0+cXVhbnQ7CisgIGpwZWdfaGVhZGVyLndpZHRoID0gcGF5LT53aWR0aDsKKyAganBlZ19oZWFkZXIuaGVpZ2h0ID0gcGF5LT5oZWlnaHQ7CisKKyAgLyogY29sbGVjdCB0aGUgcXVhbnQgaGVhZGVycyBzaXplcyAqLworICBxdWFudF9oZWFkZXIubWJ6ID0gMDsKKyAgcXVhbnRfaGVhZGVyLnByZWNpc2lvbiA9IDA7CisgIHF1YW50X2hlYWRlci5sZW5ndGggPSAwOworICBxdWFudF9kYXRhX3NpemUgPSAwOworCisgIGlmIChwYXktPnF1YW50ID4gMTI3KSB7CisgICAgLyogZm9yIHRoZSBZIGFuZCBVIGNvbXBvbmVudCwgbG9vayB1cCB0aGUgcXVhbnQgdGFibGUgYW5kIGl0cyBzaXplLiBxdWFudAorICAgICAqIHRhYmxlcyBmb3IgVSBhbmQgViBzaG91bGQgYmUgdGhlIHNhbWUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICBndWludCBxc2l6ZTsKKyAgICAgIGd1aW50IHF0OworCisgICAgICBxdCA9IGluZm9baV0ucXQ7CisgICAgICBpZiAocXQgPj0gR19OX0VMRU1FTlRTICh0YWJsZXMpKQorICAgICAgICBnb3RvIGludmFsaWRfcXVhbnQ7CisKKyAgICAgIHFzaXplID0gdGFibGVzW3F0XS5zaXplOworICAgICAgaWYgKHFzaXplID09IDApCisgICAgICAgIGdvdG8gaW52YWxpZF9xdWFudDsKKworICAgICAgcXVhbnRfaGVhZGVyLnByZWNpc2lvbiB8PSAocXNpemUgPT0gNjQgPyAwIDogKDEgPDwgaSkpOworICAgICAgcXVhbnRfZGF0YV9zaXplICs9IHFzaXplOworICAgIH0KKyAgICBxdWFudF9oZWFkZXIubGVuZ3RoID0gZ19odG9ucyAocXVhbnRfZGF0YV9zaXplKTsKKyAgICBxdWFudF9kYXRhX3NpemUgKz0gc2l6ZW9mIChxdWFudF9oZWFkZXIpOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBheSwgInF1YW50X2RhdGEgc2l6ZSAldSIsIHF1YW50X2RhdGFfc2l6ZSk7CisKKyAgYnl0ZXNfbGVmdCA9IHNpemVvZiAoanBlZ19oZWFkZXIpICsgcXVhbnRfZGF0YV9zaXplICsgc2l6ZTsKKworICBpZiAoZHJpX2ZvdW5kKQorICAgIGJ5dGVzX2xlZnQgKz0gc2l6ZW9mIChyZXN0YXJ0X21hcmtlcl9oZWFkZXIpOworCisgIG1heF9wYXlsb2FkX3NpemUgPSBtdHUgLSAoUlRQX0hFQURFUl9MRU4gKyBzaXplb2YgKGpwZWdfaGVhZGVyKSk7CisgIGxpc3QgPSBnc3RfYnVmZmVyX2xpc3RfbmV3X3NpemVkICgoYnl0ZXNfbGVmdCAvIG1heF9wYXlsb2FkX3NpemUpICsgMSk7CisKKyAgZnJhbWVfZG9uZSA9IEZBTFNFOworICBkbyB7CisgICAgR3N0QnVmZmVyICpvdXRidWY7CisgICAgZ3VpbnQ4ICpwYXlsb2FkOworICAgIGd1aW50IHBheWxvYWRfc2l6ZTsKKyAgICBndWludCBoZWFkZXJfc2l6ZTsKKyAgICBHc3RCdWZmZXIgKnBheWJ1ZjsKKyAgICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisgICAgZ3VpbnQgcnRwX2hlYWRlcl9zaXplID0gZ3N0X3J0cF9idWZmZXJfY2FsY19oZWFkZXJfbGVuICgwKTsKKworICAgIC8qIFRoZSBhdmFpbGFibGUgcm9vbSBpcyB0aGUgcGFja2V0IE1UVSwgbWludXMgdGhlIFJUUCBoZWFkZXIgbGVuZ3RoLiAqLworICAgIHBheWxvYWRfc2l6ZSA9CisgICAgICAgIChieXRlc19sZWZ0IDwgKG10dSAtIHJ0cF9oZWFkZXJfc2l6ZSkgPyBieXRlc19sZWZ0IDoKKyAgICAgICAgKG10dSAtIHJ0cF9oZWFkZXJfc2l6ZSkpOworCisgICAgaGVhZGVyX3NpemUgPSBzaXplb2YgKGpwZWdfaGVhZGVyKSArIHF1YW50X2RhdGFfc2l6ZTsKKyAgICBpZiAoZHJpX2ZvdW5kKQorICAgICAgaGVhZGVyX3NpemUgKz0gc2l6ZW9mIChyZXN0YXJ0X21hcmtlcl9oZWFkZXIpOworCisgICAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChoZWFkZXJfc2l6ZSwgMCwgMCk7CisKKyAgICBnc3RfcnRwX2J1ZmZlcl9tYXAgKG91dGJ1ZiwgR1NUX01BUF9XUklURSwgJnJ0cCk7CisKKyAgICBpZiAocGF5bG9hZF9zaXplID09IGJ5dGVzX2xlZnQpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChwYXksICJsYXN0IHBhY2tldCBvZiBmcmFtZSIpOworICAgICAgZnJhbWVfZG9uZSA9IFRSVUU7CisgICAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCAxKTsKKyAgICB9CisKKyAgICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHApOworCisgICAgLyogdXBkYXRlIG9mZnNldCAqLworI2lmIChHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOKQorICAgIGpwZWdfaGVhZGVyLm9mZnNldCA9ICgob2Zmc2V0ICYgMHgwMDAwRkYpIDw8IDE2KSB8CisgICAgICAgICgob2Zmc2V0ICYgMHhGRjAwMDApID4+IDE2KSB8IChvZmZzZXQgJiAweDAwRkYwMCk7CisjZWxzZQorICAgIGpwZWdfaGVhZGVyLm9mZnNldCA9IG9mZnNldDsKKyNlbmRpZgorICAgIG1lbWNweSAocGF5bG9hZCwgJmpwZWdfaGVhZGVyLCBzaXplb2YgKGpwZWdfaGVhZGVyKSk7CisgICAgcGF5bG9hZCArPSBzaXplb2YgKGpwZWdfaGVhZGVyKTsKKyAgICBwYXlsb2FkX3NpemUgLT0gc2l6ZW9mIChqcGVnX2hlYWRlcik7CisKKyAgICBpZiAoZHJpX2ZvdW5kKSB7CisgICAgICBtZW1jcHkgKHBheWxvYWQsICZyZXN0YXJ0X21hcmtlcl9oZWFkZXIsIHNpemVvZiAocmVzdGFydF9tYXJrZXJfaGVhZGVyKSk7CisgICAgICBwYXlsb2FkICs9IHNpemVvZiAocmVzdGFydF9tYXJrZXJfaGVhZGVyKTsKKyAgICAgIHBheWxvYWRfc2l6ZSAtPSBzaXplb2YgKHJlc3RhcnRfbWFya2VyX2hlYWRlcik7CisgICAgfQorCisgICAgLyogb25seSBzZW5kIHF1YW50IHRhYmxlIHdpdGggZmlyc3QgcGFja2V0ICovCisgICAgaWYgKEdfVU5MSUtFTFkgKHF1YW50X2RhdGFfc2l6ZSA+IDApKSB7CisgICAgICBtZW1jcHkgKHBheWxvYWQsICZxdWFudF9oZWFkZXIsIHNpemVvZiAocXVhbnRfaGVhZGVyKSk7CisgICAgICBwYXlsb2FkICs9IHNpemVvZiAocXVhbnRfaGVhZGVyKTsKKworICAgICAgLyogY29weSB0aGUgcXVhbnQgdGFibGVzIGZvciBsdW1hIGFuZCBjaHJvbWluYW5jZSAqLworICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBndWludCBxc2l6ZTsKKyAgICAgICAgZ3VpbnQgcXQ7CisKKyAgICAgICAgcXQgPSBpbmZvW2ldLnF0OworICAgICAgICBxc2l6ZSA9IHRhYmxlc1txdF0uc2l6ZTsKKyAgICAgICAgbWVtY3B5IChwYXlsb2FkLCB0YWJsZXNbcXRdLmRhdGEsIHFzaXplKTsKKworICAgICAgICBHU1RfTE9HX09CSkVDVCAocGF5LCAiY29tcG9uZW50ICVkIHVzaW5nIHF1YW50ICVkLCBzaXplICVkIiwgaSwgcXQsCisgICAgICAgICAgICBxc2l6ZSk7CisKKyAgICAgICAgcGF5bG9hZCArPSBxc2l6ZTsKKyAgICAgIH0KKyAgICAgIHBheWxvYWRfc2l6ZSAtPSBxdWFudF9kYXRhX3NpemU7CisgICAgICBieXRlc19sZWZ0IC09IHF1YW50X2RhdGFfc2l6ZTsKKyAgICAgIHF1YW50X2RhdGFfc2l6ZSA9IDA7CisgICAgfQorICAgIEdTVF9MT0dfT0JKRUNUIChwYXksICJzZW5kaW5nIHBheWxvYWQgc2l6ZSAlZCIsIHBheWxvYWRfc2l6ZSk7CisgICAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgICAgLyogY3JlYXRlIGEgbmV3IGJ1ZiB0byBob2xkIHRoZSBwYXlsb2FkICovCisgICAgcGF5YnVmID0gZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAoYnVmZmVyLCBHU1RfQlVGRkVSX0NPUFlfQUxMLAorICAgICAgICBqcGVnX2hlYWRlcl9zaXplICsgb2Zmc2V0LCBwYXlsb2FkX3NpemUpOworCisgICAgLyogam9pbiBtZW1vcnkgcGFydHMgKi8KKyAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocGF5LCBvdXRidWYsIHBheWJ1Zik7CisgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKG91dGJ1ZiwgcGF5YnVmKTsKKworICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gdGltZXN0YW1wOworCisgICAgaWYgKGRpc2NvbnQpIHsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgICAgLyogT25seSB0aGUgZmlyc3Qgb3V0cHV0dGVkIGJ1ZmZlciBoYXMgdGhlIERJU0NPTlQgZmxhZyAqLworICAgICAgZGlzY29udCA9IEZBTFNFOworICAgIH0KKworICAgIC8qIGFuZCBhZGQgdG8gbGlzdCAqLworICAgIGdzdF9idWZmZXJfbGlzdF9pbnNlcnQgKGxpc3QsIC0xLCBvdXRidWYpOworCisgICAgYnl0ZXNfbGVmdCAtPSBwYXlsb2FkX3NpemU7CisgICAgb2Zmc2V0ICs9IHBheWxvYWRfc2l6ZTsKKyAgICBkYXRhICs9IHBheWxvYWRfc2l6ZTsKKyAgfQorICB3aGlsZSAoIWZyYW1lX2RvbmUpOworCisgIC8qIHB1c2ggdGhlIHdob2xlIGJ1ZmZlciBsaXN0IGF0IG9uY2UgKi8KKyAgcmV0ID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfcHVzaF9saXN0IChiYXNlcGF5bG9hZCwgbGlzdCk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLwordW5zdXBwb3J0ZWRfanBlZzoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHBheSwgU1RSRUFNLCBGT1JNQVQsICgiVW5zdXBwb3J0ZWQgSlBFRyIpLCAoTlVMTCkpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK25vX2RpbWVuc2lvbjoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHBheSwgU1RSRUFNLCBGT1JNQVQsICgiTm8gc2l6ZSBnaXZlbiIpLCAoTlVMTCkpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK2ludmFsaWRfZm9ybWF0OgorICB7CisgICAgLyogZXJyb3Igd2FzIHBvc3RlZCAqLworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK2ludmFsaWRfcXVhbnQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChwYXksIFNUUkVBTSwgRk9STUFULCAoIkludmFsaWQgcXVhbnQgdGFibGVzIiksIChOVUxMKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9qcGVnX3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwSlBFR1BheSAqcnRwanBlZ3BheTsKKworICBydHBqcGVncGF5ID0gR1NUX1JUUF9KUEVHX1BBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfSlBFR19RVUFMSVRZOgorICAgICAgcnRwanBlZ3BheS0+cXVhbGl0eSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAob2JqZWN0LCAicXVhbGl0eSA9ICVkIiwgcnRwanBlZ3BheS0+cXVhbGl0eSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSlBFR19UWVBFOgorICAgICAgcnRwanBlZ3BheS0+dHlwZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAob2JqZWN0LCAidHlwZSA9ICVkIiwgcnRwanBlZ3BheS0+dHlwZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2pwZWdfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSdHBKUEVHUGF5ICpydHBqcGVncGF5OworCisgIHJ0cGpwZWdwYXkgPSBHU1RfUlRQX0pQRUdfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9KUEVHX1FVQUxJVFk6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBydHBqcGVncGF5LT5xdWFsaXR5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9KUEVHX1RZUEU6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBydHBqcGVncGF5LT50eXBlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfanBlZ19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBqcGVncGF5IiwgR1NUX1JBTktfU0VDT05EQVJZLAorICAgICAgR1NUX1RZUEVfUlRQX0pQRUdfUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwanBlZ3BheS5oIGIvZ3N0L3J0cC9nc3RydHBqcGVncGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2NWVhNwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwanBlZ3BheS5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA4IEF4aXMgQ29tbXVuaWNhdGlvbnMgPGRldi1nc3RyZWFtZXJAYXhpcy5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfSlBFR19QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9KUEVHX1BBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0pQRUdfUEFZIFwKKyAgKGdzdF9ydHBfanBlZ19wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9KUEVHX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9KUEVHX1BBWSxHc3RSdHBKUEVHUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9KUEVHX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSlBFR19QQVksR3N0UnRwSlBFR1BheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9KUEVHX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9KUEVHX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfSlBFR19QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0pQRUdfUEFZKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBKUEVHUGF5IEdzdFJ0cEpQRUdQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSlBFR1BheUNsYXNzIEdzdFJ0cEpQRUdQYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBKUEVHUGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkIHBheWxvYWQ7CisKKyAgZ3VpbnQ4IHF1YWxpdHk7CisgIGd1aW50OCB0eXBlOworCisgIGdpbnQgaGVpZ2h0OworICBnaW50IHdpZHRoOworCisgIGd1aW50OCBxdWFudDsKK307CisKK3N0cnVjdCBfR3N0UnRwSlBFR1BheUNsYXNzCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9qcGVnX3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfanBlZ19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYgLyogX19HU1RfUlRQX0pQRUdfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBrbHZkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBrbHZkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNGY2YWEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGtsdmRlcGF5LmMKQEAgLTAsMCArMSwzOTcgQEAKKy8qIEdTdHJlYW1lciBSVFAgS0xWIERlcGF5bG9hZGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPj4KKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IENlbnRyaWN1bGFyIEx0ZAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cGtsdmRlcGF5CisgKiBAc2VlX2Fsc286IHJ0cGtsdnBheQorICoKKyAqIEV4dHJhY3QgS0xWIG1ldGFkYXRhIGZyb20gUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQyA2NTk3LgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjU5NworICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB1ZHBzcmMgY2Fwcz0nYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXBwbGljYXRpb24sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKVNNUFRFMzM2TScgISBydHBrbHZkZXBheSAhIGZha2VzaW5rIGR1bXA9dHJ1ZQorICogXXwgVGhpcyBleGFtcGxlIHBpcGVsaW5lIHdpbGwgZGVwYXlsb2FkIGFuIFJUUCBLTFYgc3RyZWFtIGFuZCBkaXNwbGF5CisgKiBhIGhleGR1bXAgb2YgdGhlIEtMViBkYXRhIG9uIHN0ZG91dC4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdHJ0cGtsdmRlcGF5LmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoa2x2ZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKGtsdmRlcGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoIm1ldGEveC1rbHYsIHBhcnNlZCA9IChib29sKSB0cnVlIikpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIGFwcGxpY2F0aW9uLCBjbG9jay1yYXRlID0gKGludCkgWzEsIE1BWF0sICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBTTVBURTMzNk0iKQorICAgICk7CisKKyNkZWZpbmUgZ3N0X3J0cF9rbHZfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwS2x2RGVwYXksIGdzdF9ydHBfa2x2X2RlcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2tsdl9kZXBheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX2tsdl9kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKgorICAgIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfa2x2X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9rbHZfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfa2x2X2RlcGF5X2hhbmRsZV9ldmVudCAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5LAorICAgIEdzdEV2ZW50ICogZXYpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2tsdl9kZXBheV9yZXNldCAoR3N0UnRwS2x2RGVwYXkgKiBrbHZkZXBheSk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2tsdl9kZXBheV9jbGFzc19pbml0IChHc3RSdHBLbHZEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqcnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoa2x2ZGVwYXlfZGVidWcsICJrbHZkZXBheSIsIDAsCisgICAgICAiUlRQIEtMViBEZXBheWxvYWRlciIpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9rbHZfZGVwYXlfZmluYWxpemU7CisKKyAgZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3J0cF9rbHZfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBLTFYgRGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIEtMViAoU01QVEUgU1QgMzM2KSBtZXRhZGF0YSBmcm9tIFJUUCBwYWNrZXRzIiwKKyAgICAgICJUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPiIpOworCisgIHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9rbHZfZGVwYXlfc2V0Y2FwczsKKyAgcnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+cHJvY2Vzc19ydHBfcGFja2V0ID0gZ3N0X3J0cF9rbHZfZGVwYXlfcHJvY2VzczsKKyAgcnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2V2ZW50ID0gZ3N0X3J0cF9rbHZfZGVwYXlfaGFuZGxlX2V2ZW50OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9rbHZfZGVwYXlfaW5pdCAoR3N0UnRwS2x2RGVwYXkgKiBrbHZkZXBheSkKK3sKKyAga2x2ZGVwYXktPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2tsdl9kZXBheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwS2x2RGVwYXkgKmtsdmRlcGF5OworCisgIGtsdmRlcGF5ID0gR1NUX1JUUF9LTFZfREVQQVkgKG9iamVjdCk7CisKKyAgZ3N0X3J0cF9rbHZfZGVwYXlfcmVzZXQgKGtsdmRlcGF5KTsKKyAgZ19vYmplY3RfdW5yZWYgKGtsdmRlcGF5LT5hZGFwdGVyKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2tsdl9kZXBheV9yZXNldCAoR3N0UnRwS2x2RGVwYXkgKiBrbHZkZXBheSkKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAoa2x2ZGVwYXksICJyZXNldHRpbmciKTsKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGtsdmRlcGF5LT5hZGFwdGVyKTsKKyAga2x2ZGVwYXktPnJlc3luYyA9IFRSVUU7CisgIGtsdmRlcGF5LT5sYXN0X3J0cF90cyA9IC0xOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfa2x2X2RlcGF5X2hhbmRsZV9ldmVudCAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5LCBHc3RFdmVudCAqIGV2KQoreworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldikpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TVFJFQU1fU1RBUlQ6eworICAgICAgR3N0U3RyZWFtRmxhZ3MgZmxhZ3M7CisKKyAgICAgIGV2ID0gZ3N0X2V2ZW50X21ha2Vfd3JpdGFibGUgKGV2KTsKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9zdHJlYW1fZmxhZ3MgKGV2LCAmZmxhZ3MpOworICAgICAgZ3N0X2V2ZW50X3NldF9zdHJlYW1fZmxhZ3MgKGV2LCBmbGFncyB8IEdTVF9TVFJFQU1fRkxBR19TUEFSU0UpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBHU1RfUlRQX0JBU0VfREVQQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5oYW5kbGVfZXZlbnQgKGRlcGF5LCBldik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9rbHZfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgR3N0Q2FwcyAqc3JjX2NhcHM7CisgIGdib29sZWFuIHJlczsKKyAgZ2ludCBjbG9ja19yYXRlOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgc3JjX2NhcHMgPSBnc3Rfc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXRfY2FwcyAoJnNyY190ZW1wbGF0ZSk7CisgIHJlcyA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBzcmNfY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNfY2Fwcyk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitrbHZfZ2V0X3ZsZW4gKGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IGRhdGFfbGVuLCBndWludDY0ICogdl9sZW4sCisgICAgZ3NpemUgKiBsZW5fc2l6ZSkKK3sKKyAgZ3VpbnQ4IGZpcnN0X2J5dGUsIGxlbl9sZW47CisgIGd1aW50NjQgbGVuOworCisgIGdfYXNzZXJ0IChkYXRhX2xlbiA+IDApOworCisgIGZpcnN0X2J5dGUgPSAqZGF0YSsrOworCisgIGlmICgoZmlyc3RfYnl0ZSAmIDB4ODApID09IDApIHsKKyAgICAqdl9sZW4gPSBmaXJzdF9ieXRlICYgMHg3ZjsKKyAgICAqbGVuX3NpemUgPSAxOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgbGVuX2xlbiA9IGZpcnN0X2J5dGUgJiAweDdmOworCisgIGlmIChsZW5fbGVuID09IDAgfHwgbGVuX2xlbiA+IDgpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICgoMSArIGxlbl9sZW4pID4gZGF0YV9sZW4pCisgICAgcmV0dXJuIEZBTFNFOworCisgICpsZW5fc2l6ZSA9IDEgKyBsZW5fbGVuOworCisgIGxlbiA9IDA7CisgIHdoaWxlIChsZW5fbGVuID4gMCkgeworICAgIGxlbiA9IGxlbiA8PCA4IHwgKmRhdGErKzsKKyAgICAtLWxlbl9sZW47CisgIH0KKworICAqdl9sZW4gPSBsZW47CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9rbHZfZGVwYXlfcHJvY2Vzc19kYXRhIChHc3RSdHBLbHZEZXBheSAqIGtsdmRlcGF5KQoreworICBnc2l6ZSBhdmFpbCwgZGF0YV9sZW4sIGxlbl9zaXplOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ3VpbnQ4IGRhdGFbMSArIDhdOworICBndWludDY0IHZfbGVuOworCisgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChrbHZkZXBheS0+YWRhcHRlcik7CisKKyAgR1NUX1RSQUNFX09CSkVDVCAoa2x2ZGVwYXksICIlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIGluIGFkYXB0ZXIiLCBhdmFpbCk7CisKKyAgaWYgKGF2YWlsID09IDApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogbmVlZCBhdCBsZWFzdCAxNiBieXRlcyBvZiBVTCBrZXkgcGx1cyAxIGJ5dGUgb2YgbGVuZ3RoICovCisgIGlmIChhdmFpbCA8IDE2ICsgMSkKKyAgICBnb3RvIGJhZF9rbHZfcGFja2V0OworCisgIC8qIGNoZWNrIGlmIHRoZSBkZWNsYXJlZCBLTFYgdW5pdCBzaXplIG1hdGNoZXMgYWN0dWFsIGJ5dGVzIGF2YWlsYWJsZSAqLworICBkYXRhX2xlbiA9IE1JTiAoYXZhaWwgLSAxNiwgMSArIDgpOworICBnc3RfYWRhcHRlcl9jb3B5IChrbHZkZXBheS0+YWRhcHRlciwgZGF0YSwgMTYsIGRhdGFfbGVuKTsKKyAgaWYgKCFrbHZfZ2V0X3ZsZW4gKGRhdGEsIGRhdGFfbGVuLCAmdl9sZW4sICZsZW5fc2l6ZSkpCisgICAgZ290byBiYWRfa2x2X3BhY2tldDsKKworICBHU1RfTE9HX09CSkVDVCAoa2x2ZGVwYXksICJ3YW50ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBieXRlcywgIgorICAgICAgImhhdmUgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyIsIDE2ICsgbGVuX3NpemUgKyB2X2xlbiwgYXZhaWwpOworCisgIGlmIChhdmFpbCA8IDE2ICsgbGVuX3NpemUgKyB2X2xlbikKKyAgICBnb3RvIGluY29tcGxldGVfa2x2X3BhY2tldDsKKworICAvKiBzb21ldGhpbmcgaXMgd3JvbmcsIHRoaXMgc2hvdWxkbid0IGV2ZXIgaGFwcGVuICovCisgIGlmIChhdmFpbCA+IDE2ICsgbGVuX3NpemUgKyB2X2xlbikKKyAgICBnb3RvIGJhZF9rbHZfcGFja2V0OworCisgIG91dGJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChrbHZkZXBheS0+YWRhcHRlciwgYXZhaWwpOworCisgIC8qIE1hcmsgYnVmZmVycyBhcyBrZXkgdW5pdCB0byBzaWduYWwgdGhpcyBpcyB0aGUgc3RhcnQgb2YgYSBLTFYgdW5pdAorICAgKiAoZm9yIG5vdyBhbGwgYnVmZmVycyB3aWxsIGJlIGZsYWdnZWQgbGlrZSB0aGlzLCBzaW5jZSBhbGwgYnVmZmVycyBhcmUKKyAgICogc2VsZi1jb250YWluZWQgS0xWIHVuaXRzLCBidXQgaW4gZnV0dXJlIHRoYXQgbWlnaHQgY2hhbmdlKSAqLworICBvdXRidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKG91dGJ1Zik7CisgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisKKyAgcmV0dXJuIG91dGJ1ZjsKKworLyogRVJST1JTICovCitiYWRfa2x2X3BhY2tldDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoa2x2ZGVwYXksICJiYWQgS0xWIHBhY2tldCwgZHJvcHBpbmciKTsKKyAgICBnc3RfcnRwX2tsdl9kZXBheV9yZXNldCAoa2x2ZGVwYXkpOworICAgIHJldHVybiBOVUxMOworICB9CitpbmNvbXBsZXRlX2tsdl9wYWNrZXQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChrbHZkZXBheSwgInBhcnRpYWwgS0xWIHBhY2tldDogaGF2ZSAldSBieXRlcywgd2FudCAldSIsCisgICAgICAgIChndWludCkgYXZhaWwsIChndWludCkgKDE2ICsgbGVuX3NpemUgKyB2X2xlbikpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKKy8qIFdlJ3JlIHRyeWluZyB0byBiZSBwcmFnbWF0aWMgaGVyZSwgbm90IHF1aXRlIGFzIHN0cmljdCBhcyB0aGUgc3BlYyB3YW50cworICogdXMgdG8gYmUgd2l0aCByZWdhcmQgdG8gbWFya2VyIGJpdHMgYW5kIHJlc3luY2luZyBhZnRlciBwYWNrZXQgbG9zcyAqLworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX2tsdl9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cEtsdkRlcGF5ICprbHZkZXBheSA9IEdTVF9SVFBfS0xWX0RFUEFZIChkZXBheWxvYWQpOworICBHc3RCdWZmZXIgKnBheWxvYWQsICpvdXRidWYgPSBOVUxMOworICBnYm9vbGVhbiBtYXJrZXIsIHN0YXJ0ID0gRkFMU0UsIG1heWJlX3N0YXJ0OworICBndWludDMyIHJ0cF90czsKKyAgZ3VpbnQxNiBzZXE7CisgIGd1aW50IHBheWxvYWRfbGVuOworCisgIC8qIElnbm9yZSBESVNDT05UIG9uIGZpcnN0IGJ1ZmZlciBhbmQgb24gYnVmZmVycyBmb2xsb3dpbmcgYSBkaXNjb250ICovCisgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKHJ0cC0+YnVmZmVyKSAmJiBrbHZkZXBheS0+bGFzdF9ydHBfdHMgIT0gLTEpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGtsdmRlcGF5LCAiRElTQ09OVCwgbmVlZCB0byByZXN5bmMiKTsKKyAgICBnc3RfcnRwX2tsdl9kZXBheV9yZXNldCAoa2x2ZGVwYXkpOworICB9CisKKyAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisKKyAgLyogbWFya2VyIGJpdCBzaWduYWxzIGxhc3QgZnJhZ21lbnQgb2YgYSBLTFYgdW5pdCAqLworICBtYXJrZXIgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApOworCisgIHNlcSA9IGdzdF9ydHBfYnVmZmVyX2dldF9zZXEgKHJ0cCk7CisKKyAgLyogcGFja2V0IGRpcmVjdGx5IGFmdGVyIG9uZSB3aXRoIG1hcmtlciBiaXQgc2V0ID0+IHN0YXJ0ICovCisgIHN0YXJ0ID0ga2x2ZGVwYXktPmxhc3RfbWFya2VyX3NlcSAhPSAtMQorICAgICAgJiYgZ3N0X3J0cF9idWZmZXJfY29tcGFyZV9zZXFudW0gKGtsdmRlcGF5LT5sYXN0X21hcmtlcl9zZXEsIHNlcSkgPT0gMTsKKworICAvKiBkZWR1Y2Ugc3RhcnQgb2YgbmV3IEtMViB1bml0IGluIGNhc2Ugc2VuZGVyIGRvZXNuJ3Qgc2V0IG1hcmtlciBiaXRzCisgICAqIChpdCdzIG5vdCBsaWtlIHRoZSBzcGVjIGlzIGFtYmlndW91cyBhYm91dCB0aGF0LCBidXQgd2hhdCBjYW4geW91IGRvKSAqLworICBydHBfdHMgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wIChydHApOworCisgIG1heWJlX3N0YXJ0ID0ga2x2ZGVwYXktPmxhc3RfcnRwX3RzID09IC0xIHx8IGtsdmRlcGF5LT5sYXN0X3J0cF90cyAhPSBydHBfdHM7CisKKyAga2x2ZGVwYXktPmxhc3RfcnRwX3RzID0gcnRwX3RzOworCisgIC8qIGZhbGxiYWNrIHRvIGRldGVjdCBzZWxmLWNvbnRhaW5lZCBzaW5nbGUgS0xWIHVuaXQgKHVzdWFsIGNhc2UpICovCisgIGlmICgoIXN0YXJ0IHx8ICFtYXJrZXIgfHwgbWF5YmVfc3RhcnQpICYmIHBheWxvYWRfbGVuID4gMTYpIHsKKyAgICBjb25zdCBndWludDggKmRhdGE7CisgICAgZ3VpbnQ2NCB2X2xlbjsKKyAgICBnc2l6ZSBsZW5fc2l6ZTsKKworICAgIGRhdGEgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAocnRwKTsKKyAgICBpZiAoR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhKSA9PSAweDA2MGUyYjM0ICYmCisgICAgICAgIGtsdl9nZXRfdmxlbiAoZGF0YSArIDE2LCBwYXlsb2FkX2xlbiAtIDE2LCAmdl9sZW4sICZsZW5fc2l6ZSkpIHsKKyAgICAgIGlmICgxNiArIGxlbl9zaXplICsgdl9sZW4gPT0gcGF5bG9hZF9sZW4pIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGtsdmRlcGF5LCAiTG9va3MgbGlrZSBhIHNlbGYtY29udGFpbmVkIEtMViB1bml0Iik7CisgICAgICAgIG1hcmtlciA9IFRSVUU7CisgICAgICAgIHN0YXJ0ID0gVFJVRTsKKyAgICAgIH0gZWxzZSBpZiAoMTYgKyBsZW5fc2l6ZSArIHZfbGVuID4gcGF5bG9hZF9sZW4pIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGtsdmRlcGF5LAorICAgICAgICAgICAgIkxvb2tzIGxpa2UgdGhlIHN0YXJ0IG9mIGEgZnJhZ21lbnRlZCBLTFYgdW5pdCIpOworICAgICAgICBzdGFydCA9IFRSVUU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgcGFja2V0IGFuZCBsb29rcyBsaWtlIGEgc3RhcnQsIGNsZWFyIHJlc3luYyBmbGFnICovCisgIGlmIChrbHZkZXBheS0+cmVzeW5jICYmIGtsdmRlcGF5LT5sYXN0X21hcmtlcl9zZXEgPT0gLTEgJiYgc3RhcnQpCisgICAga2x2ZGVwYXktPnJlc3luYyA9IEZBTFNFOworCisgIGlmIChtYXJrZXIpCisgICAga2x2ZGVwYXktPmxhc3RfbWFya2VyX3NlcSA9IHNlcTsKKworICBHU1RfTE9HX09CSkVDVCAoa2x2ZGVwYXksICJwYXlsb2FkIG9mICV1IGJ5dGVzLCBtYXJrZXI9JWQsIHN0YXJ0PSVkIiwKKyAgICAgIHBheWxvYWRfbGVuLCBtYXJrZXIsIHN0YXJ0KTsKKworICBpZiAoa2x2ZGVwYXktPnJlc3luYyAmJiAhc3RhcnQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChrbHZkZXBheSwgIkRyb3BwaW5nIGJ1ZmZlciwgd2FpdGluZyB0byByZXN5bmMiKTsKKworICAgIGlmIChtYXJrZXIpCisgICAgICBrbHZkZXBheS0+cmVzeW5jID0gRkFMU0U7CisKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBpZiAoc3RhcnQgJiYgIW1hcmtlcikKKyAgICBvdXRidWYgPSBnc3RfcnRwX2tsdl9kZXBheV9wcm9jZXNzX2RhdGEgKGtsdmRlcGF5KTsKKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfYnVmZmVyIChydHApOworICBnc3RfYWRhcHRlcl9wdXNoIChrbHZkZXBheS0+YWRhcHRlciwgcGF5bG9hZCk7CisKKyAgaWYgKG1hcmtlcikKKyAgICBvdXRidWYgPSBnc3RfcnRwX2tsdl9kZXBheV9wcm9jZXNzX2RhdGEgKGtsdmRlcGF5KTsKKworZG9uZToKKworICByZXR1cm4gb3V0YnVmOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfa2x2X2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cEtsdkRlcGF5ICprbHZkZXBheTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIGtsdmRlcGF5ID0gR1NUX1JUUF9LTFZfREVQQVkgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfcnRwX2tsdl9kZXBheV9yZXNldCAoa2x2ZGVwYXkpOworICAgICAga2x2ZGVwYXktPmxhc3RfbWFya2VyX3NlcSA9IC0xOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9ydHBfa2x2X2RlcGF5X3Jlc2V0IChrbHZkZXBheSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfa2x2X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwa2x2ZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfS0xWX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwa2x2ZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwa2x2ZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWEyNTZkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBrbHZkZXBheS5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qIEdTdHJlYW1lciBSVFAgS0xWIERlcGF5bG9hZGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPj4KKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IENlbnRyaWN1bGFyIEx0ZAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0tMVl9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0tMVl9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfS0xWX0RFUEFZIFwKKyAgKGdzdF9ydHBfa2x2X2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfS0xWX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0tMVl9ERVBBWSxHc3RSdHBLbHZEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfS0xWX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9LTFZfREVQQVksR3N0UnRwS2x2RGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfS0xWX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0tMVl9ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfS0xWX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9LTFZfREVQQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwS2x2RGVwYXkgR3N0UnRwS2x2RGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwS2x2RGVwYXlDbGFzcyBHc3RSdHBLbHZEZXBheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cEtsdkRlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisgIGdib29sZWFuICAgIHJlc3luYzsKKyAgZ2ludCAgICAgICAgbGFzdF9tYXJrZXJfc2VxOyAgIC8qIC0xIGlmIHVuc2V0LCBvdGhlcndpc2UgMC1HX01BWFVJTlQxNiAqLworICBnaW50NjQgICAgICBsYXN0X3J0cF90czsgICAgICAgLyogLTEgaWYgdW5zZXQsIG90aGVyd2lzZSAwLUdfTUFYVUlOVDMyICovCit9OworCitzdHJ1Y3QgX0dzdFJ0cEtsdkRlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dfR05VQ19JTlRFUk5BTCBHVHlwZSAgICAgZ3N0X3J0cF9rbHZfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitHX0dOVUNfSU5URVJOQUwgZ2Jvb2xlYW4gIGdzdF9ydHBfa2x2X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0tMVl9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwa2x2cGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGtsdnBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMDdkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGtsdnBheS5jCkBAIC0wLDAgKzEsMjA0IEBACisvKiBHU3RyZWFtZXIgUlRQIEtMViBQYXlsb2FkZXIKKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+PgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgQ2VudHJpY3VsYXIgTHRkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwa2x2cGF5CisgKiBAc2VlX2Fsc286IHJ0cGtsdmRlcGF5CisgKgorICogUGF5bG9hZHMgS0xWIG1ldGFkYXRhIGludG8gUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQyA2NTk3LgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjU5NworICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPXZpZGVvLXdpdGgta2x2LnRzICEgdHNkZW11eCAhIHJ0cGtsdnBheSAhIHVkcHNpbmsKKyAqIF18IFRoaXMgZXhhbXBsZSBwaXBlbGluZSB3aWxsIHBheWxvYWQgYW4gUlRQIEtMViBzdHJlYW0gZXh0cmFjdGVkIGZyb20gYW4KKyAqIE1QRUctVFMgc3RyZWFtIGFuZCBzZW5kIGl0IHZpYSBVRFAgdG8gYW4gUlRQIHJlY2VpdmVyLgorICogPC9yZWZzZWN0Mj4KKyAqLworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0cnRwa2x2cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChrbHZwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKGtsdnBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBhcHBsaWNhdGlvbiwgY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVhdLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgU01QVEUzMzZNIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoIm1ldGEveC1rbHYsIHBhcnNlZCA9IChib29sKSB0cnVlIikpOworCisjZGVmaW5lIGdzdF9ydHBfa2x2X3BheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBLbHZQYXksIGdzdF9ydHBfa2x2X3BheSwgR1NUX1RZUEVfUlRQX0JBU0VfUEFZTE9BRCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2tsdl9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXksCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9rbHZfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5LAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2tsdl9wYXlfY2xhc3NfaW5pdCAoR3N0UnRwS2x2UGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqcnRwYmFzZXBheV9jbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoa2x2cGF5X2RlYnVnLCAia2x2cGF5IiwgMCwgIlJUUCBLTFYgUGF5bG9hZGVyIik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIEtMViBQYXlsb2FkZXIiLCAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYXlsb2FkcyBLTFYgKFNNUFRFIFNUIDMzNikgbWV0YWRhdGEgYXMgUlRQIHBhY2tldHMiLAorICAgICAgIlRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+Iik7CisKKyAgcnRwYmFzZXBheV9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIHJ0cGJhc2VwYXlfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9rbHZfcGF5X3NldGNhcHM7CisgIHJ0cGJhc2VwYXlfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX2tsdl9wYXlfaGFuZGxlX2J1ZmZlcjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfa2x2X3BheV9pbml0IChHc3RSdHBLbHZQYXkgKiBrbHZwYXkpCit7CisgIC8qIG5vdGhpbmcgdG8gZG8gaGVyZSB5ZXQgKi8KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2tsdl9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXksIEdzdENhcHMgKiBjYXBzKQoreworICAvKiBGSVhNRTogYWxsb3cgb3RoZXIgY2xvY2sgcmF0ZXMgKi8KKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHBheSwgImFwcGxpY2F0aW9uIiwgVFJVRSwgIlNNUFRFMzM2TSIsCisgICAgICA5MDAwMCk7CisKKyAgcmV0dXJuIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChwYXksIE5VTEwpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9rbHZfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0QnVmZmVyTGlzdCAqbGlzdCA9IE5VTEw7CisgIEdzdFJ0cEtsdlBheSAqcGF5OworICBHc3RNYXBJbmZvIG1hcDsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBnc2l6ZSBvZmZzZXQ7CisgIGd1aW50IG10dSwgcnRwX2hlYWRlcl9zaXplLCBtYXhfcGF5bG9hZF9zaXplOworCisgIHBheSA9IEdTVF9SVFBfS0xWX1BBWSAoYmFzZXBheWxvYWQpOworICBtdHUgPSBHU1RfUlRQX0JBU0VfUEFZTE9BRF9NVFUgKGJhc2VwYXlsb2FkKTsKKworICBydHBfaGVhZGVyX3NpemUgPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX2hlYWRlcl9sZW4gKDApOworICBtYXhfcGF5bG9hZF9zaXplID0gbXR1IC0gcnRwX2hlYWRlcl9zaXplOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgaWYgKG1hcC5zaXplID09IDApCisgICAgZ290byBkb25lOworCisgIC8qIEtMViBjb2Rpbmcgc2hhbGwgdXNlIGFuZCBvbmx5IHVzZSBhIGZpeGVkIDE2LWJ5dGUgU01QVEUtYWRtaW5pc3RlcmVkCisgICAqIFVuaXZlcnNhbCBMYWJlbCwgYWNjb3JkaW5nIHRvIFNNUFRFIDI5OE0gYXMgS2V5IChSZWMuIElUVSBSLUJULjE2NTMtMSkgKi8KKyAgaWYgKG1hcC5zaXplIDwgMTYgfHwgR1NUX1JFQURfVUlOVDMyX0JFIChtYXAuZGF0YSkgIT0gMHgwNjBFMkIzNCkKKyAgICBnb3RvIGJhZF9pbnB1dDsKKworICBpZiAobWFwLnNpemUgPiBtYXhfcGF5bG9hZF9zaXplKQorICAgIGxpc3QgPSBnc3RfYnVmZmVyX2xpc3RfbmV3ICgpOworCisgIEdTVF9MT0dfT0JKRUNUIChwYXksICIlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIG9mIGRhdGEgdG8gcGF5bG9hZCIsCisgICAgICBtYXAuc2l6ZSk7CisKKyAgb2Zmc2V0ID0gMDsKKyAgd2hpbGUgKG9mZnNldCA8IG1hcC5zaXplKSB7CisgICAgR3N0QnVmZmVyICpwYXlsb2FkYnVmOworICAgIEdzdFJUUEJ1ZmZlciBydHAgPSB7IE5VTEwgfTsKKyAgICBndWludCBwYXlsb2FkX3NpemU7CisgICAgZ3VpbnQgYnl0ZXNfbGVmdDsKKworICAgIGJ5dGVzX2xlZnQgPSBtYXAuc2l6ZSAtIG9mZnNldDsKKyAgICBwYXlsb2FkX3NpemUgPSBNSU4gKGJ5dGVzX2xlZnQsIG1heF9wYXlsb2FkX3NpemUpOworCisgICAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlICgwLCAwLCAwKTsKKworICAgIGlmIChwYXlsb2FkX3NpemUgPT0gYnl0ZXNfbGVmdCkgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKHBheSwgImxhc3QgcGFja2V0IG9mIEtMViB1bml0Iik7CisgICAgICBnc3RfcnRwX2J1ZmZlcl9tYXAgKG91dGJ1ZiwgR1NUX01BUF9XUklURSwgJnJ0cCk7CisgICAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCAxKTsKKyAgICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgICB9CisKKyAgICBHU1RfTE9HX09CSkVDVCAocGF5LCAicGFja2V0IHdpdGggcGF5bG9hZCBzaXplICV1IiwgcGF5bG9hZF9zaXplKTsKKworICAgIGdzdF9ydHBfY29weV9tZXRhIChHU1RfRUxFTUVOVF9DQVNUIChwYXkpLCBvdXRidWYsIGJ1ZiwgMCk7CisKKyAgICBwYXlsb2FkYnVmID0gZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAoYnVmLCBHU1RfQlVGRkVSX0NPUFlfTUVNT1JZLAorICAgICAgICBvZmZzZXQsIHBheWxvYWRfc2l6ZSk7CisKKyAgICAvKiBqb2luIHJ0cCBoZWFkZXIgKyBwYXlsb2FkIG1lbW9yeSBwYXJ0cyAqLworICAgIG91dGJ1ZiA9IGdzdF9idWZmZXJfYXBwZW5kIChvdXRidWYsIHBheWxvYWRidWYpOworCisgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSBHU1RfQlVGRkVSX1BUUyAoYnVmKTsKKyAgICBHU1RfQlVGRkVSX0RUUyAob3V0YnVmKSA9IEdTVF9CVUZGRVJfRFRTIChidWYpOworCisgICAgLyogYW5kIGFkZCB0byBsaXN0ICovCisgICAgaWYgKGxpc3QgIT0gTlVMTCkKKyAgICAgIGdzdF9idWZmZXJfbGlzdF9pbnNlcnQgKGxpc3QsIC0xLCBvdXRidWYpOworCisgICAgb2Zmc2V0ICs9IHBheWxvYWRfc2l6ZTsKKyAgfQorCitkb25lOgorCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgaWYgKGxpc3QgIT0gTlVMTCkKKyAgICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoX2xpc3QgKGJhc2VwYXlsb2FkLCBsaXN0KTsKKyAgZWxzZSBpZiAob3V0YnVmICE9IE5VTEwpCisgICAgcmV0ID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfcHVzaCAoYmFzZXBheWxvYWQsIG91dGJ1Zik7CisKKyAgcmV0dXJuIHJldDsKKworLyogRVJST1JTICovCitiYWRfaW5wdXQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwYXksICJJbnB1dCBkb2Vzbid0IGxvb2sgbGlrZSBhIEtMViBwYWNrZXQsIGlnbm9yaW5nIik7CisgICAgZ290byBkb25lOworICB9Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2tsdl9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBrbHZwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfS0xWX1BBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGtsdnBheS5oIGIvZ3N0L3J0cC9nc3RydHBrbHZwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWU4MTM0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBrbHZwYXkuaApAQCAtMCwwICsxLDYwIEBACisvKiBHU3RyZWFtZXIgUlRQIEtMViBQYXlsb2FkZXIKKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+PgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgQ2VudHJpY3VsYXIgTHRkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfS0xWX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0tMVl9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvcnRwLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfS0xWX1BBWSBcCisgIChnc3RfcnRwX2tsdl9wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9LTFZfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0tMVl9QQVksR3N0UnRwS2x2UGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9LTFZfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9LTFZfUEFZLEdzdFJ0cEtsdlBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9LTFZfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0tMVl9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0tMVl9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0tMVl9QQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwS2x2UGF5IEdzdFJ0cEtsdlBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBLbHZQYXlDbGFzcyBHc3RSdHBLbHZQYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBLbHZQYXkKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWQgcnRwYmFzZXBheWxvYWQ7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cEtsdlBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgcnRwYmFzZXBheWxvYWRfY2xhc3M7Cit9OworCitHX0dOVUNfSU5URVJOQUwgIEdUeXBlICAgICBnc3RfcnRwX2tsdl9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitHX0dOVUNfSU5URVJOQUwgIGdib29sZWFuICBnc3RfcnRwX2tsdl9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfS0xWX1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cG1wMXNkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYTMxMDgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG1wMXNkZXBheS5jCkBAIC0wLDAgKzEsMTQzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDg+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0cnRwbXAxc2RlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworLyogUnRwTVAxU0RlcGF5IHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTEFTVAorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXAxc19kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL21wZWcsc3lzdGVtc3RyZWFtPShib29sZWFuKXRydWUiKQorICAgICk7CisKKy8qIFRoZSBzcGVjIHNheXMgdmlkZW8vTVAxUyBidXQgSSBoYXZlIHNlZW4gc3RyZWFtcyB3aXRoIG90aGVyL01QMVMgc28gd2Ugd2lsbAorICogYWxsb3cgdGhlbSBib3RoICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9tcDFzX2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwib3RoZXJcIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVggXSwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTVAxU1wiOyIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVggXSwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTVAxU1wiIikKKyAgICApOworCitHX0RFRklORV9UWVBFIChHc3RSdHBNUDFTRGVwYXksIGdzdF9ydHBfbXAxc19kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9tcDFzX2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9tcDFzX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXAxc19kZXBheV9jbGFzc19pbml0IChHc3RSdHBNUDFTRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+cHJvY2Vzc19ydHBfcGFja2V0ID0gZ3N0X3J0cF9tcDFzX2RlcGF5X3Byb2Nlc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9tcDFzX2RlcGF5X3NldGNhcHM7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9tcDFzX2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfbXAxc19kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBNUEVHMSBTeXN0ZW0gU3RyZWFtIGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBNUEVHMSBTeXN0ZW0gU3RyZWFtcyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMzU1NSkiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wMXNfZGVwYXlfaW5pdCAoR3N0UnRwTVAxU0RlcGF5ICogcnRwbXAxc2RlcGF5KQoreworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfbXAxc19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0Q2FwcyAqc3JjY2FwczsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkKKyAgICBjbG9ja19yYXRlID0gOTAwMDA7ICAgICAgICAgLyogZGVmYXVsdCAqLworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8vbXBlZyIsCisgICAgICAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICByZXMgPSBnc3RfcGFkX3NldF9jYXBzIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NSQ1BBRCAoZGVwYXlsb2FkKSwgc3JjY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfbXAxc19kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworCisgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2J1ZmZlciAocnRwKTsKKworICBpZiAob3V0YnVmKSB7CisgICAgR1NUX0RFQlVHICgiZ3N0X3J0cF9tcDFzX2RlcGF5X2NoYWluOiBwdXNoaW5nIGJ1ZmZlciBvZiBzaXplICUiCisgICAgICAgIEdfR1NJWkVfRk9STUFULCBnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWYpKTsKKworICAgIGdzdF9ydHBfZHJvcF9tZXRhIChHU1RfRUxFTUVOVF9DQVNUIChkZXBheWxvYWQpLCBvdXRidWYsIDApOworICB9CisKKyAgcmV0dXJuIG91dGJ1ZjsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfbXAxc19kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cG1wMXNkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9NUDFTX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cG1wMXNkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MjkzM2IKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG1wMXNkZXBheS5oCkBAIC0wLDAgKzEsNTggQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9NUDFTX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfTVAxU19ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfTVAxU19ERVBBWSBcCisgIChnc3RfcnRwX21wMXNfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9NUDFTX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX01QMVNfREVQQVksR3N0UnRwTVAxU0RlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9NUDFTX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUDFTX0RFUEFZLEdzdFJ0cE1QMVNEZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUDFTX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX01QMVNfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QMVNfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX01QMVNfREVQQVkpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cE1QMVNEZXBheSBHc3RSdHBNUDFTRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTVAxU0RlcGF5Q2xhc3MgR3N0UnRwTVAxU0RlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwTVAxU0RlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworfTsKKworc3RydWN0IF9Hc3RSdHBNUDFTRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9tcDFzX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9tcDFzX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX01QMVNfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGUwZDBjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuYwpAQCAtMCwwICsxLDI0MyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdzdHJ0cG1wMnRkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKKy8qIFJ0cE1QMlREZXBheSBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKKyNkZWZpbmUgREVGQVVMVF9TS0lQX0ZJUlNUX0JZVEVTCTAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfU0tJUF9GSVJTVF9CWVRFUworfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXAydF9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL21wZWd0cywiCisgICAgICAgICJwYWNrZXRzaXplPShpbnQpMTg4LCIgInN5c3RlbXN0cmVhbT0oYm9vbGVhbil0cnVlIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9tcDJ0X2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVggXSwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIHsgTVAyVCwgTVAyVC1FUyB9IDsiCisgICAgICAgIC8qIEFsbCBvcHRpb25hbCBwYXJhbWV0ZXJzCisgICAgICAgICAqCisgICAgICAgICAqICJwcm9maWxlLWxldmVsLWlkPVsxLE1BWF0iCisgICAgICAgICAqICJjb25maWc9IiAKKyAgICAgICAgICovCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9NUDJUX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgWzEsIE1BWCBdIikKKyAgICApOworCitHX0RFRklORV9UWVBFIChHc3RSdHBNUDJURGVwYXksIGdzdF9ydHBfbXAydF9kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9tcDJ0X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9tcDJ0X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9tcDJ0X2RlcGF5X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfbXAydF9kZXBheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wMnRfZGVwYXlfY2xhc3NfaW5pdCAoR3N0UnRwTVAyVERlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfbXAydF9kZXBheV9wcm9jZXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfbXAydF9kZXBheV9zZXRjYXBzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9ydHBfbXAydF9kZXBheV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9ydHBfbXAydF9kZXBheV9nZXRfcHJvcGVydHk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9tcDJ0X2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfbXAydF9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBNUEVHIFRyYW5zcG9ydCBTdHJlYW0gZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIE1QRUcyIFRTIGZyb20gUlRQIHBhY2tldHMgKFJGQyAyMjUwKSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4sICIKKyAgICAgICJUaGlqcyBWZXJtZWlyIDx0aGlqcy52ZXJtZWlyQGJhcmNvLmNvbT4iKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NLSVBfRklSU1RfQllURVMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInNraXAtZmlyc3QtYnl0ZXMiLAorICAgICAgICAgICJTa2lwIGZpcnN0IGJ5dGVzIiwKKyAgICAgICAgICAiVGhlIGFtb3VudCBvZiBieXRlcyB0aGF0IG5lZWQgdG8gYmUgc2tpcHBlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXlsb2FkIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIDAsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wMnRfZGVwYXlfaW5pdCAoR3N0UnRwTVAyVERlcGF5ICogcnRwbXAydGRlcGF5KQoreworICBydHBtcDJ0ZGVwYXktPnNraXBfZmlyc3RfYnl0ZXMgPSBERUZBVUxUX1NLSVBfRklSU1RfQllURVM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcDJ0X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RDYXBzICpzcmNjYXBzOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2ludCBjbG9ja19yYXRlOworICBnYm9vbGVhbiByZXM7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSA5MDAwMDsgICAgICAgICAvKiBkZWZhdWx0ICovCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby9tcGVndHMiLAorICAgICAgInBhY2tldHNpemUiLCBHX1RZUEVfSU5ULCAxODgsCisgICAgICAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICByZXMgPSBnc3RfcGFkX3NldF9jYXBzIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NSQ1BBRCAoZGVwYXlsb2FkKSwgc3JjY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfbXAydF9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cE1QMlREZXBheSAqcnRwbXAydGRlcGF5OworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ2ludCBwYXlsb2FkX2xlbiwgbGVmdG92ZXI7CisKKyAgcnRwbXAydGRlcGF5ID0gR1NUX1JUUF9NUDJUX0RFUEFZIChkZXBheWxvYWQpOworCisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworCisgIGlmIChHX1VOTElLRUxZIChwYXlsb2FkX2xlbiA8PSBydHBtcDJ0ZGVwYXktPnNraXBfZmlyc3RfYnl0ZXMpKQorICAgIGdvdG8gZW1wdHlfcGFja2V0OworCisgIHBheWxvYWRfbGVuIC09IHJ0cG1wMnRkZXBheS0+c2tpcF9maXJzdF9ieXRlczsKKworICAvKiBSRkMgMjI1MAorICAgKgorICAgKiAyLiBFbmNhcHN1bGF0aW9uIG9mIE1QRUcgU3lzdGVtIGFuZCBUcmFuc3BvcnQgU3RyZWFtcworICAgKgorICAgKiBGb3IgTVBFRzIgVHJhbnNwb3J0IFN0cmVhbXMgdGhlIFJUUCBwYXlsb2FkIHdpbGwgY29udGFpbiBhbiBpbnRlZ3JhbAorICAgKiBudW1iZXIgb2YgTVBFRyB0cmFuc3BvcnQgcGFja2V0cy4KKyAgICovCisgIGxlZnRvdmVyID0gcGF5bG9hZF9sZW4gJSAxODg7CisgIGlmIChHX1VOTElLRUxZIChsZWZ0b3ZlcikpIHsKKyAgICBHU1RfV0FSTklORyAoIldlIGRvbid0IGhhdmUgYW4gaW50ZWdyYWwgbnVtYmVyIG9mIGJ1ZmZlcnMgKGxlZnRvdmVyOiAlZCkiLAorICAgICAgICBsZWZ0b3Zlcik7CisKKyAgICBwYXlsb2FkX2xlbiAtPSBsZWZ0b3ZlcjsKKyAgfQorCisgIG91dGJ1ZiA9CisgICAgICBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgKHJ0cCwKKyAgICAgIHJ0cG1wMnRkZXBheS0+c2tpcF9maXJzdF9ieXRlcywgcGF5bG9hZF9sZW4pOworCisgIGlmIChvdXRidWYpIHsKKyAgICBHU1RfREVCVUcgKCJnc3RfcnRwX21wMnRfZGVwYXlfY2hhaW46IHB1c2hpbmcgYnVmZmVyIG9mIHNpemUgJSIKKyAgICAgICAgR19HU0laRV9GT1JNQVQsIGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZikpOworCisgICAgZ3N0X3J0cF9kcm9wX21ldGEgKEdTVF9FTEVNRU5UX0NBU1QgKGRlcGF5bG9hZCksIG91dGJ1ZiwgMCk7CisgIH0KKworICByZXR1cm4gb3V0YnVmOworCisgIC8qIEVSUk9SUyAqLworZW1wdHlfcGFja2V0OgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwbXAydGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIlBhY2tldCB3YXMgZW1wdHkiKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXAydF9kZXBheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwTVAyVERlcGF5ICpydHBtcDJ0ZGVwYXk7CisKKyAgcnRwbXAydGRlcGF5ID0gR1NUX1JUUF9NUDJUX0RFUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TS0lQX0ZJUlNUX0JZVEVTOgorICAgICAgcnRwbXAydGRlcGF5LT5za2lwX2ZpcnN0X2J5dGVzID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcDJ0X2RlcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSdHBNUDJURGVwYXkgKnJ0cG1wMnRkZXBheTsKKworICBydHBtcDJ0ZGVwYXkgPSBHU1RfUlRQX01QMlRfREVQQVkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1NLSVBfRklSU1RfQllURVM6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnRwbXAydGRlcGF5LT5za2lwX2ZpcnN0X2J5dGVzKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfbXAydF9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cG1wMnRkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9NUDJUX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOTM2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9NUDJUX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfTVAyVF9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfTVAyVF9ERVBBWSBcCisgIChnc3RfcnRwX21wMnRfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9NUDJUX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX01QMlRfREVQQVksR3N0UnRwTVAyVERlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9NUDJUX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUDJUX0RFUEFZLEdzdFJ0cE1QMlREZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUDJUX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX01QMlRfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QMlRfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX01QMlRfREVQQVkpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cE1QMlREZXBheSBHc3RSdHBNUDJURGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTVAyVERlcGF5Q2xhc3MgR3N0UnRwTVAyVERlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwTVAyVERlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworCisgIGd1aW50OCBza2lwX2ZpcnN0X2J5dGVzOworfTsKKworc3RydWN0IF9Hc3RSdHBNUDJURGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9tcDJ0X2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9tcDJ0X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX01QMlRfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwbXAydHBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZjk0OGUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYwpAQCAtMCwwICsxLDIzNyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworI2luY2x1ZGUgImdzdHJ0cG1wMnRwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9tcDJ0X3BheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL21wZWd0cywiCisgICAgICAgICJwYWNrZXRzaXplPShpbnQpMTg4LCIgInN5c3RlbXN0cmVhbT0oYm9vbGVhbil0cnVlIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9tcDJ0X3BheV9zcmNfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9NUDJUX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIk1QMlRcIiA7ICIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTVAyVFwiIikKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9tcDJ0X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9tcDJ0X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqCisgICAgcGF5bG9hZCwgR3N0QnVmZmVyICogYnVmZmVyKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfbXAydF9wYXlfZmx1c2ggKEdzdFJUUE1QMlRQYXkgKiBydHBtcDJ0cGF5KTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfbXAydF9wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCisjZGVmaW5lIGdzdF9ydHBfbXAydF9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UlRQTVAyVFBheSwgZ3N0X3J0cF9tcDJ0X3BheSwgR1NUX1RZUEVfUlRQX0JBU0VfUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wMnRfcGF5X2NsYXNzX2luaXQgKEdzdFJUUE1QMlRQYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9tcDJ0X3BheV9maW5hbGl6ZTsKKworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX21wMnRfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9tcDJ0X3BheV9oYW5kbGVfYnVmZmVyOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfbXAydF9wYXlfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfbXAydF9wYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgTVBFRzIgVHJhbnNwb3J0IFN0cmVhbSBwYXlsb2FkZXIiLCAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYXlsb2FkLWVuY29kZXMgTVBFRzIgVFMgaW50byBSVFAgcGFja2V0cyAoUkZDIDIyNTApIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcDJ0X3BheV9pbml0IChHc3RSVFBNUDJUUGF5ICogcnRwbXAydHBheSkKK3sKKyAgR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHJ0cG1wMnRwYXkpLT5jbG9ja19yYXRlID0gOTAwMDA7CisgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX1BUIChydHBtcDJ0cGF5KSA9IEdTVF9SVFBfUEFZTE9BRF9NUDJUOworCisgIHJ0cG1wMnRwYXktPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wMnRfcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSVFBNUDJUUGF5ICpydHBtcDJ0cGF5OworCisgIHJ0cG1wMnRwYXkgPSBHU1RfUlRQX01QMlRfUEFZIChvYmplY3QpOworCisgIGdfb2JqZWN0X3VucmVmIChydHBtcDJ0cGF5LT5hZGFwdGVyKTsKKyAgcnRwbXAydHBheS0+YWRhcHRlciA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfbXAydF9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2Jvb2xlYW4gcmVzOworCisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChwYXlsb2FkLCAidmlkZW8iLAorICAgICAgcGF5bG9hZC0+cHQgIT0gR1NUX1JUUF9QQVlMT0FEX01QMlQsICJNUDJUIiwgOTAwMDApOworICByZXMgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAocGF5bG9hZCwgTlVMTCk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfbXAydF9wYXlfZmx1c2ggKEdzdFJUUE1QMlRQYXkgKiBydHBtcDJ0cGF5KQoreworICBndWludCBhdmFpbCwgbXR1OworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKworICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwbXAydHBheS0+YWRhcHRlcik7CisKKyAgbXR1ID0gR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVIChydHBtcDJ0cGF5KTsKKworICB3aGlsZSAoYXZhaWwgPiAwICYmIChyZXQgPT0gR1NUX0ZMT1dfT0spKSB7CisgICAgZ3VpbnQgdG93cml0ZTsKKyAgICBndWludCBwYXlsb2FkX2xlbjsKKyAgICBndWludCBwYWNrZXRfbGVuOworICAgIEdzdEJ1ZmZlciAqcGF5YnVmOworCisgICAgLyogdGhpcyB3aWxsIGJlIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIHBhY2tldCAqLworICAgIHBhY2tldF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BhY2tldF9sZW4gKGF2YWlsLCAwLCAwKTsKKworICAgIC8qIGZpbGwgb25lIE1UVSBvciBhbGwgYXZhaWxhYmxlIGJ5dGVzICovCisgICAgdG93cml0ZSA9IE1JTiAocGFja2V0X2xlbiwgbXR1KTsKKworICAgIC8qIHRoaXMgaXMgdGhlIHBheWxvYWQgbGVuZ3RoICovCisgICAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BheWxvYWRfbGVuICh0b3dyaXRlLCAwLCAwKTsKKyAgICBwYXlsb2FkX2xlbiAtPSBwYXlsb2FkX2xlbiAlIDE4ODsKKworICAgIC8qIG5lZWQgd2hvbGUgcGFja2V0cyAqLworICAgIGlmICghcGF5bG9hZF9sZW4pCisgICAgICBicmVhazsKKworICAgIC8qIGNyZWF0ZSBidWZmZXIgdG8gaG9sZCB0aGUgcGF5bG9hZCAqLworICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoMCwgMCwgMCk7CisKKyAgICAvKiBnZXQgcGF5bG9hZCAqLworICAgIHBheWJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyX2Zhc3QgKHJ0cG1wMnRwYXktPmFkYXB0ZXIsIHBheWxvYWRfbGVuKTsKKyAgICBnc3RfcnRwX2NvcHlfbWV0YSAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwbXAydHBheSksIG91dGJ1ZiwgcGF5YnVmLCAwKTsKKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAob3V0YnVmLCBwYXlidWYpOworICAgIGF2YWlsIC09IHBheWxvYWRfbGVuOworCisgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSBydHBtcDJ0cGF5LT5maXJzdF90czsKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gcnRwbXAydHBheS0+ZHVyYXRpb247CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDJ0cGF5LCAicHVzaGluZyBidWZmZXIgb2Ygc2l6ZSAldSIsCisgICAgICAgIChndWludCkgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAob3V0YnVmKSk7CisKKyAgICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoIChHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwbXAydHBheSksIG91dGJ1Zik7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9tcDJ0X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UlRQTVAyVFBheSAqcnRwbXAydHBheTsKKyAgZ3VpbnQgc2l6ZSwgYXZhaWwsIHBhY2tldF9sZW47CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIGR1cmF0aW9uOworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBydHBtcDJ0cGF5ID0gR1NUX1JUUF9NUDJUX1BBWSAoYmFzZXBheWxvYWQpOworCisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpOworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKTsKKyAgZHVyYXRpb24gPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpOworCithZ2FpbjoKKyAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBtcDJ0cGF5LT5hZGFwdGVyKTsKKworICAvKiBJbml0aWFsaXplIG5ldyBSVFAgcGF5bG9hZCAqLworICBpZiAoYXZhaWwgPT0gMCkgeworICAgIHJ0cG1wMnRwYXktPmZpcnN0X3RzID0gdGltZXN0YW1wOworICAgIHJ0cG1wMnRwYXktPmR1cmF0aW9uID0gZHVyYXRpb247CisgIH0KKworICAvKiBnZXQgcGFja2V0IGxlbmd0aCBvZiBwcmV2aW91cyBkYXRhIGFuZCB0aGlzIG5ldyBkYXRhICovCisgIHBhY2tldF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BhY2tldF9sZW4gKGF2YWlsICsgc2l6ZSwgMCwgMCk7CisKKyAgLyogaWYgdGhpcyBidWZmZXIgaXMgZ29pbmcgdG8gb3ZlcmZsb3cgdGhlIHBhY2tldCwgZmx1c2ggd2hhdCB3ZSBoYXZlLAorICAgKiBvciBpZiB1cHN0cmVhbSBpcyBoYW5kaW5nIHVzIHNldmVyYWwgcGFja2V0cywgdG8ga2VlcCBsYXRlbmN5IGxvdyAqLworICBpZiAoIXNpemUgfHwgZ3N0X3J0cF9iYXNlX3BheWxvYWRfaXNfZmlsbGVkIChiYXNlcGF5bG9hZCwKKyAgICAgICAgICBwYWNrZXRfbGVuLCBydHBtcDJ0cGF5LT5kdXJhdGlvbiArIGR1cmF0aW9uKSkgeworICAgIHJldCA9IGdzdF9ydHBfbXAydF9wYXlfZmx1c2ggKHJ0cG1wMnRwYXkpOworICAgIHJ0cG1wMnRwYXktPmZpcnN0X3RzID0gdGltZXN0YW1wOworICAgIHJ0cG1wMnRwYXktPmR1cmF0aW9uID0gZHVyYXRpb247CisKKyAgICAvKiBrZWVwIGZpbGxpbmcgdGhlIHBheWxvYWQgKi8KKyAgfSBlbHNlIHsKKyAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGR1cmF0aW9uKSkKKyAgICAgIHJ0cG1wMnRwYXktPmR1cmF0aW9uICs9IGR1cmF0aW9uOworICB9CisKKyAgLyogY29weSBidWZmZXIgdG8gYWRhcHRlciAqLworICBpZiAoYnVmZmVyKSB7CisgICAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRwbXAydHBheS0+YWRhcHRlciwgYnVmZmVyKTsKKyAgICBidWZmZXIgPSBOVUxMOworICB9CisKKyAgaWYgKHNpemUgPj0gKDE4OCAqIDIpKSB7CisgICAgc2l6ZSA9IDA7CisgICAgZ290byBhZ2FpbjsKKyAgfQorCisgIHJldHVybiByZXQ7CisKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfbXAydF9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBtcDJ0cGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX01QMlRfUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXAydHBheS5oIGIvZ3N0L3J0cC9nc3RydHBtcDJ0cGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmNDk1OQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXAydHBheS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfUlRQX01QMlRfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfTVAyVF9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQTVAyVFBheSBHc3RSVFBNUDJUUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUE1QMlRQYXlDbGFzcyBHc3RSVFBNUDJUUGF5Q2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX01QMlRfUEFZIFwKKyAgKGdzdF9ydHBfbXAydF9wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9NUDJUX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9NUDJUX1BBWSxHc3RSVFBNUDJUUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9NUDJUX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTVAyVF9QQVksR3N0UlRQTVAyVFBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUDJUX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9NUDJUX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfTVAyVF9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX01QMlRfUEFZKSkKKworc3RydWN0IF9Hc3RSVFBNUDJUUGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkIHBheWxvYWQ7CisgIAorICBHc3RBZGFwdGVyICAqYWRhcHRlcjsKKyAgR3N0Q2xvY2tUaW1lIGZpcnN0X3RzOworICBHc3RDbG9ja1RpbWUgZHVyYXRpb247Cit9OworCitzdHJ1Y3QgX0dzdFJUUE1QMlRQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfbXAydF9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX21wMnRfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX01QMlRfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzN2QyNQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmMKQEAgLTAsMCArMSw0NjYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gTm9raWEgQ29ycG9yYXRpb24gKGNvbnRhY3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4pCisgKiAgICAgICAgICAgICAgIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Yml0cmVhZGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdzdHJ0cG1wNGFkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cG1wNGFkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwbXA0YWRlcGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9tcDRhX2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8vbXBlZywiCisgICAgICAgICJtcGVndmVyc2lvbiA9IChpbnQpIDQsIiAiZnJhbWVkID0gKGJvb2xlYW4pIHsgZmFsc2UsIHRydWUgfSwgIgorICAgICAgICAic3RyZWFtLWZvcm1hdCA9IChzdHJpbmcpIHJhdyIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXA0YV9kZXBheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVggXSwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTVA0QS1MQVRNXCIiCisgICAgICAgIC8qIEFsbCBvcHRpb25hbCBwYXJhbWV0ZXJzCisgICAgICAgICAqCisgICAgICAgICAqICJwcm9maWxlLWxldmVsLWlkPVsxLE1BWF0iCisgICAgICAgICAqICJjb25maWc9IgorICAgICAgICAgKi8KKyAgICApCisgICAgKTsKKworI2RlZmluZSBnc3RfcnRwX21wNGFfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwTVA0QURlcGF5LCBnc3RfcnRwX21wNGFfZGVwYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfREVQQVlMT0FEKTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9tcDRhX2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfbXA0YV9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfbXA0YV9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX21wNGFfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcDRhX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cE1QNEFEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfbXA0YV9kZXBheV9maW5hbGl6ZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfcnRwX21wNGFfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfbXA0YV9kZXBheV9wcm9jZXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfbXA0YV9kZXBheV9zZXRjYXBzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfbXA0YV9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX21wNGFfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgTVBFRzQgYXVkaW8gZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIE1QRUc0IGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgKFJGQyAzMDE2KSIsCisgICAgICAiTm9raWEgQ29ycG9yYXRpb24gKGNvbnRhY3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4pLCAiCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwbXA0YWRlcGF5X2RlYnVnLCAicnRwbXA0YWRlcGF5IiwgMCwKKyAgICAgICJNUEVHNCBhdWRpbyBSVFAgRGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXA0YV9kZXBheV9pbml0IChHc3RSdHBNUDRBRGVwYXkgKiBydHBtcDRhZGVwYXkpCit7CisgIHJ0cG1wNGFkZXBheS0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKKyAgcnRwbXA0YWRlcGF5LT5mcmFtZWQgPSBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXA0YV9kZXBheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwTVA0QURlcGF5ICpydHBtcDRhZGVwYXk7CisKKyAgcnRwbXA0YWRlcGF5ID0gR1NUX1JUUF9NUDRBX0RFUEFZIChvYmplY3QpOworCisgIGdfb2JqZWN0X3VucmVmIChydHBtcDRhZGVwYXktPmFkYXB0ZXIpOworICBydHBtcDRhZGVwYXktPmFkYXB0ZXIgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIGNvbnN0IGd1aW50IGFhY19zYW1wbGVfcmF0ZXNbXSA9IHsgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsCisgIDQ0MTAwLCAzMjAwMCwgMjQwMDAsIDIyMDUwLCAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwLCA3MzUwCit9OworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfbXA0YV9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdFJ0cE1QNEFEZXBheSAqcnRwbXA0YWRlcGF5OworICBHc3RDYXBzICpzcmNjYXBzOworICBjb25zdCBnY2hhciAqc3RyOworICBnaW50IGNsb2NrX3JhdGU7CisgIGdpbnQgb2JqZWN0X3R5cGU7CisgIGdpbnQgY2hhbm5lbHMgPSAyOyAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgZ2Jvb2xlYW4gcmVzOworCisgIHJ0cG1wNGFkZXBheSA9IEdTVF9SVFBfTVA0QV9ERVBBWSAoZGVwYXlsb2FkKTsKKworICBydHBtcDRhZGVwYXktPmZyYW1lZCA9IEZBTFNFOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSA5MDAwMDsgICAgICAgICAvKiBkZWZhdWx0ICovCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgIm9iamVjdCIsICZvYmplY3RfdHlwZSkpCisgICAgb2JqZWN0X3R5cGUgPSAyOyAgICAgICAgICAgIC8qIEFBQyBMQyBkZWZhdWx0ICovCisKKyAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby9tcGVnIiwKKyAgICAgICJtcGVndmVyc2lvbiIsIEdfVFlQRV9JTlQsIDQsCisgICAgICAiZnJhbWVkIiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBjaGFubmVscywKKyAgICAgICJzdHJlYW0tZm9ybWF0IiwgR19UWVBFX1NUUklORywgInJhdyIsIE5VTEwpOworCisgIGlmICgoc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJjb25maWciKSkpIHsKKyAgICBHVmFsdWUgdiA9IHsgMCB9OworCisgICAgZ192YWx1ZV9pbml0ICgmdiwgR1NUX1RZUEVfQlVGRkVSKTsKKyAgICBpZiAoZ3N0X3ZhbHVlX2Rlc2VyaWFsaXplICgmdiwgc3RyKSkgeworICAgICAgR3N0QnVmZmVyICpidWZmZXI7CisgICAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICAgIGd1aW50OCAqZGF0YTsKKyAgICAgIGdzaXplIHNpemU7CisgICAgICBnaW50IGk7CisgICAgICBndWludDMyIHJhdGUgPSAwOworICAgICAgZ3VpbnQ4IG9ial90eXBlID0gMCwgc3JfaWR4ID0gMCwgY2hhbm5lbHMgPSAwOworICAgICAgR3N0Qml0UmVhZGVyIGJyOworCisgICAgICBidWZmZXIgPSBnc3RfdmFsdWVfZ2V0X2J1ZmZlciAoJnYpOworICAgICAgZ3N0X2J1ZmZlcl9yZWYgKGJ1ZmZlcik7CisgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdik7CisKKyAgICAgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICBkYXRhID0gbWFwLmRhdGE7CisgICAgICBzaXplID0gbWFwLnNpemU7CisKKyAgICAgIGlmIChzaXplIDwgMikgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5bG9hZCwgImNvbmZpZyB0b28gc2hvcnQgKCVkIDwgMikiLAorICAgICAgICAgICAgKGdpbnQpIHNpemUpOworICAgICAgICBnb3RvIGJhZF9jb25maWc7CisgICAgICB9CisKKyAgICAgIC8qIFBhcnNlIFN0cmVhbU11eENvbmZpZyBhY2NvcmRpbmcgdG8gSVNPL0lFQyAxNDQ5Ni0zOgorICAgICAgICoKKyAgICAgICAqIGF1ZGlvTXV4VmVyc2lvbiAgICAgICAgICAgPT0gMCAoMSBiaXQpCisgICAgICAgKiBhbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nID09IDEgKDEgYml0KQorICAgICAgICogbnVtU3ViRnJhbWVzICAgICAgICAgICAgICA9PSBydHBtcDRhZGVwYXktPm51bVN1YkZyYW1lcyAoNiBiaXRzKQorICAgICAgICogbnVtUHJvZ3JhbSAgICAgICAgICAgICAgICA9PSAwICg0IGJpdHMpCisgICAgICAgKiBudW1MYXllciAgICAgICAgICAgICAgICAgID09IDAgKDMgYml0cykKKyAgICAgICAqCisgICAgICAgKiBXZSBvbmx5IHJlcXVpcmUgYXVkaW9NdXhWZXJzaW9uID09IDA7CisgICAgICAgKgorICAgICAgICogVGhlIHJlbWFpbmluZyBiaXQgb2YgdGhlIHNlY29uZCBieXRlIGFuZCB0aGUgcmVzdCBvZiB0aGUgYml0cyBhcmUgdXNlZAorICAgICAgICogZm9yIGF1ZGlvU3BlY2lmaWNDb25maWcgd2hpY2ggd2UgbmVlZCB0byBzZXQgaW4gY29kZWNfaW5mby4KKyAgICAgICAqLworICAgICAgaWYgKChkYXRhWzBdICYgMHg4MCkgIT0gMHgwMCkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5bG9hZCwgInVua25vd24gYXVkaW9NdXhWZXJzaW9uIDEiKTsKKyAgICAgICAgZ290byBiYWRfY29uZmlnOworICAgICAgfQorCisgICAgICBydHBtcDRhZGVwYXktPm51bVN1YkZyYW1lcyA9IChkYXRhWzBdICYgMHgzRik7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBtcDRhZGVwYXksICJudW1TdWJGcmFtZXMgJWQiLAorICAgICAgICAgIHJ0cG1wNGFkZXBheS0+bnVtU3ViRnJhbWVzKTsKKworICAgICAgLyogc2hpZnQgcmVzdCBvZiBzdHJpbmcgMTUgYml0cyBkb3duICovCisgICAgICBzaXplIC09IDI7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGRhdGFbaV0gPSAoKGRhdGFbaSArIDFdICYgMSkgPDwgNykgfCAoKGRhdGFbaSArIDJdICYgMHhmZSkgPj4gMSk7CisgICAgICB9CisKKyAgICAgIGdzdF9iaXRfcmVhZGVyX2luaXQgKCZiciwgZGF0YSwgc2l6ZSk7CisKKyAgICAgIC8qIGFueSBvYmplY3QgdHlwZSBpcyBmaW5lLCB3ZSBuZWVkIHRvIGNvcHkgaXQgdG8gdGhlIHByb2ZpbGUtbGV2ZWwtaWQgZmllbGQuICovCisgICAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4ICgmYnIsICZvYmpfdHlwZSwgNSkpCisgICAgICAgIGdvdG8gYmFkX2NvbmZpZzsKKyAgICAgIGlmIChvYmpfdHlwZSA9PSAwKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVwYXlsb2FkLCAiaW52YWxpZCBvYmplY3QgdHlwZSAwIik7CisgICAgICAgIGdvdG8gYmFkX2NvbmZpZzsKKyAgICAgIH0KKworICAgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoJmJyLCAmc3JfaWR4LCA0KSkKKyAgICAgICAgZ290byBiYWRfY29uZmlnOworICAgICAgaWYgKHNyX2lkeCA+PSBHX05fRUxFTUVOVFMgKGFhY19zYW1wbGVfcmF0ZXMpICYmIHNyX2lkeCAhPSAxNSkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5bG9hZCwgImludmFsaWQgc2FtcGxlIHJhdGUgaW5kZXggJWQiLCBzcl9pZHgpOworICAgICAgICBnb3RvIGJhZF9jb25maWc7CisgICAgICB9CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwbXA0YWRlcGF5LCAic2FtcGxlIHJhdGUgaW5kZXggJXUiLCBzcl9pZHgpOworCisgICAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4ICgmYnIsICZjaGFubmVscywgNCkpCisgICAgICAgIGdvdG8gYmFkX2NvbmZpZzsKKyAgICAgIGlmIChjaGFubmVscyA+IDcpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZXBheWxvYWQsICJpbnZhbGlkIGNoYW5uZWxzICV1IiwgKGd1aW50KSBjaGFubmVscyk7CisgICAgICAgIGdvdG8gYmFkX2NvbmZpZzsKKyAgICAgIH0KKworICAgICAgLyogcnRwIHJhdGUgZGVwZW5kcyBvbiBzYW1wbGluZyByYXRlIG9mIHRoZSBhdWRpbyAqLworICAgICAgaWYgKHNyX2lkeCA9PSAxNSkgeworICAgICAgICAvKiBpbmRleCBvZiAxNSBtZWFucyB3ZSBnZXQgdGhlIHJhdGUgaW4gdGhlIG5leHQgMjQgYml0cyAqLworICAgICAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQzMiAoJmJyLCAmcmF0ZSwgMjQpKQorICAgICAgICAgIGdvdG8gYmFkX2NvbmZpZzsKKyAgICAgIH0gZWxzZSBpZiAoc3JfaWR4ID49IEdfTl9FTEVNRU5UUyAoYWFjX3NhbXBsZV9yYXRlcykpIHsKKyAgICAgICAgZ290byBiYWRfY29uZmlnOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogZWxzZSB1c2UgdGhlIHJhdGUgZnJvbSB0aGUgdGFibGUgKi8KKyAgICAgICAgcmF0ZSA9IGFhY19zYW1wbGVfcmF0ZXNbc3JfaWR4XTsKKyAgICAgIH0KKworICAgICAgcnRwbXA0YWRlcGF5LT5mcmFtZV9sZW4gPSAxMDI0OworCisgICAgICBzd2l0Y2ggKG9ial90eXBlKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAyOgorICAgICAgICBjYXNlIDM6CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgY2FzZSA2OgorICAgICAgICBjYXNlIDc6CisgICAgICAgIHsKKyAgICAgICAgICBndWludDggZnJhbWVMZW5GbGFnID0gMDsKKworICAgICAgICAgIGlmIChnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoJmJyLCAmZnJhbWVMZW5GbGFnLCAxKSkKKyAgICAgICAgICAgIGlmIChmcmFtZUxlbkZsYWcpCisgICAgICAgICAgICAgIHJ0cG1wNGFkZXBheS0+ZnJhbWVfbGVuID0gOTYwOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8qIGlnbm9yZSByZW1haW5pbmcgYml0LCB3ZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gZnVsbCBieXRlcyAqLworICAgICAgZ3N0X2J1ZmZlcl9yZXNpemUgKGJ1ZmZlciwgMCwgc2l6ZSk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgICAgZGF0YSA9IE5VTEw7CisKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKHNyY2NhcHMsCisgICAgICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgKGdpbnQpIGNoYW5uZWxzLAorICAgICAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgKGdpbnQpIHJhdGUsCisgICAgICAgICAgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIGJ1ZmZlciwgTlVMTCk7CisgICAgYmFkX2NvbmZpZzoKKyAgICAgIGlmIChkYXRhKQorICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgZ193YXJuaW5nICgiY2Fubm90IGNvbnZlcnQgY29uZmlnIHRvIGJ1ZmZlciIpOworICAgIH0KKyAgfQorICByZXMgPSBnc3RfcGFkX3NldF9jYXBzIChkZXBheWxvYWQtPnNyY3BhZCwgc3JjY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfbXA0YV9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cE1QNEFEZXBheSAqcnRwbXA0YWRlcGF5OworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgcnRwbXA0YWRlcGF5ID0gR1NUX1JUUF9NUDRBX0RFUEFZIChkZXBheWxvYWQpOworCisgIC8qIGZsdXNoIHJlbWFpbmluZyBkYXRhIG9uIGRpc2NvbnQgKi8KKyAgaWYgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAocnRwLT5idWZmZXIpKSB7CisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cG1wNGFkZXBheS0+YWRhcHRlcik7CisgIH0KKworICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9idWZmZXIgKHJ0cCk7CisKKyAgaWYgKCFydHBtcDRhZGVwYXktPmZyYW1lZCkgeworICAgIGlmIChnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApKSB7CisgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICBydHBtcDRhZGVwYXktPmZyYW1lZCA9IFRSVUU7CisKKyAgICAgIGdzdF9ydHBfYmFzZV9kZXBheWxvYWRfcHVzaCAoZGVwYXlsb2FkLCBvdXRidWYpOworCisgICAgICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChkZXBheWxvYWQtPnNyY3BhZCk7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoY2Fwcyk7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAiZnJhbWVkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICAgICAgZ3N0X3BhZF9zZXRfY2FwcyAoZGVwYXlsb2FkLT5zcmNwYWQsIGNhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBvdXRidWY7CisgICAgfQorICB9CisKKyAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChvdXRidWYpOworICBHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSA9IEdTVF9CVUZGRVJfUFRTIChydHAtPmJ1ZmZlcik7CisgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cG1wNGFkZXBheS0+YWRhcHRlciwgb3V0YnVmKTsKKworICAvKiBSVFAgbWFya2VyIGJpdCBpbmRpY2F0ZXMgdGhlIGxhc3QgcGFja2V0IG9mIHRoZSBBdWRpb011eEVsZW1lbnQgPT4gY3JlYXRlCisgICAqIGFuZCBwdXNoIGEgYnVmZmVyICovCisgIGlmIChnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApKSB7CisgICAgZ3VpbnQgYXZhaWw7CisgICAgZ3VpbnQgaTsKKyAgICBndWludDggKmRhdGE7CisgICAgZ3VpbnQgcG9zOworICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisKKyAgICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwbXA0YWRlcGF5LT5hZGFwdGVyKTsKKyAgICB0aW1lc3RhbXAgPSBnc3RfYWRhcHRlcl9wcmV2X3B0cyAocnRwbXA0YWRlcGF5LT5hZGFwdGVyLCBOVUxMKTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChydHBtcDRhZGVwYXksICJoYXZlIG1hcmtlciBhbmQgJXUgYXZhaWxhYmxlIiwgYXZhaWwpOworCisgICAgb3V0YnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHJ0cG1wNGFkZXBheS0+YWRhcHRlciwgYXZhaWwpOworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgZGF0YSA9IG1hcC5kYXRhOworICAgIC8qIHBvc2l0aW9uIGluIGRhdGEgd2UgYXJlIGF0ICovCisgICAgcG9zID0gMDsKKworICAgIC8qIGxvb3BpbmcgdGhyb3VnaCB0aGUgbnVtYmVyIG9mIHN1Yi1mcmFtZXMgaW4gdGhlIGF1ZGlvIHBheWxvYWQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDw9IHJ0cG1wNGFkZXBheS0+bnVtU3ViRnJhbWVzOyBpKyspIHsKKyAgICAgIC8qIGRldGVybWluZSBwYXlsb2FkIGxlbmd0aCBhbmQgc2V0IGJ1ZmZlciBkYXRhIHBvaW50ZXIgYWNjb3JkaW5nbHkgKi8KKyAgICAgIGd1aW50IHNraXA7CisgICAgICBndWludCBkYXRhX2xlbjsKKyAgICAgIEdzdEJ1ZmZlciAqdG1wID0gTlVMTDsKKworICAgICAgLyogZWFjaCBzdWJmcmFtZSBzdGFydHMgd2l0aCBhIHZhcmlhYmxlIGxlbmd0aCBlbmNvZGluZyAqLworICAgICAgZGF0YV9sZW4gPSAwOworICAgICAgZm9yIChza2lwID0gMDsgc2tpcCA8IGF2YWlsOyBza2lwKyspIHsKKyAgICAgICAgZGF0YV9sZW4gKz0gZGF0YVtza2lwXTsKKyAgICAgICAgaWYgKGRhdGFbc2tpcF0gIT0gMHhmZikKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHNraXArKzsKKworICAgICAgLyogdGhpcyBjYW4gbm90IGJlIHBvc3NpYmxlLCB3ZSBoYXZlIG5vdCBlbm91Z2ggZGF0YSBvciB0aGUgbGVuZ3RoCisgICAgICAgKiBkZWNvZGluZyBmYWlsZWQgYmVjYXVzZSB3ZSByYW4gb3V0IG9mIGRhdGEuICovCisgICAgICBpZiAoc2tpcCArIGRhdGFfbGVuID4gYXZhaWwpCisgICAgICAgIGdvdG8gd3Jvbmdfc2l6ZTsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cG1wNGFkZXBheSwKKyAgICAgICAgICAic3ViZnJhbWUgJXUsIGhlYWRlciBsZW4gJXUsIGRhdGEgbGVuICV1LCBsZWZ0ICV1IiwgaSwgc2tpcCwgZGF0YV9sZW4sCisgICAgICAgICAgYXZhaWwpOworCisgICAgICAvKiB0YWtlIGRhdGEgb3V0LCBza2lwIHRoZSBoZWFkZXIgKi8KKyAgICAgIHBvcyArPSBza2lwOworICAgICAgdG1wID0gZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAob3V0YnVmLCBHU1RfQlVGRkVSX0NPUFlfQUxMLCBwb3MsIGRhdGFfbGVuKTsKKworICAgICAgLyogc2tpcCBkYXRhIHRvbyAqLworICAgICAgc2tpcCArPSBkYXRhX2xlbjsKKyAgICAgIHBvcyArPSBkYXRhX2xlbjsKKworICAgICAgLyogdXBkYXRlIG91ciBwb2ludGVycyB3aGl0aCB3aGF0IHdlIGNvbnN1bWVkICovCisgICAgICBkYXRhICs9IHNraXA7CisgICAgICBhdmFpbCAtPSBza2lwOworCisgICAgICBHU1RfQlVGRkVSX1BUUyAodG1wKSA9IHRpbWVzdGFtcDsKKyAgICAgIGdzdF9ydHBfZHJvcF9ub25fYXVkaW9fbWV0YSAoZGVwYXlsb2FkLCB0bXApOworICAgICAgZ3N0X3J0cF9iYXNlX2RlcGF5bG9hZF9wdXNoIChkZXBheWxvYWQsIHRtcCk7CisKKyAgICAgIC8qIHNoaWZ0IHRzIGZvciBuZXh0IGJ1ZmZlcnMgKi8KKyAgICAgIGlmIChydHBtcDRhZGVwYXktPmZyYW1lX2xlbiAmJiB0aW1lc3RhbXAgIT0gLTEKKyAgICAgICAgICAmJiBkZXBheWxvYWQtPmNsb2NrX3JhdGUgIT0gMCkgeworICAgICAgICB0aW1lc3RhbXAgKz0KKyAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHJ0cG1wNGFkZXBheS0+ZnJhbWVfbGVuLCBHU1RfU0VDT05ELAorICAgICAgICAgICAgZGVwYXlsb2FkLT5jbG9ja19yYXRlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBqdXN0IGEgY2hlY2sgdGhhdCBsZW5ndGhzIG1hdGNoICovCisgICAgaWYgKGF2YWlsKSB7CisgICAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChkZXBheWxvYWQsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAgICgiUGFja2V0IGludmFsaWQiKSwgKCJOb3QgYWxsIHBheWxvYWQgY29uc3VtZWQ6ICIKKyAgICAgICAgICAgICAgInBvc3NpYmxlIHdyb25nbHkgZW5jb2RlZCBwYWNrZXQuIikpOworICAgIH0KKworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmKTsKKyAgfQorICByZXR1cm4gTlVMTDsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX3NpemU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBtcDRhZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIlBhY2tldCBkaWQgbm90IHZhbGlkYXRlIiksICgid3JvbmcgcGFja2V0IHNpemUiKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWYpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9tcDRhX2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0UnRwTVA0QURlcGF5ICpydHBtcDRhZGVwYXk7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBydHBtcDRhZGVwYXkgPSBHU1RfUlRQX01QNEFfREVQQVkgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRwbXA0YWRlcGF5LT5hZGFwdGVyKTsKKyAgICAgIHJ0cG1wNGFkZXBheS0+ZnJhbWVfbGVuID0gMDsKKyAgICAgIHJ0cG1wNGFkZXBheS0+bnVtU3ViRnJhbWVzID0gMDsKKyAgICAgIHJ0cG1wNGFkZXBheS0+ZnJhbWVkID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfbXA0YV9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cG1wNGFkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9NUDRBX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZWFmNTYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gTm9raWEgQ29ycG9yYXRpb24gKGNvbnRhY3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4pCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfTVA0QV9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX01QNEFfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX01QNEFfREVQQVkgXAorICAoZ3N0X3J0cF9tcDRhX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfTVA0QV9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9NUDRBX0RFUEFZLEdzdFJ0cE1QNEFEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfTVA0QV9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTVA0QV9ERVBBWSxHc3RSdHBNUDRBRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfTVA0QV9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9NUDRBX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUDRBX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUDRBX0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cE1QNEFEZXBheSBHc3RSdHBNUDRBRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTVA0QURlcGF5Q2xhc3MgR3N0UnRwTVA0QURlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwTVA0QURlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworICBHc3RBZGFwdGVyICphZGFwdGVyOworICBndWludDggbnVtU3ViRnJhbWVzOworICBndWludCBmcmFtZV9sZW47CisKKyAgZ2Jvb2xlYW4gZnJhbWVkOworfTsKKworc3RydWN0IF9Hc3RSdHBNUDRBRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9tcDRhX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9tcDRhX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX01QNEFfREVQQVlfSF9fICovCisKZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXA0YXBheS5jIGIvZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyMmRkZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXA0YXBheS5jCkBAIC0wLDAgKzEsNDYzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDg+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJnc3RydHBtcDRhcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwbXA0YXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwbXA0YXBheV9kZWJ1ZykKKworLyogRklYTUU6IGFkZCBmcmFtZWQ9KGJvb2xlYW4pdHJ1ZSBvbmNlIG91ciBlbmNvZGVycyBoYXZlIHRoaXMgZmllbGQgc2V0CisgKiBvbiB0aGVpciBvdXRwdXQgY2FwcyAqLworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXA0YV9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQsICIKKyAgICAgICAgInN0cmVhbS1mb3JtYXQ9KHN0cmluZylyYXciKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX21wNGFfcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVggXSwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTVA0QS1MQVRNXCIiCisgICAgICAgIC8qIEFsbCBvcHRpb25hbCBwYXJhbWV0ZXJzCisgICAgICAgICAqCisgICAgICAgICAqICJjcHJlc2VudCA9IChzdHJpbmcpIFwiMFwiIgorICAgICAgICAgKiAiY29uZmlnPSIgCisgICAgICAgICAqLworICAgICkKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX21wNGFfcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfbXA0YV9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfbXA0YV9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKgorICAgIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKKyNkZWZpbmUgZ3N0X3J0cF9tcDRhX3BheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBNUDRBUGF5LCBnc3RfcnRwX21wNGFfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9QQVlMT0FEKQorCisgICAgIHN0YXRpYyB2b2lkIGdzdF9ydHBfbXA0YV9wYXlfY2xhc3NfaW5pdCAoR3N0UnRwTVA0QVBheUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzICpnc3RydHBiYXNlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX21wNGFfcGF5X2ZpbmFsaXplOworCisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfbXA0YV9wYXlfc2V0Y2FwczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX21wNGFfcGF5X2hhbmRsZV9idWZmZXI7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9tcDRhX3BheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX21wNGFfcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIE1QRUc0IGF1ZGlvIHBheWxvYWRlciIsICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBheWxvYWQgTVBFRzQgYXVkaW8gYXMgUlRQIHBhY2tldHMgKFJGQyAzMDE2KSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwbXA0YXBheV9kZWJ1ZywgInJ0cG1wNGFwYXkiLCAwLAorICAgICAgIk1QNEEtTEFUTSBSVFAgUGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wNGFfcGF5X2luaXQgKEdzdFJ0cE1QNEFQYXkgKiBydHBtcDRhcGF5KQoreworICBydHBtcDRhcGF5LT5yYXRlID0gOTAwMDA7CisgIHJ0cG1wNGFwYXktPnByb2ZpbGUgPSBnX3N0cmR1cCAoIjEiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXA0YV9wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cE1QNEFQYXkgKnJ0cG1wNGFwYXk7CisKKyAgcnRwbXA0YXBheSA9IEdTVF9SVFBfTVA0QV9QQVkgKG9iamVjdCk7CisKKyAgZ19mcmVlIChydHBtcDRhcGF5LT5wYXJhbXMpOworICBydHBtcDRhcGF5LT5wYXJhbXMgPSBOVUxMOworCisgIGlmIChydHBtcDRhcGF5LT5jb25maWcpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAocnRwbXA0YXBheS0+Y29uZmlnKTsKKyAgcnRwbXA0YXBheS0+Y29uZmlnID0gTlVMTDsKKworICBnX2ZyZWUgKHJ0cG1wNGFwYXktPnByb2ZpbGUpOworICBydHBtcDRhcGF5LT5wcm9maWxlID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2FtcGxpbmdfdGFibGVbMTZdID0geworICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLCAyNDAwMCwgMjIwNTAsCisgIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAsIDczNTAsIDAsIDAsIDAKK307CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcDRhX3BheV9wYXJzZV9hdWRpb19jb25maWcgKEdzdFJ0cE1QNEFQYXkgKiBydHBtcDRhcGF5LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3NpemUgc2l6ZTsKKyAgZ3VpbnQ4IG9iamVjdFR5cGU7CisgIGd1aW50OCBzYW1wbGluZ0lkeDsKKyAgZ3VpbnQ4IGNoYW5uZWxDZmc7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworICBzaXplID0gbWFwLnNpemU7CisKKyAgaWYgKHNpemUgPCAyKQorICAgIGdvdG8gdG9vX3Nob3J0OworCisgIC8qIGFueSBvYmplY3QgdHlwZSBpcyBmaW5lLCB3ZSBuZWVkIHRvIGNvcHkgaXQgdG8gdGhlIHByb2ZpbGUtbGV2ZWwtaWQgZmllbGQuICovCisgIG9iamVjdFR5cGUgPSAoZGF0YVswXSAmIDB4ZjgpID4+IDM7CisgIGlmIChvYmplY3RUeXBlID09IDApCisgICAgZ290byBpbnZhbGlkX29iamVjdDsKKworICBzYW1wbGluZ0lkeCA9ICgoZGF0YVswXSAmIDB4MDcpIDw8IDEpIHwgKChkYXRhWzFdICYgMHg4MCkgPj4gNyk7CisgIC8qIG9ubHkgZml4ZWQgdmFsdWVzIGZvciBub3cgKi8KKyAgaWYgKHNhbXBsaW5nSWR4ID4gMTIgJiYgc2FtcGxpbmdJZHggIT0gMTUpCisgICAgZ290byB3cm9uZ19mcmVxOworCisgIGNoYW5uZWxDZmcgPSAoKGRhdGFbMV0gJiAweDc4KSA+PiAzKTsKKyAgaWYgKGNoYW5uZWxDZmcgPiA3KQorICAgIGdvdG8gd3JvbmdfY2hhbm5lbHM7CisKKyAgLyogcnRwIHJhdGUgZGVwZW5kcyBvbiBzYW1wbGluZyByYXRlIG9mIHRoZSBhdWRpbyAqLworICBpZiAoc2FtcGxpbmdJZHggPT0gMTUpIHsKKyAgICBpZiAoc2l6ZSA8IDUpCisgICAgICBnb3RvIHRvb19zaG9ydDsKKworICAgIC8qIGluZGV4IG9mIDE1IG1lYW5zIHdlIGdldCB0aGUgcmF0ZSBpbiB0aGUgbmV4dCAyNCBiaXRzICovCisgICAgcnRwbXA0YXBheS0+cmF0ZSA9ICgoZGF0YVsxXSAmIDB4N2YpIDw8IDE3KSB8CisgICAgICAgICgoZGF0YVsyXSkgPDwgOSkgfCAoKGRhdGFbM10pIDw8IDEpIHwgKChkYXRhWzRdICYgMHg4MCkgPj4gNyk7CisgIH0gZWxzZSB7CisgICAgLyogZWxzZSB1c2UgdGhlIHJhdGUgZnJvbSB0aGUgdGFibGUgKi8KKyAgICBydHBtcDRhcGF5LT5yYXRlID0gc2FtcGxpbmdfdGFibGVbc2FtcGxpbmdJZHhdOworICB9CisgIC8qIGV4dHJhIHJ0cCBwYXJhbXMgY29udGFpbiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzICovCisgIGdfZnJlZSAocnRwbXA0YXBheS0+cGFyYW1zKTsKKyAgcnRwbXA0YXBheS0+cGFyYW1zID0gZ19zdHJkdXBfcHJpbnRmICgiJWQiLCBjaGFubmVsQ2ZnKTsKKyAgLyogYXVkaW8gc3RyZWFtIHR5cGUgKi8KKyAgcnRwbXA0YXBheS0+c3RyZWFtdHlwZSA9ICI1IjsKKyAgLyogcHJvZmlsZSAqLworICBnX2ZyZWUgKHJ0cG1wNGFwYXktPnByb2ZpbGUpOworICBydHBtcDRhcGF5LT5wcm9maWxlID0gZ19zdHJkdXBfcHJpbnRmICgiJWQiLCBvYmplY3RUeXBlKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRhcGF5LAorICAgICAgIm9iamVjdFR5cGU6ICVkLCBzYW1wbGluZ0lkeDogJWQgKCVkKSwgY2hhbm5lbENmZzogJWQiLCBvYmplY3RUeXBlLAorICAgICAgc2FtcGxpbmdJZHgsIHJ0cG1wNGFwYXktPnJhdGUsIGNoYW5uZWxDZmcpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1IgKi8KK3Rvb19zaG9ydDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChydHBtcDRhcGF5LCBTVFJFQU0sIEZPUk1BVCwKKyAgICAgICAgKE5VTEwpLAorICAgICAgICAoImNvbmZpZyBzdHJpbmcgdG9vIHNob3J0LCBleHBlY3RlZCAyIGJ5dGVzLCBnb3QgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICAgICAgICBzaXplKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfb2JqZWN0OgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHJ0cG1wNGFwYXksIFNUUkVBTSwgRk9STUFULAorICAgICAgICAoTlVMTCksICgiaW52YWxpZCBvYmplY3QgdHlwZSAwIikpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit3cm9uZ19mcmVxOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHJ0cG1wNGFwYXksIFNUUkVBTSwgTk9UX0lNUExFTUVOVEVELAorICAgICAgICAoTlVMTCksICgidW5zdXBwb3J0ZWQgZnJlcXVlbmN5IGluZGV4ICVkIiwgc2FtcGxpbmdJZHgpKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgIHJldHVybiBGQUxTRTsKKyAgfQord3JvbmdfY2hhbm5lbHM6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocnRwbXA0YXBheSwgU1RSRUFNLCBOT1RfSU1QTEVNRU5URUQsCisgICAgICAgIChOVUxMKSwgKCJ1bnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHMgJWQsIG11c3QgPCA4IiwgY2hhbm5lbENmZykpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcDRhX3BheV9uZXdfY2FwcyAoR3N0UnRwTVA0QVBheSAqIHJ0cG1wNGFwYXkpCit7CisgIGdjaGFyICpjb25maWc7CisgIEdWYWx1ZSB2ID0geyAwIH07CisgIGdib29sZWFuIHJlczsKKworICBnX3ZhbHVlX2luaXQgKCZ2LCBHU1RfVFlQRV9CVUZGRVIpOworICBnc3RfdmFsdWVfc2V0X2J1ZmZlciAoJnYsIHJ0cG1wNGFwYXktPmNvbmZpZyk7CisgIGNvbmZpZyA9IGdzdF92YWx1ZV9zZXJpYWxpemUgKCZ2KTsKKworICByZXMgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAoR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHJ0cG1wNGFwYXkpLAorICAgICAgImNwcmVzZW50IiwgR19UWVBFX1NUUklORywgIjAiLCAiY29uZmlnIiwgR19UWVBFX1NUUklORywgY29uZmlnLCBOVUxMKTsKKworICBnX3ZhbHVlX3Vuc2V0ICgmdik7CisgIGdfZnJlZSAoY29uZmlnKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfbXA0YV9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UnRwTVA0QVBheSAqcnRwbXA0YXBheTsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGNvbnN0IEdWYWx1ZSAqY29kZWNfZGF0YTsKKyAgZ2Jvb2xlYW4gcmVzLCBmcmFtZWQgPSBUUlVFOworICBjb25zdCBnY2hhciAqc3RyZWFtX2Zvcm1hdDsKKworICBydHBtcDRhcGF5ID0gR1NUX1JUUF9NUDRBX1BBWSAocGF5bG9hZCk7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgLyogdGhpcyBpcyBhbHJlYWR5IGhhbmRsZWQgYnkgdGhlIHRlbXBsYXRlIGNhcHMsIGJ1dCBpdCBpcyBiZXR0ZXIKKyAgICogdG8gbGVhdmUgaGVyZSB0byBoYXZlIG1lYW5pbmdmdWwgd2FybmluZyBtZXNzYWdlcyB3aGVuIGxpbmtpbmcKKyAgICogZmFpbHMgKi8KKyAgc3RyZWFtX2Zvcm1hdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAic3RyZWFtLWZvcm1hdCIpOworICBpZiAoc3RyZWFtX2Zvcm1hdCkgeworICAgIGlmIChzdHJjbXAgKHN0cmVhbV9mb3JtYXQsICJyYXciKSAhPSAwKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cG1wNGFwYXksICJBQUMncyBzdHJlYW0tZm9ybWF0IG11c3QgYmUgJ3JhdycsICIKKyAgICAgICAgICAiJXMgaXMgbm90IHN1cHBvcnRlZCIsIHN0cmVhbV9mb3JtYXQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cG1wNGFwYXksICJBQUMncyBzdHJlYW0tZm9ybWF0IG5vdCBzcGVjaWZpZWQsICIKKyAgICAgICAgImFzc3VtaW5nICdyYXcnIik7CisgIH0KKworICBjb2RlY19kYXRhID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImNvZGVjX2RhdGEiKTsKKyAgaWYgKGNvZGVjX2RhdGEpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocnRwbXA0YXBheSwgImdvdCBjb2RlY19kYXRhIik7CisgICAgaWYgKEdfVkFMVUVfVFlQRSAoY29kZWNfZGF0YSkgPT0gR1NUX1RZUEVfQlVGRkVSKSB7CisgICAgICBHc3RCdWZmZXIgKmJ1ZmZlciwgKmNidWZmZXI7CisgICAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICAgIEdzdE1hcEluZm8gY21hcDsKKyAgICAgIGd1aW50IGk7CisKKyAgICAgIGJ1ZmZlciA9IGdzdF92YWx1ZV9nZXRfYnVmZmVyIChjb2RlY19kYXRhKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBtcDRhcGF5LCAiY29uZmlndXJpbmcgY29kZWNfZGF0YSIpOworCisgICAgICAvKiBwYXJzZSBidWZmZXIgKi8KKyAgICAgIHJlcyA9IGdzdF9ydHBfbXA0YV9wYXlfcGFyc2VfYXVkaW9fY29uZmlnIChydHBtcDRhcGF5LCBidWZmZXIpOworCisgICAgICBpZiAoIXJlcykKKyAgICAgICAgZ290byBjb25maWdfZmFpbGVkOworCisgICAgICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgICAgICAvKiBtYWtlIHRoZSBTdHJlYW1NdXhDb25maWcsIHdlIG5lZWQgMTUgYml0cyBmb3IgdGhlIGhlYWRlciAqLworICAgICAgY2J1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobWFwLnNpemUgKyAyKTsKKyAgICAgIGdzdF9idWZmZXJfbWFwIChjYnVmZmVyLCAmY21hcCwgR1NUX01BUF9XUklURSk7CisKKyAgICAgIG1lbXNldCAoY21hcC5kYXRhLCAwLCBtYXAuc2l6ZSArIDIpOworCisgICAgICAvKiBDcmVhdGUgU3RyZWFtTXV4Q29uZmlnIGFjY29yZGluZyB0byBJU08vSUVDIDE0NDk2LTM6CisgICAgICAgKgorICAgICAgICogYXVkaW9NdXhWZXJzaW9uICAgICAgICAgICA9PSAwICgxIGJpdCkKKyAgICAgICAqIGFsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcgPT0gMSAoMSBiaXQpCisgICAgICAgKiBudW1TdWJGcmFtZXMgICAgICAgICAgICAgID09IG51bVN1YkZyYW1lcyAoNiBiaXRzKQorICAgICAgICogbnVtUHJvZ3JhbSAgICAgICAgICAgICAgICA9PSAwICg0IGJpdHMpCisgICAgICAgKiBudW1MYXllciAgICAgICAgICAgICAgICAgID09IDAgKDMgYml0cykKKyAgICAgICAqLworICAgICAgY21hcC5kYXRhWzBdID0gMHg0MDsKKyAgICAgIGNtYXAuZGF0YVsxXSA9IDB4MDA7CisKKyAgICAgIC8qIGFwcGVuZCB0aGUgY29uZmlnIGJpdHMsIHNoaWZ0aW5nIHRoZW0gMSBiaXQgbGVmdCAqLworICAgICAgZm9yIChpID0gMDsgaSA8IG1hcC5zaXplOyBpKyspIHsKKyAgICAgICAgY21hcC5kYXRhW2kgKyAxXSB8PSAoKG1hcC5kYXRhW2ldICYgMHg4MCkgPj4gNyk7CisgICAgICAgIGNtYXAuZGF0YVtpICsgMl0gfD0gKChtYXAuZGF0YVtpXSAmIDB4N2YpIDw8IDEpOworICAgICAgfQorCisgICAgICBnc3RfYnVmZmVyX3VubWFwIChjYnVmZmVyLCAmY21hcCk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgICAgICAvKiBub3cgd2UgY2FuIGNvbmZpZ3VyZSB0aGUgYnVmZmVyICovCisgICAgICBpZiAocnRwbXA0YXBheS0+Y29uZmlnKQorICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChydHBtcDRhcGF5LT5jb25maWcpOworICAgICAgcnRwbXA0YXBheS0+Y29uZmlnID0gY2J1ZmZlcjsKKyAgICB9CisgIH0KKworICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfYm9vbGVhbiAoc3RydWN0dXJlLCAiZnJhbWVkIiwgJmZyYW1lZCkgJiYgIWZyYW1lZCkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGF5bG9hZCwgIk5lZWQgZnJhbWVkIEFBQyBkYXRhIGFzIGlucHV0ISIpOworICB9CisKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHBheWxvYWQsICJhdWRpbyIsIFRSVUUsICJNUDRBLUxBVE0iLAorICAgICAgcnRwbXA0YXBheS0+cmF0ZSk7CisKKyAgcmVzID0gZ3N0X3J0cF9tcDRhX3BheV9uZXdfY2FwcyAocnRwbXA0YXBheSk7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK2NvbmZpZ19mYWlsZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRhcGF5LCAiZmFpbGVkIHRvIHBhcnNlIGNvbmZpZyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisjZGVmaW5lIFJUUF9IRUFERVJfTEVOIDEyCisKKy8qIHdlIGV4cGVjdCBidWZmZXJzIGFzIGV4YWN0bHkgb25lIGNvbXBsZXRlIEFVCisgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX21wNGFfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSdHBNUDRBUGF5ICpydHBtcDRhcGF5OworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0QnVmZmVyTGlzdCAqbGlzdDsKKyAgZ3VpbnQgbXR1OworICBndWludCBvZmZzZXQ7CisgIGdzaXplIHNpemU7CisgIGdib29sZWFuIGZyYWdtZW50ZWQ7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisKKyAgcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgcnRwbXA0YXBheSA9IEdTVF9SVFBfTVA0QV9QQVkgKGJhc2VwYXlsb2FkKTsKKworICBvZmZzZXQgPSAwOworICBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKTsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKTsKKworICBmcmFnbWVudGVkID0gRkFMU0U7CisgIG10dSA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEX01UVSAocnRwbXA0YXBheSk7CisKKyAgbGlzdCA9IGdzdF9idWZmZXJfbGlzdF9uZXdfc2l6ZWQgKHNpemUgLyAobXR1IC0gUlRQX0hFQURFUl9MRU4pICsgMSk7CisKKyAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgZ3VpbnQgdG93cml0ZTsKKyAgICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgICBndWludCBwYXlsb2FkX2xlbjsKKyAgICBndWludCBwYWNrZXRfbGVuOworICAgIGd1aW50IGhlYWRlcl9sZW47CisgICAgR3N0QnVmZmVyICpwYXlidWY7CisgICAgR3N0UlRQQnVmZmVyIHJ0cCA9IHsgTlVMTCB9OworCisgICAgaGVhZGVyX2xlbiA9IDA7CisgICAgaWYgKCFmcmFnbWVudGVkKSB7CisgICAgICBndWludCBjb3VudDsKKyAgICAgIC8qIGZpcnN0IHBhY2tldCBjYWxjdWxhdGUgc3BhY2UgZm9yIHRoZSBwYWNrZXQgaW5jbHVkaW5nIHRoZSBoZWFkZXIgKi8KKyAgICAgIGNvdW50ID0gc2l6ZTsKKyAgICAgIHdoaWxlIChjb3VudCA+PSAweGZmKSB7CisgICAgICAgIGhlYWRlcl9sZW4rKzsKKyAgICAgICAgY291bnQgLT0gMHhmZjsKKyAgICAgIH0KKyAgICAgIGhlYWRlcl9sZW4rKzsKKyAgICB9CisKKyAgICBwYWNrZXRfbGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYWNrZXRfbGVuIChoZWFkZXJfbGVuICsgc2l6ZSwgMCwgMCk7CisgICAgdG93cml0ZSA9IE1JTiAocGFja2V0X2xlbiwgbXR1KTsKKyAgICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2NhbGNfcGF5bG9hZF9sZW4gKHRvd3JpdGUsIDAsIDApOworICAgIHBheWxvYWRfbGVuIC09IGhlYWRlcl9sZW47CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRhcGF5LAorICAgICAgICAiYXZhaWwgJSIgR19HU0laRV9GT1JNQVQKKyAgICAgICAgIiwgaGVhZGVyX2xlbiAlZCwgcGFja2V0X2xlbiAlZCwgcGF5bG9hZF9sZW4gJWQiLCBzaXplLCBoZWFkZXJfbGVuLAorICAgICAgICBwYWNrZXRfbGVuLCBwYXlsb2FkX2xlbik7CisKKyAgICAvKiBjcmVhdGUgYnVmZmVyIHRvIGhvbGQgdGhlIHBheWxvYWQuICovCisgICAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChoZWFkZXJfbGVuLCAwLCAwKTsKKworICAgIC8qIGNvcHkgcGF5bG9hZCAqLworICAgIGdzdF9ydHBfYnVmZmVyX21hcCAob3V0YnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKworICAgIGlmICghZnJhZ21lbnRlZCkgeworICAgICAgZ3VpbnQ4ICpwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHApOworICAgICAgZ3VpbnQgY291bnQ7CisKKyAgICAgIC8qIGZpcnN0IHBhY2tldCB3cml0ZSB0aGUgaGVhZGVyICovCisgICAgICBjb3VudCA9IHNpemU7CisgICAgICB3aGlsZSAoY291bnQgPj0gMHhmZikgeworICAgICAgICAqcGF5bG9hZCsrID0gMHhmZjsKKyAgICAgICAgY291bnQgLT0gMHhmZjsKKyAgICAgIH0KKyAgICAgICpwYXlsb2FkKysgPSBjb3VudDsKKyAgICB9CisKKyAgICAvKiBtYXJrZXIgb25seSBpZiB0aGUgcGFja2V0IGlzIGNvbXBsZXRlICovCisgICAgZ3N0X3J0cF9idWZmZXJfc2V0X21hcmtlciAoJnJ0cCwgc2l6ZSA9PSBwYXlsb2FkX2xlbik7CisKKyAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgICAvKiBjcmVhdGUgYSBuZXcgYnVmIHRvIGhvbGQgdGhlIHBheWxvYWQgKi8KKyAgICBwYXlidWYgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsCisgICAgICAgIG9mZnNldCwgcGF5bG9hZF9sZW4pOworCisgICAgLyogam9pbiBtZW1vcnkgcGFydHMgKi8KKyAgICBnc3RfcnRwX2NvcHlfYXVkaW9fbWV0YSAocnRwbXA0YXBheSwgb3V0YnVmLCBwYXlidWYpOworICAgIG91dGJ1ZiA9IGdzdF9idWZmZXJfYXBwZW5kIChvdXRidWYsIHBheWJ1Zik7CisgICAgZ3N0X2J1ZmZlcl9saXN0X2FkZCAobGlzdCwgb3V0YnVmKTsKKyAgICBvZmZzZXQgKz0gcGF5bG9hZF9sZW47CisgICAgc2l6ZSAtPSBwYXlsb2FkX2xlbjsKKworICAgIC8qIGNvcHkgaW5jb21taW5nIHRpbWVzdGFtcCAoaWYgYW55KSB0byBvdXRnb2luZyBidWZmZXJzICovCisgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSB0aW1lc3RhbXA7CisKKyAgICBmcmFnbWVudGVkID0gVFJVRTsKKyAgfQorCisgIHJldCA9CisgICAgICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoX2xpc3QgKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBtcDRhcGF5KSwgbGlzdCk7CisKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9tcDRhX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cG1wNGFwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfTVA0QV9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmggYi9nc3QvcnRwL2dzdHJ0cG1wNGFwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWQ5YjY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmgKQEAgLTAsMCArMSw2NSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX01QNEFfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfTVA0QV9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9NUDRBX1BBWSBcCisgIChnc3RfcnRwX21wNGFfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfTVA0QV9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfTVA0QV9QQVksR3N0UnRwTVA0QVBheSkpCisjZGVmaW5lIEdTVF9SVFBfTVA0QV9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX01QNEFfUEFZLEdzdFJ0cE1QNEFQYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfTVA0QV9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfTVA0QV9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QNEFfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUDRBX1BBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBNUDRBUGF5IEdzdFJ0cE1QNEFQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTVA0QVBheUNsYXNzIEdzdFJ0cE1QNEFQYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBNUDRBUGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkICAgIHBheWxvYWQ7CisKKyAgZ2ludCAgICAgICAgICByYXRlOworICBnY2hhciAgICAgICAgKnBhcmFtczsKKyAgZ2NoYXIgICAgICAgICpwcm9maWxlOworICBjb25zdCBnY2hhciAgKnN0cmVhbXR5cGU7CisgIEdzdEJ1ZmZlciAgICAqY29uZmlnOworfTsKKworc3RydWN0IF9Hc3RSdHBNUDRBUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX21wNGFfcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9tcDRhX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9NUDRBX1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZDkxYzQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jCkBAIC0wLDAgKzEsNzg5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCisjaW5jbHVkZSAiZ3N0cnRwbXA0Z2RlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwbXA0Z2RlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBtcDRnZGVwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX21wNGdfZGVwYXlfc3JjX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8vbXBlZywiCisgICAgICAgICJtcGVndmVyc2lvbj0oaW50KSA0LCIKKyAgICAgICAgInN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZTsiCisgICAgICAgICJhdWRpby9tcGVnLCIgIm1wZWd2ZXJzaW9uPShpbnQpIDQsICIgInN0cmVhbS1mb3JtYXQ9KHN0cmluZylyYXciKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX21wNGdfZGVwYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSB7IFwidmlkZW9cIiwgXCJhdWRpb1wiLCBcImFwcGxpY2F0aW9uXCIgfSwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVggXSwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTVBFRzQtR0VORVJJQ1wiLCAiCisgICAgICAgIC8qIHJlcXVpcmVkIHN0cmluZyBwYXJhbXMgKi8KKyAgICAgICAgLyogInN0cmVhbXR5cGUgPSAoc3RyaW5nKSB7IFwiNFwiLCBcIjVcIiB9LCAiICBOb3Qgc2V0IGJ5IFdvd3phICAgIDQgPSB2aWRlbywgNSA9IGF1ZGlvICovCisgICAgICAgIC8qICJwcm9maWxlLWxldmVsLWlkID0gKHN0cmluZykgWzEsTUFYXSwgIiAqLworICAgICAgICAvKiAiY29uZmlnID0gKHN0cmluZykgWzEsTUFYXSIgKi8KKyAgICAgICAgIm1vZGUgPSAoc3RyaW5nKSB7IFwiZ2VuZXJpY1wiLCBcIkNFTFAtY2JyXCIsIFwiQ0VMUC12YnJcIiwgXCJBQUMtbGJyXCIsIFwiQUFDLWhiclwiIH0gIgorICAgICAgICAvKiBPcHRpb25hbCBnZW5lcmFsIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgLyogIm9iamVjdHR5cGUgPSAoc3RyaW5nKSBbMSxNQVhdLCAiICovCisgICAgICAgIC8qICJjb25zdGFudHNpemUgPSAoc3RyaW5nKSBbMSxNQVhdLCAiICovLyogY29uc3RhbnQgc2l6ZSBvZiBlYWNoIEFVICovCisgICAgICAgIC8qICJjb25zdGFudGR1cmF0aW9uID0gKHN0cmluZykgWzEsTUFYXSwgIiAqLy8qIGNvbnN0YW50IGR1cmF0aW9uIG9mIGVhY2ggQVUgKi8KKyAgICAgICAgLyogIm1heGRpc3BsYWNlbWVudCA9IChzdHJpbmcpIFsxLE1BWF0sICIgKi8KKyAgICAgICAgLyogImRlLWludGVybGVhdmVidWZmZXJzaXplID0gKHN0cmluZykgWzEsTUFYXSwgIiAqLworICAgICAgICAvKiBPcHRpb25hbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgLyogInNpemVsZW5ndGggPSAoc3RyaW5nKSBbMSwgMzJdLCAiICovCisgICAgICAgIC8qICJpbmRleGxlbmd0aCA9IChzdHJpbmcpIFsxLCAzMl0sICIgKi8KKyAgICAgICAgLyogImluZGV4ZGVsdGFsZW5ndGggPSAoc3RyaW5nKSBbMSwgMzJdLCAiICovCisgICAgICAgIC8qICJjdHNkZWx0YWxlbmd0aCA9IChzdHJpbmcpIFsxLCAzMl0sICIgKi8KKyAgICAgICAgLyogImR0c2RlbHRhbGVuZ3RoID0gKHN0cmluZykgWzEsIDMyXSwgIiAqLworICAgICAgICAvKiAicmFuZG9tYWNjZXNzaW5kaWNhdGlvbiA9IChzdHJpbmcpIHswLCAxfSwgIiAqLworICAgICAgICAvKiAic3RyZWFtc3RhdGVpbmRpY2F0aW9uID0gKHN0cmluZykgWzAsIDMyXSwgIiAqLworICAgICAgICAvKiAiYXV4aWxpYXJ5ZGF0YXNpemVsZW5ndGggPSAoc3RyaW5nKSBbMCwgMzJdIiAqLyApCisgICAgKTsKKworLyogc2ltcGxlIGJpdHN0cmVhbSBwYXJzZXIgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IGd1aW50OCAqZGF0YTsKKyAgY29uc3QgZ3VpbnQ4ICplbmQ7CisgIGdpbnQgaGVhZDsgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyBpbiB0aGUgY2FjaGUgb2YgbmV4dCBiaXQgKi8KKyAgZ3VpbnQ2NCBjYWNoZTsgICAgICAgICAgICAgICAgLyogY2FjaGVkIGJ5dGVzICovCit9IEdzdEJzUGFyc2U7CisKK3N0YXRpYyB2b2lkCitnc3RfYnNfcGFyc2VfaW5pdCAoR3N0QnNQYXJzZSAqIGJzLCBjb25zdCBndWludDggKiBkYXRhLCBndWludCBzaXplKQoreworICBicy0+ZGF0YSA9IGRhdGE7CisgIGJzLT5lbmQgPSBkYXRhICsgc2l6ZTsKKyAgYnMtPmhlYWQgPSAwOworICBicy0+Y2FjaGUgPSAweGZmZmZmZmZmOworfQorCitzdGF0aWMgZ3VpbnQzMgorZ3N0X2JzX3BhcnNlX3JlYWQgKEdzdEJzUGFyc2UgKiBicywgZ3VpbnQgbikKK3sKKyAgZ3VpbnQzMiByZXMgPSAwOworICBnaW50IHNoaWZ0OworCisgIGlmIChuID09IDApCisgICAgcmV0dXJuIHJlczsKKworICAvKiBmaWxsIHVwIHRoZSBjYWNoZSBpZiB3ZSBuZWVkIHRvICovCisgIHdoaWxlIChicy0+aGVhZCA8IG4pIHsKKyAgICBpZiAoYnMtPmRhdGEgPj0gYnMtPmVuZCkgeworICAgICAgLyogd2UncmUgYXQgdGhlIGVuZCwgY2FuJ3QgcHJvZHVjZSBtb3JlIHRoYW4gaGVhZCBudW1iZXIgb2YgYml0cyAqLworICAgICAgbiA9IGJzLT5oZWFkOworICAgICAgYnJlYWs7CisgICAgfQorICAgIC8qIHNoaWZ0IGJ5dGVzIGluIGNhY2hlLCBtb3ZpbmcgdGhlIGhlYWQgYml0cyBvZiB0aGUgY2FjaGUgbGVmdCAqLworICAgIGJzLT5jYWNoZSA9IChicy0+Y2FjaGUgPDwgOCkgfCAqYnMtPmRhdGErKzsKKyAgICBicy0+aGVhZCArPSA4OworICB9CisKKyAgLyogYnJpbmcgdGhlIHJlcXVpcmVkIGJpdHMgZG93biBhbmQgdHJ1bmNhdGUgKi8KKyAgaWYgKChzaGlmdCA9IGJzLT5oZWFkIC0gbikgPiAwKQorICAgIHJlcyA9IGJzLT5jYWNoZSA+PiBzaGlmdDsKKyAgZWxzZQorICAgIHJlcyA9IGJzLT5jYWNoZTsKKworICAvKiBtYXNrIG91dCByZXF1aXJlZCBiaXRzICovCisgIGlmIChuIDwgMzIpCisgICAgcmVzICY9ICgxIDw8IG4pIC0gMTsKKworICBicy0+aGVhZCA9IHNoaWZ0OworCisgIHJldHVybiByZXM7Cit9CisKKworI2RlZmluZSBnc3RfcnRwX21wNGdfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwTVA0R0RlcGF5LCBnc3RfcnRwX21wNGdfZGVwYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfREVQQVlMT0FEKTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9tcDRnX2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfbXA0Z19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfbXA0Z19kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9tcDRnX2RlcGF5X2hhbmRsZV9ldmVudCAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGZpbHRlciwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfbXA0Z19kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKgorICAgIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wNGdfZGVwYXlfY2xhc3NfaW5pdCAoR3N0UnRwTVA0R0RlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9tcDRnX2RlcGF5X2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfbXA0Z19kZXBheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+cHJvY2Vzc19ydHBfcGFja2V0ID0gZ3N0X3J0cF9tcDRnX2RlcGF5X3Byb2Nlc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9tcDRnX2RlcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPmhhbmRsZV9ldmVudCA9IGdzdF9ydHBfbXA0Z19kZXBheV9oYW5kbGVfZXZlbnQ7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9tcDRnX2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfbXA0Z19kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBNUEVHNCBFUyBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgTVBFRzQgZWxlbWVudGFyeSBzdHJlYW1zIGZyb20gUlRQIHBhY2tldHMgKFJGQyAzNjQwKSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwbXA0Z2RlcGF5X2RlYnVnLCAicnRwbXA0Z2RlcGF5IiwgMCwKKyAgICAgICJNUDQtZ2VuZXJpYyBSVFAgRGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXA0Z19kZXBheV9pbml0IChHc3RSdHBNUDRHRGVwYXkgKiBydHBtcDRnZGVwYXkpCit7CisgIHJ0cG1wNGdkZXBheS0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKKyAgcnRwbXA0Z2RlcGF5LT5wYWNrZXRzID0gZ19xdWV1ZV9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wNGdfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cE1QNEdEZXBheSAqcnRwbXA0Z2RlcGF5OworCisgIHJ0cG1wNGdkZXBheSA9IEdTVF9SVFBfTVA0R19ERVBBWSAob2JqZWN0KTsKKworICBnX29iamVjdF91bnJlZiAocnRwbXA0Z2RlcGF5LT5hZGFwdGVyKTsKKyAgcnRwbXA0Z2RlcGF5LT5hZGFwdGVyID0gTlVMTDsKKyAgZ19xdWV1ZV9mcmVlIChydHBtcDRnZGVwYXktPnBhY2tldHMpOworICBydHBtcDRnZGVwYXktPnBhY2tldHMgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIGdpbnQKK2dzdF9ydHBfbXA0Z19kZXBheV9wYXJzZV9pbnQgKEdzdFN0cnVjdHVyZSAqIHN0cnVjdHVyZSwgY29uc3QgZ2NoYXIgKiBmaWVsZCwKKyAgICBnaW50IGRlZikKK3sKKyAgY29uc3QgZ2NoYXIgKnN0cjsKKyAgZ2ludCByZXM7CisKKyAgaWYgKChzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgZmllbGQpKSkKKyAgICByZXR1cm4gYXRvaSAoc3RyKTsKKworICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsIGZpZWxkLCAmcmVzKSkKKyAgICByZXR1cm4gcmVzOworCisgIHJldHVybiBkZWY7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcDRnX2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgR3N0UnRwTVA0R0RlcGF5ICpydHBtcDRnZGVwYXk7CisgIEdzdENhcHMgKnNyY2NhcHMgPSBOVUxMOworICBjb25zdCBnY2hhciAqc3RyOworICBnaW50IGNsb2NrX3JhdGU7CisgIGdpbnQgc29tZWludDsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHJ0cG1wNGdkZXBheSA9IEdTVF9SVFBfTVA0R19ERVBBWSAoZGVwYXlsb2FkKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkKKyAgICBjbG9ja19yYXRlID0gOTAwMDA7ICAgICAgICAgLyogZGVmYXVsdCAqLworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIGlmICgoc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJtZWRpYSIpKSkgeworICAgIGlmIChzdHJjbXAgKHN0ciwgImF1ZGlvIikgPT0gMCkgeworICAgICAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby9tcGVnIiwKKyAgICAgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCA0LCAic3RyZWFtLWZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJyYXciLAorICAgICAgICAgIE5VTEwpOworICAgIH0gZWxzZSBpZiAoc3RyY21wIChzdHIsICJ2aWRlbyIpID09IDApIHsKKyAgICAgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8vbXBlZyIsCisgICAgICAgICAgIm1wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgNCwKKyAgICAgICAgICAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgICB9CisgIH0KKyAgaWYgKHNyY2NhcHMgPT0gTlVMTCkKKyAgICBnb3RvIHVua25vd25fbWVkaWE7CisKKyAgLyogdGhlc2UgdmFsdWVzIGFyZSBvcHRpb25hbCBhbmQgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgb2YgMCAobm8gaGVhZGVyKSAqLworICBydHBtcDRnZGVwYXktPnNpemVsZW5ndGggPQorICAgICAgZ3N0X3J0cF9tcDRnX2RlcGF5X3BhcnNlX2ludCAoc3RydWN0dXJlLCAic2l6ZWxlbmd0aCIsIDApOworICBydHBtcDRnZGVwYXktPmluZGV4bGVuZ3RoID0KKyAgICAgIGdzdF9ydHBfbXA0Z19kZXBheV9wYXJzZV9pbnQgKHN0cnVjdHVyZSwgImluZGV4bGVuZ3RoIiwgMCk7CisgIHJ0cG1wNGdkZXBheS0+aW5kZXhkZWx0YWxlbmd0aCA9CisgICAgICBnc3RfcnRwX21wNGdfZGVwYXlfcGFyc2VfaW50IChzdHJ1Y3R1cmUsICJpbmRleGRlbHRhbGVuZ3RoIiwgMCk7CisgIHJ0cG1wNGdkZXBheS0+Y3RzZGVsdGFsZW5ndGggPQorICAgICAgZ3N0X3J0cF9tcDRnX2RlcGF5X3BhcnNlX2ludCAoc3RydWN0dXJlLCAiY3RzZGVsdGFsZW5ndGgiLCAwKTsKKyAgcnRwbXA0Z2RlcGF5LT5kdHNkZWx0YWxlbmd0aCA9CisgICAgICBnc3RfcnRwX21wNGdfZGVwYXlfcGFyc2VfaW50IChzdHJ1Y3R1cmUsICJkdHNkZWx0YWxlbmd0aCIsIDApOworICBzb21laW50ID0KKyAgICAgIGdzdF9ydHBfbXA0Z19kZXBheV9wYXJzZV9pbnQgKHN0cnVjdHVyZSwgInJhbmRvbWFjY2Vzc2luZGljYXRpb24iLCAwKTsKKyAgcnRwbXA0Z2RlcGF5LT5yYW5kb21hY2Nlc3NpbmRpY2F0aW9uID0gc29tZWludCA+IDAgPyAxIDogMDsKKyAgcnRwbXA0Z2RlcGF5LT5zdHJlYW1zdGF0ZWluZGljYXRpb24gPQorICAgICAgZ3N0X3J0cF9tcDRnX2RlcGF5X3BhcnNlX2ludCAoc3RydWN0dXJlLCAic3RyZWFtc3RhdGVpbmRpY2F0aW9uIiwgMCk7CisgIHJ0cG1wNGdkZXBheS0+YXV4aWxpYXJ5ZGF0YXNpemVsZW5ndGggPQorICAgICAgZ3N0X3J0cF9tcDRnX2RlcGF5X3BhcnNlX2ludCAoc3RydWN0dXJlLCAiYXV4aWxpYXJ5ZGF0YXNpemVsZW5ndGgiLCAwKTsKKyAgcnRwbXA0Z2RlcGF5LT5jb25zdGFudFNpemUgPQorICAgICAgZ3N0X3J0cF9tcDRnX2RlcGF5X3BhcnNlX2ludCAoc3RydWN0dXJlLCAiY29uc3RhbnRzaXplIiwgMCk7CisgIHJ0cG1wNGdkZXBheS0+Y29uc3RhbnREdXJhdGlvbiA9CisgICAgICBnc3RfcnRwX21wNGdfZGVwYXlfcGFyc2VfaW50IChzdHJ1Y3R1cmUsICJjb25zdGFudGR1cmF0aW9uIiwgMCk7CisgIHJ0cG1wNGdkZXBheS0+bWF4RGlzcGxhY2VtZW50ID0KKyAgICAgIGdzdF9ydHBfbXA0Z19kZXBheV9wYXJzZV9pbnQgKHN0cnVjdHVyZSwgIm1heGRpc3BsYWNlbWVudCIsIDApOworCisKKyAgLyogZ2V0IGNvbmZpZyBzdHJpbmcgKi8KKyAgaWYgKChzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImNvbmZpZyIpKSkgeworICAgIEdWYWx1ZSB2ID0geyAwIH07CisKKyAgICBnX3ZhbHVlX2luaXQgKCZ2LCBHU1RfVFlQRV9CVUZGRVIpOworICAgIGlmIChnc3RfdmFsdWVfZGVzZXJpYWxpemUgKCZ2LCBzdHIpKSB7CisgICAgICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKworICAgICAgYnVmZmVyID0gZ3N0X3ZhbHVlX2dldF9idWZmZXIgKCZ2KTsKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKHNyY2NhcHMsCisgICAgICAgICAgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIGJ1ZmZlciwgTlVMTCk7CisgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdfd2FybmluZyAoImNhbm5vdCBjb252ZXJ0IGNvbmZpZyB0byBidWZmZXIiKTsKKyAgICB9CisgIH0KKworICByZXMgPSBnc3RfcGFkX3NldF9jYXBzIChkZXBheWxvYWQtPnNyY3BhZCwgc3JjY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLwordW5rbm93bl9tZWRpYToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cG1wNGdkZXBheSwgIlVua25vd24gbWVkaWEgdHlwZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcDRnX2RlcGF5X2NsZWFyX3F1ZXVlIChHc3RSdHBNUDRHRGVwYXkgKiBydHBtcDRnZGVwYXkpCit7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworCisgIHdoaWxlICgob3V0YnVmID0gZ19xdWV1ZV9wb3BfaGVhZCAocnRwbXA0Z2RlcGF5LT5wYWNrZXRzKSkpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXA0Z19kZXBheV9yZXNldCAoR3N0UnRwTVA0R0RlcGF5ICogcnRwbXA0Z2RlcGF5KQoreworICBnc3RfYWRhcHRlcl9jbGVhciAocnRwbXA0Z2RlcGF5LT5hZGFwdGVyKTsKKyAgcnRwbXA0Z2RlcGF5LT5tYXhfQVVfaW5kZXggPSAtMTsKKyAgcnRwbXA0Z2RlcGF5LT5uZXh0X0FVX2luZGV4ID0gLTE7CisgIHJ0cG1wNGdkZXBheS0+cHJldl9BVV9pbmRleCA9IC0xOworICBydHBtcDRnZGVwYXktPnByZXZfcnRwdGltZSA9IC0xOworICBydHBtcDRnZGVwYXktPmxhc3RfQVVfaW5kZXggPSAtMTsKKyAgZ3N0X3J0cF9tcDRnX2RlcGF5X2NsZWFyX3F1ZXVlIChydHBtcDRnZGVwYXkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcDRnX2RlcGF5X2ZsdXNoX3F1ZXVlIChHc3RSdHBNUDRHRGVwYXkgKiBydHBtcDRnZGVwYXkpCit7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBnYm9vbGVhbiBkaXNjb250ID0gRkFMU0U7CisgIGd1aW50IEFVX2luZGV4OworCisgIHdoaWxlICgob3V0YnVmID0gZ19xdWV1ZV9wb3BfaGVhZCAocnRwbXA0Z2RlcGF5LT5wYWNrZXRzKSkpIHsKKyAgICBBVV9pbmRleCA9IEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXA0Z2RlcGF5LCAibmV4dCBhdmFpbGFibGUgQVVfaW5kZXggJXUiLCBBVV9pbmRleCk7CisKKyAgICBpZiAocnRwbXA0Z2RlcGF5LT5uZXh0X0FVX2luZGV4ICE9IEFVX2luZGV4KSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRnZGVwYXksICJkaXNjb250LCBleHBlY3RlZCBBVV9pbmRleCAldSIsCisgICAgICAgICAgcnRwbXA0Z2RlcGF5LT5uZXh0X0FVX2luZGV4KTsKKyAgICAgIGRpc2NvbnQgPSBUUlVFOworICAgIH0KKworICAgIGlmIChkaXNjb250KSB7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICAgIGRpc2NvbnQgPSBGQUxTRTsKKyAgICB9CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRnZGVwYXksICJwdXNoaW5nIEFVX2luZGV4ICV1IiwgQVVfaW5kZXgpOworICAgIGdzdF9ydHBfZHJvcF9tZXRhIChHU1RfRUxFTUVOVF9DQVNUIChydHBtcDRnZGVwYXkpLCBvdXRidWYsIDApOworICAgIGdzdF9ydHBfYmFzZV9kZXBheWxvYWRfcHVzaCAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRCAocnRwbXA0Z2RlcGF5KSwgb3V0YnVmKTsKKyAgICBydHBtcDRnZGVwYXktPm5leHRfQVVfaW5kZXggPSBBVV9pbmRleCArIDE7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXA0Z19kZXBheV9xdWV1ZSAoR3N0UnRwTVA0R0RlcGF5ICogcnRwbXA0Z2RlcGF5LCBHc3RCdWZmZXIgKiBvdXRidWYpCit7CisgIGd1aW50IEFVX2luZGV4ID0gR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1Zik7CisKKyAgaWYgKHJ0cG1wNGdkZXBheS0+bmV4dF9BVV9pbmRleCA9PSAtMSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cG1wNGdkZXBheSwgIkluaXQgQVUgY291bnRlciAldSIsIEFVX2luZGV4KTsKKyAgICBydHBtcDRnZGVwYXktPm5leHRfQVVfaW5kZXggPSBBVV9pbmRleDsKKyAgfQorCisgIGlmIChydHBtcDRnZGVwYXktPm5leHRfQVVfaW5kZXggPT0gQVVfaW5kZXgpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRnZGVwYXksICJwdXNoaW5nIGV4cGVjdGVkIEFVX2luZGV4ICV1IiwgQVVfaW5kZXgpOworCisgICAgLyogd2UgcmVjZWl2ZWQgdGhlIGV4cGVjdGVkIHBhY2tldCwgcHVzaCBpdCBhbmQgZmx1c2ggYXMgbXVjaCBhcyB3ZSBjYW4gZnJvbQorICAgICAqIHRoZSBxdWV1ZSAqLworICAgIGdzdF9ydHBfZHJvcF9tZXRhIChHU1RfRUxFTUVOVF9DQVNUIChydHBtcDRnZGVwYXkpLCBvdXRidWYsIDApOworICAgIGdzdF9ydHBfYmFzZV9kZXBheWxvYWRfcHVzaCAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRCAocnRwbXA0Z2RlcGF5KSwgb3V0YnVmKTsKKyAgICBydHBtcDRnZGVwYXktPm5leHRfQVVfaW5kZXgrKzsKKworICAgIHdoaWxlICgob3V0YnVmID0gZ19xdWV1ZV9wZWVrX2hlYWQgKHJ0cG1wNGdkZXBheS0+cGFja2V0cykpKSB7CisgICAgICBBVV9pbmRleCA9IEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRnZGVwYXksICJuZXh0IGF2YWlsYWJsZSBBVV9pbmRleCAldSIsIEFVX2luZGV4KTsKKworICAgICAgaWYgKHJ0cG1wNGdkZXBheS0+bmV4dF9BVV9pbmRleCA9PSBBVV9pbmRleCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRnZGVwYXksICJwdXNoaW5nIGV4cGVjdGVkIEFVX2luZGV4ICV1IiwKKyAgICAgICAgICAgIEFVX2luZGV4KTsKKyAgICAgICAgb3V0YnVmID0gZ19xdWV1ZV9wb3BfaGVhZCAocnRwbXA0Z2RlcGF5LT5wYWNrZXRzKTsKKyAgICAgICAgZ3N0X3J0cF9kcm9wX21ldGEgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cG1wNGdkZXBheSksIG91dGJ1ZiwgMCk7CisgICAgICAgIGdzdF9ydHBfYmFzZV9kZXBheWxvYWRfcHVzaCAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRCAocnRwbXA0Z2RlcGF5KSwKKyAgICAgICAgICAgIG91dGJ1Zik7CisgICAgICAgIHJ0cG1wNGdkZXBheS0+bmV4dF9BVV9pbmRleCsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXA0Z2RlcGF5LCAid2FpdGluZyBmb3IgbmV4dCBBVV9pbmRleCAldSIsCisgICAgICAgICAgICBydHBtcDRnZGVwYXktPm5leHRfQVVfaW5kZXgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgR0xpc3QgKmxpc3Q7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRnZGVwYXksICJxdWV1ZWluZyBBVV9pbmRleCAldSIsIEFVX2luZGV4KTsKKworICAgIC8qIGxvb3AgdGhlIGxpc3QgdG8gc2tpcCBzdHJpY3RseSBzbWFsbGVyIEFVX2luZGV4IGJ1ZmZlcnMgKi8KKyAgICBmb3IgKGxpc3QgPSBydHBtcDRnZGVwYXktPnBhY2tldHMtPmhlYWQ7IGxpc3Q7IGxpc3QgPSBnX2xpc3RfbmV4dCAobGlzdCkpIHsKKyAgICAgIGd1aW50IGlkeDsKKyAgICAgIGdpbnQgZ2FwOworCisgICAgICBpZHggPSBHU1RfQlVGRkVSX09GRlNFVCAoR1NUX0JVRkZFUl9DQVNUIChsaXN0LT5kYXRhKSk7CisKKyAgICAgIC8qIGNvbXBhcmUgdGhlIG5ldyBzZXFudW0gdG8gdGhlIG9uZSBpbiB0aGUgYnVmZmVyICovCisgICAgICBnYXAgPSAoZ2ludCkgKGlkeCAtIEFVX2luZGV4KTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXA0Z2RlcGF5LCAiY29tcGFyZSB3aXRoIEFVX2luZGV4ICV1LCBnYXAgJWQiLCBpZHgsCisgICAgICAgICAgZ2FwKTsKKworICAgICAgLyogQVVfaW5kZXggPD0gaWR4LCB3ZSBjYW4gc3RvcCBsb29raW5nICovCisgICAgICBpZiAoR19MSUtFTFkgKGdhcCA+IDApKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKEdfTElLRUxZIChsaXN0KSkKKyAgICAgIGdfcXVldWVfaW5zZXJ0X2JlZm9yZSAocnRwbXA0Z2RlcGF5LT5wYWNrZXRzLCBsaXN0LCBvdXRidWYpOworICAgIGVsc2UKKyAgICAgIGdfcXVldWVfcHVzaF90YWlsIChydHBtcDRnZGVwYXktPnBhY2tldHMsIG91dGJ1Zik7CisgIH0KK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX21wNGdfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RSdHBNUDRHRGVwYXkgKnJ0cG1wNGdkZXBheTsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworCisgIHJ0cG1wNGdkZXBheSA9IEdTVF9SVFBfTVA0R19ERVBBWSAoZGVwYXlsb2FkKTsKKworICAvKiBmbHVzaCByZW1haW5pbmcgZGF0YSBvbiBkaXNjb250ICovCisgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKHJ0cC0+YnVmZmVyKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cG1wNGdkZXBheSwgInJlY2VpdmVkIERJU0NPTlQiKTsKKyAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRwbXA0Z2RlcGF5LT5hZGFwdGVyKTsKKyAgfQorCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChydHAtPmJ1ZmZlcik7CisKKyAgeworICAgIGdpbnQgcGF5bG9hZF9sZW4sIHBheWxvYWRfQVU7CisgICAgZ3VpbnQ4ICpwYXlsb2FkOworICAgIGd1aW50MzIgcnRwdGltZTsKKyAgICBndWludCBBVV9oZWFkZXJzX2xlbjsKKyAgICBndWludCBBVV9zaXplLCBBVV9pbmRleCwgQVVfaW5kZXhfZGVsdGEsIHBheWxvYWRfQVVfc2l6ZTsKKyAgICBnYm9vbGVhbiBNOworCisgICAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisgICAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkIChydHApOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXA0Z2RlcGF5LCAicmVjZWl2ZWQgcGF5bG9hZCBvZiAlZCIsIHBheWxvYWRfbGVuKTsKKworICAgIHJ0cHRpbWUgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wIChydHApOworICAgIE0gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApOworCisgICAgaWYgKHJ0cG1wNGdkZXBheS0+c2l6ZWxlbmd0aCA+IDApIHsKKyAgICAgIGdpbnQgbnVtX0FVX2hlYWRlcnMsIEFVX2hlYWRlcnNfYnl0ZXMsIGk7CisgICAgICBHc3RCc1BhcnNlIGJzOworCisgICAgICBpZiAocGF5bG9hZF9sZW4gPCAyKQorICAgICAgICBnb3RvIHNob3J0X3BheWxvYWQ7CisKKyAgICAgIC8qICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0gLi4gLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAqIHxBVS1oZWFkZXJzLWxlbmd0aHxBVS1oZWFkZXJ8QVUtaGVhZGVyfCAgICAgIHxBVS1oZWFkZXJ8cGFkZGluZ3wKKyAgICAgICAqIHwgICAgICAgICAgICAgICAgIHwgICAoMSkgICB8ICAgKDIpICAgfCAgICAgIHwgICAobikgKiB8IGJpdHMgIHwKKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0gLi4gLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAqCisgICAgICAgKiBUaGUgbGVuZ3RoIGlzIDIgYnl0ZXMgYW5kIGNvbnRhaW5zIHRoZSBsZW5ndGggb2YgdGhlIGZvbGxvd2luZworICAgICAgICogQVUtaGVhZGVycyBpbiBiaXRzLgorICAgICAgICovCisgICAgICBBVV9oZWFkZXJzX2xlbiA9IChwYXlsb2FkWzBdIDw8IDgpIHwgcGF5bG9hZFsxXTsKKyAgICAgIEFVX2hlYWRlcnNfYnl0ZXMgPSAoQVVfaGVhZGVyc19sZW4gKyA3KSAvIDg7CisgICAgICBudW1fQVVfaGVhZGVycyA9IEFVX2hlYWRlcnNfbGVuIC8gMTY7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cG1wNGdkZXBheSwgIkFVIGhlYWRlcnMgbGVuICVkLCBieXRlcyAlZCwgbnVtICVkIiwKKyAgICAgICAgICBBVV9oZWFkZXJzX2xlbiwgQVVfaGVhZGVyc19ieXRlcywgbnVtX0FVX2hlYWRlcnMpOworCisgICAgICAvKiBza2lwIGhlYWRlciAqLworICAgICAgcGF5bG9hZCArPSAyOworICAgICAgcGF5bG9hZF9sZW4gLT0gMjsKKworICAgICAgaWYgKHBheWxvYWRfbGVuIDwgQVVfaGVhZGVyc19ieXRlcykKKyAgICAgICAgZ290byBzaG9ydF9wYXlsb2FkOworCisgICAgICAvKiBza2lwIHNwZWNpYWwgaGVhZGVycywgcG9pbnQgdG8gZmlyc3QgcGF5bG9hZCBBVSAqLworICAgICAgcGF5bG9hZF9BVSA9IDIgKyBBVV9oZWFkZXJzX2J5dGVzOworICAgICAgcGF5bG9hZF9BVV9zaXplID0gcGF5bG9hZF9sZW4gLSBBVV9oZWFkZXJzX2J5dGVzOworCisgICAgICBpZiAoR19VTkxJS0VMWSAocnRwbXA0Z2RlcGF5LT5hdXhpbGlhcnlkYXRhc2l6ZWxlbmd0aCkpIHsKKyAgICAgICAgZ2ludCBhdXhfc2l6ZTsKKworICAgICAgICAvKiBwb2ludCB0aGUgYml0c3RyZWFtIHBhcnNlciB0byB0aGUgZmlyc3QgYXV4aWxpYXJ5IGRhdGEgYml0ICovCisgICAgICAgIGdzdF9ic19wYXJzZV9pbml0ICgmYnMsIHBheWxvYWQgKyBBVV9oZWFkZXJzX2J5dGVzLAorICAgICAgICAgICAgcGF5bG9hZF9sZW4gLSBBVV9oZWFkZXJzX2J5dGVzKTsKKyAgICAgICAgYXV4X3NpemUgPQorICAgICAgICAgICAgZ3N0X2JzX3BhcnNlX3JlYWQgKCZicywgcnRwbXA0Z2RlcGF5LT5hdXhpbGlhcnlkYXRhc2l6ZWxlbmd0aCk7CisgICAgICAgIC8qIGNvbnZlcnQgdG8gYnl0ZXMgKi8KKyAgICAgICAgYXV4X3NpemUgPSAoYXV4X3NpemUgKyA3KSAvIDg7CisgICAgICAgIC8qIEFVIGRhdGEgdGhlbiBmb2xsb3dzIGF1eGlsaWFyeSBkYXRhICovCisgICAgICAgIGlmIChwYXlsb2FkX0FVX3NpemUgPCBhdXhfc2l6ZSkKKyAgICAgICAgICBnb3RvIHNob3J0X3BheWxvYWQ7CisgICAgICAgIHBheWxvYWRfQVUgKz0gYXV4X3NpemU7CisgICAgICAgIHBheWxvYWRfQVVfc2l6ZSAtPSBhdXhfc2l6ZTsKKyAgICAgIH0KKworICAgICAgLyogcG9pbnQgdGhlIGJpdHN0cmVhbSBwYXJzZXIgdG8gdGhlIGZpcnN0IEFVIGhlYWRlciBiaXQgKi8KKyAgICAgIGdzdF9ic19wYXJzZV9pbml0ICgmYnMsIHBheWxvYWQsIHBheWxvYWRfbGVuKTsKKyAgICAgIEFVX2luZGV4ID0gQVVfaW5kZXhfZGVsdGEgPSAwOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX0FVX2hlYWRlcnMgJiYgcGF5bG9hZF9BVV9zaXplID4gMDsgaSsrKSB7CisgICAgICAgIC8qIHBhcnNlIEFVIGhlYWRlcgorICAgICAgICAgKiAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICogIHwgICAgIEFVLXNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAqICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICAgKiAgfCAgICAgQVUtSW5kZXggLyBBVS1JbmRleC1kZWx0YSAgICAgICAgIHwKKyAgICAgICAgICogICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAqICB8ICAgICBDVFMtZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgKiAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICogIHwgICAgIENUUy1kZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAqICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICAgKiAgfCAgICAgRFRTLWZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICogICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAqICB8ICAgICBEVFMtZGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgKiAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICogIHwgICAgIFJBUC1mbGFnICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAqICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICAgKiAgfCAgICAgU3RyZWFtLXN0YXRlICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICogICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAqLworICAgICAgICBBVV9zaXplID0gZ3N0X2JzX3BhcnNlX3JlYWQgKCZicywgcnRwbXA0Z2RlcGF5LT5zaXplbGVuZ3RoKTsKKworICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIEFVX2luZGV4LCB3aGljaCBpcyBvbmx5IG9uIHRoZSBmaXJzdCBBVSBvZiB0aGUgcGFja2V0CisgICAgICAgICAqIGFuZCB0aGUgQVVfaW5kZXhfZGVsdGEgb24gdGhlIG90aGVyIEFVcy4gVGhpcyB3aWxsIGJlIHVzZWQgdG8KKyAgICAgICAgICogcmVjb25zdHJ1Y3QgdGhlIEFVIG9yZGVyaW5nIHdoZW4gaW50ZXJsZWF2aW5nLiAqLworICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgQVVfaW5kZXggPSBnc3RfYnNfcGFyc2VfcmVhZCAoJmJzLCBydHBtcDRnZGVwYXktPmluZGV4bGVuZ3RoKTsKKworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cG1wNGdkZXBheSwgIkFVIGluZGV4ICV1IiwgQVVfaW5kZXgpOworCisgICAgICAgICAgaWYgKEFVX2luZGV4ID09IDAgJiYgcnRwbXA0Z2RlcGF5LT5wcmV2X0FVX2luZGV4ID09IDApIHsKKyAgICAgICAgICAgIGdpbnQgZGlmZjsKKyAgICAgICAgICAgIGdpbnQgY2Q7CisKKyAgICAgICAgICAgIC8qIGlmIHdlIHNlZSB0d28gY29uc2VjdXRpdmUgcGFja2V0cyB3aXRoIEFVX2luZGV4IG9mIDAsIHdlIGNhbgorICAgICAgICAgICAgICogYXNzdW1lIHdlIGhhdmUgY29uc3RhbnREdXJhdGlvbiBwYWNrZXRzLiBTaW5jZSB3ZSBkb24ndCBoYXZlCisgICAgICAgICAgICAgKiB0aGUgaW5kZXggd2UgbXVzdCB1c2UgdGhlIEFVIGR1cmF0aW9uIHRvIGNhbGN1bGF0ZSB0aGUKKyAgICAgICAgICAgICAqIGluZGV4LiBHZXQgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdGltZXN0YW1wcyBmaXJzdCwgdGhpcyBjYW4gYmUKKyAgICAgICAgICAgICAqIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLiAqLworICAgICAgICAgICAgaWYgKHJ0cG1wNGdkZXBheS0+cHJldl9ydHB0aW1lIDw9IHJ0cHRpbWUpCisgICAgICAgICAgICAgIGRpZmYgPSBydHB0aW1lIC0gcnRwbXA0Z2RlcGF5LT5wcmV2X3J0cHRpbWU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGRpZmYgPSAtKHJ0cG1wNGdkZXBheS0+cHJldl9ydHB0aW1lIC0gcnRwdGltZSk7CisKKyAgICAgICAgICAgIC8qIGlmIG5vIGNvbnN0YW50RHVyYXRpb24gd2FzIGdpdmVuLCBtYWtlIG9uZSAqLworICAgICAgICAgICAgaWYgKHJ0cG1wNGdkZXBheS0+Y29uc3RhbnREdXJhdGlvbiAhPSAwKSB7CisgICAgICAgICAgICAgIGNkID0gcnRwbXA0Z2RlcGF5LT5jb25zdGFudER1cmF0aW9uOworICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsICJ1c2luZyBjb25zdGFudER1cmF0aW9uICVkIiwgY2QpOworICAgICAgICAgICAgfSBlbHNlIGlmIChydHBtcDRnZGVwYXktPnByZXZfQVVfbnVtID4gMCkgeworICAgICAgICAgICAgICAvKiB1c2UgbnVtYmVyIG9mIHBhY2tldHMgYW5kIG9mIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICAgIGNkID0gZGlmZiAvIHJ0cG1wNGdkZXBheS0+cHJldl9BVV9udW07CisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgImd1ZXNzaW5nIGNvbnN0YW50RHVyYXRpb24gJWQiLCBjZCk7CisgICAgICAgICAgICAgIGlmICghR1NUX0JVRkZFUl9JU19ESVNDT05UIChydHAtPmJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICAvKiByZmMzNjQwIC0gMy4yLjMuMgorICAgICAgICAgICAgICAgICAqIGlmIHdlIHNlZSB0d28gY29uc2VjdXRpdmUgcGFja2V0cyB3aXRoIEFVX2luZGV4IG9mIDAgYW5kCisgICAgICAgICAgICAgICAgICogdGhlcmUgaGFzIGJlZW4gbm8gZGlzY29udGludWl0eSwgd2UgbXVzdCBjb25jbHVkZSB0aGF0IHRoaXMKKyAgICAgICAgICAgICAgICAgKiB2YWx1ZSBvZiBjb25zdGFudER1cmF0aW9uIGlzIGNvcnJlY3QgZnJvbSBub3cgb24uICovCisgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLAorICAgICAgICAgICAgICAgICAgICAiY29uc3RhbnREdXJhdGlvbiBvZiAlZCBkZXRlY3RlZCIsIGNkKTsKKyAgICAgICAgICAgICAgICBydHBtcDRnZGVwYXktPmNvbnN0YW50RHVyYXRpb24gPSBjZDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLyogYXNzdW1lIHRoaXMgZnJhbWUgaGFzIHRoZSBzYW1lIG51bWJlciBvZiBwYWNrZXRzIGFzIHRoZQorICAgICAgICAgICAgICAgKiBwcmV2aW91cyBvbmUgKi8KKyAgICAgICAgICAgICAgY2QgPSBkaWZmIC8gbnVtX0FVX2hlYWRlcnM7CisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgImd1ZXNzaW5nIGNvbnN0YW50RHVyYXRpb24gJWQiLCBjZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjZCA+IDApIHsKKyAgICAgICAgICAgICAgLyogZ2V0IHRoZSBudW1iZXIgb2YgcGFja2V0cyBieSBkaXZpZGluZyB3aXRoIHRoZSBkdXJhdGlvbiAqLworICAgICAgICAgICAgICBkaWZmIC89IGNkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZGlmZiA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJ0cG1wNGdkZXBheS0+bGFzdF9BVV9pbmRleCArPSBkaWZmOworICAgICAgICAgICAgcnRwbXA0Z2RlcGF5LT5wcmV2X0FVX2luZGV4ID0gQVVfaW5kZXg7CisKKyAgICAgICAgICAgIEFVX2luZGV4ID0gcnRwbXA0Z2RlcGF5LT5sYXN0X0FVX2luZGV4OworCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRnZGVwYXksICJkaWZmICVkLCBBVSBpbmRleCAldSIsIGRpZmYsCisgICAgICAgICAgICAgICAgQVVfaW5kZXgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBydHBtcDRnZGVwYXktPnByZXZfQVVfaW5kZXggPSBBVV9pbmRleDsKKyAgICAgICAgICAgIHJ0cG1wNGdkZXBheS0+bGFzdF9BVV9pbmRleCA9IEFVX2luZGV4OworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIGtlZXAgdHJhY2sgb2YgdGhlIGhpZ2VzdCBBVV9pbmRleCAqLworICAgICAgICAgIGlmIChydHBtcDRnZGVwYXktPm1heF9BVV9pbmRleCAhPSAtMQorICAgICAgICAgICAgICAmJiBydHBtcDRnZGVwYXktPm1heF9BVV9pbmRleCA8PSBBVV9pbmRleCkgeworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXA0Z2RlcGF5LCAibmV3IGludGVybGVhdmUgZ3JvdXAsIGZsdXNoaW5nIik7CisgICAgICAgICAgICAvKiBhIG5ldyBpbnRlcmxlYXZlIGdyb3VwIHN0YXJ0ZWQsIGZsdXNoICovCisgICAgICAgICAgICBnc3RfcnRwX21wNGdfZGVwYXlfZmx1c2hfcXVldWUgKHJ0cG1wNGdkZXBheSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChHX1VOTElLRUxZICghcnRwbXA0Z2RlcGF5LT5tYXhEaXNwbGFjZW1lbnQgJiYKKyAgICAgICAgICAgICAgICAgIHJ0cG1wNGdkZXBheS0+bWF4X0FVX2luZGV4ICE9IC0xCisgICAgICAgICAgICAgICAgICAmJiBydHBtcDRnZGVwYXktPm1heF9BVV9pbmRleCA+PSBBVV9pbmRleCkpIHsKKyAgICAgICAgICAgIEdzdEJ1ZmZlciAqb3V0YnVmOworCisgICAgICAgICAgICAvKiBzb21lIGJyb2tlbiBub24taW50ZXJsZWF2ZWQgc3RyZWFtcyBoYXZlIEFVLWluZGV4IGp1bXBpbmcgYXJvdW5kCisgICAgICAgICAgICAgKiBhbGwgb3ZlciB0aGUgcGxhY2UsIGFwcGFyZW50bHkgYXNzdW1pbmcgcmVjZWl2ZXIgZGlzcmVnYXJkcyAqLworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXA0Z2RlcGF5LCAibm9uLWludGVybGVhdmVkIGJyb2tlbiBBVSBpbmRpY2VzOyIKKyAgICAgICAgICAgICAgICAiIGZvcmNpbmcgY29udGludW91cyBmbHVzaCIpOworICAgICAgICAgICAgLyogcmVzZXQgQVUgdG8gYXZvaWQgcmVwZWF0ZWQgRElTQ09OVCBpbiBzdWNoIGNhc2UgKi8KKyAgICAgICAgICAgIG91dGJ1ZiA9IGdfcXVldWVfcGVla19oZWFkIChydHBtcDRnZGVwYXktPnBhY2tldHMpOworICAgICAgICAgICAgaWYgKEdfTElLRUxZIChvdXRidWYpKSB7CisgICAgICAgICAgICAgIHJ0cG1wNGdkZXBheS0+bmV4dF9BVV9pbmRleCA9IEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpOworICAgICAgICAgICAgICBnc3RfcnRwX21wNGdfZGVwYXlfZmx1c2hfcXVldWUgKHJ0cG1wNGdkZXBheSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiByZWJhc2UgbmV4dF9BVV9pbmRleCB0byBjdXJyZW50IHJ0cCdzIGZpcnN0IEFVX2luZGV4ICovCisgICAgICAgICAgICBydHBtcDRnZGVwYXktPm5leHRfQVVfaW5kZXggPSBBVV9pbmRleDsKKyAgICAgICAgICB9CisgICAgICAgICAgcnRwbXA0Z2RlcGF5LT5wcmV2X3J0cHRpbWUgPSBydHB0aW1lOworICAgICAgICAgIHJ0cG1wNGdkZXBheS0+cHJldl9BVV9udW0gPSBudW1fQVVfaGVhZGVyczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBBVV9pbmRleF9kZWx0YSA9CisgICAgICAgICAgICAgIGdzdF9ic19wYXJzZV9yZWFkICgmYnMsIHJ0cG1wNGdkZXBheS0+aW5kZXhkZWx0YWxlbmd0aCk7CisgICAgICAgICAgQVVfaW5kZXggKz0gQVVfaW5kZXhfZGVsdGEgKyAxOworICAgICAgICB9CisgICAgICAgIC8qIGtlZXAgdHJhY2sgb2YgaGlnaGVzdCBBVV9pbmRleCAqLworICAgICAgICBpZiAocnRwbXA0Z2RlcGF5LT5tYXhfQVVfaW5kZXggPT0gLTEKKyAgICAgICAgICAgIHx8IEFVX2luZGV4ID4gcnRwbXA0Z2RlcGF5LT5tYXhfQVVfaW5kZXgpCisgICAgICAgICAgcnRwbXA0Z2RlcGF5LT5tYXhfQVVfaW5kZXggPSBBVV9pbmRleDsKKworICAgICAgICAvKiB0aGUgcHJlc2VudGF0aW9uIHRpbWUgb2Zmc2V0LCBhIDJzLWNvbXBsZW1lbnQgdmFsdWUsIHdlIG5lZWQgdGhpcyB0bworICAgICAgICAgKiBjYWxjdWxhdGUgdGhlIHRpbWVzdGFtcCBvbiB0aGUgb3V0cHV0IHBhY2tldC4gKi8KKyAgICAgICAgaWYgKHJ0cG1wNGdkZXBheS0+Y3RzZGVsdGFsZW5ndGggPiAwKSB7CisgICAgICAgICAgaWYgKGdzdF9ic19wYXJzZV9yZWFkICgmYnMsIDEpKQorICAgICAgICAgICAgZ3N0X2JzX3BhcnNlX3JlYWQgKCZicywgcnRwbXA0Z2RlcGF5LT5jdHNkZWx0YWxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgLyogdGhlIGRlY29kaW5nIHRpbWUgb2Zmc2V0LCBhIDJzLWNvbXBsZW1lbnQgdmFsdWUgKi8KKyAgICAgICAgaWYgKHJ0cG1wNGdkZXBheS0+ZHRzZGVsdGFsZW5ndGggPiAwKSB7CisgICAgICAgICAgaWYgKGdzdF9ic19wYXJzZV9yZWFkICgmYnMsIDEpKQorICAgICAgICAgICAgZ3N0X2JzX3BhcnNlX3JlYWQgKCZicywgcnRwbXA0Z2RlcGF5LT5kdHNkZWx0YWxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgLyogUkFQLWZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgQVUgY29udGFpbnMgYSBrZXlmcmFtZSAqLworICAgICAgICBpZiAocnRwbXA0Z2RlcGF5LT5yYW5kb21hY2Nlc3NpbmRpY2F0aW9uKQorICAgICAgICAgIGdzdF9ic19wYXJzZV9yZWFkICgmYnMsIDEpOworICAgICAgICAvKiBzdHJlYW0tc3RhdGUgKi8KKyAgICAgICAgaWYgKHJ0cG1wNGdkZXBheS0+c3RyZWFtc3RhdGVpbmRpY2F0aW9uID4gMCkKKyAgICAgICAgICBnc3RfYnNfcGFyc2VfcmVhZCAoJmJzLCBydHBtcDRnZGVwYXktPnN0cmVhbXN0YXRlaW5kaWNhdGlvbik7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXA0Z2RlcGF5LCAic2l6ZSAlZCwgaW5kZXggJWQsIGRlbHRhICVkIiwgQVVfc2l6ZSwKKyAgICAgICAgICAgIEFVX2luZGV4LCBBVV9pbmRleF9kZWx0YSk7CisKKyAgICAgICAgLyogZnJhZ21lbnRlZCBwYWtldHMgaGF2ZSB0aGUgQVVfc2l6ZSBzZXQgdG8gdGhlIHNpemUgb2YgdGhlCisgICAgICAgICAqIHVuZnJhZ21lbnRlZCBBVS4gKi8KKyAgICAgICAgaWYgKEFVX3NpemUgPiBwYXlsb2FkX0FVX3NpemUpCisgICAgICAgICAgQVVfc2l6ZSA9IHBheWxvYWRfQVVfc2l6ZTsKKworICAgICAgICAvKiBjb2xsZWN0IHN0dWZmIGluIHRoZSBhZGFwdGVyLCBzdHJpcCBoZWFkZXIgZnJvbSBwYXlsb2FkIGFuZCBwdXNoIGluCisgICAgICAgICAqIHRoZSBhZGFwdGVyICovCisgICAgICAgIG91dGJ1ZiA9CisgICAgICAgICAgICBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgKHJ0cCwgcGF5bG9hZF9BVSwgQVVfc2l6ZSk7CisgICAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cG1wNGdkZXBheS0+YWRhcHRlciwgb3V0YnVmKTsKKworICAgICAgICBpZiAoTSkgeworICAgICAgICAgIGd1aW50IGF2YWlsOworCisgICAgICAgICAgLyogcGFja2V0IGlzIGNvbXBsZXRlLCBmbHVzaCAqLworICAgICAgICAgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBtcDRnZGVwYXktPmFkYXB0ZXIpOworCisgICAgICAgICAgb3V0YnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHJ0cG1wNGdkZXBheS0+YWRhcHRlciwgYXZhaWwpOworCisgICAgICAgICAgLyogY29weSBzb21lIG9mIHRoZSBmaWVsZHMgd2UgY2FsY3VsYXRlZCBhYm92ZSBvbiB0aGUgYnVmZmVyLiBXZSBhbHNvCisgICAgICAgICAgICogY29weSB0aGUgQVVfaW5kZXggc28gdGhhdCB3ZSBjYW4gc29ydCB0aGUgcGFja2V0cyBpbiBvdXIgcXVldWUuICovCisgICAgICAgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSB0aW1lc3RhbXA7CisgICAgICAgICAgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZikgPSBBVV9pbmRleDsKKworICAgICAgICAgIGlmIChydHBtcDRnZGVwYXktPmNvbnN0YW50RHVyYXRpb24gIT0gMCkgeworICAgICAgICAgICAgLyogaWYgd2UgaGF2ZSBjb25zdGFudER1cmF0aW9uLCBjYWxjdWxhdGUgdGltZXN0YW1wIGZvciBuZXh0IEFVCisgICAgICAgICAgICAgKiBpbiB0aGlzIFJUUCBwYWNrZXQuICovCisgICAgICAgICAgICB0aW1lc3RhbXAgKz0gKHJ0cG1wNGdkZXBheS0+Y29uc3RhbnREdXJhdGlvbiAqIEdTVF9TRUNPTkQpIC8KKyAgICAgICAgICAgICAgICBkZXBheWxvYWQtPmNsb2NrX3JhdGU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIG90aGVyd2lzZSwgbWFrZSBzdXJlIHdlIGRvbid0IHVzZSB0aGUgdGltZXN0YW1wIGFnYWluIGZvciBvdGhlcgorICAgICAgICAgICAgICogQVVzLiAqLworICAgICAgICAgICAgdGltZXN0YW1wID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsCisgICAgICAgICAgICAgICJwdXNoaW5nIGJ1ZmZlciBvZiBzaXplICUiIEdfR1NJWkVfRk9STUFULAorICAgICAgICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWYpKTsKKworICAgICAgICAgIGdzdF9ydHBfbXA0Z19kZXBheV9xdWV1ZSAocnRwbXA0Z2RlcGF5LCBvdXRidWYpOworCisgICAgICAgIH0KKyAgICAgICAgcGF5bG9hZF9BVSArPSBBVV9zaXplOworICAgICAgICBwYXlsb2FkX0FVX3NpemUgLT0gQVVfc2l6ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogcHVzaCBjb21wbGV0ZSBidWZmZXIgaW4gYWRhcHRlciAqLworICAgICAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfc3ViYnVmZmVyIChydHAsIDAsIHBheWxvYWRfbGVuKTsKKyAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cG1wNGdkZXBheS0+YWRhcHRlciwgb3V0YnVmKTsKKworICAgICAgLyogaWYgdGhpcyB3YXMgdGhlIGxhc3QgcGFja2V0IG9mIHRoZSBWT1AsIGNyZWF0ZSBhbmQgcHVzaCBhIGJ1ZmZlciAqLworICAgICAgaWYgKE0pIHsKKyAgICAgICAgZ3VpbnQgYXZhaWw7CisKKyAgICAgICAgYXZhaWwgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHJ0cG1wNGdkZXBheS0+YWRhcHRlcik7CisKKyAgICAgICAgb3V0YnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHJ0cG1wNGdkZXBheS0+YWRhcHRlciwgYXZhaWwpOworCisgICAgICAgIEdTVF9ERUJVRyAoImdzdF9ydHBfbXA0Z19kZXBheV9jaGFpbjogcHVzaGluZyBidWZmZXIgb2Ygc2l6ZSAlIgorICAgICAgICAgICAgR19HU0laRV9GT1JNQVQsIGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZikpOworCisgICAgICAgIHJldHVybiBvdXRidWY7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIE5VTEw7CisKKyAgLyogRVJST1JTICovCitzaG9ydF9wYXlsb2FkOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwbXA0Z2RlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJQYWNrZXQgcGF5bG9hZCB3YXMgdG9vIHNob3J0LiIpLCAoTlVMTCkpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcDRnX2RlcGF5X2hhbmRsZV9ldmVudCAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGZpbHRlciwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmV0OworICBHc3RSdHBNUDRHRGVwYXkgKnJ0cG1wNGdkZXBheTsKKworICBydHBtcDRnZGVwYXkgPSBHU1RfUlRQX01QNEdfREVQQVkgKGZpbHRlcik7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9ydHBfbXA0Z19kZXBheV9yZXNldCAocnRwbXA0Z2RlcGF5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9CisgICAgICBHU1RfUlRQX0JBU0VfREVQQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5oYW5kbGVfZXZlbnQgKGZpbHRlciwgZXZlbnQpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9tcDRnX2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0UnRwTVA0R0RlcGF5ICpydHBtcDRnZGVwYXk7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBydHBtcDRnZGVwYXkgPSBHU1RfUlRQX01QNEdfREVQQVkgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfcnRwX21wNGdfZGVwYXlfcmVzZXQgKHJ0cG1wNGdkZXBheSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3J0cF9tcDRnX2RlcGF5X3Jlc2V0IChydHBtcDRnZGVwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX21wNGdfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBtcDRnZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfTVA0R19ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDU5OTdhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuaApAQCAtMCwwICsxLDg2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfTVA0R19ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX01QNEdfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX01QNEdfREVQQVkgXAorICAoZ3N0X3J0cF9tcDRnX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfTVA0R19ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9NUDRHX0RFUEFZLEdzdFJ0cE1QNEdEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfTVA0R19ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTVA0R19ERVBBWSxHc3RSdHBNUDRHRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfTVA0R19ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9NUDRHX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUDRHX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUDRHX0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cE1QNEdEZXBheSBHc3RSdHBNUDRHRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTVA0R0RlcGF5Q2xhc3MgR3N0UnRwTVA0R0RlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwTVA0R0RlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworCisgIGdpbnQgcHJvZmlsZV9sZXZlbF9pZDsKKyAgZ2ludCBzdHJlYW10eXBlOworCisgIGdpbnQgY29uc3RhbnRTaXplOworICBnaW50IGNvbnN0YW50RHVyYXRpb247CisgIGdpbnQgbWF4RGlzcGxhY2VtZW50OworCisgIGdpbnQgc2l6ZWxlbmd0aDsKKyAgZ2ludCBpbmRleGxlbmd0aDsKKyAgZ2ludCBpbmRleGRlbHRhbGVuZ3RoOworICBnaW50IGN0c2RlbHRhbGVuZ3RoOworICBnaW50IGR0c2RlbHRhbGVuZ3RoOworICBnaW50IHJhbmRvbWFjY2Vzc2luZGljYXRpb247CisgIGdpbnQgc3RyZWFtc3RhdGVpbmRpY2F0aW9uOworICBnaW50IGF1eGlsaWFyeWRhdGFzaXplbGVuZ3RoOworCisgIGd1aW50IG1heF9BVV9pbmRleDsKKyAgZ3VpbnQgcHJldl9BVV9pbmRleDsKKyAgZ3VpbnQgbGFzdF9BVV9pbmRleDsKKyAgZ3VpbnQgbmV4dF9BVV9pbmRleDsKKyAgZ3VpbnQzMiBwcmV2X3J0cHRpbWU7CisgIGd1aW50IHByZXZfQVVfbnVtOworCisgIEdRdWV1ZSAqcGFja2V0czsKKyAgCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cE1QNEdEZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX21wNGdfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX21wNGdfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfTVA0R19ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jIGIvZ3N0L3J0cC9nc3RydHBtcDRncGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzM2I0OQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jCkBAIC0wLDAgKzEsNjM5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJpdHJlYWRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKKyNpbmNsdWRlICJnc3RydHBtcDRncGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwbXA0Z3BheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwbXA0Z3BheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXA0Z19wYXlfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8vbXBlZywiCisgICAgICAgICJtcGVndmVyc2lvbj0oaW50KSA0LCIKKyAgICAgICAgInN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZTsiCisgICAgICAgICJhdWRpby9tcGVnLCIgIm1wZWd2ZXJzaW9uPShpbnQpIDQsICIgInN0cmVhbS1mb3JtYXQ9KHN0cmluZykgcmF3IikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9tcDRnX3BheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIHsgXCJ2aWRlb1wiLCBcImF1ZGlvXCIsIFwiYXBwbGljYXRpb25cIiB9LCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVggXSwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTVBFRzQtR0VORVJJQ1wiLCAiCisgICAgICAgIC8qIHJlcXVpcmVkIHN0cmluZyBwYXJhbXMgKi8KKyAgICAgICAgInN0cmVhbXR5cGUgPSAoc3RyaW5nKSB7IFwiNFwiLCBcIjVcIiB9LCAiICAgICAgLyogNCA9IHZpZGVvLCA1ID0gYXVkaW8gKi8KKyAgICAgICAgLyogInByb2ZpbGUtbGV2ZWwtaWQgPSAoc3RyaW5nKSBbMSxNQVhdLCAiICovCisgICAgICAgIC8qICJjb25maWcgPSAoc3RyaW5nKSBbMSxNQVhdIiAqLworICAgICAgICAibW9kZSA9IChzdHJpbmcpIHsgXCJnZW5lcmljXCIsIFwiQ0VMUC1jYnJcIiwgXCJDRUxQLXZiclwiLCBcIkFBQy1sYnJcIiwgXCJBQUMtaGJyXCIgfSAiCisgICAgICAgIC8qIE9wdGlvbmFsIGdlbmVyYWwgcGFyYW1ldGVycyAqLworICAgICAgICAvKiAib2JqZWN0dHlwZSA9IChzdHJpbmcpIFsxLE1BWF0sICIgKi8KKyAgICAgICAgLyogImNvbnN0YW50c2l6ZSA9IChzdHJpbmcpIFsxLE1BWF0sICIgKi8vKiBjb25zdGFudCBzaXplIG9mIGVhY2ggQVUgKi8KKyAgICAgICAgLyogImNvbnN0YW50ZHVyYXRpb24gPSAoc3RyaW5nKSBbMSxNQVhdLCAiICovLyogY29uc3RhbnQgZHVyYXRpb24gb2YgZWFjaCBBVSAqLworICAgICAgICAvKiAibWF4ZGlzcGxhY2VtZW50ID0gKHN0cmluZykgWzEsTUFYXSwgIiAqLworICAgICAgICAvKiAiZGUtaW50ZXJsZWF2ZWJ1ZmZlcnNpemUgPSAoc3RyaW5nKSBbMSxNQVhdLCAiICovCisgICAgICAgIC8qIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLworICAgICAgICAvKiAic2l6ZWxlbmd0aCA9IChzdHJpbmcpIFsxLCAxNl0sICIgKi8vKiBtYXggMTYgYml0cywgc2hvdWxkIGJlIGVub3VnaC4uLiAqLworICAgICAgICAvKiAiaW5kZXhsZW5ndGggPSAoc3RyaW5nKSBbMSwgOF0sICIgKi8KKyAgICAgICAgLyogImluZGV4ZGVsdGFsZW5ndGggPSAoc3RyaW5nKSBbMSwgOF0sICIgKi8KKyAgICAgICAgLyogImN0c2RlbHRhbGVuZ3RoID0gKHN0cmluZykgWzEsIDY0XSwgIiAqLworICAgICAgICAvKiAiZHRzZGVsdGFsZW5ndGggPSAoc3RyaW5nKSBbMSwgNjRdLCAiICovCisgICAgICAgIC8qICJyYW5kb21hY2Nlc3NpbmRpY2F0aW9uID0gKHN0cmluZykgezAsIDF9LCAiICovCisgICAgICAgIC8qICJzdHJlYW1zdGF0ZWluZGljYXRpb24gPSAoc3RyaW5nKSBbMCwgNjRdLCAiICovCisgICAgICAgIC8qICJhdXhpbGlhcnlkYXRhc2l6ZWxlbmd0aCA9IChzdHJpbmcpIFswLCA2NF0iICovICkKKyAgICApOworCisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfbXA0Z19wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9tcDRnX3BheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9tcDRnX3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9tcDRnX3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqCisgICAgcGF5bG9hZCwgR3N0QnVmZmVyICogYnVmZmVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX21wNGdfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworI2RlZmluZSBnc3RfcnRwX21wNGdfcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cE1QNEdQYXksIGdzdF9ydHBfbXA0Z19wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpCisKKyAgICAgc3RhdGljIHZvaWQgZ3N0X3J0cF9tcDRnX3BheV9jbGFzc19pbml0IChHc3RSdHBNUDRHUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfbXA0Z19wYXlfZmluYWxpemU7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3J0cF9tcDRnX3BheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9tcDRnX3BheV9zZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2J1ZmZlciA9IGdzdF9ydHBfbXA0Z19wYXlfaGFuZGxlX2J1ZmZlcjsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNpbmtfZXZlbnQgPSBnc3RfcnRwX21wNGdfcGF5X3NpbmtfZXZlbnQ7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9tcDRnX3BheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX21wNGdfcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIE1QRUc0IEVTIHBheWxvYWRlciIsCisgICAgICAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYXlsb2FkIE1QRUc0IGVsZW1lbnRhcnkgc3RyZWFtcyBhcyBSVFAgcGFja2V0cyAoUkZDIDM2NDApIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBtcDRncGF5X2RlYnVnLCAicnRwbXA0Z3BheSIsIDAsCisgICAgICAiTVA0LWdlbmVyaWMgUlRQIFBheWxvYWRlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcDRnX3BheV9pbml0IChHc3RSdHBNUDRHUGF5ICogcnRwbXA0Z3BheSkKK3sKKyAgcnRwbXA0Z3BheS0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXA0Z19wYXlfcmVzZXQgKEdzdFJ0cE1QNEdQYXkgKiBydHBtcDRncGF5KQoreworICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRncGF5LCAicmVzZXQiKTsKKworICBnc3RfYWRhcHRlcl9jbGVhciAocnRwbXA0Z3BheS0+YWRhcHRlcik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wNGdfcGF5X2NsZWFudXAgKEdzdFJ0cE1QNEdQYXkgKiBydHBtcDRncGF5KQoreworICBnc3RfcnRwX21wNGdfcGF5X3Jlc2V0IChydHBtcDRncGF5KTsKKworICBnX2ZyZWUgKHJ0cG1wNGdwYXktPnBhcmFtcyk7CisgIHJ0cG1wNGdwYXktPnBhcmFtcyA9IE5VTEw7CisKKyAgaWYgKHJ0cG1wNGdwYXktPmNvbmZpZykKKyAgICBnc3RfYnVmZmVyX3VucmVmIChydHBtcDRncGF5LT5jb25maWcpOworICBydHBtcDRncGF5LT5jb25maWcgPSBOVUxMOworCisgIGdfZnJlZSAocnRwbXA0Z3BheS0+cHJvZmlsZSk7CisgIHJ0cG1wNGdwYXktPnByb2ZpbGUgPSBOVUxMOworCisgIHJ0cG1wNGdwYXktPnN0cmVhbXR5cGUgPSBOVUxMOworICBydHBtcDRncGF5LT5tb2RlID0gTlVMTDsKKworICBydHBtcDRncGF5LT5mcmFtZV9sZW4gPSAwOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcDRnX3BheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwTVA0R1BheSAqcnRwbXA0Z3BheTsKKworICBydHBtcDRncGF5ID0gR1NUX1JUUF9NUDRHX1BBWSAob2JqZWN0KTsKKworICBnc3RfcnRwX21wNGdfcGF5X2NsZWFudXAgKHJ0cG1wNGdwYXkpOworCisgIGdfb2JqZWN0X3VucmVmIChydHBtcDRncGF5LT5hZGFwdGVyKTsKKyAgcnRwbXA0Z3BheS0+YWRhcHRlciA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNhbXBsaW5nX3RhYmxlWzE2XSA9IHsKKyAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwgMjQwMDAsIDIyMDUwLAorICAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwLCA3MzUwLCAwLCAwLCAwCit9OworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfbXA0Z19wYXlfcGFyc2VfYXVkaW9fY29uZmlnIChHc3RSdHBNUDRHUGF5ICogcnRwbXA0Z3BheSwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggb2JqZWN0VHlwZSA9IDA7CisgIGd1aW50OCBzYW1wbGluZ0lkeCA9IDA7CisgIGd1aW50OCBjaGFubmVsQ2ZnID0gMDsKKyAgR3N0Qml0UmVhZGVyIGJyOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgZ3N0X2JpdF9yZWFkZXJfaW5pdCAoJmJyLCBtYXAuZGF0YSwgbWFwLnNpemUpOworCisgIC8qIGFueSBvYmplY3QgdHlwZSBpcyBmaW5lLCB3ZSBuZWVkIHRvIGNvcHkgaXQgdG8gdGhlIHByb2ZpbGUtbGV2ZWwtaWQgZmllbGQuICovCisgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKCZiciwgJm9iamVjdFR5cGUsIDUpKQorICAgIGdvdG8gdG9vX3Nob3J0OworICBpZiAob2JqZWN0VHlwZSA9PSAwKQorICAgIGdvdG8gaW52YWxpZF9vYmplY3Q7CisKKyAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoJmJyLCAmc2FtcGxpbmdJZHgsIDQpKQorICAgIGdvdG8gdG9vX3Nob3J0OworICAvKiBvbmx5IGZpeGVkIHZhbHVlcyBmb3Igbm93ICovCisgIGlmIChzYW1wbGluZ0lkeCA+IDEyICYmIHNhbXBsaW5nSWR4ICE9IDE1KQorICAgIGdvdG8gd3JvbmdfZnJlcTsKKworICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4ICgmYnIsICZjaGFubmVsQ2ZnLCA0KSkKKyAgICBnb3RvIHRvb19zaG9ydDsKKyAgaWYgKGNoYW5uZWxDZmcgPiA3KQorICAgIGdvdG8gd3JvbmdfY2hhbm5lbHM7CisKKyAgLyogcnRwIHJhdGUgZGVwZW5kcyBvbiBzYW1wbGluZyByYXRlIG9mIHRoZSBhdWRpbyAqLworICBpZiAoc2FtcGxpbmdJZHggPT0gMTUpIHsKKyAgICBndWludDMyIHJhdGUgPSAwOworCisgICAgLyogaW5kZXggb2YgMTUgbWVhbnMgd2UgZ2V0IHRoZSByYXRlIGluIHRoZSBuZXh0IDI0IGJpdHMgKi8KKyAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQzMiAoJmJyLCAmcmF0ZSwgMjQpKQorICAgICAgZ290byB0b29fc2hvcnQ7CisKKyAgICBydHBtcDRncGF5LT5yYXRlID0gcmF0ZTsKKyAgfSBlbHNlIHsKKyAgICAvKiBlbHNlIHVzZSB0aGUgcmF0ZSBmcm9tIHRoZSB0YWJsZSAqLworICAgIHJ0cG1wNGdwYXktPnJhdGUgPSBzYW1wbGluZ190YWJsZVtzYW1wbGluZ0lkeF07CisgIH0KKworICBydHBtcDRncGF5LT5mcmFtZV9sZW4gPSAxMDI0OworCisgIHN3aXRjaCAob2JqZWN0VHlwZSkgeworICAgIGNhc2UgMToKKyAgICBjYXNlIDI6CisgICAgY2FzZSAzOgorICAgIGNhc2UgNDoKKyAgICBjYXNlIDY6CisgICAgY2FzZSA3OgorICAgIHsKKyAgICAgIGd1aW50OCBmcmFtZUxlbkZsYWcgPSAwOworCisgICAgICBpZiAoZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKCZiciwgJmZyYW1lTGVuRmxhZywgMSkpCisgICAgICAgIGlmIChmcmFtZUxlbkZsYWcpCisgICAgICAgICAgcnRwbXA0Z3BheS0+ZnJhbWVfbGVuID0gOTYwOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogZXh0cmEgcnRwIHBhcmFtcyBjb250YWluIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgZ19mcmVlIChydHBtcDRncGF5LT5wYXJhbXMpOworICBydHBtcDRncGF5LT5wYXJhbXMgPSBnX3N0cmR1cF9wcmludGYgKCIlZCIsIGNoYW5uZWxDZmcpOworICAvKiBhdWRpbyBzdHJlYW0gdHlwZSAqLworICBydHBtcDRncGF5LT5zdHJlYW10eXBlID0gIjUiOworICAvKiBtb2RlIG9ubHkgaGlnaCBiaXRyYXRlIGZvciBub3cgKi8KKyAgcnRwbXA0Z3BheS0+bW9kZSA9ICJBQUMtaGJyIjsKKyAgLyogcHJvZmlsZSAqLworICBnX2ZyZWUgKHJ0cG1wNGdwYXktPnByb2ZpbGUpOworICBydHBtcDRncGF5LT5wcm9maWxlID0gZ19zdHJkdXBfcHJpbnRmICgiJWQiLCBvYmplY3RUeXBlKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRncGF5LAorICAgICAgIm9iamVjdFR5cGU6ICVkLCBzYW1wbGluZ0lkeDogJWQgKCVkKSwgY2hhbm5lbENmZzogJWQsIGZyYW1lX2xlbiAlZCIsCisgICAgICBvYmplY3RUeXBlLCBzYW1wbGluZ0lkeCwgcnRwbXA0Z3BheS0+cmF0ZSwgY2hhbm5lbENmZywKKyAgICAgIHJ0cG1wNGdwYXktPmZyYW1lX2xlbik7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1IgKi8KK3Rvb19zaG9ydDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChydHBtcDRncGF5LCBTVFJFQU0sIEZPUk1BVCwKKyAgICAgICAgKE5VTEwpLCAoImNvbmZpZyBzdHJpbmcgdG9vIHNob3J0IikpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbnZhbGlkX29iamVjdDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChydHBtcDRncGF5LCBTVFJFQU0sIEZPUk1BVCwKKyAgICAgICAgKE5VTEwpLCAoImludmFsaWQgb2JqZWN0IHR5cGUiKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3dyb25nX2ZyZXE6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocnRwbXA0Z3BheSwgU1RSRUFNLCBOT1RfSU1QTEVNRU5URUQsCisgICAgICAgIChOVUxMKSwgKCJ1bnN1cHBvcnRlZCBmcmVxdWVuY3kgaW5kZXggJWQiLCBzYW1wbGluZ0lkeCkpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit3cm9uZ19jaGFubmVsczoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChydHBtcDRncGF5LCBTVFJFQU0sIE5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgKE5VTEwpLCAoInVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscyAlZCwgbXVzdCA8IDgiLCBjaGFubmVsQ2ZnKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworI2RlZmluZSBWT1NfU1RBUlRDT0RFICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxQjAKKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX21wNGdfcGF5X3BhcnNlX3ZpZGVvX2NvbmZpZyAoR3N0UnRwTVA0R1BheSAqIHJ0cG1wNGdwYXksCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQzMiBjb2RlOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgaWYgKG1hcC5zaXplIDwgNSkKKyAgICBnb3RvIHRvb19zaG9ydDsKKworICBjb2RlID0gR1NUX1JFQURfVUlOVDMyX0JFIChtYXAuZGF0YSk7CisKKyAgZ19mcmVlIChydHBtcDRncGF5LT5wcm9maWxlKTsKKyAgaWYgKGNvZGUgPT0gVk9TX1NUQVJUQ09ERSkgeworICAgIC8qIGdldCBwcm9maWxlICovCisgICAgcnRwbXA0Z3BheS0+cHJvZmlsZSA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgKGdpbnQpIG1hcC5kYXRhWzRdKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBtcDRncGF5LCBTVFJFQU0sIEZPUk1BVCwKKyAgICAgICAgKE5VTEwpLCAoInByb2ZpbGUgbm90IGZvdW5kIGluIGNvbmZpZyBzdHJpbmcsIGFzc3VtaW5nIFwnMVwnIikpOworICAgIHJ0cG1wNGdwYXktPnByb2ZpbGUgPSBnX3N0cmR1cCAoIjEiKTsKKyAgfQorCisgIC8qIGZpeGVkIHJhdGUgKi8KKyAgcnRwbXA0Z3BheS0+cmF0ZSA9IDkwMDAwOworICAvKiB2aWRlbyBzdHJlYW0gdHlwZSAqLworICBydHBtcDRncGF5LT5zdHJlYW10eXBlID0gIjQiOworICAvKiBubyBwYXJhbXMgZm9yIHZpZGVvICovCisgIHJ0cG1wNGdwYXktPnBhcmFtcyA9IE5VTEw7CisgIC8qIG1vZGUgKi8KKyAgcnRwbXA0Z3BheS0+bW9kZSA9ICJnZW5lcmljIjsKKworICBHU1RfTE9HX09CSkVDVCAocnRwbXA0Z3BheSwgInByb2ZpbGUgJXMiLCBydHBtcDRncGF5LT5wcm9maWxlKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SICovCit0b29fc2hvcnQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocnRwbXA0Z3BheSwgU1RSRUFNLCBGT1JNQVQsCisgICAgICAgIChOVUxMKSwgKCJjb25maWcgc3RyaW5nIHRvbyBzaG9ydCIpKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfbXA0Z19wYXlfbmV3X2NhcHMgKEdzdFJ0cE1QNEdQYXkgKiBydHBtcDRncGF5KQoreworICBnY2hhciAqY29uZmlnOworICBHVmFsdWUgdiA9IHsgMCB9OworICBnYm9vbGVhbiByZXM7CisKKyNkZWZpbmUgTVA0R0NBUFMJCQkJCQlcCisgICJzdHJlYW10eXBlIiwgR19UWVBFX1NUUklORywgcnRwbXA0Z3BheS0+c3RyZWFtdHlwZSwgCQlcCisgICJwcm9maWxlLWxldmVsLWlkIiwgR19UWVBFX1NUUklORywgcnRwbXA0Z3BheS0+cHJvZmlsZSwJXAorICAibW9kZSIsIEdfVFlQRV9TVFJJTkcsIHJ0cG1wNGdwYXktPm1vZGUsCQkJXAorICAiY29uZmlnIiwgR19UWVBFX1NUUklORywgY29uZmlnLAkJCQlcCisgICJzaXplbGVuZ3RoIiwgR19UWVBFX1NUUklORywgIjEzIiwJCQkJXAorICAiaW5kZXhsZW5ndGgiLCBHX1RZUEVfU1RSSU5HLCAiMyIsCQkJCVwKKyAgImluZGV4ZGVsdGFsZW5ndGgiLCBHX1RZUEVfU1RSSU5HLCAiMyIsCQkJXAorICBOVUxMCisKKyAgZ192YWx1ZV9pbml0ICgmdiwgR1NUX1RZUEVfQlVGRkVSKTsKKyAgZ3N0X3ZhbHVlX3NldF9idWZmZXIgKCZ2LCBydHBtcDRncGF5LT5jb25maWcpOworICBjb25maWcgPSBnc3RfdmFsdWVfc2VyaWFsaXplICgmdik7CisKKyAgLyogaG1tLCBzaWxseSAqLworICBpZiAocnRwbXA0Z3BheS0+cGFyYW1zKSB7CisgICAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBtcDRncGF5KSwKKyAgICAgICAgImVuY29kaW5nLXBhcmFtcyIsIEdfVFlQRV9TVFJJTkcsIHJ0cG1wNGdwYXktPnBhcmFtcywgTVA0R0NBUFMpOworICB9IGVsc2UgeworICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwbXA0Z3BheSksCisgICAgICAgIE1QNEdDQVBTKTsKKyAgfQorCisgIGdfdmFsdWVfdW5zZXQgKCZ2KTsKKyAgZ19mcmVlIChjb25maWcpOworCisjdW5kZWYgTVA0R0NBUFMKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX21wNGdfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFJ0cE1QNEdQYXkgKnJ0cG1wNGdwYXk7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBjb25zdCBHVmFsdWUgKmNvZGVjX2RhdGE7CisgIGNvbnN0IGdjaGFyICptZWRpYV90eXBlID0gTlVMTDsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHJ0cG1wNGdwYXkgPSBHU1RfUlRQX01QNEdfUEFZIChwYXlsb2FkKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBjb2RlY19kYXRhID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImNvZGVjX2RhdGEiKTsKKyAgaWYgKGNvZGVjX2RhdGEpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocnRwbXA0Z3BheSwgImdvdCBjb2RlY19kYXRhIik7CisgICAgaWYgKEdfVkFMVUVfVFlQRSAoY29kZWNfZGF0YSkgPT0gR1NUX1RZUEVfQlVGRkVSKSB7CisgICAgICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgICAgIGNvbnN0IGdjaGFyICpuYW1lOworCisgICAgICBidWZmZXIgPSBnc3RfdmFsdWVfZ2V0X2J1ZmZlciAoY29kZWNfZGF0YSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwbXA0Z3BheSwgImNvbmZpZ3VyaW5nIGNvZGVjX2RhdGEiKTsKKworICAgICAgbmFtZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHN0cnVjdHVyZSk7CisKKyAgICAgIC8qIHBhcnNlIGJ1ZmZlciAqLworICAgICAgaWYgKCFzdHJjbXAgKG5hbWUsICJhdWRpby9tcGVnIikpIHsKKyAgICAgICAgcmVzID0gZ3N0X3J0cF9tcDRnX3BheV9wYXJzZV9hdWRpb19jb25maWcgKHJ0cG1wNGdwYXksIGJ1ZmZlcik7CisgICAgICAgIG1lZGlhX3R5cGUgPSAiYXVkaW8iOworICAgICAgfSBlbHNlIGlmICghc3RyY21wIChuYW1lLCAidmlkZW8vbXBlZyIpKSB7CisgICAgICAgIHJlcyA9IGdzdF9ydHBfbXA0Z19wYXlfcGFyc2VfdmlkZW9fY29uZmlnIChydHBtcDRncGF5LCBidWZmZXIpOworICAgICAgICBtZWRpYV90eXBlID0gInZpZGVvIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgfQorICAgICAgaWYgKCFyZXMpCisgICAgICAgIGdvdG8gY29uZmlnX2ZhaWxlZDsKKworICAgICAgLyogbm93IHdlIGNhbiBjb25maWd1cmUgdGhlIGJ1ZmZlciAqLworICAgICAgaWYgKHJ0cG1wNGdwYXktPmNvbmZpZykKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocnRwbXA0Z3BheS0+Y29uZmlnKTsKKworICAgICAgcnRwbXA0Z3BheS0+Y29uZmlnID0gZ3N0X2J1ZmZlcl9jb3B5IChidWZmZXIpOworICAgIH0KKyAgfQorICBpZiAobWVkaWFfdHlwZSA9PSBOVUxMKQorICAgIGdvdG8gY29uZmlnX2ZhaWxlZDsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAocGF5bG9hZCwgbWVkaWFfdHlwZSwgVFJVRSwgIk1QRUc0LUdFTkVSSUMiLAorICAgICAgcnRwbXA0Z3BheS0+cmF0ZSk7CisKKyAgcmVzID0gZ3N0X3J0cF9tcDRnX3BheV9uZXdfY2FwcyAocnRwbXA0Z3BheSk7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK2NvbmZpZ19mYWlsZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRncGF5LCAiZmFpbGVkIHRvIHBhcnNlIGNvbmZpZyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9tcDRnX3BheV9mbHVzaCAoR3N0UnRwTVA0R1BheSAqIHJ0cG1wNGdwYXkpCit7CisgIGd1aW50IGF2YWlsLCB0b3RhbDsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBndWludCBtdHU7CisKKyAgLyogdGhlIGRhdGEgYXZhaWxhYmxlIGluIHRoZSBhZGFwdGVyIGlzIGVpdGhlciBzbWFsbGVyCisgICAqIHRoYW4gdGhlIE1UVSBvciBiaWdnZXIuIEluIHRoZSBjYXNlIGl0IGlzIHNtYWxsZXIsIHRoZSBjb21wbGV0ZQorICAgKiBhZGFwdGVyIGNvbnRlbnRzIGNhbiBiZSBwdXQgaW4gb25lIHBhY2tldC4gSW4gdGhlIGNhc2UgdGhlCisgICAqIGFkYXB0ZXIgaGFzIG1vcmUgdGhhbiBvbmUgTVRVLCB3ZSBuZWVkIHRvIGZyYWdtZW50IHRoZSBNUEVHIGRhdGEKKyAgICogb3ZlciBtdWx0aXBsZSBwYWNrZXRzLiAqLworICB0b3RhbCA9IGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBtcDRncGF5LT5hZGFwdGVyKTsKKworICByZXQgPSBHU1RfRkxPV19PSzsKKyAgbXR1ID0gR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVIChydHBtcDRncGF5KTsKKworICB3aGlsZSAoYXZhaWwgPiAwKSB7CisgICAgZ3VpbnQgdG93cml0ZTsKKyAgICBndWludDggKnBheWxvYWQ7CisgICAgZ3VpbnQgcGF5bG9hZF9sZW47CisgICAgZ3VpbnQgcGFja2V0X2xlbjsKKyAgICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisgICAgR3N0QnVmZmVyICpwYXlidWY7CisKKyAgICAvKiB0aGlzIHdpbGwgYmUgdGhlIHRvdGFsIGxlbmdodCBvZiB0aGUgcGFja2V0ICovCisgICAgcGFja2V0X2xlbiA9IGdzdF9ydHBfYnVmZmVyX2NhbGNfcGFja2V0X2xlbiAoYXZhaWwsIDAsIDApOworCisgICAgLyogZmlsbCBvbmUgTVRVIG9yIGFsbCBhdmFpbGFibGUgYnl0ZXMsIHdlIG5lZWQgNCBzcGFyZSBieXRlcyBmb3IKKyAgICAgKiB0aGUgQVUgaGVhZGVyLiAqLworICAgIHRvd3JpdGUgPSBNSU4gKHBhY2tldF9sZW4sIG10dSAtIDQpOworCisgICAgLyogdGhpcyBpcyB0aGUgcGF5bG9hZCBsZW5ndGggKi8KKyAgICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2NhbGNfcGF5bG9hZF9sZW4gKHRvd3JpdGUsIDAsIDApOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXA0Z3BheSwKKyAgICAgICAgImF2YWlsICVkLCB0b3dyaXRlICVkLCBwYWNrZXRfbGVuICVkLCBwYXlsb2FkX2xlbiAlZCIsIGF2YWlsLCB0b3dyaXRlLAorICAgICAgICBwYWNrZXRfbGVuLCBwYXlsb2FkX2xlbik7CisKKyAgICAvKiBjcmVhdGUgYnVmZmVyIHRvIGhvbGQgdGhlIHBheWxvYWQsIGFsc28gbWFrZSByb29tIGZvciB0aGUgNCBoZWFkZXIgYnl0ZXMuICovCisgICAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlICg0LCAwLCAwKTsKKworICAgIGdzdF9ydHBfYnVmZmVyX21hcCAob3V0YnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKworICAgIC8qIGNvcHkgcGF5bG9hZCAqLworICAgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisKKyAgICAvKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstIC4uIC0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICogfEFVLWhlYWRlcnMtbGVuZ3RofEFVLWhlYWRlcnxBVS1oZWFkZXJ8ICAgICAgfEFVLWhlYWRlcnxwYWRkaW5nfAorICAgICAqIHwgICAgICAgICAgICAgICAgIHwgICAoMSkgICB8ICAgKDIpICAgfCAgICAgIHwgICAobikgICB8IGJpdHMgIHwKKyAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstIC4uIC0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICovCisgICAgLyogQVUtaGVhZGVycy1sZW5ndGgsIHdlIG9ubHkgaGF2ZSAxIEFVLWhlYWRlciAqLworICAgIHBheWxvYWRbMF0gPSAweDAwOworICAgIHBheWxvYWRbMV0gPSAweDEwOyAgICAgICAgICAvKiB3ZSB1c2UgMTYgYml0cyBmb3IgdGhlIGhlYWRlciAqLworCisgICAgLyogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgKiB8ICAgICBBVS1zaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICogfCAgICAgQVUtSW5kZXggLyBBVS1JbmRleC1kZWx0YSAgICAgICAgIHwKKyAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAqIHwgICAgIENUUy1mbGFnICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgKiB8ICAgICBDVFMtZGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICogfCAgICAgRFRTLWZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAqIHwgICAgIERUUy1kZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgKiB8ICAgICBSQVAtZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICogfCAgICAgU3RyZWFtLXN0YXRlICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAqLworICAgIC8qIFRoZSBBVS1oZWFkZXIsIG5vIENUUywgRFRTLCBSQVAsIFN0cmVhbS1zdGF0ZSAKKyAgICAgKgorICAgICAqIEFVLXNpemUgaXMgYWx3YXlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBBVSwgbm90IHRoZSBmcmFnbWVudGVkIHNpemUgCisgICAgICovCisgICAgcGF5bG9hZFsyXSA9ICh0b3RhbCAmIDB4MWZlMCkgPj4gNTsKKyAgICBwYXlsb2FkWzNdID0gKHRvdGFsICYgMHgxZikgPDwgMzsgICAvKiB3ZSB1c2UgMTMgYml0cyBmb3IgdGhlIHNpemUsIDMgYml0cyBpbmRleCAqLworCisgICAgLyogbWFya2VyIG9ubHkgaWYgdGhlIHBhY2tldCBpcyBjb21wbGV0ZSAqLworICAgIGdzdF9ydHBfYnVmZmVyX3NldF9tYXJrZXIgKCZydHAsIGF2YWlsIDw9IHBheWxvYWRfbGVuKTsKKworICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICAgIHBheWJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyX2Zhc3QgKHJ0cG1wNGdwYXktPmFkYXB0ZXIsIHBheWxvYWRfbGVuKTsKKyAgICBnc3RfcnRwX2NvcHlfbWV0YSAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwbXA0Z3BheSksIG91dGJ1ZiwgcGF5YnVmLCAwKTsKKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAob3V0YnVmLCBwYXlidWYpOworCisgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSBydHBtcDRncGF5LT5maXJzdF90aW1lc3RhbXA7CisgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9IHJ0cG1wNGdwYXktPmZpcnN0X2R1cmF0aW9uOworCisgICAgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZikgPSBHU1RfQlVGRkVSX09GRlNFVF9OT05FOworCisgICAgaWYgKHJ0cG1wNGdwYXktPmRpc2NvbnQpIHsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgICAgLyogT25seSB0aGUgZmlyc3Qgb3V0cHV0dGVkIGJ1ZmZlciBoYXMgdGhlIERJU0NPTlQgZmxhZyAqLworICAgICAgcnRwbXA0Z3BheS0+ZGlzY29udCA9IEZBTFNFOworICAgIH0KKworICAgIHJldCA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBtcDRncGF5KSwgb3V0YnVmKTsKKworICAgIGF2YWlsIC09IHBheWxvYWRfbGVuOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogd2UgZXhwZWN0IGJ1ZmZlcnMgYXMgZXhhY3RseSBvbmUgY29tcGxldGUgQVUKKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfbXA0Z19wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJ0cE1QNEdQYXkgKnJ0cG1wNGdwYXk7CisKKyAgcnRwbXA0Z3BheSA9IEdTVF9SVFBfTVA0R19QQVkgKGJhc2VwYXlsb2FkKTsKKworICBydHBtcDRncGF5LT5maXJzdF90aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKTsKKyAgcnRwbXA0Z3BheS0+Zmlyc3RfZHVyYXRpb24gPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpOworICBydHBtcDRncGF5LT5kaXNjb250ID0gR1NUX0JVRkZFUl9JU19ESVNDT05UIChidWZmZXIpOworCisgIC8qIHdlIGFsd2F5cyBlbmNvZGUgYW5kIGZsdXNoIGEgZnVsbCBBVSAqLworICBnc3RfYWRhcHRlcl9wdXNoIChydHBtcDRncGF5LT5hZGFwdGVyLCBidWZmZXIpOworCisgIHJldHVybiBnc3RfcnRwX21wNGdfcGF5X2ZsdXNoIChydHBtcDRncGF5KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX21wNGdfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UnRwTVA0R1BheSAqcnRwbXA0Z3BheTsKKworICBydHBtcDRncGF5ID0gR1NUX1JUUF9NUDRHX1BBWSAocGF5bG9hZCk7CisKKyAgR1NUX0RFQlVHICgiR290IGV2ZW50OiAlcyIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDoKKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgICAvKiBUaGlzIGZsdXNoIGNhbGwgbWFrZXMgc3VyZSB0aGF0IHRoZSBsYXN0IGJ1ZmZlciBpcyBhbHdheXMgcHVzaGVkCisgICAgICAgKiB0byB0aGUgYmFzZSBwYXlsb2FkZXIgKi8KKyAgICAgIGdzdF9ydHBfbXA0Z19wYXlfZmx1c2ggKHJ0cG1wNGdwYXkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9ydHBfbXA0Z19wYXlfcmVzZXQgKHJ0cG1wNGdwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogbGV0IHBhcmVudCBoYW5kbGUgZXZlbnQgdG9vICovCisgIHJldHVybiBHU1RfUlRQX0JBU0VfUEFZTE9BRF9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2lua19ldmVudCAocGF5bG9hZCwgZXZlbnQpOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfbXA0Z19wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RSdHBNUDRHUGF5ICpydHBtcDRncGF5OworCisgIHJ0cG1wNGdwYXkgPSBHU1RfUlRQX01QNEdfUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X3J0cF9tcDRnX3BheV9jbGVhbnVwIChydHBtcDRncGF5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3RfcnRwX21wNGdfcGF5X2NsZWFudXAgKHJ0cG1wNGdwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfbXA0Z19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBtcDRncGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX01QNEdfUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXA0Z3BheS5oIGIvZ3N0L3J0cC9nc3RydHBtcDRncGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRmZDY4YQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXA0Z3BheS5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9NUDRHX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX01QNEdfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZXBheWxvYWQuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfTVA0R19QQVkgXAorICAoZ3N0X3J0cF9tcDRnX3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX01QNEdfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX01QNEdfUEFZLEdzdFJ0cE1QNEdQYXkpKQorI2RlZmluZSBHU1RfUlRQX01QNEdfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUDRHX1BBWSxHc3RSdHBNUDRHUGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QNEdfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX01QNEdfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUDRHX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTVA0R19QQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTVA0R1BheSBHc3RSdHBNUDRHUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cE1QNEdQYXlDbGFzcyBHc3RSdHBNUDRHUGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwTVA0R1BheQoreworICBHc3RSVFBCYXNlUGF5bG9hZCAgICBwYXlsb2FkOworCisgIEdzdEFkYXB0ZXIgICAqYWRhcHRlcjsKKyAgR3N0Q2xvY2tUaW1lICBmaXJzdF90aW1lc3RhbXA7CisgIEdzdENsb2NrVGltZSAgZmlyc3RfZHVyYXRpb247CisgIGdib29sZWFuICAgICAgZGlzY29udDsKKworICBnaW50ICAgICAgICAgIHJhdGU7CisgIGdjaGFyICAgICAgICAqcGFyYW1zOworICBnY2hhciAgICAgICAgKnByb2ZpbGU7CisgIGNvbnN0IGdjaGFyICAqc3RyZWFtdHlwZTsKKyAgY29uc3QgZ2NoYXIgICptb2RlOworICBHc3RCdWZmZXIgICAgKmNvbmZpZzsKKyAgZ3VpbnQgICAgICAgICBmcmFtZV9sZW47Cit9OworCitzdHJ1Y3QgX0dzdFJ0cE1QNEdQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfbXA0Z19wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX21wNGdfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX01QNEdfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg2MGY4OAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnc3RydHBtcDR2ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBtcDR2ZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cG1wNHZkZXBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXA0dl9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL21wZWcsIgorICAgICAgICAibXBlZ3ZlcnNpb249KGludCkgNCwiICJzeXN0ZW1zdHJlYW09KGJvb2xlYW4pZmFsc2UiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX21wNHZfZGVwYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSBbMSwgTUFYIF0sICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIk1QNFYtRVNcIiIKKyAgICAgICAgLyogQWxsIG9wdGlvbmFsIHBhcmFtZXRlcnMKKyAgICAgICAgICoKKyAgICAgICAgICogInByb2ZpbGUtbGV2ZWwtaWQ9WzEsTUFYXSIKKyAgICAgICAgICogImNvbmZpZz0iIAorICAgICAgICAgKi8KKyAgICApCisgICAgKTsKKworI2RlZmluZSBnc3RfcnRwX21wNHZfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwTVA0VkRlcGF5LCBnc3RfcnRwX21wNHZfZGVwYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfREVQQVlMT0FEKTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9tcDR2X2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfbXA0dl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfbXA0dl9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX21wNHZfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXA0dl9kZXBheV9jbGFzc19pbml0IChHc3RSdHBNUDRWRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX21wNHZfZGVwYXlfZmluYWxpemU7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3J0cF9tcDR2X2RlcGF5X2NoYW5nZV9zdGF0ZTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX21wNHZfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX21wNHZfZGVwYXlfc2V0Y2FwczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX21wNHZfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9tcDR2X2RlcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIE1QRUc0IHZpZGVvIGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBNUEVHNCB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMzAxNikiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cG1wNHZkZXBheV9kZWJ1ZywgInJ0cG1wNHZkZXBheSIsIDAsCisgICAgICAiTVBFRzQgdmlkZW8gUlRQIERlcGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wNHZfZGVwYXlfaW5pdCAoR3N0UnRwTVA0VkRlcGF5ICogcnRwbXA0dmRlcGF5KQoreworICBydHBtcDR2ZGVwYXktPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wNHZfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cE1QNFZEZXBheSAqcnRwbXA0dmRlcGF5OworCisgIHJ0cG1wNHZkZXBheSA9IEdTVF9SVFBfTVA0Vl9ERVBBWSAob2JqZWN0KTsKKworICBnX29iamVjdF91bnJlZiAocnRwbXA0dmRlcGF5LT5hZGFwdGVyKTsKKyAgcnRwbXA0dmRlcGF5LT5hZGFwdGVyID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcDR2X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgR3N0Q2FwcyAqc3JjY2FwczsKKyAgY29uc3QgZ2NoYXIgKnN0cjsKKyAgZ2ludCBjbG9ja19yYXRlOworICBnYm9vbGVhbiByZXM7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgY2xvY2tfcmF0ZSA9IDkwMDAwOyAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgZGVwYXlsb2FkLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL21wZWciLAorICAgICAgIm1wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgNCwKKyAgICAgICJzeXN0ZW1zdHJlYW0iLCBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworCisgIGlmICgoc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJjb25maWciKSkpIHsKKyAgICBHVmFsdWUgdiA9IHsgMCB9OworCisgICAgZ192YWx1ZV9pbml0ICgmdiwgR1NUX1RZUEVfQlVGRkVSKTsKKyAgICBpZiAoZ3N0X3ZhbHVlX2Rlc2VyaWFsaXplICgmdiwgc3RyKSkgeworICAgICAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgICAgIGJ1ZmZlciA9IGdzdF92YWx1ZV9nZXRfYnVmZmVyICgmdik7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChzcmNjYXBzLAorICAgICAgICAgICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLCBidWZmZXIsIE5VTEwpOworICAgICAgLyogY2FwcyB0YWtlcyByZWYgKi8KKyAgICAgIGdfdmFsdWVfdW5zZXQgKCZ2KTsKKyAgICB9IGVsc2UgeworICAgICAgZ193YXJuaW5nICgiY2Fubm90IGNvbnZlcnQgY29uZmlnIHRvIGJ1ZmZlciIpOworICAgIH0KKyAgfQorICByZXMgPSBnc3RfcGFkX3NldF9jYXBzIChkZXBheWxvYWQtPnNyY3BhZCwgc3JjY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfbXA0dl9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cE1QNFZEZXBheSAqcnRwbXA0dmRlcGF5OworICBHc3RCdWZmZXIgKnBidWYsICpvdXRidWYgPSBOVUxMOworICBnYm9vbGVhbiBtYXJrZXI7CisKKyAgcnRwbXA0dmRlcGF5ID0gR1NUX1JUUF9NUDRWX0RFUEFZIChkZXBheWxvYWQpOworCisgIC8qIGZsdXNoIHJlbWFpbmluZyBkYXRhIG9uIGRpc2NvbnQgKi8KKyAgaWYgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAocnRwLT5idWZmZXIpKQorICAgIGdzdF9hZGFwdGVyX2NsZWFyIChydHBtcDR2ZGVwYXktPmFkYXB0ZXIpOworCisgIHBidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9idWZmZXIgKHJ0cCk7CisgIG1hcmtlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCk7CisKKyAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRwbXA0dmRlcGF5LT5hZGFwdGVyLCBwYnVmKTsKKworICAvKiBpZiB0aGlzIHdhcyB0aGUgbGFzdCBwYWNrZXQgb2YgdGhlIFZPUCwgY3JlYXRlIGFuZCBwdXNoIGEgYnVmZmVyICovCisgIGlmIChtYXJrZXIpIHsKKyAgICBndWludCBhdmFpbDsKKworICAgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBtcDR2ZGVwYXktPmFkYXB0ZXIpOworICAgIG91dGJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChydHBtcDR2ZGVwYXktPmFkYXB0ZXIsIGF2YWlsKTsKKworICAgIEdTVF9ERUJVRyAoImdzdF9ydHBfbXA0dl9kZXBheV9jaGFpbjogcHVzaGluZyBidWZmZXIgb2Ygc2l6ZSAlIgorICAgICAgICBHX0dTSVpFX0ZPUk1BVCwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAob3V0YnVmKSk7CisgICAgZ3N0X3J0cF9kcm9wX25vbl92aWRlb19tZXRhIChydHBtcDR2ZGVwYXksIG91dGJ1Zik7CisgIH0KKworICByZXR1cm4gb3V0YnVmOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfbXA0dl9kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cE1QNFZEZXBheSAqcnRwbXA0dmRlcGF5OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRwbXA0dmRlcGF5ID0gR1NUX1JUUF9NUDRWX0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cG1wNHZkZXBheS0+YWRhcHRlcik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfbXA0dl9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cG1wNHZkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9NUDRWX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNmUwZGIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9NUDRWX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfTVA0Vl9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfTVA0Vl9ERVBBWSBcCisgIChnc3RfcnRwX21wNHZfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9NUDRWX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX01QNFZfREVQQVksR3N0UnRwTVA0VkRlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9NUDRWX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUDRWX0RFUEFZLEdzdFJ0cE1QNFZEZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUDRWX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX01QNFZfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QNFZfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX01QNFZfREVQQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTVA0VkRlcGF5IEdzdFJ0cE1QNFZEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBNUDRWRGVwYXlDbGFzcyBHc3RSdHBNUDRWRGVwYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBNUDRWRGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7CisgIAorICBHc3RBZGFwdGVyICphZGFwdGVyOworfTsKKworc3RydWN0IF9Hc3RSdHBNUDRWRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9tcDR2X2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9tcDR2X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX01QNFZfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwbXA0dnBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlODlmZDgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYwpAQCAtMCwwICsxLDYxOSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSAiZ3N0cnRwbXA0dnBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cG1wNHZwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cG1wNHZwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX21wNHZfcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL21wZWcsIgorICAgICAgICAibXBlZ3ZlcnNpb249KGludCkgNCwgc3lzdGVtc3RyZWFtPShib29sZWFuKWZhbHNlOyIgInZpZGVvL3gtZGl2eCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXA0dl9wYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgWzEsIE1BWCBdLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJNUDRWLUVTXCIiCisgICAgICAgIC8qIHR3byBzdHJpbmcgcGFyYW1zCisgICAgICAgICAqCisgICAgICAgICAicHJvZmlsZS1sZXZlbC1pZCA9IChzdHJpbmcpIFsxLE1BWF0iCisgICAgICAgICAiY29uZmlnID0gKHN0cmluZykgWzEsTUFYXSIKKyAgICAgICAgICovCisgICAgKQorICAgICk7CisKKyNkZWZpbmUgREVGQVVMVF9DT05GSUdfSU5URVJWQUwgMAorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9DT05GSUdfSU5URVJWQUwKK307CisKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9tcDR2X3BheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfbXA0dl9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9tcDR2X3BheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX21wNHZfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX21wNHZfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICoKKyAgICBwYXlsb2FkLCBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfbXA0dl9wYXlfc2lua19ldmVudCAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXksCisgICAgR3N0RXZlbnQgKiBldmVudCk7CisKKyNkZWZpbmUgZ3N0X3J0cF9tcDR2X3BheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBNUDRWUGF5LCBnc3RfcnRwX21wNHZfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9QQVlMT0FEKQorCisgICAgIHN0YXRpYyB2b2lkIGdzdF9ydHBfbXA0dl9wYXlfY2xhc3NfaW5pdCAoR3N0UnRwTVA0VlBheUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzICpnc3RydHBiYXNlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9tcDR2X3BheV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9ydHBfbXA0dl9wYXlfZ2V0X3Byb3BlcnR5OworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfbXA0dl9wYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9tcDR2X3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBNUEVHNCBWaWRlbyBwYXlsb2FkZXIiLCAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYXlsb2FkIE1QRUctNCB2aWRlbyBhcyBSVFAgcGFja2V0cyAoUkZDIDMwMTYpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQ09ORklHX0lOVEVSVkFMLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJjb25maWctaW50ZXJ2YWwiLCAiQ29uZmlnIFNlbmQgSW50ZXJ2YWwiLAorICAgICAgICAgICJTZW5kIENvbmZpZyBJbnNlcnRpb24gSW50ZXJ2YWwgaW4gc2Vjb25kcyAoY29uZmlndXJhdGlvbiBoZWFkZXJzICIKKyAgICAgICAgICAid2lsbCBiZSBtdWx0aXBsZXhlZCBpbiB0aGUgZGF0YSBzdHJlYW0gd2hlbiBkZXRlY3RlZC4pICgwID0gZGlzYWJsZWQpIiwKKyAgICAgICAgICAwLCAzNjAwLCBERUZBVUxUX0NPTkZJR19JTlRFUlZBTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpCisgICAgICApOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9tcDR2X3BheV9maW5hbGl6ZTsKKworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX21wNHZfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9tcDR2X3BheV9oYW5kbGVfYnVmZmVyOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2lua19ldmVudCA9IGdzdF9ydHBfbXA0dl9wYXlfc2lua19ldmVudDsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwbXA0dnBheV9kZWJ1ZywgInJ0cG1wNHZwYXkiLCAwLAorICAgICAgIk1QNCB2aWRlbyBSVFAgUGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wNHZfcGF5X2luaXQgKEdzdFJ0cE1QNFZQYXkgKiBydHBtcDR2cGF5KQoreworICBydHBtcDR2cGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworICBydHBtcDR2cGF5LT5yYXRlID0gOTAwMDA7CisgIHJ0cG1wNHZwYXktPnByb2ZpbGUgPSAxOworICBydHBtcDR2cGF5LT5uZWVkX2NvbmZpZyA9IFRSVUU7CisgIHJ0cG1wNHZwYXktPmNvbmZpZ19pbnRlcnZhbCA9IERFRkFVTFRfQ09ORklHX0lOVEVSVkFMOworICBydHBtcDR2cGF5LT5sYXN0X2NvbmZpZyA9IC0xOworCisgIHJ0cG1wNHZwYXktPmNvbmZpZyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wNHZfcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSdHBNUDRWUGF5ICpydHBtcDR2cGF5OworCisgIHJ0cG1wNHZwYXkgPSBHU1RfUlRQX01QNFZfUEFZIChvYmplY3QpOworCisgIGlmIChydHBtcDR2cGF5LT5jb25maWcpIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChydHBtcDR2cGF5LT5jb25maWcpOworICAgIHJ0cG1wNHZwYXktPmNvbmZpZyA9IE5VTEw7CisgIH0KKyAgZ19vYmplY3RfdW5yZWYgKHJ0cG1wNHZwYXktPmFkYXB0ZXIpOworICBydHBtcDR2cGF5LT5hZGFwdGVyID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcDR2X3BheV9uZXdfY2FwcyAoR3N0UnRwTVA0VlBheSAqIHJ0cG1wNHZwYXkpCit7CisgIGdjaGFyICpwcm9maWxlLCAqY29uZmlnOworICBHVmFsdWUgdiA9IHsgMCB9OworICBnYm9vbGVhbiByZXM7CisKKyAgcHJvZmlsZSA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgcnRwbXA0dnBheS0+cHJvZmlsZSk7CisgIGdfdmFsdWVfaW5pdCAoJnYsIEdTVF9UWVBFX0JVRkZFUik7CisgIGdzdF92YWx1ZV9zZXRfYnVmZmVyICgmdiwgcnRwbXA0dnBheS0+Y29uZmlnKTsKKyAgY29uZmlnID0gZ3N0X3ZhbHVlX3NlcmlhbGl6ZSAoJnYpOworCisgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwbXA0dnBheSksCisgICAgICAicHJvZmlsZS1sZXZlbC1pZCIsIEdfVFlQRV9TVFJJTkcsIHByb2ZpbGUsCisgICAgICAiY29uZmlnIiwgR19UWVBFX1NUUklORywgY29uZmlnLCBOVUxMKTsKKworICBnX3ZhbHVlX3Vuc2V0ICgmdik7CisKKyAgZ19mcmVlIChwcm9maWxlKTsKKyAgZ19mcmVlIChjb25maWcpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcDR2X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RSdHBNUDRWUGF5ICpydHBtcDR2cGF5OworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgY29uc3QgR1ZhbHVlICpjb2RlY19kYXRhOworICBnYm9vbGVhbiByZXM7CisKKyAgcnRwbXA0dnBheSA9IEdTVF9SVFBfTVA0Vl9QQVkgKHBheWxvYWQpOworCisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChwYXlsb2FkLCAidmlkZW8iLCBUUlVFLCAiTVA0Vi1FUyIsCisgICAgICBydHBtcDR2cGF5LT5yYXRlKTsKKworICByZXMgPSBUUlVFOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBjb2RlY19kYXRhID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImNvZGVjX2RhdGEiKTsKKyAgaWYgKGNvZGVjX2RhdGEpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocnRwbXA0dnBheSwgImdvdCBjb2RlY19kYXRhIik7CisgICAgaWYgKEdfVkFMVUVfVFlQRSAoY29kZWNfZGF0YSkgPT0gR1NUX1RZUEVfQlVGRkVSKSB7CisgICAgICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKworICAgICAgYnVmZmVyID0gZ3N0X3ZhbHVlX2dldF9idWZmZXIgKGNvZGVjX2RhdGEpOworCisgICAgICBpZiAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSA8IDUpCisgICAgICAgIGdvdG8gZG9uZTsKKworICAgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChidWZmZXIsIDQsICZydHBtcDR2cGF5LT5wcm9maWxlLCAxKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBtcDR2cGF5LCAiY29uZmlndXJpbmcgY29kZWNfZGF0YSwgcHJvZmlsZSAlZCIsCisgICAgICAgICAgcnRwbXA0dnBheS0+cHJvZmlsZSk7CisKKyAgICAgIGlmIChydHBtcDR2cGF5LT5jb25maWcpCisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHJ0cG1wNHZwYXktPmNvbmZpZyk7CisgICAgICBydHBtcDR2cGF5LT5jb25maWcgPSBnc3RfYnVmZmVyX2NvcHkgKGJ1ZmZlcik7CisgICAgICByZXMgPSBnc3RfcnRwX21wNHZfcGF5X25ld19jYXBzIChydHBtcDR2cGF5KTsKKyAgICB9CisgIH0KKworZG9uZToKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXA0dl9wYXlfZW1wdHkgKEdzdFJ0cE1QNFZQYXkgKiBydHBtcDR2cGF5KQoreworICBnc3RfYWRhcHRlcl9jbGVhciAocnRwbXA0dnBheS0+YWRhcHRlcik7Cit9CisKKyNkZWZpbmUgUlRQX0hFQURFUl9MRU4gMTIKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfbXA0dl9wYXlfZmx1c2ggKEdzdFJ0cE1QNFZQYXkgKiBydHBtcDR2cGF5KQoreworICBndWludCBhdmFpbCwgbXR1OworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0QnVmZmVyICpvdXRidWZfZGF0YSA9IE5VTEw7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RCdWZmZXJMaXN0ICpsaXN0ID0gTlVMTDsKKworICAvKiB0aGUgZGF0YSBhdmFpbGFibGUgaW4gdGhlIGFkYXB0ZXIgaXMgZWl0aGVyIHNtYWxsZXIKKyAgICogdGhhbiB0aGUgTVRVIG9yIGJpZ2dlci4gSW4gdGhlIGNhc2UgaXQgaXMgc21hbGxlciwgdGhlIGNvbXBsZXRlCisgICAqIGFkYXB0ZXIgY29udGVudHMgY2FuIGJlIHB1dCBpbiBvbmUgcGFja2V0LiBJbiB0aGUgY2FzZSB0aGUKKyAgICogYWRhcHRlciBoYXMgbW9yZSB0aGFuIG9uZSBNVFUsIHdlIG5lZWQgdG8gc3BsaXQgdGhlIE1QNFYgZGF0YQorICAgKiBvdmVyIG11bHRpcGxlIHBhY2tldHMuICovCisgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBtcDR2cGF5LT5hZGFwdGVyKTsKKworICBpZiAocnRwbXA0dnBheS0+Y29uZmlnID09IE5VTEwgJiYgcnRwbXA0dnBheS0+bmVlZF9jb25maWcpIHsKKyAgICAvKiB3aGVuIHdlIGRvbid0IGhhdmUgYSBjb25maWcgeWV0LCBmbHVzaCB0aGluZ3Mgb3V0ICovCisgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKHJ0cG1wNHZwYXktPmFkYXB0ZXIsIGF2YWlsKTsKKyAgICBhdmFpbCA9IDA7CisgIH0KKworICBpZiAoIWF2YWlsKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICBtdHUgPSBHU1RfUlRQX0JBU0VfUEFZTE9BRF9NVFUgKHJ0cG1wNHZwYXkpOworCisgIC8qIFVzZSBidWZmZXIgbGlzdHMuIEVhY2ggZnJhbWUgd2lsbCBiZSBwdXQgaW50byBhIGxpc3QKKyAgICogb2YgYnVmZmVycyBhbmQgdGhlIHdob2xlIGxpc3Qgd2lsbCBiZSBwdXNoZWQgZG93bnN0cmVhbQorICAgKiBhdCBvbmNlICovCisgIGxpc3QgPSBnc3RfYnVmZmVyX2xpc3RfbmV3X3NpemVkICgoYXZhaWwgLyAobXR1IC0gUlRQX0hFQURFUl9MRU4pKSArIDEpOworCisgIHdoaWxlIChhdmFpbCA+IDApIHsKKyAgICBndWludCB0b3dyaXRlOworICAgIGd1aW50IHBheWxvYWRfbGVuOworICAgIGd1aW50IHBhY2tldF9sZW47CisgICAgR3N0UlRQQnVmZmVyIHJ0cCA9IHsgTlVMTCB9OworCisgICAgLyogdGhpcyB3aWxsIGJlIHRoZSB0b3RhbCBsZW5naHQgb2YgdGhlIHBhY2tldCAqLworICAgIHBhY2tldF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BhY2tldF9sZW4gKGF2YWlsLCAwLCAwKTsKKworICAgIC8qIGZpbGwgb25lIE1UVSBvciBhbGwgYXZhaWxhYmxlIGJ5dGVzICovCisgICAgdG93cml0ZSA9IE1JTiAocGFja2V0X2xlbiwgbXR1KTsKKworICAgIC8qIHRoaXMgaXMgdGhlIHBheWxvYWQgbGVuZ3RoICovCisgICAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BheWxvYWRfbGVuICh0b3dyaXRlLCAwLCAwKTsKKworICAgIC8qIGNyZWF0ZSBidWZmZXIgd2l0aG91dCBwYXlsb2FkLiBUaGUgcGF5bG9hZCB3aWxsIGJlIHB1dAorICAgICAqIGluIG5leHQgYnVmZmVyIGluc3RlYWQuIEJvdGggYnVmZmVycyB3aWxsIGJlIG1lcmdlZCAqLworICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoMCwgMCwgMCk7CisKKyAgICAvKiBUYWtlIGJ1ZmZlciB3aXRoIHRoZSBwYXlsb2FkIGZyb20gdGhlIGFkYXB0ZXIgKi8KKyAgICBvdXRidWZfZGF0YSA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyX2Zhc3QgKHJ0cG1wNHZwYXktPmFkYXB0ZXIsCisgICAgICAgIHBheWxvYWRfbGVuKTsKKworICAgIGF2YWlsIC09IHBheWxvYWRfbGVuOworCisgICAgZ3N0X3J0cF9idWZmZXJfbWFwIChvdXRidWYsIEdTVF9NQVBfV1JJVEUsICZydHApOworICAgIGdzdF9ydHBfYnVmZmVyX3NldF9tYXJrZXIgKCZydHAsIGF2YWlsID09IDApOworICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwbXA0dnBheSwgb3V0YnVmLCBvdXRidWZfZGF0YSk7CisgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKG91dGJ1Ziwgb3V0YnVmX2RhdGEpOworCisgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSBydHBtcDR2cGF5LT5maXJzdF90aW1lc3RhbXA7CisKKyAgICAvKiBhZGQgdG8gbGlzdCAqLworICAgIGdzdF9idWZmZXJfbGlzdF9pbnNlcnQgKGxpc3QsIC0xLCBvdXRidWYpOworICB9CisKKyAgLyogcHVzaCB0aGUgd2hvbGUgYnVmZmVyIGxpc3QgYXQgb25jZSAqLworICByZXQgPQorICAgICAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfcHVzaF9saXN0IChHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwbXA0dnBheSksIGxpc3QpOworCisgIHJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgVk9TX1NUQVJUQ09ERSAgICAgICAgICAgICAgICAgICAweDAwMDAwMUIwCisjZGVmaW5lIFZPU19FTkRDT0RFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDFCMQorI2RlZmluZSBVU0VSX0RBVEFfU1RBUlRDT0RFICAgICAgICAgICAgIDB4MDAwMDAxQjIKKyNkZWZpbmUgR09QX1NUQVJUQ09ERSAgICAgICAgICAgICAgICAgICAweDAwMDAwMUIzCisjZGVmaW5lIFZJU1VBTF9PQkpFQ1RfU1RBUlRDT0RFICAgICAgICAgMHgwMDAwMDFCNQorI2RlZmluZSBWT1BfU1RBUlRDT0RFICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxQjYKKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX21wNHZfcGF5X2RlcGF5X2RhdGEgKEdzdFJ0cE1QNFZQYXkgKiBlbmMsIGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsCisgICAgZ2ludCAqIHN0cmlwLCBnYm9vbGVhbiAqIHZvcGkpCit7CisgIGd1aW50MzIgY29kZTsKKyAgZ2Jvb2xlYW4gcmVzdWx0OworICAqdm9waSA9IEZBTFNFOworCisgICpzdHJpcCA9IDA7CisKKyAgaWYgKHNpemUgPCA1KQorICAgIHJldHVybiBGQUxTRTsKKworICBjb2RlID0gR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoZW5jLCAic3RhcnQgY29kZSAweCUwOHgiLCBjb2RlKTsKKworICBzd2l0Y2ggKGNvZGUpIHsKKyAgICBjYXNlIFZPU19TVEFSVENPREU6CisgICAgY2FzZSAweDAwMDAwMTAxOgorICAgIHsKKyAgICAgIGdpbnQgaTsKKyAgICAgIGd1aW50OCBwcm9maWxlOworICAgICAgZ2Jvb2xlYW4gbmV3cHJvZmlsZSA9IEZBTFNFOworICAgICAgZ2Jvb2xlYW4gZXF1YWw7CisKKyAgICAgIGlmIChjb2RlID09IFZPU19TVEFSVENPREUpIHsKKyAgICAgICAgLyogcHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbiAqLworICAgICAgICBwcm9maWxlID0gZGF0YVs0XTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJWT1MgcHJvZmlsZSAweCUwOHgiLCBwcm9maWxlKTsKKworICAgICAgICBpZiAocHJvZmlsZSAhPSBlbmMtPnByb2ZpbGUpIHsKKyAgICAgICAgICBuZXdwcm9maWxlID0gVFJVRTsKKyAgICAgICAgICBlbmMtPnByb2ZpbGUgPSBwcm9maWxlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIHVwIHRvIHRoZSBuZXh0IEdPUF9TVEFSVENPREUgb3IgVk9QX1NUQVJUQ09ERSBpcworICAgICAgICogdGhlIGNvbmZpZyBpbmZvcm1hdGlvbiAqLworICAgICAgY29kZSA9IDB4ZmZmZmZmZmY7CisgICAgICBmb3IgKGkgPSA1OyBpIDwgc2l6ZSAtIDQ7IGkrKykgeworICAgICAgICBjb2RlID0gKGNvZGUgPDwgOCkgfCBkYXRhW2ldOworICAgICAgICBpZiAoY29kZSA9PSBHT1BfU1RBUlRDT0RFIHx8IGNvZGUgPT0gVk9QX1NUQVJUQ09ERSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGkgLT0gMzsKKyAgICAgIC8qIHNlZSBpZiBjb25maWcgY2hhbmdlZCAqLworICAgICAgZXF1YWwgPSBGQUxTRTsKKyAgICAgIGlmIChlbmMtPmNvbmZpZykgeworICAgICAgICBpZiAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZW5jLT5jb25maWcpID09IGkpIHsKKyAgICAgICAgICBlcXVhbCA9IGdzdF9idWZmZXJfbWVtY21wIChlbmMtPmNvbmZpZywgMCwgZGF0YSwgaSkgPT0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogaWYgY29uZmlnIHN0cmluZyBjaGFuZ2VkIG9yIG5ldyBwcm9maWxlLCBtYWtlIG5ldyBjYXBzICovCisgICAgICBpZiAoIWVxdWFsIHx8IG5ld3Byb2ZpbGUpIHsKKyAgICAgICAgaWYgKGVuYy0+Y29uZmlnKQorICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGVuYy0+Y29uZmlnKTsKKyAgICAgICAgZW5jLT5jb25maWcgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGkpOworCisgICAgICAgIGdzdF9idWZmZXJfZmlsbCAoZW5jLT5jb25maWcsIDAsIGRhdGEsIGkpOworCisgICAgICAgIGdzdF9ydHBfbXA0dl9wYXlfbmV3X2NhcHMgKGVuYyk7CisgICAgICB9CisgICAgICAqc3RyaXAgPSBpOworICAgICAgLyogd2UgbmVlZCB0byBmbHVzaCBvdXQgdGhlIGN1cnJlbnQgcGFja2V0LiAqLworICAgICAgcmVzdWx0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFZPUF9TVEFSVENPREU6CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJWT1AiKTsKKyAgICAgIC8qIFZPUCBzdGFydGNvZGUsIHdlIGRvbid0IGhhdmUgdG8gZmx1c2ggdGhlIHBhY2tldCAqLworICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICAvKiB2b3AtY29kaW5nLXR5cGUgPT0gSS1mcmFtZSAqLworICAgICAgaWYgKHNpemUgPiA0ICYmIChkYXRhWzRdID4+IDYgPT0gMCkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZW5jLCAiVk9QLUkiKTsKKyAgICAgICAgKnZvcGkgPSBUUlVFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHT1BfU1RBUlRDT0RFOgorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZW5jLCAiR09QIik7CisgICAgICAqdm9waSA9IFRSVUU7CisgICAgICByZXN1bHQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDAwMDAwMTAwOgorICAgICAgZW5jLT5uZWVkX2NvbmZpZyA9IEZBTFNFOworICAgICAgcmVzdWx0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoY29kZSA+PSAweDIwICYmIGNvZGUgPD0gMHgyZikgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJzaG9ydCBoZWFkZXIiKTsKKyAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJvdGhlciBzdGFydGNvZGUiKTsKKyAgICAgICAgLyogYWxsIG90aGVyIHN0YXJ0Y29kZXMgbmVlZCBhIGZsdXNoICovCisgICAgICAgIHJlc3VsdCA9IFRSVUU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKiB3ZSBleHBlY3QgYnVmZmVycyBzdGFydGluZyBvbiBzdGFydGNvZGVzLiAKKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfbXA0dl9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJ0cE1QNFZQYXkgKnJ0cG1wNHZwYXk7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBndWludCBhdmFpbDsKKyAgZ3VpbnQgcGFja2V0X2xlbjsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdzaXplIHNpemU7CisgIGdib29sZWFuIGZsdXNoOworICBnaW50IHN0cmlwOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBkdXJhdGlvbjsKKyAgZ2Jvb2xlYW4gdm9waTsKKyAgZ2Jvb2xlYW4gc2VuZF9jb25maWc7CisKKyAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgIHNlbmRfY29uZmlnID0gRkFMU0U7CisKKyAgcnRwbXA0dnBheSA9IEdTVF9SVFBfTVA0Vl9QQVkgKGJhc2VwYXlsb2FkKTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBzaXplID0gbWFwLnNpemU7CisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworICBkdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcik7CisgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBtcDR2cGF5LT5hZGFwdGVyKTsKKworICBpZiAoZHVyYXRpb24gPT0gLTEpCisgICAgZHVyYXRpb24gPSAwOworCisgIC8qIGVtcHR5IGJ1ZmZlciwgdGFrZSB0aW1lc3RhbXAgKi8KKyAgaWYgKGF2YWlsID09IDApIHsKKyAgICBydHBtcDR2cGF5LT5maXJzdF90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgcnRwbXA0dnBheS0+ZHVyYXRpb24gPSAwOworICB9CisKKyAgLyogZGVwYXkgaW5jb21taW5nIGRhdGEgYW5kIHNlZSBpZiB3ZSBuZWVkIHRvIHN0YXJ0IGEgbmV3IFJUUAorICAgKiBwYWNrZXQgKi8KKyAgZmx1c2ggPQorICAgICAgZ3N0X3J0cF9tcDR2X3BheV9kZXBheV9kYXRhIChydHBtcDR2cGF5LCBtYXAuZGF0YSwgc2l6ZSwgJnN0cmlwLCAmdm9waSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKKyAgaWYgKHN0cmlwKSB7CisgICAgLyogc3RyaXAgb2ZmIGNvbmZpZyBpZiByZXF1ZXN0ZWQgKi8KKyAgICBpZiAoIShydHBtcDR2cGF5LT5jb25maWdfaW50ZXJ2YWwgPiAwKSkgeworICAgICAgR3N0QnVmZmVyICpzdWJidWY7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBtcDR2cGF5LCAic3RyaXBwaW5nIGNvbmZpZyBhdCAlZCwgc2l6ZSAlZCIsIHN0cmlwLAorICAgICAgICAgIChnaW50KSBzaXplIC0gc3RyaXApOworCisgICAgICAvKiBzdHJpcCBvZmYgaGVhZGVyICovCisgICAgICBzdWJidWYgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIHN0cmlwLAorICAgICAgICAgIHNpemUgLSBzdHJpcCk7CisgICAgICBHU1RfQlVGRkVSX1BUUyAoc3ViYnVmKSA9IHRpbWVzdGFtcDsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgICBidWZmZXIgPSBzdWJidWY7CisKKyAgICAgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwbXA0dnBheSwgImZvdW5kIGNvbmZpZyBpbiBzdHJlYW0iKTsKKyAgICAgIHJ0cG1wNHZwYXktPmxhc3RfY29uZmlnID0gdGltZXN0YW1wOworICAgIH0KKyAgfQorCisgIC8qIHRoZXJlIGlzIGEgY29uZmlnIHJlcXVlc3QsIHNlZSBpZiB3ZSBuZWVkIHRvIGluc2VydCBpdCAqLworICBpZiAodm9waSAmJiAocnRwbXA0dnBheS0+Y29uZmlnX2ludGVydmFsID4gMCkgJiYgcnRwbXA0dnBheS0+Y29uZmlnKSB7CisgICAgaWYgKHJ0cG1wNHZwYXktPmxhc3RfY29uZmlnICE9IC0xKSB7CisgICAgICBndWludDY0IGRpZmY7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBtcDR2cGF5LAorICAgICAgICAgICJub3cgJSIgR1NUX1RJTUVfRk9STUFUICIsIGxhc3QgVk9QLUkgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCksIEdTVF9USU1FX0FSR1MgKHJ0cG1wNHZwYXktPmxhc3RfY29uZmlnKSk7CisKKyAgICAgIC8qIGNhbGN1bGF0ZSBkaWZmIGJldHdlZW4gbGFzdCBjb25maWcgaW4gbWlsbGlzZWNvbmRzICovCisgICAgICBpZiAodGltZXN0YW1wID4gcnRwbXA0dnBheS0+bGFzdF9jb25maWcpIHsKKyAgICAgICAgZGlmZiA9IHRpbWVzdGFtcCAtIHJ0cG1wNHZwYXktPmxhc3RfY29uZmlnOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGlmZiA9IDA7CisgICAgICB9CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cG1wNHZwYXksCisgICAgICAgICAgImludGVydmFsIHNpbmNlIGxhc3QgY29uZmlnICUiIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAoZGlmZikpOworCisgICAgICAvKiBiaWdnZXIgdGhhbiBpbnRlcnZhbCwgcXVldWUgY29uZmlnICovCisgICAgICAvKiBGSVhNRSBzaG91bGQgY29udmVydCB0aW1lc3RhbXBzIHRvIHJ1bm5pbmcgdGltZSAqLworICAgICAgaWYgKEdTVF9USU1FX0FTX1NFQ09ORFMgKGRpZmYpID49IHJ0cG1wNHZwYXktPmNvbmZpZ19pbnRlcnZhbCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDR2cGF5LCAidGltZSB0byBzZW5kIGNvbmZpZyIpOworICAgICAgICBzZW5kX2NvbmZpZyA9IFRSVUU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIG5vIGtub3duIHByZXZpb3VzIGNvbmZpZyB0aW1lLCBzZW5kIG5vdyAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXA0dnBheSwgIm5vIHByZXZpb3VzIGNvbmZpZyB0aW1lLCBzZW5kIG5vdyIpOworICAgICAgc2VuZF9jb25maWcgPSBUUlVFOworICAgIH0KKworICAgIGlmIChzZW5kX2NvbmZpZykgeworICAgICAgLyogd2UgbmVlZCB0byBzZW5kIGNvbmZpZyBub3cgZmlyc3QgKi8KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBtcDR2cGF5LCAiaW5zZXJ0aW5nIGNvbmZpZyBpbiBzdHJlYW0iKTsKKworICAgICAgLyogaW5zZXJ0IGhlYWRlciAqLworICAgICAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKGdzdF9idWZmZXJfcmVmIChydHBtcDR2cGF5LT5jb25maWcpLCBidWZmZXIpOworCisgICAgICBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKSA9IHRpbWVzdGFtcDsKKyAgICAgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpOworCisgICAgICBpZiAodGltZXN0YW1wICE9IC0xKSB7CisgICAgICAgIHJ0cG1wNHZwYXktPmxhc3RfY29uZmlnID0gdGltZXN0YW1wOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGlmIHdlIG5lZWQgdG8gZmx1c2gsIGRvIHNvIG5vdyAqLworICBpZiAoZmx1c2gpIHsKKyAgICByZXQgPSBnc3RfcnRwX21wNHZfcGF5X2ZsdXNoIChydHBtcDR2cGF5KTsKKyAgICBydHBtcDR2cGF5LT5maXJzdF90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgcnRwbXA0dnBheS0+ZHVyYXRpb24gPSAwOworICAgIGF2YWlsID0gMDsKKyAgfQorCisgIC8qIGdldCBwYWNrZXQgbGVuZ3RoIG9mIGRhdGEgYW5kIHNlZSBpZiB3ZSBleGNlZWRlZCBNVFUuICovCisgIHBhY2tldF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BhY2tldF9sZW4gKGF2YWlsICsgc2l6ZSwgMCwgMCk7CisKKyAgaWYgKGdzdF9ydHBfYmFzZV9wYXlsb2FkX2lzX2ZpbGxlZCAoYmFzZXBheWxvYWQsCisgICAgICAgICAgcGFja2V0X2xlbiwgcnRwbXA0dnBheS0+ZHVyYXRpb24gKyBkdXJhdGlvbikpIHsKKyAgICByZXQgPSBnc3RfcnRwX21wNHZfcGF5X2ZsdXNoIChydHBtcDR2cGF5KTsKKyAgICBydHBtcDR2cGF5LT5maXJzdF90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgcnRwbXA0dnBheS0+ZHVyYXRpb24gPSAwOworICB9CisKKyAgLyogcHVzaCBuZXcgZGF0YSAqLworICBnc3RfYWRhcHRlcl9wdXNoIChydHBtcDR2cGF5LT5hZGFwdGVyLCBidWZmZXIpOworCisgIHJ0cG1wNHZwYXktPmR1cmF0aW9uICs9IGR1cmF0aW9uOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcDR2X3BheV9zaW5rX2V2ZW50IChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheSwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UnRwTVA0VlBheSAqcnRwbXA0dnBheTsKKworICBydHBtcDR2cGF5ID0gR1NUX1JUUF9NUDRWX1BBWSAocGF5KTsKKworICBHU1RfREVCVUcgKCJHb3QgZXZlbnQ6ICVzIiwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgIC8qIFRoaXMgZmx1c2ggY2FsbCBtYWtlcyBzdXJlIHRoYXQgdGhlIGxhc3QgYnVmZmVyIGlzIGFsd2F5cyBwdXNoZWQKKyAgICAgICAqIHRvIHRoZSBiYXNlIHBheWxvYWRlciAqLworICAgICAgZ3N0X3J0cF9tcDR2X3BheV9mbHVzaCAocnRwbXA0dnBheSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ3N0X3J0cF9tcDR2X3BheV9lbXB0eSAocnRwbXA0dnBheSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBsZXQgcGFyZW50IGhhbmRsZSBldmVudCB0b28gKi8KKyAgcmV0dXJuIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChwYXksIGV2ZW50KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXA0dl9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cE1QNFZQYXkgKnJ0cG1wNHZwYXk7CisKKyAgcnRwbXA0dnBheSA9IEdTVF9SVFBfTVA0Vl9QQVkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0NPTkZJR19JTlRFUlZBTDoKKyAgICAgIHJ0cG1wNHZwYXktPmNvbmZpZ19pbnRlcnZhbCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcDR2X3BheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwTVA0VlBheSAqcnRwbXA0dnBheTsKKworICBydHBtcDR2cGF5ID0gR1NUX1JUUF9NUDRWX1BBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ09ORklHX0lOVEVSVkFMOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0cG1wNHZwYXktPmNvbmZpZ19pbnRlcnZhbCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfbXA0dl9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBtcDR2cGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX01QNFZfUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXA0dnBheS5oIGIvZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk3NGE5MQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXA0dnBheS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9NUDRWX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX01QNFZfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZXBheWxvYWQuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfTVA0Vl9QQVkgXAorICAoZ3N0X3J0cF9tcDR2X3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX01QNFZfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX01QNFZfUEFZLEdzdFJ0cE1QNFZQYXkpKQorI2RlZmluZSBHU1RfUlRQX01QNFZfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUDRWX1BBWSxHc3RSdHBNUDRWUGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QNFZfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX01QNFZfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUDRWX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTVA0Vl9QQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTVA0VlBheSBHc3RSdHBNUDRWUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cE1QNFZQYXlDbGFzcyBHc3RSdHBNUDRWUGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwTVA0VlBheQoreworICBHc3RSVFBCYXNlUGF5bG9hZCAgICBwYXlsb2FkOworCisgIEdzdEFkYXB0ZXIgICAqYWRhcHRlcjsKKyAgR3N0Q2xvY2tUaW1lICBmaXJzdF90aW1lc3RhbXA7CisgIEdzdENsb2NrVGltZSAgZHVyYXRpb247CisKKyAgZ2ludCAgICAgICAgICByYXRlOworICBnaW50ICAgICAgICAgIHByb2ZpbGU7CisgIEdzdEJ1ZmZlciAgICAqY29uZmlnOworICBnYm9vbGVhbiAgICAgIHNlbmRfY29uZmlnOworICBnYm9vbGVhbiAgICAgIG5lZWRfY29uZmlnOworCisgIC8qIG5hbWluZyBtaWdodCBiZSBjb25mdXNpbmcgd2l0aCBzZW5kX2NvbmZpZzsgYnV0IG5hbWluZyBtYXRjaGVzIGgyNjQKKyAgICogcGF5bG9hZGVyICovCisgIGd1aW50ICAgICAgICAgY29uZmlnX2ludGVydmFsOworICBHc3RDbG9ja1RpbWUgIGxhc3RfY29uZmlnOworfTsKKworc3RydWN0IF9Hc3RSdHBNUDRWUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX21wNHZfcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9tcDR2X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9NUDRWX1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODUwNmRiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jCkBAIC0wLDAgKzEsMTgxIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0cnRwbXBhZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBtcGFkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwbXBhZGVwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX21wYV9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL21wZWcsICIgIm1wZWd2ZXJzaW9uID0gKGludCkgMSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXBhX2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX01QQV9TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwIDsiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIk1QQVwiLCBjbG9jay1yYXRlID0gKGludCkgWzEsIE1BWF0iKQorICAgICk7CisKKyNkZWZpbmUgZ3N0X3J0cF9tcGFfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwTVBBRGVwYXksIGdzdF9ydHBfbXBhX2RlcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9tcGFfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX21wYV9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wYV9kZXBheV9jbGFzc19pbml0IChHc3RSdHBNUEFEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBtcGFkZXBheV9kZWJ1ZywgInJ0cG1wYWRlcGF5IiwgMCwKKyAgICAgICJNUEVHIEF1ZGlvIFJUUCBEZXBheWxvYWRlciIpOworCisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX21wYV9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX21wYV9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBNUEVHIGF1ZGlvIGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBNUEVHIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgKFJGQyAyMDM4KSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfbXBhX2RlcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfbXBhX2RlcGF5X3Byb2Nlc3M7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wYV9kZXBheV9pbml0IChHc3RSdHBNUEFEZXBheSAqIHJ0cG1wYWRlcGF5KQoreworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfbXBhX2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgR3N0Q2FwcyAqb3V0Y2FwczsKKyAgZ2ludCBjbG9ja19yYXRlOworICBnYm9vbGVhbiByZXM7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgY2xvY2tfcmF0ZSA9IDkwMDAwOworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIG91dGNhcHMgPQorICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL21wZWciLCAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoZGVwYXlsb2FkLT5zcmNwYWQsIG91dGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAob3V0Y2Fwcyk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX21wYV9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cE1QQURlcGF5ICpydHBtcGFkZXBheTsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIGdpbnQgcGF5bG9hZF9sZW47CisjaWYgMAorICBndWludDggKnBheWxvYWQ7CisgIGd1aW50MTYgZnJhZ19vZmZzZXQ7CisjZW5kaWYKKyAgZ2Jvb2xlYW4gbWFya2VyOworCisgIHJ0cG1wYWRlcGF5ID0gR1NUX1JUUF9NUEFfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisKKyAgaWYgKHBheWxvYWRfbGVuIDw9IDQpCisgICAgZ290byBlbXB0eV9wYWNrZXQ7CisKKyNpZiAwCisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisgIC8qIHN0cmlwIG9mZiBoZWFkZXIKKyAgICoKKyAgICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgICAgICAgICAgIE1CWiAgICAgICAgICAgICAgIHwgICAgICAgICAgRnJhZ19vZmZzZXQgICAgICAgICAgfAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKi8KKyAgZnJhZ19vZmZzZXQgPSAocGF5bG9hZFsyXSA8PCA4KSB8IHBheWxvYWRbM107CisjZW5kaWYKKworICAvKiBzdWJidWZmZXIgc2tpcHBpbmcgdGhlIDQgaGVhZGVyIGJ5dGVzICovCisgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3N1YmJ1ZmZlciAocnRwLCA0LCAtMSk7CisgIG1hcmtlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCk7CisKKyAgaWYgKG1hcmtlcikgeworICAgIC8qIG1hcmsgc3RhcnQgb2YgdGFsa3NwdXJ0IHdpdGggUkVTWU5DICovCisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfUkVTWU5DKTsKKyAgfQorICBHU1RfREVCVUdfT0JKRUNUIChydHBtcGFkZXBheSwKKyAgICAgICJnc3RfcnRwX21wYV9kZXBheV9jaGFpbjogcHVzaGluZyBidWZmZXIgb2Ygc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCAiIiwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZikpOworCisgIGlmIChvdXRidWYpIHsKKyAgICBnc3RfcnRwX2Ryb3Bfbm9uX2F1ZGlvX21ldGEgKHJ0cG1wYWRlcGF5LCBvdXRidWYpOworICB9CisKKyAgLyogRklYTUUsIHdlIGNhbiBwdXNoIGhhbGYgbXBlZyBmcmFtZXMgd2hlbiB0aGV5IGFyZSBzcGxpdCBvdmVyIG11bHRpcGxlCisgICAqIFJUUCBwYWNrZXRzICovCisgIHJldHVybiBvdXRidWY7CisKKyAgLyogRVJST1JTICovCitlbXB0eV9wYWNrZXQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBtcGFkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgICgiRW1wdHkgUGF5bG9hZC4iKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3J0cF9tcGFfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBtcGFkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9NUEFfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNzBkNzcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmgKQEAgLTAsMCArMSw1OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX01QQV9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX01QQV9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9NUEFfREVQQVkgXAorICAoZ3N0X3J0cF9tcGFfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9NUEFfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfTVBBX0RFUEFZLEdzdFJ0cE1QQURlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9NUEFfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX01QQV9ERVBBWSxHc3RSdHBNUEFEZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUEFfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfTVBBX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUEFfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX01QQV9ERVBBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBNUEFEZXBheSBHc3RSdHBNUEFEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBNUEFEZXBheUNsYXNzIEdzdFJ0cE1QQURlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwTVBBRGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cE1QQURlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfbXBhX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9tcGFfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfTVBBX0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBtcGFwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwbXBhcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlmYThhOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXBhcGF5LmMKQEAgLTAsMCArMSwzNDMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgImdzdHJ0cG1wYXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cG1wYXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwbXBhcGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9tcGFfcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8vbXBlZywgIiAibXBlZ3ZlcnNpb24gPSAoaW50KSAxIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9tcGFfcGF5X3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX01QQV9TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwOyAiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIk1QQVwiIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX21wYV9wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9tcGFfcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX21wYV9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX21wYV9wYXlfc2lua19ldmVudCAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9tcGFfcGF5X2ZsdXNoIChHc3RSdHBNUEFQYXkgKiBydHBtcGFwYXkpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9tcGFfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworCisjZGVmaW5lIGdzdF9ydHBfbXBhX3BheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBNUEFQYXksIGdzdF9ydHBfbXBhX3BheSwgR1NUX1RZUEVfUlRQX0JBU0VfUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wYV9wYXlfY2xhc3NfaW5pdCAoR3N0UnRwTVBBUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBtcGFwYXlfZGVidWcsICJydHBtcGFwYXkiLCAwLAorICAgICAgIk1QRUcgQXVkaW8gUlRQIERlcGF5bG9hZGVyIik7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9tcGFfcGF5X2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfbXBhX3BheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9tcGFfcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfbXBhX3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBNUEVHIGF1ZGlvIHBheWxvYWRlciIsICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBheWxvYWQgTVBFRyBhdWRpbyBhcyBSVFAgcGFja2V0cyAoUkZDIDIwMzgpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfbXBhX3BheV9zZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2lua19ldmVudCA9IGdzdF9ydHBfbXBhX3BheV9zaW5rX2V2ZW50OworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2J1ZmZlciA9IGdzdF9ydHBfbXBhX3BheV9oYW5kbGVfYnVmZmVyOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcGFfcGF5X2luaXQgKEdzdFJ0cE1QQVBheSAqIHJ0cG1wYXBheSkKK3sKKyAgcnRwbXBhcGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworCisgIEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBtcGFwYXkpLT5wdCA9IEdTVF9SVFBfUEFZTE9BRF9NUEE7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wYV9wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cE1QQVBheSAqcnRwbXBhcGF5OworCisgIHJ0cG1wYXBheSA9IEdTVF9SVFBfTVBBX1BBWSAob2JqZWN0KTsKKworICBnX29iamVjdF91bnJlZiAocnRwbXBhcGF5LT5hZGFwdGVyKTsKKyAgcnRwbXBhcGF5LT5hZGFwdGVyID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wYV9wYXlfcmVzZXQgKEdzdFJ0cE1QQVBheSAqIHBheSkKK3sKKyAgcGF5LT5maXJzdF90cyA9IC0xOworICBwYXktPmR1cmF0aW9uID0gMDsKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHBheS0+YWRhcHRlcik7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHBheSwgInJlc2V0IGRlcGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcGFfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIGdib29sZWFuIHJlczsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAocGF5bG9hZCwgImF1ZGlvIiwKKyAgICAgIHBheWxvYWQtPnB0ICE9IEdTVF9SVFBfUEFZTE9BRF9NUEEsICJNUEEiLCA5MDAwMCk7CisgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChwYXlsb2FkLCBOVUxMKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfbXBhX3BheV9zaW5rX2V2ZW50IChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJldDsKKyAgR3N0UnRwTVBBUGF5ICpydHBtcGFwYXk7CisKKyAgcnRwbXBhcGF5ID0gR1NUX1JUUF9NUEFfUEFZIChwYXlsb2FkKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgICAvKiBtYWtlIHN1cmUgd2UgcHVzaCB0aGUgbGFzdCBwYWNrZXRzIGluIHRoZSBhZGFwdGVyIG9uIEVPUyAqLworICAgICAgZ3N0X3J0cF9tcGFfcGF5X2ZsdXNoIChydHBtcGFwYXkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9ydHBfbXBhX3BheV9yZXNldCAocnRwbXBhcGF5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChwYXlsb2FkLCBldmVudCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBSVFBfSEVBREVSX0xFTiAxMgorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9tcGFfcGF5X2ZsdXNoIChHc3RSdHBNUEFQYXkgKiBydHBtcGFwYXkpCit7CisgIGd1aW50IGF2YWlsOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIGd1aW50MTYgZnJhZ19vZmZzZXQ7CisgIEdzdEJ1ZmZlckxpc3QgKmxpc3Q7CisKKyAgLyogdGhlIGRhdGEgYXZhaWxhYmxlIGluIHRoZSBhZGFwdGVyIGlzIGVpdGhlciBzbWFsbGVyCisgICAqIHRoYW4gdGhlIE1UVSBvciBiaWdnZXIuIEluIHRoZSBjYXNlIGl0IGlzIHNtYWxsZXIsIHRoZSBjb21wbGV0ZQorICAgKiBhZGFwdGVyIGNvbnRlbnRzIGNhbiBiZSBwdXQgaW4gb25lIHBhY2tldC4gSW4gdGhlIGNhc2UgdGhlCisgICAqIGFkYXB0ZXIgaGFzIG1vcmUgdGhhbiBvbmUgTVRVLCB3ZSBuZWVkIHRvIHNwbGl0IHRoZSBNUEEgZGF0YQorICAgKiBvdmVyIG11bHRpcGxlIHBhY2tldHMuIFRoZSBmcmFnX29mZnNldCBpbiBlYWNoIHBhY2tldCBoZWFkZXIKKyAgICogbmVlZHMgdG8gYmUgdXBkYXRlZCB3aXRoIHRoZSBwb3NpdGlvbiBpbiB0aGUgTVBBIGZyYW1lLiAqLworICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwbXBhcGF5LT5hZGFwdGVyKTsKKworICByZXQgPSBHU1RfRkxPV19PSzsKKworICBsaXN0ID0KKyAgICAgIGdzdF9idWZmZXJfbGlzdF9uZXdfc2l6ZWQgKGF2YWlsIC8gKEdTVF9SVFBfQkFTRV9QQVlMT0FEX01UVSAocnRwbXBhcGF5KSAtCisgICAgICAgICAgUlRQX0hFQURFUl9MRU4pICsgMSk7CisKKyAgZnJhZ19vZmZzZXQgPSAwOworICB3aGlsZSAoYXZhaWwgPiAwKSB7CisgICAgZ3VpbnQgdG93cml0ZTsKKyAgICBndWludDggKnBheWxvYWQ7CisgICAgZ3VpbnQgcGF5bG9hZF9sZW47CisgICAgZ3VpbnQgcGFja2V0X2xlbjsKKyAgICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisgICAgR3N0QnVmZmVyICpwYXlidWY7CisKKyAgICAvKiB0aGlzIHdpbGwgYmUgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgcGFja2V0ICovCisgICAgcGFja2V0X2xlbiA9IGdzdF9ydHBfYnVmZmVyX2NhbGNfcGFja2V0X2xlbiAoNCArIGF2YWlsLCAwLCAwKTsKKworICAgIC8qIGZpbGwgb25lIE1UVSBvciBhbGwgYXZhaWxhYmxlIGJ5dGVzICovCisgICAgdG93cml0ZSA9IE1JTiAocGFja2V0X2xlbiwgR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVIChydHBtcGFwYXkpKTsKKworICAgIC8qIHRoaXMgaXMgdGhlIHBheWxvYWQgbGVuZ3RoICovCisgICAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BheWxvYWRfbGVuICh0b3dyaXRlLCAwLCAwKTsKKworICAgIC8qIGNyZWF0ZSBidWZmZXIgdG8gaG9sZCB0aGUgcGF5bG9hZCAqLworICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoNCwgMCwgMCk7CisKKyAgICBnc3RfcnRwX2J1ZmZlcl9tYXAgKG91dGJ1ZiwgR1NUX01BUF9XUklURSwgJnJ0cCk7CisKKyAgICBwYXlsb2FkX2xlbiAtPSA0OworCisgICAgZ3N0X3J0cF9idWZmZXJfc2V0X3BheWxvYWRfdHlwZSAoJnJ0cCwgR1NUX1JUUF9QQVlMT0FEX01QQSk7CisKKyAgICAvKgorICAgICAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICogfCAgICAgICAgICAgICBNQlogICAgICAgICAgICAgICB8ICAgICAgICAgIEZyYWdfb2Zmc2V0ICAgICAgICAgIHwKKyAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAqLworICAgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisgICAgcGF5bG9hZFswXSA9IDA7CisgICAgcGF5bG9hZFsxXSA9IDA7CisgICAgcGF5bG9hZFsyXSA9IGZyYWdfb2Zmc2V0ID4+IDg7CisgICAgcGF5bG9hZFszXSA9IGZyYWdfb2Zmc2V0ICYgMHhmZjsKKworICAgIGF2YWlsIC09IHBheWxvYWRfbGVuOworICAgIGZyYWdfb2Zmc2V0ICs9IHBheWxvYWRfbGVuOworCisgICAgaWYgKGF2YWlsID09IDApCisgICAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBUUlVFKTsKKworICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICAgIHBheWJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyX2Zhc3QgKHJ0cG1wYXBheS0+YWRhcHRlciwgcGF5bG9hZF9sZW4pOworICAgIGdzdF9ydHBfY29weV9hdWRpb19tZXRhIChydHBtcGFwYXksIG91dGJ1ZiwgcGF5YnVmKTsKKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAob3V0YnVmLCBwYXlidWYpOworCisgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSBydHBtcGFwYXktPmZpcnN0X3RzOworICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPSBydHBtcGFwYXktPmR1cmF0aW9uOworICAgIGdzdF9idWZmZXJfbGlzdF9hZGQgKGxpc3QsIG91dGJ1Zik7CisgIH0KKworICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoX2xpc3QgKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBtcGFwYXkpLCBsaXN0KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9tcGFfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSdHBNUEFQYXkgKnJ0cG1wYXBheTsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIGd1aW50IHNpemUsIGF2YWlsOworICBndWludCBwYWNrZXRfbGVuOworICBHc3RDbG9ja1RpbWUgZHVyYXRpb24sIHRpbWVzdGFtcDsKKworICBydHBtcGFwYXkgPSBHU1RfUlRQX01QQV9QQVkgKGJhc2VwYXlsb2FkKTsKKworICBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKTsKKyAgZHVyYXRpb24gPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpOworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKTsKKworICBpZiAoR1NUX0JVRkZFUl9JU19ESVNDT05UIChidWZmZXIpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXBhcGF5LCAiRElTQ09OVCIpOworICAgIGdzdF9ydHBfbXBhX3BheV9yZXNldCAocnRwbXBhcGF5KTsKKyAgfQorCisgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBtcGFwYXktPmFkYXB0ZXIpOworCisgIC8qIGdldCBwYWNrZXQgbGVuZ3RoIG9mIHByZXZpb3VzIGRhdGEgYW5kIHRoaXMgbmV3IGRhdGEsCisgICAqIHBheWxvYWQgbGVuZ3RoIGluY2x1ZGVzIGEgNCBieXRlIGhlYWRlciAqLworICBwYWNrZXRfbGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYWNrZXRfbGVuICg0ICsgYXZhaWwgKyBzaXplLCAwLCAwKTsKKworICAvKiBpZiB0aGlzIGJ1ZmZlciBpcyBnb2luZyB0byBvdmVyZmxvdyB0aGUgcGFja2V0LCBmbHVzaCB3aGF0IHdlCisgICAqIGhhdmUuICovCisgIGlmIChnc3RfcnRwX2Jhc2VfcGF5bG9hZF9pc19maWxsZWQgKGJhc2VwYXlsb2FkLAorICAgICAgICAgIHBhY2tldF9sZW4sIHJ0cG1wYXBheS0+ZHVyYXRpb24gKyBkdXJhdGlvbikpIHsKKyAgICByZXQgPSBnc3RfcnRwX21wYV9wYXlfZmx1c2ggKHJ0cG1wYXBheSk7CisgICAgYXZhaWwgPSAwOworICB9IGVsc2UgeworICAgIHJldCA9IEdTVF9GTE9XX09LOworICB9CisKKyAgaWYgKGF2YWlsID09IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcGFwYXksCisgICAgICAgICJmaXJzdCBwYWNrZXQsIHNhdmUgdGltZXN0YW1wICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSk7CisgICAgcnRwbXBhcGF5LT5maXJzdF90cyA9IHRpbWVzdGFtcDsKKyAgICBydHBtcGFwYXktPmR1cmF0aW9uID0gMDsKKyAgfQorCisgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cG1wYXBheS0+YWRhcHRlciwgYnVmZmVyKTsKKyAgcnRwbXBhcGF5LT5kdXJhdGlvbiA9IGR1cmF0aW9uOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9tcGFfcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cE1QQVBheSAqcnRwbXBhcGF5OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRwbXBhcGF5ID0gR1NUX1JUUF9NUEFfUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X3J0cF9tcGFfcGF5X3Jlc2V0IChydHBtcGFwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9ydHBfbXBhX3BheV9yZXNldCAocnRwbXBhcGF5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9tcGFfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwbXBhcGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX01QQV9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBtcGFwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwbXBhcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyOTg1MgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXBhcGF5LmgKQEAgLTAsMCArMSw2MyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX01QQV9QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9NUEFfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZXBheWxvYWQuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfTVBBX1BBWSBcCisgIChnc3RfcnRwX21wYV9wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9NUEFfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX01QQV9QQVksR3N0UnRwTVBBUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9NUEFfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUEFfUEFZLEdzdFJ0cE1QQVBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUEFfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX01QQV9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QQV9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX01QQV9QQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTVBBUGF5IEdzdFJ0cE1QQVBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBNUEFQYXlDbGFzcyBHc3RSdHBNUEFQYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBNUEFQYXkKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWQgcGF5bG9hZDsKKworICBHc3RBZGFwdGVyICphZGFwdGVyOworICBHc3RDbG9ja1RpbWUgZmlyc3RfdHM7CisgIEdzdENsb2NrVGltZSBkdXJhdGlvbjsKK307CisKK3N0cnVjdCBfR3N0UnRwTVBBUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX21wYV9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX21wYV9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfTVBBX1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDJkMmIwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBtcGFyb2J1c3RkZXBheS5jCkBAIC0wLDAgKzEsODExIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMTA+IE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSA8MjAxMD4gTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdzdHJ0cG1wYXJvYnVzdGRlcGF5LmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cG1wYXJvYnVzdGRlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBtcGFyb2J1c3RkZXBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL21wZWcsICIgIm1wZWd2ZXJzaW9uID0gKGludCkgMSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9zaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTVBBLVJPQlVTVFwiICIgIjsgIgorICAgICAgICAvKiBkcmFmdCB2ZXJzaW9ucyBhcHBlYXIgc3RpbGwgaW4gdXNlIG91dCB0aGVyZSAqLworICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgWzEsIE1BWF0sICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSB7IFwiWC1NUDMtRFJBRlQtMDBcIiwgXCJYLU1QMy1EUkFGVC0wMVwiLCAiCisgICAgICAgICIgXCJYLU1QMy1EUkFGVC0wMlwiLCBcIlgtTVAzLURSQUZULTAzXCIsIFwiWC1NUDMtRFJBRlQtMDRcIiwgIgorICAgICAgICAiIFwiWC1NUDMtRFJBRlQtMDVcIiwgXCJYLU1QMy1EUkFGVC0wNlwiIH0iKQorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBRFVGcmFtZQoreworICBndWludDMyIGhlYWRlcjsKKyAgZ2ludCBzaXplOworICBnaW50IHNpZGVfaW5mbzsKKyAgZ2ludCBkYXRhX3NpemU7CisgIGdpbnQgbGF5ZXI7CisgIGdpbnQgYmFja3BvaW50ZXI7CisKKyAgR3N0QnVmZmVyICpidWZmZXI7Cit9IEdzdEFEVUZyYW1lOworCisjZGVmaW5lIGdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBNUEFSb2J1c3REZXBheSwgZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5LAorICAgIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX21wYV9yb2J1c3RfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICoKKyAgICBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICoKKyAgICBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wYV9yb2J1c3RfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cE1QQVJvYnVzdERlcGF5ICpydHBtcGFkZXBheTsKKworICBydHBtcGFkZXBheSA9IChHc3RSdHBNUEFSb2J1c3REZXBheSAqKSBvYmplY3Q7CisKKyAgZ19vYmplY3RfdW5yZWYgKHJ0cG1wYWRlcGF5LT5hZGFwdGVyKTsKKyAgZ19xdWV1ZV9mcmVlIChydHBtcGFkZXBheS0+YWR1X2ZyYW1lcyk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cE1QQVJvYnVzdERlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwbXBhcm9idXN0ZGVwYXlfZGVidWcsICJydHBtcGFyb2J1c3RkZXBheSIsIDAsCisgICAgICAiUm9idXN0IE1QRUcgQXVkaW8gUlRQIERlcGF5bG9hZGVyIik7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9maW5hbGl6ZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfbXBhX3JvYnVzdF9jaGFuZ2Vfc3RhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX21wYV9yb2J1c3RfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgTVBFRyBhdWRpbyBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgTVBFRyBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgNTIxOSkiLAorICAgICAgIk1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPiIpOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9CisgICAgICBnc3RfcnRwX21wYV9yb2J1c3RfZGVwYXlfcHJvY2VzczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9pbml0IChHc3RSdHBNUEFSb2J1c3REZXBheSAqIHJ0cG1wYWRlcGF5KQoreworICBydHBtcGFkZXBheS0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKKyAgcnRwbXBhZGVwYXktPmFkdV9mcmFtZXMgPSBnX3F1ZXVlX25ldyAoKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX21wYV9yb2J1c3RfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UnRwTVBBUm9idXN0RGVwYXkgKnJ0cG1wYWRlcGF5OworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgR3N0Q2FwcyAqb3V0Y2FwczsKKyAgZ2ludCBjbG9ja19yYXRlLCBkcmFmdDsKKyAgZ2Jvb2xlYW4gcmVzOworICBjb25zdCBnY2hhciAqZW5jb2Rpbmc7CisKKyAgcnRwbXBhZGVwYXkgPSBHU1RfUlRQX01QQV9ST0JVU1RfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgY2xvY2tfcmF0ZSA9IDkwMDAwOworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIHJ0cG1wYWRlcGF5LT5oYXNfZGVzY3JpcHRvciA9IFRSVUU7CisgIGlmICgoZW5jb2RpbmcgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImVuY29kaW5nLW5hbWUiKSkpIHsKKyAgICBpZiAoc3NjYW5mIChlbmNvZGluZywgIlgtTVAzLURSQUZULSVkIiwgJmRyYWZ0KSAmJiAoZHJhZnQgPT0gMCkpCisgICAgICBydHBtcGFkZXBheS0+aGFzX2Rlc2NyaXB0b3IgPSBGQUxTRTsKKyAgfQorCisgIG91dGNhcHMgPQorICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL21wZWciLCAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoZGVwYXlsb2FkLT5zcmNwYWQsIG91dGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAob3V0Y2Fwcyk7CisKKyAgcmV0dXJuIHJlczsKK30KKworLyogdGhhbmtzIGFnYWluIGdvIHRvIG1wM3BhcnNlIC4uLiAqLworCitzdGF0aWMgY29uc3QgZ3VpbnQgbXAzdHlwZXNfYml0cmF0ZXNbMl1bM11bMTZdID0geworICB7CisgICAgICAgIHswLCAzMiwgNjQsIDk2LCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMjg4LCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCx9LAorICAgICAgICB7MCwgMzIsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLCAzODQsfSwKKyAgICAgICAgezAsIDMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAsfQorICAgICAgfSwKKyAgeworICAgICAgICB7MCwgMzIsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwLCAxNzYsIDE5MiwgMjI0LCAyNTYsfSwKKyAgICAgICAgezAsIDgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MCx9LAorICAgICAgICB7MCwgOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwLH0KKyAgICAgIH0sCit9OworCitzdGF0aWMgY29uc3QgZ3VpbnQgbXAzdHlwZXNfZnJlcXNbM11bM10gPSB7IHs0NDEwMCwgNDgwMDAsIDMyMDAwfSwKK3syMjA1MCwgMjQwMDAsIDE2MDAwfSwKK3sxMTAyNSwgMTIwMDAsIDgwMDB9Cit9OworCitzdGF0aWMgaW5saW5lIGd1aW50CittcDNfdHlwZV9mcmFtZV9sZW5ndGhfZnJvbV9oZWFkZXIgKEdzdEVsZW1lbnQgKiBtcDNwYXJzZSwgZ3VpbnQzMiBoZWFkZXIsCisgICAgZ3VpbnQgKiBwdXRfdmVyc2lvbiwgZ3VpbnQgKiBwdXRfbGF5ZXIsIGd1aW50ICogcHV0X2NoYW5uZWxzLAorICAgIGd1aW50ICogcHV0X2JpdHJhdGUsIGd1aW50ICogcHV0X3NhbXBsZXJhdGUsIGd1aW50ICogcHV0X21vZGUsCisgICAgZ3VpbnQgKiBwdXRfY3JjKQoreworICBndWludCBsZW5ndGg7CisgIGd1bG9uZyBtb2RlLCBzYW1wbGVyYXRlLCBiaXRyYXRlLCBsYXllciwgY2hhbm5lbHMsIHBhZGRpbmcsIGNyYzsKKyAgZ3Vsb25nIHZlcnNpb247CisgIGdpbnQgbHNmLCBtcGcyNTsKKworICBpZiAoaGVhZGVyICYgKDEgPDwgMjApKSB7CisgICAgbHNmID0gKGhlYWRlciAmICgxIDw8IDE5KSkgPyAwIDogMTsKKyAgICBtcGcyNSA9IDA7CisgIH0gZWxzZSB7CisgICAgbHNmID0gMTsKKyAgICBtcGcyNSA9IDE7CisgIH0KKworICB2ZXJzaW9uID0gMSArIGxzZiArIG1wZzI1OworCisgIGxheWVyID0gNCAtICgoaGVhZGVyID4+IDE3KSAmIDB4Myk7CisKKyAgY3JjID0gKGhlYWRlciA+PiAxNikgJiAweDE7CisKKyAgYml0cmF0ZSA9IChoZWFkZXIgPj4gMTIpICYgMHhGOworICBiaXRyYXRlID0gbXAzdHlwZXNfYml0cmF0ZXNbbHNmXVtsYXllciAtIDFdW2JpdHJhdGVdICogMTAwMDsKKyAgLyogVGhlIGNhbGxlciBoYXMgZW5zdXJlZCB3ZSBoYXZlIGEgdmFsaWQgaGVhZGVyLCBzbyBiaXRyYXRlIGNhbid0IGJlCisgICAgIHplcm8gaGVyZS4gKi8KKyAgaWYgKGJpdHJhdGUgPT0gMCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAiaW52YWxpZCBiaXRyYXRlIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzYW1wbGVyYXRlID0gKGhlYWRlciA+PiAxMCkgJiAweDM7CisgIHNhbXBsZXJhdGUgPSBtcDN0eXBlc19mcmVxc1tsc2YgKyBtcGcyNV1bc2FtcGxlcmF0ZV07CisKKyAgcGFkZGluZyA9IChoZWFkZXIgPj4gOSkgJiAweDE7CisKKyAgbW9kZSA9IChoZWFkZXIgPj4gNikgJiAweDM7CisgIGNoYW5uZWxzID0gKG1vZGUgPT0gMykgPyAxIDogMjsKKworICBzd2l0Y2ggKGxheWVyKSB7CisgICAgY2FzZSAxOgorICAgICAgbGVuZ3RoID0gNCAqICgoYml0cmF0ZSAqIDEyKSAvIHNhbXBsZXJhdGUgKyBwYWRkaW5nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGxlbmd0aCA9IChiaXRyYXRlICogMTQ0KSAvIHNhbXBsZXJhdGUgKyBwYWRkaW5nOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIDM6CisgICAgICBsZW5ndGggPSAoYml0cmF0ZSAqIDE0NCkgLyAoc2FtcGxlcmF0ZSA8PCBsc2YpICsgcGFkZGluZzsKKyAgICAgIGJyZWFrOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKG1wM3BhcnNlLCAiQ2FsY3VsYXRlZCBtcDMgZnJhbWUgbGVuZ3RoIG9mICV1IGJ5dGVzIiwgbGVuZ3RoKTsKKyAgR1NUX0xPR19PQkpFQ1QgKG1wM3BhcnNlLCAic2FtcGxlcmF0ZSA9ICVsdSwgYml0cmF0ZSA9ICVsdSwgdmVyc2lvbiA9ICVsdSwgIgorICAgICAgImxheWVyID0gJWx1LCBjaGFubmVscyA9ICVsdSwgbW9kZSA9ICVsdSIsIHNhbXBsZXJhdGUsIGJpdHJhdGUsIHZlcnNpb24sCisgICAgICBsYXllciwgY2hhbm5lbHMsIG1vZGUpOworCisgIGlmIChwdXRfdmVyc2lvbikKKyAgICAqcHV0X3ZlcnNpb24gPSB2ZXJzaW9uOworICBpZiAocHV0X2xheWVyKQorICAgICpwdXRfbGF5ZXIgPSBsYXllcjsKKyAgaWYgKHB1dF9jaGFubmVscykKKyAgICAqcHV0X2NoYW5uZWxzID0gY2hhbm5lbHM7CisgIGlmIChwdXRfYml0cmF0ZSkKKyAgICAqcHV0X2JpdHJhdGUgPSBiaXRyYXRlOworICBpZiAocHV0X3NhbXBsZXJhdGUpCisgICAgKnB1dF9zYW1wbGVyYXRlID0gc2FtcGxlcmF0ZTsKKyAgaWYgKHB1dF9tb2RlKQorICAgICpwdXRfbW9kZSA9IG1vZGU7CisgIGlmIChwdXRfY3JjKQorICAgICpwdXRfY3JjID0gY3JjOworCisgIEdTVF9MT0dfT0JKRUNUIChtcDNwYXJzZSwgInNpemUgPSAldSIsIGxlbmd0aCk7CisgIHJldHVybiBsZW5ndGg7Cit9CisKKy8qIGdlbmVyYXRlIGVtcHR5L3NpbGVudC9kdW1teSBmcmFtZSB0aGF0IG1pbWljcyBAZnJhbWUsCisgKiBleGNlcHQgZm9yIHJhdGUsIHdoZXJlIG1heGltdW0gcG9zc2libGUgaXMgc2VsZWN0ZWQgKi8KK3N0YXRpYyBHc3RBRFVGcmFtZSAqCitnc3RfcnRwX21wYV9yb2J1c3RfZGVwYXlfZ2VuZXJhdGVfZHVtbXlfZnJhbWUgKEdzdFJ0cE1QQVJvYnVzdERlcGF5ICoKKyAgICBydHBtcGFkZXBheSwgR3N0QURVRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0QURVRnJhbWUgKmR1bW15OworICBHc3RNYXBJbmZvIG1hcDsKKworICBkdW1teSA9IGdfc2xpY2VfZHVwIChHc3RBRFVGcmFtZSwgZnJhbWUpOworCisgIC8qIGdvIGZvciBtYXhpbXVtIGJpdHJhdGUgKi8KKyAgZHVtbXktPmhlYWRlciA9IChmcmFtZS0+aGVhZGVyICYgfigweGYgPDwgMTIpKSB8ICgweGUgPDwgMTIpOworICBkdW1teS0+c2l6ZSA9CisgICAgICBtcDNfdHlwZV9mcmFtZV9sZW5ndGhfZnJvbV9oZWFkZXIgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cG1wYWRlcGF5KSwKKyAgICAgIGR1bW15LT5oZWFkZXIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICBkdW1teS0+ZGF0YV9zaXplID0gZHVtbXktPnNpemUgLSA0IC0gZHVtbXktPnNpZGVfaW5mbzsKKyAgZHVtbXktPmJhY2twb2ludGVyID0gMDsKKworICBkdW1teS0+YnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChkdW1teS0+c2lkZV9pbmZvICsgNCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGR1bW15LT5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBtZW1zZXQgKG1hcC5kYXRhLCAwLCBtYXAuc2l6ZSk7CisgIEdTVF9XUklURV9VSU5UMzJfQkUgKG1hcC5kYXRhLCBkdW1teS0+aGVhZGVyKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoZHVtbXktPmJ1ZmZlciwgJm1hcCk7CisKKyAgR1NUX0JVRkZFUl9QVFMgKGR1bW15LT5idWZmZXIpID0gR1NUX0JVRkZFUl9QVFMgKGZyYW1lLT5idWZmZXIpOworCisgIHJldHVybiBkdW1teTsKK30KKworLyogdmFsaWRhdGVzIGFuZCBwYXJzZXMgQGJ1ZiwgYW5kIHF1ZXVlcyBmb3IgZnVydGhlciB0cmFuc2Zvcm1hdGlvbiBpZiB2YWxpZCwKKyAqIG90aGVyd2lzZSBkaXNjYXJkcyBAYnVmCisgKiBUYWtlcyBvd25lcnNoaXAgb2YgQGJ1Zi4gKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X3F1ZXVlX2ZyYW1lIChHc3RSdHBNUEFSb2J1c3REZXBheSAqIHJ0cG1wYWRlcGF5LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0QURVRnJhbWUgKmZyYW1lID0gTlVMTDsKKyAgZ3VpbnQgdmVyc2lvbiwgbGF5ZXIsIGNoYW5uZWxzLCBzaXplOworICBndWludCBjcmM7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChidWYgIT0gTlVMTCwgRkFMU0UpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgaWYgKG1hcC5zaXplIDwgNikKKyAgICBnb3RvIGNvcnJ1cHRfZnJhbWU7CisKKyAgZnJhbWUgPSBnX3NsaWNlX25ldzAgKEdzdEFEVUZyYW1lKTsKKyAgZnJhbWUtPmhlYWRlciA9IEdTVF9SRUFEX1VJTlQzMl9CRSAobWFwLmRhdGEpOworCisgIHNpemUgPSBtcDNfdHlwZV9mcmFtZV9sZW5ndGhfZnJvbV9oZWFkZXIgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cG1wYWRlcGF5KSwKKyAgICAgIGZyYW1lLT5oZWFkZXIsICZ2ZXJzaW9uLCAmbGF5ZXIsICZjaGFubmVscywgTlVMTCwgTlVMTCwgTlVMTCwgJmNyYyk7CisgIGlmICghc2l6ZSkKKyAgICBnb3RvIGNvcnJ1cHRfZnJhbWU7CisKKyAgZnJhbWUtPnNpemUgPSBzaXplOworICBmcmFtZS0+bGF5ZXIgPSBsYXllcjsKKyAgaWYgKHZlcnNpb24gPT0gMSAmJiBjaGFubmVscyA9PSAyKQorICAgIGZyYW1lLT5zaWRlX2luZm8gPSAzMjsKKyAgZWxzZSBpZiAoKHZlcnNpb24gPT0gMSAmJiBjaGFubmVscyA9PSAxKSB8fCAodmVyc2lvbiA+PSAyICYmIGNoYW5uZWxzID09IDIpKQorICAgIGZyYW1lLT5zaWRlX2luZm8gPSAxNzsKKyAgZWxzZSBpZiAodmVyc2lvbiA+PSAyICYmIGNoYW5uZWxzID09IDEpCisgICAgZnJhbWUtPnNpZGVfaW5mbyA9IDk7CisgIGVsc2UgeworICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgIGdvdG8gY29ycnVwdF9mcmFtZTsKKyAgfQorCisgIC8qIGJhY2twb2ludGVyICovCisgIGlmIChsYXllciA9PSAzKSB7CisgICAgZnJhbWUtPmJhY2twb2ludGVyID0gR1NUX1JFQURfVUlOVDE2X0JFIChtYXAuZGF0YSArIDQpOworICAgIGZyYW1lLT5iYWNrcG9pbnRlciA+Pj0gNzsKKyAgICBHU1RfTE9HX09CSkVDVCAocnRwbXBhZGVwYXksICJiYWNrcG9pbnRlcjogJWQiLCBmcmFtZS0+YmFja3BvaW50ZXIpOworICB9CisKKyAgaWYgKCFjcmMpCisgICAgZnJhbWUtPnNpZGVfaW5mbyArPSAyOworCisgIEdTVF9MT0dfT0JKRUNUIChydHBtcGFkZXBheSwgInNpZGUgaW5mbzogJWQiLCBmcmFtZS0+c2lkZV9pbmZvKTsKKyAgZnJhbWUtPmRhdGFfc2l6ZSA9IGZyYW1lLT5zaXplIC0gNCAtIGZyYW1lLT5zaWRlX2luZm87CisKKyAgLyogc29tZSBzaXplIHZhbGlkYXRpb24gY2hlY2tzICovCisgIGlmICg0ICsgZnJhbWUtPnNpZGVfaW5mbyA+IG1hcC5zaXplKQorICAgIGdvdG8gY29ycnVwdF9mcmFtZTsKKworICAvKiBBRFUgZGF0YSB3b3VsZCB0aGVuIGV4dGVuZCBwYXN0IE1QMyBmcmFtZSwKKyAgICogZXZlbiB1c2luZyBwYXN0IGJ5dGUgcmVzZXJ2b2lyICovCisgIGlmICgtZnJhbWUtPmJhY2twb2ludGVyICsgKGdpbnQpIChtYXAuc2l6ZSkgPiBmcmFtZS0+c2l6ZSkKKyAgICBnb3RvIGNvcnJ1cHRfZnJhbWU7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICAvKiBvaywgdGFrZSBidWZmZXIgYW5kIHF1ZXVlICovCisgIGZyYW1lLT5idWZmZXIgPSBidWY7CisgIGdfcXVldWVfcHVzaF90YWlsIChydHBtcGFkZXBheS0+YWR1X2ZyYW1lcywgZnJhbWUpOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworY29ycnVwdF9mcmFtZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cG1wYWRlcGF5LCAiZnJhbWUgaXMgY29ycnVwdCIpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICBpZiAoZnJhbWUpCisgICAgICBnX3NsaWNlX2ZyZWUgKEdzdEFEVUZyYW1lLCBmcmFtZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X2ZyZWVfZnJhbWUgKEdzdEFEVUZyYW1lICogZnJhbWUpCit7CisgIGlmIChmcmFtZS0+YnVmZmVyKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKGZyYW1lLT5idWZmZXIpOworICBnX3NsaWNlX2ZyZWUgKEdzdEFEVUZyYW1lLCBmcmFtZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X2RlcXVldWVfZnJhbWUgKEdzdFJ0cE1QQVJvYnVzdERlcGF5ICogcnRwbXBhZGVwYXkpCit7CisgIEdzdEFEVUZyYW1lICpoZWFkOworCisgIEdTVF9MT0dfT0JKRUNUIChydHBtcGFkZXBheSwgImRlcXVldWVpbmcgQURVIGZyYW1lIik7CisKKyAgaWYgKHJ0cG1wYWRlcGF5LT5hZHVfZnJhbWVzLT5oZWFkID09IHJ0cG1wYWRlcGF5LT5jdXJfYWR1X2ZyYW1lKQorICAgIHJ0cG1wYWRlcGF5LT5jdXJfYWR1X2ZyYW1lID0gTlVMTDsKKworICBoZWFkID0gZ19xdWV1ZV9wb3BfaGVhZCAocnRwbXBhZGVwYXktPmFkdV9mcmFtZXMpOworICBnX2Fzc2VydCAoaGVhZC0+YnVmZmVyKTsKKyAgZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X2ZyZWVfZnJhbWUgKGhlYWQpOworCisgIHJldHVybjsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIGF0IGxlYXN0IG9uZSBuZXcgQURVIGZyYW1lIHdhcyBlbnF1ZXVlZCBmb3IgTVAzIGNvbnZlcnNpb24uCisgKiBUYWtlcyBvd25lcnNoaXAgb2YgQGJ1Zi4gKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X2RlaW50ZXJsZWF2ZSAoR3N0UnRwTVBBUm9idXN0RGVwYXkgKiBydHBtcGFkZXBheSwKKyAgICBHc3RCdWZmZXIgKiBidWYpCit7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQgdmFsLCBpaW5kZXgsIGljYzsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICB2YWwgPSBHU1RfUkVBRF9VSU5UMTZfQkUgKG1hcC5kYXRhKSA+PiA1OworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIGlpbmRleCA9IHZhbCA+PiAzOworICBpY2MgPSB2YWwgJiAweDc7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHJ0cG1wYWRlcGF5LCAic3luYzogMHgleCwgaW5kZXg6ICV1LCBjeWNsZSBjb3VudDogJXUiLAorICAgICAgdmFsLCBpaW5kZXgsIGljYyk7CisKKyAgLyogYmFzaWMgY2FzZTsgbm8gaW50ZXJsZWF2aW5nIGV2ZXIgc2VlbiAqLworICBpZiAodmFsID09IDB4N2ZmICYmIHJ0cG1wYWRlcGF5LT5sYXN0X2ljYyA8IDApIHsKKyAgICByZXQgPSBnc3RfcnRwX21wYV9yb2J1c3RfZGVwYXlfcXVldWVfZnJhbWUgKHJ0cG1wYWRlcGF5LCBidWYpOworICB9IGVsc2UgeworICAgIGlmIChHX1VOTElLRUxZIChydHBtcGFkZXBheS0+bGFzdF9pY2MgPCAwKSkgeworICAgICAgcnRwbXBhZGVwYXktPmxhc3RfaWNjID0gaWNjOworICAgICAgcnRwbXBhZGVwYXktPmxhc3RfaWkgPSBpaW5kZXg7CisgICAgfQorICAgIGlmIChpY2MgIT0gcnRwbXBhZGVwYXktPmxhc3RfaWNjIHx8IGlpbmRleCA9PSBydHBtcGFkZXBheS0+bGFzdF9paSkgeworICAgICAgZ2ludCBpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgICAgaWYgKHJ0cG1wYWRlcGF5LT5kZWludGVyW2ldICE9IE5VTEwpIHsKKyAgICAgICAgICByZXQgfD0gZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X3F1ZXVlX2ZyYW1lIChydHBtcGFkZXBheSwKKyAgICAgICAgICAgICAgcnRwbXBhZGVwYXktPmRlaW50ZXJbaV0pOworICAgICAgICAgIHJ0cG1wYWRlcGF5LT5kZWludGVyW2ldID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvKiByZXdyaXRlIGJ1ZmZlciBzeW5jIGhlYWRlciAqLworICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgICB2YWwgPSBHU1RfUkVBRF9VSU5UMTZfQkUgKG1hcC5kYXRhKTsKKyAgICB2YWwgPSAoMHg3ZmYgPDwgNSkgfCB2YWw7CisgICAgR1NUX1dSSVRFX1VJTlQxNl9CRSAobWFwLmRhdGEsIHZhbCk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICAvKiBzdG9yZSBhbmQga2VlcCB0cmFjayBvZiBsYXN0IGluZGljZXMgKi8KKyAgICBydHBtcGFkZXBheS0+bGFzdF9pY2MgPSBpY2M7CisgICAgcnRwbXBhZGVwYXktPmxhc3RfaWkgPSBpaW5kZXg7CisgICAgcnRwbXBhZGVwYXktPmRlaW50ZXJbaWluZGV4XSA9IGJ1ZjsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qIEhlYWQgQURVIGZyYW1lIGNvcnJlc3BvbmRzIHRvIG1wM19mcmFtZSAoaS5lLiBpbiBoZWFkZXIgaW4gc2lkZS1pbmZvKSB0aGF0CisgKiBpcyBjdXJyZW50bHkgYmVpbmcgd3JpdHRlbgorICogY3VyX2FkdV9mcmFtZSByZWZlcnMgdG8gQURVIGZyYW1lIHdob3NlIGRhdGEgc2hvdWxkIGJlIGJ5dGV3cml0dGVuIG5leHQKKyAqIChwb3NzaWJseSBzdGFydGluZyBmcm9tIG9mZnNldCByYXRoZXIgdGhhbiBzdGFydCAwKSAoYW5kIGlzIHR5cGljYWxsIHRhaWwKKyAqIGF0IHRpbWUgb2YgbGFzdCBwdXNoIHJvdW5kKS4KKyAqIElmIGF0IHN0YXJ0LCBwb3NpdGlvbiB3aGVyZSBpdCBzaG91bGQgc3RhcnQgd3JpdGluZyBkZXBlbmRzIG9uIChkYXRhKSBzaXplcworICogb2YgcHJldmlvdXMgbXAzIGZyYW1lcyAoY29ycmVzcG9uZGluZyB0byBmb3JlZ29pbmcgQURVIGZyYW1lcykga2VwdCBpbiBzaXplLAorICogYW5kIGl0cyBiYWNrcG9pbnRlciAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9wdXNoX21wM19mcmFtZXMgKEdzdFJ0cE1QQVJvYnVzdERlcGF5ICogcnRwbXBhZGVwYXkpCit7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RBRFVGcmFtZSAqZnJhbWUsICpoZWFkOworICBnaW50IGF2OworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworCisgIHdoaWxlICgxKSB7CisgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICBpZiAoR19VTkxJS0VMWSAoIXJ0cG1wYWRlcGF5LT5jdXJfYWR1X2ZyYW1lKSkgeworICAgICAgcnRwbXBhZGVwYXktPmN1cl9hZHVfZnJhbWUgPSBydHBtcGFkZXBheS0+YWR1X2ZyYW1lcy0+aGVhZDsKKyAgICAgIHJ0cG1wYWRlcGF5LT5vZmZzZXQgPSAwOworICAgICAgcnRwbXBhZGVwYXktPnNpemUgPSAwOworICAgIH0KKworICAgIGlmIChHX1VOTElLRUxZICghcnRwbXBhZGVwYXktPmN1cl9hZHVfZnJhbWUpKQorICAgICAgYnJlYWs7CisKKyAgICBmcmFtZSA9IChHc3RBRFVGcmFtZSAqKSBydHBtcGFkZXBheS0+Y3VyX2FkdV9mcmFtZS0+ZGF0YTsKKyAgICBoZWFkID0gKEdzdEFEVUZyYW1lICopIHJ0cG1wYWRlcGF5LT5hZHVfZnJhbWVzLT5oZWFkLT5kYXRhOworCisgICAgLyogc3BlY2lhbCBjYXNlOiBub24tbGF5ZXIgSUlJIGFyZSBzZW50IHN0cmFpZ2h0IHRocm91Z2ggKi8KKyAgICBpZiAoR19VTkxJS0VMWSAoZnJhbWUtPmxheWVyICE9IDMpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcGFkZXBheSwgImxheWVyICVkIGZyYW1lLCBzZW5kaW5nIGFzLWlzIiwKKyAgICAgICAgICBmcmFtZS0+bGF5ZXIpOworICAgICAgZ3N0X3J0cF9iYXNlX2RlcGF5bG9hZF9wdXNoIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEIChydHBtcGFkZXBheSksCisgICAgICAgICAgZnJhbWUtPmJ1ZmZlcik7CisgICAgICBmcmFtZS0+YnVmZmVyID0gTlVMTDsKKyAgICAgIC8qIGFuZCByZW1vdmUgaXQgZnJvbSBhbnkgZnVydGhlciBjb25zaWRlcmF0aW9uICovCisgICAgICBnX3NsaWNlX2ZyZWUgKEdzdEFEVUZyYW1lLCBmcmFtZSk7CisgICAgICBnX3F1ZXVlX2RlbGV0ZV9saW5rIChydHBtcGFkZXBheS0+YWR1X2ZyYW1lcywgcnRwbXBhZGVwYXktPmN1cl9hZHVfZnJhbWUpOworICAgICAgcnRwbXBhZGVwYXktPmN1cl9hZHVfZnJhbWUgPSBOVUxMOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKHJ0cG1wYWRlcGF5LT5vZmZzZXQgPT0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZnJhbWUtPmJ1ZmZlcikpIHsKKyAgICAgIGlmIChnX2xpc3RfbmV4dCAocnRwbXBhZGVwYXktPmN1cl9hZHVfZnJhbWUpKSB7CisgICAgICAgIHJ0cG1wYWRlcGF5LT5zaXplICs9IGZyYW1lLT5kYXRhX3NpemU7CisgICAgICAgIHJ0cG1wYWRlcGF5LT5jdXJfYWR1X2ZyYW1lID0gZ19saXN0X25leHQgKHJ0cG1wYWRlcGF5LT5jdXJfYWR1X2ZyYW1lKTsKKyAgICAgICAgZnJhbWUgPSAoR3N0QURVRnJhbWUgKikgcnRwbXBhZGVwYXktPmN1cl9hZHVfZnJhbWUtPmRhdGE7CisgICAgICAgIHJ0cG1wYWRlcGF5LT5vZmZzZXQgPSAwOworICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwbXBhZGVwYXksCisgICAgICAgICAgICAibW92aW5nIHRvIG5leHQgQURVIGZyYW1lLCBzaXplICVkLCBzaWRlX2luZm8gJWQsIGJhY2twb2ludGVyICVkIiwKKyAgICAgICAgICAgIGZyYW1lLT5zaXplLCBmcmFtZS0+c2lkZV9pbmZvLCBmcmFtZS0+YmFja3BvaW50ZXIpOworICAgICAgICAvKiBsYXllciBJIGFuZCBJSSBwYWNrZXRzIGhhdmUgbm8gYml0cmVzZXJ2b2lyIGFuZCBtdXN0IGJlIHNlbnQgYXMtaXM7CisgICAgICAgICAqIHNvIGZsdXNoIGFueSBwZW5kaW5nIGZyYW1lICovCisgICAgICAgIGlmIChHX1VOTElLRUxZIChmcmFtZS0+bGF5ZXIgIT0gMyAmJiBydHBtcGFkZXBheS0+bXAzX2ZyYW1lKSkKKyAgICAgICAgICBnb3RvIGZsdXNoOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKEdfVU5MSUtFTFkgKCFydHBtcGFkZXBheS0+bXAzX2ZyYW1lKSkgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cG1wYWRlcGF5LAorICAgICAgICAgICJzZXR0aW5nIHVwIG5ldyBNUDMgZnJhbWUgb2Ygc2l6ZSAlZCwgc2lkZV9pbmZvICVkIiwKKyAgICAgICAgICBoZWFkLT5zaXplLCBoZWFkLT5zaWRlX2luZm8pOworICAgICAgcnRwbXBhZGVwYXktPm1wM19mcmFtZSA9IGdzdF9ieXRlX3dyaXRlcl9uZXdfd2l0aF9zaXplIChoZWFkLT5zaXplLCBUUlVFKTsKKyAgICAgIC8qIDAtZmlsbCBwb3NzaWJsZSBnYXBzICovCisgICAgICBnc3RfYnl0ZV93cml0ZXJfZmlsbF91bmNoZWNrZWQgKHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUsIDAsIGhlYWQtPnNpemUpOworICAgICAgZ3N0X2J5dGVfd3JpdGVyX3NldF9wb3MgKHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUsIDApOworICAgICAgLyogYnl0ZXdyaXRlciBjb3JyZXNwb25kcyB0byBoZWFkIGZyYW1lLAorICAgICAgICogaS5lLiB0aGUgaGVhZGVyIGFuZCB0aGUgc2lkZSBpbmZvIG11c3QgbWF0Y2ggKi8KKyAgICAgIGdfYXNzZXJ0ICg0ICsgaGVhZC0+c2lkZV9pbmZvIDw9IGhlYWQtPnNpemUpOworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGhlYWQtPmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfZGF0YV91bmNoZWNrZWQgKHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUsCisgICAgICAgICAgbWFwLmRhdGEsIDQgKyBoZWFkLT5zaWRlX2luZm8pOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoaGVhZC0+YnVmZmVyLCAmbWFwKTsKKyAgICB9CisKKyAgICBidWYgPSBmcmFtZS0+YnVmZmVyOworICAgIGF2ID0gZ3N0X2J5dGVfd3JpdGVyX2dldF9yZW1haW5pbmcgKHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUpOworICAgIEdTVF9MT0dfT0JKRUNUIChydHBtcGFkZXBheSwgImN1cnJlbnQgbXAzIGZyYW1lIHJlbWFpbmluZzogJWQiLCBhdik7CisgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cG1wYWRlcGF5LCAiYWNjdW11bGF0ZWQgQURVIGZyYW1lIGRhdGFfc2l6ZTogJWQiLAorICAgICAgICBydHBtcGFkZXBheS0+c2l6ZSk7CisKKyAgICBpZiAocnRwbXBhZGVwYXktPm9mZnNldCkgeworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgIC8qIG5vIG5lZWQgdG8gcG9zaXRpb24sIHNpbXBseSBhcHBlbmQgKi8KKyAgICAgIGdfYXNzZXJ0IChtYXAuc2l6ZSA+IHJ0cG1wYWRlcGF5LT5vZmZzZXQpOworICAgICAgYXYgPSBNSU4gKGF2LCBtYXAuc2l6ZSAtIHJ0cG1wYWRlcGF5LT5vZmZzZXQpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cG1wYWRlcGF5LAorICAgICAgICAgICJhcHBlbmRpbmcgJWQgYnl0ZXMgZnJvbSBBRFUgZnJhbWUgYXQgb2Zmc2V0ICVkIiwgYXYsCisgICAgICAgICAgcnRwbXBhZGVwYXktPm9mZnNldCk7CisgICAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X2RhdGFfdW5jaGVja2VkIChydHBtcGFkZXBheS0+bXAzX2ZyYW1lLAorICAgICAgICAgIG1hcC5kYXRhICsgcnRwbXBhZGVwYXktPm9mZnNldCwgYXYpOworICAgICAgcnRwbXBhZGVwYXktPm9mZnNldCArPSBhdjsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdpbnQgcG9zLCB0cG9zOworCisgICAgICAvKiBwb3NpdGlvbiB3cml0aW5nIGFjY29yZGluZyB0byBBRFUgZnJhbWUgYmFja3BvaW50ZXIgKi8KKyAgICAgIHBvcyA9IGdzdF9ieXRlX3dyaXRlcl9nZXRfcG9zIChydHBtcGFkZXBheS0+bXAzX2ZyYW1lKTsKKyAgICAgIHRwb3MgPSBydHBtcGFkZXBheS0+c2l6ZSAtIGZyYW1lLT5iYWNrcG9pbnRlciArIDQgKyBoZWFkLT5zaWRlX2luZm87CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwbXBhZGVwYXksICJjdXJyZW50IE1QMyBmcmFtZSBhdCBwb3NpdGlvbiAlZCwgIgorICAgICAgICAgICJzdGFydGluZyBuZXcgQURVIGZyYW1lIGRhdGEgYXQgb2Zmc2V0ICVkIiwgcG9zLCB0cG9zKTsKKyAgICAgIGlmICh0cG9zIDwgcG9zKSB7CisgICAgICAgIEdzdEFEVUZyYW1lICpkdW1teTsKKworICAgICAgICAvKiB0cnkgdG8gaW5zZXJ0IGFzIGZldyBmcmFtZXMgYXMgcG9zc2libGUsCisgICAgICAgICAqIHNvIGdvIGZvciBhIHJlYXNvbmFibHkgbGFyZ2UgZHVtbXkgZnJhbWUgc2l6ZSAqLworICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwbXBhZGVwYXksCisgICAgICAgICAgICAib3ZlcmxhcHBpbmcgcHJldmlvdXMgZGF0YTsgaW5zZXJ0aW5nIGR1bW15IGZyYW1lIik7CisgICAgICAgIGR1bW15ID0KKyAgICAgICAgICAgIGdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9nZW5lcmF0ZV9kdW1teV9mcmFtZSAocnRwbXBhZGVwYXksIGZyYW1lKTsKKyAgICAgICAgZ19xdWV1ZV9pbnNlcnRfYmVmb3JlIChydHBtcGFkZXBheS0+YWR1X2ZyYW1lcywKKyAgICAgICAgICAgIHJ0cG1wYWRlcGF5LT5jdXJfYWR1X2ZyYW1lLCBkdW1teSk7CisgICAgICAgIC8qIG9mZnNldCBpcyBrbm93biB0byBiZSB6ZXJvLCBzbyB3ZSBjYW4gc2hpZnQgY3VycmVudCBvbmUgKi8KKyAgICAgICAgcnRwbXBhZGVwYXktPmN1cl9hZHVfZnJhbWUgPSBydHBtcGFkZXBheS0+Y3VyX2FkdV9mcmFtZS0+cHJldjsKKyAgICAgICAgaWYgKCFydHBtcGFkZXBheS0+c2l6ZSkgeworICAgICAgICAgIGdfYXNzZXJ0IChydHBtcGFkZXBheS0+Y3VyX2FkdV9mcmFtZSA9PQorICAgICAgICAgICAgICBydHBtcGFkZXBheS0+YWR1X2ZyYW1lcy0+aGVhZCk7CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cG1wYWRlcGF5LCAiLi4uIHdoaWNoIGlzIG5ldyBoZWFkIGZyYW1lIik7CisgICAgICAgICAgZ3N0X2J5dGVfd3JpdGVyX2ZyZWUgKHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUpOworICAgICAgICAgIHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIC8qIC4uLiBhbmQgY29udGludWUgYWRkaW5nIHRoYXQgZW1wdHkgb25lIGltbWVkaWF0ZWx5LAorICAgICAgICAgKiBhbmQgdGhlbiBzZWUgaWYgdGhhdCBwcm92aWRlZCBlbm91Z2ggZXh0cmEgc3BhY2UgKi8KKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgaWYgKHRwb3MgPj0gcG9zICsgYXYpIHsKKyAgICAgICAgLyogQURVIGZyYW1lIG5vIGxvbmdlciBuZWVkcyBjdXJyZW50IE1QMyBmcmFtZTsgbW92ZSB0byBpdHMgZW5kICovCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBtcGFkZXBheSwgInBhc3NlZCBjdXJyZW50IE1QMyBmcmFtZSIpOworICAgICAgICBnc3RfYnl0ZV93cml0ZXJfc2V0X3BvcyAocnRwbXBhZGVwYXktPm1wM19mcmFtZSwgcG9zICsgYXYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogcG9zaXRpb24gYW5kIGFwcGVuZCAqLworICAgICAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwbXBhZGVwYXksICJhZGRpbmcgdG8gY3VycmVudCBNUDMgZnJhbWUiKTsKKyAgICAgICAgZ3N0X2J5dGVfd3JpdGVyX3NldF9wb3MgKHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUsIHRwb3MpOworICAgICAgICBhdiAtPSAodHBvcyAtIHBvcyk7CisgICAgICAgIGdfYXNzZXJ0IChtYXAuc2l6ZSA+PSA0ICsgZnJhbWUtPnNpZGVfaW5mbyk7CisgICAgICAgIGF2ID0gTUlOIChhdiwgbWFwLnNpemUgLSA0IC0gZnJhbWUtPnNpZGVfaW5mbyk7CisgICAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfZGF0YV91bmNoZWNrZWQgKHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUsCisgICAgICAgICAgICBtYXAuZGF0YSArIDQgKyBmcmFtZS0+c2lkZV9pbmZvLCBhdik7CisgICAgICAgIHJ0cG1wYWRlcGF5LT5vZmZzZXQgKz0gYXYgKyA0ICsgZnJhbWUtPnNpZGVfaW5mbzsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBtcDMgZnJhbWUgZmlsbGVkLCBzZW5kIG9uIGl0cyB3YXkgKi8KKyAgICBpZiAoZ3N0X2J5dGVfd3JpdGVyX2dldF9yZW1haW5pbmcgKHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUpID09IDApIHsKKyAgICBmbHVzaDoKKyAgICAgIGJ1ZiA9IGdzdF9ieXRlX3dyaXRlcl9mcmVlX2FuZF9nZXRfYnVmZmVyIChydHBtcGFkZXBheS0+bXAzX2ZyYW1lKTsKKyAgICAgIHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUgPSBOVUxMOworICAgICAgR1NUX0JVRkZFUl9QVFMgKGJ1ZikgPSBHU1RfQlVGRkVSX1BUUyAoaGVhZC0+YnVmZmVyKTsKKyAgICAgIC8qIG5vIGxvbmdlciBuZWVkIGhlYWQgQURVIGZyYW1lIGhlYWRlciBhbmQgc2lkZSBpbmZvICovCisgICAgICAvKiBOT1RFIG1heWJlIGhlYWQgPT0gY3VycmVudCwgdGhlbiBzaXplIGFuZCBvZmZzZXQgZ28gb2ZmIGEgYml0LAorICAgICAgICogYnV0IGN1cnJlbnQgZ2V0cyByZXNldCB0byBOVUxMLCBhbmQgdGhlbiBhbHNvIG9mZnNldCBhbmQgc2l6ZSAqLworICAgICAgcnRwbXBhZGVwYXktPnNpemUgLT0gaGVhZC0+ZGF0YV9zaXplOworICAgICAgZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X2RlcXVldWVfZnJhbWUgKHJ0cG1wYWRlcGF5KTsKKyAgICAgIC8qIHNlbmQgKi8KKyAgICAgIHJldCA9IGdzdF9ydHBfYmFzZV9kZXBheWxvYWRfcHVzaCAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRCAocnRwbXBhZGVwYXkpLAorICAgICAgICAgIGJ1Zik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogcHJvY2VzcyBBRFUgZnJhbWUgQGJ1ZiB0aHJvdWdoOgorICogLSBkZWludGVybGVhdmluZworICogLSBjb252ZXJ0aW5nIHRvIE1QMyBmcmFtZXMKKyAqIFRha2VzIG93bmVyc2hpcCBvZiBAYnVmLgorICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X3N1Ym1pdF9hZHUgKEdzdFJ0cE1QQVJvYnVzdERlcGF5ICogcnRwbXBhZGVwYXksCisgICAgR3N0QnVmZmVyICogYnVmKQoreworICBpZiAoZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X2RlaW50ZXJsZWF2ZSAocnRwbXBhZGVwYXksIGJ1ZikpCisgICAgcmV0dXJuIGdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9wdXNoX21wM19mcmFtZXMgKHJ0cG1wYWRlcGF5KTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RSdHBNUEFSb2J1c3REZXBheSAqcnRwbXBhZGVwYXk7CisgIGdpbnQgcGF5bG9hZF9sZW4sIG9mZnNldDsKKyAgZ3VpbnQ4ICpwYXlsb2FkOworICBnYm9vbGVhbiBjb250LCBkdHlwZTsKKyAgZ3VpbnQgYXYsIHNpemU7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisgIEdzdEJ1ZmZlciAqYnVmOworCisgIHJ0cG1wYWRlcGF5ID0gR1NUX1JUUF9NUEFfUk9CVVNUX0RFUEFZIChkZXBheWxvYWQpOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChydHAtPmJ1ZmZlcik7CisKKyAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisgIGlmIChwYXlsb2FkX2xlbiA8PSAxKQorICAgIGdvdG8gc2hvcnRfcmVhZDsKKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisgIG9mZnNldCA9IDA7CisgIEdTVF9MT0dfT0JKRUNUIChydHBtcGFkZXBheSwgInBheWxvYWRfbGVuOiAlZCIsIHBheWxvYWRfbGVuKTsKKworICAvKiBzdHJpcCBvZmYgZGVzY3JpcHRvcgorICAgKgorICAgKiAgMCAgICAgICAgICAgICAgICAgICAxCisgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfEN8VHwgICAgICAgICAgICBBRFUgc2l6ZSAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICoKKyAgICogQzogaWYgMSwgZGF0YSBpcyBjb250aW51YXRpb24KKyAgICogVDogaWYgMSwgc2l6ZSBpcyAxNCBiaXRzLCBvdGhlcndpc2UgNiBiaXRzCisgICAqIEFEVSBzaXplOiBzaXplIG9mIGZvbGxvd2luZyBwYWNrZXQgKG5vdCBpbmNsdWRpbmcgZGVzY3JpcHRvcikKKyAgICovCisgIHdoaWxlIChwYXlsb2FkX2xlbikgeworICAgIGlmIChHX0xJS0VMWSAocnRwbXBhZGVwYXktPmhhc19kZXNjcmlwdG9yKSkgeworICAgICAgY29udCA9ICEgIShwYXlsb2FkW29mZnNldF0gJiAweDgwKTsKKyAgICAgIGR0eXBlID0gISAhKHBheWxvYWRbb2Zmc2V0XSAmIDB4NDApOworICAgICAgaWYgKGR0eXBlKSB7CisgICAgICAgIHNpemUgPSAocGF5bG9hZFtvZmZzZXRdICYgMHgzZikgPDwgOCB8IHBheWxvYWRbb2Zmc2V0ICsgMV07CisgICAgICAgIHBheWxvYWRfbGVuLS07CisgICAgICAgIG9mZnNldCsrOworICAgICAgfSBlbHNlIGlmIChwYXlsb2FkX2xlbiA+PSAyKSB7CisgICAgICAgIHNpemUgPSAocGF5bG9hZFtvZmZzZXRdICYgMHgzZik7CisgICAgICAgIHBheWxvYWRfbGVuIC09IDI7CisgICAgICAgIG9mZnNldCArPSAyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ290byBzaG9ydF9yZWFkOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBjb250ID0gRkFMU0U7CisgICAgICBkdHlwZSA9IC0xOworICAgICAgc2l6ZSA9IHBheWxvYWRfbGVuOworICAgIH0KKworICAgIEdTVF9MT0dfT0JKRUNUIChydHBtcGFkZXBheSwgIm9mZnNldCAlZCBoYXMgY29udDogJWQsIGR0eXBlOiAlZCwgc2l6ZTogJWQiLAorICAgICAgICBvZmZzZXQsIGNvbnQsIGR0eXBlLCBzaXplKTsKKworICAgIGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3N1YmJ1ZmZlciAocnRwLCBvZmZzZXQsCisgICAgICAgIE1JTiAoc2l6ZSwgcGF5bG9hZF9sZW4pKTsKKworICAgIGlmIChjb250KSB7CisgICAgICBhdiA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwbXBhZGVwYXktPmFkYXB0ZXIpOworICAgICAgaWYgKEdfVU5MSUtFTFkgKCFhdikpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXBhZGVwYXksCisgICAgICAgICAgICAiZGlzY2FyZGluZyBjb250aW51YXRpb24gZnJhZ21lbnQgd2l0aG91dCBwcmlvciBmcmFnbWVudCIpOworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXYgKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKyAgICAgICAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRwbXBhZGVwYXktPmFkYXB0ZXIsIGJ1Zik7CisgICAgICAgIGlmIChhdiA9PSBzaXplKSB7CisgICAgICAgICAgdGltZXN0YW1wID0gZ3N0X2FkYXB0ZXJfcHJldl9wdHMgKHJ0cG1wYWRlcGF5LT5hZGFwdGVyLCBOVUxMKTsKKyAgICAgICAgICBidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRwbXBhZGVwYXktPmFkYXB0ZXIsIHNpemUpOworICAgICAgICAgIEdTVF9CVUZGRVJfUFRTIChidWYpID0gdGltZXN0YW1wOworICAgICAgICAgIGdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9zdWJtaXRfYWR1IChydHBtcGFkZXBheSwgYnVmKTsKKyAgICAgICAgfSBlbHNlIGlmIChhdiA+IHNpemUpIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcGFkZXBheSwKKyAgICAgICAgICAgICAgImFzc2VtYmxlZCBBRFUgc2l6ZSAlZCBsYXJnZXIgdGhhbiBleHBlY3RlZCAlZDsgZGlzY2FyZGluZyIsCisgICAgICAgICAgICAgIGF2LCBzaXplKTsKKyAgICAgICAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRwbXBhZGVwYXktPmFkYXB0ZXIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBzaXplID0gcGF5bG9hZF9sZW47CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIG5vdCBjb250aW51YXRpb24sIGZpcnN0IGZyYWdtZW50IG9yIHdob2xlIEFEVSAqLworICAgICAgaWYgKHBheWxvYWRfbGVuID09IHNpemUpIHsKKyAgICAgICAgLyogd2hvbGUgQURVICovCisgICAgICAgIEdTVF9CVUZGRVJfUFRTIChidWYpID0gdGltZXN0YW1wOworICAgICAgICBnc3RfcnRwX21wYV9yb2J1c3RfZGVwYXlfc3VibWl0X2FkdSAocnRwbXBhZGVwYXksIGJ1Zik7CisgICAgICB9IGVsc2UgaWYgKHBheWxvYWRfbGVuIDwgc2l6ZSkgeworICAgICAgICAvKiBmaXJzdCBmcmFnbWVudCAqLworICAgICAgICBnc3RfYWRhcHRlcl9wdXNoIChydHBtcGFkZXBheS0+YWRhcHRlciwgYnVmKTsKKyAgICAgICAgc2l6ZSA9IHBheWxvYWRfbGVuOworICAgICAgfQorICAgIH0KKworICAgIG9mZnNldCArPSBzaXplOworICAgIHBheWxvYWRfbGVuIC09IHNpemU7CisKKyAgICAvKiB0aW1lc3RhbXAgYXBwbGllcyB0byBmaXJzdCBwYXlsb2FkLCBubyBpZGVhIGZvciBzdWJzZXF1ZW50IG9uZXMgKi8KKyAgICB0aW1lc3RhbXAgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICB9CisKKyAgcmV0dXJuIE5VTEw7CisKKyAgLyogRVJST1JTICovCitzaG9ydF9yZWFkOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwbXBhZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiUGFja2V0IGNvbnRhaW5zIGludmFsaWQgZGF0YSIpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfbXBhX3JvYnVzdF9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0UnRwTVBBUm9idXN0RGVwYXkgKnJ0cG1wYWRlcGF5OworCisgIHJ0cG1wYWRlcGF5ID0gR1NUX1JUUF9NUEFfUk9CVVNUX0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgcnRwbXBhZGVwYXktPmxhc3RfaWkgPSAtMTsKKyAgICAgIHJ0cG1wYWRlcGF5LT5sYXN0X2ljYyA9IC0xOworICAgICAgcnRwbXBhZGVwYXktPnNpemUgPSAwOworICAgICAgcnRwbXBhZGVwYXktPm9mZnNldCA9IDA7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisgIGlmIChyZXQgIT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKQorICAgIHJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICB7CisgICAgICBnaW50IGk7CisKKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChydHBtcGFkZXBheS0+YWRhcHRlcik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTIChydHBtcGFkZXBheS0+ZGVpbnRlcik7IGkrKykgeworICAgICAgICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZydHBtcGFkZXBheS0+ZGVpbnRlcltpXSwgTlVMTCk7CisgICAgICB9CisgICAgICBydHBtcGFkZXBheS0+Y3VyX2FkdV9mcmFtZSA9IE5VTEw7CisgICAgICBnX3F1ZXVlX2ZvcmVhY2ggKHJ0cG1wYWRlcGF5LT5hZHVfZnJhbWVzLAorICAgICAgICAgIChHRnVuYykgZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X2ZyZWVfZnJhbWUsIE5VTEwpOworICAgICAgZ19xdWV1ZV9jbGVhciAocnRwbXBhZGVwYXktPmFkdV9mcmFtZXMpOworICAgICAgaWYgKHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUpCisgICAgICAgIGdzdF9ieXRlX3dyaXRlcl9mcmVlIChydHBtcGFkZXBheS0+bXAzX2ZyYW1lKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwbXBhcm9idXN0ZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfTVBBX1JPQlVTVF9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM5ZWMwYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuaApAQCAtMCwwICsxLDc4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMTA+IE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSA8MjAxMD4gTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9NUEFfUk9CVVNUX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfTVBBX1JPQlVTVF9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXdyaXRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX01QQV9ST0JVU1RfREVQQVkgXAorICAoZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfTVBBX1JPQlVTVF9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9NUEFfUk9CVVNUX0RFUEFZLEdzdFJ0cE1QQVJvYnVzdERlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9NUEFfUk9CVVNUX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUEFfUk9CVVNUX0RFUEFZLEdzdFJ0cE1QQVJvYnVzdERlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QQV9ST0JVU1RfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfTVBBX1JPQlVTVF9ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfTVBBX1JPQlVTVF9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTVBBX1JPQlVTVF9ERVBBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBNUEFSb2J1c3REZXBheSBHc3RSdHBNUEFSb2J1c3REZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBNUEFSb2J1c3REZXBheUNsYXNzIEdzdFJ0cE1QQVJvYnVzdERlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwTVBBUm9idXN0RGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7CisKKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKKyAgZ2Jvb2xlYW4gICAgaGFzX2Rlc2NyaXB0b3I7CisKKyAgLyogbGFzdCBpbnRlcmxlYXZlIGluZGV4ICovCisgIGdpbnQgICAgICAgIGxhc3RfaWk7CisgIC8qIGxhc3QgaW50ZXJsZWF2ZSBjeWNsZSBjb3VudCAqLworICBnaW50ICAgICAgICBsYXN0X2ljYzsKKyAgLyogYnVmZmVycyBwZW5kaW5nIGRlaW50ZXJsZWF2aW5nICovCisgIEdzdEJ1ZmZlciAgICpkZWludGVyWzI1Nl07CisKKyAgLyogQURVIGJ1ZmZlcnMgcGVuZGluZyBNUDMgdHJhbnNmb3JtYXRpb24gKi8KKyAgR1F1ZXVlICAgICAgKmFkdV9mcmFtZXM7CisgIEdMaXN0ICAgICAgICpjdXJfYWR1X2ZyYW1lOworICBnaW50ICAgICAgICAgb2Zmc2V0OworICBnaW50ICAgICAgICAgc2l6ZTsKKyAgR3N0Qnl0ZVdyaXRlciAqbXAzX2ZyYW1lOworfTsKKworc3RydWN0IF9Hc3RSdHBNUEFSb2J1c3REZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX21wYV9yb2J1c3RfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX21wYV9yb2J1c3RfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfTVBBX1JPQlVTVF9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzMxOTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jCkBAIC0wLDAgKzEsMTk4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0cnRwbXB2ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBtcHZkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwbXB2ZGVwYXlfZGVidWcpCisKKy8qIEZJWE1FLCB3ZSBzZXQgdGhlIG1wZWcgdmVyc2lvbiB0byAyLCB3ZSBzaG91bGQgaWRlYWxseSBiZSBsb29raW5nIGF0IGNvbnRlbnRzCisgKiBvZiB0aGUgc3RyZWFtIHRvIGZpZ3VyZSBvdXQgdGhlIHZlcnNpb24gKi8KK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX21wdl9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUworICAgICgidmlkZW8vbXBlZywgbXBlZ3ZlcnNpb24gPSAoaW50KSAyLCBzeXN0ZW1zdHJlYW0gPSAoYm9vbGVhbikgRkFMU0UiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX21wdl9kZXBheV9zaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTVBWXCI7IgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfTVBWX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAiKQorICAgICk7CisKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cE1QVkRlcGF5LCBnc3RfcnRwX21wdl9kZXBheSwgR1NUX1RZUEVfUlRQX0JBU0VfREVQQVlMT0FEKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfbXB2X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9tcHZfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcHZfZGVwYXlfY2xhc3NfaW5pdCAoR3N0UnRwTVBWRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9tcHZfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9tcHZfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgTVBFRyB2aWRlbyBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgTVBFRyB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMjI1MCkiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX21wdl9kZXBheV9zZXRjYXBzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX21wdl9kZXBheV9wcm9jZXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBtcHZkZXBheV9kZWJ1ZywgInJ0cG1wdmRlcGF5IiwgMCwKKyAgICAgICJNUEVHIFZpZGVvIFJUUCBEZXBheWxvYWRlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcHZfZGVwYXlfaW5pdCAoR3N0UnRwTVBWRGVwYXkgKiBydHBtcHZkZXBheSkKK3sKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX21wdl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKyAgR3N0Q2FwcyAqb3V0Y2FwczsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSA5MDAwMDsgICAgICAgICAvKiBkZWZhdWx0ICovCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgb3V0Y2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby9tcGVnIiwKKyAgICAgICJtcGVndmVyc2lvbiIsIEdfVFlQRV9JTlQsIDIsCisgICAgICAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoZGVwYXlsb2FkLT5zcmNwYWQsIG91dGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAob3V0Y2Fwcyk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX21wdl9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cE1QVkRlcGF5ICpydHBtcHZkZXBheTsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworCisgIHJ0cG1wdmRlcGF5ID0gR1NUX1JUUF9NUFZfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgeworICAgIGdpbnQgcGF5bG9hZF9sZW4sIHBheWxvYWRfaGVhZGVyOworICAgIGd1aW50OCAqcGF5bG9hZDsKKyAgICBndWludDggVDsKKworICAgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworICAgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAocnRwKTsKKyAgICBwYXlsb2FkX2hlYWRlciA9IDA7CisKKyAgICBpZiAocGF5bG9hZF9sZW4gPD0gNCkKKyAgICAgIGdvdG8gZW1wdHlfcGFja2V0OworCisgICAgLyogMy40IE1QRUcgVmlkZW8tc3BlY2lmaWMgaGVhZGVyCisgICAgICoKKyAgICAgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAqIHwgICAgTUJaICB8VHwgICAgICAgICBUUiAgICAgICAgfCB8TnxTfEJ8RXwgIFAgIHwgfCBCRkMgfCB8IEZGQyB8CisgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTiAgICAgICAgICAgICAgRkJWICAgICBGRlYKKyAgICAgKi8KKyAgICBUID0gKHBheWxvYWRbMF0gJiAweDA0KTsKKworICAgIHBheWxvYWRfbGVuIC09IDQ7CisgICAgcGF5bG9hZF9oZWFkZXIgKz0gNDsKKyAgICBwYXlsb2FkICs9IDQ7CisKKyAgICBpZiAoVCkgeworICAgICAgLyogCisgICAgICAgKiAzLjQuMSBNUEVHLTIgVmlkZW8tc3BlY2lmaWMgaGVhZGVyIGV4dGVuc2lvbgorICAgICAgICoKKyAgICAgICAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICogfFh8RXxmX1swLDBdfGZfWzAsMV18Zl9bMSwwXXxmX1sxLDFdfCBEQ3wgUFN8VHxQfEN8UXxWfEF8UnxIfEd8RHwKKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKi8KKyAgICAgIGlmIChwYXlsb2FkX2xlbiA8PSA0KQorICAgICAgICBnb3RvIGVtcHR5X3BhY2tldDsKKworICAgICAgcGF5bG9hZF9sZW4gLT0gNDsKKyAgICAgIHBheWxvYWRfaGVhZGVyICs9IDQ7CisgICAgICBwYXlsb2FkICs9IDQ7CisgICAgfQorCisgICAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfc3ViYnVmZmVyIChydHAsIHBheWxvYWRfaGVhZGVyLCAtMSk7CisKKyAgICBpZiAob3V0YnVmKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcHZkZXBheSwKKyAgICAgICAgICAiZ3N0X3J0cF9tcHZfZGVwYXlfY2hhaW46IHB1c2hpbmcgYnVmZmVyIG9mIHNpemUgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAob3V0YnVmKSk7CisgICAgICBnc3RfcnRwX2Ryb3Bfbm9uX3ZpZGVvX21ldGEgKHJ0cG1wdmRlcGF5LCBvdXRidWYpOworCisgICAgfQorICB9CisKKyAgcmV0dXJuIG91dGJ1ZjsKKworICAvKiBFUlJPUlMgKi8KK2VtcHR5X3BhY2tldDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cG1wdmRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIkVtcHR5IHBheWxvYWQuIikpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK2dib29sZWFuCitnc3RfcnRwX21wdl9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cG1wdmRlcGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX01QVl9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cG1wdmRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cG1wdmRlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBmNmM0MwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuaApAQCAtMCwwICsxLDU4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfTVBWX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfTVBWX0RFUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX01QVl9ERVBBWSBcCisgIChnc3RfcnRwX21wdl9kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX01QVl9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9NUFZfREVQQVksR3N0UnRwTVBWRGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX01QVl9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTVBWX0RFUEFZLEdzdFJ0cE1QVkRlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QVl9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9NUFZfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QVl9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTVBWX0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cE1QVkRlcGF5IEdzdFJ0cE1QVkRlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cE1QVkRlcGF5Q2xhc3MgR3N0UnRwTVBWRGVwYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBNUFZEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKK307CisKK3N0cnVjdCBfR3N0UnRwTVBWRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9tcHZfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX21wdl9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9NUFZfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cG1wdnBheS5jIGIvZ3N0L3J0cC9nc3RydHBtcHZwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjczYWYyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBtcHZwYXkuYwpAQCAtMCwwICsxLDMzNSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpbmNsdWRlICJnc3RydHBtcHZwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBtcHZwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cG1wdnBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXB2X3BheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL21wZWcsICIKKyAgICAgICAgIm1wZWd2ZXJzaW9uID0gKGludCkgMiwgc3lzdGVtc3RyZWFtID0gKGJvb2xlYW4pIEZBTFNFIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9tcHZfcGF5X3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX01QVl9TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJNUFZcIjsgIgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJNUFZcIiIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfbXB2X3BheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX21wdl9wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX21wdl9wYXlfZmx1c2ggKEdzdFJUUE1QVlBheSAqIHJ0cG1wdnBheSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9tcHZfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX21wdl9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKgorICAgIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9tcHZfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworI2RlZmluZSBnc3RfcnRwX21wdl9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UlRQTVBWUGF5LCBnc3RfcnRwX21wdl9wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcHZfcGF5X2NsYXNzX2luaXQgKEdzdFJUUE1QVlBheUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzICpnc3RydHBiYXNlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX21wdl9wYXlfZmluYWxpemU7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3J0cF9tcHZfcGF5X2NoYW5nZV9zdGF0ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX21wdl9wYXlfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfbXB2X3BheV9zcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIE1QRUcyIEVTIHZpZGVvIHBheWxvYWRlciIsICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBheWxvYWQtZW5jb2RlcyBNUEVHMiBFUyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgMjI1MCkiLAorICAgICAgIlRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+Iik7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9tcHZfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9tcHZfcGF5X2hhbmRsZV9idWZmZXI7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5zaW5rX2V2ZW50ID0gZ3N0X3J0cF9tcHZfcGF5X3NpbmtfZXZlbnQ7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cG1wdnBheV9kZWJ1ZywgInJ0cG1wdnBheSIsIDAsCisgICAgICAiTVBFRzIgRVMgVmlkZW8gUlRQIFBheWxvYWRlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcHZfcGF5X2luaXQgKEdzdFJUUE1QVlBheSAqIHJ0cG1wdnBheSkKK3sKKyAgR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHJ0cG1wdnBheSktPmNsb2NrX3JhdGUgPSA5MDAwMDsKKyAgR1NUX1JUUF9CQVNFX1BBWUxPQURfUFQgKHJ0cG1wdnBheSkgPSBHU1RfUlRQX1BBWUxPQURfTVBWOworCisgIHJ0cG1wdnBheS0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXB2X3BheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UlRQTVBWUGF5ICpydHBtcHZwYXk7CisKKyAgcnRwbXB2cGF5ID0gR1NUX1JUUF9NUFZfUEFZIChvYmplY3QpOworCisgIGdfb2JqZWN0X3VucmVmIChydHBtcHZwYXktPmFkYXB0ZXIpOworICBydHBtcHZwYXktPmFkYXB0ZXIgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXB2X3BheV9yZXNldCAoR3N0UlRQTVBWUGF5ICogcGF5KQoreworICBwYXktPmZpcnN0X3RzID0gLTE7CisgIHBheS0+ZHVyYXRpb24gPSAwOworICBnc3RfYWRhcHRlcl9jbGVhciAocGF5LT5hZGFwdGVyKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocGF5LCAicmVzZXQgZGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX21wdl9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHBheWxvYWQsICJ2aWRlbyIsCisgICAgICBwYXlsb2FkLT5wdCAhPSBHU1RfUlRQX1BBWUxPQURfTVBWLCAiTVBWIiwgOTAwMDApOworICByZXR1cm4gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHBheWxvYWQsIE5VTEwpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfbXB2X3BheV9zaW5rX2V2ZW50IChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJldDsKKyAgR3N0UlRQTVBWUGF5ICpydHBtcHZwYXk7CisKKyAgcnRwbXB2cGF5ID0gR1NUX1JUUF9NUFZfUEFZIChwYXlsb2FkKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgICAvKiBtYWtlIHN1cmUgd2UgcHVzaCB0aGUgbGFzdCBwYWNrZXRzIGluIHRoZSBhZGFwdGVyIG9uIEVPUyAqLworICAgICAgZ3N0X3J0cF9tcHZfcGF5X2ZsdXNoIChydHBtcHZwYXkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9ydHBfbXB2X3BheV9yZXNldCAocnRwbXB2cGF5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChwYXlsb2FkLCBldmVudCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBSVFBfSEVBREVSX0xFTiAxMgorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9tcHZfcGF5X2ZsdXNoIChHc3RSVFBNUFZQYXkgKiBydHBtcHZwYXkpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBndWludCBhdmFpbDsKKyAgR3N0QnVmZmVyTGlzdCAqbGlzdDsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisKKyAgZ3VpbnQ4ICpwYXlsb2FkOworCisgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBtcHZwYXktPmFkYXB0ZXIpOworCisgIHJldCA9IEdTVF9GTE9XX09LOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cG1wdnBheSwgImF2YWlsYWJsZSAldSIsIGF2YWlsKTsKKyAgaWYgKGF2YWlsID09IDApCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIGxpc3QgPQorICAgICAgZ3N0X2J1ZmZlcl9saXN0X25ld19zaXplZCAoYXZhaWwgLyAoR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVIChydHBtcHZwYXkpIC0KKyAgICAgICAgICBSVFBfSEVBREVSX0xFTikgKyAxKTsKKworICB3aGlsZSAoYXZhaWwgPiAwKSB7CisgICAgZ3VpbnQgdG93cml0ZTsKKyAgICBndWludCBwYWNrZXRfbGVuOworICAgIGd1aW50IHBheWxvYWRfbGVuOworICAgIEdzdFJUUEJ1ZmZlciBydHAgPSB7IE5VTEwgfTsKKyAgICBHc3RCdWZmZXIgKnBheWJ1ZjsKKworICAgIHBhY2tldF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BhY2tldF9sZW4gKGF2YWlsICsgNCwgMCwgMCk7CisKKyAgICB0b3dyaXRlID0gTUlOIChwYWNrZXRfbGVuLCBHU1RfUlRQX0JBU0VfUEFZTE9BRF9NVFUgKHJ0cG1wdnBheSkpOworCisgICAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BheWxvYWRfbGVuICh0b3dyaXRlLCAwLCAwKTsKKworICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoNCwgMCwgMCk7CisKKyAgICBwYXlsb2FkX2xlbiAtPSA0OworCisgICAgZ3N0X3J0cF9idWZmZXJfbWFwIChvdXRidWYsIEdTVF9NQVBfV1JJVEUsICZydHApOworCisgICAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKTsKKyAgICAvKiBlbmFibGUgTVBFRyBWaWRlby1zcGVjaWZpYyBoZWFkZXIKKyAgICAgKgorICAgICAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICogfCAgICBNQlogIHxUfCAgICAgICAgIFRSICAgICAgICB8IHxOfFN8QnxFfCAgUCAgfCB8IEJGQyB8IHwgRkZDIHwKKyAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOICAgICAgICAgICAgICBGQlYgICAgIEZGVgorICAgICAqLworCisgICAgLyogZmlsbCBpbiB0aGUgTVBFRyBWaWRlby1zcGVjaWZpYyBoZWFkZXIgCisgICAgICogZGF0YSBpcyBzZXQgdG8gMHgwIGhlcmUKKyAgICAgKi8KKyAgICBtZW1zZXQgKHBheWxvYWQsIDB4MCwgNCk7CisKKyAgICBhdmFpbCAtPSBwYXlsb2FkX2xlbjsKKworICAgIGdzdF9ydHBfYnVmZmVyX3NldF9tYXJrZXIgKCZydHAsIGF2YWlsID09IDApOworICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICAgIHBheWJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyX2Zhc3QgKHJ0cG1wdnBheS0+YWRhcHRlciwgcGF5bG9hZF9sZW4pOworICAgIGdzdF9ydHBfY29weV92aWRlb19tZXRhIChydHBtcHZwYXksIG91dGJ1ZiwgcGF5YnVmKTsKKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAob3V0YnVmLCBwYXlidWYpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXB2cGF5LCAiQWRkaW5nIGJ1ZmZlciIpOworCisgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSBydHBtcHZwYXktPmZpcnN0X3RzOworICAgIGdzdF9idWZmZXJfbGlzdF9hZGQgKGxpc3QsIG91dGJ1Zik7CisgIH0KKworICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoX2xpc3QgKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBtcHZwYXkpLCBsaXN0KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9tcHZfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSVFBNUFZQYXkgKnJ0cG1wdnBheTsKKyAgZ3VpbnQgYXZhaWwsIHBhY2tldF9sZW47CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIGR1cmF0aW9uOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworCisgIHJ0cG1wdnBheSA9IEdTVF9SVFBfTVBWX1BBWSAoYmFzZXBheWxvYWQpOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworICBkdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcik7CisKKyAgaWYgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAoYnVmZmVyKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cG1wdnBheSwgIkRJU0NPTlQiKTsKKyAgICBnc3RfcnRwX21wdl9wYXlfcmVzZXQgKHJ0cG1wdnBheSk7CisgIH0KKworICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwbXB2cGF5LT5hZGFwdGVyKTsKKworICBpZiAoZHVyYXRpb24gPT0gLTEpCisgICAgZHVyYXRpb24gPSAwOworCisgIGlmIChydHBtcHZwYXktPmZpcnN0X3RzID09IEdTVF9DTE9DS19USU1FX05PTkUgfHwgYXZhaWwgPT0gMCkKKyAgICBydHBtcHZwYXktPmZpcnN0X3RzID0gdGltZXN0YW1wOworCisgIGlmIChhdmFpbCA9PSAwKSB7CisgICAgcnRwbXB2cGF5LT5kdXJhdGlvbiA9IGR1cmF0aW9uOworICB9IGVsc2UgeworICAgIHJ0cG1wdnBheS0+ZHVyYXRpb24gKz0gZHVyYXRpb247CisgIH0KKworICBnc3RfYWRhcHRlcl9wdXNoIChydHBtcHZwYXktPmFkYXB0ZXIsIGJ1ZmZlcik7CisgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBtcHZwYXktPmFkYXB0ZXIpOworCisgIC8qIGdldCBwYWNrZXQgbGVuZ3RoIG9mIHByZXZpb3VzIGRhdGEgYW5kIHRoaXMgbmV3IGRhdGEsCisgICAqIHBheWxvYWQgbGVuZ3RoIGluY2x1ZGVzIGEgNCBieXRlIE1QRUcgdmlkZW8tc3BlY2lmaWMgaGVhZGVyICovCisgIHBhY2tldF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BhY2tldF9sZW4gKGF2YWlsLCA0LCAwKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHJ0cG1wdnBheSwgImF2YWlsYWJsZSAlZCwgcnRwIHBhY2tldCBsZW5ndGggJWQiLCBhdmFpbCwKKyAgICAgIHBhY2tldF9sZW4pOworCisgIGlmIChnc3RfcnRwX2Jhc2VfcGF5bG9hZF9pc19maWxsZWQgKGJhc2VwYXlsb2FkLAorICAgICAgICAgIHBhY2tldF9sZW4sIHJ0cG1wdnBheS0+ZHVyYXRpb24pKSB7CisgICAgcmV0ID0gZ3N0X3J0cF9tcHZfcGF5X2ZsdXNoIChydHBtcHZwYXkpOworICB9IGVsc2UgeworICAgIHJ0cG1wdnBheS0+Zmlyc3RfdHMgPSB0aW1lc3RhbXA7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfbXB2X3BheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RSVFBNUFZQYXkgKnJ0cG1wdnBheTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHJ0cG1wdnBheSA9IEdTVF9SVFBfTVBWX1BBWSAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGdzdF9ydHBfbXB2X3BheV9yZXNldCAocnRwbXB2cGF5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3RfcnRwX21wdl9wYXlfcmVzZXQgKHJ0cG1wdnBheSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworCitnYm9vbGVhbgorZ3N0X3J0cF9tcHZfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwbXB2cGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX01QVl9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBtcHZwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwbXB2cGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNlYmFkOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXB2cGF5LmgKQEAgLTAsMCArMSw2NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9SVFBfTVBWX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX01QVl9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQTVBWUGF5IEdzdFJUUE1QVlBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBNUFZQYXlDbGFzcyBHc3RSVFBNUFZQYXlDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfTVBWX1BBWSBcCisgIChnc3RfcnRwX21wdl9wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9NUFZfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX01QVl9QQVksR3N0UlRQTVBWUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9NUFZfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUFZfUEFZLEdzdFJUUE1QVlBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUFZfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX01QVl9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QVl9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX01QVl9QQVkpKQorCitzdHJ1Y3QgX0dzdFJUUE1QVlBheQoreworICBHc3RSVFBCYXNlUGF5bG9hZCBwYXlsb2FkOworCisgIEdzdEFkYXB0ZXIgICphZGFwdGVyOworICBHc3RDbG9ja1RpbWUgZmlyc3RfdHM7CisgIEdzdENsb2NrVGltZSBkdXJhdGlvbjsKK307CisKK3N0cnVjdCBfR3N0UlRQTVBWUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX21wdl9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX21wdl9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfTVBWX1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwb3B1c2RlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cG9wdXNkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NzIzMzkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG9wdXNkZXBheS5jCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogT3B1cyBEZXBheWxvYWRlciBHc3QgRWxlbWVudAorICoKKyAqICAgQGF1dGhvcjogRGFuaWxvIENlc2FyIExlbWVzIGRlIFBhdWxhIDxkYW5pbG8uY2VzYXJAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlICJnc3RydHBvcHVzZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBvcHVzZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cG9wdXNkZXBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfb3B1c19kZXBheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDQ4MDAwLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgeyBcIk9QVVNcIiwgXCJYLUdTVC1PUFVTLURSQUZULVNQSVRUS0EtMDBcIiB9IikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9vcHVzX2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1vcHVzLCBjaGFubmVsLW1hcHBpbmctZmFtaWx5ID0gKGludCkgMCIpCisgICAgKTsKKworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9vcHVzX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwX2J1ZmZlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9vcHVzX2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworCitHX0RFRklORV9UWVBFIChHc3RSVFBPcHVzRGVwYXksIGdzdF9ydHBfb3B1c19kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9vcHVzX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJUUE9wdXNEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0YmFzZXJ0cGRlcGF5bG9hZF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworCisgIGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBnc3RiYXNlcnRwZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX29wdXNfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9vcHVzX2RlcGF5X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBPcHVzIHBhY2tldCBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgT3B1cyBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIiwKKyAgICAgICJEYW5pbG8gQ2VzYXIgTGVtZXMgZGUgUGF1bGEgPGRhbmlsby5jZXNhckBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgZ3N0YmFzZXJ0cGRlcGF5bG9hZF9jbGFzcy0+cHJvY2Vzc19ydHBfcGFja2V0ID0gZ3N0X3J0cF9vcHVzX2RlcGF5X3Byb2Nlc3M7CisgIGdzdGJhc2VydHBkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9vcHVzX2RlcGF5X3NldGNhcHM7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cG9wdXNkZXBheV9kZWJ1ZywgInJ0cG9wdXNkZXBheSIsIDAsCisgICAgICAiT3B1cyBSVFAgRGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfb3B1c19kZXBheV9pbml0IChHc3RSVFBPcHVzRGVwYXkgKiBydHBvcHVzZGVwYXkpCit7CisKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX29wdXNfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgZ2Jvb2xlYW4gcmV0OworICBjb25zdCBnY2hhciAqc3Byb3Bfc3RlcmVvLCAqc3Byb3BfbWF4Y2FwdHVyZXJhdGU7CisKKyAgc3JjY2FwcyA9CisgICAgICBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1vcHVzIiwgImNoYW5uZWwtbWFwcGluZy1mYW1pbHkiLCBHX1RZUEVfSU5ULAorICAgICAgMCwgTlVMTCk7CisKKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBpZiAoKHNwcm9wX3N0ZXJlbyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgInNwcm9wLXN0ZXJlbyIpKSkgeworICAgIGlmIChzdHJjbXAgKHNwcm9wX3N0ZXJlbywgIjAiKSA9PSAwKQorICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoc3JjY2FwcywgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMSwgTlVMTCk7CisgICAgZWxzZSBpZiAoc3RyY21wIChzcHJvcF9zdGVyZW8sICIxIikgPT0gMCkKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKHNyY2NhcHMsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDIsIE5VTEwpOworICAgIGVsc2UKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVwYXlsb2FkLCAiVW5rbm93biBzcHJvcC1zdGVyZW8gdmFsdWUgJyVzJyIsCisgICAgICAgICAgc3Byb3Bfc3RlcmVvKTsKKyAgfQorCisgIGlmICgoc3Byb3BfbWF4Y2FwdHVyZXJhdGUgPQorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgInNwcm9wLW1heGNhcHR1cmVyYXRlIikpKSB7CisgICAgZ3Vsb25nIHJhdGU7CisgICAgZ2NoYXIgKnRhaWxwdHI7CisKKyAgICByYXRlID0gc3RydG91bCAoc3Byb3BfbWF4Y2FwdHVyZXJhdGUsICZ0YWlscHRyLCAxMCk7CisgICAgaWYgKHJhdGUgPiBJTlRfTUFYIHx8ICp0YWlscHRyICE9ICdcMCcpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVwYXlsb2FkLAorICAgICAgICAgICJGYWlsZWQgdG8gcGFyc2Ugc3Byb3AtbWF4Y2FwdHVyZXJhdGUgdmFsdWUgJyVzJyIsCisgICAgICAgICAgc3Byb3BfbWF4Y2FwdHVyZXJhdGUpOworICAgIH0gZWxzZSB7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChzcmNjYXBzLCAicmF0ZSIsIEdfVFlQRV9JTlQsIHJhdGUsIE5VTEwpOworICAgIH0KKyAgfQorCisgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBzcmNjYXBzKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsCisgICAgICAic2V0IGNhcHMgb24gc291cmNlOiAlIiBHU1RfUFRSX0ZPUk1BVCAiIChyZXQ9JWQpIiwgc3JjY2FwcywgcmV0KTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IDQ4MDAwOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9vcHVzX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwX2J1ZmZlcikKK3sKKyAgR3N0QnVmZmVyICpvdXRidWY7CisKKyAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfYnVmZmVyIChydHBfYnVmZmVyKTsKKworICBnc3RfcnRwX2Ryb3Bfbm9uX2F1ZGlvX21ldGEgKGRlcGF5bG9hZCwgb3V0YnVmKTsKKworICByZXR1cm4gb3V0YnVmOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9vcHVzX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwb3B1c2RlcGF5IiwKKyAgICAgIEdTVF9SQU5LX1BSSU1BUlksIEdTVF9UWVBFX1JUUF9PUFVTX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwb3B1c2RlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cG9wdXNkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4Y2M4NTEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG9wdXNkZXBheS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBPcHVzIERlcGF5bG9hZGVyIEdzdCBFbGVtZW50CisgKgorICogICBAYXV0aG9yOiBEYW5pbG8gQ2VzYXIgTGVtZXMgZGUgUGF1bGEgPGRhbmlsby5ldUBnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfT1BVU19ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX09QVVNfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMgdHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUE9wdXNEZXBheSBHc3RSVFBPcHVzRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQT3B1c0RlcGF5Q2xhc3MgR3N0UlRQT3B1c0RlcGF5Q2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX09QVVNfREVQQVkgXAorICAoZ3N0X3J0cF9vcHVzX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfT1BVU19ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9PUFVTX0RFUEFZLEdzdFJUUE9wdXNEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfT1BVU19ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfT1BVU19ERVBBWSxHc3RSVFBPcHVzRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfT1BVU19ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9PUFVTX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9PUFVTX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9PUFVTX0RFUEFZKSkKKworCitzdHJ1Y3QgX0dzdFJUUE9wdXNEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKKworfTsKKworc3RydWN0IF9Hc3RSVFBPcHVzRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9vcHVzX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9vcHVzX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1JUUF9PUFVTX0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBvcHVzcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cG9wdXNwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjEwODg1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBvcHVzcGF5LmMKQEAgLTAsMCArMSwyNTUgQEAKKy8qCisgKiBPcHVzIFBheWxvYWRlciBHc3QgRWxlbWVudAorICoKKyAqICAgQGF1dGhvcjogRGFuaWxvIENlc2FyIExlbWVzIGRlIFBhdWxhIDxkYW5pbG8uY2VzYXJAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSAiZ3N0cnRwb3B1c3BheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cG9wdXNwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cG9wdXNwYXlfZGVidWcpCisKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfb3B1c19wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMKKyAgICAoImF1ZGlvL3gtb3B1cywgY2hhbm5lbHMgPSAoaW50KSBbMSwgMl0sIGNoYW5uZWwtbWFwcGluZy1mYW1pbHkgPSAoaW50KSAwIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9vcHVzX3BheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA0ODAwMCwgIgorICAgICAgICAiZW5jb2RpbmctcGFyYW1zID0gKHN0cmluZykgXCIyXCIsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSB7IFwiT1BVU1wiLCBcIlgtR1NULU9QVVMtRFJBRlQtU1BJVFRLQS0wMFwiIH0iKQorICAgICk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX29wdXNfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3J0cF9vcHVzX3BheV9nZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0UGFkICogcGFkLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfb3B1c19wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKgorICAgIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cE9QVVNQYXksIGdzdF9ydHBfb3B1c19wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9vcHVzX3BheV9jbGFzc19pbml0IChHc3RSdHBPUFVTUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0YmFzZXJ0cHBheWxvYWRfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKworICBnc3RiYXNlcnRwcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworICBlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKworICBnc3RiYXNlcnRwcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX29wdXNfcGF5X3NldGNhcHM7CisgIGdzdGJhc2VydHBwYXlsb2FkX2NsYXNzLT5nZXRfY2FwcyA9IGdzdF9ydHBfb3B1c19wYXlfZ2V0Y2FwczsKKyAgZ3N0YmFzZXJ0cHBheWxvYWRfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX29wdXNfcGF5X2hhbmRsZV9idWZmZXI7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9vcHVzX3BheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX29wdXNfcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIE9wdXMgcGF5bG9hZGVyIiwKKyAgICAgICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlB1dHMgT3B1cyBhdWRpbyBpbiBSVFAgcGFja2V0cyIsCisgICAgICAiRGFuaWxvIENlc2FyIExlbWVzIGRlIFBhdWxhIDxkYW5pbG8uY2VzYXJAY29sbGFib3JhLmNvLnVrPiIpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBvcHVzcGF5X2RlYnVnLCAicnRwb3B1c3BheSIsIDAsCisgICAgICAiT3B1cyBSVFAgUGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX29wdXNfcGF5X2luaXQgKEdzdFJ0cE9QVVNQYXkgKiBydHBvcHVzcGF5KQoreworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfb3B1c19wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RDYXBzICpzcmNfY2FwczsKKyAgR3N0U3RydWN0dXJlICpzOworICBjaGFyICplbmNvZGluZ19uYW1lOworICBnaW50IGNoYW5uZWxzLCByYXRlOworICBjb25zdCBjaGFyICpzcHJvcF9zdGVyZW8gPSBOVUxMOworICBjaGFyICpzcHJvcF9tYXhjYXB0dXJlcmF0ZSA9IE5VTEw7CisKKyAgc3JjX2NhcHMgPSBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NSQ1BBRCAocGF5bG9hZCkpOworICBpZiAoc3JjX2NhcHMpIHsKKyAgICBzcmNfY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKHNyY19jYXBzKTsKKyAgICBzcmNfY2FwcyA9IGdzdF9jYXBzX3RydW5jYXRlIChzcmNfY2Fwcyk7CisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHNyY19jYXBzLCAwKTsKKyAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9zdHJpbmcgKHMsICJlbmNvZGluZy1uYW1lIiwgIk9QVVMiKTsKKyAgICBlbmNvZGluZ19uYW1lID0gZ19zdHJkdXAgKGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgImVuY29kaW5nLW5hbWUiKSk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHNyY19jYXBzKTsKKyAgfSBlbHNlIHsKKyAgICBlbmNvZGluZ19uYW1lID0gZ19zdHJkdXAgKCJYLUdTVC1PUFVTLURSQUZULVNQSVRUS0EtMDAiKTsKKyAgfQorCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImNoYW5uZWxzIiwgJmNoYW5uZWxzKSkgeworICAgIGlmIChjaGFubmVscyA+IDIpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBheWxvYWQsCisgICAgICAgICAgIk1vcmUgdGhhbiAyIGNoYW5uZWxzIHdpdGggY2hhbm5lbC1tYXBwaW5nLWZhbWlseT0wIGlzIGludmFsaWQiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9IGVsc2UgaWYgKGNoYW5uZWxzID09IDIpIHsKKyAgICAgIHNwcm9wX3N0ZXJlbyA9ICIxIjsKKyAgICB9IGVsc2UgeworICAgICAgc3Byb3Bfc3RlcmVvID0gIjAiOworICAgIH0KKyAgfQorCisgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJyYXRlIiwgJnJhdGUpKSB7CisgICAgc3Byb3BfbWF4Y2FwdHVyZXJhdGUgPSBnX3N0cmR1cF9wcmludGYgKCIlZCIsIHJhdGUpOworICB9CisKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHBheWxvYWQsICJhdWRpbyIsIEZBTFNFLAorICAgICAgZW5jb2RpbmdfbmFtZSwgNDgwMDApOworICBnX2ZyZWUgKGVuY29kaW5nX25hbWUpOworCisgIGlmIChzcHJvcF9tYXhjYXB0dXJlcmF0ZSAmJiBzcHJvcF9zdGVyZW8pIHsKKyAgICByZXMgPQorICAgICAgICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAocGF5bG9hZCwgInNwcm9wLW1heGNhcHR1cmVyYXRlIiwKKyAgICAgICAgR19UWVBFX1NUUklORywgc3Byb3BfbWF4Y2FwdHVyZXJhdGUsICJzcHJvcC1zdGVyZW8iLCBHX1RZUEVfU1RSSU5HLAorICAgICAgICBzcHJvcF9zdGVyZW8sIE5VTEwpOworICB9IGVsc2UgaWYgKHNwcm9wX21heGNhcHR1cmVyYXRlKSB7CisgICAgcmVzID0KKyAgICAgICAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHBheWxvYWQsICJzcHJvcC1tYXhjYXB0dXJlcmF0ZSIsCisgICAgICAgIEdfVFlQRV9TVFJJTkcsIHNwcm9wX21heGNhcHR1cmVyYXRlLCBOVUxMKTsKKyAgfSBlbHNlIGlmIChzcHJvcF9zdGVyZW8pIHsKKyAgICByZXMgPQorICAgICAgICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAocGF5bG9hZCwgInNwcm9wLXN0ZXJlbyIsCisgICAgICAgIEdfVFlQRV9TVFJJTkcsIHNwcm9wX3N0ZXJlbywgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHBheWxvYWQsIE5VTEwpOworICB9CisKKyAgZ19mcmVlIChzcHJvcF9tYXhjYXB0dXJlcmF0ZSk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfb3B1c19wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHc3RDbG9ja1RpbWUgcHRzLCBkdHMsIGR1cmF0aW9uOworCisgIHB0cyA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworICBkdHMgPSBHU1RfQlVGRkVSX0RUUyAoYnVmZmVyKTsKKyAgZHVyYXRpb24gPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpOworCisgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoMCwgMCwgMCk7CisKKyAgZ3N0X3J0cF9jb3B5X2F1ZGlvX21ldGEgKGJhc2VwYXlsb2FkLCBvdXRidWYsIGJ1ZmZlcik7CisKKyAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKG91dGJ1ZiwgYnVmZmVyKTsKKworICBHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSA9IHB0czsKKyAgR1NUX0JVRkZFUl9EVFMgKG91dGJ1ZikgPSBkdHM7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPSBkdXJhdGlvbjsKKworICAvKiBQdXNoIG91dCAqLworICByZXR1cm4gZ3N0X3J0cF9iYXNlX3BheWxvYWRfcHVzaCAoYmFzZXBheWxvYWQsIG91dGJ1Zik7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9ydHBfb3B1c19wYXlfZ2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0Q2FwcyAqY2FwcywgKnBlZXJjYXBzLCAqdGNhcHM7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgY29uc3QgZ2NoYXIgKnN0ZXJlbzsKKworICBpZiAocGFkID09IEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NSQ1BBRCAocGF5bG9hZCkpCisgICAgcmV0dXJuCisgICAgICAgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChnc3RfcnRwX29wdXNfcGF5X3BhcmVudF9jbGFzcyktPmdldF9jYXBzCisgICAgICAgIChwYXlsb2FkLCBwYWQsIGZpbHRlcik7CisKKyAgdGNhcHMgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX1JUUF9CQVNFX1BBWUxPQURfU1JDUEFEIChwYXlsb2FkKSk7CisgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NSQ1BBRCAocGF5bG9hZCksCisgICAgICB0Y2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmICh0Y2Fwcyk7CisgIGlmICghcGVlcmNhcHMpCisgICAgcmV0dXJuCisgICAgICAgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChnc3RfcnRwX29wdXNfcGF5X3BhcmVudF9jbGFzcyktPmdldF9jYXBzCisgICAgICAgIChwYXlsb2FkLCBwYWQsIGZpbHRlcik7CisKKyAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChwZWVyY2FwcykpCisgICAgcmV0dXJuIHBlZXJjYXBzOworCisgIGNhcHMgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX1JUUF9CQVNFX1BBWUxPQURfU0lOS1BBRCAocGF5bG9hZCkpOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChwZWVyY2FwcywgMCk7CisgIHN0ZXJlbyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgInN0ZXJlbyIpOworICBpZiAoc3RlcmVvICE9IE5VTEwpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoY2Fwcyk7CisKKyAgICBpZiAoIXN0cmNtcCAoc3RlcmVvLCAiMSIpKSB7CisgICAgICBHc3RDYXBzICpjYXBzMiA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworCisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAyLCBOVUxMKTsKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMyLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19tZXJnZSAoY2FwcywgY2FwczIpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcCAoc3RlcmVvLCAiMCIpKSB7CisgICAgICBHc3RDYXBzICpjYXBzMiA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworCisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMyLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAyLCBOVUxMKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19tZXJnZSAoY2FwcywgY2FwczIpOworICAgIH0KKyAgfQorICBnc3RfY2Fwc191bnJlZiAocGVlcmNhcHMpOworCisgIGlmIChmaWx0ZXIpIHsKKyAgICBHc3RDYXBzICp0bXAgPSBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoY2FwcywgZmlsdGVyLAorICAgICAgICBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICBjYXBzID0gdG1wOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGF5bG9hZCwgIlJldHVybmluZyBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisgIHJldHVybiBjYXBzOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9vcHVzX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cG9wdXNwYXkiLAorICAgICAgR1NUX1JBTktfUFJJTUFSWSwgR1NUX1RZUEVfUlRQX09QVVNfUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwb3B1c3BheS5oIGIvZ3N0L3J0cC9nc3RydHBvcHVzcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmNDBkOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwb3B1c3BheS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBPcHVzIFBheWxvYWRlciBHc3QgRWxlbWVudAorICoKKyAqICAgQGF1dGhvcjogRGFuaWxvIENlc2FyIExlbWVzIGRlIFBhdWxhIDxkYW5pbG8uZXVAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX09QVVNfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfT1BVU19QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX09QVVNfUEFZIFwKKyAgKGdzdF9ydHBfb3B1c19wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9PUFVTX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9PUFVTX1BBWSxHc3RSdHBPUFVTUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9PUFVTX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfT1BVU19QQVksR3N0UnRwT1BVU1BheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9PUFVTX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9PUFVTX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfT1BVU19QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX09QVVNfUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cE9QVVNQYXkgR3N0UnRwT1BVU1BheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBPUFVTUGF5Q2xhc3MgR3N0UnRwT1BVU1BheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cE9QVVNQYXkKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWQgcGF5bG9hZDsKK307CisKK3N0cnVjdCBfR3N0UnRwT1BVU1BheUNsYXNzCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9vcHVzX3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfb3B1c19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfT1BVU19QQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzZhMjBhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYwpAQCAtMCwwICsxLDE2NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFplZXNoYW4gQWxpIDx6ZWVuaXhAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlICJnc3RydHBwY21hZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCisvKiBSdHBQY21hRGVwYXkgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCitlbnVtCit7CisgIFBST1BfMAorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfcGNtYV9kZXBheV9zaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9QQ01BX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMDsiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSBbMSwgTUFYIF0sIGVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIlBDTUFcIiIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfcGNtYV9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtYWxhdywgY2hhbm5lbHMgPSAoaW50KSAxLCByYXRlID0gKGludCkgWzEsIE1BWCBdIikKKyAgICApOworCitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX3BjbWFfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfcGNtYV9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworI2RlZmluZSBnc3RfcnRwX3BjbWFfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwUGNtYURlcGF5LCBnc3RfcnRwX3BjbWFfZGVwYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfREVQQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcGNtYV9kZXBheV9jbGFzc19pbml0IChHc3RSdHBQY21hRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9wY21hX2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfcGNtYV9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBQQ01BIGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBQQ01BIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMiLAorICAgICAgIkVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+LCBaZWVzaGFuIEFsaSA8emVlbml4QGdtYWlsLmNvbT4iKTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX3BjbWFfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX3BjbWFfZGVwYXlfc2V0Y2FwczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcGNtYV9kZXBheV9pbml0IChHc3RSdHBQY21hRGVwYXkgKiBydHBwY21hZGVwYXkpCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgKmRlcGF5bG9hZDsKKworICBkZXBheWxvYWQgPSBHU1RfUlRQX0JBU0VfREVQQVlMT0FEIChydHBwY21hZGVwYXkpOworCisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3BjbWFfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBnYm9vbGVhbiByZXQ7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkKKyAgICBjbG9ja19yYXRlID0gODAwMDsgICAgICAgICAgLyogZGVmYXVsdCAqLworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1hbGF3IiwKKyAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDEsICJyYXRlIiwgR19UWVBFX0lOVCwgY2xvY2tfcmF0ZSwgTlVMTCk7CisgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9wY21hX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBnYm9vbGVhbiBtYXJrZXI7CisgIGd1aW50IGxlbjsKKworICBtYXJrZXIgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApOworCisgIEdTVF9ERUJVRyAoInByb2Nlc3MgOiBnb3QgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcywgbWFyayAlZCB0cyAldSBzZXFuICVkIiwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKHJ0cC0+YnVmZmVyKSwgbWFya2VyLAorICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X3RpbWVzdGFtcCAocnRwKSwgZ3N0X3J0cF9idWZmZXJfZ2V0X3NlcSAocnRwKSk7CisKKyAgbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9idWZmZXIgKHJ0cCk7CisKKyAgaWYgKG91dGJ1ZikgeworICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChsZW4sIEdTVF9TRUNPTkQsIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSk7CisKKyAgICBpZiAobWFya2VyKSB7CisgICAgICAvKiBtYXJrIHN0YXJ0IG9mIHRhbGtzcHVydCB3aXRoIFJFU1lOQyAqLworICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfUkVTWU5DKTsKKyAgICB9CisKKyAgICBnc3RfcnRwX2Ryb3Bfbm9uX2F1ZGlvX21ldGEgKGRlcGF5bG9hZCwgb3V0YnVmKTsKKyAgfQorCisgIHJldHVybiBvdXRidWY7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX3BjbWFfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBwY21hZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfUENNQV9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjY0YTJkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuaApAQCAtMCwwICsxLDUzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgCisgKi8KKyAKKyNpZm5kZWYgX19HU1RfUlRQX1BDTUFfREVQQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9QQ01BX0RFUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBQY21hRGVwYXkgR3N0UnRwUGNtYURlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFBjbWFEZXBheUNsYXNzIEdzdFJ0cFBjbWFEZXBheUNsYXNzOworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9QQ01BX0RFUEFZIFwKKyAgKGdzdF9ydHBfcGNtYV9kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX1BDTUFfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfUENNQV9ERVBBWSxHc3RSdHBQY21hRGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX1BDTUFfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX1BDTUFfREVQQVksR3N0UnRwUGNtYURlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1BDTUFfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfUENNQV9ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfUENNQV9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfUENNQV9ERVBBWSkpCisKK3N0cnVjdCBfR3N0UnRwUGNtYURlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworfTsKKworc3RydWN0IF9Hc3RSdHBQY21hRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9wY21hX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9wY21hX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX1BDTUFfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwcGNtYXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZTFiNjQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYwpAQCAtMCwwICsxLDExNiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IE5va2lhIENvcnBvcmF0aW9uIDxrYWkudmVobWFuZW5Abm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworI2luY2x1ZGUgImdzdHJ0cHBjbWFwYXkuaCIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfcGNtYV9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LWFsYXcsIGNoYW5uZWxzPShpbnQpMSwgcmF0ZT0oaW50KTgwMDAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3BjbWFfcGF5X3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX1BDTUFfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA4MDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJQQ01BXCI7ICIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSBbMSwgTUFYIF0sICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIlBDTUFcIiIpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfcGNtYV9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworI2RlZmluZSBnc3RfcnRwX3BjbWFfcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cFBjbWFQYXksIGdzdF9ydHBfcGNtYV9wYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfQVVESU9fUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3BjbWFfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cFBjbWFQYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfcGNtYV9wYXlfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfcGNtYV9wYXlfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUlRQIFBDTUEgcGF5bG9hZGVyIiwKKyAgICAgICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBheWxvYWQtZW5jb2RlcyBQQ01BIGF1ZGlvIGludG8gYSBSVFAgcGFja2V0IiwKKyAgICAgICJFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPiIpOworCisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfcGNtYV9wYXlfc2V0Y2FwczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcGNtYV9wYXlfaW5pdCAoR3N0UnRwUGNtYVBheSAqIHJ0cHBjbWFwYXkpCit7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgKnJ0cGJhc2VhdWRpb3BheWxvYWQ7CisKKyAgcnRwYmFzZWF1ZGlvcGF5bG9hZCA9IEdTVF9SVFBfQkFTRV9BVURJT19QQVlMT0FEIChydHBwY21hcGF5KTsKKworICBHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwcGNtYXBheSktPnB0ID0gR1NUX1JUUF9QQVlMT0FEX1BDTUE7CisgIEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBwY21hcGF5KS0+Y2xvY2tfcmF0ZSA9IDgwMDA7CisKKyAgLyogdGVsbCBydHBiYXNlYXVkaW9wYXlsb2FkIHRoYXQgdGhpcyBpcyBhIHNhbXBsZSBiYXNlZCBjb2RlYyAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfc2FtcGxlX2Jhc2VkIChydHBiYXNlYXVkaW9wYXlsb2FkKTsKKworICAvKiBvY3RldC1wZXItc2FtcGxlIGlzIDEgZm9yIFBDTSAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfc2FtcGxlX29wdGlvbnMgKHJ0cGJhc2VhdWRpb3BheWxvYWQsIDEpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfcGNtYV9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2Jvb2xlYW4gcmVzOworCisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChwYXlsb2FkLCAiYXVkaW8iLAorICAgICAgcGF5bG9hZC0+cHQgIT0gR1NUX1JUUF9QQVlMT0FEX1BDTUEsICJQQ01BIiwgODAwMCk7CisgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChwYXlsb2FkLCBOVUxMKTsKKworICByZXR1cm4gcmVzOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9wY21hX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHBjbWFwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfUENNQV9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBwY21hcGF5LmggYi9nc3QvcnRwL2dzdHJ0cHBjbWFwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTA4NGFkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBwY21hcGF5LmgKQEAgLTAsMCArMSw1NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIAorICovCisKKworI2lmbmRlZiBfX0dTVF9SVFBfUENNQV9QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9QQ01BX1BBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VhdWRpb3BheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwUGNtYVBheSBHc3RSdHBQY21hUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFBjbWFQYXlDbGFzcyBHc3RSdHBQY21hUGF5Q2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1BDTUFfUEFZIFwKKyAgKGdzdF9ydHBfcGNtYV9wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9QQ01BX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9QQ01BX1BBWSxHc3RSdHBQY21hUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9QQ01BX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfUENNQV9QQVksR3N0UnRwUGNtYVBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9QQ01BX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9QQ01BX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfUENNQV9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX1BDTUFfUEFZKSkKKworc3RydWN0IF9Hc3RSdHBQY21hUGF5Cit7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgYXVkaW9wYXlsb2FkOworfTsKKworc3RydWN0IF9Hc3RSdHBQY21hUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfcGNtYV9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX3BjbWFfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX1BDTUFfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEwNmQxOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmMKQEAgLTAsMCArMSwxNjUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBaZWVzaGFuIEFsaSA8emVlbml4QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSAiZ3N0cnRwcGNtdWRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworLyogUnRwUGNtdURlcGF5IHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3BjbXVfZGVwYXlfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfUENNVV9TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDA7ICIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiUENNVVwiLCBjbG9jay1yYXRlID0gKGludCkgWzEsIE1BWCBdIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9wY211X2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1tdWxhdywgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCByYXRlID0gKGludCkgWzEsIE1BWCBdIikKKyAgICApOworCitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX3BjbXVfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfcGNtdV9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworI2RlZmluZSBnc3RfcnRwX3BjbXVfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwUGNtdURlcGF5LCBnc3RfcnRwX3BjbXVfZGVwYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfREVQQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcGNtdV9kZXBheV9jbGFzc19pbml0IChHc3RSdHBQY211RGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9wY211X2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfcGNtdV9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBQQ01VIGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBQQ01VIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMiLAorICAgICAgIkVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+LCBaZWVzaGFuIEFsaSA8emVlbml4QGdtYWlsLmNvbT4iKTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX3BjbXVfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX3BjbXVfZGVwYXlfc2V0Y2FwczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcGNtdV9kZXBheV9pbml0IChHc3RSdHBQY211RGVwYXkgKiBydHBwY211ZGVwYXkpCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgKmRlcGF5bG9hZDsKKworICBkZXBheWxvYWQgPSBHU1RfUlRQX0JBU0VfREVQQVlMT0FEIChydHBwY211ZGVwYXkpOworCisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3BjbXVfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBnYm9vbGVhbiByZXQ7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkKKyAgICBjbG9ja19yYXRlID0gODAwMDsgICAgICAgICAgLyogZGVmYXVsdCAqLworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1tdWxhdyIsCisgICAgICAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAxLCAicmF0ZSIsIEdfVFlQRV9JTlQsIGNsb2NrX3JhdGUsIE5VTEwpOworICByZXQgPSBnc3RfcGFkX3NldF9jYXBzIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NSQ1BBRCAoZGVwYXlsb2FkKSwgc3JjY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfcGNtdV9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdEJ1ZmZlciAqb3V0YnVmID0gTlVMTDsKKyAgZ3VpbnQgbGVuOworICBnYm9vbGVhbiBtYXJrZXI7CisKKyAgbWFya2VyID0gZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAocnRwKTsKKworICBHU1RfREVCVUcgKCJwcm9jZXNzIDogZ290ICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMsIG1hcmsgJWQgdHMgJXUgc2VxbiAlZCIsCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChydHAtPmJ1ZmZlciksIG1hcmtlciwKKyAgICAgIGdzdF9ydHBfYnVmZmVyX2dldF90aW1lc3RhbXAgKHJ0cCksIGdzdF9ydHBfYnVmZmVyX2dldF9zZXEgKHJ0cCkpOworCisgIGxlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAocnRwKTsKKyAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfYnVmZmVyIChydHApOworCisgIGlmIChvdXRidWYpIHsKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0KKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAobGVuLCBHU1RfU0VDT05ELCBkZXBheWxvYWQtPmNsb2NrX3JhdGUpOworCisgICAgaWYgKG1hcmtlcikgeworICAgICAgLyogbWFyayBzdGFydCBvZiB0YWxrc3B1cnQgd2l0aCBSRVNZTkMgKi8KKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX1JFU1lOQyk7CisgICAgfQorCisgICAgZ3N0X3J0cF9kcm9wX25vbl9hdWRpb19tZXRhIChkZXBheWxvYWQsIG91dGJ1Zik7CisgIH0KKworICByZXR1cm4gb3V0YnVmOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9wY211X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwcGNtdWRlcGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX1BDTVVfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE5NzU1OQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmgKQEAgLTAsMCArMSw1MyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIAorICovCisgCisjaWZuZGVmIF9fR1NUX1JUUF9QQ01VX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfUENNVV9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwUGNtdURlcGF5IEdzdFJ0cFBjbXVEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBQY211RGVwYXlDbGFzcyBHc3RSdHBQY211RGVwYXlDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfUENNVV9ERVBBWSBcCisgIChnc3RfcnRwX3BjbXVfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9QQ01VX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1BDTVVfREVQQVksR3N0UnRwUGNtdURlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9QQ01VX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9QQ01VX0RFUEFZLEdzdFJ0cFBjbXVEZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9QQ01VX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1BDTVVfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX1BDTVVfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX1BDTVVfREVQQVkpKQorCitzdHJ1Y3QgX0dzdFJ0cFBjbXVEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKK307CisKK3N0cnVjdCBfR3N0UnRwUGNtdURlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfcGNtdV9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfcGNtdV9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9QQ01VX0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBwY211cGF5LmMgYi9nc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTMxZjg1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBwY211cGF5LmMKQEAgLTAsMCArMSwxMTYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBOb2tpYSBDb3Jwb3JhdGlvbiA8a2FpLnZlaG1hbmVuQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKKyNpbmNsdWRlICJnc3RydHBwY211cGF5LmgiCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3BjbXVfcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1tdWxhdywgY2hhbm5lbHM9KGludCkxLCByYXRlPShpbnQpODAwMCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfcGNtdV9wYXlfc3JjX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfUENNVV9TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIlBDTVVcIjsgIgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVggXSwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiUENNVVwiIikKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9wY211X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworCisjZGVmaW5lIGdzdF9ydHBfcGNtdV9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwUGNtdVBheSwgZ3N0X3J0cF9wY211X3BheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9BVURJT19QQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcGNtdV9wYXlfY2xhc3NfaW5pdCAoR3N0UnRwUGNtdVBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9wY211X3BheV9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9wY211X3BheV9zcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJSVFAgUENNVSBwYXlsb2FkZXIiLAorICAgICAgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZC1lbmNvZGVzIFBDTVUgYXVkaW8gaW50byBhIFJUUCBwYWNrZXQiLAorICAgICAgIkVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+Iik7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9wY211X3BheV9zZXRjYXBzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9wY211X3BheV9pbml0IChHc3RSdHBQY211UGF5ICogcnRwcGNtdXBheSkKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZCAqcnRwYmFzZWF1ZGlvcGF5bG9hZDsKKworICBydHBiYXNlYXVkaW9wYXlsb2FkID0gR1NUX1JUUF9CQVNFX0FVRElPX1BBWUxPQUQgKHJ0cHBjbXVwYXkpOworCisgIEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBwY211cGF5KS0+cHQgPSBHU1RfUlRQX1BBWUxPQURfUENNVTsKKyAgR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHJ0cHBjbXVwYXkpLT5jbG9ja19yYXRlID0gODAwMDsKKworICAvKiB0ZWxsIHJ0cGJhc2VhdWRpb3BheWxvYWQgdGhhdCB0aGlzIGlzIGEgc2FtcGxlIGJhc2VkIGNvZGVjICovCisgIGdzdF9ydHBfYmFzZV9hdWRpb19wYXlsb2FkX3NldF9zYW1wbGVfYmFzZWQgKHJ0cGJhc2VhdWRpb3BheWxvYWQpOworCisgIC8qIG9jdGV0LXBlci1zYW1wbGUgaXMgMSBmb3IgUENNICovCisgIGdzdF9ydHBfYmFzZV9hdWRpb19wYXlsb2FkX3NldF9zYW1wbGVfb3B0aW9ucyAocnRwYmFzZWF1ZGlvcGF5bG9hZCwgMSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9wY211X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBnYm9vbGVhbiByZXM7CisKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHBheWxvYWQsICJhdWRpbyIsCisgICAgICBwYXlsb2FkLT5wdCAhPSBHU1RfUlRQX1BBWUxPQURfUENNVSwgIlBDTVUiLCA4MDAwKTsKKyAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHBheWxvYWQsIE5VTEwpOworCisgIHJldHVybiByZXM7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX3BjbXVfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwcGNtdXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9QQ01VX1BBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHBjbXVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwcGNtdXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MjlkNDYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHBjbXVwYXkuaApAQCAtMCwwICsxLDU0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1JUUF9QQ01VX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1BDTVVfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWF1ZGlvcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBQY211UGF5IEdzdFJ0cFBjbXVQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwUGNtdVBheUNsYXNzIEdzdFJ0cFBjbXVQYXlDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfUENNVV9QQVkgXAorICAoZ3N0X3J0cF9wY211X3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX1BDTVVfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1BDTVVfUEFZLEdzdFJ0cFBjbXVQYXkpKQorI2RlZmluZSBHU1RfUlRQX1BDTVVfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9QQ01VX1BBWSxHc3RSdHBQY211UGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1BDTVVfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1BDTVVfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9QQ01VX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfUENNVV9QQVkpKQorCitzdHJ1Y3QgX0dzdFJ0cFBjbXVQYXkKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZCBhdWRpb3BheWxvYWQ7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cFBjbXVQYXlDbGFzcworeworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9wY211X3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfcGNtdV9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfUENNVV9QQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHFjZWxwZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNWQ5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHFjZWxwZGVwYXkuYwpAQCAtMCwwICsxLDQzMiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDEwPiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdzdHJ0cHFjZWxwZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBxY2VscGRlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBxY2VscGRlcGF5X2RlYnVnKQorCisvKiByZWZlcmVuY2VzOgorICoKKyAqIFJGQyAyNjU4IC0gUlRQIFBheWxvYWQgRm9ybWF0IGZvciBQdXJlVm9pY2UodG0pIEF1ZGlvCisgKi8KKyNkZWZpbmUgRlJBTUVfRFVSQVRJT04gKDIwICogR1NUX01TRUNPTkQpCisKKy8qIFJ0cFFDRUxQRGVwYXkgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCitlbnVtCit7CisgIFBST1BfMAorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfcWNlbHBfZGVwYXlfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMCwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiUUNFTFBcIjsgIgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfUUNFTFBfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA4MDAwIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9xY2VscF9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3FjZWxwLCAiICJjaGFubmVscyA9IChpbnQpIDEsIiAicmF0ZSA9IChpbnQpIDgwMDAiKQorICAgICk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfcWNlbHBfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9xY2VscF9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfcWNlbHBfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworCisjZGVmaW5lIGdzdF9ydHBfcWNlbHBfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwUUNFTFBEZXBheSwgZ3N0X3J0cF9xY2VscF9kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9xY2VscF9kZXBheV9jbGFzc19pbml0IChHc3RSdHBRQ0VMUERlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9xY2VscF9kZXBheV9maW5hbGl6ZTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX3FjZWxwX2RlcGF5X3Byb2Nlc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9xY2VscF9kZXBheV9zZXRjYXBzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfcWNlbHBfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9xY2VscF9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBRQ0VMUCBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgUUNFTFAgKFB1cmVWb2ljZSkgYXVkaW8gZnJvbSBSVFAgcGFja2V0cyAoUkZDIDI2NTgpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBxY2VscGRlcGF5X2RlYnVnLCAicnRwcWNlbHBkZXBheSIsIDAsCisgICAgICAiUUNFTFAgUlRQIERlcGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3FjZWxwX2RlcGF5X2luaXQgKEdzdFJ0cFFDRUxQRGVwYXkgKiBydHBxY2VscGRlcGF5KQoreworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9xY2VscF9kZXBheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwUUNFTFBEZXBheSAqZGVwYXk7CisKKyAgZGVwYXkgPSBHU1RfUlRQX1FDRUxQX0RFUEFZIChvYmplY3QpOworCisgIGlmIChkZXBheS0+cGFja2V0cyAhPSBOVUxMKSB7CisgICAgZ19wdHJfYXJyYXlfZm9yZWFjaCAoZGVwYXktPnBhY2tldHMsIChHRnVuYykgZ3N0X2J1ZmZlcl91bnJlZiwgTlVMTCk7CisgICAgZ19wdHJfYXJyYXlfZnJlZSAoZGVwYXktPnBhY2tldHMsIFRSVUUpOworICAgIGRlcGF5LT5wYWNrZXRzID0gTlVMTDsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfcWNlbHBfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIGdib29sZWFuIHJlczsKKworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3FjZWxwIiwKKyAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDEsICJyYXRlIiwgR19UWVBFX0lOVCwgODAwMCwgTlVMTCk7CisgIHJlcyA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBjb25zdCBnaW50IGZyYW1lX3NpemVbMTZdID0geworICAxLCA0LCA4LCAxNywgMzUsIC04LCAwLCAwLAorICAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwCit9OworCisvKiBnZXQgdGhlIGZyYW1lIGxlbmd0aCwgMCBpcyBpbnZhbGlkLCBuZWdhdGl2ZSB2YWx1ZXMgYXJlIGludmFsaWQgYnV0IGNhbiBiZQorICogcmVjb3ZlcmVkIGZyb20uICovCitzdGF0aWMgZ2ludAorZ2V0X2ZyYW1lX2xlbiAoR3N0UnRwUUNFTFBEZXBheSAqIGRlcGF5LCBndWludDggZnJhbWVfdHlwZSkKK3sKKyAgaWYgKGZyYW1lX3R5cGUgPj0gR19OX0VMRU1FTlRTIChmcmFtZV9zaXplKSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gZnJhbWVfc2l6ZVtmcmFtZV90eXBlXTsKK30KKworc3RhdGljIGd1aW50Citjb3VudF9wYWNrZXRzIChHc3RSdHBRQ0VMUERlcGF5ICogZGVwYXksIGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUpCit7CisgIGd1aW50IGNvdW50ID0gMDsKKworICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICBnaW50IGZyYW1lX2xlbjsKKworICAgIGZyYW1lX2xlbiA9IGdldF9mcmFtZV9sZW4gKGRlcGF5LCBkYXRhWzBdKTsKKworICAgIC8qIDAgaXMgaW52YWxpZCBhbmQgd2UgdGhyb3cgYXdheSB0aGUgcmVtYWluZGVyIG9mIHRoZSBmcmFtZXMgKi8KKyAgICBpZiAoZnJhbWVfbGVuID09IDApCisgICAgICBicmVhazsKKworICAgIGlmIChmcmFtZV9sZW4gPCAwKQorICAgICAgZnJhbWVfbGVuID0gLWZyYW1lX2xlbjsKKworICAgIGlmIChmcmFtZV9sZW4gPiBzaXplKQorICAgICAgYnJlYWs7CisKKyAgICBzaXplIC09IGZyYW1lX2xlbjsKKyAgICBkYXRhICs9IGZyYW1lX2xlbjsKKyAgICBjb3VudCsrOworICB9CisgIHJldHVybiBjb3VudDsKK30KKworc3RhdGljIHZvaWQKK2ZsdXNoX3BhY2tldHMgKEdzdFJ0cFFDRUxQRGVwYXkgKiBkZXBheSkKK3sKKyAgZ3VpbnQgaSwgc2l6ZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZXBheSwgImZsdXNoaW5nIHBhY2tldHMiKTsKKworICBzaXplID0gZGVwYXktPnBhY2tldHMtPmxlbjsKKworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgR3N0QnVmZmVyICpvdXRidWY7CisKKyAgICBvdXRidWYgPSBnX3B0cl9hcnJheV9pbmRleCAoZGVwYXktPnBhY2tldHMsIGkpOworICAgIGdfcHRyX2FycmF5X2luZGV4IChkZXBheS0+cGFja2V0cywgaSkgPSBOVUxMOworCisgICAgZ3N0X3J0cF9iYXNlX2RlcGF5bG9hZF9wdXNoIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEIChkZXBheSksIG91dGJ1Zik7CisgIH0KKworICAvKiBhbmQgcmVzZXQgaW50ZXJsZWF2aW5nIHN0YXRlICovCisgIGRlcGF5LT5pbnRlcmxlYXZlZCA9IEZBTFNFOworICBkZXBheS0+YnVuZGxpbmcgPSAwOworfQorCitzdGF0aWMgdm9pZAorYWRkX3BhY2tldCAoR3N0UnRwUUNFTFBEZXBheSAqIGRlcGF5LCBndWludCBMTEwsIGd1aW50IE5OTiwgZ3VpbnQgaW5kZXgsCisgICAgR3N0QnVmZmVyICogb3V0YnVmKQoreworICBndWludCBpZHg7CisgIEdzdEJ1ZmZlciAqb2xkOworCisgIC8qIGZpZ3VyZSBvdXQgdGhlIHBvc2l0aW9uIGluIHRoZSBhcnJheSwgbm90ZSB0aGF0IGluZGV4IGlzIG5ldmVyIDAgYmVjYXVzZSB3ZQorICAgKiBwdXNoIHRob3NlIHBhY2tldHMgaW1tZWRpYXRlbHkuICovCisgIGlkeCA9IE5OTiArICgoTExMICsgMSkgKiAoaW5kZXggLSAxKSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXksICJhZGRpbmcgcGFja2V0IGF0IGluZGV4ICV1IiwgaWR4KTsKKyAgLyogZnJlZSBvbGQgYnVmZmVyIChzaG91bGQgbm90IGhhcHBlbikgKi8KKyAgb2xkID0gZ19wdHJfYXJyYXlfaW5kZXggKGRlcGF5LT5wYWNrZXRzLCBpZHgpOworICBpZiAob2xkKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKG9sZCk7CisKKyAgLyogc3RvcmUgbmV3IGJ1ZmZlciAqLworICBnX3B0cl9hcnJheV9pbmRleCAoZGVwYXktPnBhY2tldHMsIGlkeCkgPSBvdXRidWY7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorY3JlYXRlX2VyYXN1cmVfYnVmZmVyIChHc3RSdHBRQ0VMUERlcGF5ICogZGVwYXkpCit7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHc3RNYXBJbmZvIG1hcDsKKworICBvdXRidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEpOworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgbWFwLmRhdGFbMF0gPSAxNDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICByZXR1cm4gb3V0YnVmOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfcWNlbHBfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cFFDRUxQRGVwYXkgKmRlcGF5OworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKyAgZ3VpbnQgcGF5bG9hZF9sZW4sIG9mZnNldCwgaW5kZXg7CisgIGd1aW50OCAqcGF5bG9hZDsKKyAgZ3VpbnQgTExMLCBOTk47CisKKyAgZGVwYXkgPSBHU1RfUlRQX1FDRUxQX0RFUEFZIChkZXBheWxvYWQpOworCisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworCisgIGlmIChwYXlsb2FkX2xlbiA8IDIpCisgICAgZ290byB0b29fc21hbGw7CisKKyAgdGltZXN0YW1wID0gR1NUX0JVRkZFUl9QVFMgKHJ0cC0+YnVmZmVyKTsKKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisKKyAgLyogIDAgMSAyIDMgNCA1IDYgNworICAgKiArLSstKy0rLSstKy0rLSstKworICAgKiB8UlIgfCBMTEwgfCBOTk4gfAorICAgKiArLSstKy0rLSstKy0rLSstKworICAgKi8KKyAgLyogUlIgPSBwYXlsb2FkWzBdID4+IDY7ICovCisgIExMTCA9IChwYXlsb2FkWzBdICYgMHgzOCkgPj4gMzsKKyAgTk5OID0gKHBheWxvYWRbMF0gJiAweDA3KTsKKworICBwYXlsb2FkX2xlbi0tOworICBwYXlsb2FkKys7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXksICJMTEwgJXUsIE5OTiAldSIsIExMTCwgTk5OKTsKKworICBpZiAoTExMID4gNSkKKyAgICBnb3RvIGludmFsaWRfbGxsOworCisgIGlmIChOTk4gPiBMTEwpCisgICAgZ290byBpbnZhbGlkX25ubjsKKworICBpZiAoTExMICE9IDApIHsKKyAgICAvKiB3ZSBhcmUgaW50ZXJsZWF2ZWQgKi8KKyAgICBpZiAoIWRlcGF5LT5pbnRlcmxlYXZlZCkgeworICAgICAgZ3VpbnQgc2l6ZTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXksICJzdGFydGluZyBpbnRlcmxlYXZpbmcgZ3JvdXAiKTsKKyAgICAgIC8qIGJ1bmRsaW5nIGlzIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSBpbiBvbmUgaW50ZXJsZWF2ZSBncm91cCAqLworICAgICAgZGVwYXktPmJ1bmRsaW5nID0gY291bnRfcGFja2V0cyAoZGVwYXksIHBheWxvYWQsIHBheWxvYWRfbGVuKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5LCAiZ290IGJ1bmRsaW5nIG9mICV1IiwgZGVwYXktPmJ1bmRsaW5nKTsKKyAgICAgIC8qIHdlIGhhdmUgb25lIGJ1bmRsZSB3aGVyZSBOTk4gZ29lcyBmcm9tIDAgdG8gTCwgd2UgZG9uJ3Qgc3RvcmUgdGhlIGluZGV4CisgICAgICAgKiAwIGZyYW1lcywgc28gTCsxIHBhY2tldHMuIEVhY2ggcGFja2V0IGhhcyAnYnVuZGxpbmcgLSAxJyBwYWNrZXRzICovCisgICAgICBzaXplID0gKGRlcGF5LT5idW5kbGluZyAtIDEpICogKExMTCArIDEpOworICAgICAgLyogY3JlYXRlIHRoZSBhcnJheSB0byBob2xkIHRoZSBwYWNrZXRzICovCisgICAgICBpZiAoZGVwYXktPnBhY2tldHMgPT0gTlVMTCkKKyAgICAgICAgZGVwYXktPnBhY2tldHMgPSBnX3B0cl9hcnJheV9zaXplZF9uZXcgKHNpemUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXksICJjcmVhdGVkIHBhY2tldCBhcnJheSBvZiBzaXplICV1Iiwgc2l6ZSk7CisgICAgICBnX3B0cl9hcnJheV9zZXRfc2l6ZSAoZGVwYXktPnBhY2tldHMsIHNpemUpOworICAgICAgLyogd2Ugd2VyZSBwcmV2aW91c2x5IG5vdCBpbnRlcmxlYXZlZCwgZmlndXJlIG91dCBob3cgbXVjaCBzcGFjZSB3ZQorICAgICAgICogbmVlZCB0byBkZWludGVybGVhdmUgKi8KKyAgICAgIGRlcGF5LT5pbnRlcmxlYXZlZCA9IFRSVUU7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIHdlIGFyZSBub3QgaW50ZXJsZWF2ZWQgKi8KKyAgICBpZiAoZGVwYXktPmludGVybGVhdmVkKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheSwgInN0b3BwaW5nIGludGVybGVhdmluZyIpOworICAgICAgLyogZmx1c2ggcGFja2V0cyBpZiB3ZSB3ZXJlIHByZXZpb3VzbHkgaW50ZXJsZWF2ZWQgKi8KKyAgICAgIGZsdXNoX3BhY2tldHMgKGRlcGF5KTsKKyAgICB9CisgICAgZGVwYXktPmJ1bmRsaW5nID0gMDsKKyAgfQorCisgIGluZGV4ID0gMDsKKyAgb2Zmc2V0ID0gMTsKKworICB3aGlsZSAocGF5bG9hZF9sZW4gPiAwKSB7CisgICAgZ2ludCBmcmFtZV9sZW47CisgICAgZ2Jvb2xlYW4gZG9fZXJhc3VyZTsKKworICAgIGZyYW1lX2xlbiA9IGdldF9mcmFtZV9sZW4gKGRlcGF5LCBwYXlsb2FkWzBdKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheSwgImdvdCBmcmFtZSBsZW4gJWQiLCBmcmFtZV9sZW4pOworCisgICAgaWYgKGZyYW1lX2xlbiA9PSAwKQorICAgICAgZ290byBpbnZhbGlkX2ZyYW1lOworCisgICAgaWYgKGZyYW1lX2xlbiA8IDApIHsKKyAgICAgIC8qIG5lZWQgdG8gYWRkIGFuIGVyYXN1cmUgZnJhbWUgYnV0IHdlIGNhbiByZWNvdmVyICovCisgICAgICBmcmFtZV9sZW4gPSAtZnJhbWVfbGVuOworICAgICAgZG9fZXJhc3VyZSA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIGRvX2VyYXN1cmUgPSBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoZnJhbWVfbGVuID4gcGF5bG9hZF9sZW4pCisgICAgICBnb3RvIGludmFsaWRfZnJhbWU7CisKKyAgICBpZiAoZG9fZXJhc3VyZSkgeworICAgICAgLyogY3JlYXRlIGVyYXN1cmUgZnJhbWUgKi8KKyAgICAgIG91dGJ1ZiA9IGNyZWF0ZV9lcmFzdXJlX2J1ZmZlciAoZGVwYXkpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBlYWNoIGZyYW1lIGdvZXMgaW50byBpdHMgYnVmZmVyICovCisgICAgICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgKHJ0cCwgb2Zmc2V0LCBmcmFtZV9sZW4pOworICAgIH0KKworICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gdGltZXN0YW1wOworICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPSBGUkFNRV9EVVJBVElPTjsKKworICAgIGdzdF9ydHBfZHJvcF9ub25fYXVkaW9fbWV0YSAoZGVwYXlsb2FkLCBvdXRidWYpOworCisgICAgaWYgKCFkZXBheS0+aW50ZXJsZWF2ZWQgfHwgaW5kZXggPT0gMCkgeworICAgICAgLyogbm90IGludGVybGVhdmVkIG9yIGZpcnN0IGZyYW1lIGluIHBhY2tldCwganVzdCBwdXNoICovCisgICAgICBnc3RfcnRwX2Jhc2VfZGVwYXlsb2FkX3B1c2ggKGRlcGF5bG9hZCwgb3V0YnVmKTsKKworICAgICAgaWYgKHRpbWVzdGFtcCAhPSAtMSkKKyAgICAgICAgdGltZXN0YW1wICs9IEZSQU1FX0RVUkFUSU9OOworICAgIH0gZWxzZSB7CisgICAgICAvKiBwdXQgaW4gaW50ZXJsZWF2ZSBidWZmZXIgKi8KKyAgICAgIGFkZF9wYWNrZXQgKGRlcGF5LCBMTEwsIE5OTiwgaW5kZXgsIG91dGJ1Zik7CisKKyAgICAgIGlmICh0aW1lc3RhbXAgIT0gLTEpCisgICAgICAgIHRpbWVzdGFtcCArPSAoRlJBTUVfRFVSQVRJT04gKiAoTExMICsgMSkpOworICAgIH0KKworICAgIHBheWxvYWRfbGVuIC09IGZyYW1lX2xlbjsKKyAgICBwYXlsb2FkICs9IGZyYW1lX2xlbjsKKyAgICBvZmZzZXQgKz0gZnJhbWVfbGVuOworICAgIGluZGV4Kys7CisKKyAgICAvKiBkaXNjYXJkIGV4Y2VzcyBwYWNrZXRzICovCisgICAgaWYgKGRlcGF5LT5idW5kbGluZyA+IDAgJiYgZGVwYXktPmJ1bmRsaW5nIDw9IGluZGV4KQorICAgICAgYnJlYWs7CisgIH0KKyAgd2hpbGUgKGluZGV4IDwgZGVwYXktPmJ1bmRsaW5nKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXksICJmaWxsaW5nIHdpdGggZXJhc3VyZSBidWZmZXIiKTsKKyAgICAvKiBmaWxsIHJlbWFpbmRlciB3aXRoIGVyYXN1cmUgcGFja2V0cyAqLworICAgIG91dGJ1ZiA9IGNyZWF0ZV9lcmFzdXJlX2J1ZmZlciAoZGVwYXkpOworICAgIGFkZF9wYWNrZXQgKGRlcGF5LCBMTEwsIE5OTiwgaW5kZXgsIG91dGJ1Zik7CisgICAgaW5kZXgrKzsKKyAgfQorICBpZiAoZGVwYXktPmludGVybGVhdmVkICYmIExMTCA9PSBOTk4pIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheSwgImludGVybGVhdmUgZ3JvdXAgZW5kZWQsIGZsdXNoaW5nIik7CisgICAgLyogd2UgaGF2ZSB0aGUgY29tcGxldGUgaW50ZXJsZWF2ZSBncm91cCwgZmx1c2ggKi8KKyAgICBmbHVzaF9wYWNrZXRzIChkZXBheSk7CisgIH0KKworICByZXR1cm4gTlVMTDsKKworICAvKiBFUlJPUlMgKi8KK3Rvb19zbWFsbDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIlFDRUxQIFJUUCBwYXlsb2FkIHRvbyBzbWFsbCAoJWQpIiwgcGF5bG9hZF9sZW4pKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQoraW52YWxpZF9sbGw6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJRQ0VMUCBSVFAgaW52YWxpZCBMTEwgcmVjZWl2ZWQgKCVkKSIsIExMTCkpOworICAgIHJldHVybiBOVUxMOworICB9CitpbnZhbGlkX25ubjoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIlFDRUxQIFJUUCBpbnZhbGlkIE5OTiByZWNlaXZlZCAoJWQpIiwgTk5OKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2ludmFsaWRfZnJhbWU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJRQ0VMUCBSVFAgaW52YWxpZCBmcmFtZSByZWNlaXZlZCIpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3J0cF9xY2VscF9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHFjZWxwZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfUUNFTFBfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cHFjZWxwZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGUyNzRkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmgKQEAgLTAsMCArMSw2MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDEwPiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1FDRUxQX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfUUNFTFBfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfUUNFTFBfREVQQVkgXAorICAoZ3N0X3J0cF9xY2VscF9kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX1FDRUxQX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1FDRUxQX0RFUEFZLEdzdFJ0cFFDRUxQRGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX1FDRUxQX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9RQ0VMUF9ERVBBWSxHc3RSdHBRQ0VMUERlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1FDRUxQX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1FDRUxQX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9RQ0VMUF9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfUUNFTFBfREVQQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwUUNFTFBEZXBheSBHc3RSdHBRQ0VMUERlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFFDRUxQRGVwYXlDbGFzcyBHc3RSdHBRQ0VMUERlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwUUNFTFBEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKKworICBnYm9vbGVhbiBpbnRlcmxlYXZlZDsKKyAgZ3VpbnQgYnVuZGxpbmc7CisgIEdQdHJBcnJheSAqcGFja2V0czsKK307CisKK3N0cnVjdCBfR3N0UnRwUUNFTFBEZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX3FjZWxwX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9xY2VscF9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9RQ0VMUF9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwcWRtZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwcWRtZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTg2NjNhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jCkBAIC0wLDAgKzEsNDE0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSAiZ3N0cnRwcWRtZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUlkgKHJ0cHFkbTJkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBydHBxZG0yZGVwYXlfZGVidWcKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfcWRtMl9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcWRtMiIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfcWRtMl9kZXBheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpXCJYLVFETVwiIikKKyAgICApOworCisjZGVmaW5lIGdzdF9ydHBfcWRtMl9kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBRRE0yRGVwYXksIGdzdF9ydHBfcWRtMl9kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgY29uc3QgZ3VpbnQ4IGhlYWRoZWFkZXJbMjBdID0geworICAweDAsIDB4MCwgMHgwLCAweGMsIDB4NjYsIDB4NzIsIDB4NmQsIDB4NjEsCisgIDB4NTEsIDB4NDQsIDB4NGQsIDB4MzIsIDB4MCwgMHgwLCAweDAsIDB4MjQsCisgIDB4NTEsIDB4NDQsIDB4NDMsIDB4NDEKK307CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfcWRtMl9kZXBheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX3FkbTJfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9xZG0yX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKK2dib29sZWFuIGdzdF9ydHBfcWRtMl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZmlsdGVyLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcWRtMl9kZXBheV9jbGFzc19pbml0IChHc3RSdHBRRE0yRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+cHJvY2Vzc19ydHBfcGFja2V0ID0gZ3N0X3J0cF9xZG0yX2RlcGF5X3Byb2Nlc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9xZG0yX2RlcGF5X3NldGNhcHM7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX3FkbTJfZGVwYXlfZmluYWxpemU7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3J0cF9xZG0yX2RlcGF5X2NoYW5nZV9zdGF0ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3FkbTJfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9xZG0yX2RlcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIFFETTIgZGVwYXlsb2FkZXIiLAorICAgICAgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBRRE0yIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgKG5vIFJGQykiLAorICAgICAgIkVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3FkbTJfZGVwYXlfaW5pdCAoR3N0UnRwUURNMkRlcGF5ICogcnRwcWRtMmRlcGF5KQoreworICBydHBxZG0yZGVwYXktPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3FkbTJfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cFFETTJEZXBheSAqcnRwcWRtMmRlcGF5OworCisgIHJ0cHFkbTJkZXBheSA9IEdTVF9SVFBfUURNMl9ERVBBWSAob2JqZWN0KTsKKworICBnX29iamVjdF91bnJlZiAocnRwcWRtMmRlcGF5LT5hZGFwdGVyKTsKKyAgcnRwcWRtMmRlcGF5LT5hZGFwdGVyID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKKy8qIG9ubHkgb24gdGhlIHNpbmsgKi8KK2dib29sZWFuCitnc3RfcnRwX3FkbTJfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGZpbHRlciwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkKKyAgICBjbG9ja19yYXRlID0gNDQxMDA7ICAgICAgICAgLyogZGVmYXVsdCAqLworICBmaWx0ZXItPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIC8qIHdpbGwgc2V0IGNhcHMgbGF0ZXIgKi8KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2ZsdXNoX2RhdGEgKEdzdFJ0cFFETTJEZXBheSAqIGRlcGF5KQoreworICBndWludCBpOworICBndWludCBhdmFpbDsKKworICBpZiAoKGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZXBheS0+YWRhcHRlcikpKQorICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChkZXBheS0+YWRhcHRlciwgYXZhaWwpOworCisgIEdTVF9ERUJVRyAoIkZsdXNoaW5nICVkIHBhY2tldHMiLCBkZXBheS0+bmJwYWNrZXRzKTsKKworICBmb3IgKGkgPSAwOyBkZXBheS0+cGFja2V0c1tpXTsgaSsrKSB7CisgICAgUURNMlBhY2tldCAqcGFjayA9IGRlcGF5LT5wYWNrZXRzW2ldOworICAgIGd1aW50MzIgY3JjID0gMDsKKyAgICBpbnQgaSA9IDA7CisgICAgR3N0QnVmZmVyICpidWY7CisgICAgZ3VpbnQ4ICpkYXRhOworCisgICAgLyogQ1JDIGlzIHRoZSBzdW0gb2YgZXZlcnl0aGluZyAoaW5jbHVkaW5nIGZpcnN0IGJ5dGVzKSAqLworCisgICAgZGF0YSA9IHBhY2stPmRhdGE7CisKKyAgICBpZiAoR19VTkxJS0VMWSAoZGF0YSA9PSBOVUxMKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogSWYgdGhlIHBhY2tldCBzaXplIGlzIGJpZ2dlciB0aGFuIDB4ZmYsIHdlIG5lZWQgMiBieXRlcyB0byBzdG9yZSB0aGUgc2l6ZSAqLworICAgIGlmIChkZXBheS0+cGFja2V0c2l6ZSA+IDB4ZmYpIHsKKyAgICAgIC8qIEV4cGFuZGVkIHNpemUgMHgwMiB8IDB4ODAgKi8KKyAgICAgIGRhdGFbMF0gPSAweDgyOworICAgICAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoZGF0YSArIDEsIGRlcGF5LT5wYWNrZXRzaXplIC0gMyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRhdGFbMF0gPSAweDI7CisgICAgICBkYXRhWzFdID0gZGVwYXktPnBhY2tldHNpemUgLSAyOworICAgIH0KKworICAgIC8qIENhbGN1bGF0ZSBDUkMgKi8KKyAgICBmb3IgKDsgaSA8IGRlcGF5LT5wYWNrZXRzaXplOyBpKyspCisgICAgICBjcmMgKz0gZGF0YVtpXTsKKworICAgIEdTVF9ERUJVRyAoIkNSQyBpcyAweCV4IiwgY3JjKTsKKworICAgIC8qIFdyaXRlIENSQyAqLworICAgIGlmIChkZXBheS0+cGFja2V0c2l6ZSA+IDB4ZmYpCisgICAgICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhICsgMywgY3JjKTsKKyAgICBlbHNlCisgICAgICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhICsgMiwgY3JjKTsKKworICAgIEdTVF9NRU1EVU1QICgiRXh0cmFjdGVkIHBhY2tldCIsIGRhdGEsIGRlcGF5LT5wYWNrZXRzaXplKTsKKworICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3ICgpOworICAgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAoYnVmLAorICAgICAgICBnc3RfbWVtb3J5X25ld193cmFwcGVkICgwLCBkYXRhLCBkZXBheS0+cGFja2V0c2l6ZSwgMCwKKyAgICAgICAgICAgIGRlcGF5LT5wYWNrZXRzaXplLCBkYXRhLCBnX2ZyZWUpKTsKKworICAgIGdzdF9hZGFwdGVyX3B1c2ggKGRlcGF5LT5hZGFwdGVyLCBidWYpOworCisgICAgcGFjay0+ZGF0YSA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2FkZF9wYWNrZXQgKEdzdFJ0cFFETTJEZXBheSAqIGRlcGF5LCBndWludDMyIHBpZCwgZ3VpbnQzMiBsZW4sIGd1aW50OCAqIGRhdGEpCit7CisgIFFETTJQYWNrZXQgKnBhY2tldDsKKworICBpZiAoR19VTkxJS0VMWSAoIWRlcGF5LT5jb25maWd1cmVkKSkKKyAgICByZXR1cm47CisKKyAgR1NUX0RFQlVHICgicGlkOiVkLCBsZW46JWQsIGRhdGE6JXAiLCBwaWQsIGxlbiwgZGF0YSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGRlcGF5LT5wYWNrZXRzW3BpZF0gPT0gTlVMTCkpIHsKKyAgICBkZXBheS0+cGFja2V0c1twaWRdID0gZ19tYWxsb2MwIChzaXplb2YgKFFETTJQYWNrZXQpKTsKKyAgICBkZXBheS0+bmJwYWNrZXRzID0gTUFYIChkZXBheS0+bmJwYWNrZXRzLCBwaWQgKyAxKTsKKyAgfQorICBwYWNrZXQgPSBkZXBheS0+cGFja2V0c1twaWRdOworCisgIEdTVF9ERUJVRyAoInBhY2tldDolcCIsIHBhY2tldCk7CisgIEdTVF9ERUJVRyAoInBhY2tldC0+ZGF0YTolcCIsIHBhY2tldC0+ZGF0YSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHBhY2tldC0+ZGF0YSA9PSBOVUxMKSkgeworICAgIHBhY2tldC0+ZGF0YSA9IGdfbWFsbG9jMCAoZGVwYXktPnBhY2tldHNpemUpOworICAgIC8qIFdlIGxlYXZlIHNwYWNlIGZvciB0aGUgaGVhZGVyL2NyYyAqLworICAgIGlmIChkZXBheS0+cGFja2V0c2l6ZSA+IDB4ZmYpCisgICAgICBwYWNrZXQtPm9mZnMgPSA1OworICAgIGVsc2UKKyAgICAgIHBhY2tldC0+b2ZmcyA9IDQ7CisgIH0KKworICAvKiBGaW5hbGx5IGNvcHkgdGhlIGRhdGEgb3ZlciAqLworICBtZW1jcHkgKHBhY2tldC0+ZGF0YSArIHBhY2tldC0+b2ZmcywgZGF0YSwgbGVuKTsKKyAgcGFja2V0LT5vZmZzICs9IGxlbjsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX3FkbTJfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RSdHBRRE0yRGVwYXkgKnJ0cHFkbTJkZXBheTsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBndWludDE2IHNlcTsKKworICBydHBxZG0yZGVwYXkgPSBHU1RfUlRQX1FETTJfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgeworICAgIGdpbnQgcGF5bG9hZF9sZW47CisgICAgZ3VpbnQ4ICpwYXlsb2FkOworICAgIGd1aW50IGF2YWlsOworICAgIGd1aW50IHBvcyA9IDA7CisKKyAgICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAocnRwKTsKKyAgICBpZiAocGF5bG9hZF9sZW4gPCAzKQorICAgICAgZ290byBiYWRfcGFja2V0OworCisgICAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkIChydHApOworICAgIHNlcSA9IGdzdF9ydHBfYnVmZmVyX2dldF9zZXEgKHJ0cCk7CisgICAgaWYgKEdfVU5MSUtFTFkgKHNlcSAhPSBydHBxZG0yZGVwYXktPm5leHRzZXEpKSB7CisgICAgICBHU1RfREVCVUcgKCJHQVAgaW4gc2VxdWVuY2UgbnVtYmVyLCBSZXNldHRpbmcgZGF0YSAhIik7CisgICAgICAvKiBGbHVzaCBwcmV2aW91cyBkYXRhICovCisgICAgICBmbHVzaF9kYXRhIChydHBxZG0yZGVwYXkpOworICAgICAgLyogQW5kIHN0b3JlIG5ldyB0aW1lc3RhbXAgKi8KKyAgICAgIHJ0cHFkbTJkZXBheS0+cHRpbWVzdGFtcCA9IHJ0cHFkbTJkZXBheS0+dGltZXN0YW1wOworICAgICAgcnRwcWRtMmRlcGF5LT50aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1BUUyAocnRwLT5idWZmZXIpOworICAgICAgLyogQW5kIHRoYXQgcHJldmlvdXMgZGF0YSB3aWxsIGJlIHB1c2hlZCBhdCB0aGUgYm90dG9tICovCisgICAgfQorICAgIHJ0cHFkbTJkZXBheS0+bmV4dHNlcSA9IHNlcSArIDE7CisKKyAgICBHU1RfREVCVUcgKCJQYXlsb2FkIHNpemUgJWQgMHgleCBzZXF1ZW5jZTolZCIsIHBheWxvYWRfbGVuLCBwYXlsb2FkX2xlbiwKKyAgICAgICAgc2VxKTsKKworICAgIEdTVF9NRU1EVU1QICgiSW5jb21pbmcgcGF5bG9hZCIsIHBheWxvYWQsIHBheWxvYWRfbGVuKTsKKworICAgIHdoaWxlIChwb3MgPCBwYXlsb2FkX2xlbikgeworICAgICAgc3dpdGNoIChwYXlsb2FkW3Bvc10pIHsKKyAgICAgICAgY2FzZSAweDgwOnsKKyAgICAgICAgICBHU1RfREVCVUcgKCJVbnJlY29nbml6ZWQgMHg4MCBtYXJrZXIsIHNraXBwaW5nIDEyIGJ5dGVzIik7CisgICAgICAgICAgcG9zICs9IDEyOworICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhmZjoKKyAgICAgICAgICAvKiBIRUFERVJTICovCisgICAgICAgICAgR1NUX0RFQlVHICgiSGVhZGVycyIpOworICAgICAgICAgIC8qIFN0b3JlIHRoZSBpbmNvbWluZyB0aW1lc3RhbXAgKi8KKyAgICAgICAgICBydHBxZG0yZGVwYXktPnB0aW1lc3RhbXAgPSBydHBxZG0yZGVwYXktPnRpbWVzdGFtcDsKKyAgICAgICAgICBydHBxZG0yZGVwYXktPnRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChydHAtPmJ1ZmZlcik7CisgICAgICAgICAgLyogZmx1c2ggdGhlIGludGVybmFsIGRhdGEgaWYgbmVlZGVkICovCisgICAgICAgICAgZmx1c2hfZGF0YSAocnRwcWRtMmRlcGF5KTsKKyAgICAgICAgICBpZiAoR19VTkxJS0VMWSAoIXJ0cHFkbTJkZXBheS0+Y29uZmlndXJlZCkpIHsKKyAgICAgICAgICAgIGd1aW50OCAqb3VyZGF0YTsKKyAgICAgICAgICAgIEdzdEJ1ZmZlciAqY29kZWNkYXRhOworICAgICAgICAgICAgR3N0TWFwSW5mbyBjbWFwOworICAgICAgICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgICAgICAgLyogRmlyc3QgYnl0ZXMgYXJlIHVua25vd24gKi8KKyAgICAgICAgICAgIEdTVF9NRU1EVU1QICgiSGVhZGVyIiwgcGF5bG9hZCArIHBvcywgMzIpOworICAgICAgICAgICAgb3VyZGF0YSA9IHBheWxvYWQgKyBwb3MgKyAxMDsKKyAgICAgICAgICAgIHBvcyArPSAxMDsKKyAgICAgICAgICAgIHJ0cHFkbTJkZXBheS0+Y2hhbm5zID0gR1NUX1JFQURfVUlOVDMyX0JFIChwYXlsb2FkICsgcG9zICsgNCk7CisgICAgICAgICAgICBydHBxZG0yZGVwYXktPnNhbXBsZXJhdGUgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKHBheWxvYWQgKyBwb3MgKyA4KTsKKyAgICAgICAgICAgIHJ0cHFkbTJkZXBheS0+Yml0cmF0ZSA9IEdTVF9SRUFEX1VJTlQzMl9CRSAocGF5bG9hZCArIHBvcyArIDEyKTsKKyAgICAgICAgICAgIHJ0cHFkbTJkZXBheS0+YmxvY2tzaXplID0gR1NUX1JFQURfVUlOVDMyX0JFIChwYXlsb2FkICsgcG9zICsgMTYpOworICAgICAgICAgICAgcnRwcWRtMmRlcGF5LT5mcmFtZXNpemUgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKHBheWxvYWQgKyBwb3MgKyAyMCk7CisgICAgICAgICAgICBydHBxZG0yZGVwYXktPnBhY2tldHNpemUgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKHBheWxvYWQgKyBwb3MgKyAyNCk7CisgICAgICAgICAgICAvKiAxNiBiaXQgZW1wdHkgYmxvY2sgKDB4MDIgMHgwMCkgKi8KKyAgICAgICAgICAgIHBvcyArPSAzMDsKKyAgICAgICAgICAgIEdTVF9ERUJVRworICAgICAgICAgICAgICAgICgiY2hhbm5zOiVkLCBzYW1wbGVyYXRlOiVkLCBiaXRyYXRlOiVkLCBibG9ja3NpemU6JWQsIGZyYW1lc2l6ZTolZCwgcGFja2V0c2l6ZTolZCIsCisgICAgICAgICAgICAgICAgcnRwcWRtMmRlcGF5LT5jaGFubnMsIHJ0cHFkbTJkZXBheS0+c2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICBydHBxZG0yZGVwYXktPmJpdHJhdGUsIHJ0cHFkbTJkZXBheS0+YmxvY2tzaXplLAorICAgICAgICAgICAgICAgIHJ0cHFkbTJkZXBheS0+ZnJhbWVzaXplLCBydHBxZG0yZGVwYXktPnBhY2tldHNpemUpOworCisgICAgICAgICAgICAvKiBDYXBzICovCisgICAgICAgICAgICBjb2RlY2RhdGEgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDQ4KTsKKyAgICAgICAgICAgIGdzdF9idWZmZXJfbWFwIChjb2RlY2RhdGEsICZjbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICAgICAgICAgIG1lbWNweSAoY21hcC5kYXRhLCBoZWFkaGVhZGVyLCAyMCk7CisgICAgICAgICAgICBtZW1jcHkgKGNtYXAuZGF0YSArIDIwLCBvdXJkYXRhLCAyOCk7CisgICAgICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChjb2RlY2RhdGEsICZjbWFwKTsKKworICAgICAgICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXFkbTIiLAorICAgICAgICAgICAgICAgICJzYW1wbGVzaXplIiwgR19UWVBFX0lOVCwgMTYsCisgICAgICAgICAgICAgICAgInJhdGUiLCBHX1RZUEVfSU5ULCBydHBxZG0yZGVwYXktPnNhbXBsZXJhdGUsCisgICAgICAgICAgICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgcnRwcWRtMmRlcGF5LT5jaGFubnMsCisgICAgICAgICAgICAgICAgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIGNvZGVjZGF0YSwgTlVMTCk7CisgICAgICAgICAgICBnc3RfcGFkX3NldF9jYXBzIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NSQ1BBRCAoZGVwYXlsb2FkKSwgY2Fwcyk7CisgICAgICAgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICAgICAgICBydHBxZG0yZGVwYXktPmNvbmZpZ3VyZWQgPSBUUlVFOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfREVCVUcgKCJBbHJlYWR5IGNvbmZpZ3VyZWQsIHNraXBwaW5nIGhlYWRlcnMiKTsKKyAgICAgICAgICAgIHBvcyArPSA0MDsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6eworICAgICAgICAgIC8qIFNodWZmbGVkIHBhY2tldCBjb250ZW50cyAqLworICAgICAgICAgIGd1aW50IHBhY2tldGlkID0gcGF5bG9hZFtwb3MrK107CisgICAgICAgICAgZ3VpbnQgcGFja2V0dHlwZSA9IHBheWxvYWRbcG9zKytdOworICAgICAgICAgIGd1aW50IHBhY2tsZW4gPSBwYXlsb2FkW3BvcysrXTsKKyAgICAgICAgICBndWludCBoc2l6ZSA9IDI7CisKKyAgICAgICAgICBHU1RfREVCVUcgKCJQYWNrZXQgaWQ6JWQsIHR5cGU6MHgleCwgbGVuOiVkIiwKKyAgICAgICAgICAgICAgcGFja2V0aWQsIHBhY2tldHR5cGUsIHBhY2tsZW4pOworCisgICAgICAgICAgLyogUGFja2V0cyBiaWdnZXIgdGhhbiAweGZmIGJ5dGVzIGhhdmUgYSB0eXBlIHdpdGggdGhlIGhpZ2ggYml0IHNldCAqLworICAgICAgICAgIGlmIChHX1VOTElLRUxZIChwYWNrZXR0eXBlICYgMHg4MCkpIHsKKyAgICAgICAgICAgIHBhY2tldHR5cGUgJj0gMHg3ZjsKKyAgICAgICAgICAgIHBhY2tsZW4gPDw9IDg7CisgICAgICAgICAgICBwYWNrbGVuIHw9IHBheWxvYWRbcG9zKytdOworICAgICAgICAgICAgaHNpemUgPSAzOworICAgICAgICAgICAgR1NUX0RFQlVHICgiUGFja2V0IGlkOiVkLCB0eXBlOjB4JXgsIGxlbjolZCIsCisgICAgICAgICAgICAgICAgcGFja2V0aWQsIHBhY2tldHR5cGUsIHBhY2tsZW4pOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChwYWNrZXR0eXBlID4gMHg3ZikgeworICAgICAgICAgICAgR1NUX0VSUk9SICgiSE9VU1RPTiBXRSBIQVZFIEEgUFJPQkxFTSAhISEhIik7CisgICAgICAgICAgfQorICAgICAgICAgIGFkZF9wYWNrZXQgKHJ0cHFkbTJkZXBheSwgcGFja2V0aWQsIHBhY2tsZW4gKyBoc2l6ZSwKKyAgICAgICAgICAgICAgcGF5bG9hZCArIHBvcyAtIGhzaXplKTsKKyAgICAgICAgICBwb3MgKz0gcGFja2xlbjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIEdTVF9ERUJVRyAoImZpbmFsIHBvcyAlZCIsIHBvcyk7CisKKyAgICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwcWRtMmRlcGF5LT5hZGFwdGVyKTsKKyAgICBpZiAoR19VTkxJS0VMWSAoYXZhaWwpKSB7CisgICAgICBHU1RfREVCVUcgKCJQdXNoaW5nIG91dCAlZCBieXRlcyBvZiBjb2xsZWN0ZWQgZGF0YSIsIGF2YWlsKTsKKyAgICAgIG91dGJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChydHBxZG0yZGVwYXktPmFkYXB0ZXIsIGF2YWlsKTsKKyAgICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gcnRwcWRtMmRlcGF5LT5wdGltZXN0YW1wOworICAgICAgR1NUX0RFQlVHICgiT3V0Z29pbmcgYnVmZmVyIHRpbWVzdGFtcCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocnRwcWRtMmRlcGF5LT5wdGltZXN0YW1wKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIG91dGJ1ZjsKKworICAvKiBFUlJPUlMgKi8KK2JhZF9wYWNrZXQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBxZG0yZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiUGFja2V0IHdhcyB0b28gc2hvcnQiKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX3FkbTJfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RSdHBRRE0yRGVwYXkgKnJ0cHFkbTJkZXBheTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHJ0cHFkbTJkZXBheSA9IEdTVF9SVFBfUURNMl9ERVBBWSAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cHFkbTJkZXBheS0+YWRhcHRlcik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9xZG0yX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBxZG0yZGVwYXlfZGVidWcsICJydHBxZG0yZGVwYXkiLCAwLAorICAgICAgIlJUUCBRRE0yIGRlcGF5bG9hZGVyIik7CisKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBxZG0yZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfUURNMl9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2YjJiMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwcWRtZGVwYXkuaApAQCAtMCwwICsxLDg1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfUURNMl9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1FETTJfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1FETTJfREVQQVkgXAorICAoZ3N0X3J0cF9xZG0yX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfUURNMl9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9RRE0yX0RFUEFZLEdzdFJ0cFFETTJEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfUURNMl9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfUURNMl9ERVBBWSxHc3RSdHBRRE0yRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfUURNMl9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9RRE0yX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9RRE0yX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9RRE0yX0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFFETTJEZXBheSBHc3RSdHBRRE0yRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwUURNMkRlcGF5Q2xhc3MgR3N0UnRwUURNMkRlcGF5Q2xhc3M7CisKK3R5cGVkZWYgc3RydWN0IF9RRE0yUGFja2V0IHsKKyAgZ3VpbnQ4KiBkYXRhOworICBndWludCBvZmZzOwkJLyogU3RhcnRzIGF0IDQgdG8gZ2l2ZSByb29tIGZvciB0aGUgcHJlZml4ICovCit9IFFETTJQYWNrZXQ7CisKKyNkZWZpbmUgTUFYX1NDUkFNQkxFRF9QQUNLRVRTIDY0CisKK3N0cnVjdCBfR3N0UnRwUURNMkRlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisKKyAgZ3VpbnQxNiBuZXh0c2VxOworICBnYm9vbGVhbiBjb25maWd1cmVkOworCisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7IC8qIFRpbWVzdGFtcCBvZiBjdXJyZW50IGluY29taW5nIGRhdGEgKi8KKyAgR3N0Q2xvY2tUaW1lIHB0aW1lc3RhbXA7IC8qIFRpbWVzdGFtcCBvZiBkYXRhIHN0b3JlZCBpbiB0aGUgYWRhcHRlciAqLworCisgIGd1aW50MzIgY2hhbm5zOworICBndWludDMyIHNhbXBsZXJhdGU7CisgIGd1aW50MzIgYml0cmF0ZTsKKyAgZ3VpbnQzMiBibG9ja3NpemU7CisgIGd1aW50MzIgZnJhbWVzaXplOworICBndWludDMyIHBhY2tldHNpemU7CisKKyAgZ3VpbnQgbmJwYWNrZXRzOwkvKiBOdW1iZXIgb2YgcGFja2V0cyB0byB1bnNjcmFtYmxlICovCisKKyAgUURNMlBhY2tldCAqcGFja2V0c1tNQVhfU0NSQU1CTEVEX1BBQ0tFVFNdOworfTsKKworc3RydWN0IF9Hc3RSdHBRRE0yRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9xZG0yX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9xZG0yX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX1FETTJfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHNiY2RlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cHNiY2RlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU0OWJiMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwc2JjZGVwYXkuYwpAQCAtMCwwICsxLDM5NSBAQAorLyoKKyAqIEdTdHJlYW1lciBSVFAgU0JDIGRlcGF5bG9hZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyICBDb2xsYWJvcmEgTHRkLgorICogICBAYXV0aG9yOiBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgImdzdHJ0cHNiY2RlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwc2JjZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cHNiY2RlcGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9zYmNfZGVwYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwgR1NUX1BBRF9TUkMsIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtc2JjLCAiCisgICAgICAgICJyYXRlID0gKGludCkgeyAxNjAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdLCAiCisgICAgICAgICJtb2RlID0gKHN0cmluZykgeyBtb25vLCBkdWFsLCBzdGVyZW8sIGpvaW50IH0sICIKKyAgICAgICAgImJsb2NrcyA9IChpbnQpIHsgNCwgOCwgMTIsIDE2IH0sICIKKyAgICAgICAgInN1YmJhbmRzID0gKGludCkgeyA0LCA4IH0sICIKKyAgICAgICAgImFsbG9jYXRpb24tbWV0aG9kID0gKHN0cmluZykgeyBzbnIsIGxvdWRuZXNzIH0sICIKKyAgICAgICAgImJpdHBvb2wgPSAoaW50KSBbIDIsIDY0IF0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3NiY19kZXBheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsIEdTVF9QQURfU0lOSywgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgYXVkaW8sIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSB7IDE2MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwIH0sIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFNCQyIpCisgICAgKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfSUdOT1JFX1RJTUVTVEFNUFMsCisgIFBST1BfTEFTVAorfTsKKworI2RlZmluZSBERUZBVUxUX0lHTk9SRV9USU1FU1RBTVBTIEZBTFNFCisKKyNkZWZpbmUgZ3N0X3J0cF9zYmNfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwU2JjRGVwYXksIGdzdF9ydHBfc2JjX2RlcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX3NiY19kZXBheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX3NiY19kZXBheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX3NiY19kZXBheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3NiY19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogYmFzZSwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX3NiY19kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogYmFzZSwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zYmNfZGVwYXlfY2xhc3NfaW5pdCAoR3N0UnRwU2JjRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKmdzdGJhc2VydHBkZXBheWxvYWRfY2xhc3MgPQorICAgICAgR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9DTEFTUyAoa2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9zYmNfZGVwYXlfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9ydHBfc2JjX2RlcGF5X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9zYmNfZGVwYXlfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSUdOT1JFX1RJTUVTVEFNUFMsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImlnbm9yZS10aW1lc3RhbXBzIiwgIklnbm9yZSBUaW1lc3RhbXBzIiwKKyAgICAgICAgICAiVmFyaW91cyBzdGF0aXN0aWNzIiwgREVGQVVMVF9JR05PUkVfVElNRVNUQU1QUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RiYXNlcnRwZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfc2JjX2RlcGF5X3NldGNhcHM7CisgIGdzdGJhc2VydHBkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfc2JjX2RlcGF5X3Byb2Nlc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9zYmNfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9zYmNfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cHNiY2RlcGF5X2RlYnVnLCAicnRwc2JjZGVwYXkiLCAwLAorICAgICAgIlNCQyBBdWRpbyBSVFAgRGVwYXlsb2FkZXIiKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBTQkMgYXVkaW8gZGVwYXlsb2FkZXIiLAorICAgICAgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBTQkMgYXVkaW8gZnJvbSBSVFAgcGFja2V0cyIsCisgICAgICAiQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3NiY19kZXBheV9pbml0IChHc3RSdHBTYmNEZXBheSAqIHJ0cHNiY2RlcGF5KQoreworICBydHBzYmNkZXBheS0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKKyAgcnRwc2JjZGVwYXktPnN0cmVhbV9hbGlnbiA9CisgICAgICBnc3RfYXVkaW9fc3RyZWFtX2FsaWduX25ldyAoNDgwMDAsIDQwICogR1NUX01TRUNPTkQsIDEgKiBHU1RfU0VDT05EKTsKKyAgcnRwc2JjZGVwYXktPmlnbm9yZV90aW1lc3RhbXBzID0gREVGQVVMVF9JR05PUkVfVElNRVNUQU1QUzsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc2JjX2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSdHBTYmNEZXBheSAqZGVwYXkgPSBHU1RfUlRQX1NCQ19ERVBBWSAob2JqZWN0KTsKKworICBnc3RfYXVkaW9fc3RyZWFtX2FsaWduX2ZyZWUgKGRlcGF5LT5zdHJlYW1fYWxpZ24pOworICBnc3Rfb2JqZWN0X3VucmVmIChkZXBheS0+YWRhcHRlcik7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zYmNfZGVwYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cFNiY0RlcGF5ICpkZXBheSA9IEdTVF9SVFBfU0JDX0RFUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9JR05PUkVfVElNRVNUQU1QUzoKKyAgICAgIGRlcGF5LT5pZ25vcmVfdGltZXN0YW1wcyA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc2JjX2RlcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSdHBTYmNEZXBheSAqZGVwYXkgPSBHU1RfUlRQX1NCQ19ERVBBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfSUdOT1JFX1RJTUVTVEFNUFM6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZGVwYXktPmlnbm9yZV90aW1lc3RhbXBzKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogRklYTUU6IFRoaXMgZHVwbGljYXRlcyBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkgcnRwc2JjcGF5LCBidXQgdGhlcmUgaXNuJ3QgYQorICogc2ltcGxlIHdheSB0byBjb25zb2xpZGF0ZSB0aGUgdHdvLiBUaGlzIGlzIGJlc3QgZG9uZSBieSBtb3ZpbmcgdGhlIGZ1bmN0aW9uCisgKiB0byB0aGUgY29kZWMtdXRpbHMgbGlicmFyeSBpbiBnc3QtcGx1Z2lucy1iYXNlIHdoZW4gdGhlc2UgZWxlbWVudHMgbW92ZSB0bworICogR1N0cmVhbWVyLiAqLworc3RhdGljIGludAorZ3N0X3J0cF9zYmNfZGVwYXlfZ2V0X3BhcmFtcyAoR3N0UnRwU2JjRGVwYXkgKiBkZXBheSwgY29uc3QgZ3VpbnQ4ICogZGF0YSwKKyAgICBnaW50IHNpemUsIGludCAqZnJhbWVsZW4sIGludCAqc2FtcGxlcykKK3sKKyAgaW50IGJsb2NrcywgY2hhbm5lbF9tb2RlLCBjaGFubmVscywgc3ViYmFuZHMsIGJpdHBvb2w7CisgIGludCBsZW5ndGg7CisKKyAgaWYgKHNpemUgPCAzKSB7CisgICAgLyogTm90IGVub3VnaCBkYXRhIGZvciB0aGUgaGVhZGVyICovCisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogU2FuaXR5IGNoZWNrICovCisgIGlmIChkYXRhWzBdICE9IDB4OWMpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5LCAiQmFkIHBhY2tldDogY291bGRuJ3QgZmluZCBzeW5jd29yZCIpOworICAgIHJldHVybiAtMjsKKyAgfQorCisgIGJsb2NrcyA9IChkYXRhWzFdID4+IDQpICYgMHgzOworICBibG9ja3MgPSAoYmxvY2tzICsgMSkgKiA0OworICBjaGFubmVsX21vZGUgPSAoZGF0YVsxXSA+PiAyKSAmIDB4MzsKKyAgY2hhbm5lbHMgPSBjaGFubmVsX21vZGUgPyAyIDogMTsKKyAgc3ViYmFuZHMgPSAoZGF0YVsxXSAmIDB4MSk7CisgIHN1YmJhbmRzID0gKHN1YmJhbmRzICsgMSkgKiA0OworICBiaXRwb29sID0gZGF0YVsyXTsKKworICBsZW5ndGggPSA0ICsgKCg0ICogc3ViYmFuZHMgKiBjaGFubmVscykgLyA4KTsKKworICBpZiAoY2hhbm5lbF9tb2RlID09IDAgfHwgY2hhbm5lbF9tb2RlID09IDEpIHsKKyAgICAvKiBNb25vIHx8IER1YWwgY2hhbm5lbCAqLworICAgIGxlbmd0aCArPSAoKGJsb2NrcyAqIGNoYW5uZWxzICogYml0cG9vbCkKKyAgICAgICAgKyA0IC8qIHJvdW5kIHVwICovICkgLyA4OworICB9IGVsc2UgeworICAgIC8qIFN0ZXJlbyB8fCBKb2ludCBzdGVyZW8gKi8KKyAgICBnYm9vbGVhbiBqb2ludCA9IChjaGFubmVsX21vZGUgPT0gMyk7CisKKyAgICBsZW5ndGggKz0gKChqb2ludCAqIHN1YmJhbmRzKSArIChibG9ja3MgKiBiaXRwb29sKQorICAgICAgICArIDQgLyogcm91bmQgdXAgKi8gKSAvIDg7CisgIH0KKworICAqZnJhbWVsZW4gPSBsZW5ndGg7CisgICpzYW1wbGVzID0gYmxvY2tzICogc3ViYmFuZHM7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9zYmNfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGJhc2UsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RSdHBTYmNEZXBheSAqZGVwYXkgPSBHU1RfUlRQX1NCQ19ERVBBWSAoYmFzZSk7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBHc3RDYXBzICpvdXRjYXBzLCAqb2xkY2FwczsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZkZXBheS0+cmF0ZSkpCisgICAgZ290byBiYWRfY2FwczsKKworICBvdXRjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtc2JjIiwgInJhdGUiLCBHX1RZUEVfSU5ULAorICAgICAgZGVwYXktPnJhdGUsIE5VTEwpOworCisgIGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChiYXNlKSwgb3V0Y2Fwcyk7CisKKyAgb2xkY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TSU5LUEFEIChiYXNlKSk7CisgIGlmIChvbGRjYXBzICYmICFnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChvbGRjYXBzLCBjYXBzKSkgeworICAgIC8qIENhcHMgaGF2ZSBjaGFuZ2VkLCBmbHVzaCBvbGQgZGF0YSAqLworICAgIGdzdF9hZGFwdGVyX2NsZWFyIChkZXBheS0+YWRhcHRlcik7CisgIH0KKworICBnc3RfY2Fwc191bnJlZiAob3V0Y2Fwcyk7CisgIGlmIChvbGRjYXBzKQorICAgIGdzdF9jYXBzX3VucmVmIChvbGRjYXBzKTsKKworICAvKiBSZXNldCB3aGVuIHRoZSBjYXBzIGFyZSBjaGFuZ2luZyAqLworICBnc3RfYXVkaW9fc3RyZWFtX2FsaWduX3NldF9yYXRlIChkZXBheS0+c3RyZWFtX2FsaWduLCBkZXBheS0+cmF0ZSk7CisKKyAgcmV0dXJuIFRSVUU7CisKK2JhZF9jYXBzOgorICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5LCAiQ2FuJ3Qgc3VwcG9ydCB0aGUgY2FwcyB3ZSBnb3Q6ICUiCisgICAgICBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX3NiY19kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogYmFzZSwgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RSdHBTYmNEZXBheSAqZGVwYXkgPSBHU1RfUlRQX1NCQ19ERVBBWSAoYmFzZSk7CisgIEdzdEJ1ZmZlciAqZGF0YSA9IE5VTEw7CisKKyAgZ2Jvb2xlYW4gZnJhZ21lbnQsIHN0YXJ0LCBsYXN0OworICBndWludDggbmZyYW1lczsKKyAgZ3VpbnQ4ICpwYXlsb2FkOworICBndWludCBwYXlsb2FkX2xlbjsKKyAgZ2ludCBzYW1wbGVzID0gMDsKKworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworCisgIEdTVF9MT0dfT0JKRUNUIChkZXBheSwgIkdvdCAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIiwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKHJ0cC0+YnVmZmVyKSk7CisKKyAgaWYgKGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCkpIHsKKyAgICAvKiBNYXJrZXIgaXNuJ3Qgc3VwcG9zZWQgdG8gYmUgc2V0ICovCisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZXBheSwgIk1hcmtlciBiaXQgd2FzIHNldCIpOworICAgIGdvdG8gYmFkX3BhY2tldDsKKyAgfQorCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfRFRTX09SX1BUUyAocnRwLT5idWZmZXIpOworICBpZiAoZGVwYXktPmlnbm9yZV90aW1lc3RhbXBzICYmIHRpbWVzdGFtcCA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgR3N0Q2xvY2tUaW1lIGluaXRpYWxfdGltZXN0YW1wOworICAgIGd1aW50NjQgbl9zYW1wbGVzOworCisgICAgaW5pdGlhbF90aW1lc3RhbXAgPQorICAgICAgICBnc3RfYXVkaW9fc3RyZWFtX2FsaWduX2dldF90aW1lc3RhbXBfYXRfZGlzY29udCAoZGVwYXktPnN0cmVhbV9hbGlnbik7CisgICAgbl9zYW1wbGVzID0KKyAgICAgICAgZ3N0X2F1ZGlvX3N0cmVhbV9hbGlnbl9nZXRfc2FtcGxlc19zaW5jZV9kaXNjb250IChkZXBheS0+c3RyZWFtX2FsaWduKTsKKworICAgIGlmIChpbml0aWFsX3RpbWVzdGFtcCA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChkZXBheSwKKyAgICAgICAgICAiQ2FuIG9ubHkgaWdub3JlIHRpbWVzdGFtcHMgb24gc3RyZWFtcyB3aXRob3V0IHZhbGlkIGluaXRpYWwgdGltZXN0YW1wIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB0aW1lc3RhbXAgPQorICAgICAgICBpbml0aWFsX3RpbWVzdGFtcCArIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAobl9zYW1wbGVzLCBHU1RfU0VDT05ELAorICAgICAgICBkZXBheS0+cmF0ZSk7CisgIH0KKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworCisgIGZyYWdtZW50ID0gcGF5bG9hZFswXSAmIDB4ODA7CisgIHN0YXJ0ID0gcGF5bG9hZFswXSAmIDB4NDA7CisgIGxhc3QgPSBwYXlsb2FkWzBdICYgMHgyMDsKKyAgbmZyYW1lcyA9IHBheWxvYWRbMF0gJiAweDBmOworCisgIHBheWxvYWQgKz0gMTsKKyAgcGF5bG9hZF9sZW4gLT0gMTsKKworICBkYXRhID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfc3ViYnVmZmVyIChydHAsIDEsIC0xKTsKKworICBpZiAoZnJhZ21lbnQpIHsKKyAgICAvKiBHb3QgYSBwYWNrZXQgd2l0aCBhIGZyYWdtZW50ICovCisgICAgR1NUX0xPR19PQkpFQ1QgKGRlcGF5LCAiR290IGZyYWdtZW50Iik7CisKKyAgICBpZiAoc3RhcnQgJiYgZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZXBheS0+YWRhcHRlcikpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVwYXksICJNaXNzaW5nIGxhc3QgZnJhZ21lbnQiKTsKKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChkZXBheS0+YWRhcHRlcik7CisKKyAgICB9IGVsc2UgaWYgKCFzdGFydCAmJiAhZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZXBheS0+YWRhcHRlcikpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVwYXksICJNaXNzaW5nIHN0YXJ0IGZyYWdtZW50Iik7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChkYXRhKTsKKyAgICAgIGRhdGEgPSBOVUxMOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgZ3N0X2FkYXB0ZXJfcHVzaCAoZGVwYXktPmFkYXB0ZXIsIGRhdGEpOworCisgICAgaWYgKGxhc3QpIHsKKyAgICAgIGdpbnQgZnJhbWVsZW4sIHNhbXBsZXM7CisgICAgICBndWludDggaGVhZGVyWzRdOworCisgICAgICBkYXRhID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKGRlcGF5LT5hZGFwdGVyLAorICAgICAgICAgIGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoZGVwYXktPmFkYXB0ZXIpKTsKKyAgICAgIGdzdF9ydHBfZHJvcF9ub25fYXVkaW9fbWV0YSAoZGVwYXksIGRhdGEpOworCisgICAgICBpZiAoZ3N0X2J1ZmZlcl9leHRyYWN0IChkYXRhLCAwLCAmaGVhZGVyLCA0KSAhPSA0IHx8CisgICAgICAgICAgZ3N0X3J0cF9zYmNfZGVwYXlfZ2V0X3BhcmFtcyAoZGVwYXksIGhlYWRlciwKKyAgICAgICAgICAgICAgcGF5bG9hZF9sZW4sICZmcmFtZWxlbiwgJnNhbXBsZXMpIDwgMCkgeworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChkYXRhKTsKKyAgICAgICAgZ290byBiYWRfcGFja2V0OworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBkYXRhID0gTlVMTDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogIWZyYWdtZW50ICovCisgICAgZ2ludCBmcmFtZWxlbjsKKworICAgIEdTVF9MT0dfT0JKRUNUIChkZXBheSwgIkdvdCAlZCBmcmFtZXMiLCBuZnJhbWVzKTsKKworICAgIGlmIChnc3RfcnRwX3NiY19kZXBheV9nZXRfcGFyYW1zIChkZXBheSwgcGF5bG9hZCwKKyAgICAgICAgICAgIHBheWxvYWRfbGVuLCAmZnJhbWVsZW4sICZzYW1wbGVzKSA8IDApIHsKKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChkZXBheS0+YWRhcHRlcik7CisgICAgICBnb3RvIGJhZF9wYWNrZXQ7CisgICAgfQorCisgICAgc2FtcGxlcyAqPSBuZnJhbWVzOworCisgICAgR1NUX0xPR19PQkpFQ1QgKGRlcGF5LCAiR290IHBheWxvYWQgb2YgJWQiLCBwYXlsb2FkX2xlbik7CisKKyAgICBpZiAobmZyYW1lcyAqIGZyYW1lbGVuID4gKGdpbnQpIHBheWxvYWRfbGVuKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5LCAiU2hvcnQgcGFja2V0Iik7CisgICAgICBnb3RvIGJhZF9wYWNrZXQ7CisgICAgfSBlbHNlIGlmIChuZnJhbWVzICogZnJhbWVsZW4gPCAoZ2ludCkgcGF5bG9hZF9sZW4pIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVwYXksICJKdW5rIGF0IGVuZCBvZiBwYWNrZXQiKTsKKyAgICB9CisgIH0KKworICBpZiAoZGVwYXktPmlnbm9yZV90aW1lc3RhbXBzICYmIGRhdGEpIHsKKyAgICBHc3RDbG9ja1RpbWUgZHVyYXRpb247CisKKyAgICBnc3RfYXVkaW9fc3RyZWFtX2FsaWduX3Byb2Nlc3MgKGRlcGF5LT5zdHJlYW1fYWxpZ24sCisgICAgICAgIEdTVF9CVUZGRVJfSVNfRElTQ09OVCAocnRwLT5idWZmZXIpLCB0aW1lc3RhbXAsIHNhbXBsZXMsICZ0aW1lc3RhbXAsCisgICAgICAgICZkdXJhdGlvbiwgTlVMTCk7CisKKyAgICBHU1RfQlVGRkVSX1BUUyAoZGF0YSkgPSB0aW1lc3RhbXA7CisgICAgR1NUX0JVRkZFUl9EVFMgKGRhdGEpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChkYXRhKSA9IGR1cmF0aW9uOworICB9CisKK291dDoKKyAgcmV0dXJuIGRhdGE7CisKK2JhZF9wYWNrZXQ6CisgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICgiUmVjZWl2ZWQgaW52YWxpZCBSVFAgcGF5bG9hZCwgZHJvcHBpbmciKSwgKE5VTEwpKTsKKyAgZ290byBvdXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX3NiY19kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHNiY2RlcGF5IiwgR1NUX1JBTktfU0VDT05EQVJZLAorICAgICAgR1NUX1RZUEVfUlRQX1NCQ19ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHNiY2RlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cHNiY2RlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhYzNhZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwc2JjZGVwYXkuaApAQCAtMCwwICsxLDcwIEBACisvKgorICoKKyAqICBCbHVlWiAtIEJsdWV0b290aCBwcm90b2NvbCBzdGFjayBmb3IgTGludXgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEyICBDb2xsYWJvcmEgTHRkLgorICoKKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfU0JDX0RFUEFZX0gKKyNkZWZpbmUgX19HU1RfUlRQX1NCQ19ERVBBWV9ICisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9TQkNfREVQQVkgXAorCShnc3RfcnRwX3NiY19kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX1NCQ19ERVBBWShvYmopIFwKKwkoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1NCQ19ERVBBWSxcCisJCUdzdFJ0cFNiY0RlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9TQkNfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKwkoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfU0JDX0RFUEFZLFwKKwkJR3N0UnRwU2JjRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfU0JDX0RFUEFZKG9iaikgXAorCShHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfU0JDX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9TQkNfREVQQVlfQ0xBU1Mob2JqKSBcCisJKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX1NCQ19ERVBBWSkpCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU2JjRGVwYXkgR3N0UnRwU2JjRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU2JjRGVwYXlDbGFzcyBHc3RSdHBTYmNEZXBheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cFNiY0RlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgYmFzZTsKKworICBpbnQgcmF0ZTsKKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKKyAgZ2Jvb2xlYW4gaWdub3JlX3RpbWVzdGFtcHM7CisKKyAgLyogVGltZXN0YW1wIHRyYWNraW5nIHdoZW4gaWdub3JpbmcgaW5wdXQgdGltZXN0YW1wcyAqLworICBHc3RBdWRpb1N0cmVhbUFsaWduICpzdHJlYW1fYWxpZ247Cit9OworCitzdHJ1Y3QgX0dzdFJ0cFNiY0RlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfc2JjX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9zYmNfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwc2JjcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cHNiY3BheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMmNiZDQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHNiY3BheS5jCkBAIC0wLDAgKzEsMzgzIEBACisvKiAgR1N0cmVhbWVyIFJUUCBTQkMgcGF5bG9hZGVyCisgKiAgQmx1ZVogLSBCbHVldG9vdGggcHJvdG9jb2wgc3RhY2sgZm9yIExpbnV4CisgKgorICogIENvcHlyaWdodCAoQykgMjAwNC0yMDEwICBNYXJjZWwgSG9sdG1hbm4gPG1hcmNlbEBob2x0bWFubi5vcmc+CisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgImdzdHJ0cHNiY3BheS5oIgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCisjZGVmaW5lIFJUUF9TQkNfUEFZTE9BRF9IRUFERVJfU0laRSAxCisjZGVmaW5lIERFRkFVTFRfTUlOX0ZSQU1FUyAwCisjZGVmaW5lIFJUUF9TQkNfSEVBREVSX1RPVEFMICgxMiArIFJUUF9TQkNfUEFZTE9BRF9IRUFERVJfU0laRSkKKworLyogQkVHSU46IFBhY2tpbmcgZm9yIHJ0cF9wYXlsb2FkICovCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgcGFjayhwdXNoLCAxKQorI2VuZGlmCisKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOCisvKiBGSVhNRTogdGhpcyBzZWVtcyBhbGwgYSBiaXQgb3ZlciB0aGUgdG9wIGZvciBhIHNpbmdsZSBieXRlLi4gKi8KK3N0cnVjdCBydHBfcGF5bG9hZAoreworICBndWludDggZnJhbWVfY291bnQ6NDsKKyAgZ3VpbnQ4IHJmYTA6MTsKKyAgZ3VpbnQ4IGlzX2xhc3RfZnJhZ21lbnQ6MTsKKyAgZ3VpbnQ4IGlzX2ZpcnN0X2ZyYWdtZW50OjE7CisgIGd1aW50OCBpc19mcmFnbWVudGVkOjE7Cit9CisjZWxpZiBHX0JZVEVfT1JERVIgPT0gR19CSUdfRU5ESUFOCitzdHJ1Y3QgcnRwX3BheWxvYWQKK3sKKyAgZ3VpbnQ4IGlzX2ZyYWdtZW50ZWQ6MTsKKyAgZ3VpbnQ4IGlzX2ZpcnN0X2ZyYWdtZW50OjE7CisgIGd1aW50OCBpc19sYXN0X2ZyYWdtZW50OjE7CisgIGd1aW50OCByZmEwOjE7CisgIGd1aW50OCBmcmFtZV9jb3VudDo0OworfQorI2Vsc2UKKyNlcnJvciAiVW5rbm93biBieXRlIG9yZGVyIgorI2VuZGlmCisKKyNpZmRlZiBfTVNDX1ZFUgorOworI3ByYWdtYSBwYWNrKHBvcCkKKyNlbHNlCitfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisjZW5kaWYKKy8qIEVORDogUGFja2luZyBmb3IgcnRwX3BheWxvYWQgKi8KKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTUlOX0ZSQU1FUworfTsKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3J0cF9zYmNfcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9ydHBfc2JjX3BheV9kZWJ1ZworCisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3RfcnRwX3NiY19wYXlfcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBTQkNQYXksIGdzdF9ydHBfc2JjX3BheSwgR1NUX1RZUEVfUlRQX0JBU0VfUEFZTE9BRCk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3NiY19wYXlfc2lua19mYWN0b3J5ID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsIEdTVF9QQURfU0lOSywgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1zYmMsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSB7IDE2MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwIH0sICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgWyAxLCAyIF0sICIKKyAgICAgICAgImNoYW5uZWwtbW9kZSA9IChzdHJpbmcpIHsgbW9ubywgZHVhbCwgc3RlcmVvLCBqb2ludCB9LCAiCisgICAgICAgICJibG9ja3MgPSAoaW50KSB7IDQsIDgsIDEyLCAxNiB9LCAiCisgICAgICAgICJzdWJiYW5kcyA9IChpbnQpIHsgNCwgOCB9LCAiCisgICAgICAgICJhbGxvY2F0aW9uLW1ldGhvZCA9IChzdHJpbmcpIHsgc25yLCBsb3VkbmVzcyB9LCAiCisgICAgICAgICJiaXRwb29sID0gKGludCkgWyAyLCA2NCBdIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9zYmNfcGF5X3NyY19mYWN0b3J5ID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwgR1NUX1BBRF9TUkMsIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIGF1ZGlvLCIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgeyAxNjAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBTQkMiKQorICAgICk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfc2JjX3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX3NiY19wYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgZ2ludAorZ3N0X3J0cF9zYmNfcGF5X2dldF9mcmFtZV9sZW4gKGdpbnQgc3ViYmFuZHMsIGdpbnQgY2hhbm5lbHMsCisgICAgZ2ludCBibG9ja3MsIGdpbnQgYml0cG9vbCwgY29uc3QgZ2NoYXIgKiBjaGFubmVsX21vZGUpCit7CisgIGdpbnQgbGVuOworICBnaW50IGpvaW47CisKKyAgbGVuID0gNCArICg0ICogc3ViYmFuZHMgKiBjaGFubmVscykgLyA4OworCisgIGlmIChzdHJjbXAgKGNoYW5uZWxfbW9kZSwgIm1vbm8iKSA9PSAwIHx8IHN0cmNtcCAoY2hhbm5lbF9tb2RlLCAiZHVhbCIpID09IDApCisgICAgbGVuICs9ICgoYmxvY2tzICogY2hhbm5lbHMgKiBiaXRwb29sKSArIDcpIC8gODsKKyAgZWxzZSB7CisgICAgam9pbiA9IHN0cmNtcCAoY2hhbm5lbF9tb2RlLCAiam9pbnQiKSA9PSAwID8gMSA6IDA7CisgICAgbGVuICs9ICgoam9pbiAqIHN1YmJhbmRzICsgYmxvY2tzICogYml0cG9vbCkgKyA3KSAvIDg7CisgIH0KKworICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfc2JjX3BheV9zZXRfY2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UnRwU0JDUGF5ICpzYmNwYXk7CisgIGdpbnQgcmF0ZSwgc3ViYmFuZHMsIGNoYW5uZWxzLCBibG9ja3MsIGJpdHBvb2w7CisgIGdpbnQgZnJhbWVfbGVuOworICBjb25zdCBnY2hhciAqY2hhbm5lbF9tb2RlOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKworICBzYmNwYXkgPSBHU1RfUlRQX1NCQ19QQVkgKHBheWxvYWQpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAicmF0ZSIsICZyYXRlKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsICZjaGFubmVscykpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiYmxvY2tzIiwgJmJsb2NrcykpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiYml0cG9vbCIsICZiaXRwb29sKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJzdWJiYW5kcyIsICZzdWJiYW5kcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGNoYW5uZWxfbW9kZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiY2hhbm5lbC1tb2RlIik7CisgIGlmICghY2hhbm5lbF9tb2RlKQorICAgIHJldHVybiBGQUxTRTsKKworICBmcmFtZV9sZW4gPSBnc3RfcnRwX3NiY19wYXlfZ2V0X2ZyYW1lX2xlbiAoc3ViYmFuZHMsIGNoYW5uZWxzLCBibG9ja3MsCisgICAgICBiaXRwb29sLCBjaGFubmVsX21vZGUpOworCisgIHNiY3BheS0+ZnJhbWVfbGVuZ3RoID0gZnJhbWVfbGVuOworICBzYmNwYXktPmZyYW1lX2R1cmF0aW9uID0gKChibG9ja3MgKiBzdWJiYW5kcykgKiBHU1RfU0VDT05EKSAvIHJhdGU7CisgIHNiY3BheS0+bGFzdF90aW1lc3RhbXAgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChwYXlsb2FkLCAiYXVkaW8iLCBUUlVFLCAiU0JDIiwgcmF0ZSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGF5bG9hZCwgImNhbGN1bGF0ZWQgZnJhbWUgbGVuZ3RoOiAlZCAiLCBmcmFtZV9sZW4pOworCisgIHJldHVybiBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAocGF5bG9hZCwgTlVMTCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX3NiY19wYXlfZmx1c2hfYnVmZmVycyAoR3N0UnRwU0JDUGF5ICogc2JjcGF5KQoreworICBHc3RSVFBCdWZmZXIgcnRwID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKyAgZ3VpbnQgYXZhaWxhYmxlOworICBndWludCBtYXhfcGF5bG9hZDsKKyAgR3N0QnVmZmVyICpvdXRidWYsICpwYXlidWY7CisgIGd1aW50OCAqcGF5bG9hZF9kYXRhOworICBndWludCBmcmFtZV9jb3VudDsKKyAgZ3VpbnQgcGF5bG9hZF9sZW5ndGg7CisgIHN0cnVjdCBydHBfcGF5bG9hZCAqcGF5bG9hZDsKKyAgR3N0Rmxvd1JldHVybiByZXM7CisKKyAgaWYgKHNiY3BheS0+ZnJhbWVfbGVuZ3RoID09IDApIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzYmNwYXksICJGcmFtZSBsZW5ndGggaXMgMCIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIGRvIHsKKyAgICBhdmFpbGFibGUgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHNiY3BheS0+YWRhcHRlcik7CisKKyAgICBtYXhfcGF5bG9hZCA9CisgICAgICAgIGdzdF9ydHBfYnVmZmVyX2NhbGNfcGF5bG9hZF9sZW4gKEdTVF9SVFBfQkFTRV9QQVlMT0FEX01UVSAoc2JjcGF5KSAtCisgICAgICAgIFJUUF9TQkNfUEFZTE9BRF9IRUFERVJfU0laRSwgMCwgMCk7CisKKyAgICBtYXhfcGF5bG9hZCA9IE1JTiAobWF4X3BheWxvYWQsIGF2YWlsYWJsZSk7CisgICAgZnJhbWVfY291bnQgPSBtYXhfcGF5bG9hZCAvIHNiY3BheS0+ZnJhbWVfbGVuZ3RoOworICAgIHBheWxvYWRfbGVuZ3RoID0gZnJhbWVfY291bnQgKiBzYmNwYXktPmZyYW1lX2xlbmd0aDsKKyAgICBpZiAocGF5bG9hZF9sZW5ndGggPT0gMCkgICAgLyogTm90aGluZyB0byBzZW5kICovCisgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKFJUUF9TQkNfUEFZTE9BRF9IRUFERVJfU0laRSwgMCwgMCk7CisKKyAgICAvKiBnZXQgcGF5bG9hZCAqLworICAgIGdzdF9ydHBfYnVmZmVyX21hcCAob3V0YnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKworICAgIGdzdF9ydHBfYnVmZmVyX3NldF9wYXlsb2FkX3R5cGUgKCZydHAsIEdTVF9SVFBfQkFTRV9QQVlMT0FEX1BUIChzYmNwYXkpKTsKKworICAgIC8qIHdyaXRlIGhlYWRlciBhbmQgY29weSBkYXRhIGludG8gcGF5bG9hZCAqLworICAgIHBheWxvYWRfZGF0YSA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKTsKKyAgICBwYXlsb2FkID0gKHN0cnVjdCBydHBfcGF5bG9hZCAqKSBwYXlsb2FkX2RhdGE7CisgICAgbWVtc2V0IChwYXlsb2FkLCAwLCBzaXplb2YgKHN0cnVjdCBydHBfcGF5bG9hZCkpOworICAgIHBheWxvYWQtPmZyYW1lX2NvdW50ID0gZnJhbWVfY291bnQ7CisKKyAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgICBwYXlidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlcl9mYXN0IChzYmNwYXktPmFkYXB0ZXIsIHBheWxvYWRfbGVuZ3RoKTsKKyAgICBnc3RfcnRwX2NvcHlfYXVkaW9fbWV0YSAoc2JjcGF5LCBvdXRidWYsIHBheWJ1Zik7CisgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKG91dGJ1ZiwgcGF5YnVmKTsKKworICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gc2JjcGF5LT5sYXN0X3RpbWVzdGFtcDsKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gZnJhbWVfY291bnQgKiBzYmNwYXktPmZyYW1lX2R1cmF0aW9uOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNiY3BheSwgIlB1c2hpbmcgJWQgYnl0ZXM6ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgcGF5bG9hZF9sZW5ndGgsIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfUFRTIChvdXRidWYpKSk7CisKKyAgICBzYmNwYXktPmxhc3RfdGltZXN0YW1wICs9IGZyYW1lX2NvdW50ICogc2JjcGF5LT5mcmFtZV9kdXJhdGlvbjsKKworICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChzYmNwYXkpLCBvdXRidWYpOworCisgICAgLyogdHJ5IHRvIHNlbmQgYW5vdGhlciBSVFAgYnVmZmVyIGlmIGF2YWlsYWJsZSBkYXRhIGV4Y2VlZHMgTVRVIHNpemUgKi8KKyAgfSB3aGlsZSAocmVzID09IEdTVF9GTE9XX09LKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9zYmNfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSdHBTQkNQYXkgKnNiY3BheTsKKyAgZ3VpbnQgYXZhaWxhYmxlOworCisgIC8qIEZJWE1FIGNoZWNrIGZvciBuZWdvdGlhdGlvbiAqLworCisgIHNiY3BheSA9IEdTVF9SVFBfU0JDX1BBWSAocGF5bG9hZCk7CisKKyAgaWYgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAoYnVmZmVyKSkgeworICAgIC8qIFRyeSB0byBmbHVzaCB3aGF0ZXZlcidzIGxlZnQgKi8KKyAgICBnc3RfcnRwX3NiY19wYXlfZmx1c2hfYnVmZmVycyAoc2JjcGF5KTsKKyAgICAvKiBEcm9wIHRoZSByZXN0ICovCisgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKHNiY3BheS0+YWRhcHRlciwKKyAgICAgICAgZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChzYmNwYXktPmFkYXB0ZXIpKTsKKyAgICAvKiBSZXNldCB0aW1lc3RhbXBzICovCisgICAgc2JjcGF5LT5sYXN0X3RpbWVzdGFtcCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIH0KKworICBpZiAoc2JjcGF5LT5sYXN0X3RpbWVzdGFtcCA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgIHNiY3BheS0+bGFzdF90aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKTsKKworICBnc3RfYWRhcHRlcl9wdXNoIChzYmNwYXktPmFkYXB0ZXIsIGJ1ZmZlcik7CisKKyAgYXZhaWxhYmxlID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChzYmNwYXktPmFkYXB0ZXIpOworICBpZiAoYXZhaWxhYmxlICsgUlRQX1NCQ19IRUFERVJfVE9UQUwgPj0KKyAgICAgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX01UVSAoc2JjcGF5KSB8fAorICAgICAgKGF2YWlsYWJsZSA+IChzYmNwYXktPm1pbl9mcmFtZXMgKiBzYmNwYXktPmZyYW1lX2xlbmd0aCkpKQorICAgIHJldHVybiBnc3RfcnRwX3NiY19wYXlfZmx1c2hfYnVmZmVycyAoc2JjcGF5KTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9zYmNfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UnRwU0JDUGF5ICpzYmNwYXkgPSBHU1RfUlRQX1NCQ19QQVkgKHBheWxvYWQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgIGdzdF9ydHBfc2JjX3BheV9mbHVzaF9idWZmZXJzIChzYmNwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChwYXlsb2FkLCBldmVudCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3NiY19wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cFNCQ1BheSAqc2JjcGF5ID0gR1NUX1JUUF9TQkNfUEFZIChvYmplY3QpOworCisgIGdfb2JqZWN0X3VucmVmIChzYmNwYXktPmFkYXB0ZXIpOworCisgIEdTVF9DQUxMX1BBUkVOVCAoR19PQkpFQ1RfQ0xBU1MsIGZpbmFsaXplLCAob2JqZWN0KSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3NiY19wYXlfY2xhc3NfaW5pdCAoR3N0UnRwU0JDUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqcGF5bG9hZF9jbGFzcyA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX3NiY19wYXlfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9ydHBfc2JjX3BheV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9ydHBfc2JjX3BheV9nZXRfcHJvcGVydHk7CisKKyAgcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9zYmNfcGF5X3NldF9jYXBzKTsKKyAgcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2J1ZmZlciA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9zYmNfcGF5X2hhbmRsZV9idWZmZXIpOworICBwYXlsb2FkX2NsYXNzLT5zaW5rX2V2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfc2JjX3BheV9zaW5rX2V2ZW50KTsKKworICAvKiBwcm9wZXJ0aWVzICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksCisgICAgICBQUk9QX01JTl9GUkFNRVMsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgibWluLWZyYW1lcyIsICJtaW5pbXVtIGZyYW1lIG51bWJlciIsCisgICAgICAgICAgIk1pbmltdW0gcXVhbnRpdHkgb2YgZnJhbWVzIHRvIHNlbmQgaW4gb25lIHBhY2tldCAiCisgICAgICAgICAgIigtMSBmb3IgbWF4aW11bSBhbGxvd2VkIGJ5IHRoZSBtdHUpIiwKKyAgICAgICAgICAtMSwgR19NQVhJTlQsIERFRkFVTFRfTUlOX0ZSQU1FUywgR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3NiY19wYXlfc2lua19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9zYmNfcGF5X3NyY19mYWN0b3J5KTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiUlRQIHBhY2tldCBwYXlsb2FkZXIiLAorICAgICAgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrIiwgIlBheWxvYWQgU0JDIGF1ZGlvIGFzIFJUUCBwYWNrZXRzIiwKKyAgICAgICJUaGlhZ28gU291c2EgU2FudG9zIDx0aGlhZ29zc0BsY2MudWZjZy5lZHUuYnI+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9ydHBfc2JjX3BheV9kZWJ1ZywgInJ0cHNiY3BheSIsIDAsCisgICAgICAiUlRQIFNCQyBwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc2JjX3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwU0JDUGF5ICpzYmNwYXk7CisKKyAgc2JjcGF5ID0gR1NUX1JUUF9TQkNfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NSU5fRlJBTUVTOgorICAgICAgc2JjcGF5LT5taW5fZnJhbWVzID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3NiY19wYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cFNCQ1BheSAqc2JjcGF5OworCisgIHNiY3BheSA9IEdTVF9SVFBfU0JDX1BBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTUlOX0ZSQU1FUzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHNiY3BheS0+bWluX2ZyYW1lcyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3NiY19wYXlfaW5pdCAoR3N0UnRwU0JDUGF5ICogc2VsZikKK3sKKyAgc2VsZi0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKKyAgc2VsZi0+ZnJhbWVfbGVuZ3RoID0gMDsKKyAgc2VsZi0+bGFzdF90aW1lc3RhbXAgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIHNlbGYtPm1pbl9mcmFtZXMgPSBERUZBVUxUX01JTl9GUkFNRVM7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX3NiY19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBzYmNwYXkiLCBHU1RfUkFOS19OT05FLAorICAgICAgR1NUX1RZUEVfUlRQX1NCQ19QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBzYmNwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwc2JjcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3MDIyOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwc2JjcGF5LmgKQEAgLTAsMCArMSw2NSBAQAorLyogIEdTdHJlYW1lciBSVFAgU0JDIHBheWxvYWRlcgorICogIEJsdWVaIC0gQmx1ZXRvb3RoIHByb3RvY29sIHN0YWNrIGZvciBMaW51eAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCAgTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VwYXlsb2FkLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9TQkNfUEFZIFwKKyAgKGdzdF9ydHBfc2JjX3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX1NCQ19QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfU0JDX1BBWSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RSdHBTQkNQYXkpKQorI2RlZmluZSBHU1RfUlRQX1NCQ19QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX1NCQ19QQVksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0UnRwU0JDUGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1NCQ19QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfU0JDX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfU0JDX1BBWV9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX1NCQ19QQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU0JDUGF5IEdzdFJ0cFNCQ1BheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBTQkNQYXlDbGFzcyBHc3RSdHBTQkNQYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBTQkNQYXkgeworICBHc3RSVFBCYXNlUGF5bG9hZCBiYXNlOworCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisgIEdzdENsb2NrVGltZSBsYXN0X3RpbWVzdGFtcDsKKworICBndWludCBmcmFtZV9sZW5ndGg7CisgIEdzdENsb2NrVGltZSBmcmFtZV9kdXJhdGlvbjsKKworICBndWludCBtaW5fZnJhbWVzOworfTsKKworc3RydWN0IF9Hc3RSdHBTQkNQYXlDbGFzcyB7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9zYmNfcGF5X2dldF90eXBlKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX3NiY19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHNpcmVuZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwc2lyZW5kZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMjcyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHNpcmVuZGVwYXkuYwpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIFNpcmVuIERlcGF5bG9hZGVyIEdzdCBFbGVtZW50CisgKgorICogICBAYXV0aG9yOiBZb3VuZXNzIEFsYW91aSA8a2FrYXJvdG9Aa2FrYXJvdG8uaG9tZWxpbnV4Lm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSAiZ3N0cnRwc2lyZW5kZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3NpcmVuX2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgMTYwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIlNJUkVOXCIiKQorICAgIC8qIFRoaXMgaXMgdGhlIGRlZmF1bHQsIHNvIHRoZSBwZWVyIGRvZXNuJ3QgaGF2ZSB0byBzcGVjaWZ5IGl0ICovCisgICAgLyogICIgImRjdC1sZW5ndGggPSAoaW50KSAzMjAiKSAqLworICAgICk7CisKKyAgICAgc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfc2lyZW5fZGVwYXlfc3JjX3RlbXBsYXRlID0KKyAgICAgICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXNpcmVuLCAiICJkY3QtbGVuZ3RoID0gKGludCkgMzIwIikKKyAgICApOworCisgICAgIHN0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfc2lyZW5fZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqCisgICAgZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApOworICAgICBzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9zaXJlbl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICoKKyAgICBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKTsKKworR19ERUZJTkVfVFlQRSAoR3N0UlRQU2lyZW5EZXBheSwgZ3N0X3J0cF9zaXJlbl9kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCisgICAgIHN0YXRpYyB2b2lkIGdzdF9ydHBfc2lyZW5fZGVwYXlfY2xhc3NfaW5pdCAoR3N0UlRQU2lyZW5EZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX3NpcmVuX2RlcGF5X3Byb2Nlc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9zaXJlbl9kZXBheV9zZXRjYXBzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfc2lyZW5fZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9zaXJlbl9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgU2lyZW4gcGFja2V0IGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBTaXJlbiBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIiwKKyAgICAgICJQaGlsaXBwZSBLYWxhZiA8cGhpbGlwcGUua2FsYWZAY29sbGFib3JhLmNvLnVrPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zaXJlbl9kZXBheV9pbml0IChHc3RSVFBTaXJlbkRlcGF5ICogcnRwc2lyZW5kZXBheSkKK3sKKworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfc2lyZW5fZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIGdib29sZWFuIHJldDsKKworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtc2lyZW4iLAorICAgICAgImRjdC1sZW5ndGgiLCBHX1RZUEVfSU5ULCAzMjAsIE5VTEwpOworICByZXQgPSBnc3RfcGFkX3NldF9jYXBzIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NSQ1BBRCAoZGVwYXlsb2FkKSwgc3JjY2Fwcyk7CisKKyAgR1NUX0RFQlVHICgic2V0IGNhcHMgb24gc291cmNlOiAlIiBHU1RfUFRSX0ZPUk1BVCAiIChyZXQ9JWQpIiwgc3JjY2FwcywgcmV0KTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIC8qIGFsd2F5cyBmaXhlZCBjbG9jayByYXRlIG9mIDE2MDAwICovCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IDE2MDAwOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9zaXJlbl9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0QnVmZmVyICpvdXRidWY7CisKKyAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfYnVmZmVyIChydHApOworCisgIGlmIChvdXRidWYpIHsKKyAgICBnc3RfcnRwX2Ryb3Bfbm9uX2F1ZGlvX21ldGEgKGRlcGF5bG9hZCwgb3V0YnVmKTsKKyAgfQorCisgIHJldHVybiBvdXRidWY7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX3NpcmVuX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwc2lyZW5kZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9TSVJFTl9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHNpcmVuZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwc2lyZW5kZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZmZiMTEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHNpcmVuZGVwYXkuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogU2lyZW4gRGVwYXlsb2FkZXIgR3N0IEVsZW1lbnQKKyAqCisgKiAgIEBhdXRob3I6IFlvdW5lc3MgQWxhb3VpIDxrYWthcm90b0BrYWthcm90by5ob21lbGludXgubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1NJUkVOX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfU0lSRU5fREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMgdHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUFNpcmVuRGVwYXkgR3N0UlRQU2lyZW5EZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBTaXJlbkRlcGF5Q2xhc3MgR3N0UlRQU2lyZW5EZXBheUNsYXNzOworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9TSVJFTl9ERVBBWSBcCisgIChnc3RfcnRwX3NpcmVuX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfU0lSRU5fREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfU0lSRU5fREVQQVksR3N0UlRQU2lyZW5EZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfU0lSRU5fREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX1NJUkVOX0RFUEFZLEdzdFJUUFNpcmVuRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfU0lSRU5fREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfU0lSRU5fREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX1NJUkVOX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9TSVJFTl9ERVBBWSkpCisKKworc3RydWN0IF9Hc3RSVFBTaXJlbkRlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworCit9OworCitzdHJ1Y3QgX0dzdFJUUFNpcmVuRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9zaXJlbl9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfc2lyZW5fZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYgLyogX19HU1RfUlRQX1NJUkVOX0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBzaXJlbnBheS5jIGIvZ3N0L3J0cC9nc3RydHBzaXJlbnBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZjlhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmMKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBTaXJlbiBQYXlsb2FkZXIgR3N0IEVsZW1lbnQKKyAqCisgKiAgIEBhdXRob3I6IFlvdW5lc3MgQWxhb3VpIDxrYWthcm90b0BrYWthcm90by5ob21lbGludXgubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdHJ0cHNpcmVucGF5LmgiCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwc2lyZW5wYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cHNpcmVucGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9zaXJlbl9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXNpcmVuLCAiICJkY3QtbGVuZ3RoID0gKGludCkgMzIwIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9zaXJlbl9wYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgMTYwMDAsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIlNJUkVOXCIsICIKKyAgICAgICAgImJpdHJhdGUgPSAoc3RyaW5nKSBcIjE2MDAwXCIsICIgImRjdC1sZW5ndGggPSAoaW50KSAzMjAiKQorICAgICk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3NpcmVuX3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworCitHX0RFRklORV9UWVBFIChHc3RSVFBTaXJlblBheSwgZ3N0X3J0cF9zaXJlbl9wYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfQVVESU9fUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3NpcmVuX3BheV9jbGFzc19pbml0IChHc3RSVFBTaXJlblBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9zaXJlbl9wYXlfc2V0Y2FwczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3NpcmVuX3BheV9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9zaXJlbl9wYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgUGF5bG9hZGVyIGZvciBTaXJlbiBBdWRpbyIsICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBhY2tldGl6ZSBTaXJlbiBhdWRpbyBzdHJlYW1zIGludG8gUlRQIHBhY2tldHMiLAorICAgICAgIllvdW5lc3MgQWxhb3VpIDxrYWthcm90b0BrYWthcm90by5ob21lbGludXgubmV0PiIpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBzaXJlbnBheV9kZWJ1ZywgInJ0cHNpcmVucGF5IiwgMCwKKyAgICAgICJzaXJlbiBhdWRpbyBSVFAgcGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3NpcmVuX3BheV9pbml0IChHc3RSVFBTaXJlblBheSAqIHJ0cHNpcmVucGF5KQoreworICBHc3RSVFBCYXNlUGF5bG9hZCAqcnRwYmFzZXBheWxvYWQ7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgKnJ0cGJhc2VhdWRpb3BheWxvYWQ7CisKKyAgcnRwYmFzZXBheWxvYWQgPSBHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwc2lyZW5wYXkpOworICBydHBiYXNlYXVkaW9wYXlsb2FkID0gR1NUX1JUUF9CQVNFX0FVRElPX1BBWUxPQUQgKHJ0cHNpcmVucGF5KTsKKworICAvKiB3ZSBkb24ndCBzZXQgdGhlIHBheWxvYWQgdHlwZSwgaXQgc2hvdWxkIGJlIHNldCBieSB0aGUgYXBwbGljYXRpb24gdXNpbmcKKyAgICogdGhlIHB0IHByb3BlcnR5IG9yIHRoZSBkZWZhdWx0IDk2IHdpbGwgYmUgdXNlZCAqLworICBydHBiYXNlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IDE2MDAwOworCisgIC8qIHRlbGwgcnRwYmFzZWF1ZGlvcGF5bG9hZCB0aGF0IHRoaXMgaXMgYSBmcmFtZSBiYXNlZCBjb2RlYyAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfZnJhbWVfYmFzZWQgKHJ0cGJhc2VhdWRpb3BheWxvYWQpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfc2lyZW5fcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcnRwYmFzZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RSVFBTaXJlblBheSAqcnRwc2lyZW5wYXk7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgKnJ0cGJhc2VhdWRpb3BheWxvYWQ7CisgIGdpbnQgZGN0X2xlbmd0aDsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGNvbnN0IGNoYXIgKnBheWxvYWRfbmFtZTsKKworICBydHBzaXJlbnBheSA9IEdTVF9SVFBfU0lSRU5fUEFZIChydHBiYXNlcGF5bG9hZCk7CisgIHJ0cGJhc2VhdWRpb3BheWxvYWQgPSBHU1RfUlRQX0JBU0VfQVVESU9fUEFZTE9BRCAocnRwYmFzZXBheWxvYWQpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiZGN0LWxlbmd0aCIsICZkY3RfbGVuZ3RoKTsKKyAgaWYgKGRjdF9sZW5ndGggIT0gMzIwKQorICAgIGdvdG8gd3JvbmdfZGN0OworCisgIHBheWxvYWRfbmFtZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHN0cnVjdHVyZSk7CisgIGlmIChnX2FzY2lpX3N0cmNhc2VjbXAgKCJhdWRpby94LXNpcmVuIiwgcGF5bG9hZF9uYW1lKSkKKyAgICBnb3RvIHdyb25nX2NhcHM7CisKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHJ0cGJhc2VwYXlsb2FkLCAiYXVkaW8iLCBUUlVFLCAiU0lSRU4iLAorICAgICAgMTYwMDApOworICAvKiBzZXQgb3B0aW9ucyBmb3IgdGhpcyBmcmFtZSBiYXNlZCBhdWRpbyBjb2RlYyAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfZnJhbWVfb3B0aW9ucyAocnRwYmFzZWF1ZGlvcGF5bG9hZCwgMjAsIDQwKTsKKworICByZXR1cm4gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHJ0cGJhc2VwYXlsb2FkLCBOVUxMKTsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX2RjdDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cHNpcmVucGF5LCAiZGN0LWxlbmd0aCBtdXN0IGJlIDMyMCwgcmVjZWl2ZWQgJWQiLAorICAgICAgICBkY3RfbGVuZ3RoKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3dyb25nX2NhcHM6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChydHBzaXJlbnBheSwgImV4cGVjdGVkIGF1ZGlvL3gtc2lyZW4sIHJlY2VpdmVkICVzIiwKKyAgICAgICAgcGF5bG9hZF9uYW1lKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfc2lyZW5fcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwc2lyZW5wYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfU0lSRU5fUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwc2lyZW5wYXkuaCBiL2dzdC9ydHAvZ3N0cnRwc2lyZW5wYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWJhNWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBzaXJlbnBheS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBTaXJlbiBQYXlsb2FkZXIgR3N0IEVsZW1lbnQKKyAqCisgKiAgIEBhdXRob3I6IFlvdW5lc3MgQWxhb3VpIDxrYWthcm90b0BrYWthcm90by5ob21lbGludXgubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1NJUkVOX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1NJUkVOX1BBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VhdWRpb3BheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworI2RlZmluZSBHU1RfVFlQRV9SVFBfU0lSRU5fUEFZIFwKKyAgKGdzdF9ydHBfc2lyZW5fcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfU0lSRU5fUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1NJUkVOX1BBWSxHc3RSVFBTaXJlblBheSkpCisjZGVmaW5lIEdTVF9SVFBfU0lSRU5fUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9TSVJFTl9QQVksR3N0UlRQU2lyZW5QYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfU0lSRU5fUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1NJUkVOX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfU0lSRU5fUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9TSVJFTl9QQVkpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUFNpcmVuUGF5IEdzdFJUUFNpcmVuUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUFNpcmVuUGF5Q2xhc3MgR3N0UlRQU2lyZW5QYXlDbGFzczsKKworc3RydWN0IF9Hc3RSVFBTaXJlblBheQoreworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkIGF1ZGlvcGF5bG9hZDsKK307CisKK3N0cnVjdCBfR3N0UlRQU2lyZW5QYXlDbGFzcworeworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9zaXJlbl9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX3NpcmVuX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9SVFBfU0lSRU5fUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmM5ODdiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmMKQEAgLTAsMCArMSwyMjYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJnc3RydHBzcGVleGRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworLyogUnRwU1BFRVhEZXBheSBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKK2VudW0KK3sKKyAgUFJPUF8wCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9zcGVleF9kZXBheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9ICAoaW50KSBbNjAwMCwgNDgwMDBdLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJTUEVFWFwiIikKKyAgICAvKiAgImVuY29kaW5nLXBhcmFtcyA9IChzdHJpbmcpIFwiMVwiIiAqLworICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3NwZWV4X2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1zcGVleCIpCisgICAgKTsKKworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9zcGVleF9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9zcGVleF9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworR19ERUZJTkVfVFlQRSAoR3N0UnRwU1BFRVhEZXBheSwgZ3N0X3J0cF9zcGVleF9kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zcGVleF9kZXBheV9jbGFzc19pbml0IChHc3RSdHBTUEVFWERlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfc3BlZXhfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX3NwZWV4X2RlcGF5X3NldGNhcHM7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9zcGVleF9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3NwZWV4X2RlcGF5X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBTcGVleCBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgU3BlZXggYXVkaW8gZnJvbSBSVFAgcGFja2V0cyIsCisgICAgICAiRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc3BlZXhfZGVwYXlfaW5pdCAoR3N0UnRwU1BFRVhEZXBheSAqIHJ0cHNwZWV4ZGVwYXkpCit7Cit9CisKK3N0YXRpYyBnaW50Citnc3RfcnRwX3NwZWV4X2RlcGF5X2dldF9tb2RlIChnaW50IHJhdGUpCit7CisgIGlmIChyYXRlID4gMjUwMDApCisgICAgcmV0dXJuIDI7CisgIGVsc2UgaWYgKHJhdGUgPiAxMjUwMCkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBsZW4gNCBieXRlcyBMRSwKKyAqIHZlbmRvciBzdHJpbmcgKGxlbiBieXRlcyksCisgKiB1c2VyX2xlbiA0ICgwKSBieXRlcyBMRQorICovCitzdGF0aWMgY29uc3QgZ2NoYXIgZ3N0X3J0cF9zcGVleF9jb21tZW50W10gPQorICAgICJcMDQ1XDBcMFwwRGVwYXlsb2FkZWQgd2l0aCBHU3RyZWFtZXIgc3BlZXhkZXBheVwwXDBcMFwwIjsKKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3NwZWV4X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgR3N0UnRwU1BFRVhEZXBheSAqcnRwc3BlZXhkZXBheTsKKyAgZ2ludCBjbG9ja19yYXRlLCBuYl9jaGFubmVsczsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKmRhdGE7CisgIGNvbnN0IGdjaGFyICpwYXJhbXM7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIGdib29sZWFuIHJlczsKKworICBydHBzcGVleGRlcGF5ID0gR1NUX1JUUF9TUEVFWF9ERVBBWSAoZGVwYXlsb2FkKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkKKyAgICBnb3RvIG5vX2Nsb2NrcmF0ZTsKKyAgZGVwYXlsb2FkLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICBpZiAoIShwYXJhbXMgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImVuY29kaW5nLXBhcmFtcyIpKSkKKyAgICBuYl9jaGFubmVscyA9IDE7CisgIGVsc2UgeworICAgIG5iX2NoYW5uZWxzID0gYXRvaSAocGFyYW1zKTsKKyAgfQorCisgIC8qIGNvbnN0cnVjdCBtaW5pbWFsIGhlYWRlciBhbmQgY29tbWVudCBwYWNrZXQgZm9yIHRoZSBkZWNvZGVyICovCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoODApOworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworICBtZW1jcHkgKGRhdGEsICJTcGVleCAgICIsIDgpOworICBkYXRhICs9IDg7CisgIG1lbWNweSAoZGF0YSwgIjEuMS4xMiIsIDcpOworICBkYXRhICs9IDIwOworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhLCAxKTsgICAgICAgIC8qIHZlcnNpb24gKi8KKyAgZGF0YSArPSA0OworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhLCA4MCk7ICAgICAgIC8qIGhlYWRlcl9zaXplICovCisgIGRhdGEgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoZGF0YSwgY2xvY2tfcmF0ZSk7ICAgICAgIC8qIHJhdGUgKi8KKyAgZGF0YSArPSA0OworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhLCBnc3RfcnRwX3NwZWV4X2RlcGF5X2dldF9tb2RlIChjbG9ja19yYXRlKSk7ICAgICAgICAvKiBtb2RlICovCisgIGRhdGEgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoZGF0YSwgNCk7ICAgICAgICAvKiBtb2RlX2JpdHN0cmVhbV92ZXJzaW9uICovCisgIGRhdGEgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoZGF0YSwgbmJfY2hhbm5lbHMpOyAgICAgIC8qIG5iX2NoYW5uZWxzICovCisgIGRhdGEgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoZGF0YSwgLTEpOyAgICAgICAvKiBiaXRyYXRlICovCisgIGRhdGEgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoZGF0YSwgMHhhMCk7ICAgICAvKiBmcmFtZV9zaXplICovCisgIGRhdGEgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoZGF0YSwgMCk7ICAgICAgICAvKiBWQlIgKi8KKyAgZGF0YSArPSA0OworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhLCAxKTsgICAgICAgIC8qIGZyYW1lc19wZXJfcGFja2V0ICovCisgIGRhdGEgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoZGF0YSwgMCk7ICAgICAgICAvKiBleHRyYV9oZWFkZXJzICovCisgIGRhdGEgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoZGF0YSwgMCk7ICAgICAgICAvKiByZXNlcnZlZDEgKi8KKyAgZGF0YSArPSA0OworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhLCAwKTsgICAgICAgIC8qIHJlc2VydmVkMiAqLworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8veC1zcGVleCIpOworICByZXMgPSBnc3RfcGFkX3NldF9jYXBzIChkZXBheWxvYWQtPnNyY3BhZCwgc3JjY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICBnc3RfcnRwX2Jhc2VfZGVwYXlsb2FkX3B1c2ggKEdTVF9SVFBfQkFTRV9ERVBBWUxPQUQgKHJ0cHNwZWV4ZGVwYXkpLCBidWYpOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZW9mIChnc3RfcnRwX3NwZWV4X2NvbW1lbnQpKTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsIGdzdF9ydHBfc3BlZXhfY29tbWVudCwKKyAgICAgIHNpemVvZiAoZ3N0X3J0cF9zcGVleF9jb21tZW50KSk7CisKKyAgZ3N0X3J0cF9iYXNlX2RlcGF5bG9hZF9wdXNoIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEIChydHBzcGVleGRlcGF5KSwgYnVmKTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworbm9fY2xvY2tyYXRlOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAibm8gY2xvY2stcmF0ZSBzcGVjaWZpZWQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX3NwZWV4X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RCdWZmZXIgKm91dGJ1ZiA9IE5VTEw7CisKKyAgR1NUX0RFQlVHICgicHJvY2VzcyA6IGdvdCAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzLCBtYXJrICVkIHRzICV1IHNlcW4gJWQiLAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAocnRwLT5idWZmZXIpLAorICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAocnRwKSwKKyAgICAgIGdzdF9ydHBfYnVmZmVyX2dldF90aW1lc3RhbXAgKHJ0cCksIGdzdF9ydHBfYnVmZmVyX2dldF9zZXEgKHJ0cCkpOworCisgIC8qIG5vdGhpbmcgc3BlY2lhbCB0byBiZSBkb25lICovCisgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2J1ZmZlciAocnRwKTsKKworICBpZiAob3V0YnVmKSB7CisgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9IDIwICogR1NUX01TRUNPTkQ7CisgICAgZ3N0X3J0cF9kcm9wX25vbl9hdWRpb19tZXRhIChkZXBheWxvYWQsIG91dGJ1Zik7CisgIH0KKworICByZXR1cm4gb3V0YnVmOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9zcGVleF9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHNwZWV4ZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfU1BFRVhfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWZmZWQwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmgKQEAgLTAsMCArMSw1MyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIAorICovCisgCisjaWZuZGVmIF9fR1NUX1JUUF9TUEVFWF9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1NQRUVYX0RFUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBTUEVFWERlcGF5IEdzdFJ0cFNQRUVYRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU1BFRVhEZXBheUNsYXNzIEdzdFJ0cFNQRUVYRGVwYXlDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfU1BFRVhfREVQQVkgXAorICAoZ3N0X3J0cF9zcGVleF9kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX1NQRUVYX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1NQRUVYX0RFUEFZLEdzdFJ0cFNQRUVYRGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX1NQRUVYX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9TUEVFWF9ERVBBWSxHc3RSdHBTUEVFWERlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1NQRUVYX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1NQRUVYX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9TUEVFWF9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfU1BFRVhfREVQQVkpKQorCitzdHJ1Y3QgX0dzdFJ0cFNQRUVYRGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cFNQRUVYRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9zcGVleF9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfc3BlZXhfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfU1BFRVhfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmMgYi9nc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgxNmJkNgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYwpAQCAtMCwwICsxLDM1MCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgImdzdHJ0cHNwZWV4cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwc3BlZXhwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cHNwZWV4cGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9zcGVleF9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXNwZWV4LCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyA2MDAwLCA0ODAwMCBdLCAiICJjaGFubmVscyA9IChpbnQpIDEiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3NwZWV4X3BheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAgKGludCkgWyA2MDAwLCA0ODAwMCBdLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJTUEVFWFwiLCAiCisgICAgICAgICJlbmNvZGluZy1wYXJhbXMgPSAoc3RyaW5nKSBcIjFcIiIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfc3BlZXhfcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3NwZWV4X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdENhcHMgKmdzdF9ydHBfc3BlZXhfcGF5X2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9zcGVleF9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKgorICAgIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKKyNkZWZpbmUgZ3N0X3J0cF9zcGVleF9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwU1BFRVhQYXksIGdzdF9ydHBfc3BlZXhfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9QQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc3BlZXhfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cFNQRUVYUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzICpnc3RydHBiYXNlcGF5bG9hZF9jbGFzczsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfcnRwX3NwZWV4X3BheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9zcGVleF9wYXlfc2V0Y2FwczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPmdldF9jYXBzID0gZ3N0X3J0cF9zcGVleF9wYXlfZ2V0Y2FwczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX3NwZWV4X3BheV9oYW5kbGVfYnVmZmVyOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfc3BlZXhfcGF5X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3NwZWV4X3BheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBTcGVleCBwYXlsb2FkZXIiLCAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYXlsb2FkLWVuY29kZXMgU3BlZXggYXVkaW8gaW50byBhIFJUUCBwYWNrZXQiLAorICAgICAgIkVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cHNwZWV4cGF5X2RlYnVnLCAicnRwc3BlZXhwYXkiLCAwLAorICAgICAgIlNwZWV4IFJUUCBQYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc3BlZXhfcGF5X2luaXQgKEdzdFJ0cFNQRUVYUGF5ICogcnRwc3BlZXhwYXkpCit7CisgIEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBzcGVleHBheSktPmNsb2NrX3JhdGUgPSA4MDAwOworICBHU1RfUlRQX0JBU0VfUEFZTE9BRF9QVCAocnRwc3BlZXhwYXkpID0gMTEwOyAgLyogQ3JlYXRlIFN0cmluZyAqLworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfc3BlZXhfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIC8qIGRvbid0IGNvbmZpZ3VyZSB5ZXQsIHdlIHdhaXQgZm9yIHRoZSBpZGVudCBwYWNrZXQgKi8KKyAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3J0cF9zcGVleF9wYXlfZ2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RQYWQgKiBwYWQsCisgICAgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0Q2FwcyAqb3RoZXJwYWRjYXBzOworICBHc3RDYXBzICpjYXBzOworCisgIG90aGVycGFkY2FwcyA9IGdzdF9wYWRfZ2V0X2FsbG93ZWRfY2FwcyAocGF5bG9hZC0+c3JjcGFkKTsKKyAgY2FwcyA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChwYWQpOworCisgIGlmIChvdGhlcnBhZGNhcHMpIHsKKyAgICBpZiAoIWdzdF9jYXBzX2lzX2VtcHR5IChvdGhlcnBhZGNhcHMpKSB7CisgICAgICBHc3RTdHJ1Y3R1cmUgKnBzOworICAgICAgR3N0U3RydWN0dXJlICpzOworICAgICAgZ2ludCBjbG9ja19yYXRlOworCisgICAgICBwcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKG90aGVycGFkY2FwcywgMCk7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoY2Fwcyk7CisgICAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHBzLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkgeworICAgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ludCAocywgInJhdGUiLCBjbG9ja19yYXRlKTsKKyAgICAgIH0KKyAgICB9CisgICAgZ3N0X2NhcHNfdW5yZWYgKG90aGVycGFkY2Fwcyk7CisgIH0KKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqdGNhcHMgPSBjYXBzOworCisgICAgY2FwcyA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHRjYXBzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmICh0Y2Fwcyk7CisgIH0KKworICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3NwZWV4X3BheV9wYXJzZV9pZGVudCAoR3N0UnRwU1BFRVhQYXkgKiBydHBzcGVleHBheSwKKyAgICBjb25zdCBndWludDggKiBkYXRhLCBndWludCBzaXplKQoreworICBndWludDMyIHZlcnNpb24sIGhlYWRlcl9zaXplLCByYXRlLCBtb2RlLCBuYl9jaGFubmVsczsKKyAgR3N0UlRQQmFzZVBheWxvYWQgKnBheWxvYWQ7CisgIGdjaGFyICpjc3RyOworICBnYm9vbGVhbiByZXM7CisKKyAgLyogd2UgbmVlZCB0aGUgaGVhZGVyIHN0cmluZyAoOCksIHRoZSB2ZXJzaW9uIHN0cmluZyAoMjApLCB0aGUgdmVyc2lvbgorICAgKiBhbmQgdGhlIGhlYWRlciBsZW5ndGguICovCisgIGlmIChzaXplIDwgMzYpCisgICAgZ290byB0b29fc21hbGw7CisKKyAgaWYgKCFnX3N0cl9oYXNfcHJlZml4ICgoY29uc3QgZ2NoYXIgKikgZGF0YSwgIlNwZWV4ICAgIikpCisgICAgZ290byB3cm9uZ19oZWFkZXI7CisKKyAgLyogc2tpcCBoZWFkZXIgYW5kIHZlcnNpb24gc3RyaW5nICovCisgIGRhdGEgKz0gMjg7CisKKyAgdmVyc2lvbiA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSk7CisgIGlmICh2ZXJzaW9uICE9IDEpCisgICAgZ290byB3cm9uZ192ZXJzaW9uOworCisgIGRhdGEgKz0gNDsKKyAgLyogZW5zdXJlIHNpemVzICovCisgIGhlYWRlcl9zaXplID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKyAgaWYgKGhlYWRlcl9zaXplIDwgODApCisgICAgZ290byBoZWFkZXJfdG9vX3NtYWxsOworCisgIGlmIChzaXplIDwgaGVhZGVyX3NpemUpCisgICAgZ290byBwYXlsb2FkX3Rvb19zbWFsbDsKKworICBkYXRhICs9IDQ7CisgIHJhdGUgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEpOworICBkYXRhICs9IDQ7CisgIG1vZGUgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEpOworICBkYXRhICs9IDg7CisgIG5iX2NoYW5uZWxzID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBzcGVleHBheSwgInJhdGUgJWQsIG1vZGUgJWQsIG5iX2NoYW5uZWxzICVkIiwKKyAgICAgIHJhdGUsIG1vZGUsIG5iX2NoYW5uZWxzKTsKKworICBwYXlsb2FkID0gR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHJ0cHNwZWV4cGF5KTsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAocGF5bG9hZCwgImF1ZGlvIiwgRkFMU0UsICJTUEVFWCIsIHJhdGUpOworICBjc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiJWQiLCBuYl9jaGFubmVscyk7CisgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChwYXlsb2FkLCAiZW5jb2RpbmctcGFyYW1zIiwKKyAgICAgIEdfVFlQRV9TVFJJTkcsIGNzdHIsIE5VTEwpOworICBnX2ZyZWUgKGNzdHIpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCit0b29fc21hbGw6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBzcGVleHBheSwKKyAgICAgICAgImlkZW50IHBhY2tldCB0b28gc21hbGwsIG5lZWQgYXQgbGVhc3QgMzIgYnl0ZXMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3dyb25nX2hlYWRlcjoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNwZWV4cGF5LAorICAgICAgICAiaWRlbnQgcGFja2V0IGRvZXMgbm90IHN0YXJ0IHdpdGggXCJTcGVleCAgIFwiIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit3cm9uZ192ZXJzaW9uOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwc3BlZXhwYXksICJjYW4gb25seSBoYW5kbGUgdmVyc2lvbiAxLCBoYXZlIHZlcnNpb24gJWQiLAorICAgICAgICB2ZXJzaW9uKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2hlYWRlcl90b29fc21hbGw6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBzcGVleHBheSwKKyAgICAgICAgImhlYWRlciBzaXplIHRvbyBzbWFsbCwgbmVlZCBhdCBsZWFzdCA4MCBieXRlcywgIiAiZ290IG9ubHkgJWQiLAorICAgICAgICBoZWFkZXJfc2l6ZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitwYXlsb2FkX3Rvb19zbWFsbDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNwZWV4cGF5LAorICAgICAgICAicGF5bG9hZCB0b28gc21hbGwsIG5lZWQgYXQgbGVhc3QgJWQgYnl0ZXMsIGdvdCBvbmx5ICVkIiwgaGVhZGVyX3NpemUsCisgICAgICAgIHNpemUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9zcGVleF9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJ0cFNQRUVYUGF5ICpydHBzcGVleHBheTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBkdXJhdGlvbjsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgcnRwc3BlZXhwYXkgPSBHU1RfUlRQX1NQRUVYX1BBWSAoYmFzZXBheWxvYWQpOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgc3dpdGNoIChydHBzcGVleHBheS0+cGFja2V0KSB7CisgICAgY2FzZSAwOgorICAgICAgLyogaWRlbnQgcGFja2V0LiBXZSBuZWVkIHRvIHBhcnNlIHRoZSBoZWFkZXJzIHRvIGNvbnN0cnVjdCB0aGUgUlRQCisgICAgICAgKiBwcm9wZXJ0aWVzLiAqLworICAgICAgaWYgKCFnc3RfcnRwX3NwZWV4X3BheV9wYXJzZV9pZGVudCAocnRwc3BlZXhwYXksIG1hcC5kYXRhLCBtYXAuc2l6ZSkpIHsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICAgICAgZ290byBwYXJzZV9lcnJvcjsKKyAgICAgIH0KKworICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgICAgZ290byBkb25lOworICAgIGNhc2UgMToKKyAgICAgIC8qIGNvbW1lbnQgcGFja2V0LCB3ZSBpZ25vcmUgaXQgKi8KKyAgICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICAgIGdvdG8gZG9uZTsKKyAgICBkZWZhdWx0OgorICAgICAgLyogb3RoZXIgcGFja2V0cyBnbyBpbiB0aGUgcGF5bG9hZCAqLworICAgICAgYnJlYWs7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICBpZiAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmZmVyLCBHU1RfQlVGRkVSX0ZMQUdfR0FQKSkgeworICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworICBkdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcik7CisKKyAgLyogRklYTUUsIG9ubHkgb25lIFNQRUVYIGZyYW1lIHBlciBSVFAgcGFja2V0IGZvciBub3cgKi8KKworICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKDAsIDAsIDApOworICAvKiBGSVhNRSwgYXNzZXJ0IGZvciBub3cgKi8KKyAgZ19hc3NlcnQgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcikgPD0KKyAgICAgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX01UVSAocnRwc3BlZXhwYXkpKTsKKworICAvKiBjb3B5IHRpbWVzdGFtcCBhbmQgZHVyYXRpb24gKi8KKyAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSB0aW1lc3RhbXA7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPSBkdXJhdGlvbjsKKworICBnc3RfcnRwX2NvcHlfYXVkaW9fbWV0YSAoYmFzZXBheWxvYWQsIG91dGJ1ZiwgYnVmZmVyKTsKKyAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKG91dGJ1ZiwgYnVmZmVyKTsKKyAgYnVmZmVyID0gTlVMTDsKKworICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoIChiYXNlcGF5bG9hZCwgb3V0YnVmKTsKKworZG9uZToKKyAgaWYgKGJ1ZmZlcikKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgIHJ0cHNwZWV4cGF5LT5wYWNrZXQrKzsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworcGFyc2VfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocnRwc3BlZXhwYXksIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksCisgICAgICAgICgiRXJyb3IgcGFyc2luZyBmaXJzdCBpZGVudGlmaWNhdGlvbiBwYWNrZXQuIikpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9zcGVleF9wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0UnRwU1BFRVhQYXkgKnJ0cHNwZWV4cGF5OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRwc3BlZXhwYXkgPSBHU1RfUlRQX1NQRUVYX1BBWSAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgcnRwc3BlZXhwYXktPnBhY2tldCA9IDA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9zcGVleF9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBzcGVleHBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9TUEVFWF9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBzcGVleHBheS5oIGIvZ3N0L3J0cC9nc3RydHBzcGVleHBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjY2FlZmIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmgKQEAgLTAsMCArMSw1NiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIAorICovCisKKworI2lmbmRlZiBfX0dTVF9SVFBfU1BFRVhfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfU1BFRVhfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU1BFRVhQYXkgR3N0UnRwU1BFRVhQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU1BFRVhQYXlDbGFzcyBHc3RSdHBTUEVFWFBheUNsYXNzOworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9TUEVFWF9QQVkgXAorICAoZ3N0X3J0cF9zcGVleF9wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9TUEVFWF9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfU1BFRVhfUEFZLEdzdFJ0cFNQRUVYUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9TUEVFWF9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX1NQRUVYX1BBWSxHc3RSdHBTUEVFWFBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9TUEVFWF9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfU1BFRVhfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9TUEVFWF9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX1NQRUVYX1BBWSkpCisKK3N0cnVjdCBfR3N0UnRwU1BFRVhQYXkKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWQgcGF5bG9hZDsKKworICBndWludDY0IHBhY2tldDsKK307CisKK3N0cnVjdCBfR3N0UnRwU1BFRVhQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfc3BlZXhfcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9zcGVleF9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfU1BFRVhfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBzdHJlYW1kZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBzdHJlYW1kZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NTAwZTkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHN0cmVhbWRlcGF5LmMKQEAgLTAsMCArMSwyMzEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDEzIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwc3RyZWFtZGVwYXkKKyAqCisgKiBJbXBsZW1lbnRzIHN0cmVhbSBkZXBheWxvYWRpbmcgb2YgUlRQIGFuZCBSVENQIHBhY2tldHMgZm9yIGNvbm5lY3Rpb24tb3JpZW50ZWQKKyAqIHRyYW5zcG9ydCBwcm90b2NvbHMgYWNjb3JkaW5nIHRvIFJGQzQ1NzEuCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgYXVkaW90ZXN0c3JjICEgImF1ZGlvL3gtcmF3LHJhdGU9NDgwMDAiICEgdm9yYmlzZW5jICEgcnRwdm9yYmlzcGF5IGNvbmZpZy1pbnRlcnZhbD0xICEgcnRwc3RyZWFtcGF5ICEgdGNwc2VydmVyc2luayBwb3J0PTU2NzgKKyAqIGdzdC1sYXVuY2gtMS4wIHRjcGNsaWVudHNyYyBwb3J0PTU2NzggaG9zdD0xMjcuMC4wLjEgZG8tdGltZXN0YW1wPXRydWUgISAiYXBwbGljYXRpb24veC1ydHAtc3RyZWFtLG1lZGlhPWF1ZGlvLGNsb2NrLXJhdGU9NDgwMDAsZW5jb2RpbmctbmFtZT1WT1JCSVMiICEgcnRwc3RyZWFtZGVwYXkgISBydHB2b3JiaXNkZXBheSAhIGRlY29kZWJpbiAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhdXRvYXVkaW9zaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RydHBzdHJlYW1kZXBheS5oIgorCitHU1RfREVCVUdfQ0FURUdPUlkgKGdzdF9ydHBfc3RyZWFtX2RlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9ydHBfc3RyZWFtX2RlcGF5X2RlYnVnCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHA7IGFwcGxpY2F0aW9uL3gtcnRjcDsiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXNydHA7IGFwcGxpY2F0aW9uL3gtc3J0Y3AiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLCBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAtc3RyZWFtOyBhcHBsaWNhdGlvbi94LXJ0Y3Atc3RyZWFtOyIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtc3J0cC1zdHJlYW07IGFwcGxpY2F0aW9uL3gtc3J0Y3Atc3RyZWFtIikKKyAgICApOworCisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3RfcnRwX3N0cmVhbV9kZXBheV9wYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cFN0cmVhbURlcGF5LCBnc3RfcnRwX3N0cmVhbV9kZXBheSwgR1NUX1RZUEVfQkFTRV9QQVJTRSk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3N0cmVhbV9kZXBheV9zZXRfc2lua19jYXBzIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3J0cF9zdHJlYW1fZGVwYXlfZ2V0X3NpbmtfY2FwcyAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0Q2FwcyAqIGZpbHRlcik7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX3N0cmVhbV9kZXBheV9oYW5kbGVfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUsIGdpbnQgKiBza2lwc2l6ZSk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3N0cmVhbV9kZXBheV9zaW5rX2FjdGl2YXRlIChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50KTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc3RyZWFtX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cFN0cmVhbURlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0QmFzZVBhcnNlQ2xhc3MgKnBhcnNlX2NsYXNzID0gR1NUX0JBU0VfUEFSU0VfQ0xBU1MgKGtsYXNzKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3J0cF9zdHJlYW1fZGVwYXlfZGVidWcsICJydHBzdHJlYW1kZXBheSIsIDAsCisgICAgICAiUlRQIHN0cmVhbSBkZXBheWxvYWRlciIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBTdHJlYW0gRGVwYXlsb2FkaW5nIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsiLAorICAgICAgIkRlcGF5bG9hZHMgUlRQL1JUQ1AgcGFja2V0cyBmb3Igc3RyZWFtaW5nIHByb3RvY29scyBhY2NvcmRpbmcgdG8gUkZDNDU3MSIsCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4iKTsKKworICBwYXJzZV9jbGFzcy0+c2V0X3NpbmtfY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9zdHJlYW1fZGVwYXlfc2V0X3NpbmtfY2Fwcyk7CisgIHBhcnNlX2NsYXNzLT5nZXRfc2lua19jYXBzID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX3N0cmVhbV9kZXBheV9nZXRfc2lua19jYXBzKTsKKyAgcGFyc2VfY2xhc3MtPmhhbmRsZV9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9zdHJlYW1fZGVwYXlfaGFuZGxlX2ZyYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc3RyZWFtX2RlcGF5X2luaXQgKEdzdFJ0cFN0cmVhbURlcGF5ICogc2VsZikKK3sKKyAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplIChHU1RfQkFTRV9QQVJTRSAoc2VsZiksIDIpOworCisgIC8qIEZvcmNlIGFjdGl2YXRpb24gaW4gcHVzaCBtb2RlLiBXZSBuZWVkIHRvIGdldCBhIGNhcHMgZXZlbnQgZnJvbSB1cHN0cmVhbQorICAgKiB0byBrbm93IHRoZSBmdWxsIFJUUCBjYXBzLiAqLworICBnc3RfcGFkX3NldF9hY3RpdmF0ZV9mdW5jdGlvbiAoR1NUX0JBU0VfUEFSU0VfU0lOS19QQUQgKHNlbGYpLAorICAgICAgZ3N0X3J0cF9zdHJlYW1fZGVwYXlfc2lua19hY3RpdmF0ZSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9zdHJlYW1fZGVwYXlfc2V0X3NpbmtfY2FwcyAoR3N0QmFzZVBhcnNlICogcGFyc2UsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RDYXBzICpvdGhlcmNhcHM7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBnYm9vbGVhbiByZXQ7CisKKyAgb3RoZXJjYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKG90aGVyY2FwcywgMCk7CisKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtcnRwLXN0cmVhbSIpKQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtcnRwIik7CisgIGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtcnRjcC1zdHJlYW0iKSkKKyAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXJ0Y3AiKTsKKyAgZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAoc3RydWN0dXJlLCAiYXBwbGljYXRpb24veC1zcnRwLXN0cmVhbSIpKQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtc3J0cCIpOworICBlbHNlCisgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAoc3RydWN0dXJlLCAiYXBwbGljYXRpb24veC1zcnRjcCIpOworCisgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSwgb3RoZXJjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKG90aGVyY2Fwcyk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3J0cF9zdHJlYW1fZGVwYXlfZ2V0X3NpbmtfY2FwcyAoR3N0QmFzZVBhcnNlICogcGFyc2UsIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKnBlZXJmaWx0ZXIgPSBOVUxMLCAqcGVlcmNhcHMsICp0ZW1wbDsKKyAgR3N0Q2FwcyAqcmVzOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ3VpbnQgaSwgbjsKKworICBpZiAoZmlsdGVyKSB7CisgICAgcGVlcmZpbHRlciA9IGdzdF9jYXBzX2NvcHkgKGZpbHRlcik7CisgICAgbiA9IGdzdF9jYXBzX2dldF9zaXplIChwZWVyZmlsdGVyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChwZWVyZmlsdGVyLCBpKTsKKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtcnRwLXN0cmVhbSIpKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXJ0cCIpOworICAgICAgZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAoc3RydWN0dXJlLCAiYXBwbGljYXRpb24veC1ydGNwLXN0cmVhbSIpKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXJ0Y3AiKTsKKyAgICAgIGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtc3J0cC1zdHJlYW0iKSkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAoc3RydWN0dXJlLCAiYXBwbGljYXRpb24veC1zcnRwIik7CisgICAgICBlbHNlCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtc3J0Y3AiKTsKKyAgICB9CisgIH0KKworICB0ZW1wbCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChHU1RfQkFTRV9QQVJTRV9TSU5LX1BBRCAocGFyc2UpKTsKKyAgcGVlcmNhcHMgPQorICAgICAgZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSwgcGVlcmZpbHRlcik7CisKKyAgaWYgKHBlZXJjYXBzKSB7CisgICAgLyogUmVuYW1lIHN0cnVjdHVyZSBuYW1lcyAqLworICAgIHBlZXJjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAocGVlcmNhcHMpOworICAgIG4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAocGVlcmNhcHMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHBlZXJjYXBzLCBpKTsKKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtcnRwIikpCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtcnRwLXN0cmVhbSIpOworICAgICAgZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAoc3RydWN0dXJlLCAiYXBwbGljYXRpb24veC1ydGNwIikpCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtcnRjcC1zdHJlYW0iKTsKKyAgICAgIGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtc3J0cCIpKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXNydHAtc3RyZWFtIik7CisgICAgICBlbHNlCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtc3J0Y3Atc3RyZWFtIik7CisgICAgfQorCisgICAgcmVzID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKHBlZXJjYXBzLCB0ZW1wbCwgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcmNhcHMpOworICB9IGVsc2UgeworICAgIHJlcyA9IHRlbXBsOworICB9CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKmludGVyc2VjdGlvbjsKKworICAgIGludGVyc2VjdGlvbiA9CisgICAgICAgIGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHJlcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmVzKTsKKyAgICByZXMgPSBpbnRlcnNlY3Rpb247CisKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcmZpbHRlcik7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9zdHJlYW1fZGVwYXlfaGFuZGxlX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lLCBnaW50ICogc2tpcHNpemUpCit7CisgIGdzaXplIGJ1Zl9zaXplOworICBndWludDE2IHNpemU7CisKKyAgaWYgKGdzdF9idWZmZXJfZXh0cmFjdCAoZnJhbWUtPmJ1ZmZlciwgMCwgJnNpemUsIDIpICE9IDIpCisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworCisgIHNpemUgPSBHVUlOVDE2X0ZST01fQkUgKHNpemUpOworICBidWZfc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGZyYW1lLT5idWZmZXIpOworCisgIC8qIE5lZWQgbW9yZSBkYXRhICovCisgIGlmIChzaXplICsgMiA+IGJ1Zl9zaXplKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICBmcmFtZS0+b3V0X2J1ZmZlciA9CisgICAgICBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChmcmFtZS0+YnVmZmVyLCBHU1RfQlVGRkVSX0NPUFlfQUxMLCAyLCBzaXplKTsKKworICByZXR1cm4gZ3N0X2Jhc2VfcGFyc2VfZmluaXNoX2ZyYW1lIChwYXJzZSwgZnJhbWUsIHNpemUgKyAyKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3N0cmVhbV9kZXBheV9zaW5rX2FjdGl2YXRlIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCkKK3sKKyAgcmV0dXJuIGdzdF9wYWRfYWN0aXZhdGVfbW9kZSAocGFkLCBHU1RfUEFEX01PREVfUFVTSCwgVFJVRSk7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX3N0cmVhbV9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHN0cmVhbWRlcGF5IiwKKyAgICAgIEdTVF9SQU5LX05PTkUsIEdTVF9UWVBFX1JUUF9TVFJFQU1fREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBzdHJlYW1kZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBzdHJlYW1kZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MDExY2IKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHN0cmVhbWRlcGF5LmgKQEAgLTAsMCArMSw1NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9TVFJFQU1fREVQQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9TVFJFQU1fREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXBhcnNlLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfU1RSRUFNX0RFUEFZIFwKKyAgKGdzdF9ydHBfc3RyZWFtX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfU1RSRUFNX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1NUUkVBTV9ERVBBWSxHc3RSdHBTdHJlYW1EZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfU1RSRUFNX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9TVFJFQU1fREVQQVksR3N0UnRwU3RyZWFtRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfU1RSRUFNX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1NUUkVBTV9ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfU1RSRUFNX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9TVFJFQU1fREVQQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU3RyZWFtRGVwYXkgR3N0UnRwU3RyZWFtRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU3RyZWFtRGVwYXlDbGFzcyBHc3RSdHBTdHJlYW1EZXBheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cFN0cmVhbURlcGF5Cit7CisgIEdzdEJhc2VQYXJzZSBwYXJlbnQ7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cFN0cmVhbURlcGF5Q2xhc3MKK3sKKyAgR3N0QmFzZVBhcnNlQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9zdHJlYW1fZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworZ2Jvb2xlYW4gZ3N0X3J0cF9zdHJlYW1fZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBzdHJlYW1wYXkuYyBiL2dzdC9ydHAvZ3N0cnRwc3RyZWFtcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc4NDhjNAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwc3RyZWFtcGF5LmMKQEAgLTAsMCArMSwyODUgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMyBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cHN0cmVhbXBheQorICoKKyAqIEltcGxlbWVudHMgc3RyZWFtIHBheWxvYWRpbmcgb2YgUlRQIGFuZCBSVENQIHBhY2tldHMgZm9yIGNvbm5lY3Rpb24tb3JpZW50ZWQKKyAqIHRyYW5zcG9ydCBwcm90b2NvbHMgYWNjb3JkaW5nIHRvIFJGQzQ1NzEuCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgYXVkaW90ZXN0c3JjICEgImF1ZGlvL3gtcmF3LHJhdGU9NDgwMDAiICEgdm9yYmlzZW5jICEgcnRwdm9yYmlzcGF5IGNvbmZpZy1pbnRlcnZhbD0xICEgcnRwc3RyZWFtcGF5ICEgdGNwc2VydmVyc2luayBwb3J0PTU2NzgKKyAqIGdzdC1sYXVuY2gtMS4wIHRjcGNsaWVudHNyYyBwb3J0PTU2NzggaG9zdD0xMjcuMC4wLjEgZG8tdGltZXN0YW1wPXRydWUgISAiYXBwbGljYXRpb24veC1ydHAtc3RyZWFtLG1lZGlhPWF1ZGlvLGNsb2NrLXJhdGU9NDgwMDAsZW5jb2RpbmctbmFtZT1WT1JCSVMiICEgcnRwc3RyZWFtZGVwYXkgISBydHB2b3JiaXNkZXBheSAhIGRlY29kZWJpbiAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhdXRvYXVkaW9zaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RydHBzdHJlYW1wYXkuaCIKKworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3J0cF9zdHJlYW1fcGF5X2RlYnVnCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChHU1RfQ0FUX0RFRkFVTFQpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwOyBhcHBsaWNhdGlvbi94LXJ0Y3A7ICIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtc3J0cDsgYXBwbGljYXRpb24veC1zcnRjcCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cC1zdHJlYW07IGFwcGxpY2F0aW9uL3gtcnRjcC1zdHJlYW07ICIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtc3J0cC1zdHJlYW07IGFwcGxpY2F0aW9uL3gtc3J0Y3Atc3RyZWFtIikKKyAgICApOworCisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3RfcnRwX3N0cmVhbV9wYXlfcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBTdHJlYW1QYXksIGdzdF9ydHBfc3RyZWFtX3BheSwgR1NUX1RZUEVfRUxFTUVOVCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3N0cmVhbV9wYXlfc2lua19xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0UXVlcnkgKiBxdWVyeSk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX3N0cmVhbV9wYXlfc2lua19jaGFpbiAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogaW5idWYpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfc3RyZWFtX3BheV9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc3RyZWFtX3BheV9jbGFzc19pbml0IChHc3RSdHBTdHJlYW1QYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9ydHBfc3RyZWFtX3BheV9kZWJ1ZywgInJ0cHN0cmVhbXBheSIsIDAsCisgICAgICAiUlRQIHN0cmVhbSBwYXlsb2FkZXIiKTsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBTdHJlYW0gUGF5bG9hZGluZyIsICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yayIsCisgICAgICAiUGF5bG9hZHMgUlRQL1JUQ1AgcGFja2V0cyBmb3Igc3RyZWFtaW5nIHByb3RvY29scyBhY2NvcmRpbmcgdG8gUkZDNDU3MSIsCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3N0cmVhbV9wYXlfaW5pdCAoR3N0UnRwU3RyZWFtUGF5ICogc2VsZikKK3sKKyAgc2VsZi0+c2lua3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc2lua190ZW1wbGF0ZSwgInNpbmsiKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHNlbGYtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9zdHJlYW1fcGF5X3NpbmtfY2hhaW4pKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHNlbGYtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9zdHJlYW1fcGF5X3NpbmtfZXZlbnQpKTsKKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKHNlbGYtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9zdHJlYW1fcGF5X3NpbmtfcXVlcnkpKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKHNlbGYpLCBzZWxmLT5zaW5rcGFkKTsKKworICBzZWxmLT5zcmNwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNyY190ZW1wbGF0ZSwgInNyYyIpOworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChzZWxmLT5zcmNwYWQpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoc2VsZiksIHNlbGYtPnNyY3BhZCk7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9ydHBfc3RyZWFtX3BheV9zaW5rX2dldF9jYXBzIChHc3RSdHBTdHJlYW1QYXkgKiBzZWxmLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RDYXBzICpwZWVyZmlsdGVyID0gTlVMTCwgKnBlZXJjYXBzLCAqdGVtcGw7CisgIEdzdENhcHMgKnJlczsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGd1aW50IGksIG47CisKKyAgaWYgKGZpbHRlcikgeworICAgIHBlZXJmaWx0ZXIgPSBnc3RfY2Fwc19jb3B5IChmaWx0ZXIpOworICAgIG4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAocGVlcmZpbHRlcik7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAocGVlcmZpbHRlciwgaSk7CisKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXJ0cCIpKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXJ0cC1zdHJlYW0iKTsKKyAgICAgIGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtcnRjcCIpKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXJ0Y3Atc3RyZWFtIik7CisgICAgICBlbHNlIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXNydHAiKSkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAoc3RydWN0dXJlLCAiYXBwbGljYXRpb24veC1zcnRwLXN0cmVhbSIpOworICAgICAgZWxzZQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXNydGNwLXN0cmVhbSIpOworICAgIH0KKyAgfQorCisgIHRlbXBsID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHNlbGYtPnNpbmtwYWQpOworICBwZWVyY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChzZWxmLT5zcmNwYWQsIHBlZXJmaWx0ZXIpOworCisgIGlmIChwZWVyY2FwcykgeworICAgIC8qIFJlbmFtZSBzdHJ1Y3R1cmUgbmFtZXMgKi8KKyAgICBwZWVyY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKHBlZXJjYXBzKTsKKyAgICBuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKHBlZXJjYXBzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChwZWVyY2FwcywgaSk7CisKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXJ0cC1zdHJlYW0iKSkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAoc3RydWN0dXJlLCAiYXBwbGljYXRpb24veC1ydHAiKTsKKyAgICAgIGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtcnRjcC1zdHJlYW0iKSkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAoc3RydWN0dXJlLCAiYXBwbGljYXRpb24veC1ydGNwIik7CisgICAgICBlbHNlIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXNydHAtc3RyZWFtIikpCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtc3J0cCIpOworICAgICAgZWxzZQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXNydGNwIik7CisgICAgfQorCisgICAgcmVzID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKHBlZXJjYXBzLCB0ZW1wbCwgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcmNhcHMpOworICB9IGVsc2UgeworICAgIHJlcyA9IHRlbXBsOworICB9CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKmludGVyc2VjdGlvbjsKKworICAgIGludGVyc2VjdGlvbiA9CisgICAgICAgIGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHJlcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmVzKTsKKyAgICByZXMgPSBpbnRlcnNlY3Rpb247CisKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcmZpbHRlcik7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfc3RyZWFtX3BheV9zaW5rX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RSdHBTdHJlYW1QYXkgKnNlbGYgPSBHU1RfUlRQX1NUUkVBTV9QQVkgKHBhcmVudCk7CisgIGdib29sZWFuIHJldDsKKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiSGFuZGxpbmcgcXVlcnkgb2YgdHlwZSAnJXMnIiwKKyAgICAgIGdzdF9xdWVyeV90eXBlX2dldF9uYW1lIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY2FwcyAocXVlcnksICZjYXBzKTsKKyAgICAgIGNhcHMgPSBnc3RfcnRwX3N0cmVhbV9wYXlfc2lua19nZXRfY2FwcyAoc2VsZiwgY2Fwcyk7CisgICAgICBnc3RfcXVlcnlfc2V0X2NhcHNfcmVzdWx0IChxdWVyeSwgY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBnc3RfcGFkX3F1ZXJ5X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBxdWVyeSk7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfc3RyZWFtX3BheV9zaW5rX3NldF9jYXBzIChHc3RSdHBTdHJlYW1QYXkgKiBzZWxmLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0Q2FwcyAqb3RoZXJjYXBzOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIG90aGVyY2FwcyA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChvdGhlcmNhcHMsIDApOworCisgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXJ0cCIpKQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtcnRwLXN0cmVhbSIpOworICBlbHNlIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXJ0Y3AiKSkKKyAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXJ0Y3Atc3RyZWFtIik7CisgIGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtc3J0cCIpKQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtc3J0cC1zdHJlYW0iKTsKKyAgZWxzZQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtc3J0Y3Atc3RyZWFtIik7CisKKyAgcmV0ID0gZ3N0X3BhZF9zZXRfY2FwcyAoc2VsZi0+c3JjcGFkLCBvdGhlcmNhcHMpOworICBnc3RfY2Fwc191bnJlZiAob3RoZXJjYXBzKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfc3RyZWFtX3BheV9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBTdHJlYW1QYXkgKnNlbGYgPSBHU1RfUlRQX1NUUkVBTV9QQVkgKHBhcmVudCk7CisgIGdib29sZWFuIHJldDsKKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiR290ICVzIGV2ZW50IiwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9jYXBzIChldmVudCwgJmNhcHMpOworICAgICAgcmV0ID0gZ3N0X3J0cF9zdHJlYW1fcGF5X3Npbmtfc2V0X2NhcHMgKHNlbGYsIGNhcHMpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfc3RyZWFtX3BheV9zaW5rX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBpbmJ1ZikKK3sKKyAgR3N0UnRwU3RyZWFtUGF5ICpzZWxmID0gR1NUX1JUUF9TVFJFQU1fUEFZIChwYXJlbnQpOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ3NpemUgc2l6ZTsKKyAgZ3VpbnQ4IHNpemUxNlsyXTsKKworICBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoaW5idWYpOworICBpZiAoc2l6ZSA+IEdfTUFYVUlOVDE2KSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNlbGYsIENPUkUsIEZBSUxFRCwgKE5VTEwpLAorICAgICAgICAoIk9ubHkgYnVmZmVycyB1cCB0byAlZCBieXRlcyBzdXBwb3J0ZWQsIGdvdCAlIiBHX0dTSVpFX0ZPUk1BVCwKKyAgICAgICAgICAgIEdfTUFYVUlOVDE2LCBzaXplKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoaW5idWYpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMik7CisKKyAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoc2l6ZTE2LCBzaXplKTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChvdXRidWYsIDAsIHNpemUxNiwgMik7CisKKyAgZ3N0X2J1ZmZlcl9jb3B5X2ludG8gKG91dGJ1ZiwgaW5idWYsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIDAsIC0xKTsKKworICBnc3RfYnVmZmVyX3VucmVmIChpbmJ1Zik7CisKKyAgcmV0dXJuIGdzdF9wYWRfcHVzaCAoc2VsZi0+c3JjcGFkLCBvdXRidWYpOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9zdHJlYW1fcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwc3RyZWFtcGF5IiwKKyAgICAgIEdTVF9SQU5LX05PTkUsIEdTVF9UWVBFX1JUUF9TVFJFQU1fUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwc3RyZWFtcGF5LmggYi9nc3QvcnRwL2dzdHJ0cHN0cmVhbXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NDM2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHN0cmVhbXBheS5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qIAorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworIAorI2lmbmRlZiBfX0dTVF9SVFBfU1RSRUFNX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1NUUkVBTV9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfU1RSRUFNX1BBWSAgICAgICAgICAgIChnc3RfcnRwX3N0cmVhbV9wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9TVFJFQU1fUEFZKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1NUUkVBTV9QQVksR3N0UnRwU3RyZWFtUGF5KSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9TVFJFQU1fUEFZKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1NUUkVBTV9QQVkpKQorI2RlZmluZSBHU1RfUlRQX1NUUkVBTV9QQVlfQ0xBU1Moa2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpICxHU1RfVFlQRV9SVFBfU1RSRUFNX1BBWSxHc3RSdHBTdHJlYW1QYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfU1RSRUFNX1BBWV9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcykgLEdTVF9UWVBFX1JUUF9TVFJFQU1fUEFZKSkKKyNkZWZpbmUgR1NUX1JUUF9TVFJFQU1fUEFZX0dFVF9DTEFTUyhvYmopICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUygob2JqKSAsR1NUX1RZUEVfUlRQX1NUUkVBTV9QQVksR3N0UnRwU3RyZWFtUGF5Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU3RyZWFtUGF5ICAgICAgR3N0UnRwU3RyZWFtUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFN0cmVhbVBheUNsYXNzIEdzdFJ0cFN0cmVhbVBheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cFN0cmVhbVBheSB7CisgIEdzdEVsZW1lbnQgcGFyZW50OworCisgIEdzdFBhZCAqc3JjcGFkLCAqc2lua3BhZDsKK307CisKK3N0cnVjdCBfR3N0UnRwU3RyZWFtUGF5Q2xhc3MgeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9zdHJlYW1fcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9zdHJlYW1fcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX1NUUkVBTV9QQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDA5MWMyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYwpAQCAtMCwwICsxLDMyMiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgImdzdHJ0cHN2M3ZkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWSAocnRwc3YzdmRlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHJ0cHN2M3ZkZXBheV9kZWJ1ZworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9zdjN2X2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1zdnEsICIgInN2cXZlcnNpb24gPSAoaW50KSAzIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9zdjN2X2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSB7IFwiWC1TVjNWLUVTXCIsIFwiWC1TT1JFTlNPTi1WSURFT1wiICwgXCJYLVNPUkVOU09OVklERU9cIiAsIFwiWC1Tb3JlbnNvblZpZGVvXCIgfSIpCisgICAgKTsKKworI2RlZmluZSBnc3RfcnRwX3N2M3ZfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwU1YzVkRlcGF5LCBnc3RfcnRwX3N2M3ZfZGVwYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfREVQQVlMT0FEKTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9zdjN2X2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfc3Yzdl9kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKgorICAgIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX3N2M3ZfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworZ2Jvb2xlYW4gZ3N0X3J0cF9zdjN2X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBmaWx0ZXIsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zdjN2X2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cFNWM1ZEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX3N2M3ZfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX3N2M3ZfZGVwYXlfc2V0Y2FwczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfc3Yzdl9kZXBheV9maW5hbGl6ZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfcnRwX3N2M3ZfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfc3Yzdl9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3N2M3ZfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgU1ZRMyBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgU1ZRMyB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChubyBSRkMpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zdjN2X2RlcGF5X2luaXQgKEdzdFJ0cFNWM1ZEZXBheSAqIHJ0cHN2M3ZkZXBheSkKK3sKKyAgcnRwc3YzdmRlcGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zdjN2X2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSdHBTVjNWRGVwYXkgKnJ0cHN2M3ZkZXBheTsKKworICBydHBzdjN2ZGVwYXkgPSBHU1RfUlRQX1NWM1ZfREVQQVkgKG9iamVjdCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHJ0cHN2M3ZkZXBheS0+YWRhcHRlcik7CisgIHJ0cHN2M3ZkZXBheS0+YWRhcHRlciA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCisvKiBvbmx5IG9uIHRoZSBzaW5rICovCitnYm9vbGVhbgorZ3N0X3J0cF9zdjN2X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBmaWx0ZXIsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBnaW50IGNsb2NrX3JhdGU7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgY2xvY2tfcmF0ZSA9IDkwMDAwOyAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgZmlsdGVyLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICAvKiB3aWxsIHNldCBjYXBzIGxhdGVyICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9zdjN2X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0UnRwU1YzVkRlcGF5ICpydHBzdjN2ZGVwYXk7CisgIHN0YXRpYyBzdHJ1Y3QKKyAgeworICAgIGd1aW50IHdpZHRoLCBoZWlnaHQ7CisgIH0gcmVzb2x1dGlvbnNbN10gPSB7CisgICAgeworICAgIDE2MCwgMTI4fSwgeworICAgIDEyOCwgOTZ9LCB7CisgICAgMTc2LCAxNDR9LCB7CisgICAgMzUyLCAyODh9LCB7CisgICAgNzA0LCA1NzZ9LCB7CisgICAgMjQwLCAxODB9LCB7CisgICAgMzIwLCAyNDB9CisgIH07CisgIGdpbnQgcGF5bG9hZF9sZW47CisgIGd1aW50OCAqcGF5bG9hZDsKKyAgZ2Jvb2xlYW4gTTsKKyAgZ2Jvb2xlYW4gQywgUywgRTsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBndWludDE2IHNlcTsKKworICBydHBzdjN2ZGVwYXkgPSBHU1RfUlRQX1NWM1ZfREVQQVkgKGRlcGF5bG9hZCk7CisKKworICAvKiBmbHVzaCBvbiBzZXF1ZW5jZSBudW1iZXIgZ2FwcyAqLworICBzZXEgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfc2VxIChydHApOworCisgIEdTVF9ERUJVRyAoInRpbWVzdGFtcCAlIiBHU1RfVElNRV9GT1JNQVQgIiwgc2VxdWVuY2UgbnVtYmVyOiVkIiwKKyAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfUFRTIChydHAtPmJ1ZmZlcikpLCBzZXEpOworCisgIGlmIChzZXEgIT0gcnRwc3YzdmRlcGF5LT5uZXh0c2VxKSB7CisgICAgR1NUX0RFQlVHICgiU2VxdWVuY2UgZGlzY29udGludWl0eSwgY2xlYXJpbmcgYWRhcHRlciIpOworICAgIGdzdF9hZGFwdGVyX2NsZWFyIChydHBzdjN2ZGVwYXktPmFkYXB0ZXIpOworICB9CisgIHJ0cHN2M3ZkZXBheS0+bmV4dHNlcSA9IHNlcSArIDE7CisKKyAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisgIGlmIChwYXlsb2FkX2xlbiA8IDMpCisgICAgZ290byBiYWRfcGFja2V0OworCisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAocnRwKTsKKworICBNID0gZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAocnRwKTsKKworICAvKiBUaGlzIGlzIGFsbCBhIGd1ZXNzOgorICAgKiAgICAgICAgICAgICAgICAgICAgICAxIDEgMSAxIDEgMQorICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSAKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIHwwfEN8U3xFfDB8MHwwfDB8MHwwfDB8MHwwfDB8MHwwfAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICoKKyAgICogQzogY29uZmlnLCBwYWNrZXQgY29udGFpbnMgY29uZmlnIGluZm8KKyAgICogUzogc3RhcnQsIHBhY2tldCBjb250YWlucyBzdGFydCBvZiBmcmFtZQorICAgKiBFOiBlbmQsIHBhY2tldCBjb250YWlucyBlbmQgb2YgZnJhbWUKKyAgICovCisgIC8qIHRoaXMgc2VlbXMgdG8gaW5kaWNhdGUgYSBwYWNrZXQgd2l0aCBhIGNvbmZpZyBzdHJpbmcgc2VudCBiZWZvcmUgZWFjaAorICAgKiBrZXlmcmFtZSAqLworICBDID0gKHBheWxvYWRbMF0gJiAweDQwKSA9PSAweDQwOworCisgIC8qIHJlZHVuZGFudCB3aXRoIHRoZSBSVFAgbWFya2VyIGJpdCAqLworICBTID0gKHBheWxvYWRbMF0gJiAweDIwKSA9PSAweDIwOworICBFID0gKHBheWxvYWRbMF0gJiAweDEwKSA9PSAweDEwOworCisgIEdTVF9ERUJVRyAoIk06JWQsIEM6JWQsIFM6JWQsIEU6JWQiLCBNLCBDLCBTLCBFKTsKKworICBHU1RfTUVNRFVNUCAoImluY29taW5nIGJ1ZmZlciIsIHBheWxvYWQsIHBheWxvYWRfbGVuKTsKKworICBpZiAoR19VTkxJS0VMWSAoQykpIHsKKyAgICBHc3RDYXBzICpjYXBzOworICAgIEdzdEJ1ZmZlciAqY29kZWNfZGF0YTsKKyAgICBHc3RNYXBJbmZvIGNtYXA7CisgICAgZ3VpbnQ4IHJlczsKKworICAgIEdTVF9ERUJVRyAoIkNvbmZpZ3VyYXRpb24gcGFja2V0Iik7CisKKyAgICAvKiBpZiB3ZSBhbHJlYWR5IGhhdmUgY2Fwcywgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gRklYTUUsIGNoZWNrIGlmCisgICAgICogc29tZXRoaW5nIGNoYW5nZWQuICovCisgICAgaWYgKEdfVU5MSUtFTFkgKGdzdF9wYWRfaGFzX2N1cnJlbnRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQKKyAgICAgICAgICAgICAgICAoZGVwYXlsb2FkKSkpKSB7CisgICAgICBHU1RfREVCVUcgKCJBbHJlYWR5IGNvbmZpZ3VyZWQsIHNraXBwaW5nIGNvbmZpZyBwYXJzaW5nIik7CisgICAgICBnb3RvIGJlYWNoOworICAgIH0KKworICAgIHJlcyA9IHBheWxvYWRbMl0gPj4gNTsKKworICAgIC8qIHdpZHRoIGFuZCBoZWlnaHQsIGFjY29yZGluZyB0byBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1Tb3JlbnNvbl9WaWRlb18xI1N0cmVhbV9Gb3JtYXRfQW5kX0hlYWRlciAqLworICAgIGlmIChHX0xJS0VMWSAocmVzIDwgNykpIHsKKyAgICAgIHJ0cHN2M3ZkZXBheS0+d2lkdGggPSByZXNvbHV0aW9uc1tyZXNdLndpZHRoOworICAgICAgcnRwc3YzdmRlcGF5LT5oZWlnaHQgPSByZXNvbHV0aW9uc1tyZXNdLmhlaWdodDsKKyAgICB9IGVsc2UgeworICAgICAgLyogZXh0ZW5kZWQgd2lkdGgvaGVpZ2h0LCB0aGV5J3JlIGNvbnRhaW5lZCBpbiB0aGUgZm9sbG93aW5nIDI0Yml0ICovCisgICAgICBydHBzdjN2ZGVwYXktPndpZHRoID0gKChwYXlsb2FkWzJdICYgMHgxZikgPDwgNykgfCAocGF5bG9hZFszXSA+PiAxKTsKKyAgICAgIHJ0cHN2M3ZkZXBheS0+aGVpZ2h0ID0KKyAgICAgICAgICAocGF5bG9hZFszXSAmIDB4MSkgPDwgMTEgfCBwYXlsb2FkWzRdIDw8IDMgfCAocGF5bG9hZFs1XSA+PiA1KTsKKyAgICB9CisKKyAgICAvKiBDb2RlY0RhdGEgbmVlZHMgdG8gYmUgJ1NFUUgnICsgbGVuICgzMmJpdCkgKyBkYXRhIGFjY29yZGluZyB0bworICAgICAqIGZmbXBlZydzIGxpYmF2Y29kZWMvc3ZxMy5jOnN2cTNfZGVjb2RlX2luaXQgKi8KKyAgICBjb2RlY19kYXRhID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChwYXlsb2FkX2xlbiArIDYpOworICAgIGdzdF9idWZmZXJfbWFwIChjb2RlY19kYXRhLCAmY21hcCwgR1NUX01BUF9XUklURSk7CisgICAgbWVtY3B5IChjbWFwLmRhdGEsICJTRVFIIiwgNCk7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoY21hcC5kYXRhICsgNCwgcGF5bG9hZF9sZW4gLSAyKTsKKyAgICBtZW1jcHkgKGNtYXAuZGF0YSArIDgsIHBheWxvYWQgKyAyLCBwYXlsb2FkX2xlbiAtIDIpOworICAgIEdTVF9NRU1EVU1QICgiY29kZWNfZGF0YSIsIGNtYXAuZGF0YSwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoY29kZWNfZGF0YSkpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGNvZGVjX2RhdGEsICZjbWFwKTsKKworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1zdnEiLAorICAgICAgICAic3ZxdmVyc2lvbiIsIEdfVFlQRV9JTlQsIDMsCisgICAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHJ0cHN2M3ZkZXBheS0+d2lkdGgsCisgICAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBydHBzdjN2ZGVwYXktPmhlaWdodCwKKyAgICAgICAgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIGNvZGVjX2RhdGEsIE5VTEwpOworICAgIGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgICBHU1RfREVCVUcgKCJEZXBheWxvYWRlciBub3cgY29uZmlndXJlZCIpOworCisgICAgcnRwc3YzdmRlcGF5LT5jb25maWd1cmVkID0gVFJVRTsKKworICAgIGdvdG8gYmVhY2g7CisgIH0KKworICBpZiAoR19MSUtFTFkgKHJ0cHN2M3ZkZXBheS0+Y29uZmlndXJlZCkpIHsKKyAgICBHc3RCdWZmZXIgKnRtcGJ1ZjsKKworICAgIEdTVF9ERUJVRyAoIlN0b3JpbmcgaW5jb21pbmcgcGF5bG9hZCIpOworICAgIC8qIHN0b3JlIGRhdGEgaW4gYWRhcHRlciwgc3RpcCBvZmYgMiBieXRlcyBoZWFkZXIgKi8KKyAgICB0bXBidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgKHJ0cCwgMiwgLTEpOworICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cHN2M3ZkZXBheS0+YWRhcHRlciwgdG1wYnVmKTsKKworICAgIGlmIChHX1VOTElLRUxZIChNKSkgeworICAgICAgLyogZnJhbWUgaXMgY29tcGxldGVkOiBwdXNoIGNvbnRlbnRzIG9mIGFkYXB0ZXIgKi8KKyAgICAgIGd1aW50IGF2YWlsOworCisgICAgICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwc3YzdmRlcGF5LT5hZGFwdGVyKTsKKyAgICAgIEdTVF9ERUJVRyAoIlJldHVybmluZyBjb21wbGV0ZWQgb3V0cHV0IGJ1ZmZlciBbJWQgYnl0ZXNdIiwgYXZhaWwpOworICAgICAgb3V0YnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHJ0cHN2M3ZkZXBheS0+YWRhcHRlciwgYXZhaWwpOworICAgICAgZ3N0X3J0cF9kcm9wX25vbl92aWRlb19tZXRhIChydHBzdjN2ZGVwYXksIG91dGJ1Zik7CisgICAgfQorICB9CisKK2JlYWNoOgorICByZXR1cm4gb3V0YnVmOworCisgIC8qIEVSUk9SUyAqLworYmFkX3BhY2tldDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cHN2M3ZkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJQYWNrZXQgd2FzIHRvbyBzaG9ydCIpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfc3Yzdl9kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cFNWM1ZEZXBheSAqcnRwc3YzdmRlcGF5OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRwc3YzdmRlcGF5ID0gR1NUX1JUUF9TVjNWX0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRwc3YzdmRlcGF5LT5hZGFwdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX3N2M3ZfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cHN2M3ZkZXBheV9kZWJ1ZywgInJ0cHN2M3ZkZXBheSIsIDAsCisgICAgICAiUlRQIFNWM1YgZGVwYXlsb2FkZXIiKTsKKworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHN2M3ZkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9TVjNWX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyODY4NGEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9TVjNWX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfU1YzVl9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfU1YzVl9ERVBBWSBcCisgIChnc3RfcnRwX3N2M3ZfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9TVjNWX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1NWM1ZfREVQQVksR3N0UnRwU1YzVkRlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9TVjNWX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9TVjNWX0RFUEFZLEdzdFJ0cFNWM1ZEZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9TVjNWX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1NWM1ZfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX1NWM1ZfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX1NWM1ZfREVQQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU1YzVkRlcGF5IEdzdFJ0cFNWM1ZEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBTVjNWRGVwYXlDbGFzcyBHc3RSdHBTVjNWRGVwYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBTVjNWRGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7CisKKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKKworICBnYm9vbGVhbiBjb25maWd1cmVkOworICAKKyAgZ3VpbnQxNiBuZXh0c2VxOworICBndWludCB3aWR0aDsKKyAgZ3VpbnQgaGVpZ2h0OworfTsKKworc3RydWN0IF9Hc3RSdHBTVjNWRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9zdjN2X2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9zdjN2X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX1NWM1ZfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRjNTBjZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYwpAQCAtMCwwICsxLDcwNyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L3RhZy90YWcuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0cnRwdGhlb3JhZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHB0aGVvcmFkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwdGhlb3JhZGVwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3RoZW9yYV9kZXBheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJUSEVPUkFcIiIKKyAgICAgICAgLyogQWxsIHJlcXVpcmVkIHBhcmFtZXRlcnMgCisgICAgICAgICAqCisgICAgICAgICAqICJzYW1wbGluZyA9IChzdHJpbmcpIHsgIllDYkNyLTQ6MjowIiwgIllDYkNyLTQ6MjoyIiwgIllDYkNyLTQ6NDo0IiB9ICIKKyAgICAgICAgICogIndpZHRoID0gKHN0cmluZykgWzEsIDEwNDg1NjFdIChtdWx0aXBsZXMgb2YgMTYpICIKKyAgICAgICAgICogImhlaWdodCA9IChzdHJpbmcpIFsxLCAxMDQ4NTYxXSAobXVsdGlwbGVzIG9mIDE2KSAiCisgICAgICAgICAqICJkZWxpdmVyeS1tZXRob2QgPSAoc3RyaW5nKSB7IGlubGluZSwgaW5fYmFuZCwgb3V0X2JhbmQvPHNwZWNpZmljX25hbWU+IH0gIiAKKyAgICAgICAgICogImNvbmZpZ3VyYXRpb24gPSAoc3RyaW5nKSBBTlkiIAorICAgICAgICAgKi8KKyAgICAgICAgLyogQWxsIG9wdGlvbmFsIHBhcmFtZXRlcnMKKyAgICAgICAgICoKKyAgICAgICAgICogImNvbmZpZ3VyYXRpb24tdXJpID0iIAorICAgICAgICAgKi8KKyAgICApCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfdGhlb3JhX2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC10aGVvcmEiKQorICAgICk7CisKKyNkZWZpbmUgZ3N0X3J0cF90aGVvcmFfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwVGhlb3JhRGVwYXksIGdzdF9ydHBfdGhlb3JhX2RlcGF5LAorICAgIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3RoZW9yYV9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfdGhlb3JhX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3RoZW9yYV9kZXBheV9wYWNrZXRfbG9zdCAoR3N0UlRQQmFzZURlcGF5bG9hZCAqCisgICAgZGVwYXlsb2FkLCBHc3RFdmVudCAqIGV2ZW50KTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF90aGVvcmFfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF90aGVvcmFfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdGhlb3JhX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cFRoZW9yYURlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF90aGVvcmFfZGVwYXlfZmluYWxpemU7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3J0cF90aGVvcmFfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfdGhlb3JhX2RlcGF5X3Byb2Nlc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF90aGVvcmFfZGVwYXlfc2V0Y2FwczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+cGFja2V0X2xvc3QgPSBnc3RfcnRwX3RoZW9yYV9kZXBheV9wYWNrZXRfbG9zdDsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3RoZW9yYV9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF90aGVvcmFfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBUaGVvcmEgZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIFRoZW9yYSB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChkcmFmdC0wMSBvZiBSRkMgWFhYWCkiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cHRoZW9yYWRlcGF5X2RlYnVnLCAicnRwdGhlb3JhZGVwYXkiLCAwLAorICAgICAgIlRoZW9yYSBSVFAgRGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdGhlb3JhX2RlcGF5X2luaXQgKEdzdFJ0cFRoZW9yYURlcGF5ICogcnRwdGhlb3JhZGVwYXkpCit7CisgIHJ0cHRoZW9yYWRlcGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9jb25maWcgKEdzdFJ0cFRoZW9yYUNvbmZpZyAqIGNvbmZpZykKK3sKKyAgZ19saXN0X2ZyZWVfZnVsbCAoY29uZmlnLT5oZWFkZXJzLCAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9idWZmZXJfdW5yZWYpOworICBnX2ZyZWUgKGNvbmZpZyk7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2luZGVudHMgKEdzdFJ0cFRoZW9yYURlcGF5ICogcnRwdGhlb3JhZGVwYXkpCit7CisgIGdfbGlzdF9mcmVlX2Z1bGwgKHJ0cHRoZW9yYWRlcGF5LT5jb25maWdzLCAoR0Rlc3Ryb3lOb3RpZnkpIGZyZWVfY29uZmlnKTsKKyAgcnRwdGhlb3JhZGVwYXktPmNvbmZpZ3MgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF90aGVvcmFfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cFRoZW9yYURlcGF5ICpydHB0aGVvcmFkZXBheSA9IEdTVF9SVFBfVEhFT1JBX0RFUEFZIChvYmplY3QpOworCisgIGdfb2JqZWN0X3VucmVmIChydHB0aGVvcmFkZXBheS0+YWRhcHRlcik7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfdGhlb3JhX2RlcGF5X3BhcnNlX2NvbmZpZ3VyYXRpb24gKEdzdFJ0cFRoZW9yYURlcGF5ICogcnRwdGhlb3JhZGVwYXksCisgICAgR3N0QnVmZmVyICogY29uZmJ1ZikKK3sKKyAgR3N0QnVmZmVyICpidWY7CisgIGd1aW50MzIgbnVtX2hlYWRlcnM7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKmRhdGE7CisgIGdzaXplIHNpemU7CisgIGdpbnQgaSwgajsKKworICBnc3RfYnVmZmVyX21hcCAoY29uZmJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworICBzaXplID0gbWFwLnNpemU7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwdGhlb3JhZGVwYXksICJjb25maWcgc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCwgc2l6ZSk7CisKKyAgLyogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBwYWNrZWQgaGVhZGVycyAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2VkIGhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2VkIGhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICovCisgIGlmIChzaXplIDwgNCkKKyAgICBnb3RvIHRvb19zbWFsbDsKKworICBudW1faGVhZGVycyA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoZGF0YSk7CisgIHNpemUgLT0gNDsKKyAgZGF0YSArPSA0OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHRoZW9yYWRlcGF5LCAiaGF2ZSAldSBoZWFkZXJzIiwgbnVtX2hlYWRlcnMpOworCisgIC8qICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICBJZGVudCAgICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgIHwgbi4gb2YgaGVhZGVycyB8ICAgIGxlbmd0aDEgICAgfCAgICBsZW5ndGgyICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgIHwgICAgICAgICAgICAgSWRlbnRpZmljYXRpb24gSGVhZGVyICAgICAgICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgIHwgICAgICAgICBDb21tZW50IEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50IEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dXAgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgICAgICAgICAgICAgU2V0dXAgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICovCisgIGZvciAoaSA9IDA7IGkgPCBudW1faGVhZGVyczsgaSsrKSB7CisgICAgZ3VpbnQzMiBpZGVudDsKKyAgICBndWludDE2IGxlbmd0aDsKKyAgICBndWludDggbl9oZWFkZXJzLCBiOworICAgIEdzdFJ0cFRoZW9yYUNvbmZpZyAqY29uZjsKKyAgICBndWludCAqaF9zaXplczsKKyAgICBndWludCBleHRyYSA9IDE7CisKKyAgICBpZiAoc2l6ZSA8IDYpCisgICAgICBnb3RvIHRvb19zbWFsbDsKKworICAgIGlkZW50ID0gKGRhdGFbMF0gPDwgMTYpIHwgKGRhdGFbMV0gPDwgOCkgfCBkYXRhWzJdOworICAgIGxlbmd0aCA9IChkYXRhWzNdIDw8IDgpIHwgZGF0YVs0XTsKKyAgICBuX2hlYWRlcnMgPSBkYXRhWzVdOworICAgIHNpemUgLT0gNjsKKyAgICBkYXRhICs9IDY7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHB0aGVvcmFkZXBheSwKKyAgICAgICAgImhlYWRlciAlZCwgaWRlbnQgMHglMDh4LCBsZW5ndGggJXUsIGxlZnQgJSIgR19HU0laRV9GT1JNQVQsIGksIGlkZW50LAorICAgICAgICBsZW5ndGgsIHNpemUpOworCisgICAgLyogRklYTUUgY2hlY2sgaWYgd2UgYWxyZWFkeSBnb3QgdGhpcyBpZGVudCAqLworCisgICAgLyogbGVuZ3RoIG1pZ2h0IGFsc28gaW5jbHVkZSBjb3VudCBvZiBmb2xsb3dpbmcgc2l6ZSBmaWVsZHMgKi8KKyAgICBpZiAoc2l6ZSA8IGxlbmd0aCAmJiBzaXplICsgMSAhPSBsZW5ndGgpCisgICAgICBnb3RvIHRvb19zbWFsbDsKKworICAgIC8qIHJlYWQgaGVhZGVyIHNpemVzIHdlIHJlYWQgMiBzaXplcywgdGhlIHRoaXJkIHNpemUgKGZvciB3aGljaCB3ZSBhbGxvY2F0ZQorICAgICAqIHNwYWNlKSBtdXN0IGJlIGRlcml2ZWQgZnJvbSB0aGUgdG90YWwgcGFja2VkIGhlYWRlciBsZW5ndGguICovCisgICAgaF9zaXplcyA9IGdfbmV3YSAoZ3VpbnQsIG5faGVhZGVycyArIDEpOworICAgIGZvciAoaiA9IDA7IGogPCBuX2hlYWRlcnM7IGorKykgeworICAgICAgZ3VpbnQgaF9zaXplOworCisgICAgICBoX3NpemUgPSAwOworICAgICAgZG8geworICAgICAgICBpZiAoc2l6ZSA8IDEpCisgICAgICAgICAgZ290byB0b29fc21hbGw7CisgICAgICAgIGIgPSAqZGF0YSsrOworICAgICAgICBzaXplLS07CisgICAgICAgIGV4dHJhKys7CisgICAgICAgIGhfc2l6ZSA9IChoX3NpemUgPDwgNykgfCAoYiAmIDB4N2YpOworICAgICAgfSB3aGlsZSAoYiAmIDB4ODApOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwdGhlb3JhZGVwYXksICJoZWFkZXJzICVkOiBzaXplOiAldSIsIGosIGhfc2l6ZSk7CisgICAgICBoX3NpemVzW2pdID0gaF9zaXplOworICAgICAgbGVuZ3RoIC09IGhfc2l6ZTsKKyAgICB9CisgICAgLyogbGFzdCBoZWFkZXIgbGVuZ3RoIGlzIHRoZSByZW1haW5pbmcgc3BhY2UgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHB0aGVvcmFkZXBheSwgImxhc3QgaGVhZGVyIHNpemU6ICV1IiwgbGVuZ3RoKTsKKyAgICBoX3NpemVzW2pdID0gbGVuZ3RoOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwdGhlb3JhZGVwYXksICJwcmVwYXJpbmcgaGVhZGVycyIpOworICAgIGNvbmYgPSBnX25ldzAgKEdzdFJ0cFRoZW9yYUNvbmZpZywgMSk7CisgICAgY29uZi0+aWRlbnQgPSBpZGVudDsKKworICAgIGZvciAoaiA9IDA7IGogPD0gbl9oZWFkZXJzOyBqKyspIHsKKyAgICAgIGd1aW50IGhfc2l6ZTsKKworICAgICAgaF9zaXplID0gaF9zaXplc1tqXTsKKyAgICAgIGlmIChzaXplIDwgaF9zaXplKSB7CisgICAgICAgIGlmIChqICE9IG5faGVhZGVycyB8fCBzaXplICsgZXh0cmEgIT0gaF9zaXplKSB7CisgICAgICAgICAgZnJlZV9jb25maWcgKGNvbmYpOworICAgICAgICAgIGdvdG8gdG9vX3NtYWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIG90aGVyd2lzZSBtZWFucyB0aGF0IG92ZXJhbGwgbGVuZ3RoIGZpZWxkIGNvbnRhaW5lZCB0b3RhbCBsZW5ndGgsCisgICAgICAgICAgICogaW5jbHVkaW5nIGV4dHJhIGZpZWxkcyAqLworICAgICAgICAgIGhfc2l6ZSAtPSBleHRyYTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHB0aGVvcmFkZXBheSwgInJlYWRpbmcgaGVhZGVyICVkLCBzaXplICV1IiwgaiwKKyAgICAgICAgICBoX3NpemUpOworCisgICAgICBidWYgPQorICAgICAgICAgIGdzdF9idWZmZXJfY29weV9yZWdpb24gKGNvbmZidWYsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIGRhdGEgLSBtYXAuZGF0YSwKKyAgICAgICAgICBoX3NpemUpOworICAgICAgY29uZi0+aGVhZGVycyA9IGdfbGlzdF9hcHBlbmQgKGNvbmYtPmhlYWRlcnMsIGJ1Zik7CisgICAgICBkYXRhICs9IGhfc2l6ZTsKKyAgICAgIHNpemUgLT0gaF9zaXplOworICAgIH0KKyAgICBydHB0aGVvcmFkZXBheS0+Y29uZmlncyA9IGdfbGlzdF9hcHBlbmQgKHJ0cHRoZW9yYWRlcGF5LT5jb25maWdzLCBjb25mKTsKKyAgfQorCisgIGdzdF9idWZmZXJfdW5tYXAgKGNvbmZidWYsICZtYXApOworICBnc3RfYnVmZmVyX3VucmVmIChjb25mYnVmKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK3Rvb19zbWFsbDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHRoZW9yYWRlcGF5LCAiY29uZmlndXJhdGlvbiB0b28gc21hbGwiKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChjb25mYnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChjb25mYnVmKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3RoZW9yYV9kZXBheV9wYXJzZV9pbmJhbmRfY29uZmlndXJhdGlvbiAoR3N0UnRwVGhlb3JhRGVwYXkgKgorICAgIHJ0cHRoZW9yYWRlcGF5LCBndWludCBpZGVudCwgZ3VpbnQ4ICogY29uZmlndXJhdGlvbiwgZ3VpbnQgc2l6ZSwKKyAgICBndWludCBsZW5ndGgpCit7CisgIEdzdEJ1ZmZlciAqY29uZmJ1ZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHNpemUgPCA0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogdHJhbnNmb3JtIGlubGluZSB0byBvdXQtb2YtYmFuZCBhbmQgcGFyc2UgdGhhdCBvbmUgKi8KKyAgY29uZmJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZSArIDkpOworICBnc3RfYnVmZmVyX21hcCAoY29uZmJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIC8qIDEgaGVhZGVyICovCisgIEdTVF9XUklURV9VSU5UMzJfQkUgKG1hcC5kYXRhLCAxKTsKKyAgLyogd3JpdGUgSWRlbnQgKi8KKyAgR1NUX1dSSVRFX1VJTlQyNF9CRSAobWFwLmRhdGEgKyA0LCBpZGVudCk7CisgIC8qIHdyaXRlIHNvcnQtb2YtbGVuZ3RoICovCisgIEdTVF9XUklURV9VSU5UMTZfQkUgKG1hcC5kYXRhICsgNywgbGVuZ3RoKTsKKyAgLyogY29weSByZW1haW5kZXIgKi8KKyAgbWVtY3B5IChtYXAuZGF0YSArIDksIGNvbmZpZ3VyYXRpb24sIHNpemUpOworICBnc3RfYnVmZmVyX3VubWFwIChjb25mYnVmLCAmbWFwKTsKKworICByZXR1cm4gZ3N0X3J0cF90aGVvcmFfZGVwYXlfcGFyc2VfY29uZmlndXJhdGlvbiAocnRwdGhlb3JhZGVwYXksIGNvbmZidWYpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfdGhlb3JhX2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgR3N0UnRwVGhlb3JhRGVwYXkgKnJ0cHRoZW9yYWRlcGF5OworICBHc3RDYXBzICpzcmNjYXBzOworICBjb25zdCBnY2hhciAqY29uZmlndXJhdGlvbjsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHJ0cHRoZW9yYWRlcGF5ID0gR1NUX1JUUF9USEVPUkFfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgcnRwdGhlb3JhZGVwYXktPm5lZWRzX2tleWZyYW1lID0gRkFMU0U7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgLyogcmVhZCBhbmQgcGFyc2UgY29uZmlndXJhdGlvbiBzdHJpbmcgKi8KKyAgY29uZmlndXJhdGlvbiA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiY29uZmlndXJhdGlvbiIpOworICBpZiAoY29uZmlndXJhdGlvbikgeworICAgIEdzdEJ1ZmZlciAqY29uZmJ1ZjsKKyAgICBndWludDggKmRhdGE7CisgICAgZ3NpemUgc2l6ZTsKKworICAgIC8qIGRlc2VyaWFsaXplIGJhc2U2NCB0byBidWZmZXIgKi8KKyAgICBkYXRhID0gZ19iYXNlNjRfZGVjb2RlIChjb25maWd1cmF0aW9uLCAmc2l6ZSk7CisKKyAgICBjb25mYnVmID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgICAgZ3N0X2J1ZmZlcl9hcHBlbmRfbWVtb3J5IChjb25mYnVmLAorICAgICAgICBnc3RfbWVtb3J5X25ld193cmFwcGVkICgwLCBkYXRhLCBzaXplLCAwLCBzaXplLCBkYXRhLCBnX2ZyZWUpKTsKKworICAgIGlmICghZ3N0X3J0cF90aGVvcmFfZGVwYXlfcGFyc2VfY29uZmlndXJhdGlvbiAocnRwdGhlb3JhZGVwYXksIGNvbmZidWYpKQorICAgICAgZ290byBpbnZhbGlkX2NvbmZpZ3VyYXRpb247CisgIH0KKworICAvKiBzZXQgY2FwcyBvbiBwYWQgYW5kIG9uIGhlYWRlciAqLworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtdGhlb3JhIik7CisgIHJlcyA9IGdzdF9wYWRfc2V0X2NhcHMgKGRlcGF5bG9hZC0+c3JjcGFkLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIC8qIENsb2NrIHJhdGUgaXMgYWx3YXlzIDkwMDAwIGFjY29yZGluZyB0byBkcmFmdC1iYXJiYXRvLWF2dC1ydHAtdGhlb3JhLTAxICovCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IDkwMDAwOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX2NvbmZpZ3VyYXRpb246CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChydHB0aGVvcmFkZXBheSwgImludmFsaWQgY29uZmlndXJhdGlvbiBzcGVjaWZpZWQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3RoZW9yYV9kZXBheV9zd2l0Y2hfY29kZWJvb2sgKEdzdFJ0cFRoZW9yYURlcGF5ICogcnRwdGhlb3JhZGVwYXksCisgICAgZ3VpbnQzMiBpZGVudCkKK3sKKyAgR0xpc3QgKndhbGs7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIGZvciAod2FsayA9IHJ0cHRoZW9yYWRlcGF5LT5jb25maWdzOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UnRwVGhlb3JhQ29uZmlnICpjb25mID0gKEdzdFJ0cFRoZW9yYUNvbmZpZyAqKSB3YWxrLT5kYXRhOworCisgICAgaWYgKGNvbmYtPmlkZW50ID09IGlkZW50KSB7CisgICAgICBHTGlzdCAqaGVhZGVyczsKKworICAgICAgLyogRklYTUUsIHJlbW92ZSBwYWRzLCBjcmVhdGUgbmV3IHBhZC4uICovCisKKyAgICAgIC8qIHB1c2ggb3V0IGFsbCB0aGUgaGVhZGVycyAqLworICAgICAgZm9yIChoZWFkZXJzID0gY29uZi0+aGVhZGVyczsgaGVhZGVyczsgaGVhZGVycyA9IGdfbGlzdF9uZXh0IChoZWFkZXJzKSkgeworICAgICAgICBHc3RCdWZmZXIgKmhlYWRlciA9IEdTVF9CVUZGRVJfQ0FTVCAoaGVhZGVycy0+ZGF0YSk7CisKKyAgICAgICAgZ3N0X2J1ZmZlcl9yZWYgKGhlYWRlcik7CisgICAgICAgIGdzdF9ydHBfYmFzZV9kZXBheWxvYWRfcHVzaCAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRCAocnRwdGhlb3JhZGVwYXkpLAorICAgICAgICAgICAgaGVhZGVyKTsKKyAgICAgIH0KKyAgICAgIC8qIHJlbWVtYmVyIHRoZSBjdXJyZW50IGNvbmZpZyAqLworICAgICAgcnRwdGhlb3JhZGVwYXktPmNvbmZpZyA9IGNvbmY7CisgICAgICByZXMgPSBUUlVFOworICAgIH0KKyAgfQorICBpZiAoIXJlcykgeworICAgIC8qIHdlIGRvbid0IGtub3cgYWJvdXQgdGhlIGhlYWRlcnMsIGZpZ3VyZSBvdXQgYW4gYWx0ZXJuYXRpdmUgbWV0aG9kIGZvcgorICAgICAqIGdldHRpbmcgdGhlIGNvZGVib29rcy4gRklYTUUsIGZhaWwgZm9yIG5vdy4gKi8KKyAgfQorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfdGhlb3JhX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RSdHBUaGVvcmFEZXBheSAqcnRwdGhlb3JhZGVwYXk7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ2ludCBwYXlsb2FkX2xlbjsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdEJ1ZmZlciAqcGF5bG9hZF9idWZmZXIgPSBOVUxMOworICBndWludDggKnBheWxvYWQ7CisgIGd1aW50MzIgaGVhZGVyLCBpZGVudDsKKyAgZ3VpbnQ4IEYsIFREVCwgcGFja2V0czsKKyAgZ3VpbnQgbGVuZ3RoOworCisgIHJ0cHRoZW9yYWRlcGF5ID0gR1NUX1JUUF9USEVPUkFfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAiZ290IFJUUCBwYWNrZXQgb2Ygc2l6ZSAlZCIsIHBheWxvYWRfbGVuKTsKKworICAvKiB3ZSBuZWVkIGF0IGxlYXN0IDQgYnl0ZXMgZm9yIHRoZSBwYWNrZXQgaGVhZGVyICovCisgIGlmIChHX1VOTElLRUxZIChwYXlsb2FkX2xlbiA8IDQpKQorICAgIGdvdG8gcGFja2V0X3Nob3J0OworCisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAocnRwKTsKKworICBoZWFkZXIgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKHBheWxvYWQpOworICAvKgorICAgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIHwgICAgICAgICAgICAgICAgICAgICBJZGVudCAgICAgICAgICAgICAgICAgICAgIHwgRiB8VERUfCMgcGt0cy58CisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqCisgICAqIEY6IEZyYWdtZW50IHR5cGUgKDA9bm9uZSwgMT1zdGFydCwgMj1jb250LCAzPWVuZCkKKyAgICogVERUOiBUaGVvcmEgZGF0YSB0eXBlICgwPXRoZW9yYSwgMT1jb25maWcsIDI9Y29tbWVudCwgMz1yZXNlcnZlZCkKKyAgICogcGt0czogbnVtYmVyIG9mIHBhY2tldHMuCisgICAqLworICBURFQgPSAoaGVhZGVyICYgMHgzMCkgPj4gNDsKKyAgaWYgKEdfVU5MSUtFTFkgKFREVCA9PSAzKSkKKyAgICBnb3RvIGlnbm9yZV9yZXNlcnZlZDsKKworICBpZGVudCA9IChoZWFkZXIgPj4gOCkgJiAweGZmZmZmZjsKKyAgRiA9IChoZWFkZXIgJiAweGMwKSA+PiA2OworICBwYWNrZXRzID0gKGhlYWRlciAmIDB4Zik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAiaWRlbnQ6IDB4JTA4eCwgRjogJWQsIFREVDogJWQsIHBhY2tldHM6ICVkIiwKKyAgICAgIGlkZW50LCBGLCBURFQsIHBhY2tldHMpOworCisgIGlmIChURFQgPT0gMCkgeworICAgIGdib29sZWFuIGRvX3N3aXRjaCA9IEZBTFNFOworCisgICAgLyogd2UgaGF2ZSBhIHJhdyBwYXlsb2FkLCBmaW5kIHRoZSBjb2RlYm9vayBmb3IgdGhlIGlkZW50ICovCisgICAgaWYgKCFydHB0aGVvcmFkZXBheS0+Y29uZmlnKSB7CisgICAgICAvKiB3ZSBkb24ndCBoYXZlIGFuIGFjdGl2ZSBjb2RlYm9vaywgZmluZCB0aGUgY29kZWJvb2sgYW5kCisgICAgICAgKiBhY3RpdmF0ZSBpdCAqLworICAgICAgZG9fc3dpdGNoID0gVFJVRTsKKyAgICB9IGVsc2UgaWYgKHJ0cHRoZW9yYWRlcGF5LT5jb25maWctPmlkZW50ICE9IGlkZW50KSB7CisgICAgICAvKiBjb2RlYm9vayBjaGFuZ2VkICovCisgICAgICBkb19zd2l0Y2ggPSBUUlVFOworICAgIH0KKyAgICBpZiAoZG9fc3dpdGNoKSB7CisgICAgICBpZiAoIWdzdF9ydHBfdGhlb3JhX2RlcGF5X3N3aXRjaF9jb2RlYm9vayAocnRwdGhlb3JhZGVwYXksIGlkZW50KSkKKyAgICAgICAgZ290byBzd2l0Y2hfZmFpbGVkOworICAgIH0KKyAgfQorCisgIC8qIGZyYWdtZW50ZWQgcGFja2V0cywgYXNzZW1ibGUgKi8KKyAgaWYgKEYgIT0gMCkgeworICAgIEdzdEJ1ZmZlciAqdmRhdGE7CisKKyAgICBpZiAoRiA9PSAxKSB7CisgICAgICAvKiBpZiB3ZSBzdGFydCBhIHBhY2tldCwgY2xlYXIgYWRhcHRlciBhbmQgc3RhcnQgYXNzZW1ibGluZy4gKi8KKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChydHB0aGVvcmFkZXBheS0+YWRhcHRlcik7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsICJzdGFydCBhc3NlbWJsZSIpOworICAgICAgcnRwdGhlb3JhZGVwYXktPmFzc2VtYmxpbmcgPSBUUlVFOworICAgIH0KKworICAgIGlmICghcnRwdGhlb3JhZGVwYXktPmFzc2VtYmxpbmcpCisgICAgICBnb3RvIG5vX291dHB1dDsKKworICAgIC8qIHNraXAgaGVhZGVyIGFuZCBsZW5ndGguICovCisgICAgdmRhdGEgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgKHJ0cCwgNiwgLTEpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAiYXNzZW1ibGUgdGhlb3JhIHBhY2tldCIpOworICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cHRoZW9yYWRlcGF5LT5hZGFwdGVyLCB2ZGF0YSk7CisKKyAgICAvKiBwYWNrZXQgaXMgbm90IGNvbXBsZXRlLCB3ZSBhcmUgZG9uZSAqLworICAgIGlmIChGICE9IDMpCisgICAgICBnb3RvIG5vX291dHB1dDsKKworICAgIC8qIGNvbnN0cnVjdCBhc3NlbWJsZWQgYnVmZmVyICovCisgICAgbGVuZ3RoID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHB0aGVvcmFkZXBheS0+YWRhcHRlcik7CisgICAgcGF5bG9hZF9idWZmZXIgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRwdGhlb3JhZGVwYXktPmFkYXB0ZXIsIGxlbmd0aCk7CisgIH0gZWxzZSB7CisgICAgbGVuZ3RoID0gMDsKKyAgICBwYXlsb2FkX2J1ZmZlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3N1YmJ1ZmZlciAocnRwLCA0LCAtMSk7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsICJhc3NlbWJsZSBkb25lLCBwYXlsb2FkX2xlbiAlZCIsIHBheWxvYWRfbGVuKTsKKworICBnc3RfYnVmZmVyX21hcCAocGF5bG9hZF9idWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHBheWxvYWQgPSBtYXAuZGF0YTsKKyAgcGF5bG9hZF9sZW4gPSBtYXAuc2l6ZTsKKworICAvKiB3ZSBub3QgYXNzZW1ibGluZyBhbnltb3JlIG5vdyAqLworICBydHB0aGVvcmFkZXBheS0+YXNzZW1ibGluZyA9IEZBTFNFOworICBnc3RfYWRhcHRlcl9jbGVhciAocnRwdGhlb3JhZGVwYXktPmFkYXB0ZXIpOworCisgIC8qIHBheWxvYWQgbm93IHBvaW50cyB0byBhIGxlbmd0aCB3aXRoIHRoYXQgbWFueSB0aGVvcmEgZGF0YSBieXRlcy4KKyAgICogSXRlcmF0ZSBvdmVyIHRoZSBwYWNrZXRzIGFuZCBzZW5kIHRoZW0gb3V0LgorICAgKgorICAgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIHwgICAgICAgICAgICAgbGVuZ3RoICAgICAgICAgICAgfCAgICAgICAgICB0aGVvcmEgZGF0YSAgICAgICAgIC4uCisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIC4uICAgICAgICAgICAgICAgICAgICAgICAgdGhlb3JhIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIHwgICAgICAgICAgICBsZW5ndGggICAgICAgICAgICAgfCAgIG5leHQgdGhlb3JhIHBhY2tldCBkYXRhICAgIC4uCisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIC4uICAgICAgICAgICAgICAgICAgICAgICAgdGhlb3JhIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rKgorICAgKi8KKyAgd2hpbGUgKHBheWxvYWRfbGVuID49IDIpIHsKKyAgICAvKiBJZiBsZW5ndGggaXMgbm90IDAsIHdlIGhhdmUgYSByZWFzc2VtYmxlZCBwYWNrZXQgZm9yIHdoaWNoIHdlCisgICAgICogY2FsY3VsYXRlZCB0aGUgbGVuZ3RoIGFscmVhZHkgYW5kIGRvbid0IGhhdmUgdG8gc2tpcCBvdmVyIHRoZQorICAgICAqIGxlbmd0aCBmaWVsZCBhbnltb3JlCisgICAgICovCisgICAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICBsZW5ndGggPSBHU1RfUkVBRF9VSU5UMTZfQkUgKHBheWxvYWQpOworICAgICAgcGF5bG9hZCArPSAyOworICAgICAgcGF5bG9hZF9sZW4gLT0gMjsKKyAgICB9CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsICJyZWFkIGxlbmd0aCAldSwgYXZhaWw6ICVkIiwgbGVuZ3RoLAorICAgICAgICBwYXlsb2FkX2xlbik7CisKKyAgICAvKiBza2lwIHBhY2tldCBpZiBzb21ldGhpbmcgb2RkIGhhcHBlbnMgKi8KKyAgICBpZiAoR19VTkxJS0VMWSAobGVuZ3RoID4gcGF5bG9hZF9sZW4pKQorICAgICAgZ290byBsZW5ndGhfc2hvcnQ7CisKKyAgICAvKiBoYW5kbGUgaW4tYmFuZCBjb25maWd1cmF0aW9uICovCisgICAgaWYgKEdfVU5MSUtFTFkgKFREVCA9PSAxKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwdGhlb3JhZGVwYXksICJpbi1iYW5kIGNvbmZpZ3VyYXRpb24iKTsKKyAgICAgIGlmICghZ3N0X3J0cF90aGVvcmFfZGVwYXlfcGFyc2VfaW5iYW5kX2NvbmZpZ3VyYXRpb24gKHJ0cHRoZW9yYWRlcGF5LAorICAgICAgICAgICAgICBpZGVudCwgcGF5bG9hZCwgcGF5bG9hZF9sZW4sIGxlbmd0aCkpCisgICAgICAgIGdvdG8gaW52YWxpZF9jb25maWd1cmF0aW9uOworICAgICAgZ290byBub19vdXRwdXQ7CisgICAgfQorCisgICAgLyogY3JlYXRlIGJ1ZmZlciBmb3IgcGFja2V0ICovCisgICAgb3V0YnVmID0KKyAgICAgICAgZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAocGF5bG9hZF9idWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsCisgICAgICAgIHBheWxvYWQgLSBtYXAuZGF0YSwgbGVuZ3RoKTsKKworICAgIGlmIChwYXlsb2FkX2xlbiA+IDAgJiYgKHBheWxvYWRbMF0gJiAweEMwKSA9PSAweDApIHsKKyAgICAgIHJ0cHRoZW9yYWRlcGF5LT5uZWVkc19rZXlmcmFtZSA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKTsKKyAgICB9CisKKyAgICBwYXlsb2FkICs9IGxlbmd0aDsKKyAgICBwYXlsb2FkX2xlbiAtPSBsZW5ndGg7CisgICAgLyogbWFrZSBzdXJlIHRvIHJlYWQgbmV4dCBsZW5ndGggKi8KKyAgICBsZW5ndGggPSAwOworCisgICAgcmV0ID0gZ3N0X3J0cF9iYXNlX2RlcGF5bG9hZF9wdXNoIChkZXBheWxvYWQsIG91dGJ1Zik7CisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKHJ0cHRoZW9yYWRlcGF5LT5uZWVkc19rZXlmcmFtZSkKKyAgICBnb3RvIHJlcXVlc3Rfa2V5ZnJhbWU7CisKK291dDoKK25vX291dHB1dDoKKworICBpZiAocGF5bG9hZF9idWZmZXIpIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChwYXlsb2FkX2J1ZmZlciwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAocGF5bG9hZF9idWZmZXIpOworICB9CisKKyAgcmV0dXJuIE5VTEw7CisKKyAgLyogRVJPUlJTICovCitzd2l0Y2hfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwdGhlb3JhZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiQ291bGQgbm90IHN3aXRjaCBjb2RlYm9va3MiKSk7CisgICAgZ290byByZXF1ZXN0X2NvbmZpZzsKKyAgfQorcGFja2V0X3Nob3J0OgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwdGhlb3JhZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiUGFja2V0IHdhcyB0b28gc2hvcnQgKCVkIDwgNCkiLCBwYXlsb2FkX2xlbikpOworICAgIGdvdG8gcmVxdWVzdF9rZXlmcmFtZTsKKyAgfQoraWdub3JlX3Jlc2VydmVkOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChydHB0aGVvcmFkZXBheSwgInJlc2VydmVkIFREVCBpZ25vcmVkIik7CisgICAgZ290byBvdXQ7CisgIH0KK2xlbmd0aF9zaG9ydDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cHRoZW9yYWRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIlBhY2tldCBjb250YWlucyBpbnZhbGlkIGRhdGEiKSk7CisgICAgZ290byByZXF1ZXN0X2tleWZyYW1lOworICB9CitpbnZhbGlkX2NvbmZpZ3VyYXRpb246CisgIHsKKyAgICAvKiBmYXRhbCwgYXMgd2Ugb3RoZXJ3aXNlIHJpc2sgY2Fycnlpbmcgb24gd2l0aG91dCBvdXRwdXQgKi8KKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocnRwdGhlb3JhZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiUGFja2V0IGNvbnRhaW5zIGludmFsaWQgY29uZmlndXJhdGlvbiIpKTsKKyAgICBnb3RvIHJlcXVlc3RfY29uZmlnOworICB9CityZXF1ZXN0X2NvbmZpZzoKKyAgeworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TSU5LUEFEIChkZXBheWxvYWQpLAorICAgICAgICBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwKKyAgICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiR3N0Rm9yY2VLZXlVbml0IiwKKyAgICAgICAgICAgICAgICAiYWxsLWhlYWRlcnMiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCkpKTsKKyAgICBnb3RvIG91dDsKKyAgfQorcmVxdWVzdF9rZXlmcmFtZToKKyAgeworICAgIHJ0cHRoZW9yYWRlcGF5LT5uZWVkc19rZXlmcmFtZSA9IFRSVUU7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NJTktQQUQgKGRlcGF5bG9hZCksCisgICAgICAgIGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNLAorICAgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXdfZW1wdHkgKCJHc3RGb3JjZUtleVVuaXQiKSkpOworICAgIGdvdG8gb3V0OworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF90aGVvcmFfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RSdHBUaGVvcmFEZXBheSAqcnRwdGhlb3JhZGVwYXk7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBydHB0aGVvcmFkZXBheSA9IEdTVF9SVFBfVEhFT1JBX0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZnJlZV9pbmRlbnRzIChydHB0aGVvcmFkZXBheSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF90aGVvcmFfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHB0aGVvcmFkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9USEVPUkFfREVQQVkpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfdGhlb3JhX2RlcGF5X3BhY2tldF9sb3N0IChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFJ0cFRoZW9yYURlcGF5ICpydHB0aGVvcmFkZXBheSA9IEdTVF9SVFBfVEhFT1JBX0RFUEFZIChkZXBheWxvYWQpOworICBndWludCBzZXFudW0gPSAwOworCisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQgKGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChldmVudCksICJzZXFudW0iLCAmc2VxbnVtKTsKKyAgR1NUX0xPR19PQkpFQ1QgKGRlcGF5bG9hZCwgIlJlcXVlc3RlZCBrZXlmcmFtZSBiZWNhdXNlIGZyYW1lIHdpdGggc2VxbnVtICV1IgorICAgICAgIiBpcyBtaXNzaW5nIiwgc2VxbnVtKTsKKyAgcnRwdGhlb3JhZGVwYXktPm5lZWRzX2tleWZyYW1lID0gVFJVRTsKKworICBnc3RfcGFkX3B1c2hfZXZlbnQgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU0lOS1BBRCAoZGVwYXlsb2FkKSwKKyAgICAgIGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNLAorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5ICgiR3N0Rm9yY2VLZXlVbml0IikpKTsKKworICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjBiMjYwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9USEVPUkFfREVQQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9USEVPUkFfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1RIRU9SQV9ERVBBWSBcCisgIChnc3RfcnRwX3RoZW9yYV9kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX1RIRU9SQV9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9USEVPUkFfREVQQVksR3N0UnRwVGhlb3JhRGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX1RIRU9SQV9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfVEhFT1JBX0RFUEFZLEdzdFJ0cFRoZW9yYURlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1RIRU9SQV9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9USEVPUkFfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX1RIRU9SQV9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfVEhFT1JBX0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFRoZW9yYURlcGF5IEdzdFJ0cFRoZW9yYURlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFRoZW9yYURlcGF5Q2xhc3MgR3N0UnRwVGhlb3JhRGVwYXlDbGFzczsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFRoZW9yYUNvbmZpZyB7CisgIGd1aW50MzIgIGlkZW50OworICBHTGlzdCAgICpoZWFkZXJzOworfSBHc3RSdHBUaGVvcmFDb25maWc7CisKK3N0cnVjdCBfR3N0UnRwVGhlb3JhRGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBwYXJlbnQ7CisKKyAgR0xpc3QgICAgICAgICAgICAgICpjb25maWdzOworICBHc3RSdHBUaGVvcmFDb25maWcgKmNvbmZpZzsKKworICBHc3RBZGFwdGVyICAgICAgICAgKmFkYXB0ZXI7CisgIGdib29sZWFuICAgICAgICAgICAgYXNzZW1ibGluZzsKKworICBnYm9vbGVhbiAgICAgICAgICAgIG5lZWRzX2tleWZyYW1lOworfTsKKworc3RydWN0IF9Hc3RSdHBUaGVvcmFEZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX3RoZW9yYV9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfdGhlb3JhX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX1RIRU9SQV9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ODM5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jCkBAIC0wLDAgKzEsOTgyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpbmNsdWRlICJmbnYxaGFzaC5oIgorI2luY2x1ZGUgImdzdHJ0cHRoZW9yYXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKKyNkZWZpbmUgVEhFT1JBX0lEX0xFTgk0MgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHB0aGVvcmFwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cHRoZW9yYXBheV9kZWJ1ZykKKworLyogcmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9zdm4ueGlwaC5vcmcvdHJ1bmsvdGhlb3JhL2RvYy9kcmFmdC1pZXRmLWF2dC1ydHAtdGhlb3JhLTAxLnR4dAorICovCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3RoZW9yYV9wYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIlRIRU9SQVwiIgorICAgICAgICAvKiBBbGwgcmVxdWlyZWQgcGFyYW1ldGVycworICAgICAgICAgKgorICAgICAgICAgKiAic2FtcGxpbmcgPSAoc3RyaW5nKSB7ICJZQ2JDci00OjI6MCIsICJZQ2JDci00OjI6MiIsICJZQ2JDci00OjQ6NCIgfSAiCisgICAgICAgICAqICJ3aWR0aCA9IChzdHJpbmcpIFsxLCAxMDQ4NTYxXSAobXVsdGlwbGVzIG9mIDE2KSAiCisgICAgICAgICAqICJoZWlnaHQgPSAoc3RyaW5nKSBbMSwgMTA0ODU2MV0gKG11bHRpcGxlcyBvZiAxNikgIgorICAgICAgICAgKiAiY29uZmlndXJhdGlvbiA9IChzdHJpbmcpIEFOWSIKKyAgICAgICAgICovCisgICAgICAgIC8qIEFsbCBvcHRpb25hbCBwYXJhbWV0ZXJzCisgICAgICAgICAqCisgICAgICAgICAqICJjb25maWd1cmF0aW9uLXVyaSA9IgorICAgICAgICAgKiAiZGVsaXZlcnktbWV0aG9kID0gKHN0cmluZykgeyBpbmxpbmUsIGluX2JhbmQsIG91dF9iYW5kLzxzcGVjaWZpY19uYW1lPiB9ICIKKyAgICAgICAgICovCisgICAgKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3RoZW9yYV9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXRoZW9yYSIpCisgICAgKTsKKworI2RlZmluZSBERUZBVUxUX0NPTkZJR19JTlRFUlZBTCAwCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0NPTkZJR19JTlRFUlZBTAorfTsKKworI2RlZmluZSBnc3RfcnRwX3RoZW9yYV9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwVGhlb3JhUGF5LCBnc3RfcnRwX3RoZW9yYV9wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF90aGVvcmFfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfdGhlb3JhX3BheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKgorICAgIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF90aGVvcmFfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogcGFkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF90aGVvcmFfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfdGhlb3JhX3BheV9wYXJzZV9pZCAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBndWludDggKiBkYXRhLCBndWludCBzaXplKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3RoZW9yYV9wYXlfZmluaXNoX2hlYWRlcnMgKEdzdFJUUEJhc2VQYXlsb2FkICoKKyAgICBiYXNlcGF5bG9hZCk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfdGhlb3JhX3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX3RoZW9yYV9wYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF90aGVvcmFfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cFRoZW9yYVBheUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzICpnc3RydHBiYXNlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3J0cF90aGVvcmFfcGF5X2NoYW5nZV9zdGF0ZTsKKworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX3RoZW9yYV9wYXlfc2V0Y2FwczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX3RoZW9yYV9wYXlfaGFuZGxlX2J1ZmZlcjsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNpbmtfZXZlbnQgPSBnc3RfcnRwX3RoZW9yYV9wYXlfc2lua19ldmVudDsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX3RoZW9yYV9wYXlfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcnRwX3RoZW9yYV9wYXlfZ2V0X3Byb3BlcnR5OworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfdGhlb3JhX3BheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3RoZW9yYV9wYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgVGhlb3JhIHBheWxvYWRlciIsICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBheWxvYWQtZW5jb2RlIFRoZW9yYSB2aWRlbyBpbnRvIFJUUCBwYWNrZXRzIChkcmFmdC0wMSBSRkMgWFhYWCkiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cHRoZW9yYXBheV9kZWJ1ZywgInJ0cHRoZW9yYXBheSIsIDAsCisgICAgICAiVGhlb3JhIFJUUCBQYXlsb2FkZXIiKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0NPTkZJR19JTlRFUlZBTCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiY29uZmlnLWludGVydmFsIiwgIkNvbmZpZyBTZW5kIEludGVydmFsIiwKKyAgICAgICAgICAiU2VuZCBDb25maWcgSW5zZXJ0aW9uIEludGVydmFsIGluIHNlY29uZHMgKGNvbmZpZ3VyYXRpb24gaGVhZGVycyAiCisgICAgICAgICAgIndpbGwgYmUgbXVsdGlwbGV4ZWQgaW4gdGhlIGRhdGEgc3RyZWFtIHdoZW4gZGV0ZWN0ZWQuKSAoMCA9IGRpc2FibGVkKSIsCisgICAgICAgICAgMCwgMzYwMCwgREVGQVVMVF9DT05GSUdfSU5URVJWQUwsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKQorICAgICAgKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdGhlb3JhX3BheV9pbml0IChHc3RSdHBUaGVvcmFQYXkgKiBydHB0aGVvcmFwYXkpCit7CisgIHJ0cHRoZW9yYXBheS0+bGFzdF9jb25maWcgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF90aGVvcmFfcGF5X2NsZWFyX3BhY2tldCAoR3N0UnRwVGhlb3JhUGF5ICogcnRwdGhlb3JhcGF5KQoreworICBpZiAocnRwdGhlb3JhcGF5LT5wYWNrZXQpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAocnRwdGhlb3JhcGF5LT5wYWNrZXQpOworICBydHB0aGVvcmFwYXktPnBhY2tldCA9IE5VTEw7CisgIGdfbGlzdF9mcmVlX2Z1bGwgKHJ0cHRoZW9yYXBheS0+cGFja2V0X2J1ZmZlcnMsCisgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9idWZmZXJfdW5yZWYpOworICBydHB0aGVvcmFwYXktPnBhY2tldF9idWZmZXJzID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdGhlb3JhX3BheV9jbGVhbnVwIChHc3RSdHBUaGVvcmFQYXkgKiBydHB0aGVvcmFwYXkpCit7CisgIGdzdF9ydHBfdGhlb3JhX3BheV9jbGVhcl9wYWNrZXQgKHJ0cHRoZW9yYXBheSk7CisgIGdfbGlzdF9mcmVlX2Z1bGwgKHJ0cHRoZW9yYXBheS0+aGVhZGVycywgKEdEZXN0cm95Tm90aWZ5KSBnc3RfYnVmZmVyX3VucmVmKTsKKyAgcnRwdGhlb3JhcGF5LT5oZWFkZXJzID0gTlVMTDsKKyAgZ19mcmVlIChydHB0aGVvcmFwYXktPmNvbmZpZ19kYXRhKTsKKyAgcnRwdGhlb3JhcGF5LT5jb25maWdfZGF0YSA9IE5VTEw7CisgIHJ0cHRoZW9yYXBheS0+bGFzdF9jb25maWcgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfdGhlb3JhX3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UnRwVGhlb3JhUGF5ICpydHB0aGVvcmFwYXk7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgY29uc3QgR1ZhbHVlICphcnJheTsKKyAgZ2ludCBhc2l6ZSwgaTsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdE1hcEluZm8gbWFwOworCisgIHJ0cHRoZW9yYXBheSA9IEdTVF9SVFBfVEhFT1JBX1BBWSAoYmFzZXBheWxvYWQpOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBydHB0aGVvcmFwYXktPm5lZWRfaGVhZGVycyA9IFRSVUU7CisKKyAgaWYgKChhcnJheSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAic3RyZWFtaGVhZGVyIikpID09IE5VTEwpCisgICAgZ290byBkb25lOworCisgIGlmIChHX1ZBTFVFX1RZUEUgKGFycmF5KSAhPSBHU1RfVFlQRV9BUlJBWSkKKyAgICBnb3RvIGRvbmU7CisKKyAgaWYgKChhc2l6ZSA9IGdzdF92YWx1ZV9hcnJheV9nZXRfc2l6ZSAoYXJyYXkpKSA8IDMpCisgICAgZ290byBkb25lOworCisgIGZvciAoaSA9IDA7IGkgPCBhc2l6ZTsgaSsrKSB7CisgICAgY29uc3QgR1ZhbHVlICp2YWx1ZTsKKworICAgIHZhbHVlID0gZ3N0X3ZhbHVlX2FycmF5X2dldF92YWx1ZSAoYXJyYXksIGkpOworICAgIGlmICgoYnVmID0gZ3N0X3ZhbHVlX2dldF9idWZmZXIgKHZhbHVlKSkgPT0gTlVMTCkKKyAgICAgIGdvdG8gbnVsbF9idWZmZXI7CisKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIC8qIG5vIGRhdGEgcGFja2V0cyBhbGxvd2VkICovCisgICAgaWYgKG1hcC5zaXplIDwgMSkKKyAgICAgIGdvdG8gaW52YWxpZF9zdHJlYW1oZWFkZXI7CisKKyAgICAvKiB3ZSBuZWVkIHBhY2tldHMgd2l0aCBpZCAweDgwLCAweDgxLCAweDgyICovCisgICAgaWYgKG1hcC5kYXRhWzBdICE9IDB4ODAgKyBpKQorICAgICAgZ290byBpbnZhbGlkX3N0cmVhbWhlYWRlcjsKKworICAgIGlmIChpID09IDApIHsKKyAgICAgIC8qIGlkZW50aWZpY2F0aW9uLCB3ZSBuZWVkIHRvIHBhcnNlIHRoaXMgaW4gb3JkZXIgdG8gZ2V0IHRoZSBjbG9jayByYXRlLiAqLworICAgICAgaWYgKEdfVU5MSUtFTFkgKCFnc3RfcnRwX3RoZW9yYV9wYXlfcGFyc2VfaWQgKGJhc2VwYXlsb2FkLCBtYXAuZGF0YSwKKyAgICAgICAgICAgICAgICAgIG1hcC5zaXplKSkpCisgICAgICAgIGdvdG8gcGFyc2VfaWRfZmFpbGVkOworICAgIH0KKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHB0aGVvcmFwYXksICJjb2xsZWN0aW5nIGhlYWRlciAlZCIsIGkpOworICAgIHJ0cHRoZW9yYXBheS0+aGVhZGVycyA9CisgICAgICAgIGdfbGlzdF9hcHBlbmQgKHJ0cHRoZW9yYXBheS0+aGVhZGVycywgZ3N0X2J1ZmZlcl9yZWYgKGJ1ZikpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIH0KKyAgaWYgKCFnc3RfcnRwX3RoZW9yYV9wYXlfZmluaXNoX2hlYWRlcnMgKGJhc2VwYXlsb2FkKSkKKyAgICBnb3RvIGZpbmlzaF9mYWlsZWQ7CisKK2RvbmU6CisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworbnVsbF9idWZmZXI6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cHRoZW9yYXBheSwgInN0cmVhbWhlYWRlciB3aXRoIG51bGwgYnVmZmVyIHJlY2VpdmVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbnZhbGlkX3N0cmVhbWhlYWRlcjoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwdGhlb3JhcGF5LCAidW5hYmxlIHRvIHBhcnNlIGluaXRpYWwgaGVhZGVyIik7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3BhcnNlX2lkX2ZhaWxlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwdGhlb3JhcGF5LCAidW5hYmxlIHRvIHBhcnNlIGluaXRpYWwgaGVhZGVyIik7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ZpbmlzaF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cHRoZW9yYXBheSwgInVuYWJsZSB0byBmaW5pc2ggaGVhZGVycyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF90aGVvcmFfcGF5X3Jlc2V0X3BhY2tldCAoR3N0UnRwVGhlb3JhUGF5ICogcnRwdGhlb3JhcGF5LCBndWludDggVERUKQoreworICBndWludCBwYXlsb2FkX2xlbjsKKyAgR3N0UlRQQnVmZmVyIHJ0cCA9IHsgTlVMTCB9OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHRoZW9yYXBheSwgInJlc2V0IHBhY2tldCIpOworCisgIHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9wb3MgPSA0OworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKHJ0cHRoZW9yYXBheS0+cGFja2V0LCBHU1RfTUFQX1JFQUQsICZydHApOworICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAoJnJ0cCk7CisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgcnRwdGhlb3JhcGF5LT5wYXlsb2FkX2xlZnQgPSBwYXlsb2FkX2xlbiAtIDQ7CisgIHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9kdXJhdGlvbiA9IDA7CisgIHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9GID0gMDsKKyAgcnRwdGhlb3JhcGF5LT5wYXlsb2FkX1REVCA9IFREVDsKKyAgcnRwdGhlb3JhcGF5LT5wYXlsb2FkX3BrdHMgPSAwOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF90aGVvcmFfcGF5X2luaXRfcGFja2V0IChHc3RSdHBUaGVvcmFQYXkgKiBydHB0aGVvcmFwYXksIGd1aW50OCBURFQsCisgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCkKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwdGhlb3JhcGF5LCAic3RhcnRpbmcgbmV3IHBhY2tldCwgVERUOiAlZCIsIFREVCk7CisKKyAgZ3N0X3J0cF90aGVvcmFfcGF5X2NsZWFyX3BhY2tldCAocnRwdGhlb3JhcGF5KTsKKworICAvKiBuZXcgcGFja2V0IGFsbG9jYXRlIG1heCBwYWNrZXQgc2l6ZSAqLworICBydHB0aGVvcmFwYXktPnBhY2tldCA9CisgICAgICBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGVfbGVuIChHU1RfUlRQX0JBU0VfUEFZTE9BRF9NVFUKKyAgICAgIChydHB0aGVvcmFwYXkpLCAwLCAwKTsKKyAgZ3N0X3J0cF90aGVvcmFfcGF5X3Jlc2V0X3BhY2tldCAocnRwdGhlb3JhcGF5LCBURFQpOworCisgIEdTVF9CVUZGRVJfUFRTIChydHB0aGVvcmFwYXktPnBhY2tldCkgPSB0aW1lc3RhbXA7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX3RoZW9yYV9wYXlfZmx1c2hfcGFja2V0IChHc3RSdHBUaGVvcmFQYXkgKiBydHB0aGVvcmFwYXkpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBndWludDggKnBheWxvYWQ7CisgIGd1aW50IGhsZW47CisgIEdzdFJUUEJ1ZmZlciBydHAgPSB7IE5VTEwgfTsKKyAgR0xpc3QgKmw7CisKKyAgLyogY2hlY2sgZm9yIGVtcHR5IHBhY2tldCAqLworICBpZiAoIXJ0cHRoZW9yYXBheS0+cGFja2V0IHx8IHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9wb3MgPD0gNCkKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwdGhlb3JhcGF5LCAiZmx1c2hpbmcgcGFja2V0Iik7CisKKyAgZ3N0X3J0cF9idWZmZXJfbWFwIChydHB0aGVvcmFwYXktPnBhY2tldCwgR1NUX01BUF9XUklURSwgJnJ0cCk7CisKKyAgLyogZml4IGhlYWRlciAqLworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHApOworICAvKgorICAgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIHwgICAgICAgICAgICAgICAgICAgICBJZGVudCAgICAgICAgICAgICAgICAgICAgIHwgRiB8VERUfCMgcGt0cy58CisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqCisgICAqIEY6IEZyYWdtZW50IHR5cGUgKDA9bm9uZSwgMT1zdGFydCwgMj1jb250LCAzPWVuZCkKKyAgICogVERUOiBUaGVvcmEgZGF0YSB0eXBlICgwPXRoZW9yYSwgMT1jb25maWcsIDI9Y29tbWVudCwgMz1yZXNlcnZlZCkKKyAgICogcGt0czogbnVtYmVyIG9mIHBhY2tldHMuCisgICAqLworICBwYXlsb2FkWzBdID0gKHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9pZGVudCA+PiAxNikgJiAweGZmOworICBwYXlsb2FkWzFdID0gKHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9pZGVudCA+PiA4KSAmIDB4ZmY7CisgIHBheWxvYWRbMl0gPSAocnRwdGhlb3JhcGF5LT5wYXlsb2FkX2lkZW50KSAmIDB4ZmY7CisgIHBheWxvYWRbM10gPSAocnRwdGhlb3JhcGF5LT5wYXlsb2FkX0YgJiAweDMpIDw8IDYgfAorICAgICAgKHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9URFQgJiAweDMpIDw8IDQgfAorICAgICAgKHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9wa3RzICYgMHhmKTsKKworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgLyogc2hyaW5rIHRoZSBidWZmZXIgc2l6ZSB0byB0aGUgbGFzdCB3cml0dGVuIGJ5dGUgKi8KKyAgaGxlbiA9IGdzdF9ydHBfYnVmZmVyX2NhbGNfaGVhZGVyX2xlbiAoMCk7CisgIGdzdF9idWZmZXJfcmVzaXplIChydHB0aGVvcmFwYXktPnBhY2tldCwgMCwgaGxlbiArIHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9wb3MpOworCisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKHJ0cHRoZW9yYXBheS0+cGFja2V0KSA9IHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9kdXJhdGlvbjsKKworICBmb3IgKGwgPSBnX2xpc3RfbGFzdCAocnRwdGhlb3JhcGF5LT5wYWNrZXRfYnVmZmVycyk7IGw7IGwgPSBsLT5wcmV2KSB7CisgICAgR3N0QnVmZmVyICpidWYgPSBHU1RfQlVGRkVSX0NBU1QgKGwtPmRhdGEpOworICAgIGdzdF9ydHBfY29weV92aWRlb19tZXRhIChydHB0aGVvcmFwYXksIHJ0cHRoZW9yYXBheS0+cGFja2V0LCBidWYpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIH0KKyAgZ19saXN0X2ZyZWUgKHJ0cHRoZW9yYXBheS0+cGFja2V0X2J1ZmZlcnMpOworICBydHB0aGVvcmFwYXktPnBhY2tldF9idWZmZXJzID0gTlVMTDsKKworICAvKiBwdXNoLCB0aGlzIGdpdmVzIGF3YXkgb3VyIHJlZiB0byB0aGUgcGFja2V0LCBzbyBjbGVhciBpdC4gKi8KKyAgcmV0ID0KKyAgICAgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHB0aGVvcmFwYXkpLAorICAgICAgcnRwdGhlb3JhcGF5LT5wYWNrZXQpOworICBydHB0aGVvcmFwYXktPnBhY2tldCA9IE5VTEw7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3RoZW9yYV9wYXlfZmluaXNoX2hlYWRlcnMgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQpCit7CisgIEdzdFJ0cFRoZW9yYVBheSAqcnRwdGhlb3JhcGF5ID0gR1NUX1JUUF9USEVPUkFfUEFZIChiYXNlcGF5bG9hZCk7CisgIEdMaXN0ICp3YWxrOworICBndWludCBsZW5ndGgsIHNpemUsIG5faGVhZGVycywgY29uZmlnbGVuLCBleHRyYWxlbjsKKyAgZ2NoYXIgKndzdHIsICpoc3RyLCAqY29uZmlndXJhdGlvbjsKKyAgZ3VpbnQ4ICpkYXRhLCAqY29uZmlnOworICBndWludDMyIGlkZW50OworICBnYm9vbGVhbiByZXM7CisgIGNvbnN0IGdjaGFyICpzYW1wbGluZyA9IE5VTEw7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwdGhlb3JhcGF5LCAiZmluaXNoIGhlYWRlcnMiKTsKKworICBpZiAoIXJ0cHRoZW9yYXBheS0+aGVhZGVycykgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHRoZW9yYXBheSwgIldlIG5lZWQgMiBoZWFkZXJzIGJ1dCBoYXZlIG5vbmUiKTsKKyAgICBnb3RvIG5vX2hlYWRlcnM7CisgIH0KKworICAvKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHBhY2tlZCBoZWFkZXJzICAgICAgICAgICAgICAgICAgfAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZWQgaGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZWQgaGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKgorICAgKiBXZSBvbmx5IGNvbnN0cnVjdCBhIGNvbmZpZyBjb250YWluaW5nIDEgcGFja2VkIGhlYWRlciBsaWtlIHRoaXM6CisgICAqCisgICAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICBJZGVudCAgICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgIHwgbi4gb2YgaGVhZGVycyB8ICAgIGxlbmd0aDEgICAgfCAgICBsZW5ndGgyICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgIHwgICAgICAgICAgICAgSWRlbnRpZmljYXRpb24gSGVhZGVyICAgICAgICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgIHwgICAgICAgICBDb21tZW50IEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50IEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dXAgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgICAgICAgICAgICAgU2V0dXAgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICovCisKKyAgLyogd2UgbmVlZCA0IGJ5dGVzIGZvciB0aGUgbnVtYmVyIG9mIGhlYWRlcnMgKHdoaWNoIGlzIGFsd2F5cyAxKSwgMyBieXRlcyBmb3IKKyAgICogdGhlIGlkZW50LCAyIGJ5dGVzIGZvciBsZW5ndGgsIDEgYnl0ZSBmb3Igbi4gb2YgaGVhZGVycy4gKi8KKyAgc2l6ZSA9IDQgKyAzICsgMiArIDE7CisKKyAgLyogY291bnQgdGhlIHNpemUgb2YgdGhlIGhlYWRlcnMgZmlyc3QgYW5kIHVwZGF0ZSB0aGUgaGFzaCAqLworICBsZW5ndGggPSAwOworICBuX2hlYWRlcnMgPSAwOworICBpZGVudCA9IGZudjFfaGFzaF8zMl9uZXcgKCk7CisgIGV4dHJhbGVuID0gMTsKKyAgZm9yICh3YWxrID0gcnRwdGhlb3JhcGF5LT5oZWFkZXJzOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0QnVmZmVyICpidWYgPSBHU1RfQlVGRkVSX0NBU1QgKHdhbGstPmRhdGEpOworICAgIEdzdE1hcEluZm8gbWFwOworICAgIGd1aW50IGJzaXplOworCisgICAgYnNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpOworICAgIGxlbmd0aCArPSBic2l6ZTsKKyAgICBuX2hlYWRlcnMrKzsKKworICAgIC8qIGNvdW50IG51bWJlciBvZiBieXRlcyBuZWVkZWQgZm9yIGxlbmd0aCBmaWVsZHMsIHdlIGRvbid0IG5lZWQgdGhpcyBmb3IKKyAgICAgKiB0aGUgbGFzdCBoZWFkZXIuICovCisgICAgaWYgKGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgICAgZG8geworICAgICAgICBzaXplKys7CisgICAgICAgIGV4dHJhbGVuKys7CisgICAgICAgIGJzaXplID4+PSA3OworICAgICAgfSB3aGlsZSAoYnNpemUpOworICAgIH0KKyAgICAvKiB1cGRhdGUgaGFzaCAqLworICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgaWRlbnQgPSBmbnYxX2hhc2hfMzJfdXBkYXRlIChpZGVudCwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICB9CisKKyAgLyogcGFja2V0IGxlbmd0aCBpcyBoZWFkZXIgc2l6ZSArIHBhY2tldCBsZW5ndGggKi8KKyAgY29uZmlnbGVuID0gc2l6ZSArIGxlbmd0aDsKKyAgY29uZmlnID0gZGF0YSA9IGdfbWFsbG9jIChjb25maWdsZW4pOworCisgIC8qIG51bWJlciBvZiBwYWNrZWQgaGVhZGVycywgd2Ugb25seSBwYWNrIDEgaGVhZGVyICovCisgIGRhdGFbMF0gPSAwOworICBkYXRhWzFdID0gMDsKKyAgZGF0YVsyXSA9IDA7CisgIGRhdGFbM10gPSAxOworCisgIGlkZW50ID0gZm52MV9oYXNoXzMyX3RvXzI0IChpZGVudCk7CisgIHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9pZGVudCA9IGlkZW50OworICBHU1RfREVCVUdfT0JKRUNUIChydHB0aGVvcmFwYXksICJpZGVudCAweCUwOHgiLCBpZGVudCk7CisKKyAgLyogdGFrZSBsb3dlciAzIGJ5dGVzICovCisgIGRhdGFbNF0gPSAoaWRlbnQgPj4gMTYpICYgMHhmZjsKKyAgZGF0YVs1XSA9IChpZGVudCA+PiA4KSAmIDB4ZmY7CisgIGRhdGFbNl0gPSBpZGVudCAmIDB4ZmY7CisKKyAgLyogc3RvcmUgbGVuZ3RoIG9mIGFsbCB0aGVvcmEgaGVhZGVycyAqLworICBkYXRhWzddID0gKChsZW5ndGgpID4+IDgpICYgMHhmZjsKKyAgZGF0YVs4XSA9IChsZW5ndGgpICYgMHhmZjsKKworICAvKiBzdG9yZSBudW1iZXIgb2YgaGVhZGVycyBtaW51cyBvbmUuICovCisgIGRhdGFbOV0gPSBuX2hlYWRlcnMgLSAxOworICBkYXRhICs9IDEwOworCisgIC8qIHN0b3JlIGxlbmd0aCBmb3IgZWFjaCBoZWFkZXIgKi8KKyAgZm9yICh3YWxrID0gcnRwdGhlb3JhcGF5LT5oZWFkZXJzOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0QnVmZmVyICpidWYgPSBHU1RfQlVGRkVSX0NBU1QgKHdhbGstPmRhdGEpOworICAgIGd1aW50IGJzaXplLCBzaXplLCB0ZW1wOworICAgIGd1aW50IGZsYWc7CisKKyAgICAvKiBvbmx5IG5lZWQgdG8gc3RvcmUgdGhlIGxlbmd0aCB3aGVuIGl0J3Mgbm90IHRoZSBsYXN0IGhlYWRlciAqLworICAgIGlmICghZ19saXN0X25leHQgKHdhbGspKQorICAgICAgYnJlYWs7CisKKyAgICBic2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisKKyAgICAvKiBjYWxjIHNpemUgKi8KKyAgICBzaXplID0gMDsKKyAgICBkbyB7CisgICAgICBzaXplKys7CisgICAgICBic2l6ZSA+Pj0gNzsKKyAgICB9IHdoaWxlIChic2l6ZSk7CisgICAgdGVtcCA9IHNpemU7CisKKyAgICBic2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisgICAgLyogd3JpdGUgdGhlIHNpemUgYmFja3dhcmRzICovCisgICAgZmxhZyA9IDA7CisgICAgd2hpbGUgKHNpemUpIHsKKyAgICAgIHNpemUtLTsKKyAgICAgIGRhdGFbc2l6ZV0gPSAoYnNpemUgJiAweDdmKSB8IGZsYWc7CisgICAgICBic2l6ZSA+Pj0gNzsKKyAgICAgIGZsYWcgPSAweDgwOyAgICAgICAgICAgICAgLyogRmxhZyBiaXQgb24gYWxsIGJ5dGVzIG9mIHRoZSBsZW5ndGggZXhjZXB0IHRoZSBsYXN0ICovCisgICAgfQorICAgIGRhdGEgKz0gdGVtcDsKKyAgfQorCisgIC8qIGNvcHkgaGVhZGVyIGRhdGEgKi8KKyAgZm9yICh3YWxrID0gcnRwdGhlb3JhcGF5LT5oZWFkZXJzOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0QnVmZmVyICpidWYgPSBHU1RfQlVGRkVSX0NBU1QgKHdhbGstPmRhdGEpOworCisgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChidWYsIDAsIGRhdGEsIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikpOworICAgIGRhdGEgKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKyAgfQorICBydHB0aGVvcmFwYXktPm5lZWRfaGVhZGVycyA9IEZBTFNFOworCisgIC8qIHNlcmlhbGl6ZSB0byBiYXNlNjQgKi8KKyAgY29uZmlndXJhdGlvbiA9IGdfYmFzZTY0X2VuY29kZSAoY29uZmlnLCBjb25maWdsZW4pOworCisgIC8qIHN0b3JlIGZvciBsYXRlciByZS1zZW5kaW5nICovCisgIGdfZnJlZSAocnRwdGhlb3JhcGF5LT5jb25maWdfZGF0YSk7CisgIHJ0cHRoZW9yYXBheS0+Y29uZmlnX3NpemUgPSBjb25maWdsZW4gLSA0IC0gMyAtIDI7CisgIHJ0cHRoZW9yYXBheS0+Y29uZmlnX2RhdGEgPSBnX21hbGxvYyAocnRwdGhlb3JhcGF5LT5jb25maWdfc2l6ZSk7CisgIHJ0cHRoZW9yYXBheS0+Y29uZmlnX2V4dHJhX2xlbiA9IGV4dHJhbGVuOworICBtZW1jcHkgKHJ0cHRoZW9yYXBheS0+Y29uZmlnX2RhdGEsIGNvbmZpZyArIDQgKyAzICsgMiwKKyAgICAgIHJ0cHRoZW9yYXBheS0+Y29uZmlnX3NpemUpOworCisgIGdfZnJlZSAoY29uZmlnKTsKKworICAvKiBjb25maWd1cmUgcGF5bG9hZGVyIHNldHRpbmdzICovCisgIHN3aXRjaCAocnRwdGhlb3JhcGF5LT5waXhlbF9mb3JtYXQpIHsKKyAgICBjYXNlIDI6CisgICAgICBzYW1wbGluZyA9ICJZQ2JDci00OjI6MiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBzYW1wbGluZyA9ICJZQ2JDci00OjQ6NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDA6CisgICAgZGVmYXVsdDoKKyAgICAgIHNhbXBsaW5nID0gIllDYkNyLTQ6MjowIjsKKyAgICAgIGJyZWFrOworICB9CisKKworICB3c3RyID0gZ19zdHJkdXBfcHJpbnRmICgiJWQiLCBydHB0aGVvcmFwYXktPndpZHRoKTsKKyAgaHN0ciA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgcnRwdGhlb3JhcGF5LT5oZWlnaHQpOworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAoYmFzZXBheWxvYWQsICJ2aWRlbyIsIFRSVUUsICJUSEVPUkEiLAorICAgICAgOTAwMDApOworICByZXMgPQorICAgICAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLCAic2FtcGxpbmciLCBHX1RZUEVfU1RSSU5HLAorICAgICAgc2FtcGxpbmcsICJ3aWR0aCIsIEdfVFlQRV9TVFJJTkcsIHdzdHIsICJoZWlnaHQiLCBHX1RZUEVfU1RSSU5HLAorICAgICAgaHN0ciwgImNvbmZpZ3VyYXRpb24iLCBHX1RZUEVfU1RSSU5HLCBjb25maWd1cmF0aW9uLCAiZGVsaXZlcnktbWV0aG9kIiwKKyAgICAgIEdfVFlQRV9TVFJJTkcsICJpbmxpbmUiLAorICAgICAgLyogZG9uJ3Qgc2V0IHRoZSBvdGhlciBkZWZhdWx0cyAKKyAgICAgICAqLworICAgICAgTlVMTCk7CisgIGdfZnJlZSAod3N0cik7CisgIGdfZnJlZSAoaHN0cik7CisgIGdfZnJlZSAoY29uZmlndXJhdGlvbik7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK25vX2hlYWRlcnM6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHB0aGVvcmFwYXksICJmaW5pc2ggaGVhZGVycyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfdGhlb3JhX3BheV9wYXJzZV9pZCAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwgZ3VpbnQ4ICogZGF0YSwKKyAgICBndWludCBzaXplKQoreworICBHc3RSdHBUaGVvcmFQYXkgKnJ0cHRoZW9yYXBheTsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0LCBwaXhlbF9mb3JtYXQ7CisKKyAgcnRwdGhlb3JhcGF5ID0gR1NUX1JUUF9USEVPUkFfUEFZIChiYXNlcGF5bG9hZCk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHNpemUgPCA0MikpCisgICAgZ290byB0b29fc2hvcnQ7CisKKyAgaWYgKEdfVU5MSUtFTFkgKG1lbWNtcCAoZGF0YSwgIlwyMDB0aGVvcmEiLCA3KSkpCisgICAgZ290byBpbnZhbGlkX3N0YXJ0OworICBkYXRhICs9IDc7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGRhdGFbMF0gIT0gMykpCisgICAgZ290byBpbnZhbGlkX3ZlcnNpb247CisgIGlmIChHX1VOTElLRUxZIChkYXRhWzFdICE9IDIpKQorICAgIGdvdG8gaW52YWxpZF92ZXJzaW9uOworICBkYXRhICs9IDM7CisKKyAgd2lkdGggPSBHU1RfUkVBRF9VSU5UMTZfQkUgKGRhdGEpIDw8IDQ7CisgIGRhdGEgKz0gMjsKKyAgaGVpZ2h0ID0gR1NUX1JFQURfVUlOVDE2X0JFIChkYXRhKSA8PCA0OworICBkYXRhICs9IDI5OworCisgIHBpeGVsX2Zvcm1hdCA9IChHU1RfUkVBRF9VSU5UOCAoZGF0YSkgPj4gMykgJiAweDAzOworCisgIC8qIHN0b3JlIHZhbHVlcyAqLworICBydHB0aGVvcmFwYXktPnBpeGVsX2Zvcm1hdCA9IHBpeGVsX2Zvcm1hdDsKKyAgcnRwdGhlb3JhcGF5LT53aWR0aCA9IHdpZHRoOworICBydHB0aGVvcmFwYXktPmhlaWdodCA9IGhlaWdodDsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK3Rvb19zaG9ydDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChiYXNlcGF5bG9hZCwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwKKyAgICAgICAgKCJJZGVudGlmaWNhdGlvbiBwYWNrZXQgaXMgdG9vIHNob3J0LCBuZWVkIGF0IGxlYXN0IDQyLCBnb3QgJWQiLCBzaXplKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbnZhbGlkX3N0YXJ0OgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGJhc2VwYXlsb2FkLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIkludmFsaWQgaGVhZGVyIHN0YXJ0IGluIGlkZW50aWZpY2F0aW9uIHBhY2tldCIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfdmVyc2lvbjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChiYXNlcGF5bG9hZCwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJJbnZhbGlkIHZlcnNpb24iKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX3RoZW9yYV9wYXlfcGF5bG9hZF9idWZmZXIgKEdzdFJ0cFRoZW9yYVBheSAqIHJ0cHRoZW9yYXBheSwgZ3VpbnQ4IFREVCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIsIGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsCisgICAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uLCBndWludCBub3RfaW5fbGVuZ3RoKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludCBuZXdzaXplOworICBndWludCBwYWNrZXRfbGVuOworICBHc3RDbG9ja1RpbWUgbmV3ZHVyYXRpb247CisgIGdib29sZWFuIGZsdXNoOworICBndWludCBwbGVuOworICBndWludDggKnBwb3MsICpwYXlsb2FkOworICBnYm9vbGVhbiBmcmFnbWVudGVkOworICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisKKyAgLyogc2l6ZSBpbmNyZWFzZXMgd2l0aCBwYWNrZXQgbGVuZ3RoIGFuZCAyIGJ5dGVzIHNpemUgZWFkZXIuICovCisgIG5ld2R1cmF0aW9uID0gcnRwdGhlb3JhcGF5LT5wYXlsb2FkX2R1cmF0aW9uOworICBpZiAoZHVyYXRpb24gIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICBuZXdkdXJhdGlvbiArPSBkdXJhdGlvbjsKKworICBuZXdzaXplID0gcnRwdGhlb3JhcGF5LT5wYXlsb2FkX3BvcyArIDIgKyBzaXplOworICBwYWNrZXRfbGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYWNrZXRfbGVuIChuZXdzaXplLCAwLCAwKTsKKworICAvKiBjaGVjayBidWZmZXIgZmlsbGVkIGFnYWluc3QgbGVuZ3RoIGFuZCBtYXggbGF0ZW5jeSAqLworICBmbHVzaCA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX2lzX2ZpbGxlZCAoR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHJ0cHRoZW9yYXBheSksCisgICAgICBwYWNrZXRfbGVuLCBuZXdkdXJhdGlvbik7CisgIC8qIHdlIGNhbiBzdG9yZSB1cCB0byAxNSB0aGVvcmEgcGFja2V0cyBpbiBvbmUgUlRQIHBhY2tldC4gKi8KKyAgZmx1c2ggfD0gKHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9wa3RzID09IDE1KTsKKyAgLyogZmx1c2ggaWYgd2UgaGF2ZSBhIG5ldyBURFQgKi8KKyAgaWYgKHJ0cHRoZW9yYXBheS0+cGFja2V0KQorICAgIGZsdXNoIHw9IChydHB0aGVvcmFwYXktPnBheWxvYWRfVERUICE9IFREVCk7CisgIGlmIChmbHVzaCkKKyAgICByZXQgPSBnc3RfcnRwX3RoZW9yYV9wYXlfZmx1c2hfcGFja2V0IChydHB0aGVvcmFwYXkpOworCisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBkb25lOworCisgIC8qIGNyZWF0ZSBuZXcgcGFja2V0IGlmIHdlIG11c3QgKi8KKyAgaWYgKCFydHB0aGVvcmFwYXktPnBhY2tldCkgeworICAgIGdzdF9ydHBfdGhlb3JhX3BheV9pbml0X3BhY2tldCAocnRwdGhlb3JhcGF5LCBURFQsIHRpbWVzdGFtcCk7CisgIH0KKworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKHJ0cHRoZW9yYXBheS0+cGFja2V0LCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKyAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKTsKKyAgcHBvcyA9IHBheWxvYWQgKyBydHB0aGVvcmFwYXktPnBheWxvYWRfcG9zOworICBmcmFnbWVudGVkID0gRkFMU0U7CisKKyAgLyogcHV0IGJ1ZmZlciBpbiBwYWNrZXQsIGl0IGVpdGhlciBmaXRzIGNvbXBsZXRlbHkgb3IgbmVlZHMgdG8gYmUgZnJhZ21lbnRlZAorICAgKiBvdmVyIG11bHRpcGxlIFJUUCBwYWNrZXRzLiAqLworICBkbyB7CisgICAgcGxlbiA9IE1JTiAocnRwdGhlb3JhcGF5LT5wYXlsb2FkX2xlZnQgLSAyLCBzaXplKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHRoZW9yYXBheSwgImFwcGVuZCAldSBieXRlcyIsIHBsZW4pOworCisgICAgLyogZGF0YSBpcyBjb3BpZWQgaW4gdGhlIHBheWxvYWQgd2l0aCBhIDIgYnl0ZSBsZW5ndGggaGVhZGVyICovCisgICAgcHBvc1swXSA9ICgocGxlbiAtIG5vdF9pbl9sZW5ndGgpID4+IDgpICYgMHhmZjsKKyAgICBwcG9zWzFdID0gKChwbGVuIC0gbm90X2luX2xlbmd0aCkgJiAweGZmKTsKKyAgICBpZiAocGxlbikKKyAgICAgIG1lbWNweSAoJnBwb3NbMl0sIGRhdGEsIHBsZW4pOworCisgICAgaWYgKGJ1ZmZlcikgeworICAgICAgaWYgKCFydHB0aGVvcmFwYXktPnBhY2tldF9idWZmZXJzCisgICAgICAgICAgfHwgcnRwdGhlb3JhcGF5LT5wYWNrZXRfYnVmZmVycy0+ZGF0YSAhPSAoZ3BvaW50ZXIpIGJ1ZmZlcikKKyAgICAgICAgcnRwdGhlb3JhcGF5LT5wYWNrZXRfYnVmZmVycyA9CisgICAgICAgICAgICBnX2xpc3RfcHJlcGVuZCAocnRwdGhlb3JhcGF5LT5wYWNrZXRfYnVmZmVycywKKyAgICAgICAgICAgIGdzdF9idWZmZXJfcmVmIChidWZmZXIpKTsKKyAgICB9IGVsc2UgeworICAgICAgR0xpc3QgKmw7CisKKyAgICAgIGZvciAobCA9IHJ0cHRoZW9yYXBheS0+aGVhZGVyczsgbDsgbCA9IGwtPm5leHQpCisgICAgICAgIHJ0cHRoZW9yYXBheS0+cGFja2V0X2J1ZmZlcnMgPQorICAgICAgICAgICAgZ19saXN0X3ByZXBlbmQgKHJ0cHRoZW9yYXBheS0+cGFja2V0X2J1ZmZlcnMsCisgICAgICAgICAgICBnc3RfYnVmZmVyX3JlZiAobC0+ZGF0YSkpOworICAgIH0KKworICAgIC8qIG9ubHkgZmlyc3QgKG9ubHkpIGNvbmZpZ3VyYXRpb24gY3V0cyBsZW5ndGggZmllbGQgKi8KKyAgICAvKiBOT1RFOiBzcGVjIChpZiBhbnkpIGlzIG5vdCBjbGVhciBvbiB0aGlzIC4uLiAqLworICAgIG5vdF9pbl9sZW5ndGggPSAwOworCisgICAgc2l6ZSAtPSBwbGVuOworICAgIGRhdGEgKz0gcGxlbjsKKworICAgIHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9wb3MgKz0gcGxlbiArIDI7CisgICAgcnRwdGhlb3JhcGF5LT5wYXlsb2FkX2xlZnQgLT0gcGxlbiArIDI7CisKKyAgICBpZiAoZnJhZ21lbnRlZCkgeworICAgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgLyogbGFzdCBmcmFnbWVudCwgc2V0IEYgdG8gMHgzLiAqLworICAgICAgICBydHB0aGVvcmFwYXktPnBheWxvYWRfRiA9IDB4MzsKKyAgICAgIGVsc2UKKyAgICAgICAgLyogZnJhZ21lbnQgY29udGludWVzLCBzZXQgRiB0byAweDIuICovCisgICAgICAgIHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9GID0gMHgyOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgLyogZnJhZ21lbnRlZCBwYWNrZXQgc3RhcnRzLCBzZXQgRiB0byAweDEsIG1hcmsgb3Vyc2VsdmVzIGFzCisgICAgICAgICAqIGZyYWdtZW50ZWQuICovCisgICAgICAgIHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9GID0gMHgxOworICAgICAgICBmcmFnbWVudGVkID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGZyYWdtZW50ZWQpIHsKKyAgICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgICAgIC8qIGZyYWdtZW50ZWQgcGFja2V0cyBhcmUgYWx3YXlzIGZsdXNoZWQgYW5kIGhhdmUgcHRrcyBvZiAwICovCisgICAgICBydHB0aGVvcmFwYXktPnBheWxvYWRfcGt0cyA9IDA7CisgICAgICByZXQgPSBnc3RfcnRwX3RoZW9yYV9wYXlfZmx1c2hfcGFja2V0IChydHB0aGVvcmFwYXkpOworCisgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgLyogc3RhcnQgbmV3IHBhY2tldCBhbmQgZ2V0IHBvaW50ZXJzLiBURFQgc3RheXMgdGhlIHNhbWUuICovCisgICAgICAgIGdzdF9ydHBfdGhlb3JhX3BheV9pbml0X3BhY2tldCAocnRwdGhlb3JhcGF5LAorICAgICAgICAgICAgcnRwdGhlb3JhcGF5LT5wYXlsb2FkX1REVCwgdGltZXN0YW1wKTsKKyAgICAgICAgZ3N0X3J0cF9idWZmZXJfbWFwIChydHB0aGVvcmFwYXktPnBhY2tldCwgR1NUX01BUF9XUklURSwgJnJ0cCk7CisgICAgICAgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisgICAgICAgIHBwb3MgPSBwYXlsb2FkICsgcnRwdGhlb3JhcGF5LT5wYXlsb2FkX3BvczsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogdW5mcmFnbWVudGVkIHBhY2tldCwgdXBkYXRlIHN0YXRzIGZvciBuZXh0IHBhY2tldCwgc2l6ZSA9PSAwIGFuZCB3ZQorICAgICAgICogZXhpdCB0aGUgd2hpbGUgbG9vcCAqLworICAgICAgcnRwdGhlb3JhcGF5LT5wYXlsb2FkX3BrdHMrKzsKKyAgICAgIGlmIChkdXJhdGlvbiAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgICAgICBydHB0aGVvcmFwYXktPnBheWxvYWRfZHVyYXRpb24gKz0gZHVyYXRpb247CisgICAgfQorICB9IHdoaWxlIChzaXplICYmIHJldCA9PSBHU1RfRkxPV19PSyk7CisKKyAgaWYgKHJ0cC5idWZmZXIpCisgICAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworZG9uZToKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF90aGVvcmFfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSdHBUaGVvcmFQYXkgKnJ0cHRoZW9yYXBheTsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdE1hcEluZm8gbWFwOworICBnc2l6ZSBzaXplOworICBndWludDggKmRhdGE7CisgIEdzdENsb2NrVGltZSBkdXJhdGlvbiwgdGltZXN0YW1wOworICBndWludDggVERUOworICBnYm9vbGVhbiBrZXlmcmFtZSA9IEZBTFNFOworCisgIHJ0cHRoZW9yYXBheSA9IEdTVF9SVFBfVEhFT1JBX1BBWSAoYmFzZXBheWxvYWQpOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKyAgc2l6ZSA9IG1hcC5zaXplOworICBkdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcik7CisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHRoZW9yYXBheSwgInNpemUgJSIgR19HU0laRV9GT1JNQVQKKyAgICAgICIsIGR1cmF0aW9uICUiIEdTVF9USU1FX0ZPUk1BVCwgc2l6ZSwgR1NUX1RJTUVfQVJHUyAoZHVyYXRpb24pKTsKKworICAvKiBmaW5kIHBhY2tldCB0eXBlICovCisgIGlmIChzaXplID09IDApIHsKKyAgICBURFQgPSAwOworICAgIGtleWZyYW1lID0gRkFMU0U7CisgIH0gZWxzZSBpZiAoZGF0YVswXSAmIDB4ODApIHsKKyAgICAvKiBoZWFkZXIgKi8KKyAgICBpZiAoZGF0YVswXSA9PSAweDgwKSB7CisgICAgICAvKiBpZGVudGlmaWNhdGlvbiwgd2UgbmVlZCB0byBwYXJzZSB0aGlzIGluIG9yZGVyIHRvIGdldCB0aGUgY2xvY2sgcmF0ZS4KKyAgICAgICAqLworICAgICAgaWYgKEdfVU5MSUtFTFkgKCFnc3RfcnRwX3RoZW9yYV9wYXlfcGFyc2VfaWQgKGJhc2VwYXlsb2FkLCBkYXRhLCBzaXplKSkpCisgICAgICAgIGdvdG8gcGFyc2VfaWRfZmFpbGVkOworICAgICAgVERUID0gMTsKKyAgICB9IGVsc2UgaWYgKGRhdGFbMF0gPT0gMHg4MSkgeworICAgICAgLyogY29tbWVudCAqLworICAgICAgVERUID0gMjsKKyAgICB9IGVsc2UgaWYgKGRhdGFbMF0gPT0gMHg4MikgeworICAgICAgLyogc2V0dXAgKi8KKyAgICAgIFREVCA9IDE7CisgICAgfSBlbHNlCisgICAgICBnb3RvIHVua25vd25faGVhZGVyOworICB9IGVsc2UgeworICAgIC8qIGRhdGEgKi8KKyAgICBURFQgPSAwOworICAgIGtleWZyYW1lID0gKChkYXRhWzBdICYgMHg0MCkgPT0gMCk7CisgIH0KKworICAvKiB3ZSBuZWVkIHRvIGNvbGxlY3QgdGhlIGhlYWRlcnMgYW5kIGNvbnN0cnVjdCBhIGNvbmZpZyBzdHJpbmcgZnJvbSB0aGVtICovCisgIGlmIChURFQgIT0gMCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHRoZW9yYXBheSwgImNvbGxlY3RpbmcgaGVhZGVyLCBidWZmZXIgJXAiLCBidWZmZXIpOworICAgIC8qIGFwcGVuZCBoZWFkZXIgdG8gdGhlIGxpc3Qgb2YgaGVhZGVycyAqLworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgcnRwdGhlb3JhcGF5LT5oZWFkZXJzID0gZ19saXN0X2FwcGVuZCAocnRwdGhlb3JhcGF5LT5oZWFkZXJzLCBidWZmZXIpOworICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgIGdvdG8gZG9uZTsKKyAgfSBlbHNlIGlmIChydHB0aGVvcmFwYXktPmhlYWRlcnMgJiYgcnRwdGhlb3JhcGF5LT5uZWVkX2hlYWRlcnMpIHsKKyAgICBpZiAoIWdzdF9ydHBfdGhlb3JhX3BheV9maW5pc2hfaGVhZGVycyAoYmFzZXBheWxvYWQpKQorICAgICAgZ290byBoZWFkZXJfZXJyb3I7CisgIH0KKworICAvKiB0aGVyZSBpcyBhIGNvbmZpZyByZXF1ZXN0LCBzZWUgaWYgd2UgbmVlZCB0byBpbnNlcnQgaXQgKi8KKyAgaWYgKGtleWZyYW1lICYmIChydHB0aGVvcmFwYXktPmNvbmZpZ19pbnRlcnZhbCA+IDApICYmCisgICAgICBydHB0aGVvcmFwYXktPmNvbmZpZ19kYXRhKSB7CisgICAgZ2Jvb2xlYW4gc2VuZF9jb25maWcgPSBGQUxTRTsKKworICAgIGlmIChydHB0aGVvcmFwYXktPmxhc3RfY29uZmlnICE9IC0xKSB7CisgICAgICBndWludDY0IGRpZmY7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHB0aGVvcmFwYXksCisgICAgICAgICAgIm5vdyAlIiBHU1RfVElNRV9GT1JNQVQgIiwgbGFzdCBWT1AtSSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSwgR1NUX1RJTUVfQVJHUyAocnRwdGhlb3JhcGF5LT5sYXN0X2NvbmZpZykpOworCisgICAgICAvKiBjYWxjdWxhdGUgZGlmZiBiZXR3ZWVuIGxhc3QgY29uZmlnIGluIG1pbGxpc2Vjb25kcyAqLworICAgICAgaWYgKHRpbWVzdGFtcCA+IHJ0cHRoZW9yYXBheS0+bGFzdF9jb25maWcpIHsKKyAgICAgICAgZGlmZiA9IHRpbWVzdGFtcCAtIHJ0cHRoZW9yYXBheS0+bGFzdF9jb25maWc7CisgICAgICB9IGVsc2UgeworICAgICAgICBkaWZmID0gMDsKKyAgICAgIH0KKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwdGhlb3JhcGF5LAorICAgICAgICAgICJpbnRlcnZhbCBzaW5jZSBsYXN0IGNvbmZpZyAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGRpZmYpKTsKKworICAgICAgLyogYmlnZ2VyIHRoYW4gaW50ZXJ2YWwsIHF1ZXVlIGNvbmZpZyAqLworICAgICAgLyogRklYTUUgc2hvdWxkIGNvbnZlcnQgdGltZXN0YW1wcyB0byBydW5uaW5nIHRpbWUgKi8KKyAgICAgIGlmIChHU1RfVElNRV9BU19TRUNPTkRTIChkaWZmKSA+PSBydHB0aGVvcmFwYXktPmNvbmZpZ19pbnRlcnZhbCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHB0aGVvcmFwYXksICJ0aW1lIHRvIHNlbmQgY29uZmlnIik7CisgICAgICAgIHNlbmRfY29uZmlnID0gVFJVRTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogbm8ga25vd24gcHJldmlvdXMgY29uZmlnIHRpbWUsIHNlbmQgbm93ICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHB0aGVvcmFwYXksICJubyBwcmV2aW91cyBjb25maWcgdGltZSwgc2VuZCBub3ciKTsKKyAgICAgIHNlbmRfY29uZmlnID0gVFJVRTsKKyAgICB9CisKKyAgICBpZiAoc2VuZF9jb25maWcpIHsKKyAgICAgIC8qIHdlIG5lZWQgdG8gc2VuZCBjb25maWcgbm93IGZpcnN0ICovCisgICAgICAvKiBkaWZmZXJlbnQgVERUIHR5cGUgZm9yY2VzIGZsdXNoICovCisgICAgICBnc3RfcnRwX3RoZW9yYV9wYXlfcGF5bG9hZF9idWZmZXIgKHJ0cHRoZW9yYXBheSwgMSwKKyAgICAgICAgICBOVUxMLCBydHB0aGVvcmFwYXktPmNvbmZpZ19kYXRhLCBydHB0aGVvcmFwYXktPmNvbmZpZ19zaXplLAorICAgICAgICAgIHRpbWVzdGFtcCwgR1NUX0NMT0NLX1RJTUVfTk9ORSwgcnRwdGhlb3JhcGF5LT5jb25maWdfZXh0cmFfbGVuKTsKKworICAgICAgaWYgKHRpbWVzdGFtcCAhPSAtMSkgeworICAgICAgICBydHB0aGVvcmFwYXktPmxhc3RfY29uZmlnID0gdGltZXN0YW1wOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldCA9CisgICAgICBnc3RfcnRwX3RoZW9yYV9wYXlfcGF5bG9hZF9idWZmZXIgKHJ0cHRoZW9yYXBheSwgVERULCBidWZmZXIsIGRhdGEsIHNpemUsCisgICAgICB0aW1lc3RhbXAsIGR1cmF0aW9uLCAwKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCitkb25lOgorICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworcGFyc2VfaWRfZmFpbGVkOgorICB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQordW5rbm93bl9oZWFkZXI6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHB0aGVvcmFwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiSWdub3JpbmcgdW5rbm93biBoZWFkZXIgcmVjZWl2ZWQiKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQoraGVhZGVyX2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwdGhlb3JhcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIkVycm9yIGluaXRpYWxpemluZyBoZWFkZXIgY29uZmlnIikpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3RoZW9yYV9wYXlfc2lua19ldmVudCAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBUaGVvcmFQYXkgKnJ0cHRoZW9yYXBheSA9IEdTVF9SVFBfVEhFT1JBX1BBWSAocGF5bG9hZCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9ydHBfdGhlb3JhX3BheV9jbGVhcl9wYWNrZXQgKHJ0cHRoZW9yYXBheSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgLyogZmFsc2UgdG8gbGV0IHBhcmVudCBoYW5kbGUgZXZlbnQgYXMgd2VsbCAqLworICByZXR1cm4gR1NUX1JUUF9CQVNFX1BBWUxPQURfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNpbmtfZXZlbnQgKHBheWxvYWQsIGV2ZW50KTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX3RoZW9yYV9wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RSdHBUaGVvcmFQYXkgKnJ0cHRoZW9yYXBheTsKKworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRwdGhlb3JhcGF5ID0gR1NUX1JUUF9USEVPUkFfUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3J0cF90aGVvcmFfcGF5X2NsZWFudXAgKHJ0cHRoZW9yYXBheSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdGhlb3JhX3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwVGhlb3JhUGF5ICpydHB0aGVvcmFwYXk7CisKKyAgcnRwdGhlb3JhcGF5ID0gR1NUX1JUUF9USEVPUkFfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DT05GSUdfSU5URVJWQUw6CisgICAgICBydHB0aGVvcmFwYXktPmNvbmZpZ19pbnRlcnZhbCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF90aGVvcmFfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSdHBUaGVvcmFQYXkgKnJ0cHRoZW9yYXBheTsKKworICBydHB0aGVvcmFwYXkgPSBHU1RfUlRQX1RIRU9SQV9QQVkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0NPTkZJR19JTlRFUlZBTDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBydHB0aGVvcmFwYXktPmNvbmZpZ19pbnRlcnZhbCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfdGhlb3JhX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHRoZW9yYXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9USEVPUkFfUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmggYi9nc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYmMwMWQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5oCkBAIC0wLDAgKzEsODYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9USEVPUkFfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfVEhFT1JBX1BBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VwYXlsb2FkLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1RIRU9SQV9QQVkgXAorICAoZ3N0X3J0cF90aGVvcmFfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfVEhFT1JBX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9USEVPUkFfUEFZLEdzdFJ0cFRoZW9yYVBheSkpCisjZGVmaW5lIEdTVF9SVFBfVEhFT1JBX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfVEhFT1JBX1BBWSxHc3RSdHBUaGVvcmFQYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfVEhFT1JBX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9USEVPUkFfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9USEVPUkFfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9USEVPUkFfUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFRoZW9yYVBheSBHc3RSdHBUaGVvcmFQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwVGhlb3JhUGF5Q2xhc3MgR3N0UnRwVGhlb3JhUGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwVGhlb3JhUGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkIHBheWxvYWQ7CisKKyAgLyogdGhlIGhlYWRlcnMgKi8KKyAgZ2Jvb2xlYW4gICAgICBuZWVkX2hlYWRlcnM7CisgIEdMaXN0ICAgICAgICAqaGVhZGVyczsKKworICAvKiBxdWV1ZXMgb2YgYnVmZmVycyBhbG9uZyB3aXRoIHNvbWUgc3RhdHMuICovCisgIEdzdEJ1ZmZlciAgICAqcGFja2V0OworICBHTGlzdCAgICAgICAgKnBhY2tldF9idWZmZXJzOworICBndWludCAgICAgICAgIHBheWxvYWRfcG9zOworICBndWludCAgICAgICAgIHBheWxvYWRfbGVmdDsKKyAgZ3VpbnQzMiAgICAgICBwYXlsb2FkX2lkZW50OworICBndWludDggICAgICAgIHBheWxvYWRfRjsKKyAgZ3VpbnQ4ICAgICAgICBwYXlsb2FkX1REVDsKKyAgZ3VpbnQgICAgICAgICBwYXlsb2FkX3BrdHM7CisgIEdzdENsb2NrVGltZSAgcGF5bG9hZF90aW1lc3RhbXA7CisgIEdzdENsb2NrVGltZSAgcGF5bG9hZF9kdXJhdGlvbjsKKworICAvKiBjb25maWcgKHJlLXNlbmRpbmcpICovCisgIGd1aW50OCAgICAgICAqY29uZmlnX2RhdGE7CisgIGd1aW50ICAgICAgICAgY29uZmlnX3NpemU7CisgIGd1aW50ICAgICAgICAgY29uZmlnX2V4dHJhX2xlbjsKKyAgZ3VpbnQgICAgICAgICBjb25maWdfaW50ZXJ2YWw7CisgIEdzdENsb2NrVGltZSAgbGFzdF9jb25maWc7CisKKyAgZ2ludCAgICAgICAgICBwaXhlbF9mb3JtYXQ7CisgIGdpbnQgICAgICAgICAgd2lkdGg7CisgIGdpbnQgICAgICAgICAgaGVpZ2h0OworfTsKKworc3RydWN0IF9Hc3RSdHBUaGVvcmFQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfdGhlb3JhX3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfdGhlb3JhX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9USEVPUkFfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHB1dGlscy5jIGIvZ3N0L3J0cC9nc3RydHB1dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NGQxYjMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHV0aWxzLmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDE1IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQ7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHUXVhcmsgY29weV90YWc7Cit9IENvcHlNZXRhRGF0YTsKKworR1F1YXJrIHJ0cF9xdWFya19tZXRhX3RhZ192aWRlbzsKK0dRdWFyayBydHBfcXVhcmtfbWV0YV90YWdfYXVkaW87CisKK3N0YXRpYyBnYm9vbGVhbgorZm9yZWFjaF9tZXRhZGF0YV9jb3B5IChHc3RCdWZmZXIgKiBpbmJ1ZiwgR3N0TWV0YSAqKiBtZXRhLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIENvcHlNZXRhRGF0YSAqZGF0YSA9IHVzZXJfZGF0YTsKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IGRhdGEtPmVsZW1lbnQ7CisgIEdzdEJ1ZmZlciAqb3V0YnVmID0gZGF0YS0+b3V0YnVmOworICBHUXVhcmsgY29weV90YWcgPSBkYXRhLT5jb3B5X3RhZzsKKyAgY29uc3QgR3N0TWV0YUluZm8gKmluZm8gPSAoKm1ldGEpLT5pbmZvOworICBjb25zdCBnY2hhciAqY29uc3QgKnRhZ3MgPSBnc3RfbWV0YV9hcGlfdHlwZV9nZXRfdGFncyAoaW5mby0+YXBpKTsKKworICBpZiAoIXRhZ3MgfHwgKGNvcHlfdGFnICE9IDAgJiYgZ19zdHJ2X2xlbmd0aCAoKGdjaGFyICoqKSB0YWdzKSA9PSAxCisgICAgICAgICAgJiYgZ3N0X21ldGFfYXBpX3R5cGVfaGFzX3RhZyAoaW5mby0+YXBpLCBjb3B5X3RhZykpKSB7CisgICAgR3N0TWV0YVRyYW5zZm9ybUNvcHkgY29weV9kYXRhID0geyBGQUxTRSwgMCwgLTEgfTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChlbGVtZW50LCAiY29weSBtZXRhZGF0YSAlcyIsIGdfdHlwZV9uYW1lIChpbmZvLT5hcGkpKTsKKyAgICAvKiBzaW1wbHkgY29weSB0aGVuICovCisgICAgaW5mby0+dHJhbnNmb3JtX2Z1bmMgKG91dGJ1ZiwgKm1ldGEsIGluYnVmLAorICAgICAgICBfZ3N0X21ldGFfdHJhbnNmb3JtX2NvcHksICZjb3B5X2RhdGEpOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVsZW1lbnQsICJub3QgY29weWluZyBtZXRhZGF0YSAlcyIsCisgICAgICAgIGdfdHlwZV9uYW1lIChpbmZvLT5hcGkpKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBUT0RPOiBTaG91bGQgcHJvYmFibHkgbWFrZSBjb3B5X3RhZyBhbiBhcnJheSBhdCBzb21lIHBvaW50ICovCit2b2lkCitnc3RfcnRwX2NvcHlfbWV0YSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEJ1ZmZlciAqIG91dGJ1ZiwgR3N0QnVmZmVyICogaW5idWYsCisgICAgR1F1YXJrIGNvcHlfdGFnKQoreworICBDb3B5TWV0YURhdGEgZGF0YSA9IHsgZWxlbWVudCwgb3V0YnVmLCBjb3B5X3RhZyB9OworCisgIGdzdF9idWZmZXJfZm9yZWFjaF9tZXRhIChpbmJ1ZiwgZm9yZWFjaF9tZXRhZGF0YV9jb3B5LCAmZGF0YSk7Cit9CisKK3ZvaWQKK2dzdF9ydHBfY29weV92aWRlb19tZXRhIChncG9pbnRlciBlbGVtZW50LCBHc3RCdWZmZXIgKiBvdXRidWYsCisgICAgR3N0QnVmZmVyICogaW5idWYpCit7CisgIGdzdF9ydHBfY29weV9tZXRhIChlbGVtZW50LCBvdXRidWYsIGluYnVmLCBydHBfcXVhcmtfbWV0YV90YWdfdmlkZW8pOworfQorCit2b2lkCitnc3RfcnRwX2NvcHlfYXVkaW9fbWV0YSAoZ3BvaW50ZXIgZWxlbWVudCwgR3N0QnVmZmVyICogb3V0YnVmLAorICAgIEdzdEJ1ZmZlciAqIGluYnVmKQoreworICBnc3RfcnRwX2NvcHlfbWV0YSAoZWxlbWVudCwgb3V0YnVmLCBpbmJ1ZiwgcnRwX3F1YXJrX21ldGFfdGFnX2F1ZGlvKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudDsKKyAgR1F1YXJrIGtlZXBfdGFnOworfSBEcm9wTWV0YURhdGE7CisKK3N0YXRpYyBnYm9vbGVhbgorZm9yZWFjaF9tZXRhZGF0YV9kcm9wIChHc3RCdWZmZXIgKiBpbmJ1ZiwgR3N0TWV0YSAqKiBtZXRhLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIERyb3BNZXRhRGF0YSAqZGF0YSA9IHVzZXJfZGF0YTsKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IGRhdGEtPmVsZW1lbnQ7CisgIEdRdWFyayBrZWVwX3RhZyA9IGRhdGEtPmtlZXBfdGFnOworICBjb25zdCBHc3RNZXRhSW5mbyAqaW5mbyA9ICgqbWV0YSktPmluZm87CisgIGNvbnN0IGdjaGFyICpjb25zdCAqdGFncyA9IGdzdF9tZXRhX2FwaV90eXBlX2dldF90YWdzIChpbmZvLT5hcGkpOworCisgIGlmICghdGFncyB8fCAoa2VlcF90YWcgIT0gMCAmJiBnX3N0cnZfbGVuZ3RoICgoZ2NoYXIgKiopIHRhZ3MpID09IDEKKyAgICAgICAgICAmJiBnc3RfbWV0YV9hcGlfdHlwZV9oYXNfdGFnIChpbmZvLT5hcGksIGtlZXBfdGFnKSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChlbGVtZW50LCAia2VlcGluZyBtZXRhZGF0YSAlcyIsIGdfdHlwZV9uYW1lIChpbmZvLT5hcGkpKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChlbGVtZW50LCAiZHJvcHBpbmcgbWV0YWRhdGEgJXMiLCBnX3R5cGVfbmFtZSAoaW5mby0+YXBpKSk7CisgICAgKm1ldGEgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFRPRE86IFNob3VsZCBwcm9iYWJseSBtYWtlIGtlZXBfdGFnIGFuIGFycmF5IGF0IHNvbWUgcG9pbnQgKi8KK3ZvaWQKK2dzdF9ydHBfZHJvcF9tZXRhIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0QnVmZmVyICogYnVmLCBHUXVhcmsga2VlcF90YWcpCit7CisgIERyb3BNZXRhRGF0YSBkYXRhID0geyBlbGVtZW50LCBrZWVwX3RhZyB9OworCisgIGdzdF9idWZmZXJfZm9yZWFjaF9tZXRhIChidWYsIGZvcmVhY2hfbWV0YWRhdGFfZHJvcCwgJmRhdGEpOworfQorCit2b2lkCitnc3RfcnRwX2Ryb3Bfbm9uX2F1ZGlvX21ldGEgKGdwb2ludGVyIGVsZW1lbnQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgZ3N0X3J0cF9kcm9wX21ldGEgKGVsZW1lbnQsIGJ1ZiwgcnRwX3F1YXJrX21ldGFfdGFnX2F1ZGlvKTsKK30KKwordm9pZAorZ3N0X3J0cF9kcm9wX25vbl92aWRlb19tZXRhIChncG9pbnRlciBlbGVtZW50LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIGdzdF9ydHBfZHJvcF9tZXRhIChlbGVtZW50LCBidWYsIHJ0cF9xdWFya19tZXRhX3RhZ192aWRlbyk7Cit9CisKKy8qIFN0b2xlbiBmcm9tIGJhZC9nc3QvbXBlZ3RzZGVtdXgvcGF5bG9hZGVyX3BhcnNlcnMuYyAqLworLyogdmFyaWFibGUgbGVuZ3RoIEV4cC1Hb2xvbWIgcGFyc2luZyBhY2NvcmRpbmcgdG8gSC4yNjUgc3BlYyBzZWN0aW9uIDkuMiovCitnYm9vbGVhbgorZ3N0X3J0cF9yZWFkX2dvbG9tYiAoR3N0Qml0UmVhZGVyICogYnIsIGd1aW50MzIgKiB2YWx1ZSkKK3sKKyAgZ3VpbnQ4IGIsIGxlYWRpbmdfemVyb3MgPSAtMTsKKyAgKnZhbHVlID0gMTsKKworICBmb3IgKGIgPSAwOyAhYjsgbGVhZGluZ196ZXJvcysrKSB7CisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoYnIsICZiLCAxKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAqdmFsdWUgKj0gMjsKKyAgfQorCisgICp2YWx1ZSA9ICgqdmFsdWUgPj4gMSkgLSAxOworICBpZiAobGVhZGluZ196ZXJvcyA+IDApIHsKKyAgICBndWludDMyIHRtcCA9IDA7CisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MzIgKGJyLCAmdG1wLCBsZWFkaW5nX3plcm9zKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAqdmFsdWUgKz0gdG1wOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHV0aWxzLmggYi9nc3QvcnRwL2dzdHJ0cHV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxOTVmMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwdXRpbHMuaApAQCAtMCwwICsxLDU0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxNSBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1VUSUxTX0hfXworI2RlZmluZSBfX0dTVF9SVFBfVVRJTFNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Yml0cmVhZGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworR19HTlVDX0lOVEVSTkFMCit2b2lkIGdzdF9ydHBfY29weV9tZXRhIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0QnVmZmVyICpvdXRidWYsIEdzdEJ1ZmZlciAqaW5idWYsIEdRdWFyayBjb3B5X3RhZyk7CisKK0dfR05VQ19JTlRFUk5BTAordm9pZCBnc3RfcnRwX2NvcHlfYXVkaW9fbWV0YSAoZ3BvaW50ZXIgZWxlbWVudCwgR3N0QnVmZmVyICpvdXRidWYsIEdzdEJ1ZmZlciAqaW5idWYpOworCitHX0dOVUNfSU5URVJOQUwKK3ZvaWQgZ3N0X3J0cF9jb3B5X3ZpZGVvX21ldGEgKGdwb2ludGVyIGVsZW1lbnQsIEdzdEJ1ZmZlciAqb3V0YnVmLCBHc3RCdWZmZXIgKmluYnVmKTsKKworR19HTlVDX0lOVEVSTkFMCit2b2lkIGdzdF9ydHBfZHJvcF9tZXRhIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0QnVmZmVyICpidWYsIEdRdWFyayBrZWVwX3RhZyk7CisKK0dfR05VQ19JTlRFUk5BTAordm9pZCBnc3RfcnRwX2Ryb3Bfbm9uX2F1ZGlvX21ldGEgKGdwb2ludGVyIGVsZW1lbnQsIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK0dfR05VQ19JTlRFUk5BTAordm9pZCBnc3RfcnRwX2Ryb3Bfbm9uX3ZpZGVvX21ldGEgKGdwb2ludGVyIGVsZW1lbnQsIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK0dfR05VQ19JTlRFUk5BTAorZ2Jvb2xlYW4gZ3N0X3J0cF9yZWFkX2dvbG9tYiAoR3N0Qml0UmVhZGVyICogYnIsIGd1aW50MzIgKiB2YWx1ZSk7CisKK0dfR05VQ19JTlRFUk5BTCBleHRlcm4gR1F1YXJrIHJ0cF9xdWFya19tZXRhX3RhZ192aWRlbzsKK0dfR05VQ19JTlRFUk5BTCBleHRlcm4gR1F1YXJrIHJ0cF9xdWFya19tZXRhX3RhZ19hdWRpbzsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9VVElMU19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjI3NTBhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jCkBAIC0wLDAgKzEsNjg4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnc3RydHB2b3JiaXNkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cHZvcmJpc2RlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHB2b3JiaXNkZXBheV9kZWJ1ZykKKworLyogcmVmZXJlbmNlczoKKyAqIGh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzUyMTUudHh0CisgKi8KKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfdm9yYmlzX2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgWzEsIE1BWCBdLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJWT1JCSVNcIiIKKyAgICAgICAgLyogQWxsIHJlcXVpcmVkIHBhcmFtZXRlcnMgCisgICAgICAgICAqCisgICAgICAgICAqICJlbmNvZGluZy1wYXJhbXMgPSAoc3RyaW5nKSA8bnVtIGNoYW5uZWxzPiIKKyAgICAgICAgICogImNvbmZpZ3VyYXRpb24gPSAoc3RyaW5nKSBBTlkiIAorICAgICAgICAgKi8KKyAgICApCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfdm9yYmlzX2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC12b3JiaXMiKQorICAgICk7CisKKyNkZWZpbmUgZ3N0X3J0cF92b3JiaXNfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwVm9yYmlzRGVwYXksIGdzdF9ydHBfdm9yYmlzX2RlcGF5LAorICAgIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3ZvcmJpc19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfdm9yYmlzX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF92b3JiaXNfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF92b3JiaXNfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdm9yYmlzX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cFZvcmJpc0RlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF92b3JiaXNfZGVwYXlfZmluYWxpemU7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3J0cF92b3JiaXNfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfdm9yYmlzX2RlcGF5X3Byb2Nlc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF92b3JiaXNfZGVwYXlfc2V0Y2FwczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3ZvcmJpc19kZXBheV9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF92b3JiaXNfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBWb3JiaXMgZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIFZvcmJpcyBBdWRpbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgNTIxNSkiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cHZvcmJpc2RlcGF5X2RlYnVnLCAicnRwdm9yYmlzZGVwYXkiLCAwLAorICAgICAgIlZvcmJpcyBSVFAgRGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdm9yYmlzX2RlcGF5X2luaXQgKEdzdFJ0cFZvcmJpc0RlcGF5ICogcnRwdm9yYmlzZGVwYXkpCit7CisgIHJ0cHZvcmJpc2RlcGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9jb25maWcgKEdzdFJ0cFZvcmJpc0NvbmZpZyAqIGNvbmYpCit7CisgIGdfbGlzdF9mcmVlX2Z1bGwgKGNvbmYtPmhlYWRlcnMsIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgIGdfZnJlZSAoY29uZik7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2luZGVudHMgKEdzdFJ0cFZvcmJpc0RlcGF5ICogcnRwdm9yYmlzZGVwYXkpCit7CisgIGdfbGlzdF9mcmVlX2Z1bGwgKHJ0cHZvcmJpc2RlcGF5LT5jb25maWdzLCAoR0Rlc3Ryb3lOb3RpZnkpIGZyZWVfY29uZmlnKTsKKyAgcnRwdm9yYmlzZGVwYXktPmNvbmZpZ3MgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF92b3JiaXNfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cFZvcmJpc0RlcGF5ICpydHB2b3JiaXNkZXBheSA9IEdTVF9SVFBfVk9SQklTX0RFUEFZIChvYmplY3QpOworCisgIGdfb2JqZWN0X3VucmVmIChydHB2b3JiaXNkZXBheS0+YWRhcHRlcik7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCisvKiB0YWtlcyBvd25lcnNoaXAgb2YgY29uZmJ1ZiAqLworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3ZvcmJpc19kZXBheV9wYXJzZV9jb25maWd1cmF0aW9uIChHc3RSdHBWb3JiaXNEZXBheSAqIHJ0cHZvcmJpc2RlcGF5LAorICAgIEdzdEJ1ZmZlciAqIGNvbmZidWYpCit7CisgIEdzdEJ1ZmZlciAqYnVmOworICBndWludDMyIG51bV9oZWFkZXJzOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ4ICpkYXRhOworICBnc2l6ZSBzaXplOworICBndWludCBvZmZzZXQ7CisgIGdpbnQgaSwgajsKKworICBnc3RfYnVmZmVyX21hcCAoY29uZmJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworICBzaXplID0gbWFwLnNpemU7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwdm9yYmlzZGVwYXksICJjb25maWcgc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCwgc2l6ZSk7CisKKyAgLyogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBwYWNrZWQgaGVhZGVycyAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2VkIGhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2VkIGhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICovCisgIGlmIChzaXplIDwgNCkKKyAgICBnb3RvIHRvb19zbWFsbDsKKworICBudW1faGVhZGVycyA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoZGF0YSk7CisgIHNpemUgLT0gNDsKKyAgZGF0YSArPSA0OworICBvZmZzZXQgPSA0OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHZvcmJpc2RlcGF5LCAiaGF2ZSAldSBoZWFkZXJzIiwgbnVtX2hlYWRlcnMpOworCisgIC8qICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICBJZGVudCAgICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgIHwgbi4gb2YgaGVhZGVycyB8ICAgIGxlbmd0aDEgICAgfCAgICBsZW5ndGgyICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgIHwgICAgICAgICAgICAgSWRlbnRpZmljYXRpb24gSGVhZGVyICAgICAgICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgIHwgICAgICAgICBDb21tZW50IEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50IEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dXAgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgICAgICAgICAgICAgU2V0dXAgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICovCisgIGZvciAoaSA9IDA7IGkgPCBudW1faGVhZGVyczsgaSsrKSB7CisgICAgZ3VpbnQzMiBpZGVudDsKKyAgICBndWludDE2IGxlbmd0aDsKKyAgICBndWludDggbl9oZWFkZXJzLCBiOworICAgIEdzdFJ0cFZvcmJpc0NvbmZpZyAqY29uZjsKKyAgICBndWludCAqaF9zaXplczsKKyAgICBndWludCBleHRyYSA9IDE7CisKKyAgICBpZiAoc2l6ZSA8IDYpCisgICAgICBnb3RvIHRvb19zbWFsbDsKKworICAgIGlkZW50ID0gKGRhdGFbMF0gPDwgMTYpIHwgKGRhdGFbMV0gPDwgOCkgfCBkYXRhWzJdOworICAgIGxlbmd0aCA9IChkYXRhWzNdIDw8IDgpIHwgZGF0YVs0XTsKKyAgICBuX2hlYWRlcnMgPSBkYXRhWzVdOworICAgIHNpemUgLT0gNjsKKyAgICBkYXRhICs9IDY7CisgICAgb2Zmc2V0ICs9IDY7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHB2b3JiaXNkZXBheSwKKyAgICAgICAgImhlYWRlciAlZCwgaWRlbnQgMHglMDh4LCBsZW5ndGggJXUsIGxlZnQgJSIgR19HU0laRV9GT1JNQVQsIGksIGlkZW50LAorICAgICAgICBsZW5ndGgsIHNpemUpOworCisgICAgLyogRklYTUUgY2hlY2sgaWYgd2UgYWxyZWFkeSBnb3QgdGhpcyBpZGVudCAqLworCisgICAgLyogbGVuZ3RoIG1pZ2h0IGFsc28gaW5jbHVkZSBjb3VudCBvZiBmb2xsb3dpbmcgc2l6ZSBmaWVsZHMgKi8KKyAgICBpZiAoc2l6ZSA8IGxlbmd0aCAmJiBzaXplICsgMSAhPSBsZW5ndGgpCisgICAgICBnb3RvIHRvb19zbWFsbDsKKworICAgIC8qIHJlYWQgaGVhZGVyIHNpemVzIHdlIHJlYWQgMiBzaXplcywgdGhlIHRoaXJkIHNpemUgKGZvciB3aGljaCB3ZSBhbGxvY2F0ZQorICAgICAqIHNwYWNlKSBtdXN0IGJlIGRlcml2ZWQgZnJvbSB0aGUgdG90YWwgcGFja2VkIGhlYWRlciBsZW5ndGguICovCisgICAgaF9zaXplcyA9IGdfbmV3YSAoZ3VpbnQsIG5faGVhZGVycyArIDEpOworICAgIGZvciAoaiA9IDA7IGogPCBuX2hlYWRlcnM7IGorKykgeworICAgICAgZ3VpbnQgaF9zaXplOworCisgICAgICBoX3NpemUgPSAwOworICAgICAgZG8geworICAgICAgICBpZiAoc2l6ZSA8IDEpCisgICAgICAgICAgZ290byB0b29fc21hbGw7CisgICAgICAgIGIgPSAqZGF0YSsrOworICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgZXh0cmErKzsKKyAgICAgICAgc2l6ZS0tOworICAgICAgICBoX3NpemUgPSAoaF9zaXplIDw8IDcpIHwgKGIgJiAweDdmKTsKKyAgICAgIH0gd2hpbGUgKGIgJiAweDgwKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHZvcmJpc2RlcGF5LCAiaGVhZGVycyAlZDogc2l6ZTogJXUiLCBqLCBoX3NpemUpOworCisgICAgICBpZiAobGVuZ3RoIDwgaF9zaXplKQorICAgICAgICBnb3RvIHRvb19zbWFsbDsKKworICAgICAgaF9zaXplc1tqXSA9IGhfc2l6ZTsKKyAgICAgIGxlbmd0aCAtPSBoX3NpemU7CisgICAgfQorICAgIC8qIGxhc3QgaGVhZGVyIGxlbmd0aCBpcyB0aGUgcmVtYWluaW5nIHNwYWNlICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwdm9yYmlzZGVwYXksICJsYXN0IGhlYWRlciBzaXplOiAldSIsIGxlbmd0aCk7CisgICAgaF9zaXplc1tqXSA9IGxlbmd0aDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHZvcmJpc2RlcGF5LCAicHJlcGFyaW5nIGhlYWRlcnMiKTsKKyAgICBjb25mID0gZ19uZXcwIChHc3RSdHBWb3JiaXNDb25maWcsIDEpOworICAgIGNvbmYtPmlkZW50ID0gaWRlbnQ7CisKKyAgICBmb3IgKGogPSAwOyBqIDw9IG5faGVhZGVyczsgaisrKSB7CisgICAgICBndWludCBoX3NpemU7CisKKyAgICAgIGhfc2l6ZSA9IGhfc2l6ZXNbal07CisgICAgICBpZiAoc2l6ZSA8IGhfc2l6ZSkgeworICAgICAgICBpZiAoaiAhPSBuX2hlYWRlcnMgfHwgc2l6ZSArIGV4dHJhICE9IGhfc2l6ZSkgeworICAgICAgICAgIGZyZWVfY29uZmlnIChjb25mKTsKKyAgICAgICAgICBnb3RvIHRvb19zbWFsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBvdGhlcndpc2UgbWVhbnMgdGhhdCBvdmVyYWxsIGxlbmd0aCBmaWVsZCBjb250YWluZWQgdG90YWwgbGVuZ3RoLAorICAgICAgICAgICAqIGluY2x1ZGluZyBleHRyYSBmaWVsZHMgKi8KKyAgICAgICAgICBoX3NpemUgLT0gZXh0cmE7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwdm9yYmlzZGVwYXksICJyZWFkaW5nIGhlYWRlciAlZCwgc2l6ZSAldSIsIGosCisgICAgICAgICAgaF9zaXplKTsKKworICAgICAgYnVmID0gZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAoY29uZmJ1ZiwgR1NUX0JVRkZFUl9DT1BZX0FMTCwgb2Zmc2V0LAorICAgICAgICAgIGhfc2l6ZSk7CisgICAgICBjb25mLT5oZWFkZXJzID0gZ19saXN0X2FwcGVuZCAoY29uZi0+aGVhZGVycywgYnVmKTsKKyAgICAgIG9mZnNldCArPSBoX3NpemU7CisgICAgICBzaXplIC09IGhfc2l6ZTsKKyAgICB9CisgICAgcnRwdm9yYmlzZGVwYXktPmNvbmZpZ3MgPSBnX2xpc3RfYXBwZW5kIChydHB2b3JiaXNkZXBheS0+Y29uZmlncywgY29uZik7CisgIH0KKworICBnc3RfYnVmZmVyX3VubWFwIChjb25mYnVmLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoY29uZmJ1Zik7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCit0b29fc21hbGw6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHB2b3JiaXNkZXBheSwgImNvbmZpZ3VyYXRpb24gdG9vIHNtYWxsIik7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoY29uZmJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoY29uZmJ1Zik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF92b3JiaXNfZGVwYXlfcGFyc2VfaW5iYW5kX2NvbmZpZ3VyYXRpb24gKEdzdFJ0cFZvcmJpc0RlcGF5ICoKKyAgICBydHB2b3JiaXNkZXBheSwgZ3VpbnQgaWRlbnQsIGd1aW50OCAqIGNvbmZpZ3VyYXRpb24sIGd1aW50IHNpemUsCisgICAgZ3VpbnQgbGVuZ3RoKQoreworICBHc3RCdWZmZXIgKmNvbmZidWY7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGlmIChHX1VOTElLRUxZIChzaXplIDwgNCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIHRyYW5zZm9ybSBpbmxpbmUgdG8gb3V0LW9mLWJhbmQgYW5kIHBhcnNlIHRoYXQgb25lICovCisgIGNvbmZidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHNpemUgKyA5KTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGNvbmZidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICAvKiAxIGhlYWRlciAqLworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChtYXAuZGF0YSwgMSk7CisgIC8qIHdyaXRlIElkZW50ICovCisgIEdTVF9XUklURV9VSU5UMjRfQkUgKG1hcC5kYXRhICsgNCwgaWRlbnQpOworICAvKiB3cml0ZSBzb3J0LW9mLWxlbmd0aCAqLworICBHU1RfV1JJVEVfVUlOVDE2X0JFIChtYXAuZGF0YSArIDcsIGxlbmd0aCk7CisgIC8qIGNvcHkgcmVtYWluZGVyICovCisgIG1lbWNweSAobWFwLmRhdGEgKyA5LCBjb25maWd1cmF0aW9uLCBzaXplKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoY29uZmJ1ZiwgJm1hcCk7CisKKyAgcmV0dXJuIGdzdF9ydHBfdm9yYmlzX2RlcGF5X3BhcnNlX2NvbmZpZ3VyYXRpb24gKHJ0cHZvcmJpc2RlcGF5LCBjb25mYnVmKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3ZvcmJpc19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdFJ0cFZvcmJpc0RlcGF5ICpydHB2b3JiaXNkZXBheTsKKyAgR3N0Q2FwcyAqc3JjY2FwczsKKyAgY29uc3QgZ2NoYXIgKmNvbmZpZ3VyYXRpb247CisgIGdpbnQgY2xvY2tfcmF0ZTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHJ0cHZvcmJpc2RlcGF5ID0gR1NUX1JUUF9WT1JCSVNfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgLyogZ2V0IGNsb2NrcmF0ZSAqLworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkKKyAgICBnb3RvIG5vX3JhdGU7CisKKyAgLyogcmVhZCBhbmQgcGFyc2UgY29uZmlndXJhdGlvbiBzdHJpbmcgKi8KKyAgY29uZmlndXJhdGlvbiA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiY29uZmlndXJhdGlvbiIpOworICBpZiAoY29uZmlndXJhdGlvbikgeworICAgIEdzdEJ1ZmZlciAqY29uZmJ1ZjsKKyAgICBndWludDggKmRhdGE7CisgICAgZ3NpemUgc2l6ZTsKKworICAgIC8qIGRlc2VyaWFsaXplIGJhc2U2NCB0byBidWZmZXIgKi8KKyAgICBkYXRhID0gZ19iYXNlNjRfZGVjb2RlIChjb25maWd1cmF0aW9uLCAmc2l6ZSk7CisKKyAgICBjb25mYnVmID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgICAgZ3N0X2J1ZmZlcl9hcHBlbmRfbWVtb3J5IChjb25mYnVmLAorICAgICAgICBnc3RfbWVtb3J5X25ld193cmFwcGVkICgwLCBkYXRhLCBzaXplLCAwLCBzaXplLCBkYXRhLCBnX2ZyZWUpKTsKKyAgICBpZiAoIWdzdF9ydHBfdm9yYmlzX2RlcGF5X3BhcnNlX2NvbmZpZ3VyYXRpb24gKHJ0cHZvcmJpc2RlcGF5LCBjb25mYnVmKSkKKyAgICAgIGdvdG8gaW52YWxpZF9jb25maWd1cmF0aW9uOworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwdm9yYmlzZGVwYXksICJubyBjb25maWd1cmF0aW9uIHNwZWNpZmllZCIpOworICB9CisKKyAgLyogY2FwcyBzZWVtIGdvb2QsIGNvbmZpZ3VyZSBlbGVtZW50ICovCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgLyogc2V0IGNhcHMgb24gcGFkIGFuZCBvbiBoZWFkZXIgKi8KKyAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby94LXZvcmJpcyIpOworICByZXMgPSBnc3RfcGFkX3NldF9jYXBzIChkZXBheWxvYWQtPnNyY3BhZCwgc3JjY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworaW52YWxpZF9jb25maWd1cmF0aW9uOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwdm9yYmlzZGVwYXksICJpbnZhbGlkIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19yYXRlOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwdm9yYmlzZGVwYXksICJubyBjbG9jay1yYXRlIHNwZWNpZmllZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfdm9yYmlzX2RlcGF5X3N3aXRjaF9jb2RlYm9vayAoR3N0UnRwVm9yYmlzRGVwYXkgKiBydHB2b3JiaXNkZXBheSwKKyAgICBndWludDMyIGlkZW50KQoreworICBHTGlzdCAqd2FsazsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwdm9yYmlzZGVwYXksICJMb29raW5nIHVwIGNvZGUgYm9vayBpZGVudCAweCUwOHgiLCBpZGVudCk7CisgIGZvciAod2FsayA9IHJ0cHZvcmJpc2RlcGF5LT5jb25maWdzOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UnRwVm9yYmlzQ29uZmlnICpjb25mID0gKEdzdFJ0cFZvcmJpc0NvbmZpZyAqKSB3YWxrLT5kYXRhOworCisgICAgaWYgKGNvbmYtPmlkZW50ID09IGlkZW50KSB7CisgICAgICBHTGlzdCAqaGVhZGVyczsKKworICAgICAgLyogRklYTUUsIHJlbW92ZSBwYWRzLCBjcmVhdGUgbmV3IHBhZC4uICovCisKKyAgICAgIC8qIHB1c2ggb3V0IGFsbCB0aGUgaGVhZGVycyAqLworICAgICAgZm9yIChoZWFkZXJzID0gY29uZi0+aGVhZGVyczsgaGVhZGVyczsgaGVhZGVycyA9IGdfbGlzdF9uZXh0IChoZWFkZXJzKSkgeworICAgICAgICBHc3RCdWZmZXIgKmhlYWRlciA9IEdTVF9CVUZGRVJfQ0FTVCAoaGVhZGVycy0+ZGF0YSk7CisKKyAgICAgICAgZ3N0X2J1ZmZlcl9yZWYgKGhlYWRlcik7CisgICAgICAgIGdzdF9ydHBfYmFzZV9kZXBheWxvYWRfcHVzaCAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRCAocnRwdm9yYmlzZGVwYXkpLAorICAgICAgICAgICAgaGVhZGVyKTsKKyAgICAgIH0KKyAgICAgIC8qIHJlbWVtYmVyIHRoZSBjdXJyZW50IGNvbmZpZyAqLworICAgICAgcnRwdm9yYmlzZGVwYXktPmNvbmZpZyA9IGNvbmY7CisgICAgICByZXMgPSBUUlVFOworICAgIH0KKyAgfQorICBpZiAoIXJlcykgeworICAgIC8qIHdlIGRvbid0IGtub3cgYWJvdXQgdGhlIGhlYWRlcnMsIGZpZ3VyZSBvdXQgYW4gYWx0ZXJuYXRpdmUgbWV0aG9kIGZvcgorICAgICAqIGdldHRpbmcgdGhlIGNvZGVib29rcy4gRklYTUUsIGZhaWwgZm9yIG5vdy4gKi8KKyAgfQorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfdm9yYmlzX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RSdHBWb3JiaXNEZXBheSAqcnRwdm9yYmlzZGVwYXk7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ2ludCBwYXlsb2FkX2xlbjsKKyAgR3N0QnVmZmVyICpwYXlsb2FkX2J1ZmZlciA9IE5VTEw7CisgIGd1aW50OCAqcGF5bG9hZDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50MzIgaGVhZGVyLCBpZGVudDsKKyAgZ3VpbnQ4IEYsIFZEVCwgcGFja2V0czsKKyAgZ3VpbnQgbGVuZ3RoOworCisgIHJ0cHZvcmJpc2RlcGF5ID0gR1NUX1JUUF9WT1JCSVNfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAiZ290IFJUUCBwYWNrZXQgb2Ygc2l6ZSAlZCIsIHBheWxvYWRfbGVuKTsKKworICAvKiB3ZSBuZWVkIGF0IGxlYXN0IDQgYnl0ZXMgZm9yIHRoZSBwYWNrZXQgaGVhZGVyICovCisgIGlmIChHX1VOTElLRUxZIChwYXlsb2FkX2xlbiA8IDQpKQorICAgIGdvdG8gcGFja2V0X3Nob3J0OworCisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAocnRwKTsKKyAgaGVhZGVyID0gR1NUX1JFQURfVUlOVDMyX0JFIChwYXlsb2FkKTsKKyAgLyoKKyAgICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgICAgICAgICAgICAgICAgICAgSWRlbnQgICAgICAgICAgICAgICAgICAgICB8IEYgfFZEVHwjIHBrdHMufAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKgorICAgKiBGOiBGcmFnbWVudCB0eXBlICgwPW5vbmUsIDE9c3RhcnQsIDI9Y29udCwgMz1lbmQpCisgICAqIFZEVDogVm9yYmlzIGRhdGEgdHlwZSAoMD12b3JiaXMsIDE9Y29uZmlnLCAyPWNvbW1lbnQsIDM9cmVzZXJ2ZWQpCisgICAqIHBrdHM6IG51bWJlciBvZiBwYWNrZXRzLgorICAgKi8KKyAgVkRUID0gKGhlYWRlciAmIDB4MzApID4+IDQ7CisgIGlmIChHX1VOTElLRUxZIChWRFQgPT0gMykpCisgICAgZ290byBpZ25vcmVfcmVzZXJ2ZWQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAiaGVhZGVyOiAweCUwOHgiLCBoZWFkZXIpOworICBpZGVudCA9IChoZWFkZXIgPj4gOCkgJiAweGZmZmZmZjsKKyAgRiA9IChoZWFkZXIgJiAweGMwKSA+PiA2OworICBwYWNrZXRzID0gKGhlYWRlciAmIDB4Zik7CisKKyAgaWYgKFZEVCA9PSAwKSB7CisgICAgZ2Jvb2xlYW4gZG9fc3dpdGNoID0gRkFMU0U7CisKKyAgICAvKiB3ZSBoYXZlIGEgcmF3IHBheWxvYWQsIGZpbmQgdGhlIGNvZGVib29rIGZvciB0aGUgaWRlbnQgKi8KKyAgICBpZiAoIXJ0cHZvcmJpc2RlcGF5LT5jb25maWcpIHsKKyAgICAgIC8qIHdlIGRvbid0IGhhdmUgYW4gYWN0aXZlIGNvZGVib29rLCBmaW5kIHRoZSBjb2RlYm9vayBhbmQKKyAgICAgICAqIGFjdGl2YXRlIGl0ICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHB2b3JiaXNkZXBheSwgIk5vIGFjdGl2ZSBjb2RlYm9vaywgc3dpdGNoaW5nIik7CisgICAgICBkb19zd2l0Y2ggPSBUUlVFOworICAgIH0gZWxzZSBpZiAocnRwdm9yYmlzZGVwYXktPmNvbmZpZy0+aWRlbnQgIT0gaWRlbnQpIHsKKyAgICAgIC8qIGNvZGVib29rIGNoYW5nZWQgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHZvcmJpc2RlcGF5LCAiY29kZWJvb2sgY2hhbmdlZCwgc3dpdGNoaW5nIik7CisgICAgICBkb19zd2l0Y2ggPSBUUlVFOworICAgIH0KKyAgICBpZiAoZG9fc3dpdGNoKSB7CisgICAgICBpZiAoIWdzdF9ydHBfdm9yYmlzX2RlcGF5X3N3aXRjaF9jb2RlYm9vayAocnRwdm9yYmlzZGVwYXksIGlkZW50KSkKKyAgICAgICAgZ290byBzd2l0Y2hfZmFpbGVkOworICAgIH0KKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgImlkZW50OiAldSwgRjogJWQsIFZEVDogJWQsIHBhY2tldHM6ICVkIiwgaWRlbnQsCisgICAgICBGLCBWRFQsIHBhY2tldHMpOworCisgIC8qIGZyYWdtZW50ZWQgcGFja2V0cywgYXNzZW1ibGUgKi8KKyAgaWYgKEYgIT0gMCkgeworICAgIEdzdEJ1ZmZlciAqdmRhdGE7CisKKyAgICBpZiAoRiA9PSAxKSB7CisgICAgICAvKiBpZiB3ZSBzdGFydCBhIHBhY2tldCwgY2xlYXIgYWRhcHRlciBhbmQgc3RhcnQgYXNzZW1ibGluZy4gKi8KKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChydHB2b3JiaXNkZXBheS0+YWRhcHRlcik7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsICJzdGFydCBhc3NlbWJsZSIpOworICAgICAgcnRwdm9yYmlzZGVwYXktPmFzc2VtYmxpbmcgPSBUUlVFOworICAgIH0KKworICAgIGlmICghcnRwdm9yYmlzZGVwYXktPmFzc2VtYmxpbmcpCisgICAgICBnb3RvIG5vX291dHB1dDsKKworICAgIC8qIHNraXAgaGVhZGVyIGFuZCBsZW5ndGguICovCisgICAgdmRhdGEgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgKHJ0cCwgNiwgLTEpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAiYXNzZW1ibGUgdm9yYmlzIHBhY2tldCIpOworICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cHZvcmJpc2RlcGF5LT5hZGFwdGVyLCB2ZGF0YSk7CisKKyAgICAvKiBwYWNrZXQgaXMgbm90IGNvbXBsZXRlLCB3ZSBhcmUgZG9uZSAqLworICAgIGlmIChGICE9IDMpCisgICAgICBnb3RvIG5vX291dHB1dDsKKworICAgIC8qIGNvbnN0cnVjdCBhc3NlbWJsZWQgYnVmZmVyICovCisgICAgbGVuZ3RoID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHB2b3JiaXNkZXBheS0+YWRhcHRlcik7CisgICAgcGF5bG9hZF9idWZmZXIgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRwdm9yYmlzZGVwYXktPmFkYXB0ZXIsIGxlbmd0aCk7CisgIH0gZWxzZSB7CisgICAgcGF5bG9hZF9idWZmZXIgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgKHJ0cCwgNCwgLTEpOworICAgIGxlbmd0aCA9IDA7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsICJhc3NlbWJsZSBkb25lIik7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKHBheWxvYWRfYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBwYXlsb2FkID0gbWFwLmRhdGE7CisgIHBheWxvYWRfbGVuID0gbWFwLnNpemU7CisKKyAgLyogd2Ugbm90IGFzc2VtYmxpbmcgYW55bW9yZSBub3cgKi8KKyAgcnRwdm9yYmlzZGVwYXktPmFzc2VtYmxpbmcgPSBGQUxTRTsKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cHZvcmJpc2RlcGF5LT5hZGFwdGVyKTsKKworICAvKiBwYXlsb2FkIG5vdyBwb2ludHMgdG8gYSBsZW5ndGggd2l0aCB0aGF0IG1hbnkgdm9yYmlzIGRhdGEgYnl0ZXMuCisgICAqIEl0ZXJhdGUgb3ZlciB0aGUgcGFja2V0cyBhbmQgc2VuZCB0aGVtIG91dC4KKyAgICoKKyAgICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgICAgICAgICAgIGxlbmd0aCAgICAgICAgICAgIHwgICAgICAgICAgdm9yYmlzIGRhdGEgICAgICAgICAuLgorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiAuLiAgICAgICAgICAgICAgICAgICAgICAgIHZvcmJpcyBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgICAgICAgICAgbGVuZ3RoICAgICAgICAgICAgIHwgICBuZXh0IHZvcmJpcyBwYWNrZXQgZGF0YSAgICAuLgorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiAuLiAgICAgICAgICAgICAgICAgICAgICAgIHZvcmJpcyBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyoKKyAgICovCisgIHdoaWxlIChwYXlsb2FkX2xlbiA+IDIpIHsKKyAgICAvKiBJZiBsZW5ndGggaXMgbm90IDAsIHdlIGhhdmUgYSByZWFzc2VtYmxlZCBwYWNrZXQgZm9yIHdoaWNoIHdlCisgICAgICogY2FsY3VsYXRlZCB0aGUgbGVuZ3RoIGFscmVhZHkgYW5kIGRvbid0IGhhdmUgdG8gc2tpcCBvdmVyIHRoZQorICAgICAqIGxlbmd0aCBmaWVsZCBhbnltb3JlCisgICAgICovCisgICAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICBsZW5ndGggPSBHU1RfUkVBRF9VSU5UMTZfQkUgKHBheWxvYWQpOworICAgICAgcGF5bG9hZCArPSAyOworICAgICAgcGF5bG9hZF9sZW4gLT0gMjsKKyAgICB9CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsICJyZWFkIGxlbmd0aCAldSwgYXZhaWw6ICVkIiwgbGVuZ3RoLAorICAgICAgICBwYXlsb2FkX2xlbik7CisKKyAgICAvKiBza2lwIHBhY2tldCBpZiBzb21ldGhpbmcgb2RkIGhhcHBlbnMgKi8KKyAgICBpZiAoR19VTkxJS0VMWSAobGVuZ3RoID4gcGF5bG9hZF9sZW4pKQorICAgICAgZ290byBsZW5ndGhfc2hvcnQ7CisKKyAgICAvKiBoYW5kbGUgaW4tYmFuZCBjb25maWd1cmF0aW9uICovCisgICAgaWYgKEdfVU5MSUtFTFkgKFZEVCA9PSAxKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwdm9yYmlzZGVwYXksICJpbi1iYW5kIGNvbmZpZ3VyYXRpb24iKTsKKyAgICAgIGlmICghZ3N0X3J0cF92b3JiaXNfZGVwYXlfcGFyc2VfaW5iYW5kX2NvbmZpZ3VyYXRpb24gKHJ0cHZvcmJpc2RlcGF5LAorICAgICAgICAgICAgICBpZGVudCwgcGF5bG9hZCwgcGF5bG9hZF9sZW4sIGxlbmd0aCkpCisgICAgICAgIGdvdG8gaW52YWxpZF9jb25maWd1cmF0aW9uOworICAgICAgZ290byBub19vdXRwdXQ7CisgICAgfQorCisgICAgLyogY3JlYXRlIGJ1ZmZlciBmb3IgcGFja2V0ICovCisgICAgb3V0YnVmID0KKyAgICAgICAgZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAocGF5bG9hZF9idWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsCisgICAgICAgIHBheWxvYWQgLSBtYXAuZGF0YSwgbGVuZ3RoKTsKKworICAgIHBheWxvYWQgKz0gbGVuZ3RoOworICAgIHBheWxvYWRfbGVuIC09IGxlbmd0aDsKKyAgICAvKiBtYWtlIHN1cmUgdG8gcmVhZCBuZXh0IGxlbmd0aCAqLworICAgIGxlbmd0aCA9IDA7CisKKyAgICByZXQgPSBnc3RfcnRwX2Jhc2VfZGVwYXlsb2FkX3B1c2ggKGRlcGF5bG9hZCwgb3V0YnVmKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisgIH0KKworICBnc3RfYnVmZmVyX3VubWFwIChwYXlsb2FkX2J1ZmZlciwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKHBheWxvYWRfYnVmZmVyKTsKKworICByZXR1cm4gTlVMTDsKKworbm9fb3V0cHV0OgorICB7CisgICAgaWYgKHBheWxvYWRfYnVmZmVyKSB7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChwYXlsb2FkX2J1ZmZlciwgJm1hcCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChwYXlsb2FkX2J1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisgIC8qIEVST1JSUyAqLworc3dpdGNoX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cHZvcmJpc2RlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIkNvdWxkIG5vdCBzd2l0Y2ggY29kZWJvb2tzIikpOworICAgIHJldHVybiBOVUxMOworICB9CitwYWNrZXRfc2hvcnQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHB2b3JiaXNkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJQYWNrZXQgd2FzIHRvbyBzaG9ydCAoJWQgPCA0KSIsIHBheWxvYWRfbGVuKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2lnbm9yZV9yZXNlcnZlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwdm9yYmlzZGVwYXksICJyZXNlcnZlZCBWRFQgaWdub3JlZCIpOworICAgIHJldHVybiBOVUxMOworICB9CitsZW5ndGhfc2hvcnQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHB2b3JiaXNkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJQYWNrZXQgY29udGFpbnMgaW52YWxpZCBkYXRhIikpOworICAgIGlmIChwYXlsb2FkX2J1ZmZlcikgeworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAocGF5bG9hZF9idWZmZXIsICZtYXApOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocGF5bG9hZF9idWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQoraW52YWxpZF9jb25maWd1cmF0aW9uOgorICB7CisgICAgLyogZmF0YWwsIGFzIHdlIG90aGVyd2lzZSByaXNrIGNhcnJ5aW5nIG9uIHdpdGhvdXQgb3V0cHV0ICovCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHJ0cHZvcmJpc2RlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIlBhY2tldCBjb250YWlucyBpbnZhbGlkIGNvbmZpZ3VyYXRpb24iKSk7CisgICAgaWYgKHBheWxvYWRfYnVmZmVyKSB7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChwYXlsb2FkX2J1ZmZlciwgJm1hcCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChwYXlsb2FkX2J1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF92b3JiaXNfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RSdHBWb3JiaXNEZXBheSAqcnRwdm9yYmlzZGVwYXk7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBydHB2b3JiaXNkZXBheSA9IEdTVF9SVFBfVk9SQklTX0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZnJlZV9pbmRlbnRzIChydHB2b3JiaXNkZXBheSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF92b3JiaXNfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHB2b3JiaXNkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9WT1JCSVNfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNDNkMDQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmgKQEAgLTAsMCArMSw3MCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1ZPUkJJU19ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1ZPUkJJU19ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfVk9SQklTX0RFUEFZIFwKKyAgKGdzdF9ydHBfdm9yYmlzX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfVk9SQklTX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1ZPUkJJU19ERVBBWSxHc3RSdHBWb3JiaXNEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfVk9SQklTX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9WT1JCSVNfREVQQVksR3N0UnRwVm9yYmlzRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfVk9SQklTX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1ZPUkJJU19ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfVk9SQklTX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9WT1JCSVNfREVQQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwVm9yYmlzRGVwYXkgR3N0UnRwVm9yYmlzRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwVm9yYmlzRGVwYXlDbGFzcyBHc3RSdHBWb3JiaXNEZXBheUNsYXNzOworCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwVm9yYmlzQ29uZmlnIHsKKyAgZ3VpbnQzMiAgaWRlbnQ7CisgIEdMaXN0ICAgKmhlYWRlcnM7Cit9IEdzdFJ0cFZvcmJpc0NvbmZpZzsKKworc3RydWN0IF9Hc3RSdHBWb3JiaXNEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIHBhcmVudDsKKworICBHTGlzdCAgICAgICAgICAgICAgKmNvbmZpZ3M7CisgIEdzdFJ0cFZvcmJpc0NvbmZpZyAqY29uZmlnOworCisgIEdzdEFkYXB0ZXIgICAgICAgICAqYWRhcHRlcjsKKyAgZ2Jvb2xlYW4gICAgICAgICAgICBhc3NlbWJsaW5nOworfTsKKworc3RydWN0IF9Hc3RSdHBWb3JiaXNEZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX3ZvcmJpc19kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfdm9yYmlzX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX1ZPUkJJU19ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YmI1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jCkBAIC0wLDAgKzEsOTk5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJmbnYxaGFzaC5oIgorI2luY2x1ZGUgImdzdHJ0cHZvcmJpc3BheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cHZvcmJpc3BheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwdm9yYmlzcGF5X2RlYnVnKQorCisvKiByZWZlcmVuY2VzOgorICogaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNTIxNS50eHQKKyAqLworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF92b3JiaXNfcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVggXSwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiVk9SQklTXCIiCisgICAgICAgIC8qIEFsbCByZXF1aXJlZCBwYXJhbWV0ZXJzCisgICAgICAgICAqCisgICAgICAgICAqICJlbmNvZGluZy1wYXJhbXMgPSAoc3RyaW5nKSA8bnVtIGNoYW5uZWxzPiIKKyAgICAgICAgICogImNvbmZpZ3VyYXRpb24gPSAoc3RyaW5nKSBBTlkiCisgICAgICAgICAqLworICAgICkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF92b3JiaXNfcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC12b3JiaXMiKQorICAgICk7CisKKyNkZWZpbmUgREVGQVVMVF9DT05GSUdfSU5URVJWQUwgMAorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9DT05GSUdfSU5URVJWQUwKK307CisKKyNkZWZpbmUgZ3N0X3J0cF92b3JiaXNfcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cFZvcmJpc1BheSwgZ3N0X3J0cF92b3JiaXNfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9QQVlMT0FEKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfdm9yYmlzX3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX3ZvcmJpc19wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfdm9yYmlzX3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBhZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfdm9yYmlzX3BheV9zaW5rX2V2ZW50IChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3ZvcmJpc19wYXlfcGFyc2VfaWQgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgc2l6ZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF92b3JiaXNfcGF5X2ZpbmlzaF9oZWFkZXJzIChHc3RSVFBCYXNlUGF5bG9hZCAqCisgICAgYmFzZXBheWxvYWQpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX3ZvcmJpc19wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF92b3JiaXNfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdm9yYmlzX3BheV9jbGFzc19pbml0IChHc3RSdHBWb3JiaXNQYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfdm9yYmlzX3BheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF92b3JiaXNfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF92b3JiaXNfcGF5X2hhbmRsZV9idWZmZXI7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5zaW5rX2V2ZW50ID0gZ3N0X3J0cF92b3JiaXNfcGF5X3NpbmtfZXZlbnQ7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF92b3JiaXNfcGF5X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF92b3JiaXNfcGF5X2dldF9wcm9wZXJ0eTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3ZvcmJpc19wYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF92b3JiaXNfcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIFZvcmJpcyBwYXlsb2FkZXIiLAorICAgICAgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZC1lbmNvZGUgVm9yYmlzIGF1ZGlvIGludG8gUlRQIHBhY2tldHMgKFJGQyA1MjE1KSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwdm9yYmlzcGF5X2RlYnVnLCAicnRwdm9yYmlzcGF5IiwgMCwKKyAgICAgICJWb3JiaXMgUlRQIFBheWxvYWRlciIpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQ09ORklHX0lOVEVSVkFMLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJjb25maWctaW50ZXJ2YWwiLCAiQ29uZmlnIFNlbmQgSW50ZXJ2YWwiLAorICAgICAgICAgICJTZW5kIENvbmZpZyBJbnNlcnRpb24gSW50ZXJ2YWwgaW4gc2Vjb25kcyAoY29uZmlndXJhdGlvbiBoZWFkZXJzICIKKyAgICAgICAgICAid2lsbCBiZSBtdWx0aXBsZXhlZCBpbiB0aGUgZGF0YSBzdHJlYW0gd2hlbiBkZXRlY3RlZC4pICgwID0gZGlzYWJsZWQpIiwKKyAgICAgICAgICAwLCAzNjAwLCBERUZBVUxUX0NPTkZJR19JTlRFUlZBTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpCisgICAgICApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF92b3JiaXNfcGF5X2luaXQgKEdzdFJ0cFZvcmJpc1BheSAqIHJ0cHZvcmJpc3BheSkKK3sKKyAgcnRwdm9yYmlzcGF5LT5sYXN0X2NvbmZpZyA9IEdTVF9DTE9DS19USU1FX05PTkU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3ZvcmJpc19wYXlfY2xlYXJfcGFja2V0IChHc3RSdHBWb3JiaXNQYXkgKiBydHB2b3JiaXNwYXkpCit7CisgIGlmIChydHB2b3JiaXNwYXktPnBhY2tldCkKKyAgICBnc3RfYnVmZmVyX3VucmVmIChydHB2b3JiaXNwYXktPnBhY2tldCk7CisgIHJ0cHZvcmJpc3BheS0+cGFja2V0ID0gTlVMTDsKKyAgZ19saXN0X2ZyZWVfZnVsbCAocnRwdm9yYmlzcGF5LT5wYWNrZXRfYnVmZmVycywKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgIHJ0cHZvcmJpc3BheS0+cGFja2V0X2J1ZmZlcnMgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF92b3JiaXNfcGF5X2NsZWFudXAgKEdzdFJ0cFZvcmJpc1BheSAqIHJ0cHZvcmJpc3BheSkKK3sKKyAgZ3N0X3J0cF92b3JiaXNfcGF5X2NsZWFyX3BhY2tldCAocnRwdm9yYmlzcGF5KTsKKyAgZ19saXN0X2ZyZWVfZnVsbCAocnRwdm9yYmlzcGF5LT5oZWFkZXJzLCAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9idWZmZXJfdW5yZWYpOworICBydHB2b3JiaXNwYXktPmhlYWRlcnMgPSBOVUxMOworICBnX2ZyZWUgKHJ0cHZvcmJpc3BheS0+Y29uZmlnX2RhdGEpOworICBydHB2b3JiaXNwYXktPmNvbmZpZ19kYXRhID0gTlVMTDsKKyAgcnRwdm9yYmlzcGF5LT5sYXN0X2NvbmZpZyA9IEdTVF9DTE9DS19USU1FX05PTkU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF92b3JiaXNfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RSdHBWb3JiaXNQYXkgKnJ0cHZvcmJpc3BheTsKKyAgR3N0U3RydWN0dXJlICpzOworICBjb25zdCBHVmFsdWUgKmFycmF5OworICBnaW50IGFzaXplLCBpOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgcnRwdm9yYmlzcGF5ID0gR1NUX1JUUF9WT1JCSVNfUEFZIChiYXNlcGF5bG9hZCk7CisKKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIHJ0cHZvcmJpc3BheS0+bmVlZF9oZWFkZXJzID0gVFJVRTsKKworICBpZiAoKGFycmF5ID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJzdHJlYW1oZWFkZXIiKSkgPT0gTlVMTCkKKyAgICBnb3RvIGRvbmU7CisKKyAgaWYgKEdfVkFMVUVfVFlQRSAoYXJyYXkpICE9IEdTVF9UWVBFX0FSUkFZKQorICAgIGdvdG8gZG9uZTsKKworICBpZiAoKGFzaXplID0gZ3N0X3ZhbHVlX2FycmF5X2dldF9zaXplIChhcnJheSkpIDwgMykKKyAgICBnb3RvIGRvbmU7CisKKyAgZm9yIChpID0gMDsgaSA8IGFzaXplOyBpKyspIHsKKyAgICBjb25zdCBHVmFsdWUgKnZhbHVlOworCisgICAgdmFsdWUgPSBnc3RfdmFsdWVfYXJyYXlfZ2V0X3ZhbHVlIChhcnJheSwgaSk7CisgICAgaWYgKChidWYgPSBnc3RfdmFsdWVfZ2V0X2J1ZmZlciAodmFsdWUpKSA9PSBOVUxMKQorICAgICAgZ290byBudWxsX2J1ZmZlcjsKKworICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgaWYgKG1hcC5zaXplIDwgMSkKKyAgICAgIGdvdG8gaW52YWxpZF9zdHJlYW1oZWFkZXI7CisKKyAgICAvKiBubyBkYXRhIHBhY2tldHMgYWxsb3dlZCAqLworICAgIGlmICgobWFwLmRhdGFbMF0gJiAxKSA9PSAwKQorICAgICAgZ290byBpbnZhbGlkX3N0cmVhbWhlYWRlcjsKKworICAgIC8qIHdlIG5lZWQgcGFja2V0cyB3aXRoIGlkIDEsIDMsIDUgKi8KKyAgICBpZiAobWFwLmRhdGFbMF0gIT0gKGkgKiAyKSArIDEpCisgICAgICBnb3RvIGludmFsaWRfc3RyZWFtaGVhZGVyOworCisgICAgaWYgKGkgPT0gMCkgeworICAgICAgLyogaWRlbnRpZmljYXRpb24sIHdlIG5lZWQgdG8gcGFyc2UgdGhpcyBpbiBvcmRlciB0byBnZXQgdGhlIGNsb2NrIHJhdGUuICovCisgICAgICBpZiAoR19VTkxJS0VMWSAoIWdzdF9ydHBfdm9yYmlzX3BheV9wYXJzZV9pZCAoYmFzZXBheWxvYWQsIG1hcC5kYXRhLAorICAgICAgICAgICAgICAgICAgbWFwLnNpemUpKSkKKyAgICAgICAgZ290byBwYXJzZV9pZF9mYWlsZWQ7CisgICAgfQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHZvcmJpc3BheSwgImNvbGxlY3RpbmcgaGVhZGVyICVkIiwgaSk7CisgICAgcnRwdm9yYmlzcGF5LT5oZWFkZXJzID0KKyAgICAgICAgZ19saXN0X2FwcGVuZCAocnRwdm9yYmlzcGF5LT5oZWFkZXJzLCBnc3RfYnVmZmVyX3JlZiAoYnVmKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgfQorICBpZiAoIWdzdF9ydHBfdm9yYmlzX3BheV9maW5pc2hfaGVhZGVycyAoYmFzZXBheWxvYWQpKQorICAgIGdvdG8gZmluaXNoX2ZhaWxlZDsKKworZG9uZToKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitudWxsX2J1ZmZlcjoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwdm9yYmlzcGF5LCAic3RyZWFtaGVhZGVyIHdpdGggbnVsbCBidWZmZXIgcmVjZWl2ZWQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfc3RyZWFtaGVhZGVyOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChydHB2b3JiaXNwYXksICJ1bmFibGUgdG8gcGFyc2UgaW5pdGlhbCBoZWFkZXIiKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorcGFyc2VfaWRfZmFpbGVkOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChydHB2b3JiaXNwYXksICJ1bmFibGUgdG8gcGFyc2UgaW5pdGlhbCBoZWFkZXIiKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorZmluaXNoX2ZhaWxlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwdm9yYmlzcGF5LCAidW5hYmxlIHRvIGZpbmlzaCBoZWFkZXJzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3ZvcmJpc19wYXlfcmVzZXRfcGFja2V0IChHc3RSdHBWb3JiaXNQYXkgKiBydHB2b3JiaXNwYXksIGd1aW50OCBWRFQpCit7CisgIGd1aW50IHBheWxvYWRfbGVuOworICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisKKyAgR1NUX0xPR19PQkpFQ1QgKHJ0cHZvcmJpc3BheSwgInJlc2V0IHBhY2tldCIpOworCisgIHJ0cHZvcmJpc3BheS0+cGF5bG9hZF9wb3MgPSA0OworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKHJ0cHZvcmJpc3BheS0+cGFja2V0LCBHU1RfTUFQX1JFQUQsICZydHApOworICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAoJnJ0cCk7CisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgcnRwdm9yYmlzcGF5LT5wYXlsb2FkX2xlZnQgPSBwYXlsb2FkX2xlbiAtIDQ7CisgIHJ0cHZvcmJpc3BheS0+cGF5bG9hZF9kdXJhdGlvbiA9IDA7CisgIHJ0cHZvcmJpc3BheS0+cGF5bG9hZF9GID0gMDsKKyAgcnRwdm9yYmlzcGF5LT5wYXlsb2FkX1ZEVCA9IFZEVDsKKyAgcnRwdm9yYmlzcGF5LT5wYXlsb2FkX3BrdHMgPSAwOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF92b3JiaXNfcGF5X2luaXRfcGFja2V0IChHc3RSdHBWb3JiaXNQYXkgKiBydHB2b3JiaXNwYXksIGd1aW50OCBWRFQsCisgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCkKK3sKKyAgR1NUX0xPR19PQkpFQ1QgKHJ0cHZvcmJpc3BheSwgInN0YXJ0aW5nIG5ldyBwYWNrZXQsIFZEVDogJWQiLCBWRFQpOworCisgIGdzdF9ydHBfdm9yYmlzX3BheV9jbGVhcl9wYWNrZXQgKHJ0cHZvcmJpc3BheSk7CisKKyAgLyogbmV3IHBhY2tldCBhbGxvY2F0ZSBtYXggcGFja2V0IHNpemUgKi8KKyAgcnRwdm9yYmlzcGF5LT5wYWNrZXQgPQorICAgICAgZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlX2xlbiAoR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVCisgICAgICAocnRwdm9yYmlzcGF5KSwgMCwgMCk7CisgIGdzdF9ydHBfdm9yYmlzX3BheV9yZXNldF9wYWNrZXQgKHJ0cHZvcmJpc3BheSwgVkRUKTsKKworICBHU1RfQlVGRkVSX1BUUyAocnRwdm9yYmlzcGF5LT5wYWNrZXQpID0gdGltZXN0YW1wOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF92b3JiaXNfcGF5X2ZsdXNoX3BhY2tldCAoR3N0UnRwVm9yYmlzUGF5ICogcnRwdm9yYmlzcGF5KQoreworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ3VpbnQ4ICpwYXlsb2FkOworICBndWludCBobGVuOworICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisgIEdMaXN0ICpsOworCisgIC8qIGNoZWNrIGZvciBlbXB0eSBwYWNrZXQgKi8KKyAgaWYgKCFydHB2b3JiaXNwYXktPnBhY2tldCB8fCBydHB2b3JiaXNwYXktPnBheWxvYWRfcG9zIDw9IDQpCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIEdTVF9MT0dfT0JKRUNUIChydHB2b3JiaXNwYXksICJmbHVzaGluZyBwYWNrZXQiKTsKKworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKHJ0cHZvcmJpc3BheS0+cGFja2V0LCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKworICAvKiBmaXggaGVhZGVyICovCisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisgIC8qCisgICAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgIElkZW50ICAgICAgICAgICAgICAgICAgICAgfCBGIHxWRFR8IyBwa3RzLnwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICoKKyAgICogRjogRnJhZ21lbnQgdHlwZSAoMD1ub25lLCAxPXN0YXJ0LCAyPWNvbnQsIDM9ZW5kKQorICAgKiBWRFQ6IFZvcmJpcyBkYXRhIHR5cGUgKDA9dm9yYmlzLCAxPWNvbmZpZywgMj1jb21tZW50LCAzPXJlc2VydmVkKQorICAgKiBwa3RzOiBudW1iZXIgb2YgcGFja2V0cy4KKyAgICovCisgIHBheWxvYWRbMF0gPSAocnRwdm9yYmlzcGF5LT5wYXlsb2FkX2lkZW50ID4+IDE2KSAmIDB4ZmY7CisgIHBheWxvYWRbMV0gPSAocnRwdm9yYmlzcGF5LT5wYXlsb2FkX2lkZW50ID4+IDgpICYgMHhmZjsKKyAgcGF5bG9hZFsyXSA9IChydHB2b3JiaXNwYXktPnBheWxvYWRfaWRlbnQpICYgMHhmZjsKKyAgcGF5bG9hZFszXSA9IChydHB2b3JiaXNwYXktPnBheWxvYWRfRiAmIDB4MykgPDwgNiB8CisgICAgICAocnRwdm9yYmlzcGF5LT5wYXlsb2FkX1ZEVCAmIDB4MykgPDwgNCB8CisgICAgICAocnRwdm9yYmlzcGF5LT5wYXlsb2FkX3BrdHMgJiAweGYpOworCisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICAvKiBzaHJpbmsgdGhlIGJ1ZmZlciBzaXplIHRvIHRoZSBsYXN0IHdyaXR0ZW4gYnl0ZSAqLworICBobGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19oZWFkZXJfbGVuICgwKTsKKyAgZ3N0X2J1ZmZlcl9yZXNpemUgKHJ0cHZvcmJpc3BheS0+cGFja2V0LCAwLCBobGVuICsgcnRwdm9yYmlzcGF5LT5wYXlsb2FkX3Bvcyk7CisKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAocnRwdm9yYmlzcGF5LT5wYWNrZXQpID0gcnRwdm9yYmlzcGF5LT5wYXlsb2FkX2R1cmF0aW9uOworCisgIGZvciAobCA9IGdfbGlzdF9sYXN0IChydHB2b3JiaXNwYXktPnBhY2tldF9idWZmZXJzKTsgbDsgbCA9IGwtPnByZXYpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZiA9IEdTVF9CVUZGRVJfQ0FTVCAobC0+ZGF0YSk7CisgICAgZ3N0X3J0cF9jb3B5X2F1ZGlvX21ldGEgKHJ0cHZvcmJpc3BheSwgcnRwdm9yYmlzcGF5LT5wYWNrZXQsIGJ1Zik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgfQorICBnX2xpc3RfZnJlZSAocnRwdm9yYmlzcGF5LT5wYWNrZXRfYnVmZmVycyk7CisgIHJ0cHZvcmJpc3BheS0+cGFja2V0X2J1ZmZlcnMgPSBOVUxMOworCisgIC8qIHB1c2gsIHRoaXMgZ2l2ZXMgYXdheSBvdXIgcmVmIHRvIHRoZSBwYWNrZXQsIHNvIGNsZWFyIGl0LiAqLworICByZXQgPQorICAgICAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfcHVzaCAoR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHJ0cHZvcmJpc3BheSksCisgICAgICBydHB2b3JiaXNwYXktPnBhY2tldCk7CisgIHJ0cHZvcmJpc3BheS0+cGFja2V0ID0gTlVMTDsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfdm9yYmlzX3BheV9maW5pc2hfaGVhZGVycyAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCkKK3sKKyAgR3N0UnRwVm9yYmlzUGF5ICpydHB2b3JiaXNwYXkgPSBHU1RfUlRQX1ZPUkJJU19QQVkgKGJhc2VwYXlsb2FkKTsKKyAgR0xpc3QgKndhbGs7CisgIGd1aW50IGxlbmd0aCwgc2l6ZSwgbl9oZWFkZXJzLCBjb25maWdsZW4sIGV4dHJhbGVuOworICBnY2hhciAqY3N0ciwgKmNvbmZpZ3VyYXRpb247CisgIGd1aW50OCAqZGF0YSwgKmNvbmZpZzsKKyAgZ3VpbnQzMiBpZGVudDsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHZvcmJpc3BheSwgImZpbmlzaCBoZWFkZXJzIik7CisKKyAgaWYgKCFydHB2b3JiaXNwYXktPmhlYWRlcnMpCisgICAgZ290byBub19oZWFkZXJzOworCisgIC8qICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIHwgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgcGFja2VkIGhlYWRlcnMgICAgICAgICAgICAgICAgICB8CisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tlZCBoZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tlZCBoZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqCisgICAqIFdlIG9ubHkgY29uc3RydWN0IGEgY29uZmlnIGNvbnRhaW5pbmcgMSBwYWNrZWQgaGVhZGVyIGxpa2UgdGhpczoKKyAgICoKKyAgICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgICAgICAgICAgICAgICAgIElkZW50ICAgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCAgICAgICAuLgorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiAuLiAgICAgICAgICAgICAgfCBuLiBvZiBoZWFkZXJzIHwgICAgbGVuZ3RoMSAgICB8ICAgIGxlbmd0aDIgICAuLgorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiAuLiAgICAgICAgICAgICAgfCAgICAgICAgICAgICBJZGVudGlmaWNhdGlvbiBIZWFkZXIgICAgICAgICAgICAuLgorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiAuLiAgICAgICAgICAgICAgfCAgICAgICAgIENvbW1lbnQgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAuLgorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiAuLiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR1cCBIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAuLgorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiAuLiAgICAgICAgICAgICAgICAgICAgICAgICBTZXR1cCBIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKi8KKworICAvKiB3ZSBuZWVkIDQgYnl0ZXMgZm9yIHRoZSBudW1iZXIgb2YgaGVhZGVycyAod2hpY2ggaXMgYWx3YXlzIDEpLCAzIGJ5dGVzIGZvcgorICAgKiB0aGUgaWRlbnQsIDIgYnl0ZXMgZm9yIGxlbmd0aCwgMSBieXRlIGZvciBuLiBvZiBoZWFkZXJzLiAqLworICBzaXplID0gNCArIDMgKyAyICsgMTsKKworICAvKiBjb3VudCB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVycyBmaXJzdCBhbmQgdXBkYXRlIHRoZSBoYXNoICovCisgIGxlbmd0aCA9IDA7CisgIG5faGVhZGVycyA9IDA7CisgIGlkZW50ID0gZm52MV9oYXNoXzMyX25ldyAoKTsKKyAgZXh0cmFsZW4gPSAxOworICBmb3IgKHdhbGsgPSBydHB2b3JiaXNwYXktPmhlYWRlcnM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZiA9IEdTVF9CVUZGRVJfQ0FTVCAod2Fsay0+ZGF0YSk7CisgICAgR3N0TWFwSW5mbyBtYXA7CisgICAgZ3VpbnQgYnNpemU7CisKKyAgICBic2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisgICAgbGVuZ3RoICs9IGJzaXplOworICAgIG5faGVhZGVycysrOworCisgICAgLyogY291bnQgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCBmb3IgbGVuZ3RoIGZpZWxkcywgd2UgZG9uJ3QgbmVlZCB0aGlzIGZvcgorICAgICAqIHRoZSBsYXN0IGhlYWRlci4gKi8KKyAgICBpZiAoZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgICBkbyB7CisgICAgICAgIHNpemUrKzsKKyAgICAgICAgZXh0cmFsZW4rKzsKKyAgICAgICAgYnNpemUgPj49IDc7CisgICAgICB9IHdoaWxlIChic2l6ZSk7CisgICAgfQorICAgIC8qIHVwZGF0ZSBoYXNoICovCisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBpZGVudCA9IGZudjFfaGFzaF8zMl91cGRhdGUgKGlkZW50LCBtYXAuZGF0YSwgbWFwLnNpemUpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIH0KKworICAvKiBwYWNrZXQgbGVuZ3RoIGlzIGhlYWRlciBzaXplICsgcGFja2V0IGxlbmd0aCAqLworICBjb25maWdsZW4gPSBzaXplICsgbGVuZ3RoOworICBjb25maWcgPSBkYXRhID0gZ19tYWxsb2MgKGNvbmZpZ2xlbik7CisKKyAgLyogbnVtYmVyIG9mIHBhY2tlZCBoZWFkZXJzLCB3ZSBvbmx5IHBhY2sgMSBoZWFkZXIgKi8KKyAgZGF0YVswXSA9IDA7CisgIGRhdGFbMV0gPSAwOworICBkYXRhWzJdID0gMDsKKyAgZGF0YVszXSA9IDE7CisKKyAgaWRlbnQgPSBmbnYxX2hhc2hfMzJfdG9fMjQgKGlkZW50KTsKKyAgcnRwdm9yYmlzcGF5LT5wYXlsb2FkX2lkZW50ID0gaWRlbnQ7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHZvcmJpc3BheSwgImlkZW50IDB4JTA4eCIsIGlkZW50KTsKKworICAvKiB0YWtlIGxvd2VyIDMgYnl0ZXMgKi8KKyAgZGF0YVs0XSA9IChpZGVudCA+PiAxNikgJiAweGZmOworICBkYXRhWzVdID0gKGlkZW50ID4+IDgpICYgMHhmZjsKKyAgZGF0YVs2XSA9IGlkZW50ICYgMHhmZjsKKworICAvKiBzdG9yZSBsZW5ndGggb2YgYWxsIHZvcmJpcyBoZWFkZXJzICovCisgIGRhdGFbN10gPSAoKGxlbmd0aCkgPj4gOCkgJiAweGZmOworICBkYXRhWzhdID0gKGxlbmd0aCkgJiAweGZmOworCisgIC8qIHN0b3JlIG51bWJlciBvZiBoZWFkZXJzIG1pbnVzIG9uZS4gKi8KKyAgZGF0YVs5XSA9IG5faGVhZGVycyAtIDE7CisgIGRhdGEgKz0gMTA7CisKKyAgLyogc3RvcmUgbGVuZ3RoIGZvciBlYWNoIGhlYWRlciAqLworICBmb3IgKHdhbGsgPSBydHB2b3JiaXNwYXktPmhlYWRlcnM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZiA9IEdTVF9CVUZGRVJfQ0FTVCAod2Fsay0+ZGF0YSk7CisgICAgZ3VpbnQgYnNpemUsIHNpemUsIHRlbXA7CisgICAgZ3VpbnQgZmxhZzsKKworICAgIC8qIG9ubHkgbmVlZCB0byBzdG9yZSB0aGUgbGVuZ3RoIHdoZW4gaXQncyBub3QgdGhlIGxhc3QgaGVhZGVyICovCisgICAgaWYgKCFnX2xpc3RfbmV4dCAod2FsaykpCisgICAgICBicmVhazsKKworICAgIGJzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKworICAgIC8qIGNhbGMgc2l6ZSAqLworICAgIHNpemUgPSAwOworICAgIGRvIHsKKyAgICAgIHNpemUrKzsKKyAgICAgIGJzaXplID4+PSA3OworICAgIH0gd2hpbGUgKGJzaXplKTsKKyAgICB0ZW1wID0gc2l6ZTsKKworICAgIGJzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKyAgICAvKiB3cml0ZSB0aGUgc2l6ZSBiYWNrd2FyZHMgKi8KKyAgICBmbGFnID0gMDsKKyAgICB3aGlsZSAoc2l6ZSkgeworICAgICAgc2l6ZS0tOworICAgICAgZGF0YVtzaXplXSA9IChic2l6ZSAmIDB4N2YpIHwgZmxhZzsKKyAgICAgIGJzaXplID4+PSA3OworICAgICAgZmxhZyA9IDB4ODA7ICAgICAgICAgICAgICAvKiBGbGFnIGJpdCBvbiBhbGwgYnl0ZXMgb2YgdGhlIGxlbmd0aCBleGNlcHQgdGhlIGxhc3QgKi8KKyAgICB9CisgICAgZGF0YSArPSB0ZW1wOworICB9CisKKyAgLyogY29weSBoZWFkZXIgZGF0YSAqLworICBmb3IgKHdhbGsgPSBydHB2b3JiaXNwYXktPmhlYWRlcnM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZiA9IEdTVF9CVUZGRVJfQ0FTVCAod2Fsay0+ZGF0YSk7CisKKyAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKGJ1ZiwgMCwgZGF0YSwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSk7CisgICAgZGF0YSArPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpOworICB9CisgIHJ0cHZvcmJpc3BheS0+bmVlZF9oZWFkZXJzID0gRkFMU0U7CisKKyAgLyogc2VyaWFsaXplIHRvIGJhc2U2NCAqLworICBjb25maWd1cmF0aW9uID0gZ19iYXNlNjRfZW5jb2RlIChjb25maWcsIGNvbmZpZ2xlbik7CisKKyAgLyogc3RvcmUgZm9yIGxhdGVyIHJlLXNlbmRpbmcgKi8KKyAgZ19mcmVlIChydHB2b3JiaXNwYXktPmNvbmZpZ19kYXRhKTsKKyAgcnRwdm9yYmlzcGF5LT5jb25maWdfc2l6ZSA9IGNvbmZpZ2xlbiAtIDQgLSAzIC0gMjsKKyAgcnRwdm9yYmlzcGF5LT5jb25maWdfZGF0YSA9IGdfbWFsbG9jIChydHB2b3JiaXNwYXktPmNvbmZpZ19zaXplKTsKKyAgcnRwdm9yYmlzcGF5LT5jb25maWdfZXh0cmFfbGVuID0gZXh0cmFsZW47CisgIG1lbWNweSAocnRwdm9yYmlzcGF5LT5jb25maWdfZGF0YSwgY29uZmlnICsgNCArIDMgKyAyLAorICAgICAgcnRwdm9yYmlzcGF5LT5jb25maWdfc2l6ZSk7CisKKyAgZ19mcmVlIChjb25maWcpOworCisgIC8qIGNvbmZpZ3VyZSBwYXlsb2FkZXIgc2V0dGluZ3MgKi8KKyAgY3N0ciA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgcnRwdm9yYmlzcGF5LT5jaGFubmVscyk7CisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChiYXNlcGF5bG9hZCwgImF1ZGlvIiwgVFJVRSwgIlZPUkJJUyIsCisgICAgICBydHB2b3JiaXNwYXktPnJhdGUpOworICByZXMgPQorICAgICAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLCAiZW5jb2RpbmctcGFyYW1zIiwKKyAgICAgIEdfVFlQRV9TVFJJTkcsIGNzdHIsICJjb25maWd1cmF0aW9uIiwgR19UWVBFX1NUUklORywgY29uZmlndXJhdGlvbiwgTlVMTCk7CisgIGdfZnJlZSAoY3N0cik7CisgIGdfZnJlZSAoY29uZmlndXJhdGlvbik7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK25vX2hlYWRlcnM6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHB2b3JiaXNwYXksICJmaW5pc2ggaGVhZGVycyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfdm9yYmlzX3BheV9wYXJzZV9pZCAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwgZ3VpbnQ4ICogZGF0YSwKKyAgICBndWludCBzaXplKQoreworICBHc3RSdHBWb3JiaXNQYXkgKnJ0cHZvcmJpc3BheSA9IEdTVF9SVFBfVk9SQklTX1BBWSAoYmFzZXBheWxvYWQpOworICBndWludDggY2hhbm5lbHM7CisgIGdpbnQzMiByYXRlLCB2ZXJzaW9uOworCisgIGlmIChHX1VOTElLRUxZIChzaXplIDwgMTYpKQorICAgIGdvdG8gdG9vX3Nob3J0OworCisgIGlmIChHX1VOTElLRUxZIChtZW1jbXAgKGRhdGEsICJcMDAxdm9yYmlzIiwgNykpKQorICAgIGdvdG8gaW52YWxpZF9zdGFydDsKKyAgZGF0YSArPSA3OworCisgIGlmIChHX1VOTElLRUxZICgodmVyc2lvbiA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSkpICE9IDApKQorICAgIGdvdG8gaW52YWxpZF92ZXJzaW9uOworICBkYXRhICs9IDQ7CisKKyAgaWYgKEdfVU5MSUtFTFkgKChjaGFubmVscyA9ICpkYXRhKyspIDwgMSkpCisgICAgZ290byBpbnZhbGlkX2NoYW5uZWxzOworCisgIGlmIChHX1VOTElLRUxZICgocmF0ZSA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSkpIDwgMSkpCisgICAgZ290byBpbnZhbGlkX3JhdGU7CisKKyAgLyogYWxsIGZpbmUsIHN0b3JlIHRoZSB2YWx1ZXMgKi8KKyAgcnRwdm9yYmlzcGF5LT5jaGFubmVscyA9IGNoYW5uZWxzOworICBydHB2b3JiaXNwYXktPnJhdGUgPSByYXRlOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLwordG9vX3Nob3J0OgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGJhc2VwYXlsb2FkLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJJZGVudGlmaWNhdGlvbiBwYWNrZXQgaXMgdG9vIHNob3J0LCBuZWVkIGF0IGxlYXN0IDE2LCBnb3QgJWQiLCBzaXplKSwKKyAgICAgICAgKE5VTEwpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfc3RhcnQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYmFzZXBheWxvYWQsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIkludmFsaWQgaGVhZGVyIHN0YXJ0IGluIGlkZW50aWZpY2F0aW9uIHBhY2tldCIpLCAoTlVMTCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQoraW52YWxpZF92ZXJzaW9uOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGJhc2VwYXlsb2FkLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJJbnZhbGlkIHZlcnNpb24sIGV4cGVjdGVkIDAsIGdvdCAlZCIsIHZlcnNpb24pLCAoTlVMTCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQoraW52YWxpZF9yYXRlOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGJhc2VwYXlsb2FkLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJJbnZhbGlkIHJhdGUgJWQiLCByYXRlKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfY2hhbm5lbHM6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYmFzZXBheWxvYWQsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIkludmFsaWQgY2hhbm5lbHMgJWQiLCBjaGFubmVscyksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX3ZvcmJpc19wYXlfcGF5bG9hZF9idWZmZXIgKEdzdFJ0cFZvcmJpc1BheSAqIHJ0cHZvcmJpc3BheSwgZ3VpbnQ4IFZEVCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIsIGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsCisgICAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uLCBndWludCBub3RfaW5fbGVuZ3RoKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludCBuZXdzaXplOworICBndWludCBwYWNrZXRfbGVuOworICBHc3RDbG9ja1RpbWUgbmV3ZHVyYXRpb247CisgIGdib29sZWFuIGZsdXNoOworICBndWludCBwbGVuOworICBndWludDggKnBwb3MsICpwYXlsb2FkOworICBnYm9vbGVhbiBmcmFnbWVudGVkOworICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisKKyAgLyogc2l6ZSBpbmNyZWFzZXMgd2l0aCBwYWNrZXQgbGVuZ3RoIGFuZCAyIGJ5dGVzIHNpemUgZWFkZXIuICovCisgIG5ld2R1cmF0aW9uID0gcnRwdm9yYmlzcGF5LT5wYXlsb2FkX2R1cmF0aW9uOworICBpZiAoZHVyYXRpb24gIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICBuZXdkdXJhdGlvbiArPSBkdXJhdGlvbjsKKworICBuZXdzaXplID0gcnRwdm9yYmlzcGF5LT5wYXlsb2FkX3BvcyArIDIgKyBzaXplOworICBwYWNrZXRfbGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYWNrZXRfbGVuIChuZXdzaXplLCAwLCAwKTsKKworICAvKiBjaGVjayBidWZmZXIgZmlsbGVkIGFnYWluc3QgbGVuZ3RoIGFuZCBtYXggbGF0ZW5jeSAqLworICBmbHVzaCA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX2lzX2ZpbGxlZCAoR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHJ0cHZvcmJpc3BheSksCisgICAgICBwYWNrZXRfbGVuLCBuZXdkdXJhdGlvbik7CisgIC8qIHdlIGNhbiBzdG9yZSB1cCB0byAxNSB2b3JiaXMgcGFja2V0cyBpbiBvbmUgUlRQIHBhY2tldC4gKi8KKyAgZmx1c2ggfD0gKHJ0cHZvcmJpc3BheS0+cGF5bG9hZF9wa3RzID09IDE1KTsKKyAgLyogZmx1c2ggaWYgd2UgaGF2ZSBhIG5ldyBWRFQgKi8KKyAgaWYgKHJ0cHZvcmJpc3BheS0+cGFja2V0KQorICAgIGZsdXNoIHw9IChydHB2b3JiaXNwYXktPnBheWxvYWRfVkRUICE9IFZEVCk7CisgIGlmIChmbHVzaCkKKyAgICByZXQgPSBnc3RfcnRwX3ZvcmJpc19wYXlfZmx1c2hfcGFja2V0IChydHB2b3JiaXNwYXkpOworCisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBkb25lOworCisgIC8qIGNyZWF0ZSBuZXcgcGFja2V0IGlmIHdlIG11c3QgKi8KKyAgaWYgKCFydHB2b3JiaXNwYXktPnBhY2tldCkgeworICAgIGdzdF9ydHBfdm9yYmlzX3BheV9pbml0X3BhY2tldCAocnRwdm9yYmlzcGF5LCBWRFQsIHRpbWVzdGFtcCk7CisgIH0KKworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKHJ0cHZvcmJpc3BheS0+cGFja2V0LCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKyAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKTsKKyAgcHBvcyA9IHBheWxvYWQgKyBydHB2b3JiaXNwYXktPnBheWxvYWRfcG9zOworICBmcmFnbWVudGVkID0gRkFMU0U7CisKKyAgLyogcHV0IGJ1ZmZlciBpbiBwYWNrZXQsIGl0IGVpdGhlciBmaXRzIGNvbXBsZXRlbHkgb3IgbmVlZHMgdG8gYmUgZnJhZ21lbnRlZAorICAgKiBvdmVyIG11bHRpcGxlIFJUUCBwYWNrZXRzLiAqLworICBkbyB7CisgICAgcGxlbiA9IE1JTiAocnRwdm9yYmlzcGF5LT5wYXlsb2FkX2xlZnQgLSAyLCBzaXplKTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChydHB2b3JiaXNwYXksICJhcHBlbmQgJXUgYnl0ZXMiLCBwbGVuKTsKKworICAgIC8qIGRhdGEgaXMgY29waWVkIGluIHRoZSBwYXlsb2FkIHdpdGggYSAyIGJ5dGUgbGVuZ3RoIGhlYWRlciAqLworICAgIHBwb3NbMF0gPSAoKHBsZW4gLSBub3RfaW5fbGVuZ3RoKSA+PiA4KSAmIDB4ZmY7CisgICAgcHBvc1sxXSA9ICgocGxlbiAtIG5vdF9pbl9sZW5ndGgpICYgMHhmZik7CisgICAgaWYgKHBsZW4pCisgICAgICBtZW1jcHkgKCZwcG9zWzJdLCBkYXRhLCBwbGVuKTsKKworICAgIGlmIChidWZmZXIpIHsKKyAgICAgIGlmICghcnRwdm9yYmlzcGF5LT5wYWNrZXRfYnVmZmVycworICAgICAgICAgIHx8IHJ0cHZvcmJpc3BheS0+cGFja2V0X2J1ZmZlcnMtPmRhdGEgIT0gKGdwb2ludGVyKSBidWZmZXIpCisgICAgICAgIHJ0cHZvcmJpc3BheS0+cGFja2V0X2J1ZmZlcnMgPQorICAgICAgICAgICAgZ19saXN0X3ByZXBlbmQgKHJ0cHZvcmJpc3BheS0+cGFja2V0X2J1ZmZlcnMsCisgICAgICAgICAgICBnc3RfYnVmZmVyX3JlZiAoYnVmZmVyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdMaXN0ICpsOworCisgICAgICBmb3IgKGwgPSBydHB2b3JiaXNwYXktPmhlYWRlcnM7IGw7IGwgPSBsLT5uZXh0KQorICAgICAgICBydHB2b3JiaXNwYXktPnBhY2tldF9idWZmZXJzID0KKyAgICAgICAgICAgIGdfbGlzdF9wcmVwZW5kIChydHB2b3JiaXNwYXktPnBhY2tldF9idWZmZXJzLAorICAgICAgICAgICAgZ3N0X2J1ZmZlcl9yZWYgKGwtPmRhdGEpKTsKKyAgICB9CisKKyAgICAvKiBvbmx5IGZpcnN0IChvbmx5KSBjb25maWd1cmF0aW9uIGN1dHMgbGVuZ3RoIGZpZWxkICovCisgICAgLyogTk9URTogc3BlYyAoaWYgYW55KSBpcyBub3QgY2xlYXIgb24gdGhpcyAuLi4gKi8KKyAgICBub3RfaW5fbGVuZ3RoID0gMDsKKworICAgIHNpemUgLT0gcGxlbjsKKyAgICBkYXRhICs9IHBsZW47CisKKyAgICBydHB2b3JiaXNwYXktPnBheWxvYWRfcG9zICs9IHBsZW4gKyAyOworICAgIHJ0cHZvcmJpc3BheS0+cGF5bG9hZF9sZWZ0IC09IHBsZW4gKyAyOworCisgICAgaWYgKGZyYWdtZW50ZWQpIHsKKyAgICAgIGlmIChzaXplID09IDApCisgICAgICAgIC8qIGxhc3QgZnJhZ21lbnQsIHNldCBGIHRvIDB4My4gKi8KKyAgICAgICAgcnRwdm9yYmlzcGF5LT5wYXlsb2FkX0YgPSAweDM7CisgICAgICBlbHNlCisgICAgICAgIC8qIGZyYWdtZW50IGNvbnRpbnVlcywgc2V0IEYgdG8gMHgyLiAqLworICAgICAgICBydHB2b3JiaXNwYXktPnBheWxvYWRfRiA9IDB4MjsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIC8qIGZyYWdtZW50ZWQgcGFja2V0IHN0YXJ0cywgc2V0IEYgdG8gMHgxLCBtYXJrIG91cnNlbHZlcyBhcworICAgICAgICAgKiBmcmFnbWVudGVkLiAqLworICAgICAgICBydHB2b3JiaXNwYXktPnBheWxvYWRfRiA9IDB4MTsKKyAgICAgICAgZnJhZ21lbnRlZCA9IFRSVUU7CisgICAgICB9CisgICAgfQorICAgIGlmIChmcmFnbWVudGVkKSB7CisgICAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisgICAgICAvKiBmcmFnbWVudGVkIHBhY2tldHMgYXJlIGFsd2F5cyBmbHVzaGVkIGFuZCBoYXZlIHB0a3Mgb2YgMCAqLworICAgICAgcnRwdm9yYmlzcGF5LT5wYXlsb2FkX3BrdHMgPSAwOworICAgICAgcmV0ID0gZ3N0X3J0cF92b3JiaXNfcGF5X2ZsdXNoX3BhY2tldCAocnRwdm9yYmlzcGF5KTsKKworICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIC8qIHN0YXJ0IG5ldyBwYWNrZXQgYW5kIGdldCBwb2ludGVycy4gVkRUIHN0YXlzIHRoZSBzYW1lLiAqLworICAgICAgICBnc3RfcnRwX3ZvcmJpc19wYXlfaW5pdF9wYWNrZXQgKHJ0cHZvcmJpc3BheSwKKyAgICAgICAgICAgIHJ0cHZvcmJpc3BheS0+cGF5bG9hZF9WRFQsIHRpbWVzdGFtcCk7CisgICAgICAgIGdzdF9ydHBfYnVmZmVyX21hcCAocnRwdm9yYmlzcGF5LT5wYWNrZXQsIEdTVF9NQVBfV1JJVEUsICZydHApOworICAgICAgICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHApOworICAgICAgICBwcG9zID0gcGF5bG9hZCArIHJ0cHZvcmJpc3BheS0+cGF5bG9hZF9wb3M7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHVuZnJhZ21lbnRlZCBwYWNrZXQsIHVwZGF0ZSBzdGF0cyBmb3IgbmV4dCBwYWNrZXQsIHNpemUgPT0gMCBhbmQgd2UKKyAgICAgICAqIGV4aXQgdGhlIHdoaWxlIGxvb3AgKi8KKyAgICAgIHJ0cHZvcmJpc3BheS0+cGF5bG9hZF9wa3RzKys7CisgICAgICBpZiAoZHVyYXRpb24gIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICAgICAgcnRwdm9yYmlzcGF5LT5wYXlsb2FkX2R1cmF0aW9uICs9IGR1cmF0aW9uOworICAgIH0KKyAgfSB3aGlsZSAoc2l6ZSAmJiByZXQgPT0gR1NUX0ZMT1dfT0spOworCisgIGlmIChydHAuYnVmZmVyKQorICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworZG9uZToKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF92b3JiaXNfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSdHBWb3JiaXNQYXkgKnJ0cHZvcmJpc3BheTsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdE1hcEluZm8gbWFwOworICBnc2l6ZSBzaXplOworICBndWludDggKmRhdGE7CisgIEdzdENsb2NrVGltZSBkdXJhdGlvbiwgdGltZXN0YW1wOworICBndWludDggVkRUOworCisgIHJ0cHZvcmJpc3BheSA9IEdTVF9SVFBfVk9SQklTX1BBWSAoYmFzZXBheWxvYWQpOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKyAgc2l6ZSA9IG1hcC5zaXplOworICBkdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcik7CisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworCisgIEdTVF9MT0dfT0JKRUNUIChydHB2b3JiaXNwYXksICJzaXplICUiIEdfR1NJWkVfRk9STUFUCisgICAgICAiLCBkdXJhdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQsIHNpemUsIEdTVF9USU1FX0FSR1MgKGR1cmF0aW9uKSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHNpemUgPCAxKSkKKyAgICBnb3RvIHdyb25nX3NpemU7CisKKyAgLyogZmluZCBwYWNrZXQgdHlwZSAqLworICBpZiAoZGF0YVswXSAmIDEpIHsKKyAgICAvKiBoZWFkZXIgKi8KKyAgICBpZiAoZGF0YVswXSA9PSAxKSB7CisgICAgICAvKiBpZGVudGlmaWNhdGlvbiwgd2UgbmVlZCB0byBwYXJzZSB0aGlzIGluIG9yZGVyIHRvIGdldCB0aGUgY2xvY2sgcmF0ZS4gKi8KKyAgICAgIGlmIChHX1VOTElLRUxZICghZ3N0X3J0cF92b3JiaXNfcGF5X3BhcnNlX2lkIChiYXNlcGF5bG9hZCwgZGF0YSwgc2l6ZSkpKQorICAgICAgICBnb3RvIHBhcnNlX2lkX2ZhaWxlZDsKKyAgICAgIFZEVCA9IDE7CisgICAgfSBlbHNlIGlmIChkYXRhWzBdID09IDMpIHsKKyAgICAgIC8qIGNvbW1lbnQgKi8KKyAgICAgIFZEVCA9IDI7CisgICAgfSBlbHNlIGlmIChkYXRhWzBdID09IDUpIHsKKyAgICAgIC8qIHNldHVwICovCisgICAgICBWRFQgPSAxOworICAgIH0gZWxzZQorICAgICAgZ290byB1bmtub3duX2hlYWRlcjsKKyAgfSBlbHNlCisgICAgLyogZGF0YSAqLworICAgIFZEVCA9IDA7CisKKyAgLyogd2UgbmVlZCB0byBjb2xsZWN0IHRoZSBoZWFkZXJzIGFuZCBjb25zdHJ1Y3QgYSBjb25maWcgc3RyaW5nIGZyb20gdGhlbSAqLworICBpZiAoVkRUICE9IDApIHsKKyAgICBydHB2b3JiaXNwYXktPm5lZWRfaGVhZGVycyA9IFRSVUU7CisgICAgaWYgKCFydHB2b3JiaXNwYXktPm5lZWRfaGVhZGVycyAmJiBWRFQgPT0gMSkgeworICAgICAgR1NUX0lORk9fT0JKRUNUIChydHB2b3JiaXNwYXksICJnZXR0aW5nIG5ldyBoZWFkZXJzLCByZXBsYWNlIGV4aXN0aW5nIik7CisgICAgICBnX2xpc3RfZnJlZV9mdWxsIChydHB2b3JiaXNwYXktPmhlYWRlcnMsCisgICAgICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnc3RfYnVmZmVyX3VucmVmKTsKKyAgICAgIHJ0cHZvcmJpc3BheS0+aGVhZGVycyA9IE5VTEw7CisgICAgfQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHZvcmJpc3BheSwgImNvbGxlY3RpbmcgaGVhZGVyIik7CisgICAgLyogYXBwZW5kIGhlYWRlciB0byB0aGUgbGlzdCBvZiBoZWFkZXJzLCBvciByZXBsYWNlCisgICAgICogaWYgdGhlIHNhbWUgdHlwZSBvZiBoZWFkZXIgd2FzIGFscmVhZHkgaW4gdGhlcmUuCisgICAgICoKKyAgICAgKiBUaGlzIHByZXZlbnRzIHN0b3JpbmcgYW4gaW5maW5pdGUgYW1vdW50IG9mIGUuZy4gY29tbWVudCBoZWFkZXJzLCB0aGVyZQorICAgICAqIG11c3Qgb25seSBiZSBvbmUgKi8KKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgICAgaWYgKHJ0cHZvcmJpc3BheS0+aGVhZGVycykgeworICAgICAgZ2Jvb2xlYW4gZm91bmQgPSBGQUxTRTsKKyAgICAgIEdMaXN0ICpsOworICAgICAgZ3VpbnQ4IG5ld19oZWFkZXJfdHlwZTsKKworICAgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChidWZmZXIsIDAsICZuZXdfaGVhZGVyX3R5cGUsIDEpOworCisgICAgICBmb3IgKGwgPSBydHB2b3JiaXNwYXktPmhlYWRlcnM7IGw7IGwgPSBsLT5uZXh0KSB7CisgICAgICAgIEdzdEJ1ZmZlciAqaGVhZGVyID0gbC0+ZGF0YTsKKyAgICAgICAgZ3VpbnQ4IGhlYWRlcl90eXBlOworCisgICAgICAgIGlmIChnc3RfYnVmZmVyX2V4dHJhY3QgKGhlYWRlciwgMCwgJmhlYWRlcl90eXBlLCAxKQorICAgICAgICAgICAgJiYgaGVhZGVyX3R5cGUgPT0gbmV3X2hlYWRlcl90eXBlKSB7CisgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGhlYWRlcik7CisgICAgICAgICAgbC0+ZGF0YSA9IGJ1ZmZlcjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFmb3VuZCkKKyAgICAgICAgcnRwdm9yYmlzcGF5LT5oZWFkZXJzID0gZ19saXN0X2FwcGVuZCAocnRwdm9yYmlzcGF5LT5oZWFkZXJzLCBidWZmZXIpOworICAgIH0gZWxzZSB7CisgICAgICBydHB2b3JiaXNwYXktPmhlYWRlcnMgPSBnX2xpc3RfYXBwZW5kIChydHB2b3JiaXNwYXktPmhlYWRlcnMsIGJ1ZmZlcik7CisgICAgfQorCisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgZ290byBkb25lOworICB9IGVsc2UgaWYgKHJ0cHZvcmJpc3BheS0+aGVhZGVycyAmJiBydHB2b3JiaXNwYXktPm5lZWRfaGVhZGVycykgeworICAgIGlmICghZ3N0X3J0cF92b3JiaXNfcGF5X2ZpbmlzaF9oZWFkZXJzIChiYXNlcGF5bG9hZCkpCisgICAgICBnb3RvIGhlYWRlcl9lcnJvcjsKKyAgfQorCisgIC8qIHRoZXJlIGlzIGEgY29uZmlnIHJlcXVlc3QsIHNlZSBpZiB3ZSBuZWVkIHRvIGluc2VydCBpdCAqLworICBpZiAocnRwdm9yYmlzcGF5LT5jb25maWdfaW50ZXJ2YWwgPiAwICYmIHJ0cHZvcmJpc3BheS0+Y29uZmlnX2RhdGEpIHsKKyAgICBnYm9vbGVhbiBzZW5kX2NvbmZpZyA9IEZBTFNFOworCisgICAgaWYgKHJ0cHZvcmJpc3BheS0+bGFzdF9jb25maWcgIT0gLTEpIHsKKyAgICAgIGd1aW50NjQgZGlmZjsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cHZvcmJpc3BheSwKKyAgICAgICAgICAibm93ICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBsYXN0IGNvbmZpZyAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSwgR1NUX1RJTUVfQVJHUyAocnRwdm9yYmlzcGF5LT5sYXN0X2NvbmZpZykpOworCisgICAgICAvKiBjYWxjdWxhdGUgZGlmZiBiZXR3ZWVuIGxhc3QgY29uZmlnIGluIG1pbGxpc2Vjb25kcyAqLworICAgICAgaWYgKHRpbWVzdGFtcCA+IHJ0cHZvcmJpc3BheS0+bGFzdF9jb25maWcpIHsKKyAgICAgICAgZGlmZiA9IHRpbWVzdGFtcCAtIHJ0cHZvcmJpc3BheS0+bGFzdF9jb25maWc7CisgICAgICB9IGVsc2UgeworICAgICAgICBkaWZmID0gMDsKKyAgICAgIH0KKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwdm9yYmlzcGF5LAorICAgICAgICAgICJpbnRlcnZhbCBzaW5jZSBsYXN0IGNvbmZpZyAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGRpZmYpKTsKKworICAgICAgLyogYmlnZ2VyIHRoYW4gaW50ZXJ2YWwsIHF1ZXVlIGNvbmZpZyAqLworICAgICAgLyogRklYTUUgc2hvdWxkIGNvbnZlcnQgdGltZXN0YW1wcyB0byBydW5uaW5nIHRpbWUgKi8KKyAgICAgIGlmIChHU1RfVElNRV9BU19TRUNPTkRTIChkaWZmKSA+PSBydHB2b3JiaXNwYXktPmNvbmZpZ19pbnRlcnZhbCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHB2b3JiaXNwYXksICJ0aW1lIHRvIHNlbmQgY29uZmlnIik7CisgICAgICAgIHNlbmRfY29uZmlnID0gVFJVRTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogbm8ga25vd24gcHJldmlvdXMgY29uZmlnIHRpbWUsIHNlbmQgbm93ICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHB2b3JiaXNwYXksICJubyBwcmV2aW91cyBjb25maWcgdGltZSwgc2VuZCBub3ciKTsKKyAgICAgIHNlbmRfY29uZmlnID0gVFJVRTsKKyAgICB9CisKKyAgICBpZiAoc2VuZF9jb25maWcpIHsKKyAgICAgIC8qIHdlIG5lZWQgdG8gc2VuZCBjb25maWcgbm93IGZpcnN0ICovCisgICAgICAvKiBkaWZmZXJlbnQgVERUIHR5cGUgZm9yY2VzIGZsdXNoICovCisgICAgICBnc3RfcnRwX3ZvcmJpc19wYXlfcGF5bG9hZF9idWZmZXIgKHJ0cHZvcmJpc3BheSwgMSwKKyAgICAgICAgICBOVUxMLCBydHB2b3JiaXNwYXktPmNvbmZpZ19kYXRhLCBydHB2b3JiaXNwYXktPmNvbmZpZ19zaXplLAorICAgICAgICAgIHRpbWVzdGFtcCwgR1NUX0NMT0NLX1RJTUVfTk9ORSwgcnRwdm9yYmlzcGF5LT5jb25maWdfZXh0cmFfbGVuKTsKKworICAgICAgaWYgKHRpbWVzdGFtcCAhPSAtMSkgeworICAgICAgICBydHB2b3JiaXNwYXktPmxhc3RfY29uZmlnID0gdGltZXN0YW1wOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldCA9CisgICAgICBnc3RfcnRwX3ZvcmJpc19wYXlfcGF5bG9hZF9idWZmZXIgKHJ0cHZvcmJpc3BheSwgVkRULCBidWZmZXIsIGRhdGEsIHNpemUsCisgICAgICB0aW1lc3RhbXAsIGR1cmF0aW9uLCAwKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCitkb25lOgorICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLword3Jvbmdfc2l6ZToKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cHZvcmJpc3BheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgICgiSW52YWxpZCBwYWNrZXQgc2l6ZSAoMSA8ICUiIEdfR1NJWkVfRk9STUFUICIpIiwgc2l6ZSksIChOVUxMKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorcGFyc2VfaWRfZmFpbGVkOgorICB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQordW5rbm93bl9oZWFkZXI6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHB2b3JiaXNwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiSWdub3JpbmcgdW5rbm93biBoZWFkZXIgcmVjZWl2ZWQiKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQoraGVhZGVyX2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwdm9yYmlzcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIkVycm9yIGluaXRpYWxpemluZyBoZWFkZXIgY29uZmlnIikpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3ZvcmJpc19wYXlfc2lua19ldmVudCAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBWb3JiaXNQYXkgKnJ0cHZvcmJpc3BheSA9IEdTVF9SVFBfVk9SQklTX1BBWSAocGF5bG9hZCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9ydHBfdm9yYmlzX3BheV9jbGVhcl9wYWNrZXQgKHJ0cHZvcmJpc3BheSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgLyogZmFsc2UgdG8gbGV0IHBhcmVudCBoYW5kbGUgZXZlbnQgYXMgd2VsbCAqLworICByZXR1cm4gR1NUX1JUUF9CQVNFX1BBWUxPQURfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNpbmtfZXZlbnQgKHBheWxvYWQsIGV2ZW50KTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX3ZvcmJpc19wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RSdHBWb3JiaXNQYXkgKnJ0cHZvcmJpc3BheTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHJ0cHZvcmJpc3BheSA9IEdTVF9SVFBfVk9SQklTX1BBWSAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9ydHBfdm9yYmlzX3BheV9jbGVhbnVwIChydHB2b3JiaXNwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3ZvcmJpc19wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cFZvcmJpc1BheSAqcnRwdm9yYmlzcGF5OworCisgIHJ0cHZvcmJpc3BheSA9IEdTVF9SVFBfVk9SQklTX1BBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ09ORklHX0lOVEVSVkFMOgorICAgICAgcnRwdm9yYmlzcGF5LT5jb25maWdfaW50ZXJ2YWwgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdm9yYmlzX3BheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwVm9yYmlzUGF5ICpydHB2b3JiaXNwYXk7CisKKyAgcnRwdm9yYmlzcGF5ID0gR1NUX1JUUF9WT1JCSVNfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DT05GSUdfSU5URVJWQUw6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnRwdm9yYmlzcGF5LT5jb25maWdfaW50ZXJ2YWwpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2dib29sZWFuCitnc3RfcnRwX3ZvcmJpc19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHB2b3JiaXNwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfVk9SQklTX1BBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5oIGIvZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQ2OTNhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuaApAQCAtMCwwICsxLDg1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfVk9SQklTX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1ZPUkJJU19QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9WT1JCSVNfUEFZIFwKKyAgKGdzdF9ydHBfdm9yYmlzX3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX1ZPUkJJU19QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfVk9SQklTX1BBWSxHc3RSdHBWb3JiaXNQYXkpKQorI2RlZmluZSBHU1RfUlRQX1ZPUkJJU19QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX1ZPUkJJU19QQVksR3N0UnRwVm9yYmlzUGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1ZPUkJJU19QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfVk9SQklTX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfVk9SQklTX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfVk9SQklTX1BBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBWb3JiaXNQYXkgR3N0UnRwVm9yYmlzUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFZvcmJpc1BheUNsYXNzIEdzdFJ0cFZvcmJpc1BheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cFZvcmJpc1BheQoreworICBHc3RSVFBCYXNlUGF5bG9hZCBwYXlsb2FkOworCisgIC8qIHRoZSBoZWFkZXJzICovCisgIGdib29sZWFuICAgICAgbmVlZF9oZWFkZXJzOworICBHTGlzdCAgICAgICAgKmhlYWRlcnM7CisKKyAgLyogcXVldWVzIG9mIGJ1ZmZlcnMgYWxvbmcgd2l0aCBzb21lIHN0YXRzLiAqLworICBHc3RCdWZmZXIgICAgKnBhY2tldDsKKyAgR0xpc3QgICAgICAgICpwYWNrZXRfYnVmZmVyczsKKyAgZ3VpbnQgICAgICAgICBwYXlsb2FkX3BvczsKKyAgZ3VpbnQgICAgICAgICBwYXlsb2FkX2xlZnQ7CisgIGd1aW50MzIgICAgICAgcGF5bG9hZF9pZGVudDsKKyAgZ3VpbnQ4ICAgICAgICBwYXlsb2FkX0Y7CisgIGd1aW50OCAgICAgICAgcGF5bG9hZF9WRFQ7CisgIGd1aW50ICAgICAgICAgcGF5bG9hZF9wa3RzOworICBHc3RDbG9ja1RpbWUgIHBheWxvYWRfdGltZXN0YW1wOworICBHc3RDbG9ja1RpbWUgIHBheWxvYWRfZHVyYXRpb247CisKKyAgLyogY29uZmlnIChyZS1zZW5kaW5nKSAqLworICBndWludDggICAgICAgKmNvbmZpZ19kYXRhOworICBndWludCAgICAgICAgIGNvbmZpZ19zaXplOworICBndWludCAgICAgICAgIGNvbmZpZ19leHRyYV9sZW47CisgIGd1aW50ICAgICAgICAgY29uZmlnX2ludGVydmFsOworICBHc3RDbG9ja1RpbWUgIGxhc3RfY29uZmlnOworCisgIGdpbnQgICAgICAgICAgcmF0ZTsKKyAgZ2ludCAgICAgICAgICBjaGFubmVsczsKK307CisKK3N0cnVjdCBfR3N0UnRwVm9yYmlzUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX3ZvcmJpc19wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX3ZvcmJpc19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfVk9SQklTX1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwdnA4ZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwdnA4ZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzBkNzA3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5jCkBAIC0wLDAgKzEsMjkyIEBACisvKiBnc3RydHB2cDhkZXBheS5jIC0gU291cmNlIGZvciBHc3RSdHBWUDhEZXBheQorICogQ29weXJpZ2h0IChDKSAyMDExIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBDb2xsYWJvcmEgTHRkLgorICogICBDb250YWN0OiBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0cnRwdnA4ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfcnRwX3ZwOF9kZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfcnRwX3ZwOF9kZXBheV9kZWJ1ZworCitzdGF0aWMgdm9pZCBnc3RfcnRwX3ZwOF9kZXBheV9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfdnA4X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX3ZwOF9kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKgorICAgIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfdnA4X2RlcGF5X2hhbmRsZV9ldmVudCAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCitHX0RFRklORV9UWVBFIChHc3RSdHBWUDhEZXBheSwgZ3N0X3J0cF92cDhfZGVwYXksIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3ZwOF9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtdnA4IikpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF92cDhfZGVwYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwLCIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSB7IFwiVlA4XCIsIFwiVlA4LURSQUZULUlFVEYtMDFcIiB9IikpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF92cDhfZGVwYXlfaW5pdCAoR3N0UnRwVlA4RGVwYXkgKiBzZWxmKQoreworICBzZWxmLT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworICBzZWxmLT5zdGFydGVkID0gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3ZwOF9kZXBheV9jbGFzc19pbml0IChHc3RSdHBWUDhEZXBheUNsYXNzICogZ3N0X3J0cF92cDhfZGVwYXlfY2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGdzdF9ydHBfdnA4X2RlcGF5X2NsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGdzdF9ydHBfdnA4X2RlcGF5X2NsYXNzKTsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpkZXBheV9jbGFzcyA9CisgICAgICAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIChnc3RfcnRwX3ZwOF9kZXBheV9jbGFzcyk7CisKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3ZwOF9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF92cDhfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiUlRQIFZQOCBkZXBheWxvYWRlciIsCisgICAgICAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIFZQOCB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzKSIsCisgICAgICAiU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PiIpOworCisgIG9iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF9ydHBfdnA4X2RlcGF5X2Rpc3Bvc2U7CisKKyAgZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3J0cF92cDhfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIGRlcGF5X2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX3ZwOF9kZXBheV9wcm9jZXNzOworICBkZXBheV9jbGFzcy0+aGFuZGxlX2V2ZW50ID0gZ3N0X3J0cF92cDhfZGVwYXlfaGFuZGxlX2V2ZW50OworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfcnRwX3ZwOF9kZXBheV9kZWJ1ZywgInJ0cHZwOGRlcGF5IiwgMCwKKyAgICAgICJWUDggVmlkZW8gUlRQIERlcGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3ZwOF9kZXBheV9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSdHBWUDhEZXBheSAqc2VsZiA9IEdTVF9SVFBfVlA4X0RFUEFZIChvYmplY3QpOworCisgIGlmIChzZWxmLT5hZGFwdGVyICE9IE5VTEwpCisgICAgZ19vYmplY3RfdW5yZWYgKHNlbGYtPmFkYXB0ZXIpOworICBzZWxmLT5hZGFwdGVyID0gTlVMTDsKKworICAvKiByZWxlYXNlIGFueSByZWZlcmVuY2VzIGhlbGQgYnkgdGhlIG9iamVjdCBoZXJlICovCisKKyAgaWYgKEdfT0JKRUNUX0NMQVNTIChnc3RfcnRwX3ZwOF9kZXBheV9wYXJlbnRfY2xhc3MpLT5kaXNwb3NlKQorICAgIEdfT0JKRUNUX0NMQVNTIChnc3RfcnRwX3ZwOF9kZXBheV9wYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfdnA4X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheSwgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RSdHBWUDhEZXBheSAqc2VsZiA9IEdTVF9SVFBfVlA4X0RFUEFZIChkZXBheSk7CisgIEdzdEJ1ZmZlciAqcGF5bG9hZDsKKyAgZ3VpbnQ4ICpkYXRhOworICBndWludCBoZHJzaXplOworICBndWludCBzaXplOworCisgIGlmIChHX1VOTElLRUxZIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKHJ0cC0+YnVmZmVyKSkpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoc2VsZiwgIkRpc2NvbnRpbnVpdHksIGZsdXNoaW5nIGFkYXB0ZXIiKTsKKyAgICBnc3RfYWRhcHRlcl9jbGVhciAoc2VsZi0+YWRhcHRlcik7CisgICAgc2VsZi0+c3RhcnRlZCA9IEZBTFNFOworICB9CisKKyAgc2l6ZSA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAocnRwKTsKKworICAvKiBBdCBsZWFzdCBvbmUgaGVhZGVyIGFuZCBvbmUgdnA4IGJ5dGUgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKHNpemUgPCAyKSkKKyAgICBnb3RvIHRvb19zbWFsbDsKKworICBkYXRhID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFzZWxmLT5zdGFydGVkKSkgeworICAgIC8qIENoZWNrIGlmIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgVlA4IGZyYW1lLCBvdGhlcndpc2UgYmFpbCAqLworICAgIC8qIFM9MSBhbmQgUGFydElEPSAwICovCisgICAgaWYgKChkYXRhWzBdICYgMHgxNykgIT0gMHgxMCkKKyAgICAgIGdvdG8gZG9uZTsKKworICAgIHNlbGYtPnN0YXJ0ZWQgPSBUUlVFOworICB9CisKKyAgaGRyc2l6ZSA9IDE7CisgIC8qIENoZWNrIFggb3B0aW9uYWwgaGVhZGVyICovCisgIGlmICgoZGF0YVswXSAmIDB4ODApICE9IDApIHsKKyAgICBoZHJzaXplKys7CisgICAgLyogQ2hlY2sgSSBvcHRpb25hbCBoZWFkZXIgKi8KKyAgICBpZiAoKGRhdGFbMV0gJiAweDgwKSAhPSAwKSB7CisgICAgICBpZiAoR19VTkxJS0VMWSAoc2l6ZSA8IDMpKQorICAgICAgICBnb3RvIHRvb19zbWFsbDsKKyAgICAgIGhkcnNpemUrKzsKKyAgICAgIC8qIENoZWNrIGZvciAxNiBiaXRzIFBpY3R1cmVJRCAqLworICAgICAgaWYgKChkYXRhWzJdICYgMHg4MCkgIT0gMCkKKyAgICAgICAgaGRyc2l6ZSsrOworICAgIH0KKyAgICAvKiBDaGVjayBMIG9wdGlvbmFsIGhlYWRlciAqLworICAgIGlmICgoZGF0YVsxXSAmIDB4NDApICE9IDApCisgICAgICBoZHJzaXplKys7CisgICAgLyogQ2hlY2sgVCBvciBLIG9wdGlvbmFsIGhlYWRlcnMgKi8KKyAgICBpZiAoKGRhdGFbMV0gJiAweDIwKSAhPSAwIHx8IChkYXRhWzFdICYgMHgxMCkgIT0gMCkKKyAgICAgIGhkcnNpemUrKzsKKyAgfQorICBHU1RfREVCVUdfT0JKRUNUIChkZXBheSwgImhkcnNpemUgJXUsIHNpemUgJXUiLCBoZHJzaXplLCBzaXplKTsKKworICBpZiAoR19VTkxJS0VMWSAoaGRyc2l6ZSA+PSBzaXplKSkKKyAgICBnb3RvIHRvb19zbWFsbDsKKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfc3ViYnVmZmVyIChydHAsIGhkcnNpemUsIC0xKTsKKyAgZ3N0X2FkYXB0ZXJfcHVzaCAoc2VsZi0+YWRhcHRlciwgcGF5bG9hZCk7CisKKyAgLyogTWFya2VyIGluZGljYXRlcyB0aGF0IGl0IHdhcyB0aGUgbGFzdCBydHAgcGFja2V0IGZvciB0aGlzIGZyYW1lICovCisgIGlmIChnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApKSB7CisgICAgR3N0QnVmZmVyICpvdXQ7CisgICAgZ3VpbnQ4IGhlYWRlclsxMF07CisKKyAgICBpZiAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChzZWxmLT5hZGFwdGVyKSA8IDEwKQorICAgICAgZ290byB0b29fc21hbGw7CisgICAgZ3N0X2FkYXB0ZXJfY29weSAoc2VsZi0+YWRhcHRlciwgJmhlYWRlciwgMCwgMTApOworCisgICAgb3V0ID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHNlbGYtPmFkYXB0ZXIsCisgICAgICAgIGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoc2VsZi0+YWRhcHRlcikpOworCisgICAgc2VsZi0+c3RhcnRlZCA9IEZBTFNFOworCisgICAgLyogbWFyayBrZXlmcmFtZXMgKi8KKyAgICBvdXQgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKG91dCk7CisgICAgLyogRmlsdGVyIGF3YXkgYWxsIG1ldGFzIHRoYXQgYXJlIG5vdCBzZW5zaWJsZSB0byBjb3B5ICovCisgICAgZ3N0X3J0cF9kcm9wX25vbl92aWRlb19tZXRhIChzZWxmLCBvdXQpOworICAgIGlmICgoaGVhZGVyWzBdICYgMHgwMSkpIHsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dCwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgICAgICBpZiAoIXNlbGYtPmNhcHNfc2VudCkgeworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChvdXQpOworICAgICAgICBvdXQgPSBOVUxMOworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHNlbGYsICJEcm9wcGluZyBpbnRlci1mcmFtZSBiZWZvcmUgaW50cmEtZnJhbWUiKTsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NJTktQQUQgKGRlcGF5KSwKKyAgICAgICAgICAgIGdzdF92aWRlb19ldmVudF9uZXdfdXBzdHJlYW1fZm9yY2Vfa2V5X3VuaXQgKEdTVF9DTE9DS19USU1FX05PTkUsCisgICAgICAgICAgICAgICAgVFJVRSwgMCkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBndWludCBwcm9maWxlLCB3aWR0aCwgaGVpZ2h0OworCisgICAgICBHU1RfQlVGRkVSX0ZMQUdfVU5TRVQgKG91dCwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgICAgICBwcm9maWxlID0gKGhlYWRlclswXSAmIDB4MGUpID4+IDE7CisgICAgICB3aWR0aCA9IEdTVF9SRUFEX1VJTlQxNl9MRSAoaGVhZGVyICsgNikgJiAweDNmZmY7CisgICAgICBoZWlnaHQgPSBHU1RfUkVBRF9VSU5UMTZfTEUgKGhlYWRlciArIDgpICYgMHgzZmZmOworCisgICAgICBpZiAoR19VTkxJS0VMWSAoc2VsZi0+bGFzdF93aWR0aCAhPSB3aWR0aCB8fAorICAgICAgICAgICAgICBzZWxmLT5sYXN0X2hlaWdodCAhPSBoZWlnaHQgfHwgc2VsZi0+bGFzdF9wcm9maWxlICE9IHByb2ZpbGUpKSB7CisgICAgICAgIGdjaGFyIHByb2ZpbGVfc3RyWzNdOworICAgICAgICBHc3RDYXBzICpzcmNjYXBzOworCisgICAgICAgIHNucHJpbnRmIChwcm9maWxlX3N0ciwgMywgIiV1IiwgcHJvZmlsZSk7CisgICAgICAgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC12cDgiLAorICAgICAgICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLCAwLCAxLAorICAgICAgICAgICAgImhlaWdodCIsIEdfVFlQRV9JTlQsIGhlaWdodCwKKyAgICAgICAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHdpZHRoLAorICAgICAgICAgICAgInByb2ZpbGUiLCBHX1RZUEVfU1RSSU5HLCBwcm9maWxlX3N0ciwgTlVMTCk7CisKKyAgICAgICAgZ3N0X3BhZF9zZXRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKGRlcGF5KSwgc3JjY2Fwcyk7CisgICAgICAgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICAgICAgICBzZWxmLT5jYXBzX3NlbnQgPSBUUlVFOworICAgICAgICBzZWxmLT5sYXN0X3dpZHRoID0gd2lkdGg7CisgICAgICAgIHNlbGYtPmxhc3RfaGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBzZWxmLT5sYXN0X3Byb2ZpbGUgPSBwcm9maWxlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvdXQ7CisgIH0KKworZG9uZToKKyAgcmV0dXJuIE5VTEw7CisKK3Rvb19zbWFsbDoKKyAgR1NUX0xPR19PQkpFQ1QgKHNlbGYsICJJbnZhbGlkIHJ0cCBwYWNrZXQgKHRvbyBzbWFsbCksIGlnbm9yaW5nIik7CisgIGdzdF9hZGFwdGVyX2NsZWFyIChzZWxmLT5hZGFwdGVyKTsKKyAgc2VsZi0+c3RhcnRlZCA9IEZBTFNFOworCisgIGdvdG8gZG9uZTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX3ZwOF9kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RSdHBWUDhEZXBheSAqc2VsZiA9IEdTVF9SVFBfVlA4X0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgc2VsZi0+bGFzdF9wcm9maWxlID0gLTE7CisgICAgICBzZWxmLT5sYXN0X2hlaWdodCA9IC0xOworICAgICAgc2VsZi0+bGFzdF93aWR0aCA9IC0xOworICAgICAgc2VsZi0+Y2Fwc19zZW50ID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4KKyAgICAgIEdTVF9FTEVNRU5UX0NMQVNTIChnc3RfcnRwX3ZwOF9kZXBheV9wYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsCisgICAgICB0cmFuc2l0aW9uKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3ZwOF9kZXBheV9oYW5kbGVfZXZlbnQgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheSwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UnRwVlA4RGVwYXkgKnNlbGYgPSBHU1RfUlRQX1ZQOF9ERVBBWSAoZGVwYXkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6CisgICAgICBzZWxmLT5sYXN0X3Byb2ZpbGUgPSAtMTsKKyAgICAgIHNlbGYtPmxhc3RfaGVpZ2h0ID0gLTE7CisgICAgICBzZWxmLT5sYXN0X3dpZHRoID0gLTE7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4KKyAgICAgIEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfQ0xBU1MKKyAgICAgIChnc3RfcnRwX3ZwOF9kZXBheV9wYXJlbnRfY2xhc3MpLT5oYW5kbGVfZXZlbnQgKGRlcGF5LCBldmVudCk7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX3ZwOF9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHZwOGRlcGF5IiwKKyAgICAgIEdTVF9SQU5LX01BUkdJTkFMLCBHU1RfVFlQRV9SVFBfVlA4X0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwdnA4ZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwdnA4ZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTg1NDZhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBnc3RydHB2cDhkZXBheS5oIC0gSGVhZGVyIGZvciBHc3RSdHBWUDhEZXBheQorICogQ29weXJpZ2h0IChDKSAyMDExIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfVlA4X0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfVlA4X0RFUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1ZQOF9ERVBBWSBcCisgIChnc3RfcnRwX3ZwOF9kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX1ZQOF9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLCBHU1RfVFlQRV9SVFBfVlA4X0RFUEFZLCBHc3RSdHBWUDhEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfVlA4X0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLCBHU1RfVFlQRV9SVFBfVlA4X0RFUEFZLCBcCisgICAgR3N0UnRwVlA4RGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfVlA4X0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksIEdTVF9UWVBFX1JUUF9WUDhfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX1ZQOF9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSwgR1NUX1RZUEVfUlRQX1ZQOF9ERVBBWSkpCisjZGVmaW5lIEdTVF9SVFBfVlA4X0RFUEFZX0dFVF9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9SVFBfVlA4X0RFUEFZLCBcCisgICAgR3N0UnRwVlA4RGVwYXlDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBWUDhEZXBheSBHc3RSdHBWUDhEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBWUDhEZXBheUNsYXNzIEdzdFJ0cFZQOERlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwVlA4RGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworc3RydWN0IF9Hc3RSdHBWUDhEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIHBhcmVudDsKKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKKyAgZ2Jvb2xlYW4gc3RhcnRlZDsKKworICBnYm9vbGVhbiBjYXBzX3NlbnQ7CisgIGdpbnQgbGFzdF9wcm9maWxlOworICBnaW50IGxhc3Rfd2lkdGg7CisgIGdpbnQgbGFzdF9oZWlnaHQ7Cit9OworCitHVHlwZSBnc3RfcnRwX3ZwOF9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfdnA4X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogI2lmbmRlZiBfX0dTVF9SVFBfVlA4X0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHB2cDhwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwdnA4cGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY0OTUwMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwdnA4cGF5LmMKQEAgLTAsMCArMSw1NDEgQEAKKy8qCisgKiBnc3RydHB2cDhwYXkuYyAtIFNvdXJjZSBmb3IgR3N0UnRwVlA4UGF5CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDExIENvbGxhYm9yYSBMdGQuCisgKiAgIENvbnRhY3Q6IFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Yml0cmVhZGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBwYXlsb2Fkcy5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSAiZGJvb2xodWZmLmgiCisjaW5jbHVkZSAiZ3N0cnRwdnA4cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3J0cF92cDhfcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9ydHBfdnA4X3BheV9kZWJ1ZworCisjZGVmaW5lIERFRkFVTFRfUElDVFVSRV9JRF9NT0RFIFZQOF9QQVlfTk9fUElDVFVSRV9JRAorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9QSUNUVVJFX0lEX01PREUKK307CisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1ZQOF9QQVlfUElDVFVSRV9JRF9NT0RFIChnc3RfcnRwX3ZwOF9wYXlfcGljdHVyZV9pZF9tb2RlX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9ydHBfdnA4X3BheV9waWN0dXJlX2lkX21vZGVfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBtb2RlX3R5cGUgPSAwOworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSBtb2Rlc1tdID0geworICAgIHtWUDhfUEFZX05PX1BJQ1RVUkVfSUQsICJObyBQaWN0dXJlIElEIiwgIm5vbmUifSwKKyAgICB7VlA4X1BBWV9QSUNUVVJFX0lEXzdCSVRTLCAiNy1iaXQgUGljdHVyZSBJRCIsICI3LWJpdCJ9LAorICAgIHtWUDhfUEFZX1BJQ1RVUkVfSURfMTVCSVRTLCAiMTUtYml0IFBpY3R1cmUgSUQiLCAiMTUtYml0In0sCisgICAgezAsIE5VTEwsIE5VTEx9LAorICB9OworCisgIGlmICghbW9kZV90eXBlKSB7CisgICAgbW9kZV90eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFZQOFJUUFBheU1vZGUiLCBtb2Rlcyk7CisgIH0KKyAgcmV0dXJuIG1vZGVfdHlwZTsKK30KKworc3RhdGljIHZvaWQgZ3N0X3J0cF92cDhfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfdnA4X3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfdnA4X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3ZwOF9wYXlfc2lua19ldmVudCAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfdnA4X3BheV9zZXRfY2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworR19ERUZJTkVfVFlQRSAoR3N0UnRwVlA4UGF5LCBnc3RfcnRwX3ZwOF9wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF92cDhfcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIHsgXCJWUDhcIiwgXCJWUDgtRFJBRlQtSUVURi0wMVwiIH0iKSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3ZwOF9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXZwOCIpKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdnA4X3BheV9pbml0IChHc3RSdHBWUDhQYXkgKiBvYmopCit7CisgIG9iai0+cGljdHVyZV9pZF9tb2RlID0gREVGQVVMVF9QSUNUVVJFX0lEX01PREU7CisgIGlmIChvYmotPnBpY3R1cmVfaWRfbW9kZSA9PSBWUDhfUEFZX1BJQ1RVUkVfSURfN0JJVFMpCisgICAgb2JqLT5waWN0dXJlX2lkID0gZ19yYW5kb21faW50X3JhbmdlICgwLCBHX01BWFVJTlQ4KSAmIDB4N0Y7CisgIGVsc2UgaWYgKG9iai0+cGljdHVyZV9pZF9tb2RlID09IFZQOF9QQVlfUElDVFVSRV9JRF8xNUJJVFMpCisgICAgb2JqLT5waWN0dXJlX2lkID0gZ19yYW5kb21faW50X3JhbmdlICgwLCBHX01BWFVJTlQxNikgJiAweDdGRkY7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3ZwOF9wYXlfY2xhc3NfaW5pdCAoR3N0UnRwVlA4UGF5Q2xhc3MgKiBnc3RfcnRwX3ZwOF9wYXlfY2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChnc3RfcnRwX3ZwOF9wYXlfY2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoZ3N0X3J0cF92cDhfcGF5X2NsYXNzKTsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqcGF5X2NsYXNzID0KKyAgICAgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChnc3RfcnRwX3ZwOF9wYXlfY2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9ydHBfdnA4X3BheV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9ydHBfdnA4X3BheV9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QSUNUVVJFX0lEX01PREUsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoInBpY3R1cmUtaWQtbW9kZSIsICJQaWN0dXJlIElEIE1vZGUiLAorICAgICAgICAgICJUaGUgcGljdHVyZSBJRCBtb2RlIGZvciBwYXlsb2FkaW5nIiwKKyAgICAgICAgICBHU1RfVFlQRV9SVFBfVlA4X1BBWV9QSUNUVVJFX0lEX01PREUsIERFRkFVTFRfUElDVFVSRV9JRF9NT0RFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfdnA4X3BheV9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF92cDhfcGF5X3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgIlJUUCBWUDggcGF5bG9hZGVyIiwKKyAgICAgICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlB1dHMgVlA4IHZpZGVvIGluIFJUUCBwYWNrZXRzIiwgIlNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4iKTsKKworICBwYXlfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX3ZwOF9wYXlfaGFuZGxlX2J1ZmZlcjsKKyAgcGF5X2NsYXNzLT5zaW5rX2V2ZW50ID0gZ3N0X3J0cF92cDhfcGF5X3NpbmtfZXZlbnQ7CisgIHBheV9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX3ZwOF9wYXlfc2V0X2NhcHM7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9ydHBfdnA4X3BheV9kZWJ1ZywgInJ0cHZwOHBheSIsIDAsCisgICAgICAiVlA4IFZpZGVvIFJUUCBQYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdnA4X3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwVlA4UGF5ICpydHB2cDhwYXkgPSBHU1RfUlRQX1ZQOF9QQVkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BJQ1RVUkVfSURfTU9ERToKKyAgICAgIHJ0cHZwOHBheS0+cGljdHVyZV9pZF9tb2RlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgaWYgKHJ0cHZwOHBheS0+cGljdHVyZV9pZF9tb2RlID09IFZQOF9QQVlfUElDVFVSRV9JRF83QklUUykKKyAgICAgICAgcnRwdnA4cGF5LT5waWN0dXJlX2lkID0gZ19yYW5kb21faW50X3JhbmdlICgwLCBHX01BWFVJTlQ4KSAmIDB4N0Y7CisgICAgICBlbHNlIGlmIChydHB2cDhwYXktPnBpY3R1cmVfaWRfbW9kZSA9PSBWUDhfUEFZX1BJQ1RVUkVfSURfMTVCSVRTKQorICAgICAgICBydHB2cDhwYXktPnBpY3R1cmVfaWQgPSBnX3JhbmRvbV9pbnRfcmFuZ2UgKDAsIEdfTUFYVUlOVDE2KSAmIDB4N0ZGRjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdnA4X3BheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwVlA4UGF5ICpydHB2cDhwYXkgPSBHU1RfUlRQX1ZQOF9QQVkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BJQ1RVUkVfSURfTU9ERToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBydHB2cDhwYXktPnBpY3R1cmVfaWRfbW9kZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF92cDhfcGF5X3BhcnNlX2ZyYW1lIChHc3RSdHBWUDhQYXkgKiBzZWxmLCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgZ3NpemUgYnVmZmVyX3NpemUpCit7CisgIEdzdE1hcEluZm8gbWFwID0gR1NUX01BUF9JTkZPX0lOSVQ7CisgIEdzdEJpdFJlYWRlciByZWFkZXI7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3NpemUgc2l6ZTsKKyAgaW50IGk7CisgIGdib29sZWFuIGtleWZyYW1lOworICBndWludDMyIHBhcnRpdGlvbjBfc2l6ZTsKKyAgZ3VpbnQ4IHZlcnNpb247CisgIGd1aW50OCB0bXA4ID0gMDsKKyAgZ3VpbnQ4IHBhcnRpdGlvbnM7CisgIGd1aW50IG9mZnNldDsKKyAgQk9PTF9ERUNPREVSIGJjOworICBndWludDggKnBkYXRhOworCisgIGlmIChHX1VOTElLRUxZIChidWZmZXJfc2l6ZSA8IDMpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpIHx8ICFtYXAuZGF0YSkKKyAgICBnb3RvIGVycm9yOworCisgIGRhdGEgPSBtYXAuZGF0YTsKKyAgc2l6ZSA9IG1hcC5zaXplOworCisgIGdzdF9iaXRfcmVhZGVyX2luaXQgKCZyZWFkZXIsIGRhdGEsIHNpemUpOworCisgIHNlbGYtPmlzX2tleWZyYW1lID0ga2V5ZnJhbWUgPSAoKGRhdGFbMF0gJiAweDEpID09IDApOworICB2ZXJzaW9uID0gKGRhdGFbMF0gPj4gMSkgJiAweDc7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHZlcnNpb24gPiAzKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsICJVbmtub3duIFZQOCB2ZXJzaW9uICV1IiwgdmVyc2lvbik7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIC8qIGtleWZyYW1lLCB2ZXJzaW9uIGFuZCBzaG93X2ZyYW1lIHVzZSA1IGJpdHMgKi8KKyAgcGFydGl0aW9uMF9zaXplID0gZGF0YVsyXSA8PCAxMSB8IGRhdGFbMV0gPDwgMyB8IChkYXRhWzBdID4+IDUpOworCisgIC8qIEluY2x1ZGUgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGJsb2IgaW4gdGhlIGZpcnN0IHBhcnRpdGlvbiAqLworICBvZmZzZXQgPSBrZXlmcmFtZSA/IDEwIDogMzsKKyAgcGFydGl0aW9uMF9zaXplICs9IG9mZnNldDsKKworICBpZiAoIWdzdF9iaXRfcmVhZGVyX3NraXAgKCZyZWFkZXIsIDI0KSkKKyAgICBnb3RvIGVycm9yOworCisgIGlmIChrZXlmcmFtZSkgeworICAgIC8qIGNoZWNrIHN0YXJ0IHRhZzogMHg5ZCAweDAxIDB4MmEgKi8KKyAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4ICgmcmVhZGVyLCAmdG1wOCwgOCkgfHwgdG1wOCAhPSAweDlkKQorICAgICAgZ290byBlcnJvcjsKKworICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKCZyZWFkZXIsICZ0bXA4LCA4KSB8fCB0bXA4ICE9IDB4MDEpCisgICAgICBnb3RvIGVycm9yOworCisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoJnJlYWRlciwgJnRtcDgsIDgpIHx8IHRtcDggIT0gMHgyYSkKKyAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAvKiBTa2lwIGhvcml6b250YWwgc2l6ZSBjb2RlICgxNiBiaXRzKSB2ZXJ0aWNhbCBzaXplIGNvZGUgKDE2IGJpdHMpICovCisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9za2lwICgmcmVhZGVyLCAzMikpCisgICAgICBnb3RvIGVycm9yOworICB9CisKKyAgb2Zmc2V0ID0ga2V5ZnJhbWUgPyAxMCA6IDM7CisgIHZwOGR4X3N0YXJ0X2RlY29kZSAoJmJjLCBkYXRhICsgb2Zmc2V0LCBzaXplIC0gb2Zmc2V0KTsKKworICBpZiAoa2V5ZnJhbWUpIHsKKyAgICAvKiBjb2xvciBzcGFjZSAoMSBiaXQpIGFuZCBjbGFtcGluZyB0eXBlICgxIGJpdCkgKi8KKyAgICB2cDhkeF9kZWNvZGVfYm9vbCAoJmJjLCAweDgwKTsKKyAgICB2cDhkeF9kZWNvZGVfYm9vbCAoJmJjLCAweDgwKTsKKyAgfQorCisgIC8qIHNlZ21lbnRhdGlvbl9lbmFibGVkICovCisgIGlmICh2cDhkeF9kZWNvZGVfYm9vbCAoJmJjLCAweDgwKSkgeworICAgIGd1aW50OCB1cGRhdGVfbWJfc2VnbWVudGF0aW9uX21hcCA9IHZwOGR4X2RlY29kZV9ib29sICgmYmMsIDB4ODApOworICAgIGd1aW50OCB1cGRhdGVfc2VnbWVudF9mZWF0dXJlX2RhdGEgPSB2cDhkeF9kZWNvZGVfYm9vbCAoJmJjLCAweDgwKTsKKworICAgIGlmICh1cGRhdGVfc2VnbWVudF9mZWF0dXJlX2RhdGEpIHsKKyAgICAgIC8qIHNraXAgc2VnbWVudCBmZWF0dXJlIG1vZGUgKi8KKyAgICAgIHZwOGR4X2RlY29kZV9ib29sICgmYmMsIDB4ODApOworCisgICAgICAvKiBxdWFudGl6ZXIgdXBkYXRlICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIC8qIHNraXAgZmxhZ2dlZCBxdWFudGl6ZXIgdmFsdWUgKDcgYml0cykgYW5kIHNpZ24gKDEgYml0KSAqLworICAgICAgICBpZiAodnA4ZHhfZGVjb2RlX2Jvb2wgKCZiYywgMHg4MCkpCisgICAgICAgICAgdnA4X2RlY29kZV92YWx1ZSAoJmJjLCA4KTsKKyAgICAgIH0KKworICAgICAgLyogbG9vcCBmaWx0ZXIgdXBkYXRlICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIC8qIHNraXAgZmxhZ2dlZCBsZiB1cGRhdGUgdmFsdWUgKDYgYml0cykgYW5kIHNpZ24gKDEgYml0KSAqLworICAgICAgICBpZiAodnA4ZHhfZGVjb2RlX2Jvb2wgKCZiYywgMHg4MCkpCisgICAgICAgICAgdnA4X2RlY29kZV92YWx1ZSAoJmJjLCA3KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodXBkYXRlX21iX3NlZ21lbnRhdGlvbl9tYXApIHsKKyAgICAgIC8qIHNlZ21lbnQgcHJvYiB1cGRhdGUgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgLyogc2tpcCBmbGFnZ2VkIHNlZ21lbnQgcHJvYiAqLworICAgICAgICBpZiAodnA4ZHhfZGVjb2RlX2Jvb2wgKCZiYywgMHg4MCkpCisgICAgICAgICAgdnA4X2RlY29kZV92YWx1ZSAoJmJjLCA4KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBza2lwIGZpbHRlciB0eXBlICgxIGJpdCksIGxvb3AgZmlsdGVyIGxldmVsICg2IGJpdHMpIGFuZAorICAgKiBzaGFycG5lc3MgbGV2ZWwgKDMgYml0cykgKi8KKyAgdnA4X2RlY29kZV92YWx1ZSAoJmJjLCAxKTsKKyAgdnA4X2RlY29kZV92YWx1ZSAoJmJjLCA2KTsKKyAgdnA4X2RlY29kZV92YWx1ZSAoJmJjLCAzKTsKKworICAvKiBsb29wX2ZpbHRlcl9hZGpfZW5hYmxlZCAqLworICBpZiAodnA4ZHhfZGVjb2RlX2Jvb2wgKCZiYywgMHg4MCkpIHsKKworICAgIC8qIGRlbHRhIHVwZGF0ZSAqLworICAgIGlmICh2cDhkeF9kZWNvZGVfYm9vbCAoJmJjLCAweDgwKSkgeworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIC8qIDggdXBkYXRlcywgMSBiaXQgaW5kaWNhdGUgd2hldGhlciB0aGVyZSBpcyBvbmUgYW5kIGlmIGZvbGxvdyBieSBhCisgICAgICAgICAqIDcgYml0IHVwZGF0ZSAqLworICAgICAgICBpZiAodnA4ZHhfZGVjb2RlX2Jvb2wgKCZiYywgMHg4MCkpCisgICAgICAgICAgdnA4X2RlY29kZV92YWx1ZSAoJmJjLCA3KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAodnA4ZHhfYm9vbF9lcnJvciAoJmJjKSkKKyAgICBnb3RvIGVycm9yOworCisgIHRtcDggPSB2cDhfZGVjb2RlX3ZhbHVlICgmYmMsIDIpOworCisgIHBhcnRpdGlvbnMgPSAxIDw8IHRtcDg7CisKKyAgLyogQ2hlY2sgaWYgdGhpbmdzIGFyZSBzdGlsbCBzZW5zaWJsZSAqLworICBpZiAocGFydGl0aW9uMF9zaXplICsgKHBhcnRpdGlvbnMgLSAxKSAqIDMgPj0gc2l6ZSkKKyAgICBnb3RvIGVycm9yOworCisgIC8qIHBhcnRpdGlvbiBkYXRhIGlzIHJpZ2h0IGFmdGVyIHRoZSBtb2RlIHBhcnRpdGlvbiAqLworICBwZGF0YSA9IGRhdGEgKyBwYXJ0aXRpb24wX3NpemU7CisKKyAgLyogU2V0IHVwIG1hcHBpbmcgKi8KKyAgc2VsZi0+bl9wYXJ0aXRpb25zID0gcGFydGl0aW9ucyArIDE7CisgIHNlbGYtPnBhcnRpdGlvbl9vZmZzZXRbMF0gPSAwOworICBzZWxmLT5wYXJ0aXRpb25fc2l6ZVswXSA9IHBhcnRpdGlvbjBfc2l6ZSArIChwYXJ0aXRpb25zIC0gMSkgKiAzOworCisgIHNlbGYtPnBhcnRpdGlvbl9vZmZzZXRbMV0gPSBzZWxmLT5wYXJ0aXRpb25fc2l6ZVswXTsKKyAgZm9yIChpID0gMTsgaSA8IHBhcnRpdGlvbnM7IGkrKykgeworICAgIGd1aW50IHBzaXplID0gKHBkYXRhWzJdIDw8IDE2IHwgcGRhdGFbMV0gPDwgOCB8IHBkYXRhWzBdKTsKKworICAgIHBkYXRhICs9IDM7CisgICAgc2VsZi0+cGFydGl0aW9uX3NpemVbaV0gPSBwc2l6ZTsKKyAgICBzZWxmLT5wYXJ0aXRpb25fb2Zmc2V0W2kgKyAxXSA9IHNlbGYtPnBhcnRpdGlvbl9vZmZzZXRbaV0gKyBwc2l6ZTsKKyAgfQorCisgIC8qIENoZWNrIHRoYXQgb3VyIHBhcnRpdGlvbiBvZmZzZXRzIGFuZCBzaXplcyBkb24ndCBnbyBvdXRzaXplIHRoZSBidWZmZXIKKyAgICogc2l6ZS4gKi8KKyAgaWYgKHNlbGYtPnBhcnRpdGlvbl9vZmZzZXRbaV0gPj0gc2l6ZSkKKyAgICBnb3RvIGVycm9yOworCisgIHNlbGYtPnBhcnRpdGlvbl9zaXplW2ldID0gc2l6ZSAtIHNlbGYtPnBhcnRpdGlvbl9vZmZzZXRbaV07CisKKyAgc2VsZi0+cGFydGl0aW9uX29mZnNldFtpICsgMV0gPSBzaXplOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIHJldHVybiBUUlVFOworCitlcnJvcjoKKyAgR1NUX0RFQlVHICgiRmFpbGVkIHRvIHBhcnNlIGZyYW1lIik7CisgIGlmIChtYXAubWVtb3J5ICE9IE5VTEwpIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGd1aW50Citnc3RfcnRwX3ZwOF9vZmZzZXRfdG9fcGFydGl0aW9uIChHc3RSdHBWUDhQYXkgKiBzZWxmLCBndWludCBvZmZzZXQpCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDE7IGkgPCBzZWxmLT5uX3BhcnRpdGlvbnM7IGkrKykgeworICAgIGlmIChvZmZzZXQgPCBzZWxmLT5wYXJ0aXRpb25fb2Zmc2V0W2ldKQorICAgICAgcmV0dXJuIGkgLSAxOworICB9CisKKyAgcmV0dXJuIGkgLSAxOworfQorCitzdGF0aWMgZ3NpemUKK2dzdF9ydHBfdnA4X2NhbGNfaGVhZGVyX2xlbiAoR3N0UnRwVlA4UGF5ICogc2VsZikKK3sKKyAgc3dpdGNoIChzZWxmLT5waWN0dXJlX2lkX21vZGUpIHsKKyAgICBjYXNlIFZQOF9QQVlfUElDVFVSRV9JRF83QklUUzoKKyAgICAgIHJldHVybiAzOworICAgIGNhc2UgVlA4X1BBWV9QSUNUVVJFX0lEXzE1QklUUzoKKyAgICAgIHJldHVybiA0OworICAgIGNhc2UgVlA4X1BBWV9OT19QSUNUVVJFX0lEOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMTsKKyAgfQorfQorCisvKiBXaGVuIGdyb3dpbmcgdGhlIHZwOCBoZWFkZXIga2VlcCBtYXggcGF5bG9hZCBsZW4gY2FsY3VsYXRpb24gaW4gc3luYyAqLworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX3ZwOF9jcmVhdGVfaGVhZGVyX2J1ZmZlciAoR3N0UnRwVlA4UGF5ICogc2VsZiwgZ3VpbnQ4IHBhcnRpZCwKKyAgICBnYm9vbGVhbiBzdGFydCwgZ2Jvb2xlYW4gbWFyaywgR3N0QnVmZmVyICogaW4pCit7CisgIEdzdEJ1ZmZlciAqb3V0OworICBndWludDggKnA7CisgIEdzdFJUUEJ1ZmZlciBydHBidWZmZXIgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworCisgIG91dCA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoZ3N0X3J0cF92cDhfY2FsY19oZWFkZXJfbGVuIChzZWxmKSwgMCwgMCk7CisgIGdzdF9ydHBfYnVmZmVyX21hcCAob3V0LCBHU1RfTUFQX1JFQURXUklURSwgJnJ0cGJ1ZmZlcik7CisgIHAgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cGJ1ZmZlcik7CisgIC8qIFg9MCxSPTAsTj0wLFM9c3RhcnQsUGFydElEPXBhcnRpZCAqLworICBwWzBdID0gKHN0YXJ0IDw8IDQpIHwgcGFydGlkOworICBpZiAoc2VsZi0+cGljdHVyZV9pZF9tb2RlICE9IFZQOF9QQVlfTk9fUElDVFVSRV9JRCkgeworICAgIC8qIEVuYWJsZSBYPTEgKi8KKyAgICBwWzBdIHw9IDB4ODA7CisgICAgLyogWDogST0xLEw9MCxUPTAsSz0wLFJTVj0wICovCisgICAgcFsxXSA9IDB4ODA7CisgICAgaWYgKHNlbGYtPnBpY3R1cmVfaWRfbW9kZSA9PSBWUDhfUEFZX1BJQ1RVUkVfSURfN0JJVFMpIHsKKyAgICAgIC8qIEk6IDcgYml0IHBpY3R1cmVfaWQgKi8KKyAgICAgIHBbMl0gPSBzZWxmLT5waWN0dXJlX2lkICYgMHg3RjsKKyAgICB9IGVsc2UgeworICAgICAgLyogSTogMTUgYml0IHBpY3R1cmVfaWQgKi8KKyAgICAgIHBbMl0gPSAweDgwIHwgKChzZWxmLT5waWN0dXJlX2lkICYgMHg3RkZGKSA+PiA4KTsKKyAgICAgIHBbM10gPSBzZWxmLT5waWN0dXJlX2lkICYgMHhGRjsKKyAgICB9CisgIH0KKworICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwYnVmZmVyLCBtYXJrKTsKKworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cGJ1ZmZlcik7CisKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0KSA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGluKTsKKyAgR1NUX0JVRkZFUl9QVFMgKG91dCkgPSBHU1RfQlVGRkVSX1BUUyAoaW4pOworCisgIHJldHVybiBvdXQ7Cit9CisKK3N0YXRpYyBndWludAorZ3N0X3J0cF92cDhfcGF5bG9hZF9uZXh0IChHc3RSdHBWUDhQYXkgKiBzZWxmLCBHc3RCdWZmZXJMaXN0ICogbGlzdCwKKyAgICBndWludCBvZmZzZXQsIEdzdEJ1ZmZlciAqIGJ1ZmZlciwgZ3NpemUgYnVmZmVyX3NpemUsIGdzaXplIG1heF9wYXlsb2FkX2xlbikKK3sKKyAgZ3VpbnQgcGFydGl0aW9uOworICBHc3RCdWZmZXIgKmhlYWRlcjsKKyAgR3N0QnVmZmVyICpzdWI7CisgIEdzdEJ1ZmZlciAqb3V0OworICBnYm9vbGVhbiBtYXJrOworICBnc2l6ZSByZW1haW5pbmc7CisgIGdzaXplIGF2YWlsYWJsZTsKKworICByZW1haW5pbmcgPSBidWZmZXJfc2l6ZSAtIG9mZnNldDsKKyAgYXZhaWxhYmxlID0gbWF4X3BheWxvYWRfbGVuOworICBpZiAoYXZhaWxhYmxlID4gcmVtYWluaW5nKQorICAgIGF2YWlsYWJsZSA9IHJlbWFpbmluZzsKKworICBwYXJ0aXRpb24gPSBnc3RfcnRwX3ZwOF9vZmZzZXRfdG9fcGFydGl0aW9uIChzZWxmLCBvZmZzZXQpOworICBnX2Fzc2VydCAocGFydGl0aW9uIDwgc2VsZi0+bl9wYXJ0aXRpb25zKTsKKworICBtYXJrID0gKHJlbWFpbmluZyA9PSBhdmFpbGFibGUpOworICAvKiB3aG9sZSBzZXQgb2YgcGFydGl0aW9ucywgcGF5bG9hZCB0aGVtIGFuZCBkb25lICovCisgIGhlYWRlciA9IGdzdF9ydHBfdnA4X2NyZWF0ZV9oZWFkZXJfYnVmZmVyIChzZWxmLCBwYXJ0aXRpb24sCisgICAgICBvZmZzZXQgPT0gc2VsZi0+cGFydGl0aW9uX29mZnNldFtwYXJ0aXRpb25dLCBtYXJrLCBidWZmZXIpOworICBzdWIgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIG9mZnNldCwgYXZhaWxhYmxlKTsKKworICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAoc2VsZiwgaGVhZGVyLCBidWZmZXIpOworCisgIG91dCA9IGdzdF9idWZmZXJfYXBwZW5kIChoZWFkZXIsIHN1Yik7CisKKyAgZ3N0X2J1ZmZlcl9saXN0X2luc2VydCAobGlzdCwgLTEsIG91dCk7CisKKyAgcmV0dXJuIGF2YWlsYWJsZTsKK30KKworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF92cDhfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSdHBWUDhQYXkgKnNlbGYgPSBHU1RfUlRQX1ZQOF9QQVkgKHBheWxvYWQpOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0QnVmZmVyTGlzdCAqbGlzdDsKKyAgZ3NpemUgc2l6ZSwgbWF4X3BheWxlbjsKKyAgZ3VpbnQgb2Zmc2V0LCBtdHUsIHZwOF9oZHJfbGVuOworCisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpOworCisgIGlmIChHX1VOTElLRUxZICghZ3N0X3J0cF92cDhfcGF5X3BhcnNlX2ZyYW1lIChzZWxmLCBidWZmZXIsIHNpemUpKSkgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzZWxmLCBTVFJFQU0sIEVOQ09ERSwgKE5VTEwpLAorICAgICAgICAoIkZhaWxlZCB0byBwYXJzZSBWUDggZnJhbWUiKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgbXR1ID0gR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVIChwYXlsb2FkKTsKKyAgdnA4X2hkcl9sZW4gPSBnc3RfcnRwX3ZwOF9jYWxjX2hlYWRlcl9sZW4gKHNlbGYpOworICBtYXhfcGF5bGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYXlsb2FkX2xlbiAobXR1IC0gdnA4X2hkcl9sZW4sIDAsIDApOworCisgIGxpc3QgPSBnc3RfYnVmZmVyX2xpc3RfbmV3X3NpemVkICgoc2l6ZSAvIG1heF9wYXlsZW4pICsgMSk7CisKKyAgb2Zmc2V0ID0gMDsKKyAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKKyAgICBvZmZzZXQgKz0KKyAgICAgICAgZ3N0X3J0cF92cDhfcGF5bG9hZF9uZXh0IChzZWxmLCBsaXN0LCBvZmZzZXQsIGJ1ZmZlciwgc2l6ZSwgbWF4X3BheWxlbik7CisgIH0KKworICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoX2xpc3QgKHBheWxvYWQsIGxpc3QpOworCisgIC8qIEluY3JlbWVuZW50IGFuZCB3cmFwIHRoZSBwaWN0dXJlIGlkIGlmIGl0IG92ZXJmbG93cyAqLworICBpZiAoKHNlbGYtPnBpY3R1cmVfaWRfbW9kZSA9PSBWUDhfUEFZX1BJQ1RVUkVfSURfN0JJVFMgJiYKKyAgICAgICAgICArK3NlbGYtPnBpY3R1cmVfaWQgPj0gMHg4MCkgfHwKKyAgICAgIChzZWxmLT5waWN0dXJlX2lkX21vZGUgPT0gVlA4X1BBWV9QSUNUVVJFX0lEXzE1QklUUyAmJgorICAgICAgICAgICsrc2VsZi0+cGljdHVyZV9pZCA+PSAweDgwMDApKQorICAgIHNlbGYtPnBpY3R1cmVfaWQgPSAwOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3ZwOF9wYXlfc2lua19ldmVudCAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBWUDhQYXkgKnNlbGYgPSBHU1RfUlRQX1ZQOF9QQVkgKHBheWxvYWQpOworCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID09IEdTVF9FVkVOVF9GTFVTSF9TVEFSVCkgeworICAgIGlmIChzZWxmLT5waWN0dXJlX2lkX21vZGUgPT0gVlA4X1BBWV9QSUNUVVJFX0lEXzdCSVRTKQorICAgICAgc2VsZi0+cGljdHVyZV9pZCA9IGdfcmFuZG9tX2ludF9yYW5nZSAoMCwgR19NQVhVSU5UOCkgJiAweDdGOworICAgIGVsc2UgaWYgKHNlbGYtPnBpY3R1cmVfaWRfbW9kZSA9PSBWUDhfUEFZX1BJQ1RVUkVfSURfMTVCSVRTKQorICAgICAgc2VsZi0+cGljdHVyZV9pZCA9IGdfcmFuZG9tX2ludF9yYW5nZSAoMCwgR19NQVhVSU5UMTYpICYgMHg3RkZGOworICB9CisKKyAgcmV0dXJuIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChnc3RfcnRwX3ZwOF9wYXlfcGFyZW50X2NsYXNzKS0+c2lua19ldmVudAorICAgICAgKHBheWxvYWQsIGV2ZW50KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3ZwOF9wYXlfc2V0X2NhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKnNyY19jYXBzOworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIGNoYXIgKmVuY29kaW5nX25hbWU7CisKKyAgc3JjX2NhcHMgPSBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NSQ1BBRCAocGF5bG9hZCkpOworICBpZiAoc3JjX2NhcHMpIHsKKyAgICBzcmNfY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKHNyY19jYXBzKTsKKyAgICBzcmNfY2FwcyA9IGdzdF9jYXBzX3RydW5jYXRlIChzcmNfY2Fwcyk7CisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHNyY19jYXBzLCAwKTsKKyAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9zdHJpbmcgKHMsICJlbmNvZGluZy1uYW1lIiwgIlZQOCIpOworICAgIGVuY29kaW5nX25hbWUgPSBnX3N0cmR1cCAoZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAiZW5jb2RpbmctbmFtZSIpKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoc3JjX2NhcHMpOworICB9IGVsc2UgeworICAgIGVuY29kaW5nX25hbWUgPSBnX3N0cmR1cCAoIlZQOC1EUkFGVC1JRVRGLTAxIik7CisgIH0KKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAocGF5bG9hZCwgInZpZGVvIiwgVFJVRSwKKyAgICAgIGVuY29kaW5nX25hbWUsIDkwMDAwKTsKKyAgZ19mcmVlIChlbmNvZGluZ19uYW1lKTsKKyAgcmV0dXJuIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChwYXlsb2FkLCBOVUxMKTsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfdnA4X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHZwOHBheSIsCisgICAgICBHU1RfUkFOS19NQVJHSU5BTCwgR1NUX1RZUEVfUlRQX1ZQOF9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHB2cDhwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwdnA4cGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ3MjA2MAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwdnA4cGF5LmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIGdzdHJ0cHZwOHBheS5oIC0gSGVhZGVyIGZvciBHc3RSdHBWUDhQYXkKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1ZQOF9QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9WUDhfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1ZQOF9QQVkgXAorICAoZ3N0X3J0cF92cDhfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfVlA4X1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLCBHU1RfVFlQRV9SVFBfVlA4X1BBWSwgR3N0UnRwVlA4UGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9WUDhfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLCBHU1RfVFlQRV9SVFBfVlA4X1BBWSwgR3N0UnRwVlA4UGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1ZQOF9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSwgR1NUX1RZUEVfUlRQX1ZQOF9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX1ZQOF9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksIEdTVF9UWVBFX1JUUF9WUDhfUEFZKSkKKyNkZWZpbmUgR1NUX1JUUF9WUDhfUEFZX0dFVF9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9SVFBfVlA4X1BBWSwgR3N0UnRwVlA4UGF5Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwVlA4UGF5IEdzdFJ0cFZQOFBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBWUDhQYXlDbGFzcyBHc3RSdHBWUDhQYXlDbGFzczsKK3R5cGVkZWYgZW51bSBfUGljdHVyZUlETW9kZSBQaWN0dXJlSURNb2RlOworCitlbnVtIF9QaWN0dXJlSURNb2RlIHsKKyAgVlA4X1BBWV9OT19QSUNUVVJFX0lELAorICBWUDhfUEFZX1BJQ1RVUkVfSURfN0JJVFMsCisgIFZQOF9QQVlfUElDVFVSRV9JRF8xNUJJVFMsCit9OworCitzdHJ1Y3QgX0dzdFJ0cFZQOFBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworc3RydWN0IF9Hc3RSdHBWUDhQYXkKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWQgcGFyZW50OworICBnYm9vbGVhbiBpc19rZXlmcmFtZTsKKyAgZ2ludCBuX3BhcnRpdGlvbnM7CisgIC8qIFRyZWF0IGZyYW1lIGhlYWRlciAmIHRhZyAmIHBhcnRpdGlvbiBzaXplIGJsb2NrIGFzIHRoZSBmaXJzdCBwYXJ0aXRpb24sCisgICAqIGZvbG93ZWQgYnkgbWF4LiA4IGRhdGEgcGFydGl0aW9ucy4gbGFzdCBvZmZzZXQgaXMgdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovCisgIGd1aW50IHBhcnRpdGlvbl9vZmZzZXRbMTBdOworICBndWludCBwYXJ0aXRpb25fc2l6ZVs5XTsKKyAgUGljdHVyZUlETW9kZSBwaWN0dXJlX2lkX21vZGU7CisgIGd1aW50MTYgcGljdHVyZV9pZDsKK307CisKK0dUeXBlIGdzdF9ydHBfdnA4X3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfdnA4X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qICNpZm5kZWYgX19HU1RfUlRQX1ZQOF9QQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHZwOWRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cHZwOWRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxYWZmYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwdnA5ZGVwYXkuYwpAQCAtMCwwICsxLDM3OCBAQAorLyogZ3N0cnRwdnA5ZGVwYXkuYyAtIFNvdXJjZSBmb3IgR3N0UnRwVlA5RGVwYXkKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQ29sbGFib3JhIEx0ZC4KKyAqICAgQ29udGFjdDogWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCAoQykgMjAxNSBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdHJ0cHZwOWRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3J0cF92cDlfZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3J0cF92cDlfZGVwYXlfZGVidWcKKworc3RhdGljIHZvaWQgZ3N0X3J0cF92cDlfZGVwYXlfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX3ZwOV9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF92cDlfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3ZwOV9kZXBheV9oYW5kbGVfZXZlbnQgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheSwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworR19ERUZJTkVfVFlQRSAoR3N0UnRwVlA5RGVwYXksIGdzdF9ydHBfdnA5X2RlcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF92cDlfZGVwYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXZwOSIpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfdnA5X2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgeyBcIlZQOVwiLCBcIlZQOS1EUkFGVC1JRVRGLTAxXCIgfSIpKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdnA5X2RlcGF5X2luaXQgKEdzdFJ0cFZQOURlcGF5ICogc2VsZikKK3sKKyAgc2VsZi0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKKyAgc2VsZi0+c3RhcnRlZCA9IEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF92cDlfZGVwYXlfY2xhc3NfaW5pdCAoR3N0UnRwVlA5RGVwYXlDbGFzcyAqIGdzdF9ydHBfdnA5X2RlcGF5X2NsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChnc3RfcnRwX3ZwOV9kZXBheV9jbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChnc3RfcnRwX3ZwOV9kZXBheV9jbGFzcyk7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZGVwYXlfY2xhc3MgPQorICAgICAgKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSAoZ3N0X3J0cF92cDlfZGVwYXlfY2xhc3MpOworCisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF92cDlfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfdnA5X2RlcGF5X3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgIlJUUCBWUDkgZGVwYXlsb2FkZXIiLAorICAgICAgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBWUDkgdmlkZW8gZnJvbSBSVFAgcGFja2V0cykiLCAiU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+Iik7CisKKyAgb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X3J0cF92cDlfZGVwYXlfZGlzcG9zZTsKKworICBlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfcnRwX3ZwOV9kZXBheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZGVwYXlfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfdnA5X2RlcGF5X3Byb2Nlc3M7CisgIGRlcGF5X2NsYXNzLT5oYW5kbGVfZXZlbnQgPSBnc3RfcnRwX3ZwOV9kZXBheV9oYW5kbGVfZXZlbnQ7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9ydHBfdnA5X2RlcGF5X2RlYnVnLCAicnRwdnA5ZGVwYXkiLCAwLAorICAgICAgIlZQOSBWaWRlbyBSVFAgRGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdnA5X2RlcGF5X2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cFZQOURlcGF5ICpzZWxmID0gR1NUX1JUUF9WUDlfREVQQVkgKG9iamVjdCk7CisKKyAgaWYgKHNlbGYtPmFkYXB0ZXIgIT0gTlVMTCkKKyAgICBnX29iamVjdF91bnJlZiAoc2VsZi0+YWRhcHRlcik7CisgIHNlbGYtPmFkYXB0ZXIgPSBOVUxMOworCisgIC8qIHJlbGVhc2UgYW55IHJlZmVyZW5jZXMgaGVsZCBieSB0aGUgb2JqZWN0IGhlcmUgKi8KKworICBpZiAoR19PQkpFQ1RfQ0xBU1MgKGdzdF9ydHBfdnA5X2RlcGF5X3BhcmVudF9jbGFzcyktPmRpc3Bvc2UpCisgICAgR19PQkpFQ1RfQ0xBU1MgKGdzdF9ydHBfdnA5X2RlcGF5X3BhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF92cDlfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5LCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cFZQOURlcGF5ICpzZWxmID0gR1NUX1JUUF9WUDlfREVQQVkgKGRlcGF5KTsKKyAgR3N0QnVmZmVyICpwYXlsb2FkOworICBndWludDggKmRhdGE7CisgIGd1aW50IGhkcnNpemUgPSAxOworICBndWludCBzaXplOworICBnaW50IHNwYXRpYWxfbGF5ZXIgPSAwOworICBnYm9vbGVhbiBpX2JpdCwgcF9iaXQsIGxfYml0LCBmX2JpdCwgYl9iaXQsIGVfYml0LCB2X2JpdDsKKworICBpZiAoR19VTkxJS0VMWSAoR1NUX0JVRkZFUl9JU19ESVNDT05UIChydHAtPmJ1ZmZlcikpKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNlbGYsICJEaXNjb250aW51aXR5LCBmbHVzaGluZyBhZGFwdGVyIik7CisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHNlbGYtPmFkYXB0ZXIpOworICAgIHNlbGYtPnN0YXJ0ZWQgPSBGQUxTRTsKKyAgfQorCisgIHNpemUgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisKKyAgLyogTWFuZGF0b3J5IHdpdGggYXQgbGVhc3Qgb25lIGhlYWRlciBhbmQgb25lIHZwOSBieXRlICovCisgIGlmIChHX1VOTElLRUxZIChzaXplIDwgaGRyc2l6ZSArIDEpKQorICAgIGdvdG8gdG9vX3NtYWxsOworCisgIGRhdGEgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAocnRwKTsKKyAgaV9iaXQgPSAoZGF0YVswXSAmIDB4ODApICE9IDA7CisgIHBfYml0ID0gKGRhdGFbMF0gJiAweDQwKSAhPSAwOworICBsX2JpdCA9IChkYXRhWzBdICYgMHgyMCkgIT0gMDsKKyAgZl9iaXQgPSAoZGF0YVswXSAmIDB4MTApICE9IDA7CisgIGJfYml0ID0gKGRhdGFbMF0gJiAweDA4KSAhPSAwOworICBlX2JpdCA9IChkYXRhWzBdICYgMHgwNCkgIT0gMDsKKyAgdl9iaXQgPSAoZGF0YVswXSAmIDB4MDIpICE9IDA7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFzZWxmLT5zdGFydGVkKSkgeworICAgIC8qIENoZWNrIGlmIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgVlA5IGxheWVyIGZyYW1lLCBvdGhlcndpc2UgYmFpbCAqLworICAgIGlmICghYl9iaXQpCisgICAgICBnb3RvIGRvbmU7CisKKyAgICBzZWxmLT5zdGFydGVkID0gVFJVRTsKKyAgfQorCisgIEdTVF9UUkFDRV9PQkpFQ1QgKHNlbGYsICJJUExGQkVWIDogJWQlZCVkJWQlZCVkJWQiLCBpX2JpdCwgcF9iaXQsIGxfYml0LAorICAgICAgZl9iaXQsIGJfYml0LCBlX2JpdCwgdl9iaXQpOworCisgIC8qIENoZWNrIEkgb3B0aW9uYWwgaGVhZGVyIFBpY3R1cmUgSUQgKi8KKyAgaWYgKGlfYml0KSB7CisgICAgaGRyc2l6ZSsrOworICAgIGlmIChHX1VOTElLRUxZIChzaXplIDwgaGRyc2l6ZSArIDEpKQorICAgICAgZ290byB0b29fc21hbGw7CisgICAgLyogQ2hlY2sgTSBmb3IgMTUgYml0cyBQaWN0dXJlSUQgKi8KKyAgICBpZiAoKGRhdGFbMV0gJiAweDgwKSAhPSAwKSB7CisgICAgICBoZHJzaXplKys7CisgICAgICBpZiAoR19VTkxJS0VMWSAoc2l6ZSA8IGhkcnNpemUgKyAxKSkKKyAgICAgICAgZ290byB0b29fc21hbGw7CisgICAgfQorICB9CisKKyAgLyogQ2hlY2sgTCBvcHRpb25hbCBoZWFkZXIgbGF5ZXIgaW5kaWNlcyAqLworICBpZiAobF9iaXQpIHsKKyAgICBoZHJzaXplKys7CisgICAgLyogQ2hlY2sgVEwwUElDSURYIHRlbXBvcmFsIGxheWVyIHplcm8gaW5kZXggKG5vbi1mbGV4aWJsZSBtb2RlKSAqLworICAgIGlmICghZl9iaXQpCisgICAgICBoZHJzaXplKys7CisgIH0KKworICBpZiAocF9iaXQgJiYgZl9iaXQpIHsKKyAgICBnaW50IGk7CisKKyAgICAvKiBBdCBsZWFzdCBvbmUgUF9ESUZGfE4sIHVwIHRvIHRocmVlIHRpbWVzICovCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgZ3VpbnQgcF9kaWZmLCBuX2JpdDsKKworICAgICAgaWYgKEdfVU5MSUtFTFkgKHNpemUgPCBoZHJzaXplICsgMSkpCisgICAgICAgIGdvdG8gdG9vX3NtYWxsOworCisgICAgICBwX2RpZmYgPSBkYXRhW2hkcnNpemVdID4+IDE7CisgICAgICBuX2JpdCA9IGRhdGFbaGRyc2l6ZV0gJiAweDE7CisgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChzZWxmLCAiUF9ESUZGWyVkXT0lZCIsIGksIHBfZGlmZik7CisgICAgICBoZHJzaXplKys7CisKKyAgICAgIGlmICghbl9iaXQpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8qIENoZWNrIFYgb3B0aW9uYWwgU2NhbGFiaWxpdHkgU3RydWN0dXJlICovCisgIGlmICh2X2JpdCkgeworICAgIGd1aW50IG5fcywgeV9iaXQsIGdfYml0OworICAgIGd1aW50OCAqc3MgPSAmZGF0YVtoZHJzaXplXTsKKyAgICBndWludCBzc3NpemUgPSAxOworCisgICAgaWYgKEdfVU5MSUtFTFkgKHNpemUgPCBoZHJzaXplICsgc3NzaXplICsgMSkpCisgICAgICBnb3RvIHRvb19zbWFsbDsKKworICAgIG5fcyA9IChzc1swXSAmIDB4ZTApID4+IDU7CisgICAgeV9iaXQgPSAoc3NbMF0gJiAweDEwKSAhPSAwOworICAgIGdfYml0ID0gKHNzWzBdICYgMHgwOCkgIT0gMDsKKworICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHNlbGYsICJTUyBoZWFkZXI6IE5fUz0ldSwgWT0ldSwgRz0ldSIsIG5fcywgeV9iaXQsIGdfYml0KTsKKworICAgIHNzc2l6ZSArPSB5X2JpdCA/IChuX3MgKyAxKSAqIDQgOiAwOworICAgIGlmIChHX1VOTElLRUxZIChzaXplIDwgaGRyc2l6ZSArIHNzc2l6ZSArIDEpKQorICAgICAgZ290byB0b29fc21hbGw7CisKKyAgICBpZiAoeV9iaXQpIHsKKyAgICAgIGd1aW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDw9IG5fczsgaSsrKSB7CisgICAgICAgIC8qIEZvciBub3csIHNpbXBseSB1c2UgdGhlIGxhc3QgbGF5ZXIgc3BlY2lmaWVkIGZvciB3aWR0aCBhbmQgaGVpZ2h0ICovCisgICAgICAgIHNlbGYtPnNzX3dpZHRoID0gc3NbMSArIGkgKiA0XSAqIDI1NiArIHNzWzIgKyBpICogNF07CisgICAgICAgIHNlbGYtPnNzX2hlaWdodCA9IHNzWzMgKyBpICogNF0gKiAyNTYgKyBzc1s0ICsgaSAqIDRdOworICAgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChzZWxmLCAiTl9TWyVkXTogV0lEVEg9JXUsIEhFSUdIVD0ldSIsIGksCisgICAgICAgICAgICBzZWxmLT5zc193aWR0aCwgc2VsZi0+c3NfaGVpZ2h0KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ19iaXQpIHsKKyAgICAgIGd1aW50IGksIGo7CisgICAgICBndWludCBuX2cgPSBzc1tzc3NpemVdOworICAgICAgc3NzaXplKys7CisgICAgICBpZiAoR19VTkxJS0VMWSAoc2l6ZSA8IGhkcnNpemUgKyBzc3NpemUgKyAxKSkKKyAgICAgICAgZ290byB0b29fc21hbGw7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbl9nOyBpKyspIHsKKyAgICAgICAgZ3VpbnQgdCA9IChzc1tzc3NpemVdICYgMHhlMCkgPj4gNTsKKyAgICAgICAgZ3VpbnQgdSA9IChzc1tzc3NpemVdICYgMHgxMCkgPj4gNDsKKyAgICAgICAgZ3VpbnQgciA9IChzc1tzc3NpemVdICYgMHgwYykgPj4gMjsKKyAgICAgICAgR1NUX1RSQUNFX09CSkVDVCAoc2VsZiwgIk5fR1sldV06IDB4JTAyeCAtPiBUPSV1LCBVPSV1LCBSPSV1IiwgaSwKKyAgICAgICAgICAgIHNzW3Nzc2l6ZV0sIHQsIHUsIHIpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcjsgaisrKQorICAgICAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHNlbGYsICIgIFJbJXVdOiBQX0RJRkY9JXUiLCBqLCBzc1tzc3NpemUgKyAxICsgal0pOworICAgICAgICBzc3NpemUgKz0gMSArIHI7CisgICAgICAgIGlmIChHX1VOTElLRUxZIChzaXplIDwgaGRyc2l6ZSArIHNzc2l6ZSArIDEpKQorICAgICAgICAgIGdvdG8gdG9vX3NtYWxsOworICAgICAgfQorICAgIH0KKyAgICBoZHJzaXplICs9IHNzc2l6ZTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5LCAiaGRyc2l6ZSAldSwgc2l6ZSAldSIsIGhkcnNpemUsIHNpemUpOworCisgIGlmIChHX1VOTElLRUxZIChoZHJzaXplID49IHNpemUpKQorICAgIGdvdG8gdG9vX3NtYWxsOworCisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgKHJ0cCwgaGRyc2l6ZSwgLTEpOworICB7CisgICAgR3N0TWFwSW5mbyBtYXA7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKHBheWxvYWQsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgR1NUX01FTURVTVBfT0JKRUNUIChzZWxmLCAidnA5IHBheWxvYWQiLCBtYXAuZGF0YSwgMTYpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKHBheWxvYWQsICZtYXApOworICB9CisgIGdzdF9hZGFwdGVyX3B1c2ggKHNlbGYtPmFkYXB0ZXIsIHBheWxvYWQpOworCisgIC8qIE1hcmtlciBpbmRpY2F0ZXMgdGhhdCBpdCB3YXMgdGhlIGxhc3QgcnRwIHBhY2tldCBmb3IgdGhpcyBmcmFtZSAqLworICBpZiAoZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAocnRwKSkgeworICAgIEdzdEJ1ZmZlciAqb3V0OworICAgIGdib29sZWFuIGtleV9mcmFtZV9maXJzdF9sYXllciA9ICFwX2JpdCAmJiBzcGF0aWFsX2xheWVyID09IDA7CisKKyAgICBpZiAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChzZWxmLT5hZGFwdGVyKSA8IDEwKQorICAgICAgZ290byB0b29fc21hbGw7CisKKyAgICBvdXQgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoc2VsZi0+YWRhcHRlciwKKyAgICAgICAgZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChzZWxmLT5hZGFwdGVyKSk7CisKKyAgICBzZWxmLT5zdGFydGVkID0gRkFMU0U7CisKKyAgICAvKiBtYXJrIGtleWZyYW1lcyAqLworICAgIG91dCA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAob3V0KTsKKyAgICAvKiBGaWx0ZXIgYXdheSBhbGwgbWV0YXMgdGhhdCBhcmUgbm90IHNlbnNpYmxlIHRvIGNvcHkgKi8KKyAgICBnc3RfcnRwX2Ryb3Bfbm9uX3ZpZGVvX21ldGEgKHNlbGYsIG91dCk7CisgICAgaWYgKCFrZXlfZnJhbWVfZmlyc3RfbGF5ZXIpIHsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dCwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgICAgICBpZiAoIXNlbGYtPmNhcHNfc2VudCkgeworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChvdXQpOworICAgICAgICBvdXQgPSBOVUxMOworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHNlbGYsICJEcm9wcGluZyBpbnRlci1mcmFtZSBiZWZvcmUgaW50cmEtZnJhbWUiKTsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NJTktQQUQgKGRlcGF5KSwKKyAgICAgICAgICAgIGdzdF92aWRlb19ldmVudF9uZXdfdXBzdHJlYW1fZm9yY2Vfa2V5X3VuaXQgKEdTVF9DTE9DS19USU1FX05PTkUsCisgICAgICAgICAgICAgICAgVFJVRSwgMCkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfVU5TRVQgKG91dCwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgICAgICBpZiAoc2VsZi0+bGFzdF93aWR0aCAhPSBzZWxmLT5zc193aWR0aCB8fAorICAgICAgICAgIHNlbGYtPmxhc3RfaGVpZ2h0ICE9IHNlbGYtPnNzX2hlaWdodCkgeworICAgICAgICBHc3RDYXBzICpzcmNjYXBzOworCisgICAgICAgIC8qIFdpZHRoIGFuZCBoZWlnaHQgYXJlIG9wdGlvbmFsIGluIHRoZSBSVFAgaGVhZGVyLiBDb25zaWRlciB0byBwYXJzZQorICAgICAgICAgKiB0aGUgZnJhbWUgaGVhZGVyIGluIGFkZGl0aW9uIGlmIG1pc3NpbmcgZnJvbSBSVFAgaGVhZGVyICovCisgICAgICAgIGlmIChzZWxmLT5zc193aWR0aCAhPSAwICYmIHNlbGYtPnNzX2hlaWdodCAhPSAwKSB7CisgICAgICAgICAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LXZwOSIsCisgICAgICAgICAgICAgICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTiwgMCwgMSwKKyAgICAgICAgICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgc2VsZi0+c3Nfd2lkdGgsCisgICAgICAgICAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBzZWxmLT5zc19oZWlnaHQsIE5VTEwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC12cDkiLAorICAgICAgICAgICAgICAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT04sIDAsIDEsIE5VTEwpOworICAgICAgICB9CisKKyAgICAgICAgZ3N0X3BhZF9zZXRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKGRlcGF5KSwgc3JjY2Fwcyk7CisgICAgICAgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICAgICAgICBzZWxmLT5jYXBzX3NlbnQgPSBUUlVFOworICAgICAgICBzZWxmLT5sYXN0X3dpZHRoID0gc2VsZi0+c3Nfd2lkdGg7CisgICAgICAgIHNlbGYtPmxhc3RfaGVpZ2h0ID0gc2VsZi0+c3NfaGVpZ2h0OworICAgICAgICBzZWxmLT5zc193aWR0aCA9IDA7CisgICAgICAgIHNlbGYtPnNzX2hlaWdodCA9IDA7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG91dDsKKyAgfQorCitkb25lOgorICByZXR1cm4gTlVMTDsKKwordG9vX3NtYWxsOgorICBHU1RfTE9HX09CSkVDVCAoc2VsZiwgIkludmFsaWQgcnRwIHBhY2tldCAodG9vIHNtYWxsKSwgaWdub3JpbmciKTsKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHNlbGYtPmFkYXB0ZXIpOworICBzZWxmLT5zdGFydGVkID0gRkFMU0U7CisKKyAgZ290byBkb25lOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfdnA5X2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cFZQOURlcGF5ICpzZWxmID0gR1NUX1JUUF9WUDlfREVQQVkgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBzZWxmLT5sYXN0X3dpZHRoID0gLTE7CisgICAgICBzZWxmLT5sYXN0X2hlaWdodCA9IC0xOworICAgICAgc2VsZi0+Y2Fwc19zZW50ID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4KKyAgICAgIEdTVF9FTEVNRU5UX0NMQVNTIChnc3RfcnRwX3ZwOV9kZXBheV9wYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsCisgICAgICB0cmFuc2l0aW9uKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3ZwOV9kZXBheV9oYW5kbGVfZXZlbnQgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheSwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UnRwVlA5RGVwYXkgKnNlbGYgPSBHU1RfUlRQX1ZQOV9ERVBBWSAoZGVwYXkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6CisgICAgICBzZWxmLT5sYXN0X3dpZHRoID0gLTE7CisgICAgICBzZWxmLT5sYXN0X2hlaWdodCA9IC0xOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuCisgICAgICBHU1RfUlRQX0JBU0VfREVQQVlMT0FEX0NMQVNTCisgICAgICAoZ3N0X3J0cF92cDlfZGVwYXlfcGFyZW50X2NsYXNzKS0+aGFuZGxlX2V2ZW50IChkZXBheSwgZXZlbnQpOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF92cDlfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHB2cDlkZXBheSIsCisgICAgICBHU1RfUkFOS19NQVJHSU5BTCwgR1NUX1RZUEVfUlRQX1ZQOV9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHZwOWRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cHZwOWRlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY3ODNhYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwdnA5ZGVwYXkuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogZ3N0cnRwdnA5ZGVwYXkuaCAtIEhlYWRlciBmb3IgR3N0UnRwVlA5RGVwYXkKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1ZQOV9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1ZQOV9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9WUDlfREVQQVkgXAorICAoZ3N0X3J0cF92cDlfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9WUDlfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSwgR1NUX1RZUEVfUlRQX1ZQOV9ERVBBWSwgR3N0UnRwVlA5RGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX1ZQOV9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSwgR1NUX1RZUEVfUlRQX1ZQOV9ERVBBWSwgXAorICAgIEdzdFJ0cFZQOURlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1ZQOV9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLCBHU1RfVFlQRV9SVFBfVlA5X0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9WUDlfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksIEdTVF9UWVBFX1JUUF9WUDlfREVQQVkpKQorI2RlZmluZSBHU1RfUlRQX1ZQOV9ERVBBWV9HRVRfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfUlRQX1ZQOV9ERVBBWSwgXAorICAgIEdzdFJ0cFZQOURlcGF5Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwVlA5RGVwYXkgR3N0UnRwVlA5RGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwVlA5RGVwYXlDbGFzcyBHc3RSdHBWUDlEZXBheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cFZQOURlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK3N0cnVjdCBfR3N0UnRwVlA5RGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBwYXJlbnQ7CisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisgIGdib29sZWFuIHN0YXJ0ZWQ7CisKKyAgZ2ludCBzc193aWR0aDsKKyAgZ2ludCBzc19oZWlnaHQ7CisgIGdpbnQgbGFzdF93aWR0aDsKKyAgZ2ludCBsYXN0X2hlaWdodDsKKyAgZ2Jvb2xlYW4gY2Fwc19zZW50OworfTsKKworR1R5cGUgZ3N0X3J0cF92cDlfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX3ZwOV9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qICNpZm5kZWYgX19HU1RfUlRQX1ZQOV9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwdnA5cGF5LmMgYi9nc3QvcnRwL2dzdHJ0cHZwOXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYjAxZTEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHZwOXBheS5jCkBAIC0wLDAgKzEsNTU2IEBACisvKgorICogZ3N0cnRwdnA5cGF5LmMgLSBTb3VyY2UgZm9yIEdzdFJ0cFZQOVBheQorICogQ29weXJpZ2h0IChDKSAyMDExIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBDb2xsYWJvcmEgTHRkLgorICogICBDb250YWN0OiBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSAyMDE1IFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJpdHJlYWRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwcGF5bG9hZHMuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgImRib29saHVmZi5oIgorI2luY2x1ZGUgImdzdHJ0cHZwOXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9ydHBfdnA5X3BheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfcnRwX3ZwOV9wYXlfZGVidWcKKworI2RlZmluZSBERUZBVUxUX1BJQ1RVUkVfSURfTU9ERSBWUDlfUEFZX05PX1BJQ1RVUkVfSUQKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUElDVFVSRV9JRF9NT0RFCit9OworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9WUDlfUEFZX1BJQ1RVUkVfSURfTU9ERSAoZ3N0X3J0cF92cDlfcGF5X3BpY3R1cmVfaWRfbW9kZV9nZXRfdHlwZSgpKQorc3RhdGljIEdUeXBlCitnc3RfcnRwX3ZwOV9wYXlfcGljdHVyZV9pZF9tb2RlX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgbW9kZV90eXBlID0gMDsKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgbW9kZXNbXSA9IHsKKyAgICB7VlA5X1BBWV9OT19QSUNUVVJFX0lELCAiTm8gUGljdHVyZSBJRCIsICJub25lIn0sCisgICAge1ZQOV9QQVlfUElDVFVSRV9JRF83QklUUywgIjctYml0IFBpY3R1cmUgSUQiLCAiNy1iaXQifSwKKyAgICB7VlA5X1BBWV9QSUNUVVJFX0lEXzE1QklUUywgIjE1LWJpdCBQaWN0dXJlIElEIiwgIjE1LWJpdCJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIW1vZGVfdHlwZSkgeworICAgIG1vZGVfdHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RWUDlSVFBQYXlNb2RlIiwgbW9kZXMpOworICB9CisgIHJldHVybiBtb2RlX3R5cGU7Cit9CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfdnA5X3BheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX3ZwOV9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX3ZwOV9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF92cDlfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3ZwOV9wYXlfc2V0X2NhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CisKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cFZQOVBheSwgZ3N0X3J0cF92cDlfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9QQVlMT0FEKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfdnA5X3BheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsIGVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSB7IFwiVlA5XCIsIFwiVlA5LURSQUZULUlFVEYtMDFcIiB9IikpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF92cDlfcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC12cDkiKSk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3ZwOV9wYXlfaW5pdCAoR3N0UnRwVlA5UGF5ICogb2JqKQoreworICBvYmotPnBpY3R1cmVfaWRfbW9kZSA9IERFRkFVTFRfUElDVFVSRV9JRF9NT0RFOworICBpZiAob2JqLT5waWN0dXJlX2lkX21vZGUgPT0gVlA5X1BBWV9QSUNUVVJFX0lEXzdCSVRTKQorICAgIG9iai0+cGljdHVyZV9pZCA9IGdfcmFuZG9tX2ludF9yYW5nZSAoMCwgR19NQVhVSU5UOCkgJiAweDdGOworICBlbHNlIGlmIChvYmotPnBpY3R1cmVfaWRfbW9kZSA9PSBWUDlfUEFZX1BJQ1RVUkVfSURfMTVCSVRTKQorICAgIG9iai0+cGljdHVyZV9pZCA9IGdfcmFuZG9tX2ludF9yYW5nZSAoMCwgR19NQVhVSU5UMTYpICYgMHg3RkZGOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF92cDlfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cFZQOVBheUNsYXNzICogZ3N0X3J0cF92cDlfcGF5X2NsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoZ3N0X3J0cF92cDlfcGF5X2NsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGdzdF9ydHBfdnA5X3BheV9jbGFzcyk7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKnBheV9jbGFzcyA9CisgICAgICBHU1RfUlRQX0JBU0VfUEFZTE9BRF9DTEFTUyAoZ3N0X3J0cF92cDlfcGF5X2NsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX3ZwOV9wYXlfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcnRwX3ZwOV9wYXlfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUElDVFVSRV9JRF9NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJwaWN0dXJlLWlkLW1vZGUiLCAiUGljdHVyZSBJRCBNb2RlIiwKKyAgICAgICAgICAiVGhlIHBpY3R1cmUgSUQgbW9kZSBmb3IgcGF5bG9hZGluZyIsCisgICAgICAgICAgR1NUX1RZUEVfUlRQX1ZQOV9QQVlfUElDVFVSRV9JRF9NT0RFLCBERUZBVUxUX1BJQ1RVUkVfSURfTU9ERSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3ZwOV9wYXlfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfdnA5X3BheV9zcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJSVFAgVlA5IHBheWxvYWRlciIsCisgICAgICAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQdXRzIFZQOSB2aWRlbyBpbiBSVFAgcGFja2V0cykiLCAiU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+Iik7CisKKyAgcGF5X2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF92cDlfcGF5X2hhbmRsZV9idWZmZXI7CisgIHBheV9jbGFzcy0+c2lua19ldmVudCA9IGdzdF9ydHBfdnA5X3BheV9zaW5rX2V2ZW50OworICBwYXlfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF92cDlfcGF5X3NldF9jYXBzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfcnRwX3ZwOV9wYXlfZGVidWcsICJydHB2cDlwYXkiLCAwLAorICAgICAgIlZQOSBWaWRlbyBSVFAgUGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3ZwOV9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cFZQOVBheSAqcnRwdnA5cGF5ID0gR1NUX1JUUF9WUDlfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QSUNUVVJFX0lEX01PREU6CisgICAgICBydHB2cDlwYXktPnBpY3R1cmVfaWRfbW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGlmIChydHB2cDlwYXktPnBpY3R1cmVfaWRfbW9kZSA9PSBWUDlfUEFZX1BJQ1RVUkVfSURfN0JJVFMpCisgICAgICAgIHJ0cHZwOXBheS0+cGljdHVyZV9pZCA9IGdfcmFuZG9tX2ludF9yYW5nZSAoMCwgR19NQVhVSU5UOCkgJiAweDdGOworICAgICAgZWxzZSBpZiAocnRwdnA5cGF5LT5waWN0dXJlX2lkX21vZGUgPT0gVlA5X1BBWV9QSUNUVVJFX0lEXzE1QklUUykKKyAgICAgICAgcnRwdnA5cGF5LT5waWN0dXJlX2lkID0gZ19yYW5kb21faW50X3JhbmdlICgwLCBHX01BWFVJTlQxNikgJiAweDdGRkY7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3ZwOV9wYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cFZQOVBheSAqcnRwdnA5cGF5ID0gR1NUX1JUUF9WUDlfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QSUNUVVJFX0lEX01PREU6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgcnRwdnA5cGF5LT5waWN0dXJlX2lkX21vZGUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisjZGVmaW5lIFZQOV9QUk9GSUxFXzAgMAorI2RlZmluZSBWUDlfUFJPRklMRV8xIDEKKyNkZWZpbmUgVlA5X1BST0ZJTEVfMiAyCisjZGVmaW5lIFZQOV9QUk9GSUxFXzMgMworI2RlZmluZSBWUDlfRlJBTUVfTUFSS0VSIDB4MgorI2RlZmluZSBWUFhfQ1NfU1JHQiA3CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF92cDlfcGF5X3BhcnNlX2ZyYW1lIChHc3RSdHBWUDlQYXkgKiBzZWxmLCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgZ3NpemUgYnVmZmVyX3NpemUpCit7CisgIEdzdE1hcEluZm8gbWFwID0gR1NUX01BUF9JTkZPX0lOSVQ7CisgIEdzdEJpdFJlYWRlciByZWFkZXI7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3NpemUgc2l6ZTsKKyAgZ2Jvb2xlYW4ga2V5ZnJhbWU7CisgIGd1aW50MzIgdG1wLCBwcm9maWxlOworCisgIGlmIChHX1VOTElLRUxZIChidWZmZXJfc2l6ZSA8IDMpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpIHx8ICFtYXAuZGF0YSkKKyAgICBnb3RvIGVycm9yOworCisgIGRhdGEgPSBtYXAuZGF0YTsKKyAgc2l6ZSA9IG1hcC5zaXplOworCisgIGdzdF9iaXRfcmVhZGVyX2luaXQgKCZyZWFkZXIsIGRhdGEsIHNpemUpOworCisKKyAgLyogZnJhbWUgbWFya2VyICovCisgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDMyICgmcmVhZGVyLCAmdG1wLCAyKQorICAgICAgfHwgdG1wICE9IFZQOV9GUkFNRV9NQVJLRVIpCisgICAgZ290byBlcnJvcjsKKworICAvKiBwcm9maWxlLCB2YXJpYWJsZSBsZW5ndGggKi8KKyAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MzIgKCZyZWFkZXIsICZwcm9maWxlLCAyKSkKKyAgICBnb3RvIGVycm9yOworICBpZiAocHJvZmlsZSA+IDIpIHsKKyAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQzMiAoJnJlYWRlciwgJnRtcCwgMSkpCisgICAgICBnb3RvIGVycm9yOworICAgIHByb2ZpbGUgKz0gdG1wOworICB9CisKKyAgLyogc2hvdyBleGlzdGluZyBmcmFtZSAqLworICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQzMiAoJnJlYWRlciwgJnRtcCwgMSkpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKHRtcCkgeworICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfc2tpcCAoJnJlYWRlciwgMykpCisgICAgICBnb3RvIGVycm9yOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgLyogZnJhbWUgdHlwZSAqLworICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQzMiAoJnJlYWRlciwgJnRtcCwgMSkpCisgICAgZ290byBlcnJvcjsKKyAgc2VsZi0+aXNfa2V5ZnJhbWUgPSBrZXlmcmFtZSA9ICh0bXAgPT0gMCk7CisKKyAgLyogc2hvdyBmcmFtZSBhbmQgcmVzaWxpZW50IG1vZGUgKi8KKyAgaWYgKCFnc3RfYml0X3JlYWRlcl9za2lwICgmcmVhZGVyLCAyKSkKKyAgICBnb3RvIGVycm9yOworCisgIGlmIChrZXlmcmFtZSkgeworICAgIC8qIHN5bmMgY29kZSAqLworICAgIGNvbnN0IGd1aW50MzIgc3luY19jb2RlID0gMHg0OTgzNDI7CisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MzIgKCZyZWFkZXIsICZ0bXAsIDI0KSkKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKHRtcCAhPSBzeW5jX2NvZGUpCisgICAgICBnb3RvIGVycm9yOworCisgICAgaWYgKHByb2ZpbGUgPj0gVlA5X1BST0ZJTEVfMikgeworICAgICAgLyogYml0IGRlcHRoICovCisgICAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX3NraXAgKCZyZWFkZXIsIDEpKQorICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8qIGNvbG9yIHNwYWNlICovCisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MzIgKCZyZWFkZXIsICZ0bXAsIDMpKQorICAgICAgZ290byBlcnJvcjsKKyAgICBpZiAodG1wICE9IFZQWF9DU19TUkdCKSB7CisgICAgICAvKiBjb2xvciByYW5nZSAqLworICAgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9za2lwICgmcmVhZGVyLCAxKSkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIGlmIChwcm9maWxlID09IFZQOV9QUk9GSUxFXzEgfHwgcHJvZmlsZSA9PSBWUDlfUFJPRklMRV8zKSB7CisgICAgICAgIC8qIHN1YnNhbXBsaW5nICsgcmVzZXJ2ZWQgYml0ICovCisgICAgICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfc2tpcCAoJnJlYWRlciwgMiArIDEpKQorICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChwcm9maWxlID09IFZQOV9QUk9GSUxFXzEgfHwgcHJvZmlsZSA9PSBWUDlfUFJPRklMRV8zKQorICAgICAgICAvKiByZXNlcnZlZCBiaXQgKi8KKyAgICAgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9za2lwICgmcmVhZGVyLCAxKSkKKyAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8qIGZyYW1lIHNpemUgKi8KKyAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQzMiAoJnJlYWRlciwgJnRtcCwgMTYpKQorICAgICAgZ290byBlcnJvcjsKKyAgICBzZWxmLT53aWR0aCA9IHRtcCArIDE7CisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MzIgKCZyZWFkZXIsICZ0bXAsIDE2KSkKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgc2VsZi0+aGVpZ2h0ID0gdG1wICsgMTsKKworICAgIC8qIHJlbmRlciBzaXplICovCisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MzIgKCZyZWFkZXIsICZ0bXAsIDEpKQorICAgICAgZ290byBlcnJvcjsKKyAgICBpZiAodG1wKSB7CisgICAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX3NraXAgKCZyZWFkZXIsIDMyKSkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHNlbGYsICJwYXJzZWQgd2lkdGg9JWQgaGVpZ2h0PSVkIiwgc2VsZi0+d2lkdGgsCisgICAgICAgIHNlbGYtPmhlaWdodCk7CisgIH0KKworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIHJldHVybiBUUlVFOworCitlcnJvcjoKKyAgR1NUX0RFQlVHICgiRmFpbGVkIHRvIHBhcnNlIGZyYW1lIik7CisgIGlmIChtYXAubWVtb3J5ICE9IE5VTEwpIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdzaXplCitnc3RfcnRwX3ZwOV9jYWxjX2hlYWRlcl9sZW4gKEdzdFJ0cFZQOVBheSAqIHNlbGYsIGdib29sZWFuIHN0YXJ0KQoreworICBnc2l6ZSBsZW4gPSAxOworCisgIHN3aXRjaCAoc2VsZi0+cGljdHVyZV9pZF9tb2RlKSB7CisgICAgY2FzZSBWUDlfUEFZX1BJQ1RVUkVfSURfN0JJVFM6CisgICAgICBsZW4gKz0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVlA5X1BBWV9QSUNUVVJFX0lEXzE1QklUUzoKKyAgICAgIGxlbiArPSAyOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIEFzc3VtZSBub24tZmxleGlibGUgbW9kZSAqLworICAvKiBBc3N1bWUgTC1iaXQgbm90IHNldCwgbm8gTCBoZWFkZXIgKi8KKworICBpZiAoc2VsZi0+aXNfa2V5ZnJhbWUgJiYgc3RhcnQpIHsKKyAgICAvKiBBc3N1bWUgVi1iaXQgc2V0ICovCisgICAgLyogRklYTUU6IFNTIGRlcGVuZHMgb24gbGF5ZXJzIGFuZCBwcmVkaWN0aW9uIHN0cnVjdHVyZSAqLworICAgIC8qIEZvciBub3cgYXNzdW1lIDEgc3BhdGlhbCBhbmQgMSB0ZW1wb3JhbCBsYXllci4gKi8KKyAgICAvKiBGSVhNRTogT25seSBmb3IgdGhlIGZpcnN0IHBhY2tldCBpbiB0aGUga2V5IGZyYW1lICovCisgICAgbGVuICs9IDg7CisgIH0KKworICByZXR1cm4gbGVuOworfQorCisvKiBWUDkgUlRQIGhlYWRlciwgbm9uLWZsZXhpYmxlIG1vZGU6CisKKyAgICAgICAgIDAgMSAyIDMgNCA1IDYgNworICAgICAgICArLSstKy0rLSstKy0rLSstKworICAgICAgICB8SXxQfEx8RnxCfEV8VnwtfCAoUkVRVUlSRUQpCisgICAgICAgICstKy0rLSstKy0rLSstKy0rCisgICBJOiAgIHxNfCBQSUNUVVJFIElEICB8IChSRUNPTU1FTkRFRCkKKyAgICAgICAgKy0rLSstKy0rLSstKy0rLSsKKyAgIE06ICAgfCBFWFRFTkRFRCBQSUQgIHwgKFJFQ09NTUVOREVEKQorICAgICAgICArLSstKy0rLSstKy0rLSstKworICAgTDogICB8ICBUICB8VXwgIFMgIHxEfCAoQ09ORElUSU9OQUxMWSBSRUNPTU1FTkRFRCkKKyAgICAgICAgKy0rLSstKy0rLSstKy0rLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1cCisgICBQLEY6IHwgUF9ESUZGICAgIHxYfE58IChDT05ESVRJT05BTExZIFJFQ09NTUVOREVEKSAgLgorICAgICAgICArLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gLSB1cCB0byAzIHRpbWVzCisgICBYOiAgIHxFWFRFTkRFRCBQX0RJRkZ8IChPUFRJT05BTCkgICAgICAgICAgICAgICAgICAgLgorICAgICAgICArLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS8KKyAgIFY6ICAgfCBTUyAgICAgICAgICAgIHwKKyAgICAgICAgfCAuLiAgICAgICAgICAgIHwKKyAgICAgICAgKy0rLSstKy0rLSstKy0rLSsKKworICAgU2NhbGFiaWxpdHkgc3RydWN0dXJlIChTUykKKyAgICAgKGZyb20gaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2V4dGVybmFsL3dlYnJ0Yy8rL0hFQUQvd2VicnRjL21vZHVsZXMvcnRwX3J0Y3Avc291cmNlL3J0cF9mb3JtYXRfdnA5LmNjCisgICAgIHNpbmNlIGxhdGVzdCBkcmFmdCBpcyBub3QgdXAgdG8gZGF0ZSB3aXRoIGNocm9taXVtKQorCisgICAgICAgICstKy0rLSstKy0rLSstKy0rCisgICBWOiAgIHwgTl9TIHxZfEd8LXwtfC18CisgICAgICAgICstKy0rLSstKy0rLSstKy0rICAgICAgICAgICAgICAtfAorICAgWTogICB8ICAgICBXSURUSCAgICAgfCAoT1BUSU9OQUwpICAgIC4KKyAgICAgICAgKyAgICAgICAgICAgICAgICsgICAgICAgICAgICAgICAuCisgICAgICAgIHwgICAgICAgICAgICAgICB8IChPUFRJT05BTCkgICAgLgorICAgICAgICArLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgIC4gTl9TICsgMSB0aW1lcworICAgICAgICB8ICAgICBIRUlHSFQgICAgfCAoT1BUSU9OQUwpICAgIC4KKyAgICAgICAgKyAgICAgICAgICAgICAgICsgICAgICAgICAgICAgICAuCisgICAgICAgIHwgICAgICAgICAgICAgICB8IChPUFRJT05BTCkgICAgLgorICAgICAgICArLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgLXwKKyAgIEc6ICAgfCAgICAgIE5fRyAgICAgIHwgKE9QVElPTkFMKQorICAgICAgICArLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC18CisgICBOX0c6IHwgIFQgIHxVfCBSIHwtfC18IChPUFRJT05BTCkgICAgICAgICAgICAgICAgIC4KKyAgICAgICAgKy0rLSstKy0rLSstKy0rLSsgICAgICAgICAgICAgIC18ICAgICAgICAgICAgLiBOX0cgdGltZXMKKyAgICAgICAgfCAgICBQX0RJRkYgICAgIHwgKE9QVElPTkFMKSAgICAuIFIgdGltZXMgICAgLgorICAgICAgICArLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgLXwgICAgICAgICAgIC18CisKKyoqLworCisvKiBXaGVuIGdyb3dpbmcgdGhlIHZwOSBoZWFkZXIga2VlcCBtYXggcGF5bG9hZCBsZW4gY2FsY3VsYXRpb24gaW4gc3luYyAqLworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX3ZwOV9jcmVhdGVfaGVhZGVyX2J1ZmZlciAoR3N0UnRwVlA5UGF5ICogc2VsZiwKKyAgICBnYm9vbGVhbiBzdGFydCwgZ2Jvb2xlYW4gbWFyaywgR3N0QnVmZmVyICogaW4pCit7CisgIEdzdEJ1ZmZlciAqb3V0OworICBndWludDggKnA7CisgIEdzdFJUUEJ1ZmZlciBydHBidWZmZXIgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworICBndWludCBvZmYgPSAxOworICBndWludCBoZHJsZW4gPSBnc3RfcnRwX3ZwOV9jYWxjX2hlYWRlcl9sZW4gKHNlbGYsIHN0YXJ0KTsKKworICBvdXQgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKGhkcmxlbiwgMCwgMCk7CisgIGdzdF9ydHBfYnVmZmVyX21hcCAob3V0LCBHU1RfTUFQX1JFQURXUklURSwgJnJ0cGJ1ZmZlcik7CisgIHAgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cGJ1ZmZlcik7CisgIHBbMF0gPSAweDA7CisKKyAgaWYgKHNlbGYtPnBpY3R1cmVfaWRfbW9kZSAhPSBWUDlfUEFZX05PX1BJQ1RVUkVfSUQpIHsKKyAgICBwWzBdIHw9IDB4ODA7CisgICAgaWYgKHNlbGYtPnBpY3R1cmVfaWRfbW9kZSA9PSBWUDlfUEFZX1BJQ1RVUkVfSURfN0JJVFMpIHsKKyAgICAgIC8qIE09MCAqLworICAgICAgcFtvZmYrK10gPSBzZWxmLT5waWN0dXJlX2lkICYgMHg3RjsKKyAgICB9IGVsc2UgeworICAgICAgLyogTT0xICovCisgICAgICBwW29mZisrXSA9IDB4ODAgfCAoKHNlbGYtPnBpY3R1cmVfaWQgJiAweDdGRkYpID4+IDgpOworICAgICAgcFtvZmYrK10gPSBzZWxmLT5waWN0dXJlX2lkICYgMHhGRjsKKyAgICB9CisgIH0KKworICBpZiAoIXNlbGYtPmlzX2tleWZyYW1lKQorICAgIHBbMF0gfD0gMHg0MDsKKyAgaWYgKHN0YXJ0KQorICAgIHBbMF0gfD0gMHgwODsKKyAgaWYgKG1hcmspCisgICAgcFswXSB8PSAweDA0OworCisgIGlmIChzZWxmLT5pc19rZXlmcmFtZSAmJiBzdGFydCkgeworICAgIHBbMF0gfD0gMHgwMjsKKyAgICAvKiBzY2FsYWJpbGl0eSBzdHJ1Y3R1cmUsIGhhcmQgY29kZWQgZm9yIG5vdyB0byBiZSBzaW1pbGFyIHRvIGNocm9taXVtIGZvcgorICAgICAqIHF1aWNrIGFuZCBkaXJ0eSBpbnRlcm9wICovCisgICAgcFtvZmYrK10gPSAweDE4OyAgICAgICAgICAgIC8qIE5fUz0wIFk9MSBHPTEgKi8KKyAgICBwW29mZisrXSA9IHNlbGYtPndpZHRoID4+IDg7CisgICAgcFtvZmYrK10gPSBzZWxmLT53aWR0aCAmIDB4RkY7CisgICAgcFtvZmYrK10gPSBzZWxmLT5oZWlnaHQgPj4gODsKKyAgICBwW29mZisrXSA9IHNlbGYtPmhlaWdodCAmIDB4RkY7CisgICAgcFtvZmYrK10gPSAweDAxOyAgICAgICAgICAgIC8qIE5fRz0xICovCisgICAgcFtvZmYrK10gPSAweDA0OyAgICAgICAgICAgIC8qIFQ9MCwgVT0wLCBSPTEgKi8KKyAgICBwW29mZisrXSA9IDB4MDE7ICAgICAgICAgICAgLyogUF9ESUZGPTEgKi8KKyAgfQorCisgIGdfYXNzZXJ0X2NtcGludCAob2ZmLCA9PSwgaGRybGVuKTsKKworICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwYnVmZmVyLCBtYXJrKTsKKworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cGJ1ZmZlcik7CisKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0KSA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGluKTsKKyAgR1NUX0JVRkZFUl9QVFMgKG91dCkgPSBHU1RfQlVGRkVSX1BUUyAoaW4pOworCisgIHJldHVybiBvdXQ7Cit9CisKK3N0YXRpYyBndWludAorZ3N0X3J0cF92cDlfcGF5bG9hZF9uZXh0IChHc3RSdHBWUDlQYXkgKiBzZWxmLCBHc3RCdWZmZXJMaXN0ICogbGlzdCwKKyAgICBndWludCBvZmZzZXQsIEdzdEJ1ZmZlciAqIGJ1ZmZlciwgZ3NpemUgYnVmZmVyX3NpemUsIGdzaXplIG1heF9wYXlsb2FkX2xlbikKK3sKKyAgR3N0QnVmZmVyICpoZWFkZXI7CisgIEdzdEJ1ZmZlciAqc3ViOworICBHc3RCdWZmZXIgKm91dDsKKyAgZ2Jvb2xlYW4gbWFyazsKKyAgZ3NpemUgcmVtYWluaW5nOworICBnc2l6ZSBhdmFpbGFibGU7CisKKyAgcmVtYWluaW5nID0gYnVmZmVyX3NpemUgLSBvZmZzZXQ7CisgIGF2YWlsYWJsZSA9IG1heF9wYXlsb2FkX2xlbjsKKyAgaWYgKGF2YWlsYWJsZSA+IHJlbWFpbmluZykKKyAgICBhdmFpbGFibGUgPSByZW1haW5pbmc7CisKKyAgbWFyayA9IChyZW1haW5pbmcgPT0gYXZhaWxhYmxlKTsKKyAgaGVhZGVyID0gZ3N0X3J0cF92cDlfY3JlYXRlX2hlYWRlcl9idWZmZXIgKHNlbGYsIG9mZnNldCA9PSAwLCBtYXJrLCBidWZmZXIpOworICBzdWIgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIG9mZnNldCwgYXZhaWxhYmxlKTsKKworICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAoc2VsZiwgaGVhZGVyLCBidWZmZXIpOworCisgIG91dCA9IGdzdF9idWZmZXJfYXBwZW5kIChoZWFkZXIsIHN1Yik7CisKKyAgZ3N0X2J1ZmZlcl9saXN0X2luc2VydCAobGlzdCwgLTEsIG91dCk7CisKKyAgcmV0dXJuIGF2YWlsYWJsZTsKK30KKworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF92cDlfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSdHBWUDlQYXkgKnNlbGYgPSBHU1RfUlRQX1ZQOV9QQVkgKHBheWxvYWQpOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0QnVmZmVyTGlzdCAqbGlzdDsKKyAgZ3NpemUgc2l6ZSwgbWF4X3BheWxlbjsKKyAgZ3VpbnQgb2Zmc2V0LCBtdHUsIHZwOV9oZHJfbGVuOworCisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpOworCisgIGlmIChHX1VOTElLRUxZICghZ3N0X3J0cF92cDlfcGF5X3BhcnNlX2ZyYW1lIChzZWxmLCBidWZmZXIsIHNpemUpKSkgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzZWxmLCBTVFJFQU0sIEVOQ09ERSwgKE5VTEwpLAorICAgICAgICAoIkZhaWxlZCB0byBwYXJzZSBWUDkgZnJhbWUiKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgbXR1ID0gR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVIChwYXlsb2FkKTsKKyAgdnA5X2hkcl9sZW4gPSBnc3RfcnRwX3ZwOV9jYWxjX2hlYWRlcl9sZW4gKHNlbGYsIFRSVUUpOworICBtYXhfcGF5bGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYXlsb2FkX2xlbiAobXR1IC0gdnA5X2hkcl9sZW4sIDAsIDApOworCisgIGxpc3QgPSBnc3RfYnVmZmVyX2xpc3RfbmV3X3NpemVkICgoc2l6ZSAvIG1heF9wYXlsZW4pICsgMSk7CisKKyAgb2Zmc2V0ID0gMDsKKyAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKKyAgICBvZmZzZXQgKz0KKyAgICAgICAgZ3N0X3J0cF92cDlfcGF5bG9hZF9uZXh0IChzZWxmLCBsaXN0LCBvZmZzZXQsIGJ1ZmZlciwgc2l6ZSwgbWF4X3BheWxlbik7CisgIH0KKworICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoX2xpc3QgKHBheWxvYWQsIGxpc3QpOworCisgIC8qIEluY3JlbWVuZW50IGFuZCB3cmFwIHRoZSBwaWN0dXJlIGlkIGlmIGl0IG92ZXJmbG93cyAqLworICBpZiAoKHNlbGYtPnBpY3R1cmVfaWRfbW9kZSA9PSBWUDlfUEFZX1BJQ1RVUkVfSURfN0JJVFMgJiYKKyAgICAgICAgICArK3NlbGYtPnBpY3R1cmVfaWQgPj0gMHg4MCkgfHwKKyAgICAgIChzZWxmLT5waWN0dXJlX2lkX21vZGUgPT0gVlA5X1BBWV9QSUNUVVJFX0lEXzE1QklUUyAmJgorICAgICAgICAgICsrc2VsZi0+cGljdHVyZV9pZCA+PSAweDgwMDApKQorICAgIHNlbGYtPnBpY3R1cmVfaWQgPSAwOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3ZwOV9wYXlfc2lua19ldmVudCAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBWUDlQYXkgKnNlbGYgPSBHU1RfUlRQX1ZQOV9QQVkgKHBheWxvYWQpOworCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID09IEdTVF9FVkVOVF9GTFVTSF9TVEFSVCkgeworICAgIGlmIChzZWxmLT5waWN0dXJlX2lkX21vZGUgPT0gVlA5X1BBWV9QSUNUVVJFX0lEXzdCSVRTKQorICAgICAgc2VsZi0+cGljdHVyZV9pZCA9IGdfcmFuZG9tX2ludF9yYW5nZSAoMCwgR19NQVhVSU5UOCkgJiAweDdGOworICAgIGVsc2UgaWYgKHNlbGYtPnBpY3R1cmVfaWRfbW9kZSA9PSBWUDlfUEFZX1BJQ1RVUkVfSURfMTVCSVRTKQorICAgICAgc2VsZi0+cGljdHVyZV9pZCA9IGdfcmFuZG9tX2ludF9yYW5nZSAoMCwgR19NQVhVSU5UMTYpICYgMHg3RkZGOworICB9CisKKyAgcmV0dXJuIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChnc3RfcnRwX3ZwOV9wYXlfcGFyZW50X2NsYXNzKS0+c2lua19ldmVudAorICAgICAgKHBheWxvYWQsIGV2ZW50KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3ZwOV9wYXlfc2V0X2NhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKnNyY19jYXBzOworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIGNoYXIgKmVuY29kaW5nX25hbWU7CisKKyAgc3JjX2NhcHMgPSBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NSQ1BBRCAocGF5bG9hZCkpOworICBpZiAoc3JjX2NhcHMpIHsKKyAgICBzcmNfY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKHNyY19jYXBzKTsKKyAgICBzcmNfY2FwcyA9IGdzdF9jYXBzX3RydW5jYXRlIChzcmNfY2Fwcyk7CisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHNyY19jYXBzLCAwKTsKKyAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9zdHJpbmcgKHMsICJlbmNvZGluZy1uYW1lIiwgIlZQOSIpOworICAgIGVuY29kaW5nX25hbWUgPSBnX3N0cmR1cCAoZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAiZW5jb2RpbmctbmFtZSIpKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoc3JjX2NhcHMpOworICB9IGVsc2UgeworICAgIGVuY29kaW5nX25hbWUgPSBnX3N0cmR1cCAoIlZQOS1EUkFGVC1JRVRGLTAxIik7CisgIH0KKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAocGF5bG9hZCwgInZpZGVvIiwgVFJVRSwKKyAgICAgIGVuY29kaW5nX25hbWUsIDkwMDAwKTsKKyAgZ19mcmVlIChlbmNvZGluZ19uYW1lKTsKKyAgcmV0dXJuIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChwYXlsb2FkLCBOVUxMKTsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfdnA5X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHZwOXBheSIsCisgICAgICBHU1RfUkFOS19NQVJHSU5BTCwgR1NUX1RZUEVfUlRQX1ZQOV9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHB2cDlwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwdnA5cGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyYWE4ZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwdnA5cGF5LmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIGdzdHJ0cHZwOXBheS5oIC0gSGVhZGVyIGZvciBHc3RSdHBWUDlQYXkKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1ZQOV9QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9WUDlfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1ZQOV9QQVkgXAorICAoZ3N0X3J0cF92cDlfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfVlA5X1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLCBHU1RfVFlQRV9SVFBfVlA5X1BBWSwgR3N0UnRwVlA5UGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9WUDlfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLCBHU1RfVFlQRV9SVFBfVlA5X1BBWSwgR3N0UnRwVlA5UGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1ZQOV9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSwgR1NUX1RZUEVfUlRQX1ZQOV9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX1ZQOV9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksIEdTVF9UWVBFX1JUUF9WUDlfUEFZKSkKKyNkZWZpbmUgR1NUX1JUUF9WUDlfUEFZX0dFVF9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9SVFBfVlA5X1BBWSwgR3N0UnRwVlA5UGF5Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwVlA5UGF5IEdzdFJ0cFZQOVBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBWUDlQYXlDbGFzcyBHc3RSdHBWUDlQYXlDbGFzczsKK3R5cGVkZWYgZW51bSBfVlA5UGljdHVyZUlETW9kZSBWUDlQaWN0dXJlSURNb2RlOworCitlbnVtIF9WUDlQaWN0dXJlSURNb2RlIHsKKyAgVlA5X1BBWV9OT19QSUNUVVJFX0lELAorICBWUDlfUEFZX1BJQ1RVUkVfSURfN0JJVFMsCisgIFZQOV9QQVlfUElDVFVSRV9JRF8xNUJJVFMsCit9OworCitzdHJ1Y3QgX0dzdFJ0cFZQOVBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworc3RydWN0IF9Hc3RSdHBWUDlQYXkKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWQgcGFyZW50OworICBnYm9vbGVhbiBpc19rZXlmcmFtZTsKKyAgZ3VpbnQgd2lkdGg7CisgIGd1aW50IGhlaWdodDsKKyAgVlA5UGljdHVyZUlETW9kZSBwaWN0dXJlX2lkX21vZGU7CisgIGd1aW50MTYgcGljdHVyZV9pZDsKK307CisKK0dUeXBlIGdzdF9ydHBfdnA5X3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfdnA5X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qICNpZm5kZWYgX19HU1RfUlRQX1ZQOV9QQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDJiYjUxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYwpAQCAtMCwwICsxLDY2NiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA4PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImdzdHJ0cHZyYXdkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cHZyYXdkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwdnJhd2RlcGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF92cmF3X2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1yYXciKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3ZyYXdfZGVwYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiUkFXXCIsICIKKyAgICAgICAgInNhbXBsaW5nID0gKHN0cmluZykgeyBcIlJHQlwiLCBcIlJHQkFcIiwgXCJCR1JcIiwgXCJCR1JBXCIsICIKKyAgICAgICAgIlwiWUNiQ3ItNDo0OjRcIiwgXCJZQ2JDci00OjI6MlwiLCBcIllDYkNyLTQ6MjowXCIsICIKKyAgICAgICAgIlwiWUNiQ3ItNDoxOjFcIiB9LCIKKyAgICAgICAgLyogd2UgY2Fubm90IGV4cHJlc3MgdGhlc2UgYXMgc3RyaW5ncyAKKyAgICAgICAgICogIndpZHRoID0gKHN0cmluZykgWzEgMzI3NjddLCIKKyAgICAgICAgICogImhlaWdodCA9IChzdHJpbmcpIFsxIDMyNzY3XSwiCisgICAgICAgICAqLworICAgICAgICAiZGVwdGggPSAoc3RyaW5nKSB7IFwiOFwiLCBcIjEwXCIsIFwiMTJcIiwgXCIxNlwiIH0iKQorICAgICk7CisKKyNkZWZpbmUgZ3N0X3J0cF92cmF3X2RlcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cFZSYXdEZXBheSwgZ3N0X3J0cF92cmF3X2RlcGF5LAorICAgIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3ZyYXdfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX3ZyYXdfZGVwYXlfcHJvY2Vzc19wYWNrZXQgKEdzdFJUUEJhc2VEZXBheWxvYWQgKgorICAgIGRlcGF5LCBHc3RSVFBCdWZmZXIgKiBydHApOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF92cmF3X2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3ZyYXdfZGVwYXlfaGFuZGxlX2V2ZW50IChHc3RSVFBCYXNlRGVwYXlsb2FkICogZmlsdGVyLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF92cmF3X2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cFZSYXdEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfcnRwX3ZyYXdfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF92cmF3X2RlcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9CisgICAgICBnc3RfcnRwX3ZyYXdfZGVwYXlfcHJvY2Vzc19wYWNrZXQ7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPmhhbmRsZV9ldmVudCA9IGdzdF9ydHBfdnJhd19kZXBheV9oYW5kbGVfZXZlbnQ7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF92cmF3X2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfdnJhd19kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBSYXcgVmlkZW8gZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIHJhdyB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgNDE3NSkiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cHZyYXdkZXBheV9kZWJ1ZywgInJ0cHZyYXdkZXBheSIsIDAsCisgICAgICAicmF3IHZpZGVvIFJUUCBEZXBheWxvYWRlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF92cmF3X2RlcGF5X2luaXQgKEdzdFJ0cFZSYXdEZXBheSAqIHJ0cHZyYXdkZXBheSkKK3sKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdnJhd19kZXBheV9yZXNldCAoR3N0UnRwVlJhd0RlcGF5ICogcnRwdnJhd2RlcGF5KQoreworICBpZiAocnRwdnJhd2RlcGF5LT5vdXRidWYpIHsKKyAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKCZydHB2cmF3ZGVwYXktPmZyYW1lKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChydHB2cmF3ZGVwYXktPm91dGJ1Zik7CisgICAgcnRwdnJhd2RlcGF5LT5vdXRidWYgPSBOVUxMOworICB9CisgIHJ0cHZyYXdkZXBheS0+dGltZXN0YW1wID0gLTE7CisgIGlmIChydHB2cmF3ZGVwYXktPnBvb2wpIHsKKyAgICBnc3RfYnVmZmVyX3Bvb2xfc2V0X2FjdGl2ZSAocnRwdnJhd2RlcGF5LT5wb29sLCBGQUxTRSk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocnRwdnJhd2RlcGF5LT5wb29sKTsKKyAgICBydHB2cmF3ZGVwYXktPnBvb2wgPSBOVUxMOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX3ZyYXdfZGVwYXlfbmVnb3RpYXRlX3Bvb2wgKEdzdFJ0cFZSYXdEZXBheSAqIGRlcGF5LCBHc3RDYXBzICogY2FwcywKKyAgICBHc3RWaWRlb0luZm8gKiBpbmZvKQoreworICBHc3RRdWVyeSAqcXVlcnk7CisgIEdzdEJ1ZmZlclBvb2wgKnBvb2wgPSBOVUxMOworICBndWludCBzaXplLCBtaW4sIG1heDsKKyAgR3N0U3RydWN0dXJlICpjb25maWc7CisKKyAgLyogZmluZCBhIHBvb2wgZm9yIHRoZSBuZWdvdGlhdGVkIGNhcHMgbm93ICovCisgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19hbGxvY2F0aW9uIChjYXBzLCBUUlVFKTsKKworICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeSAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKGRlcGF5KSwgcXVlcnkpKSB7CisgICAgLyogbm90IGEgcHJvYmxlbSwgd2UgdXNlIHRoZSBkZWZhdWx0cyBvZiBxdWVyeSAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5LCAiY291bGQgbm90IGdldCBkb3duc3RyZWFtIEFMTE9DQVRJT04gaGludHMiKTsKKyAgfQorCisgIGlmIChnc3RfcXVlcnlfZ2V0X25fYWxsb2NhdGlvbl9wb29scyAocXVlcnkpID4gMCkgeworICAgIC8qIHdlIGdvdCBjb25maWd1cmF0aW9uIGZyb20gb3VyIHBlZXIsIHBhcnNlIHRoZW0gKi8KKyAgICBnc3RfcXVlcnlfcGFyc2VfbnRoX2FsbG9jYXRpb25fcG9vbCAocXVlcnksIDAsICZwb29sLCAmc2l6ZSwgJm1pbiwgJm1heCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXksICJkaWRuJ3QgZ2V0IGRvd25zdHJlYW0gcG9vbCBoaW50cyIpOworICAgIHNpemUgPSBpbmZvLT5zaXplOworICAgIG1pbiA9IG1heCA9IDA7CisgIH0KKworICBpZiAocG9vbCA9PSBOVUxMKSB7CisgICAgLyogd2UgZGlkIG5vdCBnZXQgYSBwb29sLCBtYWtlIG9uZSBvdXJzZWx2ZXMgdGhlbiAqLworICAgIHBvb2wgPSBnc3RfdmlkZW9fYnVmZmVyX3Bvb2xfbmV3ICgpOworICB9CisKKyAgaWYgKGRlcGF5LT5wb29sKQorICAgIGdzdF9vYmplY3RfdW5yZWYgKGRlcGF5LT5wb29sKTsKKyAgZGVwYXktPnBvb2wgPSBwb29sOworCisgIGNvbmZpZyA9IGdzdF9idWZmZXJfcG9vbF9nZXRfY29uZmlnIChwb29sKTsKKyAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19zZXRfcGFyYW1zIChjb25maWcsIGNhcHMsIHNpemUsIG1pbiwgbWF4KTsKKyAgaWYgKGdzdF9xdWVyeV9maW5kX2FsbG9jYXRpb25fbWV0YSAocXVlcnksIEdTVF9WSURFT19NRVRBX0FQSV9UWVBFLCBOVUxMKSkgeworICAgIC8qIGp1c3Qgc2V0IHRoZSBtZXRhZGF0YSwgaWYgdGhlIHBvb2wgY2FuIHN1cHBvcnQgaXQgd2Ugd2lsbCB0cmFuc3BhcmVudGx5IHVzZQorICAgICAqIGl0IHRocm91Z2ggdGhlIHZpZGVvIGluZm8gQVBJLiBXZSBjb3VsZCBhbHNvIHNlZSBpZiB0aGUgcG9vbCBzdXBwb3J0IHRoaXMKKyAgICAgKiBtZXRhZGF0YSBhbmQgb25seSBhY3RpdmF0ZSBpdCB0aGVuLiAqLworICAgIGdzdF9idWZmZXJfcG9vbF9jb25maWdfYWRkX29wdGlvbiAoY29uZmlnLAorICAgICAgICBHU1RfQlVGRkVSX1BPT0xfT1BUSU9OX1ZJREVPX01FVEEpOworICB9CisKKyAgZ3N0X2J1ZmZlcl9wb29sX3NldF9jb25maWcgKHBvb2wsIGNvbmZpZyk7CisgIC8qIGFuZCBhY3RpdmF0ZSAqLworICBnc3RfYnVmZmVyX3Bvb2xfc2V0X2FjdGl2ZSAocG9vbCwgVFJVRSk7CisKKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfdnJhd19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdFJ0cFZSYXdEZXBheSAqcnRwdnJhd2RlcGF5OworICBnaW50IGNsb2NrX3JhdGU7CisgIGNvbnN0IGdjaGFyICpzdHI7CisgIGdpbnQgZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgcGdyb3VwLCB4aW5jLCB5aW5jOworICBHc3RDYXBzICpzcmNjYXBzOworICBnYm9vbGVhbiByZXM7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIHJ0cHZyYXdkZXBheSA9IEdTVF9SVFBfVlJBV19ERVBBWSAoZGVwYXlsb2FkKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICB4aW5jID0geWluYyA9IDE7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgY2xvY2tfcmF0ZSA9IDkwMDAwOyAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgZGVwYXlsb2FkLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICBpZiAoIShzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgIndpZHRoIikpKQorICAgIGdvdG8gbm9fd2lkdGg7CisgIHdpZHRoID0gYXRvaSAoc3RyKTsKKworICBpZiAoIShzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImhlaWdodCIpKSkKKyAgICBnb3RvIG5vX2hlaWdodDsKKyAgaGVpZ2h0ID0gYXRvaSAoc3RyKTsKKworICBpZiAoIShzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImRlcHRoIikpKQorICAgIGdvdG8gbm9fZGVwdGg7CisgIGRlcHRoID0gYXRvaSAoc3RyKTsKKworICAvKiBvcHRpb25hbCBpbnRlcmxhY2UgdmFsdWUgYnV0IHdlIGRvbid0IGhhbmRsZSBpbnRlcmxhY2VkCisgICAqIGZvcm1hdHMgeWV0ICovCisgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImludGVybGFjZSIpKQorICAgIGdvdG8gaW50ZXJsYWNlZDsKKworICBpZiAoIShzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgInNhbXBsaW5nIikpKQorICAgIGdvdG8gbm9fc2FtcGxpbmc7CisKKyAgaWYgKCFzdHJjbXAgKHN0ciwgIlJHQiIpKSB7CisgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9SR0I7CisgICAgcGdyb3VwID0gMzsKKyAgfSBlbHNlIGlmICghc3RyY21wIChzdHIsICJSR0JBIikpIHsKKyAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX1JHQkE7CisgICAgcGdyb3VwID0gNDsKKyAgfSBlbHNlIGlmICghc3RyY21wIChzdHIsICJCR1IiKSkgeworICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfQkdSOworICAgIHBncm91cCA9IDM7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoc3RyLCAiQkdSQSIpKSB7CisgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9CR1JBOworICAgIHBncm91cCA9IDQ7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoc3RyLCAiWUNiQ3ItNDo0OjQiKSkgeworICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfQVlVVjsKKyAgICBwZ3JvdXAgPSAzOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKHN0ciwgIllDYkNyLTQ6MjoyIikpIHsKKyAgICBpZiAoZGVwdGggPT0gOCkgeworICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9VWVZZOworICAgICAgcGdyb3VwID0gNDsKKyAgICB9IGVsc2UgaWYgKGRlcHRoID09IDEwKSB7CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX1VZVlA7CisgICAgICBwZ3JvdXAgPSA1OworICAgIH0gZWxzZQorICAgICAgZ290byB1bmtub3duX2Zvcm1hdDsKKyAgICB4aW5jID0gMjsKKyAgfSBlbHNlIGlmICghc3RyY21wIChzdHIsICJZQ2JDci00OjI6MCIpKSB7CisgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9JNDIwOworICAgIHBncm91cCA9IDY7CisgICAgeGluYyA9IHlpbmMgPSAyOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKHN0ciwgIllDYkNyLTQ6MToxIikpIHsKKyAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX1k0MUI7CisgICAgcGdyb3VwID0gNjsKKyAgICB4aW5jID0gNDsKKyAgfSBlbHNlIHsKKyAgICBnb3RvIHVua25vd25fZm9ybWF0OworICB9CisKKyAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoJnJ0cHZyYXdkZXBheS0+dmluZm8pOworICBnc3RfdmlkZW9faW5mb19zZXRfZm9ybWF0ICgmcnRwdnJhd2RlcGF5LT52aW5mbywgZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgR1NUX1ZJREVPX0lORk9fRlBTX04gKCZydHB2cmF3ZGVwYXktPnZpbmZvKSA9IDA7CisgIEdTVF9WSURFT19JTkZPX0ZQU19EICgmcnRwdnJhd2RlcGF5LT52aW5mbykgPSAxOworCisgIHJ0cHZyYXdkZXBheS0+cGdyb3VwID0gcGdyb3VwOworICBydHB2cmF3ZGVwYXktPnhpbmMgPSB4aW5jOworICBydHB2cmF3ZGVwYXktPnlpbmMgPSB5aW5jOworCisgIHNyY2NhcHMgPSBnc3RfdmlkZW9faW5mb190b19jYXBzICgmcnRwdnJhd2RlcGF5LT52aW5mbyk7CisgIHJlcyA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgIndpZHRoICVkLCBoZWlnaHQgJWQsIGZvcm1hdCAlZCIsIHdpZHRoLCBoZWlnaHQsCisgICAgICBmb3JtYXQpOworICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsICJ4aW5jICVkLCB5aW5jICVkLCBwZ3JvdXAgJWQiLAorICAgICAgeGluYywgeWluYywgcGdyb3VwKTsKKworICAvKiBuZWdvdGlhdGUgYSBidWZmZXJwb29sICovCisgIGlmICgocmV0ID0gZ3N0X3J0cF92cmF3X2RlcGF5X25lZ290aWF0ZV9wb29sIChydHB2cmF3ZGVwYXksIHNyY2NhcHMsCisgICAgICAgICAgICAgICZydHB2cmF3ZGVwYXktPnZpbmZvKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBub19idWZmZXJwb29sOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitub193aWR0aDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlcGF5bG9hZCwgIm5vIHdpZHRoIHNwZWNpZmllZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9faGVpZ2h0OgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZGVwYXlsb2FkLCAibm8gaGVpZ2h0IHNwZWNpZmllZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fZGVwdGg6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkZXBheWxvYWQsICJubyBkZXB0aCBzcGVjaWZpZWQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludGVybGFjZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkZXBheWxvYWQsICJpbnRlcmxhY2VkIGZvcm1hdHMgbm90IHN1cHBvcnRlZCB5ZXQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX3NhbXBsaW5nOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZGVwYXlsb2FkLCAibm8gc2FtcGxpbmcgc3BlY2lmaWVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit1bmtub3duX2Zvcm1hdDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlcGF5bG9hZCwgInVua25vd24gc2FtcGxpbmcgZm9ybWF0ICclcyciLCBzdHIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fYnVmZmVycG9vbDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgIm5vIGJ1ZmZlcnBvb2wiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX3ZyYXdfZGVwYXlfcHJvY2Vzc19wYWNrZXQgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RSdHBWUmF3RGVwYXkgKnJ0cHZyYXdkZXBheTsKKyAgZ3VpbnQ4ICpwYXlsb2FkLCAqcDAsICp5cCwgKnVwLCAqdnAsICpoZWFkZXJzOworICBndWludDMyIHRpbWVzdGFtcDsKKyAgZ3VpbnQgY29udCwgeXN0cmlkZSwgdXZzdHJpZGUsIHBncm91cCwgcGF5bG9hZF9sZW47CisgIGdpbnQgd2lkdGgsIGhlaWdodCwgeGluYywgeWluYzsKKyAgR3N0VmlkZW9GcmFtZSAqZnJhbWU7CisgIGdib29sZWFuIG1hcmtlcjsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworCisgIHJ0cHZyYXdkZXBheSA9IEdTVF9SVFBfVlJBV19ERVBBWSAoZGVwYXlsb2FkKTsKKworICB0aW1lc3RhbXAgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wIChydHApOworCisgIGlmICh0aW1lc3RhbXAgIT0gcnRwdnJhd2RlcGF5LT50aW1lc3RhbXAgfHwgcnRwdnJhd2RlcGF5LT5vdXRidWYgPT0gTlVMTCkgeworICAgIEdzdEJ1ZmZlciAqbmV3X2J1ZmZlcjsKKyAgICBHc3RGbG93UmV0dXJuIHJldDsKKworICAgIEdTVF9MT0dfT0JKRUNUIChkZXBheWxvYWQsICJuZXcgZnJhbWUgd2l0aCB0aW1lc3RhbXAgJXUiLCB0aW1lc3RhbXApOworICAgIC8qIG5ldyB0aW1lc3RhbXAsIGZsdXNoIG9sZCBidWZmZXIgYW5kIGNyZWF0ZSBuZXcgb3V0cHV0IGJ1ZmZlciAqLworICAgIGlmIChydHB2cmF3ZGVwYXktPm91dGJ1ZikgeworICAgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmcnRwdnJhd2RlcGF5LT5mcmFtZSk7CisgICAgICBnc3RfcnRwX2Jhc2VfZGVwYXlsb2FkX3B1c2ggKGRlcGF5bG9hZCwgcnRwdnJhd2RlcGF5LT5vdXRidWYpOworICAgICAgcnRwdnJhd2RlcGF5LT5vdXRidWYgPSBOVUxMOworICAgIH0KKworICAgIGlmIChnc3RfcGFkX2NoZWNrX3JlY29uZmlndXJlIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NSQ1BBRCAoZGVwYXlsb2FkKSkpIHsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgIGNhcHMgPQorICAgICAgICAgIGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKGRlcGF5bG9hZCkpOworICAgICAgZ3N0X3J0cF92cmF3X2RlcGF5X25lZ290aWF0ZV9wb29sIChydHB2cmF3ZGVwYXksIGNhcHMsCisgICAgICAgICAgJnJ0cHZyYXdkZXBheS0+dmluZm8pOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIH0KKworICAgIHJldCA9CisgICAgICAgIGdzdF9idWZmZXJfcG9vbF9hY3F1aXJlX2J1ZmZlciAocnRwdnJhd2RlcGF5LT5wb29sLCAmbmV3X2J1ZmZlciwgTlVMTCk7CisKKyAgICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LKSkKKyAgICAgIGdvdG8gYWxsb2NfZmFpbGVkOworCisgICAgLyogY2xlYXIgdGltZXN0YW1wIGZyb20gYWxsb2MuLi4gKi8KKyAgICBHU1RfQlVGRkVSX1BUUyAobmV3X2J1ZmZlcikgPSAtMTsKKworICAgIGlmICghZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJnJ0cHZyYXdkZXBheS0+ZnJhbWUsICZydHB2cmF3ZGVwYXktPnZpbmZvLAorICAgICAgICAgICAgbmV3X2J1ZmZlciwgR1NUX01BUF9XUklURSB8IEdTVF9WSURFT19GUkFNRV9NQVBfRkxBR19OT19SRUYpKSB7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChuZXdfYnVmZmVyKTsKKyAgICAgIGdvdG8gaW52YWxpZF9mcmFtZTsKKyAgICB9CisKKyAgICBydHB2cmF3ZGVwYXktPm91dGJ1ZiA9IG5ld19idWZmZXI7CisgICAgcnRwdnJhd2RlcGF5LT50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgIH0KKworICBmcmFtZSA9ICZydHB2cmF3ZGVwYXktPmZyYW1lOworCisgIGdfYXNzZXJ0IChmcmFtZS0+YnVmZmVyICE9IE5VTEwpOworCisgIC8qIGdldCBwb2ludGVyIGFuZCBzdHJpZGVzIG9mIHRoZSBwbGFuZXMgKi8KKyAgcDAgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZnJhbWUsIDApOworICB5cCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lLCAwKTsKKyAgdXAgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZSwgMSk7CisgIHZwID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZnJhbWUsIDIpOworCisgIHlzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAwKTsKKyAgdXZzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAxKTsKKworICBwZ3JvdXAgPSBydHB2cmF3ZGVwYXktPnBncm91cDsKKyAgd2lkdGggPSBHU1RfVklERU9fSU5GT19XSURUSCAoJnJ0cHZyYXdkZXBheS0+dmluZm8pOworICBoZWlnaHQgPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZydHB2cmF3ZGVwYXktPnZpbmZvKTsKKyAgeGluYyA9IHJ0cHZyYXdkZXBheS0+eGluYzsKKyAgeWluYyA9IHJ0cHZyYXdkZXBheS0+eWluYzsKKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworCisgIGlmIChwYXlsb2FkX2xlbiA8IDMpCisgICAgZ290byBzaG9ydF9wYWNrZXQ7CisKKyAgLyogc2tpcCBleHRlbmRlZCBzZXFudW0gKi8KKyAgcGF5bG9hZCArPSAyOworICBwYXlsb2FkX2xlbiAtPSAyOworCisgIC8qIHJlbWVtYmVyIGhlYWRlciBwb3NpdGlvbiAqLworICBoZWFkZXJzID0gcGF5bG9hZDsKKworICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwdnJhd2RlcGF5LCBmcmFtZS0+YnVmZmVyLCBydHAtPmJ1ZmZlcik7CisKKyAgLyogZmluZCBkYXRhIHN0YXJ0ICovCisgIGRvIHsKKyAgICBpZiAocGF5bG9hZF9sZW4gPCA2KQorICAgICAgZ290byBzaG9ydF9wYWNrZXQ7CisKKyAgICBjb250ID0gcGF5bG9hZFs0XSAmIDB4ODA7CisKKyAgICBwYXlsb2FkICs9IDY7CisgICAgcGF5bG9hZF9sZW4gLT0gNjsKKyAgfSB3aGlsZSAoY29udCk7CisKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBndWludCBsZW5ndGgsIGxpbmUsIG9mZnMsIHBsZW47CisgICAgZ3VpbnQ4ICpkYXRhcDsKKworICAgIC8qIHN0b3Agd2hlbiB3ZSBydW4gb3V0IG9mIGRhdGEgKi8KKyAgICBpZiAocGF5bG9hZF9sZW4gPT0gMCkKKyAgICAgIGJyZWFrOworCisgICAgLyogcmVhZCBsZW5ndGggYW5kIGNvbnQuIFRoaXMgc2hvdWxkIHdvcmsgYmVjYXVzZSB3ZSBpdGVyYXRlZCB0aGUgaGVhZGVycworICAgICAqIGFib3ZlLiAqLworICAgIGxlbmd0aCA9IChoZWFkZXJzWzBdIDw8IDgpIHwgaGVhZGVyc1sxXTsKKyAgICBsaW5lID0gKChoZWFkZXJzWzJdICYgMHg3ZikgPDwgOCkgfCBoZWFkZXJzWzNdOworICAgIG9mZnMgPSAoKGhlYWRlcnNbNF0gJiAweDdmKSA8PCA4KSB8IGhlYWRlcnNbNV07CisgICAgY29udCA9IGhlYWRlcnNbNF0gJiAweDgwOworICAgIGhlYWRlcnMgKz0gNjsKKworICAgIC8qIGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgcGdyb3VwICovCisgICAgaWYgKGxlbmd0aCAlIHBncm91cCAhPSAwKQorICAgICAgZ290byB3cm9uZ19sZW5ndGg7CisKKyAgICBpZiAobGVuZ3RoID4gcGF5bG9hZF9sZW4pCisgICAgICBsZW5ndGggPSBwYXlsb2FkX2xlbjsKKworICAgIC8qIHNhbml0eSBjaGVjayAqLworICAgIGlmIChsaW5lID4gKGhlaWdodCAtIHlpbmMpKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5bG9hZCwgInNraXBwaW5nIGxpbmUgJWQ6IG91dCBvZiByYW5nZSIsIGxpbmUpOworICAgICAgZ290byBuZXh0OworICAgIH0KKyAgICBpZiAob2ZmcyA+ICh3aWR0aCAtIHhpbmMpKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5bG9hZCwgInNraXBwaW5nIG9mZnNldCAlZDogb3V0IG9mIHJhbmdlIiwgb2Zmcyk7CisgICAgICBnb3RvIG5leHQ7CisgICAgfQorCisgICAgLyogY2FsY3VsYXRlIHRoZSBtYXhpbWltIGFtb3VudCBvZiBieXRlcyB3ZSBjYW4gdXNlIHBlciBsaW5lICovCisgICAgaWYgKG9mZnMgKyAoKGxlbmd0aCAvIHBncm91cCkgKiB4aW5jKSA+IHdpZHRoKSB7CisgICAgICBwbGVuID0gKCh3aWR0aCAtIG9mZnMpICogcGdyb3VwKSAvIHhpbmM7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5bG9hZCwgImNsaXBwaW5nIGxlbmd0aCAlZCwgb2Zmc2V0ICVkLCBwbGVuICVkIiwKKyAgICAgICAgICBsZW5ndGgsIG9mZnMsIHBsZW4pOworICAgIH0gZWxzZQorICAgICAgcGxlbiA9IGxlbmd0aDsKKworICAgIEdTVF9MT0dfT0JKRUNUIChkZXBheWxvYWQsCisgICAgICAgICJ3cml0aW5nIGxlbmd0aCAldS8ldSwgbGluZSAldSwgb2Zmc2V0ICV1LCByZW1haW5pbmcgJXUiLCBwbGVuLCBsZW5ndGgsCisgICAgICAgIGxpbmUsIG9mZnMsIHBheWxvYWRfbGVuKTsKKworICAgIHN3aXRjaCAoR1NUX1ZJREVPX0lORk9fRk9STUFUICgmcnRwdnJhd2RlcGF5LT52aW5mbykpIHsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1I6CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9VWVZZOgorICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlA6CisgICAgICAgIC8qIHNhbXBsZXMgYXJlIHBhY2tlZCBqdXN0IGxpa2UgZ3N0cmVhbWVyIHBhY2tzIHRoZW0gKi8KKyAgICAgICAgb2ZmcyAvPSB4aW5jOworICAgICAgICBkYXRhcCA9IHAwICsgKGxpbmUgKiB5c3RyaWRlKSArIChvZmZzICogcGdyb3VwKTsKKworICAgICAgICBtZW1jcHkgKGRhdGFwLCBwYXlsb2FkLCBwbGVuKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVlVVjoKKyAgICAgIHsKKyAgICAgICAgZ2ludCBpOworICAgICAgICBndWludDggKnA7CisKKyAgICAgICAgZGF0YXAgPSBwMCArIChsaW5lICogeXN0cmlkZSkgKyAob2ZmcyAqIDQpOworICAgICAgICBwID0gcGF5bG9hZDsKKworICAgICAgICAvKiBzYW1wbGVzIGFyZSBwYWNrZWQgaW4gb3JkZXIgQ2ItWS1DciBmb3IgYm90aCBpbnRlcmxhY2VkIGFuZAorICAgICAgICAgKiBwcm9ncmVzc2l2ZSBmcmFtZXMgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBsZW47IGkgKz0gcGdyb3VwKSB7CisgICAgICAgICAgKmRhdGFwKysgPSAwOworICAgICAgICAgICpkYXRhcCsrID0gcFsxXTsKKyAgICAgICAgICAqZGF0YXArKyA9IHBbMF07CisgICAgICAgICAgKmRhdGFwKysgPSBwWzJdOworICAgICAgICAgIHAgKz0gcGdyb3VwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgICB7CisgICAgICAgIGdpbnQgaTsKKyAgICAgICAgZ3VpbnQgdXZvZmY7CisgICAgICAgIGd1aW50OCAqeWQxcCwgKnlkMnAsICp1ZHAsICp2ZHAsICpwOworCisgICAgICAgIHlkMXAgPSB5cCArIChsaW5lICogeXN0cmlkZSkgKyAob2Zmcyk7CisgICAgICAgIHlkMnAgPSB5ZDFwICsgeXN0cmlkZTsKKyAgICAgICAgdXZvZmYgPSAobGluZSAvIHlpbmMgKiB1dnN0cmlkZSkgKyAob2ZmcyAvIHhpbmMpOworCisgICAgICAgIHVkcCA9IHVwICsgdXZvZmY7CisgICAgICAgIHZkcCA9IHZwICsgdXZvZmY7CisgICAgICAgIHAgPSBwYXlsb2FkOworCisgICAgICAgIC8qIGxpbmUgMC8xOiBZMDAtWTAxLVkxMC1ZMTEtQ2IwMC1DcjAwIFkwMi1ZMDMtWTEyLVkxMy1DYjAxLUNyMDEgLi4uICAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGxlbjsgaSArPSBwZ3JvdXApIHsKKyAgICAgICAgICAqeWQxcCsrID0gcFswXTsKKyAgICAgICAgICAqeWQxcCsrID0gcFsxXTsKKyAgICAgICAgICAqeWQycCsrID0gcFsyXTsKKyAgICAgICAgICAqeWQycCsrID0gcFszXTsKKyAgICAgICAgICAqdWRwKysgPSBwWzRdOworICAgICAgICAgICp2ZHArKyA9IHBbNV07CisgICAgICAgICAgcCArPSBwZ3JvdXA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQxQjoKKyAgICAgIHsKKyAgICAgICAgZ2ludCBpOworICAgICAgICBndWludCB1dm9mZjsKKyAgICAgICAgZ3VpbnQ4ICp5ZHAsICp1ZHAsICp2ZHAsICpwOworCisgICAgICAgIHlkcCA9IHlwICsgKGxpbmUgKiB5c3RyaWRlKSArIChvZmZzKTsKKyAgICAgICAgdXZvZmYgPSAobGluZSAvIHlpbmMgKiB1dnN0cmlkZSkgKyAob2ZmcyAvIHhpbmMpOworCisgICAgICAgIHVkcCA9IHVwICsgdXZvZmY7CisgICAgICAgIHZkcCA9IHZwICsgdXZvZmY7CisgICAgICAgIHAgPSBwYXlsb2FkOworCisgICAgICAgIC8qIFNhbXBsZXMgYXJlIHBhY2tlZCBpbiBvcmRlciBDYjAtWTAtWTEtQ3IwLVkyLVkzIGZvciBib3RoIGludGVybGFjZWQKKyAgICAgICAgICogYW5kIHByb2dyZXNzaXZlIHNjYW4gbGluZXMgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBsZW47IGkgKz0gcGdyb3VwKSB7CisgICAgICAgICAgKnVkcCsrID0gcFswXTsKKyAgICAgICAgICAqeWRwKysgPSBwWzFdOworICAgICAgICAgICp5ZHArKyA9IHBbMl07CisgICAgICAgICAgKnZkcCsrID0gcFszXTsKKyAgICAgICAgICAqeWRwKysgPSBwWzRdOworICAgICAgICAgICp5ZHArKyA9IHBbNV07CisgICAgICAgICAgcCArPSBwZ3JvdXA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIHVua25vd25fc2FtcGxpbmc7CisgICAgfQorCisgIG5leHQ6CisgICAgaWYgKCFjb250KQorICAgICAgYnJlYWs7CisKKyAgICBwYXlsb2FkICs9IGxlbmd0aDsKKyAgICBwYXlsb2FkX2xlbiAtPSBsZW5ndGg7CisgIH0KKworICBtYXJrZXIgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApOworCisgIGlmIChtYXJrZXIpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoZGVwYXlsb2FkLCAibWFya2VyLCBmbHVzaGluZyBmcmFtZSIpOworICAgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJnJ0cHZyYXdkZXBheS0+ZnJhbWUpOworICAgIG91dGJ1ZiA9IHJ0cHZyYXdkZXBheS0+b3V0YnVmOworICAgIHJ0cHZyYXdkZXBheS0+b3V0YnVmID0gTlVMTDsKKyAgICBydHB2cmF3ZGVwYXktPnRpbWVzdGFtcCA9IC0xOworICB9CisgIHJldHVybiBvdXRidWY7CisKKyAgLyogRVJST1JTICovCit1bmtub3duX3NhbXBsaW5nOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlcGF5bG9hZCwgU1RSRUFNLCBGT1JNQVQsCisgICAgICAgIChOVUxMKSwgKCJ1bmltcGxlbWVudGVkIHNhbXBsaW5nIikpOworICAgIHJldHVybiBOVUxMOworICB9CithbGxvY19mYWlsZWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5bG9hZCwgImZhaWxlZCB0byBhbGxvYyBvdXRwdXQgYnVmZmVyIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2ludmFsaWRfZnJhbWU6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkZXBheWxvYWQsICJjb3VsZCBub3QgbWFwIHZpZGVvIGZyYW1lIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK3dyb25nX2xlbmd0aDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVwYXlsb2FkLCAibGVuZ3RoIG5vdCBtdWx0aXBsZSBvZiBwZ3JvdXAiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorc2hvcnRfcGFja2V0OgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZXBheWxvYWQsICJzaG9ydCBwYWNrZXQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfdnJhd19kZXBheV9oYW5kbGVfZXZlbnQgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBmaWx0ZXIsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJldDsKKyAgR3N0UnRwVlJhd0RlcGF5ICpydHB2cmF3ZGVwYXk7CisKKyAgcnRwdnJhd2RlcGF5ID0gR1NUX1JUUF9WUkFXX0RFUEFZIChmaWx0ZXIpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6CisgICAgICBnc3RfcnRwX3ZyYXdfZGVwYXlfcmVzZXQgKHJ0cHZyYXdkZXBheSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPQorICAgICAgR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9DTEFTUyAocGFyZW50X2NsYXNzKS0+aGFuZGxlX2V2ZW50IChmaWx0ZXIsIGV2ZW50KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfdnJhd19kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cFZSYXdEZXBheSAqcnRwdnJhd2RlcGF5OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRwdnJhd2RlcGF5ID0gR1NUX1JUUF9WUkFXX0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfcnRwX3ZyYXdfZGVwYXlfcmVzZXQgKHJ0cHZyYXdkZXBheSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3J0cF92cmF3X2RlcGF5X3Jlc2V0IChydHB2cmF3ZGVwYXkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfdnJhd19kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHZyYXdkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9WUkFXX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Y2E3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOD4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9WUkFXX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfVlJBV19ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9tZXRhLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvcG9vbC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1ZSQVdfREVQQVkgXAorICAoZ3N0X3J0cF92cmF3X2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfVlJBV19ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9WUkFXX0RFUEFZLEdzdFJ0cFZSYXdEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfVlJBV19ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfVlJBV19ERVBBWSxHc3RSdHBWUmF3RGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfVlJBV19ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9WUkFXX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9WUkFXX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9WUkFXX0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFZSYXdEZXBheSBHc3RSdHBWUmF3RGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwVlJhd0RlcGF5Q2xhc3MgR3N0UnRwVlJhd0RlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwVlJhd0RlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgcGF5bG9hZDsKKworICBHc3RCdWZmZXJQb29sICpwb29sOworICBHc3RWaWRlb0luZm8gdmluZm87CisKKyAgR3N0VmlkZW9GcmFtZSBmcmFtZTsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIGd1aW50MzIgdGltZXN0YW1wOworCisgIGdpbnQgcGdyb3VwOworICBnaW50IHhpbmMsIHlpbmM7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cFZSYXdEZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX3ZyYXdfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX3ZyYXdfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfVlJBV19ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwdnJhd3BheS5jIGIvZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhNDgyMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwdnJhd3BheS5jCkBAIC0wLDAgKzEsNjU0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDg+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpbmNsdWRlICJnc3RydHB2cmF3cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworZW51bQoreworICBQUk9QX0NIVU5LU19QRVJfRlJBTUUgPSAxCit9OworCisjZGVmaW5lIERFRkFVTFRfQ0hVTktTX1BFUl9GUkFNRSAxMAorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHB2cmF3cGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHB2cmF3cGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF92cmF3X3BheV9zaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgeyBSR0IsIFJHQkEsIEJHUiwgQkdSQSwgQVlVViwgVVlWWSwgSTQyMCwgWTQxQiwgVVlWUCB9LCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsgMSwgMzI3NjcgXSwgIiAiaGVpZ2h0ID0gKGludCkgWyAxLCAzMjc2NyBdOyAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3ZyYXdfcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJSQVdcIiwiCisgICAgICAgICJzYW1wbGluZyA9IChzdHJpbmcpIHsgXCJSR0JcIiwgXCJSR0JBXCIsIFwiQkdSXCIsIFwiQkdSQVwiLCAiCisgICAgICAgICJcIllDYkNyLTQ6NDo0XCIsIFwiWUNiQ3ItNDoyOjJcIiwgXCJZQ2JDci00OjI6MFwiLCAiCisgICAgICAgICJcIllDYkNyLTQ6MToxXCIgfSwiCisgICAgICAgIC8qIHdlIGNhbm5vdCBleHByZXNzIHRoZXNlIGFzIHN0cmluZ3MgCisgICAgICAgICAqICJ3aWR0aCA9IChzdHJpbmcpIFsxIDMyNzY3XSwiCisgICAgICAgICAqICJoZWlnaHQgPSAoc3RyaW5nKSBbMSAzMjc2N10sIgorICAgICAgICAgKi8KKyAgICAgICAgImRlcHRoID0gKHN0cmluZykgeyBcIjhcIiwgXCIxMFwiLCBcIjEyXCIsIFwiMTZcIiB9LCIKKyAgICAgICAgImNvbG9yaW1ldHJ5ID0gKHN0cmluZykgeyBcIkJUNjAxLTVcIiwgXCJCVDcwOS0yXCIsIFwiU01QVEUyNDBNXCIgfSIKKyAgICAgICAgLyogb3B0aW9uYWwgCisgICAgICAgICAqIGludGVybGFjZSA9IAorICAgICAgICAgKiB0b3AtZmllbGQtZmlyc3QgPSAKKyAgICAgICAgICogY2hyb21hLXBvc2l0aW9uID0gKHN0cmluZykgCisgICAgICAgICAqIGdhbW1hID0gKGZsb2F0KQorICAgICAgICAgKi8KKyAgICApCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfdnJhd19wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfdnJhd19wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKgorICAgIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CitzdGF0aWMgdm9pZCBnc3RfcnRwX3ZyYXdfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfdnJhd19wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitHX0RFRklORV9UWVBFIChHc3RSdHBWUmF3UGF5LCBnc3RfcnRwX3ZyYXdfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9QQVlMT0FEKQorCisgICAgIHN0YXRpYyB2b2lkIGdzdF9ydHBfdnJhd19wYXlfY2xhc3NfaW5pdCAoR3N0UnRwVlJhd1BheUNsYXNzICoga2xhc3MpCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF92cmF3X3BheV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9ydHBfdnJhd19wYXlfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX0NIVU5LU19QRVJfRlJBTUUsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiY2h1bmtzLXBlci1mcmFtZSIsICJDaHVua3MgcGVyIEZyYW1lIiwKKyAgICAgICAgICAiU3BsaXQgYW5kIHNlbmQgb3V0IGVhY2ggZnJhbWUgaW4gbXVsdGlwbGUgY2h1bmtzIHRvIHJlZHVjZSBvdmVyaGVhZCIsCisgICAgICAgICAgMSwgR19NQVhJTlQsIERFRkFVTFRfQ0hVTktTX1BFUl9GUkFNRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpCisgICAgICApOworCisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfdnJhd19wYXlfc2V0Y2FwczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX3ZyYXdfcGF5X2hhbmRsZV9idWZmZXI7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF92cmF3X3BheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3ZyYXdfcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIFJhdyBWaWRlbyBwYXlsb2FkZXIiLCAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYXlsb2FkIHJhdyB2aWRlbyBhcyBSVFAgcGFja2V0cyAoUkZDIDQxNzUpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHB2cmF3cGF5X2RlYnVnLCAicnRwdnJhd3BheSIsIDAsCisgICAgICAiUmF3IHZpZGVvIFJUUCBQYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdnJhd19wYXlfaW5pdCAoR3N0UnRwVlJhd1BheSAqIHJ0cHZyYXdwYXkpCit7CisgIHJ0cHZyYXdwYXktPmNodW5rc19wZXJfZnJhbWUgPSBERUZBVUxUX0NIVU5LU19QRVJfRlJBTUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF92cmF3X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RSdHBWUmF3UGF5ICpydHB2cmF3cGF5OworICBnYm9vbGVhbiByZXM7CisgIGdpbnQgcGdyb3VwLCB4aW5jLCB5aW5jOworICBjb25zdCBnY2hhciAqZGVwdGhzdHIsICpzYW1wbGluZ3N0ciwgKmNvbG9yaW1ldHJ5c3RyOworICBnY2hhciAqd3N0ciwgKmhzdHI7CisgIEdzdFZpZGVvSW5mbyBpbmZvOworCisgIHJ0cHZyYXdwYXkgPSBHU1RfUlRQX1ZSQVdfUEFZIChwYXlsb2FkKTsKKworICBpZiAoIWdzdF92aWRlb19pbmZvX2Zyb21fY2FwcyAoJmluZm8sIGNhcHMpKQorICAgIGdvdG8gaW52YWxpZF9jYXBzOworCisgIHJ0cHZyYXdwYXktPnZpbmZvID0gaW5mbzsKKworICBpZiAoZ3N0X3ZpZGVvX2NvbG9yaW1ldHJ5X21hdGNoZXMgKCZpbmZvLmNvbG9yaW1ldHJ5LAorICAgICAgICAgIEdTVF9WSURFT19DT0xPUklNRVRSWV9CVDYwMSkpIHsKKyAgICBjb2xvcmltZXRyeXN0ciA9ICJCVDYwMS01IjsKKyAgfSBlbHNlIGlmIChnc3RfdmlkZW9fY29sb3JpbWV0cnlfbWF0Y2hlcyAoJmluZm8uY29sb3JpbWV0cnksCisgICAgICAgICAgR1NUX1ZJREVPX0NPTE9SSU1FVFJZX0JUNzA5KSkgeworICAgIGNvbG9yaW1ldHJ5c3RyID0gIkJUNzA5LTIiOworICB9IGVsc2UgaWYgKGdzdF92aWRlb19jb2xvcmltZXRyeV9tYXRjaGVzICgmaW5mby5jb2xvcmltZXRyeSwKKyAgICAgICAgICBHU1RfVklERU9fQ09MT1JJTUVUUllfU01QVEUyNDBNKSkgeworICAgIGNvbG9yaW1ldHJ5c3RyID0gIlNNUFRFMjQwTSI7CisgIH0gZWxzZSB7CisgICAgY29sb3JpbWV0cnlzdHIgPSAiU01QVEUyNDBNIjsKKyAgfQorCisgIHhpbmMgPSB5aW5jID0gMTsKKworICAvKiB0aGVzZSB2YWx1ZXMgYXJlIHRoZSBvbmx5IHRoaW5nIHdlIGNhbiBkbyAqLworICBkZXB0aHN0ciA9ICI4IjsKKworICBzd2l0Y2ggKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoJmluZm8pKSB7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQkE6CisgICAgICBzYW1wbGluZ3N0ciA9ICJSR0JBIjsKKyAgICAgIHBncm91cCA9IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICAgIHNhbXBsaW5nc3RyID0gIkJHUkEiOworICAgICAgcGdyb3VwID0gNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgICBzYW1wbGluZ3N0ciA9ICJSR0IiOworICAgICAgcGdyb3VwID0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1I6CisgICAgICBzYW1wbGluZ3N0ciA9ICJCR1IiOworICAgICAgcGdyb3VwID0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgc2FtcGxpbmdzdHIgPSAiWUNiQ3ItNDo0OjQiOworICAgICAgcGdyb3VwID0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9VWVZZOgorICAgICAgc2FtcGxpbmdzdHIgPSAiWUNiQ3ItNDoyOjIiOworICAgICAgcGdyb3VwID0gNDsKKyAgICAgIHhpbmMgPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MUI6CisgICAgICBzYW1wbGluZ3N0ciA9ICJZQ2JDci00OjE6MSI7CisgICAgICBwZ3JvdXAgPSA2OworICAgICAgeGluYyA9IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfSTQyMDoKKyAgICAgIHNhbXBsaW5nc3RyID0gIllDYkNyLTQ6MjowIjsKKyAgICAgIHBncm91cCA9IDY7CisgICAgICB4aW5jID0geWluYyA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfVVlWUDoKKyAgICAgIHNhbXBsaW5nc3RyID0gIllDYkNyLTQ6MjoyIjsKKyAgICAgIHBncm91cCA9IDU7CisgICAgICB4aW5jID0gMjsKKyAgICAgIGRlcHRoc3RyID0gIjEwIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnb3RvIHVua25vd25fZm9ybWF0OworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoR1NUX1ZJREVPX0lORk9fSVNfSU5URVJMQUNFRCAoJmluZm8pKSB7CisgICAgeWluYyAqPSAyOworICB9CisKKyAgcnRwdnJhd3BheS0+cGdyb3VwID0gcGdyb3VwOworICBydHB2cmF3cGF5LT54aW5jID0geGluYzsKKyAgcnRwdnJhd3BheS0+eWluYyA9IHlpbmM7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGF5bG9hZCwgIndpZHRoICVkLCBoZWlnaHQgJWQsIHNhbXBsaW5nICVzIiwKKyAgICAgIEdTVF9WSURFT19JTkZPX1dJRFRIICgmaW5mbyksIEdTVF9WSURFT19JTkZPX0hFSUdIVCAoJmluZm8pLCBzYW1wbGluZ3N0cik7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJ4aW5jICVkLCB5aW5jICVkLCBwZ3JvdXAgJWQiLCB4aW5jLCB5aW5jLCBwZ3JvdXApOworCisgIHdzdHIgPSBnX3N0cmR1cF9wcmludGYgKCIlZCIsIEdTVF9WSURFT19JTkZPX1dJRFRIICgmaW5mbykpOworICBoc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiJWQiLCBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZpbmZvKSk7CisKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHBheWxvYWQsICJ2aWRlbyIsIFRSVUUsICJSQVciLCA5MDAwMCk7CisgIGlmIChHU1RfVklERU9fSU5GT19JU19JTlRFUkxBQ0VEICgmaW5mbykpIHsKKyAgICByZXMgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAocGF5bG9hZCwgInNhbXBsaW5nIiwgR19UWVBFX1NUUklORywKKyAgICAgICAgc2FtcGxpbmdzdHIsICJkZXB0aCIsIEdfVFlQRV9TVFJJTkcsIGRlcHRoc3RyLCAid2lkdGgiLCBHX1RZUEVfU1RSSU5HLAorICAgICAgICB3c3RyLCAiaGVpZ2h0IiwgR19UWVBFX1NUUklORywgaHN0ciwgImNvbG9yaW1ldHJ5IiwgR19UWVBFX1NUUklORywKKyAgICAgICAgY29sb3JpbWV0cnlzdHIsICJpbnRlcmxhY2UiLCBHX1RZUEVfU1RSSU5HLCAidHJ1ZSIsIE5VTEwpOworICB9IGVsc2UgeworICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChwYXlsb2FkLCAic2FtcGxpbmciLCBHX1RZUEVfU1RSSU5HLAorICAgICAgICBzYW1wbGluZ3N0ciwgImRlcHRoIiwgR19UWVBFX1NUUklORywgZGVwdGhzdHIsICJ3aWR0aCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgIHdzdHIsICJoZWlnaHQiLCBHX1RZUEVfU1RSSU5HLCBoc3RyLCAiY29sb3JpbWV0cnkiLCBHX1RZUEVfU1RSSU5HLAorICAgICAgICBjb2xvcmltZXRyeXN0ciwgTlVMTCk7CisgIH0KKyAgZ19mcmVlICh3c3RyKTsKKyAgZ19mcmVlIChoc3RyKTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworaW52YWxpZF9jYXBzOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocGF5bG9hZCwgImNvdWxkIG5vdCBwYXJzZSBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit1bmtub3duX2Zvcm1hdDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBheWxvYWQsICJ1bmtub3duIGNhcHMgZm9ybWF0Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX3ZyYXdfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSdHBWUmF3UGF5ICpydHB2cmF3cGF5OworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBnZmxvYXQgcGFja2V0c19wZXJfcGFja2xpbmU7CisgIGd1aW50IHBncm91cHNfcGVyX3BhY2tldDsKKyAgZ3VpbnQgcGFja2xpbmVzX3Blcl9saXN0LCBidWZmZXJzX3Blcl9saXN0OworICBndWludCBsaW5lc19kZWxheTsgICAgICAgICAgICAvKiBhZnRlciBob3cgbWFueSBwYWNrZWQgbGluZXMgd2UgcHVzaCBvdXQgYSBidWZmZXIgbGlzdCAqLworICBndWludCBsYXN0X2xpbmU7ICAgICAgICAgICAgICAvKiBsYXN0IHBhY2sgbGluZSBudW1iZXIgd2UgcHVzaGVkIG91dCBhIGJ1ZmZlciBsaXN0ICAgICAqLworICBndWludCBsaW5lLCBvZmZzZXQ7CisgIGd1aW50OCAqcDAsICp5cCwgKnVwLCAqdnA7CisgIGd1aW50IHlzdHJpZGUsIHV2c3RyaWRlOworICBndWludCB4aW5jLCB5aW5jOworICBndWludCBwZ3JvdXA7CisgIGd1aW50IG10dTsKKyAgZ3VpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCBmaWVsZCwgZmllbGRzOworICBHc3RWaWRlb0Zvcm1hdCBmb3JtYXQ7CisgIEdzdFZpZGVvRnJhbWUgZnJhbWU7CisgIGdpbnQgaW50ZXJsYWNlZDsKKyAgZ2Jvb2xlYW4gdXNlX2J1ZmZlcl9saXN0czsKKyAgR3N0QnVmZmVyTGlzdCAqbGlzdCA9IE5VTEw7CisgIEdzdFJUUEJ1ZmZlciBydHAgPSB7IE5VTEwsIH07CisKKyAgcnRwdnJhd3BheSA9IEdTVF9SVFBfVlJBV19QQVkgKHBheWxvYWQpOworCisgIGlmICghZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJmZyYW1lLCAmcnRwdnJhd3BheS0+dmluZm8sIGJ1ZmZlciwgR1NUX01BUF9SRUFEKSkgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHJ0cHZyYXdwYXksICJuZXcgZnJhbWUgb2YgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyIsCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpKTsKKworICAvKiBnZXQgcG9pbnRlciBhbmQgc3RyaWRlcyBvZiB0aGUgcGxhbmVzICovCisgIHAwID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKCZmcmFtZSwgMCk7CisgIHlwID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoJmZyYW1lLCAwKTsKKyAgdXAgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBICgmZnJhbWUsIDEpOworICB2cCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKCZmcmFtZSwgMik7CisKKyAgeXN0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoJmZyYW1lLCAwKTsKKyAgdXZzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKCZmcmFtZSwgMSk7CisKKyAgbXR1ID0gR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVIChwYXlsb2FkKTsKKworICAvKiBhbW91bnQgb2YgYnl0ZXMgZm9yIG9uZSBwaXhlbCAqLworICBwZ3JvdXAgPSBydHB2cmF3cGF5LT5wZ3JvdXA7CisgIHdpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKCZydHB2cmF3cGF5LT52aW5mbyk7CisgIGhlaWdodCA9IEdTVF9WSURFT19JTkZPX0hFSUdIVCAoJnJ0cHZyYXdwYXktPnZpbmZvKTsKKworICBpbnRlcmxhY2VkID0gR1NUX1ZJREVPX0lORk9fSVNfSU5URVJMQUNFRCAoJnJ0cHZyYXdwYXktPnZpbmZvKTsKKworICBmb3JtYXQgPSBHU1RfVklERU9fSU5GT19GT1JNQVQgKCZydHB2cmF3cGF5LT52aW5mbyk7CisKKyAgeWluYyA9IHJ0cHZyYXdwYXktPnlpbmM7CisgIHhpbmMgPSBydHB2cmF3cGF5LT54aW5jOworCisgIC8qIGFmdGVyIGhvdyBtYW55IHBhY2tlZCBsaW5lcyB3ZSBwdXNoIG91dCBhIGJ1ZmZlciBsaXN0ICovCisgIGxpbmVzX2RlbGF5ID0gR1NUX1JPVU5EX1VQXzQgKGhlaWdodCAvIHJ0cHZyYXdwYXktPmNodW5rc19wZXJfZnJhbWUpOworCisgIC8qIGNhbGN1bGF0ZSBob3cgbWFueSBidWZmZXJzIHdlIGV4cGVjdCB0byBzdG9yZSBpbiBhIHNpbmdsZSBidWZmZXIgbGlzdCAqLworICBwZ3JvdXBzX3Blcl9wYWNrZXQgPSAobXR1IC0gKDEyICsgMTQpKSAvIHBncm91cDsKKyAgcGFja2V0c19wZXJfcGFja2xpbmUgPSB3aWR0aCAvICh4aW5jICogcGdyb3Vwc19wZXJfcGFja2V0ICogMS4wKTsKKyAgcGFja2xpbmVzX3Blcl9saXN0ID0gaGVpZ2h0IC8gKHlpbmMgKiBydHB2cmF3cGF5LT5jaHVua3NfcGVyX2ZyYW1lKTsKKyAgYnVmZmVyc19wZXJfbGlzdCA9IHBhY2tsaW5lc19wZXJfbGlzdCAqIHBhY2tldHNfcGVyX3BhY2tsaW5lOworICBidWZmZXJzX3Blcl9saXN0ID0gR1NUX1JPVU5EX1VQXzggKGJ1ZmZlcnNfcGVyX2xpc3QpOworCisgIHVzZV9idWZmZXJfbGlzdHMgPSAocnRwdnJhd3BheS0+Y2h1bmtzX3Blcl9mcmFtZSA8IChoZWlnaHQgLyB5aW5jKSk7CisKKyAgZmllbGRzID0gMSArIGludGVybGFjZWQ7CisKKyAgLyogc3RhcnQgd2l0aCBsaW5lIDAsIG9mZnNldCAwICovCisgIGZvciAoZmllbGQgPSAwOyBmaWVsZCA8IGZpZWxkczsgZmllbGQrKykgeworICAgIGxpbmUgPSBmaWVsZDsKKyAgICBvZmZzZXQgPSAwOworICAgIGxhc3RfbGluZSA9IDA7CisKKyAgICBpZiAodXNlX2J1ZmZlcl9saXN0cykKKyAgICAgIGxpc3QgPSBnc3RfYnVmZmVyX2xpc3RfbmV3X3NpemVkIChidWZmZXJzX3Blcl9saXN0KTsKKworICAgIC8qIHdyaXRlIGFsbCBsaW5lcyAqLworICAgIHdoaWxlIChsaW5lIDwgaGVpZ2h0KSB7CisgICAgICBndWludCBsZWZ0LCBwYWNrX2xpbmU7CisgICAgICBHc3RCdWZmZXIgKm91dDsKKyAgICAgIGd1aW50OCAqb3V0ZGF0YSwgKmhlYWRlcnM7CisgICAgICBnYm9vbGVhbiBuZXh0X2xpbmUsIGNvbXBsZXRlID0gRkFMU0U7CisgICAgICBndWludCBsZW5ndGgsIGNvbnQsIHBpeGVsczsKKworICAgICAgLyogZ2V0IHRoZSBtYXggYWxsb3dlZCBwYXlsb2FkIGxlbmd0aCBzaXplLCB3ZSB0cnkgdG8gZmlsbCB0aGUgY29tcGxldGUgTVRVICovCisgICAgICBsZWZ0ID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYXlsb2FkX2xlbiAobXR1LCAwLCAwKTsKKyAgICAgIG91dCA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAobGVmdCwgMCwgMCk7CisKKyAgICAgIGlmIChmaWVsZCA9PSAwKSB7CisgICAgICAgIEdTVF9CVUZGRVJfUFRTIChvdXQpID0gR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfQlVGRkVSX1BUUyAob3V0KSA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpICsKKyAgICAgICAgICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcikgLyAyOworICAgICAgfQorCisgICAgICBnc3RfcnRwX2J1ZmZlcl9tYXAgKG91dCwgR1NUX01BUF9XUklURSwgJnJ0cCk7CisgICAgICBvdXRkYXRhID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHApOworCisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwdnJhd3BheSwgImNyZWF0ZWQgYnVmZmVyIG9mIHNpemUgJXUgZm9yIE1UVSAldSIsIGxlZnQsCisgICAgICAgICAgbXR1KTsKKworICAgICAgLyoKKyAgICAgICAqICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAgICogICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICAgICAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICogIHwgICBFeHRlbmRlZCBTZXF1ZW5jZSBOdW1iZXIgICAgfCAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICB8CisgICAgICAgKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAqICB8RnwgICAgICAgICAgTGluZSBObyAgICAgICAgICAgIHxDfCAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgfAorICAgICAgICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKiAgfCAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICB8RnwgICAgICAgICAgTGluZSBObyAgICAgICAgICAgIHwKKyAgICAgICAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICogIHxDfCAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCisgICAgICAgKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyAgICAgICAqICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorICAgICAgICogIC4gICAgICAgICAgICAgICAgIFR3byAocGFydGlhbCkgbGluZXMgb2YgdmlkZW8gZGF0YSAgICAgICAgICAgICAuCisgICAgICAgKiAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyAgICAgICAqICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICovCisKKyAgICAgIC8qIG5lZWQgMiBieXRlcyBmb3IgdGhlIGV4dGVuZGVkIHNlcXVlbmNlIG51bWJlciAqLworICAgICAgKm91dGRhdGErKyA9IDA7CisgICAgICAqb3V0ZGF0YSsrID0gMDsKKyAgICAgIGxlZnQgLT0gMjsKKworICAgICAgLyogdGhlIGhlYWRlcnMgc3RhcnQgaGVyZSAqLworICAgICAgaGVhZGVycyA9IG91dGRhdGE7CisKKyAgICAgIC8qIG1ha2Ugc3VyZSB3ZSBjYW4gZml0IGF0IGxlYXN0ICpvbmUqIGhlYWRlciBhbmQgcGl4ZWwgKi8KKyAgICAgIGlmICghKGxlZnQgPiAoNiArIHBncm91cCkpKSB7CisgICAgICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0KTsKKyAgICAgICAgZ290byB0b29fc21hbGw7CisgICAgICB9CisKKyAgICAgIC8qIHdoaWxlIHdlIGNhbiBmaXQgYXQgbGVhc3Qgb25lIGhlYWRlciBhbmQgb25lIHBpeGVsICovCisgICAgICB3aGlsZSAobGVmdCA+ICg2ICsgcGdyb3VwKSkgeworICAgICAgICAvKiB3ZSBuZWVkIGEgNiBieXRlcyBoZWFkZXIgKi8KKyAgICAgICAgbGVmdCAtPSA2OworCisgICAgICAgIC8qIGdldCBob3cgbWF5IGJ5dGVzIHdlIG5lZWQgZm9yIHRoZSByZW1haW5pbmcgcGl4ZWxzICovCisgICAgICAgIHBpeGVscyA9IHdpZHRoIC0gb2Zmc2V0OworICAgICAgICBsZW5ndGggPSAocGl4ZWxzICogcGdyb3VwKSAvIHhpbmM7CisKKyAgICAgICAgaWYgKGxlZnQgPj0gbGVuZ3RoKSB7CisgICAgICAgICAgLyogcGl4ZWxzIGFuZCBoZWFkZXIgZml0IGNvbXBsZXRlbHksIHdlIHdpbGwgd3JpdGUgdGhlbSBhbmQgc2tpcCB0byB0aGUKKyAgICAgICAgICAgKiBuZXh0IGxpbmUuICovCisgICAgICAgICAgbmV4dF9saW5lID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBsaW5lIGRvZXMgbm90IGZpdCBjb21wbGV0ZWx5LCBzZWUgaG93IG1hbnkgcGl4ZWxzIGZpdCAqLworICAgICAgICAgIHBpeGVscyA9IChsZWZ0IC8gcGdyb3VwKSAqIHhpbmM7CisgICAgICAgICAgbGVuZ3RoID0gKHBpeGVscyAqIHBncm91cCkgLyB4aW5jOworICAgICAgICAgIG5leHRfbGluZSA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChydHB2cmF3cGF5LCAiZmlsbGluZyAldSBieXRlcyBpbiAldSBwaXhlbHMiLCBsZW5ndGgsCisgICAgICAgICAgICBwaXhlbHMpOworICAgICAgICBsZWZ0IC09IGxlbmd0aDsKKworICAgICAgICAvKiB3cml0ZSBsZW5ndGggKi8KKyAgICAgICAgKm91dGRhdGErKyA9IChsZW5ndGggPj4gOCkgJiAweGZmOworICAgICAgICAqb3V0ZGF0YSsrID0gbGVuZ3RoICYgMHhmZjsKKworICAgICAgICAvKiB3cml0ZSBsaW5lIG5vICovCisgICAgICAgICpvdXRkYXRhKysgPSAoKGxpbmUgPj4gOCkgJiAweDdmKSB8ICgoZmllbGQgPDwgNykgJiAweDgwKTsKKyAgICAgICAgKm91dGRhdGErKyA9IGxpbmUgJiAweGZmOworCisgICAgICAgIGlmIChuZXh0X2xpbmUpIHsKKyAgICAgICAgICAvKiBnbyB0byBuZXh0IGxpbmUgd2UgZG8gdGhpcyBoZXJlIHRvIG1ha2UgdGhlIGNoZWNrIGJlbG93IGVhc2llciAqLworICAgICAgICAgIGxpbmUgKz0geWluYzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNhbGN1bGF0ZSBjb250aW51YXRpb24gbWFya2VyICovCisgICAgICAgIGNvbnQgPSAobGVmdCA+ICg2ICsgcGdyb3VwKSAmJiBsaW5lIDwgaGVpZ2h0KSA/IDB4ODAgOiAweDAwOworCisgICAgICAgIC8qIHdyaXRlIG9mZnNldCBhbmQgY29udGludWF0aW9uIG1hcmtlciAqLworICAgICAgICAqb3V0ZGF0YSsrID0gKChvZmZzZXQgPj4gOCkgJiAweDdmKSB8IGNvbnQ7CisgICAgICAgICpvdXRkYXRhKysgPSBvZmZzZXQgJiAweGZmOworCisgICAgICAgIGlmIChuZXh0X2xpbmUpIHsKKyAgICAgICAgICAvKiByZXNldCBvZmZzZXQgKi8KKyAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChydHB2cmF3cGF5LCAiZ28gdG8gbmV4dCBsaW5lICV1IiwgbGluZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb2Zmc2V0ICs9IHBpeGVsczsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwdnJhd3BheSwgIm5leHQgb2Zmc2V0ICV1Iiwgb2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghY29udCkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHB2cmF3cGF5LCAiY29uc3VtZWQgJXUgYnl0ZXMiLAorICAgICAgICAgIChndWludCkgKG91dGRhdGEgLSBoZWFkZXJzKSk7CisKKyAgICAgIC8qIHNlY29uZCBwYXNzLCByZWFkIGhlYWRlcnMgYW5kIHdyaXRlIHRoZSBkYXRhICovCisgICAgICB3aGlsZSAoVFJVRSkgeworICAgICAgICBndWludCBvZmZzLCBsaW47CisKKyAgICAgICAgLyogcmVhZCBsZW5ndGggYW5kIGNvbnQgKi8KKyAgICAgICAgbGVuZ3RoID0gKGhlYWRlcnNbMF0gPDwgOCkgfCBoZWFkZXJzWzFdOworICAgICAgICBsaW4gPSAoKGhlYWRlcnNbMl0gJiAweDdmKSA8PCA4KSB8IGhlYWRlcnNbM107CisgICAgICAgIG9mZnMgPSAoKGhlYWRlcnNbNF0gJiAweDdmKSA8PCA4KSB8IGhlYWRlcnNbNV07CisgICAgICAgIGNvbnQgPSBoZWFkZXJzWzRdICYgMHg4MDsKKyAgICAgICAgcGl4ZWxzID0gbGVuZ3RoIC8gcGdyb3VwOworICAgICAgICBoZWFkZXJzICs9IDY7CisKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBheWxvYWQsCisgICAgICAgICAgICAid3JpdGluZyBsZW5ndGggJXUsIGxpbmUgJXUsIG9mZnNldCAldSwgY29udCAlZCIsIGxlbmd0aCwgbGluLCBvZmZzLAorICAgICAgICAgICAgY29udCk7CisKKyAgICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCOgorICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1I6CisgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlA6CisgICAgICAgICAgICBvZmZzIC89IHhpbmM7CisgICAgICAgICAgICBtZW1jcHkgKG91dGRhdGEsIHAwICsgKGxpbiAqIHlzdHJpZGUpICsgKG9mZnMgKiBwZ3JvdXApLCBsZW5ndGgpOworICAgICAgICAgICAgb3V0ZGF0YSArPSBsZW5ndGg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVlVVjoKKyAgICAgICAgICB7CisgICAgICAgICAgICBnaW50IGk7CisgICAgICAgICAgICBndWludDggKmRhdGFwOworCisgICAgICAgICAgICBkYXRhcCA9IHAwICsgKGxpbiAqIHlzdHJpZGUpICsgKG9mZnMgKiA0KTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgICAgICAgICAgICpvdXRkYXRhKysgPSBkYXRhcFsyXTsKKyAgICAgICAgICAgICAgKm91dGRhdGErKyA9IGRhdGFwWzFdOworICAgICAgICAgICAgICAqb3V0ZGF0YSsrID0gZGF0YXBbM107CisgICAgICAgICAgICAgIGRhdGFwICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgICAgICAgeworICAgICAgICAgICAgZ2ludCBpOworICAgICAgICAgICAgZ3VpbnQgdXZvZmY7CisgICAgICAgICAgICBndWludDggKnlkMXAsICp5ZDJwLCAqdWRwLCAqdmRwOworCisgICAgICAgICAgICB5ZDFwID0geXAgKyAobGluICogeXN0cmlkZSkgKyAob2Zmcyk7CisgICAgICAgICAgICB5ZDJwID0geWQxcCArIHlzdHJpZGU7CisgICAgICAgICAgICB1dm9mZiA9IChsaW4gLyB5aW5jICogdXZzdHJpZGUpICsgKG9mZnMgLyB4aW5jKTsKKyAgICAgICAgICAgIHVkcCA9IHVwICsgdXZvZmY7CisgICAgICAgICAgICB2ZHAgPSB2cCArIHV2b2ZmOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGl4ZWxzOyBpKyspIHsKKyAgICAgICAgICAgICAgKm91dGRhdGErKyA9ICp5ZDFwKys7CisgICAgICAgICAgICAgICpvdXRkYXRhKysgPSAqeWQxcCsrOworICAgICAgICAgICAgICAqb3V0ZGF0YSsrID0gKnlkMnArKzsKKyAgICAgICAgICAgICAgKm91dGRhdGErKyA9ICp5ZDJwKys7CisgICAgICAgICAgICAgICpvdXRkYXRhKysgPSAqdWRwKys7CisgICAgICAgICAgICAgICpvdXRkYXRhKysgPSAqdmRwKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MUI6CisgICAgICAgICAgeworICAgICAgICAgICAgZ2ludCBpOworICAgICAgICAgICAgZ3VpbnQgdXZvZmY7CisgICAgICAgICAgICBndWludDggKnlkcCwgKnVkcCwgKnZkcDsKKworICAgICAgICAgICAgeWRwID0geXAgKyAobGluICogeXN0cmlkZSkgKyBvZmZzOworICAgICAgICAgICAgdXZvZmYgPSAobGluIC8geWluYyAqIHV2c3RyaWRlKSArIChvZmZzIC8geGluYyk7CisgICAgICAgICAgICB1ZHAgPSB1cCArIHV2b2ZmOworICAgICAgICAgICAgdmRwID0gdnAgKyB1dm9mZjsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgICAgICAgICAgICpvdXRkYXRhKysgPSAqdWRwKys7CisgICAgICAgICAgICAgICpvdXRkYXRhKysgPSAqeWRwKys7CisgICAgICAgICAgICAgICpvdXRkYXRhKysgPSAqeWRwKys7CisgICAgICAgICAgICAgICpvdXRkYXRhKysgPSAqdmRwKys7CisgICAgICAgICAgICAgICpvdXRkYXRhKysgPSAqeWRwKys7CisgICAgICAgICAgICAgICpvdXRkYXRhKysgPSAqeWRwKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dCk7CisgICAgICAgICAgICBnb3RvIHVua25vd25fc2FtcGxpbmc7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWNvbnQpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChsaW5lID49IGhlaWdodCkgeworICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwdnJhd3BheSwgImZpZWxkL2ZyYW1lIGNvbXBsZXRlLCBzZXQgbWFya2VyIik7CisgICAgICAgIGdzdF9ydHBfYnVmZmVyX3NldF9tYXJrZXIgKCZydHAsIFRSVUUpOworICAgICAgICBjb21wbGV0ZSA9IFRSVUU7CisgICAgICB9CisgICAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisgICAgICBpZiAobGVmdCA+IDApIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cHZyYXdwYXksICJ3ZSBoYXZlICV1IGJ5dGVzIGxlZnQiLCBsZWZ0KTsKKyAgICAgICAgZ3N0X2J1ZmZlcl9yZXNpemUgKG91dCwgMCwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAob3V0KSAtIGxlZnQpOworICAgICAgfQorCisgICAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwdnJhd3BheSwgb3V0LCBidWZmZXIpOworCisgICAgICAvKiBOb3cgZWl0aGVyIHB1c2ggb3V0IHRoZSBidWZmZXIgZGlyZWN0bHkgKi8KKyAgICAgIGlmICghdXNlX2J1ZmZlcl9saXN0cykgeworICAgICAgICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoIChwYXlsb2FkLCBvdXQpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLyogb3IgYWRkIHRoZSBidWZmZXIgdG8gYnVmZmVyIGxpc3QgLi4uICovCisgICAgICBnc3RfYnVmZmVyX2xpc3RfYWRkIChsaXN0LCBvdXQpOworCisgICAgICAvKiAuLiBhbmQgY2hlY2sgaWYgd2UgbmVlZCB0byBwdXNoIG91dCB0aGUgbGlzdCAqLworICAgICAgcGFja19saW5lID0gKGxpbmUgLSBmaWVsZCkgLyBmaWVsZHM7CisgICAgICBpZiAoY29tcGxldGUgfHwgKHBhY2tfbGluZSA+IGxhc3RfbGluZSAmJiBwYWNrX2xpbmUgJSBsaW5lc19kZWxheSA9PSAwKSkgeworICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwdnJhd3BheSwgInB1c2hpbmcgbGlzdCBvZiAldSBidWZmZXJzIHVwIHRvIHBhY2sgIgorICAgICAgICAgICAgImxpbmUgJXUiLCBnc3RfYnVmZmVyX2xpc3RfbGVuZ3RoIChsaXN0KSwgcGFja19saW5lKTsKKyAgICAgICAgcmV0ID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfcHVzaF9saXN0IChwYXlsb2FkLCBsaXN0KTsKKyAgICAgICAgbGlzdCA9IE5VTEw7CisgICAgICAgIGlmICghY29tcGxldGUpCisgICAgICAgICAgbGlzdCA9IGdzdF9idWZmZXJfbGlzdF9uZXdfc2l6ZWQgKGJ1ZmZlcnNfcGVyX2xpc3QpOworICAgICAgICBsYXN0X2xpbmUgPSBwYWNrX2xpbmU7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKCZmcmFtZSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK3Vua25vd25fc2FtcGxpbmc6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocGF5bG9hZCwgU1RSRUFNLCBGT1JNQVQsCisgICAgICAgIChOVUxMKSwgKCJ1bmltcGxlbWVudGVkIHNhbXBsaW5nIikpOworICAgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJmZyYW1lKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldHVybiBHU1RfRkxPV19OT1RfU1VQUE9SVEVEOworICB9Cit0b29fc21hbGw6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocGF5bG9hZCwgUkVTT1VSQ0UsIE5PX1NQQUNFX0xFRlQsCisgICAgICAgIChOVUxMKSwgKCJub3QgZW5vdWdoIHNwYWNlIHRvIHNlbmQgYXQgbGVhc3Qgb25lIHBpeGVsIikpOworICAgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJmZyYW1lKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldHVybiBHU1RfRkxPV19OT1RfU1VQUE9SVEVEOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3ZyYXdfcGF5X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSdHBWUmF3UGF5ICpydHB2cmF3cGF5OworCisgIHJ0cHZyYXdwYXkgPSBHU1RfUlRQX1ZSQVdfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DSFVOS1NfUEVSX0ZSQU1FOgorICAgICAgcnRwdnJhd3BheS0+Y2h1bmtzX3Blcl9mcmFtZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF92cmF3X3BheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwVlJhd1BheSAqcnRwdnJhd3BheTsKKworICBydHB2cmF3cGF5ID0gR1NUX1JUUF9WUkFXX1BBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ0hVTktTX1BFUl9GUkFNRToKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHJ0cHZyYXdwYXktPmNodW5rc19wZXJfZnJhbWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3J0cF92cmF3X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHZyYXdwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfVlJBV19QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmggYi9nc3QvcnRwL2dzdHJ0cHZyYXdwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmQyNDQyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmgKQEAgLTAsMCArMSw2NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA4PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1ZSQVdfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfVlJBV19QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1ZSQVdfUEFZIFwKKyAgKGdzdF9ydHBfdnJhd19wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9WUkFXX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9WUkFXX1BBWSxHc3RSdHBWUmF3UGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9WUkFXX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfVlJBV19QQVksR3N0UnRwVlJhd1BheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9WUkFXX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9WUkFXX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfVlJBV19QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX1ZSQVdfUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFZSYXdQYXkgR3N0UnRwVlJhd1BheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBWUmF3UGF5Q2xhc3MgR3N0UnRwVlJhd1BheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cFZSYXdQYXkKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWQgcGF5bG9hZDsKKworICBHc3RWaWRlb0luZm8gdmluZm87CisKKyAgZ2ludCBwZ3JvdXA7CisgIGdpbnQgeGluYywgeWluYzsKKworICAvKiBwcm9wZXJ0aWVzICovCisgIGd1aW50IGNodW5rc19wZXJfZnJhbWU7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cFZSYXdQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfdnJhd19wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX3ZyYXdfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX1ZSQVdfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9tZXNvbi5idWlsZCBiL2dzdC9ydHAvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYyNDE1MgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxMTEgQEAKK3J0cF9zb3VyY2VzID0gWworICAnZGJvb2xodWZmLmMnLAorICAnZm52MWhhc2guYycsCisgICdnc3RydHAuYycsCisgICdnc3RydHBjaGFubmVscy5jJywKKyAgJ2dzdHJ0cGFjM2RlcGF5LmMnLAorICAnZ3N0cnRwYWMzcGF5LmMnLAorICAnZ3N0cnRwYnZkZXBheS5jJywKKyAgJ2dzdHJ0cGJ2cGF5LmMnLAorICAnZ3N0cnRwY2VsdGRlcGF5LmMnLAorICAnZ3N0cnRwY2VsdHBheS5jJywKKyAgJ2dzdHJ0cGR2ZGVwYXkuYycsCisgICdnc3RydHBkdnBheS5jJywKKyAgJ2dzdHJ0cGdzdGRlcGF5LmMnLAorICAnZ3N0cnRwZ3N0cGF5LmMnLAorICAnZ3N0cnRwaWxiY2RlcGF5LmMnLAorICAnZ3N0cnRwaWxiY3BheS5jJywKKyAgJ2dzdHJ0cGtsdmRlcGF5LmMnLAorICAnZ3N0cnRwa2x2cGF5LmMnLAorICAnZ3N0cnRwbXBhZGVwYXkuYycsCisgICdnc3RydHBtcGFwYXkuYycsCisgICdnc3RydHBtcGFyb2J1c3RkZXBheS5jJywKKyAgJ2dzdHJ0cG1wdmRlcGF5LmMnLAorICAnZ3N0cnRwbXB2cGF5LmMnLAorICAnZ3N0cnRwb3B1c3BheS5jJywKKyAgJ2dzdHJ0cG9wdXNkZXBheS5jJywKKyAgJ2dzdHJ0cHBjbWFkZXBheS5jJywKKyAgJ2dzdHJ0cHBjbXVkZXBheS5jJywKKyAgJ2dzdHJ0cHBjbXVwYXkuYycsCisgICdnc3RydHBwY21hcGF5LmMnLAorICAnZ3N0cnRwZzcyMmRlcGF5LmMnLAorICAnZ3N0cnRwZzcyMnBheS5jJywKKyAgJ2dzdHJ0cGc3MjNkZXBheS5jJywKKyAgJ2dzdHJ0cGc3MjNwYXkuYycsCisgICdnc3RydHBnNzI2cGF5LmMnLAorICAnZ3N0cnRwZzcyNmRlcGF5LmMnLAorICAnZ3N0cnRwZzcyOXBheS5jJywKKyAgJ2dzdHJ0cGc3MjlkZXBheS5jJywKKyAgJ2dzdHJ0cGdzbWRlcGF5LmMnLAorICAnZ3N0cnRwZ3NtcGF5LmMnLAorICAnZ3N0cnRwYW1yZGVwYXkuYycsCisgICdnc3RydHBhbXJwYXkuYycsCisgICdnc3RydHBoMjYxZGVwYXkuYycsCisgICdnc3RydHBoMjYxcGF5LmMnLAorICAnZ3N0cnRwaDI2M3BkZXBheS5jJywKKyAgJ2dzdHJ0cGgyNjNwcGF5LmMnLAorICAnZ3N0cnRwaDI2M2RlcGF5LmMnLAorICAnZ3N0cnRwaDI2M3BheS5jJywKKyAgJ2dzdHJ0cGgyNjRkZXBheS5jJywKKyAgJ2dzdHJ0cGgyNjRwYXkuYycsCisgICdnc3RydHBoMjY1ZGVwYXkuYycsCisgICdnc3RydHBoMjY1cGF5LmMnLAorICAnZ3N0cnRwajJrZGVwYXkuYycsCisgICdnc3RydHBqMmtwYXkuYycsCisgICdnc3RydHBqcGVnZGVwYXkuYycsCisgICdnc3RydHBqcGVncGF5LmMnLAorICAnZ3N0cnRwTDhkZXBheS5jJywKKyAgJ2dzdHJ0cEw4cGF5LmMnLAorICAnZ3N0cnRwTDE2ZGVwYXkuYycsCisgICdnc3RydHBMMTZwYXkuYycsCisgICdnc3RydHBMMjRkZXBheS5jJywKKyAgJ2dzdHJ0cEwyNHBheS5jJywKKyAgJ2dzdGFzdGVyaXNraDI2My5jJywKKyAgJ2dzdHJ0cG1wMXNkZXBheS5jJywKKyAgJ2dzdHJ0cG1wMnRkZXBheS5jJywKKyAgJ2dzdHJ0cG1wMnRwYXkuYycsCisgICdnc3RydHBtcDR2ZGVwYXkuYycsCisgICdnc3RydHBtcDR2cGF5LmMnLAorICAnZ3N0cnRwbXA0Z2RlcGF5LmMnLAorICAnZ3N0cnRwbXA0Z3BheS5jJywKKyAgJ2dzdHJ0cG1wNGFkZXBheS5jJywKKyAgJ2dzdHJ0cG1wNGFwYXkuYycsCisgICdnc3RydHBxY2VscGRlcGF5LmMnLAorICAnZ3N0cnRwcWRtZGVwYXkuYycsCisgICdnc3RydHBzYmNkZXBheS5jJywKKyAgJ2dzdHJ0cHNiY3BheS5jJywKKyAgJ2dzdHJ0cHNpcmVucGF5LmMnLAorICAnZ3N0cnRwc2lyZW5kZXBheS5jJywKKyAgJ2dzdHJ0cHNwZWV4ZGVwYXkuYycsCisgICdnc3RydHBzcGVleHBheS5jJywKKyAgJ2dzdHJ0cHN2M3ZkZXBheS5jJywKKyAgJ2dzdHJ0cHRoZW9yYWRlcGF5LmMnLAorICAnZ3N0cnRwdGhlb3JhcGF5LmMnLAorICAnZ3N0cnRwdm9yYmlzZGVwYXkuYycsCisgICdnc3RydHB2b3JiaXNwYXkuYycsCisgICdnc3RydHB2cDhkZXBheS5jJywKKyAgJ2dzdHJ0cHZwOHBheS5jJywKKyAgJ2dzdHJ0cHZwOWRlcGF5LmMnLAorICAnZ3N0cnRwdnA5cGF5LmMnLAorICAnZ3N0cnRwdnJhd2RlcGF5LmMnLAorICAnZ3N0cnRwdnJhd3BheS5jJywKKyAgJ2dzdHJ0cHN0cmVhbXBheS5jJywKKyAgJ2dzdHJ0cHN0cmVhbWRlcGF5LmMnLAorICAnZ3N0cnRwdXRpbHMuYycsCitdCisKK3J0cF9hcmdzID0gWworICAnLUR2cDhfbm9ybT1nc3RfcnRwdnA4X3ZwOF9ub3JtJywKKyAgJy1EdnA4ZHhfc3RhcnRfZGVjb2RlPWdzdF9ydHB2cDhfdnA4ZHhfc3RhcnRfZGVjb2RlJywKKyAgJy1EdnA4ZHhfYm9vbF9kZWNvZGVyX2ZpbGw9Z3N0X3J0cHZwOF92cDhkeF9ib29sX2RlY29kZXJfZmlsbCcsCitdCisKK2dzdHJ0cCA9IGxpYnJhcnkoJ2dzdHJ0cCcsCisgIHJ0cF9zb3VyY2VzLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MgKyBydHBfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0YmFzZV9kZXAsIGdzdGF1ZGlvX2RlcCwgZ3N0dmlkZW9fZGVwLCBnc3R0YWdfZGVwLAorICAgICAgICAgICAgICAgICAgZ3N0cnRwX2RlcCwgZ3N0cGJ1dGlsc19kZXAsIGxpYm1dLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW0gYi9nc3QvcnRwbWFuYWdlci9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OThlNjFmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzOSBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0cnRwbWFuYWdlci5sYQorCitsaWJnc3RydHBtYW5hZ2VyX2xhX1NPVVJDRVMgPSBnc3RydHBtYW5hZ2VyLmMgXAorCQkJICAgICAgZ3N0cnRwYmluLmMgXAorCQkJICAgICAgZ3N0cnRwZHRtZm11eC5jIFwKKwkJCSAgICAgIGdzdHJ0cGppdHRlcmJ1ZmZlci5jIFwKKwkJCSAgICAgIGdzdHJ0cG11eC5jIFwKKwkJCSAgICAgIGdzdHJ0cHB0ZGVtdXguYyBcCisJCQkgICAgICBnc3RydHBydHhxdWV1ZS5jIFwKKwkJCSAgICAgIGdzdHJ0cHJ0eHJlY2VpdmUuYyBcCisJCQkgICAgICBnc3RydHBydHhzZW5kLmMgXAorCQkJICAgICAgZ3N0cnRwc3NyY2RlbXV4LmMgXAorCQkJICAgICAgcnRwaml0dGVyYnVmZmVyLmMgICAgICBcCisJCQkgICAgICBydHBzZXNzaW9uLmMgICAgICBcCisJCQkgICAgICBydHBzb3VyY2UuYyAgICAgIFwKKwkJCSAgICAgIHJ0cHN0YXRzLmMgICAgICBcCisJCQkgICAgICBnc3RydHBzZXNzaW9uLmMKKworbm9pbnN0X0hFQURFUlMgPSBnc3RydHBiaW4uaCBcCisJCSBnc3RydHBkdG1mbXV4LmggXAorCQkgZ3N0cnRwaml0dGVyYnVmZmVyLmggXAorCQkgZ3N0cnRwbXV4LmggXAorICAgICAgICAgICAgICAgICBnc3RydHBwdGRlbXV4LmggXAorICAgICAgICAgICAgICAgICBnc3RydHBzc3JjZGVtdXguaCBcCisgICAgICAgICAgICAgICAgIGdzdHJ0cHJ0eHF1ZXVlLmggXAorICAgICAgICAgICAgICAgICBnc3RydHBydHhyZWNlaXZlLmggXAorICAgICAgICAgICAgICAgICBnc3RydHBydHhzZW5kLmggXAorICAgICAgICAgICAgICAgICBydHBqaXR0ZXJidWZmZXIuaCBcCisJCSBydHBzZXNzaW9uLmggIFwKKwkJIHJ0cHNvdXJjZS5oICBcCisJCSBydHBzdGF0cy5oICBcCisJCSBnc3RydHBzZXNzaW9uLmgKKworbGliZ3N0cnRwbWFuYWdlcl9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpIFwKKwkkKEdTVF9ORVRfQ0ZMQUdTKSAkKFdBUk5JTkdfQ0ZMQUdTKSAkKEVSUk9SX0NGTEFHUykKK2xpYmdzdHJ0cG1hbmFnZXJfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIFwKKwkkKEdTVF9ORVRfTElCUykgLWxnc3RydHAtQEdTVF9BUElfVkVSU0lPTkAgXAorCSQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykKK2xpYmdzdHJ0cG1hbmFnZXJfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmMgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODQ4NzExCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmMKQEAgLTAsMCArMSw0NTcyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwYmluCisgKiBAc2VlX2Fsc286IHJ0cGppdHRlcmJ1ZmZlciwgcnRwc2Vzc2lvbiwgcnRwcHRkZW11eCwgcnRwc3NyY2RlbXV4CisgKgorICogUlRQIGJpbiBjb21iaW5lcyB0aGUgZnVuY3Rpb25zIG9mICNHc3RSdHBTZXNzaW9uLCAjR3N0UnRwU3NyY0RlbXV4LAorICogI0dzdFJ0cEppdHRlckJ1ZmZlciBhbmQgI0dzdFJ0cFB0RGVtdXggaW4gb25lIGVsZW1lbnQuIEl0IGFsbG93cyBmb3IgbXVsdGlwbGUKKyAqIFJUUCBzZXNzaW9ucyB0aGF0IHdpbGwgYmUgc3luY2hyb25pemVkIHRvZ2V0aGVyIHVzaW5nIFJUQ1AgU1IgcGFja2V0cy4KKyAqCisgKiAjR3N0UnRwQmluIGlzIGNvbmZpZ3VyZWQgd2l0aCBhIG51bWJlciBvZiByZXF1ZXN0IHBhZHMgdGhhdCBkZWZpbmUgdGhlCisgKiBmdW5jdGlvbmFsaXR5IHRoYXQgaXMgYWN0aXZhdGVkLCBzaW1pbGFyIHRvIHRoZSAjR3N0UnRwU2Vzc2lvbiBlbGVtZW50LgorICoKKyAqIFRvIHVzZSAjR3N0UnRwQmluIGFzIGFuIFJUUCByZWNlaXZlciwgcmVxdWVzdCBhIHJlY3ZfcnRwX3NpbmtfXCV1IHBhZC4gVGhlIHNlc3Npb24KKyAqIG51bWJlciBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUgcGFkIG5hbWUuCisgKiBEYXRhIHJlY2VpdmVkIG9uIHRoZSByZWN2X3J0cF9zaW5rX1wldSBwYWQgd2lsbCBiZSBwcm9jZXNzZWQgaW4gdGhlICNHc3RSdHBTZXNzaW9uCisgKiBtYW5hZ2VyIGFuZCBhZnRlciBiZWluZyB2YWxpZGF0ZWQgZm9yd2FyZGVkIG9uICNHc3RSdHBTc3JjRGVtdXggZWxlbWVudC4gRWFjaAorICogUlRQIHN0cmVhbSBpcyBkZW11eGVkIGJhc2VkIG9uIHRoZSBTU1JDIGFuZCBzZW5kIHRvIGEgI0dzdFJ0cEppdHRlckJ1ZmZlci4gQWZ0ZXIKKyAqIHRoZSBwYWNrZXRzIGFyZSByZWxlYXNlZCBmcm9tIHRoZSBqaXR0ZXJidWZmZXIsIHRoZXkgd2lsbCBiZSBmb3J3YXJkZWQgdG8gYQorICogI0dzdFJ0cFB0RGVtdXggZWxlbWVudC4gVGhlICNHc3RSdHBQdERlbXV4IGVsZW1lbnQgd2lsbCBkZW11eCB0aGUgcGFja2V0cyBiYXNlZAorICogb24gdGhlIHBheWxvYWQgdHlwZSBhbmQgd2lsbCBjcmVhdGUgYSB1bmlxdWUgcGFkIHJlY3ZfcnRwX3NyY19cJXVfXCV1X1wldSBvbgorICogcnRwYmluIHdpdGggdGhlIHNlc3Npb24gbnVtYmVyLCBTU1JDIGFuZCBwYXlsb2FkIHR5cGUgcmVzcGVjdGl2ZWx5IGFzIHRoZSBwYWQKKyAqIG5hbWUuCisgKgorICogVG8gYWxzbyB1c2UgI0dzdFJ0cEJpbiBhcyBhbiBSVENQIHJlY2VpdmVyLCByZXF1ZXN0IGEgcmVjdl9ydGNwX3NpbmtfXCV1IHBhZC4gVGhlCisgKiBzZXNzaW9uIG51bWJlciBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUgcGFkIG5hbWUuCisgKgorICogSWYgeW91IHdhbnQgdGhlIHNlc3Npb24gbWFuYWdlciB0byBnZW5lcmF0ZSBhbmQgc2VuZCBSVENQIHBhY2tldHMsIHJlcXVlc3QKKyAqIHRoZSBzZW5kX3J0Y3Bfc3JjX1wldSBwYWQgd2l0aCB0aGUgc2Vzc2lvbiBudW1iZXIgaW4gdGhlIHBhZCBuYW1lLiBQYWNrZXQgcHVzaGVkCisgKiBvbiB0aGlzIHBhZCBjb250YWluIFNSL1JSIFJUQ1AgcmVwb3J0cyB0aGF0IHNob3VsZCBiZSBzZW50IHRvIGFsbCBwYXJ0aWNpcGFudHMKKyAqIGluIHRoZSBzZXNzaW9uLgorICoKKyAqIFRvIHVzZSAjR3N0UnRwQmluIGFzIGEgc2VuZGVyLCByZXF1ZXN0IGEgc2VuZF9ydHBfc2lua19cJXUgcGFkLCB3aGljaCB3aWxsCisgKiBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIHNlbmRfcnRwX3NyY19cJXUgcGFkLiBJZiB0aGUgc2Vzc2lvbiBudW1iZXIgaXMgbm90IHByb3ZpZGVkLAorICogdGhlIHBhZCBmcm9tIHRoZSBsb3dlc3QgYXZhaWxhYmxlIHNlc3Npb24gd2lsbCBiZSByZXR1cm5lZC4gVGhlIHNlc3Npb24gbWFuYWdlciB3aWxsIG1vZGlmeSB0aGUKKyAqIFNTUkMgaW4gdGhlIFJUUCBwYWNrZXRzIHRvIGl0cyBvd24gU1NSQyBhbmQgd2lsIGZvcndhcmQgdGhlIHBhY2tldHMgb24gdGhlCisgKiBzZW5kX3J0cF9zcmNfXCV1IHBhZCBhZnRlciB1cGRhdGluZyBpdHMgaW50ZXJuYWwgc3RhdGUuCisgKgorICogI0dzdFJ0cEJpbiBjYW4gYWxzbyBkZW11bHRpcGxleCBpbmNvbWluZyBidW5kbGVkIHN0cmVhbXMuIFRoZSBmaXJzdAorICogI0dzdFJ0cFNlc3Npb24gd2lsbCBoYXZlIGEgI0dzdFJ0cFNzcmNEZW11eCBlbGVtZW50IHNwbGl0dGluZyB0aGUgc3RyZWFtcworICogYmFzZWQgb24gdGhlaXIgU1NSQyBhbmQgcG90ZW50aWFsbHkgZGlzcGF0Y2hlZCB0byBhIGRpZmZlcmVudCAjR3N0UnRwU2Vzc2lvbi4KKyAqIEJlY2F1c2UgcmV0cmFuc21pc3Npb24gU1NSQ3MgbmVlZCB0byBiZSBtZXJnZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBtZWRpYQorICogc3RyZWFtIHRoZSAjR3N0UnRwQmluOjpvbi1idW5kbGVkLXNzcmMgc2lnbmFsIGlzIGVtaXR0ZWQgc28gdGhhdCB0aGUKKyAqIGFwcGxpY2F0aW9uIGNhbiBmaW5kIG91dCB0byB3aGljaCBzZXNzaW9uIHRoZSBTU1JDIGJlbG9uZ3MuCisgKgorICogVGhlIHNlc3Npb24gbWFuYWdlciBuZWVkcyB0aGUgY2xvY2stcmF0ZSBvZiB0aGUgcGF5bG9hZCB0eXBlcyBpdCBpcyBoYW5kbGluZworICogYW5kIHdpbGwgc2lnbmFsIHRoZSAjR3N0UnRwU2Vzc2lvbjo6cmVxdWVzdC1wdC1tYXAgc2lnbmFsIHdoZW4gaXQgbmVlZHMgc3VjaCBhCisgKiBtYXBwaW5nLiBPbmUgY2FuIGNsZWFyIHRoZSBjYWNoZWQgdmFsdWVzIHdpdGggdGhlICNHc3RSdHBTZXNzaW9uOjpjbGVhci1wdC1tYXAKKyAqIHNpZ25hbC4KKyAqCisgKiBBY2Nlc3MgdG8gdGhlIGludGVybmFsIHN0YXRpc3RpY3Mgb2YgcnRwYmluIGlzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBnZXQtaW50ZXJuYWwtc2Vzc2lvbiBwcm9wZXJ0eS4gVGhpcyBhY3Rpb24gc2lnbmFsIGdpdmVzIGFjY2VzcyB0byB0aGUKKyAqIFJUUFNlc3Npb24gb2JqZWN0IHdoaWNoIGZ1cnRoZXIgcHJvdmlkZXMgYWN0aW9uIHNpZ25hbHMgdG8gcmV0cmlldmUgdGhlCisgKiBpbnRlcm5hbCBzb3VyY2UgYW5kIG90aGVyIHNvdXJjZXMuCisgKgorICogI0dzdFJ0cEJpbiBhbHNvIGhhcyBzaWduYWxzICgjR3N0UnRwQmluOjpyZXF1ZXN0LXJ0cC1lbmNvZGVyLAorICogI0dzdFJ0cEJpbjo6cmVxdWVzdC1ydHAtZGVjb2RlciwgI0dzdFJ0cEJpbjo6cmVxdWVzdC1ydGNwLWVuY29kZXIgYW5kCisgKiAjR3N0UnRwQmluOjpyZXF1ZXN0LXJ0cC1kZWNvZGVyKSB0byBkeW5hbWljYWxseSByZXF1ZXN0IGZvciBSVFAgYW5kIFJUQ1AgZW5jb2RlcnMKKyAqIGFuZCBkZWNvZGVycyBpbiBvcmRlciB0byBzdXBwb3J0IFNSVFAuIFRoZSBlbmNvZGVycyBtdXN0IHByb3ZpZGUgdGhlIHBhZHMKKyAqIHJ0cF9zaW5rX1wldSBhbmQgcnRwX3NyY19cJXUgZm9yIFJUUCBhbmQgcnRjcF9zaW5rX1wldSBhbmQgcnRjcF9zcmNfXCV1IGZvcgorICogUlRDUC4gVGhlIHNlc3Npb24gbnVtYmVyIHdpbGwgYmUgdXNlZCBpbiB0aGUgcGFkIG5hbWUuIFRoZSBkZWNvZGVycyBtdXN0IHByb3ZpZGUKKyAqIHJ0cF9zaW5rIGFuZCBydHBfc3JjIGZvciBSVFAgYW5kIHJ0Y3Bfc2luayBhbmQgcnRjcF9zcmMgZm9yIFJUQ1AuIFRoZSBkZWNvZGVycyB3aWxsCisgKiBiZSBwbGFjZWQgYmVmb3JlIHRoZSAjR3N0UnRwU2Vzc2lvbiBlbGVtZW50LCB0aHVzIHRoZXkgbXVzdCBzdXBwb3J0IFNTUkMgZGVtdXhpbmcKKyAqIGludGVybmFsbHkuCisgKgorICogI0dzdFJ0cEJpbiBoYXMgc2lnbmFscyAoI0dzdFJ0cEJpbjo6cmVxdWVzdC1hdXgtc2VuZGVyIGFuZAorICogI0dzdFJ0cEJpbjo6cmVxdWVzdC1hdXgtcmVjZWl2ZXIgdG8gZHluYW1pY2FsbHkgcmVxdWVzdCBhbiBlbGVtZW50IHRoYXQgY2FuIGJlCisgKiB1c2VkIHRvIGNyZWF0ZSBvciBtZXJnZSBhZGRpdGlvbmFsIFJUUCBzdHJlYW1zLiBBVVggZWxlbWVudHMgYXJlIG5lZWRlZCB0bworICogaW1wbGVtZW50IEZFQyBvciByZXRyYW5zbWlzc2lvbiAoc3VjaCBhcyBSRkMgNDU4OCkuIEFuIEFVWCBzZW5kZXIgbXVzdCBoYXZlIG9uZQorICogc2lua19cJXUgcGFkIHRoYXQgbWF0Y2hlcyB0aGUgc2Vzc2lvbmlkIGluIHRoZSBzaWduYWwgYW5kIGl0IHNob3VsZCBoYXZlIDEgb3IKKyAqIG1vcmUgc3JjX1wldSBwYWRzLiBGb3IgZWFjaCBzcmNfJVx1IHBhZCwgYSBzZXNzaW9uIHdpbGwgYmUgbWFkZSAoaWYgbmVlZGVkKQorICogYW5kIHRoZSBwYWQgd2lsbCBiZSBsaW5rZWQgdG8gdGhlIHNlc3Npb24gc2VuZF9ydHBfc2luayBwYWQuIEVhY2ggc2Vzc2lvbiB3aWxsCisgKiB0aGVuIGV4cG9zZSBpdHMgc291cmNlIHBhZCBhcyBzZW5kX3J0cF9zcmNfXCV1IG9uICNHc3RSdHBCaW4uCisgKiBBbiBBVVggcmVjZWl2ZXIgaGFzIDEgc3JjX1wldSBwYWQgdGhhdCBtdWNoIG1hdGNoIHRoZSBzZXNzaW9uaWQgaW4gdGhlIHNpZ25hbAorICogYW5kIDEgb3IgbW9yZSBzaW5rX1wldSBwYWRzLiBBIHNlc3Npb24gd2lsbCBiZSBtYWRlIGZvciBlYWNoIHNpbmtfXCV1IHBhZAorICogd2hlbiB0aGUgY29ycmVzcG9uZGluZyByZWN2X3J0cF9zaW5rX1wldSBwYWQgaXMgcmVxdWVzdGVkIG9uICNHc3RSdHBCaW4uCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB1ZHBzcmMgcG9ydD01MDAwIGNhcHM9ImFwcGxpY2F0aW9uL3gtcnRwLCAuLi4iICEgLnJlY3ZfcnRwX3NpbmtfMCBcCisgKiAgICAgcnRwYmluICEgcnRwdGhlb3JhZGVwYXkgISB0aGVvcmFkZWMgISB4dmltYWdlc2luaworICogXXwgUmVjZWl2ZSBSVFAgZGF0YSBmcm9tIHBvcnQgNTAwMCBhbmQgc2VuZCB0byB0aGUgc2Vzc2lvbiAwIGluIHJ0cGJpbi4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBydHBiaW4gbmFtZT1ydHBiaW4gXAorICogICAgICAgICB2NGwyc3JjICEgdmlkZW9jb252ZXJ0ICEgZmZlbmNfaDI2MyAhIHJ0cGgyNjNwcGF5ICEgcnRwYmluLnNlbmRfcnRwX3NpbmtfMCBcCisgKiAgICAgICAgICAgICAgICAgICBydHBiaW4uc2VuZF9ydHBfc3JjXzAgISB1ZHBzaW5rIHBvcnQ9NTAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgKiAgICAgICAgICAgICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18wICEgdWRwc2luayBwb3J0PTUwMDEgc3luYz1mYWxzZSBhc3luYz1mYWxzZSAgICBcCisgKiAgICAgICAgICAgICAgICAgICB1ZHBzcmMgcG9ydD01MDA1ICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgKiAgICAgICAgIGF1ZGlvdGVzdHNyYyAhIGFtcm5iZW5jICEgcnRwYW1ycGF5ICEgcnRwYmluLnNlbmRfcnRwX3NpbmtfMSAgICAgICAgICAgICAgICAgICBcCisgKiAgICAgICAgICAgICAgICAgICBydHBiaW4uc2VuZF9ydHBfc3JjXzEgISB1ZHBzaW5rIHBvcnQ9NTAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgKiAgICAgICAgICAgICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18xICEgdWRwc2luayBwb3J0PTUwMDMgc3luYz1mYWxzZSBhc3luYz1mYWxzZSAgICBcCisgKiAgICAgICAgICAgICAgICAgICB1ZHBzcmMgcG9ydD01MDA3ICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzEKKyAqIF18IEVuY29kZSBhbmQgcGF5bG9hZCBIMjYzIHZpZGVvIGNhcHR1cmVkIGZyb20gYSB2NGwyc3JjLiBFbmNvZGUgYW5kIHBheWxvYWQgQU1SCisgKiBhdWRpbyBnZW5lcmF0ZWQgZnJvbSBhdWRpb3Rlc3RzcmMuIFRoZSB2aWRlbyBpcyBzZW50IHRvIHNlc3Npb24gMCBpbiBydHBiaW4KKyAqIGFuZCB0aGUgYXVkaW8gaXMgc2VudCB0byBzZXNzaW9uIDEuIFZpZGVvIHBhY2tldHMgYXJlIHNlbnQgb24gVURQIHBvcnQgNTAwMAorICogYW5kIGF1ZGlvIHBhY2tldHMgb24gcG9ydCA1MDAyLiBUaGUgdmlkZW8gUlRDUCBwYWNrZXRzIGZvciBzZXNzaW9uIDAgYXJlIHNlbnQKKyAqIG9uIHBvcnQgNTAwMSBhbmQgdGhlIGF1ZGlvIFJUQ1AgcGFja2V0cyBmb3Igc2Vzc2lvbiAwIGFyZSBzZW50IG9uIHBvcnQgNTAwMy4KKyAqIFJUQ1AgcGFja2V0cyBmb3Igc2Vzc2lvbiAwIGFyZSByZWNlaXZlZCBvbiBwb3J0IDUwMDUgYW5kIFJUQ1AgZm9yIHNlc3Npb24gMQorICogaXMgcmVjZWl2ZWQgb24gcG9ydCA1MDA3LiBTaW5jZSBSVENQIHBhY2tldHMgZnJvbSB0aGUgc2VuZGVyIHNob3VsZCBiZSBzZW50CisgKiBhcyBzb29uIGFzIHBvc3NpYmxlIGFuZCBkbyBub3QgcGFydGljaXBhdGUgaW4gcHJlcm9sbCwgc3luYz1mYWxzZSBhbmQKKyAqIGFzeW5jPWZhbHNlIGlzIGNvbmZpZ3VyZWQgb24gdWRwc2luaworICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHJ0cGJpbiBuYW1lPXJ0cGJpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAqICAgICB1ZHBzcmMgY2Fwcz0iYXBwbGljYXRpb24veC1ydHAsbWVkaWE9KHN0cmluZyl2aWRlbyxjbG9jay1yYXRlPShpbnQpOTAwMDAsZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjMtMTk5OCIgXAorICogICAgICAgICAgICAgcG9ydD01MDAwICEgcnRwYmluLnJlY3ZfcnRwX3NpbmtfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICogICAgICAgICBydHBiaW4uICEgcnRwaDI2M3BkZXBheSAhIGZmZGVjX2gyNjMgISB4dmltYWdlc2luayAgICAgICAgICAgICAgICAgICAgXAorICogICAgICB1ZHBzcmMgcG9ydD01MDAxICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICogICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18wICEgdWRwc2luayBwb3J0PTUwMDUgc3luYz1mYWxzZSBhc3luYz1mYWxzZSAgICAgICAgXAorICogICAgIHVkcHNyYyBjYXBzPSJhcHBsaWNhdGlvbi94LXJ0cCxtZWRpYT0oc3RyaW5nKWF1ZGlvLGNsb2NrLXJhdGU9KGludCk4MDAwLGVuY29kaW5nLW5hbWU9KHN0cmluZylBTVIsZW5jb2RpbmctcGFyYW1zPShzdHJpbmcpMSxvY3RldC1hbGlnbj0oc3RyaW5nKTEiIFwKKyAqICAgICAgICAgICAgIHBvcnQ9NTAwMiAhIHJ0cGJpbi5yZWN2X3J0cF9zaW5rXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAqICAgICAgICAgcnRwYmluLiAhIHJ0cGFtcmRlcGF5ICEgYW1ybmJkZWMgISBhbHNhc2luayAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAqICAgICAgdWRwc3JjIHBvcnQ9NTAwMyAhIHJ0cGJpbi5yZWN2X3J0Y3Bfc2lua18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAqICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMSAhIHVkcHNpbmsgcG9ydD01MDA3IHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UKKyAqIF18IFJlY2VpdmUgSDI2MyBvbiBwb3J0IDUwMDAsIHNlbmQgaXQgdGhyb3VnaCBydHBiaW4gaW4gc2Vzc2lvbiAwLCBkZXBheWxvYWQsCisgKiBkZWNvZGUgYW5kIGRpc3BsYXkgdGhlIHZpZGVvLgorICogUmVjZWl2ZSBBTVIgb24gcG9ydCA1MDAyLCBzZW5kIGl0IHRocm91Z2ggcnRwYmluIGluIHNlc3Npb24gMSwgZGVwYXlsb2FkLAorICogZGVjb2RlIGFuZCBwbGF5IHRoZSBhdWRpby4KKyAqIFJlY2VpdmUgc2VydmVyIFJUQ1AgcGFja2V0cyBmb3Igc2Vzc2lvbiAwIG9uIHBvcnQgNTAwMSBhbmQgUlRDUCBwYWNrZXRzIGZvcgorICogc2Vzc2lvbiAxIG9uIHBvcnQgNTAwMy4gVGhlc2UgcGFja2V0cyB3aWxsIGJlIHVzZWQgZm9yIHNlc3Npb24gbWFuYWdlbWVudCBhbmQKKyAqIHN5bmNocm9uaXNhdGlvbi4KKyAqIFNlbmQgUlRDUCByZXBvcnRzIGZvciBzZXNzaW9uIDAgb24gcG9ydCA1MDA1IGFuZCBSVENQIHJlcG9ydHMgZm9yIHNlc3Npb24gMQorICogb24gcG9ydCA1MDA3LgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydGNwYnVmZmVyLmg+CisKKyNpbmNsdWRlICJnc3RydHBiaW4uaCIKKyNpbmNsdWRlICJydHBzZXNzaW9uLmgiCisjaW5jbHVkZSAiZ3N0cnRwc2Vzc2lvbi5oIgorI2luY2x1ZGUgImdzdHJ0cGppdHRlcmJ1ZmZlci5oIgorCisjaW5jbHVkZSA8Z3N0L2dsaWItY29tcGF0LXByaXZhdGUuaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3J0cF9iaW5fZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3J0cF9iaW5fZGVidWcKKworLyogc2luayBwYWRzICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgcnRwYmluX3JlY3ZfcnRwX3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgicmVjdl9ydHBfc2lua18ldSIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfUkVRVUVTVCwKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cDthcHBsaWNhdGlvbi94LXNydHAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBydHBiaW5fcmVjdl9ydGNwX3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgicmVjdl9ydGNwX3NpbmtfJXUiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydGNwO2FwcGxpY2F0aW9uL3gtc3J0Y3AiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBydHBiaW5fc2VuZF9ydHBfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNlbmRfcnRwX3NpbmtfJXUiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAiKQorICAgICk7CisKKy8qIHNyYyBwYWRzICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgcnRwYmluX3JlY3ZfcnRwX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInJlY3ZfcnRwX3NyY18ldV8ldV8ldSIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9TT01FVElNRVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBydHBiaW5fc2VuZF9ydGNwX3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzZW5kX3J0Y3Bfc3JjXyV1IiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydGNwO2FwcGxpY2F0aW9uL3gtc3J0Y3AiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBydHBiaW5fc2VuZF9ydHBfc3JjX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNlbmRfcnRwX3NyY18ldSIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9TT01FVElNRVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHA7YXBwbGljYXRpb24veC1zcnRwIikKKyAgICApOworCisjZGVmaW5lIEdTVF9SVFBfQklOX0dFVF9QUklWQVRFKG9iaikgIFwKKyAgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX1BSSVZBVEUgKChvYmopLCBHU1RfVFlQRV9SVFBfQklOLCBHc3RSdHBCaW5Qcml2YXRlKSkKKworI2RlZmluZSBHU1RfUlRQX0JJTl9MT0NLKGJpbikgICBnX211dGV4X2xvY2sgKCYoYmluKS0+cHJpdi0+YmluX2xvY2spCisjZGVmaW5lIEdTVF9SVFBfQklOX1VOTE9DSyhiaW4pIGdfbXV0ZXhfdW5sb2NrICgmKGJpbiktPnByaXYtPmJpbl9sb2NrKQorCisvKiBsb2NrIHRvIHByb3RlY3QgZHluYW1pYyBjYWxsYmFja3MsIGxpa2UgcGFkLWFkZGVkIGFuZCBuZXcgc3NyYy4gKi8KKyNkZWZpbmUgR1NUX1JUUF9CSU5fRFlOX0xPQ0soYmluKSAgICBnX211dGV4X2xvY2sgKCYoYmluKS0+cHJpdi0+ZHluX2xvY2spCisjZGVmaW5lIEdTVF9SVFBfQklOX0RZTl9VTkxPQ0soYmluKSAgZ19tdXRleF91bmxvY2sgKCYoYmluKS0+cHJpdi0+ZHluX2xvY2spCisKKy8qIGxvY2sgZm9yIHNodXRkb3duICovCisjZGVmaW5lIEdTVF9SVFBfQklOX1NIVVRET1dOX0xPQ0soYmluLGxhYmVsKSAgICAgXAorR19TVE1UX1NUQVJUIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGdfYXRvbWljX2ludF9nZXQgKCZiaW4tPnByaXYtPnNodXRkb3duKSkgICBcCisgICAgZ290byBsYWJlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHU1RfUlRQX0JJTl9EWU5fTE9DSyAoYmluKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGdfYXRvbWljX2ludF9nZXQgKCZiaW4tPnByaXYtPnNodXRkb3duKSkgeyBcCisgICAgR1NUX1JUUF9CSU5fRFlOX1VOTE9DSyAoYmluKTsgICAgICAgICAgICAgICAgXAorICAgIGdvdG8gbGFiZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IEdfU1RNVF9FTkQKKworLyogdW5sb2NrIGZvciBzaHV0ZG93biAqLworI2RlZmluZSBHU1RfUlRQX0JJTl9TSFVURE9XTl9VTkxPQ0soYmluKSAgICAgICAgIFwKKyAgR1NUX1JUUF9CSU5fRFlOX1VOTE9DSyAoYmluKTsgICAgICAgICAgICAgICAgICBcCisKKy8qIE1pbmltdW0gdGltZSBvZmZzZXQgdG8gYXBwbHkuIFRoaXMgY29tcGVuc2F0ZXMgZm9yIHJvdW5kaW5nIGVycm9ycyBpbiBOVFAgdG8KKyAqIFJUUCB0aW1lc3RhbXAgY29udmVyc2lvbnMgKi8KKyNkZWZpbmUgTUlOX1RTX09GRlNFVCAoNCAqIEdTVF9NU0VDT05EKQorCitzdHJ1Y3QgX0dzdFJ0cEJpblByaXZhdGUKK3sKKyAgR011dGV4IGJpbl9sb2NrOworCisgIC8qIGxvY2sgcHJvdGVjdGluZyBkeW5hbWljIGFkZGluZy9yZW1vdmluZyAqLworICBHTXV0ZXggZHluX2xvY2s7CisKKyAgLyogaWYgd2UgYXJlIHNodXR0aW5nIGRvd24gb3Igbm90ICovCisgIGdpbnQgc2h1dGRvd247CisKKyAgZ2Jvb2xlYW4gYXV0b3JlbW92ZTsKKworICAvKiBOVFAgdGltZSBpbiBucyBvZiBsYXN0IFNSIHN5bmMgdXNlZCAqLworICBndWludDY0IGxhc3RfbnRwbnN0aW1lOworCisgIC8qIGxpc3Qgb2YgZXh0cmEgZWxlbWVudHMgKi8KKyAgR0xpc3QgKmVsZW1lbnRzOworfTsKKworLyogc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICBTSUdOQUxfUkVRVUVTVF9QVF9NQVAsCisgIFNJR05BTF9QQVlMT0FEX1RZUEVfQ0hBTkdFLAorICBTSUdOQUxfQ0xFQVJfUFRfTUFQLAorICBTSUdOQUxfUkVTRVRfU1lOQywKKyAgU0lHTkFMX0dFVF9TRVNTSU9OLAorICBTSUdOQUxfR0VUX0lOVEVSTkFMX1NFU1NJT04sCisKKyAgU0lHTkFMX09OX05FV19TU1JDLAorICBTSUdOQUxfT05fU1NSQ19DT0xMSVNJT04sCisgIFNJR05BTF9PTl9TU1JDX1ZBTElEQVRFRCwKKyAgU0lHTkFMX09OX1NTUkNfQUNUSVZFLAorICBTSUdOQUxfT05fU1NSQ19TREVTLAorICBTSUdOQUxfT05fQllFX1NTUkMsCisgIFNJR05BTF9PTl9CWUVfVElNRU9VVCwKKyAgU0lHTkFMX09OX1RJTUVPVVQsCisgIFNJR05BTF9PTl9TRU5ERVJfVElNRU9VVCwKKyAgU0lHTkFMX09OX05QVF9TVE9QLAorCisgIFNJR05BTF9SRVFVRVNUX1JUUF9FTkNPREVSLAorICBTSUdOQUxfUkVRVUVTVF9SVFBfREVDT0RFUiwKKyAgU0lHTkFMX1JFUVVFU1RfUlRDUF9FTkNPREVSLAorICBTSUdOQUxfUkVRVUVTVF9SVENQX0RFQ09ERVIsCisKKyAgU0lHTkFMX05FV19KSVRURVJCVUZGRVIsCisKKyAgU0lHTkFMX1JFUVVFU1RfQVVYX1NFTkRFUiwKKyAgU0lHTkFMX1JFUVVFU1RfQVVYX1JFQ0VJVkVSLAorCisgIFNJR05BTF9PTl9ORVdfU0VOREVSX1NTUkMsCisgIFNJR05BTF9PTl9TRU5ERVJfU1NSQ19BQ1RJVkUsCisKKyAgU0lHTkFMX09OX0JVTkRMRURfU1NSQywKKworICBMQVNUX1NJR05BTAorfTsKKworI2RlZmluZSBERUZBVUxUX0xBVEVOQ1lfTVMgICAgICAgICAgIDIwMAorI2RlZmluZSBERUZBVUxUX0RST1BfT05fTEFURU5DWSAgICAgIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfU0RFUyAgICAgICAgICAgICAgICAgTlVMTAorI2RlZmluZSBERUZBVUxUX0RPX0xPU1QgICAgICAgICAgICAgIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfSUdOT1JFX1BUICAgICAgICAgICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9OVFBfU1lOQyAgICAgICAgICAgICBGQUxTRQorI2RlZmluZSBERUZBVUxUX0FVVE9SRU1PVkUgICAgICAgICAgIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfQlVGRkVSX01PREUgICAgICAgICAgUlRQX0pJVFRFUl9CVUZGRVJfTU9ERV9TTEFWRQorI2RlZmluZSBERUZBVUxUX1VTRV9QSVBFTElORV9DTE9DSyAgIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfUlRDUF9TWU5DICAgICAgICAgICAgR1NUX1JUUF9CSU5fUlRDUF9TWU5DX0FMV0FZUworI2RlZmluZSBERUZBVUxUX1JUQ1BfU1lOQ19JTlRFUlZBTCAgIDAKKyNkZWZpbmUgREVGQVVMVF9ET19TWU5DX0VWRU5UICAgICAgICBGQUxTRQorI2RlZmluZSBERUZBVUxUX0RPX1JFVFJBTlNNSVNTSU9OICAgIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfUlRQX1BST0ZJTEUgICAgICAgICAgR1NUX1JUUF9QUk9GSUxFX0FWUAorI2RlZmluZSBERUZBVUxUX05UUF9USU1FX1NPVVJDRSAgICAgIEdTVF9SVFBfTlRQX1RJTUVfU09VUkNFX05UUAorI2RlZmluZSBERUZBVUxUX1JUQ1BfU1lOQ19TRU5EX1RJTUUgIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGIDEwMDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfRFJPUE9VVF9USU1FICAgICA2MDAwMAorI2RlZmluZSBERUZBVUxUX01BWF9NSVNPUkRFUl9USU1FICAgIDIwMDAKKyNkZWZpbmUgREVGQVVMVF9SRkM3MjczX1NZTkMgICAgICAgICBGQUxTRQorI2RlZmluZSBERUZBVUxUX01BWF9TVFJFQU1TICAgICAgICAgIEdfTUFYVUlOVAorI2RlZmluZSBERUZBVUxUX01BWF9UU19PRkZTRVRfQURKVVNUTUVOVCBHX0dVSU5UNjRfQ09OU1RBTlQoMCkKKyNkZWZpbmUgREVGQVVMVF9NQVhfVFNfT0ZGU0VUICAgICAgICBHX0dJTlQ2NF9DT05TVEFOVCgzMDAwMDAwMDAwKQorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MQVRFTkNZLAorICBQUk9QX0RST1BfT05fTEFURU5DWSwKKyAgUFJPUF9TREVTLAorICBQUk9QX0RPX0xPU1QsCisgIFBST1BfSUdOT1JFX1BULAorICBQUk9QX05UUF9TWU5DLAorICBQUk9QX1JUQ1BfU1lOQywKKyAgUFJPUF9SVENQX1NZTkNfSU5URVJWQUwsCisgIFBST1BfQVVUT1JFTU9WRSwKKyAgUFJPUF9CVUZGRVJfTU9ERSwKKyAgUFJPUF9VU0VfUElQRUxJTkVfQ0xPQ0ssCisgIFBST1BfRE9fU1lOQ19FVkVOVCwKKyAgUFJPUF9ET19SRVRSQU5TTUlTU0lPTiwKKyAgUFJPUF9SVFBfUFJPRklMRSwKKyAgUFJPUF9OVFBfVElNRV9TT1VSQ0UsCisgIFBST1BfUlRDUF9TWU5DX1NFTkRfVElNRSwKKyAgUFJPUF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGLAorICBQUk9QX01BWF9EUk9QT1VUX1RJTUUsCisgIFBST1BfTUFYX01JU09SREVSX1RJTUUsCisgIFBST1BfUkZDNzI3M19TWU5DLAorICBQUk9QX01BWF9TVFJFQU1TLAorICBQUk9QX01BWF9UU19PRkZTRVRfQURKVVNUTUVOVCwKKyAgUFJPUF9NQVhfVFNfT0ZGU0VUCit9OworCisjZGVmaW5lIEdTVF9SVFBfQklOX1JUQ1BfU1lOQ19UWVBFIChnc3RfcnRwX2Jpbl9ydGNwX3N5bmNfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X3J0cF9iaW5fcnRjcF9zeW5jX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgcnRjcF9zeW5jX3R5cGUgPSAwOworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSBydGNwX3N5bmNfdHlwZXNbXSA9IHsKKyAgICB7R1NUX1JUUF9CSU5fUlRDUF9TWU5DX0FMV0FZUywgImFsd2F5cyIsICJhbHdheXMifSwKKyAgICB7R1NUX1JUUF9CSU5fUlRDUF9TWU5DX0lOSVRJQUwsICJpbml0aWFsIiwgImluaXRpYWwifSwKKyAgICB7R1NUX1JUUF9CSU5fUlRDUF9TWU5DX1JUUCwgInJ0cC1pbmZvIiwgInJ0cC1pbmZvIn0sCisgICAgezAsIE5VTEwsIE5VTEx9LAorICB9OworCisgIGlmICghcnRjcF9zeW5jX3R5cGUpIHsKKyAgICBydGNwX3N5bmNfdHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RSVENQU3luYyIsIHJ0Y3Bfc3luY190eXBlcyk7CisgIH0KKyAgcmV0dXJuIHJ0Y3Bfc3luY190eXBlOworfQorCisvKiBoZWxwZXIgb2JqZWN0cyAqLwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEJpblNlc3Npb24gR3N0UnRwQmluU2Vzc2lvbjsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBCaW5TdHJlYW0gR3N0UnRwQmluU3RyZWFtOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEJpbkNsaWVudCBHc3RSdHBCaW5DbGllbnQ7CisKK3N0YXRpYyBndWludCBnc3RfcnRwX2Jpbl9zaWduYWxzW0xBU1RfU0lHTkFMXSA9IHsgMCB9OworCitzdGF0aWMgR3N0Q2FwcyAqcHRfbWFwX3JlcXVlc3RlZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIGd1aW50IHB0LAorICAgIEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzaW9uKTsKK3N0YXRpYyB2b2lkIHBheWxvYWRfdHlwZV9jaGFuZ2UgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBndWludCBwdCwKKyAgICBHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbik7CitzdGF0aWMgdm9pZCByZW1vdmVfcmVjdl9ydHAgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24pOworc3RhdGljIHZvaWQgcmVtb3ZlX3JlY3ZfcnRjcCAoR3N0UnRwQmluICogcnRwYmluLCBHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbik7CitzdGF0aWMgdm9pZCByZW1vdmVfc2VuZF9ydHAgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24pOworc3RhdGljIHZvaWQgcmVtb3ZlX3J0Y3AgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24pOworc3RhdGljIHZvaWQgZnJlZV9jbGllbnQgKEdzdFJ0cEJpbkNsaWVudCAqIGNsaWVudCwgR3N0UnRwQmluICogYmluKTsKK3N0YXRpYyB2b2lkIGZyZWVfc3RyZWFtIChHc3RSdHBCaW5TdHJlYW0gKiBzdHJlYW0sIEdzdFJ0cEJpbiAqIGJpbik7CitzdGF0aWMgR3N0UnRwQmluU2Vzc2lvbiAqY3JlYXRlX3Nlc3Npb24gKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgZ2ludCBpZCk7CitzdGF0aWMgR3N0UGFkICpjb21wbGV0ZV9zZXNzaW9uX3NpbmsgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwKKyAgICBHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbiwgZ2Jvb2xlYW4gYnVuZGxlX2RlbXV4ZXJfbmVlZGVkKTsKK3N0YXRpYyB2b2lkCitjb21wbGV0ZV9zZXNzaW9uX3JlY2VpdmVyIChHc3RSdHBCaW4gKiBydHBiaW4sIEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzaW9uLAorICAgIGd1aW50IHNlc3NpZCk7CitzdGF0aWMgR3N0UGFkICpjb21wbGV0ZV9zZXNzaW9uX3J0Y3AgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwKKyAgICBHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbiwgZ3VpbnQgc2Vzc2lkLCBnYm9vbGVhbiBidW5kbGVfZGVtdXhlcl9uZWVkZWQpOworCisvKiBNYW5hZ2VzIHRoZSBSVFAgc3RyZWFtIGZvciBvbmUgU1NSQy4KKyAqCisgKiBXZSBwaXBlIHRoZSBzdHJlYW0gKGNvbW1pbmcgZnJvbSB0aGUgU1NSQyBkZW11eGVyKSBpbnRvIGEgaml0dGVyYnVmZmVyLgorICogSWYgd2Ugc2VlIGFuIFNERVMgUlRDUCBwYWNrZXQgdGhhdCBsaW5rcyBtdWx0aXBsZSBTU1JDcyB0b2dldGhlciBiYXNlZCBvbiBhCisgKiBjb21tb24gQ05BTUUsIHdlIGNyZWF0ZSBhIEdzdFJ0cEJpbkNsaWVudCBzdHJ1Y3R1cmUgdG8gZ3JvdXAgdGhlIFNTUkNzCisgKiB0b2dldGhlciAoc2VlIGJlbG93KS4KKyAqLworc3RydWN0IF9Hc3RSdHBCaW5TdHJlYW0KK3sKKyAgLyogdGhlIFNTUkMgb2YgdGhpcyBzdHJlYW0gKi8KKyAgZ3VpbnQzMiBzc3JjOworCisgIC8qIHBhcmVudCBiaW4gKi8KKyAgR3N0UnRwQmluICpiaW47CisKKyAgLyogdGhlIHNlc3Npb24gdGhpcyBTU1JDIGJlbG9uZ3MgdG8gKi8KKyAgR3N0UnRwQmluU2Vzc2lvbiAqc2Vzc2lvbjsKKworICAvKiB0aGUgaml0dGVyYnVmZmVyIG9mIHRoZSBTU1JDICovCisgIEdzdEVsZW1lbnQgKmJ1ZmZlcjsKKyAgZ3Vsb25nIGJ1ZmZlcl9oYW5kbGVzeW5jX3NpZzsKKyAgZ3Vsb25nIGJ1ZmZlcl9wdHJlcV9zaWc7CisgIGd1bG9uZyBidWZmZXJfbnRwc3RvcF9zaWc7CisgIGdpbnQgcGVyY2VudDsKKworICAvKiB0aGUgUFQgZGVtdXhlciBvZiB0aGUgU1NSQyAqLworICBHc3RFbGVtZW50ICpkZW11eDsKKyAgZ3Vsb25nIGRlbXV4X25ld3BhZF9zaWc7CisgIGd1bG9uZyBkZW11eF9wYWRyZW1vdmVkX3NpZzsKKyAgZ3Vsb25nIGRlbXV4X3B0cmVxX3NpZzsKKyAgZ3Vsb25nIGRlbXV4X3B0Y2hhbmdlX3NpZzsKKworICAvKiBpZiB3ZSBoYXZlIGNhbGN1bGF0ZWQgYSB2YWxpZCBydF9kZWx0YSBmb3IgdGhpcyBzdHJlYW0gKi8KKyAgZ2Jvb2xlYW4gaGF2ZV9zeW5jOworICAvKiBtYXBwaW5nIHRvIGxvY2FsIFJUUCBhbmQgTlRQIHRpbWUgKi8KKyAgZ2ludDY0IHJ0X2RlbHRhOworICBnaW50NjQgcnRwX2RlbHRhOworICAvKiBiYXNlIHJ0cHRpbWUgaW4gZ3N0IHRpbWUgKi8KKyAgZ2ludDY0IGNsb2NrX2Jhc2U7Cit9OworCisjZGVmaW5lIEdTVF9SVFBfU0VTU0lPTl9MT0NLKHNlc3MpICAgZ19tdXRleF9sb2NrICgmKHNlc3MpLT5sb2NrKQorI2RlZmluZSBHU1RfUlRQX1NFU1NJT05fVU5MT0NLKHNlc3MpIGdfbXV0ZXhfdW5sb2NrICgmKHNlc3MpLT5sb2NrKQorCisvKiBNYW5hZ2VzIHRoZSByZWNlaXZpbmcgZW5kIG9mIHRoZSBwYWNrZXRzLgorICoKKyAqIFRoZXJlIGlzIG9uZSBzdWNoIHN0cnVjdHVyZSBmb3IgZWFjaCBSVFAgc2Vzc2lvbiAoYXVkaW8vdmlkZW8vLi4uKS4KKyAqIFdlIGdldCB0aGUgUlRQL1JUQ1AgcGFja2V0cyBhbmQgc3R1ZmYgdGhlbSBpbnRvIHRoZSBzZXNzaW9uIG1hbmFnZXIuIEZyb20KKyAqIHRoZXJlIHRoZXkgYXJlIHB1c2hlZCBpbnRvIGFuIFNTUkMgZGVtdXhlciB0aGF0IHNwbGl0cyB0aGUgc3RyZWFtIGJhc2VkIG9uCisgKiBTU1JDLiBFYWNoIG9mIHRoZSBTU1JDIHN0cmVhbXMgZ28gaW50byB0aGVpciBvd24gaml0dGVyYnVmZmVyIChtYW5hZ2VkIHdpdGgKKyAqIHRoZSBHc3RSdHBCaW5TdHJlYW0gYWJvdmUpLgorICovCitzdHJ1Y3QgX0dzdFJ0cEJpblNlc3Npb24KK3sKKyAgLyogc2Vzc2lvbiBpZCAqLworICBnaW50IGlkOworICAvKiB0aGUgcGFyZW50IGJpbiAqLworICBHc3RSdHBCaW4gKmJpbjsKKyAgLyogdGhlIHNlc3Npb24gZWxlbWVudCAqLworICBHc3RFbGVtZW50ICpzZXNzaW9uOworICAvKiB0aGUgU1NSQyBkZW11eGVyICovCisgIEdzdEVsZW1lbnQgKmRlbXV4OworICBndWxvbmcgZGVtdXhfbmV3cGFkX3NpZzsKKyAgZ3Vsb25nIGRlbXV4X3BhZHJlbW92ZWRfc2lnOworCisgIC8qIEJ1bmRsaW5nIHN1cHBvcnQgKi8KKyAgR3N0RWxlbWVudCAqcnRwX2Z1bm5lbDsKKyAgR3N0RWxlbWVudCAqcnRjcF9mdW5uZWw7CisgIEdzdEVsZW1lbnQgKmJ1bmRsZV9kZW11eDsKKyAgZ3Vsb25nIGJ1bmRsZV9kZW11eF9uZXdwYWRfc2lnOworCisgIEdNdXRleCBsb2NrOworCisgIC8qIGxpc3Qgb2YgR3N0UnRwQmluU3RyZWFtICovCisgIEdTTGlzdCAqc3RyZWFtczsKKworICAvKiBsaXN0IG9mIGVsZW1lbnRzICovCisgIEdTTGlzdCAqZWxlbWVudHM7CisKKyAgLyogbWFwcGluZyBvZiBwYXlsb2FkIHR5cGUgdG8gY2FwcyAqLworICBHSGFzaFRhYmxlICpwdG1hcDsKKworICAvKiB0aGUgcGFkcyBvZiB0aGUgc2Vzc2lvbiAqLworICBHc3RQYWQgKnJlY3ZfcnRwX3Npbms7CisgIEdzdFBhZCAqcmVjdl9ydHBfc2lua19naG9zdDsKKyAgR3N0UGFkICpyZWN2X3J0cF9zcmM7CisgIEdzdFBhZCAqcmVjdl9ydGNwX3Npbms7CisgIEdzdFBhZCAqcmVjdl9ydGNwX3NpbmtfZ2hvc3Q7CisgIEdzdFBhZCAqc3luY19zcmM7CisgIEdzdFBhZCAqc2VuZF9ydHBfc2luazsKKyAgR3N0UGFkICpzZW5kX3J0cF9zaW5rX2dob3N0OworICBHc3RQYWQgKnNlbmRfcnRwX3NyYzsKKyAgR3N0UGFkICpzZW5kX3J0cF9zcmNfZ2hvc3Q7CisgIEdzdFBhZCAqc2VuZF9ydGNwX3NyYzsKKyAgR3N0UGFkICpzZW5kX3J0Y3Bfc3JjX2dob3N0OworfTsKKworLyogTWFuYWdlcyB0aGUgUlRQIHN0cmVhbXMgdGhhdCBjb21lIGZyb20gb25lIGNsaWVudCBhbmQgc2hvdWxkIHRoZXJlZm9yZSBiZQorICogc3luY2hyb25pemVkLgorICovCitzdHJ1Y3QgX0dzdFJ0cEJpbkNsaWVudAoreworICAvKiB0aGUgY29tbW9uIENOQU1FIGZvciB0aGUgc3RyZWFtcyAqLworICBnY2hhciAqY25hbWU7CisgIGd1aW50IGNuYW1lX2xlbjsKKworICAvKiB0aGUgc3RyZWFtcyAqLworICBndWludCBuc3RyZWFtczsKKyAgR1NMaXN0ICpzdHJlYW1zOworfTsKKworLyogZmluZCBhIHNlc3Npb24gd2l0aCB0aGUgZ2l2ZW4gaWQuIE11c3QgYmUgY2FsbGVkIHdpdGggUlRQX0JJTl9MT0NLICovCitzdGF0aWMgR3N0UnRwQmluU2Vzc2lvbiAqCitmaW5kX3Nlc3Npb25fYnlfaWQgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgZ2ludCBpZCkKK3sKKyAgR1NMaXN0ICp3YWxrOworCisgIGZvciAod2FsayA9IHJ0cGJpbi0+c2Vzc2lvbnM7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UnRwQmluU2Vzc2lvbiAqc2VzcyA9IChHc3RSdHBCaW5TZXNzaW9uICopIHdhbGstPmRhdGE7CisKKyAgICBpZiAoc2Vzcy0+aWQgPT0gaWQpCisgICAgICByZXR1cm4gc2VzczsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworLyogZmluZCBhIHNlc3Npb24gd2l0aCB0aGUgZ2l2ZW4gcmVxdWVzdCBwYWQuIE11c3QgYmUgY2FsbGVkIHdpdGggUlRQX0JJTl9MT0NLICovCitzdGF0aWMgR3N0UnRwQmluU2Vzc2lvbiAqCitmaW5kX3Nlc3Npb25fYnlfcGFkIChHc3RSdHBCaW4gKiBydHBiaW4sIEdzdFBhZCAqIHBhZCkKK3sKKyAgR1NMaXN0ICp3YWxrOworCisgIGZvciAod2FsayA9IHJ0cGJpbi0+c2Vzc2lvbnM7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UnRwQmluU2Vzc2lvbiAqc2VzcyA9IChHc3RSdHBCaW5TZXNzaW9uICopIHdhbGstPmRhdGE7CisKKyAgICBpZiAoKHNlc3MtPnJlY3ZfcnRwX3NpbmtfZ2hvc3QgPT0gcGFkKSB8fAorICAgICAgICAoc2Vzcy0+cmVjdl9ydGNwX3NpbmtfZ2hvc3QgPT0gcGFkKSB8fAorICAgICAgICAoc2Vzcy0+c2VuZF9ydHBfc2lua19naG9zdCA9PSBwYWQpCisgICAgICAgIHx8IChzZXNzLT5zZW5kX3J0Y3Bfc3JjX2dob3N0ID09IHBhZCkpCisgICAgICByZXR1cm4gc2VzczsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK29uX25ld19zc3JjIChHc3RFbGVtZW50ICogc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjLCBHc3RSdHBCaW5TZXNzaW9uICogc2VzcykKK3sKKyAgZ19zaWduYWxfZW1pdCAoc2Vzcy0+YmluLCBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9PTl9ORVdfU1NSQ10sIDAsCisgICAgICBzZXNzLT5pZCwgc3NyYyk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9zc3JjX2NvbGxpc2lvbiAoR3N0RWxlbWVudCAqIHNlc3Npb24sIGd1aW50MzIgc3NyYywgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3MpCit7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MtPmJpbiwgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfT05fU1NSQ19DT0xMSVNJT05dLCAwLAorICAgICAgc2Vzcy0+aWQsIHNzcmMpOworfQorCitzdGF0aWMgdm9pZAorb25fc3NyY192YWxpZGF0ZWQgKEdzdEVsZW1lbnQgKiBzZXNzaW9uLCBndWludDMyIHNzcmMsIEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzKQoreworICBnX3NpZ25hbF9lbWl0IChzZXNzLT5iaW4sIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX09OX1NTUkNfVkFMSURBVEVEXSwgMCwKKyAgICAgIHNlc3MtPmlkLCBzc3JjKTsKK30KKworc3RhdGljIHZvaWQKK29uX3NzcmNfYWN0aXZlIChHc3RFbGVtZW50ICogc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjLCBHc3RSdHBCaW5TZXNzaW9uICogc2VzcykKK3sKKyAgZ19zaWduYWxfZW1pdCAoc2Vzcy0+YmluLCBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9PTl9TU1JDX0FDVElWRV0sIDAsCisgICAgICBzZXNzLT5pZCwgc3NyYyk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9zc3JjX3NkZXMgKEdzdEVsZW1lbnQgKiBzZXNzaW9uLCBndWludDMyIHNzcmMsIEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzKQoreworICBnX3NpZ25hbF9lbWl0IChzZXNzLT5iaW4sIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX09OX1NTUkNfU0RFU10sIDAsCisgICAgICBzZXNzLT5pZCwgc3NyYyk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9ieWVfc3NyYyAoR3N0RWxlbWVudCAqIHNlc3Npb24sIGd1aW50MzIgc3NyYywgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3MpCit7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MtPmJpbiwgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfT05fQllFX1NTUkNdLCAwLAorICAgICAgc2Vzcy0+aWQsIHNzcmMpOworfQorCitzdGF0aWMgdm9pZAorb25fYnllX3RpbWVvdXQgKEdzdEVsZW1lbnQgKiBzZXNzaW9uLCBndWludDMyIHNzcmMsIEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzKQoreworICBnX3NpZ25hbF9lbWl0IChzZXNzLT5iaW4sIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX09OX0JZRV9USU1FT1VUXSwgMCwKKyAgICAgIHNlc3MtPmlkLCBzc3JjKTsKKworICBpZiAoc2Vzcy0+YmluLT5wcml2LT5hdXRvcmVtb3ZlKQorICAgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAoc2Vzcy0+ZGVtdXgsICJjbGVhci1zc3JjIiwgc3NyYywgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl90aW1lb3V0IChHc3RFbGVtZW50ICogc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjLCBHc3RSdHBCaW5TZXNzaW9uICogc2VzcykKK3sKKyAgZ19zaWduYWxfZW1pdCAoc2Vzcy0+YmluLCBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9PTl9USU1FT1VUXSwgMCwKKyAgICAgIHNlc3MtPmlkLCBzc3JjKTsKKworICBpZiAoc2Vzcy0+YmluLT5wcml2LT5hdXRvcmVtb3ZlKQorICAgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAoc2Vzcy0+ZGVtdXgsICJjbGVhci1zc3JjIiwgc3NyYywgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9zZW5kZXJfdGltZW91dCAoR3N0RWxlbWVudCAqIHNlc3Npb24sIGd1aW50MzIgc3NyYywgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3MpCit7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MtPmJpbiwgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfT05fU0VOREVSX1RJTUVPVVRdLCAwLAorICAgICAgc2Vzcy0+aWQsIHNzcmMpOworfQorCitzdGF0aWMgdm9pZAorb25fbnB0X3N0b3AgKEdzdEVsZW1lbnQgKiBqYnVmLCBHc3RSdHBCaW5TdHJlYW0gKiBzdHJlYW0pCit7CisgIGdfc2lnbmFsX2VtaXQgKHN0cmVhbS0+YmluLCBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9PTl9OUFRfU1RPUF0sIDAsCisgICAgICBzdHJlYW0tPnNlc3Npb24tPmlkLCBzdHJlYW0tPnNzcmMpOworfQorCitzdGF0aWMgdm9pZAorb25fbmV3X3NlbmRlcl9zc3JjIChHc3RFbGVtZW50ICogc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjLCBHc3RSdHBCaW5TZXNzaW9uICogc2VzcykKK3sKKyAgZ19zaWduYWxfZW1pdCAoc2Vzcy0+YmluLCBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9PTl9ORVdfU0VOREVSX1NTUkNdLCAwLAorICAgICAgc2Vzcy0+aWQsIHNzcmMpOworfQorCitzdGF0aWMgdm9pZAorb25fc2VuZGVyX3NzcmNfYWN0aXZlIChHc3RFbGVtZW50ICogc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjLAorICAgIEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzKQoreworICBnX3NpZ25hbF9lbWl0IChzZXNzLT5iaW4sIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX09OX1NFTkRFUl9TU1JDX0FDVElWRV0sCisgICAgICAwLCBzZXNzLT5pZCwgc3NyYyk7Cit9CisKKy8qIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIFNFU1NJT04gbG9jayAqLworc3RhdGljIEdzdFJ0cEJpblN0cmVhbSAqCitmaW5kX3N0cmVhbV9ieV9zc3JjIChHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjKQoreworICBHU0xpc3QgKndhbGs7CisKKyAgZm9yICh3YWxrID0gc2Vzc2lvbi0+c3RyZWFtczsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RSdHBCaW5TdHJlYW0gKnN0cmVhbSA9IChHc3RSdHBCaW5TdHJlYW0gKikgd2Fsay0+ZGF0YTsKKworICAgIGlmIChzdHJlYW0tPnNzcmMgPT0gc3NyYykKKyAgICAgIHJldHVybiBzdHJlYW07CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitzc3JjX2RlbXV4X3BhZF9yZW1vdmVkIChHc3RFbGVtZW50ICogZWxlbWVudCwgZ3VpbnQgc3NyYywgR3N0UGFkICogcGFkLAorICAgIEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzaW9uKQoreworICBHc3RSdHBCaW5TdHJlYW0gKnN0cmVhbSA9IE5VTEw7CisgIEdzdFJ0cEJpbiAqcnRwYmluOworCisgIHJ0cGJpbiA9IHNlc3Npb24tPmJpbjsKKworICBHU1RfUlRQX0JJTl9MT0NLIChydHBiaW4pOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChzZXNzaW9uKTsKKyAgaWYgKChzdHJlYW0gPSBmaW5kX3N0cmVhbV9ieV9zc3JjIChzZXNzaW9uLCBzc3JjKSkpCisgICAgc2Vzc2lvbi0+c3RyZWFtcyA9IGdfc2xpc3RfcmVtb3ZlIChzZXNzaW9uLT5zdHJlYW1zLCBzdHJlYW0pOworICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzaW9uKTsKKworICBpZiAoc3RyZWFtKQorICAgIGZyZWVfc3RyZWFtIChzdHJlYW0sIHJ0cGJpbik7CisKKyAgR1NUX1JUUF9CSU5fVU5MT0NLIChydHBiaW4pOworfQorCitzdGF0aWMgdm9pZAorbmV3X2J1bmRsZWRfc3NyY19wYWRfZm91bmQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBndWludCBzc3JjLCBHc3RQYWQgKiBwYWQsCisgICAgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24pCit7CisgIEdWYWx1ZSByZXN1bHQgPSBHX1ZBTFVFX0lOSVQ7CisgIEdWYWx1ZSBwYXJhbXNbMl0gPSB7IEdfVkFMVUVfSU5JVCwgR19WQUxVRV9JTklUIH07CisgIGd1aW50IHNlc3Npb25faWQgPSAwOworICBHc3RSdHBCaW5TZXNzaW9uICp0YXJnZXRfc2Vzc2lvbiA9IE5VTEw7CisgIEdzdFJ0cEJpbiAqcnRwYmluID0gc2Vzc2lvbi0+YmluOworICBnY2hhciAqbmFtZTsKKyAgR3N0UGFkICpzcmNfcGFkOworICBHc3RQYWQgKnJlY3ZfcnRwX3NpbmsgPSBOVUxMOworICBHc3RQYWQgKnJlY3ZfcnRjcF9zaW5rID0gTlVMTDsKKyAgR3N0UGFkTGlua1JldHVybiByZXQ7CisKKyAgR1NUX1JUUF9CSU5fRFlOX0xPQ0sgKHJ0cGJpbik7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgIm5ldyBidW5kbGVkIFNTUkMgcGFkICUwOHgsICVzOiVzIiwgc3NyYywKKyAgICAgIEdTVF9ERUJVR19QQURfTkFNRSAocGFkKSk7CisKKyAgZ192YWx1ZV9pbml0ICgmcmVzdWx0LCBHX1RZUEVfVUlOVCk7CisgIGdfdmFsdWVfaW5pdCAoJnBhcmFtc1swXSwgR1NUX1RZUEVfRUxFTUVOVCk7CisgIGdfdmFsdWVfc2V0X29iamVjdCAoJnBhcmFtc1swXSwgcnRwYmluKTsKKyAgZ192YWx1ZV9pbml0ICgmcGFyYW1zWzFdLCBHX1RZUEVfVUlOVCk7CisgIGdfdmFsdWVfc2V0X3VpbnQgKCZwYXJhbXNbMV0sIHNzcmMpOworCisgIGdfc2lnbmFsX2VtaXR2IChwYXJhbXMsCisgICAgICBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9PTl9CVU5ETEVEX1NTUkNdLCAwLCAmcmVzdWx0KTsKKyAgZ192YWx1ZV91bnNldCAoJnBhcmFtc1swXSk7CisKKyAgc2Vzc2lvbl9pZCA9IGdfdmFsdWVfZ2V0X3VpbnQgKCZyZXN1bHQpOworICBpZiAoc2Vzc2lvbl9pZCA9PSAwKSB7CisgICAgdGFyZ2V0X3Nlc3Npb24gPSBzZXNzaW9uOworICB9IGVsc2UgeworICAgIHRhcmdldF9zZXNzaW9uID0gZmluZF9zZXNzaW9uX2J5X2lkIChydHBiaW4sIChnaW50KSBzZXNzaW9uX2lkKTsKKyAgICBpZiAoIXRhcmdldF9zZXNzaW9uKSB7CisgICAgICB0YXJnZXRfc2Vzc2lvbiA9IGNyZWF0ZV9zZXNzaW9uIChydHBiaW4sIHNlc3Npb25faWQpOworICAgIH0KKyAgICBpZiAoIXRhcmdldF9zZXNzaW9uKSB7CisgICAgICAvKiBjcmVhdGVfc2Vzc2lvbigpIHdhcm5lZCBhbHJlYWR5ICovCisgICAgICBHU1RfUlRQX0JJTl9EWU5fVU5MT0NLIChydHBiaW4pOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghdGFyZ2V0X3Nlc3Npb24tPnJlY3ZfcnRwX3NpbmspIHsKKyAgICAgIHJlY3ZfcnRwX3NpbmsgPSBjb21wbGV0ZV9zZXNzaW9uX3NpbmsgKHJ0cGJpbiwgdGFyZ2V0X3Nlc3Npb24sIEZBTFNFKTsKKyAgICB9CisKKyAgICBpZiAoIXRhcmdldF9zZXNzaW9uLT5yZWN2X3J0cF9zcmMpCisgICAgICBjb21wbGV0ZV9zZXNzaW9uX3JlY2VpdmVyIChydHBiaW4sIHRhcmdldF9zZXNzaW9uLCBzZXNzaW9uX2lkKTsKKworICAgIGlmICghdGFyZ2V0X3Nlc3Npb24tPnJlY3ZfcnRjcF9zaW5rKSB7CisgICAgICByZWN2X3J0Y3Bfc2luayA9CisgICAgICAgICAgY29tcGxldGVfc2Vzc2lvbl9ydGNwIChydHBiaW4sIHRhcmdldF9zZXNzaW9uLCBzZXNzaW9uX2lkLCBGQUxTRSk7CisgICAgfQorICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwYmluLCAiQXNzaWduaW5nIGJ1bmRsZWQgc3NyYyAldSB0byBzZXNzaW9uICV1Iiwgc3NyYywKKyAgICAgIHNlc3Npb25faWQpOworCisgIGlmICghcmVjdl9ydHBfc2luaykgeworICAgIHJlY3ZfcnRwX3NpbmsgPQorICAgICAgICBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHRhcmdldF9zZXNzaW9uLT5ydHBfZnVubmVsLCAic2lua18ldSIpOworICB9CisKKyAgaWYgKCFyZWN2X3J0Y3Bfc2luaykgeworICAgIHJlY3ZfcnRjcF9zaW5rID0KKyAgICAgICAgZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkICh0YXJnZXRfc2Vzc2lvbi0+cnRjcF9mdW5uZWwsICJzaW5rXyV1Iik7CisgIH0KKworICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgic3JjXyV1Iiwgc3NyYyk7CisgIHNyY19wYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoZWxlbWVudCwgbmFtZSk7CisgIHJldCA9IGdzdF9wYWRfbGluayAoc3JjX3BhZCwgcmVjdl9ydHBfc2luayk7CisgIGdfZnJlZSAobmFtZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY19wYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChyZWN2X3J0cF9zaW5rKTsKKyAgaWYgKHJldCAhPSBHU1RfUEFEX0xJTktfT0spIHsKKyAgICBnX3dhcm5pbmcKKyAgICAgICAgKCJydHBiaW46IGZhaWxlZCB0byBsaW5rIGJ1bmRsZSBkZW11eGVyIHRvIHJlY2VpdmUgcnRwIGZ1bm5lbCBmb3Igc2Vzc2lvbiAldSIsCisgICAgICAgIHNlc3Npb25faWQpOworICB9CisKKyAgbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInJ0Y3Bfc3JjXyV1Iiwgc3NyYyk7CisgIHNyY19wYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoZWxlbWVudCwgbmFtZSk7CisgIGdzdF9wYWRfbGluayAoc3JjX3BhZCwgcmVjdl9ydGNwX3NpbmspOworICBnX2ZyZWUgKG5hbWUpOworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNfcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocmVjdl9ydGNwX3NpbmspOworICBpZiAocmV0ICE9IEdTVF9QQURfTElOS19PSykgeworICAgIGdfd2FybmluZworICAgICAgICAoInJ0cGJpbjogZmFpbGVkIHRvIGxpbmsgYnVuZGxlIGRlbXV4ZXIgdG8gcmVjZWl2ZSBydGNwIHNpbmsgcGFkIGZvciBzZXNzaW9uICV1IiwKKyAgICAgICAgc2Vzc2lvbl9pZCk7CisgIH0KKworICBHU1RfUlRQX0JJTl9EWU5fVU5MT0NLIChydHBiaW4pOworfQorCisvKiBjcmVhdGUgYSBzZXNzaW9uIHdpdGggdGhlIGdpdmVuIGlkLiAgTXVzdCBiZSBjYWxsZWQgd2l0aCBSVFBfQklOX0xPQ0sgKi8KK3N0YXRpYyBHc3RSdHBCaW5TZXNzaW9uICoKK2NyZWF0ZV9zZXNzaW9uIChHc3RSdHBCaW4gKiBydHBiaW4sIGdpbnQgaWQpCit7CisgIEdzdFJ0cEJpblNlc3Npb24gKnNlc3M7CisgIEdzdEVsZW1lbnQgKnNlc3Npb24sICpkZW11eDsKKyAgR3N0U3RhdGUgdGFyZ2V0OworCisgIGlmICghKHNlc3Npb24gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBzZXNzaW9uIiwgTlVMTCkpKQorICAgIGdvdG8gbm9fc2Vzc2lvbjsKKworICBpZiAoIShkZW11eCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cHNzcmNkZW11eCIsIE5VTEwpKSkKKyAgICBnb3RvIG5vX2RlbXV4OworCisgIHNlc3MgPSBnX25ldzAgKEdzdFJ0cEJpblNlc3Npb24sIDEpOworICBnX211dGV4X2luaXQgKCZzZXNzLT5sb2NrKTsKKyAgc2Vzcy0+aWQgPSBpZDsKKyAgc2Vzcy0+YmluID0gcnRwYmluOworICBzZXNzLT5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgc2Vzcy0+ZGVtdXggPSBkZW11eDsKKworICBzZXNzLT5ydHBfZnVubmVsID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZnVubmVsIiwgTlVMTCk7CisgIHNlc3MtPnJ0Y3BfZnVubmVsID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZnVubmVsIiwgTlVMTCk7CisKKyAgc2Vzcy0+cHRtYXAgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9jYXBzX3VucmVmKTsKKyAgcnRwYmluLT5zZXNzaW9ucyA9IGdfc2xpc3RfcHJlcGVuZCAocnRwYmluLT5zZXNzaW9ucywgc2Vzcyk7CisKKyAgLyogY29uZmlndXJlIFNERVMgaXRlbXMgKi8KKyAgR1NUX09CSkVDVF9MT0NLIChydHBiaW4pOworICBnX29iamVjdF9zZXQgKHNlc3Npb24sICJzZGVzIiwgcnRwYmluLT5zZGVzLCAicnRwLXByb2ZpbGUiLAorICAgICAgcnRwYmluLT5ydHBfcHJvZmlsZSwgInJ0Y3Atc3luYy1zZW5kLXRpbWUiLCBydHBiaW4tPnJ0Y3Bfc3luY19zZW5kX3RpbWUsCisgICAgICBOVUxMKTsKKyAgaWYgKHJ0cGJpbi0+dXNlX3BpcGVsaW5lX2Nsb2NrKQorICAgIGdfb2JqZWN0X3NldCAoc2Vzc2lvbiwgInVzZS1waXBlbGluZS1jbG9jayIsIHJ0cGJpbi0+dXNlX3BpcGVsaW5lX2Nsb2NrLAorICAgICAgICBOVUxMKTsKKyAgZWxzZQorICAgIGdfb2JqZWN0X3NldCAoc2Vzc2lvbiwgIm50cC10aW1lLXNvdXJjZSIsIHJ0cGJpbi0+bnRwX3RpbWVfc291cmNlLCBOVUxMKTsKKworICBnX29iamVjdF9zZXQgKHNlc3Npb24sICJtYXgtZHJvcG91dC10aW1lIiwgcnRwYmluLT5tYXhfZHJvcG91dF90aW1lLAorICAgICAgIm1heC1taXNvcmRlci10aW1lIiwgcnRwYmluLT5tYXhfbWlzb3JkZXJfdGltZSwgTlVMTCk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHBiaW4pOworCisgIC8qIHByb3ZpZGUgY2xvY2tfcmF0ZSB0byB0aGUgc2Vzc2lvbiBtYW5hZ2VyIHdoZW4gbmVlZGVkICovCisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNlc3Npb24sICJyZXF1ZXN0LXB0LW1hcCIsCisgICAgICAoR0NhbGxiYWNrKSBwdF9tYXBfcmVxdWVzdGVkLCBzZXNzKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChzZXNzLT5zZXNzaW9uLCAib24tbmV3LXNzcmMiLAorICAgICAgKEdDYWxsYmFjaykgb25fbmV3X3NzcmMsIHNlc3MpOworICBnX3NpZ25hbF9jb25uZWN0IChzZXNzLT5zZXNzaW9uLCAib24tc3NyYy1jb2xsaXNpb24iLAorICAgICAgKEdDYWxsYmFjaykgb25fc3NyY19jb2xsaXNpb24sIHNlc3MpOworICBnX3NpZ25hbF9jb25uZWN0IChzZXNzLT5zZXNzaW9uLCAib24tc3NyYy12YWxpZGF0ZWQiLAorICAgICAgKEdDYWxsYmFjaykgb25fc3NyY192YWxpZGF0ZWQsIHNlc3MpOworICBnX3NpZ25hbF9jb25uZWN0IChzZXNzLT5zZXNzaW9uLCAib24tc3NyYy1hY3RpdmUiLAorICAgICAgKEdDYWxsYmFjaykgb25fc3NyY19hY3RpdmUsIHNlc3MpOworICBnX3NpZ25hbF9jb25uZWN0IChzZXNzLT5zZXNzaW9uLCAib24tc3NyYy1zZGVzIiwKKyAgICAgIChHQ2FsbGJhY2spIG9uX3NzcmNfc2Rlcywgc2Vzcyk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNlc3MtPnNlc3Npb24sICJvbi1ieWUtc3NyYyIsCisgICAgICAoR0NhbGxiYWNrKSBvbl9ieWVfc3NyYywgc2Vzcyk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNlc3MtPnNlc3Npb24sICJvbi1ieWUtdGltZW91dCIsCisgICAgICAoR0NhbGxiYWNrKSBvbl9ieWVfdGltZW91dCwgc2Vzcyk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNlc3MtPnNlc3Npb24sICJvbi10aW1lb3V0IiwgKEdDYWxsYmFjaykgb25fdGltZW91dCwgc2Vzcyk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNlc3MtPnNlc3Npb24sICJvbi1zZW5kZXItdGltZW91dCIsCisgICAgICAoR0NhbGxiYWNrKSBvbl9zZW5kZXJfdGltZW91dCwgc2Vzcyk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNlc3MtPnNlc3Npb24sICJvbi1uZXctc2VuZGVyLXNzcmMiLAorICAgICAgKEdDYWxsYmFjaykgb25fbmV3X3NlbmRlcl9zc3JjLCBzZXNzKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoc2Vzcy0+c2Vzc2lvbiwgIm9uLXNlbmRlci1zc3JjLWFjdGl2ZSIsCisgICAgICAoR0NhbGxiYWNrKSBvbl9zZW5kZXJfc3NyY19hY3RpdmUsIHNlc3MpOworCisgIGdzdF9iaW5fYWRkIChHU1RfQklOX0NBU1QgKHJ0cGJpbiksIHNlc3Npb24pOworICBnc3RfYmluX2FkZCAoR1NUX0JJTl9DQVNUIChydHBiaW4pLCBkZW11eCk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOX0NBU1QgKHJ0cGJpbiksIHNlc3MtPnJ0cF9mdW5uZWwpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTl9DQVNUIChydHBiaW4pLCBzZXNzLT5ydGNwX2Z1bm5lbCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChydHBiaW4pOworICB0YXJnZXQgPSBHU1RfU1RBVEVfVEFSR0VUIChydHBiaW4pOworICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwYmluKTsKKworICAvKiBjaGFuZ2Ugc3RhdGUgb25seSB0byB3aGF0J3MgbmVlZGVkICovCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZGVtdXgsIHRhcmdldCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc2Vzc2lvbiwgdGFyZ2V0KTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzZXNzLT5ydHBfZnVubmVsLCB0YXJnZXQpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNlc3MtPnJ0Y3BfZnVubmVsLCB0YXJnZXQpOworCisgIHJldHVybiBzZXNzOworCisgIC8qIEVSUk9SUyAqLworbm9fc2Vzc2lvbjoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGJpbjogY291bGQgbm90IGNyZWF0ZSBydHBzZXNzaW9uIGVsZW1lbnQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorbm9fZGVtdXg6CisgIHsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzZXNzaW9uKTsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGNvdWxkIG5vdCBjcmVhdGUgcnRwc3NyY2RlbXV4IGVsZW1lbnQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2Jpbl9tYW5hZ2VfZWxlbWVudCAoR3N0UnRwQmluICogYmluLCBHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgR3N0UnRwQmluUHJpdmF0ZSAqcHJpdiA9IGJpbi0+cHJpdjsKKworICBpZiAoZ19saXN0X2ZpbmQgKHByaXYtPmVsZW1lbnRzLCBlbGVtZW50KSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgInJlcXVlc3RlZCBlbGVtZW50ICVwIGFscmVhZHkgaW4gYmluIiwgZWxlbWVudCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAiYWRkaW5nIHJlcXVlc3RlZCBlbGVtZW50ICVwIiwgZWxlbWVudCk7CisKKyAgICBpZiAoZ19vYmplY3RfaXNfZmxvYXRpbmcgKGVsZW1lbnQpKQorICAgICAgZWxlbWVudCA9IGdzdF9vYmplY3RfcmVmX3NpbmsgKGVsZW1lbnQpOworCisgICAgaWYgKCFnc3RfYmluX2FkZCAoR1NUX0JJTl9DQVNUIChiaW4pLCBlbGVtZW50KSkKKyAgICAgIGdvdG8gYWRkX2ZhaWxlZDsKKyAgICBpZiAoIWdzdF9lbGVtZW50X3N5bmNfc3RhdGVfd2l0aF9wYXJlbnQgKGVsZW1lbnQpKQorICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChiaW4sICJ1bmFibGUgdG8gc3luYyBlbGVtZW50IHN0YXRlIHdpdGggcnRwYmluIik7CisgIH0KKyAgLyogd2UgYWRkIHRoZSBlbGVtZW50IG11bHRpcGxlIHRpbWVzLCBlYWNoIHdlIG5lZWQgYW4gZXF1YWwgbnVtYmVyIG9mCisgICAqIHJlbW92ZXMgdG8gcmVhbGx5IHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBiaW4gKi8KKyAgcHJpdi0+ZWxlbWVudHMgPSBnX2xpc3RfcHJlcGVuZCAocHJpdi0+ZWxlbWVudHMsIGVsZW1lbnQpOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworYWRkX2ZhaWxlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYmluLCAidW5hYmxlIHRvIGFkZCBlbGVtZW50Iik7CisgICAgZ3N0X29iamVjdF91bnJlZiAoZWxlbWVudCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfYmluX2VsZW1lbnQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RSdHBCaW4gKiBiaW4pCit7CisgIEdzdFJ0cEJpblByaXZhdGUgKnByaXYgPSBiaW4tPnByaXY7CisgIEdMaXN0ICpmaW5kOworCisgIGZpbmQgPSBnX2xpc3RfZmluZCAocHJpdi0+ZWxlbWVudHMsIGVsZW1lbnQpOworICBpZiAoZmluZCkgeworICAgIHByaXYtPmVsZW1lbnRzID0gZ19saXN0X2RlbGV0ZV9saW5rIChwcml2LT5lbGVtZW50cywgZmluZCk7CisKKyAgICBpZiAoIWdfbGlzdF9maW5kIChwcml2LT5lbGVtZW50cywgZWxlbWVudCkpIHsKKyAgICAgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKGVsZW1lbnQsIFRSVUUpOworICAgICAgZ3N0X2Jpbl9yZW1vdmUgKEdTVF9CSU5fQ0FTVCAoYmluKSwgZWxlbWVudCk7CisgICAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsIEdTVF9TVEFURV9OVUxMKTsKKyAgICB9CisKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChlbGVtZW50KTsKKyAgfQorfQorCisvKiBjYWxsZWQgd2l0aCBSVFBfQklOX0xPQ0sgKi8KK3N0YXRpYyB2b2lkCitmcmVlX3Nlc3Npb24gKEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzLCBHc3RSdHBCaW4gKiBiaW4pCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgImZyZWVpbmcgc2Vzc2lvbiAlcCIsIHNlc3MpOworCisgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKHNlc3MtPmRlbXV4LCBUUlVFKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2xvY2tlZF9zdGF0ZSAoc2Vzcy0+c2Vzc2lvbiwgVFJVRSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzZXNzLT5kZW11eCwgR1NUX1NUQVRFX05VTEwpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNlc3MtPnNlc3Npb24sIEdTVF9TVEFURV9OVUxMKTsKKworICByZW1vdmVfcmVjdl9ydHAgKGJpbiwgc2Vzcyk7CisgIHJlbW92ZV9yZWN2X3J0Y3AgKGJpbiwgc2Vzcyk7CisgIHJlbW92ZV9zZW5kX3J0cCAoYmluLCBzZXNzKTsKKyAgcmVtb3ZlX3J0Y3AgKGJpbiwgc2Vzcyk7CisKKyAgZ3N0X2Jpbl9yZW1vdmUgKEdTVF9CSU5fQ0FTVCAoYmluKSwgc2Vzcy0+c2Vzc2lvbik7CisgIGdzdF9iaW5fcmVtb3ZlIChHU1RfQklOX0NBU1QgKGJpbiksIHNlc3MtPmRlbXV4KTsKKworICBnX3NsaXN0X2ZvcmVhY2ggKHNlc3MtPmVsZW1lbnRzLCAoR0Z1bmMpIHJlbW92ZV9iaW5fZWxlbWVudCwgYmluKTsKKyAgZ19zbGlzdF9mcmVlIChzZXNzLT5lbGVtZW50cyk7CisKKyAgZ19zbGlzdF9mb3JlYWNoIChzZXNzLT5zdHJlYW1zLCAoR0Z1bmMpIGZyZWVfc3RyZWFtLCBiaW4pOworICBnX3NsaXN0X2ZyZWUgKHNlc3MtPnN0cmVhbXMpOworCisgIGdfbXV0ZXhfY2xlYXIgKCZzZXNzLT5sb2NrKTsKKyAgZ19oYXNoX3RhYmxlX2Rlc3Ryb3kgKHNlc3MtPnB0bWFwKTsKKworICBnX2ZyZWUgKHNlc3MpOworfQorCisvKiBnZXQgdGhlIHBheWxvYWQgdHlwZSBjYXBzIGZvciB0aGUgc3BlY2lmaWMgcGF5bG9hZCBAcHQgaW4gQHNlc3Npb24gKi8KK3N0YXRpYyBHc3RDYXBzICoKK2dldF9wdF9tYXAgKEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzaW9uLCBndWludCBwdCkKK3sKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisgIEdzdFJ0cEJpbiAqYmluOworICBHVmFsdWUgcmV0ID0geyAwIH07CisgIEdWYWx1ZSBhcmdzWzNdID0geyB7MH0sIHswfSwgezB9IH07CisKKyAgR1NUX0RFQlVHICgic2VhcmNoaW5nIHB0ICV1IGluIGNhY2hlIiwgcHQpOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChzZXNzaW9uKTsKKworICAvKiBmaXJzdCBsb29rIGluIHRoZSBjYWNoZSAqLworICBjYXBzID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAoc2Vzc2lvbi0+cHRtYXAsIEdJTlRfVE9fUE9JTlRFUiAocHQpKTsKKyAgaWYgKGNhcHMpIHsKKyAgICBnc3RfY2Fwc19yZWYgKGNhcHMpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGJpbiA9IHNlc3Npb24tPmJpbjsKKworICBHU1RfREVCVUcgKCJlbWl0aW5nIHNpZ25hbCBmb3IgcHQgJXUgaW4gc2Vzc2lvbiAldSIsIHB0LCBzZXNzaW9uLT5pZCk7CisKKyAgLyogbm90IGluIGNhY2hlLCBzZW5kIHNpZ25hbCB0byByZXF1ZXN0IGNhcHMgKi8KKyAgZ192YWx1ZV9pbml0ICgmYXJnc1swXSwgR1NUX1RZUEVfRUxFTUVOVCk7CisgIGdfdmFsdWVfc2V0X29iamVjdCAoJmFyZ3NbMF0sIGJpbik7CisgIGdfdmFsdWVfaW5pdCAoJmFyZ3NbMV0sIEdfVFlQRV9VSU5UKTsKKyAgZ192YWx1ZV9zZXRfdWludCAoJmFyZ3NbMV0sIHNlc3Npb24tPmlkKTsKKyAgZ192YWx1ZV9pbml0ICgmYXJnc1syXSwgR19UWVBFX1VJTlQpOworICBnX3ZhbHVlX3NldF91aW50ICgmYXJnc1syXSwgcHQpOworCisgIGdfdmFsdWVfaW5pdCAoJnJldCwgR1NUX1RZUEVfQ0FQUyk7CisgIGdfdmFsdWVfc2V0X2JveGVkICgmcmV0LCBOVUxMKTsKKworICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzaW9uKTsKKworICBnX3NpZ25hbF9lbWl0diAoYXJncywgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfUkVRVUVTVF9QVF9NQVBdLCAwLCAmcmV0KTsKKworICBHU1RfUlRQX1NFU1NJT05fTE9DSyAoc2Vzc2lvbik7CisKKyAgZ192YWx1ZV91bnNldCAoJmFyZ3NbMF0pOworICBnX3ZhbHVlX3Vuc2V0ICgmYXJnc1sxXSk7CisgIGdfdmFsdWVfdW5zZXQgKCZhcmdzWzJdKTsKKworICAvKiBsb29rIGluIHRoZSBjYWNoZSBhZ2FpbiBiZWNhdXNlIHdlIGxldCB0aGUgbG9jayBnbyAqLworICBjYXBzID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAoc2Vzc2lvbi0+cHRtYXAsIEdJTlRfVE9fUE9JTlRFUiAocHQpKTsKKyAgaWYgKGNhcHMpIHsKKyAgICBnc3RfY2Fwc19yZWYgKGNhcHMpOworICAgIGdfdmFsdWVfdW5zZXQgKCZyZXQpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGNhcHMgPSAoR3N0Q2FwcyAqKSBnX3ZhbHVlX2R1cF9ib3hlZCAoJnJldCk7CisgIGdfdmFsdWVfdW5zZXQgKCZyZXQpOworICBpZiAoIWNhcHMpCisgICAgZ290byBub19jYXBzOworCisgIEdTVF9ERUJVRyAoImNhY2hpbmcgcHQgJXUgYXMgJSIgR1NUX1BUUl9GT1JNQVQsIHB0LCBjYXBzKTsKKworICAvKiBzdG9yZSBpbiBjYWNoZSwgdGFrZSBhZGRpdGlvbmFsIHJlZiAqLworICBnX2hhc2hfdGFibGVfaW5zZXJ0IChzZXNzaW9uLT5wdG1hcCwgR0lOVF9UT19QT0lOVEVSIChwdCksCisgICAgICBnc3RfY2Fwc19yZWYgKGNhcHMpKTsKKworZG9uZToKKyAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzc2lvbik7CisKKyAgcmV0dXJuIGNhcHM7CisKKyAgLyogRVJST1JTICovCitub19jYXBzOgorICB7CisgICAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzc2lvbik7CisgICAgR1NUX0RFQlVHICgibm8gcHQgbWFwIGNvdWxkIGJlIG9idGFpbmVkIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCityZXR1cm5fdHJ1ZSAoZ3BvaW50ZXIga2V5LCBncG9pbnRlciB2YWx1ZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfYmluX3Jlc2V0X3N5bmMgKEdzdFJ0cEJpbiAqIHJ0cGJpbikKK3sKKyAgR1NMaXN0ICpjbGllbnRzLCAqc3RyZWFtczsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJSZXNldCBzeW5jIG9uIGFsbCBjbGllbnRzIik7CisKKyAgR1NUX1JUUF9CSU5fTE9DSyAocnRwYmluKTsKKyAgZm9yIChjbGllbnRzID0gcnRwYmluLT5jbGllbnRzOyBjbGllbnRzOyBjbGllbnRzID0gZ19zbGlzdF9uZXh0IChjbGllbnRzKSkgeworICAgIEdzdFJ0cEJpbkNsaWVudCAqY2xpZW50ID0gKEdzdFJ0cEJpbkNsaWVudCAqKSBjbGllbnRzLT5kYXRhOworCisgICAgLyogcmVzZXQgc3luYyBvbiBhbGwgc3RyZWFtcyBmb3IgdGhpcyBjbGllbnQgKi8KKyAgICBmb3IgKHN0cmVhbXMgPSBjbGllbnQtPnN0cmVhbXM7IHN0cmVhbXM7IHN0cmVhbXMgPSBnX3NsaXN0X25leHQgKHN0cmVhbXMpKSB7CisgICAgICBHc3RSdHBCaW5TdHJlYW0gKnN0cmVhbSA9IChHc3RSdHBCaW5TdHJlYW0gKikgc3RyZWFtcy0+ZGF0YTsKKworICAgICAgLyogbWFrZSB1c2UgcmVxdWlyZSBhIG5ldyBTUiBwYWNrZXQgZm9yIHRoaXMgc3RyZWFtIGJlZm9yZSB3ZSBhdHRlbXB0IG5ldworICAgICAgICogbGlwLXN5bmMgKi8KKyAgICAgIHN0cmVhbS0+aGF2ZV9zeW5jID0gRkFMU0U7CisgICAgICBzdHJlYW0tPnJ0X2RlbHRhID0gMDsKKyAgICAgIHN0cmVhbS0+cnRwX2RlbHRhID0gMDsKKyAgICAgIHN0cmVhbS0+Y2xvY2tfYmFzZSA9IC0xMDAgKiBHU1RfU0VDT05EOworICAgIH0KKyAgfQorICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2Jpbl9jbGVhcl9wdF9tYXAgKEdzdFJ0cEJpbiAqIGJpbikKK3sKKyAgR1NMaXN0ICpzZXNzaW9ucywgKnN0cmVhbXM7CisKKyAgR1NUX1JUUF9CSU5fTE9DSyAoYmluKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAiY2xlYXJpbmcgcHQgbWFwIik7CisgIGZvciAoc2Vzc2lvbnMgPSBiaW4tPnNlc3Npb25zOyBzZXNzaW9uczsgc2Vzc2lvbnMgPSBnX3NsaXN0X25leHQgKHNlc3Npb25zKSkgeworICAgIEdzdFJ0cEJpblNlc3Npb24gKnNlc3Npb24gPSAoR3N0UnRwQmluU2Vzc2lvbiAqKSBzZXNzaW9ucy0+ZGF0YTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgImNsZWFyaW5nIHNlc3Npb24gJXAiLCBzZXNzaW9uKTsKKyAgICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHNlc3Npb24tPnNlc3Npb24sICJjbGVhci1wdC1tYXAiLCBOVUxMKTsKKworICAgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChzZXNzaW9uKTsKKyAgICBnX2hhc2hfdGFibGVfZm9yZWFjaF9yZW1vdmUgKHNlc3Npb24tPnB0bWFwLCByZXR1cm5fdHJ1ZSwgTlVMTCk7CisKKyAgICBmb3IgKHN0cmVhbXMgPSBzZXNzaW9uLT5zdHJlYW1zOyBzdHJlYW1zOyBzdHJlYW1zID0gZ19zbGlzdF9uZXh0IChzdHJlYW1zKSkgeworICAgICAgR3N0UnRwQmluU3RyZWFtICpzdHJlYW0gPSAoR3N0UnRwQmluU3RyZWFtICopIHN0cmVhbXMtPmRhdGE7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgImNsZWFyaW5nIHN0cmVhbSAlcCIsIHN0cmVhbSk7CisgICAgICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHN0cmVhbS0+YnVmZmVyLCAiY2xlYXItcHQtbWFwIiwgTlVMTCk7CisgICAgICBpZiAoc3RyZWFtLT5kZW11eCkKKyAgICAgICAgZ19zaWduYWxfZW1pdF9ieV9uYW1lIChzdHJlYW0tPmRlbXV4LCAiY2xlYXItcHQtbWFwIiwgTlVMTCk7CisgICAgfQorICAgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3Npb24pOworICB9CisgIEdTVF9SVFBfQklOX1VOTE9DSyAoYmluKTsKKworICAvKiByZXNldCBzeW5jIHRvbyAqLworICBnc3RfcnRwX2Jpbl9yZXNldF9zeW5jIChiaW4pOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCitnc3RfcnRwX2Jpbl9nZXRfc2Vzc2lvbiAoR3N0UnRwQmluICogYmluLCBndWludCBzZXNzaW9uX2lkKQoreworICBHc3RSdHBCaW5TZXNzaW9uICpzZXNzaW9uOworICBHc3RFbGVtZW50ICpyZXQgPSBOVUxMOworCisgIEdTVF9SVFBfQklOX0xPQ0sgKGJpbik7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgInJldHJpZXZpbmcgR3N0UnRwU2Vzc2lvbiwgaW5kZXg6ICV1Iiwgc2Vzc2lvbl9pZCk7CisgIHNlc3Npb24gPSBmaW5kX3Nlc3Npb25fYnlfaWQgKGJpbiwgKGdpbnQpIHNlc3Npb25faWQpOworICBpZiAoc2Vzc2lvbikgeworICAgIHJldCA9IGdzdF9vYmplY3RfcmVmIChzZXNzaW9uLT5zZXNzaW9uKTsKKyAgfQorICBHU1RfUlRQX0JJTl9VTkxPQ0sgKGJpbik7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIFJUUFNlc3Npb24gKgorZ3N0X3J0cF9iaW5fZ2V0X2ludGVybmFsX3Nlc3Npb24gKEdzdFJ0cEJpbiAqIGJpbiwgZ3VpbnQgc2Vzc2lvbl9pZCkKK3sKKyAgUlRQU2Vzc2lvbiAqaW50ZXJuYWxfc2Vzc2lvbiA9IE5VTEw7CisgIEdzdFJ0cEJpblNlc3Npb24gKnNlc3Npb247CisKKyAgR1NUX1JUUF9CSU5fTE9DSyAoYmluKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAicmV0cmlldmluZyBpbnRlcm5hbCBSVFBTZXNzaW9uIG9iamVjdCwgaW5kZXg6ICV1IiwKKyAgICAgIHNlc3Npb25faWQpOworICBzZXNzaW9uID0gZmluZF9zZXNzaW9uX2J5X2lkIChiaW4sIChnaW50KSBzZXNzaW9uX2lkKTsKKyAgaWYgKHNlc3Npb24pIHsKKyAgICBnX29iamVjdF9nZXQgKHNlc3Npb24tPnNlc3Npb24sICJpbnRlcm5hbC1zZXNzaW9uIiwgJmludGVybmFsX3Nlc3Npb24sCisgICAgICAgIE5VTEwpOworICB9CisgIEdTVF9SVFBfQklOX1VOTE9DSyAoYmluKTsKKworICByZXR1cm4gaW50ZXJuYWxfc2Vzc2lvbjsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorZ3N0X3J0cF9iaW5fcmVxdWVzdF9lbmNvZGVyIChHc3RSdHBCaW4gKiBiaW4sIGd1aW50IHNlc3Npb25faWQpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgInJldHVybiBOVUxMIGVuY29kZXIiKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK2dzdF9ydHBfYmluX3JlcXVlc3RfZGVjb2RlciAoR3N0UnRwQmluICogYmluLCBndWludCBzZXNzaW9uX2lkKQoreworICBHU1RfREVCVUdfT0JKRUNUIChiaW4sICJyZXR1cm4gTlVMTCBkZWNvZGVyIik7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9iaW5fcHJvcGFnYXRlX3Byb3BlcnR5X3RvX2ppdHRlcmJ1ZmZlciAoR3N0UnRwQmluICogYmluLAorICAgIGNvbnN0IGdjaGFyICogbmFtZSwgY29uc3QgR1ZhbHVlICogdmFsdWUpCit7CisgIEdTTGlzdCAqc2Vzc2lvbnMsICpzdHJlYW1zOworCisgIEdTVF9SVFBfQklOX0xPQ0sgKGJpbik7CisgIGZvciAoc2Vzc2lvbnMgPSBiaW4tPnNlc3Npb25zOyBzZXNzaW9uczsgc2Vzc2lvbnMgPSBnX3NsaXN0X25leHQgKHNlc3Npb25zKSkgeworICAgIEdzdFJ0cEJpblNlc3Npb24gKnNlc3Npb24gPSAoR3N0UnRwQmluU2Vzc2lvbiAqKSBzZXNzaW9ucy0+ZGF0YTsKKworICAgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChzZXNzaW9uKTsKKyAgICBmb3IgKHN0cmVhbXMgPSBzZXNzaW9uLT5zdHJlYW1zOyBzdHJlYW1zOyBzdHJlYW1zID0gZ19zbGlzdF9uZXh0IChzdHJlYW1zKSkgeworICAgICAgR3N0UnRwQmluU3RyZWFtICpzdHJlYW0gPSAoR3N0UnRwQmluU3RyZWFtICopIHN0cmVhbXMtPmRhdGE7CisKKyAgICAgIGdfb2JqZWN0X3NldF9wcm9wZXJ0eSAoR19PQkpFQ1QgKHN0cmVhbS0+YnVmZmVyKSwgbmFtZSwgdmFsdWUpOworICAgIH0KKyAgICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzaW9uKTsKKyAgfQorICBHU1RfUlRQX0JJTl9VTkxPQ0sgKGJpbik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2Jpbl9wcm9wYWdhdGVfcHJvcGVydHlfdG9fc2Vzc2lvbiAoR3N0UnRwQmluICogYmluLAorICAgIGNvbnN0IGdjaGFyICogbmFtZSwgY29uc3QgR1ZhbHVlICogdmFsdWUpCit7CisgIEdTTGlzdCAqc2Vzc2lvbnM7CisKKyAgR1NUX1JUUF9CSU5fTE9DSyAoYmluKTsKKyAgZm9yIChzZXNzaW9ucyA9IGJpbi0+c2Vzc2lvbnM7IHNlc3Npb25zOyBzZXNzaW9ucyA9IGdfc2xpc3RfbmV4dCAoc2Vzc2lvbnMpKSB7CisgICAgR3N0UnRwQmluU2Vzc2lvbiAqc2VzcyA9IChHc3RSdHBCaW5TZXNzaW9uICopIHNlc3Npb25zLT5kYXRhOworCisgICAgZ19vYmplY3Rfc2V0X3Byb3BlcnR5IChHX09CSkVDVCAoc2Vzcy0+c2Vzc2lvbiksIG5hbWUsIHZhbHVlKTsKKyAgfQorICBHU1RfUlRQX0JJTl9VTkxPQ0sgKGJpbik7Cit9CisKKy8qIGdldCBhIGNsaWVudCB3aXRoIHRoZSBnaXZlbiBTREVTIG5hbWUuIE11c3QgYmUgY2FsbGVkIHdpdGggUlRQX0JJTl9MT0NLICovCitzdGF0aWMgR3N0UnRwQmluQ2xpZW50ICoKK2dldF9jbGllbnQgKEdzdFJ0cEJpbiAqIGJpbiwgZ3VpbnQ4IGxlbiwgZ3VpbnQ4ICogZGF0YSwgZ2Jvb2xlYW4gKiBjcmVhdGVkKQoreworICBHc3RSdHBCaW5DbGllbnQgKnJlc3VsdCA9IE5VTEw7CisgIEdTTGlzdCAqd2FsazsKKworICBmb3IgKHdhbGsgPSBiaW4tPmNsaWVudHM7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UnRwQmluQ2xpZW50ICpjbGllbnQgPSAoR3N0UnRwQmluQ2xpZW50ICopIHdhbGstPmRhdGE7CisKKyAgICBpZiAobGVuICE9IGNsaWVudC0+Y25hbWVfbGVuKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoIXN0cm5jbXAgKChnY2hhciAqKSBkYXRhLCBjbGllbnQtPmNuYW1lLCBjbGllbnQtPmNuYW1lX2xlbikpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgImZvdW5kIGV4aXN0aW5nIGNsaWVudCAlcCB3aXRoIENOQU1FICVzIiwgY2xpZW50LAorICAgICAgICAgIGNsaWVudC0+Y25hbWUpOworICAgICAgcmVzdWx0ID0gY2xpZW50OworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLyogbm90aGluZyBmb3VuZCwgY3JlYXRlIG9uZSAqLworICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICByZXN1bHQgPSBnX25ldzAgKEdzdFJ0cEJpbkNsaWVudCwgMSk7CisgICAgcmVzdWx0LT5jbmFtZSA9IGdfc3RybmR1cCAoKGdjaGFyICopIGRhdGEsIGxlbik7CisgICAgcmVzdWx0LT5jbmFtZV9sZW4gPSBsZW47CisgICAgYmluLT5jbGllbnRzID0gZ19zbGlzdF9wcmVwZW5kIChiaW4tPmNsaWVudHMsIHJlc3VsdCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAiY3JlYXRlZCBuZXcgY2xpZW50ICVwIHdpdGggQ05BTUUgJXMiLCByZXN1bHQsCisgICAgICAgIHJlc3VsdC0+Y25hbWUpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2NsaWVudCAoR3N0UnRwQmluQ2xpZW50ICogY2xpZW50LCBHc3RSdHBCaW4gKiBiaW4pCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgImZyZWVpbmcgY2xpZW50ICVwIiwgY2xpZW50KTsKKyAgZ19zbGlzdF9mcmVlIChjbGllbnQtPnN0cmVhbXMpOworICBnX2ZyZWUgKGNsaWVudC0+Y25hbWUpOworICBnX2ZyZWUgKGNsaWVudCk7Cit9CisKK3N0YXRpYyB2b2lkCitnZXRfY3VycmVudF90aW1lcyAoR3N0UnRwQmluICogYmluLCBHc3RDbG9ja1RpbWUgKiBydW5uaW5nX3RpbWUsCisgICAgZ3VpbnQ2NCAqIG50cG5zdGltZSkKK3sKKyAgZ3VpbnQ2NCBudHBucyA9IC0xOworICBHc3RDbG9jayAqY2xvY2s7CisgIEdzdENsb2NrVGltZSBiYXNlX3RpbWUsIHJ0LCBjbG9ja190aW1lOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoYmluKTsKKyAgaWYgKChjbG9jayA9IEdTVF9FTEVNRU5UX0NMT0NLIChiaW4pKSkgeworICAgIGJhc2VfdGltZSA9IEdTVF9FTEVNRU5UX0NBU1QgKGJpbiktPmJhc2VfdGltZTsKKyAgICBnc3Rfb2JqZWN0X3JlZiAoY2xvY2spOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChiaW4pOworCisgICAgLyogZ2V0IGN1cnJlbnQgY2xvY2sgdGltZSBhbmQgY29udmVydCB0byBydW5uaW5nIHRpbWUgKi8KKyAgICBjbG9ja190aW1lID0gZ3N0X2Nsb2NrX2dldF90aW1lIChjbG9jayk7CisgICAgcnQgPSBjbG9ja190aW1lIC0gYmFzZV90aW1lOworCisgICAgaWYgKGJpbi0+dXNlX3BpcGVsaW5lX2Nsb2NrKSB7CisgICAgICBudHBucyA9IHJ0OworICAgICAgLyogYWRkIGNvbnN0YW50IHRvIGNvbnZlcnQgZnJvbSAxOTcwIGJhc2VkIHRpbWUgdG8gMTkwMCBiYXNlZCB0aW1lICovCisgICAgICBudHBucyArPSAoMjIwODk4ODgwMExMICogR1NUX1NFQ09ORCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAoYmluLT5udHBfdGltZV9zb3VyY2UpIHsKKyAgICAgICAgY2FzZSBHU1RfUlRQX05UUF9USU1FX1NPVVJDRV9OVFA6CisgICAgICAgIGNhc2UgR1NUX1JUUF9OVFBfVElNRV9TT1VSQ0VfVU5JWDp7CisgICAgICAgICAgR1RpbWVWYWwgY3VycmVudDsKKworICAgICAgICAgIC8qIGdldCBjdXJyZW50IE5UUCB0aW1lICovCisgICAgICAgICAgZ19nZXRfY3VycmVudF90aW1lICgmY3VycmVudCk7CisgICAgICAgICAgbnRwbnMgPSBHU1RfVElNRVZBTF9UT19USU1FIChjdXJyZW50KTsKKworICAgICAgICAgIC8qIGFkZCBjb25zdGFudCB0byBjb252ZXJ0IGZyb20gMTk3MCBiYXNlZCB0aW1lIHRvIDE5MDAgYmFzZWQgdGltZSAqLworICAgICAgICAgIGlmIChiaW4tPm50cF90aW1lX3NvdXJjZSA9PSBHU1RfUlRQX05UUF9USU1FX1NPVVJDRV9OVFApCisgICAgICAgICAgICBudHBucyArPSAoMjIwODk4ODgwMExMICogR1NUX1NFQ09ORCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBHU1RfUlRQX05UUF9USU1FX1NPVVJDRV9SVU5OSU5HX1RJTUU6CisgICAgICAgICAgbnRwbnMgPSBydDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfUlRQX05UUF9USU1FX1NPVVJDRV9DTE9DS19USU1FOgorICAgICAgICAgIG50cG5zID0gY2xvY2tfdGltZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBudHBucyA9IC0xOyAgICAgICAgICAgLyogRml4IHVuaW5pdGVkIGNvbXBpbGVyIHdhcm5pbmcgKi8KKyAgICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChjbG9jayk7CisgIH0gZWxzZSB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGJpbik7CisgICAgcnQgPSAtMTsKKyAgICBudHBucyA9IC0xOworICB9CisgIGlmIChydW5uaW5nX3RpbWUpCisgICAgKnJ1bm5pbmdfdGltZSA9IHJ0OworICBpZiAobnRwbnN0aW1lKQorICAgICpudHBuc3RpbWUgPSBudHBuczsKK30KKworc3RhdGljIHZvaWQKK3N0cmVhbV9zZXRfdHNfb2Zmc2V0IChHc3RSdHBCaW4gKiBiaW4sIEdzdFJ0cEJpblN0cmVhbSAqIHN0cmVhbSwKKyAgICBnaW50NjQgdHNfb2Zmc2V0LCBnaW50NjQgbWF4X3RzX29mZnNldCwgZ2ludDY0IG1pbl90c19vZmZzZXQsCisgICAgZ2Jvb2xlYW4gYWxsb3dfcG9zaXRpdmVfdHNfb2Zmc2V0KQoreworICBnaW50NjQgcHJldl90c19vZmZzZXQ7CisKKyAgZ19vYmplY3RfZ2V0IChzdHJlYW0tPmJ1ZmZlciwgInRzLW9mZnNldCIsICZwcmV2X3RzX29mZnNldCwgTlVMTCk7CisKKyAgLyogZGVsdGEgY2hhbmdlZCwgc2VlIGhvdyBtdWNoICovCisgIGlmIChwcmV2X3RzX29mZnNldCAhPSB0c19vZmZzZXQpIHsKKyAgICBnaW50NjQgZGlmZjsKKworICAgIGRpZmYgPSBwcmV2X3RzX29mZnNldCAtIHRzX29mZnNldDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwKKyAgICAgICAgInRzLW9mZnNldCAlIiBHX0dJTlQ2NF9GT1JNQVQgIiwgcHJldiAlIiBHX0dJTlQ2NF9GT1JNQVQKKyAgICAgICAgIiwgZGlmZjogJSIgR19HSU5UNjRfRk9STUFULCB0c19vZmZzZXQsIHByZXZfdHNfb2Zmc2V0LCBkaWZmKTsKKworICAgIC8qIGlnbm9yZSBtaW5vciBvZmZzZXRzICovCisgICAgaWYgKEFCUyAoZGlmZikgPCBtaW5fdHNfb2Zmc2V0KSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChiaW4sICJvZmZzZXQgdG9vIHNtYWxsLCBpZ25vcmluZyIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIHNhbml0eSBjaGVjayBvZmZzZXQgKi8KKyAgICBpZiAobWF4X3RzX29mZnNldCA+IDApIHsKKyAgICAgIGlmICh0c19vZmZzZXQgPiAwICYmICFhbGxvd19wb3NpdGl2ZV90c19vZmZzZXQpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLAorICAgICAgICAgICAgIm9mZnNldCBpcyBwb3NpdGl2ZSAoY2xvY2tzIGFyZSBvdXQgb2Ygc3luYyksIGlnbm9yaW5nIik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmIChBQlMgKHRzX29mZnNldCkgPiBtYXhfdHNfb2Zmc2V0KSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgIm9mZnNldCB0b28gbGFyZ2UsIGlnbm9yaW5nIik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnX29iamVjdF9zZXQgKHN0cmVhbS0+YnVmZmVyLCAidHMtb2Zmc2V0IiwgdHNfb2Zmc2V0LCBOVUxMKTsKKyAgfQorICBHU1RfREVCVUdfT0JKRUNUIChiaW4sICJzdHJlYW0gU1NSQyAlMDh4LCBkZWx0YSAlIiBHX0dJTlQ2NF9GT1JNQVQsCisgICAgICBzdHJlYW0tPnNzcmMsIHRzX29mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2Jpbl9zZW5kX3N5bmNfZXZlbnQgKEdzdFJ0cEJpblN0cmVhbSAqIHN0cmVhbSkKK3sKKyAgaWYgKHN0cmVhbS0+YmluLT5zZW5kX3N5bmNfZXZlbnQpIHsKKyAgICBHc3RFdmVudCAqZXZlbnQ7CisgICAgR3N0UGFkICpzcmNwYWQ7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzdHJlYW0tPmJpbiwKKyAgICAgICAgInNlbmRpbmcgR3N0UlRDUFNSUmVjZWl2ZWQgZXZlbnQgZG93bnN0cmVhbSIpOworCisgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9ET1dOU1RSRUFNLAorICAgICAgICBnc3Rfc3RydWN0dXJlX25ld19lbXB0eSAoIkdzdFJUQ1BTUlJlY2VpdmVkIikpOworCisgICAgc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHN0cmVhbS0+YnVmZmVyLCAic3JjIik7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzcmNwYWQsIGV2ZW50KTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworICB9Cit9CisKKy8qIGFzc29jaWF0ZSBhIHN0cmVhbSB0byB0aGUgZ2l2ZW4gQ05BTUUuIFRoaXMgd2lsbCBtYWtlIHN1cmUgYWxsIHN0cmVhbXMgZm9yCisgKiB0aGF0IENOQU1FIGFyZSBzeW5jaHJvbml6ZWQgdG9nZXRoZXIuCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIEdTVF9SVFBfQklOX0xPQ0sgKi8KK3N0YXRpYyB2b2lkCitnc3RfcnRwX2Jpbl9hc3NvY2lhdGUgKEdzdFJ0cEJpbiAqIGJpbiwgR3N0UnRwQmluU3RyZWFtICogc3RyZWFtLCBndWludDggbGVuLAorICAgIGd1aW50OCAqIGRhdGEsIGd1aW50NjQgbnRwdGltZSwgZ3VpbnQ2NCBsYXN0X2V4dHJ0cHRpbWUsCisgICAgZ3VpbnQ2NCBiYXNlX3J0cHRpbWUsIGd1aW50NjQgYmFzZV90aW1lLCBndWludCBjbG9ja19yYXRlLAorICAgIGdpbnQ2NCBydHBfY2xvY2tfYmFzZSkKK3sKKyAgR3N0UnRwQmluQ2xpZW50ICpjbGllbnQ7CisgIGdib29sZWFuIGNyZWF0ZWQ7CisgIEdTTGlzdCAqd2FsazsKKyAgR3N0Q2xvY2tUaW1lIHJ1bm5pbmdfdGltZSwgcnVubmluZ190aW1lX3J0cDsKKyAgZ3VpbnQ2NCBudHBuc3RpbWU7CisKKyAgLyogZmlyc3QgZmluZCBvciBjcmVhdGUgdGhlIENOQU1FICovCisgIGNsaWVudCA9IGdldF9jbGllbnQgKGJpbiwgbGVuLCBkYXRhLCAmY3JlYXRlZCk7CisKKyAgLyogZmluZCBzdHJlYW0gaW4gdGhlIGNsaWVudCAqLworICBmb3IgKHdhbGsgPSBjbGllbnQtPnN0cmVhbXM7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UnRwQmluU3RyZWFtICpvc3RyZWFtID0gKEdzdFJ0cEJpblN0cmVhbSAqKSB3YWxrLT5kYXRhOworCisgICAgaWYgKG9zdHJlYW0gPT0gc3RyZWFtKQorICAgICAgYnJlYWs7CisgIH0KKyAgLyogbm90IGZvdW5kLCBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKyAgaWYgKHdhbGsgPT0gTlVMTCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwKKyAgICAgICAgIm5ldyBhc3NvY2lhdGlvbiBvZiBTU1JDICUwOHggd2l0aCBjbGllbnQgJXAgd2l0aCBDTkFNRSAlcyIsCisgICAgICAgIHN0cmVhbS0+c3NyYywgY2xpZW50LCBjbGllbnQtPmNuYW1lKTsKKyAgICBjbGllbnQtPnN0cmVhbXMgPSBnX3NsaXN0X3ByZXBlbmQgKGNsaWVudC0+c3RyZWFtcywgc3RyZWFtKTsKKyAgICBjbGllbnQtPm5zdHJlYW1zKys7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLAorICAgICAgICAiZm91bmQgYXNzb2NpYXRpb24gb2YgU1NSQyAlMDh4IHdpdGggY2xpZW50ICVwIHdpdGggQ05BTUUgJXMiLAorICAgICAgICBzdHJlYW0tPnNzcmMsIGNsaWVudCwgY2xpZW50LT5jbmFtZSk7CisgIH0KKworICBpZiAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChsYXN0X2V4dHJ0cHRpbWUpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAiaW52YWxpZGF0ZWQgc3luYyBkYXRhIik7CisgICAgaWYgKGJpbi0+cnRjcF9zeW5jID09IEdTVF9SVFBfQklOX1JUQ1BfU1lOQ19SVFApIHsKKyAgICAgIC8qIHdlIGRvbid0IG5lZWQgdGhhdCBkYXRhLCBzbyBjYXJyeSBvbiwKKyAgICAgICAqIGJ1dCBtYWtlIHNvbWUgdmFsdWVzIGxvb2sgc2FuZXIgKi8KKyAgICAgIGxhc3RfZXh0cnRwdGltZSA9IGJhc2VfcnRwdGltZTsKKyAgICB9IGVsc2UgeworICAgICAgLyogbm90aGluZyB3ZSBjYW4gZG8gd2l0aCB0aGlzIGRhdGEgaW4gdGhpcyBjYXNlICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChiaW4sICJiYWlsaW5nIG91dCIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8qIFRha2UgdGhlIGV4dGVuZGVkIHJ0cHRpbWUgd2UgZm91bmQgaW4gdGhlIFNSIHBhY2tldCBhbmQgbWFwIGl0IHRvIHRoZQorICAgKiBsb2NhbCBydHB0aW1lLiBUaGUgbG9jYWwgcnRwIHRpbWUgaXMgdXNlZCB0byBjb25zdHJ1Y3QgdGltZXN0YW1wcyBvbiB0aGUKKyAgICogYnVmZmVycyBzbyB3ZSB3aWxsIGNhbGN1bGF0ZSB3aGF0IHJ1bm5pbmdfdGltZSBjb3JyZXNwb25kcyB0byB0aGUgUlRQCisgICAqIHRpbWVzdGFtcCBpbiB0aGUgU1IgcGFja2V0LiAqLworICBydW5uaW5nX3RpbWVfcnRwID0gbGFzdF9leHRydHB0aW1lIC0gYmFzZV9ydHB0aW1lOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwKKyAgICAgICJiYXNlICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgZXh0cnRwdGltZSAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAiLCBsb2NhbCBSVFAgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBjbG9jay1yYXRlICVkLCAiCisgICAgICAiY2xvY2stYmFzZSAlIiBHX0dJTlQ2NF9GT1JNQVQsIGJhc2VfcnRwdGltZSwKKyAgICAgIGxhc3RfZXh0cnRwdGltZSwgcnVubmluZ190aW1lX3J0cCwgY2xvY2tfcmF0ZSwgcnRwX2Nsb2NrX2Jhc2UpOworCisgIC8qIGNhbGN1bGF0ZSBsb2NhbCBSVFAgdGltZSBpbiBnc3RyZWFtZXIgdGltZXN0YW1wLCB3ZSBlc3NlbnRpYWxseSBwZXJmb3JtIHRoZQorICAgKiBzYW1lIGNvbnZlcnNpb24gdGhhdCBhIGppdHRlcmJ1ZmZlciB3b3VsZCB1c2UgdG8gY29udmVydCBhbiBydHAgdGltZXN0YW1wCisgICAqIGludG8gYSBjb3JyZXNwb25kaW5nIGdzdHJlYW1lciB0aW1lc3RhbXAuIE5vdGUgdGhhdCB0aGUgYmFzZV90aW1lIGFsc28KKyAgICogY29udGFpbnMgdGhlIGRyaWZ0IGJldHdlZW4gc2VuZGVyIGFuZCByZWNlaXZlci4gKi8KKyAgcnVubmluZ190aW1lID0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHJ1bm5pbmdfdGltZV9ydHAsIEdTVF9TRUNPTkQsIGNsb2NrX3JhdGUpOworICBydW5uaW5nX3RpbWUgKz0gYmFzZV90aW1lOworCisgIC8qIGNvbnZlcnQgbnRwdGltZSB0byBuYW5vc2Vjb25kcyAqLworICBudHBuc3RpbWUgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKG50cHRpbWUsIEdTVF9TRUNPTkQsCisgICAgICAoR19HSU5UNjRfQ09OU1RBTlQgKDEpIDw8IDMyKSk7CisKKyAgc3RyZWFtLT5oYXZlX3N5bmMgPSBUUlVFOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwKKyAgICAgICJTUiBSVFAgcnVubmluZyB0aW1lICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgU1IgTlRQICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBydW5uaW5nX3RpbWUsIG50cG5zdGltZSk7CisKKyAgLyogcmVjYWxjIGludGVyIHN0cmVhbSBwbGF5b3V0IG9mZnNldCwgYnV0IG9ubHkgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZQorICAgKiBzdHJlYW0gb3Igd2UncmUgZG9pbmcgTlRQIHN5bmMuICovCisgIGlmIChiaW4tPm50cF9zeW5jKSB7CisgICAgZ2ludDY0IG50cGRpZmYsIHJ0ZGlmZjsKKyAgICBndWludDY0IGxvY2FsX250cG5zdGltZTsKKyAgICBHc3RDbG9ja1RpbWUgbG9jYWxfcnVubmluZ190aW1lOworCisgICAgLyogRm9yIE5UUCBzeW5jIHdlIG5lZWQgdG8gZmlyc3QgZ2V0IGEgc25hcHNob3Qgb2YgcnVubmluZ190aW1lIGFuZCBOVFAKKyAgICAgKiB0aW1lLiBXZSBrbm93IGF0IHdoYXQgcnVubmluZ190aW1lIHdlIHBsYXkgYSBjZXJ0YWluIFJUUCB0aW1lLCB3ZSBhbHNvCisgICAgICogY2FsY3VsYXRlZCB3aGVuIHdlIHdvdWxkIHBsYXkgdGhlIFJUUCB0aW1lIGluIHRoZSBTUiBwYWNrZXQuIE5vdyB3ZSBuZWVkCisgICAgICogdG8ga25vdyBob3cgdGhlIHJ1bm5pbmdfdGltZSBhbmQgdGhlIE5UUCB0aW1lIHJlbGF0ZSB0byBlYWNob3RoZXIuICovCisgICAgZ2V0X2N1cnJlbnRfdGltZXMgKGJpbiwgJmxvY2FsX3J1bm5pbmdfdGltZSwgJmxvY2FsX250cG5zdGltZSk7CisKKyAgICAvKiBzZWUgaG93IGZhciBhd2F5IHRoZSBOVFAgdGltZSBpcy4gVGhpcyBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQorICAgICAqIGN1cnJlbnQgTlRQIHRpbWUgYW5kIHRoZSBOVFAgdGltZSBpbiB0aGUgbGFzdCBTUiBwYWNrZXQuICovCisgICAgbnRwZGlmZiA9IGxvY2FsX250cG5zdGltZSAtIG50cG5zdGltZTsKKyAgICAvKiBzZWUgaG93IGZhciBhd2F5IHRoZSBydW5uaW5nX3RpbWUgaXMuIFRoaXMgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKKyAgICAgKiBjdXJyZW50IHJ1bm5pbmdfdGltZSBhbmQgdGhlIHJ1bm5pbmdfdGltZSBvZiB0aGUgUlRQIHRpbWVzdGFtcCBpbiB0aGUKKyAgICAgKiBsYXN0IFNSIHBhY2tldC4gKi8KKyAgICBydGRpZmYgPSBsb2NhbF9ydW5uaW5nX3RpbWUgLSBydW5uaW5nX3RpbWU7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChiaW4sCisgICAgICAgICJsb2NhbCBOVFAgdGltZSAlIiBHX0dVSU5UNjRfRk9STUFUICIsIFNSIE5UUCB0aW1lICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgIGxvY2FsX250cG5zdGltZSwgbnRwbnN0aW1lKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChiaW4sCisgICAgICAgICJsb2NhbCBydW5uaW5nIHRpbWUgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBTUiBSVFAgcnVubmluZyB0aW1lICUiCisgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIGxvY2FsX3J1bm5pbmdfdGltZSwgcnVubmluZ190aW1lKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChiaW4sCisgICAgICAgICJOVFAgZGlmZiAlIiBHX0dJTlQ2NF9GT1JNQVQgIiwgUlQgZGlmZiAlIiBHX0dJTlQ2NF9GT1JNQVQsIG50cGRpZmYsCisgICAgICAgIHJ0ZGlmZik7CisKKyAgICAvKiBjb21iaW5lIHRvIGdldCB0aGUgZmluYWwgZGlmZiB0byBhcHBseSB0byB0aGUgcnVubmluZ190aW1lICovCisgICAgc3RyZWFtLT5ydF9kZWx0YSA9IHJ0ZGlmZiAtIG50cGRpZmY7CisKKyAgICBzdHJlYW1fc2V0X3RzX29mZnNldCAoYmluLCBzdHJlYW0sIHN0cmVhbS0+cnRfZGVsdGEsIGJpbi0+bWF4X3RzX29mZnNldCwKKyAgICAgICAgMCwgRkFMU0UpOworICB9IGVsc2UgeworICAgIGdpbnQ2NCBtaW4sIHJ0cF9taW4sIGNsb2NrX2Jhc2UgPSBzdHJlYW0tPmNsb2NrX2Jhc2U7CisgICAgZ2Jvb2xlYW4gYWxsX3N5bmMsIHVzZV9ydHA7CisgICAgZ2Jvb2xlYW4gcnRjcF9zeW5jID0gZ19hdG9taWNfaW50X2dldCAoJmJpbi0+cnRjcF9zeW5jKTsKKworICAgIC8qIGNhbGN1bGF0ZSBkZWx0YSBiZXR3ZWVuIHNlcnZlciBhbmQgcmVjZWl2ZXIuIG50cG5zdGltZSBpcyBjcmVhdGVkIGJ5CisgICAgICogY29udmVydGluZyB0aGUgbnRwdGltZSBpbiB0aGUgbGFzdCBTUiBwYWNrZXQgdG8gYSBnc3RyZWFtZXIgdGltZXN0YW1wLiBUaGlzCisgICAgICogZGVsdGEgZXhwcmVzc2VzIHRoZSBkaWZmZXJlbmNlIHRvIG91ciB0aW1lbGluZSBhbmQgdGhlIHNlcnZlciB0aW1lbGluZS4gVGhlCisgICAgICogZGlmZmVyZW5jZSBpbiBpdHNlbGYgZG9lc24ndCBtZWFuIG11Y2ggYnV0IHdlIGNhbiBjb21iaW5lIHRoZSBkZWx0YSBvZgorICAgICAqIG11bHRpcGxlIHN0cmVhbXMgdG8gY3JlYXRlIGEgc3RyZWFtIHNwZWNpZmljIG9mZnNldC4gKi8KKyAgICBzdHJlYW0tPnJ0X2RlbHRhID0gbnRwbnN0aW1lIC0gcnVubmluZ190aW1lOworCisgICAgLyogY2FsY3VsYXRlIHRoZSBtaW4gb2YgYWxsIGRlbHRhcywgaWdub3Jpbmcgc3RyZWFtcyB0aGF0IGRpZCBub3QgeWV0IGhhdmUgYQorICAgICAqIHZhbGlkIHJ0X2RlbHRhIGJlY2F1c2Ugd2UgZGlkIG5vdCB5ZXQgcmVjZWl2ZSBhbiBTUiBwYWNrZXQgZm9yIHRob3NlCisgICAgICogc3RyZWFtcy4KKyAgICAgKiBXZSBjYWxjdWxhdGUgdGhlIG1pbmludW0gYmVjYXVzZSB3ZSB3b3VsZCBsaWtlIHRvIG9ubHkgYXBwbHkgcG9zaXRpdmUKKyAgICAgKiBvZmZzZXRzIHRvIHN0cmVhbXMsIGRlbGF5aW5nIHRoZWlyIHBsYXliYWNrIGluc3RlYWQgb2YgdHJ5aW5nIHRvIHNwZWVkIHVwCisgICAgICogb3RoZXIgc3RyZWFtcyAod2hpY2ggbWlnaHQgYmUgaW1wb3NpYmxlIHdoZW4gd2UgaGF2ZSB0byBjcmVhdGUgbmVnYXRpdmUKKyAgICAgKiBsYXRlbmNpZXMpLgorICAgICAqIFRoZSBzdHJlYW0gdGhhdCBoYXMgdGhlIHNtYWxsZXN0IGRpZmYgaXMgc2VsZWN0ZWQgYXMgdGhlIHJlZmVyZW5jZSBzdHJlYW0sCisgICAgICogYWxsIG90aGVyIHN0cmVhbXMgd2lsbCBoYXZlIGEgcG9zaXRpdmUgb2Zmc2V0IHRvIHRoaXMgZGlmZmVyZW5jZS4gKi8KKworICAgIC8qIHNvbWUgYWx0ZXJuYXRpdmUgc2V0dGluZyBhbGxvdyBpZ25vcmluZyBSVENQIGFzIG11Y2ggYXMgcG9zc2libGUsCisgICAgICogZm9yIHNlcnZlcnMgZ2VuZXJhdGluZyBib2d1cyBudHAgdGltZWxpbmUgKi8KKyAgICBtaW4gPSBydHBfbWluID0gR19NQVhJTlQ2NDsKKyAgICB1c2VfcnRwID0gRkFMU0U7CisgICAgaWYgKHJ0Y3Bfc3luYyA9PSBHU1RfUlRQX0JJTl9SVENQX1NZTkNfUlRQKSB7CisgICAgICBndWludDY0IGV4dF9iYXNlOworCisgICAgICB1c2VfcnRwID0gVFJVRTsKKyAgICAgIC8qIHNpZ25lZCB2ZXJzaW9uIGZvciBjb252aWVuaWVuY2UgKi8KKyAgICAgIGNsb2NrX2Jhc2UgPSBiYXNlX3J0cHRpbWU7CisgICAgICAvKiBkZWFsIHdpdGggcG9zc2libGUgd3JhcC1hcm91bmQgKi8KKyAgICAgIGV4dF9iYXNlID0gYmFzZV9ydHB0aW1lOworICAgICAgcnRwX2Nsb2NrX2Jhc2UgPSBnc3RfcnRwX2J1ZmZlcl9leHRfdGltZXN0YW1wICgmZXh0X2Jhc2UsIHJ0cF9jbG9ja19iYXNlKTsKKyAgICAgIC8qIHNhbml0eSBjaGVjazsgYmFzZSBydHAgYW5kIHByb3ZpZGVkIGNsb2NrX2Jhc2Ugc2hvdWxkIGJlIGNsb3NlICovCisgICAgICBpZiAocnRwX2Nsb2NrX2Jhc2UgPj0gY2xvY2tfYmFzZSkgeworICAgICAgICBpZiAocnRwX2Nsb2NrX2Jhc2UgLSBjbG9ja19iYXNlIDwgMTAgKiBjbG9ja19yYXRlKSB7CisgICAgICAgICAgcnRwX2Nsb2NrX2Jhc2UgPSBiYXNlX3RpbWUgKworICAgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChydHBfY2xvY2tfYmFzZSAtIGNsb2NrX2Jhc2UsCisgICAgICAgICAgICAgIEdTVF9TRUNPTkQsIGNsb2NrX3JhdGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHVzZV9ydHAgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNsb2NrX2Jhc2UgLSBydHBfY2xvY2tfYmFzZSA8IDEwICogY2xvY2tfcmF0ZSkgeworICAgICAgICAgIHJ0cF9jbG9ja19iYXNlID0gYmFzZV90aW1lIC0KKyAgICAgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoY2xvY2tfYmFzZSAtIHJ0cF9jbG9ja19iYXNlLAorICAgICAgICAgICAgICBHU1RfU0VDT05ELCBjbG9ja19yYXRlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB1c2VfcnRwID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIHdhcm4gYW5kIGJhaWwgZm9yIGNsYXJpdHkgb3V0IGlmIG5vIHNhbmUgdmFsdWVzICovCisgICAgICBpZiAoIXVzZV9ydHApIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChiaW4sICJ1bmFibGUgdG8gc3luYyB0byBwcm92aWRlZCBydHB0aW1lIik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIC8qIHN0b3JlIHRvIHRyYWNrIGNoYW5nZXMgKi8KKyAgICAgIGNsb2NrX2Jhc2UgPSBydHBfY2xvY2tfYmFzZTsKKyAgICAgIC8qIGdlbmVyYXRlIGEgZmFrZSBhcyBiZWZvcmUsCisgICAgICAgKiBub3cgZXF1YXRpbmcgcnRwdGltZSBvYnRhaW5lZCBmcm9tIFJUUC1JbmZvLAorICAgICAgICogd2hlcmUgdGhlIGxhcmdlIHRpbWUgcmVwcmVzZW50IHRoZSBvdGhlcndpc2UgaXJyZWxldmFudCBucHQvbnRwIHRpbWUgKi8KKyAgICAgIHN0cmVhbS0+cnRwX2RlbHRhID0gKEdTVF9TRUNPTkQgPDwgMjgpIC0gcnRwX2Nsb2NrX2Jhc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGNsb2NrX2Jhc2UgPSBydHBfY2xvY2tfYmFzZTsKKyAgICB9CisKKyAgICBhbGxfc3luYyA9IFRSVUU7CisgICAgZm9yICh3YWxrID0gY2xpZW50LT5zdHJlYW1zOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgICAgR3N0UnRwQmluU3RyZWFtICpvc3RyZWFtID0gKEdzdFJ0cEJpblN0cmVhbSAqKSB3YWxrLT5kYXRhOworCisgICAgICBpZiAoIW9zdHJlYW0tPmhhdmVfc3luYykgeworICAgICAgICBhbGxfc3luYyA9IEZBTFNFOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLyogY2hhbmdlIGluIGN1cnJlbnQgc3RyZWFtJ3MgYmFzZSBmcm9tIHByZXZpb3VzbHkgaW5pdCdlZCB2YWx1ZQorICAgICAgICogbGVhZHMgdG8gcmVzZXQgb2YgYWxsIHN0cmVhbSdzIGJhc2UgKi8KKyAgICAgIGlmIChzdHJlYW0gIT0gb3N0cmVhbSAmJiBzdHJlYW0tPmNsb2NrX2Jhc2UgPj0gMCAmJgorICAgICAgICAgIChzdHJlYW0tPmNsb2NrX2Jhc2UgIT0gY2xvY2tfYmFzZSkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAicmVzZXQgdXBvbiBjbG9jayBiYXNlIGNoYW5nZSIpOworICAgICAgICBvc3RyZWFtLT5jbG9ja19iYXNlID0gLTEwMCAqIEdTVF9TRUNPTkQ7CisgICAgICAgIG9zdHJlYW0tPnJ0cF9kZWx0YSA9IDA7CisgICAgICB9CisKKyAgICAgIGlmIChvc3RyZWFtLT5ydF9kZWx0YSA8IG1pbikKKyAgICAgICAgbWluID0gb3N0cmVhbS0+cnRfZGVsdGE7CisgICAgICBpZiAob3N0cmVhbS0+cnRwX2RlbHRhIDwgcnRwX21pbikKKyAgICAgICAgcnRwX21pbiA9IG9zdHJlYW0tPnJ0cF9kZWx0YTsKKyAgICB9CisKKyAgICAvKiBhcnJhbmdlIHRvIHJlLXN5bmMgZm9yIGVhY2ggc3RyZWFtIHVwb24gc2lnbmlmaWNhbnQgY2hhbmdlLAorICAgICAqIGUuZy4gcG9zdC1zZWVrICovCisgICAgYWxsX3N5bmMgPSBhbGxfc3luYyAmJiAoc3RyZWFtLT5jbG9ja19iYXNlID09IGNsb2NrX2Jhc2UpOworICAgIHN0cmVhbS0+Y2xvY2tfYmFzZSA9IGNsb2NrX2Jhc2U7CisKKyAgICAvKiBtYXkgbmVlZCBpbml0IHBlcmZvcm1lZCBhYm92ZSBsYXRlciBvbiwgYnV0IG5vdGhpbmcgbW9yZSB0byBkbyBub3cgKi8KKyAgICBpZiAoY2xpZW50LT5uc3RyZWFtcyA8PSAxKQorICAgICAgcmV0dXJuOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAiY2xpZW50ICVwIG1pbiBkZWx0YSAlIiBHX0dJTlQ2NF9GT1JNQVQKKyAgICAgICAgIiBhbGwgc3luYyAlZCIsIGNsaWVudCwgbWluLCBhbGxfc3luYyk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAicnRjcCBzeW5jIG1vZGUgJWQsIHVzZV9ydHAgJWQiLCBydGNwX3N5bmMsIHVzZV9ydHApOworCisgICAgc3dpdGNoIChydGNwX3N5bmMpIHsKKyAgICAgIGNhc2UgR1NUX1JUUF9CSU5fUlRDUF9TWU5DX1JUUDoKKyAgICAgICAgaWYgKCF1c2VfcnRwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChiaW4sICJ1c2luZyBydHAgZ2VuZXJhdGVkIHJlcG9ydHM7ICIKKyAgICAgICAgICAgICJjbGllbnQgJXAgbWluIHJ0cCBkZWx0YSAlIiBHX0dJTlQ2NF9GT1JNQVQsIGNsaWVudCwgcnRwX21pbik7CisgICAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICAgICAgY2FzZSBHU1RfUlRQX0JJTl9SVENQX1NZTkNfSU5JVElBTDoKKyAgICAgICAgLyogaWYgYWxsIGhhdmUgYmVlbiBzeW5jZWQgYWxyZWFkeSwgZG8gbm90IGJvdGhlciBmdXJ0aGVyICovCisgICAgICAgIGlmIChhbGxfc3luYykgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgImFsbCBzdHJlYW1zIGFscmVhZHkgc3luY2VkOyBkb25lIik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogYmFpbCBvdXQgaWYgd2UgYWRqdXN0ZWQgcmVjZW50bHkgZW5vdWdoICovCisgICAgaWYgKGFsbF9zeW5jICYmIChudHBuc3RpbWUgLSBiaW4tPnByaXYtPmxhc3RfbnRwbnN0aW1lKSA8CisgICAgICAgIGJpbi0+cnRjcF9zeW5jX2ludGVydmFsICogR1NUX01TRUNPTkQpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgImRpc2NhcmRpbmcgUlRDUCBzZW5kZXIgcGFja2V0IGZvciBzeW5jOyAiCisgICAgICAgICAgInByZXZpb3VzIHNlbmRlciBpbmZvIHRvbyByZWNlbnQgIgorICAgICAgICAgICIocHJldmlvdXMgTlRQICUiIEdfR1VJTlQ2NF9GT1JNQVQgIikiLCBiaW4tPnByaXYtPmxhc3RfbnRwbnN0aW1lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYmluLT5wcml2LT5sYXN0X250cG5zdGltZSA9IG50cG5zdGltZTsKKworICAgIC8qIGNhbGN1bGF0ZSBvZmZzZXRzIGZvciBlYWNoIHN0cmVhbSAqLworICAgIGZvciAod2FsayA9IGNsaWVudC0+c3RyZWFtczsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICAgIEdzdFJ0cEJpblN0cmVhbSAqb3N0cmVhbSA9IChHc3RSdHBCaW5TdHJlYW0gKikgd2Fsay0+ZGF0YTsKKyAgICAgIGdpbnQ2NCB0c19vZmZzZXQ7CisKKyAgICAgIC8qIGlnbm9yZSBzdHJlYW1zIGZvciB3aGljaCB3ZSBkaWRuJ3QgcmVjZWl2ZSBhbiBTUiBwYWNrZXQgeWV0LCB3ZQorICAgICAgICogY2FuJ3Qgc3luY2hyb25pemUgdGhlbSB5ZXQuIFdlIGNhbiBob3dldmVyIHN5bmMgb3RoZXIgc3RyZWFtcyBqdXN0CisgICAgICAgKiBmaW5lLiAqLworICAgICAgaWYgKCFvc3RyZWFtLT5oYXZlX3N5bmMpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvKiBjYWxjdWxhdGUgb2Zmc2V0IHRvIG91ciByZWZlcmVuY2Ugc3RyZWFtLCB0aGlzIHNob3VsZCBhbHdheXMgZ2l2ZSBhCisgICAgICAgKiBwb3NpdGl2ZSBudW1iZXIuICovCisgICAgICBpZiAodXNlX3J0cCkKKyAgICAgICAgdHNfb2Zmc2V0ID0gb3N0cmVhbS0+cnRwX2RlbHRhIC0gcnRwX21pbjsKKyAgICAgIGVsc2UKKyAgICAgICAgdHNfb2Zmc2V0ID0gb3N0cmVhbS0+cnRfZGVsdGEgLSBtaW47CisKKyAgICAgIHN0cmVhbV9zZXRfdHNfb2Zmc2V0IChiaW4sIG9zdHJlYW0sIHRzX29mZnNldCwgYmluLT5tYXhfdHNfb2Zmc2V0LAorICAgICAgICAgIE1JTl9UU19PRkZTRVQsIFRSVUUpOworICAgIH0KKyAgfQorICBnc3RfcnRwX2Jpbl9zZW5kX3N5bmNfZXZlbnQgKHN0cmVhbSk7CisKKyAgcmV0dXJuOworfQorCisjZGVmaW5lIEdTVF9SVENQX0JVRkZFUl9GT1JfUEFDS0VUUyhiLGJ1ZmZlcixwYWNrZXQpIFwKKyAgZm9yICgoYikgPSBnc3RfcnRjcF9idWZmZXJfZ2V0X2ZpcnN0X3BhY2tldCAoKGJ1ZmZlciksIChwYWNrZXQpKTsgKGIpOyBcCisgICAgICAgICAgKGIpID0gZ3N0X3J0Y3BfcGFja2V0X21vdmVfdG9fbmV4dCAoKHBhY2tldCkpKQorCisjZGVmaW5lIEdTVF9SVENQX1NERVNfRk9SX0lURU1TKGIscGFja2V0KSBcCisgIGZvciAoKGIpID0gZ3N0X3J0Y3BfcGFja2V0X3NkZXNfZmlyc3RfaXRlbSAoKHBhY2tldCkpOyAoYik7IFwKKyAgICAgICAgICAoYikgPSBnc3RfcnRjcF9wYWNrZXRfc2Rlc19uZXh0X2l0ZW0gKChwYWNrZXQpKSkKKworI2RlZmluZSBHU1RfUlRDUF9TREVTX0ZPUl9FTlRSSUVTKGIscGFja2V0KSBcCisgIGZvciAoKGIpID0gZ3N0X3J0Y3BfcGFja2V0X3NkZXNfZmlyc3RfZW50cnkgKChwYWNrZXQpKTsgKGIpOyBcCisgICAgICAgICAgKGIpID0gZ3N0X3J0Y3BfcGFja2V0X3NkZXNfbmV4dF9lbnRyeSAoKHBhY2tldCkpKQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9iaW5faGFuZGxlX3N5bmMgKEdzdEVsZW1lbnQgKiBqaXR0ZXJidWZmZXIsIEdzdFN0cnVjdHVyZSAqIHMsCisgICAgR3N0UnRwQmluU3RyZWFtICogc3RyZWFtKQoreworICBHc3RSdHBCaW4gKmJpbjsKKyAgR3N0UlRDUFBhY2tldCBwYWNrZXQ7CisgIGd1aW50MzIgc3NyYzsKKyAgZ3VpbnQ2NCBudHB0aW1lOworICBnYm9vbGVhbiBoYXZlX3NyLCBoYXZlX3NkZXM7CisgIGdib29sZWFuIG1vcmU7CisgIGd1aW50NjQgYmFzZV9ydHB0aW1lOworICBndWludDY0IGJhc2VfdGltZTsKKyAgZ3VpbnQgY2xvY2tfcmF0ZTsKKyAgZ3VpbnQ2NCBjbG9ja19iYXNlOworICBndWludDY0IGV4dHJ0cHRpbWU7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBHc3RSVENQQnVmZmVyIHJ0Y3AgPSB7IE5VTEwsIH07CisKKyAgYmluID0gc3RyZWFtLT5iaW47CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAic3luYyBoYW5kbGVyIGNhbGxlZCIpOworCisgIC8qIGdldCB0aGUgbGFzdCByZWxhdGlvbiBiZXR3ZWVuIHRoZSBydHAgdGltZXN0YW1wcyBhbmQgdGhlIGdzdHJlYW1lcgorICAgKiB0aW1lc3RhbXBzLiBXZSBnZXQgdGhpcyBpbmZvIGRpcmVjdGx5IGZyb20gdGhlIGppdHRlcmJ1ZmZlciB3aGljaAorICAgKiBjb25zdHJ1Y3RzIGdzdHJlYW1lciB0aW1lc3RhbXBzIGZyb20gcnRwIHRpbWVzdGFtcHMgYW5kIHNvIGl0IGtub3cgZXhhY3RseQorICAgKiB3aGF0IHRoZSBjdXJyZW50IHNpdHVhdGlvbiBpcy4gKi8KKyAgYmFzZV9ydHB0aW1lID0KKyAgICAgIGdfdmFsdWVfZ2V0X3VpbnQ2NCAoZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJiYXNlLXJ0cHRpbWUiKSk7CisgIGJhc2VfdGltZSA9IGdfdmFsdWVfZ2V0X3VpbnQ2NCAoZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJiYXNlLXRpbWUiKSk7CisgIGNsb2NrX3JhdGUgPSBnX3ZhbHVlX2dldF91aW50IChnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgImNsb2NrLXJhdGUiKSk7CisgIGNsb2NrX2Jhc2UgPSBnX3ZhbHVlX2dldF91aW50NjQgKGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAiY2xvY2stYmFzZSIpKTsKKyAgZXh0cnRwdGltZSA9CisgICAgICBnX3ZhbHVlX2dldF91aW50NjQgKGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAic3ItZXh0LXJ0cHRpbWUiKSk7CisgIGJ1ZmZlciA9IGdzdF92YWx1ZV9nZXRfYnVmZmVyIChnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgInNyLWJ1ZmZlciIpKTsKKworICBoYXZlX3NyID0gRkFMU0U7CisgIGhhdmVfc2RlcyA9IEZBTFNFOworCisgIGdzdF9ydGNwX2J1ZmZlcl9tYXAgKGJ1ZmZlciwgR1NUX01BUF9SRUFELCAmcnRjcCk7CisKKyAgR1NUX1JUQ1BfQlVGRkVSX0ZPUl9QQUNLRVRTIChtb3JlLCAmcnRjcCwgJnBhY2tldCkgeworICAgIC8qIGZpcnN0IHBhY2tldCBtdXN0IGJlIFNSIG9yIFJSIG9yIGVsc2UgdGhlIHZhbGlkYXRlIHdvdWxkIGhhdmUgZmFpbGVkICovCisgICAgc3dpdGNoIChnc3RfcnRjcF9wYWNrZXRfZ2V0X3R5cGUgKCZwYWNrZXQpKSB7CisgICAgICBjYXNlIEdTVF9SVENQX1RZUEVfU1I6CisgICAgICAgIC8qIG9ubHkgcGFyc2UgZmlyc3QuIFRoZXJlIGlzIG9ubHkgc3VwcG9zZWQgdG8gYmUgb25lIFNSIGluIHRoZSBwYWNrZXQKKyAgICAgICAgICogYnV0IHdlIHdpbGwgZGVhbCB3aXRoIG1hbGZvcm1lZCBwYWNrZXRzIGdyYWNlZnVsbHkgKi8KKyAgICAgICAgaWYgKGhhdmVfc3IpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIGdldCBOVFAgYW5kIFJUUCB0aW1lcyAqLworICAgICAgICBnc3RfcnRjcF9wYWNrZXRfc3JfZ2V0X3NlbmRlcl9pbmZvICgmcGFja2V0LCAmc3NyYywgJm50cHRpbWUsIE5VTEwsCisgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChiaW4sICJyZWNlaXZlZCBzeW5jIHBhY2tldCBmcm9tIFNTUkMgJTA4eCIsIHNzcmMpOworICAgICAgICAvKiBpZ25vcmUgU1IgdGhhdCBpcyBub3Qgb3VycyAqLworICAgICAgICBpZiAoc3NyYyAhPSBzdHJlYW0tPnNzcmMpCisgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaGF2ZV9zciA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX1NERVM6CisgICAgICB7CisgICAgICAgIGdib29sZWFuIG1vcmVfaXRlbXMsIG1vcmVfZW50cmllczsKKworICAgICAgICAvKiBvbmx5IGRlYWwgd2l0aCBmaXJzdCBTREVTLCB0aGVyZSBpcyBvbmx5IHN1cHBvc2VkIHRvIGJlIG9uZSBTREVTIGluCisgICAgICAgICAqIHRoZSBSVENQIHBhY2tldCBidXQgd2UgZGVhbCB3aXRoIGJhZCBwYWNrZXRzIGdyYWNlZnVsbHkuIEFsc28gYmFpbAorICAgICAgICAgKiBvdXQgaWYgd2UgaGF2ZSBub3Qgc2VlbiBhbiBTUiBpdGVtIHlldC4gKi8KKyAgICAgICAgaWYgKGhhdmVfc2RlcyB8fCAhaGF2ZV9zcikKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBHU1RfUlRDUF9TREVTX0ZPUl9JVEVNUyAobW9yZV9pdGVtcywgJnBhY2tldCkgeworICAgICAgICAgIC8qIHNraXAgaXRlbXMgdGhhdCBhcmUgbm90IGFib3V0IHRoZSBTU1JDIG9mIHRoZSBzZW5kZXIgKi8KKyAgICAgICAgICBpZiAoZ3N0X3J0Y3BfcGFja2V0X3NkZXNfZ2V0X3NzcmMgKCZwYWNrZXQpICE9IHNzcmMpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIC8qIGZpbmQgdGhlIENOQU1FIGVudHJ5ICovCisgICAgICAgICAgR1NUX1JUQ1BfU0RFU19GT1JfRU5UUklFUyAobW9yZV9lbnRyaWVzLCAmcGFja2V0KSB7CisgICAgICAgICAgICBHc3RSVENQU0RFU1R5cGUgdHlwZTsKKyAgICAgICAgICAgIGd1aW50OCBsZW47CisgICAgICAgICAgICBndWludDggKmRhdGE7CisKKyAgICAgICAgICAgIGdzdF9ydGNwX3BhY2tldF9zZGVzX2dldF9lbnRyeSAoJnBhY2tldCwgJnR5cGUsICZsZW4sICZkYXRhKTsKKworICAgICAgICAgICAgaWYgKHR5cGUgPT0gR1NUX1JUQ1BfU0RFU19DTkFNRSkgeworICAgICAgICAgICAgICBHU1RfUlRQX0JJTl9MT0NLIChiaW4pOworICAgICAgICAgICAgICAvKiBhc3NvY2lhdGUgdGhlIHN0cmVhbSB0byBDTkFNRSAqLworICAgICAgICAgICAgICBnc3RfcnRwX2Jpbl9hc3NvY2lhdGUgKGJpbiwgc3RyZWFtLCBsZW4sIGRhdGEsCisgICAgICAgICAgICAgICAgICBudHB0aW1lLCBleHRydHB0aW1lLCBiYXNlX3J0cHRpbWUsIGJhc2VfdGltZSwgY2xvY2tfcmF0ZSwKKyAgICAgICAgICAgICAgICAgIGNsb2NrX2Jhc2UpOworICAgICAgICAgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKGJpbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGhhdmVfc2RlcyA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgLyogd2UgY2FuIGlnbm9yZSB0aGVzZSBwYWNrZXRzICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBnc3RfcnRjcF9idWZmZXJfdW5tYXAgKCZydGNwKTsKK30KKworLyogY3JlYXRlIGEgbmV3IHN0cmVhbSB3aXRoIEBzc3JjIGluIEBzZXNzaW9uLiBNdXN0IGJlIGNhbGxlZCB3aXRoCisgKiBSVFBfU0VTU0lPTl9MT0NLLiAqLworc3RhdGljIEdzdFJ0cEJpblN0cmVhbSAqCitjcmVhdGVfc3RyZWFtIChHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjKQoreworICBHc3RFbGVtZW50ICpidWZmZXIsICpkZW11eCA9IE5VTEw7CisgIEdzdFJ0cEJpblN0cmVhbSAqc3RyZWFtOworICBHc3RSdHBCaW4gKnJ0cGJpbjsKKyAgR3N0U3RhdGUgdGFyZ2V0OworCisgIHJ0cGJpbiA9IHNlc3Npb24tPmJpbjsKKworICBpZiAoZ19zbGlzdF9sZW5ndGggKHNlc3Npb24tPnN0cmVhbXMpID49IHJ0cGJpbi0+bWF4X3N0cmVhbXMpCisgICAgZ290byBtYXhfc3RyZWFtczsKKworICBpZiAoIShidWZmZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBqaXR0ZXJidWZmZXIiLCBOVUxMKSkpCisgICAgZ290byBub19qaXR0ZXJidWZmZXI7CisKKyAgaWYgKCFydHBiaW4tPmlnbm9yZV9wdCkKKyAgICBpZiAoIShkZW11eCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cHB0ZGVtdXgiLCBOVUxMKSkpCisgICAgICBnb3RvIG5vX2RlbXV4OworCisgIHN0cmVhbSA9IGdfbmV3MCAoR3N0UnRwQmluU3RyZWFtLCAxKTsKKyAgc3RyZWFtLT5zc3JjID0gc3NyYzsKKyAgc3RyZWFtLT5iaW4gPSBydHBiaW47CisgIHN0cmVhbS0+c2Vzc2lvbiA9IHNlc3Npb247CisgIHN0cmVhbS0+YnVmZmVyID0gYnVmZmVyOworICBzdHJlYW0tPmRlbXV4ID0gZGVtdXg7CisKKyAgc3RyZWFtLT5oYXZlX3N5bmMgPSBGQUxTRTsKKyAgc3RyZWFtLT5ydF9kZWx0YSA9IDA7CisgIHN0cmVhbS0+cnRwX2RlbHRhID0gMDsKKyAgc3RyZWFtLT5wZXJjZW50ID0gMTAwOworICBzdHJlYW0tPmNsb2NrX2Jhc2UgPSAtMTAwICogR1NUX1NFQ09ORDsKKyAgc2Vzc2lvbi0+c3RyZWFtcyA9IGdfc2xpc3RfcHJlcGVuZCAoc2Vzc2lvbi0+c3RyZWFtcywgc3RyZWFtKTsKKworICAvKiBwcm92aWRlIGNsb2NrX3JhdGUgdG8gdGhlIGppdHRlcmJ1ZmZlciB3aGVuIG5lZWRlZCAqLworICBzdHJlYW0tPmJ1ZmZlcl9wdHJlcV9zaWcgPSBnX3NpZ25hbF9jb25uZWN0IChidWZmZXIsICJyZXF1ZXN0LXB0LW1hcCIsCisgICAgICAoR0NhbGxiYWNrKSBwdF9tYXBfcmVxdWVzdGVkLCBzZXNzaW9uKTsKKyAgc3RyZWFtLT5idWZmZXJfbnRwc3RvcF9zaWcgPSBnX3NpZ25hbF9jb25uZWN0IChidWZmZXIsICJvbi1ucHQtc3RvcCIsCisgICAgICAoR0NhbGxiYWNrKSBvbl9ucHRfc3RvcCwgc3RyZWFtKTsKKworICBnX29iamVjdF9zZXRfZGF0YSAoR19PQkpFQ1QgKGJ1ZmZlciksICJHc3RSVFBCaW4uc2Vzc2lvbiIsIHNlc3Npb24pOworICBnX29iamVjdF9zZXRfZGF0YSAoR19PQkpFQ1QgKGJ1ZmZlciksICJHc3RSVFBCaW4uc3RyZWFtIiwgc3RyZWFtKTsKKworICAvKiBjb25maWd1cmUgbGF0ZW5jeSBhbmQgcGFja2V0IGxvc3QgKi8KKyAgZ19vYmplY3Rfc2V0IChidWZmZXIsICJsYXRlbmN5IiwgcnRwYmluLT5sYXRlbmN5X21zLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChidWZmZXIsICJkcm9wLW9uLWxhdGVuY3kiLCBydHBiaW4tPmRyb3Bfb25fbGF0ZW5jeSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoYnVmZmVyLCAiZG8tbG9zdCIsIHJ0cGJpbi0+ZG9fbG9zdCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoYnVmZmVyLCAibW9kZSIsIHJ0cGJpbi0+YnVmZmVyX21vZGUsIE5VTEwpOworICBnX29iamVjdF9zZXQgKGJ1ZmZlciwgImRvLXJldHJhbnNtaXNzaW9uIiwgcnRwYmluLT5kb19yZXRyYW5zbWlzc2lvbiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoYnVmZmVyLCAibWF4LXJ0Y3AtcnRwLXRpbWUtZGlmZiIsCisgICAgICBydHBiaW4tPm1heF9ydGNwX3J0cF90aW1lX2RpZmYsIE5VTEwpOworICBnX29iamVjdF9zZXQgKGJ1ZmZlciwgIm1heC1kcm9wb3V0LXRpbWUiLCBydHBiaW4tPm1heF9kcm9wb3V0X3RpbWUsCisgICAgICAibWF4LW1pc29yZGVyLXRpbWUiLCBydHBiaW4tPm1heF9taXNvcmRlcl90aW1lLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChidWZmZXIsICJyZmM3MjczLXN5bmMiLCBydHBiaW4tPnJmYzcyNzNfc3luYywgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoYnVmZmVyLCAibWF4LXRzLW9mZnNldC1hZGp1c3RtZW50IiwKKyAgICAgIHJ0cGJpbi0+bWF4X3RzX29mZnNldF9hZGp1c3RtZW50LCBOVUxMKTsKKworICBnX3NpZ25hbF9lbWl0IChydHBiaW4sIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX05FV19KSVRURVJCVUZGRVJdLCAwLAorICAgICAgYnVmZmVyLCBzZXNzaW9uLT5pZCwgc3NyYyk7CisKKyAgaWYgKCFydHBiaW4tPmlnbm9yZV9wdCkKKyAgICBnc3RfYmluX2FkZCAoR1NUX0JJTl9DQVNUIChydHBiaW4pLCBkZW11eCk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOX0NBU1QgKHJ0cGJpbiksIGJ1ZmZlcik7CisKKyAgLyogbGluayBzdHVmZiAqLworICBpZiAoZGVtdXgpCisgICAgZ3N0X2VsZW1lbnRfbGlua19wYWRzX2Z1bGwgKGJ1ZmZlciwgInNyYyIsIGRlbXV4LCAic2luayIsCisgICAgICAgIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKworICBpZiAocnRwYmluLT5idWZmZXJpbmcpIHsKKyAgICBndWludDY0IGxhc3Rfb3V0OworCisgICAgR1NUX0lORk9fT0JKRUNUIChydHBiaW4sCisgICAgICAgICJiaW4gaXMgYnVmZmVyaW5nLCBzZXQgaml0dGVyYnVmZmVyIGFzIG5vdCBhY3RpdmUiKTsKKyAgICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKGJ1ZmZlciwgInNldC1hY3RpdmUiLCBGQUxTRSwgKGdpbnQ2NCkgMCwgJmxhc3Rfb3V0KTsKKyAgfQorCisKKyAgR1NUX09CSkVDVF9MT0NLIChydHBiaW4pOworICB0YXJnZXQgPSBHU1RfU1RBVEVfVEFSR0VUIChydHBiaW4pOworICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwYmluKTsKKworICAvKiBmcm9tIHNpbmsgdG8gc291cmNlICovCisgIGlmIChkZW11eCkKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGRlbXV4LCB0YXJnZXQpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYnVmZmVyLCB0YXJnZXQpOworCisgIHJldHVybiBzdHJlYW07CisKKyAgLyogRVJST1JTICovCittYXhfc3RyZWFtczoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwYmluLCAic3RyZWFtIGV4ZWVkcyBtYXhpbXVtICglZCkiLAorICAgICAgICBydHBiaW4tPm1heF9zdHJlYW1zKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorbm9faml0dGVyYnVmZmVyOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBjb3VsZCBub3QgY3JlYXRlIHJ0cGppdHRlcmJ1ZmZlciBlbGVtZW50Iik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK25vX2RlbXV4OgorICB7CisgICAgZ3N0X29iamVjdF91bnJlZiAoYnVmZmVyKTsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGNvdWxkIG5vdCBjcmVhdGUgcnRwcHRkZW11eCBlbGVtZW50Iik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworLyogY2FsbGVkIHdpdGggUlRQX0JJTl9MT0NLICovCitzdGF0aWMgdm9pZAorZnJlZV9zdHJlYW0gKEdzdFJ0cEJpblN0cmVhbSAqIHN0cmVhbSwgR3N0UnRwQmluICogYmluKQoreworICBHU0xpc3QgKmNsaWVudHMsICpuZXh0X2NsaWVudDsKKworICBHU1RfREVCVUdfT0JKRUNUIChiaW4sICJmcmVlaW5nIHN0cmVhbSAlcCIsIHN0cmVhbSk7CisKKyAgaWYgKHN0cmVhbS0+ZGVtdXgpIHsKKyAgICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QgKHN0cmVhbS0+ZGVtdXgsIHN0cmVhbS0+ZGVtdXhfbmV3cGFkX3NpZyk7CisgICAgZ19zaWduYWxfaGFuZGxlcl9kaXNjb25uZWN0IChzdHJlYW0tPmRlbXV4LCBzdHJlYW0tPmRlbXV4X3B0cmVxX3NpZyk7CisgICAgZ19zaWduYWxfaGFuZGxlcl9kaXNjb25uZWN0IChzdHJlYW0tPmRlbXV4LCBzdHJlYW0tPmRlbXV4X3B0Y2hhbmdlX3NpZyk7CisgIH0KKyAgZ19zaWduYWxfaGFuZGxlcl9kaXNjb25uZWN0IChzdHJlYW0tPmJ1ZmZlciwgc3RyZWFtLT5idWZmZXJfaGFuZGxlc3luY19zaWcpOworICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QgKHN0cmVhbS0+YnVmZmVyLCBzdHJlYW0tPmJ1ZmZlcl9wdHJlcV9zaWcpOworICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QgKHN0cmVhbS0+YnVmZmVyLCBzdHJlYW0tPmJ1ZmZlcl9udHBzdG9wX3NpZyk7CisKKyAgaWYgKHN0cmVhbS0+ZGVtdXgpCisgICAgZ3N0X2VsZW1lbnRfc2V0X2xvY2tlZF9zdGF0ZSAoc3RyZWFtLT5kZW11eCwgVFJVRSk7CisgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKHN0cmVhbS0+YnVmZmVyLCBUUlVFKTsKKworICBpZiAoc3RyZWFtLT5kZW11eCkKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHN0cmVhbS0+ZGVtdXgsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzdHJlYW0tPmJ1ZmZlciwgR1NUX1NUQVRFX05VTEwpOworCisgIC8qIG5vdyByZW1vdmUgdGhpcyBzaWduYWwsIHdlIG5lZWQgdGhpcyB3aGlsZSBnb2luZyB0byBOVUxMIGJlY2F1c2UgaXQgdG8KKyAgICogZG8gc29tZSBjbGVhbnVwcyAqLworICBpZiAoc3RyZWFtLT5kZW11eCkKKyAgICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QgKHN0cmVhbS0+ZGVtdXgsIHN0cmVhbS0+ZGVtdXhfcGFkcmVtb3ZlZF9zaWcpOworCisgIGdzdF9iaW5fcmVtb3ZlIChHU1RfQklOX0NBU1QgKGJpbiksIHN0cmVhbS0+YnVmZmVyKTsKKyAgaWYgKHN0cmVhbS0+ZGVtdXgpCisgICAgZ3N0X2Jpbl9yZW1vdmUgKEdTVF9CSU5fQ0FTVCAoYmluKSwgc3RyZWFtLT5kZW11eCk7CisKKyAgZm9yIChjbGllbnRzID0gYmluLT5jbGllbnRzOyBjbGllbnRzOyBjbGllbnRzID0gbmV4dF9jbGllbnQpIHsKKyAgICBHc3RSdHBCaW5DbGllbnQgKmNsaWVudCA9IChHc3RSdHBCaW5DbGllbnQgKikgY2xpZW50cy0+ZGF0YTsKKyAgICBHU0xpc3QgKnN0cmVhbXMsICpuZXh0X3N0cmVhbTsKKworICAgIG5leHRfY2xpZW50ID0gZ19zbGlzdF9uZXh0IChjbGllbnRzKTsKKworICAgIGZvciAoc3RyZWFtcyA9IGNsaWVudC0+c3RyZWFtczsgc3RyZWFtczsgc3RyZWFtcyA9IG5leHRfc3RyZWFtKSB7CisgICAgICBHc3RSdHBCaW5TdHJlYW0gKm9zdHJlYW0gPSAoR3N0UnRwQmluU3RyZWFtICopIHN0cmVhbXMtPmRhdGE7CisKKyAgICAgIG5leHRfc3RyZWFtID0gZ19zbGlzdF9uZXh0IChzdHJlYW1zKTsKKworICAgICAgaWYgKG9zdHJlYW0gPT0gc3RyZWFtKSB7CisgICAgICAgIGNsaWVudC0+c3RyZWFtcyA9IGdfc2xpc3RfZGVsZXRlX2xpbmsgKGNsaWVudC0+c3RyZWFtcywgc3RyZWFtcyk7CisgICAgICAgIC8qIElmIHRoaXMgd2FzIHRoZSBsYXN0IHN0cmVhbSBiZWxvbmdpbmcgdG8gdGhpcyBjbGllbnQsCisgICAgICAgICAqIGNsZWFuIHVwIHRoZSBjbGllbnQuICovCisgICAgICAgIGlmICgtLWNsaWVudC0+bnN0cmVhbXMgPT0gMCkgeworICAgICAgICAgIGJpbi0+Y2xpZW50cyA9IGdfc2xpc3RfZGVsZXRlX2xpbmsgKGJpbi0+Y2xpZW50cywgY2xpZW50cyk7CisgICAgICAgICAgZnJlZV9jbGllbnQgKGNsaWVudCwgYmluKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBnX2ZyZWUgKHN0cmVhbSk7Cit9CisKKy8qIEdPYmplY3Qgdm1ldGhvZHMgKi8KK3N0YXRpYyB2b2lkIGdzdF9ydHBfYmluX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9iaW5fZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9iaW5fc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9iaW5fZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCisvKiBHc3RFbGVtZW50IHZtZXRob2RzICovCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9iaW5fY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyBHc3RQYWQgKmdzdF9ydHBfYmluX3JlcXVlc3RfbmV3X3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0UGFkVGVtcGxhdGUgKiB0ZW1wbCwgY29uc3QgZ2NoYXIgKiBuYW1lLCBjb25zdCBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX2Jpbl9yZWxlYXNlX3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZCAqIHBhZCk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX2Jpbl9oYW5kbGVfbWVzc2FnZSAoR3N0QmluICogYmluLCBHc3RNZXNzYWdlICogbWVzc2FnZSk7CisKKyNkZWZpbmUgZ3N0X3J0cF9iaW5fcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwQmluLCBnc3RfcnRwX2JpbiwgR1NUX1RZUEVfQklOKTsKKworc3RhdGljIGdib29sZWFuCitfZ3N0X2VsZW1lbnRfYWNjdW11bGF0b3IgKEdTaWduYWxJbnZvY2F0aW9uSGludCAqIGloaW50LAorICAgIEdWYWx1ZSAqIHJldHVybl9hY2N1LCBjb25zdCBHVmFsdWUgKiBoYW5kbGVyX3JldHVybiwgZ3BvaW50ZXIgZHVtbXkpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQ7CisKKyAgZWxlbWVudCA9IGdfdmFsdWVfZ2V0X29iamVjdCAoaGFuZGxlcl9yZXR1cm4pOworICBHU1RfREVCVUcgKCJnb3QgZWxlbWVudCAlIiBHU1RfUFRSX0ZPUk1BVCwgZWxlbWVudCk7CisKKyAgaWYgKCEoaWhpbnQtPnJ1bl90eXBlICYgR19TSUdOQUxfUlVOX0NMRUFOVVApKQorICAgIGdfdmFsdWVfc2V0X29iamVjdCAocmV0dXJuX2FjY3UsIGVsZW1lbnQpOworCisgIC8qIHN0b3AgZW1pc3Npb24gaWYgd2UgaGF2ZSBhbiBlbGVtZW50ICovCisgIHJldHVybiAoZWxlbWVudCA9PSBOVUxMKTsKK30KKworc3RhdGljIGdib29sZWFuCitfZ3N0X2NhcHNfYWNjdW11bGF0b3IgKEdTaWduYWxJbnZvY2F0aW9uSGludCAqIGloaW50LAorICAgIEdWYWx1ZSAqIHJldHVybl9hY2N1LCBjb25zdCBHVmFsdWUgKiBoYW5kbGVyX3JldHVybiwgZ3BvaW50ZXIgZHVtbXkpCit7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgY2FwcyA9IGdfdmFsdWVfZ2V0X2JveGVkIChoYW5kbGVyX3JldHVybik7CisgIEdTVF9ERUJVRyAoImdvdCBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICBpZiAoIShpaGludC0+cnVuX3R5cGUgJiBHX1NJR05BTF9SVU5fQ0xFQU5VUCkpCisgICAgZ192YWx1ZV9zZXRfYm94ZWQgKHJldHVybl9hY2N1LCBjYXBzKTsKKworICAvKiBzdG9wIGVtaXNzaW9uIGlmIHdlIGhhdmUgYSBjYXBzICovCisgIHJldHVybiAoY2FwcyA9PSBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfYmluX2NsYXNzX2luaXQgKEdzdFJ0cEJpbkNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RCaW5DbGFzcyAqZ3N0YmluX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YmluX2NsYXNzID0gKEdzdEJpbkNsYXNzICopIGtsYXNzOworCisgIGdfdHlwZV9jbGFzc19hZGRfcHJpdmF0ZSAoa2xhc3MsIHNpemVvZiAoR3N0UnRwQmluUHJpdmF0ZSkpOworCisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3RfcnRwX2Jpbl9kaXNwb3NlOworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfYmluX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX2Jpbl9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9ydHBfYmluX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0xBVEVOQ1ksCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoImxhdGVuY3kiLCAiQnVmZmVyIGxhdGVuY3kgaW4gbXMiLAorICAgICAgICAgICJEZWZhdWx0IGFtb3VudCBvZiBtcyB0byBidWZmZXIgaW4gdGhlIGppdHRlcmJ1ZmZlcnMiLCAwLAorICAgICAgICAgIEdfTUFYVUlOVCwgREVGQVVMVF9MQVRFTkNZX01TLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRFJPUF9PTl9MQVRFTkNZLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJkcm9wLW9uLWxhdGVuY3kiLAorICAgICAgICAgICJEcm9wIGJ1ZmZlcnMgd2hlbiBtYXhpbXVtIGxhdGVuY3kgaXMgcmVhY2hlZCIsCisgICAgICAgICAgIlRlbGxzIHRoZSBqaXR0ZXJidWZmZXIgdG8gbmV2ZXIgZXhjZWVkIHRoZSBnaXZlbiBsYXRlbmN5IGluIHNpemUiLAorICAgICAgICAgIERFRkFVTFRfRFJPUF9PTl9MQVRFTkNZLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UnRwQmluOjpyZXF1ZXN0LXB0LW1hcDoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzZXNzaW9uOiB0aGUgc2Vzc2lvbgorICAgKiBAcHQ6IHRoZSBwdAorICAgKgorICAgKiBSZXF1ZXN0IHRoZSBwYXlsb2FkIHR5cGUgYXMgI0dzdENhcHMgZm9yIEBwdCBpbiBAc2Vzc2lvbi4KKyAgICovCisgIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX1JFUVVFU1RfUFRfTUFQXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJyZXF1ZXN0LXB0LW1hcCIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywgcmVxdWVzdF9wdF9tYXApLAorICAgICAgX2dzdF9jYXBzX2FjY3VtdWxhdG9yLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR1NUX1RZUEVfQ0FQUywKKyAgICAgIDIsIEdfVFlQRV9VSU5ULCBHX1RZUEVfVUlOVCk7CisKKyAgICAvKioKKyAgICogR3N0UnRwQmluOjpwYXlsb2FkLXR5cGUtY2hhbmdlOgorICAgKiBAcnRwYmluOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNlc3Npb246IHRoZSBzZXNzaW9uCisgICAqIEBwdDogdGhlIHB0CisgICAqCisgICAqIFNpZ25hbCB0aGF0IHRoZSBjdXJyZW50IHBheWxvYWQgdHlwZSBjaGFuZ2VkIHRvIEBwdCBpbiBAc2Vzc2lvbi4KKyAgICovCisgIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX1BBWUxPQURfVFlQRV9DSEFOR0VdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoInBheWxvYWQtdHlwZS1jaGFuZ2UiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwQmluQ2xhc3MsIHBheWxvYWRfdHlwZV9jaGFuZ2UpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdfVFlQRV9VSU5UKTsKKworICAvKioKKyAgICogR3N0UnRwQmluOjpjbGVhci1wdC1tYXA6CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKgorICAgKiBDbGVhciBhbGwgcHJldmlvdXNseSBjYWNoZWQgcHQtbWFwcGluZyBvYnRhaW5lZCB3aXRoCisgICAqICNHc3RSdHBCaW46OnJlcXVlc3QtcHQtbWFwLgorICAgKi8KKyAgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfQ0xFQVJfUFRfTUFQXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJjbGVhci1wdC1tYXAiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QgfCBHX1NJR05BTF9BQ1RJT04sIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwQmluQ2xhc3MsCisgICAgICAgICAgY2xlYXJfcHRfbWFwKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX1ZPSUQsIEdfVFlQRV9OT05FLAorICAgICAgMCwgR19UWVBFX05PTkUpOworCisgIC8qKgorICAgKiBHc3RSdHBCaW46OnJlc2V0LXN5bmM6CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKgorICAgKiBSZXNldCBhbGwgY3VycmVudGx5IGNvbmZpZ3VyZWQgbGlwLXN5bmMgcGFyYW1ldGVycyBhbmQgcmVxdWlyZSBuZXcgU1IKKyAgICogcGFja2V0cyBmb3IgYWxsIHN0cmVhbXMgYmVmb3JlIGxpcC1zeW5jIGlzIGF0dGVtcHRlZCBhZ2Fpbi4KKyAgICovCisgIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX1JFU0VUX1NZTkNdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoInJlc2V0LXN5bmMiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QgfCBHX1NJR05BTF9BQ1RJT04sIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwQmluQ2xhc3MsCisgICAgICAgICAgcmVzZXRfc3luYyksIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19WT0lELCBHX1RZUEVfTk9ORSwKKyAgICAgIDAsIEdfVFlQRV9OT05FKTsKKworICAvKioKKyAgICogR3N0UnRwQmluOjpnZXQtc2Vzc2lvbjoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBpZDogdGhlIHNlc3Npb24gaWQKKyAgICoKKyAgICogUmVxdWVzdCB0aGUgcmVsYXRlZCBHc3RSdHBTZXNzaW9uIGFzICNHc3RFbGVtZW50IHJlbGF0ZWQgd2l0aCBzZXNzaW9uIEBpZC4KKyAgICoKKyAgICogU2luY2U6IDEuOAorICAgKi8KKyAgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfR0VUX1NFU1NJT05dID0KKyAgICAgIGdfc2lnbmFsX25ldyAoImdldC1zZXNzaW9uIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNUIHwgR19TSUdOQUxfQUNUSU9OLCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cEJpbkNsYXNzLAorICAgICAgICAgIGdldF9zZXNzaW9uKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsCisgICAgICBHU1RfVFlQRV9FTEVNRU5ULCAxLCBHX1RZUEVfVUlOVCk7CisKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjo6Z2V0LWludGVybmFsLXNlc3Npb246CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAaWQ6IHRoZSBzZXNzaW9uIGlkCisgICAqCisgICAqIFJlcXVlc3QgdGhlIGludGVybmFsIFJUUFNlc3Npb24gb2JqZWN0IGFzICNHT2JqZWN0IGluIHNlc3Npb24gQGlkLgorICAgKi8KKyAgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfR0VUX0lOVEVSTkFMX1NFU1NJT05dID0KKyAgICAgIGdfc2lnbmFsX25ldyAoImdldC1pbnRlcm5hbC1zZXNzaW9uIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNUIHwgR19TSUdOQUxfQUNUSU9OLCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cEJpbkNsYXNzLAorICAgICAgICAgIGdldF9pbnRlcm5hbF9zZXNzaW9uKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsCisgICAgICBSVFBfVFlQRV9TRVNTSU9OLCAxLCBHX1RZUEVfVUlOVCk7CisKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjo6b24tbmV3LXNzcmM6CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc2Vzc2lvbjogdGhlIHNlc3Npb24KKyAgICogQHNzcmM6IHRoZSBTU1JDCisgICAqCisgICAqIE5vdGlmeSBvZiBhIG5ldyBTU1JDIHRoYXQgZW50ZXJlZCBAc2Vzc2lvbi4KKyAgICovCisgIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX09OX05FV19TU1JDXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1uZXctc3NyYyIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywgb25fbmV3X3NzcmMpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdfVFlQRV9VSU5UKTsKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjo6b24tc3NyYy1jb2xsaXNpb246CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc2Vzc2lvbjogdGhlIHNlc3Npb24KKyAgICogQHNzcmM6IHRoZSBTU1JDCisgICAqCisgICAqIE5vdGlmeSB3aGVuIHdlIGhhdmUgYW4gU1NSQyBjb2xsaXNpb24KKyAgICovCisgIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX09OX1NTUkNfQ09MTElTSU9OXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1zc3JjLWNvbGxpc2lvbiIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywgb25fc3NyY19jb2xsaXNpb24pLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdfVFlQRV9VSU5UKTsKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjo6b24tc3NyYy12YWxpZGF0ZWQ6CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc2Vzc2lvbjogdGhlIHNlc3Npb24KKyAgICogQHNzcmM6IHRoZSBTU1JDCisgICAqCisgICAqIE5vdGlmeSBvZiBhIG5ldyBTU1JDIHRoYXQgYmVjYW1lIHZhbGlkYXRlZC4KKyAgICovCisgIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX09OX1NTUkNfVkFMSURBVEVEXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1zc3JjLXZhbGlkYXRlZCIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywgb25fc3NyY192YWxpZGF0ZWQpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdfVFlQRV9VSU5UKTsKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjo6b24tc3NyYy1hY3RpdmU6CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc2Vzc2lvbjogdGhlIHNlc3Npb24KKyAgICogQHNzcmM6IHRoZSBTU1JDCisgICAqCisgICAqIE5vdGlmeSBvZiBhIFNTUkMgdGhhdCBpcyBhY3RpdmUsIGkuZS4sIHNlbmRpbmcgUlRDUC4KKyAgICovCisgIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX09OX1NTUkNfQUNUSVZFXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1zc3JjLWFjdGl2ZSIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywgb25fc3NyY19hY3RpdmUpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdfVFlQRV9VSU5UKTsKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjo6b24tc3NyYy1zZGVzOgorICAgKiBAcnRwYmluOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNlc3Npb246IHRoZSBzZXNzaW9uCisgICAqIEBzc3JjOiB0aGUgU1NSQworICAgKgorICAgKiBOb3RpZnkgb2YgYSBTU1JDIHRoYXQgaXMgYWN0aXZlLCBpLmUuLCBzZW5kaW5nIFJUQ1AuCisgICAqLworICBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9PTl9TU1JDX1NERVNdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXNzcmMtc2RlcyIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywgb25fc3NyY19zZGVzKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMiwgR19UWVBFX1VJTlQsCisgICAgICBHX1RZUEVfVUlOVCk7CisKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjo6b24tYnllLXNzcmM6CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc2Vzc2lvbjogdGhlIHNlc3Npb24KKyAgICogQHNzcmM6IHRoZSBTU1JDCisgICAqCisgICAqIE5vdGlmeSBvZiBhbiBTU1JDIHRoYXQgYmVjYW1lIGluYWN0aXZlIGJlY2F1c2Ugb2YgYSBCWUUgcGFja2V0LgorICAgKi8KKyAgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfT05fQllFX1NTUkNdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLWJ5ZS1zc3JjIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cEJpbkNsYXNzLCBvbl9ieWVfc3NyYyksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR19UWVBFX05PTkUsIDIsIEdfVFlQRV9VSU5ULAorICAgICAgR19UWVBFX1VJTlQpOworICAvKioKKyAgICogR3N0UnRwQmluOjpvbi1ieWUtdGltZW91dDoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzZXNzaW9uOiB0aGUgc2Vzc2lvbgorICAgKiBAc3NyYzogdGhlIFNTUkMKKyAgICoKKyAgICogTm90aWZ5IG9mIGFuIFNTUkMgdGhhdCBoYXMgdGltZWQgb3V0IGJlY2F1c2Ugb2YgQllFCisgICAqLworICBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9PTl9CWUVfVElNRU9VVF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tYnllLXRpbWVvdXQiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwQmluQ2xhc3MsIG9uX2J5ZV90aW1lb3V0KSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMiwgR19UWVBFX1VJTlQsCisgICAgICBHX1RZUEVfVUlOVCk7CisgIC8qKgorICAgKiBHc3RSdHBCaW46Om9uLXRpbWVvdXQ6CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc2Vzc2lvbjogdGhlIHNlc3Npb24KKyAgICogQHNzcmM6IHRoZSBTU1JDCisgICAqCisgICAqIE5vdGlmeSBvZiBhbiBTU1JDIHRoYXQgaGFzIHRpbWVkIG91dAorICAgKi8KKyAgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfT05fVElNRU9VVF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tdGltZW91dCIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywgb25fdGltZW91dCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR19UWVBFX05PTkUsIDIsIEdfVFlQRV9VSU5ULAorICAgICAgR19UWVBFX1VJTlQpOworICAvKioKKyAgICogR3N0UnRwQmluOjpvbi1zZW5kZXItdGltZW91dDoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzZXNzaW9uOiB0aGUgc2Vzc2lvbgorICAgKiBAc3NyYzogdGhlIFNTUkMKKyAgICoKKyAgICogTm90aWZ5IG9mIGEgc2VuZGVyIFNTUkMgdGhhdCBoYXMgdGltZWQgb3V0IGFuZCBiZWNhbWUgYSByZWNlaXZlcgorICAgKi8KKyAgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfT05fU0VOREVSX1RJTUVPVVRdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXNlbmRlci10aW1lb3V0IiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cEJpbkNsYXNzLCBvbl9zZW5kZXJfdGltZW91dCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR19UWVBFX05PTkUsIDIsIEdfVFlQRV9VSU5ULAorICAgICAgR19UWVBFX1VJTlQpOworCisgIC8qKgorICAgKiBHc3RSdHBCaW46Om9uLW5wdC1zdG9wOgorICAgKiBAcnRwYmluOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNlc3Npb246IHRoZSBzZXNzaW9uCisgICAqIEBzc3JjOiB0aGUgU1NSQworICAgKgorICAgKiBOb3RpZnkgdGhhdCBTU1JDIHNlbmRlciBoYXMgc2VudCBkYXRhIHVwIHRvIHRoZSBjb25maWd1cmVkIE5QVCBzdG9wIHRpbWUuCisgICAqLworICBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9PTl9OUFRfU1RPUF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tbnB0LXN0b3AiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwQmluQ2xhc3MsIG9uX25wdF9zdG9wKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMiwgR19UWVBFX1VJTlQsCisgICAgICBHX1RZUEVfVUlOVCk7CisKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjo6cmVxdWVzdC1ydHAtZW5jb2RlcjoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzZXNzaW9uOiB0aGUgc2Vzc2lvbgorICAgKgorICAgKiBSZXF1ZXN0IGFuIFJUUCBlbmNvZGVyIGVsZW1lbnQgZm9yIHRoZSBnaXZlbiBAc2Vzc2lvbi4gVGhlIGVuY29kZXIKKyAgICogZWxlbWVudCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBiaW4gaWYgbm90IHByZXZpb3VzbHkgYWRkZWQuCisgICAqCisgICAqIElmIG5vIGhhbmRsZXIgaXMgY29ubmVjdGVkLCBubyBlbmNvZGVyIHdpbGwgYmUgdXNlZC4KKyAgICoKKyAgICogU2luY2U6IDEuNAorICAgKi8KKyAgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfUkVRVUVTVF9SVFBfRU5DT0RFUl0gPQorICAgICAgZ19zaWduYWxfbmV3ICgicmVxdWVzdC1ydHAtZW5jb2RlciIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywKKyAgICAgICAgICByZXF1ZXN0X3J0cF9lbmNvZGVyKSwgX2dzdF9lbGVtZW50X2FjY3VtdWxhdG9yLCBOVUxMLAorICAgICAgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdTVF9UWVBFX0VMRU1FTlQsIDEsIEdfVFlQRV9VSU5UKTsKKworICAvKioKKyAgICogR3N0UnRwQmluOjpyZXF1ZXN0LXJ0cC1kZWNvZGVyOgorICAgKiBAcnRwYmluOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNlc3Npb246IHRoZSBzZXNzaW9uCisgICAqCisgICAqIFJlcXVlc3QgYW4gUlRQIGRlY29kZXIgZWxlbWVudCBmb3IgdGhlIGdpdmVuIEBzZXNzaW9uLiBUaGUgZGVjb2RlcgorICAgKiBlbGVtZW50IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGJpbiBpZiBub3QgcHJldmlvdXNseSBhZGRlZC4KKyAgICoKKyAgICogSWYgbm8gaGFuZGxlciBpcyBjb25uZWN0ZWQsIG5vIGVuY29kZXIgd2lsbCBiZSB1c2VkLgorICAgKgorICAgKiBTaW5jZTogMS40CisgICAqLworICBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9SRVFVRVNUX1JUUF9ERUNPREVSXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJyZXF1ZXN0LXJ0cC1kZWNvZGVyIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cEJpbkNsYXNzLAorICAgICAgICAgIHJlcXVlc3RfcnRwX2RlY29kZXIpLCBfZ3N0X2VsZW1lbnRfYWNjdW11bGF0b3IsIE5VTEwsCisgICAgICBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR1NUX1RZUEVfRUxFTUVOVCwgMSwgR19UWVBFX1VJTlQpOworCisgIC8qKgorICAgKiBHc3RSdHBCaW46OnJlcXVlc3QtcnRjcC1lbmNvZGVyOgorICAgKiBAcnRwYmluOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNlc3Npb246IHRoZSBzZXNzaW9uCisgICAqCisgICAqIFJlcXVlc3QgYW4gUlRDUCBlbmNvZGVyIGVsZW1lbnQgZm9yIHRoZSBnaXZlbiBAc2Vzc2lvbi4gVGhlIGVuY29kZXIKKyAgICogZWxlbWVudCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBiaW4gaWYgbm90IHByZXZpb3VzbHkgYWRkZWQuCisgICAqCisgICAqIElmIG5vIGhhbmRsZXIgaXMgY29ubmVjdGVkLCBubyBlbmNvZGVyIHdpbGwgYmUgdXNlZC4KKyAgICoKKyAgICogU2luY2U6IDEuNAorICAgKi8KKyAgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfUkVRVUVTVF9SVENQX0VOQ09ERVJdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoInJlcXVlc3QtcnRjcC1lbmNvZGVyIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cEJpbkNsYXNzLAorICAgICAgICAgIHJlcXVlc3RfcnRjcF9lbmNvZGVyKSwgX2dzdF9lbGVtZW50X2FjY3VtdWxhdG9yLCBOVUxMLAorICAgICAgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdTVF9UWVBFX0VMRU1FTlQsIDEsIEdfVFlQRV9VSU5UKTsKKworICAvKioKKyAgICogR3N0UnRwQmluOjpyZXF1ZXN0LXJ0Y3AtZGVjb2RlcjoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzZXNzaW9uOiB0aGUgc2Vzc2lvbgorICAgKgorICAgKiBSZXF1ZXN0IGFuIFJUQ1AgZGVjb2RlciBlbGVtZW50IGZvciB0aGUgZ2l2ZW4gQHNlc3Npb24uIFRoZSBkZWNvZGVyCisgICAqIGVsZW1lbnQgd2lsbCBiZSBhZGRlZCB0byB0aGUgYmluIGlmIG5vdCBwcmV2aW91c2x5IGFkZGVkLgorICAgKgorICAgKiBJZiBubyBoYW5kbGVyIGlzIGNvbm5lY3RlZCwgbm8gZW5jb2RlciB3aWxsIGJlIHVzZWQuCisgICAqCisgICAqIFNpbmNlOiAxLjQKKyAgICovCisgIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX1JFUVVFU1RfUlRDUF9ERUNPREVSXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJyZXF1ZXN0LXJ0Y3AtZGVjb2RlciIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywKKyAgICAgICAgICByZXF1ZXN0X3J0Y3BfZGVjb2RlciksIF9nc3RfZWxlbWVudF9hY2N1bXVsYXRvciwgTlVMTCwKKyAgICAgIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHU1RfVFlQRV9FTEVNRU5ULCAxLCBHX1RZUEVfVUlOVCk7CisKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjo6bmV3LWppdHRlcmJ1ZmZlcjoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBqaXR0ZXJidWZmZXI6IHRoZSBuZXcgaml0dGVyYnVmZmVyCisgICAqIEBzZXNzaW9uOiB0aGUgc2Vzc2lvbgorICAgKiBAc3NyYzogdGhlIFNTUkMKKyAgICoKKyAgICogTm90aWZ5IHRoYXQgYSBuZXcgQGppdHRlcmJ1ZmZlciB3YXMgY3JlYXRlZCBmb3IgQHNlc3Npb24gYW5kIEBzc3JjLgorICAgKiBUaGlzIHNpZ25hbCBjYW4sIGZvciBleGFtcGxlLCBiZSB1c2VkIHRvIGNvbmZpZ3VyZSBAaml0dGVyYnVmZmVyLgorICAgKgorICAgKiBTaW5jZTogMS40CisgICAqLworICBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9ORVdfSklUVEVSQlVGRkVSXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJuZXctaml0dGVyYnVmZmVyIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cEJpbkNsYXNzLAorICAgICAgICAgIG5ld19qaXR0ZXJidWZmZXIpLCBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywKKyAgICAgIEdfVFlQRV9OT05FLCAzLCBHU1RfVFlQRV9FTEVNRU5ULCBHX1RZUEVfVUlOVCwgR19UWVBFX1VJTlQpOworCisgIC8qKgorICAgKiBHc3RSdHBCaW46OnJlcXVlc3QtYXV4LXNlbmRlcjoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzZXNzaW9uOiB0aGUgc2Vzc2lvbgorICAgKgorICAgKiBSZXF1ZXN0IGFuIEFVWCBzZW5kZXIgZWxlbWVudCBmb3IgdGhlIGdpdmVuIEBzZXNzaW9uLiBUaGUgQVVYCisgICAqIGVsZW1lbnQgd2lsbCBiZSBhZGRlZCB0byB0aGUgYmluLgorICAgKgorICAgKiBJZiBubyBoYW5kbGVyIGlzIGNvbm5lY3RlZCwgbm8gQVVYIGVsZW1lbnQgd2lsbCBiZSB1c2VkLgorICAgKgorICAgKiBTaW5jZTogMS40CisgICAqLworICBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9SRVFVRVNUX0FVWF9TRU5ERVJdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoInJlcXVlc3QtYXV4LXNlbmRlciIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywKKyAgICAgICAgICByZXF1ZXN0X2F1eF9zZW5kZXIpLCBfZ3N0X2VsZW1lbnRfYWNjdW11bGF0b3IsIE5VTEwsCisgICAgICBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR1NUX1RZUEVfRUxFTUVOVCwgMSwgR19UWVBFX1VJTlQpOworICAvKioKKyAgICogR3N0UnRwQmluOjpyZXF1ZXN0LWF1eC1yZWNlaXZlcjoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzZXNzaW9uOiB0aGUgc2Vzc2lvbgorICAgKgorICAgKiBSZXF1ZXN0IGFuIEFVWCByZWNlaXZlciBlbGVtZW50IGZvciB0aGUgZ2l2ZW4gQHNlc3Npb24uIFRoZSBBVVgKKyAgICogZWxlbWVudCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBiaW4uCisgICAqCisgICAqIElmIG5vIGhhbmRsZXIgaXMgY29ubmVjdGVkLCBubyBBVVggZWxlbWVudCB3aWxsIGJlIHVzZWQuCisgICAqCisgICAqIFNpbmNlOiAxLjQKKyAgICovCisgIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX1JFUVVFU1RfQVVYX1JFQ0VJVkVSXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJyZXF1ZXN0LWF1eC1yZWNlaXZlciIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywKKyAgICAgICAgICByZXF1ZXN0X2F1eF9yZWNlaXZlciksIF9nc3RfZWxlbWVudF9hY2N1bXVsYXRvciwgTlVMTCwKKyAgICAgIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHU1RfVFlQRV9FTEVNRU5ULCAxLCBHX1RZUEVfVUlOVCk7CisgIC8qKgorICAgKiBHc3RSdHBCaW46Om9uLW5ldy1zZW5kZXItc3NyYzoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzZXNzaW9uOiB0aGUgc2Vzc2lvbgorICAgKiBAc3NyYzogdGhlIHNlbmRlciBTU1JDCisgICAqCisgICAqIE5vdGlmeSBvZiBhIG5ldyBzZW5kZXIgU1NSQyB0aGF0IGVudGVyZWQgQHNlc3Npb24uCisgICAqCisgICAqIFNpbmNlOiAxLjgKKyAgICovCisgIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX09OX05FV19TRU5ERVJfU1NSQ10gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tbmV3LXNlbmRlci1zc3JjIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cEJpbkNsYXNzLCBvbl9uZXdfc2VuZGVyX3NzcmMpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdfVFlQRV9VSU5UKTsKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjo6b24tc2VuZGVyLXNzcmMtYWN0aXZlOgorICAgKiBAcnRwYmluOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNlc3Npb246IHRoZSBzZXNzaW9uCisgICAqIEBzc3JjOiB0aGUgc2VuZGVyIFNTUkMKKyAgICoKKyAgICogTm90aWZ5IG9mIGEgc2VuZGVyIFNTUkMgdGhhdCBpcyBhY3RpdmUsIGkuZS4sIHNlbmRpbmcgUlRDUC4KKyAgICoKKyAgICogU2luY2U6IDEuOAorICAgKi8KKyAgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfT05fU0VOREVSX1NTUkNfQUNUSVZFXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1zZW5kZXItc3NyYy1hY3RpdmUiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwQmluQ2xhc3MsCisgICAgICAgICAgb25fc2VuZGVyX3NzcmNfYWN0aXZlKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsCisgICAgICBHX1RZUEVfTk9ORSwgMiwgR19UWVBFX1VJTlQsIEdfVFlQRV9VSU5UKTsKKworCisgIC8qKgorICAgKiBHc3RSdHBCaW46Om9uLWJ1bmRsZWQtc3NyYzoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzc3JjOiB0aGUgYnVuZGxlZCBTU1JDCisgICAqCisgICAqIE5vdGlmeSBvZiBhIG5ldyBpbmNvbWluZyBidW5kbGVkIFNTUkMuIElmIG5vIGhhbmRsZXIgaXMgY29ubmVjdGVkIHRvIHRoZQorICAgKiBzaWduYWwgdGhlbiB0aGUgI0dzdFJ0cFNlc3Npb24gY3JlYXRlZCBmb3IgdGhlIHJlY3ZfcnRwX3NpbmtfXCV1CisgICAqIHJlcXVlc3QgcGFkIHdpbGwgYmUgbWFuYWdpbmcgdGhpcyBuZXcgU1NSQy4gSG93ZXZlciBpZiB0aGVyZSBpcyBhIGhhbmRsZXIKKyAgICogY29ubmVjdGVkIHRoZW4gdGhlIGFwcGxpY2F0aW9uIGNhbiBkZWNpZGVkIHRvIGRpc3BhdGNoIHRoaXMgbmV3IHN0cmVhbSB0bworICAgKiBhbm90aGVyIHNlc3Npb24gYnkgcHJvdmlkaW5nIGl0cyBJRCBhcyByZXR1cm4gdmFsdWUgb2YgdGhlIGhhbmRsZXIuIFRoaXMKKyAgICogY2FuIGJlIHBhcnRpY3VsYXJseSB1c2VmdWwgdG8ga2VlcCByZXRyYW5zbWlzc2lvbiBTU1JDcyBncm91cGVkIHdpdGggdGhlCisgICAqIHNlc3Npb24gZm9yIHdoaWNoIHRoZXkgaGFuZGxlIHJldHJhbnNtaXNzaW9uLgorICAgKgorICAgKiBTaW5jZTogMS4xMgorICAgKi8KKyAgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfT05fQlVORExFRF9TU1JDXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1idW5kbGVkLXNzcmMiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwQmluQ2xhc3MsCisgICAgICAgICAgb25fYnVuZGxlZF9zc3JjKSwgTlVMTCwgTlVMTCwKKyAgICAgIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfVUlOVCwgMSwgR19UWVBFX1VJTlQpOworCisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TREVTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgic2RlcyIsICJTREVTIiwKKyAgICAgICAgICAiVGhlIFNERVMgaXRlbXMgb2YgdGhpcyBzZXNzaW9uIiwKKyAgICAgICAgICBHU1RfVFlQRV9TVFJVQ1RVUkUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRE9fTE9TVCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZG8tbG9zdCIsICJEbyBMb3N0IiwKKyAgICAgICAgICAiU2VuZCBhbiBldmVudCBkb3duc3RyZWFtIHdoZW4gYSBwYWNrZXQgaXMgbG9zdCIsIERFRkFVTFRfRE9fTE9TVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0FVVE9SRU1PVkUsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImF1dG9yZW1vdmUiLCAiQXV0byBSZW1vdmUiLAorICAgICAgICAgICJBdXRvbWF0aWNhbGx5IHJlbW92ZSB0aW1lZCBvdXQgc291cmNlcyIsIERFRkFVTFRfQVVUT1JFTU9WRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0lHTk9SRV9QVCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiaWdub3JlLXB0IiwgIklnbm9yZSBQVCIsCisgICAgICAgICAgIkRvIG5vdCBkZW11bHRpcGxleCBiYXNlZCBvbiBQVCB2YWx1ZXMiLCBERUZBVUxUX0lHTk9SRV9QVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1VTRV9QSVBFTElORV9DTE9DSywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgidXNlLXBpcGVsaW5lLWNsb2NrIiwgIlVzZSBwaXBlbGluZSBjbG9jayIsCisgICAgICAgICAgIlVzZSB0aGUgcGlwZWxpbmUgcnVubmluZy10aW1lIHRvIHNldCB0aGUgTlRQIHRpbWUgaW4gdGhlIFJUQ1AgU1IgbWVzc2FnZXMgIgorICAgICAgICAgICIoREVQUkVDQVRFRDogVXNlIG50cC10aW1lLXNvdXJjZSBwcm9wZXJ0eSkiLAorICAgICAgICAgIERFRkFVTFRfVVNFX1BJUEVMSU5FX0NMT0NLLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdfUEFSQU1fREVQUkVDQVRFRCkpOworICAvKioKKyAgICogR3N0UnRwQmluOmJ1ZmZlci1tb2RlOgorICAgKgorICAgKiBDb250cm9sIHRoZSBidWZmZXJpbmcgYW5kIHRpbWVzdGFtcGluZyBtb2RlIHVzZWQgYnkgdGhlIGppdHRlcmJ1ZmZlci4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQlVGRkVSX01PREUsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoImJ1ZmZlci1tb2RlIiwgIkJ1ZmZlciBNb2RlIiwKKyAgICAgICAgICAiQ29udHJvbCB0aGUgYnVmZmVyaW5nIGFsZ29yaXRobSBpbiB1c2UiLCBSVFBfVFlQRV9KSVRURVJfQlVGRkVSX01PREUsCisgICAgICAgICAgREVGQVVMVF9CVUZGRVJfTU9ERSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RSdHBCaW46bnRwLXN5bmM6CisgICAqCisgICAqIFNldCB0aGUgTlRQIHRpbWUgZnJvbSB0aGUgc2VuZGVyIHJlcG9ydHMgYXMgdGhlIHJ1bm5pbmctdGltZSBvbiB0aGUKKyAgICogYnVmZmVycy4gV2hlbiBib3RoIHRoZSBzZW5kZXIgYW5kIHJlY2VpdmVyIGhhdmUgc3ljaHJvbml6ZWQKKyAgICogcnVubmluZy10aW1lLCBpLmUuIHdoZW4gdGhlIGNsb2NrIGFuZCBiYXNlLXRpbWUgaXMgc2hhcmVkCisgICAqIGJldHdlZW4gdGhlIHJlY2VpdmVycyBhbmQgdGhlIGFuZCB0aGUgc2VuZGVycywgdGhpcyBvcHRpb24gY2FuIGJlCisgICAqIHVzZWQgdG8gc3luY2hyb25pemUgcmVjZWl2ZXJzIG9uIG11bHRpcGxlIG1hY2hpbmVzLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9OVFBfU1lOQywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgibnRwLXN5bmMiLCAiU3luYyBvbiBOVFAgY2xvY2siLAorICAgICAgICAgICJTeW5jaHJvbml6ZSByZWNlaXZlZCBzdHJlYW1zIHRvIHRoZSBOVFAgY2xvY2siLCBERUZBVUxUX05UUF9TWU5DLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSdHBCaW46cnRjcC1zeW5jOgorICAgKgorICAgKiBJZiBub3Qgc3luY2hyb25pemluZyAoZGlyZWN0bHkpIHRvIHRoZSBOVFAgY2xvY2ssIGRldGVybWluZXMgaG93IHRvIHN5bmMKKyAgICogdGhlIHZhcmlvdXMgc3RyZWFtcy4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUlRDUF9TWU5DLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJydGNwLXN5bmMiLCAiUlRDUCBTeW5jIiwKKyAgICAgICAgICAiVXNlIG9mIFJUQ1AgU1IgaW4gc3luY2hyb25pemF0aW9uIiwgR1NUX1JUUF9CSU5fUlRDUF9TWU5DX1RZUEUsCisgICAgICAgICAgREVGQVVMVF9SVENQX1NZTkMsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSdHBCaW46cnRjcC1zeW5jLWludGVydmFsOgorICAgKgorICAgKiBEZXRlcm1pbmVzIGhvdyBvZnRlbiB0byBzeW5jIHN0cmVhbXMgdXNpbmcgUlRDUCBkYXRhLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SVENQX1NZTkNfSU5URVJWQUwsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInJ0Y3Atc3luYy1pbnRlcnZhbCIsICJSVENQIFN5bmMgSW50ZXJ2YWwiLAorICAgICAgICAgICJSVENQIFNSIGludGVydmFsIHN5bmNocm9uaXphdGlvbiAobXMpICgwID0gYWx3YXlzKSIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCBERUZBVUxUX1JUQ1BfU1lOQ19JTlRFUlZBTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RPX1NZTkNfRVZFTlQsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImRvLXN5bmMtZXZlbnQiLCAiRG8gU3luYyBFdmVudCIsCisgICAgICAgICAgIlNlbmQgZXZlbnQgZG93bnN0cmVhbSB3aGVuIGEgc3RyZWFtIGlzIHN5bmNocm9uaXplZCB0byB0aGUgc2VuZGVyIiwKKyAgICAgICAgICBERUZBVUxUX0RPX1NZTkNfRVZFTlQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSdHBCaW46ZG8tcmV0cmFuc21pc3Npb246CisgICAqCisgICAqIEVuYWJsZXMgUlRQIHJldHJhbnNtaXNzaW9uIG9uIGFsbCBzdHJlYW1zLiBUbyBjb250cm9sIHJldHJhbnNtaXNzaW9uIG9uCisgICAqIGEgcGVyLVNTUkMgYmFzaXMsIGNvbm5lY3QgdG8gdGhlICNHc3RSdHBCaW46Om5ldy1qaXR0ZXJidWZmZXIgc2lnbmFsIGFuZAorICAgKiBzZXQgdGhlICNHc3RSdHBKaXR0ZXJCdWZmZXI6OmRvLXJldHJhbnNtaXNzaW9uIHByb3BlcnR5IG9uIHRoZQorICAgKiAjR3N0UnRwSml0dGVyQnVmZmVyIG9iamVjdCBpbnN0ZWFkLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ET19SRVRSQU5TTUlTU0lPTiwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZG8tcmV0cmFuc21pc3Npb24iLCAiRG8gcmV0cmFuc21pc3Npb24iLAorICAgICAgICAgICJFbmFibGUgcmV0cmFuc21pc3Npb24gb24gYWxsIHN0cmVhbXMiLAorICAgICAgICAgIERFRkFVTFRfRE9fUkVUUkFOU01JU1NJT04sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjpydHAtcHJvZmlsZToKKyAgICoKKyAgICogU2V0cyB0aGUgZGVmYXVsdCBSVFAgcHJvZmlsZSBvZiBuZXdseSBjcmVhdGVkIFJUUCBzZXNzaW9ucy4gVGhlCisgICAqIHByb2ZpbGUgY2FuIGJlIGNoYW5nZWQgYWZ0ZXJ3YXJkcyBvbiBhIHBlci1zZXNzaW9uIGJhc2lzLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SVFBfUFJPRklMRSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgicnRwLXByb2ZpbGUiLCAiUlRQIFByb2ZpbGUiLAorICAgICAgICAgICJEZWZhdWx0IFJUUCBwcm9maWxlIG9mIG5ld2x5IGNyZWF0ZWQgc2Vzc2lvbnMiLAorICAgICAgICAgIEdTVF9UWVBFX1JUUF9QUk9GSUxFLCBERUZBVUxUX1JUUF9QUk9GSUxFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTlRQX1RJTUVfU09VUkNFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJudHAtdGltZS1zb3VyY2UiLCAiTlRQIFRpbWUgU291cmNlIiwKKyAgICAgICAgICAiTlRQIHRpbWUgc291cmNlIGZvciBSVENQIHBhY2tldHMiLAorICAgICAgICAgIGdzdF9ydHBfbnRwX3RpbWVfc291cmNlX2dldF90eXBlICgpLCBERUZBVUxUX05UUF9USU1FX1NPVVJDRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JUQ1BfU1lOQ19TRU5EX1RJTUUsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInJ0Y3Atc3luYy1zZW5kLXRpbWUiLCAiUlRDUCBTeW5jIFNlbmQgVGltZSIsCisgICAgICAgICAgIlVzZSBzZW5kIHRpbWUgb3IgY2FwdHVyZSB0aW1lIGZvciBSVENQIHN5bmMgIgorICAgICAgICAgICIoVFJVRSA9IHNlbmQgdGltZSwgRkFMU0UgPSBjYXB0dXJlIHRpbWUpIiwKKyAgICAgICAgICBERUZBVUxUX1JUQ1BfU1lOQ19TRU5EX1RJTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoIm1heC1ydGNwLXJ0cC10aW1lLWRpZmYiLCAiTWF4IFJUQ1AgUlRQIFRpbWUgRGlmZiIsCisgICAgICAgICAgIk1heGltdW0gYW1vdW50IG9mIHRpbWUgaW4gbXMgdGhhdCB0aGUgUlRQIHRpbWUgaW4gUlRDUCBTUnMgIgorICAgICAgICAgICJpcyBhbGxvd2VkIHRvIGJlIGFoZWFkICgtMSBkaXNhYmxlZCkiLCAtMSwgR19NQVhJTlQsCisgICAgICAgICAgREVGQVVMVF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX0RST1BPVVRfVElNRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LWRyb3BvdXQtdGltZSIsICJNYXggZHJvcG91dCB0aW1lIiwKKyAgICAgICAgICAiVGhlIG1heGltdW0gdGltZSAobWlsbGlzZWNvbmRzKSBvZiBtaXNzaW5nIHBhY2tldHMgdG9sZXJhdGVkLiIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCBERUZBVUxUX01BWF9EUk9QT1VUX1RJTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfTUlTT1JERVJfVElNRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LW1pc29yZGVyLXRpbWUiLCAiTWF4IG1pc29yZGVyIHRpbWUiLAorICAgICAgICAgICJUaGUgbWF4aW11bSB0aW1lIChtaWxsaXNlY29uZHMpIG9mIG1pc29yZGVyZWQgcGFja2V0cyB0b2xlcmF0ZWQuIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIERFRkFVTFRfTUFYX01JU09SREVSX1RJTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SRkM3MjczX1NZTkMsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInJmYzcyNzMtc3luYyIsICJTeW5jIG9uIFJGQzcyNzMgY2xvY2siLAorICAgICAgICAgICJTeW5jaHJvbml6ZSByZWNlaXZlZCBzdHJlYW1zIHRvIHRoZSBSRkM3MjczIGNsb2NrICIKKyAgICAgICAgICAiKHJlcXVpcmVzIGNsb2NrIGFuZCBvZmZzZXQgdG8gYmUgcHJvdmlkZWQpIiwgREVGQVVMVF9SRkM3MjczX1NZTkMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfU1RSRUFNUywKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LXN0cmVhbXMiLCAiTWF4IFN0cmVhbXMiLAorICAgICAgICAgICJUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RyZWFtcyB0byBjcmVhdGUgZm9yIG9uZSBzZXNzaW9uIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIERFRkFVTFRfTUFYX1NUUkVBTVMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjptYXgtdHMtb2Zmc2V0LWFkanVzdG1lbnQ6CisgICAqCisgICAqIFN5bmNpbmcgdGltZSBzdGFtcHMgdG8gTlRQIHRpbWUgYWRkcyBhIHRpbWUgb2Zmc2V0LiBUaGlzIHBhcmFtZXRlcgorICAgKiBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5hbm9zZWNvbmRzIHBlciBmcmFtZSB0aGF0IHRoaXMgdGltZSBvZmZzZXQKKyAgICogbWF5IGJlIGFkanVzdGVkIHdpdGguIFRoaXMgaXMgdXNlZCB0byBhdm9pZCBzdWRkZW4gbGFyZ2UgY2hhbmdlcyB0byB0aW1lCisgICAqIHN0YW1wcy4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX1RTX09GRlNFVF9BREpVU1RNRU5ULAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoIm1heC10cy1vZmZzZXQtYWRqdXN0bWVudCIsCisgICAgICAgICAgIk1heCBUaW1lc3RhbXAgT2Zmc2V0IEFkanVzdG1lbnQiLAorICAgICAgICAgICJUaGUgbWF4aW11bSBudW1iZXIgb2YgbmFub3NlY29uZHMgcGVyIGZyYW1lIHRoYXQgdGltZSBzdGFtcCBvZmZzZXRzICIKKyAgICAgICAgICAibWF5IGJlIGFkanVzdGVkICgwID0gbm8gbGltaXQpLiIsIDAsIEdfTUFYVUlOVDY0LAorICAgICAgICAgIERFRkFVTFRfTUFYX1RTX09GRlNFVF9BREpVU1RNRU5ULCBHX1BBUkFNX1JFQURXUklURSB8CisgICAgICAgICAgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSdHBCaW46bWF4LXRzLW9mZnNldDoKKyAgICoKKyAgICogVXNlZCB0byBzZXQgYW4gdXBwZXIgbGltaXQgb2YgaG93IGxhcmdlIGEgdGltZSBvZmZzZXQgbWF5IGJlLiBUaGlzCisgICAqIGlzIHVzZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IHVucmVhbGlzdGljIHZhbHVlcyBhcyBhIHJlc3VsdCBvZiBlaXRoZXIKKyAgICogY2xpZW50LHNlcnZlciBvciBjbG9jayBpc3N1ZXMuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01BWF9UU19PRkZTRVQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50NjQgKCJtYXgtdHMtb2Zmc2V0IiwgIk1heCBUUyBPZmZzZXQiLAorICAgICAgICAgICJUaGUgbWF4aW11bSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgdGltZSBvZmZzZXQgaW4gKG5hbm9zZWNvbmRzKS4gIgorICAgICAgICAgICJOb3RlLCBpZiB0aGUgbnRwLXN5bmMgcGFyYW1ldGVyIGlzIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAiCisgICAgICAgICAgImNoYW5nZWQgdG8gMCAobm8gbGltaXQpIiwgMCwgR19NQVhJTlQ2NCwgREVGQVVMVF9NQVhfVFNfT0ZGU0VULAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2Jpbl9jaGFuZ2Vfc3RhdGUpOworICBnc3RlbGVtZW50X2NsYXNzLT5yZXF1ZXN0X25ld19wYWQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfYmluX3JlcXVlc3RfbmV3X3BhZCk7CisgIGdzdGVsZW1lbnRfY2xhc3MtPnJlbGVhc2VfcGFkID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfYmluX3JlbGVhc2VfcGFkKTsKKworICAvKiBzaW5rIHBhZHMgKi8KKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmcnRwYmluX3JlY3ZfcnRwX3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZydHBiaW5fcmVjdl9ydGNwX3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZydHBiaW5fc2VuZF9ydHBfc2lua190ZW1wbGF0ZSk7CisKKyAgLyogc3JjIHBhZHMgKi8KKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmcnRwYmluX3JlY3ZfcnRwX3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJnJ0cGJpbl9zZW5kX3J0Y3Bfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmcnRwYmluX3NlbmRfcnRwX3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlJUUCBCaW4iLAorICAgICAgIkZpbHRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUmVhbC1UaW1lIFRyYW5zcG9ydCBQcm90b2NvbCBiaW4iLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgZ3N0YmluX2NsYXNzLT5oYW5kbGVfbWVzc2FnZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2Jpbl9oYW5kbGVfbWVzc2FnZSk7CisKKyAga2xhc3MtPmNsZWFyX3B0X21hcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2Jpbl9jbGVhcl9wdF9tYXApOworICBrbGFzcy0+cmVzZXRfc3luYyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2Jpbl9yZXNldF9zeW5jKTsKKyAga2xhc3MtPmdldF9zZXNzaW9uID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfYmluX2dldF9zZXNzaW9uKTsKKyAga2xhc3MtPmdldF9pbnRlcm5hbF9zZXNzaW9uID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2Jpbl9nZXRfaW50ZXJuYWxfc2Vzc2lvbik7CisgIGtsYXNzLT5yZXF1ZXN0X3J0cF9lbmNvZGVyID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfYmluX3JlcXVlc3RfZW5jb2Rlcik7CisgIGtsYXNzLT5yZXF1ZXN0X3J0cF9kZWNvZGVyID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfYmluX3JlcXVlc3RfZGVjb2Rlcik7CisgIGtsYXNzLT5yZXF1ZXN0X3J0Y3BfZW5jb2RlciA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2Jpbl9yZXF1ZXN0X2VuY29kZXIpOworICBrbGFzcy0+cmVxdWVzdF9ydGNwX2RlY29kZXIgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9iaW5fcmVxdWVzdF9kZWNvZGVyKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3J0cF9iaW5fZGVidWcsICJydHBiaW4iLCAwLCAiUlRQIGJpbiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9iaW5faW5pdCAoR3N0UnRwQmluICogcnRwYmluKQoreworICBnY2hhciAqY25hbWU7CisKKyAgcnRwYmluLT5wcml2ID0gR1NUX1JUUF9CSU5fR0VUX1BSSVZBVEUgKHJ0cGJpbik7CisgIGdfbXV0ZXhfaW5pdCAoJnJ0cGJpbi0+cHJpdi0+YmluX2xvY2spOworICBnX211dGV4X2luaXQgKCZydHBiaW4tPnByaXYtPmR5bl9sb2NrKTsKKworICBydHBiaW4tPmxhdGVuY3lfbXMgPSBERUZBVUxUX0xBVEVOQ1lfTVM7CisgIHJ0cGJpbi0+bGF0ZW5jeV9ucyA9IERFRkFVTFRfTEFURU5DWV9NUyAqIEdTVF9NU0VDT05EOworICBydHBiaW4tPmRyb3Bfb25fbGF0ZW5jeSA9IERFRkFVTFRfRFJPUF9PTl9MQVRFTkNZOworICBydHBiaW4tPmRvX2xvc3QgPSBERUZBVUxUX0RPX0xPU1Q7CisgIHJ0cGJpbi0+aWdub3JlX3B0ID0gREVGQVVMVF9JR05PUkVfUFQ7CisgIHJ0cGJpbi0+bnRwX3N5bmMgPSBERUZBVUxUX05UUF9TWU5DOworICBydHBiaW4tPnJ0Y3Bfc3luYyA9IERFRkFVTFRfUlRDUF9TWU5DOworICBydHBiaW4tPnJ0Y3Bfc3luY19pbnRlcnZhbCA9IERFRkFVTFRfUlRDUF9TWU5DX0lOVEVSVkFMOworICBydHBiaW4tPnByaXYtPmF1dG9yZW1vdmUgPSBERUZBVUxUX0FVVE9SRU1PVkU7CisgIHJ0cGJpbi0+YnVmZmVyX21vZGUgPSBERUZBVUxUX0JVRkZFUl9NT0RFOworICBydHBiaW4tPnVzZV9waXBlbGluZV9jbG9jayA9IERFRkFVTFRfVVNFX1BJUEVMSU5FX0NMT0NLOworICBydHBiaW4tPnNlbmRfc3luY19ldmVudCA9IERFRkFVTFRfRE9fU1lOQ19FVkVOVDsKKyAgcnRwYmluLT5kb19yZXRyYW5zbWlzc2lvbiA9IERFRkFVTFRfRE9fUkVUUkFOU01JU1NJT047CisgIHJ0cGJpbi0+cnRwX3Byb2ZpbGUgPSBERUZBVUxUX1JUUF9QUk9GSUxFOworICBydHBiaW4tPm50cF90aW1lX3NvdXJjZSA9IERFRkFVTFRfTlRQX1RJTUVfU09VUkNFOworICBydHBiaW4tPnJ0Y3Bfc3luY19zZW5kX3RpbWUgPSBERUZBVUxUX1JUQ1BfU1lOQ19TRU5EX1RJTUU7CisgIHJ0cGJpbi0+bWF4X3J0Y3BfcnRwX3RpbWVfZGlmZiA9IERFRkFVTFRfTUFYX1JUQ1BfUlRQX1RJTUVfRElGRjsKKyAgcnRwYmluLT5tYXhfZHJvcG91dF90aW1lID0gREVGQVVMVF9NQVhfRFJPUE9VVF9USU1FOworICBydHBiaW4tPm1heF9taXNvcmRlcl90aW1lID0gREVGQVVMVF9NQVhfTUlTT1JERVJfVElNRTsKKyAgcnRwYmluLT5yZmM3MjczX3N5bmMgPSBERUZBVUxUX1JGQzcyNzNfU1lOQzsKKyAgcnRwYmluLT5tYXhfc3RyZWFtcyA9IERFRkFVTFRfTUFYX1NUUkVBTVM7CisgIHJ0cGJpbi0+bWF4X3RzX29mZnNldF9hZGp1c3RtZW50ID0gREVGQVVMVF9NQVhfVFNfT0ZGU0VUX0FESlVTVE1FTlQ7CisgIHJ0cGJpbi0+bWF4X3RzX29mZnNldCA9IERFRkFVTFRfTUFYX1RTX09GRlNFVDsKKyAgcnRwYmluLT5tYXhfdHNfb2Zmc2V0X2lzX3NldCA9IEZBTFNFOworCisgIC8qIHNvbWUgZGVmYXVsdCBTREVTIGVudHJpZXMgKi8KKyAgY25hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJ1c2VyJXVAaG9zdC0leCIsIGdfcmFuZG9tX2ludCAoKSwgZ19yYW5kb21faW50ICgpKTsKKyAgcnRwYmluLT5zZGVzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1zb3VyY2Utc2RlcyIsCisgICAgICAiY25hbWUiLCBHX1RZUEVfU1RSSU5HLCBjbmFtZSwgInRvb2wiLCBHX1RZUEVfU1RSSU5HLCAiR1N0cmVhbWVyIiwgTlVMTCk7CisgIGdfZnJlZSAoY25hbWUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9iaW5fZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwQmluICpydHBiaW47CisKKyAgcnRwYmluID0gR1NUX1JUUF9CSU4gKG9iamVjdCk7CisKKyAgR1NUX1JUUF9CSU5fTE9DSyAocnRwYmluKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAob2JqZWN0LCAiZnJlZWluZyBzZXNzaW9ucyIpOworICBnX3NsaXN0X2ZvcmVhY2ggKHJ0cGJpbi0+c2Vzc2lvbnMsIChHRnVuYykgZnJlZV9zZXNzaW9uLCBydHBiaW4pOworICBnX3NsaXN0X2ZyZWUgKHJ0cGJpbi0+c2Vzc2lvbnMpOworICBydHBiaW4tPnNlc3Npb25zID0gTlVMTDsKKyAgR1NUX1JUUF9CSU5fVU5MT0NLIChydHBiaW4pOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9iaW5fZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cEJpbiAqcnRwYmluOworCisgIHJ0cGJpbiA9IEdTVF9SVFBfQklOIChvYmplY3QpOworCisgIGlmIChydHBiaW4tPnNkZXMpCisgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChydHBiaW4tPnNkZXMpOworCisgIGdfbXV0ZXhfY2xlYXIgKCZydHBiaW4tPnByaXYtPmJpbl9sb2NrKTsKKyAgZ19tdXRleF9jbGVhciAoJnJ0cGJpbi0+cHJpdi0+ZHluX2xvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9iaW5fc2V0X3NkZXNfc3RydWN0IChHc3RSdHBCaW4gKiBiaW4sIGNvbnN0IEdzdFN0cnVjdHVyZSAqIHNkZXMpCit7CisgIEdTTGlzdCAqaXRlbTsKKworICBpZiAoc2RlcyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBHU1RfUlRQX0JJTl9MT0NLIChiaW4pOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoYmluKTsKKyAgaWYgKGJpbi0+c2RlcykKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKGJpbi0+c2Rlcyk7CisgIGJpbi0+c2RlcyA9IGdzdF9zdHJ1Y3R1cmVfY29weSAoc2Rlcyk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChiaW4pOworCisgIC8qIHN0b3JlIGluIGFsbCBzZXNzaW9ucyAqLworICBmb3IgKGl0ZW0gPSBiaW4tPnNlc3Npb25zOyBpdGVtOyBpdGVtID0gZ19zbGlzdF9uZXh0IChpdGVtKSkgeworICAgIEdzdFJ0cEJpblNlc3Npb24gKnNlc3Npb24gPSBpdGVtLT5kYXRhOworICAgIGdfb2JqZWN0X3NldCAoc2Vzc2lvbi0+c2Vzc2lvbiwgInNkZXMiLCBzZGVzLCBOVUxMKTsKKyAgfQorCisgIEdTVF9SVFBfQklOX1VOTE9DSyAoYmluKTsKK30KKworc3RhdGljIEdzdFN0cnVjdHVyZSAqCitnc3RfcnRwX2Jpbl9nZXRfc2Rlc19zdHJ1Y3QgKEdzdFJ0cEJpbiAqIGJpbikKK3sKKyAgR3N0U3RydWN0dXJlICpyZXN1bHQ7CisKKyAgR1NUX09CSkVDVF9MT0NLIChiaW4pOworICByZXN1bHQgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKGJpbi0+c2Rlcyk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChiaW4pOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2Jpbl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwQmluICpydHBiaW47CisKKyAgcnRwYmluID0gR1NUX1JUUF9CSU4gKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xBVEVOQ1k6CisgICAgICBHU1RfUlRQX0JJTl9MT0NLIChydHBiaW4pOworICAgICAgcnRwYmluLT5sYXRlbmN5X21zID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgcnRwYmluLT5sYXRlbmN5X25zID0gcnRwYmluLT5sYXRlbmN5X21zICogR1NUX01TRUNPTkQ7CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICAvKiBwcm9wYWdhdGUgdGhlIHByb3BlcnR5IGRvd24gdG8gdGhlIGppdHRlcmJ1ZmZlciAqLworICAgICAgZ3N0X3J0cF9iaW5fcHJvcGFnYXRlX3Byb3BlcnR5X3RvX2ppdHRlcmJ1ZmZlciAocnRwYmluLCAibGF0ZW5jeSIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9EUk9QX09OX0xBVEVOQ1k6CisgICAgICBHU1RfUlRQX0JJTl9MT0NLIChydHBiaW4pOworICAgICAgcnRwYmluLT5kcm9wX29uX2xhdGVuY3kgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICAvKiBwcm9wYWdhdGUgdGhlIHByb3BlcnR5IGRvd24gdG8gdGhlIGppdHRlcmJ1ZmZlciAqLworICAgICAgZ3N0X3J0cF9iaW5fcHJvcGFnYXRlX3Byb3BlcnR5X3RvX2ppdHRlcmJ1ZmZlciAocnRwYmluLAorICAgICAgICAgICJkcm9wLW9uLWxhdGVuY3kiLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0RFUzoKKyAgICAgIGdzdF9ydHBfYmluX3NldF9zZGVzX3N0cnVjdCAocnRwYmluLCBnX3ZhbHVlX2dldF9ib3hlZCAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ET19MT1NUOgorICAgICAgR1NUX1JUUF9CSU5fTE9DSyAocnRwYmluKTsKKyAgICAgIHJ0cGJpbi0+ZG9fbG9zdCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIEdTVF9SVFBfQklOX1VOTE9DSyAocnRwYmluKTsKKyAgICAgIGdzdF9ydHBfYmluX3Byb3BhZ2F0ZV9wcm9wZXJ0eV90b19qaXR0ZXJidWZmZXIgKHJ0cGJpbiwgImRvLWxvc3QiLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTlRQX1NZTkM6CisgICAgICBydHBiaW4tPm50cF9zeW5jID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgLyogVGhlIGRlZmF1bHQgdmFsdWUgb2YgbWF4X3RzX29mZnNldCBkZXBlbmRzIG9uIG50cF9zeW5jLiBJZiB1c2VyCisgICAgICAgKiBoYXNuJ3Qgc2V0IGl0IHRoZW4gY2hhbmdlIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgIGlmICghcnRwYmluLT5tYXhfdHNfb2Zmc2V0X2lzX3NldCkgeworICAgICAgICBpZiAocnRwYmluLT5udHBfc3luYykgeworICAgICAgICAgIHJ0cGJpbi0+bWF4X3RzX29mZnNldCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcnRwYmluLT5tYXhfdHNfb2Zmc2V0ID0gREVGQVVMVF9NQVhfVFNfT0ZGU0VUOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRDUF9TWU5DOgorICAgICAgZ19hdG9taWNfaW50X3NldCAoJnJ0cGJpbi0+cnRjcF9zeW5jLCBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUQ1BfU1lOQ19JTlRFUlZBTDoKKyAgICAgIHJ0cGJpbi0+cnRjcF9zeW5jX2ludGVydmFsID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0lHTk9SRV9QVDoKKyAgICAgIHJ0cGJpbi0+aWdub3JlX3B0ID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FVVE9SRU1PVkU6CisgICAgICBydHBiaW4tPnByaXYtPmF1dG9yZW1vdmUgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFX1BJUEVMSU5FX0NMT0NLOgorICAgIHsKKyAgICAgIEdTTGlzdCAqc2Vzc2lvbnM7CisgICAgICBHU1RfUlRQX0JJTl9MT0NLIChydHBiaW4pOworICAgICAgcnRwYmluLT51c2VfcGlwZWxpbmVfY2xvY2sgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBmb3IgKHNlc3Npb25zID0gcnRwYmluLT5zZXNzaW9uczsgc2Vzc2lvbnM7CisgICAgICAgICAgc2Vzc2lvbnMgPSBnX3NsaXN0X25leHQgKHNlc3Npb25zKSkgeworICAgICAgICBHc3RSdHBCaW5TZXNzaW9uICpzZXNzaW9uID0gKEdzdFJ0cEJpblNlc3Npb24gKikgc2Vzc2lvbnMtPmRhdGE7CisKKyAgICAgICAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc2Vzc2lvbi0+c2Vzc2lvbiksCisgICAgICAgICAgICAidXNlLXBpcGVsaW5lLWNsb2NrIiwgcnRwYmluLT51c2VfcGlwZWxpbmVfY2xvY2ssIE5VTEwpOworICAgICAgfQorICAgICAgR1NUX1JUUF9CSU5fVU5MT0NLIChydHBiaW4pOworICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ET19TWU5DX0VWRU5UOgorICAgICAgcnRwYmluLT5zZW5kX3N5bmNfZXZlbnQgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQlVGRkVSX01PREU6CisgICAgICBHU1RfUlRQX0JJTl9MT0NLIChydHBiaW4pOworICAgICAgcnRwYmluLT5idWZmZXJfbW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIEdTVF9SVFBfQklOX1VOTE9DSyAocnRwYmluKTsKKyAgICAgIC8qIHByb3BhZ2F0ZSB0aGUgcHJvcGVydHkgZG93biB0byB0aGUgaml0dGVyYnVmZmVyICovCisgICAgICBnc3RfcnRwX2Jpbl9wcm9wYWdhdGVfcHJvcGVydHlfdG9faml0dGVyYnVmZmVyIChydHBiaW4sICJtb2RlIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RPX1JFVFJBTlNNSVNTSU9OOgorICAgICAgR1NUX1JUUF9CSU5fTE9DSyAocnRwYmluKTsKKyAgICAgIHJ0cGJpbi0+ZG9fcmV0cmFuc21pc3Npb24gPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICBnc3RfcnRwX2Jpbl9wcm9wYWdhdGVfcHJvcGVydHlfdG9faml0dGVyYnVmZmVyIChydHBiaW4sCisgICAgICAgICAgImRvLXJldHJhbnNtaXNzaW9uIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUUF9QUk9GSUxFOgorICAgICAgcnRwYmluLT5ydHBfcHJvZmlsZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9OVFBfVElNRV9TT1VSQ0U6eworICAgICAgR1NMaXN0ICpzZXNzaW9uczsKKyAgICAgIEdTVF9SVFBfQklOX0xPQ0sgKHJ0cGJpbik7CisgICAgICBydHBiaW4tPm50cF90aW1lX3NvdXJjZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGZvciAoc2Vzc2lvbnMgPSBydHBiaW4tPnNlc3Npb25zOyBzZXNzaW9uczsKKyAgICAgICAgICBzZXNzaW9ucyA9IGdfc2xpc3RfbmV4dCAoc2Vzc2lvbnMpKSB7CisgICAgICAgIEdzdFJ0cEJpblNlc3Npb24gKnNlc3Npb24gPSAoR3N0UnRwQmluU2Vzc2lvbiAqKSBzZXNzaW9ucy0+ZGF0YTsKKworICAgICAgICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzZXNzaW9uLT5zZXNzaW9uKSwKKyAgICAgICAgICAgICJudHAtdGltZS1zb3VyY2UiLCBydHBiaW4tPm50cF90aW1lX3NvdXJjZSwgTlVMTCk7CisgICAgICB9CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX1JUQ1BfU1lOQ19TRU5EX1RJTUU6eworICAgICAgR1NMaXN0ICpzZXNzaW9uczsKKyAgICAgIEdTVF9SVFBfQklOX0xPQ0sgKHJ0cGJpbik7CisgICAgICBydHBiaW4tPnJ0Y3Bfc3luY19zZW5kX3RpbWUgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBmb3IgKHNlc3Npb25zID0gcnRwYmluLT5zZXNzaW9uczsgc2Vzc2lvbnM7CisgICAgICAgICAgc2Vzc2lvbnMgPSBnX3NsaXN0X25leHQgKHNlc3Npb25zKSkgeworICAgICAgICBHc3RSdHBCaW5TZXNzaW9uICpzZXNzaW9uID0gKEdzdFJ0cEJpblNlc3Npb24gKikgc2Vzc2lvbnMtPmRhdGE7CisKKyAgICAgICAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc2Vzc2lvbi0+c2Vzc2lvbiksCisgICAgICAgICAgICAicnRjcC1zeW5jLXNlbmQtdGltZSIsIHJ0cGJpbi0+cnRjcF9zeW5jX3NlbmRfdGltZSwgTlVMTCk7CisgICAgICB9CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX01BWF9SVENQX1JUUF9USU1FX0RJRkY6CisgICAgICBHU1RfUlRQX0JJTl9MT0NLIChydHBiaW4pOworICAgICAgcnRwYmluLT5tYXhfcnRjcF9ydHBfdGltZV9kaWZmID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICBnc3RfcnRwX2Jpbl9wcm9wYWdhdGVfcHJvcGVydHlfdG9faml0dGVyYnVmZmVyIChydHBiaW4sCisgICAgICAgICAgIm1heC1ydGNwLXJ0cC10aW1lLWRpZmYiLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX0RST1BPVVRfVElNRToKKyAgICAgIEdTVF9SVFBfQklOX0xPQ0sgKHJ0cGJpbik7CisgICAgICBydHBiaW4tPm1heF9kcm9wb3V0X3RpbWUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICBnc3RfcnRwX2Jpbl9wcm9wYWdhdGVfcHJvcGVydHlfdG9faml0dGVyYnVmZmVyIChydHBiaW4sCisgICAgICAgICAgIm1heC1kcm9wb3V0LXRpbWUiLCB2YWx1ZSk7CisgICAgICBnc3RfcnRwX2Jpbl9wcm9wYWdhdGVfcHJvcGVydHlfdG9fc2Vzc2lvbiAocnRwYmluLCAibWF4LWRyb3BvdXQtdGltZSIsCisgICAgICAgICAgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9NSVNPUkRFUl9USU1FOgorICAgICAgR1NUX1JUUF9CSU5fTE9DSyAocnRwYmluKTsKKyAgICAgIHJ0cGJpbi0+bWF4X21pc29yZGVyX3RpbWUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICBnc3RfcnRwX2Jpbl9wcm9wYWdhdGVfcHJvcGVydHlfdG9faml0dGVyYnVmZmVyIChydHBiaW4sCisgICAgICAgICAgIm1heC1taXNvcmRlci10aW1lIiwgdmFsdWUpOworICAgICAgZ3N0X3J0cF9iaW5fcHJvcGFnYXRlX3Byb3BlcnR5X3RvX3Nlc3Npb24gKHJ0cGJpbiwgIm1heC1taXNvcmRlci10aW1lIiwKKyAgICAgICAgICB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkZDNzI3M19TWU5DOgorICAgICAgcnRwYmluLT5yZmM3MjczX3N5bmMgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBnc3RfcnRwX2Jpbl9wcm9wYWdhdGVfcHJvcGVydHlfdG9faml0dGVyYnVmZmVyIChydHBiaW4sCisgICAgICAgICAgInJmYzcyNzMtc3luYyIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfU1RSRUFNUzoKKyAgICAgIHJ0cGJpbi0+bWF4X3N0cmVhbXMgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX1RTX09GRlNFVF9BREpVU1RNRU5UOgorICAgICAgcnRwYmluLT5tYXhfdHNfb2Zmc2V0X2FkanVzdG1lbnQgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIGdzdF9ydHBfYmluX3Byb3BhZ2F0ZV9wcm9wZXJ0eV90b19qaXR0ZXJidWZmZXIgKHJ0cGJpbiwKKyAgICAgICAgICAibWF4LXRzLW9mZnNldC1hZGp1c3RtZW50IiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9UU19PRkZTRVQ6CisgICAgICBydHBiaW4tPm1heF90c19vZmZzZXQgPSBnX3ZhbHVlX2dldF9pbnQ2NCAodmFsdWUpOworICAgICAgcnRwYmluLT5tYXhfdHNfb2Zmc2V0X2lzX3NldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2Jpbl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwQmluICpydHBiaW47CisKKyAgcnRwYmluID0gR1NUX1JUUF9CSU4gKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xBVEVOQ1k6CisgICAgICBHU1RfUlRQX0JJTl9MT0NLIChydHBiaW4pOworICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0cGJpbi0+bGF0ZW5jeV9tcyk7CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRFJPUF9PTl9MQVRFTkNZOgorICAgICAgR1NUX1JUUF9CSU5fTE9DSyAocnRwYmluKTsKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBydHBiaW4tPmRyb3Bfb25fbGF0ZW5jeSk7CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0RFUzoKKyAgICAgIGdfdmFsdWVfdGFrZV9ib3hlZCAodmFsdWUsIGdzdF9ydHBfYmluX2dldF9zZGVzX3N0cnVjdCAocnRwYmluKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRE9fTE9TVDoKKyAgICAgIEdTVF9SVFBfQklOX0xPQ0sgKHJ0cGJpbik7CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcnRwYmluLT5kb19sb3N0KTsKKyAgICAgIEdTVF9SVFBfQklOX1VOTE9DSyAocnRwYmluKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JR05PUkVfUFQ6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcnRwYmluLT5pZ25vcmVfcHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05UUF9TWU5DOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHJ0cGJpbi0+bnRwX3N5bmMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUQ1BfU1lOQzoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBnX2F0b21pY19pbnRfZ2V0ICgmcnRwYmluLT5ydGNwX3N5bmMpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX1NZTkNfSU5URVJWQUw6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnRwYmluLT5ydGNwX3N5bmNfaW50ZXJ2YWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FVVE9SRU1PVkU6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcnRwYmluLT5wcml2LT5hdXRvcmVtb3ZlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CVUZGRVJfTU9ERToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBydHBiaW4tPmJ1ZmZlcl9tb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VfUElQRUxJTkVfQ0xPQ0s6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcnRwYmluLT51c2VfcGlwZWxpbmVfY2xvY2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RPX1NZTkNfRVZFTlQ6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcnRwYmluLT5zZW5kX3N5bmNfZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RPX1JFVFJBTlNNSVNTSU9OOgorICAgICAgR1NUX1JUUF9CSU5fTE9DSyAocnRwYmluKTsKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBydHBiaW4tPmRvX3JldHJhbnNtaXNzaW9uKTsKKyAgICAgIEdTVF9SVFBfQklOX1VOTE9DSyAocnRwYmluKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVFBfUFJPRklMRToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBydHBiaW4tPnJ0cF9wcm9maWxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9OVFBfVElNRV9TT1VSQ0U6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgcnRwYmluLT5udHBfdGltZV9zb3VyY2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUQ1BfU1lOQ19TRU5EX1RJTUU6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcnRwYmluLT5ydGNwX3N5bmNfc2VuZF90aW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGOgorICAgICAgR1NUX1JUUF9CSU5fTE9DSyAocnRwYmluKTsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHJ0cGJpbi0+bWF4X3J0Y3BfcnRwX3RpbWVfZGlmZik7CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX0RST1BPVVRfVElNRToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBydHBiaW4tPm1heF9kcm9wb3V0X3RpbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9NSVNPUkRFUl9USU1FOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0cGJpbi0+bWF4X21pc29yZGVyX3RpbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JGQzcyNzNfU1lOQzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBydHBiaW4tPnJmYzcyNzNfc3luYyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX1NUUkVBTVM6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnRwYmluLT5tYXhfc3RyZWFtcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX1RTX09GRlNFVF9BREpVU1RNRU5UOgorICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgcnRwYmluLT5tYXhfdHNfb2Zmc2V0X2FkanVzdG1lbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9UU19PRkZTRVQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQ2NCAodmFsdWUsIHJ0cGJpbi0+bWF4X3RzX29mZnNldCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2Jpbl9oYW5kbGVfbWVzc2FnZSAoR3N0QmluICogYmluLCBHc3RNZXNzYWdlICogbWVzc2FnZSkKK3sKKyAgR3N0UnRwQmluICpydHBiaW47CisKKyAgcnRwYmluID0gR1NUX1JUUF9CSU4gKGJpbik7CisKKyAgc3dpdGNoIChHU1RfTUVTU0FHRV9UWVBFIChtZXNzYWdlKSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfRUxFTUVOVDoKKyAgICB7CisgICAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfbWVzc2FnZV9nZXRfc3RydWN0dXJlIChtZXNzYWdlKTsKKworICAgICAgLyogd2UgY2hhbmdlIHRoZSBzdHJ1Y3R1cmUgbmFtZSBhbmQgYWRkIHRoZSBzZXNzaW9uIElEIHRvIGl0ICovCisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgImFwcGxpY2F0aW9uL3gtcnRwLXNvdXJjZS1zZGVzIikpIHsKKyAgICAgICAgR3N0UnRwQmluU2Vzc2lvbiAqc2VzczsKKworICAgICAgICAvKiBmaW5kIHRoZSBzZXNzaW9uIHdlIHNldCBpdCBhcyBvYmplY3QgZGF0YSAqLworICAgICAgICBzZXNzID0gZ19vYmplY3RfZ2V0X2RhdGEgKEdfT0JKRUNUIChHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpKSwKKyAgICAgICAgICAgICJHc3RSVFBCaW4uc2Vzc2lvbiIpOworCisgICAgICAgIGlmIChHX0xJS0VMWSAoc2VzcykpIHsKKyAgICAgICAgICBtZXNzYWdlID0gZ3N0X21lc3NhZ2VfbWFrZV93cml0YWJsZSAobWVzc2FnZSk7CisgICAgICAgICAgcyA9IGdzdF9tZXNzYWdlX2dldF9zdHJ1Y3R1cmUgKG1lc3NhZ2UpOworICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0ICgoR3N0U3RydWN0dXJlICopIHMsICJzZXNzaW9uIiwgR19UWVBFX1VJTlQsCisgICAgICAgICAgICAgIHNlc3MtPmlkLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgR1NUX0JJTl9DTEFTUyAocGFyZW50X2NsYXNzKS0+aGFuZGxlX21lc3NhZ2UgKGJpbiwgbWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfTUVTU0FHRV9CVUZGRVJJTkc6CisgICAgeworICAgICAgZ2ludCBwZXJjZW50OworICAgICAgZ2ludCBtaW5fcGVyY2VudCA9IDEwMDsKKyAgICAgIEdTTGlzdCAqc2Vzc2lvbnMsICpzdHJlYW1zOworICAgICAgR3N0UnRwQmluU3RyZWFtICpzdHJlYW07CisgICAgICBnYm9vbGVhbiBjaGFuZ2UgPSBGQUxTRSwgYWN0aXZlID0gRkFMU0U7CisgICAgICBHc3RDbG9ja1RpbWUgbWluX291dF90aW1lOworICAgICAgR3N0QnVmZmVyaW5nTW9kZSBtb2RlOworICAgICAgZ2ludCBhdmdfaW4sIGF2Z19vdXQ7CisgICAgICBnaW50NjQgYnVmZmVyaW5nX2xlZnQ7CisKKyAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX2J1ZmZlcmluZyAobWVzc2FnZSwgJnBlcmNlbnQpOworICAgICAgZ3N0X21lc3NhZ2VfcGFyc2VfYnVmZmVyaW5nX3N0YXRzIChtZXNzYWdlLCAmbW9kZSwgJmF2Z19pbiwgJmF2Z19vdXQsCisgICAgICAgICAgJmJ1ZmZlcmluZ19sZWZ0KTsKKworICAgICAgc3RyZWFtID0KKyAgICAgICAgICBnX29iamVjdF9nZXRfZGF0YSAoR19PQkpFQ1QgKEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSkpLAorICAgICAgICAgICJHc3RSVFBCaW4uc3RyZWFtIik7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgImdvdCBwZXJjZW50ICVkIGZyb20gc3RyZWFtICVwIiwgcGVyY2VudCwgc3RyZWFtKTsKKworICAgICAgLyogZ2V0IHRoZSBzdHJlYW0gKi8KKyAgICAgIGlmIChHX0xJS0VMWSAoc3RyZWFtKSkgeworICAgICAgICBHU1RfUlRQX0JJTl9MT0NLIChydHBiaW4pOworICAgICAgICAvKiBmaWxsIGluIHRoZSBwZXJjZW50ICovCisgICAgICAgIHN0cmVhbS0+cGVyY2VudCA9IHBlcmNlbnQ7CisKKyAgICAgICAgLyogY2FsY3VsYXRlIHRoZSBtaW4gdmFsdWUgZm9yIGFsbCBzdHJlYW1zICovCisgICAgICAgIGZvciAoc2Vzc2lvbnMgPSBydHBiaW4tPnNlc3Npb25zOyBzZXNzaW9uczsKKyAgICAgICAgICAgIHNlc3Npb25zID0gZ19zbGlzdF9uZXh0IChzZXNzaW9ucykpIHsKKyAgICAgICAgICBHc3RSdHBCaW5TZXNzaW9uICpzZXNzaW9uID0gKEdzdFJ0cEJpblNlc3Npb24gKikgc2Vzc2lvbnMtPmRhdGE7CisKKyAgICAgICAgICBHU1RfUlRQX1NFU1NJT05fTE9DSyAoc2Vzc2lvbik7CisgICAgICAgICAgaWYgKHNlc3Npb24tPnN0cmVhbXMpIHsKKyAgICAgICAgICAgIGZvciAoc3RyZWFtcyA9IHNlc3Npb24tPnN0cmVhbXM7IHN0cmVhbXM7CisgICAgICAgICAgICAgICAgc3RyZWFtcyA9IGdfc2xpc3RfbmV4dCAoc3RyZWFtcykpIHsKKyAgICAgICAgICAgICAgR3N0UnRwQmluU3RyZWFtICpzdHJlYW0gPSAoR3N0UnRwQmluU3RyZWFtICopIHN0cmVhbXMtPmRhdGE7CisKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAic3RyZWFtICVwIHBlcmNlbnQgJWQiLCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICBzdHJlYW0tPnBlcmNlbnQpOworCisgICAgICAgICAgICAgIC8qIGZpbmQgbWluIHBlcmNlbnQgKi8KKyAgICAgICAgICAgICAgaWYgKG1pbl9wZXJjZW50ID4gc3RyZWFtLT5wZXJjZW50KQorICAgICAgICAgICAgICAgIG1pbl9wZXJjZW50ID0gc3RyZWFtLT5wZXJjZW50OworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKGJpbiwKKyAgICAgICAgICAgICAgICAic2Vzc2lvbiBoYXMgbm8gc3RyZWFtcywgc2V0dGluZyBtaW5fcGVyY2VudCB0byAwIik7CisgICAgICAgICAgICBtaW5fcGVyY2VudCA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3Npb24pOworICAgICAgICB9CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgIm1pbiBwZXJjZW50ICVkIiwgbWluX3BlcmNlbnQpOworCisgICAgICAgIGlmIChydHBiaW4tPmJ1ZmZlcmluZykgeworICAgICAgICAgIGlmIChtaW5fcGVyY2VudCA9PSAxMDApIHsKKyAgICAgICAgICAgIHJ0cGJpbi0+YnVmZmVyaW5nID0gRkFMU0U7CisgICAgICAgICAgICBhY3RpdmUgPSBUUlVFOworICAgICAgICAgICAgY2hhbmdlID0gVFJVRTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKG1pbl9wZXJjZW50IDwgMTAwKSB7CisgICAgICAgICAgICAvKiBwYXVzZSB0aGUgc3RyZWFtcyAqLworICAgICAgICAgICAgcnRwYmluLT5idWZmZXJpbmcgPSBUUlVFOworICAgICAgICAgICAgYWN0aXZlID0gRkFMU0U7CisgICAgICAgICAgICBjaGFuZ2UgPSBUUlVFOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisKKyAgICAgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgICAgICAgIC8qIG1ha2UgYSBuZXcgYnVmZmVyaW5nIG1lc3NhZ2Ugd2l0aCB0aGUgbWluIHZhbHVlICovCisgICAgICAgIG1lc3NhZ2UgPQorICAgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2J1ZmZlcmluZyAoR1NUX09CSkVDVF9DQVNUIChiaW4pLCBtaW5fcGVyY2VudCk7CisgICAgICAgIGdzdF9tZXNzYWdlX3NldF9idWZmZXJpbmdfc3RhdHMgKG1lc3NhZ2UsIG1vZGUsIGF2Z19pbiwgYXZnX291dCwKKyAgICAgICAgICAgIGJ1ZmZlcmluZ19sZWZ0KTsKKworICAgICAgICBpZiAoR19VTkxJS0VMWSAoY2hhbmdlKSkgeworICAgICAgICAgIEdzdENsb2NrICpjbG9jazsKKyAgICAgICAgICBndWludDY0IHJ1bm5pbmdfdGltZSA9IDA7CisgICAgICAgICAgZ3VpbnQ2NCBvZmZzZXQgPSAwOworCisgICAgICAgICAgLyogZmlndXJlIG91dCB0aGUgcnVubmluZyB0aW1lIHdoZW4gd2UgaGF2ZSBhIGNsb2NrICovCisgICAgICAgICAgaWYgKEdfTElLRUxZICgoY2xvY2sgPQorICAgICAgICAgICAgICAgICAgICAgIGdzdF9lbGVtZW50X2dldF9jbG9jayAoR1NUX0VMRU1FTlRfQ0FTVCAoYmluKSkpKSkgeworICAgICAgICAgICAgZ3VpbnQ2NCBub3csIGJhc2VfdGltZTsKKworICAgICAgICAgICAgbm93ID0gZ3N0X2Nsb2NrX2dldF90aW1lIChjbG9jayk7CisgICAgICAgICAgICBiYXNlX3RpbWUgPSBnc3RfZWxlbWVudF9nZXRfYmFzZV90aW1lIChHU1RfRUxFTUVOVF9DQVNUIChiaW4pKTsKKyAgICAgICAgICAgIHJ1bm5pbmdfdGltZSA9IG5vdyAtIGJhc2VfdGltZTsKKyAgICAgICAgICAgIGdzdF9vYmplY3RfdW5yZWYgKGNsb2NrKTsKKyAgICAgICAgICB9CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLAorICAgICAgICAgICAgICAicnVubmluZyB0aW1lIG5vdyAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHJ1bm5pbmdfdGltZSkpOworCisgICAgICAgICAgR1NUX1JUUF9CSU5fTE9DSyAocnRwYmluKTsKKworICAgICAgICAgIC8qIHdoZW4gd2UgcmVhY3RpdmF0ZSwgY2FsY3VsYXRlIHRoZSBvZmZzZXRzIHNvIHRoYXQgYWxsIHN0cmVhbXMgaGF2ZQorICAgICAgICAgICAqIGFuIG91dHB1dCB0aW1lIHRoYXQgaXMgYXQgbGVhc3QgYXMgYmlnIGFzIHRoZSBydW5uaW5nX3RpbWUgKi8KKyAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgICAgIGlmIChydW5uaW5nX3RpbWUgPiBydHBiaW4tPmJ1ZmZlcl9zdGFydCkgeworICAgICAgICAgICAgICBvZmZzZXQgPSBydW5uaW5nX3RpbWUgLSBydHBiaW4tPmJ1ZmZlcl9zdGFydDsKKyAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBydHBiaW4tPmxhdGVuY3lfbnMpCisgICAgICAgICAgICAgICAgb2Zmc2V0IC09IHJ0cGJpbi0+bGF0ZW5jeV9uczsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogcGF1c2UgYWxsIHN0cmVhbXMgKi8KKyAgICAgICAgICBtaW5fb3V0X3RpbWUgPSAtMTsKKyAgICAgICAgICBmb3IgKHNlc3Npb25zID0gcnRwYmluLT5zZXNzaW9uczsgc2Vzc2lvbnM7CisgICAgICAgICAgICAgIHNlc3Npb25zID0gZ19zbGlzdF9uZXh0IChzZXNzaW9ucykpIHsKKyAgICAgICAgICAgIEdzdFJ0cEJpblNlc3Npb24gKnNlc3Npb24gPSAoR3N0UnRwQmluU2Vzc2lvbiAqKSBzZXNzaW9ucy0+ZGF0YTsKKworICAgICAgICAgICAgR1NUX1JUUF9TRVNTSU9OX0xPQ0sgKHNlc3Npb24pOworICAgICAgICAgICAgZm9yIChzdHJlYW1zID0gc2Vzc2lvbi0+c3RyZWFtczsgc3RyZWFtczsKKyAgICAgICAgICAgICAgICBzdHJlYW1zID0gZ19zbGlzdF9uZXh0IChzdHJlYW1zKSkgeworICAgICAgICAgICAgICBHc3RSdHBCaW5TdHJlYW0gKnN0cmVhbSA9IChHc3RSdHBCaW5TdHJlYW0gKikgc3RyZWFtcy0+ZGF0YTsKKyAgICAgICAgICAgICAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHN0cmVhbS0+YnVmZmVyOworICAgICAgICAgICAgICBndWludDY0IGxhc3Rfb3V0OworCisgICAgICAgICAgICAgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAoZWxlbWVudCwgInNldC1hY3RpdmUiLCBhY3RpdmUsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICZsYXN0X291dCk7CisKKyAgICAgICAgICAgICAgaWYgKCFhY3RpdmUpIHsKKyAgICAgICAgICAgICAgICBnX29iamVjdF9nZXQgKGVsZW1lbnQsICJwZXJjZW50IiwgJnN0cmVhbS0+cGVyY2VudCwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICBpZiAobGFzdF9vdXQgPT0gLTEpCisgICAgICAgICAgICAgICAgICBsYXN0X291dCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKG1pbl9vdXRfdGltZSA9PSAtMSB8fCBsYXN0X291dCA8IG1pbl9vdXRfdGltZSkKKyAgICAgICAgICAgICAgICAgIG1pbl9vdXRfdGltZSA9IGxhc3Rfb3V0OworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLAorICAgICAgICAgICAgICAgICAgInNldHRpbmcgJXAgdG8gJWQsIG9mZnNldCAlIiBHU1RfVElNRV9GT1JNQVQgIiwgbGFzdCAlIgorICAgICAgICAgICAgICAgICAgR1NUX1RJTUVfRk9STUFUICIsIHBlcmNlbnQgJWQiLCBlbGVtZW50LCBhY3RpdmUsCisgICAgICAgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChvZmZzZXQpLCBHU1RfVElNRV9BUkdTIChsYXN0X291dCksCisgICAgICAgICAgICAgICAgICBzdHJlYW0tPnBlcmNlbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzc2lvbik7CisgICAgICAgICAgfQorICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwKKyAgICAgICAgICAgICAgIm1pbiBvdXQgdGltZSAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKG1pbl9vdXRfdGltZSkpOworCisgICAgICAgICAgLyogdGhlIGJ1ZmZlcl9zdGFydCBpcyB0aGUgbWluIG91dCB0aW1lIG9mIGFsbCBwYXVzZWQgaml0dGVyYnVmZmVycyAqLworICAgICAgICAgIGlmICghYWN0aXZlKQorICAgICAgICAgICAgcnRwYmluLT5idWZmZXJfc3RhcnQgPSBtaW5fb3V0X3RpbWU7CisKKyAgICAgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEdTVF9CSU5fQ0xBU1MgKHBhcmVudF9jbGFzcyktPmhhbmRsZV9tZXNzYWdlIChiaW4sIG1lc3NhZ2UpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgeworICAgICAgR1NUX0JJTl9DTEFTUyAocGFyZW50X2NsYXNzKS0+aGFuZGxlX21lc3NhZ2UgKGJpbiwgbWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2Jpbl9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXM7CisgIEdzdFJ0cEJpbiAqcnRwYmluOworICBHc3RSdHBCaW5Qcml2YXRlICpwcml2OworCisgIHJ0cGJpbiA9IEdTVF9SVFBfQklOIChlbGVtZW50KTsKKyAgcHJpdiA9IHJ0cGJpbi0+cHJpdjsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBwcml2LT5sYXN0X250cG5zdGltZSA9IDA7CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwYmluLCAiY2xlYXJpbmcgc2h1dGRvd24gZmxhZyIpOworICAgICAgZ19hdG9taWNfaW50X3NldCAoJnByaXYtPnNodXRkb3duLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwYmluLCAic2V0dGluZyBzaHV0ZG93biBmbGFnIik7CisgICAgICBnX2F0b21pY19pbnRfc2V0ICgmcHJpdi0+c2h1dGRvd24sIDEpOworICAgICAgLyogd2FpdCBmb3IgYWxsIGNhbGxiYWNrcyB0byBlbmQgYnkgdGFraW5nIHRoZSBsb2NrLiBObyBuZXcgY2FsbGJhY2tzIHdpbGwKKyAgICAgICAqIGJlIGFibGUgdG8gaGFwcGVuIGFzIHdlIHNldCB0aGUgc2h1dGRvd24gZmxhZy4gKi8KKyAgICAgIEdTVF9SVFBfQklOX0RZTl9MT0NLIChydHBiaW4pOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGJpbiwgImR5bmFtaWMgbG9jayB0YWtlbiwgd2UgY2FuIGNvbnRpbnVlIHNodXRkb3duIik7CisgICAgICBHU1RfUlRQX0JJTl9EWU5fVU5MT0NLIChydHBiaW4pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmVzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3Nlc3Npb25fcmVxdWVzdF9lbGVtZW50IChHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbiwgZ3VpbnQgc2lnbmFsKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gTlVMTDsKKyAgR3N0UnRwQmluICpiaW4gPSBzZXNzaW9uLT5iaW47CisKKyAgZ19zaWduYWxfZW1pdCAoYmluLCBnc3RfcnRwX2Jpbl9zaWduYWxzW3NpZ25hbF0sIDAsIHNlc3Npb24tPmlkLCAmZWxlbWVudCk7CisKKyAgaWYgKGVsZW1lbnQpIHsKKyAgICBpZiAoIWJpbl9tYW5hZ2VfZWxlbWVudCAoYmluLCBlbGVtZW50KSkKKyAgICAgIGdvdG8gbWFuYWdlX2ZhaWxlZDsKKyAgICBzZXNzaW9uLT5lbGVtZW50cyA9IGdfc2xpc3RfcHJlcGVuZCAoc2Vzc2lvbi0+ZWxlbWVudHMsIGVsZW1lbnQpOworICB9CisgIHJldHVybiBlbGVtZW50OworCisgIC8qIEVSUk9SUyAqLworbWFuYWdlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYmluLCAidW5hYmxlIHRvIG1hbmFnZSBlbGVtZW50Iik7CisgICAgZ3N0X29iamVjdF91bnJlZiAoZWxlbWVudCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitjb3B5X3N0aWNreV9ldmVudHMgKEdzdFBhZCAqIHBhZCwgR3N0RXZlbnQgKiogZXZlbnQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0UGFkICpncGFkID0gR1NUX1BBRF9DQVNUICh1c2VyX2RhdGEpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGdwYWQsICJzdG9yZSBzdGlja3kgZXZlbnQgJSIgR1NUX1BUUl9GT1JNQVQsICpldmVudCk7CisgIGdzdF9wYWRfc3RvcmVfc3RpY2t5X2V2ZW50IChncGFkLCAqZXZlbnQpOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBhIG5ldyBwYWQgKFNTUkMpIHdhcyBjcmVhdGVkIGluIEBzZXNzaW9uLiBUaGlzIHNpZ25hbCBpcyBlbWl0ZWQgZnJvbSB0aGUKKyAqIHBheWxvYWQgZGVtdXhlci4gKi8KK3N0YXRpYyB2b2lkCituZXdfcGF5bG9hZF9mb3VuZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIGd1aW50IHB0LCBHc3RQYWQgKiBwYWQsCisgICAgR3N0UnRwQmluU3RyZWFtICogc3RyZWFtKQoreworICBHc3RSdHBCaW4gKnJ0cGJpbjsKKyAgR3N0RWxlbWVudENsYXNzICprbGFzczsKKyAgR3N0UGFkVGVtcGxhdGUgKnRlbXBsOworICBnY2hhciAqcGFkbmFtZTsKKyAgR3N0UGFkICpncGFkOworCisgIHJ0cGJpbiA9IHN0cmVhbS0+YmluOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgIm5ldyBwYXlsb2FkIHBhZCAldSIsIHB0KTsKKworICBHU1RfUlRQX0JJTl9TSFVURE9XTl9MT0NLIChydHBiaW4sIHNodXRkb3duKTsKKworICAvKiBnaG9zdCB0aGUgcGFkIHRvIHRoZSBwYXJlbnQgKi8KKyAga2xhc3MgPSBHU1RfRUxFTUVOVF9HRVRfQ0xBU1MgKHJ0cGJpbik7CisgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJyZWN2X3J0cF9zcmNfJXVfJXVfJXUiKTsKKyAgcGFkbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInJlY3ZfcnRwX3NyY18ldV8ldV8ldSIsCisgICAgICBzdHJlYW0tPnNlc3Npb24tPmlkLCBzdHJlYW0tPnNzcmMsIHB0KTsKKyAgZ3BhZCA9IGdzdF9naG9zdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKHBhZG5hbWUsIHBhZCwgdGVtcGwpOworICBnX2ZyZWUgKHBhZG5hbWUpOworICBnX29iamVjdF9zZXRfZGF0YSAoR19PQkpFQ1QgKHBhZCksICJHc3RSVFBCaW4uZ2hvc3RwYWQiLCBncGFkKTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKGdwYWQsIFRSVUUpOworICBHU1RfUlRQX0JJTl9TSFVURE9XTl9VTkxPQ0sgKHJ0cGJpbik7CisKKyAgZ3N0X3BhZF9zdGlja3lfZXZlbnRzX2ZvcmVhY2ggKHBhZCwgY29weV9zdGlja3lfZXZlbnRzLCBncGFkKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwYmluKSwgZ3BhZCk7CisKKyAgcmV0dXJuOworCitzaHV0ZG93bjoKKyAgeworICAgIEdTVF9ERUJVRyAoImlnbm9yaW5nLCB3ZSBhcmUgc2h1dHRpbmcgZG93biIpOworICAgIHJldHVybjsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorcGF5bG9hZF9wYWRfcmVtb3ZlZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RSdHBCaW5TdHJlYW0gKiBzdHJlYW0pCit7CisgIEdzdFJ0cEJpbiAqcnRwYmluOworICBHc3RQYWQgKmdwYWQ7CisKKyAgcnRwYmluID0gc3RyZWFtLT5iaW47CisKKyAgR1NUX0RFQlVHICgicGF5bG9hZCBwYWQgcmVtb3ZlZCIpOworCisgIEdTVF9SVFBfQklOX0RZTl9MT0NLIChydHBiaW4pOworICBpZiAoKGdwYWQgPSBnX29iamVjdF9nZXRfZGF0YSAoR19PQkpFQ1QgKHBhZCksICJHc3RSVFBCaW4uZ2hvc3RwYWQiKSkpIHsKKyAgICBnX29iamVjdF9zZXRfZGF0YSAoR19PQkpFQ1QgKHBhZCksICJHc3RSVFBCaW4uZ2hvc3RwYWQiLCBOVUxMKTsKKworICAgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoZ3BhZCwgRkFMU0UpOworICAgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cGJpbiksIGdwYWQpOworICB9CisgIEdTVF9SVFBfQklOX0RZTl9VTkxPQ0sgKHJ0cGJpbik7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK3B0X21hcF9yZXF1ZXN0ZWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBndWludCBwdCwgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24pCit7CisgIEdzdFJ0cEJpbiAqcnRwYmluOworICBHc3RDYXBzICpjYXBzOworCisgIHJ0cGJpbiA9IHNlc3Npb24tPmJpbjsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJwYXlsb2FkIG1hcCByZXF1ZXN0ZWQgZm9yIHB0ICV1IGluIHNlc3Npb24gJXUiLCBwdCwKKyAgICAgIHNlc3Npb24tPmlkKTsKKworICBjYXBzID0gZ2V0X3B0X21hcCAoc2Vzc2lvbiwgcHQpOworICBpZiAoIWNhcHMpCisgICAgZ290byBub19jYXBzOworCisgIHJldHVybiBjYXBzOworCisgIC8qIEVSUk9SUyAqLworbm9fY2FwczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImNvdWxkIG5vdCBnZXQgY2FwcyIpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitwYXlsb2FkX3R5cGVfY2hhbmdlIChHc3RFbGVtZW50ICogZWxlbWVudCwgZ3VpbnQgcHQsIEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzaW9uKQoreworICBHU1RfREVCVUdfT0JKRUNUIChzZXNzaW9uLT5iaW4sCisgICAgICAiZW1pdGluZyBzaWduYWwgZm9yIHB0IHR5cGUgY2hhbmdlZCB0byAldSBpbiBzZXNzaW9uICV1IiwgcHQsCisgICAgICBzZXNzaW9uLT5pZCk7CisKKyAgZ19zaWduYWxfZW1pdCAoc2Vzc2lvbi0+YmluLCBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9QQVlMT0FEX1RZUEVfQ0hBTkdFXSwKKyAgICAgIDAsIHNlc3Npb24tPmlkLCBwdCk7Cit9CisKKy8qIGVtaXRlZCB3aGVuIGNhcHMgY2hhbmdlZCBmb3IgdGhlIHNlc3Npb24gKi8KK3N0YXRpYyB2b2lkCitjYXBzX2NoYW5nZWQgKEdzdFBhZCAqIHBhZCwgR1BhcmFtU3BlYyAqIHBzcGVjLCBHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbikKK3sKKyAgR3N0UnRwQmluICpiaW47CisgIEdzdENhcHMgKmNhcHM7CisgIGdpbnQgcGF5bG9hZDsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzOworCisgIGJpbiA9IHNlc3Npb24tPmJpbjsKKworICBnX29iamVjdF9nZXQgKHBhZCwgImNhcHMiLCAmY2FwcywgTlVMTCk7CisKKyAgaWYgKGNhcHMgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAiZ290IGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICAvKiBnZXQgcGF5bG9hZCwgZmluaXNoIHdoZW4gaXQncyBub3QgdGhlcmUgKi8KKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJwYXlsb2FkIiwgJnBheWxvYWQpKSB7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIHJldHVybjsKKyAgfQorCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChzZXNzaW9uKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAiaW5zZXJ0IGNhcHMgZm9yIHBheWxvYWQgJWQiLCBwYXlsb2FkKTsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAoc2Vzc2lvbi0+cHRtYXAsIEdJTlRfVE9fUE9JTlRFUiAocGF5bG9hZCksIGNhcHMpOworICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzaW9uKTsKK30KKworLyogYSBuZXcgcGFkIChTU1JDKSB3YXMgY3JlYXRlZCBpbiBAc2Vzc2lvbiAqLworc3RhdGljIHZvaWQKK25ld19zc3JjX3BhZF9mb3VuZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIGd1aW50IHNzcmMsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbikKK3sKKyAgR3N0UnRwQmluICpydHBiaW47CisgIEdzdFJ0cEJpblN0cmVhbSAqc3RyZWFtOworICBHc3RQYWQgKnNpbmtwYWQsICpzcmNwYWQ7CisgIGdjaGFyICpwYWRuYW1lOworCisgIHJ0cGJpbiA9IHNlc3Npb24tPmJpbjsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJuZXcgU1NSQyBwYWQgJTA4eCwgJXM6JXMiLCBzc3JjLAorICAgICAgR1NUX0RFQlVHX1BBRF9OQU1FIChwYWQpKTsKKworICBHU1RfUlRQX0JJTl9TSFVURE9XTl9MT0NLIChydHBiaW4sIHNodXRkb3duKTsKKworICBHU1RfUlRQX1NFU1NJT05fTE9DSyAoc2Vzc2lvbik7CisKKyAgLyogY3JlYXRlIG5ldyBzdHJlYW0gKi8KKyAgc3RyZWFtID0gY3JlYXRlX3N0cmVhbSAoc2Vzc2lvbiwgc3NyYyk7CisgIGlmICghc3RyZWFtKQorICAgIGdvdG8gbm9fc3RyZWFtOworCisgIC8qIGdldCBwYWQgYW5kIGxpbmsgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwYmluLCAibGlua2luZyBqaXR0ZXJidWZmZXIgUlRQIik7CisgIHBhZG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzcmNfJXUiLCBzc3JjKTsKKyAgc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGVsZW1lbnQsIHBhZG5hbWUpOworICBnX2ZyZWUgKHBhZG5hbWUpOworICBzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHN0cmVhbS0+YnVmZmVyLCAic2luayIpOworICBnc3RfcGFkX2xpbmtfZnVsbCAoc3JjcGFkLCBzaW5rcGFkLCBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImxpbmtpbmcgaml0dGVyYnVmZmVyIFJUQ1AiKTsKKyAgcGFkbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInJ0Y3Bfc3JjXyV1Iiwgc3NyYyk7CisgIHNyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChlbGVtZW50LCBwYWRuYW1lKTsKKyAgZ19mcmVlIChwYWRuYW1lKTsKKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoc3RyZWFtLT5idWZmZXIsICJzaW5rX3J0Y3AiKTsKKyAgZ3N0X3BhZF9saW5rX2Z1bGwgKHNyY3BhZCwgc2lua3BhZCwgR1NUX1BBRF9MSU5LX0NIRUNLX05PVEhJTkcpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKworICAvKiBjb25uZWN0IHRvIHRoZSBSVENQIHN5bmMgc2lnbmFsIGZyb20gdGhlIGppdHRlcmJ1ZmZlciAqLworICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJjb25uZWN0aW5nIHN5bmMgc2lnbmFsIik7CisgIHN0cmVhbS0+YnVmZmVyX2hhbmRsZXN5bmNfc2lnID0gZ19zaWduYWxfY29ubmVjdCAoc3RyZWFtLT5idWZmZXIsCisgICAgICAiaGFuZGxlLXN5bmMiLCAoR0NhbGxiYWNrKSBnc3RfcnRwX2Jpbl9oYW5kbGVfc3luYywgc3RyZWFtKTsKKworICBpZiAoc3RyZWFtLT5kZW11eCkgeworICAgIC8qIGNvbm5lY3QgdG8gdGhlIG5ldy1wYWQgc2lnbmFsIG9mIHRoZSBwYXlsb2FkIGRlbXV4ZXIsIHRoaXMgd2lsbCBleHBvc2UgdGhlCisgICAgICogbmV3IHBhZCBieSBnaG9zdGluZyBpdC4gKi8KKyAgICBzdHJlYW0tPmRlbXV4X25ld3BhZF9zaWcgPSBnX3NpZ25hbF9jb25uZWN0IChzdHJlYW0tPmRlbXV4LAorICAgICAgICAibmV3LXBheWxvYWQtdHlwZSIsIChHQ2FsbGJhY2spIG5ld19wYXlsb2FkX2ZvdW5kLCBzdHJlYW0pOworICAgIHN0cmVhbS0+ZGVtdXhfcGFkcmVtb3ZlZF9zaWcgPSBnX3NpZ25hbF9jb25uZWN0IChzdHJlYW0tPmRlbXV4LAorICAgICAgICAicGFkLXJlbW92ZWQiLCAoR0NhbGxiYWNrKSBwYXlsb2FkX3BhZF9yZW1vdmVkLCBzdHJlYW0pOworCisgICAgLyogY29ubmVjdCB0byB0aGUgcmVxdWVzdC1wdC1tYXAgc2lnbmFsLiBUaGlzIHNpZ25hbCB3aWxsIGJlIGVtaXRlZCBieSB0aGUKKyAgICAgKiBkZW11eGVyIHNvIHRoYXQgaXQgY2FuIGFwcGx5IGEgcHJvcGVyIGNhcHMgb24gdGhlIGJ1ZmZlcnMgZm9yIHRoZQorICAgICAqIGRlcGF5bG9hZGVycy4gKi8KKyAgICBzdHJlYW0tPmRlbXV4X3B0cmVxX3NpZyA9IGdfc2lnbmFsX2Nvbm5lY3QgKHN0cmVhbS0+ZGVtdXgsCisgICAgICAgICJyZXF1ZXN0LXB0LW1hcCIsIChHQ2FsbGJhY2spIHB0X21hcF9yZXF1ZXN0ZWQsIHNlc3Npb24pOworICAgIC8qIGNvbm5lY3QgdG8gdGhlICBzaWduYWwgc28gaXQgY2FuIGJlIGZvcndhcmRlZC4gKi8KKyAgICBzdHJlYW0tPmRlbXV4X3B0Y2hhbmdlX3NpZyA9IGdfc2lnbmFsX2Nvbm5lY3QgKHN0cmVhbS0+ZGVtdXgsCisgICAgICAgICJwYXlsb2FkLXR5cGUtY2hhbmdlIiwgKEdDYWxsYmFjaykgcGF5bG9hZF90eXBlX2NoYW5nZSwgc2Vzc2lvbik7CisgIH0gZWxzZSB7CisgICAgLyogYWRkIHJ0cGppdHRlcmJ1ZmZlciBzcmMgcGFkIHRvIHBhZHMgKi8KKyAgICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzOworICAgIEdzdFBhZFRlbXBsYXRlICp0ZW1wbDsKKyAgICBnY2hhciAqcGFkbmFtZTsKKyAgICBHc3RQYWQgKmdwYWQsICpwYWQ7CisKKyAgICBwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc3RyZWFtLT5idWZmZXIsICJzcmMiKTsKKworICAgIC8qIGdob3N0IHRoZSBwYWQgdG8gdGhlIHBhcmVudCAqLworICAgIGtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChydHBiaW4pOworICAgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJyZWN2X3J0cF9zcmNfJXVfJXVfJXUiKTsKKyAgICBwYWRuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgicmVjdl9ydHBfc3JjXyV1XyV1XyV1IiwKKyAgICAgICAgc3RyZWFtLT5zZXNzaW9uLT5pZCwgc3RyZWFtLT5zc3JjLCAyNTUpOworICAgIGdwYWQgPSBnc3RfZ2hvc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChwYWRuYW1lLCBwYWQsIHRlbXBsKTsKKyAgICBnX2ZyZWUgKHBhZG5hbWUpOworCisgICAgZ3N0X3BhZF9zZXRfYWN0aXZlIChncGFkLCBUUlVFKTsKKyAgICBnc3RfcGFkX3N0aWNreV9ldmVudHNfZm9yZWFjaCAocGFkLCBjb3B5X3N0aWNreV9ldmVudHMsIGdwYWQpOworICAgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cGJpbiksIGdwYWQpOworCisgICAgZ3N0X29iamVjdF91bnJlZiAocGFkKTsKKyAgfQorCisgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3Npb24pOworICBHU1RfUlRQX0JJTl9TSFVURE9XTl9VTkxPQ0sgKHJ0cGJpbik7CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworc2h1dGRvd246CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJ3ZSBhcmUgc2h1dHRpbmcgZG93biIpOworICAgIHJldHVybjsKKyAgfQorbm9fc3RyZWFtOgorICB7CisgICAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzc2lvbik7CisgICAgR1NUX1JUUF9CSU5fU0hVVERPV05fVU5MT0NLIChydHBiaW4pOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImNvdWxkIG5vdCBjcmVhdGUgc3RyZWFtIik7CisgICAgcmV0dXJuOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitzZXNzaW9uX21heWJlX2NyZWF0ZV9idW5kbGVfZGVtdXhlciAoR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24pCit7CisgIEdzdFJ0cEJpbiAqcnRwYmluOworCisgIGlmIChzZXNzaW9uLT5idW5kbGVfZGVtdXgpCisgICAgcmV0dXJuOworCisgIHJ0cGJpbiA9IHNlc3Npb24tPmJpbjsKKyAgaWYgKGdfc2lnbmFsX2hhc19oYW5kbGVyX3BlbmRpbmcgKHJ0cGJpbiwKKyAgICAgICAgICBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9PTl9CVU5ETEVEX1NTUkNdLCAwLCBUUlVFKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgIkFkZGluZyBhIGJ1bmRsZSBTU1JDIGRlbXV4ZXIgdG8gc2Vzc2lvbiAldSIsCisgICAgICAgIHNlc3Npb24tPmlkKTsKKyAgICBzZXNzaW9uLT5idW5kbGVfZGVtdXggPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBzc3JjZGVtdXgiLCBOVUxMKTsKKyAgICBzZXNzaW9uLT5idW5kbGVfZGVtdXhfbmV3cGFkX3NpZyA9IGdfc2lnbmFsX2Nvbm5lY3QgKHNlc3Npb24tPmJ1bmRsZV9kZW11eCwKKyAgICAgICAgIm5ldy1zc3JjLXBhZCIsIChHQ2FsbGJhY2spIG5ld19idW5kbGVkX3NzcmNfcGFkX2ZvdW5kLCBzZXNzaW9uKTsKKworICAgIGdzdF9iaW5fYWRkIChHU1RfQklOX0NBU1QgKHJ0cGJpbiksIHNlc3Npb24tPmJ1bmRsZV9kZW11eCk7CisgICAgZ3N0X2VsZW1lbnRfc3luY19zdGF0ZV93aXRoX3BhcmVudCAoc2Vzc2lvbi0+YnVuZGxlX2RlbXV4KTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sCisgICAgICAgICJObyBoYW5kbGVyIGZvciB0aGUgb24tYnVuZGxlZC1zc3JjIHNpZ25hbCBzbyBubyBuZWVkIGZvciBhIGJ1bmRsZSBTU1JDIGRlbXV4ZXIgaW4gc2Vzc2lvbiAldSIsCisgICAgICAgIHNlc3Npb24tPmlkKTsKKyAgfQorfQorCitzdGF0aWMgR3N0UGFkICoKK2NvbXBsZXRlX3Nlc3Npb25fc2luayAoR3N0UnRwQmluICogcnRwYmluLCBHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbiwKKyAgICBnYm9vbGVhbiBidW5kbGVfZGVtdXhlcl9uZWVkZWQpCit7CisgIGd1aW50IHNlc3NpZCA9IHNlc3Npb24tPmlkOworICBHc3RQYWQgKnJlY3ZfcnRwX3Npbms7CisgIEdzdFBhZCAqZnVubmVsX3NyYzsKKyAgR3N0RWxlbWVudCAqZGVjb2RlcjsKKworICBnX2Fzc2VydCAoIXNlc3Npb24tPnJlY3ZfcnRwX3NpbmspOworCisgIC8qIGdldCByZWN2X3J0cCBwYWQgYW5kIHN0b3JlICovCisgIHNlc3Npb24tPnJlY3ZfcnRwX3NpbmsgPQorICAgICAgZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChzZXNzaW9uLT5zZXNzaW9uLCAicmVjdl9ydHBfc2luayIpOworICBpZiAoc2Vzc2lvbi0+cmVjdl9ydHBfc2luayA9PSBOVUxMKQorICAgIGdvdG8gcGFkX2ZhaWxlZDsKKworICBnX3NpZ25hbF9jb25uZWN0IChzZXNzaW9uLT5yZWN2X3J0cF9zaW5rLCAibm90aWZ5OjpjYXBzIiwKKyAgICAgIChHQ2FsbGJhY2spIGNhcHNfY2hhbmdlZCwgc2Vzc2lvbik7CisKKyAgaWYgKGJ1bmRsZV9kZW11eGVyX25lZWRlZCkKKyAgICBzZXNzaW9uX21heWJlX2NyZWF0ZV9idW5kbGVfZGVtdXhlciAoc2Vzc2lvbik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwYmluLCAicmVxdWVzdGluZyBSVFAgZGVjb2RlciIpOworICBkZWNvZGVyID0gc2Vzc2lvbl9yZXF1ZXN0X2VsZW1lbnQgKHNlc3Npb24sIFNJR05BTF9SRVFVRVNUX1JUUF9ERUNPREVSKTsKKyAgaWYgKGRlY29kZXIpIHsKKyAgICBHc3RQYWQgKmRlY3NyYywgKmRlY3Npbms7CisgICAgR3N0UGFkTGlua1JldHVybiByZXQ7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJsaW5raW5nIFJUUCBkZWNvZGVyIik7CisgICAgZGVjc2luayA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChkZWNvZGVyLCAicnRwX3NpbmsiKTsKKyAgICBpZiAoZGVjc2luayA9PSBOVUxMKQorICAgICAgZ290byBkZWNfc2lua19mYWlsZWQ7CisKKyAgICByZWN2X3J0cF9zaW5rID0gZGVjc2luazsKKworICAgIGRlY3NyYyA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChkZWNvZGVyLCAicnRwX3NyYyIpOworICAgIGlmIChkZWNzcmMgPT0gTlVMTCkKKyAgICAgIGdvdG8gZGVjX3NyY19mYWlsZWQ7CisKKyAgICBpZiAoc2Vzc2lvbi0+YnVuZGxlX2RlbXV4KSB7CisgICAgICBHc3RQYWQgKmRlbXV4X3Npbms7CisgICAgICBkZW11eF9zaW5rID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNlc3Npb24tPmJ1bmRsZV9kZW11eCwgInNpbmsiKTsKKyAgICAgIHJldCA9IGdzdF9wYWRfbGluayAoZGVjc3JjLCBkZW11eF9zaW5rKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKGRlbXV4X3NpbmspOworICAgIH0gZWxzZSB7CisgICAgICByZXQgPSBnc3RfcGFkX2xpbmsgKGRlY3NyYywgc2Vzc2lvbi0+cmVjdl9ydHBfc2luayk7CisgICAgfQorICAgIGdzdF9vYmplY3RfdW5yZWYgKGRlY3NyYyk7CisKKyAgICBpZiAocmV0ICE9IEdTVF9QQURfTElOS19PSykKKyAgICAgIGdvdG8gZGVjX2xpbmtfZmFpbGVkOworCisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwYmluLCAibm8gUlRQIGRlY29kZXIgZ2l2ZW4iKTsKKyAgICBpZiAoc2Vzc2lvbi0+YnVuZGxlX2RlbXV4KSB7CisgICAgICByZWN2X3J0cF9zaW5rID0KKyAgICAgICAgICBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc2Vzc2lvbi0+YnVuZGxlX2RlbXV4LCAic2luayIpOworICAgIH0gZWxzZSB7CisgICAgICByZWN2X3J0cF9zaW5rID0KKyAgICAgICAgICBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHNlc3Npb24tPnJ0cF9mdW5uZWwsICJzaW5rXyV1Iik7CisgICAgfQorICB9CisKKyAgZnVubmVsX3NyYyA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzZXNzaW9uLT5ydHBfZnVubmVsLCAic3JjIik7CisgIGdzdF9wYWRfbGluayAoZnVubmVsX3NyYywgc2Vzc2lvbi0+cmVjdl9ydHBfc2luayk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGZ1bm5lbF9zcmMpOworCisgIHJldHVybiByZWN2X3J0cF9zaW5rOworCisgIC8qIEVSUk9SUyAqLworcGFkX2ZhaWxlZDoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGJpbjogZmFpbGVkIHRvIGdldCBzZXNzaW9uIHJlY3ZfcnRwX3NpbmsgcGFkIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2RlY19zaW5rX2ZhaWxlZDoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGJpbjogZmFpbGVkIHRvIGdldCBkZWNvZGVyIHNpbmsgcGFkIGZvciBzZXNzaW9uICV1Iiwgc2Vzc2lkKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorZGVjX3NyY19mYWlsZWQ6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGZhaWxlZCB0byBnZXQgZGVjb2RlciBzcmMgcGFkIGZvciBzZXNzaW9uICV1Iiwgc2Vzc2lkKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChyZWN2X3J0cF9zaW5rKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorZGVjX2xpbmtfZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gbGluayBydHAgZGVjb2RlciBmb3Igc2Vzc2lvbiAldSIsIHNlc3NpZCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocmVjdl9ydHBfc2luayk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NvbXBsZXRlX3Nlc3Npb25fcmVjZWl2ZXIgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24sCisgICAgZ3VpbnQgc2Vzc2lkKQoreworICBHc3RFbGVtZW50ICphdXg7CisgIEdzdFBhZCAqcmVjdl9ydHBfc3JjOworCisgIGdfYXNzZXJ0ICghc2Vzc2lvbi0+cmVjdl9ydHBfc3JjKTsKKworICBzZXNzaW9uLT5yZWN2X3J0cF9zcmMgPQorICAgICAgZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNlc3Npb24tPnNlc3Npb24sICJyZWN2X3J0cF9zcmMiKTsKKyAgaWYgKHNlc3Npb24tPnJlY3ZfcnRwX3NyYyA9PSBOVUxMKQorICAgIGdvdG8gcGFkX2ZhaWxlZDsKKworICAvKiBmaW5kIG91dCBpZiB3ZSBuZWVkIEFVWCBlbGVtZW50cyBvciBpZiB3ZSBjYW4gZ28gaW50byB0aGUgU1NSQyBkZW11eGVyCisgICAqIGRpcmVjdGx5ICovCisgIGF1eCA9IHNlc3Npb25fcmVxdWVzdF9lbGVtZW50IChzZXNzaW9uLCBTSUdOQUxfUkVRVUVTVF9BVVhfUkVDRUlWRVIpOworICBpZiAoYXV4KSB7CisgICAgZ2NoYXIgKnBuYW1lOworICAgIEdzdFBhZCAqYXV4c2luazsKKyAgICBHc3RQYWRMaW5rUmV0dXJuIHJldDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImxpbmtpbmcgQVVYIHJlY2VpdmVyIik7CisKKyAgICBwbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInNpbmtfJXUiLCBzZXNzaWQpOworICAgIGF1eHNpbmsgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoYXV4LCBwbmFtZSk7CisgICAgZ19mcmVlIChwbmFtZSk7CisgICAgaWYgKGF1eHNpbmsgPT0gTlVMTCkKKyAgICAgIGdvdG8gYXV4X3NpbmtfZmFpbGVkOworCisgICAgcmV0ID0gZ3N0X3BhZF9saW5rIChzZXNzaW9uLT5yZWN2X3J0cF9zcmMsIGF1eHNpbmspOworICAgIGdzdF9vYmplY3RfdW5yZWYgKGF1eHNpbmspOworICAgIGlmIChyZXQgIT0gR1NUX1BBRF9MSU5LX09LKQorICAgICAgZ290byBhdXhfbGlua19mYWlsZWQ7CisKKyAgICAvKiB0aGlzIGNhbiBiZSBOVUxMIHdoZW4gdGhpcyBBVVggZWxlbWVudCBpcyBub3QgdG8gYmUgbGlua2VkIHRvCisgICAgICogYW4gU1NSQyBkZW11eGVyICovCisgICAgcG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzcmNfJXUiLCBzZXNzaWQpOworICAgIHJlY3ZfcnRwX3NyYyA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChhdXgsIHBuYW1lKTsKKyAgICBnX2ZyZWUgKHBuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICByZWN2X3J0cF9zcmMgPSBnc3Rfb2JqZWN0X3JlZiAoc2Vzc2lvbi0+cmVjdl9ydHBfc3JjKTsKKyAgfQorCisgIGlmIChyZWN2X3J0cF9zcmMpIHsKKyAgICBHc3RQYWQgKnNpbmtkcGFkOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwYmluLCAiZ2V0dGluZyBkZW11eGVyIFJUUCBzaW5rIHBhZCIpOworICAgIHNpbmtkcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNlc3Npb24tPmRlbXV4LCAic2luayIpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImxpbmtpbmcgZGVtdXhlciBSVFAgc2luayBwYWQiKTsKKyAgICBnc3RfcGFkX2xpbmtfZnVsbCAocmVjdl9ydHBfc3JjLCBzaW5rZHBhZCwgR1NUX1BBRF9MSU5LX0NIRUNLX05PVEhJTkcpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtkcGFkKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChyZWN2X3J0cF9zcmMpOworCisgICAgLyogY29ubmVjdCB0byB0aGUgbmV3LXNzcmMtcGFkIHNpZ25hbCBvZiB0aGUgU1NSQyBkZW11eGVyICovCisgICAgc2Vzc2lvbi0+ZGVtdXhfbmV3cGFkX3NpZyA9IGdfc2lnbmFsX2Nvbm5lY3QgKHNlc3Npb24tPmRlbXV4LAorICAgICAgICAibmV3LXNzcmMtcGFkIiwgKEdDYWxsYmFjaykgbmV3X3NzcmNfcGFkX2ZvdW5kLCBzZXNzaW9uKTsKKyAgICBzZXNzaW9uLT5kZW11eF9wYWRyZW1vdmVkX3NpZyA9IGdfc2lnbmFsX2Nvbm5lY3QgKHNlc3Npb24tPmRlbXV4LAorICAgICAgICAicmVtb3ZlZC1zc3JjLXBhZCIsIChHQ2FsbGJhY2spIHNzcmNfZGVtdXhfcGFkX3JlbW92ZWQsIHNlc3Npb24pOworICB9CisKKyAgcmV0dXJuOworCitwYWRfZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gZ2V0IHNlc3Npb24gcmVjdl9ydHBfc3JjIHBhZCIpOworICAgIHJldHVybjsKKyAgfQorYXV4X3NpbmtfZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gZ2V0IEFVWCBzaW5rIHBhZCBmb3Igc2Vzc2lvbiAldSIsIHNlc3NpZCk7CisgICAgcmV0dXJuOworICB9CithdXhfbGlua19mYWlsZWQ6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGZhaWxlZCB0byBsaW5rIEFVWCBwYWQgdG8gc2Vzc2lvbiAldSIsIHNlc3NpZCk7CisgICAgcmV0dXJuOworICB9Cit9CisKKy8qIENyZWF0ZSBhIHBhZCBmb3IgcmVjZWl2aW5nIFJUUCBmb3IgdGhlIHNlc3Npb24gaW4gQG5hbWUuIE11c3QgYmUgY2FsbGVkIHdpdGgKKyAqIFJUUF9CSU5fTE9DSy4KKyAqLworc3RhdGljIEdzdFBhZCAqCitjcmVhdGVfcmVjdl9ydHAgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgR3N0UGFkVGVtcGxhdGUgKiB0ZW1wbCwgY29uc3QgZ2NoYXIgKiBuYW1lKQoreworICBndWludCBzZXNzaWQ7CisgIEdzdFJ0cEJpblNlc3Npb24gKnNlc3Npb247CisgIEdzdFBhZCAqcmVjdl9ydHBfc2luazsKKworICAvKiBmaXJzdCBnZXQgdGhlIHNlc3Npb24gbnVtYmVyICovCisgIGlmIChuYW1lID09IE5VTEwgfHwgc3NjYW5mIChuYW1lLCAicmVjdl9ydHBfc2lua18ldSIsICZzZXNzaWQpICE9IDEpCisgICAgZ290byBub19uYW1lOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImZpbmRpbmcgc2Vzc2lvbiAldSIsIHNlc3NpZCk7CisKKyAgLyogZ2V0IG9yIGNyZWF0ZSBzZXNzaW9uICovCisgIHNlc3Npb24gPSBmaW5kX3Nlc3Npb25fYnlfaWQgKHJ0cGJpbiwgc2Vzc2lkKTsKKyAgaWYgKCFzZXNzaW9uKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwYmluLCAiY3JlYXRpbmcgc2Vzc2lvbiAldSIsIHNlc3NpZCk7CisgICAgLyogY3JlYXRlIHNlc3Npb24gbm93ICovCisgICAgc2Vzc2lvbiA9IGNyZWF0ZV9zZXNzaW9uIChydHBiaW4sIHNlc3NpZCk7CisgICAgaWYgKHNlc3Npb24gPT0gTlVMTCkKKyAgICAgIGdvdG8gY3JlYXRlX2Vycm9yOworICB9CisKKyAgLyogY2hlY2sgaWYgcGFkIHdhcyByZXF1ZXN0ZWQgKi8KKyAgaWYgKHNlc3Npb24tPnJlY3ZfcnRwX3NpbmtfZ2hvc3QgIT0gTlVMTCkKKyAgICByZXR1cm4gc2Vzc2lvbi0+cmVjdl9ydHBfc2lua19naG9zdDsKKworICAvKiBzZXR1cCB0aGUgc2Vzc2lvbiBzaW5rIHBhZCAqLworICByZWN2X3J0cF9zaW5rID0gY29tcGxldGVfc2Vzc2lvbl9zaW5rIChydHBiaW4sIHNlc3Npb24sIFRSVUUpOworICBpZiAoIXJlY3ZfcnRwX3NpbmspCisgICAgZ290byBzZXNzaW9uX3NpbmtfZmFpbGVkOworCisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwYmluLCAiZ2hvc3Rpbmcgc2Vzc2lvbiBzaW5rIHBhZCIpOworICBzZXNzaW9uLT5yZWN2X3J0cF9zaW5rX2dob3N0ID0KKyAgICAgIGdzdF9naG9zdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKG5hbWUsIHJlY3ZfcnRwX3NpbmssIHRlbXBsKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocmVjdl9ydHBfc2luayk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc2Vzc2lvbi0+cmVjdl9ydHBfc2lua19naG9zdCwgVFJVRSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cGJpbiksIHNlc3Npb24tPnJlY3ZfcnRwX3NpbmtfZ2hvc3QpOworCisgIGNvbXBsZXRlX3Nlc3Npb25fcmVjZWl2ZXIgKHJ0cGJpbiwgc2Vzc2lvbiwgc2Vzc2lkKTsKKworICByZXR1cm4gc2Vzc2lvbi0+cmVjdl9ydHBfc2lua19naG9zdDsKKworICAvKiBFUlJPUlMgKi8KK25vX25hbWU6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGludmFsaWQgbmFtZSBnaXZlbiIpOworICAgIHJldHVybiBOVUxMOworICB9CitjcmVhdGVfZXJyb3I6CisgIHsKKyAgICAvKiBjcmVhdGVfc2Vzc2lvbiBhbHJlYWR5IHdhcm5lZCAqLworICAgIHJldHVybiBOVUxMOworICB9CitzZXNzaW9uX3NpbmtfZmFpbGVkOgorICB7CisgICAgLyogd2FybmluZyBhbHJlYWR5IGRvbmUgKi8KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX3JlY3ZfcnRwIChHc3RSdHBCaW4gKiBydHBiaW4sIEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzaW9uKQoreworICBpZiAoc2Vzc2lvbi0+ZGVtdXhfbmV3cGFkX3NpZykgeworICAgIGdfc2lnbmFsX2hhbmRsZXJfZGlzY29ubmVjdCAoc2Vzc2lvbi0+ZGVtdXgsIHNlc3Npb24tPmRlbXV4X25ld3BhZF9zaWcpOworICAgIHNlc3Npb24tPmRlbXV4X25ld3BhZF9zaWcgPSAwOworICB9CisgIGlmIChzZXNzaW9uLT5kZW11eF9wYWRyZW1vdmVkX3NpZykgeworICAgIGdfc2lnbmFsX2hhbmRsZXJfZGlzY29ubmVjdCAoc2Vzc2lvbi0+ZGVtdXgsIHNlc3Npb24tPmRlbXV4X3BhZHJlbW92ZWRfc2lnKTsKKyAgICBzZXNzaW9uLT5kZW11eF9wYWRyZW1vdmVkX3NpZyA9IDA7CisgIH0KKyAgaWYgKHNlc3Npb24tPmJ1bmRsZV9kZW11eF9uZXdwYWRfc2lnKSB7CisgICAgZ19zaWduYWxfaGFuZGxlcl9kaXNjb25uZWN0IChzZXNzaW9uLT5idW5kbGVfZGVtdXgsCisgICAgICAgIHNlc3Npb24tPmJ1bmRsZV9kZW11eF9uZXdwYWRfc2lnKTsKKyAgICBzZXNzaW9uLT5idW5kbGVfZGVtdXhfbmV3cGFkX3NpZyA9IDA7CisgIH0KKyAgaWYgKHNlc3Npb24tPnJlY3ZfcnRwX3NyYykgeworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNlc3Npb24tPnJlY3ZfcnRwX3NyYyk7CisgICAgc2Vzc2lvbi0+cmVjdl9ydHBfc3JjID0gTlVMTDsKKyAgfQorICBpZiAoc2Vzc2lvbi0+cmVjdl9ydHBfc2luaykgeworICAgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKHNlc3Npb24tPnNlc3Npb24sIHNlc3Npb24tPnJlY3ZfcnRwX3NpbmspOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNlc3Npb24tPnJlY3ZfcnRwX3NpbmspOworICAgIHNlc3Npb24tPnJlY3ZfcnRwX3NpbmsgPSBOVUxMOworICB9CisgIGlmIChzZXNzaW9uLT5yZWN2X3J0cF9zaW5rX2dob3N0KSB7CisgICAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzZXNzaW9uLT5yZWN2X3J0cF9zaW5rX2dob3N0LCBGQUxTRSk7CisgICAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwYmluKSwKKyAgICAgICAgc2Vzc2lvbi0+cmVjdl9ydHBfc2lua19naG9zdCk7CisgICAgc2Vzc2lvbi0+cmVjdl9ydHBfc2lua19naG9zdCA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIEdzdFBhZCAqCitjb21wbGV0ZV9zZXNzaW9uX3J0Y3AgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24sCisgICAgZ3VpbnQgc2Vzc2lkLCBnYm9vbGVhbiBidW5kbGVfZGVtdXhlcl9uZWVkZWQpCit7CisgIEdzdEVsZW1lbnQgKmRlY29kZXI7CisgIEdzdFBhZCAqc2lua2RwYWQ7CisgIEdzdFBhZCAqZGVjc2luayA9IE5VTEw7CisgIEdzdFBhZCAqZnVubmVsX3NyYzsKKworICAvKiBnZXQgcmVjdl9ydHAgcGFkIGFuZCBzdG9yZSAqLworICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJnZXR0aW5nIFJUQ1Agc2luayBwYWQiKTsKKyAgc2Vzc2lvbi0+cmVjdl9ydGNwX3NpbmsgPQorICAgICAgZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChzZXNzaW9uLT5zZXNzaW9uLCAicmVjdl9ydGNwX3NpbmsiKTsKKyAgaWYgKHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rID09IE5VTEwpCisgICAgZ290byBwYWRfZmFpbGVkOworCisgIGlmIChidW5kbGVfZGVtdXhlcl9uZWVkZWQpCisgICAgc2Vzc2lvbl9tYXliZV9jcmVhdGVfYnVuZGxlX2RlbXV4ZXIgKHNlc3Npb24pOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImdldHRpbmcgUlRDUCBkZWNvZGVyIik7CisgIGRlY29kZXIgPSBzZXNzaW9uX3JlcXVlc3RfZWxlbWVudCAoc2Vzc2lvbiwgU0lHTkFMX1JFUVVFU1RfUlRDUF9ERUNPREVSKTsKKyAgaWYgKGRlY29kZXIpIHsKKyAgICBHc3RQYWQgKmRlY3NyYzsKKyAgICBHc3RQYWRMaW5rUmV0dXJuIHJldDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImxpbmtpbmcgUlRDUCBkZWNvZGVyIik7CisgICAgZGVjc2luayA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChkZWNvZGVyLCAicnRjcF9zaW5rIik7CisgICAgZGVjc3JjID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGRlY29kZXIsICJydGNwX3NyYyIpOworCisgICAgaWYgKGRlY3NpbmsgPT0gTlVMTCkKKyAgICAgIGdvdG8gZGVjX3NpbmtfZmFpbGVkOworCisgICAgaWYgKGRlY3NyYyA9PSBOVUxMKQorICAgICAgZ290byBkZWNfc3JjX2ZhaWxlZDsKKworICAgIGlmIChzZXNzaW9uLT5idW5kbGVfZGVtdXgpIHsKKyAgICAgIEdzdFBhZCAqZGVtdXhfc2luazsKKyAgICAgIGRlbXV4X3NpbmsgPQorICAgICAgICAgIGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzZXNzaW9uLT5idW5kbGVfZGVtdXgsICJydGNwX3NpbmsiKTsKKyAgICAgIHJldCA9IGdzdF9wYWRfbGluayAoZGVjc3JjLCBkZW11eF9zaW5rKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKGRlbXV4X3NpbmspOworICAgIH0gZWxzZSB7CisgICAgICByZXQgPSBnc3RfcGFkX2xpbmsgKGRlY3NyYywgc2Vzc2lvbi0+cmVjdl9ydGNwX3NpbmspOworICAgIH0KKyAgICBnc3Rfb2JqZWN0X3VucmVmIChkZWNzcmMpOworCisgICAgaWYgKHJldCAhPSBHU1RfUEFEX0xJTktfT0spCisgICAgICBnb3RvIGRlY19saW5rX2ZhaWxlZDsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJubyBSVENQIGRlY29kZXIgZ2l2ZW4iKTsKKyAgICBpZiAoc2Vzc2lvbi0+YnVuZGxlX2RlbXV4KSB7CisgICAgICBkZWNzaW5rID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNlc3Npb24tPmJ1bmRsZV9kZW11eCwgInJ0Y3Bfc2luayIpOworICAgIH0gZWxzZSB7CisgICAgICBkZWNzaW5rID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChzZXNzaW9uLT5ydGNwX2Z1bm5lbCwgInNpbmtfJXUiKTsKKyAgICB9CisgIH0KKworICAvKiBnZXQgc3JjcGFkLCBsaW5rIHRvIFNTUkNEZW11eCAqLworICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJnZXR0aW5nIHN5bmMgc3JjIHBhZCIpOworICBzZXNzaW9uLT5zeW5jX3NyYyA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzZXNzaW9uLT5zZXNzaW9uLCAic3luY19zcmMiKTsKKyAgaWYgKHNlc3Npb24tPnN5bmNfc3JjID09IE5VTEwpCisgICAgZ290byBzcmNfcGFkX2ZhaWxlZDsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJnZXR0aW5nIGRlbXV4ZXIgUlRDUCBzaW5rIHBhZCIpOworICBzaW5rZHBhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzZXNzaW9uLT5kZW11eCwgInJ0Y3Bfc2luayIpOworICBnc3RfcGFkX2xpbmtfZnVsbCAoc2Vzc2lvbi0+c3luY19zcmMsIHNpbmtkcGFkLCBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtkcGFkKTsKKworICBmdW5uZWxfc3JjID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNlc3Npb24tPnJ0Y3BfZnVubmVsLCAic3JjIik7CisgIGdzdF9wYWRfbGluayAoZnVubmVsX3NyYywgc2Vzc2lvbi0+cmVjdl9ydGNwX3NpbmspOworICBnc3Rfb2JqZWN0X3VucmVmIChmdW5uZWxfc3JjKTsKKworICByZXR1cm4gZGVjc2luazsKKworcGFkX2ZhaWxlZDoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGJpbjogZmFpbGVkIHRvIGdldCBzZXNzaW9uIHJ0Y3Bfc2luayBwYWQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorZGVjX3NpbmtfZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gZ2V0IGRlY29kZXIgc2luayBwYWQgZm9yIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIHJldHVybiBOVUxMOworICB9CitkZWNfc3JjX2ZhaWxlZDoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGJpbjogZmFpbGVkIHRvIGdldCBkZWNvZGVyIHNyYyBwYWQgZm9yIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorZGVjX2xpbmtfZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gbGluayBydGNwIGRlY29kZXIgZm9yIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorc3JjX3BhZF9mYWlsZWQ6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGZhaWxlZCB0byBnZXQgc2Vzc2lvbiBzeW5jX3NyYyBwYWQiKTsKKyAgfQorCitjbGVhbnVwOgorICBnc3Rfb2JqZWN0X3VucmVmIChkZWNzaW5rKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIENyZWF0ZSBhIHBhZCBmb3IgcmVjZWl2aW5nIFJUQ1AgZm9yIHRoZSBzZXNzaW9uIGluIEBuYW1lLiBNdXN0IGJlIGNhbGxlZCB3aXRoCisgKiBSVFBfQklOX0xPQ0suCisgKi8KK3N0YXRpYyBHc3RQYWQgKgorY3JlYXRlX3JlY3ZfcnRjcCAoR3N0UnRwQmluICogcnRwYmluLCBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLAorICAgIGNvbnN0IGdjaGFyICogbmFtZSkKK3sKKyAgZ3VpbnQgc2Vzc2lkOworICBHc3RSdHBCaW5TZXNzaW9uICpzZXNzaW9uOworICBHc3RQYWQgKmRlY3NpbmsgPSBOVUxMOworCisgIC8qIGZpcnN0IGdldCB0aGUgc2Vzc2lvbiBudW1iZXIgKi8KKyAgaWYgKG5hbWUgPT0gTlVMTCB8fCBzc2NhbmYgKG5hbWUsICJyZWN2X3J0Y3Bfc2lua18ldSIsICZzZXNzaWQpICE9IDEpCisgICAgZ290byBub19uYW1lOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImZpbmRpbmcgc2Vzc2lvbiAldSIsIHNlc3NpZCk7CisKKyAgLyogZ2V0IG9yIGNyZWF0ZSB0aGUgc2Vzc2lvbiAqLworICBzZXNzaW9uID0gZmluZF9zZXNzaW9uX2J5X2lkIChydHBiaW4sIHNlc3NpZCk7CisgIGlmICghc2Vzc2lvbikgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImNyZWF0aW5nIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIC8qIGNyZWF0ZSBzZXNzaW9uIG5vdyAqLworICAgIHNlc3Npb24gPSBjcmVhdGVfc2Vzc2lvbiAocnRwYmluLCBzZXNzaWQpOworICAgIGlmIChzZXNzaW9uID09IE5VTEwpCisgICAgICBnb3RvIGNyZWF0ZV9lcnJvcjsKKyAgfQorCisgIC8qIGNoZWNrIGlmIHBhZCB3YXMgcmVxdWVzdGVkICovCisgIGlmIChzZXNzaW9uLT5yZWN2X3J0Y3Bfc2lua19naG9zdCAhPSBOVUxMKQorICAgIHJldHVybiBzZXNzaW9uLT5yZWN2X3J0Y3Bfc2lua19naG9zdDsKKworICBkZWNzaW5rID0gY29tcGxldGVfc2Vzc2lvbl9ydGNwIChydHBiaW4sIHNlc3Npb24sIHNlc3NpZCwgVFJVRSk7CisgIGlmICghZGVjc2luaykKKyAgICBnb3RvIGNyZWF0ZV9lcnJvcjsKKworICBzZXNzaW9uLT5yZWN2X3J0Y3Bfc2lua19naG9zdCA9CisgICAgICBnc3RfZ2hvc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChuYW1lLCBkZWNzaW5rLCB0ZW1wbCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGRlY3NpbmspOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rX2dob3N0LCBUUlVFKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwYmluKSwKKyAgICAgIHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rX2dob3N0KTsKKworICByZXR1cm4gc2Vzc2lvbi0+cmVjdl9ydGNwX3NpbmtfZ2hvc3Q7CisKKyAgLyogRVJST1JTICovCitub19uYW1lOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBpbnZhbGlkIG5hbWUgZ2l2ZW4iKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorY3JlYXRlX2Vycm9yOgorICB7CisgICAgLyogY3JlYXRlX3Nlc3Npb24gYWxyZWFkeSB3YXJuZWQgKi8KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX3JlY3ZfcnRjcCAoR3N0UnRwQmluICogcnRwYmluLCBHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbikKK3sKKyAgaWYgKHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rX2dob3N0KSB7CisgICAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzZXNzaW9uLT5yZWN2X3J0Y3Bfc2lua19naG9zdCwgRkFMU0UpOworICAgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cGJpbiksCisgICAgICAgIHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rX2dob3N0KTsKKyAgICBzZXNzaW9uLT5yZWN2X3J0Y3Bfc2lua19naG9zdCA9IE5VTEw7CisgIH0KKyAgaWYgKHNlc3Npb24tPnN5bmNfc3JjKSB7CisgICAgLyogcmVsZWFzaW5nIHRoZSByZXF1ZXN0IHBhZCBzaG91bGQgYWxzbyB1bnJlZiB0aGUgc3luYyBwYWQgKi8KKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzZXNzaW9uLT5zeW5jX3NyYyk7CisgICAgc2Vzc2lvbi0+c3luY19zcmMgPSBOVUxMOworICB9CisgIGlmIChzZXNzaW9uLT5yZWN2X3J0Y3Bfc2luaykgeworICAgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKHNlc3Npb24tPnNlc3Npb24sIHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzZXNzaW9uLT5yZWN2X3J0Y3Bfc2luayk7CisgICAgc2Vzc2lvbi0+cmVjdl9ydGNwX3NpbmsgPSBOVUxMOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorY29tcGxldGVfc2Vzc2lvbl9zcmMgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24pCit7CisgIGdjaGFyICpnbmFtZTsKKyAgZ3VpbnQgc2Vzc2lkID0gc2Vzc2lvbi0+aWQ7CisgIEdzdFBhZCAqc2VuZF9ydHBfc3JjOworICBHc3RFbGVtZW50ICplbmNvZGVyOworICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzOworICBHc3RQYWRUZW1wbGF0ZSAqdGVtcGw7CisKKyAgLyogZ2V0IHNyY3BhZCAqLworICBzZXNzaW9uLT5zZW5kX3J0cF9zcmMgPQorICAgICAgZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNlc3Npb24tPnNlc3Npb24sICJzZW5kX3J0cF9zcmMiKTsKKyAgaWYgKHNlc3Npb24tPnNlbmRfcnRwX3NyYyA9PSBOVUxMKQorICAgIGdvdG8gbm9fc3JjcGFkOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImdldHRpbmcgUlRQIGVuY29kZXIiKTsKKyAgZW5jb2RlciA9IHNlc3Npb25fcmVxdWVzdF9lbGVtZW50IChzZXNzaW9uLCBTSUdOQUxfUkVRVUVTVF9SVFBfRU5DT0RFUik7CisgIGlmIChlbmNvZGVyKSB7CisgICAgZ2NoYXIgKmVuYW1lOworICAgIEdzdFBhZCAqZW5jc3JjLCAqZW5jc2luazsKKyAgICBHc3RQYWRMaW5rUmV0dXJuIHJldDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImxpbmtpbmcgUlRQIGVuY29kZXIiKTsKKyAgICBlbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInJ0cF9zcmNfJXUiLCBzZXNzaWQpOworICAgIGVuY3NyYyA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChlbmNvZGVyLCBlbmFtZSk7CisgICAgZ19mcmVlIChlbmFtZSk7CisKKyAgICBpZiAoZW5jc3JjID09IE5VTEwpCisgICAgICBnb3RvIGVuY19zcmNfZmFpbGVkOworCisgICAgc2VuZF9ydHBfc3JjID0gZW5jc3JjOworCisgICAgZW5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJydHBfc2lua18ldSIsIHNlc3NpZCk7CisgICAgZW5jc2luayA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChlbmNvZGVyLCBlbmFtZSk7CisgICAgZ19mcmVlIChlbmFtZSk7CisgICAgaWYgKGVuY3NpbmsgPT0gTlVMTCkKKyAgICAgIGdvdG8gZW5jX3NpbmtfZmFpbGVkOworCisgICAgcmV0ID0gZ3N0X3BhZF9saW5rIChzZXNzaW9uLT5zZW5kX3J0cF9zcmMsIGVuY3NpbmspOworICAgIGdzdF9vYmplY3RfdW5yZWYgKGVuY3NpbmspOworCisgICAgaWYgKHJldCAhPSBHU1RfUEFEX0xJTktfT0spCisgICAgICBnb3RvIGVuY19saW5rX2ZhaWxlZDsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJubyBSVFAgZW5jb2RlciBnaXZlbiIpOworICAgIHNlbmRfcnRwX3NyYyA9IGdzdF9vYmplY3RfcmVmIChzZXNzaW9uLT5zZW5kX3J0cF9zcmMpOworICB9CisKKyAgLyogZ2hvc3QgdGhlIG5ldyBzb3VyY2UgcGFkICovCisgIGtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChydHBiaW4pOworICBnbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInNlbmRfcnRwX3NyY18ldSIsIHNlc3NpZCk7CisgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJzZW5kX3J0cF9zcmNfJXUiKTsKKyAgc2Vzc2lvbi0+c2VuZF9ydHBfc3JjX2dob3N0ID0KKyAgICAgIGdzdF9naG9zdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKGduYW1lLCBzZW5kX3J0cF9zcmMsIHRlbXBsKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2VuZF9ydHBfc3JjKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzZXNzaW9uLT5zZW5kX3J0cF9zcmNfZ2hvc3QsIFRSVUUpOworICBnc3RfcGFkX3N0aWNreV9ldmVudHNfZm9yZWFjaCAoc2VuZF9ydHBfc3JjLCBjb3B5X3N0aWNreV9ldmVudHMsCisgICAgICBzZXNzaW9uLT5zZW5kX3J0cF9zcmNfZ2hvc3QpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBiaW4pLCBzZXNzaW9uLT5zZW5kX3J0cF9zcmNfZ2hvc3QpOworICBnX2ZyZWUgKGduYW1lKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK25vX3NyY3BhZDoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGJpbjogZmFpbGVkIHRvIGdldCBydHAgc291cmNlIHBhZCBmb3Igc2Vzc2lvbiAldSIsIHNlc3NpZCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitlbmNfc3JjX2ZhaWxlZDoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGJpbjogZmFpbGVkIHRvIGdldCBlbmNvZGVyIHNyYyBwYWQgZm9yIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorZW5jX3NpbmtfZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gZ2V0IGVuY29kZXIgc2luayBwYWQgZm9yIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNlbmRfcnRwX3NyYyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitlbmNfbGlua19mYWlsZWQ6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGZhaWxlZCB0byBsaW5rIHJ0cCBlbmNvZGVyIGZvciBzZXNzaW9uICV1Iiwgc2Vzc2lkKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzZW5kX3J0cF9zcmMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3NldHVwX2F1eF9zZW5kZXJfZm9sZCAoY29uc3QgR1ZhbHVlICogaXRlbSwgR1ZhbHVlICogcmVzdWx0LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFBhZCAqcGFkOworICBnY2hhciAqbmFtZTsKKyAgZ3VpbnQgc2Vzc2lkOworICBHc3RSdHBCaW5TZXNzaW9uICpzZXNzaW9uID0gdXNlcl9kYXRhLCAqbmV3c2VzczsKKyAgR3N0UnRwQmluICpydHBiaW4gPSBzZXNzaW9uLT5iaW47CisgIEdzdFBhZExpbmtSZXR1cm4gcmV0OworCisgIHBhZCA9IGdfdmFsdWVfZ2V0X29iamVjdCAoaXRlbSk7CisgIG5hbWUgPSBnc3RfcGFkX2dldF9uYW1lIChwYWQpOworCisgIGlmIChuYW1lID09IE5VTEwgfHwgc3NjYW5mIChuYW1lLCAic3JjXyV1IiwgJnNlc3NpZCkgIT0gMSkKKyAgICBnb3RvIG5vX25hbWU7CisKKyAgZ19mcmVlIChuYW1lKTsKKworICBuZXdzZXNzID0gZmluZF9zZXNzaW9uX2J5X2lkIChydHBiaW4sIHNlc3NpZCk7CisgIGlmIChuZXdzZXNzID09IE5VTEwpIHsKKyAgICAvKiBjcmVhdGUgbmV3IHNlc3Npb24gKi8KKyAgICBuZXdzZXNzID0gY3JlYXRlX3Nlc3Npb24gKHJ0cGJpbiwgc2Vzc2lkKTsKKyAgICBpZiAobmV3c2VzcyA9PSBOVUxMKQorICAgICAgZ290byBjcmVhdGVfZXJyb3I7CisgIH0gZWxzZSBpZiAobmV3c2Vzcy0+c2VuZF9ydHBfc2luayAhPSBOVUxMKQorICAgIGdvdG8gZXhpc3Rpbmdfc2Vzc2lvbjsKKworICAvKiBnZXQgc2VuZF9ydHAgcGFkIGFuZCBzdG9yZSAqLworICBuZXdzZXNzLT5zZW5kX3J0cF9zaW5rID0KKyAgICAgIGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAobmV3c2Vzcy0+c2Vzc2lvbiwgInNlbmRfcnRwX3NpbmsiKTsKKyAgaWYgKG5ld3Nlc3MtPnNlbmRfcnRwX3NpbmsgPT0gTlVMTCkKKyAgICBnb3RvIHBhZF9mYWlsZWQ7CisKKyAgcmV0ID0gZ3N0X3BhZF9saW5rIChwYWQsIG5ld3Nlc3MtPnNlbmRfcnRwX3NpbmspOworICBpZiAocmV0ICE9IEdTVF9QQURfTElOS19PSykKKyAgICBnb3RvIGF1eF9saW5rX2ZhaWxlZDsKKworICBpZiAoIWNvbXBsZXRlX3Nlc3Npb25fc3JjIChydHBiaW4sIG5ld3Nlc3MpKQorICAgIGdvdG8gc2Vzc2lvbl9zcmNfZmFpbGVkOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworbm9fbmFtZToKKyAgeworICAgIEdTVF9XQVJOSU5HICgiaWdub3JpbmcgaW52YWxpZCBwYWQgbmFtZSAlcyIsIEdTVF9TVFJfTlVMTCAobmFtZSkpOworICAgIGdfZnJlZSAobmFtZSk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KK2NyZWF0ZV9lcnJvcjoKKyAgeworICAgIC8qIGNyZWF0ZV9zZXNzaW9uIGFscmVhZHkgd2FybmVkICovCisgICAgcmV0dXJuIEZBTFNFOworICB9CitleGlzdGluZ19zZXNzaW9uOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBzZXNzaW9uICV1IGlzIGFscmVhZHkgYSBzZW5kZXIiLCBzZXNzaWQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorcGFkX2ZhaWxlZDoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGJpbjogZmFpbGVkIHRvIGdldCBzZXNzaW9uIHBhZCBmb3Igc2Vzc2lvbiAldSIsIHNlc3NpZCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CithdXhfbGlua19mYWlsZWQ6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGZhaWxlZCB0byBsaW5rIEFVWCBmb3Igc2Vzc2lvbiAldSIsIHNlc3NpZCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitzZXNzaW9uX3NyY19mYWlsZWQ6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGZhaWxlZCB0byBjb21wbGV0ZSBBVVggZm9yIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3NldHVwX2F1eF9zZW5kZXIgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24sCisgICAgR3N0RWxlbWVudCAqIGF1eCkKK3sKKyAgR3N0SXRlcmF0b3IgKml0OworICBHVmFsdWUgcmVzdWx0ID0geyAwLCB9OworICBHc3RJdGVyYXRvclJlc3VsdCByZXM7CisKKyAgaXQgPSBnc3RfZWxlbWVudF9pdGVyYXRlX3NyY19wYWRzIChhdXgpOworICByZXMgPSBnc3RfaXRlcmF0b3JfZm9sZCAoaXQsIHNldHVwX2F1eF9zZW5kZXJfZm9sZCwgJnJlc3VsdCwgc2Vzc2lvbik7CisgIGdzdF9pdGVyYXRvcl9mcmVlIChpdCk7CisKKyAgcmV0dXJuIHJlcyA9PSBHU1RfSVRFUkFUT1JfRE9ORTsKK30KKworLyogQ3JlYXRlIGEgcGFkIGZvciBzZW5kaW5nIFJUUCBmb3IgdGhlIHNlc3Npb24gaW4gQG5hbWUuIE11c3QgYmUgY2FsbGVkIHdpdGgKKyAqIFJUUF9CSU5fTE9DSy4KKyAqLworc3RhdGljIEdzdFBhZCAqCitjcmVhdGVfc2VuZF9ydHAgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgR3N0UGFkVGVtcGxhdGUgKiB0ZW1wbCwgY29uc3QgZ2NoYXIgKiBuYW1lKQoreworICBnY2hhciAqcG5hbWU7CisgIGd1aW50IHNlc3NpZDsKKyAgR3N0UGFkICpzZW5kX3J0cF9zaW5rOworICBHc3RFbGVtZW50ICphdXg7CisgIEdzdFJ0cEJpblNlc3Npb24gKnNlc3Npb247CisKKyAgLyogZmlyc3QgZ2V0IHRoZSBzZXNzaW9uIG51bWJlciAqLworICBpZiAobmFtZSA9PSBOVUxMIHx8IHNzY2FuZiAobmFtZSwgInNlbmRfcnRwX3NpbmtfJXUiLCAmc2Vzc2lkKSAhPSAxKQorICAgIGdvdG8gbm9fbmFtZTsKKworICAvKiBnZXQgb3IgY3JlYXRlIHNlc3Npb24gKi8KKyAgc2Vzc2lvbiA9IGZpbmRfc2Vzc2lvbl9ieV9pZCAocnRwYmluLCBzZXNzaWQpOworICBpZiAoIXNlc3Npb24pIHsKKyAgICAvKiBjcmVhdGUgc2Vzc2lvbiBub3cgKi8KKyAgICBzZXNzaW9uID0gY3JlYXRlX3Nlc3Npb24gKHJ0cGJpbiwgc2Vzc2lkKTsKKyAgICBpZiAoc2Vzc2lvbiA9PSBOVUxMKQorICAgICAgZ290byBjcmVhdGVfZXJyb3I7CisgIH0KKworICAvKiBjaGVjayBpZiBwYWQgd2FzIHJlcXVlc3RlZCAqLworICBpZiAoc2Vzc2lvbi0+c2VuZF9ydHBfc2lua19naG9zdCAhPSBOVUxMKQorICAgIHJldHVybiBzZXNzaW9uLT5zZW5kX3J0cF9zaW5rX2dob3N0OworCisgIC8qIGNoZWNrIGlmIHdlIGFyZSBhbHJlYWR5IHVzaW5nIHRoaXMgc2Vzc2lvbiBhcyBhIHNlbmRlciAqLworICBpZiAoc2Vzc2lvbi0+c2VuZF9ydHBfc2luayAhPSBOVUxMKQorICAgIGdvdG8gZXhpc3Rpbmdfc2Vzc2lvbjsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJnZXR0aW5nIFJUUCBBVVggc2VuZGVyIik7CisgIGF1eCA9IHNlc3Npb25fcmVxdWVzdF9lbGVtZW50IChzZXNzaW9uLCBTSUdOQUxfUkVRVUVTVF9BVVhfU0VOREVSKTsKKyAgaWYgKGF1eCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImxpbmtpbmcgQVVYIHNlbmRlciIpOworICAgIGlmICghc2V0dXBfYXV4X3NlbmRlciAocnRwYmluLCBzZXNzaW9uLCBhdXgpKQorICAgICAgZ290byBhdXhfc2Vzc2lvbl9mYWlsZWQ7CisKKyAgICBwbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInNpbmtfJXUiLCBzZXNzaWQpOworICAgIHNlbmRfcnRwX3NpbmsgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoYXV4LCBwbmFtZSk7CisgICAgZ19mcmVlIChwbmFtZSk7CisKKyAgICBpZiAoc2VuZF9ydHBfc2luayA9PSBOVUxMKQorICAgICAgZ290byBhdXhfc2lua19mYWlsZWQ7CisgIH0gZWxzZSB7CisgICAgLyogZ2V0IHNlbmRfcnRwIHBhZCBhbmQgc3RvcmUgKi8KKyAgICBzZXNzaW9uLT5zZW5kX3J0cF9zaW5rID0KKyAgICAgICAgZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChzZXNzaW9uLT5zZXNzaW9uLCAic2VuZF9ydHBfc2luayIpOworICAgIGlmIChzZXNzaW9uLT5zZW5kX3J0cF9zaW5rID09IE5VTEwpCisgICAgICBnb3RvIHBhZF9mYWlsZWQ7CisKKyAgICBpZiAoIWNvbXBsZXRlX3Nlc3Npb25fc3JjIChydHBiaW4sIHNlc3Npb24pKQorICAgICAgZ290byBzZXNzaW9uX3NyY19mYWlsZWQ7CisKKyAgICBzZW5kX3J0cF9zaW5rID0gZ3N0X29iamVjdF9yZWYgKHNlc3Npb24tPnNlbmRfcnRwX3NpbmspOworICB9CisKKyAgc2Vzc2lvbi0+c2VuZF9ydHBfc2lua19naG9zdCA9CisgICAgICBnc3RfZ2hvc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChuYW1lLCBzZW5kX3J0cF9zaW5rLCB0ZW1wbCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNlbmRfcnRwX3NpbmspOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNlc3Npb24tPnNlbmRfcnRwX3NpbmtfZ2hvc3QsIFRSVUUpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBiaW4pLCBzZXNzaW9uLT5zZW5kX3J0cF9zaW5rX2dob3N0KTsKKworICByZXR1cm4gc2Vzc2lvbi0+c2VuZF9ydHBfc2lua19naG9zdDsKKworICAvKiBFUlJPUlMgKi8KK25vX25hbWU6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGludmFsaWQgbmFtZSBnaXZlbiIpOworICAgIHJldHVybiBOVUxMOworICB9CitjcmVhdGVfZXJyb3I6CisgIHsKKyAgICAvKiBjcmVhdGVfc2Vzc2lvbiBhbHJlYWR5IHdhcm5lZCAqLworICAgIHJldHVybiBOVUxMOworICB9CitleGlzdGluZ19zZXNzaW9uOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBzZXNzaW9uICV1IGlzIGFscmVhZHkgaW4gdXNlIiwgc2Vzc2lkKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorYXV4X3Nlc3Npb25fZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gZ2V0IEFVWCBzaW5rIHBhZCBmb3Igc2Vzc2lvbiAldSIsIHNlc3NpZCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2F1eF9zaW5rX2ZhaWxlZDoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGJpbjogZmFpbGVkIHRvIGdldCBBVVggc2luayBwYWQgZm9yIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIHJldHVybiBOVUxMOworICB9CitwYWRfZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gZ2V0IHNlc3Npb24gcGFkIGZvciBzZXNzaW9uICV1Iiwgc2Vzc2lkKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorc2Vzc2lvbl9zcmNfZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gc2V0dXAgc291cmNlIHBhZHMgZm9yIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfc2VuZF9ydHAgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24pCit7CisgIGlmIChzZXNzaW9uLT5zZW5kX3J0cF9zcmNfZ2hvc3QpIHsKKyAgICBnc3RfcGFkX3NldF9hY3RpdmUgKHNlc3Npb24tPnNlbmRfcnRwX3NyY19naG9zdCwgRkFMU0UpOworICAgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cGJpbiksCisgICAgICAgIHNlc3Npb24tPnNlbmRfcnRwX3NyY19naG9zdCk7CisgICAgc2Vzc2lvbi0+c2VuZF9ydHBfc3JjX2dob3N0ID0gTlVMTDsKKyAgfQorICBpZiAoc2Vzc2lvbi0+c2VuZF9ydHBfc3JjKSB7CisgICAgZ3N0X29iamVjdF91bnJlZiAoc2Vzc2lvbi0+c2VuZF9ydHBfc3JjKTsKKyAgICBzZXNzaW9uLT5zZW5kX3J0cF9zcmMgPSBOVUxMOworICB9CisgIGlmIChzZXNzaW9uLT5zZW5kX3J0cF9zaW5rKSB7CisgICAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAoc2Vzc2lvbi0+c2Vzc2lvbiksCisgICAgICAgIHNlc3Npb24tPnNlbmRfcnRwX3NpbmspOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNlc3Npb24tPnNlbmRfcnRwX3NpbmspOworICAgIHNlc3Npb24tPnNlbmRfcnRwX3NpbmsgPSBOVUxMOworICB9CisgIGlmIChzZXNzaW9uLT5zZW5kX3J0cF9zaW5rX2dob3N0KSB7CisgICAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzZXNzaW9uLT5zZW5kX3J0cF9zaW5rX2dob3N0LCBGQUxTRSk7CisgICAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwYmluKSwKKyAgICAgICAgc2Vzc2lvbi0+c2VuZF9ydHBfc2lua19naG9zdCk7CisgICAgc2Vzc2lvbi0+c2VuZF9ydHBfc2lua19naG9zdCA9IE5VTEw7CisgIH0KK30KKworLyogQ3JlYXRlIGEgcGFkIGZvciBzZW5kaW5nIFJUQ1AgZm9yIHRoZSBzZXNzaW9uIGluIEBuYW1lLiBNdXN0IGJlIGNhbGxlZCB3aXRoCisgKiBSVFBfQklOX0xPQ0suCisgKi8KK3N0YXRpYyBHc3RQYWQgKgorY3JlYXRlX3NlbmRfcnRjcCAoR3N0UnRwQmluICogcnRwYmluLCBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLAorICAgIGNvbnN0IGdjaGFyICogbmFtZSkKK3sKKyAgZ3VpbnQgc2Vzc2lkOworICBHc3RQYWQgKmVuY3NyYzsKKyAgR3N0RWxlbWVudCAqZW5jb2RlcjsKKyAgR3N0UnRwQmluU2Vzc2lvbiAqc2Vzc2lvbjsKKworICAvKiBmaXJzdCBnZXQgdGhlIHNlc3Npb24gbnVtYmVyICovCisgIGlmIChuYW1lID09IE5VTEwgfHwgc3NjYW5mIChuYW1lLCAic2VuZF9ydGNwX3NyY18ldSIsICZzZXNzaWQpICE9IDEpCisgICAgZ290byBub19uYW1lOworCisgIC8qIGdldCBvciBjcmVhdGUgc2Vzc2lvbiAqLworICBzZXNzaW9uID0gZmluZF9zZXNzaW9uX2J5X2lkIChydHBiaW4sIHNlc3NpZCk7CisgIGlmICghc2Vzc2lvbikgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImNyZWF0aW5nIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIC8qIGNyZWF0ZSBzZXNzaW9uIG5vdyAqLworICAgIHNlc3Npb24gPSBjcmVhdGVfc2Vzc2lvbiAocnRwYmluLCBzZXNzaWQpOworICAgIGlmIChzZXNzaW9uID09IE5VTEwpCisgICAgICBnb3RvIGNyZWF0ZV9lcnJvcjsKKyAgfQorCisgIC8qIGNoZWNrIGlmIHBhZCB3YXMgcmVxdWVzdGVkICovCisgIGlmIChzZXNzaW9uLT5zZW5kX3J0Y3Bfc3JjX2dob3N0ICE9IE5VTEwpCisgICAgcmV0dXJuIHNlc3Npb24tPnNlbmRfcnRjcF9zcmNfZ2hvc3Q7CisKKyAgLyogZ2V0IHJ0Y3Bfc3JjIHBhZCBhbmQgc3RvcmUgKi8KKyAgc2Vzc2lvbi0+c2VuZF9ydGNwX3NyYyA9CisgICAgICBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHNlc3Npb24tPnNlc3Npb24sICJzZW5kX3J0Y3Bfc3JjIik7CisgIGlmIChzZXNzaW9uLT5zZW5kX3J0Y3Bfc3JjID09IE5VTEwpCisgICAgZ290byBwYWRfZmFpbGVkOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImdldHRpbmcgUlRDUCBlbmNvZGVyIik7CisgIGVuY29kZXIgPSBzZXNzaW9uX3JlcXVlc3RfZWxlbWVudCAoc2Vzc2lvbiwgU0lHTkFMX1JFUVVFU1RfUlRDUF9FTkNPREVSKTsKKyAgaWYgKGVuY29kZXIpIHsKKyAgICBnY2hhciAqZW5hbWU7CisgICAgR3N0UGFkICplbmNzaW5rOworICAgIEdzdFBhZExpbmtSZXR1cm4gcmV0OworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwYmluLCAibGlua2luZyBSVENQIGVuY29kZXIiKTsKKworICAgIGVuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgicnRjcF9zcmNfJXUiLCBzZXNzaWQpOworICAgIGVuY3NyYyA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChlbmNvZGVyLCBlbmFtZSk7CisgICAgZ19mcmVlIChlbmFtZSk7CisgICAgaWYgKGVuY3NyYyA9PSBOVUxMKQorICAgICAgZ290byBlbmNfc3JjX2ZhaWxlZDsKKworICAgIGVuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgicnRjcF9zaW5rXyV1Iiwgc2Vzc2lkKTsKKyAgICBlbmNzaW5rID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGVuY29kZXIsIGVuYW1lKTsKKyAgICBnX2ZyZWUgKGVuYW1lKTsKKyAgICBpZiAoZW5jc2luayA9PSBOVUxMKQorICAgICAgZ290byBlbmNfc2lua19mYWlsZWQ7CisKKyAgICByZXQgPSBnc3RfcGFkX2xpbmsgKHNlc3Npb24tPnNlbmRfcnRjcF9zcmMsIGVuY3NpbmspOworICAgIGdzdF9vYmplY3RfdW5yZWYgKGVuY3NpbmspOworCisgICAgaWYgKHJldCAhPSBHU1RfUEFEX0xJTktfT0spCisgICAgICBnb3RvIGVuY19saW5rX2ZhaWxlZDsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJubyBSVENQIGVuY29kZXIgZ2l2ZW4iKTsKKyAgICBlbmNzcmMgPSBnc3Rfb2JqZWN0X3JlZiAoc2Vzc2lvbi0+c2VuZF9ydGNwX3NyYyk7CisgIH0KKworICBzZXNzaW9uLT5zZW5kX3J0Y3Bfc3JjX2dob3N0ID0KKyAgICAgIGdzdF9naG9zdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKG5hbWUsIGVuY3NyYywgdGVtcGwpOworICBnc3Rfb2JqZWN0X3VucmVmIChlbmNzcmMpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNlc3Npb24tPnNlbmRfcnRjcF9zcmNfZ2hvc3QsIFRSVUUpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBiaW4pLCBzZXNzaW9uLT5zZW5kX3J0Y3Bfc3JjX2dob3N0KTsKKworICByZXR1cm4gc2Vzc2lvbi0+c2VuZF9ydGNwX3NyY19naG9zdDsKKworICAvKiBFUlJPUlMgKi8KK25vX25hbWU6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGludmFsaWQgbmFtZSBnaXZlbiIpOworICAgIHJldHVybiBOVUxMOworICB9CitjcmVhdGVfZXJyb3I6CisgIHsKKyAgICAvKiBjcmVhdGVfc2Vzc2lvbiBhbHJlYWR5IHdhcm5lZCAqLworICAgIHJldHVybiBOVUxMOworICB9CitwYWRfZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gZ2V0IHJ0Y3AgcGFkIGZvciBzZXNzaW9uICV1Iiwgc2Vzc2lkKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorZW5jX3NyY19mYWlsZWQ6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGZhaWxlZCB0byBnZXQgZW5jb2RlciBzcmMgcGFkIGZvciBzZXNzaW9uICV1Iiwgc2Vzc2lkKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorZW5jX3NpbmtfZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gZ2V0IGVuY29kZXIgc2luayBwYWQgZm9yIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKGVuY3NyYyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2VuY19saW5rX2ZhaWxlZDoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGJpbjogZmFpbGVkIHRvIGxpbmsgcnRjcCBlbmNvZGVyIGZvciBzZXNzaW9uICV1Iiwgc2Vzc2lkKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChlbmNzcmMpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfcnRjcCAoR3N0UnRwQmluICogcnRwYmluLCBHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbikKK3sKKyAgaWYgKHNlc3Npb24tPnNlbmRfcnRjcF9zcmNfZ2hvc3QpIHsKKyAgICBnc3RfcGFkX3NldF9hY3RpdmUgKHNlc3Npb24tPnNlbmRfcnRjcF9zcmNfZ2hvc3QsIEZBTFNFKTsKKyAgICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBiaW4pLAorICAgICAgICBzZXNzaW9uLT5zZW5kX3J0Y3Bfc3JjX2dob3N0KTsKKyAgICBzZXNzaW9uLT5zZW5kX3J0Y3Bfc3JjX2dob3N0ID0gTlVMTDsKKyAgfQorICBpZiAoc2Vzc2lvbi0+c2VuZF9ydGNwX3NyYykgeworICAgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKHNlc3Npb24tPnNlc3Npb24sIHNlc3Npb24tPnNlbmRfcnRjcF9zcmMpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNlc3Npb24tPnNlbmRfcnRjcF9zcmMpOworICAgIHNlc3Npb24tPnNlbmRfcnRjcF9zcmMgPSBOVUxMOworICB9Cit9CisKKy8qIElmIHRoZSByZXF1ZXN0ZWQgbmFtZSBpcyBOVUxMIHdlIHNob3VsZCBjcmVhdGUgYSBuYW1lIHdpdGgKKyAqIHRoZSBzZXNzaW9uIG51bWJlciBhc3N1bWluZyB3ZSB3YW50IHRoZSBsb3dlc3QgcG9zaWJsZSBzZXNzaW9uCisgKiB3aXRoIGEgZnJlZSBwYWQgbGlrZSB0aGUgdGVtcGxhdGUgKi8KK3N0YXRpYyBnY2hhciAqCitnc3RfcnRwX2Jpbl9nZXRfZnJlZV9wYWRfbmFtZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZFRlbXBsYXRlICogdGVtcGwpCit7CisgIGdib29sZWFuIG5hbWVfZm91bmQgPSBGQUxTRTsKKyAgZ2ludCBzZXNzaW9uID0gMDsKKyAgR3N0SXRlcmF0b3IgKnBhZF9pdCA9IE5VTEw7CisgIGdjaGFyICpwYWRfbmFtZSA9IE5VTEw7CisgIEdWYWx1ZSBkYXRhID0geyAwLCB9OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGVsZW1lbnQsICJmaW5kIGEgZnJlZSBwYWQgbmFtZSBmb3IgdGVtcGxhdGUiKTsKKyAgd2hpbGUgKCFuYW1lX2ZvdW5kKSB7CisgICAgZ2Jvb2xlYW4gZG9uZSA9IEZBTFNFOworCisgICAgZ19mcmVlIChwYWRfbmFtZSk7CisgICAgcGFkX25hbWUgPSBnX3N0cmR1cF9wcmludGYgKHRlbXBsLT5uYW1lX3RlbXBsYXRlLCBzZXNzaW9uKyspOworICAgIHBhZF9pdCA9IGdzdF9lbGVtZW50X2l0ZXJhdGVfcGFkcyAoR1NUX0VMRU1FTlQgKGVsZW1lbnQpKTsKKyAgICBuYW1lX2ZvdW5kID0gVFJVRTsKKyAgICB3aGlsZSAoIWRvbmUpIHsKKyAgICAgIHN3aXRjaCAoZ3N0X2l0ZXJhdG9yX25leHQgKHBhZF9pdCwgJmRhdGEpKSB7CisgICAgICAgIGNhc2UgR1NUX0lURVJBVE9SX09LOgorICAgICAgICB7CisgICAgICAgICAgR3N0UGFkICpwYWQ7CisgICAgICAgICAgZ2NoYXIgKm5hbWU7CisKKyAgICAgICAgICBwYWQgPSBnX3ZhbHVlX2dldF9vYmplY3QgKCZkYXRhKTsKKyAgICAgICAgICBuYW1lID0gZ3N0X3BhZF9nZXRfbmFtZSAocGFkKTsKKworICAgICAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHBhZF9uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBkb25lID0gVFJVRTsKKyAgICAgICAgICAgIG5hbWVfZm91bmQgPSBGQUxTRTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ19mcmVlIChuYW1lKTsKKyAgICAgICAgICBnX3ZhbHVlX3Jlc2V0ICgmZGF0YSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBHU1RfSVRFUkFUT1JfRVJST1I6CisgICAgICAgIGNhc2UgR1NUX0lURVJBVE9SX1JFU1lOQzoKKyAgICAgICAgICAvKiByZXN0YXJ0IGl0ZXJhdGlvbiAqLworICAgICAgICAgIGRvbmUgPSBUUlVFOworICAgICAgICAgIG5hbWVfZm91bmQgPSBGQUxTRTsKKyAgICAgICAgICBzZXNzaW9uID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfSVRFUkFUT1JfRE9ORToKKyAgICAgICAgICBkb25lID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgZ192YWx1ZV91bnNldCAoJmRhdGEpOworICAgIGdzdF9pdGVyYXRvcl9mcmVlIChwYWRfaXQpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZWxlbWVudCwgImZyZWUgcGFkIG5hbWUgZm91bmQ6ICclcyciLCBwYWRfbmFtZSk7CisgIHJldHVybiBwYWRfbmFtZTsKK30KKworLyoKKyAqLworc3RhdGljIEdzdFBhZCAqCitnc3RfcnRwX2Jpbl9yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsIGNvbnN0IGdjaGFyICogbmFtZSwgY29uc3QgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFJ0cEJpbiAqcnRwYmluOworICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzOworICBHc3RQYWQgKnJlc3VsdDsKKworICBnY2hhciAqcGFkX25hbWUgPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsICh0ZW1wbCAhPSBOVUxMLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9JU19SVFBfQklOIChlbGVtZW50KSwgTlVMTCk7CisKKyAgcnRwYmluID0gR1NUX1JUUF9CSU4gKGVsZW1lbnQpOworICBrbGFzcyA9IEdTVF9FTEVNRU5UX0dFVF9DTEFTUyAoZWxlbWVudCk7CisKKyAgR1NUX1JUUF9CSU5fTE9DSyAocnRwYmluKTsKKworICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgLyogdXNlIGEgZnJlZSBwYWQgbmFtZSAqLworICAgIHBhZF9uYW1lID0gZ3N0X3J0cF9iaW5fZ2V0X2ZyZWVfcGFkX25hbWUgKGVsZW1lbnQsIHRlbXBsKTsKKyAgfSBlbHNlIHsKKyAgICAvKiB1c2UgdGhlIHByb3ZpZGVkIG5hbWUgKi8KKyAgICBwYWRfbmFtZSA9IGdfc3RyZHVwIChuYW1lKTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgIlRyeWluZyB0byByZXF1ZXN0IGEgcGFkIHdpdGggbmFtZSAlcyIsIHBhZF9uYW1lKTsKKworICAvKiBmaWd1cmUgb3V0IHRoZSB0ZW1wbGF0ZSAqLworICBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJyZWN2X3J0cF9zaW5rXyV1IikpIHsKKyAgICByZXN1bHQgPSBjcmVhdGVfcmVjdl9ydHAgKHJ0cGJpbiwgdGVtcGwsIHBhZF9uYW1lKTsKKyAgfSBlbHNlIGlmICh0ZW1wbCA9PSBnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywKKyAgICAgICAgICAicmVjdl9ydGNwX3NpbmtfJXUiKSkgeworICAgIHJlc3VsdCA9IGNyZWF0ZV9yZWN2X3J0Y3AgKHJ0cGJpbiwgdGVtcGwsIHBhZF9uYW1lKTsKKyAgfSBlbHNlIGlmICh0ZW1wbCA9PSBnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywKKyAgICAgICAgICAic2VuZF9ydHBfc2lua18ldSIpKSB7CisgICAgcmVzdWx0ID0gY3JlYXRlX3NlbmRfcnRwIChydHBiaW4sIHRlbXBsLCBwYWRfbmFtZSk7CisgIH0gZWxzZSBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsCisgICAgICAgICAgInNlbmRfcnRjcF9zcmNfJXUiKSkgeworICAgIHJlc3VsdCA9IGNyZWF0ZV9zZW5kX3J0Y3AgKHJ0cGJpbiwgdGVtcGwsIHBhZF9uYW1lKTsKKyAgfSBlbHNlCisgICAgZ290byB3cm9uZ190ZW1wbGF0ZTsKKworICBnX2ZyZWUgKHBhZF9uYW1lKTsKKyAgR1NUX1JUUF9CSU5fVU5MT0NLIChydHBiaW4pOworCisgIHJldHVybiByZXN1bHQ7CisKKyAgLyogRVJST1JTICovCit3cm9uZ190ZW1wbGF0ZToKKyAgeworICAgIGdfZnJlZSAocGFkX25hbWUpOworICAgIEdTVF9SVFBfQklOX1VOTE9DSyAocnRwYmluKTsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IHRoaXMgaXMgbm90IG91ciB0ZW1wbGF0ZSIpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2Jpbl9yZWxlYXNlX3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZCAqIHBhZCkKK3sKKyAgR3N0UnRwQmluU2Vzc2lvbiAqc2Vzc2lvbjsKKyAgR3N0UnRwQmluICpydHBiaW47CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX0dIT1NUX1BBRCAocGFkKSk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19SVFBfQklOIChlbGVtZW50KSk7CisKKyAgcnRwYmluID0gR1NUX1JUUF9CSU4gKGVsZW1lbnQpOworCisgIEdTVF9SVFBfQklOX0xPQ0sgKHJ0cGJpbik7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgIlRyeWluZyB0byByZWxlYXNlIHBhZCAlczolcyIsCisgICAgICBHU1RfREVCVUdfUEFEX05BTUUgKHBhZCkpOworCisgIGlmICghKHNlc3Npb24gPSBmaW5kX3Nlc3Npb25fYnlfcGFkIChydHBiaW4sIHBhZCkpKQorICAgIGdvdG8gdW5rbm93bl9wYWQ7CisKKyAgaWYgKHNlc3Npb24tPnJlY3ZfcnRwX3NpbmtfZ2hvc3QgPT0gcGFkKSB7CisgICAgcmVtb3ZlX3JlY3ZfcnRwIChydHBiaW4sIHNlc3Npb24pOworICB9IGVsc2UgaWYgKHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rX2dob3N0ID09IHBhZCkgeworICAgIHJlbW92ZV9yZWN2X3J0Y3AgKHJ0cGJpbiwgc2Vzc2lvbik7CisgIH0gZWxzZSBpZiAoc2Vzc2lvbi0+c2VuZF9ydHBfc2lua19naG9zdCA9PSBwYWQpIHsKKyAgICByZW1vdmVfc2VuZF9ydHAgKHJ0cGJpbiwgc2Vzc2lvbik7CisgIH0gZWxzZSBpZiAoc2Vzc2lvbi0+c2VuZF9ydGNwX3NyY19naG9zdCA9PSBwYWQpIHsKKyAgICByZW1vdmVfcnRjcCAocnRwYmluLCBzZXNzaW9uKTsKKyAgfQorCisgIC8qIG5vIG1vcmUgcmVxdWVzdCBwYWRzLCBmcmVlIHRoZSBjb21wbGV0ZSBzZXNzaW9uICovCisgIGlmIChzZXNzaW9uLT5yZWN2X3J0cF9zaW5rX2dob3N0ID09IE5VTEwKKyAgICAgICYmIHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rX2dob3N0ID09IE5VTEwKKyAgICAgICYmIHNlc3Npb24tPnNlbmRfcnRwX3NpbmtfZ2hvc3QgPT0gTlVMTAorICAgICAgJiYgc2Vzc2lvbi0+c2VuZF9ydGNwX3NyY19naG9zdCA9PSBOVUxMKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwYmluLCAibm8gbW9yZSBwYWRzIGZvciBzZXNzaW9uICVwIiwgc2Vzc2lvbik7CisgICAgcnRwYmluLT5zZXNzaW9ucyA9IGdfc2xpc3RfcmVtb3ZlIChydHBiaW4tPnNlc3Npb25zLCBzZXNzaW9uKTsKKyAgICBmcmVlX3Nlc3Npb24gKHNlc3Npb24sIHJ0cGJpbik7CisgIH0KKyAgR1NUX1JUUF9CSU5fVU5MT0NLIChydHBiaW4pOworCisgIHJldHVybjsKKworICAvKiBFUlJPUiAqLwordW5rbm93bl9wYWQ6CisgIHsKKyAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgZ193YXJuaW5nICgicnRwYmluOiAlczolcyBpcyBub3Qgb25lIG9mIG91ciByZXF1ZXN0IHBhZHMiLAorICAgICAgICBHU1RfREVCVUdfUEFEX05BTUUgKHBhZCkpOworICAgIHJldHVybjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmggYi9nc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzIyYTIxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9CSU5fSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9CSU5fSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJydHBzZXNzaW9uLmgiCisjaW5jbHVkZSAiZ3N0cnRwc2Vzc2lvbi5oIgorI2luY2x1ZGUgInJ0cGppdHRlcmJ1ZmZlci5oIgorCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9CSU4gXAorICAoZ3N0X3J0cF9iaW5fZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9CSU4ob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfQklOLEdzdFJ0cEJpbikpCisjZGVmaW5lIEdTVF9SVFBfQklOX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9CSU4sR3N0UnRwQmluQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0JJTihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9CSU4pKQorI2RlZmluZSBHU1RfSVNfUlRQX0JJTl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfQklOKSkKKwordHlwZWRlZiBlbnVtCit7CisgIEdTVF9SVFBfQklOX1JUQ1BfU1lOQ19BTFdBWVMsCisgIEdTVF9SVFBfQklOX1JUQ1BfU1lOQ19JTklUSUFMLAorICBHU1RfUlRQX0JJTl9SVENQX1NZTkNfUlRQCit9IEdzdFJUQ1BTeW5jOworCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwQmluIEdzdFJ0cEJpbjsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBCaW5DbGFzcyBHc3RSdHBCaW5DbGFzczsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBCaW5Qcml2YXRlIEdzdFJ0cEJpblByaXZhdGU7CisKK3N0cnVjdCBfR3N0UnRwQmluIHsKKyAgR3N0QmluICAgICAgICAgYmluOworCisgIC8qPCBwcml2YXRlID4qLworICAvKiBkZWZhdWx0IGxhdGVuY3kgZm9yIHNlc3Npb25zICovCisgIGd1aW50ICAgICAgICAgICBsYXRlbmN5X21zOworICBndWludDY0ICAgICAgICAgbGF0ZW5jeV9uczsKKyAgZ2Jvb2xlYW4gICAgICAgIGRyb3Bfb25fbGF0ZW5jeTsKKyAgZ2Jvb2xlYW4gICAgICAgIGRvX2xvc3Q7CisgIGdib29sZWFuICAgICAgICBpZ25vcmVfcHQ7CisgIGdib29sZWFuICAgICAgICBudHBfc3luYzsKKyAgZ2ludCAgICAgICAgICAgIHJ0Y3Bfc3luYzsKKyAgZ3VpbnQgICAgICAgICAgIHJ0Y3Bfc3luY19pbnRlcnZhbDsKKyAgUlRQSml0dGVyQnVmZmVyTW9kZSBidWZmZXJfbW9kZTsKKyAgZ2Jvb2xlYW4gICAgICAgIGJ1ZmZlcmluZzsKKyAgZ2Jvb2xlYW4gICAgICAgIHVzZV9waXBlbGluZV9jbG9jazsKKyAgR3N0UnRwTnRwVGltZVNvdXJjZSBudHBfdGltZV9zb3VyY2U7CisgIGdib29sZWFuICAgICAgICBzZW5kX3N5bmNfZXZlbnQ7CisgIEdzdENsb2NrVGltZSAgICBidWZmZXJfc3RhcnQ7CisgIGdib29sZWFuICAgICAgICBkb19yZXRyYW5zbWlzc2lvbjsKKyAgR3N0UlRQUHJvZmlsZSAgIHJ0cF9wcm9maWxlOworICBnYm9vbGVhbiAgICAgICAgcnRjcF9zeW5jX3NlbmRfdGltZTsKKyAgZ2ludCAgICAgICAgICAgIG1heF9ydGNwX3J0cF90aW1lX2RpZmY7CisgIGd1aW50MzIgICAgICAgICBtYXhfZHJvcG91dF90aW1lOworICBndWludDMyICAgICAgICAgbWF4X21pc29yZGVyX3RpbWU7CisgIGdib29sZWFuICAgICAgICByZmM3MjczX3N5bmM7CisgIGd1aW50ICAgICAgICAgICBtYXhfc3RyZWFtczsKKyAgZ3VpbnQ2NCAgICAgICAgIG1heF90c19vZmZzZXRfYWRqdXN0bWVudDsKKyAgZ2ludDY0ICAgICAgICAgIG1heF90c19vZmZzZXQ7CisgIGdib29sZWFuICAgICAgICBtYXhfdHNfb2Zmc2V0X2lzX3NldDsKKworICAvKiBhIGxpc3Qgb2Ygc2Vzc2lvbiAqLworICBHU0xpc3QgICAgICAgICAqc2Vzc2lvbnM7CisKKyAgLyogYSBsaXN0IG9mIGNsaWVudHMsIHRoZXNlIGFyZSBzdHJlYW1zIHdpdGggdGhlIHNhbWUgQ05BTUUgKi8KKyAgR1NMaXN0ICAgICAgICAgKmNsaWVudHM7CisKKyAgLyogdGhlIGRlZmF1bHQgU0RFUyBpdGVtcyBmb3Igc2Vzc2lvbnMgKi8KKyAgR3N0U3RydWN0dXJlICAgKnNkZXM7CisKKyAgLyo8IHByaXZhdGUgPiovCisgIEdzdFJ0cEJpblByaXZhdGUgKnByaXY7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cEJpbkNsYXNzIHsKKyAgR3N0QmluQ2xhc3MgIHBhcmVudF9jbGFzczsKKworICAvKiBnZXQgdGhlIGNhcHMgZm9yIHB0ICovCisgIEdzdENhcHMqICAgICgqcmVxdWVzdF9wdF9tYXApICAgICAgIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbiwgZ3VpbnQgcHQpOworCisgIHZvaWQgICAgICAgICgqcGF5bG9hZF90eXBlX2NoYW5nZSkgIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbiwgZ3VpbnQgcHQpOworCisgIHZvaWQgICAgICAgICgqbmV3X2ppdHRlcmJ1ZmZlcikgICAgIChHc3RSdHBCaW4gKnJ0cGJpbiwgR3N0RWxlbWVudCAqaml0dGVyYnVmZmVyLCBndWludCBzZXNzaW9uLCBndWludDMyIHNzcmMpOworCisgIC8qIGFjdGlvbiBzaWduYWxzICovCisgIHZvaWQgICAgICAgICgqY2xlYXJfcHRfbWFwKSAgICAgICAgIChHc3RSdHBCaW4gKnJ0cGJpbik7CisgIHZvaWQgICAgICAgICgqcmVzZXRfc3luYykgICAgICAgICAgIChHc3RSdHBCaW4gKnJ0cGJpbik7CisgIEdzdEVsZW1lbnQqICgqZ2V0X3Nlc3Npb24pICAgICAgICAgIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbik7CisgIFJUUFNlc3Npb24qICgqZ2V0X2ludGVybmFsX3Nlc3Npb24pIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbik7CisKKyAgLyogc2Vzc2lvbiBtYW5hZ2VyIHNpZ25hbHMgKi8KKyAgdm9pZCAgICAgKCpvbl9uZXdfc3NyYykgICAgICAgKEdzdFJ0cEJpbiAqcnRwYmluLCBndWludCBzZXNzaW9uLCBndWludDMyIHNzcmMpOworICB2b2lkICAgICAoKm9uX3NzcmNfY29sbGlzaW9uKSAoR3N0UnRwQmluICpydHBiaW4sIGd1aW50IHNlc3Npb24sIGd1aW50MzIgc3NyYyk7CisgIHZvaWQgICAgICgqb25fc3NyY192YWxpZGF0ZWQpIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjKTsKKyAgdm9pZCAgICAgKCpvbl9zc3JjX2FjdGl2ZSkgICAgKEdzdFJ0cEJpbiAqcnRwYmluLCBndWludCBzZXNzaW9uLCBndWludDMyIHNzcmMpOworICB2b2lkICAgICAoKm9uX3NzcmNfc2RlcykgICAgICAoR3N0UnRwQmluICpydHBiaW4sIGd1aW50IHNlc3Npb24sIGd1aW50MzIgc3NyYyk7CisgIHZvaWQgICAgICgqb25fYnllX3NzcmMpICAgICAgIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjKTsKKyAgdm9pZCAgICAgKCpvbl9ieWVfdGltZW91dCkgICAgKEdzdFJ0cEJpbiAqcnRwYmluLCBndWludCBzZXNzaW9uLCBndWludDMyIHNzcmMpOworICB2b2lkICAgICAoKm9uX3RpbWVvdXQpICAgICAgICAoR3N0UnRwQmluICpydHBiaW4sIGd1aW50IHNlc3Npb24sIGd1aW50MzIgc3NyYyk7CisgIHZvaWQgICAgICgqb25fc2VuZGVyX3RpbWVvdXQpIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjKTsKKyAgdm9pZCAgICAgKCpvbl9ucHRfc3RvcCkgICAgICAgKEdzdFJ0cEJpbiAqcnRwYmluLCBndWludCBzZXNzaW9uLCBndWludDMyIHNzcmMpOworCisgIEdzdEVsZW1lbnQqICgqcmVxdWVzdF9ydHBfZW5jb2RlcikgIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbik7CisgIEdzdEVsZW1lbnQqICgqcmVxdWVzdF9ydHBfZGVjb2RlcikgIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbik7CisgIEdzdEVsZW1lbnQqICgqcmVxdWVzdF9ydGNwX2VuY29kZXIpIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbik7CisgIEdzdEVsZW1lbnQqICgqcmVxdWVzdF9ydGNwX2RlY29kZXIpIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbik7CisKKyAgR3N0RWxlbWVudCogKCpyZXF1ZXN0X2F1eF9zZW5kZXIpICAgKEdzdFJ0cEJpbiAqcnRwYmluLCBndWludCBzZXNzaW9uKTsKKyAgR3N0RWxlbWVudCogKCpyZXF1ZXN0X2F1eF9yZWNlaXZlcikgKEdzdFJ0cEJpbiAqcnRwYmluLCBndWludCBzZXNzaW9uKTsKKworICB2b2lkICAgICAoKm9uX25ld19zZW5kZXJfc3NyYykgICAgICAoR3N0UnRwQmluICpydHBiaW4sIGd1aW50IHNlc3Npb24sIGd1aW50MzIgc3NyYyk7CisgIHZvaWQgICAgICgqb25fc2VuZGVyX3NzcmNfYWN0aXZlKSAgIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjKTsKKworICBndWludCAgICAoKm9uX2J1bmRsZWRfc3NyYykgICAgICAgICAoR3N0UnRwQmluICpydHBiaW4sIGd1aW50IHNzcmMpOworfTsKKworR1R5cGUgZ3N0X3J0cF9iaW5fZ2V0X3R5cGUgKHZvaWQpOworCisjZW5kaWYgLyogX19HU1RfUlRQX0JJTl9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzZkNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jCkBAIC0wLDAgKzEsMjMzIEBACisvKiBSVFAgRFRNRiBtdXhlciBlbGVtZW50IGZvciBHU3RyZWFtZXIKKyAqCisgKiBnc3RydHBkdG1mbXV4LmM6CisgKgorICogQ29weXJpZ2h0IChDKSA8MjAwNy0yMDEwPiBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqICAgQ29udGFjdDogWmVlc2hhbiBBbGkgPHplZXNoYW4uYWxpQG5va2lhLmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDctMjAxMD4gQ29sbGFib3JhIEx0ZAorICogICBDb250YWN0OiBPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgIDIwMDAsMjAwNSBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cGR0bWZtdXgKKyAqIEBzZWVfYWxzbzogcnRwZHRtZnNyYywgZHRtZnNyYywgcnRwbXV4CisgKgorICogVGhlIFJUUCAiRFRNRiIgTXV4ZXIgbXV4ZXMgbXVsdGlwbGUgUlRQIHN0cmVhbXMgaW50byBhIHZhbGlkIFJUUAorICogc3RyZWFtLiBJdCBkb2VzIGV4YWN0bHkgd2hhdCBpdHMgcGFyZW50ICgjcnRwbXV4KSBkb2VzLCBleGNlcHQKKyAqIHRoYXQgaXQgcHJldmVudCBidWZmZXJzIGNvbWluZyBvdmVyIGEgcmVndWxhciBzaW5rX1wldSBwYWQgZnJvbSBnb2luZyB0aHJvdWdoCisgKiBmb3IgdGhlIGR1cmF0aW9uIG9mIGJ1ZmZlcnMgdGhhdCBjYW1lIGluIGEgcHJpb3JpdHlfc2lua19cJXUgcGFkLgorICoKKyAqIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgaWYgYSBkaXNjb250aW51b3VzIHNvdXJjZSBsaWtlIGR0bWZzcmMgb3IKKyAqIHJ0cGR0bWZzcmMgYXJlIGNvbm5lY3RlZCB0byB0aGUgcHJpb3JpdHkgc2luayBwYWRzLiBUaGlzIHdheSwgdGhlIGdlbmVyYXRlZAorICogRFRNRiBzaWduYWwgY2FuIHJlcGxhY2UgdGhlIHJlY29yZGVkIGF1ZGlvIHdoaWxlIHRoZSB0b25lIGlzIGJlaW5nIHNlbnQuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0cnRwZHRtZm11eC5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfcnRwX2R0bWZfbXV4X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9ydHBfZHRtZl9tdXhfZGVidWcKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHByaW9yaXR5X3NpbmtfZmFjdG9yeSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInByaW9yaXR5X3NpbmtfJXUiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAiKSk7CisKK3N0YXRpYyBHc3RQYWQgKmdzdF9ydHBfZHRtZl9tdXhfcmVxdWVzdF9uZXdfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLCBjb25zdCBnY2hhciAqIG5hbWUsIGNvbnN0IEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX2R0bWZfbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2R0bWZfbXV4X2FjY2VwdF9idWZmZXJfbG9ja2VkIChHc3RSVFBNdXggKiBydHBfbXV4LAorICAgIEdzdFJUUE11eFBhZFByaXZhdGUgKiBwYWRwcml2LCBHc3RSVFBCdWZmZXIgKiBydHBidWZmZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfZHRtZl9tdXhfc3JjX2V2ZW50IChHc3RSVFBNdXggKiBydHBfbXV4LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCitHX0RFRklORV9UWVBFIChHc3RSVFBEVE1GTXV4LCBnc3RfcnRwX2R0bWZfbXV4LCBHU1RfVFlQRV9SVFBfTVVYKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHRtZl9tdXhfaW5pdCAoR3N0UlRQRFRNRk11eCAqIG11eCkKK3sKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9kdG1mX211eF9jbGFzc19pbml0IChHc3RSVFBEVE1GTXV4Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBNdXhDbGFzcyAqZ3N0cnRwbXV4X2NsYXNzOworCisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBtdXhfY2xhc3MgPSAoR3N0UlRQTXV4Q2xhc3MgKikga2xhc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmcHJpb3JpdHlfc2lua19mYWN0b3J5KTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUlRQIG11eGVyIiwKKyAgICAgICJDb2RlYy9NdXhlciIsCisgICAgICAibWl4ZXMgUlRQIERUTUYgc3RyZWFtcyBpbnRvIG90aGVyIFJUUCBzdHJlYW1zIiwKKyAgICAgICJaZWVzaGFuIEFsaSA8Zmlyc3QubGFzdEBub2tpYS5jb20+Iik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cmVxdWVzdF9uZXdfcGFkID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2R0bWZfbXV4X3JlcXVlc3RfbmV3X3BhZCk7CisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kdG1mX211eF9jaGFuZ2Vfc3RhdGUpOworICBnc3RydHBtdXhfY2xhc3MtPmFjY2VwdF9idWZmZXJfbG9ja2VkID0gZ3N0X3J0cF9kdG1mX211eF9hY2NlcHRfYnVmZmVyX2xvY2tlZDsKKyAgZ3N0cnRwbXV4X2NsYXNzLT5zcmNfZXZlbnQgPSBnc3RfcnRwX2R0bWZfbXV4X3NyY19ldmVudDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2R0bWZfbXV4X2FjY2VwdF9idWZmZXJfbG9ja2VkIChHc3RSVFBNdXggKiBydHBfbXV4LAorICAgIEdzdFJUUE11eFBhZFByaXZhdGUgKiBwYWRwcml2LCBHc3RSVFBCdWZmZXIgKiBydHBidWZmZXIpCit7CisgIEdzdFJUUERUTUZNdXggKm11eCA9IEdTVF9SVFBfRFRNRl9NVVggKHJ0cF9tdXgpOworICBHc3RDbG9ja1RpbWUgcnVubmluZ190czsKKworICBydW5uaW5nX3RzID0gR1NUX0JVRkZFUl9QVFMgKHJ0cGJ1ZmZlci0+YnVmZmVyKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHJ1bm5pbmdfdHMpKSB7CisgICAgaWYgKHBhZHByaXYgJiYgcGFkcHJpdi0+c2VnbWVudC5mb3JtYXQgPT0gR1NUX0ZPUk1BVF9USU1FKQorICAgICAgcnVubmluZ190cyA9IGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJnBhZHByaXYtPnNlZ21lbnQsCisgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBHU1RfQlVGRkVSX1BUUyAocnRwYnVmZmVyLT5idWZmZXIpKTsKKworICAgIGlmIChwYWRwcml2ICYmIHBhZHByaXYtPnByaW9yaXR5KSB7CisgICAgICBpZiAoR1NUX0JVRkZFUl9QVFNfSVNfVkFMSUQgKHJ0cGJ1ZmZlci0+YnVmZmVyKSkgeworICAgICAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKG11eC0+bGFzdF9wcmlvcml0eV9lbmQpKQorICAgICAgICAgIG11eC0+bGFzdF9wcmlvcml0eV9lbmQgPQorICAgICAgICAgICAgICBNQVggKHJ1bm5pbmdfdHMgKyBHU1RfQlVGRkVSX0RVUkFUSU9OIChydHBidWZmZXItPmJ1ZmZlciksCisgICAgICAgICAgICAgIG11eC0+bGFzdF9wcmlvcml0eV9lbmQpOworICAgICAgICBlbHNlCisgICAgICAgICAgbXV4LT5sYXN0X3ByaW9yaXR5X2VuZCA9IHJ1bm5pbmdfdHMgKworICAgICAgICAgICAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChydHBidWZmZXItPmJ1ZmZlcik7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChtdXgsICJHb3QgYnVmZmVyICVwIG9uIHByaW9yaXR5IHBhZCwgIgorICAgICAgICAgICAgIiBibG9ja2luZyByZWd1bGFyIHBhZHMgdW50aWwgJSIgR1NUX1RJTUVfRk9STUFULCBydHBidWZmZXItPmJ1ZmZlciwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKG11eC0+bGFzdF9wcmlvcml0eV9lbmQpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXV4LCAiQnVmZmVyICVwIGhhcyBhbiBpbnZhbGlkIGR1cmF0aW9uLCIKKyAgICAgICAgICAgICIgbm90IGJsb2NraW5nIG90aGVyIHBhZCIsIHJ0cGJ1ZmZlci0+YnVmZmVyKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChtdXgtPmxhc3RfcHJpb3JpdHlfZW5kKSAmJgorICAgICAgICAgIHJ1bm5pbmdfdHMgPCBtdXgtPmxhc3RfcHJpb3JpdHlfZW5kKSB7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChtdXgsICJEcm9wcGluZyBidWZmZXIgJXAgYmVjYXVzZSBydW5uaW5nIHRpbWUiCisgICAgICAgICAgICAiICUiIEdTVF9USU1FX0ZPUk1BVCAiIDwgJSIgR1NUX1RJTUVfRk9STUFULCBydHBidWZmZXItPmJ1ZmZlciwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHJ1bm5pbmdfdHMpLCBHU1RfVElNRV9BUkdTIChtdXgtPmxhc3RfcHJpb3JpdHlfZW5kKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKG11eCwgIkJ1ZmZlciAlcCBoYXMgYW4gaW52YWxpZCB0aW1lc3RhbXAsIgorICAgICAgICAiIGxldHRpbmcgdGhyb3VnaCIsIHJ0cGJ1ZmZlci0+YnVmZmVyKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBHc3RQYWQgKgorZ3N0X3J0cF9kdG1mX211eF9yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLAorICAgIGNvbnN0IGdjaGFyICogbmFtZSwgY29uc3QgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFBhZCAqcGFkOworCisgIHBhZCA9CisgICAgICBHU1RfRUxFTUVOVF9DTEFTUyAoZ3N0X3J0cF9kdG1mX211eF9wYXJlbnRfY2xhc3MpLT5yZXF1ZXN0X25ld19wYWQKKyAgICAgIChlbGVtZW50LCB0ZW1wbCwgbmFtZSwgY2Fwcyk7CisKKyAgaWYgKHBhZCkgeworICAgIEdzdFJUUE11eFBhZFByaXZhdGUgKnBhZHByaXY7CisKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKGVsZW1lbnQpOworICAgIHBhZHByaXYgPSBnc3RfcGFkX2dldF9lbGVtZW50X3ByaXZhdGUgKHBhZCk7CisKKyAgICBpZiAoZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChlbGVtZW50KSwKKyAgICAgICAgICAgICJwcmlvcml0eV9zaW5rXyV1IikgPT0gR1NUX1BBRF9QQURfVEVNUExBVEUgKHBhZCkpCisgICAgICBwYWRwcml2LT5wcmlvcml0eSA9IFRSVUU7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGVsZW1lbnQpOworICB9CisKKyAgcmV0dXJuIHBhZDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2R0bWZfbXV4X3NyY19ldmVudCAoR3N0UlRQTXV4ICogcnRwX211eCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgaWYgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSkgeworICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChldmVudCk7CisKKyAgICBpZiAocyAmJiBnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiZHRtZi1ldmVudCIpKSB7CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHJ0cF9tdXgpOworICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChydHBfbXV4LT5sYXN0X3N0b3ApKSB7CisgICAgICAgIGV2ZW50ID0gKEdzdEV2ZW50ICopCisgICAgICAgICAgICBnc3RfbWluaV9vYmplY3RfbWFrZV93cml0YWJsZSAoR1NUX01JTklfT0JKRUNUX0NBU1QgKGV2ZW50KSk7CisgICAgICAgIHMgPSBnc3RfZXZlbnRfZ2V0X3N0cnVjdHVyZSAoZXZlbnQpOworICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoKEdzdFN0cnVjdHVyZSAqKSBzLAorICAgICAgICAgICAgImxhc3Qtc3RvcCIsIEdfVFlQRV9VSU5UNjQsIHJ0cF9tdXgtPmxhc3Rfc3RvcCwgTlVMTCk7CisgICAgICB9CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwX211eCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEdTVF9SVFBfTVVYX0NMQVNTIChnc3RfcnRwX2R0bWZfbXV4X3BhcmVudF9jbGFzcyktPnNyY19ldmVudCAocnRwX211eCwKKyAgICAgIGV2ZW50KTsKK30KKworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfZHRtZl9tdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RSVFBEVE1GTXV4ICptdXggPSBHU1RfUlRQX0RUTUZfTVVYIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgIHsKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAobXV4KTsKKyAgICAgIG11eC0+bGFzdF9wcmlvcml0eV9lbmQgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKG11eCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0KKyAgICAgIEdTVF9FTEVNRU5UX0NMQVNTIChnc3RfcnRwX2R0bWZfbXV4X3BhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwKKyAgICAgIHRyYW5zaXRpb24pOworCisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2R0bWZfbXV4X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfcnRwX2R0bWZfbXV4X2RlYnVnLCAicnRwZHRtZm11eCIsIDAsCisgICAgICAicnRwIGR0bWYgbXV4ZXIiKTsKKworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGR0bWZtdXgiLCBHU1RfUkFOS19OT05FLAorICAgICAgR1NUX1RZUEVfUlRQX0RUTUZfTVVYKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguaCBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTFlOWVjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qIFJUUCBtdXhlciBlbGVtZW50IGZvciBHU3RyZWFtZXIKKyAqCisgKiBnc3RydHBkdG1mbXV4Lmg6CisgKgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gTm9raWEgQ29ycG9yYXRpb24uCisgKiAgIENvbnRhY3Q6IFplZXNoYW4gQWxpIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICAyMDAwLDIwMDUgV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9EVE1GX01VWF9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0RUTUZfTVVYX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgImdzdHJ0cG11eC5oIgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9EVE1GX01VWCAoZ3N0X3J0cF9kdG1mX211eF9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0RUTUZfTVVYKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9EVE1GX01VWCwgR3N0UlRQRFRNRk11eCkpCisjZGVmaW5lIEdTVF9SVFBfRFRNRl9NVVhfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9EVE1GX01VWCwgR3N0UlRQRFRNRk11eCkpCisjZGVmaW5lIEdTVF9JU19SVFBfRFRNRl9NVVgob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0RUTUZfTVVYKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9EVE1GX01VWF9DTEFTUyhvYmopIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9EVE1GX01VWCkpCit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQRFRNRk11eCBHc3RSVFBEVE1GTXV4OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUERUTUZNdXhDbGFzcyBHc3RSVFBEVE1GTXV4Q2xhc3M7CisKKy8qKgorICogR3N0UlRQRFRNRk11eDoKKyAqCisgKiBUaGUgb3BhcXVlICNHc3RSVFBEVE1GTXV4IHN0cnVjdHVyZS4KKyAqLworc3RydWN0IF9Hc3RSVFBEVE1GTXV4Cit7CisgIEdzdFJUUE11eCBtdXg7CisKKyAgLyogUHJvdGVjdGVkIGJ5IG9iamVjdCBsb2NrICovCisgIEdzdENsb2NrVGltZSBsYXN0X3ByaW9yaXR5X2VuZDsKK307CisKK3N0cnVjdCBfR3N0UlRQRFRNRk11eENsYXNzCit7CisgIEdzdFJUUE11eENsYXNzIHBhcmVudF9jbGFzczsKKworICAvKiBzaWduYWxzICovCisgIHZvaWQgKCpsb2NraW5nKSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZCAqIHBhZCk7CisgIHZvaWQgKCp1bmxvY2tlZCkgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RQYWQgKiBwYWQpOworfTsKKworR1R5cGUgZ3N0X3J0cF9kdG1mX211eF9nZXRfdHlwZSAodm9pZCk7CitnYm9vbGVhbiBnc3RfcnRwX2R0bWZfbXV4X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1JUUF9EVE1GX01VWF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUyYzg4NwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jCkBAIC0wLDAgKzEsNDg2MiBAQAorLyoKKyAqIEZhcnNpZ2h0IFZvaWNlK1ZpZGVvIGxpYnJhcnkKKyAqCisgKiAgQ29weXJpZ2h0IDIwMDcgQ29sbGFib3JhIEx0ZCwKKyAqICBDb3B5cmlnaHQgMjAwNyBOb2tpYSBDb3Jwb3JhdGlvbgorICogICBAYXV0aG9yOiBQaGlsaXBwZSBLYWxhZiA8cGhpbGlwcGUua2FsYWZAY29sbGFib3JhLmNvLnVrPi4KKyAqICBDb3B5cmlnaHQgMjAwNyBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICogIENvcHlyaWdodCAyMDE1IEt1cmVudG8gKGh0dHA6Ly9rdXJlbnRvLm9yZy8pCisgKiAgIEBhdXRob3I6IE1pZ3VlbCBQYXLDrXMgPG1wYXJpc2RpYXpAZ21haWwuY29tPgorICogIENvcHlyaWdodCAyMDE2IFBleGlwIEFTCisgKiAgIEBhdXRob3I6IEhhdmFyZCBHcmFmZiA8aGF2YXJkQHBleGlwLmNvbT4KKyAqICAgQGF1dGhvcjogU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cGppdHRlcmJ1ZmZlcgorICoKKyAqIFRoaXMgZWxlbWVudCByZW9yZGVycyBhbmQgcmVtb3ZlcyBkdXBsaWNhdGUgUlRQIHBhY2tldHMgYXMgdGhleSBhcmUgcmVjZWl2ZWQKKyAqIGZyb20gYSBuZXR3b3JrIHNvdXJjZS4KKyAqCisgKiBUaGUgZWxlbWVudCBuZWVkcyB0aGUgY2xvY2stcmF0ZSBvZiB0aGUgUlRQIHBheWxvYWQgaW4gb3JkZXIgdG8gZXN0aW1hdGUgdGhlCisgKiBkZWxheS4gVGhpcyBpbmZvcm1hdGlvbiBpcyBvYnRhaW5lZCBlaXRoZXIgZnJvbSB0aGUgY2FwcyBvbiB0aGUgc2luayBwYWQgb3IsCisgKiB3aGVuIG5vIGNhcHMgYXJlIHByZXNlbnQsIGZyb20gdGhlICNHc3RSdHBKaXR0ZXJCdWZmZXI6OnJlcXVlc3QtcHQtbWFwIHNpZ25hbC4KKyAqIFRvIGNsZWFyIHRoZSBwcmV2aW91cyBwdC1tYXAgdXNlIHRoZSAjR3N0UnRwSml0dGVyQnVmZmVyOjpjbGVhci1wdC1tYXAgc2lnbmFsLgorICoKKyAqIFRoZSBydHBqaXR0ZXJidWZmZXIgd2lsbCB3YWl0IGZvciBtaXNzaW5nIHBhY2tldHMgdXAgdG8gYSBjb25maWd1cmFibGUgdGltZQorICogbGltaXQgdXNpbmcgdGhlICNHc3RSdHBKaXR0ZXJCdWZmZXI6bGF0ZW5jeSBwcm9wZXJ0eS4gUGFja2V0cyBhcnJpdmluZyB0b28KKyAqIGxhdGUgYXJlIGNvbnNpZGVyZWQgdG8gYmUgbG9zdCBwYWNrZXRzLiBJZiB0aGUgI0dzdFJ0cEppdHRlckJ1ZmZlcjpkby1sb3N0CisgKiBwcm9wZXJ0eSBpcyBzZXQsIGxvc3QgcGFja2V0cyB3aWxsIHJlc3VsdCBpbiBhIGN1c3RvbSBzZXJpYWxpemVkIGRvd25zdHJlYW0KKyAqIGV2ZW50IG9mIG5hbWUgR3N0UlRQUGFja2V0TG9zdC4gVGhlIGxvc3QgcGFja2V0IGV2ZW50cyBhcmUgdXN1YWxseSB1c2VkIGJ5IGEKKyAqIGRlcGF5bG9hZGVyIG9yIG90aGVyIGVsZW1lbnQgdG8gY3JlYXRlIGNvbmNlYWxtZW50IGRhdGEgb3Igc29tZSBvdGhlciBsb2dpYworICogdG8gZ3JhY2VmdWxseSBoYW5kbGUgdGhlIG1pc3NpbmcgcGFja2V0cy4KKyAqCisgKiBUaGUgaml0dGVyYnVmZmVyIHdpbGwgdXNlIHRoZSBEVFMgKG9yIFBUUyBpZiBubyBEVFMgaXMgc2V0KSBvZiB0aGUgaW5jb21taW5nCisgKiBidWZmZXIgYW5kIHRoZSBydHB0aW1lIGluc2lkZSB0aGUgUlRQIHBhY2tldCB0byBjcmVhdGUgYSBQVFMgb24gdGhlIG91dGdvaW5nCisgKiBidWZmZXIuCisgKgorICogVGhlIGppdHRlcmJ1ZmZlciBjYW4gYWxzbyBiZSBjb25maWd1cmVkIHRvIHNlbmQgZWFybHkgcmV0cmFuc21pc3Npb24gZXZlbnRzCisgKiB1cHN0cmVhbSBieSBzZXR0aW5nIHRoZSAjR3N0UnRwSml0dGVyQnVmZmVyOmRvLXJldHJhbnNtaXNzaW9uIHByb3BlcnR5LiBJbgorICogdGhpcyBtb2RlLCB0aGUgaml0dGVyYnVmZmVyIHRyaWVzIHRvIGVzdGltYXRlIHdoZW4gYSBwYWNrZXQgc2hvdWxkIGFycml2ZSBhbmQKKyAqIHNlbmRzIGEgY3VzdG9tIHVwc3RyZWFtIGV2ZW50IG5hbWVkIEdzdFJUUFJldHJhbnNtaXNzaW9uUmVxdWVzdCB3aGVuIHRoZQorICogcGFja2V0IGlzIGNvbnNpZGVyZWQgbGF0ZS4gVGhlIGluaXRpYWwgZXhwZWN0ZWQgcGFja2V0IGFycml2YWwgdGltZSBpcworICogY2FsY3VsYXRlZCBhcyBmb2xsb3dzOgorICoKKyAqIC0gSWYgc2VxbnVtIE4gYXJyaXZlZCBhdCB0aW1lIFQsIHNlcW51bSBOKzEgaXMgZXhwZWN0ZWQgdG8gYXJyaXZlIGF0CisgKiAgICAgVCArIHBhY2tldC1zcGFjaW5nICsgI0dzdFJ0cEppdHRlckJ1ZmZlcjpydHgtZGVsYXkuIFRoZSBwYWNrZXQgc3BhY2luZyBpcworICogICAgIGNhbGN1bGF0ZWQgZnJvbSB0aGUgRFRTIChvciBQVFMgaXMgbm8gRFRTKSBvZiB0d28gY29uc2VjdXRpdmUgUlRQCisgKiAgICAgcGFja2V0cyB3aXRoIGRpZmZlcmVudCBydHB0aW1lLgorICoKKyAqIC0gSWYgc2VxbnVtIE4wIGFycml2ZWQgYXQgdGltZSBUMCBhbmQgc2VxbnVtIE5tIGFycml2ZWQgYXQgdGltZSBUbSwKKyAqICAgICBzZXFudW0gTmkgaXMgZXhwZWN0ZWQgYXQgdGltZSBUaSA9IFQwICsgaSooVG0gLSBUMCkvKE5tIC0gTjApLiBBbnkKKyAqICAgICBwcmV2aW91c2x5IHNjaGVkdWxlZCB0aW1lb3V0IGlzIG92ZXJ3cml0dGVuLgorICoKKyAqIC0gSWYgc2VxbnVtIE4gYXJyaXZlZCwgYWxsIHNlcW51bSBvbGRlciB0aGFuCisgKiAgICAgTiAtICNHc3RSdHBKaXR0ZXJCdWZmZXI6cnR4LWRlbGF5LXJlb3JkZXIgYXJlIGNvbnNpZGVyZWQgbGF0ZQorICogICAgIGltbWVkaWF0ZWx5LiBUaGlzIGlzIHRvIHJlcXVlc3QgZmFzdCBmZWVkYmFjayBmb3IgYWJvbm9ybWFsbHkgcmVvcmRlcgorICogICAgIHBhY2tldHMgYmVmb3JlIGFueSBvZiB0aGUgcHJldmlvdXMgdGltZW91dHMgaXMgdHJpZ2dlcmVkLgorICoKKyAqIEEgbGF0ZSBwYWNrZXQgdHJpZ2dlcnMgdGhlIEdzdFJUUFJldHJhbnNtaXNzaW9uUmVxdWVzdCBjdXN0b20gdXBzdHJlYW0KKyAqIGV2ZW50LiBBZnRlciB0aGUgaW5pdGlhbCB0aW1lb3V0IGV4cGlyZXMgYW5kIHRoZSByZXRyYW5zbWlzc2lvbiBldmVudCBpcworICogc2VudCwgdGhlIHRpbWVvdXQgaXMgc2NoZWR1bGVkIGZvcgorICogVCArICNHc3RSdHBKaXR0ZXJCdWZmZXI6cnR4LXJldHJ5LXRpbWVvdXQuIElmIHRoZSBtaXNzaW5nIHBhY2tldCBkaWQgbm90CisgKiBhcnJpdmUgYWZ0ZXIgI0dzdFJ0cEppdHRlckJ1ZmZlcjpydHgtcmV0cnktdGltZW91dCwgYSBuZXcKKyAqIEdzdFJUUFJldHJhbnNtaXNzaW9uUmVxdWVzdCBpcyBzZW50IHVwc3RyZWFtIGFuZCB0aGUgdGltZW91dCBpcyByZXNjaGVkdWxlZAorICogYWdhaW4gZm9yIFQgKyAjR3N0UnRwSml0dGVyQnVmZmVyOnJ0eC1yZXRyeS10aW1lb3V0LiBUaGlzIHJlcGVhdHMgdW50aWwKKyAqICNHc3RSdHBKaXR0ZXJCdWZmZXI6cnR4LXJldHJ5LXBlcmlvZCBlbGFwc2VkLCBhdCB3aGljaCBwb2ludCBubyBmdXJ0aGVyCisgKiByZXRyYW5zbWlzc2lvbiByZXF1ZXN0cyBhcmUgc2VudCBhbmQgdGhlIHJlZ3VsYXIgbG9naWMgaXMgcGVyZm9ybWVkIHRvCisgKiBzY2hlZHVsZSBhIGxvc3QgcGFja2V0IGFzIGRpc2N1c3NlZCBhYm92ZS4KKyAqCisgKiBUaGlzIGVsZW1lbnQgYWN0cyBhcyBhIGxpdmUgZWxlbWVudCBhbmQgc28gYWRkcyAjR3N0UnRwSml0dGVyQnVmZmVyOmxhdGVuY3kKKyAqIHRvIHRoZSBwaXBlbGluZS4KKyAqCisgKiBUaGlzIGVsZW1lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHVzZWQgaW5zaWRlIHJ0cGJpbi4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHJ0c3BzcmMgbG9jYXRpb249cnRzcDovLzE5Mi4xNjguMS4xMzM6ODU1NC9tcGVnMW9yMkF1ZGlvVmlkZW9UZXN0ICEgcnRwaml0dGVyYnVmZmVyICEgcnRwbXB2ZGVwYXkgISBtcGVnMmRlYyAhIHh2aW1hZ2VzaW5rCisgKiBdfCBDb25uZWN0IHRvIGEgc3RyZWFtaW5nIHNlcnZlciBhbmQgZGVjb2RlIHRoZSBNUEVHIHZpZGVvLiBUaGUgaml0dGVyYnVmZmVyIGlzCisgKiBpbnNlcnRlZCBpbnRvIHRoZSBwaXBlbGluZSB0byBzbW9vdGggb3V0IG5ldHdvcmsgaml0dGVyIGFuZCB0byByZW9yZGVyIHRoZQorICogb3V0LW9mLW9yZGVyIFJUUCBwYWNrZXRzLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L25ldC9uZXQuaD4KKworI2luY2x1ZGUgImdzdHJ0cGppdHRlcmJ1ZmZlci5oIgorI2luY2x1ZGUgInJ0cGppdHRlcmJ1ZmZlci5oIgorI2luY2x1ZGUgInJ0cHN0YXRzLmgiCisKKyNpbmNsdWRlIDxnc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oPgorCitHU1RfREVCVUdfQ0FURUdPUlkgKHJ0cGppdHRlcmJ1ZmZlcl9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwaml0dGVyYnVmZmVyX2RlYnVnKQorCisvKiBSVFBKaXR0ZXJCdWZmZXIgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICBTSUdOQUxfUkVRVUVTVF9QVF9NQVAsCisgIFNJR05BTF9DTEVBUl9QVF9NQVAsCisgIFNJR05BTF9IQU5ETEVfU1lOQywKKyAgU0lHTkFMX09OX05QVF9TVE9QLAorICBTSUdOQUxfU0VUX0FDVElWRSwKKyAgTEFTVF9TSUdOQUwKK307CisKKyNkZWZpbmUgREVGQVVMVF9MQVRFTkNZX01TICAgICAgICAgIDIwMAorI2RlZmluZSBERUZBVUxUX0RST1BfT05fTEFURU5DWSAgICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9UU19PRkZTRVQgICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfVFNfT0ZGU0VUX0FESlVTVE1FTlQgMAorI2RlZmluZSBERUZBVUxUX0RPX0xPU1QgICAgICAgICAgICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9NT0RFICAgICAgICAgICAgICAgIFJUUF9KSVRURVJfQlVGRkVSX01PREVfU0xBVkUKKyNkZWZpbmUgREVGQVVMVF9QRVJDRU5UICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9ET19SRVRSQU5TTUlTU0lPTiAgIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfUlRYX05FWFRfU0VRTlVNICAgICBUUlVFCisjZGVmaW5lIERFRkFVTFRfUlRYX0RFTEFZICAgICAgICAgICAtMQorI2RlZmluZSBERUZBVUxUX1JUWF9NSU5fREVMQVkgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1JUWF9ERUxBWV9SRU9SREVSICAgMworI2RlZmluZSBERUZBVUxUX1JUWF9SRVRSWV9USU1FT1VUICAgLTEKKyNkZWZpbmUgREVGQVVMVF9SVFhfTUlOX1JFVFJZX1RJTUVPVVQgICAtMQorI2RlZmluZSBERUZBVUxUX1JUWF9SRVRSWV9QRVJJT0QgICAgLTEKKyNkZWZpbmUgREVGQVVMVF9SVFhfTUFYX1JFVFJJRVMgICAgLTEKKyNkZWZpbmUgREVGQVVMVF9SVFhfREVBRExJTkUgICAgICAgLTEKKyNkZWZpbmUgREVGQVVMVF9SVFhfU1RBVFNfVElNRU9VVCAgIDEwMDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGIDEwMDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfRFJPUE9VVF9USU1FICAgIDYwMDAwCisjZGVmaW5lIERFRkFVTFRfTUFYX01JU09SREVSX1RJTUUgICAyMDAwCisjZGVmaW5lIERFRkFVTFRfUkZDNzI3M19TWU5DICAgICAgICBGQUxTRQorI2RlZmluZSBERUZBVUxUX0ZBU1RTVEFSVF9NSU5fUEFDS0VUUyAwCisKKyNkZWZpbmUgREVGQVVMVF9BVVRPX1JUWF9ERUxBWSAoMjAgKiBHU1RfTVNFQ09ORCkKKyNkZWZpbmUgREVGQVVMVF9BVVRPX1JUWF9USU1FT1VUICg0MCAqIEdTVF9NU0VDT05EKQorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MQVRFTkNZLAorICBQUk9QX0RST1BfT05fTEFURU5DWSwKKyAgUFJPUF9UU19PRkZTRVQsCisgIFBST1BfTUFYX1RTX09GRlNFVF9BREpVU1RNRU5ULAorICBQUk9QX0RPX0xPU1QsCisgIFBST1BfTU9ERSwKKyAgUFJPUF9QRVJDRU5ULAorICBQUk9QX0RPX1JFVFJBTlNNSVNTSU9OLAorICBQUk9QX1JUWF9ORVhUX1NFUU5VTSwKKyAgUFJPUF9SVFhfREVMQVksCisgIFBST1BfUlRYX01JTl9ERUxBWSwKKyAgUFJPUF9SVFhfREVMQVlfUkVPUkRFUiwKKyAgUFJPUF9SVFhfUkVUUllfVElNRU9VVCwKKyAgUFJPUF9SVFhfTUlOX1JFVFJZX1RJTUVPVVQsCisgIFBST1BfUlRYX1JFVFJZX1BFUklPRCwKKyAgUFJPUF9SVFhfTUFYX1JFVFJJRVMsCisgIFBST1BfUlRYX0RFQURMSU5FLAorICBQUk9QX1JUWF9TVEFUU19USU1FT1VULAorICBQUk9QX1NUQVRTLAorICBQUk9QX01BWF9SVENQX1JUUF9USU1FX0RJRkYsCisgIFBST1BfTUFYX0RST1BPVVRfVElNRSwKKyAgUFJPUF9NQVhfTUlTT1JERVJfVElNRSwKKyAgUFJPUF9SRkM3MjczX1NZTkMsCisgIFBST1BfRkFTVFNUQVJUX01JTl9QQUNLRVRTCit9OworCisjZGVmaW5lIEpCVUZfTE9DSyhwcml2KSAgIEdfU1RNVF9TVEFSVCB7CQkJXAorICAgIEdTVF9UUkFDRSgiTG9ja2luZyBmcm9tIHRocmVhZCAlcCIsIGdfdGhyZWFkX3NlbGYoKSk7CVwKKyAgICAoZ19tdXRleF9sb2NrICgmKHByaXYpLT5qYnVmX2xvY2spKTsJCQlcCisgICAgR1NUX1RSQUNFKCJMb2NrZWQgZnJvbSB0aHJlYWQgJXAiLCBnX3RocmVhZF9zZWxmKCkpOwlcCisgIH0gR19TVE1UX0VORAorCisjZGVmaW5lIEpCVUZfTE9DS19DSEVDSyhwcml2LGxhYmVsKSBHX1NUTVRfU1RBUlQgeyAgICBcCisgIEpCVUZfTE9DSyAocHJpdik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChHX1VOTElLRUxZIChwcml2LT5zcmNyZXN1bHQgIT0gR1NUX0ZMT1dfT0spKSAgICBcCisgICAgZ290byBsYWJlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IEdfU1RNVF9FTkQKKyNkZWZpbmUgSkJVRl9VTkxPQ0socHJpdikgR19TVE1UX1NUQVJUIHsJCQlcCisgICAgR1NUX1RSQUNFICgiVW5sb2NraW5nIGZyb20gdGhyZWFkICVwIiwgZ190aHJlYWRfc2VsZiAoKSk7CVwKKyAgICAoZ19tdXRleF91bmxvY2sgKCYocHJpdiktPmpidWZfbG9jaykpOwkJCVwKK30gR19TVE1UX0VORAorCisjZGVmaW5lIEpCVUZfV0FJVF9USU1FUihwcml2KSAgIEdfU1RNVF9TVEFSVCB7ICAgICAgICAgICAgXAorICBHU1RfREVCVUcgKCJ3YWl0aW5nIHRpbWVyIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHByaXYpLT53YWl0aW5nX3RpbWVyID0gVFJVRTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdfY29uZF93YWl0ICgmKHByaXYpLT5qYnVmX3RpbWVyLCAmKHByaXYpLT5qYnVmX2xvY2spOyAgXAorICAocHJpdiktPndhaXRpbmdfdGltZXIgPSBGQUxTRTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR1NUX0RFQlVHICgid2FpdGluZyB0aW1lciBkb25lIik7ICAgICAgICAgICAgICAgICAgICAgICBcCit9IEdfU1RNVF9FTkQKKyNkZWZpbmUgSkJVRl9TSUdOQUxfVElNRVIocHJpdikgR19TVE1UX1NUQVJUIHsgICAgICAgICAgICBcCisgIGlmIChHX1VOTElLRUxZICgocHJpdiktPndhaXRpbmdfdGltZXIpKSB7ICAgICAgICAgICAgICAgXAorICAgIEdTVF9ERUJVRyAoInNpZ25hbCB0aW1lciIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnX2NvbmRfc2lnbmFsICgmKHByaXYpLT5qYnVmX3RpbWVyKTsgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSBHX1NUTVRfRU5ECisKKyNkZWZpbmUgSkJVRl9XQUlUX0VWRU5UKHByaXYsbGFiZWwpIEdfU1RNVF9TVEFSVCB7ICAgICAgIFwKKyAgR1NUX0RFQlVHICgid2FpdGluZyBldmVudCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHByaXYpLT53YWl0aW5nX2V2ZW50ID0gVFJVRTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ19jb25kX3dhaXQgKCYocHJpdiktPmpidWZfZXZlbnQsICYocHJpdiktPmpidWZfbG9jayk7IFwKKyAgKHByaXYpLT53YWl0aW5nX2V2ZW50ID0gRkFMU0U7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR1NUX0RFQlVHICgid2FpdGluZyBldmVudCBkb25lIik7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKEdfVU5MSUtFTFkgKHByaXYtPnNyY3Jlc3VsdCAhPSBHU1RfRkxPV19PSykpICAgICAgIFwKKyAgICBnb3RvIGxhYmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gR19TVE1UX0VORAorI2RlZmluZSBKQlVGX1NJR05BTF9FVkVOVChwcml2KSBHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgXAorICBpZiAoR19VTkxJS0VMWSAoKHByaXYpLT53YWl0aW5nX2V2ZW50KSkgeyAgICAgICAgICAgICAgXAorICAgIEdTVF9ERUJVRyAoInNpZ25hbCBldmVudCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdfY29uZF9zaWduYWwgKCYocHJpdiktPmpidWZfZXZlbnQpOyAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSBHX1NUTVRfRU5ECisKKyNkZWZpbmUgSkJVRl9XQUlUX1FVRVJZKHByaXYsbGFiZWwpIEdfU1RNVF9TVEFSVCB7ICAgICAgIFwKKyAgR1NUX0RFQlVHICgid2FpdGluZyBxdWVyeSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHByaXYpLT53YWl0aW5nX3F1ZXJ5ID0gVFJVRTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ19jb25kX3dhaXQgKCYocHJpdiktPmpidWZfcXVlcnksICYocHJpdiktPmpidWZfbG9jayk7IFwKKyAgKHByaXYpLT53YWl0aW5nX3F1ZXJ5ID0gRkFMU0U7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR1NUX0RFQlVHICgid2FpdGluZyBxdWVyeSBkb25lIik7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKEdfVU5MSUtFTFkgKHByaXYtPnNyY3Jlc3VsdCAhPSBHU1RfRkxPV19PSykpICAgICAgIFwKKyAgICBnb3RvIGxhYmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gR19TVE1UX0VORAorI2RlZmluZSBKQlVGX1NJR05BTF9RVUVSWShwcml2LHJlcykgR19TVE1UX1NUQVJUIHsgICAgICAgXAorICAocHJpdiktPmxhc3RfcXVlcnkgPSByZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoR19VTkxJS0VMWSAoKHByaXYpLT53YWl0aW5nX3F1ZXJ5KSkgeyAgICAgICAgICAgICAgXAorICAgIEdTVF9ERUJVRyAoInNpZ25hbCBxdWVyeSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdfY29uZF9zaWduYWwgKCYocHJpdiktPmpidWZfcXVlcnkpOyAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSBHX1NUTVRfRU5ECisKKyNkZWZpbmUgR1NUX0JVRkZFUl9JU19SRVRSQU5TTUlTU0lPTihidWZmZXIpIFwKKyAgR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmZmVyLCBHU1RfUlRQX0JVRkZFUl9GTEFHX1JFVFJBTlNNSVNTSU9OKQorCit0eXBlZGVmIHN0cnVjdCBUaW1lclF1ZXVlCit7CisgIEdRdWV1ZSAqdGltZXJzOworICBHSGFzaFRhYmxlICpoYXNodGFibGU7Cit9IFRpbWVyUXVldWU7CisKK3N0cnVjdCBfR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZQoreworICBHc3RQYWQgKnNpbmtwYWQsICpzcmNwYWQ7CisgIEdzdFBhZCAqcnRjcHNpbmtwYWQ7CisKKyAgUlRQSml0dGVyQnVmZmVyICpqYnVmOworICBHTXV0ZXggamJ1Zl9sb2NrOworICBnYm9vbGVhbiB3YWl0aW5nX3RpbWVyOworICBHQ29uZCBqYnVmX3RpbWVyOworICBnYm9vbGVhbiB3YWl0aW5nX2V2ZW50OworICBHQ29uZCBqYnVmX2V2ZW50OworICBnYm9vbGVhbiB3YWl0aW5nX3F1ZXJ5OworICBHQ29uZCBqYnVmX3F1ZXJ5OworICBnYm9vbGVhbiBsYXN0X3F1ZXJ5OworICBnYm9vbGVhbiBkaXNjb250OworICBnYm9vbGVhbiB0c19kaXNjb250OworICBnYm9vbGVhbiBhY3RpdmU7CisgIGd1aW50NjQgb3V0X29mZnNldDsKKworICBnYm9vbGVhbiB0aW1lcl9ydW5uaW5nOworICBHVGhyZWFkICp0aW1lcl90aHJlYWQ7CisKKyAgLyogcHJvcGVydGllcyAqLworICBndWludCBsYXRlbmN5X21zOworICBndWludDY0IGxhdGVuY3lfbnM7CisgIGdib29sZWFuIGRyb3Bfb25fbGF0ZW5jeTsKKyAgZ2ludDY0IHRzX29mZnNldDsKKyAgZ3VpbnQ2NCBtYXhfdHNfb2Zmc2V0X2FkanVzdG1lbnQ7CisgIGdib29sZWFuIGRvX2xvc3Q7CisgIGdib29sZWFuIGRvX3JldHJhbnNtaXNzaW9uOworICBnYm9vbGVhbiBydHhfbmV4dF9zZXFudW07CisgIGdpbnQgcnR4X2RlbGF5OworICBndWludCBydHhfbWluX2RlbGF5OworICBnaW50IHJ0eF9kZWxheV9yZW9yZGVyOworICBnaW50IHJ0eF9yZXRyeV90aW1lb3V0OworICBnaW50IHJ0eF9taW5fcmV0cnlfdGltZW91dDsKKyAgZ2ludCBydHhfcmV0cnlfcGVyaW9kOworICBnaW50IHJ0eF9tYXhfcmV0cmllczsKKyAgZ3VpbnQgcnR4X3N0YXRzX3RpbWVvdXQ7CisgIGdpbnQgcnR4X2RlYWRsaW5lX21zOworICBnaW50IG1heF9ydGNwX3J0cF90aW1lX2RpZmY7CisgIGd1aW50MzIgbWF4X2Ryb3BvdXRfdGltZTsKKyAgZ3VpbnQzMiBtYXhfbWlzb3JkZXJfdGltZTsKKyAgZ3VpbnQgZmFzdHN0YXJ0X21pbl9wYWNrZXRzOworCisgIC8qIHRoZSBsYXN0IHNlcW51bSB3ZSBwdXNoZWQgb3V0ICovCisgIGd1aW50MzIgbGFzdF9wb3BwZWRfc2VxbnVtOworICAvKiB0aGUgbmV4dCBleHBlY3RlZCBzZXFudW0gd2UgcHVzaCAqLworICBndWludDMyIG5leHRfc2VxbnVtOworICAvKiBzZXFudW0tYmFzZSwgaWYga25vd24gKi8KKyAgZ3VpbnQzMiBzZXFudW1fYmFzZTsKKyAgLyogbGFzdCBvdXRwdXQgdGltZSAqLworICBHc3RDbG9ja1RpbWUgbGFzdF9vdXRfdGltZTsKKyAgLyogbGFzdCB2YWxpZCBpbnB1dCB0aW1lc3RhbXAgYW5kIHJ0cHRpbWUgcGFpciAqLworICBHc3RDbG9ja1RpbWUgaXBzX3B0czsKKyAgZ3VpbnQ2NCBpcHNfcnRwdGltZTsKKyAgR3N0Q2xvY2tUaW1lIHBhY2tldF9zcGFjaW5nOworICBnaW50IGVxdWlkaXN0YW50OworCisgIEdRdWV1ZSBnYXBfcGFja2V0czsKKworICAvKiB0aGUgbmV4dCBleHBlY3RlZCBzZXFudW0gd2UgcmVjZWl2ZSAqLworICBHc3RDbG9ja1RpbWUgbGFzdF9pbl9wdHM7CisgIGd1aW50MzIgbmV4dF9pbl9zZXFudW07CisKKyAgR0FycmF5ICp0aW1lcnM7CisgIFRpbWVyUXVldWUgKnJ0eF9zdGF0c190aW1lcnM7CisKKyAgLyogc3RhcnQgYW5kIHN0b3AgcmFuZ2VzICovCisgIEdzdENsb2NrVGltZSBucHRfc3RhcnQ7CisgIEdzdENsb2NrVGltZSBucHRfc3RvcDsKKyAgZ3VpbnQ2NCBleHRfdGltZXN0YW1wOworICBndWludDY0IGxhc3RfZWxhcHNlZDsKKyAgZ3VpbnQ2NCBlc3RpbWF0ZWRfZW9zOworICBHc3RDbG9ja0lEIGVvc19pZDsKKworICAvKiBzdGF0ZSAqLworICBnYm9vbGVhbiBlb3M7CisgIGd1aW50IGxhc3RfcGVyY2VudDsKKworICAvKiBjbG9jayByYXRlIGFuZCBydHAgdGltZXN0YW1wIG9mZnNldCAqLworICBnaW50IGxhc3RfcHQ7CisgIGdpbnQzMiBjbG9ja19yYXRlOworICBnaW50NjQgY2xvY2tfYmFzZTsKKyAgZ2ludDY0IHRzX29mZnNldF9yZW1haW5kZXI7CisKKyAgLyogd2hlbiB3ZSBhcmUgc2h1dHRpbmcgZG93biAqLworICBHc3RGbG93UmV0dXJuIHNyY3Jlc3VsdDsKKyAgZ2Jvb2xlYW4gYmxvY2tlZDsKKworICAvKiBmb3Igc3luYyAqLworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgIEdzdENsb2NrSUQgY2xvY2tfaWQ7CisgIEdzdENsb2NrVGltZSB0aW1lcl90aW1lb3V0OworICBndWludDE2IHRpbWVyX3NlcW51bTsKKyAgLyogdGhlIGxhdGVuY3kgb2YgdGhlIHVwc3RyZWFtIHBlZXIsIHdlIGhhdmUgdG8gdGFrZSB0aGlzIGludG8gYWNjb3VudCB3aGVuCisgICAqIHN5bmNocm9uaXppbmcgdGhlIGJ1ZmZlcnMuICovCisgIEdzdENsb2NrVGltZSBwZWVyX2xhdGVuY3k7CisgIGd1aW50NjQgZXh0X3J0cHRpbWU7CisgIEdzdEJ1ZmZlciAqbGFzdF9zcjsKKworICAvKiBzb21lIGFjY291bnRpbmcgKi8KKyAgZ3VpbnQ2NCBudW1fcHVzaGVkOworICBndWludDY0IG51bV9sb3N0OworICBndWludDY0IG51bV9sYXRlOworICBndWludDY0IG51bV9kdXBsaWNhdGVzOworICBndWludDY0IG51bV9ydHhfcmVxdWVzdHM7CisgIGd1aW50NjQgbnVtX3J0eF9zdWNjZXNzOworICBndWludDY0IG51bV9ydHhfZmFpbGVkOworICBnZG91YmxlIGF2Z19ydHhfbnVtOworICBndWludDY0IGF2Z19ydHhfcnR0OworICBSVFBQYWNrZXRSYXRlQ3R4IHBhY2tldF9yYXRlX2N0eDsKKworICAvKiBmb3IgdGhlIGppdHRlciAqLworICBHc3RDbG9ja1RpbWUgbGFzdF9kdHM7CisgIEdzdENsb2NrVGltZSBsYXN0X3B0czsKKyAgZ3VpbnQ2NCBsYXN0X3J0cHRpbWU7CisgIEdzdENsb2NrVGltZSBhdmdfaml0dGVyOworfTsKKwordHlwZWRlZiBlbnVtCit7CisgIFRJTUVSX1RZUEVfRVhQRUNURUQsCisgIFRJTUVSX1RZUEVfTE9TVCwKKyAgVElNRVJfVFlQRV9ERUFETElORSwKKyAgVElNRVJfVFlQRV9FT1MKK30gVGltZXJUeXBlOworCit0eXBlZGVmIHN0cnVjdAoreworICBndWludCBpZHg7CisgIGd1aW50MTYgc2VxbnVtOworICBndWludCBudW07CisgIFRpbWVyVHlwZSB0eXBlOworICBHc3RDbG9ja1RpbWUgdGltZW91dDsKKyAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uOworICBHc3RDbG9ja1RpbWUgcnR4X2Jhc2U7CisgIEdzdENsb2NrVGltZSBydHhfZGVsYXk7CisgIEdzdENsb2NrVGltZSBydHhfcmV0cnk7CisgIEdzdENsb2NrVGltZSBydHhfbGFzdDsKKyAgZ3VpbnQgbnVtX3J0eF9yZXRyeTsKKyAgZ3VpbnQgbnVtX3J0eF9yZWNlaXZlZDsKK30gVGltZXJEYXRhOworCisjZGVmaW5lIEdTVF9SVFBfSklUVEVSX0JVRkZFUl9HRVRfUFJJVkFURShvKSBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX1BSSVZBVEUgKChvKSwgR1NUX1RZUEVfUlRQX0pJVFRFUl9CVUZGRVIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSkpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCIKKyAgICAgICAgLyogImNsb2NrLXJhdGUgPSAoaW50KSBbIDEsIDIxNDc0ODM2NDcgXSwgIgorICAgICAgICAgKiAicGF5bG9hZCA9IChpbnQpICwgIgorICAgICAgICAgKiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpICIKKyAgICAgICAgICovICkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpbmtfcnRjcF90ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmtfcnRjcCIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfUkVRVUVTVCwKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0Y3AiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2ppdHRlcl9idWZmZXJfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCIKKyAgICAgICAgLyogInBheWxvYWQgPSAoaW50KSAsICIKKyAgICAgICAgICogImNsb2NrLXJhdGUgPSAoaW50KSAsICIKKyAgICAgICAgICogImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSAiCisgICAgICAgICAqLyApCisgICAgKTsKKworc3RhdGljIGd1aW50IGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zaWduYWxzW0xBU1RfU0lHTkFMXSA9IHsgMCB9OworCisjZGVmaW5lIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBKaXR0ZXJCdWZmZXIsIGdzdF9ydHBfaml0dGVyX2J1ZmZlciwgR1NUX1RZUEVfRUxFTUVOVCk7CisKKy8qIG9iamVjdCBvdmVycmlkZXMgKi8KK3N0YXRpYyB2b2lkIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworLyogZWxlbWVudCBvdmVycmlkZXMgKi8KK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50CisgICAgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyBHc3RQYWQgKmdzdF9ydHBfaml0dGVyX2J1ZmZlcl9yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsIGNvbnN0IGdjaGFyICogbmFtZSwgY29uc3QgR3N0Q2FwcyAqIGZpbHRlcik7CitzdGF0aWMgdm9pZCBnc3RfcnRwX2ppdHRlcl9idWZmZXJfcmVsZWFzZV9wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZCAqIHBhZCk7CitzdGF0aWMgR3N0Q2xvY2sgKmdzdF9ydHBfaml0dGVyX2J1ZmZlcl9wcm92aWRlX2Nsb2NrIChHc3RFbGVtZW50ICogZWxlbWVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NldF9jbG9jayAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0Q2xvY2sgKiBjbG9jayk7CisKKy8qIHBhZCBvdmVycmlkZXMgKi8KK3N0YXRpYyBHc3RDYXBzICpnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBHc3RJdGVyYXRvciAqZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2l0ZXJhdGVfaW50ZXJuYWxfbGlua3MgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQpOworCisvKiBzaW5rcGFkIG92ZXJyaWRlcyAqLworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbiAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmZmVyKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbl9saXN0IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXJMaXN0ICogYnVmZmVyX2xpc3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpbmtfcnRjcF9ldmVudCAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW5fcnRjcCAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmZmVyKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zaW5rX3F1ZXJ5IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworLyogc3JjcGFkIG92ZXJyaWRlcyAqLworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zcmNfYWN0aXZhdGVfbW9kZSAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UGFkTW9kZSBtb2RlLCBnYm9vbGVhbiBhY3RpdmUpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3AgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NyY19xdWVyeSAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UXVlcnkgKiBxdWVyeSk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2xlYXJfcHRfbWFwIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIpOworc3RhdGljIEdzdENsb2NrVGltZQorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NldF9hY3RpdmUgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwKKyAgICBnYm9vbGVhbiBhY3RpdmUsIGd1aW50NjQgYmFzZV90aW1lKTsKK3N0YXRpYyB2b2lkIGRvX2hhbmRsZV9zeW5jIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIpOworCitzdGF0aWMgdm9pZCB1bnNjaGVkdWxlX2N1cnJlbnRfdGltZXIgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlcik7CitzdGF0aWMgdm9pZCByZW1vdmVfYWxsX3RpbWVycyAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyKTsKKworc3RhdGljIHZvaWQgd2FpdF9uZXh0X3RpbWVvdXQgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlcik7CisKK3N0YXRpYyBHc3RTdHJ1Y3R1cmUgKmdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jcmVhdGVfc3RhdHMgKEdzdFJ0cEppdHRlckJ1ZmZlciAqCisgICAgaml0dGVyYnVmZmVyKTsKKworc3RhdGljIHZvaWQgdXBkYXRlX3J0eF9zdGF0cyAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyLAorICAgIFRpbWVyRGF0YSAqIHRpbWVyLCBHc3RDbG9ja1RpbWUgZHRzLCBnYm9vbGVhbiBzdWNjZXNzKTsKKworc3RhdGljIFRpbWVyUXVldWUgKnRpbWVyX3F1ZXVlX25ldyAodm9pZCk7CitzdGF0aWMgdm9pZCB0aW1lcl9xdWV1ZV9mcmVlIChUaW1lclF1ZXVlICogcXVldWUpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NsYXNzX2luaXQgKEdzdFJ0cEppdHRlckJ1ZmZlckNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnX3R5cGVfY2xhc3NfYWRkX3ByaXZhdGUgKGtsYXNzLCBzaXplb2YgKEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUpKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9maW5hbGl6ZTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3Byb3BlcnR5OworCisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6bGF0ZW5jeToKKyAgICoKKyAgICogVGhlIG1heGltdW0gbGF0ZW5jeSBvZiB0aGUgaml0dGVyYnVmZmVyLiBQYWNrZXRzIHdpbGwgYmUga2VwdCBpbiB0aGUgYnVmZmVyCisgICAqIGZvciBhdCBtb3N0IHRoaXMgdGltZS4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTEFURU5DWSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibGF0ZW5jeSIsICJCdWZmZXIgbGF0ZW5jeSBpbiBtcyIsCisgICAgICAgICAgIkFtb3VudCBvZiBtcyB0byBidWZmZXIiLCAwLCBHX01BWFVJTlQsIERFRkFVTFRfTEFURU5DWV9NUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgLyoqCisgICAqIEdzdFJ0cEppdHRlckJ1ZmZlcjpkcm9wLW9uLWxhdGVuY3k6CisgICAqCisgICAqIERyb3Agb2xkZXN0IGJ1ZmZlcnMgd2hlbiB0aGUgcXVldWUgaXMgY29tcGxldGVseSBmaWxsZWQuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RST1BfT05fTEFURU5DWSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZHJvcC1vbi1sYXRlbmN5IiwKKyAgICAgICAgICAiRHJvcCBidWZmZXJzIHdoZW4gbWF4aW11bSBsYXRlbmN5IGlzIHJlYWNoZWQiLAorICAgICAgICAgICJUZWxscyB0aGUgaml0dGVyYnVmZmVyIHRvIG5ldmVyIGV4Y2VlZCB0aGUgZ2l2ZW4gbGF0ZW5jeSBpbiBzaXplIiwKKyAgICAgICAgICBERUZBVUxUX0RST1BfT05fTEFURU5DWSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6dHMtb2Zmc2V0OgorICAgKgorICAgKiBBZGp1c3QgR1N0cmVhbWVyIG91dHB1dCBidWZmZXIgdGltZXN0YW1wcyBpbiB0aGUgaml0dGVyYnVmZmVyIHdpdGggb2Zmc2V0LgorICAgKiBUaGlzIGlzIG1haW5seSB1c2VkIHRvIGVuc3VyZSBpbnRlcnN0cmVhbSBzeW5jaHJvbmlzYXRpb24uCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RTX09GRlNFVCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQ2NCAoInRzLW9mZnNldCIsICJUaW1lc3RhbXAgT2Zmc2V0IiwKKyAgICAgICAgICAiQWRqdXN0IGJ1ZmZlciB0aW1lc3RhbXBzIHdpdGggb2Zmc2V0IGluIG5hbm9zZWNvbmRzIiwgR19NSU5JTlQ2NCwKKyAgICAgICAgICBHX01BWElOVDY0LCBERUZBVUxUX1RTX09GRlNFVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOm1heC10cy1vZmZzZXQtYWRqdXN0bWVudDoKKyAgICoKKyAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIG5hbm9zZWNvbmRzIHBlciBmcmFtZSB0aGF0IHRpbWUgb2Zmc2V0IG1heSBiZQorICAgKiBhZGp1c3RlZCB3aXRoLiBUaGlzIGlzIHVzZWQgdG8gYXZvaWQgc3VkZGVuIGxhcmdlIGNoYW5nZXMgdG8gdGltZSBzdGFtcHMuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01BWF9UU19PRkZTRVRfQURKVVNUTUVOVCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJtYXgtdHMtb2Zmc2V0LWFkanVzdG1lbnQiLAorICAgICAgICAgICJNYXggVGltZXN0YW1wIE9mZnNldCBBZGp1c3RtZW50IiwKKyAgICAgICAgICAiVGhlIG1heGltdW0gbnVtYmVyIG9mIG5hbm9zZWNvbmRzIHBlciBmcmFtZSB0aGF0IHRpbWUgc3RhbXAgIgorICAgICAgICAgICJvZmZzZXRzIG1heSBiZSBhZGp1c3RlZCAoMCA9IG5vIGxpbWl0KS4iLCAwLCBHX01BWFVJTlQ2NCwKKyAgICAgICAgICBERUZBVUxUX01BWF9UU19PRkZTRVRfQURKVVNUTUVOVCwgR19QQVJBTV9SRUFEV1JJVEUgfAorICAgICAgICAgIEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOmRvLWxvc3Q6CisgICAqCisgICAqIFNlbmQgb3V0IGEgR3N0UlRQUGFja2V0TG9zdCBldmVudCBkb3duc3RyZWFtIHdoZW4gYSBwYWNrZXQgaXMgY29uc2lkZXJlZAorICAgKiBsb3N0LgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ET19MT1NULAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJkby1sb3N0IiwgIkRvIExvc3QiLAorICAgICAgICAgICJTZW5kIGFuIGV2ZW50IGRvd25zdHJlYW0gd2hlbiBhIHBhY2tldCBpcyBsb3N0IiwgREVGQVVMVF9ET19MT1NULAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6bW9kZToKKyAgICoKKyAgICogQ29udHJvbCB0aGUgYnVmZmVyaW5nIGFuZCB0aW1lc3RhbXBpbmcgbW9kZSB1c2VkIGJ5IHRoZSBqaXR0ZXJidWZmZXIuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01PREUsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoIm1vZGUiLCAiTW9kZSIsCisgICAgICAgICAgIkNvbnRyb2wgdGhlIGJ1ZmZlcmluZyBhbGdvcml0aG0gaW4gdXNlIiwgUlRQX1RZUEVfSklUVEVSX0JVRkZFUl9NT0RFLAorICAgICAgICAgIERFRkFVTFRfTU9ERSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6cGVyY2VudDoKKyAgICoKKyAgICogVGhlIHBlcmNlbnQgb2YgdGhlIGppdHRlcmJ1ZmZlciB0aGF0IGlzIGZpbGxlZC4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUEVSQ0VOVCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJwZXJjZW50IiwgInBlcmNlbnQiLAorICAgICAgICAgICJUaGUgYnVmZmVyIGZpbGxlZCBwZXJjZW50IiwgMCwgMTAwLAorICAgICAgICAgIDAsIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6ZG8tcmV0cmFuc21pc3Npb246CisgICAqCisgICAqIFNlbmQgb3V0IGEgR3N0UlRQUmV0cmFuc21pc3Npb24gZXZlbnQgdXBzdHJlYW0gd2hlbiBhIHBhY2tldCBpcyBjb25zaWRlcmVkCisgICAqIGxhdGUgYW5kIHNob3VsZCBiZSByZXRyYW5zbWl0dGVkLgorICAgKgorICAgKiBTaW5jZTogMS4yCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RPX1JFVFJBTlNNSVNTSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJkby1yZXRyYW5zbWlzc2lvbiIsICJEbyBSZXRyYW5zbWlzc2lvbiIsCisgICAgICAgICAgIlNlbmQgcmV0cmFuc21pc3Npb24gZXZlbnRzIHVwc3RyZWFtIHdoZW4gYSBwYWNrZXQgaXMgbGF0ZSIsCisgICAgICAgICAgREVGQVVMVF9ET19SRVRSQU5TTUlTU0lPTiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOnJ0eC1uZXh0LXNlcW51bQorICAgKgorICAgKiBFc3RpbWF0ZSB3aGVuIHRoZSBuZXh0IHBhY2tldCBzaG91bGQgYXJyaXZlIGFuZCBzY2hlZHVsZSBhIHJldHJhbnNtaXNzaW9uCisgICAqIHJlcXVlc3QgZm9yIGl0LgorICAgKiBUaGlzIGlzLCB3aGVuIHBhY2tldCBOIGFycml2ZXMsIGEgR3N0UlRQUmV0cmFuc21pc3Npb24gZXZlbnQgaXMgc2NoZWR1bGUKKyAgICogZm9yIHBhY2tldCBOKzEuIFNvIGl0IHdpbGwgYmUgcmVxdWVzdGVkIGlmIGl0IGRvZXMgbm90IGFycml2ZSBhdCB0aGUgZXhwZWN0ZWQgdGltZS4KKyAgICogVGhlIGV4cGVjdGVkIHRpbWUgaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgZHRzIG9mIE4gYW5kIHRoZSBwYWNrZXQgc3BhY2luZy4KKyAgICoKKyAgICogU2luY2U6IDEuNgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SVFhfTkVYVF9TRVFOVU0sCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInJ0eC1uZXh0LXNlcW51bSIsICJSVFggbmV4dCBzZXFudW0iLAorICAgICAgICAgICJFc3RpbWF0ZSB3aGVuIHRoZSBuZXh0IHBhY2tldCBzaG91bGQgYXJyaXZlIGFuZCBzY2hlZHVsZSBhICIKKyAgICAgICAgICAicmV0cmFuc21pc3Npb24gcmVxdWVzdCBmb3IgaXQuIiwKKyAgICAgICAgICBERUZBVUxUX1JUWF9ORVhUX1NFUU5VTSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFJ0cEppdHRlckJ1ZmZlcjpydHgtZGVsYXk6CisgICAqCisgICAqIFdoZW4gYSBwYWNrZXQgZGlkIG5vdCBhcnJpdmUgYXQgdGhlIGV4cGVjdGVkIHRpbWUsIHdhaXQgdGhpcyBleHRyYSBhbW91bnQKKyAgICogb2YgdGltZSBiZWZvcmUgc2VuZGluZyBhIHJldHJhbnNtaXNzaW9uIGV2ZW50LgorICAgKgorICAgKiBXaGVuIC0xIGlzIHVzZWQsIHRoZSBtYXggaml0dGVyIHdpbGwgYmUgdXNlZCBhcyBleHRyYSBkZWxheS4KKyAgICoKKyAgICogU2luY2U6IDEuMgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SVFhfREVMQVksCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicnR4LWRlbGF5IiwgIlJUWCBEZWxheSIsCisgICAgICAgICAgIkV4dHJhIHRpbWUgaW4gbXMgdG8gd2FpdCBiZWZvcmUgc2VuZGluZyByZXRyYW5zbWlzc2lvbiAiCisgICAgICAgICAgImV2ZW50ICgtMSBhdXRvbWF0aWMpIiwgLTEsIEdfTUFYSU5ULCBERUZBVUxUX1JUWF9ERUxBWSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOnJ0eC1taW4tZGVsYXk6CisgICAqCisgICAqIFdoZW4gYSBwYWNrZXQgZGlkIG5vdCBhcnJpdmUgYXQgdGhlIGV4cGVjdGVkIHRpbWUsIHdhaXQgYXQgbGVhc3QgdGhpcyBleHRyYSBhbW91bnQKKyAgICogb2YgdGltZSBiZWZvcmUgc2VuZGluZyBhIHJldHJhbnNtaXNzaW9uIGV2ZW50LgorICAgKgorICAgKiBTaW5jZTogMS42CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JUWF9NSU5fREVMQVksCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInJ0eC1taW4tZGVsYXkiLCAiTWluaW11bSBSVFggRGVsYXkiLAorICAgICAgICAgICJNaW5pbXVtIHRpbWUgaW4gbXMgdG8gd2FpdCBiZWZvcmUgc2VuZGluZyByZXRyYW5zbWlzc2lvbiAiCisgICAgICAgICAgImV2ZW50IiwgMCwgR19NQVhVSU5ULCBERUZBVUxUX1JUWF9NSU5fREVMQVksCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6cnR4LWRlbGF5LXJlb3JkZXI6CisgICAqCisgICAqIEFzc3VtZSB0aGF0IGEgcmV0cmFuc21pc3Npb24gZXZlbnQgc2hvdWxkIGJlIHNlbnQgd2hlbiB3ZSBzZWUKKyAgICogdGhpcyBtdWNoIHBhY2tldCByZW9yZGVyaW5nLgorICAgKgorICAgKiBXaGVuIC0xIGlzIHVzZWQsIHRoZSB2YWx1ZSB3aWxsIGJlIGVzdGltYXRlZCBiYXNlZCBvbiBvYnNlcnZlZCBwYWNrZXQKKyAgICogcmVvcmRlcmluZy4gV2hlbiAwIGlzIHVzZWQgcGFja2V0IHJlb3JkZXJpbmcgYWxvbmUgd2lsbCBub3QgY2F1c2UgYQorICAgKiByZXRyYW5zbWlzc2lvbiBldmVudCAoU2luY2UgMS4xMCkuCisgICAqCisgICAqIFNpbmNlOiAxLjIKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUlRYX0RFTEFZX1JFT1JERVIsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicnR4LWRlbGF5LXJlb3JkZXIiLCAiUlRYIERlbGF5IFJlb3JkZXIiLAorICAgICAgICAgICJTZW5kaW5nIHJldHJhbnNtaXNzaW9uIGV2ZW50IHdoZW4gdGhpcyBtdWNoIHJlb3JkZXJpbmcgIgorICAgICAgICAgICIoMCBkaXNhYmxlLCAtMSBhdXRvbWF0aWMpIiwKKyAgICAgICAgICAtMSwgR19NQVhJTlQsIERFRkFVTFRfUlRYX0RFTEFZX1JFT1JERVIsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6OnJ0eC1yZXRyeS10aW1lb3V0OgorICAgKgorICAgKiBXaGVuIG5vIHBhY2tldCBoYXMgYmVlbiByZWNlaXZlZCBhZnRlciBzZW5kaW5nIGEgcmV0cmFuc21pc3Npb24gZXZlbnQKKyAgICogZm9yIHRoaXMgdGltZSwgcmV0cnkgc2VuZGluZyBhIHJldHJhbnNtaXNzaW9uIGV2ZW50LgorICAgKgorICAgKiBXaGVuIC0xIGlzIHVzZWQsIHRoZSB2YWx1ZSB3aWxsIGJlIGVzdGltYXRlZCBiYXNlZCBvbiBvYnNlcnZlZCByb3VuZAorICAgKiB0cmlwIHRpbWUuCisgICAqCisgICAqIFNpbmNlOiAxLjIKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUlRYX1JFVFJZX1RJTUVPVVQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicnR4LXJldHJ5LXRpbWVvdXQiLCAiUlRYIFJldHJ5IFRpbWVvdXQiLAorICAgICAgICAgICJSZXRyeSBzZW5kaW5nIGEgdHJhbnNtaXNzaW9uIGV2ZW50IGFmdGVyIHRoaXMgdGltZW91dCBpbiAiCisgICAgICAgICAgIm1zICgtMSBhdXRvbWF0aWMpIiwgLTEsIEdfTUFYSU5ULCBERUZBVUxUX1JUWF9SRVRSWV9USU1FT1VULAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOjpydHgtbWluLXJldHJ5LXRpbWVvdXQ6CisgICAqCisgICAqIFRoZSBtaW5pbXVtIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gcmV0cnkgdGltZW91dHMuIFdoZW4KKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOjpydHgtcmV0cnktdGltZW91dCBpcyAtMSwgdGhpcyB2YWx1ZSBlbnN1cmVzIGEKKyAgICogbWluaW11bSBpbnRlcnZhbCBiZXR3ZWVuIHJldHJ5IHRpbWVvdXRzLgorICAgKgorICAgKiBXaGVuIC0xIGlzIHVzZWQsIHRoZSB2YWx1ZSB3aWxsIGJlIGVzdGltYXRlZCBiYXNlZCBvbiB0aGUKKyAgICogcGFja2V0IHNwYWNpbmcuCisgICAqCisgICAqIFNpbmNlOiAxLjYKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUlRYX01JTl9SRVRSWV9USU1FT1VULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInJ0eC1taW4tcmV0cnktdGltZW91dCIsICJSVFggTWluIFJldHJ5IFRpbWVvdXQiLAorICAgICAgICAgICJNaW5pbXVtIHRpbWVvdXQgYmV0d2VlbiBzZW5kaW5nIGEgdHJhbnNtaXNzaW9uIGV2ZW50IGluICIKKyAgICAgICAgICAibXMgKC0xIGF1dG9tYXRpYykiLCAtMSwgR19NQVhJTlQsIERFRkFVTFRfUlRYX01JTl9SRVRSWV9USU1FT1VULAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOnJ0eC1yZXRyeS1wZXJpb2Q6CisgICAqCisgICAqIFRoZSBhbW91bnQgb2YgdGltZSB0byB0cnkgdG8gZ2V0IGEgcmV0cmFuc21pc3Npb24uCisgICAqCisgICAqIFdoZW4gLTEgaXMgdXNlZCwgdGhlIHZhbHVlIHdpbGwgYmUgZXN0aW1hdGVkIGJhc2VkIG9uIHRoZSBqaXR0ZXJidWZmZXIKKyAgICogbGF0ZW5jeSBhbmQgdGhlIG9ic2VydmVkIHJvdW5kIHRyaXAgdGltZS4KKyAgICoKKyAgICogU2luY2U6IDEuMgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SVFhfUkVUUllfUEVSSU9ELAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInJ0eC1yZXRyeS1wZXJpb2QiLCAiUlRYIFJldHJ5IFBlcmlvZCIsCisgICAgICAgICAgIlRyeSB0byBnZXQgYSByZXRyYW5zbWlzc2lvbiBmb3IgdGhpcyBtYW55IG1zICIKKyAgICAgICAgICAiKC0xIGF1dG9tYXRpYykiLCAtMSwgR19NQVhJTlQsIERFRkFVTFRfUlRYX1JFVFJZX1BFUklPRCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgLyoqCisgICAqIEdzdFJ0cEppdHRlckJ1ZmZlcjpydHgtbWF4LXJldHJpZXM6CisgICAqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIHRvIHJlcXVlc3QgYSByZXRyYW5zbWlzc2lvbi4KKyAgICoKKyAgICogVGhpcyBpbXBsaWVzIHRoYXQgYXMgbWF4aW11bSAocnR4LW1heC1yZXRyaWVzICsgMSkgcmV0cmFuc21pc3Npb25zIHdpbGwgYmUgcmVxdWVzdGVkLgorICAgKiBXaGVuIC0xIGlzIHVzZWQsIHRoZSBudW1iZXIgb2YgcmV0cmFuc21pc3Npb24gcmVxdWVzdCB3aWxsIG5vdCBiZSBsaW1pdGVkLgorICAgKgorICAgKiBTaW5jZTogMS42CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JUWF9NQVhfUkVUUklFUywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJydHgtbWF4LXJldHJpZXMiLCAiUlRYIE1heCBSZXRyaWVzIiwKKyAgICAgICAgICAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgdG8gcmVxdWVzdCBhIHJldHJhbnNtaXNzaW9uLiAiCisgICAgICAgICAgIigtMSBub3QgbGltaXRlZCkiLCAtMSwgR19NQVhJTlQsIERFRkFVTFRfUlRYX01BWF9SRVRSSUVTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOnJ0eC1kZWFkbGluZToKKyAgICoKKyAgICogVGhlIGRlYWRsaW5lIGZvciBhIHZhbGlkIFJUWCByZXF1ZXN0IGluIG1zLgorICAgKgorICAgKiBIb3cgbG9uZyB0aGUgUlRYIFJUQ1Agd2lsbCBiZSB2YWxpZCBmb3IuCisgICAqIFdoZW4gLTEgaXMgdXNlZCwgdGhlIHNpemUgb2YgdGhlIGppdHRlcmJ1ZmZlciB3aWxsIGJlIHVzZWQuCisgICAqCisgICAqIFNpbmNlOiAxLjEwCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JUWF9ERUFETElORSwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJydHgtZGVhZGxpbmUiLCAiUlRYIERlYWRsaW5lIChtcykiLAorICAgICAgICAgICJUaGUgZGVhZGxpbmUgZm9yIGEgdmFsaWQgUlRYIHJlcXVlc3QgaW4gbWlsbGlzZWNvbmRzLiAiCisgICAgICAgICAgIigtMSBhdXRvbWF0aWMpIiwgLTEsIEdfTUFYSU5ULCBERUZBVUxUX1JUWF9ERUFETElORSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKy8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6OnJ0eC1zdGF0cy10aW1lb3V0OgorICAgKgorICAgKiBUaGUgdGltZSB0byB3YWl0IGZvciBhIHJldHJhbnNtaXR0ZWQgcGFja2V0IGFmdGVyIGl0IGhhcyBiZWVuCisgICAqIGNvbnNpZGVyZWQgbG9zdCBpbiBvcmRlciB0byBjb2xsZWN0IFJUWCBzdGF0aXN0aWNzLgorICAgKgorICAgKiBTaW5jZTogMS4xMAorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SVFhfU1RBVFNfVElNRU9VVCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgicnR4LXN0YXRzLXRpbWVvdXQiLCAiUlRYIFN0YXRpc3RpY3MgVGltZW91dCIsCisgICAgICAgICAgIlRoZSB0aW1lIHRvIHdhaXQgZm9yIGEgcmV0cmFuc21pdHRlZCBwYWNrZXQgYWZ0ZXIgaXQgaGFzIGJlZW4gIgorICAgICAgICAgICJjb25zaWRlcmVkIGxvc3QgaW4gb3JkZXIgdG8gY29sbGVjdCBzdGF0aXN0aWNzIChtcykiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVCwgREVGQVVMVF9SVFhfU1RBVFNfVElNRU9VVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01BWF9EUk9QT1VUX1RJTUUsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm1heC1kcm9wb3V0LXRpbWUiLCAiTWF4IGRyb3BvdXQgdGltZSIsCisgICAgICAgICAgIlRoZSBtYXhpbXVtIHRpbWUgKG1pbGxpc2Vjb25kcykgb2YgbWlzc2luZyBwYWNrZXRzIHRvbGVyYXRlZC4iLAorICAgICAgICAgIDAsIEdfTUFYVUlOVCwgREVGQVVMVF9NQVhfRFJPUE9VVF9USU1FLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX01JU09SREVSX1RJTUUsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm1heC1taXNvcmRlci10aW1lIiwgIk1heCBtaXNvcmRlciB0aW1lIiwKKyAgICAgICAgICAiVGhlIG1heGltdW0gdGltZSAobWlsbGlzZWNvbmRzKSBvZiBtaXNvcmRlcmVkIHBhY2tldHMgdG9sZXJhdGVkLiIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCBERUZBVUxUX01BWF9NSVNPUkRFUl9USU1FLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOnN0YXRzOgorICAgKgorICAgKiBWYXJpb3VzIGppdHRlcmJ1ZmZlciBzdGF0aXN0aWNzLiBUaGlzIHByb3BlcnR5IHJldHVybnMgYSBHc3RTdHJ1Y3R1cmUKKyAgICogd2l0aCBuYW1lIGFwcGxpY2F0aW9uL3gtcnRwLWppdHRlcmJ1ZmZlci1zdGF0cyB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOgorICAgKgorICAgKiA8aXRlbWl6ZWRsaXN0PgorICAgKiA8bGlzdGl0ZW0+CisgICAqICAgPHBhcmE+CisgICAqICAgI2d1aW50NjQKKyAgICogICA8Y2xhc3NuYW1lPiZxdW90O251bS1wdXNoZWQmcXVvdDs8L2NsYXNzbmFtZT46CisgICAqICAgdGhlIG51bWJlciBvZiBwYWNrZXRzIHB1c2hlZCBvdXQuCisgICAqICAgPC9wYXJhPgorICAgKiA8L2xpc3RpdGVtPgorICAgKiA8bGlzdGl0ZW0+CisgICAqICAgPHBhcmE+CisgICAqICAgI2d1aW50NjQKKyAgICogICA8Y2xhc3NuYW1lPiZxdW90O251bS1sb3N0JnF1b3Q7PC9jbGFzc25hbWU+OgorICAgKiAgIHRoZSBudW1iZXIgb2YgcGFja2V0cyBjb25zaWRlcmVkIGxvc3QuCisgICAqICAgPC9wYXJhPgorICAgKiA8L2xpc3RpdGVtPgorICAgKiA8bGlzdGl0ZW0+CisgICAqICAgPHBhcmE+CisgICAqICAgI2d1aW50NjQKKyAgICogICA8Y2xhc3NuYW1lPiZxdW90O251bS1sYXRlJnF1b3Q7PC9jbGFzc25hbWU+OgorICAgKiAgIHRoZSBudW1iZXIgb2YgcGFja2V0cyBhcnJpdmluZyB0b28gbGF0ZS4KKyAgICogICA8L3BhcmE+CisgICAqIDwvbGlzdGl0ZW0+CisgICAqIDxsaXN0aXRlbT4KKyAgICogICA8cGFyYT4KKyAgICogICAjZ3VpbnQ2NAorICAgKiAgIDxjbGFzc25hbWU+JnF1b3Q7bnVtLWR1cGxpY2F0ZXMmcXVvdDs8L2NsYXNzbmFtZT46CisgICAqICAgdGhlIG51bWJlciBvZiBkdXBsaWNhdGUgcGFja2V0cy4KKyAgICogICA8L3BhcmE+CisgICAqIDwvbGlzdGl0ZW0+CisgICAqIDxsaXN0aXRlbT4KKyAgICogICA8cGFyYT4KKyAgICogICAjZ3VpbnQ2NAorICAgKiAgIDxjbGFzc25hbWU+JnF1b3Q7cnR4LWNvdW50JnF1b3Q7PC9jbGFzc25hbWU+OgorICAgKiAgIHRoZSBudW1iZXIgb2YgcmV0cmFuc21pc3Npb25zIHJlcXVlc3RlZC4KKyAgICogICA8L3BhcmE+CisgICAqIDwvbGlzdGl0ZW0+CisgICAqIDxsaXN0aXRlbT4KKyAgICogICA8cGFyYT4KKyAgICogICAjZ3VpbnQ2NAorICAgKiAgIDxjbGFzc25hbWU+JnF1b3Q7cnR4LXN1Y2Nlc3MtY291bnQmcXVvdDs8L2NsYXNzbmFtZT46CisgICAqICAgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHJldHJhbnNtaXNzaW9ucy4KKyAgICogICA8L3BhcmE+CisgICAqIDwvbGlzdGl0ZW0+CisgICAqIDxsaXN0aXRlbT4KKyAgICogICA8cGFyYT4KKyAgICogICAjZ2RvdWJsZQorICAgKiAgIDxjbGFzc25hbWU+JnF1b3Q7cnR4LXBlci1wYWNrZXQmcXVvdDs8L2NsYXNzbmFtZT46CisgICAqICAgYXZlcmFnZSBudW1iZXIgb2YgUlRYIHBlciBwYWNrZXQuCisgICAqICAgPC9wYXJhPgorICAgKiA8L2xpc3RpdGVtPgorICAgKiA8bGlzdGl0ZW0+CisgICAqICAgPHBhcmE+CisgICAqICAgI2d1aW50NjQKKyAgICogICA8Y2xhc3NuYW1lPiZxdW90O3J0eC1ydHQmcXVvdDs8L2NsYXNzbmFtZT46CisgICAqICAgYXZlcmFnZSByb3VuZCB0cmlwIHRpbWUgcGVyIFJUWC4KKyAgICogICA8L3BhcmE+CisgICAqIDwvbGlzdGl0ZW0+CisgICAqIDwvaXRlbWl6ZWRsaXN0PgorICAgKgorICAgKiBTaW5jZTogMS40CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NUQVRTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgic3RhdHMiLCAiU3RhdGlzdGljcyIsCisgICAgICAgICAgIlZhcmlvdXMgc3RhdGlzdGljcyIsIEdTVF9UWVBFX1NUUlVDVFVSRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6bWF4LXJ0Y3AtcnRwLXRpbWUtZGlmZgorICAgKgorICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSBpbiBtcyB0aGF0IHRoZSBSVFAgdGltZSBpbiB0aGUgUlRDUCBTUnMKKyAgICogaXMgYWxsb3dlZCB0byBiZSBhaGVhZCBvZiB0aGUgbGFzdCBSVFAgcGFja2V0IHdlIHJlY2VpdmVkLiBVc2UKKyAgICogLTEgdG8gZGlzYWJsZSBpZ25vcmluZyBvZiBSVENQIHBhY2tldHMuCisgICAqCisgICAqIFNpbmNlOiAxLjgKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX1JUQ1BfUlRQX1RJTUVfRElGRiwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJtYXgtcnRjcC1ydHAtdGltZS1kaWZmIiwgIk1heCBSVENQIFJUUCBUaW1lIERpZmYiLAorICAgICAgICAgICJNYXhpbXVtIGFtb3VudCBvZiB0aW1lIGluIG1zIHRoYXQgdGhlIFJUUCB0aW1lIGluIFJUQ1AgU1JzICIKKyAgICAgICAgICAiaXMgYWxsb3dlZCB0byBiZSBhaGVhZCAoLTEgZGlzYWJsZWQpIiwgLTEsIEdfTUFYSU5ULAorICAgICAgICAgIERFRkFVTFRfTUFYX1JUQ1BfUlRQX1RJTUVfRElGRiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JGQzcyNzNfU1lOQywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgicmZjNzI3My1zeW5jIiwgIlN5bmMgb24gUkZDNzI3MyBjbG9jayIsCisgICAgICAgICAgIlN5bmNocm9uaXplIHJlY2VpdmVkIHN0cmVhbXMgdG8gdGhlIFJGQzcyNzMgY2xvY2sgIgorICAgICAgICAgICIocmVxdWlyZXMgY2xvY2sgYW5kIG9mZnNldCB0byBiZSBwcm92aWRlZCkiLCBERUZBVUxUX1JGQzcyNzNfU1lOQywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOmZhc3RzdGFydC1taW4tcGFja2V0cworICAgKgorICAgKiBUaGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHBhY2tldHMgbmVlZGVkIHRvIHN0YXJ0IChzZXQgdG8gMCB0bworICAgKiBkaXNhYmxlIGZhc3RzdGFydC4gVGhlIGppdHRlcmJ1ZmZlciB3aWxsIGJ5IGRlZmF1bHQgc3RhcnQgYWZ0ZXIgdGhlCisgICAqIGxhdGVuY3kgaGFzIGVsYXBzZWQpCisgICAqCisgICAqIFNpbmNlOiAxLjE0CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0ZBU1RTVEFSVF9NSU5fUEFDS0VUUywKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiZmFzdHN0YXJ0LW1pbi1wYWNrZXRzIiwgIkZhc3RzdGFydCBtaW5pbXVtIHBhY2tldHMiLAorICAgICAgICAgICJUaGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHBhY2tldHMgbmVlZGVkIHRvIHN0YXJ0IChzZXQgdG8gMCB0byAiCisgICAgICAgICAgImRpc2FibGUgZmFzdHN0YXJ0LiBUaGUgaml0dGVyYnVmZmVyIHdpbGwgYnkgZGVmYXVsdCBzdGFydCBhZnRlciAiCisgICAgICAgICAgInRoZSBsYXRlbmN5IGhhcyBlbGFwc2VkKSIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCBERUZBVUxUX0ZBU1RTVEFSVF9NSU5fUEFDS0VUUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOjpyZXF1ZXN0LXB0LW1hcDoKKyAgICogQGJ1ZmZlcjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBwdDogdGhlIHB0CisgICAqCisgICAqIFJlcXVlc3QgdGhlIHBheWxvYWQgdHlwZSBhcyAjR3N0Q2FwcyBmb3IgQHB0LgorICAgKi8KKyAgZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpZ25hbHNbU0lHTkFMX1JFUVVFU1RfUFRfTUFQXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJyZXF1ZXN0LXB0LW1hcCIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBKaXR0ZXJCdWZmZXJDbGFzcywKKyAgICAgICAgICByZXF1ZXN0X3B0X21hcCksIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLAorICAgICAgR1NUX1RZUEVfQ0FQUywgMSwgR19UWVBFX1VJTlQpOworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOjpoYW5kbGUtc3luYzoKKyAgICogQGJ1ZmZlcjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzdHJ1Y3Q6IGEgR3N0U3RydWN0dXJlIGNvbnRhaW5pbmcgc3luYyB2YWx1ZXMuCisgICAqCisgICAqIEJlIG5vdGlmaWVkIG9mIG5ldyBzeW5jIHZhbHVlcy4KKyAgICovCisgIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zaWduYWxzW1NJR05BTF9IQU5ETEVfU1lOQ10gPQorICAgICAgZ19zaWduYWxfbmV3ICgiaGFuZGxlLXN5bmMiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwSml0dGVyQnVmZmVyQ2xhc3MsCisgICAgICAgICAgaGFuZGxlX3N5bmMpLCBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfVk9JRF9fQk9YRUQsCisgICAgICBHX1RZUEVfTk9ORSwgMSwgR1NUX1RZUEVfU1RSVUNUVVJFIHwgR19TSUdOQUxfVFlQRV9TVEFUSUNfU0NPUEUpOworCisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6Om9uLW5wdC1zdG9wOgorICAgKiBAYnVmZmVyOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICoKKyAgICogU2lnbmFsIHRoYXQgdGhlIGppdHRlcmJ1ZmVyIGhhcyBwdXNoZWQgdGhlIFJUUCBwYWNrZXQgdGhhdCBjb3JyZXNwb25kcyB0bworICAgKiB0aGUgbnB0LXN0b3AgcG9zaXRpb24uCisgICAqLworICBnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2lnbmFsc1tTSUdOQUxfT05fTlBUX1NUT1BdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLW5wdC1zdG9wIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cEppdHRlckJ1ZmZlckNsYXNzLAorICAgICAgICAgIG9uX25wdF9zdG9wKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX1ZPSUQsCisgICAgICBHX1RZUEVfTk9ORSwgMCwgR19UWVBFX05PTkUpOworCisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6OmNsZWFyLXB0LW1hcDoKKyAgICogQGJ1ZmZlcjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqCisgICAqIEludmFsaWRhdGUgdGhlIGNsb2NrLXJhdGUgYXMgb2J0YWluZWQgd2l0aCB0aGUKKyAgICogI0dzdFJ0cEppdHRlckJ1ZmZlcjo6cmVxdWVzdC1wdC1tYXAgc2lnbmFsLgorICAgKi8KKyAgZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpZ25hbHNbU0lHTkFMX0NMRUFSX1BUX01BUF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgiY2xlYXItcHQtbWFwIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNUIHwgR19TSUdOQUxfQUNUSU9OLAorICAgICAgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBKaXR0ZXJCdWZmZXJDbGFzcywgY2xlYXJfcHRfbWFwKSwgTlVMTCwgTlVMTCwKKyAgICAgIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19WT0lELCBHX1RZUEVfTk9ORSwgMCwgR19UWVBFX05PTkUpOworCisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6OnNldC1hY3RpdmU6CisgICAqIEBidWZmZXI6IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKgorICAgKiBTdGFydCBwdXNoaW5nIG91dCBwYWNrZXRzIHdpdGggdGhlIGdpdmVuIGJhc2UgdGltZS4gVGhpcyBzaWduYWwgaXMgb25seQorICAgKiB1c2VmdWwgaW4gYnVmZmVyaW5nIG1vZGUuCisgICAqCisgICAqIFJldHVybnM6IHRoZSB0aW1lIG9mIHRoZSBsYXN0IHB1c2hlZCBwYWNrZXQuCisgICAqLworICBnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2lnbmFsc1tTSUdOQUxfU0VUX0FDVElWRV0gPQorICAgICAgZ19zaWduYWxfbmV3ICgic2V0LWFjdGl2ZSIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCB8IEdfU0lHTkFMX0FDVElPTiwKKyAgICAgIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwSml0dGVyQnVmZmVyQ2xhc3MsIHNldF9hY3RpdmUpLCBOVUxMLCBOVUxMLAorICAgICAgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9VSU5UNjQsIDIsIEdfVFlQRV9CT09MRUFOLAorICAgICAgR19UWVBFX1VJTlQ2NCk7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhbmdlX3N0YXRlKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cmVxdWVzdF9uZXdfcGFkID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfcmVxdWVzdF9uZXdfcGFkKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cmVsZWFzZV9wYWQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9yZWxlYXNlX3BhZCk7CisgIGdzdGVsZW1lbnRfY2xhc3MtPnByb3ZpZGVfY2xvY2sgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9wcm92aWRlX2Nsb2NrKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+c2V0X2Nsb2NrID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2V0X2Nsb2NrKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2ppdHRlcl9idWZmZXJfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2lua19ydGNwX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBwYWNrZXQgaml0dGVyLWJ1ZmZlciIsICJGaWx0ZXIvTmV0d29yay9SVFAiLAorICAgICAgIkEgYnVmZmVyIHRoYXQgZGVhbHMgd2l0aCBuZXR3b3JrIGppdHRlciBhbmQgb3RoZXIgdHJhbnNtaXNzaW9uIGZhdWx0cyIsCisgICAgICAiUGhpbGlwcGUgS2FsYWYgPHBoaWxpcHBlLmthbGFmQGNvbGxhYm9yYS5jby51az4sICIKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGtsYXNzLT5jbGVhcl9wdF9tYXAgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NsZWFyX3B0X21hcCk7CisgIGtsYXNzLT5zZXRfYWN0aXZlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zZXRfYWN0aXZlKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVAorICAgICAgKHJ0cGppdHRlcmJ1ZmZlcl9kZWJ1ZywgInJ0cGppdHRlcmJ1ZmZlciIsIDAsICJSVFAgSml0dGVyIEJ1ZmZlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2luaXQgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlcikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKworICBwcml2ID0gR1NUX1JUUF9KSVRURVJfQlVGRkVSX0dFVF9QUklWQVRFIChqaXR0ZXJidWZmZXIpOworICBqaXR0ZXJidWZmZXItPnByaXYgPSBwcml2OworCisgIHByaXYtPmxhdGVuY3lfbXMgPSBERUZBVUxUX0xBVEVOQ1lfTVM7CisgIHByaXYtPmxhdGVuY3lfbnMgPSBwcml2LT5sYXRlbmN5X21zICogR1NUX01TRUNPTkQ7CisgIHByaXYtPmRyb3Bfb25fbGF0ZW5jeSA9IERFRkFVTFRfRFJPUF9PTl9MQVRFTkNZOworICBwcml2LT50c19vZmZzZXQgPSBERUZBVUxUX1RTX09GRlNFVDsKKyAgcHJpdi0+bWF4X3RzX29mZnNldF9hZGp1c3RtZW50ID0gREVGQVVMVF9NQVhfVFNfT0ZGU0VUX0FESlVTVE1FTlQ7CisgIHByaXYtPmRvX2xvc3QgPSBERUZBVUxUX0RPX0xPU1Q7CisgIHByaXYtPmRvX3JldHJhbnNtaXNzaW9uID0gREVGQVVMVF9ET19SRVRSQU5TTUlTU0lPTjsKKyAgcHJpdi0+cnR4X25leHRfc2VxbnVtID0gREVGQVVMVF9SVFhfTkVYVF9TRVFOVU07CisgIHByaXYtPnJ0eF9kZWxheSA9IERFRkFVTFRfUlRYX0RFTEFZOworICBwcml2LT5ydHhfbWluX2RlbGF5ID0gREVGQVVMVF9SVFhfTUlOX0RFTEFZOworICBwcml2LT5ydHhfZGVsYXlfcmVvcmRlciA9IERFRkFVTFRfUlRYX0RFTEFZX1JFT1JERVI7CisgIHByaXYtPnJ0eF9yZXRyeV90aW1lb3V0ID0gREVGQVVMVF9SVFhfUkVUUllfVElNRU9VVDsKKyAgcHJpdi0+cnR4X21pbl9yZXRyeV90aW1lb3V0ID0gREVGQVVMVF9SVFhfTUlOX1JFVFJZX1RJTUVPVVQ7CisgIHByaXYtPnJ0eF9yZXRyeV9wZXJpb2QgPSBERUZBVUxUX1JUWF9SRVRSWV9QRVJJT0Q7CisgIHByaXYtPnJ0eF9tYXhfcmV0cmllcyA9IERFRkFVTFRfUlRYX01BWF9SRVRSSUVTOworICBwcml2LT5ydHhfZGVhZGxpbmVfbXMgPSBERUZBVUxUX1JUWF9ERUFETElORTsKKyAgcHJpdi0+cnR4X3N0YXRzX3RpbWVvdXQgPSBERUZBVUxUX1JUWF9TVEFUU19USU1FT1VUOworICBwcml2LT5tYXhfcnRjcF9ydHBfdGltZV9kaWZmID0gREVGQVVMVF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGOworICBwcml2LT5tYXhfZHJvcG91dF90aW1lID0gREVGQVVMVF9NQVhfRFJPUE9VVF9USU1FOworICBwcml2LT5tYXhfbWlzb3JkZXJfdGltZSA9IERFRkFVTFRfTUFYX01JU09SREVSX1RJTUU7CisgIHByaXYtPmZhc3RzdGFydF9taW5fcGFja2V0cyA9IERFRkFVTFRfRkFTVFNUQVJUX01JTl9QQUNLRVRTOworCisgIHByaXYtPnRzX29mZnNldF9yZW1haW5kZXIgPSAwOworICBwcml2LT5sYXN0X2R0cyA9IC0xOworICBwcml2LT5sYXN0X3B0cyA9IC0xOworICBwcml2LT5sYXN0X3J0cHRpbWUgPSAtMTsKKyAgcHJpdi0+YXZnX2ppdHRlciA9IDA7CisgIHByaXYtPnRpbWVycyA9IGdfYXJyYXlfbmV3IChGQUxTRSwgVFJVRSwgc2l6ZW9mIChUaW1lckRhdGEpKTsKKyAgcHJpdi0+cnR4X3N0YXRzX3RpbWVycyA9IHRpbWVyX3F1ZXVlX25ldyAoKTsKKyAgcHJpdi0+amJ1ZiA9IHJ0cF9qaXR0ZXJfYnVmZmVyX25ldyAoKTsKKyAgZ19tdXRleF9pbml0ICgmcHJpdi0+amJ1Zl9sb2NrKTsKKyAgZ19jb25kX2luaXQgKCZwcml2LT5qYnVmX3RpbWVyKTsKKyAgZ19jb25kX2luaXQgKCZwcml2LT5qYnVmX2V2ZW50KTsKKyAgZ19jb25kX2luaXQgKCZwcml2LT5qYnVmX3F1ZXJ5KTsKKyAgZ19xdWV1ZV9pbml0ICgmcHJpdi0+Z2FwX3BhY2tldHMpOworICBnc3Rfc2VnbWVudF9pbml0ICgmcHJpdi0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKworICAvKiByZXNldCBza2V3IGRldGVjdGlvbiBpbml0aWFseSAqLworICBydHBfaml0dGVyX2J1ZmZlcl9yZXNldF9za2V3IChwcml2LT5qYnVmKTsKKyAgcnRwX2ppdHRlcl9idWZmZXJfc2V0X2RlbGF5IChwcml2LT5qYnVmLCBwcml2LT5sYXRlbmN5X25zKTsKKyAgcnRwX2ppdHRlcl9idWZmZXJfc2V0X2J1ZmZlcmluZyAocHJpdi0+amJ1ZiwgRkFMU0UpOworICBwcml2LT5hY3RpdmUgPSBUUlVFOworCisgIHByaXYtPnNyY3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJmdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zcmNfdGVtcGxhdGUsCisgICAgICAic3JjIik7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZhdGVtb2RlX2Z1bmN0aW9uIChwcml2LT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NyY19hY3RpdmF0ZV9tb2RlKSk7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChwcml2LT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NyY19xdWVyeSkpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAocHJpdi0+c3JjcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zcmNfZXZlbnQpKTsKKworICBwcml2LT5zaW5rcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpbmtfdGVtcGxhdGUsCisgICAgICAic2luayIpOworCisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChwcml2LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbikpOworICBnc3RfcGFkX3NldF9jaGFpbl9saXN0X2Z1bmN0aW9uIChwcml2LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbl9saXN0KSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChwcml2LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zaW5rX2V2ZW50KSk7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChwcml2LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zaW5rX3F1ZXJ5KSk7CisKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKGppdHRlcmJ1ZmZlciksIHByaXYtPnNyY3BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChqaXR0ZXJidWZmZXIpLCBwcml2LT5zaW5rcGFkKTsKKworICBHU1RfT0JKRUNUX0ZMQUdfU0VUIChqaXR0ZXJidWZmZXIsIEdTVF9FTEVNRU5UX0ZMQUdfUFJPVklERV9DTE9DSyk7Cit9CisKKyNkZWZpbmUgSVNfRFJPUEFCTEUoaXQpICgoKGl0KS0+dHlwZSA9PSBJVEVNX1RZUEVfQlVGRkVSKSB8fCAoKGl0KS0+dHlwZSA9PSBJVEVNX1RZUEVfTE9TVCkpCisKKyNkZWZpbmUgSVRFTV9UWVBFX0JVRkZFUiAgICAgICAgMAorI2RlZmluZSBJVEVNX1RZUEVfTE9TVCAgICAgICAgICAxCisjZGVmaW5lIElURU1fVFlQRV9FVkVOVCAgICAgICAgIDIKKyNkZWZpbmUgSVRFTV9UWVBFX1FVRVJZICAgICAgICAgMworCitzdGF0aWMgUlRQSml0dGVyQnVmZmVySXRlbSAqCithbGxvY19pdGVtIChncG9pbnRlciBkYXRhLCBndWludCB0eXBlLCBHc3RDbG9ja1RpbWUgZHRzLCBHc3RDbG9ja1RpbWUgcHRzLAorICAgIGd1aW50IHNlcW51bSwgZ3VpbnQgY291bnQsIGd1aW50IHJ0cHRpbWUpCit7CisgIFJUUEppdHRlckJ1ZmZlckl0ZW0gKml0ZW07CisKKyAgaXRlbSA9IGdfc2xpY2VfbmV3IChSVFBKaXR0ZXJCdWZmZXJJdGVtKTsKKyAgaXRlbS0+ZGF0YSA9IGRhdGE7CisgIGl0ZW0tPm5leHQgPSBOVUxMOworICBpdGVtLT5wcmV2ID0gTlVMTDsKKyAgaXRlbS0+dHlwZSA9IHR5cGU7CisgIGl0ZW0tPmR0cyA9IGR0czsKKyAgaXRlbS0+cHRzID0gcHRzOworICBpdGVtLT5zZXFudW0gPSBzZXFudW07CisgIGl0ZW0tPmNvdW50ID0gY291bnQ7CisgIGl0ZW0tPnJ0cHRpbWUgPSBydHB0aW1lOworCisgIHJldHVybiBpdGVtOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9pdGVtIChSVFBKaXR0ZXJCdWZmZXJJdGVtICogaXRlbSkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoaXRlbSAhPSBOVUxMKTsKKworICBpZiAoaXRlbS0+ZGF0YSAmJiBpdGVtLT50eXBlICE9IElURU1fVFlQRV9RVUVSWSkKKyAgICBnc3RfbWluaV9vYmplY3RfdW5yZWYgKGl0ZW0tPmRhdGEpOworICBnX3NsaWNlX2ZyZWUgKFJUUEppdHRlckJ1ZmZlckl0ZW0sIGl0ZW0pOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9pdGVtX2FuZF9yZXRhaW5fZXZlbnRzIChSVFBKaXR0ZXJCdWZmZXJJdGVtICogaXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHTGlzdCAqKmwgPSB1c2VyX2RhdGE7CisKKyAgaWYgKGl0ZW0tPmRhdGEgJiYgaXRlbS0+dHlwZSA9PSBJVEVNX1RZUEVfRVZFTlQKKyAgICAgICYmIEdTVF9FVkVOVF9JU19TVElDS1kgKGl0ZW0tPmRhdGEpKSB7CisgICAgKmwgPSBnX2xpc3RfcHJlcGVuZCAoKmwsIGl0ZW0tPmRhdGEpOworICB9IGVsc2UgaWYgKGl0ZW0tPmRhdGEgJiYgaXRlbS0+dHlwZSAhPSBJVEVNX1RZUEVfUVVFUlkpIHsKKyAgICBnc3RfbWluaV9vYmplY3RfdW5yZWYgKGl0ZW0tPmRhdGEpOworICB9CisgIGdfc2xpY2VfZnJlZSAoUlRQSml0dGVyQnVmZmVySXRlbSwgaXRlbSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2ppdHRlcl9idWZmZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlciAqaml0dGVyYnVmZmVyOworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2OworCisgIGppdHRlcmJ1ZmZlciA9IEdTVF9SVFBfSklUVEVSX0JVRkZFUiAob2JqZWN0KTsKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICBnX2FycmF5X2ZyZWUgKHByaXYtPnRpbWVycywgVFJVRSk7CisgIHRpbWVyX3F1ZXVlX2ZyZWUgKHByaXYtPnJ0eF9zdGF0c190aW1lcnMpOworICBnX211dGV4X2NsZWFyICgmcHJpdi0+amJ1Zl9sb2NrKTsKKyAgZ19jb25kX2NsZWFyICgmcHJpdi0+amJ1Zl90aW1lcik7CisgIGdfY29uZF9jbGVhciAoJnByaXYtPmpidWZfZXZlbnQpOworICBnX2NvbmRfY2xlYXIgKCZwcml2LT5qYnVmX3F1ZXJ5KTsKKworICBydHBfaml0dGVyX2J1ZmZlcl9mbHVzaCAocHJpdi0+amJ1ZiwgKEdGdW5jKSBmcmVlX2l0ZW0sIE5VTEwpOworICBnX3F1ZXVlX2ZvcmVhY2ggKCZwcml2LT5nYXBfcGFja2V0cywgKEdGdW5jKSBnc3RfYnVmZmVyX3VucmVmLCBOVUxMKTsKKyAgZ19xdWV1ZV9jbGVhciAoJnByaXYtPmdhcF9wYWNrZXRzKTsKKyAgZ19vYmplY3RfdW5yZWYgKHByaXYtPmpidWYpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIEdzdEl0ZXJhdG9yICoKK2dzdF9ydHBfaml0dGVyX2J1ZmZlcl9pdGVyYXRlX2ludGVybmFsX2xpbmtzIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCkKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyICpqaXR0ZXJidWZmZXI7CisgIEdzdFBhZCAqb3RoZXJwYWQgPSBOVUxMOworICBHc3RJdGVyYXRvciAqaXQgPSBOVUxMOworICBHVmFsdWUgdmFsID0geyAwLCB9OworCisgIGppdHRlcmJ1ZmZlciA9IEdTVF9SVFBfSklUVEVSX0JVRkZFUl9DQVNUIChwYXJlbnQpOworCisgIGlmIChwYWQgPT0gaml0dGVyYnVmZmVyLT5wcml2LT5zaW5rcGFkKSB7CisgICAgb3RoZXJwYWQgPSBqaXR0ZXJidWZmZXItPnByaXYtPnNyY3BhZDsKKyAgfSBlbHNlIGlmIChwYWQgPT0gaml0dGVyYnVmZmVyLT5wcml2LT5zcmNwYWQpIHsKKyAgICBvdGhlcnBhZCA9IGppdHRlcmJ1ZmZlci0+cHJpdi0+c2lua3BhZDsKKyAgfSBlbHNlIGlmIChwYWQgPT0gaml0dGVyYnVmZmVyLT5wcml2LT5ydGNwc2lua3BhZCkgeworICAgIGl0ID0gZ3N0X2l0ZXJhdG9yX25ld19zaW5nbGUgKEdTVF9UWVBFX1BBRCwgTlVMTCk7CisgIH0KKworICBpZiAoaXQgPT0gTlVMTCkgeworICAgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR1NUX1RZUEVfUEFEKTsKKyAgICBnX3ZhbHVlX3NldF9vYmplY3QgKCZ2YWwsIG90aGVycGFkKTsKKyAgICBpdCA9IGdzdF9pdGVyYXRvcl9uZXdfc2luZ2xlIChHU1RfVFlQRV9QQUQsICZ2YWwpOworICAgIGdfdmFsdWVfdW5zZXQgKCZ2YWwpOworICB9CisKKyAgcmV0dXJuIGl0OworfQorCitzdGF0aWMgR3N0UGFkICoKK2NyZWF0ZV9ydGNwX3NpbmsgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlcikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgImNyZWF0aW5nIFJUQ1Agc2luayBwYWQiKTsKKworICBwcml2LT5ydGNwc2lua3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZQorICAgICAgKCZnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2lua19ydGNwX3RlbXBsYXRlLCAic2lua19ydGNwIik7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChwcml2LT5ydGNwc2lua3BhZCwKKyAgICAgIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbl9ydGNwKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHByaXYtPnJ0Y3BzaW5rcGFkLAorICAgICAgKEdzdFBhZEV2ZW50RnVuY3Rpb24pIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zaW5rX3J0Y3BfZXZlbnQpOworICBnc3RfcGFkX3NldF9pdGVyYXRlX2ludGVybmFsX2xpbmtzX2Z1bmN0aW9uIChwcml2LT5ydGNwc2lua3BhZCwKKyAgICAgIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9pdGVyYXRlX2ludGVybmFsX2xpbmtzKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChwcml2LT5ydGNwc2lua3BhZCwgVFJVRSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKGppdHRlcmJ1ZmZlciksIHByaXYtPnJ0Y3BzaW5rcGFkKTsKKworICByZXR1cm4gcHJpdi0+cnRjcHNpbmtwYWQ7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfcnRjcF9zaW5rIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXY7CisKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJyZW1vdmluZyBSVENQIHNpbmsgcGFkIik7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChwcml2LT5ydGNwc2lua3BhZCwgRkFMU0UpOworCisgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKGppdHRlcmJ1ZmZlciksIHByaXYtPnJ0Y3BzaW5rcGFkKTsKKyAgcHJpdi0+cnRjcHNpbmtwYWQgPSBOVUxMOworfQorCitzdGF0aWMgR3N0UGFkICoKK2dzdF9ydHBfaml0dGVyX2J1ZmZlcl9yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsIGNvbnN0IGdjaGFyICogbmFtZSwgY29uc3QgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyICpqaXR0ZXJidWZmZXI7CisgIEdzdEVsZW1lbnRDbGFzcyAqa2xhc3M7CisgIEdzdFBhZCAqcmVzdWx0OworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsICh0ZW1wbCAhPSBOVUxMLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9JU19SVFBfSklUVEVSX0JVRkZFUiAoZWxlbWVudCksIE5VTEwpOworCisgIGppdHRlcmJ1ZmZlciA9IEdTVF9SVFBfSklUVEVSX0JVRkZFUl9DQVNUIChlbGVtZW50KTsKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKyAga2xhc3MgPSBHU1RfRUxFTUVOVF9HRVRfQ0xBU1MgKGVsZW1lbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGVsZW1lbnQsICJyZXF1ZXN0aW5nIHBhZCAlcyIsIEdTVF9TVFJfTlVMTCAobmFtZSkpOworCisgIC8qIGZpZ3VyZSBvdXQgdGhlIHRlbXBsYXRlICovCisgIGlmICh0ZW1wbCA9PSBnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywgInNpbmtfcnRjcCIpKSB7CisgICAgaWYgKHByaXYtPnJ0Y3BzaW5rcGFkICE9IE5VTEwpCisgICAgICBnb3RvIGV4aXN0czsKKworICAgIHJlc3VsdCA9IGNyZWF0ZV9ydGNwX3NpbmsgKGppdHRlcmJ1ZmZlcik7CisgIH0gZWxzZQorICAgIGdvdG8gd3JvbmdfdGVtcGxhdGU7CisKKyAgcmV0dXJuIHJlc3VsdDsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX3RlbXBsYXRlOgorICB7CisgICAgZ193YXJuaW5nICgicnRwaml0dGVyYnVmZmVyOiB0aGlzIGlzIG5vdCBvdXIgdGVtcGxhdGUiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorZXhpc3RzOgorICB7CisgICAgZ193YXJuaW5nICgicnRwaml0dGVyYnVmZmVyOiBwYWQgYWxyZWFkeSByZXF1ZXN0ZWQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXIgKmppdHRlcmJ1ZmZlcjsKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfUlRQX0pJVFRFUl9CVUZGRVIgKGVsZW1lbnQpKTsKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1BBRCAocGFkKSk7CisKKyAgaml0dGVyYnVmZmVyID0gR1NUX1JUUF9KSVRURVJfQlVGRkVSX0NBU1QgKGVsZW1lbnQpOworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGVsZW1lbnQsICJyZWxlYXNpbmcgcGFkICVzOiVzIiwgR1NUX0RFQlVHX1BBRF9OQU1FIChwYWQpKTsKKworICBpZiAocHJpdi0+cnRjcHNpbmtwYWQgPT0gcGFkKSB7CisgICAgcmVtb3ZlX3J0Y3Bfc2luayAoaml0dGVyYnVmZmVyKTsKKyAgfSBlbHNlCisgICAgZ290byB3cm9uZ19wYWQ7CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLword3JvbmdfcGFkOgorICB7CisgICAgZ193YXJuaW5nICgiZ3N0aml0dGVyYnVmZmVyOiBhc2tlZCB0byByZWxlYXNlIGFuIHVua25vd24gcGFkIik7CisgICAgcmV0dXJuOworICB9Cit9CisKK3N0YXRpYyBHc3RDbG9jayAqCitnc3RfcnRwX2ppdHRlcl9idWZmZXJfcHJvdmlkZV9jbG9jayAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIHJldHVybiBnc3Rfc3lzdGVtX2Nsb2NrX29idGFpbiAoKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2V0X2Nsb2NrIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0Q2xvY2sgKiBjbG9jaykKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyICpqaXR0ZXJidWZmZXIgPSBHU1RfUlRQX0pJVFRFUl9CVUZGRVIgKGVsZW1lbnQpOworCisgIHJ0cF9qaXR0ZXJfYnVmZmVyX3NldF9waXBlbGluZV9jbG9jayAoaml0dGVyYnVmZmVyLT5wcml2LT5qYnVmLCBjbG9jayk7CisKKyAgcmV0dXJuIEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zZXRfY2xvY2sgKGVsZW1lbnQsIGNsb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaml0dGVyX2J1ZmZlcl9jbGVhcl9wdF9tYXAgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlcikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIC8qIHRoaXMgd2lsbCB0cmlnZ2VyIGEgbmV3IHB0LW1hcCByZXF1ZXN0IHNpZ25hbCwgRklYTUUsIGRvIHNvbWV0aGluZyBiZXR0ZXIuICovCisKKyAgSkJVRl9MT0NLIChwcml2KTsKKyAgcHJpdi0+Y2xvY2tfcmF0ZSA9IC0xOworICAvKiBkbyBub3QgY2xlYXIgY3VycmVudCBjb250ZW50LCBidXQgcmVmcmVzaCBzdGF0ZSBmb3IgbmV3IGFycml2YWwgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAicmVzZXQgaml0dGVyYnVmZmVyIik7CisgIHJ0cF9qaXR0ZXJfYnVmZmVyX3Jlc2V0X3NrZXcgKHByaXYtPmpidWYpOworICBKQlVGX1VOTE9DSyAocHJpdik7Cit9CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2dzdF9ydHBfaml0dGVyX2J1ZmZlcl9zZXRfYWN0aXZlIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqYnVmLCBnYm9vbGVhbiBhY3RpdmUsCisgICAgZ3VpbnQ2NCBvZmZzZXQpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXY7CisgIEdzdENsb2NrVGltZSBsYXN0X291dDsKKyAgUlRQSml0dGVyQnVmZmVySXRlbSAqaXRlbTsKKworICBwcml2ID0gamJ1Zi0+cHJpdjsKKworICBKQlVGX0xPQ0sgKHByaXYpOworICBHU1RfREVCVUdfT0JKRUNUIChqYnVmLCAic2V0dGluZyBhY3RpdmUgJWQgd2l0aCBvZmZzZXQgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgYWN0aXZlLCBHU1RfVElNRV9BUkdTIChvZmZzZXQpKTsKKworICBpZiAoYWN0aXZlICE9IHByaXYtPmFjdGl2ZSkgeworICAgIC8qIGFkZCB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gcGF1c2VkIHRvIHRoZSBvdXRwdXQgb2Zmc2V0LiBBbGwKKyAgICAgKiBvdXRnb2luZyBidWZmZXJzIHdpbGwgaGF2ZSB0aGlzIG9mZnNldCBhcHBsaWVkIHRvIHRoZWlyIHRpbWVzdGFtcHMgaW4KKyAgICAgKiBvcmRlciB0byBtYWtlIHRoZW0gYXJyaXZlIGluIHRpbWUgaW4gdGhlIHNpbmsuICovCisgICAgcHJpdi0+b3V0X29mZnNldCA9IG9mZnNldDsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqYnVmLCAib3V0IG9mZnNldCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHByaXYtPm91dF9vZmZzZXQpKTsKKyAgICBwcml2LT5hY3RpdmUgPSBhY3RpdmU7CisgICAgSkJVRl9TSUdOQUxfRVZFTlQgKHByaXYpOworICB9CisgIGlmICghYWN0aXZlKSB7CisgICAgcnRwX2ppdHRlcl9idWZmZXJfc2V0X2J1ZmZlcmluZyAocHJpdi0+amJ1ZiwgVFJVRSk7CisgIH0KKyAgaWYgKChpdGVtID0gcnRwX2ppdHRlcl9idWZmZXJfcGVlayAocHJpdi0+amJ1ZikpKSB7CisgICAgLyogaGVhZCBidWZmZXIgdGltZXN0YW1wIGFuZCBvZmZzZXQgZ2l2ZXMgb3VyIG91dHB1dCB0aW1lICovCisgICAgbGFzdF9vdXQgPSBpdGVtLT5wdHMgKyBwcml2LT50c19vZmZzZXQ7CisgIH0gZWxzZSB7CisgICAgLyogdXNlIGxhc3Qga25vd24gdGltZSB3aGVuIHRoZSBidWZmZXIgaXMgZW1wdHkgKi8KKyAgICBsYXN0X291dCA9IHByaXYtPmxhc3Rfb3V0X3RpbWU7CisgIH0KKyAgSkJVRl9VTkxPQ0sgKHByaXYpOworCisgIHJldHVybiBsYXN0X291dDsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2dldGNhcHMgKEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyICpqaXR0ZXJidWZmZXI7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXY7CisgIEdzdFBhZCAqb3RoZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdENhcHMgKnRlbXBsOworCisgIGppdHRlcmJ1ZmZlciA9IEdTVF9SVFBfSklUVEVSX0JVRkZFUiAoZ3N0X3BhZF9nZXRfcGFyZW50IChwYWQpKTsKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICBvdGhlciA9IChwYWQgPT0gcHJpdi0+c3JjcGFkID8gcHJpdi0+c2lua3BhZCA6IHByaXYtPnNyY3BhZCk7CisKKyAgY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChvdGhlciwgZmlsdGVyKTsKKworICB0ZW1wbCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChwYWQpOworICBpZiAoY2FwcyA9PSBOVUxMKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAidXNlIHRlbXBsYXRlIik7CisgICAgY2FwcyA9IHRlbXBsOworICB9IGVsc2UgeworICAgIEdzdENhcHMgKmludGVyc2VjdDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgImludGVyc2VjdCB3aXRoIHRlbXBsYXRlIik7CisKKyAgICBpbnRlcnNlY3QgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKGNhcHMsIHRlbXBsKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHRlbXBsKTsKKworICAgIGNhcHMgPSBpbnRlcnNlY3Q7CisgIH0KKyAgZ3N0X29iamVjdF91bnJlZiAoaml0dGVyYnVmZmVyKTsKKworICByZXR1cm4gY2FwczsKK30KKworLyoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggSkJVRl9MT0NLIGhlbGQKKyAqLworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9qaXR0ZXJfYnVmZmVyX3NpbmtfcGFyc2VfY2FwcyAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyLAorICAgIEdzdENhcHMgKiBjYXBzLCBnaW50IHB0KQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2OworICBHc3RTdHJ1Y3R1cmUgKmNhcHNfc3RydWN0OworICBndWludCB2YWw7CisgIGdpbnQgcGF5bG9hZCA9IC0xOworICBHc3RDbG9ja1RpbWUgdHZhbDsKKyAgY29uc3QgZ2NoYXIgKnRzX3JlZmNsaywgKm1lZGlhY2xrOworCisgIHByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisKKyAgLyogZmlyc3QgcGFyc2UgdGhlIGNhcHMgKi8KKyAgY2Fwc19zdHJ1Y3QgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJnb3QgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoY2Fwc19zdHJ1Y3QsICJwYXlsb2FkIiwgJnBheWxvYWQpICYmIHB0ICE9IC0xCisgICAgICAmJiBwYXlsb2FkICE9IHB0KSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoaml0dGVyYnVmZmVyLAorICAgICAgICAiR290IGNhcHMgd2l0aCB3cm9uZyBwYXlsb2FkIHR5cGUgKGdvdCAlZCwgZXhwZWN0ZWQgJWQpIiwgcHQsIHBheWxvYWQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmIChwYXlsb2FkICE9IC0xKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiR290IHBheWxvYWQgdHlwZSAlZCIsIHBheWxvYWQpOworICAgIHByaXYtPmxhc3RfcHQgPSBwYXlsb2FkOworICB9CisKKyAgLyogd2UgbmVlZCBhIGNsb2NrLXJhdGUgdG8gY29udmVydCB0aGUgcnRwIHRpbWVzdGFtcHMgdG8gR1N0cmVhbWVyIHRpbWUgYW5kIHRvCisgICAqIG1lYXN1cmUgdGhlIGFtb3VudCBvZiBkYXRhIGluIHRoZSBidWZmZXIgKi8KKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKGNhcHNfc3RydWN0LCAiY2xvY2stcmF0ZSIsICZwcml2LT5jbG9ja19yYXRlKSkKKyAgICBnb3RvIGVycm9yOworCisgIGlmIChwcml2LT5jbG9ja19yYXRlIDw9IDApCisgICAgZ290byB3cm9uZ19yYXRlOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgImdvdCBjbG9jay1yYXRlICVkIiwgcHJpdi0+Y2xvY2tfcmF0ZSk7CisKKyAgcnRwX2ppdHRlcl9idWZmZXJfc2V0X2Nsb2NrX3JhdGUgKHByaXYtPmpidWYsIHByaXYtPmNsb2NrX3JhdGUpOworCisgIGdzdF9ydHBfcGFja2V0X3JhdGVfY3R4X3Jlc2V0ICgmcHJpdi0+cGFja2V0X3JhdGVfY3R4LCBwcml2LT5jbG9ja19yYXRlKTsKKworICAvKiBUaGUgY2xvY2sgYmFzZSBpcyB0aGUgUlRQIHRpbWVzdGFtcCBjb3Jyc3BvbmRpbmcgdG8gdGhlIG5wdC1zdGFydCB2YWx1ZS4gV2UKKyAgICogY2FuIHVzZSB0aGlzIHRvIHRyYWNrIHRoZSBhbW91bnQgb2YgdGltZSBlbGFwc2VkIG9uIHRoZSBzZW5kZXIuICovCisgIGlmIChnc3Rfc3RydWN0dXJlX2dldF91aW50IChjYXBzX3N0cnVjdCwgImNsb2NrLWJhc2UiLCAmdmFsKSkKKyAgICBwcml2LT5jbG9ja19iYXNlID0gdmFsOworICBlbHNlCisgICAgcHJpdi0+Y2xvY2tfYmFzZSA9IC0xOworCisgIHByaXYtPmV4dF90aW1lc3RhbXAgPSBwcml2LT5jbG9ja19iYXNlOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgImdvdCBjbG9jay1iYXNlICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgIHByaXYtPmNsb2NrX2Jhc2UpOworCisgIGlmIChnc3Rfc3RydWN0dXJlX2dldF91aW50IChjYXBzX3N0cnVjdCwgInNlcW51bS1iYXNlIiwgJnZhbCkpIHsKKyAgICAvKiBmaXJzdCBleHBlY3RlZCBzZXFudW0sIG9ubHkgdXBkYXRlIHdoZW4gd2UgZGlkbid0IGhhdmUgYSBwcmV2aW91cyBiYXNlLiAqLworICAgIGlmIChwcml2LT5uZXh0X2luX3NlcW51bSA9PSAtMSkKKyAgICAgIHByaXYtPm5leHRfaW5fc2VxbnVtID0gdmFsOworICAgIGlmIChwcml2LT5uZXh0X3NlcW51bSA9PSAtMSkgeworICAgICAgcHJpdi0+bmV4dF9zZXFudW0gPSB2YWw7CisgICAgICBKQlVGX1NJR05BTF9FVkVOVCAocHJpdik7CisgICAgfQorICAgIHByaXYtPnNlcW51bV9iYXNlID0gdmFsOworICB9IGVsc2UgeworICAgIHByaXYtPnNlcW51bV9iYXNlID0gLTE7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJnb3Qgc2VxbnVtLWJhc2UgJWQiLCBwcml2LT5uZXh0X2luX3NlcW51bSk7CisKKyAgLyogdGhlIHN0YXJ0IGFuZCBzdG9wIHRpbWVzLiBUaGUgc2VxbnVtLWJhc2UgY29ycmVzcG9uZHMgdG8gdGhlIHN0YXJ0IHRpbWUuIFdlCisgICAqIHdpbGwga2VlcCB0cmFjayBvZiB0aGUgc2VxbnVtcyBvbiB0aGUgb3V0cHV0IGFuZCB3aGVuIHdlIHJlYWNoIHRoZSBvbmUKKyAgICogY29ycmVzcG9uZGluZyB0byBucHQtc3RvcCwgd2UgZW1pdCB0aGUgbnB0LXN0b3AtcmVhY2hlZCBzaWduYWwgKi8KKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2Nsb2NrX3RpbWUgKGNhcHNfc3RydWN0LCAibnB0LXN0YXJ0IiwgJnR2YWwpKQorICAgIHByaXYtPm5wdF9zdGFydCA9IHR2YWw7CisgIGVsc2UKKyAgICBwcml2LT5ucHRfc3RhcnQgPSAwOworCisgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9jbG9ja190aW1lIChjYXBzX3N0cnVjdCwgIm5wdC1zdG9wIiwgJnR2YWwpKQorICAgIHByaXYtPm5wdF9zdG9wID0gdHZhbDsKKyAgZWxzZQorICAgIHByaXYtPm5wdF9zdG9wID0gLTE7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLAorICAgICAgIm5wdCBzdGFydC9zdG9wOiAlIiBHU1RfVElNRV9GT1JNQVQgIi0lIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChwcml2LT5ucHRfc3RhcnQpLCBHU1RfVElNRV9BUkdTIChwcml2LT5ucHRfc3RvcCkpOworCisgIGlmICgodHNfcmVmY2xrID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChjYXBzX3N0cnVjdCwgImEtdHMtcmVmY2xrIikpKSB7CisgICAgR3N0Q2xvY2sgKmNsb2NrID0gTlVMTDsKKyAgICBndWludDY0IGNsb2NrX29mZnNldCA9IC0xOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiSGF2ZSB0aW1lc3RhbXAgcmVmZXJlbmNlIGNsb2NrICVzIiwKKyAgICAgICAgdHNfcmVmY2xrKTsKKworICAgIGlmIChnX3N0cl9oYXNfcHJlZml4ICh0c19yZWZjbGssICJudHA9IikpIHsKKyAgICAgIGlmIChnX3N0cl9oYXNfcHJlZml4ICh0c19yZWZjbGssICJudHA9L3RyYWNlYWJsZS8iKSkgeworICAgICAgICBHU1RfRklYTUVfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJDYW4ndCBoYW5kbGUgdHJhY2VhYmxlIE5UUCBjbG9ja3MiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGdjaGFyICpob3N0LCAqcG9ydHN0cjsKKyAgICAgICAgZ2NoYXIgKmhvc3RuYW1lOworICAgICAgICBndWludCBwb3J0OworCisgICAgICAgIGhvc3QgPSB0c19yZWZjbGsgKyBzaXplb2YgKCJudHA9IikgLSAxOworICAgICAgICBpZiAoaG9zdFswXSA9PSAnWycpIHsKKyAgICAgICAgICAvKiBJUHY2ICovCisgICAgICAgICAgcG9ydHN0ciA9IHN0cmNociAoaG9zdCwgJ10nKTsKKyAgICAgICAgICBpZiAocG9ydHN0ciAmJiBwb3J0c3RyWzFdID09ICc6JykKKyAgICAgICAgICAgIHBvcnRzdHIgPSBwb3J0c3RyICsgMTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBwb3J0c3RyID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwb3J0c3RyID0gc3RycmNociAoaG9zdCwgJzonKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKCFwb3J0c3RyIHx8IHNzY2FuZiAocG9ydHN0ciwgIjoldSIsICZwb3J0KSAhPSAxKQorICAgICAgICAgIHBvcnQgPSAxMjM7CisKKyAgICAgICAgaWYgKHBvcnRzdHIpCisgICAgICAgICAgaG9zdG5hbWUgPSBnX3N0cm5kdXAgKGhvc3QsIChwb3J0c3RyIC0gaG9zdCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgaG9zdG5hbWUgPSBnX3N0cmR1cCAoaG9zdCk7CisKKyAgICAgICAgY2xvY2sgPSBnc3RfbnRwX2Nsb2NrX25ldyAoTlVMTCwgaG9zdG5hbWUsIHBvcnQsIDApOworICAgICAgICBnX2ZyZWUgKGhvc3RuYW1lKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGdfc3RyX2hhc19wcmVmaXggKHRzX3JlZmNsaywgInB0cD1JRUVFMTU4OC0yMDA4OiIpKSB7CisgICAgICBjb25zdCBnY2hhciAqZG9tYWluc3RyID0KKyAgICAgICAgICB0c19yZWZjbGsgKyBzaXplb2YgKCJwdHA9SUVFRTE1ODgtMjAwODpYWC1YWC1YWC1YWC1YWC1YWC1YWC1YWCIpIC0gMTsKKyAgICAgIGd1aW50IGRvbWFpbjsKKworICAgICAgaWYgKGRvbWFpbnN0clswXSAhPSAnOicgfHwgc3NjYW5mIChkb21haW5zdHIsICI6JXUiLCAmZG9tYWluKSAhPSAxKQorICAgICAgICBkb21haW4gPSAwOworCisgICAgICBjbG9jayA9IGdzdF9wdHBfY2xvY2tfbmV3IChOVUxMLCBkb21haW4pOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfRklYTUVfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJVbnN1cHBvcnRlZCB0aW1lc3RhbXAgcmVmZXJlbmNlIGNsb2NrIik7CisgICAgfQorCisgICAgaWYgKChtZWRpYWNsayA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoY2Fwc19zdHJ1Y3QsICJhLW1lZGlhY2xrIikpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJHb3QgbWVkaWEgY2xvY2sgJXMiLCBtZWRpYWNsayk7CisKKyAgICAgIGlmICghZ19zdHJfaGFzX3ByZWZpeCAobWVkaWFjbGssICJkaXJlY3Q9IikKKyAgICAgICAgICB8fCBzc2NhbmYgKG1lZGlhY2xrLCAiZGlyZWN0PSUiIEdfR1VJTlQ2NF9GT1JNQVQsICZjbG9ja19vZmZzZXQpICE9IDEpCisgICAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIlVuc3VwcG9ydGVkIG1lZGlhIGNsb2NrIik7CisgICAgICBpZiAoc3Ryc3RyIChtZWRpYWNsaywgInJhdGU9IikgIT0gTlVMTCkgeworICAgICAgICBHU1RfRklYTUVfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJSYXRlIHByb3BlcnR5IG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgY2xvY2tfb2Zmc2V0ID0gLTE7CisgICAgICB9CisgICAgfQorCisgICAgcnRwX2ppdHRlcl9idWZmZXJfc2V0X21lZGlhX2Nsb2NrIChwcml2LT5qYnVmLCBjbG9jaywgY2xvY2tfb2Zmc2V0KTsKKyAgfSBlbHNlIHsKKyAgICBydHBfaml0dGVyX2J1ZmZlcl9zZXRfbWVkaWFfY2xvY2sgKHByaXYtPmpidWYsIE5VTEwsIC0xKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworZXJyb3I6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJObyBjbG9jay1yYXRlIGluIGNhcHMhIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit3cm9uZ19yYXRlOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiSW52YWxpZCBjbG9jay1yYXRlICVkIiwgcHJpdi0+Y2xvY2tfcmF0ZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2ppdHRlcl9idWZmZXJfZmx1c2hfc3RhcnQgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlcikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIEpCVUZfTE9DSyAocHJpdik7CisgIC8qIG1hcmsgb3Vyc2VsdmVzIGFzIGZsdXNoaW5nICovCisgIHByaXYtPnNyY3Jlc3VsdCA9IEdTVF9GTE9XX0ZMVVNISU5HOworICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJEaXNhYmxpbmcgcG9wIG9uIHF1ZXVlIik7CisgIC8qIHRoaXMgdW5ibG9ja3MgYW55IHdhaXRpbmcgcG9wcyBvbiB0aGUgc3JjIHBhZCB0YXNrICovCisgIEpCVUZfU0lHTkFMX0VWRU5UIChwcml2KTsKKyAgSkJVRl9TSUdOQUxfUVVFUlkgKHByaXYsIEZBTFNFKTsKKyAgSkJVRl9VTkxPQ0sgKHByaXYpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoX3N0b3AgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlcikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIEpCVUZfTE9DSyAocHJpdik7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIkVuYWJsaW5nIHBvcCBvbiBxdWV1ZSIpOworICAvKiBNYXJrIGFzIG5vbiBmbHVzaGluZyAqLworICBwcml2LT5zcmNyZXN1bHQgPSBHU1RfRkxPV19PSzsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnByaXYtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIHByaXYtPmxhc3RfcG9wcGVkX3NlcW51bSA9IC0xOworICBwcml2LT5sYXN0X291dF90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgcHJpdi0+bmV4dF9zZXFudW0gPSAtMTsKKyAgcHJpdi0+c2VxbnVtX2Jhc2UgPSAtMTsKKyAgcHJpdi0+aXBzX3J0cHRpbWUgPSAtMTsKKyAgcHJpdi0+aXBzX3B0cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIHByaXYtPnBhY2tldF9zcGFjaW5nID0gMDsKKyAgcHJpdi0+bmV4dF9pbl9zZXFudW0gPSAtMTsKKyAgcHJpdi0+Y2xvY2tfcmF0ZSA9IC0xOworICBwcml2LT5sYXN0X3B0ID0gLTE7CisgIHByaXYtPmVvcyA9IEZBTFNFOworICBwcml2LT5lc3RpbWF0ZWRfZW9zID0gLTE7CisgIHByaXYtPmxhc3RfZWxhcHNlZCA9IDA7CisgIHByaXYtPmV4dF90aW1lc3RhbXAgPSAtMTsKKyAgcHJpdi0+YXZnX2ppdHRlciA9IDA7CisgIHByaXYtPmxhc3RfZHRzID0gLTE7CisgIHByaXYtPmxhc3RfcnRwdGltZSA9IC0xOworICBwcml2LT5sYXN0X2luX3B0cyA9IDA7CisgIHByaXYtPmVxdWlkaXN0YW50ID0gMDsKKyAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiZmx1c2ggYW5kIHJlc2V0IGppdHRlcmJ1ZmZlciIpOworICBydHBfaml0dGVyX2J1ZmZlcl9mbHVzaCAocHJpdi0+amJ1ZiwgKEdGdW5jKSBmcmVlX2l0ZW0sIE5VTEwpOworICBydHBfaml0dGVyX2J1ZmZlcl9kaXNhYmxlX2J1ZmZlcmluZyAocHJpdi0+amJ1ZiwgRkFMU0UpOworICBydHBfaml0dGVyX2J1ZmZlcl9yZXNldF9za2V3IChwcml2LT5qYnVmKTsKKyAgcmVtb3ZlX2FsbF90aW1lcnMgKGppdHRlcmJ1ZmZlcik7CisgIGdfcXVldWVfZm9yZWFjaCAoJnByaXYtPmdhcF9wYWNrZXRzLCAoR0Z1bmMpIGdzdF9idWZmZXJfdW5yZWYsIE5VTEwpOworICBnX3F1ZXVlX2NsZWFyICgmcHJpdi0+Z2FwX3BhY2tldHMpOworICBKQlVGX1VOTE9DSyAocHJpdik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NyY19hY3RpdmF0ZV9tb2RlIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RQYWRNb2RlIG1vZGUsIGdib29sZWFuIGFjdGl2ZSkKK3sKKyAgZ2Jvb2xlYW4gcmVzdWx0OworICBHc3RSdHBKaXR0ZXJCdWZmZXIgKmppdHRlcmJ1ZmZlciA9IE5VTEw7CisKKyAgaml0dGVyYnVmZmVyID0gR1NUX1JUUF9KSVRURVJfQlVGRkVSIChwYXJlbnQpOworCisgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgR1NUX1BBRF9NT0RFX1BVU0g6CisgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgIC8qIGFsbG93IGRhdGEgcHJvY2Vzc2luZyAqLworICAgICAgICBnc3RfcnRwX2ppdHRlcl9idWZmZXJfZmx1c2hfc3RvcCAoaml0dGVyYnVmZmVyKTsKKworICAgICAgICAvKiBzdGFydCBwdXNoaW5nIG91dCBidWZmZXJzICovCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIlN0YXJ0aW5nIHRhc2sgb24gc3JjcGFkIik7CisgICAgICAgIHJlc3VsdCA9IGdzdF9wYWRfc3RhcnRfdGFzayAoaml0dGVyYnVmZmVyLT5wcml2LT5zcmNwYWQsCisgICAgICAgICAgICAoR3N0VGFza0Z1bmN0aW9uKSBnc3RfcnRwX2ppdHRlcl9idWZmZXJfbG9vcCwgaml0dGVyYnVmZmVyLCBOVUxMKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIG1ha2Ugc3VyZSBhbGwgZGF0YSBwcm9jZXNzaW5nIHN0b3BzIEFTQVAgKi8KKyAgICAgICAgZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoX3N0YXJ0IChqaXR0ZXJidWZmZXIpOworCisgICAgICAgIC8qIE5PVEUgdGhpcyB3aWxsIGhhcmRsb2NrIGlmIHRoZSBzdGF0ZSBjaGFuZ2UgaXMgY2FsbGVkIGZyb20gdGhlIHNyYyBwYWQKKyAgICAgICAgICogdGFzayB0aHJlYWQgYmVjYXVzZSB3ZSB3aWxsIF9qb2luKCkgdGhlIHRocmVhZC4gKi8KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiU3RvcHBpbmcgdGFzayBvbiBzcmNwYWQiKTsKKyAgICAgICAgcmVzdWx0ID0gZ3N0X3BhZF9zdG9wX3Rhc2sgKHBhZCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlciAqaml0dGVyYnVmZmVyOworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1M7CisKKyAgaml0dGVyYnVmZmVyID0gR1NUX1JUUF9KSVRURVJfQlVGRkVSIChlbGVtZW50KTsKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgLyogcmVzZXQgbmVnb3RpYXRlZCB2YWx1ZXMgKi8KKyAgICAgIHByaXYtPmNsb2NrX3JhdGUgPSAtMTsKKyAgICAgIHByaXYtPmNsb2NrX2Jhc2UgPSAtMTsKKyAgICAgIHByaXYtPnBlZXJfbGF0ZW5jeSA9IDA7CisgICAgICBwcml2LT5sYXN0X3B0ID0gLTE7CisgICAgICAvKiBibG9jayB1bnRpbCB3ZSBnbyB0byBQTEFZSU5HICovCisgICAgICBwcml2LT5ibG9ja2VkID0gVFJVRTsKKyAgICAgIHByaXYtPnRpbWVyX3J1bm5pbmcgPSBUUlVFOworICAgICAgcHJpdi0+dGltZXJfdGhyZWFkID0KKyAgICAgICAgICBnX3RocmVhZF9uZXcgKCJ0aW1lciIsIChHVGhyZWFkRnVuYykgd2FpdF9uZXh0X3RpbWVvdXQsIGppdHRlcmJ1ZmZlcik7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1BMQVlJTkc6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgLyogdW5ibG9jayB0byBhbGxvdyBzdHJlYW1pbmcgaW4gUExBWUlORyAqLworICAgICAgcHJpdi0+YmxvY2tlZCA9IEZBTFNFOworICAgICAgSkJVRl9TSUdOQUxfRVZFTlQgKHByaXYpOworICAgICAgSkJVRl9TSUdOQUxfVElNRVIgKHByaXYpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIC8qIHdlIGFyZSBhIGxpdmUgZWxlbWVudCBiZWNhdXNlIHdlIHN5bmMgdG8gdGhlIGNsb2NrLCB3aGljaCB3ZSBjYW4gb25seQorICAgICAgICogZG8gaW4gdGhlIFBMQVlJTkcgc3RhdGUgKi8KKyAgICAgIGlmIChyZXQgIT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKQorICAgICAgICByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX05PX1BSRVJPTEw7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUExBWUlOR19UT19QQVVTRUQ6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgLyogYmxvY2sgdG8gc3RvcCBzdHJlYW1pbmcgd2hlbiBQQVVTRUQgKi8KKyAgICAgIHByaXYtPmJsb2NrZWQgPSBUUlVFOworICAgICAgdW5zY2hlZHVsZV9jdXJyZW50X3RpbWVyIChqaXR0ZXJidWZmZXIpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgaWYgKHJldCAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpCisgICAgICAgIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfTk9fUFJFUk9MTDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmcHJpdi0+bGFzdF9zciwgTlVMTCk7CisgICAgICBwcml2LT50aW1lcl9ydW5uaW5nID0gRkFMU0U7CisgICAgICB1bnNjaGVkdWxlX2N1cnJlbnRfdGltZXIgKGppdHRlcmJ1ZmZlcik7CisgICAgICBKQlVGX1NJR05BTF9USU1FUiAocHJpdik7CisgICAgICBKQlVGX1NJR05BTF9RVUVSWSAocHJpdiwgRkFMU0UpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgZ190aHJlYWRfam9pbiAocHJpdi0+dGltZXJfdGhyZWFkKTsKKyAgICAgIHByaXYtPnRpbWVyX3RocmVhZCA9IE5VTEw7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKyAgR3N0UnRwSml0dGVyQnVmZmVyICpqaXR0ZXJidWZmZXI7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXY7CisKKyAgaml0dGVyYnVmZmVyID0gR1NUX1JUUF9KSVRURVJfQlVGRkVSX0NBU1QgKHBhcmVudCk7CisgIHByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAicmVjZWl2ZWQgJXMiLCBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0xBVEVOQ1k6CisgICAgeworICAgICAgR3N0Q2xvY2tUaW1lIGxhdGVuY3k7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9sYXRlbmN5IChldmVudCwgJmxhdGVuY3kpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAgICAgImNvbmZpZ3VyaW5nIGxhdGVuY3kgb2YgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChsYXRlbmN5KSk7CisKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICAvKiBhZGp1c3QgdGhlIG92ZXJhbGwgYnVmZmVyIGRlbGF5IHRvIHRoZSB0b3RhbCBwaXBlbGluZSBsYXRlbmN5IGluCisgICAgICAgKiBidWZmZXJpbmcgbW9kZSBiZWNhdXNlIGlmIGRvd25zdHJlYW0gY29uc3VtZXMgdG9vIGZhc3QgKGJlY2F1c2Ugb2YKKyAgICAgICAqIGxhcmdlIGxhdGVuY3kgb3IgcXVldWVzLCB3ZSB3b3VsZCBzdGFydCByZWJ1ZmZlcmluZyBhZ2Fpbi4gKi8KKyAgICAgIGlmIChydHBfaml0dGVyX2J1ZmZlcl9nZXRfbW9kZSAocHJpdi0+amJ1ZikgPT0KKyAgICAgICAgICBSVFBfSklUVEVSX0JVRkZFUl9NT0RFX0JVRkZFUikgeworICAgICAgICBydHBfaml0dGVyX2J1ZmZlcl9zZXRfZGVsYXkgKHByaXYtPmpidWYsIGxhdGVuY3kpOworICAgICAgfQorICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworCisgICAgICByZXQgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHByaXYtPnNpbmtwYWQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChwcml2LT5zaW5rcGFkLCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qIGhhbmRsZXMgYW5kIHN0b3JlcyB0aGUgZXZlbnQgaW4gdGhlIGppdHRlcmJ1ZmZlciwgbXVzdCBiZSBjYWxsZWQgd2l0aAorICogTE9DSyAqLworc3RhdGljIGdib29sZWFuCitxdWV1ZV9ldmVudCAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworICBSVFBKaXR0ZXJCdWZmZXJJdGVtICppdGVtOworICBnYm9vbGVhbiBoZWFkOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICBnc3Rfaml0dGVyX2J1ZmZlcl9zaW5rX3BhcnNlX2NhcHMgKGppdHRlcmJ1ZmZlciwgY2FwcywgLTEpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6CisgICAgeworICAgICAgR3N0U2VnbWVudCBzZWdtZW50OworICAgICAgZ3N0X2V2ZW50X2NvcHlfc2VnbWVudCAoZXZlbnQsICZzZWdtZW50KTsKKworICAgICAgLyogd2UgbmVlZCB0aW1lIGZvciBub3cgKi8KKyAgICAgIGlmIChzZWdtZW50LmZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiaWdub3Jpbmcgbm9uLVRJTUUgbmV3c2VnbWVudCIpOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKworICAgICAgICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KTsKKyAgICAgIH0KKworICAgICAgcHJpdi0+c2VnbWVudCA9IHNlZ21lbnQ7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRU9TOgorICAgICAgcHJpdi0+ZW9zID0gVFJVRTsKKyAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX2Rpc2FibGVfYnVmZmVyaW5nIChwcml2LT5qYnVmLCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisKKyAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiYWRkaW5nIGV2ZW50Iik7CisgIGl0ZW0gPSBhbGxvY19pdGVtIChldmVudCwgSVRFTV9UWVBFX0VWRU5ULCAtMSwgLTEsIC0xLCAwLCAtMSk7CisgIHJ0cF9qaXR0ZXJfYnVmZmVyX2luc2VydCAocHJpdi0+amJ1ZiwgaXRlbSwgJmhlYWQsIE5VTEwpOworICBpZiAoaGVhZCkKKyAgICBKQlVGX1NJR05BTF9FVkVOVCAocHJpdik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIEdzdFJ0cEppdHRlckJ1ZmZlciAqaml0dGVyYnVmZmVyOworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2OworCisgIGppdHRlcmJ1ZmZlciA9IEdTVF9SVFBfSklUVEVSX0JVRkZFUiAocGFyZW50KTsKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJyZWNlaXZlZCAlcyIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RBUlQ6CisgICAgICByZXQgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHByaXYtPnNyY3BhZCwgZXZlbnQpOworICAgICAgZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoX3N0YXJ0IChqaXR0ZXJidWZmZXIpOworICAgICAgLyogd2FpdCBmb3IgdGhlIGxvb3AgdG8gZ28gaW50byBQQVVTRUQgKi8KKyAgICAgIGdzdF9wYWRfcGF1c2VfdGFzayAocHJpdi0+c3JjcGFkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6CisgICAgICByZXQgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHByaXYtPnNyY3BhZCwgZXZlbnQpOworICAgICAgcmV0ID0KKyAgICAgICAgICBnc3RfcnRwX2ppdHRlcl9idWZmZXJfc3JjX2FjdGl2YXRlX21vZGUgKHByaXYtPnNyY3BhZCwgcGFyZW50LAorICAgICAgICAgIEdTVF9QQURfTU9ERV9QVVNILCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoR1NUX0VWRU5UX0lTX1NFUklBTElaRUQgKGV2ZW50KSkgeworICAgICAgICAvKiBzZXJpYWxpemVkIGV2ZW50cyBnbyBpbiB0aGUgcXVldWUgKi8KKyAgICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgICAgaWYgKHByaXYtPnNyY3Jlc3VsdCAhPSBHU1RfRkxPV19PSykgeworICAgICAgICAgIC8qIEVycm9ycyBpbiBzdGlja3kgZXZlbnQgcHVzaGluZyBhcmUgbm8gcHJvYmxlbSBhbmQgaWdub3JlZCBoZXJlCisgICAgICAgICAgICogYXMgdGhleSB3aWxsIGNhdXNlIG1vcmUgbWVhbmluZ2Z1bCBlcnJvcnMgZHVyaW5nIGRhdGEgZmxvdy4KKyAgICAgICAgICAgKiBGb3IgRU9TIGV2ZW50cywgdGhhdCBhcmUgbm90IGZvbGxvd2VkIGJ5IGRhdGEgZmxvdywgd2Ugc3RpbGwKKyAgICAgICAgICAgKiByZXR1cm4gRkFMU0UgaGVyZSB0aG91Z2guCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKCFHU1RfRVZFTlRfSVNfU1RJQ0tZIChldmVudCkgfHwKKyAgICAgICAgICAgICAgR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSA9PSBHU1RfRVZFTlRfRU9TKQorICAgICAgICAgICAgZ290byBvdXRfZmxvd19lcnJvcjsKKyAgICAgICAgfQorICAgICAgICAvKiByZWZ1c2UgbW9yZSBldmVudHMgb24gRU9TICovCisgICAgICAgIGlmIChwcml2LT5lb3MpCisgICAgICAgICAgZ290byBvdXRfZW9zOworICAgICAgICByZXQgPSBxdWV1ZV9ldmVudCAoaml0dGVyYnVmZmVyLCBldmVudCk7CisgICAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIG5vbi1zZXJpYWxpemVkIGV2ZW50cyBhcmUgZm9yd2FyZGVkIGRvd25zdHJlYW0gaW1tZWRpYXRlbHkgKi8KKyAgICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChwcml2LT5zcmNwYWQsIGV2ZW50KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCitvdXRfZmxvd19lcnJvcjoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwKKyAgICAgICAgInJlZnVzaW5nIGV2ZW50LCB3ZSBoYXZlIGEgZG93bnN0cmVhbSBmbG93IGVycm9yOiAlcyIsCisgICAgICAgIGdzdF9mbG93X2dldF9uYW1lIChwcml2LT5zcmNyZXN1bHQpKTsKKyAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitvdXRfZW9zOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAicmVmdXNpbmcgZXZlbnQsIHdlIGFyZSBFT1MiKTsKKyAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpbmtfcnRjcF9ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKyAgR3N0UnRwSml0dGVyQnVmZmVyICpqaXR0ZXJidWZmZXI7CisKKyAgaml0dGVyYnVmZmVyID0gR1NUX1JUUF9KSVRURVJfQlVGRkVSIChwYXJlbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInJlY2VpdmVkICVzIiwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVEFSVDoKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggSkJVRl9MT0NLIGhlbGQsIHdpbGwgcmVsZWFzZSB0aGUgTE9DSyB3aGVuIGVtaXRpbmcgdGhlCisgKiBzaWduYWwuIFRoZSBmdW5jdGlvbiByZXR1cm5zIEdTVF9GTE9XX0VSUk9SIHdoZW4gYSBwYXJzaW5nIGVycm9yIGhhcHBlbmVkIGFuZAorICogR1NUX0ZMT1dfRkxVU0hJTkcgd2hlbiB0aGUgZWxlbWVudCBpcyBzaHV0dGluZyBkb3duLiBPbiBzdWNjZXNzCisgKiBHU1RfRkxPV19PSyBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfaml0dGVyX2J1ZmZlcl9nZXRfY2xvY2tfcmF0ZSAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyLAorICAgIGd1aW50OCBwdCkKK3sKKyAgR1ZhbHVlIHJldCA9IHsgMCB9OworICBHVmFsdWUgYXJnc1syXSA9IHsgezB9LCB7MH0gfTsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIGdfdmFsdWVfaW5pdCAoJmFyZ3NbMF0sIEdTVF9UWVBFX0VMRU1FTlQpOworICBnX3ZhbHVlX3NldF9vYmplY3QgKCZhcmdzWzBdLCBqaXR0ZXJidWZmZXIpOworICBnX3ZhbHVlX2luaXQgKCZhcmdzWzFdLCBHX1RZUEVfVUlOVCk7CisgIGdfdmFsdWVfc2V0X3VpbnQgKCZhcmdzWzFdLCBwdCk7CisKKyAgZ192YWx1ZV9pbml0ICgmcmV0LCBHU1RfVFlQRV9DQVBTKTsKKyAgZ192YWx1ZV9zZXRfYm94ZWQgKCZyZXQsIE5VTEwpOworCisgIEpCVUZfVU5MT0NLIChqaXR0ZXJidWZmZXItPnByaXYpOworICBnX3NpZ25hbF9lbWl0diAoYXJncywgZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpZ25hbHNbU0lHTkFMX1JFUVVFU1RfUFRfTUFQXSwgMCwKKyAgICAgICZyZXQpOworICBKQlVGX0xPQ0tfQ0hFQ0sgKGppdHRlcmJ1ZmZlci0+cHJpdiwgb3V0X2ZsdXNoaW5nKTsKKworICBnX3ZhbHVlX3Vuc2V0ICgmYXJnc1swXSk7CisgIGdfdmFsdWVfdW5zZXQgKCZhcmdzWzFdKTsKKyAgY2FwcyA9IChHc3RDYXBzICopIGdfdmFsdWVfZHVwX2JveGVkICgmcmV0KTsKKyAgZ192YWx1ZV91bnNldCAoJnJldCk7CisgIGlmICghY2FwcykKKyAgICBnb3RvIG5vX2NhcHM7CisKKyAgcmVzID0gZ3N0X2ppdHRlcl9idWZmZXJfc2lua19wYXJzZV9jYXBzIChqaXR0ZXJidWZmZXIsIGNhcHMsIHB0KTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGlmIChHX1VOTElLRUxZICghcmVzKSkKKyAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVJST1JTICovCitub19jYXBzOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiY291bGQgbm90IGdldCBjYXBzIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CitvdXRfZmx1c2hpbmc6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJ3ZSBhcmUgZmx1c2hpbmciKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRkxVU0hJTkc7CisgIH0KK3BhcnNlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInBhcnNlIGZhaWxlZCIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCisvKiBjYWxsIHdpdGggamJ1ZiBsb2NrIGhlbGQgKi8KK3N0YXRpYyBHc3RNZXNzYWdlICoKK2NoZWNrX2J1ZmZlcmluZ19wZXJjZW50IChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIsIGdpbnQgcGVyY2VudCkKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZSA9IE5VTEw7CisKKyAgaWYgKHBlcmNlbnQgPT0gLTEpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogUG9zdCBhIGJ1ZmZlcmluZyBtZXNzYWdlICovCisgIGlmIChwcml2LT5sYXN0X3BlcmNlbnQgIT0gcGVyY2VudCkgeworICAgIHByaXYtPmxhc3RfcGVyY2VudCA9IHBlcmNlbnQ7CisgICAgbWVzc2FnZSA9CisgICAgICAgIGdzdF9tZXNzYWdlX25ld19idWZmZXJpbmcgKEdTVF9PQkpFQ1RfQ0FTVCAoaml0dGVyYnVmZmVyKSwgcGVyY2VudCk7CisgICAgZ3N0X21lc3NhZ2Vfc2V0X2J1ZmZlcmluZ19zdGF0cyAobWVzc2FnZSwgR1NUX0JVRkZFUklOR19MSVZFLCAtMSwgLTEsIC0xKTsKKyAgfQorCisgIHJldHVybiBtZXNzYWdlOworfQorCitzdGF0aWMgdm9pZAordXBkYXRlX29mZnNldCAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyKQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2OworCisgIHByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisKKyAgaWYgKHByaXYtPnRzX29mZnNldF9yZW1haW5kZXIgIT0gMCkgeworICAgIEdTVF9ERUJVRyAoImFkanVzdG1lbnQgJSIgR19HVUlOVDY0X0ZPUk1BVCAiIHJlbWFpbiAlIiBHX0dJTlQ2NF9GT1JNQVQKKyAgICAgICAgIiBvZmYgJSIgR19HSU5UNjRfRk9STUFULCBwcml2LT5tYXhfdHNfb2Zmc2V0X2FkanVzdG1lbnQsCisgICAgICAgIHByaXYtPnRzX29mZnNldF9yZW1haW5kZXIsIHByaXYtPnRzX29mZnNldCk7CisgICAgaWYgKEFCUyAocHJpdi0+dHNfb2Zmc2V0X3JlbWFpbmRlcikgPiBwcml2LT5tYXhfdHNfb2Zmc2V0X2FkanVzdG1lbnQpIHsKKyAgICAgIGlmIChwcml2LT50c19vZmZzZXRfcmVtYWluZGVyID4gMCkgeworICAgICAgICBwcml2LT50c19vZmZzZXQgKz0gcHJpdi0+bWF4X3RzX29mZnNldF9hZGp1c3RtZW50OworICAgICAgICBwcml2LT50c19vZmZzZXRfcmVtYWluZGVyIC09IHByaXYtPm1heF90c19vZmZzZXRfYWRqdXN0bWVudDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaXYtPnRzX29mZnNldCAtPSBwcml2LT5tYXhfdHNfb2Zmc2V0X2FkanVzdG1lbnQ7CisgICAgICAgIHByaXYtPnRzX29mZnNldF9yZW1haW5kZXIgKz0gcHJpdi0+bWF4X3RzX29mZnNldF9hZGp1c3RtZW50OworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBwcml2LT50c19vZmZzZXQgKz0gcHJpdi0+dHNfb2Zmc2V0X3JlbWFpbmRlcjsKKyAgICAgIHByaXYtPnRzX29mZnNldF9yZW1haW5kZXIgPSAwOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgR3N0Q2xvY2tUaW1lCithcHBseV9vZmZzZXQgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCkKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIGlmICh0aW1lc3RhbXAgPT0gLTEpCisgICAgcmV0dXJuIC0xOworCisgIC8qIGFwcGx5IHRoZSB0aW1lc3RhbXAgb2Zmc2V0LCB0aGlzIGlzIHVzZWQgZm9yIGludGVyIHN0cmVhbSBzeW5jICovCisgIHRpbWVzdGFtcCArPSBwcml2LT50c19vZmZzZXQ7CisgIC8qIGFkZCB0aGUgb2Zmc2V0LCB0aGlzIGlzIHVzZWQgd2hlbiBidWZmZXJpbmcgKi8KKyAgdGltZXN0YW1wICs9IHByaXYtPm91dF9vZmZzZXQ7CisKKyAgcmV0dXJuIHRpbWVzdGFtcDsKK30KKworc3RhdGljIFRpbWVyUXVldWUgKgordGltZXJfcXVldWVfbmV3ICh2b2lkKQoreworICBUaW1lclF1ZXVlICpxdWV1ZTsKKworICBxdWV1ZSA9IGdfc2xpY2VfbmV3IChUaW1lclF1ZXVlKTsKKyAgcXVldWUtPnRpbWVycyA9IGdfcXVldWVfbmV3ICgpOworICBxdWV1ZS0+aGFzaHRhYmxlID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7CisKKyAgcmV0dXJuIHF1ZXVlOworfQorCitzdGF0aWMgdm9pZAordGltZXJfcXVldWVfZnJlZSAoVGltZXJRdWV1ZSAqIHF1ZXVlKQoreworICBpZiAoIXF1ZXVlKQorICAgIHJldHVybjsKKworICBnX2hhc2hfdGFibGVfZGVzdHJveSAocXVldWUtPmhhc2h0YWJsZSk7CisgIGdfcXVldWVfZnJlZV9mdWxsIChxdWV1ZS0+dGltZXJzLCBnX2ZyZWUpOworICBnX3NsaWNlX2ZyZWUgKFRpbWVyUXVldWUsIHF1ZXVlKTsKK30KKworc3RhdGljIHZvaWQKK3RpbWVyX3F1ZXVlX2FwcGVuZCAoVGltZXJRdWV1ZSAqIHF1ZXVlLCBjb25zdCBUaW1lckRhdGEgKiB0aW1lciwKKyAgICBHc3RDbG9ja1RpbWUgdGltZW91dCwgZ2Jvb2xlYW4gbG9zdCkKK3sKKyAgVGltZXJEYXRhICpjb3B5OworCisgIGNvcHkgPSBnX21lbWR1cCAodGltZXIsIHNpemVvZiAoKnRpbWVyKSk7CisgIGNvcHktPnRpbWVvdXQgPSB0aW1lb3V0OworICBjb3B5LT50eXBlID0gbG9zdCA/IFRJTUVSX1RZUEVfTE9TVCA6IFRJTUVSX1RZUEVfRVhQRUNURUQ7CisgIGNvcHktPmlkeCA9IC0xOworCisgIEdTVF9MT0cgKCJBcHBlbmQgcnR4LXN0YXRzIHRpbWVyICMlZCwgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgY29weS0+c2VxbnVtLCBHU1RfVElNRV9BUkdTIChjb3B5LT50aW1lb3V0KSk7CisgIGdfcXVldWVfcHVzaF90YWlsIChxdWV1ZS0+dGltZXJzLCBjb3B5KTsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAocXVldWUtPmhhc2h0YWJsZSwgR0lOVF9UT19QT0lOVEVSIChjb3B5LT5zZXFudW0pLCBjb3B5KTsKK30KKworc3RhdGljIHZvaWQKK3RpbWVyX3F1ZXVlX2NsZWFyX3VudGlsIChUaW1lclF1ZXVlICogcXVldWUsIEdzdENsb2NrVGltZSB0aW1lb3V0KQoreworICBUaW1lckRhdGEgKnRlc3Q7CisKKyAgdGVzdCA9IGdfcXVldWVfcGVla19oZWFkIChxdWV1ZS0+dGltZXJzKTsKKyAgd2hpbGUgKHRlc3QgJiYgdGVzdC0+dGltZW91dCA8IHRpbWVvdXQpIHsKKyAgICBHU1RfTE9HICgiUG9wIHJ0eC1zdGF0cyB0aW1lciAjJWQsICUiIEdTVF9USU1FX0ZPUk1BVCAiIDwgJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFULCB0ZXN0LT5zZXFudW0sIEdTVF9USU1FX0FSR1MgKHRlc3QtPnRpbWVvdXQpLAorICAgICAgICBHU1RfVElNRV9BUkdTICh0aW1lb3V0KSk7CisgICAgZ19oYXNoX3RhYmxlX3JlbW92ZSAocXVldWUtPmhhc2h0YWJsZSwgR0lOVF9UT19QT0lOVEVSICh0ZXN0LT5zZXFudW0pKTsKKyAgICBnX2ZyZWUgKGdfcXVldWVfcG9wX2hlYWQgKHF1ZXVlLT50aW1lcnMpKTsKKyAgICB0ZXN0ID0gZ19xdWV1ZV9wZWVrX2hlYWQgKHF1ZXVlLT50aW1lcnMpOworICB9Cit9CisKK3N0YXRpYyBUaW1lckRhdGEgKgordGltZXJfcXVldWVfZmluZCAoVGltZXJRdWV1ZSAqIHF1ZXVlLCBndWludDE2IHNlcW51bSkKK3sKKyAgcmV0dXJuIGdfaGFzaF90YWJsZV9sb29rdXAgKHF1ZXVlLT5oYXNodGFibGUsIEdJTlRfVE9fUE9JTlRFUiAoc2VxbnVtKSk7Cit9CisKK3N0YXRpYyBUaW1lckRhdGEgKgorZmluZF90aW1lciAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyLCBndWludDE2IHNlcW51bSkKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKyAgVGltZXJEYXRhICp0aW1lciA9IE5VTEw7CisgIGdpbnQgaSwgbGVuOworCisgIGxlbiA9IHByaXYtPnRpbWVycy0+bGVuOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBUaW1lckRhdGEgKnRlc3QgPSAmZ19hcnJheV9pbmRleCAocHJpdi0+dGltZXJzLCBUaW1lckRhdGEsIGkpOworICAgIGlmICh0ZXN0LT5zZXFudW0gPT0gc2VxbnVtKSB7CisgICAgICB0aW1lciA9IHRlc3Q7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRpbWVyOworfQorCitzdGF0aWMgdm9pZAordW5zY2hlZHVsZV9jdXJyZW50X3RpbWVyIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisKKyAgaWYgKHByaXYtPmNsb2NrX2lkKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAidW5zY2hlZHVsZSBjdXJyZW50IHRpbWVyIik7CisgICAgZ3N0X2Nsb2NrX2lkX3Vuc2NoZWR1bGUgKHByaXYtPmNsb2NrX2lkKTsKKyAgICBwcml2LT5jbG9ja19pZCA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIEdzdENsb2NrVGltZQorZ2V0X3RpbWVvdXQgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgVGltZXJEYXRhICogdGltZXIpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisgIEdzdENsb2NrVGltZSB0ZXN0X3RpbWVvdXQ7CisKKyAgaWYgKCh0ZXN0X3RpbWVvdXQgPSB0aW1lci0+dGltZW91dCkgPT0gLTEpCisgICAgcmV0dXJuIC0xOworCisgIGlmICh0aW1lci0+dHlwZSAhPSBUSU1FUl9UWVBFX0VYUEVDVEVEKSB7CisgICAgLyogYWRkIG91ciBsYXRlbmN5IGFuZCBvZmZzZXQgdG8gZ2V0IG91dHB1dCB0aW1lcy4gKi8KKyAgICB0ZXN0X3RpbWVvdXQgPSBhcHBseV9vZmZzZXQgKGppdHRlcmJ1ZmZlciwgdGVzdF90aW1lb3V0KTsKKyAgICB0ZXN0X3RpbWVvdXQgKz0gcHJpdi0+bGF0ZW5jeV9uczsKKyAgfQorICByZXR1cm4gdGVzdF90aW1lb3V0OworfQorCitzdGF0aWMgdm9pZAorcmVjYWxjdWxhdGVfdGltZXIgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgVGltZXJEYXRhICogdGltZXIpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisKKyAgaWYgKHByaXYtPmNsb2NrX2lkKSB7CisgICAgR3N0Q2xvY2tUaW1lIHRpbWVvdXQgPSBnZXRfdGltZW91dCAoaml0dGVyYnVmZmVyLCB0aW1lcik7CisKKyAgICBHU1RfREVCVUcgKCIlIiBHU1RfVElNRV9GT1JNQVQgIiA8PiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVvdXQpLCBHU1RfVElNRV9BUkdTIChwcml2LT50aW1lcl90aW1lb3V0KSk7CisKKyAgICBpZiAodGltZW91dCA9PSAtMSB8fCB0aW1lb3V0IDwgcHJpdi0+dGltZXJfdGltZW91dCkKKyAgICAgIHVuc2NoZWR1bGVfY3VycmVudF90aW1lciAoaml0dGVyYnVmZmVyKTsKKyAgfQorfQorCitzdGF0aWMgVGltZXJEYXRhICoKK2FkZF90aW1lciAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyLCBUaW1lclR5cGUgdHlwZSwKKyAgICBndWludDE2IHNlcW51bSwgZ3VpbnQgbnVtLCBHc3RDbG9ja1RpbWUgdGltZW91dCwgR3N0Q2xvY2tUaW1lIGRlbGF5LAorICAgIEdzdENsb2NrVGltZSBkdXJhdGlvbikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKyAgVGltZXJEYXRhICp0aW1lcjsKKyAgZ2ludCBsZW47CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLAorICAgICAgImFkZCB0aW1lciAlZCBmb3Igc2VxbnVtICVkIHRvICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBkZWxheSAlIgorICAgICAgR1NUX1RJTUVfRk9STUFULCB0eXBlLCBzZXFudW0sIEdTVF9USU1FX0FSR1MgKHRpbWVvdXQpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoZGVsYXkpKTsKKworICBsZW4gPSBwcml2LT50aW1lcnMtPmxlbjsKKyAgZ19hcnJheV9zZXRfc2l6ZSAocHJpdi0+dGltZXJzLCBsZW4gKyAxKTsKKyAgdGltZXIgPSAmZ19hcnJheV9pbmRleCAocHJpdi0+dGltZXJzLCBUaW1lckRhdGEsIGxlbik7CisgIHRpbWVyLT5pZHggPSBsZW47CisgIHRpbWVyLT50eXBlID0gdHlwZTsKKyAgdGltZXItPnNlcW51bSA9IHNlcW51bTsKKyAgdGltZXItPm51bSA9IG51bTsKKyAgdGltZXItPnRpbWVvdXQgPSB0aW1lb3V0ICsgZGVsYXk7CisgIHRpbWVyLT5kdXJhdGlvbiA9IGR1cmF0aW9uOworICBpZiAodHlwZSA9PSBUSU1FUl9UWVBFX0VYUEVDVEVEKSB7CisgICAgdGltZXItPnJ0eF9iYXNlID0gdGltZW91dDsKKyAgICB0aW1lci0+cnR4X2RlbGF5ID0gZGVsYXk7CisgICAgdGltZXItPnJ0eF9yZXRyeSA9IDA7CisgIH0KKyAgdGltZXItPnJ0eF9sYXN0ID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgdGltZXItPm51bV9ydHhfcmV0cnkgPSAwOworICB0aW1lci0+bnVtX3J0eF9yZWNlaXZlZCA9IDA7CisgIHJlY2FsY3VsYXRlX3RpbWVyIChqaXR0ZXJidWZmZXIsIHRpbWVyKTsKKyAgSkJVRl9TSUdOQUxfVElNRVIgKHByaXYpOworCisgIHJldHVybiB0aW1lcjsKK30KKworc3RhdGljIHZvaWQKK3Jlc2NoZWR1bGVfdGltZXIgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgVGltZXJEYXRhICogdGltZXIsCisgICAgZ3VpbnQxNiBzZXFudW0sIEdzdENsb2NrVGltZSB0aW1lb3V0LCBHc3RDbG9ja1RpbWUgZGVsYXksIGdib29sZWFuIHJlc2V0KQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworICBnYm9vbGVhbiBzZXFjaGFuZ2UsIHRpbWVjaGFuZ2U7CisgIGd1aW50MTYgb2xkc2VxOworICBHc3RDbG9ja1RpbWUgbmV3X3RpbWVvdXQ7CisKKyAgb2xkc2VxID0gdGltZXItPnNlcW51bTsKKyAgbmV3X3RpbWVvdXQgPSB0aW1lb3V0ICsgZGVsYXk7CisgIHNlcWNoYW5nZSA9IG9sZHNlcSAhPSBzZXFudW07CisgIHRpbWVjaGFuZ2UgPSB0aW1lci0+dGltZW91dCAhPSBuZXdfdGltZW91dDsKKworICBpZiAoIXNlcWNoYW5nZSAmJiAhdGltZWNoYW5nZSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwKKyAgICAgICAgIk5vIGNoYW5nZXMgaW4gc2VxbnVtICglZCkgYW5kIHRpbWVvdXQgKCUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAiKSwgc2tpcHBpbmciLCBvbGRzZXEsIEdTVF9USU1FX0FSR1MgKHRpbWVyLT50aW1lb3V0KSk7CisgICAgcmV0dXJuOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLAorICAgICAgInJlcGxhY2UgdGltZXIgJWQgZm9yIHNlcW51bSAlZC0+JWQgdGltZW91dCAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICItPiUiIEdTVF9USU1FX0ZPUk1BVCwgdGltZXItPnR5cGUsIG9sZHNlcSwgc2VxbnVtLAorICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXItPnRpbWVvdXQpLCBHU1RfVElNRV9BUkdTIChuZXdfdGltZW91dCkpOworCisgIHRpbWVyLT50aW1lb3V0ID0gbmV3X3RpbWVvdXQ7CisgIHRpbWVyLT5zZXFudW0gPSBzZXFudW07CisgIGlmIChyZXNldCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInJlc2V0IHJ0eCBkZWxheSAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgIi0+JSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTICh0aW1lci0+cnR4X2RlbGF5KSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoZGVsYXkpKTsKKyAgICB0aW1lci0+cnR4X2Jhc2UgPSB0aW1lb3V0OworICAgIHRpbWVyLT5ydHhfZGVsYXkgPSBkZWxheTsKKyAgICB0aW1lci0+cnR4X3JldHJ5ID0gMDsKKyAgfQorICBpZiAoc2VxY2hhbmdlKSB7CisgICAgdGltZXItPm51bV9ydHhfcmV0cnkgPSAwOworICAgIHRpbWVyLT5udW1fcnR4X3JlY2VpdmVkID0gMDsKKyAgfQorCisgIGlmIChwcml2LT5jbG9ja19pZCkgeworICAgIC8qIHdlIGNoYW5nZWQgdGhlIHNlcW51bSBhbmQgdGhlcmUgaXMgYSB0aW1lciBjdXJyZW50bHkgd2FpdGluZyB3aXRoIHRoaXMKKyAgICAgKiBzZXFudW0sIHVuc2NoZWR1bGUgaXQgKi8KKyAgICBpZiAoc2VxY2hhbmdlICYmIHByaXYtPnRpbWVyX3NlcW51bSA9PSBvbGRzZXEpCisgICAgICB1bnNjaGVkdWxlX2N1cnJlbnRfdGltZXIgKGppdHRlcmJ1ZmZlcik7CisgICAgLyogd2UgY2hhbmdlZCB0aGUgdGltZSwgY2hlY2sgaWYgaXQgaXMgZWFybGllciB0aGFuIHdoYXQgd2UgYXJlIHdhaXRpbmcKKyAgICAgKiBmb3IgYW5kIHVuc2NoZWR1bGUgaWYgc28gKi8KKyAgICBlbHNlIGlmICh0aW1lY2hhbmdlKQorICAgICAgcmVjYWxjdWxhdGVfdGltZXIgKGppdHRlcmJ1ZmZlciwgdGltZXIpOworICB9Cit9CisKK3N0YXRpYyBUaW1lckRhdGEgKgorc2V0X3RpbWVyIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIsIFRpbWVyVHlwZSB0eXBlLAorICAgIGd1aW50MTYgc2VxbnVtLCBHc3RDbG9ja1RpbWUgdGltZW91dCkKK3sKKyAgVGltZXJEYXRhICp0aW1lcjsKKworICAvKiBmaW5kIHRoZSBzZXFudW0gdGltZXIgKi8KKyAgdGltZXIgPSBmaW5kX3RpbWVyIChqaXR0ZXJidWZmZXIsIHNlcW51bSk7CisgIGlmICh0aW1lciA9PSBOVUxMKSB7CisgICAgdGltZXIgPSBhZGRfdGltZXIgKGppdHRlcmJ1ZmZlciwgdHlwZSwgc2VxbnVtLCAwLCB0aW1lb3V0LCAwLCAtMSk7CisgIH0gZWxzZSB7CisgICAgcmVzY2hlZHVsZV90aW1lciAoaml0dGVyYnVmZmVyLCB0aW1lciwgc2VxbnVtLCB0aW1lb3V0LCAwLCBGQUxTRSk7CisgIH0KKyAgcmV0dXJuIHRpbWVyOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX3RpbWVyIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIsIFRpbWVyRGF0YSAqIHRpbWVyKQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworICBndWludCBpZHg7CisKKyAgaWYgKHRpbWVyLT5pZHggPT0gLTEpCisgICAgcmV0dXJuOworCisgIGlmIChwcml2LT5jbG9ja19pZCAmJiBwcml2LT50aW1lcl9zZXFudW0gPT0gdGltZXItPnNlcW51bSkKKyAgICB1bnNjaGVkdWxlX2N1cnJlbnRfdGltZXIgKGppdHRlcmJ1ZmZlcik7CisKKyAgaWR4ID0gdGltZXItPmlkeDsKKyAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAicmVtb3ZlZCBpbmRleCAlZCIsIGlkeCk7CisgIGdfYXJyYXlfcmVtb3ZlX2luZGV4X2Zhc3QgKHByaXYtPnRpbWVycywgaWR4KTsKKyAgdGltZXItPmlkeCA9IGlkeDsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9hbGxfdGltZXJzIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInJlbW92ZWQgYWxsIHRpbWVycyIpOworICBnX2FycmF5X3NldF9zaXplIChwcml2LT50aW1lcnMsIDApOworICB1bnNjaGVkdWxlX2N1cnJlbnRfdGltZXIgKGppdHRlcmJ1ZmZlcik7Cit9CisKKy8qIGdldCB0aGUgZXh0cmEgZGVsYXkgdG8gd2FpdCBiZWZvcmUgc2VuZGluZyBSVFggKi8KK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2dldF9ydHhfZGVsYXkgKEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKiBwcml2KQoreworICBHc3RDbG9ja1RpbWUgZGVsYXk7CisKKyAgaWYgKHByaXYtPnJ0eF9kZWxheSA9PSAtMSkgeworICAgIGlmIChwcml2LT5hdmdfaml0dGVyID09IDAgJiYgcHJpdi0+cGFja2V0X3NwYWNpbmcgPT0gMCkgeworICAgICAgZGVsYXkgPSBERUZBVUxUX0FVVE9fUlRYX0RFTEFZOworICAgIH0gZWxzZSB7CisgICAgICAvKiBqaXR0ZXIgaXMgaW4gbmFub3NlY29uZHMsIG1heGltdW0gb2YgMnggaml0dGVyIGFuZCBoYWxmIHRoZQorICAgICAgICogcGFja2V0IHNwYWNpbmcgaXMgYSBnb29kIG1hcmdpbiAqLworICAgICAgZGVsYXkgPSBNQVggKHByaXYtPmF2Z19qaXR0ZXIgKiAyLCBwcml2LT5wYWNrZXRfc3BhY2luZyAvIDIpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBkZWxheSA9IHByaXYtPnJ0eF9kZWxheSAqIEdTVF9NU0VDT05EOworICB9CisgIGlmIChwcml2LT5ydHhfbWluX2RlbGF5ID4gMCkKKyAgICBkZWxheSA9IE1BWCAoZGVsYXksIHByaXYtPnJ0eF9taW5fZGVsYXkgKiBHU1RfTVNFQ09ORCk7CisKKyAgcmV0dXJuIGRlbGF5OworfQorCisvKiBDaGVjayBpZiBwYWNrZXQgd2l0aCBzZXFudW0gaXMgYWxyZWFkeSBjb25zaWRlcmVkIGRlZmluaXRlbHkgbG9zdCBieSBiZWluZworICogcGFydCBvZiBhICJsb3N0IHRpbWVyIiBmb3IgbXVsdGlwbGUgcGFja2V0cyAqLworc3RhdGljIGdib29sZWFuCithbHJlYWR5X2xvc3QgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgZ3VpbnQxNiBzZXFudW0pCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisgIGdpbnQgaSwgbGVuOworCisgIGxlbiA9IHByaXYtPnRpbWVycy0+bGVuOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBUaW1lckRhdGEgKnRlc3QgPSAmZ19hcnJheV9pbmRleCAocHJpdi0+dGltZXJzLCBUaW1lckRhdGEsIGkpOworICAgIGdpbnQgZ2FwID0gZ3N0X3J0cF9idWZmZXJfY29tcGFyZV9zZXFudW0gKHRlc3QtPnNlcW51bSwgc2VxbnVtKTsKKworICAgIGlmICh0ZXN0LT5udW0gPiAxICYmIHRlc3QtPnR5cGUgPT0gVElNRVJfVFlQRV9MT1NUICYmIGdhcCA+PSAwICYmCisgICAgICAgIGdhcCA8IHRlc3QtPm51bSkgeworICAgICAgR1NUX0RFQlVHICgic2VxbnVtICMlZCBhbHJlYWR5IGNvbnNpZGVyZWQgZGVmaW5pdGVseSBsb3N0ICgjJWQtPiMlZCkiLAorICAgICAgICAgIHNlcW51bSwgdGVzdC0+c2VxbnVtLCAodGVzdC0+c2VxbnVtICsgdGVzdC0+bnVtIC0gMSkgJiAweGZmZmYpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiB3ZSBqdXN0IHJlY2VpdmVkIGEgcGFja2V0IHdpdGggc2VxbnVtIGFuZCBkdHMuCisgKgorICogRmlyc3QgY2hlY2sgZm9yIG9sZCBzZXFudW0gdGhhdCB3ZSBhcmUgc3RpbGwgZXhwZWN0aW5nLiBJZiB0aGUgZ2FwIHdpdGggdGhlCisgKiBjdXJyZW50IHNlcW51bSBpcyB0b28gYmlnLCB1bnNjaGVkdWxlIHRoZSB0aW1lb3V0cy4KKyAqCisgKiBJZiB3ZSBoYXZlIGEgdmFsaWQgcGFja2V0IHNwYWNpbmcgZXN0aW1hdGUgd2UgY2FuIHNldCBhIHRpbWVyIGZvciB3aGVuIHdlCisgKiBzaG91bGQgcmVjZWl2ZSB0aGUgbmV4dCBwYWNrZXQuCisgKiBJZiB3ZSBkb24ndCBoYXZlIGEgdmFsaWQgZXN0aW1hdGUsIHdlIHJlbW92ZSBhbnkgdGltZXIgd2UgbWlnaHQgaGF2ZQorICogaGFkIGZvciB0aGlzIHBhY2tldC4KKyAqLworc3RhdGljIHZvaWQKK3VwZGF0ZV90aW1lcnMgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgZ3VpbnQxNiBzZXFudW0sCisgICAgR3N0Q2xvY2tUaW1lIGR0cywgR3N0Q2xvY2tUaW1lIHB0cywgZ2Jvb2xlYW4gZG9fbmV4dF9zZXFudW0sCisgICAgZ2Jvb2xlYW4gaXNfcnR4LCBUaW1lckRhdGEgKiB0aW1lcikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICAvKiBnbyB0aHJvdWdoIGFsbCB0aW1lcnMgYW5kIHVuc2NoZWR1bGUgdGhlIG9uZXMgd2l0aCBhIGxhcmdlIGdhcCAqLworICBpZiAocHJpdi0+ZG9fcmV0cmFuc21pc3Npb24gJiYgcHJpdi0+cnR4X2RlbGF5X3Jlb3JkZXIgPiAwKSB7CisgICAgZ2ludCBpLCBsZW47CisgICAgbGVuID0gcHJpdi0+dGltZXJzLT5sZW47CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBUaW1lckRhdGEgKnRlc3QgPSAmZ19hcnJheV9pbmRleCAocHJpdi0+dGltZXJzLCBUaW1lckRhdGEsIGkpOworICAgICAgZ2ludCBnYXA7CisKKyAgICAgIGdhcCA9IGdzdF9ydHBfYnVmZmVyX2NvbXBhcmVfc2VxbnVtICh0ZXN0LT5zZXFudW0sIHNlcW51bSk7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIiVkLCAjJWQ8LT4jJWQgZ2FwICVkIiwKKyAgICAgICAgICB0ZXN0LT50eXBlLCB0ZXN0LT5zZXFudW0sIHNlcW51bSwgZ2FwKTsKKworICAgICAgaWYgKGdhcCA+IHByaXYtPnJ0eF9kZWxheV9yZW9yZGVyKSB7CisgICAgICAgIC8qIG1heCBnYXAsIHdlIGV4Y2VlZGVkIHRoZSBtYXggcmVvcmRlciBkaXN0YW5jZSBhbmQgd2UgZG9uJ3QgZXhwZWN0IHRoZQorICAgICAgICAgKiBtaXNzaW5nIHBhY2tldCB0byBiZSB0aGlzIHJlb3JkZXJlZCAqLworICAgICAgICBpZiAodGVzdC0+bnVtX3J0eF9yZXRyeSA9PSAwICYmIHRlc3QtPnR5cGUgPT0gVElNRVJfVFlQRV9FWFBFQ1RFRCkKKyAgICAgICAgICByZXNjaGVkdWxlX3RpbWVyIChqaXR0ZXJidWZmZXIsIHRlc3QsIHRlc3QtPnNlcW51bSwgLTEsIDAsIEZBTFNFKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBkb19uZXh0X3NlcW51bSA9IGRvX25leHRfc2VxbnVtICYmIHByaXYtPnBhY2tldF9zcGFjaW5nID4gMAorICAgICAgJiYgcHJpdi0+ZG9fcmV0cmFuc21pc3Npb24gJiYgcHJpdi0+cnR4X25leHRfc2VxbnVtOworCisgIGlmICh0aW1lciAmJiB0aW1lci0+dHlwZSAhPSBUSU1FUl9UWVBFX0RFQURMSU5FKSB7CisgICAgaWYgKHRpbWVyLT5udW1fcnR4X3JldHJ5ID4gMCkgeworICAgICAgaWYgKGlzX3J0eCkgeworICAgICAgICB1cGRhdGVfcnR4X3N0YXRzIChqaXR0ZXJidWZmZXIsIHRpbWVyLCBkdHMsIFRSVUUpOworICAgICAgICAvKiBkb24ndCB0cnkgdG8gZXN0aW1hdGUgdGhlIG5leHQgc2VxbnVtIGJlY2F1c2UgdGhpcyBpcyBhIHJldHJhbnNtaXR0ZWQKKyAgICAgICAgICogcGFja2V0IGFuZCBpdCBwcm9iYWJseSBkaWQgbm90IGFycml2ZSB3aXRoIHRoZSBleHBlY3RlZCBwYWNrZXQKKyAgICAgICAgICogc3BhY2luZy4gKi8KKyAgICAgICAgZG9fbmV4dF9zZXFudW0gPSBGQUxTRTsKKyAgICAgIH0KKworICAgICAgaWYgKCFpc19ydHggfHwgdGltZXItPm51bV9ydHhfcmV0cnkgPiAxKSB7CisgICAgICAgIC8qIFN0b3JlIHRpbWVyIGluIG9yZGVyIHRvIHJlY29yZCBzdGF0cyB3aGVuL2lmIHRoZSByZXRyYW5zbWl0dGVkCisgICAgICAgICAqIHBhY2tldCBhcnJpdmVzLiBXZSBzaG91bGQgYWxzbyBzdG9yZSB0aW1lciBpbmZvcm1hdGlvbiBpZiB3ZSd2ZQorICAgICAgICAgKiByZXF1ZXN0ZWQgcmV0cmFuc21pc3Npb24gbW9yZSB0aGFuIG9uY2Ugc2luY2Ugd2UgbWF5IHJlY2VpdmUKKyAgICAgICAgICogc2V2ZXJhbCByZXRyYW5zbWl0dGVkIHBhY2tldHMuIEZvciBhY2N1cmFjeSB3ZSBzaG91bGQgdXBkYXRlIHRoZQorICAgICAgICAgKiBzdGF0cyBhbHNvIHdoZW4gdGhlIHJlZHVuZGFudCByZXRyYW5zbWl0dGVkIHBhY2tldHMgYXJyaXZlcy4gKi8KKyAgICAgICAgdGltZXJfcXVldWVfYXBwZW5kIChwcml2LT5ydHhfc3RhdHNfdGltZXJzLCB0aW1lciwKKyAgICAgICAgICAgIHB0cyArIHByaXYtPnJ0eF9zdGF0c190aW1lb3V0ICogR1NUX01TRUNPTkQsIEZBTFNFKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoZG9fbmV4dF9zZXFudW0gJiYgcHRzICE9IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICBHc3RDbG9ja1RpbWUgZXhwZWN0ZWQsIGRlbGF5OworCisgICAgLyogY2FsY3VsYXRlIGV4cGVjdGVkIGFycml2YWwgdGltZSBvZiB0aGUgbmV4dCBzZXFudW0gKi8KKyAgICBleHBlY3RlZCA9IHB0cyArIHByaXYtPnBhY2tldF9zcGFjaW5nOworCisgICAgZGVsYXkgPSBnZXRfcnR4X2RlbGF5IChwcml2KTsKKworICAgIC8qIGFuZCB1cGRhdGUvaW5zdGFsbCB0aW1lciBmb3IgbmV4dCBzZXFudW0gKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJBZGQgUlRYIHRpbWVyICMlZCwgZXhwZWN0ZWQgJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFUICIsIGRlbGF5ICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBwYWNrZXQtc3BhY2luZyAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiwgaml0dGVyICUiIEdTVF9USU1FX0ZPUk1BVCwgcHJpdi0+bmV4dF9pbl9zZXFudW0sCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGV4cGVjdGVkKSwgR1NUX1RJTUVfQVJHUyAoZGVsYXkpLAorICAgICAgICBHU1RfVElNRV9BUkdTIChwcml2LT5wYWNrZXRfc3BhY2luZyksIEdTVF9USU1FX0FSR1MgKHByaXYtPmF2Z19qaXR0ZXIpKTsKKworICAgIGlmICh0aW1lcikgeworICAgICAgdGltZXItPnR5cGUgPSBUSU1FUl9UWVBFX0VYUEVDVEVEOworICAgICAgcmVzY2hlZHVsZV90aW1lciAoaml0dGVyYnVmZmVyLCB0aW1lciwgcHJpdi0+bmV4dF9pbl9zZXFudW0sIGV4cGVjdGVkLAorICAgICAgICAgIGRlbGF5LCBUUlVFKTsKKyAgICB9IGVsc2UgeworICAgICAgYWRkX3RpbWVyIChqaXR0ZXJidWZmZXIsIFRJTUVSX1RZUEVfRVhQRUNURUQsIHByaXYtPm5leHRfaW5fc2VxbnVtLCAwLAorICAgICAgICAgIGV4cGVjdGVkLCBkZWxheSwgcHJpdi0+cGFja2V0X3NwYWNpbmcpOworICAgIH0KKyAgfSBlbHNlIGlmICh0aW1lciAmJiB0aW1lci0+dHlwZSAhPSBUSU1FUl9UWVBFX0RFQURMSU5FKSB7CisgICAgLyogaWYgd2UgaGFkIGEgdGltZXIsIHJlbW92ZSBpdCwgd2UgZG9uJ3Qga25vdyB3aGVuIHRvIGV4cGVjdCB0aGUgbmV4dAorICAgICAqIHBhY2tldC4gKi8KKyAgICByZW1vdmVfdGltZXIgKGppdHRlcmJ1ZmZlciwgdGltZXIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjYWxjdWxhdGVfcGFja2V0X3NwYWNpbmcgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgZ3VpbnQzMiBydHB0aW1lLAorICAgIEdzdENsb2NrVGltZSBwdHMpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisKKyAgLyogd2UgbmVlZCBjb25zZWN1dGl2ZSBzZXFudW1zIHdpdGggYSBkaWZmZXJlbnQKKyAgICogcnRwdGltZSB0byBlc3RpbWF0ZSB0aGUgcGFja2V0IHNwYWNpbmcuICovCisgIGlmIChwcml2LT5pcHNfcnRwdGltZSAhPSBydHB0aW1lKSB7CisgICAgLyogcnRwdGltZSBjaGFuZ2VkLCBjaGVjayBwdHMgZGlmZiAqLworICAgIGlmIChwcml2LT5pcHNfcHRzICE9IC0xICYmIHB0cyAhPSAtMSAmJiBwdHMgPiBwcml2LT5pcHNfcHRzKSB7CisgICAgICBHc3RDbG9ja1RpbWUgbmV3X3BhY2tldF9zcGFjaW5nID0gcHRzIC0gcHJpdi0+aXBzX3B0czsKKyAgICAgIEdzdENsb2NrVGltZSBvbGRfcGFja2V0X3NwYWNpbmcgPSBwcml2LT5wYWNrZXRfc3BhY2luZzsKKworICAgICAgLyogQmlhc2VkIHRvd2FyZHMgYmlnZ2VyIHBhY2tldCBzcGFjaW5ncyB0byBwcmV2ZW50CisgICAgICAgKiB0b28gbWFueSB1bm5lZWRlZCByZXRyYW5zbWlzc2lvbiByZXF1ZXN0cyBmb3IgbmV4dAorICAgICAgICogcGFja2V0cyB0aGF0IGp1c3QgYXJyaXZlIGEgbGl0dGxlIGxhdGVyIHRoYW4gd2Ugd291bGQKKyAgICAgICAqIGV4cGVjdCAqLworICAgICAgaWYgKG9sZF9wYWNrZXRfc3BhY2luZyA+IG5ld19wYWNrZXRfc3BhY2luZykKKyAgICAgICAgcHJpdi0+cGFja2V0X3NwYWNpbmcgPQorICAgICAgICAgICAgKG5ld19wYWNrZXRfc3BhY2luZyArIDMgKiBvbGRfcGFja2V0X3NwYWNpbmcpIC8gNDsKKyAgICAgIGVsc2UgaWYgKG9sZF9wYWNrZXRfc3BhY2luZyA+IDApCisgICAgICAgIHByaXYtPnBhY2tldF9zcGFjaW5nID0KKyAgICAgICAgICAgICgzICogbmV3X3BhY2tldF9zcGFjaW5nICsgb2xkX3BhY2tldF9zcGFjaW5nKSAvIDQ7CisgICAgICBlbHNlCisgICAgICAgIHByaXYtPnBhY2tldF9zcGFjaW5nID0gbmV3X3BhY2tldF9zcGFjaW5nOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAgICAgIm5ldyBwYWNrZXQgc3BhY2luZyAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAiIG9sZCBwYWNrZXQgc3BhY2luZyAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAiIGNvbWJpbmVkIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChuZXdfcGFja2V0X3NwYWNpbmcpLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKG9sZF9wYWNrZXRfc3BhY2luZyksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocHJpdi0+cGFja2V0X3NwYWNpbmcpKTsKKyAgICB9CisgICAgcHJpdi0+aXBzX3J0cHRpbWUgPSBydHB0aW1lOworICAgIHByaXYtPmlwc19wdHMgPSBwdHM7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NhbGN1bGF0ZV9leHBlY3RlZCAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyLCBndWludDMyIGV4cGVjdGVkLAorICAgIGd1aW50MTYgc2VxbnVtLCBHc3RDbG9ja1RpbWUgcHRzLCBnaW50IGdhcCkKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKyAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uLCBleHBlY3RlZF9wdHMsIGRlbGF5OworICBUaW1lclR5cGUgdHlwZTsKKyAgZ2Jvb2xlYW4gZXF1aWRpc3RhbnQgPSBwcml2LT5lcXVpZGlzdGFudCA+IDA7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLAorICAgICAgInB0cyAlIiBHU1RfVElNRV9GT1JNQVQgIiwgbGFzdCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChwdHMpLCBHU1RfVElNRV9BUkdTIChwcml2LT5sYXN0X2luX3B0cykpOworCisgIGlmIChwdHMgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiSGF2ZSBubyBQVFMiKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoZXF1aWRpc3RhbnQpIHsKKyAgICBHc3RDbG9ja1RpbWUgdG90YWxfZHVyYXRpb247CisgICAgLyogdGhlIHRvdGFsIGR1cmF0aW9uIHNwYW5uZWQgYnkgdGhlIG1pc3NpbmcgcGFja2V0cyAqLworICAgIGlmIChwdHMgPj0gcHJpdi0+bGFzdF9pbl9wdHMpCisgICAgICB0b3RhbF9kdXJhdGlvbiA9IHB0cyAtIHByaXYtPmxhc3RfaW5fcHRzOworICAgIGVsc2UKKyAgICAgIHRvdGFsX2R1cmF0aW9uID0gMDsKKworICAgIC8qIGludGVycG9sYXRlIGJldHdlZW4gdGhlIGN1cnJlbnQgdGltZSBhbmQgdGhlIGxhc3QgdGltZSBiYXNlZCBvbgorICAgICAqIG51bWJlciBvZiBwYWNrZXRzIHdlIGFyZSBtaXNzaW5nLCB0aGlzIGlzIHRoZSBlc3RpbWF0ZWQgZHVyYXRpb24KKyAgICAgKiBmb3IgdGhlIG1pc3NpbmcgcGFja2V0IGJhc2VkIG9uIGVxdWlkaXN0YW50IHBhY2tldCBzcGFjaW5nLiAqLworICAgIGR1cmF0aW9uID0gdG90YWxfZHVyYXRpb24gLyAoZ2FwICsgMSk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJkdXJhdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGR1cmF0aW9uKSk7CisKKyAgICBpZiAodG90YWxfZHVyYXRpb24gPiBwcml2LT5sYXRlbmN5X25zKSB7CisgICAgICBHc3RDbG9ja1RpbWUgZ2FwX3RpbWU7CisgICAgICBndWludCBsb3N0X3BhY2tldHM7CisKKyAgICAgIGlmIChkdXJhdGlvbiA+IDApIHsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIGdhcF9kdXIgPSBnYXAgKiBkdXJhdGlvbjsKKyAgICAgICAgaWYgKGdhcF9kdXIgPiBwcml2LT5sYXRlbmN5X25zKQorICAgICAgICAgIGdhcF90aW1lID0gZ2FwX2R1ciAtIHByaXYtPmxhdGVuY3lfbnM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBnYXBfdGltZSA9IDA7CisgICAgICAgIGxvc3RfcGFja2V0cyA9IGdhcF90aW1lIC8gZHVyYXRpb247CisgICAgICB9IGVsc2UgeworICAgICAgICBnYXBfdGltZSA9IHRvdGFsX2R1cmF0aW9uIC0gcHJpdi0+bGF0ZW5jeV9uczsKKyAgICAgICAgbG9zdF9wYWNrZXRzID0gZ2FwOworICAgICAgfQorCisgICAgICAvKiB0b28gbWFueSBsb3N0IHBhY2tldHMsIHNvbWUgb2YgdGhlIG1pc3NpbmcgcGFja2V0cyBhcmUgYWxyZWFkeQorICAgICAgICogdG9vIGxhdGUgYW5kIHdlIGNhbiBnZW5lcmF0ZSBsb3N0IHBhY2tldCBldmVudHMgZm9yIHRoZW0uICovCisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwKKyAgICAgICAgICAibG9zdCBwYWNrZXRzICglZCwgIyVkLT4jJWQpIGR1cmF0aW9uIHRvbyBsYXJnZSAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAiID4gJSIgR1NUX1RJTUVfRk9STUFUICIsIGNvbnNpZGVyICV1IGxvc3QgKCUiIEdTVF9USU1FX0ZPUk1BVCAiKSIsCisgICAgICAgICAgZ2FwLCBleHBlY3RlZCwgc2VxbnVtIC0gMSwgR1NUX1RJTUVfQVJHUyAodG90YWxfZHVyYXRpb24pLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHByaXYtPmxhdGVuY3lfbnMpLCBsb3N0X3BhY2tldHMsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZ2FwX3RpbWUpKTsKKworICAgICAgLyogdGhpcyB0aW1lciB3aWxsIGZpcmUgaW1tZWRpYXRlbHkgYW5kIHRoZSBsb3N0IGV2ZW50IHdpbGwgYmUgcHVzaGVkIGZyb20KKyAgICAgICAqIHRoZSB0aW1lciB0aHJlYWQgKi8KKyAgICAgIGlmIChsb3N0X3BhY2tldHMgPiAwKSB7CisgICAgICAgIGFkZF90aW1lciAoaml0dGVyYnVmZmVyLCBUSU1FUl9UWVBFX0xPU1QsIGV4cGVjdGVkLCBsb3N0X3BhY2tldHMsCisgICAgICAgICAgICBwcml2LT5sYXN0X2luX3B0cyArIGR1cmF0aW9uLCAwLCBnYXBfdGltZSk7CisgICAgICAgIGV4cGVjdGVkICs9IGxvc3RfcGFja2V0czsKKyAgICAgICAgcHJpdi0+bGFzdF9pbl9wdHMgKz0gZ2FwX3RpbWU7CisgICAgICB9CisgICAgfQorCisgICAgZXhwZWN0ZWRfcHRzID0gcHJpdi0+bGFzdF9pbl9wdHMgKyBkdXJhdGlvbjsKKyAgfSBlbHNlIHsKKyAgICAvKiBJZiB3ZSBjYW5ub3QgYXNzdW1lIGVxdWlkaXN0YW50IHBhY2tldCBzcGFjaW5nLCB0aGUgb25seSB0aGluZyB3ZSBub3cKKyAgICAgKiBmb3Igc3VyZSBpcyB0aGF0IHRoZSBtaXNzaW5nIHBhY2tldHMgaGF2ZSBleHBlY3RlZCBwdHMgbm90IGxhdGVyIHRoYW4KKyAgICAgKiB0aGUgbGFzdCByZWNlaXZlZCBwdHMuICovCisgICAgZHVyYXRpb24gPSAwOworICAgIGV4cGVjdGVkX3B0cyA9IHB0czsKKyAgfQorCisgIGRlbGF5ID0gMDsKKworICBpZiAocHJpdi0+ZG9fcmV0cmFuc21pc3Npb24pIHsKKyAgICBUaW1lckRhdGEgKnRpbWVyID0gZmluZF90aW1lciAoaml0dGVyYnVmZmVyLCBleHBlY3RlZCk7CisKKyAgICB0eXBlID0gVElNRVJfVFlQRV9FWFBFQ1RFRDsKKyAgICBkZWxheSA9IGdldF9ydHhfZGVsYXkgKHByaXYpOworCisgICAgLyogaWYgd2UgaGFkIGEgdGltZXIgZm9yIHRoZSBmaXJzdCBtaXNzaW5nIHBhY2tldCwgdXBkYXRlIGl0LiAqLworICAgIGlmICh0aW1lciAmJiB0aW1lci0+dHlwZSA9PSBUSU1FUl9UWVBFX0VYUEVDVEVEKSB7CisgICAgICBHc3RDbG9ja1RpbWUgdGltZW91dCA9IHRpbWVyLT50aW1lb3V0OworCisgICAgICB0aW1lci0+ZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgIGlmICh0aW1lb3V0ID4gKGV4cGVjdGVkX3B0cyArIGRlbGF5KSAmJiB0aW1lci0+bnVtX3J0eF9yZXRyeSA9PSAwKSB7CisgICAgICAgIHJlc2NoZWR1bGVfdGltZXIgKGppdHRlcmJ1ZmZlciwgdGltZXIsIHRpbWVyLT5zZXFudW0sIGV4cGVjdGVkX3B0cywKKyAgICAgICAgICAgIGRlbGF5LCBUUlVFKTsKKyAgICAgIH0KKyAgICAgIGV4cGVjdGVkKys7CisgICAgICBleHBlY3RlZF9wdHMgKz0gZHVyYXRpb247CisgICAgfQorICB9IGVsc2UgeworICAgIHR5cGUgPSBUSU1FUl9UWVBFX0xPU1Q7CisgIH0KKworICB3aGlsZSAoZ3N0X3J0cF9idWZmZXJfY29tcGFyZV9zZXFudW0gKGV4cGVjdGVkLCBzZXFudW0pID4gMCkgeworICAgIGFkZF90aW1lciAoaml0dGVyYnVmZmVyLCB0eXBlLCBleHBlY3RlZCwgMCwgZXhwZWN0ZWRfcHRzLCBkZWxheSwgZHVyYXRpb24pOworICAgIGV4cGVjdGVkX3B0cyArPSBkdXJhdGlvbjsKKyAgICBleHBlY3RlZCsrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjYWxjdWxhdGVfaml0dGVyIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIsIEdzdENsb2NrVGltZSBkdHMsCisgICAgZ3VpbnQzMiBydHB0aW1lKQoreworICBnaW50MzIgcnRwZGlmZjsKKyAgR3N0Q2xvY2tUaW1lRGlmZiBkdHNkaWZmLCBydHBkaWZmbnMsIGRpZmY7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXY7CisKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICBpZiAoR19VTkxJS0VMWSAoZHRzID09IEdTVF9DTE9DS19USU1FX05PTkUpIHx8IHByaXYtPmNsb2NrX3JhdGUgPD0gMCkKKyAgICBnb3RvIG5vX3RpbWU7CisKKyAgaWYgKHByaXYtPmxhc3RfZHRzICE9IC0xKQorICAgIGR0c2RpZmYgPSBkdHMgLSBwcml2LT5sYXN0X2R0czsKKyAgZWxzZQorICAgIGR0c2RpZmYgPSAwOworCisgIGlmIChwcml2LT5sYXN0X3J0cHRpbWUgIT0gLTEpCisgICAgcnRwZGlmZiA9IHJ0cHRpbWUgLSAoZ3VpbnQzMikgcHJpdi0+bGFzdF9ydHB0aW1lOworICBlbHNlCisgICAgcnRwZGlmZiA9IDA7CisKKyAgLyogR3Vlc3Mgd2hldGhlciBzdHJlYW0gY3VycmVudGx5IHVzZXMgZXF1aWRpc3RhbnQgcGFja2V0IHNwYWNpbmcuIElmIHdlCisgICAqIG9mdGVuIHNlZSBpZGVudGljYWwgdGltZXN0YW1wcyBpdCBtZWFucyB0aGUgcGFja2V0cyBhcmUgbm90CisgICAqIGVxdWlkaXN0YW50LiAqLworICBpZiAocnRwdGltZSA9PSBwcml2LT5sYXN0X3J0cHRpbWUpCisgICAgcHJpdi0+ZXF1aWRpc3RhbnQgLT0gMjsKKyAgZWxzZQorICAgIHByaXYtPmVxdWlkaXN0YW50ICs9IDE7CisgIHByaXYtPmVxdWlkaXN0YW50ID0gQ0xBTVAgKHByaXYtPmVxdWlkaXN0YW50LCAtNywgNyk7CisKKyAgcHJpdi0+bGFzdF9kdHMgPSBkdHM7CisgIHByaXYtPmxhc3RfcnRwdGltZSA9IHJ0cHRpbWU7CisKKyAgaWYgKHJ0cGRpZmYgPiAwKQorICAgIHJ0cGRpZmZucyA9CisgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHJ0cGRpZmYsIEdTVF9TRUNPTkQsIHByaXYtPmNsb2NrX3JhdGUpOworICBlbHNlCisgICAgcnRwZGlmZm5zID0KKyAgICAgICAgLWdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKC1ydHBkaWZmLCBHU1RfU0VDT05ELCBwcml2LT5jbG9ja19yYXRlKTsKKworICBkaWZmID0gQUJTIChkdHNkaWZmIC0gcnRwZGlmZm5zKTsKKworICAvKiBqaXR0ZXIgaXMgc3RvcmVkIGluIG5hbm9zZWNvbmRzICovCisgIHByaXYtPmF2Z19qaXR0ZXIgPSAoZGlmZiArICgxNSAqIHByaXYtPmF2Z19qaXR0ZXIpKSA+PiA0OworCisgIEdTVF9MT0dfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAiZHRzZGlmZiAlIiBHU1RfVElNRV9GT1JNQVQgIiBydHB0aW1lICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiwgY2xvY2stcmF0ZSAlZCwgZGlmZiAlIiBHU1RfVElNRV9GT1JNQVQgIiwgaml0dGVyOiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChkdHNkaWZmKSwgR1NUX1RJTUVfQVJHUyAocnRwZGlmZm5zKSwgcHJpdi0+Y2xvY2tfcmF0ZSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKGRpZmYpLCBHU1RfVElNRV9BUkdTIChwcml2LT5hdmdfaml0dGVyKSk7CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworbm9fdGltZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwKKyAgICAgICAgIm5vIGR0cyBvciBubyBjbG9jay1yYXRlLCBjYW4ndCBjYWxjdWxhdGUgaml0dGVyIik7CisgICAgcmV0dXJuOworICB9Cit9CisKK3N0YXRpYyBnaW50Citjb21wYXJlX2J1ZmZlcl9zZXFudW0gKEdzdEJ1ZmZlciAqIGEsIEdzdEJ1ZmZlciAqIGIsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0UlRQQnVmZmVyIHJ0cF9hID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKyAgR3N0UlRQQnVmZmVyIHJ0cF9iID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKyAgZ3VpbnQgc2VxX2EsIHNlcV9iOworCisgIGdzdF9ydHBfYnVmZmVyX21hcCAoYSwgR1NUX01BUF9SRUFELCAmcnRwX2EpOworICBzZXFfYSA9IGdzdF9ydHBfYnVmZmVyX2dldF9zZXEgKCZydHBfYSk7CisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwX2EpOworCisgIGdzdF9ydHBfYnVmZmVyX21hcCAoYiwgR1NUX01BUF9SRUFELCAmcnRwX2IpOworICBzZXFfYiA9IGdzdF9ydHBfYnVmZmVyX2dldF9zZXEgKCZydHBfYik7CisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwX2IpOworCisgIHJldHVybiBnc3RfcnRwX2J1ZmZlcl9jb21wYXJlX3NlcW51bSAoc2VxX2IsIHNlcV9hKTsKK30KKworc3RhdGljIGdib29sZWFuCitoYW5kbGVfYmlnX2dhcF9idWZmZXIgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgR3N0QnVmZmVyICogYnVmZmVyLAorICAgIGd1aW50OCBwdCwgZ3VpbnQxNiBzZXFudW0sIGdpbnQgZ2FwLCBndWludCBtYXhfZHJvcG91dCwgZ3VpbnQgbWF4X21pc29yZGVyKQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2OworICBndWludCBnYXBfcGFja2V0c19sZW5ndGg7CisgIGdib29sZWFuIHJlc2V0ID0gRkFMU0U7CisgIGdib29sZWFuIGZ1dHVyZSA9IGdhcCA+IDA7CisKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICBpZiAoKGdhcF9wYWNrZXRzX2xlbmd0aCA9IGdfcXVldWVfZ2V0X2xlbmd0aCAoJnByaXYtPmdhcF9wYWNrZXRzKSkgPiAwKSB7CisgICAgR0xpc3QgKmw7CisgICAgZ3VpbnQzMiBwcmV2X2dhcF9zZXEgPSAtMTsKKyAgICBnYm9vbGVhbiBhbGxfY29uc2VjdXRpdmUgPSBUUlVFOworCisgICAgZ19xdWV1ZV9pbnNlcnRfc29ydGVkICgmcHJpdi0+Z2FwX3BhY2tldHMsIGJ1ZmZlciwKKyAgICAgICAgKEdDb21wYXJlRGF0YUZ1bmMpIGNvbXBhcmVfYnVmZmVyX3NlcW51bSwgTlVMTCk7CisKKyAgICBmb3IgKGwgPSBwcml2LT5nYXBfcGFja2V0cy5oZWFkOyBsOyBsID0gbC0+bmV4dCkgeworICAgICAgR3N0QnVmZmVyICpnYXBfYnVmZmVyID0gbC0+ZGF0YTsKKyAgICAgIEdzdFJUUEJ1ZmZlciBnYXBfcnRwID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKyAgICAgIGd1aW50MzIgZ2FwX3NlcTsKKworICAgICAgZ3N0X3J0cF9idWZmZXJfbWFwIChnYXBfYnVmZmVyLCBHU1RfTUFQX1JFQUQsICZnYXBfcnRwKTsKKworICAgICAgYWxsX2NvbnNlY3V0aXZlID0gKGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3R5cGUgKCZnYXBfcnRwKSA9PSBwdCk7CisKKyAgICAgIGdhcF9zZXEgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfc2VxICgmZ2FwX3J0cCk7CisgICAgICBpZiAocHJldl9nYXBfc2VxID09IC0xKQorICAgICAgICBwcmV2X2dhcF9zZXEgPSBnYXBfc2VxOworICAgICAgZWxzZSBpZiAoZ3N0X3J0cF9idWZmZXJfY29tcGFyZV9zZXFudW0gKGdhcF9zZXEsIHByZXZfZ2FwX3NlcSkgIT0gLTEpCisgICAgICAgIGFsbF9jb25zZWN1dGl2ZSA9IEZBTFNFOworICAgICAgZWxzZQorICAgICAgICBwcmV2X2dhcF9zZXEgPSBnYXBfc2VxOworCisgICAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJmdhcF9ydHApOworICAgICAgaWYgKCFhbGxfY29uc2VjdXRpdmUpCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChhbGxfY29uc2VjdXRpdmUgJiYgZ2FwX3BhY2tldHNfbGVuZ3RoID4gMykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLAorICAgICAgICAgICJidWZmZXIgdG9vICVzICVkIDwgJWQsIGdvdCA1IGNvbnNlY3V0aXZlIG9uZXMgLSByZXNldCIsCisgICAgICAgICAgKGZ1dHVyZSA/ICJuZXciIDogIm9sZCIpLCBnYXAsCisgICAgICAgICAgKGZ1dHVyZSA/IG1heF9kcm9wb3V0IDogLW1heF9taXNvcmRlcikpOworICAgICAgcmVzZXQgPSBUUlVFOworICAgIH0gZWxzZSBpZiAoIWFsbF9jb25zZWN1dGl2ZSkgeworICAgICAgZ19xdWV1ZV9mb3JlYWNoICgmcHJpdi0+Z2FwX3BhY2tldHMsIChHRnVuYykgZ3N0X2J1ZmZlcl91bnJlZiwgTlVMTCk7CisgICAgICBnX3F1ZXVlX2NsZWFyICgmcHJpdi0+Z2FwX3BhY2tldHMpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLAorICAgICAgICAgICJidWZmZXIgdG9vICVzICVkIDwgJWQsIGdvdCBubyA1IGNvbnNlY3V0aXZlIG9uZXMgLSBkcm9wcGluZyIsCisgICAgICAgICAgKGZ1dHVyZSA/ICJuZXciIDogIm9sZCIpLCBnYXAsCisgICAgICAgICAgKGZ1dHVyZSA/IG1heF9kcm9wb3V0IDogLW1heF9taXNvcmRlcikpOworICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLAorICAgICAgICAgICJidWZmZXIgdG9vICVzICVkIDwgJWQsIGdvdCAldSBjb25zZWN1dGl2ZSBvbmVzIC0gd2FpdGluZyIsCisgICAgICAgICAgKGZ1dHVyZSA/ICJuZXciIDogIm9sZCIpLCBnYXAsCisgICAgICAgICAgKGZ1dHVyZSA/IG1heF9kcm9wb3V0IDogLW1heF9taXNvcmRlciksIGdhcF9wYWNrZXRzX2xlbmd0aCArIDEpOworICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLAorICAgICAgICAiYnVmZmVyIHRvbyAlcyAlZCA8ICVkLCBmaXJzdCBvbmUgLSB3YWl0aW5nIiwgKGZ1dHVyZSA/ICJuZXciIDogIm9sZCIpLAorICAgICAgICBnYXAsIC1tYXhfbWlzb3JkZXIpOworICAgIGdfcXVldWVfcHVzaF90YWlsICgmcHJpdi0+Z2FwX3BhY2tldHMsIGJ1ZmZlcik7CisgICAgYnVmZmVyID0gTlVMTDsKKyAgfQorCisgIHJldHVybiByZXNldDsKK30KKworc3RhdGljIEdzdENsb2NrVGltZQorZ2V0X2N1cnJlbnRfcnVubmluZ190aW1lIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIpCit7CisgIEdzdENsb2NrICpjbG9jayA9IGdzdF9lbGVtZW50X2dldF9jbG9jayAoR1NUX0VMRU1FTlRfQ0FTVCAoaml0dGVyYnVmZmVyKSk7CisgIEdzdENsb2NrVGltZSBydW5uaW5nX3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIGlmIChjbG9jaykgeworICAgIEdzdENsb2NrVGltZSBiYXNlX3RpbWUgPQorICAgICAgICBnc3RfZWxlbWVudF9nZXRfYmFzZV90aW1lIChHU1RfRUxFTUVOVF9DQVNUIChqaXR0ZXJidWZmZXIpKTsKKyAgICBHc3RDbG9ja1RpbWUgY2xvY2tfdGltZSA9IGdzdF9jbG9ja19nZXRfdGltZSAoY2xvY2spOworCisgICAgaWYgKGNsb2NrX3RpbWUgPiBiYXNlX3RpbWUpCisgICAgICBydW5uaW5nX3RpbWUgPSBjbG9ja190aW1lIC0gYmFzZV90aW1lOworICAgIGVsc2UKKyAgICAgIHJ1bm5pbmdfdGltZSA9IDA7CisKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChjbG9jayk7CisgIH0KKworICByZXR1cm4gcnVubmluZ190aW1lOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3Jlc2V0IChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIsCisgICAgR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIGd1aW50MTYgc2VxbnVtKQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHTGlzdCAqZXZlbnRzID0gTlVMTCwgKmw7CisgIEdMaXN0ICpidWZmZXJzOworICBnYm9vbGVhbiBoZWFkOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgImZsdXNoIGFuZCByZXNldCBqaXR0ZXJidWZmZXIiKTsKKyAgcnRwX2ppdHRlcl9idWZmZXJfZmx1c2ggKHByaXYtPmpidWYsCisgICAgICAoR0Z1bmMpIGZyZWVfaXRlbV9hbmRfcmV0YWluX2V2ZW50cywgJmV2ZW50cyk7CisgIHJ0cF9qaXR0ZXJfYnVmZmVyX3Jlc2V0X3NrZXcgKHByaXYtPmpidWYpOworICByZW1vdmVfYWxsX3RpbWVycyAoaml0dGVyYnVmZmVyKTsKKyAgcHJpdi0+ZGlzY29udCA9IFRSVUU7CisgIHByaXYtPmxhc3RfcG9wcGVkX3NlcW51bSA9IC0xOworCisgIGlmIChwcml2LT5nYXBfcGFja2V0cy5oZWFkKSB7CisgICAgR3N0QnVmZmVyICpnYXBfYnVmZmVyID0gcHJpdi0+Z2FwX3BhY2tldHMuaGVhZC0+ZGF0YTsKKyAgICBHc3RSVFBCdWZmZXIgZ2FwX3J0cCA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisKKyAgICBnc3RfcnRwX2J1ZmZlcl9tYXAgKGdhcF9idWZmZXIsIEdTVF9NQVBfUkVBRCwgJmdhcF9ydHApOworICAgIHByaXYtPm5leHRfc2VxbnVtID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3NlcSAoJmdhcF9ydHApOworICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmZ2FwX3J0cCk7CisgIH0gZWxzZSB7CisgICAgcHJpdi0+bmV4dF9zZXFudW0gPSBzZXFudW07CisgIH0KKworICBwcml2LT5sYXN0X2luX3B0cyA9IC0xOworICBwcml2LT5uZXh0X2luX3NlcW51bSA9IC0xOworCisgIC8qIEluc2VydCBhbGwgc3RpY2t5IGV2ZW50cyBhZ2FpbiBpbiBvcmRlciwgb3RoZXJ3aXNlIHdlIHdvdWxkCisgICAqIHBvdGVudGlhbGx5IGxvb3NlIFNUUkVBTV9TVEFSVCwgQ0FQUyBvciBTRUdNRU5UIGV2ZW50cworICAgKi8KKyAgZXZlbnRzID0gZ19saXN0X3JldmVyc2UgKGV2ZW50cyk7CisgIGZvciAobCA9IGV2ZW50czsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICBSVFBKaXR0ZXJCdWZmZXJJdGVtICppdGVtOworCisgICAgaXRlbSA9IGFsbG9jX2l0ZW0gKGwtPmRhdGEsIElURU1fVFlQRV9FVkVOVCwgLTEsIC0xLCAtMSwgMCwgLTEpOworICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX2luc2VydCAocHJpdi0+amJ1ZiwgaXRlbSwgJmhlYWQsIE5VTEwpOworICB9CisgIGdfbGlzdF9mcmVlIChldmVudHMpOworCisgIEpCVUZfU0lHTkFMX0VWRU5UIChwcml2KTsKKworICAvKiByZXNldCBzcGFjaW5nIGVzdGltYXRpb24gd2hlbiBnYXAgKi8KKyAgcHJpdi0+aXBzX3J0cHRpbWUgPSAtMTsKKyAgcHJpdi0+aXBzX3B0cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisKKyAgYnVmZmVycyA9IGdfbGlzdF9jb3B5IChwcml2LT5nYXBfcGFja2V0cy5oZWFkKTsKKyAgZ19xdWV1ZV9jbGVhciAoJnByaXYtPmdhcF9wYWNrZXRzKTsKKworICBwcml2LT5pcHNfcnRwdGltZSA9IC0xOworICBwcml2LT5pcHNfcHRzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgSkJVRl9VTkxPQ0sgKGppdHRlcmJ1ZmZlci0+cHJpdik7CisKKyAgZm9yIChsID0gYnVmZmVyczsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICByZXQgPSBnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4gKHBhZCwgcGFyZW50LCBsLT5kYXRhKTsKKyAgICBsLT5kYXRhID0gTlVMTDsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgICBsID0gbC0+bmV4dDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBmb3IgKDsgbDsgbCA9IGwtPm5leHQpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAobC0+ZGF0YSk7CisgIGdfbGlzdF9mcmVlIChidWZmZXJzKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfaml0dGVyX2J1ZmZlcl9mYXN0X3N0YXJ0IChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXY7CisgIFJUUEppdHRlckJ1ZmZlckl0ZW0gKml0ZW07CisgIFRpbWVyRGF0YSAqdGltZXI7CisKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICBpZiAocHJpdi0+ZmFzdHN0YXJ0X21pbl9wYWNrZXRzID09IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIGl0ZW0gPSBydHBfaml0dGVyX2J1ZmZlcl9wZWVrIChwcml2LT5qYnVmKTsKKyAgaWYgKCFpdGVtKQorICAgIHJldHVybiBGQUxTRTsKKworICB0aW1lciA9IGZpbmRfdGltZXIgKGppdHRlcmJ1ZmZlciwgaXRlbS0+c2VxbnVtKTsKKyAgaWYgKCF0aW1lciB8fCB0aW1lci0+dHlwZSAhPSBUSU1FUl9UWVBFX0RFQURMSU5FKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAocnRwX2ppdHRlcl9idWZmZXJfY2FuX2Zhc3Rfc3RhcnQgKHByaXYtPmpidWYsCisgICAgICAgICAgcHJpdi0+ZmFzdHN0YXJ0X21pbl9wYWNrZXRzKSkgeworICAgIEdTVF9JTkZPX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiV2UgZm91bmQgJWkgY29uc2VjdXRpdmUgcGFja2V0LCBzdGFydCBub3ciLAorICAgICAgICBwcml2LT5mYXN0c3RhcnRfbWluX3BhY2tldHMpOworICAgIHRpbWVyLT50aW1lb3V0ID0gLTE7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyICpqaXR0ZXJidWZmZXI7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXY7CisgIGd1aW50MTYgc2VxbnVtOworICBndWludDMyIGV4cGVjdGVkLCBydHB0aW1lOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RDbG9ja1RpbWUgZHRzLCBwdHM7CisgIGd1aW50NjQgbGF0ZW5jeV90czsKKyAgZ2Jvb2xlYW4gaGVhZDsKKyAgZ2ludCBwZXJjZW50ID0gLTE7CisgIGd1aW50OCBwdDsKKyAgR3N0UlRQQnVmZmVyIHJ0cCA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisgIGdib29sZWFuIGRvX25leHRfc2VxbnVtID0gRkFMU0U7CisgIFJUUEppdHRlckJ1ZmZlckl0ZW0gKml0ZW07CisgIEdzdE1lc3NhZ2UgKm1zZyA9IE5VTEw7CisgIGdib29sZWFuIGVzdGltYXRlZF9kdHMgPSBGQUxTRTsKKyAgZ2ludDMyIHBhY2tldF9yYXRlLCBtYXhfZHJvcG91dCwgbWF4X21pc29yZGVyOworICBUaW1lckRhdGEgKnRpbWVyID0gTlVMTDsKKworICBqaXR0ZXJidWZmZXIgPSBHU1RfUlRQX0pJVFRFUl9CVUZGRVJfQ0FTVCAocGFyZW50KTsKKworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIGlmIChHX1VOTElLRUxZICghZ3N0X3J0cF9idWZmZXJfbWFwIChidWZmZXIsIEdTVF9NQVBfUkVBRCwgJnJ0cCkpKQorICAgIGdvdG8gaW52YWxpZF9idWZmZXI7CisKKyAgcHQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF90eXBlICgmcnRwKTsKKyAgc2VxbnVtID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3NlcSAoJnJ0cCk7CisgIHJ0cHRpbWUgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wICgmcnRwKTsKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgIC8qIG1ha2Ugc3VyZSB3ZSBoYXZlIFBUUyBhbmQgRFRTIHNldCAqLworICBwdHMgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKTsKKyAgZHRzID0gR1NUX0JVRkZFUl9EVFMgKGJ1ZmZlcik7CisgIGlmIChkdHMgPT0gLTEpCisgICAgZHRzID0gcHRzOworICBlbHNlIGlmIChwdHMgPT0gLTEpCisgICAgcHRzID0gZHRzOworCisgIGlmIChkdHMgPT0gLTEpIHsKKyAgICAvKiBJZiB3ZSBoYXZlIG5vIERUUyBoZXJlLCBpLmUuIG5vIGNhcHR1cmUgdGltZSwgZ2V0IG9uZSBmcm9tIHRoZQorICAgICAqIGNsb2NrIG5vdyB0byBoYXZlIHNvbWV0aGluZyB0byBjYWxjdWxhdGUgd2l0aCBpbiB0aGUgZnV0dXJlLiAqLworICAgIGR0cyA9IGdldF9jdXJyZW50X3J1bm5pbmdfdGltZSAoaml0dGVyYnVmZmVyKTsKKyAgICBwdHMgPSBkdHM7CisKKyAgICAvKiBSZW1lbWJlciB0aGF0IHdlIGVzdGltYXRlZCB0aGUgRFRTIGlmIHdlIGFyZSBydW5uaW5nIGFscmVhZHkKKyAgICAgKiBhbmQgdGhpcyBpcyBub3Qgb3VyIGZpcnN0IHBhY2tldCAob3IgZmlyc3QgcGFja2V0IGFmdGVyIGEgcmVzZXQpLgorICAgICAqIElmIGl0J3MgdGhlIGZpcnN0IHBhY2tldCwgd2Ugc29tZWhvdyBtdXN0IGdlbmVyYXRlIGEgdGltZXN0YW1wIGZvcgorICAgICAqIGV2ZXJ5dGhpbmcsIG90aGVyd2lzZSB3ZSBjYW4ndCBjYWxjdWxhdGUgYW55IHRpbWVzCisgICAgICovCisgICAgZXN0aW1hdGVkX2R0cyA9IChwcml2LT5uZXh0X2luX3NlcW51bSAhPSAtMSk7CisgIH0gZWxzZSB7CisgICAgLyogdGFrZSB0aGUgRFRTIG9mIHRoZSBidWZmZXIuIFRoaXMgaXMgdGhlIHRpbWUgd2hlbiB0aGUgcGFja2V0IHdhcworICAgICAqIHJlY2VpdmVkIGFuZCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSBqaXR0ZXIgYW5kIGNsb2NrIHNrZXcuIFdlIHdpbGwgYWRqdXN0CisgICAgICogdGhpcyBEVFMgd2l0aCB0aGUgc21vb3RoZWQgdmFsdWUgYWZ0ZXIgcHJvY2Vzc2luZyBpdCBpbiB0aGUKKyAgICAgKiBqaXR0ZXJidWZmZXIgYW5kIGFzc2lnbiBpdCBhcyB0aGUgUFRTLiAqLworICAgIC8qIGJyaW5nIHRvIHJ1bm5pbmcgdGltZSAqLworICAgIGR0cyA9IGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJnByaXYtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgZHRzKTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwKKyAgICAgICJSZWNlaXZlZCBwYWNrZXQgIyVkIGF0IHRpbWUgJSIgR1NUX1RJTUVfRk9STUFUICIsIGRpc2NvbnQgJWQsIHJ0eCAlZCIsCisgICAgICBzZXFudW0sIEdTVF9USU1FX0FSR1MgKGR0cyksIEdTVF9CVUZGRVJfSVNfRElTQ09OVCAoYnVmZmVyKSwKKyAgICAgIEdTVF9CVUZGRVJfSVNfUkVUUkFOU01JU1NJT04gKGJ1ZmZlcikpOworCisgIEpCVUZfTE9DS19DSEVDSyAocHJpdiwgb3V0X2ZsdXNoaW5nKTsKKworICBpZiAoR19VTkxJS0VMWSAocHJpdi0+bGFzdF9wdCAhPSBwdCkpIHsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAicHQgY2hhbmdlZCBmcm9tICV1IHRvICV1IiwgcHJpdi0+bGFzdF9wdCwKKyAgICAgICAgcHQpOworCisgICAgcHJpdi0+bGFzdF9wdCA9IHB0OworICAgIC8qIHJlc2V0IGNsb2NrLXJhdGUgc28gdGhhdCB3ZSBnZXQgYSBuZXcgb25lICovCisgICAgcHJpdi0+Y2xvY2tfcmF0ZSA9IC0xOworCisgICAgLyogVHJ5IHRvIGdldCB0aGUgY2xvY2stcmF0ZSBmcm9tIHRoZSBjYXBzIGZpcnN0IGlmIHdlIGNhbi4gSWYgdGhlcmUgYXJlIG5vCisgICAgICogY2FwcyB3ZSBtdXN0IGZpcmUgdGhlIHNpZ25hbCB0byBnZXQgdGhlIGNsb2NrLXJhdGUuICovCisgICAgaWYgKChjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChwYWQpKSkgeworICAgICAgZ3N0X2ppdHRlcl9idWZmZXJfc2lua19wYXJzZV9jYXBzIChqaXR0ZXJidWZmZXIsIGNhcHMsIHB0KTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICB9CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAocHJpdi0+Y2xvY2tfcmF0ZSA9PSAtMSkpIHsKKyAgICAvKiBubyBjbG9jayByYXRlIGdpdmVuIG9uIHRoZSBjYXBzLCB0cnkgdG8gZ2V0IG9uZSB3aXRoIHRoZSBzaWduYWwgKi8KKyAgICBpZiAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2dldF9jbG9ja19yYXRlIChqaXR0ZXJidWZmZXIsCisgICAgICAgICAgICBwdCkgPT0gR1NUX0ZMT1dfRkxVU0hJTkcpCisgICAgICBnb3RvIG91dF9mbHVzaGluZzsKKworICAgIGlmIChHX1VOTElLRUxZIChwcml2LT5jbG9ja19yYXRlID09IC0xKSkKKyAgICAgIGdvdG8gbm9fY2xvY2tfcmF0ZTsKKworICAgIGdzdF9ydHBfcGFja2V0X3JhdGVfY3R4X3Jlc2V0ICgmcHJpdi0+cGFja2V0X3JhdGVfY3R4LCBwcml2LT5jbG9ja19yYXRlKTsKKyAgfQorCisgIC8qIGRvbid0IGFjY2VwdCBtb3JlIGRhdGEgb24gRU9TICovCisgIGlmIChHX1VOTElLRUxZIChwcml2LT5lb3MpKQorICAgIGdvdG8gaGF2ZV9lb3M7CisKKyAgaWYgKCFHU1RfQlVGRkVSX0lTX1JFVFJBTlNNSVNTSU9OIChidWZmZXIpKQorICAgIGNhbGN1bGF0ZV9qaXR0ZXIgKGppdHRlcmJ1ZmZlciwgZHRzLCBydHB0aW1lKTsKKworICBpZiAocHJpdi0+c2VxbnVtX2Jhc2UgIT0gLTEpIHsKKyAgICBnaW50IGdhcDsKKworICAgIGdhcCA9IGdzdF9ydHBfYnVmZmVyX2NvbXBhcmVfc2VxbnVtIChwcml2LT5zZXFudW1fYmFzZSwgc2VxbnVtKTsKKworICAgIGlmIChnYXAgPCAwKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAgICAgInBhY2tldCBzZXFudW0gIyVkIGJlZm9yZSBzZXFudW0tYmFzZSAjJWQiLCBzZXFudW0sCisgICAgICAgICAgcHJpdi0+c2VxbnVtX2Jhc2UpOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICAgIGdvdG8gZmluaXNoZWQ7CisgICAgfSBlbHNlIGlmIChnYXAgPiAxNjM4NCkgeworICAgICAgLyogRnJvbSBub3cgb24gZG9uJ3QgY29tcGFyZSBhZ2FpbnN0IHRoZSBzZXFudW0gYmFzZSBhbnltb3JlIGFzCisgICAgICAgKiBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUgd2Ugd2lsbCB3cmFwIGFyb3VuZCBhbmQgYWxzbyB0aGF0CisgICAgICAgKiBtdWNoIHJlb3JkZXJpbmcgaXMgdmVyeSB1bmxpa2VseSAqLworICAgICAgcHJpdi0+c2VxbnVtX2Jhc2UgPSAtMTsKKyAgICB9CisgIH0KKworICBleHBlY3RlZCA9IHByaXYtPm5leHRfaW5fc2VxbnVtOworCisgIHBhY2tldF9yYXRlID0KKyAgICAgIGdzdF9ydHBfcGFja2V0X3JhdGVfY3R4X3VwZGF0ZSAoJnByaXYtPnBhY2tldF9yYXRlX2N0eCwgc2VxbnVtLCBydHB0aW1lKTsKKyAgbWF4X2Ryb3BvdXQgPQorICAgICAgZ3N0X3J0cF9wYWNrZXRfcmF0ZV9jdHhfZ2V0X21heF9kcm9wb3V0ICgmcHJpdi0+cGFja2V0X3JhdGVfY3R4LAorICAgICAgcHJpdi0+bWF4X2Ryb3BvdXRfdGltZSk7CisgIG1heF9taXNvcmRlciA9CisgICAgICBnc3RfcnRwX3BhY2tldF9yYXRlX2N0eF9nZXRfbWF4X21pc29yZGVyICgmcHJpdi0+cGFja2V0X3JhdGVfY3R4LAorICAgICAgcHJpdi0+bWF4X21pc29yZGVyX3RpbWUpOworICBHU1RfVFJBQ0VfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAicGFja2V0X3JhdGU6ICVkLCBtYXhfZHJvcG91dDogJWQsIG1heF9taXNvcmRlcjogJWQiLCBwYWNrZXRfcmF0ZSwKKyAgICAgIG1heF9kcm9wb3V0LCBtYXhfbWlzb3JkZXIpOworCisgIC8qIG5vdyBjaGVjayBhZ2FpbnN0IG91ciBleHBlY3RlZCBzZXFudW0gKi8KKyAgaWYgKEdfVU5MSUtFTFkgKGV4cGVjdGVkID09IC0xKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIkZpcnN0IGJ1ZmZlciAjJWQiLCBzZXFudW0pOworCisgICAgLyogY2FsY3VsYXRlIGEgcHRzIGJhc2VkIG9uIHJ0cHRpbWUgYW5kIGFycml2YWwgdGltZSAoZHRzKSAqLworICAgIHB0cyA9CisgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX2NhbGN1bGF0ZV9wdHMgKHByaXYtPmpidWYsIGR0cywgZXN0aW1hdGVkX2R0cywKKyAgICAgICAgcnRwdGltZSwgZ3N0X2VsZW1lbnRfZ2V0X2Jhc2VfdGltZSAoR1NUX0VMRU1FTlRfQ0FTVCAoaml0dGVyYnVmZmVyKSkpOworCisgICAgLyogd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBuZXh0X2luX3NlcW51bSBzaG91bGQgYmUsIHdhaXQgZm9yIHRoZSBsYXN0CisgICAgICogcG9zc2libGUgbW9tZW50IHRvIHB1c2ggdGhpcyBidWZmZXIsIG1heWJlIHdlIGdldCBhbiBlYXJsaWVyIHNlcW51bQorICAgICAqIHdoaWxlIHdlIHdhaXQgKi8KKyAgICBzZXRfdGltZXIgKGppdHRlcmJ1ZmZlciwgVElNRVJfVFlQRV9ERUFETElORSwgc2VxbnVtLCBwdHMpOworCisgICAgZG9fbmV4dF9zZXFudW0gPSBUUlVFOworICAgIC8qIHRha2UgcnRwdGltZSBhbmQgcHRzIHRvIGNhbGN1bGF0ZSBwYWNrZXQgc3BhY2luZyAqLworICAgIHByaXYtPmlwc19ydHB0aW1lID0gcnRwdGltZTsKKyAgICBwcml2LT5pcHNfcHRzID0gcHRzOworCisgIH0gZWxzZSB7CisgICAgZ2ludCBnYXA7CisgICAgLyogbm93IGNhbGN1bGF0ZSBnYXAgKi8KKyAgICBnYXAgPSBnc3RfcnRwX2J1ZmZlcl9jb21wYXJlX3NlcW51bSAoZXhwZWN0ZWQsIHNlcW51bSk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiZXhwZWN0ZWQgIyVkLCBnb3QgIyVkLCBnYXAgb2YgJWQiLAorICAgICAgICBleHBlY3RlZCwgc2VxbnVtLCBnYXApOworCisgICAgaWYgKEdfVU5MSUtFTFkgKGdhcCA+IDAgJiYgcHJpdi0+dGltZXJzLT5sZW4gPj0gbWF4X2Ryb3BvdXQpKSB7CisgICAgICAvKiBJZiB3ZSBoYXZlIHRpbWVycyBmb3IgbW9yZSB0aGFuIFJUUF9NQVhfRFJPUE9VVCBwYWNrZXRzCisgICAgICAgKiBwZW5kaW5nIHRoaXMgbWVhbnMgdGhhdCB3ZSBoYXZlIGEgaHVnZSBnYXAgb3ZlcmFsbC4gV2UgY2FuCisgICAgICAgKiByZXNldCB0aGUgaml0dGVyYnVmZmVyIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSB0aGVyZSdzCisgICAgICAgKiBqdXN0IHRvbyBtdWNoIGRhdGEgbWlzc2luZyB0byBiZSBhYmxlIHRvIGRvIGFueXRoaW5nCisgICAgICAgKiBzZW5zaWJsZSB3aXRoIHRoZSBwYXN0IGRhdGEuIEp1c3QgdHJ5IGFnYWluIGZyb20gdGhlCisgICAgICAgKiBuZXh0IHBhY2tldCAqLworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICIlZCBwZW5kaW5nIHRpbWVycyA+ICVkIC0gcmVzZXR0aW5nIiwKKyAgICAgICAgICBwcml2LT50aW1lcnMtPmxlbiwgbWF4X2Ryb3BvdXQpOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICAgIHJldHVybiBnc3RfcnRwX2ppdHRlcl9idWZmZXJfcmVzZXQgKGppdHRlcmJ1ZmZlciwgcGFkLCBwYXJlbnQsIHNlcW51bSk7CisgICAgfQorCisgICAgLyogU3BlY2lhbCBoYW5kbGluZyBvZiBsYXJnZSBnYXBzICovCisgICAgaWYgKChnYXAgIT0gLTEgJiYgZ2FwIDwgLW1heF9taXNvcmRlcikgfHwgKGdhcCA+PSBtYXhfZHJvcG91dCkpIHsKKyAgICAgIGdib29sZWFuIHJlc2V0ID0gaGFuZGxlX2JpZ19nYXBfYnVmZmVyIChqaXR0ZXJidWZmZXIsIGJ1ZmZlciwgcHQsIHNlcW51bSwKKyAgICAgICAgICBnYXAsIG1heF9kcm9wb3V0LCBtYXhfbWlzb3JkZXIpOworICAgICAgaWYgKHJlc2V0KSB7CisgICAgICAgIHJldHVybiBnc3RfcnRwX2ppdHRlcl9idWZmZXJfcmVzZXQgKGppdHRlcmJ1ZmZlciwgcGFkLCBwYXJlbnQsIHNlcW51bSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAgICAgICAiSGFkIGJpZyBnYXAsIHdhaXRpbmcgZm9yIG1vcmUgY29uc2VjdXRpdmUgcGFja2V0cyIpOworICAgICAgICBnb3RvIGZpbmlzaGVkOworICAgICAgfQorICAgIH0KKworICAgIC8qIFdlIGhhZCBubyBodWdlIGdhcCwgbGV0J3MgZHJvcCBhbGwgdGhlIGdhcCBwYWNrZXRzICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiQ2xlYXJpbmcgZ2FwIHBhY2tldHMiKTsKKyAgICBnX3F1ZXVlX2ZvcmVhY2ggKCZwcml2LT5nYXBfcGFja2V0cywgKEdGdW5jKSBnc3RfYnVmZmVyX3VucmVmLCBOVUxMKTsKKyAgICBnX3F1ZXVlX2NsZWFyICgmcHJpdi0+Z2FwX3BhY2tldHMpOworCisgICAgLyogY2FsY3VsYXRlIGEgcHRzIGJhc2VkIG9uIHJ0cHRpbWUgYW5kIGFycml2YWwgdGltZSAoZHRzKSAqLworICAgIC8qIElmIHdlIGVzdGltYXRlZCB0aGUgRFRTLCBkb24ndCBjb25zaWRlciBpdCBpbiB0aGUgY2xvY2sgc2tldyBjYWxjdWxhdGlvbnMgKi8KKyAgICBwdHMgPQorICAgICAgICBydHBfaml0dGVyX2J1ZmZlcl9jYWxjdWxhdGVfcHRzIChwcml2LT5qYnVmLCBkdHMsIGVzdGltYXRlZF9kdHMsCisgICAgICAgIHJ0cHRpbWUsIGdzdF9lbGVtZW50X2dldF9iYXNlX3RpbWUgKEdTVF9FTEVNRU5UX0NBU1QgKGppdHRlcmJ1ZmZlcikpKTsKKworICAgIGlmIChHX0xJS0VMWSAoZ2FwID09IDApKSB7CisgICAgICAvKiBwYWNrZXQgaXMgZXhwZWN0ZWQgKi8KKyAgICAgIGNhbGN1bGF0ZV9wYWNrZXRfc3BhY2luZyAoaml0dGVyYnVmZmVyLCBydHB0aW1lLCBwdHMpOworICAgICAgZG9fbmV4dF9zZXFudW0gPSBUUlVFOworICAgIH0gZWxzZSB7CisKKyAgICAgIC8qIHdlIGhhdmUgYSBnYXAgKi8KKyAgICAgIGlmIChnYXAgPiAwKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIiVkIG1pc3NpbmcgcGFja2V0cyIsIGdhcCk7CisgICAgICAgIC8qIGZpbGwgaW4gdGhlIGdhcCB3aXRoIEVYUEVDVEVEIHRpbWVycyAqLworICAgICAgICBjYWxjdWxhdGVfZXhwZWN0ZWQgKGppdHRlcmJ1ZmZlciwgZXhwZWN0ZWQsIHNlcW51bSwgcHRzLCBnYXApOworICAgICAgICBkb19uZXh0X3NlcW51bSA9IFRSVUU7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJvbGQgcGFja2V0IHJlY2VpdmVkIik7CisgICAgICAgIGRvX25leHRfc2VxbnVtID0gRkFMU0U7CisgICAgICB9CisKKyAgICAgIC8qIHJlc2V0IHNwYWNpbmcgZXN0aW1hdGlvbiB3aGVuIGdhcCAqLworICAgICAgcHJpdi0+aXBzX3J0cHRpbWUgPSAtMTsKKyAgICAgIHByaXYtPmlwc19wdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgIH0KKyAgfQorCisgIGlmIChkb19uZXh0X3NlcW51bSkgeworICAgIHByaXYtPmxhc3RfaW5fcHRzID0gcHRzOworICAgIHByaXYtPm5leHRfaW5fc2VxbnVtID0gKHNlcW51bSArIDEpICYgMHhmZmZmOworICB9CisKKyAgdGltZXIgPSBmaW5kX3RpbWVyIChqaXR0ZXJidWZmZXIsIHNlcW51bSk7CisgIGlmIChHU1RfQlVGRkVSX0lTX1JFVFJBTlNNSVNTSU9OIChidWZmZXIpKSB7CisgICAgaWYgKCF0aW1lcikKKyAgICAgIHRpbWVyID0gdGltZXJfcXVldWVfZmluZCAocHJpdi0+cnR4X3N0YXRzX3RpbWVycywgc2VxbnVtKTsKKyAgICBpZiAodGltZXIpCisgICAgICB0aW1lci0+bnVtX3J0eF9yZWNlaXZlZCsrOworICB9CisKKyAgLyogbGV0J3MgY2hlY2sgaWYgdGhpcyBidWZmZXIgaXMgdG9vIGxhdGUsIHdlIGNhbiBvbmx5IGFjY2VwdCBwYWNrZXRzIHdpdGgKKyAgICogYmlnZ2VyIHNlcW51bSB0aGFuIHRoZSBvbmUgd2UgbGFzdCBwdXNoZWQuICovCisgIGlmIChHX0xJS0VMWSAocHJpdi0+bGFzdF9wb3BwZWRfc2VxbnVtICE9IC0xKSkgeworICAgIGdpbnQgZ2FwOworCisgICAgZ2FwID0gZ3N0X3J0cF9idWZmZXJfY29tcGFyZV9zZXFudW0gKHByaXYtPmxhc3RfcG9wcGVkX3NlcW51bSwgc2VxbnVtKTsKKworICAgIC8qIHByaXYtPmxhc3RfcG9wcGVkX3NlcW51bSA+PSBzZXFudW0sIHdlJ3JlIHRvbyBsYXRlLiAqLworICAgIGlmIChHX1VOTElLRUxZIChnYXAgPD0gMCkpIHsKKyAgICAgIGlmIChwcml2LT5kb19yZXRyYW5zbWlzc2lvbikgeworICAgICAgICBpZiAoR1NUX0JVRkZFUl9JU19SRVRSQU5TTUlTU0lPTiAoYnVmZmVyKSAmJiB0aW1lcikgeworICAgICAgICAgIHVwZGF0ZV9ydHhfc3RhdHMgKGppdHRlcmJ1ZmZlciwgdGltZXIsIGR0cywgRkFMU0UpOworICAgICAgICAgIC8qIE9ubHkgY291bnQgdGhlIHJldHJhbm1pdHRlZCBwYWNrZXQgdG9vIGxhdGUgaWYgaXQgaGFzIGJlZW4KKyAgICAgICAgICAgKiBjb25zaWRlcmVkIGxvc3QuIElmIHRoZSBvcmlnaW5hbCBwYWNrZXQgYXJyaXZlZCBiZWZvcmUgdGhlCisgICAgICAgICAgICogcmV0cmFuc21pdHRlZCB3ZSBqdXN0IGNvdW50IGl0IGFzIGEgZHVwbGljYXRlLiAqLworICAgICAgICAgIGlmICh0aW1lci0+dHlwZSAhPSBUSU1FUl9UWVBFX0xPU1QpCisgICAgICAgICAgICBnb3RvIHJ0eF9kdXBsaWNhdGU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdvdG8gdG9vX2xhdGU7CisgICAgfQorICB9CisKKyAgaWYgKGFscmVhZHlfbG9zdCAoaml0dGVyYnVmZmVyLCBzZXFudW0pKQorICAgIGdvdG8gYWxyZWFkeV9sb3N0OworCisgIC8qIGxldCdzIGRyb3Agb2xkZXN0IHBhY2tldCBpZiB0aGUgcXVldWUgaXMgYWxyZWFkeSBmdWxsIGFuZCBkcm9wLW9uLWxhdGVuY3kKKyAgICogaXMgc2V0LiBXZSBjYW4gb25seSBkbyB0aGlzIHdoZW4gdGhlcmUgYWN0dWFsbHkgaXMgYSBsYXRlbmN5LiBXaGVuIG5vCisgICAqIGxhdGVuY3kgaXMgc2V0LCB3ZSBqdXN0IHB1bXAgaXQgaW4gdGhlIHF1ZXVlIGFuZCBsZXQgdGhlIG90aGVyIGVuZCBwdXNoIGl0CisgICAqIG91dCBhcyBmYXN0IGFzIHBvc3NpYmxlLiAqLworICBpZiAocHJpdi0+bGF0ZW5jeV9tcyAmJiBwcml2LT5kcm9wX29uX2xhdGVuY3kpIHsKKyAgICBsYXRlbmN5X3RzID0KKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAocHJpdi0+bGF0ZW5jeV9tcywgcHJpdi0+Y2xvY2tfcmF0ZSwgMTAwMCk7CisKKyAgICBpZiAoR19VTkxJS0VMWSAocnRwX2ppdHRlcl9idWZmZXJfZ2V0X3RzX2RpZmYgKHByaXYtPmpidWYpID49IGxhdGVuY3lfdHMpKSB7CisgICAgICBSVFBKaXR0ZXJCdWZmZXJJdGVtICpvbGRfaXRlbTsKKworICAgICAgb2xkX2l0ZW0gPSBydHBfaml0dGVyX2J1ZmZlcl9wZWVrIChwcml2LT5qYnVmKTsKKworICAgICAgaWYgKElTX0RST1BBQkxFIChvbGRfaXRlbSkpIHsKKyAgICAgICAgb2xkX2l0ZW0gPSBydHBfaml0dGVyX2J1ZmZlcl9wb3AgKHByaXYtPmpidWYsICZwZXJjZW50KTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiUXVldWUgZnVsbCwgZHJvcHBpbmcgb2xkIHBhY2tldCAlcCIsCisgICAgICAgICAgICBvbGRfaXRlbSk7CisgICAgICAgIHByaXYtPm5leHRfc2VxbnVtID0gKG9sZF9pdGVtLT5zZXFudW0gKyBvbGRfaXRlbS0+Y291bnQpICYgMHhmZmZmOworICAgICAgICBmcmVlX2l0ZW0gKG9sZF9pdGVtKTsKKyAgICAgIH0KKyAgICAgIC8qIHdlIG1pZ2h0IGhhdmUgcmVtb3ZlZCBzb21lIGhlYWQgYnVmZmVycywgc2lnbmFsIHRoZSBwdXNoaW5nIHRocmVhZCB0bworICAgICAgICogc2VlIGlmIGl0IGNhbiBwdXNoIG5vdyAqLworICAgICAgSkJVRl9TSUdOQUxfRVZFTlQgKHByaXYpOworICAgIH0KKyAgfQorCisgIC8qIElmIHdlIGVzdGltYXRlZCB0aGUgRFRTLCBkb24ndCBjb25zaWRlciBpdCBpbiB0aGUgY2xvY2sgc2tldyBjYWxjdWxhdGlvbnMKKyAgICogbGF0ZXIuIFRoZSBjb2RlIGFib3ZlIGFsd2F5cyBzZXRzIGR0cyB0byBwdHMgb3IgdGhlIG90aGVyIHdheSBhcm91bmQgaWYKKyAgICogYW55IG9mIHRob3NlIGlzIHZhbGlkIGluIHRoZSBidWZmZXIsIHNvIHdlIGtub3cgdGhhdCBpZiB3ZSBlc3RpbWF0ZWQgdGhlCisgICAqIGR0cyB0aGF0IGJvdGggYXJlIHVua25vd24gKi8KKyAgaWYgKGVzdGltYXRlZF9kdHMpCisgICAgaXRlbSA9CisgICAgICAgIGFsbG9jX2l0ZW0gKGJ1ZmZlciwgSVRFTV9UWVBFX0JVRkZFUiwgR1NUX0NMT0NLX1RJTUVfTk9ORSwKKyAgICAgICAgcHRzLCBzZXFudW0sIDEsIHJ0cHRpbWUpOworICBlbHNlCisgICAgaXRlbSA9IGFsbG9jX2l0ZW0gKGJ1ZmZlciwgSVRFTV9UWVBFX0JVRkZFUiwgZHRzLCBwdHMsIHNlcW51bSwgMSwgcnRwdGltZSk7CisKKyAgLyogbm93IGluc2VydCB0aGUgcGFja2V0IGludG8gdGhlIHF1ZXVlIGluIHNvcnRlZCBvcmRlci4gVGhpcyBmdW5jdGlvbiByZXR1cm5zCisgICAqIEZBTFNFIGlmIGEgcGFja2V0IHdpdGggdGhlIHNhbWUgc2VxbnVtIHdhcyBhbHJlYWR5IGluIHRoZSBxdWV1ZSwgbWVhbmluZyB3ZQorICAgKiBoYXZlIGEgZHVwbGljYXRlLiAqLworICBpZiAoR19VTkxJS0VMWSAoIXJ0cF9qaXR0ZXJfYnVmZmVyX2luc2VydCAocHJpdi0+amJ1ZiwgaXRlbSwgJmhlYWQsCisgICAgICAgICAgICAgICZwZXJjZW50KSkpIHsKKyAgICBpZiAoR1NUX0JVRkZFUl9JU19SRVRSQU5TTUlTU0lPTiAoYnVmZmVyKSAmJiB0aW1lcikKKyAgICAgIHVwZGF0ZV9ydHhfc3RhdHMgKGppdHRlcmJ1ZmZlciwgdGltZXIsIGR0cywgRkFMU0UpOworICAgIGdvdG8gZHVwbGljYXRlOworICB9CisKKyAgLyogVHJpZ2dlciBmYXN0IHN0YXJ0IGlmIG5lZWRlZCAqLworICBpZiAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2Zhc3Rfc3RhcnQgKGppdHRlcmJ1ZmZlcikpCisgICAgaGVhZCA9IFRSVUU7CisKKyAgLyogdXBkYXRlIHRpbWVycyAqLworICB1cGRhdGVfdGltZXJzIChqaXR0ZXJidWZmZXIsIHNlcW51bSwgZHRzLCBwdHMsIGRvX25leHRfc2VxbnVtLAorICAgICAgR1NUX0JVRkZFUl9JU19SRVRSQU5TTUlTU0lPTiAoYnVmZmVyKSwgdGltZXIpOworCisgIC8qIHdlIGhhZCBhbiB1bmhhbmRsZWQgU1IsIGhhbmRsZSBpdCBub3cgKi8KKyAgaWYgKHByaXYtPmxhc3Rfc3IpCisgICAgZG9faGFuZGxlX3N5bmMgKGppdHRlcmJ1ZmZlcik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGhlYWQpKSB7CisgICAgLyogc2lnbmFsIGFkZGl0aW9uIG9mIG5ldyBidWZmZXIgd2hlbiB0aGUgX2xvb3AgaXMgd2FpdGluZy4gKi8KKyAgICBpZiAoR19MSUtFTFkgKHByaXYtPmFjdGl2ZSkpCisgICAgICBKQlVGX1NJR05BTF9FVkVOVCAocHJpdik7CisKKyAgICAvKiBsZXQncyB1bnNjaGVkdWxlIGFuZCB1bmJsb2NrIGFueSB3YWl0aW5nIGJ1ZmZlcnMuIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzCisgICAgICogd2hlbiB0aGUgaGVhZCBidWZmZXIgY2hhbmdlZCAqLworICAgIGlmIChHX1VOTElLRUxZIChwcml2LT5jbG9ja19pZCkpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIlVuc2NoZWR1bGluZyB3YWl0aW5nIG5ldyBidWZmZXIiKTsKKyAgICAgIHVuc2NoZWR1bGVfY3VycmVudF90aW1lciAoaml0dGVyYnVmZmVyKTsKKyAgICB9CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAiUHVzaGVkIHBhY2tldCAjJWQsIG5vdyAlZCBwYWNrZXRzLCBoZWFkOiAlZCwgIiAicGVyY2VudCAlZCIsIHNlcW51bSwKKyAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX251bV9wYWNrZXRzIChwcml2LT5qYnVmKSwgaGVhZCwgcGVyY2VudCk7CisKKyAgbXNnID0gY2hlY2tfYnVmZmVyaW5nX3BlcmNlbnQgKGppdHRlcmJ1ZmZlciwgcGVyY2VudCk7CisKK2ZpbmlzaGVkOgorICBKQlVGX1VOTE9DSyAocHJpdik7CisKKyAgaWYgKG1zZykKKyAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKGppdHRlcmJ1ZmZlciksIG1zZyk7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfYnVmZmVyOgorICB7CisgICAgLyogdGhpcyBpcyBub3QgZmF0YWwgYnV0IHNob3VsZCBiZSBmaWx0ZXJlZCBlYXJsaWVyICovCisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoaml0dGVyYnVmZmVyLCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLAorICAgICAgICAoIlJlY2VpdmVkIGludmFsaWQgUlRQIHBheWxvYWQsIGRyb3BwaW5nIikpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9Citub19jbG9ja19yYXRlOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAgICJObyBjbG9jay1yYXRlIGluIGNhcHMhLCBkcm9wcGluZyBidWZmZXIiKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIGdvdG8gZmluaXNoZWQ7CisgIH0KK291dF9mbHVzaGluZzoKKyAgeworICAgIHJldCA9IHByaXYtPnNyY3Jlc3VsdDsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJmbHVzaGluZyAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIGdvdG8gZmluaXNoZWQ7CisgIH0KK2hhdmVfZW9zOgorICB7CisgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoaml0dGVyYnVmZmVyLCAid2UgYXJlIEVPUywgcmVmdXNpbmcgYnVmZmVyIik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICBnb3RvIGZpbmlzaGVkOworICB9Cit0b29fbGF0ZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIlBhY2tldCAjJWQgdG9vIGxhdGUgYXMgIyVkIHdhcyBhbHJlYWR5IgorICAgICAgICAiIHBvcHBlZCwgZHJvcHBpbmciLCBzZXFudW0sIHByaXYtPmxhc3RfcG9wcGVkX3NlcW51bSk7CisgICAgcHJpdi0+bnVtX2xhdGUrKzsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIGdvdG8gZmluaXNoZWQ7CisgIH0KK2FscmVhZHlfbG9zdDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIlBhY2tldCAjJWQgdG9vIGxhdGUgYXMgaXQgd2FzIGFscmVhZHkgIgorICAgICAgICAiY29uc2lkZXJlZCBsb3N0Iiwgc2VxbnVtKTsKKyAgICBwcml2LT5udW1fbGF0ZSsrOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgZ290byBmaW5pc2hlZDsKKyAgfQorZHVwbGljYXRlOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiRHVwbGljYXRlIHBhY2tldCAjJWQgZGV0ZWN0ZWQsIGRyb3BwaW5nIiwKKyAgICAgICAgc2VxbnVtKTsKKyAgICBwcml2LT5udW1fZHVwbGljYXRlcysrOworICAgIGZyZWVfaXRlbSAoaXRlbSk7CisgICAgZ290byBmaW5pc2hlZDsKKyAgfQorcnR4X2R1cGxpY2F0ZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwKKyAgICAgICAgIkR1cGxpY2F0ZSBSVFggcGFja2V0ICMlZCBkZXRlY3RlZCwgZHJvcHBpbmciLCBzZXFudW0pOworICAgIHByaXYtPm51bV9kdXBsaWNhdGVzKys7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICBnb3RvIGZpbmlzaGVkOworICB9Cit9CisKKy8qIEZJWE1FOiBob3BlZnVsbHkgd2UgY2FuIGRvIHNvbWV0aGluZyBtb3JlIGVmZmljaWVudCBoZXJlLCBlc3BlY2lhbGx5IHdoZW4KKyAqIGFsbCBwYWNrZXRzIGFyZSBpbiBvcmRlciBhbmQvb3Igb3V0c2lkZSBvZiB0aGUgY3VycmVudGx5IGNhY2hlZCByYW5nZS4KKyAqIFN0aWxsIHdvcnRod2hpbGUgdG8gaGF2ZSBpdCwgYXZvaWRzIHRha2luZy9yZWxlYXNpbmcgb2JqZWN0IGxvY2sgYW5kIHBhZAorICogc3RyZWFtIGxvY2sgZm9yIGV2ZXJ5IHNpbmdsZSBidWZmZXIgaW4gdGhlIGRlZmF1bHQgY2hhaW5fbGlzdCBmYWxsYmFjay4gKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW5fbGlzdCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyTGlzdCAqIGJ1ZmZlcl9saXN0KQoreworICBHc3RGbG93UmV0dXJuIGZsb3dfcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGd1aW50IGksIG47CisKKyAgbiA9IGdzdF9idWZmZXJfbGlzdF9sZW5ndGggKGJ1ZmZlcl9saXN0KTsKKyAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgIEdzdEJ1ZmZlciAqYnVmID0gZ3N0X2J1ZmZlcl9saXN0X2dldCAoYnVmZmVyX2xpc3QsIGkpOworCisgICAgZmxvd19yZXQgPSBnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4gKHBhZCwgcGFyZW50LCBnc3RfYnVmZmVyX3JlZiAoYnVmKSk7CisKKyAgICBpZiAoZmxvd19yZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKyAgfQorICBnc3RfYnVmZmVyX2xpc3RfdW5yZWYgKGJ1ZmZlcl9saXN0KTsKKworICByZXR1cm4gZmxvd19yZXQ7Cit9CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2NvbXB1dGVfZWxhcHNlZCAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyLCBSVFBKaXR0ZXJCdWZmZXJJdGVtICogaXRlbSkKK3sKKyAgZ3VpbnQ2NCBleHRfdGltZSwgZWxhcHNlZDsKKyAgZ3VpbnQzMiBydHBfdGltZTsKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworICBydHBfdGltZSA9IGl0ZW0tPnJ0cHRpbWU7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInJ0cCAlIiBHX0dVSU5UMzJfRk9STUFUICIsIGV4dCAlIgorICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgcnRwX3RpbWUsIHByaXYtPmV4dF90aW1lc3RhbXApOworCisgIGV4dF90aW1lID0gcHJpdi0+ZXh0X3RpbWVzdGFtcDsKKyAgZXh0X3RpbWUgPSBnc3RfcnRwX2J1ZmZlcl9leHRfdGltZXN0YW1wICgmZXh0X3RpbWUsIHJ0cF90aW1lKTsKKyAgaWYgKGV4dF90aW1lIDwgcHJpdi0+ZXh0X3RpbWVzdGFtcCkgeworICAgIGV4dF90aW1lID0gcHJpdi0+ZXh0X3RpbWVzdGFtcDsKKyAgfSBlbHNlIHsKKyAgICBwcml2LT5leHRfdGltZXN0YW1wID0gZXh0X3RpbWU7CisgIH0KKworICBpZiAoZXh0X3RpbWUgPiBwcml2LT5jbG9ja19iYXNlKQorICAgIGVsYXBzZWQgPSBleHRfdGltZSAtIHByaXYtPmNsb2NrX2Jhc2U7CisgIGVsc2UKKyAgICBlbGFwc2VkID0gMDsKKworICBlbGFwc2VkID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoZWxhcHNlZCwgR1NUX1NFQ09ORCwgcHJpdi0+Y2xvY2tfcmF0ZSk7CisgIHJldHVybiBlbGFwc2VkOworfQorCitzdGF0aWMgdm9pZAordXBkYXRlX2VzdGltYXRlZF9lb3MgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwKKyAgICBSVFBKaXR0ZXJCdWZmZXJJdGVtICogaXRlbSkKK3sKKyAgZ3VpbnQ2NCB0b3RhbCwgZWxhcHNlZCwgbGVmdCwgZXN0aW1hdGVkOworICBHc3RDbG9ja1RpbWUgb3V0X3RpbWU7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisKKyAgaWYgKHByaXYtPm5wdF9zdG9wID09IC0xIHx8IHByaXYtPmV4dF90aW1lc3RhbXAgPT0gLTEKKyAgICAgIHx8IHByaXYtPmNsb2NrX2Jhc2UgPT0gLTEgfHwgcHJpdi0+Y2xvY2tfcmF0ZSA8PSAwKQorICAgIHJldHVybjsKKworICAvKiBjb21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgKi8KKyAgZWxhcHNlZCA9IGNvbXB1dGVfZWxhcHNlZCAoaml0dGVyYnVmZmVyLCBpdGVtKTsKKworICAvKiBkbyBub3RoaW5nIGlmIGVsYXBzZWQgdGltZSBkb2Vzbid0IGluY3JlbWVudCAqLworICBpZiAocHJpdi0+bGFzdF9lbGFwc2VkICYmIGVsYXBzZWQgPD0gcHJpdi0+bGFzdF9lbGFwc2VkKQorICAgIHJldHVybjsKKworICBwcml2LT5sYXN0X2VsYXBzZWQgPSBlbGFwc2VkOworCisgIC8qIHRoaXMgaXMgdGhlIHRvdGFsIHRpbWUgd2UgbmVlZCB0byBwbGF5ICovCisgIHRvdGFsID0gcHJpdi0+bnB0X3N0b3AgLSBwcml2LT5ucHRfc3RhcnQ7CisgIEdTVF9MT0dfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJ0b3RhbCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTICh0b3RhbCkpOworCisgIC8qIHRoaXMgaXMgaG93IG11Y2ggdGltZSB0aGVyZSBpcyBsZWZ0ICovCisgIGlmICh0b3RhbCA+IGVsYXBzZWQpCisgICAgbGVmdCA9IHRvdGFsIC0gZWxhcHNlZDsKKyAgZWxzZQorICAgIGxlZnQgPSAwOworCisgIC8qIGlmIHdlIGhhdmUgbGVzcyB0aW1lIGxlZnQgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyLCB3ZSB3aWxsIG5vdAorICAgKiBiZSBhYmxlIHRvIGtlZXAgaXQgZmlsbGVkLCBkaXNhYmxlZCBidWZmZXJpbmcgdGhlbiAqLworICBpZiAobGVmdCA8IHJ0cF9qaXR0ZXJfYnVmZmVyX2dldF9kZWxheSAocHJpdi0+amJ1ZikpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJsZWZ0ICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAiLCBkaXNhYmxlIGJ1ZmZlcmluZyBjbG9zZSB0byBFT1MiLCBHU1RfVElNRV9BUkdTIChsZWZ0KSk7CisgICAgcnRwX2ppdHRlcl9idWZmZXJfZGlzYWJsZV9idWZmZXJpbmcgKHByaXYtPmpidWYsIFRSVUUpOworICB9CisKKyAgLyogdGhpcyBpcyB0aGUgY3VycmVudCB0aW1lIGFzIHJ1bm5pbmctdGltZSAqLworICBvdXRfdGltZSA9IGl0ZW0tPnB0czsKKworICBpZiAoZWxhcHNlZCA+IDApCisgICAgZXN0aW1hdGVkID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChvdXRfdGltZSwgdG90YWwsIGVsYXBzZWQpOworICBlbHNlIHsKKyAgICAvKiBpZiB0aGVyZSBpcyBhbG1vc3Qgbm90aGluZyBsZWZ0LAorICAgICAqIHdlIG1heSBuZXZlciBhZHZhbmNlIGVub3VnaCB0byBlbmQgdXAgaW4gdGhlIGFib3ZlIGNhc2UgKi8KKyAgICBpZiAodG90YWwgPCBHU1RfU0VDT05EKQorICAgICAgZXN0aW1hdGVkID0gR1NUX1NFQ09ORDsKKyAgICBlbHNlCisgICAgICBlc3RpbWF0ZWQgPSAtMTsKKyAgfQorICBHU1RfTE9HX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiZWxhcHNlZCAlIiBHU1RfVElNRV9GT1JNQVQgIiwgZXN0aW1hdGVkICUiCisgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGVsYXBzZWQpLCBHU1RfVElNRV9BUkdTIChlc3RpbWF0ZWQpKTsKKworICBpZiAoZXN0aW1hdGVkICE9IC0xICYmIHByaXYtPmVzdGltYXRlZF9lb3MgIT0gZXN0aW1hdGVkKSB7CisgICAgc2V0X3RpbWVyIChqaXR0ZXJidWZmZXIsIFRJTUVSX1RZUEVfRU9TLCAtMSwgZXN0aW1hdGVkKTsKKyAgICBwcml2LT5lc3RpbWF0ZWRfZW9zID0gZXN0aW1hdGVkOworICB9Cit9CisKKy8qIHRha2UgYSBidWZmZXIgZnJvbSB0aGUgcXVldWUgYW5kIHB1c2ggaXQgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitwb3BfYW5kX3B1c2hfbmV4dCAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyLCBndWludCBzZXFudW0pCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisgIEdzdEZsb3dSZXR1cm4gcmVzdWx0ID0gR1NUX0ZMT1dfT0s7CisgIFJUUEppdHRlckJ1ZmZlckl0ZW0gKml0ZW07CisgIEdzdEJ1ZmZlciAqb3V0YnVmID0gTlVMTDsKKyAgR3N0RXZlbnQgKm91dGV2ZW50ID0gTlVMTDsKKyAgR3N0UXVlcnkgKm91dHF1ZXJ5ID0gTlVMTDsKKyAgR3N0Q2xvY2tUaW1lIGR0cywgcHRzOworICBnaW50IHBlcmNlbnQgPSAtMTsKKyAgZ2Jvb2xlYW4gZG9fcHVzaCA9IFRSVUU7CisgIGd1aW50IHR5cGU7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKworICAvKiB3aGVuIHdlIGdldCBoZXJlIHdlIGFyZSByZWFkeSB0byBwb3AgYW5kIHB1c2ggdGhlIGJ1ZmZlciAqLworICBpdGVtID0gcnRwX2ppdHRlcl9idWZmZXJfcG9wIChwcml2LT5qYnVmLCAmcGVyY2VudCk7CisgIHR5cGUgPSBpdGVtLT50eXBlOworCisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgSVRFTV9UWVBFX0JVRkZFUjoKKworICAgICAgLyogd2UgbmVlZCB0byBtYWtlIHdyaXRhYmxlIHRvIGNoYW5nZSB0aGUgZmxhZ3MgYW5kIHRpbWVzdGFtcHMgKi8KKyAgICAgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoaXRlbS0+ZGF0YSk7CisKKyAgICAgIGlmIChHX1VOTElLRUxZIChwcml2LT5kaXNjb250KSkgeworICAgICAgICAvKiBzZXQgRElTQ09OVCBmbGFnIHdoZW4gd2UgbWlzc2VkIGEgcGFja2V0LiBXZSBwdXNoZWQgdGhlIGJ1ZmZlciB3cml0YWJsZQorICAgICAgICAgKiBpbnRvIHRoZSBqaXR0ZXJidWZmZXIgc28gd2UgY2FuIG1vZGlmeSBub3cuICovCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIm1hcmsgb3V0cHV0IGJ1ZmZlciBkaXNjb250Iik7CisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgICAgICBwcml2LT5kaXNjb250ID0gRkFMU0U7CisgICAgICB9CisgICAgICBpZiAoR19VTkxJS0VMWSAocHJpdi0+dHNfZGlzY29udCkpIHsKKyAgICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfUkVTWU5DKTsKKyAgICAgICAgcHJpdi0+dHNfZGlzY29udCA9IEZBTFNFOworICAgICAgfQorCisgICAgICBkdHMgPQorICAgICAgICAgIGdzdF9zZWdtZW50X3Bvc2l0aW9uX2Zyb21fcnVubmluZ190aW1lICgmcHJpdi0+c2VnbWVudCwKKyAgICAgICAgICBHU1RfRk9STUFUX1RJTUUsIGl0ZW0tPmR0cyk7CisgICAgICBwdHMgPQorICAgICAgICAgIGdzdF9zZWdtZW50X3Bvc2l0aW9uX2Zyb21fcnVubmluZ190aW1lICgmcHJpdi0+c2VnbWVudCwKKyAgICAgICAgICBHU1RfRk9STUFUX1RJTUUsIGl0ZW0tPnB0cyk7CisKKyAgICAgIC8qIGlmIHRoaXMgaXMgYSBuZXcgZnJhbWUsIGNoZWNrIGlmIHRzX29mZnNldCBuZWVkcyB0byBiZSB1cGRhdGVkICovCisgICAgICBpZiAocHRzICE9IHByaXYtPmxhc3RfcHRzKSB7CisgICAgICAgIHVwZGF0ZV9vZmZzZXQgKGppdHRlcmJ1ZmZlcik7CisgICAgICB9CisKKyAgICAgIC8qIGFwcGx5IHRpbWVzdGFtcCB3aXRoIG9mZnNldCB0byBidWZmZXIgbm93ICovCisgICAgICBHU1RfQlVGRkVSX0RUUyAob3V0YnVmKSA9IGFwcGx5X29mZnNldCAoaml0dGVyYnVmZmVyLCBkdHMpOworICAgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSBhcHBseV9vZmZzZXQgKGppdHRlcmJ1ZmZlciwgcHRzKTsKKworICAgICAgLyogdXBkYXRlIHRoZSBlbGFwc2VkIHRpbWUgd2hlbiB3ZSBuZWVkIHRvIGNoZWNrIGFnYWluc3QgdGhlIG5wdCBzdG9wIHRpbWUuICovCisgICAgICB1cGRhdGVfZXN0aW1hdGVkX2VvcyAoaml0dGVyYnVmZmVyLCBpdGVtKTsKKworICAgICAgLyogdmVyaWZ5IHRoYXQgYW4gb2Zmc2V0IGhhcyBub3QgY2F1c2VkIHRpbWUgc3RhbXBzIHRvIGdvIGJhY2t3YXJkcywgaWYgc28KKyAgICAgICAqIGhhbmRsZSBieSByZXVzaW5nIHRoZSBwcmV2aW91cyB0aW1lc3RhbXAgKi8KKyAgICAgIGlmIChwcml2LT5sYXN0X291dF90aW1lICE9IEdTVF9DTE9DS19USU1FX05PTkUgJiYKKyAgICAgICAgICBHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSA8IHByaXYtPmxhc3Rfb3V0X3RpbWUpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiYnVmZmVyIFBUUyAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAgICIgb2xkZXIgdGhhbiBwcmVjZWRpbmcgUFRTICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAgICAgIiBhZGp1c3RpbmcgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikpLAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocHJpdi0+bGFzdF9vdXRfdGltZSksCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChwcml2LT5sYXN0X291dF90aW1lKSk7CisgICAgICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gcHJpdi0+bGFzdF9vdXRfdGltZTsKKyAgICAgIH0KKworICAgICAgcHJpdi0+bGFzdF9wdHMgPSBwdHM7CisgICAgICBwcml2LT5sYXN0X291dF90aW1lID0gR1NUX0JVRkZFUl9QVFMgKG91dGJ1Zik7CisgICAgICBicmVhazsKKyAgICBjYXNlIElURU1fVFlQRV9MT1NUOgorICAgICAgcHJpdi0+ZGlzY29udCA9IFRSVUU7CisgICAgICBpZiAoIXByaXYtPmRvX2xvc3QpCisgICAgICAgIGRvX3B1c2ggPSBGQUxTRTsKKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgY2FzZSBJVEVNX1RZUEVfRVZFTlQ6CisgICAgICBvdXRldmVudCA9IGl0ZW0tPmRhdGE7CisgICAgICBicmVhazsKKyAgICBjYXNlIElURU1fVFlQRV9RVUVSWToKKyAgICAgIG91dHF1ZXJ5ID0gaXRlbS0+ZGF0YTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogbm93IHdlIGFyZSByZWFkeSB0byBwdXNoIHRoZSBidWZmZXIuIFNhdmUgdGhlIHNlcW51bSBhbmQgcmVsZWFzZSB0aGUgbG9jaworICAgKiBzbyB0aGUgb3RoZXIgZW5kIGNhbiBwdXNoIHN0dWZmIGluIHRoZSBxdWV1ZSBhZ2Fpbi4gKi8KKyAgaWYgKHNlcW51bSAhPSAtMSkgeworICAgIHByaXYtPmxhc3RfcG9wcGVkX3NlcW51bSA9IHNlcW51bTsKKyAgICBwcml2LT5uZXh0X3NlcW51bSA9IChzZXFudW0gKyBpdGVtLT5jb3VudCkgJiAweGZmZmY7CisgIH0KKyAgbXNnID0gY2hlY2tfYnVmZmVyaW5nX3BlcmNlbnQgKGppdHRlcmJ1ZmZlciwgcGVyY2VudCk7CisgIEpCVUZfVU5MT0NLIChwcml2KTsKKworICBpdGVtLT5kYXRhID0gTlVMTDsKKyAgZnJlZV9pdGVtIChpdGVtKTsKKworICBpZiAobXNnKQorICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAoaml0dGVyYnVmZmVyKSwgbXNnKTsKKworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIElURU1fVFlQRV9CVUZGRVI6CisgICAgICAvKiBwdXNoIGJ1ZmZlciAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLAorICAgICAgICAgICJQdXNoaW5nIGJ1ZmZlciAlZCwgZHRzICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBwdHMgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgIHNlcW51bSwgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVFMgKG91dGJ1ZikpLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfUFRTIChvdXRidWYpKSk7CisgICAgICBwcml2LT5udW1fcHVzaGVkKys7CisgICAgICByZXN1bHQgPSBnc3RfcGFkX3B1c2ggKHByaXYtPnNyY3BhZCwgb3V0YnVmKTsKKworICAgICAgSkJVRl9MT0NLX0NIRUNLIChwcml2LCBvdXRfZmx1c2hpbmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJVEVNX1RZUEVfTE9TVDoKKyAgICBjYXNlIElURU1fVFlQRV9FVkVOVDoKKyAgICAgIC8qIFdlIGdvdCBub3QgZW5vdWdoIGNvbnNlY3V0aXZlIHBhY2tldHMgd2l0aCBhIGh1Z2UgZ2FwLCB3ZSBjYW4KKyAgICAgICAqIGFzIHdlbGwganVzdCBkcm9wIHRoZW0gaGVyZSBub3cgb24gRU9TICovCisgICAgICBpZiAob3V0ZXZlbnQgJiYgR1NUX0VWRU5UX1RZUEUgKG91dGV2ZW50KSA9PSBHU1RfRVZFTlRfRU9TKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIkNsZWFyaW5nIGdhcCBwYWNrZXRzIG9uIEVPUyIpOworICAgICAgICBnX3F1ZXVlX2ZvcmVhY2ggKCZwcml2LT5nYXBfcGFja2V0cywgKEdGdW5jKSBnc3RfYnVmZmVyX3VucmVmLCBOVUxMKTsKKyAgICAgICAgZ19xdWV1ZV9jbGVhciAoJnByaXYtPmdhcF9wYWNrZXRzKTsKKyAgICAgIH0KKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiJXNQdXNoaW5nIGV2ZW50ICUiIEdTVF9QVFJfRk9STUFUCisgICAgICAgICAgIiwgc2VxbnVtICVkIiwgZG9fcHVzaCA/ICIiIDogIk5PVCAiLCBvdXRldmVudCwgc2VxbnVtKTsKKworICAgICAgaWYgKGRvX3B1c2gpCisgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocHJpdi0+c3JjcGFkLCBvdXRldmVudCk7CisgICAgICBlbHNlIGlmIChvdXRldmVudCkKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChvdXRldmVudCk7CisKKyAgICAgIHJlc3VsdCA9IEdTVF9GTE9XX09LOworCisgICAgICBKQlVGX0xPQ0tfQ0hFQ0sgKHByaXYsIG91dF9mbHVzaGluZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElURU1fVFlQRV9RVUVSWToKKyAgICB7CisgICAgICBnYm9vbGVhbiByZXM7CisKKyAgICAgIHJlcyA9IGdzdF9wYWRfcGVlcl9xdWVyeSAocHJpdi0+c3JjcGFkLCBvdXRxdWVyeSk7CisKKyAgICAgIEpCVUZfTE9DS19DSEVDSyAocHJpdiwgb3V0X2ZsdXNoaW5nKTsKKyAgICAgIHJlc3VsdCA9IEdTVF9GTE9XX09LOworICAgICAgR1NUX0xPR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgImRpZCBxdWVyeSAlcCwgcmV0dXJuICVkIiwgb3V0cXVlcnksIHJlcyk7CisgICAgICBKQlVGX1NJR05BTF9RVUVSWSAocHJpdiwgcmVzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworCisgIC8qIEVSUk9SUyAqLworb3V0X2ZsdXNoaW5nOgorICB7CisgICAgcmV0dXJuIHByaXYtPnNyY3Jlc3VsdDsKKyAgfQorfQorCisjZGVmaW5lIEdTVF9GTE9XX1dBSVQgR1NUX0ZMT1dfQ1VTVE9NX1NVQ0NFU1MKKworLyogUGVlayBhIGJ1ZmZlciBhbmQgY29tcGFyZSB0aGUgc2VxbnVtIHRvIHRoZSBleHBlY3RlZCBzZXFudW0uCisgKiBJZiBhbGwgaXMgZmluZSwgdGhlIGJ1ZmZlciBpcyBwdXNoZWQuCisgKiBJZiBzb21ldGhpbmcgaXMgd3JvbmcsIHdlIHdhaXQgZm9yIHNvbWUgZXZlbnQKKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2hhbmRsZV9uZXh0X2J1ZmZlciAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyKQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworICBHc3RGbG93UmV0dXJuIHJlc3VsdDsKKyAgUlRQSml0dGVyQnVmZmVySXRlbSAqaXRlbTsKKyAgZ3VpbnQgc2VxbnVtOworICBndWludDMyIG5leHRfc2VxbnVtOworCisgIC8qIG9ubHkgcHVzaCBidWZmZXJzIHdoZW4gUExBWUlORyBhbmQgYWN0aXZlIGFuZCBub3QgYnVmZmVyaW5nICovCisgIGlmIChwcml2LT5ibG9ja2VkIHx8ICFwcml2LT5hY3RpdmUgfHwKKyAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX2lzX2J1ZmZlcmluZyAocHJpdi0+amJ1ZikpIHsKKyAgICByZXR1cm4gR1NUX0ZMT1dfV0FJVDsKKyAgfQorCisgIC8qIHBlZWsgYSBidWZmZXIsIHdlJ3JlIGp1c3QgbG9va2luZyBhdCB0aGUgc2VxdWVuY2UgbnVtYmVyLgorICAgKiBJZiBhbGwgaXMgZmluZSwgd2UnbGwgcG9wIGFuZCBwdXNoIGl0LiBJZiB0aGUgc2VxdWVuY2UgbnVtYmVyIGlzIHdyb25nIHdlCisgICAqIHdhaXQgZm9yIGEgdGltZW91dCBvciBzb21ldGhpbmcgdG8gY2hhbmdlLgorICAgKiBUaGUgcGVla2VkIGJ1ZmZlciBpcyB2YWxpZCBmb3IgYXMgbG9uZyBhcyB3ZSBob2xkIHRoZSBqaXR0ZXJidWZmZXIgbG9jay4gKi8KKyAgaXRlbSA9IHJ0cF9qaXR0ZXJfYnVmZmVyX3BlZWsgKHByaXYtPmpidWYpOworICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgZ290byB3YWl0OworICB9CisKKyAgLyogZ2V0IHRoZSBzZXFudW0gYW5kIHRoZSBuZXh0IGV4cGVjdGVkIHNlcW51bSAqLworICBzZXFudW0gPSBpdGVtLT5zZXFudW07CisgIGlmIChzZXFudW0gPT0gLTEpIHsKKyAgICByZXR1cm4gcG9wX2FuZF9wdXNoX25leHQgKGppdHRlcmJ1ZmZlciwgc2VxbnVtKTsKKyAgfQorCisgIG5leHRfc2VxbnVtID0gcHJpdi0+bmV4dF9zZXFudW07CisKKyAgLyogZ2V0IHRoZSBnYXAgYmV0d2VlbiB0aGlzIGFuZCB0aGUgcHJldmlvdXMgcGFja2V0LiBJZiB3ZSBkb24ndCBrbm93IHRoZQorICAgKiBwcmV2aW91cyBwYWNrZXQgc2VxbnVtIGFzc3VtZSBubyBnYXAuICovCisgIGlmIChHX1VOTElLRUxZIChuZXh0X3NlcW51bSA9PSAtMSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJGaXJzdCBidWZmZXIgIyVkIiwgc2VxbnVtKTsKKyAgICAvKiB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIG5leHRfc2VxbnVtIHNob3VsZCBiZSwgdGhlIGNoYWluIGZ1bmN0aW9uIHNob3VsZAorICAgICAqIGhhdmUgc2NoZWR1bGVkIGEgREVBRExJTkUgdGltZXIgdGhhdCB3aWxsIGluY3JlbWVudCBuZXh0X3NlcW51bSB3aGVuIGl0CisgICAgICogZmlyZXMsIHNvIHdhaXQgZm9yIHRoYXQgKi8KKyAgICByZXN1bHQgPSBHU1RfRkxPV19XQUlUOworICB9IGVsc2UgeworICAgIGdpbnQgZ2FwID0gZ3N0X3J0cF9idWZmZXJfY29tcGFyZV9zZXFudW0gKG5leHRfc2VxbnVtLCBzZXFudW0pOworCisgICAgaWYgKEdfTElLRUxZIChnYXAgPT0gMCkpIHsKKyAgICAgIC8qIG5vIG1pc3NpbmcgcGFja2V0LCBwb3AgYW5kIHB1c2ggKi8KKyAgICAgIHJlc3VsdCA9IHBvcF9hbmRfcHVzaF9uZXh0IChqaXR0ZXJidWZmZXIsIHNlcW51bSk7CisgICAgfSBlbHNlIGlmIChHX1VOTElLRUxZIChnYXAgPCAwKSkgeworICAgICAgLyogaWYgd2UgaGF2ZSBhIHBhY2tldCB0aGF0IHdlIGFscmVhZHkgcHVzaGVkIG9yIGNvbnNpZGVyZWQgZHJvcHBlZCwgcG9wIGl0CisgICAgICAgKiBvZmYgYW5kIGdldCB0aGUgbmV4dCBwYWNrZXQgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIk9sZCBwYWNrZXQgIyVkLCBuZXh0ICMlZCBkcm9wcGluZyIsCisgICAgICAgICAgc2VxbnVtLCBuZXh0X3NlcW51bSk7CisgICAgICBpdGVtID0gcnRwX2ppdHRlcl9idWZmZXJfcG9wIChwcml2LT5qYnVmLCBOVUxMKTsKKyAgICAgIGZyZWVfaXRlbSAoaXRlbSk7CisgICAgICByZXN1bHQgPSBHU1RfRkxPV19PSzsKKyAgICB9IGVsc2UgeworICAgICAgLyogdGhlIGNoYWluIGZ1bmN0aW9uIGhhcyBzY2hlZHVsZWQgdGltZXJzIHRvIHJlcXVlc3QgcmV0cmFuc21pc3Npb24gb3IKKyAgICAgICAqIHdoZW4gdG8gY29uc2lkZXIgdGhlIHBhY2tldCBsb3N0LCB3YWl0IGZvciB0aGF0ICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAgICAgIlNlcXVlbmNlIG51bWJlciBHQVAgZGV0ZWN0ZWQ6IGV4cGVjdGVkICVkIGluc3RlYWQgb2YgJWQgKCVkIG1pc3NpbmcpIiwKKyAgICAgICAgICBuZXh0X3NlcW51bSwgc2VxbnVtLCBnYXApOworICAgICAgcmVzdWx0ID0gR1NUX0ZMT1dfV0FJVDsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0OworCit3YWl0OgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAibm8gYnVmZmVyLCBnb2luZyB0byB3YWl0Iik7CisgICAgaWYgKHByaXYtPmVvcykgeworICAgICAgcmV0dXJuIEdTVF9GTE9XX0VPUzsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIEdTVF9GTE9XX1dBSVQ7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2dldF9ydHhfcmV0cnlfdGltZW91dCAoR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqIHByaXYpCit7CisgIEdzdENsb2NrVGltZSBydHhfcmV0cnlfdGltZW91dDsKKyAgR3N0Q2xvY2tUaW1lIHJ0eF9taW5fcmV0cnlfdGltZW91dDsKKworICBpZiAocHJpdi0+cnR4X3JldHJ5X3RpbWVvdXQgPT0gLTEpIHsKKyAgICBpZiAocHJpdi0+YXZnX3J0eF9ydHQgPT0gMCkKKyAgICAgIHJ0eF9yZXRyeV90aW1lb3V0ID0gREVGQVVMVF9BVVRPX1JUWF9USU1FT1VUOworICAgIGVsc2UKKyAgICAgIC8qIHdlIHdhbnQgdG8gYXNrIGZvciBhIHJldHJhbnNtaXNzaW9uIGFmdGVyIHdlIHdhaXRlZCBmb3IgYQorICAgICAgICogY29tcGxldGUgUlRUIGFuZCB0aGUgYWRkaXRpb25hbCBqaXR0ZXIgKi8KKyAgICAgIHJ0eF9yZXRyeV90aW1lb3V0ID0gcHJpdi0+YXZnX3J0eF9ydHQgKyBwcml2LT5hdmdfaml0dGVyICogMjsKKyAgfSBlbHNlIHsKKyAgICBydHhfcmV0cnlfdGltZW91dCA9IHByaXYtPnJ0eF9yZXRyeV90aW1lb3V0ICogR1NUX01TRUNPTkQ7CisgIH0KKyAgLyogbWFrZSBzdXJlIHdlIGRvbid0IHJldHJ5IHRvbyBvZnRlbi4gT24gdmVyeSBsb3cgbGF0ZW5jeSBuZXR3b3JrcywKKyAgICogdGhlIFJUVCBhbmQgaml0dGVyIGNhbiBiZSB2ZXJ5IGxvdy4gKi8KKyAgaWYgKHByaXYtPnJ0eF9taW5fcmV0cnlfdGltZW91dCA9PSAtMSkgeworICAgIHJ0eF9taW5fcmV0cnlfdGltZW91dCA9IHByaXYtPnBhY2tldF9zcGFjaW5nOworICB9IGVsc2UgeworICAgIHJ0eF9taW5fcmV0cnlfdGltZW91dCA9IHByaXYtPnJ0eF9taW5fcmV0cnlfdGltZW91dCAqIEdTVF9NU0VDT05EOworICB9CisgIHJ0eF9yZXRyeV90aW1lb3V0ID0gTUFYIChydHhfcmV0cnlfdGltZW91dCwgcnR4X21pbl9yZXRyeV90aW1lb3V0KTsKKworICByZXR1cm4gcnR4X3JldHJ5X3RpbWVvdXQ7Cit9CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2dldF9ydHhfcmV0cnlfcGVyaW9kIChHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICogcHJpdiwKKyAgICBHc3RDbG9ja1RpbWUgcnR4X3JldHJ5X3RpbWVvdXQpCit7CisgIEdzdENsb2NrVGltZSBydHhfcmV0cnlfcGVyaW9kOworCisgIGlmIChwcml2LT5ydHhfcmV0cnlfcGVyaW9kID09IC0xKSB7CisgICAgLyogd2UgcmV0cnkgdXAgdG8gdGhlIGNvbmZpZ3VyZWQgaml0dGVyYnVmZmVyIHNpemUgYnV0IGxlYXZpbmcgc29tZQorICAgICAqIHJvb20gZm9yIHRoZSByZXRyYW5zbWlzc2lvbiB0byBhcnJpdmUgaW4gdGltZSAqLworICAgIGlmIChydHhfcmV0cnlfdGltZW91dCA+IHByaXYtPmxhdGVuY3lfbnMpIHsKKyAgICAgIHJ0eF9yZXRyeV9wZXJpb2QgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBydHhfcmV0cnlfcGVyaW9kID0gcHJpdi0+bGF0ZW5jeV9ucyAtIHJ0eF9yZXRyeV90aW1lb3V0OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBydHhfcmV0cnlfcGVyaW9kID0gcHJpdi0+cnR4X3JldHJ5X3BlcmlvZCAqIEdTVF9NU0VDT05EOworICB9CisgIHJldHVybiBydHhfcmV0cnlfcGVyaW9kOworfQorCisvKgorICAxLiBGb3IgKmxhcmdlciogcnR4LXJ0dCwgd2VpZ2ggYSBuZXcgbWVhc3VyZW1lbnQgYXMgYmVmb3JlICgxLzh0aCkKKyAgMi4gRm9yICpzbWFsbGVyKiBydHgtcnR0LCBiZSBhIGJpdCBtb3JlIGNvbnNlcnZhdGl2ZSBhbmQgd2VpZ2ggYSBiaXQgbGVzcyAoMS8xNnRoKQorICAzLiBGb3IgdmVyeSBsYXJnZSBtZWFzdXJlbWVudHMgKD4gYXZnICogMiksIGNvbnNpZGVyIHRoZW0gIm91dGxpZXJzIgorICAgICBhbmQgY291bnQgdGhlbSBhIGxvdCBsZXNzICgxLzQ4dGgpCisqLworc3RhdGljIHZvaWQKK3VwZGF0ZV9hdmdfcnR4X3J0dCAoR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqIHByaXYsIEdzdENsb2NrVGltZSBydHQpCit7CisgIGdpbnQgd2VpZ2h0OworCisgIGlmIChwcml2LT5hdmdfcnR4X3J0dCA9PSAwKSB7CisgICAgcHJpdi0+YXZnX3J0eF9ydHQgPSBydHQ7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHJ0dCA+IDIgKiBwcml2LT5hdmdfcnR4X3J0dCkKKyAgICB3ZWlnaHQgPSA0ODsKKyAgZWxzZSBpZiAocnR0ID4gcHJpdi0+YXZnX3J0eF9ydHQpCisgICAgd2VpZ2h0ID0gODsKKyAgZWxzZQorICAgIHdlaWdodCA9IDE2OworCisgIHByaXYtPmF2Z19ydHhfcnR0ID0gKHJ0dCArICh3ZWlnaHQgLSAxKSAqIHByaXYtPmF2Z19ydHhfcnR0KSAvIHdlaWdodDsKK30KKworc3RhdGljIHZvaWQKK3VwZGF0ZV9ydHhfc3RhdHMgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgVGltZXJEYXRhICogdGltZXIsCisgICAgR3N0Q2xvY2tUaW1lIGR0cywgZ2Jvb2xlYW4gc3VjY2VzcykKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKyAgR3N0Q2xvY2tUaW1lIGRlbGF5OworCisgIGlmIChzdWNjZXNzKSB7CisgICAgLyogd2Ugc2NoZWR1bGVkIGEgcmV0cnkgZm9yIHRoaXMgcGFja2V0IGFuZCBub3cgd2UgaGF2ZSBpdCAqLworICAgIHByaXYtPm51bV9ydHhfc3VjY2VzcysrOworICAgIC8qIGFsbCB0aGUgcHJldmlvdXMgcmV0cnkgYXR0ZW1wdHMgZmFpbGVkICovCisgICAgcHJpdi0+bnVtX3J0eF9mYWlsZWQgKz0gdGltZXItPm51bV9ydHhfcmV0cnkgLSAxOworICB9IGVsc2UgeworICAgIC8qIEFsbCByZXRyaWVzIGZhaWxlZCBvciB3YXMgdG9vIGxhdGUgKi8KKyAgICBwcml2LT5udW1fcnR4X2ZhaWxlZCArPSB0aW1lci0+bnVtX3J0eF9yZXRyeTsKKyAgfQorCisgIC8qIG51bWJlciBvZiByZXRyaWVzIGJlZm9yZSAoaG9wZWZ1bGx5KSByZWNlaXZpbmcgdGhlIHBhY2tldCAqLworICBpZiAocHJpdi0+YXZnX3J0eF9udW0gPT0gMC4wKQorICAgIHByaXYtPmF2Z19ydHhfbnVtID0gdGltZXItPm51bV9ydHhfcmV0cnk7CisgIGVsc2UKKyAgICBwcml2LT5hdmdfcnR4X251bSA9ICh0aW1lci0+bnVtX3J0eF9yZXRyeSArIDcgKiBwcml2LT5hdmdfcnR4X251bSkgLyA4OworCisgIC8qIENhbGN1bGF0ZSB0aGUgZGVsYXkgYmV0d2VlbiByZXRyYW5zbWlzc2lvbiByZXF1ZXN0IGFuZCByZWNlaXZpbmcgdGhpcworICAgKiBwYWNrZXQuIFdlIGhhdmUgYSB2YWxpZCBkZWxheSBpZiBhbmQgb25seSBpZiB0aGlzIHBhY2tldCBpcyBhIHJlc3BvbnNlIHRvCisgICAqIG91ciBsYXN0IHJlcXVlc3QuIElmIG5vdCB3ZSBkb24ndCBrbm93IGlmIHRoaXMgaXMgYSByZXNwb25zZSB0byBhbgorICAgKiBlYXJsaWVyIHJlcXVlc3QgYW5kIGRlbGF5IGNvdWxkIGJlIHdheSBvZmYuIEZvciBSVFQgaXMgbW9yZSBpbXBvcnRhbnQKKyAgICogd2l0aCBjb3JyZWN0IHZhbHVlcyB0aGFuIHRvIHVwZGF0ZSBmb3IgZXZlcnkgcGFja2V0LiAqLworICBpZiAodGltZXItPm51bV9ydHhfcmV0cnkgPT0gdGltZXItPm51bV9ydHhfcmVjZWl2ZWQgJiYKKyAgICAgIGR0cyAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FICYmIGR0cyA+IHRpbWVyLT5ydHhfbGFzdCkgeworICAgIGRlbGF5ID0gZHRzIC0gdGltZXItPnJ0eF9sYXN0OworICAgIHVwZGF0ZV9hdmdfcnR4X3J0dCAocHJpdiwgZGVsYXkpOworICB9IGVsc2UgeworICAgIGRlbGF5ID0gMDsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAiUlRYICMlZCwgcmVzdWx0ICVkLCBzdWNjZXNzICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgZmFpbGVkICUiCisgICAgICBHX0dVSU5UNjRfRk9STUFUICIsIHJlcXVlc3RzICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgZHVwcyAlIgorICAgICAgR19HVUlOVDY0X0ZPUk1BVCAiLCBhdmctbnVtICVnLCBkZWxheSAlIiBHU1RfVElNRV9GT1JNQVQgIiwgYXZnLXJ0dCAlIgorICAgICAgR1NUX1RJTUVfRk9STUFULCB0aW1lci0+c2VxbnVtLCBzdWNjZXNzLCBwcml2LT5udW1fcnR4X3N1Y2Nlc3MsCisgICAgICBwcml2LT5udW1fcnR4X2ZhaWxlZCwgcHJpdi0+bnVtX3J0eF9yZXF1ZXN0cywgcHJpdi0+bnVtX2R1cGxpY2F0ZXMsCisgICAgICBwcml2LT5hdmdfcnR4X251bSwgR1NUX1RJTUVfQVJHUyAoZGVsYXkpLAorICAgICAgR1NUX1RJTUVfQVJHUyAocHJpdi0+YXZnX3J0eF9ydHQpKTsKK30KKworLyogdGhlIHRpbWVvdXQgZm9yIHdoZW4gd2UgZXhwZWN0ZWQgYSBwYWNrZXQgZXhwaXJlZCAqLworc3RhdGljIGdib29sZWFuCitkb19leHBlY3RlZF90aW1lb3V0IChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIsIFRpbWVyRGF0YSAqIHRpbWVyLAorICAgIEdzdENsb2NrVGltZSBub3cpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisgIEdzdEV2ZW50ICpldmVudDsKKyAgZ3VpbnQgZGVsYXksIGRlbGF5X21zLCBhdmdfcnR4X3J0dF9tczsKKyAgZ3VpbnQgcnR4X3JldHJ5X3RpbWVvdXRfbXMsIHJ0eF9yZXRyeV9wZXJpb2RfbXM7CisgIGd1aW50IHJ0eF9kZWFkbGluZV9tczsKKyAgR3N0Q2xvY2tUaW1lIHJ0eF9yZXRyeV9wZXJpb2Q7CisgIEdzdENsb2NrVGltZSBydHhfcmV0cnlfdGltZW91dDsKKyAgR3N0Q2xvY2sgKmNsb2NrOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgImV4cGVjdGVkICVkIGRpZG4ndCBhcnJpdmUsIG5vdyAlIgorICAgICAgR1NUX1RJTUVfRk9STUFULCB0aW1lci0+c2VxbnVtLCBHU1RfVElNRV9BUkdTIChub3cpKTsKKworICBydHhfcmV0cnlfdGltZW91dCA9IGdldF9ydHhfcmV0cnlfdGltZW91dCAocHJpdik7CisgIHJ0eF9yZXRyeV9wZXJpb2QgPSBnZXRfcnR4X3JldHJ5X3BlcmlvZCAocHJpdiwgcnR4X3JldHJ5X3RpbWVvdXQpOworCisgIGRlbGF5ID0gdGltZXItPnJ0eF9kZWxheSArIHRpbWVyLT5ydHhfcmV0cnk7CisKKyAgZGVsYXlfbXMgPSBHU1RfVElNRV9BU19NU0VDT05EUyAoZGVsYXkpOworICBydHhfcmV0cnlfdGltZW91dF9tcyA9IEdTVF9USU1FX0FTX01TRUNPTkRTIChydHhfcmV0cnlfdGltZW91dCk7CisgIHJ0eF9yZXRyeV9wZXJpb2RfbXMgPSBHU1RfVElNRV9BU19NU0VDT05EUyAocnR4X3JldHJ5X3BlcmlvZCk7CisgIGF2Z19ydHhfcnR0X21zID0gR1NUX1RJTUVfQVNfTVNFQ09ORFMgKHByaXYtPmF2Z19ydHhfcnR0KTsKKyAgcnR4X2RlYWRsaW5lX21zID0KKyAgICAgIHByaXYtPnJ0eF9kZWFkbGluZV9tcyAhPSAtMSA/IHByaXYtPnJ0eF9kZWFkbGluZV9tcyA6IHByaXYtPmxhdGVuY3lfbXM7CisKKyAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiR3N0UlRQUmV0cmFuc21pc3Npb25SZXF1ZXN0IiwKKyAgICAgICAgICAic2VxbnVtIiwgR19UWVBFX1VJTlQsIChndWludCkgdGltZXItPnNlcW51bSwKKyAgICAgICAgICAicnVubmluZy10aW1lIiwgR19UWVBFX1VJTlQ2NCwgdGltZXItPnJ0eF9iYXNlLAorICAgICAgICAgICJkZWxheSIsIEdfVFlQRV9VSU5ULCBkZWxheV9tcywKKyAgICAgICAgICAicmV0cnkiLCBHX1RZUEVfVUlOVCwgdGltZXItPm51bV9ydHhfcmV0cnksCisgICAgICAgICAgImZyZXF1ZW5jeSIsIEdfVFlQRV9VSU5ULCBydHhfcmV0cnlfdGltZW91dF9tcywKKyAgICAgICAgICAicGVyaW9kIiwgR19UWVBFX1VJTlQsIHJ0eF9yZXRyeV9wZXJpb2RfbXMsCisgICAgICAgICAgImRlYWRsaW5lIiwgR19UWVBFX1VJTlQsIHJ0eF9kZWFkbGluZV9tcywKKyAgICAgICAgICAicGFja2V0LXNwYWNpbmciLCBHX1RZUEVfVUlOVDY0LCBwcml2LT5wYWNrZXRfc3BhY2luZywKKyAgICAgICAgICAiYXZnLXJ0dCIsIEdfVFlQRV9VSU5ULCBhdmdfcnR4X3J0dF9tcywgTlVMTCkpOworICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJSZXF1ZXN0IFJUWDogJSIgR1NUX1BUUl9GT1JNQVQsIGV2ZW50KTsKKworICBwcml2LT5udW1fcnR4X3JlcXVlc3RzKys7CisgIHRpbWVyLT5udW1fcnR4X3JldHJ5Kys7CisKKyAgR1NUX09CSkVDVF9MT0NLIChqaXR0ZXJidWZmZXIpOworICBpZiAoKGNsb2NrID0gR1NUX0VMRU1FTlRfQ0xPQ0sgKGppdHRlcmJ1ZmZlcikpKSB7CisgICAgdGltZXItPnJ0eF9sYXN0ID0gZ3N0X2Nsb2NrX2dldF90aW1lIChjbG9jayk7CisgICAgdGltZXItPnJ0eF9sYXN0IC09IEdTVF9FTEVNRU5UX0NBU1QgKGppdHRlcmJ1ZmZlciktPmJhc2VfdGltZTsKKyAgfSBlbHNlIHsKKyAgICB0aW1lci0+cnR4X2xhc3QgPSBub3c7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGppdHRlcmJ1ZmZlcik7CisKKyAgLyogY2FsY3VsYXRlIHRoZSB0aW1lb3V0IGZvciB0aGUgbmV4dCByZXRyYW5zbWlzc2lvbiBhdHRlbXB0ICovCisgIHRpbWVyLT5ydHhfcmV0cnkgKz0gcnR4X3JldHJ5X3RpbWVvdXQ7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgImJhc2UgJSIgR1NUX1RJTUVfRk9STUFUICIsIGRlbGF5ICUiCisgICAgICBHU1RfVElNRV9GT1JNQVQgIiwgcmV0cnkgJSIgR1NUX1RJTUVfRk9STUFUICIsIG51bV9yZXRyeSAldSIsCisgICAgICBHU1RfVElNRV9BUkdTICh0aW1lci0+cnR4X2Jhc2UpLCBHU1RfVElNRV9BUkdTICh0aW1lci0+cnR4X2RlbGF5KSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVyLT5ydHhfcmV0cnkpLCB0aW1lci0+bnVtX3J0eF9yZXRyeSk7CisgIGlmICgocHJpdi0+cnR4X21heF9yZXRyaWVzICE9IC0xCisgICAgICAgICAgJiYgdGltZXItPm51bV9ydHhfcmV0cnkgPj0gcHJpdi0+cnR4X21heF9yZXRyaWVzKQorICAgICAgfHwgKHRpbWVyLT5ydHhfcmV0cnkgKyB0aW1lci0+cnR4X2RlbGF5ID4gcnR4X3JldHJ5X3BlcmlvZCkKKyAgICAgIHx8ICh0aW1lci0+cnR4X2Jhc2UgKyBydHhfcmV0cnlfcGVyaW9kIDwgbm93KSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInJlc2NoZWR1bGUgYXMgTE9TVCB0aW1lciIpOworICAgIC8qIHRvbyBtYW55IHJldHJhbnNtaXNzaW9uIHJlcXVlc3QsIHdlIG5vdyBjb252ZXJ0IHRoZSB0aW1lcgorICAgICAqIHRvIGEgbG9zdCB0aW1lciwgbGVhdmUgdGhlIG51bV9ydHhfcmV0cnkgYXMgaXQgaXMgZm9yIHN0YXRzICovCisgICAgdGltZXItPnR5cGUgPSBUSU1FUl9UWVBFX0xPU1Q7CisgICAgdGltZXItPnJ0eF9kZWxheSA9IDA7CisgICAgdGltZXItPnJ0eF9yZXRyeSA9IDA7CisgIH0KKyAgcmVzY2hlZHVsZV90aW1lciAoaml0dGVyYnVmZmVyLCB0aW1lciwgdGltZXItPnNlcW51bSwKKyAgICAgIHRpbWVyLT5ydHhfYmFzZSArIHRpbWVyLT5ydHhfcmV0cnksIHRpbWVyLT5ydHhfZGVsYXksIEZBTFNFKTsKKworICBKQlVGX1VOTE9DSyAocHJpdik7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAocHJpdi0+c2lua3BhZCwgZXZlbnQpOworICBKQlVGX0xPQ0sgKHByaXYpOworCisgIHJldHVybiBGQUxTRTsKK30KKworLyogYSBwYWNrZXQgaXMgbG9zdCAqLworc3RhdGljIGdib29sZWFuCitkb19sb3N0X3RpbWVvdXQgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgVGltZXJEYXRhICogdGltZXIsCisgICAgR3N0Q2xvY2tUaW1lIG5vdykKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKyAgZ3VpbnQgc2VxbnVtLCBsb3N0X3BhY2tldHMsIG51bV9ydHhfcmV0cnksIG5leHRfaW5fc2VxbnVtOworICBnYm9vbGVhbiBoZWFkOworICBHc3RFdmVudCAqZXZlbnQgPSBOVUxMOworICBSVFBKaXR0ZXJCdWZmZXJJdGVtICppdGVtOworCisgIHNlcW51bSA9IHRpbWVyLT5zZXFudW07CisgIGxvc3RfcGFja2V0cyA9IE1BWCAodGltZXItPm51bSwgMSk7CisgIG51bV9ydHhfcmV0cnkgPSB0aW1lci0+bnVtX3J0eF9yZXRyeTsKKworICAvKiB3ZSBoYWQgYSBnYXAgYW5kIHRodXMgd2UgbG9zdCBzb21lIHBhY2tldHMuIENyZWF0ZSBhbiBldmVudCBmb3IgdGhpcy4gICovCisgIGlmIChsb3N0X3BhY2tldHMgPiAxKQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIlBhY2tldHMgIyVkIC0+ICMlZCBsb3N0Iiwgc2VxbnVtLAorICAgICAgICBzZXFudW0gKyBsb3N0X3BhY2tldHMgLSAxKTsKKyAgZWxzZQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIlBhY2tldCAjJWQgbG9zdCIsIHNlcW51bSk7CisKKyAgcHJpdi0+bnVtX2xvc3QgKz0gbG9zdF9wYWNrZXRzOworICBwcml2LT5udW1fcnR4X2ZhaWxlZCArPSBudW1fcnR4X3JldHJ5OworCisgIG5leHRfaW5fc2VxbnVtID0gKHNlcW51bSArIGxvc3RfcGFja2V0cykgJiAweGZmZmY7CisKKyAgLyogd2Ugbm93IG9ubHkgYWNjZXB0IHNlcW51bSBiaWdnZXIgdGhhbiB0aGlzICovCisgIGlmIChnc3RfcnRwX2J1ZmZlcl9jb21wYXJlX3NlcW51bSAocHJpdi0+bmV4dF9pbl9zZXFudW0sIG5leHRfaW5fc2VxbnVtKSA+IDApIHsKKyAgICBwcml2LT5uZXh0X2luX3NlcW51bSA9IG5leHRfaW5fc2VxbnVtOworICAgIHByaXYtPmxhc3RfaW5fcHRzID0gYXBwbHlfb2Zmc2V0IChqaXR0ZXJidWZmZXIsIHRpbWVyLT50aW1lb3V0KTsKKyAgfQorCisgIC8qIEF2b2lkIGNyZWF0aW5nIGV2ZW50cyBpZiB3ZSBkb24ndCBuZWVkIGl0LiBOb3RlIHRoYXQgd2Ugc3RpbGwgbmVlZCB0byBjcmVhdGUKKyAgICogdGhlIGxvc3QgKklURU0qIHNpbmNlIGl0IHdpbGwgYmUgdXNlZCB0byBub3RpZnkgdGhlIG91dGdvaW5nIHRocmVhZCBvZgorICAgKiBsb3N0IGl0ZW1zIChzbyB0aGF0IHdlIGNhbiBzZXQgZGlzY29udCBmbGFncyBhbmQgc3VjaCkgKi8KKyAgaWYgKHByaXYtPmRvX2xvc3QpIHsKKyAgICBHc3RDbG9ja1RpbWUgZHVyYXRpb24sIHRpbWVzdGFtcDsKKyAgICAvKiBjcmVhdGUgcGFrZXQgbG9zdCBldmVudCAqLworICAgIHRpbWVzdGFtcCA9IGFwcGx5X29mZnNldCAoaml0dGVyYnVmZmVyLCB0aW1lci0+dGltZW91dCk7CisgICAgZHVyYXRpb24gPSB0aW1lci0+ZHVyYXRpb247CisgICAgaWYgKGR1cmF0aW9uID09IEdTVF9DTE9DS19USU1FX05PTkUgJiYgcHJpdi0+cGFja2V0X3NwYWNpbmcgPiAwKQorICAgICAgZHVyYXRpb24gPSBwcml2LT5wYWNrZXRfc3BhY2luZzsKKyAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX0RPV05TVFJFQU0sCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiR3N0UlRQUGFja2V0TG9zdCIsCisgICAgICAgICAgICAic2VxbnVtIiwgR19UWVBFX1VJTlQsIChndWludCkgc2VxbnVtLAorICAgICAgICAgICAgInRpbWVzdGFtcCIsIEdfVFlQRV9VSU5UNjQsIHRpbWVzdGFtcCwKKyAgICAgICAgICAgICJkdXJhdGlvbiIsIEdfVFlQRV9VSU5UNjQsIGR1cmF0aW9uLAorICAgICAgICAgICAgInJldHJ5IiwgR19UWVBFX1VJTlQsIG51bV9ydHhfcmV0cnksIE5VTEwpKTsKKyAgfQorICBpdGVtID0gYWxsb2NfaXRlbSAoZXZlbnQsIElURU1fVFlQRV9MT1NULCAtMSwgLTEsIHNlcW51bSwgbG9zdF9wYWNrZXRzLCAtMSk7CisgIGlmICghcnRwX2ppdHRlcl9idWZmZXJfaW5zZXJ0IChwcml2LT5qYnVmLCBpdGVtLCAmaGVhZCwgTlVMTCkpCisgICAgLyogRHVwbGljYXRlICovCisgICAgZnJlZV9pdGVtIChpdGVtKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHRpbWVyLT5ydHhfbGFzdCkpIHsKKyAgICAvKiBTdG9yZSBpbmZvIHRvIHVwZGF0ZSBzdGF0cyBpZiB0aGUgcGFja2V0IGFycml2ZXMgdG9vIGxhdGUgKi8KKyAgICB0aW1lcl9xdWV1ZV9hcHBlbmQgKHByaXYtPnJ0eF9zdGF0c190aW1lcnMsIHRpbWVyLAorICAgICAgICBub3cgKyBwcml2LT5ydHhfc3RhdHNfdGltZW91dCAqIEdTVF9NU0VDT05ELCBUUlVFKTsKKyAgfQorICByZW1vdmVfdGltZXIgKGppdHRlcmJ1ZmZlciwgdGltZXIpOworCisgIGlmIChoZWFkKQorICAgIEpCVUZfU0lHTkFMX0VWRU5UIChwcml2KTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitkb19lb3NfdGltZW91dCAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyLCBUaW1lckRhdGEgKiB0aW1lciwKKyAgICBHc3RDbG9ja1RpbWUgbm93KQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIEdTVF9JTkZPX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiZ290IHRoZSBOUFQgdGltZW91dCIpOworICByZW1vdmVfdGltZXIgKGppdHRlcmJ1ZmZlciwgdGltZXIpOworICBpZiAoIXByaXYtPmVvcykgeworICAgIC8qIHRoZXJlIHdhcyBubyBFT1MgaW4gdGhlIGJ1ZmZlciwgcHV0IG9uZSBpbiB0aGVyZSBub3cgKi8KKyAgICBxdWV1ZV9ldmVudCAoaml0dGVyYnVmZmVyLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisgIH0KKyAgSkJVRl9TSUdOQUxfRVZFTlQgKHByaXYpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2RvX2RlYWRsaW5lX3RpbWVvdXQgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgVGltZXJEYXRhICogdGltZXIsCisgICAgR3N0Q2xvY2tUaW1lIG5vdykKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICBHU1RfSU5GT19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgImdvdCBkZWFkbGluZSB0aW1lb3V0Iik7CisKKyAgLyogdGltZXIgc2VxbnVtIG1pZ2h0IGhhdmUgYmVlbiBvYnNvbGV0ZWQgYnkgY2FwcyBzZXFudW0tYmFzZSwKKyAgICogb25seSBtZXNzIHdpdGggY3VycmVudCBvbmdvaW5nIHNlcW51bSBpZiBzdGlsbCB1bmtub3duICovCisgIGlmIChwcml2LT5uZXh0X3NlcW51bSA9PSAtMSkKKyAgICBwcml2LT5uZXh0X3NlcW51bSA9IHRpbWVyLT5zZXFudW07CisgIHJlbW92ZV90aW1lciAoaml0dGVyYnVmZmVyLCB0aW1lcik7CisgIEpCVUZfU0lHTkFMX0VWRU5UIChwcml2KTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitkb190aW1lb3V0IChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIsIFRpbWVyRGF0YSAqIHRpbWVyLAorICAgIEdzdENsb2NrVGltZSBub3cpCit7CisgIGdib29sZWFuIHJlbW92ZWQgPSBGQUxTRTsKKworICBzd2l0Y2ggKHRpbWVyLT50eXBlKSB7CisgICAgY2FzZSBUSU1FUl9UWVBFX0VYUEVDVEVEOgorICAgICAgcmVtb3ZlZCA9IGRvX2V4cGVjdGVkX3RpbWVvdXQgKGppdHRlcmJ1ZmZlciwgdGltZXIsIG5vdyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRJTUVSX1RZUEVfTE9TVDoKKyAgICAgIHJlbW92ZWQgPSBkb19sb3N0X3RpbWVvdXQgKGppdHRlcmJ1ZmZlciwgdGltZXIsIG5vdyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRJTUVSX1RZUEVfREVBRExJTkU6CisgICAgICByZW1vdmVkID0gZG9fZGVhZGxpbmVfdGltZW91dCAoaml0dGVyYnVmZmVyLCB0aW1lciwgbm93KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVElNRVJfVFlQRV9FT1M6CisgICAgICByZW1vdmVkID0gZG9fZW9zX3RpbWVvdXQgKGppdHRlcmJ1ZmZlciwgdGltZXIsIG5vdyk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVtb3ZlZDsKK30KKworLyogY2FsbGVkIHdoZW4gd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgbmV4dCB0aW1lb3V0LgorICoKKyAqIFdlIGxvb3Agb3ZlciB0aGUgYXJyYXkgb2YgcmVjb3JkZWQgdGltZW91dHMgYW5kIHdhaXQgZm9yIHRoZSBlYXJsaWVzdCBvbmUuCisgKiBXaGVuIGl0IHRpbWVkIG91dCwgZG8gdGhlIGxvZ2ljIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGltZXIuCisgKgorICogSWYgdGhlcmUgYXJlIG5vIHRpbWVycywgd2Ugd2FpdCBvbiBhIGdjb25kIHVudGlsIHNvbWV0aGluZyBuZXcgaGFwcGVucy4KKyAqLworc3RhdGljIHZvaWQKK3dhaXRfbmV4dF90aW1lb3V0IChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisgIEdzdENsb2NrVGltZSBub3cgPSAwOworCisgIEpCVUZfTE9DSyAocHJpdik7CisgIHdoaWxlIChwcml2LT50aW1lcl9ydW5uaW5nKSB7CisgICAgVGltZXJEYXRhICp0aW1lciA9IE5VTEw7CisgICAgR3N0Q2xvY2tUaW1lIHRpbWVyX3RpbWVvdXQgPSAtMTsKKyAgICBnaW50IGksIGxlbjsKKworICAgIC8qIElmIHdlIGhhdmUgYSBjbG9jaywgdXBkYXRlICJub3ciIG5vdyB3aXRoIHRoZSB2ZXJ5CisgICAgICogbGF0ZXN0IHJ1bm5pbmcgdGltZSB3ZSBoYXZlLiBJZiB0aW1lcnMgYXJlIHVuc2NoZWR1bGVkIGJlbG93IHdlCisgICAgICogb3RoZXJ3aXNlIHdvdWxkbid0IHVwZGF0ZSBub3cgKGl0J3Mgb25seSB1cGRhdGVkIHdoZW4gdGltZXJzCisgICAgICogZXhwaXJlKSwgYW5kIGFsc28gZm9yIHRoZSB2ZXJ5IGZpcnN0IGxvb3AgaXRlcmF0aW9uIG5vdyB3b3VsZAorICAgICAqIG90aGVyd2lzZSBhbHdheXMgYmUgMAorICAgICAqLworICAgIEdTVF9PQkpFQ1RfTE9DSyAoaml0dGVyYnVmZmVyKTsKKyAgICBpZiAoR1NUX0VMRU1FTlRfQ0xPQ0sgKGppdHRlcmJ1ZmZlcikpIHsKKyAgICAgIG5vdyA9CisgICAgICAgICAgZ3N0X2Nsb2NrX2dldF90aW1lIChHU1RfRUxFTUVOVF9DTE9DSyAoaml0dGVyYnVmZmVyKSkgLQorICAgICAgICAgIEdTVF9FTEVNRU5UX0NBU1QgKGppdHRlcmJ1ZmZlciktPmJhc2VfdGltZTsKKyAgICB9CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGppdHRlcmJ1ZmZlcik7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJub3cgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChub3cpKTsKKworICAgIC8qIENsZWFyIGV4cGlyZWQgcnR4LXN0YXRzIHRpbWVycyAqLworICAgIGlmIChwcml2LT5kb19yZXRyYW5zbWlzc2lvbikKKyAgICAgIHRpbWVyX3F1ZXVlX2NsZWFyX3VudGlsIChwcml2LT5ydHhfc3RhdHNfdGltZXJzLCBub3cpOworCisgICAgLyogSXRlcmF0ZSAibm9ybWFsIiB0aW1lcnMgKi8KKyAgICBsZW4gPSBwcml2LT50aW1lcnMtPmxlbjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOykgeworICAgICAgVGltZXJEYXRhICp0ZXN0ID0gJmdfYXJyYXlfaW5kZXggKHByaXYtPnRpbWVycywgVGltZXJEYXRhLCBpKTsKKyAgICAgIEdzdENsb2NrVGltZSB0ZXN0X3RpbWVvdXQgPSBnZXRfdGltZW91dCAoaml0dGVyYnVmZmVyLCB0ZXN0KTsKKyAgICAgIGdib29sZWFuIHNhdmVfYmVzdCA9IEZBTFNFOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAgICAgIiVkLCAlZCwgJWQsICUiIEdTVF9USU1FX0ZPUk1BVCAiIGRpZmY6JSIgR1NUX1NUSU1FX0ZPUk1BVCwgaSwKKyAgICAgICAgICB0ZXN0LT50eXBlLCB0ZXN0LT5zZXFudW0sIEdTVF9USU1FX0FSR1MgKHRlc3RfdGltZW91dCksCisgICAgICAgICAgR1NUX1NUSU1FX0FSR1MgKChnaW50NjQpICh0ZXN0X3RpbWVvdXQgLSBub3cpKSk7CisKKyAgICAgIC8qIFdlZWQgb3V0IGFueXRoaW5nIHRvbyBsYXRlICovCisgICAgICBpZiAodGVzdC0+dHlwZSA9PSBUSU1FUl9UWVBFX0xPU1QgJiYKKyAgICAgICAgICAodGVzdF90aW1lb3V0ID09IC0xIHx8IHRlc3RfdGltZW91dCA8PSBub3cpKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIldlZWRpbmcgb3V0IGxhdGUgZW50cnkiKTsKKyAgICAgICAgZG9fbG9zdF90aW1lb3V0IChqaXR0ZXJidWZmZXIsIHRlc3QsIG5vdyk7CisgICAgICAgIGlmICghcHJpdi0+dGltZXJfcnVubmluZykKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogV2UgZG9uJ3QgbW92ZSB0aGUgaXRlcmF0b3IgZm9yd2FyZCBzaW5jZSB3ZSBqdXN0IHJlbW92ZWQgdGhlIGN1cnJlbnQgZW50cnksCisgICAgICAgICAqIGJ1dCB3ZSB1cGRhdGUgdGhlIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiAqLworICAgICAgICBsZW4gPSBwcml2LT50aW1lcnMtPmxlbjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGZpbmQgdGhlIHNtYWxsZXN0IHRpbWVvdXQgKi8KKyAgICAgICAgaWYgKHRpbWVyID09IE5VTEwpIHsKKyAgICAgICAgICBzYXZlX2Jlc3QgPSBUUlVFOworICAgICAgICB9IGVsc2UgaWYgKHRpbWVyX3RpbWVvdXQgPT0gLTEpIHsKKyAgICAgICAgICAvKiB3ZSBhbHJlYWR5IGhhdmUgYW4gaW1tZWRpYXRlIHRpbWVvdXQsIHRoZSBuZXcgdGltZXIgbXVzdCBiZSBhbgorICAgICAgICAgICAqIGltbWVkaWF0ZSB0aW1lciB3aXRoIHNtYWxsZXIgc2VxbnVtIHRvIGJlY29tZSB0aGUgYmVzdCAqLworICAgICAgICAgIGlmICh0ZXN0X3RpbWVvdXQgPT0gLTEKKyAgICAgICAgICAgICAgJiYgKGdzdF9ydHBfYnVmZmVyX2NvbXBhcmVfc2VxbnVtICh0ZXN0LT5zZXFudW0sCisgICAgICAgICAgICAgICAgICAgICAgdGltZXItPnNlcW51bSkgPiAwKSkKKyAgICAgICAgICAgIHNhdmVfYmVzdCA9IFRSVUU7CisgICAgICAgIH0gZWxzZSBpZiAodGVzdF90aW1lb3V0ID09IC0xKSB7CisgICAgICAgICAgLyogZmlyc3QgaW1tZWRpYXRlIHRpbWVyICovCisgICAgICAgICAgc2F2ZV9iZXN0ID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIGlmICh0ZXN0X3RpbWVvdXQgPCB0aW1lcl90aW1lb3V0KSB7CisgICAgICAgICAgLyogZWFybGllciB0aW1lciAqLworICAgICAgICAgIHNhdmVfYmVzdCA9IFRSVUU7CisgICAgICAgIH0gZWxzZSBpZiAodGVzdF90aW1lb3V0ID09IHRpbWVyX3RpbWVvdXQKKyAgICAgICAgICAgICYmIChnc3RfcnRwX2J1ZmZlcl9jb21wYXJlX3NlcW51bSAodGVzdC0+c2VxbnVtLAorICAgICAgICAgICAgICAgICAgICB0aW1lci0+c2VxbnVtKSA+IDApKSB7CisgICAgICAgICAgLyogc2FtZSB0aW1lciwgc21hbGxlciBzZXFudW0gKi8KKyAgICAgICAgICBzYXZlX2Jlc3QgPSBUUlVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNhdmVfYmVzdCkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIm5ldyBiZXN0ICVkIiwgaSk7CisgICAgICAgICAgdGltZXIgPSB0ZXN0OworICAgICAgICAgIHRpbWVyX3RpbWVvdXQgPSB0ZXN0X3RpbWVvdXQ7CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgICAgfQorICAgIH0KKyAgICBpZiAodGltZXIgJiYgIXByaXYtPmJsb2NrZWQpIHsKKyAgICAgIEdzdENsb2NrICpjbG9jazsKKyAgICAgIEdzdENsb2NrVGltZSBzeW5jX3RpbWU7CisgICAgICBHc3RDbG9ja0lEIGlkOworICAgICAgR3N0Q2xvY2tSZXR1cm4gcmV0OworICAgICAgR3N0Q2xvY2tUaW1lRGlmZiBjbG9ja19qaXR0ZXI7CisKKyAgICAgIGlmICh0aW1lcl90aW1lb3V0ID09IC0xIHx8IHRpbWVyX3RpbWVvdXQgPD0gbm93KSB7CisgICAgICAgIC8qIFdlIGhhdmUgbm9ybWFsbHkgcmVtb3ZlZCBhbGwgbG9zdCB0aW1lcnMgaW4gdGhlIGxvb3AgYWJvdmUgKi8KKyAgICAgICAgZ19hc3NlcnQgKHRpbWVyLT50eXBlICE9IFRJTUVSX1RZUEVfTE9TVCk7CisKKyAgICAgICAgZG9fdGltZW91dCAoaml0dGVyYnVmZmVyLCB0aW1lciwgbm93KTsKKyAgICAgICAgLyogY2hlY2sgaGVyZSwgZG9fdGltZW91dCBjb3VsZCBoYXZlIHJlbGVhc2VkIHRoZSBsb2NrICovCisgICAgICAgIGlmICghcHJpdi0+dGltZXJfcnVubmluZykKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoaml0dGVyYnVmZmVyKTsKKyAgICAgIGNsb2NrID0gR1NUX0VMRU1FTlRfQ0xPQ0sgKGppdHRlcmJ1ZmZlcik7CisgICAgICBpZiAoIWNsb2NrKSB7CisgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChqaXR0ZXJidWZmZXIpOworICAgICAgICAvKiBsZXQncyBqdXN0IHB1c2ggaWYgdGhlcmUgaXMgbm8gY2xvY2sgKi8KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiTm8gY2xvY2ssIHRpbWVvdXQgcmlnaHQgYXdheSIpOworICAgICAgICBub3cgPSB0aW1lcl90aW1lb3V0OworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLyogcHJlcGFyZSBmb3Igc3luYyBhZ2FpbnN0IGNsb2NrICovCisgICAgICBzeW5jX3RpbWUgPSB0aW1lcl90aW1lb3V0ICsgR1NUX0VMRU1FTlRfQ0FTVCAoaml0dGVyYnVmZmVyKS0+YmFzZV90aW1lOworICAgICAgLyogYWRkIGxhdGVuY3kgb2YgcGVlciB0byBnZXQgaW5wdXQgdGltZSAqLworICAgICAgc3luY190aW1lICs9IHByaXYtPnBlZXJfbGF0ZW5jeTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAic3luYyB0byB0aW1lc3RhbXAgJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICAgIiB3aXRoIHN5bmMgdGltZSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXJfdGltZW91dCksIEdTVF9USU1FX0FSR1MgKHN5bmNfdGltZSkpOworCisgICAgICAvKiBjcmVhdGUgYW4gZW50cnkgZm9yIHRoZSBjbG9jayAqLworICAgICAgaWQgPSBwcml2LT5jbG9ja19pZCA9IGdzdF9jbG9ja19uZXdfc2luZ2xlX3Nob3RfaWQgKGNsb2NrLCBzeW5jX3RpbWUpOworICAgICAgcHJpdi0+dGltZXJfdGltZW91dCA9IHRpbWVyX3RpbWVvdXQ7CisgICAgICBwcml2LT50aW1lcl9zZXFudW0gPSB0aW1lci0+c2VxbnVtOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGppdHRlcmJ1ZmZlcik7CisKKyAgICAgIC8qIHJlbGVhc2UgdGhlIGxvY2sgc28gdGhhdCB0aGUgb3RoZXIgZW5kIGNhbiBwdXNoIHN0dWZmIG9yIHVubG9jayAqLworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworCisgICAgICByZXQgPSBnc3RfY2xvY2tfaWRfd2FpdCAoaWQsICZjbG9ja19qaXR0ZXIpOworCisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgaWYgKCFwcml2LT50aW1lcl9ydW5uaW5nKSB7CisgICAgICAgIGdzdF9jbG9ja19pZF91bnJlZiAoaWQpOworICAgICAgICBwcml2LT5jbG9ja19pZCA9IE5VTEw7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAocmV0ICE9IEdTVF9DTE9DS19VTlNDSEVEVUxFRCkgeworICAgICAgICBub3cgPSB0aW1lcl90aW1lb3V0ICsgTUFYIChjbG9ja19qaXR0ZXIsIDApOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAgICAgICAic3luYyBkb25lLCAlZCwgIyVkLCAlIiBHU1RfU1RJTUVfRk9STUFULCByZXQsIHByaXYtPnRpbWVyX3NlcW51bSwKKyAgICAgICAgICAgIEdTVF9TVElNRV9BUkdTIChjbG9ja19qaXR0ZXIpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInN5bmMgdW5zY2hlZHVsZWQiKTsKKyAgICAgIH0KKyAgICAgIC8qIGFuZCBmcmVlIHRoZSBlbnRyeSAqLworICAgICAgZ3N0X2Nsb2NrX2lkX3VucmVmIChpZCk7CisgICAgICBwcml2LT5jbG9ja19pZCA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIG5vIHRpbWVycywgd2FpdCBmb3IgYWN0aXZpdHkgKi8KKyAgICAgIEpCVUZfV0FJVF9USU1FUiAocHJpdik7CisgICAgfQorICB9CisgIEpCVUZfVU5MT0NLIChwcml2KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJ3ZSBhcmUgc3RvcHBpbmciKTsKKyAgcmV0dXJuOworfQorCisvKgorICogVGhpcyBmdW5jaW9uIGltcGxlbWVudHMgdGhlIG1haW4gcHVzaGluZyBsb29wIG9uIHRoZSBzb3VyY2UgcGFkLgorICoKKyAqIEl0IGZpcnN0IHRyaWVzIHRvIHB1c2ggYXMgbWFueSBidWZmZXJzIGFzIHBvc3NpYmxlLiBJZiB0aGVyZSBpcyBhIHNlcW51bQorICogbWlzbWF0Y2gsIHdlIHdhaXQgZm9yIHRoZSBuZXh0IHRpbWVvdXRzLgorICovCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3AgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlcikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKyAgR3N0Rmxvd1JldHVybiByZXN1bHQgPSBHU1RfRkxPV19PSzsKKworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIEpCVUZfTE9DS19DSEVDSyAocHJpdiwgZmx1c2hpbmcpOworICBkbyB7CisgICAgcmVzdWx0ID0gaGFuZGxlX25leHRfYnVmZmVyIChqaXR0ZXJidWZmZXIpOworICAgIGlmIChHX0xJS0VMWSAocmVzdWx0ID09IEdTVF9GTE9XX1dBSVQpKSB7CisgICAgICAvKiBub3cgd2FpdCBmb3IgdGhlIG5leHQgZXZlbnQgKi8KKyAgICAgIEpCVUZfV0FJVF9FVkVOVCAocHJpdiwgZmx1c2hpbmcpOworICAgICAgcmVzdWx0ID0gR1NUX0ZMT1dfT0s7CisgICAgfQorICB9IHdoaWxlIChyZXN1bHQgPT0gR1NUX0ZMT1dfT0spOworICAvKiBzdG9yZSByZXN1bHQgZm9yIHVwc3RyZWFtICovCisgIHByaXYtPnNyY3Jlc3VsdCA9IHJlc3VsdDsKKyAgLyogaWYgd2UgZ2V0IGhlcmUgd2UgbmVlZCB0byBwYXVzZSAqLworICBnb3RvIHBhdXNlOworCisgIC8qIEVSUk9SUyAqLworZmx1c2hpbmc6CisgIHsKKyAgICByZXN1bHQgPSBwcml2LT5zcmNyZXN1bHQ7CisgICAgZ290byBwYXVzZTsKKyAgfQorcGF1c2U6CisgIHsKKyAgICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgICBKQlVGX1NJR05BTF9RVUVSWSAocHJpdiwgRkFMU0UpOworICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInBhdXNpbmcgdGFzaywgcmVhc29uICVzIiwKKyAgICAgICAgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJlc3VsdCkpOworICAgIGdzdF9wYWRfcGF1c2VfdGFzayAocHJpdi0+c3JjcGFkKTsKKyAgICBpZiAocmVzdWx0ID09IEdTVF9GTE9XX0VPUykgeworICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2VvcyAoKTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocHJpdi0+c3JjcGFkLCBldmVudCk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorfQorCisvKiBjb2xsZWN0IHRoZSBpbmZvIGZyb20gdGhlIGxhc3Rlc3QgUlRDUCBwYWNrZXQgYW5kIHRoZSBqaXR0ZXJidWZmZXIgc3luYywgZG8KKyAqIHNvbWUgc2FuaXR5IGNoZWNrcyBhbmQgdGhlbiBlbWl0IHRoZSBoYW5kbGUtc3luYyBzaWduYWwgd2l0aCB0aGUgcGFyYW1ldGVycy4KKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgTE9DSyAqLworc3RhdGljIHZvaWQKK2RvX2hhbmRsZV9zeW5jIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXY7CisgIGd1aW50NjQgYmFzZV9ydHB0aW1lLCBiYXNlX3RpbWU7CisgIGd1aW50MzIgY2xvY2tfcmF0ZTsKKyAgZ3VpbnQ2NCBsYXN0X3J0cHRpbWU7CisgIGd1aW50NjQgY2xvY2tfYmFzZTsKKyAgZ3VpbnQ2NCBleHRfcnRwdGltZSwgZGlmZjsKKyAgZ2Jvb2xlYW4gdmFsaWQgPSBUUlVFLCBrZWVwID0gRkFMU0U7CisKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICAvKiBnZXQgdGhlIGxhc3QgdmFsdWVzIGZyb20gdGhlIGppdHRlcmJ1ZmZlciAqLworICBydHBfaml0dGVyX2J1ZmZlcl9nZXRfc3luYyAocHJpdi0+amJ1ZiwgJmJhc2VfcnRwdGltZSwgJmJhc2VfdGltZSwKKyAgICAgICZjbG9ja19yYXRlLCAmbGFzdF9ydHB0aW1lKTsKKworICBjbG9ja19iYXNlID0gcHJpdi0+Y2xvY2tfYmFzZTsKKyAgZXh0X3J0cHRpbWUgPSBwcml2LT5leHRfcnRwdGltZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJleHQgU1IgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBiYXNlICUiCisgICAgICBHX0dVSU5UNjRfRk9STUFUICIsIGNsb2NrLXJhdGUgJSIgR19HVUlOVDMyX0ZPUk1BVAorICAgICAgIiwgY2xvY2stYmFzZSAlIiBHX0dVSU5UNjRfRk9STUFUICIsIGxhc3QtcnRwdGltZSAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgZXh0X3J0cHRpbWUsIGJhc2VfcnRwdGltZSwgY2xvY2tfcmF0ZSwgY2xvY2tfYmFzZSwgbGFzdF9ydHB0aW1lKTsKKworICBpZiAoYmFzZV9ydHB0aW1lID09IC0xIHx8IGNsb2NrX3JhdGUgPT0gLTEgfHwgYmFzZV90aW1lID09IC0xKSB7CisgICAgLyogd2Uga2VlcCB0aGlzIFNSIHBhY2tldCBmb3IgbGF0ZXIuIFdoZW4gd2UgZ2V0IGEgdmFsaWQgUlRQIHBhY2tldCB0aGUKKyAgICAgKiBhYm92ZSB2YWx1ZXMgd2lsbCBiZSBzZXQgYW5kIHdlIGNhbiB0cnkgdG8gdXNlIHRoZSBTUiBwYWNrZXQgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJrZWVwaW5nIGZvciBsYXRlciwgbm8gUlRQIHZhbHVlcyIpOworICAgIGtlZXAgPSBUUlVFOworICB9IGVsc2UgeworICAgIC8qIHdlIGNhbid0IGFjY2VwdCBhbnl0aGluZyB0aGF0IGhhcHBlbmVkIGJlZm9yZSB3ZSBkaWQgdGhlIGxhc3QgcmVzeW5jICovCisgICAgaWYgKGJhc2VfcnRwdGltZSA+IGV4dF9ydHB0aW1lKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJkcm9wcGluZywgb2xkZXIgdGhhbiBiYXNlIHRpbWUiKTsKKyAgICAgIHZhbGlkID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHRoZSBTUiBSVFAgdGltZXN0YW1wIG11c3QgYmUgc29tZXRoaW5nIGNsb3NlIHRvIHdoYXQgd2UgbGFzdCBvYnNlcnZlZAorICAgICAgICogaW4gdGhlIGppdHRlcmJ1ZmZlciAqLworICAgICAgaWYgKGV4dF9ydHB0aW1lID4gbGFzdF9ydHB0aW1lKSB7CisgICAgICAgIC8qIGNoZWNrIGhvdyBmYXIgYWhlYWQgaXQgaXMgdG8gb3VyIFJUUCB0aW1lc3RhbXBzICovCisgICAgICAgIGRpZmYgPSBleHRfcnRwdGltZSAtIGxhc3RfcnRwdGltZTsKKyAgICAgICAgLyogaWYgYmlnZ2VyIHRoYW4gMSBzZWNvbmQsIHdlIGRyb3AgaXQgKi8KKyAgICAgICAgaWYgKGppdHRlcmJ1ZmZlci0+cHJpdi0+bWF4X3J0Y3BfcnRwX3RpbWVfZGlmZiAhPSAtMSAmJgorICAgICAgICAgICAgZGlmZiA+CisgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGppdHRlcmJ1ZmZlci0+cHJpdi0+bWF4X3J0Y3BfcnRwX3RpbWVfZGlmZiwKKyAgICAgICAgICAgICAgICBjbG9ja19yYXRlLCAxMDAwKSkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInRvbyBmYXIgYWhlYWQiKTsKKyAgICAgICAgICAvKiBzaG91bGQgZHJvcCB0aGlzLCBidXQgc29tZSBSVFNQIHNlcnZlcnMgZW5kIHVwIHdpdGggYm9ndXMKKyAgICAgICAgICAgKiB3YXkgdG9vIGFoZWFkIFJUQ1AgcGFja2V0IHdoZW4gcmVwZWF0ZWQgUEFVU0UvUExBWSwKKyAgICAgICAgICAgKiBzbyBzdGlsbCB0cmlnZ2VyIHJwdGJpbiBzeW5jIGJ1dCBpbnZhbGlkYXRlIFJUQ1AgZGF0YQorICAgICAgICAgICAqIChzeW5jIG1pZ2h0IHVzZSBvdGhlciBtZXRob2RzKSAqLworICAgICAgICAgIGV4dF9ydHB0aW1lID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiZXh0IGxhc3QgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBkaWZmICUiCisgICAgICAgICAgICBHX0dVSU5UNjRfRk9STUFULCBsYXN0X3J0cHRpbWUsIGRpZmYpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChrZWVwKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAia2VlcGluZyBSVENQIHBhY2tldCBmb3IgbGF0ZXIiKTsKKyAgfSBlbHNlIGlmICh2YWxpZCkgeworICAgIEdzdFN0cnVjdHVyZSAqczsKKworICAgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLXN5bmMiLAorICAgICAgICAiYmFzZS1ydHB0aW1lIiwgR19UWVBFX1VJTlQ2NCwgYmFzZV9ydHB0aW1lLAorICAgICAgICAiYmFzZS10aW1lIiwgR19UWVBFX1VJTlQ2NCwgYmFzZV90aW1lLAorICAgICAgICAiY2xvY2stcmF0ZSIsIEdfVFlQRV9VSU5ULCBjbG9ja19yYXRlLAorICAgICAgICAiY2xvY2stYmFzZSIsIEdfVFlQRV9VSU5UNjQsIGNsb2NrX2Jhc2UsCisgICAgICAgICJzci1leHQtcnRwdGltZSIsIEdfVFlQRV9VSU5UNjQsIGV4dF9ydHB0aW1lLAorICAgICAgICAic3ItYnVmZmVyIiwgR1NUX1RZUEVfQlVGRkVSLCBwcml2LT5sYXN0X3NyLCBOVUxMKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInNpZ25hbGluZyBzeW5jIik7CisgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmcHJpdi0+bGFzdF9zciwgTlVMTCk7CisgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgIGdfc2lnbmFsX2VtaXQgKGppdHRlcmJ1ZmZlciwKKyAgICAgICAgZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpZ25hbHNbU0lHTkFMX0hBTkRMRV9TWU5DXSwgMCwgcyk7CisgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHMpOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgImRyb3BwaW5nIFJUQ1AgcGFja2V0Iik7CisgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmcHJpdi0+bGFzdF9zciwgTlVMTCk7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbl9ydGNwIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlciAqaml0dGVyYnVmZmVyOworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2OworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludDMyIHNzcmM7CisgIEdzdFJUQ1BQYWNrZXQgcGFja2V0OworICBndWludDY0IGV4dF9ydHB0aW1lOworICBndWludDMyIHJ0cHRpbWU7CisgIEdzdFJUQ1BCdWZmZXIgcnRjcCA9IHsgTlVMTCwgfTsKKworICBqaXR0ZXJidWZmZXIgPSBHU1RfUlRQX0pJVFRFUl9CVUZGRVIgKHBhcmVudCk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFnc3RfcnRjcF9idWZmZXJfdmFsaWRhdGVfcmVkdWNlZCAoYnVmZmVyKSkpCisgICAgZ290byBpbnZhbGlkX2J1ZmZlcjsKKworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIGdzdF9ydGNwX2J1ZmZlcl9tYXAgKGJ1ZmZlciwgR1NUX01BUF9SRUFELCAmcnRjcCk7CisKKyAgaWYgKCFnc3RfcnRjcF9idWZmZXJfZ2V0X2ZpcnN0X3BhY2tldCAoJnJ0Y3AsICZwYWNrZXQpKQorICAgIGdvdG8gZW1wdHlfYnVmZmVyOworCisgIC8qIGZpcnN0IHBhY2tldCBtdXN0IGJlIFNSIG9yIFJSIG9yIGVsc2UgdGhlIHZhbGlkYXRlIHdvdWxkIGhhdmUgZmFpbGVkICovCisgIHN3aXRjaCAoZ3N0X3J0Y3BfcGFja2V0X2dldF90eXBlICgmcGFja2V0KSkgeworICAgIGNhc2UgR1NUX1JUQ1BfVFlQRV9TUjoKKyAgICAgIGdzdF9ydGNwX3BhY2tldF9zcl9nZXRfc2VuZGVyX2luZm8gKCZwYWNrZXQsICZzc3JjLCBOVUxMLCAmcnRwdGltZSwKKyAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnb3RvIGlnbm9yZV9idWZmZXI7CisgIH0KKyAgZ3N0X3J0Y3BfYnVmZmVyX3VubWFwICgmcnRjcCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAicmVjZWl2ZWQgUlRDUCBvZiBTU1JDICUwOHgiLCBzc3JjKTsKKworICBKQlVGX0xPQ0sgKHByaXYpOworICAvKiBjb252ZXJ0IHRoZSBSVFAgdGltZXN0YW1wIHRvIG91ciBleHRlbmRlZCB0aW1lc3RhbXAsIHVzaW5nIHRoZSBzYW1lIG9mZnNldAorICAgKiB3ZSB1c2VkIGluIHRoZSBqaXR0ZXJidWZmZXIgKi8KKyAgZXh0X3J0cHRpbWUgPSBwcml2LT5qYnVmLT5leHRfcnRwdGltZTsKKyAgZXh0X3J0cHRpbWUgPSBnc3RfcnRwX2J1ZmZlcl9leHRfdGltZXN0YW1wICgmZXh0X3J0cHRpbWUsIHJ0cHRpbWUpOworCisgIHByaXYtPmV4dF9ydHB0aW1lID0gZXh0X3J0cHRpbWU7CisgIGdzdF9idWZmZXJfcmVwbGFjZSAoJnByaXYtPmxhc3Rfc3IsIGJ1ZmZlcik7CisKKyAgZG9faGFuZGxlX3N5bmMgKGppdHRlcmJ1ZmZlcik7CisgIEpCVUZfVU5MT0NLIChwcml2KTsKKworZG9uZToKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICByZXR1cm4gcmV0OworCitpbnZhbGlkX2J1ZmZlcjoKKyAgeworICAgIC8qIHRoaXMgaXMgbm90IGZhdGFsIGJ1dCBzaG91bGQgYmUgZmlsdGVyZWQgZWFybGllciAqLworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKGppdHRlcmJ1ZmZlciwgU1RSRUFNLCBERUNPREUsIChOVUxMKSwKKyAgICAgICAgKCJSZWNlaXZlZCBpbnZhbGlkIFJUQ1AgcGF5bG9hZCwgZHJvcHBpbmciKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgZ290byBkb25lOworICB9CitlbXB0eV9idWZmZXI6CisgIHsKKyAgICAvKiB0aGlzIGlzIG5vdCBmYXRhbCBidXQgc2hvdWxkIGJlIGZpbHRlcmVkIGVhcmxpZXIgKi8KKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChqaXR0ZXJidWZmZXIsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksCisgICAgICAgICgiUmVjZWl2ZWQgZW1wdHkgUlRDUCBwYXlsb2FkLCBkcm9wcGluZyIpKTsKKyAgICBnc3RfcnRjcF9idWZmZXJfdW5tYXAgKCZydGNwKTsKKyAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICBnb3RvIGRvbmU7CisgIH0KK2lnbm9yZV9idWZmZXI6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJpZ25vcmluZyBSVENQIHBhY2tldCIpOworICAgIGdzdF9ydGNwX2J1ZmZlcl91bm1hcCAoJnJ0Y3ApOworICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgIGdvdG8gZG9uZTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfaml0dGVyX2J1ZmZlcl9zaW5rX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKyAgR3N0UnRwSml0dGVyQnVmZmVyICpqaXR0ZXJidWZmZXI7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXY7CisKKyAgaml0dGVyYnVmZmVyID0gR1NUX1JUUF9KSVRURVJfQlVGRkVSIChwYXJlbnQpOworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqZmlsdGVyLCAqY2FwczsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2NhcHMgKHF1ZXJ5LCAmZmlsdGVyKTsKKyAgICAgIGNhcHMgPSBnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0Y2FwcyAocGFkLCBmaWx0ZXIpOworICAgICAgZ3N0X3F1ZXJ5X3NldF9jYXBzX3Jlc3VsdCAocXVlcnksIGNhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgaWYgKEdTVF9RVUVSWV9JU19TRVJJQUxJWkVEIChxdWVyeSkpIHsKKyAgICAgICAgUlRQSml0dGVyQnVmZmVySXRlbSAqaXRlbTsKKyAgICAgICAgZ2Jvb2xlYW4gaGVhZDsKKworICAgICAgICBKQlVGX0xPQ0tfQ0hFQ0sgKHByaXYsIG91dF9mbHVzaGluZyk7CisgICAgICAgIGlmIChydHBfaml0dGVyX2J1ZmZlcl9nZXRfbW9kZSAocHJpdi0+amJ1ZikgIT0KKyAgICAgICAgICAgIFJUUF9KSVRURVJfQlVGRkVSX01PREVfQlVGRkVSKSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiYWRkaW5nIHNlcmlhbGl6ZWQgcXVlcnkiKTsKKyAgICAgICAgICBpdGVtID0gYWxsb2NfaXRlbSAocXVlcnksIElURU1fVFlQRV9RVUVSWSwgLTEsIC0xLCAtMSwgMCwgLTEpOworICAgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX2luc2VydCAocHJpdi0+amJ1ZiwgaXRlbSwgJmhlYWQsIE5VTEwpOworICAgICAgICAgIGlmIChoZWFkKQorICAgICAgICAgICAgSkJVRl9TSUdOQUxfRVZFTlQgKHByaXYpOworICAgICAgICAgIEpCVUZfV0FJVF9RVUVSWSAocHJpdiwgb3V0X2ZsdXNoaW5nKTsKKyAgICAgICAgICByZXMgPSBwcml2LT5sYXN0X3F1ZXJ5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInJlZnVzaW5nIHF1ZXJ5LCB3ZSBhcmUgYnVmZmVyaW5nIik7CisgICAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlczsKKyAgLyogRVJST1JTICovCitvdXRfZmx1c2hpbmc6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJ3ZSBhcmUgZmx1c2hpbmciKTsKKyAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2ppdHRlcl9idWZmZXJfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXIgKmppdHRlcmJ1ZmZlcjsKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgaml0dGVyYnVmZmVyID0gR1NUX1JUUF9KSVRURVJfQlVGRkVSIChwYXJlbnQpOworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0xBVEVOQ1k6CisgICAgeworICAgICAgLyogV2UgbmVlZCB0byBzZW5kIHRoZSBxdWVyeSB1cHN0cmVhbSBhbmQgYWRkIHRoZSByZXR1cm5lZCBsYXRlbmN5IHRvIG91cgorICAgICAgICogb3duICovCisgICAgICBHc3RDbG9ja1RpbWUgbWluX2xhdGVuY3ksIG1heF9sYXRlbmN5OworICAgICAgZ2Jvb2xlYW4gdXNfbGl2ZTsKKyAgICAgIEdzdENsb2NrVGltZSBvdXJfbGF0ZW5jeTsKKworICAgICAgaWYgKChyZXMgPSBnc3RfcGFkX3BlZXJfcXVlcnkgKHByaXYtPnNpbmtwYWQsIHF1ZXJ5KSkpIHsKKyAgICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2xhdGVuY3kgKHF1ZXJ5LCAmdXNfbGl2ZSwgJm1pbl9sYXRlbmN5LCAmbWF4X2xhdGVuY3kpOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIlBlZXIgbGF0ZW5jeTogbWluICUiCisgICAgICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiBtYXggJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAobWluX2xhdGVuY3kpLCBHU1RfVElNRV9BUkdTIChtYXhfbGF0ZW5jeSkpOworCisgICAgICAgIC8qIHN0b3JlIHRoaXMgc28gdGhhdCB3ZSBjYW4gc2FmZWx5IHN5bmMgb24gdGhlIHBlZXIgYnVmZmVycy4gKi8KKyAgICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgICAgcHJpdi0+cGVlcl9sYXRlbmN5ID0gbWluX2xhdGVuY3k7CisgICAgICAgIG91cl9sYXRlbmN5ID0gcHJpdi0+bGF0ZW5jeV9uczsKKyAgICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIk91ciBsYXRlbmN5OiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChvdXJfbGF0ZW5jeSkpOworCisgICAgICAgIC8qIHdlIGFkZCBzb21lIGxhdGVuY3kgYnV0IGNhbiBidWZmZXIgYW4gaW5maW5pdGUgYW1vdW50IG9mIHRpbWUgKi8KKyAgICAgICAgbWluX2xhdGVuY3kgKz0gb3VyX2xhdGVuY3k7CisgICAgICAgIG1heF9sYXRlbmN5ID0gLTE7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiQ2FsY3VsYXRlZCB0b3RhbCBsYXRlbmN5IDogbWluICUiCisgICAgICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiBtYXggJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAobWluX2xhdGVuY3kpLCBHU1RfVElNRV9BUkdTIChtYXhfbGF0ZW5jeSkpOworCisgICAgICAgIGdzdF9xdWVyeV9zZXRfbGF0ZW5jeSAocXVlcnksIFRSVUUsIG1pbl9sYXRlbmN5LCBtYXhfbGF0ZW5jeSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfUE9TSVRJT046CisgICAgeworICAgICAgR3N0Q2xvY2tUaW1lIHN0YXJ0LCBsYXN0X291dDsKKyAgICAgIEdzdEZvcm1hdCBmbXQ7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9wb3NpdGlvbiAocXVlcnksICZmbXQsIE5VTEwpOworICAgICAgaWYgKGZtdCAhPSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIHN0YXJ0ID0gcHJpdi0+bnB0X3N0YXJ0OworICAgICAgbGFzdF9vdXQgPSBwcml2LT5sYXN0X291dF90aW1lOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJucHQgc3RhcnQgJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICAgIiwgbGFzdCBvdXQgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChzdGFydCksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAobGFzdF9vdXQpKTsKKworICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdGFydCkgJiYgR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGxhc3Rfb3V0KSkgeworICAgICAgICAvKiBicmluZyAwLWJhc2VkIG91dGdvaW5nIHRpbWUgdG8gc3RyZWFtIHRpbWUgKi8KKyAgICAgICAgZ3N0X3F1ZXJ5X3NldF9wb3NpdGlvbiAocXVlcnksIEdTVF9GT1JNQVRfVElNRSwgc3RhcnQgKyBsYXN0X291dCk7CisgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXMgPSBnc3RfcGFkX3F1ZXJ5X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBxdWVyeSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpmaWx0ZXIsICpjYXBzOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY2FwcyAocXVlcnksICZmaWx0ZXIpOworICAgICAgY2FwcyA9IGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9nZXRjYXBzIChwYWQsIGZpbHRlcik7CisgICAgICBnc3RfcXVlcnlfc2V0X2NhcHNfcmVzdWx0IChxdWVyeSwgY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICByZXMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBnc3RfcGFkX3F1ZXJ5X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlciAqaml0dGVyYnVmZmVyOworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2OworCisgIGppdHRlcmJ1ZmZlciA9IEdTVF9SVFBfSklUVEVSX0JVRkZFUiAob2JqZWN0KTsKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTEFURU5DWToKKyAgICB7CisgICAgICBndWludCBuZXdfbGF0ZW5jeSwgb2xkX2xhdGVuY3k7CisKKyAgICAgIG5ld19sYXRlbmN5ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworCisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgb2xkX2xhdGVuY3kgPSBwcml2LT5sYXRlbmN5X21zOworICAgICAgcHJpdi0+bGF0ZW5jeV9tcyA9IG5ld19sYXRlbmN5OworICAgICAgcHJpdi0+bGF0ZW5jeV9ucyA9IHByaXYtPmxhdGVuY3lfbXMgKiBHU1RfTVNFQ09ORDsKKyAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX3NldF9kZWxheSAocHJpdi0+amJ1ZiwgcHJpdi0+bGF0ZW5jeV9ucyk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisKKyAgICAgIC8qIHBvc3QgbWVzc2FnZSBpZiBsYXRlbmN5IGNoYW5nZWQsIHRoaXMgd2lsbCBpbmZvcm0gdGhlIHBhcmVudCBwaXBlbGluZQorICAgICAgICogdGhhdCBhIGxhdGVuY3kgcmVjb25maWd1cmF0aW9uIGlzIHBvc3NpYmxlL25lZWRlZC4gKi8KKyAgICAgIGlmIChuZXdfbGF0ZW5jeSAhPSBvbGRfbGF0ZW5jeSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJsYXRlbmN5IGNoYW5nZWQgdG86ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKG5ld19sYXRlbmN5ICogR1NUX01TRUNPTkQpKTsKKworICAgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKGppdHRlcmJ1ZmZlciksCisgICAgICAgICAgICBnc3RfbWVzc2FnZV9uZXdfbGF0ZW5jeSAoR1NUX09CSkVDVF9DQVNUIChqaXR0ZXJidWZmZXIpKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0RST1BfT05fTEFURU5DWToKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBwcml2LT5kcm9wX29uX2xhdGVuY3kgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVFNfT0ZGU0VUOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIGlmIChwcml2LT5tYXhfdHNfb2Zmc2V0X2FkanVzdG1lbnQgIT0gMCkgeworICAgICAgICBnaW50NjQgbmV3X29mZnNldCA9IGdfdmFsdWVfZ2V0X2ludDY0ICh2YWx1ZSk7CisKKyAgICAgICAgaWYgKG5ld19vZmZzZXQgPiBwcml2LT50c19vZmZzZXQpIHsKKyAgICAgICAgICBwcml2LT50c19vZmZzZXRfcmVtYWluZGVyID0gbmV3X29mZnNldCAtIHByaXYtPnRzX29mZnNldDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcml2LT50c19vZmZzZXRfcmVtYWluZGVyID0gLShwcml2LT50c19vZmZzZXQgLSBuZXdfb2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpdi0+dHNfb2Zmc2V0ID0gZ192YWx1ZV9nZXRfaW50NjQgKHZhbHVlKTsKKyAgICAgICAgcHJpdi0+dHNfb2Zmc2V0X3JlbWFpbmRlciA9IDA7CisgICAgICB9CisgICAgICBwcml2LT50c19kaXNjb250ID0gVFJVRTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfVFNfT0ZGU0VUX0FESlVTVE1FTlQ6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgcHJpdi0+bWF4X3RzX29mZnNldF9hZGp1c3RtZW50ID0gZ192YWx1ZV9nZXRfdWludDY0ICh2YWx1ZSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRE9fTE9TVDoKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBwcml2LT5kb19sb3N0ID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01PREU6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgcnRwX2ppdHRlcl9idWZmZXJfc2V0X21vZGUgKHByaXYtPmpidWYsIGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRE9fUkVUUkFOU01JU1NJT046CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgcHJpdi0+ZG9fcmV0cmFuc21pc3Npb24gPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRYX05FWFRfU0VRTlVNOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIHByaXYtPnJ0eF9uZXh0X3NlcW51bSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVFhfREVMQVk6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgcHJpdi0+cnR4X2RlbGF5ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRYX01JTl9ERUxBWToKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBwcml2LT5ydHhfbWluX2RlbGF5ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUWF9ERUxBWV9SRU9SREVSOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIHByaXYtPnJ0eF9kZWxheV9yZW9yZGVyID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRYX1JFVFJZX1RJTUVPVVQ6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgcHJpdi0+cnR4X3JldHJ5X3RpbWVvdXQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVFhfTUlOX1JFVFJZX1RJTUVPVVQ6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgcHJpdi0+cnR4X21pbl9yZXRyeV90aW1lb3V0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRYX1JFVFJZX1BFUklPRDoKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBwcml2LT5ydHhfcmV0cnlfcGVyaW9kID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRYX01BWF9SRVRSSUVTOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIHByaXYtPnJ0eF9tYXhfcmV0cmllcyA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUWF9ERUFETElORToKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBwcml2LT5ydHhfZGVhZGxpbmVfbXMgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVFhfU1RBVFNfVElNRU9VVDoKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBwcml2LT5ydHhfc3RhdHNfdGltZW91dCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIHByaXYtPm1heF9ydGNwX3J0cF90aW1lX2RpZmYgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfRFJPUE9VVF9USU1FOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIHByaXYtPm1heF9kcm9wb3V0X3RpbWUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX01JU09SREVSX1RJTUU6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgcHJpdi0+bWF4X21pc29yZGVyX3RpbWUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkZDNzI3M19TWU5DOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX3NldF9yZmM3MjczX3N5bmMgKHByaXYtPmpidWYsCisgICAgICAgICAgZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpKTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GQVNUU1RBUlRfTUlOX1BBQ0tFVFM6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgcHJpdi0+ZmFzdHN0YXJ0X21pbl9wYWNrZXRzID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXIgKmppdHRlcmJ1ZmZlcjsKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKworICBqaXR0ZXJidWZmZXIgPSBHU1RfUlRQX0pJVFRFUl9CVUZGRVIgKG9iamVjdCk7CisgIHByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xBVEVOQ1k6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHByaXYtPmxhdGVuY3lfbXMpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RST1BfT05fTEFURU5DWToKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcHJpdi0+ZHJvcF9vbl9sYXRlbmN5KTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UU19PRkZTRVQ6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfaW50NjQgKHZhbHVlLCBwcml2LT50c19vZmZzZXQpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9UU19PRkZTRVRfQURKVVNUTUVOVDoKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCBwcml2LT5tYXhfdHNfb2Zmc2V0X2FkanVzdG1lbnQpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RPX0xPU1Q6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHByaXYtPmRvX2xvc3QpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01PREU6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHJ0cF9qaXR0ZXJfYnVmZmVyX2dldF9tb2RlIChwcml2LT5qYnVmKSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUEVSQ0VOVDoKKyAgICB7CisgICAgICBnaW50IHBlcmNlbnQ7CisKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBpZiAocHJpdi0+c3JjcmVzdWx0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICBwZXJjZW50ID0gMTAwOworICAgICAgZWxzZQorICAgICAgICBwZXJjZW50ID0gcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3BlcmNlbnQgKHByaXYtPmpidWYpOworCisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBwZXJjZW50KTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfRE9fUkVUUkFOU01JU1NJT046CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHByaXYtPmRvX3JldHJhbnNtaXNzaW9uKTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVFhfTkVYVF9TRVFOVU06CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHByaXYtPnJ0eF9uZXh0X3NlcW51bSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRYX0RFTEFZOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHByaXYtPnJ0eF9kZWxheSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRYX01JTl9ERUxBWToKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcHJpdi0+cnR4X21pbl9kZWxheSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRYX0RFTEFZX1JFT1JERVI6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgcHJpdi0+cnR4X2RlbGF5X3Jlb3JkZXIpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUWF9SRVRSWV9USU1FT1VUOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHByaXYtPnJ0eF9yZXRyeV90aW1lb3V0KTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVFhfTUlOX1JFVFJZX1RJTUVPVVQ6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgcHJpdi0+cnR4X21pbl9yZXRyeV90aW1lb3V0KTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVFhfUkVUUllfUEVSSU9EOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHByaXYtPnJ0eF9yZXRyeV9wZXJpb2QpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUWF9NQVhfUkVUUklFUzoKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBwcml2LT5ydHhfbWF4X3JldHJpZXMpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUWF9ERUFETElORToKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBwcml2LT5ydHhfZGVhZGxpbmVfbXMpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUWF9TVEFUU19USU1FT1VUOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBwcml2LT5ydHhfc3RhdHNfdGltZW91dCk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1RBVFM6CisgICAgICBnX3ZhbHVlX3Rha2VfYm94ZWQgKHZhbHVlLAorICAgICAgICAgIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jcmVhdGVfc3RhdHMgKGppdHRlcmJ1ZmZlcikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9SVENQX1JUUF9USU1FX0RJRkY6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgcHJpdi0+bWF4X3J0Y3BfcnRwX3RpbWVfZGlmZik7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX0RST1BPVVRfVElNRToKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcHJpdi0+bWF4X2Ryb3BvdXRfdGltZSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX01JU09SREVSX1RJTUU6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHByaXYtPm1heF9taXNvcmRlcl90aW1lKTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRkM3MjczX1NZTkM6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsCisgICAgICAgICAgcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3JmYzcyNzNfc3luYyAocHJpdi0+amJ1ZikpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZBU1RTVEFSVF9NSU5fUEFDS0VUUzoKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcHJpdi0+ZmFzdHN0YXJ0X21pbl9wYWNrZXRzKTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdFN0cnVjdHVyZSAqCitnc3RfcnRwX2ppdHRlcl9idWZmZXJfY3JlYXRlX3N0YXRzIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqYnVmKQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2ID0gamJ1Zi0+cHJpdjsKKyAgR3N0U3RydWN0dXJlICpzOworCisgIEpCVUZfTE9DSyAocHJpdik7CisgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLWppdHRlcmJ1ZmZlci1zdGF0cyIsCisgICAgICAibnVtLXB1c2hlZCIsIEdfVFlQRV9VSU5UNjQsIHByaXYtPm51bV9wdXNoZWQsCisgICAgICAibnVtLWxvc3QiLCBHX1RZUEVfVUlOVDY0LCBwcml2LT5udW1fbG9zdCwKKyAgICAgICJudW0tbGF0ZSIsIEdfVFlQRV9VSU5UNjQsIHByaXYtPm51bV9sYXRlLAorICAgICAgIm51bS1kdXBsaWNhdGVzIiwgR19UWVBFX1VJTlQ2NCwgcHJpdi0+bnVtX2R1cGxpY2F0ZXMsCisgICAgICAiYXZnLWppdHRlciIsIEdfVFlQRV9VSU5UNjQsIHByaXYtPmF2Z19qaXR0ZXIsCisgICAgICAicnR4LWNvdW50IiwgR19UWVBFX1VJTlQ2NCwgcHJpdi0+bnVtX3J0eF9yZXF1ZXN0cywKKyAgICAgICJydHgtc3VjY2Vzcy1jb3VudCIsIEdfVFlQRV9VSU5UNjQsIHByaXYtPm51bV9ydHhfc3VjY2VzcywKKyAgICAgICJydHgtcGVyLXBhY2tldCIsIEdfVFlQRV9ET1VCTEUsIHByaXYtPmF2Z19ydHhfbnVtLAorICAgICAgInJ0eC1ydHQiLCBHX1RZUEVfVUlOVDY0LCBwcml2LT5hdmdfcnR4X3J0dCwgTlVMTCk7CisgIEpCVUZfVU5MT0NLIChwcml2KTsKKworICByZXR1cm4gczsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5oIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGViYjEzYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBGYXJzaWdodCBWb2ljZStWaWRlbyBsaWJyYXJ5CisgKgorICogIENvcHlyaWdodCAyMDA3IENvbGxhYm9yYSBMdGQsIAorICogIENvcHlyaWdodCAyMDA3IE5va2lhIENvcnBvcmF0aW9uCisgKiAgIEBhdXRob3I6IFBoaWxpcHBlIEthbGFmIDxwaGlsaXBwZS5rYWxhZkBjb2xsYWJvcmEuY28udWs+LgorICogIENvcHlyaWdodCAyMDA3IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0pJVFRFUl9CVUZGRVJfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9KSVRURVJfQlVGRkVSX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworLyogI2RlZmluZSdzIGRvbid0IGxpa2Ugd2hpdGVzcGFjZXkgYml0cyAqLworI2RlZmluZSBHU1RfVFlQRV9SVFBfSklUVEVSX0JVRkZFUiBcCisgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9KSVRURVJfQlVGRkVSKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksIFwKKyAgR1NUX1RZUEVfUlRQX0pJVFRFUl9CVUZGRVIsR3N0UnRwSml0dGVyQnVmZmVyKSkKKyNkZWZpbmUgR1NUX1JUUF9KSVRURVJfQlVGRkVSX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLCBcCisgIEdTVF9UWVBFX1JUUF9KSVRURVJfQlVGRkVSLEdzdFJ0cEppdHRlckJ1ZmZlckNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9KSVRURVJfQlVGRkVSKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0pJVFRFUl9CVUZGRVIpKQorI2RlZmluZSBHU1RfSVNfUlRQX0pJVFRFUl9CVUZGRVJfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9KSVRURVJfQlVGRkVSKSkKKyNkZWZpbmUgR1NUX1JUUF9KSVRURVJfQlVGRkVSX0NBU1Qob2JqKSBcCisgICgoR3N0UnRwSml0dGVyQnVmZmVyICopKG9iaikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBKaXR0ZXJCdWZmZXIgR3N0UnRwSml0dGVyQnVmZmVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEppdHRlckJ1ZmZlckNsYXNzIEdzdFJ0cEppdHRlckJ1ZmZlckNsYXNzOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZTsKKworLyoqCisgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6CisgKgorICogT3BhcXVlIGppdHRlcmJ1ZmZlciBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0UnRwSml0dGVyQnVmZmVyCit7CisgIEdzdEVsZW1lbnQgcGFyZW50OworCisgIC8qPCBwcml2YXRlID4qLworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2OyAvKiBGSVhNRTogcmVtb3ZlPyAqLworfTsKKworc3RydWN0IF9Hc3RSdHBKaXR0ZXJCdWZmZXJDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworCisgIC8qIHNpZ25hbHMgKi8KKyAgR3N0Q2FwcyogKCpyZXF1ZXN0X3B0X21hcCkgICAoR3N0UnRwSml0dGVyQnVmZmVyICpidWZmZXIsIGd1aW50IHB0KTsKKworICB2b2lkICAgICAoKmhhbmRsZV9zeW5jKSAgICAgIChHc3RSdHBKaXR0ZXJCdWZmZXIgKmJ1ZmZlciwgR3N0U3RydWN0dXJlICpzKTsKKyAgdm9pZCAgICAgKCpvbl9ucHRfc3RvcCkgICAgICAoR3N0UnRwSml0dGVyQnVmZmVyICpidWZmZXIpOworCisgIC8qIGFjdGlvbnMgKi8KKyAgdm9pZCAgICAgKCpjbGVhcl9wdF9tYXApICAgKEdzdFJ0cEppdHRlckJ1ZmZlciAqYnVmZmVyKTsKKworICBHc3RDbG9ja1RpbWUgKCpzZXRfYWN0aXZlKSAgICAgKEdzdFJ0cEppdHRlckJ1ZmZlciAqYnVmZmVyLCBnYm9vbGVhbiBhY3RpdmUsIGd1aW50NjQgZWxhcHNlZCk7Cit9OworCitHVHlwZSBnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0pJVFRFUl9CVUZGRVJfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9nc3RydHBtYW5hZ2VyLmMgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBtYW5hZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI2YjBiNwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cG1hbmFnZXIuYwpAQCAtMCwwICsxLDc5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0cnRwYmluLmgiCisjaW5jbHVkZSAiZ3N0cnRwaml0dGVyYnVmZmVyLmgiCisjaW5jbHVkZSAiZ3N0cnRwcHRkZW11eC5oIgorI2luY2x1ZGUgImdzdHJ0cHNlc3Npb24uaCIKKyNpbmNsdWRlICJnc3RydHBydHhxdWV1ZS5oIgorI2luY2x1ZGUgImdzdHJ0cHJ0eHJlY2VpdmUuaCIKKyNpbmNsdWRlICJnc3RydHBydHhzZW5kLmgiCisjaW5jbHVkZSAiZ3N0cnRwc3NyY2RlbXV4LmgiCisjaW5jbHVkZSAiZ3N0cnRwZHRtZm11eC5oIgorI2luY2x1ZGUgImdzdHJ0cG11eC5oIgorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGJpbiIsIEdTVF9SQU5LX05PTkUsIEdTVF9UWVBFX1JUUF9CSU4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBqaXR0ZXJidWZmZXIiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX1JUUF9KSVRURVJfQlVGRkVSKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwcHRkZW11eCIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfUlRQX1BUX0RFTVVYKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwc2Vzc2lvbiIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfUlRQX1NFU1NJT04pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfcnR4X3F1ZXVlX3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfcnR4X3JlY2VpdmVfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9ydHhfc2VuZF9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwc3NyY2RlbXV4IiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9SVFBfU1NSQ19ERU1VWCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9tdXhfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9kdG1mX211eF9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBydHBtYW5hZ2VyLAorICAgICJSVFAgc2Vzc2lvbiBtYW5hZ2VtZW50IHBsdWdpbiBsaWJyYXJ5IiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgIkxHUEwiLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NmU1NzAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYwpAQCAtMCwwICsxLDEwMDkgQEAKKy8qIFJUUCBtdXhlciBlbGVtZW50IGZvciBHU3RyZWFtZXIKKyAqCisgKiBnc3RydHBtdXguYzoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3LTIwMTA+IE5va2lhIENvcnBvcmF0aW9uLgorICogICBDb250YWN0OiBaZWVzaGFuIEFsaSA8emVlc2hhbi5hbGlAbm9raWEuY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAwNy0yMDEwPiBDb2xsYWJvcmEgTHRkCisgKiAgIENvbnRhY3Q6IE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgMjAwMCwyMDA1IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwbXV4CisgKiBAc2VlX2Fsc286IHJ0cGR0bWZtdXgKKyAqCisgKiBUaGUgcnRwIG11eGVyIHRha2VzIG11bHRpcGxlIFJUUCBzdHJlYW1zIGhhdmluZyB0aGUgc2FtZSBjbG9jay1yYXRlIGFuZAorICogbXV4ZXMgaW50byBhIHNpbmdsZSBzdHJlYW0gd2l0aCBhIHNpbmdsZSBTU1JDLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgcnRwbXV4IG5hbWU9bXV4ICEgdWRwc2luayBob3N0PTEyNy4wLjAuMSBwb3J0PTg4ODggICAgICAgIFwKKyAqICAgICAgICAgICAgICBhbHNhc3JjICEgYWxhd2VuYyAhIHJ0cHBjbWFwYXkgISAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAqICAgICAgICAgICAgICBhcHBsaWNhdGlvbi94LXJ0cCwgcGF5bG9hZD04LCByYXRlPTgwMDAgISBtdXguc2lua18wICAgIFwKKyAqICAgICAgICAgICAgICBhdWRpb3Rlc3RzcmMgaXMtbGl2ZT0xICEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAqICAgICAgICAgICAgICBtdWxhd2VuYyAhIHJ0cHBjbXVwYXkgISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAqICAgICAgICAgICAgICBhcHBsaWNhdGlvbi94LXJ0cCwgcGF5bG9hZD0wLCByYXRlPTgwMDAgISBtdXguc2lua18xCisgKiBdfAorICogSW4gdGhpcyBleGFtcGxlLCBhbiBhdWRpbyBzdHJlYW0gaXMgY2FwdHVyZWQgZnJvbSBBTFNBIGFuZCBhbm90aGVyIGlzCisgKiBnZW5lcmF0ZWQsIGJvdGggYXJlIGVuY29kZWQgaW50byBkaWZmZXJlbnQgcGF5bG9hZCB0eXBlcyBhbmQgbXV4ZWQgdG9nZXRoZXIKKyAqIHNvIHRoZXkgY2FuIGJlIHNlbnQgb24gdGhlIHNhbWUgcG9ydC4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RydHBtdXguaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3J0cF9tdXhfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3J0cF9tdXhfZGVidWcKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfVElNRVNUQU1QX09GRlNFVCwKKyAgUFJPUF9TRVFOVU1fT0ZGU0VULAorICBQUk9QX1NFUU5VTSwKKyAgUFJPUF9TU1JDCit9OworCisjZGVmaW5lIERFRkFVTFRfVElNRVNUQU1QX09GRlNFVCAtMQorI2RlZmluZSBERUZBVUxUX1NFUU5VTV9PRkZTRVQgICAgLTEKKyNkZWZpbmUgREVGQVVMVF9TU1JDICAgICAgICAgICAgIC0xCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2lua18ldSIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfUkVRVUVTVCwKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCIpCisgICAgKTsKKworc3RhdGljIEdzdFBhZCAqZ3N0X3J0cF9tdXhfcmVxdWVzdF9uZXdfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLCBjb25zdCBnY2hhciAqIG5hbWUsIGNvbnN0IEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfbXV4X3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfbXV4X2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9tdXhfY2hhaW5fbGlzdCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyTGlzdCAqIGJ1ZmZlcmxpc3QpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfbXV4X3NldGNhcHMgKEdzdFBhZCAqIHBhZCwgR3N0UlRQTXV4ICogcnRwX211eCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9tdXhfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9tdXhfc2lua19xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0UXVlcnkgKiBxdWVyeSk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX211eF9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKgorICAgIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX211eF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX211eF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX211eF9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfbXV4X3NyY19ldmVudF9yZWFsIChHc3RSVFBNdXggKiBydHBfbXV4LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCitHX0RFRklORV9UWVBFIChHc3RSVFBNdXgsIGdzdF9ydHBfbXV4LCBHU1RfVFlQRV9FTEVNRU5UKTsKKworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tdXhfY2xhc3NfaW5pdCAoR3N0UlRQTXV4Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua19mYWN0b3J5KTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUlRQIG11eGVyIiwKKyAgICAgICJDb2RlYy9NdXhlciIsCisgICAgICAibXVsdGlwbGV4IE4gcnRwIHN0cmVhbXMgaW50byBvbmUiLCAiWmVlc2hhbiBBbGkgPGZpcnN0Lmxhc3RAbm9raWEuY29tPiIpOworCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9ydHBfbXV4X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9tdXhfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X3J0cF9tdXhfZGlzcG9zZTsKKworICBrbGFzcy0+c3JjX2V2ZW50ID0gZ3N0X3J0cF9tdXhfc3JjX2V2ZW50X3JlYWw7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIFBST1BfVElNRVNUQU1QX09GRlNFVCwgZ19wYXJhbV9zcGVjX2ludCAoInRpbWVzdGFtcC1vZmZzZXQiLAorICAgICAgICAgICJUaW1lc3RhbXAgT2Zmc2V0IiwKKyAgICAgICAgICAiT2Zmc2V0IHRvIGFkZCB0byBhbGwgb3V0Z29pbmcgdGltZXN0YW1wcyAoLTEgPSByYW5kb20pIiwgLTEsCisgICAgICAgICAgR19NQVhJTlQsIERFRkFVTFRfVElNRVNUQU1QX09GRlNFVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9TRVFOVU1fT0ZGU0VULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInNlcW51bS1vZmZzZXQiLCAiU2VxdWVuY2UgbnVtYmVyIE9mZnNldCIsCisgICAgICAgICAgIk9mZnNldCB0byBhZGQgdG8gYWxsIG91dGdvaW5nIHNlcW51bSAoLTEgPSByYW5kb20pIiwgLTEsIEdfTUFYSU5ULAorICAgICAgICAgIERFRkFVTFRfU0VRTlVNX09GRlNFVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfU0VRTlVNLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJzZXFudW0iLCAiU2VxdWVuY2UgbnVtYmVyIiwKKyAgICAgICAgICAiVGhlIFJUUCBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGxhc3QgcHJvY2Vzc2VkIHBhY2tldCIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCAwLCBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1NTUkMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInNzcmMiLCAiU1NSQyIsCisgICAgICAgICAgIlRoZSBTU1JDIG9mIHRoZSBwYWNrZXRzIChkZWZhdWx0ID09IHJhbmRvbSkiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVCwgREVGQVVMVF9TU1JDLAorICAgICAgICAgIEdTVF9QQVJBTV9NVVRBQkxFX1BMQVlJTkcgfCBHX1BBUkFNX1JFQURXUklURSB8CisgICAgICAgICAgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPnJlcXVlc3RfbmV3X3BhZCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9tdXhfcmVxdWVzdF9uZXdfcGFkKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cmVsZWFzZV9wYWQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9tdXhfcmVsZWFzZV9wYWQpOworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9tdXhfY2hhbmdlX3N0YXRlKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXV4X2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJUUE11eCAqcnRwX211eCA9IEdTVF9SVFBfTVVYIChvYmplY3QpOworICBHTGlzdCAqaXRlbTsKKworICBnX2NsZWFyX29iamVjdCAoJnJ0cF9tdXgtPmxhc3RfcGFkKTsKKworcmVzdGFydDoKKyAgZm9yIChpdGVtID0gR1NUX0VMRU1FTlRfUEFEUyAob2JqZWN0KTsgaXRlbTsgaXRlbSA9IGdfbGlzdF9uZXh0IChpdGVtKSkgeworICAgIEdzdFBhZCAqcGFkID0gR1NUX1BBRCAoaXRlbS0+ZGF0YSk7CisgICAgaWYgKEdTVF9QQURfSVNfU0lOSyAocGFkKSkgeworICAgICAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAoR1NUX0VMRU1FTlQgKG9iamVjdCksIHBhZCk7CisgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgfQorICB9CisKKyAgR19PQkpFQ1RfQ0xBU1MgKGdzdF9ydHBfbXV4X3BhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tdXhfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UlRQTXV4ICpydHBfbXV4ID0gR1NUX1JUUF9NVVggKHBhcmVudCk7CisgIEdzdFJUUE11eENsYXNzICprbGFzczsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIGtsYXNzID0gR1NUX1JUUF9NVVhfR0VUX0NMQVNTIChydHBfbXV4KTsKKworICByZXQgPSBrbGFzcy0+c3JjX2V2ZW50IChydHBfbXV4LCBldmVudCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX211eF9zcmNfZXZlbnRfcmVhbCAoR3N0UlRQTXV4ICogcnRwX211eCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNOgorICAgIHsKKyAgICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChldmVudCk7CisKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiR3N0UlRQQ29sbGlzaW9uIikpIHsKKyAgICAgICAgZ3VpbnQgc3NyYyA9IDA7CisKKyAgICAgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF91aW50IChzLCAic3NyYyIsICZzc3JjKSkKKyAgICAgICAgICBzc3JjID0gLTE7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwX211eCwgImNvbGxpZGVkIHNzcmM6ICUiIEdfR1VJTlQzMl9GT1JNQVQsIHNzcmMpOworCisgICAgICAgIC8qIGNob29zZSBhbm90aGVyIHNzcmMgZm9yIG91ciBzdHJlYW0gKi8KKyAgICAgICAgR1NUX09CSkVDVF9MT0NLIChydHBfbXV4KTsKKyAgICAgICAgaWYgKHNzcmMgPT0gcnRwX211eC0+Y3VycmVudF9zc3JjKSB7CisgICAgICAgICAgR3N0Q2FwcyAqY2FwczsKKyAgICAgICAgICBndWludCBzdWdnZXN0ZWRfc3NyYyA9IDA7CisgICAgICAgICAgZ3VpbnQzMiBuZXdfc3NyYzsKKworICAgICAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF91aW50IChzLCAic3VnZ2VzdGVkLXNzcmMiLCAmc3VnZ2VzdGVkX3NzcmMpKQorICAgICAgICAgICAgcnRwX211eC0+Y3VycmVudF9zc3JjID0gc3VnZ2VzdGVkX3NzcmM7CisKKyAgICAgICAgICB3aGlsZSAoc3NyYyA9PSBydHBfbXV4LT5jdXJyZW50X3NzcmMpCisgICAgICAgICAgICBydHBfbXV4LT5jdXJyZW50X3NzcmMgPSBnX3JhbmRvbV9pbnQgKCk7CisKKyAgICAgICAgICBuZXdfc3NyYyA9IHJ0cF9tdXgtPmN1cnJlbnRfc3NyYzsKKyAgICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwX211eCk7CisKKyAgICAgICAgICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChydHBfbXV4LT5zcmNwYWQpOworICAgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChjYXBzKTsKKyAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAic3NyYyIsIEdfVFlQRV9VSU5ULCBuZXdfc3NyYywgTlVMTCk7CisgICAgICAgICAgZ3N0X3BhZF9zZXRfY2FwcyAocnRwX211eC0+c3JjcGFkLCBjYXBzKTsKKyAgICAgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0cF9tdXgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKworICByZXR1cm4gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChydHBfbXV4LT5zcmNwYWQsIEdTVF9PQkpFQ1QgKHJ0cF9tdXgpLCBldmVudCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX211eF9pbml0IChHc3RSVFBNdXggKiBydHBfbXV4KQoreworICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChydHBfbXV4KTsKKworICBydHBfbXV4LT5zcmNwYWQgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV90ZW1wbGF0ZSAoZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsCisgICAgICAgICAgInNyYyIpLCAic3JjIik7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChydHBfbXV4LT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9tdXhfc3JjX2V2ZW50KSk7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKHJ0cF9tdXgtPnNyY3BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChydHBfbXV4KSwgcnRwX211eC0+c3JjcGFkKTsKKworICBydHBfbXV4LT5zc3JjID0gREVGQVVMVF9TU1JDOworICBydHBfbXV4LT5jdXJyZW50X3NzcmMgPSBERUZBVUxUX1NTUkM7CisgIHJ0cF9tdXgtPnNzcmNfcmFuZG9tID0gVFJVRTsKKyAgcnRwX211eC0+dHNfb2Zmc2V0ID0gREVGQVVMVF9USU1FU1RBTVBfT0ZGU0VUOworICBydHBfbXV4LT5zZXFudW1fb2Zmc2V0ID0gREVGQVVMVF9TRVFOVU1fT0ZGU0VUOworCisgIHJ0cF9tdXgtPmxhc3Rfc3RvcCA9IEdTVF9DTE9DS19USU1FX05PTkU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX211eF9zZXR1cF9zaW5rcGFkIChHc3RSVFBNdXggKiBydHBfbXV4LCBHc3RQYWQgKiBzaW5rcGFkKQoreworICBHc3RSVFBNdXhQYWRQcml2YXRlICpwYWRwcml2ID0gZ19zbGljZV9uZXcwIChHc3RSVFBNdXhQYWRQcml2YXRlKTsKKworICAvKiBzZXR1cCBzb21lIHBhZCBmdW5jdGlvbnMgKi8KKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHNpbmtwYWQsIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX211eF9jaGFpbikpOworICBnc3RfcGFkX3NldF9jaGFpbl9saXN0X2Z1bmN0aW9uIChzaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfbXV4X2NoYWluX2xpc3QpKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9tdXhfc2lua19ldmVudCkpOworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAoc2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX211eF9zaW5rX3F1ZXJ5KSk7CisKKworICBnc3Rfc2VnbWVudF9pbml0ICgmcGFkcHJpdi0+c2VnbWVudCwgR1NUX0ZPUk1BVF9VTkRFRklORUQpOworCisgIGdzdF9wYWRfc2V0X2VsZW1lbnRfcHJpdmF0ZSAoc2lua3BhZCwgcGFkcHJpdik7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzaW5rcGFkLCBUUlVFKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKHJ0cF9tdXgpLCBzaW5rcGFkKTsKK30KKworc3RhdGljIEdzdFBhZCAqCitnc3RfcnRwX211eF9yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsIGNvbnN0IGdjaGFyICogcmVxX25hbWUsIGNvbnN0IEdzdENhcHMgKiBjYXBzKQoreworICBHc3RSVFBNdXggKnJ0cF9tdXg7CisgIEdzdFBhZCAqbmV3cGFkOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsICh0ZW1wbCAhPSBOVUxMLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9JU19SVFBfTVVYIChlbGVtZW50KSwgTlVMTCk7CisKKyAgcnRwX211eCA9IEdTVF9SVFBfTVVYIChlbGVtZW50KTsKKworICBpZiAodGVtcGwtPmRpcmVjdGlvbiAhPSBHU1RfUEFEX1NJTkspIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cF9tdXgsICJyZXF1ZXN0IHBhZCB0aGF0IGlzIG5vdCBhIFNJTksgcGFkIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBuZXdwYWQgPSBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlICh0ZW1wbCwgcmVxX25hbWUpOworICBpZiAobmV3cGFkKQorICAgIGdzdF9ydHBfbXV4X3NldHVwX3NpbmtwYWQgKHJ0cF9tdXgsIG5ld3BhZCk7CisgIGVsc2UKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cF9tdXgsICJmYWlsZWQgdG8gY3JlYXRlIHJlcXVlc3QgcGFkIik7CisKKyAgcmV0dXJuIG5ld3BhZDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXV4X3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKQoreworICBHc3RSVFBNdXhQYWRQcml2YXRlICpwYWRwcml2OworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZWxlbWVudCk7CisgIHBhZHByaXYgPSBnc3RfcGFkX2dldF9lbGVtZW50X3ByaXZhdGUgKHBhZCk7CisgIGdzdF9wYWRfc2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkLCBOVUxMKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGVsZW1lbnQpOworCisgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKGVsZW1lbnQsIHBhZCk7CisKKyAgaWYgKHBhZHByaXYpIHsKKyAgICBnX3NsaWNlX2ZyZWUgKEdzdFJUUE11eFBhZFByaXZhdGUsIHBhZHByaXYpOworICB9Cit9CisKKy8qIFB1dCBvdXIgb3duIHRpbWVzdGFtcC1vZmZzZXQgb24gdGhlIGJ1ZmZlciAqLworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXV4X3JlYWRqdXN0X3J0cF90aW1lc3RhbXBfbG9ja2VkIChHc3RSVFBNdXggKiBydHBfbXV4LAorICAgIEdzdFJUUE11eFBhZFByaXZhdGUgKiBwYWRwcml2LCBHc3RSVFBCdWZmZXIgKiBydHBidWZmZXIpCit7CisgIGd1aW50MzIgdHM7CisgIGd1aW50MzIgc2lua190c19iYXNlID0gMDsKKworICBpZiAocGFkcHJpdiAmJiBwYWRwcml2LT5oYXZlX3RpbWVzdGFtcF9vZmZzZXQpCisgICAgc2lua190c19iYXNlID0gcGFkcHJpdi0+dGltZXN0YW1wX29mZnNldDsKKworICB0cyA9IGdzdF9ydHBfYnVmZmVyX2dldF90aW1lc3RhbXAgKHJ0cGJ1ZmZlcikgLSBzaW5rX3RzX2Jhc2UgKworICAgICAgcnRwX211eC0+dHNfYmFzZTsKKyAgR1NUX0xPR19PQkpFQ1QgKHJ0cF9tdXgsICJSZS1hZGp1c3RpbmcgUlRQIHRzICV1IHRvICV1IiwKKyAgICAgIGdzdF9ydHBfYnVmZmVyX2dldF90aW1lc3RhbXAgKHJ0cGJ1ZmZlciksIHRzKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3RpbWVzdGFtcCAocnRwYnVmZmVyLCB0cyk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcHJvY2Vzc19idWZmZXJfbG9ja2VkIChHc3RSVFBNdXggKiBydHBfbXV4LCBHc3RSVFBNdXhQYWRQcml2YXRlICogcGFkcHJpdiwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHBidWZmZXIpCit7CisgIEdzdFJUUE11eENsYXNzICprbGFzcyA9IEdTVF9SVFBfTVVYX0dFVF9DTEFTUyAocnRwX211eCk7CisKKyAgaWYgKGtsYXNzLT5hY2NlcHRfYnVmZmVyX2xvY2tlZCkKKyAgICBpZiAoIWtsYXNzLT5hY2NlcHRfYnVmZmVyX2xvY2tlZCAocnRwX211eCwgcGFkcHJpdiwgcnRwYnVmZmVyKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICBydHBfbXV4LT5zZXFudW0rKzsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3NlcSAocnRwYnVmZmVyLCBydHBfbXV4LT5zZXFudW0pOworCisgIGdzdF9ydHBfYnVmZmVyX3NldF9zc3JjIChydHBidWZmZXIsIHJ0cF9tdXgtPmN1cnJlbnRfc3NyYyk7CisgIGdzdF9ydHBfbXV4X3JlYWRqdXN0X3J0cF90aW1lc3RhbXBfbG9ja2VkIChydHBfbXV4LCBwYWRwcml2LCBydHBidWZmZXIpOworICBHU1RfTE9HX09CSkVDVCAocnRwX211eCwKKyAgICAgICJQdXNoaW5nIHBhY2tldCBzaXplICUiIEdfR1NJWkVfRk9STUFUICIsIHNlcT0lZCwgdHM9JXUiLAorICAgICAgcnRwYnVmZmVyLT5tYXBbMF0uc2l6ZSwgcnRwX211eC0+c2VxbnVtLAorICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X3RpbWVzdGFtcCAocnRwYnVmZmVyKSk7CisKKyAgaWYgKHBhZHByaXYpIHsKKyAgICBpZiAocGFkcHJpdi0+c2VnbWVudC5mb3JtYXQgPT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICBHU1RfQlVGRkVSX1BUUyAocnRwYnVmZmVyLT5idWZmZXIpID0KKyAgICAgICAgICBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZwYWRwcml2LT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgR1NUX0JVRkZFUl9QVFMgKHJ0cGJ1ZmZlci0+YnVmZmVyKSk7CisgICAgICBHU1RfQlVGRkVSX0RUUyAocnRwYnVmZmVyLT5idWZmZXIpID0KKyAgICAgICAgICBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZwYWRwcml2LT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgR1NUX0JVRkZFUl9EVFMgKHJ0cGJ1ZmZlci0+YnVmZmVyKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0cnVjdCBCdWZmZXJMaXN0RGF0YQoreworICBHc3RSVFBNdXggKnJ0cF9tdXg7CisgIEdzdFJUUE11eFBhZFByaXZhdGUgKnBhZHByaXY7CisgIGdib29sZWFuIGRyb3A7Cit9OworCitzdGF0aWMgZ2Jvb2xlYW4KK3Byb2Nlc3NfbGlzdF9pdGVtIChHc3RCdWZmZXIgKiogYnVmZmVyLCBndWludCBpZHgsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgc3RydWN0IEJ1ZmZlckxpc3REYXRhICpiZCA9IHVzZXJfZGF0YTsKKyAgR3N0UlRQQnVmZmVyIHJ0cGJ1ZmZlciA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisKKyAgKmJ1ZmZlciA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoKmJ1ZmZlcik7CisKKyAgZ3N0X3J0cF9idWZmZXJfbWFwICgqYnVmZmVyLCBHU1RfTUFQX1JFQURXUklURSwgJnJ0cGJ1ZmZlcik7CisKKyAgYmQtPmRyb3AgPSAhcHJvY2Vzc19idWZmZXJfbG9ja2VkIChiZC0+cnRwX211eCwgYmQtPnBhZHByaXYsICZydHBidWZmZXIpOworCisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwYnVmZmVyKTsKKworICBpZiAoYmQtPmRyb3ApCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChHU1RfQlVGRkVSX0RVUkFUSU9OX0lTX1ZBTElEICgqYnVmZmVyKSAmJgorICAgICAgR1NUX0JVRkZFUl9QVFNfSVNfVkFMSUQgKCpidWZmZXIpKQorICAgIGJkLT5ydHBfbXV4LT5sYXN0X3N0b3AgPSBHU1RfQlVGRkVSX1BUUyAoKmJ1ZmZlcikgKworICAgICAgICBHU1RfQlVGRkVSX0RVUkFUSU9OICgqYnVmZmVyKTsKKyAgZWxzZQorICAgIGJkLT5ydHBfbXV4LT5sYXN0X3N0b3AgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4gcmVzZW5kX2V2ZW50cyAoR3N0UGFkICogcGFkLCBHc3RFdmVudCAqKiBldmVudCwKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9tdXhfY2hhaW5fbGlzdCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyTGlzdCAqIGJ1ZmZlcmxpc3QpCit7CisgIEdzdFJUUE11eCAqcnRwX211eDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdFJUUE11eFBhZFByaXZhdGUgKnBhZHByaXY7CisgIGdib29sZWFuIGNoYW5nZWQgPSBGQUxTRTsKKyAgc3RydWN0IEJ1ZmZlckxpc3REYXRhIGJkOworCisgIHJ0cF9tdXggPSBHU1RfUlRQX01VWCAocGFyZW50KTsKKworICBpZiAoZ3N0X3BhZF9jaGVja19yZWNvbmZpZ3VyZSAocnRwX211eC0+c3JjcGFkKSkgeworICAgIEdzdENhcHMgKmN1cnJlbnRfY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAocGFkKTsKKworICAgIGlmICghZ3N0X3J0cF9tdXhfc2V0Y2FwcyAocGFkLCBydHBfbXV4LCBjdXJyZW50X2NhcHMpKSB7CisgICAgICBnc3RfcGFkX21hcmtfcmVjb25maWd1cmUgKHJ0cF9tdXgtPnNyY3BhZCk7CisgICAgICBpZiAoR1NUX1BBRF9JU19GTFVTSElORyAocnRwX211eC0+c3JjcGFkKSkKKyAgICAgICAgcmV0ID0gR1NUX0ZMT1dfRkxVU0hJTkc7CisgICAgICBlbHNlCisgICAgICAgIHJldCA9IEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICAgICAgZ3N0X2J1ZmZlcl9saXN0X3VucmVmIChidWZmZXJsaXN0KTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBnc3RfY2Fwc191bnJlZiAoY3VycmVudF9jYXBzKTsKKyAgfQorCisgIEdTVF9PQkpFQ1RfTE9DSyAocnRwX211eCk7CisKKyAgcGFkcHJpdiA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgaWYgKCFwYWRwcml2KSB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0cF9tdXgpOworICAgIHJldCA9IEdTVF9GTE9XX05PVF9MSU5LRUQ7CisgICAgZ3N0X2J1ZmZlcl9saXN0X3VucmVmIChidWZmZXJsaXN0KTsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIGJkLnJ0cF9tdXggPSBydHBfbXV4OworICBiZC5wYWRwcml2ID0gcGFkcHJpdjsKKyAgYmQuZHJvcCA9IEZBTFNFOworCisgIGJ1ZmZlcmxpc3QgPSBnc3RfYnVmZmVyX2xpc3RfbWFrZV93cml0YWJsZSAoYnVmZmVybGlzdCk7CisgIGdzdF9idWZmZXJfbGlzdF9mb3JlYWNoIChidWZmZXJsaXN0LCBwcm9jZXNzX2xpc3RfaXRlbSwgJmJkKTsKKworICBpZiAoIWJkLmRyb3AgJiYgcGFkICE9IHJ0cF9tdXgtPmxhc3RfcGFkKSB7CisgICAgY2hhbmdlZCA9IFRSVUU7CisgICAgZ19jbGVhcl9vYmplY3QgKCZydHBfbXV4LT5sYXN0X3BhZCk7CisgICAgcnRwX211eC0+bGFzdF9wYWQgPSBnX29iamVjdF9yZWYgKHBhZCk7CisgIH0KKworICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwX211eCk7CisKKyAgaWYgKGNoYW5nZWQpCisgICAgZ3N0X3BhZF9zdGlja3lfZXZlbnRzX2ZvcmVhY2ggKHBhZCwgcmVzZW5kX2V2ZW50cywgcnRwX211eCk7CisKKyAgaWYgKGJkLmRyb3ApIHsKKyAgICBnc3RfYnVmZmVyX2xpc3RfdW5yZWYgKGJ1ZmZlcmxpc3QpOworICAgIHJldCA9IEdTVF9GTE9XX09LOworICB9IGVsc2UgeworICAgIHJldCA9IGdzdF9wYWRfcHVzaF9saXN0IChydHBfbXV4LT5zcmNwYWQsIGJ1ZmZlcmxpc3QpOworICB9CisKK291dDoKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3Jlc2VuZF9ldmVudHMgKEdzdFBhZCAqIHBhZCwgR3N0RXZlbnQgKiogZXZlbnQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0UlRQTXV4ICpydHBfbXV4ID0gdXNlcl9kYXRhOworCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoKmV2ZW50KSA9PSBHU1RfRVZFTlRfQ0FQUykgeworICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICBnc3RfZXZlbnRfcGFyc2VfY2FwcyAoKmV2ZW50LCAmY2Fwcyk7CisgICAgZ3N0X3J0cF9tdXhfc2V0Y2FwcyAocGFkLCBydHBfbXV4LCBjYXBzKTsKKyAgfSBlbHNlIGlmIChHU1RfRVZFTlRfVFlQRSAoKmV2ZW50KSA9PSBHU1RfRVZFTlRfU0VHTUVOVCkgeworICAgIEdzdFNlZ21lbnQgbmV3X3NlZ21lbnQ7CisgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJm5ld19zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocnRwX211eC0+c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZuZXdfc2VnbWVudCkpOworICB9IGVsc2UgeworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocnRwX211eC0+c3JjcGFkLCBnc3RfZXZlbnRfcmVmICgqZXZlbnQpKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9tdXhfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJUUE11eCAqcnRwX211eDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdFJUUE11eFBhZFByaXZhdGUgKnBhZHByaXY7CisgIGdib29sZWFuIGRyb3A7CisgIGdib29sZWFuIGNoYW5nZWQgPSBGQUxTRTsKKyAgR3N0UlRQQnVmZmVyIHJ0cGJ1ZmZlciA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisKKyAgcnRwX211eCA9IEdTVF9SVFBfTVVYIChwYXJlbnQpOworCisgIGlmIChnc3RfcGFkX2NoZWNrX3JlY29uZmlndXJlIChydHBfbXV4LT5zcmNwYWQpKSB7CisgICAgR3N0Q2FwcyAqY3VycmVudF9jYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChwYWQpOworCisgICAgaWYgKCFnc3RfcnRwX211eF9zZXRjYXBzIChwYWQsIHJ0cF9tdXgsIGN1cnJlbnRfY2FwcykpIHsKKyAgICAgIGdzdF9wYWRfbWFya19yZWNvbmZpZ3VyZSAocnRwX211eC0+c3JjcGFkKTsKKyAgICAgIGlmIChHU1RfUEFEX0lTX0ZMVVNISU5HIChydHBfbXV4LT5zcmNwYWQpKQorICAgICAgICByZXQgPSBHU1RfRkxPV19GTFVTSElORzsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0ID0gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIGdzdF9jYXBzX3VucmVmIChjdXJyZW50X2NhcHMpOworICB9CisKKyAgR1NUX09CSkVDVF9MT0NLIChydHBfbXV4KTsKKyAgcGFkcHJpdiA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKworICBpZiAoIXBhZHByaXYpIHsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwX211eCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfTk9UX0xJTktFRDsKKyAgfQorCisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoYnVmZmVyKTsKKworICBpZiAoIWdzdF9ydHBfYnVmZmVyX21hcCAoYnVmZmVyLCBHU1RfTUFQX1JFQURXUklURSwgJnJ0cGJ1ZmZlcikpIHsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwX211eCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChydHBfbXV4LCAiSW52YWxpZCBSVFAgYnVmZmVyIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgZHJvcCA9ICFwcm9jZXNzX2J1ZmZlcl9sb2NrZWQgKHJ0cF9tdXgsIHBhZHByaXYsICZydHBidWZmZXIpOworCisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwYnVmZmVyKTsKKworICBpZiAoIWRyb3ApIHsKKyAgICBpZiAocGFkICE9IHJ0cF9tdXgtPmxhc3RfcGFkKSB7CisgICAgICBjaGFuZ2VkID0gVFJVRTsKKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmcnRwX211eC0+bGFzdF9wYWQpOworICAgICAgcnRwX211eC0+bGFzdF9wYWQgPSBnX29iamVjdF9yZWYgKHBhZCk7CisgICAgfQorCisgICAgaWYgKEdTVF9CVUZGRVJfRFVSQVRJT05fSVNfVkFMSUQgKGJ1ZmZlcikgJiYKKyAgICAgICAgR1NUX0JVRkZFUl9QVFNfSVNfVkFMSUQgKGJ1ZmZlcikpCisgICAgICBydHBfbXV4LT5sYXN0X3N0b3AgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKSArCisgICAgICAgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKTsKKyAgICBlbHNlCisgICAgICBydHBfbXV4LT5sYXN0X3N0b3AgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICB9CisKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0cF9tdXgpOworCisgIGlmIChjaGFuZ2VkKQorICAgIGdzdF9wYWRfc3RpY2t5X2V2ZW50c19mb3JlYWNoIChwYWQsIHJlc2VuZF9ldmVudHMsIHJ0cF9tdXgpOworCisgIGlmIChkcm9wKSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgfSBlbHNlIHsKKyAgICByZXQgPSBnc3RfcGFkX3B1c2ggKHJ0cF9tdXgtPnNyY3BhZCwgYnVmZmVyKTsKKyAgfQorCitvdXQ6CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tdXhfc2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RSVFBNdXggKiBydHBfbXV4LCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworICBHc3RSVFBNdXhQYWRQcml2YXRlICpwYWRwcml2OworICBHc3RDYXBzICpwZWVyY2FwczsKKworICBpZiAoIWdzdF9jYXBzX2lzX2ZpeGVkIChjYXBzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcGVlcmNhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAocnRwX211eC0+c3JjcGFkLCBOVUxMKTsKKyAgaWYgKHBlZXJjYXBzKSB7CisgICAgR3N0Q2FwcyAqdGNhcHMsICpvdGhlcmNhcHM7OworICAgIHRjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHBhZCk7CisgICAgb3RoZXJjYXBzID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKHBlZXJjYXBzLCB0Y2FwcywKKyAgICAgICAgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKworICAgIGlmIChnc3RfY2Fwc19nZXRfc2l6ZSAob3RoZXJjYXBzKSA+IDApIHsKKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKG90aGVyY2FwcywgMCk7CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHJ0cF9tdXgpOworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQgKHN0cnVjdHVyZSwgInNzcmMiLCAmcnRwX211eC0+Y3VycmVudF9zc3JjKSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJVc2UgZG93bnN0cmVhbSBzc3JjOiAleCIsCisgICAgICAgICAgICBydHBfbXV4LT5jdXJyZW50X3NzcmMpOworICAgICAgICBydHBfbXV4LT5oYXZlX3NzcmMgPSBUUlVFOworICAgICAgfQorICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0cF9tdXgpOworICAgIH0KKworICAgIGdzdF9jYXBzX3VucmVmIChvdGhlcmNhcHMpOworCisgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGNhcHMpOworICB9CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKCFzdHJ1Y3R1cmUpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9PQkpFQ1RfTE9DSyAocnRwX211eCk7CisgIHBhZHByaXYgPSBnc3RfcGFkX2dldF9lbGVtZW50X3ByaXZhdGUgKHBhZCk7CisgIGlmIChwYWRwcml2ICYmCisgICAgICBnc3Rfc3RydWN0dXJlX2dldF91aW50IChzdHJ1Y3R1cmUsICJ0aW1lc3RhbXAtb2Zmc2V0IiwKKyAgICAgICAgICAmcGFkcHJpdi0+dGltZXN0YW1wX29mZnNldCkpIHsKKyAgICBwYWRwcml2LT5oYXZlX3RpbWVzdGFtcF9vZmZzZXQgPSBUUlVFOworICB9CisKKyAgY2FwcyA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworCisgIC8qIGlmIHdlIGRvbid0IGhhdmUgYSBzcGVjaWZpZWQgc3NyYywgZmlyc3QgdHJ5IHRvIHRha2Ugb25lIGZyb20gdGhlIGNhcHMsCisgICAgIGFuZCBpZiB0aGF0IGZhaWxzLCBnZW5lcmF0ZSBvbmUgKi8KKyAgaWYgKCFydHBfbXV4LT5oYXZlX3NzcmMpIHsKKyAgICBpZiAocnRwX211eC0+c3NyY19yYW5kb20pIHsKKyAgICAgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAoc3RydWN0dXJlLCAic3NyYyIsICZydHBfbXV4LT5jdXJyZW50X3NzcmMpKQorICAgICAgICBydHBfbXV4LT5jdXJyZW50X3NzcmMgPSBnX3JhbmRvbV9pbnQgKCk7CisgICAgICBydHBfbXV4LT5oYXZlX3NzcmMgPSBUUlVFOworICAgIH0KKyAgfQorCisgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsCisgICAgICAidGltZXN0YW1wLW9mZnNldCIsIEdfVFlQRV9VSU5ULCBydHBfbXV4LT50c19iYXNlLAorICAgICAgInNlcW51bS1vZmZzZXQiLCBHX1RZUEVfVUlOVCwgcnRwX211eC0+c2VxbnVtX2Jhc2UsCisgICAgICAic3NyYyIsIEdfVFlQRV9VSU5ULCBydHBfbXV4LT5jdXJyZW50X3NzcmMsIE5VTEwpOworCisgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHBfbXV4KTsKKworICBpZiAocnRwX211eC0+c2VuZF9zdHJlYW1fc3RhcnQpIHsKKyAgICBnY2hhciBzX2lkWzMyXTsKKworICAgIC8qIHN0cmVhbS1zdGFydCAoRklYTUU6IGNyZWF0ZSBpZCBiYXNlZCBvbiBpbnB1dCBpZHMpICovCisgICAgZ19zbnByaW50ZiAoc19pZCwgc2l6ZW9mIChzX2lkKSwgImludGVybGVhdmUtJTA4eCIsIGdfcmFuZG9tX2ludCAoKSk7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChydHBfbXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0IChzX2lkKSk7CisKKyAgICBydHBfbXV4LT5zZW5kX3N0cmVhbV9zdGFydCA9IEZBTFNFOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwX211eCwKKyAgICAgICJzZXR0aW5nIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQgIiBvbiBzcmMgcGFkLi4iLCBjYXBzKTsKKyAgcmV0ID0gZ3N0X3BhZF9zZXRfY2FwcyAocnRwX211eC0+c3JjcGFkLCBjYXBzKTsKKworCisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorY2xlYXJfY2FwcyAoR3N0Q2FwcyAqIGNhcHMsIGdib29sZWFuIG9ubHlfY2xvY2tfcmF0ZSkKK3sKKyAgZ2ludCBpLCBqOworCisgIC8qIExldHMgb25seSBtYXRjaCBvbiB0aGUgY2xvY2stcmF0ZSAqLworICBmb3IgKGkgPSAwOyBpIDwgZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpOyBpKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCBpKTsKKworICAgIGZvciAoaiA9IDA7IGogPCBnc3Rfc3RydWN0dXJlX25fZmllbGRzIChzKTsgaisrKSB7CisgICAgICBjb25zdCBnY2hhciAqbmFtZSA9IGdzdF9zdHJ1Y3R1cmVfbnRoX2ZpZWxkX25hbWUgKHMsIGopOworCisgICAgICBpZiAoc3RyY21wIChuYW1lLCAiY2xvY2stcmF0ZSIpICYmIChvbmx5X2Nsb2NrX3JhdGUgfHwKKyAgICAgICAgICAgICAgKHN0cmNtcCAobmFtZSwgInNzcmMiKSkpKSB7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzLCBuYW1lKTsKKyAgICAgICAgai0tOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3NhbWVfY2xvY2tfcmF0ZV9mb2xkIChjb25zdCBHVmFsdWUgKiBpdGVtLCBHVmFsdWUgKiByZXQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0UGFkICpteXBhZCA9IHVzZXJfZGF0YTsKKyAgR3N0UGFkICpwYWQgPSBnX3ZhbHVlX2dldF9vYmplY3QgKGl0ZW0pOworICBHc3RDYXBzICpwZWVyY2FwczsKKyAgR3N0Q2FwcyAqYWNjdW1jYXBzOworCisgIGlmIChwYWQgPT0gbXlwYWQpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgYWNjdW1jYXBzID0gZ192YWx1ZV9nZXRfYm94ZWQgKHJldCk7CisgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKHBhZCwgYWNjdW1jYXBzKTsKKyAgaWYgKCFwZWVyY2FwcykgeworICAgIGdfd2FybmluZyAoIm5vIHBlZXJjYXBzIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcGVlcmNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChwZWVyY2Fwcyk7CisgIGNsZWFyX2NhcHMgKHBlZXJjYXBzLCBUUlVFKTsKKworICBnX3ZhbHVlX3Rha2VfYm94ZWQgKHJldCwgcGVlcmNhcHMpOworCisgIHJldHVybiAhZ3N0X2NhcHNfaXNfZW1wdHkgKHBlZXJjYXBzKTsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3J0cF9tdXhfZ2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RSVFBNdXggKiBtdXgsIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworICBHc3RJdGVyYXRvciAqaXRlciA9IE5VTEw7CisgIEdWYWx1ZSB2ID0geyAwIH07CisgIEdzdEl0ZXJhdG9yUmVzdWx0IHJlczsKKyAgR3N0Q2FwcyAqcGVlcmNhcHM7CisgIEdzdENhcHMgKm90aGVyY2FwczsKKyAgR3N0Q2FwcyAqdGNhcHM7CisKKyAgcGVlcmNhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAobXV4LT5zcmNwYWQsIE5VTEwpOworCisgIGlmIChwZWVyY2FwcykgeworICAgIHRjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHBhZCk7CisgICAgb3RoZXJjYXBzID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKHBlZXJjYXBzLCB0Y2FwcywKKyAgICAgICAgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcmNhcHMpOworICB9IGVsc2UgeworICAgIHRjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKG11eC0+c3JjcGFkKTsKKyAgICBpZiAoZmlsdGVyKQorICAgICAgb3RoZXJjYXBzID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgdGNhcHMsCisgICAgICAgICAgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBlbHNlCisgICAgICBvdGhlcmNhcHMgPSBnc3RfY2Fwc19jb3B5ICh0Y2Fwcyk7CisgIH0KKyAgZ3N0X2NhcHNfdW5yZWYgKHRjYXBzKTsKKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiSW50ZXJzZWN0ZWQgc3JjcGFkLXBlZXJjYXBzIGFuZCB0ZW1wbGF0ZSBjYXBzOiAlIgorICAgICAgR1NUX1BUUl9GT1JNQVQsIG90aGVyY2Fwcyk7CisKKyAgY2xlYXJfY2FwcyAob3RoZXJjYXBzLCBUUlVFKTsKKworICBnX3ZhbHVlX2luaXQgKCZ2LCBHU1RfVFlQRV9DQVBTKTsKKworICBpdGVyID0gZ3N0X2VsZW1lbnRfaXRlcmF0ZV9zaW5rX3BhZHMgKEdTVF9FTEVNRU5UIChtdXgpKTsKKyAgZG8geworICAgIGdzdF92YWx1ZV9zZXRfY2FwcyAoJnYsIG90aGVyY2Fwcyk7CisgICAgcmVzID0gZ3N0X2l0ZXJhdG9yX2ZvbGQgKGl0ZXIsIHNhbWVfY2xvY2tfcmF0ZV9mb2xkLCAmdiwgcGFkKTsKKyAgICBnc3RfaXRlcmF0b3JfcmVzeW5jIChpdGVyKTsKKyAgfSB3aGlsZSAocmVzID09IEdTVF9JVEVSQVRPUl9SRVNZTkMpOworICBnc3RfaXRlcmF0b3JfZnJlZSAoaXRlcik7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2ludGVyc2VjdCAoKEdzdENhcHMgKikgZ3N0X3ZhbHVlX2dldF9jYXBzICgmdiksIG90aGVyY2Fwcyk7CisKKyAgZ192YWx1ZV91bnNldCAoJnYpOworICBnc3RfY2Fwc191bnJlZiAob3RoZXJjYXBzKTsKKworICBpZiAocmVzID09IEdTVF9JVEVSQVRPUl9FUlJPUikgeworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworICB9CisKKworICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX211eF9zaW5rX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0UlRQTXV4ICptdXggPSBHU1RfUlRQX01VWCAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpmaWx0ZXIsICpjYXBzOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY2FwcyAocXVlcnksICZmaWx0ZXIpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgIlJlY2VpdmVkIGNhcHMtcXVlcnkgd2l0aCBmaWx0ZXItY2FwczogJSIKKyAgICAgICAgICBHU1RfUFRSX0ZPUk1BVCwgZmlsdGVyKTsKKyAgICAgIGNhcHMgPSBnc3RfcnRwX211eF9nZXRjYXBzIChwYWQsIG11eCwgZmlsdGVyKTsKKyAgICAgIGdzdF9xdWVyeV9zZXRfY2Fwc19yZXN1bHQgKHF1ZXJ5LCBjYXBzKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChtdXgsICJBbnN3ZXJpbmcgY2Fwcy1xdWVyeSB3aXRoIGNhcHM6ICUiCisgICAgICAgICAgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tdXhfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJUUE11eCAqcnRwX211eDsKKworICBydHBfbXV4ID0gR1NUX1JUUF9NVVggKG9iamVjdCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChydHBfbXV4KTsKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1RJTUVTVEFNUF9PRkZTRVQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBydHBfbXV4LT50c19vZmZzZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NFUU5VTV9PRkZTRVQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBydHBfbXV4LT5zZXFudW1fb2Zmc2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TRVFOVU06CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnRwX211eC0+c2VxbnVtKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TU1JDOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0cF9tdXgtPnNzcmMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwX211eCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX211eF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UlRQTXV4ICpydHBfbXV4OworCisgIHJ0cF9tdXggPSBHU1RfUlRQX01VWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfVElNRVNUQU1QX09GRlNFVDoKKyAgICAgIHJ0cF9tdXgtPnRzX29mZnNldCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NFUU5VTV9PRkZTRVQ6CisgICAgICBydHBfbXV4LT5zZXFudW1fb2Zmc2V0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1NSQzoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocnRwX211eCk7CisgICAgICBydHBfbXV4LT5zc3JjID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgcnRwX211eC0+Y3VycmVudF9zc3JjID0gcnRwX211eC0+c3NyYzsKKyAgICAgIHJ0cF9tdXgtPmhhdmVfc3NyYyA9IFRSVUU7CisgICAgICBydHBfbXV4LT5zc3JjX3JhbmRvbSA9IEZBTFNFOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0cF9tdXgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfbXV4X3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSVFBNdXggKm11eCA9IEdTVF9SVFBfTVVYIChwYXJlbnQpOworICBnYm9vbGVhbiBpc19wYWQ7CisgIGdib29sZWFuIHJldDsKKworICBHU1RfT0JKRUNUX0xPQ0sgKG11eCk7CisgIGlzX3BhZCA9IChwYWQgPT0gbXV4LT5sYXN0X3BhZCk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChtdXgpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICBHU1RfTE9HX09CSkVDVCAocGFkLCAiUmVjZWl2ZWQgY2Fwcy1ldmVudCB3aXRoIGNhcHM6ICUiCisgICAgICAgICAgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworICAgICAgcmV0ID0gZ3N0X3J0cF9tdXhfc2V0Y2FwcyAocGFkLCBtdXgsIGNhcHMpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgIHsKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAobXV4KTsKKyAgICAgIG11eC0+bGFzdF9zdG9wID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChtdXgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6CisgICAgeworICAgICAgR3N0UlRQTXV4UGFkUHJpdmF0ZSAqcGFkcHJpdjsKKworICAgICAgR1NUX09CSkVDVF9MT0NLIChtdXgpOworICAgICAgcGFkcHJpdiA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKworICAgICAgaWYgKHBhZHByaXYpIHsKKyAgICAgICAgZ3N0X2V2ZW50X2NvcHlfc2VnbWVudCAoZXZlbnQsICZwYWRwcml2LT5zZWdtZW50KTsKKyAgICAgIH0KKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChtdXgpOworCisgICAgICBpZiAoaXNfcGFkKSB7CisgICAgICAgIEdzdFNlZ21lbnQgbmV3X3NlZ21lbnQ7CisgICAgICAgIGdzdF9zZWdtZW50X2luaXQgKCZuZXdfc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmbmV3X3NlZ21lbnQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChpc19wYWQpIHsKKyAgICByZXR1cm4gZ3N0X3BhZF9wdXNoX2V2ZW50IChtdXgtPnNyY3BhZCwgZXZlbnQpOworICB9IGVsc2UgeworICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgIHJldHVybiBUUlVFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX211eF9yZWFkeV90b19wYXVzZWQgKEdzdFJUUE11eCAqIHJ0cF9tdXgpCit7CisKKyAgR1NUX09CSkVDVF9MT0NLIChydHBfbXV4KTsKKworICBnX2NsZWFyX29iamVjdCAoJnJ0cF9tdXgtPmxhc3RfcGFkKTsKKyAgcnRwX211eC0+c2VuZF9zdHJlYW1fc3RhcnQgPSBUUlVFOworCisgIGlmIChydHBfbXV4LT5zZXFudW1fb2Zmc2V0ID09IC0xKQorICAgIHJ0cF9tdXgtPnNlcW51bV9iYXNlID0gZ19yYW5kb21faW50X3JhbmdlICgwLCBHX01BWFVJTlQxNik7CisgIGVsc2UKKyAgICBydHBfbXV4LT5zZXFudW1fYmFzZSA9IHJ0cF9tdXgtPnNlcW51bV9vZmZzZXQ7CisgIHJ0cF9tdXgtPnNlcW51bSA9IHJ0cF9tdXgtPnNlcW51bV9iYXNlOworCisgIGlmIChydHBfbXV4LT50c19vZmZzZXQgPT0gLTEpCisgICAgcnRwX211eC0+dHNfYmFzZSA9IGdfcmFuZG9tX2ludCAoKTsKKyAgZWxzZQorICAgIHJ0cF9tdXgtPnRzX2Jhc2UgPSBydHBfbXV4LT50c19vZmZzZXQ7CisKKyAgcnRwX211eC0+bGFzdF9zdG9wID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBpZiAocnRwX211eC0+c3NyY19yYW5kb20pIHsKKyAgICBydHBfbXV4LT5oYXZlX3NzcmMgPSBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICBydHBfbXV4LT5jdXJyZW50X3NzcmMgPSBydHBfbXV4LT5zc3JjOworICAgIHJ0cF9tdXgtPmhhdmVfc3NyYyA9IFRSVUU7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChydHBfbXV4LCAic2V0IHRpbWVzdGFtcC1vZmZzZXQgdG8gJXUiLCBydHBfbXV4LT50c19iYXNlKTsKKworICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwX211eCk7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9tdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0UlRQTXV4ICpydHBfbXV4OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRwX211eCA9IEdTVF9SVFBfTVVYIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X3J0cF9tdXhfcmVhZHlfdG9fcGF1c2VkIChydHBfbXV4KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChnc3RfcnRwX211eF9wYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsCisgICAgICB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ19jbGVhcl9vYmplY3QgKCZydHBfbXV4LT5sYXN0X3BhZCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9tdXhfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9ydHBfbXV4X2RlYnVnLCAicnRwbXV4IiwgMCwgInJ0cCBtdXhlciIpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwbXV4IiwgR1NUX1JBTktfTk9ORSwKKyAgICAgIEdTVF9UWVBFX1JUUF9NVVgpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmggYi9nc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGU5ZjQxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmgKQEAgLTAsMCArMSw5OCBAQAorLyogUlRQIG11eGVyIGVsZW1lbnQgZm9yIEdTdHJlYW1lcgorICoKKyAqIGdzdHJ0cG11eC5oOgorICoKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IE5va2lhIENvcnBvcmF0aW9uLgorICogICBDb250YWN0OiBaZWVzaGFuIEFsaSA8emVlc2hhbi5hbGlAbm9raWEuY29tPgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgMjAwMCwyMDA1IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfTVVYX0hfXworI2RlZmluZSBfX0dTVF9SVFBfTVVYX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX01VWCAoZ3N0X3J0cF9tdXhfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9NVVgob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX01VWCwgR3N0UlRQTXV4KSkKKyNkZWZpbmUgR1NUX1JUUF9NVVhfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NVVgsIEdzdFJUUE11eENsYXNzKSkKKyNkZWZpbmUgR1NUX1JUUF9NVVhfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9SVFBfTVVYLCBHc3RSVFBNdXhDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfTVVYKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9NVVgpKQorI2RlZmluZSBHU1RfSVNfUlRQX01VWF9DTEFTUyhvYmopIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NVVgpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUE11eCBHc3RSVFBNdXg7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQTXV4Q2xhc3MgR3N0UlRQTXV4Q2xhc3M7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ2Jvb2xlYW4gaGF2ZV90aW1lc3RhbXBfb2Zmc2V0OworICBndWludCB0aW1lc3RhbXBfb2Zmc2V0OworCisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBnYm9vbGVhbiBwcmlvcml0eTsKK30gR3N0UlRQTXV4UGFkUHJpdmF0ZTsKKworCisvKioKKyAqIEdzdFJUUE11eDoKKyAqCisgKiBUaGUgb3BhcXVlICNHc3RSVFBNdXggc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdFJUUE11eAoreworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgLyogcGFkICovCisgIEdzdFBhZCAqc3JjcGFkOworCisgIGd1aW50MzIgdHNfYmFzZTsKKyAgZ3VpbnQxNiBzZXFudW1fYmFzZTsKKworICBnaW50MzIgdHNfb2Zmc2V0OworICBnaW50MTYgc2VxbnVtX29mZnNldDsKKyAgZ3VpbnQxNiBzZXFudW07ICAgICAgICAgICAgICAgLyogcHJvdGVjdGVkIGJ5IG9iamVjdCBsb2NrICovCisgIGd1aW50IHNzcmM7CisgIGd1aW50IGN1cnJlbnRfc3NyYzsKKyAgZ2Jvb2xlYW4gaGF2ZV9zc3JjOworICBnYm9vbGVhbiBzc3JjX3JhbmRvbTsKKworICBHc3RQYWQgKmxhc3RfcGFkOyAvKiBwcm90ZWN0ZWQgYnkgb2JqZWN0IGxvY2sgKi8KKworICBHc3RDbG9ja1RpbWUgbGFzdF9zdG9wOworICBnYm9vbGVhbiBzZW5kX3N0cmVhbV9zdGFydDsKK307CisKK3N0cnVjdCBfR3N0UlRQTXV4Q2xhc3MKK3sKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudF9jbGFzczsKKworICBnYm9vbGVhbiAoKmFjY2VwdF9idWZmZXJfbG9ja2VkKSAoR3N0UlRQTXV4ICpydHBfbXV4LAorICAgICAgR3N0UlRQTXV4UGFkUHJpdmF0ZSAqIHBhZHByaXYsIEdzdFJUUEJ1ZmZlciAqIGJ1ZmZlcik7CisKKyAgZ2Jvb2xlYW4gKCpzcmNfZXZlbnQpIChHc3RSVFBNdXggKnJ0cF9tdXgsIEdzdEV2ZW50ICpldmVudCk7Cit9OworCisKK0dUeXBlIGdzdF9ydHBfbXV4X2dldF90eXBlICh2b2lkKTsKK2dib29sZWFuIGdzdF9ydHBfbXV4X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1JUUF9NVVhfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmMgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAyMGE0NAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYwpAQCAtMCwwICsxLDY0NiBAQAorLyogCisgKiBSVFAgRGVtdXggZWxlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqIEBhdXRob3IgS2FpIFZlaG1hbmVuIDxrYWkudmVobWFuZW5Abm9raWEuY29tPgorICoKKyAqIExvb3NlbHkgYmFzZWQgb24gR1N0cmVhbWVyIGdzdGRlY29kZWJpbgorICogQ29weXJpZ2h0IChDKSA8MjAwND4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1ydHBwdGRlbXV4CisgKgorICogcnRwcHRkZW11eCBhY3RzIGFzIGEgZGVtdXhlciBmb3IgUlRQIHBhY2tldHMgYmFzZWQgb24gdGhlIHBheWxvYWQgdHlwZSBvZgorICogdGhlIHBhY2tldHMuIEl0cyBtYWluIHB1cnBvc2UgaXMgdG8gYWxsb3cgYW4gYXBwbGljYXRpb24gdG8gZWFzaWx5IHJlY2VpdmUKKyAqIGFuZCBkZWNvZGUgYW4gUlRQIHN0cmVhbSB3aXRoIG11bHRpcGxlIHBheWxvYWQgdHlwZXMuCisgKiAKKyAqIEZvciBlYWNoIHBheWxvYWQgdHlwZSB0aGF0IGlzIGRldGVjdGVkLCBhIG5ldyBwYWQgd2lsbCBiZSBjcmVhdGVkIGFuZCB0aGUKKyAqICNHc3RSdHBQdERlbXV4OjpuZXctcGF5bG9hZC10eXBlIHNpZ25hbCB3aWxsIGJlIGVtaXR0ZWQuIFdoZW4gdGhlIHBheWxvYWQgZm9yCisgKiB0aGUgUlRQIHN0cmVhbSBjaGFuZ2VzLCB0aGUgI0dzdFJ0cFB0RGVtdXg6OnBheWxvYWQtdHlwZS1jaGFuZ2Ugc2lnbmFsIHdpbGwgYmUKKyAqIGVtaXR0ZWQuCisgKiAKKyAqIFRoZSBlbGVtZW50IHdpbGwgdHJ5IHRvIHNldCBjb21wbGV0ZSBhbmQgdW5pcXVlIGFwcGxpY2F0aW9uL3gtcnRwIGNhcHMKKyAqIG9uIHRoZSBvdXRwdXQgcGFkcyBiYXNlZCBvbiB0aGUgcmVzdWx0IG9mIHRoZSAjR3N0UnRwUHREZW11eDo6cmVxdWVzdC1wdC1tYXAKKyAqIHNpZ25hbC4KKyAqIAorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB1ZHBzcmMgY2Fwcz0iYXBwbGljYXRpb24veC1ydHAiICEgcnRwcHRkZW11eCAhIGZha2VzaW5rCisgKiBdfCBUYWtlcyBhbiBSVFAgc3RyZWFtIGFuZCBzZW5kIHRoZSBSVFAgcGFja2V0cyB3aXRoIHRoZSBmaXJzdCBkZXRlY3RlZAorICogcGF5bG9hZCB0eXBlIHRvIGZha2VzaW5rLCBkaXNjYXJkaW5nIHRoZSBvdGhlciBwYXlsb2FkIHR5cGVzLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisvKgorICogQ29udHJpYnV0b3JzOgorICogQW5kcmUgTW9yZWlyYSBNYWdhbGhhZXMgPGFuZHJlLm1hZ2FsaGFlc0BpbmR0Lm9yZy5icj4KKyAqLworLyoKKyAqIFN0YXR1czoKKyAqICAtIHdvcmtzIHdpdGggdGhlIHRlc3RfcnRwZGVtdXguYyB0b29sCisgKgorICogQ2hlY2s6CisgKiAgLSBpcyBlbWl0dGluZyBhIHNpZ25hbCBlbm91Z2gsIG9yIHNob3VsZCB3ZQorICogICAgdXNlIEdzdEV2ZW50IHRvIG5vdGlmeSBkb3duc3RyZWFtIGVsZW1lbnRzCisgKiAgICBvZiB0aGUgbmV3IHBhY2tldC4uLiBubz8KKyAqCisgKiBOb3RlczoKKyAqICAtIGVtaXRzIGV2ZW50IGJvdGggZm9yIG5ldyBQVHMsIGFuZCB3aGVuZXZlcgorICogICAgYSBQVCBpcyBjaGFuZ2VkCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKKyNpbmNsdWRlICJnc3RydHBwdGRlbXV4LmgiCisKKy8qIGdlbmVyaWMgdGVtcGxhdGVzICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgcnRwX3B0X2RlbXV4X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBydHBfcHRfZGVtdXhfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjXyV1IiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIiAicGF5bG9hZCA9IChpbnQpIFsgMCwgMjU1IF0iKQorICAgICk7CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9ydHBfcHRfZGVtdXhfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3J0cF9wdF9kZW11eF9kZWJ1ZworCisvKgorICogSXRlbSBmb3Igc3RvcmluZyBHc3RQYWQ8LT5wdCBwYWlycy4KKyAqLworc3RydWN0IF9Hc3RSdHBQdERlbXV4UGFkCit7CisgIEdzdFBhZCAqcGFkOyAgICAgICAgLyoqPCBwb2ludGVyIHRvIHRoZSBhY3R1YWwgcGFkICovCisgIGdpbnQgcHQ7ICAgICAgICAgICAgIC8qKjwgUlRQIHBheWxvYWQtdHlwZSBhdHRhY2hlZCB0byBwYWQgKi8KKyAgZ2Jvb2xlYW4gbmV3Y2FwczsKK307CisKKy8qIHNpZ25hbHMgKi8KK2VudW0KK3sKKyAgU0lHTkFMX1JFUVVFU1RfUFRfTUFQLAorICBTSUdOQUxfTkVXX1BBWUxPQURfVFlQRSwKKyAgU0lHTkFMX1BBWUxPQURfVFlQRV9DSEFOR0UsCisgIFNJR05BTF9DTEVBUl9QVF9NQVAsCisgIExBU1RfU0lHTkFMCit9OworCisjZGVmaW5lIGdzdF9ydHBfcHRfZGVtdXhfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwUHREZW11eCwgZ3N0X3J0cF9wdF9kZW11eCwgR1NUX1RZUEVfRUxFTUVOVCk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfcHRfZGVtdXhfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX3B0X2RlbXV4X3JlbGVhc2UgKEdzdFJ0cFB0RGVtdXggKiBwdGRlbXV4KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3B0X2RlbXV4X3NldHVwIChHc3RSdHBQdERlbXV4ICogcHRkZW11eCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3B0X2RlbXV4X3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9wdF9kZW11eF9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyICogYnVmKTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX3B0X2RlbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CitzdGF0aWMgdm9pZCBnc3RfcnRwX3B0X2RlbXV4X2NsZWFyX3B0X21hcCAoR3N0UnRwUHREZW11eCAqIHJ0cGRlbXV4KTsKKworc3RhdGljIEdzdFBhZCAqZmluZF9wYWRfZm9yX3B0IChHc3RSdHBQdERlbXV4ICogcnRwZGVtdXgsIGd1aW50OCBwdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3B0X2RlbXV4X3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CisKKworc3RhdGljIGd1aW50IGdzdF9ydHBfcHRfZGVtdXhfc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAgfTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcHRfZGVtdXhfY2xhc3NfaW5pdCAoR3N0UnRwUHREZW11eENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9rbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2tsYXNzOworCisgIGdvYmplY3Rfa2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2tsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICAvKioKKyAgICogR3N0UnRwUHREZW11eDo6cmVxdWVzdC1wdC1tYXA6CisgICAqIEBkZW11eDogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBwdDogdGhlIHBheWxvYWQgdHlwZQorICAgKgorICAgKiBSZXF1ZXN0IHRoZSBwYXlsb2FkIHR5cGUgYXMgI0dzdENhcHMgZm9yIEBwdC4KKyAgICovCisgIGdzdF9ydHBfcHRfZGVtdXhfc2lnbmFsc1tTSUdOQUxfUkVRVUVTVF9QVF9NQVBdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoInJlcXVlc3QtcHQtbWFwIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFB0RGVtdXhDbGFzcywgcmVxdWVzdF9wdF9tYXApLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdTVF9UWVBFX0NBUFMsIDEsIEdfVFlQRV9VSU5UKTsKKworICAvKioKKyAgICogR3N0UnRwUHREZW11eDo6bmV3LXBheWxvYWQtdHlwZToKKyAgICogQGRlbXV4OiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHB0OiB0aGUgcGF5bG9hZCB0eXBlCisgICAqIEBwYWQ6IHRoZSBwYWQgd2l0aCB0aGUgbmV3IHBheWxvYWQKKyAgICoKKyAgICogRW1pdGVkIHdoZW4gYSBuZXcgcGF5bG9hZCB0eXBlIHBhZCBoYXMgYmVlbiBjcmVhdGVkIGluIEBkZW11eC4KKyAgICovCisgIGdzdF9ydHBfcHRfZGVtdXhfc2lnbmFsc1tTSUdOQUxfTkVXX1BBWUxPQURfVFlQRV0gPQorICAgICAgZ19zaWduYWxfbmV3ICgibmV3LXBheWxvYWQtdHlwZSIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBQdERlbXV4Q2xhc3MsIG5ld19wYXlsb2FkX3R5cGUpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdTVF9UWVBFX1BBRCk7CisKKyAgLyoqCisgICAqIEdzdFJ0cFB0RGVtdXg6OnBheWxvYWQtdHlwZS1jaGFuZ2U6CisgICAqIEBkZW11eDogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBwdDogdGhlIG5ldyBwYXlsb2FkIHR5cGUKKyAgICoKKyAgICogRW1pdGVkIHdoZW4gdGhlIHBheWxvYWQgdHlwZSBjaGFuZ2VkLgorICAgKi8KKyAgZ3N0X3J0cF9wdF9kZW11eF9zaWduYWxzW1NJR05BTF9QQVlMT0FEX1RZUEVfQ0hBTkdFXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJwYXlsb2FkLXR5cGUtY2hhbmdlIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFB0RGVtdXhDbGFzcywKKyAgICAgICAgICBwYXlsb2FkX3R5cGVfY2hhbmdlKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX1VJTlQsCisgICAgICBHX1RZUEVfTk9ORSwgMSwgR19UWVBFX1VJTlQpOworCisgIC8qKgorICAgKiBHc3RSdHBQdERlbXV4OjpjbGVhci1wdC1tYXA6CisgICAqIEBkZW11eDogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqCisgICAqIFRoZSBhcHBsaWNhdGlvbiBjYW4gY2FsbCB0aGlzIHNpZ25hbCB0byBpbnN0cnVjdCB0aGUgZWxlbWVudCB0byBkaXNjYXJkIHRoZQorICAgKiBjdXJyZW50bHkgY2FjaGVkIHBheWxvYWQgdHlwZSBtYXAuCisgICAqLworICBnc3RfcnRwX3B0X2RlbXV4X3NpZ25hbHNbU0lHTkFMX0NMRUFSX1BUX01BUF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgiY2xlYXItcHQtbWFwIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX0FDVElPTiB8IEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFB0RGVtdXhDbGFzcywKKyAgICAgICAgICBjbGVhcl9wdF9tYXApLCBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfVk9JRF9fVk9JRCwKKyAgICAgIEdfVFlQRV9OT05FLCAwLCBHX1RZUEVfTk9ORSk7CisKKyAgZ29iamVjdF9rbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX3B0X2RlbXV4X2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfa2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9wdF9kZW11eF9jaGFuZ2Vfc3RhdGUpOworCisgIGtsYXNzLT5jbGVhcl9wdF9tYXAgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9wdF9kZW11eF9jbGVhcl9wdF9tYXApOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2tsYXNzLAorICAgICAgJnJ0cF9wdF9kZW11eF9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfa2xhc3MsCisgICAgICAmcnRwX3B0X2RlbXV4X3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9rbGFzcywgIlJUUCBEZW11eCIsCisgICAgICAiRGVtdXgvTmV0d29yay9SVFAiLAorICAgICAgIlBhcnNlcyBjb2RlYyBzdHJlYW1zIHRyYW5zbWl0dGVkIGluIHRoZSBzYW1lIFJUUCBzZXNzaW9uIiwKKyAgICAgICJLYWkgVmVobWFuZW4gPGthaS52ZWhtYW5lbkBub2tpYS5jb20+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9ydHBfcHRfZGVtdXhfZGVidWcsCisgICAgICAicnRwcHRkZW11eCIsIDAsICJSVFAgY29kZWMgZGVtdXhlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9wdF9kZW11eF9pbml0IChHc3RSdHBQdERlbXV4ICogcHRkZW11eCkKK3sKKyAgR3N0RWxlbWVudENsYXNzICprbGFzcyA9IEdTVF9FTEVNRU5UX0dFVF9DTEFTUyAocHRkZW11eCk7CisKKyAgcHRkZW11eC0+c2luayA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywKKyAgICAgICAgICAic2luayIpLCAic2luayIpOworICBnX2Fzc2VydCAocHRkZW11eC0+c2luayAhPSBOVUxMKTsKKworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAocHRkZW11eC0+c2luaywgZ3N0X3J0cF9wdF9kZW11eF9jaGFpbik7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChwdGRlbXV4LT5zaW5rLCBnc3RfcnRwX3B0X2RlbXV4X3NpbmtfZXZlbnQpOworCisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChwdGRlbXV4KSwgcHRkZW11eC0+c2luayk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3B0X2RlbXV4X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBnc3RfcnRwX3B0X2RlbXV4X3JlbGVhc2UgKEdTVF9SVFBfUFRfREVNVVggKG9iamVjdCkpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3J0cF9wdF9kZW11eF9nZXRfY2FwcyAoR3N0UnRwUHREZW11eCAqIHJ0cGRlbXV4LCBndWludCBwdCkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR1ZhbHVlIHJldCA9IHsgMCB9OworICBHVmFsdWUgYXJnc1syXSA9IHsgezB9LCB7MH0gfTsKKworICAvKiBmaWd1cmUgb3V0IHRoZSBjYXBzICovCisgIGdfdmFsdWVfaW5pdCAoJmFyZ3NbMF0sIEdTVF9UWVBFX0VMRU1FTlQpOworICBnX3ZhbHVlX3NldF9vYmplY3QgKCZhcmdzWzBdLCBydHBkZW11eCk7CisgIGdfdmFsdWVfaW5pdCAoJmFyZ3NbMV0sIEdfVFlQRV9VSU5UKTsKKyAgZ192YWx1ZV9zZXRfdWludCAoJmFyZ3NbMV0sIHB0KTsKKworICBnX3ZhbHVlX2luaXQgKCZyZXQsIEdTVF9UWVBFX0NBUFMpOworICBnX3ZhbHVlX3NldF9ib3hlZCAoJnJldCwgTlVMTCk7CisKKyAgZ19zaWduYWxfZW1pdHYgKGFyZ3MsIGdzdF9ydHBfcHRfZGVtdXhfc2lnbmFsc1tTSUdOQUxfUkVRVUVTVF9QVF9NQVBdLCAwLAorICAgICAgJnJldCk7CisKKyAgZ192YWx1ZV91bnNldCAoJmFyZ3NbMF0pOworICBnX3ZhbHVlX3Vuc2V0ICgmYXJnc1sxXSk7CisgIGNhcHMgPSBnX3ZhbHVlX2R1cF9ib3hlZCAoJnJldCk7CisgIGdfdmFsdWVfdW5zZXQgKCZyZXQpOworICBpZiAoY2FwcyA9PSBOVUxMKSB7CisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAocnRwZGVtdXgtPnNpbmspOworICB9CisKKyAgR1NUX0RFQlVHICgicHQgJWQsIGdvdCBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBwdCwgY2Fwcyk7CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3B0X2RlbXV4X2NsZWFyX3B0X21hcCAoR3N0UnRwUHREZW11eCAqIHJ0cGRlbXV4KQoreworICBHU0xpc3QgKndhbGs7CisKKyAgR1NUX09CSkVDVF9MT0NLIChydHBkZW11eCk7CisgIEdTVF9ERUJVRyAoImNsZWFyaW5nIHB0IG1hcCIpOworICBmb3IgKHdhbGsgPSBydHBkZW11eC0+c3JjcGFkczsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RSdHBQdERlbXV4UGFkICpwYWQgPSB3YWxrLT5kYXRhOworCisgICAgcGFkLT5uZXdjYXBzID0gVFJVRTsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwZGVtdXgpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK25lZWRfY2Fwc19mb3JfcHQgKEdzdFJ0cFB0RGVtdXggKiBydHBkZW11eCwgZ3VpbnQ4IHB0KQoreworICBHU0xpc3QgKndhbGs7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIEdTVF9PQkpFQ1RfTE9DSyAocnRwZGVtdXgpOworICBmb3IgKHdhbGsgPSBydHBkZW11eC0+c3JjcGFkczsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RSdHBQdERlbXV4UGFkICpwYWQgPSB3YWxrLT5kYXRhOworCisgICAgaWYgKHBhZC0+cHQgPT0gcHQpIHsKKyAgICAgIHJldCA9IHBhZC0+bmV3Y2FwczsKKyAgICB9CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0cGRlbXV4KTsKKworICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkCitjbGVhcl9uZXdjYXBzX2Zvcl9wdCAoR3N0UnRwUHREZW11eCAqIHJ0cGRlbXV4LCBndWludDggcHQpCit7CisgIEdTTGlzdCAqd2FsazsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHJ0cGRlbXV4KTsKKyAgZm9yICh3YWxrID0gcnRwZGVtdXgtPnNyY3BhZHM7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UnRwUHREZW11eFBhZCAqcGFkID0gd2Fsay0+ZGF0YTsKKworICAgIGlmIChwYWQtPnB0ID09IHB0KSB7CisgICAgICBwYWQtPm5ld2NhcHMgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwZGVtdXgpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2ZvcndhcmRfc3RpY2t5X2V2ZW50cyAoR3N0UGFkICogcGFkLCBHc3RFdmVudCAqKiBldmVudCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RQYWQgKnNyY3BhZCA9IEdTVF9QQURfQ0FTVCAodXNlcl9kYXRhKTsKKworICAvKiBTdHJlYW0gc3RhcnQgYW5kIGNhcHMgaGF2ZSBhbHJlYWR5IGJlZW4gcHVzaGVkICovCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoKmV2ZW50KSA+PSBHU1RfRVZFTlRfU0VHTUVOVCkKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNyY3BhZCwgZ3N0X2V2ZW50X3JlZiAoKmV2ZW50KSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX3B0X2RlbXV4X2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RSdHBQdERlbXV4ICpydHBkZW11eDsKKyAgZ3VpbnQ4IHB0OworICBHc3RQYWQgKnNyY3BhZDsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0UlRQQnVmZmVyIHJ0cCA9IHsgTlVMTCB9OworCisgIHJ0cGRlbXV4ID0gR1NUX1JUUF9QVF9ERU1VWCAocGFyZW50KTsKKworICBpZiAoIWdzdF9ydHBfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1JFQUQsICZydHApKQorICAgIGdvdG8gaW52YWxpZF9idWZmZXI7CisKKyAgcHQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF90eXBlICgmcnRwKTsKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGRlbXV4LCAicmVjZWl2ZWQgYnVmZmVyIGZvciBwdCAlZCIsIHB0KTsKKworICBzcmNwYWQgPSBmaW5kX3BhZF9mb3JfcHQgKHJ0cGRlbXV4LCBwdCk7CisgIGlmIChzcmNwYWQgPT0gTlVMTCkgeworICAgIC8qIG5ldyBQVCwgY3JlYXRlIGEgc3JjIHBhZCAqLworICAgIEdzdFJ0cFB0RGVtdXhQYWQgKnJ0cGRlbXV4cGFkOworICAgIEdzdEVsZW1lbnRDbGFzcyAqa2xhc3M7CisgICAgR3N0UGFkVGVtcGxhdGUgKnRlbXBsOworICAgIGdjaGFyICpwYWRuYW1lOworCisgICAgY2FwcyA9IGdzdF9ydHBfcHRfZGVtdXhfZ2V0X2NhcHMgKHJ0cGRlbXV4LCBwdCk7CisgICAgaWYgKCFjYXBzKQorICAgICAgZ290byBub19jYXBzOworCisgICAga2xhc3MgPSBHU1RfRUxFTUVOVF9HRVRfQ0xBU1MgKHJ0cGRlbXV4KTsKKyAgICB0ZW1wbCA9IGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLCAic3JjXyV1Iik7CisgICAgcGFkbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInNyY18ldSIsIHB0KTsKKyAgICBzcmNwYWQgPSBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlICh0ZW1wbCwgcGFkbmFtZSk7CisgICAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoc3JjcGFkKTsKKyAgICBnX2ZyZWUgKHBhZG5hbWUpOworICAgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChzcmNwYWQsIGdzdF9ydHBfcHRfZGVtdXhfc3JjX2V2ZW50KTsKKworICAgIEdTVF9ERUJVRyAoIkFkZGluZyBwdD0lZCB0byB0aGUgbGlzdC4iLCBwdCk7CisgICAgcnRwZGVtdXhwYWQgPSBnX3NsaWNlX25ldzAgKEdzdFJ0cFB0RGVtdXhQYWQpOworICAgIHJ0cGRlbXV4cGFkLT5wdCA9IHB0OworICAgIHJ0cGRlbXV4cGFkLT5uZXdjYXBzID0gRkFMU0U7CisgICAgcnRwZGVtdXhwYWQtPnBhZCA9IHNyY3BhZDsKKyAgICBnc3Rfb2JqZWN0X3JlZiAoc3JjcGFkKTsKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKHJ0cGRlbXV4KTsKKyAgICBydHBkZW11eC0+c3JjcGFkcyA9IGdfc2xpc3RfYXBwZW5kIChydHBkZW11eC0+c3JjcGFkcywgcnRwZGVtdXhwYWQpOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHBkZW11eCk7CisKKyAgICBnc3RfcGFkX3NldF9hY3RpdmUgKHNyY3BhZCwgVFJVRSk7CisKKworICAgIC8qIEZpcnN0IHB1c2ggdGhlIHN0cmVhbS1zdGFydCBldmVudCwgaXQgbXVzdCBhbHdheXMgY29tZSBmaXJzdCAqLworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3JjcGFkLAorICAgICAgICBnc3RfcGFkX2dldF9zdGlja3lfZXZlbnQgKHJ0cGRlbXV4LT5zaW5rLCBHU1RfRVZFTlRfU1RSRUFNX1NUQVJULCAwKSk7CisKKyAgICAvKiBUaGVuIGNhcHMgZXZlbnQgaXMgc2VudCAqLworICAgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChjYXBzKTsKKyAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAicGF5bG9hZCIsIEdfVFlQRV9JTlQsIHB0LCBOVUxMKTsKKyAgICBnc3RfcGFkX3NldF9jYXBzIChzcmNwYWQsIGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAgIC8qIEZpcnN0IHN0aWNreSBldmVudHMgb24gc2luayBwYWQgYXJlIGZvcndhcmRlZCB0byB0aGUgbmV3IHNyYyBwYWQgKi8KKyAgICBnc3RfcGFkX3N0aWNreV9ldmVudHNfZm9yZWFjaCAocnRwZGVtdXgtPnNpbmssIGZvcndhcmRfc3RpY2t5X2V2ZW50cywKKyAgICAgICAgc3JjcGFkKTsKKworICAgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cGRlbXV4KSwgc3JjcGFkKTsKKworICAgIEdTVF9ERUJVRyAoImVtaXR0aW5nIG5ldy1wYXlsb2FkLXR5cGUgZm9yIHB0ICVkIiwgcHQpOworICAgIGdfc2lnbmFsX2VtaXQgKEdfT0JKRUNUIChydHBkZW11eCksCisgICAgICAgIGdzdF9ydHBfcHRfZGVtdXhfc2lnbmFsc1tTSUdOQUxfTkVXX1BBWUxPQURfVFlQRV0sIDAsIHB0LCBzcmNwYWQpOworICB9CisKKyAgaWYgKHB0ICE9IHJ0cGRlbXV4LT5sYXN0X3B0KSB7CisgICAgZ2ludCBlbWl0X3B0ID0gcHQ7CisKKyAgICAvKiBvdXIgb3duIHNpZ25hbCB3aXRoIGFuIGV4dHJhIGZsYWcgdGhhdCB0aGlzIGlzIHRoZSBvbmx5IHBhZCAqLworICAgIHJ0cGRlbXV4LT5sYXN0X3B0ID0gcHQ7CisgICAgR1NUX0RFQlVHICgiZW1pdHRpbmcgcGF5bG9hZC10eXBlLWNoYW5nZWQgZm9yIHB0ICVkIiwgZW1pdF9wdCk7CisgICAgZ19zaWduYWxfZW1pdCAoR19PQkpFQ1QgKHJ0cGRlbXV4KSwKKyAgICAgICAgZ3N0X3J0cF9wdF9kZW11eF9zaWduYWxzW1NJR05BTF9QQVlMT0FEX1RZUEVfQ0hBTkdFXSwgMCwgZW1pdF9wdCk7CisgIH0KKworICB3aGlsZSAobmVlZF9jYXBzX2Zvcl9wdCAocnRwZGVtdXgsIHB0KSkgeworICAgIEdTVF9ERUJVRyAoIm5lZWQgbmV3IGNhcHMgZm9yICVkIiwgcHQpOworICAgIGNhcHMgPSBnc3RfcnRwX3B0X2RlbXV4X2dldF9jYXBzIChydHBkZW11eCwgcHQpOworICAgIGlmICghY2FwcykKKyAgICAgIGdvdG8gbm9fY2FwczsKKworICAgIGNsZWFyX25ld2NhcHNfZm9yX3B0IChydHBkZW11eCwgcHQpOworCisgICAgY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGNhcHMpOworICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJwYXlsb2FkIiwgR19UWVBFX0lOVCwgcHQsIE5VTEwpOworICAgIGdzdF9wYWRfc2V0X2NhcHMgKHNyY3BhZCwgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICB9CisKKyAgLyogcHVzaCB0byBzcmNwYWQgKi8KKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChzcmNwYWQsIGJ1Zik7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworaW52YWxpZF9idWZmZXI6CisgIHsKKyAgICAvKiB0aGlzIHNob3VsZCBub3QgYmUgZmF0YWwgKi8KKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBkZW11eCwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAoIkRyb3BwaW5nIGludmFsaWQgUlRQIHBheWxvYWQiKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK25vX2NhcHM6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocnRwZGVtdXgsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksCisgICAgICAgICgiQ291bGQgbm90IGdldCBjYXBzIGZvciBwYXlsb2FkIikpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgaWYgKHNyY3BhZCkKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyBHc3RQYWQgKgorZmluZF9wYWRfZm9yX3B0IChHc3RSdHBQdERlbXV4ICogcnRwZGVtdXgsIGd1aW50OCBwdCkKK3sKKyAgR3N0UGFkICpyZXNwYWQgPSBOVUxMOworICBHU0xpc3QgKndhbGs7CisKKyAgR1NUX09CSkVDVF9MT0NLIChydHBkZW11eCk7CisgIGZvciAod2FsayA9IHJ0cGRlbXV4LT5zcmNwYWRzOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJ0cFB0RGVtdXhQYWQgKnBhZCA9IHdhbGstPmRhdGE7CisKKyAgICBpZiAocGFkLT5wdCA9PSBwdCkgeworICAgICAgcmVzcGFkID0gZ3N0X29iamVjdF9yZWYgKHBhZC0+cGFkKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwZGVtdXgpOworCisgIHJldHVybiByZXNwYWQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9wdF9kZW11eF9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UnRwUHREZW11eCAqcnRwZGVtdXg7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIHJ0cGRlbXV4ID0gR1NUX1JUUF9QVF9ERU1VWCAocGFyZW50KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9DQVBTOgorICAgIHsKKyAgICAgIGdzdF9ydHBfcHRfZGVtdXhfY2xlYXJfcHRfbWFwIChydHBkZW11eCk7CisgICAgICAvKiBkb24ndCBmb3J3YXJkIHRoZSBldmVudCwgd2UgY2xlYXJlZCB0aGUgcHRtYXAgYW5kIG9uIHRoZSBuZXh0IGJ1ZmZlciB3ZQorICAgICAgICogd2lsbCBhZGQgdGhlIHB0IHRvIHRoZSBjYXBzIGFuZCBwdXNoIGEgbmV3IGNhcHMgZXZlbnQgKi8KKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9DVVNUT01fRE9XTlNUUkVBTToKKyAgICB7CisgICAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgICAgIHMgPSBnc3RfZXZlbnRfZ2V0X3N0cnVjdHVyZSAoZXZlbnQpOworCisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgIkdzdFJUUFBhY2tldExvc3QiKSkgeworICAgICAgICBHc3RQYWQgKnNyY3BhZCA9IGZpbmRfcGFkX2Zvcl9wdCAocnRwZGVtdXgsIHJ0cGRlbXV4LT5sYXN0X3B0KTsKKworICAgICAgICBpZiAoc3JjcGFkKSB7CisgICAgICAgICAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChzcmNwYWQsIGV2ZW50KTsKKyAgICAgICAgICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgICB9CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlcyA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9wdF9kZW11eF9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBQdERlbXV4ICpkZW11eDsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzOworCisgIGRlbXV4ID0gR1NUX1JUUF9QVF9ERU1VWCAocGFyZW50KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU06CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX0JPVEg6CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX0JPVEhfT09COgorICAgICAgcyA9IGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChldmVudCk7CisgICAgICBpZiAocyAmJiAhZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHMsICJwYXlsb2FkIikpIHsKKyAgICAgICAgR1NMaXN0ICp3YWxrOworCisgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICAgICAgICBmb3IgKHdhbGsgPSBkZW11eC0+c3JjcGFkczsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICAgICAgICBHc3RSdHBQdERlbXV4UGFkICpkcGFkID0gKEdzdFJ0cFB0RGVtdXhQYWQgKikgd2Fsay0+ZGF0YTsKKworICAgICAgICAgIGlmIChkcGFkLT5wYWQgPT0gcGFkKSB7CisgICAgICAgICAgICBHc3RTdHJ1Y3R1cmUgKndzOworCisgICAgICAgICAgICBldmVudCA9CisgICAgICAgICAgICAgICAgR1NUX0VWRU5UX0NBU1QgKGdzdF9taW5pX29iamVjdF9tYWtlX3dyaXRhYmxlCisgICAgICAgICAgICAgICAgKEdTVF9NSU5JX09CSkVDVF9DQVNUIChldmVudCkpKTsKKyAgICAgICAgICAgIHdzID0gZ3N0X2V2ZW50X3dyaXRhYmxlX3N0cnVjdHVyZSAoZXZlbnQpOworICAgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHdzLCAicGF5bG9hZCIsIEdfVFlQRV9VSU5ULCBkcGFkLT5wdCwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7Cit9CisKKy8qCisgKiBSZXNlcnZlcyByZXNvdXJjZXMgZm9yIHRoZSBvYmplY3QuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9wdF9kZW11eF9zZXR1cCAoR3N0UnRwUHREZW11eCAqIHB0ZGVtdXgpCit7CisgIHB0ZGVtdXgtPnNyY3BhZHMgPSBOVUxMOworICBwdGRlbXV4LT5sYXN0X3B0ID0gMHhGRkZGOworCisgIHJldHVybiBUUlVFOworfQorCisvKgorICogRnJlZSByZXNvdXJjZXMgZm9yIHRoZSBvYmplY3QuCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfcnRwX3B0X2RlbXV4X3JlbGVhc2UgKEdzdFJ0cFB0RGVtdXggKiBwdGRlbXV4KQoreworICBHU0xpc3QgKnRtcHBhZHM7CisgIEdTTGlzdCAqd2FsazsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHB0ZGVtdXgpOworICB0bXBwYWRzID0gcHRkZW11eC0+c3JjcGFkczsKKyAgcHRkZW11eC0+c3JjcGFkcyA9IE5VTEw7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChwdGRlbXV4KTsKKworICBmb3IgKHdhbGsgPSB0bXBwYWRzOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJ0cFB0RGVtdXhQYWQgKnBhZCA9IHdhbGstPmRhdGE7CisKKyAgICBnc3RfcGFkX3NldF9hY3RpdmUgKHBhZC0+cGFkLCBGQUxTRSk7CisgICAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocHRkZW11eCksIHBhZC0+cGFkKTsKKyAgICBnX3NsaWNlX2ZyZWUgKEdzdFJ0cFB0RGVtdXhQYWQsIHBhZCk7CisgIH0KKyAgZ19zbGlzdF9mcmVlICh0bXBwYWRzKTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX3B0X2RlbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0UnRwUHREZW11eCAqcHRkZW11eDsKKworICBwdGRlbXV4ID0gR1NUX1JUUF9QVF9ERU1VWCAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBpZiAoZ3N0X3J0cF9wdF9kZW11eF9zZXR1cCAocHRkZW11eCkgIT0gVFJVRSkKKyAgICAgICAgcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1BMQVlJTkc6CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGdzdF9ydHBfcHRfZGVtdXhfcmVsZWFzZSAocHRkZW11eCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5oIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMWJiN2YKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmgKQEAgLTAsMCArMSw2MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1BUX0RFTVVYX0hfXworI2RlZmluZSBfX0dTVF9SVFBfUFRfREVNVVhfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1BUX0RFTVVYICAgICAgICAgICAgKGdzdF9ydHBfcHRfZGVtdXhfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9QVF9ERU1VWChvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9QVF9ERU1VWCxHc3RSdHBQdERlbXV4KSkKKyNkZWZpbmUgR1NUX1JUUF9QVF9ERU1VWF9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX1BUX0RFTVVYLEdzdFJ0cFB0RGVtdXhDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfUFRfREVNVVgob2JqKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfUFRfREVNVVgpKQorI2RlZmluZSBHU1RfSVNfUlRQX1BUX0RFTVVYX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfUFRfREVNVVgpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwUHREZW11eCBHc3RSdHBQdERlbXV4OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFB0RGVtdXhDbGFzcyBHc3RSdHBQdERlbXV4Q2xhc3M7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwUHREZW11eFBhZCBHc3RSdHBQdERlbXV4UGFkOworCitzdHJ1Y3QgX0dzdFJ0cFB0RGVtdXgKK3sKKyAgR3N0RWxlbWVudCBwYXJlbnQ7ICAvKio8IHBhcmVudCBjbGFzcyAqLworCisgIEdzdFBhZCAqc2luazsgICAgICAgLyoqPCB0aGUgc2luayBwYWQgKi8KKyAgZ3VpbnQxNiBsYXN0X3B0OyAgICAvKio8IHB0IG9mIHRoZSBsYXN0IHBhY2tldCAweEZGRkYgaWYgbm9uZSAqLworICBHU0xpc3QgKnNyY3BhZHM7ICAgIC8qKjwgYSBsaW5rZWQgbGlzdCBvZiBHc3RSdHBQdERlbXV4UGFkIG9iamVjdHMgKi8KK307CisKK3N0cnVjdCBfR3N0UnRwUHREZW11eENsYXNzCit7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7CisKKyAgLyogZ2V0IHRoZSBjYXBzIGZvciBwdCAqLworICBHc3RDYXBzKiAoKnJlcXVlc3RfcHRfbWFwKSAgICAgIChHc3RSdHBQdERlbXV4ICpkZW11eCwgZ3VpbnQgcHQpOworCisgIC8qIHNpZ25hbCBlbW1pdGVkIHdoZW4gYSBuZXcgUFQgaXMgZm91bmQgZnJvbSB0aGUgaW5jb21pbmcgc3RyZWFtICovCisgIHZvaWQgICAgICgqbmV3X3BheWxvYWRfdHlwZSkgICAgKEdzdFJ0cFB0RGVtdXggKmRlbXV4LCBndWludCBwdCwgR3N0UGFkICogcGFkKTsKKworICAvKiBzaWduYWwgZW1pdHRlZCB3aGVuIHRoZSBwYXlsb2FkIHR5cGUgY2hhbmdlcyAqLworICB2b2lkICAgICAoKnBheWxvYWRfdHlwZV9jaGFuZ2UpIChHc3RSdHBQdERlbXV4ICpkZW11eCwgZ3VpbnQgcHQpOworCisgIHZvaWQgICAgICgqY2xlYXJfcHRfbWFwKSAgICAgICAgKEdzdFJ0cFB0RGVtdXggKmRlbXV4KTsKK307CisKK0dUeXBlIGdzdF9ydHBfcHRfZGVtdXhfZ2V0X3R5cGUgKHZvaWQpOworCisjZW5kaWYgLyogX19HU1RfUlRQX1BUX0RFTVVYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cXVldWUuYyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHF1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBkNmNiZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHF1ZXVlLmMKQEAgLTAsMCArMSw1MjEgQEAKKy8qIFJUUCBSZXRyYW5zbWlzc2lvbiBxdWV1ZSBlbGVtZW50IGZvciBHU3RyZWFtZXIKKyAqCisgKiBnc3RydHBydHhxdWV1ZS5jOgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cHJ0eHF1ZXVlCisgKgorICogcnRwcnR4cXVldWUgbWFpbnRhaW5zIGEgcXVldWUgb2YgdHJhbnNtaXR0ZWQgUlRQIHBhY2tldHMsIHVwIHRvIGEKKyAqIGNvbmZpZ3VyYWJsZSBsaW1pdCAoc2VlICNHc3RSVFBSdHhRdWV1ZTo6bWF4LXNpemUtdGltZSwKKyAqICNHc3RSVFBSdHhRdWV1ZTo6bWF4LXNpemUtcGFja2V0cyksIGFuZCByZXRyYW5zbWl0cyB0aGVtIHVwb24gcmVxdWVzdAorICogZnJvbSB0aGUgZG93bnN0cmVhbSBydHBzZXNzaW9uIChHc3RSVFBSZXRyYW5zbWlzc2lvblJlcXVlc3QgZXZlbnQpLgorICoKKyAqIFRoaXMgZWxlbWVudCBpcyBzaW1pbGFyIHRvIHJ0cHJ0eHNlbmQsIGJ1dCBpdCBoYXMgZGlmZmVyZW5jZXM6CisgKiAtIFJldHJhbnNtaXNzaW9uIGZyb20gcnRwcnR4cXVldWUgaXMgbm90IFJGQyA0NTg4IGNvbXBsaWFudC4gVGhlCisgKiByZXRyYW5zbWl0dGVkIHBhY2tldHMgaGF2ZSB0aGUgc2FtZSBzc3JjIGFuZCBwYXlsb2FkIHR5cGUgYXMgdGhlIG9yaWdpbmFsCisgKiBzdHJlYW0uCisgKiAtIEFzIGEgc2lkZS1lZmZlY3Qgb2YgdGhlIGFib3ZlLCBydHBydHhxdWV1ZSBkb2VzIG5vdCByZXF1aXJlIHRoZSB1c2Ugb2YKKyAqIHJ0cHJ0eHJlY2VpdmUgb24gdGhlIHJlY2VpdmluZyBlbmQuIHJ0cGppdHRlcmJ1ZmZlciBhbG9uZSBpcyBhYmxlIHRvCisgKiByZWNvbnN0cnVjdCB0aGUgc3RyZWFtLgorICogLSBSZXRyYW5zbWlzc2lvbiBmcm9tIHJ0cHJ0eHF1ZXVlIGhhcHBlbnMgYXMgc29vbiBhcyB0aGUgbmV4dCByZWd1bGFyIGZsb3cKKyAqIHBhY2tldCBpcyBjaGFpbmVkLCB3aGlsZSBydHBydHhzZW5kIHJldHJhbnNtaXRzIGFzIHNvb24gYXMgdGhlIHJldHJhbnNtaXNzaW9uCisgKiBldmVudCBpcyByZWNlaXZlZCwgdXNpbmcgYSBoZWxwZXIgdGhyZWFkLgorICogLSBydHBydHhxdWV1ZSBjYW4gYmUgdXNlZCB3aXRoIHJ0cGJpbiB3aXRob3V0IHRoZSBuZWVkIG9mIGhvb2tpbmcgdG8gaXRzCisgKiAjR3N0UnRwQmluOjpyZXF1ZXN0LWF1eC1zZW5kZXIgc2lnbmFsLCB3aGljaCBtZWFucyBpdCBjYW4gYmUgdXNlZCB3aXRoCisgKiBydHBiaW4gdXNpbmcgZ3N0LWxhdW5jaC4KKyAqCisgKiBTZWUgYWxzbyAjR3N0UnRwUnR4U2VuZCwgI0dzdFJ0cFJ0eFJlY2VpdmUKKyAqCisgKiAjIEV4YW1wbGUgcGlwZWxpbmVzCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgcnRwYmluIG5hbWU9YiBydHAtcHJvZmlsZT1hdnBmIFwKKyAqICAgIGF1ZGlvdGVzdHNyYyBpcy1saXZlPXRydWUgISBvcHVzZW5jICEgcnRwb3B1c3BheSBwdD05NiAhIHJ0cHJ0eHF1ZXVlICEgYi5zZW5kX3J0cF9zaW5rXzAgXAorICogICAgYi5zZW5kX3J0cF9zcmNfMCAhIGlkZW50aXR5IGRyb3AtcHJvYmFiaWxpdHk9MC4wMSAhIHVkcHNpbmsgaG9zdD0iMTI3LjAuMC4xIiBwb3J0PTUwMDAgXAorICogICAgdWRwc3JjIHBvcnQ9NTAwMSAhIGIucmVjdl9ydGNwX3NpbmtfMCBcCisgKiAgICBiLnNlbmRfcnRjcF9zcmNfMCAhIHVkcHNpbmsgaG9zdD0iMTI3LjAuMC4xIiBwb3J0PTUwMDIgc3luYz1mYWxzZSBhc3luYz1mYWxzZQorICogXXwgU2VuZGVyIHBpcGVsaW5lCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgcnRwYmluIG5hbWU9YiBydHAtcHJvZmlsZT1hdnBmIGRvLXJldHJhbnNtaXNzaW9uPXRydWUgXAorICogICAgdWRwc3JjIHBvcnQ9NTAwMCBjYXBzPSJhcHBsaWNhdGlvbi94LXJ0cCxtZWRpYT0oc3RyaW5nKWF1ZGlvLGNsb2NrLXJhdGU9KGludCk0ODAwMCxlbmNvZGluZy1uYW1lPShzdHJpbmcpT1BVUyxwYXlsb2FkPShpbnQpOTYiICEgXAorICogICAgICAgIGIucmVjdl9ydHBfc2lua18wIFwKKyAqICAgIGIuICEgcnRwb3B1c2RlcGF5ICEgb3B1c2RlYyAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhdXRvYXVkaW9zaW5rIFwKKyAqICAgIHVkcHNyYyBwb3J0PTUwMDIgISBiLnJlY3ZfcnRjcF9zaW5rXzAgXAorICogICAgYi5zZW5kX3J0Y3Bfc3JjXzAgISB1ZHBzaW5rIGhvc3Q9IjEyNy4wLjAuMSIgcG9ydD01MDAxIHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UKKyAqIF18IFJlY2VpdmVyIHBpcGVsaW5lCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RydHBydHhxdWV1ZS5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfcnRwX3J0eF9xdWV1ZV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfcnRwX3J0eF9xdWV1ZV9kZWJ1ZworCisjZGVmaW5lIERFRkFVTFRfTUFYX1NJWkVfVElNRSAgICAwCisjZGVmaW5lIERFRkFVTFRfTUFYX1NJWkVfUEFDS0VUUyAxMDAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTUFYX1NJWkVfVElNRSwKKyAgUFJPUF9NQVhfU0laRV9QQUNLRVRTLAorICBQUk9QX1JFUVVFU1RTLAorICBQUk9QX0ZVTEZJTExFRF9SRVFVRVNUUywKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwIikKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9ydHhfcXVldWVfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3J0eF9xdWV1ZV9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfcnR4X3F1ZXVlX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9ydHhfcXVldWVfY2hhaW5fbGlzdCAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyTGlzdCAqIGxpc3QpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9ydHhfcXVldWVfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9ydHhfcXVldWVfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9ydHhfcXVldWVfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9ydHhfcXVldWVfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitHX0RFRklORV9UWVBFIChHc3RSVFBSdHhRdWV1ZSwgZ3N0X3J0cF9ydHhfcXVldWUsIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9ydHhfcXVldWVfY2xhc3NfaW5pdCAoR3N0UlRQUnR4UXVldWVDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9ydHhfcXVldWVfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX3J0eF9xdWV1ZV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9ydHhfcXVldWVfZmluYWxpemU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfU0laRV9USU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJtYXgtc2l6ZS10aW1lIiwgIk1heCBTaXplIFRpbWVzIiwKKyAgICAgICAgICAiQW1vdW50IG9mIG1zIHRvIHF1ZXVlICgwID0gdW5saW1pdGVkKSIsIDAsIEdfTUFYVUlOVCwKKyAgICAgICAgICBERUZBVUxUX01BWF9TSVpFX1RJTUUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX1NJWkVfUEFDS0VUUywKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LXNpemUtcGFja2V0cyIsICJNYXggU2l6ZSBQYWNrZXRzIiwKKyAgICAgICAgICAiQW1vdW50IG9mIHBhY2tldHMgdG8gcXVldWUgKDAgPSB1bmxpbWl0ZWQpIiwgMCwgR19NQVhVSU5ULAorICAgICAgICAgIERFRkFVTFRfTUFYX1NJWkVfUEFDS0VUUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JFUVVFU1RTLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJyZXF1ZXN0cyIsICJSZXF1ZXN0cyIsCisgICAgICAgICAgIlRvdGFsIG51bWJlciBvZiByZXRyYW5zbWlzc2lvbiByZXF1ZXN0cyIsIDAsIEdfTUFYVUlOVCwKKyAgICAgICAgICAwLCBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRlVMRklMTEVEX1JFUVVFU1RTLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJmdWxmaWxsZWQtcmVxdWVzdHMiLCAiRnVsZmlsbGVkIFJlcXVlc3RzIiwKKyAgICAgICAgICAiTnVtYmVyIG9mIGZ1bGZpbGxlZCByZXRyYW5zbWlzc2lvbiByZXF1ZXN0cyIsIDAsIEdfTUFYVUlOVCwKKyAgICAgICAgICAwLCBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc3JjX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfZmFjdG9yeSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgUmV0cmFuc21pc3Npb24gUXVldWUiLCAiQ29kZWMiLAorICAgICAgIktlZXAgUlRQIHBhY2tldHMgaW4gYSBxdWV1ZSBmb3IgcmV0cmFuc21pc3Npb24iLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX3J0eF9xdWV1ZV9jaGFuZ2Vfc3RhdGUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9ydHhfcXVldWVfcmVzZXQgKEdzdFJUUFJ0eFF1ZXVlICogcnR4LCBnYm9vbGVhbiBmdWxsKQoreworICBnX211dGV4X2xvY2sgKCZydHgtPmxvY2spOworICBnX3F1ZXVlX2ZvcmVhY2ggKHJ0eC0+cXVldWUsIChHRnVuYykgZ3N0X2J1ZmZlcl91bnJlZiwgTlVMTCk7CisgIGdfcXVldWVfY2xlYXIgKHJ0eC0+cXVldWUpOworICBnX2xpc3RfZm9yZWFjaCAocnR4LT5wZW5kaW5nLCAoR0Z1bmMpIGdzdF9idWZmZXJfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAocnR4LT5wZW5kaW5nKTsKKyAgcnR4LT5wZW5kaW5nID0gTlVMTDsKKyAgcnR4LT5uX3JlcXVlc3RzID0gMDsKKyAgcnR4LT5uX2Z1bGZpbGxlZF9yZXF1ZXN0cyA9IDA7CisgIGdfbXV0ZXhfdW5sb2NrICgmcnR4LT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcnR4X3F1ZXVlX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSVFBSdHhRdWV1ZSAqcnR4ID0gR1NUX1JUUF9SVFhfUVVFVUUgKG9iamVjdCk7CisKKyAgZ3N0X3J0cF9ydHhfcXVldWVfcmVzZXQgKHJ0eCwgVFJVRSk7CisgIGdfcXVldWVfZnJlZSAocnR4LT5xdWV1ZSk7CisgIGdfbXV0ZXhfY2xlYXIgKCZydHgtPmxvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChnc3RfcnRwX3J0eF9xdWV1ZV9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcnR4X3F1ZXVlX2luaXQgKEdzdFJUUFJ0eFF1ZXVlICogcnR4KQoreworICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChydHgpOworCisgIHJ0eC0+c3JjcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLAorICAgICAgICAgICJzcmMiKSwgInNyYyIpOworICBHU1RfUEFEX1NFVF9QUk9YWV9DQVBTIChydHgtPnNyY3BhZCk7CisgIEdTVF9QQURfU0VUX1BST1hZX0FMTE9DQVRJT04gKHJ0eC0+c3JjcGFkKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHJ0eC0+c3JjcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfcnR4X3F1ZXVlX3NyY19ldmVudCkpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAocnR4KSwgcnR4LT5zcmNwYWQpOworCisgIHJ0eC0+c2lua3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywKKyAgICAgICAgICAic2luayIpLCAic2luayIpOworICBHU1RfUEFEX1NFVF9QUk9YWV9DQVBTIChydHgtPnNpbmtwYWQpOworICBHU1RfUEFEX1NFVF9QUk9YWV9BTExPQ0FUSU9OIChydHgtPnNpbmtwYWQpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAocnR4LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfcnR4X3F1ZXVlX3NpbmtfZXZlbnQpKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHJ0eC0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX3J0eF9xdWV1ZV9jaGFpbikpOworICBnc3RfcGFkX3NldF9jaGFpbl9saXN0X2Z1bmN0aW9uIChydHgtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9ydHhfcXVldWVfY2hhaW5fbGlzdCkpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAocnR4KSwgcnR4LT5zaW5rcGFkKTsKKworICBydHgtPnF1ZXVlID0gZ19xdWV1ZV9uZXcgKCk7CisgIGdfbXV0ZXhfaW5pdCAoJnJ0eC0+bG9jayk7CisKKyAgcnR4LT5tYXhfc2l6ZV90aW1lID0gREVGQVVMVF9NQVhfU0laRV9USU1FOworICBydHgtPm1heF9zaXplX3BhY2tldHMgPSBERUZBVUxUX01BWF9TSVpFX1BBQ0tFVFM7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEdzdFJUUFJ0eFF1ZXVlICpydHg7CisgIGd1aW50IHNlcW51bTsKKyAgZ2Jvb2xlYW4gZm91bmQ7Cit9IFJUWERhdGE7CisKK3N0YXRpYyB2b2lkCitwdXNoX3NlcW51bSAoR3N0QnVmZmVyICogYnVmZmVyLCBSVFhEYXRhICogZGF0YSkKK3sKKyAgR3N0UlRQUnR4UXVldWUgKnJ0eCA9IGRhdGEtPnJ0eDsKKyAgR3N0UlRQQnVmZmVyIHJ0cGJ1ZmZlciA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisgIGd1aW50MTYgc2VxbnVtOworCisgIGlmIChkYXRhLT5mb3VuZCkKKyAgICByZXR1cm47CisKKyAgaWYgKCFHU1RfSVNfQlVGRkVSIChidWZmZXIpIHx8CisgICAgICAhZ3N0X3J0cF9idWZmZXJfbWFwIChidWZmZXIsIEdTVF9NQVBfUkVBRCwgJnJ0cGJ1ZmZlcikpCisgICAgcmV0dXJuOworCisgIHNlcW51bSA9IGdzdF9ydHBfYnVmZmVyX2dldF9zZXEgKCZydHBidWZmZXIpOworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cGJ1ZmZlcik7CisKKyAgaWYgKHNlcW51bSA9PSBkYXRhLT5zZXFudW0pIHsKKyAgICBkYXRhLT5mb3VuZCA9IFRSVUU7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnR4LCAiZm91bmQgJWQiLCBzZXFudW0pOworICAgIHJ0eC0+cGVuZGluZyA9IGdfbGlzdF9wcmVwZW5kIChydHgtPnBlbmRpbmcsIGdzdF9idWZmZXJfcmVmIChidWZmZXIpKTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfcnR4X3F1ZXVlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFJUUFJ0eFF1ZXVlICpydHggPSBHU1RfUlRQX1JUWF9RVUVVRSAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTToKKyAgICB7CisgICAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgICAgIHMgPSBnc3RfZXZlbnRfZ2V0X3N0cnVjdHVyZSAoZXZlbnQpOworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJHc3RSVFBSZXRyYW5zbWlzc2lvblJlcXVlc3QiKSkgeworICAgICAgICBndWludCBzZXFudW07CisgICAgICAgIFJUWERhdGEgZGF0YTsKKworICAgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQgKHMsICJzZXFudW0iLCAmc2VxbnVtKSkKKyAgICAgICAgICBzZXFudW0gPSAtMTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHgsICJyZXF1ZXN0ICVkIiwgc2VxbnVtKTsKKworICAgICAgICBnX211dGV4X2xvY2sgKCZydHgtPmxvY2spOworICAgICAgICBkYXRhLnJ0eCA9IHJ0eDsKKyAgICAgICAgZGF0YS5zZXFudW0gPSBzZXFudW07CisgICAgICAgIGRhdGEuZm91bmQgPSBGQUxTRTsKKyAgICAgICAgcnR4LT5uX3JlcXVlc3RzICs9IDE7CisgICAgICAgIGdfcXVldWVfZm9yZWFjaCAocnR4LT5xdWV1ZSwgKEdGdW5jKSBwdXNoX3NlcW51bSwgJmRhdGEpOworICAgICAgICBnX211dGV4X3VubG9jayAoJnJ0eC0+bG9jayk7CisKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXMgPSBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9ydHhfcXVldWVfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UlRQUnR4UXVldWUgKnJ0eCA9IEdTVF9SVFBfUlRYX1FVRVVFIChwYXJlbnQpOworICBnYm9vbGVhbiByZXM7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDoKKyAgICB7CisgICAgICBnX211dGV4X2xvY2sgKCZydHgtPmxvY2spOworICAgICAgZ3N0X2V2ZW50X2NvcHlfc2VnbWVudCAoZXZlbnQsICZydHgtPmhlYWRfc2VnbWVudCk7CisgICAgICBnX3F1ZXVlX3B1c2hfaGVhZCAocnR4LT5xdWV1ZSwgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmcnR4LT5sb2NrKTsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQKK2RvX3B1c2ggKEdzdEJ1ZmZlciAqIGJ1ZmZlciwgR3N0UlRQUnR4UXVldWUgKiBydHgpCit7CisgIHJ0eC0+bl9mdWxmaWxsZWRfcmVxdWVzdHMgKz0gMTsKKyAgZ3N0X3BhZF9wdXNoIChydHgtPnNyY3BhZCwgYnVmZmVyKTsKK30KKworc3RhdGljIGd1aW50MzIKK2dldF90c19kaWZmIChHc3RSVFBSdHhRdWV1ZSAqIHJ0eCkKK3sKKyAgR3N0Q2xvY2tUaW1lIGhpZ2hfdHMsIGxvd190czsKKyAgR3N0Q2xvY2tUaW1lRGlmZiByZXN1bHQ7CisgIEdzdEJ1ZmZlciAqaGlnaF9idWYsICpsb3dfYnVmOworCisgIGhpZ2hfYnVmID0gZ19xdWV1ZV9wZWVrX2hlYWQgKHJ0eC0+cXVldWUpOworCisgIHdoaWxlIChHU1RfSVNfRVZFTlQgKChsb3dfYnVmID0gZ19xdWV1ZV9wZWVrX3RhaWwgKHJ0eC0+cXVldWUpKSkpIHsKKyAgICBHc3RFdmVudCAqZXZlbnQgPSBnX3F1ZXVlX3BvcF90YWlsIChydHgtPnF1ZXVlKTsKKyAgICBnc3RfZXZlbnRfY29weV9zZWdtZW50IChldmVudCwgJnJ0eC0+dGFpbF9zZWdtZW50KTsKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgfQorCisgIGlmICghaGlnaF9idWYgfHwgIWxvd19idWYgfHwgaGlnaF9idWYgPT0gbG93X2J1ZikKKyAgICByZXR1cm4gMDsKKworICBoaWdoX3RzID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGhpZ2hfYnVmKTsKKyAgbG93X3RzID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGxvd19idWYpOworCisgIGhpZ2hfdHMgPSBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZydHgtPmhlYWRfc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgaGlnaF90cyk7CisgIGxvd190cyA9IGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJnJ0eC0+dGFpbF9zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICBsb3dfdHMpOworCisgIHJlc3VsdCA9IGhpZ2hfdHMgLSBsb3dfdHM7CisKKyAgLyogcmV0dXJuIHZhbHVlIGluIG1zIGluc3RlYWQgb2YgbnMgKi8KKyAgcmV0dXJuIChndWludDMyKSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChyZXN1bHQsIDEsIEdTVF9NU0VDT05EKTsKK30KKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBydHgtPmxvY2sgKi8KK3N0YXRpYyB2b2lkCitzaHJpbmtfcXVldWUgKEdzdFJUUFJ0eFF1ZXVlICogcnR4KQoreworICBpZiAocnR4LT5tYXhfc2l6ZV9wYWNrZXRzKSB7CisgICAgd2hpbGUgKGdfcXVldWVfZ2V0X2xlbmd0aCAocnR4LT5xdWV1ZSkgPiBydHgtPm1heF9zaXplX3BhY2tldHMpCisgICAgICBnc3RfYnVmZmVyX3VucmVmIChnX3F1ZXVlX3BvcF90YWlsIChydHgtPnF1ZXVlKSk7CisgIH0KKyAgaWYgKHJ0eC0+bWF4X3NpemVfdGltZSkgeworICAgIHdoaWxlIChnZXRfdHNfZGlmZiAocnR4KSA+IHJ0eC0+bWF4X3NpemVfdGltZSkKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGdfcXVldWVfcG9wX3RhaWwgKHJ0eC0+cXVldWUpKTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9ydHhfcXVldWVfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJUUFJ0eFF1ZXVlICpydHg7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHTGlzdCAqcGVuZGluZzsKKworICBydHggPSBHU1RfUlRQX1JUWF9RVUVVRSAocGFyZW50KTsKKworICBnX211dGV4X2xvY2sgKCZydHgtPmxvY2spOworICBnX3F1ZXVlX3B1c2hfaGVhZCAocnR4LT5xdWV1ZSwgZ3N0X2J1ZmZlcl9yZWYgKGJ1ZmZlcikpOworICBzaHJpbmtfcXVldWUgKHJ0eCk7CisKKyAgcGVuZGluZyA9IHJ0eC0+cGVuZGluZzsKKyAgcnR4LT5wZW5kaW5nID0gTlVMTDsKKyAgZ19tdXRleF91bmxvY2sgKCZydHgtPmxvY2spOworCisgIHBlbmRpbmcgPSBnX2xpc3RfcmV2ZXJzZSAocGVuZGluZyk7CisgIGdfbGlzdF9mb3JlYWNoIChwZW5kaW5nLCAoR0Z1bmMpIGRvX3B1c2gsIHJ0eCk7CisgIGdfbGlzdF9mcmVlIChwZW5kaW5nKTsKKworICByZXQgPSBnc3RfcGFkX3B1c2ggKHJ0eC0+c3JjcGFkLCBidWZmZXIpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcHVzaF90b19xdWV1ZSAoR3N0QnVmZmVyICoqIGJ1ZmZlciwgZ3VpbnQgaWR4LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdRdWV1ZSAqcXVldWUgPSB1c2VyX2RhdGE7CisKKyAgZ19xdWV1ZV9wdXNoX2hlYWQgKHF1ZXVlLCBnc3RfYnVmZmVyX3JlZiAoKmJ1ZmZlcikpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9ydHhfcXVldWVfY2hhaW5fbGlzdCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyTGlzdCAqIGxpc3QpCit7CisgIEdzdFJUUFJ0eFF1ZXVlICpydHg7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHTGlzdCAqcGVuZGluZzsKKworICBydHggPSBHU1RfUlRQX1JUWF9RVUVVRSAocGFyZW50KTsKKworICBnX211dGV4X2xvY2sgKCZydHgtPmxvY2spOworICBnc3RfYnVmZmVyX2xpc3RfZm9yZWFjaCAobGlzdCwgcHVzaF90b19xdWV1ZSwgcnR4LT5xdWV1ZSk7CisgIHNocmlua19xdWV1ZSAocnR4KTsKKworICBwZW5kaW5nID0gcnR4LT5wZW5kaW5nOworICBydHgtPnBlbmRpbmcgPSBOVUxMOworICBnX211dGV4X3VubG9jayAoJnJ0eC0+bG9jayk7CisKKyAgcGVuZGluZyA9IGdfbGlzdF9yZXZlcnNlIChwZW5kaW5nKTsKKyAgZ19saXN0X2ZvcmVhY2ggKHBlbmRpbmcsIChHRnVuYykgZG9fcHVzaCwgcnR4KTsKKyAgZ19saXN0X2ZyZWUgKHBlbmRpbmcpOworCisgIHJldCA9IGdzdF9wYWRfcHVzaF9saXN0IChydHgtPnNyY3BhZCwgbGlzdCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcnR4X3F1ZXVlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSVFBSdHhRdWV1ZSAqcnR4ID0gR1NUX1JUUF9SVFhfUVVFVUUgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01BWF9TSVpFX1RJTUU6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnR4LT5tYXhfc2l6ZV90aW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfU0laRV9QQUNLRVRTOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0eC0+bWF4X3NpemVfcGFja2V0cyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVRVUVTVFM6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnR4LT5uX3JlcXVlc3RzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GVUxGSUxMRURfUkVRVUVTVFM6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnR4LT5uX2Z1bGZpbGxlZF9yZXF1ZXN0cyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3J0eF9xdWV1ZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UlRQUnR4UXVldWUgKnJ0eCA9IEdTVF9SVFBfUlRYX1FVRVVFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NQVhfU0laRV9USU1FOgorICAgICAgcnR4LT5tYXhfc2l6ZV90aW1lID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9TSVpFX1BBQ0tFVFM6CisgICAgICBydHgtPm1heF9zaXplX3BhY2tldHMgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9ydHhfcXVldWVfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RSVFBSdHhRdWV1ZSAqcnR4OworCisgIHJ0eCA9IEdTVF9SVFBfUlRYX1FVRVVFIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPQorICAgICAgR1NUX0VMRU1FTlRfQ0xBU1MgKGdzdF9ydHBfcnR4X3F1ZXVlX3BhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwKKyAgICAgIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3RfcnRwX3J0eF9xdWV1ZV9yZXNldCAocnR4LCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX3J0eF9xdWV1ZV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3J0cF9ydHhfcXVldWVfZGVidWcsICJydHBydHhxdWV1ZSIsIDAsCisgICAgICAicnRwIHJldHJhbnNtaXNzaW9uIHF1ZXVlIik7CisKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBydHhxdWV1ZSIsIEdTVF9SQU5LX05PTkUsCisgICAgICBHU1RfVFlQRV9SVFBfUlRYX1FVRVVFKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHF1ZXVlLmggYi9nc3QvcnRwbWFuYWdlci9nc3RydHBydHhxdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZThkNDQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBydHhxdWV1ZS5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIFJUUCBtdXhlciBlbGVtZW50IGZvciBHU3RyZWFtZXIKKyAqCisgKiBnc3RydHBtdXguaDoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqICAgQ29udGFjdDogWmVlc2hhbiBBbGkgPHplZXNoYW4uYWxpQG5va2lhLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgIDIwMDAsMjAwNSBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1JUWF9RVUVVRV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1JUWF9RVUVVRV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9SVFhfUVVFVUUgKGdzdF9ydHBfcnR4X3F1ZXVlX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfUlRYX1FVRVVFKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9SVFhfUVVFVUUsIEdzdFJUUFJ0eFF1ZXVlKSkKKyNkZWZpbmUgR1NUX1JUUF9SVFhfUVVFVUVfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9SVFhfUVVFVUUsIEdzdFJUUFJ0eFF1ZXVlQ2xhc3MpKQorI2RlZmluZSBHU1RfUlRQX1JUWF9RVUVVRV9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIEdTVF9UWVBFX1JUUF9SVFhfUVVFVUUsIEdzdFJUUFJ0eFF1ZXVlQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1JUWF9RVUVVRShvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfUlRYX1FVRVVFKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9SVFhfUVVFVUVfQ0xBU1Mob2JqKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfUlRYX1FVRVVFKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBSdHhRdWV1ZSBHc3RSVFBSdHhRdWV1ZTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBSdHhRdWV1ZUNsYXNzIEdzdFJUUFJ0eFF1ZXVlQ2xhc3M7CisKKy8qKgorICogR3N0UlRQUnR4UXVldWU6CisgKgorICogVGhlIG9wYXF1ZSAjR3N0UlRQUnR4UXVldWUgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdFJUUFJ0eFF1ZXVlCit7CisgIEdzdEVsZW1lbnQgZWxlbWVudDsKKworICAvKiBwYWQgKi8KKyAgR3N0UGFkICpzaW5rcGFkOworICBHc3RQYWQgKnNyY3BhZDsKKworICBHTXV0ZXggbG9jazsKKyAgR1F1ZXVlICpxdWV1ZTsKKyAgR0xpc3QgKnBlbmRpbmc7CisKKyAgZ3VpbnQgbWF4X3NpemVfdGltZTsKKyAgZ3VpbnQgbWF4X3NpemVfcGFja2V0czsKKworICBHc3RTZWdtZW50IGhlYWRfc2VnbWVudDsKKyAgR3N0U2VnbWVudCB0YWlsX3NlZ21lbnQ7CisKKyAgLyogU3RhdGlzdGljcyAqLworICBndWludCBuX3JlcXVlc3RzOworICBndWludCBuX2Z1bGZpbGxlZF9yZXF1ZXN0czsKK307CisKK3N0cnVjdCBfR3N0UlRQUnR4UXVldWVDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworCitHVHlwZSBnc3RfcnRwX3J0eF9xdWV1ZV9nZXRfdHlwZSAodm9pZCk7CitnYm9vbGVhbiBnc3RfcnRwX3J0eF9xdWV1ZV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9SVFBfUlRYX1FVRVVFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5jIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOGE2NjYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmMKQEAgLTAsMCArMSw3OTEgQEAKKy8qIFJUUCBSZXRyYW5zbWlzc2lvbiByZWNlaXZlciBlbGVtZW50IGZvciBHU3RyZWFtZXIKKyAqCisgKiBnc3RydHBydHhyZWNlaXZlLmM6CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIENvbGxhYm9yYSBMdGQuCisgKiAgIEBhdXRob3IgSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwcnR4cmVjZWl2ZQorICogQHNlZV9hbHNvOiBydHBydHhzZW5kLCBydHBzZXNzaW9uLCBydHBqaXR0ZXJidWZmZXIKKyAqCisgKiBydHBydHhyZWNlaXZlIGxpc3RlbnMgdG8gdGhlIHJldHJhbnNtaXNzaW9uIGV2ZW50cyBmcm9tIHRoZQorICogZG93bnN0cmVhbSBydHBqaXR0ZXJidWZmZXIgYW5kIHJlbWVtYmVycyB0aGUgU1NSQyAoc3NyYzEpIG9mIHRoZSBzdHJlYW0gYW5kCisgKiB0aGUgc2VxdWVuY2UgbnVtYmVyIHRoYXQgd2FzIHJlcXVlc3RlZC4gV2hlbiBpdCByZWNlaXZlcyBhIHBhY2tldCB3aXRoCisgKiBhIHNlcXVlbmNlIG51bWJlciBlcXVhbCB0byBvbmUgb2YgdGhlIG9uZXMgc3RvcmVkIGFuZCB3aXRoIGEgZGlmZmVyZW50IFNTUkMsCisgKiBpdCBpZGVudGlmaWVzIHRoZSBuZXcgU1NSQyAoc3NyYzIpIGFzIHRoZSByZXRyYW5zbWlzc2lvbiBzdHJlYW0gb2Ygc3NyYzEuCisgKiBGcm9tIHRoaXMgcG9pbnQgb24sIGl0IHJlcGxhY2VzIHNzcmMyIHdpdGggc3NyYzEgaW4gYWxsIHBhY2tldHMgb2YgdGhlCisgKiBzc3JjMiBzdHJlYW0gYW5kIGZsYWdzIHRoZW0gYXMgcmV0cmFuc21pc3Npb25zLCBzbyB0aGF0IHJ0cGppdHRlcmJ1ZmZlcgorICogY2FuIHJlY29uc3RydWN0IHRoZSBvcmlnaW5hbCBzdHJlYW0uCisgKgorICogVGhpcyBhbGdvcml0aG0gaXMgaW1wbGVtZW50ZWQgYXMgc3BlY2lmaWVkIGluIFJGQyA0NTg4LgorICoKKyAqIFRoaXMgZWxlbWVudCBpcyBtZWFudCB0byBiZSB1c2VkIHdpdGggcnRwcnR4c2VuZCBvbiB0aGUgc2VuZGVyIHNpZGUuCisgKiBTZWUgI0dzdFJ0cFJ0eFNlbmQKKyAqCisgKiBCZWxvdyB5b3UgY2FuIHNlZSBzb21lIGV4YW1wbGVzIHRoYXQgaWxsdXN0cmF0ZSBob3cgcnRwcnR4cmVjZWl2ZSBhbmQKKyAqIHJ0cHJ0eHNlbmQgZml0IGFtb25nIHRoZSBvdGhlciBydHAgZWxlbWVudHMgYW5kIGhvdyB0aGV5IHdvcmsgaW50ZXJuYWxseS4KKyAqIE5vcm1hbGx5LCBob2V3ZXZlciwgeW91IHNob3VsZCBhdm9pZCB1c2luZyBzdWNoIHBpcGVsaW5lcyBhbmQgdXNlCisgKiBydHBiaW4gaW5zdGVhZCwgd2l0aCBpdHMgI0dzdFJ0cEJpbjo6cmVxdWVzdC1hdXgtc2VuZGVyIGFuZAorICogI0dzdFJ0cEJpbjo6cmVxdWVzdC1hdXgtcmVjZWl2ZXIgc2lnbmFscy4gU2VlICNHc3RSdHBCaW4uCisgKgorICogIyBFeGFtcGxlIHBpcGVsaW5lcworICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHJ0cHNlc3Npb24gbmFtZT1ydHBzZXNzaW9uIHJ0cC1wcm9maWxlPWF2cGYgXAorICogICAgIGF1ZGlvdGVzdHNyYyBpcy1saXZlPXRydWUgISBvcHVzZW5jICEgcnRwb3B1c3BheSBwdD05NiAhIFwKKyAqICAgICAgICAgcnRwcnR4c2VuZCBwYXlsb2FkLXR5cGUtbWFwPSJhcHBsaWNhdGlvbi94LXJ0cC1wdC1tYXAsOTY9KHVpbnQpOTciICEgXAorICogICAgICAgICBydHBzZXNzaW9uLnNlbmRfcnRwX3NpbmsgXAorICogICAgIHJ0cHNlc3Npb24uc2VuZF9ydHBfc3JjICEgaWRlbnRpdHkgZHJvcC1wcm9iYWJpbGl0eT0wLjAxICEgXAorICogICAgICAgICB1ZHBzaW5rIGhvc3Q9IjEyNy4wLjAuMSIgcG9ydD01MDAwIFwKKyAqICAgICB1ZHBzcmMgcG9ydD01MDAxICEgcnRwc2Vzc2lvbi5yZWN2X3J0Y3Bfc2luayBcCisgKiAgICAgcnRwc2Vzc2lvbi5zZW5kX3J0Y3Bfc3JjICEgdWRwc2luayBob3N0PSIxMjcuMC4wLjEiIHBvcnQ9NTAwMiBcCisgKiAgICAgICAgIHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UKKyAqIF18IFNlbmQgYXVkaW8gc3RyZWFtIHRocm91Z2ggcG9ydCA1MDAwICg1MDAxIGFuZCA1MDAyIGFyZSBqdXN0IHRoZSBydGNwCisgKiBsaW5rIHdpdGggdGhlIHJlY2VpdmVyKQorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHJ0cHNlc3Npb24gbmFtZT1ydHBzZXNzaW9uIHJ0cC1wcm9maWxlPWF2cGYgXAorICogICAgIHVkcHNyYyBwb3J0PTUwMDAgY2Fwcz0iYXBwbGljYXRpb24veC1ydHAsbWVkaWE9KHN0cmluZylhdWRpbyxjbG9jay1yYXRlPShpbnQpNDgwMDAsZW5jb2RpbmctbmFtZT0oc3RyaW5nKU9QVVMscGF5bG9hZD0oaW50KTk2IiAhIFwKKyAqICAgICAgICAgcnRwc2Vzc2lvbi5yZWN2X3J0cF9zaW5rIFwKKyAqICAgICBydHBzZXNzaW9uLnJlY3ZfcnRwX3NyYyAhIFwKKyAqICAgICAgICAgcnRwcnR4cmVjZWl2ZSBwYXlsb2FkLXR5cGUtbWFwPSJhcHBsaWNhdGlvbi94LXJ0cC1wdC1tYXAsOTY9KHVpbnQpOTciICEgXAorICogICAgICAgICBydHBzc3JjZGVtdXggISBydHBqaXR0ZXJidWZmZXIgZG8tcmV0cmFuc21pc3Npb249dHJ1ZSAhIFwKKyAqICAgICAgICAgcnRwb3B1c2RlcGF5ICEgb3B1c2RlYyAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhdXRvYXVkaW9zaW5rIFwKKyAqICAgICBydHBzZXNzaW9uLnNlbmRfcnRjcF9zcmMgISBcCisgKiAgICAgICAgIHVkcHNpbmsgaG9zdD0iMTI3LjAuMC4xIiBwb3J0PTUwMDEgc3luYz1mYWxzZSBhc3luYz1mYWxzZSBcCisgKiAgICAgdWRwc3JjIHBvcnQ9NTAwMiAhIHJ0cHNlc3Npb24ucmVjdl9ydGNwX3NpbmsKKyAqIF18IFJlY2VpdmUgYXVkaW8gc3RyZWFtIGZyb20gcG9ydCA1MDAwICg1MDAxIGFuZCA1MDAyIGFyZSBqdXN0IHRoZSBydGNwCisgKiBsaW5rIHdpdGggdGhlIHNlbmRlcikKKyAqCisgKiBJbiB0aGlzIGV4YW1wbGUgd2UgY2FuIHNlZSBhIHNpbXBsZSBzdHJlYW1pbmcgb2YgYW4gT1BVUyBzdHJlYW0gd2l0aCBzb21lCisgKiBvZiB0aGUgcGFja2V0cyBiZWluZyBhcnRpZmljaWFsbHkgZHJvcHBlZCBieSB0aGUgaWRlbnRpdHkgZWxlbWVudC4KKyAqIFRoYW5rcyB0byByZXRyYW5zbWlzc2lvbiwgeW91IHNob3VsZCBzdGlsbCBoZWFyIGEgY2xlYXIgc291bmQgd2hlbiBzZXR0aW5nCisgKiBkcm9wLXByb2JhYmlsaXR5IHRvIHNvbWV0aGluZyBncmVhdGVyIHRoYW4gMC4KKyAqCisgKiBJbnRlcm5hbGx5LCB0aGUgcnRwaml0dGVyYnVmZmVyIHdpbGwgZ2VuZXJhdGUgYSBjdXN0b20gdXBzdHJlYW0gZXZlbnQsCisgKiBHc3RSVFBSZXRyYW5zbWlzc2lvblJlcXVlc3QsIHdoZW4gaXQgZGV0ZWN0cyB0aGF0IG9uZSBwYWNrZXQgaXMgbWlzc2luZy4KKyAqIFRoZW4gdGhpcyByZXF1ZXN0IGlzIHRyYW5zbGF0ZWQgdG8gYSBGQiBOQUNLIGluIHRoZSBydGNwIGxpbmsgYnkgcnRwc2Vzc2lvbi4KKyAqIEZpbmFsbHkgdGhlIHJ0cHNlc3Npb24gb2YgdGhlIHNlbmRlciBzaWRlIHdpbGwgcmUtY29udmVydCBpdCBpbiBhCisgKiBHc3RSVFBSZXRyYW5zbWlzc2lvblJlcXVlc3QgdGhhdCB3aWxsIGJlIGhhbmRsZWQgYnkgcnRwcnR4c2VuZC4gcnRwcnR4c2VuZAorICogd2lsbCB0aGVuIHJlLXNlbmQgdGhlIG1pc3NpbmcgcGFja2V0IHdpdGggYSBuZXcgc3JyYyBhbmQgYSBkaWZmZXJlbnQgcGF5bG9hZAorICogdHlwZSAoaGVyZSwgOTcpLCBidXQgd2l0aCB0aGUgc2FtZSBvcmlnaW5hbCBzZXF1ZW5jZSBudW1iZXIuIE9uIHRoZSByZWNlaXZlcgorICogc2lkZSwgcnRwcnR4cmVjZWl2ZSB3aWxsIGFzc29jaWF0ZSB0aGlzIG5ldyBzdHJlYW0gd2l0aCB0aGUgb3JpZ2luYWwgYW5kCisgKiBmb3J3YXJkIHRoZSByZXRyYW5zbWlzc2lvbiBwYWNrZXRzIHRvIHJ0cGppdHRlcmJ1ZmZlciB3aXRoIHRoZSBvcmlnaW5hbAorICogc3NyYyBhbmQgcGF5bG9hZCB0eXBlLgorICoKKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBydHBzZXNzaW9uIG5hbWU9cnRwc2Vzc2lvbiBydHAtcHJvZmlsZT1hdnBmIFwKKyAqICAgICBhdWRpb3Rlc3RzcmMgaXMtbGl2ZT10cnVlICEgb3B1c2VuYyAhIHJ0cG9wdXNwYXkgcHQ9OTcgc2VxbnVtLW9mZnNldD0xICEgXAorICogICAgICAgICBydHBydHhzZW5kIHBheWxvYWQtdHlwZS1tYXA9ImFwcGxpY2F0aW9uL3gtcnRwLXB0LW1hcCw5Nz0odWludCk5OSIgISBcCisgKiAgICAgICAgIGZ1bm5lbCBuYW1lPWYgISBydHBzZXNzaW9uLnNlbmRfcnRwX3NpbmsgXAorICogICAgIGF1ZGlvdGVzdHNyYyBmcmVxPTY2MC4wIGlzLWxpdmU9dHJ1ZSAhIG9wdXNlbmMgISBcCisgKiAgICAgICAgIHJ0cG9wdXNwYXkgcHQ9OTcgc2VxbnVtLW9mZnNldD0xMDAgISBcCisgKiAgICAgICAgIHJ0cHJ0eHNlbmQgcGF5bG9hZC10eXBlLW1hcD0iYXBwbGljYXRpb24veC1ydHAtcHQtbWFwLDk3PSh1aW50KTk5IiAhIFwKKyAqICAgICAgICAgZi4gXAorICogICAgIHJ0cHNlc3Npb24uc2VuZF9ydHBfc3JjICEgaWRlbnRpdHkgZHJvcC1wcm9iYWJpbGl0eT0wLjAxICEgXAorICogICAgICAgICB1ZHBzaW5rIGhvc3Q9IjEyNy4wLjAuMSIgcG9ydD01MDAwIFwKKyAqICAgICB1ZHBzcmMgcG9ydD01MDAxICEgcnRwc2Vzc2lvbi5yZWN2X3J0Y3Bfc2luayBcCisgKiAgICAgcnRwc2Vzc2lvbi5zZW5kX3J0Y3Bfc3JjICEgdWRwc2luayBob3N0PSIxMjcuMC4wLjEiIHBvcnQ9NTAwMiBcCisgKiAgICAgICAgIHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UKKyAqIF18IFNlbmQgdHdvIGF1ZGlvIHN0cmVhbXMgdG8gcG9ydCA1MDAwLgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHJ0cHNlc3Npb24gbmFtZT1ydHBzZXNzaW9uIHJ0cC1wcm9maWxlPWF2cGYgXAorICogICAgIHVkcHNyYyBwb3J0PTUwMDAgY2Fwcz0iYXBwbGljYXRpb24veC1ydHAsbWVkaWE9KHN0cmluZylhdWRpbyxjbG9jay1yYXRlPShpbnQpNDgwMDAsZW5jb2RpbmctbmFtZT0oc3RyaW5nKU9QVVMscGF5bG9hZD0oaW50KTk3IiAhIFwKKyAqICAgICAgICAgcnRwc2Vzc2lvbi5yZWN2X3J0cF9zaW5rIFwKKyAqICAgICBydHBzZXNzaW9uLnJlY3ZfcnRwX3NyYyAhIFwKKyAqICAgICAgICAgcnRwcnR4cmVjZWl2ZSBwYXlsb2FkLXR5cGUtbWFwPSJhcHBsaWNhdGlvbi94LXJ0cC1wdC1tYXAsOTc9KHVpbnQpOTkiICEgXAorICogICAgICAgICBydHBzc3JjZGVtdXggbmFtZT1kZW11eCBcCisgKiAgICAgZGVtdXguICEgcXVldWUgISBydHBqaXR0ZXJidWZmZXIgZG8tcmV0cmFuc21pc3Npb249dHJ1ZSAhIHJ0cG9wdXNkZXBheSAhIFwKKyAqICAgICAgICAgb3B1c2RlYyAhIGF1ZGlvY29udmVydCAhIGF1dG9hdWRpb3NpbmsgXAorICogICAgIGRlbXV4LiAhIHF1ZXVlICEgcnRwaml0dGVyYnVmZmVyIGRvLXJldHJhbnNtaXNzaW9uPXRydWUgISBydHBvcHVzZGVwYXkgISBcCisgKiAgICAgICAgIG9wdXNkZWMgISBhdWRpb2NvbnZlcnQgISBhdXRvYXVkaW9zaW5rIFwKKyAqICAgICB1ZHBzcmMgcG9ydD01MDAyICEgcnRwc2Vzc2lvbi5yZWN2X3J0Y3Bfc2luayBcCisgKiAgICAgcnRwc2Vzc2lvbi5zZW5kX3J0Y3Bfc3JjICEgdWRwc2luayBob3N0PSIxMjcuMC4wLjEiIHBvcnQ9NTAwMSBcCisgKiAgICAgICAgIHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UKKyAqIF18IFJlY2VpdmUgdHdvIGF1ZGlvIHN0cmVhbXMgZnJvbSBwb3J0IDUwMDAuCisgKgorICogSW4gdGhpcyBleGFtcGxlIHdlIGFyZSBzdHJlYW1pbmcgdHdvIHN0cmVhbXMgb2YgdGhlIHNhbWUgdHlwZSB0aHJvdWdoIHRoZQorICogc2FtZSBwb3J0LiBUaGV5LCBob3dldmVyLCBhcmUgdXNpbmcgYSBkaWZmZXJlbnQgU1NSQyAoc3NyYyBpcyByYW5kb21seQorICogZ2VuZXJhdGVkIG9uIGVhY2ggcGF5bG9hZGVyIC0gcnRwb3B1c3BheSBpbiB0aGlzIGV4YW1wbGUpLCBzbyB0aGV5IGNhbiBiZQorICogaWRlbnRpZmllZCBhbmQgZGVtdWx0aXBsZXhlZCBieSBydHBzc3JjZGVtdXggb24gdGhlIHJlY2VpdmVyIHNpZGUuIFRoaXMgaXMKKyAqIGFuIGV4YW1wbGUgb2YgU1NSQy1tdWx0aXBsZXhpbmcuCisgKgorICogSXQgaXMgaW1wb3J0YW50IGhlcmUgdG8gdXNlIGEgZGlmZmVyZW50IHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlcgorICogKHNlcW51bS1vZmZzZXQpLCBzaW5jZSB0aGlzIGlzIHRoZSBvbmx5IG1lYW5zIG9mIGlkZW50aWZpY2F0aW9uIHRoYXQKKyAqIHJ0cHJ0eHJlY2VpdmUgdXNlcyB0aGUgdmVyeSBmaXJzdCB0aW1lIHRvIGlkZW50aWZ5IHJldHJhbnNtaXNzaW9uIHN0cmVhbXMuCisgKiBJdCBpcyBhbiBlcnJvciwgYWNjb3JkaW5nIHRvIFJGQzQ1ODggdG8gaGF2ZSB0d28gcmV0cmFuc21pc3Npb24gcmVxdWVzdHMgZm9yCisgKiBwYWNrZXRzIGJlbG9uZ2luZyB0byB0d28gZGlmZmVyZW50IHN0cmVhbXMgYnV0IHdpdGggdGhlIHNhbWUgc2VxdWVuY2UgbnVtYmVyLgorICogTm90ZSB0aGF0IHRoZSBkZWZhdWx0IHNlcW51bS1vZmZzZXQgdmFsdWUgKC0xLCB3aGljaCBtZWFucyByYW5kb20pIHdvdWxkCisgKiB3b3JrIGp1c3QgZmluZSwgYnV0IGl0IGlzIG92ZXJyaWRlbiBoZXJlIGZvciBpbGx1c3RyYXRpb24gcHVycG9zZXMuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnc3RydHBydHhyZWNlaXZlLmgiCisKKyNkZWZpbmUgQVNTT0NfVElNRU9VVCAoR1NUX1NFQ09ORCkKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3J0cF9ydHhfcmVjZWl2ZV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfcnRwX3J0eF9yZWNlaXZlX2RlYnVnCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX1BBWUxPQURfVFlQRV9NQVAsCisgIFBST1BfTlVNX1JUWF9SRVFVRVNUUywKKyAgUFJPUF9OVU1fUlRYX1BBQ0tFVFMsCisgIFBST1BfTlVNX1JUWF9BU1NPQ19QQUNLRVRTCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCIpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfcnR4X3JlY2VpdmVfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfcnR4X3JlY2VpdmVfY2hhaW4gKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX3J0eF9yZWNlaXZlX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfcnR4X3JlY2VpdmVfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9ydHhfcmVjZWl2ZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX3J0eF9yZWNlaXZlX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworR19ERUZJTkVfVFlQRSAoR3N0UnRwUnR4UmVjZWl2ZSwgZ3N0X3J0cF9ydHhfcmVjZWl2ZSwgR1NUX1RZUEVfRUxFTUVOVCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3J0eF9yZWNlaXZlX2NsYXNzX2luaXQgKEdzdFJ0cFJ0eFJlY2VpdmVDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9ydHhfcmVjZWl2ZV9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9ydHBfcnR4X3JlY2VpdmVfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfcnR4X3JlY2VpdmVfZmluYWxpemU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QQVlMT0FEX1RZUEVfTUFQLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgicGF5bG9hZC10eXBlLW1hcCIsICJQYXlsb2FkIFR5cGUgTWFwIiwKKyAgICAgICAgICAiTWFwIG9mIG9yaWdpbmFsIHBheWxvYWQgdHlwZXMgdG8gdGhlaXIgcmV0cmFuc21pc3Npb24gcGF5bG9hZCB0eXBlcyIsCisgICAgICAgICAgR1NUX1RZUEVfU1RSVUNUVVJFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX05VTV9SVFhfUkVRVUVTVFMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm51bS1ydHgtcmVxdWVzdHMiLCAiTnVtIFJUWCBSZXF1ZXN0cyIsCisgICAgICAgICAgIk51bWJlciBvZiByZXRyYW5zbWlzc2lvbiBldmVudHMgcmVjZWl2ZWQiLCAwLCBHX01BWFVJTlQsCisgICAgICAgICAgMCwgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX05VTV9SVFhfUEFDS0VUUywKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibnVtLXJ0eC1wYWNrZXRzIiwgIk51bSBSVFggUGFja2V0cyIsCisgICAgICAgICAgIiBOdW1iZXIgb2YgcmV0cmFuc21pc3Npb24gcGFja2V0cyByZWNlaXZlZCIsIDAsIEdfTUFYVUlOVCwKKyAgICAgICAgICAwLCBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTlVNX1JUWF9BU1NPQ19QQUNLRVRTLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJudW0tcnR4LWFzc29jLXBhY2tldHMiLAorICAgICAgICAgICJOdW0gUlRYIEFzc29jaWF0ZWQgUGFja2V0cyIsICJOdW1iZXIgb2YgcmV0cmFuc21pc3Npb24gcGFja2V0cyAiCisgICAgICAgICAgImNvcnJlY3RseSBhc3NvY2lhdGVkIHdpdGggcmV0cmFuc21pc3Npb24gcmVxdWVzdHMiLCAwLCBHX01BWFVJTlQsCisgICAgICAgICAgMCwgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNyY19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX2ZhY3RvcnkpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIFJldHJhbnNtaXNzaW9uIHJlY2VpdmVyIiwgIkNvZGVjIiwKKyAgICAgICJSZWNlaXZlIHJldHJhbnNtaXR0ZWQgUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQzQ1ODgiLAorICAgICAgIkp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPiIpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9ydHhfcmVjZWl2ZV9jaGFuZ2Vfc3RhdGUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9ydHhfcmVjZWl2ZV9yZXNldCAoR3N0UnRwUnR4UmVjZWl2ZSAqIHJ0eCkKK3sKKyAgR1NUX09CSkVDVF9MT0NLIChydHgpOworICBnX2hhc2hfdGFibGVfcmVtb3ZlX2FsbCAocnR4LT5zc3JjMl9zc3JjMV9tYXApOworICBnX2hhc2hfdGFibGVfcmVtb3ZlX2FsbCAocnR4LT5zZXFudW1fc3NyYzFfbWFwKTsKKyAgcnR4LT5udW1fcnR4X3JlcXVlc3RzID0gMDsKKyAgcnR4LT5udW1fcnR4X3BhY2tldHMgPSAwOworICBydHgtPm51bV9ydHhfYXNzb2NfcGFja2V0cyA9IDA7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9ydHhfcmVjZWl2ZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwUnR4UmVjZWl2ZSAqcnR4ID0gR1NUX1JUUF9SVFhfUkVDRUlWRSAob2JqZWN0KTsKKworICBnX2hhc2hfdGFibGVfdW5yZWYgKHJ0eC0+c3NyYzJfc3NyYzFfbWFwKTsKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChydHgtPnNlcW51bV9zc3JjMV9tYXApOworICBnX2hhc2hfdGFibGVfdW5yZWYgKHJ0eC0+cnR4X3B0X21hcCk7CisgIGlmIChydHgtPnJ0eF9wdF9tYXBfc3RydWN0dXJlKQorICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocnR4LT5ydHhfcHRfbWFwX3N0cnVjdHVyZSk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKGdzdF9ydHBfcnR4X3JlY2VpdmVfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGd1aW50MzIgc3NyYzsKKyAgR3N0Q2xvY2tUaW1lIHRpbWU7Cit9IFNzcmNBc3NvYzsKKworc3RhdGljIFNzcmNBc3NvYyAqCitzc3JjX2Fzc29jX25ldyAoZ3VpbnQzMiBzc3JjLCBHc3RDbG9ja1RpbWUgdGltZSkKK3sKKyAgU3NyY0Fzc29jICphc3NvYyA9IGdfc2xpY2VfbmV3IChTc3JjQXNzb2MpOworCisgIGFzc29jLT5zc3JjID0gc3NyYzsKKyAgYXNzb2MtPnRpbWUgPSB0aW1lOworCisgIHJldHVybiBhc3NvYzsKK30KKworc3RhdGljIHZvaWQKK3NzcmNfYXNzb2NfZnJlZSAoU3NyY0Fzc29jICogYXNzb2MpCit7CisgIGdfc2xpY2VfZnJlZSAoU3NyY0Fzc29jLCBhc3NvYyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3J0eF9yZWNlaXZlX2luaXQgKEdzdFJ0cFJ0eFJlY2VpdmUgKiBydHgpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqa2xhc3MgPSBHU1RfRUxFTUVOVF9HRVRfQ0xBU1MgKHJ0eCk7CisKKyAgcnR4LT5zcmNwYWQgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV90ZW1wbGF0ZSAoZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsCisgICAgICAgICAgInNyYyIpLCAic3JjIik7CisgIEdTVF9QQURfU0VUX1BST1hZX0NBUFMgKHJ0eC0+c3JjcGFkKTsKKyAgR1NUX1BBRF9TRVRfUFJPWFlfQUxMT0NBVElPTiAocnR4LT5zcmNwYWQpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAocnR4LT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9ydHhfcmVjZWl2ZV9zcmNfZXZlbnQpKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKHJ0eCksIHJ0eC0+c3JjcGFkKTsKKworICBydHgtPnNpbmtwYWQgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV90ZW1wbGF0ZSAoZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsCisgICAgICAgICAgInNpbmsiKSwgInNpbmsiKTsKKyAgR1NUX1BBRF9TRVRfUFJPWFlfQ0FQUyAocnR4LT5zaW5rcGFkKTsKKyAgR1NUX1BBRF9TRVRfUFJPWFlfQUxMT0NBVElPTiAocnR4LT5zaW5rcGFkKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHJ0eC0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX3J0eF9yZWNlaXZlX2NoYWluKSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChydHgpLCBydHgtPnNpbmtwYWQpOworCisgIHJ0eC0+c3NyYzJfc3NyYzFfbWFwID0gZ19oYXNoX3RhYmxlX25ldyAoZ19kaXJlY3RfaGFzaCwgZ19kaXJlY3RfZXF1YWwpOworICBydHgtPnNlcW51bV9zc3JjMV9tYXAgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfZGlyZWN0X2hhc2gsIGdfZGlyZWN0X2VxdWFsLAorICAgICAgTlVMTCwgKEdEZXN0cm95Tm90aWZ5KSBzc3JjX2Fzc29jX2ZyZWUpOworCisgIHJ0eC0+cnR4X3B0X21hcCA9IGdfaGFzaF90YWJsZV9uZXcgKGdfZGlyZWN0X2hhc2gsIGdfZGlyZWN0X2VxdWFsKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3J0eF9yZWNlaXZlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UnRwUnR4UmVjZWl2ZSAqcnR4ID0gR1NUX1JUUF9SVFhfUkVDRUlWRSAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTToKKyAgICB7CisgICAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfZXZlbnRfZ2V0X3N0cnVjdHVyZSAoZXZlbnQpOworCisgICAgICAvKiBUaGlzIGV2ZW50IHVzdWFsbHkgY29tZXMgZnJvbSB0aGUgZG93bnN0cmVhbSBnc3RydHBqaXR0ZXJidWZmZXIgKi8KKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiR3N0UlRQUmV0cmFuc21pc3Npb25SZXF1ZXN0IikpIHsKKyAgICAgICAgZ3VpbnQgc2VxbnVtID0gMDsKKyAgICAgICAgZ3VpbnQgc3NyYyA9IDA7CisgICAgICAgIGdwb2ludGVyIHNzcmMyID0gMDsKKworICAgICAgICAvKiByZXRyaWV2ZSBzZXFudW0gb2YgdGhlIHBhY2tldCB0aGF0IG5lZWQgdG8gYmUgcmV0cmFuc21pdHRlZCAqLworICAgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQgKHMsICJzZXFudW0iLCAmc2VxbnVtKSkKKyAgICAgICAgICBzZXFudW0gPSAtMTsKKworICAgICAgICAvKiByZXRyaWV2ZSBzc3JjIG9mIHRoZSBwYWNrZXQgdGhhdCBuZWVkIHRvIGJlIHJldHJhbnNtaXR0ZWQKKyAgICAgICAgICogaXQncyB1c2VmdWwgd2hlbiByZWNvbnN0cnVjdGluZyB0aGUgb3JpZ2luYWwgcGFja2V0IGZyb20gdGhlIHJ0eCBwYWNrZXQgKi8KKyAgICAgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF91aW50IChzLCAic3NyYyIsICZzc3JjKSkKKyAgICAgICAgICBzc3JjID0gLTE7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnR4LCAiZ290IHJ0eCByZXF1ZXN0IGZvciBzZXFudW06ICV1LCBzc3JjOiAlWCIsCisgICAgICAgICAgICBzZXFudW0sIHNzcmMpOworCisgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocnR4KTsKKworICAgICAgICAvKiBpbmNyZWFzZSBudW1iZXIgb2Ygc2VlbiByZXF1ZXN0cyBmb3Igb3VyIHN0YXRpc3RpY3MgKi8KKyAgICAgICAgKytydHgtPm51bV9ydHhfcmVxdWVzdHM7CisKKyAgICAgICAgLyogRmlyc3QsIHdlIGxvb2t1cCBpbiBvdXIgbWFwIHRvIHNlZSBpZiB3ZSBoYXZlIGFscmVhZHkgYXNzb2NpYXRlIHRoaXMKKyAgICAgICAgICogbWFzdGVyIHN0cmVhbSBzc3JjIHdpdGggaXRzIHJldHJhbnNtaXR0ZWQgc3RyZWFtLgorICAgICAgICAgKiBFdmVyeSBzc3JjIGFyZSB1bmlxdWUgc28gd2UgY2FuIHVzZSB0aGUgc2FtZSBoYXNoIHRhYmxlCisgICAgICAgICAqIGZvciBib3RoIHJldHJpZXZpbmcgdGhlIHNzcmMxIGZyb20gc3NyYzIgYW5kIGFsc28gc3NyYzIgZnJvbSBzc3JjMQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGdfaGFzaF90YWJsZV9sb29rdXBfZXh0ZW5kZWQgKHJ0eC0+c3NyYzJfc3NyYzFfbWFwLAorICAgICAgICAgICAgICAgIEdVSU5UX1RPX1BPSU5URVIgKHNzcmMpLCBOVUxMLCAmc3NyYzIpCisgICAgICAgICAgICAmJiBHUE9JTlRFUl9UT19VSU5UIChzc3JjMikgIT0gR1BPSU5URVJfVE9fVUlOVCAoc3NyYykpIHsKKyAgICAgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHgsICJSZXRyYW5zbWl0ZWQgc3RyZWFtICVYIGFscmVhZHkgYXNzb2NpYXRlZCAiCisgICAgICAgICAgICAgICJ0byBpdHMgbWFzdGVyLCAlWCIsIEdQT0lOVEVSX1RPX1VJTlQgKHNzcmMyKSwgc3NyYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgU3NyY0Fzc29jICphc3NvYzsKKworICAgICAgICAgIC8qIG5vdCBhbHJlYWR5IGFzc29jaWF0ZWQgYnV0IGFsc28gd2UgaGF2ZSB0byBjaGVjayB0aGF0IHdlIGhhdmUgbm90CisgICAgICAgICAgICogYWxyZWFkeSBjb25zaWRlcmVkIHRoaXMgcmVxdWVzdC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoZ19oYXNoX3RhYmxlX2xvb2t1cF9leHRlbmRlZCAocnR4LT5zZXFudW1fc3NyYzFfbWFwLAorICAgICAgICAgICAgICAgICAgR1VJTlRfVE9fUE9JTlRFUiAoc2VxbnVtKSwgTlVMTCwgKGdwb2ludGVyICopICYgYXNzb2MpKSB7CisgICAgICAgICAgICBpZiAoYXNzb2MtPnNzcmMgPT0gc3NyYykgeworICAgICAgICAgICAgICAvKiBzYW1lIHNlcW51bSwgc2FtZSBzc3JjICovCisKKyAgICAgICAgICAgICAgLyogZG8gbm90aGluZyBiZWNhdXNlIHdlIGhhdmUgYWxyZWFkeSBjb25zaWRlcmVkIHRoaXMgcmVxdWVzdAorICAgICAgICAgICAgICAgKiBUaGUgaml0dGVyIG1heSBiZSB0b28gaW1wYXRpZW50IG9mIHRoZSBydHggcGFja2V0IGhhcyBiZWVuCisgICAgICAgICAgICAgICAqIGxvc3QgdG9vLgorICAgICAgICAgICAgICAgKiBJdCBkb2VzIG5vdCBtZWFuIHdlIHJlamVjdCB0aGUgZXZlbnQsIHdlIHN0aWxsIHdhbnQgdG8gZm9yd2FyZAorICAgICAgICAgICAgICAgKiB0aGUgcmVxdWVzdCB0byB0aGUgZ3N0cnRwc2Vzc2lvbiB0byBiZSB0cmFuc2xhdGVyIGludG8gYSBGQiBOQUNLCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocnR4LCAiRHVwbGljYXRlIHJlcXVlc3Q6IHNlcW51bTogJXUsIHNzcmM6ICVYIiwKKyAgICAgICAgICAgICAgICAgIHNlcW51bSwgc3NyYyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvKiBzYW1lIHNlcW51bSwgZGlmZmVyZW50IHNzcmMgKi8KKworICAgICAgICAgICAgICAvKiBJZiB0aGUgYXNzb2NpYXRpb24gYXR0ZW1wdCBpcyBsYXJnZXIgdGhhbiBBU1NPQ19USU1FT1VULAorICAgICAgICAgICAgICAgKiB0aGVuIHdlIGdpdmUgdXAgb24gaXQsIGFuZCB0cnkgdGhpcyBvbmUuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBpZiAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChydHgtPmxhc3RfdGltZSkgfHwKKyAgICAgICAgICAgICAgICAgICFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoYXNzb2MtPnRpbWUpIHx8CisgICAgICAgICAgICAgICAgICBhc3NvYy0+dGltZSArIEFTU09DX1RJTUVPVVQgPCBydHgtPmxhc3RfdGltZSkgeworICAgICAgICAgICAgICAgIC8qIEZyb20gUkZDIDQ1ODg6CisgICAgICAgICAgICAgICAgICogdGhlIHJlY2VpdmVyIE1VU1QgTk9UIGhhdmUgdHdvIG91dHN0YW5kaW5nIHJlcXVlc3RzIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgKiBzYW1lIHBhY2tldCBzZXF1ZW5jZSBudW1iZXIgaW4gdHdvIGRpZmZlcmVudCBvcmlnaW5hbCBzdHJlYW1zCisgICAgICAgICAgICAgICAgICogYmVmb3JlIHRoZSBhc3NvY2lhdGlvbiBpcyByZXNvbHZlZC4gT3RoZXJ3aXNlIGl0J3MgaW1wb3NzaWJsZQorICAgICAgICAgICAgICAgICAqIHRvIGFzc29jaWF0ZSBhIHJ0eCBzdHJlYW0gYW5kIGl0cyBtYXN0ZXIgc3RyZWFtCisgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAvKiByZW1vdmUgc2VxbnVtIGluIG9yZGVyIHRvIHJldXNlIHRoZSBzcG90ICovCisgICAgICAgICAgICAgICAgZ19oYXNoX3RhYmxlX3JlbW92ZSAocnR4LT5zZXFudW1fc3NyYzFfbWFwLAorICAgICAgICAgICAgICAgICAgICBHVUlOVF9UT19QT0lOVEVSIChzZXFudW0pKTsKKyAgICAgICAgICAgICAgICBnb3RvIHJldHJhbnNtaXQ7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgR1NUX0lORk9fT0JKRUNUIChydHgsICJyZWplY3RpbmcgcmVxdWVzdCBmb3Igc2VxbnVtICV1IgorICAgICAgICAgICAgICAgICAgICAiIG9mIG1hc3RlciBzdHJlYW0gJVg7IHRoZXJlIGlzIGFscmVhZHkgYSBwZW5kaW5nIHJlcXVlc3QgIgorICAgICAgICAgICAgICAgICAgICAiZm9yIHRoZSBzYW1lIHNlcW51bSBvbiBzc3JjICVYIHRoYXQgaGFzIG5vdCBleHBpcmVkIiwKKyAgICAgICAgICAgICAgICAgICAgc2VxbnVtLCBzc3JjLCBhc3NvYy0+c3NyYyk7CisKKyAgICAgICAgICAgICAgICAvKiBkbyBub3QgZm9yd2FyZCB0aGUgZXZlbnQgYXMgd2UgYXJlIHJlamVjdGluZyB0aGlzIHJlcXVlc3QgKi8KKyAgICAgICAgICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKKyAgICAgICAgICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0cmFuc21pdDoKKyAgICAgICAgICAgIC8qIHRoZSByZXF1ZXN0IGhhcyBub3QgYmVlbiBhbHJlYWR5IGNvbnNpZGVyZWQKKyAgICAgICAgICAgICAqIGluc2VydCBpdCBmb3IgdGhlIGZpcnN0IHRpbWUgKi8KKyAgICAgICAgICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHJ0eC0+c2VxbnVtX3NzcmMxX21hcCwKKyAgICAgICAgICAgICAgICBHVUlOVF9UT19QT0lOVEVSIChzZXFudW0pLAorICAgICAgICAgICAgICAgIHNzcmNfYXNzb2NfbmV3IChzc3JjLCBydHgtPmxhc3RfdGltZSkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0eCwgInBhY2tldCBudW1iZXIgJXUgb2YgbWFzdGVyIHN0cmVhbSAlWCIKKyAgICAgICAgICAgICIgbmVlZHMgdG8gYmUgcmV0cmFuc21pdHRlZCIsIHNlcW51bSwgc3NyYyk7CisKKyAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0eCk7CisgICAgICB9CisKKyAgICAgIC8qIFRyYW5zZmVyIGV2ZW50IHVwc3RyZWFtIHNvIHRoYXQgdGhlIHJlcXVlc3QgY2FuIGFjdXRhbGx5IGJ5IHRyYW5zbGF0ZWQKKyAgICAgICAqIHRocm91Z2ggZ3N0cnRwc2Vzc2lvbiB0aHJvdWdoIHRoZSBuZXR3b3JrICovCisgICAgICByZXMgPSBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKKy8qIENvcHkgZml4ZWQgaGVhZGVyIGFuZCBleHRlbnNpb24uIFJlcGxhY2UgY3VycmVudCBzc3JjIGJ5IHNzcmMxLAorICogcmVtb3ZlIE9TTiBhbmQgcmVwbGFjZSBjdXJyZW50IHNlcSBudW0gYnkgT1NOLgorICogQ29weSBtZW1vcnkgdG8gYXZvaWQgdG8gbWFudWFsbHkgY29weSBlYWNoIHJ0cCBidWZmZXIgZmllbGQuCisgKi8KK3N0YXRpYyBHc3RCdWZmZXIgKgorX2dzdF9ydHBfYnVmZmVyX25ld19mcm9tX3J0eCAoR3N0UlRQQnVmZmVyICogcnRwLCBndWludDMyIHNzcmMxLAorICAgIGd1aW50MTYgb3JpZ25fc2VxbnVtLCBndWludDggb3JpZ2luX3BheWxvYWRfdHlwZSkKK3sKKyAgR3N0TWVtb3J5ICptZW0gPSBOVUxMOworICBHc3RSVFBCdWZmZXIgbmV3X3J0cCA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisgIEdzdEJ1ZmZlciAqbmV3X2J1ZmZlciA9IGdzdF9idWZmZXJfbmV3ICgpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQgcGF5bG9hZF9sZW4gPSAwOworCisgIC8qIGNvcHkgZml4ZWQgaGVhZGVyICovCisgIG1lbSA9IGdzdF9tZW1vcnlfY29weSAocnRwLT5tYXBbMF0ubWVtb3J5LAorICAgICAgKGd1aW50OCAqKSBydHAtPmRhdGFbMF0gLSBydHAtPm1hcFswXS5kYXRhLCBydHAtPnNpemVbMF0pOworICBnc3RfYnVmZmVyX2FwcGVuZF9tZW1vcnkgKG5ld19idWZmZXIsIG1lbSk7CisKKyAgLyogY29weSBleHRlbnNpb24gaWYgYW55ICovCisgIGlmIChydHAtPnNpemVbMV0pIHsKKyAgICBtZW0gPSBnc3RfbWVtb3J5X2NvcHkgKHJ0cC0+bWFwWzFdLm1lbW9yeSwKKyAgICAgICAgKGd1aW50OCAqKSBydHAtPmRhdGFbMV0gLSBydHAtPm1hcFsxXS5kYXRhLCBydHAtPnNpemVbMV0pOworICAgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAobmV3X2J1ZmZlciwgbWVtKTsKKyAgfQorCisgIC8qIGNvcHkgcGF5bG9hZCBhbmQgcmVtb3ZlIE9TTiAqLworICBwYXlsb2FkX2xlbiA9IHJ0cC0+c2l6ZVsyXSAtIDI7CisgIG1lbSA9IGdzdF9hbGxvY2F0b3JfYWxsb2MgKE5VTEwsIHBheWxvYWRfbGVuLCBOVUxMKTsKKworICBnc3RfbWVtb3J5X21hcCAobWVtLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaWYgKHJ0cC0+c2l6ZVsyXSkKKyAgICBtZW1jcHkgKG1hcC5kYXRhLCAoZ3VpbnQ4ICopIHJ0cC0+ZGF0YVsyXSArIDIsIHBheWxvYWRfbGVuKTsKKyAgZ3N0X21lbW9yeV91bm1hcCAobWVtLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl9hcHBlbmRfbWVtb3J5IChuZXdfYnVmZmVyLCBtZW0pOworCisgIC8qIHRoZSBzZW5kZXIgYWx3YXlzIGNvbnN0cnVjdHMgcnR4IHBhY2tldHMgd2l0aG91dCBwYWRkaW5nLAorICAgKiBCdXQgdGhlIHJlY2VpdmVyIGNhbiBzdGlsbCByZWNlaXZlIHJ0eCBwYWNrZXRzIHdpdGggcGFkZGluZy4KKyAgICogU28ganVzdCBjb3B5IGl0LgorICAgKi8KKyAgaWYgKHJ0cC0+c2l6ZVszXSkgeworICAgIGd1aW50IHBhZF9sZW4gPSBydHAtPnNpemVbM107CisKKyAgICBtZW0gPSBnc3RfYWxsb2NhdG9yX2FsbG9jIChOVUxMLCBwYWRfbGVuLCBOVUxMKTsKKworICAgIGdzdF9tZW1vcnlfbWFwIChtZW0sICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgIG1hcC5kYXRhW3BhZF9sZW4gLSAxXSA9IHBhZF9sZW47CisgICAgZ3N0X21lbW9yeV91bm1hcCAobWVtLCAmbWFwKTsKKworICAgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAobmV3X2J1ZmZlciwgbWVtKTsKKyAgfQorCisgIC8qIHNldCBzc3JjIGFuZCBzZXEgbnVtICovCisgIGdzdF9ydHBfYnVmZmVyX21hcCAobmV3X2J1ZmZlciwgR1NUX01BUF9XUklURSwgJm5ld19ydHApOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfc3NyYyAoJm5ld19ydHAsIHNzcmMxKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3NlcSAoJm5ld19ydHAsIG9yaWduX3NlcW51bSk7CisgIGdzdF9ydHBfYnVmZmVyX3NldF9wYXlsb2FkX3R5cGUgKCZuZXdfcnRwLCBvcmlnaW5fcGF5bG9hZF90eXBlKTsKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZuZXdfcnRwKTsKKworICBnc3RfYnVmZmVyX2NvcHlfaW50byAobmV3X2J1ZmZlciwgcnRwLT5idWZmZXIsCisgICAgICBHU1RfQlVGRkVSX0NPUFlfRkxBR1MgfCBHU1RfQlVGRkVSX0NPUFlfVElNRVNUQU1QUywgMCwgLTEpOworICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChuZXdfYnVmZmVyLCBHU1RfUlRQX0JVRkZFUl9GTEFHX1JFVFJBTlNNSVNTSU9OKTsKKworICByZXR1cm4gbmV3X2J1ZmZlcjsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfcnR4X3JlY2VpdmVfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJ0cFJ0eFJlY2VpdmUgKnJ0eCA9IEdTVF9SVFBfUlRYX1JFQ0VJVkUgKHBhcmVudCk7CisgIEdzdFJUUEJ1ZmZlciBydHAgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RCdWZmZXIgKm5ld19idWZmZXIgPSBOVUxMOworICBndWludDMyIHNzcmMgPSAwOworICBncG9pbnRlciBzc3JjMSA9IDA7CisgIGd1aW50MzIgc3NyYzIgPSAwOworICBndWludDE2IHNlcW51bSA9IDA7CisgIGd1aW50MTYgb3JpZ25fc2VxbnVtID0gMDsKKyAgZ3VpbnQ4IHBheWxvYWRfdHlwZSA9IDA7CisgIGdwb2ludGVyIHBheWxvYWQgPSBOVUxMOworICBndWludDggb3JpZ2luX3BheWxvYWRfdHlwZSA9IDA7CisgIGdib29sZWFuIGlzX3J0eDsKKyAgZ2Jvb2xlYW4gZHJvcCA9IEZBTFNFOworCisgIC8qIG1hcCBjdXJyZW50IHJ0cCBwYWNrZXQgdG8gcGFyc2UgaXRzIGhlYWRlciAqLworICBpZiAoIWdzdF9ydHBfYnVmZmVyX21hcCAoYnVmZmVyLCBHU1RfTUFQX1JFQUQsICZydHApKQorICAgIGdvdG8gaW52YWxpZF9idWZmZXI7CisKKyAgc3NyYyA9IGdzdF9ydHBfYnVmZmVyX2dldF9zc3JjICgmcnRwKTsKKyAgc2VxbnVtID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3NlcSAoJnJ0cCk7CisgIHBheWxvYWRfdHlwZSA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3R5cGUgKCZydHApOworCisgIC8qIGNoZWNrIGlmIHdlIGhhdmUgYSByZXRyYW5zbWlzc2lvbiBwYWNrZXQgKHRoaXMgaW5mb3JtYXRpb24gY29tZXMgZnJvbSBTRFApICovCisgIEdTVF9PQkpFQ1RfTE9DSyAocnR4KTsKKworICBpc19ydHggPQorICAgICAgZ19oYXNoX3RhYmxlX2xvb2t1cF9leHRlbmRlZCAocnR4LT5ydHhfcHRfbWFwLAorICAgICAgR1VJTlRfVE9fUE9JTlRFUiAocGF5bG9hZF90eXBlKSwgTlVMTCwgTlVMTCk7CisKKyAgaWYgKGlzX3J0eCkgeworICAgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisKKyAgICBpZiAoIXBheWxvYWQgfHwgZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuICgmcnRwKSA8IDIpIHsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHgpOworICAgICAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworICAgICAgZ290byBpbnZhbGlkX2J1ZmZlcjsKKyAgICB9CisgIH0KKworICBydHgtPmxhc3RfdGltZSA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworCisgIGlmIChnX2hhc2hfdGFibGVfc2l6ZSAocnR4LT5zZXFudW1fc3NyYzFfbWFwKSA+IDApIHsKKyAgICBHSGFzaFRhYmxlSXRlciBpdGVyOworICAgIGdwb2ludGVyIGtleSwgdmFsdWU7CisKKyAgICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmaXRlciwgcnR4LT5zZXFudW1fc3NyYzFfbWFwKTsKKyAgICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJml0ZXIsICZrZXksICZ2YWx1ZSkpIHsKKyAgICAgIFNzcmNBc3NvYyAqYXNzb2MgPSB2YWx1ZTsKKworICAgICAgLyogcmVtb3ZlIGFzc29jaWF0aW9uIHJlcXVlc3QgaWYgaXQgaXMgdG9vIG9sZCAqLworICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChydHgtPmxhc3RfdGltZSkgJiYKKyAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoYXNzb2MtPnRpbWUpICYmCisgICAgICAgICAgYXNzb2MtPnRpbWUgKyBBU1NPQ19USU1FT1VUIDwgcnR4LT5sYXN0X3RpbWUpIHsKKyAgICAgICAgZ19oYXNoX3RhYmxlX2l0ZXJfcmVtb3ZlICgmaXRlcik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogaWYgdGhlIGN1cnJlbnQgcGFja2V0IGlzIGZyb20gYSByZXRyYW5zbWlzc2lvbiBzdHJlYW0gKi8KKyAgaWYgKGlzX3J0eCkgeworICAgIC8qIGluY3JlYXNlIG91ciBzdGF0aXN0aWMgKi8KKyAgICArK3J0eC0+bnVtX3J0eF9wYWNrZXRzOworCisgICAgLyogcmVhZCBPU04gaW4gdGhlIHJ0eCBwYXlsb2FkICovCisgICAgb3JpZ25fc2VxbnVtID0gR1NUX1JFQURfVUlOVDE2X0JFIChnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCkpOworICAgIG9yaWdpbl9wYXlsb2FkX3R5cGUgPQorICAgICAgICBHUE9JTlRFUl9UT19VSU5UIChnX2hhc2hfdGFibGVfbG9va3VwIChydHgtPnJ0eF9wdF9tYXAsCisgICAgICAgICAgICBHVUlOVF9UT19QT0lOVEVSIChwYXlsb2FkX3R5cGUpKSk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHgsICJHb3QgcnR4IHBhY2tldDogcnR4IHNlcW51bSAldSwgcnR4IHNzcmMgJVgsICIKKyAgICAgICAgInJ0eCBwdCAldSwgb3JpZyBzZXFudW0gJXUsIG9yaWcgcHQgJXUiLCBzZXFudW0sIHNzcmMsIHBheWxvYWRfdHlwZSwKKyAgICAgICAgb3JpZ25fc2VxbnVtLCBvcmlnaW5fcGF5bG9hZF90eXBlKTsKKworICAgIC8qIGZpcnN0IHdlIGNoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhc3NvY2lhdGVkIHRoaXMgcmV0cmFuc21pc3Npb24gc3RyZWFtCisgICAgICogdG8gYSBtYXN0ZXIgc3RyZWFtICovCisgICAgaWYgKGdfaGFzaF90YWJsZV9sb29rdXBfZXh0ZW5kZWQgKHJ0eC0+c3NyYzJfc3NyYzFfbWFwLAorICAgICAgICAgICAgR1VJTlRfVE9fUE9JTlRFUiAoc3NyYyksIE5VTEwsICZzc3JjMSkpIHsKKyAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0eCwKKyAgICAgICAgICAicGFja2V0IGlzIGZyb20gcmV0cmFuc21pc3Npb24gc3RyZWFtICVYIGFscmVhZHkgYXNzb2NpYXRlZCB0byAiCisgICAgICAgICAgIm1hc3RlciBzdHJlYW0gJVgiLCBzc3JjLCBHUE9JTlRFUl9UT19VSU5UIChzc3JjMSkpOworICAgICAgc3NyYzIgPSBzc3JjOworICAgIH0gZWxzZSB7CisgICAgICBTc3JjQXNzb2MgKmFzc29jOworCisgICAgICAvKiB0aGUgY3VycmVudCByZXRyYW5zbWl0dGVkIHBhY2tldCBoYXMgaXRzIHJ0eCBzdHJlYW0gbm90IGFscmVhZHkKKyAgICAgICAqIGFzc29jaWF0ZWQgdG8gYSBtYXN0ZXIgc3RyZWFtLCBzbyByZXRyaWV2ZSBpdCBmcm9tIG91ciByZXF1ZXN0CisgICAgICAgKiBoaXN0b3J5ICovCisgICAgICBpZiAoZ19oYXNoX3RhYmxlX2xvb2t1cF9leHRlbmRlZCAocnR4LT5zZXFudW1fc3NyYzFfbWFwLAorICAgICAgICAgICAgICBHVUlOVF9UT19QT0lOVEVSIChvcmlnbl9zZXFudW0pLCBOVUxMLCAoZ3BvaW50ZXIgKikgJiBhc3NvYykpIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0eCwKKyAgICAgICAgICAgICJhc3NvY2lhdGluZyByZXRyYW5zbWl0dGVkIHN0cmVhbSAlWCB0byBtYXN0ZXIgc3RyZWFtICVYIHRoYW5rcyAiCisgICAgICAgICAgICAidG8gcnR4IHBhY2tldCAldSAob3JpZyBzZXFudW0gJXUpIiwgc3NyYywgYXNzb2MtPnNzcmMsIHNlcW51bSwKKyAgICAgICAgICAgIG9yaWduX3NlcW51bSk7CisgICAgICAgIHNzcmMxID0gR1VJTlRfVE9fUE9JTlRFUiAoYXNzb2MtPnNzcmMpOworICAgICAgICBzc3JjMiA9IHNzcmM7CisKKyAgICAgICAgLyoganVzdCBwdXQgYSBndWFyZCAqLworICAgICAgICBpZiAoR1BPSU5URVJfVE9fVUlOVCAoc3NyYzEpID09IHNzcmMyKQorICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnR4LCAiUlRYIHJlY2VpdmVyIHNzcmMyX3NzcmMxX21hcCBiYWQgc3RhdGUsICIKKyAgICAgICAgICAgICAgIm1hc3RlciBhbmQgcnR4IFNTUkNzIGFyZSB0aGUgc2FtZSAoJVgpXG4iLCBzc3JjKTsKKworICAgICAgICAvKiBmcmVlIHRoZSBzcG90IHNvIHRoYXQgdGhpcyBzZXFudW0gY2FuIGJlIHVzZWQgdG8gZG8gYW5vdGhlcgorICAgICAgICAgKiBhc3NvY2lhdGlvbiAqLworICAgICAgICBnX2hhc2hfdGFibGVfcmVtb3ZlIChydHgtPnNlcW51bV9zc3JjMV9tYXAsCisgICAgICAgICAgICBHVUlOVF9UT19QT0lOVEVSIChvcmlnbl9zZXFudW0pKTsKKworICAgICAgICAvKiBhY3R1YWxseSBkbyB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBydHggc3RyZWFtIGFuZCBtYXN0ZXIgc3RyZWFtICovCisgICAgICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHJ0eC0+c3NyYzJfc3NyYzFfbWFwLCBHVUlOVF9UT19QT0lOVEVSIChzc3JjMiksCisgICAgICAgICAgICBzc3JjMSk7CisKKyAgICAgICAgLyogYWxzbyBkbyB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBtYXN0ZXIgc3RyZWFtIGFuZCBydHggc3RyZWFtCisgICAgICAgICAqIGV2ZXJ5IHNzcmMgYXJlIHVuaXF1ZSBzbyB3ZSBjYW4gdXNlIHRoZSBzYW1lIGhhc2ggdGFibGUKKyAgICAgICAgICogZm9yIGJvdGggcmV0cmlldmluZyB0aGUgc3NyYzEgZnJvbSBzc3JjMiBhbmQgYWxzbyBzc3JjMiBmcm9tIHNzcmMxCisgICAgICAgICAqLworICAgICAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChydHgtPnNzcmMyX3NzcmMxX21hcCwgc3NyYzEsCisgICAgICAgICAgICBHVUlOVF9UT19QT0lOVEVSIChzc3JjMikpOworCisgICAgICB9IGVsc2UgeworICAgICAgICAvKiB3ZSBhcmUgbm90IGFibGUgdG8gYXNzb2NpYXRlIHRoaXMgcnR4IHBhY2tldCB3aXRoIGEgbWFzdGVyIHN0cmVhbSAqLworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHJ0eCwKKyAgICAgICAgICAgICJkcm9wcGluZyBydHggcGFja2V0ICV1IGJlY2F1c2UgaXRzIG9yaWcgc2VxbnVtICgldSkgaXMgbm90IGluIG91ciIKKyAgICAgICAgICAgICIgcGVuZGluZyByZXRyYW5zbWlzc2lvbiByZXF1ZXN0cyIsIHNlcW51bSwgb3JpZ25fc2VxbnVtKTsKKyAgICAgICAgZHJvcCA9IFRSVUU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogaWYgbm90IGRyb3BwZWQgdGhlIHBhY2tldCB3YXMgc3VjY2Vzc2Z1bGx5IGFzc29jaWF0ZWQgKi8KKyAgaWYgKGlzX3J0eCAmJiAhZHJvcCkKKyAgICArK3J0eC0+bnVtX3J0eF9hc3NvY19wYWNrZXRzOworCisgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHgpOworCisgIC8qIGp1c3QgZHJvcCB0aGUgcGFja2V0IGlmIHRoZSBhc3NvY2lhdGlvbiBjb3VsZCBub3QgaGF2ZSBiZWVuIG1hZGUgKi8KKyAgaWYgKGRyb3ApIHsKKyAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KKworICAvKiBjcmVhdGUgdGhlIHJldHJhbnNtaXNzaW9uIHBhY2tldCAqLworICBpZiAoaXNfcnR4KQorICAgIG5ld19idWZmZXIgPQorICAgICAgICBfZ3N0X3J0cF9idWZmZXJfbmV3X2Zyb21fcnR4ICgmcnRwLCBHUE9JTlRFUl9UT19VSU5UIChzc3JjMSksCisgICAgICAgIG9yaWduX3NlcW51bSwgb3JpZ2luX3BheWxvYWRfdHlwZSk7CisKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgIC8qIHB1c2ggdGhlIHBhY2tldCAqLworICBpZiAoaXNfcnR4KSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICBHU1RfTE9HX09CSkVDVCAocnR4LCAicHVzaGluZyBwYWNrZXQgc2VxbnVtOiV1IGZyb20gcmVzdHJhbnNtaXNzaW9uICIKKyAgICAgICAgInN0cmVhbSBzc3JjOiAlWCAobWFzdGVyIHNzcmMgJVgpIiwgb3JpZ25fc2VxbnVtLCBzc3JjMiwKKyAgICAgICAgR1BPSU5URVJfVE9fVUlOVCAoc3NyYzEpKTsKKyAgICByZXQgPSBnc3RfcGFkX3B1c2ggKHJ0eC0+c3JjcGFkLCBuZXdfYnVmZmVyKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHgsICJwdXNoaW5nIHBhY2tldCBzZXFudW06JXUgZnJvbSBtYXN0ZXIgc3RyZWFtICIKKyAgICAgICAgInNzcmM6ICVYIiwgc2VxbnVtLCBzc3JjKTsKKyAgICByZXQgPSBnc3RfcGFkX3B1c2ggKHJ0eC0+c3JjcGFkLCBidWZmZXIpOworICB9CisKKyAgcmV0dXJuIHJldDsKKworaW52YWxpZF9idWZmZXI6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHgsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksCisgICAgICAgICgiUmVjZWl2ZWQgaW52YWxpZCBSVFAgcGF5bG9hZCwgZHJvcHBpbmciKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcnR4X3JlY2VpdmVfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cFJ0eFJlY2VpdmUgKnJ0eCA9IEdTVF9SVFBfUlRYX1JFQ0VJVkUgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BBWUxPQURfVFlQRV9NQVA6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHJ0eCk7CisgICAgICBnX3ZhbHVlX3NldF9ib3hlZCAodmFsdWUsIHJ0eC0+cnR4X3B0X21hcF9zdHJ1Y3R1cmUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTlVNX1JUWF9SRVFVRVNUUzoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocnR4KTsKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBydHgtPm51bV9ydHhfcmVxdWVzdHMpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTlVNX1JUWF9QQUNLRVRTOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChydHgpOworICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0eC0+bnVtX3J0eF9wYWNrZXRzKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05VTV9SVFhfQVNTT0NfUEFDS0VUUzoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocnR4KTsKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBydHgtPm51bV9ydHhfYXNzb2NfcGFja2V0cyk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitzdHJ1Y3R1cmVfdG9faGFzaF90YWJsZV9pbnYgKEdRdWFyayBmaWVsZF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsCisgICAgZ3BvaW50ZXIgaGFzaCkKK3sKKyAgY29uc3QgZ2NoYXIgKmZpZWxkX3N0cjsKKyAgZ3VpbnQgZmllbGRfdWludDsKKyAgZ3VpbnQgdmFsdWVfdWludDsKKworICBmaWVsZF9zdHIgPSBnX3F1YXJrX3RvX3N0cmluZyAoZmllbGRfaWQpOworICBmaWVsZF91aW50ID0gYXRvaSAoZmllbGRfc3RyKTsKKyAgdmFsdWVfdWludCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAoKEdIYXNoVGFibGUgKikgaGFzaCwgR1VJTlRfVE9fUE9JTlRFUiAodmFsdWVfdWludCksCisgICAgICBHVUlOVF9UT19QT0lOVEVSIChmaWVsZF91aW50KSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3J0eF9yZWNlaXZlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSdHBSdHhSZWNlaXZlICpydHggPSBHU1RfUlRQX1JUWF9SRUNFSVZFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QQVlMT0FEX1RZUEVfTUFQOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChydHgpOworICAgICAgaWYgKHJ0eC0+cnR4X3B0X21hcF9zdHJ1Y3R1cmUpCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocnR4LT5ydHhfcHRfbWFwX3N0cnVjdHVyZSk7CisgICAgICBydHgtPnJ0eF9wdF9tYXBfc3RydWN0dXJlID0gZ192YWx1ZV9kdXBfYm94ZWQgKHZhbHVlKTsKKyAgICAgIGdfaGFzaF90YWJsZV9yZW1vdmVfYWxsIChydHgtPnJ0eF9wdF9tYXApOworICAgICAgZ3N0X3N0cnVjdHVyZV9mb3JlYWNoIChydHgtPnJ0eF9wdF9tYXBfc3RydWN0dXJlLAorICAgICAgICAgIHN0cnVjdHVyZV90b19oYXNoX3RhYmxlX2ludiwgcnR4LT5ydHhfcHRfbWFwKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfcnR4X3JlY2VpdmVfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdFJ0cFJ0eFJlY2VpdmUgKnJ0eDsKKworICBydHggPSBHU1RfUlRQX1JUWF9SRUNFSVZFIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPQorICAgICAgR1NUX0VMRU1FTlRfQ0xBU1MgKGdzdF9ydHBfcnR4X3JlY2VpdmVfcGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlCisgICAgICAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9ydHBfcnR4X3JlY2VpdmVfcmVzZXQgKHJ0eCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9ydHhfcmVjZWl2ZV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3J0cF9ydHhfcmVjZWl2ZV9kZWJ1ZywgInJ0cHJ0eHJlY2VpdmUiLCAwLAorICAgICAgInJ0cCByZXRyYW5zbWlzc2lvbiByZWNlaXZlciIpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwcnR4cmVjZWl2ZSIsIEdTVF9SQU5LX05PTkUsCisgICAgICBHU1RfVFlQRV9SVFBfUlRYX1JFQ0VJVkUpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5oIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNmM0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmgKQEAgLTAsMCArMSw4MCBAQAorLyogUlRQIFJldHJhbnNtaXNzaW9uIHJlY2VpdmVyIGVsZW1lbnQgZm9yIEdTdHJlYW1lcgorICoKKyAqIGdzdHJ0cHJ0eHJlY2VpdmUuaDoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQ29sbGFib3JhIEx0ZC4KKyAqICAgQGF1dGhvciBKdWxpZW4gSXNvcmNlIDxqdWxpZW4uaXNvcmNlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9SVFhfUkVDRUlWRV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1JUWF9SRUNFSVZFX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1JUWF9SRUNFSVZFIChnc3RfcnRwX3J0eF9yZWNlaXZlX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfUlRYX1JFQ0VJVkUob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1JUWF9SRUNFSVZFLCBHc3RSdHBSdHhSZWNlaXZlKSkKKyNkZWZpbmUgR1NUX1JUUF9SVFhfUkVDRUlWRV9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX1JUWF9SRUNFSVZFLCBHc3RSdHBSdHhSZWNlaXZlQ2xhc3MpKQorI2RlZmluZSBHU1RfUlRQX1JUWF9SRUNFSVZFX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfUlRQX1JUWF9SRUNFSVZFLCBHc3RSdHBSdHhSZWNlaXZlQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1JUWF9SRUNFSVZFKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9SVFhfUkVDRUlWRSkpCisjZGVmaW5lIEdTVF9JU19SVFBfUlRYX1JFQ0VJVkVfQ0xBU1Mob2JqKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfUlRYX1JFQ0VJVkUpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFJ0eFJlY2VpdmUgR3N0UnRwUnR4UmVjZWl2ZTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBSdHhSZWNlaXZlQ2xhc3MgR3N0UnRwUnR4UmVjZWl2ZUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cFJ0eFJlY2VpdmUKK3sKKyAgR3N0RWxlbWVudCBlbGVtZW50OworCisgIC8qIHBhZCAqLworICBHc3RQYWQgKnNpbmtwYWQ7CisgIEdzdFBhZCAqc3JjcGFkOworCisgIC8qIHJldHJpZXZlIGFzc29jaWF0ZWQgbWFzdGVyIHN0cmVhbSBmcm9tIHJ0eCBzdHJlYW0KKyAgICogaXQgYWxzbyB3b3JrcyB0byByZXRyaWV2ZSBydHggc3RyZWFtIGZyb20gbWFzdGVyIHN0cmVhbQorICAgKiBhcyB3ZSBtYWtlIHN1cmUgYWxsIHNzcmMgYXJlIHVuaXF1ZSAqLworICBHSGFzaFRhYmxlICpzc3JjMl9zc3JjMV9tYXA7CisKKyAgLyogY29udGFpbnMgc2VxbnVtIG9mIHJlcXVlc3QgcGFja2V0cyBvZiB3aG9tIHRoZWlyIHNzcmMgaGF2ZQorICAgKiBub3QgYmVlbiBhc3NvY2lhdGVkIHRvIGEgcnR4IHN0cmVhbSB5ZXQgKi8KKyAgR0hhc2hUYWJsZSAqc2VxbnVtX3NzcmMxX21hcDsKKworICAvKiBydHggcHQgKHVpbnQpIC0+IG9yaWdpbiBwdCAodWludCkgKi8KKyAgR0hhc2hUYWJsZSAqcnR4X3B0X21hcDsKKyAgLyogb3JpZ2luIHB0IChzdHJpbmcpIC0+IHJ0eCBwdCAodWludCkgKi8KKyAgR3N0U3RydWN0dXJlICpydHhfcHRfbWFwX3N0cnVjdHVyZTsKKworICAvKiBzdGF0aXN0aWNzICovCisgIGd1aW50IG51bV9ydHhfcmVxdWVzdHM7CisgIGd1aW50IG51bV9ydHhfcGFja2V0czsKKyAgZ3VpbnQgbnVtX3J0eF9hc3NvY19wYWNrZXRzOworCisgIEdzdENsb2NrVGltZSBsYXN0X3RpbWU7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cFJ0eFJlY2VpdmVDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworCitHVHlwZSBnc3RfcnRwX3J0eF9yZWNlaXZlX2dldF90eXBlICh2b2lkKTsKK2dib29sZWFuIGdzdF9ydHBfcnR4X3JlY2VpdmVfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYgLyogX19HU1RfUlRQX1JUWF9SRUNFSVZFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMjlkODQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmMKQEAgLTAsMCArMSw5NDggQEAKKy8qIFJUUCBSZXRyYW5zbWlzc2lvbiBzZW5kZXIgZWxlbWVudCBmb3IgR1N0cmVhbWVyCisgKgorICogZ3N0cnRwcnR4c2VuZC5jOgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBDb2xsYWJvcmEgTHRkLgorICogICBAYXV0aG9yIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cHJ0eHNlbmQKKyAqCisgKiBTZWUgI0dzdFJ0cFJ0eFJlY2VpdmUgZm9yIGV4YW1wbGVzCisgKiAKKyAqIFRoZSBwdXJwb3NlIG9mIHRoZSBzZW5kZXIgUlRYIG9iamVjdCBpcyB0byBrZWVwIGEgaGlzdG9yeSBvZiBSVFAgcGFja2V0cyB1cAorICogdG8gYSBjb25maWd1cmFibGUgbGltaXQgKG1heC1zaXplLXRpbWUgb3IgbWF4LXNpemUtcGFja2V0cykuIEl0IHdpbGwgbGlzdGVuCisgKiBmb3IgdXBzdHJlYW0gY3VzdG9tIHJldHJhbnNtaXNzaW9uIGV2ZW50cyAoR3N0UlRQUmV0cmFuc21pc3Npb25SZXF1ZXN0KSB0aGF0CisgKiBjb21lcyBmcm9tIGRvd25zdHJlYW0gKCNHc3RSdHBTZXNzaW9uKS4gV2hlbiByZWNlaXZpbmcgYSByZXF1ZXN0IGl0IHdpbGwKKyAqIGxvb2sgdXAgdGhlIHJlcXVlc3RlZCBzZXFudW0gaW4gaXRzIGxpc3Qgb2Ygc3RvcmVkIHBhY2tldHMuIElmIHRoZSBwYWNrZXQKKyAqIGlzIGF2YWlsYWJsZSwgaXQgd2lsbCBjcmVhdGUgYSBSVFggcGFja2V0IGFjY29yZGluZyB0byBSRkMgNDU4OCBhbmQgc2VuZAorICogdGhpcyBhcyBhbiBhdXhpbGlhcnkgc3RyZWFtLiBSVFggaXMgU1NSQy1tdWx0aXBsZXhlZAorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ3N0cnRwcnR4c2VuZC5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfcnRwX3J0eF9zZW5kX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9ydHBfcnR4X3NlbmRfZGVidWcKKworI2RlZmluZSBERUZBVUxUX1JUWF9QQVlMT0FEX1RZUEUgMAorI2RlZmluZSBERUZBVUxUX01BWF9TSVpFX1RJTUUgICAgMAorI2RlZmluZSBERUZBVUxUX01BWF9TSVpFX1BBQ0tFVFMgMTAwCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX1NTUkNfTUFQLAorICBQUk9QX1BBWUxPQURfVFlQRV9NQVAsCisgIFBST1BfTUFYX1NJWkVfVElNRSwKKyAgUFJPUF9NQVhfU0laRV9QQUNLRVRTLAorICBQUk9QX05VTV9SVFhfUkVRVUVTVFMsCisgIFBST1BfTlVNX1JUWF9QQUNLRVRTCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIiAiY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVhdIikKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9ydHhfc2VuZF9xdWV1ZV9jaGVja19mdWxsIChHc3REYXRhUXVldWUgKiBxdWV1ZSwKKyAgICBndWludCB2aXNpYmxlLCBndWludCBieXRlcywgZ3VpbnQ2NCB0aW1lLCBncG9pbnRlciBjaGVja2RhdGEpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9ydHhfc2VuZF9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfcnR4X3NlbmRfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX3J0eF9zZW5kX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9ydHhfc2VuZF9jaGFpbl9saXN0IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXJMaXN0ICogbGlzdCk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfcnR4X3NlbmRfc3JjX2xvb3AgKEdzdFJ0cFJ0eFNlbmQgKiBydHgpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfcnR4X3NlbmRfYWN0aXZhdGVfbW9kZSAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UGFkTW9kZSBtb2RlLCBnYm9vbGVhbiBhY3RpdmUpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9ydHhfc2VuZF9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKgorICAgIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX3J0eF9zZW5kX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfcnR4X3NlbmRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9ydHhfc2VuZF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cFJ0eFNlbmQsIGdzdF9ydHBfcnR4X3NlbmQsIEdTVF9UWVBFX0VMRU1FTlQpOworCit0eXBlZGVmIHN0cnVjdAoreworICBndWludDE2IHNlcW51bTsKKyAgZ3VpbnQzMiB0aW1lc3RhbXA7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworfSBCdWZmZXJRdWV1ZUl0ZW07CisKK3N0YXRpYyB2b2lkCitidWZmZXJfcXVldWVfaXRlbV9mcmVlIChCdWZmZXJRdWV1ZUl0ZW0gKiBpdGVtKQoreworICBnc3RfYnVmZmVyX3VucmVmIChpdGVtLT5idWZmZXIpOworICBnX3NsaWNlX2ZyZWUgKEJ1ZmZlclF1ZXVlSXRlbSwgaXRlbSk7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGd1aW50MzIgcnR4X3NzcmM7CisgIGd1aW50MTYgc2VxbnVtX2Jhc2UsIG5leHRfc2VxbnVtOworICBnaW50IGNsb2NrX3JhdGU7CisKKyAgLyogaGlzdG9yeSBvZiBydHAgcGFja2V0cyAqLworICBHU2VxdWVuY2UgKnF1ZXVlOworfSBTU1JDUnR4RGF0YTsKKworc3RhdGljIFNTUkNSdHhEYXRhICoKK3NzcmNfcnR4X2RhdGFfbmV3IChndWludDMyIHJ0eF9zc3JjKQoreworICBTU1JDUnR4RGF0YSAqZGF0YSA9IGdfc2xpY2VfbmV3MCAoU1NSQ1J0eERhdGEpOworCisgIGRhdGEtPnJ0eF9zc3JjID0gcnR4X3NzcmM7CisgIGRhdGEtPm5leHRfc2VxbnVtID0gZGF0YS0+c2VxbnVtX2Jhc2UgPSBnX3JhbmRvbV9pbnRfcmFuZ2UgKDAsIEdfTUFYVUlOVDE2KTsKKyAgZGF0YS0+cXVldWUgPSBnX3NlcXVlbmNlX25ldyAoKEdEZXN0cm95Tm90aWZ5KSBidWZmZXJfcXVldWVfaXRlbV9mcmVlKTsKKworICByZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQKK3NzcmNfcnR4X2RhdGFfZnJlZSAoU1NSQ1J0eERhdGEgKiBkYXRhKQoreworICBnX3NlcXVlbmNlX2ZyZWUgKGRhdGEtPnF1ZXVlKTsKKyAgZ19zbGljZV9mcmVlIChTU1JDUnR4RGF0YSwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3J0eF9zZW5kX2NsYXNzX2luaXQgKEdzdFJ0cFJ0eFNlbmRDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9ydHhfc2VuZF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9ydHBfcnR4X3NlbmRfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfcnR4X3NlbmRfZmluYWxpemU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TU1JDX01BUCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoInNzcmMtbWFwIiwgIlNTUkMgTWFwIiwKKyAgICAgICAgICAiTWFwIG9mIFNTUkNzIHRvIHRoZWlyIHJldHJhbnNtaXNzaW9uIFNTUkNzIGZvciBTU1JDLW11bHRpcGxleGVkIG1vZGUiCisgICAgICAgICAgIiAoZGVmYXVsdCA9IHJhbmRvbSkiLCBHU1RfVFlQRV9TVFJVQ1RVUkUsCisgICAgICAgICAgR19QQVJBTV9XUklUQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BBWUxPQURfVFlQRV9NQVAsCisgICAgICBnX3BhcmFtX3NwZWNfYm94ZWQgKCJwYXlsb2FkLXR5cGUtbWFwIiwgIlBheWxvYWQgVHlwZSBNYXAiLAorICAgICAgICAgICJNYXAgb2Ygb3JpZ2luYWwgcGF5bG9hZCB0eXBlcyB0byB0aGVpciByZXRyYW5zbWlzc2lvbiBwYXlsb2FkIHR5cGVzIiwKKyAgICAgICAgICBHU1RfVFlQRV9TVFJVQ1RVUkUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX1NJWkVfVElNRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LXNpemUtdGltZSIsICJNYXggU2l6ZSBUaW1lIiwKKyAgICAgICAgICAiQW1vdW50IG9mIG1zIHRvIHF1ZXVlICgwID0gdW5saW1pdGVkKSIsIDAsIEdfTUFYVUlOVCwKKyAgICAgICAgICBERUZBVUxUX01BWF9TSVpFX1RJTUUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX1NJWkVfUEFDS0VUUywKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LXNpemUtcGFja2V0cyIsICJNYXggU2l6ZSBQYWNrZXRzIiwKKyAgICAgICAgICAiQW1vdW50IG9mIHBhY2tldHMgdG8gcXVldWUgKDAgPSB1bmxpbWl0ZWQpIiwgMCwgR19NQVhJTlQxNiwKKyAgICAgICAgICBERUZBVUxUX01BWF9TSVpFX1BBQ0tFVFMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9OVU1fUlRYX1JFUVVFU1RTLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJudW0tcnR4LXJlcXVlc3RzIiwgIk51bSBSVFggUmVxdWVzdHMiLAorICAgICAgICAgICJOdW1iZXIgb2YgcmV0cmFuc21pc3Npb24gZXZlbnRzIHJlY2VpdmVkIiwgMCwgR19NQVhVSU5ULAorICAgICAgICAgIDAsIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9OVU1fUlRYX1BBQ0tFVFMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm51bS1ydHgtcGFja2V0cyIsICJOdW0gUlRYIFBhY2tldHMiLAorICAgICAgICAgICIgTnVtYmVyIG9mIHJldHJhbnNtaXNzaW9uIHBhY2tldHMgc2VudCIsIDAsIEdfTUFYVUlOVCwKKyAgICAgICAgICAwLCBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc3JjX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfZmFjdG9yeSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgUmV0cmFuc21pc3Npb24gU2VuZGVyIiwgIkNvZGVjIiwKKyAgICAgICJSZXRyYW5zbWl0IFJUUCBwYWNrZXRzIHdoZW4gbmVlZGVkLCBhY2NvcmRpbmcgdG8gUkZDNDU4OCIsCisgICAgICAiSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX3J0eF9zZW5kX2NoYW5nZV9zdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3J0eF9zZW5kX3Jlc2V0IChHc3RSdHBSdHhTZW5kICogcnR4KQoreworICBHU1RfT0JKRUNUX0xPQ0sgKHJ0eCk7CisgIGdzdF9kYXRhX3F1ZXVlX2ZsdXNoIChydHgtPnF1ZXVlKTsKKyAgZ19oYXNoX3RhYmxlX3JlbW92ZV9hbGwgKHJ0eC0+c3NyY19kYXRhKTsKKyAgZ19oYXNoX3RhYmxlX3JlbW92ZV9hbGwgKHJ0eC0+cnR4X3NzcmNzKTsKKyAgcnR4LT5udW1fcnR4X3JlcXVlc3RzID0gMDsKKyAgcnR4LT5udW1fcnR4X3BhY2tldHMgPSAwOworICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcnR4X3NlbmRfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cFJ0eFNlbmQgKnJ0eCA9IEdTVF9SVFBfUlRYX1NFTkQgKG9iamVjdCk7CisKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChydHgtPnNzcmNfZGF0YSk7CisgIGdfaGFzaF90YWJsZV91bnJlZiAocnR4LT5ydHhfc3NyY3MpOworICBpZiAocnR4LT5leHRlcm5hbF9zc3JjX21hcCkKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHJ0eC0+ZXh0ZXJuYWxfc3NyY19tYXApOworICBnX2hhc2hfdGFibGVfdW5yZWYgKHJ0eC0+cnR4X3B0X21hcCk7CisgIGlmIChydHgtPnJ0eF9wdF9tYXBfc3RydWN0dXJlKQorICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocnR4LT5ydHhfcHRfbWFwX3N0cnVjdHVyZSk7CisgIGdfb2JqZWN0X3VucmVmIChydHgtPnF1ZXVlKTsKKworICBHX09CSkVDVF9DTEFTUyAoZ3N0X3J0cF9ydHhfc2VuZF9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcnR4X3NlbmRfaW5pdCAoR3N0UnRwUnR4U2VuZCAqIHJ0eCkKK3sKKyAgR3N0RWxlbWVudENsYXNzICprbGFzcyA9IEdTVF9FTEVNRU5UX0dFVF9DTEFTUyAocnR4KTsKKworICBydHgtPnNyY3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywKKyAgICAgICAgICAic3JjIiksICJzcmMiKTsKKyAgR1NUX1BBRF9TRVRfUFJPWFlfQ0FQUyAocnR4LT5zcmNwYWQpOworICBHU1RfUEFEX1NFVF9QUk9YWV9BTExPQ0FUSU9OIChydHgtPnNyY3BhZCk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChydHgtPnNyY3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX3J0eF9zZW5kX3NyY19ldmVudCkpOworICBnc3RfcGFkX3NldF9hY3RpdmF0ZW1vZGVfZnVuY3Rpb24gKHJ0eC0+c3JjcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfcnR4X3NlbmRfYWN0aXZhdGVfbW9kZSkpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAocnR4KSwgcnR4LT5zcmNwYWQpOworCisgIHJ0eC0+c2lua3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywKKyAgICAgICAgICAic2luayIpLCAic2luayIpOworICBHU1RfUEFEX1NFVF9QUk9YWV9DQVBTIChydHgtPnNpbmtwYWQpOworICBHU1RfUEFEX1NFVF9QUk9YWV9BTExPQ0FUSU9OIChydHgtPnNpbmtwYWQpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAocnR4LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfcnR4X3NlbmRfc2lua19ldmVudCkpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAocnR4LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfcnR4X3NlbmRfY2hhaW4pKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fbGlzdF9mdW5jdGlvbiAocnR4LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfcnR4X3NlbmRfY2hhaW5fbGlzdCkpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAocnR4KSwgcnR4LT5zaW5rcGFkKTsKKworICBydHgtPnF1ZXVlID0gZ3N0X2RhdGFfcXVldWVfbmV3IChnc3RfcnRwX3J0eF9zZW5kX3F1ZXVlX2NoZWNrX2Z1bGwsIE5VTEwsCisgICAgICBOVUxMLCBydHgpOworICBydHgtPnNzcmNfZGF0YSA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19kaXJlY3RfaGFzaCwgZ19kaXJlY3RfZXF1YWwsCisgICAgICBOVUxMLCAoR0Rlc3Ryb3lOb3RpZnkpIHNzcmNfcnR4X2RhdGFfZnJlZSk7CisgIHJ0eC0+cnR4X3NzcmNzID0gZ19oYXNoX3RhYmxlX25ldyAoZ19kaXJlY3RfaGFzaCwgZ19kaXJlY3RfZXF1YWwpOworICBydHgtPnJ0eF9wdF9tYXAgPSBnX2hhc2hfdGFibGVfbmV3IChnX2RpcmVjdF9oYXNoLCBnX2RpcmVjdF9lcXVhbCk7CisKKyAgcnR4LT5tYXhfc2l6ZV90aW1lID0gREVGQVVMVF9NQVhfU0laRV9USU1FOworICBydHgtPm1heF9zaXplX3BhY2tldHMgPSBERUZBVUxUX01BWF9TSVpFX1BBQ0tFVFM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3J0eF9zZW5kX3NldF9mbHVzaGluZyAoR3N0UnRwUnR4U2VuZCAqIHJ0eCwgZ2Jvb2xlYW4gZmx1c2gpCit7CisgIEdTVF9PQkpFQ1RfTE9DSyAocnR4KTsKKyAgZ3N0X2RhdGFfcXVldWVfc2V0X2ZsdXNoaW5nIChydHgtPnF1ZXVlLCBmbHVzaCk7CisgIGdzdF9kYXRhX3F1ZXVlX2ZsdXNoIChydHgtPnF1ZXVlKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0eCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9ydHhfc2VuZF9xdWV1ZV9jaGVja19mdWxsIChHc3REYXRhUXVldWUgKiBxdWV1ZSwKKyAgICBndWludCB2aXNpYmxlLCBndWludCBieXRlcywgZ3VpbnQ2NCB0aW1lLCBncG9pbnRlciBjaGVja2RhdGEpCit7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcnR4X2RhdGFfcXVldWVfaXRlbV9mcmVlIChncG9pbnRlciBpdGVtKQoreworICBHc3REYXRhUXVldWVJdGVtICpkYXRhID0gaXRlbTsKKyAgaWYgKGRhdGEtPm9iamVjdCkKKyAgICBnc3RfbWluaV9vYmplY3RfdW5yZWYgKGRhdGEtPm9iamVjdCk7CisgIGdfc2xpY2VfZnJlZSAoR3N0RGF0YVF1ZXVlSXRlbSwgZGF0YSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9ydHhfc2VuZF9wdXNoX291dCAoR3N0UnRwUnR4U2VuZCAqIHJ0eCwgZ3BvaW50ZXIgb2JqZWN0KQoreworICBHc3REYXRhUXVldWVJdGVtICpkYXRhOworICBnYm9vbGVhbiBzdWNjZXNzOworCisgIGRhdGEgPSBnX3NsaWNlX25ldzAgKEdzdERhdGFRdWV1ZUl0ZW0pOworICBkYXRhLT5vYmplY3QgPSBHU1RfTUlOSV9PQkpFQ1QgKG9iamVjdCk7CisgIGRhdGEtPnNpemUgPSAxOworICBkYXRhLT5kdXJhdGlvbiA9IDE7CisgIGRhdGEtPnZpc2libGUgPSBUUlVFOworICBkYXRhLT5kZXN0cm95ID0gZ3N0X3J0cF9ydHhfZGF0YV9xdWV1ZV9pdGVtX2ZyZWU7CisKKyAgc3VjY2VzcyA9IGdzdF9kYXRhX3F1ZXVlX3B1c2ggKHJ0eC0+cXVldWUsIGRhdGEpOworCisgIGlmICghc3VjY2VzcykKKyAgICBkYXRhLT5kZXN0cm95IChkYXRhKTsKKworICByZXR1cm4gc3VjY2VzczsKK30KKworc3RhdGljIGd1aW50MzIKK2dzdF9ydHBfcnR4X3NlbmRfY2hvb3NlX3NzcmMgKEdzdFJ0cFJ0eFNlbmQgKiBydHgsIGd1aW50MzIgY2hvaWNlLAorICAgIGdib29sZWFuIGNvbnNpZGVyX2Nob2ljZSkKK3sKKyAgZ3VpbnQzMiBzc3JjID0gY29uc2lkZXJfY2hvaWNlID8gY2hvaWNlIDogZ19yYW5kb21faW50ICgpOworCisgIC8qIG1ha2Ugc3VyZSB0byBiZSBkaWZmZXJlbnQgdGhhbiBhbnkgb3RoZXIgKi8KKyAgd2hpbGUgKGdfaGFzaF90YWJsZV9jb250YWlucyAocnR4LT5zc3JjX2RhdGEsIEdVSU5UX1RPX1BPSU5URVIgKHNzcmMpKSB8fAorICAgICAgZ19oYXNoX3RhYmxlX2NvbnRhaW5zIChydHgtPnJ0eF9zc3JjcywgR1VJTlRfVE9fUE9JTlRFUiAoc3NyYykpKSB7CisgICAgc3NyYyA9IGdfcmFuZG9tX2ludCAoKTsKKyAgfQorCisgIHJldHVybiBzc3JjOworfQorCitzdGF0aWMgU1NSQ1J0eERhdGEgKgorZ3N0X3J0cF9ydHhfc2VuZF9nZXRfc3NyY19kYXRhIChHc3RSdHBSdHhTZW5kICogcnR4LCBndWludDMyIHNzcmMpCit7CisgIFNTUkNSdHhEYXRhICpkYXRhOworICBndWludDMyIHJ0eF9zc3JjID0gMDsKKyAgZ2Jvb2xlYW4gY29uc2lkZXIgPSBGQUxTRTsKKworICBpZiAoR19VTkxJS0VMWSAoIWdfaGFzaF90YWJsZV9jb250YWlucyAocnR4LT5zc3JjX2RhdGEsCisgICAgICAgICAgICAgIEdVSU5UX1RPX1BPSU5URVIgKHNzcmMpKSkpIHsKKyAgICBpZiAocnR4LT5leHRlcm5hbF9zc3JjX21hcCkgeworICAgICAgZ2NoYXIgKnNzcmNfc3RyOworICAgICAgc3NyY19zdHIgPSBnX3N0cmR1cF9wcmludGYgKCIlIiBHX0dVSU5UMzJfRk9STUFULCBzc3JjKTsKKyAgICAgIGNvbnNpZGVyID0gZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAocnR4LT5leHRlcm5hbF9zc3JjX21hcCwgc3NyY19zdHIsCisgICAgICAgICAgJnJ0eF9zc3JjKTsKKyAgICAgIGdfZnJlZSAoc3NyY19zdHIpOworICAgIH0KKyAgICBydHhfc3NyYyA9IGdzdF9ydHBfcnR4X3NlbmRfY2hvb3NlX3NzcmMgKHJ0eCwgcnR4X3NzcmMsIGNvbnNpZGVyKTsKKyAgICBkYXRhID0gc3NyY19ydHhfZGF0YV9uZXcgKHJ0eF9zc3JjKTsKKyAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChydHgtPnNzcmNfZGF0YSwgR1VJTlRfVE9fUE9JTlRFUiAoc3NyYyksIGRhdGEpOworICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHJ0eC0+cnR4X3NzcmNzLCBHVUlOVF9UT19QT0lOVEVSIChydHhfc3NyYyksCisgICAgICAgIEdVSU5UX1RPX1BPSU5URVIgKHNzcmMpKTsKKyAgfSBlbHNlIHsKKyAgICBkYXRhID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAocnR4LT5zc3JjX2RhdGEsIEdVSU5UX1RPX1BPSU5URVIgKHNzcmMpKTsKKyAgfQorICByZXR1cm4gZGF0YTsKK30KKworLyogQ29weSBmaXhlZCBoZWFkZXIgYW5kIGV4dGVuc2lvbi4gQWRkIE9TTiBiZWZvcmUgdG8gY29weSBwYXlsb2FkCisgKiBDb3B5IG1lbW9yeSB0byBhdm9pZCB0byBtYW51YWxseSBjb3B5IGVhY2ggcnRwIGJ1ZmZlciBmaWVsZC4KKyAqLworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX3J0eF9idWZmZXJfbmV3IChHc3RSdHBSdHhTZW5kICogcnR4LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdE1lbW9yeSAqbWVtID0gTlVMTDsKKyAgR3N0UlRQQnVmZmVyIHJ0cCA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisgIEdzdFJUUEJ1ZmZlciBuZXdfcnRwID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKyAgR3N0QnVmZmVyICpuZXdfYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludCBwYXlsb2FkX2xlbiA9IDA7CisgIFNTUkNSdHhEYXRhICpkYXRhOworICBndWludDMyIHNzcmM7CisgIGd1aW50MTYgc2VxbnVtOworICBndWludDggZm10cDsKKworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKGJ1ZmZlciwgR1NUX01BUF9SRUFELCAmcnRwKTsKKworICAvKiBnZXQgbmVlZGVkIGRhdGEgZnJvbSBHc3RSdHBSdHhTZW5kICovCisgIHNzcmMgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfc3NyYyAoJnJ0cCk7CisgIGRhdGEgPSBnc3RfcnRwX3J0eF9zZW5kX2dldF9zc3JjX2RhdGEgKHJ0eCwgc3NyYyk7CisgIHNzcmMgPSBkYXRhLT5ydHhfc3NyYzsKKyAgc2VxbnVtID0gZGF0YS0+bmV4dF9zZXFudW0rKzsKKyAgZm10cCA9IEdQT0lOVEVSX1RPX1VJTlQgKGdfaGFzaF90YWJsZV9sb29rdXAgKHJ0eC0+cnR4X3B0X21hcCwKKyAgICAgICAgICBHVUlOVF9UT19QT0lOVEVSIChnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF90eXBlICgmcnRwKSkpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHgsICJjcmVhdGluZyBydHggYnVmZmVyLCBvcmlnIHNlcW51bTogJXUsICIKKyAgICAgICJydHggc2VxbnVtOiAldSwgcnR4IHNzcmM6ICVYIiwgZ3N0X3J0cF9idWZmZXJfZ2V0X3NlcSAoJnJ0cCksCisgICAgICBzZXFudW0sIHNzcmMpOworCisgIC8qIGdzdF9ydHBfYnVmZmVyX21hcCBkb2VzIG5vdCBtYXAgdGhlIHBheWxvYWQgc28gZG8gaXQgbm93ICovCisgIGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKTsKKworICAvKiBjb3B5IGZpeGVkIGhlYWRlciAqLworICBtZW0gPSBnc3RfbWVtb3J5X2NvcHkgKHJ0cC5tYXBbMF0ubWVtb3J5LCAwLCBydHAuc2l6ZVswXSk7CisgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAobmV3X2J1ZmZlciwgbWVtKTsKKworICAvKiBjb3B5IGV4dGVuc2lvbiBpZiBhbnkgKi8KKyAgaWYgKHJ0cC5zaXplWzFdKSB7CisgICAgbWVtID0gZ3N0X21lbW9yeV9jb3B5IChydHAubWFwWzFdLm1lbW9yeSwgMCwgcnRwLnNpemVbMV0pOworICAgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAobmV3X2J1ZmZlciwgbWVtKTsKKyAgfQorCisgIC8qIGNvcHkgcGF5bG9hZCBhbmQgYWRkIE9TTiBqdXN0IGJlZm9yZSAqLworICBwYXlsb2FkX2xlbiA9IDIgKyBydHAuc2l6ZVsyXTsKKyAgbWVtID0gZ3N0X2FsbG9jYXRvcl9hbGxvYyAoTlVMTCwgcGF5bG9hZF9sZW4sIE5VTEwpOworCisgIGdzdF9tZW1vcnlfbWFwIChtZW0sICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBHU1RfV1JJVEVfVUlOVDE2X0JFIChtYXAuZGF0YSwgZ3N0X3J0cF9idWZmZXJfZ2V0X3NlcSAoJnJ0cCkpOworICBpZiAocnRwLnNpemVbMl0pCisgICAgbWVtY3B5IChtYXAuZGF0YSArIDIsIHJ0cC5kYXRhWzJdLCBydHAuc2l6ZVsyXSk7CisgIGdzdF9tZW1vcnlfdW5tYXAgKG1lbSwgJm1hcCk7CisgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAobmV3X2J1ZmZlciwgbWVtKTsKKworICAvKiBldmVyeXRoaW5nIG5lZWRlZCBpcyBjb3BpZWQgKi8KKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgIC8qIHNldCBzc3JjLCBzZXFudW0gYW5kIGZtdHAgKi8KKyAgZ3N0X3J0cF9idWZmZXJfbWFwIChuZXdfYnVmZmVyLCBHU1RfTUFQX1dSSVRFLCAmbmV3X3J0cCk7CisgIGdzdF9ydHBfYnVmZmVyX3NldF9zc3JjICgmbmV3X3J0cCwgc3NyYyk7CisgIGdzdF9ydHBfYnVmZmVyX3NldF9zZXEgKCZuZXdfcnRwLCBzZXFudW0pOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfcGF5bG9hZF90eXBlICgmbmV3X3J0cCwgZm10cCk7CisgIC8qIFJGQyA0NTg4OiBsZXQgb3RoZXIgZWxlbWVudHMgZG8gdGhlIHBhZGRpbmcsIGFzIG5vcm1hbCAqLworICBnc3RfcnRwX2J1ZmZlcl9zZXRfcGFkZGluZyAoJm5ld19ydHAsIEZBTFNFKTsKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZuZXdfcnRwKTsKKworICAvKiBDb3B5IG92ZXIgdGltZXN0YW1wcyAqLworICBnc3RfYnVmZmVyX2NvcHlfaW50byAobmV3X2J1ZmZlciwgYnVmZmVyLCBHU1RfQlVGRkVSX0NPUFlfVElNRVNUQU1QUywgMCwgLTEpOworCisgIHJldHVybiBuZXdfYnVmZmVyOworfQorCitzdGF0aWMgZ2ludAorYnVmZmVyX3F1ZXVlX2l0ZW1zX2NtcCAoQnVmZmVyUXVldWVJdGVtICogYSwgQnVmZmVyUXVldWVJdGVtICogYiwKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIC8qIGdzdF9ydHBfYnVmZmVyX2NvbXBhcmVfc2VxbnVtIHJldHVybnMgdGhlIG9wcG9zaXRlIG9mIHdoYXQgd2Ugd2FudCwKKyAgICogaXQgcmV0dXJucyBuZWdhdGl2ZSB3aGVuIHNlcW51bTEgPiBzZXFudW0yIGFuZCB3ZSB3YW50IG5lZ2F0aXZlCisgICAqIHdoZW4gYiA+IGEsIGkuZS4gYSBpcyBzbWFsbGVyLCBzbyBpdCBjb21lcyBmaXJzdCBpbiB0aGUgc2VxdWVuY2UgKi8KKyAgcmV0dXJuIGdzdF9ydHBfYnVmZmVyX2NvbXBhcmVfc2VxbnVtIChiLT5zZXFudW0sIGEtPnNlcW51bSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9ydHhfc2VuZF9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBSdHhTZW5kICpydHggPSBHU1RfUlRQX1JUWF9TRU5EIChwYXJlbnQpOworICBnYm9vbGVhbiByZXM7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNOgorICAgIHsKKyAgICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChldmVudCk7CisKKyAgICAgIC8qIFRoaXMgZXZlbnQgdXN1YWxseSBjb21lcyBmcm9tIHRoZSBkb3duc3RyZWFtIGdzdHJ0cHNlc3Npb24gKi8KKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiR3N0UlRQUmV0cmFuc21pc3Npb25SZXF1ZXN0IikpIHsKKyAgICAgICAgZ3VpbnQgc2VxbnVtID0gMDsKKyAgICAgICAgZ3VpbnQgc3NyYyA9IDA7CisgICAgICAgIEdzdEJ1ZmZlciAqcnR4X2J1ZiA9IE5VTEw7CisKKyAgICAgICAgLyogcmV0cmlldmUgc2VxbnVtIG9mIHRoZSBwYWNrZXQgdGhhdCBuZWVkIHRvIGJlIHJldHJhbnNtaXR0ZWQgKi8KKyAgICAgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF91aW50IChzLCAic2VxbnVtIiwgJnNlcW51bSkpCisgICAgICAgICAgc2VxbnVtID0gLTE7CisKKyAgICAgICAgLyogcmV0cmlldmUgc3NyYyBvZiB0aGUgcGFja2V0IHRoYXQgbmVlZCB0byBiZSByZXRyYW5zbWl0dGVkICovCisgICAgICAgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAocywgInNzcmMiLCAmc3NyYykpCisgICAgICAgICAgc3NyYyA9IC0xOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0eCwgImdvdCBydHggcmVxdWVzdCBmb3Igc2VxbnVtOiAldSwgc3NyYzogJVgiLAorICAgICAgICAgICAgc2VxbnVtLCBzc3JjKTsKKworICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHJ0eCk7CisgICAgICAgIC8qIGNoZWNrIGlmIHJlcXVlc3QgaXMgZm9yIHVzICovCisgICAgICAgIGlmIChnX2hhc2hfdGFibGVfY29udGFpbnMgKHJ0eC0+c3NyY19kYXRhLCBHVUlOVF9UT19QT0lOVEVSIChzc3JjKSkpIHsKKyAgICAgICAgICBTU1JDUnR4RGF0YSAqZGF0YTsKKyAgICAgICAgICBHU2VxdWVuY2VJdGVyICppdGVyOworICAgICAgICAgIEJ1ZmZlclF1ZXVlSXRlbSBzZWFyY2hfaXRlbTsKKworICAgICAgICAgIC8qIHVwZGF0ZSBzdGF0aXN0aWNzICovCisgICAgICAgICAgKytydHgtPm51bV9ydHhfcmVxdWVzdHM7CisKKyAgICAgICAgICBkYXRhID0gZ3N0X3J0cF9ydHhfc2VuZF9nZXRfc3NyY19kYXRhIChydHgsIHNzcmMpOworCisgICAgICAgICAgc2VhcmNoX2l0ZW0uc2VxbnVtID0gc2VxbnVtOworICAgICAgICAgIGl0ZXIgPSBnX3NlcXVlbmNlX2xvb2t1cCAoZGF0YS0+cXVldWUsICZzZWFyY2hfaXRlbSwKKyAgICAgICAgICAgICAgKEdDb21wYXJlRGF0YUZ1bmMpIGJ1ZmZlcl9xdWV1ZV9pdGVtc19jbXAsIE5VTEwpOworICAgICAgICAgIGlmIChpdGVyKSB7CisgICAgICAgICAgICBCdWZmZXJRdWV1ZUl0ZW0gKml0ZW0gPSBnX3NlcXVlbmNlX2dldCAoaXRlcik7CisgICAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocnR4LCAiZm91bmQgJXUiLCBpdGVtLT5zZXFudW0pOworICAgICAgICAgICAgcnR4X2J1ZiA9IGdzdF9ydHBfcnR4X2J1ZmZlcl9uZXcgKHJ0eCwgaXRlbS0+YnVmZmVyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0eCk7CisKKyAgICAgICAgaWYgKHJ0eF9idWYpCisgICAgICAgICAgZ3N0X3J0cF9ydHhfc2VuZF9wdXNoX291dCAocnR4LCBydHhfYnVmKTsKKworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgcmVzID0gVFJVRTsKKworICAgICAgICAvKiBUaGlzIGV2ZW50IHVzdWFsbHkgY29tZXMgZnJvbSB0aGUgZG93bnN0cmVhbSBnc3RydHBzZXNzaW9uICovCisgICAgICB9IGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJHc3RSVFBDb2xsaXNpb24iKSkgeworICAgICAgICBndWludCBzc3JjID0gMDsKKworICAgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQgKHMsICJzc3JjIiwgJnNzcmMpKQorICAgICAgICAgIHNzcmMgPSAtMTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHgsICJnb3Qgc3NyYyBjb2xsaXNpb24sIHNzcmM6ICVYIiwgc3NyYyk7CisKKyAgICAgICAgR1NUX09CSkVDVF9MT0NLIChydHgpOworCisgICAgICAgIC8qIGNob29zZSBhbm90aGVyIHNzcmMgZm9yIG91ciByZXRyYW5zbWl0ZWQgc3RyZWFtICovCisgICAgICAgIGlmIChnX2hhc2hfdGFibGVfY29udGFpbnMgKHJ0eC0+cnR4X3NzcmNzLCBHVUlOVF9UT19QT0lOVEVSIChzc3JjKSkpIHsKKyAgICAgICAgICBndWludCBtYXN0ZXJfc3NyYzsKKyAgICAgICAgICBTU1JDUnR4RGF0YSAqZGF0YTsKKworICAgICAgICAgIG1hc3Rlcl9zc3JjID0gR1BPSU5URVJfVE9fVUlOVCAoZ19oYXNoX3RhYmxlX2xvb2t1cCAocnR4LT5ydHhfc3NyY3MsCisgICAgICAgICAgICAgICAgICBHVUlOVF9UT19QT0lOVEVSIChzc3JjKSkpOworICAgICAgICAgIGRhdGEgPSBnc3RfcnRwX3J0eF9zZW5kX2dldF9zc3JjX2RhdGEgKHJ0eCwgbWFzdGVyX3NzcmMpOworCisgICAgICAgICAgLyogY2hhbmdlIHJ0eF9zc3JjIGFuZCB1cGRhdGUgdGhlIHJldmVyc2UgbWFwICovCisgICAgICAgICAgZGF0YS0+cnR4X3NzcmMgPSBnc3RfcnRwX3J0eF9zZW5kX2Nob29zZV9zc3JjIChydHgsIDAsIEZBTFNFKTsKKyAgICAgICAgICBnX2hhc2hfdGFibGVfcmVtb3ZlIChydHgtPnJ0eF9zc3JjcywgR1VJTlRfVE9fUE9JTlRFUiAoc3NyYykpOworICAgICAgICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHJ0eC0+cnR4X3NzcmNzLAorICAgICAgICAgICAgICBHVUlOVF9UT19QT0lOVEVSIChkYXRhLT5ydHhfc3NyYyksCisgICAgICAgICAgICAgIEdVSU5UX1RPX1BPSU5URVIgKG1hc3Rlcl9zc3JjKSk7CisKKyAgICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKKworICAgICAgICAgIC8qIG5vIG5lZWQgdG8gZm9yd2FyZCB0byBwYXlsb2FkZXIgYmVjYXVzZSB3ZSBtYWtlIHN1cmUgdG8gaGF2ZQorICAgICAgICAgICAqIGEgZGlmZmVyZW50IHNzcmMKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgICByZXMgPSBUUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIGlmIG1hc3RlciBzc3JjIGhhcyBjb2xsaWRlZCwgcmVtb3ZlIGl0IGZyb20gb3VyIGRhdGEsIGFzIGl0CisgICAgICAgICAgICogaXMgbm90IGdvaW5nIHRvIGJlIHVzZWQgYW55IGxvbmdlciAqLworICAgICAgICAgIGlmIChnX2hhc2hfdGFibGVfY29udGFpbnMgKHJ0eC0+c3NyY19kYXRhLCBHVUlOVF9UT19QT0lOVEVSIChzc3JjKSkpIHsKKyAgICAgICAgICAgIFNTUkNSdHhEYXRhICpkYXRhOworICAgICAgICAgICAgZGF0YSA9IGdzdF9ydHBfcnR4X3NlbmRfZ2V0X3NzcmNfZGF0YSAocnR4LCBzc3JjKTsKKyAgICAgICAgICAgIGdfaGFzaF90YWJsZV9yZW1vdmUgKHJ0eC0+cnR4X3NzcmNzLAorICAgICAgICAgICAgICAgIEdVSU5UX1RPX1BPSU5URVIgKGRhdGEtPnJ0eF9zc3JjKSk7CisgICAgICAgICAgICBnX2hhc2hfdGFibGVfcmVtb3ZlIChydHgtPnNzcmNfZGF0YSwgR1VJTlRfVE9fUE9JTlRFUiAoc3NyYykpOworICAgICAgICAgIH0KKworICAgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHgpOworCisgICAgICAgICAgLyogZm9yd2FyZCBldmVudCB0byBwYXlsb2FkZXIgaW4gY2FzZSBjb2xsaWRlZCBzc3JjIGlzCisgICAgICAgICAgICogbWFzdGVyIHN0cmVhbSAqLworICAgICAgICAgIHJlcyA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfcnR4X3NlbmRfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFJ0cFJ0eFNlbmQgKnJ0eCA9IEdTVF9SVFBfUlRYX1NFTkQgKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RBUlQ6CisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHJ0eC0+c3JjcGFkLCBldmVudCk7CisgICAgICBnc3RfcnRwX3J0eF9zZW5kX3NldF9mbHVzaGluZyAocnR4LCBUUlVFKTsKKyAgICAgIGdzdF9wYWRfcGF1c2VfdGFzayAocnR4LT5zcmNwYWQpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocnR4LT5zcmNwYWQsIGV2ZW50KTsKKyAgICAgIGdzdF9ydHBfcnR4X3NlbmRfc2V0X2ZsdXNoaW5nIChydHgsIEZBTFNFKTsKKyAgICAgIGdzdF9wYWRfc3RhcnRfdGFzayAocnR4LT5zcmNwYWQsCisgICAgICAgICAgKEdzdFRhc2tGdW5jdGlvbikgZ3N0X3J0cF9ydHhfc2VuZF9zcmNfbG9vcCwgcnR4LCBOVUxMKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAocnR4LCAiR290IEVPUyAtIGVucXVldWVpbmcgaXQiKTsKKyAgICAgIGdzdF9ydHBfcnR4X3NlbmRfcHVzaF9vdXQgKHJ0eCwgZXZlbnQpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgY2FzZSBHU1RfRVZFTlRfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpjYXBzOworICAgICAgR3N0U3RydWN0dXJlICpzOworICAgICAgZ3VpbnQgc3NyYzsKKyAgICAgIGdpbnQgcGF5bG9hZDsKKyAgICAgIGdwb2ludGVyIHJ0eF9wYXlsb2FkOworICAgICAgU1NSQ1J0eERhdGEgKmRhdGE7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9jYXBzIChldmVudCwgJmNhcHMpOworCisgICAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQgKHMsICJzc3JjIiwgJnNzcmMpKQorICAgICAgICBzc3JjID0gLTE7CisgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgInBheWxvYWQiLCAmcGF5bG9hZCkpCisgICAgICAgIHBheWxvYWQgPSAtMTsKKworICAgICAgaWYgKHBheWxvYWQgPT0gLTEpCisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnR4LCAiTm8gcGF5bG9hZCBpbiBjYXBzIik7CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocnR4KTsKKyAgICAgIGRhdGEgPSBnc3RfcnRwX3J0eF9zZW5kX2dldF9zc3JjX2RhdGEgKHJ0eCwgc3NyYyk7CisgICAgICBpZiAoIWdfaGFzaF90YWJsZV9sb29rdXBfZXh0ZW5kZWQgKHJ0eC0+cnR4X3B0X21hcCwKKyAgICAgICAgICAgICAgR1VJTlRfVE9fUE9JTlRFUiAocGF5bG9hZCksIE5VTEwsICZydHhfcGF5bG9hZCkpCisgICAgICAgIHJ0eF9wYXlsb2FkID0gR0lOVF9UT19QT0lOVEVSICgtMSk7CisKKyAgICAgIGlmIChHUE9JTlRFUl9UT19JTlQgKHJ0eF9wYXlsb2FkKSA9PSAtMSAmJiBwYXlsb2FkICE9IC0xKQorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0eCwgIlBheWxvYWQgJWQgbm90IGluIHJ0eC1wdC1tYXAiLCBwYXlsb2FkKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnR4LAorICAgICAgICAgICJnb3QgY2FwcyBmb3IgcGF5bG9hZDogJWQtPiVkLCBzc3JjOiAldS0+JXUgOiAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgICAgICBwYXlsb2FkLCBHUE9JTlRFUl9UT19JTlQgKHJ0eF9wYXlsb2FkKSwgc3NyYywgZGF0YS0+cnR4X3NzcmMsIGNhcHMpOworCisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJjbG9jay1yYXRlIiwgJmRhdGEtPmNsb2NrX3JhdGUpOworCisgICAgICAvKiBUaGUgc2Vzc2lvbiBtaWdodCBuZWVkIHRvIGtub3cgdGhlIFJUWCBzc3JjICovCisgICAgICBjYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAicnR4LXNzcmMiLCBHX1RZUEVfVUlOVCwgZGF0YS0+cnR4X3NzcmMsCisgICAgICAgICAgInJ0eC1zZXFudW0tb2Zmc2V0IiwgR19UWVBFX1VJTlQsIGRhdGEtPnNlcW51bV9iYXNlLCBOVUxMKTsKKworICAgICAgaWYgKEdQT0lOVEVSX1RPX0lOVCAocnR4X3BheWxvYWQpICE9IC0xKQorICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAicnR4LXBheWxvYWQiLCBHX1RZUEVfSU5ULAorICAgICAgICAgICAgR1BPSU5URVJfVE9fSU5UIChydHhfcGF5bG9hZCksIE5VTEwpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHgsICJnb3QgY2xvY2stcmF0ZSBmcm9tIGNhcHM6ICVkIGZvciBzc3JjOiAldSIsCisgICAgICAgICAgZGF0YS0+Y2xvY2tfcmF0ZSwgc3NyYyk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKKworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfY2FwcyAoY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7Cit9CisKKy8qIGxpa2UgcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3RzX2RpZmYoKSAqLworc3RhdGljIGd1aW50MzIKK2dzdF9ydHBfcnR4X3NlbmRfZ2V0X3RzX2RpZmYgKFNTUkNSdHhEYXRhICogZGF0YSkKK3sKKyAgZ3VpbnQ2NCBoaWdoX3RzLCBsb3dfdHM7CisgIEJ1ZmZlclF1ZXVlSXRlbSAqaGlnaF9idWYsICpsb3dfYnVmOworICBndWludDMyIHJlc3VsdDsKKworICBoaWdoX2J1ZiA9CisgICAgICBnX3NlcXVlbmNlX2dldCAoZ19zZXF1ZW5jZV9pdGVyX3ByZXYgKGdfc2VxdWVuY2VfZ2V0X2VuZF9pdGVyCisgICAgICAgICAgKGRhdGEtPnF1ZXVlKSkpOworICBsb3dfYnVmID0gZ19zZXF1ZW5jZV9nZXQgKGdfc2VxdWVuY2VfZ2V0X2JlZ2luX2l0ZXIgKGRhdGEtPnF1ZXVlKSk7CisKKyAgaWYgKCFoaWdoX2J1ZiB8fCAhbG93X2J1ZiB8fCBoaWdoX2J1ZiA9PSBsb3dfYnVmKQorICAgIHJldHVybiAwOworCisgIGhpZ2hfdHMgPSBoaWdoX2J1Zi0+dGltZXN0YW1wOworICBsb3dfdHMgPSBsb3dfYnVmLT50aW1lc3RhbXA7CisKKyAgLyogaXQgbmVlZHMgdG8gd29yayBpZiB0cyB3cmFwcyAqLworICBpZiAoaGlnaF90cyA+PSBsb3dfdHMpIHsKKyAgICByZXN1bHQgPSAoZ3VpbnQzMikgKGhpZ2hfdHMgLSBsb3dfdHMpOworICB9IGVsc2UgeworICAgIHJlc3VsdCA9IChndWludDMyKSAoaGlnaF90cyArIEdfTUFYVUlOVDMyICsgMSAtIGxvd190cyk7CisgIH0KKworICAvKiByZXR1cm4gdmFsdWUgaW4gbXMgaW5zdGVhZCBvZiBjbG9jayB0aWNrcyAqLworICByZXR1cm4gKGd1aW50MzIpIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHJlc3VsdCwgMTAwMCwgZGF0YS0+Y2xvY2tfcmF0ZSk7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggbG9jayAqLworc3RhdGljIHZvaWQKK3Byb2Nlc3NfYnVmZmVyIChHc3RSdHBSdHhTZW5kICogcnR4LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJUUEJ1ZmZlciBydHAgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworICBCdWZmZXJRdWV1ZUl0ZW0gKml0ZW07CisgIFNTUkNSdHhEYXRhICpkYXRhOworICBndWludDE2IHNlcW51bTsKKyAgZ3VpbnQ4IHBheWxvYWRfdHlwZTsKKyAgZ3VpbnQzMiBzc3JjLCBydHB0aW1lOworCisgIC8qIHJlYWQgdGhlIGluZm9ybWF0aW9uIHdlIHdhbnQgZnJvbSB0aGUgYnVmZmVyICovCisgIGdzdF9ydHBfYnVmZmVyX21hcCAoYnVmZmVyLCBHU1RfTUFQX1JFQUQsICZydHApOworICBzZXFudW0gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfc2VxICgmcnRwKTsKKyAgcGF5bG9hZF90eXBlID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfdHlwZSAoJnJ0cCk7CisgIHNzcmMgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfc3NyYyAoJnJ0cCk7CisgIHJ0cHRpbWUgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wICgmcnRwKTsKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0eCwgIlByb2Nlc3NpbmcgYnVmZmVyIHNlcW51bTogJXUsIHNzcmM6ICVYIiwgc2VxbnVtLAorICAgICAgc3NyYyk7CisKKyAgLyogZG8gbm90IHN0b3JlIHRoZSBidWZmZXIgaWYgaXQncyBwYXlsb2FkIHR5cGUgaXMgdW5rbm93biAqLworICBpZiAoZ19oYXNoX3RhYmxlX2NvbnRhaW5zIChydHgtPnJ0eF9wdF9tYXAsIEdVSU5UX1RPX1BPSU5URVIgKHBheWxvYWRfdHlwZSkpKSB7CisgICAgZGF0YSA9IGdzdF9ydHBfcnR4X3NlbmRfZ2V0X3NzcmNfZGF0YSAocnR4LCBzc3JjKTsKKworICAgIC8qIGFkZCBjdXJyZW50IHJ0cCBidWZmZXIgdG8gcXVldWUgaGlzdG9yeSAqLworICAgIGl0ZW0gPSBnX3NsaWNlX25ldzAgKEJ1ZmZlclF1ZXVlSXRlbSk7CisgICAgaXRlbS0+c2VxbnVtID0gc2VxbnVtOworICAgIGl0ZW0tPnRpbWVzdGFtcCA9IHJ0cHRpbWU7CisgICAgaXRlbS0+YnVmZmVyID0gZ3N0X2J1ZmZlcl9yZWYgKGJ1ZmZlcik7CisgICAgZ19zZXF1ZW5jZV9hcHBlbmQgKGRhdGEtPnF1ZXVlLCBpdGVtKTsKKworICAgIC8qIHJlbW92ZSBvbGRlc3QgcGFja2V0cyBmcm9tIGhpc3RvcnkgaWYgdGhleSBhcmUgdG9vIG1hbnkgKi8KKyAgICBpZiAocnR4LT5tYXhfc2l6ZV9wYWNrZXRzKSB7CisgICAgICB3aGlsZSAoZ19zZXF1ZW5jZV9nZXRfbGVuZ3RoIChkYXRhLT5xdWV1ZSkgPiBydHgtPm1heF9zaXplX3BhY2tldHMpCisgICAgICAgIGdfc2VxdWVuY2VfcmVtb3ZlIChnX3NlcXVlbmNlX2dldF9iZWdpbl9pdGVyIChkYXRhLT5xdWV1ZSkpOworICAgIH0KKyAgICBpZiAocnR4LT5tYXhfc2l6ZV90aW1lKSB7CisgICAgICB3aGlsZSAoZ3N0X3J0cF9ydHhfc2VuZF9nZXRfdHNfZGlmZiAoZGF0YSkgPiBydHgtPm1heF9zaXplX3RpbWUpCisgICAgICAgIGdfc2VxdWVuY2VfcmVtb3ZlIChnX3NlcXVlbmNlX2dldF9iZWdpbl9pdGVyIChkYXRhLT5xdWV1ZSkpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9ydHhfc2VuZF9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UnRwUnR4U2VuZCAqcnR4ID0gR1NUX1JUUF9SVFhfU0VORCAocGFyZW50KTsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgR1NUX09CSkVDVF9MT0NLIChydHgpOworICBwcm9jZXNzX2J1ZmZlciAocnR4LCBidWZmZXIpOworICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChydHgtPnNyY3BhZCwgYnVmZmVyKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3Byb2Nlc3NfYnVmZmVyX2Zyb21fbGlzdCAoR3N0QnVmZmVyICoqIGJ1ZmZlciwgZ3VpbnQgaWR4LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIHByb2Nlc3NfYnVmZmVyICh1c2VyX2RhdGEsICpidWZmZXIpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfcnR4X3NlbmRfY2hhaW5fbGlzdCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyTGlzdCAqIGxpc3QpCit7CisgIEdzdFJ0cFJ0eFNlbmQgKnJ0eCA9IEdTVF9SVFBfUlRYX1NFTkQgKHBhcmVudCk7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIEdTVF9PQkpFQ1RfTE9DSyAocnR4KTsKKyAgZ3N0X2J1ZmZlcl9saXN0X2ZvcmVhY2ggKGxpc3QsIHByb2Nlc3NfYnVmZmVyX2Zyb21fbGlzdCwgcnR4KTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0eCk7CisKKyAgcmV0ID0gZ3N0X3BhZF9wdXNoX2xpc3QgKHJ0eC0+c3JjcGFkLCBsaXN0KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9ydHhfc2VuZF9zcmNfbG9vcCAoR3N0UnRwUnR4U2VuZCAqIHJ0eCkKK3sKKyAgR3N0RGF0YVF1ZXVlSXRlbSAqZGF0YTsKKworICBpZiAoZ3N0X2RhdGFfcXVldWVfcG9wIChydHgtPnF1ZXVlLCAmZGF0YSkpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocnR4LCAicHVzaGluZyBydHggYnVmZmVyICVwIiwgZGF0YS0+b2JqZWN0KTsKKworICAgIGlmIChHX0xJS0VMWSAoR1NUX0lTX0JVRkZFUiAoZGF0YS0+b2JqZWN0KSkpIHsKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocnR4KTsKKyAgICAgIC8qIFVwZGF0ZSBzdGF0aXN0aWNzIGp1c3QgYmVmb3JlIHB1c2hpbmcuICovCisgICAgICBydHgtPm51bV9ydHhfcGFja2V0cysrOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0eCk7CisKKyAgICAgIGdzdF9wYWRfcHVzaCAocnR4LT5zcmNwYWQsIEdTVF9CVUZGRVIgKGRhdGEtPm9iamVjdCkpOworICAgIH0gZWxzZSBpZiAoR1NUX0lTX0VWRU5UIChkYXRhLT5vYmplY3QpKSB7CisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHJ0eC0+c3JjcGFkLCBHU1RfRVZFTlQgKGRhdGEtPm9iamVjdCkpOworCisgICAgICAvKiBhZnRlciBFT1MsIHdlIHNob3VsZCBub3Qgc2VuZCBhbnkgbW9yZSBidWZmZXJzLAorICAgICAgICogZXZlbiBpZiB0aGVyZSBhcmUgbW9yZSByZXF1ZXN0cyBjb21pbmcgaW4gKi8KKyAgICAgIGlmIChHU1RfRVZFTlRfVFlQRSAoZGF0YS0+b2JqZWN0KSA9PSBHU1RfRVZFTlRfRU9TKSB7CisgICAgICAgIGdzdF9ydHBfcnR4X3NlbmRfc2V0X2ZsdXNoaW5nIChydHgsIFRSVUUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICB9CisKKyAgICBkYXRhLT5vYmplY3QgPSBOVUxMOyAgICAgICAgLyogd2Ugbm8gbG9uZ2VyIG93biB0aGF0IG9iamVjdCAqLworICAgIGRhdGEtPmRlc3Ryb3kgKGRhdGEpOworICB9IGVsc2UgeworICAgIEdTVF9MT0dfT0JKRUNUIChydHgsICJmbHVzaGluZyIpOworICAgIGdzdF9wYWRfcGF1c2VfdGFzayAocnR4LT5zcmNwYWQpOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9ydHhfc2VuZF9hY3RpdmF0ZV9tb2RlIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RQYWRNb2RlIG1vZGUsIGdib29sZWFuIGFjdGl2ZSkKK3sKKyAgR3N0UnRwUnR4U2VuZCAqcnR4ID0gR1NUX1JUUF9SVFhfU0VORCAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBHU1RfUEFEX01PREVfUFVTSDoKKyAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgZ3N0X3J0cF9ydHhfc2VuZF9zZXRfZmx1c2hpbmcgKHJ0eCwgRkFMU0UpOworICAgICAgICByZXQgPSBnc3RfcGFkX3N0YXJ0X3Rhc2sgKHJ0eC0+c3JjcGFkLAorICAgICAgICAgICAgKEdzdFRhc2tGdW5jdGlvbikgZ3N0X3J0cF9ydHhfc2VuZF9zcmNfbG9vcCwgcnR4LCBOVUxMKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9ydHBfcnR4X3NlbmRfc2V0X2ZsdXNoaW5nIChydHgsIFRSVUUpOworICAgICAgICByZXQgPSBnc3RfcGFkX3N0b3BfdGFzayAocnR4LT5zcmNwYWQpOworICAgICAgfQorICAgICAgR1NUX0lORk9fT0JKRUNUIChydHgsICJhY3RpdmF0ZV9tb2RlOiBhY3RpdmUgJWQsIHJldCAlZCIsIGFjdGl2ZSwgcmV0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9ydHhfc2VuZF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwUnR4U2VuZCAqcnR4ID0gR1NUX1JUUF9SVFhfU0VORCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUEFZTE9BRF9UWVBFX01BUDoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocnR4KTsKKyAgICAgIGdfdmFsdWVfc2V0X2JveGVkICh2YWx1ZSwgcnR4LT5ydHhfcHRfbWFwX3N0cnVjdHVyZSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfU0laRV9USU1FOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChydHgpOworICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0eC0+bWF4X3NpemVfdGltZSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfU0laRV9QQUNLRVRTOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChydHgpOworICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0eC0+bWF4X3NpemVfcGFja2V0cyk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9OVU1fUlRYX1JFUVVFU1RTOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChydHgpOworICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0eC0+bnVtX3J0eF9yZXF1ZXN0cyk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9OVU1fUlRYX1BBQ0tFVFM6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHJ0eCk7CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnR4LT5udW1fcnR4X3BhY2tldHMpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0eCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorc3RydWN0dXJlX3RvX2hhc2hfdGFibGUgKEdRdWFyayBmaWVsZF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIGdwb2ludGVyIGhhc2gpCit7CisgIGNvbnN0IGdjaGFyICpmaWVsZF9zdHI7CisgIGd1aW50IGZpZWxkX3VpbnQ7CisgIGd1aW50IHZhbHVlX3VpbnQ7CisKKyAgZmllbGRfc3RyID0gZ19xdWFya190b19zdHJpbmcgKGZpZWxkX2lkKTsKKyAgZmllbGRfdWludCA9IGF0b2kgKGZpZWxkX3N0cik7CisgIHZhbHVlX3VpbnQgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKChHSGFzaFRhYmxlICopIGhhc2gsIEdVSU5UX1RPX1BPSU5URVIgKGZpZWxkX3VpbnQpLAorICAgICAgR1VJTlRfVE9fUE9JTlRFUiAodmFsdWVfdWludCkpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9ydHhfc2VuZF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwUnR4U2VuZCAqcnR4ID0gR1NUX1JUUF9SVFhfU0VORCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU1NSQ19NQVA6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHJ0eCk7CisgICAgICBpZiAocnR4LT5leHRlcm5hbF9zc3JjX21hcCkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChydHgtPmV4dGVybmFsX3NzcmNfbWFwKTsKKyAgICAgIHJ0eC0+ZXh0ZXJuYWxfc3NyY19tYXAgPSBnX3ZhbHVlX2R1cF9ib3hlZCAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUEFZTE9BRF9UWVBFX01BUDoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocnR4KTsKKyAgICAgIGlmIChydHgtPnJ0eF9wdF9tYXBfc3RydWN0dXJlKQorICAgICAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHJ0eC0+cnR4X3B0X21hcF9zdHJ1Y3R1cmUpOworICAgICAgcnR4LT5ydHhfcHRfbWFwX3N0cnVjdHVyZSA9IGdfdmFsdWVfZHVwX2JveGVkICh2YWx1ZSk7CisgICAgICBnX2hhc2hfdGFibGVfcmVtb3ZlX2FsbCAocnR4LT5ydHhfcHRfbWFwKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZm9yZWFjaCAocnR4LT5ydHhfcHRfbWFwX3N0cnVjdHVyZSwgc3RydWN0dXJlX3RvX2hhc2hfdGFibGUsCisgICAgICAgICAgcnR4LT5ydHhfcHRfbWFwKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9TSVpFX1RJTUU6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHJ0eCk7CisgICAgICBydHgtPm1heF9zaXplX3RpbWUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfU0laRV9QQUNLRVRTOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChydHgpOworICAgICAgcnR4LT5tYXhfc2l6ZV9wYWNrZXRzID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0eCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9ydHhfc2VuZF9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdFJ0cFJ0eFNlbmQgKnJ0eDsKKworICBydHggPSBHU1RfUlRQX1JUWF9TRU5EIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPQorICAgICAgR1NUX0VMRU1FTlRfQ0xBU1MgKGdzdF9ydHBfcnR4X3NlbmRfcGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LAorICAgICAgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9ydHBfcnR4X3NlbmRfcmVzZXQgKHJ0eCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9ydHhfc2VuZF9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3J0cF9ydHhfc2VuZF9kZWJ1ZywgInJ0cHJ0eHNlbmQiLCAwLAorICAgICAgInJ0cCByZXRyYW5zbWlzc2lvbiBzZW5kZXIiKTsKKworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHJ0eHNlbmQiLCBHU1RfUkFOS19OT05FLAorICAgICAgR1NUX1RZUEVfUlRQX1JUWF9TRU5EKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHNlbmQuaCBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHNlbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjA4NGU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5oCkBAIC0wLDAgKzEsODQgQEAKKy8qIFJUUCBSZXRyYW5zbWlzc2lvbiBzZW5kZXIgZWxlbWVudCBmb3IgR1N0cmVhbWVyCisgKgorICogZ3N0cnRwcnR4c2VuZC5oOgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBDb2xsYWJvcmEgTHRkLgorICogICBAYXV0aG9yIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1JUWF9TRU5EX0hfXworI2RlZmluZSBfX0dTVF9SVFBfUlRYX1NFTkRfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RkYXRhcXVldWUuaD4KKworR19CRUdJTl9ERUNMUworI2RlZmluZSBHU1RfVFlQRV9SVFBfUlRYX1NFTkQgKGdzdF9ydHBfcnR4X3NlbmRfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9SVFhfU0VORChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfUlRYX1NFTkQsIEdzdFJ0cFJ0eFNlbmQpKQorI2RlZmluZSBHU1RfUlRQX1JUWF9TRU5EX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfUlRYX1NFTkQsIEdzdFJ0cFJ0eFNlbmRDbGFzcykpCisjZGVmaW5lIEdTVF9SVFBfUlRYX1NFTkRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9SVFBfUlRYX1NFTkQsIEdzdFJ0cFJ0eFNlbmRDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfUlRYX1NFTkQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1JUWF9TRU5EKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9SVFhfU0VORF9DTEFTUyhvYmopIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9SVFhfU0VORCkpCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwUnR4U2VuZCBHc3RSdHBSdHhTZW5kOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFJ0eFNlbmRDbGFzcyBHc3RSdHBSdHhTZW5kQ2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwUnR4U2VuZAoreworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgLyogcGFkICovCisgIEdzdFBhZCAqc2lua3BhZDsKKyAgR3N0UGFkICpzcmNwYWQ7CisKKyAgLyogcnRwIHBhY2tldHMgdGhhdCB3aWxsIGJlIHB1c2hlZCBvdXQgKi8KKyAgR3N0RGF0YVF1ZXVlICpxdWV1ZTsKKworICAvKiBzc3JjIC0+IFNTUkNSdHhEYXRhICovCisgIEdIYXNoVGFibGUgKnNzcmNfZGF0YTsKKyAgLyogcnR4IHNzcmMgLT4gbWFzdGVyIHNzcmMgKi8KKyAgR0hhc2hUYWJsZSAqcnR4X3NzcmNzOworCisgIC8qIG1hc3RlciBzc3JjIC0+IHJ0eCBzc3JjIChwcm9wZXJ0eSkgKi8KKyAgR3N0U3RydWN0dXJlICpleHRlcm5hbF9zc3JjX21hcDsKKworICAvKiBvcmlnIHB0ICh1aW50KSAtPiBydHggcHQgKHVpbnQpICovCisgIEdIYXNoVGFibGUgKnJ0eF9wdF9tYXA7CisgIC8qIG9yaWcgcHQgKHN0cmluZykgLT4gcnR4IHB0ICh1aW50KSAqLworICBHc3RTdHJ1Y3R1cmUgKnJ0eF9wdF9tYXBfc3RydWN0dXJlOworCisgIC8qIGJ1ZmZlcmluZyBjb250cm9sIHByb3BlcnRpZXMgKi8KKyAgZ3VpbnQgbWF4X3NpemVfdGltZTsKKyAgZ3VpbnQgbWF4X3NpemVfcGFja2V0czsKKworICAvKiBzdGF0aXN0aWNzICovCisgIGd1aW50IG51bV9ydHhfcmVxdWVzdHM7CisgIGd1aW50IG51bV9ydHhfcGFja2V0czsKK307CisKK3N0cnVjdCBfR3N0UnRwUnR4U2VuZENsYXNzCit7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCisKK0dUeXBlIGdzdF9ydHBfcnR4X3NlbmRfZ2V0X3R5cGUgKHZvaWQpOworZ2Jvb2xlYW4gZ3N0X3J0cF9ydHhfc2VuZF9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9SVFBfUlRYX1NFTkRfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmMgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ4OTIyYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYwpAQCAtMCwwICsxLDI3MTkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1ydHBzZXNzaW9uCisgKiBAc2VlX2Fsc286IHJ0cGppdHRlcmJ1ZmZlciwgcnRwYmluLCBydHBwdGRlbXV4LCBydHBzc3JjZGVtdXgKKyAqCisgKiBUaGUgUlRQIHNlc3Npb24gbWFuYWdlciBtb2RlbHMgcGFydGljaXBhbnRzIHdpdGggdW5pcXVlIFNTUkMgaW4gYW4gUlRQCisgKiBzZXNzaW9uLiBUaGlzIHNlc3Npb24gY2FuIGJlIHVzZWQgdG8gc2VuZCBhbmQgcmVjZWl2ZSBSVFAgYW5kIFJUQ1AgcGFja2V0cy4KKyAqIEJhc2VkIG9uIHdoYXQgUkVRVUVTVCBwYWRzIGFyZSByZXF1ZXN0ZWQgZnJvbSB0aGUgc2Vzc2lvbiBtYW5hZ2VyLCBzcGVjaWZpYworICogZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWN0aXZhdGVkLgorICoKKyAqIFRoZSBzZXNzaW9uIG1hbmFnZXIgY3VycmVudGx5IGltcGxlbWVudHMgUkZDIDM1NTAgaW5jbHVkaW5nOgorICogPGl0ZW1pemVkbGlzdD4KKyAqICAgPGxpc3RpdGVtPgorICogICAgIDxwYXJhPlJUUCBwYWNrZXQgdmFsaWRhdGlvbiBiYXNlZCBvbiBjb25zZWN1dGl2ZSBzZXF1ZW5jZSBudW1iZXJzLjwvcGFyYT4KKyAqICAgPC9saXN0aXRlbT4KKyAqICAgPGxpc3RpdGVtPgorICogICAgIDxwYXJhPk1haW50YWluYW5jZSBvZiB0aGUgU1NSQyBwYXJ0aWNpcGFudCBkYXRhYmFzZS48L3BhcmE+CisgKiAgIDwvbGlzdGl0ZW0+CisgKiAgIDxsaXN0aXRlbT4KKyAqICAgICA8cGFyYT5LZWVwaW5nIHBlciBwYXJ0aWNpcGFudCBzdGF0aXN0aWNzIGJhc2VkIG9uIHJlY2VpdmVkIFJUQ1AgcGFja2V0cy48L3BhcmE+CisgKiAgIDwvbGlzdGl0ZW0+CisgKiAgIDxsaXN0aXRlbT4KKyAqICAgICA8cGFyYT5TY2hlZHVsaW5nIG9mIFJSL1NSIFJUQ1AgcGFja2V0cy48L3BhcmE+CisgKiAgIDwvbGlzdGl0ZW0+CisgKiAgIDxsaXN0aXRlbT4KKyAqICAgICA8cGFyYT5TdXBwb3J0IGZvciBtdWx0aXBsZSBzZW5kZXIgU1NSQy48L3BhcmE+CisgKiAgIDwvbGlzdGl0ZW0+CisgKiA8L2l0ZW1pemVkbGlzdD4KKyAqCisgKiBUaGUgcnRwc2Vzc2lvbiB3aWxsIG5vdCBkZW11eCBwYWNrZXRzIGJhc2VkIG9uIFNTUkMgb3IgcGF5bG9hZCB0eXBlLCBub3Igd2lsbAorICogaXQgY29ycmVjdCBmb3IgcGFja2V0IHJlb3JkZXJpbmcgYW5kIGppdHRlci4gVXNlICNHc3RSdHBzU3JjRGVtdXgsCisgKiAjR3N0UnRwUHREZW11eCBhbmQgR3N0UnRwSml0dGVyQnVmZmVyIGluIGFkZGl0aW9uIHRvICNHc3RSdHBTZXNzaW9uIHRvCisgKiBwZXJmb3JtIHRoZXNlIHRhc2tzLiBJdCBpcyB1c3VhbGx5IGEgZ29vZCBpZGVhIHRvIHVzZSAjR3N0UnRwQmluLCB3aGljaAorICogY29tYmluZXMgYWxsIHRoZXNlIGZlYXR1cmVzIGluIG9uZSBlbGVtZW50LgorICoKKyAqIFRvIHVzZSAjR3N0UnRwU2Vzc2lvbiBhcyBhbiBSVFAgcmVjZWl2ZXIsIHJlcXVlc3QgYSByZWN2X3J0cF9zaW5rIHBhZCwgd2hpY2ggd2lsbAorICogYXV0b21hdGljYWxseSBjcmVhdGUgcmVjdl9ydHBfc3JjIHBhZC4gRGF0YSByZWNlaXZlZCBvbiB0aGUgcmVjdl9ydHBfc2luayBwYWQKKyAqIHdpbGwgYmUgcHJvY2Vzc2VkIGluIHRoZSBzZXNzaW9uIGFuZCBhZnRlciBiZWluZyB2YWxpZGF0ZWQgZm9yd2FyZGVkIG9uIHRoZQorICogcmVjdl9ydHBfc3JjIHBhZC4KKyAqCisgKiBUbyBhbHNvIHVzZSAjR3N0UnRwU2Vzc2lvbiBhcyBhbiBSVENQIHJlY2VpdmVyLCByZXF1ZXN0IGEgcmVjdl9ydGNwX3NpbmsgcGFkLAorICogd2hpY2ggd2lsbCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIHN5bmNfc3JjIHBhZC4gUGFja2V0cyByZWNlaXZlZCBvbiB0aGUgUlRDUAorICogcGFkIHdpbGwgYmUgdXNlZCBieSB0aGUgc2Vzc2lvbiBtYW5hZ2VyIHRvIHVwZGF0ZSB0aGUgc3RhdHMgYW5kIGRhdGFiYXNlIG9mCisgKiB0aGUgb3RoZXIgcGFydGljaXBhbnRzLiBTUiBwYWNrZXRzIHdpbGwgYmUgZm9yd2FyZGVkIG9uIHRoZSBzeW5jX3NyYyBwYWQKKyAqIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIGludGVyLXN0cmVhbSBzeW5jaHJvbmlzYXRpb24gd2hlbiBuZWVkZWQuCisgKgorICogSWYgeW91IHdhbnQgdGhlIHNlc3Npb24gbWFuYWdlciB0byBnZW5lcmF0ZSBhbmQgc2VuZCBSVENQIHBhY2tldHMsIHJlcXVlc3QKKyAqIHRoZSBzZW5kX3J0Y3Bfc3JjIHBhZC4gUGFja2V0IHB1c2hlZCBvbiB0aGlzIHBhZCBjb250YWluIFNSL1JSIFJUQ1AgcmVwb3J0cworICogdGhhdCBzaG91bGQgYmUgc2VudCB0byBhbGwgcGFydGljaXBhbnRzIGluIHRoZSBzZXNzaW9uLgorICoKKyAqIFRvIHVzZSAjR3N0UnRwU2Vzc2lvbiBhcyBhIHNlbmRlciwgcmVxdWVzdCBhIHNlbmRfcnRwX3NpbmsgcGFkLCB3aGljaCB3aWxsCisgKiBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIHNlbmRfcnRwX3NyYyBwYWQuIFRoZSBzZXNzaW9uIG1hbmFnZXIgd2lsbAorICogZm9yd2FyZCB0aGUgcGFja2V0cyBvbiB0aGUgc2VuZF9ydHBfc3JjIHBhZCBhZnRlciB1cGRhdGluZyBpdHMgaW50ZXJuYWwgc3RhdGUuCisgKgorICogVGhlIHNlc3Npb24gbWFuYWdlciBuZWVkcyB0aGUgY2xvY2stcmF0ZSBvZiB0aGUgcGF5bG9hZCB0eXBlcyBpdCBpcyBoYW5kbGluZworICogYW5kIHdpbGwgc2lnbmFsIHRoZSAjR3N0UnRwU2Vzc2lvbjo6cmVxdWVzdC1wdC1tYXAgc2lnbmFsIHdoZW4gaXQgbmVlZHMgc3VjaCBhCisgKiBtYXBwaW5nLiBPbmUgY2FuIGNsZWFyIHRoZSBjYWNoZWQgdmFsdWVzIHdpdGggdGhlICNHc3RSdHBTZXNzaW9uOjpjbGVhci1wdC1tYXAKKyAqIHNpZ25hbC4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHVkcHNyYyBwb3J0PTUwMDAgY2Fwcz0iYXBwbGljYXRpb24veC1ydHAsIC4uLiIgISAucmVjdl9ydHBfc2luayBydHBzZXNzaW9uIC5yZWN2X3J0cF9zcmMgISBydHB0aGVvcmFkZXBheSAhIHRoZW9yYWRlYyAhIHh2aW1hZ2VzaW5rCisgKiBdfCBSZWNlaXZlIHRoZW9yYSBSVFAgcGFja2V0cyBmcm9tIHBvcnQgNTAwMCBhbmQgc2VuZCB0aGVtIHRvIHRoZSBkZXBheWxvYWRlciwKKyAqIGRlY29kZXIgYW5kIGRpc3BsYXkuIE5vdGUgdGhhdCB0aGUgYXBwbGljYXRpb24veC1ydHAgY2FwcyBvbiB1ZHBzcmMgc2hvdWxkIGJlCisgKiBjb25maWd1cmVkIGJhc2VkIG9uIHNvbWUgbmVnb3RpYXRpb24gcHJvY2VzcyBzdWNoIGFzIFJUU1AgZm9yIHRoaXMgcGlwZWxpbmUKKyAqIHRvIHdvcmsgY29ycmVjdGx5LgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHVkcHNyYyBwb3J0PTUwMDAgY2Fwcz0iYXBwbGljYXRpb24veC1ydHAsIC4uLiIgISAucmVjdl9ydHBfc2luayBydHBzZXNzaW9uIG5hbWU9c2Vzc2lvbiBcCisgKiAgICAgICAgLnJlY3ZfcnRwX3NyYyAhIHJ0cHRoZW9yYWRlcGF5ICEgdGhlb3JhZGVjICEgeHZpbWFnZXNpbmsgXAorICogICAgIHVkcHNyYyBwb3J0PTUwMDEgY2Fwcz0iYXBwbGljYXRpb24veC1ydGNwIiAhIHNlc3Npb24ucmVjdl9ydGNwX3NpbmsKKyAqIF18IFJlY2VpdmUgdGhlb3JhIFJUUCBwYWNrZXRzIGZyb20gcG9ydCA1MDAwIGFuZCBzZW5kIHRoZW0gdG8gdGhlIGRlcGF5bG9hZGVyLAorICogZGVjb2RlciBhbmQgZGlzcGxheS4gUmVjZWl2ZSBSVENQIHBhY2tldHMgZnJvbSBwb3J0IDUwMDEgYW5kIHByb2Nlc3MgdGhlbSBpbgorICogdGhlIHNlc3Npb24gbWFuYWdlci4KKyAqIE5vdGUgdGhhdCB0aGUgYXBwbGljYXRpb24veC1ydHAgY2FwcyBvbiB1ZHBzcmMgc2hvdWxkIGJlCisgKiBjb25maWd1cmVkIGJhc2VkIG9uIHNvbWUgbmVnb3RpYXRpb24gcHJvY2VzcyBzdWNoIGFzIFJUU1AgZm9yIHRoaXMgcGlwZWxpbmUKKyAqIHRvIHdvcmsgY29ycmVjdGx5LgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHZpZGVvdGVzdHNyYyAhIHRoZW9yYWVuYyAhIHJ0cHRoZW9yYXBheSAhIC5zZW5kX3J0cF9zaW5rIHJ0cHNlc3Npb24gLnNlbmRfcnRwX3NyYyAhIHVkcHNpbmsgcG9ydD01MDAwCisgKiBdfCBTZW5kIHRoZW9yYSBSVFAgcGFja2V0cyB0aHJvdWdoIHRoZSBzZXNzaW9uIG1hbmFnZXIgYW5kIG91dCBvbiBVRFAgcG9ydAorICogNTAwMC4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB2aWRlb3Rlc3RzcmMgISB0aGVvcmFlbmMgISBydHB0aGVvcmFwYXkgISAuc2VuZF9ydHBfc2luayBydHBzZXNzaW9uIG5hbWU9c2Vzc2lvbiAuc2VuZF9ydHBfc3JjIFwKKyAqICAgICAhIHVkcHNpbmsgcG9ydD01MDAwICBzZXNzaW9uLnNlbmRfcnRjcF9zcmMgISB1ZHBzaW5rIHBvcnQ9NTAwMQorICogXXwgU2VuZCB0aGVvcmEgUlRQIHBhY2tldHMgdGhyb3VnaCB0aGUgc2Vzc2lvbiBtYW5hZ2VyIGFuZCBvdXQgb24gVURQIHBvcnQKKyAqIDUwMDAuIFNlbmQgUlRDUCBwYWNrZXRzIG9uIHBvcnQgNTAwMS4gTm90ZSB0aGF0IHRoaXMgcGlwZWxpbmUgd2lsbCBub3QgcHJlcm9sbAorICogY29ycmVjdGx5IGJlY2F1c2UgdGhlIHNlY29uZCB1ZHBzaW5rIHdpbGwgbm90IHByZXJvbGwgY29ycmVjdGx5IChubyBSVENQCisgKiBwYWNrZXRzIGFyZSBzZW50IGluIHRoZSBQQVVTRUQgc3RhdGUpLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG1hbnVhbGx5IHNldCBhbmQKKyAqIGtlZXAgKHNlZSBnc3RfZWxlbWVudF9zZXRfbG9ja2VkX3N0YXRlKCkpIHRoZSBSVENQIHVkcHNpbmsgdG8gdGhlIFBMQVlJTkcgc3RhdGUuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKKyNpbmNsdWRlIDxnc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oPgorCisjaW5jbHVkZSAiZ3N0cnRwc2Vzc2lvbi5oIgorI2luY2x1ZGUgInJ0cHNlc3Npb24uaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3J0cF9zZXNzaW9uX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9ydHBfc2Vzc2lvbl9kZWJ1ZworCitHVHlwZQorZ3N0X3J0cF9udHBfdGltZV9zb3VyY2VfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSB0eXBlID0gMDsKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAge0dTVF9SVFBfTlRQX1RJTUVfU09VUkNFX05UUCwgIk5UUCB0aW1lIGJhc2VkIG9uIHJlYWx0aW1lIGNsb2NrIiwgIm50cCJ9LAorICAgIHtHU1RfUlRQX05UUF9USU1FX1NPVVJDRV9VTklYLCAiVU5JWCB0aW1lIGJhc2VkIG9uIHJlYWx0aW1lIGNsb2NrIiwgInVuaXgifSwKKyAgICB7R1NUX1JUUF9OVFBfVElNRV9TT1VSQ0VfUlVOTklOR19USU1FLAorICAgICAgICAgICJSdW5uaW5nIHRpbWUgYmFzZWQgb24gcGlwZWxpbmUgY2xvY2siLAorICAgICAgICAicnVubmluZy10aW1lIn0sCisgICAge0dTVF9SVFBfTlRQX1RJTUVfU09VUkNFX0NMT0NLX1RJTUUsICJQaXBlbGluZSBjbG9jayB0aW1lIiwgImNsb2NrLXRpbWUifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0sCisgIH07CisKKyAgaWYgKCF0eXBlKSB7CisgICAgdHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RSdHBOdHBUaW1lU291cmNlIiwgdmFsdWVzKTsKKyAgfQorICByZXR1cm4gdHlwZTsKK30KKworLyogc2luayBwYWRzICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgcnRwc2Vzc2lvbl9yZWN2X3J0cF9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgicmVjdl9ydHBfc2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfUkVRVUVTVCwKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHJ0cHNlc3Npb25fcmVjdl9ydGNwX3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJyZWN2X3J0Y3Bfc2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfUkVRVUVTVCwKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0Y3AiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBydHBzZXNzaW9uX3NlbmRfcnRwX3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzZW5kX3J0cF9zaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9SRVFVRVNULAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwIikKKyAgICApOworCisvKiBzcmMgcGFkcyAqLworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHJ0cHNlc3Npb25fcmVjdl9ydHBfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgicmVjdl9ydHBfc3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHJ0cHNlc3Npb25fc3luY19zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzeW5jX3NyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9TT01FVElNRVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydGNwIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgcnRwc2Vzc2lvbl9zZW5kX3J0cF9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzZW5kX3J0cF9zcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfU09NRVRJTUVTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgcnRwc2Vzc2lvbl9zZW5kX3J0Y3Bfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2VuZF9ydGNwX3NyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9SRVFVRVNULAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRjcCIpCisgICAgKTsKKworLyogc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICBTSUdOQUxfUkVRVUVTVF9QVF9NQVAsCisgIFNJR05BTF9DTEVBUl9QVF9NQVAsCisKKyAgU0lHTkFMX09OX05FV19TU1JDLAorICBTSUdOQUxfT05fU1NSQ19DT0xMSVNJT04sCisgIFNJR05BTF9PTl9TU1JDX1ZBTElEQVRFRCwKKyAgU0lHTkFMX09OX1NTUkNfQUNUSVZFLAorICBTSUdOQUxfT05fU1NSQ19TREVTLAorICBTSUdOQUxfT05fQllFX1NTUkMsCisgIFNJR05BTF9PTl9CWUVfVElNRU9VVCwKKyAgU0lHTkFMX09OX1RJTUVPVVQsCisgIFNJR05BTF9PTl9TRU5ERVJfVElNRU9VVCwKKyAgU0lHTkFMX09OX05FV19TRU5ERVJfU1NSQywKKyAgU0lHTkFMX09OX1NFTkRFUl9TU1JDX0FDVElWRSwKKyAgTEFTVF9TSUdOQUwKK307CisKKyNkZWZpbmUgREVGQVVMVF9CQU5EV0lEVEggICAgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfUlRDUF9GUkFDVElPTiAgICAgICAgUlRQX1NUQVRTX1JUQ1BfRlJBQ1RJT04KKyNkZWZpbmUgREVGQVVMVF9SVENQX1JSX0JBTkRXSURUSCAgICAtMQorI2RlZmluZSBERUZBVUxUX1JUQ1BfUlNfQkFORFdJRFRIICAgIC0xCisjZGVmaW5lIERFRkFVTFRfU0RFUyAgICAgICAgICAgICAgICAgTlVMTAorI2RlZmluZSBERUZBVUxUX05VTV9TT1VSQ0VTICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9OVU1fQUNUSVZFX1NPVVJDRVMgICAwCisjZGVmaW5lIERFRkFVTFRfVVNFX1BJUEVMSU5FX0NMT0NLICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9SVENQX01JTl9JTlRFUlZBTCAgICAoUlRQX1NUQVRTX01JTl9JTlRFUlZBTCAqIEdTVF9TRUNPTkQpCisjZGVmaW5lIERFRkFVTFRfUFJPQkFUSU9OICAgICAgICAgICAgUlRQX0RFRkFVTFRfUFJPQkFUSU9OCisjZGVmaW5lIERFRkFVTFRfTUFYX0RST1BPVVRfVElNRSAgICAgNjAwMDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfTUlTT1JERVJfVElNRSAgICAyMDAwCisjZGVmaW5lIERFRkFVTFRfUlRQX1BST0ZJTEUgICAgICAgICAgR1NUX1JUUF9QUk9GSUxFX0FWUAorI2RlZmluZSBERUZBVUxUX05UUF9USU1FX1NPVVJDRSAgICAgIEdTVF9SVFBfTlRQX1RJTUVfU09VUkNFX05UUAorI2RlZmluZSBERUZBVUxUX1JUQ1BfU1lOQ19TRU5EX1RJTUUgIFRSVUUKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQkFORFdJRFRILAorICBQUk9QX1JUQ1BfRlJBQ1RJT04sCisgIFBST1BfUlRDUF9SUl9CQU5EV0lEVEgsCisgIFBST1BfUlRDUF9SU19CQU5EV0lEVEgsCisgIFBST1BfU0RFUywKKyAgUFJPUF9OVU1fU09VUkNFUywKKyAgUFJPUF9OVU1fQUNUSVZFX1NPVVJDRVMsCisgIFBST1BfSU5URVJOQUxfU0VTU0lPTiwKKyAgUFJPUF9VU0VfUElQRUxJTkVfQ0xPQ0ssCisgIFBST1BfUlRDUF9NSU5fSU5URVJWQUwsCisgIFBST1BfUFJPQkFUSU9OLAorICBQUk9QX01BWF9EUk9QT1VUX1RJTUUsCisgIFBST1BfTUFYX01JU09SREVSX1RJTUUsCisgIFBST1BfU1RBVFMsCisgIFBST1BfUlRQX1BST0ZJTEUsCisgIFBST1BfTlRQX1RJTUVfU09VUkNFLAorICBQUk9QX1JUQ1BfU1lOQ19TRU5EX1RJTUUKK307CisKKyNkZWZpbmUgR1NUX1JUUF9TRVNTSU9OX0dFVF9QUklWQVRFKG9iaikgIFwKKwkgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9QUklWQVRFICgob2JqKSwgR1NUX1RZUEVfUlRQX1NFU1NJT04sIEdzdFJ0cFNlc3Npb25Qcml2YXRlKSkKKworI2RlZmluZSBHU1RfUlRQX1NFU1NJT05fTE9DSyhzZXNzKSAgIGdfbXV0ZXhfbG9jayAoJihzZXNzKS0+cHJpdi0+bG9jaykKKyNkZWZpbmUgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyhzZXNzKSBnX211dGV4X3VubG9jayAoJihzZXNzKS0+cHJpdi0+bG9jaykKKworI2RlZmluZSBHU1RfUlRQX1NFU1NJT05fV0FJVChzZXNzKSAgIGdfY29uZF93YWl0ICgmKHNlc3MpLT5wcml2LT5jb25kLCAmKHNlc3MpLT5wcml2LT5sb2NrKQorI2RlZmluZSBHU1RfUlRQX1NFU1NJT05fU0lHTkFMKHNlc3MpIGdfY29uZF9zaWduYWwgKCYoc2VzcyktPnByaXYtPmNvbmQpCisKK3N0cnVjdCBfR3N0UnRwU2Vzc2lvblByaXZhdGUKK3sKKyAgR011dGV4IGxvY2s7CisgIEdDb25kIGNvbmQ7CisgIEdzdENsb2NrICpzeXNjbG9jazsKKworICBSVFBTZXNzaW9uICpzZXNzaW9uOworCisgIC8qIHRocmVhZCBmb3Igc2VuZGluZyBvdXQgUlRDUCAqLworICBHc3RDbG9ja0lEIGlkOworICBnYm9vbGVhbiBzdG9wX3RocmVhZDsKKyAgR1RocmVhZCAqdGhyZWFkOworICBnYm9vbGVhbiB0aHJlYWRfc3RvcHBlZDsKKyAgZ2Jvb2xlYW4gd2FpdF9zZW5kOworCisgIC8qIGNhcHMgbWFwcGluZyAqLworICBHSGFzaFRhYmxlICpwdG1hcDsKKworICBHc3RDbG9ja1RpbWUgc2VuZF9sYXRlbmN5OworCisgIGdib29sZWFuIHVzZV9waXBlbGluZV9jbG9jazsKKyAgR3N0UnRwTnRwVGltZVNvdXJjZSBudHBfdGltZV9zb3VyY2U7CisgIGdib29sZWFuIHJ0Y3Bfc3luY19zZW5kX3RpbWU7CisKKyAgZ3VpbnQgcnR4X2NvdW50OworfTsKKworLyogY2FsbGJhY2tzIHRvIGhhbmRsZSBhY3Rpb25zIGZyb20gdGhlIHNlc3Npb24gbWFuYWdlciAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9zZXNzaW9uX3Byb2Nlc3NfcnRwIChSVFBTZXNzaW9uICogc2VzcywKKyAgICBSVFBTb3VyY2UgKiBzcmMsIEdzdEJ1ZmZlciAqIGJ1ZmZlciwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfc2Vzc2lvbl9zZW5kX3J0cCAoUlRQU2Vzc2lvbiAqIHNlc3MsCisgICAgUlRQU291cmNlICogc3JjLCBncG9pbnRlciBkYXRhLCBncG9pbnRlciB1c2VyX2RhdGEpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9zZXNzaW9uX3NlbmRfcnRjcCAoUlRQU2Vzc2lvbiAqIHNlc3MsCisgICAgUlRQU291cmNlICogc3JjLCBHc3RCdWZmZXIgKiBidWZmZXIsIGdib29sZWFuIGVvcywgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfc2Vzc2lvbl9zeW5jX3J0Y3AgKFJUUFNlc3Npb24gKiBzZXNzLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlciwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3N0YXRpYyBnaW50IGdzdF9ydHBfc2Vzc2lvbl9jbG9ja19yYXRlIChSVFBTZXNzaW9uICogc2VzcywgZ3VpbnQ4IHBheWxvYWQsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfc2Vzc2lvbl9yZWNvbnNpZGVyIChSVFBTZXNzaW9uICogc2VzcywgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfc2Vzc2lvbl9yZXF1ZXN0X2tleV91bml0IChSVFBTZXNzaW9uICogc2VzcywgZ3VpbnQzMiBzc3JjLAorICAgIGdib29sZWFuIGFsbF9oZWFkZXJzLCBncG9pbnRlciB1c2VyX2RhdGEpOworc3RhdGljIEdzdENsb2NrVGltZSBnc3RfcnRwX3Nlc3Npb25fcmVxdWVzdF90aW1lIChSVFBTZXNzaW9uICogc2Vzc2lvbiwKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9zZXNzaW9uX25vdGlmeV9uYWNrIChSVFBTZXNzaW9uICogc2VzcywKKyAgICBndWludDE2IHNlcW51bSwgZ3VpbnQxNiBibHAsIGd1aW50MzIgc3NyYywgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfc2Vzc2lvbl9yZWNvbmZpZ3VyZSAoUlRQU2Vzc2lvbiAqIHNlc3MsIGdwb2ludGVyIHVzZXJfZGF0YSk7CisKK3N0YXRpYyBSVFBTZXNzaW9uQ2FsbGJhY2tzIGNhbGxiYWNrcyA9IHsKKyAgZ3N0X3J0cF9zZXNzaW9uX3Byb2Nlc3NfcnRwLAorICBnc3RfcnRwX3Nlc3Npb25fc2VuZF9ydHAsCisgIGdzdF9ydHBfc2Vzc2lvbl9zeW5jX3J0Y3AsCisgIGdzdF9ydHBfc2Vzc2lvbl9zZW5kX3J0Y3AsCisgIGdzdF9ydHBfc2Vzc2lvbl9jbG9ja19yYXRlLAorICBnc3RfcnRwX3Nlc3Npb25fcmVjb25zaWRlciwKKyAgZ3N0X3J0cF9zZXNzaW9uX3JlcXVlc3Rfa2V5X3VuaXQsCisgIGdzdF9ydHBfc2Vzc2lvbl9yZXF1ZXN0X3RpbWUsCisgIGdzdF9ydHBfc2Vzc2lvbl9ub3RpZnlfbmFjaywKKyAgZ3N0X3J0cF9zZXNzaW9uX3JlY29uZmlndXJlCit9OworCisvKiBHT2JqZWN0IHZtZXRob2RzICovCitzdGF0aWMgdm9pZCBnc3RfcnRwX3Nlc3Npb25fZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9zZXNzaW9uX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfc2Vzc2lvbl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKKy8qIEdzdEVsZW1lbnQgdm1ldGhvZHMgKi8KK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX3Nlc3Npb25fY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyBHc3RQYWQgKmdzdF9ydHBfc2Vzc2lvbl9yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsIGNvbnN0IGdjaGFyICogbmFtZSwgY29uc3QgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9zZXNzaW9uX3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfc2Vzc2lvbl9zaW5rX3NldGNhcHMgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbiwgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfc2Vzc2lvbl9zZXRjYXBzX3NlbmRfcnRwIChHc3RQYWQgKiBwYWQsCisgICAgR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24sIEdzdENhcHMgKiBjYXBzKTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9zZXNzaW9uX2NsZWFyX3B0X21hcCAoR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24pOworCitzdGF0aWMgR3N0U3RydWN0dXJlICpnc3RfcnRwX3Nlc3Npb25fY3JlYXRlX3N0YXRzIChHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbik7CisKK3N0YXRpYyBndWludCBnc3RfcnRwX3Nlc3Npb25fc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAgfTsKKworc3RhdGljIHZvaWQKK29uX25ld19zc3JjIChSVFBTZXNzaW9uICogc2Vzc2lvbiwgUlRQU291cmNlICogc3JjLCBHc3RSdHBTZXNzaW9uICogc2VzcykKK3sKKyAgZ19zaWduYWxfZW1pdCAoc2VzcywgZ3N0X3J0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX05FV19TU1JDXSwgMCwKKyAgICAgIHNyYy0+c3NyYyk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9zc3JjX2NvbGxpc2lvbiAoUlRQU2Vzc2lvbiAqIHNlc3Npb24sIFJUUFNvdXJjZSAqIHNyYywgR3N0UnRwU2Vzc2lvbiAqIHNlc3MpCit7CisgIEdzdFBhZCAqc2VuZF9ydHBfc2luazsKKworICBnX3NpZ25hbF9lbWl0IChzZXNzLCBnc3RfcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fU1NSQ19DT0xMSVNJT05dLCAwLAorICAgICAgc3JjLT5zc3JjKTsKKworICBHU1RfUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgIGlmICgoc2VuZF9ydHBfc2luayA9IHNlc3MtPnNlbmRfcnRwX3NpbmspKQorICAgIGdzdF9vYmplY3RfcmVmIChzZW5kX3J0cF9zaW5rKTsKKyAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisKKyAgaWYgKHNlbmRfcnRwX3NpbmspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgICBHc3RFdmVudCAqZXZlbnQ7CisgICAgUlRQU291cmNlICppbnRlcm5hbF9zcmM7CisgICAgZ3VpbnQzMiBzdWdnZXN0ZWRfc3NyYzsKKworICAgIHN0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgiR3N0UlRQQ29sbGlzaW9uIiwgInNzcmMiLCBHX1RZUEVfVUlOVCwKKyAgICAgICAgKGd1aW50KSBzcmMtPnNzcmMsIE5VTEwpOworCisgICAgLyogaWYgdGhlcmUgaXMgbm8gc291cmNlIHVzaW5nIHRoZSBzdWdnZXN0ZWQgc3NyYywgbW9zdCBwcm9iYWJseSBiZWNhdXNlCisgICAgICogdGhpcyBzc3JjIGhhcyBqdXN0IGNvbGxpZGVkLCBzdWdnZXN0IHVwc3RyZWFtIHRvIHVzZSBpdCAqLworICAgIHN1Z2dlc3RlZF9zc3JjID0gcnRwX3Nlc3Npb25fc3VnZ2VzdF9zc3JjIChzZXNzaW9uLCBOVUxMKTsKKyAgICBpbnRlcm5hbF9zcmMgPSBydHBfc2Vzc2lvbl9nZXRfc291cmNlX2J5X3NzcmMgKHNlc3Npb24sIHN1Z2dlc3RlZF9zc3JjKTsKKyAgICBpZiAoIWludGVybmFsX3NyYykKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzdHJ1Y3R1cmUsICJzdWdnZXN0ZWQtc3NyYyIsIEdfVFlQRV9VSU5ULAorICAgICAgICAgIChndWludCkgc3VnZ2VzdGVkX3NzcmMsIE5VTEwpOworICAgIGVsc2UKKyAgICAgIGdfb2JqZWN0X3VucmVmIChpbnRlcm5hbF9zcmMpOworCisgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwgc3RydWN0dXJlKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbmRfcnRwX3NpbmssIGV2ZW50KTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzZW5kX3J0cF9zaW5rKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorb25fc3NyY192YWxpZGF0ZWQgKFJUUFNlc3Npb24gKiBzZXNzaW9uLCBSVFBTb3VyY2UgKiBzcmMsIEdzdFJ0cFNlc3Npb24gKiBzZXNzKQoreworICBnX3NpZ25hbF9lbWl0IChzZXNzLCBnc3RfcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fU1NSQ19WQUxJREFURURdLCAwLAorICAgICAgc3JjLT5zc3JjKTsKK30KKworc3RhdGljIHZvaWQKK29uX3NzcmNfYWN0aXZlIChSVFBTZXNzaW9uICogc2Vzc2lvbiwgUlRQU291cmNlICogc3JjLCBHc3RSdHBTZXNzaW9uICogc2VzcykKK3sKKyAgZ19zaWduYWxfZW1pdCAoc2VzcywgZ3N0X3J0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX1NTUkNfQUNUSVZFXSwgMCwKKyAgICAgIHNyYy0+c3NyYyk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9zc3JjX3NkZXMgKFJUUFNlc3Npb24gKiBzZXNzaW9uLCBSVFBTb3VyY2UgKiBzcmMsIEdzdFJ0cFNlc3Npb24gKiBzZXNzKQoreworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIEdzdE1lc3NhZ2UgKm07CisKKyAgLyogY29udmVydCB0aGUgbmV3IFNERVMgaW5mbyBpbnRvIGEgbWVzc2FnZSAqLworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzaW9uKTsKKyAgZ19vYmplY3RfZ2V0IChzcmMsICJzZGVzIiwgJnMsIE5VTEwpOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3Npb24pOworCisgIG0gPSBnc3RfbWVzc2FnZV9uZXdfY3VzdG9tIChHU1RfTUVTU0FHRV9FTEVNRU5ULCBHU1RfT0JKRUNUIChzZXNzKSwgcyk7CisgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAoc2VzcyksIG0pOworCisgIGdfc2lnbmFsX2VtaXQgKHNlc3MsIGdzdF9ydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9TU1JDX1NERVNdLCAwLAorICAgICAgc3JjLT5zc3JjKTsKK30KKworc3RhdGljIHZvaWQKK29uX2J5ZV9zc3JjIChSVFBTZXNzaW9uICogc2Vzc2lvbiwgUlRQU291cmNlICogc3JjLCBHc3RSdHBTZXNzaW9uICogc2VzcykKK3sKKyAgZ19zaWduYWxfZW1pdCAoc2VzcywgZ3N0X3J0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX0JZRV9TU1JDXSwgMCwKKyAgICAgIHNyYy0+c3NyYyk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9ieWVfdGltZW91dCAoUlRQU2Vzc2lvbiAqIHNlc3Npb24sIFJUUFNvdXJjZSAqIHNyYywgR3N0UnRwU2Vzc2lvbiAqIHNlc3MpCit7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MsIGdzdF9ydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9CWUVfVElNRU9VVF0sIDAsCisgICAgICBzcmMtPnNzcmMpOworfQorCitzdGF0aWMgdm9pZAorb25fdGltZW91dCAoUlRQU2Vzc2lvbiAqIHNlc3Npb24sIFJUUFNvdXJjZSAqIHNyYywgR3N0UnRwU2Vzc2lvbiAqIHNlc3MpCit7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MsIGdzdF9ydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9USU1FT1VUXSwgMCwKKyAgICAgIHNyYy0+c3NyYyk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9zZW5kZXJfdGltZW91dCAoUlRQU2Vzc2lvbiAqIHNlc3Npb24sIFJUUFNvdXJjZSAqIHNyYywgR3N0UnRwU2Vzc2lvbiAqIHNlc3MpCit7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MsIGdzdF9ydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9TRU5ERVJfVElNRU9VVF0sIDAsCisgICAgICBzcmMtPnNzcmMpOworfQorCitzdGF0aWMgdm9pZAorb25fbmV3X3NlbmRlcl9zc3JjIChSVFBTZXNzaW9uICogc2Vzc2lvbiwgUlRQU291cmNlICogc3JjLCBHc3RSdHBTZXNzaW9uICogc2VzcykKK3sKKyAgZ19zaWduYWxfZW1pdCAoc2VzcywgZ3N0X3J0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX05FV19TRU5ERVJfU1NSQ10sIDAsCisgICAgICBzcmMtPnNzcmMpOworfQorCitzdGF0aWMgdm9pZAorb25fc2VuZGVyX3NzcmNfYWN0aXZlIChSVFBTZXNzaW9uICogc2Vzc2lvbiwgUlRQU291cmNlICogc3JjLAorICAgIEdzdFJ0cFNlc3Npb24gKiBzZXNzKQoreworICBnX3NpZ25hbF9lbWl0IChzZXNzLCBnc3RfcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fU0VOREVSX1NTUkNfQUNUSVZFXSwgMCwKKyAgICAgIHNyYy0+c3NyYyk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9ub3RpZnlfc3RhdHMgKFJUUFNlc3Npb24gKiBzZXNzaW9uLCBHUGFyYW1TcGVjICogc3BlYywKKyAgICBHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbikKK3sKKyAgZ19vYmplY3Rfbm90aWZ5IChHX09CSkVDVCAocnRwc2Vzc2lvbiksICJzdGF0cyIpOworfQorCisjZGVmaW5lIGdzdF9ydHBfc2Vzc2lvbl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBTZXNzaW9uLCBnc3RfcnRwX3Nlc3Npb24sIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zZXNzaW9uX2NsYXNzX2luaXQgKEdzdFJ0cFNlc3Npb25DbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgZ190eXBlX2NsYXNzX2FkZF9wcml2YXRlIChrbGFzcywgc2l6ZW9mIChHc3RSdHBTZXNzaW9uUHJpdmF0ZSkpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9zZXNzaW9uX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX3Nlc3Npb25fc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcnRwX3Nlc3Npb25fZ2V0X3Byb3BlcnR5OworCisgIC8qKgorICAgKiBHc3RSdHBTZXNzaW9uOjpyZXF1ZXN0LXB0LW1hcDoKKyAgICogQHNlc3M6IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAcHQ6IHRoZSBwdAorICAgKgorICAgKiBSZXF1ZXN0IHRoZSBwYXlsb2FkIHR5cGUgYXMgI0dzdENhcHMgZm9yIEBwdC4KKyAgICovCisgIGdzdF9ydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9SRVFVRVNUX1BUX01BUF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgicmVxdWVzdC1wdC1tYXAiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwU2Vzc2lvbkNsYXNzLCByZXF1ZXN0X3B0X21hcCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR1NUX1RZUEVfQ0FQUywgMSwgR19UWVBFX1VJTlQpOworICAvKioKKyAgICogR3N0UnRwU2Vzc2lvbjo6Y2xlYXItcHQtbWFwOgorICAgKiBAc2VzczogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqCisgICAqIENsZWFyIHRoZSBjYWNoZWQgcHQtbWFwcyByZXF1ZXN0ZWQgd2l0aCAjR3N0UnRwU2Vzc2lvbjo6cmVxdWVzdC1wdC1tYXAuCisgICAqLworICBnc3RfcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfQ0xFQVJfUFRfTUFQXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJjbGVhci1wdC1tYXAiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfQUNUSU9OLCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFNlc3Npb25DbGFzcywgY2xlYXJfcHRfbWFwKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19WT0lELCBHX1RZUEVfTk9ORSwgMCwgR19UWVBFX05PTkUpOworCisgIC8qKgorICAgKiBHc3RSdHBTZXNzaW9uOjpvbi1uZXctc3NyYzoKKyAgICogQHNlc3M6IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc3NyYzogdGhlIFNTUkMKKyAgICoKKyAgICogTm90aWZ5IG9mIGEgbmV3IFNTUkMgdGhhdCBlbnRlcmVkIEBzZXNzaW9uLgorICAgKi8KKyAgZ3N0X3J0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX05FV19TU1JDXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1uZXctc3NyYyIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBTZXNzaW9uQ2xhc3MsIG9uX25ld19zc3JjKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19VSU5ULCBHX1RZUEVfTk9ORSwgMSwgR19UWVBFX1VJTlQpOworICAvKioKKyAgICogR3N0UnRwU2Vzc2lvbjo6b24tc3NyY19jb2xsaXNpb246CisgICAqIEBzZXNzOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNzcmM6IHRoZSBTU1JDCisgICAqCisgICAqIE5vdGlmeSB3aGVuIHdlIGhhdmUgYW4gU1NSQyBjb2xsaXNpb24KKyAgICovCisgIGdzdF9ydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9TU1JDX0NPTExJU0lPTl0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tc3NyYy1jb2xsaXNpb24iLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwU2Vzc2lvbkNsYXNzLAorICAgICAgICAgIG9uX3NzcmNfY29sbGlzaW9uKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX1VJTlQsCisgICAgICBHX1RZUEVfTk9ORSwgMSwgR19UWVBFX1VJTlQpOworICAvKioKKyAgICogR3N0UnRwU2Vzc2lvbjo6b24tc3NyY192YWxpZGF0ZWQ6CisgICAqIEBzZXNzOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNzcmM6IHRoZSBTU1JDCisgICAqCisgICAqIE5vdGlmeSBvZiBhIG5ldyBTU1JDIHRoYXQgYmVjYW1lIHZhbGlkYXRlZC4KKyAgICovCisgIGdzdF9ydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9TU1JDX1ZBTElEQVRFRF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tc3NyYy12YWxpZGF0ZWQiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwU2Vzc2lvbkNsYXNzLAorICAgICAgICAgIG9uX3NzcmNfdmFsaWRhdGVkKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX1VJTlQsCisgICAgICBHX1RZUEVfTk9ORSwgMSwgR19UWVBFX1VJTlQpOworICAvKioKKyAgICogR3N0UnRwU2Vzc2lvbjo6b24tc3NyYy1hY3RpdmU6CisgICAqIEBzZXNzOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNzcmM6IHRoZSBTU1JDCisgICAqCisgICAqIE5vdGlmeSBvZiBhIFNTUkMgdGhhdCBpcyBhY3RpdmUsIGkuZS4sIHNlbmRpbmcgUlRDUC4KKyAgICovCisgIGdzdF9ydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9TU1JDX0FDVElWRV0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tc3NyYy1hY3RpdmUiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwU2Vzc2lvbkNsYXNzLAorICAgICAgICAgIG9uX3NzcmNfYWN0aXZlKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX1VJTlQsCisgICAgICBHX1RZUEVfTk9ORSwgMSwgR19UWVBFX1VJTlQpOworICAvKioKKyAgICogR3N0UnRwU2Vzc2lvbjo6b24tc3NyYy1zZGVzOgorICAgKiBAc2Vzc2lvbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzcmM6IHRoZSBTU1JDCisgICAqCisgICAqIE5vdGlmeSB0aGF0IGEgbmV3IFNERVMgd2FzIHJlY2VpdmVkIGZvciBTU1JDLgorICAgKi8KKyAgZ3N0X3J0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX1NTUkNfU0RFU10gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tc3NyYy1zZGVzIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFNlc3Npb25DbGFzcywgb25fc3NyY19zZGVzKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19VSU5ULCBHX1RZUEVfTk9ORSwgMSwgR19UWVBFX1VJTlQpOworCisgIC8qKgorICAgKiBHc3RSdHBTZXNzaW9uOjpvbi1ieWUtc3NyYzoKKyAgICogQHNlc3M6IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc3NyYzogdGhlIFNTUkMKKyAgICoKKyAgICogTm90aWZ5IG9mIGFuIFNTUkMgdGhhdCBiZWNhbWUgaW5hY3RpdmUgYmVjYXVzZSBvZiBhIEJZRSBwYWNrZXQuCisgICAqLworICBnc3RfcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fQllFX1NTUkNdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLWJ5ZS1zc3JjIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFNlc3Npb25DbGFzcywgb25fYnllX3NzcmMpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX1VJTlQsIEdfVFlQRV9OT05FLCAxLCBHX1RZUEVfVUlOVCk7CisgIC8qKgorICAgKiBHc3RSdHBTZXNzaW9uOjpvbi1ieWUtdGltZW91dDoKKyAgICogQHNlc3M6IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc3NyYzogdGhlIFNTUkMKKyAgICoKKyAgICogTm90aWZ5IG9mIGFuIFNTUkMgdGhhdCBoYXMgdGltZWQgb3V0IGJlY2F1c2Ugb2YgQllFCisgICAqLworICBnc3RfcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fQllFX1RJTUVPVVRdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLWJ5ZS10aW1lb3V0IiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFNlc3Npb25DbGFzcywgb25fYnllX3RpbWVvdXQpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX1VJTlQsIEdfVFlQRV9OT05FLCAxLCBHX1RZUEVfVUlOVCk7CisgIC8qKgorICAgKiBHc3RSdHBTZXNzaW9uOjpvbi10aW1lb3V0OgorICAgKiBAc2VzczogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzc3JjOiB0aGUgU1NSQworICAgKgorICAgKiBOb3RpZnkgb2YgYW4gU1NSQyB0aGF0IGhhcyB0aW1lZCBvdXQKKyAgICovCisgIGdzdF9ydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9USU1FT1VUXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi10aW1lb3V0IiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFNlc3Npb25DbGFzcywgb25fdGltZW91dCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfVk9JRF9fVUlOVCwgR19UWVBFX05PTkUsIDEsIEdfVFlQRV9VSU5UKTsKKyAgLyoqCisgICAqIEdzdFJ0cFNlc3Npb246Om9uLXNlbmRlci10aW1lb3V0OgorICAgKiBAc2VzczogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzc3JjOiB0aGUgU1NSQworICAgKgorICAgKiBOb3RpZnkgb2YgYSBzZW5kZXIgU1NSQyB0aGF0IGhhcyB0aW1lZCBvdXQgYW5kIGJlY2FtZSBhIHJlY2VpdmVyCisgICAqLworICBnc3RfcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fU0VOREVSX1RJTUVPVVRdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXNlbmRlci10aW1lb3V0IiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFNlc3Npb25DbGFzcywKKyAgICAgICAgICBvbl9zZW5kZXJfdGltZW91dCksIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19VSU5ULAorICAgICAgR19UWVBFX05PTkUsIDEsIEdfVFlQRV9VSU5UKTsKKworICAvKioKKyAgICogR3N0UnRwU2Vzc2lvbjo6b24tbmV3LXNlbmRlci1zc3JjOgorICAgKiBAc2VzczogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzc3JjOiB0aGUgc2VuZGVyIFNTUkMKKyAgICoKKyAgICogTm90aWZ5IG9mIGEgbmV3IHNlbmRlciBTU1JDIHRoYXQgZW50ZXJlZCBAc2Vzc2lvbi4KKyAgICoKKyAgICogU2luY2U6IDEuOAorICAgKi8KKyAgZ3N0X3J0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX05FV19TRU5ERVJfU1NSQ10gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tbmV3LXNlbmRlci1zc3JjIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFNlc3Npb25DbGFzcywgb25fbmV3X3NzcmMpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX1VJTlQsIEdfVFlQRV9OT05FLCAxLCBHX1RZUEVfVUlOVCk7CisKKyAgLyoqCisgICAqIEdzdFJ0cFNlc3Npb246Om9uLXNlbmRlci1zc3JjLWFjdGl2ZToKKyAgICogQHNlc3M6IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc3NyYzogdGhlIHNlbmRlciBTU1JDCisgICAqCisgICAqIE5vdGlmeSBvZiBhIHNlbmRlciBTU1JDIHRoYXQgaXMgYWN0aXZlLCBpLmUuLCBzZW5kaW5nIFJUQ1AuCisgICAqCisgICAqIFNpbmNlOiAxLjgKKyAgICovCisgIGdzdF9ydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9TRU5ERVJfU1NSQ19BQ1RJVkVdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXNlbmRlci1zc3JjLWFjdGl2ZSIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBTZXNzaW9uQ2xhc3MsCisgICAgICAgICAgb25fc3NyY19hY3RpdmUpLCBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfVk9JRF9fVUlOVCwKKyAgICAgIEdfVFlQRV9OT05FLCAxLCBHX1RZUEVfVUlOVCk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9CQU5EV0lEVEgsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYmFuZHdpZHRoIiwgIkJhbmR3aWR0aCIsCisgICAgICAgICAgIlRoZSBiYW5kd2lkdGggb2YgdGhlIHNlc3Npb24gaW4gYnl0ZXMgcGVyIHNlY29uZCAoMCBmb3IgYXV0by1kaXNjb3ZlcikiLAorICAgICAgICAgIDAuMCwgR19NQVhET1VCTEUsIERFRkFVTFRfQkFORFdJRFRILAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUlRDUF9GUkFDVElPTiwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJydGNwLWZyYWN0aW9uIiwgIlJUQ1AgRnJhY3Rpb24iLAorICAgICAgICAgICJUaGUgUlRDUCBiYW5kd2lkdGggb2YgdGhlIHNlc3Npb24gaW4gYnl0ZXMgcGVyIHNlY29uZCAiCisgICAgICAgICAgIihvciBhcyBhIHJlYWwgZnJhY3Rpb24gb2YgdGhlIFJUUCBiYW5kd2lkdGggaWYgPCAxLjApIiwKKyAgICAgICAgICAwLjAsIEdfTUFYRE9VQkxFLCBERUZBVUxUX1JUQ1BfRlJBQ1RJT04sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SVENQX1JSX0JBTkRXSURUSCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJydGNwLXJyLWJhbmR3aWR0aCIsICJSVENQIFJSIGJhbmR3aWR0aCIsCisgICAgICAgICAgIlRoZSBSVENQIGJhbmR3aWR0aCB1c2VkIGZvciByZWNlaXZlcnMgaW4gYnl0ZXMgcGVyIHNlY29uZCAoLTEgPSBkZWZhdWx0KSIsCisgICAgICAgICAgLTEsIEdfTUFYSU5ULCBERUZBVUxUX1JUQ1BfUlJfQkFORFdJRFRILAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUlRDUF9SU19CQU5EV0lEVEgsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicnRjcC1ycy1iYW5kd2lkdGgiLCAiUlRDUCBSUyBiYW5kd2lkdGgiLAorICAgICAgICAgICJUaGUgUlRDUCBiYW5kd2lkdGggdXNlZCBmb3Igc2VuZGVycyBpbiBieXRlcyBwZXIgc2Vjb25kICgtMSA9IGRlZmF1bHQpIiwKKyAgICAgICAgICAtMSwgR19NQVhJTlQsIERFRkFVTFRfUlRDUF9SU19CQU5EV0lEVEgsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TREVTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgic2RlcyIsICJTREVTIiwKKyAgICAgICAgICAiVGhlIFNERVMgaXRlbXMgb2YgdGhpcyBzZXNzaW9uIiwKKyAgICAgICAgICBHU1RfVFlQRV9TVFJVQ1RVUkUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTlVNX1NPVVJDRVMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm51bS1zb3VyY2VzIiwgIk51bSBTb3VyY2VzIiwKKyAgICAgICAgICAiVGhlIG51bWJlciBvZiBzb3VyY2VzIGluIHRoZSBzZXNzaW9uIiwgMCwgR19NQVhVSU5ULAorICAgICAgICAgIERFRkFVTFRfTlVNX1NPVVJDRVMsIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9OVU1fQUNUSVZFX1NPVVJDRVMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm51bS1hY3RpdmUtc291cmNlcyIsICJOdW0gQWN0aXZlIFNvdXJjZXMiLAorICAgICAgICAgICJUaGUgbnVtYmVyIG9mIGFjdGl2ZSBzb3VyY2VzIGluIHRoZSBzZXNzaW9uIiwgMCwgR19NQVhVSU5ULAorICAgICAgICAgIERFRkFVTFRfTlVNX0FDVElWRV9TT1VSQ0VTLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9JTlRFUk5BTF9TRVNTSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoImludGVybmFsLXNlc3Npb24iLCAiSW50ZXJuYWwgU2Vzc2lvbiIsCisgICAgICAgICAgIlRoZSBpbnRlcm5hbCBSVFBTZXNzaW9uIG9iamVjdCIsIFJUUF9UWVBFX1NFU1NJT04sCisgICAgICAgICAgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1VTRV9QSVBFTElORV9DTE9DSywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgidXNlLXBpcGVsaW5lLWNsb2NrIiwgIlVzZSBwaXBlbGluZSBjbG9jayIsCisgICAgICAgICAgIlVzZSB0aGUgcGlwZWxpbmUgcnVubmluZy10aW1lIHRvIHNldCB0aGUgTlRQIHRpbWUgaW4gdGhlIFJUQ1AgU1IgbWVzc2FnZXMgIgorICAgICAgICAgICIoREVQUkVDQVRFRDogVXNlIG50cC10aW1lLXNvdXJjZSBwcm9wZXJ0eSkiLAorICAgICAgICAgIERFRkFVTFRfVVNFX1BJUEVMSU5FX0NMT0NLLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdfUEFSQU1fREVQUkVDQVRFRCkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUlRDUF9NSU5fSU5URVJWQUwsCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgicnRjcC1taW4taW50ZXJ2YWwiLCAiTWluaW11bSBSVENQIGludGVydmFsIiwKKyAgICAgICAgICAiTWluaW11bSBpbnRlcnZhbCBiZXR3ZWVuIFJlZ3VsYXIgUlRDUCBwYWNrZXQgKGluIG5zKSIsCisgICAgICAgICAgMCwgR19NQVhVSU5UNjQsIERFRkFVTFRfUlRDUF9NSU5fSU5URVJWQUwsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QUk9CQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInByb2JhdGlvbiIsICJOdW1iZXIgb2YgcHJvYmF0aW9ucyIsCisgICAgICAgICAgIkNvbnNlY3V0aXZlIHBhY2tldCBzZXF1ZW5jZSBudW1iZXJzIHRvIGFjY2VwdCB0aGUgc291cmNlIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIERFRkFVTFRfUFJPQkFUSU9OLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX0RST1BPVVRfVElNRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LWRyb3BvdXQtdGltZSIsICJNYXggZHJvcG91dCB0aW1lIiwKKyAgICAgICAgICAiVGhlIG1heGltdW0gdGltZSAobWlsbGlzZWNvbmRzKSBvZiBtaXNzaW5nIHBhY2tldHMgdG9sZXJhdGVkLiIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCBERUZBVUxUX01BWF9EUk9QT1VUX1RJTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfTUlTT1JERVJfVElNRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LW1pc29yZGVyLXRpbWUiLCAiTWF4IG1pc29yZGVyIHRpbWUiLAorICAgICAgICAgICJUaGUgbWF4aW11bSB0aW1lIChtaWxsaXNlY29uZHMpIG9mIG1pc29yZGVyZWQgcGFja2V0cyB0b2xlcmF0ZWQuIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIERFRkFVTFRfTUFYX01JU09SREVSX1RJTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFJ0cFNlc3Npb246OnN0YXRzOgorICAgKgorICAgKiBWYXJpb3VzIHNlc3Npb24gc3RhdGlzdGljcy4gVGhpcyBwcm9wZXJ0eSByZXR1cm5zIGEgR3N0U3RydWN0dXJlCisgICAqIHdpdGggbmFtZSBhcHBsaWNhdGlvbi94LXJ0cC1zZXNzaW9uLXN0YXRzIHdpdGggdGhlIGZvbGxvd2luZyBmaWVsZHM6CisgICAqCisgICAqICAicnR4LWNvdW50IiAgICAgICBHX1RZUEVfVUlOVCAgIFRoZSBudW1iZXIgb2YgcmV0cmFuc21pc3Npb24gZXZlbnRzCisgICAqICAgICAgcmVjZWl2ZWQgZnJvbSBkb3duc3RyZWFtIChpbiByZWNlaXZlciBtb2RlKQorICAgKiAgInJ0eC1kcm9wLWNvdW50IiAgR19UWVBFX1VJTlQgICBUaGUgbnVtYmVyIG9mIHJldHJhbnNtaXNzaW9uIGV2ZW50cworICAgKiAgICAgIGRyb3BwZWQgKGR1ZSB0byBiYW5kd2lkdGggY29uc3RyYWludHMpCisgICAqICAic2VudC1uYWNrLWNvdW50IiBHX1RZUEVfVUlOVCAgIE51bWJlciBvZiBOQUNLcyBzZW50CisgICAqICAicmVjdi1uYWNrLWNvdW50IiBHX1RZUEVfVUlOVCAgIE51bWJlciBvZiBOQUNLcyByZWNlaXZlZAorICAgKiAgInNvdXJjZS1zdGF0cyIgICAgR19UWVBFX0JPWEVEICBHVmFsdWVBcnJheSBvZiAjUlRQU291cmNlOjpzdGF0cyBmb3IgYWxsCisgICAqICAgICAgUlRQIHNvdXJjZXMgKFNpbmNlIDEuOCkKKyAgICoKKyAgICogU2luY2U6IDEuNAorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TVEFUUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoInN0YXRzIiwgIlN0YXRpc3RpY3MiLAorICAgICAgICAgICJWYXJpb3VzIHN0YXRpc3RpY3MiLCBHU1RfVFlQRV9TVFJVQ1RVUkUsCisgICAgICAgICAgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JUUF9QUk9GSUxFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJydHAtcHJvZmlsZSIsICJSVFAgUHJvZmlsZSIsCisgICAgICAgICAgIlJUUCBwcm9maWxlIHRvIHVzZSIsIEdTVF9UWVBFX1JUUF9QUk9GSUxFLCBERUZBVUxUX1JUUF9QUk9GSUxFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTlRQX1RJTUVfU09VUkNFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJudHAtdGltZS1zb3VyY2UiLCAiTlRQIFRpbWUgU291cmNlIiwKKyAgICAgICAgICAiTlRQIHRpbWUgc291cmNlIGZvciBSVENQIHBhY2tldHMiLAorICAgICAgICAgIGdzdF9ydHBfbnRwX3RpbWVfc291cmNlX2dldF90eXBlICgpLCBERUZBVUxUX05UUF9USU1FX1NPVVJDRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JUQ1BfU1lOQ19TRU5EX1RJTUUsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInJ0Y3Atc3luYy1zZW5kLXRpbWUiLCAiUlRDUCBTeW5jIFNlbmQgVGltZSIsCisgICAgICAgICAgIlVzZSBzZW5kIHRpbWUgb3IgY2FwdHVyZSB0aW1lIGZvciBSVENQIHN5bmMgIgorICAgICAgICAgICIoVFJVRSA9IHNlbmQgdGltZSwgRkFMU0UgPSBjYXB0dXJlIHRpbWUpIiwKKyAgICAgICAgICBERUZBVUxUX1JUQ1BfU1lOQ19TRU5EX1RJTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX3Nlc3Npb25fY2hhbmdlX3N0YXRlKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cmVxdWVzdF9uZXdfcGFkID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX3Nlc3Npb25fcmVxdWVzdF9uZXdfcGFkKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cmVsZWFzZV9wYWQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfc2Vzc2lvbl9yZWxlYXNlX3BhZCk7CisKKyAga2xhc3MtPmNsZWFyX3B0X21hcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX3Nlc3Npb25fY2xlYXJfcHRfbWFwKTsKKworICAvKiBzaW5rIHBhZHMgKi8KKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmcnRwc2Vzc2lvbl9yZWN2X3J0cF9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmcnRwc2Vzc2lvbl9yZWN2X3J0Y3Bfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJnJ0cHNlc3Npb25fc2VuZF9ydHBfc2lua190ZW1wbGF0ZSk7CisKKyAgLyogc3JjIHBhZHMgKi8KKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmcnRwc2Vzc2lvbl9yZWN2X3J0cF9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZydHBzZXNzaW9uX3N5bmNfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmcnRwc2Vzc2lvbl9zZW5kX3J0cF9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZydHBzZXNzaW9uX3NlbmRfcnRjcF9zcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJSVFAgU2Vzc2lvbiIsCisgICAgICAiRmlsdGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJJbXBsZW1lbnQgYW4gUlRQIHNlc3Npb24iLCAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3J0cF9zZXNzaW9uX2RlYnVnLAorICAgICAgInJ0cHNlc3Npb24iLCAwLCAiUlRQIFNlc3Npb24iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc2Vzc2lvbl9pbml0IChHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbikKK3sKKyAgcnRwc2Vzc2lvbi0+cHJpdiA9IEdTVF9SVFBfU0VTU0lPTl9HRVRfUFJJVkFURSAocnRwc2Vzc2lvbik7CisgIGdfbXV0ZXhfaW5pdCAoJnJ0cHNlc3Npb24tPnByaXYtPmxvY2spOworICBnX2NvbmRfaW5pdCAoJnJ0cHNlc3Npb24tPnByaXYtPmNvbmQpOworICBydHBzZXNzaW9uLT5wcml2LT5zeXNjbG9jayA9IGdzdF9zeXN0ZW1fY2xvY2tfb2J0YWluICgpOworICBydHBzZXNzaW9uLT5wcml2LT5zZXNzaW9uID0gcnRwX3Nlc3Npb25fbmV3ICgpOworICBydHBzZXNzaW9uLT5wcml2LT51c2VfcGlwZWxpbmVfY2xvY2sgPSBERUZBVUxUX1VTRV9QSVBFTElORV9DTE9DSzsKKyAgcnRwc2Vzc2lvbi0+cHJpdi0+cnRjcF9zeW5jX3NlbmRfdGltZSA9IERFRkFVTFRfUlRDUF9TWU5DX1NFTkRfVElNRTsKKworICAvKiBjb25maWd1cmUgY2FsbGJhY2tzICovCisgIHJ0cF9zZXNzaW9uX3NldF9jYWxsYmFja3MgKHJ0cHNlc3Npb24tPnByaXYtPnNlc3Npb24sICZjYWxsYmFja3MsIHJ0cHNlc3Npb24pOworICAvKiBjb25maWd1cmUgc2lnbmFscyAqLworICBnX3NpZ25hbF9jb25uZWN0IChydHBzZXNzaW9uLT5wcml2LT5zZXNzaW9uLCAib24tbmV3LXNzcmMiLAorICAgICAgKEdDYWxsYmFjaykgb25fbmV3X3NzcmMsIHJ0cHNlc3Npb24pOworICBnX3NpZ25hbF9jb25uZWN0IChydHBzZXNzaW9uLT5wcml2LT5zZXNzaW9uLCAib24tc3NyYy1jb2xsaXNpb24iLAorICAgICAgKEdDYWxsYmFjaykgb25fc3NyY19jb2xsaXNpb24sIHJ0cHNlc3Npb24pOworICBnX3NpZ25hbF9jb25uZWN0IChydHBzZXNzaW9uLT5wcml2LT5zZXNzaW9uLCAib24tc3NyYy12YWxpZGF0ZWQiLAorICAgICAgKEdDYWxsYmFjaykgb25fc3NyY192YWxpZGF0ZWQsIHJ0cHNlc3Npb24pOworICBnX3NpZ25hbF9jb25uZWN0IChydHBzZXNzaW9uLT5wcml2LT5zZXNzaW9uLCAib24tc3NyYy1hY3RpdmUiLAorICAgICAgKEdDYWxsYmFjaykgb25fc3NyY19hY3RpdmUsIHJ0cHNlc3Npb24pOworICBnX3NpZ25hbF9jb25uZWN0IChydHBzZXNzaW9uLT5wcml2LT5zZXNzaW9uLCAib24tc3NyYy1zZGVzIiwKKyAgICAgIChHQ2FsbGJhY2spIG9uX3NzcmNfc2RlcywgcnRwc2Vzc2lvbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cHNlc3Npb24tPnByaXYtPnNlc3Npb24sICJvbi1ieWUtc3NyYyIsCisgICAgICAoR0NhbGxiYWNrKSBvbl9ieWVfc3NyYywgcnRwc2Vzc2lvbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cHNlc3Npb24tPnByaXYtPnNlc3Npb24sICJvbi1ieWUtdGltZW91dCIsCisgICAgICAoR0NhbGxiYWNrKSBvbl9ieWVfdGltZW91dCwgcnRwc2Vzc2lvbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cHNlc3Npb24tPnByaXYtPnNlc3Npb24sICJvbi10aW1lb3V0IiwKKyAgICAgIChHQ2FsbGJhY2spIG9uX3RpbWVvdXQsIHJ0cHNlc3Npb24pOworICBnX3NpZ25hbF9jb25uZWN0IChydHBzZXNzaW9uLT5wcml2LT5zZXNzaW9uLCAib24tc2VuZGVyLXRpbWVvdXQiLAorICAgICAgKEdDYWxsYmFjaykgb25fc2VuZGVyX3RpbWVvdXQsIHJ0cHNlc3Npb24pOworICBnX3NpZ25hbF9jb25uZWN0IChydHBzZXNzaW9uLT5wcml2LT5zZXNzaW9uLCAib24tbmV3LXNlbmRlci1zc3JjIiwKKyAgICAgIChHQ2FsbGJhY2spIG9uX25ld19zZW5kZXJfc3NyYywgcnRwc2Vzc2lvbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cHNlc3Npb24tPnByaXYtPnNlc3Npb24sICJvbi1zZW5kZXItc3NyYy1hY3RpdmUiLAorICAgICAgKEdDYWxsYmFjaykgb25fc2VuZGVyX3NzcmNfYWN0aXZlLCBydHBzZXNzaW9uKTsKKyAgZ19zaWduYWxfY29ubmVjdCAocnRwc2Vzc2lvbi0+cHJpdi0+c2Vzc2lvbiwgIm5vdGlmeTo6c3RhdHMiLAorICAgICAgKEdDYWxsYmFjaykgb25fbm90aWZ5X3N0YXRzLCBydHBzZXNzaW9uKTsKKyAgcnRwc2Vzc2lvbi0+cHJpdi0+cHRtYXAgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9jYXBzX3VucmVmKTsKKworICBnc3Rfc2VnbWVudF9pbml0ICgmcnRwc2Vzc2lvbi0+cmVjdl9ydHBfc2VnLCBHU1RfRk9STUFUX1VOREVGSU5FRCk7CisgIGdzdF9zZWdtZW50X2luaXQgKCZydHBzZXNzaW9uLT5zZW5kX3J0cF9zZWcsIEdTVF9GT1JNQVRfVU5ERUZJTkVEKTsKKworICBydHBzZXNzaW9uLT5wcml2LT50aHJlYWRfc3RvcHBlZCA9IFRSVUU7CisKKyAgcnRwc2Vzc2lvbi0+cHJpdi0+cnR4X2NvdW50ID0gMDsKKworICBydHBzZXNzaW9uLT5wcml2LT5udHBfdGltZV9zb3VyY2UgPSBERUZBVUxUX05UUF9USU1FX1NPVVJDRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc2Vzc2lvbl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwU2Vzc2lvbiAqcnRwc2Vzc2lvbjsKKworICBydHBzZXNzaW9uID0gR1NUX1JUUF9TRVNTSU9OIChvYmplY3QpOworCisgIGdfaGFzaF90YWJsZV9kZXN0cm95IChydHBzZXNzaW9uLT5wcml2LT5wdG1hcCk7CisgIGdfbXV0ZXhfY2xlYXIgKCZydHBzZXNzaW9uLT5wcml2LT5sb2NrKTsKKyAgZ19jb25kX2NsZWFyICgmcnRwc2Vzc2lvbi0+cHJpdi0+Y29uZCk7CisgIGdfb2JqZWN0X3VucmVmIChydHBzZXNzaW9uLT5wcml2LT5zeXNjbG9jayk7CisgIGdfb2JqZWN0X3VucmVmIChydHBzZXNzaW9uLT5wcml2LT5zZXNzaW9uKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3Nlc3Npb25fc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb247CisgIEdzdFJ0cFNlc3Npb25Qcml2YXRlICpwcml2OworCisgIHJ0cHNlc3Npb24gPSBHU1RfUlRQX1NFU1NJT04gKG9iamVjdCk7CisgIHByaXYgPSBydHBzZXNzaW9uLT5wcml2OworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9CQU5EV0lEVEg6CisgICAgICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChwcml2LT5zZXNzaW9uKSwgImJhbmR3aWR0aCIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX0ZSQUNUSU9OOgorICAgICAgZ19vYmplY3Rfc2V0X3Byb3BlcnR5IChHX09CSkVDVCAocHJpdi0+c2Vzc2lvbiksICJydGNwLWZyYWN0aW9uIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUQ1BfUlJfQkFORFdJRFRIOgorICAgICAgZ19vYmplY3Rfc2V0X3Byb3BlcnR5IChHX09CSkVDVCAocHJpdi0+c2Vzc2lvbiksICJydGNwLXJyLWJhbmR3aWR0aCIsCisgICAgICAgICAgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUQ1BfUlNfQkFORFdJRFRIOgorICAgICAgZ19vYmplY3Rfc2V0X3Byb3BlcnR5IChHX09CSkVDVCAocHJpdi0+c2Vzc2lvbiksICJydGNwLXJzLWJhbmR3aWR0aCIsCisgICAgICAgICAgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NERVM6CisgICAgICBydHBfc2Vzc2lvbl9zZXRfc2Rlc19zdHJ1Y3QgKHByaXYtPnNlc3Npb24sIGdfdmFsdWVfZ2V0X2JveGVkICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VTRV9QSVBFTElORV9DTE9DSzoKKyAgICAgIHByaXYtPnVzZV9waXBlbGluZV9jbG9jayA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX01JTl9JTlRFUlZBTDoKKyAgICAgIGdfb2JqZWN0X3NldF9wcm9wZXJ0eSAoR19PQkpFQ1QgKHByaXYtPnNlc3Npb24pLCAicnRjcC1taW4taW50ZXJ2YWwiLAorICAgICAgICAgIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9CQVRJT046CisgICAgICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChwcml2LT5zZXNzaW9uKSwgInByb2JhdGlvbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfRFJPUE9VVF9USU1FOgorICAgICAgZ19vYmplY3Rfc2V0X3Byb3BlcnR5IChHX09CSkVDVCAocHJpdi0+c2Vzc2lvbiksICJtYXgtZHJvcG91dC10aW1lIiwKKyAgICAgICAgICB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX01JU09SREVSX1RJTUU6CisgICAgICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChwcml2LT5zZXNzaW9uKSwgIm1heC1taXNvcmRlci10aW1lIiwKKyAgICAgICAgICB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRQX1BST0ZJTEU6CisgICAgICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChwcml2LT5zZXNzaW9uKSwgInJ0cC1wcm9maWxlIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05UUF9USU1FX1NPVVJDRToKKyAgICAgIHByaXYtPm50cF90aW1lX3NvdXJjZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX1NZTkNfU0VORF9USU1FOgorICAgICAgcHJpdi0+cnRjcF9zeW5jX3NlbmRfdGltZSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc2Vzc2lvbl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwU2Vzc2lvbiAqcnRwc2Vzc2lvbjsKKyAgR3N0UnRwU2Vzc2lvblByaXZhdGUgKnByaXY7CisKKyAgcnRwc2Vzc2lvbiA9IEdTVF9SVFBfU0VTU0lPTiAob2JqZWN0KTsKKyAgcHJpdiA9IHJ0cHNlc3Npb24tPnByaXY7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0JBTkRXSURUSDoKKyAgICAgIGdfb2JqZWN0X2dldF9wcm9wZXJ0eSAoR19PQkpFQ1QgKHByaXYtPnNlc3Npb24pLCAiYmFuZHdpZHRoIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUQ1BfRlJBQ1RJT046CisgICAgICBnX29iamVjdF9nZXRfcHJvcGVydHkgKEdfT0JKRUNUIChwcml2LT5zZXNzaW9uKSwgInJ0Y3AtZnJhY3Rpb24iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRDUF9SUl9CQU5EV0lEVEg6CisgICAgICBnX29iamVjdF9nZXRfcHJvcGVydHkgKEdfT0JKRUNUIChwcml2LT5zZXNzaW9uKSwgInJ0Y3AtcnItYmFuZHdpZHRoIiwKKyAgICAgICAgICB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRDUF9SU19CQU5EV0lEVEg6CisgICAgICBnX29iamVjdF9nZXRfcHJvcGVydHkgKEdfT0JKRUNUIChwcml2LT5zZXNzaW9uKSwgInJ0Y3AtcnMtYmFuZHdpZHRoIiwKKyAgICAgICAgICB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0RFUzoKKyAgICAgIGdfdmFsdWVfdGFrZV9ib3hlZCAodmFsdWUsIHJ0cF9zZXNzaW9uX2dldF9zZGVzX3N0cnVjdCAocHJpdi0+c2Vzc2lvbikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05VTV9TT1VSQ0VTOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0cF9zZXNzaW9uX2dldF9udW1fc291cmNlcyAocHJpdi0+c2Vzc2lvbikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05VTV9BQ1RJVkVfU09VUkNFUzoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLAorICAgICAgICAgIHJ0cF9zZXNzaW9uX2dldF9udW1fYWN0aXZlX3NvdXJjZXMgKHByaXYtPnNlc3Npb24pKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JTlRFUk5BTF9TRVNTSU9OOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgcHJpdi0+c2Vzc2lvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFX1BJUEVMSU5FX0NMT0NLOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHByaXYtPnVzZV9waXBlbGluZV9jbG9jayk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRDUF9NSU5fSU5URVJWQUw6CisgICAgICBnX29iamVjdF9nZXRfcHJvcGVydHkgKEdfT0JKRUNUIChwcml2LT5zZXNzaW9uKSwgInJ0Y3AtbWluLWludGVydmFsIiwKKyAgICAgICAgICB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUFJPQkFUSU9OOgorICAgICAgZ19vYmplY3RfZ2V0X3Byb3BlcnR5IChHX09CSkVDVCAocHJpdi0+c2Vzc2lvbiksICJwcm9iYXRpb24iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX0RST1BPVVRfVElNRToKKyAgICAgIGdfb2JqZWN0X2dldF9wcm9wZXJ0eSAoR19PQkpFQ1QgKHByaXYtPnNlc3Npb24pLCAibWF4LWRyb3BvdXQtdGltZSIsCisgICAgICAgICAgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9NSVNPUkRFUl9USU1FOgorICAgICAgZ19vYmplY3RfZ2V0X3Byb3BlcnR5IChHX09CSkVDVCAocHJpdi0+c2Vzc2lvbiksICJtYXgtbWlzb3JkZXItdGltZSIsCisgICAgICAgICAgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NUQVRTOgorICAgICAgZ192YWx1ZV90YWtlX2JveGVkICh2YWx1ZSwgZ3N0X3J0cF9zZXNzaW9uX2NyZWF0ZV9zdGF0cyAocnRwc2Vzc2lvbikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUUF9QUk9GSUxFOgorICAgICAgZ19vYmplY3RfZ2V0X3Byb3BlcnR5IChHX09CSkVDVCAocHJpdi0+c2Vzc2lvbiksICJydHAtcHJvZmlsZSIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9OVFBfVElNRV9TT1VSQ0U6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgcHJpdi0+bnRwX3RpbWVfc291cmNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX1NZTkNfU0VORF9USU1FOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHByaXYtPnJ0Y3Bfc3luY19zZW5kX3RpbWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RydWN0dXJlICoKK2dzdF9ydHBfc2Vzc2lvbl9jcmVhdGVfc3RhdHMgKEdzdFJ0cFNlc3Npb24gKiBydHBzZXNzaW9uKQoreworICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgZ19vYmplY3RfZ2V0IChydHBzZXNzaW9uLT5wcml2LT5zZXNzaW9uLCAic3RhdHMiLCAmcywgTlVMTCk7CisgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAicnR4LWNvdW50IiwgR19UWVBFX1VJTlQsIHJ0cHNlc3Npb24tPnByaXYtPnJ0eF9jb3VudCwKKyAgICAgIE5VTEwpOworCisgIHJldHVybiBzOworfQorCitzdGF0aWMgdm9pZAorZ2V0X2N1cnJlbnRfdGltZXMgKEdzdFJ0cFNlc3Npb24gKiBydHBzZXNzaW9uLCBHc3RDbG9ja1RpbWUgKiBydW5uaW5nX3RpbWUsCisgICAgZ3VpbnQ2NCAqIG50cG5zdGltZSkKK3sKKyAgZ3VpbnQ2NCBudHBucyA9IC0xOworICBHc3RDbG9jayAqY2xvY2s7CisgIEdzdENsb2NrVGltZSBiYXNlX3RpbWUsIHJ0LCBjbG9ja190aW1lOworCisgIEdTVF9PQkpFQ1RfTE9DSyAocnRwc2Vzc2lvbik7CisgIGlmICgoY2xvY2sgPSBHU1RfRUxFTUVOVF9DTE9DSyAocnRwc2Vzc2lvbikpKSB7CisgICAgYmFzZV90aW1lID0gR1NUX0VMRU1FTlRfQ0FTVCAocnRwc2Vzc2lvbiktPmJhc2VfdGltZTsKKyAgICBnc3Rfb2JqZWN0X3JlZiAoY2xvY2spOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHBzZXNzaW9uKTsKKworICAgIC8qIGdldCBjdXJyZW50IGNsb2NrIHRpbWUgYW5kIGNvbnZlcnQgdG8gcnVubmluZyB0aW1lICovCisgICAgY2xvY2tfdGltZSA9IGdzdF9jbG9ja19nZXRfdGltZSAoY2xvY2spOworICAgIHJ0ID0gY2xvY2tfdGltZSAtIGJhc2VfdGltZTsKKworICAgIGlmIChydHBzZXNzaW9uLT5wcml2LT51c2VfcGlwZWxpbmVfY2xvY2spIHsKKyAgICAgIG50cG5zID0gcnQ7CisgICAgICAvKiBhZGQgY29uc3RhbnQgdG8gY29udmVydCBmcm9tIDE5NzAgYmFzZWQgdGltZSB0byAxOTAwIGJhc2VkIHRpbWUgKi8KKyAgICAgIG50cG5zICs9ICgyMjA4OTg4ODAwTEwgKiBHU1RfU0VDT05EKTsKKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoIChydHBzZXNzaW9uLT5wcml2LT5udHBfdGltZV9zb3VyY2UpIHsKKyAgICAgICAgY2FzZSBHU1RfUlRQX05UUF9USU1FX1NPVVJDRV9OVFA6CisgICAgICAgIGNhc2UgR1NUX1JUUF9OVFBfVElNRV9TT1VSQ0VfVU5JWDp7CisgICAgICAgICAgR1RpbWVWYWwgY3VycmVudDsKKworICAgICAgICAgIC8qIGdldCBjdXJyZW50IE5UUCB0aW1lICovCisgICAgICAgICAgZ19nZXRfY3VycmVudF90aW1lICgmY3VycmVudCk7CisgICAgICAgICAgbnRwbnMgPSBHU1RfVElNRVZBTF9UT19USU1FIChjdXJyZW50KTsKKworICAgICAgICAgIC8qIGFkZCBjb25zdGFudCB0byBjb252ZXJ0IGZyb20gMTk3MCBiYXNlZCB0aW1lIHRvIDE5MDAgYmFzZWQgdGltZSAqLworICAgICAgICAgIGlmIChydHBzZXNzaW9uLT5wcml2LT5udHBfdGltZV9zb3VyY2UgPT0gR1NUX1JUUF9OVFBfVElNRV9TT1VSQ0VfTlRQKQorICAgICAgICAgICAgbnRwbnMgKz0gKDIyMDg5ODg4MDBMTCAqIEdTVF9TRUNPTkQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgR1NUX1JUUF9OVFBfVElNRV9TT1VSQ0VfUlVOTklOR19USU1FOgorICAgICAgICAgIG50cG5zID0gcnQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX1JUUF9OVFBfVElNRV9TT1VSQ0VfQ0xPQ0tfVElNRToKKyAgICAgICAgICBudHBucyA9IGNsb2NrX3RpbWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgbnRwbnMgPSAtMTsKKyAgICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChjbG9jayk7CisgIH0gZWxzZSB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0cHNlc3Npb24pOworICAgIHJ0ID0gLTE7CisgICAgbnRwbnMgPSAtMTsKKyAgfQorICBpZiAocnVubmluZ190aW1lKQorICAgICpydW5uaW5nX3RpbWUgPSBydDsKKyAgaWYgKG50cG5zdGltZSkKKyAgICAqbnRwbnN0aW1lID0gbnRwbnM7Cit9CisKKy8qIG11c3QgYmUgY2FsbGVkIHdpdGggR1NUX1JUUF9TRVNTSU9OX0xPQ0sgKi8KK3N0YXRpYyB2b2lkCitzaWduYWxfd2FpdGluZ19ydGNwX3RocmVhZF91bmxvY2tlZCAoR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24pCit7CisgIGlmIChydHBzZXNzaW9uLT5wcml2LT53YWl0X3NlbmQpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocnRwc2Vzc2lvbiwgInNpZ25hbCBSVENQIHRocmVhZCIpOworICAgIHJ0cHNlc3Npb24tPnByaXYtPndhaXRfc2VuZCA9IEZBTFNFOworICAgIEdTVF9SVFBfU0VTU0lPTl9TSUdOQUwgKHJ0cHNlc3Npb24pOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitydGNwX3RocmVhZCAoR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24pCit7CisgIEdzdENsb2NrSUQgaWQ7CisgIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWU7CisgIEdzdENsb2NrVGltZSBuZXh0X3RpbWVvdXQ7CisgIGd1aW50NjQgbnRwbnN0aW1lOworICBHc3RDbG9ja1RpbWUgcnVubmluZ190aW1lOworICBSVFBTZXNzaW9uICpzZXNzaW9uOworICBHc3RDbG9jayAqc3lzY2xvY2s7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgImVudGVyaW5nIFJUQ1AgdGhyZWFkIik7CisKKyAgR1NUX1JUUF9TRVNTSU9OX0xPQ0sgKHJ0cHNlc3Npb24pOworCisgIHdoaWxlIChydHBzZXNzaW9uLT5wcml2LT53YWl0X3NlbmQpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocnRwc2Vzc2lvbiwgIndhaXRpbmcgZm9yIGdldHRpbmcgc3RhcnRlZCIpOworICAgIEdTVF9SVFBfU0VTU0lPTl9XQUlUIChydHBzZXNzaW9uKTsKKyAgICBHU1RfTE9HX09CSkVDVCAocnRwc2Vzc2lvbiwgInNpZ25hbGVkLi4uIik7CisgIH0KKworICBzeXNjbG9jayA9IHJ0cHNlc3Npb24tPnByaXYtPnN5c2Nsb2NrOworICBjdXJyZW50X3RpbWUgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKHN5c2Nsb2NrKTsKKworICBzZXNzaW9uID0gcnRwc2Vzc2lvbi0+cHJpdi0+c2Vzc2lvbjsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAic3RhcnRpbmcgYXQgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoY3VycmVudF90aW1lKSk7CisgIHNlc3Npb24tPnN0YXJ0X3RpbWUgPSBjdXJyZW50X3RpbWU7CisKKyAgd2hpbGUgKCFydHBzZXNzaW9uLT5wcml2LT5zdG9wX3RocmVhZCkgeworICAgIEdzdENsb2NrUmV0dXJuIHJlczsKKworICAgIC8qIGdldCBpbml0aWFsIGVzdGltYXRlICovCisgICAgbmV4dF90aW1lb3V0ID0gcnRwX3Nlc3Npb25fbmV4dF90aW1lb3V0IChzZXNzaW9uLCBjdXJyZW50X3RpbWUpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgIm5leHQgY2hlY2sgdGltZSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKG5leHRfdGltZW91dCkpOworCisgICAgLyogbGVhdmUgaWYgbm8gbW9yZSB0aW1lb3V0cywgdGhlIHNlc3Npb24gZW5kZWQgKi8KKyAgICBpZiAobmV4dF90aW1lb3V0ID09IEdTVF9DTE9DS19USU1FX05PTkUpCisgICAgICBicmVhazsKKworICAgIGlkID0gcnRwc2Vzc2lvbi0+cHJpdi0+aWQgPQorICAgICAgICBnc3RfY2xvY2tfbmV3X3NpbmdsZV9zaG90X2lkIChzeXNjbG9jaywgbmV4dF90aW1lb3V0KTsKKyAgICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICAgIHJlcyA9IGdzdF9jbG9ja19pZF93YWl0IChpZCwgTlVMTCk7CisKKyAgICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgICAgZ3N0X2Nsb2NrX2lkX3VucmVmIChpZCk7CisgICAgcnRwc2Vzc2lvbi0+cHJpdi0+aWQgPSBOVUxMOworCisgICAgaWYgKHJ0cHNlc3Npb24tPnByaXYtPnN0b3BfdGhyZWFkKQorICAgICAgYnJlYWs7CisKKyAgICAvKiB1cGRhdGUgY3VycmVudCB0aW1lICovCisgICAgY3VycmVudF90aW1lID0gZ3N0X2Nsb2NrX2dldF90aW1lIChzeXNjbG9jayk7CisKKyAgICAvKiBnZXQgY3VycmVudCBOVFAgdGltZSAqLworICAgIGdldF9jdXJyZW50X3RpbWVzIChydHBzZXNzaW9uLCAmcnVubmluZ190aW1lLCAmbnRwbnN0aW1lKTsKKworICAgIC8qIHdlIGdldCB1bmxvY2tlZCBiZWNhdXNlIHdlIG5lZWQgdG8gcGVyZm9ybSByZWNvbnNpZGVyYXRpb24sIGRvbid0IHBlcmZvcm0KKyAgICAgKiB0aGUgdGltZW91dCBidXQgZ2V0IGEgbmV3IHJlcG9ydGluZyBlc3RpbWF0ZS4gKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAidW5sb2NrZWQgJWQsIGN1cnJlbnQgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICByZXMsIEdTVF9USU1FX0FSR1MgKGN1cnJlbnRfdGltZSkpOworCisgICAgLyogcGVyZm9ybSBhY3Rpb25zLCB3ZSBpZ25vcmUgcmVzdWx0LiBSZWxlYXNlIGxvY2sgYmVjYXVzZSBpdCBtaWdodCBwdXNoLiAqLworICAgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHJ0cHNlc3Npb24pOworICAgIHJ0cF9zZXNzaW9uX29uX3RpbWVvdXQgKHNlc3Npb24sIGN1cnJlbnRfdGltZSwgbnRwbnN0aW1lLCBydW5uaW5nX3RpbWUpOworICAgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChydHBzZXNzaW9uKTsKKyAgfQorICAvKiBtYXJrIHRoZSB0aHJlYWQgYXMgc3RvcHBlZCBub3cgKi8KKyAgcnRwc2Vzc2lvbi0+cHJpdi0+dGhyZWFkX3N0b3BwZWQgPSBUUlVFOworICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAibGVhdmluZyBSVENQIHRocmVhZCIpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3N0YXJ0X3J0Y3BfdGhyZWFkIChHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbikKK3sKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisgIGdib29sZWFuIHJlczsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAic3RhcnRpbmcgUlRDUCB0aHJlYWQiKTsKKworICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgIHJ0cHNlc3Npb24tPnByaXYtPnN0b3BfdGhyZWFkID0gRkFMU0U7CisgIGlmIChydHBzZXNzaW9uLT5wcml2LT50aHJlYWRfc3RvcHBlZCkgeworICAgIC8qIGlmIHRoZSB0aHJlYWQgc3RvcHBlZCwgYW5kIHdlIHN0aWxsIGhhdmUgYSBoYW5kbGUgdG8gdGhlIHRocmVhZCwgam9pbiBpdAorICAgICAqIG5vdy4gV2UgY2FuIHNhZmVseSBqb2luIHdpdGggdGhlIGxvY2sgaGVsZCwgdGhlIHRocmVhZCB3aWxsIG5vdCB0YWtlIGl0CisgICAgICogYW55bW9yZS4gKi8KKyAgICBpZiAocnRwc2Vzc2lvbi0+cHJpdi0+dGhyZWFkKQorICAgICAgZ190aHJlYWRfam9pbiAocnRwc2Vzc2lvbi0+cHJpdi0+dGhyZWFkKTsKKyAgICAvKiBvbmx5IGNyZWF0ZSBhIG5ldyB0aHJlYWQgaWYgdGhlIG9sZCBvbmUgd2FzIHN0b3BwZWQuIE90aGVyd2lzZSB3ZSBjYW4KKyAgICAgKiBqdXN0IHJldXNlIHRoZSBjdXJyZW50bHkgcnVubmluZyBvbmUuICovCisgICAgcnRwc2Vzc2lvbi0+cHJpdi0+dGhyZWFkID0gZ190aHJlYWRfdHJ5X25ldyAoInJ0cHNlc3Npb24tcnRjcC10aHJlYWQiLAorICAgICAgICAoR1RocmVhZEZ1bmMpIHJ0Y3BfdGhyZWFkLCBydHBzZXNzaW9uLCAmZXJyb3IpOworICAgIHJ0cHNlc3Npb24tPnByaXYtPnRocmVhZF9zdG9wcGVkID0gRkFMU0U7CisgIH0KKyAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisKKyAgaWYgKGVycm9yICE9IE5VTEwpIHsKKyAgICByZXMgPSBGQUxTRTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAiZmFpbGVkIHRvIHN0YXJ0IHRocmVhZCwgJXMiLCBlcnJvci0+bWVzc2FnZSk7CisgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgIH0gZWxzZSB7CisgICAgcmVzID0gVFJVRTsKKyAgfQorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZAorc3RvcF9ydGNwX3RocmVhZCAoR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24pCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJzdG9wcGluZyBSVENQIHRocmVhZCIpOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChydHBzZXNzaW9uKTsKKyAgcnRwc2Vzc2lvbi0+cHJpdi0+c3RvcF90aHJlYWQgPSBUUlVFOworICBzaWduYWxfd2FpdGluZ19ydGNwX3RocmVhZF91bmxvY2tlZCAocnRwc2Vzc2lvbik7CisgIGlmIChydHBzZXNzaW9uLT5wcml2LT5pZCkKKyAgICBnc3RfY2xvY2tfaWRfdW5zY2hlZHVsZSAocnRwc2Vzc2lvbi0+cHJpdi0+aWQpOworICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKK30KKworc3RhdGljIHZvaWQKK2pvaW5fcnRjcF90aHJlYWQgKEdzdFJ0cFNlc3Npb24gKiBydHBzZXNzaW9uKQoreworICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgIC8qIGRvbid0IHRyeSB0byBqb2luIHdoZW4gd2UgaGF2ZSBubyB0aHJlYWQgKi8KKyAgaWYgKHJ0cHNlc3Npb24tPnByaXYtPnRocmVhZCAhPSBOVUxMKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgImpvaW5pbmcgUlRDUCB0aHJlYWQiKTsKKyAgICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICAgIGdfdGhyZWFkX2pvaW4gKHJ0cHNlc3Npb24tPnByaXYtPnRocmVhZCk7CisKKyAgICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgICAgLyogYWZ0ZXIgdGhlIGpvaW4sIHRha2UgdGhlIGxvY2sgYW5kIGNsZWFyIHRoZSB0aHJlYWQgc3RydWN0dXJlLiBUaGUgY2FsbGVyCisgICAgICogaXMgc3VwcG9zZWQgdG8gbm90IGNvbmN1cnJlbnRseSBjYWxsIHN0YXJ0IGFuZCBqb2luLiAqLworICAgIHJ0cHNlc3Npb24tPnByaXYtPnRocmVhZCA9IE5VTEw7CisgIH0KKyAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9zZXNzaW9uX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJlczsKKyAgR3N0UnRwU2Vzc2lvbiAqcnRwc2Vzc2lvbjsKKworICBydHBzZXNzaW9uID0gR1NUX1JUUF9TRVNTSU9OIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgICAgICBpZiAocnRwc2Vzc2lvbi0+c2VuZF9ydHBfc3JjKQorICAgICAgICBydHBzZXNzaW9uLT5wcml2LT53YWl0X3NlbmQgPSBUUlVFOworICAgICAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1BMQVlJTkc6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUExBWUlOR19UT19QQVVTRUQ6CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIC8qIG5vIG5lZWQgdG8gam9pbiB5ZXQsIHdlIG1pZ2h0IHdhbnQgdG8gY29udGludWUgbGF0ZXIuIEFsc28sIHRoZQorICAgICAgICogZGF0YWZsb3cgY291bGQgYmxvY2sgZG93bnN0cmVhbSBzbyB0aGF0IGEgam9pbiBjb3VsZCBqdXN0IGJsb2NrCisgICAgICAgKiBmb3JldmVyLiAqLworICAgICAgc3RvcF9ydGNwX3RocmVhZCAocnRwc2Vzc2lvbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXMgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1BMQVlJTkc6CisgICAgICBpZiAoIXN0YXJ0X3J0Y3BfdGhyZWFkIChydHBzZXNzaW9uKSkKKyAgICAgICAgZ290byBmYWlsZWRfdGhyZWFkOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIC8qIGRvd25zdHJlYW0gaXMgbm93IHJlbGVhc2luZyB0aGUgZGF0YWZsb3cgYW5kIHdlIGNhbiBqb2luLiAqLworICAgICAgam9pbl9ydGNwX3RocmVhZCAocnRwc2Vzc2lvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworZmFpbGVkX3RocmVhZDoKKyAgeworICAgIHJldHVybiBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCityZXR1cm5fdHJ1ZSAoZ3BvaW50ZXIga2V5LCBncG9pbnRlciB2YWx1ZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc2Vzc2lvbl9jbGVhcl9wdF9tYXAgKEdzdFJ0cFNlc3Npb24gKiBydHBzZXNzaW9uKQoreworICBnX2hhc2hfdGFibGVfZm9yZWFjaF9yZW1vdmUgKHJ0cHNlc3Npb24tPnByaXYtPnB0bWFwLCByZXR1cm5fdHJ1ZSwgTlVMTCk7Cit9CisKKy8qIGNhbGxlZCB3aGVuIHRoZSBzZXNzaW9uIG1hbmFnZXIgaGFzIGFuIFJUUCBwYWNrZXQgb3IgYSBsaXN0IG9mIHBhY2tldHMKKyAqIHJlYWR5IGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX3Nlc3Npb25fcHJvY2Vzc19ydHAgKFJUUFNlc3Npb24gKiBzZXNzLCBSVFBTb3VyY2UgKiBzcmMsCisgICAgR3N0QnVmZmVyICogYnVmZmVyLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzdWx0OworICBHc3RSdHBTZXNzaW9uICpydHBzZXNzaW9uOworICBHc3RQYWQgKnJ0cF9zcmM7CisKKyAgcnRwc2Vzc2lvbiA9IEdTVF9SVFBfU0VTU0lPTiAodXNlcl9kYXRhKTsKKworICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgIGlmICgocnRwX3NyYyA9IHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NyYykpCisgICAgZ3N0X29iamVjdF9yZWYgKHJ0cF9zcmMpOworICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICBpZiAocnRwX3NyYykgeworICAgIEdTVF9MT0dfT0JKRUNUIChydHBzZXNzaW9uLCAicHVzaGluZyByZWNlaXZlZCBSVFAgcGFja2V0Iik7CisgICAgcmVzdWx0ID0gZ3N0X3BhZF9wdXNoIChydHBfc3JjLCBidWZmZXIpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cF9zcmMpOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJkcm9wcGluZyByZWNlaXZlZCBSVFAgcGFja2V0Iik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXN1bHQgPSBHU1RfRkxPV19PSzsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKiBjYWxsZWQgd2hlbiB0aGUgc2Vzc2lvbiBtYW5hZ2VyIGhhcyBhbiBSVFAgcGFja2V0IHJlYWR5IGZvciBmdXJ0aGVyCisgKiBzZW5kaW5nICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9zZXNzaW9uX3NlbmRfcnRwIChSVFBTZXNzaW9uICogc2VzcywgUlRQU291cmNlICogc3JjLAorICAgIGdwb2ludGVyIGRhdGEsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXN1bHQ7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb247CisgIEdzdFBhZCAqcnRwX3NyYzsKKworICBydHBzZXNzaW9uID0gR1NUX1JUUF9TRVNTSU9OICh1c2VyX2RhdGEpOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChydHBzZXNzaW9uKTsKKyAgaWYgKChydHBfc3JjID0gcnRwc2Vzc2lvbi0+c2VuZF9ydHBfc3JjKSkKKyAgICBnc3Rfb2JqZWN0X3JlZiAocnRwX3NyYyk7CisgIHNpZ25hbF93YWl0aW5nX3J0Y3BfdGhyZWFkX3VubG9ja2VkIChydHBzZXNzaW9uKTsKKyAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisKKyAgaWYgKHJ0cF9zcmMpIHsKKyAgICBpZiAoR1NUX0lTX0JVRkZFUiAoZGF0YSkpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBzZXNzaW9uLCAic2VuZGluZyBSVFAgcGFja2V0Iik7CisgICAgICByZXN1bHQgPSBnc3RfcGFkX3B1c2ggKHJ0cF9zcmMsIEdTVF9CVUZGRVJfQ0FTVCAoZGF0YSkpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwc2Vzc2lvbiwgInNlbmRpbmcgUlRQIGxpc3QiKTsKKyAgICAgIHJlc3VsdCA9IGdzdF9wYWRfcHVzaF9saXN0IChydHBfc3JjLCBHU1RfQlVGRkVSX0xJU1RfQ0FTVCAoZGF0YSkpOworICAgIH0KKyAgICBnc3Rfb2JqZWN0X3VucmVmIChydHBfc3JjKTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfbWluaV9vYmplY3RfdW5yZWYgKEdTVF9NSU5JX09CSkVDVF9DQVNUIChkYXRhKSk7CisgICAgcmVzdWx0ID0gR1NUX0ZMT1dfT0s7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2RvX3J0Y3BfZXZlbnRzIChHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbiwgR3N0UGFkICogc3JjcGFkKQoreworICBHc3RDYXBzICpjYXBzOworICBHc3RTZWdtZW50IHNlZzsKKyAgR3N0RXZlbnQgKmV2ZW50OworICBnY2hhciAqc3RyZWFtX2lkOworICBnYm9vbGVhbiBoYXZlX2dyb3VwX2lkOworICBndWludCBncm91cF9pZDsKKworICBzdHJlYW1faWQgPQorICAgICAgZ19zdHJkdXBfcHJpbnRmICgiJTA4eCUwOHglMDh4JTA4eCIsIGdfcmFuZG9tX2ludCAoKSwgZ19yYW5kb21faW50ICgpLAorICAgICAgZ19yYW5kb21faW50ICgpLCBnX3JhbmRvbV9pbnQgKCkpOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChydHBzZXNzaW9uKTsKKyAgaWYgKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NpbmspIHsKKyAgICBldmVudCA9CisgICAgICAgIGdzdF9wYWRfZ2V0X3N0aWNreV9ldmVudCAocnRwc2Vzc2lvbi0+cmVjdl9ydHBfc2luaywKKyAgICAgICAgR1NUX0VWRU5UX1NUUkVBTV9TVEFSVCwgMCk7CisgICAgaWYgKGV2ZW50KSB7CisgICAgICBpZiAoZ3N0X2V2ZW50X3BhcnNlX2dyb3VwX2lkIChldmVudCwgJmdyb3VwX2lkKSkKKyAgICAgICAgaGF2ZV9ncm91cF9pZCA9IFRSVUU7CisgICAgICBlbHNlCisgICAgICAgIGhhdmVfZ3JvdXBfaWQgPSBGQUxTRTsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgIH0gZWxzZSB7CisgICAgICBoYXZlX2dyb3VwX2lkID0gVFJVRTsKKyAgICAgIGdyb3VwX2lkID0gZ3N0X3V0aWxfZ3JvdXBfaWRfbmV4dCAoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaGF2ZV9ncm91cF9pZCA9IFRSVUU7CisgICAgZ3JvdXBfaWQgPSBnc3RfdXRpbF9ncm91cF9pZF9uZXh0ICgpOworICB9CisgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHJ0cHNlc3Npb24pOworCisgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKHN0cmVhbV9pZCk7CisgIGlmIChoYXZlX2dyb3VwX2lkKQorICAgIGdzdF9ldmVudF9zZXRfZ3JvdXBfaWQgKGV2ZW50LCBncm91cF9pZCk7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3JjcGFkLCBldmVudCk7CisgIGdfZnJlZSAoc3RyZWFtX2lkKTsKKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtcnRjcCIpOworICBnc3RfcGFkX3NldF9jYXBzIChzcmNwYWQsIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWcpOworICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNyY3BhZCwgZXZlbnQpOworfQorCisvKiBjYWxsZWQgd2hlbiB0aGUgc2Vzc2lvbiBtYW5hZ2VyIGhhcyBhbiBSVENQIHBhY2tldCByZWFkeSBmb3IgZnVydGhlcgorICogc2VuZGluZy4gVGhlIGVvcyBmbGFnIGlzIHNldCB3aGVuIGFuIEVPUyBldmVudCBzaG91bGQgYmUgc2VudCBkb3duc3RyZWFtIGFzCisgKiB3ZWxsLiAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfc2Vzc2lvbl9zZW5kX3J0Y3AgKFJUUFNlc3Npb24gKiBzZXNzLCBSVFBTb3VyY2UgKiBzcmMsCisgICAgR3N0QnVmZmVyICogYnVmZmVyLCBnYm9vbGVhbiBlb3MsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXN1bHQ7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb247CisgIEdzdFBhZCAqcnRjcF9zcmM7CisKKyAgcnRwc2Vzc2lvbiA9IEdTVF9SVFBfU0VTU0lPTiAodXNlcl9kYXRhKTsKKworICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgIGlmIChydHBzZXNzaW9uLT5wcml2LT5zdG9wX3RocmVhZCkKKyAgICBnb3RvIHN0b3BwaW5nOworCisgIGlmICgocnRjcF9zcmMgPSBydHBzZXNzaW9uLT5zZW5kX3J0Y3Bfc3JjKSkgeworICAgIGdzdF9vYmplY3RfcmVmIChydGNwX3NyYyk7CisgICAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisKKyAgICAvKiBzZXQgcnRjcCBjYXBzIG9uIG91dHB1dCBwYWQgKi8KKyAgICBpZiAoIWdzdF9wYWRfaGFzX2N1cnJlbnRfY2FwcyAocnRjcF9zcmMpKQorICAgICAgZG9fcnRjcF9ldmVudHMgKHJ0cHNlc3Npb24sIHJ0Y3Bfc3JjKTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChydHBzZXNzaW9uLCAic2VuZGluZyBSVENQIik7CisgICAgcmVzdWx0ID0gZ3N0X3BhZF9wdXNoIChydGNwX3NyYywgYnVmZmVyKTsKKworICAgIC8qIHdlIGhhdmUgdG8gc2VuZCBFT1MgYWZ0ZXIgdGhpcyBwYWNrZXQgKi8KKyAgICBpZiAoZW9zKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwc2Vzc2lvbiwgInNlbmRpbmcgRU9TIik7CisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHJ0Y3Bfc3JjLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisgICAgfQorICAgIGdzdF9vYmplY3RfdW5yZWYgKHJ0Y3Bfc3JjKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJub3Qgc2VuZGluZyBSVENQLCBubyBvdXRwdXQgcGFkIik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXN1bHQgPSBHU1RfRkxPV19PSzsKKyAgfQorICByZXR1cm4gcmVzdWx0OworCisgIC8qIEVSUk9SUyAqLworc3RvcHBpbmc6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAid2UgYXJlIHN0b3BwaW5nIik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK30KKworLyogY2FsbGVkIHdoZW4gdGhlIHNlc3Npb24gbWFuYWdlciBoYXMgYW4gU1IgUlRDUCBwYWNrZXQgcmVhZHkgZm9yIGhhbmRsaW5nCisgKiBpbnRlciBzdHJlYW0gc3luY2hyb25pc2F0aW9uICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9zZXNzaW9uX3N5bmNfcnRjcCAoUlRQU2Vzc2lvbiAqIHNlc3MsCisgICAgR3N0QnVmZmVyICogYnVmZmVyLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzdWx0OworICBHc3RSdHBTZXNzaW9uICpydHBzZXNzaW9uOworICBHc3RQYWQgKnN5bmNfc3JjOworCisgIHJ0cHNlc3Npb24gPSBHU1RfUlRQX1NFU1NJT04gKHVzZXJfZGF0YSk7CisKKyAgR1NUX1JUUF9TRVNTSU9OX0xPQ0sgKHJ0cHNlc3Npb24pOworICBpZiAocnRwc2Vzc2lvbi0+cHJpdi0+c3RvcF90aHJlYWQpCisgICAgZ290byBzdG9wcGluZzsKKworICBpZiAoKHN5bmNfc3JjID0gcnRwc2Vzc2lvbi0+c3luY19zcmMpKSB7CisgICAgZ3N0X29iamVjdF9yZWYgKHN5bmNfc3JjKTsKKyAgICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICAgIC8qIHNldCBydGNwIGNhcHMgb24gb3V0cHV0IHBhZCwgdGhpcyBoYXBwZW5zCisgICAgICogd2hlbiB3ZSByZWNlaXZlIFJUQ1AgbXV4ZWQgd2l0aCBSVFAgYWNjb3JkaW5nCisgICAgICogdG8gUkZDNTc2MS4gT3RoZXJ3aXNlIHdlIHdvdWxkIGhhdmUgZm9yd2FyZGVkCisgICAgICogdGhlIGV2ZW50cyBmcm9tIHRoZSByZWN2X3J0Y3Bfc2luayBwYWQgYWxyZWFkeQorICAgICAqLworICAgIGlmICghZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChzeW5jX3NyYykpCisgICAgICBkb19ydGNwX2V2ZW50cyAocnRwc2Vzc2lvbiwgc3luY19zcmMpOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJzZW5kaW5nIFN5bmMgUlRDUCIpOworICAgIHJlc3VsdCA9IGdzdF9wYWRfcHVzaCAoc3luY19zcmMsIGJ1ZmZlcik7CisgICAgZ3N0X29iamVjdF91bnJlZiAoc3luY19zcmMpOworICB9IGVsc2UgeworICAgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHJ0cHNlc3Npb24pOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgIm5vdCBzZW5kaW5nIFN5bmMgUlRDUCwgbm8gb3V0cHV0IHBhZCIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgcmVzdWx0ID0gR1NUX0ZMT1dfT0s7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKKworICAvKiBFUlJPUlMgKi8KK3N0b3BwaW5nOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgIndlIGFyZSBzdG9wcGluZyIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3Nlc3Npb25fY2FjaGVfY2FwcyAoR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24sIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RSdHBTZXNzaW9uUHJpdmF0ZSAqcHJpdjsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzOworICBnaW50IHBheWxvYWQ7CisKKyAgcHJpdiA9IHJ0cHNlc3Npb24tPnByaXY7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgInBhcnNpbmcgY2FwcyIpOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJwYXlsb2FkIiwgJnBheWxvYWQpKQorICAgIHJldHVybjsKKworICBpZiAoZ19oYXNoX3RhYmxlX2xvb2t1cCAocHJpdi0+cHRtYXAsIEdJTlRfVE9fUE9JTlRFUiAocGF5bG9hZCkpKQorICAgIHJldHVybjsKKworICBnX2hhc2hfdGFibGVfaW5zZXJ0IChwcml2LT5wdG1hcCwgR0lOVF9UT19QT0lOVEVSIChwYXlsb2FkKSwKKyAgICAgIGdzdF9jYXBzX3JlZiAoY2FwcykpOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfcnRwX3Nlc3Npb25fZ2V0X2NhcHNfZm9yX3B0IChHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbiwgZ3VpbnQgcGF5bG9hZCkKK3sKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisgIEdWYWx1ZSBhcmdzWzJdID0geyB7MH0sIHswfSB9OworICBHVmFsdWUgcmV0ID0geyAwIH07CisKKyAgR1NUX1JUUF9TRVNTSU9OX0xPQ0sgKHJ0cHNlc3Npb24pOworICBjYXBzID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAocnRwc2Vzc2lvbi0+cHJpdi0+cHRtYXAsCisgICAgICBHSU5UX1RPX1BPSU5URVIgKHBheWxvYWQpKTsKKyAgaWYgKGNhcHMpIHsKKyAgICBnc3RfY2Fwc19yZWYgKGNhcHMpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIC8qIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGUsIHRyeSB0byBnZXQgaXQgd2l0aCBhIHNpZ25hbCAqLworICBnX3ZhbHVlX2luaXQgKCZhcmdzWzBdLCBHU1RfVFlQRV9FTEVNRU5UKTsKKyAgZ192YWx1ZV9zZXRfb2JqZWN0ICgmYXJnc1swXSwgcnRwc2Vzc2lvbik7CisgIGdfdmFsdWVfaW5pdCAoJmFyZ3NbMV0sIEdfVFlQRV9VSU5UKTsKKyAgZ192YWx1ZV9zZXRfdWludCAoJmFyZ3NbMV0sIHBheWxvYWQpOworCisgIGdfdmFsdWVfaW5pdCAoJnJldCwgR1NUX1RZUEVfQ0FQUyk7CisgIGdfdmFsdWVfc2V0X2JveGVkICgmcmV0LCBOVUxMKTsKKworICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICBnX3NpZ25hbF9lbWl0diAoYXJncywgZ3N0X3J0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX1JFUVVFU1RfUFRfTUFQXSwgMCwKKyAgICAgICZyZXQpOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChydHBzZXNzaW9uKTsKKworICBnX3ZhbHVlX3Vuc2V0ICgmYXJnc1swXSk7CisgIGdfdmFsdWVfdW5zZXQgKCZhcmdzWzFdKTsKKyAgY2FwcyA9IChHc3RDYXBzICopIGdfdmFsdWVfZHVwX2JveGVkICgmcmV0KTsKKyAgZ192YWx1ZV91bnNldCAoJnJldCk7CisgIGlmICghY2FwcykKKyAgICBnb3RvIG5vX2NhcHM7CisKKyAgZ3N0X3J0cF9zZXNzaW9uX2NhY2hlX2NhcHMgKHJ0cHNlc3Npb24sIGNhcHMpOworCitkb25lOgorICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICByZXR1cm4gY2FwczsKKworbm9fY2FwczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJjb3VsZCBub3QgZ2V0IGNhcHMiKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworLyogY2FsbGVkIHdoZW4gdGhlIHNlc3Npb24gbWFuYWdlciBuZWVkcyB0aGUgY2xvY2sgcmF0ZSAqLworc3RhdGljIGdpbnQKK2dzdF9ydHBfc2Vzc2lvbl9jbG9ja19yYXRlIChSVFBTZXNzaW9uICogc2VzcywgZ3VpbnQ4IHBheWxvYWQsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBnaW50IHJlc3VsdCA9IC0xOworICBHc3RSdHBTZXNzaW9uICpydHBzZXNzaW9uOworICBHc3RDYXBzICpjYXBzOworICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgcnRwc2Vzc2lvbiA9IEdTVF9SVFBfU0VTU0lPTl9DQVNUICh1c2VyX2RhdGEpOworCisgIGNhcHMgPSBnc3RfcnRwX3Nlc3Npb25fZ2V0X2NhcHNfZm9yX3B0IChydHBzZXNzaW9uLCBwYXlsb2FkKTsKKworICBpZiAoIWNhcHMpCisgICAgZ290byBkb25lOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJjbG9jay1yYXRlIiwgJnJlc3VsdCkpCisgICAgZ290byBub19jbG9ja19yYXRlOworCisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAicGFyc2VkIGNsb2NrLXJhdGUgJWQiLCByZXN1bHQpOworCitkb25lOgorCisgIHJldHVybiByZXN1bHQ7CisKKyAgLyogRVJST1JTICovCitub19jbG9ja19yYXRlOgorICB7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJObyBjbG9jay1yYXRlIGluIGNhcHMhIik7CisgICAgZ290byBkb25lOworICB9Cit9CisKKy8qIGNhbGxlZCB3aGVuIHRoZSBzZXNzaW9uIG1hbmFnZXIgYXNrcyB1cyB0byByZWNvbnNpZGVyIHRoZSB0aW1lb3V0ICovCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zZXNzaW9uX3JlY29uc2lkZXIgKFJUUFNlc3Npb24gKiBzZXNzLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb247CisKKyAgcnRwc2Vzc2lvbiA9IEdTVF9SVFBfU0VTU0lPTl9DQVNUICh1c2VyX2RhdGEpOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChydHBzZXNzaW9uKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgInVubG9jayB0aW1lciBmb3IgcmVjb25zaWRlcmF0aW9uIik7CisgIGlmIChydHBzZXNzaW9uLT5wcml2LT5pZCkKKyAgICBnc3RfY2xvY2tfaWRfdW5zY2hlZHVsZSAocnRwc2Vzc2lvbi0+cHJpdi0+aWQpOworICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3Nlc3Npb25fZXZlbnRfcmVjdl9ydHBfc2luayAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UnRwU2Vzc2lvbiAqcnRwc2Vzc2lvbjsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgcnRwc2Vzc2lvbiA9IEdTVF9SVFBfU0VTU0lPTiAocGFyZW50KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAicmVjZWl2ZWQgZXZlbnQgJXMiLAorICAgICAgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgIC8qIHByb2Nlc3MgKi8KKyAgICAgIGdzdF9ldmVudF9wYXJzZV9jYXBzIChldmVudCwgJmNhcHMpOworICAgICAgZ3N0X3J0cF9zZXNzaW9uX3Npbmtfc2V0Y2FwcyAocGFkLCBydHBzZXNzaW9uLCBjYXBzKTsKKyAgICAgIHJldCA9IGdzdF9wYWRfcHVzaF9ldmVudCAocnRwc2Vzc2lvbi0+cmVjdl9ydHBfc3JjLCBldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9zZWdtZW50X2luaXQgKCZydHBzZXNzaW9uLT5yZWN2X3J0cF9zZWcsIEdTVF9GT1JNQVRfVU5ERUZJTkVEKTsKKyAgICAgIHJldCA9IGdzdF9wYWRfcHVzaF9ldmVudCAocnRwc2Vzc2lvbi0+cmVjdl9ydHBfc3JjLCBldmVudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgIHsKKyAgICAgIEdzdFNlZ21lbnQgKnNlZ21lbnQsIGluX3NlZ21lbnQ7CisKKyAgICAgIHNlZ21lbnQgPSAmcnRwc2Vzc2lvbi0+cmVjdl9ydHBfc2VnOworCisgICAgICAvKiB0aGUgbmV3c2VnbWVudCBldmVudCBpcyBuZWVkZWQgdG8gY29udmVydCB0aGUgUlRQIHRpbWVzdGFtcCB0bworICAgICAgICogcnVubmluZ190aW1lLCB3aGljaCBpcyBuZWVkZWQgdG8gZ2VuZXJhdGUgYSBtYXBwaW5nIGZyb20gUlRQIHRvIE5UUAorICAgICAgICogdGltZXN0YW1wcyBpbiBTUiByZXBvcnRzICovCisgICAgICBnc3RfZXZlbnRfY29weV9zZWdtZW50IChldmVudCwgJmluX3NlZ21lbnQpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgInJlY2VpdmVkIHNlZ21lbnQgJSIgR1NUX1NFR01FTlRfRk9STUFULAorICAgICAgICAgICZpbl9zZWdtZW50KTsKKworICAgICAgLyogYWNjZXB0IHVwc3RyZWFtICovCisgICAgICBnc3Rfc2VnbWVudF9jb3B5X2ludG8gKCZpbl9zZWdtZW50LCBzZWdtZW50KTsKKworICAgICAgLyogcHVzaCBldmVudCBmb3J3YXJkICovCisgICAgICByZXQgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NyYywgZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICB7CisgICAgICBHc3RQYWQgKnJ0Y3Bfc3JjOworCisgICAgICByZXQgPQorICAgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocnRwc2Vzc2lvbi0+cmVjdl9ydHBfc3JjLCBnc3RfZXZlbnRfcmVmIChldmVudCkpOworCisgICAgICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgICAgICBpZiAoKHJ0Y3Bfc3JjID0gcnRwc2Vzc2lvbi0+c2VuZF9ydGNwX3NyYykpCisgICAgICAgIGdzdF9vYmplY3RfcmVmIChydGNwX3NyYyk7CisgICAgICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICAgICAgaWYgKHJ0Y3Bfc3JjKSB7CisgICAgICAgIHJldCA9IGdzdF9wYWRfcHVzaF9ldmVudCAocnRjcF9zcmMsIGV2ZW50KTsKKyAgICAgICAgZ3N0X29iamVjdF91bnJlZiAocnRjcF9zcmMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgIHJldCA9IFRSVUU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IGdzdF9wYWRfcHVzaF9ldmVudCAocnRwc2Vzc2lvbi0+cmVjdl9ydHBfc3JjLCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7CisKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3Nlc3Npb25fcmVxdWVzdF9yZW1vdGVfa2V5X3VuaXQgKEdzdFJ0cFNlc3Npb24gKiBydHBzZXNzaW9uLAorICAgIGd1aW50MzIgc3NyYywgZ3VpbnQgcGF5bG9hZCwgZ2Jvb2xlYW4gYWxsX2hlYWRlcnMsIGdpbnQgY291bnQpCit7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgY2FwcyA9IGdzdF9ydHBfc2Vzc2lvbl9nZXRfY2Fwc19mb3JfcHQgKHJ0cHNlc3Npb24sIHBheWxvYWQpOworCisgIGlmIChjYXBzKSB7CisgICAgY29uc3QgR3N0U3RydWN0dXJlICpzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgICAgZ2Jvb2xlYW4gcGxpOworICAgIGdib29sZWFuIGZpcjsKKworICAgIHBsaSA9IGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAicnRjcC1mYi1uYWNrLXBsaSIpOworICAgIGZpciA9IGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAicnRjcC1mYi1jY20tZmlyIikgJiYgYWxsX2hlYWRlcnM7CisKKyAgICAvKiBHb29nbGUgVGFsayB1c2VzIEZJUiBmb3IgcmVwYWlyLCBzbyBzZW5kIGl0IGV2ZW4gaWYgd2UganVzdCB3YW50IGEKKyAgICAgKiByZWd1bGFyIFBMSSAqLworICAgIGlmICghcGxpICYmCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAicnRjcC1mYi14LWdzdHJlYW1lci1maXItYXMtcmVwYWlyIikpCisgICAgICBmaXIgPSBUUlVFOworCisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgaWYgKHBsaSB8fCBmaXIpCisgICAgICByZXR1cm4gcnRwX3Nlc3Npb25fcmVxdWVzdF9rZXlfdW5pdCAocnRwc2Vzc2lvbi0+cHJpdi0+c2Vzc2lvbiwgc3NyYywKKyAgICAgICAgICBmaXIsIGNvdW50KTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3Nlc3Npb25fZXZlbnRfcmVjdl9ydHBfc3JjIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBTZXNzaW9uICpydHBzZXNzaW9uOworICBnYm9vbGVhbiBmb3J3YXJkID0gVFJVRTsKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzOworICBndWludDMyIHNzcmM7CisgIGd1aW50IHB0OworCisgIHJ0cHNlc3Npb24gPSBHU1RfUlRQX1NFU1NJT04gKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNOgorICAgICAgcyA9IGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChldmVudCk7CisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgIkdzdEZvcmNlS2V5VW5pdCIpICYmCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAocywgInNzcmMiLCAmc3NyYykgJiYKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF91aW50IChzLCAicGF5bG9hZCIsICZwdCkpIHsKKyAgICAgICAgZ2Jvb2xlYW4gYWxsX2hlYWRlcnMgPSBGQUxTRTsKKyAgICAgICAgZ2ludCBjb3VudCA9IC0xOworCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2Jvb2xlYW4gKHMsICJhbGwtaGVhZGVycyIsICZhbGxfaGVhZGVycyk7CisgICAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJjb3VudCIsICZjb3VudCkgJiYgY291bnQgPCAwKQorICAgICAgICAgIGNvdW50ICs9IEdfTUFYSU5UOyAgICAvKiBNYWtlIHN1cmUgY291bnQgaXMgcG9zaXRpdmUgaWYgcHJlc2VudCAqLworICAgICAgICBpZiAoZ3N0X3J0cF9zZXNzaW9uX3JlcXVlc3RfcmVtb3RlX2tleV91bml0IChydHBzZXNzaW9uLCBzc3JjLCBwdCwKKyAgICAgICAgICAgICAgICBhbGxfaGVhZGVycywgY291bnQpKQorICAgICAgICAgIGZvcndhcmQgPSBGQUxTRTsKKyAgICAgIH0gZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgIkdzdFJUUFJldHJhbnNtaXNzaW9uUmVxdWVzdCIpKSB7CisgICAgICAgIEdzdENsb2NrVGltZSBydW5uaW5nX3RpbWU7CisgICAgICAgIGd1aW50IHNlcW51bSwgZGVsYXksIGRlYWRsaW5lLCBtYXhfZGVsYXksIGF2Z19ydHQ7CisKKyAgICAgICAgR1NUX1JUUF9TRVNTSU9OX0xPQ0sgKHJ0cHNlc3Npb24pOworICAgICAgICBydHBzZXNzaW9uLT5wcml2LT5ydHhfY291bnQrKzsKKyAgICAgICAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisKKyAgICAgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9jbG9ja190aW1lIChzLCAicnVubmluZy10aW1lIiwgJnJ1bm5pbmdfdGltZSkpCisgICAgICAgICAgcnVubmluZ190aW1lID0gLTE7CisgICAgICAgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAocywgInNzcmMiLCAmc3NyYykpCisgICAgICAgICAgc3NyYyA9IC0xOworICAgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQgKHMsICJzZXFudW0iLCAmc2VxbnVtKSkKKyAgICAgICAgICBzZXFudW0gPSAtMTsKKyAgICAgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF91aW50IChzLCAiZGVsYXkiLCAmZGVsYXkpKQorICAgICAgICAgIGRlbGF5ID0gMDsKKyAgICAgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF91aW50IChzLCAiZGVhZGxpbmUiLCAmZGVhZGxpbmUpKQorICAgICAgICAgIGRlYWRsaW5lID0gMTAwOworICAgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQgKHMsICJhdmctcnR0IiwgJmF2Z19ydHQpKQorICAgICAgICAgIGF2Z19ydHQgPSA0MDsKKworICAgICAgICAvKiByZW1haW5pbmcgdGltZSB0byByZWNlaXZlIHRoZSBwYWNrZXQgKi8KKyAgICAgICAgbWF4X2RlbGF5ID0gZGVhZGxpbmU7CisgICAgICAgIGlmIChtYXhfZGVsYXkgPiBkZWxheSkKKyAgICAgICAgICBtYXhfZGVsYXkgLT0gZGVsYXk7CisgICAgICAgIC8qIGVzdGltYXRlZCBSVFQgKi8KKyAgICAgICAgaWYgKG1heF9kZWxheSA+IGF2Z19ydHQpCisgICAgICAgICAgbWF4X2RlbGF5IC09IGF2Z19ydHQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtYXhfZGVsYXkgPSAwOworCisgICAgICAgIGlmIChydHBfc2Vzc2lvbl9yZXF1ZXN0X25hY2sgKHJ0cHNlc3Npb24tPnByaXYtPnNlc3Npb24sIHNzcmMsIHNlcW51bSwKKyAgICAgICAgICAgICAgICBtYXhfZGVsYXkgKiBHU1RfTVNFQ09ORCkpCisgICAgICAgICAgZm9yd2FyZCA9IEZBTFNFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKGZvcndhcmQpIHsKKyAgICBHc3RQYWQgKnJlY3ZfcnRwX3Npbms7CisKKyAgICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgICAgaWYgKChyZWN2X3J0cF9zaW5rID0gcnRwc2Vzc2lvbi0+cmVjdl9ydHBfc2luaykpCisgICAgICBnc3Rfb2JqZWN0X3JlZiAocmVjdl9ydHBfc2luayk7CisgICAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisKKyAgICBpZiAocmVjdl9ydHBfc2luaykgeworICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChyZWN2X3J0cF9zaW5rLCBldmVudCk7CisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChyZWN2X3J0cF9zaW5rKTsKKyAgICB9IGVsc2UKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICB9IGVsc2UgeworICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgR3N0SXRlcmF0b3IgKgorZ3N0X3J0cF9zZXNzaW9uX2l0ZXJhdGVfaW50ZXJuYWxfbGlua3MgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50KQoreworICBHc3RSdHBTZXNzaW9uICpydHBzZXNzaW9uOworICBHc3RQYWQgKm90aGVycGFkID0gTlVMTDsKKyAgR3N0SXRlcmF0b3IgKml0ID0gTlVMTDsKKworICBydHBzZXNzaW9uID0gR1NUX1JUUF9TRVNTSU9OIChwYXJlbnQpOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChydHBzZXNzaW9uKTsKKyAgaWYgKHBhZCA9PSBydHBzZXNzaW9uLT5yZWN2X3J0cF9zcmMpIHsKKyAgICBvdGhlcnBhZCA9IGdzdF9vYmplY3RfcmVmIChydHBzZXNzaW9uLT5yZWN2X3J0cF9zaW5rKTsKKyAgfSBlbHNlIGlmIChwYWQgPT0gcnRwc2Vzc2lvbi0+cmVjdl9ydHBfc2luaykgeworICAgIG90aGVycGFkID0gZ3N0X29iamVjdF9yZWYgKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NyYyk7CisgIH0gZWxzZSBpZiAocGFkID09IHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NyYykgeworICAgIG90aGVycGFkID0gZ3N0X29iamVjdF9yZWYgKHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmspOworICB9IGVsc2UgaWYgKHBhZCA9PSBydHBzZXNzaW9uLT5zZW5kX3J0cF9zaW5rKSB7CisgICAgb3RoZXJwYWQgPSBnc3Rfb2JqZWN0X3JlZiAocnRwc2Vzc2lvbi0+c2VuZF9ydHBfc3JjKTsKKyAgfQorICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICBpZiAob3RoZXJwYWQpIHsKKyAgICBHVmFsdWUgdmFsID0geyAwLCB9OworCisgICAgZ192YWx1ZV9pbml0ICgmdmFsLCBHU1RfVFlQRV9QQUQpOworICAgIGdfdmFsdWVfc2V0X29iamVjdCAoJnZhbCwgb3RoZXJwYWQpOworICAgIGl0ID0gZ3N0X2l0ZXJhdG9yX25ld19zaW5nbGUgKEdTVF9UWVBFX1BBRCwgJnZhbCk7CisgICAgZ192YWx1ZV91bnNldCAoJnZhbCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAob3RoZXJwYWQpOworICB9IGVsc2UgeworICAgIGl0ID0gZ3N0X2l0ZXJhdG9yX25ld19zaW5nbGUgKEdTVF9UWVBFX1BBRCwgTlVMTCk7CisgIH0KKworICByZXR1cm4gaXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9zZXNzaW9uX3Npbmtfc2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbiwKKyAgICBHc3RDYXBzICogY2FwcykKK3sKKyAgR1NUX1JUUF9TRVNTSU9OX0xPQ0sgKHJ0cHNlc3Npb24pOworICBnc3RfcnRwX3Nlc3Npb25fY2FjaGVfY2FwcyAocnRwc2Vzc2lvbiwgY2Fwcyk7CisgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHJ0cHNlc3Npb24pOworCisgIHJldHVybiBUUlVFOworfQorCisvKiByZWNlaXZlIGEgcGFja2V0IGZyb20gYSBzZW5kZXIsIHNlbmQgaXQgdG8gdGhlIFJUUCBzZXNzaW9uIG1hbmFnZXIgYW5kCisgKiBmb3J3YXJkIHRoZSBwYWNrZXQgb24gdGhlIHJ0cF9zcmMgcGFkCisgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX3Nlc3Npb25fY2hhaW5fcmVjdl9ydHAgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UnRwU2Vzc2lvbiAqcnRwc2Vzc2lvbjsKKyAgR3N0UnRwU2Vzc2lvblByaXZhdGUgKnByaXY7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RDbG9ja1RpbWUgY3VycmVudF90aW1lLCBydW5uaW5nX3RpbWU7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisgIGd1aW50NjQgbnRwbnN0aW1lOworCisgIHJ0cHNlc3Npb24gPSBHU1RfUlRQX1NFU1NJT04gKHBhcmVudCk7CisgIHByaXYgPSBydHBzZXNzaW9uLT5wcml2OworCisgIEdTVF9MT0dfT0JKRUNUIChydHBzZXNzaW9uLCAicmVjZWl2ZWQgUlRQIHBhY2tldCIpOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChydHBzZXNzaW9uKTsKKyAgc2lnbmFsX3dhaXRpbmdfcnRjcF90aHJlYWRfdW5sb2NrZWQgKHJ0cHNlc3Npb24pOworICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICAvKiBnZXQgTlRQIHRpbWUgd2hlbiB0aGlzIHBhY2tldCB3YXMgY2FwdHVyZWQsIHRoaXMgZGVwZW5kcyBvbiB0aGUgdGltZXN0YW1wLiAqLworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKTsKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEICh0aW1lc3RhbXApKSB7CisgICAgLyogY29udmVydCB0byBydW5uaW5nIHRpbWUgdXNpbmcgdGhlIHNlZ21lbnQgdmFsdWVzICovCisgICAgcnVubmluZ190aW1lID0KKyAgICAgICAgZ3N0X3NlZ21lbnRfdG9fcnVubmluZ190aW1lICgmcnRwc2Vzc2lvbi0+cmVjdl9ydHBfc2VnLCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgIHRpbWVzdGFtcCk7CisgICAgbnRwbnN0aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgfSBlbHNlIHsKKyAgICBnZXRfY3VycmVudF90aW1lcyAocnRwc2Vzc2lvbiwgJnJ1bm5pbmdfdGltZSwgJm50cG5zdGltZSk7CisgIH0KKyAgY3VycmVudF90aW1lID0gZ3N0X2Nsb2NrX2dldF90aW1lIChwcml2LT5zeXNjbG9jayk7CisKKyAgcmV0ID0gcnRwX3Nlc3Npb25fcHJvY2Vzc19ydHAgKHByaXYtPnNlc3Npb24sIGJ1ZmZlciwgY3VycmVudF90aW1lLAorICAgICAgcnVubmluZ190aW1lLCBudHBuc3RpbWUpOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gcHVzaF9lcnJvcjsKKworZG9uZToKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworcHVzaF9lcnJvcjoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJwcm9jZXNzIHJldHVybmVkICVzIiwKKyAgICAgICAgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworICAgIGdvdG8gZG9uZTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfc2Vzc2lvbl9ldmVudF9yZWN2X3J0Y3Bfc2luayAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UnRwU2Vzc2lvbiAqcnRwc2Vzc2lvbjsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgcnRwc2Vzc2lvbiA9IEdTVF9SVFBfU0VTU0lPTiAocGFyZW50KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAicmVjZWl2ZWQgZXZlbnQgJXMiLAorICAgICAgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHN5bmNfc3JjIHBhZCBoYXMgY2FwcyBiZWZvcmUgdGhlIHNlZ21lbnQgZXZlbnQuCisgICAgICAgKiBPdGhlcndpc2Ugd2UgbWlnaHQgZ2V0IGEgc2VnbWVudCBldmVudCBiZWZvcmUgY2FwcyBmcm9tIHRoZSByZWNlaXZlCisgICAgICAgKiBSVENQIHBhZCwgYW5kIHRoZW4gbGF0ZXIgd2hlbiByZWNlaXZpbmcgUlRDUCBwYWNrZXRzIHdpbGwgc2V0IGNhcHMuCisgICAgICAgKiBUaGlzIHdpbGwgcmVzdWx0cyBpbiBhIHN0aWNreSBldmVudCBtaXNvcmRlcmluZyB3YXJuaW5nCisgICAgICAgKi8KKyAgICAgIGlmICghZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChydHBzZXNzaW9uLT5zeW5jX3NyYykpIHsKKyAgICAgICAgR3N0Q2FwcyAqY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXJ0Y3AiKTsKKyAgICAgICAgZ3N0X3BhZF9zZXRfY2FwcyAocnRwc2Vzc2lvbi0+c3luY19zcmMsIGNhcHMpOworICAgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICB9CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChydHBzZXNzaW9uLT5zeW5jX3NyYywgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisvKiBSZWNlaXZlIGFuIFJUQ1AgcGFja2V0IGZyb20gYSBzZW5kZXIsIHNlbmQgaXQgdG8gdGhlIFJUUCBzZXNzaW9uIG1hbmFnZXIgYW5kCisgKiBmb3J3YXJkIHRoZSBTUiBwYWNrZXRzIHRvIHRoZSBzeW5jX3NyYyBwYWQuCisgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX3Nlc3Npb25fY2hhaW5fcmVjdl9ydGNwIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb247CisgIEdzdFJ0cFNlc3Npb25Qcml2YXRlICpwcml2OworICBHc3RDbG9ja1RpbWUgY3VycmVudF90aW1lOworICBndWludDY0IG50cG5zdGltZTsKKworICBydHBzZXNzaW9uID0gR1NUX1JUUF9TRVNTSU9OIChwYXJlbnQpOworICBwcml2ID0gcnRwc2Vzc2lvbi0+cHJpdjsKKworICBHU1RfTE9HX09CSkVDVCAocnRwc2Vzc2lvbiwgInJlY2VpdmVkIFJUQ1AgcGFja2V0Iik7CisKKyAgR1NUX1JUUF9TRVNTSU9OX0xPQ0sgKHJ0cHNlc3Npb24pOworICBzaWduYWxfd2FpdGluZ19ydGNwX3RocmVhZF91bmxvY2tlZCAocnRwc2Vzc2lvbik7CisgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHJ0cHNlc3Npb24pOworCisgIGN1cnJlbnRfdGltZSA9IGdzdF9jbG9ja19nZXRfdGltZSAocHJpdi0+c3lzY2xvY2spOworICBnZXRfY3VycmVudF90aW1lcyAocnRwc2Vzc2lvbiwgTlVMTCwgJm50cG5zdGltZSk7CisKKyAgcnRwX3Nlc3Npb25fcHJvY2Vzc19ydGNwIChwcml2LT5zZXNzaW9uLCBidWZmZXIsIGN1cnJlbnRfdGltZSwgbnRwbnN0aW1lKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7ICAgICAgICAgICAvKiBhbHdheXMgcmV0dXJuIE9LICovCit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9zZXNzaW9uX3F1ZXJ5X3NlbmRfcnRjcF9zcmMgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb247CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIHJ0cHNlc3Npb24gPSBHU1RfUlRQX1NFU1NJT04gKHBhcmVudCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgInJlY2VpdmVkIFFVRVJZICVzIiwKKyAgICAgIEdTVF9RVUVSWV9UWVBFX05BTUUgKHF1ZXJ5KSk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfTEFURU5DWToKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICAvKiB1c2UgdGhlIGRlZmF1bHRzIGZvciB0aGUgbGF0ZW5jeSBxdWVyeS4gKi8KKyAgICAgIGdzdF9xdWVyeV9zZXRfbGF0ZW5jeSAocXVlcnksIEZBTFNFLCAwLCAtMSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogb3RoZXIgcXVlcmllcyBzaW1wbHkgZmFpbCBmb3Igbm93ICovCisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRjcF9zcmMgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb247CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgcnRwc2Vzc2lvbiA9IEdTVF9SVFBfU0VTU0lPTiAocGFyZW50KTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgInJlY2VpdmVkIEVWRU5UICVzIiwKKyAgICAgIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICBjYXNlIEdTVF9FVkVOVF9MQVRFTkNZOgorICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIG90aGVyIGV2ZW50cyBzaW1wbHkgZmFpbCBmb3Igbm93ICovCisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIHJldCA9IEZBTFNFOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRwX3NpbmsgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb247CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIHJ0cHNlc3Npb24gPSBHU1RfUlRQX1NFU1NJT04gKHBhcmVudCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgInJlY2VpdmVkIEVWRU5UICVzIiwKKyAgICAgIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICAvKiBwcm9jZXNzICovCisgICAgICBnc3RfZXZlbnRfcGFyc2VfY2FwcyAoZXZlbnQsICZjYXBzKTsKKyAgICAgIGdzdF9ydHBfc2Vzc2lvbl9zZXRjYXBzX3NlbmRfcnRwIChwYWQsIHJ0cHNlc3Npb24sIGNhcHMpOworICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChydHBzZXNzaW9uLT5zZW5kX3J0cF9zcmMsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJnJ0cHNlc3Npb24tPnNlbmRfcnRwX3NlZywgR1NUX0ZPUk1BVF9VTkRFRklORUQpOworICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChydHBzZXNzaW9uLT5zZW5kX3J0cF9zcmMsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6eworICAgICAgR3N0U2VnbWVudCAqc2VnbWVudCwgaW5fc2VnbWVudDsKKworICAgICAgc2VnbWVudCA9ICZydHBzZXNzaW9uLT5zZW5kX3J0cF9zZWc7CisKKyAgICAgIC8qIHRoZSBuZXdzZWdtZW50IGV2ZW50IGlzIG5lZWRlZCB0byBjb252ZXJ0IHRoZSBSVFAgdGltZXN0YW1wIHRvCisgICAgICAgKiBydW5uaW5nX3RpbWUsIHdoaWNoIGlzIG5lZWRlZCB0byBnZW5lcmF0ZSBhIG1hcHBpbmcgZnJvbSBSVFAgdG8gTlRQCisgICAgICAgKiB0aW1lc3RhbXBzIGluIFNSIHJlcG9ydHMgKi8KKyAgICAgIGdzdF9ldmVudF9jb3B5X3NlZ21lbnQgKGV2ZW50LCAmaW5fc2VnbWVudCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAicmVjZWl2ZWQgc2VnbWVudCAlIiBHU1RfU0VHTUVOVF9GT1JNQVQsCisgICAgICAgICAgJmluX3NlZ21lbnQpOworCisgICAgICAvKiBhY2NlcHQgdXBzdHJlYW0gKi8KKyAgICAgIGdzdF9zZWdtZW50X2NvcHlfaW50byAoJmluX3NlZ21lbnQsIHNlZ21lbnQpOworCisgICAgICAvKiBwdXNoIGV2ZW50IGZvcndhcmQgKi8KKyAgICAgIHJldCA9IGdzdF9wYWRfcHVzaF9ldmVudCAocnRwc2Vzc2lvbi0+c2VuZF9ydHBfc3JjLCBldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRU9TOnsKKyAgICAgIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWU7CisKKyAgICAgIC8qIHB1c2ggZG93bnN0cmVhbSBGSVhNRSwgd2UgYXJlIG5vdCBzdXBwb3NlZCB0byBsZWF2ZSB0aGUgc2Vzc2lvbiBqdXN0CisgICAgICAgKiBiZWNhdXNlIHdlIHN0b3Agc2VuZGluZy4gKi8KKyAgICAgIHJldCA9IGdzdF9wYWRfcHVzaF9ldmVudCAocnRwc2Vzc2lvbi0+c2VuZF9ydHBfc3JjLCBldmVudCk7CisgICAgICBjdXJyZW50X3RpbWUgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKHJ0cHNlc3Npb24tPnByaXYtPnN5c2Nsb2NrKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgInNjaGVkdWxpbmcgQllFIG1lc3NhZ2UiKTsKKyAgICAgIHJ0cF9zZXNzaW9uX21hcmtfYWxsX2J5ZSAocnRwc2Vzc2lvbi0+cHJpdi0+c2Vzc2lvbiwgIkVuZCBPZiBTdHJlYW0iKTsKKyAgICAgIHJ0cF9zZXNzaW9uX3NjaGVkdWxlX2J5ZSAocnRwc2Vzc2lvbi0+cHJpdi0+c2Vzc2lvbiwgY3VycmVudF90aW1lKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OnsKKyAgICAgIEdzdFBhZCAqc2VuZF9ydHBfc3JjOworCisgICAgICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgICAgICBpZiAoKHNlbmRfcnRwX3NyYyA9IHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NyYykpCisgICAgICAgIGdzdF9vYmplY3RfcmVmIChzZW5kX3J0cF9zcmMpOworICAgICAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisKKyAgICAgIGlmIChzZW5kX3J0cF9zcmMpIHsKKyAgICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChzZW5kX3J0cF9zcmMsIGV2ZW50KTsKKyAgICAgICAgZ3N0X29iamVjdF91bnJlZiAoc2VuZF9ydHBfc3JjKTsKKyAgICAgIH0gZWxzZQorICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3Nlc3Npb25fZXZlbnRfc2VuZF9ydHBfc3JjIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBTZXNzaW9uICpydHBzZXNzaW9uOworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBydHBzZXNzaW9uID0gR1NUX1JUUF9TRVNTSU9OIChwYXJlbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJyZWNlaXZlZCBFVkVOVCAlcyIsCisgICAgICBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0xBVEVOQ1k6CisgICAgICAvKiBzYXZlIHRoZSBsYXRlbmN5LCB3ZSBuZWVkIHRoaXMgdG8ga25vdyB3aGVuIGFuIFJUUCBwYWNrZXQgd2lsbCBiZQorICAgICAgICogcmVuZGVyZWQgYnkgdGhlIHNpbmsgKi8KKyAgICAgIGdzdF9ldmVudF9wYXJzZV9sYXRlbmN5IChldmVudCwgJnJ0cHNlc3Npb24tPnByaXYtPnNlbmRfbGF0ZW5jeSk7CisKKyAgICAgIHJldCA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfcnRwX3Nlc3Npb25fZ2V0Y2Fwc19zZW5kX3J0cCAoR3N0UGFkICogcGFkLCBHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbiwKKyAgICBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RSdHBTZXNzaW9uUHJpdmF0ZSAqcHJpdjsKKyAgR3N0Q2FwcyAqcmVzdWx0OworICBHc3RTdHJ1Y3R1cmUgKnMxLCAqczI7CisgIGd1aW50IHNzcmM7CisgIGdib29sZWFuIGlzX3JhbmRvbTsKKworICBwcml2ID0gcnRwc2Vzc2lvbi0+cHJpdjsKKworICBzc3JjID0gcnRwX3Nlc3Npb25fc3VnZ2VzdF9zc3JjIChwcml2LT5zZXNzaW9uLCAmaXNfcmFuZG9tKTsKKworICAvKiB3ZSBjYW4gYmFzaWNhbGx5IGFjY2VwdCBhbnl0aGluZyBidXQgd2UgcHJlZmVyIHRvIHJlY2VpdmUgcGFja2V0cyB3aXRoIG91cgorICAgKiBpbnRlcm5hbCBTU1JDIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBwYXRjaCBpdC4gQ3JlYXRlIGEgc3RydWN0dXJlIHdpdGgKKyAgICogdGhlIFNTUkMgYW5kIGFub3RoZXIgb25lIHdpdGhvdXQuCisgICAqIE9ubHkgZG8gdGhpcyBpZiB0aGUgc2Vzc2lvbiBhY3R1YWxseSBkZWNpZGVkIG9uIGFuIHNzcmMgYWxyZWFkeSwKKyAgICogb3RoZXJ3aXNlIHdlIGdpdmUgdXBzdHJlYW0gdGhlIG9wcG9ydHVuaXR5IHRvIHNlbGVjdCBhbiBzc3JjIGl0c2VsZiAqLworICBpZiAoIWlzX3JhbmRvbSkgeworICAgIHMxID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cCIsICJzc3JjIiwgR19UWVBFX1VJTlQsIHNzcmMsCisgICAgICAgIE5VTEwpOworICAgIHMyID0gZ3N0X3N0cnVjdHVyZV9uZXdfZW1wdHkgKCJhcHBsaWNhdGlvbi94LXJ0cCIpOworCisgICAgcmVzdWx0ID0gZ3N0X2NhcHNfbmV3X2Z1bGwgKHMxLCBzMiwgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0ID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtcnRwIik7CisgIH0KKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqY2FwcyA9IHJlc3VsdDsKKworICAgIHJlc3VsdCA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIGNhcHMsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgImdldHRpbmcgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgcmVzdWx0KTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfc2Vzc2lvbl9xdWVyeV9zZW5kX3J0cCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb247CisKKyAgcnRwc2Vzc2lvbiA9IEdTVF9SVFBfU0VTU0lPTiAocGFyZW50KTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKmZpbHRlciwgKmNhcHM7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9jYXBzIChxdWVyeSwgJmZpbHRlcik7CisgICAgICBjYXBzID0gZ3N0X3J0cF9zZXNzaW9uX2dldGNhcHNfc2VuZF9ydHAgKHBhZCwgcnRwc2Vzc2lvbiwgZmlsdGVyKTsKKyAgICAgIGdzdF9xdWVyeV9zZXRfY2Fwc19yZXN1bHQgKHF1ZXJ5LCBjYXBzKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3Nlc3Npb25fc2V0Y2Fwc19zZW5kX3J0cCAoR3N0UGFkICogcGFkLCBHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbiwKKyAgICBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UnRwU2Vzc2lvblByaXZhdGUgKnByaXY7CisKKyAgcHJpdiA9IHJ0cHNlc3Npb24tPnByaXY7CisKKyAgcnRwX3Nlc3Npb25fdXBkYXRlX3NlbmRfY2FwcyAocHJpdi0+c2Vzc2lvbiwgY2Fwcyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFJlY2lldmUgYW4gUlRQIHBhY2tldCBvciBhIGxpc3Qgb2YgcGFja2V0cyB0byBiZSBzZW5kIHRvIHRoZSByZWNlaXZlcnMsCisgKiBzZW5kIHRvIFJUUCBzZXNzaW9uIG1hbmFnZXIgYW5kIGZvcndhcmQgdG8gc2VuZF9ydHBfc3JjLgorICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3NlbmRfcnRwX2NvbW1vbiAoR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24sCisgICAgZ3BvaW50ZXIgZGF0YSwgZ2Jvb2xlYW4gaXNfbGlzdCkKK3sKKyAgR3N0UnRwU2Vzc2lvblByaXZhdGUgKnByaXY7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBydW5uaW5nX3RpbWU7CisgIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWU7CisKKyAgcHJpdiA9IHJ0cHNlc3Npb24tPnByaXY7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJyZWNlaXZlZCBSVFAgJXMiLCBpc19saXN0ID8gImxpc3QiIDogInBhY2tldCIpOworCisgIC8qIGdldCBOVFAgdGltZSB3aGVuIHRoaXMgcGFja2V0IHdhcyBjYXB0dXJlZCwgdGhpcyBkZXBlbmRzIG9uIHRoZSB0aW1lc3RhbXAuICovCisgIGlmIChpc19saXN0KSB7CisgICAgR3N0QnVmZmVyICpidWZmZXIgPSBOVUxMOworCisgICAgLyogQWxsIGdyb3VwcyBpbiBhbiBsaXN0IGhhdmUgdGhlIHNhbWUgdGltZXN0YW1wLgorICAgICAqIFNvLCBqdXN0IHRha2UgaXQgZnJvbSB0aGUgZmlyc3QgZ3JvdXAuICovCisgICAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9saXN0X2dldCAoR1NUX0JVRkZFUl9MSVNUX0NBU1QgKGRhdGEpLCAwKTsKKyAgICBpZiAoYnVmZmVyKQorICAgICAgdGltZXN0YW1wID0gR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcik7CisgICAgZWxzZQorICAgICAgdGltZXN0YW1wID0gLTE7CisgIH0gZWxzZSB7CisgICAgdGltZXN0YW1wID0gR1NUX0JVRkZFUl9QVFMgKEdTVF9CVUZGRVJfQ0FTVCAoZGF0YSkpOworICB9CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEICh0aW1lc3RhbXApKSB7CisgICAgLyogY29udmVydCB0byBydW5uaW5nIHRpbWUgdXNpbmcgdGhlIHNlZ21lbnQgc3RhcnQgdmFsdWUuICovCisgICAgcnVubmluZ190aW1lID0KKyAgICAgICAgZ3N0X3NlZ21lbnRfdG9fcnVubmluZ190aW1lICgmcnRwc2Vzc2lvbi0+c2VuZF9ydHBfc2VnLCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgIHRpbWVzdGFtcCk7CisgICAgaWYgKHByaXYtPnJ0Y3Bfc3luY19zZW5kX3RpbWUpCisgICAgICBydW5uaW5nX3RpbWUgKz0gcHJpdi0+c2VuZF9sYXRlbmN5OworICB9IGVsc2UgeworICAgIC8qIG5vIHRpbWVzdGFtcC4gKi8KKyAgICBydW5uaW5nX3RpbWUgPSAtMTsKKyAgfQorCisgIGN1cnJlbnRfdGltZSA9IGdzdF9jbG9ja19nZXRfdGltZSAocHJpdi0+c3lzY2xvY2spOworICByZXQgPSBydHBfc2Vzc2lvbl9zZW5kX3J0cCAocHJpdi0+c2Vzc2lvbiwgZGF0YSwgaXNfbGlzdCwgY3VycmVudF90aW1lLAorICAgICAgcnVubmluZ190aW1lKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICBnb3RvIHB1c2hfZXJyb3I7CisKK2RvbmU6CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK3B1c2hfZXJyb3I6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAicHJvY2VzcyByZXR1cm5lZCAlcyIsCisgICAgICAgIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfc2Vzc2lvbl9jaGFpbl9zZW5kX3J0cCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSdHBTZXNzaW9uICpydHBzZXNzaW9uID0gR1NUX1JUUF9TRVNTSU9OIChwYXJlbnQpOworCisgIHJldHVybiBnc3RfcnRwX3Nlc3Npb25fY2hhaW5fc2VuZF9ydHBfY29tbW9uIChydHBzZXNzaW9uLCBidWZmZXIsIEZBTFNFKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfc2Vzc2lvbl9jaGFpbl9zZW5kX3J0cF9saXN0IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXJMaXN0ICogbGlzdCkKK3sKKyAgR3N0UnRwU2Vzc2lvbiAqcnRwc2Vzc2lvbiA9IEdTVF9SVFBfU0VTU0lPTiAocGFyZW50KTsKKworICByZXR1cm4gZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3NlbmRfcnRwX2NvbW1vbiAocnRwc2Vzc2lvbiwgbGlzdCwgVFJVRSk7Cit9CisKKy8qIENyZWF0ZSBzaW5rcGFkIHRvIHJlY2VpdmUgUlRQIHBhY2tldHMgZnJvbSBzZW5kZXJzLiBUaGlzIHdpbGwgYWxzbyBjcmVhdGUgYQorICogc3JjcGFkIGZvciB0aGUgUlRQIHBhY2tldHMuCisgKi8KK3N0YXRpYyBHc3RQYWQgKgorY3JlYXRlX3JlY3ZfcnRwX3NpbmsgKEdzdFJ0cFNlc3Npb24gKiBydHBzZXNzaW9uKQoreworICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAiY3JlYXRpbmcgUlRQIHNpbmsgcGFkIik7CisKKyAgcnRwc2Vzc2lvbi0+cmVjdl9ydHBfc2luayA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnJ0cHNlc3Npb25fcmVjdl9ydHBfc2lua190ZW1wbGF0ZSwKKyAgICAgICJyZWN2X3J0cF9zaW5rIik7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChydHBzZXNzaW9uLT5yZWN2X3J0cF9zaW5rLAorICAgICAgZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3JlY3ZfcnRwKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NpbmssCisgICAgICBnc3RfcnRwX3Nlc3Npb25fZXZlbnRfcmVjdl9ydHBfc2luayk7CisgIGdzdF9wYWRfc2V0X2l0ZXJhdGVfaW50ZXJuYWxfbGlua3NfZnVuY3Rpb24gKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NpbmssCisgICAgICBnc3RfcnRwX3Nlc3Npb25faXRlcmF0ZV9pbnRlcm5hbF9saW5rcyk7CisgIEdTVF9QQURfU0VUX1BST1hZX0FMTE9DQVRJT04gKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NpbmspOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NpbmssIFRSVUUpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBzZXNzaW9uKSwKKyAgICAgIHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NpbmspOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJjcmVhdGluZyBSVFAgc3JjIHBhZCIpOworICBydHBzZXNzaW9uLT5yZWN2X3J0cF9zcmMgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZydHBzZXNzaW9uX3JlY3ZfcnRwX3NyY190ZW1wbGF0ZSwKKyAgICAgICJyZWN2X3J0cF9zcmMiKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NyYywKKyAgICAgIGdzdF9ydHBfc2Vzc2lvbl9ldmVudF9yZWN2X3J0cF9zcmMpOworICBnc3RfcGFkX3NldF9pdGVyYXRlX2ludGVybmFsX2xpbmtzX2Z1bmN0aW9uIChydHBzZXNzaW9uLT5yZWN2X3J0cF9zcmMsCisgICAgICBnc3RfcnRwX3Nlc3Npb25faXRlcmF0ZV9pbnRlcm5hbF9saW5rcyk7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NyYyk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAocnRwc2Vzc2lvbi0+cmVjdl9ydHBfc3JjLCBUUlVFKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwc2Vzc2lvbiksIHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NyYyk7CisKKyAgcmV0dXJuIHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3Npbms7Cit9CisKKy8qIFJlbW92ZSBzaW5rcGFkIHRvIHJlY2VpdmUgUlRQIHBhY2tldHMgZnJvbSBzZW5kZXJzLiBUaGlzIHdpbGwgYWxzbyByZW1vdmUKKyAqIHRoZSBzcmNwYWQgZm9yIHRoZSBSVFAgcGFja2V0cy4KKyAqLworc3RhdGljIHZvaWQKK3JlbW92ZV9yZWN2X3J0cF9zaW5rIChHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbikKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgInJlbW92aW5nIFJUUCBzaW5rIHBhZCIpOworCisgIC8qIGRlYWN0aXZhdGUgZnJvbSBzb3VyY2UgdG8gc2luayAqLworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NyYywgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NpbmssIEZBTFNFKTsKKworICAvKiByZW1vdmUgcGFkcyAqLworICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBzZXNzaW9uKSwKKyAgICAgIHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NpbmspOworICBydHBzZXNzaW9uLT5yZWN2X3J0cF9zaW5rID0gTlVMTDsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAicmVtb3ZpbmcgUlRQIHNyYyBwYWQiKTsKKyAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwc2Vzc2lvbiksCisgICAgICBydHBzZXNzaW9uLT5yZWN2X3J0cF9zcmMpOworICBydHBzZXNzaW9uLT5yZWN2X3J0cF9zcmMgPSBOVUxMOworfQorCisvKiBDcmVhdGUgYSBzaW5rcGFkIHRvIHJlY2VpdmUgUlRDUCBtZXNzYWdlcyBmcm9tIHNlbmRlcnMsIHRoaXMgd2lsbCBhbHNvIGNyZWF0ZSBhCisgKiBzeW5jX3NyYyBwYWQgZm9yIHRoZSBTUiBwYWNrZXRzLgorICovCitzdGF0aWMgR3N0UGFkICoKK2NyZWF0ZV9yZWN2X3J0Y3Bfc2luayAoR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24pCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJjcmVhdGluZyBSVENQIHNpbmsgcGFkIik7CisKKyAgcnRwc2Vzc2lvbi0+cmVjdl9ydGNwX3NpbmsgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZydHBzZXNzaW9uX3JlY3ZfcnRjcF9zaW5rX3RlbXBsYXRlLAorICAgICAgInJlY3ZfcnRjcF9zaW5rIik7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChydHBzZXNzaW9uLT5yZWN2X3J0Y3Bfc2luaywKKyAgICAgIGdzdF9ydHBfc2Vzc2lvbl9jaGFpbl9yZWN2X3J0Y3ApOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAocnRwc2Vzc2lvbi0+cmVjdl9ydGNwX3NpbmssCisgICAgICBnc3RfcnRwX3Nlc3Npb25fZXZlbnRfcmVjdl9ydGNwX3NpbmspOworICBnc3RfcGFkX3NldF9pdGVyYXRlX2ludGVybmFsX2xpbmtzX2Z1bmN0aW9uIChydHBzZXNzaW9uLT5yZWN2X3J0Y3Bfc2luaywKKyAgICAgIGdzdF9ydHBfc2Vzc2lvbl9pdGVyYXRlX2ludGVybmFsX2xpbmtzKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChydHBzZXNzaW9uLT5yZWN2X3J0Y3Bfc2luaywgVFJVRSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cHNlc3Npb24pLAorICAgICAgcnRwc2Vzc2lvbi0+cmVjdl9ydGNwX3NpbmspOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJjcmVhdGluZyBzeW5jIHNyYyBwYWQiKTsKKyAgcnRwc2Vzc2lvbi0+c3luY19zcmMgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZydHBzZXNzaW9uX3N5bmNfc3JjX3RlbXBsYXRlLAorICAgICAgInN5bmNfc3JjIik7CisgIGdzdF9wYWRfc2V0X2l0ZXJhdGVfaW50ZXJuYWxfbGlua3NfZnVuY3Rpb24gKHJ0cHNlc3Npb24tPnN5bmNfc3JjLAorICAgICAgZ3N0X3J0cF9zZXNzaW9uX2l0ZXJhdGVfaW50ZXJuYWxfbGlua3MpOworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChydHBzZXNzaW9uLT5zeW5jX3NyYyk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAocnRwc2Vzc2lvbi0+c3luY19zcmMsIFRSVUUpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBzZXNzaW9uKSwgcnRwc2Vzc2lvbi0+c3luY19zcmMpOworCisgIHJldHVybiBydHBzZXNzaW9uLT5yZWN2X3J0Y3Bfc2luazsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9yZWN2X3J0Y3Bfc2luayAoR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24pCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJyZW1vdmluZyBSVENQIHNpbmsgcGFkIik7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChydHBzZXNzaW9uLT5zeW5jX3NyYywgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0cHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rLCBGQUxTRSk7CisKKyAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwc2Vzc2lvbiksCisgICAgICBydHBzZXNzaW9uLT5yZWN2X3J0Y3Bfc2luayk7CisgIHJ0cHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rID0gTlVMTDsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAicmVtb3Zpbmcgc3luYyBzcmMgcGFkIik7CisgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cHNlc3Npb24pLCBydHBzZXNzaW9uLT5zeW5jX3NyYyk7CisgIHJ0cHNlc3Npb24tPnN5bmNfc3JjID0gTlVMTDsKK30KKworLyogQ3JlYXRlIGEgc2lua3BhZCB0byByZWNlaXZlIFJUUCBwYWNrZXRzIGZvciByZWNlaXZlcnMuIFRoaXMgd2lsbCBhbHNvIGNyZWF0ZSBhCisgKiBzZW5kX3J0cF9zcmMgcGFkLgorICovCitzdGF0aWMgR3N0UGFkICoKK2NyZWF0ZV9zZW5kX3J0cF9zaW5rIChHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbikKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgImNyZWF0aW5nIHBhZCIpOworCisgIHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmsgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZydHBzZXNzaW9uX3NlbmRfcnRwX3NpbmtfdGVtcGxhdGUsCisgICAgICAic2VuZF9ydHBfc2luayIpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAocnRwc2Vzc2lvbi0+c2VuZF9ydHBfc2luaywKKyAgICAgIGdzdF9ydHBfc2Vzc2lvbl9jaGFpbl9zZW5kX3J0cCk7CisgIGdzdF9wYWRfc2V0X2NoYWluX2xpc3RfZnVuY3Rpb24gKHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmssCisgICAgICBnc3RfcnRwX3Nlc3Npb25fY2hhaW5fc2VuZF9ydHBfbGlzdCk7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChydHBzZXNzaW9uLT5zZW5kX3J0cF9zaW5rLAorICAgICAgZ3N0X3J0cF9zZXNzaW9uX3F1ZXJ5X3NlbmRfcnRwKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmssCisgICAgICBnc3RfcnRwX3Nlc3Npb25fZXZlbnRfc2VuZF9ydHBfc2luayk7CisgIGdzdF9wYWRfc2V0X2l0ZXJhdGVfaW50ZXJuYWxfbGlua3NfZnVuY3Rpb24gKHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmssCisgICAgICBnc3RfcnRwX3Nlc3Npb25faXRlcmF0ZV9pbnRlcm5hbF9saW5rcyk7CisgIEdTVF9QQURfU0VUX1BST1hZX0NBUFMgKHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmspOworICBHU1RfUEFEX1NFVF9QUk9YWV9BTExPQ0FUSU9OIChydHBzZXNzaW9uLT5zZW5kX3J0cF9zaW5rKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChydHBzZXNzaW9uLT5zZW5kX3J0cF9zaW5rLCBUUlVFKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwc2Vzc2lvbiksCisgICAgICBydHBzZXNzaW9uLT5zZW5kX3J0cF9zaW5rKTsKKworICBydHBzZXNzaW9uLT5zZW5kX3J0cF9zcmMgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZydHBzZXNzaW9uX3NlbmRfcnRwX3NyY190ZW1wbGF0ZSwKKyAgICAgICJzZW5kX3J0cF9zcmMiKTsKKyAgZ3N0X3BhZF9zZXRfaXRlcmF0ZV9pbnRlcm5hbF9saW5rc19mdW5jdGlvbiAocnRwc2Vzc2lvbi0+c2VuZF9ydHBfc3JjLAorICAgICAgZ3N0X3J0cF9zZXNzaW9uX2l0ZXJhdGVfaW50ZXJuYWxfbGlua3MpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAocnRwc2Vzc2lvbi0+c2VuZF9ydHBfc3JjLAorICAgICAgZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRwX3NyYyk7CisgIEdTVF9QQURfU0VUX1BST1hZX0NBUFMgKHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NyYyk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAocnRwc2Vzc2lvbi0+c2VuZF9ydHBfc3JjLCBUUlVFKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwc2Vzc2lvbiksIHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NyYyk7CisKKyAgcmV0dXJuIHJ0cHNlc3Npb24tPnNlbmRfcnRwX3Npbms7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfc2VuZF9ydHBfc2luayAoR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24pCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJyZW1vdmluZyBwYWQiKTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NyYywgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmssIEZBTFNFKTsKKworICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBzZXNzaW9uKSwKKyAgICAgIHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmspOworICBydHBzZXNzaW9uLT5zZW5kX3J0cF9zaW5rID0gTlVMTDsKKworICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBzZXNzaW9uKSwKKyAgICAgIHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NyYyk7CisgIHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NyYyA9IE5VTEw7Cit9CisKKy8qIENyZWF0ZSBhIHNyY3BhZCB3aXRoIHRoZSBSVENQIHBhY2tldHMgdG8gc2VuZCBvdXQuCisgKiBUaGlzIHBhZCB3aWxsIGJlIGRyaXZlbiBieSB0aGUgUlRQIHNlc3Npb24gbWFuYWdlciB3aGVuIGl0IHdhbnRzIHRvIHNlbmQgb3V0CisgKiBSVENQIHBhY2tldHMuCisgKi8KK3N0YXRpYyBHc3RQYWQgKgorY3JlYXRlX3NlbmRfcnRjcF9zcmMgKEdzdFJ0cFNlc3Npb24gKiBydHBzZXNzaW9uKQoreworICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAiY3JlYXRpbmcgcGFkIik7CisKKyAgcnRwc2Vzc2lvbi0+c2VuZF9ydGNwX3NyYyA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnJ0cHNlc3Npb25fc2VuZF9ydGNwX3NyY190ZW1wbGF0ZSwKKyAgICAgICJzZW5kX3J0Y3Bfc3JjIik7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKHJ0cHNlc3Npb24tPnNlbmRfcnRjcF9zcmMpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0cHNlc3Npb24tPnNlbmRfcnRjcF9zcmMsIFRSVUUpOworICBnc3RfcGFkX3NldF9pdGVyYXRlX2ludGVybmFsX2xpbmtzX2Z1bmN0aW9uIChydHBzZXNzaW9uLT5zZW5kX3J0Y3Bfc3JjLAorICAgICAgZ3N0X3J0cF9zZXNzaW9uX2l0ZXJhdGVfaW50ZXJuYWxfbGlua3MpOworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAocnRwc2Vzc2lvbi0+c2VuZF9ydGNwX3NyYywKKyAgICAgIGdzdF9ydHBfc2Vzc2lvbl9xdWVyeV9zZW5kX3J0Y3Bfc3JjKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHJ0cHNlc3Npb24tPnNlbmRfcnRjcF9zcmMsCisgICAgICBnc3RfcnRwX3Nlc3Npb25fZXZlbnRfc2VuZF9ydGNwX3NyYyk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cHNlc3Npb24pLAorICAgICAgcnRwc2Vzc2lvbi0+c2VuZF9ydGNwX3NyYyk7CisKKyAgcmV0dXJuIHJ0cHNlc3Npb24tPnNlbmRfcnRjcF9zcmM7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfc2VuZF9ydGNwX3NyYyAoR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24pCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJyZW1vdmluZyBwYWQiKTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0cHNlc3Npb24tPnNlbmRfcnRjcF9zcmMsIEZBTFNFKTsKKworICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBzZXNzaW9uKSwKKyAgICAgIHJ0cHNlc3Npb24tPnNlbmRfcnRjcF9zcmMpOworICBydHBzZXNzaW9uLT5zZW5kX3J0Y3Bfc3JjID0gTlVMTDsKK30KKworc3RhdGljIEdzdFBhZCAqCitnc3RfcnRwX3Nlc3Npb25fcmVxdWVzdF9uZXdfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLCBjb25zdCBnY2hhciAqIG5hbWUsIGNvbnN0IEdzdENhcHMgKiBjYXBzKQoreworICBHc3RSdHBTZXNzaW9uICpydHBzZXNzaW9uOworICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzOworICBHc3RQYWQgKnJlc3VsdDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAodGVtcGwgIT0gTlVMTCwgTlVMTCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfUlRQX1NFU1NJT04gKGVsZW1lbnQpLCBOVUxMKTsKKworICBydHBzZXNzaW9uID0gR1NUX1JUUF9TRVNTSU9OIChlbGVtZW50KTsKKyAga2xhc3MgPSBHU1RfRUxFTUVOVF9HRVRfQ0xBU1MgKGVsZW1lbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGVsZW1lbnQsICJyZXF1ZXN0aW5nIHBhZCAlcyIsIEdTVF9TVFJfTlVMTCAobmFtZSkpOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChydHBzZXNzaW9uKTsKKworICAvKiBmaWd1cmUgb3V0IHRoZSB0ZW1wbGF0ZSAqLworICBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJyZWN2X3J0cF9zaW5rIikpIHsKKyAgICBpZiAocnRwc2Vzc2lvbi0+cmVjdl9ydHBfc2luayAhPSBOVUxMKQorICAgICAgZ290byBleGlzdHM7CisKKyAgICByZXN1bHQgPSBjcmVhdGVfcmVjdl9ydHBfc2luayAocnRwc2Vzc2lvbik7CisgIH0gZWxzZSBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsCisgICAgICAgICAgInJlY3ZfcnRjcF9zaW5rIikpIHsKKyAgICBpZiAocnRwc2Vzc2lvbi0+cmVjdl9ydGNwX3NpbmsgIT0gTlVMTCkKKyAgICAgIGdvdG8gZXhpc3RzOworCisgICAgcmVzdWx0ID0gY3JlYXRlX3JlY3ZfcnRjcF9zaW5rIChydHBzZXNzaW9uKTsKKyAgfSBlbHNlIGlmICh0ZW1wbCA9PSBnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywKKyAgICAgICAgICAic2VuZF9ydHBfc2luayIpKSB7CisgICAgaWYgKHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmsgIT0gTlVMTCkKKyAgICAgIGdvdG8gZXhpc3RzOworCisgICAgcmVzdWx0ID0gY3JlYXRlX3NlbmRfcnRwX3NpbmsgKHJ0cHNlc3Npb24pOworICB9IGVsc2UgaWYgKHRlbXBsID09IGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLAorICAgICAgICAgICJzZW5kX3J0Y3Bfc3JjIikpIHsKKyAgICBpZiAocnRwc2Vzc2lvbi0+c2VuZF9ydGNwX3NyYyAhPSBOVUxMKQorICAgICAgZ290byBleGlzdHM7CisKKyAgICByZXN1bHQgPSBjcmVhdGVfc2VuZF9ydGNwX3NyYyAocnRwc2Vzc2lvbik7CisgIH0gZWxzZQorICAgIGdvdG8gd3JvbmdfdGVtcGxhdGU7CisKKyAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisKKyAgcmV0dXJuIHJlc3VsdDsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX3RlbXBsYXRlOgorICB7CisgICAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisgICAgZ193YXJuaW5nICgicnRwc2Vzc2lvbjogdGhpcyBpcyBub3Qgb3VyIHRlbXBsYXRlIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2V4aXN0czoKKyAgeworICAgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHJ0cHNlc3Npb24pOworICAgIGdfd2FybmluZyAoInJ0cHNlc3Npb246IHBhZCBhbHJlYWR5IHJlcXVlc3RlZCIpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3Nlc3Npb25fcmVsZWFzZV9wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RQYWQgKiBwYWQpCit7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb247CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1JUUF9TRVNTSU9OIChlbGVtZW50KSk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19QQUQgKHBhZCkpOworCisgIHJ0cHNlc3Npb24gPSBHU1RfUlRQX1NFU1NJT04gKGVsZW1lbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGVsZW1lbnQsICJyZWxlYXNpbmcgcGFkICVzOiVzIiwgR1NUX0RFQlVHX1BBRF9OQU1FIChwYWQpKTsKKworICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisKKyAgaWYgKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NpbmsgPT0gcGFkKSB7CisgICAgcmVtb3ZlX3JlY3ZfcnRwX3NpbmsgKHJ0cHNlc3Npb24pOworICB9IGVsc2UgaWYgKHJ0cHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rID09IHBhZCkgeworICAgIHJlbW92ZV9yZWN2X3J0Y3Bfc2luayAocnRwc2Vzc2lvbik7CisgIH0gZWxzZSBpZiAocnRwc2Vzc2lvbi0+c2VuZF9ydHBfc2luayA9PSBwYWQpIHsKKyAgICByZW1vdmVfc2VuZF9ydHBfc2luayAocnRwc2Vzc2lvbik7CisgIH0gZWxzZSBpZiAocnRwc2Vzc2lvbi0+c2VuZF9ydGNwX3NyYyA9PSBwYWQpIHsKKyAgICByZW1vdmVfc2VuZF9ydGNwX3NyYyAocnRwc2Vzc2lvbik7CisgIH0gZWxzZQorICAgIGdvdG8gd3JvbmdfcGFkOworCisgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHJ0cHNlc3Npb24pOworCisgIHJldHVybjsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX3BhZDoKKyAgeworICAgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHJ0cHNlc3Npb24pOworICAgIGdfd2FybmluZyAoInJ0cHNlc3Npb246IGFza2VkIHRvIHJlbGVhc2UgYW4gdW5rbm93biBwYWQiKTsKKyAgICByZXR1cm47CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc2Vzc2lvbl9yZXF1ZXN0X2tleV91bml0IChSVFBTZXNzaW9uICogc2VzcywKKyAgICBndWludDMyIHNzcmMsIGdib29sZWFuIGFsbF9oZWFkZXJzLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb24gPSBHU1RfUlRQX1NFU1NJT04gKHVzZXJfZGF0YSk7CisgIEdzdEV2ZW50ICpldmVudDsKKyAgR3N0UGFkICpzZW5kX3J0cF9zaW5rOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChydHBzZXNzaW9uKTsKKyAgaWYgKChzZW5kX3J0cF9zaW5rID0gcnRwc2Vzc2lvbi0+c2VuZF9ydHBfc2luaykpCisgICAgZ3N0X29iamVjdF9yZWYgKHNlbmRfcnRwX3NpbmspOworICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICBpZiAoc2VuZF9ydHBfc2luaykgeworICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19jdXN0b20gKEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU0sCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiR3N0Rm9yY2VLZXlVbml0IiwgInNzcmMiLCBHX1RZUEVfVUlOVCwgc3NyYywKKyAgICAgICAgICAgICJhbGwtaGVhZGVycyIsIEdfVFlQRV9CT09MRUFOLCBhbGxfaGVhZGVycywgTlVMTCkpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc2VuZF9ydHBfc2luaywgZXZlbnQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNlbmRfcnRwX3NpbmspOworICB9Cit9CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2dzdF9ydHBfc2Vzc2lvbl9yZXF1ZXN0X3RpbWUgKFJUUFNlc3Npb24gKiBzZXNzaW9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb24gPSBHU1RfUlRQX1NFU1NJT04gKHVzZXJfZGF0YSk7CisKKyAgcmV0dXJuIGdzdF9jbG9ja19nZXRfdGltZSAocnRwc2Vzc2lvbi0+cHJpdi0+c3lzY2xvY2spOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zZXNzaW9uX25vdGlmeV9uYWNrIChSVFBTZXNzaW9uICogc2VzcywgZ3VpbnQxNiBzZXFudW0sCisgICAgZ3VpbnQxNiBibHAsIGd1aW50MzIgc3NyYywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RSdHBTZXNzaW9uICpydHBzZXNzaW9uID0gR1NUX1JUUF9TRVNTSU9OICh1c2VyX2RhdGEpOworICBHc3RFdmVudCAqZXZlbnQ7CisgIEdzdFBhZCAqc2VuZF9ydHBfc2luazsKKworICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgIGlmICgoc2VuZF9ydHBfc2luayA9IHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmspKQorICAgIGdzdF9vYmplY3RfcmVmIChzZW5kX3J0cF9zaW5rKTsKKyAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisKKyAgaWYgKHNlbmRfcnRwX3NpbmspIHsKKyAgICB3aGlsZSAoVFJVRSkgeworICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoIkdzdFJUUFJldHJhbnNtaXNzaW9uUmVxdWVzdCIsCisgICAgICAgICAgICAgICJzZXFudW0iLCBHX1RZUEVfVUlOVCwgKGd1aW50KSBzZXFudW0sCisgICAgICAgICAgICAgICJzc3JjIiwgR19UWVBFX1VJTlQsIChndWludCkgc3NyYywgTlVMTCkpOworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzZW5kX3J0cF9zaW5rLCBldmVudCk7CisKKyAgICAgIGlmIChibHAgPT0gMCkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIHNlcW51bSsrOworICAgICAgd2hpbGUgKChibHAgJiAxKSA9PSAwKSB7CisgICAgICAgIHNlcW51bSsrOworICAgICAgICBibHAgPj49IDE7CisgICAgICB9CisgICAgICBibHAgPj49IDE7CisgICAgfQorICAgIGdzdF9vYmplY3RfdW5yZWYgKHNlbmRfcnRwX3NpbmspOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3Nlc3Npb25fcmVjb25maWd1cmUgKFJUUFNlc3Npb24gKiBzZXNzLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb24gPSBHU1RfUlRQX1NFU1NJT04gKHVzZXJfZGF0YSk7CisgIEdzdFBhZCAqc2VuZF9ydHBfc2luazsKKworICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgIGlmICgoc2VuZF9ydHBfc2luayA9IHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmspKQorICAgIGdzdF9vYmplY3RfcmVmIChzZW5kX3J0cF9zaW5rKTsKKyAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisKKyAgaWYgKHNlbmRfcnRwX3NpbmspIHsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbmRfcnRwX3NpbmssIGdzdF9ldmVudF9uZXdfcmVjb25maWd1cmUgKCkpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNlbmRfcnRwX3NpbmspOworICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmggYi9nc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMxYzEwOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uaApAQCAtMCwwICsxLDkwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfU0VTU0lPTl9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1NFU1NJT05fSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1NFU1NJT04gXAorICAoZ3N0X3J0cF9zZXNzaW9uX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfU0VTU0lPTihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9TRVNTSU9OLEdzdFJ0cFNlc3Npb24pKQorI2RlZmluZSBHU1RfUlRQX1NFU1NJT05fQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX1NFU1NJT04sR3N0UnRwU2Vzc2lvbkNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9TRVNTSU9OKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1NFU1NJT04pKQorI2RlZmluZSBHU1RfSVNfUlRQX1NFU1NJT05fQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX1NFU1NJT04pKQorI2RlZmluZSBHU1RfUlRQX1NFU1NJT05fQ0FTVChvYmopICgoR3N0UnRwU2Vzc2lvbiAqKShvYmopKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU2Vzc2lvbiBHc3RSdHBTZXNzaW9uOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFNlc3Npb25DbGFzcyBHc3RSdHBTZXNzaW9uQ2xhc3M7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU2Vzc2lvblByaXZhdGUgR3N0UnRwU2Vzc2lvblByaXZhdGU7CisKK3N0cnVjdCBfR3N0UnRwU2Vzc2lvbiB7CisgIEdzdEVsZW1lbnQgICAgIGVsZW1lbnQ7CisKKyAgLyo8IHByaXZhdGUgPiovCisgIEdzdFBhZCAgICAgICAgKnJlY3ZfcnRwX3Npbms7CisgIEdzdFNlZ21lbnQgICAgIHJlY3ZfcnRwX3NlZzsKKyAgR3N0UGFkICAgICAgICAqcmVjdl9ydGNwX3Npbms7CisgIEdzdFBhZCAgICAgICAgKnNlbmRfcnRwX3Npbms7CisgIEdzdFNlZ21lbnQgICAgIHNlbmRfcnRwX3NlZzsKKworICBHc3RQYWQgICAgICAgICpyZWN2X3J0cF9zcmM7CisgIEdzdFBhZCAgICAgICAgKnN5bmNfc3JjOworICBHc3RQYWQgICAgICAgICpzZW5kX3J0cF9zcmM7CisgIEdzdFBhZCAgICAgICAgKnNlbmRfcnRjcF9zcmM7CisKKyAgR3N0UnRwU2Vzc2lvblByaXZhdGUgKnByaXY7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cFNlc3Npb25DbGFzcyB7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7CisKKyAgLyogc2lnbmFscyAqLworICBHc3RDYXBzKiAoKnJlcXVlc3RfcHRfbWFwKSAoR3N0UnRwU2Vzc2lvbiAqc2VzcywgZ3VpbnQgcHQpOworICB2b2lkICAgICAoKmNsZWFyX3B0X21hcCkgICAoR3N0UnRwU2Vzc2lvbiAqc2Vzcyk7CisKKyAgdm9pZCAgICAgKCpvbl9uZXdfc3NyYykgICAgICAgKEdzdFJ0cFNlc3Npb24gKnNlc3MsIGd1aW50MzIgc3NyYyk7CisgIHZvaWQgICAgICgqb25fc3NyY19jb2xsaXNpb24pIChHc3RSdHBTZXNzaW9uICpzZXNzLCBndWludDMyIHNzcmMpOworICB2b2lkICAgICAoKm9uX3NzcmNfdmFsaWRhdGVkKSAoR3N0UnRwU2Vzc2lvbiAqc2VzcywgZ3VpbnQzMiBzc3JjKTsKKyAgdm9pZCAgICAgKCpvbl9zc3JjX2FjdGl2ZSkgICAgKEdzdFJ0cFNlc3Npb24gKnNlc3MsIGd1aW50MzIgc3NyYyk7CisgIHZvaWQgICAgICgqb25fc3NyY19zZGVzKSAgICAgIChHc3RSdHBTZXNzaW9uICpzZXNzLCBndWludDMyIHNzcmMpOworICB2b2lkICAgICAoKm9uX2J5ZV9zc3JjKSAgICAgICAoR3N0UnRwU2Vzc2lvbiAqc2VzcywgZ3VpbnQzMiBzc3JjKTsKKyAgdm9pZCAgICAgKCpvbl9ieWVfdGltZW91dCkgICAgKEdzdFJ0cFNlc3Npb24gKnNlc3MsIGd1aW50MzIgc3NyYyk7CisgIHZvaWQgICAgICgqb25fdGltZW91dCkgICAgICAgIChHc3RSdHBTZXNzaW9uICpzZXNzLCBndWludDMyIHNzcmMpOworICB2b2lkICAgICAoKm9uX3NlbmRlcl90aW1lb3V0KSAoR3N0UnRwU2Vzc2lvbiAqc2VzcywgZ3VpbnQzMiBzc3JjKTsKKyAgdm9pZCAgICAgKCpvbl9uZXdfc2VuZGVyX3NzcmMpICAgICAgKEdzdFJ0cFNlc3Npb24gKnNlc3MsIGd1aW50MzIgc3NyYyk7CisgIHZvaWQgICAgICgqb25fc2VuZGVyX3NzcmNfYWN0aXZlKSAgIChHc3RSdHBTZXNzaW9uICpzZXNzLCBndWludDMyIHNzcmMpOworfTsKKworR1R5cGUgZ3N0X3J0cF9zZXNzaW9uX2dldF90eXBlICh2b2lkKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX1JUUF9OVFBfVElNRV9TT1VSQ0VfTlRQLAorICBHU1RfUlRQX05UUF9USU1FX1NPVVJDRV9VTklYLAorICBHU1RfUlRQX05UUF9USU1FX1NPVVJDRV9SVU5OSU5HX1RJTUUsCisgIEdTVF9SVFBfTlRQX1RJTUVfU09VUkNFX0NMT0NLX1RJTUUKK30gR3N0UnRwTnRwVGltZVNvdXJjZTsKKworR1R5cGUgZ3N0X3J0cF9udHBfdGltZV9zb3VyY2VfZ2V0X3R5cGUgKHZvaWQpOworCisjZW5kaWYgLyogX19HU1RfUlRQX1NFU1NJT05fSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YTNjNDMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYwpAQCAtMCwwICsxLDk1NiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFJUUCBTU1JDIGRlbXV4ZXIKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1ydHBzc3JjZGVtdXgKKyAqCisgKiBydHBzc3JjZGVtdXggYWN0cyBhcyBhIGRlbXV4ZXIgZm9yIFJUUCBwYWNrZXRzIGJhc2VkIG9uIHRoZSBTU1JDIG9mIHRoZQorICogcGFja2V0cy4gSXRzIG1haW4gcHVycG9zZSBpcyB0byBhbGxvdyBhbiBhcHBsaWNhdGlvbiB0byBlYXNpbHkgcmVjZWl2ZSBhbmQKKyAqIGRlY29kZSBhbiBSVFAgc3RyZWFtIHdpdGggbXVsdGlwbGUgU1NSQ3MuCisgKiAKKyAqIEZvciBlYWNoIFNTUkMgdGhhdCBpcyBkZXRlY3RlZCwgYSBuZXcgcGFkIHdpbGwgYmUgY3JlYXRlZCBhbmQgdGhlCisgKiAjR3N0UnRwU3NyY0RlbXV4OjpuZXctc3NyYy1wYWQgc2lnbmFsIHdpbGwgYmUgZW1pdHRlZC4gCisgKiAKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdWRwc3JjIGNhcHM9ImFwcGxpY2F0aW9uL3gtcnRwIiAhIHJ0cHNzcmNkZW11eCAhIGZha2VzaW5rCisgKiBdfCBUYWtlcyBhbiBSVFAgc3RyZWFtIGFuZCBzZW5kIHRoZSBSVFAgcGFja2V0cyB3aXRoIHRoZSBmaXJzdCBkZXRlY3RlZCBTU1JDCisgKiB0byBmYWtlc2luaywgZGlzY2FyZGluZyB0aGUgb3RoZXIgU1NSQ3MuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydGNwYnVmZmVyLmg+CisKKyNpbmNsdWRlICJnc3RydHBzc3JjZGVtdXguaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3J0cF9zc3JjX2RlbXV4X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9ydHBfc3NyY19kZW11eF9kZWJ1ZworCisvKiBnZW5lcmljIHRlbXBsYXRlcyAqLworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHJ0cF9zc3JjX2RlbXV4X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBydHBfc3NyY19kZW11eF9ydGNwX3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJydGNwX3NpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0Y3AiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBydHBfc3NyY19kZW11eF9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmNfJXUiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfU09NRVRJTUVTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgcnRwX3NzcmNfZGVtdXhfcnRjcF9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJydGNwX3NyY18ldSIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9TT01FVElNRVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydGNwIikKKyAgICApOworCisjZGVmaW5lIEdTVF9QQURfTE9DSyhvYmopICAgKGdfcmVjX211dGV4X2xvY2sgKCYob2JqKS0+cGFkbG9jaykpCisjZGVmaW5lIEdTVF9QQURfVU5MT0NLKG9iaikgKGdfcmVjX211dGV4X3VubG9jayAoJihvYmopLT5wYWRsb2NrKSkKKwordHlwZWRlZiBlbnVtCit7CisgIFJUUF9QQUQsCisgIFJUQ1BfUEFECit9IFBhZFR5cGU7CisKKy8qIHNpZ25hbHMgKi8KK2VudW0KK3sKKyAgU0lHTkFMX05FV19TU1JDX1BBRCwKKyAgU0lHTkFMX1JFTU9WRURfU1NSQ19QQUQsCisgIFNJR05BTF9DTEVBUl9TU1JDLAorICBMQVNUX1NJR05BTAorfTsKKworI2RlZmluZSBnc3RfcnRwX3NzcmNfZGVtdXhfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwU3NyY0RlbXV4LCBnc3RfcnRwX3NzcmNfZGVtdXgsIEdTVF9UWVBFX0VMRU1FTlQpOworCisvKiBHT2JqZWN0IHZtZXRob2RzICovCitzdGF0aWMgdm9pZCBnc3RfcnRwX3NzcmNfZGVtdXhfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX3NzcmNfZGVtdXhfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCisvKiBHc3RFbGVtZW50IHZtZXRob2RzICovCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9zc3JjX2RlbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfc3NyY19kZW11eF9jbGVhcl9zc3JjIChHc3RSdHBTc3JjRGVtdXggKiBkZW11eCwKKyAgICBndWludDMyIHNzcmMpOworCisvKiBzaW5rcGFkIHN0dWZmICovCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX3NzcmNfZGVtdXhfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9zc3JjX2RlbXV4X3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX3NzcmNfZGVtdXhfcnRjcF9jaGFpbiAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmKTsKK3N0YXRpYyBHc3RJdGVyYXRvciAqZ3N0X3J0cF9zc3JjX2RlbXV4X2l0ZXJhdGVfaW50ZXJuYWxfbGlua3Nfc2luayAoR3N0UGFkICoKKyAgICBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCk7CisKKy8qIHNyY3BhZCBzdHVmZiAqLworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfc3NyY19kZW11eF9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIEdzdEl0ZXJhdG9yICpnc3RfcnRwX3NzcmNfZGVtdXhfaXRlcmF0ZV9pbnRlcm5hbF9saW5rc19zcmMgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfc3NyY19kZW11eF9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworCitzdGF0aWMgZ3VpbnQgZ3N0X3J0cF9zc3JjX2RlbXV4X3NpZ25hbHNbTEFTVF9TSUdOQUxdID0geyAwIH07CisKKy8qCisgKiBJdGVtIGZvciBzdG9yaW5nIEdzdFBhZCA8LT4gU1NSQyBwYWlycy4KKyAqLworc3RydWN0IF9Hc3RSdHBTc3JjRGVtdXhQYWQKK3sKKyAgZ3VpbnQzMiBzc3JjOworICBHc3RQYWQgKnJ0cF9wYWQ7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdFBhZCAqcnRjcF9wYWQ7CisKKyAgZ2Jvb2xlYW4gcHVzaGVkX2luaXRpYWxfcnRwX2V2ZW50czsKKyAgZ2Jvb2xlYW4gcHVzaGVkX2luaXRpYWxfcnRjcF9ldmVudHM7Cit9OworCisvKiBmaW5kIGEgc3JjIHBhZCBmb3IgYSBnaXZlbiBTU1JDLCByZXR1cm5zIE5VTEwgaWYgdGhlIFNTUkMgd2FzIG5vdCBmb3VuZAorICovCitzdGF0aWMgR3N0UnRwU3NyY0RlbXV4UGFkICoKK2ZpbmRfZGVtdXhfcGFkX2Zvcl9zc3JjIChHc3RSdHBTc3JjRGVtdXggKiBkZW11eCwgZ3VpbnQzMiBzc3JjKQoreworICBHU0xpc3QgKndhbGs7CisKKyAgZm9yICh3YWxrID0gZGVtdXgtPnNyY3BhZHM7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UnRwU3NyY0RlbXV4UGFkICpwYWQgPSAoR3N0UnRwU3NyY0RlbXV4UGFkICopIHdhbGstPmRhdGE7CisKKyAgICBpZiAocGFkLT5zc3JjID09IHNzcmMpCisgICAgICByZXR1cm4gcGFkOworICB9CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgR3N0RXZlbnQgKgorYWRkX3NzcmNfYW5kX3JlZiAoR3N0RXZlbnQgKiBldmVudCwgZ3VpbnQzMiBzc3JjKQoreworICAvKiBTZXQgdGhlIHNzcmMgb24gdGhlIG91dHB1dCBjYXBzICovCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKyAgICAgIEdzdENhcHMgKm5ld2NhcHM7CisgICAgICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9jYXBzIChldmVudCwgJmNhcHMpOworICAgICAgbmV3Y2FwcyA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworCisgICAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAobmV3Y2FwcywgMCk7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgInNzcmMiLCBHX1RZUEVfVUlOVCwgc3NyYywgTlVMTCk7CisgICAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfY2FwcyAobmV3Y2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAobmV3Y2Fwcyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGdzdF9ldmVudF9yZWYgKGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGV2ZW50OworfQorCitzdHJ1Y3QgRm9yd2FyZFN0aWNreUV2ZW50RGF0YQoreworICBHc3RQYWQgKnBhZDsKKyAgZ3VpbnQzMiBzc3JjOworfTsKKworc3RhdGljIGdib29sZWFuCitmb3J3YXJkX3N0aWNreV9ldmVudHMgKEdzdFBhZCAqIHBhZCwgR3N0RXZlbnQgKiogZXZlbnQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgc3RydWN0IEZvcndhcmRTdGlja3lFdmVudERhdGEgKmRhdGEgPSB1c2VyX2RhdGE7CisgIEdzdEV2ZW50ICpuZXdldmVudDsKKworICBuZXdldmVudCA9IGFkZF9zc3JjX2FuZF9yZWYgKCpldmVudCwgZGF0YS0+c3NyYyk7CisKKyAgZ3N0X3BhZF9wdXNoX2V2ZW50IChkYXRhLT5wYWQsIG5ld2V2ZW50KTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2ZvcndhcmRfaW5pdGlhbF9ldmVudHMgKEdzdFJ0cFNzcmNEZW11eCAqIGRlbXV4LCBndWludDMyIHNzcmMsIEdzdFBhZCAqIHBhZCwKKyAgICBQYWRUeXBlIHBhZHR5cGUpCit7CisgIHN0cnVjdCBGb3J3YXJkU3RpY2t5RXZlbnREYXRhIGZkYXRhOworICBHc3RQYWQgKnNpbmtwYWQgPSBOVUxMOworCisgIGlmIChwYWR0eXBlID09IFJUUF9QQUQpCisgICAgc2lua3BhZCA9IGRlbXV4LT5ydHBfc2luazsKKyAgZWxzZSBpZiAocGFkdHlwZSA9PSBSVENQX1BBRCkKKyAgICBzaW5rcGFkID0gZGVtdXgtPnJ0Y3Bfc2luazsKKyAgZWxzZQorICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworCisgIGZkYXRhLnNzcmMgPSBzc3JjOworICBmZGF0YS5wYWQgPSBwYWQ7CisKKyAgZ3N0X3BhZF9zdGlja3lfZXZlbnRzX2ZvcmVhY2ggKHNpbmtwYWQsIGZvcndhcmRfc3RpY2t5X2V2ZW50cywgJmZkYXRhKTsKK30KKworc3RhdGljIEdzdFBhZCAqCitmaW5kX29yX2NyZWF0ZV9kZW11eF9wYWRfZm9yX3NzcmMgKEdzdFJ0cFNzcmNEZW11eCAqIGRlbXV4LCBndWludDMyIHNzcmMsCisgICAgUGFkVHlwZSBwYWR0eXBlKQoreworICBHc3RQYWQgKnJ0cF9wYWQsICpydGNwX3BhZDsKKyAgR3N0RWxlbWVudENsYXNzICprbGFzczsKKyAgR3N0UGFkVGVtcGxhdGUgKnRlbXBsOworICBnY2hhciAqcGFkbmFtZTsKKyAgR3N0UnRwU3NyY0RlbXV4UGFkICpkZW11eHBhZDsKKyAgR3N0UGFkICpyZXRwYWQ7CisgIGd1bG9uZyBydHBfYmxvY2ssIHJ0Y3BfYmxvY2s7CisKKyAgR1NUX1BBRF9MT0NLIChkZW11eCk7CisKKyAgZGVtdXhwYWQgPSBmaW5kX2RlbXV4X3BhZF9mb3Jfc3NyYyAoZGVtdXgsIHNzcmMpOworICBpZiAoZGVtdXhwYWQgIT0gTlVMTCkgeworICAgIGdib29sZWFuIGZvcndhcmQgPSBGQUxTRTsKKworICAgIHN3aXRjaCAocGFkdHlwZSkgeworICAgICAgY2FzZSBSVFBfUEFEOgorICAgICAgICByZXRwYWQgPSBnc3Rfb2JqZWN0X3JlZiAoZGVtdXhwYWQtPnJ0cF9wYWQpOworICAgICAgICBpZiAoIWRlbXV4cGFkLT5wdXNoZWRfaW5pdGlhbF9ydHBfZXZlbnRzKSB7CisgICAgICAgICAgZm9yd2FyZCA9IFRSVUU7CisgICAgICAgICAgZGVtdXhwYWQtPnB1c2hlZF9pbml0aWFsX3J0cF9ldmVudHMgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBSVENQX1BBRDoKKyAgICAgICAgcmV0cGFkID0gZ3N0X29iamVjdF9yZWYgKGRlbXV4cGFkLT5ydGNwX3BhZCk7CisgICAgICAgIGlmICghZGVtdXhwYWQtPnB1c2hlZF9pbml0aWFsX3J0Y3BfZXZlbnRzKSB7CisgICAgICAgICAgZm9yd2FyZCA9IFRSVUU7CisgICAgICAgICAgZGVtdXhwYWQtPnB1c2hlZF9pbml0aWFsX3J0Y3BfZXZlbnRzID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHBhZCA9IE5VTEw7CisgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgIH0KKworICAgIEdTVF9QQURfVU5MT0NLIChkZW11eCk7CisKKyAgICBpZiAoZm9yd2FyZCkKKyAgICAgIGZvcndhcmRfaW5pdGlhbF9ldmVudHMgKGRlbXV4LCBzc3JjLCByZXRwYWQsIHBhZHR5cGUpOworICAgIHJldHVybiByZXRwYWQ7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImNyZWF0aW5nIG5ldyBwYWQgZm9yIFNTUkMgJTA4eCIsIHNzcmMpOworCisgIGtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChkZW11eCk7CisgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJzcmNfJXUiKTsKKyAgcGFkbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInNyY18ldSIsIHNzcmMpOworICBydHBfcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV90ZW1wbGF0ZSAodGVtcGwsIHBhZG5hbWUpOworICBnX2ZyZWUgKHBhZG5hbWUpOworCisgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJydGNwX3NyY18ldSIpOworICBwYWRuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgicnRjcF9zcmNfJXUiLCBzc3JjKTsKKyAgcnRjcF9wYWQgPSBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlICh0ZW1wbCwgcGFkbmFtZSk7CisgIGdfZnJlZSAocGFkbmFtZSk7CisKKyAgLyogd3JhcCBpbiBzdHJ1Y3R1cmUgYW5kIGFkZCB0byBsaXN0ICovCisgIGRlbXV4cGFkID0gZ19uZXcwIChHc3RSdHBTc3JjRGVtdXhQYWQsIDEpOworICBkZW11eHBhZC0+c3NyYyA9IHNzcmM7CisgIGRlbXV4cGFkLT5ydHBfcGFkID0gcnRwX3BhZDsKKyAgZGVtdXhwYWQtPnJ0Y3BfcGFkID0gcnRjcF9wYWQ7CisKKyAgZ3N0X3BhZF9zZXRfZWxlbWVudF9wcml2YXRlIChydHBfcGFkLCBkZW11eHBhZCk7CisgIGdzdF9wYWRfc2V0X2VsZW1lbnRfcHJpdmF0ZSAocnRjcF9wYWQsIGRlbXV4cGFkKTsKKworICBkZW11eC0+c3JjcGFkcyA9IGdfc2xpc3RfcHJlcGVuZCAoZGVtdXgtPnNyY3BhZHMsIGRlbXV4cGFkKTsKKworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAocnRwX3BhZCwgZ3N0X3J0cF9zc3JjX2RlbXV4X3NyY19xdWVyeSk7CisgIGdzdF9wYWRfc2V0X2l0ZXJhdGVfaW50ZXJuYWxfbGlua3NfZnVuY3Rpb24gKHJ0cF9wYWQsCisgICAgICBnc3RfcnRwX3NzcmNfZGVtdXhfaXRlcmF0ZV9pbnRlcm5hbF9saW5rc19zcmMpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAocnRwX3BhZCwgZ3N0X3J0cF9zc3JjX2RlbXV4X3NyY19ldmVudCk7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKHJ0cF9wYWQpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0cF9wYWQsIFRSVUUpOworCisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChydGNwX3BhZCwgZ3N0X3J0cF9zc3JjX2RlbXV4X3NyY19ldmVudCk7CisgIGdzdF9wYWRfc2V0X2l0ZXJhdGVfaW50ZXJuYWxfbGlua3NfZnVuY3Rpb24gKHJ0Y3BfcGFkLAorICAgICAgZ3N0X3J0cF9zc3JjX2RlbXV4X2l0ZXJhdGVfaW50ZXJuYWxfbGlua3Nfc3JjKTsKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAocnRjcF9wYWQpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0Y3BfcGFkLCBUUlVFKTsKKworICBpZiAocGFkdHlwZSA9PSBSVFBfUEFEKSB7CisgICAgZGVtdXhwYWQtPnB1c2hlZF9pbml0aWFsX3J0cF9ldmVudHMgPSBUUlVFOworICAgIGZvcndhcmRfaW5pdGlhbF9ldmVudHMgKGRlbXV4LCBzc3JjLCBydHBfcGFkLCBwYWR0eXBlKTsKKyAgfSBlbHNlIGlmIChwYWR0eXBlID09IFJUQ1BfUEFEKSB7CisgICAgZGVtdXhwYWQtPnB1c2hlZF9pbml0aWFsX3J0Y3BfZXZlbnRzID0gVFJVRTsKKyAgICBmb3J3YXJkX2luaXRpYWxfZXZlbnRzIChkZW11eCwgc3NyYywgcnRjcF9wYWQsIHBhZHR5cGUpOworICB9IGVsc2UgeworICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICB9CisKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCBydHBfcGFkKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCBydGNwX3BhZCk7CisKKyAgc3dpdGNoIChwYWR0eXBlKSB7CisgICAgY2FzZSBSVFBfUEFEOgorICAgICAgcmV0cGFkID0gZ3N0X29iamVjdF9yZWYgKGRlbXV4cGFkLT5ydHBfcGFkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUlRDUF9QQUQ6CisgICAgICByZXRwYWQgPSBnc3Rfb2JqZWN0X3JlZiAoZGVtdXhwYWQtPnJ0Y3BfcGFkKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXRwYWQgPSBOVUxMOworICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgIH0KKworICBnc3Rfb2JqZWN0X3JlZiAocnRwX3BhZCk7CisgIGdzdF9vYmplY3RfcmVmIChydGNwX3BhZCk7CisKKyAgcnRwX2Jsb2NrID0gZ3N0X3BhZF9hZGRfcHJvYmUgKHJ0cF9wYWQsIEdTVF9QQURfUFJPQkVfVFlQRV9CTE9DS19ET1dOU1RSRUFNLAorICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisgIHJ0Y3BfYmxvY2sgPSBnc3RfcGFkX2FkZF9wcm9iZSAocnRjcF9wYWQsIEdTVF9QQURfUFJPQkVfVFlQRV9CTE9DS19ET1dOU1RSRUFNLAorICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgR1NUX1BBRF9VTkxPQ0sgKGRlbXV4KTsKKworICBnX3NpZ25hbF9lbWl0IChHX09CSkVDVCAoZGVtdXgpLAorICAgICAgZ3N0X3J0cF9zc3JjX2RlbXV4X3NpZ25hbHNbU0lHTkFMX05FV19TU1JDX1BBRF0sIDAsIHNzcmMsIHJ0cF9wYWQpOworCisgIGdzdF9wYWRfcmVtb3ZlX3Byb2JlIChydHBfcGFkLCBydHBfYmxvY2spOworICBnc3RfcGFkX3JlbW92ZV9wcm9iZSAocnRjcF9wYWQsIHJ0Y3BfYmxvY2spOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cF9wYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChydGNwX3BhZCk7CisKKyAgcmV0dXJuIHJldHBhZDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc3NyY19kZW11eF9jbGFzc19pbml0IChHc3RSdHBTc3JjRGVtdXhDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3Rfa2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9rbGFzczsKKyAgR3N0UnRwU3NyY0RlbXV4Q2xhc3MgKmdzdHJ0cHNzcmNkZW11eF9rbGFzczsKKworICBnb2JqZWN0X2tsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9rbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cHNzcmNkZW11eF9rbGFzcyA9IChHc3RSdHBTc3JjRGVtdXhDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2tsYXNzLT5kaXNwb3NlID0gZ3N0X3J0cF9zc3JjX2RlbXV4X2Rpc3Bvc2U7CisgIGdvYmplY3Rfa2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9zc3JjX2RlbXV4X2ZpbmFsaXplOworCisgIC8qKgorICAgKiBHc3RSdHBTc3JjRGVtdXg6Om5ldy1zc3JjLXBhZDoKKyAgICogQGRlbXV4OiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNzcmM6IHRoZSBTU1JDIG9mIHRoZSBwYWQKKyAgICogQHBhZDogdGhlIG5ldyBwYWQuCisgICAqCisgICAqIEVtaXRlZCB3aGVuIGEgbmV3IFNTUkMgcGFkIGhhcyBiZWVuIGNyZWF0ZWQuCisgICAqLworICBnc3RfcnRwX3NzcmNfZGVtdXhfc2lnbmFsc1tTSUdOQUxfTkVXX1NTUkNfUEFEXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJuZXctc3NyYy1wYWQiLAorICAgICAgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwgR19TSUdOQUxfUlVOX0xBU1QsCisgICAgICBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFNzcmNEZW11eENsYXNzLCBuZXdfc3NyY19wYWQpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdTVF9UWVBFX1BBRCk7CisKKyAgLyoqCisgICAqIEdzdFJ0cFNzcmNEZW11eDo6cmVtb3ZlZC1zc3JjLXBhZDoKKyAgICogQGRlbXV4OiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNzcmM6IHRoZSBTU1JDIG9mIHRoZSBwYWQKKyAgICogQHBhZDogdGhlIHJlbW92ZWQgcGFkLgorICAgKgorICAgKiBFbWl0ZWQgd2hlbiBhIFNTUkMgcGFkIGhhcyBiZWVuIHJlbW92ZWQuCisgICAqLworICBnc3RfcnRwX3NzcmNfZGVtdXhfc2lnbmFsc1tTSUdOQUxfUkVNT1ZFRF9TU1JDX1BBRF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgicmVtb3ZlZC1zc3JjLXBhZCIsCisgICAgICBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLCBHX1NJR05BTF9SVU5fTEFTVCwKKyAgICAgIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwU3NyY0RlbXV4Q2xhc3MsIHJlbW92ZWRfc3NyY19wYWQpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdTVF9UWVBFX1BBRCk7CisKKyAgLyoqCisgICAqIEdzdFJ0cFNzcmNEZW11eDo6Y2xlYXItc3NyYzoKKyAgICogQGRlbXV4OiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNzcmM6IHRoZSBTU1JDIG9mIHRoZSBwYWQKKyAgICoKKyAgICogQWN0aW9uIHNpZ25hbCB0byByZW1vdmUgdGhlIHBhZCBmb3IgU1NSQy4KKyAgICovCisgIGdzdF9ydHBfc3NyY19kZW11eF9zaWduYWxzW1NJR05BTF9DTEVBUl9TU1JDXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJjbGVhci1zc3JjIiwKKyAgICAgIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksIEdfU0lHTkFMX1JVTl9MQVNUIHwgR19TSUdOQUxfQUNUSU9OLAorICAgICAgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBTc3JjRGVtdXhDbGFzcywgY2xlYXJfc3NyYyksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR19UWVBFX05PTkUsIDEsIEdfVFlQRV9VSU5UKTsKKworICBnc3RlbGVtZW50X2tsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfc3NyY19kZW11eF9jaGFuZ2Vfc3RhdGUpOworICBnc3RydHBzc3JjZGVtdXhfa2xhc3MtPmNsZWFyX3NzcmMgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfc3NyY19kZW11eF9jbGVhcl9zc3JjKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9rbGFzcywKKyAgICAgICZydHBfc3NyY19kZW11eF9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfa2xhc3MsCisgICAgICAmcnRwX3NzcmNfZGVtdXhfcnRjcF9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfa2xhc3MsCisgICAgICAmcnRwX3NzcmNfZGVtdXhfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfa2xhc3MsCisgICAgICAmcnRwX3NzcmNfZGVtdXhfcnRjcF9zcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfa2xhc3MsICJSVFAgU1NSQyBEZW11eCIsCisgICAgICAiRGVtdXgvTmV0d29yay9SVFAiLAorICAgICAgIlNwbGl0cyBSVFAgc3RyZWFtcyBiYXNlZCBvbiB0aGUgU1NSQyIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3J0cF9zc3JjX2RlbXV4X2RlYnVnLAorICAgICAgInJ0cHNzcmNkZW11eCIsIDAsICJSVFAgU1NSQyBkZW11eGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3NzcmNfZGVtdXhfaW5pdCAoR3N0UnRwU3NyY0RlbXV4ICogZGVtdXgpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqa2xhc3MgPSBHU1RfRUxFTUVOVF9HRVRfQ0xBU1MgKGRlbXV4KTsKKworICBkZW11eC0+cnRwX3NpbmsgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV90ZW1wbGF0ZSAoZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsCisgICAgICAgICAgInNpbmsiKSwgInNpbmsiKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKGRlbXV4LT5ydHBfc2luaywgZ3N0X3J0cF9zc3JjX2RlbXV4X2NoYWluKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKGRlbXV4LT5ydHBfc2luaywgZ3N0X3J0cF9zc3JjX2RlbXV4X3NpbmtfZXZlbnQpOworICBnc3RfcGFkX3NldF9pdGVyYXRlX2ludGVybmFsX2xpbmtzX2Z1bmN0aW9uIChkZW11eC0+cnRwX3NpbmssCisgICAgICBnc3RfcnRwX3NzcmNfZGVtdXhfaXRlcmF0ZV9pbnRlcm5hbF9saW5rc19zaW5rKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCBkZW11eC0+cnRwX3NpbmspOworCisgIGRlbXV4LT5ydGNwX3NpbmsgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV90ZW1wbGF0ZSAoZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsCisgICAgICAgICAgInJ0Y3Bfc2luayIpLCAicnRjcF9zaW5rIik7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChkZW11eC0+cnRjcF9zaW5rLCBnc3RfcnRwX3NzcmNfZGVtdXhfcnRjcF9jaGFpbik7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChkZW11eC0+cnRjcF9zaW5rLCBnc3RfcnRwX3NzcmNfZGVtdXhfc2lua19ldmVudCk7CisgIGdzdF9wYWRfc2V0X2l0ZXJhdGVfaW50ZXJuYWxfbGlua3NfZnVuY3Rpb24gKGRlbXV4LT5ydGNwX3NpbmssCisgICAgICBnc3RfcnRwX3NzcmNfZGVtdXhfaXRlcmF0ZV9pbnRlcm5hbF9saW5rc19zaW5rKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCBkZW11eC0+cnRjcF9zaW5rKTsKKworICBnX3JlY19tdXRleF9pbml0ICgmZGVtdXgtPnBhZGxvY2spOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zc3JjX2RlbXV4X3Jlc2V0IChHc3RSdHBTc3JjRGVtdXggKiBkZW11eCkKK3sKKyAgR1NMaXN0ICp3YWxrOworCisgIGZvciAod2FsayA9IGRlbXV4LT5zcmNwYWRzOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJ0cFNzcmNEZW11eFBhZCAqZHBhZCA9IChHc3RSdHBTc3JjRGVtdXhQYWQgKikgd2Fsay0+ZGF0YTsKKworICAgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoZHBhZC0+cnRwX3BhZCwgRkFMU0UpOworICAgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoZHBhZC0+cnRjcF9wYWQsIEZBTFNFKTsKKworICAgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSwgZHBhZC0+cnRwX3BhZCk7CisgICAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCBkcGFkLT5ydGNwX3BhZCk7CisgICAgZ19mcmVlIChkcGFkKTsKKyAgfQorICBnX3NsaXN0X2ZyZWUgKGRlbXV4LT5zcmNwYWRzKTsKKyAgZGVtdXgtPnNyY3BhZHMgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zc3JjX2RlbXV4X2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cFNzcmNEZW11eCAqZGVtdXg7CisKKyAgZGVtdXggPSBHU1RfUlRQX1NTUkNfREVNVVggKG9iamVjdCk7CisKKyAgZ3N0X3J0cF9zc3JjX2RlbXV4X3Jlc2V0IChkZW11eCk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3NzcmNfZGVtdXhfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cFNzcmNEZW11eCAqZGVtdXg7CisKKyAgZGVtdXggPSBHU1RfUlRQX1NTUkNfREVNVVggKG9iamVjdCk7CisgIGdfcmVjX211dGV4X2NsZWFyICgmZGVtdXgtPnBhZGxvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc3NyY19kZW11eF9jbGVhcl9zc3JjIChHc3RSdHBTc3JjRGVtdXggKiBkZW11eCwgZ3VpbnQzMiBzc3JjKQoreworICBHc3RSdHBTc3JjRGVtdXhQYWQgKmRwYWQ7CisKKyAgR1NUX1BBRF9MT0NLIChkZW11eCk7CisgIGRwYWQgPSBmaW5kX2RlbXV4X3BhZF9mb3Jfc3NyYyAoZGVtdXgsIHNzcmMpOworICBpZiAoZHBhZCA9PSBOVUxMKSB7CisgICAgR1NUX1BBRF9VTkxPQ0sgKGRlbXV4KTsKKyAgICBnb3RvIHVua25vd25fcGFkOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJjbGVhcmluZyBwYWQgZm9yIFNTUkMgJTA4eCIsIHNzcmMpOworCisgIGRlbXV4LT5zcmNwYWRzID0gZ19zbGlzdF9yZW1vdmUgKGRlbXV4LT5zcmNwYWRzLCBkcGFkKTsKKyAgR1NUX1BBRF9VTkxPQ0sgKGRlbXV4KTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKGRwYWQtPnJ0cF9wYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChkcGFkLT5ydGNwX3BhZCwgRkFMU0UpOworCisgIGdfc2lnbmFsX2VtaXQgKEdfT0JKRUNUIChkZW11eCksCisgICAgICBnc3RfcnRwX3NzcmNfZGVtdXhfc2lnbmFsc1tTSUdOQUxfUkVNT1ZFRF9TU1JDX1BBRF0sIDAsIHNzcmMsCisgICAgICBkcGFkLT5ydHBfcGFkKTsKKworICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChkZW11eCksIGRwYWQtPnJ0cF9wYWQpOworICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChkZW11eCksIGRwYWQtPnJ0Y3BfcGFkKTsKKworICBnX2ZyZWUgKGRwYWQpOworCisgIHJldHVybjsKKworICAvKiBFUlJPUlMgKi8KK3Vua25vd25fcGFkOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgInVua25vd24gU1NSQyAlMDh4Iiwgc3NyYyk7CisgICAgcmV0dXJuOworICB9Cit9CisKK3N0cnVjdCBGb3J3YXJkRXZlbnREYXRhCit7CisgIEdzdFJ0cFNzcmNEZW11eCAqZGVtdXg7CisgIEdzdEV2ZW50ICpldmVudDsKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RQYWQgKnBhZDsKK307CisKK3N0YXRpYyBnYm9vbGVhbgorZm9yd2FyZF9ldmVudCAoR3N0UGFkICogcGFkLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIHN0cnVjdCBGb3J3YXJkRXZlbnREYXRhICpmZGF0YSA9IHVzZXJfZGF0YTsKKyAgR1NMaXN0ICp3YWxrID0gTlVMTDsKKyAgR3N0RXZlbnQgKm5ld2V2ZW50ID0gTlVMTDsKKworICBHU1RfUEFEX0xPQ0sgKGZkYXRhLT5kZW11eCk7CisgIGZvciAod2FsayA9IGZkYXRhLT5kZW11eC0+c3JjcGFkczsgd2Fsazsgd2FsayA9IHdhbGstPm5leHQpIHsKKyAgICBHc3RSdHBTc3JjRGVtdXhQYWQgKmRwYWQgPSAoR3N0UnRwU3NyY0RlbXV4UGFkICopIHdhbGstPmRhdGE7CisKKyAgICAvKiBPbmx5IGZvcndhcmQgdGhlIGV2ZW50IGlmIHRoZSBpbml0aWFsIGV2ZW50cyBoYXZlIGJlZW4gdGhyb3VnaCBmaXJzdCwKKyAgICAgKiB0aGUgaW5pdGlhbCBldmVudHMgc2hvdWxkIGJlIGZvcndhcmRlZCBiZWZvcmUgYW55IG90aGVyIGV2ZW50CisgICAgICogb3IgYnVmZmVyIGlzIHB1c2hlZCAqLworICAgIGlmICgocGFkID09IGRwYWQtPnJ0cF9wYWQgJiYgZHBhZC0+cHVzaGVkX2luaXRpYWxfcnRwX2V2ZW50cykgfHwKKyAgICAgICAgKHBhZCA9PSBkcGFkLT5ydGNwX3BhZCAmJiBkcGFkLT5wdXNoZWRfaW5pdGlhbF9ydGNwX2V2ZW50cykpIHsKKyAgICAgIG5ld2V2ZW50ID0gYWRkX3NzcmNfYW5kX3JlZiAoZmRhdGEtPmV2ZW50LCBkcGFkLT5zc3JjKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBHU1RfUEFEX1VOTE9DSyAoZmRhdGEtPmRlbXV4KTsKKworICBpZiAobmV3ZXZlbnQpCisgICAgZmRhdGEtPnJlcyAmPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHBhZCwgbmV3ZXZlbnQpOworCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9zc3JjX2RlbXV4X3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFJ0cFNzcmNEZW11eCAqZGVtdXg7CisgIHN0cnVjdCBGb3J3YXJkRXZlbnREYXRhIGZkYXRhOworCisgIGRlbXV4ID0gR1NUX1JUUF9TU1JDX0RFTVVYIChwYXJlbnQpOworCisgIGZkYXRhLmRlbXV4ID0gZGVtdXg7CisgIGZkYXRhLnBhZCA9IHBhZDsKKyAgZmRhdGEuZXZlbnQgPSBldmVudDsKKyAgZmRhdGEucmVzID0gVFJVRTsKKworICBnc3RfcGFkX2ZvcndhcmQgKHBhZCwgZm9yd2FyZF9ldmVudCwgJmZkYXRhKTsKKworICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKworICByZXR1cm4gZmRhdGEucmVzOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9zc3JjX2RlbXV4X2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0UnRwU3NyY0RlbXV4ICpkZW11eDsKKyAgZ3VpbnQzMiBzc3JjOworICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisgIEdzdFBhZCAqc3JjcGFkOworICBHc3RSdHBTc3JjRGVtdXhQYWQgKmRwYWQ7CisKKyAgZGVtdXggPSBHU1RfUlRQX1NTUkNfREVNVVggKHBhcmVudCk7CisKKyAgaWYgKCFnc3RfcnRwX2J1ZmZlcl9tYXAgKGJ1ZiwgR1NUX01BUF9SRUFELCAmcnRwKSkKKyAgICBnb3RvIGludmFsaWRfcGF5bG9hZDsKKworICBzc3JjID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3NzcmMgKCZydHApOworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJyZWNlaXZlZCBidWZmZXIgb2YgU1NSQyAlMDh4Iiwgc3NyYyk7CisKKyAgc3JjcGFkID0gZmluZF9vcl9jcmVhdGVfZGVtdXhfcGFkX2Zvcl9zc3JjIChkZW11eCwgc3NyYywgUlRQX1BBRCk7CisgIGlmIChzcmNwYWQgPT0gTlVMTCkKKyAgICBnb3RvIGNyZWF0ZV9mYWlsZWQ7CisKKyAgLyogcHVzaCB0byBzcmNwYWQgKi8KKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChzcmNwYWQsIGJ1Zik7CisKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgIC8qIGNoZWNrIGlmIHRoZSBzc3JjIHN0aWxsIHRoZXJlLCBtYXkgaGF2ZSBiZWVuIHJlbW92ZWQgKi8KKyAgICBHU1RfUEFEX0xPQ0sgKGRlbXV4KTsKKyAgICBkcGFkID0gZmluZF9kZW11eF9wYWRfZm9yX3NzcmMgKGRlbXV4LCBzc3JjKTsKKyAgICBpZiAoZHBhZCA9PSBOVUxMIHx8IGRwYWQtPnJ0cF9wYWQgIT0gc3JjcGFkKSB7CisgICAgICAvKiBTU1JDIHdhcyByZW1vdmVkIGR1cmluZyB0aGUgcHVzaCAuLi4gaWdub3JlIHRoZSBlcnJvciAqLworICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgfQorICAgIEdTVF9QQURfVU5MT0NLIChkZW11eCk7CisgIH0KKworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX3BheWxvYWQ6CisgIHsKKyAgICAvKiB0aGlzIGlzIGZhdGFsIGFuZCBzaG91bGQgYmUgZmlsdGVyZWQgZWFybGllciAqLworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZW11eCwgU1RSRUFNLCBERUNPREUsIChOVUxMKSwKKyAgICAgICAgKCJEcm9wcGluZyBpbnZhbGlkIFJUUCBwYXlsb2FkIikpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CitjcmVhdGVfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlbXV4LCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLAorICAgICAgICAoIkNvdWxkIG5vdCBjcmVhdGUgbmV3IHBhZCIpKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9zc3JjX2RlbXV4X3J0Y3BfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdFJ0cFNzcmNEZW11eCAqZGVtdXg7CisgIGd1aW50MzIgc3NyYzsKKyAgR3N0UlRDUFBhY2tldCBwYWNrZXQ7CisgIEdzdFJUQ1BCdWZmZXIgcnRjcCA9IHsgTlVMTCwgfTsKKyAgR3N0UGFkICpzcmNwYWQ7CisgIEdzdFJ0cFNzcmNEZW11eFBhZCAqZHBhZDsKKworICBkZW11eCA9IEdTVF9SVFBfU1NSQ19ERU1VWCAocGFyZW50KTsKKworICBpZiAoIWdzdF9ydGNwX2J1ZmZlcl92YWxpZGF0ZV9yZWR1Y2VkIChidWYpKQorICAgIGdvdG8gaW52YWxpZF9ydGNwOworCisgIGdzdF9ydGNwX2J1ZmZlcl9tYXAgKGJ1ZiwgR1NUX01BUF9SRUFELCAmcnRjcCk7CisgIGlmICghZ3N0X3J0Y3BfYnVmZmVyX2dldF9maXJzdF9wYWNrZXQgKCZydGNwLCAmcGFja2V0KSkgeworICAgIGdzdF9ydGNwX2J1ZmZlcl91bm1hcCAoJnJ0Y3ApOworICAgIGdvdG8gaW52YWxpZF9ydGNwOworICB9CisKKyAgLyogZmlyc3QgcGFja2V0IG11c3QgYmUgU1Igb3IgUlIsIG9yIGluIGNhc2Ugb2YgYSByZWR1Y2VkIHNpemUgUlRDUCBwYWNrZXQKKyAgICogaXQgbXVzdCBiZSBBUFAsIFJUUEZCIG9yIFBTRkIgZmVlYWRiYWNrLCBvciBlbHNlIHRoZSB2YWxpZGF0ZSB3b3VsZAorICAgKiBoYXZlIGZhaWxlZCAqLworICBzd2l0Y2ggKGdzdF9ydGNwX3BhY2tldF9nZXRfdHlwZSAoJnBhY2tldCkpIHsKKyAgICBjYXNlIEdTVF9SVENQX1RZUEVfU1I6CisgICAgICAvKiBnZXQgdGhlIHNzcmMgc28gdGhhdCB3ZSBjYW4gcm91dGUgaXQgdG8gdGhlIHJpZ2h0IHNvdXJjZSBwYWQgKi8KKyAgICAgIGdzdF9ydGNwX3BhY2tldF9zcl9nZXRfc2VuZGVyX2luZm8gKCZwYWNrZXQsICZzc3JjLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUlRDUF9UWVBFX1JSOgorICAgICAgc3NyYyA9IGdzdF9ydGNwX3BhY2tldF9ycl9nZXRfc3NyYyAoJnBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9SVENQX1RZUEVfQVBQOgorICAgIGNhc2UgR1NUX1JUQ1BfVFlQRV9SVFBGQjoKKyAgICBjYXNlIEdTVF9SVENQX1RZUEVfUFNGQjoKKyAgICAgIHNzcmMgPSBnc3RfcnRjcF9wYWNrZXRfZmJfZ2V0X3NlbmRlcl9zc3JjICgmcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnb3RvIHVuZXhwZWN0ZWRfcnRjcDsKKyAgfQorICBnc3RfcnRjcF9idWZmZXJfdW5tYXAgKCZydGNwKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInJlY2VpdmVkIFJUQ1Agb2YgU1NSQyAlMDh4Iiwgc3NyYyk7CisKKyAgc3JjcGFkID0gZmluZF9vcl9jcmVhdGVfZGVtdXhfcGFkX2Zvcl9zc3JjIChkZW11eCwgc3NyYywgUlRDUF9QQUQpOworICBpZiAoc3JjcGFkID09IE5VTEwpCisgICAgZ290byBjcmVhdGVfZmFpbGVkOworCisgIC8qIHB1c2ggdG8gc3JjcGFkICovCisgIHJldCA9IGdzdF9wYWRfcHVzaCAoc3JjcGFkLCBidWYpOworCisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAvKiBjaGVjayBpZiB0aGUgc3NyYyBzdGlsbCB0aGVyZSwgbWF5IGhhdmUgYmVlbiByZW1vdmVkICovCisgICAgR1NUX1BBRF9MT0NLIChkZW11eCk7CisgICAgZHBhZCA9IGZpbmRfZGVtdXhfcGFkX2Zvcl9zc3JjIChkZW11eCwgc3NyYyk7CisgICAgaWYgKGRwYWQgPT0gTlVMTCB8fCBkcGFkLT5ydGNwX3BhZCAhPSBzcmNwYWQpIHsKKyAgICAgIC8qIFNTUkMgd2FzIHJlbW92ZWQgZHVyaW5nIHRoZSBwdXNoIC4uLiBpZ25vcmUgdGhlIGVycm9yICovCisgICAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICB9CisgICAgR1NUX1BBRF9VTkxPQ0sgKGRlbXV4KTsKKyAgfQorCisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfcnRjcDoKKyAgeworICAgIC8qIHRoaXMgaXMgZmF0YWwgYW5kIHNob3VsZCBiZSBmaWx0ZXJlZCBlYXJsaWVyICovCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlbXV4LCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLAorICAgICAgICAoIkRyb3BwaW5nIGludmFsaWQgUlRDUCBwYWNrZXQiKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK3VuZXhwZWN0ZWRfcnRjcDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZHJvcHBpbmcgdW5leHBlY3RlZCBSVENQIHBhY2tldCIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CitjcmVhdGVfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlbXV4LCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLAorICAgICAgICAoIkNvdWxkIG5vdCBjcmVhdGUgbmV3IHBhZCIpKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgR3N0UnRwU3NyY0RlbXV4UGFkICoKK2ZpbmRfZGVtdXhfcGFkX2Zvcl9wYWQgKEdzdFJ0cFNzcmNEZW11eCAqIGRlbXV4LCBHc3RQYWQgKiBwYWQpCit7CisgIEdTTGlzdCAqd2FsazsKKworICBmb3IgKHdhbGsgPSBkZW11eC0+c3JjcGFkczsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RSdHBTc3JjRGVtdXhQYWQgKmRwYWQgPSAoR3N0UnRwU3NyY0RlbXV4UGFkICopIHdhbGstPmRhdGE7CisgICAgaWYgKGRwYWQtPnJ0cF9wYWQgPT0gcGFkIHx8IGRwYWQtPnJ0Y3BfcGFkID09IHBhZCkgeworICAgICAgcmV0dXJuIGRwYWQ7CisgICAgfQorICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3NzcmNfZGVtdXhfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBTc3JjRGVtdXggKmRlbXV4OworICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgZGVtdXggPSBHU1RfUlRQX1NTUkNfREVNVVggKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNOgorICAgIGNhc2UgR1NUX0VWRU5UX0NVU1RPTV9CT1RIOgorICAgIGNhc2UgR1NUX0VWRU5UX0NVU1RPTV9CT1RIX09PQjoKKyAgICAgIHMgPSBnc3RfZXZlbnRfZ2V0X3N0cnVjdHVyZSAoZXZlbnQpOworICAgICAgaWYgKHMgJiYgIWdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAic3NyYyIpKSB7CisgICAgICAgIEdzdFJ0cFNzcmNEZW11eFBhZCAqZHBhZCA9IGZpbmRfZGVtdXhfcGFkX2Zvcl9wYWQgKGRlbXV4LCBwYWQpOworCisgICAgICAgIGlmIChkcGFkKSB7CisgICAgICAgICAgR3N0U3RydWN0dXJlICp3czsKKworICAgICAgICAgIGV2ZW50ID0gZ3N0X2V2ZW50X21ha2Vfd3JpdGFibGUgKGV2ZW50KTsKKyAgICAgICAgICB3cyA9IGdzdF9ldmVudF93cml0YWJsZV9zdHJ1Y3R1cmUgKGV2ZW50KTsKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAod3MsICJzc3JjIiwgR19UWVBFX1VJTlQsIGRwYWQtPnNzcmMsIE5VTEwpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworfQorCitzdGF0aWMgR3N0SXRlcmF0b3IgKgorZ3N0X3J0cF9zc3JjX2RlbXV4X2l0ZXJhdGVfaW50ZXJuYWxfbGlua3Nfc3JjIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCkKK3sKKyAgR3N0UnRwU3NyY0RlbXV4ICpkZW11eDsKKyAgR3N0UGFkICpvdGhlcnBhZCA9IE5VTEw7CisgIEdzdEl0ZXJhdG9yICppdCA9IE5VTEw7CisgIEdTTGlzdCAqY3VycmVudDsKKworICBkZW11eCA9IEdTVF9SVFBfU1NSQ19ERU1VWCAocGFyZW50KTsKKworICBHU1RfUEFEX0xPQ0sgKGRlbXV4KTsKKyAgZm9yIChjdXJyZW50ID0gZGVtdXgtPnNyY3BhZHM7IGN1cnJlbnQ7IGN1cnJlbnQgPSBnX3NsaXN0X25leHQgKGN1cnJlbnQpKSB7CisgICAgR3N0UnRwU3NyY0RlbXV4UGFkICpkcGFkID0gKEdzdFJ0cFNzcmNEZW11eFBhZCAqKSBjdXJyZW50LT5kYXRhOworCisgICAgaWYgKHBhZCA9PSBkcGFkLT5ydHBfcGFkKSB7CisgICAgICBvdGhlcnBhZCA9IGRlbXV4LT5ydHBfc2luazsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSBpZiAocGFkID09IGRwYWQtPnJ0Y3BfcGFkKSB7CisgICAgICBvdGhlcnBhZCA9IGRlbXV4LT5ydGNwX3Npbms7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKG90aGVycGFkKSB7CisgICAgR1ZhbHVlIHZhbCA9IHsgMCwgfTsKKworICAgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR1NUX1RZUEVfUEFEKTsKKyAgICBnX3ZhbHVlX3NldF9vYmplY3QgKCZ2YWwsIG90aGVycGFkKTsKKyAgICBpdCA9IGdzdF9pdGVyYXRvcl9uZXdfc2luZ2xlIChHU1RfVFlQRV9QQUQsICZ2YWwpOworICAgIGdfdmFsdWVfdW5zZXQgKCZ2YWwpOworCisgIH0KKyAgR1NUX1BBRF9VTkxPQ0sgKGRlbXV4KTsKKworICByZXR1cm4gaXQ7Cit9CisKKy8qIFNob3VsZCByZXR1cm4gMCBmb3IgZWxlbWVudHMgdG8gYmUgaW5jbHVkZWQgKi8KK3N0YXRpYyBnaW50CitzcmNfcGFkX2NvbXBhcmVfZnVuYyAoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIpCit7CisgIEdzdFBhZCAqcGFkID0gR1NUX1BBRCAoZ192YWx1ZV9nZXRfb2JqZWN0IChhKSk7CisgIGNvbnN0IGdjaGFyICpwcmVmaXggPSBnX3ZhbHVlX2dldF9zdHJpbmcgKGIpOworICBnaW50IHJlczsKKworICAvKiAwIG1lYW5zIGVxdWFsIG1lYW5zIHdlIGFjY2VwdCB0aGUgcGFkLCBhY2NlcHRlZCBpZiB0aGVyZSBpcyBhIG5hbWUKKyAgICogYW5kIGl0IHN0YXJ0cyB3aXRoIHRoZSBwcmVmaXggKi8KKyAgR1NUX09CSkVDVF9MT0NLIChwYWQpOworICByZXMgPSAhR1NUX1BBRF9OQU1FIChwYWQpIHx8ICFnX3N0cl9oYXNfcHJlZml4IChHU1RfUEFEX05BTUUgKHBhZCksIHByZWZpeCk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChwYWQpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RJdGVyYXRvciAqCitnc3RfcnRwX3NzcmNfZGVtdXhfaXRlcmF0ZV9pbnRlcm5hbF9saW5rc19zaW5rIChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50KQoreworICBHc3RSdHBTc3JjRGVtdXggKmRlbXV4OworICBHc3RJdGVyYXRvciAqaXQgPSBOVUxMOworICBHVmFsdWUgZ3ZhbCA9IHsgMCwgfTsKKworICBkZW11eCA9IEdTVF9SVFBfU1NSQ19ERU1VWCAocGFyZW50KTsKKworICBnX3ZhbHVlX2luaXQgKCZndmFsLCBHX1RZUEVfU1RSSU5HKTsKKyAgaWYgKHBhZCA9PSBkZW11eC0+cnRwX3NpbmspCisgICAgZ192YWx1ZV9zZXRfc3RhdGljX3N0cmluZyAoJmd2YWwsICJzcmNfIik7CisgIGVsc2UgaWYgKHBhZCA9PSBkZW11eC0+cnRjcF9zaW5rKQorICAgIGdfdmFsdWVfc2V0X3N0YXRpY19zdHJpbmcgKCZndmFsLCAicnRjcF9zcmNfIik7CisgIGVsc2UKKyAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKworICBpdCA9IGdzdF9lbGVtZW50X2l0ZXJhdGVfc3JjX3BhZHMgKEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSk7CisgIGl0ID0gZ3N0X2l0ZXJhdG9yX2ZpbHRlciAoaXQsIHNyY19wYWRfY29tcGFyZV9mdW5jLCAmZ3ZhbCk7CisKKyAgcmV0dXJuIGl0OworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9zc3JjX2RlbXV4X3NyY19xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0UnRwU3NyY0RlbXV4ICpkZW11eDsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgZGVtdXggPSBHU1RfUlRQX1NTUkNfREVNVVggKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfTEFURU5DWToKKyAgICB7CisKKyAgICAgIGlmICgocmVzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5IChkZW11eC0+cnRwX3NpbmssIHF1ZXJ5KSkpIHsKKyAgICAgICAgZ2Jvb2xlYW4gbGl2ZTsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIG1pbl9sYXRlbmN5LCBtYXhfbGF0ZW5jeTsKKyAgICAgICAgR3N0UnRwU3NyY0RlbXV4UGFkICpkZW11eHBhZDsKKworICAgICAgICBkZW11eHBhZCA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKworICAgICAgICBnc3RfcXVlcnlfcGFyc2VfbGF0ZW5jeSAocXVlcnksICZsaXZlLCAmbWluX2xhdGVuY3ksICZtYXhfbGF0ZW5jeSk7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJwZWVyIG1pbiBsYXRlbmN5ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKG1pbl9sYXRlbmN5KSk7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJsYXRlbmN5IGZvciBTU1JDICUwOHgiLCBkZW11eHBhZC0+c3NyYyk7CisKKyAgICAgICAgZ3N0X3F1ZXJ5X3NldF9sYXRlbmN5IChxdWVyeSwgbGl2ZSwgbWluX2xhdGVuY3ksIG1heF9sYXRlbmN5KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfc3NyY19kZW11eF9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0UnRwU3NyY0RlbXV4ICpkZW11eDsKKworICBkZW11eCA9IEdTVF9SVFBfU1NSQ19ERU1VWCAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1BMQVlJTkc6CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9ydHBfc3NyY19kZW11eF9yZXNldCAoZGVtdXgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguaCBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZGY0NDQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguaApAQCAtMCwwICsxLDYwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfU1NSQ19ERU1VWF9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1NTUkNfREVNVVhfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1NTUkNfREVNVVggICAgICAgICAgICAoZ3N0X3J0cF9zc3JjX2RlbXV4X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfU1NSQ19ERU1VWChvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9TU1JDX0RFTVVYLEdzdFJ0cFNzcmNEZW11eCkpCisjZGVmaW5lIEdTVF9SVFBfU1NSQ19ERU1VWF9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX1NTUkNfREVNVVgsR3N0UnRwU3NyY0RlbXV4Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1NTUkNfREVNVVgob2JqKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfU1NSQ19ERU1VWCkpCisjZGVmaW5lIEdTVF9JU19SVFBfU1NSQ19ERU1VWF9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX1NTUkNfREVNVVgpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU3NyY0RlbXV4IEdzdFJ0cFNzcmNEZW11eDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBTc3JjRGVtdXhDbGFzcyBHc3RSdHBTc3JjRGVtdXhDbGFzczsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBTc3JjRGVtdXhQYWQgR3N0UnRwU3NyY0RlbXV4UGFkOworCitzdHJ1Y3QgX0dzdFJ0cFNzcmNEZW11eAoreworICBHc3RFbGVtZW50IHBhcmVudDsKKworICBHc3RQYWQgKnJ0cF9zaW5rOworICBHc3RQYWQgKnJ0Y3Bfc2luazsKKworICBHUmVjTXV0ZXggcGFkbG9jazsKKyAgR1NMaXN0ICpzcmNwYWRzOworfTsKKworc3RydWN0IF9Hc3RSdHBTc3JjRGVtdXhDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworCisgIC8qIHNpZ25hbHMgKi8KKyAgdm9pZCAoKm5ld19zc3JjX3BhZCkgICAgIChHc3RSdHBTc3JjRGVtdXggKmRlbXV4LCBndWludDMyIHNzcmMsIEdzdFBhZCAqcGFkKTsKKyAgdm9pZCAoKnJlbW92ZWRfc3NyY19wYWQpIChHc3RSdHBTc3JjRGVtdXggKmRlbXV4LCBndWludDMyIHNzcmMsIEdzdFBhZCAqcGFkKTsKKworICAvKiBhY3Rpb25zICovCisgIHZvaWQgKCpjbGVhcl9zc3JjKSAgICAgICAoR3N0UnRwU3NyY0RlbXV4ICpkZW11eCwgZ3VpbnQzMiBzc3JjKTsKK307CisKK0dUeXBlIGdzdF9ydHBfc3NyY19kZW11eF9nZXRfdHlwZSAodm9pZCk7CisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfU1NSQ19ERU1VWF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHBtYW5hZ2VyL21lc29uLmJ1aWxkIGIvZ3N0L3J0cG1hbmFnZXIvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE1NmYzNwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHBtYW5hZ2VyL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMjYgQEAKK3J0cG1hbmFnZXJfc291cmNlcyA9IFsKKyAgJ2dzdHJ0cG1hbmFnZXIuYycsCisgICdnc3RydHBiaW4uYycsCisgICdnc3RydHBkdG1mbXV4LmMnLAorICAnZ3N0cnRwaml0dGVyYnVmZmVyLmMnLAorICAnZ3N0cnRwbXV4LmMnLAorICAnZ3N0cnRwcHRkZW11eC5jJywKKyAgJ2dzdHJ0cHJ0eHF1ZXVlLmMnLAorICAnZ3N0cnRwcnR4cmVjZWl2ZS5jJywKKyAgJ2dzdHJ0cHJ0eHNlbmQuYycsCisgICdnc3RydHBzc3JjZGVtdXguYycsCisgICdydHBqaXR0ZXJidWZmZXIuYycsCisgICdydHBzZXNzaW9uLmMnLAorICAncnRwc291cmNlLmMnLAorICAncnRwc3RhdHMuYycsCisgICdnc3RydHBzZXNzaW9uLmMnLAorXQorCitnc3RydHBtYW5hZ2VyID0gbGlicmFyeSgnZ3N0cnRwbWFuYWdlcicsCisgIHJ0cG1hbmFnZXJfc291cmNlcywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luYywgbGlic2luY10sCisgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgZ3N0bmV0X2RlcCwgZ3N0cnRwX2RlcCwgZ2lvX2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYyBiL2dzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMTg3ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYwpAQCAtMCwwICsxLDEyOTcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0Y3BidWZmZXIuaD4KKworI2luY2x1ZGUgInJ0cGppdHRlcmJ1ZmZlci5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBfaml0dGVyX2J1ZmZlcl9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBydHBfaml0dGVyX2J1ZmZlcl9kZWJ1ZworCisjZGVmaW5lIE1BWF9XSU5ET1cJUlRQX0pJVFRFUl9CVUZGRVJfTUFYX1dJTkRPVworI2RlZmluZSBNQVhfVElNRQkoMiAqIEdTVF9TRUNPTkQpCisKKy8qIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgTEFTVF9TSUdOQUwKK307CisKK2VudW0KK3sKKyAgUFJPUF8wCit9OworCisvKiBHT2JqZWN0IHZtZXRob2RzICovCitzdGF0aWMgdm9pZCBydHBfaml0dGVyX2J1ZmZlcl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK0dUeXBlCitydHBfaml0dGVyX2J1ZmZlcl9tb2RlX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgaml0dGVyX2J1ZmZlcl9tb2RlX3R5cGUgPSAwOworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSBqaXR0ZXJfYnVmZmVyX21vZGVzW10gPSB7CisgICAge1JUUF9KSVRURVJfQlVGRkVSX01PREVfTk9ORSwgIk9ubHkgdXNlIFJUUCB0aW1lc3RhbXBzIiwgIm5vbmUifSwKKyAgICB7UlRQX0pJVFRFUl9CVUZGRVJfTU9ERV9TTEFWRSwgIlNsYXZlIHJlY2VpdmVyIHRvIHNlbmRlciBjbG9jayIsICJzbGF2ZSJ9LAorICAgIHtSVFBfSklUVEVSX0JVRkZFUl9NT0RFX0JVRkZFUiwgIkRvIGxvdy9oaWdoIHdhdGVybWFyayBidWZmZXJpbmciLAorICAgICAgICAiYnVmZmVyIn0sCisgICAge1JUUF9KSVRURVJfQlVGRkVSX01PREVfU1lOQ0VELCAiU3luY2hyb25pemVkIHNlbmRlciBhbmQgcmVjZWl2ZXIgY2xvY2tzIiwKKyAgICAgICAgInN5bmNlZCJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIWppdHRlcl9idWZmZXJfbW9kZV90eXBlKSB7CisgICAgaml0dGVyX2J1ZmZlcl9tb2RlX3R5cGUgPQorICAgICAgICBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiUlRQSml0dGVyQnVmZmVyTW9kZSIsIGppdHRlcl9idWZmZXJfbW9kZXMpOworICB9CisgIHJldHVybiBqaXR0ZXJfYnVmZmVyX21vZGVfdHlwZTsKK30KKworLyogc3RhdGljIGd1aW50IHJ0cF9qaXR0ZXJfYnVmZmVyX3NpZ25hbHNbTEFTVF9TSUdOQUxdID0geyAwIH07ICovCisKK0dfREVGSU5FX1RZUEUgKFJUUEppdHRlckJ1ZmZlciwgcnRwX2ppdHRlcl9idWZmZXIsIEdfVFlQRV9PQkpFQ1QpOworCitzdGF0aWMgdm9pZAorcnRwX2ppdHRlcl9idWZmZXJfY2xhc3NfaW5pdCAoUlRQSml0dGVyQnVmZmVyQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gcnRwX2ppdHRlcl9idWZmZXJfZmluYWxpemU7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cF9qaXR0ZXJfYnVmZmVyX2RlYnVnLCAicnRwaml0dGVyYnVmZmVyIiwgMCwKKyAgICAgICJSVFAgSml0dGVyIEJ1ZmZlciIpOworfQorCitzdGF0aWMgdm9pZAorcnRwX2ppdHRlcl9idWZmZXJfaW5pdCAoUlRQSml0dGVyQnVmZmVyICogamJ1ZikKK3sKKyAgZ19tdXRleF9pbml0ICgmamJ1Zi0+Y2xvY2tfbG9jayk7CisKKyAgamJ1Zi0+cGFja2V0cyA9IGdfcXVldWVfbmV3ICgpOworICBqYnVmLT5tb2RlID0gUlRQX0pJVFRFUl9CVUZGRVJfTU9ERV9TTEFWRTsKKworICBydHBfaml0dGVyX2J1ZmZlcl9yZXNldF9za2V3IChqYnVmKTsKK30KKworc3RhdGljIHZvaWQKK3J0cF9qaXR0ZXJfYnVmZmVyX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBSVFBKaXR0ZXJCdWZmZXIgKmpidWY7CisKKyAgamJ1ZiA9IFJUUF9KSVRURVJfQlVGRkVSX0NBU1QgKG9iamVjdCk7CisKKyAgaWYgKGpidWYtPm1lZGlhX2Nsb2NrX3N5bmNlZF9pZCkKKyAgICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QgKGpidWYtPm1lZGlhX2Nsb2NrLAorICAgICAgICBqYnVmLT5tZWRpYV9jbG9ja19zeW5jZWRfaWQpOworICBpZiAoamJ1Zi0+bWVkaWFfY2xvY2spCisgICAgZ3N0X29iamVjdF91bnJlZiAoamJ1Zi0+bWVkaWFfY2xvY2spOworCisgIGlmIChqYnVmLT5waXBlbGluZV9jbG9jaykKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChqYnVmLT5waXBlbGluZV9jbG9jayk7CisKKyAgZ19xdWV1ZV9mcmVlIChqYnVmLT5wYWNrZXRzKTsKKworICBnX211dGV4X2NsZWFyICgmamJ1Zi0+Y2xvY2tfbG9jayk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHJ0cF9qaXR0ZXJfYnVmZmVyX3BhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCisvKioKKyAqIHJ0cF9qaXR0ZXJfYnVmZmVyX25ldzoKKyAqCisgKiBDcmVhdGUgYW4gI1JUUEppdHRlckJ1ZmZlci4KKyAqCisgKiBSZXR1cm5zOiBhIG5ldyAjUlRQSml0dGVyQnVmZmVyLiBVc2UgZ19vYmplY3RfdW5yZWYoKSBhZnRlciB1c2FnZS4KKyAqLworUlRQSml0dGVyQnVmZmVyICoKK3J0cF9qaXR0ZXJfYnVmZmVyX25ldyAodm9pZCkKK3sKKyAgUlRQSml0dGVyQnVmZmVyICpqYnVmOworCisgIGpidWYgPSBnX29iamVjdF9uZXcgKFJUUF9UWVBFX0pJVFRFUl9CVUZGRVIsIE5VTEwpOworCisgIHJldHVybiBqYnVmOworfQorCisvKioKKyAqIHJ0cF9qaXR0ZXJfYnVmZmVyX2dldF9tb2RlOgorICogQGpidWY6IGFuICNSVFBKaXR0ZXJCdWZmZXIKKyAqCisgKiBHZXQgdGhlIGN1cnJlbnQgaml0dGVyYnVmZmVyIG1vZGUuCisgKgorICogUmV0dXJuczogdGhlIGN1cnJlbnQgaml0dGVyYnVmZmVyIG1vZGUuCisgKi8KK1JUUEppdHRlckJ1ZmZlck1vZGUKK3J0cF9qaXR0ZXJfYnVmZmVyX2dldF9tb2RlIChSVFBKaXR0ZXJCdWZmZXIgKiBqYnVmKQoreworICByZXR1cm4gamJ1Zi0+bW9kZTsKK30KKworLyoqCisgKiBydHBfaml0dGVyX2J1ZmZlcl9zZXRfbW9kZToKKyAqIEBqYnVmOiBhbiAjUlRQSml0dGVyQnVmZmVyCisgKiBAbW9kZTogYSAjUlRQSml0dGVyQnVmZmVyTW9kZQorICoKKyAqIFNldCB0aGUgYnVmZmVyaW5nIGFuZCBjbG9jayBzbGF2aW5nIGFsZ29yaXRobSB1c2VkIGluIHRoZSBAamJ1Zi4KKyAqLwordm9pZAorcnRwX2ppdHRlcl9idWZmZXJfc2V0X21vZGUgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYsIFJUUEppdHRlckJ1ZmZlck1vZGUgbW9kZSkKK3sKKyAgamJ1Zi0+bW9kZSA9IG1vZGU7Cit9CisKK0dzdENsb2NrVGltZQorcnRwX2ppdHRlcl9idWZmZXJfZ2V0X2RlbGF5IChSVFBKaXR0ZXJCdWZmZXIgKiBqYnVmKQoreworICByZXR1cm4gamJ1Zi0+ZGVsYXk7Cit9CisKK3ZvaWQKK3J0cF9qaXR0ZXJfYnVmZmVyX3NldF9kZWxheSAoUlRQSml0dGVyQnVmZmVyICogamJ1ZiwgR3N0Q2xvY2tUaW1lIGRlbGF5KQoreworICBqYnVmLT5kZWxheSA9IGRlbGF5OworICBqYnVmLT5sb3dfbGV2ZWwgPSAoZGVsYXkgKiAxNSkgLyAxMDA7CisgIC8qIHRoZSBoaWdoIGxldmVsIGlzIGF0IDkwJSBpbiBvcmRlciB0byByZWxlYXNlIHBhY2tldHMgYmVmb3JlIHdlIGZpbGwgdXAgdGhlCisgICAqIGJ1ZmZlciB1cCB0byB0aGUgbGF0ZW5jeSAqLworICBqYnVmLT5oaWdoX2xldmVsID0gKGRlbGF5ICogOTApIC8gMTAwOworCisgIEdTVF9ERUJVRyAoImRlbGF5ICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBtaW4gJSIgR1NUX1RJTUVfRk9STUFUICIsIG1heCAlIgorICAgICAgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChqYnVmLT5kZWxheSksCisgICAgICBHU1RfVElNRV9BUkdTIChqYnVmLT5sb3dfbGV2ZWwpLCBHU1RfVElNRV9BUkdTIChqYnVmLT5oaWdoX2xldmVsKSk7Cit9CisKKy8qKgorICogcnRwX2ppdHRlcl9idWZmZXJfc2V0X2Nsb2NrX3JhdGU6CisgKiBAamJ1ZjogYW4gI1JUUEppdHRlckJ1ZmZlcgorICogQGNsb2NrX3JhdGU6IHRoZSBuZXcgY2xvY2sgcmF0ZQorICoKKyAqIFNldCB0aGUgY2xvY2sgcmF0ZSBpbiB0aGUgaml0dGVyYnVmZmVyLgorICovCit2b2lkCitydHBfaml0dGVyX2J1ZmZlcl9zZXRfY2xvY2tfcmF0ZSAoUlRQSml0dGVyQnVmZmVyICogamJ1ZiwgZ3VpbnQzMiBjbG9ja19yYXRlKQoreworICBpZiAoamJ1Zi0+Y2xvY2tfcmF0ZSAhPSBjbG9ja19yYXRlKSB7CisgICAgR1NUX0RFQlVHICgiQ2xvY2sgcmF0ZSBjaGFuZ2VkIGZyb20gJSIgR19HVUlOVDMyX0ZPUk1BVCAiIHRvICUiCisgICAgICAgIEdfR1VJTlQzMl9GT1JNQVQsIGpidWYtPmNsb2NrX3JhdGUsIGNsb2NrX3JhdGUpOworICAgIGpidWYtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX3Jlc2V0X3NrZXcgKGpidWYpOworICB9Cit9CisKKy8qKgorICogcnRwX2ppdHRlcl9idWZmZXJfZ2V0X2Nsb2NrX3JhdGU6CisgKiBAamJ1ZjogYW4gI1JUUEppdHRlckJ1ZmZlcgorICoKKyAqIEdldCB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZSBjbG9jayByYXRlIGluIEBqYnVmLgorICoKKyAqIFJldHVybnM6IHRoZSBjdXJyZW50IGNsb2NrLXJhdGUKKyAqLworZ3VpbnQzMgorcnRwX2ppdHRlcl9idWZmZXJfZ2V0X2Nsb2NrX3JhdGUgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYpCit7CisgIHJldHVybiBqYnVmLT5jbG9ja19yYXRlOworfQorCitzdGF0aWMgdm9pZAorbWVkaWFfY2xvY2tfc3luY2VkX2NiIChHc3RDbG9jayAqIGNsb2NrLCBnYm9vbGVhbiBzeW5jZWQsCisgICAgUlRQSml0dGVyQnVmZmVyICogamJ1ZikKK3sKKyAgR3N0Q2xvY2tUaW1lIGludGVybmFsLCBleHRlcm5hbDsKKworICBnX211dGV4X2xvY2sgKCZqYnVmLT5jbG9ja19sb2NrKTsKKyAgaWYgKGpidWYtPnBpcGVsaW5lX2Nsb2NrKSB7CisgICAgaW50ZXJuYWwgPSBnc3RfY2xvY2tfZ2V0X2ludGVybmFsX3RpbWUgKGpidWYtPm1lZGlhX2Nsb2NrKTsKKyAgICBleHRlcm5hbCA9IGdzdF9jbG9ja19nZXRfdGltZSAoamJ1Zi0+cGlwZWxpbmVfY2xvY2spOworCisgICAgZ3N0X2Nsb2NrX3NldF9jYWxpYnJhdGlvbiAoamJ1Zi0+bWVkaWFfY2xvY2ssIGludGVybmFsLCBleHRlcm5hbCwgMSwgMSk7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZqYnVmLT5jbG9ja19sb2NrKTsKK30KKworLyoqCisgKiBydHBfaml0dGVyX2J1ZmZlcl9zZXRfbWVkaWFfY2xvY2s6CisgKiBAamJ1ZjogYW4gI1JUUEppdHRlckJ1ZmZlcgorICogQGNsb2NrOiAodHJhbnNmZXIgZnVsbCk6IG1lZGlhICNHc3RDbG9jaworICogQGNsb2NrX29mZnNldDogUlRQIHRpbWUgYXQgY2xvY2sgZXBvY2ggb3IgLTEKKyAqCisgKiBTZXRzIHRoZSBtZWRpYSBjbG9jayBmb3IgdGhlIG1lZGlhIGFuZCB0aGUgY2xvY2sgb2Zmc2V0CisgKgorICovCit2b2lkCitydHBfaml0dGVyX2J1ZmZlcl9zZXRfbWVkaWFfY2xvY2sgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYsIEdzdENsb2NrICogY2xvY2ssCisgICAgZ3VpbnQ2NCBjbG9ja19vZmZzZXQpCit7CisgIGdfbXV0ZXhfbG9jayAoJmpidWYtPmNsb2NrX2xvY2spOworICBpZiAoamJ1Zi0+bWVkaWFfY2xvY2spIHsKKyAgICBpZiAoamJ1Zi0+bWVkaWFfY2xvY2tfc3luY2VkX2lkKQorICAgICAgZ19zaWduYWxfaGFuZGxlcl9kaXNjb25uZWN0IChqYnVmLT5tZWRpYV9jbG9jaywKKyAgICAgICAgICBqYnVmLT5tZWRpYV9jbG9ja19zeW5jZWRfaWQpOworICAgIGpidWYtPm1lZGlhX2Nsb2NrX3N5bmNlZF9pZCA9IDA7CisgICAgZ3N0X29iamVjdF91bnJlZiAoamJ1Zi0+bWVkaWFfY2xvY2spOworICB9CisgIGpidWYtPm1lZGlhX2Nsb2NrID0gY2xvY2s7CisgIGpidWYtPm1lZGlhX2Nsb2NrX29mZnNldCA9IGNsb2NrX29mZnNldDsKKworICBpZiAoamJ1Zi0+cGlwZWxpbmVfY2xvY2sgJiYgamJ1Zi0+bWVkaWFfY2xvY2sgJiYKKyAgICAgIGpidWYtPnBpcGVsaW5lX2Nsb2NrICE9IGpidWYtPm1lZGlhX2Nsb2NrKSB7CisgICAgamJ1Zi0+bWVkaWFfY2xvY2tfc3luY2VkX2lkID0KKyAgICAgICAgZ19zaWduYWxfY29ubmVjdCAoamJ1Zi0+bWVkaWFfY2xvY2ssICJzeW5jZWQiLAorICAgICAgICBHX0NBTExCQUNLIChtZWRpYV9jbG9ja19zeW5jZWRfY2IpLCBqYnVmKTsKKyAgICBpZiAoZ3N0X2Nsb2NrX2lzX3N5bmNlZCAoamJ1Zi0+bWVkaWFfY2xvY2spKSB7CisgICAgICBHc3RDbG9ja1RpbWUgaW50ZXJuYWwsIGV4dGVybmFsOworCisgICAgICBpbnRlcm5hbCA9IGdzdF9jbG9ja19nZXRfaW50ZXJuYWxfdGltZSAoamJ1Zi0+bWVkaWFfY2xvY2spOworICAgICAgZXh0ZXJuYWwgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKGpidWYtPnBpcGVsaW5lX2Nsb2NrKTsKKworICAgICAgZ3N0X2Nsb2NrX3NldF9jYWxpYnJhdGlvbiAoamJ1Zi0+bWVkaWFfY2xvY2ssIGludGVybmFsLCBleHRlcm5hbCwgMSwgMSk7CisgICAgfQorCisgICAgZ3N0X2Nsb2NrX3NldF9tYXN0ZXIgKGpidWYtPm1lZGlhX2Nsb2NrLCBqYnVmLT5waXBlbGluZV9jbG9jayk7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZqYnVmLT5jbG9ja19sb2NrKTsKK30KKworLyoqCisgKiBydHBfaml0dGVyX2J1ZmZlcl9zZXRfcGlwZWxpbmVfY2xvY2s6CisgKiBAamJ1ZjogYW4gI1JUUEppdHRlckJ1ZmZlcgorICogQGNsb2NrOiBwaXBlbGluZSAjR3N0Q2xvY2sKKyAqCisgKiBTZXRzIHRoZSBwaXBlbGluZSBjbG9jaworICoKKyAqLwordm9pZAorcnRwX2ppdHRlcl9idWZmZXJfc2V0X3BpcGVsaW5lX2Nsb2NrIChSVFBKaXR0ZXJCdWZmZXIgKiBqYnVmLCBHc3RDbG9jayAqIGNsb2NrKQoreworICBnX211dGV4X2xvY2sgKCZqYnVmLT5jbG9ja19sb2NrKTsKKyAgaWYgKGpidWYtPnBpcGVsaW5lX2Nsb2NrKQorICAgIGdzdF9vYmplY3RfdW5yZWYgKGpidWYtPnBpcGVsaW5lX2Nsb2NrKTsKKyAgamJ1Zi0+cGlwZWxpbmVfY2xvY2sgPSBjbG9jayA/IGdzdF9vYmplY3RfcmVmIChjbG9jaykgOiBOVUxMOworCisgIGlmIChqYnVmLT5waXBlbGluZV9jbG9jayAmJiBqYnVmLT5tZWRpYV9jbG9jayAmJgorICAgICAgamJ1Zi0+cGlwZWxpbmVfY2xvY2sgIT0gamJ1Zi0+bWVkaWFfY2xvY2spIHsKKyAgICBpZiAoZ3N0X2Nsb2NrX2lzX3N5bmNlZCAoamJ1Zi0+bWVkaWFfY2xvY2spKSB7CisgICAgICBHc3RDbG9ja1RpbWUgaW50ZXJuYWwsIGV4dGVybmFsOworCisgICAgICBpbnRlcm5hbCA9IGdzdF9jbG9ja19nZXRfaW50ZXJuYWxfdGltZSAoamJ1Zi0+bWVkaWFfY2xvY2spOworICAgICAgZXh0ZXJuYWwgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKGpidWYtPnBpcGVsaW5lX2Nsb2NrKTsKKworICAgICAgZ3N0X2Nsb2NrX3NldF9jYWxpYnJhdGlvbiAoamJ1Zi0+bWVkaWFfY2xvY2ssIGludGVybmFsLCBleHRlcm5hbCwgMSwgMSk7CisgICAgfQorCisgICAgZ3N0X2Nsb2NrX3NldF9tYXN0ZXIgKGpidWYtPm1lZGlhX2Nsb2NrLCBqYnVmLT5waXBlbGluZV9jbG9jayk7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZqYnVmLT5jbG9ja19sb2NrKTsKK30KKworZ2Jvb2xlYW4KK3J0cF9qaXR0ZXJfYnVmZmVyX2dldF9yZmM3MjczX3N5bmMgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYpCit7CisgIHJldHVybiBqYnVmLT5yZmM3MjczX3N5bmM7Cit9CisKK3ZvaWQKK3J0cF9qaXR0ZXJfYnVmZmVyX3NldF9yZmM3MjczX3N5bmMgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYsCisgICAgZ2Jvb2xlYW4gcmZjNzI3M19zeW5jKQoreworICBqYnVmLT5yZmM3MjczX3N5bmMgPSByZmM3MjczX3N5bmM7Cit9CisKKy8qKgorICogcnRwX2ppdHRlcl9idWZmZXJfcmVzZXRfc2tldzoKKyAqIEBqYnVmOiBhbiAjUlRQSml0dGVyQnVmZmVyCisgKgorICogUmVzZXQgdGhlIHNrZXcgY2FsY3VsYXRpb25zIGluIEBqYnVmLgorICovCit2b2lkCitydHBfaml0dGVyX2J1ZmZlcl9yZXNldF9za2V3IChSVFBKaXR0ZXJCdWZmZXIgKiBqYnVmKQoreworICBqYnVmLT5iYXNlX3RpbWUgPSAtMTsKKyAgamJ1Zi0+YmFzZV9ydHB0aW1lID0gLTE7CisgIGpidWYtPmJhc2VfZXh0cnRwID0gLTE7CisgIGpidWYtPm1lZGlhX2Nsb2NrX2Jhc2VfdGltZSA9IC0xOworICBqYnVmLT5leHRfcnRwdGltZSA9IC0xOworICBqYnVmLT5sYXN0X3J0cHRpbWUgPSAtMTsKKyAgamJ1Zi0+d2luZG93X3BvcyA9IDA7CisgIGpidWYtPndpbmRvd19maWxsaW5nID0gVFJVRTsKKyAgamJ1Zi0+d2luZG93X21pbiA9IDA7CisgIGpidWYtPnNrZXcgPSAwOworICBqYnVmLT5wcmV2X3NlbmRfZGlmZiA9IC0xOworICBqYnVmLT5wcmV2X291dF90aW1lID0gLTE7CisgIGpidWYtPm5lZWRfcmVzeW5jID0gVFJVRTsKKworICBHU1RfREVCVUcgKCJyZXNldCBza2V3IGNvcnJlY3Rpb24iKTsKK30KKworLyoqCisgKiBydHBfaml0dGVyX2J1ZmZlcl9kaXNhYmxlX2J1ZmZlcmluZzoKKyAqIEBqYnVmOiBhbiAjUlRQSml0dGVyQnVmZmVyCisgKiBAZGlzYWJsZWQ6IHRoZSBuZXcgc3RhdGUKKyAqCisgKiBFbmFibGUgb3IgZGlzYWJsZSBidWZmZXJpbmcgb24gQGpidWYuCisgKi8KK3ZvaWQKK3J0cF9qaXR0ZXJfYnVmZmVyX2Rpc2FibGVfYnVmZmVyaW5nIChSVFBKaXR0ZXJCdWZmZXIgKiBqYnVmLCBnYm9vbGVhbiBkaXNhYmxlZCkKK3sKKyAgamJ1Zi0+YnVmZmVyaW5nX2Rpc2FibGVkID0gZGlzYWJsZWQ7Cit9CisKK3N0YXRpYyB2b2lkCitydHBfaml0dGVyX2J1ZmZlcl9yZXN5bmMgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYsIEdzdENsb2NrVGltZSB0aW1lLAorICAgIEdzdENsb2NrVGltZSBnc3RydHB0aW1lLCBndWludDY0IGV4dF9ydHB0aW1lLCBnYm9vbGVhbiByZXNldF9za2V3KQoreworICBqYnVmLT5iYXNlX3RpbWUgPSB0aW1lOworICBqYnVmLT5tZWRpYV9jbG9ja19iYXNlX3RpbWUgPSAtMTsKKyAgamJ1Zi0+YmFzZV9ydHB0aW1lID0gZ3N0cnRwdGltZTsKKyAgamJ1Zi0+YmFzZV9leHRydHAgPSBleHRfcnRwdGltZTsKKyAgamJ1Zi0+cHJldl9vdXRfdGltZSA9IC0xOworICBqYnVmLT5wcmV2X3NlbmRfZGlmZiA9IC0xOworICBpZiAocmVzZXRfc2tldykgeworICAgIGpidWYtPndpbmRvd19maWxsaW5nID0gVFJVRTsKKyAgICBqYnVmLT53aW5kb3dfcG9zID0gMDsKKyAgICBqYnVmLT53aW5kb3dfbWluID0gMDsKKyAgICBqYnVmLT53aW5kb3dfc2l6ZSA9IDA7CisgICAgamJ1Zi0+c2tldyA9IDA7CisgIH0KKyAgamJ1Zi0+bmVlZF9yZXN5bmMgPSBGQUxTRTsKK30KKworc3RhdGljIGd1aW50NjQKK2dldF9idWZmZXJfbGV2ZWwgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYpCit7CisgIFJUUEppdHRlckJ1ZmZlckl0ZW0gKmhpZ2hfYnVmID0gTlVMTCwgKmxvd19idWYgPSBOVUxMOworICBndWludDY0IGxldmVsOworCisgIC8qIGZpcnN0IGJ1ZmZlciB3aXRoIHRpbWVzdGFtcCAqLworICBoaWdoX2J1ZiA9IChSVFBKaXR0ZXJCdWZmZXJJdGVtICopIGdfcXVldWVfcGVla190YWlsX2xpbmsgKGpidWYtPnBhY2tldHMpOworICB3aGlsZSAoaGlnaF9idWYpIHsKKyAgICBpZiAoaGlnaF9idWYtPmR0cyAhPSAtMSB8fCBoaWdoX2J1Zi0+cHRzICE9IC0xKQorICAgICAgYnJlYWs7CisKKyAgICBoaWdoX2J1ZiA9IChSVFBKaXR0ZXJCdWZmZXJJdGVtICopIGdfbGlzdF9wcmV2aW91cyAoaGlnaF9idWYpOworICB9CisKKyAgbG93X2J1ZiA9IChSVFBKaXR0ZXJCdWZmZXJJdGVtICopIGdfcXVldWVfcGVla19oZWFkX2xpbmsgKGpidWYtPnBhY2tldHMpOworICB3aGlsZSAobG93X2J1ZikgeworICAgIGlmIChsb3dfYnVmLT5kdHMgIT0gLTEgfHwgbG93X2J1Zi0+cHRzICE9IC0xKQorICAgICAgYnJlYWs7CisKKyAgICBsb3dfYnVmID0gKFJUUEppdHRlckJ1ZmZlckl0ZW0gKikgZ19saXN0X25leHQgKGxvd19idWYpOworICB9CisKKyAgaWYgKCFoaWdoX2J1ZiB8fCAhbG93X2J1ZiB8fCBoaWdoX2J1ZiA9PSBsb3dfYnVmKSB7CisgICAgbGV2ZWwgPSAwOworICB9IGVsc2UgeworICAgIGd1aW50NjQgaGlnaF90cywgbG93X3RzOworCisgICAgaGlnaF90cyA9IGhpZ2hfYnVmLT5kdHMgIT0gLTEgPyBoaWdoX2J1Zi0+ZHRzIDogaGlnaF9idWYtPnB0czsKKyAgICBsb3dfdHMgPSBsb3dfYnVmLT5kdHMgIT0gLTEgPyBsb3dfYnVmLT5kdHMgOiBsb3dfYnVmLT5wdHM7CisKKyAgICBpZiAoaGlnaF90cyA+IGxvd190cykKKyAgICAgIGxldmVsID0gaGlnaF90cyAtIGxvd190czsKKyAgICBlbHNlCisgICAgICBsZXZlbCA9IDA7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoamJ1ZiwKKyAgICAgICAgImxvdyAlIiBHU1RfVElNRV9GT1JNQVQgIiBoaWdoICUiIEdTVF9USU1FX0ZPUk1BVCAiIGxldmVsICUiCisgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGxvd190cyksIEdTVF9USU1FX0FSR1MgKGhpZ2hfdHMpLAorICAgICAgICBsZXZlbCk7CisgIH0KKyAgcmV0dXJuIGxldmVsOworfQorCitzdGF0aWMgdm9pZAordXBkYXRlX2J1ZmZlcl9sZXZlbCAoUlRQSml0dGVyQnVmZmVyICogamJ1ZiwgZ2ludCAqIHBlcmNlbnQpCit7CisgIGdib29sZWFuIHBvc3QgPSBGQUxTRTsKKyAgZ3VpbnQ2NCBsZXZlbDsKKworICBsZXZlbCA9IGdldF9idWZmZXJfbGV2ZWwgKGpidWYpOworICBHU1RfREVCVUcgKCJidWZmZXIgbGV2ZWwgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChsZXZlbCkpOworCisgIGlmIChqYnVmLT5idWZmZXJpbmdfZGlzYWJsZWQpIHsKKyAgICBHU1RfREVCVUcgKCJidWZmZXJpbmcgaXMgZGlzYWJsZWQiKTsKKyAgICBsZXZlbCA9IGpidWYtPmhpZ2hfbGV2ZWw7CisgIH0KKworICBpZiAoamJ1Zi0+YnVmZmVyaW5nKSB7CisgICAgcG9zdCA9IFRSVUU7CisgICAgaWYgKGxldmVsID49IGpidWYtPmhpZ2hfbGV2ZWwpIHsKKyAgICAgIEdTVF9ERUJVRyAoImJ1ZmZlcmluZyBmaW5pc2hlZCIpOworICAgICAgamJ1Zi0+YnVmZmVyaW5nID0gRkFMU0U7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChsZXZlbCA8IGpidWYtPmxvd19sZXZlbCkgeworICAgICAgR1NUX0RFQlVHICgiYnVmZmVyaW5nIHN0YXJ0ZWQiKTsKKyAgICAgIGpidWYtPmJ1ZmZlcmluZyA9IFRSVUU7CisgICAgICBwb3N0ID0gVFJVRTsKKyAgICB9CisgIH0KKyAgaWYgKHBvc3QpIHsKKyAgICBnaW50IHBlcmM7CisKKyAgICBpZiAoamJ1Zi0+YnVmZmVyaW5nICYmIChqYnVmLT5oaWdoX2xldmVsICE9IDApKSB7CisgICAgICBwZXJjID0gKGxldmVsICogMTAwIC8gamJ1Zi0+aGlnaF9sZXZlbCk7CisgICAgICBwZXJjID0gTUlOIChwZXJjLCAxMDApOworICAgIH0gZWxzZSB7CisgICAgICBwZXJjID0gMTAwOworICAgIH0KKworICAgIGlmIChwZXJjZW50KQorICAgICAgKnBlcmNlbnQgPSBwZXJjOworCisgICAgR1NUX0RFQlVHICgiYnVmZmVyaW5nICVkIiwgcGVyYyk7CisgIH0KK30KKworLyogRm9yIHRoZSBjbG9jayBza2V3IHdlIHVzZSBhIHdpbmRvd2VkIGxvdyBwb2ludCBhdmVyYWdpbmcgYWxnb3JpdGhtIGFzIGNhbiBiZQorICogZm91bmQgaW4gRm9iZXIsIE9ybGFyZXkgYW5kIExldHosIDIwMDUsICJSZWFsIFRpbWUgQ2xvY2sgU2tldyBFc3RpbWF0aW9uCisgKiBvdmVyIE5ldHdvcmsgRGVsYXlzIjoKKyAqIGh0dHA6Ly93d3cuZ3JhbWUuZnIvUmVzc291cmNlcy9wdWIvVFItMDUwNjAxLnBkZgorICogaHR0cDovL2NpdGVzZWVyeC5pc3QucHN1LmVkdS92aWV3ZG9jL3N1bW1hcnk/ZG9pPTEwLjEuMS4xMDIuMTU0NgorICoKKyAqIFRoZSBpZGVhIGlzIHRoYXQgdGhlIGppdHRlciBpcyBjb21wb3NlZCBvZjoKKyAqCisgKiAgSiA9IE4gKyBuCisgKgorICogICBOICAgOiBhIGNvbnN0YW50IG5ldHdvcmsgZGVsYXkuCisgKiAgIG4gICA6IHJhbmRvbSBhZGRlZCBub2lzZS4gVGhlIG5vaXNlIGlzIGNvbmNlbnRyYXRlZCBhcm91bmQgMAorICoKKyAqIEluIHRoZSByZWNlaXZlciB3ZSBjYW4gdHJhY2sgdGhlIGVsYXBzZWQgdGltZSBhdCB0aGUgc2VuZGVyIHdpdGg6CisgKgorICogIHNlbmRfZGlmZihpKSA9IChUc2kgLSBUczApOworICoKKyAqICAgVHNpIDogVGhlIHRpbWUgYXQgdGhlIHNlbmRlciBhdCBwYWNrZXQgaQorICogICBUczAgOiBUaGUgdGltZSBhdCB0aGUgc2VuZGVyIGF0IHRoZSBmaXJzdCBwYWNrZXQKKyAqCisgKiBUaGlzIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIFJUUCB0aW1lc3RhbXAgaW4gdGhlIGZpcnN0IHJlY2VpdmVkIHBhY2tldAorICogYW5kIHRoZSBjdXJyZW50IHBhY2tldC4KKyAqCisgKiBBdCB0aGUgcmVjZWl2ZXIgd2UgaGF2ZSB0byBkZWFsIHdpdGggdGhlIGppdHRlciBpbnRyb2R1Y2VkIGJ5IHRoZSBuZXR3b3JrLgorICoKKyAqICByZWN2X2RpZmYoaSkgPSAoVHJpIC0gVHIwKQorICoKKyAqICAgVHJpIDogVGhlIHRpbWUgYXQgdGhlIHJlY2VpdmVyIGF0IHBhY2tldCBpCisgKiAgIFRyMCA6IFRoZSB0aW1lIGF0IHRoZSByZWNlaXZlciBhdCB0aGUgZmlyc3QgcGFja2V0CisgKgorICogQm90aCBvZiB0aGVzZSB2YWx1ZXMgY29udGFpbiBhIGppdHRlciBKaSwgYSBqaXR0ZXIgZm9yIHBhY2tldCBpLCBzbyB3ZSBjYW4KKyAqIHdyaXRlOgorICoKKyAqICByZWN2X2RpZmYoaSkgPSAoQ3JpICsgRCArIG5pKSAtIChDcjAgKyBEICsgbjApKQorICoKKyAqICAgIENyaSAgICA6IFRoZSB0aW1lIG9mIHRoZSBjbG9jayBhdCB0aGUgcmVjZWl2ZXIgZm9yIHBhY2tldCBpCisgKiAgICBEICsgbmkgOiBUaGUgaml0dGVyIHdoZW4gcmVjZWl2aW5nIHBhY2tldCBpCisgKgorICogV2Ugc2VlIHRoYXQgdGhlIG5ldHdvcmsgZGVsYXkgaXMgaXJyZWxldmFudCBoZXJlIGFzIHdlIGNhbiBlbGxpbWluYXRlIEQ6CisgKgorICogIHJlY3ZfZGlmZihpKSA9IChDcmkgKyBuaSkgLSAoQ3IwICsgbjApKQorICoKKyAqIFRoZSBkcmlmdCBpcyBub3cgZXhwcmVzc2VkIGFzOgorICoKKyAqICBEcmlmdChpKSA9IHJlY3ZfZGlmZihpKSAtIHNlbmRfZGlmZihpKTsKKyAqCisgKiBXZSBub3cga2VlcCB0aGUgVyBsYXRlc3QgdmFsdWVzIG9mIERyaWZ0IGFuZCBmaW5kIHRoZSBtaW5pbXVtICh0aGlzIGlzIHRoZQorICogb25lIHdpdGggdGhlIGxvd2VzdCBuZXR3b3JrIGppdHRlciBhbmQgdGh1cyB0aGUgb25lIHdoaWNoIGlzIGxlYXN0IGFmZmVjdGVkCisgKiBieSBpdCkuIFdlIGF2ZXJhZ2UgdGhpcyBsb3dlc3QgdmFsdWUgdG8gc21vb3RoIG91dCB0aGUgcmVzdWx0aW5nIG5ldHdvcmsgc2tldy4KKyAqCisgKiBCb3RoIHRoZSB3aW5kb3cgYW5kIHRoZSB3ZWlnaHRpbmcgdXNlZCBmb3IgYXZlcmFnaW5nIGluZmx1ZW5jZSB0aGUgYWNjdXJhY3kKKyAqIG9mIHRoZSBkcmlmdCBlc3RpbWF0aW9uLiBGaW5kaW5nIHRoZSBjb3JyZWN0IHBhcmFtZXRlcnMgdHVybnMgb3V0IHRvIGJlIGEKKyAqIGNvbXByb21pc2UgYmV0d2VlbiBhY2N1cmFjeSBhbmQgaW5lcnRpYS4KKyAqCisgKiBXZSB1c2UgYSAyIHNlY29uZCB3aW5kb3cgb3IgdXAgdG8gNTEyIGRhdGEgcG9pbnRzLCB3aGljaCBpcyBzdGF0aXN0aWNhbGx5IGJpZworICogZW5vdWdoIHRvIGNhdGNoIHNwaWtlcyAoRklYTUUsIGRldGVjdCBzcGlrZXMpLgorICogV2UgYWxzbyB1c2UgYSByYXRoZXIgbGFyZ2Ugd2VpZ2h0aW5nIGZhY3RvciAoMTI1KSB0byBzbW9vdGhseSBhZGFwdC4gRHVyaW5nCisgKiBzdGFydHVwLCB3aGVuIGZpbGxpbmcgdGhlIHdpbmRvdywgd2UgdXNlIGEgcGFyYWJvbGljIHdlaWdodGluZyBmYWN0b3IsIHRoZQorICogbW9yZSB0aGUgd2luZG93IGlzIGZpbGxlZCwgdGhlIGZhc3RlciB3ZSBtb3ZlIHRvIHRoZSBkZXRlY3RlZCBwb3NzaWJsZSBza2V3LgorICoKKyAqIFJldHVybnM6IEB0aW1lIGFkanVzdGVkIHdpdGggdGhlIGNsb2NrIHNrZXcuCisgKi8KK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2NhbGN1bGF0ZV9za2V3IChSVFBKaXR0ZXJCdWZmZXIgKiBqYnVmLCBndWludDY0IGV4dF9ydHB0aW1lLAorICAgIEdzdENsb2NrVGltZSBnc3RydHB0aW1lLCBHc3RDbG9ja1RpbWUgdGltZSkKK3sKKyAgZ3VpbnQ2NCBzZW5kX2RpZmYsIHJlY3ZfZGlmZjsKKyAgZ2ludDY0IGRlbHRhOworICBnaW50NjQgb2xkOworICBnaW50IHBvcywgaTsKKyAgR3N0Q2xvY2tUaW1lIG91dF90aW1lOworICBndWludDY0IHNsb3BlOworCisgIC8qIGVsYXBzZWQgdGltZSBhdCBzZW5kZXIgKi8KKyAgc2VuZF9kaWZmID0gZ3N0cnRwdGltZSAtIGpidWYtPmJhc2VfcnRwdGltZTsKKworICAvKiB3ZSBkb24ndCBoYXZlIGFuIGFycml2YWwgdGltZXN0YW1wIHNvIHdlIGNhbid0IGRvIHNrZXcgZGV0ZWN0aW9uLiB3ZQorICAgKiBzaG91bGQgc3RpbGwgYXBwbHkgYSB0aW1lc3RhbXAgYmFzZWQgb24gUlRQIHRpbWVzdGFtcCBhbmQgYmFzZV90aW1lICovCisgIGlmICh0aW1lID09IC0xIHx8IGpidWYtPmJhc2VfdGltZSA9PSAtMSkKKyAgICBnb3RvIG5vX3NrZXc7CisKKyAgLyogZWxhcHNlZCB0aW1lIGF0IHJlY2VpdmVyLCBpbmNsdWRlcyB0aGUgaml0dGVyICovCisgIHJlY3ZfZGlmZiA9IHRpbWUgLSBqYnVmLT5iYXNlX3RpbWU7CisKKyAgLyogbWVhc3VyZSB0aGUgZGlmZiAqLworICBkZWx0YSA9ICgoZ2ludDY0KSByZWN2X2RpZmYpIC0gKChnaW50NjQpIHNlbmRfZGlmZik7CisKKyAgLyogbWVhc3VyZSB0aGUgc2xvcGUsIHRoaXMgZ2l2ZXMgYSByb3VnaHQgZXN0aW1hdGUgYmV0d2VlbiB0aGUgc2VuZGVyIHNwZWVkCisgICAqIGFuZCB0aGUgcmVjZWl2ZXIgc3BlZWQuIFRoaXMgc2hvdWxkIGJlIGFwcHJveGltYXRlbHkgOCwgaGlnaGVyIHZhbHVlcworICAgKiBpbmRpY2F0ZSBhIGJ1cnN0IChlc3BlY2lhbGx5IHdoZW4gdGhlIGNvbm5lY3Rpb24gc3RhcnRzKSAqLworICBpZiAocmVjdl9kaWZmID4gMCkKKyAgICBzbG9wZSA9IChzZW5kX2RpZmYgKiA4KSAvIHJlY3ZfZGlmZjsKKyAgZWxzZQorICAgIHNsb3BlID0gODsKKworICBHU1RfREVCVUcgKCJ0aW1lICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBiYXNlICUiIEdTVF9USU1FX0ZPUk1BVCAiLCByZWN2X2RpZmYgJSIKKyAgICAgIEdTVF9USU1FX0ZPUk1BVCAiLCBzbG9wZSAlIiBHX0dVSU5UNjRfRk9STUFULCBHU1RfVElNRV9BUkdTICh0aW1lKSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKGpidWYtPmJhc2VfdGltZSksIEdTVF9USU1FX0FSR1MgKHJlY3ZfZGlmZiksIHNsb3BlKTsKKworICAvKiBpZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzZW5kZXIgdGltZWxpbmUgYW5kIHRoZSByZWNlaXZlciB0aW1lbGluZQorICAgKiBjaGFuZ2VkIHRvbyBxdWlja2x5IHdlIGhhdmUgdG8gcmVzeW5jIGJlY2F1c2UgdGhlIHNlcnZlciBsaWtlbHkgcmVzdGFydGVkCisgICAqIGl0cyB0aW1lc3RhbXBzLiAqLworICBpZiAoQUJTIChkZWx0YSAtIGpidWYtPnNrZXcpID4gR1NUX1NFQ09ORCkgeworICAgIEdTVF9XQVJOSU5HICgiZGVsdGEgLSBza2V3OiAlIiBHU1RfVElNRV9GT1JNQVQgIiB0b28gYmlnLCByZXNldCBza2V3IiwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoQUJTIChkZWx0YSAtIGpidWYtPnNrZXcpKSk7CisgICAgcnRwX2ppdHRlcl9idWZmZXJfcmVzeW5jIChqYnVmLCB0aW1lLCBnc3RydHB0aW1lLCBleHRfcnRwdGltZSwgVFJVRSk7CisgICAgc2VuZF9kaWZmID0gMDsKKyAgICBkZWx0YSA9IDA7CisgIH0KKworICBwb3MgPSBqYnVmLT53aW5kb3dfcG9zOworCisgIGlmIChHX1VOTElLRUxZIChqYnVmLT53aW5kb3dfZmlsbGluZykpIHsKKyAgICAvKiB3ZSBhcmUgZmlsbGluZyB0aGUgd2luZG93ICovCisgICAgR1NUX0RFQlVHICgiZmlsbGluZyAlZCwgZGVsdGEgJSIgR19HSU5UNjRfRk9STUFULCBwb3MsIGRlbHRhKTsKKyAgICBqYnVmLT53aW5kb3dbcG9zKytdID0gZGVsdGE7CisgICAgLyogY2FsYyB0aGUgbWluIGRlbHRhIHdlIG9ic2VydmVkICovCisgICAgaWYgKEdfVU5MSUtFTFkgKHBvcyA9PSAxIHx8IGRlbHRhIDwgamJ1Zi0+d2luZG93X21pbikpCisgICAgICBqYnVmLT53aW5kb3dfbWluID0gZGVsdGE7CisKKyAgICBpZiAoR19VTkxJS0VMWSAoc2VuZF9kaWZmID49IE1BWF9USU1FIHx8IHBvcyA+PSBNQVhfV0lORE9XKSkgeworICAgICAgamJ1Zi0+d2luZG93X3NpemUgPSBwb3M7CisKKyAgICAgIC8qIHdpbmRvdyBmaWxsZWQgKi8KKyAgICAgIEdTVF9ERUJVRyAoIm1pbiAlIiBHX0dJTlQ2NF9GT1JNQVQsIGpidWYtPndpbmRvd19taW4pOworCisgICAgICAvKiB0aGUgc2tldyBpcyBub3cgdGhlIG1pbiAqLworICAgICAgamJ1Zi0+c2tldyA9IGpidWYtPndpbmRvd19taW47CisgICAgICBqYnVmLT53aW5kb3dfZmlsbGluZyA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICBnaW50IHBlcmNfdGltZSwgcGVyY193aW5kb3csIHBlcmM7CisKKyAgICAgIC8qIGZpZ3VyZSBvdXQgaG93IG11Y2ggd2UgZmlsbGVkIHRoZSB3aW5kb3csIHRoaXMgZGVwZW5kcyBvbiB0aGUgYW1vdW50IG9mCisgICAgICAgKiB0aW1lIHdlIGhhdmUgb3IgdGhlIG1heCBudW1iZXIgb2YgcG9pbnRzIHdlIGtlZXAuICovCisgICAgICBwZXJjX3RpbWUgPSBzZW5kX2RpZmYgKiAxMDAgLyBNQVhfVElNRTsKKyAgICAgIHBlcmNfd2luZG93ID0gcG9zICogMTAwIC8gTUFYX1dJTkRPVzsKKyAgICAgIHBlcmMgPSBNQVggKHBlcmNfdGltZSwgcGVyY193aW5kb3cpOworCisgICAgICAvKiBtYWtlIGEgcGFyYWJvbGljIGZ1bmN0aW9uLCB0aGUgY2xvc2VyIHdlIGdldCB0byB0aGUgTUFYLCB0aGUgbW9yZSB2YWx1ZQorICAgICAgICogd2UgZ2l2ZSB0byB0aGUgc2NhbGluZyBmYWN0b3Igb2YgdGhlIG5ldyB2YWx1ZSAqLworICAgICAgcGVyYyA9IHBlcmMgKiBwZXJjOworCisgICAgICAvKiBxdWlja2x5IGdvIHRvIHRoZSBtaW4gdmFsdWUgd2hlbiB3ZSBhcmUgZmlsbGluZyB1cCwgc2xvd2x5IHdoZW4gd2UgYXJlCisgICAgICAgKiBqdXN0IHN0YXJ0aW5nIGJlY2F1c2Ugd2UncmUgbm90IHN1cmUgaXQncyBhIGdvb2QgdmFsdWUgeWV0LiAqLworICAgICAgamJ1Zi0+c2tldyA9CisgICAgICAgICAgKHBlcmMgKiBqYnVmLT53aW5kb3dfbWluICsgKCgxMDAwMCAtIHBlcmMpICogamJ1Zi0+c2tldykpIC8gMTAwMDA7CisgICAgICBqYnVmLT53aW5kb3dfc2l6ZSA9IHBvcyArIDE7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIHBpY2sgb2xkIHZhbHVlIGFuZCBzdG9yZSBuZXcgdmFsdWUuIFdlIGtlZXAgdGhlIHByZXZpb3VzIHZhbHVlIGluIG9yZGVyCisgICAgICogdG8gcXVpY2tseSBjaGVjayBpZiB0aGUgbWluIG9mIHRoZSB3aW5kb3cgY2hhbmdlZCAqLworICAgIG9sZCA9IGpidWYtPndpbmRvd1twb3NdOworICAgIGpidWYtPndpbmRvd1twb3MrK10gPSBkZWx0YTsKKworICAgIGlmIChHX1VOTElLRUxZIChkZWx0YSA8PSBqYnVmLT53aW5kb3dfbWluKSkgeworICAgICAgLyogaWYgdGhlIG5ldyB2YWx1ZSB3ZSBpbnNlcnRlZCBpcyBzbWFsbGVyIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IG1pbiwKKyAgICAgICAqIGl0IGJlY29tZXMgdGhlIG5ldyBtaW4gKi8KKyAgICAgIGpidWYtPndpbmRvd19taW4gPSBkZWx0YTsKKyAgICB9IGVsc2UgaWYgKEdfVU5MSUtFTFkgKG9sZCA9PSBqYnVmLT53aW5kb3dfbWluKSkgeworICAgICAgZ2ludDY0IG1pbiA9IEdfTUFYSU5UNjQ7CisKKyAgICAgIC8qIGlmIHdlIHJlbW92ZWQgdGhlIG9sZCBtaW4sIHdlIGhhdmUgdG8gZmluZCBhIG5ldyBtaW4gKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBqYnVmLT53aW5kb3dfc2l6ZTsgaSsrKSB7CisgICAgICAgIC8qIHdlIGZvdW5kIGFub3RoZXIgdmFsdWUgZXF1YWwgdG8gdGhlIG9sZCBtaW4sIHdlIGNhbiBzdG9wIHNlYXJjaGluZyBub3cgKi8KKyAgICAgICAgaWYgKGpidWYtPndpbmRvd1tpXSA9PSBvbGQpIHsKKyAgICAgICAgICBtaW4gPSBvbGQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGpidWYtPndpbmRvd1tpXSA8IG1pbikKKyAgICAgICAgICBtaW4gPSBqYnVmLT53aW5kb3dbaV07CisgICAgICB9CisgICAgICBqYnVmLT53aW5kb3dfbWluID0gbWluOworICAgIH0KKyAgICAvKiBhdmVyYWdlIHRoZSBtaW4gdmFsdWVzICovCisgICAgamJ1Zi0+c2tldyA9IChqYnVmLT53aW5kb3dfbWluICsgKDEyNCAqIGpidWYtPnNrZXcpKSAvIDEyNTsKKyAgICBHU1RfREVCVUcgKCJkZWx0YSAlIiBHX0dJTlQ2NF9GT1JNQVQgIiwgbmV3IG1pbjogJSIgR19HSU5UNjRfRk9STUFULAorICAgICAgICBkZWx0YSwgamJ1Zi0+d2luZG93X21pbik7CisgIH0KKyAgLyogd3JhcCBhcm91bmQgaW4gdGhlIHdpbmRvdyAqLworICBpZiAoR19VTkxJS0VMWSAocG9zID49IGpidWYtPndpbmRvd19zaXplKSkKKyAgICBwb3MgPSAwOworICBqYnVmLT53aW5kb3dfcG9zID0gcG9zOworCitub19za2V3OgorICAvKiB0aGUgb3V0cHV0IHRpbWUgaXMgZGVmaW5lZCBhcyB0aGUgYmFzZSB0aW1lc3RhbXAgcGx1cyB0aGUgUlRQIHRpbWUKKyAgICogYWRqdXN0ZWQgZm9yIHRoZSBjbG9jayBza2V3IC4qLworICBpZiAoamJ1Zi0+YmFzZV90aW1lICE9IC0xKSB7CisgICAgb3V0X3RpbWUgPSBqYnVmLT5iYXNlX3RpbWUgKyBzZW5kX2RpZmY7CisgICAgLyogc2tldyBjYW4gYmUgbmVnYXRpdmUgYW5kIHdlIGRvbid0IHdhbnQgdG8gbWFrZSBpbnZhbGlkIHRpbWVzdGFtcHMgKi8KKyAgICBpZiAoamJ1Zi0+c2tldyA8IDAgJiYgb3V0X3RpbWUgPCAtamJ1Zi0+c2tldykgeworICAgICAgb3V0X3RpbWUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBvdXRfdGltZSArPSBqYnVmLT5za2V3OworICAgIH0KKyAgfSBlbHNlCisgICAgb3V0X3RpbWUgPSAtMTsKKworICBHU1RfREVCVUcgKCJza2V3ICUiIEdfR0lOVDY0X0ZPUk1BVCAiLCBvdXQgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgamJ1Zi0+c2tldywgR1NUX1RJTUVfQVJHUyAob3V0X3RpbWUpKTsKKworICByZXR1cm4gb3V0X3RpbWU7Cit9CisKK3N0YXRpYyB2b2lkCitxdWV1ZV9kb19pbnNlcnQgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYsIEdMaXN0ICogbGlzdCwgR0xpc3QgKiBpdGVtKQoreworICBHUXVldWUgKnF1ZXVlID0gamJ1Zi0+cGFja2V0czsKKworICAvKiBJdCdzIG1vcmUgbGlrZWx5IHRoYXQgdGhlIHBhY2tldCB3YXMgaW5zZXJ0ZWQgYXQgdGhlIHRhaWwgb2YgdGhlIHF1ZXVlICovCisgIGlmIChHX0xJS0VMWSAobGlzdCkpIHsKKyAgICBpdGVtLT5wcmV2ID0gbGlzdDsKKyAgICBpdGVtLT5uZXh0ID0gbGlzdC0+bmV4dDsKKyAgICBsaXN0LT5uZXh0ID0gaXRlbTsKKyAgfSBlbHNlIHsKKyAgICBpdGVtLT5wcmV2ID0gTlVMTDsKKyAgICBpdGVtLT5uZXh0ID0gcXVldWUtPmhlYWQ7CisgICAgcXVldWUtPmhlYWQgPSBpdGVtOworICB9CisgIGlmIChpdGVtLT5uZXh0KQorICAgIGl0ZW0tPm5leHQtPnByZXYgPSBpdGVtOworICBlbHNlCisgICAgcXVldWUtPnRhaWwgPSBpdGVtOworICBxdWV1ZS0+bGVuZ3RoKys7Cit9CisKK0dzdENsb2NrVGltZQorcnRwX2ppdHRlcl9idWZmZXJfY2FsY3VsYXRlX3B0cyAoUlRQSml0dGVyQnVmZmVyICogamJ1ZiwgR3N0Q2xvY2tUaW1lIGR0cywKKyAgICBnYm9vbGVhbiBlc3RpbWF0ZWRfZHRzLCBndWludDMyIHJ0cHRpbWUsIEdzdENsb2NrVGltZSBiYXNlX3RpbWUpCit7CisgIGd1aW50NjQgZXh0X3J0cHRpbWU7CisgIEdzdENsb2NrVGltZSBnc3RydHB0aW1lLCBwdHM7CisgIEdzdENsb2NrICptZWRpYV9jbG9jaywgKnBpcGVsaW5lX2Nsb2NrOworICBndWludDY0IG1lZGlhX2Nsb2NrX29mZnNldDsKKyAgZ2Jvb2xlYW4gcmZjNzI3M19tb2RlOworCisgIC8qIHJ0cCB0aW1lIGp1bXBzIGFyZSBjaGVja2VkIGZvciBkdXJpbmcgc2tldyBjYWxjdWxhdGlvbiwgYnV0IGJ5cGFzc2VkCisgICAqIGluIG90aGVyIG1vZGUsIHNvIG1pbmQgdGhvc2UgaGVyZSBhbmQgcmVzZXQgamIgaWYgbmVlZGVkLgorICAgKiBPbmx5IHJlc2V0IGlmIHZhbGlkIGlucHV0IHRpbWUsIHdoaWNoIGlzIGxpa2VseSBmb3IgVURQIGlucHV0CisgICAqIHdoZXJlIHdlIGV4cGVjdCB0aGlzIG1pZ2h0IGhhcHBlbiBkdWUgdG8gYXN5bmMgdGhyZWFkIGVmZmVjdHMKKyAgICogKGluIHNlZWsgYW5kIHN0YXRlIGNoYW5nZSBjeWNsZXMpLCBidXQgbm90IHNvIG11Y2ggZm9yIFRDUCBpbnB1dCAqLworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGR0cykgJiYgIWVzdGltYXRlZF9kdHMgJiYKKyAgICAgIGpidWYtPm1vZGUgIT0gUlRQX0pJVFRFUl9CVUZGRVJfTU9ERV9TTEFWRSAmJgorICAgICAgamJ1Zi0+YmFzZV90aW1lICE9IC0xICYmIGpidWYtPmxhc3RfcnRwdGltZSAhPSAtMSkgeworICAgIEdzdENsb2NrVGltZSBleHRfcnRwdGltZSA9IGpidWYtPmV4dF9ydHB0aW1lOworCisgICAgZXh0X3J0cHRpbWUgPSBnc3RfcnRwX2J1ZmZlcl9leHRfdGltZXN0YW1wICgmZXh0X3J0cHRpbWUsIHJ0cHRpbWUpOworICAgIGlmIChleHRfcnRwdGltZSA+IGpidWYtPmxhc3RfcnRwdGltZSArIDMgKiBqYnVmLT5jbG9ja19yYXRlIHx8CisgICAgICAgIGV4dF9ydHB0aW1lICsgMyAqIGpidWYtPmNsb2NrX3JhdGUgPCBqYnVmLT5sYXN0X3J0cHRpbWUpIHsKKyAgICAgIC8qIHJlc2V0IGV2ZW4gaWYgd2UgZG9uJ3QgaGF2ZSB2YWxpZCBpbmNvbWluZyB0aW1lOworICAgICAgICogc3RpbGwgYmV0dGVyIHRoYW4gcHJvZHVjaW5nIHBvc3NpYmx5IHZlcnkgYm9ndXMgb3V0cHV0IHRpbWVzdGFtcCAqLworICAgICAgR1NUX1dBUk5JTkcgKCJydHAgZGVsdGEgdG9vIGJpZywgcmVzZXQgc2tldyIpOworICAgICAgcnRwX2ppdHRlcl9idWZmZXJfcmVzZXRfc2tldyAoamJ1Zik7CisgICAgfQorICB9CisKKyAgLyogUmV0dXJuIHRoZSBsYXN0IHRpbWUgaWYgd2UgZ290IHRoZSBzYW1lIFJUUCB0aW1lc3RhbXAgYWdhaW4gKi8KKyAgZXh0X3J0cHRpbWUgPSBnc3RfcnRwX2J1ZmZlcl9leHRfdGltZXN0YW1wICgmamJ1Zi0+ZXh0X3J0cHRpbWUsIHJ0cHRpbWUpOworICBpZiAoamJ1Zi0+bGFzdF9ydHB0aW1lICE9IC0xICYmIGV4dF9ydHB0aW1lID09IGpidWYtPmxhc3RfcnRwdGltZSkgeworICAgIHJldHVybiBqYnVmLT5wcmV2X291dF90aW1lOworICB9CisKKyAgLyoga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBleHRlbmRlZCBydHB0aW1lICovCisgIGpidWYtPmxhc3RfcnRwdGltZSA9IGV4dF9ydHB0aW1lOworCisgIGdfbXV0ZXhfbG9jayAoJmpidWYtPmNsb2NrX2xvY2spOworICBtZWRpYV9jbG9jayA9IGpidWYtPm1lZGlhX2Nsb2NrID8gZ3N0X29iamVjdF9yZWYgKGpidWYtPm1lZGlhX2Nsb2NrKSA6IE5VTEw7CisgIHBpcGVsaW5lX2Nsb2NrID0KKyAgICAgIGpidWYtPnBpcGVsaW5lX2Nsb2NrID8gZ3N0X29iamVjdF9yZWYgKGpidWYtPnBpcGVsaW5lX2Nsb2NrKSA6IE5VTEw7CisgIG1lZGlhX2Nsb2NrX29mZnNldCA9IGpidWYtPm1lZGlhX2Nsb2NrX29mZnNldDsKKyAgZ19tdXRleF91bmxvY2sgKCZqYnVmLT5jbG9ja19sb2NrKTsKKworICBnc3RydHB0aW1lID0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKGV4dF9ydHB0aW1lLCBHU1RfU0VDT05ELCBqYnVmLT5jbG9ja19yYXRlKTsKKworICBpZiAoR19MSUtFTFkgKGpidWYtPmJhc2VfcnRwdGltZSAhPSAtMSkpIHsKKyAgICAvKiBjaGVjayBlbGFwc2VkIHRpbWUgaW4gUlRQIHVuaXRzICovCisgICAgaWYgKGdzdHJ0cHRpbWUgPCBqYnVmLT5iYXNlX3J0cHRpbWUpIHsKKyAgICAgIC8qIGVsYXBzZWQgdGltZSBhdCBzZW5kZXIsIHRpbWVzdGFtcHMgY2FuIGdvIGJhY2t3YXJkcyBhbmQgdGh1cyBiZQorICAgICAgICogc21hbGxlciB0aGFuIG91ciBiYXNlIHRpbWUsIHNjaGVkdWxlIHRvIHRha2UgYSBuZXcgYmFzZSB0aW1lIGluCisgICAgICAgKiB0aGF0IGNhc2UuICovCisgICAgICBHU1RfV0FSTklORyAoImJhY2t3YXJkIHRpbWVzdGFtcHMgYXQgc2VydmVyLCBzY2hlZHVsZSByZXN5bmMiKTsKKyAgICAgIGpidWYtPm5lZWRfcmVzeW5jID0gVFJVRTsKKyAgICB9CisgIH0KKworICBzd2l0Y2ggKGpidWYtPm1vZGUpIHsKKyAgICBjYXNlIFJUUF9KSVRURVJfQlVGRkVSX01PREVfTk9ORToKKyAgICBjYXNlIFJUUF9KSVRURVJfQlVGRkVSX01PREVfQlVGRkVSOgorICAgICAgLyogc2VuZCAwIGFzIHRoZSBmaXJzdCB0aW1lc3RhbXAgYW5kIC0xIGZvciB0aGUgb3RoZXIgb25lcy4gVGhpcyB3aWxsCisgICAgICAgKiBpbnRlcnBvbGF0ZSB0aGVtIGZyb20gdGhlIFJUUCB0aW1lc3RhbXBzIHdpdGggYSAwIG9yaWdpbi4gSW4gYnVmZmVyaW5nCisgICAgICAgKiBtb2RlIHdlIHdpbGwgYWRqdXN0IHRoZSBvdXRnb2luZyB0aW1lc3RhbXBzIGFjY29yZGluZyB0byB0aGUgYW1vdW50IG9mCisgICAgICAgKiB0aW1lIHdlIHNwZW50IGJ1ZmZlcmluZy4gKi8KKyAgICAgIGlmIChqYnVmLT5iYXNlX3RpbWUgPT0gLTEpCisgICAgICAgIGR0cyA9IDA7CisgICAgICBlbHNlCisgICAgICAgIGR0cyA9IC0xOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSVFBfSklUVEVSX0JVRkZFUl9NT0RFX1NZTkNFRDoKKyAgICAgIC8qIHN5bmNocm9uaXplZCBjbG9ja3MsIHRha2UgZmlyc3QgdGltZXN0YW1wIGFzIGJhc2UsIHVzZSBSVFAgdGltZXN0YW1wcworICAgICAgICogdG8gaW50ZXJwb2xhdGUgKi8KKyAgICAgIGlmIChqYnVmLT5iYXNlX3RpbWUgIT0gLTEgJiYgIWpidWYtPm5lZWRfcmVzeW5jKQorICAgICAgICBkdHMgPSAtMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUlRQX0pJVFRFUl9CVUZGRVJfTU9ERV9TTEFWRToKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBuZWVkIHJlc3luYywgbG9jayBvbiB0byB0aW1lIGFuZCBnc3RydHB0aW1lIGlmIHdlIGNhbiwgb3RoZXJ3aXNlIHdlCisgICAqIGRvIHdpdGggdGhlIHByZXZpb3VzIHZhbHVlcyAqLworICBpZiAoR19VTkxJS0VMWSAoamJ1Zi0+bmVlZF9yZXN5bmMgJiYgZHRzICE9IC0xKSkgeworICAgIEdTVF9JTkZPICgicmVzeW5jIHRvIHRpbWUgJSIgR1NUX1RJTUVfRk9STUFUICIsIHJ0cHRpbWUgJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChkdHMpLCBHU1RfVElNRV9BUkdTIChnc3RydHB0aW1lKSk7CisgICAgcnRwX2ppdHRlcl9idWZmZXJfcmVzeW5jIChqYnVmLCBkdHMsIGdzdHJ0cHRpbWUsIGV4dF9ydHB0aW1lLCBGQUxTRSk7CisgIH0KKworICBHU1RfREVCVUcgKCJleHRydHAgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBnc3RydHAgJSIgR1NUX1RJTUVfRk9STUFUICIsIGJhc2UgJSIKKyAgICAgIEdTVF9USU1FX0ZPUk1BVCAiLCBzZW5kX2RpZmYgJSIgR1NUX1RJTUVfRk9STUFULCBleHRfcnRwdGltZSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKGdzdHJ0cHRpbWUpLCBHU1RfVElNRV9BUkdTIChqYnVmLT5iYXNlX3J0cHRpbWUpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoZ3N0cnRwdGltZSAtIGpidWYtPmJhc2VfcnRwdGltZSkpOworCisgIHJmYzcyNzNfbW9kZSA9IG1lZGlhX2Nsb2NrICYmIHBpcGVsaW5lX2Nsb2NrCisgICAgICAmJiBnc3RfY2xvY2tfaXNfc3luY2VkIChtZWRpYV9jbG9jayk7CisKKyAgaWYgKHJmYzcyNzNfbW9kZSAmJiBqYnVmLT5tb2RlID09IFJUUF9KSVRURVJfQlVGRkVSX01PREVfU0xBVkUKKyAgICAgICYmIChtZWRpYV9jbG9ja19vZmZzZXQgPT0gLTEgfHwgIWpidWYtPnJmYzcyNzNfc3luYykpIHsKKyAgICBHc3RDbG9ja1RpbWUgaW50ZXJuYWwsIGV4dGVybmFsOworICAgIEdzdENsb2NrVGltZSByYXRlX251bSwgcmF0ZV9kZW5vbTsKKyAgICBHc3RDbG9ja1RpbWUgbnNydHB0aW1lZGlmZiwgcnRwbnRwdGltZSwgcnRwc3lzdGltZTsKKworICAgIGdzdF9jbG9ja19nZXRfY2FsaWJyYXRpb24gKG1lZGlhX2Nsb2NrLCAmaW50ZXJuYWwsICZleHRlcm5hbCwgJnJhdGVfbnVtLAorICAgICAgICAmcmF0ZV9kZW5vbSk7CisKKyAgICAvKiBTbGF2ZSB0byB0aGUgUkZDNzI3MyBtZWRpYSBjbG9jayBpbnN0ZWFkIG9mIHRyeWluZyB0byBlc3RpbWF0ZSBpdAorICAgICAqIGJhc2VkIG9uIHJlY2VpdmUgdGltZXMgYW5kIFJUUCB0aW1lc3RhbXBzICovCisKKyAgICBpZiAoamJ1Zi0+bWVkaWFfY2xvY2tfYmFzZV90aW1lID09IC0xKSB7CisgICAgICBpZiAoamJ1Zi0+YmFzZV90aW1lICE9IC0xKSB7CisgICAgICAgIGpidWYtPm1lZGlhX2Nsb2NrX2Jhc2VfdGltZSA9CisgICAgICAgICAgICBnc3RfY2xvY2tfdW5hZGp1c3Rfd2l0aF9jYWxpYnJhdGlvbiAobWVkaWFfY2xvY2ssCisgICAgICAgICAgICBqYnVmLT5iYXNlX3RpbWUgKyBiYXNlX3RpbWUsIGludGVybmFsLCBleHRlcm5hbCwgcmF0ZV9udW0sCisgICAgICAgICAgICByYXRlX2Rlbm9tKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkdHMgIT0gLTEpCisgICAgICAgICAgamJ1Zi0+bWVkaWFfY2xvY2tfYmFzZV90aW1lID0KKyAgICAgICAgICAgICAgZ3N0X2Nsb2NrX3VuYWRqdXN0X3dpdGhfY2FsaWJyYXRpb24gKG1lZGlhX2Nsb2NrLCBkdHMgKyBiYXNlX3RpbWUsCisgICAgICAgICAgICAgIGludGVybmFsLCBleHRlcm5hbCwgcmF0ZV9udW0sIHJhdGVfZGVub20pOworICAgICAgICBlbHNlCisgICAgICAgICAgamJ1Zi0+bWVkaWFfY2xvY2tfYmFzZV90aW1lID0KKyAgICAgICAgICAgICAgZ3N0X2Nsb2NrX2dldF9pbnRlcm5hbF90aW1lIChtZWRpYV9jbG9jayk7CisgICAgICAgIGpidWYtPmJhc2VfcnRwdGltZSA9IGdzdHJ0cHRpbWU7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGdzdHJ0cHRpbWUgPiBqYnVmLT5iYXNlX3J0cHRpbWUpCisgICAgICBuc3J0cHRpbWVkaWZmID0gZ3N0cnRwdGltZSAtIGpidWYtPmJhc2VfcnRwdGltZTsKKyAgICBlbHNlCisgICAgICBuc3J0cHRpbWVkaWZmID0gMDsKKworICAgIHJ0cG50cHRpbWUgPSBuc3J0cHRpbWVkaWZmICsgamJ1Zi0+bWVkaWFfY2xvY2tfYmFzZV90aW1lOworCisgICAgcnRwc3lzdGltZSA9CisgICAgICAgIGdzdF9jbG9ja19hZGp1c3Rfd2l0aF9jYWxpYnJhdGlvbiAobWVkaWFfY2xvY2ssIHJ0cG50cHRpbWUsIGludGVybmFsLAorICAgICAgICBleHRlcm5hbCwgcmF0ZV9udW0sIHJhdGVfZGVub20pOworCisgICAgaWYgKHJ0cHN5c3RpbWUgPiBiYXNlX3RpbWUpCisgICAgICBwdHMgPSBydHBzeXN0aW1lIC0gYmFzZV90aW1lOworICAgIGVsc2UKKyAgICAgIHB0cyA9IDA7CisKKyAgICBHU1RfREVCVUcgKCJSRkM3MjczIGNsb2NrIHRpbWUgJSIgR1NUX1RJTUVfRk9STUFUICIsIG91dCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHJ0cHN5c3RpbWUpLCBHU1RfVElNRV9BUkdTIChwdHMpKTsKKyAgfSBlbHNlIGlmIChyZmM3MjczX21vZGUgJiYgKGpidWYtPm1vZGUgPT0gUlRQX0pJVFRFUl9CVUZGRVJfTU9ERV9TTEFWRQorICAgICAgICAgIHx8IGpidWYtPm1vZGUgPT0gUlRQX0pJVFRFUl9CVUZGRVJfTU9ERV9TWU5DRUQpCisgICAgICAmJiBtZWRpYV9jbG9ja19vZmZzZXQgIT0gLTEgJiYgamJ1Zi0+cmZjNzI3M19zeW5jKSB7CisgICAgR3N0Q2xvY2tUaW1lIG50cHRpbWUsIHJ0cHRpbWVfdG1wOworICAgIEdzdENsb2NrVGltZSBudHBydHB0aW1lLCBydHBzeXN0aW1lOworICAgIEdzdENsb2NrVGltZSBpbnRlcm5hbCwgZXh0ZXJuYWw7CisgICAgR3N0Q2xvY2tUaW1lIHJhdGVfbnVtLCByYXRlX2Rlbm9tOworCisgICAgLyogRG9uJ3QgZG8gYW55IG9mIHRoZSBkdHMgcmVsYXRlZCBhZGp1c3RtZW50cyBmdXJ0aGVyIGRvd24gKi8KKyAgICBkdHMgPSAtMTsKKworICAgIC8qIENhbGN1bGF0ZSB0aGUgYWN0dWFsIGNsb2NrIHRpbWUgb24gdGhlIHNlbmRlciBzaWRlIGJhc2VkIG9uIHRoZQorICAgICAqIFJGQzcyNzMgY2xvY2sgYW5kIGNvbnZlcnQgaXQgdG8gb3VyIHBpcGVsaW5lIGNsb2NrCisgICAgICovCisKKyAgICBnc3RfY2xvY2tfZ2V0X2NhbGlicmF0aW9uIChtZWRpYV9jbG9jaywgJmludGVybmFsLCAmZXh0ZXJuYWwsICZyYXRlX251bSwKKyAgICAgICAgJnJhdGVfZGVub20pOworCisgICAgbnRwdGltZSA9IGdzdF9jbG9ja19nZXRfaW50ZXJuYWxfdGltZSAobWVkaWFfY2xvY2spOworCisgICAgbnRwcnRwdGltZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAobnRwdGltZSwgamJ1Zi0+Y2xvY2tfcmF0ZSwgR1NUX1NFQ09ORCk7CisgICAgbnRwcnRwdGltZSArPSBtZWRpYV9jbG9ja19vZmZzZXQ7CisgICAgbnRwcnRwdGltZSAmPSAweGZmZmZmZmZmOworCisgICAgcnRwdGltZV90bXAgPSBydHB0aW1lOworICAgIC8qIENoZWNrIGZvciB3cmFwYXJvdW5kcywgd2UgYXNzdW1lIHRoYXQgdGhlIGRpZmYgYmV0d2VlbiBjdXJyZW50IFJUUAorICAgICAqIHRpbWVzdGFtcCBhbmQgY3VycmVudCBtZWRpYSBjbG9jayB0aW1lIGNhbid0IGJlIGJpZ2dlciB0aGFuCisgICAgICogMioqMzEgY2xvY2sgdW5pdHMgKi8KKyAgICBpZiAobnRwcnRwdGltZSA+IHJ0cHRpbWVfdG1wICYmIG50cHJ0cHRpbWUgLSBydHB0aW1lX3RtcCA+PSAweDgwMDAwMDAwKQorICAgICAgcnRwdGltZV90bXAgKz0gR19HVUlOVDY0X0NPTlNUQU5UICgweDEwMDAwMDAwMCk7CisgICAgZWxzZSBpZiAocnRwdGltZV90bXAgPiBudHBydHB0aW1lICYmIHJ0cHRpbWVfdG1wIC0gbnRwcnRwdGltZSA+PSAweDgwMDAwMDAwKQorICAgICAgbnRwcnRwdGltZSArPSBHX0dVSU5UNjRfQ09OU1RBTlQgKDB4MTAwMDAwMDAwKTsKKworICAgIGlmIChudHBydHB0aW1lID4gcnRwdGltZV90bXApCisgICAgICBudHB0aW1lIC09CisgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChudHBydHB0aW1lIC0gcnRwdGltZV90bXAsIGpidWYtPmNsb2NrX3JhdGUsCisgICAgICAgICAgR1NUX1NFQ09ORCk7CisgICAgZWxzZQorICAgICAgbnRwdGltZSArPQorICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAocnRwdGltZV90bXAgLSBudHBydHB0aW1lLCBqYnVmLT5jbG9ja19yYXRlLAorICAgICAgICAgIEdTVF9TRUNPTkQpOworCisgICAgcnRwc3lzdGltZSA9CisgICAgICAgIGdzdF9jbG9ja19hZGp1c3Rfd2l0aF9jYWxpYnJhdGlvbiAobWVkaWFfY2xvY2ssIG50cHRpbWUsIGludGVybmFsLAorICAgICAgICBleHRlcm5hbCwgcmF0ZV9udW0sIHJhdGVfZGVub20pOworICAgIC8qIEFsbCB0aGlzIGFzc3VtZXMgdGhhdCB0aGUgcGlwZWxpbmUgaGFzIGVub3VnaCBhZGRpdGlvbmFsCisgICAgICogbGF0ZW5jeSB0byBjb3ZlciBmb3IgdGhlIG5ldHdvcmsgZGVsYXkgKi8KKyAgICBpZiAocnRwc3lzdGltZSA+IGJhc2VfdGltZSkKKyAgICAgIHB0cyA9IHJ0cHN5c3RpbWUgLSBiYXNlX3RpbWU7CisgICAgZWxzZQorICAgICAgcHRzID0gMDsKKworICAgIEdTVF9ERUJVRyAoIlJGQzcyNzMgY2xvY2sgdGltZSAlIiBHU1RfVElNRV9GT1JNQVQgIiwgb3V0ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAocnRwc3lzdGltZSksIEdTVF9USU1FX0FSR1MgKHB0cykpOworICB9IGVsc2UgeworICAgIC8qIElmIHdlIHVzZWQgdGhlIFJGQzcyNzMgY2xvY2sgYmVmb3JlIGFuZCBub3QgYW55bW9yZSwKKyAgICAgKiB3ZSBuZWVkIHRvIHJlc3luYyBpdCBsYXRlciBhZ2FpbiAqLworICAgIGpidWYtPm1lZGlhX2Nsb2NrX2Jhc2VfdGltZSA9IC0xOworCisgICAgLyogZG8gc2tldyBjYWxjdWxhdGlvbiBieSBtZWFzdXJpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBydHB0aW1lIGFuZCB0aGUKKyAgICAgKiByZWNlaXZlIGR0cywgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgc2tldyBjb3JyZWN0ZWQgcnRwdGltZS4gKi8KKyAgICBwdHMgPSBjYWxjdWxhdGVfc2tldyAoamJ1ZiwgZXh0X3J0cHRpbWUsIGdzdHJ0cHRpbWUsIGR0cyk7CisgIH0KKworICAvKiBjaGVjayBpZiB0aW1lc3RhbXBzIGFyZSBub3QgZ29pbmcgYmFja3dhcmRzLCB3ZSBjYW4gb25seSBjaGVjayB0aGlzIGlmIHdlCisgICAqIGhhdmUgYSBwcmV2aW91cyBvdXQgdGltZSBhbmQgYSBwcmV2aW91cyBzZW5kX2RpZmYgKi8KKyAgaWYgKEdfTElLRUxZIChwdHMgIT0gLTEgJiYgamJ1Zi0+cHJldl9vdXRfdGltZSAhPSAtMQorICAgICAgICAgICYmIGpidWYtPnByZXZfc2VuZF9kaWZmICE9IC0xKSkgeworICAgIC8qIG5vdyBjaGVjayBmb3IgYmFja3dhcmRzIHRpbWVzdGFtcHMgKi8KKyAgICBpZiAoR19VTkxJS0VMWSAoCisgICAgICAgICAgICAvKiBpZiB0aGUgc2VydmVyIHRpbWVzdGFtcHMgd2VudCB1cCBhbmQgdGhlIG91dF90aW1lIGJhY2t3YXJkcyAqLworICAgICAgICAgICAgKGdzdHJ0cHRpbWUgLSBqYnVmLT5iYXNlX3J0cHRpbWUgPiBqYnVmLT5wcmV2X3NlbmRfZGlmZgorICAgICAgICAgICAgICAgICYmIHB0cyA8IGpidWYtPnByZXZfb3V0X3RpbWUpIHx8CisgICAgICAgICAgICAvKiBpZiB0aGUgc2VydmVyIHRpbWVzdGFtcHMgd2VudCBiYWNrd2FyZHMgYW5kIHRoZSBvdXRfdGltZSBmb3J3YXJkcyAqLworICAgICAgICAgICAgKGdzdHJ0cHRpbWUgLSBqYnVmLT5iYXNlX3J0cHRpbWUgPCBqYnVmLT5wcmV2X3NlbmRfZGlmZgorICAgICAgICAgICAgICAgICYmIHB0cyA+IGpidWYtPnByZXZfb3V0X3RpbWUpIHx8CisgICAgICAgICAgICAvKiBpZiB0aGUgc2VydmVyIHRpbWVzdGFtcHMgZGlkIG5vdCBjaGFuZ2UgKi8KKyAgICAgICAgICAgIGdzdHJ0cHRpbWUgLSBqYnVmLT5iYXNlX3J0cHRpbWUgPT0gamJ1Zi0+cHJldl9zZW5kX2RpZmYpKSB7CisgICAgICBHU1RfREVCVUcgKCJiYWNrd2FyZHMgdGltZXN0YW1wcywgdXNpbmcgcHJldmlvdXMgdGltZSIpOworICAgICAgcHRzID0gamJ1Zi0+cHJldl9vdXRfdGltZTsKKyAgICB9CisgIH0KKworICBpZiAoZHRzICE9IC0xICYmIHB0cyArIGpidWYtPmRlbGF5IDwgZHRzKSB7CisgICAgLyogaWYgd2UgYXJlIGdvaW5nIHRvIHByb2R1Y2UgYSB0aW1lc3RhbXAgdGhhdCBpcyBsYXRlciB0aGFuIHRoZSBpbnB1dAorICAgICAqIHRpbWVzdGFtcCwgd2UgbmVlZCB0byByZXNldCB0aGUgaml0dGVyYnVmZmVyLiBMaWtlbHkgdGhlIHNlcnZlciBwYXVzZWQKKyAgICAgKiB0ZW1wb3JhcmlseSAqLworICAgIEdTVF9ERUJVRyAoIm91dCAlIiBHU1RfVElNRV9GT1JNQVQgIiArICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiA8IHRpbWUgJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFUICIsIHJlc2V0IGppdHRlcmJ1ZmZlciIsIEdTVF9USU1FX0FSR1MgKHB0cyksCisgICAgICAgIGpidWYtPmRlbGF5LCBHU1RfVElNRV9BUkdTIChkdHMpKTsKKyAgICBydHBfaml0dGVyX2J1ZmZlcl9yZXN5bmMgKGpidWYsIGR0cywgZ3N0cnRwdGltZSwgZXh0X3J0cHRpbWUsIFRSVUUpOworICAgIHB0cyA9IGR0czsKKyAgfQorCisgIGpidWYtPnByZXZfb3V0X3RpbWUgPSBwdHM7CisgIGpidWYtPnByZXZfc2VuZF9kaWZmID0gZ3N0cnRwdGltZSAtIGpidWYtPmJhc2VfcnRwdGltZTsKKworICBpZiAobWVkaWFfY2xvY2spCisgICAgZ3N0X29iamVjdF91bnJlZiAobWVkaWFfY2xvY2spOworICBpZiAocGlwZWxpbmVfY2xvY2spCisgICAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmVfY2xvY2spOworCisgIHJldHVybiBwdHM7Cit9CisKKworLyoqCisgKiBydHBfaml0dGVyX2J1ZmZlcl9pbnNlcnQ6CisgKiBAamJ1ZjogYW4gI1JUUEppdHRlckJ1ZmZlcgorICogQGl0ZW06IGFuICNSVFBKaXR0ZXJCdWZmZXJJdGVtIHRvIGluc2VydAorICogQGhlYWQ6IFRSVUUgd2hlbiB0aGUgaGVhZCBlbGVtZW50IGNoYW5nZWQuCisgKiBAcGVyY2VudDogdGhlIGJ1ZmZlcmluZyBwZXJjZW50IGFmdGVyIGluc2VydGlvbgorICoKKyAqIEluc2VydHMgQGl0ZW0gaW50byB0aGUgcGFja2V0IHF1ZXVlIG9mIEBqYnVmLiBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZQorICogcGFja2V0IHdpbGwgYmUgdXNlZCB0byBzb3J0IHRoZSBwYWNrZXRzLiBUaGlzIGZ1bmN0aW9uIHRha2VzIG93bmVyaGlwIG9mCisgKiBAYnVmIHdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMgJVRSVUUuCisgKgorICogV2hlbiBAaGVhZCBpcyAlVFJVRSwgdGhlIG5ldyBwYWNrZXQgd2FzIGFkZGVkIGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBhbmQKKyAqIHdpbGwgYmUgYXZhaWxhYmxlIHdpdGggdGhlIG5leHQgY2FsbCB0byBydHBfaml0dGVyX2J1ZmZlcl9wb3AoKSBhbmQKKyAqIHJ0cF9qaXR0ZXJfYnVmZmVyX3BlZWsoKS4KKyAqCisgKiBSZXR1cm5zOiAlRkFMU0UgaWYgYSBwYWNrZXQgd2l0aCB0aGUgc2FtZSBudW1iZXIgYWxyZWFkeSBleGlzdGVkLgorICovCitnYm9vbGVhbgorcnRwX2ppdHRlcl9idWZmZXJfaW5zZXJ0IChSVFBKaXR0ZXJCdWZmZXIgKiBqYnVmLCBSVFBKaXR0ZXJCdWZmZXJJdGVtICogaXRlbSwKKyAgICBnYm9vbGVhbiAqIGhlYWQsIGdpbnQgKiBwZXJjZW50KQoreworICBHTGlzdCAqbGlzdCwgKmV2ZW50ID0gTlVMTDsKKyAgZ3VpbnQxNiBzZXFudW07CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGpidWYgIT0gTlVMTCwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoaXRlbSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgbGlzdCA9IGpidWYtPnBhY2tldHMtPnRhaWw7CisKKyAgLyogbm8gc2VxbnVtLCBzaW1wbHkgYXBwZW5kIHRoZW4gKi8KKyAgaWYgKGl0ZW0tPnNlcW51bSA9PSAtMSkKKyAgICBnb3RvIGFwcGVuZDsKKworICBzZXFudW0gPSBpdGVtLT5zZXFudW07CisKKyAgLyogbG9vcCB0aGUgbGlzdCB0byBza2lwIHN0cmljdGx5IGxhcmdlciBzZXFudW0gYnVmZmVycyAqLworICBmb3IgKDsgbGlzdDsgbGlzdCA9IGdfbGlzdF9wcmV2aW91cyAobGlzdCkpIHsKKyAgICBndWludDE2IHFzZXE7CisgICAgZ2ludCBnYXA7CisgICAgUlRQSml0dGVyQnVmZmVySXRlbSAqcWl0ZW0gPSAoUlRQSml0dGVyQnVmZmVySXRlbSAqKSBsaXN0OworCisgICAgaWYgKHFpdGVtLT5zZXFudW0gPT0gLTEpIHsKKyAgICAgIC8qIGtlZXAgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjb25zZWN1dGl2ZSBldmVudCBpZiBub3QgYWxyZWFkeQorICAgICAgICogc2V0LiB3ZSB3aWxsIGluc2VydCB0aGUgcGFja2V0IGFmdGVyIHRoZSBldmVudCBpZiB3ZSBjYW4ndCBmaW5kCisgICAgICAgKiBhIHBhY2tldCB3aXRoIGxvd2VyIHNlcXVlbmNlIG51bWJlciBiZWZvcmUgdGhlIGV2ZW50LiAqLworICAgICAgaWYgKGV2ZW50ID09IE5VTEwpCisgICAgICAgIGV2ZW50ID0gbGlzdDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHFzZXEgPSBxaXRlbS0+c2VxbnVtOworCisgICAgLyogY29tcGFyZSB0aGUgbmV3IHNlcW51bSB0byB0aGUgb25lIGluIHRoZSBidWZmZXIgKi8KKyAgICBnYXAgPSBnc3RfcnRwX2J1ZmZlcl9jb21wYXJlX3NlcW51bSAoc2VxbnVtLCBxc2VxKTsKKworICAgIC8qIHdlIGhpdCBhIHBhY2tldCB3aXRoIHRoZSBzYW1lIHNlcW51bSwgbm90aWZ5IGEgZHVwbGljYXRlICovCisgICAgaWYgKEdfVU5MSUtFTFkgKGdhcCA9PSAwKSkKKyAgICAgIGdvdG8gZHVwbGljYXRlOworCisgICAgLyogc2VxbnVtID4gcXNlcSwgd2UgY2FuIHN0b3AgbG9va2luZyAqLworICAgIGlmIChHX0xJS0VMWSAoZ2FwIDwgMCkpCisgICAgICBicmVhazsKKworICAgIC8qIGlmIHdlJ3ZlIGZvdW5kIGEgcGFja2V0IHdpdGggZ3JlYXRlciBzZXF1ZW5jZSBudW1iZXIsIGNsZWFudXAgdGhlCisgICAgICogZXZlbnQgcG9pbnRlciBhcyB0aGUgcGFja2V0IHdpbGwgYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBldmVudCAqLworICAgIGV2ZW50ID0gTlVMTDsKKyAgfQorCisgIC8qIGlmIGV2ZW50IGlzIHNldCBpdCBtZWFucyB0aGF0IHBhY2tldHMgYmVmb3JlIHRoZSBldmVudCBoYWQgc21hbGxlcgorICAgKiBzZXF1ZW5jZSBudW1iZXIsIHNvIHdlIHdpbGwgaW5zZXJ0IG91ciBwYWNrZXQgYWZ0ZXIgdGhlIGV2ZW50ICovCisgIGlmIChldmVudCkKKyAgICBsaXN0ID0gZXZlbnQ7CisKK2FwcGVuZDoKKyAgcXVldWVfZG9faW5zZXJ0IChqYnVmLCBsaXN0LCAoR0xpc3QgKikgaXRlbSk7CisKKyAgLyogYnVmZmVyaW5nIG1vZGUsIHVwZGF0ZSBidWZmZXIgc3RhdHMgKi8KKyAgaWYgKGpidWYtPm1vZGUgPT0gUlRQX0pJVFRFUl9CVUZGRVJfTU9ERV9CVUZGRVIpCisgICAgdXBkYXRlX2J1ZmZlcl9sZXZlbCAoamJ1ZiwgcGVyY2VudCk7CisgIGVsc2UgaWYgKHBlcmNlbnQpCisgICAgKnBlcmNlbnQgPSAtMTsKKworICAvKiBoZWFkIHdhcyBjaGFuZ2VkIHdoZW4gd2UgZGlkIG5vdCBmaW5kIGEgcHJldmlvdXMgcGFja2V0LCB3ZSBzZXQgdGhlIHJldHVybgorICAgKiBmbGFnIHdoZW4gcmVxdWVzdGVkLiAqLworICBpZiAoR19MSUtFTFkgKGhlYWQpKQorICAgICpoZWFkID0gKGxpc3QgPT0gTlVMTCk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitkdXBsaWNhdGU6CisgIHsKKyAgICBHU1RfREVCVUcgKCJkdXBsaWNhdGUgcGFja2V0ICVkIGZvdW5kIiwgKGdpbnQpIHNlcW51bSk7CisgICAgaWYgKEdfTElLRUxZIChoZWFkKSkKKyAgICAgICpoZWFkID0gRkFMU0U7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qKgorICogcnRwX2ppdHRlcl9idWZmZXJfcG9wOgorICogQGpidWY6IGFuICNSVFBKaXR0ZXJCdWZmZXIKKyAqIEBwZXJjZW50OiB0aGUgYnVmZmVyaW5nIHBlcmNlbnQKKyAqCisgKiBQb3BzIHRoZSBvbGRlc3QgYnVmZmVyIGZyb20gdGhlIHBhY2tldCBxdWV1ZSBvZiBAamJ1Zi4gVGhlIHBvcHBlZCBidWZmZXIgd2lsbAorICogaGF2ZSBpdHMgdGltZXN0YW1wIGFkanVzdGVkIHdpdGggdGhlIGluY29tbWluZyBydW5uaW5nX3RpbWUgYW5kIHRoZSBkZXRlY3RlZAorICogY2xvY2sgc2tldy4KKyAqCisgKiBSZXR1cm5zOiBhICNHc3RCdWZmZXIgb3IgJU5VTEwgd2hlbiB0aGVyZSB3YXMgbm8gcGFja2V0IGluIHRoZSBxdWV1ZS4KKyAqLworUlRQSml0dGVyQnVmZmVySXRlbSAqCitydHBfaml0dGVyX2J1ZmZlcl9wb3AgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYsIGdpbnQgKiBwZXJjZW50KQoreworICBHTGlzdCAqaXRlbSA9IE5VTEw7CisgIEdRdWV1ZSAqcXVldWU7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGpidWYgIT0gTlVMTCwgTlVMTCk7CisKKyAgcXVldWUgPSBqYnVmLT5wYWNrZXRzOworCisgIGl0ZW0gPSBxdWV1ZS0+aGVhZDsKKyAgaWYgKGl0ZW0pIHsKKyAgICBxdWV1ZS0+aGVhZCA9IGl0ZW0tPm5leHQ7CisgICAgaWYgKHF1ZXVlLT5oZWFkKQorICAgICAgcXVldWUtPmhlYWQtPnByZXYgPSBOVUxMOworICAgIGVsc2UKKyAgICAgIHF1ZXVlLT50YWlsID0gTlVMTDsKKyAgICBxdWV1ZS0+bGVuZ3RoLS07CisgIH0KKworICAvKiBidWZmZXJpbmcgbW9kZSwgdXBkYXRlIGJ1ZmZlciBzdGF0cyAqLworICBpZiAoamJ1Zi0+bW9kZSA9PSBSVFBfSklUVEVSX0JVRkZFUl9NT0RFX0JVRkZFUikKKyAgICB1cGRhdGVfYnVmZmVyX2xldmVsIChqYnVmLCBwZXJjZW50KTsKKyAgZWxzZSBpZiAocGVyY2VudCkKKyAgICAqcGVyY2VudCA9IC0xOworCisgIHJldHVybiAoUlRQSml0dGVyQnVmZmVySXRlbSAqKSBpdGVtOworfQorCisvKioKKyAqIHJ0cF9qaXR0ZXJfYnVmZmVyX3BlZWs6CisgKiBAamJ1ZjogYW4gI1JUUEppdHRlckJ1ZmZlcgorICoKKyAqIFBlZWsgdGhlIG9sZGVzdCBidWZmZXIgZnJvbSB0aGUgcGFja2V0IHF1ZXVlIG9mIEBqYnVmLgorICoKKyAqIFNlZSBydHBfaml0dGVyX2J1ZmZlcl9pbnNlcnQoKSB0byBjaGVjayB3aGVuIGFuIG9sZGVyIHBhY2tldCB3YXMKKyAqIGFkZGVkLgorICoKKyAqIFJldHVybnM6IGEgI0dzdEJ1ZmZlciBvciAlTlVMTCB3aGVuIHRoZXJlIHdhcyBubyBwYWNrZXQgaW4gdGhlIHF1ZXVlLgorICovCitSVFBKaXR0ZXJCdWZmZXJJdGVtICoKK3J0cF9qaXR0ZXJfYnVmZmVyX3BlZWsgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChqYnVmICE9IE5VTEwsIE5VTEwpOworCisgIHJldHVybiAoUlRQSml0dGVyQnVmZmVySXRlbSAqKSBqYnVmLT5wYWNrZXRzLT5oZWFkOworfQorCisvKioKKyAqIHJ0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoOgorICogQGpidWY6IGFuICNSVFBKaXR0ZXJCdWZmZXIKKyAqIEBmcmVlX2Z1bmM6IGZ1bmN0aW9uIHRvIGZyZWUgZWFjaCBpdGVtCisgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgcGFzc2VkIHRvIEBmcmVlX2Z1bmMKKyAqCisgKiBGbHVzaCBhbGwgcGFja2V0cyBmcm9tIHRoZSBqaXR0ZXJidWZmZXIuCisgKi8KK3ZvaWQKK3J0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoIChSVFBKaXR0ZXJCdWZmZXIgKiBqYnVmLCBHRnVuYyBmcmVlX2Z1bmMsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHTGlzdCAqaXRlbTsKKworICBnX3JldHVybl9pZl9mYWlsIChqYnVmICE9IE5VTEwpOworICBnX3JldHVybl9pZl9mYWlsIChmcmVlX2Z1bmMgIT0gTlVMTCk7CisKKyAgd2hpbGUgKChpdGVtID0gZ19xdWV1ZV9wb3BfaGVhZF9saW5rIChqYnVmLT5wYWNrZXRzKSkpCisgICAgZnJlZV9mdW5jICgoUlRQSml0dGVyQnVmZmVySXRlbSAqKSBpdGVtLCB1c2VyX2RhdGEpOworfQorCisvKioKKyAqIHJ0cF9qaXR0ZXJfYnVmZmVyX2lzX2J1ZmZlcmluZzoKKyAqIEBqYnVmOiBhbiAjUlRQSml0dGVyQnVmZmVyCisgKgorICogQ2hlY2sgaWYgQGpidWYgaXMgYnVmZmVyaW5nIGN1cnJlbnRseS4gVXNlcnMgb2YgdGhlIGppdHRlcmJ1ZmZlciBzaG91bGQgbm90CisgKiBwb3AgcGFja2V0cyB3aGlsZSBpbiBidWZmZXJpbmcgbW9kZS4KKyAqCisgKiBSZXR1cm5zOiB0aGUgYnVmZmVyaW5nIHN0YXRlIG9mIEBqYnVmCisgKi8KK2dib29sZWFuCitydHBfaml0dGVyX2J1ZmZlcl9pc19idWZmZXJpbmcgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYpCit7CisgIHJldHVybiBqYnVmLT5idWZmZXJpbmcgJiYgIWpidWYtPmJ1ZmZlcmluZ19kaXNhYmxlZDsKK30KKworLyoqCisgKiBydHBfaml0dGVyX2J1ZmZlcl9zZXRfYnVmZmVyaW5nOgorICogQGpidWY6IGFuICNSVFBKaXR0ZXJCdWZmZXIKKyAqIEBidWZmZXJpbmc6IHRoZSBuZXcgYnVmZmVyaW5nIHN0YXRlCisgKgorICogRm9yY2VzIEBqYnVmIHRvIGdvIGludG8gdGhlIGJ1ZmZlcmluZyBzdGF0ZS4KKyAqLwordm9pZAorcnRwX2ppdHRlcl9idWZmZXJfc2V0X2J1ZmZlcmluZyAoUlRQSml0dGVyQnVmZmVyICogamJ1ZiwgZ2Jvb2xlYW4gYnVmZmVyaW5nKQoreworICBqYnVmLT5idWZmZXJpbmcgPSBidWZmZXJpbmc7Cit9CisKKy8qKgorICogcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3BlcmNlbnQ6CisgKiBAamJ1ZjogYW4gI1JUUEppdHRlckJ1ZmZlcgorICoKKyAqIEdldCB0aGUgYnVmZmVyaW5nIHBlcmNlbnQgb2YgdGhlIGppdHRlcmJ1ZmZlci4KKyAqCisgKiBSZXR1cm5zOiB0aGUgYnVmZmVyaW5nIHBlcmNlbnQKKyAqLworZ2ludAorcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3BlcmNlbnQgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYpCit7CisgIGdpbnQgcGVyY2VudDsKKyAgZ3VpbnQ2NCBsZXZlbDsKKworICBpZiAoR19VTkxJS0VMWSAoamJ1Zi0+aGlnaF9sZXZlbCA9PSAwKSkKKyAgICByZXR1cm4gMTAwOworCisgIGlmIChHX1VOTElLRUxZIChqYnVmLT5idWZmZXJpbmdfZGlzYWJsZWQpKQorICAgIHJldHVybiAxMDA7CisKKyAgbGV2ZWwgPSBnZXRfYnVmZmVyX2xldmVsIChqYnVmKTsKKyAgcGVyY2VudCA9IChsZXZlbCAqIDEwMCAvIGpidWYtPmhpZ2hfbGV2ZWwpOworICBwZXJjZW50ID0gTUlOIChwZXJjZW50LCAxMDApOworCisgIHJldHVybiBwZXJjZW50OworfQorCisvKioKKyAqIHJ0cF9qaXR0ZXJfYnVmZmVyX251bV9wYWNrZXRzOgorICogQGpidWY6IGFuICNSVFBKaXR0ZXJCdWZmZXIKKyAqCisgKiBHZXQgdGhlIG51bWJlciBvZiBwYWNrZXRzIGN1cnJlbnRseSBpbiAiamJ1Zi4KKyAqCisgKiBSZXR1cm5zOiBUaGUgbnVtYmVyIG9mIHBhY2tldHMgaW4gQGpidWYuCisgKi8KK2d1aW50CitydHBfaml0dGVyX2J1ZmZlcl9udW1fcGFja2V0cyAoUlRQSml0dGVyQnVmZmVyICogamJ1ZikKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGpidWYgIT0gTlVMTCwgMCk7CisKKyAgcmV0dXJuIGpidWYtPnBhY2tldHMtPmxlbmd0aDsKK30KKworLyoqCisgKiBydHBfaml0dGVyX2J1ZmZlcl9nZXRfdHNfZGlmZjoKKyAqIEBqYnVmOiBhbiAjUlRQSml0dGVyQnVmZmVyCisgKgorICogR2V0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHRpbWVzdGFtcHMgb2YgZmlyc3QgYW5kIGxhc3QgcGFja2V0IGluIHRoZQorICogaml0dGVyYnVmZmVyLgorICoKKyAqIFJldHVybnM6IFRoZSBkaWZmZXJlbmNlIGV4cHJlc3NlZCBpbiB0aGUgdGltZXN0YW1wIHVuaXRzIG9mIHRoZSBwYWNrZXRzLgorICovCitndWludDMyCitydHBfaml0dGVyX2J1ZmZlcl9nZXRfdHNfZGlmZiAoUlRQSml0dGVyQnVmZmVyICogamJ1ZikKK3sKKyAgZ3VpbnQ2NCBoaWdoX3RzLCBsb3dfdHM7CisgIFJUUEppdHRlckJ1ZmZlckl0ZW0gKmhpZ2hfYnVmLCAqbG93X2J1ZjsKKyAgZ3VpbnQzMiByZXN1bHQ7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGpidWYgIT0gTlVMTCwgMCk7CisKKyAgaGlnaF9idWYgPSAoUlRQSml0dGVyQnVmZmVySXRlbSAqKSBnX3F1ZXVlX3BlZWtfdGFpbF9saW5rIChqYnVmLT5wYWNrZXRzKTsKKyAgbG93X2J1ZiA9IChSVFBKaXR0ZXJCdWZmZXJJdGVtICopIGdfcXVldWVfcGVla19oZWFkX2xpbmsgKGpidWYtPnBhY2tldHMpOworCisgIGlmICghaGlnaF9idWYgfHwgIWxvd19idWYgfHwgaGlnaF9idWYgPT0gbG93X2J1ZikKKyAgICByZXR1cm4gMDsKKworICBoaWdoX3RzID0gaGlnaF9idWYtPnJ0cHRpbWU7CisgIGxvd190cyA9IGxvd19idWYtPnJ0cHRpbWU7CisKKyAgLyogaXQgbmVlZHMgdG8gd29yayBpZiB0cyB3cmFwcyAqLworICBpZiAoaGlnaF90cyA+PSBsb3dfdHMpIHsKKyAgICByZXN1bHQgPSAoZ3VpbnQzMikgKGhpZ2hfdHMgLSBsb3dfdHMpOworICB9IGVsc2UgeworICAgIHJlc3VsdCA9IChndWludDMyKSAoaGlnaF90cyArIEdfTUFYVUlOVDMyICsgMSAtIGxvd190cyk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBydHBfaml0dGVyX2J1ZmZlcl9nZXRfc3luYzoKKyAqIEBqYnVmOiBhbiAjUlRQSml0dGVyQnVmZmVyCisgKiBAcnRwdGltZTogcmVzdWx0IFJUUCB0aW1lCisgKiBAdGltZXN0YW1wOiByZXN1bHQgR1N0cmVhbWVyIHRpbWVzdGFtcAorICogQGNsb2NrX3JhdGU6IGNsb2NrLXJhdGUgb2YgQHJ0cHRpbWUKKyAqIEBsYXN0X3J0cHRpbWU6IGxhc3Qgc2VlbiBydHB0aW1lLgorICoKKyAqIENhbGN1bGF0ZXMgdGhlIHJlbGF0aW9uIGJldHdlZW4gdGhlIFJUUCB0aW1lc3RhbXAgYW5kIHRoZSBHU3RyZWFtZXIgdGltZXN0YW1wCisgKiB1c2VkIGZvciBjb25zdHJ1Y3RpbmcgdGltZXN0YW1wcy4KKyAqCisgKiBGb3IgZXh0ZW5kZWQgUlRQIHRpbWVzdGFtcCBAcnRwdGltZSB3aXRoIGEgY2xvY2stcmF0ZSBvZiBAY2xvY2tfcmF0ZSwKKyAqIHRoZSBHU3RyZWFtZXIgdGltZXN0YW1wIGlzIGN1cnJlbnRseSBAdGltZXN0YW1wLgorICoKKyAqIFRoZSBsYXN0IHNlZW4gZXh0ZW5kZWQgUlRQIHRpbWVzdGFtcCB3aXRoIGNsb2NrLXJhdGUgQGNsb2NrLXJhdGUgaXMgcmV0dXJuZWQgaW4KKyAqIEBsYXN0X3J0cHRpbWUuCisgKi8KK3ZvaWQKK3J0cF9qaXR0ZXJfYnVmZmVyX2dldF9zeW5jIChSVFBKaXR0ZXJCdWZmZXIgKiBqYnVmLCBndWludDY0ICogcnRwdGltZSwKKyAgICBndWludDY0ICogdGltZXN0YW1wLCBndWludDMyICogY2xvY2tfcmF0ZSwgZ3VpbnQ2NCAqIGxhc3RfcnRwdGltZSkKK3sKKyAgaWYgKHJ0cHRpbWUpCisgICAgKnJ0cHRpbWUgPSBqYnVmLT5iYXNlX2V4dHJ0cDsKKyAgaWYgKHRpbWVzdGFtcCkKKyAgICAqdGltZXN0YW1wID0gamJ1Zi0+YmFzZV90aW1lICsgamJ1Zi0+c2tldzsKKyAgaWYgKGNsb2NrX3JhdGUpCisgICAgKmNsb2NrX3JhdGUgPSBqYnVmLT5jbG9ja19yYXRlOworICBpZiAobGFzdF9ydHB0aW1lKQorICAgICpsYXN0X3J0cHRpbWUgPSBqYnVmLT5sYXN0X3J0cHRpbWU7Cit9CisKKy8qKgorICogcnRwX2ppdHRlcl9idWZmZXJfY2FuX2Zhc3Rfc3RhcnQ6CisgKiBAamJ1ZjogYW4gI1JUUEppdHRlckJ1ZmZlcgorICogQG51bV9wYWNrZXRzOiBOdW1iZXIgb2YgY29uc2VjdXRpdmUgcGFja2V0cyBuZWVkZWQKKyAqCisgKiBDaGVjayBpZiBpbiB0aGUgcXVldWUgaWYgdGhlcmUgaXMgZW5vdWdoIHBhY2tldHMgd2l0aCBjb25zZWN1dGl2ZSBzZXFudW0gaW4KKyAqIG9yZGVyIHRvIHN0YXJ0IGRlbGl2ZXJpbmcgdGhlbS4KKyAqCisgKiBSZXR1cm5zOiAlVFJVRSBpZiB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHBhY2tldHMgd2FzIGZvdW5kLgorICovCitnYm9vbGVhbgorcnRwX2ppdHRlcl9idWZmZXJfY2FuX2Zhc3Rfc3RhcnQgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYsIGdpbnQgbnVtX3BhY2tldCkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKyAgUlRQSml0dGVyQnVmZmVySXRlbSAqbGFzdF9pdGVtID0gTlVMTCwgKml0ZW07CisgIGdpbnQgaTsKKworICBpZiAocnRwX2ppdHRlcl9idWZmZXJfbnVtX3BhY2tldHMgKGpidWYpIDwgbnVtX3BhY2tldCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaXRlbSA9IHJ0cF9qaXR0ZXJfYnVmZmVyX3BlZWsgKGpidWYpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhY2tldDsgaSsrKSB7CisgICAgaWYgKEdfTElLRUxZIChsYXN0X2l0ZW0pKSB7CisgICAgICBndWludDE2IGV4cGVjdGVkX3NlcW51bSA9IGxhc3RfaXRlbS0+c2VxbnVtICsgMTsKKworICAgICAgaWYgKGV4cGVjdGVkX3NlcW51bSAhPSBpdGVtLT5zZXFudW0pIHsKKyAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGxhc3RfaXRlbSA9IGl0ZW07CisgICAgaXRlbSA9IChSVFBKaXR0ZXJCdWZmZXJJdGVtICopIGxhc3RfaXRlbS0+bmV4dDsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaCBiL2dzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZGI2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaApAQCAtMCwwICsxLDE5NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19SVFBfSklUVEVSX0JVRkZFUl9IX18KKyNkZWZpbmUgX19SVFBfSklUVEVSX0JVRkZFUl9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0Y3BidWZmZXIuaD4KKwordHlwZWRlZiBzdHJ1Y3QgX1JUUEppdHRlckJ1ZmZlciBSVFBKaXR0ZXJCdWZmZXI7Cit0eXBlZGVmIHN0cnVjdCBfUlRQSml0dGVyQnVmZmVyQ2xhc3MgUlRQSml0dGVyQnVmZmVyQ2xhc3M7Cit0eXBlZGVmIHN0cnVjdCBfUlRQSml0dGVyQnVmZmVySXRlbSBSVFBKaXR0ZXJCdWZmZXJJdGVtOworCisjZGVmaW5lIFJUUF9UWVBFX0pJVFRFUl9CVUZGRVIgICAgICAgICAgICAgKHJ0cF9qaXR0ZXJfYnVmZmVyX2dldF90eXBlKCkpCisjZGVmaW5lIFJUUF9KSVRURVJfQlVGRkVSKHNyYykgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChzcmMpLFJUUF9UWVBFX0pJVFRFUl9CVUZGRVIsUlRQSml0dGVyQnVmZmVyKSkKKyNkZWZpbmUgUlRQX0pJVFRFUl9CVUZGRVJfQ0xBU1Moa2xhc3MpICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxSVFBfVFlQRV9KSVRURVJfQlVGRkVSLFJUUEppdHRlckJ1ZmZlckNsYXNzKSkKKyNkZWZpbmUgUlRQX0lTX0pJVFRFUl9CVUZGRVIoc3JjKSAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKHNyYyksUlRQX1RZUEVfSklUVEVSX0JVRkZFUikpCisjZGVmaW5lIFJUUF9JU19KSVRURVJfQlVGRkVSX0NMQVNTKGtsYXNzKSAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksUlRQX1RZUEVfSklUVEVSX0JVRkZFUikpCisjZGVmaW5lIFJUUF9KSVRURVJfQlVGRkVSX0NBU1Qoc3JjKSAgICAgICAgKChSVFBKaXR0ZXJCdWZmZXIgKikoc3JjKSkKKworLyoqCisgKiBSVFBKaXR0ZXJCdWZmZXJNb2RlOgorICogQFJUUF9KSVRURVJfQlVGRkVSX01PREVfTk9ORTogZG9uJ3QgZG8gYW55IHNrZXcgY29ycmVjdGlvbiwgb3V0Z29pbmcKKyAqICAgIHRpbWVzdGFtcHMgYXJlIGNhbGN1bGF0ZWQgZGlyZWN0bHkgZnJvbSB0aGUgUlRQIHRpbWVzdGFtcHMuIFRoaXMgbW9kZSBpcworICogICAgZ29vZCBmb3IgcmVjb3JkaW5nIGJ1dCBub3QgZm9yIHJlYWwtdGltZSBhcHBsaWNhdGlvbnMuCisgKiBAUlRQX0pJVFRFUl9CVUZGRVJfTU9ERV9TTEFWRTogY2FsY3VsYXRlIHRoZSBza2V3IGJldHdlZW4gc2VuZGVyIGFuZCByZWNlaXZlcgorICogICAgYW5kIHByb2R1Y2Ugc21vb3RoZWQgYWRqdXN0ZWQgb3V0Z29pbmcgdGltZXN0YW1wcy4gVGhpcyBtb2RlIGlzIGdvb2QgZm9yCisgKiAgICBsb3cgbGF0ZW5jeSBjb21tdW5pY2F0aW9ucy4KKyAqIEBSVFBfSklUVEVSX0JVRkZFUl9NT0RFX0JVRkZFUjogYnVmZmVyIHBhY2tldHMgYmV0d2VlbiBsb3cvaGlnaCB3YXRlcm1hcmtzLgorICogICAgVGhpcyBtb2RlIGlzIGdvb2QgZm9yIHN0cmVhbWluZyBjb21tdW5pY2F0aW9uLgorICogQFJUUF9KSVRURVJfQlVGRkVSX01PREVfU1lOQ0VEOiBzZW5kZXIgYW5kIHJlY2VpdmVyIGNsb2NrcyBhcmUgc3luY2hyb25pemVkLAorICogICAgbGlrZSAjUlRQX0pJVFRFUl9CVUZGRVJfTU9ERV9TTEFWRSBidXQgc2tldyBpcyBhc3N1bWVkIHRvIGJlIDAuIEdvb2QgZm9yCisgKiAgICBsb3cgbGF0ZW5jeSBjb21tdW5pY2F0aW9uIHdoZW4gc2VuZGVyIGFuZCByZWNlaXZlciBjbG9ja3MgYXJlCisgKiAgICBzeW5jaHJvbml6ZWQgYW5kIHRoZXJlIGlzIHRodXMgbm8gY2xvY2sgc2tldy4KKyAqIEBSVFBfSklUVEVSX0JVRkZFUl9NT0RFX0xBU1Q6IGxhc3QgYnVmZmVyIG1vZGUuCisgKgorICogVGhlIGRpZmZlcmVudCBidWZmZXIgbW9kZXMgZm9yIGEgaml0dGVyYnVmZmVyLgorICovCit0eXBlZGVmIGVudW0geworICBSVFBfSklUVEVSX0JVRkZFUl9NT0RFX05PTkUgICAgPSAwLAorICBSVFBfSklUVEVSX0JVRkZFUl9NT0RFX1NMQVZFICAgPSAxLAorICBSVFBfSklUVEVSX0JVRkZFUl9NT0RFX0JVRkZFUiAgPSAyLAorICAvKiBGSVhNRSAzIGlzIG1pc3NpbmcgYmVjYXVzZSBpdCB3YXMgdXNlZCBmb3IgJ2F1dG8nIGluIGppdHRlcmJ1ZmZlciAqLworICBSVFBfSklUVEVSX0JVRkZFUl9NT0RFX1NZTkNFRCAgPSA0LAorICBSVFBfSklUVEVSX0JVRkZFUl9NT0RFX0xBU1QKK30gUlRQSml0dGVyQnVmZmVyTW9kZTsKKworI2RlZmluZSBSVFBfVFlQRV9KSVRURVJfQlVGRkVSX01PREUgKHJ0cF9qaXR0ZXJfYnVmZmVyX21vZGVfZ2V0X3R5cGUoKSkKK0dUeXBlIHJ0cF9qaXR0ZXJfYnVmZmVyX21vZGVfZ2V0X3R5cGUgKHZvaWQpOworCisjZGVmaW5lIFJUUF9KSVRURVJfQlVGRkVSX01BWF9XSU5ET1cgNTEyCisvKioKKyAqIFJUUEppdHRlckJ1ZmZlcjoKKyAqCisgKiBBIEppdHRlckJ1ZmZlciBpbiB0aGUgI1JUUFNlc3Npb24KKyAqLworc3RydWN0IF9SVFBKaXR0ZXJCdWZmZXIgeworICBHT2JqZWN0ICAgICAgICBvYmplY3Q7CisKKyAgR1F1ZXVlICAgICAgICAqcGFja2V0czsKKworICBSVFBKaXR0ZXJCdWZmZXJNb2RlIG1vZGU7CisKKyAgR3N0Q2xvY2tUaW1lICAgZGVsYXk7CisKKyAgLyogZm9yIGJ1ZmZlcmluZyAqLworICBnYm9vbGVhbiAgICAgICAgICBidWZmZXJpbmc7CisgIGd1aW50NjQgICAgICAgICAgIGxvd19sZXZlbDsKKyAgZ3VpbnQ2NCAgICAgICAgICAgaGlnaF9sZXZlbDsKKworICAvKiBmb3IgY2FsY3VsYXRpbmcgc2tldyAqLworICBnYm9vbGVhbiAgICAgICBuZWVkX3Jlc3luYzsKKyAgR3N0Q2xvY2tUaW1lICAgYmFzZV90aW1lOworICBHc3RDbG9ja1RpbWUgICBiYXNlX3J0cHRpbWU7CisgIEdzdENsb2NrVGltZSAgIG1lZGlhX2Nsb2NrX2Jhc2VfdGltZTsKKyAgZ3VpbnQzMiAgICAgICAgY2xvY2tfcmF0ZTsKKyAgR3N0Q2xvY2tUaW1lICAgYmFzZV9leHRydHA7CisgIEdzdENsb2NrVGltZSAgIHByZXZfb3V0X3RpbWU7CisgIGd1aW50NjQgICAgICAgIGV4dF9ydHB0aW1lOworICBndWludDY0ICAgICAgICBsYXN0X3J0cHRpbWU7CisgIGdpbnQ2NCAgICAgICAgIHdpbmRvd1tSVFBfSklUVEVSX0JVRkZFUl9NQVhfV0lORE9XXTsKKyAgZ3VpbnQgICAgICAgICAgd2luZG93X3BvczsKKyAgZ3VpbnQgICAgICAgICAgd2luZG93X3NpemU7CisgIGdib29sZWFuICAgICAgIHdpbmRvd19maWxsaW5nOworICBnaW50NjQgICAgICAgICB3aW5kb3dfbWluOworICBnaW50NjQgICAgICAgICBza2V3OworICBnaW50NjQgICAgICAgICBwcmV2X3NlbmRfZGlmZjsKKyAgZ2Jvb2xlYW4gICAgICAgYnVmZmVyaW5nX2Rpc2FibGVkOworCisgIEdNdXRleCAgICAgICAgIGNsb2NrX2xvY2s7CisgIEdzdENsb2NrICAgICAgKnBpcGVsaW5lX2Nsb2NrOworICBHc3RDbG9jayAgICAgICptZWRpYV9jbG9jazsKKyAgZ3Vsb25nICAgICAgICAgbWVkaWFfY2xvY2tfc3luY2VkX2lkOworICBndWludDY0ICAgICAgICBtZWRpYV9jbG9ja19vZmZzZXQ7CisKKyAgZ2Jvb2xlYW4gICAgICAgcmZjNzI3M19zeW5jOworfTsKKworc3RydWN0IF9SVFBKaXR0ZXJCdWZmZXJDbGFzcyB7CisgIEdPYmplY3RDbGFzcyAgIHBhcmVudF9jbGFzczsKK307CisKKy8qKgorICogUlRQSml0dGVyQnVmZmVySXRlbToKKyAqIEBkYXRhOiB0aGUgZGF0YSBvZiB0aGUgaXRlbQorICogQG5leHQ6IHBvaW50ZXIgdG8gbmV4dCBpdGVtCisgKiBAcHJldjogcG9pbnRlciB0byBwcmV2aW91cyBpdGVtCisgKiBAdHlwZTogdGhlIHR5cGUgb2YgQGRhdGEsIHVzZWQgZnJlZWx5IGJ5IGNhbGxlcgorICogQGR0czogaW5wdXQgRFRTCisgKiBAcHRzOiBvdXRwdXQgUFRTCisgKiBAc2VxbnVtOiBzZXFudW0sIHRoZSBzZXFudW0gaXMgdXNlZCB0byBpbnNlcnQgdGhlIGl0ZW0gaW4gdGhlCisgKiAgIHJpZ2h0IHBvc2l0aW9uIGluIHRoZSBqaXR0ZXJidWZmZXIgYW5kIGRldGVjdCBkdXBsaWNhdGVzLiBVc2UgLTEgdG8KKyAqICAgYXBwZW5kLgorICogQGNvdW50OiBhbW91bnQgb2Ygc2VxbnVtIGluIHRoaXMgaXRlbQorICogQHJ0cHRpbWU6IHJ0cCB0aW1lc3RhbXAKKyAqCisgKiBBbiBvYmplY3QgY29udGFpbmluZyBhbiBSVFAgcGFja2V0IG9yIGV2ZW50LgorICovCitzdHJ1Y3QgX1JUUEppdHRlckJ1ZmZlckl0ZW0geworICBncG9pbnRlciBkYXRhOworICBHTGlzdCAqbmV4dDsKKyAgR0xpc3QgKnByZXY7CisgIGd1aW50IHR5cGU7CisgIEdzdENsb2NrVGltZSBkdHM7CisgIEdzdENsb2NrVGltZSBwdHM7CisgIGd1aW50IHNlcW51bTsKKyAgZ3VpbnQgY291bnQ7CisgIGd1aW50IHJ0cHRpbWU7Cit9OworCitHVHlwZSBydHBfaml0dGVyX2J1ZmZlcl9nZXRfdHlwZSAodm9pZCk7CisKKy8qIG1hbmFnaW5nIGxpZmV0aW1lICovCitSVFBKaXR0ZXJCdWZmZXIqICAgICAgcnRwX2ppdHRlcl9idWZmZXJfbmV3ICAgICAgICAgICAgICAodm9pZCk7CisKK1JUUEppdHRlckJ1ZmZlck1vZGUgICBydHBfaml0dGVyX2J1ZmZlcl9nZXRfbW9kZSAgICAgICAgIChSVFBKaXR0ZXJCdWZmZXIgKmpidWYpOwordm9pZCAgICAgICAgICAgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX3NldF9tb2RlICAgICAgICAgKFJUUEppdHRlckJ1ZmZlciAqamJ1ZiwgUlRQSml0dGVyQnVmZmVyTW9kZSBtb2RlKTsKKworR3N0Q2xvY2tUaW1lICAgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX2dldF9kZWxheSAgICAgICAgKFJUUEppdHRlckJ1ZmZlciAqamJ1Zik7Cit2b2lkICAgICAgICAgICAgICAgICAgcnRwX2ppdHRlcl9idWZmZXJfc2V0X2RlbGF5ICAgICAgICAoUlRQSml0dGVyQnVmZmVyICpqYnVmLCBHc3RDbG9ja1RpbWUgZGVsYXkpOworCit2b2lkICAgICAgICAgICAgICAgICAgcnRwX2ppdHRlcl9idWZmZXJfc2V0X2Nsb2NrX3JhdGUgICAoUlRQSml0dGVyQnVmZmVyICpqYnVmLCBndWludDMyIGNsb2NrX3JhdGUpOworZ3VpbnQzMiAgICAgICAgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX2dldF9jbG9ja19yYXRlICAgKFJUUEppdHRlckJ1ZmZlciAqamJ1Zik7CisKK3ZvaWQgICAgICAgICAgICAgICAgICBydHBfaml0dGVyX2J1ZmZlcl9zZXRfbWVkaWFfY2xvY2sgIChSVFBKaXR0ZXJCdWZmZXIgKmpidWYsIEdzdENsb2NrICogY2xvY2ssIGd1aW50NjQgY2xvY2tfb2Zmc2V0KTsKK3ZvaWQgICAgICAgICAgICAgICAgICBydHBfaml0dGVyX2J1ZmZlcl9zZXRfcGlwZWxpbmVfY2xvY2sgKFJUUEppdHRlckJ1ZmZlciAqamJ1ZiwgR3N0Q2xvY2sgKiBjbG9jayk7CisKK2dib29sZWFuICAgICAgICAgICAgICBydHBfaml0dGVyX2J1ZmZlcl9nZXRfcmZjNzI3M19zeW5jIChSVFBKaXR0ZXJCdWZmZXIgKmpidWYpOwordm9pZCAgICAgICAgICAgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX3NldF9yZmM3MjczX3N5bmMgKFJUUEppdHRlckJ1ZmZlciAqamJ1ZiwgZ2Jvb2xlYW4gcmZjNzI3M19zeW5jKTsKKwordm9pZCAgICAgICAgICAgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX3Jlc2V0X3NrZXcgICAgICAgKFJUUEppdHRlckJ1ZmZlciAqamJ1Zik7CisKK2dib29sZWFuICAgICAgICAgICAgICBydHBfaml0dGVyX2J1ZmZlcl9pbnNlcnQgICAgICAgICAgIChSVFBKaXR0ZXJCdWZmZXIgKmpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRQSml0dGVyQnVmZmVySXRlbSAqaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYm9vbGVhbiAqaGVhZCwgZ2ludCAqcGVyY2VudCk7CisKK3ZvaWQgICAgICAgICAgICAgICAgICBydHBfaml0dGVyX2J1ZmZlcl9kaXNhYmxlX2J1ZmZlcmluZyAoUlRQSml0dGVyQnVmZmVyICpqYnVmLCBnYm9vbGVhbiBkaXNhYmxlZCk7CisKK1JUUEppdHRlckJ1ZmZlckl0ZW0gKiBydHBfaml0dGVyX2J1ZmZlcl9wZWVrICAgICAgICAgICAgIChSVFBKaXR0ZXJCdWZmZXIgKmpidWYpOworUlRQSml0dGVyQnVmZmVySXRlbSAqIHJ0cF9qaXR0ZXJfYnVmZmVyX3BvcCAgICAgICAgICAgICAgKFJUUEppdHRlckJ1ZmZlciAqamJ1ZiwgZ2ludCAqcGVyY2VudCk7CisKK3ZvaWQgICAgICAgICAgICAgICAgICBydHBfaml0dGVyX2J1ZmZlcl9mbHVzaCAgICAgICAgICAgIChSVFBKaXR0ZXJCdWZmZXIgKmpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Z1bmMgZnJlZV9mdW5jLCBncG9pbnRlciB1c2VyX2RhdGEpOworCitnYm9vbGVhbiAgICAgICAgICAgICAgcnRwX2ppdHRlcl9idWZmZXJfaXNfYnVmZmVyaW5nICAgICAoUlRQSml0dGVyQnVmZmVyICogamJ1Zik7Cit2b2lkICAgICAgICAgICAgICAgICAgcnRwX2ppdHRlcl9idWZmZXJfc2V0X2J1ZmZlcmluZyAgICAoUlRQSml0dGVyQnVmZmVyICogamJ1ZiwgZ2Jvb2xlYW4gYnVmZmVyaW5nKTsKK2dpbnQgICAgICAgICAgICAgICAgICBydHBfaml0dGVyX2J1ZmZlcl9nZXRfcGVyY2VudCAgICAgIChSVFBKaXR0ZXJCdWZmZXIgKiBqYnVmKTsKKworZ3VpbnQgICAgICAgICAgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX251bV9wYWNrZXRzICAgICAgKFJUUEppdHRlckJ1ZmZlciAqamJ1Zik7CitndWludDMyICAgICAgICAgICAgICAgcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3RzX2RpZmYgICAgICAoUlRQSml0dGVyQnVmZmVyICpqYnVmKTsKKwordm9pZCAgICAgICAgICAgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX2dldF9zeW5jICAgICAgICAgKFJUUEppdHRlckJ1ZmZlciAqamJ1ZiwgZ3VpbnQ2NCAqcnRwdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDY0ICp0aW1lc3RhbXAsIGd1aW50MzIgKmNsb2NrX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCAqbGFzdF9ydHB0aW1lKTsKKworR3N0Q2xvY2tUaW1lICAgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX2NhbGN1bGF0ZV9wdHMgICAgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYsIEdzdENsb2NrVGltZSBkdHMsIGdib29sZWFuIGVzdGltYXRlZF9kdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBydHB0aW1lLCBHc3RDbG9ja1RpbWUgYmFzZV90aW1lKTsKKworZ2Jvb2xlYW4gICAgICAgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX2Nhbl9mYXN0X3N0YXJ0ICAgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYsIGdpbnQgbnVtX3BhY2tldCk7CisKKyNlbmRpZiAvKiBfX1JUUF9KSVRURVJfQlVGRkVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jIGIvZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiOTlkMjMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmMKQEAgLTAsMCArMSw0NDI4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyogRklYTUUgMC4xMTogc3VwcHJlc3Mgd2FybmluZ3MgZm9yIGRlcHJlY2F0ZWQgQVBJIHN1Y2ggYXMgR1ZhbHVlQXJyYXkKKyAqIHdpdGggbmV3ZXIgR0xpYiB2ZXJzaW9ucyAoPj0gMi4zMS4wKSAqLworI2RlZmluZSBHTElCX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0Y3BidWZmZXIuaD4KKworI2luY2x1ZGUgPGdzdC9nbGliLWNvbXBhdC1wcml2YXRlLmg+CisKKyNpbmNsdWRlICJydHBzZXNzaW9uLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cF9zZXNzaW9uX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHJ0cF9zZXNzaW9uX2RlYnVnCisKKy8qIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgU0lHTkFMX0dFVF9TT1VSQ0VfQllfU1NSQywKKyAgU0lHTkFMX09OX05FV19TU1JDLAorICBTSUdOQUxfT05fU1NSQ19DT0xMSVNJT04sCisgIFNJR05BTF9PTl9TU1JDX1ZBTElEQVRFRCwKKyAgU0lHTkFMX09OX1NTUkNfQUNUSVZFLAorICBTSUdOQUxfT05fU1NSQ19TREVTLAorICBTSUdOQUxfT05fQllFX1NTUkMsCisgIFNJR05BTF9PTl9CWUVfVElNRU9VVCwKKyAgU0lHTkFMX09OX1RJTUVPVVQsCisgIFNJR05BTF9PTl9TRU5ERVJfVElNRU9VVCwKKyAgU0lHTkFMX09OX1NFTkRJTkdfUlRDUCwKKyAgU0lHTkFMX09OX0FQUF9SVENQLAorICBTSUdOQUxfT05fRkVFREJBQ0tfUlRDUCwKKyAgU0lHTkFMX1NFTkRfUlRDUCwKKyAgU0lHTkFMX1NFTkRfUlRDUF9GVUxMLAorICBTSUdOQUxfT05fUkVDRUlWSU5HX1JUQ1AsCisgIFNJR05BTF9PTl9ORVdfU0VOREVSX1NTUkMsCisgIFNJR05BTF9PTl9TRU5ERVJfU1NSQ19BQ1RJVkUsCisgIExBU1RfU0lHTkFMCit9OworCisjZGVmaW5lIERFRkFVTFRfSU5URVJOQUxfU09VUkNFICAgICAgTlVMTAorI2RlZmluZSBERUZBVUxUX0JBTkRXSURUSCAgICAgICAgICAgIDAuMAorI2RlZmluZSBERUZBVUxUX1JUQ1BfRlJBQ1RJT04gICAgICAgIFJUUF9TVEFUU19SVENQX0ZSQUNUSU9OCisjZGVmaW5lIERFRkFVTFRfUlRDUF9SUl9CQU5EV0lEVEggICAgLTEKKyNkZWZpbmUgREVGQVVMVF9SVENQX1JTX0JBTkRXSURUSCAgICAtMQorI2RlZmluZSBERUZBVUxUX1JUQ1BfTVRVICAgICAgICAgICAgIDE0MDAKKyNkZWZpbmUgREVGQVVMVF9TREVTICAgICAgICAgICAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfTlVNX1NPVVJDRVMgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX05VTV9BQ1RJVkVfU09VUkNFUyAgIDAKKyNkZWZpbmUgREVGQVVMVF9TT1VSQ0VTICAgICAgICAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfUlRDUF9NSU5fSU5URVJWQUwgICAgKFJUUF9TVEFUU19NSU5fSU5URVJWQUwgKiBHU1RfU0VDT05EKQorI2RlZmluZSBERUZBVUxUX1JUQ1BfRkVFREJBQ0tfUkVURU5USU9OX1dJTkRPVyAoMiAqIEdTVF9TRUNPTkQpCisjZGVmaW5lIERFRkFVTFRfUlRDUF9JTU1FRElBVEVfRkVFREJBQ0tfVEhSRVNIT0xEICgzKQorI2RlZmluZSBERUZBVUxUX1BST0JBVElPTiAgICAgICAgICAgIFJUUF9ERUZBVUxUX1BST0JBVElPTgorI2RlZmluZSBERUZBVUxUX01BWF9EUk9QT1VUX1RJTUUgICAgIDYwMDAwCisjZGVmaW5lIERFRkFVTFRfTUFYX01JU09SREVSX1RJTUUgICAgMjAwMAorI2RlZmluZSBERUZBVUxUX1JUUF9QUk9GSUxFICAgICAgICAgIEdTVF9SVFBfUFJPRklMRV9BVlAKKyNkZWZpbmUgREVGQVVMVF9SVENQX1JFRFVDRURfU0laRSAgICBGQUxTRQorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9JTlRFUk5BTF9TU1JDLAorICBQUk9QX0lOVEVSTkFMX1NPVVJDRSwKKyAgUFJPUF9CQU5EV0lEVEgsCisgIFBST1BfUlRDUF9GUkFDVElPTiwKKyAgUFJPUF9SVENQX1JSX0JBTkRXSURUSCwKKyAgUFJPUF9SVENQX1JTX0JBTkRXSURUSCwKKyAgUFJPUF9SVENQX01UVSwKKyAgUFJPUF9TREVTLAorICBQUk9QX05VTV9TT1VSQ0VTLAorICBQUk9QX05VTV9BQ1RJVkVfU09VUkNFUywKKyAgUFJPUF9TT1VSQ0VTLAorICBQUk9QX0ZBVk9SX05FVywKKyAgUFJPUF9SVENQX01JTl9JTlRFUlZBTCwKKyAgUFJPUF9SVENQX0ZFRURCQUNLX1JFVEVOVElPTl9XSU5ET1csCisgIFBST1BfUlRDUF9JTU1FRElBVEVfRkVFREJBQ0tfVEhSRVNIT0xELAorICBQUk9QX1BST0JBVElPTiwKKyAgUFJPUF9NQVhfRFJPUE9VVF9USU1FLAorICBQUk9QX01BWF9NSVNPUkRFUl9USU1FLAorICBQUk9QX1NUQVRTLAorICBQUk9QX1JUUF9QUk9GSUxFLAorICBQUk9QX1JUQ1BfUkVEVUNFRF9TSVpFCit9OworCisvKiB1cGRhdGUgYXZlcmFnZSBwYWNrZXQgc2l6ZSAqLworI2RlZmluZSBJTklUX0FWRyhhdmcsIHZhbCkgXAorICAgKGF2ZykgPSAodmFsKTsKKyNkZWZpbmUgVVBEQVRFX0FWRyhhdmcsIHZhbCkgICAgICAgICAgICBcCisgIGlmICgoYXZnKSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKGF2ZykgPSAodmFsKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoYXZnKSA9ICgodmFsKSArICgxNSAqIChhdmcpKSkgPj4gNDsKKworCisvKiBHT2JqZWN0IHZtZXRob2RzICovCitzdGF0aWMgdm9pZCBydHBfc2Vzc2lvbl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgdm9pZCBydHBfc2Vzc2lvbl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBydHBfc2Vzc2lvbl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBydHBfc2Vzc2lvbl9zZW5kX3J0Y3AgKFJUUFNlc3Npb24gKiBzZXNzLAorICAgIEdzdENsb2NrVGltZSBtYXhfZGVsYXkpOworCitzdGF0aWMgZ3VpbnQgcnRwX3Nlc3Npb25fc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAgfTsKKworR19ERUZJTkVfVFlQRSAoUlRQU2Vzc2lvbiwgcnRwX3Nlc3Npb24sIEdfVFlQRV9PQkpFQ1QpOworCitzdGF0aWMgZ3VpbnQzMiBydHBfc2Vzc2lvbl9jcmVhdGVfbmV3X3NzcmMgKFJUUFNlc3Npb24gKiBzZXNzKTsKK3N0YXRpYyBSVFBTb3VyY2UgKm9idGFpbl9zb3VyY2UgKFJUUFNlc3Npb24gKiBzZXNzLCBndWludDMyIHNzcmMsCisgICAgZ2Jvb2xlYW4gKiBjcmVhdGVkLCBSVFBQYWNrZXRJbmZvICogcGluZm8sIGdib29sZWFuIHJ0cCk7CitzdGF0aWMgUlRQU291cmNlICpvYnRhaW5faW50ZXJuYWxfc291cmNlIChSVFBTZXNzaW9uICogc2VzcywKKyAgICBndWludDMyIHNzcmMsIGdib29sZWFuICogY3JlYXRlZCwgR3N0Q2xvY2tUaW1lIGN1cnJlbnRfdGltZSk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBydHBfc2Vzc2lvbl9zY2hlZHVsZV9ieWVfbG9ja2VkIChSVFBTZXNzaW9uICogc2VzcywKKyAgICBHc3RDbG9ja1RpbWUgY3VycmVudF90aW1lKTsKK3N0YXRpYyBHc3RDbG9ja1RpbWUgY2FsY3VsYXRlX3J0Y3BfaW50ZXJ2YWwgKFJUUFNlc3Npb24gKiBzZXNzLAorICAgIGdib29sZWFuIGRldGVybWluaXN0aWMsIGdib29sZWFuIGZpcnN0KTsKKworc3RhdGljIGdib29sZWFuCithY2N1bXVsYXRlX3RydWVzIChHU2lnbmFsSW52b2NhdGlvbkhpbnQgKiBpaGludCwgR1ZhbHVlICogcmV0dXJuX2FjY3UsCisgICAgY29uc3QgR1ZhbHVlICogaGFuZGxlcl9yZXR1cm4sIGdwb2ludGVyIGRhdGEpCit7CisgIGlmIChnX3ZhbHVlX2dldF9ib29sZWFuIChoYW5kbGVyX3JldHVybikpCisgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAocmV0dXJuX2FjY3UsIFRSVUUpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorcnRwX3Nlc3Npb25fY2xhc3NfaW5pdCAoUlRQU2Vzc2lvbkNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHJ0cF9zZXNzaW9uX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBydHBfc2Vzc2lvbl9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHJ0cF9zZXNzaW9uX2dldF9wcm9wZXJ0eTsKKworICAvKioKKyAgICogUlRQU2Vzc2lvbjo6Z2V0LXNvdXJjZS1ieS1zc3JjOgorICAgKiBAc2Vzc2lvbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzc3JjOiB0aGUgU1NSQyBvZiB0aGUgUlRQU291cmNlCisgICAqCisgICAqIFJlcXVlc3QgdGhlICNSVFBTb3VyY2Ugb2JqZWN0IHdpdGggU1NSQyBAc3NyYyBpbiBAc2Vzc2lvbi4KKyAgICovCisgIHJ0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX0dFVF9TT1VSQ0VfQllfU1NSQ10gPQorICAgICAgZ19zaWduYWxfbmV3ICgiZ2V0LXNvdXJjZS1ieS1zc3JjIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNUIHwgR19TSUdOQUxfQUNUSU9OLCBHX1NUUlVDVF9PRkZTRVQgKFJUUFNlc3Npb25DbGFzcywKKyAgICAgICAgICBnZXRfc291cmNlX2J5X3NzcmMpLCBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywKKyAgICAgIFJUUF9UWVBFX1NPVVJDRSwgMSwgR19UWVBFX1VJTlQpOworCisgIC8qKgorICAgKiBSVFBTZXNzaW9uOjpvbi1uZXctc3NyYzoKKyAgICogQHNlc3Npb246IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc3JjOiB0aGUgbmV3IFJUUFNvdXJjZQorICAgKgorICAgKiBOb3RpZnkgb2YgYSBuZXcgU1NSQyB0aGF0IGVudGVyZWQgQHNlc3Npb24uCisgICAqLworICBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9ORVdfU1NSQ10gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tbmV3LXNzcmMiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoUlRQU2Vzc2lvbkNsYXNzLCBvbl9uZXdfc3NyYyksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfVk9JRF9fT0JKRUNULCBHX1RZUEVfTk9ORSwgMSwKKyAgICAgIFJUUF9UWVBFX1NPVVJDRSk7CisgIC8qKgorICAgKiBSVFBTZXNzaW9uOjpvbi1zc3JjLWNvbGxpc2lvbjoKKyAgICogQHNlc3Npb246IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc3JjOiB0aGUgI1JUUFNvdXJjZSB0aGF0IGNhdXNlZCBhIGNvbGxpc2lvbgorICAgKgorICAgKiBOb3RpZnkgd2hlbiB3ZSBoYXZlIGFuIFNTUkMgY29sbGlzaW9uCisgICAqLworICBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9TU1JDX0NPTExJU0lPTl0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tc3NyYy1jb2xsaXNpb24iLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoUlRQU2Vzc2lvbkNsYXNzLCBvbl9zc3JjX2NvbGxpc2lvbiksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfVk9JRF9fT0JKRUNULCBHX1RZUEVfTk9ORSwgMSwKKyAgICAgIFJUUF9UWVBFX1NPVVJDRSk7CisgIC8qKgorICAgKiBSVFBTZXNzaW9uOjpvbi1zc3JjLXZhbGlkYXRlZDoKKyAgICogQHNlc3Npb246IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc3JjOiB0aGUgbmV3IHZhbGlkYXRlZCBSVFBTb3VyY2UKKyAgICoKKyAgICogTm90aWZ5IG9mIGEgbmV3IFNTUkMgdGhhdCBiZWNhbWUgdmFsaWRhdGVkLgorICAgKi8KKyAgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fU1NSQ19WQUxJREFURURdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXNzcmMtdmFsaWRhdGVkIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKFJUUFNlc3Npb25DbGFzcywgb25fc3NyY192YWxpZGF0ZWQpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX09CSkVDVCwgR19UWVBFX05PTkUsIDEsCisgICAgICBSVFBfVFlQRV9TT1VSQ0UpOworICAvKioKKyAgICogUlRQU2Vzc2lvbjo6b24tc3NyYy1hY3RpdmU6CisgICAqIEBzZXNzaW9uOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNyYzogdGhlIGFjdGl2ZSBSVFBTb3VyY2UKKyAgICoKKyAgICogTm90aWZ5IG9mIGEgU1NSQyB0aGF0IGlzIGFjdGl2ZSwgaS5lLiwgc2VuZGluZyBSVENQLgorICAgKi8KKyAgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fU1NSQ19BQ1RJVkVdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXNzcmMtYWN0aXZlIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKFJUUFNlc3Npb25DbGFzcywgb25fc3NyY19hY3RpdmUpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX09CSkVDVCwgR19UWVBFX05PTkUsIDEsCisgICAgICBSVFBfVFlQRV9TT1VSQ0UpOworICAvKioKKyAgICogUlRQU2Vzc2lvbjo6b24tc3NyYy1zZGVzOgorICAgKiBAc2Vzc2lvbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzcmM6IHRoZSBSVFBTb3VyY2UKKyAgICoKKyAgICogTm90aWZ5IHRoYXQgYSBuZXcgU0RFUyB3YXMgcmVjZWl2ZWQgZm9yIFNTUkMuCisgICAqLworICBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9TU1JDX1NERVNdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXNzcmMtc2RlcyIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChSVFBTZXNzaW9uQ2xhc3MsIG9uX3NzcmNfc2RlcyksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfVk9JRF9fT0JKRUNULCBHX1RZUEVfTk9ORSwgMSwKKyAgICAgIFJUUF9UWVBFX1NPVVJDRSk7CisgIC8qKgorICAgKiBSVFBTZXNzaW9uOjpvbi1ieWUtc3NyYzoKKyAgICogQHNlc3Npb246IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc3JjOiB0aGUgUlRQU291cmNlIHRoYXQgd2VudCBhd2F5CisgICAqCisgICAqIE5vdGlmeSBvZiBhbiBTU1JDIHRoYXQgYmVjYW1lIGluYWN0aXZlIGJlY2F1c2Ugb2YgYSBCWUUgcGFja2V0LgorICAgKi8KKyAgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fQllFX1NTUkNdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLWJ5ZS1zc3JjIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKFJUUFNlc3Npb25DbGFzcywgb25fYnllX3NzcmMpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX09CSkVDVCwgR19UWVBFX05PTkUsIDEsCisgICAgICBSVFBfVFlQRV9TT1VSQ0UpOworICAvKioKKyAgICogUlRQU2Vzc2lvbjo6b24tYnllLXRpbWVvdXQ6CisgICAqIEBzZXNzaW9uOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNyYzogdGhlIFJUUFNvdXJjZSB0aGF0IHRpbWVkIG91dAorICAgKgorICAgKiBOb3RpZnkgb2YgYW4gU1NSQyB0aGF0IGhhcyB0aW1lZCBvdXQgYmVjYXVzZSBvZiBCWUUKKyAgICovCisgIHJ0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX0JZRV9USU1FT1VUXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1ieWUtdGltZW91dCIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChSVFBTZXNzaW9uQ2xhc3MsIG9uX2J5ZV90aW1lb3V0KSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19PQkpFQ1QsIEdfVFlQRV9OT05FLCAxLAorICAgICAgUlRQX1RZUEVfU09VUkNFKTsKKyAgLyoqCisgICAqIFJUUFNlc3Npb246Om9uLXRpbWVvdXQ6CisgICAqIEBzZXNzaW9uOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNyYzogdGhlIFJUUFNvdXJjZSB0aGF0IHRpbWVkIG91dAorICAgKgorICAgKiBOb3RpZnkgb2YgYW4gU1NSQyB0aGF0IGhhcyB0aW1lZCBvdXQKKyAgICovCisgIHJ0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX1RJTUVPVVRdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXRpbWVvdXQiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoUlRQU2Vzc2lvbkNsYXNzLCBvbl90aW1lb3V0KSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19PQkpFQ1QsIEdfVFlQRV9OT05FLCAxLAorICAgICAgUlRQX1RZUEVfU09VUkNFKTsKKyAgLyoqCisgICAqIFJUUFNlc3Npb246Om9uLXNlbmRlci10aW1lb3V0OgorICAgKiBAc2Vzc2lvbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzcmM6IHRoZSBSVFBTb3VyY2UgdGhhdCB0aW1lZCBvdXQKKyAgICoKKyAgICogTm90aWZ5IG9mIGFuIFNTUkMgdGhhdCB3YXMgYSBzZW5kZXIgYnV0IHRpbWVkIG91dCBhbmQgYmVjYW1lIGEgcmVjZWl2ZXIuCisgICAqLworICBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9TRU5ERVJfVElNRU9VVF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tc2VuZGVyLXRpbWVvdXQiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoUlRQU2Vzc2lvbkNsYXNzLCBvbl9zZW5kZXJfdGltZW91dCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfVk9JRF9fT0JKRUNULCBHX1RZUEVfTk9ORSwgMSwKKyAgICAgIFJUUF9UWVBFX1NPVVJDRSk7CisKKyAgLyoqCisgICAqIFJUUFNlc3Npb246Om9uLXNlbmRpbmctcnRjcAorICAgKiBAc2Vzc2lvbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBidWZmZXI6IHRoZSAjR3N0QnVmZmVyIGNvbnRhaW5pbmcgdGhlIFJUQ1AgcGFja2V0IGFib3V0IHRvIGJlIHNlbnQKKyAgICogQGVhcmx5OiAlVFJVRSBpZiB0aGUgcGFja2V0IGlzIGVhcmx5LCAlRkFMU0UgaWYgaXQgaXMgcmVndWxhcgorICAgKgorICAgKiBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIGJlZm9yZSBzZW5kaW5nIGFuIFJUQ1AgcGFja2V0LCBpdCBjYW4gYmUgdXNlZAorICAgKiB0byBhZGQgZXh0cmEgUlRDUCBQYWNrZXRzLgorICAgKgorICAgKiBSZXR1cm5zOiAlVFJVRSBpZiB0aGUgUlRDUCBidWZmZXIgc2hvdWxkIE5PVCBiZSBzdXBwcmVzc2VkLCAlRkFMU0UKKyAgICogaWYgc3VwcHJlc3NpbmcgaXQgaXMgYWNjZXB0YWJsZQorICAgKi8KKyAgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fU0VORElOR19SVENQXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1zZW5kaW5nLXJ0Y3AiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoUlRQU2Vzc2lvbkNsYXNzLCBvbl9zZW5kaW5nX3J0Y3ApLAorICAgICAgYWNjdW11bGF0ZV90cnVlcywgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9CT09MRUFOLCAyLAorICAgICAgR1NUX1RZUEVfQlVGRkVSIHwgR19TSUdOQUxfVFlQRV9TVEFUSUNfU0NPUEUsIEdfVFlQRV9CT09MRUFOKTsKKworICAvKioKKyAgICogUlRQU2Vzc2lvbjo6b24tYXBwLXJ0Y3A6CisgICAqIEBzZXNzaW9uOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHN1YnR5cGU6IFRoZSBzdWJ0eXBlIG9mIHRoZSBwYWNrZXQKKyAgICogQHNzcmM6IFRoZSBTU1JDL0NTUkMgb2YgdGhlIHBhY2tldAorICAgKiBAbmFtZTogVGhlIG5hbWUgb2YgdGhlIHBhY2tldAorICAgKiBAZGF0YTogYSAjR3N0QnVmZmVyIHdpdGggdGhlIGFwcGxpY2F0aW9uLWRlcGVuZGFudCBkYXRhIG9yICVOVUxMIGlmCisgICAqIHRoZXJlIHdhcyBubyBkYXRhCisgICAqCisgICAqIE5vdGlmeSB0aGF0IGEgUlRDUCBBUFAgcGFja2V0IGhhcyBiZWVuIHJlY2VpdmVkCisgICAqLworICBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9BUFBfUlRDUF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tYXBwLXJ0Y3AiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoUlRQU2Vzc2lvbkNsYXNzLCBvbl9hcHBfcnRjcCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR19UWVBFX05PTkUsIDQsCisgICAgICBHX1RZUEVfVUlOVCwgR19UWVBFX1VJTlQsIEdfVFlQRV9TVFJJTkcsIEdTVF9UWVBFX0JVRkZFUik7CisKKyAgLyoqCisgICAqIFJUUFNlc3Npb246Om9uLWZlZWRiYWNrLXJ0Y3A6CisgICAqIEBzZXNzaW9uOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHR5cGU6IFR5cGUgb2YgUlRDUCBwYWNrZXQsIHdpbGwgYmUgJUdTVF9SVENQX1RZUEVfUlRQRkIgb3IKKyAgICogICVHU1RfUlRDUF9UWVBFX1JUUEZCCisgICAqIEBmYnR5cGU6IFRoZSB0eXBlIG9mIFJUQ1AgRkIgcGFja2V0LCBwcm9iYWJseSBwYXJ0IG9mICNHc3RSVENQRkJUeXBlCisgICAqIEBzZW5kZXJfc3NyYzogVGhlIFNTUkMgb2YgdGhlIHNlbmRlcgorICAgKiBAbWVkaWFfc3NyYzogVGhlIFNTUkMgb2YgdGhlIG1lZGlhIHRoaXMgcmVmZXJzIHRvCisgICAqIEBmY2k6IGEgI0dzdEJ1ZmZlciB3aXRoIHRoZSBGQ0kgZGF0YSBmcm9tIHRoZSBGQiBwYWNrZXQgb3IgJU5VTEwgaWYKKyAgICogdGhlcmUgd2FzIG5vIEZDSQorICAgKgorICAgKiBOb3RpZnkgdGhhdCBhIFJUQ1AgZmVlZGJhY2sgcGFja2V0IGhhcyBiZWVuIHJlY2VpdmVkCisgICAqLworICBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9GRUVEQkFDS19SVENQXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1mZWVkYmFjay1ydGNwIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKFJUUFNlc3Npb25DbGFzcywgb25fZmVlZGJhY2tfcnRjcCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR19UWVBFX05PTkUsIDUsIEdfVFlQRV9VSU5ULAorICAgICAgR19UWVBFX1VJTlQsIEdfVFlQRV9VSU5ULCBHX1RZUEVfVUlOVCwgR1NUX1RZUEVfQlVGRkVSKTsKKworICAvKioKKyAgICogUlRQU2Vzc2lvbjo6c2VuZC1ydGNwOgorICAgKiBAc2Vzc2lvbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBtYXhfZGVsYXk6IFRoZSBtYXhpbXVtIGRlbGF5IGFmdGVyIHdoaWNoIHRoZSBmZWVkYmFjayB3aWxsIG5vdCBiZSB1c2VmdWwKKyAgICogIGFueW1vcmUKKyAgICoKKyAgICogUmVxdWVzdHMgdGhhdCB0aGUgI1JUUFNlc3Npb24gaW5pdGlhdGUgYSBuZXcgUlRDUCBwYWNrZXQgYXMgc29vbiBhcworICAgKiBwb3NzaWJsZSB3aXRoaW4gdGhlIHJlcXVlc3RlZCBkZWxheS4KKyAgICoKKyAgICogVGhpcyBzZXRzIGZlZWRiYWNrIHRvICVUUlVFIGlmIG5vdCBhbHJlYWR5IGRvbmUgYmVmb3JlLgorICAgKi8KKyAgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfU0VORF9SVENQXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJzZW5kLXJ0Y3AiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QgfCBHX1NJR05BTF9BQ1RJT04sCisgICAgICBHX1NUUlVDVF9PRkZTRVQgKFJUUFNlc3Npb25DbGFzcywgc2VuZF9ydGNwKSwgTlVMTCwgTlVMTCwKKyAgICAgIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMSwgR19UWVBFX1VJTlQ2NCk7CisKKyAgLyoqCisgICAqIFJUUFNlc3Npb246OnNlbmQtcnRjcC1mdWxsOgorICAgKiBAc2Vzc2lvbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBtYXhfZGVsYXk6IFRoZSBtYXhpbXVtIGRlbGF5IGFmdGVyIHdoaWNoIHRoZSBmZWVkYmFjayB3aWxsIG5vdCBiZSB1c2VmdWwKKyAgICogIGFueW1vcmUKKyAgICoKKyAgICogUmVxdWVzdHMgdGhhdCB0aGUgI1JUUFNlc3Npb24gaW5pdGlhdGUgYSBuZXcgUlRDUCBwYWNrZXQgYXMgc29vbiBhcworICAgKiBwb3NzaWJsZSB3aXRoaW4gdGhlIHJlcXVlc3RlZCBkZWxheS4KKyAgICoKKyAgICogVGhpcyBzZXRzIGZlZWRiYWNrIHRvICVUUlVFIGlmIG5vdCBhbHJlYWR5IGRvbmUgYmVmb3JlLgorICAgKgorICAgKiBSZXR1cm5zOiBUUlVFIGlmIHRoZSBuZXcgUlRDUCBwYWNrZXQgY291bGQgYmUgc2NoZWR1bGVkIHdpdGhpbiB0aGUKKyAgICogcmVxdWVzdGVkIGRlbGF5LCBGQUxTRSBvdGhlcndpc2UuCisgICAqCisgICAqIFNpbmNlOiAxLjYKKyAgICovCisgIHJ0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX1NFTkRfUlRDUF9GVUxMXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJzZW5kLXJ0Y3AtZnVsbCIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCB8IEdfU0lHTkFMX0FDVElPTiwKKyAgICAgIEdfU1RSVUNUX09GRlNFVCAoUlRQU2Vzc2lvbkNsYXNzLCBzZW5kX3J0Y3ApLCBOVUxMLCBOVUxMLAorICAgICAgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9CT09MRUFOLCAxLCBHX1RZUEVfVUlOVDY0KTsKKworICAvKioKKyAgICogUlRQU2Vzc2lvbjo6b24tcmVjZWl2aW5nLXJ0Y3AKKyAgICogQHNlc3Npb246IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAYnVmZmVyOiB0aGUgI0dzdEJ1ZmZlciBjb250YWluaW5nIHRoZSBSVENQIHBhY2tldCB0aGF0IHdhcyByZWNlaXZlZAorICAgKgorICAgKiBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gcmVjZWl2aW5nIGFuIFJUQ1AgcGFja2V0IGJlZm9yZSBpdCBpcyBoYW5kbGVkCisgICAqIGJ5IHRoZSBzZXNzaW9uLiBJdCBjYW4gYmUgdXNlZCB0byBleHRyYWN0IGN1c3RvbSBpbmZvcm1hdGlvbiBmcm9tIFJUQ1AgcGFja2V0cy4KKyAgICoKKyAgICogU2luY2U6IDEuNgorICAgKi8KKyAgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fUkVDRUlWSU5HX1JUQ1BdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXJlY2VpdmluZy1ydGNwIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKFJUUFNlc3Npb25DbGFzcywgb25fcmVjZWl2aW5nX3J0Y3ApLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAxLAorICAgICAgR1NUX1RZUEVfQlVGRkVSIHwgR19TSUdOQUxfVFlQRV9TVEFUSUNfU0NPUEUpOworCisgIC8qKgorICAgKiBSVFBTZXNzaW9uOjpvbi1uZXctc2VuZGVyLXNzcmM6CisgICAqIEBzZXNzaW9uOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNyYzogdGhlIG5ldyBzZW5kZXIgUlRQU291cmNlCisgICAqCisgICAqIE5vdGlmeSBvZiBhIG5ldyBzZW5kZXIgU1NSQyB0aGF0IGVudGVyZWQgQHNlc3Npb24uCisgICAqCisgICAqIFNpbmNlOiAxLjgKKyAgICovCisgIHJ0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX05FV19TRU5ERVJfU1NSQ10gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tbmV3LXNlbmRlci1zc3JjIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKFJUUFNlc3Npb25DbGFzcywgb25fbmV3X3NlbmRlcl9zc3JjKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19PQkpFQ1QsIEdfVFlQRV9OT05FLCAxLAorICAgICAgUlRQX1RZUEVfU09VUkNFKTsKKworICAvKioKKyAgICogUlRQU2Vzc2lvbjo6b24tc2VuZGVyLXNzcmMtYWN0aXZlOgorICAgKiBAc2Vzc2lvbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzcmM6IHRoZSBhY3RpdmUgc2VuZGVyIFJUUFNvdXJjZQorICAgKgorICAgKiBOb3RpZnkgb2YgYSBzZW5kZXIgU1NSQyB0aGF0IGlzIGFjdGl2ZSwgaS5lLiwgc2VuZGluZyBSVENQLgorICAgKgorICAgKiBTaW5jZTogMS44CisgICAqLworICBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9TRU5ERVJfU1NSQ19BQ1RJVkVdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXNlbmRlci1zc3JjLWFjdGl2ZSIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChSVFBTZXNzaW9uQ2xhc3MsCisgICAgICAgICAgb25fc2VuZGVyX3NzcmNfYWN0aXZlKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX09CSkVDVCwKKyAgICAgIEdfVFlQRV9OT05FLCAxLCBSVFBfVFlQRV9TT1VSQ0UpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSU5URVJOQUxfU1NSQywKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiaW50ZXJuYWwtc3NyYyIsICJJbnRlcm5hbCBTU1JDIiwKKyAgICAgICAgICAiVGhlIGludGVybmFsIFNTUkMgdXNlZCBmb3IgdGhlIHNlc3Npb24gKGRlcHJlY2F0ZWQpIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIDAsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSU5URVJOQUxfU09VUkNFLAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoImludGVybmFsLXNvdXJjZSIsICJJbnRlcm5hbCBTb3VyY2UiLAorICAgICAgICAgICJUaGUgaW50ZXJuYWwgc291cmNlIGVsZW1lbnQgb2YgdGhlIHNlc3Npb24gKGRlcHJlY2F0ZWQpIiwKKyAgICAgICAgICBSVFBfVFlQRV9TT1VSQ0UsIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9CQU5EV0lEVEgsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYmFuZHdpZHRoIiwgIkJhbmR3aWR0aCIsCisgICAgICAgICAgIlRoZSBiYW5kd2lkdGggb2YgdGhlIHNlc3Npb24gaW4gYml0cyBwZXIgc2Vjb25kICgwIGZvciBhdXRvLWRpc2NvdmVyKSIsCisgICAgICAgICAgMC4wLCBHX01BWERPVUJMRSwgREVGQVVMVF9CQU5EV0lEVEgsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SVENQX0ZSQUNUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoInJ0Y3AtZnJhY3Rpb24iLCAiUlRDUCBGcmFjdGlvbiIsCisgICAgICAgICAgIlRoZSBmcmFjdGlvbiBvZiB0aGUgYmFuZHdpZHRoIHVzZWQgZm9yIFJUQ1AgaW4gYml0cyBwZXIgc2Vjb25kIChvciBhcyBhIHJlYWwgZnJhY3Rpb24gb2YgdGhlIFJUUCBiYW5kd2lkdGggaWYgPCAxKSIsCisgICAgICAgICAgMC4wLCBHX01BWERPVUJMRSwgREVGQVVMVF9SVENQX0ZSQUNUSU9OLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUlRDUF9SUl9CQU5EV0lEVEgsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicnRjcC1yci1iYW5kd2lkdGgiLCAiUlRDUCBSUiBiYW5kd2lkdGgiLAorICAgICAgICAgICJUaGUgUlRDUCBiYW5kd2lkdGggdXNlZCBmb3IgcmVjZWl2ZXJzIGluIGJpdHMgcGVyIHNlY29uZCAoLTEgPSBkZWZhdWx0KSIsCisgICAgICAgICAgLTEsIEdfTUFYSU5ULCBERUZBVUxUX1JUQ1BfUlJfQkFORFdJRFRILAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUlRDUF9SU19CQU5EV0lEVEgsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicnRjcC1ycy1iYW5kd2lkdGgiLCAiUlRDUCBSUyBiYW5kd2lkdGgiLAorICAgICAgICAgICJUaGUgUlRDUCBiYW5kd2lkdGggdXNlZCBmb3Igc2VuZGVycyBpbiBiaXRzIHBlciBzZWNvbmQgKC0xID0gZGVmYXVsdCkiLAorICAgICAgICAgIC0xLCBHX01BWElOVCwgREVGQVVMVF9SVENQX1JTX0JBTkRXSURUSCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JUQ1BfTVRVLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJydGNwLW10dSIsICJSVENQIE1UVSIsCisgICAgICAgICAgIlRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIFJUQ1AgcGFja2V0cyIsCisgICAgICAgICAgMTYsIEdfTUFYSU5UMTYsIERFRkFVTFRfUlRDUF9NVFUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TREVTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgic2RlcyIsICJTREVTIiwKKyAgICAgICAgICAiVGhlIFNERVMgaXRlbXMgb2YgdGhpcyBzZXNzaW9uIiwKKyAgICAgICAgICBHU1RfVFlQRV9TVFJVQ1RVUkUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTlVNX1NPVVJDRVMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm51bS1zb3VyY2VzIiwgIk51bSBTb3VyY2VzIiwKKyAgICAgICAgICAiVGhlIG51bWJlciBvZiBzb3VyY2VzIGluIHRoZSBzZXNzaW9uIiwgMCwgR19NQVhVSU5ULAorICAgICAgICAgIERFRkFVTFRfTlVNX1NPVVJDRVMsIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9OVU1fQUNUSVZFX1NPVVJDRVMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm51bS1hY3RpdmUtc291cmNlcyIsICJOdW0gQWN0aXZlIFNvdXJjZXMiLAorICAgICAgICAgICJUaGUgbnVtYmVyIG9mIGFjdGl2ZSBzb3VyY2VzIGluIHRoZSBzZXNzaW9uIiwgMCwgR19NQVhVSU5ULAorICAgICAgICAgIERFRkFVTFRfTlVNX0FDVElWRV9TT1VSQ0VTLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBSVFBTb3VyY2U6OnNvdXJjZXMKKyAgICoKKyAgICogR2V0IGEgR1ZhbHVlIEFycmF5IG9mIGFsbCBzb3VyY2VzIGluIHRoZSBzZXNzaW9uLgorICAgKgorICAgKiA8ZXhhbXBsZT4KKyAgICogPHRpdGxlPkdldHRpbmcgdGhlICNSVFBTb3VyY2VzIG9mIGEgc2Vzc2lvbgorICAgKiA8cHJvZ3JhbWxpc3Rpbmc+CisgICAqIHsKKyAgICogICBHVmFsdWVBcnJheSAqYXJyOworICAgKiAgIEdWYWx1ZSAqdmFsOworICAgKiAgIGd1aW50IGk7CisgICAqCisgICAqICAgZ19vYmplY3RfZ2V0IChzZXNzLCAic291cmNlcyIsICZhcnIsIE5VTEwpOworICAgKgorICAgKiAgIGZvciAoaSA9IDA7IGkgPCBhcnItPm5fdmFsdWVzOyBpKyspIHsKKyAgICogICAgIFJUUFNvdXJjZSAqc291cmNlOworICAgKgorICAgKiAgICAgdmFsID0gZ192YWx1ZV9hcnJheV9nZXRfbnRoIChhcnIsIGkpOworICAgKiAgICAgc291cmNlID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWwpOworICAgKiAgIH0KKyAgICogICBnX3ZhbHVlX2FycmF5X2ZyZWUgKGFycik7CisgICAqIH0KKyAgICogPC9wcm9ncmFtbGlzdGluZz4KKyAgICogPC9leGFtcGxlPgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TT1VSQ0VTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgic291cmNlcyIsICJTb3VyY2VzIiwKKyAgICAgICAgICAiQW4gYXJyYXkgb2YgYWxsIGtub3duIHNvdXJjZXMgaW4gdGhlIHNlc3Npb24iLAorICAgICAgICAgIEdfVFlQRV9WQUxVRV9BUlJBWSwgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0ZBVk9SX05FVywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZmF2b3ItbmV3IiwgIkZhdm9yIG5ldyBzb3VyY2VzIiwKKyAgICAgICAgICAiUmVzb2x2ZSBTU1JDIGNvbmZsaWN0IGluIGZhdm9yIG9mIG5ldyBzb3VyY2VzIiwgRkFMU0UsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SVENQX01JTl9JTlRFUlZBTCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJydGNwLW1pbi1pbnRlcnZhbCIsICJNaW5pbXVtIFJUQ1AgaW50ZXJ2YWwiLAorICAgICAgICAgICJNaW5pbXVtIGludGVydmFsIGJldHdlZW4gUmVndWxhciBSVENQIHBhY2tldCAoaW4gbnMpIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQ2NCwgREVGQVVMVF9SVENQX01JTl9JTlRFUlZBTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9SVENQX0ZFRURCQUNLX1JFVEVOVElPTl9XSU5ET1csCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgicnRjcC1mZWVkYmFjay1yZXRlbnRpb24td2luZG93IiwKKyAgICAgICAgICAiUlRDUCBGZWVkYmFjayByZXRlbnRpb24gd2luZG93IiwKKyAgICAgICAgICAiRHVyYXRpb24gZHVyaW5nIHdoaWNoIFJUQ1AgRmVlZGJhY2sgcGFja2V0cyBhcmUgcmV0YWluZWQgKGluIG5zKSIsCisgICAgICAgICAgMCwgR19NQVhVSU5UNjQsIERFRkFVTFRfUlRDUF9GRUVEQkFDS19SRVRFTlRJT05fV0lORE9XLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1JUQ1BfSU1NRURJQVRFX0ZFRURCQUNLX1RIUkVTSE9MRCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgicnRjcC1pbW1lZGlhdGUtZmVlZGJhY2stdGhyZXNob2xkIiwKKyAgICAgICAgICAiUlRDUCBJbW1lZGlhdGUgRmVlZGJhY2sgdGhyZXNob2xkIiwKKyAgICAgICAgICAiVGhlIG1heGltdW0gbnVtYmVyIG9mIG1lbWJlcnMgb2YgYSBSVFAgc2Vzc2lvbiBmb3Igd2hpY2ggaW1tZWRpYXRlIgorICAgICAgICAgICIgZmVlZGJhY2sgaXMgdXNlZCAoREVQUkVDQVRFRDogaGFzIG5vIGVmZmVjdCBhbmQgaXMgbm90IG5lZWRlZCkiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVCwgREVGQVVMVF9SVENQX0lNTUVESUFURV9GRUVEQkFDS19USFJFU0hPTEQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR19QQVJBTV9ERVBSRUNBVEVEKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QUk9CQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInByb2JhdGlvbiIsICJOdW1iZXIgb2YgcHJvYmF0aW9ucyIsCisgICAgICAgICAgIkNvbnNlY3V0aXZlIHBhY2tldCBzZXF1ZW5jZSBudW1iZXJzIHRvIGFjY2VwdCB0aGUgc291cmNlIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIERFRkFVTFRfUFJPQkFUSU9OLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX0RST1BPVVRfVElNRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LWRyb3BvdXQtdGltZSIsICJNYXggZHJvcG91dCB0aW1lIiwKKyAgICAgICAgICAiVGhlIG1heGltdW0gdGltZSAobWlsbGlzZWNvbmRzKSBvZiBtaXNzaW5nIHBhY2tldHMgdG9sZXJhdGVkLiIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCBERUZBVUxUX01BWF9EUk9QT1VUX1RJTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfTUlTT1JERVJfVElNRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LW1pc29yZGVyLXRpbWUiLCAiTWF4IG1pc29yZGVyIHRpbWUiLAorICAgICAgICAgICJUaGUgbWF4aW11bSB0aW1lIChtaWxsaXNlY29uZHMpIG9mIG1pc29yZGVyZWQgcGFja2V0cyB0b2xlcmF0ZWQuIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIERFRkFVTFRfTUFYX01JU09SREVSX1RJTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIFJUUFNlc3Npb246OnN0YXRzOgorICAgKgorICAgKiBWYXJpb3VzIHNlc3Npb24gc3RhdGlzdGljcy4gVGhpcyBwcm9wZXJ0eSByZXR1cm5zIGEgR3N0U3RydWN0dXJlCisgICAqIHdpdGggbmFtZSBhcHBsaWNhdGlvbi94LXJ0cC1zZXNzaW9uLXN0YXRzIHdpdGggdGhlIGZvbGxvd2luZyBmaWVsZHM6CisgICAqCisgICAqICAicnR4LWRyb3AtY291bnQiICBHX1RZUEVfVUlOVCAgIFRoZSBudW1iZXIgb2YgcmV0cmFuc21pc3Npb24gZXZlbnRzCisgICAqICAgICAgZHJvcHBlZCAoZHVlIHRvIGJhbmR3aWR0aCBjb25zdHJhaW50cykKKyAgICogICJzZW50LW5hY2stY291bnQiIEdfVFlQRV9VSU5UICAgTnVtYmVyIG9mIE5BQ0tzIHNlbnQKKyAgICogICJyZWN2LW5hY2stY291bnQiIEdfVFlQRV9VSU5UICAgTnVtYmVyIG9mIE5BQ0tzIHJlY2VpdmVkCisgICAqICAic291cmNlLXN0YXRzIiAgICBHX1RZUEVfQk9YRUQgIEdWYWx1ZUFycmF5IG9mICNSVFBTb3VyY2U6OnN0YXRzIGZvciBhbGwKKyAgICogICAgICBSVFAgc291cmNlcyAoU2luY2UgMS44KQorICAgKgorICAgKiBTaW5jZTogMS40CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NUQVRTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgic3RhdHMiLCAiU3RhdGlzdGljcyIsCisgICAgICAgICAgIlZhcmlvdXMgc3RhdGlzdGljcyIsIEdTVF9UWVBFX1NUUlVDVFVSRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUlRQX1BST0ZJTEUsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoInJ0cC1wcm9maWxlIiwgIlJUUCBQcm9maWxlIiwKKyAgICAgICAgICAiUlRQIHByb2ZpbGUgdG8gdXNlIGZvciB0aGlzIHNlc3Npb24iLCBHU1RfVFlQRV9SVFBfUFJPRklMRSwKKyAgICAgICAgICBERUZBVUxUX1JUUF9QUk9GSUxFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JUQ1BfUkVEVUNFRF9TSVpFLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJydGNwLXJlZHVjZWQtc2l6ZSIsICJSVENQIFJlZHVjZWQgU2l6ZSIsCisgICAgICAgICAgIlVzZSBSZWR1Y2VkIFNpemUgUlRDUCBmb3IgZmVlZGJhY2sgcGFja2V0cyIsCisgICAgICAgICAgREVGQVVMVF9SVENQX1JFRFVDRURfU0laRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBrbGFzcy0+Z2V0X3NvdXJjZV9ieV9zc3JjID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChydHBfc2Vzc2lvbl9nZXRfc291cmNlX2J5X3NzcmMpOworICBrbGFzcy0+c2VuZF9ydGNwID0gR1NUX0RFQlVHX0ZVTkNQVFIgKHJ0cF9zZXNzaW9uX3NlbmRfcnRjcCk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cF9zZXNzaW9uX2RlYnVnLCAicnRwc2Vzc2lvbiIsIDAsICJSVFAgU2Vzc2lvbiIpOworfQorCitzdGF0aWMgdm9pZAorcnRwX3Nlc3Npb25faW5pdCAoUlRQU2Vzc2lvbiAqIHNlc3MpCit7CisgIGdpbnQgaTsKKyAgZ2NoYXIgKnN0cjsKKworICBnX211dGV4X2luaXQgKCZzZXNzLT5sb2NrKTsKKyAgc2Vzcy0+a2V5ID0gZ19yYW5kb21faW50ICgpOworICBzZXNzLT5tYXNrX2lkeCA9IDA7CisgIHNlc3MtPm1hc2sgPSAwOworCisgIC8qIFRPRE86IFdlIGN1cnJlbnRseSBvbmx5IHVzZSB0aGUgZmlyc3QgaGFzaCB0YWJsZSBidXQgdGhpcyBpcyB0aGUKKyAgICogYmVnaW5uaW5nIG9mIGFuIGltcGxlbWVudGF0aW9uIGZvciBSRkMyNzYyCisgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IDE7IGkrKykgeworICAgIHNlc3MtPnNzcmNzW2ldID0KKyAgICAgICAgZ19oYXNoX3RhYmxlX25ld19mdWxsIChOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdfb2JqZWN0X3VucmVmKTsKKyAgfQorCisgIHJ0cF9zdGF0c19pbml0X2RlZmF1bHRzICgmc2Vzcy0+c3RhdHMpOworICBJTklUX0FWRyAoc2Vzcy0+c3RhdHMuYXZnX3J0Y3BfcGFja2V0X3NpemUsIDEwMCk7CisgIHJ0cF9zdGF0c19zZXRfbWluX2ludGVydmFsICgmc2Vzcy0+c3RhdHMsCisgICAgICAoZ2RvdWJsZSkgREVGQVVMVF9SVENQX01JTl9JTlRFUlZBTCAvIEdTVF9TRUNPTkQpOworCisgIHNlc3MtPnJlY2FsY19iYW5kd2lkdGggPSBUUlVFOworICBzZXNzLT5iYW5kd2lkdGggPSBERUZBVUxUX0JBTkRXSURUSDsKKyAgc2Vzcy0+cnRjcF9iYW5kd2lkdGggPSBERUZBVUxUX1JUQ1BfRlJBQ1RJT047CisgIHNlc3MtPnJ0Y3BfcnJfYmFuZHdpZHRoID0gREVGQVVMVF9SVENQX1JSX0JBTkRXSURUSDsKKyAgc2Vzcy0+cnRjcF9yc19iYW5kd2lkdGggPSBERUZBVUxUX1JUQ1BfUlNfQkFORFdJRFRIOworCisgIC8qIGRlZmF1bHQgVURQIGhlYWRlciBsZW5ndGggKi8KKyAgc2Vzcy0+aGVhZGVyX2xlbiA9IDI4OworICBzZXNzLT5tdHUgPSBERUZBVUxUX1JUQ1BfTVRVOworCisgIHNlc3MtPnByb2JhdGlvbiA9IERFRkFVTFRfUFJPQkFUSU9OOworICBzZXNzLT5tYXhfZHJvcG91dF90aW1lID0gREVGQVVMVF9NQVhfRFJPUE9VVF9USU1FOworICBzZXNzLT5tYXhfbWlzb3JkZXJfdGltZSA9IERFRkFVTFRfTUFYX01JU09SREVSX1RJTUU7CisKKyAgLyogc29tZSBkZWZhdWx0IFNERVMgZW50cmllcyAqLworICBzZXNzLT5zZGVzID0gZ3N0X3N0cnVjdHVyZV9uZXdfZW1wdHkgKCJhcHBsaWNhdGlvbi94LXJ0cC1zb3VyY2Utc2RlcyIpOworCisgIC8qIHdlIGRvIG5vdCB3YW50IHRvIGxlYWsgZGV0YWlscyBsaWtlIHRoZSB1c2VybmFtZSBvciBob3N0bmFtZSBoZXJlICovCisgIHN0ciA9IGdfc3RyZHVwX3ByaW50ZiAoInVzZXIldUBob3N0LSV4IiwgZ19yYW5kb21faW50ICgpLCBnX3JhbmRvbV9pbnQgKCkpOworICBnc3Rfc3RydWN0dXJlX3NldCAoc2Vzcy0+c2RlcywgImNuYW1lIiwgR19UWVBFX1NUUklORywgc3RyLCBOVUxMKTsKKyAgZ19mcmVlIChzdHIpOworCisjaWYgMAorICAvKiB3ZSBkbyBub3Qgd2FudCB0byBsZWFrIHRoZSB1c2VyJ3MgcmVhbCBuYW1lIGhlcmUgKi8KKyAgc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiQW5vbiV1IiwgZ19yYW5kb21faW50ICgpKTsKKyAgZ3N0X3N0cnVjdHVyZV9zZXQgKHNkZXMsICJuYW1lIiwgR19UWVBFX1NUUklORywgc3RyLCBOVUxMKTsKKyAgZ19mcmVlIChzdHIpOworI2VuZGlmCisKKyAgZ3N0X3N0cnVjdHVyZV9zZXQgKHNlc3MtPnNkZXMsICJ0b29sIiwgR19UWVBFX1NUUklORywgIkdTdHJlYW1lciIsIE5VTEwpOworCisgIC8qIHRoaXMgaXMgdGhlIFNTUkMgd2Ugc3VnZ2VzdCAqLworICBzZXNzLT5zdWdnZXN0ZWRfc3NyYyA9IHJ0cF9zZXNzaW9uX2NyZWF0ZV9uZXdfc3NyYyAoc2Vzcyk7CisgIHNlc3MtPmludGVybmFsX3NzcmNfc2V0ID0gRkFMU0U7CisKKyAgc2Vzcy0+Zmlyc3RfcnRjcCA9IFRSVUU7CisgIHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgc2Vzcy0+bGFzdF9ydGNwX2NoZWNrX3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBzZXNzLT5sYXN0X3J0Y3Bfc2VuZF90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgc2Vzcy0+bGFzdF9ydGNwX2ludGVydmFsID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBzZXNzLT5uZXh0X2Vhcmx5X3J0Y3BfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIHNlc3MtPnJ0Y3BfZmVlZGJhY2tfcmV0ZW50aW9uX3dpbmRvdyA9IERFRkFVTFRfUlRDUF9GRUVEQkFDS19SRVRFTlRJT05fV0lORE9XOworICBzZXNzLT5ydGNwX2ltbWVkaWF0ZV9mZWVkYmFja190aHJlc2hvbGQgPQorICAgICAgREVGQVVMVF9SVENQX0lNTUVESUFURV9GRUVEQkFDS19USFJFU0hPTEQ7CisgIHNlc3MtPnJ0cF9wcm9maWxlID0gREVGQVVMVF9SVFBfUFJPRklMRTsKKyAgc2Vzcy0+cmVkdWNlZF9zaXplX3J0Y3AgPSBERUZBVUxUX1JUQ1BfUkVEVUNFRF9TSVpFOworCisgIHNlc3MtPmlzX2RvaW5nX3B0cCA9IFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitydHBfc2Vzc2lvbl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgUlRQU2Vzc2lvbiAqc2VzczsKKyAgZ2ludCBpOworCisgIHNlc3MgPSBSVFBfU0VTU0lPTl9DQVNUIChvYmplY3QpOworCisgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoc2Vzcy0+c2Rlcyk7CisKKyAgZ19saXN0X2ZyZWVfZnVsbCAoc2Vzcy0+Y29uZmxpY3RpbmdfYWRkcmVzc2VzLAorICAgICAgKEdEZXN0cm95Tm90aWZ5KSBydHBfY29uZmxpY3RpbmdfYWRkcmVzc19mcmVlKTsKKworICAvKiBUT0RPOiBDaGFuZ2UgdGhpcyBhZ2FpbiB3aGVuIGltcGxlbWVudGluZyBSRkMgMjc2MgorICAgKiBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKyAgICovCisgIGZvciAoaSA9IDA7IGkgPCAxOyBpKyspCisgICAgZ19oYXNoX3RhYmxlX2Rlc3Ryb3kgKHNlc3MtPnNzcmNzW2ldKTsKKworICBnX211dGV4X2NsZWFyICgmc2Vzcy0+bG9jayk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHJ0cF9zZXNzaW9uX3BhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorY29weV9zb3VyY2UgKGdwb2ludGVyIGtleSwgUlRQU291cmNlICogc291cmNlLCBHVmFsdWVBcnJheSAqIGFycikKK3sKKyAgR1ZhbHVlIHZhbHVlID0geyAwIH07CisKKyAgZ192YWx1ZV9pbml0ICgmdmFsdWUsIFJUUF9UWVBFX1NPVVJDRSk7CisgIGdfdmFsdWVfdGFrZV9vYmplY3QgKCZ2YWx1ZSwgc291cmNlKTsKKyAgLyogY29waWVzIHRoZSB2YWx1ZSAqLworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAoYXJyLCAmdmFsdWUpOworfQorCitzdGF0aWMgR1ZhbHVlQXJyYXkgKgorcnRwX3Nlc3Npb25fY3JlYXRlX3NvdXJjZXMgKFJUUFNlc3Npb24gKiBzZXNzKQoreworICBHVmFsdWVBcnJheSAqcmVzOworICBndWludCBzaXplOworCisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICAvKiBnZXQgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0YWJsZSAqLworICBzaXplID0gZ19oYXNoX3RhYmxlX3NpemUgKHNlc3MtPnNzcmNzW3Nlc3MtPm1hc2tfaWR4XSk7CisgIC8qIGNyZWF0ZSB0aGUgcmVzdWx0IHZhbHVlIGFycmF5ICovCisgIHJlcyA9IGdfdmFsdWVfYXJyYXlfbmV3IChzaXplKTsKKworICAvKiBhbmQgY29weSBhbGwgdmFsdWVzIGludG8gdGhlIGFycmF5ICovCisgIGdfaGFzaF90YWJsZV9mb3JlYWNoIChzZXNzLT5zc3Jjc1tzZXNzLT5tYXNrX2lkeF0sIChHSEZ1bmMpIGNvcHlfc291cmNlLCByZXMpOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCitjcmVhdGVfc291cmNlX3N0YXRzIChncG9pbnRlciBrZXksIFJUUFNvdXJjZSAqIHNvdXJjZSwgR1ZhbHVlQXJyYXkgKiBhcnIpCit7CisgIEdWYWx1ZSB2YWx1ZSA9IEdfVkFMVUVfSU5JVDsKKyAgR3N0U3RydWN0dXJlICpzOworCisgIGdfb2JqZWN0X2dldCAoc291cmNlLCAic3RhdHMiLCAmcywgTlVMTCk7CisKKyAgZ192YWx1ZV9pbml0ICgmdmFsdWUsIEdTVF9UWVBFX1NUUlVDVFVSRSk7CisgIGdzdF92YWx1ZV9zZXRfc3RydWN0dXJlICgmdmFsdWUsIHMpOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAoYXJyLCAmdmFsdWUpOworICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHMpOworICBnX3ZhbHVlX3Vuc2V0ICgmdmFsdWUpOworfQorCitzdGF0aWMgR3N0U3RydWN0dXJlICoKK3J0cF9zZXNzaW9uX2NyZWF0ZV9zdGF0cyAoUlRQU2Vzc2lvbiAqIHNlc3MpCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgR1ZhbHVlQXJyYXkgKnNvdXJjZV9zdGF0czsKKyAgR1ZhbHVlIHNvdXJjZV9zdGF0c192ID0gR19WQUxVRV9JTklUOworICBndWludCBzaXplOworCisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1zZXNzaW9uLXN0YXRzIiwKKyAgICAgICJydHgtZHJvcC1jb3VudCIsIEdfVFlQRV9VSU5ULCBzZXNzLT5zdGF0cy5uYWNrc19kcm9wcGVkLAorICAgICAgInNlbnQtbmFjay1jb3VudCIsIEdfVFlQRV9VSU5ULCBzZXNzLT5zdGF0cy5uYWNrc19zZW50LAorICAgICAgInJlY3YtbmFjay1jb3VudCIsIEdfVFlQRV9VSU5ULCBzZXNzLT5zdGF0cy5uYWNrc19yZWNlaXZlZCwgTlVMTCk7CisKKyAgc2l6ZSA9IGdfaGFzaF90YWJsZV9zaXplIChzZXNzLT5zc3Jjc1tzZXNzLT5tYXNrX2lkeF0pOworICBzb3VyY2Vfc3RhdHMgPSBnX3ZhbHVlX2FycmF5X25ldyAoc2l6ZSk7CisgIGdfaGFzaF90YWJsZV9mb3JlYWNoIChzZXNzLT5zc3Jjc1tzZXNzLT5tYXNrX2lkeF0sCisgICAgICAoR0hGdW5jKSBjcmVhdGVfc291cmNlX3N0YXRzLCBzb3VyY2Vfc3RhdHMpOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworCisgIGdfdmFsdWVfaW5pdCAoJnNvdXJjZV9zdGF0c192LCBHX1RZUEVfVkFMVUVfQVJSQVkpOworICBnX3ZhbHVlX3Rha2VfYm94ZWQgKCZzb3VyY2Vfc3RhdHNfdiwgc291cmNlX3N0YXRzKTsKKyAgZ3N0X3N0cnVjdHVyZV90YWtlX3ZhbHVlIChzLCAic291cmNlLXN0YXRzIiwgJnNvdXJjZV9zdGF0c192KTsKKworICByZXR1cm4gczsKK30KKworc3RhdGljIHZvaWQKK3J0cF9zZXNzaW9uX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBSVFBTZXNzaW9uICpzZXNzOworCisgIHNlc3MgPSBSVFBfU0VTU0lPTiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfSU5URVJOQUxfU1NSQzoKKyAgICAgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICAgICAgc2Vzcy0+c3VnZ2VzdGVkX3NzcmMgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBzZXNzLT5pbnRlcm5hbF9zc3JjX3NldCA9IFRSVUU7CisgICAgICBzZXNzLT5pbnRlcm5hbF9zc3JjX2Zyb21fY2Fwc19vcl9wcm9wZXJ0eSA9IFRSVUU7CisgICAgICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworICAgICAgaWYgKHNlc3MtPmNhbGxiYWNrcy5yZWNvbmZpZ3VyZSkKKyAgICAgICAgc2Vzcy0+Y2FsbGJhY2tzLnJlY29uZmlndXJlIChzZXNzLCBzZXNzLT5yZWNvbmZpZ3VyZV91c2VyX2RhdGEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JBTkRXSURUSDoKKyAgICAgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICAgICAgc2Vzcy0+YmFuZHdpZHRoID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisgICAgICBzZXNzLT5yZWNhbGNfYmFuZHdpZHRoID0gVFJVRTsKKyAgICAgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRDUF9GUkFDVElPTjoKKyAgICAgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICAgICAgc2Vzcy0+cnRjcF9iYW5kd2lkdGggPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIHNlc3MtPnJlY2FsY19iYW5kd2lkdGggPSBUUlVFOworICAgICAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX1JSX0JBTkRXSURUSDoKKyAgICAgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICAgICAgc2Vzcy0+cnRjcF9ycl9iYW5kd2lkdGggPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIHNlc3MtPnJlY2FsY19iYW5kd2lkdGggPSBUUlVFOworICAgICAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX1JTX0JBTkRXSURUSDoKKyAgICAgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICAgICAgc2Vzcy0+cnRjcF9yc19iYW5kd2lkdGggPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIHNlc3MtPnJlY2FsY19iYW5kd2lkdGggPSBUUlVFOworICAgICAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX01UVToKKyAgICAgIHNlc3MtPm10dSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TREVTOgorICAgICAgcnRwX3Nlc3Npb25fc2V0X3NkZXNfc3RydWN0IChzZXNzLCBnX3ZhbHVlX2dldF9ib3hlZCAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GQVZPUl9ORVc6CisgICAgICBzZXNzLT5mYXZvcl9uZXcgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRDUF9NSU5fSU5URVJWQUw6CisgICAgICBydHBfc3RhdHNfc2V0X21pbl9pbnRlcnZhbCAoJnNlc3MtPnN0YXRzLAorICAgICAgICAgIChnZG91YmxlKSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKSAvIEdTVF9TRUNPTkQpOworICAgICAgLyogdHJpZ2dlciByZWNvbnNpZGVyYXRpb24gKi8KKyAgICAgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICAgICAgc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWUgPSAwOworICAgICAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgICAgIGlmIChzZXNzLT5jYWxsYmFja3MucmVjb25zaWRlcikKKyAgICAgICAgc2Vzcy0+Y2FsbGJhY2tzLnJlY29uc2lkZXIgKHNlc3MsIHNlc3MtPnJlY29uc2lkZXJfdXNlcl9kYXRhKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX0lNTUVESUFURV9GRUVEQkFDS19USFJFU0hPTEQ6CisgICAgICBzZXNzLT5ydGNwX2ltbWVkaWF0ZV9mZWVkYmFja190aHJlc2hvbGQgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUFJPQkFUSU9OOgorICAgICAgc2Vzcy0+cHJvYmF0aW9uID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9EUk9QT1VUX1RJTUU6CisgICAgICBzZXNzLT5tYXhfZHJvcG91dF90aW1lID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9NSVNPUkRFUl9USU1FOgorICAgICAgc2Vzcy0+bWF4X21pc29yZGVyX3RpbWUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRQX1BST0ZJTEU6CisgICAgICBzZXNzLT5ydHBfcHJvZmlsZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIC8qIHRyaWdnZXIgcmVjb25zaWRlcmF0aW9uICovCisgICAgICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgICAgIHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lID0gMDsKKyAgICAgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisgICAgICBpZiAoc2Vzcy0+Y2FsbGJhY2tzLnJlY29uc2lkZXIpCisgICAgICAgIHNlc3MtPmNhbGxiYWNrcy5yZWNvbnNpZGVyIChzZXNzLCBzZXNzLT5yZWNvbnNpZGVyX3VzZXJfZGF0YSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRDUF9SRURVQ0VEX1NJWkU6CisgICAgICBzZXNzLT5yZWR1Y2VkX3NpemVfcnRjcCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3J0cF9zZXNzaW9uX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBSVFBTZXNzaW9uICpzZXNzOworCisgIHNlc3MgPSBSVFBfU0VTU0lPTiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfSU5URVJOQUxfU1NSQzoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBydHBfc2Vzc2lvbl9zdWdnZXN0X3NzcmMgKHNlc3MsIE5VTEwpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JTlRFUk5BTF9TT1VSQ0U6CisgICAgICAvKiBGSVhNRSwgcmV0dXJuIGEgcmFuZG9tIHNvdXJjZSAqLworICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkFORFdJRFRIOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgc2Vzcy0+YmFuZHdpZHRoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX0ZSQUNUSU9OOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgc2Vzcy0+cnRjcF9iYW5kd2lkdGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUQ1BfUlJfQkFORFdJRFRIOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgc2Vzcy0+cnRjcF9ycl9iYW5kd2lkdGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUQ1BfUlNfQkFORFdJRFRIOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgc2Vzcy0+cnRjcF9yc19iYW5kd2lkdGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUQ1BfTVRVOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNlc3MtPm10dSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0RFUzoKKyAgICAgIGdfdmFsdWVfdGFrZV9ib3hlZCAodmFsdWUsIHJ0cF9zZXNzaW9uX2dldF9zZGVzX3N0cnVjdCAoc2VzcykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05VTV9TT1VSQ0VTOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0cF9zZXNzaW9uX2dldF9udW1fc291cmNlcyAoc2VzcykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05VTV9BQ1RJVkVfU09VUkNFUzoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBydHBfc2Vzc2lvbl9nZXRfbnVtX2FjdGl2ZV9zb3VyY2VzIChzZXNzKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU09VUkNFUzoKKyAgICAgIGdfdmFsdWVfdGFrZV9ib3hlZCAodmFsdWUsIHJ0cF9zZXNzaW9uX2NyZWF0ZV9zb3VyY2VzIChzZXNzKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRkFWT1JfTkVXOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNlc3MtPmZhdm9yX25ldyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRDUF9NSU5fSU5URVJWQUw6CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCBzZXNzLT5zdGF0cy5taW5faW50ZXJ2YWwgKiBHU1RfU0VDT05EKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX0lNTUVESUFURV9GRUVEQkFDS19USFJFU0hPTEQ6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc2Vzcy0+cnRjcF9pbW1lZGlhdGVfZmVlZGJhY2tfdGhyZXNob2xkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9CQVRJT046CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc2Vzcy0+cHJvYmF0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfRFJPUE9VVF9USU1FOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNlc3MtPm1heF9kcm9wb3V0X3RpbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9NSVNPUkRFUl9USU1FOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNlc3MtPm1heF9taXNvcmRlcl90aW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVEFUUzoKKyAgICAgIGdfdmFsdWVfdGFrZV9ib3hlZCAodmFsdWUsIHJ0cF9zZXNzaW9uX2NyZWF0ZV9zdGF0cyAoc2VzcykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUUF9QUk9GSUxFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHNlc3MtPnJ0cF9wcm9maWxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX1JFRFVDRURfU0laRToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBzZXNzLT5yZWR1Y2VkX3NpemVfcnRjcCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitvbl9uZXdfc3NyYyAoUlRQU2Vzc2lvbiAqIHNlc3MsIFJUUFNvdXJjZSAqIHNvdXJjZSkKK3sKKyAgZ19vYmplY3RfcmVmIChzb3VyY2UpOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworICBnX3NpZ25hbF9lbWl0IChzZXNzLCBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9ORVdfU1NSQ10sIDAsIHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICBnX29iamVjdF91bnJlZiAoc291cmNlKTsKK30KKworc3RhdGljIHZvaWQKK29uX3NzcmNfY29sbGlzaW9uIChSVFBTZXNzaW9uICogc2VzcywgUlRQU291cmNlICogc291cmNlKQoreworICBnX29iamVjdF9yZWYgKHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MsIHJ0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX1NTUkNfQ09MTElTSU9OXSwgMCwKKyAgICAgIHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICBnX29iamVjdF91bnJlZiAoc291cmNlKTsKK30KKworc3RhdGljIHZvaWQKK29uX3NzcmNfdmFsaWRhdGVkIChSVFBTZXNzaW9uICogc2VzcywgUlRQU291cmNlICogc291cmNlKQoreworICBnX29iamVjdF9yZWYgKHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MsIHJ0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX1NTUkNfVkFMSURBVEVEXSwgMCwKKyAgICAgIHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICBnX29iamVjdF91bnJlZiAoc291cmNlKTsKK30KKworc3RhdGljIHZvaWQKK29uX3NzcmNfYWN0aXZlIChSVFBTZXNzaW9uICogc2VzcywgUlRQU291cmNlICogc291cmNlKQoreworICBnX29iamVjdF9yZWYgKHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MsIHJ0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX1NTUkNfQUNUSVZFXSwgMCwgc291cmNlKTsKKyAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgIGdfb2JqZWN0X3VucmVmIChzb3VyY2UpOworfQorCitzdGF0aWMgdm9pZAorb25fc3NyY19zZGVzIChSVFBTZXNzaW9uICogc2VzcywgUlRQU291cmNlICogc291cmNlKQoreworICBnX29iamVjdF9yZWYgKHNvdXJjZSk7CisgIEdTVF9ERUJVRyAoIlNERVMgY2hhbmdlZCBmb3IgU1NSQyAlMDh4Iiwgc291cmNlLT5zc3JjKTsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgZ19zaWduYWxfZW1pdCAoc2VzcywgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fU1NSQ19TREVTXSwgMCwgc291cmNlKTsKKyAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgIGdfb2JqZWN0X3VucmVmIChzb3VyY2UpOworfQorCitzdGF0aWMgdm9pZAorb25fYnllX3NzcmMgKFJUUFNlc3Npb24gKiBzZXNzLCBSVFBTb3VyY2UgKiBzb3VyY2UpCit7CisgIGdfb2JqZWN0X3JlZiAoc291cmNlKTsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgZ19zaWduYWxfZW1pdCAoc2VzcywgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fQllFX1NTUkNdLCAwLCBzb3VyY2UpOworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgZ19vYmplY3RfdW5yZWYgKHNvdXJjZSk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9ieWVfdGltZW91dCAoUlRQU2Vzc2lvbiAqIHNlc3MsIFJUUFNvdXJjZSAqIHNvdXJjZSkKK3sKKyAgZ19vYmplY3RfcmVmIChzb3VyY2UpOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworICBnX3NpZ25hbF9lbWl0IChzZXNzLCBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9CWUVfVElNRU9VVF0sIDAsIHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICBnX29iamVjdF91bnJlZiAoc291cmNlKTsKK30KKworc3RhdGljIHZvaWQKK29uX3RpbWVvdXQgKFJUUFNlc3Npb24gKiBzZXNzLCBSVFBTb3VyY2UgKiBzb3VyY2UpCit7CisgIGdfb2JqZWN0X3JlZiAoc291cmNlKTsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgZ19zaWduYWxfZW1pdCAoc2VzcywgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fVElNRU9VVF0sIDAsIHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICBnX29iamVjdF91bnJlZiAoc291cmNlKTsKK30KKworc3RhdGljIHZvaWQKK29uX3NlbmRlcl90aW1lb3V0IChSVFBTZXNzaW9uICogc2VzcywgUlRQU291cmNlICogc291cmNlKQoreworICBnX29iamVjdF9yZWYgKHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MsIHJ0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX1NFTkRFUl9USU1FT1VUXSwgMCwKKyAgICAgIHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICBnX29iamVjdF91bnJlZiAoc291cmNlKTsKK30KKworc3RhdGljIHZvaWQKK29uX25ld19zZW5kZXJfc3NyYyAoUlRQU2Vzc2lvbiAqIHNlc3MsIFJUUFNvdXJjZSAqIHNvdXJjZSkKK3sKKyAgZ19vYmplY3RfcmVmIChzb3VyY2UpOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworICBnX3NpZ25hbF9lbWl0IChzZXNzLCBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9ORVdfU0VOREVSX1NTUkNdLCAwLAorICAgICAgc291cmNlKTsKKyAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgIGdfb2JqZWN0X3VucmVmIChzb3VyY2UpOworfQorCitzdGF0aWMgdm9pZAorb25fc2VuZGVyX3NzcmNfYWN0aXZlIChSVFBTZXNzaW9uICogc2VzcywgUlRQU291cmNlICogc291cmNlKQoreworICBnX29iamVjdF9yZWYgKHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MsIHJ0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX1NFTkRFUl9TU1JDX0FDVElWRV0sIDAsCisgICAgICBzb3VyY2UpOworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgZ19vYmplY3RfdW5yZWYgKHNvdXJjZSk7Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fbmV3OgorICoKKyAqIENyZWF0ZSBhIG5ldyBzZXNzaW9uIG9iamVjdC4KKyAqCisgKiBSZXR1cm5zOiBhIG5ldyAjUlRQU2Vzc2lvbi4gZ19vYmplY3RfdW5yZWYoKSBhZnRlciB1c2FnZS4KKyAqLworUlRQU2Vzc2lvbiAqCitydHBfc2Vzc2lvbl9uZXcgKHZvaWQpCit7CisgIFJUUFNlc3Npb24gKnNlc3M7CisKKyAgc2VzcyA9IGdfb2JqZWN0X25ldyAoUlRQX1RZUEVfU0VTU0lPTiwgTlVMTCk7CisKKyAgcmV0dXJuIHNlc3M7Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fc2V0X2NhbGxiYWNrczoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQGNhbGxiYWNrczogY2FsbGJhY2tzIHRvIGNvbmZpZ3VyZQorICogQHVzZXJfZGF0YTogdXNlciBkYXRhIHBhc3NlZCBpbiB0aGUgY2FsbGJhY2tzCisgKgorICogQ29uZmlndXJlIGEgc2V0IG9mIGNhbGxiYWNrcyB0byBiZSBub3RpZmllZCBvZiBhY3Rpb25zLgorICovCit2b2lkCitydHBfc2Vzc2lvbl9zZXRfY2FsbGJhY2tzIChSVFBTZXNzaW9uICogc2VzcywgUlRQU2Vzc2lvbkNhbGxiYWNrcyAqIGNhbGxiYWNrcywKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKFJUUF9JU19TRVNTSU9OIChzZXNzKSk7CisKKyAgaWYgKGNhbGxiYWNrcy0+cHJvY2Vzc19ydHApIHsKKyAgICBzZXNzLT5jYWxsYmFja3MucHJvY2Vzc19ydHAgPSBjYWxsYmFja3MtPnByb2Nlc3NfcnRwOworICAgIHNlc3MtPnByb2Nlc3NfcnRwX3VzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgfQorICBpZiAoY2FsbGJhY2tzLT5zZW5kX3J0cCkgeworICAgIHNlc3MtPmNhbGxiYWNrcy5zZW5kX3J0cCA9IGNhbGxiYWNrcy0+c2VuZF9ydHA7CisgICAgc2Vzcy0+c2VuZF9ydHBfdXNlcl9kYXRhID0gdXNlcl9kYXRhOworICB9CisgIGlmIChjYWxsYmFja3MtPnNlbmRfcnRjcCkgeworICAgIHNlc3MtPmNhbGxiYWNrcy5zZW5kX3J0Y3AgPSBjYWxsYmFja3MtPnNlbmRfcnRjcDsKKyAgICBzZXNzLT5zZW5kX3J0Y3BfdXNlcl9kYXRhID0gdXNlcl9kYXRhOworICB9CisgIGlmIChjYWxsYmFja3MtPnN5bmNfcnRjcCkgeworICAgIHNlc3MtPmNhbGxiYWNrcy5zeW5jX3J0Y3AgPSBjYWxsYmFja3MtPnN5bmNfcnRjcDsKKyAgICBzZXNzLT5zeW5jX3J0Y3BfdXNlcl9kYXRhID0gdXNlcl9kYXRhOworICB9CisgIGlmIChjYWxsYmFja3MtPmNsb2NrX3JhdGUpIHsKKyAgICBzZXNzLT5jYWxsYmFja3MuY2xvY2tfcmF0ZSA9IGNhbGxiYWNrcy0+Y2xvY2tfcmF0ZTsKKyAgICBzZXNzLT5jbG9ja19yYXRlX3VzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgfQorICBpZiAoY2FsbGJhY2tzLT5yZWNvbnNpZGVyKSB7CisgICAgc2Vzcy0+Y2FsbGJhY2tzLnJlY29uc2lkZXIgPSBjYWxsYmFja3MtPnJlY29uc2lkZXI7CisgICAgc2Vzcy0+cmVjb25zaWRlcl91c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgIH0KKyAgaWYgKGNhbGxiYWNrcy0+cmVxdWVzdF9rZXlfdW5pdCkgeworICAgIHNlc3MtPmNhbGxiYWNrcy5yZXF1ZXN0X2tleV91bml0ID0gY2FsbGJhY2tzLT5yZXF1ZXN0X2tleV91bml0OworICAgIHNlc3MtPnJlcXVlc3Rfa2V5X3VuaXRfdXNlcl9kYXRhID0gdXNlcl9kYXRhOworICB9CisgIGlmIChjYWxsYmFja3MtPnJlcXVlc3RfdGltZSkgeworICAgIHNlc3MtPmNhbGxiYWNrcy5yZXF1ZXN0X3RpbWUgPSBjYWxsYmFja3MtPnJlcXVlc3RfdGltZTsKKyAgICBzZXNzLT5yZXF1ZXN0X3RpbWVfdXNlcl9kYXRhID0gdXNlcl9kYXRhOworICB9CisgIGlmIChjYWxsYmFja3MtPm5vdGlmeV9uYWNrKSB7CisgICAgc2Vzcy0+Y2FsbGJhY2tzLm5vdGlmeV9uYWNrID0gY2FsbGJhY2tzLT5ub3RpZnlfbmFjazsKKyAgICBzZXNzLT5ub3RpZnlfbmFja191c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgIH0KKyAgaWYgKGNhbGxiYWNrcy0+cmVjb25maWd1cmUpIHsKKyAgICBzZXNzLT5jYWxsYmFja3MucmVjb25maWd1cmUgPSBjYWxsYmFja3MtPnJlY29uZmlndXJlOworICAgIHNlc3MtPnJlY29uZmlndXJlX3VzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgfQorfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX3NldF9wcm9jZXNzX3J0cF9jYWxsYmFjazoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQGNhbGxiYWNrOiBjYWxsYmFjayB0byBzZXQKKyAqIEB1c2VyX2RhdGE6IHVzZXIgZGF0YSBwYXNzZWQgaW4gdGhlIGNhbGxiYWNrCisgKgorICogQ29uZmlndXJlIG9ubHkgdGhlIHByb2Nlc3NfcnRwIGNhbGxiYWNrIHRvIGJlIG5vdGlmaWVkIG9mIHRoZSBwcm9jZXNzX3J0cCBhY3Rpb24uCisgKi8KK3ZvaWQKK3J0cF9zZXNzaW9uX3NldF9wcm9jZXNzX3J0cF9jYWxsYmFjayAoUlRQU2Vzc2lvbiAqIHNlc3MsCisgICAgUlRQU2Vzc2lvblByb2Nlc3NSVFAgY2FsbGJhY2ssIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpKTsKKworICBzZXNzLT5jYWxsYmFja3MucHJvY2Vzc19ydHAgPSBjYWxsYmFjazsKKyAgc2Vzcy0+cHJvY2Vzc19ydHBfdXNlcl9kYXRhID0gdXNlcl9kYXRhOworfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX3NldF9zZW5kX3J0cF9jYWxsYmFjazoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQGNhbGxiYWNrOiBjYWxsYmFjayB0byBzZXQKKyAqIEB1c2VyX2RhdGE6IHVzZXIgZGF0YSBwYXNzZWQgaW4gdGhlIGNhbGxiYWNrCisgKgorICogQ29uZmlndXJlIG9ubHkgdGhlIHNlbmRfcnRwIGNhbGxiYWNrIHRvIGJlIG5vdGlmaWVkIG9mIHRoZSBzZW5kX3J0cCBhY3Rpb24uCisgKi8KK3ZvaWQKK3J0cF9zZXNzaW9uX3NldF9zZW5kX3J0cF9jYWxsYmFjayAoUlRQU2Vzc2lvbiAqIHNlc3MsCisgICAgUlRQU2Vzc2lvblNlbmRSVFAgY2FsbGJhY2ssIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpKTsKKworICBzZXNzLT5jYWxsYmFja3Muc2VuZF9ydHAgPSBjYWxsYmFjazsKKyAgc2Vzcy0+c2VuZF9ydHBfdXNlcl9kYXRhID0gdXNlcl9kYXRhOworfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX3NldF9zZW5kX3J0Y3BfY2FsbGJhY2s6CisgKiBAc2VzczogYW4gI1JUUFNlc3Npb24KKyAqIEBjYWxsYmFjazogY2FsbGJhY2sgdG8gc2V0CisgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgcGFzc2VkIGluIHRoZSBjYWxsYmFjaworICoKKyAqIENvbmZpZ3VyZSBvbmx5IHRoZSBzZW5kX3J0Y3AgY2FsbGJhY2sgdG8gYmUgbm90aWZpZWQgb2YgdGhlIHNlbmRfcnRjcCBhY3Rpb24uCisgKi8KK3ZvaWQKK3J0cF9zZXNzaW9uX3NldF9zZW5kX3J0Y3BfY2FsbGJhY2sgKFJUUFNlc3Npb24gKiBzZXNzLAorICAgIFJUUFNlc3Npb25TZW5kUlRDUCBjYWxsYmFjaywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBnX3JldHVybl9pZl9mYWlsIChSVFBfSVNfU0VTU0lPTiAoc2VzcykpOworCisgIHNlc3MtPmNhbGxiYWNrcy5zZW5kX3J0Y3AgPSBjYWxsYmFjazsKKyAgc2Vzcy0+c2VuZF9ydGNwX3VzZXJfZGF0YSA9IHVzZXJfZGF0YTsKK30KKworLyoqCisgKiBydHBfc2Vzc2lvbl9zZXRfc3luY19ydGNwX2NhbGxiYWNrOgorICogQHNlc3M6IGFuICNSVFBTZXNzaW9uCisgKiBAY2FsbGJhY2s6IGNhbGxiYWNrIHRvIHNldAorICogQHVzZXJfZGF0YTogdXNlciBkYXRhIHBhc3NlZCBpbiB0aGUgY2FsbGJhY2sKKyAqCisgKiBDb25maWd1cmUgb25seSB0aGUgc3luY19ydGNwIGNhbGxiYWNrIHRvIGJlIG5vdGlmaWVkIG9mIHRoZSBzeW5jX3J0Y3AgYWN0aW9uLgorICovCit2b2lkCitydHBfc2Vzc2lvbl9zZXRfc3luY19ydGNwX2NhbGxiYWNrIChSVFBTZXNzaW9uICogc2VzcywKKyAgICBSVFBTZXNzaW9uU3luY1JUQ1AgY2FsbGJhY2ssIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpKTsKKworICBzZXNzLT5jYWxsYmFja3Muc3luY19ydGNwID0gY2FsbGJhY2s7CisgIHNlc3MtPnN5bmNfcnRjcF91c2VyX2RhdGEgPSB1c2VyX2RhdGE7Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fc2V0X2Nsb2NrX3JhdGVfY2FsbGJhY2s6CisgKiBAc2VzczogYW4gI1JUUFNlc3Npb24KKyAqIEBjYWxsYmFjazogY2FsbGJhY2sgdG8gc2V0CisgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgcGFzc2VkIGluIHRoZSBjYWxsYmFjaworICoKKyAqIENvbmZpZ3VyZSBvbmx5IHRoZSBjbG9ja19yYXRlIGNhbGxiYWNrIHRvIGJlIG5vdGlmaWVkIG9mIHRoZSBjbG9ja19yYXRlIGFjdGlvbi4KKyAqLwordm9pZAorcnRwX3Nlc3Npb25fc2V0X2Nsb2NrX3JhdGVfY2FsbGJhY2sgKFJUUFNlc3Npb24gKiBzZXNzLAorICAgIFJUUFNlc3Npb25DbG9ja1JhdGUgY2FsbGJhY2ssIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpKTsKKworICBzZXNzLT5jYWxsYmFja3MuY2xvY2tfcmF0ZSA9IGNhbGxiYWNrOworICBzZXNzLT5jbG9ja19yYXRlX3VzZXJfZGF0YSA9IHVzZXJfZGF0YTsKK30KKworLyoqCisgKiBydHBfc2Vzc2lvbl9zZXRfcmVjb25zaWRlcl9jYWxsYmFjazoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQGNhbGxiYWNrOiBjYWxsYmFjayB0byBzZXQKKyAqIEB1c2VyX2RhdGE6IHVzZXIgZGF0YSBwYXNzZWQgaW4gdGhlIGNhbGxiYWNrCisgKgorICogQ29uZmlndXJlIG9ubHkgdGhlIHJlY29uc2lkZXIgY2FsbGJhY2sgdG8gYmUgbm90aWZpZWQgb2YgdGhlIHJlY29uc2lkZXIgYWN0aW9uLgorICovCit2b2lkCitydHBfc2Vzc2lvbl9zZXRfcmVjb25zaWRlcl9jYWxsYmFjayAoUlRQU2Vzc2lvbiAqIHNlc3MsCisgICAgUlRQU2Vzc2lvblJlY29uc2lkZXIgY2FsbGJhY2ssIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpKTsKKworICBzZXNzLT5jYWxsYmFja3MucmVjb25zaWRlciA9IGNhbGxiYWNrOworICBzZXNzLT5yZWNvbnNpZGVyX3VzZXJfZGF0YSA9IHVzZXJfZGF0YTsKK30KKworLyoqCisgKiBydHBfc2Vzc2lvbl9zZXRfcmVxdWVzdF90aW1lX2NhbGxiYWNrOgorICogQHNlc3M6IGFuICNSVFBTZXNzaW9uCisgKiBAY2FsbGJhY2s6IGNhbGxiYWNrIHRvIHNldAorICogQHVzZXJfZGF0YTogdXNlciBkYXRhIHBhc3NlZCBpbiB0aGUgY2FsbGJhY2sKKyAqCisgKiBDb25maWd1cmUgb25seSB0aGUgcmVxdWVzdF90aW1lIGNhbGxiYWNrCisgKi8KK3ZvaWQKK3J0cF9zZXNzaW9uX3NldF9yZXF1ZXN0X3RpbWVfY2FsbGJhY2sgKFJUUFNlc3Npb24gKiBzZXNzLAorICAgIFJUUFNlc3Npb25SZXF1ZXN0VGltZSBjYWxsYmFjaywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBnX3JldHVybl9pZl9mYWlsIChSVFBfSVNfU0VTU0lPTiAoc2VzcykpOworCisgIHNlc3MtPmNhbGxiYWNrcy5yZXF1ZXN0X3RpbWUgPSBjYWxsYmFjazsKKyAgc2Vzcy0+cmVxdWVzdF90aW1lX3VzZXJfZGF0YSA9IHVzZXJfZGF0YTsKK30KKworLyoqCisgKiBydHBfc2Vzc2lvbl9zZXRfYmFuZHdpZHRoOgorICogQHNlc3M6IGFuICNSVFBTZXNzaW9uCisgKiBAYmFuZHdpZHRoOiB0aGUgYmFuZHdpZHRoIGFsbG9jYXRlZAorICoKKyAqIFNldCB0aGUgc2Vzc2lvbiBiYW5kd2lkdGggaW4gYml0cyBwZXIgc2Vjb25kLgorICovCit2b2lkCitydHBfc2Vzc2lvbl9zZXRfYmFuZHdpZHRoIChSVFBTZXNzaW9uICogc2VzcywgZ2RvdWJsZSBiYW5kd2lkdGgpCit7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKFJUUF9JU19TRVNTSU9OIChzZXNzKSk7CisKKyAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgIHNlc3MtPnN0YXRzLmJhbmR3aWR0aCA9IGJhbmR3aWR0aDsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKK30KKworLyoqCisgKiBydHBfc2Vzc2lvbl9nZXRfYmFuZHdpZHRoOgorICogQHNlc3M6IGFuICNSVFBTZXNzaW9uCisgKgorICogR2V0IHRoZSBzZXNzaW9uIGJhbmR3aWR0aC4KKyAqCisgKiBSZXR1cm5zOiB0aGUgc2Vzc2lvbiBiYW5kd2lkdGguCisgKi8KK2dkb3VibGUKK3J0cF9zZXNzaW9uX2dldF9iYW5kd2lkdGggKFJUUFNlc3Npb24gKiBzZXNzKQoreworICBnZG91YmxlIHJlc3VsdDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpLCAwKTsKKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgcmVzdWx0ID0gc2Vzcy0+c3RhdHMuYmFuZHdpZHRoOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fc2V0X3J0Y3BfZnJhY3Rpb246CisgKiBAc2VzczogYW4gI1JUUFNlc3Npb24KKyAqIEBiYW5kd2lkdGg6IHRoZSBSVENQIGJhbmR3aWR0aAorICoKKyAqIFNldCB0aGUgYmFuZHdpZHRoIGluIGJpdHMgcGVyIHNlY29uZCB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBSVENQCisgKiBtZXNzYWdlcy4KKyAqLwordm9pZAorcnRwX3Nlc3Npb25fc2V0X3J0Y3BfZnJhY3Rpb24gKFJUUFNlc3Npb24gKiBzZXNzLCBnZG91YmxlIGJhbmR3aWR0aCkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpKTsKKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgc2Vzcy0+c3RhdHMucnRjcF9iYW5kd2lkdGggPSBiYW5kd2lkdGg7CisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fZ2V0X3J0Y3BfZnJhY3Rpb246CisgKiBAc2VzczogYW4gI1JUUFNlc3Npb24KKyAqCisgKiBHZXQgdGhlIHNlc3Npb24gYmFuZHdpZHRoIHVzZWQgZm9yIFJUQ1AuCisgKgorICogUmV0dXJuczogVGhlIGJhbmR3aWR0aCB1c2VkIGZvciBSVENQIG1lc3NhZ2VzLgorICovCitnZG91YmxlCitydHBfc2Vzc2lvbl9nZXRfcnRjcF9mcmFjdGlvbiAoUlRQU2Vzc2lvbiAqIHNlc3MpCit7CisgIGdkb3VibGUgcmVzdWx0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU0VTU0lPTiAoc2VzcyksIDAuMCk7CisKKyAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgIHJlc3VsdCA9IHNlc3MtPnN0YXRzLnJ0Y3BfYmFuZHdpZHRoOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fZ2V0X3NkZXNfc3RydWN0OgorICogQHNlc3M6IGFuICNSVFNQU2Vzc2lvbgorICoKKyAqIEdldCB0aGUgU0RFUyBkYXRhIGFzIGEgI0dzdFN0cnVjdHVyZQorICoKKyAqIFJldHVybnM6IGEgR3N0U3RydWN0dXJlIHdpdGggU0RFUyBpdGVtcyBmb3IgQHNlc3MuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhCisgKiBjb3B5IG9mIHRoZSBTREVTIHN0cnVjdHVyZSwgdXNlIGdzdF9zdHJ1Y3R1cmVfZnJlZSgpIGFmdGVyIHVzYWdlLgorICovCitHc3RTdHJ1Y3R1cmUgKgorcnRwX3Nlc3Npb25fZ2V0X3NkZXNfc3RydWN0IChSVFBTZXNzaW9uICogc2VzcykKK3sKKyAgR3N0U3RydWN0dXJlICpyZXN1bHQgPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU0VTU0lPTiAoc2VzcyksIE5VTEwpOworCisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICBpZiAoc2Vzcy0+c2RlcykKKyAgICByZXN1bHQgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHNlc3MtPnNkZXMpOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fc2V0X3NkZXNfc3RydWN0OgorICogQHNlc3M6IGFuICNSVFNQU2Vzc2lvbgorICogQHNkZXM6IGEgI0dzdFN0cnVjdHVyZQorICoKKyAqIFNldCB0aGUgU0RFUyBkYXRhIGFzIGEgI0dzdFN0cnVjdHVyZS4gVGhpcyBmdW5jdGlvbiBtYWtlcyBhIGNvcHkgb2YgQHNkZXMuCisgKi8KK3ZvaWQKK3J0cF9zZXNzaW9uX3NldF9zZGVzX3N0cnVjdCAoUlRQU2Vzc2lvbiAqIHNlc3MsIGNvbnN0IEdzdFN0cnVjdHVyZSAqIHNkZXMpCit7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKHNkZXMpOworICBnX3JldHVybl9pZl9mYWlsIChSVFBfSVNfU0VTU0lPTiAoc2VzcykpOworCisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICBpZiAoc2Vzcy0+c2RlcykKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHNlc3MtPnNkZXMpOworICBzZXNzLT5zZGVzID0gZ3N0X3N0cnVjdHVyZV9jb3B5IChzZGVzKTsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK3NvdXJjZV9wdXNoX3J0cCAoUlRQU291cmNlICogc291cmNlLCBncG9pbnRlciBkYXRhLCBSVFBTZXNzaW9uICogc2Vzc2lvbikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXN1bHQgPSBHU1RfRkxPV19PSzsKKworICBpZiAoc291cmNlLT5pbnRlcm5hbCkgeworICAgIEdTVF9MT0cgKCJzb3VyY2UgJTA4eCBwdXNoZWQgc2VuZGVyIFJUUCBwYWNrZXQiLCBzb3VyY2UtPnNzcmMpOworCisgICAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzaW9uKTsKKworICAgIGlmIChzZXNzaW9uLT5jYWxsYmFja3Muc2VuZF9ydHApCisgICAgICByZXN1bHQgPQorICAgICAgICAgIHNlc3Npb24tPmNhbGxiYWNrcy5zZW5kX3J0cCAoc2Vzc2lvbiwgc291cmNlLCBkYXRhLAorICAgICAgICAgIHNlc3Npb24tPnNlbmRfcnRwX3VzZXJfZGF0YSk7CisgICAgZWxzZSB7CisgICAgICBnc3RfbWluaV9vYmplY3RfdW5yZWYgKEdTVF9NSU5JX09CSkVDVF9DQVNUIChkYXRhKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9MT0cgKCJzb3VyY2UgJTA4eCBwdXNoZWQgcmVjZWl2ZXIgUlRQIHBhY2tldCIsIHNvdXJjZS0+c3NyYyk7CisgICAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzaW9uKTsKKworICAgIGlmIChzZXNzaW9uLT5jYWxsYmFja3MucHJvY2Vzc19ydHApCisgICAgICByZXN1bHQgPQorICAgICAgICAgIHNlc3Npb24tPmNhbGxiYWNrcy5wcm9jZXNzX3J0cCAoc2Vzc2lvbiwgc291cmNlLAorICAgICAgICAgIEdTVF9CVUZGRVJfQ0FTVCAoZGF0YSksIHNlc3Npb24tPnByb2Nlc3NfcnRwX3VzZXJfZGF0YSk7CisgICAgZWxzZQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoR1NUX0JVRkZFUl9DQVNUIChkYXRhKSk7CisgIH0KKyAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzc2lvbik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGdpbnQKK3NvdXJjZV9jbG9ja19yYXRlIChSVFBTb3VyY2UgKiBzb3VyY2UsIGd1aW50OCBwdCwgUlRQU2Vzc2lvbiAqIHNlc3Npb24pCit7CisgIGdpbnQgcmVzdWx0OworCisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzc2lvbik7CisKKyAgaWYgKHNlc3Npb24tPmNhbGxiYWNrcy5jbG9ja19yYXRlKQorICAgIHJlc3VsdCA9CisgICAgICAgIHNlc3Npb24tPmNhbGxiYWNrcy5jbG9ja19yYXRlIChzZXNzaW9uLCBwdCwKKyAgICAgICAgc2Vzc2lvbi0+Y2xvY2tfcmF0ZV91c2VyX2RhdGEpOworICBlbHNlCisgICAgcmVzdWx0ID0gLTE7CisKKyAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzc2lvbik7CisKKyAgR1NUX0RFQlVHICgiZ290IGNsb2NrLXJhdGUgJWQgZm9yIHB0ICVkIiwgcmVzdWx0LCBwdCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFJUUFNvdXJjZUNhbGxiYWNrcyBjYWxsYmFja3MgPSB7CisgIChSVFBTb3VyY2VQdXNoUlRQKSBzb3VyY2VfcHVzaF9ydHAsCisgIChSVFBTb3VyY2VDbG9ja1JhdGUpIHNvdXJjZV9jbG9ja19yYXRlLAorfTsKKworCisvKioKKyAqIHJ0cF9zZXNzaW9uX2ZpbmRfY29uZmxpY3RpbmdfYWRkcmVzczoKKyAqIEBzZXNzaW9uOiBUaGUgc2Vzc2lvbiB0aGUgcGFja2V0IGNhbWUgaW4KKyAqIEBhZGRyZXNzOiBhZGRyZXNzIHRvIGNoZWNrIGZvcgorICogQHRpbWU6IFRoZSB0aW1lIHdoZW4gdGhlIHBhY2tldCB0aGF0IGlzIHBvc3NpYmx5IGluIGNvbmZsaWN0IGFycml2ZWQKKyAqCisgKiBDaGVja3MgaWYgYW4gYWRkcmVzcyB3aGljaCBoYXMgYSBjb25mbGljdCBpcyBhbHJlYWR5IGtub3duLiBJZiBpdCBpcworICogYSBrbm93biBjb25mbGljdCwgcmVtZW1iZXIgdGhlIHRpbWUKKyAqCisgKiBSZXR1cm5zOiBUUlVFIGlmIGl0IHdhcyBhIGtub3duIGNvbmZsaWN0LCBGQUxTRSBvdGhlcndpc2UKKyAqLworc3RhdGljIGdib29sZWFuCitydHBfc2Vzc2lvbl9maW5kX2NvbmZsaWN0aW5nX2FkZHJlc3MgKFJUUFNlc3Npb24gKiBzZXNzaW9uLAorICAgIEdTb2NrZXRBZGRyZXNzICogYWRkcmVzcywgR3N0Q2xvY2tUaW1lIHRpbWUpCit7CisgIHJldHVybiBmaW5kX2NvbmZsaWN0aW5nX2FkZHJlc3MgKHNlc3Npb24tPmNvbmZsaWN0aW5nX2FkZHJlc3NlcywgYWRkcmVzcywKKyAgICAgIHRpbWUpOworfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX2FkZF9jb25mbGljdGluZ19hZGRyZXNzOgorICogQHNlc3Npb246IFRoZSBzZXNzaW9uIHRoZSBwYWNrZXQgY2FtZSBpbgorICogQGFkZHJlc3M6IGFkZHJlc3MgdG8gcmVtZW1iZXIKKyAqIEB0aW1lOiBUaGUgdGltZSB3aGVuIHRoZSBwYWNrZXQgdGhhdCBpcyBpbiBjb25mbGljdCBhcnJpdmVkCisgKgorICogQWRkcyBhIG5ldyBjb25mbGljdCBhZGRyZXNzCisgKi8KK3N0YXRpYyB2b2lkCitydHBfc2Vzc2lvbl9hZGRfY29uZmxpY3RpbmdfYWRkcmVzcyAoUlRQU2Vzc2lvbiAqIHNlc3MsCisgICAgR1NvY2tldEFkZHJlc3MgKiBhZGRyZXNzLCBHc3RDbG9ja1RpbWUgdGltZSkKK3sKKyAgc2Vzcy0+Y29uZmxpY3RpbmdfYWRkcmVzc2VzID0KKyAgICAgIGFkZF9jb25mbGljdGluZ19hZGRyZXNzIChzZXNzLT5jb25mbGljdGluZ19hZGRyZXNzZXMsIGFkZHJlc3MsIHRpbWUpOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorY2hlY2tfY29sbGlzaW9uIChSVFBTZXNzaW9uICogc2VzcywgUlRQU291cmNlICogc291cmNlLAorICAgIFJUUFBhY2tldEluZm8gKiBwaW5mbywgZ2Jvb2xlYW4gcnRwKQoreworICBndWludDMyIHNzcmM7CisKKyAgLyogSWYgd2UgaGF2ZSBubyBwaW5mbyBhZGRyZXNzLCB3ZSBjYW4ndCBkbyBjb2xsaXNpb24gY2hlY2tpbmcgKi8KKyAgaWYgKCFwaW5mby0+YWRkcmVzcykKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgc3NyYyA9IHJ0cF9zb3VyY2VfZ2V0X3NzcmMgKHNvdXJjZSk7CisKKyAgaWYgKCFzb3VyY2UtPmludGVybmFsKSB7CisgICAgR1NvY2tldEFkZHJlc3MgKmZyb207CisKKyAgICAvKiBUaGlzIGlzIG5vdCBvdXIgbG9jYWwgc291cmNlLCBidXQgbGV0cyBjaGVjayBpZiB0d28gcmVtb3RlCisgICAgICogc291cmNlIGNvbGxpZGUgKi8KKyAgICBpZiAocnRwKSB7CisgICAgICBmcm9tID0gc291cmNlLT5ydHBfZnJvbTsKKyAgICB9IGVsc2UgeworICAgICAgZnJvbSA9IHNvdXJjZS0+cnRjcF9mcm9tOworICAgIH0KKworICAgIGlmIChmcm9tKSB7CisgICAgICBpZiAoX19nX3NvY2tldF9hZGRyZXNzX2VxdWFsIChmcm9tLCBwaW5mby0+YWRkcmVzcykpIHsKKyAgICAgICAgLyogQWRkcmVzcyBpcyB0aGUgc2FtZSAqLworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfTE9HICgid2UgaGF2ZSBhIHRoaXJkLXBhcnR5IGNvbGxpc2lvbiBvciBsb29wIHNzcmM6JXgiLCBzc3JjKTsKKyAgICAgICAgaWYgKHNlc3MtPmZhdm9yX25ldykgeworICAgICAgICAgIGlmIChydHBfc291cmNlX2ZpbmRfY29uZmxpY3RpbmdfYWRkcmVzcyAoc291cmNlLAorICAgICAgICAgICAgICAgICAgcGluZm8tPmFkZHJlc3MsIHBpbmZvLT5jdXJyZW50X3RpbWUpKSB7CisgICAgICAgICAgICBnY2hhciAqYnVmMTsKKworICAgICAgICAgICAgYnVmMSA9IF9fZ19zb2NrZXRfYWRkcmVzc190b19zdHJpbmcgKHBpbmZvLT5hZGRyZXNzKTsKKyAgICAgICAgICAgIEdTVF9MT0cgKCJLbm93biBjb25mbGljdCBvbiAleCBmb3IgJXMsIGRyb3BwaW5nIHBhY2tldCIsIHNzcmMsCisgICAgICAgICAgICAgICAgYnVmMSk7CisgICAgICAgICAgICBnX2ZyZWUgKGJ1ZjEpOworCisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2NoYXIgKmJ1ZjEsICpidWYyOworCisgICAgICAgICAgICAvKiBDdXJyZW50IGFkZHJlc3MgaXMgbm90IGEga25vd24gY29uZmxpY3QsIGxldHMgYXNzdW1lIHRoaXMgaXMKKyAgICAgICAgICAgICAqIGEgbmV3IHNvdXJjZS4gU2F2ZSBvbGQgYWRkcmVzcyBpbiBwb3NzaWJsZSBjb25mbGljdCBsaXN0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJ0cF9zb3VyY2VfYWRkX2NvbmZsaWN0aW5nX2FkZHJlc3MgKHNvdXJjZSwgZnJvbSwKKyAgICAgICAgICAgICAgICBwaW5mby0+Y3VycmVudF90aW1lKTsKKworICAgICAgICAgICAgYnVmMSA9IF9fZ19zb2NrZXRfYWRkcmVzc190b19zdHJpbmcgKGZyb20pOworICAgICAgICAgICAgYnVmMiA9IF9fZ19zb2NrZXRfYWRkcmVzc190b19zdHJpbmcgKHBpbmZvLT5hZGRyZXNzKTsKKworICAgICAgICAgICAgR1NUX0RFQlVHICgiTmV3IGNvbmZsaWN0IGZvciBzc3JjICV4LCByZXBsYWNpbmcgJXMgd2l0aCAlcywiCisgICAgICAgICAgICAgICAgIiBzYXZpbmcgb2xkIGFzIGtub3duIGNvbmZsaWN0Iiwgc3NyYywgYnVmMSwgYnVmMik7CisKKyAgICAgICAgICAgIGlmIChydHApCisgICAgICAgICAgICAgIHJ0cF9zb3VyY2Vfc2V0X3J0cF9mcm9tIChzb3VyY2UsIHBpbmZvLT5hZGRyZXNzKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcnRwX3NvdXJjZV9zZXRfcnRjcF9mcm9tIChzb3VyY2UsIHBpbmZvLT5hZGRyZXNzKTsKKworICAgICAgICAgICAgZ19mcmVlIChidWYxKTsKKyAgICAgICAgICAgIGdfZnJlZSAoYnVmMik7CisKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogRG9uJ3QgbmVlZCB0byBzYXZlIG9sZCBhZGRyZXNzZXMsIHdlIGlnbm9yZSBuZXcgc291cmNlcyAqLworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFdlIGRvbid0IGFscmVhZHkgaGF2ZSBhIGZyb20gYWRkcmVzcyBmb3IgUlRQLCBqdXN0IHNldCBpdCAqLworICAgICAgaWYgKHJ0cCkKKyAgICAgICAgcnRwX3NvdXJjZV9zZXRfcnRwX2Zyb20gKHNvdXJjZSwgcGluZm8tPmFkZHJlc3MpOworICAgICAgZWxzZQorICAgICAgICBydHBfc291cmNlX3NldF9ydGNwX2Zyb20gKHNvdXJjZSwgcGluZm8tPmFkZHJlc3MpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIEZJWE1FOiBMb2cgM3JkIHBhcnR5IGNvbGxpc2lvbiBzb21laG93CisgICAgICogTWF5YmUgc2hvdWxkIGJlIGRvbmUgaW4gdXBwZXIgbGF5ZXIsIG9ubHkgdGhlIFNERVMgY2FuIHRlbGwgdXMKKyAgICAgKiBpZiBpdHMgYSBjb2xsaXNpb24gb3IgYSBsb29wCisgICAgICovCisgIH0gZWxzZSB7CisgICAgLyogVGhpcyBpcyBzZW5kaW5nIHdpdGggb3VyIHNzcmMsIGlzIGl0IGFuIGFkZHJlc3Mgd2UgYWxyZWFkeSBrbm93ICovCisgICAgaWYgKHJ0cF9zZXNzaW9uX2ZpbmRfY29uZmxpY3RpbmdfYWRkcmVzcyAoc2VzcywgcGluZm8tPmFkZHJlc3MsCisgICAgICAgICAgICBwaW5mby0+Y3VycmVudF90aW1lKSkgeworICAgICAgLyogSXRzIGEga25vd24gY29uZmxpY3QsIGl0cyBwcm9iYWJseSBhIGxvb3AsIG5vdCBhIGNvbGxpc2lvbgorICAgICAgICogbGV0cyBqdXN0IGRyb3AgdGhlIGluY29taW5nIHBhY2tldAorICAgICAgICovCisgICAgICBHU1RfREVCVUcgKCJPdXIgcGFja2V0cyBhcmUgYmVpbmcgbG9vcGVkIGJhY2sgdG8gdXMsIGRyb3BwaW5nIik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEl0cyBhIG5ldyBjb2xsaXNpb24sIGxldHMgY2hhbmdlIG91ciBTU1JDICovCisgICAgICBydHBfc2Vzc2lvbl9hZGRfY29uZmxpY3RpbmdfYWRkcmVzcyAoc2VzcywgcGluZm8tPmFkZHJlc3MsCisgICAgICAgICAgcGluZm8tPmN1cnJlbnRfdGltZSk7CisKKyAgICAgIEdTVF9ERUJVRyAoIkNvbGxpc2lvbiBmb3IgU1NSQyAleCIsIHNzcmMpOworICAgICAgLyogbWFyayB0aGUgc291cmNlIEJZRSAqLworICAgICAgcnRwX3NvdXJjZV9tYXJrX2J5ZSAoc291cmNlLCAiU1NSQyBDb2xsaXNpb24iKTsKKyAgICAgIC8qIGlmIHdlIHdlcmUgc3VnZ2VzdGluZyB0aGlzIFNTUkMsIGNoYW5nZSB0byBzb21ldGhpbmcgZWxzZSAqLworICAgICAgaWYgKHNlc3MtPnN1Z2dlc3RlZF9zc3JjID09IHNzcmMpIHsKKyAgICAgICAgc2Vzcy0+c3VnZ2VzdGVkX3NzcmMgPSBydHBfc2Vzc2lvbl9jcmVhdGVfbmV3X3NzcmMgKHNlc3MpOworICAgICAgICBzZXNzLT5pbnRlcm5hbF9zc3JjX3NldCA9IFRSVUU7CisgICAgICB9CisKKyAgICAgIG9uX3NzcmNfY29sbGlzaW9uIChzZXNzLCBzb3VyY2UpOworCisgICAgICBydHBfc2Vzc2lvbl9zY2hlZHVsZV9ieWVfbG9ja2VkIChzZXNzLCBwaW5mby0+Y3VycmVudF90aW1lKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ2Jvb2xlYW4gaXNfZG9pbmdfcHRwOworICBHU29ja2V0QWRkcmVzcyAqbmV3X2FkZHI7Cit9IENvbXBhcmVBZGRyRGF0YTsKKworLyogY2hlY2sgaWYgdGhlIHR3byBnaXZlbiBpcCBhZGRyIGFyZSB0aGUgc2FtZSAoZG8gbm90IGNhcmUgYWJvdXQgdGhlIHBvcnQpICovCitzdGF0aWMgZ2Jvb2xlYW4KK2lwX2FkZHJfZXF1YWwgKEdTb2NrZXRBZGRyZXNzICogYSwgR1NvY2tldEFkZHJlc3MgKiBiKQoreworICByZXR1cm4KKyAgICAgIGdfaW5ldF9hZGRyZXNzX2VxdWFsIChnX2luZXRfc29ja2V0X2FkZHJlc3NfZ2V0X2FkZHJlc3MKKyAgICAgIChHX0lORVRfU09DS0VUX0FERFJFU1MgKGEpKSwKKyAgICAgIGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcyAoR19JTkVUX1NPQ0tFVF9BRERSRVNTIChiKSkpOworfQorCitzdGF0aWMgdm9pZAorY29tcGFyZV9ydHBfc291cmNlX2FkZHIgKGNvbnN0IGdjaGFyICoga2V5LCBSVFBTb3VyY2UgKiBzb3VyY2UsCisgICAgQ29tcGFyZUFkZHJEYXRhICogZGF0YSkKK3sKKyAgLyogb25seSBjb21wYXJlIGlwIGFkZHIgb2YgcmVtb3RlIHNvdXJjZXMgd2hpY2ggYXJlIGFsc28gbm90IGNsb3NpbmcgKi8KKyAgaWYgKCFzb3VyY2UtPmludGVybmFsICYmICFzb3VyY2UtPmNsb3NpbmcgJiYgc291cmNlLT5ydHBfZnJvbSkgeworICAgIC8qIGxvb2sgZm9yIHRoZSBmaXJzdCBydHAgc291cmNlICovCisgICAgaWYgKCFkYXRhLT5uZXdfYWRkcikKKyAgICAgIGRhdGEtPm5ld19hZGRyID0gc291cmNlLT5ydHBfZnJvbTsKKyAgICAvKiBjb21wYXJlIGN1cnJlbnQgaXAgYWRkciB3aXRoIHRoZSBmaXJzdCBvbmUgKi8KKyAgICBlbHNlCisgICAgICBkYXRhLT5pc19kb2luZ19wdHAgJj0gaXBfYWRkcl9lcXVhbCAoZGF0YS0+bmV3X2FkZHIsIHNvdXJjZS0+cnRwX2Zyb20pOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjb21wYXJlX3J0Y3Bfc291cmNlX2FkZHIgKGNvbnN0IGdjaGFyICoga2V5LCBSVFBTb3VyY2UgKiBzb3VyY2UsCisgICAgQ29tcGFyZUFkZHJEYXRhICogZGF0YSkKK3sKKyAgLyogb25seSBjb21wYXJlIGlwIGFkZHIgb2YgcmVtb3RlIHNvdXJjZXMgd2hpY2ggYXJlIGFsc28gbm90IGNsb3NpbmcgKi8KKyAgaWYgKCFzb3VyY2UtPmludGVybmFsICYmICFzb3VyY2UtPmNsb3NpbmcgJiYgc291cmNlLT5ydGNwX2Zyb20pIHsKKyAgICAvKiBsb29rIGZvciB0aGUgZmlyc3QgcnRjcCBzb3VyY2UgKi8KKyAgICBpZiAoIWRhdGEtPm5ld19hZGRyKQorICAgICAgZGF0YS0+bmV3X2FkZHIgPSBzb3VyY2UtPnJ0Y3BfZnJvbTsKKyAgICBlbHNlCisgICAgICAvKiBjb21wYXJlIGN1cnJlbnQgaXAgYWRkciB3aXRoIHRoZSBmaXJzdCBvbmUgKi8KKyAgICAgIGRhdGEtPmlzX2RvaW5nX3B0cCAmPSBpcF9hZGRyX2VxdWFsIChkYXRhLT5uZXdfYWRkciwgc291cmNlLT5ydGNwX2Zyb20pOworICB9Cit9CisKKy8qIGxvb3Agb3ZlciBvdXIgbm9uLWludGVybmFsIHNvdXJjZSB0byBrbm93IGlmIHRoZSBzZXNzaW9uCisgKiBpcyBkb2luZyBwb2ludC10by1wb2ludCAqLworc3RhdGljIHZvaWQKK3Nlc3Npb25fdXBkYXRlX3B0cCAoUlRQU2Vzc2lvbiAqIHNlc3MpCit7CisgIC8qIHRvIGtub3cgaWYgdGhlIHNlc3Npb24gaXMgZG9pbmcgcG9pbnQgdG8gcG9pbnQsIHRoZSBpcCBhZGRyCisgICAqIG9mIGVhY2ggbm9uLWludGVybmFsICg9cmVtb3Rlcykgc291cmNlIGhhdmUgdG8gYmUgY29tcGFyZWQKKyAgICogdG8gZWFjaCBvdGhlci4KKyAgICovCisgIGdib29sZWFuIGlzX2RvaW5nX3J0cF9wdHA7CisgIGdib29sZWFuIGlzX2RvaW5nX3J0Y3BfcHRwOworICBDb21wYXJlQWRkckRhdGEgZGF0YTsKKworICAvKiBjb21wYXJlIHRoZSBmaXJzdCByZW1vdGUgc291cmNlJ3MgaXAgYWRkciB0aGF0IHJlY2VpdmUgcnRwIHBhY2tldHMKKyAgICogd2l0aCBvdGhlciByZW1vdGUgcnRwIHNvdXJjZS4KKyAgICogaXQncyBlbm91Z2ggYmVjYXVzZSB0aGUgc2Vzc2lvbiBqdXN0IG5lZWRzIHRvIGtub3cgaWYgdGhleSBhcmUgYWxsCisgICAqIGVxdWFscyBvciBub3QKKyAgICovCisgIGRhdGEuaXNfZG9pbmdfcHRwID0gVFJVRTsKKyAgZGF0YS5uZXdfYWRkciA9IE5VTEw7CisgIGdfaGFzaF90YWJsZV9mb3JlYWNoIChzZXNzLT5zc3Jjc1tzZXNzLT5tYXNrX2lkeF0sCisgICAgICAoR0hGdW5jKSBjb21wYXJlX3J0cF9zb3VyY2VfYWRkciwgKGdwb2ludGVyKSAmIGRhdGEpOworICBpc19kb2luZ19ydHBfcHRwID0gZGF0YS5pc19kb2luZ19wdHA7CisKKyAgLyogc2FtZSBidXQgYWJvdXQgcnRjcCAqLworICBkYXRhLmlzX2RvaW5nX3B0cCA9IFRSVUU7CisgIGRhdGEubmV3X2FkZHIgPSBOVUxMOworICBnX2hhc2hfdGFibGVfZm9yZWFjaCAoc2Vzcy0+c3NyY3Nbc2Vzcy0+bWFza19pZHhdLAorICAgICAgKEdIRnVuYykgY29tcGFyZV9ydGNwX3NvdXJjZV9hZGRyLCAoZ3BvaW50ZXIpICYgZGF0YSk7CisgIGlzX2RvaW5nX3J0Y3BfcHRwID0gZGF0YS5pc19kb2luZ19wdHA7CisKKyAgLyogdGhlIHNlc3Npb24gaXMgZG9pbmcgcG9pbnQtdG8tcG9pbnQgaWYgYWxsIHJ0cCByZW1vdGUgaGF2ZSB0aGUgc2FtZQorICAgKiBpcCBhZGRyIGFuZCBpZiBhbGwgcnRjcCByZW1vdGUgc291cmNlcyBoYXZlIHRoZSBzYW1lIGlwIGFkZHIgKi8KKyAgc2Vzcy0+aXNfZG9pbmdfcHRwID0gaXNfZG9pbmdfcnRwX3B0cCAmJiBpc19kb2luZ19ydGNwX3B0cDsKKworICBHU1RfREVCVUcgKCJkb2luZyBwb2ludC10by1wb2ludDogJWQiLCBzZXNzLT5pc19kb2luZ19wdHApOworfQorCitzdGF0aWMgdm9pZAorYWRkX3NvdXJjZSAoUlRQU2Vzc2lvbiAqIHNlc3MsIFJUUFNvdXJjZSAqIHNyYykKK3sKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAoc2Vzcy0+c3NyY3Nbc2Vzcy0+bWFza19pZHhdLAorICAgICAgR0lOVF9UT19QT0lOVEVSIChzcmMtPnNzcmMpLCBzcmMpOworICAvKiByZXBvcnQgdGhlIG5ldyBzb3VyY2UgQVNBUCAqLworICBzcmMtPmdlbmVyYXRpb24gPSBzZXNzLT5nZW5lcmF0aW9uOworICAvKiB3ZSBoYXZlIG9uZSBtb3JlIHNvdXJjZSBub3cgKi8KKyAgc2Vzcy0+dG90YWxfc291cmNlcysrOworICBpZiAoUlRQX1NPVVJDRV9JU19BQ1RJVkUgKHNyYykpCisgICAgc2Vzcy0+c3RhdHMuYWN0aXZlX3NvdXJjZXMrKzsKKyAgaWYgKHNyYy0+aW50ZXJuYWwpIHsKKyAgICBzZXNzLT5zdGF0cy5pbnRlcm5hbF9zb3VyY2VzKys7CisgICAgaWYgKCFzZXNzLT5pbnRlcm5hbF9zc3JjX2Zyb21fY2Fwc19vcl9wcm9wZXJ0eQorICAgICAgICAmJiBzZXNzLT5zdWdnZXN0ZWRfc3NyYyAhPSBzcmMtPnNzcmMpIHsKKyAgICAgIHNlc3MtPnN1Z2dlc3RlZF9zc3JjID0gc3JjLT5zc3JjOworICAgICAgc2Vzcy0+aW50ZXJuYWxfc3NyY19zZXQgPSBUUlVFOworICAgIH0KKyAgfQorCisgIC8qIHVwZGF0ZSBwb2ludC10by1wb2ludCBzdGF0dXMgKi8KKyAgaWYgKCFzcmMtPmludGVybmFsKQorICAgIHNlc3Npb25fdXBkYXRlX3B0cCAoc2Vzcyk7Cit9CisKK3N0YXRpYyBSVFBTb3VyY2UgKgorZmluZF9zb3VyY2UgKFJUUFNlc3Npb24gKiBzZXNzLCBndWludDMyIHNzcmMpCit7CisgIHJldHVybiBnX2hhc2hfdGFibGVfbG9va3VwIChzZXNzLT5zc3Jjc1tzZXNzLT5tYXNrX2lkeF0sCisgICAgICBHSU5UX1RPX1BPSU5URVIgKHNzcmMpKTsKK30KKworLyogbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgc2Vzc2lvbiBsb2NrLCB0aGUgcmV0dXJuZWQgc291cmNlIG5lZWRzIHRvIGJlCisgKiB1bnJlZmZlZCBhZnRlciB1c2FnZS4gKi8KK3N0YXRpYyBSVFBTb3VyY2UgKgorb2J0YWluX3NvdXJjZSAoUlRQU2Vzc2lvbiAqIHNlc3MsIGd1aW50MzIgc3NyYywgZ2Jvb2xlYW4gKiBjcmVhdGVkLAorICAgIFJUUFBhY2tldEluZm8gKiBwaW5mbywgZ2Jvb2xlYW4gcnRwKQoreworICBSVFBTb3VyY2UgKnNvdXJjZTsKKworICBzb3VyY2UgPSBmaW5kX3NvdXJjZSAoc2Vzcywgc3NyYyk7CisgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgIC8qIG1ha2UgbmV3IFNvdXJjZSBpbiBwcm9iYXRpb24gYW5kIGluc2VydCAqLworICAgIHNvdXJjZSA9IHJ0cF9zb3VyY2VfbmV3IChzc3JjKTsKKworICAgIEdTVF9ERUJVRyAoImNyZWF0aW5nIG5ldyBzb3VyY2UgJTA4eCAlcCIsIHNzcmMsIHNvdXJjZSk7CisKKyAgICAvKiBmb3IgUlRQIHBhY2tldHMgd2UgbmVlZCB0byBzZXQgdGhlIHNvdXJjZSBpbiBwcm9iYXRpb24uIFJlY2VpdmluZyBSVENQCisgICAgICogcGFja2V0cyBvZiBhbiBTU1JDLCBvbiB0aGUgb3RoZXIgaGFuZCwgaXMgYSBzdHJvbmcgaW5kaWNhdGlvbiB0aGF0IHdlCisgICAgICogYXJlIGRlYWxpbmcgd2l0aCBhIHZhbGlkIHNvdXJjZS4gKi8KKyAgICBnX29iamVjdF9zZXQgKHNvdXJjZSwgInByb2JhdGlvbiIsIHJ0cCA/IHNlc3MtPnByb2JhdGlvbiA6IDAsCisgICAgICAgICJtYXgtZHJvcG91dC10aW1lIiwgc2Vzcy0+bWF4X2Ryb3BvdXRfdGltZSwgIm1heC1taXNvcmRlci10aW1lIiwKKyAgICAgICAgc2Vzcy0+bWF4X21pc29yZGVyX3RpbWUsIE5VTEwpOworCisgICAgLyogc3RvcmUgZnJvbSBhZGRyZXNzLCBpZiBhbnkgKi8KKyAgICBpZiAocGluZm8tPmFkZHJlc3MpIHsKKyAgICAgIGlmIChydHApCisgICAgICAgIHJ0cF9zb3VyY2Vfc2V0X3J0cF9mcm9tIChzb3VyY2UsIHBpbmZvLT5hZGRyZXNzKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcnRwX3NvdXJjZV9zZXRfcnRjcF9mcm9tIChzb3VyY2UsIHBpbmZvLT5hZGRyZXNzKTsKKyAgICB9CisKKyAgICAvKiBjb25maWd1cmUgYSBjYWxsYmFjayBvbiB0aGUgc291cmNlICovCisgICAgcnRwX3NvdXJjZV9zZXRfY2FsbGJhY2tzIChzb3VyY2UsICZjYWxsYmFja3MsIHNlc3MpOworCisgICAgYWRkX3NvdXJjZSAoc2Vzcywgc291cmNlKTsKKyAgICAqY3JlYXRlZCA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgKmNyZWF0ZWQgPSBGQUxTRTsKKyAgICAvKiBjaGVjayBmb3IgY29sbGlzaW9uLCB0aGlzIHVwZGF0ZXMgdGhlIGFkZHJlc3Mgd2hlbiBub3QgcHJldmlvdXNseSBzZXQgKi8KKyAgICBpZiAoY2hlY2tfY29sbGlzaW9uIChzZXNzLCBzb3VyY2UsIHBpbmZvLCBydHApKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogUmVjZWl2aW5nIFJUQ1AgcGFja2V0cyBvZiBhbiBTU1JDIGlzIGEgc3Ryb25nIGluZGljYXRpb24gdGhhdCB3ZQorICAgICAqIGFyZSBkZWFsaW5nIHdpdGggYSB2YWxpZCBzb3VyY2UuICovCisgICAgaWYgKCFydHApCisgICAgICBnX29iamVjdF9zZXQgKHNvdXJjZSwgInByb2JhdGlvbiIsIDAsIE5VTEwpOworICB9CisgIC8qIHVwZGF0ZSBsYXN0IGFjdGl2aXR5ICovCisgIHNvdXJjZS0+bGFzdF9hY3Rpdml0eSA9IHBpbmZvLT5jdXJyZW50X3RpbWU7CisgIGlmIChydHApCisgICAgc291cmNlLT5sYXN0X3J0cF9hY3Rpdml0eSA9IHBpbmZvLT5jdXJyZW50X3RpbWU7CisgIGdfb2JqZWN0X3JlZiAoc291cmNlKTsKKworICByZXR1cm4gc291cmNlOworfQorCisvKiBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBzZXNzaW9uIGxvY2ssIHRoZSByZXR1cm5lZCBzb3VyY2UgbmVlZHMgdG8gYmUKKyAqIHVucmVmZmVkIGFmdGVyIHVzYWdlLiAqLworc3RhdGljIFJUUFNvdXJjZSAqCitvYnRhaW5faW50ZXJuYWxfc291cmNlIChSVFBTZXNzaW9uICogc2VzcywgZ3VpbnQzMiBzc3JjLCBnYm9vbGVhbiAqIGNyZWF0ZWQsCisgICAgR3N0Q2xvY2tUaW1lIGN1cnJlbnRfdGltZSkKK3sKKyAgUlRQU291cmNlICpzb3VyY2U7CisKKyAgc291cmNlID0gZmluZF9zb3VyY2UgKHNlc3MsIHNzcmMpOworICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICAvKiBtYWtlIG5ldyBpbnRlcm5hbCBTb3VyY2UgYW5kIGluc2VydCAqLworICAgIHNvdXJjZSA9IHJ0cF9zb3VyY2VfbmV3IChzc3JjKTsKKworICAgIEdTVF9ERUJVRyAoImNyZWF0aW5nIG5ldyBpbnRlcm5hbCBzb3VyY2UgJTA4eCAlcCIsIHNzcmMsIHNvdXJjZSk7CisKKyAgICBzb3VyY2UtPnZhbGlkYXRlZCA9IFRSVUU7CisgICAgc291cmNlLT5pbnRlcm5hbCA9IFRSVUU7CisgICAgc291cmNlLT5wcm9iYXRpb24gPSBGQUxTRTsKKyAgICBydHBfc291cmNlX3NldF9zZGVzX3N0cnVjdCAoc291cmNlLCBnc3Rfc3RydWN0dXJlX2NvcHkgKHNlc3MtPnNkZXMpKTsKKyAgICBydHBfc291cmNlX3NldF9jYWxsYmFja3MgKHNvdXJjZSwgJmNhbGxiYWNrcywgc2Vzcyk7CisKKyAgICBhZGRfc291cmNlIChzZXNzLCBzb3VyY2UpOworICAgICpjcmVhdGVkID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICAqY3JlYXRlZCA9IEZBTFNFOworICB9CisgIC8qIHVwZGF0ZSBsYXN0IGFjdGl2aXR5ICovCisgIGlmIChjdXJyZW50X3RpbWUgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgIHNvdXJjZS0+bGFzdF9hY3Rpdml0eSA9IGN1cnJlbnRfdGltZTsKKyAgICBzb3VyY2UtPmxhc3RfcnRwX2FjdGl2aXR5ID0gY3VycmVudF90aW1lOworICB9CisgIGdfb2JqZWN0X3JlZiAoc291cmNlKTsKKworICByZXR1cm4gc291cmNlOworfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX3N1Z2dlc3Rfc3NyYzoKKyAqIEBzZXNzOiBhICNSVFBTZXNzaW9uCisgKiBAaXNfcmFuZG9tOiBpZiB0aGUgc3VnZ2VzdGVkIHNzcmMgaXMgcmFuZG9tCisgKgorICogU3VnZ2VzdCBhbiB1bnVzZWQgU1NSQyBpbiBAc2Vzcy4KKyAqCisgKiBSZXR1cm5zOiBhIGZyZWUgdW51c2VkIFNTUkMKKyAqLworZ3VpbnQzMgorcnRwX3Nlc3Npb25fc3VnZ2VzdF9zc3JjIChSVFBTZXNzaW9uICogc2VzcywgZ2Jvb2xlYW4gKiBpc19yYW5kb20pCit7CisgIGd1aW50MzIgcmVzdWx0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU0VTU0lPTiAoc2VzcyksIDApOworCisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICByZXN1bHQgPSBzZXNzLT5zdWdnZXN0ZWRfc3NyYzsKKyAgaWYgKGlzX3JhbmRvbSkKKyAgICAqaXNfcmFuZG9tID0gIXNlc3MtPmludGVybmFsX3NzcmNfc2V0OworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fYWRkX3NvdXJjZToKKyAqIEBzZXNzOiBhICNSVFBTZXNzaW9uCisgKiBAc3JjOiAjUlRQU291cmNlIHRvIGFkZAorICoKKyAqIEFkZCBAc3JjIHRvIEBzZXNzaW9uLgorICoKKyAqIFJldHVybnM6ICVUUlVFIG9uIHN1Y2Nlc3MsICVGQUxTRSBpZiBhIHNvdXJjZSB3aXRoIHRoZSBzYW1lIFNTUkMgYWxyZWFkeQorICogZXhpc3RlZCBpbiB0aGUgc2Vzc2lvbi4KKyAqLworZ2Jvb2xlYW4KK3J0cF9zZXNzaW9uX2FkZF9zb3VyY2UgKFJUUFNlc3Npb24gKiBzZXNzLCBSVFBTb3VyY2UgKiBzcmMpCit7CisgIGdib29sZWFuIHJlc3VsdCA9IEZBTFNFOworICBSVFBTb3VyY2UgKmZpbmQ7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFJUUF9JU19TRVNTSU9OIChzZXNzKSwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc3JjICE9IE5VTEwsIEZBTFNFKTsKKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgZmluZCA9IGZpbmRfc291cmNlIChzZXNzLCBzcmMtPnNzcmMpOworICBpZiAoZmluZCA9PSBOVUxMKSB7CisgICAgYWRkX3NvdXJjZSAoc2Vzcywgc3JjKTsKKyAgICByZXN1bHQgPSBUUlVFOworICB9CisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBydHBfc2Vzc2lvbl9nZXRfbnVtX3NvdXJjZXM6CisgKiBAc2VzczogYW4gI1JUUFNlc3Npb24KKyAqCisgKiBHZXQgdGhlIG51bWJlciBvZiBzb3VyY2VzIGluIEBzZXNzLgorICoKKyAqIFJldHVybnM6IFRoZSBudW1iZXIgb2Ygc291cmNlcyBpbiBAc2Vzcy4KKyAqLworZ3VpbnQKK3J0cF9zZXNzaW9uX2dldF9udW1fc291cmNlcyAoUlRQU2Vzc2lvbiAqIHNlc3MpCit7CisgIGd1aW50IHJlc3VsdDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpLCBGQUxTRSk7CisKKyAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgIHJlc3VsdCA9IHNlc3MtPnRvdGFsX3NvdXJjZXM7CisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBydHBfc2Vzc2lvbl9nZXRfbnVtX2FjdGl2ZV9zb3VyY2VzOgorICogQHNlc3M6IGFuICNSVFBTZXNzaW9uCisgKgorICogR2V0IHRoZSBudW1iZXIgb2YgYWN0aXZlIHNvdXJjZXMgaW4gQHNlc3MuIEEgc291cmNlIGlzIGNvbnNpZGVyZWQgYWN0aXZlIHdoZW4KKyAqIGl0IGhhcyBiZWVuIHZhbGlkYXRlZCBhbmQgaGFzIG5vdCB5ZXQgcmVjZWl2ZWQgYSBCWUUgUlRDUCBtZXNzYWdlLgorICoKKyAqIFJldHVybnM6IFRoZSBudW1iZXIgb2YgYWN0aXZlIHNvdXJjZXMgaW4gQHNlc3MuCisgKi8KK2d1aW50CitydHBfc2Vzc2lvbl9nZXRfbnVtX2FjdGl2ZV9zb3VyY2VzIChSVFBTZXNzaW9uICogc2VzcykKK3sKKyAgZ3VpbnQgcmVzdWx0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU0VTU0lPTiAoc2VzcyksIDApOworCisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICByZXN1bHQgPSBzZXNzLT5zdGF0cy5hY3RpdmVfc291cmNlczsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX2dldF9zb3VyY2VfYnlfc3NyYzoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQHNzcmM6IGFuIFNTUkMKKyAqCisgKiBGaW5kIHRoZSBzb3VyY2Ugd2l0aCBAc3NyYyBpbiBAc2Vzcy4KKyAqCisgKiBSZXR1cm5zOiBhICNSVFBTb3VyY2Ugd2l0aCBTU1JDIEBzc3JjIG9yIE5VTEwgaWYgdGhlIHNvdXJjZSB3YXMgbm90IGZvdW5kLgorICogZ19vYmplY3RfdW5yZWYoKSBhZnRlciB1c2FnZS4KKyAqLworUlRQU291cmNlICoKK3J0cF9zZXNzaW9uX2dldF9zb3VyY2VfYnlfc3NyYyAoUlRQU2Vzc2lvbiAqIHNlc3MsIGd1aW50MzIgc3NyYykKK3sKKyAgUlRQU291cmNlICpyZXN1bHQ7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFJUUF9JU19TRVNTSU9OIChzZXNzKSwgTlVMTCk7CisKKyAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgIHJlc3VsdCA9IGZpbmRfc291cmNlIChzZXNzLCBzc3JjKTsKKyAgaWYgKHJlc3VsdCAhPSBOVUxMKQorICAgIGdfb2JqZWN0X3JlZiAocmVzdWx0KTsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIFNFU1NJT04gbG9jayAqLworc3RhdGljIGd1aW50MzIKK3J0cF9zZXNzaW9uX2NyZWF0ZV9uZXdfc3NyYyAoUlRQU2Vzc2lvbiAqIHNlc3MpCit7CisgIGd1aW50MzIgc3NyYzsKKworICB3aGlsZSAoVFJVRSkgeworICAgIHNzcmMgPSBnX3JhbmRvbV9pbnQgKCk7CisKKyAgICAvKiBzZWUgaWYgaXQgZXhpc3RzIGluIHRoZSBzZXNzaW9uLCB3ZSdyZSBkb25lIGlmIGl0IGRvZXNuJ3QgKi8KKyAgICBpZiAoZmluZF9zb3VyY2UgKHNlc3MsIHNzcmMpID09IE5VTEwpCisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gc3NyYzsKK30KKworCisvKioKKyAqIHJ0cF9zZXNzaW9uX2NyZWF0ZV9zb3VyY2U6CisgKiBAc2VzczogYW4gI1JUUFNlc3Npb24KKyAqCisgKiBDcmVhdGUgYW4gI1JUUFNvdXJjZSBmb3IgdXNlIGluIEBzZXNzLiBUaGlzIGZ1bmN0aW9uIHdpbGwgY3JlYXRlIGEgc291cmNlCisgKiB3aXRoIGFuIHNzcmMgdGhhdCBpcyBjdXJyZW50bHkgbm90IHVzZWQgYnkgYW55IHBhcnRpY2lwYW50cyBpbiB0aGUgc2Vzc2lvbi4KKyAqCisgKiBSZXR1cm5zOiBhbiAjUlRQU291cmNlLgorICovCitSVFBTb3VyY2UgKgorcnRwX3Nlc3Npb25fY3JlYXRlX3NvdXJjZSAoUlRQU2Vzc2lvbiAqIHNlc3MpCit7CisgIGd1aW50MzIgc3NyYzsKKyAgUlRQU291cmNlICpzb3VyY2U7CisKKyAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgIHNzcmMgPSBydHBfc2Vzc2lvbl9jcmVhdGVfbmV3X3NzcmMgKHNlc3MpOworICBzb3VyY2UgPSBydHBfc291cmNlX25ldyAoc3NyYyk7CisgIHJ0cF9zb3VyY2Vfc2V0X2NhbGxiYWNrcyAoc291cmNlLCAmY2FsbGJhY2tzLCBzZXNzKTsKKyAgLyogd2UgbmVlZCBhbiBhZGRpdGlvbmFsIHJlZiBmb3IgdGhlIHNvdXJjZSBpbiB0aGUgaGFzaHRhYmxlICovCisgIGdfb2JqZWN0X3JlZiAoc291cmNlKTsKKyAgYWRkX3NvdXJjZSAoc2Vzcywgc291cmNlKTsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKworICByZXR1cm4gc291cmNlOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3VwZGF0ZV9wYWNrZXQgKEdzdEJ1ZmZlciAqKiBidWZmZXIsIGd1aW50IGlkeCwgUlRQUGFja2V0SW5mbyAqIHBpbmZvKQoreworICBHc3ROZXRBZGRyZXNzTWV0YSAqbWV0YTsKKworICAvKiBnZXQgcGFja2V0IHNpemUgaW5jbHVkaW5nIGhlYWRlciBvdmVyaGVhZCAqLworICBwaW5mby0+Ynl0ZXMgKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoKmJ1ZmZlcikgKyBwaW5mby0+aGVhZGVyX2xlbjsKKyAgcGluZm8tPnBhY2tldHMrKzsKKworICBpZiAocGluZm8tPnJ0cCkgeworICAgIEdzdFJUUEJ1ZmZlciBydHAgPSB7IE5VTEwgfTsKKworICAgIGlmICghZ3N0X3J0cF9idWZmZXJfbWFwICgqYnVmZmVyLCBHU1RfTUFQX1JFQUQsICZydHApKQorICAgICAgZ290byBpbnZhbGlkX3BhY2tldDsKKworICAgIHBpbmZvLT5wYXlsb2FkX2xlbiArPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKCZydHApOworICAgIGlmIChpZHggPT0gMCkgeworICAgICAgZ2ludCBpOworCisgICAgICAvKiBvbmx5IGtlZXAgaW5mbyBmb3IgZmlyc3QgYnVmZmVyICovCisgICAgICBwaW5mby0+c3NyYyA9IGdzdF9ydHBfYnVmZmVyX2dldF9zc3JjICgmcnRwKTsKKyAgICAgIHBpbmZvLT5zZXFudW0gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfc2VxICgmcnRwKTsKKyAgICAgIHBpbmZvLT5wdCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3R5cGUgKCZydHApOworICAgICAgcGluZm8tPnJ0cHRpbWUgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wICgmcnRwKTsKKyAgICAgIC8qIGNvcHkgYXZhaWxhYmxlIGNzcmMgKi8KKyAgICAgIHBpbmZvLT5jc3JjX2NvdW50ID0gZ3N0X3J0cF9idWZmZXJfZ2V0X2NzcmNfY291bnQgKCZydHApOworICAgICAgZm9yIChpID0gMDsgaSA8IHBpbmZvLT5jc3JjX2NvdW50OyBpKyspCisgICAgICAgIHBpbmZvLT5jc3Jjc1tpXSA9IGdzdF9ydHBfYnVmZmVyX2dldF9jc3JjICgmcnRwLCBpKTsKKyAgICB9CisgICAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworICB9CisKKyAgaWYgKGlkeCA9PSAwKSB7CisgICAgLyogZm9yIG5ldGJ1ZmZlciB3ZSBjYW4gc3RvcmUgdGhlIElQIGFkZHJlc3MgdG8gY2hlY2sgZm9yIGNvbGxpc2lvbnMgKi8KKyAgICBtZXRhID0gZ3N0X2J1ZmZlcl9nZXRfbmV0X2FkZHJlc3NfbWV0YSAoKmJ1ZmZlcik7CisgICAgaWYgKHBpbmZvLT5hZGRyZXNzKQorICAgICAgZ19vYmplY3RfdW5yZWYgKHBpbmZvLT5hZGRyZXNzKTsKKyAgICBpZiAobWV0YSkgeworICAgICAgcGluZm8tPmFkZHJlc3MgPSBHX1NPQ0tFVF9BRERSRVNTIChnX29iamVjdF9yZWYgKG1ldGEtPmFkZHIpKTsKKyAgICB9IGVsc2UgeworICAgICAgcGluZm8tPmFkZHJlc3MgPSBOVUxMOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfcGFja2V0OgorICB7CisgICAgR1NUX0RFQlVHICgiaW52YWxpZCBSVFAgcGFja2V0IHJlY2VpdmVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qIHVwZGF0ZSB0aGUgUlRQUGFja2V0SW5mbyBzdHJ1Y3R1cmUgd2l0aCB0aGUgY3VycmVudCB0aW1lIGFuZCBvdGhlciBiaXRzCisgKiBhYm91dCB0aGUgY3VycmVudCBidWZmZXIgd2UgYXJlIGhhbmRsaW5nLgorICogVGhpcyBmdW5jdGlvbiBpcyB0eXBpY2FsbHkgY2FsbGVkIHdoZW4gYSB2YWxpZGF0ZWQgcGFja2V0IGlzIHJlY2VpdmVkLgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIFNFU1NJT05fTE9DSworICovCitzdGF0aWMgZ2Jvb2xlYW4KK3VwZGF0ZV9wYWNrZXRfaW5mbyAoUlRQU2Vzc2lvbiAqIHNlc3MsIFJUUFBhY2tldEluZm8gKiBwaW5mbywKKyAgICBnYm9vbGVhbiBzZW5kLCBnYm9vbGVhbiBydHAsIGdib29sZWFuIGlzX2xpc3QsIGdwb2ludGVyIGRhdGEsCisgICAgR3N0Q2xvY2tUaW1lIGN1cnJlbnRfdGltZSwgR3N0Q2xvY2tUaW1lIHJ1bm5pbmdfdGltZSwgZ3VpbnQ2NCBudHBuc3RpbWUpCit7CisgIGdib29sZWFuIHJlczsKKworICBwaW5mby0+c2VuZCA9IHNlbmQ7CisgIHBpbmZvLT5ydHAgPSBydHA7CisgIHBpbmZvLT5pc19saXN0ID0gaXNfbGlzdDsKKyAgcGluZm8tPmRhdGEgPSBkYXRhOworICBwaW5mby0+Y3VycmVudF90aW1lID0gY3VycmVudF90aW1lOworICBwaW5mby0+cnVubmluZ190aW1lID0gcnVubmluZ190aW1lOworICBwaW5mby0+bnRwbnN0aW1lID0gbnRwbnN0aW1lOworICBwaW5mby0+aGVhZGVyX2xlbiA9IHNlc3MtPmhlYWRlcl9sZW47CisgIHBpbmZvLT5ieXRlcyA9IDA7CisgIHBpbmZvLT5wYXlsb2FkX2xlbiA9IDA7CisgIHBpbmZvLT5wYWNrZXRzID0gMDsKKworICBpZiAoaXNfbGlzdCkgeworICAgIEdzdEJ1ZmZlckxpc3QgKmxpc3QgPSBHU1RfQlVGRkVSX0xJU1RfQ0FTVCAoZGF0YSk7CisgICAgcmVzID0KKyAgICAgICAgZ3N0X2J1ZmZlcl9saXN0X2ZvcmVhY2ggKGxpc3QsIChHc3RCdWZmZXJMaXN0RnVuYykgdXBkYXRlX3BhY2tldCwKKyAgICAgICAgcGluZm8pOworICB9IGVsc2UgeworICAgIEdzdEJ1ZmZlciAqYnVmZmVyID0gR1NUX0JVRkZFUl9DQVNUIChkYXRhKTsKKyAgICByZXMgPSB1cGRhdGVfcGFja2V0ICgmYnVmZmVyLCAwLCBwaW5mbyk7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQKK2NsZWFuX3BhY2tldF9pbmZvIChSVFBQYWNrZXRJbmZvICogcGluZm8pCit7CisgIGlmIChwaW5mby0+YWRkcmVzcykKKyAgICBnX29iamVjdF91bnJlZiAocGluZm8tPmFkZHJlc3MpOworICBpZiAocGluZm8tPmRhdGEpIHsKKyAgICBnc3RfbWluaV9vYmplY3RfdW5yZWYgKHBpbmZvLT5kYXRhKTsKKyAgICBwaW5mby0+ZGF0YSA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitzb3VyY2VfdXBkYXRlX2FjdGl2ZSAoUlRQU2Vzc2lvbiAqIHNlc3MsIFJUUFNvdXJjZSAqIHNvdXJjZSwKKyAgICBnYm9vbGVhbiBwcmV2YWN0aXZlKQoreworICBnYm9vbGVhbiBhY3RpdmUgPSBSVFBfU09VUkNFX0lTX0FDVElWRSAoc291cmNlKTsKKyAgZ3VpbnQzMiBzc3JjID0gc291cmNlLT5zc3JjOworCisgIGlmIChwcmV2YWN0aXZlID09IGFjdGl2ZSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGFjdGl2ZSkgeworICAgIHNlc3MtPnN0YXRzLmFjdGl2ZV9zb3VyY2VzKys7CisgICAgR1NUX0RFQlVHICgic291cmNlOiAlMDh4IGJlY2FtZSBhY3RpdmUsICVkIGFjdGl2ZSBzb3VyY2VzIiwgc3NyYywKKyAgICAgICAgc2Vzcy0+c3RhdHMuYWN0aXZlX3NvdXJjZXMpOworICB9IGVsc2UgeworICAgIHNlc3MtPnN0YXRzLmFjdGl2ZV9zb3VyY2VzLS07CisgICAgR1NUX0RFQlVHICgic291cmNlOiAlMDh4IGJlY2FtZSBpbmFjdGl2ZSwgJWQgYWN0aXZlIHNvdXJjZXMiLCBzc3JjLAorICAgICAgICBzZXNzLT5zdGF0cy5hY3RpdmVfc291cmNlcyk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorc291cmNlX3VwZGF0ZV9zZW5kZXIgKFJUUFNlc3Npb24gKiBzZXNzLCBSVFBTb3VyY2UgKiBzb3VyY2UsCisgICAgZ2Jvb2xlYW4gcHJldnNlbmRlcikKK3sKKyAgZ2Jvb2xlYW4gc2VuZGVyID0gUlRQX1NPVVJDRV9JU19TRU5ERVIgKHNvdXJjZSk7CisgIGd1aW50MzIgc3NyYyA9IHNvdXJjZS0+c3NyYzsKKworICBpZiAocHJldnNlbmRlciA9PSBzZW5kZXIpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChzZW5kZXIpIHsKKyAgICBzZXNzLT5zdGF0cy5zZW5kZXJfc291cmNlcysrOworICAgIGlmIChzb3VyY2UtPmludGVybmFsKQorICAgICAgc2Vzcy0+c3RhdHMuaW50ZXJuYWxfc2VuZGVyX3NvdXJjZXMrKzsKKyAgICBHU1RfREVCVUcgKCJzb3VyY2U6ICUwOHggYmVjYW1lIHNlbmRlciwgJWQgc2VuZGVyIHNvdXJjZXMiLCBzc3JjLAorICAgICAgICBzZXNzLT5zdGF0cy5zZW5kZXJfc291cmNlcyk7CisgIH0gZWxzZSB7CisgICAgc2Vzcy0+c3RhdHMuc2VuZGVyX3NvdXJjZXMtLTsKKyAgICBpZiAoc291cmNlLT5pbnRlcm5hbCkKKyAgICAgIHNlc3MtPnN0YXRzLmludGVybmFsX3NlbmRlcl9zb3VyY2VzLS07CisgICAgR1NUX0RFQlVHICgic291cmNlOiAlMDh4IGJlY2FtZSBub24gc2VuZGVyLCAlZCBzZW5kZXIgc291cmNlcyIsIHNzcmMsCisgICAgICAgIHNlc3MtPnN0YXRzLnNlbmRlcl9zb3VyY2VzKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBydHBfc2Vzc2lvbl9wcm9jZXNzX3J0cDoKKyAqIEBzZXNzOiBhbmQgI1JUUFNlc3Npb24KKyAqIEBidWZmZXI6IGFuIFJUUCBidWZmZXIKKyAqIEBjdXJyZW50X3RpbWU6IHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lCisgKiBAcnVubmluZ190aW1lOiB0aGUgcnVubmluZ190aW1lIG9mIEBidWZmZXIKKyAqCisgKiBQcm9jZXNzIGFuIFJUUCBidWZmZXIgaW4gdGhlIHNlc3Npb24gbWFuYWdlci4gVGhpcyBmdW5jdGlvbiB0YWtlcyBvd25lcnNoaXAKKyAqIG9mIEBidWZmZXIuCisgKgorICogUmV0dXJuczogYSAjR3N0Rmxvd1JldHVybi4KKyAqLworR3N0Rmxvd1JldHVybgorcnRwX3Nlc3Npb25fcHJvY2Vzc19ydHAgKFJUUFNlc3Npb24gKiBzZXNzLCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgR3N0Q2xvY2tUaW1lIGN1cnJlbnRfdGltZSwgR3N0Q2xvY2tUaW1lIHJ1bm5pbmdfdGltZSwgZ3VpbnQ2NCBudHBuc3RpbWUpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzdWx0OworICBndWludDMyIHNzcmM7CisgIFJUUFNvdXJjZSAqc291cmNlOworICBnYm9vbGVhbiBjcmVhdGVkOworICBnYm9vbGVhbiBwcmV2c2VuZGVyLCBwcmV2YWN0aXZlOworICBSVFBQYWNrZXRJbmZvIHBpbmZvID0geyAwLCB9OworICBndWludDY0IG9sZHJhdGU7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFJUUF9JU19TRVNTSU9OIChzZXNzKSwgR1NUX0ZMT1dfRVJST1IpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX0JVRkZFUiAoYnVmZmVyKSwgR1NUX0ZMT1dfRVJST1IpOworCisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworCisgIC8qIHVwZGF0ZSBwaW5mbyBzdGF0cyAqLworICBpZiAoIXVwZGF0ZV9wYWNrZXRfaW5mbyAoc2VzcywgJnBpbmZvLCBGQUxTRSwgVFJVRSwgRkFMU0UsIGJ1ZmZlciwKKyAgICAgICAgICBjdXJyZW50X3RpbWUsIHJ1bm5pbmdfdGltZSwgbnRwbnN0aW1lKSkgeworICAgIEdTVF9ERUJVRyAoImludmFsaWQgUlRQIHBhY2tldCByZWNlaXZlZCIpOworICAgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisgICAgcmV0dXJuIHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnRjcCAoc2VzcywgYnVmZmVyLCBjdXJyZW50X3RpbWUsIG50cG5zdGltZSk7CisgIH0KKworICBzc3JjID0gcGluZm8uc3NyYzsKKworICBzb3VyY2UgPSBvYnRhaW5fc291cmNlIChzZXNzLCBzc3JjLCAmY3JlYXRlZCwgJnBpbmZvLCBUUlVFKTsKKyAgaWYgKCFzb3VyY2UpCisgICAgZ290byBjb2xsaXNpb247CisKKyAgcHJldnNlbmRlciA9IFJUUF9TT1VSQ0VfSVNfU0VOREVSIChzb3VyY2UpOworICBwcmV2YWN0aXZlID0gUlRQX1NPVVJDRV9JU19BQ1RJVkUgKHNvdXJjZSk7CisgIG9sZHJhdGUgPSBzb3VyY2UtPmJpdHJhdGU7CisKKyAgLyogbGV0IHNvdXJjZSBwcm9jZXNzIHRoZSBwYWNrZXQgKi8KKyAgcmVzdWx0ID0gcnRwX3NvdXJjZV9wcm9jZXNzX3J0cCAoc291cmNlLCAmcGluZm8pOworCisgIC8qIHNvdXJjZSBiZWNhbWUgYWN0aXZlICovCisgIGlmIChzb3VyY2VfdXBkYXRlX2FjdGl2ZSAoc2Vzcywgc291cmNlLCBwcmV2YWN0aXZlKSkKKyAgICBvbl9zc3JjX3ZhbGlkYXRlZCAoc2Vzcywgc291cmNlKTsKKworICBzb3VyY2VfdXBkYXRlX3NlbmRlciAoc2Vzcywgc291cmNlLCBwcmV2c2VuZGVyKTsKKworICBpZiAob2xkcmF0ZSAhPSBzb3VyY2UtPmJpdHJhdGUpCisgICAgc2Vzcy0+cmVjYWxjX2JhbmR3aWR0aCA9IFRSVUU7CisKKyAgaWYgKGNyZWF0ZWQpCisgICAgb25fbmV3X3NzcmMgKHNlc3MsIHNvdXJjZSk7CisKKyAgaWYgKHNvdXJjZS0+dmFsaWRhdGVkKSB7CisgICAgZ2Jvb2xlYW4gY3JlYXRlZDsKKyAgICBnaW50IGk7CisKKyAgICAvKiBmb3IgdmFsaWRhdGVkIHNvdXJjZXMsIHdlIGFkZCB0aGUgQ1NSQ3MgYXMgd2VsbCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBwaW5mby5jc3JjX2NvdW50OyBpKyspIHsKKyAgICAgIGd1aW50MzIgY3NyYzsKKyAgICAgIFJUUFNvdXJjZSAqY3NyY19zcmM7CisKKyAgICAgIGNzcmMgPSBwaW5mby5jc3Jjc1tpXTsKKworICAgICAgLyogZ2V0IHNvdXJjZSAqLworICAgICAgY3NyY19zcmMgPSBvYnRhaW5fc291cmNlIChzZXNzLCBjc3JjLCAmY3JlYXRlZCwgJnBpbmZvLCBUUlVFKTsKKyAgICAgIGlmICghY3NyY19zcmMpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAoY3JlYXRlZCkgeworICAgICAgICBHU1RfREVCVUcgKCJjcmVhdGVkIG5ldyBDU1JDOiAlMDh4IiwgY3NyYyk7CisgICAgICAgIHJ0cF9zb3VyY2Vfc2V0X2FzX2NzcmMgKGNzcmNfc3JjKTsKKyAgICAgICAgc291cmNlX3VwZGF0ZV9hY3RpdmUgKHNlc3MsIGNzcmNfc3JjLCBGQUxTRSk7CisgICAgICAgIG9uX25ld19zc3JjIChzZXNzLCBjc3JjX3NyYyk7CisgICAgICB9CisgICAgICBnX29iamVjdF91bnJlZiAoY3NyY19zcmMpOworICAgIH0KKyAgfQorICBnX29iamVjdF91bnJlZiAoc291cmNlKTsKKworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworCisgIGNsZWFuX3BhY2tldF9pbmZvICgmcGluZm8pOworCisgIHJldHVybiByZXN1bHQ7CisKKyAgLyogRVJST1JTICovCitjb2xsaXNpb246CisgIHsKKyAgICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworICAgIGNsZWFuX3BhY2tldF9pbmZvICgmcGluZm8pOworICAgIEdTVF9ERUJVRyAoImlnbm9yaW5nIHBhY2tldCBiZWNhdXNlIGl0cyBjb2xsaXNpb25pbmciKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3J0cF9zZXNzaW9uX3Byb2Nlc3NfcmIgKFJUUFNlc3Npb24gKiBzZXNzLCBSVFBTb3VyY2UgKiBzb3VyY2UsCisgICAgR3N0UlRDUFBhY2tldCAqIHBhY2tldCwgUlRQUGFja2V0SW5mbyAqIHBpbmZvKQoreworICBndWludCBjb3VudCwgaTsKKworICBjb3VudCA9IGdzdF9ydGNwX3BhY2tldF9nZXRfcmJfY291bnQgKHBhY2tldCk7CisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgZ3VpbnQzMiBzc3JjLCBleHRoaWdoZXN0c2VxLCBqaXR0ZXIsIGxzciwgZGxzcjsKKyAgICBndWludDggZnJhY3Rpb25sb3N0OworICAgIGdpbnQzMiBwYWNrZXRzbG9zdDsKKyAgICBSVFBTb3VyY2UgKnNyYzsKKworICAgIGdzdF9ydGNwX3BhY2tldF9nZXRfcmIgKHBhY2tldCwgaSwgJnNzcmMsICZmcmFjdGlvbmxvc3QsCisgICAgICAgICZwYWNrZXRzbG9zdCwgJmV4dGhpZ2hlc3RzZXEsICZqaXR0ZXIsICZsc3IsICZkbHNyKTsKKworICAgIEdTVF9ERUJVRyAoIlJCICVkOiBTU1JDICUwOHgsIGppdHRlciAlIiBHX0dVSU5UMzJfRk9STUFULCBpLCBzc3JjLCBqaXR0ZXIpOworCisgICAgLyogZmluZCBvdXIgb3duIHNvdXJjZSAqLworICAgIHNyYyA9IGZpbmRfc291cmNlIChzZXNzLCBzc3JjKTsKKyAgICBpZiAoc3JjID09IE5VTEwpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChzcmMtPmludGVybmFsICYmIFJUUF9TT1VSQ0VfSVNfQUNUSVZFIChzcmMpKSB7CisgICAgICAvKiBvbmx5IGRlYWwgd2l0aCByZXBvcnQgYmxvY2tzIGZvciBvdXIgc2Vzc2lvbiwgd2UgdXBkYXRlIHRoZSBzdGF0cyBvZgorICAgICAgICogdGhlIHNlbmRlciBvZiB0aGUgUlRDUCBtZXNzYWdlLiBXZSBjb3VsZCBhbHNvIGNvbXBhcmUgb3VyIHN0YXRzIGFnYWluc3QKKyAgICAgICAqIHRoZSBvdGhlciBzZW5kZXIgdG8gc2VlIGlmIHdlIGFyZSBiZXR0ZXIgb3Igd29yc2UuICovCisgICAgICAvKiBGSVhNRSwgbmVlZCB0byBrZWVwIHRyYWNrIHdobyB0aGUgUkIgYmxvY2sgaXMgZnJvbSAqLworICAgICAgcnRwX3NvdXJjZV9wcm9jZXNzX3JiIChzb3VyY2UsIHBpbmZvLT5udHBuc3RpbWUsIGZyYWN0aW9ubG9zdCwKKyAgICAgICAgICBwYWNrZXRzbG9zdCwgZXh0aGlnaGVzdHNlcSwgaml0dGVyLCBsc3IsIGRsc3IpOworICAgIH0KKyAgfQorICBvbl9zc3JjX2FjdGl2ZSAoc2Vzcywgc291cmNlKTsKK30KKworLyogQSBTZW5kZXIgcmVwb3J0IGNvbnRhaW5zIHN0YXRpc3RpY3MgYWJvdXQgaG93IHRoZSBzZW5kZXIgaXMgZG9pbmcuIFRoaXMKKyAqIGluY2x1ZGVzIHRpbWluZyBpbmZvcm1hdGFpb24gc3VjaCBhcyB0aGUgcmVsYXRpb24gYmV0d2VlbiBSVFAgYW5kIE5UUAorICogdGltZXN0YW1wcyBhbmQgdGhlIG51bWJlciBvZiBwYWNrZXRzL2J5dGVzIGl0IHNlbnQgdG8gdXMuCisgKgorICogSW4gdGhpcyByZXBvcnQgaXMgYWxzbyBpbmNsdWRlZCBhIHNldCBvZiByZXBvcnQgYmxvY2tzIHJlbGF0ZWQgdG8gaG93IHRoaXMKKyAqIHNlbmRlciBpcyByZWNlaXZpbmcgZGF0YSAoaW4gY2FzZSB3ZSAob3Igc29tZWJvZHkgZWxzZSkgaXMgYWxzbyBzZW5kaW5nIHN0dWZmCisgKiB0byBpdCkuIFRoaXMgaW5mbyBpbmNsdWRlcyB0aGUgcGFja2V0IGxvc3MsIGppdHRlciBhbmQgc2VxbnVtLiBJdCBhbHNvCisgKiBjb250YWlucyBpbmZvcm1hdGlvbiB0byBjYWxjdWxhdGUgdGhlIHJvdW5kIHRyaXAgdGltZSAoTFNSL0RMU1IpLgorICovCitzdGF0aWMgdm9pZAorcnRwX3Nlc3Npb25fcHJvY2Vzc19zciAoUlRQU2Vzc2lvbiAqIHNlc3MsIEdzdFJUQ1BQYWNrZXQgKiBwYWNrZXQsCisgICAgUlRQUGFja2V0SW5mbyAqIHBpbmZvLCBnYm9vbGVhbiAqIGRvX3N5bmMpCit7CisgIGd1aW50MzIgc2VuZGVyc3NyYywgcnRwdGltZSwgcGFja2V0X2NvdW50LCBvY3RldF9jb3VudDsKKyAgZ3VpbnQ2NCBudHB0aW1lOworICBSVFBTb3VyY2UgKnNvdXJjZTsKKyAgZ2Jvb2xlYW4gY3JlYXRlZCwgcHJldnNlbmRlcjsKKworICBnc3RfcnRjcF9wYWNrZXRfc3JfZ2V0X3NlbmRlcl9pbmZvIChwYWNrZXQsICZzZW5kZXJzc3JjLCAmbnRwdGltZSwgJnJ0cHRpbWUsCisgICAgICAmcGFja2V0X2NvdW50LCAmb2N0ZXRfY291bnQpOworCisgIEdTVF9ERUJVRyAoImdvdCBTUiBwYWNrZXQ6IFNTUkMgJTA4eCwgdGltZSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBzZW5kZXJzc3JjLCBHU1RfVElNRV9BUkdTIChwaW5mby0+Y3VycmVudF90aW1lKSk7CisKKyAgc291cmNlID0gb2J0YWluX3NvdXJjZSAoc2Vzcywgc2VuZGVyc3NyYywgJmNyZWF0ZWQsIHBpbmZvLCBGQUxTRSk7CisgIGlmICghc291cmNlKQorICAgIHJldHVybjsKKworICAvKiBza2lwIG5vbi1ieWUgcGFja2V0cyBmb3Igc291cmNlcyB0aGF0IGFyZSBtYXJrZWQgQllFICovCisgIGlmIChzZXNzLT5zY2hlZHVsZWRfYnllICYmIFJUUF9TT1VSQ0VfSVNfTUFSS0VEX0JZRSAoc291cmNlKSkKKyAgICBnb3RvIG91dDsKKworICAvKiBkb24ndCB0cnkgdG8gZG8gbGlwLXN5bmMgZm9yIHNvdXJjZXMgdGhhdCBzZW50IGEgQllFICovCisgIGlmIChSVFBfU09VUkNFX0lTX01BUktFRF9CWUUgKHNvdXJjZSkpCisgICAgKmRvX3N5bmMgPSBGQUxTRTsKKyAgZWxzZQorICAgICpkb19zeW5jID0gVFJVRTsKKworICBwcmV2c2VuZGVyID0gUlRQX1NPVVJDRV9JU19TRU5ERVIgKHNvdXJjZSk7CisKKyAgLyogZmlyc3QgdXBkYXRlIHRoZSBzb3VyY2UgKi8KKyAgcnRwX3NvdXJjZV9wcm9jZXNzX3NyIChzb3VyY2UsIHBpbmZvLT5jdXJyZW50X3RpbWUsIG50cHRpbWUsIHJ0cHRpbWUsCisgICAgICBwYWNrZXRfY291bnQsIG9jdGV0X2NvdW50KTsKKworICBzb3VyY2VfdXBkYXRlX3NlbmRlciAoc2Vzcywgc291cmNlLCBwcmV2c2VuZGVyKTsKKworICBpZiAoY3JlYXRlZCkKKyAgICBvbl9uZXdfc3NyYyAoc2Vzcywgc291cmNlKTsKKworICBydHBfc2Vzc2lvbl9wcm9jZXNzX3JiIChzZXNzLCBzb3VyY2UsIHBhY2tldCwgcGluZm8pOworCitvdXQ6CisgIGdfb2JqZWN0X3VucmVmIChzb3VyY2UpOworfQorCisvKiBBIHJlY2VpdmVyIHJlcG9ydCBjb250YWlucyBzdGF0aXN0aWNzIGFib3V0IGhvdyBhIHJlY2VpdmVyIGlzIGRvaW5nLiBJdAorICogaW5jbHVkZXMgc3R1ZmYgbGlrZSBwYWNrZXQgbG9zcywgaml0dGVyIGFuZCB0aGUgc2VxbnVtIGl0IHJlY2VpdmVkIGxhc3QuIEl0CisgKiBhbHNvIGNvbnRhaW5zIGluZm8gdG8gY2FsY3VsYXRlIHRoZSByb3VuZCB0cmlwIHRpbWUuCisgKgorICogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBob3cgdGhlIHNlbmRlciBvZiB0aGlzIHJlcG9ydCBpcyBkb2luZyB3cnQgdG8gdXMuCisgKi8KK3N0YXRpYyB2b2lkCitydHBfc2Vzc2lvbl9wcm9jZXNzX3JyIChSVFBTZXNzaW9uICogc2VzcywgR3N0UlRDUFBhY2tldCAqIHBhY2tldCwKKyAgICBSVFBQYWNrZXRJbmZvICogcGluZm8pCit7CisgIGd1aW50MzIgc2VuZGVyc3NyYzsKKyAgUlRQU291cmNlICpzb3VyY2U7CisgIGdib29sZWFuIGNyZWF0ZWQ7CisKKyAgc2VuZGVyc3NyYyA9IGdzdF9ydGNwX3BhY2tldF9ycl9nZXRfc3NyYyAocGFja2V0KTsKKworICBHU1RfREVCVUcgKCJnb3QgUlIgcGFja2V0OiBTU1JDICUwOHgiLCBzZW5kZXJzc3JjKTsKKworICBzb3VyY2UgPSBvYnRhaW5fc291cmNlIChzZXNzLCBzZW5kZXJzc3JjLCAmY3JlYXRlZCwgcGluZm8sIEZBTFNFKTsKKyAgaWYgKCFzb3VyY2UpCisgICAgcmV0dXJuOworCisgIC8qIHNraXAgbm9uLWJ5ZSBwYWNrZXRzIGZvciBzb3VyY2VzIHRoYXQgYXJlIG1hcmtlZCBCWUUgKi8KKyAgaWYgKHNlc3MtPnNjaGVkdWxlZF9ieWUgJiYgUlRQX1NPVVJDRV9JU19NQVJLRURfQllFIChzb3VyY2UpKQorICAgIGdvdG8gb3V0OworCisgIGlmIChjcmVhdGVkKQorICAgIG9uX25ld19zc3JjIChzZXNzLCBzb3VyY2UpOworCisgIHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcmIgKHNlc3MsIHNvdXJjZSwgcGFja2V0LCBwaW5mbyk7CisKK291dDoKKyAgZ19vYmplY3RfdW5yZWYgKHNvdXJjZSk7Cit9CisKKy8qIEdldCBTREVTIGl0ZW1zIGFuZCBzdG9yZSB0aGVtIGluIHRoZSBTU1JDICovCitzdGF0aWMgdm9pZAorcnRwX3Nlc3Npb25fcHJvY2Vzc19zZGVzIChSVFBTZXNzaW9uICogc2VzcywgR3N0UlRDUFBhY2tldCAqIHBhY2tldCwKKyAgICBSVFBQYWNrZXRJbmZvICogcGluZm8pCit7CisgIGd1aW50IGl0ZW1zLCBpLCBqOworICBnYm9vbGVhbiBtb3JlX2l0ZW1zLCBtb3JlX2VudHJpZXM7CisKKyAgaXRlbXMgPSBnc3RfcnRjcF9wYWNrZXRfc2Rlc19nZXRfaXRlbV9jb3VudCAocGFja2V0KTsKKyAgR1NUX0RFQlVHICgiZ290IFNERVMgcGFja2V0IHdpdGggJWQgaXRlbXMiLCBpdGVtcyk7CisKKyAgbW9yZV9pdGVtcyA9IGdzdF9ydGNwX3BhY2tldF9zZGVzX2ZpcnN0X2l0ZW0gKHBhY2tldCk7CisgIGkgPSAwOworICB3aGlsZSAobW9yZV9pdGVtcykgeworICAgIGd1aW50MzIgc3NyYzsKKyAgICBnYm9vbGVhbiBjaGFuZ2VkLCBjcmVhdGVkLCBwcmV2YWN0aXZlOworICAgIFJUUFNvdXJjZSAqc291cmNlOworICAgIEdzdFN0cnVjdHVyZSAqc2RlczsKKworICAgIHNzcmMgPSBnc3RfcnRjcF9wYWNrZXRfc2Rlc19nZXRfc3NyYyAocGFja2V0KTsKKworICAgIEdTVF9ERUJVRyAoIml0ZW0gJWQsIFNTUkMgJTA4eCIsIGksIHNzcmMpOworCisgICAgY2hhbmdlZCA9IEZBTFNFOworCisgICAgLyogZmluZCBzcmMsIG5vIHByb2JhdGlvbiB3aGVuIGRlYWxpbmcgd2l0aCBSVENQICovCisgICAgc291cmNlID0gb2J0YWluX3NvdXJjZSAoc2Vzcywgc3NyYywgJmNyZWF0ZWQsIHBpbmZvLCBGQUxTRSk7CisgICAgaWYgKCFzb3VyY2UpCisgICAgICByZXR1cm47CisKKyAgICAvKiBza2lwIG5vbi1ieWUgcGFja2V0cyBmb3Igc291cmNlcyB0aGF0IGFyZSBtYXJrZWQgQllFICovCisgICAgaWYgKHNlc3MtPnNjaGVkdWxlZF9ieWUgJiYgUlRQX1NPVVJDRV9JU19NQVJLRURfQllFIChzb3VyY2UpKQorICAgICAgZ290byBuZXh0OworCisgICAgc2RlcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5ICgiYXBwbGljYXRpb24veC1ydHAtc291cmNlLXNkZXMiKTsKKworICAgIG1vcmVfZW50cmllcyA9IGdzdF9ydGNwX3BhY2tldF9zZGVzX2ZpcnN0X2VudHJ5IChwYWNrZXQpOworICAgIGogPSAwOworICAgIHdoaWxlIChtb3JlX2VudHJpZXMpIHsKKyAgICAgIEdzdFJUQ1BTREVTVHlwZSB0eXBlOworICAgICAgZ3VpbnQ4IGxlbjsKKyAgICAgIGd1aW50OCAqZGF0YTsKKyAgICAgIGdjaGFyICpuYW1lOworICAgICAgZ2NoYXIgKnZhbHVlOworCisgICAgICBnc3RfcnRjcF9wYWNrZXRfc2Rlc19nZXRfZW50cnkgKHBhY2tldCwgJnR5cGUsICZsZW4sICZkYXRhKTsKKworICAgICAgR1NUX0RFQlVHICgiZW50cnkgJWQsIHR5cGUgJWQsIGxlbiAlZCwgZGF0YSAlLipzIiwgaiwgdHlwZSwgbGVuLCBsZW4sCisgICAgICAgICAgZGF0YSk7CisKKyAgICAgIGlmICh0eXBlID09IEdTVF9SVENQX1NERVNfUFJJVikgeworICAgICAgICBuYW1lID0gZ19zdHJuZHVwICgoY29uc3QgZ2NoYXIgKikgJmRhdGFbMV0sIGRhdGFbMF0pOworICAgICAgICBsZW4gLT0gZGF0YVswXSArIDE7CisgICAgICAgIGRhdGEgKz0gZGF0YVswXSArIDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBuYW1lID0gZ19zdHJkdXAgKGdzdF9ydGNwX3NkZXNfdHlwZV90b19uYW1lICh0eXBlKSk7CisgICAgICB9CisKKyAgICAgIHZhbHVlID0gZ19zdHJuZHVwICgoY29uc3QgZ2NoYXIgKikgZGF0YSwgbGVuKTsKKworICAgICAgaWYgKGdfdXRmOF92YWxpZGF0ZSAodmFsdWUsIC0xLCBOVUxMKSkgeworICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoc2RlcywgbmFtZSwgR19UWVBFX1NUUklORywgdmFsdWUsIE5VTEwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJpZ25vcmUgU0RFUyBmaWVsZCAlcyB3aXRoIG5vbi11dGY4IGRhdGEgJXMiLCBuYW1lLCB2YWx1ZSk7CisgICAgICB9CisKKyAgICAgIGdfZnJlZSAobmFtZSk7CisgICAgICBnX2ZyZWUgKHZhbHVlKTsKKworICAgICAgbW9yZV9lbnRyaWVzID0gZ3N0X3J0Y3BfcGFja2V0X3NkZXNfbmV4dF9lbnRyeSAocGFja2V0KTsKKyAgICAgIGorKzsKKyAgICB9CisKKyAgICAvKiB0YWtlcyBvd25lcnNoaXAgb2Ygc2RlcyAqLworICAgIGNoYW5nZWQgPSBydHBfc291cmNlX3NldF9zZGVzX3N0cnVjdCAoc291cmNlLCBzZGVzKTsKKworICAgIHByZXZhY3RpdmUgPSBSVFBfU09VUkNFX0lTX0FDVElWRSAoc291cmNlKTsKKyAgICBzb3VyY2UtPnZhbGlkYXRlZCA9IFRSVUU7CisKKyAgICBpZiAoY3JlYXRlZCkKKyAgICAgIG9uX25ld19zc3JjIChzZXNzLCBzb3VyY2UpOworCisgICAgLyogc291cmNlIGJlY2FtZSBhY3RpdmUgKi8KKyAgICBpZiAoc291cmNlX3VwZGF0ZV9hY3RpdmUgKHNlc3MsIHNvdXJjZSwgcHJldmFjdGl2ZSkpCisgICAgICBvbl9zc3JjX3ZhbGlkYXRlZCAoc2Vzcywgc291cmNlKTsKKworICAgIGlmIChjaGFuZ2VkKQorICAgICAgb25fc3NyY19zZGVzIChzZXNzLCBzb3VyY2UpOworCisgIG5leHQ6CisgICAgZ19vYmplY3RfdW5yZWYgKHNvdXJjZSk7CisKKyAgICBtb3JlX2l0ZW1zID0gZ3N0X3J0Y3BfcGFja2V0X3NkZXNfbmV4dF9pdGVtIChwYWNrZXQpOworICAgIGkrKzsKKyAgfQorfQorCisvKiBCWUUgaXMgc2VudCB3aGVuIGEgY2xpZW50IGxlYXZlcyB0aGUgc2Vzc2lvbgorICovCitzdGF0aWMgdm9pZAorcnRwX3Nlc3Npb25fcHJvY2Vzc19ieWUgKFJUUFNlc3Npb24gKiBzZXNzLCBHc3RSVENQUGFja2V0ICogcGFja2V0LAorICAgIFJUUFBhY2tldEluZm8gKiBwaW5mbykKK3sKKyAgZ3VpbnQgY291bnQsIGk7CisgIGdjaGFyICpyZWFzb247CisgIGdib29sZWFuIHJlY29uc2lkZXIgPSBGQUxTRTsKKworICByZWFzb24gPSBnc3RfcnRjcF9wYWNrZXRfYnllX2dldF9yZWFzb24gKHBhY2tldCk7CisgIEdTVF9ERUJVRyAoImdvdCBCWUUgcGFja2V0IChyZWFzb246ICVzKSIsIEdTVF9TVFJfTlVMTCAocmVhc29uKSk7CisKKyAgY291bnQgPSBnc3RfcnRjcF9wYWNrZXRfYnllX2dldF9zc3JjX2NvdW50IChwYWNrZXQpOworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIGd1aW50MzIgc3NyYzsKKyAgICBSVFBTb3VyY2UgKnNvdXJjZTsKKyAgICBnYm9vbGVhbiBwcmV2YWN0aXZlLCBwcmV2c2VuZGVyOworICAgIGd1aW50IHBtZW1iZXJzLCBtZW1iZXJzOworCisgICAgc3NyYyA9IGdzdF9ydGNwX3BhY2tldF9ieWVfZ2V0X250aF9zc3JjIChwYWNrZXQsIGkpOworICAgIEdTVF9ERUJVRyAoIlNTUkM6ICUwOHgiLCBzc3JjKTsKKworICAgIC8qIGZpbmQgc3JjIGFuZCBtYXJrIGJ5ZSwgbm8gcHJvYmF0aW9uIHdoZW4gZGVhbGluZyB3aXRoIFJUQ1AgKi8KKyAgICBzb3VyY2UgPSBmaW5kX3NvdXJjZSAoc2Vzcywgc3NyYyk7CisgICAgaWYgKCFzb3VyY2UgfHwgc291cmNlLT5pbnRlcm5hbCkgeworICAgICAgR1NUX0RFQlVHICgiSWdub3Jpbmcgc3VzcGljaW91cyBCWUUgcGFja2V0IChyZWFzb246ICVzKSIsCisgICAgICAgICAgIXNvdXJjZSA/ICJjYW4ndCBmaW5kIHNvdXJjZSIgOiAiaGFzIGludGVybmFsIHNvdXJjZSBTU1JDIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBzdG9yZSB0aW1lIGZvciB3aGVuIHdlIG5lZWQgdG8gdGltZSBvdXQgdGhpcyBzb3VyY2UgKi8KKyAgICBzb3VyY2UtPmJ5ZV90aW1lID0gcGluZm8tPmN1cnJlbnRfdGltZTsKKworICAgIHByZXZhY3RpdmUgPSBSVFBfU09VUkNFX0lTX0FDVElWRSAoc291cmNlKTsKKyAgICBwcmV2c2VuZGVyID0gUlRQX1NPVVJDRV9JU19TRU5ERVIgKHNvdXJjZSk7CisKKyAgICAvKiBtYXJrIHRoZSBzb3VyY2UgQllFICovCisgICAgcnRwX3NvdXJjZV9tYXJrX2J5ZSAoc291cmNlLCByZWFzb24pOworCisgICAgcG1lbWJlcnMgPSBzZXNzLT5zdGF0cy5hY3RpdmVfc291cmNlczsKKworICAgIHNvdXJjZV91cGRhdGVfYWN0aXZlIChzZXNzLCBzb3VyY2UsIHByZXZhY3RpdmUpOworICAgIHNvdXJjZV91cGRhdGVfc2VuZGVyIChzZXNzLCBzb3VyY2UsIHByZXZzZW5kZXIpOworCisgICAgbWVtYmVycyA9IHNlc3MtPnN0YXRzLmFjdGl2ZV9zb3VyY2VzOworCisgICAgaWYgKCFzZXNzLT5zY2hlZHVsZWRfYnllICYmIG1lbWJlcnMgPCBwbWVtYmVycykgeworICAgICAgLyogc29tZSBtZW1iZXJzIHdlbnQgYXdheSBzaW5jZSB0aGUgcHJldmlvdXMgdGltZW91dCBlc3RpbWF0ZS4KKyAgICAgICAqIFBlcmZvcm0gcmV2ZXJzZSByZWNvbnNpZGVyYXRpb24gYnV0IG9ubHkgd2hlbiB3ZSBhcmUgbm90IHNjaGVkdWxpbmcgYQorICAgICAgICogQllFIG91cnNlbHZlcy4gKi8KKyAgICAgIGlmIChzZXNzLT5uZXh0X3J0Y3BfY2hlY2tfdGltZSAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FICYmCisgICAgICAgICAgcGluZm8tPmN1cnJlbnRfdGltZSA8IHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lKSB7CisgICAgICAgIEdzdENsb2NrVGltZSB0aW1lX3JlbWFpbmluZzsKKworICAgICAgICAvKiBTY2FsZSBvdXIgbmV4dCBSVENQIGNoZWNrIHRpbWUgYWNjb3JkaW5nIHRvIHRoZSBjaGFuZ2Ugb2YgbnVtYmVycworICAgICAgICAgKiBvZiBtZW1iZXJzLiBCdXQgb25seSBpZiBhKSB0aGlzIGlzIHRoZSBmaXJzdCBSVENQLCBvciBiKSB0aGlzIGlzIG5vdAorICAgICAgICAgKiBhIGZlZWRiYWNrIHNlc3Npb24sIG9yIGMpIHRoaXMgaXMgYSBmZWVkYmFjayBzZXNzaW9uIGJ1dCB3ZSBzY2hlZHVsZQorICAgICAgICAgKiBmb3IgZXZlcnkgUlRDUCBpbnRlcnZhbCAoYWthIG5vIHQtcnItaW50ZXJ2YWwgc2V0KS4KKyAgICAgICAgICoKKyAgICAgICAgICogRklYTUU6IGEpIGFuZCBiKSBhcmUgbm90IGdyZWF0IGFzIHdlIHdpbGwgcG9zc2libHkgZ28gYmVsb3cgVG1pbgorICAgICAgICAgKiBmb3Igbm9uLWZlZWRiYWNrIHByb2ZpbGVzIGFuZCBpbiBjYXNlIG9mIGEpIGJlbG93CisgICAgICAgICAqIFRtaW4vdC1yci1pbnRlcnZhbCBpbiBhbnkgY2FzZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzZXNzLT5sYXN0X3J0Y3Bfc2VuZF90aW1lID09IEdTVF9DTE9DS19USU1FX05PTkUgfHwKKyAgICAgICAgICAgICEoc2Vzcy0+cnRwX3Byb2ZpbGUgPT0gR1NUX1JUUF9QUk9GSUxFX0FWUEYKKyAgICAgICAgICAgICAgICB8fCBzZXNzLT5ydHBfcHJvZmlsZSA9PSBHU1RfUlRQX1BST0ZJTEVfU0FWUEYpIHx8CisgICAgICAgICAgICBzZXNzLT5uZXh0X3J0Y3BfY2hlY2tfdGltZSAtIHNlc3MtPmxhc3RfcnRjcF9zZW5kX3RpbWUgPT0KKyAgICAgICAgICAgIHNlc3MtPmxhc3RfcnRjcF9pbnRlcnZhbCkgeworICAgICAgICAgIHRpbWVfcmVtYWluaW5nID0gc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWUgLSBwaW5mby0+Y3VycmVudF90aW1lOworICAgICAgICAgIHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lID0KKyAgICAgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlICh0aW1lX3JlbWFpbmluZywgbWVtYmVycywgcG1lbWJlcnMpOworICAgICAgICAgIHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lICs9IHBpbmZvLT5jdXJyZW50X3RpbWU7CisgICAgICAgIH0KKyAgICAgICAgc2Vzcy0+bGFzdF9ydGNwX2ludGVydmFsID0KKyAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoc2Vzcy0+bGFzdF9ydGNwX2ludGVydmFsLCBtZW1iZXJzLCBwbWVtYmVycyk7CisKKyAgICAgICAgR1NUX0RFQlVHICgicmV2ZXJzZSByZWNvbnNpZGVyYXRpb24gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWUpKTsKKworICAgICAgICAvKiBtYXJrIHBlbmRpbmcgcmVjb25zaWRlci4gV2Ugb25seSB3YW50IHRvIHNpZ25hbCB0aGUgcmVjb25zaWRlcmF0aW9uCisgICAgICAgICAqIG9uY2UgYWZ0ZXIgd2UgaGFuZGxlZCBhbGwgdGhlIHNvdXJjZSBpbiB0aGUgYnllIHBhY2tldCAqLworICAgICAgICByZWNvbnNpZGVyID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvbl9ieWVfc3NyYyAoc2Vzcywgc291cmNlKTsKKyAgfQorICBpZiAocmVjb25zaWRlcikgeworICAgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisgICAgLyogbm90aWZ5IGFwcCBvZiByZWNvbnNpZGVyYXRpb24gKi8KKyAgICBpZiAoc2Vzcy0+Y2FsbGJhY2tzLnJlY29uc2lkZXIpCisgICAgICBzZXNzLT5jYWxsYmFja3MucmVjb25zaWRlciAoc2Vzcywgc2Vzcy0+cmVjb25zaWRlcl91c2VyX2RhdGEpOworICAgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICB9CisKKyAgZ19mcmVlIChyZWFzb24pOworfQorCitzdGF0aWMgdm9pZAorcnRwX3Nlc3Npb25fcHJvY2Vzc19hcHAgKFJUUFNlc3Npb24gKiBzZXNzLCBHc3RSVENQUGFja2V0ICogcGFja2V0LAorICAgIFJUUFBhY2tldEluZm8gKiBwaW5mbykKK3sKKyAgR1NUX0RFQlVHICgicmVjZWl2ZWQgQVBQIik7CisKKyAgaWYgKGdfc2lnbmFsX2hhc19oYW5kbGVyX3BlbmRpbmcgKHNlc3MsCisgICAgICAgICAgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fQVBQX1JUQ1BdLCAwLCBUUlVFKSkgeworICAgIEdzdEJ1ZmZlciAqZGF0YV9idWZmZXIgPSBOVUxMOworICAgIGd1aW50MTYgZGF0YV9sZW5ndGg7CisgICAgZ2NoYXIgbmFtZVs1XTsKKworICAgIGRhdGFfbGVuZ3RoID0gZ3N0X3J0Y3BfcGFja2V0X2FwcF9nZXRfZGF0YV9sZW5ndGggKHBhY2tldCkgKiA0OworICAgIGlmIChkYXRhX2xlbmd0aCA+IDApIHsKKyAgICAgIGd1aW50OCAqZGF0YSA9IGdzdF9ydGNwX3BhY2tldF9hcHBfZ2V0X2RhdGEgKHBhY2tldCk7CisgICAgICBkYXRhX2J1ZmZlciA9IGdzdF9idWZmZXJfY29weV9yZWdpb24gKHBhY2tldC0+cnRjcC0+YnVmZmVyLAorICAgICAgICAgIEdTVF9CVUZGRVJfQ09QWV9NRU1PUlksIGRhdGEgLSBwYWNrZXQtPnJ0Y3AtPm1hcC5kYXRhLCBkYXRhX2xlbmd0aCk7CisgICAgICBHU1RfQlVGRkVSX1BUUyAoZGF0YV9idWZmZXIpID0gcGluZm8tPnJ1bm5pbmdfdGltZTsKKyAgICB9CisKKyAgICBtZW1jcHkgKG5hbWUsIGdzdF9ydGNwX3BhY2tldF9hcHBfZ2V0X25hbWUgKHBhY2tldCksIDQpOworICAgIG5hbWVbNF0gPSAnXDAnOworCisgICAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgICBnX3NpZ25hbF9lbWl0IChzZXNzLCBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9BUFBfUlRDUF0sIDAsCisgICAgICAgIGdzdF9ydGNwX3BhY2tldF9hcHBfZ2V0X3N1YnR5cGUgKHBhY2tldCksCisgICAgICAgIGdzdF9ydGNwX3BhY2tldF9hcHBfZ2V0X3NzcmMgKHBhY2tldCksIG5hbWUsIGRhdGFfYnVmZmVyKTsKKyAgICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKworICAgIGlmIChkYXRhX2J1ZmZlcikKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGRhdGFfYnVmZmVyKTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3J0cF9zZXNzaW9uX3JlcXVlc3RfbG9jYWxfa2V5X3VuaXQgKFJUUFNlc3Npb24gKiBzZXNzLCBSVFBTb3VyY2UgKiBzcmMsCisgICAgZ3VpbnQzMiBtZWRpYV9zc3JjLCBnYm9vbGVhbiBmaXIsIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUpCit7CisgIGd1aW50MzIgcm91bmRfdHJpcCA9IDA7CisKKyAgcnRwX3NvdXJjZV9nZXRfbGFzdF9yYiAoc3JjLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAmcm91bmRfdHJpcCk7CisKKyAgaWYgKHNyYy0+bGFzdF9rZXlmcmFtZV9yZXF1ZXN0ICE9IEdTVF9DTE9DS19USU1FX05PTkUgJiYgcm91bmRfdHJpcCkgeworICAgIEdzdENsb2NrVGltZSByb3VuZF90cmlwX2luX25zID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChyb3VuZF90cmlwLAorICAgICAgICBHU1RfU0VDT05ELCA2NTUzNik7CisKKyAgICAvKiBTYW5pdHkgY2hlY2sgdG8gYXZvaWQgYWx3YXlzIGlnbm9yaW5nIFBMSS9GSVIgaWYgd2UgcmVjZWl2ZSBSVENQCisgICAgICogcGFja2V0cyB3aXRoIGVycm9uZW91cyB2YWx1ZXMgcmVzdWx0aW5nIGluIGNyYXp5IGhpZ2ggUlRULiAqLworICAgIGlmIChyb3VuZF90cmlwX2luX25zID4gNSAqIEdTVF9TRUNPTkQpCisgICAgICByb3VuZF90cmlwX2luX25zID0gR1NUX1NFQ09ORCAvIDI7CisKKyAgICBpZiAoY3VycmVudF90aW1lIC0gc3JjLT5sYXN0X2tleWZyYW1lX3JlcXVlc3QgPCAyICogcm91bmRfdHJpcF9pbl9ucykgeworICAgICAgR1NUX0RFQlVHICgiSWdub3JpbmcgJXMgcmVxdWVzdCBmcm9tICVYIGJlY2F1c2Ugb25lIHdhcyBzZW5kIHdpdGhvdXQgb25lICIKKyAgICAgICAgICAiUlRUICglIiBHU1RfVElNRV9GT1JNQVQgIiA8ICUiIEdTVF9USU1FX0ZPUk1BVCAiKSIsCisgICAgICAgICAgZmlyID8gIkZJUiIgOiAiUExJIiwgcnRwX3NvdXJjZV9nZXRfc3NyYyAoc3JjKSwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChjdXJyZW50X3RpbWUgLSBzcmMtPmxhc3Rfa2V5ZnJhbWVfcmVxdWVzdCksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocm91bmRfdHJpcF9pbl9ucykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorCisgIHNyYy0+bGFzdF9rZXlmcmFtZV9yZXF1ZXN0ID0gY3VycmVudF90aW1lOworCisgIEdTVF9MT0cgKCJyZWNlaXZlZCAlcyByZXF1ZXN0IGZyb20gJVggYWJvdXQgJVggJXAoJXApIiwgZmlyID8gIkZJUiIgOiAiUExJIiwKKyAgICAgIHJ0cF9zb3VyY2VfZ2V0X3NzcmMgKHNyYyksIG1lZGlhX3NzcmMsIHNlc3MtPmNhbGxiYWNrcy5wcm9jZXNzX3J0cCwKKyAgICAgIHNlc3MtPmNhbGxiYWNrcy5yZXF1ZXN0X2tleV91bml0KTsKKworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworICBzZXNzLT5jYWxsYmFja3MucmVxdWVzdF9rZXlfdW5pdCAoc2VzcywgbWVkaWFfc3NyYywgZmlyLAorICAgICAgc2Vzcy0+cmVxdWVzdF9rZXlfdW5pdF91c2VyX2RhdGEpOworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3J0cF9zZXNzaW9uX3Byb2Nlc3NfcGxpIChSVFBTZXNzaW9uICogc2VzcywgZ3VpbnQzMiBzZW5kZXJfc3NyYywKKyAgICBndWludDMyIG1lZGlhX3NzcmMsIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUpCit7CisgIFJUUFNvdXJjZSAqc3JjOworCisgIGlmICghc2Vzcy0+Y2FsbGJhY2tzLnJlcXVlc3Rfa2V5X3VuaXQpCisgICAgcmV0dXJuOworCisgIHNyYyA9IGZpbmRfc291cmNlIChzZXNzLCBzZW5kZXJfc3NyYyk7CisgIGlmIChzcmMgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgcnRwX3Nlc3Npb25fcmVxdWVzdF9sb2NhbF9rZXlfdW5pdCAoc2Vzcywgc3JjLCBtZWRpYV9zc3JjLCBGQUxTRSwKKyAgICAgIGN1cnJlbnRfdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkCitydHBfc2Vzc2lvbl9wcm9jZXNzX2ZpciAoUlRQU2Vzc2lvbiAqIHNlc3MsIGd1aW50MzIgc2VuZGVyX3NzcmMsCisgICAgZ3VpbnQzMiBtZWRpYV9zc3JjLCBndWludDggKiBmY2lfZGF0YSwgZ3VpbnQgZmNpX2xlbmd0aCwKKyAgICBHc3RDbG9ja1RpbWUgY3VycmVudF90aW1lKQoreworICBSVFBTb3VyY2UgKnNyYzsKKyAgZ3VpbnQzMiBzc3JjOworICBndWludCBwb3NpdGlvbiA9IDA7CisgIGdib29sZWFuIG91cl9yZXF1ZXN0ID0gRkFMU0U7CisKKyAgaWYgKCFzZXNzLT5jYWxsYmFja3MucmVxdWVzdF9rZXlfdW5pdCkKKyAgICByZXR1cm47CisKKyAgaWYgKGZjaV9sZW5ndGggPCA4KQorICAgIHJldHVybjsKKworICBzcmMgPSBmaW5kX3NvdXJjZSAoc2Vzcywgc2VuZGVyX3NzcmMpOworCisgIC8qIEhhY2sgYmVjYXVzZSBHb29nbGUgZmFpbHMgdG8gc2V0IHRoZSBzZW5kZXJfc3NyYyBjb3JyZWN0bHkgKi8KKyAgaWYgKCFzcmMgJiYgc2VuZGVyX3NzcmMgPT0gMSkgeworICAgIEdIYXNoVGFibGVJdGVyIGl0ZXI7CisKKyAgICAvKiB3ZSBjYW4ndCBmaW5kIHRoZSBzb3VyY2UgaWYgdGhlcmUgYXJlIG11bHRpcGxlICovCisgICAgaWYgKHNlc3MtPnN0YXRzLnNlbmRlcl9zb3VyY2VzID4gc2Vzcy0+c3RhdHMuaW50ZXJuYWxfc2VuZGVyX3NvdXJjZXMgKyAxKQorICAgICAgcmV0dXJuOworCisgICAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJml0ZXIsIHNlc3MtPnNzcmNzW3Nlc3MtPm1hc2tfaWR4XSk7CisgICAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZpdGVyLCBOVUxMLCAoZ3BvaW50ZXIgKikgJiBzcmMpKSB7CisgICAgICBpZiAoIXNyYy0+aW50ZXJuYWwgJiYgcnRwX3NvdXJjZV9pc19zZW5kZXIgKHNyYykpCisgICAgICAgIGJyZWFrOworICAgICAgc3JjID0gTlVMTDsKKyAgICB9CisgIH0KKyAgaWYgKCFzcmMpCisgICAgcmV0dXJuOworCisgIGZvciAocG9zaXRpb24gPSAwOyBwb3NpdGlvbiA8IGZjaV9sZW5ndGg7IHBvc2l0aW9uICs9IDgpIHsKKyAgICBndWludDggKmRhdGEgPSBmY2lfZGF0YSArIHBvc2l0aW9uOworICAgIFJUUFNvdXJjZSAqb3duOworCisgICAgc3NyYyA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoZGF0YSk7CisKKyAgICBvd24gPSBmaW5kX3NvdXJjZSAoc2Vzcywgc3NyYyk7CisgICAgaWYgKG93biA9PSBOVUxMKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAob3duLT5pbnRlcm5hbCkgeworICAgICAgb3VyX3JlcXVlc3QgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmICghb3VyX3JlcXVlc3QpCisgICAgcmV0dXJuOworCisgIHJ0cF9zZXNzaW9uX3JlcXVlc3RfbG9jYWxfa2V5X3VuaXQgKHNlc3MsIHNyYywgbWVkaWFfc3NyYywgVFJVRSwKKyAgICAgIGN1cnJlbnRfdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkCitydHBfc2Vzc2lvbl9wcm9jZXNzX25hY2sgKFJUUFNlc3Npb24gKiBzZXNzLCBndWludDMyIHNlbmRlcl9zc3JjLAorICAgIGd1aW50MzIgbWVkaWFfc3NyYywgZ3VpbnQ4ICogZmNpX2RhdGEsIGd1aW50IGZjaV9sZW5ndGgsCisgICAgR3N0Q2xvY2tUaW1lIGN1cnJlbnRfdGltZSkKK3sKKyAgc2Vzcy0+c3RhdHMubmFja3NfcmVjZWl2ZWQrKzsKKworICBpZiAoIXNlc3MtPmNhbGxiYWNrcy5ub3RpZnlfbmFjaykKKyAgICByZXR1cm47CisKKyAgd2hpbGUgKGZjaV9sZW5ndGggPiAwKSB7CisgICAgZ3VpbnQxNiBzZXFudW0sIGJscDsKKworICAgIHNlcW51bSA9IEdTVF9SRUFEX1VJTlQxNl9CRSAoZmNpX2RhdGEpOworICAgIGJscCA9IEdTVF9SRUFEX1VJTlQxNl9CRSAoZmNpX2RhdGEgKyAyKTsKKworICAgIEdTVF9ERUJVRyAoIk5BQ0sgIyV1LCBibHAgJTA0eCwgU1NSQyAweCUwOHgiLCBzZXFudW0sIGJscCwgbWVkaWFfc3NyYyk7CisKKyAgICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworICAgIHNlc3MtPmNhbGxiYWNrcy5ub3RpZnlfbmFjayAoc2Vzcywgc2VxbnVtLCBibHAsIG1lZGlhX3NzcmMsCisgICAgICAgIHNlc3MtPm5vdGlmeV9uYWNrX3VzZXJfZGF0YSk7CisgICAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisKKyAgICBmY2lfZGF0YSArPSA0OworICAgIGZjaV9sZW5ndGggLT0gNDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorcnRwX3Nlc3Npb25fcHJvY2Vzc19mZWVkYmFjayAoUlRQU2Vzc2lvbiAqIHNlc3MsIEdzdFJUQ1BQYWNrZXQgKiBwYWNrZXQsCisgICAgUlRQUGFja2V0SW5mbyAqIHBpbmZvLCBHc3RDbG9ja1RpbWUgY3VycmVudF90aW1lKQoreworICBHc3RSVENQVHlwZSB0eXBlOworICBHc3RSVENQRkJUeXBlIGZidHlwZTsKKyAgZ3VpbnQzMiBzZW5kZXJfc3NyYywgbWVkaWFfc3NyYzsKKyAgZ3VpbnQ4ICpmY2lfZGF0YTsKKyAgZ3VpbnQgZmNpX2xlbmd0aDsKKyAgUlRQU291cmNlICpzcmM7CisKKyAgLyogVGhlIGZlZWRiYWNrIHBhY2tldCBtdXN0IGluY2x1ZGUgYm90aCBzZW5kZXIgU1NSQyBhbmQgbWVkaWEgU1NSQyAqLworICBpZiAocGFja2V0LT5sZW5ndGggPCAyKQorICAgIHJldHVybjsKKworICB0eXBlID0gZ3N0X3J0Y3BfcGFja2V0X2dldF90eXBlIChwYWNrZXQpOworICBmYnR5cGUgPSBnc3RfcnRjcF9wYWNrZXRfZmJfZ2V0X3R5cGUgKHBhY2tldCk7CisgIHNlbmRlcl9zc3JjID0gZ3N0X3J0Y3BfcGFja2V0X2ZiX2dldF9zZW5kZXJfc3NyYyAocGFja2V0KTsKKyAgbWVkaWFfc3NyYyA9IGdzdF9ydGNwX3BhY2tldF9mYl9nZXRfbWVkaWFfc3NyYyAocGFja2V0KTsKKworICBzcmMgPSBmaW5kX3NvdXJjZSAoc2VzcywgbWVkaWFfc3NyYyk7CisKKyAgLyogc2tpcCBub24tYnllIHBhY2tldHMgZm9yIHNvdXJjZXMgdGhhdCBhcmUgbWFya2VkIEJZRSAqLworICBpZiAoc2Vzcy0+c2NoZWR1bGVkX2J5ZSAmJiBzcmMgJiYgUlRQX1NPVVJDRV9JU19NQVJLRURfQllFIChzcmMpKQorICAgIHJldHVybjsKKworICBmY2lfZGF0YSA9IGdzdF9ydGNwX3BhY2tldF9mYl9nZXRfZmNpIChwYWNrZXQpOworICBmY2lfbGVuZ3RoID0gZ3N0X3J0Y3BfcGFja2V0X2ZiX2dldF9mY2lfbGVuZ3RoIChwYWNrZXQpICogc2l6ZW9mIChndWludDMyKTsKKworICBHU1RfREVCVUcgKCJyZWNlaXZlZCBmZWVkYmFjayAlZDolZCBmcm9tICUwOFggYWJvdXQgJTA4WCB3aXRoIEZDSSBvZiAiCisgICAgICAibGVuZ3RoICVkIiwgdHlwZSwgZmJ0eXBlLCBzZW5kZXJfc3NyYywgbWVkaWFfc3NyYywgZmNpX2xlbmd0aCk7CisKKyAgaWYgKGdfc2lnbmFsX2hhc19oYW5kbGVyX3BlbmRpbmcgKHNlc3MsCisgICAgICAgICAgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fRkVFREJBQ0tfUlRDUF0sIDAsIFRSVUUpKSB7CisgICAgR3N0QnVmZmVyICpmY2lfYnVmZmVyID0gTlVMTDsKKworICAgIGlmIChmY2lfbGVuZ3RoID4gMCkgeworICAgICAgZmNpX2J1ZmZlciA9IGdzdF9idWZmZXJfY29weV9yZWdpb24gKHBhY2tldC0+cnRjcC0+YnVmZmVyLAorICAgICAgICAgIEdTVF9CVUZGRVJfQ09QWV9NRU1PUlksIGZjaV9kYXRhIC0gcGFja2V0LT5ydGNwLT5tYXAuZGF0YSwKKyAgICAgICAgICBmY2lfbGVuZ3RoKTsKKyAgICAgIEdTVF9CVUZGRVJfUFRTIChmY2lfYnVmZmVyKSA9IHBpbmZvLT5ydW5uaW5nX3RpbWU7CisgICAgfQorCisgICAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgICBnX3NpZ25hbF9lbWl0IChzZXNzLCBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9GRUVEQkFDS19SVENQXSwgMCwKKyAgICAgICAgdHlwZSwgZmJ0eXBlLCBzZW5kZXJfc3NyYywgbWVkaWFfc3NyYywgZmNpX2J1ZmZlcik7CisgICAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisKKyAgICBpZiAoZmNpX2J1ZmZlcikKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGZjaV9idWZmZXIpOworICB9CisKKyAgaWYgKHNyYyAmJiBzZXNzLT5ydGNwX2ZlZWRiYWNrX3JldGVudGlvbl93aW5kb3cpIHsKKyAgICBydHBfc291cmNlX3JldGFpbl9ydGNwX3BhY2tldCAoc3JjLCBwYWNrZXQsIHBpbmZvLT5ydW5uaW5nX3RpbWUpOworICB9CisKKyAgaWYgKChzcmMgJiYgc3JjLT5pbnRlcm5hbCkgfHwKKyAgICAgIC8qIFBTRkIgRklSIHB1dHMgdGhlIG1lZGlhIHNzcmMgaW5zaWRlIHRoZSBGQ0kgKi8KKyAgICAgICh0eXBlID09IEdTVF9SVENQX1RZUEVfUFNGQiAmJiBmYnR5cGUgPT0gR1NUX1JUQ1BfUFNGQl9UWVBFX0ZJUikpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgR1NUX1JUQ1BfVFlQRV9QU0ZCOgorICAgICAgICBzd2l0Y2ggKGZidHlwZSkgeworICAgICAgICAgIGNhc2UgR1NUX1JUQ1BfUFNGQl9UWVBFX1BMSToKKyAgICAgICAgICAgIGlmIChzcmMpCisgICAgICAgICAgICAgIHNyYy0+c3RhdHMucmVjdl9wbGlfY291bnQrKzsKKyAgICAgICAgICAgIHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcGxpIChzZXNzLCBzZW5kZXJfc3NyYywgbWVkaWFfc3NyYywKKyAgICAgICAgICAgICAgICBjdXJyZW50X3RpbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHU1RfUlRDUF9QU0ZCX1RZUEVfRklSOgorICAgICAgICAgICAgaWYgKHNyYykKKyAgICAgICAgICAgICAgc3JjLT5zdGF0cy5yZWN2X2Zpcl9jb3VudCsrOworICAgICAgICAgICAgcnRwX3Nlc3Npb25fcHJvY2Vzc19maXIgKHNlc3MsIHNlbmRlcl9zc3JjLCBtZWRpYV9zc3JjLCBmY2lfZGF0YSwKKyAgICAgICAgICAgICAgICBmY2lfbGVuZ3RoLCBjdXJyZW50X3RpbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX1JUUEZCOgorICAgICAgICBzd2l0Y2ggKGZidHlwZSkgeworICAgICAgICAgIGNhc2UgR1NUX1JUQ1BfUlRQRkJfVFlQRV9OQUNLOgorICAgICAgICAgICAgaWYgKHNyYykKKyAgICAgICAgICAgICAgc3JjLT5zdGF0cy5yZWN2X25hY2tfY291bnQrKzsKKyAgICAgICAgICAgIHJ0cF9zZXNzaW9uX3Byb2Nlc3NfbmFjayAoc2Vzcywgc2VuZGVyX3NzcmMsIG1lZGlhX3NzcmMsCisgICAgICAgICAgICAgICAgZmNpX2RhdGEsIGZjaV9sZW5ndGgsIGN1cnJlbnRfdGltZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnRjcDoKKyAqIEBzZXNzOiBhbmQgI1JUUFNlc3Npb24KKyAqIEBidWZmZXI6IGFuIFJUQ1AgYnVmZmVyCisgKiBAY3VycmVudF90aW1lOiB0aGUgY3VycmVudCBzeXN0ZW0gdGltZQorICogQG50cG5zdGltZTogdGhlIGN1cnJlbnQgTlRQIHRpbWUgaW4gbmFub3NlY29uZHMKKyAqCisgKiBQcm9jZXNzIGFuIFJUQ1AgYnVmZmVyIGluIHRoZSBzZXNzaW9uIG1hbmFnZXIuIFRoaXMgZnVuY3Rpb24gdGFrZXMgb3duZXJzaGlwCisgKiBvZiBAYnVmZmVyLgorICoKKyAqIFJldHVybnM6IGEgI0dzdEZsb3dSZXR1cm4uCisgKi8KK0dzdEZsb3dSZXR1cm4KK3J0cF9zZXNzaW9uX3Byb2Nlc3NfcnRjcCAoUlRQU2Vzc2lvbiAqIHNlc3MsIEdzdEJ1ZmZlciAqIGJ1ZmZlciwKKyAgICBHc3RDbG9ja1RpbWUgY3VycmVudF90aW1lLCBndWludDY0IG50cG5zdGltZSkKK3sKKyAgR3N0UlRDUFBhY2tldCBwYWNrZXQ7CisgIGdib29sZWFuIG1vcmUsIGlzX2J5ZSA9IEZBTFNFLCBkb19zeW5jID0gRkFMU0U7CisgIFJUUFBhY2tldEluZm8gcGluZm8gPSB7IDAsIH07CisgIEdzdEZsb3dSZXR1cm4gcmVzdWx0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdFJUQ1BCdWZmZXIgcnRjcCA9IHsgTlVMTCwgfTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpLCBHU1RfRkxPV19FUlJPUik7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfQlVGRkVSIChidWZmZXIpLCBHU1RfRkxPV19FUlJPUik7CisKKyAgaWYgKCFnc3RfcnRjcF9idWZmZXJfdmFsaWRhdGVfcmVkdWNlZCAoYnVmZmVyKSkKKyAgICBnb3RvIGludmFsaWRfcGFja2V0OworCisgIEdTVF9ERUJVRyAoInJlY2VpdmVkIFJUQ1AgcGFja2V0Iik7CisKKyAgZ19zaWduYWxfZW1pdCAoc2VzcywgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fUkVDRUlWSU5HX1JUQ1BdLCAwLAorICAgICAgYnVmZmVyKTsKKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgLyogdXBkYXRlIHBpbmZvIHN0YXRzICovCisgIHVwZGF0ZV9wYWNrZXRfaW5mbyAoc2VzcywgJnBpbmZvLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBidWZmZXIsIGN1cnJlbnRfdGltZSwKKyAgICAgIC0xLCBudHBuc3RpbWUpOworCisgIC8qIHN0YXJ0IHByb2Nlc3NpbmcgdGhlIGNvbXBvdW5kIHBhY2tldCAqLworICBnc3RfcnRjcF9idWZmZXJfbWFwIChidWZmZXIsIEdTVF9NQVBfUkVBRCwgJnJ0Y3ApOworICBtb3JlID0gZ3N0X3J0Y3BfYnVmZmVyX2dldF9maXJzdF9wYWNrZXQgKCZydGNwLCAmcGFja2V0KTsKKyAgd2hpbGUgKG1vcmUpIHsKKyAgICBHc3RSVENQVHlwZSB0eXBlOworCisgICAgdHlwZSA9IGdzdF9ydGNwX3BhY2tldF9nZXRfdHlwZSAoJnBhY2tldCk7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgR1NUX1JUQ1BfVFlQRV9TUjoKKyAgICAgICAgcnRwX3Nlc3Npb25fcHJvY2Vzc19zciAoc2VzcywgJnBhY2tldCwgJnBpbmZvLCAmZG9fc3luYyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX1JSOgorICAgICAgICBydHBfc2Vzc2lvbl9wcm9jZXNzX3JyIChzZXNzLCAmcGFja2V0LCAmcGluZm8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1JUQ1BfVFlQRV9TREVTOgorICAgICAgICBydHBfc2Vzc2lvbl9wcm9jZXNzX3NkZXMgKHNlc3MsICZwYWNrZXQsICZwaW5mbyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX0JZRToKKyAgICAgICAgaXNfYnllID0gVFJVRTsKKyAgICAgICAgLyogZG9uJ3QgdHJ5IHRvIGF0dGVtcHQgbGlwLXN5bmMgYW55bW9yZSBmb3Igc3RyZWFtcyB3aXRoIGEgQllFICovCisgICAgICAgIGRvX3N5bmMgPSBGQUxTRTsKKyAgICAgICAgcnRwX3Nlc3Npb25fcHJvY2Vzc19ieWUgKHNlc3MsICZwYWNrZXQsICZwaW5mbyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX0FQUDoKKyAgICAgICAgcnRwX3Nlc3Npb25fcHJvY2Vzc19hcHAgKHNlc3MsICZwYWNrZXQsICZwaW5mbyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX1JUUEZCOgorICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX1BTRkI6CisgICAgICAgIHJ0cF9zZXNzaW9uX3Byb2Nlc3NfZmVlZGJhY2sgKHNlc3MsICZwYWNrZXQsICZwaW5mbywgY3VycmVudF90aW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9SVENQX1RZUEVfWFI6CisgICAgICAgIC8qIEZJWE1FOiBUaGlzIGJsb2NrIGlzIGFkZGVkIHRvIGRvd25ncmFkZSB3YXJuaW5nIGxldmVsLgorICAgICAgICAgKiBPbmNlIHRoZSBwYXJzZXIgaXMgaW1wbGVtZW50ZWQsIGl0IHNob3VsZCBiZSByZXBsYWNlZCB3aXRoCisgICAgICAgICAqIGEgcHJvcGVyIHByb2Nlc3MgZnVuY3Rpb24uICovCisgICAgICAgIEdTVF9ERUJVRyAoImdvdCBSVENQIFhSIHBhY2tldCwgYnV0IGlnbm9yZWQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfV0FSTklORyAoImdvdCB1bmtub3duIFJUQ1AgcGFja2V0IHR5cGU6ICVkIiwgdHlwZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBtb3JlID0gZ3N0X3J0Y3BfcGFja2V0X21vdmVfdG9fbmV4dCAoJnBhY2tldCk7CisgIH0KKworICBnc3RfcnRjcF9idWZmZXJfdW5tYXAgKCZydGNwKTsKKworICAvKiBpZiB3ZSBhcmUgc2NoZWR1bGluZyBhIEJZRSwgd2Ugb25seSB3YW50IHRvIGNvdW50IGJ5ZSBwYWNrZXRzLCBlbHNlIHdlCisgICAqIGNvdW50IGV2ZXJ5dGhpbmcgKi8KKyAgaWYgKHNlc3MtPnNjaGVkdWxlZF9ieWUgJiYgaXNfYnllKSB7CisgICAgc2Vzcy0+YnllX3N0YXRzLmJ5ZV9tZW1iZXJzKys7CisgICAgVVBEQVRFX0FWRyAoc2Vzcy0+YnllX3N0YXRzLmF2Z19ydGNwX3BhY2tldF9zaXplLCBwaW5mby5ieXRlcyk7CisgIH0KKworICAvKiBrZWVwIHRyYWNrIG9mIGF2ZXJhZ2UgcGFja2V0IHNpemUgKi8KKyAgVVBEQVRFX0FWRyAoc2Vzcy0+c3RhdHMuYXZnX3J0Y3BfcGFja2V0X3NpemUsIHBpbmZvLmJ5dGVzKTsKKworICBHU1RfREVCVUcgKCIlcCwgcmVjZWl2ZWQgUlRDUCBwYWNrZXQsIGF2ZyBzaXplICV1LCAldSIsICZzZXNzLT5zdGF0cywKKyAgICAgIHNlc3MtPnN0YXRzLmF2Z19ydGNwX3BhY2tldF9zaXplLCBwaW5mby5ieXRlcyk7CisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisKKyAgcGluZm8uZGF0YSA9IE5VTEw7CisgIGNsZWFuX3BhY2tldF9pbmZvICgmcGluZm8pOworCisgIC8qIG5vdGlmeSBjYWxsZXIgb2Ygc3IgcGFja2V0cyBpbiB0aGUgY2FsbGJhY2sgKi8KKyAgaWYgKGRvX3N5bmMgJiYgc2Vzcy0+Y2FsbGJhY2tzLnN5bmNfcnRjcCkgeworICAgIHJlc3VsdCA9IHNlc3MtPmNhbGxiYWNrcy5zeW5jX3J0Y3AgKHNlc3MsIGJ1ZmZlciwKKyAgICAgICAgc2Vzcy0+c3luY19ydGNwX3VzZXJfZGF0YSk7CisgIH0gZWxzZQorICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgcmV0dXJuIHJlc3VsdDsKKworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfcGFja2V0OgorICB7CisgICAgR1NUX0RFQlVHICgiaW52YWxpZCBSVENQIHBhY2tldCByZWNlaXZlZCIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fdXBkYXRlX3NlbmRfY2FwczoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQGNhcHM6IGEgI0dzdENhcHMKKyAqCisgKiBVcGRhdGUgdGhlIGNhcHMgb2YgdGhlIHNlbmRlciBpbiB0aGUgcnRwIHNlc3Npb24uCisgKi8KK3ZvaWQKK3J0cF9zZXNzaW9uX3VwZGF0ZV9zZW5kX2NhcHMgKFJUUFNlc3Npb24gKiBzZXNzLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzOworICBndWludCBzc3JjOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKFJUUF9JU19TRVNTSU9OIChzZXNzKSk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19DQVBTIChjYXBzKSk7CisKKyAgR1NUX0xPRyAoInJlY2VpdmVkIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAocywgInNzcmMiLCAmc3NyYykpIHsKKyAgICBSVFBTb3VyY2UgKnNvdXJjZTsKKyAgICBnYm9vbGVhbiBjcmVhdGVkOworCisgICAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgICAgc291cmNlID0gb2J0YWluX2ludGVybmFsX3NvdXJjZSAoc2Vzcywgc3NyYywgJmNyZWF0ZWQsIEdTVF9DTE9DS19USU1FX05PTkUpOworICAgIHNlc3MtPnN1Z2dlc3RlZF9zc3JjID0gc3NyYzsKKyAgICBzZXNzLT5pbnRlcm5hbF9zc3JjX3NldCA9IFRSVUU7CisgICAgc2Vzcy0+aW50ZXJuYWxfc3NyY19mcm9tX2NhcHNfb3JfcHJvcGVydHkgPSBUUlVFOworICAgIGlmIChzb3VyY2UpIHsKKyAgICAgIHJ0cF9zb3VyY2VfdXBkYXRlX2NhcHMgKHNvdXJjZSwgY2Fwcyk7CisKKyAgICAgIGlmIChjcmVhdGVkKQorICAgICAgICBvbl9uZXdfc2VuZGVyX3NzcmMgKHNlc3MsIHNvdXJjZSk7CisKKyAgICAgIGdfb2JqZWN0X3VucmVmIChzb3VyY2UpOworICAgIH0KKworICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF91aW50IChzLCAicnR4LXNzcmMiLCAmc3NyYykpIHsKKyAgICAgIHNvdXJjZSA9CisgICAgICAgICAgb2J0YWluX2ludGVybmFsX3NvdXJjZSAoc2Vzcywgc3NyYywgJmNyZWF0ZWQsIEdTVF9DTE9DS19USU1FX05PTkUpOworICAgICAgaWYgKHNvdXJjZSkgeworICAgICAgICBydHBfc291cmNlX3VwZGF0ZV9jYXBzIChzb3VyY2UsIGNhcHMpOworICAgICAgICBnX29iamVjdF91bnJlZiAoc291cmNlKTsKKyAgICAgIH0KKyAgICB9CisgICAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgfSBlbHNlIHsKKyAgICBzZXNzLT5pbnRlcm5hbF9zc3JjX2Zyb21fY2Fwc19vcl9wcm9wZXJ0eSA9IEZBTFNFOworICB9Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fc2VuZF9ydHA6CisgKiBAc2VzczogYW4gI1JUUFNlc3Npb24KKyAqIEBkYXRhOiBwb2ludGVyIHRvIGVpdGhlciBhbiBSVFAgYnVmZmVyIG9yIGEgbGlzdCBvZiBSVFAgYnVmZmVycworICogQGlzX2xpc3Q6IFRSVUUgd2hlbiBAZGF0YSBpcyBhIGJ1ZmZlciBsaXN0CisgKiBAY3VycmVudF90aW1lOiB0aGUgY3VycmVudCBzeXN0ZW0gdGltZQorICogQHJ1bm5pbmdfdGltZTogdGhlIHJ1bm5pbmcgdGltZSBvZiBAZGF0YQorICoKKyAqIFNlbmQgdGhlIFJUUCBidWZmZXIgaW4gdGhlIHNlc3Npb24gbWFuYWdlci4gVGhpcyBmdW5jdGlvbiB0YWtlcyBvd25lcnNoaXAgb2YKKyAqIEBidWZmZXIuCisgKgorICogUmV0dXJuczogYSAjR3N0Rmxvd1JldHVybi4KKyAqLworR3N0Rmxvd1JldHVybgorcnRwX3Nlc3Npb25fc2VuZF9ydHAgKFJUUFNlc3Npb24gKiBzZXNzLCBncG9pbnRlciBkYXRhLCBnYm9vbGVhbiBpc19saXN0LAorICAgIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUsIEdzdENsb2NrVGltZSBydW5uaW5nX3RpbWUpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzdWx0OworICBSVFBTb3VyY2UgKnNvdXJjZTsKKyAgZ2Jvb2xlYW4gcHJldnNlbmRlcjsKKyAgZ3VpbnQ2NCBvbGRyYXRlOworICBSVFBQYWNrZXRJbmZvIHBpbmZvID0geyAwLCB9OworICBnYm9vbGVhbiBjcmVhdGVkOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU0VTU0lPTiAoc2VzcyksIEdTVF9GTE9XX0VSUk9SKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGlzX2xpc3QgfHwgR1NUX0lTX0JVRkZFUiAoZGF0YSksIEdTVF9GTE9XX0VSUk9SKTsKKworICBHU1RfTE9HICgicmVjZWl2ZWQgUlRQICVzIGZvciBzZW5kaW5nIiwgaXNfbGlzdCA/ICJsaXN0IiA6ICJwYWNrZXQiKTsKKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgaWYgKCF1cGRhdGVfcGFja2V0X2luZm8gKHNlc3MsICZwaW5mbywgVFJVRSwgVFJVRSwgaXNfbGlzdCwgZGF0YSwKKyAgICAgICAgICBjdXJyZW50X3RpbWUsIHJ1bm5pbmdfdGltZSwgLTEpKQorICAgIGdvdG8gaW52YWxpZF9wYWNrZXQ7CisKKyAgc291cmNlID0gb2J0YWluX2ludGVybmFsX3NvdXJjZSAoc2VzcywgcGluZm8uc3NyYywgJmNyZWF0ZWQsIGN1cnJlbnRfdGltZSk7CisgIGlmIChjcmVhdGVkKQorICAgIG9uX25ld19zZW5kZXJfc3NyYyAoc2Vzcywgc291cmNlKTsKKworICBwcmV2c2VuZGVyID0gUlRQX1NPVVJDRV9JU19TRU5ERVIgKHNvdXJjZSk7CisgIG9sZHJhdGUgPSBzb3VyY2UtPmJpdHJhdGU7CisKKyAgLyogd2UgdXNlIG91ciBvd24gc291cmNlIHRvIHNlbmQgKi8KKyAgcmVzdWx0ID0gcnRwX3NvdXJjZV9zZW5kX3J0cCAoc291cmNlLCAmcGluZm8pOworCisgIHNvdXJjZV91cGRhdGVfc2VuZGVyIChzZXNzLCBzb3VyY2UsIHByZXZzZW5kZXIpOworCisgIGlmIChvbGRyYXRlICE9IHNvdXJjZS0+Yml0cmF0ZSkKKyAgICBzZXNzLT5yZWNhbGNfYmFuZHdpZHRoID0gVFJVRTsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKworICBnX29iamVjdF91bnJlZiAoc291cmNlKTsKKyAgY2xlYW5fcGFja2V0X2luZm8gKCZwaW5mbyk7CisKKyAgcmV0dXJuIHJlc3VsdDsKKworaW52YWxpZF9wYWNrZXQ6CisgIHsKKyAgICBnc3RfbWluaV9vYmplY3RfdW5yZWYgKEdTVF9NSU5JX09CSkVDVF9DQVNUIChkYXRhKSk7CisgICAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgICBHU1RfREVCVUcgKCJpbnZhbGlkIFJUUCBwYWNrZXQgcmVjZWl2ZWQiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2FkZF9iaXRyYXRlcyAoZ3BvaW50ZXIga2V5LCBSVFBTb3VyY2UgKiBzb3VyY2UsIGdkb3VibGUgKiBiYW5kd2lkdGgpCit7CisgICpiYW5kd2lkdGggKz0gc291cmNlLT5iaXRyYXRlOworfQorCisvKiBtdXN0IGJlIGNhbGxlZCB3aXRoIHNlc3Npb24gbG9jayAqLworc3RhdGljIEdzdENsb2NrVGltZQorY2FsY3VsYXRlX3J0Y3BfaW50ZXJ2YWwgKFJUUFNlc3Npb24gKiBzZXNzLCBnYm9vbGVhbiBkZXRlcm1pbmlzdGljLAorICAgIGdib29sZWFuIGZpcnN0KQoreworICBHc3RDbG9ja1RpbWUgcmVzdWx0OworICBSVFBTZXNzaW9uU3RhdHMgKnN0YXRzOworCisgIC8qIHJlY2FsY3VsYXRlIGJhbmR3aWR0aCB3aGVuIGl0IGNoYW5nZWQgKi8KKyAgaWYgKHNlc3MtPnJlY2FsY19iYW5kd2lkdGgpIHsKKyAgICBnZG91YmxlIGJhbmR3aWR0aDsKKworICAgIGlmIChzZXNzLT5iYW5kd2lkdGggPiAwKQorICAgICAgYmFuZHdpZHRoID0gc2Vzcy0+YmFuZHdpZHRoOworICAgIGVsc2UgeworICAgICAgLyogSWYgaXQgaXMgPD0gMCwgdGhlbiB0cnkgdG8gZXN0aW1hdGUgdGhlIGFjdHVhbCBiYW5kd2lkdGggKi8KKyAgICAgIGJhbmR3aWR0aCA9IDA7CisKKyAgICAgIGdfaGFzaF90YWJsZV9mb3JlYWNoIChzZXNzLT5zc3Jjc1tzZXNzLT5tYXNrX2lkeF0sCisgICAgICAgICAgKEdIRnVuYykgYWRkX2JpdHJhdGVzLCAmYmFuZHdpZHRoKTsKKyAgICB9CisgICAgaWYgKGJhbmR3aWR0aCA8IFJUUF9TVEFUU19CQU5EV0lEVEgpCisgICAgICBiYW5kd2lkdGggPSBSVFBfU1RBVFNfQkFORFdJRFRIOworCisgICAgcnRwX3N0YXRzX3NldF9iYW5kd2lkdGhzICgmc2Vzcy0+c3RhdHMsIGJhbmR3aWR0aCwKKyAgICAgICAgc2Vzcy0+cnRjcF9iYW5kd2lkdGgsIHNlc3MtPnJ0Y3BfcnNfYmFuZHdpZHRoLCBzZXNzLT5ydGNwX3JyX2JhbmR3aWR0aCk7CisKKyAgICBzZXNzLT5yZWNhbGNfYmFuZHdpZHRoID0gRkFMU0U7CisgIH0KKworICBpZiAoc2Vzcy0+c2NoZWR1bGVkX2J5ZSkgeworICAgIHN0YXRzID0gJnNlc3MtPmJ5ZV9zdGF0czsKKyAgICByZXN1bHQgPSBydHBfc3RhdHNfY2FsY3VsYXRlX2J5ZV9pbnRlcnZhbCAoc3RhdHMpOworICB9IGVsc2UgeworICAgIHNlc3Npb25fdXBkYXRlX3B0cCAoc2Vzcyk7CisKKyAgICBzdGF0cyA9ICZzZXNzLT5zdGF0czsKKyAgICByZXN1bHQgPSBydHBfc3RhdHNfY2FsY3VsYXRlX3J0Y3BfaW50ZXJ2YWwgKHN0YXRzLAorICAgICAgICBzdGF0cy0+aW50ZXJuYWxfc2VuZGVyX3NvdXJjZXMgPiAwLCBzZXNzLT5ydHBfcHJvZmlsZSwKKyAgICAgICAgc2Vzcy0+aXNfZG9pbmdfcHRwLCBmaXJzdCk7CisgIH0KKworICBHU1RfREVCVUcgKCJuZXh0IGRldGVybWluaXN0aWMgaW50ZXJ2YWw6ICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBmaXJzdCAlZCIsCisgICAgICBHU1RfVElNRV9BUkdTIChyZXN1bHQpLCBmaXJzdCk7CisKKyAgaWYgKCFkZXRlcm1pbmlzdGljICYmIHJlc3VsdCAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgIHJlc3VsdCA9IHJ0cF9zdGF0c19hZGRfcnRjcF9qaXR0ZXIgKHN0YXRzLCByZXN1bHQpOworCisgIEdTVF9ERUJVRyAoIm5leHQgaW50ZXJ2YWw6ICUiIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAocmVzdWx0KSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK3NvdXJjZV9tYXJrX2J5ZSAoY29uc3QgZ2NoYXIgKiBrZXksIFJUUFNvdXJjZSAqIHNvdXJjZSwgY29uc3QgZ2NoYXIgKiByZWFzb24pCit7CisgIGlmIChzb3VyY2UtPmludGVybmFsKQorICAgIHJ0cF9zb3VyY2VfbWFya19ieWUgKHNvdXJjZSwgcmVhc29uKTsKK30KKworLyoqCisgKiBydHBfc2Vzc2lvbl9tYXJrX2FsbF9ieWU6CisgKiBAc2VzczogYW4gI1JUUFNlc3Npb24KKyAqIEByZWFzb246IGEgcmVhc29uCisgKgorICogTWFyayBhbGwgaW50ZXJuYWwgc291cmNlcyBvZiB0aGUgc2Vzc2lvbiBhcyBCWUUgd2l0aCBAcmVhc29uLgorICovCit2b2lkCitydHBfc2Vzc2lvbl9tYXJrX2FsbF9ieWUgKFJUUFNlc3Npb24gKiBzZXNzLCBjb25zdCBnY2hhciAqIHJlYXNvbikKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpKTsKKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgZ19oYXNoX3RhYmxlX2ZvcmVhY2ggKHNlc3MtPnNzcmNzW3Nlc3MtPm1hc2tfaWR4XSwKKyAgICAgIChHSEZ1bmMpIHNvdXJjZV9tYXJrX2J5ZSwgKGdwb2ludGVyKSByZWFzb24pOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworfQorCisvKiBTdG9wIHRoZSBjdXJyZW50IEBzZXNzIGFuZCBzY2hlZHVsZSBhIEJZRSBtZXNzYWdlIGZvciB0aGUgb3RoZXIgbWVtYmVycy4KKyAqIE9uZSBtdXN0IGhhdmUgdGhlIHNlc3Npb24gbG9jayB0byBjYWxsIHRoaXMgZnVuY3Rpb24KKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK3J0cF9zZXNzaW9uX3NjaGVkdWxlX2J5ZV9sb2NrZWQgKFJUUFNlc3Npb24gKiBzZXNzLCBHc3RDbG9ja1RpbWUgY3VycmVudF90aW1lKQoreworICBHc3RGbG93UmV0dXJuIHJlc3VsdCA9IEdTVF9GTE9XX09LOworICBHc3RDbG9ja1RpbWUgaW50ZXJ2YWw7CisKKyAgLyogbm90aGluZyB0byBkbyBpdCB3ZSBhbHJlYWR5IHNjaGVkdWxlZCBieWUgKi8KKyAgaWYgKHNlc3MtPnNjaGVkdWxlZF9ieWUpCisgICAgZ290byBkb25lOworCisgIC8qIHdlIHNjaGVkdWxlIEJZRSBub3cgKi8KKyAgc2Vzcy0+c2NoZWR1bGVkX2J5ZSA9IFRSVUU7CisgIC8qIGF0IGxlYXN0IG9uZSBtZW1iZXIgd2FudHMgdG8gc2VuZCBhIEJZRSAqLworICBtZW1jcHkgKCZzZXNzLT5ieWVfc3RhdHMsICZzZXNzLT5zdGF0cywgc2l6ZW9mIChSVFBTZXNzaW9uU3RhdHMpKTsKKyAgSU5JVF9BVkcgKHNlc3MtPmJ5ZV9zdGF0cy5hdmdfcnRjcF9wYWNrZXRfc2l6ZSwgMTAwKTsKKyAgc2Vzcy0+YnllX3N0YXRzLmJ5ZV9tZW1iZXJzID0gMTsKKyAgc2Vzcy0+Zmlyc3RfcnRjcCA9IFRSVUU7CisKKyAgLyogcmVzY2hlZHVsZSB0cmFuc21pc3Npb24gKi8KKyAgc2Vzcy0+bGFzdF9ydGNwX3NlbmRfdGltZSA9IGN1cnJlbnRfdGltZTsKKyAgc2Vzcy0+bGFzdF9ydGNwX2NoZWNrX3RpbWUgPSBjdXJyZW50X3RpbWU7CisgIGludGVydmFsID0gY2FsY3VsYXRlX3J0Y3BfaW50ZXJ2YWwgKHNlc3MsIEZBTFNFLCBUUlVFKTsKKworICBpZiAoaW50ZXJ2YWwgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICBzZXNzLT5uZXh0X3J0Y3BfY2hlY2tfdGltZSA9IGN1cnJlbnRfdGltZSArIGludGVydmFsOworICBlbHNlCisgICAgc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBzZXNzLT5sYXN0X3J0Y3BfaW50ZXJ2YWwgPSBpbnRlcnZhbDsKKworICBHU1RfREVCVUcgKCJTY2hlZHVsZSBCWUUgZm9yICUiIEdTVF9USU1FX0ZPUk1BVCAiLCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChpbnRlcnZhbCksIEdTVF9USU1FX0FSR1MgKHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lKSk7CisKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgLyogbm90aWZ5IGFwcCBvZiByZWNvbnNpZGVyYXRpb24gKi8KKyAgaWYgKHNlc3MtPmNhbGxiYWNrcy5yZWNvbnNpZGVyKQorICAgIHNlc3MtPmNhbGxiYWNrcy5yZWNvbnNpZGVyIChzZXNzLCBzZXNzLT5yZWNvbnNpZGVyX3VzZXJfZGF0YSk7CisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworZG9uZToKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX3NjaGVkdWxlX2J5ZToKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQGN1cnJlbnRfdGltZTogdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUKKyAqCisgKiBTY2hlZHVsZSBhIEJZRSBtZXNzYWdlIGZvciBhbGwgc291cmNlcyBtYXJrZWQgYXMgQllFIGluIEBzZXNzLgorICoKKyAqIFJldHVybnM6IGEgI0dzdEZsb3dSZXR1cm4uCisgKi8KK0dzdEZsb3dSZXR1cm4KK3J0cF9zZXNzaW9uX3NjaGVkdWxlX2J5ZSAoUlRQU2Vzc2lvbiAqIHNlc3MsIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzdWx0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU0VTU0lPTiAoc2VzcyksIEdTVF9GTE9XX0VSUk9SKTsKKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgcmVzdWx0ID0gcnRwX3Nlc3Npb25fc2NoZWR1bGVfYnllX2xvY2tlZCAoc2VzcywgY3VycmVudF90aW1lKTsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX25leHRfdGltZW91dDoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQGN1cnJlbnRfdGltZTogdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUKKyAqCisgKiBHZXQgdGhlIG5leHQgdGltZSB3ZSBzaG91bGQgcGVyZm9ybSBzZXNzaW9uIG1haW50ZW5hbmNlIHRhc2tzLgorICoKKyAqIFJldHVybnM6IGEgdGltZSB3aGVuIHJ0cF9zZXNzaW9uX29uX3RpbWVvdXQoKSBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlCisgKiBjdXJyZW50IHN5c3RlbSB0aW1lLgorICovCitHc3RDbG9ja1RpbWUKK3J0cF9zZXNzaW9uX25leHRfdGltZW91dCAoUlRQU2Vzc2lvbiAqIHNlc3MsIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUpCit7CisgIEdzdENsb2NrVGltZSByZXN1bHQsIGludGVydmFsID0gMDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpLCBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHNlc3MtPm5leHRfZWFybHlfcnRjcF90aW1lKSkgeworICAgIEdTVF9ERUJVRyAoImhhdmUgZWFybHkgcnRjcCB0aW1lIik7CisgICAgcmVzdWx0ID0gc2Vzcy0+bmV4dF9lYXJseV9ydGNwX3RpbWU7CisgICAgZ290byBlYXJseV9leGl0OworICB9CisKKyAgcmVzdWx0ID0gc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWU7CisKKyAgR1NUX0RFQlVHICgiY3VycmVudCB0aW1lOiAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIsIG5leHQgdGltZTogJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoY3VycmVudF90aW1lKSwgR1NUX1RJTUVfQVJHUyAocmVzdWx0KSk7CisKKyAgaWYgKHJlc3VsdCA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FIHx8IHJlc3VsdCA8IGN1cnJlbnRfdGltZSkgeworICAgIEdTVF9ERUJVRyAoInRha2UgY3VycmVudCB0aW1lIGFzIGJhc2UiKTsKKyAgICAvKiBvdXIgcHJldmlvdXMgY2hlY2sgdGltZSBleHBpcmVkLCBzdGFydCBjb3VudGluZyBmcm9tIHRoZSBjdXJyZW50IHRpbWUKKyAgICAgKiBhZ2Fpbi4gKi8KKyAgICByZXN1bHQgPSBjdXJyZW50X3RpbWU7CisgIH0KKworICBpZiAoc2Vzcy0+c2NoZWR1bGVkX2J5ZSkgeworICAgIGlmIChzZXNzLT5ieWVfc3RhdHMuYWN0aXZlX3NvdXJjZXMgPj0gNTApIHsKKyAgICAgIEdTVF9ERUJVRyAoInJlY29uc2lkZXIgQllFLCBtb3JlIHRoYW4gNTAgc291cmNlcyIpOworICAgICAgLyogcmVjb25zaWRlciBCWUUgaWYgbWVtYmVycyA+PSA1MCAqLworICAgICAgaW50ZXJ2YWwgPSBjYWxjdWxhdGVfcnRjcF9pbnRlcnZhbCAoc2VzcywgRkFMU0UsIFRSVUUpOworICAgICAgc2Vzcy0+bGFzdF9ydGNwX2ludGVydmFsID0gaW50ZXJ2YWw7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChzZXNzLT5maXJzdF9ydGNwKSB7CisgICAgICBHU1RfREVCVUcgKCJmaXJzdCBSVENQIHBhY2tldCIpOworICAgICAgLyogd2UgYXJlIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUgKi8KKyAgICAgIGludGVydmFsID0gY2FsY3VsYXRlX3J0Y3BfaW50ZXJ2YWwgKHNlc3MsIEZBTFNFLCBUUlVFKTsKKyAgICAgIHNlc3MtPmxhc3RfcnRjcF9pbnRlcnZhbCA9IGludGVydmFsOworICAgIH0gZWxzZSBpZiAoc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWUgPCBjdXJyZW50X3RpbWUpIHsKKyAgICAgIEdTVF9ERUJVRyAoIm9sZCBjaGVjayB0aW1lIGV4cGlyZWQsIGdldHRpbmcgbmV3IHRpbWVvdXQiKTsKKyAgICAgIC8qIGdldCBhIG5ldyB0aW1lb3V0IHdoZW4gd2UgbmVlZCB0byAqLworICAgICAgaW50ZXJ2YWwgPSBjYWxjdWxhdGVfcnRjcF9pbnRlcnZhbCAoc2VzcywgRkFMU0UsIEZBTFNFKTsKKyAgICAgIHNlc3MtPmxhc3RfcnRjcF9pbnRlcnZhbCA9IGludGVydmFsOworCisgICAgICBpZiAoKHNlc3MtPnJ0cF9wcm9maWxlID09IEdTVF9SVFBfUFJPRklMRV9BVlBGCisgICAgICAgICAgICAgIHx8IHNlc3MtPnJ0cF9wcm9maWxlID09IEdTVF9SVFBfUFJPRklMRV9TQVZQRikKKyAgICAgICAgICAmJiBpbnRlcnZhbCAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgICAgIC8qIEFwcGx5IHRoZSBydWxlcyBmcm9tIFJGQyA0NTg1IHNlY3Rpb24gMy41LjMgKi8KKyAgICAgICAgaWYgKHNlc3MtPnN0YXRzLm1pbl9pbnRlcnZhbCAhPSAwKSB7CisgICAgICAgICAgR3N0Q2xvY2tUaW1lIFRfcnJfY3VycmVudF9pbnRlcnZhbCA9IGdfcmFuZG9tX2RvdWJsZV9yYW5nZSAoMC41LAorICAgICAgICAgICAgICAxLjUpICogc2Vzcy0+c3RhdHMubWluX2ludGVydmFsICogR1NUX1NFQ09ORDsKKworICAgICAgICAgIGlmIChUX3JyX2N1cnJlbnRfaW50ZXJ2YWwgPiBpbnRlcnZhbCkgeworICAgICAgICAgICAgR1NUX0RFQlVHICgiQWRqdXN0aW5nIGludGVydmFsIGZvciB0LXJyLWludGVydmFsOiAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAgICAgICAiID4gJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChUX3JyX2N1cnJlbnRfaW50ZXJ2YWwpLAorICAgICAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGludGVydmFsKSk7CisgICAgICAgICAgICBpbnRlcnZhbCA9IFRfcnJfY3VycmVudF9pbnRlcnZhbDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoaW50ZXJ2YWwgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICByZXN1bHQgKz0gaW50ZXJ2YWw7CisgIGVsc2UKKyAgICByZXN1bHQgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lID0gcmVzdWx0OworCitlYXJseV9leGl0OgorCisgIEdTVF9ERUJVRyAoImN1cnJlbnQgdGltZTogJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAiLCBuZXh0IHRpbWU6ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKGN1cnJlbnRfdGltZSksIEdTVF9USU1FX0FSR1MgKHJlc3VsdCkpOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIFJUUFNvdXJjZSAqc291cmNlOworICBnYm9vbGVhbiBpc19ieWU7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworfSBSZXBvcnRPdXRwdXQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEdzdFJUQ1BCdWZmZXIgcnRjcGJ1ZjsKKyAgUlRQU2Vzc2lvbiAqc2VzczsKKyAgUlRQU291cmNlICpzb3VyY2U7CisgIGd1aW50IG51bV90b19yZXBvcnQ7CisgIGdib29sZWFuIGhhdmVfZmlyOworICBnYm9vbGVhbiBoYXZlX3BsaTsKKyAgZ2Jvb2xlYW4gaGF2ZV9uYWNrOworICBHc3RCdWZmZXIgKnJ0Y3A7CisgIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWU7CisgIGd1aW50NjQgbnRwbnN0aW1lOworICBHc3RDbG9ja1RpbWUgcnVubmluZ190aW1lOworICBHc3RDbG9ja1RpbWUgaW50ZXJ2YWw7CisgIEdzdFJUQ1BQYWNrZXQgcGFja2V0OworICBnYm9vbGVhbiBoYXNfc2RlczsKKyAgZ2Jvb2xlYW4gaXNfZWFybHk7CisgIGdib29sZWFuIG1heV9zdXBwcmVzczsKKyAgR1F1ZXVlIG91dHB1dDsKKyAgZ3VpbnQgbmFja2VkX3NlcW51bXM7Cit9IFJlcG9ydERhdGE7CisKK3N0YXRpYyB2b2lkCitzZXNzaW9uX3N0YXJ0X3J0Y3AgKFJUUFNlc3Npb24gKiBzZXNzLCBSZXBvcnREYXRhICogZGF0YSkKK3sKKyAgR3N0UlRDUFBhY2tldCAqcGFja2V0ID0gJmRhdGEtPnBhY2tldDsKKyAgUlRQU291cmNlICpvd24gPSBkYXRhLT5zb3VyY2U7CisgIEdzdFJUQ1BCdWZmZXIgKnJ0Y3AgPSAmZGF0YS0+cnRjcGJ1ZjsKKworICBkYXRhLT5ydGNwID0gZ3N0X3J0Y3BfYnVmZmVyX25ldyAoc2Vzcy0+bXR1KTsKKyAgZGF0YS0+aGFzX3NkZXMgPSBGQUxTRTsKKworICBnc3RfcnRjcF9idWZmZXJfbWFwIChkYXRhLT5ydGNwLCBHU1RfTUFQX1JFQURXUklURSwgcnRjcCk7CisKKyAgaWYgKGRhdGEtPmlzX2Vhcmx5ICYmIHNlc3MtPnJlZHVjZWRfc2l6ZV9ydGNwKQorICAgIHJldHVybjsKKworICBpZiAoUlRQX1NPVVJDRV9JU19TRU5ERVIgKG93bikpIHsKKyAgICBndWludDY0IG50cHRpbWU7CisgICAgZ3VpbnQzMiBydHB0aW1lOworICAgIGd1aW50MzIgcGFja2V0X2NvdW50LCBvY3RldF9jb3VudDsKKworICAgIC8qIHdlIGFyZSBhIHNlbmRlciwgY3JlYXRlIFNSICovCisgICAgR1NUX0RFQlVHICgiY3JlYXRlIFNSIGZvciBTU1JDICUwOHgiLCBvd24tPnNzcmMpOworICAgIGdzdF9ydGNwX2J1ZmZlcl9hZGRfcGFja2V0IChydGNwLCBHU1RfUlRDUF9UWVBFX1NSLCBwYWNrZXQpOworCisgICAgLyogZ2V0IGxhdGVzdCBzdGF0cyAqLworICAgIHJ0cF9zb3VyY2VfZ2V0X25ld19zciAob3duLCBkYXRhLT5udHBuc3RpbWUsIGRhdGEtPnJ1bm5pbmdfdGltZSwKKyAgICAgICAgJm50cHRpbWUsICZydHB0aW1lLCAmcGFja2V0X2NvdW50LCAmb2N0ZXRfY291bnQpOworICAgIC8qIHN0b3JlIHN0YXRzICovCisgICAgcnRwX3NvdXJjZV9wcm9jZXNzX3NyIChvd24sIGRhdGEtPmN1cnJlbnRfdGltZSwgbnRwdGltZSwgcnRwdGltZSwKKyAgICAgICAgcGFja2V0X2NvdW50LCBvY3RldF9jb3VudCk7CisKKyAgICAvKiBmaWxsIGluIHNlbmRlciByZXBvcnQgaW5mbyAqLworICAgIGdzdF9ydGNwX3BhY2tldF9zcl9zZXRfc2VuZGVyX2luZm8gKHBhY2tldCwgb3duLT5zc3JjLAorICAgICAgICBudHB0aW1lLCBydHB0aW1lLCBwYWNrZXRfY291bnQsIG9jdGV0X2NvdW50KTsKKyAgfSBlbHNlIHsKKyAgICAvKiB3ZSBhcmUgb25seSByZWNlaXZlciwgY3JlYXRlIFJSICovCisgICAgR1NUX0RFQlVHICgiY3JlYXRlIFJSIGZvciBTU1JDICUwOHgiLCBvd24tPnNzcmMpOworICAgIGdzdF9ydGNwX2J1ZmZlcl9hZGRfcGFja2V0IChydGNwLCBHU1RfUlRDUF9UWVBFX1JSLCBwYWNrZXQpOworICAgIGdzdF9ydGNwX3BhY2tldF9ycl9zZXRfc3NyYyAocGFja2V0LCBvd24tPnNzcmMpOworICB9Cit9CisKKy8qIGNvbnN0cnVjdCBhIFNlbmRlciBvciBSZWNlaXZlciBSZXBvcnQgKi8KK3N0YXRpYyB2b2lkCitzZXNzaW9uX3JlcG9ydF9ibG9ja3MgKGNvbnN0IGdjaGFyICoga2V5LCBSVFBTb3VyY2UgKiBzb3VyY2UsIFJlcG9ydERhdGEgKiBkYXRhKQoreworICBSVFBTZXNzaW9uICpzZXNzID0gZGF0YS0+c2VzczsKKyAgR3N0UlRDUFBhY2tldCAqcGFja2V0ID0gJmRhdGEtPnBhY2tldDsKKyAgZ3VpbnQ4IGZyYWN0aW9ubG9zdDsKKyAgZ2ludDMyIHBhY2tldHNsb3N0OworICBndWludDMyIGV4dGhpZ2hlc3RzZXEsIGppdHRlcjsKKyAgZ3VpbnQzMiBsc3IsIGRsc3I7CisKKyAgLyogZG9uJ3QgcmVwb3J0IGZvciBzb3VyY2VzIGluIGZ1dHVyZSBnZW5lcmF0aW9ucyAqLworICBpZiAoKChnaW50MTYpIChzb3VyY2UtPmdlbmVyYXRpb24gLSBzZXNzLT5nZW5lcmF0aW9uKSkgPiAwKSB7CisgICAgR1NUX0RFQlVHICgic291cmNlICUwOHggZ2VuZXJhdGlvbiAldSA+ICV1Iiwgc291cmNlLT5zc3JjLAorICAgICAgICBzb3VyY2UtPmdlbmVyYXRpb24sIHNlc3MtPmdlbmVyYXRpb24pOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChnX2hhc2hfdGFibGVfY29udGFpbnMgKHNvdXJjZS0+cmVwb3J0ZWRfaW5fc3Jfb2YsCisgICAgICAgICAgR1VJTlRfVE9fUE9JTlRFUiAoZGF0YS0+c291cmNlLT5zc3JjKSkpIHsKKyAgICBHU1RfREVCVUcgKCJzb3VyY2UgJTA4eCBhbHJlYWR5IHJlcG9ydGVkIGluIHRoaXMgZ2VuZXJhdGlvbiIsIHNvdXJjZS0+c3NyYyk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGdzdF9ydGNwX3BhY2tldF9nZXRfcmJfY291bnQgKHBhY2tldCkgPT0gR1NUX1JUQ1BfTUFYX1JCX0NPVU5UKSB7CisgICAgR1NUX0RFQlVHICgibWF4IFJCIGNvdW50IHJlYWNoZWQiKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBvbmx5IHJlcG9ydCBhYm91dCBvdGhlciBzZW5kZXIgKi8KKyAgaWYgKHNvdXJjZSA9PSBkYXRhLT5zb3VyY2UpCisgICAgZ290byByZXBvcnRlZDsKKworICBpZiAoIVJUUF9TT1VSQ0VfSVNfU0VOREVSIChzb3VyY2UpKSB7CisgICAgR1NUX0RFQlVHICgic291cmNlICUwOHggbm90IHNlbmRlciIsIHNvdXJjZS0+c3NyYyk7CisgICAgZ290byByZXBvcnRlZDsKKyAgfQorCisgIEdTVF9ERUJVRyAoImNyZWF0ZSBSQiBmb3IgU1NSQyAlMDh4Iiwgc291cmNlLT5zc3JjKTsKKworICAvKiBnZXQgbmV3IHN0YXRzICovCisgIHJ0cF9zb3VyY2VfZ2V0X25ld19yYiAoc291cmNlLCBkYXRhLT5jdXJyZW50X3RpbWUsICZmcmFjdGlvbmxvc3QsCisgICAgICAmcGFja2V0c2xvc3QsICZleHRoaWdoZXN0c2VxLCAmaml0dGVyLCAmbHNyLCAmZGxzcik7CisKKyAgLyogc3RvcmUgbGFzdCBnZW5lcmF0ZWQgUlIgcGFja2V0ICovCisgIHNvdXJjZS0+bGFzdF9yci5pc192YWxpZCA9IFRSVUU7CisgIHNvdXJjZS0+bGFzdF9yci5mcmFjdGlvbmxvc3QgPSBmcmFjdGlvbmxvc3Q7CisgIHNvdXJjZS0+bGFzdF9yci5wYWNrZXRzbG9zdCA9IHBhY2tldHNsb3N0OworICBzb3VyY2UtPmxhc3RfcnIuZXh0aGlnaGVzdHNlcSA9IGV4dGhpZ2hlc3RzZXE7CisgIHNvdXJjZS0+bGFzdF9yci5qaXR0ZXIgPSBqaXR0ZXI7CisgIHNvdXJjZS0+bGFzdF9yci5sc3IgPSBsc3I7CisgIHNvdXJjZS0+bGFzdF9yci5kbHNyID0gZGxzcjsKKworICAvKiBwYWNrZXQgaXMgbm90IHlldCBmaWxsZWQsIGFkZCByZXBvcnQgYmxvY2sgZm9yIHRoaXMgc291cmNlLiAqLworICBnc3RfcnRjcF9wYWNrZXRfYWRkX3JiIChwYWNrZXQsIHNvdXJjZS0+c3NyYywgZnJhY3Rpb25sb3N0LCBwYWNrZXRzbG9zdCwKKyAgICAgIGV4dGhpZ2hlc3RzZXEsIGppdHRlciwgbHNyLCBkbHNyKTsKKworcmVwb3J0ZWQ6CisgIGdfaGFzaF90YWJsZV9hZGQgKHNvdXJjZS0+cmVwb3J0ZWRfaW5fc3Jfb2YsCisgICAgICBHVUlOVF9UT19QT0lOVEVSIChkYXRhLT5zb3VyY2UtPnNzcmMpKTsKK30KKworLyogY29uc3RydWN0IEZJUiAqLworc3RhdGljIHZvaWQKK3Nlc3Npb25fYWRkX2ZpciAoY29uc3QgZ2NoYXIgKiBrZXksIFJUUFNvdXJjZSAqIHNvdXJjZSwgUmVwb3J0RGF0YSAqIGRhdGEpCit7CisgIEdzdFJUQ1BQYWNrZXQgKnBhY2tldCA9ICZkYXRhLT5wYWNrZXQ7CisgIGd1aW50MTYgbGVuOworICBndWludDggKmZjaV9kYXRhOworCisgIGlmICghc291cmNlLT5zZW5kX2ZpcikKKyAgICByZXR1cm47CisKKyAgbGVuID0gZ3N0X3J0Y3BfcGFja2V0X2ZiX2dldF9mY2lfbGVuZ3RoIChwYWNrZXQpOworICBpZiAoIWdzdF9ydGNwX3BhY2tldF9mYl9zZXRfZmNpX2xlbmd0aCAocGFja2V0LCBsZW4gKyAyKSkKKyAgICAvKiBleGl0IGJlY2F1c2UgdGhlIHBhY2tldCBpcyBmdWxsLCB3aWxsIHB1dCBuZXh0IHJlcXVlc3QgaW4gYQorICAgICAqIGZ1cnRoZXIgcGFja2V0ICovCisgICAgcmV0dXJuOworCisgIGZjaV9kYXRhID0gZ3N0X3J0Y3BfcGFja2V0X2ZiX2dldF9mY2kgKHBhY2tldCkgKyAobGVuICogNCk7CisKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZmNpX2RhdGEsIHNvdXJjZS0+c3NyYyk7CisgIGZjaV9kYXRhICs9IDQ7CisgIGZjaV9kYXRhWzBdID0gc291cmNlLT5jdXJyZW50X3NlbmRfZmlyX3NlcW51bTsKKyAgZmNpX2RhdGFbMV0gPSBmY2lfZGF0YVsyXSA9IGZjaV9kYXRhWzNdID0gMDsKKworICBzb3VyY2UtPnNlbmRfZmlyID0gRkFMU0U7CisgIHNvdXJjZS0+c3RhdHMuc2VudF9maXJfY291bnQrKzsKK30KKworc3RhdGljIHZvaWQKK3Nlc3Npb25fZmlyIChSVFBTZXNzaW9uICogc2VzcywgUmVwb3J0RGF0YSAqIGRhdGEpCit7CisgIEdzdFJUQ1BCdWZmZXIgKnJ0Y3AgPSAmZGF0YS0+cnRjcGJ1ZjsKKyAgR3N0UlRDUFBhY2tldCAqcGFja2V0ID0gJmRhdGEtPnBhY2tldDsKKworICBpZiAoIWdzdF9ydGNwX2J1ZmZlcl9hZGRfcGFja2V0IChydGNwLCBHU1RfUlRDUF9UWVBFX1BTRkIsIHBhY2tldCkpCisgICAgcmV0dXJuOworCisgIGdzdF9ydGNwX3BhY2tldF9mYl9zZXRfdHlwZSAocGFja2V0LCBHU1RfUlRDUF9QU0ZCX1RZUEVfRklSKTsKKyAgZ3N0X3J0Y3BfcGFja2V0X2ZiX3NldF9zZW5kZXJfc3NyYyAocGFja2V0LCBkYXRhLT5zb3VyY2UtPnNzcmMpOworICBnc3RfcnRjcF9wYWNrZXRfZmJfc2V0X21lZGlhX3NzcmMgKHBhY2tldCwgMCk7CisKKyAgZ19oYXNoX3RhYmxlX2ZvcmVhY2ggKHNlc3MtPnNzcmNzW3Nlc3MtPm1hc2tfaWR4XSwKKyAgICAgIChHSEZ1bmMpIHNlc3Npb25fYWRkX2ZpciwgZGF0YSk7CisKKyAgaWYgKGdzdF9ydGNwX3BhY2tldF9mYl9nZXRfZmNpX2xlbmd0aCAocGFja2V0KSA9PSAwKQorICAgIGdzdF9ydGNwX3BhY2tldF9yZW1vdmUgKHBhY2tldCk7CisgIGVsc2UKKyAgICBkYXRhLT5tYXlfc3VwcHJlc3MgPSBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitoYXNfcGxpX2NvbXBhcmVfZnVuYyAoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGlnbm9yZWQpCit7CisgIEdzdFJUQ1BQYWNrZXQgcGFja2V0OworICBHc3RSVENQQnVmZmVyIHJ0Y3AgPSB7IE5VTEwsIH07CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIGdzdF9ydGNwX2J1ZmZlcl9tYXAgKChHc3RCdWZmZXIgKikgYSwgR1NUX01BUF9SRUFELCAmcnRjcCk7CisKKyAgaWYgKGdzdF9ydGNwX2J1ZmZlcl9nZXRfZmlyc3RfcGFja2V0ICgmcnRjcCwgJnBhY2tldCkpIHsKKyAgICBpZiAoZ3N0X3J0Y3BfcGFja2V0X2dldF90eXBlICgmcGFja2V0KSA9PSBHU1RfUlRDUF9UWVBFX1BTRkIgJiYKKyAgICAgICAgZ3N0X3J0Y3BfcGFja2V0X2ZiX2dldF90eXBlICgmcGFja2V0KSA9PSBHU1RfUlRDUF9QU0ZCX1RZUEVfUExJKQorICAgICAgcmV0ID0gVFJVRTsKKyAgfQorCisgIGdzdF9ydGNwX2J1ZmZlcl91bm1hcCAoJnJ0Y3ApOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qIGNvbnN0cnVjdCBQTEkgKi8KK3N0YXRpYyB2b2lkCitzZXNzaW9uX3BsaSAoY29uc3QgZ2NoYXIgKiBrZXksIFJUUFNvdXJjZSAqIHNvdXJjZSwgUmVwb3J0RGF0YSAqIGRhdGEpCit7CisgIEdzdFJUQ1BCdWZmZXIgKnJ0Y3AgPSAmZGF0YS0+cnRjcGJ1ZjsKKyAgR3N0UlRDUFBhY2tldCAqcGFja2V0ID0gJmRhdGEtPnBhY2tldDsKKworICBpZiAoIXNvdXJjZS0+c2VuZF9wbGkpCisgICAgcmV0dXJuOworCisgIGlmIChydHBfc291cmNlX2hhc19yZXRhaW5lZCAoc291cmNlLCBoYXNfcGxpX2NvbXBhcmVfZnVuYywgTlVMTCkpCisgICAgcmV0dXJuOworCisgIGlmICghZ3N0X3J0Y3BfYnVmZmVyX2FkZF9wYWNrZXQgKHJ0Y3AsIEdTVF9SVENQX1RZUEVfUFNGQiwgcGFja2V0KSkKKyAgICAvKiBleGl0IGJlY2F1c2UgdGhlIHBhY2tldCBpcyBmdWxsLCB3aWxsIHB1dCBuZXh0IHJlcXVlc3QgaW4gYQorICAgICAqIGZ1cnRoZXIgcGFja2V0ICovCisgICAgcmV0dXJuOworCisgIGdzdF9ydGNwX3BhY2tldF9mYl9zZXRfdHlwZSAocGFja2V0LCBHU1RfUlRDUF9QU0ZCX1RZUEVfUExJKTsKKyAgZ3N0X3J0Y3BfcGFja2V0X2ZiX3NldF9zZW5kZXJfc3NyYyAocGFja2V0LCBkYXRhLT5zb3VyY2UtPnNzcmMpOworICBnc3RfcnRjcF9wYWNrZXRfZmJfc2V0X21lZGlhX3NzcmMgKHBhY2tldCwgc291cmNlLT5zc3JjKTsKKworICBzb3VyY2UtPnNlbmRfcGxpID0gRkFMU0U7CisgIGRhdGEtPm1heV9zdXBwcmVzcyA9IEZBTFNFOworCisgIHNvdXJjZS0+c3RhdHMuc2VudF9wbGlfY291bnQrKzsKK30KKworLyogY29uc3RydWN0IE5BQ0sgKi8KK3N0YXRpYyB2b2lkCitzZXNzaW9uX25hY2sgKGNvbnN0IGdjaGFyICoga2V5LCBSVFBTb3VyY2UgKiBzb3VyY2UsIFJlcG9ydERhdGEgKiBkYXRhKQoreworICBHc3RSVENQQnVmZmVyICpydGNwID0gJmRhdGEtPnJ0Y3BidWY7CisgIEdzdFJUQ1BQYWNrZXQgKnBhY2tldCA9ICZkYXRhLT5wYWNrZXQ7CisgIGd1aW50MzIgKm5hY2tzOworICBndWludCBuX25hY2tzLCBpOworICBndWludDggKmZjaV9kYXRhOworCisgIGlmICghc291cmNlLT5zZW5kX25hY2spCisgICAgcmV0dXJuOworCisgIGlmICghZ3N0X3J0Y3BfYnVmZmVyX2FkZF9wYWNrZXQgKHJ0Y3AsIEdTVF9SVENQX1RZUEVfUlRQRkIsIHBhY2tldCkpCisgICAgLyogZXhpdCBiZWNhdXNlIHRoZSBwYWNrZXQgaXMgZnVsbCwgd2lsbCBwdXQgbmV4dCByZXF1ZXN0IGluIGEKKyAgICAgKiBmdXJ0aGVyIHBhY2tldCAqLworICAgIHJldHVybjsKKworICBnc3RfcnRjcF9wYWNrZXRfZmJfc2V0X3R5cGUgKHBhY2tldCwgR1NUX1JUQ1BfUlRQRkJfVFlQRV9OQUNLKTsKKyAgZ3N0X3J0Y3BfcGFja2V0X2ZiX3NldF9zZW5kZXJfc3NyYyAocGFja2V0LCBkYXRhLT5zb3VyY2UtPnNzcmMpOworICBnc3RfcnRjcF9wYWNrZXRfZmJfc2V0X21lZGlhX3NzcmMgKHBhY2tldCwgc291cmNlLT5zc3JjKTsKKworICBuYWNrcyA9IHJ0cF9zb3VyY2VfZ2V0X25hY2tzIChzb3VyY2UsICZuX25hY2tzKTsKKyAgR1NUX0RFQlVHICgiJXUgTkFDS3MiLCBuX25hY2tzKTsKKyAgaWYgKCFnc3RfcnRjcF9wYWNrZXRfZmJfc2V0X2ZjaV9sZW5ndGggKHBhY2tldCwgbl9uYWNrcykpCisgICAgcmV0dXJuOworCisgIGZjaV9kYXRhID0gZ3N0X3J0Y3BfcGFja2V0X2ZiX2dldF9mY2kgKHBhY2tldCk7CisgIGZvciAoaSA9IDA7IGkgPCBuX25hY2tzOyBpKyspIHsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0JFIChmY2lfZGF0YSwgbmFja3NbaV0pOworICAgIGZjaV9kYXRhICs9IDQ7CisgICAgZGF0YS0+bmFja2VkX3NlcW51bXMrKzsKKyAgfQorCisgIHJ0cF9zb3VyY2VfY2xlYXJfbmFja3MgKHNvdXJjZSk7CisgIGRhdGEtPm1heV9zdXBwcmVzcyA9IEZBTFNFOworICBzb3VyY2UtPnN0YXRzLnNlbnRfbmFja19jb3VudCArPSBuX25hY2tzOworfQorCisvKiBwZXJmb3JtIGNsZWFudXAgb2Ygc291cmNlcyB0aGF0IHRpbWVkIG91dCAqLworc3RhdGljIHZvaWQKK3Nlc3Npb25fY2xlYW51cCAoY29uc3QgZ2NoYXIgKiBrZXksIFJUUFNvdXJjZSAqIHNvdXJjZSwgUmVwb3J0RGF0YSAqIGRhdGEpCit7CisgIGdib29sZWFuIHJlbW92ZSA9IEZBTFNFOworICBnYm9vbGVhbiBieWV0aW1lb3V0ID0gRkFMU0U7CisgIGdib29sZWFuIHNlbmRlcnRpbWVvdXQgPSBGQUxTRTsKKyAgZ2Jvb2xlYW4gaXNfc2VuZGVyLCBpc19hY3RpdmU7CisgIFJUUFNlc3Npb24gKnNlc3MgPSBkYXRhLT5zZXNzOworICBHc3RDbG9ja1RpbWUgaW50ZXJ2YWwsIGJpbnRlcnZhbDsKKyAgR3N0Q2xvY2tUaW1lIGJ0aW1lOworCisgIEdTVF9ERUJVRyAoImxvb2sgYXQgJTA4eCwgZ2VuZXJhdGlvbiAldSIsIHNvdXJjZS0+c3NyYywgc291cmNlLT5nZW5lcmF0aW9uKTsKKworICAvKiBjaGVjayBmb3Igb3V0ZGF0ZWQgY29sbGlzaW9ucyAqLworICBpZiAoc291cmNlLT5pbnRlcm5hbCkgeworICAgIEdTVF9ERUJVRyAoIlRpbWluZyBvdXQgY29sbGlzaW9ucyBmb3IgJXgiLCBzb3VyY2UtPnNzcmMpOworICAgIHJ0cF9zb3VyY2VfdGltZW91dCAoc291cmNlLCBkYXRhLT5jdXJyZW50X3RpbWUsCisgICAgICAgIGRhdGEtPnJ1bm5pbmdfdGltZSAtIHNlc3MtPnJ0Y3BfZmVlZGJhY2tfcmV0ZW50aW9uX3dpbmRvdyk7CisgIH0KKworICAvKiBub3RoaW5nIGVsc2UgdG8gZG8gd2hlbiB3aXRob3V0IFJUQ1AgKi8KKyAgaWYgKGRhdGEtPmludGVydmFsID09IEdTVF9DTE9DS19USU1FX05PTkUpCisgICAgcmV0dXJuOworCisgIGlzX3NlbmRlciA9IFJUUF9TT1VSQ0VfSVNfU0VOREVSIChzb3VyY2UpOworICBpc19hY3RpdmUgPSBSVFBfU09VUkNFX0lTX0FDVElWRSAoc291cmNlKTsKKworICAvKiBvdXIgb3duIHJ0Y3AgaW50ZXJ2YWwgbWF5IGhhdmUgYmVlbiBmb3JjZWQgbG93IGJ5IHNlY29uZGFyeSBjb25maWd1cmF0aW9uLAorICAgKiB3aGlsZSBzZW5kZXIgc2lkZSBtYXkgc3RpbGwgb3BlcmF0ZSB3aXRoIGhpZ2hlciBpbnRlcnZhbCwKKyAgICogc28gZG8gbm90IGp1c3QgdGFrZSBvdXIgaW50ZXJ2YWwgdG8gZGVjaWRlIG9uIHRpbWluZyBvdXQgc2VuZGVyLAorICAgKiBidXQgdGFrZSAoaWYgZGF0YS0+aW50ZXJ2YWwgPD0gNSAqIEdTVF9TRUNPTkQpOgorICAgKiAgIGludGVydmFsID0gQ0xBTVAgKHNlbmRlcl9pbnRlcnZhbCwgZGF0YS0+aW50ZXJ2YWwsIDUgKiBHU1RfU0VDT05EKQorICAgKiB3aGVyZSBzZW5kZXJfaW50ZXJ2YWwgaXMgZGlmZmVyZW5jZSBiZXR3ZWVuIGxhc3QgMiByZWNlaXZlZCBSVENQIHJlcG9ydHMKKyAgICovCisgIGlmIChkYXRhLT5pbnRlcnZhbCA+PSA1ICogR1NUX1NFQ09ORCB8fCBzb3VyY2UtPmludGVybmFsKSB7CisgICAgYmludGVydmFsID0gZGF0YS0+aW50ZXJ2YWw7CisgIH0gZWxzZSB7CisgICAgR1NUX0xPRyAoInByZXZfcnRjcCAlIiBHU1RfVElNRV9GT1JNQVQgIiwgbGFzdF9ydGNwICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoc291cmNlLT5zdGF0cy5wcmV2X3J0Y3B0aW1lKSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoc291cmNlLT5zdGF0cy5sYXN0X3J0Y3B0aW1lKSk7CisgICAgLyogaWYgbm90IHJlY2VpdmVkIGVub3VnaCB5ZXQsIGZhbGxiYWNrIHRvIGxhcmdlciBkZWZhdWx0ICovCisgICAgaWYgKHNvdXJjZS0+c3RhdHMubGFzdF9ydGNwdGltZSA+IHNvdXJjZS0+c3RhdHMucHJldl9ydGNwdGltZSkKKyAgICAgIGJpbnRlcnZhbCA9IHNvdXJjZS0+c3RhdHMubGFzdF9ydGNwdGltZSAtIHNvdXJjZS0+c3RhdHMucHJldl9ydGNwdGltZTsKKyAgICBlbHNlCisgICAgICBiaW50ZXJ2YWwgPSA1ICogR1NUX1NFQ09ORDsKKyAgICBiaW50ZXJ2YWwgPSBDTEFNUCAoYmludGVydmFsLCBkYXRhLT5pbnRlcnZhbCwgNSAqIEdTVF9TRUNPTkQpOworICB9CisgIEdTVF9MT0cgKCJ0aW1lb3V0IGJhc2UgaW50ZXJ2YWwgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoYmludGVydmFsKSk7CisKKyAgaWYgKCFzb3VyY2UtPmludGVybmFsICYmIHNvdXJjZS0+bWFya2VkX2J5ZSkgeworICAgIC8qIGlmIHdlIHJlY2VpdmVkIGEgQllFIGZyb20gdGhlIHNvdXJjZSwgcmVtb3ZlIHRoZSBzb3VyY2UgYWZ0ZXIgc29tZQorICAgICAqIHRpbWUuICovCisgICAgaWYgKGRhdGEtPmN1cnJlbnRfdGltZSA+IHNvdXJjZS0+YnllX3RpbWUgJiYKKyAgICAgICAgZGF0YS0+Y3VycmVudF90aW1lIC0gc291cmNlLT5ieWVfdGltZSA+IHNlc3MtPnN0YXRzLmJ5ZV90aW1lb3V0KSB7CisgICAgICBHU1RfREVCVUcgKCJyZW1vdmluZyBCWUUgc291cmNlICUwOHgiLCBzb3VyY2UtPnNzcmMpOworICAgICAgcmVtb3ZlID0gVFJVRTsKKyAgICAgIGJ5ZXRpbWVvdXQgPSBUUlVFOworICAgIH0KKyAgfQorCisgIGlmIChzb3VyY2UtPmludGVybmFsICYmIHNvdXJjZS0+c2VudF9ieWUpIHsKKyAgICBHU1RfREVCVUcgKCJyZW1vdmluZyBpbnRlcm5hbCBzb3VyY2UgdGhhdCBoYXMgc2VudCBCWUUgJTA4eCIsIHNvdXJjZS0+c3NyYyk7CisgICAgcmVtb3ZlID0gVFJVRTsKKyAgfQorCisgIC8qIHNvdXJjZXMgdGhhdCB3ZXJlIGluYWN0aXZlIGZvciBtb3JlIHRoYW4gNSB0aW1lcyB0aGUgZGV0ZXJtaW5pc3RpYyByZXBvcnRpbmcKKyAgICogaW50ZXJ2YWwgZ2V0IHRpbWVkIG91dC4gdGhlIG1pbiB0aW1lb3V0IGlzIDUgc2Vjb25kcy4gKi8KKyAgLyogbWluZCBvbGQgdGltZSB0aGF0IG1pZ2h0IHByZS1kYXRlIGxhc3QgdGltZSBnb2luZyB0byBQTEFZSU5HICovCisgIGJ0aW1lID0gTUFYIChzb3VyY2UtPmxhc3RfYWN0aXZpdHksIHNlc3MtPnN0YXJ0X3RpbWUpOworICBpZiAoZGF0YS0+Y3VycmVudF90aW1lID4gYnRpbWUpIHsKKyAgICBpbnRlcnZhbCA9IE1BWCAoYmludGVydmFsICogNSwgNSAqIEdTVF9TRUNPTkQpOworICAgIGlmIChkYXRhLT5jdXJyZW50X3RpbWUgLSBidGltZSA+IGludGVydmFsKSB7CisgICAgICBHU1RfREVCVUcgKCJyZW1vdmluZyB0aW1lb3V0IHNvdXJjZSAlMDh4LCBsYXN0ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBzb3VyY2UtPnNzcmMsIEdTVF9USU1FX0FSR1MgKGJ0aW1lKSk7CisgICAgICBpZiAoc291cmNlLT5pbnRlcm5hbCkgeworICAgICAgICAvKiB0aGlzIGlzIGFuIGludGVybmFsIHNvdXJjZSB0aGF0IGlzIG5vdCB1c2luZyBvdXIgc3VnZ2VzdGVkIHNzcmMuCisgICAgICAgICAqIHNpbmNlIHRoZXJlIG11c3QgYmUgYW5vdGhlciBzb3VyY2UgdXNpbmcgdGhpcyBzc3JjLCB3ZSBjYW4gcmVtb3ZlCisgICAgICAgICAqIHRoaXMgb25lIGluc3RlYWQgb2YgbWFraW5nIGl0IGEgcmVjZWl2ZXIgZm9yZXZlciAqLworICAgICAgICBpZiAoc291cmNlLT5zc3JjICE9IHNlc3MtPnN1Z2dlc3RlZF9zc3JjKSB7CisgICAgICAgICAgcnRwX3NvdXJjZV9tYXJrX2J5ZSAoc291cmNlLCAidGltZWQgb3V0Iik7CisgICAgICAgICAgLyogZG8gbm90IHNjaGVkdWxlIGJ5ZSBoZXJlLCBzaW5jZSB3ZSBhcmUgaW5zaWRlIHRoZSBSVENQIHRpbWVvdXQKKyAgICAgICAgICAgKiBwcm9jZXNzaW5nIGFuZCBzY2hlZHVsaW5nIGJ5ZSB3aWxsIGludGVyZmVyZSB3aXRoIFNSL1JSIHNlbmRpbmcgKi8KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVtb3ZlID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBzZW5kZXJzIHRoYXQgZGlkIG5vdCBzZW5kIGZvciBhIGxvbmcgdGltZSBiZWNvbWUgYSByZWNlaXZlciwgdGhpcyBhbHNvCisgICAqIGhvbGRzIGZvciBvdXIgb3duIHNvdXJjZXMuICovCisgIGlmIChpc19zZW5kZXIpIHsKKyAgICAvKiBtaW5kIG9sZCB0aW1lIHRoYXQgbWlnaHQgcHJlLWRhdGUgbGFzdCB0aW1lIGdvaW5nIHRvIFBMQVlJTkcgKi8KKyAgICBidGltZSA9IE1BWCAoc291cmNlLT5sYXN0X3J0cF9hY3Rpdml0eSwgc2Vzcy0+c3RhcnRfdGltZSk7CisgICAgaWYgKGRhdGEtPmN1cnJlbnRfdGltZSA+IGJ0aW1lKSB7CisgICAgICBpbnRlcnZhbCA9IE1BWCAoYmludGVydmFsICogMiwgNSAqIEdTVF9TRUNPTkQpOworICAgICAgaWYgKGRhdGEtPmN1cnJlbnRfdGltZSAtIGJ0aW1lID4gaW50ZXJ2YWwpIHsKKyAgICAgICAgR1NUX0RFQlVHICgic2VuZGVyIHNvdXJjZSAlMDh4IHRpbWVkIG91dCBhbmQgYmVjYW1lIHJlY2VpdmVyLCBsYXN0ICUiCisgICAgICAgICAgICBHU1RfVElNRV9GT1JNQVQsIHNvdXJjZS0+c3NyYywgR1NUX1RJTUVfQVJHUyAoYnRpbWUpKTsKKyAgICAgICAgc2VuZGVydGltZW91dCA9IFRSVUU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKHJlbW92ZSkgeworICAgIHNlc3MtPnRvdGFsX3NvdXJjZXMtLTsKKyAgICBpZiAoaXNfc2VuZGVyKSB7CisgICAgICBzZXNzLT5zdGF0cy5zZW5kZXJfc291cmNlcy0tOworICAgICAgaWYgKHNvdXJjZS0+aW50ZXJuYWwpCisgICAgICAgIHNlc3MtPnN0YXRzLmludGVybmFsX3NlbmRlcl9zb3VyY2VzLS07CisgICAgfQorICAgIGlmIChpc19hY3RpdmUpCisgICAgICBzZXNzLT5zdGF0cy5hY3RpdmVfc291cmNlcy0tOworCisgICAgaWYgKHNvdXJjZS0+aW50ZXJuYWwpCisgICAgICBzZXNzLT5zdGF0cy5pbnRlcm5hbF9zb3VyY2VzLS07CisKKyAgICBpZiAoYnlldGltZW91dCkKKyAgICAgIG9uX2J5ZV90aW1lb3V0IChzZXNzLCBzb3VyY2UpOworICAgIGVsc2UKKyAgICAgIG9uX3RpbWVvdXQgKHNlc3MsIHNvdXJjZSk7CisgIH0gZWxzZSB7CisgICAgaWYgKHNlbmRlcnRpbWVvdXQpIHsKKyAgICAgIHNvdXJjZS0+aXNfc2VuZGVyID0gRkFMU0U7CisgICAgICBzZXNzLT5zdGF0cy5zZW5kZXJfc291cmNlcy0tOworICAgICAgaWYgKHNvdXJjZS0+aW50ZXJuYWwpCisgICAgICAgIHNlc3MtPnN0YXRzLmludGVybmFsX3NlbmRlcl9zb3VyY2VzLS07CisKKyAgICAgIG9uX3NlbmRlcl90aW1lb3V0IChzZXNzLCBzb3VyY2UpOworICAgIH0KKyAgICAvKiBjb3VudCBob3cgbWFueSBzb3VyY2UgdG8gcmVwb3J0IGluIHRoaXMgZ2VuZXJhdGlvbiAqLworICAgIGlmICgoKGdpbnQxNikgKHNvdXJjZS0+Z2VuZXJhdGlvbiAtIHNlc3MtPmdlbmVyYXRpb24pKSA8PSAwKQorICAgICAgZGF0YS0+bnVtX3RvX3JlcG9ydCsrOworICB9CisgIHNvdXJjZS0+Y2xvc2luZyA9IHJlbW92ZTsKK30KKworc3RhdGljIHZvaWQKK3Nlc3Npb25fc2RlcyAoUlRQU2Vzc2lvbiAqIHNlc3MsIFJlcG9ydERhdGEgKiBkYXRhKQoreworICBHc3RSVENQUGFja2V0ICpwYWNrZXQgPSAmZGF0YS0+cGFja2V0OworICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnNkZXM7CisgIGdpbnQgaSwgbl9maWVsZHM7CisgIEdzdFJUQ1BCdWZmZXIgKnJ0Y3AgPSAmZGF0YS0+cnRjcGJ1ZjsKKworICAvKiBhZGQgU0RFUyBwYWNrZXQgKi8KKyAgZ3N0X3J0Y3BfYnVmZmVyX2FkZF9wYWNrZXQgKHJ0Y3AsIEdTVF9SVENQX1RZUEVfU0RFUywgcGFja2V0KTsKKworICBnc3RfcnRjcF9wYWNrZXRfc2Rlc19hZGRfaXRlbSAocGFja2V0LCBkYXRhLT5zb3VyY2UtPnNzcmMpOworCisgIHNkZXMgPSBydHBfc291cmNlX2dldF9zZGVzX3N0cnVjdCAoZGF0YS0+c291cmNlKTsKKworICAvKiBhZGQgYWxsIGZpZWxkcyBpbiB0aGUgc3RydWN0dXJlLCB0aGUgb3JkZXIgaXMgbm90IGltcG9ydGFudC4gKi8KKyAgbl9maWVsZHMgPSBnc3Rfc3RydWN0dXJlX25fZmllbGRzIChzZGVzKTsKKyAgZm9yIChpID0gMDsgaSA8IG5fZmllbGRzOyArK2kpIHsKKyAgICBjb25zdCBnY2hhciAqZmllbGQ7CisgICAgY29uc3QgZ2NoYXIgKnZhbHVlOworICAgIEdzdFJUQ1BTREVTVHlwZSB0eXBlOworCisgICAgZmllbGQgPSBnc3Rfc3RydWN0dXJlX250aF9maWVsZF9uYW1lIChzZGVzLCBpKTsKKyAgICBpZiAoZmllbGQgPT0gTlVMTCkKKyAgICAgIGNvbnRpbnVlOworICAgIHZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzZGVzLCBmaWVsZCk7CisgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICBjb250aW51ZTsKKyAgICB0eXBlID0gZ3N0X3J0Y3Bfc2Rlc19uYW1lX3RvX3R5cGUgKGZpZWxkKTsKKworICAgIC8qIEVhcmx5IHBhY2tldHMgYXJlIG1pbmltYWwgYW5kIG9ubHkgaW5jbHVkZSB0aGUgQ05BTUUgKi8KKyAgICBpZiAoZGF0YS0+aXNfZWFybHkgJiYgdHlwZSAhPSBHU1RfUlRDUF9TREVTX0NOQU1FKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAodHlwZSA+IEdTVF9SVENQX1NERVNfRU5EICYmIHR5cGUgPCBHU1RfUlRDUF9TREVTX1BSSVYpIHsKKyAgICAgIGdzdF9ydGNwX3BhY2tldF9zZGVzX2FkZF9lbnRyeSAocGFja2V0LCB0eXBlLCBzdHJsZW4gKHZhbHVlKSwKKyAgICAgICAgICAoY29uc3QgZ3VpbnQ4ICopIHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gR1NUX1JUQ1BfU0RFU19QUklWKSB7CisgICAgICBnc2l6ZSBwcmVmaXhfbGVuOworICAgICAgZ3NpemUgdmFsdWVfbGVuOworICAgICAgZ3NpemUgZGF0YV9sZW47CisgICAgICBndWludDggZGF0YVsyNTZdOworCisgICAgICAvKiBkb24ndCBhY2NlcHQgZW50cmllcyB0aGF0IGFyZSB0b28gYmlnICovCisgICAgICBwcmVmaXhfbGVuID0gc3RybGVuIChmaWVsZCk7CisgICAgICBpZiAocHJlZml4X2xlbiA+IDI1NSkKKyAgICAgICAgY29udGludWU7CisgICAgICB2YWx1ZV9sZW4gPSBzdHJsZW4gKHZhbHVlKTsKKyAgICAgIGlmICh2YWx1ZV9sZW4gPiAyNTUpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGF0YV9sZW4gPSAxICsgcHJlZml4X2xlbiArIHZhbHVlX2xlbjsKKyAgICAgIGlmIChkYXRhX2xlbiA+IDI1NSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGRhdGFbMF0gPSBwcmVmaXhfbGVuOworICAgICAgbWVtY3B5ICgmZGF0YVsxXSwgZmllbGQsIHByZWZpeF9sZW4pOworICAgICAgbWVtY3B5ICgmZGF0YVsxICsgcHJlZml4X2xlbl0sIHZhbHVlLCB2YWx1ZV9sZW4pOworCisgICAgICBnc3RfcnRjcF9wYWNrZXRfc2Rlc19hZGRfZW50cnkgKHBhY2tldCwgdHlwZSwgZGF0YV9sZW4sIGRhdGEpOworICAgIH0KKyAgfQorCisgIGRhdGEtPmhhc19zZGVzID0gVFJVRTsKK30KKworLyogc2NoZWR1bGUgYSBCWUUgcGFja2V0ICovCitzdGF0aWMgdm9pZAorbWFrZV9zb3VyY2VfYnllIChSVFBTZXNzaW9uICogc2VzcywgUlRQU291cmNlICogc291cmNlLCBSZXBvcnREYXRhICogZGF0YSkKK3sKKyAgR3N0UlRDUFBhY2tldCAqcGFja2V0ID0gJmRhdGEtPnBhY2tldDsKKyAgR3N0UlRDUEJ1ZmZlciAqcnRjcCA9ICZkYXRhLT5ydGNwYnVmOworCisgIC8qIGFkZCBTREVTICovCisgIHNlc3Npb25fc2RlcyAoc2VzcywgZGF0YSk7CisgIC8qIGFkZCBhIEJZRSBwYWNrZXQgKi8KKyAgZ3N0X3J0Y3BfYnVmZmVyX2FkZF9wYWNrZXQgKHJ0Y3AsIEdTVF9SVENQX1RZUEVfQllFLCBwYWNrZXQpOworICBnc3RfcnRjcF9wYWNrZXRfYnllX2FkZF9zc3JjIChwYWNrZXQsIHNvdXJjZS0+c3NyYyk7CisgIGlmIChzb3VyY2UtPmJ5ZV9yZWFzb24pCisgICAgZ3N0X3J0Y3BfcGFja2V0X2J5ZV9zZXRfcmVhc29uIChwYWNrZXQsIHNvdXJjZS0+YnllX3JlYXNvbik7CisKKyAgLyogd2UgaGF2ZSBhIEJZRSBwYWNrZXQgbm93ICovCisgIHNvdXJjZS0+c2VudF9ieWUgPSBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2lzX3J0Y3BfdGltZSAoUlRQU2Vzc2lvbiAqIHNlc3MsIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUsIFJlcG9ydERhdGEgKiBkYXRhKQoreworICBHc3RDbG9ja1RpbWUgbmV3X3NlbmRfdGltZTsKKyAgR3N0Q2xvY2tUaW1lIGludGVydmFsOworICBSVFBTZXNzaW9uU3RhdHMgKnN0YXRzOworCisgIGlmIChzZXNzLT5zY2hlZHVsZWRfYnllKQorICAgIHN0YXRzID0gJnNlc3MtPmJ5ZV9zdGF0czsKKyAgZWxzZQorICAgIHN0YXRzID0gJnNlc3MtPnN0YXRzOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc2Vzcy0+bmV4dF9lYXJseV9ydGNwX3RpbWUpKQorICAgIGRhdGEtPmlzX2Vhcmx5ID0gVFJVRTsKKyAgZWxzZQorICAgIGRhdGEtPmlzX2Vhcmx5ID0gRkFMU0U7CisKKyAgaWYgKGRhdGEtPmlzX2Vhcmx5ICYmIHNlc3MtPm5leHRfZWFybHlfcnRjcF90aW1lIDwgY3VycmVudF90aW1lKSB7CisgICAgR1NUX0RFQlVHICgiZWFybHkgZmVlZGJhY2sgJSIgR1NUX1RJTUVfRk9STUFUICIgPCBub3cgJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChzZXNzLT5uZXh0X2Vhcmx5X3J0Y3BfdGltZSksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGN1cnJlbnRfdGltZSkpOworICB9IGVsc2UgaWYgKHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lID09IEdTVF9DTE9DS19USU1FX05PTkUgfHwKKyAgICAgIHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lID4gY3VycmVudF90aW1lKSB7CisgICAgR1NUX0RFQlVHICgibm8gY2hlY2sgdGltZSB5ZXQsIG5leHQgJSIgR1NUX1RJTUVfRk9STUFUICIgPiBub3cgJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChzZXNzLT5uZXh0X3J0Y3BfY2hlY2tfdGltZSksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGN1cnJlbnRfdGltZSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIHRha2UgaW50ZXJ2YWwgYW5kIGFkZCBqaXR0ZXIgKi8KKyAgaW50ZXJ2YWwgPSBkYXRhLT5pbnRlcnZhbDsKKyAgaWYgKGludGVydmFsICE9IEdTVF9DTE9DS19USU1FX05PTkUpCisgICAgaW50ZXJ2YWwgPSBydHBfc3RhdHNfYWRkX3J0Y3Bfaml0dGVyIChzdGF0cywgaW50ZXJ2YWwpOworCisgIGlmIChzZXNzLT5sYXN0X3J0Y3BfY2hlY2tfdGltZSAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgLyogcGVyZm9ybSBmb3J3YXJkIHJlY29uc2lkZXJhdGlvbiAqLworICAgIGlmIChpbnRlcnZhbCAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgICBHc3RDbG9ja1RpbWUgZWxhcHNlZDsKKworICAgICAgLyogZ2V0IGVsYXBzZWQgdGltZSBzaW5jZSB3ZSBsYXN0IHJlcG9ydGVkICovCisgICAgICBlbGFwc2VkID0gY3VycmVudF90aW1lIC0gc2Vzcy0+bGFzdF9ydGNwX2NoZWNrX3RpbWU7CisKKyAgICAgIEdTVF9ERUJVRyAoImZvcndhcmQgcmVjb25zaWRlcmF0aW9uICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBlbGFwc2VkICUiCisgICAgICAgICAgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChpbnRlcnZhbCksIEdTVF9USU1FX0FSR1MgKGVsYXBzZWQpKTsKKyAgICAgIG5ld19zZW5kX3RpbWUgPSBpbnRlcnZhbCArIHNlc3MtPmxhc3RfcnRjcF9jaGVja190aW1lOworICAgIH0gZWxzZSB7CisgICAgICBuZXdfc2VuZF90aW1lID0gc2Vzcy0+bGFzdF9ydGNwX2NoZWNrX3RpbWU7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IFJUQ1AgcGFja2V0LCB3ZSBjYW4gcmVjb25zaWRlciBhbnl0aGluZyBiYXNlZAorICAgICAqIG9uIHRoZSBsYXN0IFJUQ1Agc2VuZCB0aW1lIGJlY2F1c2UgdGhlcmUgd2FzIG5vbmUuCisgICAgICovCisgICAgZ193YXJuX2lmX2ZhaWwgKCFkYXRhLT5pc19lYXJseSk7CisgICAgZGF0YS0+aXNfZWFybHkgPSBGQUxTRTsKKyAgICBuZXdfc2VuZF90aW1lID0gY3VycmVudF90aW1lOworICB9CisKKyAgaWYgKCFkYXRhLT5pc19lYXJseSkgeworICAgIC8qIGNoZWNrIGlmIHJlY29uc2lkZXJhdGlvbiAqLworICAgIGlmIChuZXdfc2VuZF90aW1lID09IEdTVF9DTE9DS19USU1FX05PTkUgfHwgY3VycmVudF90aW1lIDwgbmV3X3NlbmRfdGltZSkgeworICAgICAgR1NUX0RFQlVHICgicmVjb25zaWRlciBSVENQIGZvciAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAobmV3X3NlbmRfdGltZSkpOworICAgICAgLyogc3RvcmUgbmV3IGNoZWNrIHRpbWUgKi8KKyAgICAgIHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lID0gbmV3X3NlbmRfdGltZTsKKyAgICAgIHNlc3MtPmxhc3RfcnRjcF9pbnRlcnZhbCA9IGludGVydmFsOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHNlc3MtPmxhc3RfcnRjcF9pbnRlcnZhbCA9IGludGVydmFsOworICAgIGlmICgoc2Vzcy0+cnRwX3Byb2ZpbGUgPT0gR1NUX1JUUF9QUk9GSUxFX0FWUEYKKyAgICAgICAgICAgIHx8IHNlc3MtPnJ0cF9wcm9maWxlID09IEdTVF9SVFBfUFJPRklMRV9TQVZQRikKKyAgICAgICAgJiYgaW50ZXJ2YWwgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgICAgLyogQXBwbHkgdGhlIHJ1bGVzIGZyb20gUkZDIDQ1ODUgc2VjdGlvbiAzLjUuMyAqLworICAgICAgaWYgKHN0YXRzLT5taW5faW50ZXJ2YWwgIT0gMCAmJiAhc2Vzcy0+Zmlyc3RfcnRjcCkgeworICAgICAgICBHc3RDbG9ja1RpbWUgVF9ycl9jdXJyZW50X2ludGVydmFsID0KKyAgICAgICAgICAgIGdfcmFuZG9tX2RvdWJsZV9yYW5nZSAoMC41LCAxLjUpICogc3RhdHMtPm1pbl9pbnRlcnZhbCAqIEdTVF9TRUNPTkQ7CisKKyAgICAgICAgaWYgKFRfcnJfY3VycmVudF9pbnRlcnZhbCA+IGludGVydmFsKSB7CisgICAgICAgICAgR1NUX0RFQlVHICgiQWRqdXN0aW5nIGludGVydmFsIGZvciB0LXJyLWludGVydmFsOiAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAgICAgIiA+ICUiIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAoVF9ycl9jdXJyZW50X2ludGVydmFsKSwKKyAgICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoaW50ZXJ2YWwpKTsKKyAgICAgICAgICBpbnRlcnZhbCA9IFRfcnJfY3VycmVudF9pbnRlcnZhbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBzZXNzLT5uZXh0X3J0Y3BfY2hlY2tfdGltZSA9IGN1cnJlbnRfdGltZSArIGludGVydmFsOworICB9CisKKworICBHU1RfREVCVUcgKCJjYW4gc2VuZCBSVENQIG5vdywgbmV4dCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChzZXNzLT5uZXh0X3J0Y3BfY2hlY2tfdGltZSkpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorY2xvbmVfc3NyY3NfaGFzaHRhYmxlIChnY2hhciAqIGtleSwgUlRQU291cmNlICogc291cmNlLCBHSGFzaFRhYmxlICogaGFzaF90YWJsZSkKK3sKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAoaGFzaF90YWJsZSwga2V5LCBnX29iamVjdF9yZWYgKHNvdXJjZSkpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3JlbW92ZV9jbG9zaW5nX3NvdXJjZXMgKGNvbnN0IGdjaGFyICoga2V5LCBSVFBTb3VyY2UgKiBzb3VyY2UsCisgICAgUmVwb3J0RGF0YSAqIGRhdGEpCit7CisgIGlmIChzb3VyY2UtPmNsb3NpbmcpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKHNvdXJjZS0+c2VuZF9maXIpCisgICAgZGF0YS0+aGF2ZV9maXIgPSBUUlVFOworICBpZiAoc291cmNlLT5zZW5kX3BsaSkKKyAgICBkYXRhLT5oYXZlX3BsaSA9IFRSVUU7CisgIGlmIChzb3VyY2UtPnNlbmRfbmFjaykKKyAgICBkYXRhLT5oYXZlX25hY2sgPSBUUlVFOworCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dlbmVyYXRlX3J0Y3AgKGNvbnN0IGdjaGFyICoga2V5LCBSVFBTb3VyY2UgKiBzb3VyY2UsIFJlcG9ydERhdGEgKiBkYXRhKQoreworICBSVFBTZXNzaW9uICpzZXNzID0gZGF0YS0+c2VzczsKKyAgZ2Jvb2xlYW4gaXNfYnllID0gRkFMU0U7CisgIFJlcG9ydE91dHB1dCAqb3V0cHV0OworCisgIC8qIG9ubHkgZ2VuZXJhdGUgUlRDUCBmb3IgYWN0aXZlIGludGVybmFsIHNvdXJjZXMgKi8KKyAgaWYgKCFzb3VyY2UtPmludGVybmFsIHx8IHNvdXJjZS0+c2VudF9ieWUpCisgICAgcmV0dXJuOworCisgIC8qIGlnbm9yZSBvdGhlciBzb3VyY2VzIHdoZW4gd2UgZG8gdGhlIHRpbWVvdXQgYWZ0ZXIgYSBzY2hlZHVsZWQgQllFICovCisgIGlmIChzZXNzLT5zY2hlZHVsZWRfYnllICYmICFzb3VyY2UtPm1hcmtlZF9ieWUpCisgICAgcmV0dXJuOworCisgIGRhdGEtPnNvdXJjZSA9IHNvdXJjZTsKKworICAvKiBvcGVuIHBhY2tldCAqLworICBzZXNzaW9uX3N0YXJ0X3J0Y3AgKHNlc3MsIGRhdGEpOworCisgIGlmIChzb3VyY2UtPm1hcmtlZF9ieWUpIHsKKyAgICAvKiBzZW5kIEJZRSAqLworICAgIG1ha2Vfc291cmNlX2J5ZSAoc2Vzcywgc291cmNlLCBkYXRhKTsKKyAgICBpc19ieWUgPSBUUlVFOworICB9IGVsc2UgaWYgKCFkYXRhLT5pc19lYXJseSkgeworICAgIC8qIGxvb3Agb3ZlciBhbGwga25vd24gc291cmNlcyBhbmQgYWRkIHJlcG9ydCBibG9ja3MuIElmIHdlIGFyZSBlYXJseSwgd2UKKyAgICAgKiBqdXN0IG1ha2UgYSBtaW5pbWFsIFJUQ1AgcGFja2V0IGFuZCBza2lwIHRoaXMgc3RlcCAqLworICAgIGdfaGFzaF90YWJsZV9mb3JlYWNoIChzZXNzLT5zc3Jjc1tzZXNzLT5tYXNrX2lkeF0sCisgICAgICAgIChHSEZ1bmMpIHNlc3Npb25fcmVwb3J0X2Jsb2NrcywgZGF0YSk7CisgIH0KKyAgaWYgKCFkYXRhLT5oYXNfc2RlcyAmJiAoIWRhdGEtPmlzX2Vhcmx5IHx8ICFzZXNzLT5yZWR1Y2VkX3NpemVfcnRjcCkpCisgICAgc2Vzc2lvbl9zZGVzIChzZXNzLCBkYXRhKTsKKworICBpZiAoZGF0YS0+aGF2ZV9maXIpCisgICAgc2Vzc2lvbl9maXIgKHNlc3MsIGRhdGEpOworCisgIGlmIChkYXRhLT5oYXZlX3BsaSkKKyAgICBnX2hhc2hfdGFibGVfZm9yZWFjaCAoc2Vzcy0+c3NyY3Nbc2Vzcy0+bWFza19pZHhdLAorICAgICAgICAoR0hGdW5jKSBzZXNzaW9uX3BsaSwgZGF0YSk7CisKKyAgaWYgKGRhdGEtPmhhdmVfbmFjaykKKyAgICBnX2hhc2hfdGFibGVfZm9yZWFjaCAoc2Vzcy0+c3NyY3Nbc2Vzcy0+bWFza19pZHhdLAorICAgICAgICAoR0hGdW5jKSBzZXNzaW9uX25hY2ssIGRhdGEpOworCisgIGdzdF9ydGNwX2J1ZmZlcl91bm1hcCAoJmRhdGEtPnJ0Y3BidWYpOworCisgIG91dHB1dCA9IGdfc2xpY2VfbmV3IChSZXBvcnRPdXRwdXQpOworICBvdXRwdXQtPnNvdXJjZSA9IGdfb2JqZWN0X3JlZiAoc291cmNlKTsKKyAgb3V0cHV0LT5pc19ieWUgPSBpc19ieWU7CisgIG91dHB1dC0+YnVmZmVyID0gZGF0YS0+cnRjcDsKKyAgLyogcXVldWUgdGhlIFJUQ1AgcGFja2V0IHRvIHB1c2ggbGF0ZXIgKi8KKyAgZ19xdWV1ZV9wdXNoX3RhaWwgKCZkYXRhLT5vdXRwdXQsIG91dHB1dCk7Cit9CisKK3N0YXRpYyB2b2lkCit1cGRhdGVfZ2VuZXJhdGlvbiAoY29uc3QgZ2NoYXIgKiBrZXksIFJUUFNvdXJjZSAqIHNvdXJjZSwgUmVwb3J0RGF0YSAqIGRhdGEpCit7CisgIFJUUFNlc3Npb24gKnNlc3MgPSBkYXRhLT5zZXNzOworCisgIGlmIChnX2hhc2hfdGFibGVfc2l6ZSAoc291cmNlLT5yZXBvcnRlZF9pbl9zcl9vZikgPj0KKyAgICAgIHNlc3MtPnN0YXRzLmludGVybmFsX3NvdXJjZXMpIHsKKyAgICAvKiBzb3VyY2UgaXMgcmVwb3J0ZWQsIG1vdmUgdG8gbmV4dCBnZW5lcmF0aW9uICovCisgICAgc291cmNlLT5nZW5lcmF0aW9uID0gc2Vzcy0+Z2VuZXJhdGlvbiArIDE7CisgICAgZ19oYXNoX3RhYmxlX3JlbW92ZV9hbGwgKHNvdXJjZS0+cmVwb3J0ZWRfaW5fc3Jfb2YpOworCisgICAgR1NUX0xPRyAoInJlcG9ydGVkIHNvdXJjZSAleCwgbmV3IGdlbmVyYXRpb246ICVkIiwgc291cmNlLT5zc3JjLAorICAgICAgICBzb3VyY2UtPmdlbmVyYXRpb24pOworCisgICAgLyogaWYgd2UgcmVwb3J0ZWQgYWxsIHNvdXJjZXMgaW4gdGhpcyBnZW5lcmF0aW9uLCBtb3ZlIHRvIG5leHQgKi8KKyAgICBpZiAoLS1kYXRhLT5udW1fdG9fcmVwb3J0ID09IDApIHsKKyAgICAgIHNlc3MtPmdlbmVyYXRpb24rKzsKKyAgICAgIEdTVF9ERUJVRyAoImFsbCByZXBvcnRlZCwgZ2VuZXJhdGlvbiBub3cgJXUiLCBzZXNzLT5nZW5lcmF0aW9uKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitydHBfc2Vzc2lvbl9hcmVfYWxsX3NvdXJjZXNfYnllIChSVFBTZXNzaW9uICogc2VzcykKK3sKKyAgR0hhc2hUYWJsZUl0ZXIgaXRlcjsKKyAgUlRQU291cmNlICpzcmM7CisKKyAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJml0ZXIsIHNlc3MtPnNzcmNzW3Nlc3MtPm1hc2tfaWR4XSk7CisgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmaXRlciwgTlVMTCwgKGdwb2ludGVyICopICYgc3JjKSkgeworICAgIGlmIChzcmMtPmludGVybmFsICYmICFzcmMtPnNlbnRfYnllKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fb25fdGltZW91dDoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQGN1cnJlbnRfdGltZTogdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUKKyAqIEBudHBuc3RpbWU6IHRoZSBjdXJyZW50IE5UUCB0aW1lIGluIG5hbm9zZWNvbmRzCisgKiBAcnVubmluZ190aW1lOiB0aGUgY3VycmVudCBydW5uaW5nX3RpbWUgb2YgdGhlIHBpcGVsaW5lCisgKgorICogUGVyZm9ybSBtYWludGVuYW5jZSBhY3Rpb25zIGFmdGVyIHRoZSB0aW1lb3V0IG9idGFpbmVkIHdpdGgKKyAqIHJ0cF9zZXNzaW9uX25leHRfdGltZW91dCgpIGV4cGlyZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHBlcmZvcm0gdGltZW91dHMgb2YgcmVjZWl2ZXJzIGFuZCBzZW5kZXJzLCBzZW5kIGEgQllFCisgKiBwYWNrZXQgb3IgZ2VuZXJhdGUgUlRDUCBwYWNrZXRzIHdpdGggY3VycmVudCBzZXNzaW9uIHN0YXRzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGNhbGwgdGhlICNSVFBTZXNzaW9uU2VuZFJUQ1AgY2FsbGJhY2ssIHBvc3NpYmx5IG11bHRpcGxlCisgKiB0aW1lcywgZm9yIGVhY2ggcGFja2V0IHRoYXQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KKyAqCisgKiBSZXR1cm5zOiBhICNHc3RGbG93UmV0dXJuLgorICovCitHc3RGbG93UmV0dXJuCitydHBfc2Vzc2lvbl9vbl90aW1lb3V0IChSVFBTZXNzaW9uICogc2VzcywgR3N0Q2xvY2tUaW1lIGN1cnJlbnRfdGltZSwKKyAgICBndWludDY0IG50cG5zdGltZSwgR3N0Q2xvY2tUaW1lIHJ1bm5pbmdfdGltZSkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXN1bHQgPSBHU1RfRkxPV19PSzsKKyAgUmVwb3J0RGF0YSBkYXRhID0geyBHU1RfUlRDUF9CVUZGRVJfSU5JVCB9OworICBHSGFzaFRhYmxlICp0YWJsZV9jb3B5OworICBSZXBvcnRPdXRwdXQgKm91dHB1dDsKKyAgZ2Jvb2xlYW4gYWxsX2VtcHR5ID0gRkFMU0U7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFJUUF9JU19TRVNTSU9OIChzZXNzKSwgR1NUX0ZMT1dfRVJST1IpOworCisgIEdTVF9ERUJVRyAoInJlcG9ydGluZyBhdCAlIiBHU1RfVElNRV9GT1JNQVQgIiwgTlRQIHRpbWUgJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAiLCBydW5uaW5nLXRpbWUgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChjdXJyZW50X3RpbWUpLAorICAgICAgR1NUX1RJTUVfQVJHUyAobnRwbnN0aW1lKSwgR1NUX1RJTUVfQVJHUyAocnVubmluZ190aW1lKSk7CisKKyAgZGF0YS5zZXNzID0gc2VzczsKKyAgZGF0YS5jdXJyZW50X3RpbWUgPSBjdXJyZW50X3RpbWU7CisgIGRhdGEubnRwbnN0aW1lID0gbnRwbnN0aW1lOworICBkYXRhLnJ1bm5pbmdfdGltZSA9IHJ1bm5pbmdfdGltZTsKKyAgZGF0YS5udW1fdG9fcmVwb3J0ID0gMDsKKyAgZGF0YS5tYXlfc3VwcHJlc3MgPSBGQUxTRTsKKyAgZGF0YS5uYWNrZWRfc2VxbnVtcyA9IDA7CisgIGdfcXVldWVfaW5pdCAoJmRhdGEub3V0cHV0KTsKKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgLyogZ2V0IGEgbmV3IGludGVydmFsLCB3ZSBuZWVkIHRoaXMgZm9yIHZhcmlvdXMgY2xlYW51cHMgZXRjICovCisgIGRhdGEuaW50ZXJ2YWwgPSBjYWxjdWxhdGVfcnRjcF9pbnRlcnZhbCAoc2VzcywgVFJVRSwgc2Vzcy0+Zmlyc3RfcnRjcCk7CisKKyAgR1NUX0RFQlVHICgiaW50ZXJ2YWwgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChkYXRhLmludGVydmFsKSk7CisKKyAgLyogd2UgbmVlZCBhbiBpbnRlcm5hbCBzb3VyY2Ugbm93ICovCisgIGlmIChzZXNzLT5zdGF0cy5pbnRlcm5hbF9zb3VyY2VzID09IDApIHsKKyAgICBSVFBTb3VyY2UgKnNvdXJjZTsKKyAgICBnYm9vbGVhbiBjcmVhdGVkOworCisgICAgc291cmNlID0gb2J0YWluX2ludGVybmFsX3NvdXJjZSAoc2Vzcywgc2Vzcy0+c3VnZ2VzdGVkX3NzcmMsICZjcmVhdGVkLAorICAgICAgICBjdXJyZW50X3RpbWUpOworICAgIHNlc3MtPmludGVybmFsX3NzcmNfc2V0ID0gVFJVRTsKKworICAgIGlmIChjcmVhdGVkKQorICAgICAgb25fbmV3X3NlbmRlcl9zc3JjIChzZXNzLCBzb3VyY2UpOworCisgICAgZ19vYmplY3RfdW5yZWYgKHNvdXJjZSk7CisgIH0KKworICBzZXNzLT5jb25mbGljdGluZ19hZGRyZXNzZXMgPQorICAgICAgdGltZW91dF9jb25mbGljdGluZ19hZGRyZXNzZXMgKHNlc3MtPmNvbmZsaWN0aW5nX2FkZHJlc3NlcywgY3VycmVudF90aW1lKTsKKworICAvKiBNYWtlIGEgbG9jYWwgY29weSBvZiB0aGUgaGFzaHRhYmxlLiBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSB0aGUKKyAgICogY2xlYW51cCBzdGFnZSBiZWxvdyByZWxlYXNlcyB0aGUgc2Vzc2lvbiBsb2NrLiAqLworICB0YWJsZV9jb3B5ID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnX29iamVjdF91bnJlZik7CisgIGdfaGFzaF90YWJsZV9mb3JlYWNoIChzZXNzLT5zc3Jjc1tzZXNzLT5tYXNrX2lkeF0sCisgICAgICAoR0hGdW5jKSBjbG9uZV9zc3Jjc19oYXNodGFibGUsIHRhYmxlX2NvcHkpOworCisgIC8qIENsZWFuIHVwIHRoZSBzZXNzaW9uLCBtYXJrIHRoZSBzb3VyY2UgZm9yIHJlbW92aW5nLCB0aGlzIG1pZ2h0IHJlbGVhc2UgdGhlCisgICAqIHNlc3Npb24gbG9jay4gKi8KKyAgZ19oYXNoX3RhYmxlX2ZvcmVhY2ggKHRhYmxlX2NvcHksIChHSEZ1bmMpIHNlc3Npb25fY2xlYW51cCwgJmRhdGEpOworICBnX2hhc2hfdGFibGVfZGVzdHJveSAodGFibGVfY29weSk7CisKKyAgLyogTm93IHJlbW92ZSB0aGUgbWFya2VkIHNvdXJjZXMgKi8KKyAgZ19oYXNoX3RhYmxlX2ZvcmVhY2hfcmVtb3ZlIChzZXNzLT5zc3Jjc1tzZXNzLT5tYXNrX2lkeF0sCisgICAgICAoR0hSRnVuYykgcmVtb3ZlX2Nsb3Npbmdfc291cmNlcywgJmRhdGEpOworCisgIC8qIHVwZGF0ZSBwb2ludC10by1wb2ludCBzdGF0dXMgKi8KKyAgc2Vzc2lvbl91cGRhdGVfcHRwIChzZXNzKTsKKworICAvKiBzZWUgaWYgd2UgbmVlZCB0byBnZW5lcmF0ZSBTUiBvciBSUiBwYWNrZXRzICovCisgIGlmICghaXNfcnRjcF90aW1lIChzZXNzLCBjdXJyZW50X3RpbWUsICZkYXRhKSkKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogY2hlY2sgaWYgYWxsIHRoZSBidWZmZXJzIGFyZSBlbXB0eSBhZmVyIGdlbmVyYXRpb24gKi8KKyAgYWxsX2VtcHR5ID0gVFJVRTsKKworICBHU1RfREVCVUcKKyAgICAgICgiZG9pbmcgUlRDUCBnZW5lcmF0aW9uICV1IGZvciAldSBzb3VyY2VzLCBlYXJseSAlZCwgbWF5IHN1cHByZXNzICVkIiwKKyAgICAgIHNlc3MtPmdlbmVyYXRpb24sIGRhdGEubnVtX3RvX3JlcG9ydCwgZGF0YS5pc19lYXJseSwgZGF0YS5tYXlfc3VwcHJlc3MpOworCisgIC8qIGdlbmVyYXRlIFJUQ1AgZm9yIGFsbCBpbnRlcm5hbCBzb3VyY2VzICovCisgIGdfaGFzaF90YWJsZV9mb3JlYWNoIChzZXNzLT5zc3Jjc1tzZXNzLT5tYXNrX2lkeF0sCisgICAgICAoR0hGdW5jKSBnZW5lcmF0ZV9ydGNwLCAmZGF0YSk7CisKKyAgLyogdXBkYXRlIHRoZSBnZW5lcmF0aW9uIGZvciBhbGwgdGhlIHNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gcmVwb3J0ZWQgKi8KKyAgZ19oYXNoX3RhYmxlX2ZvcmVhY2ggKHNlc3MtPnNzcmNzW3Nlc3MtPm1hc2tfaWR4XSwKKyAgICAgIChHSEZ1bmMpIHVwZGF0ZV9nZW5lcmF0aW9uLCAmZGF0YSk7CisKKyAgLyogd2Uga2VlcCB0cmFjayBvZiB0aGUgbGFzdCByZXBvcnQgdGltZSBpbiBvcmRlciB0byB0aW1lb3V0IGluYWN0aXZlCisgICAqIHJlY2VpdmVycyBvciBzZW5kZXJzICovCisgIGlmICghZGF0YS5pc19lYXJseSkgeworICAgIEdTVF9ERUJVRyAoIlRpbWUgc2luY2UgbGFzdCByZWd1bGFyIFJUQ1A6ICUiIEdTVF9USU1FX0ZPUk1BVCAiIC0gJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFUICIgPSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGRhdGEuY3VycmVudF90aW1lKSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoc2Vzcy0+bGFzdF9ydGNwX3NlbmRfdGltZSksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGRhdGEuY3VycmVudF90aW1lIC0gc2Vzcy0+bGFzdF9ydGNwX3NlbmRfdGltZSkpOworICAgIHNlc3MtPmxhc3RfcnRjcF9zZW5kX3RpbWUgPSBkYXRhLmN1cnJlbnRfdGltZTsKKyAgfQorCisgIEdTVF9ERUJVRyAoIlRpbWUgc2luY2UgbGFzdCBSVENQOiAlIiBHU1RfVElNRV9GT1JNQVQgIiAtICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiA9ICUiIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAoZGF0YS5jdXJyZW50X3RpbWUpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoc2Vzcy0+bGFzdF9ydGNwX2NoZWNrX3RpbWUpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoZGF0YS5jdXJyZW50X3RpbWUgLSBzZXNzLT5sYXN0X3J0Y3BfY2hlY2tfdGltZSkpOworICBzZXNzLT5sYXN0X3J0Y3BfY2hlY2tfdGltZSA9IGRhdGEuY3VycmVudF90aW1lOworICBzZXNzLT5maXJzdF9ydGNwID0gRkFMU0U7CisgIHNlc3MtPm5leHRfZWFybHlfcnRjcF90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgc2Vzcy0+c2NoZWR1bGVkX2J5ZSA9IEZBTFNFOworCitkb25lOgorICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworCisgIC8qIG5vdGlmeSBhYm91dCB1cGRhdGVkIHN0YXRpc3RpY3MgKi8KKyAgZ19vYmplY3Rfbm90aWZ5IChHX09CSkVDVCAoc2VzcyksICJzdGF0cyIpOworCisgIC8qIHB1c2ggb3V0IHRoZSBSVENQIHBhY2tldHMgKi8KKyAgd2hpbGUgKChvdXRwdXQgPSBnX3F1ZXVlX3BvcF9oZWFkICgmZGF0YS5vdXRwdXQpKSkgeworICAgIGdib29sZWFuIGRvX25vdF9zdXBwcmVzcywgZW1wdHlfYnVmZmVyOworICAgIEdzdEJ1ZmZlciAqYnVmZmVyID0gb3V0cHV0LT5idWZmZXI7CisgICAgUlRQU291cmNlICpzb3VyY2UgPSBvdXRwdXQtPnNvdXJjZTsKKworICAgIC8qIEdpdmUgdGhlIHVzZXIgYSBjaGFuZ2UgdG8gYWRkIGl0cyBvd24gcGFja2V0ICovCisgICAgZ19zaWduYWxfZW1pdCAoc2VzcywgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fU0VORElOR19SVENQXSwgMCwKKyAgICAgICAgYnVmZmVyLCBkYXRhLmlzX2Vhcmx5LCAmZG9fbm90X3N1cHByZXNzKTsKKworICAgIGVtcHR5X2J1ZmZlciA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcikgPT0gMDsKKworICAgIGlmICghZW1wdHlfYnVmZmVyKQorICAgICAgYWxsX2VtcHR5ID0gRkFMU0U7CisKKyAgICBpZiAoc2Vzcy0+Y2FsbGJhY2tzLnNlbmRfcnRjcCAmJgorICAgICAgICAhZW1wdHlfYnVmZmVyICYmIChkb19ub3Rfc3VwcHJlc3MgfHwgIWRhdGEubWF5X3N1cHByZXNzKSkgeworICAgICAgZ3VpbnQgcGFja2V0X3NpemU7CisKKyAgICAgIHBhY2tldF9zaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSArIHNlc3MtPmhlYWRlcl9sZW47CisKKyAgICAgIFVQREFURV9BVkcgKHNlc3MtPnN0YXRzLmF2Z19ydGNwX3BhY2tldF9zaXplLCBwYWNrZXRfc2l6ZSk7CisgICAgICBHU1RfREVCVUcgKCIlcCwgc2VuZGluZyBSVENQIHBhY2tldCwgYXZnIHNpemUgJXUsICV1IiwgJnNlc3MtPnN0YXRzLAorICAgICAgICAgIHNlc3MtPnN0YXRzLmF2Z19ydGNwX3BhY2tldF9zaXplLCBwYWNrZXRfc2l6ZSk7CisgICAgICByZXN1bHQgPQorICAgICAgICAgIHNlc3MtPmNhbGxiYWNrcy5zZW5kX3J0Y3AgKHNlc3MsIHNvdXJjZSwgYnVmZmVyLAorICAgICAgICAgIHJ0cF9zZXNzaW9uX2FyZV9hbGxfc291cmNlc19ieWUgKHNlc3MpLCBzZXNzLT5zZW5kX3J0Y3BfdXNlcl9kYXRhKTsKKworICAgICAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgICAgICBzZXNzLT5zdGF0cy5uYWNrc19zZW50ICs9IGRhdGEubmFja2VkX3NlcW51bXM7CisgICAgICBvbl9zZW5kZXJfc3NyY19hY3RpdmUgKHNlc3MsIHNvdXJjZSk7CisgICAgICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUcgKCJmcmVlaW5nIHBhY2tldCBjYWxsYmFjazogJXAiCisgICAgICAgICAgIiBlbXB0eV9idWZmZXI6ICVkLCAiCisgICAgICAgICAgIiBkb19ub3Rfc3VwcHJlc3M6ICVkIG1heV9zdXBwcmVzczogJWQiLCBzZXNzLT5jYWxsYmFja3Muc2VuZF9ydGNwLAorICAgICAgICAgIGVtcHR5X2J1ZmZlciwgZG9fbm90X3N1cHByZXNzLCBkYXRhLm1heV9zdXBwcmVzcyk7CisgICAgICBpZiAoIWVtcHR5X2J1ZmZlcikgeworICAgICAgICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgICAgICAgc2Vzcy0+c3RhdHMubmFja3NfZHJvcHBlZCArPSBkYXRhLm5hY2tlZF9zZXFudW1zOworICAgICAgICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworICAgICAgfQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICB9CisgICAgZ19vYmplY3RfdW5yZWYgKHNvdXJjZSk7CisgICAgZ19zbGljZV9mcmVlIChSZXBvcnRPdXRwdXQsIG91dHB1dCk7CisgIH0KKworICBpZiAoYWxsX2VtcHR5KQorICAgIEdTVF9FUlJPUiAoImdlbmVyYXRlZCBlbXB0eSBSVENQIG1lc3NhZ2VzIGZvciBhbGwgdGhlIHNvdXJjZXMiKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX3JlcXVlc3RfZWFybHlfcnRjcDoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQGN1cnJlbnRfdGltZTogdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUKKyAqIEBtYXhfZGVsYXk6IG1heGltdW0gZGVsYXkKKyAqCisgKiBSZXF1ZXN0IHRyYW5zbWlzc2lvbiBvZiBlYXJseSBSVENQCisgKgorICogUmV0dXJuczogJVRSVUUgaWYgdGhlIHJlbGF0ZWQgUlRDUCBjYW4gYmUgc2NoZWR1bGVkLgorICovCitnYm9vbGVhbgorcnRwX3Nlc3Npb25fcmVxdWVzdF9lYXJseV9ydGNwIChSVFBTZXNzaW9uICogc2VzcywgR3N0Q2xvY2tUaW1lIGN1cnJlbnRfdGltZSwKKyAgICBHc3RDbG9ja1RpbWUgbWF4X2RlbGF5KQoreworICBHc3RDbG9ja1RpbWUgVF9kaXRoZXJfbWF4LCBUX3JyLCBvZmZzZXQgPSAwOworICBnYm9vbGVhbiByZXQ7CisgIGdib29sZWFuIGFsbG93X2Vhcmx5OworCisgIC8qIEltcGxlbWVudHMgdGhlIGFsZ29yaXRobSBkZXNjcmliZWQgaW4gUkZDIDQ1ODUgc2VjdGlvbiAzLjUuMiAqLworCisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworCisgIC8qIFdlIGFzc3VtZSBhIGZlZWRiYWNrIHByb2ZpbGUgaWYgc29tZXRoaW5nIGlzIHJlcXVlc3RpbmcgUlRDUAorICAgKiB0byBiZSBzZW50ICovCisgIHNlc3MtPnJ0cF9wcm9maWxlID0gR1NUX1JUUF9QUk9GSUxFX0FWUEY7CisKKyAgLyogQ2hlY2sgaWYgYWxyZWFkeSByZXF1ZXN0ZWQgKi8KKyAgLyogIFJGQyA0NTg1IHNlY3Rpb24gMy41LjIgc3RlcCAyICovCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc2Vzcy0+bmV4dF9lYXJseV9ydGNwX3RpbWUpKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNlc3MsICJhbHJlYWR5IGhhdmUgbmV4dCBlYXJseSBydGNwIHRpbWUiKTsKKyAgICByZXQgPSAoY3VycmVudF90aW1lICsgbWF4X2RlbGF5ID4gc2Vzcy0+bmV4dF9lYXJseV9ydGNwX3RpbWUpOworICAgIGdvdG8gZW5kOworICB9CisKKyAgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWUpKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNlc3MsICJubyBuZXh0IFJUQ1AgY2hlY2sgdGltZSIpOworICAgIHJldCA9IEZBTFNFOworICAgIGdvdG8gZW5kOworICB9CisKKyAgLyogUkZDIDQ1ODUgc2VjdGlvbiAzLjUuMyBzdGVwIDEKKyAgICogSWYgbm8gcmVndWxhciBSVENQIHBhY2tldCBoYXMgYmVlbiBzZW50IGJlZm9yZSwgdGhlbiBhIHJlZ3VsYXIKKyAgICogUlRDUCBwYWNrZXQgaGFzIHRvIGJlIHNjaGVkdWxlZCBmaXJzdCBhbmQgRkIgbWVzc2FnZXMgbWlnaHQgYmUKKyAgICogaW5jbHVkZWQgdGhlcmUKKyAgICovCisgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHNlc3MtPmxhc3RfcnRjcF9zZW5kX3RpbWUpKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNlc3MsICJubyBSVENQIHNlbnQgeWV0Iik7CisKKyAgICBpZiAoY3VycmVudF90aW1lICsgbWF4X2RlbGF5ID4gc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWUpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzZXNzLAorICAgICAgICAgICJuZXh0IHNjaGVkdWxlZCB0aW1lIGlzIHNvb24gJSIgR1NUX1RJTUVfRk9STUFUICIgKyAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAiID4gJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChjdXJyZW50X3RpbWUpLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKG1heF9kZWxheSksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWUpKTsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzZXNzLAorICAgICAgICAgICJjYW4ndCBhbGxvdyBlYXJseSBmZWVkYmFjaywgbmV4dCBzY2hlZHVsZWQgdGltZSBpcyB0b28gbGF0ZSAlIgorICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiICsgJSIgR1NUX1RJTUVfRk9STUFUICIgPCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoY3VycmVudF90aW1lKSwgR1NUX1RJTUVfQVJHUyAobWF4X2RlbGF5KSwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChzZXNzLT5uZXh0X3J0Y3BfY2hlY2tfdGltZSkpOworICAgICAgcmV0ID0gRkFMU0U7CisgICAgfQorICAgIGdvdG8gZW5kOworICB9CisKKyAgVF9yciA9IHNlc3MtPmxhc3RfcnRjcF9pbnRlcnZhbDsKKworICAvKiAgUkZDIDQ1ODUgc2VjdGlvbiAzLjUuMiBzdGVwIDJiICovCisgIC8qIElmIHRoZSB0b3RhbCBzb3VyY2VzIGlzIDw9MiwgdGhlbiB0aGVyZSBpcyBvbmx5IHVzIGFuZCBvbmUgcGVlciAqLworICAvKiBXaGVuIHRoZXJlIGlzIG9uZSBhdXhpbGlhcnkgc3RyZWFtIHRoZSBzZXNzaW9uIGNhbiBzdGlsbCBkbyBwb2ludAorICAgKiB0byBwb2ludC4KKyAgICovCisgIGlmIChzZXNzLT5pc19kb2luZ19wdHApIHsKKyAgICBUX2RpdGhlcl9tYXggPSAwOworICB9IGVsc2UgeworICAgIC8qIERpdmlkZSBieSAyIGJlY2F1c2UgbCA9IDAuNSAqLworICAgIFRfZGl0aGVyX21heCA9IFRfcnI7CisgICAgVF9kaXRoZXJfbWF4IC89IDI7CisgIH0KKworICAvKiAgUkZDIDQ1ODUgc2VjdGlvbiAzLjUuMiBzdGVwIDMgKi8KKyAgaWYgKGN1cnJlbnRfdGltZSArIFRfZGl0aGVyX21heCA+IHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNlc3MsCisgICAgICAgICJkb24ndCBzZW5kIGJlY2F1c2Ugb2YgZGl0aGVyLCBuZXh0IHNjaGVkdWxlZCB0aW1lIGlzIHRvbyBzb29uICUiCisgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiICsgJSIgR1NUX1RJTUVfRk9STUFUICIgPiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGN1cnJlbnRfdGltZSksIEdTVF9USU1FX0FSR1MgKFRfZGl0aGVyX21heCksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lKSk7CisgICAgcmV0ID0gVF9kaXRoZXJfbWF4IDw9IG1heF9kZWxheTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIC8qICBSRkMgNDU4NSBzZWN0aW9uIDMuNS4yIHN0ZXAgNGEgYW5kCisgICAqICBSRkMgNDU4NSBzZWN0aW9uIDMuNS4yIHN0ZXAgNiAqLworICBhbGxvd19lYXJseSA9IEZBTFNFOworICBpZiAoc2Vzcy0+bGFzdF9ydGNwX2NoZWNrX3RpbWUgPT0gc2Vzcy0+bGFzdF9ydGNwX3NlbmRfdGltZSkgeworICAgIC8qIExhc3QgdGltZSB3ZSBzZW50IGEgZnVsbCBSVENQIHBhY2tldCwgd2UgY2FuIG5vdyBpbW1lZGlhdGVseQorICAgICAqIHNlbmQgYW4gZWFybHkgb25lIGFzIGFsbG93X2Vhcmx5IHdhcyByZXNldCB0byBUUlVFICovCisgICAgYWxsb3dfZWFybHkgPSBUUlVFOworICB9IGVsc2UgaWYgKHNlc3MtPmxhc3RfcnRjcF9jaGVja190aW1lICsgVF9yciA8PSBjdXJyZW50X3RpbWUgKyBtYXhfZGVsYXkpIHsKKyAgICAvKiBMYXN0IHBhY2tldCB3ZSBzZW50IHdhcyBhbiBlYXJseSBSVENQIHBhY2tldCBhbmQgbW9yZSB0aGFuCisgICAgICogVF9yciBoYXMgcGFzc2VkIHNpbmNlIHRoZW4sIG1lYW5pbmcgd2Ugd291bGQgaGF2ZSBzdXBwcmVzc2VkCisgICAgICogYSByZWd1bGFyIFJUQ1AgcGFja2V0IGFscmVhZHkgYW5kIHJlc2V0IGFsbG93X2Vhcmx5IHRvIFRSVUUgKi8KKyAgICBhbGxvd19lYXJseSA9IFRSVUU7CisKKyAgICAvKiBXZSBoYXZlIHRvIG9mZnNldCBhIGJpdCBhcyBUX3JyIGhhcyBub3QgcGFzc2VkIHlldCwgYnV0IHdpbGwgYmVmb3JlCisgICAgICogbWF4X2RlbGF5ICovCisgICAgaWYgKHNlc3MtPmxhc3RfcnRjcF9jaGVja190aW1lICsgVF9yciA+IGN1cnJlbnRfdGltZSkKKyAgICAgIG9mZnNldCA9IChzZXNzLT5sYXN0X3J0Y3BfY2hlY2tfdGltZSArIFRfcnIpIC0gY3VycmVudF90aW1lOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlc3MsCisgICAgICAgICJjYW4ndCBhbGxvdyBlYXJseSBSVENQIHlldDogbGFzdCByZWd1bGFyICUiIEdTVF9USU1FX0ZPUk1BVCAiLCAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiArICUiIEdTVF9USU1FX0ZPUk1BVCAiID4gJSIgR1NUX1RJTUVfRk9STUFUICIgKyAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHNlc3MtPmxhc3RfcnRjcF9zZW5kX3RpbWUpLAorICAgICAgICBHU1RfVElNRV9BUkdTIChzZXNzLT5sYXN0X3J0Y3BfY2hlY2tfdGltZSksIEdTVF9USU1FX0FSR1MgKFRfcnIpLAorICAgICAgICBHU1RfVElNRV9BUkdTIChjdXJyZW50X3RpbWUpLCBHU1RfVElNRV9BUkdTIChtYXhfZGVsYXkpKTsKKyAgfQorCisgIGlmICghYWxsb3dfZWFybHkpIHsKKyAgICAvKiBJZ25vcmUgdGhlIHJlcXVlc3QgYSBzY2hlZHVsZWQgcGFja2V0IHdpbGwgYmUgaW4gdGltZSBhbnl3YXkgKi8KKyAgICBpZiAoY3VycmVudF90aW1lICsgbWF4X2RlbGF5ID4gc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWUpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzZXNzLAorICAgICAgICAgICJuZXh0IHNjaGVkdWxlZCB0aW1lIGlzIHNvb24gJSIgR1NUX1RJTUVfRk9STUFUICIgKyAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAiID4gJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChjdXJyZW50X3RpbWUpLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKG1heF9kZWxheSksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWUpKTsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzZXNzLAorICAgICAgICAgICJjYW4ndCBhbGxvdyBlYXJseSBmZWVkYmFjayBhbmQgbmV4dCBzY2hlZHVsZWQgdGltZSBpcyB0b28gbGF0ZSAlIgorICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiICsgJSIgR1NUX1RJTUVfRk9STUFUICIgPCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoY3VycmVudF90aW1lKSwgR1NUX1RJTUVfQVJHUyAobWF4X2RlbGF5KSwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChzZXNzLT5uZXh0X3J0Y3BfY2hlY2tfdGltZSkpOworICAgICAgcmV0ID0gRkFMU0U7CisgICAgfQorICAgIGdvdG8gZW5kOworICB9CisKKyAgLyogIFJGQyA0NTg1IHNlY3Rpb24gMy41LjIgc3RlcCA0YiAqLworICBpZiAoVF9kaXRoZXJfbWF4KSB7CisgICAgLyogU2NoZWR1bGUgYW4gZWFybHkgdHJhbnNtaXNzaW9uIGxhdGVyICovCisgICAgc2Vzcy0+bmV4dF9lYXJseV9ydGNwX3RpbWUgPSBnX3JhbmRvbV9kb3VibGUgKCkgKiBUX2RpdGhlcl9tYXggKworICAgICAgICBjdXJyZW50X3RpbWUgKyBvZmZzZXQ7CisgIH0gZWxzZSB7CisgICAgLyogSWYgbm8gZGl0aGVyaW5nLCBzY2hlZHVsZSBpdCBmb3IgTk9XICovCisgICAgc2Vzcy0+bmV4dF9lYXJseV9ydGNwX3RpbWUgPSBjdXJyZW50X3RpbWUgKyBvZmZzZXQ7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAoc2VzcywgIm5leHQgZWFybHkgUlRDUCB0aW1lICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiwgbmV4dCByZWd1bGFyIFJUQ1AgdGltZSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChzZXNzLT5uZXh0X2Vhcmx5X3J0Y3BfdGltZSksCisgICAgICBHU1RfVElNRV9BUkdTIChzZXNzLT5uZXh0X3J0Y3BfY2hlY2tfdGltZSkpOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworCisgIC8qIG5vdGlmeSBhcHAgb2YgbmVlZCB0byBzZW5kIHBhY2tldCBlYXJseQorICAgKiBhbmQgdGhlcmVmb3JlIG9mIHRpbWVvdXQgY2hhbmdlICovCisgIGlmIChzZXNzLT5jYWxsYmFja3MucmVjb25zaWRlcikKKyAgICBzZXNzLT5jYWxsYmFja3MucmVjb25zaWRlciAoc2Vzcywgc2Vzcy0+cmVjb25zaWRlcl91c2VyX2RhdGEpOworCisgIHJldHVybiBUUlVFOworCitlbmQ6CisKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3J0cF9zZXNzaW9uX3NlbmRfcnRjcCAoUlRQU2Vzc2lvbiAqIHNlc3MsIEdzdENsb2NrVGltZSBtYXhfZGVsYXkpCit7CisgIEdzdENsb2NrVGltZSBub3c7CisKKyAgaWYgKCFzZXNzLT5jYWxsYmFja3Muc2VuZF9ydGNwKQorICAgIHJldHVybiBGQUxTRTsKKworICBub3cgPSBzZXNzLT5jYWxsYmFja3MucmVxdWVzdF90aW1lIChzZXNzLCBzZXNzLT5yZXF1ZXN0X3RpbWVfdXNlcl9kYXRhKTsKKworICByZXR1cm4gcnRwX3Nlc3Npb25fcmVxdWVzdF9lYXJseV9ydGNwIChzZXNzLCBub3csIG1heF9kZWxheSk7Cit9CisKK2dib29sZWFuCitydHBfc2Vzc2lvbl9yZXF1ZXN0X2tleV91bml0IChSVFBTZXNzaW9uICogc2VzcywgZ3VpbnQzMiBzc3JjLAorICAgIGdib29sZWFuIGZpciwgZ2ludCBjb3VudCkKK3sKKyAgUlRQU291cmNlICpzcmM7CisKKyAgaWYgKCFydHBfc2Vzc2lvbl9zZW5kX3J0Y3AgKHNlc3MsIDUgKiBHU1RfU0VDT05EKSkgeworICAgIEdTVF9ERUJVRyAoIkZJUi9QTEkgbm90IHNlbnQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgc3JjID0gZmluZF9zb3VyY2UgKHNlc3MsIHNzcmMpOworICBpZiAoc3JjID09IE5VTEwpCisgICAgZ290byBub19zb3VyY2U7CisKKyAgaWYgKGZpcikgeworICAgIHNyYy0+c2VuZF9wbGkgPSBGQUxTRTsKKyAgICBzcmMtPnNlbmRfZmlyID0gVFJVRTsKKworICAgIGlmIChjb3VudCA9PSAtMSB8fCBjb3VudCAhPSBzcmMtPmxhc3RfZmlyX2NvdW50KQorICAgICAgc3JjLT5jdXJyZW50X3NlbmRfZmlyX3NlcW51bSsrOworICAgIHNyYy0+bGFzdF9maXJfY291bnQgPSBjb3VudDsKKyAgfSBlbHNlIGlmICghc3JjLT5zZW5kX2ZpcikgeworICAgIHNyYy0+c2VuZF9wbGkgPSBUUlVFOworICB9CisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub19zb3VyY2U6CisgIHsKKyAgICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX3JlcXVlc3RfbmFjazoKKyAqIEBzZXNzOiBhICNSVFBTZXNzaW9uCisgKiBAc3NyYzogdGhlIFNTUkMKKyAqIEBzZXFudW06IHRoZSBtaXNzaW5nIHNlcW51bQorICogQG1heF9kZWxheTogbWF4IGRlbGF5IHRvIHJlcXVlc3QgTkFDSworICoKKyAqIFJlcXVlc3Qgc2NoZWR1bGluZyBvZiBhIE5BQ0sgZmVlZGJhY2sgcGFja2V0IGZvciBAc2VxbnVtIGluIEBzc3JjLgorICoKKyAqIFJldHVybnM6ICVUUlVFIGlmIHRoZSBOQUNLIGZlZWRiYWNrIGNvdWxkIGJlIHNjaGVkdWxlZAorICovCitnYm9vbGVhbgorcnRwX3Nlc3Npb25fcmVxdWVzdF9uYWNrIChSVFBTZXNzaW9uICogc2VzcywgZ3VpbnQzMiBzc3JjLCBndWludDE2IHNlcW51bSwKKyAgICBHc3RDbG9ja1RpbWUgbWF4X2RlbGF5KQoreworICBSVFBTb3VyY2UgKnNvdXJjZTsKKworICBpZiAoIXJ0cF9zZXNzaW9uX3NlbmRfcnRjcCAoc2VzcywgbWF4X2RlbGF5KSkgeworICAgIEdTVF9ERUJVRyAoIk5BQ0sgbm90IHNlbnQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgc291cmNlID0gZmluZF9zb3VyY2UgKHNlc3MsIHNzcmMpOworICBpZiAoc291cmNlID09IE5VTEwpCisgICAgZ290byBub19zb3VyY2U7CisKKyAgR1NUX0RFQlVHICgicmVxdWVzdCBOQUNLIGZvciAlMDh4LCAjJXUiLCBzc3JjLCBzZXFudW0pOworICBydHBfc291cmNlX3JlZ2lzdGVyX25hY2sgKHNvdXJjZSwgc2VxbnVtKTsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK25vX3NvdXJjZToKKyAgeworICAgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmggYi9nc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNhOGE4MgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaApAQCAtMCwwICsxLDQwNCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19SVFBfU0VTU0lPTl9IX18KKyNkZWZpbmUgX19SVFBfU0VTU0lPTl9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgInJ0cHNvdXJjZS5oIgorCit0eXBlZGVmIHN0cnVjdCBfUlRQU2Vzc2lvbiBSVFBTZXNzaW9uOwordHlwZWRlZiBzdHJ1Y3QgX1JUUFNlc3Npb25DbGFzcyBSVFBTZXNzaW9uQ2xhc3M7CisKKyNkZWZpbmUgUlRQX1RZUEVfU0VTU0lPTiAgICAgICAgICAgICAocnRwX3Nlc3Npb25fZ2V0X3R5cGUoKSkKKyNkZWZpbmUgUlRQX1NFU1NJT04oc2VzcykgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKHNlc3MpLFJUUF9UWVBFX1NFU1NJT04sUlRQU2Vzc2lvbikpCisjZGVmaW5lIFJUUF9TRVNTSU9OX0NMQVNTKGtsYXNzKSAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksUlRQX1RZUEVfU0VTU0lPTixSVFBTZXNzaW9uQ2xhc3MpKQorI2RlZmluZSBSVFBfSVNfU0VTU0lPTihzZXNzKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgoc2VzcyksUlRQX1RZUEVfU0VTU0lPTikpCisjZGVmaW5lIFJUUF9JU19TRVNTSU9OX0NMQVNTKGtsYXNzKSAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksUlRQX1RZUEVfU0VTU0lPTikpCisjZGVmaW5lIFJUUF9TRVNTSU9OX0NBU1Qoc2VzcykgICAgICAgKChSVFBTZXNzaW9uICopKHNlc3MpKQorCisjZGVmaW5lIFJUUF9TRVNTSU9OX0xPQ0soc2VzcykgICAgIChnX211dGV4X2xvY2sgKCYoc2VzcyktPmxvY2spKQorI2RlZmluZSBSVFBfU0VTU0lPTl9VTkxPQ0soc2VzcykgICAoZ19tdXRleF91bmxvY2sgKCYoc2VzcyktPmxvY2spKQorCisvKioKKyAqIFJUUFNlc3Npb25Qcm9jZXNzUlRQOgorICogQHNlc3M6IGFuICNSVFBTZXNzaW9uCisgKiBAc3JjOiB0aGUgI1JUUFNvdXJjZQorICogQGJ1ZmZlcjogdGhlIFJUUCBidWZmZXIgcmVhZHkgZm9yIHByb2Nlc3NpbmcKKyAqIEB1c2VyX2RhdGE6IHVzZXIgZGF0YSBzcGVjaWZpZWQgd2hlbiByZWdpc3RlcmluZworICoKKyAqIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbiBAc2VzcyBoYXMgQGJ1ZmZlciByZWFkeSBmb3IgZnVydGhlcgorICogcHJvY2Vzc2luZy4gUHJvY2Vzc2luZyB0aGUgYnVmZmVyIHR5cGljYWxseSBpbmNsdWRlcyBkZWNvZGluZyBhbmQgZGlzcGxheWluZworICogdGhlIGJ1ZmZlci4KKyAqCisgKiBSZXR1cm5zOiBhICNHc3RGbG93UmV0dXJuLgorICovCit0eXBlZGVmIEdzdEZsb3dSZXR1cm4gKCpSVFBTZXNzaW9uUHJvY2Vzc1JUUCkgKFJUUFNlc3Npb24gKnNlc3MsIFJUUFNvdXJjZSAqc3JjLCBHc3RCdWZmZXIgKmJ1ZmZlciwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKworLyoqCisgKiBSVFBTZXNzaW9uU2VuZFJUUDoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQHNyYzogdGhlICNSVFBTb3VyY2UKKyAqIEBidWZmZXI6IHRoZSBSVFAgYnVmZmVyIHJlYWR5IGZvciBzZW5kaW5nCisgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgc3BlY2lmaWVkIHdoZW4gcmVnaXN0ZXJpbmcKKyAqCisgKiBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdoZW4gQHNlc3MgaGFzIEBidWZmZXIgcmVhZHkgZm9yIHNlbmRpbmcgdG8KKyAqIGFsbCBsaXN0ZW5pbmcgcGFydGljaXBhbnRzIGluIHRoaXMgc2Vzc2lvbi4KKyAqCisgKiBSZXR1cm5zOiBhICNHc3RGbG93UmV0dXJuLgorICovCit0eXBlZGVmIEdzdEZsb3dSZXR1cm4gKCpSVFBTZXNzaW9uU2VuZFJUUCkgKFJUUFNlc3Npb24gKnNlc3MsIFJUUFNvdXJjZSAqc3JjLCBncG9pbnRlciBkYXRhLCBncG9pbnRlciB1c2VyX2RhdGEpOworCisvKioKKyAqIFJUUFNlc3Npb25TZW5kUlRDUDoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQHNyYzogdGhlICNSVFBTb3VyY2UKKyAqIEBidWZmZXI6IHRoZSBSVENQIGJ1ZmZlciByZWFkeSBmb3Igc2VuZGluZworICogQGVvczogaWYgYW4gRU9TIGV2ZW50IHNob3VsZCBiZSBwdXNoZWQKKyAqIEB1c2VyX2RhdGE6IHVzZXIgZGF0YSBzcGVjaWZpZWQgd2hlbiByZWdpc3RlcmluZworICoKKyAqIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbiBAc2VzcyBoYXMgQGJ1ZmZlciByZWFkeSBmb3Igc2VuZGluZyB0bworICogYWxsIGxpc3RlbmluZyBwYXJ0aWNpcGFudHMgaW4gdGhpcyBzZXNzaW9uLgorICoKKyAqIFJldHVybnM6IGEgI0dzdEZsb3dSZXR1cm4uCisgKi8KK3R5cGVkZWYgR3N0Rmxvd1JldHVybiAoKlJUUFNlc3Npb25TZW5kUlRDUCkgKFJUUFNlc3Npb24gKnNlc3MsIFJUUFNvdXJjZSAqc3JjLCBHc3RCdWZmZXIgKmJ1ZmZlciwKKyAgICBnYm9vbGVhbiBlb3MsIGdwb2ludGVyIHVzZXJfZGF0YSk7CisKKy8qKgorICogUlRQU2Vzc2lvblN5bmNSVENQOgorICogQHNlc3M6IGFuICNSVFBTZXNzaW9uCisgKiBAYnVmZmVyOiB0aGUgUlRDUCBidWZmZXIgcmVhZHkgZm9yIHN5bmNocm9uaXNhdGlvbgorICogQHVzZXJfZGF0YTogdXNlciBkYXRhIHNwZWNpZmllZCB3aGVuIHJlZ2lzdGVyaW5nCisgKgorICogVGhpcyBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aGVuIEBzZXNzIGhhcyBhbiBTUiBAYnVmZmVyIHJlYWR5IGZvciBkb2luZworICogc3luY2hyb25pc2F0aW9uIGJldHdlZW4gc3RyZWFtcy4KKyAqCisgKiBSZXR1cm5zOiBhICNHc3RGbG93UmV0dXJuLgorICovCit0eXBlZGVmIEdzdEZsb3dSZXR1cm4gKCpSVFBTZXNzaW9uU3luY1JUQ1ApIChSVFBTZXNzaW9uICpzZXNzLCBHc3RCdWZmZXIgKmJ1ZmZlciwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKworLyoqCisgKiBSVFBTZXNzaW9uQ2xvY2tSYXRlOgorICogQHNlc3M6IGFuICNSVFBTZXNzaW9uCisgKiBAcGF5bG9hZDogdGhlIHBheWxvYWQKKyAqIEB1c2VyX2RhdGE6IHVzZXIgZGF0YSBzcGVjaWZpZWQgd2hlbiByZWdpc3RlcmluZworICoKKyAqIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbiBAc2VzcyBuZWVkcyB0aGUgY2xvY2stcmF0ZSBvZiBAcGF5bG9hZC4KKyAqCisgKiBSZXR1cm5zOiB0aGUgY2xvY2stcmF0ZSBvZiBAcHQuCisgKi8KK3R5cGVkZWYgZ2ludCAoKlJUUFNlc3Npb25DbG9ja1JhdGUpIChSVFBTZXNzaW9uICpzZXNzLCBndWludDggcGF5bG9hZCwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKworLyoqCisgKiBSVFBTZXNzaW9uUmVjb25zaWRlcjoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQHVzZXJfZGF0YTogdXNlciBkYXRhIHNwZWNpZmllZCB3aGVuIHJlZ2lzdGVyaW5nCisgKgorICogVGhpcyBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aGVuIEBzZXNzIG5lZWRzIHRvIGNhbmNlbCB0aGUgY3VycmVudCB0aW1lb3V0LgorICogVGhlIGN1cnJlbnRseSBydW5uaW5nIHRpbWVvdXQgc2hvdWxkIGJlIGNhbmNlbGVkIGFuZCBhIG5ldyByZXBvcnRpbmcgaW50ZXJ2YWwKKyAqIHNob3VsZCBiZSByZXF1ZXN0ZWQgZnJvbSBAc2Vzcy4KKyAqLwordHlwZWRlZiB2b2lkICgqUlRQU2Vzc2lvblJlY29uc2lkZXIpIChSVFBTZXNzaW9uICpzZXNzLCBncG9pbnRlciB1c2VyX2RhdGEpOworCisvKioKKyAqIFJUUFNlc3Npb25SZXF1ZXN0S2V5VW5pdDoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQHNzcmM6IFNTUkMgb2YgdGhlIHNvdXJjZSByZWxhdGVkIHRvIHRoZSBrZXkgdW5pdCByZXF1ZXN0CisgKiBAYWxsX2hlYWRlcnM6ICVUUlVFIGlmICJhbGwtaGVhZGVycyIgcHJvcGVydHkgc2hvdWxkIGJlIHNldCBvbiB0aGUga2V5IHVuaXQKKyAqICByZXF1ZXN0CisgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgc3BlY2lmaWVkIHdoZW4gcmVnaXN0ZXJpbmcKKyAqCisgKiBBc2tzIHRoZSBlbmNvZGVyIHRvIHByb2R1Y2UgYSBrZXkgdW5pdCBhcyBzb29uIGFzIHBvc3NpYmx5IHdpdGhpbiB0aGUKKyAqIGJhbmR3aWR0aCBjb25zdHJhaW50cworICovCit0eXBlZGVmIHZvaWQgKCpSVFBTZXNzaW9uUmVxdWVzdEtleVVuaXQpIChSVFBTZXNzaW9uICpzZXNzLCBndWludDMyIHNzcmMsCisgICAgZ2Jvb2xlYW4gYWxsX2hlYWRlcnMsIGdwb2ludGVyIHVzZXJfZGF0YSk7CisKKy8qKgorICogUlRQU2Vzc2lvblJlcXVlc3RUaW1lOgorICogQHNlc3M6IGFuICNSVFBTZXNzaW9uCisgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgc3BlY2lmaWVkIHdoZW4gcmVnaXN0ZXJpbmcKKyAqCisgKiBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdoZW4gQHNlc3MgbmVlZHMgdGhlIGN1cnJlbnQgdGltZS4gVGhlIHRpbWUKKyAqIHNob3VsZCBiZSByZXR1cm5lZCBhcyBhICNHc3RDbG9ja1RpbWUKKyAqLwordHlwZWRlZiBHc3RDbG9ja1RpbWUgKCpSVFBTZXNzaW9uUmVxdWVzdFRpbWUpIChSVFBTZXNzaW9uICpzZXNzLAorICAgIGdwb2ludGVyIHVzZXJfZGF0YSk7CisKKy8qKgorICogUlRQU2Vzc2lvbk5vdGlmeU5BQ0s6CisgKiBAc2VzczogYW4gI1JUUFNlc3Npb24KKyAqIEBzZXFudW06IHRoZSBtaXNzaW5nIHNlcW51bQorICogQGJscDogb3RoZXIgbWlzc2luZyBzZXFudW1zCisgKiBAc3NyYzogU1NSQyBvZiByZXF1ZXN0ZWQgc3RyZWFtCisgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgc3BlY2lmaWVkIHdoZW4gcmVnaXN0ZXJpbmcKKyAqCisgKiBOb3RpZmllcyBvZiBOQUNLZWQgZnJhbWVzLgorICovCit0eXBlZGVmIHZvaWQgKCpSVFBTZXNzaW9uTm90aWZ5TkFDSykgKFJUUFNlc3Npb24gKnNlc3MsCisgICAgZ3VpbnQxNiBzZXFudW0sIGd1aW50MTYgYmxwLCBndWludDMyIHNzcmMsIGdwb2ludGVyIHVzZXJfZGF0YSk7CisKKy8qKgorICogUlRQU2Vzc2lvblJlY29uZmlndXJlOgorICogQHNlc3M6IGFuICNSVFBTZXNzaW9uCisgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgc3BlY2lmaWVkIHdoZW4gcmVnaXN0ZXJpbmcKKyAqCisgKiBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdoZW4gQHNlc3Mgd2FudHMgdG8gcmVjb25maWd1cmUgdGhlCisgKiBuZWdvdGlhdGVkIHBhcmFtZXRlcnMuCisgKi8KK3R5cGVkZWYgdm9pZCAoKlJUUFNlc3Npb25SZWNvbmZpZ3VyZSkgKFJUUFNlc3Npb24gKnNlc3MsIGdwb2ludGVyIHVzZXJfZGF0YSk7CisKKy8qKgorICogUlRQU2Vzc2lvbkNhbGxiYWNrczoKKyAqIEBSVFBTZXNzaW9uUHJvY2Vzc1JUUDogY2FsbGJhY2sgdG8gcHJvY2VzcyBSVFAgcGFja2V0cworICogQFJUUFNlc3Npb25TZW5kUlRQOiBjYWxsYmFjayBmb3Igc2VuZGluZyBSVFAgcGFja2V0cworICogQFJUUFNlc3Npb25TZW5kUlRDUDogY2FsbGJhY2sgZm9yIHNlbmRpbmcgUlRDUCBwYWNrZXRzCisgKiBAUlRQU2Vzc2lvblN5bmNSVENQOiBjYWxsYmFjayBmb3IgaGFuZGxpbmcgU1IgcGFja2V0cworICogQFJUUFNlc3Npb25SZWNvbnNpZGVyOiBjYWxsYmFjayBmb3IgcmVjb25zaWRlcmluZyB0aGUgdGltZW91dAorICogQFJUUFNlc3Npb25SZXF1ZXN0S2V5VW5pdDogY2FsbGJhY2sgZm9yIHJlcXVlc3RpbmcgYSBuZXcga2V5IHVuaXQKKyAqIEBSVFBTZXNzaW9uUmVxdWVzdFRpbWU6IGNhbGxiYWNrIGZvciByZXF1ZXN0aW5nIHRoZSBjdXJyZW50IHRpbWUKKyAqIEBSVFBTZXNzaW9uTm90aWZ5TkFDSzogY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBOQUNLCisgKiBAUlRQU2Vzc2lvblJlY29uZmlndXJlOiBjYWxsYmFjayBmb3IgcmVxdWVzdGluZyByZWNvbmZpZ3VyYXRpb24KKyAqCisgKiBUaGVzZSBjYWxsYmFja3MgY2FuIGJlIGluc3RhbGxlZCBvbiB0aGUgc2Vzc2lvbiBtYW5hZ2VyIHRvIGdldCBub3RpZmljYXRpb24KKyAqIHdoZW4gUlRQIGFuZCBSVENQIHBhY2tldHMgYXJlIHJlYWR5IGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuIFRoZXNlIGNhbGxiYWNrcworICogYXJlIG5vdCBpbXBsZW1lbnRlZCB3aXRoIHNpZ25hbHMgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgUlRQU2Vzc2lvblByb2Nlc3NSVFAgIHByb2Nlc3NfcnRwOworICBSVFBTZXNzaW9uU2VuZFJUUCAgICAgc2VuZF9ydHA7CisgIFJUUFNlc3Npb25TeW5jUlRDUCAgICBzeW5jX3J0Y3A7CisgIFJUUFNlc3Npb25TZW5kUlRDUCAgICBzZW5kX3J0Y3A7CisgIFJUUFNlc3Npb25DbG9ja1JhdGUgICBjbG9ja19yYXRlOworICBSVFBTZXNzaW9uUmVjb25zaWRlciAgcmVjb25zaWRlcjsKKyAgUlRQU2Vzc2lvblJlcXVlc3RLZXlVbml0IHJlcXVlc3Rfa2V5X3VuaXQ7CisgIFJUUFNlc3Npb25SZXF1ZXN0VGltZSByZXF1ZXN0X3RpbWU7CisgIFJUUFNlc3Npb25Ob3RpZnlOQUNLICBub3RpZnlfbmFjazsKKyAgUlRQU2Vzc2lvblJlY29uZmlndXJlIHJlY29uZmlndXJlOworfSBSVFBTZXNzaW9uQ2FsbGJhY2tzOworCisvKioKKyAqIFJUUFNlc3Npb246CisgKiBAbG9jazogbG9jayB0byBwcm90ZWN0IHRoZSBzZXNzaW9uCisgKiBAc291cmNlOiB0aGUgc291cmNlIG9mIHRoaXMgc2Vzc2lvbgorICogQHNzcmNzOiBIYXNodGFibGUgb2Ygc291cmNlcyBpbmRleGVkIGJ5IFNTUkMKKyAqIEBudW1fc291cmNlczogdGhlIG51bWJlciBvZiBzb3VyY2VzCisgKiBAYWN0aXZlY291bnQ6IHRoZSBudW1iZXIgb2YgYWN0aXZlIHNvdXJjZXMKKyAqIEBjYWxsYmFja3M6IGNhbGxiYWNrcworICogQHVzZXJfZGF0YTogdXNlciBkYXRhIHBhc3NlZCBpbiBjYWxsYmFja3MKKyAqIEBzdGF0czogc2Vzc2lvbiBzdGF0aXN0aWNzCisgKiBAY29uZmxpY3RpbmdfYWRkcmVzc2VzOiBHTGlzdCBvZiBjb25mbGljdGluZyBhZGRyZXNzZXMKKyAqCisgKiBUaGUgUlRQIHNlc3Npb24gbWFuYWdlciBvYmplY3QKKyAqLworc3RydWN0IF9SVFBTZXNzaW9uIHsKKyAgR09iamVjdCAgICAgICBvYmplY3Q7CisKKyAgR011dGV4ICAgICAgICBsb2NrOworCisgIGd1aW50ICAgICAgICAgaGVhZGVyX2xlbjsKKyAgZ3VpbnQgICAgICAgICBtdHU7CisKKyAgR3N0U3RydWN0dXJlICpzZGVzOworCisgIGd1aW50ICAgICAgICAgcHJvYmF0aW9uOworICBndWludDMyICAgICAgIG1heF9kcm9wb3V0X3RpbWU7CisgIGd1aW50MzIgICAgICAgbWF4X21pc29yZGVyX3RpbWU7CisKKyAgR3N0UlRQUHJvZmlsZSBydHBfcHJvZmlsZTsKKworICBnYm9vbGVhbiAgICAgIHJlZHVjZWRfc2l6ZV9ydGNwOworCisgIC8qIGJhbmR3aWR0aHMgKi8KKyAgZ2Jvb2xlYW4gICAgIHJlY2FsY19iYW5kd2lkdGg7CisgIGd1aW50ICAgICAgICBiYW5kd2lkdGg7CisgIGdkb3VibGUgICAgICBydGNwX2JhbmR3aWR0aDsKKyAgZ3VpbnQgICAgICAgIHJ0Y3BfcnJfYmFuZHdpZHRoOworICBndWludCAgICAgICAgcnRjcF9yc19iYW5kd2lkdGg7CisKKyAgZ3VpbnQzMiAgICAgICBzdWdnZXN0ZWRfc3NyYzsKKyAgZ2Jvb2xlYW4gICAgICBpbnRlcm5hbF9zc3JjX3NldDsKKyAgZ2Jvb2xlYW4gICAgICBpbnRlcm5hbF9zc3JjX2Zyb21fY2Fwc19vcl9wcm9wZXJ0eTsKKworICAvKiBmb3Igc2VuZGVyL3JlY2VpdmVyIGNvdW50aW5nICovCisgIGd1aW50MzIgICAgICAga2V5OworICBndWludDMyICAgICAgIG1hc2tfaWR4OworICBndWludDMyICAgICAgIG1hc2s7CisgIEdIYXNoVGFibGUgICAqc3NyY3NbMzJdOworICBndWludCAgICAgICAgIHRvdGFsX3NvdXJjZXM7CisKKyAgZ3VpbnQxNiAgICAgICBnZW5lcmF0aW9uOworICBHc3RDbG9ja1RpbWUgIG5leHRfcnRjcF9jaGVja190aW1lOyAvKiB0biAqLworICBHc3RDbG9ja1RpbWUgIGxhc3RfcnRjcF9jaGVja190aW1lOyAvKiB0cCAqLworICBHc3RDbG9ja1RpbWUgIGxhc3RfcnRjcF9zZW5kX3RpbWU7ICAvKiB0X3JyX2xhc3QgKi8KKyAgR3N0Q2xvY2tUaW1lICBsYXN0X3J0Y3BfaW50ZXJ2YWw7ICAgLyogVF9yciAqLworICBHc3RDbG9ja1RpbWUgIHN0YXJ0X3RpbWU7CisgIGdib29sZWFuICAgICAgZmlyc3RfcnRjcDsKKyAgZ2Jvb2xlYW4gICAgICBhbGxvd19lYXJseTsKKworICBHc3RDbG9ja1RpbWUgIG5leHRfZWFybHlfcnRjcF90aW1lOworCisgIGdib29sZWFuICAgICAgc2NoZWR1bGVkX2J5ZTsKKworICBSVFBTZXNzaW9uQ2FsbGJhY2tzICAgY2FsbGJhY2tzOworICBncG9pbnRlciAgICAgICAgICAgICAgcHJvY2Vzc19ydHBfdXNlcl9kYXRhOworICBncG9pbnRlciAgICAgICAgICAgICAgc2VuZF9ydHBfdXNlcl9kYXRhOworICBncG9pbnRlciAgICAgICAgICAgICAgc2VuZF9ydGNwX3VzZXJfZGF0YTsKKyAgZ3BvaW50ZXIgICAgICAgICAgICAgIHN5bmNfcnRjcF91c2VyX2RhdGE7CisgIGdwb2ludGVyICAgICAgICAgICAgICBjbG9ja19yYXRlX3VzZXJfZGF0YTsKKyAgZ3BvaW50ZXIgICAgICAgICAgICAgIHJlY29uc2lkZXJfdXNlcl9kYXRhOworICBncG9pbnRlciAgICAgICAgICAgICAgcmVxdWVzdF9rZXlfdW5pdF91c2VyX2RhdGE7CisgIGdwb2ludGVyICAgICAgICAgICAgICByZXF1ZXN0X3RpbWVfdXNlcl9kYXRhOworICBncG9pbnRlciAgICAgICAgICAgICAgbm90aWZ5X25hY2tfdXNlcl9kYXRhOworICBncG9pbnRlciAgICAgICAgICAgICAgcmVjb25maWd1cmVfdXNlcl9kYXRhOworCisgIFJUUFNlc3Npb25TdGF0cyBzdGF0czsKKyAgUlRQU2Vzc2lvblN0YXRzIGJ5ZV9zdGF0czsKKworICBnYm9vbGVhbiAgICAgIGZhdm9yX25ldzsKKyAgR3N0Q2xvY2tUaW1lICBydGNwX2ZlZWRiYWNrX3JldGVudGlvbl93aW5kb3c7CisgIGd1aW50ICAgICAgICAgcnRjcF9pbW1lZGlhdGVfZmVlZGJhY2tfdGhyZXNob2xkOworCisgIGdib29sZWFuICAgICAgaXNfZG9pbmdfcHRwOworCisgIEdMaXN0ICAgICAgICAgKmNvbmZsaWN0aW5nX2FkZHJlc3NlczsKK307CisKKy8qKgorICogUlRQU2Vzc2lvbkNsYXNzOgorICogQG9uX25ld19zc3JjOiBlbWl0ZWQgd2hlbiBhIG5ldyBzb3VyY2UgaXMgZm91bmQKKyAqIEBvbl9ieWVfc3NyYzogZW1pdGVkIHdoZW4gYSBzb3VyY2UgaXMgZ29uZQorICoKKyAqIFRoZSBzZXNzaW9uIGNsYXNzLgorICovCitzdHJ1Y3QgX1JUUFNlc3Npb25DbGFzcyB7CisgIEdPYmplY3RDbGFzcyAgIHBhcmVudF9jbGFzczsKKworICAvKiBhY3Rpb24gc2lnbmFscyAqLworICBSVFBTb3VyY2UqICgqZ2V0X3NvdXJjZV9ieV9zc3JjKSAoUlRQU2Vzc2lvbiAqc2VzcywgZ3VpbnQzMiBzc3JjKTsKKworICAvKiBzaWduYWxzICovCisgIHZvaWQgKCpvbl9uZXdfc3NyYykgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsIFJUUFNvdXJjZSAqc291cmNlKTsKKyAgdm9pZCAoKm9uX3NzcmNfY29sbGlzaW9uKSAoUlRQU2Vzc2lvbiAqc2VzcywgUlRQU291cmNlICpzb3VyY2UpOworICB2b2lkICgqb25fc3NyY192YWxpZGF0ZWQpIChSVFBTZXNzaW9uICpzZXNzLCBSVFBTb3VyY2UgKnNvdXJjZSk7CisgIHZvaWQgKCpvbl9zc3JjX2FjdGl2ZSkgICAgKFJUUFNlc3Npb24gKnNlc3MsIFJUUFNvdXJjZSAqc291cmNlKTsKKyAgdm9pZCAoKm9uX3NzcmNfc2RlcykgICAgICAoUlRQU2Vzc2lvbiAqc2VzcywgUlRQU291cmNlICpzb3VyY2UpOworICB2b2lkICgqb25fYnllX3NzcmMpICAgICAgIChSVFBTZXNzaW9uICpzZXNzLCBSVFBTb3VyY2UgKnNvdXJjZSk7CisgIHZvaWQgKCpvbl9ieWVfdGltZW91dCkgICAgKFJUUFNlc3Npb24gKnNlc3MsIFJUUFNvdXJjZSAqc291cmNlKTsKKyAgdm9pZCAoKm9uX3RpbWVvdXQpICAgICAgICAoUlRQU2Vzc2lvbiAqc2VzcywgUlRQU291cmNlICpzb3VyY2UpOworICB2b2lkICgqb25fc2VuZGVyX3RpbWVvdXQpIChSVFBTZXNzaW9uICpzZXNzLCBSVFBTb3VyY2UgKnNvdXJjZSk7CisgIGdib29sZWFuICgqb25fc2VuZGluZ19ydGNwKSAoUlRQU2Vzc2lvbiAqc2VzcywgR3N0QnVmZmVyICpidWZmZXIsCisgICAgICBnYm9vbGVhbiBlYXJseSk7CisgIHZvaWQgKCpvbl9hcHBfcnRjcCkgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsIGd1aW50IHN1YnR5cGUsIGd1aW50IHNzcmMsCisgICAgICBjb25zdCBnY2hhciAqbmFtZSwgR3N0QnVmZmVyICpkYXRhKTsKKyAgdm9pZCAoKm9uX2ZlZWRiYWNrX3J0Y3ApICAoUlRQU2Vzc2lvbiAqc2VzcywgZ3VpbnQgdHlwZSwgZ3VpbnQgZmJ0eXBlLAorICAgICAgZ3VpbnQgc2VuZGVyX3NzcmMsIGd1aW50IG1lZGlhX3NzcmMsIEdzdEJ1ZmZlciAqZmNpKTsKKyAgZ2Jvb2xlYW4gKCpzZW5kX3J0Y3ApICAgICAoUlRQU2Vzc2lvbiAqc2VzcywgR3N0Q2xvY2tUaW1lIG1heF9kZWxheSk7CisgIHZvaWQgKCpvbl9yZWNlaXZpbmdfcnRjcCkgKFJUUFNlc3Npb24gKnNlc3MsIEdzdEJ1ZmZlciAqYnVmZmVyKTsKKyAgdm9pZCAoKm9uX25ld19zZW5kZXJfc3NyYykgICAgIChSVFBTZXNzaW9uICpzZXNzLCBSVFBTb3VyY2UgKnNvdXJjZSk7CisgIHZvaWQgKCpvbl9zZW5kZXJfc3NyY19hY3RpdmUpICAoUlRQU2Vzc2lvbiAqc2VzcywgUlRQU291cmNlICpzb3VyY2UpOworfTsKKworR1R5cGUgcnRwX3Nlc3Npb25fZ2V0X3R5cGUgKHZvaWQpOworCisvKiBjcmVhdGUgYW5kIGNvbmZpZ3VyZSAqLworUlRQU2Vzc2lvbiogICAgIHJ0cF9zZXNzaW9uX25ldyAgICAgICAgICAgKHZvaWQpOwordm9pZCAgICAgICAgICAgIHJ0cF9zZXNzaW9uX3NldF9jYWxsYmFja3MgICAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUUFNlc3Npb25DYWxsYmFja3MgKmNhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciB1c2VyX2RhdGEpOwordm9pZCAgICAgICAgICAgIHJ0cF9zZXNzaW9uX3NldF9wcm9jZXNzX3J0cF9jYWxsYmFjayAgIChSVFBTZXNzaW9uICogc2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVFBTZXNzaW9uUHJvY2Vzc1JUUCBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciB1c2VyX2RhdGEpOwordm9pZCAgICAgICAgICAgIHJ0cF9zZXNzaW9uX3NldF9zZW5kX3J0cF9jYWxsYmFjayAgKFJUUFNlc3Npb24gKiBzZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUUFNlc3Npb25TZW5kUlRQIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyIHVzZXJfZGF0YSk7Cit2b2lkICAgICAgICAgICAgcnRwX3Nlc3Npb25fc2V0X3NlbmRfcnRjcF9jYWxsYmFjayAgIChSVFBTZXNzaW9uICogc2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVFBTZXNzaW9uU2VuZFJUQ1AgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3ZvaWQgICAgICAgICAgICBydHBfc2Vzc2lvbl9zZXRfc3luY19ydGNwX2NhbGxiYWNrICAgKFJUUFNlc3Npb24gKiBzZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUUFNlc3Npb25TeW5jUlRDUCBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciB1c2VyX2RhdGEpOwordm9pZCAgICAgICAgICAgIHJ0cF9zZXNzaW9uX3NldF9jbG9ja19yYXRlX2NhbGxiYWNrICAgKFJUUFNlc3Npb24gKiBzZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUUFNlc3Npb25DbG9ja1JhdGUgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3ZvaWQgICAgICAgICAgICBydHBfc2Vzc2lvbl9zZXRfcmVjb25zaWRlcl9jYWxsYmFjayAoUlRQU2Vzc2lvbiAqIHNlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRQU2Vzc2lvblJlY29uc2lkZXIgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3ZvaWQgICAgICAgICAgICBydHBfc2Vzc2lvbl9zZXRfcmVxdWVzdF90aW1lX2NhbGxiYWNrIChSVFBTZXNzaW9uICogc2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVFBTZXNzaW9uUmVxdWVzdFRpbWUgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKwordm9pZCAgICAgICAgICAgIHJ0cF9zZXNzaW9uX3NldF9iYW5kd2lkdGggICAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsIGdkb3VibGUgYmFuZHdpZHRoKTsKK2dkb3VibGUgICAgICAgICBydHBfc2Vzc2lvbl9nZXRfYmFuZHdpZHRoICAgICAgICAgIChSVFBTZXNzaW9uICpzZXNzKTsKK3ZvaWQgICAgICAgICAgICBydHBfc2Vzc2lvbl9zZXRfcnRjcF9mcmFjdGlvbiAgICAgIChSVFBTZXNzaW9uICpzZXNzLCBnZG91YmxlIGZyYWN0aW9uKTsKK2dkb3VibGUgICAgICAgICBydHBfc2Vzc2lvbl9nZXRfcnRjcF9mcmFjdGlvbiAgICAgIChSVFBTZXNzaW9uICpzZXNzKTsKKworR3N0U3RydWN0dXJlICogIHJ0cF9zZXNzaW9uX2dldF9zZGVzX3N0cnVjdCAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MpOwordm9pZCAgICAgICAgICAgIHJ0cF9zZXNzaW9uX3NldF9zZGVzX3N0cnVjdCAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsIGNvbnN0IEdzdFN0cnVjdHVyZSAqc2Rlcyk7CisKKy8qIGhhbmRsaW5nIHNvdXJjZXMgKi8KK2d1aW50MzIgICAgICAgICBydHBfc2Vzc2lvbl9zdWdnZXN0X3NzcmMgICAgICAgICAgIChSVFBTZXNzaW9uICpzZXNzLCBnYm9vbGVhbiAqaXNfcmFuZG9tKTsKKworZ2Jvb2xlYW4gICAgICAgIHJ0cF9zZXNzaW9uX2FkZF9zb3VyY2UgICAgICAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsIFJUUFNvdXJjZSAqc3JjKTsKK2d1aW50ICAgICAgICAgICBydHBfc2Vzc2lvbl9nZXRfbnVtX3NvdXJjZXMgICAgICAgIChSVFBTZXNzaW9uICpzZXNzKTsKK2d1aW50ICAgICAgICAgICBydHBfc2Vzc2lvbl9nZXRfbnVtX2FjdGl2ZV9zb3VyY2VzIChSVFBTZXNzaW9uICpzZXNzKTsKK1JUUFNvdXJjZSogICAgICBydHBfc2Vzc2lvbl9nZXRfc291cmNlX2J5X3NzcmMgICAgIChSVFBTZXNzaW9uICpzZXNzLCBndWludDMyIHNzcmMpOworUlRQU291cmNlKiAgICAgIHJ0cF9zZXNzaW9uX2NyZWF0ZV9zb3VyY2UgICAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MpOworCisvKiBwcm9jZXNzaW5nIHBhY2tldHMgZnJvbSByZWNlaXZlcnMgKi8KK0dzdEZsb3dSZXR1cm4gICBydHBfc2Vzc2lvbl9wcm9jZXNzX3J0cCAgICAgICAgICAgIChSVFBTZXNzaW9uICpzZXNzLCBHc3RCdWZmZXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RDbG9ja1RpbWUgY3VycmVudF90aW1lLAorCQkJCQkJICAgIEdzdENsb2NrVGltZSBydW5uaW5nX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCBudHBuc3RpbWUpOworR3N0Rmxvd1JldHVybiAgIHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnRjcCAgICAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsIEdzdEJ1ZmZlciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCBudHBuc3RpbWUpOworCisvKiBwcm9jZXNzaW5nIHBhY2tldHMgZm9yIHNlbmRpbmcgKi8KK3ZvaWQgICAgICAgICAgICBydHBfc2Vzc2lvbl91cGRhdGVfc2VuZF9jYXBzICAgICAgIChSVFBTZXNzaW9uICpzZXNzLCBHc3RDYXBzICpjYXBzKTsKK0dzdEZsb3dSZXR1cm4gICBydHBfc2Vzc2lvbl9zZW5kX3J0cCAgICAgICAgICAgICAgIChSVFBTZXNzaW9uICpzZXNzLCBncG9pbnRlciBkYXRhLCBnYm9vbGVhbiBpc19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUsIEdzdENsb2NrVGltZSBydW5uaW5nX3RpbWUpOworCisvKiBzY2hlZHVsaW5nIGJ5ZSAqLwordm9pZCAgICAgICAgICAgIHJ0cF9zZXNzaW9uX21hcmtfYWxsX2J5ZSAgICAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsIGNvbnN0IGdjaGFyICpyZWFzb24pOworR3N0Rmxvd1JldHVybiAgIHJ0cF9zZXNzaW9uX3NjaGVkdWxlX2J5ZSAgICAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUpOworCisvKiBnZXQgaW50ZXJ2YWwgZm9yIG5leHQgUlRDUCBpbnRlcnZhbCAqLworR3N0Q2xvY2tUaW1lICAgIHJ0cF9zZXNzaW9uX25leHRfdGltZW91dCAgICAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUpOworR3N0Rmxvd1JldHVybiAgIHJ0cF9zZXNzaW9uX29uX3RpbWVvdXQgICAgICAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCBudHBuc3RpbWUsIEdzdENsb2NrVGltZSBydW5uaW5nX3RpbWUpOworCisvKiByZXF1ZXN0IHRoZSB0cmFuc21pdHRpb24gb2YgYW4gZWFybHkgUlRDUCBwYWNrZXQgKi8KK2dib29sZWFuICAgICAgICBydHBfc2Vzc2lvbl9yZXF1ZXN0X2Vhcmx5X3J0Y3AgICAgIChSVFBTZXNzaW9uICogc2VzcywgR3N0Q2xvY2tUaW1lIGN1cnJlbnRfdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RDbG9ja1RpbWUgbWF4X2RlbGF5KTsKKworLyogTm90aWZ5IHNlc3Npb24gb2YgYSByZXF1ZXN0IGZvciBhIG5ldyBrZXkgdW5pdCAqLworZ2Jvb2xlYW4gICAgICAgIHJ0cF9zZXNzaW9uX3JlcXVlc3Rfa2V5X3VuaXQgICAgICAgKFJUUFNlc3Npb24gKiBzZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgc3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYm9vbGVhbiBmaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCBjb3VudCk7CitnYm9vbGVhbiAgICAgICAgcnRwX3Nlc3Npb25fcmVxdWVzdF9uYWNrICAgICAgICAgICAoUlRQU2Vzc2lvbiAqIHNlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBzc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MTYgc2VxbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdENsb2NrVGltZSBtYXhfZGVsYXkpOworCisKKyNlbmRpZiAvKiBfX1JUUF9TRVNTSU9OX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmMgYi9nc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzI2NDA4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmMKQEAgLTAsMCArMSwxOTQ4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpICAyMDE1IEt1cmVudG8gKGh0dHA6Ly9rdXJlbnRvLm9yZy8pCisgKiAgIEBhdXRob3I6IE1pZ3VlbCBQYXLDrXMgPG1wYXJpc2RpYXpAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRjcGJ1ZmZlci5oPgorCisjaW5jbHVkZSAicnRwc291cmNlLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cF9zb3VyY2VfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgcnRwX3NvdXJjZV9kZWJ1ZworCisjZGVmaW5lIFJUUF9NQVhfUFJPQkFUSU9OX0xFTiAgMzIKKworLyogc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICBMQVNUX1NJR05BTAorfTsKKworI2RlZmluZSBERUZBVUxUX1NTUkMgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9JU19DU1JDICAgICAgICAgICAgICBGQUxTRQorI2RlZmluZSBERUZBVUxUX0lTX1ZBTElEQVRFRCAgICAgICAgIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfSVNfU0VOREVSICAgICAgICAgICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9TREVTICAgICAgICAgICAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfUFJPQkFUSU9OICAgICAgICAgICAgUlRQX0RFRkFVTFRfUFJPQkFUSU9OCisjZGVmaW5lIERFRkFVTFRfTUFYX0RST1BPVVRfVElNRSAgICAgNjAwMDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfTUlTT1JERVJfVElNRSAgICAyMDAwCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX1NTUkMsCisgIFBST1BfSVNfQ1NSQywKKyAgUFJPUF9JU19WQUxJREFURUQsCisgIFBST1BfSVNfU0VOREVSLAorICBQUk9QX1NERVMsCisgIFBST1BfU1RBVFMsCisgIFBST1BfUFJPQkFUSU9OLAorICBQUk9QX01BWF9EUk9QT1VUX1RJTUUsCisgIFBST1BfTUFYX01JU09SREVSX1RJTUUKK307CisKKy8qIEdPYmplY3Qgdm1ldGhvZHMgKi8KK3N0YXRpYyB2b2lkIHJ0cF9zb3VyY2VfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgcnRwX3NvdXJjZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBydHBfc291cmNlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworLyogc3RhdGljIGd1aW50IHJ0cF9zb3VyY2Vfc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAgfTsgKi8KKworR19ERUZJTkVfVFlQRSAoUlRQU291cmNlLCBydHBfc291cmNlLCBHX1RZUEVfT0JKRUNUKTsKKworc3RhdGljIHZvaWQKK3J0cF9zb3VyY2VfY2xhc3NfaW5pdCAoUlRQU291cmNlQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gcnRwX3NvdXJjZV9maW5hbGl6ZTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBydHBfc291cmNlX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gcnRwX3NvdXJjZV9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TU1JDLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJzc3JjIiwgIlNTUkMiLAorICAgICAgICAgICJUaGUgU1NSQyBvZiB0aGlzIHNvdXJjZSIsIDAsIEdfTUFYVUlOVCwgREVGQVVMVF9TU1JDLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0lTX0NTUkMsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImlzLWNzcmMiLCAiSXMgQ1NSQyIsCisgICAgICAgICAgIklmIHRoaXMgU1NSQyBpcyBhY3RpbmcgYXMgYSBjb250cmlidXRpbmcgc291cmNlIiwKKyAgICAgICAgICBERUZBVUxUX0lTX0NTUkMsIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9JU19WQUxJREFURUQsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImlzLXZhbGlkYXRlZCIsICJJcyBWYWxpZGF0ZWQiLAorICAgICAgICAgICJJZiB0aGlzIFNTUkMgaXMgdmFsaWRhdGVkIiwgREVGQVVMVF9JU19WQUxJREFURUQsCisgICAgICAgICAgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0lTX1NFTkRFUiwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiaXMtc2VuZGVyIiwgIklzIFNlbmRlciIsCisgICAgICAgICAgIklmIHRoaXMgU1NSQyBpcyBhIHNlbmRlciIsIERFRkFVTFRfSVNfU0VOREVSLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIFJUUFNvdXJjZTo6c2RlcworICAgKgorICAgKiBUaGUgY3VycmVudCBTREVTIGl0ZW1zIG9mIHRoZSBzb3VyY2UuIFJldHVybnMgYSBzdHJ1Y3R1cmUgd2l0aCBuYW1lCisgICAqIGFwcGxpY2F0aW9uL3gtcnRwLXNvdXJjZS1zZGVzIGFuZCBtYXkgY29udGFpbiB0aGUgZm9sbG93aW5nIGZpZWxkczoKKyAgICoKKyAgICogICdjbmFtZScgICAgICAgR19UWVBFX1NUUklORyAgOiBUaGUgY2Fub25pY2FsIG5hbWUgaW4gdGhlIGZvcm0gdXNlckBob3N0CisgICAqICAnbmFtZScgICAgICAgIEdfVFlQRV9TVFJJTkcgIDogVGhlIHVzZXIgbmFtZQorICAgKiAgJ2VtYWlsJyAgICAgICBHX1RZUEVfU1RSSU5HICA6IFRoZSB1c2VyJ3MgZWxlY3Ryb25pYyBtYWlsIGFkZHJlc3MKKyAgICogICdwaG9uZScgICAgICAgR19UWVBFX1NUUklORyAgOiBUaGUgdXNlcidzIHBob25lIG51bWJlcgorICAgKiAgJ2xvY2F0aW9uJyAgICBHX1RZUEVfU1RSSU5HICA6IFRoZSBnZW9ncmFwaGljIHVzZXIgbG9jYXRpb24KKyAgICogICd0b29sJyAgICAgICAgR19UWVBFX1NUUklORyAgOiBUaGUgbmFtZSBvZiBhcHBsaWNhdGlvbiBvciB0b29sCisgICAqICAnbm90ZScgICAgICAgIEdfVFlQRV9TVFJJTkcgIDogQSBub3RpY2UgYWJvdXQgdGhlIHNvdXJjZQorICAgKgorICAgKiAgT3RoZXIgZmllbGRzIG1heSBiZSBwcmVzZW50IGFuZCB0aGVzZSByZXByZXNlbnQgcHJpdmF0ZSBpdGVtcyBpbgorICAgKiAgdGhlIFNERVMgd2hlcmUgdGhlIGZpZWxkIG5hbWUgaXMgdGhlIHByZWZpeC4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU0RFUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoInNkZXMiLCAiU0RFUyIsCisgICAgICAgICAgIlRoZSBTREVTIGluZm9ybWF0aW9uIGZvciB0aGlzIHNvdXJjZSIsCisgICAgICAgICAgR1NUX1RZUEVfU1RSVUNUVVJFLCBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBSVFBTb3VyY2U6OnN0YXRzCisgICAqCisgICAqIFRoaXMgcHJvcGVydHkgcmV0dXJucyBhIEdzdFN0cnVjdHVyZSBuYW1lZCBhcHBsaWNhdGlvbi94LXJ0cC1zb3VyY2Utc3RhdHMgd2l0aAorICAgKiBmaWVsZHMgdXNlZnVsIGZvciBzdGF0aXN0aWNzIGFuZCBkaWFnbm9zdGljcy4KKyAgICoKKyAgICogVGFrZSBub3RlIG9mIGVhY2ggcmVzcGVjdGl2ZSBmaWVsZCdzIHVuaXRzOgorICAgKgorICAgKiAtIE5UUCB0aW1lcyBhcmUgaW4gdGhlIGFwcHJvcHJpYXRlIDMyLWJpdCBvciA2NC1iaXQgZml4ZWQtcG9pbnQgZm9ybWF0CisgICAqICAgc3RhcnRpbmcgZnJvbSBKYW51YXJ5IDEsIDE5NzAgKGV4Y2VwdCBmb3IgdGltZXNwYW5zKS4KKyAgICogLSBSVFAgdGltZXMgYXJlIGluIGNsb2NrIHJhdGUgdW5pdHMgKGkuZS4gY2xvY2sgcmF0ZSA9IDEgc2Vjb25kKQorICAgKiAgIHN0YXJ0aW5nIGF0IGEgcmFuZG9tIG9mZnNldC4KKyAgICogLSBGb3IgZmllbGRzIGluZGljYXRpbmcgcGFja2V0IGxvc3MsIG5vdGUgdGhhdCBsYXRlIHBhY2tldHMgYXJlIG5vdCBjb25zaWRlcmVkIGxvc3QsCisgICAqICAgYW5kIGR1cGxpY2F0ZXMgYXJlIG5vdCB0YWtlbiBpbnRvIGFjY291bnQuIEhlbmNlLCB0aGUgbG9zcyBtYXkgYmUgbmVnYXRpdmUKKyAgICogICBpZiB0aGVyZSBhcmUgZHVwbGljYXRlcy4KKyAgICoKKyAgICogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIGFsd2F5cyBwcmVzZW50LgorICAgKgorICAgKiAgInNzcmMiICAgICAgICAgR19UWVBFX1VJTlQgICAgIHRoZSBTU1JDIG9mIHRoaXMgc291cmNlCisgICAqICAiaW50ZXJuYWwiICAgICBHX1RZUEVfQk9PTEVBTiAgdGhpcyBzb3VyY2UgaXMgYSBzb3VyY2Ugb2YgdGhlIHNlc3Npb24KKyAgICogICJ2YWxpZGF0ZWQiICAgIEdfVFlQRV9CT09MRUFOICB0aGUgc291cmNlIGlzIHZhbGlkYXRlZAorICAgKiAgInJlY2VpdmVkLWJ5ZSIgR19UWVBFX0JPT0xFQU4gIHdlIHJlY2VpdmVkIGEgQllFIGZyb20gdGhpcyBzb3VyY2UKKyAgICogICJpcy1jc3JjIiAgICAgIEdfVFlQRV9CT09MRUFOICB0aGlzIHNvdXJjZSB3YXMgZm91bmQgYXMgQ1NSQworICAgKiAgImlzLXNlbmRlciIgICAgR19UWVBFX0JPT0xFQU4gIHRoaXMgc291cmNlIGlzIGEgc2VuZGVyCisgICAqICAic2VxbnVtLWJhc2UiICBHX1RZUEVfSU5UICAgICAgZmlyc3Qgc2VxbnVtIGlmIGtub3duCisgICAqICAiY2xvY2stcmF0ZSIgICBHX1RZUEVfSU5UICAgICAgdGhlIGNsb2NrIHJhdGUgb2YgdGhlIG1lZGlhCisgICAqCisgICAqIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBvbmx5IHByZXNlbnQgd2hlbiBrbm93bi4KKyAgICoKKyAgICogICJydHAtZnJvbSIgICAgIEdfVFlQRV9TVFJJTkcgICB3aGVyZSB3ZSByZWNlaXZlZCB0aGUgbGFzdCBSVFAgcGFja2V0IGZyb20KKyAgICogICJydGNwLWZyb20iICAgIEdfVFlQRV9TVFJJTkcgICB3aGVyZSB3ZSByZWNlaXZlZCB0aGUgbGFzdCBSVENQIHBhY2tldCBmcm9tCisgICAqCisgICAqIFRoZSBmb2xsb3dpbmcgZmllbGRzIG1ha2Ugc2Vuc2UgZm9yIGludGVybmFsIHNvdXJjZXMgYW5kIHdpbGwgb25seSBpbmNyZWFzZQorICAgKiB3aGVuICJpcy1zZW5kZXIiIGlzIFRSVUUuCisgICAqCisgICAqICAib2N0ZXRzLXNlbnQiICBHX1RZUEVfVUlOVDY0ICAgbnVtYmVyIG9mIGJ5dGVzIHdlIHNlbnQKKyAgICogICJwYWNrZXRzLXNlbnQiIEdfVFlQRV9VSU5UNjQgICBudW1iZXIgb2YgcGFja2V0cyB3ZSBzZW50CisgICAqCisgICAqIFRoZSBmb2xsb3dpbmcgZmllbGRzIG1ha2Ugc2Vuc2UgZm9yIG5vbi1pbnRlcm5hbCBzb3VyY2VzIGFuZCB3aWxsIG9ubHkKKyAgICogaW5jcmVhc2Ugd2hlbiAiaXMtc2VuZGVyIiBpcyBUUlVFLgorICAgKgorICAgKiAgIm9jdGV0cy1yZWNlaXZlZCIgIEdfVFlQRV9VSU5UNjQgIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWNlaXZlZAorICAgKiAgInBhY2tldHMtcmVjZWl2ZWQiIEdfVFlQRV9VSU5UNjQgIHRvdGFsIG51bWJlciBvZiBwYWNrZXRzIHJlY2VpdmVkCisgICAqCisgICAqIEZvbGxvd2luZyBmaWVsZHMgYXJlIHVwZGF0ZWQgd2hlbiAiaXMtc2VuZGVyIiBpcyBUUlVFLgorICAgKgorICAgKiAgImJpdHJhdGUiICAgICAgR19UWVBFX1VJTlQ2NCAgIGJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kCisgICAqICAiaml0dGVyIiAgICAgICBHX1RZUEVfVUlOVCAgICAgZXN0aW1hdGVkIGppdHRlciAoaW4gY2xvY2sgcmF0ZSB1bml0cykKKyAgICogICJwYWNrZXRzLWxvc3QiIEdfVFlQRV9JTlQgICAgICBlc3RpbWF0ZWQgYW1vdW50IG9mIHBhY2tldHMgbG9zdAorICAgKgorICAgKiBUaGUgbGFzdCBTUiByZXBvcnQgdGhpcyBzb3VyY2Ugc2VudC4gVGhpcyBvbmx5IHVwZGF0ZXMgd2hlbiAiaXMtc2VuZGVyIiBpcworICAgKiBUUlVFLgorICAgKgorICAgKiAgImhhdmUtc3IiICAgICAgICAgR19UWVBFX0JPT0xFQU4gIHRoZSBzb3VyY2UgaGFzIHNlbnQgU1IKKyAgICogICJzci1udHB0aW1lIiAgICAgIEdfVFlQRV9VSU5UNjQgICBOVFAgdGltZSBvZiBTUiAoaW4gTlRQIFRpbWVzdGFtcCBGb3JtYXQsIDMyLjMyIGZpeGVkIHBvaW50KQorICAgKiAgInNyLXJ0cHRpbWUiICAgICAgR19UWVBFX1VJTlQgICAgIFJUUCB0aW1lIG9mIFNSIChpbiBjbG9jayByYXRlIHVuaXRzKQorICAgKiAgInNyLW9jdGV0LWNvdW50IiAgR19UWVBFX1VJTlQgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIFNSCisgICAqICAic3ItcGFja2V0LWNvdW50IiBHX1RZUEVfVUlOVCAgICAgdGhlIG51bWJlciBvZiBwYWNrZXRzIGluIHRoZSBTUgorICAgKgorICAgKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgb25seSBwcmVzZW50IGZvciBub24taW50ZXJuYWwgc291cmNlcyBhbmQKKyAgICogcmVwcmVzZW50IHRoZSBjb250ZW50IG9mIHRoZSBsYXN0IFJCIHBhY2tldCB0aGF0IHdhcyBzZW50IHRvIHRoaXMgc291cmNlLgorICAgKiBUaGVzZSB2YWx1ZXMgYXJlIG9ubHkgdXBkYXRlZCB3aGVuIHRoZSBzb3VyY2UgaXMgc2VuZGluZy4KKyAgICoKKyAgICogICJzZW50LXJiIiAgICAgICAgICAgICAgIEdfVFlQRV9CT09MRUFOICB3ZSBoYXZlIHNlbnQgYW4gUkIKKyAgICogICJzZW50LXJiLWZyYWN0aW9ubG9zdCIgIEdfVFlQRV9VSU5UICAgICBjYWxjdWxhdGVkIGxvc3QgOC1iaXQgZnJhY3Rpb24KKyAgICogICJzZW50LXJiLXBhY2tldHNsb3N0IiAgIEdfVFlQRV9JTlQgICAgICBsb3N0IHBhY2tldHMKKyAgICogICJzZW50LXJiLWV4dGhpZ2hlc3RzZXEiIEdfVFlQRV9VSU5UICAgICBsYXN0IHNlZW4gc2VxbnVtCisgICAqICAic2VudC1yYi1qaXR0ZXIiICAgICAgICBHX1RZUEVfVUlOVCAgICAgaml0dGVyIChpbiBjbG9jayByYXRlIHVuaXRzKQorICAgKiAgInNlbnQtcmItbHNyIiAgICAgICAgICAgR19UWVBFX1VJTlQgICAgIGxhc3QgU1IgdGltZSAoc2Vjb25kcyBpbiBOVFAgU2hvcnQgRm9ybWF0LCAxNi4xNiBmaXhlZCBwb2ludCkKKyAgICogICJzZW50LXJiLWRsc3IiICAgICAgICAgIEdfVFlQRV9VSU5UICAgICBkZWxheSBzaW5jZSBsYXN0IFNSIChzZWNvbmRzIGluIE5UUCBTaG9ydCBGb3JtYXQsIDE2LjE2IGZpeGVkIHBvaW50KQorICAgKgorICAgKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgb25seSBwcmVzZW50IGZvciBub24taW50ZXJuYWwgc291cmNlcyBhbmQKKyAgICogcmVwcmVzZW50cyB0aGUgbGFzdCBSQiB0aGF0IHRoaXMgc291cmNlIHNlbnQuIFRoaXMgaXMgb25seSB1cGRhdGVkCisgICAqIHdoZW4gdGhlIHNvdXJjZSBpcyByZWNlaXZpbmcgZGF0YSBhbmQgc2VuZGluZyBSQiBibG9ja3MuCisgICAqCisgICAqICAiaGF2ZS1yYiIgICAgICAgICAgR19UWVBFX0JPT0xFQU4gIHRoZSBzb3VyY2UgaGFzIHNlbnQgUkIKKyAgICogICJyYi1mcmFjdGlvbmxvc3QiICBHX1RZUEVfVUlOVCAgICAgbG9zdCA4LWJpdCBmcmFjdGlvbgorICAgKiAgInJiLXBhY2tldHNsb3N0IiAgIEdfVFlQRV9JTlQgICAgICBsb3N0IHBhY2tldHMKKyAgICogICJyYi1leHRoaWdoZXN0c2VxIiBHX1RZUEVfVUlOVCAgICAgaGlnaGVzdCByZWNlaXZlZCBzZXFudW0KKyAgICogICJyYi1qaXR0ZXIiICAgICAgICBHX1RZUEVfVUlOVCAgICAgcmVjZXB0aW9uIGppdHRlciAoaW4gY2xvY2sgcmF0ZSB1bml0cykKKyAgICogICJyYi1sc3IiICAgICAgICAgICBHX1RZUEVfVUlOVCAgICAgbGFzdCBTUiB0aW1lIChzZWNvbmRzIGluIE5UUCBTaG9ydCBGb3JtYXQsIDE2LjE2IGZpeGVkIHBvaW50KQorICAgKiAgInJiLWRsc3IiICAgICAgICAgIEdfVFlQRV9VSU5UICAgICBkZWxheSBzaW5jZSBsYXN0IFNSIChzZWNvbmRzIGluIE5UUCBTaG9ydCBGb3JtYXQsIDE2LjE2IGZpeGVkIHBvaW50KQorICAgKgorICAgKiBUaGUgcm91bmQgdHJpcCBvZiB0aGlzIHNvdXJjZSBpcyBjYWxjdWxhdGVkIGZyb20gdGhlIGxhc3QgUkIKKyAgICogdmFsdWVzIGFuZCB0aGUgcmVjZXB0aW9uIHRpbWUgb2YgdGhlIGxhc3QgUkIgcGFja2V0LiBJdCBpcyBvbmx5IHByZXNlbnQgZm9yCisgICAqIG5vbi1pbnRlcm5hbCBzb3VyY2VzLgorICAgKgorICAgKiAgInJiLXJvdW5kLXRyaXAiICAgIEdfVFlQRV9VSU5UICAgICB0aGUgcm91bmQtdHJpcCB0aW1lIChzZWNvbmRzIGluIE5UUCBTaG9ydCBGb3JtYXQsIDE2LjE2IGZpeGVkIHBvaW50KQorICAgKgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TVEFUUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoInN0YXRzIiwgIlN0YXRzIiwKKyAgICAgICAgICAiVGhlIHN0YXRzIG9mIHRoaXMgc291cmNlIiwgR1NUX1RZUEVfU1RSVUNUVVJFLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QUk9CQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInByb2JhdGlvbiIsICJOdW1iZXIgb2YgcHJvYmF0aW9ucyIsCisgICAgICAgICAgIkNvbnNlY3V0aXZlIHBhY2tldCBzZXF1ZW5jZSBudW1iZXJzIHRvIGFjY2VwdCB0aGUgc291cmNlIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIERFRkFVTFRfUFJPQkFUSU9OLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX0RST1BPVVRfVElNRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LWRyb3BvdXQtdGltZSIsICJNYXggZHJvcG91dCB0aW1lIiwKKyAgICAgICAgICAiVGhlIG1heGltdW0gdGltZSAobWlsbGlzZWNvbmRzKSBvZiBtaXNzaW5nIHBhY2tldHMgdG9sZXJhdGVkLiIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCBERUZBVUxUX01BWF9EUk9QT1VUX1RJTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfTUlTT1JERVJfVElNRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LW1pc29yZGVyLXRpbWUiLCAiTWF4IG1pc29yZGVyIHRpbWUiLAorICAgICAgICAgICJUaGUgbWF4aW11bSB0aW1lIChtaWxsaXNlY29uZHMpIG9mIG1pc29yZGVyZWQgcGFja2V0cyB0b2xlcmF0ZWQuIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIERFRkFVTFRfTUFYX01JU09SREVSX1RJTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cF9zb3VyY2VfZGVidWcsICJydHBzb3VyY2UiLCAwLCAiUlRQIFNvdXJjZSIpOworfQorCisvKioKKyAqIHJ0cF9zb3VyY2VfcmVzZXQ6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKgorICogUmVzZXQgdGhlIHN0YXRzIG9mIEBzcmMuCisgKi8KK3ZvaWQKK3J0cF9zb3VyY2VfcmVzZXQgKFJUUFNvdXJjZSAqIHNyYykKK3sKKyAgc3JjLT5tYXJrZWRfYnllID0gRkFMU0U7CisgIGlmIChzcmMtPmJ5ZV9yZWFzb24pCisgICAgZ19mcmVlIChzcmMtPmJ5ZV9yZWFzb24pOworICBzcmMtPmJ5ZV9yZWFzb24gPSBOVUxMOworICBzcmMtPnNlbnRfYnllID0gRkFMU0U7CisgIGdfaGFzaF90YWJsZV9yZW1vdmVfYWxsIChzcmMtPnJlcG9ydGVkX2luX3NyX29mKTsKKworICBzcmMtPnN0YXRzLmN5Y2xlcyA9IC0xOworICBzcmMtPnN0YXRzLmppdHRlciA9IDA7CisgIHNyYy0+c3RhdHMudHJhbnNpdCA9IC0xOworICBzcmMtPnN0YXRzLmN1cnJfc3IgPSAwOworICBzcmMtPnN0YXRzLnNyWzBdLmlzX3ZhbGlkID0gRkFMU0U7CisgIHNyYy0+c3RhdHMuY3Vycl9yciA9IDA7CisgIHNyYy0+c3RhdHMucnJbMF0uaXNfdmFsaWQgPSBGQUxTRTsKKyAgc3JjLT5zdGF0cy5wcmV2X3J0cHRpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBzcmMtPnN0YXRzLnByZXZfcnRjcHRpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBzcmMtPnN0YXRzLmxhc3RfcnRwdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIHNyYy0+c3RhdHMubGFzdF9ydGNwdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGdfYXJyYXlfc2V0X3NpemUgKHNyYy0+bmFja3MsIDApOworCisgIHNyYy0+c3RhdHMuc2VudF9wbGlfY291bnQgPSAwOworICBzcmMtPnN0YXRzLnNlbnRfZmlyX2NvdW50ID0gMDsKKyAgc3JjLT5zdGF0cy5zZW50X25hY2tfY291bnQgPSAwOworICBzcmMtPnN0YXRzLnJlY3ZfbmFja19jb3VudCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitydHBfc291cmNlX2luaXQgKFJUUFNvdXJjZSAqIHNyYykKK3sKKyAgLyogc291cmNlcyBhcmUgaW5pdGlhbHkgb24gcHJvYmF0aW9uIHVudGlsIHdlIHJlY2VpdmUgZW5vdWdoIHZhbGlkIFJUUAorICAgKiBwYWNrZXRzIG9yIGEgdmFsaWQgUlRDUCBwYWNrZXQgKi8KKyAgc3JjLT52YWxpZGF0ZWQgPSBGQUxTRTsKKyAgc3JjLT5pbnRlcm5hbCA9IEZBTFNFOworICBzcmMtPnByb2JhdGlvbiA9IERFRkFVTFRfUFJPQkFUSU9OOworICBzcmMtPmN1cnJfcHJvYmF0aW9uID0gc3JjLT5wcm9iYXRpb247CisgIHNyYy0+Y2xvc2luZyA9IEZBTFNFOworICBzcmMtPm1heF9kcm9wb3V0X3RpbWUgPSBERUZBVUxUX01BWF9EUk9QT1VUX1RJTUU7CisgIHNyYy0+bWF4X21pc29yZGVyX3RpbWUgPSBERUZBVUxUX01BWF9NSVNPUkRFUl9USU1FOworCisgIHNyYy0+c2RlcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5ICgiYXBwbGljYXRpb24veC1ydHAtc291cmNlLXNkZXMiKTsKKworICBzcmMtPnBheWxvYWQgPSAtMTsKKyAgc3JjLT5jbG9ja19yYXRlID0gLTE7CisgIHNyYy0+cGFja2V0cyA9IGdfcXVldWVfbmV3ICgpOworICBzcmMtPnNlcW51bV9vZmZzZXQgPSAtMTsKKyAgc3JjLT5sYXN0X3J0cHRpbWUgPSAtMTsKKworICBzcmMtPnJldGFpbmVkX2ZlZWRiYWNrID0gZ19xdWV1ZV9uZXcgKCk7CisgIHNyYy0+bmFja3MgPSBnX2FycmF5X25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKGd1aW50MzIpKTsKKworICBzcmMtPnJlcG9ydGVkX2luX3NyX29mID0gZ19oYXNoX3RhYmxlX25ldyAoZ19kaXJlY3RfaGFzaCwgZ19kaXJlY3RfZXF1YWwpOworCisgIHNyYy0+bGFzdF9rZXlmcmFtZV9yZXF1ZXN0ID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBydHBfc291cmNlX3Jlc2V0IChzcmMpOworCisgIHNyYy0+cHRfc2V0ID0gRkFMU0U7Cit9CisKK3ZvaWQKK3J0cF9jb25mbGljdGluZ19hZGRyZXNzX2ZyZWUgKFJUUENvbmZsaWN0aW5nQWRkcmVzcyAqIGFkZHIpCit7CisgIGdfb2JqZWN0X3VucmVmIChhZGRyLT5hZGRyZXNzKTsKKyAgZ19zbGljZV9mcmVlIChSVFBDb25mbGljdGluZ0FkZHJlc3MsIGFkZHIpOworfQorCitzdGF0aWMgdm9pZAorcnRwX3NvdXJjZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgUlRQU291cmNlICpzcmM7CisKKyAgc3JjID0gUlRQX1NPVVJDRV9DQVNUIChvYmplY3QpOworCisgIGdfcXVldWVfZm9yZWFjaCAoc3JjLT5wYWNrZXRzLCAoR0Z1bmMpIGdzdF9idWZmZXJfdW5yZWYsIE5VTEwpOworICBnX3F1ZXVlX2ZyZWUgKHNyYy0+cGFja2V0cyk7CisKKyAgZ3N0X3N0cnVjdHVyZV9mcmVlIChzcmMtPnNkZXMpOworCisgIGdfZnJlZSAoc3JjLT5ieWVfcmVhc29uKTsKKworICBnc3RfY2Fwc19yZXBsYWNlICgmc3JjLT5jYXBzLCBOVUxMKTsKKworICBnX2xpc3RfZnJlZV9mdWxsIChzcmMtPmNvbmZsaWN0aW5nX2FkZHJlc3NlcywKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgcnRwX2NvbmZsaWN0aW5nX2FkZHJlc3NfZnJlZSk7CisgIGdfcXVldWVfZm9yZWFjaCAoc3JjLT5yZXRhaW5lZF9mZWVkYmFjaywgKEdGdW5jKSBnc3RfYnVmZmVyX3VucmVmLCBOVUxMKTsKKyAgZ19xdWV1ZV9mcmVlIChzcmMtPnJldGFpbmVkX2ZlZWRiYWNrKTsKKworICBnX2FycmF5X2ZyZWUgKHNyYy0+bmFja3MsIFRSVUUpOworCisgIGlmIChzcmMtPnJ0cF9mcm9tKQorICAgIGdfb2JqZWN0X3VucmVmIChzcmMtPnJ0cF9mcm9tKTsKKyAgaWYgKHNyYy0+cnRjcF9mcm9tKQorICAgIGdfb2JqZWN0X3VucmVmIChzcmMtPnJ0Y3BfZnJvbSk7CisKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChzcmMtPnJlcG9ydGVkX2luX3NyX29mKTsKKworICBHX09CSkVDVF9DTEFTUyAocnRwX3NvdXJjZV9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIEdzdFN0cnVjdHVyZSAqCitydHBfc291cmNlX2NyZWF0ZV9zdGF0cyAoUlRQU291cmNlICogc3JjKQoreworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIGdib29sZWFuIGlzX3NlbmRlciA9IHNyYy0+aXNfc2VuZGVyOworICBnYm9vbGVhbiBpbnRlcm5hbCA9IHNyYy0+aW50ZXJuYWw7CisgIGdjaGFyICphZGRyZXNzX3N0cjsKKyAgZ2Jvb2xlYW4gaGF2ZV9yYjsKKyAgZ3VpbnQ4IGZyYWN0aW9ubG9zdCA9IDA7CisgIGdpbnQzMiBwYWNrZXRzbG9zdCA9IDA7CisgIGd1aW50MzIgZXh0aGlnaGVzdHNlcSA9IDA7CisgIGd1aW50MzIgaml0dGVyID0gMDsKKyAgZ3VpbnQzMiBsc3IgPSAwOworICBndWludDMyIGRsc3IgPSAwOworICBndWludDMyIHJvdW5kX3RyaXAgPSAwOworICBnYm9vbGVhbiBoYXZlX3NyOworICBHc3RDbG9ja1RpbWUgdGltZSA9IDA7CisgIGd1aW50NjQgbnRwdGltZSA9IDA7CisgIGd1aW50MzIgcnRwdGltZSA9IDA7CisgIGd1aW50MzIgcGFja2V0X2NvdW50ID0gMDsKKyAgZ3VpbnQzMiBvY3RldF9jb3VudCA9IDA7CisKKworICAvKiBjb21tb24gZGF0YSBmb3IgYWxsIHR5cGVzIG9mIHNvdXJjZXMgKi8KKyAgcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1ydHAtc291cmNlLXN0YXRzIiwKKyAgICAgICJzc3JjIiwgR19UWVBFX1VJTlQsIChndWludCkgc3JjLT5zc3JjLAorICAgICAgImludGVybmFsIiwgR19UWVBFX0JPT0xFQU4sIGludGVybmFsLAorICAgICAgInZhbGlkYXRlZCIsIEdfVFlQRV9CT09MRUFOLCBzcmMtPnZhbGlkYXRlZCwKKyAgICAgICJyZWNlaXZlZC1ieWUiLCBHX1RZUEVfQk9PTEVBTiwgc3JjLT5tYXJrZWRfYnllLAorICAgICAgImlzLWNzcmMiLCBHX1RZUEVfQk9PTEVBTiwgc3JjLT5pc19jc3JjLAorICAgICAgImlzLXNlbmRlciIsIEdfVFlQRV9CT09MRUFOLCBpc19zZW5kZXIsCisgICAgICAic2VxbnVtLWJhc2UiLCBHX1RZUEVfSU5ULCBzcmMtPnNlcW51bV9vZmZzZXQsCisgICAgICAiY2xvY2stcmF0ZSIsIEdfVFlQRV9JTlQsIHNyYy0+Y2xvY2tfcmF0ZSwgTlVMTCk7CisKKyAgLyogYWRkIGFkZHJlc3MgYW5kIHBvcnQgKi8KKyAgaWYgKHNyYy0+cnRwX2Zyb20pIHsKKyAgICBhZGRyZXNzX3N0ciA9IF9fZ19zb2NrZXRfYWRkcmVzc190b19zdHJpbmcgKHNyYy0+cnRwX2Zyb20pOworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAicnRwLWZyb20iLCBHX1RZUEVfU1RSSU5HLCBhZGRyZXNzX3N0ciwgTlVMTCk7CisgICAgZ19mcmVlIChhZGRyZXNzX3N0cik7CisgIH0KKyAgaWYgKHNyYy0+cnRjcF9mcm9tKSB7CisgICAgYWRkcmVzc19zdHIgPSBfX2dfc29ja2V0X2FkZHJlc3NfdG9fc3RyaW5nIChzcmMtPnJ0Y3BfZnJvbSk7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJydGNwLWZyb20iLCBHX1RZUEVfU1RSSU5HLCBhZGRyZXNzX3N0ciwgTlVMTCk7CisgICAgZ19mcmVlIChhZGRyZXNzX3N0cik7CisgIH0KKworICBnc3Rfc3RydWN0dXJlX3NldCAocywKKyAgICAgICJvY3RldHMtc2VudCIsIEdfVFlQRV9VSU5UNjQsIHNyYy0+c3RhdHMub2N0ZXRzX3NlbnQsCisgICAgICAicGFja2V0cy1zZW50IiwgR19UWVBFX1VJTlQ2NCwgc3JjLT5zdGF0cy5wYWNrZXRzX3NlbnQsCisgICAgICAib2N0ZXRzLXJlY2VpdmVkIiwgR19UWVBFX1VJTlQ2NCwgc3JjLT5zdGF0cy5vY3RldHNfcmVjZWl2ZWQsCisgICAgICAicGFja2V0cy1yZWNlaXZlZCIsIEdfVFlQRV9VSU5UNjQsIHNyYy0+c3RhdHMucGFja2V0c19yZWNlaXZlZCwKKyAgICAgICJiaXRyYXRlIiwgR19UWVBFX1VJTlQ2NCwgc3JjLT5iaXRyYXRlLAorICAgICAgInBhY2tldHMtbG9zdCIsIEdfVFlQRV9JTlQsCisgICAgICAoZ2ludCkgcnRwX3N0YXRzX2dldF9wYWNrZXRzX2xvc3QgKCZzcmMtPnN0YXRzKSwgImppdHRlciIsIEdfVFlQRV9VSU5ULAorICAgICAgKGd1aW50KSAoc3JjLT5zdGF0cy5qaXR0ZXIgPj4gNCksCisgICAgICAic2VudC1wbGktY291bnQiLCBHX1RZUEVfVUlOVCwgc3JjLT5zdGF0cy5zZW50X3BsaV9jb3VudCwKKyAgICAgICJyZWN2LXBsaS1jb3VudCIsIEdfVFlQRV9VSU5ULCBzcmMtPnN0YXRzLnJlY3ZfcGxpX2NvdW50LAorICAgICAgInNlbnQtZmlyLWNvdW50IiwgR19UWVBFX1VJTlQsIHNyYy0+c3RhdHMuc2VudF9maXJfY291bnQsCisgICAgICAicmVjdi1maXItY291bnQiLCBHX1RZUEVfVUlOVCwgc3JjLT5zdGF0cy5yZWN2X2Zpcl9jb3VudCwKKyAgICAgICJzZW50LW5hY2stY291bnQiLCBHX1RZUEVfVUlOVCwgc3JjLT5zdGF0cy5zZW50X25hY2tfY291bnQsCisgICAgICAicmVjdi1uYWNrLWNvdW50IiwgR19UWVBFX1VJTlQsIHNyYy0+c3RhdHMucmVjdl9uYWNrX2NvdW50LCBOVUxMKTsKKworICAvKiBnZXQgdGhlIGxhc3QgU1IuICovCisgIGhhdmVfc3IgPSBydHBfc291cmNlX2dldF9sYXN0X3NyIChzcmMsICZ0aW1lLCAmbnRwdGltZSwgJnJ0cHRpbWUsCisgICAgICAmcGFja2V0X2NvdW50LCAmb2N0ZXRfY291bnQpOworICBnc3Rfc3RydWN0dXJlX3NldCAocywKKyAgICAgICJoYXZlLXNyIiwgR19UWVBFX0JPT0xFQU4sIGhhdmVfc3IsCisgICAgICAic3ItbnRwdGltZSIsIEdfVFlQRV9VSU5UNjQsIG50cHRpbWUsCisgICAgICAic3ItcnRwdGltZSIsIEdfVFlQRV9VSU5ULCAoZ3VpbnQpIHJ0cHRpbWUsCisgICAgICAic3Itb2N0ZXQtY291bnQiLCBHX1RZUEVfVUlOVCwgKGd1aW50KSBvY3RldF9jb3VudCwKKyAgICAgICJzci1wYWNrZXQtY291bnQiLCBHX1RZUEVfVUlOVCwgKGd1aW50KSBwYWNrZXRfY291bnQsIE5VTEwpOworCisgIGlmICghaW50ZXJuYWwpIHsKKyAgICAvKiBnZXQgdGhlIGxhc3QgUkIgd2Ugc2VudCAqLworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLAorICAgICAgICAic2VudC1yYiIsIEdfVFlQRV9CT09MRUFOLCBzcmMtPmxhc3RfcnIuaXNfdmFsaWQsCisgICAgICAgICJzZW50LXJiLWZyYWN0aW9ubG9zdCIsIEdfVFlQRV9VSU5ULCAoZ3VpbnQpIHNyYy0+bGFzdF9yci5mcmFjdGlvbmxvc3QsCisgICAgICAgICJzZW50LXJiLXBhY2tldHNsb3N0IiwgR19UWVBFX0lOVCwgKGdpbnQpIHNyYy0+bGFzdF9yci5wYWNrZXRzbG9zdCwKKyAgICAgICAgInNlbnQtcmItZXh0aGlnaGVzdHNlcSIsIEdfVFlQRV9VSU5ULAorICAgICAgICAoZ3VpbnQpIHNyYy0+bGFzdF9yci5leHRoaWdoZXN0c2VxLCAic2VudC1yYi1qaXR0ZXIiLCBHX1RZUEVfVUlOVCwKKyAgICAgICAgKGd1aW50KSBzcmMtPmxhc3RfcnIuaml0dGVyLCAic2VudC1yYi1sc3IiLCBHX1RZUEVfVUlOVCwKKyAgICAgICAgKGd1aW50KSBzcmMtPmxhc3RfcnIubHNyLCAic2VudC1yYi1kbHNyIiwgR19UWVBFX1VJTlQsCisgICAgICAgIChndWludCkgc3JjLT5sYXN0X3JyLmRsc3IsIE5VTEwpOworCisgICAgLyogZ2V0IHRoZSBsYXN0IFJCICovCisgICAgaGF2ZV9yYiA9IHJ0cF9zb3VyY2VfZ2V0X2xhc3RfcmIgKHNyYywgJmZyYWN0aW9ubG9zdCwgJnBhY2tldHNsb3N0LAorICAgICAgICAmZXh0aGlnaGVzdHNlcSwgJmppdHRlciwgJmxzciwgJmRsc3IsICZyb3VuZF90cmlwKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLAorICAgICAgICAiaGF2ZS1yYiIsIEdfVFlQRV9CT09MRUFOLCBoYXZlX3JiLAorICAgICAgICAicmItZnJhY3Rpb25sb3N0IiwgR19UWVBFX1VJTlQsIChndWludCkgZnJhY3Rpb25sb3N0LAorICAgICAgICAicmItcGFja2V0c2xvc3QiLCBHX1RZUEVfSU5ULCAoZ2ludCkgcGFja2V0c2xvc3QsCisgICAgICAgICJyYi1leHRoaWdoZXN0c2VxIiwgR19UWVBFX1VJTlQsIChndWludCkgZXh0aGlnaGVzdHNlcSwKKyAgICAgICAgInJiLWppdHRlciIsIEdfVFlQRV9VSU5ULCAoZ3VpbnQpIGppdHRlciwKKyAgICAgICAgInJiLWxzciIsIEdfVFlQRV9VSU5ULCAoZ3VpbnQpIGxzciwKKyAgICAgICAgInJiLWRsc3IiLCBHX1RZUEVfVUlOVCwgKGd1aW50KSBkbHNyLAorICAgICAgICAicmItcm91bmQtdHJpcCIsIEdfVFlQRV9VSU5ULCAoZ3VpbnQpIHJvdW5kX3RyaXAsIE5VTEwpOworICB9CisKKyAgcmV0dXJuIHM7Cit9CisKKy8qKgorICogcnRwX3NvdXJjZV9nZXRfc2Rlc19zdHJ1Y3Q6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKgorICogR2V0IHRoZSBTREVTIGZyb20gQHNyYy4gU2VlIHRoZSBTREVTIHByb3BlcnR5IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogUmV0dXJuczogJUdzdFN0cnVjdHVyZSBvZiB0eXBlICJhcHBsaWNhdGlvbi94LXJ0cC1zb3VyY2Utc2RlcyIuIFRoZSByZXN1bHQgaXMKKyAqIHZhbGlkIHVudGlsIHRoZSBTREVTIGl0ZW1zIG9mIEBzcmMgYXJlIG1vZGlmaWVkLgorICovCitjb25zdCBHc3RTdHJ1Y3R1cmUgKgorcnRwX3NvdXJjZV9nZXRfc2Rlc19zdHJ1Y3QgKFJUUFNvdXJjZSAqIHNyYykKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFJUUF9JU19TT1VSQ0UgKHNyYyksIE5VTEwpOworCisgIHJldHVybiBzcmMtPnNkZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorc2Rlc19zdHJ1Y3RfY29tcGFyZV9mdW5jIChHUXVhcmsgZmllbGRfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLAorICAgIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0U3RydWN0dXJlICpvbGQ7CisgIGNvbnN0IGdjaGFyICpmaWVsZDsKKworICBvbGQgPSBHU1RfU1RSVUNUVVJFICh1c2VyX2RhdGEpOworICBmaWVsZCA9IGdfcXVhcmtfdG9fc3RyaW5nIChmaWVsZF9pZCk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAob2xkLCBmaWVsZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGdfYXNzZXJ0IChHX1ZBTFVFX0hPTERTX1NUUklORyAodmFsdWUpKTsKKworICByZXR1cm4gc3RyY21wIChnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSwgZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChvbGQsCisgICAgICAgICAgZmllbGQpKSA9PSAwOworfQorCisvKioKKyAqIHJ0cF9zb3VyY2Vfc2V0X3NkZXNfc3RydWN0OgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICogQHNkZXM6IHRoZSBTREVTIHN0cnVjdHVyZQorICoKKyAqIFN0b3JlIHRoZSBAc2RlcyBpbiBAc3JjLiBAc2RlcyBtdXN0IGJlIGEgc3RydWN0dXJlIG9mIHR5cGUKKyAqICJhcHBsaWNhdGlvbi94LXJ0cC1zb3VyY2Utc2RlcyIsIHNlZSB0aGUgU0RFUyBwcm9wZXJ0eSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgb3duZXJzaGlwIG9mIEBzZGVzLgorICoKKyAqIFJldHVybnM6ICVGQUxTRSBpZiB0aGUgU0RFUyB3YXMgdW5jaGFuZ2VkLgorICovCitnYm9vbGVhbgorcnRwX3NvdXJjZV9zZXRfc2Rlc19zdHJ1Y3QgKFJUUFNvdXJjZSAqIHNyYywgR3N0U3RydWN0dXJlICogc2RlcykKK3sKKyAgZ2Jvb2xlYW4gY2hhbmdlZDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoUlRQX0lTX1NPVVJDRSAoc3JjKSwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc3RyY21wIChnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzZGVzKSwKKyAgICAgICAgICAiYXBwbGljYXRpb24veC1ydHAtc291cmNlLXNkZXMiKSA9PSAwLCBGQUxTRSk7CisKKyAgY2hhbmdlZCA9ICFnc3Rfc3RydWN0dXJlX2ZvcmVhY2ggKHNkZXMsIHNkZXNfc3RydWN0X2NvbXBhcmVfZnVuYywgc3JjLT5zZGVzKTsKKworICBpZiAoY2hhbmdlZCkgeworICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoc3JjLT5zZGVzKTsKKyAgICBzcmMtPnNkZXMgPSBzZGVzOworICB9IGVsc2UgeworICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoc2Rlcyk7CisgIH0KKyAgcmV0dXJuIGNoYW5nZWQ7Cit9CisKK3N0YXRpYyB2b2lkCitydHBfc291cmNlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBSVFBTb3VyY2UgKnNyYzsKKworICBzcmMgPSBSVFBfU09VUkNFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TU1JDOgorICAgICAgc3JjLT5zc3JjID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BST0JBVElPTjoKKyAgICAgIHNyYy0+cHJvYmF0aW9uID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9EUk9QT1VUX1RJTUU6CisgICAgICBzcmMtPm1heF9kcm9wb3V0X3RpbWUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX01JU09SREVSX1RJTUU6CisgICAgICBzcmMtPm1heF9taXNvcmRlcl90aW1lID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorcnRwX3NvdXJjZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgUlRQU291cmNlICpzcmM7CisKKyAgc3JjID0gUlRQX1NPVVJDRSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU1NSQzoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBydHBfc291cmNlX2dldF9zc3JjIChzcmMpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JU19DU1JDOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHJ0cF9zb3VyY2VfaXNfYXNfY3NyYyAoc3JjKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSVNfVkFMSURBVEVEOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHJ0cF9zb3VyY2VfaXNfdmFsaWRhdGVkIChzcmMpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JU19TRU5ERVI6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcnRwX3NvdXJjZV9pc19zZW5kZXIgKHNyYykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NERVM6CisgICAgICBnX3ZhbHVlX3NldF9ib3hlZCAodmFsdWUsIHJ0cF9zb3VyY2VfZ2V0X3NkZXNfc3RydWN0IChzcmMpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVEFUUzoKKyAgICAgIGdfdmFsdWVfdGFrZV9ib3hlZCAodmFsdWUsIHJ0cF9zb3VyY2VfY3JlYXRlX3N0YXRzIChzcmMpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9CQVRJT046CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc3JjLT5wcm9iYXRpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9EUk9QT1VUX1RJTUU6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc3JjLT5tYXhfZHJvcG91dF90aW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfTUlTT1JERVJfVElNRToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzcmMtPm1heF9taXNvcmRlcl90aW1lKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyoqCisgKiBydHBfc291cmNlX25ldzoKKyAqIEBzc3JjOiBhbiBTU1JDCisgKgorICogQ3JlYXRlIGEgI1JUUFNvdXJjZSB3aXRoIEBzc3JjLgorICoKKyAqIFJldHVybnM6IGEgbmV3ICNSVFBTb3VyY2UuIFVzZSBnX29iamVjdF91bnJlZigpIGFmdGVyIHVzYWdlLgorICovCitSVFBTb3VyY2UgKgorcnRwX3NvdXJjZV9uZXcgKGd1aW50MzIgc3NyYykKK3sKKyAgUlRQU291cmNlICpzcmM7CisKKyAgc3JjID0gZ19vYmplY3RfbmV3IChSVFBfVFlQRV9TT1VSQ0UsIE5VTEwpOworICBzcmMtPnNzcmMgPSBzc3JjOworCisgIHJldHVybiBzcmM7Cit9CisKKy8qKgorICogcnRwX3NvdXJjZV9zZXRfY2FsbGJhY2tzOgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICogQGNiOiBjYWxsYmFjayBmdW5jdGlvbnMKKyAqIEB1c2VyX2RhdGE6IHVzZXIgZGF0YQorICoKKyAqIFNldCB0aGUgY2FsbGJhY2tzIGZvciB0aGUgc291cmNlLgorICovCit2b2lkCitydHBfc291cmNlX3NldF9jYWxsYmFja3MgKFJUUFNvdXJjZSAqIHNyYywgUlRQU291cmNlQ2FsbGJhY2tzICogY2IsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBnX3JldHVybl9pZl9mYWlsIChSVFBfSVNfU09VUkNFIChzcmMpKTsKKworICBzcmMtPmNhbGxiYWNrcy5wdXNoX3J0cCA9IGNiLT5wdXNoX3J0cDsKKyAgc3JjLT5jYWxsYmFja3MuY2xvY2tfcmF0ZSA9IGNiLT5jbG9ja19yYXRlOworICBzcmMtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKK30KKworLyoqCisgKiBydHBfc291cmNlX2dldF9zc3JjOgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICoKKyAqIEdldCB0aGUgU1NSQyBvZiBAc291cmNlLgorICoKKyAqIFJldHVybnM6IHRoZSBTU1JDIG9mIHNyYy4KKyAqLworZ3VpbnQzMgorcnRwX3NvdXJjZV9nZXRfc3NyYyAoUlRQU291cmNlICogc3JjKQoreworICBndWludDMyIHJlc3VsdDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoUlRQX0lTX1NPVVJDRSAoc3JjKSwgMCk7CisKKyAgcmVzdWx0ID0gc3JjLT5zc3JjOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcnRwX3NvdXJjZV9zZXRfYXNfY3NyYzoKKyAqIEBzcmM6IGFuICNSVFBTb3VyY2UKKyAqCisgKiBDb25maWd1cmUgQHNyYyBhcyBhIENTUkMsIHRoaXMgd2lsbCBhbHNvIHZhbGlkYXRlIEBzcmMuCisgKi8KK3ZvaWQKK3J0cF9zb3VyY2Vfc2V0X2FzX2NzcmMgKFJUUFNvdXJjZSAqIHNyYykKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoUlRQX0lTX1NPVVJDRSAoc3JjKSk7CisKKyAgc3JjLT52YWxpZGF0ZWQgPSBUUlVFOworICBzcmMtPmlzX2NzcmMgPSBUUlVFOworfQorCisvKioKKyAqIHJ0cF9zb3VyY2VfaXNfYXNfY3NyYzoKKyAqIEBzcmM6IGFuICNSVFBTb3VyY2UKKyAqCisgKiBDaGVjayBpZiBAc3JjIGlzIGEgY29udHJpYnV0aW5nIHNvdXJjZS4KKyAqCisgKiBSZXR1cm5zOiAlVFJVRSBpZiBAc3JjIGlzIGFjdGluZyBhcyBhIGNvbnRyaWJ1dGluZyBzb3VyY2UuCisgKi8KK2dib29sZWFuCitydHBfc291cmNlX2lzX2FzX2NzcmMgKFJUUFNvdXJjZSAqIHNyYykKK3sKKyAgZ2Jvb2xlYW4gcmVzdWx0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU09VUkNFIChzcmMpLCBGQUxTRSk7CisKKyAgcmVzdWx0ID0gc3JjLT5pc19jc3JjOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcnRwX3NvdXJjZV9pc19hY3RpdmU6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKgorICogQ2hlY2sgaWYgQHNyYyBpcyBhbiBhY3RpdmUgc291cmNlLiBBIHNvdXJjZSBpcyBhY3RpdmUgaWYgaXQgaGFzIGJlZW4KKyAqIHZhbGlkYXRlZCBhbmQgaGFzIG5vdCB5ZXQgcmVjZWl2ZWQgYSBCWUUgcGFja2V0CisgKgorICogUmV0dXJuczogJVRSVUUgaWYgQHNyYyBpcyBhbiBxYWN0aXZlIHNvdXJjZS4KKyAqLworZ2Jvb2xlYW4KK3J0cF9zb3VyY2VfaXNfYWN0aXZlIChSVFBTb3VyY2UgKiBzcmMpCit7CisgIGdib29sZWFuIHJlc3VsdDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoUlRQX0lTX1NPVVJDRSAoc3JjKSwgRkFMU0UpOworCisgIHJlc3VsdCA9IFJUUF9TT1VSQ0VfSVNfQUNUSVZFIChzcmMpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcnRwX3NvdXJjZV9pc192YWxpZGF0ZWQ6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKgorICogQ2hlY2sgaWYgQHNyYyBpcyBhIHZhbGlkYXRlZCBzb3VyY2UuCisgKgorICogUmV0dXJuczogJVRSVUUgaWYgQHNyYyBpcyBhIHZhbGlkYXRlZCBzb3VyY2UuCisgKi8KK2dib29sZWFuCitydHBfc291cmNlX2lzX3ZhbGlkYXRlZCAoUlRQU291cmNlICogc3JjKQoreworICBnYm9vbGVhbiByZXN1bHQ7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFJUUF9JU19TT1VSQ0UgKHNyYyksIEZBTFNFKTsKKworICByZXN1bHQgPSBzcmMtPnZhbGlkYXRlZDsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHJ0cF9zb3VyY2VfaXNfc2VuZGVyOgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICoKKyAqIENoZWNrIGlmIEBzcmMgaXMgYSBzZW5kaW5nIHNvdXJjZS4KKyAqCisgKiBSZXR1cm5zOiAlVFJVRSBpZiBAc3JjIGlzIGEgc2VuZGluZyBzb3VyY2UuCisgKi8KK2dib29sZWFuCitydHBfc291cmNlX2lzX3NlbmRlciAoUlRQU291cmNlICogc3JjKQoreworICBnYm9vbGVhbiByZXN1bHQ7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFJUUF9JU19TT1VSQ0UgKHNyYyksIEZBTFNFKTsKKworICByZXN1bHQgPSBSVFBfU09VUkNFX0lTX1NFTkRFUiAoc3JjKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHJ0cF9zb3VyY2VfaXNfbWFya2VkX2J5ZToKKyAqIEBzcmM6IGFuICNSVFBTb3VyY2UKKyAqCisgKiBDaGVjayBpZiBAc3JjIGlzIG1hcmtlZCBhcyBsZWF2aW5nIHRoZSBzZXNzaW9uIHdpdGggYSBCWUUgcGFja2V0LgorICoKKyAqIFJldHVybnM6ICVUUlVFIGlmIEBzcmMgaGFzIGJlZW4gbWFya2VkIEJZRS4KKyAqLworZ2Jvb2xlYW4KK3J0cF9zb3VyY2VfaXNfbWFya2VkX2J5ZSAoUlRQU291cmNlICogc3JjKQoreworICBnYm9vbGVhbiByZXN1bHQ7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFJUUF9JU19TT1VSQ0UgKHNyYyksIEZBTFNFKTsKKworICByZXN1bHQgPSBSVFBfU09VUkNFX0lTX01BUktFRF9CWUUgKHNyYyk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIHJ0cF9zb3VyY2VfZ2V0X2J5ZV9yZWFzb246CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKgorICogR2V0IHRoZSBCWUUgcmVhc29uIGZvciBAc3JjLiBDaGVjayBpZiB0aGUgc291cmNlIGlzIG1hcmtlZCBhcyBsZWF2aW5nIHRoZQorICogc2Vzc2lvbiB3aXRoIGEgQllFIG1lc3NhZ2UgZmlyc3Qgd2l0aCBydHBfc291cmNlX2lzX21hcmtlZF9ieWUoKS4KKyAqCisgKiBSZXR1cm5zOiBUaGUgQllFIHJlYXNvbiBvciBOVUxMIHdoZW4gbm8gcmVhc29uIHdhcyBnaXZlbiBvciB0aGUgc291cmNlIHdhcworICogbm90IG1hcmtlZCBCWUUgeWV0LiBnX2ZyZWUoKSBhZnRlciB1c2FnZS4KKyAqLworZ2NoYXIgKgorcnRwX3NvdXJjZV9nZXRfYnllX3JlYXNvbiAoUlRQU291cmNlICogc3JjKQoreworICBnY2hhciAqcmVzdWx0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU09VUkNFIChzcmMpLCBOVUxMKTsKKworICByZXN1bHQgPSBnX3N0cmR1cCAoc3JjLT5ieWVfcmVhc29uKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHJ0cF9zb3VyY2VfdXBkYXRlX2NhcHM6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKiBAY2FwczogYSAjR3N0Q2FwcworICoKKyAqIFBhcnNlIEBjYXBzIGFuZCBzdG9yZSBhbGwgcmVsZXZhbnQgaW5mb3JtYXRpb24gaW4gQHNvdXJjZS4KKyAqLwordm9pZAorcnRwX3NvdXJjZV91cGRhdGVfY2FwcyAoUlRQU291cmNlICogc3JjLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzOworICBndWludCB2YWw7CisgIGdpbnQgaXZhbDsKKyAgZ2Jvb2xlYW4gcnR4OworCisgIC8qIG5vdGhpbmcgY2hhbmdlZCwgcmV0dXJuICovCisgIGlmIChjYXBzID09IE5VTEwgfHwgc3JjLT5jYXBzID09IGNhcHMpCisgICAgcmV0dXJuOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBydHggPSAoZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAocywgInJ0eC1zc3JjIiwgJnZhbCkgJiYgdmFsID09IHNyYy0+c3NyYyk7CisKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgcnR4ID8gInJ0eC1wYXlsb2FkIiA6ICJwYXlsb2FkIiwgJml2YWwpKQorICAgIHNyYy0+cGF5bG9hZCA9IGl2YWw7CisgIGVsc2UKKyAgICBzcmMtPnBheWxvYWQgPSAtMTsKKworICBHU1RfREVCVUcgKCJnb3QgJXNwYXlsb2FkICVkIiwgcnR4ID8gInJ0eCAiIDogIiIsIHNyYy0+cGF5bG9hZCk7CisKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImNsb2NrLXJhdGUiLCAmaXZhbCkpCisgICAgc3JjLT5jbG9ja19yYXRlID0gaXZhbDsKKyAgZWxzZQorICAgIHNyYy0+Y2xvY2tfcmF0ZSA9IC0xOworCisgIEdTVF9ERUJVRyAoImdvdCBjbG9jay1yYXRlICVkIiwgc3JjLT5jbG9ja19yYXRlKTsKKworICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAocywgcnR4ID8gInJ0eC1zZXFudW0tb2Zmc2V0IiA6ICJzZXFudW0tb2Zmc2V0IiwKKyAgICAgICAgICAmdmFsKSkKKyAgICBzcmMtPnNlcW51bV9vZmZzZXQgPSB2YWw7CisgIGVsc2UKKyAgICBzcmMtPnNlcW51bV9vZmZzZXQgPSAtMTsKKworICBHU1RfREVCVUcgKCJnb3QgJXNzZXFudW0tb2Zmc2V0ICUiIEdfR0lOVDMyX0ZPUk1BVCwgcnR4ID8gInJ0eCAiIDogIiIsCisgICAgICBzcmMtPnNlcW51bV9vZmZzZXQpOworCisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzcmMtPmNhcHMsIGNhcHMpOworfQorCisvKioKKyAqIHJ0cF9zb3VyY2Vfc2V0X3J0cF9mcm9tOgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICogQGFkZHJlc3M6IHRoZSBSVFAgYWRkcmVzcyB0byBzZXQKKyAqCisgKiBTZXQgdGhhdCBAc3JjIGlzIHJlY2VpdmluZyBSVFAgcGFja2V0cyBmcm9tIEBhZGRyZXNzLiBUaGlzIGlzIHVzZWQgZm9yCisgKiBjb2xsaXN0aW9uIGNoZWNraW5nLgorICovCit2b2lkCitydHBfc291cmNlX3NldF9ydHBfZnJvbSAoUlRQU291cmNlICogc3JjLCBHU29ja2V0QWRkcmVzcyAqIGFkZHJlc3MpCit7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKFJUUF9JU19TT1VSQ0UgKHNyYykpOworCisgIGlmIChzcmMtPnJ0cF9mcm9tKQorICAgIGdfb2JqZWN0X3VucmVmIChzcmMtPnJ0cF9mcm9tKTsKKyAgc3JjLT5ydHBfZnJvbSA9IEdfU09DS0VUX0FERFJFU1MgKGdfb2JqZWN0X3JlZiAoYWRkcmVzcykpOworfQorCisvKioKKyAqIHJ0cF9zb3VyY2Vfc2V0X3J0Y3BfZnJvbToKKyAqIEBzcmM6IGFuICNSVFBTb3VyY2UKKyAqIEBhZGRyZXNzOiB0aGUgUlRDUCBhZGRyZXNzIHRvIHNldAorICoKKyAqIFNldCB0aGF0IEBzcmMgaXMgcmVjZWl2aW5nIFJUQ1AgcGFja2V0cyBmcm9tIEBhZGRyZXNzLiBUaGlzIGlzIHVzZWQgZm9yCisgKiBjb2xsaXN0aW9uIGNoZWNraW5nLgorICovCit2b2lkCitydHBfc291cmNlX3NldF9ydGNwX2Zyb20gKFJUUFNvdXJjZSAqIHNyYywgR1NvY2tldEFkZHJlc3MgKiBhZGRyZXNzKQoreworICBnX3JldHVybl9pZl9mYWlsIChSVFBfSVNfU09VUkNFIChzcmMpKTsKKworICBpZiAoc3JjLT5ydGNwX2Zyb20pCisgICAgZ19vYmplY3RfdW5yZWYgKHNyYy0+cnRjcF9mcm9tKTsKKyAgc3JjLT5ydGNwX2Zyb20gPSBHX1NPQ0tFVF9BRERSRVNTIChnX29iamVjdF9yZWYgKGFkZHJlc3MpKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK3B1c2hfcGFja2V0IChSVFBTb3VyY2UgKiBzcmMsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKworICAvKiBwdXNoIHF1ZXVlZCBwYWNrZXRzIGZpcnN0IGlmIGFueSAqLworICB3aGlsZSAoIWdfcXVldWVfaXNfZW1wdHkgKHNyYy0+cGFja2V0cykpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZmZlciA9IEdTVF9CVUZGRVJfQ0FTVCAoZ19xdWV1ZV9wb3BfaGVhZCAoc3JjLT5wYWNrZXRzKSk7CisKKyAgICBHU1RfTE9HICgicHVzaGluZyBxdWV1ZWQgcGFja2V0Iik7CisgICAgaWYgKHNyYy0+Y2FsbGJhY2tzLnB1c2hfcnRwKQorICAgICAgc3JjLT5jYWxsYmFja3MucHVzaF9ydHAgKHNyYywgYnVmZmVyLCBzcmMtPnVzZXJfZGF0YSk7CisgICAgZWxzZQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgfQorICBHU1RfTE9HICgicHVzaGluZyBuZXcgcGFja2V0Iik7CisgIC8qIHB1c2ggcGFja2V0ICovCisgIGlmIChzcmMtPmNhbGxiYWNrcy5wdXNoX3J0cCkKKyAgICByZXQgPSBzcmMtPmNhbGxiYWNrcy5wdXNoX3J0cCAoc3JjLCBidWZmZXIsIHNyYy0+dXNlcl9kYXRhKTsKKyAgZWxzZQorICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdpbnQKK2dldF9jbG9ja19yYXRlIChSVFBTb3VyY2UgKiBzcmMsIGd1aW50OCBwYXlsb2FkKQoreworICBpZiAoc3JjLT5wYXlsb2FkID09IC0xKSB7CisgICAgLyogZmlyc3QgcGF5bG9hZCByZWNlaXZlZCwgbm90aGluZyB3YXMgaW4gdGhlIGNhcHMsIGxvY2sgb24gdG8gdGhpcyBwYXlsb2FkICovCisgICAgc3JjLT5wYXlsb2FkID0gcGF5bG9hZDsKKyAgICBHU1RfREVCVUcgKCJmaXJzdCBwYXlsb2FkICVkIiwgcGF5bG9hZCk7CisgIH0gZWxzZSBpZiAocGF5bG9hZCAhPSBzcmMtPnBheWxvYWQpIHsKKyAgICAvKiB3ZSBoYXZlIGEgZGlmZmVyZW50IHBheWxvYWQgdGhhbiBiZWZvcmUsIHJlc2V0IHRoZSBjbG9jay1yYXRlICovCisgICAgR1NUX0RFQlVHICgibmV3IHBheWxvYWQgJWQiLCBwYXlsb2FkKTsKKyAgICBzcmMtPnBheWxvYWQgPSBwYXlsb2FkOworICAgIHNyYy0+Y2xvY2tfcmF0ZSA9IC0xOworICAgIHNyYy0+c3RhdHMudHJhbnNpdCA9IC0xOworICB9CisKKyAgaWYgKHNyYy0+Y2xvY2tfcmF0ZSA9PSAtMSkgeworICAgIGdpbnQgY2xvY2tfcmF0ZSA9IC0xOworCisgICAgaWYgKHNyYy0+Y2FsbGJhY2tzLmNsb2NrX3JhdGUpCisgICAgICBjbG9ja19yYXRlID0gc3JjLT5jYWxsYmFja3MuY2xvY2tfcmF0ZSAoc3JjLCBwYXlsb2FkLCBzcmMtPnVzZXJfZGF0YSk7CisKKyAgICBHU1RfREVCVUcgKCJnb3QgY2xvY2stcmF0ZSAlZCIsIGNsb2NrX3JhdGUpOworCisgICAgc3JjLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKyAgICBnc3RfcnRwX3BhY2tldF9yYXRlX2N0eF9yZXNldCAoJnNyYy0+cGFja2V0X3JhdGVfY3R4LCBjbG9ja19yYXRlKTsKKyAgfQorICByZXR1cm4gc3JjLT5jbG9ja19yYXRlOworfQorCisvKiBKaXR0ZXIgaXMgdGhlIHZhcmlhdGlvbiBpbiB0aGUgZGVsYXkgb2YgcmVjZWl2ZWQgcGFja2V0cyBpbiBhIGZsb3cuIEl0IGlzCisgKiBtZWFzdXJlZCBieSBjb21wYXJpbmcgdGhlIGludGVydmFsIHdoZW4gUlRQIHBhY2tldHMgd2VyZSBzZW50IHRvIHRoZSBpbnRlcnZhbAorICogYXQgd2hpY2ggdGhleSB3ZXJlIHJlY2VpdmVkLiBGb3IgaW5zdGFuY2UsIGlmIHBhY2tldCAjMSBhbmQgcGFja2V0ICMyIGxlYXZlCisgKiA1MCBtaWxsaXNlY29uZHMgYXBhcnQgYW5kIGFycml2ZSA2MCBtaWxsaXNlY29uZHMgYXBhcnQsIHRoZW4gdGhlIGppdHRlciBpcyAxMAorICogbWlsbGlzZWNvbmRzLiAqLworc3RhdGljIHZvaWQKK2NhbGN1bGF0ZV9qaXR0ZXIgKFJUUFNvdXJjZSAqIHNyYywgUlRQUGFja2V0SW5mbyAqIHBpbmZvKQoreworICBHc3RDbG9ja1RpbWUgcnVubmluZ190aW1lOworICBndWludDMyIHJ0cGFycml2YWwsIHRyYW5zaXQsIHJ0cHRpbWU7CisgIGdpbnQzMiBkaWZmOworICBnaW50IGNsb2NrX3JhdGU7CisgIGd1aW50OCBwdDsKKworICAvKiBnZXQgYXJyaXZhbCB0aW1lICovCisgIGlmICgocnVubmluZ190aW1lID0gcGluZm8tPnJ1bm5pbmdfdGltZSkgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICBnb3RvIG5vX3RpbWU7CisKKyAgcHQgPSBwaW5mby0+cHQ7CisKKyAgR1NUX0xPRyAoIlNTUkMgJTA4eCBnb3QgcGF5bG9hZCAlZCIsIHNyYy0+c3NyYywgcHQpOworCisgIC8qIGdldCBjbG9ja3JhdGUgKi8KKyAgaWYgKChjbG9ja19yYXRlID0gZ2V0X2Nsb2NrX3JhdGUgKHNyYywgcHQpKSA9PSAtMSkKKyAgICBnb3RvIG5vX2Nsb2NrX3JhdGU7CisKKyAgcnRwdGltZSA9IHBpbmZvLT5ydHB0aW1lOworCisgIC8qIGNvbnZlcnQgYXJyaXZhbCB0aW1lIHRvIFJUUCB0aW1lc3RhbXAgdW5pdHMsIHRydW5jYXRlIHRvIDMyIGJpdHMsIHdlIGRvbid0CisgICAqIGNhcmUgYWJvdXQgdGhlIGFic29sdXRlIHZhbHVlLCBqdXN0IHRoZSBkaWZmZXJlbmNlLiAqLworICBydHBhcnJpdmFsID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAocnVubmluZ190aW1lLCBjbG9ja19yYXRlLCBHU1RfU0VDT05EKTsKKworICAvKiB0cmFuc2l0IHRpbWUgaXMgZGlmZmVyZW5jZSB3aXRoIFJUUCB0aW1lc3RhbXAgKi8KKyAgdHJhbnNpdCA9IHJ0cGFycml2YWwgLSBydHB0aW1lOworCisgIC8qIGdldCBBQlMgZGlmZiB3aXRoIHByZXZpb3VzIHRyYW5zaXQgdGltZSAqLworICBpZiAoc3JjLT5zdGF0cy50cmFuc2l0ICE9IC0xKSB7CisgICAgaWYgKHRyYW5zaXQgPiBzcmMtPnN0YXRzLnRyYW5zaXQpCisgICAgICBkaWZmID0gdHJhbnNpdCAtIHNyYy0+c3RhdHMudHJhbnNpdDsKKyAgICBlbHNlCisgICAgICBkaWZmID0gc3JjLT5zdGF0cy50cmFuc2l0IC0gdHJhbnNpdDsKKyAgfSBlbHNlCisgICAgZGlmZiA9IDA7CisKKyAgc3JjLT5zdGF0cy50cmFuc2l0ID0gdHJhbnNpdDsKKworICAvKiB1cGRhdGUgaml0dGVyLCB0aGUgdmFsdWUgd2Ugc3RvcmUgaXMgc2NhbGVkIHVwIHNvIHdlIGNhbiBrZWVwIHByZWNpc2lvbi4gKi8KKyAgc3JjLT5zdGF0cy5qaXR0ZXIgKz0gZGlmZiAtICgoc3JjLT5zdGF0cy5qaXR0ZXIgKyA4KSA+PiA0KTsKKworICBzcmMtPnN0YXRzLnByZXZfcnRwdGltZSA9IHNyYy0+c3RhdHMubGFzdF9ydHB0aW1lOworICBzcmMtPnN0YXRzLmxhc3RfcnRwdGltZSA9IHJ0cGFycml2YWw7CisKKyAgR1NUX0xPRyAoInJ0cGFycml2YWwgJXUsIHJ0cHRpbWUgJXUsIGNsb2NrLXJhdGUgJWQsIGRpZmYgJWQsIGppdHRlcjogJWYiLAorICAgICAgcnRwYXJyaXZhbCwgcnRwdGltZSwgY2xvY2tfcmF0ZSwgZGlmZiwgKHNyYy0+c3RhdHMuaml0dGVyKSAvIDE2LjApOworCisgIHJldHVybjsKKworICAvKiBFUlJPUlMgKi8KK25vX3RpbWU6CisgIHsKKyAgICBHU1RfV0FSTklORyAoImNhbm5vdCBnZXQgY3VycmVudCBydW5uaW5nX3RpbWUiKTsKKyAgICByZXR1cm47CisgIH0KK25vX2Nsb2NrX3JhdGU6CisgIHsKKyAgICBHU1RfV0FSTklORyAoImNhbm5vdCBnZXQgY2xvY2stcmF0ZSBmb3IgcHQgJWQiLCBwdCk7CisgICAgcmV0dXJuOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitpbml0X3NlcSAoUlRQU291cmNlICogc3JjLCBndWludDE2IHNlcSkKK3sKKyAgc3JjLT5zdGF0cy5iYXNlX3NlcSA9IHNlcTsKKyAgc3JjLT5zdGF0cy5tYXhfc2VxID0gc2VxOworICBzcmMtPnN0YXRzLmJhZF9zZXEgPSBSVFBfU0VRX01PRCArIDE7IC8qIHNvIHNlcSA9PSBiYWRfc2VxIGlzIGZhbHNlICovCisgIHNyYy0+c3RhdHMuY3ljbGVzID0gMDsKKyAgc3JjLT5zdGF0cy5wYWNrZXRzX3JlY2VpdmVkID0gMDsKKyAgc3JjLT5zdGF0cy5vY3RldHNfcmVjZWl2ZWQgPSAwOworICBzcmMtPnN0YXRzLmJ5dGVzX3JlY2VpdmVkID0gMDsKKyAgc3JjLT5zdGF0cy5wcmV2X3JlY2VpdmVkID0gMDsKKyAgc3JjLT5zdGF0cy5wcmV2X2V4cGVjdGVkID0gMDsKKyAgc3JjLT5zdGF0cy5yZWN2X3BsaV9jb3VudCA9IDA7CisgIHNyYy0+c3RhdHMucmVjdl9maXJfY291bnQgPSAwOworCisgIEdTVF9ERUJVRyAoImJhc2Vfc2VxICVkIiwgc2VxKTsKK30KKworI2RlZmluZSBCSVRSQVRFX0lOVEVSVkFMICgyICogR1NUX1NFQ09ORCkKKworc3RhdGljIHZvaWQKK2RvX2JpdHJhdGVfZXN0aW1hdGlvbiAoUlRQU291cmNlICogc3JjLCBHc3RDbG9ja1RpbWUgcnVubmluZ190aW1lLAorICAgIGd1aW50NjQgKiBieXRlc19oYW5kbGVkKQoreworICBndWludDY0IGVsYXBzZWQ7CisKKyAgaWYgKHNyYy0+cHJldl9ydGltZSkgeworICAgIGVsYXBzZWQgPSBydW5uaW5nX3RpbWUgLSBzcmMtPnByZXZfcnRpbWU7CisKKyAgICBpZiAoZWxhcHNlZCA+IEJJVFJBVEVfSU5URVJWQUwpIHsKKyAgICAgIGd1aW50NjQgcmF0ZTsKKworICAgICAgcmF0ZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoKmJ5dGVzX2hhbmRsZWQsIDggKiBHU1RfU0VDT05ELCBlbGFwc2VkKTsKKworICAgICAgR1NUX0xPRyAoIkVsYXBzZWQgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBieXRlcyAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgIiwgcmF0ZSAlIiBHX0dVSU5UNjRfRk9STUFULCBlbGFwc2VkLCAqYnl0ZXNfaGFuZGxlZCwgcmF0ZSk7CisKKyAgICAgIGlmIChzcmMtPmJpdHJhdGUgPT0gMCkKKyAgICAgICAgc3JjLT5iaXRyYXRlID0gcmF0ZTsKKyAgICAgIGVsc2UKKyAgICAgICAgc3JjLT5iaXRyYXRlID0gKChzcmMtPmJpdHJhdGUgKiAzKSArIHJhdGUpIC8gNDsKKworICAgICAgc3JjLT5wcmV2X3J0aW1lID0gcnVubmluZ190aW1lOworICAgICAgKmJ5dGVzX2hhbmRsZWQgPSAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfTE9HICgiUmVzZXQgYml0cmF0ZSBtZWFzdXJlbWVudCIpOworICAgIHNyYy0+cHJldl9ydGltZSA9IHJ1bm5pbmdfdGltZTsKKyAgICBzcmMtPmJpdHJhdGUgPSAwOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgordXBkYXRlX3JlY2VpdmVyX3N0YXRzIChSVFBTb3VyY2UgKiBzcmMsIFJUUFBhY2tldEluZm8gKiBwaW5mbywKKyAgICBnYm9vbGVhbiBpc19yZWNlaXZlKQoreworICBndWludDE2IHNlcW5yLCBleHBlY3RlZDsKKyAgUlRQU291cmNlU3RhdHMgKnN0YXRzOworICBnaW50MTYgZGVsdGE7CisgIGdpbnQzMiBwYWNrZXRfcmF0ZSwgbWF4X2Ryb3BvdXQsIG1heF9taXNvcmRlcjsKKworICBzdGF0cyA9ICZzcmMtPnN0YXRzOworCisgIHNlcW5yID0gcGluZm8tPnNlcW51bTsKKworICBwYWNrZXRfcmF0ZSA9CisgICAgICBnc3RfcnRwX3BhY2tldF9yYXRlX2N0eF91cGRhdGUgKCZzcmMtPnBhY2tldF9yYXRlX2N0eCwgcGluZm8tPnNlcW51bSwKKyAgICAgIHBpbmZvLT5ydHB0aW1lKTsKKyAgbWF4X2Ryb3BvdXQgPQorICAgICAgZ3N0X3J0cF9wYWNrZXRfcmF0ZV9jdHhfZ2V0X21heF9kcm9wb3V0ICgmc3JjLT5wYWNrZXRfcmF0ZV9jdHgsCisgICAgICBzcmMtPm1heF9kcm9wb3V0X3RpbWUpOworICBtYXhfbWlzb3JkZXIgPQorICAgICAgZ3N0X3J0cF9wYWNrZXRfcmF0ZV9jdHhfZ2V0X21heF9taXNvcmRlciAoJnNyYy0+cGFja2V0X3JhdGVfY3R4LAorICAgICAgc3JjLT5tYXhfbWlzb3JkZXJfdGltZSk7CisgIEdTVF9UUkFDRSAoIlNTUkMgJTA4eCwgcGFja2V0X3JhdGU6ICVkLCBtYXhfZHJvcG91dDogJWQsIG1heF9taXNvcmRlcjogJWQiLAorICAgICAgc3JjLT5zc3JjLCBwYWNrZXRfcmF0ZSwgbWF4X2Ryb3BvdXQsIG1heF9taXNvcmRlcik7CisKKyAgaWYgKHN0YXRzLT5jeWNsZXMgPT0gLTEpIHsKKyAgICBHU1RfREVCVUcgKCJyZWNlaXZlZCBmaXJzdCBwYWNrZXQiKTsKKyAgICAvKiBmaXJzdCB0aW1lIHdlIGhlYXJkIG9mIHRoaXMgc291cmNlICovCisgICAgaW5pdF9zZXEgKHNyYywgc2VxbnIpOworICAgIHNyYy0+c3RhdHMubWF4X3NlcSA9IHNlcW5yIC0gMTsKKyAgICBzcmMtPmN1cnJfcHJvYmF0aW9uID0gc3JjLT5wcm9iYXRpb247CisgIH0KKworICBpZiAoaXNfcmVjZWl2ZSkgeworICAgIGV4cGVjdGVkID0gc3JjLT5zdGF0cy5tYXhfc2VxICsgMTsKKyAgICBkZWx0YSA9IGdzdF9ydHBfYnVmZmVyX2NvbXBhcmVfc2VxbnVtIChleHBlY3RlZCwgc2VxbnIpOworCisgICAgLyogaWYgd2UgYXJlIHN0aWxsIG9uIHByb2JhdGlvbiwgY2hlY2sgc2VxbnVtICovCisgICAgaWYgKHNyYy0+Y3Vycl9wcm9iYXRpb24pIHsKKyAgICAgIC8qIHdoZW4gaW4gcHJvYmF0aW9uLCB3ZSByZXF1aXJlIGNvbnNlY3V0aXZlIHNlcW51bXMgKi8KKyAgICAgIGlmIChkZWx0YSA9PSAwKSB7CisgICAgICAgIC8qIGV4cGVjdGVkIHBhY2tldCAqLworICAgICAgICBHU1RfREVCVUcgKCJwcm9iYXRpb246IHNlcW5yICVkID09IGV4cGVjdGVkICVkIiwgc2VxbnIsIGV4cGVjdGVkKTsKKyAgICAgICAgc3JjLT5jdXJyX3Byb2JhdGlvbi0tOworICAgICAgICBpZiAoc2VxbnIgPCBzdGF0cy0+bWF4X3NlcSkgeworICAgICAgICAgIC8qIHNlcXVlbmNlIG51bWJlciB3cmFwcGVkIC0gY291bnQgYW5vdGhlciA2NEsgY3ljbGUuICovCisgICAgICAgICAgc3RhdHMtPmN5Y2xlcyArPSBSVFBfU0VRX01PRDsKKyAgICAgICAgfQorICAgICAgICBzcmMtPnN0YXRzLm1heF9zZXEgPSBzZXFucjsKKworICAgICAgICBpZiAoc3JjLT5jdXJyX3Byb2JhdGlvbiA9PSAwKSB7CisgICAgICAgICAgR1NUX0RFQlVHICgicHJvYmF0aW9uIGRvbmUhIik7CisgICAgICAgICAgaW5pdF9zZXEgKHNyYywgc2VxbnIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdzdEJ1ZmZlciAqcTsKKworICAgICAgICAgIEdTVF9ERUJVRyAoInByb2JhdGlvbiAlZDogcXVldWUgcGFja2V0Iiwgc3JjLT5jdXJyX3Byb2JhdGlvbik7CisgICAgICAgICAgLyogd2hlbiBzdGlsbCBpbiBwcm9iYXRpb24sIGtlZXAgcGFja2V0cyBpbiBhIGxpc3QuICovCisgICAgICAgICAgZ19xdWV1ZV9wdXNoX3RhaWwgKHNyYy0+cGFja2V0cywgcGluZm8tPmRhdGEpOworICAgICAgICAgIHBpbmZvLT5kYXRhID0gTlVMTDsKKyAgICAgICAgICAvKiByZW1vdmUgcGFja2V0cyBmcm9tIHF1ZXVlIGlmIHRoZXJlIGFyZSB0b28gbWFueSAqLworICAgICAgICAgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKHNyYy0+cGFja2V0cykgPiBSVFBfTUFYX1BST0JBVElPTl9MRU4pIHsKKyAgICAgICAgICAgIHEgPSBnX3F1ZXVlX3BvcF9oZWFkIChzcmMtPnBhY2tldHMpOworICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocSk7CisgICAgICAgICAgfQorICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogdW5leHBlY3RlZCBzZXFudW0gaW4gcHJvYmF0aW9uICovCisgICAgICAgIGdvdG8gcHJvYmF0aW9uX3NlcW51bTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGRlbHRhID49IDAgJiYgZGVsdGEgPCBtYXhfZHJvcG91dCkgeworICAgICAgLyogQ2xlYXIgYmFkIHBhY2tldHMgKi8KKyAgICAgIHN0YXRzLT5iYWRfc2VxID0gUlRQX1NFUV9NT0QgKyAxOyAvKiBzbyBzZXEgPT0gYmFkX3NlcSBpcyBmYWxzZSAqLworICAgICAgZ19xdWV1ZV9mb3JlYWNoIChzcmMtPnBhY2tldHMsIChHRnVuYykgZ3N0X2J1ZmZlcl91bnJlZiwgTlVMTCk7CisgICAgICBnX3F1ZXVlX2NsZWFyIChzcmMtPnBhY2tldHMpOworCisgICAgICAvKiBpbiBvcmRlciwgd2l0aCBwZXJtaXNzaWJsZSBnYXAgKi8KKyAgICAgIGlmIChzZXFuciA8IHN0YXRzLT5tYXhfc2VxKSB7CisgICAgICAgIC8qIHNlcXVlbmNlIG51bWJlciB3cmFwcGVkIC0gY291bnQgYW5vdGhlciA2NEsgY3ljbGUuICovCisgICAgICAgIHN0YXRzLT5jeWNsZXMgKz0gUlRQX1NFUV9NT0Q7CisgICAgICB9CisgICAgICBzdGF0cy0+bWF4X3NlcSA9IHNlcW5yOworICAgIH0gZWxzZSBpZiAoZGVsdGEgPCAtbWF4X21pc29yZGVyIHx8IGRlbHRhID49IG1heF9kcm9wb3V0KSB7CisgICAgICAvKiB0aGUgc2VxdWVuY2UgbnVtYmVyIG1hZGUgYSB2ZXJ5IGxhcmdlIGp1bXAgKi8KKyAgICAgIGlmIChzZXFuciA9PSBzdGF0cy0+YmFkX3NlcSAmJiBzcmMtPnBhY2tldHMtPmhlYWQpIHsKKyAgICAgICAgLyogdHdvIHNlcXVlbnRpYWwgcGFja2V0cyAtLSBhc3N1bWUgdGhhdCB0aGUgb3RoZXIgc2lkZQorICAgICAgICAgKiByZXN0YXJ0ZWQgd2l0aG91dCB0ZWxsaW5nIHVzIHNvIGp1c3QgcmUtc3luYworICAgICAgICAgKiAoaS5lLiwgcHJldGVuZCB0aGlzIHdhcyB0aGUgZmlyc3QgcGFja2V0KS4gICovCisgICAgICAgIGluaXRfc2VxIChzcmMsIHNlcW5yKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHVuYWNjZXB0YWJsZSBqdW1wICovCisgICAgICAgIHN0YXRzLT5iYWRfc2VxID0gKHNlcW5yICsgMSkgJiAoUlRQX1NFUV9NT0QgLSAxKTsKKyAgICAgICAgZ19xdWV1ZV9mb3JlYWNoIChzcmMtPnBhY2tldHMsIChHRnVuYykgZ3N0X2J1ZmZlcl91bnJlZiwgTlVMTCk7CisgICAgICAgIGdfcXVldWVfY2xlYXIgKHNyYy0+cGFja2V0cyk7CisgICAgICAgIGdfcXVldWVfcHVzaF90YWlsIChzcmMtPnBhY2tldHMsIHBpbmZvLT5kYXRhKTsKKyAgICAgICAgcGluZm8tPmRhdGEgPSBOVUxMOworICAgICAgICBnb3RvIGJhZF9zZXF1ZW5jZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogZGVsdGEgPCAwICYmIGRlbHRhID49IC1tYXhfbWlzb3JkZXIgKi8KKyAgICAgIC8qIENsZWFyIGJhZCBwYWNrZXRzICovCisgICAgICBzdGF0cy0+YmFkX3NlcSA9IFJUUF9TRVFfTU9EICsgMTsgLyogc28gc2VxID09IGJhZF9zZXEgaXMgZmFsc2UgKi8KKyAgICAgIGdfcXVldWVfZm9yZWFjaCAoc3JjLT5wYWNrZXRzLCAoR0Z1bmMpIGdzdF9idWZmZXJfdW5yZWYsIE5VTEwpOworICAgICAgZ19xdWV1ZV9jbGVhciAoc3JjLT5wYWNrZXRzKTsKKworICAgICAgLyogZHVwbGljYXRlIG9yIHJlb3JkZXJlZCBwYWNrZXQsIHdpbGwgYmUgZmlsdGVyZWQgYnkgaml0dGVyYnVmZmVyLiAqLworICAgICAgR1NUX0lORk8gKCJkdXBsaWNhdGUgb3IgcmVvcmRlcmVkIHBhY2tldCAoc2VxbnIgJXUsIGV4cGVjdGVkICV1KSIsCisgICAgICAgICAgc2VxbnIsIGV4cGVjdGVkKTsKKyAgICB9CisgIH0KKworICBzcmMtPnN0YXRzLm9jdGV0c19yZWNlaXZlZCArPSBwaW5mby0+cGF5bG9hZF9sZW47CisgIHNyYy0+c3RhdHMuYnl0ZXNfcmVjZWl2ZWQgKz0gcGluZm8tPmJ5dGVzOworICBzcmMtPnN0YXRzLnBhY2tldHNfcmVjZWl2ZWQrKzsKKyAgLyogZm9yIHRoZSBiaXRyYXRlIGVzdGltYXRpb24gKi8KKyAgc3JjLT5ieXRlc19yZWNlaXZlZCArPSBwaW5mby0+cGF5bG9hZF9sZW47CisKKyAgR1NUX0xPRyAoInNlcSAldSwgUEM6ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgT0M6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBzZXFuciwgc3JjLT5zdGF0cy5wYWNrZXRzX3JlY2VpdmVkLCBzcmMtPnN0YXRzLm9jdGV0c19yZWNlaXZlZCk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitkb25lOgorICB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitiYWRfc2VxdWVuY2U6CisgIHsKKyAgICBHU1RfV0FSTklORworICAgICAgICAoInVuYWNjZXB0YWJsZSBzZXFudW0gcmVjZWl2ZWQgKHNlcW5yICV1LCBkZWx0YSAlZCwgcGFja2V0X3JhdGU6ICVkLCBtYXhfZHJvcG91dDogJWQsIG1heF9taXNvcmRlcjogJWQpIiwKKyAgICAgICAgc2VxbnIsIGRlbHRhLCBwYWNrZXRfcmF0ZSwgbWF4X2Ryb3BvdXQsIG1heF9taXNvcmRlcik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citwcm9iYXRpb25fc2VxbnVtOgorICB7CisgICAgR1NUX1dBUk5JTkcgKCJwcm9iYXRpb246IHNlcW5yICVkICE9IGV4cGVjdGVkICVkIiwgc2VxbnIsIGV4cGVjdGVkKTsKKyAgICBzcmMtPmN1cnJfcHJvYmF0aW9uID0gc3JjLT5wcm9iYXRpb247CisgICAgc3JjLT5zdGF0cy5tYXhfc2VxID0gc2VxbnI7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qKgorICogcnRwX3NvdXJjZV9wcm9jZXNzX3J0cDoKKyAqIEBzcmM6IGFuICNSVFBTb3VyY2UKKyAqIEBwaW5mbzogYW4gI1JUUFBhY2tldEluZm8KKyAqCisgKiBMZXQgQHNyYyBoYW5kbGUgdGhlIGluY29tbWluZyBSVFAgcGFja2V0IGRlc2NyaWJlZCBpbiBAcGluZm8uCisgKgorICogUmV0dXJuczogYSAjR3N0Rmxvd1JldHVybi4KKyAqLworR3N0Rmxvd1JldHVybgorcnRwX3NvdXJjZV9wcm9jZXNzX3J0cCAoUlRQU291cmNlICogc3JjLCBSVFBQYWNrZXRJbmZvICogcGluZm8pCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzdWx0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU09VUkNFIChzcmMpLCBHU1RfRkxPV19FUlJPUik7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChwaW5mbyAhPSBOVUxMLCBHU1RfRkxPV19FUlJPUik7CisKKyAgaWYgKCF1cGRhdGVfcmVjZWl2ZXJfc3RhdHMgKHNyYywgcGluZm8sIFRSVUUpKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICAvKiB0aGUgc291cmNlIHRoYXQgc2VudCB0aGUgcGFja2V0IG11c3QgYmUgYSBzZW5kZXIgKi8KKyAgc3JjLT5pc19zZW5kZXIgPSBUUlVFOworICBzcmMtPnZhbGlkYXRlZCA9IFRSVUU7CisKKyAgZG9fYml0cmF0ZV9lc3RpbWF0aW9uIChzcmMsIHBpbmZvLT5ydW5uaW5nX3RpbWUsICZzcmMtPmJ5dGVzX3JlY2VpdmVkKTsKKworICAvKiBjYWxjdWxhdGUgaml0dGVyIGZvciB0aGUgc3RhdHMgKi8KKyAgY2FsY3VsYXRlX2ppdHRlciAoc3JjLCBwaW5mbyk7CisKKyAgLyogd2UncmUgcmVhZHkgdG8gcHVzaCB0aGUgUlRQIHBhY2tldCBub3cgKi8KKyAgcmVzdWx0ID0gcHVzaF9wYWNrZXQgKHNyYywgcGluZm8tPmRhdGEpOworICBwaW5mby0+ZGF0YSA9IE5VTEw7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBydHBfc291cmNlX21hcmtfYnllOgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICogQHJlYXNvbjogdGhlIHJlYXNvbiBmb3IgbGVhdmluZworICoKKyAqIE1hcmsgQHNyYyBpbiB0aGUgQllFIHN0YXRlLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgc291cmNlIHdhbnRzIHRvCisgKiBsZWF2ZSB0aGUgc2Vzc3Npb24gb3Igd2hlbiBhIEJZRSBwYWNrZXRzIGhhcyBiZWVuIHJlY2VpdmVkLgorICoKKyAqIFRoaXMgd2lsbCBtYWtlIHRoZSBzb3VyY2UgaW5hY3RpdmUuCisgKi8KK3ZvaWQKK3J0cF9zb3VyY2VfbWFya19ieWUgKFJUUFNvdXJjZSAqIHNyYywgY29uc3QgZ2NoYXIgKiByZWFzb24pCit7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKFJUUF9JU19TT1VSQ0UgKHNyYykpOworCisgIEdTVF9ERUJVRyAoIm1hcmtpbmcgU1NSQyAlMDh4IGFzIEJZRSwgcmVhc29uOiAlcyIsIHNyYy0+c3NyYywKKyAgICAgIEdTVF9TVFJfTlVMTCAocmVhc29uKSk7CisKKyAgLyogY29weSB0aGUgcmVhc29uIGFuZCBtYXJrIGFzIGJ5ZSAqLworICBnX2ZyZWUgKHNyYy0+YnllX3JlYXNvbik7CisgIHNyYy0+YnllX3JlYXNvbiA9IGdfc3RyZHVwIChyZWFzb24pOworICBzcmMtPm1hcmtlZF9ieWUgPSBUUlVFOworfQorCisvKioKKyAqIHJ0cF9zb3VyY2Vfc2VuZF9ydHA6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKiBAZGF0YTogYW4gUlRQIGJ1ZmZlciBvciBhIGxpc3Qgb2YgUlRQIGJ1ZmZlcnMKKyAqIEBpc19saXN0OiBpZiBAZGF0YSBpcyBhIGJ1ZmZlciBvciBsaXN0CisgKiBAcnVubmluZ190aW1lOiB0aGUgcnVubmluZyB0aW1lIG9mIEBkYXRhCisgKgorICogU2VuZCBAZGF0YSAoYW4gUlRQIGJ1ZmZlciBvciBsaXN0IG9mIGJ1ZmZlcnMpIG9yaWdpbmF0aW5nIGZyb20gQHNyYy4KKyAqIFRoaXMgd2lsbCBtYWtlIEBzcmMgYSBzZW5kZXIuIFRoaXMgZnVuY3Rpb24gdGFrZXMgb3duZXJzaGlwIG9mIEBkYXRhIGFuZAorICogbW9kaWZpZXMgdGhlIFNTUkMgaW4gdGhlIFJUUCBwYWNrZXQgdG8gdGhhdCBvZiBAc3JjIHdoZW4gbmVlZGVkLgorICoKKyAqIFJldHVybnM6IGEgI0dzdEZsb3dSZXR1cm4uCisgKi8KK0dzdEZsb3dSZXR1cm4KK3J0cF9zb3VyY2Vfc2VuZF9ydHAgKFJUUFNvdXJjZSAqIHNyYywgUlRQUGFja2V0SW5mbyAqIHBpbmZvKQoreworICBHc3RGbG93UmV0dXJuIHJlc3VsdDsKKyAgR3N0Q2xvY2tUaW1lIHJ1bm5pbmdfdGltZTsKKyAgZ3VpbnQzMiBydHB0aW1lOworICBndWludDY0IGV4dF9ydHB0aW1lOworICBndWludDY0IHJ0X2RpZmYsIHJ0cF9kaWZmOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU09VUkNFIChzcmMpLCBHU1RfRkxPV19FUlJPUik7CisKKyAgLyogd2UgYXJlIGEgc2VuZGVyIG5vdyAqLworICBzcmMtPmlzX3NlbmRlciA9IFRSVUU7CisKKyAgLyogd2UgYXJlIGFsc28gYSByZWNlaXZlciBvZiBvdXIgcGFja2V0cyAqLworICBpZiAoIXVwZGF0ZV9yZWNlaXZlcl9zdGF0cyAoc3JjLCBwaW5mbywgRkFMU0UpKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICBpZiAoc3JjLT5wdF9zZXQgJiYgc3JjLT5wdCAhPSBwaW5mby0+cHQpIHsKKyAgICBHU1RfV0FSTklORyAoIkNoYW5naW5nIHB0IGZyb20gJXUgdG8gJXUgZm9yIFNTUkMgJXUiLCBzcmMtPnB0LCBwaW5mby0+cHQsCisgICAgICAgIHNyYy0+c3NyYyk7CisgIH0KKworICBzcmMtPnB0ID0gcGluZm8tPnB0OworICBzcmMtPnB0X3NldCA9IFRSVUU7CisKKyAgLyogdXBkYXRlIHN0YXRzIGZvciB0aGUgU1IgKi8KKyAgc3JjLT5zdGF0cy5wYWNrZXRzX3NlbnQgKz0gcGluZm8tPnBhY2tldHM7CisgIHNyYy0+c3RhdHMub2N0ZXRzX3NlbnQgKz0gcGluZm8tPnBheWxvYWRfbGVuOworICBzcmMtPmJ5dGVzX3NlbnQgKz0gcGluZm8tPnBheWxvYWRfbGVuOworCisgIHJ1bm5pbmdfdGltZSA9IHBpbmZvLT5ydW5uaW5nX3RpbWU7CisKKyAgZG9fYml0cmF0ZV9lc3RpbWF0aW9uIChzcmMsIHJ1bm5pbmdfdGltZSwgJnNyYy0+Ynl0ZXNfc2VudCk7CisKKyAgcnRwdGltZSA9IHBpbmZvLT5ydHB0aW1lOworCisgIGV4dF9ydHB0aW1lID0gc3JjLT5sYXN0X3J0cHRpbWU7CisgIGV4dF9ydHB0aW1lID0gZ3N0X3J0cF9idWZmZXJfZXh0X3RpbWVzdGFtcCAoJmV4dF9ydHB0aW1lLCBydHB0aW1lKTsKKworICBHU1RfTE9HICgiU1NSQyAlMDh4LCBSVFAgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBydW5uaW5nX3RpbWUgJSIKKyAgICAgIEdTVF9USU1FX0ZPUk1BVCwgc3JjLT5zc3JjLCBleHRfcnRwdGltZSwgR1NUX1RJTUVfQVJHUyAocnVubmluZ190aW1lKSk7CisKKyAgaWYgKGV4dF9ydHB0aW1lID4gc3JjLT5sYXN0X3J0cHRpbWUpIHsKKyAgICBydHBfZGlmZiA9IGV4dF9ydHB0aW1lIC0gc3JjLT5sYXN0X3J0cHRpbWU7CisgICAgcnRfZGlmZiA9IHJ1bm5pbmdfdGltZSAtIHNyYy0+bGFzdF9ydGltZTsKKworICAgIC8qIGNhbGMgdGhlIGRpZmYgc28gd2UgY2FuIGRldGVjdCBkcmlmdCBhdCB0aGUgc2VuZGVyLiBUaGlzIGNhbiBhbHNvIGJlIHVzZWQKKyAgICAgKiB0byBndWVzdGltYXRlIHRoZSBjbG9jayByYXRlIGlmIHRoZSBOVFAgdGltZSBpcyBsb2NrZWQgdG8gdGhlIFJUUAorICAgICAqIHRpbWVzdGFtcHMgKGFzIGlzIHRoZSBjYXNlIHdoZW4gdGhlIGNhcHR1cmUgZGV2aWNlIGlzIHByb3ZpZGluZyB0aGUgY2xvY2spLiAqLworICAgIEdTVF9MT0cgKCJTU1JDICUwOHgsIGRpZmYgUlRQICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgZGlmZiBydW5uaW5nX3RpbWUgJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFULCBzcmMtPnNzcmMsIHJ0cF9kaWZmLCBHU1RfVElNRV9BUkdTIChydF9kaWZmKSk7CisgIH0KKworICAvKiB3ZSBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHJlY2VpdmVkIFJUUCB0aW1lc3RhbXAgYW5kIHRoZSBjb3JyZXNwb25kaW5nCisgICAqIGJ1ZmZlciBydW5uaW5nX3RpbWUgc28gdGhhdCB3ZSBjYW4gdXNlIHRoaXMgaW5mbyB3aGVuIGNvbnN0cnVjdGluZyBTUiByZXBvcnRzICovCisgIHNyYy0+bGFzdF9ydGltZSA9IHJ1bm5pbmdfdGltZTsKKyAgc3JjLT5sYXN0X3J0cHRpbWUgPSBleHRfcnRwdGltZTsKKworICAvKiBwdXNoIHBhY2tldCAqLworICBpZiAoIXNyYy0+Y2FsbGJhY2tzLnB1c2hfcnRwKQorICAgIGdvdG8gbm9fY2FsbGJhY2s7CisKKyAgR1NUX0xPRyAoInB1c2hpbmcgUlRQICVzICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBwaW5mby0+aXNfbGlzdCA/ICJsaXN0IiA6ICJwYWNrZXQiLCBzcmMtPnN0YXRzLnBhY2tldHNfc2VudCk7CisKKyAgcmVzdWx0ID0gc3JjLT5jYWxsYmFja3MucHVzaF9ydHAgKHNyYywgcGluZm8tPmRhdGEsIHNyYy0+dXNlcl9kYXRhKTsKKyAgcGluZm8tPmRhdGEgPSBOVUxMOworCisgIHJldHVybiByZXN1bHQ7CisKKyAgLyogRVJST1JTICovCitub19jYWxsYmFjazoKKyAgeworICAgIEdTVF9XQVJOSU5HICgibm8gY2FsbGJhY2sgaW5zdGFsbGVkLCBkcm9wcGluZyBwYWNrZXQiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK30KKworLyoqCisgKiBydHBfc291cmNlX3Byb2Nlc3Nfc3I6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKiBAdGltZTogdGltZSBvZiBwYWNrZXQgYXJyaXZhbAorICogQG50cHRpbWU6IHRoZSBOVFAgdGltZSAoaW4gTlRQIFRpbWVzdGFtcCBGb3JtYXQsIDMyLjMyIGZpeGVkIHBvaW50KQorICogQHJ0cHRpbWU6IHRoZSBSVFAgdGltZSAoaW4gY2xvY2sgcmF0ZSB1bml0cykKKyAqIEBwYWNrZXRfY291bnQ6IHRoZSBwYWNrZXQgY291bnQKKyAqIEBvY3RldF9jb3VudDogdGhlIG9jdGV0IGNvdW50CisgKgorICogVXBkYXRlIHRoZSBzZW5kZXIgcmVwb3J0IGluIEBzcmMuCisgKi8KK3ZvaWQKK3J0cF9zb3VyY2VfcHJvY2Vzc19zciAoUlRQU291cmNlICogc3JjLCBHc3RDbG9ja1RpbWUgdGltZSwgZ3VpbnQ2NCBudHB0aW1lLAorICAgIGd1aW50MzIgcnRwdGltZSwgZ3VpbnQzMiBwYWNrZXRfY291bnQsIGd1aW50MzIgb2N0ZXRfY291bnQpCit7CisgIFJUUFNlbmRlclJlcG9ydCAqY3VycjsKKyAgZ2ludCBjdXJyaWR4OworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKFJUUF9JU19TT1VSQ0UgKHNyYykpOworCisgIEdTVF9ERUJVRyAoImdvdCBTUiBwYWNrZXQ6IFNTUkMgJTA4eCwgTlRQICUwOHg6JTA4eCwgUlRQICUiIEdfR1VJTlQzMl9GT1JNQVQKKyAgICAgICIsIFBDICUiIEdfR1VJTlQzMl9GT1JNQVQgIiwgT0MgJSIgR19HVUlOVDMyX0ZPUk1BVCwgc3JjLT5zc3JjLAorICAgICAgKGd1aW50MzIpIChudHB0aW1lID4+IDMyKSwgKGd1aW50MzIpIChudHB0aW1lICYgMHhmZmZmZmZmZiksIHJ0cHRpbWUsCisgICAgICBwYWNrZXRfY291bnQsIG9jdGV0X2NvdW50KTsKKworICBjdXJyaWR4ID0gc3JjLT5zdGF0cy5jdXJyX3NyIF4gMTsKKyAgY3VyciA9ICZzcmMtPnN0YXRzLnNyW2N1cnJpZHhdOworCisgIC8qIHRoaXMgaXMgYSBzZW5kZXIgbm93ICovCisgIHNyYy0+aXNfc2VuZGVyID0gVFJVRTsKKworICAvKiB1cGRhdGUgY3VycmVudCAqLworICBjdXJyLT5pc192YWxpZCA9IFRSVUU7CisgIGN1cnItPm50cHRpbWUgPSBudHB0aW1lOworICBjdXJyLT5ydHB0aW1lID0gcnRwdGltZTsKKyAgY3Vyci0+cGFja2V0X2NvdW50ID0gcGFja2V0X2NvdW50OworICBjdXJyLT5vY3RldF9jb3VudCA9IG9jdGV0X2NvdW50OworICBjdXJyLT50aW1lID0gdGltZTsKKworICAvKiBtYWtlIGN1cnJlbnQgKi8KKyAgc3JjLT5zdGF0cy5jdXJyX3NyID0gY3VycmlkeDsKKworICBzcmMtPnN0YXRzLnByZXZfcnRjcHRpbWUgPSBzcmMtPnN0YXRzLmxhc3RfcnRjcHRpbWU7CisgIHNyYy0+c3RhdHMubGFzdF9ydGNwdGltZSA9IHRpbWU7Cit9CisKKy8qKgorICogcnRwX3NvdXJjZV9wcm9jZXNzX3JiOgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICogQG50cG5zdGltZTogdGhlIGN1cnJlbnQgdGltZSBpbiBuYW5vc2Vjb25kcyBzaW5jZSAxOTcwCisgKiBAZnJhY3Rpb25sb3N0OiBmcmFjdGlvbiBsb3N0IHNpbmNlIGxhc3QgU1IvUlIKKyAqIEBwYWNrZXRzbG9zdDogdGhlIGN1bXVsYXRpdmUgbnVtYmVyIG9mIHBhY2tldHMgbG9zdAorICogQGV4dGhpZ2hlc3RzZXE6IHRoZSBleHRlbmRlZCBsYXN0IHNlcXVlbmNlIG51bWJlciByZWNlaXZlZAorICogQGppdHRlcjogdGhlIGludGVyYXJyaXZhbCBqaXR0ZXIgKGluIGNsb2NrIHJhdGUgdW5pdHMpCisgKiBAbHNyOiB0aGUgdGltZSBvZiB0aGUgbGFzdCBTUiBwYWNrZXQgb24gdGhpcyBzb3VyY2UKKyAqICAgKGluIE5UUCBTaG9ydCBGb3JtYXQsIDE2LjE2IGZpeGVkIHBvaW50KQorICogQGRsc3I6IHRoZSBkZWxheSBzaW5jZSB0aGUgbGFzdCBTUiBwYWNrZXQKKyAqICAgKGluIE5UUCBTaG9ydCBGb3JtYXQsIDE2LjE2IGZpeGVkIHBvaW50KQorICoKKyAqIFVwZGF0ZSB0aGUgcmVwb3J0IGJsb2NrIGluIEBzcmMuCisgKi8KK3ZvaWQKK3J0cF9zb3VyY2VfcHJvY2Vzc19yYiAoUlRQU291cmNlICogc3JjLCBndWludDY0IG50cG5zdGltZSwKKyAgICBndWludDggZnJhY3Rpb25sb3N0LCBnaW50MzIgcGFja2V0c2xvc3QsIGd1aW50MzIgZXh0aGlnaGVzdHNlcSwKKyAgICBndWludDMyIGppdHRlciwgZ3VpbnQzMiBsc3IsIGd1aW50MzIgZGxzcikKK3sKKyAgUlRQUmVjZWl2ZXJSZXBvcnQgKmN1cnI7CisgIGdpbnQgY3VycmlkeDsKKyAgZ3VpbnQzMiBudHAsIEE7CisgIGd1aW50NjQgZl9udHA7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoUlRQX0lTX1NPVVJDRSAoc3JjKSk7CisKKyAgR1NUX0RFQlVHICgiZ290IFJCIHBhY2tldDogU1NSQyAlMDh4LCBGTCAlMngsIFBMICVkLCBIUyAlIiBHX0dVSU5UMzJfRk9STUFUCisgICAgICAiLCBqaXR0ZXIgJSIgR19HVUlOVDMyX0ZPUk1BVCAiLCBMU1IgJTA0eDolMDR4LCBETFNSICUwNHg6JTA0eCIsCisgICAgICBzcmMtPnNzcmMsIGZyYWN0aW9ubG9zdCwgcGFja2V0c2xvc3QsIGV4dGhpZ2hlc3RzZXEsIGppdHRlciwgbHNyID4+IDE2LAorICAgICAgbHNyICYgMHhmZmZmLCBkbHNyID4+IDE2LCBkbHNyICYgMHhmZmZmKTsKKworICBjdXJyaWR4ID0gc3JjLT5zdGF0cy5jdXJyX3JyIF4gMTsKKyAgY3VyciA9ICZzcmMtPnN0YXRzLnJyW2N1cnJpZHhdOworCisgIC8qIHVwZGF0ZSBjdXJyZW50ICovCisgIGN1cnItPmlzX3ZhbGlkID0gVFJVRTsKKyAgY3Vyci0+ZnJhY3Rpb25sb3N0ID0gZnJhY3Rpb25sb3N0OworICBjdXJyLT5wYWNrZXRzbG9zdCA9IHBhY2tldHNsb3N0OworICBjdXJyLT5leHRoaWdoZXN0c2VxID0gZXh0aGlnaGVzdHNlcTsKKyAgY3Vyci0+aml0dGVyID0gaml0dGVyOworICBjdXJyLT5sc3IgPSBsc3I7CisgIGN1cnItPmRsc3IgPSBkbHNyOworCisgIC8qIGNvbnZlcnQgdGhlIE5UUCB0aW1lIGluIG5hbm9zZWNvbmRzIHRvIDMyLjMyIGZpeGVkIHBvaW50ICovCisgIGZfbnRwID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChudHBuc3RpbWUsICgxTEwgPDwgMzIpLCBHU1RfU0VDT05EKTsKKyAgLyogY2FsY3VsYXRlIHJvdW5kIHRyaXAsIHJvdW5kIHRoZSB0aW1lIHVwICovCisgIG50cCA9ICgoZl9udHAgKyAweGZmZmYpID4+IDE2KSAmIDB4ZmZmZmZmZmY7CisKKyAgQSA9IGRsc3IgKyBsc3I7CisgIGlmIChBID4gMCAmJiBudHAgPiBBKQorICAgIEEgPSBudHAgLSBBOworICBlbHNlCisgICAgQSA9IDA7CisgIGN1cnItPnJvdW5kX3RyaXAgPSBBOworCisgIEdTVF9ERUJVRyAoIk5UUCAlMDR4OiUwNHgsIHJvdW5kIHRyaXAgJTA0eDolMDR4IiwgbnRwID4+IDE2LCBudHAgJiAweGZmZmYsCisgICAgICBBID4+IDE2LCBBICYgMHhmZmZmKTsKKworICAvKiBtYWtlIGN1cnJlbnQgKi8KKyAgc3JjLT5zdGF0cy5jdXJyX3JyID0gY3VycmlkeDsKK30KKworLyoqCisgKiBydHBfc291cmNlX2dldF9uZXdfc3I6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKiBAbnRwbnN0aW1lOiB0aGUgY3VycmVudCB0aW1lIGluIG5hbm9zZWNvbmRzIHNpbmNlIDE5NzAKKyAqIEBydW5uaW5nX3RpbWU6IHRoZSBjdXJyZW50IHJ1bm5pbmdfdGltZSBvZiB0aGUgcGlwZWxpbmUKKyAqIEBudHB0aW1lOiB0aGUgTlRQIHRpbWUgKGluIE5UUCBUaW1lc3RhbXAgRm9ybWF0LCAzMi4zMiBmaXhlZCBwb2ludCkKKyAqIEBydHB0aW1lOiB0aGUgUlRQIHRpbWUgY29ycmVzcG9uZGluZyB0byBAbnRwdGltZSAoaW4gY2xvY2sgcmF0ZSB1bml0cykKKyAqIEBwYWNrZXRfY291bnQ6IHRoZSBwYWNrZXQgY291bnQKKyAqIEBvY3RldF9jb3VudDogdGhlIG9jdGV0IGNvdW50CisgKgorICogR2V0IG5ldyB2YWx1ZXMgdG8gcHV0IGludG8gYSBuZXcgU1IgcmVwb3J0IGZyb20gdGhpcyBzb3VyY2UuCisgKgorICogQHJ1bm5pbmdfdGltZSBhbmQgQG50cG5zdGltZSBhcmUgY2FwdHVyZWQgYXQgdGhlIHNhbWUgdGltZSBhbmQgcmVwcmVzZW50IHRoZQorICogcnVubmluZyB0aW1lIG9mIHRoZSBwaXBlbGluZSBjbG9jayBhbmQgdGhlIGFic29sdXRlIGN1cnJlbnQgc3lzdGVtIHRpbWUgaW4KKyAqIG5hbm9zZWNvbmRzIHJlc3BlY3RpdmVseS4gVG9nZXRoZXIgd2l0aCB0aGUgbGFzdCBydW5uaW5nX3RpbWUgYW5kIFJUUCB0aW1lc3RhbXAKKyAqIHdlIGhhdmUgb2JzZXJ2ZWQgaW4gdGhlIHNvdXJjZSwgd2UgY2FuIGdlbmVyYXRlIEBudHB0aW1lIGFuZCBAcnRwdGltZSBmb3IgYW4gU1IKKyAqIHBhY2tldC4gQG50cHRpbWUgaXMgYmFzaWNhbGx5IHRoZSBmaXhlZCBwb2ludCByZXByZXNlbnRhdGlvbiBvZiBAbnRwbnN0aW1lCisgKiBhbmQgQHJ0cHRpbWUgdGhlIGFzc29jaWF0ZWQgUlRQIHRpbWVzdGFtcC4KKyAqCisgKiBSZXR1cm5zOiAlVFJVRSBvbiBzdWNjZXNzLgorICovCitnYm9vbGVhbgorcnRwX3NvdXJjZV9nZXRfbmV3X3NyIChSVFBTb3VyY2UgKiBzcmMsIGd1aW50NjQgbnRwbnN0aW1lLAorICAgIEdzdENsb2NrVGltZSBydW5uaW5nX3RpbWUsIGd1aW50NjQgKiBudHB0aW1lLCBndWludDMyICogcnRwdGltZSwKKyAgICBndWludDMyICogcGFja2V0X2NvdW50LCBndWludDMyICogb2N0ZXRfY291bnQpCit7CisgIGd1aW50NjQgdF9ydHA7CisgIGd1aW50NjQgdF9jdXJyZW50X250cDsKKyAgR3N0Q2xvY2tUaW1lRGlmZiBkaWZmOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU09VUkNFIChzcmMpLCBGQUxTRSk7CisKKyAgLyogV2UgbGFzdCBzYXcgYSBidWZmZXIgd2l0aCBsYXN0X3J0cHRpbWUgYXQgbGFzdF9ydGltZS4gR2l2ZW4gYSBydW5uaW5nX3RpbWUKKyAgICogYW5kIGFuIE5UUCB0aW1lLCB3ZSBjYW4gc2NhbGUgdGhlIFJUUCB0aW1lc3RhbXBzIHNvIHRoYXQgdGhleSBtYXRjaCB0aGUKKyAgICogZ2l2ZW4gTlRQIHRpbWUuICBmb3Igc2NhbGluZywgd2UgYXNzdW1lIHRoYXQgdGhlIHNsb3BlIG9mIHRoZSBydHB0aW1lIHZzCisgICAqIHJ1bm5pbmdfdGltZSB2cyBudHB0aW1lIGN1cnZlIGlzIGNsb3NlIHRvIDEsIHdoaWNoIGlzIGNlcnRhaW5seQorICAgKiBzdWZmaWNpZW50IGZvciB0aGUgZnJlcXVlbmN5IGF0IHdoaWNoIHdlIHJlcG9ydCBTUiBhbmQgdGhlIHJhdGUgd2Ugc2VuZAorICAgKiBvdXQgUlRQIHBhY2tldHMuICovCisgIHRfcnRwID0gc3JjLT5sYXN0X3J0cHRpbWU7CisKKyAgR1NUX0RFQlVHICgibGFzdF9ydGltZSAlIiBHU1RfVElNRV9GT1JNQVQgIiwgbGFzdF9ydHB0aW1lICUiCisgICAgICBHX0dVSU5UNjRfRk9STUFULCBHU1RfVElNRV9BUkdTIChzcmMtPmxhc3RfcnRpbWUpLCB0X3J0cCk7CisKKyAgaWYgKHNyYy0+Y2xvY2tfcmF0ZSA9PSAtMSAmJiBzcmMtPnB0X3NldCkgeworICAgIEdTVF9JTkZPICgibm8gY2xvY2stcmF0ZSwgZ2V0dGluZyBmb3IgcHQgJXUgYW5kIFNTUkMgJXUiLCBzcmMtPnB0LAorICAgICAgICBzcmMtPnNzcmMpOworICAgIGdldF9jbG9ja19yYXRlIChzcmMsIHNyYy0+cHQpOworICB9CisKKyAgaWYgKHNyYy0+Y2xvY2tfcmF0ZSAhPSAtMSkgeworICAgIC8qIGdldCB0aGUgZGlmZiBiZXR3ZWVuIHRoZSBjbG9jayBydW5uaW5nX3RpbWUgYW5kIHRoZSBidWZmZXIgcnVubmluZ190aW1lLgorICAgICAqIFRoaXMgaXMgdGhlIGVsYXBzZWQgdGltZSwgYXMgbWVhc3VyZWQgYWdhaW5zdCB0aGUgcGlwZWxpbmUgY2xvY2ssIGJldHdlZW4KKyAgICAgKiB3aGVuIHRoZSBydHAgdGltZXN0YW1wIHdhcyBvYnNlcnZlZCBhbmQgdGhlIGN1cnJlbnQgcnVubmluZ190aW1lLgorICAgICAqCisgICAgICogV2UgbmVlZCB0byBhcHBseSB0aGlzIGRpZmYgdG8gdGhlIFJUUCB0aW1lc3RhbXAgdG8gZ2V0IHRoZSBSVFAgdGltZXN0YW1wCisgICAgICogZm9yIHRoZSBnaXZlbiBudHBuc3RpbWUuICovCisgICAgZGlmZiA9IEdTVF9DTE9DS19ESUZGIChzcmMtPmxhc3RfcnRpbWUsIHJ1bm5pbmdfdGltZSk7CisgICAgR1NUX0RFQlVHICgicnVubmluZ190aW1lICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBkaWZmICUiIEdTVF9TVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHJ1bm5pbmdfdGltZSksIEdTVF9TVElNRV9BUkdTIChkaWZmKSk7CisKKyAgICAvKiBub3cgdHJhbnNsYXRlIHRoZSBkaWZmIHRvIFJUUCB0aW1lLCBoYW5kbGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGNhc2VzLgorICAgICAqIElmIHRoZXJlIGlzIG5vIGRpZmYsIHdlIGFscmVhZHkgc2V0IHJ0cHRpbWUgY29ycmVjdGx5IGFib3ZlLiAqLworICAgIGlmIChkaWZmID4gMCkgeworICAgICAgdF9ydHAgKz0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoZGlmZiwgc3JjLT5jbG9ja19yYXRlLCBHU1RfU0VDT05EKTsKKyAgICB9IGVsc2UgeworICAgICAgZGlmZiA9IC1kaWZmOworICAgICAgdF9ydHAgLT0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoZGlmZiwgc3JjLT5jbG9ja19yYXRlLCBHU1RfU0VDT05EKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkcgKCJubyBjbG9jay1yYXRlLCBjYW5ub3QgaW50ZXJwb2xhdGUgcnRwIHRpbWUgZm9yIFNTUkMgJXUiLAorICAgICAgICBzcmMtPnNzcmMpOworICB9CisKKyAgLyogY29udmVydCB0aGUgTlRQIHRpbWUgaW4gbmFub3NlY29uZHMgdG8gMzIuMzIgZml4ZWQgcG9pbnQgKi8KKyAgdF9jdXJyZW50X250cCA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAobnRwbnN0aW1lLCAoMUxMIDw8IDMyKSwgR1NUX1NFQ09ORCk7CisKKyAgR1NUX0RFQlVHICgiTlRQICUwOHg6JTA4eCwgUlRQICUiIEdfR1VJTlQzMl9GT1JNQVQsCisgICAgICAoZ3VpbnQzMikgKHRfY3VycmVudF9udHAgPj4gMzIpLCAoZ3VpbnQzMikgKHRfY3VycmVudF9udHAgJiAweGZmZmZmZmZmKSwKKyAgICAgIChndWludDMyKSB0X3J0cCk7CisKKyAgaWYgKG50cHRpbWUpCisgICAgKm50cHRpbWUgPSB0X2N1cnJlbnRfbnRwOworICBpZiAocnRwdGltZSkKKyAgICAqcnRwdGltZSA9IHRfcnRwOworICBpZiAocGFja2V0X2NvdW50KQorICAgICpwYWNrZXRfY291bnQgPSBzcmMtPnN0YXRzLnBhY2tldHNfc2VudDsKKyAgaWYgKG9jdGV0X2NvdW50KQorICAgICpvY3RldF9jb3VudCA9IHNyYy0+c3RhdHMub2N0ZXRzX3NlbnQ7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogcnRwX3NvdXJjZV9nZXRfbmV3X3JiOgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICogQHRpbWU6IHRoZSBjdXJyZW50IHRpbWUgb2YgdGhlIHN5c3RlbSBjbG9jaworICogQGZyYWN0aW9ubG9zdDogZnJhY3Rpb24gbG9zdCBzaW5jZSBsYXN0IFNSL1JSCisgKiBAcGFja2V0c2xvc3Q6IHRoZSBjdW11bGF0aXZlIG51bWJlciBvZiBwYWNrZXRzIGxvc3QKKyAqIEBleHRoaWdoZXN0c2VxOiB0aGUgZXh0ZW5kZWQgbGFzdCBzZXF1ZW5jZSBudW1iZXIgcmVjZWl2ZWQKKyAqIEBqaXR0ZXI6IHRoZSBpbnRlcmFycml2YWwgaml0dGVyIChpbiBjbG9jayByYXRlIHVuaXRzKQorICogQGxzcjogdGhlIHRpbWUgb2YgdGhlIGxhc3QgU1IgcGFja2V0IG9uIHRoaXMgc291cmNlCisgKiAgIChpbiBOVFAgU2hvcnQgRm9ybWF0LCAxNi4xNiBmaXhlZCBwb2ludCkKKyAqIEBkbHNyOiB0aGUgZGVsYXkgc2luY2UgdGhlIGxhc3QgU1IgcGFja2V0CisgKiAgIChpbiBOVFAgU2hvcnQgRm9ybWF0LCAxNi4xNiBmaXhlZCBwb2ludCkKKyAqCisgKiBHZXQgbmV3IHZhbHVlcyB0byBwdXQgaW50byBhIG5ldyByZXBvcnQgYmxvY2sgZnJvbSB0aGlzIHNvdXJjZS4KKyAqCisgKiBSZXR1cm5zOiAlVFJVRSBvbiBzdWNjZXNzLgorICovCitnYm9vbGVhbgorcnRwX3NvdXJjZV9nZXRfbmV3X3JiIChSVFBTb3VyY2UgKiBzcmMsIEdzdENsb2NrVGltZSB0aW1lLAorICAgIGd1aW50OCAqIGZyYWN0aW9ubG9zdCwgZ2ludDMyICogcGFja2V0c2xvc3QsIGd1aW50MzIgKiBleHRoaWdoZXN0c2VxLAorICAgIGd1aW50MzIgKiBqaXR0ZXIsIGd1aW50MzIgKiBsc3IsIGd1aW50MzIgKiBkbHNyKQoreworICBSVFBTb3VyY2VTdGF0cyAqc3RhdHM7CisgIGd1aW50NjQgZXh0ZW5kZWRfbWF4LCBleHBlY3RlZDsKKyAgZ3VpbnQ2NCBleHBlY3RlZF9pbnRlcnZhbCwgcmVjZWl2ZWRfaW50ZXJ2YWwsIG50cHRpbWU7CisgIGdpbnQ2NCBsb3N0LCBsb3N0X2ludGVydmFsOworICBndWludDMyIGZyYWN0aW9uLCBMU1IsIERMU1I7CisgIEdzdENsb2NrVGltZSBzcl90aW1lOworCisgIHN0YXRzID0gJnNyYy0+c3RhdHM7CisKKyAgZXh0ZW5kZWRfbWF4ID0gc3RhdHMtPmN5Y2xlcyArIHN0YXRzLT5tYXhfc2VxOworICBleHBlY3RlZCA9IGV4dGVuZGVkX21heCAtIHN0YXRzLT5iYXNlX3NlcSArIDE7CisKKyAgR1NUX0RFQlVHICgiZXh0X21heCAlIiBHX0dVSU5UNjRfRk9STUFUICIsIGV4cGVjdGVkICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICIsIHJlY2VpdmVkICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgYmFzZV9zZXEgJSIgR19HVUlOVDMyX0ZPUk1BVCwKKyAgICAgIGV4dGVuZGVkX21heCwgZXhwZWN0ZWQsIHN0YXRzLT5wYWNrZXRzX3JlY2VpdmVkLCBzdGF0cy0+YmFzZV9zZXEpOworCisgIGxvc3QgPSBleHBlY3RlZCAtIHN0YXRzLT5wYWNrZXRzX3JlY2VpdmVkOworICBsb3N0ID0gQ0xBTVAgKGxvc3QsIC0weDgwMDAwMCwgMHg3ZmZmZmYpOworCisgIGV4cGVjdGVkX2ludGVydmFsID0gZXhwZWN0ZWQgLSBzdGF0cy0+cHJldl9leHBlY3RlZDsKKyAgc3RhdHMtPnByZXZfZXhwZWN0ZWQgPSBleHBlY3RlZDsKKyAgcmVjZWl2ZWRfaW50ZXJ2YWwgPSBzdGF0cy0+cGFja2V0c19yZWNlaXZlZCAtIHN0YXRzLT5wcmV2X3JlY2VpdmVkOworICBzdGF0cy0+cHJldl9yZWNlaXZlZCA9IHN0YXRzLT5wYWNrZXRzX3JlY2VpdmVkOworCisgIGxvc3RfaW50ZXJ2YWwgPSBleHBlY3RlZF9pbnRlcnZhbCAtIHJlY2VpdmVkX2ludGVydmFsOworCisgIGlmIChleHBlY3RlZF9pbnRlcnZhbCA9PSAwIHx8IGxvc3RfaW50ZXJ2YWwgPD0gMCkKKyAgICBmcmFjdGlvbiA9IDA7CisgIGVsc2UKKyAgICBmcmFjdGlvbiA9IChsb3N0X2ludGVydmFsIDw8IDgpIC8gZXhwZWN0ZWRfaW50ZXJ2YWw7CisKKyAgR1NUX0RFQlVHICgiYWRkIFJSIGZvciBTU1JDICUwOHgiLCBzcmMtPnNzcmMpOworICAvKiB3ZSBzY2FsZWQgdGhlIGppdHRlciB1cCBmb3IgYWRkaXRpb25hbCBwcmVjaXNpb24gKi8KKyAgR1NUX0RFQlVHICgiZnJhY3Rpb24gJSIgR19HVUlOVDMyX0ZPUk1BVCAiLCBsb3N0ICUiIEdfR0lOVDY0X0ZPUk1BVAorICAgICAgIiwgZXh0c2VxICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgaml0dGVyICVkIiwgZnJhY3Rpb24sIGxvc3QsCisgICAgICBleHRlbmRlZF9tYXgsIHN0YXRzLT5qaXR0ZXIgPj4gNCk7CisKKyAgaWYgKHJ0cF9zb3VyY2VfZ2V0X2xhc3Rfc3IgKHNyYywgJnNyX3RpbWUsICZudHB0aW1lLCBOVUxMLCBOVUxMLCBOVUxMKSkgeworICAgIEdzdENsb2NrVGltZSBkaWZmOworCisgICAgLyogTFNSIGlzIG1pZGRsZSAzMiBiaXRzIG9mIHRoZSBsYXN0IG50cHRpbWUgKi8KKyAgICBMU1IgPSAobnRwdGltZSA+PiAxNikgJiAweGZmZmZmZmZmOworICAgIGRpZmYgPSB0aW1lIC0gc3JfdGltZTsKKyAgICBHU1RfREVCVUcgKCJsYXN0IFNSIHRpbWUgZGlmZiAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGRpZmYpKTsKKyAgICAvKiBETFNSLCBkZWxheSBzaW5jZSBsYXN0IFNSIGlzIGV4cHJlc3NlZCBpbiAxLzY1NTM2IHNlY29uZCB1bml0cyAqLworICAgIERMU1IgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChkaWZmLCA2NTUzNiwgR1NUX1NFQ09ORCk7CisgIH0gZWxzZSB7CisgICAgLyogTm8gdmFsaWQgU1IgcmVjZWl2ZWQsIExTUi9ETFNSIGFyZSBzZXQgdG8gMCB0aGVuICovCisgICAgR1NUX0RFQlVHICgibm8gdmFsaWQgU1IgcmVjZWl2ZWQiKTsKKyAgICBMU1IgPSAwOworICAgIERMU1IgPSAwOworICB9CisgIEdTVF9ERUJVRyAoIkxTUiAlMDR4OiUwNHgsIERMU1IgJTA0eDolMDR4IiwgTFNSID4+IDE2LCBMU1IgJiAweGZmZmYsCisgICAgICBETFNSID4+IDE2LCBETFNSICYgMHhmZmZmKTsKKworICBpZiAoZnJhY3Rpb25sb3N0KQorICAgICpmcmFjdGlvbmxvc3QgPSBmcmFjdGlvbjsKKyAgaWYgKHBhY2tldHNsb3N0KQorICAgICpwYWNrZXRzbG9zdCA9IGxvc3Q7CisgIGlmIChleHRoaWdoZXN0c2VxKQorICAgICpleHRoaWdoZXN0c2VxID0gZXh0ZW5kZWRfbWF4OworICBpZiAoaml0dGVyKQorICAgICpqaXR0ZXIgPSBzdGF0cy0+aml0dGVyID4+IDQ7CisgIGlmIChsc3IpCisgICAgKmxzciA9IExTUjsKKyAgaWYgKGRsc3IpCisgICAgKmRsc3IgPSBETFNSOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIHJ0cF9zb3VyY2VfZ2V0X2xhc3Rfc3I6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKiBAdGltZTogdGltZSBvZiBwYWNrZXQgYXJyaXZhbAorICogQG50cHRpbWU6IHRoZSBOVFAgdGltZSAoaW4gTlRQIFRpbWVzdGFtcCBGb3JtYXQsIDMyLjMyIGZpeGVkIHBvaW50KQorICogQHJ0cHRpbWU6IHRoZSBSVFAgdGltZSAoaW4gY2xvY2sgcmF0ZSB1bml0cykKKyAqIEBwYWNrZXRfY291bnQ6IHRoZSBwYWNrZXQgY291bnQKKyAqIEBvY3RldF9jb3VudDogdGhlIG9jdGV0IGNvdW50CisgKgorICogR2V0IHRoZSB2YWx1ZXMgb2YgdGhlIGxhc3Qgc2VuZGVyIHJlcG9ydCBhcyBzZXQgd2l0aCBydHBfc291cmNlX3Byb2Nlc3Nfc3IoKS4KKyAqCisgKiBSZXR1cm5zOiAlVFJVRSBpZiB0aGVyZSB3YXMgYSB2YWxpZCBTUiByZXBvcnQuCisgKi8KK2dib29sZWFuCitydHBfc291cmNlX2dldF9sYXN0X3NyIChSVFBTb3VyY2UgKiBzcmMsIEdzdENsb2NrVGltZSAqIHRpbWUsIGd1aW50NjQgKiBudHB0aW1lLAorICAgIGd1aW50MzIgKiBydHB0aW1lLCBndWludDMyICogcGFja2V0X2NvdW50LCBndWludDMyICogb2N0ZXRfY291bnQpCit7CisgIFJUUFNlbmRlclJlcG9ydCAqY3VycjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoUlRQX0lTX1NPVVJDRSAoc3JjKSwgRkFMU0UpOworCisgIGN1cnIgPSAmc3JjLT5zdGF0cy5zcltzcmMtPnN0YXRzLmN1cnJfc3JdOworICBpZiAoIWN1cnItPmlzX3ZhbGlkKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAobnRwdGltZSkKKyAgICAqbnRwdGltZSA9IGN1cnItPm50cHRpbWU7CisgIGlmIChydHB0aW1lKQorICAgICpydHB0aW1lID0gY3Vyci0+cnRwdGltZTsKKyAgaWYgKHBhY2tldF9jb3VudCkKKyAgICAqcGFja2V0X2NvdW50ID0gY3Vyci0+cGFja2V0X2NvdW50OworICBpZiAob2N0ZXRfY291bnQpCisgICAgKm9jdGV0X2NvdW50ID0gY3Vyci0+b2N0ZXRfY291bnQ7CisgIGlmICh0aW1lKQorICAgICp0aW1lID0gY3Vyci0+dGltZTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBydHBfc291cmNlX2dldF9sYXN0X3JiOgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICogQGZyYWN0aW9ubG9zdDogZnJhY3Rpb24gbG9zdCBzaW5jZSBsYXN0IFNSL1JSCisgKiBAcGFja2V0c2xvc3Q6IHRoZSBjdW11bGF0aXZlIG51bWJlciBvZiBwYWNrZXRzIGxvc3QKKyAqIEBleHRoaWdoZXN0c2VxOiB0aGUgZXh0ZW5kZWQgbGFzdCBzZXF1ZW5jZSBudW1iZXIgcmVjZWl2ZWQKKyAqIEBqaXR0ZXI6IHRoZSBpbnRlcmFycml2YWwgaml0dGVyIChpbiBjbG9jayByYXRlIHVuaXRzKQorICogQGxzcjogdGhlIHRpbWUgb2YgdGhlIGxhc3QgU1IgcGFja2V0IG9uIHRoaXMgc291cmNlCisgKiAgIChpbiBOVFAgU2hvcnQgRm9ybWF0LCAxNi4xNiBmaXhlZCBwb2ludCkKKyAqIEBkbHNyOiB0aGUgZGVsYXkgc2luY2UgdGhlIGxhc3QgU1IgcGFja2V0CisgKiAgIChpbiBOVFAgU2hvcnQgRm9ybWF0LCAxNi4xNiBmaXhlZCBwb2ludCkKKyAqIEByb3VuZF90cmlwOiB0aGUgcm91bmQtdHJpcCB0aW1lCisgKiAgIChpbiBOVFAgU2hvcnQgRm9ybWF0LCAxNi4xNiBmaXhlZCBwb2ludCkKKyAqCisgKiBHZXQgdGhlIHZhbHVlcyBvZiB0aGUgbGFzdCBSQiByZXBvcnQgc2V0IHdpdGggcnRwX3NvdXJjZV9wcm9jZXNzX3JiKCkuCisgKgorICogUmV0dXJuczogJVRSVUUgaWYgdGhlcmUgd2FzIGEgdmFsaWQgU0IgcmVwb3J0LgorICovCitnYm9vbGVhbgorcnRwX3NvdXJjZV9nZXRfbGFzdF9yYiAoUlRQU291cmNlICogc3JjLCBndWludDggKiBmcmFjdGlvbmxvc3QsCisgICAgZ2ludDMyICogcGFja2V0c2xvc3QsIGd1aW50MzIgKiBleHRoaWdoZXN0c2VxLCBndWludDMyICogaml0dGVyLAorICAgIGd1aW50MzIgKiBsc3IsIGd1aW50MzIgKiBkbHNyLCBndWludDMyICogcm91bmRfdHJpcCkKK3sKKyAgUlRQUmVjZWl2ZXJSZXBvcnQgKmN1cnI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFJUUF9JU19TT1VSQ0UgKHNyYyksIEZBTFNFKTsKKworICBjdXJyID0gJnNyYy0+c3RhdHMucnJbc3JjLT5zdGF0cy5jdXJyX3JyXTsKKyAgaWYgKCFjdXJyLT5pc192YWxpZCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGZyYWN0aW9ubG9zdCkKKyAgICAqZnJhY3Rpb25sb3N0ID0gY3Vyci0+ZnJhY3Rpb25sb3N0OworICBpZiAocGFja2V0c2xvc3QpCisgICAgKnBhY2tldHNsb3N0ID0gY3Vyci0+cGFja2V0c2xvc3Q7CisgIGlmIChleHRoaWdoZXN0c2VxKQorICAgICpleHRoaWdoZXN0c2VxID0gY3Vyci0+ZXh0aGlnaGVzdHNlcTsKKyAgaWYgKGppdHRlcikKKyAgICAqaml0dGVyID0gY3Vyci0+aml0dGVyOworICBpZiAobHNyKQorICAgICpsc3IgPSBjdXJyLT5sc3I7CisgIGlmIChkbHNyKQorICAgICpkbHNyID0gY3Vyci0+ZGxzcjsKKyAgaWYgKHJvdW5kX3RyaXApCisgICAgKnJvdW5kX3RyaXAgPSBjdXJyLT5yb3VuZF90cmlwOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgorZmluZF9jb25mbGljdGluZ19hZGRyZXNzIChHTGlzdCAqIGNvbmZsaWN0aW5nX2FkZHJlc3NlcywKKyAgICBHU29ja2V0QWRkcmVzcyAqIGFkZHJlc3MsIEdzdENsb2NrVGltZSB0aW1lKQoreworICBHTGlzdCAqaXRlbTsKKworICBmb3IgKGl0ZW0gPSBjb25mbGljdGluZ19hZGRyZXNzZXM7IGl0ZW07IGl0ZW0gPSBnX2xpc3RfbmV4dCAoaXRlbSkpIHsKKyAgICBSVFBDb25mbGljdGluZ0FkZHJlc3MgKmtub3duX2NvbmZsaWN0ID0gaXRlbS0+ZGF0YTsKKworICAgIGlmIChfX2dfc29ja2V0X2FkZHJlc3NfZXF1YWwgKGFkZHJlc3MsIGtub3duX2NvbmZsaWN0LT5hZGRyZXNzKSkgeworICAgICAga25vd25fY29uZmxpY3QtPnRpbWUgPSB0aW1lOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitHTGlzdCAqCithZGRfY29uZmxpY3RpbmdfYWRkcmVzcyAoR0xpc3QgKiBjb25mbGljdGluZ19hZGRyZXNzZXMsCisgICAgR1NvY2tldEFkZHJlc3MgKiBhZGRyZXNzLCBHc3RDbG9ja1RpbWUgdGltZSkKK3sKKyAgUlRQQ29uZmxpY3RpbmdBZGRyZXNzICpuZXdfY29uZmxpY3Q7CisKKyAgbmV3X2NvbmZsaWN0ID0gZ19zbGljZV9uZXcgKFJUUENvbmZsaWN0aW5nQWRkcmVzcyk7CisKKyAgbmV3X2NvbmZsaWN0LT5hZGRyZXNzID0gR19TT0NLRVRfQUREUkVTUyAoZ19vYmplY3RfcmVmIChhZGRyZXNzKSk7CisgIG5ld19jb25mbGljdC0+dGltZSA9IHRpbWU7CisKKyAgcmV0dXJuIGdfbGlzdF9wcmVwZW5kIChjb25mbGljdGluZ19hZGRyZXNzZXMsIG5ld19jb25mbGljdCk7Cit9CisKK0dMaXN0ICoKK3RpbWVvdXRfY29uZmxpY3RpbmdfYWRkcmVzc2VzIChHTGlzdCAqIGNvbmZsaWN0aW5nX2FkZHJlc3NlcywKKyAgICBHc3RDbG9ja1RpbWUgY3VycmVudF90aW1lKQoreworICBHTGlzdCAqaXRlbTsKKyAgLyogImEgcmVsYXRpdmVseSBsb25nIHRpbWUiIC0tIFJGQyAzNTUwIHNlY3Rpb24gOC4yICovCisgIGNvbnN0IEdzdENsb2NrVGltZSBjb2xsaXNpb25fdGltZW91dCA9CisgICAgICBSVFBfU1RBVFNfTUlOX0lOVEVSVkFMICogR1NUX1NFQ09ORCAqIDEwOworCisgIGl0ZW0gPSBnX2xpc3RfZmlyc3QgKGNvbmZsaWN0aW5nX2FkZHJlc3Nlcyk7CisgIHdoaWxlIChpdGVtKSB7CisgICAgUlRQQ29uZmxpY3RpbmdBZGRyZXNzICprbm93bl9jb25mbGljdCA9IGl0ZW0tPmRhdGE7CisgICAgR0xpc3QgKm5leHRfaXRlbSA9IGdfbGlzdF9uZXh0IChpdGVtKTsKKworICAgIGlmIChrbm93bl9jb25mbGljdC0+dGltZSA8IGN1cnJlbnRfdGltZSAtIGNvbGxpc2lvbl90aW1lb3V0KSB7CisgICAgICBnY2hhciAqYnVmOworCisgICAgICBjb25mbGljdGluZ19hZGRyZXNzZXMgPSBnX2xpc3RfZGVsZXRlX2xpbmsgKGNvbmZsaWN0aW5nX2FkZHJlc3NlcywgaXRlbSk7CisgICAgICBidWYgPSBfX2dfc29ja2V0X2FkZHJlc3NfdG9fc3RyaW5nIChrbm93bl9jb25mbGljdC0+YWRkcmVzcyk7CisgICAgICBHU1RfREVCVUcgKCJjb2xsaXNpb24gJXAgdGltZWQgb3V0OiAlcyIsIGtub3duX2NvbmZsaWN0LCBidWYpOworICAgICAgZ19mcmVlIChidWYpOworICAgICAgcnRwX2NvbmZsaWN0aW5nX2FkZHJlc3NfZnJlZSAoa25vd25fY29uZmxpY3QpOworICAgIH0KKyAgICBpdGVtID0gbmV4dF9pdGVtOworICB9CisKKyAgcmV0dXJuIGNvbmZsaWN0aW5nX2FkZHJlc3NlczsKK30KKworLyoqCisgKiBydHBfc291cmNlX2ZpbmRfY29uZmxpY3RpbmdfYWRkcmVzczoKKyAqIEBzcmM6IFRoZSBzb3VyY2UgdGhlIHBhY2tldCBjYW1lIGluCisgKiBAYWRkcmVzczogYWRkcmVzcyB0byBjaGVjayBmb3IKKyAqIEB0aW1lOiBUaGUgdGltZSB3aGVuIHRoZSBwYWNrZXQgdGhhdCBpcyBwb3NzaWJseSBpbiBjb25mbGljdCBhcnJpdmVkCisgKgorICogQ2hlY2tzIGlmIGFuIGFkZHJlc3Mgd2hpY2ggaGFzIGEgY29uZmxpY3QgaXMgYWxyZWFkeSBrbm93bi4gSWYgaXQgaXMKKyAqIGEga25vd24gY29uZmxpY3QsIHJlbWVtYmVyIHRoZSB0aW1lCisgKgorICogUmV0dXJuczogVFJVRSBpZiBpdCB3YXMgYSBrbm93biBjb25mbGljdCwgRkFMU0Ugb3RoZXJ3aXNlCisgKi8KK2dib29sZWFuCitydHBfc291cmNlX2ZpbmRfY29uZmxpY3RpbmdfYWRkcmVzcyAoUlRQU291cmNlICogc3JjLCBHU29ja2V0QWRkcmVzcyAqIGFkZHJlc3MsCisgICAgR3N0Q2xvY2tUaW1lIHRpbWUpCit7CisgIHJldHVybiBmaW5kX2NvbmZsaWN0aW5nX2FkZHJlc3MgKHNyYy0+Y29uZmxpY3RpbmdfYWRkcmVzc2VzLCBhZGRyZXNzLCB0aW1lKTsKK30KKworLyoqCisgKiBydHBfc291cmNlX2FkZF9jb25mbGljdGluZ19hZGRyZXNzOgorICogQHNyYzogVGhlIHNvdXJjZSB0aGUgcGFja2V0IGNhbWUgaW4KKyAqIEBhZGRyZXNzOiBhZGRyZXNzIHRvIHJlbWVtYmVyCisgKiBAdGltZTogVGhlIHRpbWUgd2hlbiB0aGUgcGFja2V0IHRoYXQgaXMgaW4gY29uZmxpY3QgYXJyaXZlZAorICoKKyAqIEFkZHMgYSBuZXcgY29uZmxpY3QgYWRkcmVzcworICovCit2b2lkCitydHBfc291cmNlX2FkZF9jb25mbGljdGluZ19hZGRyZXNzIChSVFBTb3VyY2UgKiBzcmMsCisgICAgR1NvY2tldEFkZHJlc3MgKiBhZGRyZXNzLCBHc3RDbG9ja1RpbWUgdGltZSkKK3sKKyAgc3JjLT5jb25mbGljdGluZ19hZGRyZXNzZXMgPQorICAgICAgYWRkX2NvbmZsaWN0aW5nX2FkZHJlc3MgKHNyYy0+Y29uZmxpY3RpbmdfYWRkcmVzc2VzLCBhZGRyZXNzLCB0aW1lKTsKK30KKworLyoqCisgKiBydHBfc291cmNlX3RpbWVvdXQ6CisgKiBAc3JjOiBUaGUgI1JUUFNvdXJjZQorICogQGN1cnJlbnRfdGltZTogVGhlIGN1cnJlbnQgdGltZQorICogQGZlZWRiYWNrX3JldGVudGlvbl93aW5kb3c6IFRoZSBydW5uaW5nIHRpbWUgYmVmb3JlIHdoaWNoIHJldGFpbmVkIGZlZWRiYWNrCisgKiBwYWNrZXRzIGhhdmUgdG8gYmUgZGlzY2FyZGVkCisgKgorICogVGhpcyBpcyBwcm9jZXNzZWQgb24gZWFjaCBSVENQIGludGVydmFsLiBJdCB0aW1lcyBvdXQgb2xkIGNvbGxpc2lvbnMuCisgKiBJdCBhbHNvIHRpbWVzIG91dCBvbGQgcmV0YWluZWQgZmVlZGJhY2sgcGFja2V0cworICovCit2b2lkCitydHBfc291cmNlX3RpbWVvdXQgKFJUUFNvdXJjZSAqIHNyYywgR3N0Q2xvY2tUaW1lIGN1cnJlbnRfdGltZSwKKyAgICBHc3RDbG9ja1RpbWUgZmVlZGJhY2tfcmV0ZW50aW9uX3dpbmRvdykKK3sKKyAgR3N0UlRDUFBhY2tldCAqcGt0OworCisgIHNyYy0+Y29uZmxpY3RpbmdfYWRkcmVzc2VzID0KKyAgICAgIHRpbWVvdXRfY29uZmxpY3RpbmdfYWRkcmVzc2VzIChzcmMtPmNvbmZsaWN0aW5nX2FkZHJlc3NlcywgY3VycmVudF90aW1lKTsKKworICAvKiBUaW1lIG91dCBBVlBGIHBhY2tldHMgdGhhdCBhcmUgb2xkZXIgdGhhbiB0aGUgZGVzaXJlZCBsZW5ndGggKi8KKyAgd2hpbGUgKChwa3QgPSBnX3F1ZXVlX3BlZWtfdGFpbCAoc3JjLT5yZXRhaW5lZF9mZWVkYmFjaykpICYmCisgICAgICBHU1RfQlVGRkVSX1BUUyAocGt0KSA8IGZlZWRiYWNrX3JldGVudGlvbl93aW5kb3cpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoZ19xdWV1ZV9wb3BfdGFpbCAoc3JjLT5yZXRhaW5lZF9mZWVkYmFjaykpOworfQorCitzdGF0aWMgZ2ludAorY29tcGFyZV9idWZmZXJzIChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBjb25zdCBHc3RCdWZmZXIgKmJ1ZmEgPSBhOworICBjb25zdCBHc3RCdWZmZXIgKmJ1ZmIgPSBiOworCisgIHJldHVybiBHU1RfQlVGRkVSX1BUUyAoYnVmYSkgLSBHU1RfQlVGRkVSX1BUUyAoYnVmYik7Cit9CisKK3ZvaWQKK3J0cF9zb3VyY2VfcmV0YWluX3J0Y3BfcGFja2V0IChSVFBTb3VyY2UgKiBzcmMsIEdzdFJUQ1BQYWNrZXQgKiBwYWNrZXQsCisgICAgR3N0Q2xvY2tUaW1lIHJ1bm5pbmdfdGltZSkKK3sKKyAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAocGFja2V0LT5ydGNwLT5idWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9NRU1PUlksCisgICAgICBwYWNrZXQtPm9mZnNldCwgKGdzdF9ydGNwX3BhY2tldF9nZXRfbGVuZ3RoIChwYWNrZXQpICsgMSkgKiA0KTsKKworICBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKSA9IHJ1bm5pbmdfdGltZTsKKworICBnX3F1ZXVlX2luc2VydF9zb3J0ZWQgKHNyYy0+cmV0YWluZWRfZmVlZGJhY2ssIGJ1ZmZlciwgY29tcGFyZV9idWZmZXJzLCBOVUxMKTsKK30KKworZ2Jvb2xlYW4KK3J0cF9zb3VyY2VfaGFzX3JldGFpbmVkIChSVFBTb3VyY2UgKiBzcmMsIEdDb21wYXJlRnVuYyBmdW5jLCBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisgIGlmIChnX3F1ZXVlX2ZpbmRfY3VzdG9tIChzcmMtPnJldGFpbmVkX2ZlZWRiYWNrLCBkYXRhLCBmdW5jKSkKKyAgICByZXR1cm4gVFJVRTsKKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBydHBfc291cmNlX3JlZ2lzdGVyX25hY2s6CisgKiBAc3JjOiBUaGUgI1JUUFNvdXJjZQorICogQHNlcW51bTogYSBzZXFudW0KKyAqCisgKiBSZWdpc3RlciB0aGF0IEBzZXFudW0gaGFzIG5vdCBiZWVuIHJlY2VpdmVkIGZyb20gQHNyYy4KKyAqLwordm9pZAorcnRwX3NvdXJjZV9yZWdpc3Rlcl9uYWNrIChSVFBTb3VyY2UgKiBzcmMsIGd1aW50MTYgc2VxbnVtKQoreworICBndWludCBpLCBsZW47CisgIGd1aW50MzIgZHdvcmQgPSBzZXFudW0gPDwgMTY7CisgIGdpbnQgZGlmZiA9IDE2OworCisgIGxlbiA9IHNyYy0+bmFja3MtPmxlbjsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgZ3VpbnQzMiB0ZHdvcmQ7CisgICAgZ3VpbnQxNiB0c2VxOworCisgICAgdGR3b3JkID0gZ19hcnJheV9pbmRleCAoc3JjLT5uYWNrcywgZ3VpbnQzMiwgaSk7CisgICAgdHNlcSA9IHRkd29yZCA+PiAxNjsKKworICAgIGRpZmYgPSBnc3RfcnRwX2J1ZmZlcl9jb21wYXJlX3NlcW51bSAodHNlcSwgc2VxbnVtKTsKKyAgICBpZiAoZGlmZiA8IDE2KQorICAgICAgYnJlYWs7CisgIH0KKyAgLyogd2UgYWxyZWFkeSBoYXZlIHRoaXMgc2VxbnVtICovCisgIGlmIChkaWZmID09IDApCisgICAgcmV0dXJuOworICAvKiBpdCBjb21lcyBiZWZvcmUgdGhlIHJlY29yZGVkIHNlcW51bSwgRklYTUUsIHdlIGNvdWxkIG1lcmdlIGl0CisgICAqIGlmIG5vdCB0byBmYXIgYXdheSAqLworICBpZiAoZGlmZiA8IDApIHsKKyAgICBHU1RfREVCVUcgKCJpbnNlcnQgTkFDSyAjJXUgYXQgJXUiLCBzZXFudW0sIGkpOworICAgIGdfYXJyYXlfaW5zZXJ0X3ZhbCAoc3JjLT5uYWNrcywgaSwgZHdvcmQpOworICB9IGVsc2UgaWYgKGRpZmYgPCAxNikgeworICAgIC8qIHdlIGNhbiBtZXJnZSBpdCAqLworICAgIGR3b3JkID0gZ19hcnJheV9pbmRleCAoc3JjLT5uYWNrcywgZ3VpbnQzMiwgaSk7CisgICAgZHdvcmQgfD0gMSA8PCAoZGlmZiAtIDEpOworICAgIEdTVF9ERUJVRyAoIm1lcmdlIE5BQ0sgIyV1IGF0ICV1IHdpdGggTkFDSyAjJXUgLT4gMHglMDh4Iiwgc2VxbnVtLCBpLAorICAgICAgICBkd29yZCA+PiAxNiwgZHdvcmQpOworICAgIGdfYXJyYXlfaW5kZXggKHNyYy0+bmFja3MsIGd1aW50MzIsIGkpID0gZHdvcmQ7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHICgiYXBwZW5kIE5BQ0sgIyV1Iiwgc2VxbnVtKTsKKyAgICBnX2FycmF5X2FwcGVuZF92YWwgKHNyYy0+bmFja3MsIGR3b3JkKTsKKyAgfQorICBzcmMtPnNlbmRfbmFjayA9IFRSVUU7Cit9CisKKy8qKgorICogcnRwX3NvdXJjZV9nZXRfbmFja3M6CisgKiBAc3JjOiBUaGUgI1JUUFNvdXJjZQorICogQG5fbmFja3M6IHJlc3VsdCBudW1iZXIgb2YgbmFja3MKKyAqCisgKiBHZXQgdGhlIHJlZ2lzdGVyZWQgTkFDS1Mgc2luY2UgdGhlIGxhc3QgcnRwX3NvdXJjZV9jbGVhcl9uYWNrcygpLgorICoKKyAqIFJldHVybnM6IGFuIGFycmF5IG9mIEBuX25hY2tzIHNlcW51bSB2YWx1ZXMuCisgKi8KK2d1aW50MzIgKgorcnRwX3NvdXJjZV9nZXRfbmFja3MgKFJUUFNvdXJjZSAqIHNyYywgZ3VpbnQgKiBuX25hY2tzKQoreworICBpZiAobl9uYWNrcykKKyAgICAqbl9uYWNrcyA9IHNyYy0+bmFja3MtPmxlbjsKKworICByZXR1cm4gKGd1aW50MzIgKikgc3JjLT5uYWNrcy0+ZGF0YTsKK30KKwordm9pZAorcnRwX3NvdXJjZV9jbGVhcl9uYWNrcyAoUlRQU291cmNlICogc3JjKQoreworICBnX2FycmF5X3NldF9zaXplIChzcmMtPm5hY2tzLCAwKTsKKyAgc3JjLT5zZW5kX25hY2sgPSBGQUxTRTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oIGIvZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgyMjY3ZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oCkBAIC0wLDAgKzEsMzA1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpICAyMDE1IEt1cmVudG8gKGh0dHA6Ly9rdXJlbnRvLm9yZy8pCisgKiAgIEBhdXRob3I6IE1pZ3VlbCBQYXLDrXMgPG1wYXJpc2RpYXpAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19SVFBfU09VUkNFX0hfXworI2RlZmluZSBfX1JUUF9TT1VSQ0VfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9ydHAuaD4KKyNpbmNsdWRlIDxnc3QvbmV0L2dzdG5ldGFkZHJlc3NtZXRhLmg+CisjaW5jbHVkZSA8Z2lvL2dpby5oPgorCisjaW5jbHVkZSAicnRwc3RhdHMuaCIKKworLyogdGhlIGRlZmF1bHQgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIFJUUCBwYWNrZXRzIHdlIG5lZWQgdG8gcmVjZWl2ZSBiZWZvcmUgdGhlCisgKiBzb3VyY2UgaXMgY29uc2lkZXJlZCB2YWxpZCAqLworI2RlZmluZSBSVFBfTk9fUFJPQkFUSU9OICAgICAgICAwCisjZGVmaW5lIFJUUF9ERUZBVUxUX1BST0JBVElPTiAgIDIKKworI2RlZmluZSBSVFBfU0VRX01PRCAgICAgICAgICAoMSA8PCAxNikKKwordHlwZWRlZiBzdHJ1Y3QgX1JUUFNvdXJjZSBSVFBTb3VyY2U7Cit0eXBlZGVmIHN0cnVjdCBfUlRQU291cmNlQ2xhc3MgUlRQU291cmNlQ2xhc3M7CisKKyNkZWZpbmUgUlRQX1RZUEVfU09VUkNFICAgICAgICAgICAgIChydHBfc291cmNlX2dldF90eXBlKCkpCisjZGVmaW5lIFJUUF9TT1VSQ0Uoc3JjKSAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKHNyYyksUlRQX1RZUEVfU09VUkNFLFJUUFNvdXJjZSkpCisjZGVmaW5lIFJUUF9TT1VSQ0VfQ0xBU1Moa2xhc3MpICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxSVFBfVFlQRV9TT1VSQ0UsUlRQU291cmNlQ2xhc3MpKQorI2RlZmluZSBSVFBfSVNfU09VUkNFKHNyYykgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChzcmMpLFJUUF9UWVBFX1NPVVJDRSkpCisjZGVmaW5lIFJUUF9JU19TT1VSQ0VfQ0xBU1Moa2xhc3MpICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxSVFBfVFlQRV9TT1VSQ0UpKQorI2RlZmluZSBSVFBfU09VUkNFX0NBU1Qoc3JjKSAgICAgICAgKChSVFBTb3VyY2UgKikoc3JjKSkKKworLyoqCisgKiBSVFBfU09VUkNFX0lTX0FDVElWRToKKyAqIEBzcmM6IGFuICNSVFBTb3VyY2UKKyAqCisgKiBDaGVjayBpZiBAc3JjIGlzIGFjdGl2ZS4gQSBzb3VyY2UgaXMgYWN0aXZlIHdoZW4gaXQgaGFzIGJlZW4gdmFsaWRhdGVkCisgKiBhbmQgaGFzIG5vdCB5ZXQgcmVjZWl2ZWQgYSBCWUUgcGFja2V0LgorICovCisjZGVmaW5lIFJUUF9TT1VSQ0VfSVNfQUNUSVZFKHNyYykgIChzcmMtPnZhbGlkYXRlZCAmJiAhc3JjLT5tYXJrZWRfYnllKQorCisvKioKKyAqIFJUUF9TT1VSQ0VfSVNfU0VOREVSOgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICoKKyAqIENoZWNrIGlmIEBzcmMgaXMgYSBzZW5kZXIuCisgKi8KKyNkZWZpbmUgUlRQX1NPVVJDRV9JU19TRU5ERVIoc3JjKSAgKHNyYy0+aXNfc2VuZGVyKQorLyoqCisgKiBSVFBfU09VUkNFX0lTX01BUktFRF9CWUU6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKgorICogQ2hlY2sgaWYgQHNyYyBpcyBhIG1hcmtlZCBhcyBCWUUuCisgKi8KKyNkZWZpbmUgUlRQX1NPVVJDRV9JU19NQVJLRURfQllFKHNyYykgIChzcmMtPm1hcmtlZF9ieWUpCisKKworLyoqCisgKiBSVFBTb3VyY2VQdXNoUlRQOgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICogQGRhdGE6IHRoZSBSVFAgYnVmZmVyIG9yIGJ1ZmZlciBsaXN0IHJlYWR5IGZvciBwcm9jZXNzaW5nCisgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgc3BlY2lmaWVkIHdoZW4gcmVnaXN0ZXJpbmcKKyAqCisgKiBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdoZW4gQHNyYyBoYXMgQGJ1ZmZlciByZWFkeSBmb3IgZnVydGhlcgorICogcHJvY2Vzc2luZy4KKyAqCisgKiBSZXR1cm5zOiBhICNHc3RGbG93UmV0dXJuLgorICovCit0eXBlZGVmIEdzdEZsb3dSZXR1cm4gKCpSVFBTb3VyY2VQdXNoUlRQKSAoUlRQU291cmNlICpzcmMsIGdwb2ludGVyIGRhdGEsCisJZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKworLyoqCisgKiBSVFBTb3VyY2VDbG9ja1JhdGU6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKiBAcGF5bG9hZDogYSBwYXlsb2FkIHR5cGUKKyAqIEB1c2VyX2RhdGE6IHVzZXIgZGF0YSBzcGVjaWZpZWQgd2hlbiByZWdpc3RlcmluZworICoKKyAqIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbiBAc3JjIG5lZWRzIHRoZSBjbG9jay1yYXRlIG9mIHRoZQorICogQHBheWxvYWQuCisgKgorICogUmV0dXJuczogYSBjbG9jay1yYXRlIGZvciBAcGF5bG9hZC4KKyAqLwordHlwZWRlZiBnaW50ICgqUlRQU291cmNlQ2xvY2tSYXRlKSAoUlRQU291cmNlICpzcmMsIGd1aW50OCBwYXlsb2FkLCBncG9pbnRlciB1c2VyX2RhdGEpOworCisvKioKKyAqIFJUUFNvdXJjZUNhbGxiYWNrczoKKyAqIEBwdXNoX3J0cDogYSBwYWNrZXQgYmVjb21lcyBhdmFpbGFibGUgZm9yIGhhbmRsaW5nCisgKiBAY2xvY2tfcmF0ZTogYSBjbG9jay1yYXRlIGlzIHJlcXVlc3RlZAorICogQGdldF90aW1lOiB0aGUgY3VycmVudCBjbG9jayB0aW1lIGlzIHJlcXVlc3RlZAorICoKKyAqIENhbGxiYWNrcyBwZXJmb3JtZWQgYnkgI1JUUFNvdXJjZSB3aGVuIGFjdGlvbnMgbmVlZCB0byBiZSBwZXJmb3JtZWQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgUlRQU291cmNlUHVzaFJUUCAgICAgcHVzaF9ydHA7CisgIFJUUFNvdXJjZUNsb2NrUmF0ZSAgIGNsb2NrX3JhdGU7Cit9IFJUUFNvdXJjZUNhbGxiYWNrczsKKworLyoqCisgKiBSVFBDb25mbGljdGluZ0FkZHJlc3M6CisgKiBAYWRkcmVzczogI0dTb2NrZXRBZGRyZXNzIHdoaWNoIGNvbmZsaWN0ZWQKKyAqIEBsYXN0X2NvbmZsaWN0X3RpbWU6IHRpbWUgd2hlbiB0aGUgbGFzdCBjb25mbGljdCB3YXMgc2VlbgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gYWNjb3VudCBmb3IgYWRkcmVzc2VzIHRoYXQgaGF2ZSBjb25mbGljdGVkIHRvIGZpbmQKKyAqIGxvb3BzLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIEdTb2NrZXRBZGRyZXNzICphZGRyZXNzOworICBHc3RDbG9ja1RpbWUgdGltZTsKK30gUlRQQ29uZmxpY3RpbmdBZGRyZXNzOworCisvKioKKyAqIFJUUFNvdXJjZToKKyAqCisgKiBBIHNvdXJjZSBpbiB0aGUgI1JUUFNlc3Npb24KKyAqCisgKiBAY29uZmxpY3RpbmdfYWRkcmVzc2VzOiBHTGlzdCBvZiBjb25mbGljdGluZyBhZGRyZXNzZXMKKyAqLworc3RydWN0IF9SVFBTb3VyY2UgeworICBHT2JqZWN0ICAgICAgIG9iamVjdDsKKworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgZ3VpbnQzMiAgICAgICBzc3JjOworCisgIGd1aW50MTYgICAgICAgZ2VuZXJhdGlvbjsKKyAgR0hhc2hUYWJsZSAgICAqcmVwb3J0ZWRfaW5fc3Jfb2Y7ICAgICAvKiBzZXQgb2YgU1NSQ3MgKi8KKworICBndWludCAgICAgICAgIHByb2JhdGlvbjsKKyAgZ3VpbnQgICAgICAgICBjdXJyX3Byb2JhdGlvbjsKKyAgZ2Jvb2xlYW4gICAgICB2YWxpZGF0ZWQ7CisgIGdib29sZWFuICAgICAgaW50ZXJuYWw7CisgIGdib29sZWFuICAgICAgaXNfY3NyYzsKKyAgZ2Jvb2xlYW4gICAgICBpc19zZW5kZXI7CisgIGdib29sZWFuICAgICAgY2xvc2luZzsKKworICBHc3RTdHJ1Y3R1cmUgICpzZGVzOworCisgIGdib29sZWFuICAgICAgbWFya2VkX2J5ZTsKKyAgZ2NoYXIgICAgICAgICpieWVfcmVhc29uOworICBnYm9vbGVhbiAgICAgIHNlbnRfYnllOworCisgIEdTb2NrZXRBZGRyZXNzICpydHBfZnJvbTsKKyAgR1NvY2tldEFkZHJlc3MgKnJ0Y3BfZnJvbTsKKworICBnaW50ICAgICAgICAgIHBheWxvYWQ7CisgIEdzdENhcHMgICAgICAqY2FwczsKKyAgZ2ludCAgICAgICAgICBjbG9ja19yYXRlOworICBnaW50MzIgICAgICAgIHNlcW51bV9vZmZzZXQ7CisKKyAgR3N0Q2xvY2tUaW1lICBieWVfdGltZTsKKyAgR3N0Q2xvY2tUaW1lICBsYXN0X2FjdGl2aXR5OworICBHc3RDbG9ja1RpbWUgIGxhc3RfcnRwX2FjdGl2aXR5OworCisgIEdzdENsb2NrVGltZSAgbGFzdF9ydGltZTsKKyAgR3N0Q2xvY2tUaW1lICBsYXN0X3J0cHRpbWU7CisKKyAgLyogZm9yIGJpdHJhdGUgZXN0aW1hdGlvbiAqLworICBndWludDY0ICAgICAgIGJpdHJhdGU7CisgIEdzdENsb2NrVGltZSAgcHJldl9ydGltZTsKKyAgZ3VpbnQ2NCAgICAgICBieXRlc19zZW50OworICBndWludDY0ICAgICAgIGJ5dGVzX3JlY2VpdmVkOworCisgIEdRdWV1ZSAgICAgICAqcGFja2V0czsKKyAgUlRQUGFja2V0UmF0ZUN0eCBwYWNrZXRfcmF0ZV9jdHg7CisgIGd1aW50MzIgICAgICAgbWF4X2Ryb3BvdXRfdGltZTsKKyAgZ3VpbnQzMiAgICAgICBtYXhfbWlzb3JkZXJfdGltZTsKKworICBSVFBTb3VyY2VDYWxsYmFja3MgY2FsbGJhY2tzOworICBncG9pbnRlciAgICAgICAgICAgdXNlcl9kYXRhOworCisgIFJUUFNvdXJjZVN0YXRzIHN0YXRzOworICBSVFBSZWNlaXZlclJlcG9ydCBsYXN0X3JyOworCisgIEdMaXN0ICAgICAgICAgKmNvbmZsaWN0aW5nX2FkZHJlc3NlczsKKworICBHUXVldWUgICAgICAgICpyZXRhaW5lZF9mZWVkYmFjazsKKworICBnYm9vbGVhbiAgICAgc2VuZF9wbGk7CisgIGdib29sZWFuICAgICBzZW5kX2ZpcjsKKyAgZ3VpbnQ4ICAgICAgIGN1cnJlbnRfc2VuZF9maXJfc2VxbnVtOworICBnaW50ICAgICAgICAgbGFzdF9maXJfY291bnQ7CisgIEdzdENsb2NrVGltZSBsYXN0X2tleWZyYW1lX3JlcXVlc3Q7CisKKyAgZ2Jvb2xlYW4gICAgIHNlbmRfbmFjazsKKyAgR0FycmF5ICAgICAgKm5hY2tzOworCisgIGdib29sZWFuICAgICAgcHRfc2V0OworICBndWludDggICAgICAgIHB0OworfTsKKworc3RydWN0IF9SVFBTb3VyY2VDbGFzcyB7CisgIEdPYmplY3RDbGFzcyAgIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIHJ0cF9zb3VyY2VfZ2V0X3R5cGUgKHZvaWQpOworCisvKiBtYW5hZ2luZyBsaWZldGltZSBvZiBzb3VyY2VzICovCitSVFBTb3VyY2UqICAgICAgcnRwX3NvdXJjZV9uZXcgICAgICAgICAgICAgICAgIChndWludDMyIHNzcmMpOwordm9pZCAgICAgICAgICAgIHJ0cF9zb3VyY2Vfc2V0X2NhbGxiYWNrcyAgICAgICAoUlRQU291cmNlICpzcmMsIFJUUFNvdXJjZUNhbGxiYWNrcyAqY2IsIGdwb2ludGVyIGRhdGEpOworCisvKiBwcm9wZXJ0aWVzICovCitndWludDMyICAgICAgICAgcnRwX3NvdXJjZV9nZXRfc3NyYyAgICAgICAgICAgIChSVFBTb3VyY2UgKnNyYyk7CisKK3ZvaWQgICAgICAgICAgICBydHBfc291cmNlX3NldF9hc19jc3JjICAgICAgICAgKFJUUFNvdXJjZSAqc3JjKTsKK2dib29sZWFuICAgICAgICBydHBfc291cmNlX2lzX2FzX2NzcmMgICAgICAgICAgKFJUUFNvdXJjZSAqc3JjKTsKKworZ2Jvb2xlYW4gICAgICAgIHJ0cF9zb3VyY2VfaXNfYWN0aXZlICAgICAgICAgICAoUlRQU291cmNlICpzcmMpOworZ2Jvb2xlYW4gICAgICAgIHJ0cF9zb3VyY2VfaXNfdmFsaWRhdGVkICAgICAgICAoUlRQU291cmNlICpzcmMpOworZ2Jvb2xlYW4gICAgICAgIHJ0cF9zb3VyY2VfaXNfc2VuZGVyICAgICAgICAgICAoUlRQU291cmNlICpzcmMpOworCit2b2lkICAgICAgICAgICAgcnRwX3NvdXJjZV9tYXJrX2J5ZSAgICAgICAgICAgIChSVFBTb3VyY2UgKnNyYywgY29uc3QgZ2NoYXIgKnJlYXNvbik7CitnYm9vbGVhbiAgICAgICAgcnRwX3NvdXJjZV9pc19tYXJrZWRfYnllICAgICAgIChSVFBTb3VyY2UgKnNyYyk7CitnY2hhciAqICAgICAgICAgcnRwX3NvdXJjZV9nZXRfYnllX3JlYXNvbiAgICAgIChSVFBTb3VyY2UgKnNyYyk7CisKK3ZvaWQgICAgICAgICAgICBydHBfc291cmNlX3VwZGF0ZV9jYXBzICAgICAgICAgKFJUUFNvdXJjZSAqc3JjLCBHc3RDYXBzICpjYXBzKTsKKworLyogU0RFUyBpbmZvICovCitjb25zdCBHc3RTdHJ1Y3R1cmUgKgorICAgICAgICAgICAgICAgIHJ0cF9zb3VyY2VfZ2V0X3NkZXNfc3RydWN0ICAgICAoUlRQU291cmNlICogc3JjKTsKK2dib29sZWFuICAgICAgICBydHBfc291cmNlX3NldF9zZGVzX3N0cnVjdCAgICAgKFJUUFNvdXJjZSAqIHNyYywgR3N0U3RydWN0dXJlICpzZGVzKTsKKworLyogaGFuZGxpbmcgbmV0d29yayBhZGRyZXNzICovCit2b2lkICAgICAgICAgICAgcnRwX3NvdXJjZV9zZXRfcnRwX2Zyb20gICAgICAgIChSVFBTb3VyY2UgKnNyYywgR1NvY2tldEFkZHJlc3MgKmFkZHJlc3MpOwordm9pZCAgICAgICAgICAgIHJ0cF9zb3VyY2Vfc2V0X3J0Y3BfZnJvbSAgICAgICAoUlRQU291cmNlICpzcmMsIEdTb2NrZXRBZGRyZXNzICphZGRyZXNzKTsKKworLyogaGFuZGxpbmcgUlRQICovCitHc3RGbG93UmV0dXJuICAgcnRwX3NvdXJjZV9wcm9jZXNzX3J0cCAgICAgICAgIChSVFBTb3VyY2UgKnNyYywgUlRQUGFja2V0SW5mbyAqcGluZm8pOworCitHc3RGbG93UmV0dXJuICAgcnRwX3NvdXJjZV9zZW5kX3J0cCAgICAgICAgICAgIChSVFBTb3VyY2UgKnNyYywgUlRQUGFja2V0SW5mbyAqcGluZm8pOworCisvKiBSVENQIG1lc3NhZ2VzICovCit2b2lkICAgICAgICAgICAgcnRwX3NvdXJjZV9wcm9jZXNzX3NyICAgICAgICAgIChSVFBTb3VyY2UgKnNyYywgR3N0Q2xvY2tUaW1lIHRpbWUsIGd1aW50NjQgbnRwdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgcnRwdGltZSwgZ3VpbnQzMiBwYWNrZXRfY291bnQsIGd1aW50MzIgb2N0ZXRfY291bnQpOwordm9pZCAgICAgICAgICAgIHJ0cF9zb3VyY2VfcHJvY2Vzc19yYiAgICAgICAgICAoUlRQU291cmNlICpzcmMsIGd1aW50NjQgbnRwbnN0aW1lLCBndWludDggZnJhY3Rpb25sb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyIHBhY2tldHNsb3N0LCBndWludDMyIGV4dGhpZ2hlc3RzZXEsIGd1aW50MzIgaml0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsc3IsIGd1aW50MzIgZGxzcik7CisKK2dib29sZWFuICAgICAgICBydHBfc291cmNlX2dldF9uZXdfc3IgICAgICAgICAgKFJUUFNvdXJjZSAqc3JjLCBndWludDY0IG50cG5zdGltZSwgR3N0Q2xvY2tUaW1lIHJ1bm5pbmdfdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50NjQgKm50cHRpbWUsIGd1aW50MzIgKnJ0cHRpbWUsIGd1aW50MzIgKnBhY2tldF9jb3VudCwKKwkJCQkJCWd1aW50MzIgKm9jdGV0X2NvdW50KTsKK2dib29sZWFuICAgICAgICBydHBfc291cmNlX2dldF9uZXdfcmIgICAgICAgICAgKFJUUFNvdXJjZSAqc3JjLCBHc3RDbG9ja1RpbWUgdGltZSwgZ3VpbnQ4ICpmcmFjdGlvbmxvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKnBhY2tldHNsb3N0LCBndWludDMyICpleHRoaWdoZXN0c2VxLCBndWludDMyICpqaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpsc3IsIGd1aW50MzIgKmRsc3IpOworCitnYm9vbGVhbiAgICAgICAgcnRwX3NvdXJjZV9nZXRfbGFzdF9zciAgICAgICAgIChSVFBTb3VyY2UgKnNyYywgR3N0Q2xvY2tUaW1lICp0aW1lLCBndWludDY0ICpudHB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqcnRwdGltZSwgZ3VpbnQzMiAqcGFja2V0X2NvdW50LAorCQkJCQkJZ3VpbnQzMiAqb2N0ZXRfY291bnQpOworZ2Jvb2xlYW4gICAgICAgIHJ0cF9zb3VyY2VfZ2V0X2xhc3RfcmIgICAgICAgICAoUlRQU291cmNlICpzcmMsIGd1aW50OCAqZnJhY3Rpb25sb3N0LCBnaW50MzIgKnBhY2tldHNsb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqZXh0aGlnaGVzdHNlcSwgZ3VpbnQzMiAqaml0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqbHNyLCBndWludDMyICpkbHNyLCBndWludDMyICpyb3VuZF90cmlwKTsKKwordm9pZCAgICAgICAgICAgIHJ0cF9zb3VyY2VfcmVzZXQgICAgICAgICAgICAgICAoUlRQU291cmNlICogc3JjKTsKKworZ2Jvb2xlYW4gICAgICAgIHJ0cF9zb3VyY2VfZmluZF9jb25mbGljdGluZ19hZGRyZXNzIChSVFBTb3VyY2UgKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU29ja2V0QWRkcmVzcyAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdENsb2NrVGltZSB0aW1lKTsKKwordm9pZCAgICAgICAgICAgIHJ0cF9zb3VyY2VfYWRkX2NvbmZsaWN0aW5nX2FkZHJlc3MgKFJUUFNvdXJjZSAqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdTb2NrZXRBZGRyZXNzICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0Q2xvY2tUaW1lIHRpbWUpOworCitnYm9vbGVhbiAgICAgICAgZmluZF9jb25mbGljdGluZ19hZGRyZXNzICAgICAgIChHTGlzdCAqIGNvbmZsaWN0aW5nX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU29ja2V0QWRkcmVzcyAqIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RDbG9ja1RpbWUgdGltZSk7CisKK0dMaXN0ICogICAgICAgICBhZGRfY29uZmxpY3RpbmdfYWRkcmVzcyAgICAgICAgKEdMaXN0ICogY29uZmxpY3RpbmdfYWRkcmVzc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1NvY2tldEFkZHJlc3MgKiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0Q2xvY2tUaW1lIHRpbWUpOworR0xpc3QgKiAgICAgICAgIHRpbWVvdXRfY29uZmxpY3RpbmdfYWRkcmVzc2VzICAoR0xpc3QgKiBjb25mbGljdGluZ19hZGRyZXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RDbG9ja1RpbWUgY3VycmVudF90aW1lKTsKKwordm9pZCAgICAgICAgICAgIHJ0cF9jb25mbGljdGluZ19hZGRyZXNzX2ZyZWUgICAoUlRQQ29uZmxpY3RpbmdBZGRyZXNzICogYWRkcik7CisKK3ZvaWQgICAgICAgICAgICBydHBfc291cmNlX3RpbWVvdXQgICAgICAgICAgICAgKFJUUFNvdXJjZSAqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RDbG9ja1RpbWUgZmVlZGJhY2tfcmV0ZW50aW9uX3dpbmRvdyk7CisKK3ZvaWQgICAgICAgICAgICBydHBfc291cmNlX3JldGFpbl9ydGNwX3BhY2tldCAgKFJUUFNvdXJjZSAqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFJUQ1BQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdENsb2NrVGltZSBydW5uaW5nX3RpbWUpOworZ2Jvb2xlYW4gICAgICAgIHJ0cF9zb3VyY2VfaGFzX3JldGFpbmVkICAgICAgICAoUlRQU291cmNlICogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NvbXBhcmVGdW5jIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY29uc3Rwb2ludGVyIGRhdGEpOworCit2b2lkICAgICAgICAgICAgcnRwX3NvdXJjZV9yZWdpc3Rlcl9uYWNrICAgICAgIChSVFBTb3VyY2UgKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDE2IHNlcW51bSk7CitndWludDMyICogICAgICAgcnRwX3NvdXJjZV9nZXRfbmFja3MgICAgICAgICAgIChSVFBTb3VyY2UgKiBzcmMsIGd1aW50ICpuX25hY2tzKTsKK3ZvaWQgICAgICAgICAgICBydHBfc291cmNlX2NsZWFyX25hY2tzICAgICAgICAgKFJUUFNvdXJjZSAqIHNyYyk7CisKKyNlbmRpZiAvKiBfX1JUUF9TT1VSQ0VfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jIGIvZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2JkMTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuYwpAQCAtMCwwICsxLDQzMCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAgMjAxNSBLdXJlbnRvIChodHRwOi8va3VyZW50by5vcmcvKQorICogICBAYXV0aG9yOiBNaWd1ZWwgUGFyw61zIDxtcGFyaXNkaWF6QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAicnRwc3RhdHMuaCIKKwordm9pZAorZ3N0X3J0cF9wYWNrZXRfcmF0ZV9jdHhfcmVzZXQgKFJUUFBhY2tldFJhdGVDdHggKiBjdHgsIGdpbnQzMiBjbG9ja19yYXRlKQoreworICBjdHgtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworICBjdHgtPnByb2JlZCA9IEZBTFNFOworICBjdHgtPmF2Z19wYWNrZXRfcmF0ZSA9IC0xOworICBjdHgtPmxhc3RfdHMgPSAtMTsKK30KKworZ3VpbnQzMgorZ3N0X3J0cF9wYWNrZXRfcmF0ZV9jdHhfdXBkYXRlIChSVFBQYWNrZXRSYXRlQ3R4ICogY3R4LCBndWludDE2IHNlcW51bSwKKyAgICBndWludDMyIHRzKQoreworICBndWludDY0IG5ld190cywgZGlmZl90czsKKyAgZ2ludCBkaWZmX3NlcW51bTsKKyAgZ2ludDMyIG5ld19wYWNrZXRfcmF0ZTsKKworICBpZiAoY3R4LT5jbG9ja19yYXRlIDw9IDApIHsKKyAgICByZXR1cm4gY3R4LT5hdmdfcGFja2V0X3JhdGU7CisgIH0KKworICBuZXdfdHMgPSBjdHgtPmxhc3RfdHM7CisgIGdzdF9ydHBfYnVmZmVyX2V4dF90aW1lc3RhbXAgKCZuZXdfdHMsIHRzKTsKKworICBpZiAoIWN0eC0+cHJvYmVkKSB7CisgICAgY3R4LT5sYXN0X3NlcW51bSA9IHNlcW51bTsKKyAgICBjdHgtPmxhc3RfdHMgPSBuZXdfdHM7CisgICAgY3R4LT5wcm9iZWQgPSBUUlVFOworICAgIHJldHVybiBjdHgtPmF2Z19wYWNrZXRfcmF0ZTsKKyAgfQorCisgIGRpZmZfc2VxbnVtID0gZ3N0X3J0cF9idWZmZXJfY29tcGFyZV9zZXFudW0gKGN0eC0+bGFzdF9zZXFudW0sIHNlcW51bSk7CisgIGlmIChkaWZmX3NlcW51bSA8PSAwIHx8IG5ld190cyA8PSBjdHgtPmxhc3RfdHMpIHsKKyAgICByZXR1cm4gY3R4LT5hdmdfcGFja2V0X3JhdGU7CisgIH0KKworICBkaWZmX3RzID0gbmV3X3RzIC0gY3R4LT5sYXN0X3RzOworICBkaWZmX3RzID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoZGlmZl90cywgR1NUX1NFQ09ORCwgY3R4LT5jbG9ja19yYXRlKTsKKyAgbmV3X3BhY2tldF9yYXRlID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChkaWZmX3NlcW51bSwgR1NUX1NFQ09ORCwgZGlmZl90cyk7CisKKyAgLyogVGhlIGdvYWwgaXMgdGhhdCBoaWdoZXIgcGFja2V0IHJhdGVzICJ3aW4iLgorICAgKiBJZiB0aGVyZSdzIGEgc3VkZGVuIGJ1cnN0LCB0aGUgYXZlcmFnZSB3aWxsIGdvIHVwIGZhc3QsCisgICAqIGJ1dCBpdCB3aWxsIGdvIGRvd24gYWdhaW4gc2xvd2x5LgorICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgYnVyc3R5IGNhc2VzLCB3aGVyZSBhIGxvdCBvZiBwYWNrZXRzIGFyZSBjbG9zZQorICAgKiB0byBlYWNoIG90aGVyIGFuZCBzaG91bGQgYWxsb3cgYSBoaWdoZXIgcmVvcmRlci9kcm9wb3V0IHRoZXJlLgorICAgKiBSb3VuZCB1cCB0aGUgbmV3IGF2ZXJhZ2UuCisgICAqLworICBpZiAoY3R4LT5hdmdfcGFja2V0X3JhdGUgPiBuZXdfcGFja2V0X3JhdGUpIHsKKyAgICBjdHgtPmF2Z19wYWNrZXRfcmF0ZSA9ICg3ICogY3R4LT5hdmdfcGFja2V0X3JhdGUgKyBuZXdfcGFja2V0X3JhdGUgKyA3KSAvIDg7CisgIH0gZWxzZSB7CisgICAgY3R4LT5hdmdfcGFja2V0X3JhdGUgPSAoY3R4LT5hdmdfcGFja2V0X3JhdGUgKyBuZXdfcGFja2V0X3JhdGUgKyAxKSAvIDI7CisgIH0KKworICBjdHgtPmxhc3Rfc2VxbnVtID0gc2VxbnVtOworICBjdHgtPmxhc3RfdHMgPSBuZXdfdHM7CisKKyAgcmV0dXJuIGN0eC0+YXZnX3BhY2tldF9yYXRlOworfQorCitndWludDMyCitnc3RfcnRwX3BhY2tldF9yYXRlX2N0eF9nZXQgKFJUUFBhY2tldFJhdGVDdHggKiBjdHgpCit7CisgIHJldHVybiBjdHgtPmF2Z19wYWNrZXRfcmF0ZTsKK30KKworZ3VpbnQzMgorZ3N0X3J0cF9wYWNrZXRfcmF0ZV9jdHhfZ2V0X21heF9kcm9wb3V0IChSVFBQYWNrZXRSYXRlQ3R4ICogY3R4LCBnaW50MzIgdGltZV9tcykKK3sKKyAgaWYgKHRpbWVfbXMgPD0gMCB8fCAhY3R4LT5wcm9iZWQpIHsKKyAgICByZXR1cm4gUlRQX0RFRl9EUk9QT1VUOworICB9CisKKyAgcmV0dXJuIE1BWCAoUlRQX01JTl9EUk9QT1VULCBjdHgtPmF2Z19wYWNrZXRfcmF0ZSAqIHRpbWVfbXMgLyAxMDAwKTsKK30KKworZ3VpbnQzMgorZ3N0X3J0cF9wYWNrZXRfcmF0ZV9jdHhfZ2V0X21heF9taXNvcmRlciAoUlRQUGFja2V0UmF0ZUN0eCAqIGN0eCwKKyAgICBnaW50MzIgdGltZV9tcykKK3sKKyAgaWYgKHRpbWVfbXMgPD0gMCB8fCAhY3R4LT5wcm9iZWQpIHsKKyAgICByZXR1cm4gUlRQX0RFRl9NSVNPUkRFUjsKKyAgfQorCisgIHJldHVybiBNQVggKFJUUF9NSU5fTUlTT1JERVIsIGN0eC0+YXZnX3BhY2tldF9yYXRlICogdGltZV9tcyAvIDEwMDApOworfQorCisvKioKKyAqIHJ0cF9zdGF0c19pbml0X2RlZmF1bHRzOgorICogQHN0YXRzOiBhbiAjUlRQU2Vzc2lvblN0YXRzIHN0cnVjdAorICoKKyAqIEluaXRpYWxpemUgQHN0YXRzIHdpdGggaXRzIGRlZmF1bHQgdmFsdWVzLgorICovCit2b2lkCitydHBfc3RhdHNfaW5pdF9kZWZhdWx0cyAoUlRQU2Vzc2lvblN0YXRzICogc3RhdHMpCit7CisgIHJ0cF9zdGF0c19zZXRfYmFuZHdpZHRocyAoc3RhdHMsIC0xLCAtMSwgLTEsIC0xKTsKKyAgc3RhdHMtPm1pbl9pbnRlcnZhbCA9IFJUUF9TVEFUU19NSU5fSU5URVJWQUw7CisgIHN0YXRzLT5ieWVfdGltZW91dCA9IFJUUF9TVEFUU19CWUVfVElNRU9VVDsKKyAgc3RhdHMtPm5hY2tzX2Ryb3BwZWQgPSAwOworICBzdGF0cy0+bmFja3Nfc2VudCA9IDA7CisgIHN0YXRzLT5uYWNrc19yZWNlaXZlZCA9IDA7Cit9CisKKy8qKgorICogcnRwX3N0YXRzX3NldF9iYW5kd2lkdGhzOgorICogQHN0YXRzOiBhbiAjUlRQU2Vzc2lvblN0YXRzIHN0cnVjdAorICogQHJ0cF9idzogUlRQIGJhbmR3aWR0aAorICogQHJ0Y3BfYnc6IFJUQ1AgYmFuZHdpZHRoCisgKiBAcnM6IHNlbmRlciBSVENQIGJhbmR3aWR0aAorICogQHJyOiByZWNlaXZlciBSVENQIGJhbmR3aWR0aAorICoKKyAqIENvbmZpZ3VyZSB0aGUgYmFuZHdpZHRoIHBhcmFtZXRlcnMgaW4gdGhlIHN0YXRzLiBXaGVuIGFuIGlucHV0IHZhcmlhYmxlIGlzCisgKiBzZXQgdG8gLTEsIGl0IHdpbGwgYmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBvdGhlciBpbnB1dCB2YXJpYWJsZXMgYW5kIGZyb20gdGhlCisgKiBkZWZhdWx0cy4KKyAqLwordm9pZAorcnRwX3N0YXRzX3NldF9iYW5kd2lkdGhzIChSVFBTZXNzaW9uU3RhdHMgKiBzdGF0cywgZ3VpbnQgcnRwX2J3LAorICAgIGdkb3VibGUgcnRjcF9idywgZ3VpbnQgcnMsIGd1aW50IHJyKQoreworICBHU1RfREVCVUcgKCJyZWNhbGMgYmFuZHdpZHRoczogUlRQICV1LCBSVENQICVmLCBSUyAldSwgUlIgJXUiLCBydHBfYncsCisgICAgICBydGNwX2J3LCBycywgcnIpOworCisgIC8qIHdoZW4gZ2l2ZW4sIHNlbmRlciBhbmQgcmVjZWl2ZSBiYW5kd2lkdGggYWRkIHVwIHRvIHRoZSB0b3RhbAorICAgKiBydGNwIGJhbmR3aWR0aCAqLworICBpZiAocnMgIT0gLTEgJiYgcnIgIT0gLTEpCisgICAgcnRjcF9idyA9IHJzICsgcnI7CisKKyAgLyogSWYgcnRjcF9idyBpcyBiZXR3ZWVuIDAgYW5kIDEsIGl0IGlzIGEgZnJhY3Rpb24gb2YgcnRwX2J3ICovCisgIGlmIChydGNwX2J3ID4gMC4wICYmIHJ0Y3BfYncgPCAxLjApIHsKKyAgICBpZiAocnRwX2J3ID4gMC4wKQorICAgICAgcnRjcF9idyA9IHJ0cF9idyAqIHJ0Y3BfYnc7CisgICAgZWxzZQorICAgICAgcnRjcF9idyA9IC0xLjA7CisgIH0KKworICAvKiBSVENQIGlzIDUlIG9mIHRoZSBSVFAgYmFuZHdpZHRoICovCisgIGlmIChydHBfYncgPT0gLTEgJiYgcnRjcF9idyA+IDEuMCkKKyAgICBydHBfYncgPSBydGNwX2J3ICogMjA7CisgIGVsc2UgaWYgKHJ0cF9idyAhPSAtMSAmJiBydGNwX2J3IDwgMC4wKQorICAgIHJ0Y3BfYncgPSBydHBfYncgLyAyMDsKKyAgZWxzZSBpZiAocnRwX2J3ID09IC0xICYmIHJ0Y3BfYncgPCAwLjApIHsKKyAgICAvKiBub3RoaW5nIGdpdmVuLCB0YWtlIGRlZmF1bHRzICovCisgICAgcnRwX2J3ID0gUlRQX1NUQVRTX0JBTkRXSURUSDsKKyAgICBydGNwX2J3ID0gcnRwX2J3ICogUlRQX1NUQVRTX1JUQ1BfRlJBQ1RJT047CisgIH0KKworICBzdGF0cy0+YmFuZHdpZHRoID0gcnRwX2J3OworICBzdGF0cy0+cnRjcF9iYW5kd2lkdGggPSBydGNwX2J3OworCisgIC8qIG5vdyBmaWd1cmUgb3V0IHRoZSBmcmFjdGlvbnMgKi8KKyAgaWYgKHJzID09IC0xKSB7CisgICAgLyogcnMgdW5rbm93biAqLworICAgIGlmIChyciA9PSAtMSkgeworICAgICAgLyogYm90aCBub3QgZ2l2ZW4sIHVzZSBkZWZhdWx0cyAqLworICAgICAgcnMgPSBzdGF0cy0+cnRjcF9iYW5kd2lkdGggKiBSVFBfU1RBVFNfU0VOREVSX0ZSQUNUSU9OOworICAgICAgcnIgPSBzdGF0cy0+cnRjcF9iYW5kd2lkdGggKiBSVFBfU1RBVFNfUkVDRUlWRVJfRlJBQ1RJT047CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHJyIGtub3duLCBjYWxjdWxhdGUgcnMgKi8KKyAgICAgIGlmIChzdGF0cy0+cnRjcF9iYW5kd2lkdGggPiBycikKKyAgICAgICAgcnMgPSBzdGF0cy0+cnRjcF9iYW5kd2lkdGggLSBycjsKKyAgICAgIGVsc2UKKyAgICAgICAgcnMgPSAwOworICAgIH0KKyAgfSBlbHNlIGlmIChyciA9PSAtMSkgeworICAgIC8qIHJzIGtub3duLCBjYWxjdWxhdGUgcnIgKi8KKyAgICBpZiAoc3RhdHMtPnJ0Y3BfYmFuZHdpZHRoID4gcnMpCisgICAgICByciA9IHN0YXRzLT5ydGNwX2JhbmR3aWR0aCAtIHJzOworICAgIGVsc2UKKyAgICAgIHJyID0gMDsKKyAgfQorCisgIGlmIChzdGF0cy0+cnRjcF9iYW5kd2lkdGggPiAwKSB7CisgICAgc3RhdHMtPnNlbmRlcl9mcmFjdGlvbiA9ICgoZ2RvdWJsZSkgcnMpIC8gKChnZG91YmxlKSBzdGF0cy0+cnRjcF9iYW5kd2lkdGgpOworICAgIHN0YXRzLT5yZWNlaXZlcl9mcmFjdGlvbiA9IDEuMCAtIHN0YXRzLT5zZW5kZXJfZnJhY3Rpb247CisgIH0gZWxzZSB7CisgICAgLyogbm8gUlRDUCBiYW5kd2lkdGgsIHNldCBkdW1teSB2YWx1ZXMgKi8KKyAgICBzdGF0cy0+c2VuZGVyX2ZyYWN0aW9uID0gMC4wOworICAgIHN0YXRzLT5yZWNlaXZlcl9mcmFjdGlvbiA9IDAuMDsKKyAgfQorICBHU1RfREVCVUcgKCJiYW5kd2lkdGhzOiBSVFAgJXUsIFJUQ1AgJXUsIFJTICVmLCBSUiAlZiIsIHN0YXRzLT5iYW5kd2lkdGgsCisgICAgICBzdGF0cy0+cnRjcF9iYW5kd2lkdGgsIHN0YXRzLT5zZW5kZXJfZnJhY3Rpb24sIHN0YXRzLT5yZWNlaXZlcl9mcmFjdGlvbik7Cit9CisKKy8qKgorICogcnRwX3N0YXRzX2NhbGN1bGF0ZV9ydGNwX2ludGVydmFsOgorICogQHN0YXRzOiBhbiAjUlRQU2Vzc2lvblN0YXRzIHN0cnVjdAorICogQHNlbmRlcjogaWYgd2UgYXJlIGEgc2VuZGVyCisgKiBAcHJvZmlsZTogUlRQIHByb2ZpbGUgb2YgdGhpcyBzZXNzaW9uCisgKiBAcHRwOiBpZiB0aGlzIHNlc3Npb24gaXMgYSBwb2ludC10by1wb2ludCBzZXNzaW9uCisgKiBAZmlyc3Q6IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUKKyAqCisgKiBDYWxjdWxhdGUgdGhlIFJUQ1AgaW50ZXJ2YWwuIFRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbiBpcyB0aGUgYW1vdW50IG9mCisgKiB0aW1lIHRvIHdhaXQgKGluIG5hbm9zZWNvbmRzKSBiZWZvcmUgc2VuZGluZyBhIG5ldyBSVENQIG1lc3NhZ2UuCisgKgorICogUmV0dXJuczogdGhlIFJUQ1AgaW50ZXJ2YWwuCisgKi8KK0dzdENsb2NrVGltZQorcnRwX3N0YXRzX2NhbGN1bGF0ZV9ydGNwX2ludGVydmFsIChSVFBTZXNzaW9uU3RhdHMgKiBzdGF0cywgZ2Jvb2xlYW4gd2Vfc2VuZCwKKyAgICBHc3RSVFBQcm9maWxlIHByb2ZpbGUsIGdib29sZWFuIHB0cCwgZ2Jvb2xlYW4gZmlyc3QpCit7CisgIGdkb3VibGUgbWVtYmVycywgc2VuZGVycywgbjsKKyAgZ2RvdWJsZSBhdmdfcnRjcF9zaXplLCBydGNwX2J3OworICBnZG91YmxlIGludGVydmFsOworICBnZG91YmxlIHJ0Y3BfbWluX3RpbWU7CisKKyAgaWYgKHByb2ZpbGUgPT0gR1NUX1JUUF9QUk9GSUxFX0FWUEYgfHwgcHJvZmlsZSA9PSBHU1RfUlRQX1BST0ZJTEVfU0FWUEYpIHsKKyAgICAvKiBSRkMgNDU4NSAzLjRkKSwgMy41LjEgKi8KKworICAgIGlmIChmaXJzdCAmJiAhcHRwKQorICAgICAgcnRjcF9taW5fdGltZSA9IDEuMDsKKyAgICBlbHNlCisgICAgICBydGNwX21pbl90aW1lID0gMC4wOworICB9IGVsc2UgeworICAgIC8qIFZlcnkgZmlyc3QgY2FsbCBhdCBhcHBsaWNhdGlvbiBzdGFydC11cCB1c2VzIGhhbGYgdGhlIG1pbgorICAgICAqIGRlbGF5IGZvciBxdWlja2VyIG5vdGlmaWNhdGlvbiB3aGlsZSBzdGlsbCBhbGxvd2luZyBzb21lIHRpbWUKKyAgICAgKiBiZWZvcmUgcmVwb3J0aW5nIGZvciByYW5kb21pemF0aW9uIGFuZCB0byBsZWFybiBhYm91dCBvdGhlcgorICAgICAqIHNvdXJjZXMgc28gdGhlIHJlcG9ydCBpbnRlcnZhbCB3aWxsIGNvbnZlcmdlIHRvIHRoZSBjb3JyZWN0CisgICAgICogaW50ZXJ2YWwgbW9yZSBxdWlja2x5LgorICAgICAqLworICAgIHJ0Y3BfbWluX3RpbWUgPSBzdGF0cy0+bWluX2ludGVydmFsOworICAgIGlmIChmaXJzdCkKKyAgICAgIHJ0Y3BfbWluX3RpbWUgLz0gMi4wOworICB9CisKKyAgLyogRGVkaWNhdGUgYSBmcmFjdGlvbiBvZiB0aGUgUlRDUCBiYW5kd2lkdGggdG8gc2VuZGVycyB1bmxlc3MKKyAgICogdGhlIG51bWJlciBvZiBzZW5kZXJzIGlzIGxhcmdlIGVub3VnaCB0aGF0IHRoZWlyIHNoYXJlIGlzCisgICAqIG1vcmUgdGhhbiB0aGF0IGZyYWN0aW9uLgorICAgKi8KKyAgbiA9IG1lbWJlcnMgPSBzdGF0cy0+YWN0aXZlX3NvdXJjZXM7CisgIHNlbmRlcnMgPSAoZ2RvdWJsZSkgc3RhdHMtPnNlbmRlcl9zb3VyY2VzOworICBydGNwX2J3ID0gc3RhdHMtPnJ0Y3BfYmFuZHdpZHRoOworCisgIGlmIChzZW5kZXJzIDw9IG1lbWJlcnMgKiBzdGF0cy0+c2VuZGVyX2ZyYWN0aW9uKSB7CisgICAgaWYgKHdlX3NlbmQpIHsKKyAgICAgIHJ0Y3BfYncgKj0gc3RhdHMtPnNlbmRlcl9mcmFjdGlvbjsKKyAgICAgIG4gPSBzZW5kZXJzOworICAgIH0gZWxzZSB7CisgICAgICBydGNwX2J3ICo9IHN0YXRzLT5yZWNlaXZlcl9mcmFjdGlvbjsKKyAgICAgIG4gLT0gc2VuZGVyczsKKyAgICB9CisgIH0KKworICAvKiBubyBiYW5kd2lkdGggZm9yIFJUQ1AsIHJldHVybiBOT05FIHRvIHNpZ25hbCB0aGF0IHdlIGRvbid0IHdhbnQgdG8gc2VuZAorICAgKiBSVENQIHBhY2tldHMgKi8KKyAgaWYgKHJ0Y3BfYncgPD0gMC4wMDAxKQorICAgIHJldHVybiBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIGF2Z19ydGNwX3NpemUgPSA4LjAgKiBzdGF0cy0+YXZnX3J0Y3BfcGFja2V0X3NpemU7CisgIC8qCisgICAqIFRoZSBlZmZlY3RpdmUgbnVtYmVyIG9mIHNpdGVzIHRpbWVzIHRoZSBhdmVyYWdlIHBhY2tldCBzaXplIGlzCisgICAqIHRoZSB0b3RhbCBudW1iZXIgb2Ygb2N0ZXRzIHNlbnQgd2hlbiBlYWNoIHNpdGUgc2VuZHMgYSByZXBvcnQuCisgICAqIERpdmlkaW5nIHRoaXMgYnkgdGhlIGVmZmVjdGl2ZSBiYW5kd2lkdGggZ2l2ZXMgdGhlIHRpbWUKKyAgICogaW50ZXJ2YWwgb3ZlciB3aGljaCB0aG9zZSBwYWNrZXRzIG11c3QgYmUgc2VudCBpbiBvcmRlciB0bworICAgKiBtZWV0IHRoZSBiYW5kd2lkdGggdGFyZ2V0LCB3aXRoIGEgbWluaW11bSBlbmZvcmNlZC4gIEluIHRoYXQKKyAgICogdGltZSBpbnRlcnZhbCB3ZSBzZW5kIG9uZSByZXBvcnQgc28gdGhpcyB0aW1lIGlzIGFsc28gb3VyCisgICAqIGF2ZXJhZ2UgdGltZSBiZXR3ZWVuIHJlcG9ydHMuCisgICAqLworICBHU1RfREVCVUcgKCJhdmcgc2l6ZSAlZiwgbiAlZiwgcnRjcF9idyAlZiIsIGF2Z19ydGNwX3NpemUsIG4sIHJ0Y3BfYncpOworICBpbnRlcnZhbCA9IGF2Z19ydGNwX3NpemUgKiBuIC8gcnRjcF9idzsKKyAgaWYgKGludGVydmFsIDwgcnRjcF9taW5fdGltZSkKKyAgICBpbnRlcnZhbCA9IHJ0Y3BfbWluX3RpbWU7CisKKyAgcmV0dXJuIGludGVydmFsICogR1NUX1NFQ09ORDsKK30KKworLyoqCisgKiBydHBfc3RhdHNfYWRkX3J0Y3Bfaml0dGVyOgorICogQHN0YXRzOiBhbiAjUlRQU2Vzc2lvblN0YXRzIHN0cnVjdAorICogQGludGVydmFsOiBhbiBSVENQIGludGVydmFsCisgKgorICogQXBwbHkgYSByYW5kb20gaml0dGVyIHRvIHRoZSBAaW50ZXJ2YWwuIEBpbnRlcnZhbCBpcyB0eXBpY2FsbHkgb2J0YWluZWQgd2l0aAorICogcnRwX3N0YXRzX2NhbGN1bGF0ZV9ydGNwX2ludGVydmFsKCkuCisgKgorICogUmV0dXJuczogdGhlIG5ldyBSVENQIGludGVydmFsLgorICovCitHc3RDbG9ja1RpbWUKK3J0cF9zdGF0c19hZGRfcnRjcF9qaXR0ZXIgKFJUUFNlc3Npb25TdGF0cyAqIHN0YXRzLCBHc3RDbG9ja1RpbWUgaW50ZXJ2YWwpCit7CisgIGdkb3VibGUgdGVtcDsKKworICAvKiBzZWUgUkZDIDM1NTAgcCAzMAorICAgKiBUbyBjb21wZW5zYXRlIGZvciAidW5jb25kaXRpb25hbCByZWNvbnNpZGVyYXRpb24iIGNvbnZlcmdpbmcgdG8gYQorICAgKiB2YWx1ZSBiZWxvdyB0aGUgaW50ZW5kZWQgYXZlcmFnZS4KKyAgICovCisjZGVmaW5lIENPTVBFTlNBVElPTiAgKDIuNzE4MjggLSAxLjUpOworCisgIHRlbXAgPSAoaW50ZXJ2YWwgKiBnX3JhbmRvbV9kb3VibGVfcmFuZ2UgKDAuNSwgMS41KSkgLyBDT01QRU5TQVRJT047CisKKyAgcmV0dXJuIChHc3RDbG9ja1RpbWUpIHRlbXA7Cit9CisKKworLyoqCisgKiBydHBfc3RhdHNfY2FsY3VsYXRlX2J5ZV9pbnRlcnZhbDoKKyAqIEBzdGF0czogYW4gI1JUUFNlc3Npb25TdGF0cyBzdHJ1Y3QKKyAqCisgKiBDYWxjdWxhdGUgdGhlIEJZRSBpbnRlcnZhbC4gVGhlIHJlc3VsdCBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRoZSBhbW91bnQgb2YKKyAqIHRpbWUgdG8gd2FpdCAoaW4gbmFub3NlY29uZHMpIGJlZm9yZSBzZW5kaW5nIGEgQllFIG1lc3NhZ2UuCisgKgorICogUmV0dXJuczogdGhlIEJZRSBpbnRlcnZhbC4KKyAqLworR3N0Q2xvY2tUaW1lCitydHBfc3RhdHNfY2FsY3VsYXRlX2J5ZV9pbnRlcnZhbCAoUlRQU2Vzc2lvblN0YXRzICogc3RhdHMpCit7CisgIGdkb3VibGUgbWVtYmVyczsKKyAgZ2RvdWJsZSBhdmdfcnRjcF9zaXplLCBydGNwX2J3OworICBnZG91YmxlIGludGVydmFsOworICBnZG91YmxlIHJ0Y3BfbWluX3RpbWU7CisKKyAgLyogbm8gaW50ZXJ2YWwgd2hlbiB3ZSBoYXZlIGxlc3MgdGhhbiA1MCBtZW1iZXJzICovCisgIGlmIChzdGF0cy0+YWN0aXZlX3NvdXJjZXMgPCA1MCkKKyAgICByZXR1cm4gMDsKKworICBydGNwX21pbl90aW1lID0gKHN0YXRzLT5taW5faW50ZXJ2YWwpIC8gMi4wOworCisgIC8qIERlZGljYXRlIGEgZnJhY3Rpb24gb2YgdGhlIFJUQ1AgYmFuZHdpZHRoIHRvIHNlbmRlcnMgdW5sZXNzCisgICAqIHRoZSBudW1iZXIgb2Ygc2VuZGVycyBpcyBsYXJnZSBlbm91Z2ggdGhhdCB0aGVpciBzaGFyZSBpcworICAgKiBtb3JlIHRoYW4gdGhhdCBmcmFjdGlvbi4KKyAgICovCisgIG1lbWJlcnMgPSBzdGF0cy0+YnllX21lbWJlcnM7CisgIHJ0Y3BfYncgPSBzdGF0cy0+cnRjcF9iYW5kd2lkdGggKiBzdGF0cy0+cmVjZWl2ZXJfZnJhY3Rpb247CisKKyAgLyogbm8gYmFuZHdpZHRoIGZvciBSVENQLCByZXR1cm4gTk9ORSB0byBzaWduYWwgdGhhdCB3ZSBkb24ndCB3YW50IHRvIHNlbmQKKyAgICogUlRDUCBwYWNrZXRzICovCisgIGlmIChydGNwX2J3IDw9IDAuMDAwMSkKKyAgICByZXR1cm4gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBhdmdfcnRjcF9zaXplID0gOC4wICogc3RhdHMtPmF2Z19ydGNwX3BhY2tldF9zaXplOworICAvKgorICAgKiBUaGUgZWZmZWN0aXZlIG51bWJlciBvZiBzaXRlcyB0aW1lcyB0aGUgYXZlcmFnZSBwYWNrZXQgc2l6ZSBpcworICAgKiB0aGUgdG90YWwgbnVtYmVyIG9mIG9jdGV0cyBzZW50IHdoZW4gZWFjaCBzaXRlIHNlbmRzIGEgcmVwb3J0LgorICAgKiBEaXZpZGluZyB0aGlzIGJ5IHRoZSBlZmZlY3RpdmUgYmFuZHdpZHRoIGdpdmVzIHRoZSB0aW1lCisgICAqIGludGVydmFsIG92ZXIgd2hpY2ggdGhvc2UgcGFja2V0cyBtdXN0IGJlIHNlbnQgaW4gb3JkZXIgdG8KKyAgICogbWVldCB0aGUgYmFuZHdpZHRoIHRhcmdldCwgd2l0aCBhIG1pbmltdW0gZW5mb3JjZWQuICBJbiB0aGF0CisgICAqIHRpbWUgaW50ZXJ2YWwgd2Ugc2VuZCBvbmUgcmVwb3J0IHNvIHRoaXMgdGltZSBpcyBhbHNvIG91cgorICAgKiBhdmVyYWdlIHRpbWUgYmV0d2VlbiByZXBvcnRzLgorICAgKi8KKyAgaW50ZXJ2YWwgPSBhdmdfcnRjcF9zaXplICogbWVtYmVycyAvIHJ0Y3BfYnc7CisgIGlmIChpbnRlcnZhbCA8IHJ0Y3BfbWluX3RpbWUpCisgICAgaW50ZXJ2YWwgPSBydGNwX21pbl90aW1lOworCisgIHJldHVybiBpbnRlcnZhbCAqIEdTVF9TRUNPTkQ7Cit9CisKKy8qKgorICogcnRwX3N0YXRzX2dldF9wYWNrZXRzX2xvc3Q6CisgKiBAc3RhdHM6IGFuICNSVFBTb3VyY2VTdGF0cyBzdHJ1Y3QKKyAqCisgKiBDYWxjdWxhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBSVFAgcGFja2V0cyBsb3N0IHNpbmNlIGJlZ2lubmluZyBvZgorICogcmVjZXB0aW9uLiBQYWNrZXRzIHRoYXQgYXJyaXZlIGxhdGUgYXJlIG5vdCBjb25zaWRlcmVkIGxvc3QsIGFuZAorICogZHVwbGljYXRlcyBhcmUgbm90IHRha2VuIGludG8gYWNjb3VudC4gSGVuY2UsIHRoZSBsb3NzIG1heSBiZSBuZWdhdGl2ZQorICogaWYgdGhlcmUgYXJlIGR1cGxpY2F0ZXMuCisgKgorICogUmV0dXJuczogdG90YWwgUlRQIHBhY2tldHMgbG9zdC4KKyAqLworZ2ludDY0CitydHBfc3RhdHNfZ2V0X3BhY2tldHNfbG9zdCAoY29uc3QgUlRQU291cmNlU3RhdHMgKiBzdGF0cykKK3sKKyAgZ2ludDY0IGxvc3Q7CisgIGd1aW50NjQgZXh0ZW5kZWRfbWF4LCBleHBlY3RlZDsKKworICBleHRlbmRlZF9tYXggPSBzdGF0cy0+Y3ljbGVzICsgc3RhdHMtPm1heF9zZXE7CisgIGV4cGVjdGVkID0gZXh0ZW5kZWRfbWF4IC0gc3RhdHMtPmJhc2Vfc2VxICsgMTsKKyAgbG9zdCA9IGV4cGVjdGVkIC0gc3RhdHMtPnBhY2tldHNfcmVjZWl2ZWQ7CisKKyAgcmV0dXJuIGxvc3Q7Cit9CisKK3ZvaWQKK3J0cF9zdGF0c19zZXRfbWluX2ludGVydmFsIChSVFBTZXNzaW9uU3RhdHMgKiBzdGF0cywgZ2RvdWJsZSBtaW5faW50ZXJ2YWwpCit7CisgIHN0YXRzLT5taW5faW50ZXJ2YWwgPSBtaW5faW50ZXJ2YWw7Cit9CisKK2dib29sZWFuCitfX2dfc29ja2V0X2FkZHJlc3NfZXF1YWwgKEdTb2NrZXRBZGRyZXNzICogYSwgR1NvY2tldEFkZHJlc3MgKiBiKQoreworICBHSW5ldFNvY2tldEFkZHJlc3MgKmlhLCAqaWI7CisgIEdJbmV0QWRkcmVzcyAqaWFhLCAqaWFiOworCisgIGlhID0gR19JTkVUX1NPQ0tFVF9BRERSRVNTIChhKTsKKyAgaWIgPSBHX0lORVRfU09DS0VUX0FERFJFU1MgKGIpOworCisgIGlmIChnX2luZXRfc29ja2V0X2FkZHJlc3NfZ2V0X3BvcnQgKGlhKSAhPQorICAgICAgZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9wb3J0IChpYikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlhYSA9IGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcyAoaWEpOworICBpYWIgPSBnX2luZXRfc29ja2V0X2FkZHJlc3NfZ2V0X2FkZHJlc3MgKGliKTsKKworICByZXR1cm4gZ19pbmV0X2FkZHJlc3NfZXF1YWwgKGlhYSwgaWFiKTsKK30KKworZ2NoYXIgKgorX19nX3NvY2tldF9hZGRyZXNzX3RvX3N0cmluZyAoR1NvY2tldEFkZHJlc3MgKiBhZGRyKQoreworICBHSW5ldFNvY2tldEFkZHJlc3MgKmlhOworICBnY2hhciAqcmV0LCAqdG1wOworCisgIGlhID0gR19JTkVUX1NPQ0tFVF9BRERSRVNTIChhZGRyKTsKKworICB0bXAgPSBnX2luZXRfYWRkcmVzc190b19zdHJpbmcgKGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcyAoaWEpKTsKKyAgcmV0ID0gZ19zdHJkdXBfcHJpbnRmICgiJXM6JXUiLCB0bXAsIGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfcG9ydCAoaWEpKTsKKyAgZ19mcmVlICh0bXApOworCisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oIGIvZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGZiZGRiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaApAQCAtMCwwICsxLDI2NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAgMjAxNSBLdXJlbnRvIChodHRwOi8va3VyZW50by5vcmcvKQorICogICBAYXV0aG9yOiBNaWd1ZWwgUGFyw61zIDxtcGFyaXNkaWF6QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fUlRQX1NUQVRTX0hfXworI2RlZmluZSBfX1JUUF9TVEFUU19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvbmV0L2dzdG5ldGFkZHJlc3NtZXRhLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9ydHAuaD4KKyNpbmNsdWRlIDxnaW8vZ2lvLmg+CisKKy8qKgorICogUlRQU2VuZGVyUmVwb3J0OgorICoKKyAqIEEgc2VuZGVyIHJlcG9ydCBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgZ2Jvb2xlYW4gaXNfdmFsaWQ7CisgIGd1aW50NjQgbnRwdGltZTsKKyAgZ3VpbnQzMiBydHB0aW1lOworICBndWludDMyIHBhY2tldF9jb3VudDsKKyAgZ3VpbnQzMiBvY3RldF9jb3VudDsKKyAgR3N0Q2xvY2tUaW1lIHRpbWU7Cit9IFJUUFNlbmRlclJlcG9ydDsKKworLyoqCisgKiBSVFBSZWNlaXZlclJlcG9ydDoKKyAqCisgKiBBIHJlY2VpdmVyIHJlcG9ydCBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgZ2Jvb2xlYW4gaXNfdmFsaWQ7CisgIGd1aW50MzIgc3NyYzsgLyogd2hvIHRoZSByZXBvcnQgaXMgZnJvbSAqLworICBndWludDggIGZyYWN0aW9ubG9zdDsKKyAgZ3VpbnQzMiBwYWNrZXRzbG9zdDsKKyAgZ3VpbnQzMiBleHRoaWdoZXN0c2VxOworICBndWludDMyIGppdHRlcjsKKyAgZ3VpbnQzMiBsc3I7CisgIGd1aW50MzIgZGxzcjsKKyAgZ3VpbnQzMiByb3VuZF90cmlwOworfSBSVFBSZWNlaXZlclJlcG9ydDsKKworLyoqCisgKiBSVFBQYWNrZXRJbmZvOgorICogQHNlbmQ6IGlmIHRoaXMgaXMgYSBwYWNrZXQgZm9yIHNlbmRpbmcKKyAqIEBydHA6IGlmIHRoaXMgaW5mbyBpcyBhYm91dCBhbiBSVFAgcGFja2V0CisgKiBAaXNfbGlzdDogaWYgdGhpcyBpcyBhIGJ1ZmZlcmxpc3QKKyAqIEBkYXRhOiBhICNHc3RCdWZmZXIgb3IgI0dzdEJ1ZmZlckxpc3QKKyAqIEBhZGRyZXNzOiBhZGRyZXNzIG9mIHRoZSBzZW5kZXIgb2YgdGhlIHBhY2tldAorICogQGN1cnJlbnRfdGltZTogY3VycmVudCB0aW1lIGFjY29yZGluZyB0byB0aGUgc3lzdGVtIGNsb2NrCisgKiBAcnVubmluZ190aW1lOiB0aW1lIG9mIGEgcGFja2V0IGFzIGJ1ZmZlciBydW5uaW5nX3RpbWUKKyAqIEBudHBuc3RpbWU6IHRpbWUgb2YgYSBwYWNrZXQgTlRQIHRpbWUgaW4gbmFub3NlY29uZHMKKyAqIEBoZWFkZXJfbGVuOiBudW1iZXIgb2Ygb3ZlcmhlYWQgYnl0ZXMgcGVyIHBhY2tldAorICogQGJ5dGVzOiBieXRlcyBvZiB0aGUgcGFja2V0IGluY2x1ZGluZyBsb3dsZXZlbCBvdmVyaGVhZAorICogQHBheWxvYWRfbGVuOiBieXRlcyBvZiB0aGUgUlRQIHBheWxvYWQKKyAqIEBzZXFudW06IHRoZSBzZXFudW0gb2YgdGhlIHBhY2tldAorICogQHB0OiB0aGUgcGF5bG9hZCB0eXBlIG9mIHRoZSBwYWNrZXQKKyAqIEBydHB0aW1lOiB0aGUgUlRQIHRpbWUgb2YgdGhlIHBhY2tldAorICoKKyAqIFN0cnVjdHVyZSBob2xkaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYWNrZXQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgZ2Jvb2xlYW4gICAgICBzZW5kOworICBnYm9vbGVhbiAgICAgIHJ0cDsKKyAgZ2Jvb2xlYW4gICAgICBpc19saXN0OworICBncG9pbnRlciAgICAgIGRhdGE7CisgIEdTb2NrZXRBZGRyZXNzICphZGRyZXNzOworICBHc3RDbG9ja1RpbWUgIGN1cnJlbnRfdGltZTsKKyAgR3N0Q2xvY2tUaW1lICBydW5uaW5nX3RpbWU7CisgIGd1aW50NjQgICAgICAgbnRwbnN0aW1lOworICBndWludCAgICAgICAgIGhlYWRlcl9sZW47CisgIGd1aW50ICAgICAgICAgYnl0ZXM7CisgIGd1aW50ICAgICAgICAgcGFja2V0czsKKyAgZ3VpbnQgICAgICAgICBwYXlsb2FkX2xlbjsKKyAgZ3VpbnQzMiAgICAgICBzc3JjOworICBndWludDE2ICAgICAgIHNlcW51bTsKKyAgZ3VpbnQ4ICAgICAgICBwdDsKKyAgZ3VpbnQzMiAgICAgICBydHB0aW1lOworICBndWludDMyICAgICAgIGNzcmNfY291bnQ7CisgIGd1aW50MzIgICAgICAgY3NyY3NbMTZdOworfSBSVFBQYWNrZXRJbmZvOworCisvKioKKyAqIFJUUFNvdXJjZVN0YXRzOgorICogQHBhY2tldHNyZWNlaXZlZDogbnVtYmVyIG9mIHJlY2VpdmVkIHBhY2tldHMgaW4gdG90YWwKKyAqIEBwcmV2cGFja2V0c3JlY2VpdmVkOiBudW1iZXIgb2YgcGFja2V0cyByZWNlaXZlZCBpbiBwcmV2aW91cyByZXBvcnRpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbAorICogQG9jdGV0c3JlY2VpdmVkOiBudW1iZXIgb2YgcGF5bG9hZCBieXRlcyByZWNlaXZlZAorICogQGJ5dGVzcmVjZWl2ZWQ6IG51bWJlciBvZiB0b3RhbCBieXRlcyByZWNlaXZlZCBpbmNsdWRpbmcgaGVhZGVycyBhbmQgbG93ZXIKKyAqICAgICAgICAgICAgICAgICBwcm90b2NvbCBsZXZlbCBvdmVyaGVhZAorICogQG1heF9zZXFucjogaGlnaGVzdCBzZXF1ZW5jZSBudW1iZXIgcmVjZWl2ZWQKKyAqIEB0cmFuc2l0OiBwcmV2aW91cyB0cmFuc2l0IHRpbWUgdXNlZCBmb3IgY2FsY3VsYXRpbmcgQGppdHRlcgorICogQGppdHRlcjogY3VycmVudCBqaXR0ZXIgKGluIGNsb2NrIHJhdGUgdW5pdHMgc2NhbGVkIGJ5IDE2IGZvciBwcmVjaXNpb24pCisgKiBAcHJldl9ydHB0aW1lOiBwcmV2aW91cyB0aW1lIHdoZW4gYW4gUlRQIHBhY2tldCB3YXMgcmVjZWl2ZWQKKyAqIEBwcmV2X3J0Y3B0aW1lOiBwcmV2aW91cyB0aW1lIHdoZW4gYW4gUlRDUCBwYWNrZXQgd2FzIHJlY2VpdmVkCisgKiBAbGFzdF9ydHB0aW1lOiB0aW1lIHdoZW4gbGFzdCBSVFAgcGFja2V0IHJlY2VpdmVkCisgKiBAbGFzdF9ydGNwdGltZTogdGltZSB3aGVuIGxhc3QgUlRDUCBwYWNrZXQgcmVjZWl2ZWQKKyAqIEBjdXJyX3JyOiBpbmRleCBvZiBjdXJyZW50IEByciBibG9jaworICogQHJyOiBwcmV2aW91cyBhbmQgY3VycmVudCByZWNlaXZlciByZXBvcnQgYmxvY2sKKyAqIEBjdXJyX3NyOiBpbmRleCBvZiBjdXJyZW50IEBzciBibG9jaworICogQHNyOiBwcmV2aW91cyBhbmQgY3VycmVudCBzZW5kZXIgcmVwb3J0IGJsb2NrCisgKgorICogU3RhdHMgYWJvdXQgYSBzb3VyY2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3VpbnQ2NCAgICAgIHBhY2tldHNfcmVjZWl2ZWQ7CisgIGd1aW50NjQgICAgICBvY3RldHNfcmVjZWl2ZWQ7CisgIGd1aW50NjQgICAgICBieXRlc19yZWNlaXZlZDsKKworICBndWludDMyICAgICAgcHJldl9leHBlY3RlZDsKKyAgZ3VpbnQzMiAgICAgIHByZXZfcmVjZWl2ZWQ7CisKKyAgZ3VpbnQxNiAgICAgIG1heF9zZXE7CisgIGd1aW50NjQgICAgICBjeWNsZXM7CisgIGd1aW50MzIgICAgICBiYXNlX3NlcTsKKyAgZ3VpbnQzMiAgICAgIGJhZF9zZXE7CisgIGd1aW50MzIgICAgICB0cmFuc2l0OworICBndWludDMyICAgICAgaml0dGVyOworCisgIGd1aW50NjQgICAgICBwYWNrZXRzX3NlbnQ7CisgIGd1aW50NjQgICAgICBvY3RldHNfc2VudDsKKworICBndWludCAgICAgICAgc2VudF9wbGlfY291bnQ7CisgIGd1aW50ICAgICAgICByZWN2X3BsaV9jb3VudDsKKyAgZ3VpbnQgICAgICAgIHNlbnRfZmlyX2NvdW50OworICBndWludCAgICAgICAgcmVjdl9maXJfY291bnQ7CisgIGd1aW50ICAgICAgICBzZW50X25hY2tfY291bnQ7CisgIGd1aW50ICAgICAgICByZWN2X25hY2tfY291bnQ7CisKKyAgLyogd2hlbiB3ZSByZWNlaXZlZCBzdHVmZiAqLworICBHc3RDbG9ja1RpbWUgcHJldl9ydHB0aW1lOworICBHc3RDbG9ja1RpbWUgcHJldl9ydGNwdGltZTsKKyAgR3N0Q2xvY2tUaW1lIGxhc3RfcnRwdGltZTsKKyAgR3N0Q2xvY2tUaW1lIGxhc3RfcnRjcHRpbWU7CisKKyAgLyogc2VuZGVyIGFuZCByZWNlaXZlciByZXBvcnRzICovCisgIGdpbnQgICAgICAgICAgICAgIGN1cnJfcnI7CisgIFJUUFJlY2VpdmVyUmVwb3J0IHJyWzJdOworICBnaW50ICAgICAgICAgICAgICBjdXJyX3NyOworICBSVFBTZW5kZXJSZXBvcnQgICBzclsyXTsKK30gUlRQU291cmNlU3RhdHM7CisKKyNkZWZpbmUgUlRQX1NUQVRTX0JBTkRXSURUSCAgICAgICAgICAgNjQwMDAKKyNkZWZpbmUgUlRQX1NUQVRTX1JUQ1BfRlJBQ1RJT04gICAgICAgMC4wNQorLyoKKyAqIE1pbmltdW0gYXZlcmFnZSB0aW1lIGJldHdlZW4gUlRDUCBwYWNrZXRzIGZyb20gdGhpcyBzaXRlIChpbgorICogc2Vjb25kcykuICBUaGlzIHRpbWUgcHJldmVudHMgdGhlIHJlcG9ydHMgZnJvbSBgY2x1bXBpbmcnIHdoZW4KKyAqIHNlc3Npb25zIGFyZSBzbWFsbCBhbmQgdGhlIGxhdyBvZiBsYXJnZSBudW1iZXJzIGlzbid0IGhlbHBpbmcKKyAqIHRvIHNtb290aCBvdXQgdGhlIHRyYWZmaWMuICBJdCBhbHNvIGtlZXBzIHRoZSByZXBvcnQgaW50ZXJ2YWwKKyAqIGZyb20gYmVjb21pbmcgcmlkaWN1bG91c2x5IHNtYWxsIGR1cmluZyB0cmFuc2llbnQgb3V0YWdlcyBsaWtlCisgKiBhIG5ldHdvcmsgcGFydGl0aW9uLgorICovCisjZGVmaW5lIFJUUF9TVEFUU19NSU5fSU5URVJWQUwgICAgICA1LjAKKy8qCisgKiBGcmFjdGlvbiBvZiB0aGUgUlRDUCBiYW5kd2lkdGggdG8gYmUgc2hhcmVkIGFtb25nIGFjdGl2ZQorICogc2VuZGVycy4gIChUaGlzIGZyYWN0aW9uIHdhcyBjaG9zZW4gc28gdGhhdCBpbiBhIHR5cGljYWwKKyAqIHNlc3Npb24gd2l0aCBvbmUgb3IgdHdvIGFjdGl2ZSBzZW5kZXJzLCB0aGUgY29tcHV0ZWQgcmVwb3J0CisgKiB0aW1lIHdvdWxkIGJlIHJvdWdobHkgZXF1YWwgdG8gdGhlIG1pbmltdW0gcmVwb3J0IHRpbWUgc28gdGhhdAorICogd2UgZG9uJ3QgdW5uZWNlc3NhcmlseSBzbG93IGRvd24gcmVjZWl2ZXIgcmVwb3J0cy4pIFRoZQorICogcmVjZWl2ZXIgZnJhY3Rpb24gbXVzdCBiZSAxIC0gdGhlIHNlbmRlciBmcmFjdGlvbi4KKyAqLworI2RlZmluZSBSVFBfU1RBVFNfU0VOREVSX0ZSQUNUSU9OICAgICAgICgwLjI1KQorI2RlZmluZSBSVFBfU1RBVFNfUkVDRUlWRVJfRlJBQ1RJT04gICAgICgxLjAgLSBSVFBfU1RBVFNfU0VOREVSX0ZSQUNUSU9OKQorCisvKgorICogV2hlbiByZWNlaXZpbmcgYSBCWUUgZnJvbSBhIHNvdXJjZSwgcmVtb3ZlIHRoZSBzb3VyY2UgZnJvbSB0aGUgZGF0YWJhc2UKKyAqIGFmdGVyIHRoaXMgdGltZW91dC4KKyAqLworI2RlZmluZSBSVFBfU1RBVFNfQllFX1RJTUVPVVQgICAgICAgICAgICgyICogR1NUX1NFQ09ORCkKKworLyoKKyAqIFRoZSBkZWZhdWx0IGFuZCBtaW5pbXVtIHZhbHVlcyBvZiB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWlzc2luZyBwYWNrZXRzIHdlIHRvbGVyYXRlLgorICogVGhlc2UgYXJlIHBhY2tldHMgd2l0aCBhc2VxdWVuY2UgbnVtYmVyIGJpZ2dlciB0aGFuIHRoZSBsYXN0IHNlZW4gcGFja2V0LgorICovCisjZGVmaW5lIFJUUF9ERUZfRFJPUE9VVCAgICAgIDMwMDAKKyNkZWZpbmUgUlRQX01JTl9EUk9QT1VUICAgICAgMzAKKworLyoKKyAqIFRoZSBkZWZhdWx0IGFuZCBtaW5pbXVtIHZhbHVlcyBvZiB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWlzb3JkZXJlZCBwYWNrZXRzIHdlIHRvbGVyYXRlLgorICogVGhlc2UgYXJlIHBhY2tldHMgd2l0aCBhIHNlcXVlbmNlIG51bWJlciBzbWFsbGVyIHRoYW4gdGhlIGxhc3Qgc2VlbiBwYWNrZXQuCisgKi8KKyNkZWZpbmUgUlRQX0RFRl9NSVNPUkRFUiAgICAgMTAwCisjZGVmaW5lIFJUUF9NSU5fTUlTT1JERVIgICAgIDEwCisKKy8qKgorICogUlRQUGFja2V0UmF0ZUN0eDoKKyAqCisgKiBDb250ZXh0IHRvIGNhbGN1bGF0ZSB0aGUgcHNldWRvLWF2ZXJhZ2UgcGFja2V0IHJhdGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgZ2Jvb2xlYW4gcHJvYmVkOworICBnaW50MzIgY2xvY2tfcmF0ZTsKKyAgZ3VpbnQxNiBsYXN0X3NlcW51bTsKKyAgZ3VpbnQ2NCBsYXN0X3RzOworICBndWludDMyIGF2Z19wYWNrZXRfcmF0ZTsKK30gUlRQUGFja2V0UmF0ZUN0eDsKKwordm9pZCBnc3RfcnRwX3BhY2tldF9yYXRlX2N0eF9yZXNldCAoUlRQUGFja2V0UmF0ZUN0eCAqIGN0eCwgZ2ludDMyIGNsb2NrX3JhdGUpOworZ3VpbnQzMiBnc3RfcnRwX3BhY2tldF9yYXRlX2N0eF91cGRhdGUgKFJUUFBhY2tldFJhdGVDdHggKmN0eCwgZ3VpbnQxNiBzZXFudW0sIGd1aW50MzIgdHMpOworZ3VpbnQzMiBnc3RfcnRwX3BhY2tldF9yYXRlX2N0eF9nZXQgKFJUUFBhY2tldFJhdGVDdHggKmN0eCk7CitndWludDMyIGdzdF9ydHBfcGFja2V0X3JhdGVfY3R4X2dldF9tYXhfZHJvcG91dCAoUlRQUGFja2V0UmF0ZUN0eCAqY3R4LCBnaW50MzIgdGltZV9tcyk7CitndWludDMyIGdzdF9ydHBfcGFja2V0X3JhdGVfY3R4X2dldF9tYXhfbWlzb3JkZXIgKFJUUFBhY2tldFJhdGVDdHggKmN0eCwgZ2ludDMyIHRpbWVfbXMpOworCisvKioKKyAqIFJUUFNlc3Npb25TdGF0czoKKyAqCisgKiBTdGF0cyBrZXB0IGZvciBhIHNlc3Npb24gYW5kIHVzZWQgdG8gcHJvZHVjZSBSVENQIHBhY2tldCB0aW1lb3V0cy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBndWludCAgICAgICAgIGJhbmR3aWR0aDsKKyAgZ3VpbnQgICAgICAgICBydGNwX2JhbmR3aWR0aDsKKyAgZ2RvdWJsZSAgICAgICBzZW5kZXJfZnJhY3Rpb247CisgIGdkb3VibGUgICAgICAgcmVjZWl2ZXJfZnJhY3Rpb247CisgIGdkb3VibGUgICAgICAgbWluX2ludGVydmFsOworICBHc3RDbG9ja1RpbWUgIGJ5ZV90aW1lb3V0OworICBndWludCAgICAgICAgIGludGVybmFsX3NvdXJjZXM7CisgIGd1aW50ICAgICAgICAgc2VuZGVyX3NvdXJjZXM7CisgIGd1aW50ICAgICAgICAgaW50ZXJuYWxfc2VuZGVyX3NvdXJjZXM7CisgIGd1aW50ICAgICAgICAgYWN0aXZlX3NvdXJjZXM7CisgIGd1aW50ICAgICAgICAgYXZnX3J0Y3BfcGFja2V0X3NpemU7CisgIGd1aW50ICAgICAgICAgYnllX21lbWJlcnM7CisgIGd1aW50ICAgICAgICAgbmFja3NfZHJvcHBlZDsKKyAgZ3VpbnQgICAgICAgICBuYWNrc19zZW50OworICBndWludCAgICAgICAgIG5hY2tzX3JlY2VpdmVkOworfSBSVFBTZXNzaW9uU3RhdHM7CisKK3ZvaWQgICAgICAgICAgIHJ0cF9zdGF0c19pbml0X2RlZmF1bHRzICAgICAgICAgICAgICAoUlRQU2Vzc2lvblN0YXRzICpzdGF0cyk7CisKK3ZvaWQgICAgICAgICAgIHJ0cF9zdGF0c19zZXRfYmFuZHdpZHRocyAgICAgICAgICAgICAoUlRQU2Vzc2lvblN0YXRzICpzdGF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQgcnRwX2J3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlIHJ0Y3BfYncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50IHJzLCBndWludCBycik7CisKK0dzdENsb2NrVGltZSAgIHJ0cF9zdGF0c19jYWxjdWxhdGVfcnRjcF9pbnRlcnZhbCAgICAoUlRQU2Vzc2lvblN0YXRzICpzdGF0cywgZ2Jvb2xlYW4gc2VuZGVyLCBHc3RSVFBQcm9maWxlIHByb2ZpbGUsIGdib29sZWFuIHB0cCwgZ2Jvb2xlYW4gZmlyc3QpOworR3N0Q2xvY2tUaW1lICAgcnRwX3N0YXRzX2FkZF9ydGNwX2ppdHRlciAgICAgICAgICAgIChSVFBTZXNzaW9uU3RhdHMgKnN0YXRzLCBHc3RDbG9ja1RpbWUgaW50ZXJ2YWwpOworR3N0Q2xvY2tUaW1lICAgcnRwX3N0YXRzX2NhbGN1bGF0ZV9ieWVfaW50ZXJ2YWwgICAgIChSVFBTZXNzaW9uU3RhdHMgKnN0YXRzKTsKK2dpbnQ2NCAgICAgICAgIHJ0cF9zdGF0c19nZXRfcGFja2V0c19sb3N0ICAgICAgICAgICAoY29uc3QgUlRQU291cmNlU3RhdHMgKnN0YXRzKTsKKwordm9pZCAgICAgICAgICAgcnRwX3N0YXRzX3NldF9taW5faW50ZXJ2YWwgICAgICAgICAgIChSVFBTZXNzaW9uU3RhdHMgKnN0YXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlIG1pbl9pbnRlcnZhbCk7CisKKworZ2Jvb2xlYW4gX19nX3NvY2tldF9hZGRyZXNzX2VxdWFsIChHU29ja2V0QWRkcmVzcyAqYSwgR1NvY2tldEFkZHJlc3MgKmIpOworZ2NoYXIgKiBfX2dfc29ja2V0X2FkZHJlc3NfdG9fc3RyaW5nIChHU29ja2V0QWRkcmVzcyAqIGFkZHIpOworCisjZW5kaWYgLyogX19SVFBfU1RBVFNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRzcC8uZ2l0aWdub3JlIGIvZ3N0L3J0c3AvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDg0NmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0c3AvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDggQEAKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorKi5vCisqLmxvCisqLmxhCisuZGVwcworLmxpYnMKK3Rlc3QKZGlmZiAtLWdpdCBhL2dzdC9ydHNwL0NPUFlJTkcuTUlUIGIvZ3N0L3J0c3AvQ09QWUlORy5NSVQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2OWI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHNwL0NPUFlJTkcuTUlUCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgU291cmNlIENvZGUgaXMgbGljZW5zZWQgdW5kZXIgTUlUIGxpY2Vuc2UuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCmRpZmYgLS1naXQgYS9nc3QvcnRzcC9NYWtlZmlsZS5hbSBiL2dzdC9ydHNwL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYTc5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRzcC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE1IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RydHNwLmxhCisKK2xpYmdzdHJ0c3BfbGFfU09VUkNFUyA9IGdzdHJ0c3AuYyBnc3RydHNwc3JjLmMgXAorCQkJZ3N0cnRwZGVjLmMgZ3N0cnRzcGV4dC5jCisKK2xpYmdzdHJ0c3BfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKEdJT19DRkxBR1MpCitsaWJnc3RydHNwX2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKEdTVF9CQVNFX0xJQlMpICQoR0lPX0xJQlMpIFwKKwkJICAgICAgIC1sZ3N0cnRwLUBHU1RfQVBJX1ZFUlNJT05AIC1sZ3N0cnRzcC1AR1NUX0FQSV9WRVJTSU9OQCBcCisJCSAgICAgICAtbGdzdHNkcC1AR1NUX0FQSV9WRVJTSU9OQCAkKEdTVF9ORVRfTElCUykgJChHU1RfTElCUykKK2xpYmdzdHJ0c3BfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdHJ0c3BzcmMuaCAgICAgXAorCQkgZ3N0cnRzcC5oICAgICAgICBcCisJCSBnc3RydHBkZWMuaCAgICAgIFwKKwkJIGdzdHJ0c3BleHQuaApkaWZmIC0tZ2l0IGEvZ3N0L3J0c3AvUkVBRE1FIGIvZ3N0L3J0c3AvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNmYzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRzcC9SRUFETUUKQEAgLTAsMCArMSwzNzcgQEAKK1JUU1Agc291cmNlIAorLS0tLS0tLS0tLS0KKworVGhlIFJUU1Agc291cmNlIGVzdGFibGlzaGVzIGEgY29ubmVjdGlvbiB0byBhbiBSVFNQIHNlcnZlciBhbmQgc2V0cyB1cAordGhlIFVEUCBzb3VyY2VzIGFuZCBSVFAgc2Vzc2lvbiBoYW5kbGVycy4KKworQW4gUlRTUCBzZXNzaW9uIGlzIGNyZWF0ZWQgYXMgZm9sbG93czoKKworLSBQYXJzZSBSVFNQIFVSTDoKKworICAgZXg6CisgICAgIHJ0c3A6Ly90aHJlYWQ6NTQ1NC9zb3V0aC1ydHNwLm1wMworCistIE9wZW4gYSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgdXJsLiBBbGwgZnVydGhlciBjb252ZXJzYXRpb24gd2l0aAorICB0aGUgc2VydmVyIHNob3VsZCBiZSBkb25lIHdpdGggdGhpcyBjb25uZWN0aW9uLiBFYWNoIHJlcXVlc3QvcmVwbHkgaGFzCisgIGEgQ1NlcSBudW1iZXIgYWRkZWQgdG8gdGhlIGhlYWRlci4KKworLSBTZW5kIGEgREVTQ1JJQkUgcmVxdWVzdCBmb3IgdGhlIHVybC4gV2UgY3VycmVudGx5IHN1cHBvcnQgYSByZXNwb25zZSBpbgorICBTRFAuCisKKyAgZXg6CisKKyAgICA+PiBERVNDUklCRSBydHNwOi8vdGhyZWFkOjU0NTQvc291dGgtcnRzcC5tcDMgUlRTUC8xLjAKKyAgICA+PiBBY2NlcHQ6IGFwcGxpY2F0aW9uL3NkcAorICAgID4+IENTZXE6IDAKKyAgICA+PgorICAgIDw8IFJUU1AvMS4wIDIwMCBPSworICAgIDw8IENvbnRlbnQtTGVuZ3RoOiA4NAorICAgIDw8IENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vc2RwCisgICAgPDwgQ1NlcTogMAorICAgIDw8IERhdGU6IFdlZCBNYXkgMTEgMTM6MDk6MzcgMjAwNSBHTVQKKyAgICA8PAorICAgIDw8IHY9MAorICAgIDw8IG89LSAwIDAgSU4gSVA0IDE5Mi4xNjguMS4xCisgICAgPDwgcz1ObyBUaXRsZQorICAgIDw8IG09YXVkaW8gMCBSVFAvQVZQIDE0CisgICAgPDwgYT1jb250cm9sOnN0cmVhbWlkPTAKKworLSBQYXJzZSB0aGUgU0RQIG1lc3NhZ2UsIGZvciBlYWNoIHN0cmVhbSAobT0pIHdlIGNyZWF0ZSBhbiBHc3RSVFBTdHJlYW0uIFdlIG5lZWQKKyAgdG8gYWxsb2NhdGUgdHdvIGxvY2FsIFVEUCBwb3J0cyBmb3IgcmVjZWl2aW5nIHRoZSBSVFAgYW5kIFJUQ1AgZGF0YSBiZWNhdXNlIHdlCisgIG5lZWQgdG8gc2VuZCB0aGUgcG9ydCBudW1iZXJzIHRvIHRoZSBzZXJ2ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC4KKworICBJbiBSVFNQU3JjIHdlIGZpcnN0IGNyZWF0ZSBhbiBlbGVtZW50IHRoYXQgY2FuIGhhbmRsZSB0aGUgdWRwOi8vMC4wLjAuMDowIHVyaS4gVGhpcworICB3aWxsIGNyZWF0ZSBhbiB1ZHAgc291cmNlIGVsZW1lbnQgd2l0aCBhIHJhbmRvbSBwb3J0IG51bWJlci4gV2UgZ2V0IHRoZSBwb3J0CisgIG51bWJlciBieSBnZXR0aW5nIHRoZSAicG9ydCIgcHJvcGVydHkgb2YgdGhlIGVsZW1lbnQgYWZ0ZXIgc2V0dGluZyB0aGUgZWxlbWVudCB0byAKKyAgUEFVU0VELiBUaGlzIGVsZW1lbnQgaXMgdXNlZCBmb3IgdGhlIFJUUCBwYWNrZXRzIGFuZCBoYXMgdG8gYmUgYW4gZXZlbiBudW1iZXIuIElmCisgIHRoZSByYW5kb20gcG9ydCBudW1iZXIgaXMgbm90IGFuIGV2ZW4gbnVtYmVyIHdlIHJldHJ5IHRvIGFsbG9jYXRlIGEgbmV3IHVkcCBzb3VyY2UuCisKKyAgV2UgdGhlbiBjcmVhdGUgYW5vdGhlciBVRFAgc291cmNlIGVsZW1lbnQgd2l0aCB0aGUgbmV4dCAodW5ldmVuKSBwb3J0IG51bWJlciB0byAKKyAgcmVjZWl2ZSB0aGUgUlRDUCBwYWNrZXQgb24uIEFmdGVyIHRoaXMgc3RlcCB3ZSBoYXZlIHR3byB1ZHAgcG9ydHMgd2UgY2FuIHVzZSB0bworICBhY2NlcHQgUlRQIHBhY2tldHMuCisKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCArLS0tLS0tLS0tLS0tKyAgfAorICAgIHwgfCB1ZHBzcmMwICAgIHwgIHwKKyAgICB8IHwgIHBvcnQ9NTAwMCB8ICB8CisgICAgfCArLS0tLS0tLS0tLS0tKyAgfAorICAgIHwgKy0tLS0tLS0tLS0tLSsgIHwKKyAgICB8IHwgdWRwc3JjMSAgICB8ICB8CisgICAgfCB8ICBwb3J0PTUwMDEgfCAgfAorICAgIHwgKy0tLS0tLS0tLS0tLSsgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0rCisKKy0gU2VuZCBhIFNFVFVQIG1lc3NhZ2UgdG8gdGhlIHNlcnZlciB3aXRoIHRoZSBSVFAgcG9ydHMuIFdlIGdldCB0aGUgc2V0dXAgVVJJIGZyb20KKyAgdGhlIGE9IGF0dHJpYnV0ZSBpbiB0aGUgU0RQIG1lc3NhZ2UuIFRoaXMgY2FuIGJlIGFuIGFic29sdXRlIFVSTCBvciBhIHJlbGF0aXZlCisgIHVybC4KKworICBleDoKKworICAgID4+IFNFVFVQIHJ0c3A6Ly90aHJlYWQ6NTQ1NC9zb3V0aC1ydHNwLm1wMy9zdHJlYW1pZD0wIFJUU1AvMS4wCisgICAgPj4gQ1NlcTogMQorICAgID4+IFRyYW5zcG9ydDogUlRQL0FWUC9VRFA7dW5pY2FzdDtjbGllbnRfcG9ydD01MDAwLTUwMDEsUlRQL0FWUC9VRFA7bXVsdGljYXN0LFJUUC9BVlAvVENQCisgICAgPj4KKyAgICA8PCBSVFNQLzEuMCAyMDAgT0sKKyAgICA8PCBUcmFuc3BvcnQ6IFJUUC9BVlAvVURQO3VuaWNhc3Q7Y2xpZW50X3BvcnQ9NTAwMC01MDAxO3NlcnZlcl9wb3J0PTYwMDAtNjAwMQorICAgIDw8IENTZXE6IDEKKyAgICA8PCBEYXRlOiBXZWQgTWF5IDExIDEzOjIxOjQzIDIwMDUgR01UCisgICAgPDwgU2Vzc2lvbjogNWQ1Y2I5NDQxMzI4OGNjZAorICAgIDw8CisKKyAgVGhlIGNsaWVudCBuZWVkcyB0byBzZW5kIHRoZSBsb2NhbCBwb3J0cyB0byB0aGUgc2VydmVyIGFsb25nIHdpdGggdGhlIHN1cHBvcnRlZCAKKyAgdHJhbnNwb3J0IHR5cGVzLiBUaGUgc2VydmVyIHNlbGVjdHMgdGhlIGZpbmFsIHRyYW5zcG9ydCB3aGljaCBpdCByZXR1cm5zIGluIHRoZQorICBUcmFuc3BvcnQgaGVhZGVyIGZpZWxkLiBUaGUgc2VydmVyIGFsc28gaW5jbHVkZXMgaXRzIHBvcnRzIHdoZXJlIFJUUCBhbmQgUlRDUAorICBtZXNzYWdlcyBjYW4gYmUgc2VudCB0by4KKworICBJbiB0aGUgYWJvdmUgZXhhbXBsZSBVRFAgd2FzIGNob29zZW4gYXMgYSB0cmFuc3BvcnQuIEF0IHRoaXMgcG9pbnQgdGhlIFJUU1BTcmMgZWxlbWVudAorICB3aWxsIGZ1cnRlciBjb25maWd1cmUgaXRzIGVsZW1lbnRzIHRvIHByb2Nlc3MgdGhpcyBzdHJlYW0uCisKKyAgVGhlIFJUU1BTcmMgd2lsbCBjcmVhdGUgYW5kIGNvbm5lY3QgYW4gUlRQIHNlc3Npb24gbWFuYWdlciBlbGVtZW50IGFuZCB3aWxsCisgIGNvbm5lY3QgaXQgdG8gdGhlIHNyYyBwYWRzIG9mIHRoZSB1ZHAgZWxlbWVudC4gVGhlIGRhdGEgcGFkIGZyb20gdGhlIFJUUCBzZXNzaW9uIAorICBtYW5hZ2VyIGlzIGdob3N0cGFkZGVkIHRvIFJUUFNyYy4KKyAgVGhlIFJUQ1AgcGFkIG9mIHRoZSBydHBkZWMgaXMgcm91dGVkIHRvIGEgbmV3IHVkcHNpbmsgdGhhdCBzZW5kcyBkYXRhIHRvIHRoZSBSVENQCisgIHBvcnQgb2YgdGhlIHNlcnZlciBhcyByZXR1cm5lZCBpbiB0aGUgVHJhbnNwb3J0OiBoZWFkZXIgZmllbGQuCisKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgKy0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCB8IHVkcHNyYzAgICAgfCAgICstLS0tLS0tLSsgICAgICAgICAgICAgICAgIHwKKyAgICB8IHwgIHBvcnQ9NTAwMCAtLS0tLSBydHBkZWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB8ICstLS0tLS0tLS0tLS0rICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgfAorICAgIHwgKy0tLS0tLS0tLS0tLSsgICB8ICAgICAgICB8ICArLS0tLS0tLS0tLS0tKyB8CisgICAgfCB8IHVkcHNyYzEgICAgLS0tLS0gUlRDUCAgIC0tLS0gdWRwc2luayAgICB8IHwKKyAgICB8IHwgIHBvcnQ9NTAwMSB8ICAgKy0tLS0tLS0tKyAgfCAgcG9ydD02MDAxIHwgfAorICAgIHwgKy0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tKyB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworICBUaGUgb3V0cHV0IHR5cGUgb2YgcnRwZGVjIGlzIGNvbmZpZ3VyZWQgYXMgdGhlIG1lZGlhIHR5cGUgc3BlY2lmaWVkIGluIHRoZSBTRFAKKyAgbWVzc2FnZS4gCisKKy0gQWxsIHRoZSBlbGVtZW50cyBhcmUgc2V0IHRvIFBBVVNFRC9QTEFZSU5HIGFuZCB0aGUgUExBWSBSVFNQIG1lc3NhZ2UgaXMKKyAgc2VudC4KKworICAgID4+IFBMQVkgcnRzcDovL3RocmVhZDo1NDU0L3NvdXRoLXJ0c3AubXAzIFJUU1AvMS4wCisgICAgPj4gQ1NlcTogMgorICAgID4+IFNlc3Npb246IDVkNWNiOTQ0MTMyODhjY2QKKyAgICA+PgorICAgIDw8IFJUU1AvMS4wIDIwMCBPSworICAgIDw8IENTZXE6IDIKKyAgICA8PCBEYXRlOiBXZWQgTWF5IDExIDEzOjIxOjQzIDIwMDUgR01UCisgICAgPDwgU2Vzc2lvbjogNWQ1Y2I5NDQxMzI4OGNjZAorICAgIDw8CisKKy0gVGhlIHVkcCBzb3VyY2UgZWxlbWVudHMgcmVjZWl2ZSBkYXRhIGZyb20gdGhhdCBwb2ludCBhbmQgdGhlIFJUUC9SVENQIG1lc3NhZ2VzCisgIGFyZSBwcm9jZXNzZWQgYnkgdGhlIGVsZW1lbnRzLgorCistIEluIHRoZSBjYXNlIG9mIGludGVybGVhdmVkIG1vZGUsIHRoZSBTRVRVUCBtZXRob2QgeWllbGRzOgorCisgICAgPj4gU0VUVVAgcnRzcDovL3RocmVhZDo1NDU0L3NvdXRoLXJ0c3AubXAzL3N0cmVhbWlkPTAgUlRTUC8xLjAKKyAgICA+PiBDU2VxOiAxCisgICAgPj4gVHJhbnNwb3J0OiBSVFAvQVZQL1VEUDt1bmljYXN0O2NsaWVudF9wb3J0PTUwMDAtNTAwMSxSVFAvQVZQL1VEUDttdWx0aWNhc3QsUlRQL0FWUC9UQ1AKKyAgICA+PgorICAgIDw8IFJUU1AvMS4wIDIwMCBPSworICAgIDw8IFRyYW5zcG9ydDogUlRQL0FWUC9UQ1A7aW50ZXJsZWF2ZWQ9MC0xCisgICAgPDwgQ1NlcTogMQorICAgIDw8IERhdGU6IFdlZCBNYXkgMTEgMTM6MjE6NDMgMjAwNSBHTVQKKyAgICA8PCBTZXNzaW9uOiA1ZDVjYjk0NDEzMjg4Y2NkCisgICAgPDwKKworICBUaGlzIG1lYW5zIHRoYXQgUlRQL1JUQ1AgbWVzc2FnZXMgd2lsbCBiZSBzZW50IG9uIGNoYW5uZWwgMC8xIHJlc3BlY3RpdmVseSBhbmQgdGhhdAorICB0aGUgZGF0YSB3aWxsIGJlIHJlY2VpdmVkIG9uIHRoZSBzYW1lIGNvbm5lY3Rpb24gYXMgdGhlIFJUU1AgY29ubmVjdGlvbi4KKworICBBdCB0aGlzIHBvaW50LCB3ZSByZW1vdmUgdGhlIFVEUCBzb3VyY2UgZWxlbWVudHMgYXMgd2UgZG9uJ3QgbmVlZCB0aGVtIGFueW1vcmUuIFdlCisgIHNldCB1cCB0aGUgcnRwc2VzcyBzZXNzaW9uIG1hbmFnZXIgZWxlbWVudCB0aG91Z2ggYXMgZm9sbG93czoKKworICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCArLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICB8IHwgX2xvb3AoKSAgICB8ICAgKy0tLS0tLS0tKyAgICAgICAgICAgICAgICAgfAorICAgIHwgfCAgICAgICAgICAgIC0tLS0tIHJ0cHNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHwgfCAgICAgICAgICAgIHwgICB8ICAgICAgICB8ICAgICAgICAgICAgICAgICB8CisgICAgfCB8ICAgICAgICAgICAgfCAgIHwgICAgICAgIHwgICstLS0tLS0tLS0tLS0rIHwKKyAgICB8IHwgICAgICAgICAgICAtLS0tLSBSVENQICAgLS0tLSB1ZHBzaW5rICAgIHwgfAorICAgIHwgfCAgICAgICAgICAgIHwgICArLS0tLS0tLS0rICB8ICBwb3J0PTYwMDEgfCB8CisgICAgfCArLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0rIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisgIFdlIHN0YXJ0IGFuIGludGVyYWwgdGFzayB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIFJUU1AgY29ubmVjdGlvbiB3YWl0aW5nCisgIGZvciBkYXRhLiBUaGUgcmVjZWl2ZWQgZGF0YSBpcyB0aGVuIHB1c2hlZCB0byB0aGUgcnRwZGVjIGVsZW1lbnQuCisKKyAgV2hlbiByZWFkaW5nIGZyb20gdGhlIFJUU1AgY29ubmVjdGlvbiB3ZSByZWNlaXZlIGRhdGEgcGFja2V0cyBpbiB0aGUKKyAgZm9sbG93aW5nIGxheW91dCAoc2VlIGFsc28gUkZDMjMyNikKKworICAgICQ8MSBieXRlIGNoYW5uZWw+PDIgYnl0ZXMgbGVuZ3RoLCBiaWcgZW5kaWFuPjxsZW5ndGggYnl0ZXMgb2YgZGF0YT4KKworCitSVFNQIHNlcnZlcgorLS0tLS0tLS0tLS0KKworQW4gUlRTUCBzZXJ2ZXIgbGlzdGVuIG9uIGEgcG9ydCAoZGVmYXVsdCA1NTQpIGZvciBjbGllbnQgY29ubmVjdGlvbnMuIFRoZSBjbGllbnQKK3R5cGljYWxseSBrZWVwcyB0aGlzIGNoYW5uZWwgb3BlbiBkdXJpbmcgdGhlIFJUU1Agc2Vzc2lvbiB0byBpbnN0cnVjdCB0aGUgc2VydmVyCit0byBwYXVzZS9wbGF5L3N0b3AgdGhlIHN0cmVhbS4KKworVGhlIHNlcnZlciBleHBvc2VzIGEgc3RyZWFtIGNvbnNpc3Rpbmcgb2Ygb25lIG9yIG1vcmUgbWVkaWEgc3RyZWFtcyB1c2luZyBhbgorVVJMLiBUaGUgbWVkaWEgc3RyZWFtcyBhcmUgdHlwaWNhbGx5IGF1ZGlvIGFuZCB2aWRlby4KKworICBleDoKKyAgICAgcnRzcDovL3RocmVhZDo1NDU0L2FsaWVuLXJ0c3AubXBlZworCisgICAgIGV4cG9zZXMgYW4gYXVkaW8vdmlkZW8gc3RyZWFtLiBUaGUgdmlkZW8gaXMgbXBlZyBwYWNrZXRpemVkIGluIFJUUCBhbmQKKyAgICAgdGhlIGF1ZGlvIGlzIG1wMyBpbiBSVFAuCisKK1RoZSBzdHJlYW1pbmcgc2VydmVyIHR5cGljYWxseSB1c2VzIGEgZGlmZmVyZW50IGNoYW5uZWwgdG8gc2VuZCB0aGUgbWVkaWEKK2RhdGEgdG8gY2xpZW50cywgdHlwaWNhbGx5IHVzaW5nIFJUUCBvdmVyIFVEUC4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzdHJlYW0KK3RoZSBkYXRhIHRvIHRoZSBjbGllbnQgdXNpbmcgdGhlIGluaXRpYWwgUlRTUCBUQ1Agc2Vzc2lvbiAodGhlIGludGVybGVhdmVkCittb2RlKS4gVGhpcyBsYXN0IG1vZGUgaXMgdXNlZnVsIHdoZW4gdGhlIGNsaWVudCBpcyBiZWhpbmQgYSBmaXJld2FsbCBidXQKK2RvZXMgbm90IHRha2UgYWR2YW50YWdlIG9mIHRoZSBSVFAvVURQIGZlYXR1cmVzLgorCitJbiBib3RoIGNhc2VzLCBtZWRpYSBkYXRhIGlzIHNlbmQgdG8gdGhlIGNsaWVudHMgaW4gYW4gdW5tdWx0aXBsZXhlZCBmb3JtYXQKK3BhY2tldGl6ZWQgYXMgUlRQIHBhY2tldHMuCisKK1RoZSBzdHJlYW1pbmcgc2VydmVyIGhhcyB0byBuZWdvdGlhdGUgYSBjb25uZWN0aW9uIHByb3RvY29sIGZvciBlYWNoIG9mIHRoZQorbWVkaWEgc3RyZWFtcyB3aXRoIHRoZSBjbGllbnQuCisKK01pbmltYWwgc2VydmVyIHJlcXVpcmVtZW50czoKKworLSBUaGUgc2VydmVyIHNob3VsZCBjb3B5IHRoZSBDU2VxIGhlYWRlciBmaWVsZCBpbiBhIGNsaWVudCByZXF1ZXN0IHRvIHRoZQorICByZXNwb25zZSBzbyB0aGF0IHRoZSBjbGllbnQgY2FuIG1hdGNoIHRoZSByZXNwb25zZSB0byB0aGUgcmVxdWVzdC4KKworLSBUaGUgc2VydmVyIHNob3VsZCBrZWVwIGEgc2Vzc2lvbiBmb3IgZWFjaCBjbGllbnQgYWZ0ZXIgdGhlIGNsaWVudCBpc3N1ZWQKKyAgYSBTRVRVUCBjb21tYW5kLiBUaGUgY2xpZW50IHNob3VsZCB1c2UgdGhlIHNhbWUgc2Vzc2lvbiBpZCBmb3IgYWxsIGZ1dHVyZQorICByZXF1ZXN0IHRvIHRoaXMgc2VydmVyLgorCistIHRoZSBzZXJ2ZXIgbXVzdCBzdXBwb3J0IGFuIE9QVElPTlMgcmVxdWVzdCBzZW5kIG92ZXIgdGhlIFJUU1AgY29ubmVjdGlvbi4KKworICAgID4+IE9QVElPTlMgKiBSVFNQLzEuMAorICAgID4+IENTZXE6IDEKKyAgICA+PgorICAgIDw8IFJUU1AvMS4wIDIwMCBPSworICAgIDw8IENTZXE6IDEKKyAgICA8PCBEYXRlOiBXZWQgTWF5IDExIDEzOjIxOjQzIDIwMDUgR01UCisgICAgPDwgU2Vzc2lvbjogNWQ1Y2I5NDQxMzI4OGNjZAorICAgIDw8IFB1YmxpYzogREVTQ1JJQkUsIFNFVFVQLCBURUFSRE9XTiwgUExBWQorICAgIDw8CisKKyAgIFRoZSBPUFRJT05TIHJlcXVlc3Qgc2hvdWxkIGxpc3QgYWxsIHN1cHBvcnRlZCBtZXRob2RzIG9uIHRoZSBzZXJ2ZXIuCisgCisgLSBUaGUgc2VydmVyIHNob3VsZCBzdXBwb3J0IHRoZSBERVNDUklCRSBtZXRob2QuCisKKyAgICA+PiBERVNDUklCRSBydHNwOi8vdGhyZWFkOjU0NTQvc291dGgtcnRzcC5tcDMgUlRTUC8xLjAKKyAgICA+PiBBY2NlcHQ6IGFwcGxpY2F0aW9uL3NkcAorICAgID4+IENTZXE6IDIKKyAgICA+PgorICAgIDw8IFJUU1AvMS4wIDIwMCBPSworICAgIDw8IENvbnRlbnQtTGVuZ3RoOiA4NAorICAgIDw8IENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vc2RwCisgICAgPDwgQ1NlcTogMgorICAgIDw8IERhdGU6IFdlZCBNYXkgMTEgMTM6MDk6MzcgMjAwNSBHTVQKKyAgICA8PAorICAgIDw8IHY9MAorICAgIDw8IG89LSAwIDAgSU4gSVA0IDE5Mi4xNjguMS4xCisgICAgPDwgcz1ObyBUaXRsZQorICAgIDw8IG09YXVkaW8gMCBSVFAvQVZQIDE0CisgICAgPDwgYT1jb250cm9sOnN0cmVhbWlkPTAKKworICAgIFRoZSBjbGllbnQgaXNzdWVzIGEgREVTQ1JJQkUgY29tbWFuZCBmb3IgYSBzcGVjaWZpYyBVUkwgdGhhdCBjb3JyZXNwb25kcworICAgIHRvIGFuIGF2YWlsYWJsZSBzdHJlYW0uIFRoZSBjbGllbnQgd2lsbCBhbHNvIHNlbmQgYW4gQWNjZXB0IGhlYWRlciB0bworICAgIGxpc3QgaXRzIHN1cHBvcnRlZCBmb3JtYXRzLiAKKworICAgIFRoZSBzZXJ2ZXIgYW5zd2VycyB0aGlzIHJlcXVlc3Qgd2l0aCBhIHJlcGx5IGluIG9uZSBvZiB0aGUgY2xpZW50IHN1cHBvcnRlZAorICAgIGZvcm1hdHMgKGFwcGxpY2F0aW9uL3NkcCBpcyB0aGUgbW9zdCBjb21tb24pLiBUaGUgc2VydmVyIHR5cGljYWxseSBzZW5kcyBhCisgICAgZml4ZWQgcmVwbHkgdG8gYWxsIGNsaWVudHMgZm9yIGVhY2ggY29uZmlndXJlZCBzdHJlYW0uCisKKyAtIFRoZSBzZXJ2ZXIgbXVzdCBzdXBwb3J0IHRoZSBTRVRVUCBjb21tYW5kIHRvIGNvbmZpZ3VyZSB0aGUgbWVkaWEgc3RyZWFtcyAKKyAgIHRoYXQgd2VyZSBsaXN0ZWQgaW4gdGhlIERFU0NSSUJFIGNvbW1hbmQuCisKKyAgICA+PiBTRVRVUCBydHNwOi8vdGhyZWFkOjU0NTQvc291dGgtcnRzcC5tcDMvc3RyZWFtaWQ9MCBSVFNQLzEuMAorICAgID4+IENTZXE6IDMKKyAgICA+PiBUcmFuc3BvcnQ6IFJUUC9BVlAvVURQO3VuaWNhc3Q7Y2xpZW50X3BvcnQ9NTAwMC01MDAxLFJUUC9BVlAvVURQO211bHRpY2FzdCxSVFAvQVZQL1RDUAorICAgID4+CisgICAgPDwgUlRTUC8xLjAgMjAwIE9LCisgICAgPDwgVHJhbnNwb3J0OiBSVFAvQVZQL1VEUDt1bmljYXN0O2NsaWVudF9wb3J0PTUwMDAtNTAwMTtzZXJ2ZXJfcG9ydD02MDAwLTYwMDEKKyAgICA8PCBDU2VxOiAzCisgICAgPDwgRGF0ZTogV2VkIE1heSAxMSAxMzoyMTo0MyAyMDA1IEdNVAorICAgIDw8IFNlc3Npb246IDVkNWNiOTQ0MTMyODhjY2QKKworICAgIFRoZSBjbGllbnQgd2lsbCBzZW5kIGEgU0VUVVAgY29tbWFuZCBmb3IgZWFjaCBvZiB0aGUgc3RyZWFtcyBsaXN0ZWQgaW4gdGhlIAorICAgIERFU0NSSUJFIHJlcGx5LiBGb3Igc2RwIHdpbGwgdXNlIGEgVVJMIGFzIGxpc3RlZCBpbiB0aGUgYT1jb250cm9sOiBwcm9wZXJ0eS4KKworICAgIFRoZSBjbGllbnQgd2lsbCBsaXN0IHRoZSBzdXBwb3J0ZWQgdHJhbnNwb3J0cyBpbiB0aGUgVHJhbnNwb3J0OiBoZWFkZXIgZmllbGQuCisgICAgRWFjaCB0cmFuc3BvcnQgaXMgc2VwYXJhdGVkIHdpdGggYSBjb21tYSAoLCkgYW5kIGxpc3RlZCBpbiBvcmRlciBvZiBwcmVmZXJlbmNlLgorICAgIFRoZSBzZXJ2ZXIgaGFzIHRvIHNlbGVjdCB0aGUgZmlyc3Qgc3VwcG9ydGVkIHRyYW5zcG9ydC4KKyAKKyAgICBJbiB0aGUgYWJvdmUgZXhhbXBsZSAzIHRyYW5zcG9ydCBhcmUgbGlzdGVkOgorCisgICAgICAgUlRQL0FWUC9VRFA7dW5pY2FzdDtjbGllbnRfcG9ydD01MDAwLTUwMDEKKworICAgICAgICAgVGhlIGNsaWVudCB3aWxsIGFjY2VwdCBSVFAgb3ZlciBVRFAgb24gdGhlIHBvcnQgcGFpciA1MDAwLTUwMDEuIFBvcnQKKwkgNTAwMCB3aWxsIGFjY2VwdCB0aGUgUlRQIHBhY2tldHMsIDUwMDEgdGhlIFJUU1AgcGFja2V0cyBzZW5kIGJ5IHRoZQorCSBzZXJ2ZXIuCisgICAgICAgCisgICAgICAgUlRQL0FWUC9VRFA7bXVsdGljYXN0CisKKyAgICAgICAgIFRoZSBjbGllbnQgY2FuIGpvaW4gYSBtdWx0aWNhc3QgZ3JvdXAgZm9yIHRoZSBzcGVjaWZpYyBtZWRpYSBzdHJlYW0uCisJIFRoZSBwb3J0IG51bWJlcnMgb2YgdGhlIG11bHRpY2FzdCBncm91cCBpdCB3aWxsIGNvbm5lY3QgdG8gaGF2ZSB0bworCSBiZSBzcGVjaWZpZWQgYnkgdGhlIHNlcnZlciBpbiB0aGUgcmVwbHkuCisgICAgICAgCisgICAgICAgUlRQL0FWUC9UQ1AKKworICAgICAgICAgdGhlIGNsaWVudCBjYW4gYWNjZXB0IFJUUCBwYWNrZXRzIGludGVybGVhdmVkIG9uIHRoZSBSVFNQIGNvbm5lY3Rpb24uCisKKyAgICBUaGUgc2VydmVyIHNlbGVjdHMgYSBzdXBwb3J0ZWQgdHJhbnNwb3J0IGFuIGFsbG9jYXRlcyBhbiBSVFAgcG9ydCBwYWlyIHRvCisgICAgcmVjZWl2ZSBSVFAgYW5kIFJUU1AgZGF0YSBmcm9tIHRoZSBjbGllbnQuIFRoaXMgbGFzdCBzdGVwIGlzIG9wdGlvbmFsIHdoZW4KKyAgICB0aGUgc2VydmVyIGRvZXMgbm90IGFjY2VwdCBSVFAgZGF0YS4KKworICAgIFRoZSBzZXJ2ZXIgc2hvdWxkIGFsbG9jYXRlIGEgc2Vzc2lvbiBmb3IgdGhlIGNsaWVudCBhbmQgc2hvdWxkIHNlbmQgdGhlCisgICAgc2Vzc2lvbklkIHRvIHRoZSBjbGllbnQuIFRoZSBjbGllbnQgc2hvdWxkIHVzZSB0aGlzIHNlc3Npb24gaWQgZm9yIGFsbAorICAgIGZ1dHVyZSByZXF1ZXN0cy4KKworICAgIFRoZSBzZXJ2ZXIgbWF5IHJlZnVzZSBhIGNsaWVudCB0aGF0IGRvZXMgbm90IHVzZSB0aGUgc2FtZSB0cmFuc3BvcnQgbWV0aG9kCisgICAgZm9yIGFsbCBtZWRpYSBzdHJlYW1zLgorCisgICAgVGhlIHNlcnZlciBzdG9yZXMgYWxsIGNsaWVudCBwb3J0IHBhaXJzIGluIHRoZSBzZXJ2ZXIgY2xpZW50IHNlc3Npb24gYWxvbmcKKyAgICB3aXRoIHRoZSB0cmFuc3BvcnQgbWV0aG9kLgorCisgICAgZXg6CisKKyAgICAgIEZvciBhbiBvbi1kZW1hbmQgc3RyZWFtIHRoZSBzZXJ2ZXIgY291bGQgY29uc3RydWN0IGEgKG1pbmltYWwpIFJUUCBHU3RyZWFtZXIgCisgICAgICBwaXBlbGluZSBmb3IgdGhlIGNsaWVudCBhcyBmb2xsb3dzIChmb3IgYW4gbXAzIHN0cmVhbSk6CisgICAgCisgICAgICArLS0tLS0tLS0tKyAgICArLS0tLS0tLS0tLS0rICAgICstLS0tLS0tLS0tLS0rICAgICstLS0tLS0tLS0tLS0tKworICAgICAgfCBmaWxlc3JjIHwgICAgfCBydHBtcDNlbmMgfCAgICB8IHJ0cHNlc3Npb24gfCAgICB8IHVkcHNpbmsgICAgIHwKKyAgICAgIHwgICAgICAgICB8ICAgIHwgICAgICAgICAgIHwgICAgfCAgICAgICAgICAgIHwgICAgfCAgIGhvc3Q9WFhYICB8CisgICAgICB8ICAgICAgICAgfCAgICB8ICAgICAgICAgICB8ICAgIHwgICAgICAgICAgICB8ICAgIHwgICBwb3J0PTUwMDAgfAorICAgICAgfCAgICAgICAgc3JjLS1zaW5rICAgICAgICBzcmMtLXJ0cHNpbmsgICBydHBzcmMtLXNpbmsgICAgICAgICAgIHwKKyAgICAgICstLS0tLS0tLS0rICAgICstLS0tLS0tLS0tLSsgICAgfCAgICAgICAgICAgIHwgICAgKy0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICstLS0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICB8IHVkcHNpbmsgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgfCAgIGhvc3Q9WFhYICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgIHwgICBwb3J0PTUwMDEgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHJ0c3BzcmMtLXNpbmsgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLSsgICAgKy0tLS0tLS0tLS0tLS0rCisKKyAgICAgIFRoZSBzZXJ2ZXIgd291bGQgc2V0IHRoZSBhYm92ZSBwaXBlbGluZSB0byBQQVVTRSB0byBtYWtlIHN1cmUgbm8gZGF0YQorICAgICAgaXMgc2VudCB0byB0aGUgY2xpZW50IHlldC4KKworICAgICAgb3B0aW9uYWxseSB1ZHBzcmMgZWxlbWVudHMgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcmVjZWl2ZSBjbGllbnQgUlRQIGFuZAorICAgICAgUlRTUCBtZXNzYWdlcy4KKworICAgIGV4OgorCisgICAgICBGb3IgYSBsaXZlIHN0cmVhbSB0aGUgc2VydmVyIGNvdWxkIGNvbnN0cnVjdCBhIChtaW5pbWFsKSBSVFAgR1N0cmVhbWVyIAorICAgICAgcGlwZWxpbmUgZm9yIHRoZSBjbGllbnRzIGFzIGZvbGxvd3MgKGZvciBhbiBtcDMgc3RyZWFtKToKKyAgICAKKyAgICAgICstLS0tLS0tLS0rICAgICstLS0tLS0tLSsgICAgKy0tLS0tLS0tLS0tKyAgICArLS0tLS0tLS0tLS0tKyAgICArLS0tLS0tLS0tLS0tLS0rCisgICAgICB8IHNvdXJjZSAgfCAgICB8IG1wM2VuYyB8ICAgIHwgcnRwbXAzZW5jIHwgICAgfCBydHBzZXNzaW9uIHwgICAgfCBtdWx0aXVkcHNpbmsgfAorICAgICAgfCAgICAgICAgIHwgICAgfCAgICAgICAgfCAgICB8ICAgICAgICAgICB8ICAgIHwgICAgICAgICAgICB8ICAgIHwgICBob3N0PS4uLiAgIHwKKyAgICAgIHwgICAgICAgICB8ICAgIHwgICAgICAgIHwgICAgfCAgICAgICAgICAgfCAgICB8ICAgICAgICAgICAgfCAgICB8ICAgcG9ydD0uLi4gICB8CisgICAgICB8ICAgICAgICBzcmMtLXNpbmsgICAgIHNyYy0tc2luayAgICAgICAgc3JjLS1ydHBzaW5rICAgcnRwc3JjLS1zaW5rICAgICAgICAgICAgfAorICAgICAgKy0tLS0tLS0tLSsgICAgKy0tLS0tLS0tKyAgICArLS0tLS0tLS0tLS0rICAgIHwgICAgICAgICAgICB8ICAgICstLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICArLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgfCBtdWx0aXVkcHNpbmsgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgIHwgICBob3N0PS4uLiAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICB8ICAgcG9ydD0uLi4gICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICBydHNwc3JjLS1zaW5rICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0rICAgICstLS0tLS0tLS0tLS0tLSsKKworICAgICAgTWVkaWEgZGF0YSBpcyBzdHJlYW1lZCB0byBjbGllbnRzIGJ5IGFkZGluZyB0aGUgY2xpZW50IGhvc3QgYW5kIHBvcnQgbnVtYmVycworICAgICAgdG8gdGhlIG11bHRpdWRwc2lua3MuCisKKyAgICAgIG9wdGlvbmFsbHkgdWRwc3JjIGVsZW1lbnRzIGNhbiBiZSBjb25maWd1cmVkIHRvIHJlY2VpdmUgY2xpZW50IFJUUCBhbmQKKyAgICAgIFJUU1AgbWVzc2FnZXMuCisgICAgIAorIC0gVGhlIHNlcnZlciBtdXN0IHN1cHBvcnQgdGhlIFBMQVkgY29tbWFuZCB0byBzdGFydCBwbGF5YmFjayBvZiB0aGUgY29uZmlndXJlZAorICAgbWVkaWEgc3RyZWFtcy4KKworICAgID4+IFBMQVkgcnRzcDovL3RocmVhZDo1NDU0L3NvdXRoLXJ0c3AubXAzIFJUU1AvMS4wCisgICAgPj4gQ1NlcTogMgorICAgID4+IFNlc3Npb246IDVkNWNiOTQ0MTMyODhjY2QKKyAgICA+PgorICAgIDw8IFJUU1AvMS4wIDIwMCBPSworICAgIDw8IENTZXE6IDIKKyAgICA8PCBEYXRlOiBXZWQgTWF5IDExIDEzOjIxOjQzIDIwMDUgR01UCisgICAgPDwgU2Vzc2lvbjogNWQ1Y2I5NDQxMzI4OGNjZAorICAgIDw8CisKKyAgICBVc2luZyB0aGUgU2Vzc2lvbjogaGVhZGVyIGZpZWxkLCB0aGUgc2VydmVyIGZpbmRzIHRoZSBwaXBlbGluZSBvZiB0aGUgc2Vzc2lvbgorICAgIHRvIFBMQVkgYW5kIHNldHMgdGhlIHBpcGVsaW5lIHRvIFBMQVlJTkcgYXQgd2hpY2ggcG9pbnQgdGhlIGNsaWVudCByZWNlaXZlcworICAgIHRoZSBtZWRpYSBzdHJlYW0gZGF0YS4KKworICAgIEluIGNhc2Ugb2YgYSBsaXZlIHN0cmVhbSwgdGhlIHNlcnZlciBhZGRzIHRoZSBwb3J0IG51bWJlcnMgdG8gYSBtdWx0aXVkcHNpbmsKKyAgICBlbGVtZW50LgorCisgLSBUaGUgc2VydmVyIG11c3Qgc3VwcG9ydCB0aGUgVEVBUkRPV04gY29tbWFuZCB0byBzdG9wIHBsYXliYWNrIGFuZCBmcmVlIHRoZQorICAgc2Vzc2lvbiBvZiBhIGNsaWVudC4KKworICAgID4+IFRFQVJET1dOIHJ0c3A6Ly90aHJlYWQ6NTQ1NC9zb3V0aC1ydHNwLm1wMyBSVFNQLzEuMAorICAgID4+IENTZXE6IDQKKyAgICA+PiBTZXNzaW9uOiA1ZDVjYjk0NDEzMjg4Y2NkCisgICAgPj4KKyAgICA8PCBSVFNQLzEuMCAyMDAgT0sKKyAgICA8PCBDU2VxOiA0CisgICAgPDwgRGF0ZTogV2VkIE1heSAxMSAxMzoyMTo0MyAyMDA1IEdNVAorICAgIDw8CisKKyAgICBUaGUgc2VydmVyIGRlc3Ryb3lzIHRoZSBjbGllbnQgcGlwZWxpbmUgaW4gY2FzZSBvZiBhbiBvbi1kZW1hbmQgc3RyZWFtIG9yCisgICAgcmVtb3ZlcyB0aGUgY2xpZW50IHBvcnRzIGZyb20gdGhlIG11bHRpdWRwc2lua3MuIFRoaXMgZWZmZWN0aXZlbHkgc3RvcHMKKyAgICBzdHJlYW1pbmcgdG8gdGhlIGNsaWVudC4KKworCmRpZmYgLS1naXQgYS9nc3QvcnRzcC9VUkxTIGIvZ3N0L3J0c3AvVVJMUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmI0MDA4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0c3AvVVJMUwpAQCAtMCwwICsxLDM4IEBACitTb21lIHRlc3QgVVJMUzoKKworU1ZRMyB2aWRlbzogCisgIHJ0c3A6Ly9jdW11bHVzLmNyZWF0aXZlLmF1Y2tsYW5kLmFjLm56L35zaGFkby9uZWxzb25faXZfNTEyay5tb3YKKyAgcnRzcDovL3N0cmVhbXIuaGl0cG9wcy5qcC9uZ2MvbW92L20wNjA5Lm1vdiAKKworQVNGIChhdWRpby92aWRlbyk6IAorICBydHNwOi8vYW9kLm15bGlzdGVuLmNvbS9hb2QvOC8wMy8wNjk4MDNfMDkwMzEzNS53bWEKKyAgcnRzcDovLzE5NS4yNDYuOC42OS9kdXJfcHVsbF9oaQorICBydHNwOi8vMTk1LjIxOS4xNjAuMjAwL21jcD9jaGlkPTI1JnBpZD0xOTYmdmlkPTI0MDIyMDEmYnI9ODAwJnRpZD0xJnZvaWQ9Mjg0NCZtdWs9SDFKNHlGcjBtSkIKKyAgcnRzcDovL2ExMTc0LnYyNjYzMGYuYzI2NjMwLmcudm0uYWthbWFpc3RyZWFtLm5ldC83LzExNzQvMjY2MzAvMzYxL29kLXZpZGVvLm1zbi5jb20vOC9tYnIvcnNfcGVyZl9kaWxhbmFfMDkxMjA2X2ZpbmFsZTkxMzUud212CisKK01QNFYtRVMvbXBlZzQtZ2VuZXJpYyhBQ0MpOgorICBydHNwOi8vdm9kLm53ZWMuanAvcXVpY2t0aW1lLzUwNS5tb3YKKyAgcnRzcDovLzIwMy4xNDAuNjguMjQxOjU1NC9oaXJha2F0YWVpem91OS5tcDQKKyAgcnRzcDovL2ttZGkudXRvcm9udG8uY2E6NTU1L29zY29uZi8yMDA0X21heTkuMS5tcDQKKworWC1RVChoMjY0KS9tcGVnNC1nZW5lcmljKEFDQyk6CisgIHJ0c3A6Ly9hMjA0Ny52MTQxM2IuYzE0MTMuZy52cS5ha2FtYWlzdHJlYW0ubmV0LzUvMjA0Ny8xNDEzLzFfaDI2NF8xMTAvMWExYTFhZTY1NmM2MzI5NzAyNjdlMDRlYmQzMTk2YzQyODk3MGU3Y2U4NTdiODFjNGFhYjE2NzdlNDQ1YWVkYzNmYWUxYjRhN2JhZmUwMTMvODg0ODEyNV8xXzExMC5tb3YKKworTVA0Vi1FUy9NUDRBLUxBVE0KKyAgcnRzcDovLzY4LjI1MS4xNjguMTMvdGhpc2lzbG92ZS4zZ3AKKworSDI2NC9NUEEKKyAgcnRzcDovLzEzMC4xOTIuODYuMTY2L2VkLm1vdgorCitSRUFMOgorICBydHNwOi8vMjEzLjI1NC4yMzkuNjEvZmFybS8qL2VuY29kZXIvdGFnZXNzY2hhdS9saXZlMWhpZ2gucm0KKyAgcnRzcDovLzY0LjE5Mi4xMzcuMTA1OjU1NC9yZWFsLmFtYXpvbi1kZS5ldTIvcGhvbm9uZXQvQi8wLzAvMC9IL1cvWS80L0svUy8wMS4wMS5ybT9jbG9ha3BvcnQ9ODAsNTU0LDcwNzAKKworICBydHNwOi8vMjExLjg5LjIyNS4xL2VuY29kZXIvY25yN19wCisgIHJ0c3A6Ly9zdHJlYW0yLnZpc3VhbC5jei9icm9hZGNhc3QvY3QvQ1QyNC1IaWdoLnJtCisKK0FBQywgaW50ZXJsZWF2ZWQ6CisgIHJ0c3A6Ly9pYTMwMDEzNS51cy5hcmNoaXZlLm9yZzo1NTQvMC9pdGVtcy91bmNvdmVyZWRfaW50ZXJ2aWV3cy91bmNvdmVyZWRfaW50ZXJ2aWV3c18zXzI1NmtiLm1wNAorCitWYXJpb3VzIHNhbXBsZXMgaGVyZToKKyAgaHR0cDovL3d3dy5qZXQtc3RyZWFtLm5sL3NhbXBsZXMvbXA0Lmh0bWwKZGlmZiAtLWdpdCBhL2dzdC9ydHNwL2dzdHJ0cGRlYy5jIGIvZ3N0L3J0c3AvZ3N0cnRwZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NmN2M3OQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHNwL2dzdHJ0cGRlYy5jCkBAIC0wLDAgKzEsODk4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDUsMjAwNj4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisvKiBFbGVtZW50LUNoZWNrbGlzdC1WZXJzaW9uOiA1ICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cGRlYworICoKKyAqIEEgc2ltcGxlIFJUUCBzZXNzaW9uIG1hbmFnZXIgdXNlZCBpbnRlcm5hbGx5IGJ5IHJ0c3BzcmMuCisgKi8KKworLyogI2RlZmluZSBIQVZFX1JUQ1AgKi8KKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKKyNpZmRlZiBIQVZFX1JUQ1AKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0Y3BidWZmZXIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0cnRwZGVjLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwZGVjX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBkZWNfZGVidWcpCisKKy8qIEdzdFJUUERlYyBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIFNJR05BTF9SRVFVRVNUX1BUX01BUCwKKyAgU0lHTkFMX0NMRUFSX1BUX01BUCwKKworICBTSUdOQUxfT05fTkVXX1NTUkMsCisgIFNJR05BTF9PTl9TU1JDX0NPTExJU0lPTiwKKyAgU0lHTkFMX09OX1NTUkNfVkFMSURBVEVELAorICBTSUdOQUxfT05fQllFX1NTUkMsCisgIFNJR05BTF9PTl9CWUVfVElNRU9VVCwKKyAgU0lHTkFMX09OX1RJTUVPVVQsCisgIExBU1RfU0lHTkFMCit9OworCisjZGVmaW5lIERFRkFVTFRfTEFURU5DWV9NUyAgICAgIDIwMAorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MQVRFTkNZCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9kZWNfcmVjdl9ydHBfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInJlY3ZfcnRwX3NpbmtfJXUiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2RlY19yZWN2X3J0Y3Bfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInJlY3ZfcnRjcF9zaW5rXyV1IiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9SRVFVRVNULAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRjcCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfZGVjX3JlY3ZfcnRwX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInJlY3ZfcnRwX3NyY18ldV8ldV8ldSIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9TT01FVElNRVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2RlY19ydGNwX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInJ0Y3Bfc3JjXyV1IiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydGNwIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2RlY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX2RlY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX2RlY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBHc3RDbG9jayAqZ3N0X3J0cF9kZWNfcHJvdmlkZV9jbG9jayAoR3N0RWxlbWVudCAqIGVsZW1lbnQpOworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfZGVjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CitzdGF0aWMgR3N0UGFkICpnc3RfcnRwX2RlY19yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsIGNvbnN0IGdjaGFyICogbmFtZSwgY29uc3QgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9kZWNfcmVsZWFzZV9wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RQYWQgKiBwYWQpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX2RlY19jaGFpbl9ydHAgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX2RlY19jaGFpbl9ydGNwIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworCisKKy8qIE1hbmFnZXMgdGhlIHJlY2VpdmluZyBlbmQgb2YgdGhlIHBhY2tldHMuCisgKgorICogVGhlcmUgaXMgb25lIHN1Y2ggc3RydWN0dXJlIGZvciBlYWNoIFJUUCBzZXNzaW9uIChhdWRpby92aWRlby8uLi4pLgorICogV2UgZ2V0IHRoZSBSVFAvUlRDUCBwYWNrZXRzIGFuZCBzdHVmZiB0aGVtIGludG8gdGhlIHNlc3Npb24gbWFuYWdlci4gCisgKi8KK3N0cnVjdCBfR3N0UlRQRGVjU2Vzc2lvbgoreworICAvKiBzZXNzaW9uIGlkICovCisgIGdpbnQgaWQ7CisgIC8qIHRoZSBwYXJlbnQgYmluICovCisgIEdzdFJUUERlYyAqZGVjOworCisgIGdib29sZWFuIGFjdGl2ZTsKKyAgLyogd2Ugb25seSBzdXBwb3J0IG9uZSBzc3JjIGFuZCBvbmUgcHQgKi8KKyAgZ3VpbnQzMiBzc3JjOworICBndWludDggcHQ7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgLyogdGhlIHBhZHMgb2YgdGhlIHNlc3Npb24gKi8KKyAgR3N0UGFkICpyZWN2X3J0cF9zaW5rOworICBHc3RQYWQgKnJlY3ZfcnRwX3NyYzsKKyAgR3N0UGFkICpyZWN2X3J0Y3Bfc2luazsKKyAgR3N0UGFkICpydGNwX3NyYzsKK307CisKKy8qIGZpbmQgYSBzZXNzaW9uIHdpdGggdGhlIGdpdmVuIGlkICovCitzdGF0aWMgR3N0UlRQRGVjU2Vzc2lvbiAqCitmaW5kX3Nlc3Npb25fYnlfaWQgKEdzdFJUUERlYyAqIHJ0cGRlYywgZ2ludCBpZCkKK3sKKyAgR1NMaXN0ICp3YWxrOworCisgIGZvciAod2FsayA9IHJ0cGRlYy0+c2Vzc2lvbnM7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRQRGVjU2Vzc2lvbiAqc2VzcyA9IChHc3RSVFBEZWNTZXNzaW9uICopIHdhbGstPmRhdGE7CisKKyAgICBpZiAoc2Vzcy0+aWQgPT0gaWQpCisgICAgICByZXR1cm4gc2VzczsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworLyogY3JlYXRlIGEgc2Vzc2lvbiB3aXRoIHRoZSBnaXZlbiBpZCAqLworc3RhdGljIEdzdFJUUERlY1Nlc3Npb24gKgorY3JlYXRlX3Nlc3Npb24gKEdzdFJUUERlYyAqIHJ0cGRlYywgZ2ludCBpZCkKK3sKKyAgR3N0UlRQRGVjU2Vzc2lvbiAqc2VzczsKKworICBzZXNzID0gZ19uZXcwIChHc3RSVFBEZWNTZXNzaW9uLCAxKTsKKyAgc2Vzcy0+aWQgPSBpZDsKKyAgc2Vzcy0+ZGVjID0gcnRwZGVjOworICBydHBkZWMtPnNlc3Npb25zID0gZ19zbGlzdF9wcmVwZW5kIChydHBkZWMtPnNlc3Npb25zLCBzZXNzKTsKKworICByZXR1cm4gc2VzczsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfc2Vzc2lvbiAoR3N0UlRQRGVjU2Vzc2lvbiAqIHNlc3Npb24pCit7CisgIGdfZnJlZSAoc2Vzc2lvbik7Cit9CisKK3N0YXRpYyBndWludCBnc3RfcnRwX2RlY19zaWduYWxzW0xBU1RfU0lHTkFMXSA9IHsgMCB9OworCisjZGVmaW5lIGdzdF9ydHBfZGVjX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJUUERlYywgZ3N0X3J0cF9kZWMsIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9kZWNfY2xhc3NfaW5pdCAoR3N0UlRQRGVjQ2xhc3MgKiBnX2NsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQRGVjQ2xhc3MgKmtsYXNzOworCisgIGtsYXNzID0gKEdzdFJUUERlY0NsYXNzICopIGdfY2xhc3M7CisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwZGVjX2RlYnVnLCAicnRwZGVjIiwgMCwgIlJUUCBkZWNvZGVyIik7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX2RlY19maW5hbGl6ZTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9kZWNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcnRwX2RlY19nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9MQVRFTkNZLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJsYXRlbmN5IiwgIkJ1ZmZlciBsYXRlbmN5IGluIG1zIiwKKyAgICAgICAgICAiQW1vdW50IG9mIG1zIHRvIGJ1ZmZlciIsIDAsIEdfTUFYVUlOVCwgREVGQVVMVF9MQVRFTkNZX01TLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSVFBEZWM6OnJlcXVlc3QtcHQtbWFwOgorICAgKiBAcnRwZGVjOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNlc3Npb246IHRoZSBzZXNzaW9uCisgICAqIEBwdDogdGhlIHB0CisgICAqCisgICAqIFJlcXVlc3QgdGhlIHBheWxvYWQgdHlwZSBhcyAjR3N0Q2FwcyBmb3IgQHB0IGluIEBzZXNzaW9uLgorICAgKi8KKyAgZ3N0X3J0cF9kZWNfc2lnbmFsc1tTSUdOQUxfUkVRVUVTVF9QVF9NQVBdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoInJlcXVlc3QtcHQtbWFwIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJUUERlY0NsYXNzLCByZXF1ZXN0X3B0X21hcCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR1NUX1RZUEVfQ0FQUywgMiwgR19UWVBFX1VJTlQsCisgICAgICBHX1RZUEVfVUlOVCk7CisKKyAgZ3N0X3J0cF9kZWNfc2lnbmFsc1tTSUdOQUxfQ0xFQVJfUFRfTUFQXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJjbGVhci1wdC1tYXAiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UlRQRGVjQ2xhc3MsIGNsZWFyX3B0X21hcCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfVk9JRF9fVk9JRCwgR19UWVBFX05PTkUsIDAsIEdfVFlQRV9OT05FKTsKKworICAvKioKKyAgICogR3N0UlRQRGVjOjpvbi1uZXctc3NyYzoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzZXNzaW9uOiB0aGUgc2Vzc2lvbgorICAgKiBAc3NyYzogdGhlIFNTUkMgCisgICAqCisgICAqIE5vdGlmeSBvZiBhIG5ldyBTU1JDIHRoYXQgZW50ZXJlZCBAc2Vzc2lvbi4KKyAgICovCisgIGdzdF9ydHBfZGVjX3NpZ25hbHNbU0lHTkFMX09OX05FV19TU1JDXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1uZXctc3NyYyIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSVFBEZWNDbGFzcywgb25fbmV3X3NzcmMpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdfVFlQRV9VSU5UKTsKKyAgLyoqCisgICAqIEdzdFJUUERlYzo6b24tc3NyY19jb2xsaXNpb246CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc2Vzc2lvbjogdGhlIHNlc3Npb24KKyAgICogQHNzcmM6IHRoZSBTU1JDIAorICAgKgorICAgKiBOb3RpZnkgd2hlbiB3ZSBoYXZlIGFuIFNTUkMgY29sbGlzaW9uCisgICAqLworICBnc3RfcnRwX2RlY19zaWduYWxzW1NJR05BTF9PTl9TU1JDX0NPTExJU0lPTl0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tc3NyYy1jb2xsaXNpb24iLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UlRQRGVjQ2xhc3MsIG9uX3NzcmNfY29sbGlzaW9uKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMiwgR19UWVBFX1VJTlQsCisgICAgICBHX1RZUEVfVUlOVCk7CisgIC8qKgorICAgKiBHc3RSVFBEZWM6Om9uLXNzcmNfdmFsaWRhdGVkOgorICAgKiBAcnRwYmluOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNlc3Npb246IHRoZSBzZXNzaW9uCisgICAqIEBzc3JjOiB0aGUgU1NSQyAKKyAgICoKKyAgICogTm90aWZ5IG9mIGEgbmV3IFNTUkMgdGhhdCBiZWNhbWUgdmFsaWRhdGVkLgorICAgKi8KKyAgZ3N0X3J0cF9kZWNfc2lnbmFsc1tTSUdOQUxfT05fU1NSQ19WQUxJREFURURdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXNzcmMtdmFsaWRhdGVkIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJUUERlY0NsYXNzLCBvbl9zc3JjX3ZhbGlkYXRlZCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR19UWVBFX05PTkUsIDIsIEdfVFlQRV9VSU5ULAorICAgICAgR19UWVBFX1VJTlQpOworCisgIC8qKgorICAgKiBHc3RSVFBEZWM6Om9uLWJ5ZS1zc3JjOgorICAgKiBAcnRwYmluOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNlc3Npb246IHRoZSBzZXNzaW9uCisgICAqIEBzc3JjOiB0aGUgU1NSQyAKKyAgICoKKyAgICogTm90aWZ5IG9mIGFuIFNTUkMgdGhhdCBiZWNhbWUgaW5hY3RpdmUgYmVjYXVzZSBvZiBhIEJZRSBwYWNrZXQuCisgICAqLworICBnc3RfcnRwX2RlY19zaWduYWxzW1NJR05BTF9PTl9CWUVfU1NSQ10gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tYnllLXNzcmMiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UlRQRGVjQ2xhc3MsIG9uX2J5ZV9zc3JjKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMiwgR19UWVBFX1VJTlQsCisgICAgICBHX1RZUEVfVUlOVCk7CisgIC8qKgorICAgKiBHc3RSVFBEZWM6Om9uLWJ5ZS10aW1lb3V0OgorICAgKiBAcnRwYmluOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNlc3Npb246IHRoZSBzZXNzaW9uCisgICAqIEBzc3JjOiB0aGUgU1NSQyAKKyAgICoKKyAgICogTm90aWZ5IG9mIGFuIFNTUkMgdGhhdCBoYXMgdGltZWQgb3V0IGJlY2F1c2Ugb2YgQllFCisgICAqLworICBnc3RfcnRwX2RlY19zaWduYWxzW1NJR05BTF9PTl9CWUVfVElNRU9VVF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tYnllLXRpbWVvdXQiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UlRQRGVjQ2xhc3MsIG9uX2J5ZV90aW1lb3V0KSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMiwgR19UWVBFX1VJTlQsCisgICAgICBHX1RZUEVfVUlOVCk7CisgIC8qKgorICAgKiBHc3RSVFBEZWM6Om9uLXRpbWVvdXQ6CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc2Vzc2lvbjogdGhlIHNlc3Npb24KKyAgICogQHNzcmM6IHRoZSBTU1JDIAorICAgKgorICAgKiBOb3RpZnkgb2YgYW4gU1NSQyB0aGF0IGhhcyB0aW1lZCBvdXQKKyAgICovCisgIGdzdF9ydHBfZGVjX3NpZ25hbHNbU0lHTkFMX09OX1RJTUVPVVRdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXRpbWVvdXQiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UlRQRGVjQ2xhc3MsIG9uX3RpbWVvdXQpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdfVFlQRV9VSU5UKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5wcm92aWRlX2Nsb2NrID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2RlY19wcm92aWRlX2Nsb2NrKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfZGVjX2NoYW5nZV9zdGF0ZSk7CisgIGdzdGVsZW1lbnRfY2xhc3MtPnJlcXVlc3RfbmV3X3BhZCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kZWNfcmVxdWVzdF9uZXdfcGFkKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cmVsZWFzZV9wYWQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kZWNfcmVsZWFzZV9wYWQpOworCisgIC8qIHNpbmsgcGFkcyAqLworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2RlY19yZWN2X3J0cF9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9kZWNfcmVjdl9ydGNwX3NpbmtfdGVtcGxhdGUpOworICAvKiBzcmMgcGFkcyAqLworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2RlY19yZWN2X3J0cF9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2RlY19ydGNwX3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlJUUCBEZWNvZGVyIiwKKyAgICAgICJDb2RlYy9QYXJzZXIvTmV0d29yayIsCisgICAgICAiQWNjZXB0cyByYXcgUlRQIGFuZCBSVENQIHBhY2tldHMgYW5kIHNlbmRzIHRoZW0gZm9yd2FyZCIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZGVjX2luaXQgKEdzdFJUUERlYyAqIHJ0cGRlYykKK3sKKyAgcnRwZGVjLT5wcm92aWRlZF9jbG9jayA9IGdzdF9zeXN0ZW1fY2xvY2tfb2J0YWluICgpOworICBydHBkZWMtPmxhdGVuY3kgPSBERUZBVUxUX0xBVEVOQ1lfTVM7CisKKyAgR1NUX09CSkVDVF9GTEFHX1NFVCAocnRwZGVjLCBHU1RfRUxFTUVOVF9GTEFHX1BST1ZJREVfQ0xPQ0spOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9kZWNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJUUERlYyAqcnRwZGVjOworCisgIHJ0cGRlYyA9IEdTVF9SVFBfREVDIChvYmplY3QpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cGRlYy0+cHJvdmlkZWRfY2xvY2spOworICBnX3NsaXN0X2ZvcmVhY2ggKHJ0cGRlYy0+c2Vzc2lvbnMsIChHRnVuYykgZnJlZV9zZXNzaW9uLCBOVUxMKTsKKyAgZ19zbGlzdF9mcmVlIChydHBkZWMtPnNlc3Npb25zKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9kZWNfcXVlcnlfc3JjIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0xBVEVOQ1k6CisgICAgeworICAgICAgLyogd2UgcHJldGVuZCB0byBiZSBsaXZlIHdpdGggYSAzIHNlY29uZCBsYXRlbmN5ICovCisgICAgICAvKiBGSVhNRTogRG8gd2UgcmVhbGx5IGhhdmUgaW5maW5pdGUgbWF4aW11bSBsYXRlbmN5PyAqLworICAgICAgZ3N0X3F1ZXJ5X3NldF9sYXRlbmN5IChxdWVyeSwgVFJVRSwgMyAqIEdTVF9TRUNPTkQsIC0xKTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2RlY19jaGFpbl9ydHAgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzOworICBHc3RSVFBEZWMgKnJ0cGRlYzsKKyAgR3N0UlRQRGVjU2Vzc2lvbiAqc2Vzc2lvbjsKKyAgZ3VpbnQzMiBzc3JjOworICBndWludDggcHQ7CisgIEdzdFJUUEJ1ZmZlciBydHAgPSB7IE5VTEwsIH07CisKKyAgcnRwZGVjID0gR1NUX1JUUF9ERUMgKHBhcmVudCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwZGVjLCAiZ290IHJ0cCBwYWNrZXQiKTsKKworICBpZiAoIWdzdF9ydHBfYnVmZmVyX21hcCAoYnVmZmVyLCBHU1RfTUFQX1JFQUQsICZydHApKQorICAgIGdvdG8gYmFkX3BhY2tldDsKKworICBzc3JjID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3NzcmMgKCZydHApOworICBwdCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3R5cGUgKCZydHApOworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwZGVjLCAiU1NSQyAlMDh4LCBQVCAlZCIsIHNzcmMsIHB0KTsKKworICAvKiBmaW5kIHNlc3Npb24gKi8KKyAgc2Vzc2lvbiA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKworICAvKiBzZWUgaWYgd2UgaGF2ZSB0aGUgcGFkICovCisgIGlmICghc2Vzc2lvbi0+YWN0aXZlKSB7CisgICAgR3N0UGFkVGVtcGxhdGUgKnRlbXBsOworICAgIEdzdEVsZW1lbnRDbGFzcyAqa2xhc3M7CisgICAgZ2NoYXIgKm5hbWU7CisgICAgR3N0Q2FwcyAqY2FwczsKKyAgICBHVmFsdWUgcmV0ID0geyAwIH07CisgICAgR1ZhbHVlIGFyZ3NbM10gPSB7IHswfQorICAgICwgezB9CisgICAgLCB7MH0KKyAgICB9OworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwZGVjLCAiY3JlYXRpbmcgc3RyZWFtIik7CisKKyAgICBzZXNzaW9uLT5zc3JjID0gc3NyYzsKKyAgICBzZXNzaW9uLT5wdCA9IHB0OworCisgICAgLyogZ2V0IHB0IG1hcCAqLworICAgIGdfdmFsdWVfaW5pdCAoJmFyZ3NbMF0sIEdTVF9UWVBFX0VMRU1FTlQpOworICAgIGdfdmFsdWVfc2V0X29iamVjdCAoJmFyZ3NbMF0sIHJ0cGRlYyk7CisgICAgZ192YWx1ZV9pbml0ICgmYXJnc1sxXSwgR19UWVBFX1VJTlQpOworICAgIGdfdmFsdWVfc2V0X3VpbnQgKCZhcmdzWzFdLCBzZXNzaW9uLT5pZCk7CisgICAgZ192YWx1ZV9pbml0ICgmYXJnc1syXSwgR19UWVBFX1VJTlQpOworICAgIGdfdmFsdWVfc2V0X3VpbnQgKCZhcmdzWzJdLCBwdCk7CisKKyAgICBnX3ZhbHVlX2luaXQgKCZyZXQsIEdTVF9UWVBFX0NBUFMpOworICAgIGdfdmFsdWVfc2V0X2JveGVkICgmcmV0LCBOVUxMKTsKKworICAgIGdfc2lnbmFsX2VtaXR2IChhcmdzLCBnc3RfcnRwX2RlY19zaWduYWxzW1NJR05BTF9SRVFVRVNUX1BUX01BUF0sIDAsICZyZXQpOworCisgICAgY2FwcyA9IChHc3RDYXBzICopIGdfdmFsdWVfZ2V0X2JveGVkICgmcmV0KTsKKworICAgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJyZWN2X3J0cF9zcmNfJXVfJXVfJXUiLCBzZXNzaW9uLT5pZCwgc3NyYywgcHQpOworICAgIGtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChydHBkZWMpOworICAgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJyZWN2X3J0cF9zcmNfJXVfJXVfJXUiKTsKKyAgICBzZXNzaW9uLT5yZWN2X3J0cF9zcmMgPSBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlICh0ZW1wbCwgbmFtZSk7CisgICAgZ19mcmVlIChuYW1lKTsKKworICAgIGdzdF9wYWRfc2V0X2NhcHMgKHNlc3Npb24tPnJlY3ZfcnRwX3NyYywgY2Fwcyk7CisKKyAgICBnc3RfcGFkX3NldF9lbGVtZW50X3ByaXZhdGUgKHNlc3Npb24tPnJlY3ZfcnRwX3NyYywgc2Vzc2lvbik7CisgICAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKHNlc3Npb24tPnJlY3ZfcnRwX3NyYywgZ3N0X3J0cF9kZWNfcXVlcnlfc3JjKTsKKyAgICBnc3RfcGFkX3NldF9hY3RpdmUgKHNlc3Npb24tPnJlY3ZfcnRwX3NyYywgVFJVRSk7CisgICAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwZGVjKSwgc2Vzc2lvbi0+cmVjdl9ydHBfc3JjKTsKKworICAgIHNlc3Npb24tPmFjdGl2ZSA9IFRSVUU7CisgIH0KKworICByZXMgPSBnc3RfcGFkX3B1c2ggKHNlc3Npb24tPnJlY3ZfcnRwX3NyYywgYnVmZmVyKTsKKworICByZXR1cm4gcmVzOworCitiYWRfcGFja2V0OgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwZGVjLCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLAorICAgICAgICAoIlJUUCBwYWNrZXQgZGlkIG5vdCB2YWxpZGF0ZSwgZHJvcHBpbmciKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfZGVjX2NoYWluX3J0Y3AgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJUUERlYyAqc3JjOworCisjaWZkZWYgSEFWRV9SVENQCisgIGdib29sZWFuIHZhbGlkOworICBHc3RSVENQUGFja2V0IHBhY2tldDsKKyAgZ2Jvb2xlYW4gbW9yZTsKKyNlbmRpZgorCisgIHNyYyA9IEdTVF9SVFBfREVDIChwYXJlbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImdvdCBydGNwIHBhY2tldCIpOworCisjaWZkZWYgSEFWRV9SVENQCisgIHZhbGlkID0gZ3N0X3J0Y3BfYnVmZmVyX3ZhbGlkYXRlIChidWZmZXIpOworICBpZiAoIXZhbGlkKQorICAgIGdvdG8gYmFkX3BhY2tldDsKKworICAvKiBwb3NpdGlvbiBvbiBmaXJzdCBwYWNrZXQgKi8KKyAgbW9yZSA9IGdzdF9ydGNwX2J1ZmZlcl9nZXRfZmlyc3RfcGFja2V0IChidWZmZXIsICZwYWNrZXQpOworICB3aGlsZSAobW9yZSkgeworICAgIHN3aXRjaCAoZ3N0X3J0Y3BfcGFja2V0X2dldF90eXBlICgmcGFja2V0KSkgeworICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX1NSOgorICAgICAgeworICAgICAgICBndWludDMyIHNzcmMsIHJ0cHRpbWUsIHBhY2tldF9jb3VudCwgb2N0ZXRfY291bnQ7CisgICAgICAgIGd1aW50NjQgbnRwdGltZTsKKyAgICAgICAgZ3VpbnQgY291bnQsIGk7CisKKyAgICAgICAgZ3N0X3J0Y3BfcGFja2V0X3NyX2dldF9zZW5kZXJfaW5mbyAoJnBhY2tldCwgJnNzcmMsICZudHB0aW1lLCAmcnRwdGltZSwKKyAgICAgICAgICAgICZwYWNrZXRfY291bnQsICZvY3RldF9jb3VudCk7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLAorICAgICAgICAgICAgImdvdCBTUiBwYWNrZXQ6IFNTUkMgJTA4eCwgTlRQICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICAgICAgICIsIFJUUCAldSwgUEMgJXUsIE9DICV1Iiwgc3NyYywgbnRwdGltZSwgcnRwdGltZSwgcGFja2V0X2NvdW50LAorICAgICAgICAgICAgb2N0ZXRfY291bnQpOworCisgICAgICAgIGNvdW50ID0gZ3N0X3J0Y3BfcGFja2V0X2dldF9yYl9jb3VudCAoJnBhY2tldCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgZ3VpbnQzMiBzc3JjLCBleHRoaWdoZXN0c2VxLCBqaXR0ZXIsIGxzciwgZGxzcjsKKyAgICAgICAgICBndWludDggZnJhY3Rpb25sb3N0OworICAgICAgICAgIGdpbnQzMiBwYWNrZXRzbG9zdDsKKworICAgICAgICAgIGdzdF9ydGNwX3BhY2tldF9nZXRfcmIgKCZwYWNrZXQsIGksICZzc3JjLCAmZnJhY3Rpb25sb3N0LAorICAgICAgICAgICAgICAmcGFja2V0c2xvc3QsICZleHRoaWdoZXN0c2VxLCAmaml0dGVyLCAmbHNyLCAmZGxzcik7CisKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJnb3QgUkIgcGFja2V0ICVkOiBTU1JDICUwOHgsIEZMICV1IgorICAgICAgICAgICAgICAiLCBQTCAldSwgSFMgJXUsIEpJVFRFUiAldSwgTFNSICV1LCBETFNSICV1Iiwgc3NyYywgZnJhY3Rpb25sb3N0LAorICAgICAgICAgICAgICBwYWNrZXRzbG9zdCwgZXh0aGlnaGVzdHNlcSwgaml0dGVyLCBsc3IsIGRsc3IpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX1JSOgorICAgICAgeworICAgICAgICBndWludDMyIHNzcmM7CisgICAgICAgIGd1aW50IGNvdW50LCBpOworCisgICAgICAgIHNzcmMgPSBnc3RfcnRjcF9wYWNrZXRfcnJfZ2V0X3NzcmMgKCZwYWNrZXQpOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImdvdCBSUiBwYWNrZXQ6IFNTUkMgJTA4eCIsIHNzcmMpOworCisgICAgICAgIGNvdW50ID0gZ3N0X3J0Y3BfcGFja2V0X2dldF9yYl9jb3VudCAoJnBhY2tldCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgZ3VpbnQzMiBzc3JjLCBleHRoaWdoZXN0c2VxLCBqaXR0ZXIsIGxzciwgZGxzcjsKKyAgICAgICAgICBndWludDggZnJhY3Rpb25sb3N0OworICAgICAgICAgIGdpbnQzMiBwYWNrZXRzbG9zdDsKKworICAgICAgICAgIGdzdF9ydGNwX3BhY2tldF9nZXRfcmIgKCZwYWNrZXQsIGksICZzc3JjLCAmZnJhY3Rpb25sb3N0LAorICAgICAgICAgICAgICAmcGFja2V0c2xvc3QsICZleHRoaWdoZXN0c2VxLCAmaml0dGVyLCAmbHNyLCAmZGxzcik7CisKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJnb3QgUkIgcGFja2V0ICVkOiBTU1JDICUwOHgsIEZMICV1IgorICAgICAgICAgICAgICAiLCBQTCAldSwgSFMgJXUsIEpJVFRFUiAldSwgTFNSICV1LCBETFNSICV1Iiwgc3NyYywgZnJhY3Rpb25sb3N0LAorICAgICAgICAgICAgICBwYWNrZXRzbG9zdCwgZXh0aGlnaGVzdHNlcSwgaml0dGVyLCBsc3IsIGRsc3IpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX1NERVM6CisgICAgICB7CisgICAgICAgIGd1aW50IGNodW5rcywgaSwgajsKKyAgICAgICAgZ2Jvb2xlYW4gbW9yZV9jaHVua3MsIG1vcmVfaXRlbXM7CisKKyAgICAgICAgY2h1bmtzID0gZ3N0X3J0Y3BfcGFja2V0X3NkZXNfZ2V0X2NodW5rX2NvdW50ICgmcGFja2V0KTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZ290IFNERVMgcGFja2V0IHdpdGggJWQgY2h1bmtzIiwgY2h1bmtzKTsKKworICAgICAgICBtb3JlX2NodW5rcyA9IGdzdF9ydGNwX3BhY2tldF9zZGVzX2ZpcnN0X2NodW5rICgmcGFja2V0KTsKKyAgICAgICAgaSA9IDA7CisgICAgICAgIHdoaWxlIChtb3JlX2NodW5rcykgeworICAgICAgICAgIGd1aW50MzIgc3NyYzsKKworICAgICAgICAgIHNzcmMgPSBnc3RfcnRjcF9wYWNrZXRfc2Rlc19nZXRfc3NyYyAoJnBhY2tldCk7CisKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjaHVuayAlZCwgU1NSQyAlMDh4IiwgaSwgc3NyYyk7CisKKyAgICAgICAgICBtb3JlX2l0ZW1zID0gZ3N0X3J0Y3BfcGFja2V0X3NkZXNfZmlyc3RfaXRlbSAoJnBhY2tldCk7CisgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgd2hpbGUgKG1vcmVfaXRlbXMpIHsKKyAgICAgICAgICAgIEdzdFJUQ1BTREVTVHlwZSB0eXBlOworICAgICAgICAgICAgZ3VpbnQ4IGxlbjsKKyAgICAgICAgICAgIGdjaGFyICpkYXRhOworCisgICAgICAgICAgICBnc3RfcnRjcF9wYWNrZXRfc2Rlc19nZXRfaXRlbSAoJnBhY2tldCwgJnR5cGUsICZsZW4sICZkYXRhKTsKKworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiaXRlbSAlZCwgdHlwZSAlZCwgbGVuICVkLCBkYXRhICVzIiwgaiwKKyAgICAgICAgICAgICAgICB0eXBlLCBsZW4sIGRhdGEpOworCisgICAgICAgICAgICBtb3JlX2l0ZW1zID0gZ3N0X3J0Y3BfcGFja2V0X3NkZXNfbmV4dF9pdGVtICgmcGFja2V0KTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICB9CisgICAgICAgICAgbW9yZV9jaHVua3MgPSBnc3RfcnRjcF9wYWNrZXRfc2Rlc19uZXh0X2NodW5rICgmcGFja2V0KTsKKyAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEdTVF9SVENQX1RZUEVfQllFOgorICAgICAgeworICAgICAgICBndWludCBjb3VudCwgaTsKKyAgICAgICAgZ2NoYXIgKnJlYXNvbjsKKworICAgICAgICByZWFzb24gPSBnc3RfcnRjcF9wYWNrZXRfYnllX2dldF9yZWFzb24gKCZwYWNrZXQpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJnb3QgQllFIHBhY2tldCAocmVhc29uOiAlcykiLAorICAgICAgICAgICAgR1NUX1NUUl9OVUxMIChyZWFzb24pKTsKKyAgICAgICAgZ19mcmVlIChyZWFzb24pOworCisgICAgICAgIGNvdW50ID0gZ3N0X3J0Y3BfcGFja2V0X2J5ZV9nZXRfc3NyY19jb3VudCAoJnBhY2tldCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgZ3VpbnQzMiBzc3JjOworCisKKyAgICAgICAgICBzc3JjID0gZ3N0X3J0Y3BfcGFja2V0X2J5ZV9nZXRfbnRoX3NzcmMgKCZwYWNrZXQsIGkpOworCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiU1NSQzogJTA4eCIsIHNzcmMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX0FQUDoKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZ290IEFQUCBwYWNrZXQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgImdvdCB1bmtub3duIFJUQ1AgcGFja2V0Iik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBtb3JlID0gZ3N0X3J0Y3BfcGFja2V0X21vdmVfdG9fbmV4dCAoJnBhY2tldCk7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCitiYWRfcGFja2V0OgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJnb3QgaW52YWxpZCBSVENQIHBhY2tldCIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CisjZWxzZQorICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZGVjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSVFBEZWMgKnNyYzsKKworICBzcmMgPSBHU1RfUlRQX0RFQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTEFURU5DWToKKyAgICAgIHNyYy0+bGF0ZW5jeSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZGVjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSVFBEZWMgKnNyYzsKKworICBzcmMgPSBHU1RfUlRQX0RFQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTEFURU5DWToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzcmMtPmxhdGVuY3kpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgR3N0Q2xvY2sgKgorZ3N0X3J0cF9kZWNfcHJvdmlkZV9jbG9jayAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdFJUUERlYyAqcnRwZGVjOworCisgIHJ0cGRlYyA9IEdTVF9SVFBfREVDIChlbGVtZW50KTsKKworICByZXR1cm4gR1NUX0NMT0NLX0NBU1QgKGdzdF9vYmplY3RfcmVmIChydHBkZWMtPnByb3ZpZGVkX2Nsb2NrKSk7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9kZWNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgLyogd2UncmUgTk9fUFJFUk9MTCB3aGVuIGdvaW5nIHRvIFBBVVNFRCAqLworICAgICAgcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9OT19QUkVST0xMOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogQ3JlYXRlIGEgcGFkIGZvciByZWNlaXZpbmcgUlRQIGZvciB0aGUgc2Vzc2lvbiBpbiBAbmFtZQorICovCitzdGF0aWMgR3N0UGFkICoKK2NyZWF0ZV9yZWN2X3J0cCAoR3N0UlRQRGVjICogcnRwZGVjLCBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLCBjb25zdCBnY2hhciAqIG5hbWUpCit7CisgIGd1aW50IHNlc3NpZDsKKyAgR3N0UlRQRGVjU2Vzc2lvbiAqc2Vzc2lvbjsKKworICAvKiBmaXJzdCBnZXQgdGhlIHNlc3Npb24gbnVtYmVyICovCisgIGlmIChuYW1lID09IE5VTEwgfHwgc3NjYW5mIChuYW1lLCAicmVjdl9ydHBfc2lua18ldSIsICZzZXNzaWQpICE9IDEpCisgICAgZ290byBub19uYW1lOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGRlYywgImZpbmRpbmcgc2Vzc2lvbiAlZCIsIHNlc3NpZCk7CisKKyAgLyogZ2V0IG9yIGNyZWF0ZSBzZXNzaW9uICovCisgIHNlc3Npb24gPSBmaW5kX3Nlc3Npb25fYnlfaWQgKHJ0cGRlYywgc2Vzc2lkKTsKKyAgaWYgKCFzZXNzaW9uKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwZGVjLCAiY3JlYXRpbmcgc2Vzc2lvbiAlZCIsIHNlc3NpZCk7CisgICAgLyogY3JlYXRlIHNlc3Npb24gbm93ICovCisgICAgc2Vzc2lvbiA9IGNyZWF0ZV9zZXNzaW9uIChydHBkZWMsIHNlc3NpZCk7CisgICAgaWYgKHNlc3Npb24gPT0gTlVMTCkKKyAgICAgIGdvdG8gY3JlYXRlX2Vycm9yOworICB9CisgIC8qIGNoZWNrIGlmIHBhZCB3YXMgcmVxdWVzdGVkICovCisgIGlmIChzZXNzaW9uLT5yZWN2X3J0cF9zaW5rICE9IE5VTEwpCisgICAgZ290byBleGlzdGVkOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGRlYywgImdldHRpbmcgUlRQIHNpbmsgcGFkIik7CisKKyAgc2Vzc2lvbi0+cmVjdl9ydHBfc2luayA9IGdzdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKHRlbXBsLCBuYW1lKTsKKyAgZ3N0X3BhZF9zZXRfZWxlbWVudF9wcml2YXRlIChzZXNzaW9uLT5yZWN2X3J0cF9zaW5rLCBzZXNzaW9uKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHNlc3Npb24tPnJlY3ZfcnRwX3NpbmssIGdzdF9ydHBfZGVjX2NoYWluX3J0cCk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc2Vzc2lvbi0+cmVjdl9ydHBfc2luaywgVFJVRSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cGRlYyksIHNlc3Npb24tPnJlY3ZfcnRwX3NpbmspOworCisgIHJldHVybiBzZXNzaW9uLT5yZWN2X3J0cF9zaW5rOworCisgIC8qIEVSUk9SUyAqLworbm9fbmFtZToKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGRlYzogaW52YWxpZCBuYW1lIGdpdmVuIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2NyZWF0ZV9lcnJvcjoKKyAgeworICAgIC8qIGNyZWF0ZV9zZXNzaW9uIGFscmVhZHkgd2FybmVkICovCisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2V4aXN0ZWQ6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBkZWM6IHJlY3ZfcnRwIHBhZCBhbHJlYWR5IHJlcXVlc3RlZCBmb3Igc2Vzc2lvbiAlZCIsIHNlc3NpZCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworLyogQ3JlYXRlIGEgcGFkIGZvciByZWNlaXZpbmcgUlRDUCBmb3IgdGhlIHNlc3Npb24gaW4gQG5hbWUKKyAqLworc3RhdGljIEdzdFBhZCAqCitjcmVhdGVfcmVjdl9ydGNwIChHc3RSVFBEZWMgKiBydHBkZWMsIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsCisgICAgY29uc3QgZ2NoYXIgKiBuYW1lKQoreworICBndWludCBzZXNzaWQ7CisgIEdzdFJUUERlY1Nlc3Npb24gKnNlc3Npb247CisKKyAgLyogZmlyc3QgZ2V0IHRoZSBzZXNzaW9uIG51bWJlciAqLworICBpZiAobmFtZSA9PSBOVUxMIHx8IHNzY2FuZiAobmFtZSwgInJlY3ZfcnRjcF9zaW5rXyV1IiwgJnNlc3NpZCkgIT0gMSkKKyAgICBnb3RvIG5vX25hbWU7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwZGVjLCAiZmluZGluZyBzZXNzaW9uICVkIiwgc2Vzc2lkKTsKKworICAvKiBnZXQgdGhlIHNlc3Npb24sIGl0IG11c3QgZXhpc3Qgb3Igd2UgZXJyb3IgKi8KKyAgc2Vzc2lvbiA9IGZpbmRfc2Vzc2lvbl9ieV9pZCAocnRwZGVjLCBzZXNzaWQpOworICBpZiAoIXNlc3Npb24pCisgICAgZ290byBub19zZXNzaW9uOworCisgIC8qIGNoZWNrIGlmIHBhZCB3YXMgcmVxdWVzdGVkICovCisgIGlmIChzZXNzaW9uLT5yZWN2X3J0Y3Bfc2luayAhPSBOVUxMKQorICAgIGdvdG8gZXhpc3RlZDsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBkZWMsICJnZXR0aW5nIFJUQ1Agc2luayBwYWQiKTsKKworICBzZXNzaW9uLT5yZWN2X3J0Y3Bfc2luayA9IGdzdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKHRlbXBsLCBuYW1lKTsKKyAgZ3N0X3BhZF9zZXRfZWxlbWVudF9wcml2YXRlIChzZXNzaW9uLT5yZWN2X3J0cF9zaW5rLCBzZXNzaW9uKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rLCBnc3RfcnRwX2RlY19jaGFpbl9ydGNwKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzZXNzaW9uLT5yZWN2X3J0Y3Bfc2luaywgVFJVRSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cGRlYyksIHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rKTsKKworICByZXR1cm4gc2Vzc2lvbi0+cmVjdl9ydGNwX3Npbms7CisKKyAgLyogRVJST1JTICovCitub19uYW1lOgorICB7CisgICAgZ193YXJuaW5nICgicnRwZGVjOiBpbnZhbGlkIG5hbWUgZ2l2ZW4iKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorbm9fc2Vzc2lvbjoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGRlYzogbm8gc2Vzc2lvbiB3aXRoIGlkICVkIiwgc2Vzc2lkKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorZXhpc3RlZDoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGRlYzogcmVjdl9ydGNwIHBhZCBhbHJlYWR5IHJlcXVlc3RlZCBmb3Igc2Vzc2lvbiAlZCIsCisgICAgICAgIHNlc3NpZCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworLyogQ3JlYXRlIGEgcGFkIGZvciBzZW5kaW5nIFJUQ1AgZm9yIHRoZSBzZXNzaW9uIGluIEBuYW1lCisgKi8KK3N0YXRpYyBHc3RQYWQgKgorY3JlYXRlX3J0Y3AgKEdzdFJUUERlYyAqIHJ0cGRlYywgR3N0UGFkVGVtcGxhdGUgKiB0ZW1wbCwgY29uc3QgZ2NoYXIgKiBuYW1lKQoreworICBndWludCBzZXNzaWQ7CisgIEdzdFJUUERlY1Nlc3Npb24gKnNlc3Npb247CisKKyAgLyogZmlyc3QgZ2V0IHRoZSBzZXNzaW9uIG51bWJlciAqLworICBpZiAobmFtZSA9PSBOVUxMIHx8IHNzY2FuZiAobmFtZSwgInJ0Y3Bfc3JjXyV1IiwgJnNlc3NpZCkgIT0gMSkKKyAgICBnb3RvIG5vX25hbWU7CisKKyAgLyogZ2V0IG9yIGNyZWF0ZSBzZXNzaW9uICovCisgIHNlc3Npb24gPSBmaW5kX3Nlc3Npb25fYnlfaWQgKHJ0cGRlYywgc2Vzc2lkKTsKKyAgaWYgKCFzZXNzaW9uKQorICAgIGdvdG8gbm9fc2Vzc2lvbjsKKworICAvKiBjaGVjayBpZiBwYWQgd2FzIHJlcXVlc3RlZCAqLworICBpZiAoc2Vzc2lvbi0+cnRjcF9zcmMgIT0gTlVMTCkKKyAgICBnb3RvIGV4aXN0ZWQ7CisKKyAgc2Vzc2lvbi0+cnRjcF9zcmMgPSBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlICh0ZW1wbCwgbmFtZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc2Vzc2lvbi0+cnRjcF9zcmMsIFRSVUUpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBkZWMpLCBzZXNzaW9uLT5ydGNwX3NyYyk7CisKKyAgcmV0dXJuIHNlc3Npb24tPnJ0Y3Bfc3JjOworCisgIC8qIEVSUk9SUyAqLworbm9fbmFtZToKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGRlYzogaW52YWxpZCBuYW1lIGdpdmVuIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK25vX3Nlc3Npb246CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBkZWM6IHNlc3Npb24gd2l0aCBpZCAlZCBkb2VzIG5vdCBleGlzdCIsIHNlc3NpZCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2V4aXN0ZWQ6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBkZWM6IHJ0Y3Bfc3JjIHBhZCBhbHJlYWR5IHJlcXVlc3RlZCBmb3Igc2Vzc2lvbiAlZCIsIHNlc3NpZCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworLyogCisgKi8KK3N0YXRpYyBHc3RQYWQgKgorZ3N0X3J0cF9kZWNfcmVxdWVzdF9uZXdfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLCBjb25zdCBnY2hhciAqIG5hbWUsIGNvbnN0IEdzdENhcHMgKiBjYXBzKQoreworICBHc3RSVFBEZWMgKnJ0cGRlYzsKKyAgR3N0RWxlbWVudENsYXNzICprbGFzczsKKyAgR3N0UGFkICpyZXN1bHQ7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHRlbXBsICE9IE5VTEwsIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX1JUUF9ERUMgKGVsZW1lbnQpLCBOVUxMKTsKKworICBydHBkZWMgPSBHU1RfUlRQX0RFQyAoZWxlbWVudCk7CisgIGtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChlbGVtZW50KTsKKworICAvKiBmaWd1cmUgb3V0IHRoZSB0ZW1wbGF0ZSAqLworICBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJyZWN2X3J0cF9zaW5rXyV1IikpIHsKKyAgICByZXN1bHQgPSBjcmVhdGVfcmVjdl9ydHAgKHJ0cGRlYywgdGVtcGwsIG5hbWUpOworICB9IGVsc2UgaWYgKHRlbXBsID09IGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLAorICAgICAgICAgICJyZWN2X3J0Y3Bfc2lua18ldSIpKSB7CisgICAgcmVzdWx0ID0gY3JlYXRlX3JlY3ZfcnRjcCAocnRwZGVjLCB0ZW1wbCwgbmFtZSk7CisgIH0gZWxzZSBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJydGNwX3NyY18ldSIpKSB7CisgICAgcmVzdWx0ID0gY3JlYXRlX3J0Y3AgKHJ0cGRlYywgdGVtcGwsIG5hbWUpOworICB9IGVsc2UKKyAgICBnb3RvIHdyb25nX3RlbXBsYXRlOworCisgIHJldHVybiByZXN1bHQ7CisKKyAgLyogRVJST1JTICovCit3cm9uZ190ZW1wbGF0ZToKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGRlYzogdGhpcyBpcyBub3Qgb3VyIHRlbXBsYXRlIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZGVjX3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKQoreworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0c3AvZ3N0cnRwZGVjLmggYi9nc3QvcnRzcC9nc3RydHBkZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTgzZTIzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0c3AvZ3N0cnRwZGVjLmgKQEAgLTAsMCArMSw4OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1LDIwMDY+IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qCisgKiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgU291cmNlIENvZGUgaXMgbGljZW5zZWQgdW5kZXIgTUlUIGxpY2Vuc2UuCisgKiBTZWUgZnVydGhlciBleHBsYW5hdGlvbiBhdHRhY2hlZCBpbiBMaWNlbnNlIFN0YXRlbWVudCAoZGlzdHJpYnV0ZWQgaW4gdGhlIGZpbGUKKyAqIExJQ0VOU0UpLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9ERUNfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9ERUNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfREVDICAJCShnc3RfcnRwX2RlY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfSVNfUlRQX0RFQyhvYmopICAJCShHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfREVDKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9ERUNfQ0xBU1Moa2xhc3MpIAkoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfREVDKSkKKyNkZWZpbmUgR1NUX1JUUF9ERUMob2JqKSAgCQkoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0RFQywgR3N0UlRQRGVjKSkKKyNkZWZpbmUgR1NUX1JUUF9ERUNfQ0xBU1Moa2xhc3MpICAJKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0RFQywgR3N0UlRQRGVjQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQRGVjIEdzdFJUUERlYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBEZWNDbGFzcyBHc3RSVFBEZWNDbGFzczsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBEZWNTZXNzaW9uIEdzdFJUUERlY1Nlc3Npb247CisKK3N0cnVjdCBfR3N0UlRQRGVjIHsKKyAgR3N0RWxlbWVudCAgZWxlbWVudDsKKworICBndWludCAgICAgICBsYXRlbmN5OworICBHU0xpc3QgICAgICpzZXNzaW9uczsKKyAgR3N0Q2xvY2sgICAqcHJvdmlkZWRfY2xvY2s7Cit9OworCitzdHJ1Y3QgX0dzdFJUUERlY0NsYXNzIHsKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudF9jbGFzczsKKworICAvKiBnZXQgdGhlIGNhcHMgZm9yIHB0ICovCisgIEdzdENhcHMqICgqcmVxdWVzdF9wdF9tYXApICAoR3N0UlRQRGVjICpydHBkZWMsIGd1aW50IHNlc3Npb24sIGd1aW50IHB0KTsKKworICB2b2lkICAgICAoKmNsZWFyX3B0X21hcCkgICAgKEdzdFJUUERlYyAqcnRwZGVjKTsKKworICB2b2lkICAgICAoKm9uX25ld19zc3JjKSAgICAgICAoR3N0UlRQRGVjICpydHBkZWMsIGd1aW50IHNlc3Npb24sIGd1aW50MzIgc3NyYyk7CisgIHZvaWQgICAgICgqb25fc3NyY19jb2xsaXNpb24pIChHc3RSVFBEZWMgKnJ0cGRlYywgZ3VpbnQgc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjKTsKKyAgdm9pZCAgICAgKCpvbl9zc3JjX3ZhbGlkYXRlZCkgKEdzdFJUUERlYyAqcnRwZGVjLCBndWludCBzZXNzaW9uLCBndWludDMyIHNzcmMpOworICB2b2lkICAgICAoKm9uX2J5ZV9zc3JjKSAgICAgICAoR3N0UlRQRGVjICpydHBkZWMsIGd1aW50IHNlc3Npb24sIGd1aW50MzIgc3NyYyk7CisgIHZvaWQgICAgICgqb25fYnllX3RpbWVvdXQpICAgIChHc3RSVFBEZWMgKnJ0cGRlYywgZ3VpbnQgc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjKTsKKyAgdm9pZCAgICAgKCpvbl90aW1lb3V0KSAgICAgICAgKEdzdFJUUERlYyAqcnRwZGVjLCBndWludCBzZXNzaW9uLCBndWludDMyIHNzcmMpOworfTsKKworR1R5cGUgZ3N0X3J0cF9kZWNfZ2V0X3R5cGUodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfREVDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0c3AvZ3N0cnRzcC5jIGIvZ3N0L3J0c3AvZ3N0cnRzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZTJjM2YKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRzcC9nc3RydHNwLmMKQEAgLTAsMCArMSw3NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdC9nc3QtaTE4bi1wbHVnaW4uaCIKKworI2luY2x1ZGUgImdzdHJ0cGRlYy5oIgorI2luY2x1ZGUgImdzdHJ0c3BzcmMuaCIKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworI2lmZGVmIEVOQUJMRV9OTFMKKyAgYmluZHRleHRkb21haW4gKEdFVFRFWFRfUEFDS0FHRSwgTE9DQUxFRElSKTsKKyAgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKEdFVFRFWFRfUEFDS0FHRSwgIlVURi04Iik7CisjZW5kaWYgLyogRU5BQkxFX05MUyAqLworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0c3BzcmMiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX1JUU1BTUkMpKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwZGVjIiwgR1NUX1JBTktfTk9ORSwgR1NUX1RZUEVfUlRQX0RFQykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgcnRzcCwKKyAgICAidHJhbnNmZXIgZGF0YSB2aWEgUlRTUCIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sIEdTVF9MSUNFTlNFLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3QvcnRzcC9nc3RydHNwLmggYi9nc3QvcnRzcC9nc3RydHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBmNWVmOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHNwL2dzdHJ0c3AuaApAQCAtMCwwICsxLDUzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgIDwyMDA2PiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKgorICogVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIFNvdXJjZSBDb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlLgorICogU2VlIGZ1cnRoZXIgZXhwbGFuYXRpb24gYXR0YWNoZWQgaW4gTGljZW5zZSBTdGF0ZW1lbnQgKGRpc3RyaWJ1dGVkIGluIHRoZSBmaWxlCisgKiBMSUNFTlNFKS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFNQX0hfXworI2RlZmluZSBfX0dTVF9SVFNQX0hfXworCitHX0JFR0lOX0RFQ0xTCisKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUU1BfSF9fICovCisKZGlmZiAtLWdpdCBhL2dzdC9ydHNwL2dzdHJ0c3BleHQuYyBiL2dzdC9ydHNwL2dzdHJ0c3BleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2I1YTk3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0c3AvZ3N0cnRzcGV4dC5jCkBAIC0wLDAgKzEsMjY4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qCisgKiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgU291cmNlIENvZGUgaXMgbGljZW5zZWQgdW5kZXIgTUlUIGxpY2Vuc2UuCisgKiBTZWUgZnVydGhlciBleHBsYW5hdGlvbiBhdHRhY2hlZCBpbiBMaWNlbnNlIFN0YXRlbWVudCAoZGlzdHJpYnV0ZWQgaW4gdGhlIGZpbGUKKyAqIExJQ0VOU0UpLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZ3N0cnRzcGV4dC5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHNwZXh0X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHNwZXh0X2RlYnVnKQorCitzdGF0aWMgR0xpc3QgKmV4dGVuc2lvbnM7CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BfZXh0X2xpc3RfZmlsdGVyIChHc3RQbHVnaW5GZWF0dXJlICogZmVhdHVyZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RFbGVtZW50RmFjdG9yeSAqZmFjdG9yeTsKKyAgZ3VpbnQgcmFuazsKKworICAvKiB3ZSBvbmx5IGNhcmUgYWJvdXQgZWxlbWVudCBmYWN0b3JpZXMgKi8KKyAgaWYgKCFHU1RfSVNfRUxFTUVOVF9GQUNUT1JZIChmZWF0dXJlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZmFjdG9yeSA9IEdTVF9FTEVNRU5UX0ZBQ1RPUlkgKGZlYXR1cmUpOworCisgIGlmICghZ3N0X2VsZW1lbnRfZmFjdG9yeV9oYXNfaW50ZXJmYWNlIChmYWN0b3J5LCAiR3N0UlRTUEV4dGVuc2lvbiIpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBvbmx5IHNlbGVjdCBlbGVtZW50cyB3aXRoIGF1dG9wbHVnZ2luZyByYW5rICovCisgIHJhbmsgPSBnc3RfcGx1Z2luX2ZlYXR1cmVfZ2V0X3JhbmsgKGZlYXR1cmUpOworICBpZiAocmFuayA8IEdTVF9SQU5LX01BUkdJTkFMKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorZ3N0X3J0c3BfZXh0X2xpc3RfaW5pdCAodm9pZCkKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0c3BleHRfZGVidWcsICJydHNwZXh0IiwgMCwgIlJUU1AgZXh0ZW5zaW9uIik7CisKKyAgLyogZ2V0IGEgbGlzdCBvZiBhbGwgZXh0ZW5zaW9ucyAqLworICBleHRlbnNpb25zID0gZ3N0X3JlZ2lzdHJ5X2ZlYXR1cmVfZmlsdGVyIChnc3RfcmVnaXN0cnlfZ2V0ICgpLAorICAgICAgKEdzdFBsdWdpbkZlYXR1cmVGaWx0ZXIpIGdzdF9ydHNwX2V4dF9saXN0X2ZpbHRlciwgRkFMU0UsIE5VTEwpOworfQorCitHc3RSVFNQRXh0ZW5zaW9uTGlzdCAqCitnc3RfcnRzcF9leHRfbGlzdF9nZXQgKHZvaWQpCit7CisgIEdzdFJUU1BFeHRlbnNpb25MaXN0ICpyZXN1bHQ7CisgIEdMaXN0ICp3YWxrOworCisgIHJlc3VsdCA9IGdfbmV3MCAoR3N0UlRTUEV4dGVuc2lvbkxpc3QsIDEpOworCisgIGZvciAod2FsayA9IGV4dGVuc2lvbnM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RFbGVtZW50RmFjdG9yeSAqZmFjdG9yeSA9IEdTVF9FTEVNRU5UX0ZBQ1RPUlkgKHdhbGstPmRhdGEpOworICAgIEdzdEVsZW1lbnQgKmVsZW1lbnQ7CisKKyAgICBlbGVtZW50ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9jcmVhdGUgKGZhY3RvcnksIE5VTEwpOworICAgIGlmICghZWxlbWVudCkgeworICAgICAgR1NUX0VSUk9SICgiY291bGQgbm90IGNyZWF0ZSBleHRlbnNpb24gaW5zdGFuY2UiKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIEdTVF9ERUJVRyAoImFkZGVkIGV4dGVuc2lvbiBpbnRlcmZhY2UgZm9yICclcyciLAorICAgICAgICBHU1RfRUxFTUVOVF9OQU1FIChlbGVtZW50KSk7CisgICAgcmVzdWx0LT5leHRlbnNpb25zID0gZ19saXN0X3ByZXBlbmQgKHJlc3VsdC0+ZXh0ZW5zaW9ucywgZWxlbWVudCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZAorZ3N0X3J0c3BfZXh0X2xpc3RfZnJlZSAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKiBleHQpCit7CisgIEdMaXN0ICp3YWxrOworCisgIGZvciAod2FsayA9IGV4dC0+ZXh0ZW5zaW9uczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BFeHRlbnNpb24gKmVsZW0gPSAoR3N0UlRTUEV4dGVuc2lvbiAqKSB3YWxrLT5kYXRhOworCisgICAgZ3N0X29iamVjdF91bnJlZiAoR1NUX09CSkVDVF9DQVNUIChlbGVtKSk7CisgIH0KKyAgZ19saXN0X2ZyZWUgKGV4dC0+ZXh0ZW5zaW9ucyk7CisgIGdfZnJlZSAoZXh0KTsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHNwX2V4dF9saXN0X2RldGVjdF9zZXJ2ZXIgKEdzdFJUU1BFeHRlbnNpb25MaXN0ICogZXh0LAorICAgIEdzdFJUU1BNZXNzYWdlICogcmVzcCkKK3sKKyAgR0xpc3QgKndhbGs7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisKKyAgZm9yICh3YWxrID0gZXh0LT5leHRlbnNpb25zOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRTUEV4dGVuc2lvbiAqZWxlbSA9IChHc3RSVFNQRXh0ZW5zaW9uICopIHdhbGstPmRhdGE7CisKKyAgICByZXMgPSBnc3RfcnRzcF9leHRlbnNpb25fZGV0ZWN0X3NlcnZlciAoZWxlbSwgcmVzcCk7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworR3N0UlRTUFJlc3VsdAorZ3N0X3J0c3BfZXh0X2xpc3RfYmVmb3JlX3NlbmQgKEdzdFJUU1BFeHRlbnNpb25MaXN0ICogZXh0LCBHc3RSVFNQTWVzc2FnZSAqIHJlcSkKK3sKKyAgR0xpc3QgKndhbGs7CisgIEdzdFJUU1BSZXN1bHQgcmVzID0gR1NUX1JUU1BfT0s7CisKKyAgZm9yICh3YWxrID0gZXh0LT5leHRlbnNpb25zOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRTUEV4dGVuc2lvbiAqZWxlbSA9IChHc3RSVFNQRXh0ZW5zaW9uICopIHdhbGstPmRhdGE7CisKKyAgICByZXMgPSBnc3RfcnRzcF9leHRlbnNpb25fYmVmb3JlX3NlbmQgKGVsZW0sIHJlcSk7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworR3N0UlRTUFJlc3VsdAorZ3N0X3J0c3BfZXh0X2xpc3RfYWZ0ZXJfc2VuZCAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKiBleHQsIEdzdFJUU1BNZXNzYWdlICogcmVxLAorICAgIEdzdFJUU1BNZXNzYWdlICogcmVzcCkKK3sKKyAgR0xpc3QgKndhbGs7CisgIEdzdFJUU1BSZXN1bHQgcmVzID0gR1NUX1JUU1BfT0s7CisKKyAgZm9yICh3YWxrID0gZXh0LT5leHRlbnNpb25zOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRTUEV4dGVuc2lvbiAqZWxlbSA9IChHc3RSVFNQRXh0ZW5zaW9uICopIHdhbGstPmRhdGE7CisKKyAgICByZXMgPSBnc3RfcnRzcF9leHRlbnNpb25fYWZ0ZXJfc2VuZCAoZWxlbSwgcmVxLCByZXNwKTsKKyAgfQorICByZXR1cm4gcmVzOworfQorCitHc3RSVFNQUmVzdWx0Citnc3RfcnRzcF9leHRfbGlzdF9wYXJzZV9zZHAgKEdzdFJUU1BFeHRlbnNpb25MaXN0ICogZXh0LCBHc3RTRFBNZXNzYWdlICogc2RwLAorICAgIEdzdFN0cnVjdHVyZSAqIHMpCit7CisgIEdMaXN0ICp3YWxrOworICBHc3RSVFNQUmVzdWx0IHJlcyA9IEdTVF9SVFNQX09LOworCisgIGZvciAod2FsayA9IGV4dC0+ZXh0ZW5zaW9uczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BFeHRlbnNpb24gKmVsZW0gPSAoR3N0UlRTUEV4dGVuc2lvbiAqKSB3YWxrLT5kYXRhOworCisgICAgcmVzID0gZ3N0X3J0c3BfZXh0ZW5zaW9uX3BhcnNlX3NkcCAoZWxlbSwgc2RwLCBzKTsKKyAgfQorICByZXR1cm4gcmVzOworfQorCitHc3RSVFNQUmVzdWx0Citnc3RfcnRzcF9leHRfbGlzdF9zZXR1cF9tZWRpYSAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKiBleHQsIEdzdFNEUE1lZGlhICogbWVkaWEpCit7CisgIEdMaXN0ICp3YWxrOworICBHc3RSVFNQUmVzdWx0IHJlcyA9IEdTVF9SVFNQX09LOworCisgIGZvciAod2FsayA9IGV4dC0+ZXh0ZW5zaW9uczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BFeHRlbnNpb24gKmVsZW0gPSAoR3N0UlRTUEV4dGVuc2lvbiAqKSB3YWxrLT5kYXRhOworCisgICAgcmVzID0gZ3N0X3J0c3BfZXh0ZW5zaW9uX3NldHVwX21lZGlhIChlbGVtLCBtZWRpYSk7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHNwX2V4dF9saXN0X2NvbmZpZ3VyZV9zdHJlYW0gKEdzdFJUU1BFeHRlbnNpb25MaXN0ICogZXh0LCBHc3RDYXBzICogY2FwcykKK3sKKyAgR0xpc3QgKndhbGs7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisKKyAgZm9yICh3YWxrID0gZXh0LT5leHRlbnNpb25zOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRTUEV4dGVuc2lvbiAqZWxlbSA9IChHc3RSVFNQRXh0ZW5zaW9uICopIHdhbGstPmRhdGE7CisKKyAgICByZXMgPSBnc3RfcnRzcF9leHRlbnNpb25fY29uZmlndXJlX3N0cmVhbSAoZWxlbSwgY2Fwcyk7CisgICAgaWYgKCFyZXMpCisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVzOworfQorCitHc3RSVFNQUmVzdWx0Citnc3RfcnRzcF9leHRfbGlzdF9nZXRfdHJhbnNwb3J0cyAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKiBleHQsCisgICAgR3N0UlRTUExvd2VyVHJhbnMgcHJvdG9jb2xzLCBnY2hhciAqKiB0cmFuc3BvcnQpCit7CisgIEdMaXN0ICp3YWxrOworICBHc3RSVFNQUmVzdWx0IHJlcyA9IEdTVF9SVFNQX09LOworCisgIGZvciAod2FsayA9IGV4dC0+ZXh0ZW5zaW9uczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BFeHRlbnNpb24gKmVsZW0gPSAoR3N0UlRTUEV4dGVuc2lvbiAqKSB3YWxrLT5kYXRhOworCisgICAgcmVzID0gZ3N0X3J0c3BfZXh0ZW5zaW9uX2dldF90cmFuc3BvcnRzIChlbGVtLCBwcm90b2NvbHMsIHRyYW5zcG9ydCk7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworR3N0UlRTUFJlc3VsdAorZ3N0X3J0c3BfZXh0X2xpc3Rfc3RyZWFtX3NlbGVjdCAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKiBleHQsIEdzdFJUU1BVcmwgKiB1cmwpCit7CisgIEdMaXN0ICp3YWxrOworICBHc3RSVFNQUmVzdWx0IHJlcyA9IEdTVF9SVFNQX09LOworCisgIGZvciAod2FsayA9IGV4dC0+ZXh0ZW5zaW9uczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BFeHRlbnNpb24gKmVsZW0gPSAoR3N0UlRTUEV4dGVuc2lvbiAqKSB3YWxrLT5kYXRhOworCisgICAgcmVzID0gZ3N0X3J0c3BfZXh0ZW5zaW9uX3N0cmVhbV9zZWxlY3QgKGVsZW0sIHVybCk7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKwordm9pZAorZ3N0X3J0c3BfZXh0X2xpc3RfY29ubmVjdCAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKiBleHQsCisgICAgY29uc3QgZ2NoYXIgKiBkZXRhaWxlZF9zaWduYWwsIEdDYWxsYmFjayBjX2hhbmRsZXIsIGdwb2ludGVyIGRhdGEpCit7CisgIEdMaXN0ICp3YWxrOworCisgIGZvciAod2FsayA9IGV4dC0+ZXh0ZW5zaW9uczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BFeHRlbnNpb24gKmVsZW0gPSAoR3N0UlRTUEV4dGVuc2lvbiAqKSB3YWxrLT5kYXRhOworCisgICAgZ19zaWduYWxfY29ubmVjdCAoZWxlbSwgZGV0YWlsZWRfc2lnbmFsLCBjX2hhbmRsZXIsIGRhdGEpOworICB9Cit9CisKK0dzdFJUU1BSZXN1bHQKK2dzdF9ydHNwX2V4dF9saXN0X3JlY2VpdmVfcmVxdWVzdCAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKiBleHQsCisgICAgR3N0UlRTUE1lc3NhZ2UgKiByZXEpCit7CisgIEdMaXN0ICp3YWxrOworICBHc3RSVFNQUmVzdWx0IHJlcyA9IEdTVF9SVFNQX0VOT1RJTVBMOworCisgIGZvciAod2FsayA9IGV4dC0+ZXh0ZW5zaW9uczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BFeHRlbnNpb24gKmVsZW0gPSAoR3N0UlRTUEV4dGVuc2lvbiAqKSB3YWxrLT5kYXRhOworCisgICAgcmVzID0gZ3N0X3J0c3BfZXh0ZW5zaW9uX3JlY2VpdmVfcmVxdWVzdCAoZWxlbSwgcmVxKTsKKyAgICBpZiAocmVzICE9IEdTVF9SVFNQX0VOT1RJTVBMKQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHNwL2dzdHJ0c3BleHQuaCBiL2dzdC9ydHNwL2dzdHJ0c3BleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTg3Nzk2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0c3AvZ3N0cnRzcGV4dC5oCkBAIC0wLDAgKzEsODMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRTUF9FWFRfSF9fCisjZGVmaW5lIF9fR1NUX1JUU1BfRVhUX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHNwL2dzdHJ0c3BleHRlbnNpb24uaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0UlRTUEV4dGVuc2lvbkxpc3QgR3N0UlRTUEV4dGVuc2lvbkxpc3Q7CisKK3N0cnVjdCBfR3N0UlRTUEV4dGVuc2lvbkxpc3QKK3sKKyAgR0xpc3QgKmV4dGVuc2lvbnM7Cit9OworCit2b2lkICAgICAgICAgICAgICAgICAgICBnc3RfcnRzcF9leHRfbGlzdF9pbml0ICAgICh2b2lkKTsKKworR3N0UlRTUEV4dGVuc2lvbkxpc3QgKiAgZ3N0X3J0c3BfZXh0X2xpc3RfZ2V0ICAgICAodm9pZCk7Cit2b2lkICAgICAgICAgICAgICAgICAgICBnc3RfcnRzcF9leHRfbGlzdF9mcmVlICAgIChHc3RSVFNQRXh0ZW5zaW9uTGlzdCAqZXh0KTsKKworZ2Jvb2xlYW4gICAgICBnc3RfcnRzcF9leHRfbGlzdF9kZXRlY3Rfc2VydmVyICAgICAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKmV4dCwgR3N0UlRTUE1lc3NhZ2UgKnJlc3ApOworICAKK0dzdFJUU1BSZXN1bHQgZ3N0X3J0c3BfZXh0X2xpc3RfYmVmb3JlX3NlbmQgICAgICAgKEdzdFJUU1BFeHRlbnNpb25MaXN0ICpleHQsIEdzdFJUU1BNZXNzYWdlICpyZXEpOworR3N0UlRTUFJlc3VsdCBnc3RfcnRzcF9leHRfbGlzdF9hZnRlcl9zZW5kICAgICAgICAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKmV4dCwgR3N0UlRTUE1lc3NhZ2UgKnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFJUU1BNZXNzYWdlICpyZXNwKTsKK0dzdFJUU1BSZXN1bHQgZ3N0X3J0c3BfZXh0X2xpc3RfcGFyc2Vfc2RwICAgICAgICAgKEdzdFJUU1BFeHRlbnNpb25MaXN0ICpleHQsIEdzdFNEUE1lc3NhZ2UgKnNkcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFN0cnVjdHVyZSAqcyk7CitHc3RSVFNQUmVzdWx0IGdzdF9ydHNwX2V4dF9saXN0X3NldHVwX21lZGlhICAgICAgIChHc3RSVFNQRXh0ZW5zaW9uTGlzdCAqZXh0LCBHc3RTRFBNZWRpYSAqbWVkaWEpOworZ2Jvb2xlYW4gICAgICBnc3RfcnRzcF9leHRfbGlzdF9jb25maWd1cmVfc3RyZWFtICAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKmV4dCwgR3N0Q2FwcyAqY2Fwcyk7CitHc3RSVFNQUmVzdWx0IGdzdF9ydHNwX2V4dF9saXN0X2dldF90cmFuc3BvcnRzICAgIChHc3RSVFNQRXh0ZW5zaW9uTGlzdCAqZXh0LCBHc3RSVFNQTG93ZXJUcmFucyBwcm90b2NvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKnRyYW5zcG9ydCk7CitHc3RSVFNQUmVzdWx0IGdzdF9ydHNwX2V4dF9saXN0X3N0cmVhbV9zZWxlY3QgICAgIChHc3RSVFNQRXh0ZW5zaW9uTGlzdCAqZXh0LCBHc3RSVFNQVXJsICp1cmwpOworCit2b2lkICAgICAgICAgIGdzdF9ydHNwX2V4dF9saXN0X2Nvbm5lY3QgICAgICAgICAgIChHc3RSVFNQRXh0ZW5zaW9uTGlzdCAqZXh0LAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKmRldGFpbGVkX3NpZ25hbCwgR0NhbGxiYWNrIGNfaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyIGRhdGEpOworR3N0UlRTUFJlc3VsdCBnc3RfcnRzcF9leHRfbGlzdF9yZWNlaXZlX3JlcXVlc3QgICAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKmV4dCwgR3N0UlRTUE1lc3NhZ2UgKnJlcSk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFNQX0VYVF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHNwL2dzdHJ0c3BzcmMuYyBiL2dzdC9ydHNwL2dzdHJ0c3BzcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjM2MDczCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jCkBAIC0wLDAgKzEsODc1NSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1LDIwMDY+IFdpbSBUYXltYW5zIDx3aW0gYXQgZmx1ZW5kbyBkb3QgY29tPgorICogICAgICAgICAgICAgICA8MjAwNj4gTHV0eiBNdWVsbGVyIDxsdXR6IGF0IHRvcGZyb3NlIGRvdCBkZT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1ydHNwc3JjCisgKgorICogTWFrZXMgYSBjb25uZWN0aW9uIHRvIGFuIFJUU1Agc2VydmVyIGFuZCByZWFkIHRoZSBkYXRhLgorICogcnRzcHNyYyBzdHJpY3RseSBmb2xsb3dzIFJGQyAyMzI2IGFuZCB0aGVyZWZvcmUgZG9lcyBub3QgKHlldCkgc3VwcG9ydAorICogUmVhbE1lZGlhL1F1aWNrdGltZS9NaWNyb3NvZnQgZXh0ZW5zaW9ucy4KKyAqCisgKiBSVFNQIHN1cHBvcnRzIHRyYW5zcG9ydCBvdmVyIFRDUCBvciBVRFAgaW4gdW5pY2FzdCBvciBtdWx0aWNhc3QgbW9kZS4gQnkKKyAqIGRlZmF1bHQgcnRzcHNyYyB3aWxsIG5lZ290aWF0ZSBhIGNvbm5lY3Rpb24gaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKyAqIFVEUCB1bmljYXN0L1VEUCBtdWx0aWNhc3QvVENQLiBUaGUgb3JkZXIgY2Fubm90IGJlIGNoYW5nZWQgYnV0IHRoZSBhbGxvd2VkCisgKiBwcm90b2NvbHMgY2FuIGJlIGNvbnRyb2xsZWQgd2l0aCB0aGUgI0dzdFJUU1BTcmM6cHJvdG9jb2xzIHByb3BlcnR5LgorICoKKyAqIHJ0c3BzcmMgY3VycmVudGx5IHVuZGVyc3RhbmRzIFNEUCBhcyB0aGUgZm9ybWF0IG9mIHRoZSBzZXNzaW9uIGRlc2NyaXB0aW9uLgorICogRm9yIGVhY2ggc3RyZWFtIGxpc3RlZCBpbiB0aGUgU0RQIGEgbmV3IHJ0cF9zdHJlYW1cJWQgcGFkIHdpbGwgYmUgY3JlYXRlZAorICogd2l0aCBjYXBzIGRlcml2ZWQgZnJvbSB0aGUgU0RQIG1lZGlhIGRlc2NyaXB0aW9uLiBUaGlzIGlzIGEgY2FwcyBvZiBtaW1lIHR5cGUKKyAqICJhcHBsaWNhdGlvbi94LXJ0cCIgdGhhdCBjYW4gYmUgY29ubmVjdGVkIHRvIGFueSBhdmFpbGFibGUgUlRQIGRlcGF5bG9hZGVyCisgKiBlbGVtZW50LgorICoKKyAqIHJ0c3BzcmMgd2lsbCBpbnRlcm5hbGx5IGluc3RhbnRpYXRlIGFuIFJUUCBzZXNzaW9uIG1hbmFnZXIgZWxlbWVudAorICogdGhhdCB3aWxsIGhhbmRsZSB0aGUgUlRDUCBtZXNzYWdlcyB0byBhbmQgZnJvbSB0aGUgc2VydmVyLCBqaXR0ZXIgcmVtb3ZhbCwKKyAqIHBhY2tldCByZW9yZGVyaW5nIGFsb25nIHdpdGggcHJvdmlkaW5nIGEgY2xvY2sgZm9yIHRoZSBwaXBlbGluZS4KKyAqIFRoaXMgZmVhdHVyZSBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgZ3N0cnRwYmluIGVsZW1lbnQuCisgKgorICogcnRzcHNyYyBhY3RzIGxpa2UgYSBsaXZlIHNvdXJjZSBhbmQgd2lsbCB0aGVyZWZvcmUgb25seSBnZW5lcmF0ZSBkYXRhIGluIHRoZQorICogUExBWUlORyBzdGF0ZS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgcnRzcHNyYyBsb2NhdGlvbj1ydHNwOi8vc29tZS5zZXJ2ZXIvdXJsICEgZmFrZXNpbmsKKyAqIF18IEVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gYW4gUlRTUCBzZXJ2ZXIgYW5kIHNlbmQgdGhlIHJhdyBSVFAgcGFja2V0cyB0byBhCisgKiBmYWtlc2luay4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmIC8qIEhBVkVfVU5JU1REX0ggKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSA8Z3N0L25ldC9nc3RuZXQuaD4KKyNpbmNsdWRlIDxnc3Qvc2RwL2dzdHNkcG1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnc3Qvc2RwL2dzdG1pa2V5Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9ydHAuaD4KKworI2luY2x1ZGUgImdzdC9nc3QtaTE4bi1wbHVnaW4uaCIKKworI2luY2x1ZGUgImdzdHJ0c3BzcmMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRzcHNyY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRzcHNyY19kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHJ0cHRlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzdHJlYW1fJXUiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfU09NRVRJTUVTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwOyBhcHBsaWNhdGlvbi94LXJkdCIpKTsKKworLyogdGVtcGxhdGVzIHVzZWQgaW50ZXJuYWxseSAqLworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGFueXNyY3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgiaW50ZXJuYWxzcmNfJXUiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfU09NRVRJTUVTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgYW55c2lua3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgiaW50ZXJuYWxzaW5rXyV1IiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9TT01FVElNRVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK2VudW0KK3sKKyAgU0lHTkFMX0hBTkRMRV9SRVFVRVNULAorICBTSUdOQUxfT05fU0RQLAorICBTSUdOQUxfU0VMRUNUX1NUUkVBTSwKKyAgU0lHTkFMX05FV19NQU5BR0VSLAorICBTSUdOQUxfUkVRVUVTVF9SVENQX0tFWSwKKyAgU0lHTkFMX0FDQ0VQVF9DRVJUSUZJQ0FURSwKKyAgU0lHTkFMX0JFRk9SRV9TRU5ELAorICBMQVNUX1NJR05BTAorfTsKKworZW51bSBfR3N0UnRzcFNyY1J0Y3BTeW5jTW9kZQoreworICBSVENQX1NZTkNfQUxXQVlTLAorICBSVENQX1NZTkNfSU5JVElBTCwKKyAgUlRDUF9TWU5DX1JUUAorfTsKKworZW51bSBfR3N0UnRzcFNyY0J1ZmZlck1vZGUKK3sKKyAgQlVGRkVSX01PREVfTk9ORSwKKyAgQlVGRkVSX01PREVfU0xBVkUsCisgIEJVRkZFUl9NT0RFX0JVRkZFUiwKKyAgQlVGRkVSX01PREVfQVVUTywKKyAgQlVGRkVSX01PREVfU1lOQ0VECit9OworCisjZGVmaW5lIEdTVF9UWVBFX1JUU1BfU1JDX0JVRkZFUl9NT0RFIChnc3RfcnRzcF9zcmNfYnVmZmVyX21vZGVfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X3J0c3Bfc3JjX2J1ZmZlcl9tb2RlX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgYnVmZmVyX21vZGVfdHlwZSA9IDA7CisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIGJ1ZmZlcl9tb2Rlc1tdID0geworICAgIHtCVUZGRVJfTU9ERV9OT05FLCAiT25seSB1c2UgUlRQIHRpbWVzdGFtcHMiLCAibm9uZSJ9LAorICAgIHtCVUZGRVJfTU9ERV9TTEFWRSwgIlNsYXZlIHJlY2VpdmVyIHRvIHNlbmRlciBjbG9jayIsICJzbGF2ZSJ9LAorICAgIHtCVUZGRVJfTU9ERV9CVUZGRVIsICJEbyBsb3cvaGlnaCB3YXRlcm1hcmsgYnVmZmVyaW5nIiwgImJ1ZmZlciJ9LAorICAgIHtCVUZGRVJfTU9ERV9BVVRPLCAiQ2hvb3NlIG1vZGUgZGVwZW5kaW5nIG9uIHN0cmVhbSBsaXZlIiwgImF1dG8ifSwKKyAgICB7QlVGRkVSX01PREVfU1lOQ0VELCAiU3luY2hyb25pemVkIHNlbmRlciBhbmQgcmVjZWl2ZXIgY2xvY2tzIiwgInN5bmNlZCJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIWJ1ZmZlcl9tb2RlX3R5cGUpIHsKKyAgICBidWZmZXJfbW9kZV90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFJUU1BTcmNCdWZmZXJNb2RlIiwgYnVmZmVyX21vZGVzKTsKKyAgfQorICByZXR1cm4gYnVmZmVyX21vZGVfdHlwZTsKK30KKworZW51bSBfR3N0UnRzcFNyY050cFRpbWVTb3VyY2UKK3sKKyAgTlRQX1RJTUVfU09VUkNFX05UUCwKKyAgTlRQX1RJTUVfU09VUkNFX1VOSVgsCisgIE5UUF9USU1FX1NPVVJDRV9SVU5OSU5HX1RJTUUsCisgIE5UUF9USU1FX1NPVVJDRV9DTE9DS19USU1FCit9OworCisjZGVmaW5lIERFQlVHX1JUU1AoX19zZWxmLG1zZykgZ3N0X3J0c3BzcmNfcHJpbnRfcnRzcF9tZXNzYWdlIChfX3NlbGYsIG1zZykKKyNkZWZpbmUgREVCVUdfU0RQKF9fc2VsZixtc2cpIGdzdF9ydHNwc3JjX3ByaW50X3NkcF9tZXNzYWdlIChfX3NlbGYsIG1zZykKKworI2RlZmluZSBHU1RfVFlQRV9SVFNQX1NSQ19OVFBfVElNRV9TT1VSQ0UgKGdzdF9ydHNwX3NyY19udHBfdGltZV9zb3VyY2VfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X3J0c3Bfc3JjX250cF90aW1lX3NvdXJjZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIG50cF90aW1lX3NvdXJjZV90eXBlID0gMDsKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgbnRwX3RpbWVfc291cmNlX3ZhbHVlc1tdID0geworICAgIHtOVFBfVElNRV9TT1VSQ0VfTlRQLCAiTlRQIHRpbWUgYmFzZWQgb24gcmVhbHRpbWUgY2xvY2siLCAibnRwIn0sCisgICAge05UUF9USU1FX1NPVVJDRV9VTklYLCAiVU5JWCB0aW1lIGJhc2VkIG9uIHJlYWx0aW1lIGNsb2NrIiwgInVuaXgifSwKKyAgICB7TlRQX1RJTUVfU09VUkNFX1JVTk5JTkdfVElNRSwKKyAgICAgICAgICAiUnVubmluZyB0aW1lIGJhc2VkIG9uIHBpcGVsaW5lIGNsb2NrIiwKKyAgICAgICAgInJ1bm5pbmctdGltZSJ9LAorICAgIHtOVFBfVElNRV9TT1VSQ0VfQ0xPQ0tfVElNRSwgIlBpcGVsaW5lIGNsb2NrIHRpbWUiLCAiY2xvY2stdGltZSJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIW50cF90aW1lX3NvdXJjZV90eXBlKSB7CisgICAgbnRwX3RpbWVfc291cmNlX3R5cGUgPQorICAgICAgICBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0UlRTUFNyY050cFRpbWVTb3VyY2UiLAorICAgICAgICBudHBfdGltZV9zb3VyY2VfdmFsdWVzKTsKKyAgfQorICByZXR1cm4gbnRwX3RpbWVfc291cmNlX3R5cGU7Cit9CisKKyNkZWZpbmUgREVGQVVMVF9MT0NBVElPTiAgICAgICAgIE5VTEwKKyNkZWZpbmUgREVGQVVMVF9QUk9UT0NPTFMgICAgICAgIEdTVF9SVFNQX0xPV0VSX1RSQU5TX1VEUCB8IEdTVF9SVFNQX0xPV0VSX1RSQU5TX1VEUF9NQ0FTVCB8IEdTVF9SVFNQX0xPV0VSX1RSQU5TX1RDUAorI2RlZmluZSBERUZBVUxUX0RFQlVHICAgICAgICAgICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9SRVRSWSAgICAgICAgICAgIDIwCisjZGVmaW5lIERFRkFVTFRfVElNRU9VVCAgICAgICAgICA1MDAwMDAwCisjZGVmaW5lIERFRkFVTFRfVURQX0JVRkZFUl9TSVpFICAweDgwMDAwCisjZGVmaW5lIERFRkFVTFRfVENQX1RJTUVPVVQgICAgICAyMDAwMDAwMAorI2RlZmluZSBERUZBVUxUX0xBVEVOQ1lfTVMgICAgICAgMjAwMAorI2RlZmluZSBERUZBVUxUX0RST1BfT05fTEFURU5DWSAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9DT05ORUNUSU9OX1NQRUVEIDAKKyNkZWZpbmUgREVGQVVMVF9OQVRfTUVUSE9EICAgICAgIEdTVF9SVFNQX05BVF9EVU1NWQorI2RlZmluZSBERUZBVUxUX0RPX1JUQ1AgICAgICAgICAgVFJVRQorI2RlZmluZSBERUZBVUxUX0RPX1JUU1BfS0VFUF9BTElWRSAgICAgICBUUlVFCisjZGVmaW5lIERFRkFVTFRfUFJPWFkgICAgICAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfUlRQX0JMT0NLU0laRSAgICAwCisjZGVmaW5lIERFRkFVTFRfVVNFUl9JRCAgICAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfVVNFUl9QVyAgICAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfQlVGRkVSX01PREUgICAgICBCVUZGRVJfTU9ERV9BVVRPCisjZGVmaW5lIERFRkFVTFRfUE9SVF9SQU5HRSAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfU0hPUlRfSEVBREVSICAgICBGQUxTRQorI2RlZmluZSBERUZBVUxUX1BST0JBVElPTiAgICAgICAgMgorI2RlZmluZSBERUZBVUxUX1VEUF9SRUNPTk5FQ1QgICAgVFJVRQorI2RlZmluZSBERUZBVUxUX01VTFRJQ0FTVF9JRkFDRSAgTlVMTAorI2RlZmluZSBERUZBVUxUX05UUF9TWU5DICAgICAgICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9VU0VfUElQRUxJTkVfQ0xPQ0sgICAgICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9UTFNfVkFMSURBVElPTl9GTEFHUyAgICAgR19UTFNfQ0VSVElGSUNBVEVfVkFMSURBVEVfQUxMCisjZGVmaW5lIERFRkFVTFRfVExTX0RBVEFCQVNFICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfVExTX0lOVEVSQUNUSU9OICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfRE9fUkVUUkFOU01JU1NJT04gICAgICAgIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9OVFBfVElNRV9TT1VSQ0UgIE5UUF9USU1FX1NPVVJDRV9OVFAKKyNkZWZpbmUgREVGQVVMVF9VU0VSX0FHRU5UICAgICAgICJHU3RyZWFtZXIvIiBQQUNLQUdFX1ZFUlNJT04KKyNkZWZpbmUgREVGQVVMVF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGIDEwMDAKKyNkZWZpbmUgREVGQVVMVF9SRkM3MjczX1NZTkMgICAgICAgICBGQUxTRQorI2RlZmluZSBERUZBVUxUX01BWF9UU19PRkZTRVRfQURKVVNUTUVOVCAgIEdfR1VJTlQ2NF9DT05TVEFOVCgwKQorI2RlZmluZSBERUZBVUxUX01BWF9UU19PRkZTRVQgICBHX0dJTlQ2NF9DT05TVEFOVCgzMDAwMDAwMDAwKQorI2RlZmluZSBERUZBVUxUX1ZFUlNJT04gICAgICAgICBHU1RfUlRTUF9WRVJTSU9OXzFfMAorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MT0NBVElPTiwKKyAgUFJPUF9QUk9UT0NPTFMsCisgIFBST1BfREVCVUcsCisgIFBST1BfUkVUUlksCisgIFBST1BfVElNRU9VVCwKKyAgUFJPUF9UQ1BfVElNRU9VVCwKKyAgUFJPUF9MQVRFTkNZLAorICBQUk9QX0RST1BfT05fTEFURU5DWSwKKyAgUFJPUF9DT05ORUNUSU9OX1NQRUVELAorICBQUk9QX05BVF9NRVRIT0QsCisgIFBST1BfRE9fUlRDUCwKKyAgUFJPUF9ET19SVFNQX0tFRVBfQUxJVkUsCisgIFBST1BfUFJPWFksCisgIFBST1BfUFJPWFlfSUQsCisgIFBST1BfUFJPWFlfUFcsCisgIFBST1BfUlRQX0JMT0NLU0laRSwKKyAgUFJPUF9VU0VSX0lELAorICBQUk9QX1VTRVJfUFcsCisgIFBST1BfQlVGRkVSX01PREUsCisgIFBST1BfUE9SVF9SQU5HRSwKKyAgUFJPUF9VRFBfQlVGRkVSX1NJWkUsCisgIFBST1BfU0hPUlRfSEVBREVSLAorICBQUk9QX1BST0JBVElPTiwKKyAgUFJPUF9VRFBfUkVDT05ORUNULAorICBQUk9QX01VTFRJQ0FTVF9JRkFDRSwKKyAgUFJPUF9OVFBfU1lOQywKKyAgUFJPUF9VU0VfUElQRUxJTkVfQ0xPQ0ssCisgIFBST1BfU0RFUywKKyAgUFJPUF9UTFNfVkFMSURBVElPTl9GTEFHUywKKyAgUFJPUF9UTFNfREFUQUJBU0UsCisgIFBST1BfVExTX0lOVEVSQUNUSU9OLAorICBQUk9QX0RPX1JFVFJBTlNNSVNTSU9OLAorICBQUk9QX05UUF9USU1FX1NPVVJDRSwKKyAgUFJPUF9VU0VSX0FHRU5ULAorICBQUk9QX01BWF9SVENQX1JUUF9USU1FX0RJRkYsCisgIFBST1BfUkZDNzI3M19TWU5DLAorICBQUk9QX01BWF9UU19PRkZTRVRfQURKVVNUTUVOVCwKKyAgUFJPUF9NQVhfVFNfT0ZGU0VULAorICBQUk9QX0RFRkFVTFRfVkVSU0lPTiwKK307CisKKyNkZWZpbmUgR1NUX1RZUEVfUlRTUF9OQVRfTUVUSE9EIChnc3RfcnRzcF9uYXRfbWV0aG9kX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9ydHNwX25hdF9tZXRob2RfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBydHNwX25hdF9tZXRob2RfdHlwZSA9IDA7CisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIHJ0c3BfbmF0X21ldGhvZFtdID0geworICAgIHtHU1RfUlRTUF9OQVRfTk9ORSwgIk5vbmUiLCAibm9uZSJ9LAorICAgIHtHU1RfUlRTUF9OQVRfRFVNTVksICJTZW5kIER1bW15IHBhY2tldHMiLCAiZHVtbXkifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0sCisgIH07CisKKyAgaWYgKCFydHNwX25hdF9tZXRob2RfdHlwZSkgeworICAgIHJ0c3BfbmF0X21ldGhvZF90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFJUU1BOYXRNZXRob2QiLCBydHNwX25hdF9tZXRob2QpOworICB9CisgIHJldHVybiBydHNwX25hdF9tZXRob2RfdHlwZTsKK30KKworI2RlZmluZSBSVFNQX1NSQ19SRVNQT05TRV9FUlJPUihzcmMsIHJlc3BvbnNlX21zZywgZXJyX2NhdCwgZXJyX2NvZGUsIGVycm9yX21lc3NhZ2UpIFwKKyAgZG8geyBcCisgICAgR1NUX0VMRU1FTlRfRVJST1JfV0lUSF9ERVRBSUxTKChzcmMpLCBlcnJfY2F0LCBlcnJfY29kZSwgKCIlcyIsIGVycm9yX21lc3NhZ2UpLCBcCisgICAgICAgICgiJXMgKCVkKSIsIChyZXNwb25zZV9tc2cpLT50eXBlX2RhdGEucmVzcG9uc2UucmVhc29uLCAocmVzcG9uc2VfbXNnKS0+dHlwZV9kYXRhLnJlc3BvbnNlLmNvZGUpLCBcCisgICAgICAgICgicnRzcC1zdGF0dXMtY29kZSIsIEdfVFlQRV9VSU5ULCAocmVzcG9uc2VfbXNnKS0+dHlwZV9kYXRhLnJlc3BvbnNlLmNvZGUsIFwKKyAgICAgICAgICJydHNwLXN0YXR1cy1yZWFzb24iLCBHX1RZUEVfU1RSSU5HLCBHU1RfU1RSX05VTEwoKHJlc3BvbnNlX21zZyktPnR5cGVfZGF0YS5yZXNwb25zZS5yZWFzb24pLCBOVUxMKSk7IFwKKyAgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgZ3N0X3J0c3BzcmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgdm9pZCBnc3RfcnRzcHNyY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRzcHNyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBHc3RDbG9jayAqZ3N0X3J0c3BzcmNfcHJvdmlkZV9jbG9jayAoR3N0RWxlbWVudCAqIGVsZW1lbnQpOworCitzdGF0aWMgdm9pZCBnc3RfcnRzcHNyY191cmlfaGFuZGxlcl9pbml0IChncG9pbnRlciBnX2lmYWNlLAorICAgIGdwb2ludGVyIGlmYWNlX2RhdGEpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0c3BzcmNfc2V0X3Byb3h5IChHc3RSVFNQU3JjICogcnRzcCwgY29uc3QgZ2NoYXIgKiBwcm94eSk7CitzdGF0aWMgdm9pZCBnc3RfcnRzcHNyY19zZXRfdGNwX3RpbWVvdXQgKEdzdFJUU1BTcmMgKiBydHNwc3JjLCBndWludDY0IHRpbWVvdXQpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRzcHNyY19zZW5kX2V2ZW50IChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgdm9pZCBnc3RfcnRzcHNyY19oYW5kbGVfbWVzc2FnZSAoR3N0QmluICogYmluLCBHc3RNZXNzYWdlICogbWVzc2FnZSk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRzcHNyY19zZXR1cF9hdXRoIChHc3RSVFNQU3JjICogc3JjLAorICAgIEdzdFJUU1BNZXNzYWdlICogcmVzcG9uc2UpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCAoR3N0UlRTUFNyYyAqIHNyYywgZ2ludCBjbWQsCisgICAgZ2ludCBtYXNrKTsKK3N0YXRpYyBHc3RSVFNQUmVzdWx0IGdzdF9ydHNwc3JjX3NlbmRfY2IgKEdzdFJUU1BFeHRlbnNpb24gKiBleHQsCisgICAgR3N0UlRTUE1lc3NhZ2UgKiByZXF1ZXN0LCBHc3RSVFNQTWVzc2FnZSAqIHJlc3BvbnNlLCBHc3RSVFNQU3JjICogc3JjKTsKKworc3RhdGljIEdzdFJUU1BSZXN1bHQgZ3N0X3J0c3BzcmNfb3BlbiAoR3N0UlRTUFNyYyAqIHNyYywgZ2Jvb2xlYW4gYXN5bmMpOworc3RhdGljIEdzdFJUU1BSZXN1bHQgZ3N0X3J0c3BzcmNfcGxheSAoR3N0UlRTUFNyYyAqIHNyYywgR3N0U2VnbWVudCAqIHNlZ21lbnQsCisgICAgZ2Jvb2xlYW4gYXN5bmMsIGNvbnN0IGdjaGFyICogc2Vla19zdHlsZSk7CitzdGF0aWMgR3N0UlRTUFJlc3VsdCBnc3RfcnRzcHNyY19wYXVzZSAoR3N0UlRTUFNyYyAqIHNyYywgZ2Jvb2xlYW4gYXN5bmMpOworc3RhdGljIEdzdFJUU1BSZXN1bHQgZ3N0X3J0c3BzcmNfY2xvc2UgKEdzdFJUU1BTcmMgKiBzcmMsIGdib29sZWFuIGFzeW5jLAorICAgIGdib29sZWFuIG9ubHlfY2xvc2UpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0c3BzcmNfdXJpX3NldF91cmkgKEdzdFVSSUhhbmRsZXIgKiBoYW5kbGVyLAorICAgIGNvbnN0IGdjaGFyICogdXJpLCBHRXJyb3IgKiogZXJyb3IpOworc3RhdGljIGdjaGFyICpnc3RfcnRzcHNyY191cmlfZ2V0X3VyaSAoR3N0VVJJSGFuZGxlciAqIGhhbmRsZXIpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0c3BzcmNfYWN0aXZhdGVfc3RyZWFtcyAoR3N0UlRTUFNyYyAqIHNyYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0c3BzcmNfbG9vcCAoR3N0UlRTUFNyYyAqIHNyYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0c3BzcmNfc3RyZWFtX3B1c2hfZXZlbnQgKEdzdFJUU1BTcmMgKiBzcmMsCisgICAgR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0c3BzcmNfcHVzaF9ldmVudCAoR3N0UlRTUFNyYyAqIHNyYywgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgdm9pZCBnc3RfcnRzcHNyY19jb25uZWN0aW9uX2ZsdXNoIChHc3RSVFNQU3JjICogc3JjLCBnYm9vbGVhbiBmbHVzaCk7CitzdGF0aWMgR3N0UlRTUFJlc3VsdCBnc3RfcnRzcF9jb25uaW5mb19jbG9zZSAoR3N0UlRTUFNyYyAqIHNyYywKKyAgICBHc3RSVFNQQ29ubkluZm8gKiBpbmZvLCBnYm9vbGVhbiBmcmVlKTsKK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY19wcmludF9ydHNwX21lc3NhZ2UgKEdzdFJUU1BTcmMgKiBzcmMsIGNvbnN0IEdzdFJUU1BNZXNzYWdlICogbXNnKTsKK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY19wcmludF9zZHBfbWVzc2FnZSAoR3N0UlRTUFNyYyAqIHNyYywgY29uc3QgR3N0U0RQTWVzc2FnZSAqIG1zZyk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGd1aW50OCBwdDsKKyAgR3N0Q2FwcyAqY2FwczsKK30gUHRNYXBJdGVtOworCisvKiBjb21tYW5kcyB3ZSBzZW5kIHRvIG91dCBsb29wIHRvIG5vdGlmeSBpdCBvZiBldmVudHMgKi8KKyNkZWZpbmUgQ01EX09QRU4gICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgQ01EX1BMQVkgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgQ01EX1BBVVNFICAgICAgKDEgPDwgMikKKyNkZWZpbmUgQ01EX0NMT1NFICAgICAgKDEgPDwgMykKKyNkZWZpbmUgQ01EX1dBSVQgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgQ01EX1JFQ09OTkVDVCAgKDEgPDwgNSkKKyNkZWZpbmUgQ01EX0xPT1AgICAgICAgKDEgPDwgNikKKworLyogbWFzayBmb3IgYWxsIGNvbW1hbmRzICovCisjZGVmaW5lIENNRF9BTEwgICAgICAgICAoKENNRF9MT09QIDw8IDEpIC0gMSkKKworI2RlZmluZSBHU1RfRUxFTUVOVF9QUk9HUkVTUyhlbCwgdHlwZSwgY29kZSwgdGV4dCkgICAgICBcCitHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ2NoYXIgKl9fdHh0ID0gX2dzdF9lbGVtZW50X2Vycm9yX3ByaW50ZiB0ZXh0OyAgICAgICAgXAorICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKGVsKSwgICAgICBcCisgICAgICBnc3RfbWVzc2FnZV9uZXdfcHJvZ3Jlc3MgKEdTVF9PQkpFQ1RfQ0FTVCAoZWwpLCAgIFwKKyAgICAgICAgICBHU1RfUFJPR1JFU1NfVFlQRV8gIyN0eXBlLCBjb2RlLCBfX3R4dCkpOyAgICAgXAorICBnX2ZyZWUgKF9fdHh0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IEdfU1RNVF9FTkQKKworc3RhdGljIGd1aW50IGdzdF9ydHNwc3JjX3NpZ25hbHNbTEFTVF9TSUdOQUxdID0geyAwIH07CisKKyNkZWZpbmUgZ3N0X3J0c3BzcmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdFJUU1BTcmMsIGdzdF9ydHNwc3JjLCBHU1RfVFlQRV9CSU4sCisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9VUklfSEFORExFUiwgZ3N0X3J0c3BzcmNfdXJpX2hhbmRsZXJfaW5pdCkpOworCisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICoKK2NtZF90b19zdHJpbmcgKGd1aW50IGNtZCkKK3sKKyAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIENNRF9PUEVOOgorICAgICAgcmV0dXJuICJPUEVOIjsKKyAgICBjYXNlIENNRF9QTEFZOgorICAgICAgcmV0dXJuICJQTEFZIjsKKyAgICBjYXNlIENNRF9QQVVTRToKKyAgICAgIHJldHVybiAiUEFVU0UiOworICAgIGNhc2UgQ01EX0NMT1NFOgorICAgICAgcmV0dXJuICJDTE9TRSI7CisgICAgY2FzZSBDTURfV0FJVDoKKyAgICAgIHJldHVybiAiV0FJVCI7CisgICAgY2FzZSBDTURfUkVDT05ORUNUOgorICAgICAgcmV0dXJuICJSRUNPTk5FQ1QiOworICAgIGNhc2UgQ01EX0xPT1A6CisgICAgICByZXR1cm4gIkxPT1AiOworICB9CisKKyAgcmV0dXJuICJ1bmtub3duIjsKK30KKyNlbmRpZgorCitzdGF0aWMgZ2Jvb2xlYW4KK2RlZmF1bHRfc2VsZWN0X3N0cmVhbSAoR3N0UlRTUFNyYyAqIHNyYywgZ3VpbnQgaWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJkZWZhdWx0IGhhbmRsZXIiKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorc2VsZWN0X3N0cmVhbV9hY2N1bSAoR1NpZ25hbEludm9jYXRpb25IaW50ICogaWhpbnQsCisgICAgR1ZhbHVlICogcmV0dXJuX2FjY3UsIGNvbnN0IEdWYWx1ZSAqIGhhbmRsZXJfcmV0dXJuLCBncG9pbnRlciBkYXRhKQoreworICBnYm9vbGVhbiBteWJvb2xlYW47CisKKyAgbXlib29sZWFuID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAoaGFuZGxlcl9yZXR1cm4pOworICBHU1RfREVCVUcgKCJhY2N1bSAlZCIsIG15Ym9vbGVhbik7CisgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHJldHVybl9hY2N1LCBteWJvb2xlYW4pOworCisgIC8qIHN0b3AgZW1pc3Npb24gaWYgRkFMU0UgKi8KKyAgcmV0dXJuIG15Ym9vbGVhbjsKK30KKworc3RhdGljIGdib29sZWFuCitkZWZhdWx0X2JlZm9yZV9zZW5kIChHc3RSVFNQU3JjICogc3JjLCBHc3RSVFNQTWVzc2FnZSAqIG1zZykKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZGVmYXVsdCBoYW5kbGVyIik7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2JlZm9yZV9zZW5kX2FjY3VtIChHU2lnbmFsSW52b2NhdGlvbkhpbnQgKiBpaGludCwKKyAgICBHVmFsdWUgKiByZXR1cm5fYWNjdSwgY29uc3QgR1ZhbHVlICogaGFuZGxlcl9yZXR1cm4sIGdwb2ludGVyIGRhdGEpCit7CisgIGdib29sZWFuIG15Ym9vbGVhbjsKKworICBteWJvb2xlYW4gPSBnX3ZhbHVlX2dldF9ib29sZWFuIChoYW5kbGVyX3JldHVybik7CisgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHJldHVybl9hY2N1LCBteWJvb2xlYW4pOworCisgIC8qIHByZXZlbnQgc2VuZCBpZiBGQUxTRSAqLworICByZXR1cm4gbXlib29sZWFuOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfY2xhc3NfaW5pdCAoR3N0UlRTUFNyY0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RCaW5DbGFzcyAqZ3N0YmluX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YmluX2NsYXNzID0gKEdzdEJpbkNsYXNzICopIGtsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHNwc3JjX2RlYnVnLCAicnRzcHNyYyIsIDAsICJSVFNQIHNyYyIpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9ydHNwc3JjX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3J0c3BzcmNfZ2V0X3Byb3BlcnR5OworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0c3BzcmNfZmluYWxpemU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9MT0NBVElPTiwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJsb2NhdGlvbiIsICJSVFNQIExvY2F0aW9uIiwKKyAgICAgICAgICAiTG9jYXRpb24gb2YgdGhlIFJUU1AgdXJsIHRvIHJlYWQiLAorICAgICAgICAgIERFRkFVTFRfTE9DQVRJT04sIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUFJPVE9DT0xTLAorICAgICAgZ19wYXJhbV9zcGVjX2ZsYWdzICgicHJvdG9jb2xzIiwgIlByb3RvY29scyIsCisgICAgICAgICAgIkFsbG93ZWQgbG93ZXIgdHJhbnNwb3J0IHByb3RvY29scyIsIEdTVF9UWVBFX1JUU1BfTE9XRVJfVFJBTlMsCisgICAgICAgICAgREVGQVVMVF9QUk9UT0NPTFMsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfREVCVUcsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImRlYnVnIiwgIkRlYnVnIiwKKyAgICAgICAgICAiRHVtcCByZXF1ZXN0IGFuZCByZXNwb25zZSBtZXNzYWdlcyB0byBzdGRvdXQiCisgICAgICAgICAgIihERVBSRUNBVEVEOiBQcmludGVkIGFsbCBSVFNQIG1lc3NhZ2UgdG8gZ3N0cmVhbWVyIGxvZyBhcyAnbG9nJyBsZXZlbCkiLAorICAgICAgICAgIERFRkFVTFRfREVCVUcsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR19QQVJBTV9ERVBSRUNBVEVEKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SRVRSWSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgicmV0cnkiLCAiUmV0cnkiLAorICAgICAgICAgICJNYXggbnVtYmVyIG9mIHJldHJpZXMgd2hlbiBhbGxvY2F0aW5nIFJUUCBwb3J0cy4iLAorICAgICAgICAgIDAsIEdfTUFYVUlOVDE2LCBERUZBVUxUX1JFVFJZLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVElNRU9VVCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJ0aW1lb3V0IiwgIlRpbWVvdXQiLAorICAgICAgICAgICJSZXRyeSBUQ1AgdHJhbnNwb3J0IGFmdGVyIFVEUCB0aW1lb3V0IG1pY3Jvc2Vjb25kcyAoMCA9IGRpc2FibGVkKSIsCisgICAgICAgICAgMCwgR19NQVhVSU5UNjQsIERFRkFVTFRfVElNRU9VVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RDUF9USU1FT1VULAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoInRjcC10aW1lb3V0IiwgIlRDUCBUaW1lb3V0IiwKKyAgICAgICAgICAiRmFpbCBhZnRlciB0aW1lb3V0IG1pY3Jvc2Vjb25kcyBvbiBUQ1AgY29ubmVjdGlvbnMgKDAgPSBkaXNhYmxlZCkiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVDY0LCBERUZBVUxUX1RDUF9USU1FT1VULAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTEFURU5DWSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibGF0ZW5jeSIsICJCdWZmZXIgbGF0ZW5jeSBpbiBtcyIsCisgICAgICAgICAgIkFtb3VudCBvZiBtcyB0byBidWZmZXIiLCAwLCBHX01BWFVJTlQsIERFRkFVTFRfTEFURU5DWV9NUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RST1BfT05fTEFURU5DWSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZHJvcC1vbi1sYXRlbmN5IiwKKyAgICAgICAgICAiRHJvcCBidWZmZXJzIHdoZW4gbWF4aW11bSBsYXRlbmN5IGlzIHJlYWNoZWQiLAorICAgICAgICAgICJUZWxscyB0aGUgaml0dGVyYnVmZmVyIHRvIG5ldmVyIGV4Y2VlZCB0aGUgZ2l2ZW4gbGF0ZW5jeSBpbiBzaXplIiwKKyAgICAgICAgICBERUZBVUxUX0RST1BfT05fTEFURU5DWSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DT05ORUNUSU9OX1NQRUVELAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoImNvbm5lY3Rpb24tc3BlZWQiLCAiQ29ubmVjdGlvbiBTcGVlZCIsCisgICAgICAgICAgIk5ldHdvcmsgY29ubmVjdGlvbiBzcGVlZCBpbiBrYnBzICgwID0gdW5rbm93bikiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVDY0IC8gMTAwMCwgREVGQVVMVF9DT05ORUNUSU9OX1NQRUVELAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTkFUX01FVEhPRCwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgibmF0LW1ldGhvZCIsICJOQVQgTWV0aG9kIiwKKyAgICAgICAgICAiTWV0aG9kIHRvIHVzZSBmb3IgdHJhdmVyc2luZyBmaXJld2FsbHMgYW5kIE5BVCIsCisgICAgICAgICAgR1NUX1RZUEVfUlRTUF9OQVRfTUVUSE9ELCBERUZBVUxUX05BVF9NRVRIT0QsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFJUU1BTcmM6ZG8tcnRjcDoKKyAgICoKKyAgICogRW5hYmxlIFJUQ1Agc3VwcG9ydC4gU29tZSBvbGQgc2VydmVyIGRvbid0IGxpa2UgUlRDUCBhbmQgdGhlbiB0aGlzIHByb3BlcnR5CisgICAqIG5lZWRzIHRvIGJlIHNldCB0byBGQUxTRS4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRE9fUlRDUCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZG8tcnRjcCIsICJEbyBSVENQIiwKKyAgICAgICAgICAiU2VuZCBSVENQIHBhY2tldHMsIGRpc2FibGUgZm9yIG9sZCBpbmNvbXBhdGlibGUgc2VydmVyLiIsCisgICAgICAgICAgREVGQVVMVF9ET19SVENQLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UlRTUFNyYzpkby1ydHNwLWtlZXAtYWxpdmU6CisgICAqCisgICAqIEVuYWJsZSBSVFNQIGtlZXAgYWxpdmUgc3VwcG9ydC4gU29tZSBvbGQgc2VydmVyIGRvbid0IGxpa2UgUlRTUAorICAgKiBrZWVwIGFsaXZlIGFuZCB0aGVuIHRoaXMgcHJvcGVydHkgbmVlZHMgdG8gYmUgc2V0IHRvIEZBTFNFLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ET19SVFNQX0tFRVBfQUxJVkUsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImRvLXJ0c3Ata2VlcC1hbGl2ZSIsICJEbyBSVFNQIEtlZXAgQWxpdmUiLAorICAgICAgICAgICJTZW5kIFJUU1Aga2VlcCBhbGl2ZSBwYWNrZXRzLCBkaXNhYmxlIGZvciBvbGQgaW5jb21wYXRpYmxlIHNlcnZlci4iLAorICAgICAgICAgIERFRkFVTFRfRE9fUlRTUF9LRUVQX0FMSVZFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSVFNQU3JjOnByb3h5OgorICAgKgorICAgKiBTZXQgdGhlIHByb3h5IHBhcmFtZXRlcnMuIFRoaXMgaGFzIHRvIGJlIGEgc3RyaW5nIG9mIHRoZSBmb3JtYXQKKyAgICogW2h0dHA6Ly9dW3VzZXI6cGFzc3dkQF1ob3N0Wzpwb3J0XS4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUFJPWFksCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgicHJveHkiLCAiUHJveHkiLAorICAgICAgICAgICJQcm94eSBzZXR0aW5ncyBmb3IgSFRUUCB0dW5uZWxpbmcuIEZvcm1hdDogW2h0dHA6Ly9dW3VzZXI6cGFzc3dkQF1ob3N0Wzpwb3J0XSIsCisgICAgICAgICAgREVGQVVMVF9QUk9YWSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RSVFNQU3JjOnByb3h5LWlkOgorICAgKgorICAgKiBTZXRzIHRoZSBwcm94eSBVUkkgdXNlciBpZCBmb3IgYXV0aGVudGljYXRpb24uIElmIHRoZSBVUkkgc2V0IHZpYSB0aGUKKyAgICogInByb3h5IiBwcm9wZXJ0eSBjb250YWlucyBhIHVzZXItaWQgYWxyZWFkeSwgdGhhdCB3aWxsIHRha2UgcHJlY2VkZW5jZS4KKyAgICoKKyAgICogU2luY2U6IDEuMgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QUk9YWV9JRCwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJwcm94eS1pZCIsICJwcm94eS1pZCIsCisgICAgICAgICAgIkhUVFAgcHJveHkgVVJJIHVzZXIgaWQgZm9yIGF1dGhlbnRpY2F0aW9uIiwgIiIsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RSVFNQU3JjOnByb3h5LXB3OgorICAgKgorICAgKiBTZXRzIHRoZSBwcm94eSBVUkkgcGFzc3dvcmQgZm9yIGF1dGhlbnRpY2F0aW9uLiBJZiB0aGUgVVJJIHNldCB2aWEgdGhlCisgICAqICJwcm94eSIgcHJvcGVydHkgY29udGFpbnMgYSBwYXNzd29yZCBhbHJlYWR5LCB0aGF0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLgorICAgKgorICAgKiBTaW5jZTogMS4yCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BST1hZX1BXLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInByb3h5LXB3IiwgInByb3h5LXB3IiwKKyAgICAgICAgICAiSFRUUCBwcm94eSBVUkkgdXNlciBwYXNzd29yZCBmb3IgYXV0aGVudGljYXRpb24iLCAiIiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UlRTUFNyYzpydHAtYmxvY2tzaXplOgorICAgKgorICAgKiBSVFAgcGFja2FnZSBzaXplIHRvIHN1Z2dlc3QgdG8gc2VydmVyLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SVFBfQkxPQ0tTSVpFLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJydHAtYmxvY2tzaXplIiwgIlJUUCBCbG9ja3NpemUiLAorICAgICAgICAgICJSVFAgcGFja2FnZSBzaXplIHRvIHN1Z2dlc3QgdG8gc2VydmVyICgwID0gZGlzYWJsZWQpIiwKKyAgICAgICAgICAwLCA2NTUzNiwgREVGQVVMVF9SVFBfQkxPQ0tTSVpFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1VTRVJfSUQsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgidXNlci1pZCIsICJ1c2VyLWlkIiwKKyAgICAgICAgICAiUlRTUCBsb2NhdGlvbiBVUkkgdXNlciBpZCBmb3IgYXV0aGVudGljYXRpb24iLCBERUZBVUxUX1VTRVJfSUQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVVNFUl9QVywKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJ1c2VyLXB3IiwgInVzZXItcHciLAorICAgICAgICAgICJSVFNQIGxvY2F0aW9uIFVSSSB1c2VyIHBhc3N3b3JkIGZvciBhdXRoZW50aWNhdGlvbiIsIERFRkFVTFRfVVNFUl9QVywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UlRTUFNyYzpidWZmZXItbW9kZToKKyAgICoKKyAgICogQ29udHJvbCB0aGUgYnVmZmVyaW5nIGFuZCB0aW1lc3RhbXBpbmcgbW9kZSB1c2VkIGJ5IHRoZSBqaXR0ZXJidWZmZXIuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0JVRkZFUl9NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJidWZmZXItbW9kZSIsICJCdWZmZXIgTW9kZSIsCisgICAgICAgICAgIkNvbnRyb2wgdGhlIGJ1ZmZlcmluZyBhbGdvcml0aG0gaW4gdXNlIiwKKyAgICAgICAgICBHU1RfVFlQRV9SVFNQX1NSQ19CVUZGRVJfTU9ERSwgREVGQVVMVF9CVUZGRVJfTU9ERSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UlRTUFNyYzpwb3J0LXJhbmdlOgorICAgKgorICAgKiBDb25maWd1cmUgdGhlIGNsaWVudCBwb3J0IG51bWJlcnMgdGhhdCBjYW4gYmUgdXNlZCB0byByZWNpZXZlIFJUUCBhbmQKKyAgICogUlRDUC4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUE9SVF9SQU5HRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJwb3J0LXJhbmdlIiwgIlBvcnQgcmFuZ2UiLAorICAgICAgICAgICJDbGllbnQgcG9ydCByYW5nZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlY2VpdmUgUlRQIGFuZCBSVENQIGRhdGEsICIKKyAgICAgICAgICAiZWcuIDMwMDAtMzAwNSAoTlVMTCA9IG5vIHJlc3RyaWN0aW9ucykiLCBERUZBVUxUX1BPUlRfUkFOR0UsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFJUU1BTcmM6dWRwLWJ1ZmZlci1zaXplOgorICAgKgorICAgKiBTaXplIG9mIHRoZSBrZXJuZWwgVURQIHJlY2VpdmUgYnVmZmVyIGluIGJ5dGVzLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9VRFBfQlVGRkVSX1NJWkUsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgidWRwLWJ1ZmZlci1zaXplIiwgIlVEUCBCdWZmZXIgU2l6ZSIsCisgICAgICAgICAgIlNpemUgb2YgdGhlIGtlcm5lbCBVRFAgcmVjZWl2ZSBidWZmZXIgaW4gYnl0ZXMsIDA9ZGVmYXVsdCIsCisgICAgICAgICAgMCwgR19NQVhJTlQsIERFRkFVTFRfVURQX0JVRkZFUl9TSVpFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSVFNQU3JjOnNob3J0LWhlYWRlcjoKKyAgICoKKyAgICogT25seSBzZW5kIHRoZSBiYXNpYyBSVFNQIGhlYWRlcnMgZm9yIGJyb2tlbiBlbmNvZGVycy4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU0hPUlRfSEVBREVSLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJzaG9ydC1oZWFkZXIiLCAiU2hvcnQgSGVhZGVyIiwKKyAgICAgICAgICAiT25seSBzZW5kIHRoZSBiYXNpYyBSVFNQIGhlYWRlcnMgZm9yIGJyb2tlbiBlbmNvZGVycyIsCisgICAgICAgICAgREVGQVVMVF9TSE9SVF9IRUFERVIsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUFJPQkFUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJwcm9iYXRpb24iLCAiTnVtYmVyIG9mIHByb2JhdGlvbnMiLAorICAgICAgICAgICJDb25zZWN1dGl2ZSBwYWNrZXQgc2VxdWVuY2UgbnVtYmVycyB0byBhY2NlcHQgdGhlIHNvdXJjZSIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCBERUZBVUxUX1BST0JBVElPTiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1VEUF9SRUNPTk5FQ1QsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInVkcC1yZWNvbm5lY3QiLCAiUmVjb25uZWN0IHRvIHRoZSBzZXJ2ZXIiLAorICAgICAgICAgICJSZWNvbm5lY3QgdG8gdGhlIHNlcnZlciBpZiBSVFNQIGNvbm5lY3Rpb24gaXMgY2xvc2VkIHdoZW4gZG9pbmcgVURQIiwKKyAgICAgICAgICBERUZBVUxUX1VEUF9SRUNPTk5FQ1QsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTVVMVElDQVNUX0lGQUNFLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoIm11bHRpY2FzdC1pZmFjZSIsICJNdWx0aWNhc3QgSW50ZXJmYWNlIiwKKyAgICAgICAgICAiVGhlIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHdoaWNoIHRvIGpvaW4gdGhlIG11bHRpY2FzdCBncm91cCIsCisgICAgICAgICAgREVGQVVMVF9NVUxUSUNBU1RfSUZBQ0UsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTlRQX1NZTkMsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoIm50cC1zeW5jIiwgIlN5bmMgb24gTlRQIGNsb2NrIiwKKyAgICAgICAgICAiU3luY2hyb25pemUgcmVjZWl2ZWQgc3RyZWFtcyB0byB0aGUgTlRQIGNsb2NrIiwgREVGQVVMVF9OVFBfU1lOQywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1VTRV9QSVBFTElORV9DTE9DSywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgidXNlLXBpcGVsaW5lLWNsb2NrIiwgIlVzZSBwaXBlbGluZSBjbG9jayIsCisgICAgICAgICAgIlVzZSB0aGUgcGlwZWxpbmUgcnVubmluZy10aW1lIHRvIHNldCB0aGUgTlRQIHRpbWUgaW4gdGhlIFJUQ1AgU1IgbWVzc2FnZXMiCisgICAgICAgICAgIihERVBSRUNBVEVEOiBVc2UgbnRwLXRpbWUtc291cmNlIHByb3BlcnR5KSIsCisgICAgICAgICAgREVGQVVMVF9VU0VfUElQRUxJTkVfQ0xPQ0ssCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR19QQVJBTV9ERVBSRUNBVEVEKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TREVTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgic2RlcyIsICJTREVTIiwKKyAgICAgICAgICAiVGhlIFNERVMgaXRlbXMgb2YgdGhpcyBzZXNzaW9uIiwKKyAgICAgICAgICBHU1RfVFlQRV9TVFJVQ1RVUkUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSVFNQU3JjOjp0bHMtdmFsaWRhdGlvbi1mbGFnczoKKyAgICoKKyAgICogVExTIGNlcnRpZmljYXRlIHZhbGlkYXRpb24gZmxhZ3MgdXNlZCB0byB2YWxpZGF0ZSBzZXJ2ZXIKKyAgICogY2VydGlmaWNhdGUuCisgICAqCisgICAqIFNpbmNlOiAxLjIuMQorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UTFNfVkFMSURBVElPTl9GTEFHUywKKyAgICAgIGdfcGFyYW1fc3BlY19mbGFncyAoInRscy12YWxpZGF0aW9uLWZsYWdzIiwgIlRMUyB2YWxpZGF0aW9uIGZsYWdzIiwKKyAgICAgICAgICAiVExTIGNlcnRpZmljYXRlIHZhbGlkYXRpb24gZmxhZ3MgdXNlZCB0byB2YWxpZGF0ZSB0aGUgc2VydmVyIGNlcnRpZmljYXRlIiwKKyAgICAgICAgICBHX1RZUEVfVExTX0NFUlRJRklDQVRFX0ZMQUdTLCBERUZBVUxUX1RMU19WQUxJREFUSU9OX0ZMQUdTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSVFNQU3JjOjp0bHMtZGF0YWJhc2U6CisgICAqCisgICAqIFRMUyBkYXRhYmFzZSB3aXRoIGFuY2hvciBjZXJ0aWZpY2F0ZSBhdXRob3JpdGllcyB1c2VkIHRvIHZhbGlkYXRlCisgICAqIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUuCisgICAqCisgICAqIFNpbmNlOiAxLjQKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVExTX0RBVEFCQVNFLAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoInRscy1kYXRhYmFzZSIsICJUTFMgZGF0YWJhc2UiLAorICAgICAgICAgICJUTFMgZGF0YWJhc2Ugd2l0aCBhbmNob3IgY2VydGlmaWNhdGUgYXV0aG9yaXRpZXMgdXNlZCB0byB2YWxpZGF0ZSB0aGUgc2VydmVyIGNlcnRpZmljYXRlIiwKKyAgICAgICAgICBHX1RZUEVfVExTX0RBVEFCQVNFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UlRTUFNyYzo6dGxzLWludGVyYWN0aW9uOgorICAgKgorICAgKiBBICNHVGxzSW50ZXJhY3Rpb24gb2JqZWN0IHRvIGJlIHVzZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBvciBjZXJ0aWZpY2F0ZQorICAgKiBkYXRhYmFzZSBuZWVkIHRvIGludGVyYWN0IHdpdGggdGhlIHVzZXIuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIHByb21wdCB0aGUKKyAgICogdXNlciBmb3IgcGFzc3dvcmRzIHdoZXJlIG5lY2Vzc2FyeS4KKyAgICoKKyAgICogU2luY2U6IDEuNgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UTFNfSU5URVJBQ1RJT04sCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgidGxzLWludGVyYWN0aW9uIiwgIlRMUyBpbnRlcmFjdGlvbiIsCisgICAgICAgICAgIkEgR1Rsc0ludGVyYWN0aW9uIG9iamVjdCB0byBwcm9tdCB0aGUgdXNlciBmb3IgcGFzc3dvcmQgb3IgY2VydGlmaWNhdGUiLAorICAgICAgICAgIEdfVFlQRV9UTFNfSU5URVJBQ1RJT04sIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSVFNQU3JjOjpkby1yZXRyYW5zbWlzc2lvbjoKKyAgICoKKyAgICogQXR0ZW1wdCB0byBhc2sgdGhlIHNlcnZlciB0byByZXRyYW5zbWl0IGxvc3QgcGFja2V0cyBhY2NvcmRpbmcgdG8gUkZDNDU4OC4KKyAgICoKKyAgICogTm90ZTogY3VycmVudGx5IG9ubHkgd29ya3Mgd2l0aCBTU1JDLW11bHRpcGxleGVkIHJldHJhbnNtaXNzaW9uIHN0cmVhbXMKKyAgICoKKyAgICogU2luY2U6IDEuNgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ET19SRVRSQU5TTUlTU0lPTiwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZG8tcmV0cmFuc21pc3Npb24iLCAiUmV0cmFuc21pc3Npb24iLAorICAgICAgICAgICJBc2sgdGhlIHNlcnZlciB0byByZXRyYW5zbWl0IGxvc3QgcGFja2V0cyIsCisgICAgICAgICAgREVGQVVMVF9ET19SRVRSQU5TTUlTU0lPTiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UlRTUFNyYzo6bnRwLXRpbWUtc291cmNlOgorICAgKgorICAgKiBhbGxvd3MgdG8gc2VsZWN0IHRoZSB0aW1lIHNvdXJjZSB0aGF0IHNob3VsZCBiZSB1c2VkCisgICAqIGZvciB0aGUgTlRQIHRpbWUgaW4gUlRDUCBwYWNrZXRzCisgICAqCisgICAqIFNpbmNlOiAxLjYKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTlRQX1RJTUVfU09VUkNFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJudHAtdGltZS1zb3VyY2UiLCAiTlRQIFRpbWUgU291cmNlIiwKKyAgICAgICAgICAiTlRQIHRpbWUgc291cmNlIGZvciBSVENQIHBhY2tldHMiLAorICAgICAgICAgIEdTVF9UWVBFX1JUU1BfU1JDX05UUF9USU1FX1NPVVJDRSwgREVGQVVMVF9OVFBfVElNRV9TT1VSQ0UsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFJUU1BTcmM6OnVzZXItYWdlbnQ6CisgICAqCisgICAqIFRoZSBzdHJpbmcgdG8gc2V0IGluIHRoZSBVc2VyLUFnZW50IGhlYWRlci4KKyAgICoKKyAgICogU2luY2U6IDEuNgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9VU0VSX0FHRU5ULAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInVzZXItYWdlbnQiLCAiVXNlciBBZ2VudCIsCisgICAgICAgICAgIlRoZSBVc2VyLUFnZW50IHN0cmluZyB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIiLAorICAgICAgICAgIERFRkFVTFRfVVNFUl9BR0VOVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoIm1heC1ydGNwLXJ0cC10aW1lLWRpZmYiLCAiTWF4IFJUQ1AgUlRQIFRpbWUgRGlmZiIsCisgICAgICAgICAgIk1heGltdW0gYW1vdW50IG9mIHRpbWUgaW4gbXMgdGhhdCB0aGUgUlRQIHRpbWUgaW4gUlRDUCBTUnMgIgorICAgICAgICAgICJpcyBhbGxvd2VkIHRvIGJlIGFoZWFkICgtMSBkaXNhYmxlZCkiLCAtMSwgR19NQVhJTlQsCisgICAgICAgICAgREVGQVVMVF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkZDNzI3M19TWU5DLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJyZmM3MjczLXN5bmMiLCAiU3luYyBvbiBSRkM3MjczIGNsb2NrIiwKKyAgICAgICAgICAiU3luY2hyb25pemUgcmVjZWl2ZWQgc3RyZWFtcyB0byB0aGUgUkZDNzI3MyBjbG9jayAiCisgICAgICAgICAgIihyZXF1aXJlcyBjbG9jayBhbmQgb2Zmc2V0IHRvIGJlIHByb3ZpZGVkKSIsIERFRkFVTFRfUkZDNzI3M19TWU5DLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSVFNQU3JjOmRlZmF1bHQtcnRzcC12ZXJzaW9uOgorICAgKgorICAgKiBUaGUgcHJlZmVycmVkIFJUU1AgdmVyc2lvbiB0byB1c2Ugd2hpbGUgbmVnb3RpYXRpbmcgdGhlIHZlcnNpb24gd2l0aCB0aGUgc2VydmVyLgorICAgKgorICAgKiBTaW5jZTogMS4xNAorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ERUZBVUxUX1ZFUlNJT04sCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoImRlZmF1bHQtcnRzcC12ZXJzaW9uIiwKKyAgICAgICAgICAiVGhlIFJUU1AgdmVyc2lvbiB0byB0cnkgZmlyc3QiLAorICAgICAgICAgICJUaGUgUlRTUCB2ZXJzaW9uIHRoYXQgc2hvdWxkIGJlIHRyaWVkIGZpcnN0IHdoZW4gbmVnb3RpYXRpbmcgdmVyc2lvbi4iLAorICAgICAgICAgIEdTVF9UWVBFX1JUU1BfVkVSU0lPTiwgREVGQVVMVF9WRVJTSU9OLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSVFNQU3JjOm1heC10cy1vZmZzZXQtYWRqdXN0bWVudDoKKyAgICoKKyAgICogU3luY2luZyB0aW1lIHN0YW1wcyB0byBOVFAgdGltZSBhZGRzIGEgdGltZSBvZmZzZXQuIFRoaXMgcGFyYW1ldGVyCisgICAqIHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbmFub3NlY29uZHMgcGVyIGZyYW1lIHRoYXQgdGhpcyB0aW1lIG9mZnNldAorICAgKiBtYXkgYmUgYWRqdXN0ZWQgd2l0aC4gVGhpcyBpcyB1c2VkIHRvIGF2b2lkIHN1ZGRlbiBsYXJnZSBjaGFuZ2VzIHRvIHRpbWUKKyAgICogc3RhbXBzLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfVFNfT0ZGU0VUX0FESlVTVE1FTlQsCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgibWF4LXRzLW9mZnNldC1hZGp1c3RtZW50IiwKKyAgICAgICAgICAiTWF4IFRpbWVzdGFtcCBPZmZzZXQgQWRqdXN0bWVudCIsCisgICAgICAgICAgIlRoZSBtYXhpbXVtIG51bWJlciBvZiBuYW5vc2Vjb25kcyBwZXIgZnJhbWUgdGhhdCB0aW1lIHN0YW1wIG9mZnNldHMgIgorICAgICAgICAgICJtYXkgYmUgYWRqdXN0ZWQgKDAgPSBubyBsaW1pdCkuIiwgMCwgR19NQVhVSU5UNjQsCisgICAgICAgICAgREVGQVVMVF9NQVhfVFNfT0ZGU0VUX0FESlVTVE1FTlQsIEdfUEFSQU1fUkVBRFdSSVRFIHwKKyAgICAgICAgICBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjptYXgtdHMtb2Zmc2V0OgorICAgKgorICAgKiBVc2VkIHRvIHNldCBhbiB1cHBlciBsaW1pdCBvZiBob3cgbGFyZ2UgYSB0aW1lIG9mZnNldCBtYXkgYmUuIFRoaXMKKyAgICogaXMgdXNlZCB0byBwcm90ZWN0IGFnYWluc3QgdW5yZWFsaXN0aWMgdmFsdWVzIGFzIGEgcmVzdWx0IG9mIGVpdGhlcgorICAgKiBjbGllbnQsc2VydmVyIG9yIGNsb2NrIGlzc3Vlcy4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX1RTX09GRlNFVCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQ2NCAoIm1heC10cy1vZmZzZXQiLCAiTWF4IFRTIE9mZnNldCIsCisgICAgICAgICAgIlRoZSBtYXhpbXVtIGFic29sdXRlIHZhbHVlIG9mIHRoZSB0aW1lIG9mZnNldCBpbiAobmFub3NlY29uZHMpLiAiCisgICAgICAgICAgIk5vdGUsIGlmIHRoZSBudHAtc3luYyBwYXJhbWV0ZXIgaXMgc2V0IHRoZSBkZWZhdWx0IHZhbHVlIGlzICIKKyAgICAgICAgICAiY2hhbmdlZCB0byAwIChubyBsaW1pdCkiLCAwLCBHX01BWElOVDY0LCBERUZBVUxUX01BWF9UU19PRkZTRVQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFJUU1BTcmM6OmhhbmRsZS1yZXF1ZXN0OgorICAgKiBAcnRzcHNyYzogYSAjR3N0UlRTUFNyYworICAgKiBAcmVxdWVzdDogYSAjR3N0UlRTUE1lc3NhZ2UKKyAgICogQHJlc3BvbnNlOiBhICNHc3RSVFNQTWVzc2FnZQorICAgKgorICAgKiBIYW5kbGUgYSBzZXJ2ZXIgcmVxdWVzdCBpbiBAcmVxdWVzdCBhbmQgcHJlcGFyZSBAcmVzcG9uc2UuCisgICAqCisgICAqIFRoaXMgc2lnbmFsIGlzIGNhbGxlZCBmcm9tIHRoZSBzdHJlYW1pbmcgdGhyZWFkLCB5b3Ugc2hvdWxkIHRoZXJlZm9yZSBub3QKKyAgICogZG8gYW55IHN0YXRlIGNoYW5nZXMgb24gQHJ0c3BzcmMgYmVjYXVzZSB0aGlzIG1pZ2h0IGRlYWRsb2NrLiBJZiB5b3Ugd2FudAorICAgKiB0byBtb2RpZnkgdGhlIHN0YXRlIGFzIGEgcmVzdWx0IG9mIHRoaXMgc2lnbmFsLCBwb3N0IGEKKyAgICogI0dTVF9NRVNTQUdFX1JFUVVFU1RfU1RBVEUgbWVzc2FnZSBvbiB0aGUgYnVzIG9yIHNpZ25hbCB0aGUgbWFpbiB0aHJlYWQKKyAgICogaW4gc29tZSBvdGhlciB3YXkuCisgICAqCisgICAqIFNpbmNlOiAxLjIKKyAgICovCisgIGdzdF9ydHNwc3JjX3NpZ25hbHNbU0lHTkFMX0hBTkRMRV9SRVFVRVNUXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJoYW5kbGUtcmVxdWVzdCIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksIDAsCisgICAgICAwLCBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR19UWVBFX05PTkUsIDIsCisgICAgICBHX1RZUEVfUE9JTlRFUiwgR19UWVBFX1BPSU5URVIpOworCisgIC8qKgorICAgKiBHc3RSVFNQU3JjOjpvbi1zZHA6CisgICAqIEBydHNwc3JjOiBhICNHc3RSVFNQU3JjCisgICAqIEBzZHA6IGEgI0dzdFNEUE1lc3NhZ2UKKyAgICoKKyAgICogRW1pdGVkIHdoZW4gdGhlIGNsaWVudCBoYXMgcmV0cmlldmVkIHRoZSBTRFAgYW5kIGJlZm9yZSBpdCBjb25maWd1cmVzIHRoZQorICAgKiBzdHJlYW1zIGluIHRoZSBTRFAuIEBzZHAgY2FuIGJlIGluc3BlY3RlZCBhbmQgbW9kaWZpZWQuCisgICAqCisgICAqIFRoaXMgc2lnbmFsIGlzIGNhbGxlZCBmcm9tIHRoZSBzdHJlYW1pbmcgdGhyZWFkLCB5b3Ugc2hvdWxkIHRoZXJlZm9yZSBub3QKKyAgICogZG8gYW55IHN0YXRlIGNoYW5nZXMgb24gQHJ0c3BzcmMgYmVjYXVzZSB0aGlzIG1pZ2h0IGRlYWRsb2NrLiBJZiB5b3Ugd2FudAorICAgKiB0byBtb2RpZnkgdGhlIHN0YXRlIGFzIGEgcmVzdWx0IG9mIHRoaXMgc2lnbmFsLCBwb3N0IGEKKyAgICogI0dTVF9NRVNTQUdFX1JFUVVFU1RfU1RBVEUgbWVzc2FnZSBvbiB0aGUgYnVzIG9yIHNpZ25hbCB0aGUgbWFpbiB0aHJlYWQKKyAgICogaW4gc29tZSBvdGhlciB3YXkuCisgICAqCisgICAqIFNpbmNlOiAxLjIKKyAgICovCisgIGdzdF9ydHNwc3JjX3NpZ25hbHNbU0lHTkFMX09OX1NEUF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tc2RwIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwgMCwKKyAgICAgIDAsIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMSwKKyAgICAgIEdTVF9UWVBFX1NEUF9NRVNTQUdFIHwgR19TSUdOQUxfVFlQRV9TVEFUSUNfU0NPUEUpOworCisgIC8qKgorICAgKiBHc3RSVFNQU3JjOjpzZWxlY3Qtc3RyZWFtOgorICAgKiBAcnRzcHNyYzogYSAjR3N0UlRTUFNyYworICAgKiBAbnVtOiB0aGUgc3RyZWFtIG51bWJlcgorICAgKiBAY2FwczogdGhlIHN0cmVhbSBjYXBzCisgICAqCisgICAqIEVtaXRlZCBiZWZvcmUgdGhlIGNsaWVudCBkZWNpZGVzIHRvIGNvbmZpZ3VyZSB0aGUgc3RyZWFtIEBudW0gd2l0aAorICAgKiBAY2Fwcy4KKyAgICoKKyAgICogUmV0dXJuczogJVRSVUUgd2hlbiB0aGUgc3RyZWFtIHNob3VsZCBiZSBzZWxlY3RlZCwgJUZBTFNFIHdoZW4gdGhlIHN0cmVhbQorICAgKiBpcyB0byBiZSBpZ25vcmVkLgorICAgKgorICAgKiBTaW5jZTogMS4yCisgICAqLworICBnc3RfcnRzcHNyY19zaWduYWxzW1NJR05BTF9TRUxFQ1RfU1RSRUFNXSA9CisgICAgICBnX3NpZ25hbF9uZXdfY2xhc3NfaGFuZGxlciAoInNlbGVjdC1zdHJlYW0iLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0ZJUlNUIHwgR19TSUdOQUxfUlVOX0NMRUFOVVAsCisgICAgICAoR0NhbGxiYWNrKSBkZWZhdWx0X3NlbGVjdF9zdHJlYW0sIHNlbGVjdF9zdHJlYW1fYWNjdW0sIE5VTEwsCisgICAgICBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR19UWVBFX0JPT0xFQU4sIDIsIEdfVFlQRV9VSU5ULAorICAgICAgR1NUX1RZUEVfQ0FQUyk7CisgIC8qKgorICAgKiBHc3RSVFNQU3JjOjpuZXctbWFuYWdlcjoKKyAgICogQHJ0c3BzcmM6IGEgI0dzdFJUU1BTcmMKKyAgICogQG1hbmFnZXI6IGEgI0dzdEVsZW1lbnQKKyAgICoKKyAgICogRW1pdGVkIGFmdGVyIGEgbmV3IG1hbmFnZXIgKGxpa2UgcnRwYmluKSB3YXMgY3JlYXRlZCBhbmQgdGhlIGRlZmF1bHQKKyAgICogcHJvcGVydGllcyB3ZXJlIGNvbmZpZ3VyZWQuCisgICAqCisgICAqIFNpbmNlOiAxLjQKKyAgICovCisgIGdzdF9ydHNwc3JjX3NpZ25hbHNbU0lHTkFMX05FV19NQU5BR0VSXSA9CisgICAgICBnX3NpZ25hbF9uZXdfY2xhc3NfaGFuZGxlciAoIm5ldy1tYW5hZ2VyIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9GSVJTVCB8IEdfU0lHTkFMX1JVTl9DTEVBTlVQLCAwLCBOVUxMLCBOVUxMLAorICAgICAgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAxLCBHU1RfVFlQRV9FTEVNRU5UKTsKKworICAvKioKKyAgICogR3N0UlRTUFNyYzo6cmVxdWVzdC1ydGNwLWtleToKKyAgICogQHJ0c3BzcmM6IGEgI0dzdFJUU1BTcmMKKyAgICogQG51bTogdGhlIHN0cmVhbSBudW1iZXIKKyAgICoKKyAgICogU2lnbmFsIGVtaXRlZCB0byBnZXQgdGhlIGNyeXB0byBwYXJhbWV0ZXJzIHJlbGV2YW50IHRvIHRoZSBSVENQCisgICAqIHN0cmVhbS4gVXNlciBzaG91bGQgcHJvdmlkZSB0aGUga2V5IGFuZCB0aGUgUlRDUCBlbmNyeXB0aW9uIGNpcGhlcnMKKyAgICogYW5kIGF1dGhlbnRpY2F0aW9uLCBhbmQgcmV0dXJuIHRoZW0gd3JhcHBlZCBpbiBhIEdzdENhcHMuCisgICAqCisgICAqIFNpbmNlOiAxLjQKKyAgICovCisgIGdzdF9ydHNwc3JjX3NpZ25hbHNbU0lHTkFMX1JFUVVFU1RfUlRDUF9LRVldID0KKyAgICAgIGdfc2lnbmFsX25ldyAoInJlcXVlc3QtcnRjcC1rZXkiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIEdTVF9UWVBFX0NBUFMsIDEsIEdfVFlQRV9VSU5UKTsKKworICAvKioKKyAgICogR3N0UlRTUFNyYzo6YWNjZXB0LWNlcnRpZmljYXRlOgorICAgKiBAcnRzcHNyYzogYSAjR3N0UlRTUFNyYworICAgKiBAcGVlcl9jZXJ0OiB0aGUgcGVlcidzICNHVGxzQ2VydGlmaWNhdGUKKyAgICogQGVycm9yczogdGhlIHByb2JsZW1zIHdpdGggQHBlZXJfY2VydAorICAgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgc2V0IHdoZW4gdGhlIHNpZ25hbCBoYW5kbGVyIHdhcyBjb25uZWN0ZWQuCisgICAqCisgICAqIFRoaXMgd2lsbCBkaXJlY3RseSBtYXAgdG8gI0dUbHNDb25uZWN0aW9uICdzICJhY2NlcHQtY2VydGlmaWNhdGUiCisgICAqIHNpZ25hbCBhbmQgYmUgcGVyZm9ybWVkIGFmdGVyIHRoZSBkZWZhdWx0IGNoZWNrcyBvZiAjR3N0UlRTUENvbm5lY3Rpb24KKyAgICogKGNoZWNraW5nIGFnYWluc3QgdGhlICNHVGxzRGF0YWJhc2Ugd2l0aCB0aGUgZ2l2ZW4gI0dUbHNDZXJ0aWZpY2F0ZUZsYWdzKQorICAgKiBoYXZlIGZhaWxlZC4gSWYgbm8gI0dUbHNEYXRhYmFzZSBpcyBzZXQgb24gdGhpcyBjb25uZWN0aW9uLCBvbmx5IHRoaXMKKyAgICogc2lnbmFsIHdpbGwgYmUgZW1pdHRlZC4KKyAgICoKKyAgICogU2luY2U6IDEuMTQKKyAgICovCisgIGdzdF9ydHNwc3JjX3NpZ25hbHNbU0lHTkFMX0FDQ0VQVF9DRVJUSUZJQ0FURV0gPQorICAgICAgZ19zaWduYWxfbmV3ICgiYWNjZXB0LWNlcnRpZmljYXRlIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCAwLCBnX3NpZ25hbF9hY2N1bXVsYXRvcl90cnVlX2hhbmRsZWQsIE5VTEwsIE5VTEwsCisgICAgICBHX1RZUEVfQk9PTEVBTiwgMywgR19UWVBFX1RMU19DT05ORUNUSU9OLCBHX1RZUEVfVExTX0NFUlRJRklDQVRFLAorICAgICAgR19UWVBFX1RMU19DRVJUSUZJQ0FURV9GTEFHUyk7CisKKyAgLyoKKyAgICogR3N0UlRTUFNyYzo6YmVmb3JlLXNlbmQKKyAgICogQHJ0c3BzcmM6IGEgI0dzdFJUU1BTcmMKKyAgICogQG51bTogdGhlIHN0cmVhbSBudW1iZXIKKyAgICoKKyAgICogRW1pdHRlZCBiZWZvcmUgZWFjaCBSVFNQIHJlcXVlc3QgaXMgc2VudCwgaW4gb3JkZXIgdG8gYWxsb3cKKyAgICogdGhlIGFwcGxpY2F0aW9uIHRvIG1vZGlmeSBzZW5kIHBhcmFtZXRlcnMgb3IgdG8gc2tpcCB0aGUgbWVzc2FnZSBlbnRpcmVseS4KKyAgICogVGhpcyBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHdvcmsgd2l0aCBPTlZJRiBQcm9maWxlIEcgc2VydmVycywKKyAgICogd2hpY2ggbmVlZCBhIGRpZmZlcmVudC9hZGRpdGlvbmFsIHJhbmdlLCByYXRlLWNvbnRyb2wsIGFuZCBpbnRyYS94CisgICAqIHBhcmFtZXRlcnMuCisgICAqCisgICAqIFJldHVybnM6ICVUUlVFIHdoZW4gdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHNlbnQsICVGQUxTRSB3aGVuIHRoZQorICAgKiBjb21tYW5kIHNob3VsZCBiZSBkcm9wcGVkLgorICAgKgorICAgKiBTaW5jZTogMS4xNAorICAgKi8KKyAgZ3N0X3J0c3BzcmNfc2lnbmFsc1tTSUdOQUxfQkVGT1JFX1NFTkRdID0KKyAgICAgIGdfc2lnbmFsX25ld19jbGFzc19oYW5kbGVyICgiYmVmb3JlLXNlbmQiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0ZJUlNUIHwgR19TSUdOQUxfUlVOX0NMRUFOVVAsCisgICAgICAoR0NhbGxiYWNrKSBkZWZhdWx0X2JlZm9yZV9zZW5kLCBiZWZvcmVfc2VuZF9hY2N1bSwgTlVMTCwKKyAgICAgIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfQk9PTEVBTiwKKyAgICAgIDEsIEdTVF9UWVBFX1JUU1BfTUVTU0FHRSB8IEdfU0lHTkFMX1RZUEVfU1RBVElDX1NDT1BFKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5zZW5kX2V2ZW50ID0gZ3N0X3J0c3BzcmNfc2VuZF9ldmVudDsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cHJvdmlkZV9jbG9jayA9IGdzdF9ydHNwc3JjX3Byb3ZpZGVfY2xvY2s7CisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHNwc3JjX2NoYW5nZV9zdGF0ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnJ0cHRlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUU1AgcGFja2V0IHJlY2VpdmVyIiwgIlNvdXJjZS9OZXR3b3JrIiwKKyAgICAgICJSZWNlaXZlIGRhdGEgb3ZlciB0aGUgbmV0d29yayB2aWEgUlRTUCAoUkZDIDIzMjYpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPiwgIgorICAgICAgIlRoaWpzIFZlcm1laXIgPHRoaWpzLnZlcm1laXJAYmFyY28uY29tPiwgIgorICAgICAgIkx1dHogTXVlbGxlciA8bHV0ekB0b3Bmcm9zZS5kZT4iKTsKKworICBnc3RiaW5fY2xhc3MtPmhhbmRsZV9tZXNzYWdlID0gZ3N0X3J0c3BzcmNfaGFuZGxlX21lc3NhZ2U7CisKKyAgZ3N0X3J0c3BfZXh0X2xpc3RfaW5pdCAoKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX2luaXQgKEdzdFJUU1BTcmMgKiBzcmMpCit7CisgIHNyYy0+Y29ubmluZm8ubG9jYXRpb24gPSBnX3N0cmR1cCAoREVGQVVMVF9MT0NBVElPTik7CisgIHNyYy0+cHJvdG9jb2xzID0gREVGQVVMVF9QUk9UT0NPTFM7CisgIHNyYy0+ZGVidWcgPSBERUZBVUxUX0RFQlVHOworICBzcmMtPnJldHJ5ID0gREVGQVVMVF9SRVRSWTsKKyAgc3JjLT51ZHBfdGltZW91dCA9IERFRkFVTFRfVElNRU9VVDsKKyAgZ3N0X3J0c3BzcmNfc2V0X3RjcF90aW1lb3V0IChzcmMsIERFRkFVTFRfVENQX1RJTUVPVVQpOworICBzcmMtPmxhdGVuY3kgPSBERUZBVUxUX0xBVEVOQ1lfTVM7CisgIHNyYy0+ZHJvcF9vbl9sYXRlbmN5ID0gREVGQVVMVF9EUk9QX09OX0xBVEVOQ1k7CisgIHNyYy0+Y29ubmVjdGlvbl9zcGVlZCA9IERFRkFVTFRfQ09OTkVDVElPTl9TUEVFRDsKKyAgc3JjLT5uYXRfbWV0aG9kID0gREVGQVVMVF9OQVRfTUVUSE9EOworICBzcmMtPmRvX3J0Y3AgPSBERUZBVUxUX0RPX1JUQ1A7CisgIHNyYy0+ZG9fcnRzcF9rZWVwX2FsaXZlID0gREVGQVVMVF9ET19SVFNQX0tFRVBfQUxJVkU7CisgIGdzdF9ydHNwc3JjX3NldF9wcm94eSAoc3JjLCBERUZBVUxUX1BST1hZKTsKKyAgc3JjLT5ydHBfYmxvY2tzaXplID0gREVGQVVMVF9SVFBfQkxPQ0tTSVpFOworICBzcmMtPnVzZXJfaWQgPSBnX3N0cmR1cCAoREVGQVVMVF9VU0VSX0lEKTsKKyAgc3JjLT51c2VyX3B3ID0gZ19zdHJkdXAgKERFRkFVTFRfVVNFUl9QVyk7CisgIHNyYy0+YnVmZmVyX21vZGUgPSBERUZBVUxUX0JVRkZFUl9NT0RFOworICBzcmMtPmNsaWVudF9wb3J0X3JhbmdlLm1pbiA9IDA7CisgIHNyYy0+Y2xpZW50X3BvcnRfcmFuZ2UubWF4ID0gMDsKKyAgc3JjLT51ZHBfYnVmZmVyX3NpemUgPSBERUZBVUxUX1VEUF9CVUZGRVJfU0laRTsKKyAgc3JjLT5zaG9ydF9oZWFkZXIgPSBERUZBVUxUX1NIT1JUX0hFQURFUjsKKyAgc3JjLT5wcm9iYXRpb24gPSBERUZBVUxUX1BST0JBVElPTjsKKyAgc3JjLT51ZHBfcmVjb25uZWN0ID0gREVGQVVMVF9VRFBfUkVDT05ORUNUOworICBzcmMtPm11bHRpX2lmYWNlID0gZ19zdHJkdXAgKERFRkFVTFRfTVVMVElDQVNUX0lGQUNFKTsKKyAgc3JjLT5udHBfc3luYyA9IERFRkFVTFRfTlRQX1NZTkM7CisgIHNyYy0+dXNlX3BpcGVsaW5lX2Nsb2NrID0gREVGQVVMVF9VU0VfUElQRUxJTkVfQ0xPQ0s7CisgIHNyYy0+c2RlcyA9IE5VTEw7CisgIHNyYy0+dGxzX3ZhbGlkYXRpb25fZmxhZ3MgPSBERUZBVUxUX1RMU19WQUxJREFUSU9OX0ZMQUdTOworICBzcmMtPnRsc19kYXRhYmFzZSA9IERFRkFVTFRfVExTX0RBVEFCQVNFOworICBzcmMtPnRsc19pbnRlcmFjdGlvbiA9IERFRkFVTFRfVExTX0lOVEVSQUNUSU9OOworICBzcmMtPmRvX3JldHJhbnNtaXNzaW9uID0gREVGQVVMVF9ET19SRVRSQU5TTUlTU0lPTjsKKyAgc3JjLT5udHBfdGltZV9zb3VyY2UgPSBERUZBVUxUX05UUF9USU1FX1NPVVJDRTsKKyAgc3JjLT51c2VyX2FnZW50ID0gZ19zdHJkdXAgKERFRkFVTFRfVVNFUl9BR0VOVCk7CisgIHNyYy0+bWF4X3J0Y3BfcnRwX3RpbWVfZGlmZiA9IERFRkFVTFRfTUFYX1JUQ1BfUlRQX1RJTUVfRElGRjsKKyAgc3JjLT5yZmM3MjczX3N5bmMgPSBERUZBVUxUX1JGQzcyNzNfU1lOQzsKKyAgc3JjLT5tYXhfdHNfb2Zmc2V0X2FkanVzdG1lbnQgPSBERUZBVUxUX01BWF9UU19PRkZTRVRfQURKVVNUTUVOVDsKKyAgc3JjLT5tYXhfdHNfb2Zmc2V0ID0gREVGQVVMVF9NQVhfVFNfT0ZGU0VUOworICBzcmMtPm1heF90c19vZmZzZXRfaXNfc2V0ID0gRkFMU0U7CisgIHNyYy0+ZGVmYXVsdF92ZXJzaW9uID0gREVGQVVMVF9WRVJTSU9OOworICBzcmMtPnZlcnNpb24gPSBHU1RfUlRTUF9WRVJTSU9OX0lOVkFMSUQ7CisKKyAgLyogZ2V0IGEgbGlzdCBvZiBhbGwgZXh0ZW5zaW9ucyAqLworICBzcmMtPmV4dGVuc2lvbnMgPSBnc3RfcnRzcF9leHRfbGlzdF9nZXQgKCk7CisKKyAgLyogY29ubmVjdCB0byBzZW5kIHNpZ25hbCAqLworICBnc3RfcnRzcF9leHRfbGlzdF9jb25uZWN0IChzcmMtPmV4dGVuc2lvbnMsICJzZW5kIiwKKyAgICAgIChHQ2FsbGJhY2spIGdzdF9ydHNwc3JjX3NlbmRfY2IsIHNyYyk7CisKKyAgLyogcHJvdGVjdHMgdGhlIHN0cmVhbWluZyB0aHJlYWQgaW4gaW50ZXJsZWF2ZWQgbW9kZSBvciB0aGUgcG9sbGluZworICAgKiB0aHJlYWQgaW4gVURQIG1vZGUuICovCisgIGdfcmVjX211dGV4X2luaXQgKCZzcmMtPnN0cmVhbV9yZWNfbG9jayk7CisKKyAgLyogcHJvdGVjdHMgb3VyIHN0YXRlIGNoYW5nZXMgZnJvbSBtdWx0aXBsZSBpbnZvY2F0aW9ucyAqLworICBnX3JlY19tdXRleF9pbml0ICgmc3JjLT5zdGF0ZV9yZWNfbG9jayk7CisKKyAgc3JjLT5zdGF0ZSA9IEdTVF9SVFNQX1NUQVRFX0lOVkFMSUQ7CisKKyAgZ19tdXRleF9pbml0ICgmc3JjLT5jb25uaW5mby5zZW5kX2xvY2spOworICBnX211dGV4X2luaXQgKCZzcmMtPmNvbm5pbmZvLnJlY3ZfbG9jayk7CisKKyAgR1NUX09CSkVDVF9GTEFHX1NFVCAoc3JjLCBHU1RfRUxFTUVOVF9GTEFHX1NPVVJDRSk7CisgIGdzdF9iaW5fc2V0X3N1cHByZXNzZWRfZmxhZ3MgKEdTVF9CSU4gKHNyYyksCisgICAgICBHU1RfRUxFTUVOVF9GTEFHX1NPVVJDRSB8IEdTVF9FTEVNRU5UX0ZMQUdfU0lOSyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UlRTUFNyYyAqcnRzcHNyYzsKKworICBydHNwc3JjID0gR1NUX1JUU1BTUkMgKG9iamVjdCk7CisKKyAgZ3N0X3J0c3BfZXh0X2xpc3RfZnJlZSAocnRzcHNyYy0+ZXh0ZW5zaW9ucyk7CisgIGdfZnJlZSAocnRzcHNyYy0+Y29ubmluZm8ubG9jYXRpb24pOworICBnc3RfcnRzcF91cmxfZnJlZSAocnRzcHNyYy0+Y29ubmluZm8udXJsKTsKKyAgZ19mcmVlIChydHNwc3JjLT5jb25uaW5mby51cmxfc3RyKTsKKyAgZ19mcmVlIChydHNwc3JjLT51c2VyX2lkKTsKKyAgZ19mcmVlIChydHNwc3JjLT51c2VyX3B3KTsKKyAgZ19mcmVlIChydHNwc3JjLT5tdWx0aV9pZmFjZSk7CisgIGdfZnJlZSAocnRzcHNyYy0+dXNlcl9hZ2VudCk7CisKKyAgaWYgKHJ0c3BzcmMtPnNkcCkgeworICAgIGdzdF9zZHBfbWVzc2FnZV9mcmVlIChydHNwc3JjLT5zZHApOworICAgIHJ0c3BzcmMtPnNkcCA9IE5VTEw7CisgIH0KKyAgaWYgKHJ0c3BzcmMtPnByb3ZpZGVkX2Nsb2NrKQorICAgIGdzdF9vYmplY3RfdW5yZWYgKHJ0c3BzcmMtPnByb3ZpZGVkX2Nsb2NrKTsKKworICBpZiAocnRzcHNyYy0+c2RlcykKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHJ0c3BzcmMtPnNkZXMpOworCisgIGlmIChydHNwc3JjLT50bHNfZGF0YWJhc2UpCisgICAgZ19vYmplY3RfdW5yZWYgKHJ0c3BzcmMtPnRsc19kYXRhYmFzZSk7CisKKyAgaWYgKHJ0c3BzcmMtPnRsc19pbnRlcmFjdGlvbikKKyAgICBnX29iamVjdF91bnJlZiAocnRzcHNyYy0+dGxzX2ludGVyYWN0aW9uKTsKKworICAvKiBmcmVlIGxvY2tzICovCisgIGdfcmVjX211dGV4X2NsZWFyICgmcnRzcHNyYy0+c3RyZWFtX3JlY19sb2NrKTsKKyAgZ19yZWNfbXV0ZXhfY2xlYXIgKCZydHNwc3JjLT5zdGF0ZV9yZWNfbG9jayk7CisKKyAgZ19tdXRleF9jbGVhciAoJnJ0c3BzcmMtPmNvbm5pbmZvLnNlbmRfbG9jayk7CisgIGdfbXV0ZXhfY2xlYXIgKCZydHNwc3JjLT5jb25uaW5mby5yZWN2X2xvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIEdzdENsb2NrICoKK2dzdF9ydHNwc3JjX3Byb3ZpZGVfY2xvY2sgKEdzdEVsZW1lbnQgKiBlbGVtZW50KQoreworICBHc3RSVFNQU3JjICpzcmMgPSBHU1RfUlRTUFNSQyAoZWxlbWVudCk7CisgIEdzdENsb2NrICpjbG9jazsKKworICBpZiAoKGNsb2NrID0gc3JjLT5wcm92aWRlZF9jbG9jaykgIT0gTlVMTCkKKyAgICByZXR1cm4gZ3N0X29iamVjdF9yZWYgKGNsb2NrKTsKKworICByZXR1cm4gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnByb3ZpZGVfY2xvY2sgKGVsZW1lbnQpOworfQorCisvKiBhIHByb3h5IHN0cmluZyBvZiB0aGUgZm9ybWF0IFt1c2VyOnBhc3N3ZEBdaG9zdFs6cG9ydF0gKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfc2V0X3Byb3h5IChHc3RSVFNQU3JjICogcnRzcCwgY29uc3QgZ2NoYXIgKiBwcm94eSkKK3sKKyAgZ2NoYXIgKnAsICphdCwgKmNvbDsKKworICBnX2ZyZWUgKHJ0c3AtPnByb3h5X3VzZXIpOworICBydHNwLT5wcm94eV91c2VyID0gTlVMTDsKKyAgZ19mcmVlIChydHNwLT5wcm94eV9wYXNzd2QpOworICBydHNwLT5wcm94eV9wYXNzd2QgPSBOVUxMOworICBnX2ZyZWUgKHJ0c3AtPnByb3h5X2hvc3QpOworICBydHNwLT5wcm94eV9ob3N0ID0gTlVMTDsKKyAgcnRzcC0+cHJveHlfcG9ydCA9IDA7CisKKyAgcCA9IChnY2hhciAqKSBwcm94eTsKKworICBpZiAocCA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIC8qIHdlIGFsbG93IGh0dHA6Ly8gaW4gZnJvbnQgYnV0IGlnbm9yZSBpdCAqLworICBpZiAoZ19zdHJfaGFzX3ByZWZpeCAocCwgImh0dHA6Ly8iKSkKKyAgICBwICs9IDc7CisKKyAgYXQgPSBzdHJjaHIgKHAsICdAJyk7CisgIGlmIChhdCkgeworICAgIC8qIGxvb2sgZm9yIHVzZXI6cGFzc3dkICovCisgICAgY29sID0gc3RyY2hyIChwcm94eSwgJzonKTsKKyAgICBpZiAoY29sID09IE5VTEwgfHwgY29sID4gYXQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBydHNwLT5wcm94eV91c2VyID0gZ19zdHJuZHVwIChwLCBjb2wgLSBwKTsKKyAgICBjb2wrKzsKKyAgICBydHNwLT5wcm94eV9wYXNzd2QgPSBnX3N0cm5kdXAgKGNvbCwgYXQgLSBjb2wpOworCisgICAgLyogbW92ZSB0byBob3N0ICovCisgICAgcCA9IGF0ICsgMTsKKyAgfSBlbHNlIHsKKyAgICBpZiAocnRzcC0+cHJvcF9wcm94eV9pZCAhPSBOVUxMICYmICpydHNwLT5wcm9wX3Byb3h5X2lkICE9ICdcMCcpCisgICAgICBydHNwLT5wcm94eV91c2VyID0gZ19zdHJkdXAgKHJ0c3AtPnByb3BfcHJveHlfaWQpOworICAgIGlmIChydHNwLT5wcm9wX3Byb3h5X3B3ICE9IE5VTEwgJiYgKnJ0c3AtPnByb3BfcHJveHlfcHcgIT0gJ1wwJykKKyAgICAgIHJ0c3AtPnByb3h5X3Bhc3N3ZCA9IGdfc3RyZHVwIChydHNwLT5wcm9wX3Byb3h5X3B3KTsKKyAgICBpZiAocnRzcC0+cHJveHlfdXNlciAhPSBOVUxMIHx8IHJ0c3AtPnByb3h5X3Bhc3N3ZCAhPSBOVUxMKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRzcCwgInNldCBwcm94eSB1c2VyL3B3IGZyb20gcHJvcGVydGllczogJXM6JXMiLAorICAgICAgICAgIEdTVF9TVFJfTlVMTCAocnRzcC0+cHJveHlfdXNlciksIEdTVF9TVFJfTlVMTCAocnRzcC0+cHJveHlfcGFzc3dkKSk7CisgICAgfQorICB9CisgIGNvbCA9IHN0cmNociAocCwgJzonKTsKKworICBpZiAoY29sKSB7CisgICAgLyogZXZlcnl0aGluZyBiZWZvcmUgdGhlIGNvbG9uIGlzIHRoZSBob3N0bmFtZSAqLworICAgIHJ0c3AtPnByb3h5X2hvc3QgPSBnX3N0cm5kdXAgKHAsIGNvbCAtIHApOworICAgIHAgPSBjb2wgKyAxOworICAgIHJ0c3AtPnByb3h5X3BvcnQgPSBzdHJ0b3VsIChwLCAoY2hhciAqKikgJnAsIDEwKTsKKyAgfSBlbHNlIHsKKyAgICBydHNwLT5wcm94eV9ob3N0ID0gZ19zdHJkdXAgKHApOworICAgIHJ0c3AtPnByb3h5X3BvcnQgPSA4MDgwOworICB9CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfc2V0X3RjcF90aW1lb3V0IChHc3RSVFNQU3JjICogcnRzcHNyYywgZ3VpbnQ2NCB0aW1lb3V0KQoreworICBydHNwc3JjLT50Y3BfdGltZW91dC50dl9zZWMgPSB0aW1lb3V0IC8gR19VU0VDX1BFUl9TRUM7CisgIHJ0c3BzcmMtPnRjcF90aW1lb3V0LnR2X3VzZWMgPSB0aW1lb3V0ICUgR19VU0VDX1BFUl9TRUM7CisKKyAgaWYgKHRpbWVvdXQgIT0gMCkKKyAgICBydHNwc3JjLT5wdGNwX3RpbWVvdXQgPSAmcnRzcHNyYy0+dGNwX3RpbWVvdXQ7CisgIGVsc2UKKyAgICBydHNwc3JjLT5wdGNwX3RpbWVvdXQgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJUU1BTcmMgKnJ0c3BzcmM7CisKKyAgcnRzcHNyYyA9IEdTVF9SVFNQU1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MT0NBVElPTjoKKyAgICAgIGdzdF9ydHNwc3JjX3VyaV9zZXRfdXJpIChHU1RfVVJJX0hBTkRMRVIgKHJ0c3BzcmMpLAorICAgICAgICAgIGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9UT0NPTFM6CisgICAgICBydHNwc3JjLT5wcm90b2NvbHMgPSBnX3ZhbHVlX2dldF9mbGFncyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RFQlVHOgorICAgICAgcnRzcHNyYy0+ZGVidWcgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVUUlk6CisgICAgICBydHNwc3JjLT5yZXRyeSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USU1FT1VUOgorICAgICAgcnRzcHNyYy0+dWRwX3RpbWVvdXQgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UQ1BfVElNRU9VVDoKKyAgICAgIGdzdF9ydHNwc3JjX3NldF90Y3BfdGltZW91dCAocnRzcHNyYywgZ192YWx1ZV9nZXRfdWludDY0ICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0xBVEVOQ1k6CisgICAgICBydHNwc3JjLT5sYXRlbmN5ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RST1BfT05fTEFURU5DWToKKyAgICAgIHJ0c3BzcmMtPmRyb3Bfb25fbGF0ZW5jeSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT05ORUNUSU9OX1NQRUVEOgorICAgICAgcnRzcHNyYy0+Y29ubmVjdGlvbl9zcGVlZCA9IGdfdmFsdWVfZ2V0X3VpbnQ2NCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05BVF9NRVRIT0Q6CisgICAgICBydHNwc3JjLT5uYXRfbWV0aG9kID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RPX1JUQ1A6CisgICAgICBydHNwc3JjLT5kb19ydGNwID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RPX1JUU1BfS0VFUF9BTElWRToKKyAgICAgIHJ0c3BzcmMtPmRvX3J0c3Bfa2VlcF9hbGl2ZSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9YWToKKyAgICAgIGdzdF9ydHNwc3JjX3NldF9wcm94eSAocnRzcHNyYywgZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BST1hZX0lEOgorICAgICAgZ19mcmVlIChydHNwc3JjLT5wcm9wX3Byb3h5X2lkKTsKKyAgICAgIHJ0c3BzcmMtPnByb3BfcHJveHlfaWQgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9YWV9QVzoKKyAgICAgIGdfZnJlZSAocnRzcHNyYy0+cHJvcF9wcm94eV9wdyk7CisgICAgICBydHNwc3JjLT5wcm9wX3Byb3h5X3B3ID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRQX0JMT0NLU0laRToKKyAgICAgIHJ0c3BzcmMtPnJ0cF9ibG9ja3NpemUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFUl9JRDoKKyAgICAgIGdfZnJlZSAocnRzcHNyYy0+dXNlcl9pZCk7CisgICAgICBydHNwc3JjLT51c2VyX2lkID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFUl9QVzoKKyAgICAgIGdfZnJlZSAocnRzcHNyYy0+dXNlcl9wdyk7CisgICAgICBydHNwc3JjLT51c2VyX3B3ID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQlVGRkVSX01PREU6CisgICAgICBydHNwc3JjLT5idWZmZXJfbW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QT1JUX1JBTkdFOgorICAgIHsKKyAgICAgIGNvbnN0IGdjaGFyICpzdHI7CisKKyAgICAgIHN0ciA9IGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpOworICAgICAgaWYgKHNzY2FuZiAoc3RyLCAiJXUtJXUiLCAmcnRzcHNyYy0+Y2xpZW50X3BvcnRfcmFuZ2UubWluLAorICAgICAgICAgICAgICAmcnRzcHNyYy0+Y2xpZW50X3BvcnRfcmFuZ2UubWF4KSAhPSAyKSB7CisgICAgICAgIHJ0c3BzcmMtPmNsaWVudF9wb3J0X3JhbmdlLm1pbiA9IDA7CisgICAgICAgIHJ0c3BzcmMtPmNsaWVudF9wb3J0X3JhbmdlLm1heCA9IDA7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX1VEUF9CVUZGRVJfU0laRToKKyAgICAgIHJ0c3BzcmMtPnVkcF9idWZmZXJfc2l6ZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NIT1JUX0hFQURFUjoKKyAgICAgIHJ0c3BzcmMtPnNob3J0X2hlYWRlciA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9CQVRJT046CisgICAgICBydHNwc3JjLT5wcm9iYXRpb24gPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVURQX1JFQ09OTkVDVDoKKyAgICAgIHJ0c3BzcmMtPnVkcF9yZWNvbm5lY3QgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTVVMVElDQVNUX0lGQUNFOgorICAgICAgZ19mcmVlIChydHNwc3JjLT5tdWx0aV9pZmFjZSk7CisKKyAgICAgIGlmIChnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSA9PSBOVUxMKQorICAgICAgICBydHNwc3JjLT5tdWx0aV9pZmFjZSA9IGdfc3RyZHVwIChERUZBVUxUX01VTFRJQ0FTVF9JRkFDRSk7CisgICAgICBlbHNlCisgICAgICAgIHJ0c3BzcmMtPm11bHRpX2lmYWNlID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTlRQX1NZTkM6CisgICAgICBydHNwc3JjLT5udHBfc3luYyA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIC8qIFRoZSBkZWZhdWx0IHZhbHVlIG9mIG1heF90c19vZmZzZXQgZGVwZW5kcyBvbiBudHBfc3luYy4gSWYgdXNlcgorICAgICAgICogaGFzbid0IHNldCBpdCB0aGVuIGNoYW5nZSBkZWZhdWx0IHZhbHVlICovCisgICAgICBpZiAoIXJ0c3BzcmMtPm1heF90c19vZmZzZXRfaXNfc2V0KSB7CisgICAgICAgIGlmIChydHNwc3JjLT5udHBfc3luYykgeworICAgICAgICAgIHJ0c3BzcmMtPm1heF90c19vZmZzZXQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJ0c3BzcmMtPm1heF90c19vZmZzZXQgPSBERUZBVUxUX01BWF9UU19PRkZTRVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VfUElQRUxJTkVfQ0xPQ0s6CisgICAgICBydHNwc3JjLT51c2VfcGlwZWxpbmVfY2xvY2sgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0RFUzoKKyAgICAgIHJ0c3BzcmMtPnNkZXMgPSBnX3ZhbHVlX2R1cF9ib3hlZCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RMU19WQUxJREFUSU9OX0ZMQUdTOgorICAgICAgcnRzcHNyYy0+dGxzX3ZhbGlkYXRpb25fZmxhZ3MgPSBnX3ZhbHVlX2dldF9mbGFncyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RMU19EQVRBQkFTRToKKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmcnRzcHNyYy0+dGxzX2RhdGFiYXNlKTsKKyAgICAgIHJ0c3BzcmMtPnRsc19kYXRhYmFzZSA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RMU19JTlRFUkFDVElPTjoKKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmcnRzcHNyYy0+dGxzX2ludGVyYWN0aW9uKTsKKyAgICAgIHJ0c3BzcmMtPnRsc19pbnRlcmFjdGlvbiA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RPX1JFVFJBTlNNSVNTSU9OOgorICAgICAgcnRzcHNyYy0+ZG9fcmV0cmFuc21pc3Npb24gPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTlRQX1RJTUVfU09VUkNFOgorICAgICAgcnRzcHNyYy0+bnRwX3RpbWVfc291cmNlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VTRVJfQUdFTlQ6CisgICAgICBnX2ZyZWUgKHJ0c3BzcmMtPnVzZXJfYWdlbnQpOworICAgICAgcnRzcHNyYy0+dXNlcl9hZ2VudCA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9SVENQX1JUUF9USU1FX0RJRkY6CisgICAgICBydHNwc3JjLT5tYXhfcnRjcF9ydHBfdGltZV9kaWZmID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkZDNzI3M19TWU5DOgorICAgICAgcnRzcHNyYy0+cmZjNzI3M19zeW5jID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9UU19PRkZTRVRfQURKVVNUTUVOVDoKKyAgICAgIHJ0c3BzcmMtPm1heF90c19vZmZzZXRfYWRqdXN0bWVudCA9IGdfdmFsdWVfZ2V0X3VpbnQ2NCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9UU19PRkZTRVQ6CisgICAgICBydHNwc3JjLT5tYXhfdHNfb2Zmc2V0ID0gZ192YWx1ZV9nZXRfaW50NjQgKHZhbHVlKTsKKyAgICAgIHJ0c3BzcmMtPm1heF90c19vZmZzZXRfaXNfc2V0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ERUZBVUxUX1ZFUlNJT046CisgICAgICBydHNwc3JjLT5kZWZhdWx0X3ZlcnNpb24gPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UlRTUFNyYyAqcnRzcHNyYzsKKworICBydHNwc3JjID0gR1NUX1JUU1BTUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xPQ0FUSU9OOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgcnRzcHNyYy0+Y29ubmluZm8ubG9jYXRpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BST1RPQ09MUzoKKyAgICAgIGdfdmFsdWVfc2V0X2ZsYWdzICh2YWx1ZSwgcnRzcHNyYy0+cHJvdG9jb2xzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ERUJVRzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBydHNwc3JjLT5kZWJ1Zyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVUUlk6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnRzcHNyYy0+cmV0cnkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RJTUVPVVQ6CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCBydHNwc3JjLT51ZHBfdGltZW91dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVENQX1RJTUVPVVQ6CisgICAgeworICAgICAgZ3VpbnQ2NCB0aW1lb3V0OworCisgICAgICB0aW1lb3V0ID0gKChndWludDY0KSBydHNwc3JjLT50Y3BfdGltZW91dC50dl9zZWMpICogR19VU0VDX1BFUl9TRUMgKworICAgICAgICAgIHJ0c3BzcmMtPnRjcF90aW1lb3V0LnR2X3VzZWM7CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCB0aW1lb3V0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfTEFURU5DWToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBydHNwc3JjLT5sYXRlbmN5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9EUk9QX09OX0xBVEVOQ1k6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcnRzcHNyYy0+ZHJvcF9vbl9sYXRlbmN5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT05ORUNUSU9OX1NQRUVEOgorICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgcnRzcHNyYy0+Y29ubmVjdGlvbl9zcGVlZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTkFUX01FVEhPRDoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBydHNwc3JjLT5uYXRfbWV0aG9kKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ET19SVENQOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHJ0c3BzcmMtPmRvX3J0Y3ApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RPX1JUU1BfS0VFUF9BTElWRToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBydHNwc3JjLT5kb19ydHNwX2tlZXBfYWxpdmUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BST1hZOgorICAgIHsKKyAgICAgIGdjaGFyICpzdHI7CisKKyAgICAgIGlmIChydHNwc3JjLT5wcm94eV9ob3N0KSB7CisgICAgICAgIHN0ciA9CisgICAgICAgICAgICBnX3N0cmR1cF9wcmludGYgKCIlczolZCIsIHJ0c3BzcmMtPnByb3h5X2hvc3QsIHJ0c3BzcmMtPnByb3h5X3BvcnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGdfdmFsdWVfdGFrZV9zdHJpbmcgKHZhbHVlLCBzdHIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9QUk9YWV9JRDoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHJ0c3BzcmMtPnByb3BfcHJveHlfaWQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BST1hZX1BXOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgcnRzcHNyYy0+cHJvcF9wcm94eV9wdyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRQX0JMT0NLU0laRToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBydHNwc3JjLT5ydHBfYmxvY2tzaXplKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VSX0lEOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgcnRzcHNyYy0+dXNlcl9pZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFUl9QVzoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHJ0c3BzcmMtPnVzZXJfcHcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JVRkZFUl9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHJ0c3BzcmMtPmJ1ZmZlcl9tb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QT1JUX1JBTkdFOgorICAgIHsKKyAgICAgIGdjaGFyICpzdHI7CisKKyAgICAgIGlmIChydHNwc3JjLT5jbGllbnRfcG9ydF9yYW5nZS5taW4gIT0gMCkgeworICAgICAgICBzdHIgPSBnX3N0cmR1cF9wcmludGYgKCIldS0ldSIsIHJ0c3BzcmMtPmNsaWVudF9wb3J0X3JhbmdlLm1pbiwKKyAgICAgICAgICAgIHJ0c3BzcmMtPmNsaWVudF9wb3J0X3JhbmdlLm1heCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdHIgPSBOVUxMOworICAgICAgfQorICAgICAgZ192YWx1ZV90YWtlX3N0cmluZyAodmFsdWUsIHN0cik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX1VEUF9CVUZGRVJfU0laRToKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHJ0c3BzcmMtPnVkcF9idWZmZXJfc2l6ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0hPUlRfSEVBREVSOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHJ0c3BzcmMtPnNob3J0X2hlYWRlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUFJPQkFUSU9OOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0c3BzcmMtPnByb2JhdGlvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVURQX1JFQ09OTkVDVDoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBydHNwc3JjLT51ZHBfcmVjb25uZWN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NVUxUSUNBU1RfSUZBQ0U6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBydHNwc3JjLT5tdWx0aV9pZmFjZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTlRQX1NZTkM6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcnRzcHNyYy0+bnRwX3N5bmMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VTRV9QSVBFTElORV9DTE9DSzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBydHNwc3JjLT51c2VfcGlwZWxpbmVfY2xvY2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NERVM6CisgICAgICBnX3ZhbHVlX3NldF9ib3hlZCAodmFsdWUsIHJ0c3BzcmMtPnNkZXMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RMU19WQUxJREFUSU9OX0ZMQUdTOgorICAgICAgZ192YWx1ZV9zZXRfZmxhZ3MgKHZhbHVlLCBydHNwc3JjLT50bHNfdmFsaWRhdGlvbl9mbGFncyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVExTX0RBVEFCQVNFOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgcnRzcHNyYy0+dGxzX2RhdGFiYXNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UTFNfSU5URVJBQ1RJT046CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBydHNwc3JjLT50bHNfaW50ZXJhY3Rpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RPX1JFVFJBTlNNSVNTSU9OOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHJ0c3BzcmMtPmRvX3JldHJhbnNtaXNzaW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9OVFBfVElNRV9TT1VSQ0U6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgcnRzcHNyYy0+bnRwX3RpbWVfc291cmNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VSX0FHRU5UOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgcnRzcHNyYy0+dXNlcl9hZ2VudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX1JUQ1BfUlRQX1RJTUVfRElGRjoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHJ0c3BzcmMtPm1heF9ydGNwX3J0cF90aW1lX2RpZmYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JGQzcyNzNfU1lOQzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBydHNwc3JjLT5yZmM3MjczX3N5bmMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9UU19PRkZTRVRfQURKVVNUTUVOVDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHJ0c3BzcmMtPm1heF90c19vZmZzZXRfYWRqdXN0bWVudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX1RTX09GRlNFVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludDY0ICh2YWx1ZSwgcnRzcHNyYy0+bWF4X3RzX29mZnNldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfREVGQVVMVF9WRVJTSU9OOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHJ0c3BzcmMtPmRlZmF1bHRfdmVyc2lvbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBnaW50CitmaW5kX3N0cmVhbV9ieV9pZCAoR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwgZ2ludCAqIGlkKQoreworICBpZiAoc3RyZWFtLT5pZCA9PSAqaWQpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgZ2ludAorZmluZF9zdHJlYW1fYnlfY2hhbm5lbCAoR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwgZ2ludCAqIGNoYW5uZWwpCit7CisgIC8qIGlnbm9yZSB1bmNvbmZpZ3VyZWQgY2hhbm5lbHMgaGVyZSAoZS5nLiwgdGhvc2UgdGhhdAorICAgKiB3ZXJlIGV4cGxpY2l0bHkgc2tpcHBlZCBkdXJpbmcgU0VUVVApICovCisgIGlmICgoc3RyZWFtLT5jaGFubmVscGFkWzBdICE9IE5VTEwpICYmCisgICAgICAoc3RyZWFtLT5jaGFubmVsWzBdID09ICpjaGFubmVsIHx8IHN0cmVhbS0+Y2hhbm5lbFsxXSA9PSAqY2hhbm5lbCkpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgZ2ludAorZmluZF9zdHJlYW1fYnlfdWRwc3JjIChHc3RSVFNQU3RyZWFtICogc3RyZWFtLCBnY29uc3Rwb2ludGVyIGEpCit7CisgIEdzdEVsZW1lbnQgKnNyYyA9IChHc3RFbGVtZW50ICopIGE7CisKKyAgaWYgKHN0cmVhbS0+dWRwc3JjWzBdID09IHNyYykKKyAgICByZXR1cm4gMDsKKyAgaWYgKHN0cmVhbS0+dWRwc3JjWzFdID09IHNyYykKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBnaW50CitmaW5kX3N0cmVhbV9ieV9zZXR1cCAoR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwgZ2NvbnN0cG9pbnRlciBhKQoreworICBpZiAoc3RyZWFtLT5jb25uaW5mby5sb2NhdGlvbikgeworICAgIC8qIGNoZWNrIHF1YWxpZmllZCBzZXR1cF91cmwgKi8KKyAgICBpZiAoIXN0cmNtcCAoc3RyZWFtLT5jb25uaW5mby5sb2NhdGlvbiwgKGdjaGFyICopIGEpKQorICAgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHN0cmVhbS0+Y29udHJvbF91cmwpIHsKKyAgICAvKiBjaGVjayBvcmlnaW5hbCBjb250cm9sX3VybCAqLworICAgIGlmICghc3RyY21wIChzdHJlYW0tPmNvbnRyb2xfdXJsLCAoZ2NoYXIgKikgYSkpCisgICAgICByZXR1cm4gMDsKKworICAgIC8qIGNoZWNrIGlmIHF1YWxpZmllZCBzZXR1cF91cmwgZW5kcyB3aXRoIHN0cmluZyAqLworICAgIGlmIChnX3N0cl9oYXNfc3VmZml4IChzdHJlYW0tPmNvbnRyb2xfdXJsLCAoZ2NoYXIgKikgYSkpCisgICAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAtMTsKK30KKworc3RhdGljIEdzdFJUU1BTdHJlYW0gKgorZmluZF9zdHJlYW0gKEdzdFJUU1BTcmMgKiBzcmMsIGdjb25zdHBvaW50ZXIgZGF0YSwgZ2NvbnN0cG9pbnRlciBmdW5jKQoreworICBHTGlzdCAqbHN0cmVhbTsKKworICAvKiBmaW5kIGFuZCBnZXQgc3RyZWFtICovCisgIGlmICgobHN0cmVhbSA9IGdfbGlzdF9maW5kX2N1c3RvbSAoc3JjLT5zdHJlYW1zLCBkYXRhLCAoR0NvbXBhcmVGdW5jKSBmdW5jKSkpCisgICAgcmV0dXJuIChHc3RSVFNQU3RyZWFtICopIGxzdHJlYW0tPmRhdGE7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBHc3RTRFBCYW5kd2lkdGggKgorZ3N0X3J0c3BzcmNfZ2V0X2JhbmR3aWR0aCAoR3N0UlRTUFNyYyAqIHNyYywgY29uc3QgR3N0U0RQTWVzc2FnZSAqIHNkcCwKKyAgICBjb25zdCBHc3RTRFBNZWRpYSAqIG1lZGlhLCBjb25zdCBnY2hhciAqIHR5cGUpCit7CisgIGd1aW50IGksIGxlbjsKKworICAvKiBmaXJzdCBsb29rIGluIHRoZSBtZWRpYSBzcGVjaWZpYyBzZWN0aW9uICovCisgIGxlbiA9IGdzdF9zZHBfbWVkaWFfYmFuZHdpZHRoc19sZW4gKG1lZGlhKTsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgY29uc3QgR3N0U0RQQmFuZHdpZHRoICpidyA9IGdzdF9zZHBfbWVkaWFfZ2V0X2JhbmR3aWR0aCAobWVkaWEsIGkpOworCisgICAgaWYgKHN0cmNtcCAoYnctPmJ3dHlwZSwgdHlwZSkgPT0gMCkKKyAgICAgIHJldHVybiBidzsKKyAgfQorICAvKiB0aGVuIGxvb2sgaW4gdGhlIG1lc3NhZ2Ugc3BlY2lmaWMgc2VjdGlvbiAqLworICBsZW4gPSBnc3Rfc2RwX21lc3NhZ2VfYmFuZHdpZHRoc19sZW4gKHNkcCk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIGNvbnN0IEdzdFNEUEJhbmR3aWR0aCAqYncgPSBnc3Rfc2RwX21lc3NhZ2VfZ2V0X2JhbmR3aWR0aCAoc2RwLCBpKTsKKworICAgIGlmIChzdHJjbXAgKGJ3LT5id3R5cGUsIHR5cGUpID09IDApCisgICAgICByZXR1cm4gYnc7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY19jb2xsZWN0X2JhbmR3aWR0aCAoR3N0UlRTUFNyYyAqIHNyYywgY29uc3QgR3N0U0RQTWVzc2FnZSAqIHNkcCwKKyAgICBjb25zdCBHc3RTRFBNZWRpYSAqIG1lZGlhLCBHc3RSVFNQU3RyZWFtICogc3RyZWFtKQoreworICBjb25zdCBHc3RTRFBCYW5kd2lkdGggKmJ3OworCisgIGlmICgoYncgPSBnc3RfcnRzcHNyY19nZXRfYmFuZHdpZHRoIChzcmMsIHNkcCwgbWVkaWEsIEdTVF9TRFBfQldUWVBFX0FTKSkpCisgICAgc3RyZWFtLT5hc19iYW5kd2lkdGggPSBidy0+YmFuZHdpZHRoOworICBlbHNlCisgICAgc3RyZWFtLT5hc19iYW5kd2lkdGggPSAtMTsKKworICBpZiAoKGJ3ID0gZ3N0X3J0c3BzcmNfZ2V0X2JhbmR3aWR0aCAoc3JjLCBzZHAsIG1lZGlhLCBHU1RfU0RQX0JXVFlQRV9SUikpKQorICAgIHN0cmVhbS0+cnJfYmFuZHdpZHRoID0gYnctPmJhbmR3aWR0aDsKKyAgZWxzZQorICAgIHN0cmVhbS0+cnJfYmFuZHdpZHRoID0gLTE7CisKKyAgaWYgKChidyA9IGdzdF9ydHNwc3JjX2dldF9iYW5kd2lkdGggKHNyYywgc2RwLCBtZWRpYSwgR1NUX1NEUF9CV1RZUEVfUlMpKSkKKyAgICBzdHJlYW0tPnJzX2JhbmR3aWR0aCA9IGJ3LT5iYW5kd2lkdGg7CisgIGVsc2UKKyAgICBzdHJlYW0tPnJzX2JhbmR3aWR0aCA9IC0xOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfZG9fc3RyZWFtX2Nvbm5lY3Rpb24gKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFJUU1BTdHJlYW0gKiBzdHJlYW0sCisgICAgY29uc3QgR3N0U0RQQ29ubmVjdGlvbiAqIGNvbm4pCit7CisgIGlmIChjb25uLT5uZXR0eXBlID09IE5VTEwgfHwgc3RyY21wIChjb25uLT5uZXR0eXBlLCAiSU4iKSAhPSAwKQorICAgIHJldHVybjsKKworICBpZiAoY29ubi0+YWRkcnR5cGUgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgLyogY2hlY2sgZm9yIElQVjYgKi8KKyAgaWYgKHN0cmNtcCAoY29ubi0+YWRkcnR5cGUsICJJUDQiKSA9PSAwKQorICAgIHN0cmVhbS0+aXNfaXB2NiA9IEZBTFNFOworICBlbHNlIGlmIChzdHJjbXAgKGNvbm4tPmFkZHJ0eXBlLCAiSVA2IikgPT0gMCkKKyAgICBzdHJlYW0tPmlzX2lwdjYgPSBUUlVFOworICBlbHNlCisgICAgcmV0dXJuOworCisgIC8qIHNhdmUgYWRkcmVzcyAqLworICBnX2ZyZWUgKHN0cmVhbS0+ZGVzdGluYXRpb24pOworICBzdHJlYW0tPmRlc3RpbmF0aW9uID0gZ19zdHJkdXAgKGNvbm4tPmFkZHJlc3MpOworCisgIC8qIGNoZWNrIGZvciBtdWx0aWNhc3QgKi8KKyAgc3RyZWFtLT5pc19tdWx0aWNhc3QgPQorICAgICAgZ3N0X3NkcF9hZGRyZXNzX2lzX211bHRpY2FzdCAoY29ubi0+bmV0dHlwZSwgY29ubi0+YWRkcnR5cGUsCisgICAgICBjb25uLT5hZGRyZXNzKTsKKyAgc3RyZWFtLT50dGwgPSBjb25uLT50dGw7Cit9CisKKy8qIEdvIG92ZXIgdGhlIGNvbm5lY3Rpb25zIGZvciBhIHN0cmVhbS4KKyAqIC0gSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBJUFY2LCB3ZSB3aWxsIHNldHVwIElQVjYgc29ja2V0cyBmb3Igc2VuZGluZyBhbmQKKyAqICAgcmVjZWl2aW5nLgorICogLSBJZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgbG9jYWxob3N0IGFkZHJlc3MsIHdlIGRpc2FibGUgbXVsdGljYXN0CisgKi8KK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY19jb2xsZWN0X2Nvbm5lY3Rpb25zIChHc3RSVFNQU3JjICogc3JjLCBjb25zdCBHc3RTRFBNZXNzYWdlICogc2RwLAorICAgIGNvbnN0IEdzdFNEUE1lZGlhICogbWVkaWEsIEdzdFJUU1BTdHJlYW0gKiBzdHJlYW0pCit7CisgIGNvbnN0IEdzdFNEUENvbm5lY3Rpb24gKmNvbm47CisgIGd1aW50IGksIGxlbjsKKworICAvKiBmaXJzdCBsb29rIGluIHRoZSBtZWRpYSBzcGVjaWZpYyBzZWN0aW9uICovCisgIGxlbiA9IGdzdF9zZHBfbWVkaWFfY29ubmVjdGlvbnNfbGVuIChtZWRpYSk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIGNvbm4gPSBnc3Rfc2RwX21lZGlhX2dldF9jb25uZWN0aW9uIChtZWRpYSwgaSk7CisKKyAgICBnc3RfcnRzcHNyY19kb19zdHJlYW1fY29ubmVjdGlvbiAoc3JjLCBzdHJlYW0sIGNvbm4pOworICB9CisgIC8qIHRoZW4gbG9vayBpbiB0aGUgbWVzc2FnZSBzcGVjaWZpYyBzZWN0aW9uICovCisgIGlmICgoY29ubiA9IGdzdF9zZHBfbWVzc2FnZV9nZXRfY29ubmVjdGlvbiAoc2RwKSkpIHsKKyAgICBnc3RfcnRzcHNyY19kb19zdHJlYW1fY29ubmVjdGlvbiAoc3JjLCBzdHJlYW0sIGNvbm4pOworICB9Cit9CisKK3N0YXRpYyBnY2hhciAqCittYWtlX3N0cmVhbV9pZCAoR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwgY29uc3QgR3N0U0RQTWVkaWEgKiBtZWRpYSkKK3sKKyAgZ2NoYXIgKnN0cmVhbV9pZCA9CisgICAgICBnX3N0cmR1cF9wcmludGYgKCIlczolZDolZDolczolZCIsIG1lZGlhLT5tZWRpYSwgbWVkaWEtPnBvcnQsCisgICAgICBtZWRpYS0+bnVtX3BvcnRzLCBtZWRpYS0+cHJvdG8sIHN0cmVhbS0+ZGVmYXVsdF9wdCk7CisKKyAgZ19zdHJjYW5vbiAoc3RyZWFtX2lkLCBHX0NTRVRfYV8yX3ogR19DU0VUX0FfMl9aIEdfQ1NFVF9ESUdJVFMsICc6Jyk7CisKKyAgcmV0dXJuIHN0cmVhbV9pZDsKK30KKworLyogICBtPTxtZWRpYT4gPFVEUCBwb3J0PiBSVFAvQVZQIDxwYXlsb2FkPgorICovCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfY29sbGVjdF9wYXlsb2FkcyAoR3N0UlRTUFNyYyAqIHNyYywgY29uc3QgR3N0U0RQTWVzc2FnZSAqIHNkcCwKKyAgICBjb25zdCBHc3RTRFBNZWRpYSAqIG1lZGlhLCBHc3RSVFNQU3RyZWFtICogc3RyZWFtKQoreworICBndWludCBpLCBsZW47CisgIGNvbnN0IGdjaGFyICpwcm90bzsKKyAgR3N0Q2FwcyAqZ2xvYmFsX2NhcHM7CisKKyAgLyogZ2V0IHByb3RvICovCisgIHByb3RvID0gZ3N0X3NkcF9tZWRpYV9nZXRfcHJvdG8gKG1lZGlhKTsKKyAgaWYgKHByb3RvID09IE5VTEwpCisgICAgZ290byBub19wcm90bzsKKworICBpZiAoZ19zdHJfZXF1YWwgKHByb3RvLCAiUlRQL0FWUCIpKQorICAgIHN0cmVhbS0+cHJvZmlsZSA9IEdTVF9SVFNQX1BST0ZJTEVfQVZQOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAocHJvdG8sICJSVFAvU0FWUCIpKQorICAgIHN0cmVhbS0+cHJvZmlsZSA9IEdTVF9SVFNQX1BST0ZJTEVfU0FWUDsKKyAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKHByb3RvLCAiUlRQL0FWUEYiKSkKKyAgICBzdHJlYW0tPnByb2ZpbGUgPSBHU1RfUlRTUF9QUk9GSUxFX0FWUEY7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChwcm90bywgIlJUUC9TQVZQRiIpKQorICAgIHN0cmVhbS0+cHJvZmlsZSA9IEdTVF9SVFNQX1BST0ZJTEVfU0FWUEY7CisgIGVsc2UKKyAgICBnb3RvIHVua25vd25fcHJvdG87CisKKyAgaWYgKGdzdF9zZHBfbWVkaWFfZ2V0X2F0dHJpYnV0ZV92YWwgKG1lZGlhLCAicmVjdm9ubHkiKSAhPSBOVUxMKQorICAgIGdvdG8gcmVjdm9ubHlfbWVkaWE7CisKKyAgLyogUGFyc2UgZ2xvYmFsIFNEUCBhdHRyaWJ1dGVzIG9uY2UgKi8KKyAgZ2xvYmFsX2NhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXBwbGljYXRpb24veC11bmtub3duIik7CisgIEdTVF9ERUJVRyAoIm1hcHBpbmcgc2RwIHNlc3Npb24gbGV2ZWwgYXR0cmlidXRlcyB0byBjYXBzIik7CisgIGdzdF9zZHBfbWVzc2FnZV9hdHRyaWJ1dGVzX3RvX2NhcHMgKHNkcCwgZ2xvYmFsX2NhcHMpOworICBHU1RfREVCVUcgKCJtYXBwaW5nIHNkcCBtZWRpYSBsZXZlbCBhdHRyaWJ1dGVzIHRvIGNhcHMiKTsKKyAgZ3N0X3NkcF9tZWRpYV9hdHRyaWJ1dGVzX3RvX2NhcHMgKG1lZGlhLCBnbG9iYWxfY2Fwcyk7CisKKyAgLyogS2VlcCBhIGNvcHkgb2YgdGhlIFNEUCBrZXkgbWFuYWdlbWVudCAqLworICBnc3Rfc2RwX21lZGlhX3BhcnNlX2tleW1nbXQgKG1lZGlhLCAmc3RyZWFtLT5taWtleSk7CisgIGlmIChzdHJlYW0tPm1pa2V5ID09IE5VTEwpCisgICAgZ3N0X3NkcF9tZXNzYWdlX3BhcnNlX2tleW1nbXQgKHNkcCwgJnN0cmVhbS0+bWlrZXkpOworCisgIGxlbiA9IGdzdF9zZHBfbWVkaWFfZm9ybWF0c19sZW4gKG1lZGlhKTsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgZ2ludCBwdDsKKyAgICBHc3RDYXBzICpjYXBzLCAqb3V0Y2FwczsKKyAgICBHc3RTdHJ1Y3R1cmUgKnM7CisgICAgY29uc3QgZ2NoYXIgKmVuYzsKKyAgICBQdE1hcEl0ZW0gaXRlbTsKKworICAgIHB0ID0gYXRvaSAoZ3N0X3NkcF9tZWRpYV9nZXRfZm9ybWF0IChtZWRpYSwgaSkpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiIGxvb2tpbmcgYXQgJWQgcHQ6ICVkIiwgaSwgcHQpOworCisgICAgLyogY29udmVydCBjYXBzICovCisgICAgY2FwcyA9IGdzdF9zZHBfbWVkaWFfZ2V0X2NhcHNfZnJvbV9tZWRpYSAobWVkaWEsIHB0KTsKKyAgICBpZiAoY2FwcyA9PSBOVUxMKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgIiBza2lwcGluZyBwdCAlZCB3aXRob3V0IGNhcHMiLCBwdCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvKiBkbyBzb21lIHR3ZWFrcyAqLworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgICBpZiAoKGVuYyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgImVuY29kaW5nLW5hbWUiKSkpIHsKKyAgICAgIHN0cmVhbS0+aXNfcmVhbCA9IChzdHJzdHIgKGVuYywgIi1SRUFMIikgIT0gTlVMTCk7CisgICAgICBpZiAoc3RyY21wIChlbmMsICJYLUFTRi1QRiIpID09IDApCisgICAgICAgIHN0cmVhbS0+Y29udGFpbmVyID0gVFJVRTsKKyAgICB9CisKKyAgICAvKiBNZXJnZSBpbiBnbG9iYWwgY2FwcyAqLworICAgIC8qIEludGVyc2VjdCB3aWxsIG1lcmdlIGluIG1pc3NpbmcgZmllbGRzIHRvIHRoZSBjdXJyZW50IGNhcHMgKi8KKyAgICBvdXRjYXBzID0gZ3N0X2NhcHNfaW50ZXJzZWN0IChjYXBzLCBnbG9iYWxfY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgLyogdGhlIGZpcnN0IHB0IHdpbGwgYmUgdGhlIGRlZmF1bHQgKi8KKyAgICBpZiAoc3RyZWFtLT5wdG1hcC0+bGVuID09IDApCisgICAgICBzdHJlYW0tPmRlZmF1bHRfcHQgPSBwdDsKKworICAgIGl0ZW0ucHQgPSBwdDsKKyAgICBpdGVtLmNhcHMgPSBvdXRjYXBzOworCisgICAgZ19hcnJheV9hcHBlbmRfdmFsIChzdHJlYW0tPnB0bWFwLCBpdGVtKTsKKyAgfQorCisgIHN0cmVhbS0+c3RyZWFtX2lkID0gbWFrZV9zdHJlYW1faWQgKHN0cmVhbSwgbWVkaWEpOworCisgIGdzdF9jYXBzX3VucmVmIChnbG9iYWxfY2Fwcyk7CisgIHJldHVybjsKKworbm9fcHJvdG86CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzcmMsICJjYW4ndCBmaW5kIHByb3RvIGluIG1lZGlhIik7CisgICAgcmV0dXJuOworICB9Cit1bmtub3duX3Byb3RvOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoc3JjLCAidW5rbm93biBwcm90byBpbiBtZWRpYTogJyVzJyIsIHByb3RvKTsKKyAgICByZXR1cm47CisgIH0KK3JlY3Zvbmx5X21lZGlhOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicmVjdm9ubHkgbWVkaWEgaWdub3JlZCIpOworICAgIHJldHVybjsKKyAgfQorfQorCitzdGF0aWMgY29uc3QgZ2NoYXIgKgorZ2V0X2FnZ3JlZ2F0ZV9jb250cm9sIChHc3RSVFNQU3JjICogc3JjKQoreworICBjb25zdCBnY2hhciAqYmFzZTsKKworICBpZiAoc3JjLT5jb250cm9sKQorICAgIGJhc2UgPSBzcmMtPmNvbnRyb2w7CisgIGVsc2UgaWYgKHNyYy0+Y29udGVudF9iYXNlKQorICAgIGJhc2UgPSBzcmMtPmNvbnRlbnRfYmFzZTsKKyAgZWxzZSBpZiAoc3JjLT5jb25uaW5mby51cmxfc3RyKQorICAgIGJhc2UgPSBzcmMtPmNvbm5pbmZvLnVybF9zdHI7CisgIGVsc2UKKyAgICBiYXNlID0gIi8iOworCisgIHJldHVybiBiYXNlOworfQorCitzdGF0aWMgdm9pZAorY2xlYXJfcHRtYXBfaXRlbSAoUHRNYXBJdGVtICogaXRlbSkKK3sKKyAgaWYgKGl0ZW0tPmNhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKGl0ZW0tPmNhcHMpOworfQorCitzdGF0aWMgR3N0UlRTUFN0cmVhbSAqCitnc3RfcnRzcHNyY19jcmVhdGVfc3RyZWFtIChHc3RSVFNQU3JjICogc3JjLCBHc3RTRFBNZXNzYWdlICogc2RwLCBnaW50IGlkeCwKKyAgICBnaW50IG5fc3RyZWFtcykKK3sKKyAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtOworICBjb25zdCBnY2hhciAqY29udHJvbF91cmw7CisgIGNvbnN0IEdzdFNEUE1lZGlhICptZWRpYTsKKworICAvKiBnZXQgbWVkaWEsIHNob3VsZCBub3QgcmV0dXJuIE5VTEwgKi8KKyAgbWVkaWEgPSBnc3Rfc2RwX21lc3NhZ2VfZ2V0X21lZGlhIChzZHAsIGlkeCk7CisgIGlmIChtZWRpYSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHN0cmVhbSA9IGdfbmV3MCAoR3N0UlRTUFN0cmVhbSwgMSk7CisgIHN0cmVhbS0+cGFyZW50ID0gc3JjOworICAvKiB3ZSBtYXJrIHRoZSBwYWQgYXMgbm90IGxpbmtlZCwgd2Ugd2lsbCBtYXJrIGl0IGFzIE9LIHdoZW4gd2UgYWRkIHRoZSBwYWQgdG8KKyAgICogdGhlIGVsZW1lbnQuICovCisgIHN0cmVhbS0+bGFzdF9yZXQgPSBHU1RfRkxPV19OT1RfTElOS0VEOworICBzdHJlYW0tPmFkZGVkID0gRkFMU0U7CisgIHN0cmVhbS0+c2V0dXAgPSBGQUxTRTsKKyAgc3RyZWFtLT5za2lwcGVkID0gRkFMU0U7CisgIHN0cmVhbS0+aWQgPSBpZHg7CisgIHN0cmVhbS0+ZW9zID0gRkFMU0U7CisgIHN0cmVhbS0+ZGlzY29udCA9IFRSVUU7CisgIHN0cmVhbS0+c2VxYmFzZSA9IC0xOworICBzdHJlYW0tPnRpbWViYXNlID0gLTE7CisgIHN0cmVhbS0+c2VuZF9zc3JjID0gZ19yYW5kb21faW50ICgpOworICBzdHJlYW0tPnByb2ZpbGUgPSBHU1RfUlRTUF9QUk9GSUxFX0FWUDsKKyAgc3RyZWFtLT5wdG1hcCA9IGdfYXJyYXlfbmV3IChGQUxTRSwgRkFMU0UsIHNpemVvZiAoUHRNYXBJdGVtKSk7CisgIHN0cmVhbS0+bWlrZXkgPSBOVUxMOworICBzdHJlYW0tPnN0cmVhbV9pZCA9IE5VTEw7CisgIGdfbXV0ZXhfaW5pdCAoJnN0cmVhbS0+Y29ubmluZm8uc2VuZF9sb2NrKTsKKyAgZ19tdXRleF9pbml0ICgmc3RyZWFtLT5jb25uaW5mby5yZWN2X2xvY2spOworICBnX2FycmF5X3NldF9jbGVhcl9mdW5jIChzdHJlYW0tPnB0bWFwLCAoR0Rlc3Ryb3lOb3RpZnkpIGNsZWFyX3B0bWFwX2l0ZW0pOworCisgIC8qIGNvbGxlY3QgYmFuZHdpZHRoIGluZm9ybWF0aW9uIGZvciB0aGlzIHN0ZWFtLiBGSVhNRSwgY29uZmlndXJlIGluIHRoZSBSVFAKKyAgICogc2Vzc2lvbiBtYW5hZ2VyIHRvIHNjYWxlIFJUQ1AuICovCisgIGdzdF9ydHNwc3JjX2NvbGxlY3RfYmFuZHdpZHRoIChzcmMsIHNkcCwgbWVkaWEsIHN0cmVhbSk7CisKKyAgLyogY29sbGVjdCBjb25uZWN0aW9uIGluZm8gKi8KKyAgZ3N0X3J0c3BzcmNfY29sbGVjdF9jb25uZWN0aW9ucyAoc3JjLCBzZHAsIG1lZGlhLCBzdHJlYW0pOworCisgIC8qIG1ha2UgdGhlIHBheWxvYWQgdHlwZSBtYXAgKi8KKyAgZ3N0X3J0c3BzcmNfY29sbGVjdF9wYXlsb2FkcyAoc3JjLCBzZHAsIG1lZGlhLCBzdHJlYW0pOworCisgIC8qIGNvbGxlY3QgcG9ydCBudW1iZXIgKi8KKyAgc3RyZWFtLT5wb3J0ID0gZ3N0X3NkcF9tZWRpYV9nZXRfcG9ydCAobWVkaWEpOworCisgIC8qIGdldCBjb250cm9sIHVybCB0byBjb25zdHJ1Y3QgdGhlIHNldHVwIHVybC4gVGhlIHNldHVwIHVybCBpcyB1c2VkIHRvCisgICAqIGNvbmZpZ3VyZSB0aGUgdHJhbnNwb3J0IG9mIHRoZSBzdHJlYW0gYW5kIGlzIHVzZWQgdG8gaWRlbnRpdHkgdGhlIHN0cmVhbSBpbgorICAgKiB0aGUgUlRQLUluZm8gaGVhZGVyIGZpZWxkIHJldHVybmVkIGZyb20gUExBWS4gKi8KKyAgY29udHJvbF91cmwgPSBnc3Rfc2RwX21lZGlhX2dldF9hdHRyaWJ1dGVfdmFsIChtZWRpYSwgImNvbnRyb2wiKTsKKyAgaWYgKGNvbnRyb2xfdXJsID09IE5VTEwpCisgICAgY29udHJvbF91cmwgPSBnc3Rfc2RwX21lc3NhZ2VfZ2V0X2F0dHJpYnV0ZV92YWxfbiAoc2RwLCAiY29udHJvbCIsIDApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInN0cmVhbSAlZCwgKCVwKSIsIHN0cmVhbS0+aWQsIHN0cmVhbSk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIiBwb3J0OiAlZCIsIHN0cmVhbS0+cG9ydCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIiBjb250YWluZXI6ICVkIiwgc3RyZWFtLT5jb250YWluZXIpOworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICIgY29udHJvbDogJXMiLCBHU1RfU1RSX05VTEwgKGNvbnRyb2xfdXJsKSk7CisKKyAgLyogUkZDIDIzMjYsIEMuMzogbWlzc2luZyBjb250cm9sX3VybCBwZXJtaXR0ZWQgaW4gY2FzZSBvZiBhIHNpbmdsZSBzdHJlYW0gKi8KKyAgaWYgKGNvbnRyb2xfdXJsID09IE5VTEwgJiYgbl9zdHJlYW1zID09IDEpIHsKKyAgICBjb250cm9sX3VybCA9ICIiOworICB9CisKKyAgaWYgKGNvbnRyb2xfdXJsICE9IE5VTEwpIHsKKyAgICBzdHJlYW0tPmNvbnRyb2xfdXJsID0gZ19zdHJkdXAgKGNvbnRyb2xfdXJsKTsKKyAgICAvKiBCdWlsZCBhIGZ1bGx5IHF1YWxpZmllZCB1cmwgdXNpbmcgdGhlIGNvbnRlbnRfYmFzZSBpZiBhbnkgb3IgYnkgcHJlZml4aW5nCisgICAgICogdGhlIG9yaWdpbmFsIHJlcXVlc3QuCisgICAgICogSWYgdGhlIGNvbnRyb2xfdXJsIHN0YXJ0cyB3aXRoIGEgJy8nIG9yIGEgbm9uIHJ0c3A6IHByb3RvY29sIHdlIHdpbGwgbW9zdAorICAgICAqIGxpa2VseSBidWlsZCBhIFVSTCB0aGF0IHRoZSBzZXJ2ZXIgd2lsbCBmYWlsIHRvIHVuZGVyc3RhbmQsIHRoaXMgaXMgb2ssCisgICAgICogd2Ugd2lsbCBmYWlsIHRoZW4uICovCisgICAgaWYgKGdfc3RyX2hhc19wcmVmaXggKGNvbnRyb2xfdXJsLCAicnRzcDovLyIpKQorICAgICAgc3RyZWFtLT5jb25uaW5mby5sb2NhdGlvbiA9IGdfc3RyZHVwIChjb250cm9sX3VybCk7CisgICAgZWxzZSB7CisgICAgICBjb25zdCBnY2hhciAqYmFzZTsKKyAgICAgIGdib29sZWFuIGhhc19zbGFzaDsKKworICAgICAgaWYgKGdfc3RyY21wMCAoY29udHJvbF91cmwsICIqIikgPT0gMCkKKyAgICAgICAgY29udHJvbF91cmwgPSAiIjsKKworICAgICAgYmFzZSA9IGdldF9hZ2dyZWdhdGVfY29udHJvbCAoc3JjKTsKKworICAgICAgLyogY2hlY2sgaWYgdGhlIGJhc2UgZW5kcyBvciBjb250cm9sIHN0YXJ0cyB3aXRoIC8gKi8KKyAgICAgIGhhc19zbGFzaCA9IGdfc3RyX2hhc19wcmVmaXggKGNvbnRyb2xfdXJsLCAiLyIpOworICAgICAgaGFzX3NsYXNoID0gaGFzX3NsYXNoIHx8IGdfc3RyX2hhc19zdWZmaXggKGJhc2UsICIvIik7CisKKyAgICAgIC8qIGNvbmNhdGVuYXRlIHRoZSB0d28gc3RyaW5ncywgaW5zZXJ0IC8gd2hlbiBub3QgcHJlc2VudCAqLworICAgICAgc3RyZWFtLT5jb25uaW5mby5sb2NhdGlvbiA9CisgICAgICAgICAgZ19zdHJkdXBfcHJpbnRmICgiJXMlcyVzIiwgYmFzZSwgaGFzX3NsYXNoID8gIiIgOiAiLyIsIGNvbnRyb2xfdXJsKTsKKyAgICB9CisgIH0KKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiIHNldHVwOiAlcyIsCisgICAgICBHU1RfU1RSX05VTEwgKHN0cmVhbS0+Y29ubmluZm8ubG9jYXRpb24pKTsKKworICAvKiB3ZSBrZWVwIHRyYWNrIG9mIGFsbCBzdHJlYW1zICovCisgIHNyYy0+c3RyZWFtcyA9IGdfbGlzdF9hcHBlbmQgKHNyYy0+c3RyZWFtcywgc3RyZWFtKTsKKworICByZXR1cm4gc3RyZWFtOworCisgIC8qIEVSUk9SUyAqLworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfc3RyZWFtX2ZyZWUgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFJUU1BTdHJlYW0gKiBzdHJlYW0pCit7CisgIGdpbnQgaTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJmcmVlIHN0cmVhbSAlcCIsIHN0cmVhbSk7CisKKyAgZ19hcnJheV9mcmVlIChzdHJlYW0tPnB0bWFwLCBUUlVFKTsKKworICBnX2ZyZWUgKHN0cmVhbS0+ZGVzdGluYXRpb24pOworICBnX2ZyZWUgKHN0cmVhbS0+Y29udHJvbF91cmwpOworICBnX2ZyZWUgKHN0cmVhbS0+Y29ubmluZm8ubG9jYXRpb24pOworICBnX2ZyZWUgKHN0cmVhbS0+c3RyZWFtX2lkKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgaWYgKHN0cmVhbS0+dWRwc3JjW2ldKSB7CisgICAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHN0cmVhbS0+dWRwc3JjW2ldLCBHU1RfU1RBVEVfTlVMTCk7CisgICAgICBnc3RfYmluX3JlbW92ZSAoR1NUX0JJTl9DQVNUIChzcmMpLCBzdHJlYW0tPnVkcHNyY1tpXSk7CisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChzdHJlYW0tPnVkcHNyY1tpXSk7CisgICAgfQorICAgIGlmIChzdHJlYW0tPmNoYW5uZWxwYWRbaV0pCisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChzdHJlYW0tPmNoYW5uZWxwYWRbaV0pOworCisgICAgaWYgKHN0cmVhbS0+dWRwc2lua1tpXSkgeworICAgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzdHJlYW0tPnVkcHNpbmtbaV0sIEdTVF9TVEFURV9OVUxMKTsKKyAgICAgIGdzdF9iaW5fcmVtb3ZlIChHU1RfQklOX0NBU1QgKHNyYyksIHN0cmVhbS0+dWRwc2lua1tpXSk7CisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChzdHJlYW0tPnVkcHNpbmtbaV0pOworICAgIH0KKyAgfQorICBpZiAoc3RyZWFtLT5mYWtlc3JjKSB7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzdHJlYW0tPmZha2VzcmMsIEdTVF9TVEFURV9OVUxMKTsKKyAgICBnc3RfYmluX3JlbW92ZSAoR1NUX0JJTl9DQVNUIChzcmMpLCBzdHJlYW0tPmZha2VzcmMpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHN0cmVhbS0+ZmFrZXNyYyk7CisgIH0KKyAgaWYgKHN0cmVhbS0+c3JjcGFkKSB7CisgICAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzdHJlYW0tPnNyY3BhZCwgRkFMU0UpOworICAgIGlmIChzdHJlYW0tPmFkZGVkKQorICAgICAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAoc3JjKSwgc3RyZWFtLT5zcmNwYWQpOworICB9CisgIGlmIChzdHJlYW0tPnNydHBlbmMpCisgICAgZ3N0X29iamVjdF91bnJlZiAoc3RyZWFtLT5zcnRwZW5jKTsKKyAgaWYgKHN0cmVhbS0+c3J0cGRlYykKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzdHJlYW0tPnNydHBkZWMpOworICBpZiAoc3RyZWFtLT5zcnRjcHBhcmFtcykKKyAgICBnc3RfY2Fwc191bnJlZiAoc3RyZWFtLT5zcnRjcHBhcmFtcyk7CisgIGlmIChzdHJlYW0tPm1pa2V5KQorICAgIGdzdF9taWtleV9tZXNzYWdlX3VucmVmIChzdHJlYW0tPm1pa2V5KTsKKyAgaWYgKHN0cmVhbS0+cnRjcHBhZCkKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzdHJlYW0tPnJ0Y3BwYWQpOworICBpZiAoc3RyZWFtLT5zZXNzaW9uKQorICAgIGdfb2JqZWN0X3VucmVmIChzdHJlYW0tPnNlc3Npb24pOworICBpZiAoc3RyZWFtLT5ydHhfcHRfbWFwKQorICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoc3RyZWFtLT5ydHhfcHRfbWFwKTsKKworICBnX211dGV4X2NsZWFyICgmc3RyZWFtLT5jb25uaW5mby5zZW5kX2xvY2spOworICBnX211dGV4X2NsZWFyICgmc3RyZWFtLT5jb25uaW5mby5yZWN2X2xvY2spOworCisgIGdfZnJlZSAoc3RyZWFtKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX2NsZWFudXAgKEdzdFJUU1BTcmMgKiBzcmMpCit7CisgIEdMaXN0ICp3YWxrOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNsZWFudXAiKTsKKworICBmb3IgKHdhbGsgPSBzcmMtPnN0cmVhbXM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RSVFNQU3RyZWFtICpzdHJlYW0gPSAoR3N0UlRTUFN0cmVhbSAqKSB3YWxrLT5kYXRhOworCisgICAgZ3N0X3J0c3BzcmNfc3RyZWFtX2ZyZWUgKHNyYywgc3RyZWFtKTsKKyAgfQorICBnX2xpc3RfZnJlZSAoc3JjLT5zdHJlYW1zKTsKKyAgc3JjLT5zdHJlYW1zID0gTlVMTDsKKyAgaWYgKHNyYy0+bWFuYWdlcikgeworICAgIGlmIChzcmMtPm1hbmFnZXJfc2lnX2lkKSB7CisgICAgICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QgKHNyYy0+bWFuYWdlciwgc3JjLT5tYW5hZ2VyX3NpZ19pZCk7CisgICAgICBzcmMtPm1hbmFnZXJfc2lnX2lkID0gMDsKKyAgICB9CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzcmMtPm1hbmFnZXIsIEdTVF9TVEFURV9OVUxMKTsKKyAgICBnc3RfYmluX3JlbW92ZSAoR1NUX0JJTl9DQVNUIChzcmMpLCBzcmMtPm1hbmFnZXIpOworICAgIHNyYy0+bWFuYWdlciA9IE5VTEw7CisgIH0KKyAgaWYgKHNyYy0+cHJvcHMpCisgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChzcmMtPnByb3BzKTsKKyAgc3JjLT5wcm9wcyA9IE5VTEw7CisKKyAgZ19mcmVlIChzcmMtPmNvbnRlbnRfYmFzZSk7CisgIHNyYy0+Y29udGVudF9iYXNlID0gTlVMTDsKKworICBnX2ZyZWUgKHNyYy0+Y29udHJvbCk7CisgIHNyYy0+Y29udHJvbCA9IE5VTEw7CisKKyAgaWYgKHNyYy0+cmFuZ2UpCisgICAgZ3N0X3J0c3BfcmFuZ2VfZnJlZSAoc3JjLT5yYW5nZSk7CisgIHNyYy0+cmFuZ2UgPSBOVUxMOworCisgIC8qIGRvbid0IGNsZWFyIHRoZSBTRFAgd2hlbiBpdCB3YXMgdXNlZCBpbiB0aGUgdXJsICovCisgIGlmIChzcmMtPnNkcCAmJiAhc3JjLT5mcm9tX3NkcCkgeworICAgIGdzdF9zZHBfbWVzc2FnZV9mcmVlIChzcmMtPnNkcCk7CisgICAgc3JjLT5zZHAgPSBOVUxMOworICB9CisKKyAgc3JjLT5uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKworICBpZiAoc3JjLT5wcm92aWRlZF9jbG9jaykgeworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNyYy0+cHJvdmlkZWRfY2xvY2spOworICAgIHNyYy0+cHJvdmlkZWRfY2xvY2sgPSBOVUxMOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfYWxsb2NfdWRwX3BvcnRzIChHc3RSVFNQU3RyZWFtICogc3RyZWFtLAorICAgIGdpbnQgKiBydHBwb3J0LCBnaW50ICogcnRjcHBvcnQpCit7CisgIEdzdFJUU1BTcmMgKnNyYzsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RFbGVtZW50ICp1ZHBzcmMwLCAqdWRwc3JjMTsKKyAgZ2ludCB0bXBfcnRwLCB0bXBfcnRjcDsKKyAgZ3VpbnQgY291bnQ7CisgIGNvbnN0IGdjaGFyICpob3N0OworCisgIHNyYyA9IHN0cmVhbS0+cGFyZW50OworCisgIHVkcHNyYzAgPSBOVUxMOworICB1ZHBzcmMxID0gTlVMTDsKKyAgY291bnQgPSAwOworCisgIC8qIFN0YXJ0IGF0IG5leHQgcG9ydCAqLworICB0bXBfcnRwID0gc3JjLT5uZXh0X3BvcnRfbnVtOworCisgIGlmIChzdHJlYW0tPmlzX2lwdjYpCisgICAgaG9zdCA9ICJ1ZHA6Ly9bOjowXSI7CisgIGVsc2UKKyAgICBob3N0ID0gInVkcDovLzAuMC4wLjAiOworCisgIC8qIHRyeSB0byBhbGxvY2F0ZSAyIFVEUCBwb3J0cywgdGhlIFJUUCBwb3J0IHNob3VsZCBiZSBhbiBldmVuCisgICAqIG51bWJlciBhbmQgdGhlIFJUQ1AgcG9ydCBzaG91bGQgYmUgdGhlIG5leHQgKHVuZXZlbikgcG9ydCAqLworYWdhaW46CisKKyAgaWYgKHRtcF9ydHAgIT0gMCAmJiBzcmMtPmNsaWVudF9wb3J0X3JhbmdlLm1heCA+IDAgJiYKKyAgICAgIHRtcF9ydHAgPj0gc3JjLT5jbGllbnRfcG9ydF9yYW5nZS5tYXgpCisgICAgZ290byBub19wb3J0czsKKworICB1ZHBzcmMwID0gZ3N0X2VsZW1lbnRfbWFrZV9mcm9tX3VyaSAoR1NUX1VSSV9TUkMsIGhvc3QsIE5VTEwsIE5VTEwpOworICBpZiAodWRwc3JjMCA9PSBOVUxMKQorICAgIGdvdG8gbm9fdWRwX3Byb3RvY29sOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUICh1ZHBzcmMwKSwgInBvcnQiLCB0bXBfcnRwLCAicmV1c2UiLCBGQUxTRSwgTlVMTCk7CisKKyAgaWYgKHNyYy0+dWRwX2J1ZmZlcl9zaXplICE9IDApCisgICAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAodWRwc3JjMCksICJidWZmZXItc2l6ZSIsIHNyYy0+dWRwX2J1ZmZlcl9zaXplLAorICAgICAgICBOVUxMKTsKKworICByZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHVkcHNyYzAsIEdTVF9TVEFURV9SRUFEWSk7CisgIGlmIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKSB7CisgICAgaWYgKHRtcF9ydHAgIT0gMCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiVW5hYmxlIHRvIG1ha2UgdWRwc3JjIGZyb20gUlRQIHBvcnQgJWQiLCB0bXBfcnRwKTsKKworICAgICAgdG1wX3J0cCArPSAyOworICAgICAgaWYgKCsrY291bnQgPiBzcmMtPnJldHJ5KQorICAgICAgICBnb3RvIG5vX3BvcnRzOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJmcmVlIFJUUCB1ZHBzcmMiKTsKKyAgICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAodWRwc3JjMCwgR1NUX1NUQVRFX05VTEwpOworICAgICAgZ3N0X29iamVjdF91bnJlZiAodWRwc3JjMCk7CisgICAgICB1ZHBzcmMwID0gTlVMTDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicmV0cnkgJWQiLCBjb3VudCk7CisgICAgICBnb3RvIGFnYWluOworICAgIH0KKyAgICBnb3RvIG5vX3VkcF9wcm90b2NvbDsKKyAgfQorCisgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKHVkcHNyYzApLCAicG9ydCIsICZ0bXBfcnRwLCBOVUxMKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZ290IFJUUCBwb3J0ICVkIiwgdG1wX3J0cCk7CisKKyAgLyogY2hlY2sgaWYgcG9ydCBpcyBldmVuICovCisgIGlmICgodG1wX3J0cCAmIDB4MDEpICE9IDApIHsKKyAgICAvKiBwb3J0IG5vdCBldmVuLCBjbG9zZSBhbmQgYWxsb2NhdGUgYW5vdGhlciAqLworICAgIGlmICgrK2NvdW50ID4gc3JjLT5yZXRyeSkKKyAgICAgIGdvdG8gbm9fcG9ydHM7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJSVFAgcG9ydCBub3QgZXZlbiIpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZnJlZSBSVFAgdWRwc3JjIik7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlICh1ZHBzcmMwLCBHU1RfU1RBVEVfTlVMTCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAodWRwc3JjMCk7CisgICAgdWRwc3JjMCA9IE5VTEw7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJyZXRyeSAlZCIsIGNvdW50KTsKKyAgICB0bXBfcnRwKys7CisgICAgZ290byBhZ2FpbjsKKyAgfQorCisgIC8qIGFsbG9jYXRlIHBvcnQrMSBmb3IgUlRDUCBub3cgKi8KKyAgdWRwc3JjMSA9IGdzdF9lbGVtZW50X21ha2VfZnJvbV91cmkgKEdTVF9VUklfU1JDLCBob3N0LCBOVUxMLCBOVUxMKTsKKyAgaWYgKHVkcHNyYzEgPT0gTlVMTCkKKyAgICBnb3RvIG5vX3VkcF9ydGNwX3Byb3RvY29sOworCisgIC8qIHNldCBwb3J0ICovCisgIHRtcF9ydGNwID0gdG1wX3J0cCArIDE7CisgIGlmIChzcmMtPmNsaWVudF9wb3J0X3JhbmdlLm1heCA+IDAgJiYgdG1wX3J0Y3AgPiBzcmMtPmNsaWVudF9wb3J0X3JhbmdlLm1heCkKKyAgICBnb3RvIG5vX3BvcnRzOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHVkcHNyYzEpLCAicG9ydCIsIHRtcF9ydGNwLCAicmV1c2UiLCBGQUxTRSwgTlVMTCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic3RhcnRpbmcgUlRDUCBvbiBwb3J0ICVkIiwgdG1wX3J0Y3ApOworICByZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHVkcHNyYzEsIEdTVF9TVEFURV9SRUFEWSk7CisgIC8qIHRtcF9ydGNwIHBvcnQgaXMgYnVzeSBhbHJlYWR5IDogcmV0cnkgdG8gbWFrZSBydHAvcnRjcCBwYWlyICovCisgIGlmIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiVW5hYmxlIHRvIG1ha2UgdWRwc3JjIGZyb20gUlRDUCBwb3J0ICVkIiwgdG1wX3J0Y3ApOworCisgICAgaWYgKCsrY291bnQgPiBzcmMtPnJldHJ5KQorICAgICAgZ290byBub19wb3J0czsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImZyZWUgUlRQIHVkcHNyYyIpOworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAodWRwc3JjMCwgR1NUX1NUQVRFX05VTEwpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHVkcHNyYzApOworICAgIHVkcHNyYzAgPSBOVUxMOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZnJlZSBSVENQIHVkcHNyYyIpOworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAodWRwc3JjMSwgR1NUX1NUQVRFX05VTEwpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHVkcHNyYzEpOworICAgIHVkcHNyYzEgPSBOVUxMOworCisgICAgdG1wX3J0cCArPSAyOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInJldHJ5ICVkIiwgY291bnQpOworICAgIGdvdG8gYWdhaW47CisgIH0KKworICAvKiBhbGwgZmluZSwgZG8gcG9ydCBjaGVjayAqLworICBnX29iamVjdF9nZXQgKEdfT0JKRUNUICh1ZHBzcmMwKSwgInBvcnQiLCBydHBwb3J0LCBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChHX09CSkVDVCAodWRwc3JjMSksICJwb3J0IiwgcnRjcHBvcnQsIE5VTEwpOworCisgIC8qIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uLi4gKi8KKyAgaWYgKCpydHBwb3J0ICE9IHRtcF9ydHAgfHwgKnJ0Y3Bwb3J0ICE9IHRtcF9ydGNwKQorICAgIGdvdG8gcG9ydF9lcnJvcjsKKworICAvKiB3ZSBrZWVwIHRoZXNlIGVsZW1lbnRzLCB3ZSBjb25maWd1cmUgYWxsIGluIGNvbmZpZ3VyZV90cmFuc3BvcnQgd2hlbiB0aGUKKyAgICogc2VydmVyIHRvbGQgdXMgdG8gcmVhbGx5IHVzZSB0aGUgVURQIHBvcnRzLiAqLworICBzdHJlYW0tPnVkcHNyY1swXSA9IGdzdF9vYmplY3RfcmVmX3NpbmsgKHVkcHNyYzApOworICBzdHJlYW0tPnVkcHNyY1sxXSA9IGdzdF9vYmplY3RfcmVmX3NpbmsgKHVkcHNyYzEpOworICBnc3RfZWxlbWVudF9zZXRfbG9ja2VkX3N0YXRlIChzdHJlYW0tPnVkcHNyY1swXSwgVFJVRSk7CisgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKHN0cmVhbS0+dWRwc3JjWzFdLCBUUlVFKTsKKworICAvKiBrZWVwIHRyYWNrIG9mIG5leHQgYXZhaWxhYmxlIHBvcnQgbnVtYmVyIHdoZW4gd2UgaGF2ZSBhIHJhbmdlCisgICAqIGNvbmZpZ3VyZWQgKi8KKyAgaWYgKHNyYy0+bmV4dF9wb3J0X251bSAhPSAwKQorICAgIHNyYy0+bmV4dF9wb3J0X251bSA9IHRtcF9ydGNwICsgMTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK25vX3VkcF9wcm90b2NvbDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNvdWxkIG5vdCBnZXQgVURQIHNvdXJjZSIpOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorbm9fcG9ydHM6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb3VsZCBub3QgYWxsb2NhdGUgVURQIHBvcnQgcGFpciBhZnRlciAlZCByZXRyaWVzIiwKKyAgICAgICAgY291bnQpOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorbm9fdWRwX3J0Y3BfcHJvdG9jb2w6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb3VsZCBub3QgZ2V0IFVEUCBzb3VyY2UgZm9yIFJUQ1AiKTsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KK3BvcnRfZXJyb3I6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJwb3J0cyBkb24ndCBtYXRjaCBydHA6ICVkPC0+JWQsIHJ0Y3A6ICVkPC0+JWQiLAorICAgICAgICB0bXBfcnRwLCAqcnRwcG9ydCwgdG1wX3J0Y3AsICpydGNwcG9ydCk7CisgICAgZ290byBjbGVhbnVwOworICB9CitjbGVhbnVwOgorICB7CisgICAgaWYgKHVkcHNyYzApIHsKKyAgICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAodWRwc3JjMCwgR1NUX1NUQVRFX05VTEwpOworICAgICAgZ3N0X29iamVjdF91bnJlZiAodWRwc3JjMCk7CisgICAgfQorICAgIGlmICh1ZHBzcmMxKSB7CisgICAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHVkcHNyYzEsIEdTVF9TVEFURV9OVUxMKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHVkcHNyYzEpOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX3NldF9zdGF0ZSAoR3N0UlRTUFNyYyAqIHNyYywgR3N0U3RhdGUgc3RhdGUpCit7CisgIEdMaXN0ICp3YWxrOworCisgIGlmIChzcmMtPm1hbmFnZXIpCisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChHU1RfRUxFTUVOVF9DQVNUIChzcmMtPm1hbmFnZXIpLCBzdGF0ZSk7CisKKyAgZm9yICh3YWxrID0gc3JjLT5zdHJlYW1zOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtID0gKEdzdFJUU1BTdHJlYW0gKikgd2Fsay0+ZGF0YTsKKyAgICBnaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICBpZiAoc3RyZWFtLT51ZHBzcmNbaV0pCisgICAgICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc3RyZWFtLT51ZHBzcmNbaV0sIHN0YXRlKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX2ZsdXNoIChHc3RSVFNQU3JjICogc3JjLCBnYm9vbGVhbiBmbHVzaCwgZ2Jvb2xlYW4gcGxheWluZykKK3sKKyAgR3N0RXZlbnQgKmV2ZW50OworICBnaW50IGNtZDsKKyAgR3N0U3RhdGUgc3RhdGU7CisKKyAgaWYgKGZsdXNoKSB7CisgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2ZsdXNoX3N0YXJ0ICgpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInN0YXJ0IGZsdXNoIik7CisgICAgY21kID0gQ01EX1dBSVQ7CisgICAgc3RhdGUgPSBHU1RfU1RBVEVfUEFVU0VEOworICB9IGVsc2UgeworICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19mbHVzaF9zdG9wIChGQUxTRSk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic3RvcCBmbHVzaDsgcGxheWluZyAlZCIsIHBsYXlpbmcpOworICAgIGNtZCA9IENNRF9MT09QOworICAgIGlmIChwbGF5aW5nKQorICAgICAgc3RhdGUgPSBHU1RfU1RBVEVfUExBWUlORzsKKyAgICBlbHNlCisgICAgICBzdGF0ZSA9IEdTVF9TVEFURV9QQVVTRUQ7CisgIH0KKyAgZ3N0X3J0c3BzcmNfcHVzaF9ldmVudCAoc3JjLCBldmVudCk7CisgIGdzdF9ydHNwc3JjX2xvb3Bfc2VuZF9jbWQgKHNyYywgY21kLCBDTURfTE9PUCk7CisgIGdzdF9ydHNwc3JjX3NldF9zdGF0ZSAoc3JjLCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBHc3RSVFNQUmVzdWx0Citnc3RfcnRzcHNyY19jb25uZWN0aW9uX3NlbmQgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFJUU1BDb25uSW5mbyAqIGNvbm5pbmZvLAorICAgIEdzdFJUU1BNZXNzYWdlICogbWVzc2FnZSwgR1RpbWVWYWwgKiB0aW1lb3V0KQoreworICBHc3RSVFNQUmVzdWx0IHJldDsKKworICBpZiAoY29ubmluZm8tPmNvbm5lY3Rpb24pIHsKKyAgICBnX211dGV4X2xvY2sgKCZjb25uaW5mby0+c2VuZF9sb2NrKTsKKyAgICByZXQgPSBnc3RfcnRzcF9jb25uZWN0aW9uX3NlbmQgKGNvbm5pbmZvLT5jb25uZWN0aW9uLCBtZXNzYWdlLCB0aW1lb3V0KTsKKyAgICBnX211dGV4X3VubG9jayAoJmNvbm5pbmZvLT5zZW5kX2xvY2spOworICB9IGVsc2UgeworICAgIHJldCA9IEdTVF9SVFNQX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX2Nvbm5lY3Rpb25fcmVjZWl2ZSAoR3N0UlRTUFNyYyAqIHNyYywgR3N0UlRTUENvbm5JbmZvICogY29ubmluZm8sCisgICAgR3N0UlRTUE1lc3NhZ2UgKiBtZXNzYWdlLCBHVGltZVZhbCAqIHRpbWVvdXQpCit7CisgIEdzdFJUU1BSZXN1bHQgcmV0OworCisgIGlmIChjb25uaW5mby0+Y29ubmVjdGlvbikgeworICAgIGdfbXV0ZXhfbG9jayAoJmNvbm5pbmZvLT5yZWN2X2xvY2spOworICAgIHJldCA9IGdzdF9ydHNwX2Nvbm5lY3Rpb25fcmVjZWl2ZSAoY29ubmluZm8tPmNvbm5lY3Rpb24sIG1lc3NhZ2UsIHRpbWVvdXQpOworICAgIGdfbXV0ZXhfdW5sb2NrICgmY29ubmluZm8tPnJlY3ZfbG9jayk7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gR1NUX1JUU1BfRVJST1I7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfZ2V0X3Bvc2l0aW9uIChHc3RSVFNQU3JjICogc3JjKQoreworICBHc3RRdWVyeSAqcXVlcnk7CisgIEdMaXN0ICp3YWxrOworCisgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19wb3NpdGlvbiAoR1NUX0ZPUk1BVF9USU1FKTsKKyAgLyogIHNob3VsZCBiZSBrbm93biBzb21ld2hlcmUgZG93biB0aGUgc3RyZWFtIChlLmcuIGppdHRlcmJ1ZmZlcikgKi8KKyAgZm9yICh3YWxrID0gc3JjLT5zdHJlYW1zOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtID0gKEdzdFJUU1BTdHJlYW0gKikgd2Fsay0+ZGF0YTsKKyAgICBHc3RGb3JtYXQgZm10OworICAgIGdpbnQ2NCBwb3M7CisKKyAgICBpZiAoc3RyZWFtLT5zcmNwYWQpIHsKKyAgICAgIGlmIChnc3RfcGFkX3F1ZXJ5IChzdHJlYW0tPnNyY3BhZCwgcXVlcnkpKSB7CisgICAgICAgIGdzdF9xdWVyeV9wYXJzZV9wb3NpdGlvbiAocXVlcnksICZmbXQsICZwb3MpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJyZXRhaW5pbmcgcG9zaXRpb24gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocG9zKSk7CisgICAgICAgIHNyYy0+bGFzdF9wb3MgPSBwb3M7CisgICAgICAgIGdvdG8gb3V0OworICAgICAgfQorICAgIH0KKyAgfQorCisgIHNyYy0+bGFzdF9wb3MgPSAwOworCitvdXQ6CisKKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfcGVyZm9ybV9zZWVrIChHc3RSVFNQU3JjICogc3JjLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBnZG91YmxlIHJhdGU7CisgIEdzdEZvcm1hdCBmb3JtYXQ7CisgIEdzdFNlZWtGbGFncyBmbGFnczsKKyAgR3N0U2Vla1R5cGUgY3VyX3R5cGUgPSBHU1RfU0VFS19UWVBFX05PTkUsIHN0b3BfdHlwZTsKKyAgZ2ludDY0IGN1ciwgc3RvcDsKKyAgZ2Jvb2xlYW4gZmx1c2gsIHNraXA7CisgIGdib29sZWFuIHVwZGF0ZTsKKyAgZ2Jvb2xlYW4gcGxheWluZzsKKyAgR3N0U2VnbWVudCBzZWVrc2VnbWVudCA9IHsgMCwgfTsKKyAgR0xpc3QgKndhbGs7CisgIGNvbnN0IGdjaGFyICpzZWVrX3N0eWxlID0gTlVMTDsKKworICBpZiAoZXZlbnQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJkb2luZyBzZWVrIHdpdGggZXZlbnQgJSIgR1NUX1BUUl9GT1JNQVQsIGV2ZW50KTsKKworICAgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgJnJhdGUsICZmb3JtYXQsICZmbGFncywKKyAgICAgICAgJmN1cl90eXBlLCAmY3VyLCAmc3RvcF90eXBlLCAmc3RvcCk7CisKKyAgICAvKiBubyBuZWdhdGl2ZSByYXRlcyB5ZXQgKi8KKyAgICBpZiAocmF0ZSA8IDAuMCkKKyAgICAgIGdvdG8gbmVnYXRpdmVfcmF0ZTsKKworICAgIC8qIHdlIG5lZWQgVElNRSBmb3JtYXQgKi8KKyAgICBpZiAoZm9ybWF0ICE9IHNyYy0+c2VnbWVudC5mb3JtYXQpCisgICAgICBnb3RvIG5vX2Zvcm1hdDsKKworICAgIC8qIENoZWNrIGlmIHdlIGFyZSBub3QgYXQgYWxsIHNlZWthYmxlICovCisgICAgaWYgKHNyYy0+c2Vla2FibGUgPT0gLTEuMCkKKyAgICAgIGdvdG8gbm90X3NlZWthYmxlOworCisgICAgLyogQWRkaXRpb25hbCBzZWVraW5nLXRvLWJlZ2lubmluZy1vbmx5IGNoZWNrICovCisgICAgaWYgKHNyYy0+c2Vla2FibGUgPT0gMC4wICYmIGN1ciAhPSAwKQorICAgICAgZ290byBub3Rfc2Vla2FibGU7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZG9pbmcgc2VlayB3aXRob3V0IGV2ZW50Iik7CisgICAgZmxhZ3MgPSAwOworICAgIGN1cl90eXBlID0gR1NUX1NFRUtfVFlQRV9TRVQ7CisgICAgc3RvcF90eXBlID0gR1NUX1NFRUtfVFlQRV9TRVQ7CisgIH0KKworICAvKiBnZXQgZmx1c2ggZmxhZyAqLworICBmbHVzaCA9IGZsYWdzICYgR1NUX1NFRUtfRkxBR19GTFVTSDsKKyAgc2tpcCA9IGZsYWdzICYgR1NUX1NFRUtfRkxBR19TS0lQOworCisgIC8qIG5vdyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgc3RyZWFtaW5nIHRocmVhZCBpcyBzdG9wcGVkLiBXZSBkbyB0aGlzIGJ5CisgICAqIGVpdGhlciBzZW5kaW5nIGEgRkxVU0hfU1RBUlQgZXZlbnQgZG93bnN0cmVhbSB3aGljaCB3aWxsIGNhdXNlIHRoZQorICAgKiBzdHJlYW1pbmcgdGhyZWFkIHRvIHN0b3Agd2l0aCBhIFdST05HX1NUQVRFLgorICAgKiBGb3IgYSBub24tZmx1c2hpbmcgc2VlayB3ZSBzaW1wbHkgcGF1c2UgdGhlIHRhc2ssIHdoaWNoIHdpbGwgaGFwcGVuIGFzIHNvb24KKyAgICogYXMgaXQgY29tcGxldGVzIG9uZSBpdGVyYXRpb24gKGFuZCB0aHVzIG1pZ2h0IGJsb2NrIHdoZW4gdGhlIHNpbmsgaXMKKyAgICogYmxvY2tpbmcgaW4gcHJlcm9sbCkuICovCisgIGlmIChmbHVzaCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInN0YXJ0aW5nIGZsdXNoIik7CisgICAgZ3N0X3J0c3BzcmNfZmx1c2ggKHNyYywgVFJVRSwgRkFMU0UpOworICB9IGVsc2UgeworICAgIGlmIChzcmMtPnRhc2spIHsKKyAgICAgIGdzdF90YXNrX3BhdXNlIChzcmMtPnRhc2spOworICAgIH0KKyAgfQorCisgIC8qIHdlIHNob3VsZCBub3cgYmUgYWJsZSB0byBncmFiIHRoZSBzdHJlYW1pbmcgdGhyZWFkIGJlY2F1c2Ugd2Ugc3RvcHBlZCBpdAorICAgKiB3aXRoIHRoZSBhYm92ZSBmbHVzaC9wYXVzZSBjb2RlICovCisgIEdTVF9SVFNQX1NUUkVBTV9MT0NLIChzcmMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInN0b3BwZWQgc3RyZWFtaW5nIik7CisKKyAgLyogc3RvcCBmbHVzaGluZyB0aGUgcnRzcCBjb25uZWN0aW9uIHNvIHdlIGNhbiBzZW5kIFBBVVNFL1BMQVkgYmVsb3cgKi8KKyAgZ3N0X3J0c3BzcmNfY29ubmVjdGlvbl9mbHVzaCAoc3JjLCBGQUxTRSk7CisKKyAgLyogY29weSBzZWdtZW50LCB3ZSBuZWVkIHRoaXMgYmVjYXVzZSB3ZSBzdGlsbCBuZWVkIHRoZSBvbGQKKyAgICogc2VnbWVudCB3aGVuIHdlIGNsb3NlIHRoZSBjdXJyZW50IHNlZ21lbnQuICovCisgIG1lbWNweSAoJnNlZWtzZWdtZW50LCAmc3JjLT5zZWdtZW50LCBzaXplb2YgKEdzdFNlZ21lbnQpKTsKKworICAvKiBjb25maWd1cmUgdGhlIHNlZWsgcGFyYW1ldGVycyBpbiB0aGUgc2Vla3NlZ21lbnQuIFdlIHdpbGwgdGhlbiBoYXZlIHRoZQorICAgKiByaWdodCB2YWx1ZXMgaW4gdGhlIHNlZ21lbnQgdG8gcGVyZm9ybSB0aGUgc2VlayAqLworICBpZiAoZXZlbnQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb25maWd1cmluZyBzZWVrIik7CisgICAgZ3N0X3NlZ21lbnRfZG9fc2VlayAoJnNlZWtzZWdtZW50LCByYXRlLCBmb3JtYXQsIGZsYWdzLAorICAgICAgICBjdXJfdHlwZSwgY3VyLCBzdG9wX3R5cGUsIHN0b3AsICZ1cGRhdGUpOworICB9CisKKyAgLyogZmlndXJlIG91dCB0aGUgbGFzdCBwb3NpdGlvbiB3ZSBuZWVkIHRvIHBsYXkuIElmIGl0J3MgY29uZmlndXJlZCAoc3RvcCAhPQorICAgKiAtMSksIHVzZSB0aGF0LCBlbHNlIHdlIHBsYXkgdW50aWwgdGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBmaWxlICovCisgIGlmICgoc3RvcCA9IHNlZWtzZWdtZW50LnN0b3ApID09IC0xKQorICAgIHN0b3AgPSBzZWVrc2VnbWVudC5kdXJhdGlvbjsKKworICAvKiBpZiB3ZSB3ZXJlIHBsYXlpbmcsIHBhdXNlIGZpcnN0ICovCisgIHBsYXlpbmcgPSAoc3JjLT5zdGF0ZSA9PSBHU1RfUlRTUF9TVEFURV9QTEFZSU5HKTsKKyAgaWYgKHBsYXlpbmcpIHsKKyAgICAvKiBvYnRhaW4gY3VycmVudCBwb3NpdGlvbiBpbiBjYXNlIHNlZWsgZmFpbHMgKi8KKyAgICBnc3RfcnRzcHNyY19nZXRfcG9zaXRpb24gKHNyYyk7CisgICAgZ3N0X3J0c3BzcmNfcGF1c2UgKHNyYywgRkFMU0UpOworICB9CisgIHNyYy0+c2tpcCA9IHNraXA7CisKKyAgc3JjLT5zdGF0ZSA9IEdTVF9SVFNQX1NUQVRFX1NFRUtJTkc7CisKKyAgLyogUExBWSB3aWxsIGFkZCB0aGUgcmFuZ2UgaGVhZGVyIG5vdy4gKi8KKyAgc3JjLT5uZWVkX3JhbmdlID0gVFJVRTsKKworICAvKiBwcmVwYXJlIGZvciBzdHJlYW1pbmcgYWdhaW4gKi8KKyAgaWYgKGZsdXNoKSB7CisgICAgLyogaWYgd2Ugc3RhcnRlZCBmbHVzaCwgd2Ugc3RvcCBub3cgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzdG9wcGluZyBmbHVzaCIpOworICAgIGdzdF9ydHNwc3JjX2ZsdXNoIChzcmMsIEZBTFNFLCBwbGF5aW5nKTsKKyAgfQorCisgIC8qIG5vdyB3ZSBkaWQgdGhlIHNlZWsgYW5kIGNhbiBhY3RpdmF0ZSB0aGUgbmV3IHNlZ21lbnQgdmFsdWVzICovCisgIG1lbWNweSAoJnNyYy0+c2VnbWVudCwgJnNlZWtzZWdtZW50LCBzaXplb2YgKEdzdFNlZ21lbnQpKTsKKworICAvKiBpZiB3ZSdyZSBkb2luZyBhIHNlZ21lbnQgc2VlaywgcG9zdCBhIFNFR01FTlRfU1RBUlQgbWVzc2FnZSAqLworICBpZiAoc3JjLT5zZWdtZW50LmZsYWdzICYgR1NUX1NFRUtfRkxBR19TRUdNRU5UKSB7CisgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChzcmMpLAorICAgICAgICBnc3RfbWVzc2FnZV9uZXdfc2VnbWVudF9zdGFydCAoR1NUX09CSkVDVF9DQVNUIChzcmMpLAorICAgICAgICAgICAgc3JjLT5zZWdtZW50LmZvcm1hdCwgc3JjLT5zZWdtZW50LnBvc2l0aW9uKSk7CisgIH0KKworICAvKiBub3cgY3JlYXRlIHRoZSBuZXdzZWdtZW50ICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIkNyZWF0aW5nIG5ld3NlZ21lbnQgZnJvbSAlIiBHX0dJTlQ2NF9GT1JNQVQKKyAgICAgICIgdG8gJSIgR19HSU5UNjRfRk9STUFULCBzcmMtPnNlZ21lbnQucG9zaXRpb24sIHN0b3ApOworCisgIC8qIG1hcmsgZGlzY29udCAqLworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJtYXJrIERJU0NPTlQsIHdlIGRpZCBhIHNlZWsgdG8gYW5vdGhlciBwb3NpdGlvbiIpOworICBmb3IgKHdhbGsgPSBzcmMtPnN0cmVhbXM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RSVFNQU3RyZWFtICpzdHJlYW0gPSAoR3N0UlRTUFN0cmVhbSAqKSB3YWxrLT5kYXRhOworICAgIHN0cmVhbS0+ZGlzY29udCA9IFRSVUU7CisgIH0KKworICAvKiBhbmQgY29udGludWUgcGxheWluZyBpZiBuZWVkZWQgKi8KKyAgR1NUX09CSkVDVF9MT0NLIChzcmMpOworICBwbGF5aW5nID0gKEdTVF9TVEFURV9QRU5ESU5HIChzcmMpID09IEdTVF9TVEFURV9WT0lEX1BFTkRJTkcKKyAgICAgICYmIEdTVF9TVEFURSAoc3JjKSA9PSBHU1RfU1RBVEVfUExBWUlORykKKyAgICAgIHx8IChHU1RfU1RBVEVfUEVORElORyAoc3JjKSA9PSBHU1RfU1RBVEVfUExBWUlORyk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcmMpOworCisgIGlmIChzcmMtPnZlcnNpb24gPj0gR1NUX1JUU1BfVkVSU0lPTl8yXzApIHsKKyAgICBpZiAoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX0FDQ1VSQVRFKQorICAgICAgc2Vla19zdHlsZSA9ICJSQVAiOworICAgIGVsc2UgaWYgKGZsYWdzICYgR1NUX1NFRUtfRkxBR19LRVlfVU5JVCkKKyAgICAgIHNlZWtfc3R5bGUgPSAiQ29SQVAiOworICAgIGVsc2UgaWYgKGZsYWdzICYgR1NUX1NFRUtfRkxBR19LRVlfVU5JVAorICAgICAgICAmJiBmbGFncyAmIEdTVF9TRUVLX0ZMQUdfU05BUF9CRUZPUkUpCisgICAgICBzZWVrX3N0eWxlID0gIkZpcnN0LVByaW9yIjsKKyAgICBlbHNlIGlmIChmbGFncyAmIEdTVF9TRUVLX0ZMQUdfS0VZX1VOSVQgJiYgZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NOQVBfQUZURVIpCisgICAgICBzZWVrX3N0eWxlID0gIk5leHQiOworICB9CisKKyAgaWYgKHBsYXlpbmcpCisgICAgZ3N0X3J0c3BzcmNfcGxheSAoc3JjLCAmc2Vla3NlZ21lbnQsIEZBTFNFLCBzZWVrX3N0eWxlKTsKKworICBHU1RfUlRTUF9TVFJFQU1fVU5MT0NLIChzcmMpOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworbmVnYXRpdmVfcmF0ZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIm5lZ2F0aXZlIHBsYXliYWNrIHJhdGVzIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX2Zvcm1hdDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInVuc3VwcG9ydGVkIGZvcm1hdCBnaXZlbiwgc2VlayBhYm9ydGVkLiIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm90X3NlZWthYmxlOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic3RyZWFtIGlzIG5vdCBzZWVrYWJsZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHNwc3JjX2hhbmRsZV9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFJUU1BTcmMgKnNyYzsKKyAgZ2Jvb2xlYW4gcmVzID0gVFJVRTsKKyAgZ2Jvb2xlYW4gZm9yd2FyZDsKKworICBzcmMgPSBHU1RfUlRTUFNSQ19DQVNUIChwYXJlbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInBhZCAlczolcyByZWNlaXZlZCBldmVudCAlcyIsCisgICAgICBHU1RfREVCVUdfUEFEX05BTUUgKHBhZCksIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICAgIHJlcyA9IGdzdF9ydHNwc3JjX3BlcmZvcm1fc2VlayAoc3JjLCBldmVudCk7CisgICAgICBmb3J3YXJkID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9RT1M6CisgICAgY2FzZSBHU1RfRVZFTlRfTkFWSUdBVElPTjoKKyAgICBjYXNlIEdTVF9FVkVOVF9MQVRFTkNZOgorICAgIGRlZmF1bHQ6CisgICAgICBmb3J3YXJkID0gVFJVRTsKKyAgICAgIGJyZWFrOworICB9CisgIGlmIChmb3J3YXJkKSB7CisgICAgR3N0UGFkICp0YXJnZXQ7CisKKyAgICBpZiAoKHRhcmdldCA9IGdzdF9naG9zdF9wYWRfZ2V0X3RhcmdldCAoR1NUX0dIT1NUX1BBRF9DQVNUIChwYWQpKSkpIHsKKyAgICAgIHJlcyA9IGdzdF9wYWRfc2VuZF9ldmVudCAodGFyZ2V0LCBldmVudCk7CisgICAgICBnc3Rfb2JqZWN0X3VucmVmICh0YXJnZXQpOworICAgIH0gZWxzZSB7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHNwc3JjX2hhbmRsZV9zcmNfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtOworCisgIHN0cmVhbSA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TVFJFQU1fU1RBUlQ6eworICAgICAgY29uc3QgZ2NoYXIgKnVwc3RyZWFtX2lkOworICAgICAgZ2NoYXIgKnN0cmVhbV9pZDsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3N0cmVhbV9zdGFydCAoZXZlbnQsICZ1cHN0cmVhbV9pZCk7CisgICAgICBzdHJlYW1faWQgPSBnX3N0cmR1cF9wcmludGYgKCIlcy8lcyIsIHVwc3RyZWFtX2lkLCBzdHJlYW0tPnN0cmVhbV9pZCk7CisKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoc3RyZWFtX2lkKTsKKyAgICAgIGdfZnJlZSAoc3RyZWFtX2lkKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gZ3N0X3BhZF9wdXNoX2V2ZW50IChzdHJlYW0tPnNyY3BhZCwgZXZlbnQpOworfQorCisvKiB0aGlzIGlzIHRoZSBmaW5hbCBldmVudCBmdW5jdGlvbiB3ZSByZWNlaXZlIG9uIHRoZSBpbnRlcm5hbCBzb3VyY2UgcGFkIHdoZW4KKyAqIHdlIGRlYWwgd2l0aCBUQ1AgY29ubmVjdGlvbnMgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfaGFuZGxlX2ludGVybmFsX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgInJlY2VpdmVkIGV2ZW50ICVzIiwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TRUVLOgorICAgIGNhc2UgR1NUX0VWRU5UX1FPUzoKKyAgICBjYXNlIEdTVF9FVkVOVF9OQVZJR0FUSU9OOgorICAgIGNhc2UgR1NUX0VWRU5UX0xBVEVOQ1k6CisgICAgZGVmYXVsdDoKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKKy8qIHRoaXMgaXMgdGhlIGZpbmFsIHF1ZXJ5IGZ1bmN0aW9uIHdlIHJlY2VpdmUgb24gdGhlIGludGVybmFsIHNvdXJjZSBwYWQgd2hlbgorICogd2UgZGVhbCB3aXRoIFRDUCBjb25uZWN0aW9ucyAqLworc3RhdGljIGdib29sZWFuCitnc3RfcnRzcHNyY19oYW5kbGVfaW50ZXJuYWxfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RSVFNQU3JjICpzcmM7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisKKyAgc3JjID0gR1NUX1JUU1BTUkNfQ0FTVCAoZ3N0X3BhZF9nZXRfZWxlbWVudF9wcml2YXRlIChwYWQpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJwYWQgJXM6JXMgcmVjZWl2ZWQgcXVlcnkgJXMiLAorICAgICAgR1NUX0RFQlVHX1BBRF9OQU1FIChwYWQpLCBHU1RfUVVFUllfVFlQRV9OQU1FIChxdWVyeSkpOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX1BPU0lUSU9OOgorICAgIHsKKyAgICAgIC8qIG5vIGlkZWEgKi8KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9EVVJBVElPTjoKKyAgICB7CisgICAgICBHc3RGb3JtYXQgZm9ybWF0OworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfZHVyYXRpb24gKHF1ZXJ5LCAmZm9ybWF0LCBOVUxMKTsKKworICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6CisgICAgICAgICAgZ3N0X3F1ZXJ5X3NldF9kdXJhdGlvbiAocXVlcnksIGZvcm1hdCwgc3JjLT5zZWdtZW50LmR1cmF0aW9uKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9MQVRFTkNZOgorICAgIHsKKyAgICAgIC8qIHdlIGFyZSBsaXZlIHdpdGggYSBtaW4gbGF0ZW5jeSBvZiAwIGFuZCB1bmxpbWl0ZWQgbWF4IGxhdGVuY3ksIHRoaXMKKyAgICAgICAqIHJlc3VsdCB3aWxsIGJlIHVwZGF0ZWQgYnkgdGhlIHNlc3Npb24gbWFuYWdlciBpZiB0aGVyZSBpcyBhbnkuICovCisgICAgICBnc3RfcXVlcnlfc2V0X2xhdGVuY3kgKHF1ZXJ5LCBUUlVFLCAwLCAtMSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworLyogdGhpcyBxdWVyeSBpcyBleGVjdXRlZCBvbiB0aGUgZ2hvc3Qgc291cmNlIHBhZCBleHBvc2VkIG9uIHJ0c3BzcmMuICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHNwc3JjX2hhbmRsZV9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdFJUU1BTcmMgKnNyYzsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgc3JjID0gR1NUX1JUU1BTUkNfQ0FTVCAocGFyZW50KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJwYWQgJXM6JXMgcmVjZWl2ZWQgcXVlcnkgJXMiLAorICAgICAgR1NUX0RFQlVHX1BBRF9OQU1FIChwYWQpLCBHU1RfUVVFUllfVFlQRV9OQU1FIChxdWVyeSkpOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0RVUkFUSU9OOgorICAgIHsKKyAgICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9kdXJhdGlvbiAocXVlcnksICZmb3JtYXQsIE5VTEwpOworCisgICAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfVElNRToKKyAgICAgICAgICBnc3RfcXVlcnlfc2V0X2R1cmF0aW9uIChxdWVyeSwgZm9ybWF0LCBzcmMtPnNlZ21lbnQuZHVyYXRpb24pOworICAgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfU0VFS0lORzoKKyAgICB7CisgICAgICBHc3RGb3JtYXQgZm9ybWF0OworCisgICAgICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksICZmb3JtYXQsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgaWYgKGZvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICAgICAgZ2Jvb2xlYW4gc2Vla2FibGUgPQorICAgICAgICAgICAgc3JjLT5jdXJfcHJvdG9jb2xzICE9IEdTVF9SVFNQX0xPV0VSX1RSQU5TX1VEUF9NQ0FTVDsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIHN0YXJ0ID0gMCwgZHVyYXRpb24gPSBzcmMtPnNlZ21lbnQuZHVyYXRpb247CisKKyAgICAgICAgLyogc2Vla2luZyB3aXRob3V0IGR1cmF0aW9uIGlzIHVubGlrZWx5ICovCisgICAgICAgIHNlZWthYmxlID0gc2Vla2FibGUgJiYgc3JjLT5zZWVrYWJsZSA+PSAwLjAgJiYgc3JjLT5zZWdtZW50LmR1cmF0aW9uICYmCisgICAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3JjLT5zZWdtZW50LmR1cmF0aW9uKTsKKworICAgICAgICBpZiAoc2Vla2FibGUpIHsKKyAgICAgICAgICBpZiAoc3JjLT5zZWVrYWJsZSA+IDAuMCkgeworICAgICAgICAgICAgc3RhcnQgPSBzcmMtPmxhc3RfcG9zIC0gc3JjLT5zZWVrYWJsZSAqIEdTVF9TRUNPTkQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIHNyYy0+c2Vla2FibGUgPT0gMCBtZWFucyB0aGF0IHdlIGNhbiBvbmx5IHNlZWsgdG8gMCAqLworICAgICAgICAgICAgc3RhcnQgPSAwOworICAgICAgICAgICAgZHVyYXRpb24gPSAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICJzZWVrYWJsZSA6ICVkIiwgc2Vla2FibGUpOworCisgICAgICAgIGdzdF9xdWVyeV9zZXRfc2Vla2luZyAocXVlcnksIEdTVF9GT1JNQVRfVElNRSwgc2Vla2FibGUsIHN0YXJ0LAorICAgICAgICAgICAgZHVyYXRpb24pOworICAgICAgICByZXMgPSBUUlVFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX1VSSToKKyAgICB7CisgICAgICBnY2hhciAqdXJpOworCisgICAgICB1cmkgPSBnc3RfcnRzcHNyY191cmlfZ2V0X3VyaSAoR1NUX1VSSV9IQU5ETEVSIChzcmMpKTsKKyAgICAgIGlmICh1cmkgIT0gTlVMTCkgeworICAgICAgICBnc3RfcXVlcnlfc2V0X3VyaSAocXVlcnksIHVyaSk7CisgICAgICAgIGdfZnJlZSAodXJpKTsKKyAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgIHsKKyAgICAgIEdzdFBhZCAqdGFyZ2V0ID0gZ3N0X2dob3N0X3BhZF9nZXRfdGFyZ2V0IChHU1RfR0hPU1RfUEFEX0NBU1QgKHBhZCkpOworCisgICAgICAvKiBmb3J3YXJkIHRoZSBxdWVyeSB0byB0aGUgcHJveHkgdGFyZ2V0IHBhZCAqLworICAgICAgaWYgKHRhcmdldCkgeworICAgICAgICByZXMgPSBnc3RfcGFkX3F1ZXJ5ICh0YXJnZXQsIHF1ZXJ5KTsKKyAgICAgICAgZ3N0X29iamVjdF91bnJlZiAodGFyZ2V0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKKy8qIGNhbGxiYWNrIGZvciBSVENQIG1lc3NhZ2VzIHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlciB3aGVuIG9wZXJhdGluZyBpbiBUQ1AKKyAqIG1vZGUuICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0c3BzcmNfc2lua19jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UlRTUFNyYyAqc3JjOworICBHc3RSVFNQU3RyZWFtICpzdHJlYW07CisgIEdzdEZsb3dSZXR1cm4gcmVzID0gR1NUX0ZMT1dfT0s7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKmRhdGE7CisgIGd1aW50IHNpemU7CisgIEdzdFJUU1BSZXN1bHQgcmV0OworICBHc3RSVFNQTWVzc2FnZSBtZXNzYWdlID0geyAwIH07CisgIEdzdFJUU1BDb25uSW5mbyAqY29ubmluZm87CisKKyAgc3RyZWFtID0gKEdzdFJUU1BTdHJlYW0gKikgZ3N0X3BhZF9nZXRfZWxlbWVudF9wcml2YXRlIChwYWQpOworICBzcmMgPSBzdHJlYW0tPnBhcmVudDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBzaXplID0gbWFwLnNpemU7CisgIGRhdGEgPSBtYXAuZGF0YTsKKworICBnc3RfcnRzcF9tZXNzYWdlX2luaXRfZGF0YSAoJm1lc3NhZ2UsIHN0cmVhbS0+Y2hhbm5lbFsxXSk7CisKKyAgLyogbGVuZCB0aGUgYm9keSBkYXRhIHRvIHRoZSBtZXNzYWdlICovCisgIGdzdF9ydHNwX21lc3NhZ2VfdGFrZV9ib2R5ICgmbWVzc2FnZSwgZGF0YSwgc2l6ZSk7CisKKyAgaWYgKHN0cmVhbS0+Y29ubmluZm8uY29ubmVjdGlvbikKKyAgICBjb25uaW5mbyA9ICZzdHJlYW0tPmNvbm5pbmZvOworICBlbHNlCisgICAgY29ubmluZm8gPSAmc3JjLT5jb25uaW5mbzsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzZW5kaW5nICV1IGJ5dGVzIFJUQ1AiLCBzaXplKTsKKyAgcmV0ID0gZ3N0X3J0c3BzcmNfY29ubmVjdGlvbl9zZW5kIChzcmMsIGNvbm5pbmZvLCAmbWVzc2FnZSwgTlVMTCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNlbnQgUlRDUCwgJWQiLCByZXQpOworCisgIC8qIGFuZCBzdGVhbCBpdCBhd2F5IGFnYWluIGJlY2F1c2Ugd2Ugd2lsbCBmcmVlIGl0IHdoZW4gdW5yZWZmaW5nIHRoZQorICAgKiBidWZmZXIgKi8KKyAgZ3N0X3J0c3BfbWVzc2FnZV9zdGVhbF9ib2R5ICgmbWVzc2FnZSwgJmRhdGEsICZzaXplKTsKKyAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJm1lc3NhZ2UpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdFBhZFByb2JlUmV0dXJuCitwYWRfYmxvY2tlZCAoR3N0UGFkICogcGFkLCBHc3RQYWRQcm9iZUluZm8gKiBpbmZvLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFJUU1BTcmMgKnNyYyA9IHVzZXJfZGF0YTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJwYWQgJXM6JXMgYmxvY2tlZCwgYWN0aXZhdGluZyBzdHJlYW1zIiwKKyAgICAgIEdTVF9ERUJVR19QQURfTkFNRSAocGFkKSk7CisKKyAgLyogYWN0aXZhdGUgdGhlIHN0cmVhbXMgKi8KKyAgR1NUX09CSkVDVF9MT0NLIChzcmMpOworICBpZiAoIXNyYy0+bmVlZF9hY3RpdmF0ZSkKKyAgICBnb3RvIHdhc19vazsKKworICBzcmMtPm5lZWRfYWN0aXZhdGUgPSBGQUxTRTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7CisKKyAgZ3N0X3J0c3BzcmNfYWN0aXZhdGVfc3RyZWFtcyAoc3JjKTsKKworICByZXR1cm4gR1NUX1BBRF9QUk9CRV9PSzsKKword2FzX29rOgorICB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7CisgICAgcmV0dXJuIEdTVF9QQURfUFJPQkVfT0s7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitjb3B5X3N0aWNreV9ldmVudHMgKEdzdFBhZCAqIHBhZCwgR3N0RXZlbnQgKiogZXZlbnQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0UGFkICpncGFkID0gR1NUX1BBRF9DQVNUICh1c2VyX2RhdGEpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGdwYWQsICJzdG9yZSBzdGlja3kgZXZlbnQgJSIgR1NUX1BUUl9GT1JNQVQsICpldmVudCk7CisgIGdzdF9wYWRfc3RvcmVfc3RpY2t5X2V2ZW50IChncGFkLCAqZXZlbnQpOworCisgIHJldHVybiBUUlVFOworfQorCisvKiB0aGlzIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZSBzZXNzaW9uIG1hbmFnZXIgZ2VuZXJhdGVkIGEgbmV3IHNyYyBwYWQgd2l0aAorICogcGF5bG9hZGVkIFJUUCBwYWNrZXRzLiBXZSBzaW1wbHkgZ2hvc3QgdGhlIHBhZCBoZXJlLiAqLworc3RhdGljIHZvaWQKK25ld19tYW5hZ2VyX3BhZCAoR3N0RWxlbWVudCAqIG1hbmFnZXIsIEdzdFBhZCAqIHBhZCwgR3N0UlRTUFNyYyAqIHNyYykKK3sKKyAgZ2NoYXIgKm5hbWU7CisgIEdzdFBhZFRlbXBsYXRlICp0ZW1wbGF0ZTsKKyAgZ2ludCBpZCwgc3NyYywgcHQ7CisgIEdMaXN0ICpvc3RyZWFtczsKKyAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtOworICBnYm9vbGVhbiBhbGxfYWRkZWQ7CisgIEdzdFBhZCAqaW50ZXJuYWxfc3JjOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImdvdCBuZXcgbWFuYWdlciBwYWQgJSIgR1NUX1BUUl9GT1JNQVQsIHBhZCk7CisKKyAgR1NUX1JUU1BfU1RBVEVfTE9DSyAoc3JjKTsKKyAgLyogZmluZCBzdHJlYW0gKi8KKyAgbmFtZSA9IGdzdF9vYmplY3RfZ2V0X25hbWUgKEdTVF9PQkpFQ1RfQ0FTVCAocGFkKSk7CisgIGlmIChzc2NhbmYgKG5hbWUsICJyZWN2X3J0cF9zcmNfJXVfJXVfJXUiLCAmaWQsICZzc3JjLCAmcHQpICE9IDMpCisgICAgZ290byB1bmtub3duX3N0cmVhbTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzdHJlYW06ICV1LCBTU1JDICUwOHgsIFBUICVkIiwgaWQsIHNzcmMsIHB0KTsKKworICBzdHJlYW0gPSBmaW5kX3N0cmVhbSAoc3JjLCAmaWQsIChncG9pbnRlcikgZmluZF9zdHJlYW1fYnlfaWQpOworICBpZiAoc3RyZWFtID09IE5VTEwpCisgICAgZ290byB1bmtub3duX3N0cmVhbTsKKworICAvKiBzYXZlIFNTUkMgKi8KKyAgc3RyZWFtLT5zc3JjID0gc3NyYzsKKworICAvKiB3ZSdsbCBhZGQgaXQgbGF0ZXIgc2VlIGJlbG93ICovCisgIHN0cmVhbS0+YWRkZWQgPSBUUlVFOworCisgIC8qIGNoZWNrIGlmIHdlIGFkZGVkIGFsbCBzdHJlYW1zICovCisgIGFsbF9hZGRlZCA9IFRSVUU7CisgIGZvciAob3N0cmVhbXMgPSBzcmMtPnN0cmVhbXM7IG9zdHJlYW1zOyBvc3RyZWFtcyA9IGdfbGlzdF9uZXh0IChvc3RyZWFtcykpIHsKKyAgICBHc3RSVFNQU3RyZWFtICpvc3RyZWFtID0gKEdzdFJUU1BTdHJlYW0gKikgb3N0cmVhbXMtPmRhdGE7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzdHJlYW0gJXAsIGNvbnRhaW5lciAlZCwgYWRkZWQgJWQsIHNldHVwICVkIiwKKyAgICAgICAgb3N0cmVhbSwgb3N0cmVhbS0+Y29udGFpbmVyLCBvc3RyZWFtLT5hZGRlZCwgb3N0cmVhbS0+c2V0dXApOworCisgICAgLyogaWYgd2UgZmluZCBhIHN0cmVhbSBmb3Igd2hpY2ggd2UgZGlkIGEgc2V0dXAgdGhhdCBpcyBub3QgYWRkZWQsIHdlCisgICAgICogbmVlZCB0byB3YWl0IHNvbWUgbW9yZSAqLworICAgIGlmIChvc3RyZWFtLT5zZXR1cCAmJiAhb3N0cmVhbS0+YWRkZWQpIHsKKyAgICAgIGFsbF9hZGRlZCA9IEZBTFNFOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIEdTVF9SVFNQX1NUQVRFX1VOTE9DSyAoc3JjKTsKKworICAvKiBjcmVhdGUgYSBuZXcgcGFkIHdlIHdpbGwgdXNlIHRvIHN0cmVhbSB0byAqLworICB0ZW1wbGF0ZSA9IGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldCAoJnJ0cHRlbXBsYXRlKTsKKyAgc3RyZWFtLT5zcmNwYWQgPSBnc3RfZ2hvc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChuYW1lLCBwYWQsIHRlbXBsYXRlKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodGVtcGxhdGUpOworICBnX2ZyZWUgKG5hbWUpOworCisgIC8qIFdlIGludGVyY2VwdCBhbmQgbW9kaWZ5IHRoZSBzdHJlYW0gc3RhcnQgZXZlbnQgKi8KKyAgaW50ZXJuYWxfc3JjID0KKyAgICAgIEdTVF9QQUQgKGdzdF9wcm94eV9wYWRfZ2V0X2ludGVybmFsIChHU1RfUFJPWFlfUEFEIChzdHJlYW0tPnNyY3BhZCkpKTsKKyAgZ3N0X3BhZF9zZXRfZWxlbWVudF9wcml2YXRlIChpbnRlcm5hbF9zcmMsIHN0cmVhbSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChpbnRlcm5hbF9zcmMsIGdzdF9ydHNwc3JjX2hhbmRsZV9zcmNfc2lua19ldmVudCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGludGVybmFsX3NyYyk7CisKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHN0cmVhbS0+c3JjcGFkLCBnc3RfcnRzcHNyY19oYW5kbGVfc3JjX2V2ZW50KTsKKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKHN0cmVhbS0+c3JjcGFkLCBnc3RfcnRzcHNyY19oYW5kbGVfc3JjX3F1ZXJ5KTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzdHJlYW0tPnNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc3RpY2t5X2V2ZW50c19mb3JlYWNoIChwYWQsIGNvcHlfc3RpY2t5X2V2ZW50cywgc3RyZWFtLT5zcmNwYWQpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChzcmMpLCBzdHJlYW0tPnNyY3BhZCk7CisKKyAgaWYgKGFsbF9hZGRlZCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIldlIGFkZGVkIGFsbCBzdHJlYW1zIik7CisgICAgLyogd2hlbiB3ZSBnZXQgaGVyZSwgYWxsIHN0cmVhbSBhcmUgYWRkZWQgYW5kIHdlIGNhbiBmaXJlIHRoZSBuby1tb3JlLXBhZHMKKyAgICAgKiBzaWduYWwuICovCisgICAgZ3N0X2VsZW1lbnRfbm9fbW9yZV9wYWRzIChHU1RfRUxFTUVOVF9DQVNUIChzcmMpKTsKKyAgfQorCisgIHJldHVybjsKKworICAvKiBFUlJPUlMgKi8KK3Vua25vd25fc3RyZWFtOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiaWdub3JpbmcgdW5rbm93biBzdHJlYW0iKTsKKyAgICBHU1RfUlRTUF9TVEFURV9VTkxPQ0sgKHNyYyk7CisgICAgZ19mcmVlIChuYW1lKTsKKyAgICByZXR1cm47CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorc3RyZWFtX2dldF9jYXBzX2Zvcl9wdCAoR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwgZ3VpbnQgcHQpCit7CisgIGd1aW50IGksIGxlbjsKKworICBsZW4gPSBzdHJlYW0tPnB0bWFwLT5sZW47CisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIFB0TWFwSXRlbSAqaXRlbSA9ICZnX2FycmF5X2luZGV4IChzdHJlYW0tPnB0bWFwLCBQdE1hcEl0ZW0sIGkpOworICAgIGlmIChpdGVtLT5wdCA9PSBwdCkKKyAgICAgIHJldHVybiBpdGVtLT5jYXBzOworICB9CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCityZXF1ZXN0X3B0X21hcCAoR3N0RWxlbWVudCAqIG1hbmFnZXIsIGd1aW50IHNlc3Npb24sIGd1aW50IHB0LCBHc3RSVFNQU3JjICogc3JjKQoreworICBHc3RSVFNQU3RyZWFtICpzdHJlYW07CisgIEdzdENhcHMgKmNhcHM7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZ2V0dGluZyBwdCBtYXAgZm9yIHB0ICVkIGluIHNlc3Npb24gJWQiLCBwdCwgc2Vzc2lvbik7CisKKyAgR1NUX1JUU1BfU1RBVEVfTE9DSyAoc3JjKTsKKyAgc3RyZWFtID0gZmluZF9zdHJlYW0gKHNyYywgJnNlc3Npb24sIChncG9pbnRlcikgZmluZF9zdHJlYW1fYnlfaWQpOworICBpZiAoIXN0cmVhbSkKKyAgICBnb3RvIHVua25vd25fc3RyZWFtOworCisgIGlmICgoY2FwcyA9IHN0cmVhbV9nZXRfY2Fwc19mb3JfcHQgKHN0cmVhbSwgcHQpKSkKKyAgICBnc3RfY2Fwc19yZWYgKGNhcHMpOworICBHU1RfUlRTUF9TVEFURV9VTkxPQ0sgKHNyYyk7CisKKyAgcmV0dXJuIGNhcHM7CisKK3Vua25vd25fc3RyZWFtOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAidW5rbm93biBzdHJlYW0gJWQiLCBzZXNzaW9uKTsKKyAgICBHU1RfUlRTUF9TVEFURV9VTkxPQ0sgKHNyYyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX2RvX3N0cmVhbV9lb3MgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFJUU1BTdHJlYW0gKiBzdHJlYW0pCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNldHRpbmcgc3RyZWFtIGZvciBzZXNzaW9uICV1IHRvIEVPUyIsIHN0cmVhbS0+aWQpOworCisgIGlmIChzdHJlYW0tPmVvcykKKyAgICBnb3RvIHdhc19lb3M7CisKKyAgc3RyZWFtLT5lb3MgPSBUUlVFOworICBnc3RfcnRzcHNyY19zdHJlYW1fcHVzaF9ldmVudCAoc3JjLCBzdHJlYW0sIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLword2FzX2VvczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInN0cmVhbSBmb3Igc2Vzc2lvbiAldSB3YXMgYWxyZWFkeSBFT1MiLCBzdHJlYW0tPmlkKTsKKyAgICByZXR1cm47CisgIH0KK30KKworc3RhdGljIHZvaWQKK29uX2J5ZV9zc3JjIChHT2JqZWN0ICogc2Vzc2lvbiwgR09iamVjdCAqIHNvdXJjZSwgR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSkKK3sKKyAgR3N0UlRTUFNyYyAqc3JjID0gc3RyZWFtLT5wYXJlbnQ7CisgIGd1aW50IHNzcmM7CisKKyAgZ19vYmplY3RfZ2V0IChzb3VyY2UsICJzc3JjIiwgJnNzcmMsIE5VTEwpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNvdXJjZSAlMDh4LCBzdHJlYW0gJTA4eCwgc2Vzc2lvbiAldSByZWNlaXZlZCBCWUUiLAorICAgICAgc3NyYywgc3RyZWFtLT5zc3JjLCBzdHJlYW0tPmlkKTsKKworICBpZiAoc3NyYyA9PSBzdHJlYW0tPnNzcmMpCisgICAgZ3N0X3J0c3BzcmNfZG9fc3RyZWFtX2VvcyAoc3JjLCBzdHJlYW0pOworfQorCitzdGF0aWMgdm9pZAorb25fdGltZW91dCAoR09iamVjdCAqIHNlc3Npb24sIEdPYmplY3QgKiBzb3VyY2UsIEdzdFJUU1BTdHJlYW0gKiBzdHJlYW0pCit7CisgIEdzdFJUU1BTcmMgKnNyYyA9IHN0cmVhbS0+cGFyZW50OworICBndWludCBzc3JjOworCisgIGdfb2JqZWN0X2dldCAoc291cmNlLCAic3NyYyIsICZzc3JjLCBOVUxMKTsKKworICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgInNvdXJjZSAlMDh4LCBzdHJlYW0gJTA4eCBpbiBzZXNzaW9uICV1IHRpbWVkIG91dCIsCisgICAgICBzc3JjLCBzdHJlYW0tPnNzcmMsIHN0cmVhbS0+aWQpOworCisgIGlmIChzc3JjID09IHN0cmVhbS0+c3NyYykKKyAgICBnc3RfcnRzcHNyY19kb19zdHJlYW1fZW9zIChzcmMsIHN0cmVhbSk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9ucHRfc3RvcCAoR3N0RWxlbWVudCAqIHJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbiwgZ3VpbnQgc3NyYywgR3N0UlRTUFNyYyAqIHNyYykKK3sKKyAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNvdXJjZSBpbiBzZXNzaW9uICV1IHJlYWNoZWQgTlBUIHN0b3AiLCBzZXNzaW9uKTsKKworICAvKiBnZXQgc3RyZWFtIGZvciBzZXNzaW9uICovCisgIHN0cmVhbSA9IGZpbmRfc3RyZWFtIChzcmMsICZzZXNzaW9uLCAoZ3BvaW50ZXIpIGZpbmRfc3RyZWFtX2J5X2lkKTsKKyAgaWYgKHN0cmVhbSkgeworICAgIGdzdF9ydHNwc3JjX2RvX3N0cmVhbV9lb3MgKHNyYywgc3RyZWFtKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorb25fc3NyY19hY3RpdmUgKEdPYmplY3QgKiBzZXNzaW9uLCBHT2JqZWN0ICogc291cmNlLCBHc3RSVFNQU3RyZWFtICogc3RyZWFtKQoreworICBHU1RfREVCVUdfT0JKRUNUIChzdHJlYW0tPnBhcmVudCwgInNvdXJjZSBpbiBzZXNzaW9uICV1IGlzIGFjdGl2ZSIsCisgICAgICBzdHJlYW0tPmlkKTsKK30KKworc3RhdGljIHZvaWQKK3NldF9tYW5hZ2VyX2J1ZmZlcl9tb2RlIChHc3RSVFNQU3JjICogc3JjKQoreworICBHT2JqZWN0Q2xhc3MgKmtsYXNzOworCisgIGlmIChzcmMtPm1hbmFnZXIgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAga2xhc3MgPSBHX09CSkVDVF9HRVRfQ0xBU1MgKEdfT0JKRUNUIChzcmMtPm1hbmFnZXIpKTsKKworICBpZiAoIWdfb2JqZWN0X2NsYXNzX2ZpbmRfcHJvcGVydHkgKGtsYXNzLCAiYnVmZmVyLW1vZGUiKSkKKyAgICByZXR1cm47CisKKyAgaWYgKHNyYy0+YnVmZmVyX21vZGUgIT0gQlVGRkVSX01PREVfQVVUTykgeworICAgIGdfb2JqZWN0X3NldCAoc3JjLT5tYW5hZ2VyLCAiYnVmZmVyLW1vZGUiLCBzcmMtPmJ1ZmZlcl9tb2RlLCBOVUxMKTsKKworICAgIHJldHVybjsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywKKyAgICAgICJhdXRvIGJ1ZmZlcmluZyBtb2RlLCBoYXZlIGNsb2NrICUiIEdTVF9QVFJfRk9STUFULCBzcmMtPnByb3ZpZGVkX2Nsb2NrKTsKKworICBpZiAoc3JjLT5wcm92aWRlZF9jbG9jaykgeworICAgIEdzdENsb2NrICpjbG9jayA9IGdzdF9lbGVtZW50X2dldF9jbG9jayAoR1NUX0VMRU1FTlRfQ0FTVCAoc3JjKSk7CisKKyAgICBpZiAoY2xvY2sgPT0gc3JjLT5wcm92aWRlZF9jbG9jaykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic2VsZWN0ZWQgc3luY2VkIik7CisgICAgICBnX29iamVjdF9zZXQgKHNyYy0+bWFuYWdlciwgImJ1ZmZlci1tb2RlIiwgQlVGRkVSX01PREVfU1lOQ0VELCBOVUxMKTsKKworICAgICAgaWYgKGNsb2NrKQorICAgICAgICBnc3Rfb2JqZWN0X3VucmVmIChjbG9jayk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBPdGhlcndpc2UgZmFsbC10aHJvdWdoIGFuZCB1c2UgYW5vdGhlciBidWZmZXIgbW9kZSAqLworICAgIGlmIChjbG9jaykKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKGNsb2NrKTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImF1dG8gYnVmZmVyaW5nIG1vZGUiKTsKKyAgaWYgKHNyYy0+dXNlX2J1ZmZlcmluZykgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNlbGVjdGVkIGJ1ZmZlciIpOworICAgIGdfb2JqZWN0X3NldCAoc3JjLT5tYW5hZ2VyLCAiYnVmZmVyLW1vZGUiLCBCVUZGRVJfTU9ERV9CVUZGRVIsIE5VTEwpOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNlbGVjdGVkIHNsYXZlIik7CisgICAgZ19vYmplY3Rfc2V0IChzcmMtPm1hbmFnZXIsICJidWZmZXItbW9kZSIsIEJVRkZFUl9NT0RFX1NMQVZFLCBOVUxMKTsKKyAgfQorfQorCitzdGF0aWMgR3N0Q2FwcyAqCityZXF1ZXN0X2tleSAoR3N0RWxlbWVudCAqIHNydHBkZWMsIGd1aW50IHNzcmMsIEdzdFJUU1BTdHJlYW0gKiBzdHJlYW0pCit7CisgIGd1aW50IGk7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdE1JS0VZTWVzc2FnZSAqbXNnID0gc3RyZWFtLT5taWtleTsKKworICBHU1RfREVCVUcgKCJyZXF1ZXN0IGtleSBTU1JDICV1Iiwgc3NyYyk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX3JlZiAoc3RyZWFtX2dldF9jYXBzX2Zvcl9wdCAoc3RyZWFtLCBzdHJlYW0tPmRlZmF1bHRfcHQpKTsKKyAgY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGNhcHMpOworCisgIC8qIHBhcnNlIGNyeXB0byBzZXNzaW9ucyBhbmQgbG9vayBmb3IgdGhlIFNTUkMgcm9sbG92ZXIgY291bnRlciAqLworICBtc2cgPSBzdHJlYW0tPm1pa2V5OworICBmb3IgKGkgPSAwOyBtc2cgJiYgaSA8IGdzdF9taWtleV9tZXNzYWdlX2dldF9uX2NzIChtc2cpOyBpKyspIHsKKyAgICBjb25zdCBHc3RNSUtFWU1hcFNSVFAgKm1hcCA9IGdzdF9taWtleV9tZXNzYWdlX2dldF9jc19zcnRwIChtc2csIGkpOworCisgICAgaWYgKHNzcmMgPT0gbWFwLT5zc3JjKSB7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAicm9jIiwgR19UWVBFX1VJTlQsIG1hcC0+cm9jLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBjYXBzOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCityZXF1ZXN0X3J0cF9kZWNvZGVyIChHc3RFbGVtZW50ICogcnRwYmluLCBndWludCBzZXNzaW9uLCBHc3RSVFNQU3RyZWFtICogc3RyZWFtKQoreworICBHU1RfREVCVUcgKCJkZWNvZGVyIHNlc3Npb24gJXUsIHN0cmVhbSAlcCwgJWQiLCBzZXNzaW9uLCBzdHJlYW0sIHN0cmVhbS0+aWQpOworICBpZiAoc3RyZWFtLT5pZCAhPSBzZXNzaW9uKQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChzdHJlYW0tPnByb2ZpbGUgIT0gR1NUX1JUU1BfUFJPRklMRV9TQVZQICYmCisgICAgICBzdHJlYW0tPnByb2ZpbGUgIT0gR1NUX1JUU1BfUFJPRklMRV9TQVZQRikKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoc3RyZWFtLT5zcnRwZGVjID09IE5VTEwpIHsKKyAgICBnY2hhciAqbmFtZTsKKworICAgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzcnRwZGVjXyV1Iiwgc2Vzc2lvbik7CisgICAgc3RyZWFtLT5zcnRwZGVjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgic3J0cGRlYyIsIG5hbWUpOworICAgIGdfZnJlZSAobmFtZSk7CisKKyAgICBpZiAoc3RyZWFtLT5zcnRwZGVjID09IE5VTEwpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzdHJlYW0tPnBhcmVudCwgQ09SRSwgTUlTU0lOR19QTFVHSU4sIChOVUxMKSwKKyAgICAgICAgICAoIm5vIHNydHBkZWMgZWxlbWVudCBwcmVzZW50ISIpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBnX3NpZ25hbF9jb25uZWN0IChzdHJlYW0tPnNydHBkZWMsICJyZXF1ZXN0LWtleSIsCisgICAgICAgIChHQ2FsbGJhY2spIHJlcXVlc3Rfa2V5LCBzdHJlYW0pOworICB9CisgIHJldHVybiBnc3Rfb2JqZWN0X3JlZiAoc3RyZWFtLT5zcnRwZGVjKTsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorcmVxdWVzdF9ydGNwX2VuY29kZXIgKEdzdEVsZW1lbnQgKiBydHBiaW4sIGd1aW50IHNlc3Npb24sCisgICAgR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSkKK3sKKyAgZ2NoYXIgKm5hbWU7CisgIEdzdFBhZCAqcGFkOworCisgIEdTVF9ERUJVRyAoImRlY29kZXIgc2Vzc2lvbiAldSwgc3RyZWFtICVwLCAlZCIsIHNlc3Npb24sIHN0cmVhbSwgc3RyZWFtLT5pZCk7CisgIGlmIChzdHJlYW0tPmlkICE9IHNlc3Npb24pCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKHN0cmVhbS0+cHJvZmlsZSAhPSBHU1RfUlRTUF9QUk9GSUxFX1NBVlAgJiYKKyAgICAgIHN0cmVhbS0+cHJvZmlsZSAhPSBHU1RfUlRTUF9QUk9GSUxFX1NBVlBGKQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChzdHJlYW0tPnNydHBlbmMgPT0gTlVMTCkgeworICAgIEdzdFN0cnVjdHVyZSAqczsKKworICAgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzcnRwZW5jXyV1Iiwgc2Vzc2lvbik7CisgICAgc3RyZWFtLT5zcnRwZW5jID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgic3J0cGVuYyIsIG5hbWUpOworICAgIGdfZnJlZSAobmFtZSk7CisKKyAgICBpZiAoc3RyZWFtLT5zcnRwZW5jID09IE5VTEwpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzdHJlYW0tPnBhcmVudCwgQ09SRSwgTUlTU0lOR19QTFVHSU4sIChOVUxMKSwKKyAgICAgICAgICAoIm5vIHNydHBlbmMgZWxlbWVudCBwcmVzZW50ISIpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIGdldCBSVENQIGNyeXB0byBwYXJhbWV0ZXJzIGZyb20gY2FwcyAqLworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChzdHJlYW0tPnNydGNwcGFyYW1zLCAwKTsKKyAgICBpZiAocykgeworICAgICAgR3N0QnVmZmVyICpidWY7CisgICAgICBjb25zdCBnY2hhciAqc3RyOworICAgICAgR1R5cGUgY2lwaGVydHlwZSwgYXV0aHR5cGU7CisgICAgICBHVmFsdWUgcnRjcF9jaXBoZXIgPSBHX1ZBTFVFX0lOSVQsIHJ0Y3BfYXV0aCA9IEdfVkFMVUVfSU5JVDsKKworICAgICAgY2lwaGVydHlwZSA9IGdfdHlwZV9mcm9tX25hbWUgKCJHc3RTcnRwQ2lwaGVyVHlwZSIpOworICAgICAgYXV0aHR5cGUgPSBnX3R5cGVfZnJvbV9uYW1lICgiR3N0U3J0cEF1dGhUeXBlIik7CisgICAgICBnX3ZhbHVlX2luaXQgKCZydGNwX2NpcGhlciwgY2lwaGVydHlwZSk7CisgICAgICBnX3ZhbHVlX2luaXQgKCZydGNwX2F1dGgsIGF1dGh0eXBlKTsKKworICAgICAgc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAic3J0Y3AtY2lwaGVyIik7CisgICAgICBnc3RfdmFsdWVfZGVzZXJpYWxpemUgKCZydGNwX2NpcGhlciwgc3RyKTsKKyAgICAgIHN0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgInNydGNwLWF1dGgiKTsKKyAgICAgIGdzdF92YWx1ZV9kZXNlcmlhbGl6ZSAoJnJ0Y3BfYXV0aCwgc3RyKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0IChzLCAic3J0cC1rZXkiLCBHU1RfVFlQRV9CVUZGRVIsICZidWYsIE5VTEwpOworCisgICAgICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChzdHJlYW0tPnNydHBlbmMpLCAicnRwLWNpcGhlciIsCisgICAgICAgICAgJnJ0Y3BfY2lwaGVyKTsKKyAgICAgIGdfb2JqZWN0X3NldF9wcm9wZXJ0eSAoR19PQkpFQ1QgKHN0cmVhbS0+c3J0cGVuYyksICJydHAtYXV0aCIsCisgICAgICAgICAgJnJ0Y3BfYXV0aCk7CisgICAgICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChzdHJlYW0tPnNydHBlbmMpLCAicnRjcC1jaXBoZXIiLAorICAgICAgICAgICZydGNwX2NpcGhlcik7CisgICAgICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChzdHJlYW0tPnNydHBlbmMpLCAicnRjcC1hdXRoIiwKKyAgICAgICAgICAmcnRjcF9hdXRoKTsKKyAgICAgIGdfb2JqZWN0X3NldCAoc3RyZWFtLT5zcnRwZW5jLCAia2V5IiwgYnVmLCBOVUxMKTsKKworICAgICAgZ192YWx1ZV91bnNldCAoJnJ0Y3BfY2lwaGVyKTsKKyAgICAgIGdfdmFsdWVfdW5zZXQgKCZydGNwX2F1dGgpOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICB9CisgIH0KKyAgbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInJ0Y3Bfc2lua18lZCIsIHNlc3Npb24pOworICBwYWQgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHN0cmVhbS0+c3J0cGVuYywgbmFtZSk7CisgIGdfZnJlZSAobmFtZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisKKyAgcmV0dXJuIGdzdF9vYmplY3RfcmVmIChzdHJlYW0tPnNydHBlbmMpOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCityZXF1ZXN0X2F1eF9yZWNlaXZlciAoR3N0RWxlbWVudCAqIHJ0cGJpbiwgZ3VpbnQgc2Vzc2lkLCBHc3RSVFNQU3JjICogc3JjKQoreworICBHc3RFbGVtZW50ICpydHgsICpiaW47CisgIEdzdFBhZCAqcGFkOworICBnY2hhciAqbmFtZTsKKyAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtOworCisgIHN0cmVhbSA9IGZpbmRfc3RyZWFtIChzcmMsICZzZXNzaWQsIChncG9pbnRlcikgZmluZF9zdHJlYW1fYnlfaWQpOworICBpZiAoIXN0cmVhbSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiU3RyZWFtICV1IG5vdCBmb3VuZCIsIHNlc3NpZCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBHU1RfSU5GT19PQkpFQ1QgKHNyYywgImNyZWF0aW5nIHJldHJhbnNtaXNpb24gcmVjZWl2ZXIgZm9yIHNlc3Npb24gJXUgIgorICAgICAgIndpdGggbWFwICUiIEdTVF9QVFJfRk9STUFULCBzZXNzaWQsIHN0cmVhbS0+cnR4X3B0X21hcCk7CisgIGJpbiA9IGdzdF9iaW5fbmV3IChOVUxMKTsKKyAgcnR4ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwcnR4cmVjZWl2ZSIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHJ0eCwgInBheWxvYWQtdHlwZS1tYXAiLCBzdHJlYW0tPnJ0eF9wdF9tYXAsIE5VTEwpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAoYmluKSwgcnR4KTsKKworICBwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocnR4LCAic3JjIik7CisgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzcmNfJXUiLCBzZXNzaWQpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChiaW4sIGdzdF9naG9zdF9wYWRfbmV3IChuYW1lLCBwYWQpKTsKKyAgZ19mcmVlIChuYW1lKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGFkKTsKKworICBwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocnR4LCAic2luayIpOworICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgic2lua18ldSIsIHNlc3NpZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGJpbiwgZ3N0X2dob3N0X3BhZF9uZXcgKG5hbWUsIHBhZCkpOworICBnX2ZyZWUgKG5hbWUpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworCisgIHJldHVybiBiaW47Cit9CisKK3N0YXRpYyB2b2lkCithZGRfcmV0cmFuc21pc3Npb24gKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFJUU1BUcmFuc3BvcnQgKiB0cmFuc3BvcnQpCit7CisgIEdMaXN0ICp3YWxrOworICBndWludCBzaWduYWxfaWQ7CisgIGdib29sZWFuIGRvX3JldHJhbnNtaXNzaW9uID0gRkFMU0U7CisKKyAgaWYgKHRyYW5zcG9ydC0+dHJhbnMgIT0gR1NUX1JUU1BfVFJBTlNfUlRQKQorICAgIHJldHVybjsKKyAgaWYgKHRyYW5zcG9ydC0+cHJvZmlsZSAhPSBHU1RfUlRTUF9QUk9GSUxFX0FWUEYgJiYKKyAgICAgIHRyYW5zcG9ydC0+cHJvZmlsZSAhPSBHU1RfUlRTUF9QUk9GSUxFX1NBVlBGKQorICAgIHJldHVybjsKKworICBzaWduYWxfaWQgPSBnX3NpZ25hbF9sb29rdXAgKCJyZXF1ZXN0LWF1eC1yZWNlaXZlciIsCisgICAgICBHX09CSkVDVF9UWVBFIChzcmMtPm1hbmFnZXIpKTsKKyAgLyogdGhlcmUncyBhbHJlYWR5IHNvbWV0aGluZyBjb25uZWN0ZWQgKi8KKyAgaWYgKGdfc2lnbmFsX2hhbmRsZXJfZmluZCAoc3JjLT5tYW5hZ2VyLCBHX1NJR05BTF9NQVRDSF9JRCwgc2lnbmFsX2lkLCAwLAorICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpICE9IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJOb3QgYWRkaW5nIFJUWCBBVVggZWxlbWVudCBhcyAiCisgICAgICAgICJcInJlcXVlc3QtYXV4LXJlY2VpdmVyXCIgc2lnbmFsIGlzICIKKyAgICAgICAgImFscmVhZHkgdXNlZCBieSB0aGUgYXBwbGljYXRpb24iKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBidWlsZCB0aGUgcmV0cmFuc21pc3Npb24gcGF5bG9hZCB0eXBlIG1hcCAqLworICBmb3IgKHdhbGsgPSBzcmMtPnN0cmVhbXM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RSVFNQU3RyZWFtICpzdHJlYW0gPSAoR3N0UlRTUFN0cmVhbSAqKSB3YWxrLT5kYXRhOworICAgIGdib29sZWFuIGRvX3JldHJhbnNtaXNzaW9uX3N0cmVhbSA9IEZBTFNFOworICAgIGludCBpOworCisgICAgaWYgKHN0cmVhbS0+cnR4X3B0X21hcCkKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoc3RyZWFtLT5ydHhfcHRfbWFwKTsKKyAgICBzdHJlYW0tPnJ0eF9wdF9tYXAgPSBnc3Rfc3RydWN0dXJlX25ld19lbXB0eSAoImFwcGxpY2F0aW9uL3gtcnRwLXB0LW1hcCIpOworCisgICAgZm9yIChpID0gMDsgaSA8IHN0cmVhbS0+cHRtYXAtPmxlbjsgaSsrKSB7CisgICAgICBQdE1hcEl0ZW0gKml0ZW0gPSAmZ19hcnJheV9pbmRleCAoc3RyZWFtLT5wdG1hcCwgUHRNYXBJdGVtLCBpKTsKKyAgICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGl0ZW0tPmNhcHMsIDApOworICAgICAgY29uc3QgZ2NoYXIgKmVuY29kaW5nOworCisgICAgICAvKiB3ZSBvbmx5IGNhcmUgYWJvdXQgUlRYIHN0cmVhbXMgKi8KKyAgICAgIGlmICgoZW5jb2RpbmcgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJlbmNvZGluZy1uYW1lIikpCisgICAgICAgICAgJiYgZ19zdHJjbXAwIChlbmNvZGluZywgIlJUWCIpID09IDApIHsKKyAgICAgICAgY29uc3QgZ2NoYXIgKnN0cmVhbV9wdF9zOworICAgICAgICBnaW50IHJ0eF9wdDsKKworICAgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzLCAicGF5bG9hZCIsICZydHhfcHQpCisgICAgICAgICAgICAmJiAoc3RyZWFtX3B0X3MgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJhcHQiKSkpIHsKKworICAgICAgICAgIGlmIChydHhfcHQgIT0gMCkgeworICAgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHN0cmVhbS0+cnR4X3B0X21hcCwgc3RyZWFtX3B0X3MsIEdfVFlQRV9VSU5ULAorICAgICAgICAgICAgICAgIHJ0eF9wdCwgTlVMTCk7CisgICAgICAgICAgICBkb19yZXRyYW5zbWlzc2lvbl9zdHJlYW0gPSBUUlVFOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChkb19yZXRyYW5zbWlzc2lvbl9zdHJlYW0pIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImJ1aWx0IHJldHJhbnNtaXNzaW9uIHBheWxvYWQgbWFwIGZvciBzdHJlYW0gIgorICAgICAgICAgICJpZCAlaTogJSIgR1NUX1BUUl9GT1JNQVQsIHN0cmVhbS0+aWQsIHN0cmVhbS0+cnR4X3B0X21hcCk7CisgICAgICBkb19yZXRyYW5zbWlzc2lvbiA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIm5vIHJldHJhbnNtaXNzaW9uIHBheWxvYWQgbWFwIGZvciBzdHJlYW0gIgorICAgICAgICAgICJpZCAlaSIsIHN0cmVhbS0+aWQpOworICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChzdHJlYW0tPnJ0eF9wdF9tYXApOworICAgICAgc3RyZWFtLT5ydHhfcHRfbWFwID0gTlVMTDsKKyAgICB9CisgIH0KKworICBpZiAoZG9fcmV0cmFuc21pc3Npb24pIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJFbmFibGluZyByZXRyYW5zbWlzc2lvbnMiKTsKKworICAgIGdfb2JqZWN0X3NldCAoc3JjLT5tYW5hZ2VyLCAiZG8tcmV0cmFuc21pc3Npb24iLCBUUlVFLCBOVUxMKTsKKworICAgIC8qIGVuYWJsZSBSRkM0NTg4IHJldHJhbnNtaXNzaW9uIGhhbmRsaW5nIGJ5IHNldHRpbmcgcnRwcnR4cmVjZWl2ZQorICAgICAqIGFzIHRoZSAiYXV4IiBlbGVtZW50IG9mIHJ0cGJpbiAqLworICAgIGdfc2lnbmFsX2Nvbm5lY3QgKHNyYy0+bWFuYWdlciwgInJlcXVlc3QtYXV4LXJlY2VpdmVyIiwKKyAgICAgICAgKEdDYWxsYmFjaykgcmVxdWVzdF9hdXhfcmVjZWl2ZXIsIHNyYyk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLAorICAgICAgICAiTm90IGVuYWJsaW5nIHJldHJhbnNtaXNzaW9ucyBhcyBubyBzdHJlYW0gaGFkIGEgcmV0cmFuc21pc3Npb24gcGF5bG9hZCBtYXAiKTsKKyAgfQorfQorCisvKiB0cnkgdG8gZ2V0IGFuZCBjb25maWd1cmUgYSBtYW5hZ2VyICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfbWFuYWdlciAoR3N0UlRTUFNyYyAqIHNyYywgR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwKKyAgICBHc3RSVFNQVHJhbnNwb3J0ICogdHJhbnNwb3J0KQoreworICBjb25zdCBnY2hhciAqbWFuYWdlcjsKKyAgZ2NoYXIgKm5hbWU7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICAvKiBmaW5kIGEgbWFuYWdlciAqLworICBpZiAoZ3N0X3J0c3BfdHJhbnNwb3J0X2dldF9tYW5hZ2VyICh0cmFuc3BvcnQtPnRyYW5zLCAmbWFuYWdlciwgMCkgPCAwKQorICAgIGdvdG8gbm9fbWFuYWdlcjsKKworICBpZiAobWFuYWdlcikgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInVzaW5nIG1hbmFnZXIgJXMiLCBtYW5hZ2VyKTsKKworICAgIC8qIGNvbmZpZ3VyZSB0aGUgbWFuYWdlciAqLworICAgIGlmIChzcmMtPm1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgR09iamVjdENsYXNzICprbGFzczsKKworICAgICAgaWYgKCEoc3JjLT5tYW5hZ2VyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlIChtYW5hZ2VyLCAibWFuYWdlciIpKSkgeworICAgICAgICAvKiBmYWxsYmFjayAqLworICAgICAgICBpZiAoZ3N0X3J0c3BfdHJhbnNwb3J0X2dldF9tYW5hZ2VyICh0cmFuc3BvcnQtPnRyYW5zLCAmbWFuYWdlciwgMSkgPCAwKQorICAgICAgICAgIGdvdG8gbm9fbWFuYWdlcjsKKworICAgICAgICBpZiAoIW1hbmFnZXIpCisgICAgICAgICAgZ290byB1c2Vfbm9fbWFuYWdlcjsKKworICAgICAgICBpZiAoIShzcmMtPm1hbmFnZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKG1hbmFnZXIsICJtYW5hZ2VyIikpKQorICAgICAgICAgIGdvdG8gbWFuYWdlcl9mYWlsZWQ7CisgICAgICB9CisKKyAgICAgIC8qIHdlIG1hbmFnZSB0aGlzIGVsZW1lbnQgKi8KKyAgICAgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKHNyYy0+bWFuYWdlciwgVFJVRSk7CisgICAgICBnc3RfYmluX2FkZCAoR1NUX0JJTl9DQVNUIChzcmMpLCBzcmMtPm1hbmFnZXIpOworCisgICAgICByZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNyYy0+bWFuYWdlciwgR1NUX1NUQVRFX1BBVVNFRCk7CisgICAgICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkKKyAgICAgICAgZ290byBzdGFydF9tYW5hZ2VyX2ZhaWx1cmU7CisKKyAgICAgIGdfb2JqZWN0X3NldCAoc3JjLT5tYW5hZ2VyLCAibGF0ZW5jeSIsIHNyYy0+bGF0ZW5jeSwgTlVMTCk7CisKKyAgICAgIGtsYXNzID0gR19PQkpFQ1RfR0VUX0NMQVNTIChHX09CSkVDVCAoc3JjLT5tYW5hZ2VyKSk7CisKKyAgICAgIGlmIChnX29iamVjdF9jbGFzc19maW5kX3Byb3BlcnR5IChrbGFzcywgIm50cC1zeW5jIikpIHsKKyAgICAgICAgZ19vYmplY3Rfc2V0IChzcmMtPm1hbmFnZXIsICJudHAtc3luYyIsIHNyYy0+bnRwX3N5bmMsIE5VTEwpOworICAgICAgfQorCisgICAgICBpZiAoZ19vYmplY3RfY2xhc3NfZmluZF9wcm9wZXJ0eSAoa2xhc3MsICJyZmM3MjczLXN5bmMiKSkgeworICAgICAgICBnX29iamVjdF9zZXQgKHNyYy0+bWFuYWdlciwgInJmYzcyNzMtc3luYyIsIHNyYy0+cmZjNzI3M19zeW5jLCBOVUxMKTsKKyAgICAgIH0KKworICAgICAgaWYgKHNyYy0+dXNlX3BpcGVsaW5lX2Nsb2NrKSB7CisgICAgICAgIGlmIChnX29iamVjdF9jbGFzc19maW5kX3Byb3BlcnR5IChrbGFzcywgInVzZS1waXBlbGluZS1jbG9jayIpKSB7CisgICAgICAgICAgZ19vYmplY3Rfc2V0IChzcmMtPm1hbmFnZXIsICJ1c2UtcGlwZWxpbmUtY2xvY2siLCBUUlVFLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGdfb2JqZWN0X2NsYXNzX2ZpbmRfcHJvcGVydHkgKGtsYXNzLCAibnRwLXRpbWUtc291cmNlIikpIHsKKyAgICAgICAgICBnX29iamVjdF9zZXQgKHNyYy0+bWFuYWdlciwgIm50cC10aW1lLXNvdXJjZSIsIHNyYy0+bnRwX3RpbWVfc291cmNlLAorICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoc3JjLT5zZGVzICYmIGdfb2JqZWN0X2NsYXNzX2ZpbmRfcHJvcGVydHkgKGtsYXNzLCAic2RlcyIpKSB7CisgICAgICAgIGdfb2JqZWN0X3NldCAoc3JjLT5tYW5hZ2VyLCAic2RlcyIsIHNyYy0+c2RlcywgTlVMTCk7CisgICAgICB9CisKKyAgICAgIGlmIChnX29iamVjdF9jbGFzc19maW5kX3Byb3BlcnR5IChrbGFzcywgImRyb3Atb24tbGF0ZW5jeSIpKSB7CisgICAgICAgIGdfb2JqZWN0X3NldCAoc3JjLT5tYW5hZ2VyLCAiZHJvcC1vbi1sYXRlbmN5Iiwgc3JjLT5kcm9wX29uX2xhdGVuY3ksCisgICAgICAgICAgICBOVUxMKTsKKyAgICAgIH0KKworICAgICAgaWYgKGdfb2JqZWN0X2NsYXNzX2ZpbmRfcHJvcGVydHkgKGtsYXNzLCAibWF4LXJ0Y3AtcnRwLXRpbWUtZGlmZiIpKSB7CisgICAgICAgIGdfb2JqZWN0X3NldCAoc3JjLT5tYW5hZ2VyLCAibWF4LXJ0Y3AtcnRwLXRpbWUtZGlmZiIsCisgICAgICAgICAgICBzcmMtPm1heF9ydGNwX3J0cF90aW1lX2RpZmYsIE5VTEwpOworICAgICAgfQorCisgICAgICBpZiAoZ19vYmplY3RfY2xhc3NfZmluZF9wcm9wZXJ0eSAoa2xhc3MsICJtYXgtdHMtb2Zmc2V0LWFkanVzdG1lbnQiKSkgeworICAgICAgICBnX29iamVjdF9zZXQgKHNyYy0+bWFuYWdlciwgIm1heC10cy1vZmZzZXQtYWRqdXN0bWVudCIsCisgICAgICAgICAgICBzcmMtPm1heF90c19vZmZzZXRfYWRqdXN0bWVudCwgTlVMTCk7CisgICAgICB9CisKKyAgICAgIGlmIChnX29iamVjdF9jbGFzc19maW5kX3Byb3BlcnR5IChrbGFzcywgIm1heC10cy1vZmZzZXQiKSkgeworICAgICAgICBnaW50NjQgbWF4X3RzX29mZnNldDsKKworICAgICAgICAvKiBzZXR0aW5nIG1heC10cy1vZmZzZXQgaW4gdGhlIG1hbmFnZXIgaGFzIHNpZGUgZWZmZWN0cyBzbyBvbmx5IGRvIGl0CisgICAgICAgICAqIGlmIHRoZSB2YWx1ZSBkaWZmZXJzICovCisgICAgICAgIGdfb2JqZWN0X2dldCAoc3JjLT5tYW5hZ2VyLCAibWF4LXRzLW9mZnNldCIsICZtYXhfdHNfb2Zmc2V0LCBOVUxMKTsKKyAgICAgICAgaWYgKG1heF90c19vZmZzZXQgIT0gc3JjLT5tYXhfdHNfb2Zmc2V0KSB7CisgICAgICAgICAgZ19vYmplY3Rfc2V0IChzcmMtPm1hbmFnZXIsICJtYXgtdHMtb2Zmc2V0Iiwgc3JjLT5tYXhfdHNfb2Zmc2V0LAorICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBidWZmZXIgbW9kZSBwYXVzZXMgYXJlIGhhbmRsZWQgYnkgYWRkaW5nIG9mZnNldHMgdG8gYnVmZmVyIHRpbWVzLAorICAgICAgICogYnV0IHNvbWUgZGVwYXlsb2FkZXJzIG1heSBoYXZlIGEgaGFyZCB0aW1lIHN5bmNpbmcgb3V0cHV0IHRpbWVzCisgICAgICAgKiB3aXRoIHN1Y2ggaW5wdXQgdGltZXMsIGUuZy4gY29udGFpbmVyIG9uZXMsIG1vc3Qgbm90YWJseSBBU0YgKi8KKyAgICAgIC8qIFRPRE8gYWx0ZXJuYXRpdmVzIGFyZSBoYXZpbmcgYW4gZXZlbnQgdGhhdCBpbmRpY2F0ZXMgdGhlc2Ugc2hpZnRzLAorICAgICAgICogb3IgaGF2aW5nIHJ0c3AgZXh0ZW5zaW9ucyBwcm92aWRlIHN1Z2dlc3Rpb24gb24gYnVmZmVyIG1vZGUgKi8KKyAgICAgIC8qIHZhbGlkIGR1cmF0aW9uIGltcGxpZXMgbm90IGxpa2VseSBsaXZlIHBpcGVsaW5lLAorICAgICAgICogc28gc2xhdmluZyBpbiBqaXR0ZXJidWZmZXIgZG9lcyBub3QgbWFrZSBtdWNoIHNlbnNlCisgICAgICAgKiAoYW5kIG1pZ2h0IG1lc3MgdGhpbmdzIHVwIGR1ZSB0byBidXJzdHMpICovCisgICAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHNyYy0+c2VnbWVudC5kdXJhdGlvbikgJiYKKyAgICAgICAgICBzcmMtPnNlZ21lbnQuZHVyYXRpb24gJiYgc3RyZWFtLT5jb250YWluZXIpIHsKKyAgICAgICAgc3JjLT51c2VfYnVmZmVyaW5nID0gVFJVRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyYy0+dXNlX2J1ZmZlcmluZyA9IEZBTFNFOworICAgICAgfQorCisgICAgICBzZXRfbWFuYWdlcl9idWZmZXJfbW9kZSAoc3JjKTsKKworICAgICAgLyogY29ubmVjdCB0byBzaWduYWxzICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb25uZWN0IHRvIHNpZ25hbHMgb24gc2Vzc2lvbiBtYW5hZ2VyLCBzdHJlYW0gJXAiLAorICAgICAgICAgIHN0cmVhbSk7CisgICAgICBzcmMtPm1hbmFnZXJfc2lnX2lkID0KKyAgICAgICAgICBnX3NpZ25hbF9jb25uZWN0IChzcmMtPm1hbmFnZXIsICJwYWQtYWRkZWQiLAorICAgICAgICAgIChHQ2FsbGJhY2spIG5ld19tYW5hZ2VyX3BhZCwgc3JjKTsKKyAgICAgIHNyYy0+bWFuYWdlcl9wdG1hcF9pZCA9CisgICAgICAgICAgZ19zaWduYWxfY29ubmVjdCAoc3JjLT5tYW5hZ2VyLCAicmVxdWVzdC1wdC1tYXAiLAorICAgICAgICAgIChHQ2FsbGJhY2spIHJlcXVlc3RfcHRfbWFwLCBzcmMpOworCisgICAgICBnX3NpZ25hbF9jb25uZWN0IChzcmMtPm1hbmFnZXIsICJvbi1ucHQtc3RvcCIsIChHQ2FsbGJhY2spIG9uX25wdF9zdG9wLAorICAgICAgICAgIHNyYyk7CisKKyAgICAgIGdfc2lnbmFsX2VtaXQgKHNyYywgZ3N0X3J0c3BzcmNfc2lnbmFsc1tTSUdOQUxfTkVXX01BTkFHRVJdLCAwLAorICAgICAgICAgIHNyYy0+bWFuYWdlcik7CisKKyAgICAgIGlmIChzcmMtPmRvX3JldHJhbnNtaXNzaW9uKQorICAgICAgICBhZGRfcmV0cmFuc21pc3Npb24gKHNyYywgdHJhbnNwb3J0KTsKKyAgICB9CisgICAgZ19zaWduYWxfY29ubmVjdCAoc3JjLT5tYW5hZ2VyLCAicmVxdWVzdC1ydHAtZGVjb2RlciIsCisgICAgICAgIChHQ2FsbGJhY2spIHJlcXVlc3RfcnRwX2RlY29kZXIsIHN0cmVhbSk7CisgICAgZ19zaWduYWxfY29ubmVjdCAoc3JjLT5tYW5hZ2VyLCAicmVxdWVzdC1ydGNwLWRlY29kZXIiLAorICAgICAgICAoR0NhbGxiYWNrKSByZXF1ZXN0X3J0cF9kZWNvZGVyLCBzdHJlYW0pOworICAgIGdfc2lnbmFsX2Nvbm5lY3QgKHNyYy0+bWFuYWdlciwgInJlcXVlc3QtcnRjcC1lbmNvZGVyIiwKKyAgICAgICAgKEdDYWxsYmFjaykgcmVxdWVzdF9ydGNwX2VuY29kZXIsIHN0cmVhbSk7CisKKyAgICAvKiB3ZSBzdHJlYW0gZGlyZWN0bHkgdG8gdGhlIG1hbmFnZXIsIGdldCBzb21lIHBhZHMuIEVhY2ggUlRTUCBzdHJlYW0gZ29lcworICAgICAqIGludG8gYSBzZXBhcmF0ZSBSVFAgc2Vzc2lvbi4gKi8KKyAgICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgicmVjdl9ydHBfc2lua18ldSIsIHN0cmVhbS0+aWQpOworICAgIHN0cmVhbS0+Y2hhbm5lbHBhZFswXSA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoc3JjLT5tYW5hZ2VyLCBuYW1lKTsKKyAgICBnX2ZyZWUgKG5hbWUpOworICAgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJyZWN2X3J0Y3Bfc2lua18ldSIsIHN0cmVhbS0+aWQpOworICAgIHN0cmVhbS0+Y2hhbm5lbHBhZFsxXSA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoc3JjLT5tYW5hZ2VyLCBuYW1lKTsKKyAgICBnX2ZyZWUgKG5hbWUpOworCisgICAgLyogbm93IGNvbmZpZ3VyZSB0aGUgYmFuZHdpZHRoIGluIHRoZSBtYW5hZ2VyICovCisgICAgaWYgKGdfc2lnbmFsX2xvb2t1cCAoImdldC1pbnRlcm5hbC1zZXNzaW9uIiwKKyAgICAgICAgICAgIEdfT0JKRUNUX1RZUEUgKHNyYy0+bWFuYWdlcikpICE9IDApIHsKKyAgICAgIEdPYmplY3QgKnJ0cHNlc3Npb247CisKKyAgICAgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAoc3JjLT5tYW5hZ2VyLCAiZ2V0LWludGVybmFsLXNlc3Npb24iLCBzdHJlYW0tPmlkLAorICAgICAgICAgICZydHBzZXNzaW9uKTsKKyAgICAgIGlmIChydHBzZXNzaW9uKSB7CisgICAgICAgIEdzdFJUUFByb2ZpbGUgcnRwX3Byb2ZpbGU7CisKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChzcmMsICJjb25maWd1cmUgYmFuZHdpZHRoIGluIHNlc3Npb24gJXAiLCBydHBzZXNzaW9uKTsKKworICAgICAgICBzdHJlYW0tPnNlc3Npb24gPSBydHBzZXNzaW9uOworCisgICAgICAgIGlmIChzdHJlYW0tPmFzX2JhbmR3aWR0aCAhPSAtMSkgeworICAgICAgICAgIEdTVF9JTkZPX09CSkVDVCAoc3JjLCAic2V0dGluZyBBUzogJWYiLAorICAgICAgICAgICAgICAoZ2RvdWJsZSkgKHN0cmVhbS0+YXNfYmFuZHdpZHRoICogMTAwMCkpOworICAgICAgICAgIGdfb2JqZWN0X3NldCAocnRwc2Vzc2lvbiwgImJhbmR3aWR0aCIsCisgICAgICAgICAgICAgIChnZG91YmxlKSAoc3RyZWFtLT5hc19iYW5kd2lkdGggKiAxMDAwKSwgTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmVhbS0+cnJfYmFuZHdpZHRoICE9IC0xKSB7CisgICAgICAgICAgR1NUX0lORk9fT0JKRUNUIChzcmMsICJzZXR0aW5nIFJSOiAldSIsIHN0cmVhbS0+cnJfYmFuZHdpZHRoKTsKKyAgICAgICAgICBnX29iamVjdF9zZXQgKHJ0cHNlc3Npb24sICJydGNwLXJyLWJhbmR3aWR0aCIsIHN0cmVhbS0+cnJfYmFuZHdpZHRoLAorICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyZWFtLT5yc19iYW5kd2lkdGggIT0gLTEpIHsKKyAgICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHNyYywgInNldHRpbmcgUlM6ICV1Iiwgc3RyZWFtLT5yc19iYW5kd2lkdGgpOworICAgICAgICAgIGdfb2JqZWN0X3NldCAocnRwc2Vzc2lvbiwgInJ0Y3AtcnMtYmFuZHdpZHRoIiwgc3RyZWFtLT5yc19iYW5kd2lkdGgsCisgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChzdHJlYW0tPnByb2ZpbGUpIHsKKyAgICAgICAgICBjYXNlIEdTVF9SVFNQX1BST0ZJTEVfQVZQRjoKKyAgICAgICAgICAgIHJ0cF9wcm9maWxlID0gR1NUX1JUUF9QUk9GSUxFX0FWUEY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdTVF9SVFNQX1BST0ZJTEVfU0FWUDoKKyAgICAgICAgICAgIHJ0cF9wcm9maWxlID0gR1NUX1JUUF9QUk9GSUxFX1NBVlA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdTVF9SVFNQX1BST0ZJTEVfU0FWUEY6CisgICAgICAgICAgICBydHBfcHJvZmlsZSA9IEdTVF9SVFBfUFJPRklMRV9TQVZQRjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR1NUX1JUU1BfUFJPRklMRV9BVlA6CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJ0cF9wcm9maWxlID0gR1NUX1JUUF9QUk9GSUxFX0FWUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZ19vYmplY3Rfc2V0IChydHBzZXNzaW9uLCAicnRwLXByb2ZpbGUiLCBydHBfcHJvZmlsZSwgTlVMTCk7CisKKyAgICAgICAgZ19vYmplY3Rfc2V0IChydHBzZXNzaW9uLCAicHJvYmF0aW9uIiwgc3JjLT5wcm9iYXRpb24sIE5VTEwpOworCisgICAgICAgIGdfb2JqZWN0X3NldCAocnRwc2Vzc2lvbiwgImludGVybmFsLXNzcmMiLCBzdHJlYW0tPnNlbmRfc3NyYywgTlVMTCk7CisKKyAgICAgICAgZ19zaWduYWxfY29ubmVjdCAocnRwc2Vzc2lvbiwgIm9uLWJ5ZS1zc3JjIiwgKEdDYWxsYmFjaykgb25fYnllX3NzcmMsCisgICAgICAgICAgICBzdHJlYW0pOworICAgICAgICBnX3NpZ25hbF9jb25uZWN0IChydHBzZXNzaW9uLCAib24tYnllLXRpbWVvdXQiLCAoR0NhbGxiYWNrKSBvbl90aW1lb3V0LAorICAgICAgICAgICAgc3RyZWFtKTsKKyAgICAgICAgZ19zaWduYWxfY29ubmVjdCAocnRwc2Vzc2lvbiwgIm9uLXRpbWVvdXQiLCAoR0NhbGxiYWNrKSBvbl90aW1lb3V0LAorICAgICAgICAgICAgc3RyZWFtKTsKKyAgICAgICAgZ19zaWduYWxfY29ubmVjdCAocnRwc2Vzc2lvbiwgIm9uLXNzcmMtYWN0aXZlIiwKKyAgICAgICAgICAgIChHQ2FsbGJhY2spIG9uX3NzcmNfYWN0aXZlLCBzdHJlYW0pOworICAgICAgfQorICAgIH0KKyAgfQorCit1c2Vfbm9fbWFuYWdlcjoKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub19tYW5hZ2VyOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY2Fubm90IGdldCBhIHNlc3Npb24gbWFuYWdlciIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbWFuYWdlcl9mYWlsZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJubyBzZXNzaW9uIG1hbmFnZXIgZWxlbWVudCAlcyBmb3VuZCIsIG1hbmFnZXIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorc3RhcnRfbWFuYWdlcl9mYWlsdXJlOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY291bGQgbm90IHN0YXJ0IHNlc3Npb24gbWFuYWdlciIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKiBmcmVlIHRoZSBVRFAgc291cmNlcyBhbGxvY2F0ZWQgd2hlbiBuZWdvdGlhdGluZyBhIHRyYW5zcG9ydC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHNlcnZlciBuZWdvdGlhdGVkIHRvIGEgdHJhbnNwb3J0IHdoZXJlIHRoZQorICogVURQIHNvdXJjZXMgYXJlIG5vdCBuZWVkZWQgYW55bW9yZSwgc3VjaCBhcyBUQ1Agb3IgbXVsdGljYXN0LiAqLworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX3N0cmVhbV9mcmVlX3VkcCAoR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSkKK3sKKyAgZ2ludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICBpZiAoc3RyZWFtLT51ZHBzcmNbaV0pIHsKKyAgICAgIEdTVF9ERUJVRyAoImZyZWUgVURQIHNvdXJjZSAlZCBmb3Igc3RyZWFtICVwIiwgaSwgc3RyZWFtKTsKKyAgICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc3RyZWFtLT51ZHBzcmNbaV0sIEdTVF9TVEFURV9OVUxMKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHN0cmVhbS0+dWRwc3JjW2ldKTsKKyAgICAgIHN0cmVhbS0+dWRwc3JjW2ldID0gTlVMTDsKKyAgICB9CisgIH0KK30KKworLyogZm9yIFRDUCwgY3JlYXRlIHBhZHMgdG8gc2VuZCBhbmQgcmVjZWl2ZSBkYXRhIHRvIGFuZCBmcm9tIHRoZSBtYW5hZ2VyIGFuZCB0bworICogaW50ZXJjZXB0IHZhcmlvdXMgZXZlbnRzIGFuZCBxdWVyaWVzCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV90Y3AgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFJUU1BTdHJlYW0gKiBzdHJlYW0sCisgICAgR3N0UlRTUFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgR3N0UGFkICoqIG91dHBhZCkKK3sKKyAgZ2NoYXIgKm5hbWU7CisgIEdzdFBhZFRlbXBsYXRlICp0ZW1wbGF0ZTsKKyAgR3N0UGFkICpwYWQwLCAqcGFkMTsKKworICAvKiBjb25maWd1cmUgZm9yIGludGVybGVhdmVkIGRlbGl2ZXJ5LCBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUKKyAgICogaGVyZSwgdGhlIGxvb3AgZnVuY3Rpb24gd2lsbCBjYWxsIHRoZSBjaGFpbiBmdW5jdGlvbnMgb2YgdGhlCisgICAqIHNlc3Npb24gbWFuYWdlci4gKi8KKyAgc3RyZWFtLT5jaGFubmVsWzBdID0gdHJhbnNwb3J0LT5pbnRlcmxlYXZlZC5taW47CisgIHN0cmVhbS0+Y2hhbm5lbFsxXSA9IHRyYW5zcG9ydC0+aW50ZXJsZWF2ZWQubWF4OworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzdHJlYW0gJXAgb24gY2hhbm5lbHMgJWQtJWQiLCBzdHJlYW0sCisgICAgICBzdHJlYW0tPmNoYW5uZWxbMF0sIHN0cmVhbS0+Y2hhbm5lbFsxXSk7CisKKyAgLyogd2UgY2FuIHJlbW92ZSB0aGUgYWxsb2NhdGVkIFVEUCBwb3J0cyBub3cgKi8KKyAgZ3N0X3J0c3BzcmNfc3RyZWFtX2ZyZWVfdWRwIChzdHJlYW0pOworCisgIC8qIG5vIHNlc3Npb24gbWFuYWdlciwgc2VuZCBkYXRhIHRvIHNyY3BhZCBkaXJlY3RseSAqLworICBpZiAoIXN0cmVhbS0+Y2hhbm5lbHBhZFswXSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIm5vIG1hbmFnZXIsIGNyZWF0aW5nIHBhZCIpOworCisgICAgLyogY3JlYXRlIGEgbmV3IHBhZCB3ZSB3aWxsIHVzZSB0byBzdHJlYW0gdG8gKi8KKyAgICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgic3RyZWFtXyV1Iiwgc3RyZWFtLT5pZCk7CisgICAgdGVtcGxhdGUgPSBnc3Rfc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXQgKCZydHB0ZW1wbGF0ZSk7CisgICAgc3RyZWFtLT5jaGFubmVscGFkWzBdID0gZ3N0X3BhZF9uZXdfZnJvbV90ZW1wbGF0ZSAodGVtcGxhdGUsIG5hbWUpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHRlbXBsYXRlKTsKKyAgICBnX2ZyZWUgKG5hbWUpOworCisgICAgLyogc2V0IGNhcHMgYW5kIGFjdGl2YXRlICovCisgICAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoc3RyZWFtLT5jaGFubmVscGFkWzBdKTsKKyAgICBnc3RfcGFkX3NldF9hY3RpdmUgKHN0cmVhbS0+Y2hhbm5lbHBhZFswXSwgVFJVRSk7CisKKyAgICAqb3V0cGFkID0gZ3N0X29iamVjdF9yZWYgKHN0cmVhbS0+Y2hhbm5lbHBhZFswXSk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAidXNpbmcgbWFuYWdlciBzb3VyY2UgcGFkIik7CisKKyAgICB0ZW1wbGF0ZSA9IGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldCAoJmFueXNyY3RlbXBsYXRlKTsKKworICAgIC8qIGFsbG9jYXRlIHBhZHMgZm9yIHNlbmRpbmcgdGhlIGNoYW5uZWwgZGF0YSBpbnRvIHRoZSBtYW5hZ2VyICovCisgICAgcGFkMCA9IGdzdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKHRlbXBsYXRlLCAiaW50ZXJuYWxzcmNfMCIpOworICAgIGdzdF9wYWRfbGlua19mdWxsIChwYWQwLCBzdHJlYW0tPmNoYW5uZWxwYWRbMF0sIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzdHJlYW0tPmNoYW5uZWxwYWRbMF0pOworICAgIHN0cmVhbS0+Y2hhbm5lbHBhZFswXSA9IHBhZDA7CisgICAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHBhZDAsIGdzdF9ydHNwc3JjX2hhbmRsZV9pbnRlcm5hbF9zcmNfZXZlbnQpOworICAgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChwYWQwLCBnc3RfcnRzcHNyY19oYW5kbGVfaW50ZXJuYWxfc3JjX3F1ZXJ5KTsKKyAgICBnc3RfcGFkX3NldF9lbGVtZW50X3ByaXZhdGUgKHBhZDAsIHNyYyk7CisgICAgZ3N0X3BhZF9zZXRfYWN0aXZlIChwYWQwLCBUUlVFKTsKKworICAgIGlmIChzdHJlYW0tPmNoYW5uZWxwYWRbMV0pIHsKKyAgICAgIC8qIGlmIHdlIGhhdmUgYSBzaW5rcGFkIGZvciB0aGUgb3RoZXIgY2hhbm5lbCwgY3JlYXRlIGEgcGFkIGFuZCBsaW5rIHRvIHRoZQorICAgICAgICogbWFuYWdlci4gKi8KKyAgICAgIHBhZDEgPSBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlICh0ZW1wbGF0ZSwgImludGVybmFsc3JjXzEiKTsKKyAgICAgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChwYWQxLCBnc3RfcnRzcHNyY19oYW5kbGVfaW50ZXJuYWxfc3JjX2V2ZW50KTsKKyAgICAgIGdzdF9wYWRfbGlua19mdWxsIChwYWQxLCBzdHJlYW0tPmNoYW5uZWxwYWRbMV0sCisgICAgICAgICAgR1NUX1BBRF9MSU5LX0NIRUNLX05PVEhJTkcpOworICAgICAgZ3N0X29iamVjdF91bnJlZiAoc3RyZWFtLT5jaGFubmVscGFkWzFdKTsKKyAgICAgIHN0cmVhbS0+Y2hhbm5lbHBhZFsxXSA9IHBhZDE7CisgICAgICBnc3RfcGFkX3NldF9hY3RpdmUgKHBhZDEsIFRSVUUpOworICAgIH0KKyAgICBnc3Rfb2JqZWN0X3VucmVmICh0ZW1wbGF0ZSk7CisgIH0KKyAgLyogc2V0dXAgUlRDUCB0cmFuc3BvcnQgYmFjayB0byB0aGUgc2VydmVyIGlmIHdlIGhhdmUgdG8uICovCisgIGlmIChzcmMtPm1hbmFnZXIgJiYgc3JjLT5kb19ydGNwKSB7CisgICAgR3N0UGFkICpwYWQ7CisKKyAgICB0ZW1wbGF0ZSA9IGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldCAoJmFueXNpbmt0ZW1wbGF0ZSk7CisKKyAgICBzdHJlYW0tPnJ0Y3BwYWQgPSBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlICh0ZW1wbGF0ZSwgImludGVybmFsc2lua18wIik7CisgICAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHN0cmVhbS0+cnRjcHBhZCwgZ3N0X3J0c3BzcmNfc2lua19jaGFpbik7CisgICAgZ3N0X3BhZF9zZXRfZWxlbWVudF9wcml2YXRlIChzdHJlYW0tPnJ0Y3BwYWQsIHN0cmVhbSk7CisgICAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzdHJlYW0tPnJ0Y3BwYWQsIFRSVUUpOworCisgICAgLyogZ2V0IHNlc3Npb24gUlRDUCBwYWQgKi8KKyAgICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgic2VuZF9ydGNwX3NyY18ldSIsIHN0cmVhbS0+aWQpOworICAgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoc3JjLT5tYW5hZ2VyLCBuYW1lKTsKKyAgICBnX2ZyZWUgKG5hbWUpOworCisgICAgLyogYW5kIGxpbmsgKi8KKyAgICBpZiAocGFkKSB7CisgICAgICBnc3RfcGFkX2xpbmtfZnVsbCAocGFkLCBzdHJlYW0tPnJ0Y3BwYWQsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisgICAgfQorCisgICAgZ3N0X29iamVjdF91bnJlZiAodGVtcGxhdGUpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfZ2V0X3RyYW5zcG9ydF9pbmZvIChHc3RSVFNQU3JjICogc3JjLCBHc3RSVFNQU3RyZWFtICogc3RyZWFtLAorICAgIEdzdFJUU1BUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIGNvbnN0IGdjaGFyICoqIGRlc3RpbmF0aW9uLCBnaW50ICogbWluLAorICAgIGdpbnQgKiBtYXgsIGd1aW50ICogdHRsKQoreworICBpZiAodHJhbnNwb3J0LT5sb3dlcl90cmFuc3BvcnQgPT0gR1NUX1JUU1BfTE9XRVJfVFJBTlNfVURQX01DQVNUKSB7CisgICAgaWYgKGRlc3RpbmF0aW9uKSB7CisgICAgICBpZiAoISgqZGVzdGluYXRpb24gPSB0cmFuc3BvcnQtPmRlc3RpbmF0aW9uKSkKKyAgICAgICAgKmRlc3RpbmF0aW9uID0gc3RyZWFtLT5kZXN0aW5hdGlvbjsKKyAgICB9CisgICAgaWYgKG1pbiAmJiBtYXgpIHsKKyAgICAgIC8qIHRyYW5zcG9ydCBmaXJzdCAqLworICAgICAgKm1pbiA9IHRyYW5zcG9ydC0+cG9ydC5taW47CisgICAgICAqbWF4ID0gdHJhbnNwb3J0LT5wb3J0Lm1heDsKKyAgICAgIGlmICgqbWluID09IC0xICYmICptYXggPT0gLTEpIHsKKyAgICAgICAgLyogdGhlbiB0cnkgZnJvbSBTRFAgKi8KKyAgICAgICAgaWYgKHN0cmVhbS0+cG9ydCAhPSAwKSB7CisgICAgICAgICAgKm1pbiA9IHN0cmVhbS0+cG9ydDsKKyAgICAgICAgICAqbWF4ID0gc3RyZWFtLT5wb3J0ICsgMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmICh0dGwpIHsKKyAgICAgIGlmICghKCp0dGwgPSB0cmFuc3BvcnQtPnR0bCkpCisgICAgICAgICp0dGwgPSBzdHJlYW0tPnR0bDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGRlc3RpbmF0aW9uKSB7CisgICAgICAvKiBmaXJzdCB0YWtlIHRoZSBzb3VyY2UsIHRoZW4gdGhlIGVuZHBvaW50IHRvIGZpZ3VyZSBvdXQgd2hlcmUgdG8gc2VuZAorICAgICAgICogdGhlIFJUQ1AuICovCisgICAgICBpZiAoISgqZGVzdGluYXRpb24gPSB0cmFuc3BvcnQtPnNvdXJjZSkpIHsKKyAgICAgICAgaWYgKHNyYy0+Y29ubmluZm8uY29ubmVjdGlvbikKKyAgICAgICAgICAqZGVzdGluYXRpb24gPSBnc3RfcnRzcF9jb25uZWN0aW9uX2dldF9pcCAoc3JjLT5jb25uaW5mby5jb25uZWN0aW9uKTsKKyAgICAgICAgZWxzZSBpZiAoc3RyZWFtLT5jb25uaW5mby5jb25uZWN0aW9uKQorICAgICAgICAgICpkZXN0aW5hdGlvbiA9CisgICAgICAgICAgICAgIGdzdF9ydHNwX2Nvbm5lY3Rpb25fZ2V0X2lwIChzdHJlYW0tPmNvbm5pbmZvLmNvbm5lY3Rpb24pOworICAgICAgfQorICAgIH0KKyAgICBpZiAobWluICYmIG1heCkgeworICAgICAgLyogZm9yIHVuaWNhc3Qgd2Ugb25seSBleHBlY3QgdGhlIHBvcnRzIGhlcmUgKi8KKyAgICAgICptaW4gPSB0cmFuc3BvcnQtPnNlcnZlcl9wb3J0Lm1pbjsKKyAgICAgICptYXggPSB0cmFuc3BvcnQtPnNlcnZlcl9wb3J0Lm1heDsKKyAgICB9CisgIH0KK30KKworLyogRm9yIG11bHRpY2FzdCBjcmVhdGUgVURQIHNvdXJjZXMgYW5kIGpvaW4gdGhlIG11bHRpY2FzdCBncm91cC4gKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV9tY2FzdCAoR3N0UlRTUFNyYyAqIHNyYywgR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwKKyAgICBHc3RSVFNQVHJhbnNwb3J0ICogdHJhbnNwb3J0LCBHc3RQYWQgKiogb3V0cGFkKQoreworICBnY2hhciAqdXJpOworICBjb25zdCBnY2hhciAqZGVzdGluYXRpb247CisgIGdpbnQgbWluLCBtYXg7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY3JlYXRpbmcgVURQIHNvdXJjZXMgZm9yIG11bHRpY2FzdCIpOworCisgIC8qIHdlIGNhbiByZW1vdmUgdGhlIGFsbG9jYXRlZCBVRFAgcG9ydHMgbm93ICovCisgIGdzdF9ydHNwc3JjX3N0cmVhbV9mcmVlX3VkcCAoc3RyZWFtKTsKKworICBnc3RfcnRzcHNyY19nZXRfdHJhbnNwb3J0X2luZm8gKHNyYywgc3RyZWFtLCB0cmFuc3BvcnQsICZkZXN0aW5hdGlvbiwgJm1pbiwKKyAgICAgICZtYXgsIE5VTEwpOworCisgIC8qIHdlIG5lZWQgYSBkZXN0aW5hdGlvbiBub3cgKi8KKyAgaWYgKGRlc3RpbmF0aW9uID09IE5VTEwpCisgICAgZ290byBub19kZXN0aW5hdGlvbjsKKworICAvKiB3ZSByZWFsbHkgbmVlZCBwb3J0cyBub3cgb3Igd2Ugd29uJ3QgYmUgYWJsZSB0byByZWNlaXZlIGFueXRoaW5nIGF0IGFsbCAqLworICBpZiAobWluID09IC0xICYmIG1heCA9PSAtMSkKKyAgICBnb3RvIG5vX3BvcnRzOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImhhdmUgZGVzdGluYXRpb24gJyVzJyBhbmQgcG9ydHMgKCVkKS0oJWQpIiwKKyAgICAgIGRlc3RpbmF0aW9uLCBtaW4sIG1heCk7CisKKyAgLyogY3JlYXRpbmcgVURQIHNvdXJjZSBmb3IgUlRQICovCisgIGlmIChtaW4gIT0gLTEpIHsKKyAgICB1cmkgPSBnX3N0cmR1cF9wcmludGYgKCJ1ZHA6Ly8lczolZCIsIGRlc3RpbmF0aW9uLCBtaW4pOworICAgIHN0cmVhbS0+dWRwc3JjWzBdID0KKyAgICAgICAgZ3N0X2VsZW1lbnRfbWFrZV9mcm9tX3VyaSAoR1NUX1VSSV9TUkMsIHVyaSwgTlVMTCwgTlVMTCk7CisgICAgZ19mcmVlICh1cmkpOworICAgIGlmIChzdHJlYW0tPnVkcHNyY1swXSA9PSBOVUxMKQorICAgICAgZ290byBub19lbGVtZW50OworCisgICAgLyogdGFrZSBvd25lcnNoaXAgKi8KKyAgICBnc3Rfb2JqZWN0X3JlZl9zaW5rIChzdHJlYW0tPnVkcHNyY1swXSk7CisKKyAgICBpZiAoc3JjLT51ZHBfYnVmZmVyX3NpemUgIT0gMCkKKyAgICAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHN0cmVhbS0+dWRwc3JjWzBdKSwgImJ1ZmZlci1zaXplIiwKKyAgICAgICAgICBzcmMtPnVkcF9idWZmZXJfc2l6ZSwgTlVMTCk7CisKKyAgICBpZiAoc3JjLT5tdWx0aV9pZmFjZSAhPSBOVUxMKQorICAgICAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc3RyZWFtLT51ZHBzcmNbMF0pLCAibXVsdGljYXN0LWlmYWNlIiwKKyAgICAgICAgICBzcmMtPm11bHRpX2lmYWNlLCBOVUxMKTsKKworICAgIC8qIGNoYW5nZSBzdGF0ZSAqLworICAgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKHN0cmVhbS0+dWRwc3JjWzBdLCBUUlVFKTsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHN0cmVhbS0+dWRwc3JjWzBdLCBHU1RfU1RBVEVfUkVBRFkpOworICB9CisKKyAgLyogY3JlYXRpbmcgYW5vdGhlciBVRFAgc291cmNlIGZvciBSVENQICovCisgIGlmIChtYXggIT0gLTEpIHsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgdXJpID0gZ19zdHJkdXBfcHJpbnRmICgidWRwOi8vJXM6JWQiLCBkZXN0aW5hdGlvbiwgbWF4KTsKKyAgICBzdHJlYW0tPnVkcHNyY1sxXSA9CisgICAgICAgIGdzdF9lbGVtZW50X21ha2VfZnJvbV91cmkgKEdTVF9VUklfU1JDLCB1cmksIE5VTEwsIE5VTEwpOworICAgIGdfZnJlZSAodXJpKTsKKyAgICBpZiAoc3RyZWFtLT51ZHBzcmNbMV0gPT0gTlVMTCkKKyAgICAgIGdvdG8gbm9fZWxlbWVudDsKKworICAgIGlmIChzdHJlYW0tPnByb2ZpbGUgPT0gR1NUX1JUU1BfUFJPRklMRV9TQVZQIHx8CisgICAgICAgIHN0cmVhbS0+cHJvZmlsZSA9PSBHU1RfUlRTUF9QUk9GSUxFX1NBVlBGKQorICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXNydGNwIik7CisgICAgZWxzZQorICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXJ0Y3AiKTsKKyAgICBnX29iamVjdF9zZXQgKHN0cmVhbS0+dWRwc3JjWzFdLCAiY2FwcyIsIGNhcHMsIE5VTEwpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAgIC8qIHRha2Ugb3duZXJzaGlwICovCisgICAgZ3N0X29iamVjdF9yZWZfc2luayAoc3RyZWFtLT51ZHBzcmNbMV0pOworCisgICAgaWYgKHNyYy0+bXVsdGlfaWZhY2UgIT0gTlVMTCkKKyAgICAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHN0cmVhbS0+dWRwc3JjWzFdKSwgIm11bHRpY2FzdC1pZmFjZSIsCisgICAgICAgICAgc3JjLT5tdWx0aV9pZmFjZSwgTlVMTCk7CisKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHN0cmVhbS0+dWRwc3JjWzFdLCBHU1RfU1RBVEVfUkVBRFkpOworICB9CisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworbm9fZWxlbWVudDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIm5vIFVEUCBzb3VyY2UgZWxlbWVudCBmb3VuZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fZGVzdGluYXRpb246CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJubyBkZXN0aW5hdGlvbiBmb3VuZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fcG9ydHM6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJubyBwb3J0cyBmb3VuZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKiBjb25maWd1cmUgdGhlIHJlbWFpbmRlciBvZiB0aGUgVURQIHBvcnRzICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdWRwIChHc3RSVFNQU3JjICogc3JjLCBHc3RSVFNQU3RyZWFtICogc3RyZWFtLAorICAgIEdzdFJUU1BUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIEdzdFBhZCAqKiBvdXRwYWQpCit7CisgIC8qIHdlIG1hbmFnZSB0aGUgVURQIGVsZW1lbnRzIG5vdy4gRm9yIHVuaWNhc3QsIHRoZSBVRFAgc291cmNlcyB3aGVyZQorICAgKiBhbGxvY2F0ZWQgaW4gdGhlIHN0cmVhbSB3aGVuIHdlIHN1Z2dlc3RlZCBhIHRyYW5zcG9ydC4gKi8KKyAgaWYgKHN0cmVhbS0+dWRwc3JjWzBdKSB7CisgICAgR3N0Q2FwcyAqY2FwczsKKworICAgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKHN0cmVhbS0+dWRwc3JjWzBdLCBUUlVFKTsKKyAgICBnc3RfYmluX2FkZCAoR1NUX0JJTl9DQVNUIChzcmMpLCBzdHJlYW0tPnVkcHNyY1swXSk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzZXR0aW5nIHVwIFVEUCBzb3VyY2UiKTsKKworICAgIC8qIGNvbmZpZ3VyZSBhIHRpbWVvdXQgb24gdGhlIFVEUCBwb3J0LiBXaGVuIHRoZSB0aW1lb3V0IG1lc3NhZ2UgaXMKKyAgICAgKiBwb3N0ZWQsIHdlIGFzc3VtZSBVRFAgdHJhbnNwb3J0IGlzIG5vdCBwb3NzaWJsZS4gV2UgcmVjb25uZWN0IHVzaW5nIFRDUAorICAgICAqIGlmIHdlIGNhbi4gKi8KKyAgICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzdHJlYW0tPnVkcHNyY1swXSksICJ0aW1lb3V0IiwKKyAgICAgICAgc3JjLT51ZHBfdGltZW91dCAqIDEwMDAsIE5VTEwpOworCisgICAgaWYgKChjYXBzID0gc3RyZWFtX2dldF9jYXBzX2Zvcl9wdCAoc3RyZWFtLCBzdHJlYW0tPmRlZmF1bHRfcHQpKSkKKyAgICAgIGdfb2JqZWN0X3NldCAoc3RyZWFtLT51ZHBzcmNbMF0sICJjYXBzIiwgY2FwcywgTlVMTCk7CisKKyAgICAvKiBnZXQgb3V0cHV0IHBhZCBvZiB0aGUgVURQIHNvdXJjZS4gKi8KKyAgICAqb3V0cGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHN0cmVhbS0+dWRwc3JjWzBdLCAic3JjIik7CisKKyAgICAvKiBzYXZlIGl0IHNvIHdlIGNhbiB1bmJsb2NrICovCisgICAgc3RyZWFtLT5ibG9ja2VkcGFkID0gKm91dHBhZDsKKworICAgIC8qIGNvbmZpZ3VyZSBwYWQgYmxvY2sgb24gdGhlIHBhZC4gQXMgc29vbiBhcyB0aGVyZSBpcyBkYXRhZmxvdyBvbiB0aGUKKyAgICAgKiBVRFAgc291cmNlLCB3ZSBrbm93IHRoYXQgVURQIGlzIG5vdCBibG9ja2VkIGJ5IGEgZmlyZXdhbGwgYW5kIHdlIGNhbgorICAgICAqIGNvbmZpZ3VyZSBhbGwgdGhlIHN0cmVhbXMgdG8gbGV0IHRoZSBhcHBsaWNhdGlvbiBhdXRvcGx1ZyBkZWNvZGVycy4gKi8KKyAgICBzdHJlYW0tPmJsb2NraWQgPQorICAgICAgICBnc3RfcGFkX2FkZF9wcm9iZSAoc3RyZWFtLT5ibG9ja2VkcGFkLAorICAgICAgICBHU1RfUEFEX1BST0JFX1RZUEVfQkxPQ0sgfCBHU1RfUEFEX1BST0JFX1RZUEVfQlVGRkVSIHwKKyAgICAgICAgR1NUX1BBRF9QUk9CRV9UWVBFX0JVRkZFUl9MSVNULCBwYWRfYmxvY2tlZCwgc3JjLCBOVUxMKTsKKworICAgIGlmIChzdHJlYW0tPmNoYW5uZWxwYWRbMF0pIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNvbm5lY3RpbmcgVURQIHNvdXJjZSAwIHRvIG1hbmFnZXIiKTsKKyAgICAgIC8qIGNvbmZpZ3VyZSBmb3IgVURQIGRlbGl2ZXJ5LCB3ZSBuZWVkIHRvIGNvbm5lY3QgdGhlIFVEUCBwYWRzIHRvCisgICAgICAgKiB0aGUgc2Vzc2lvbiBwbHVnaW4uICovCisgICAgICBnc3RfcGFkX2xpbmtfZnVsbCAoKm91dHBhZCwgc3RyZWFtLT5jaGFubmVscGFkWzBdLAorICAgICAgICAgIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKCpvdXRwYWQpOworICAgICAgKm91dHBhZCA9IE5VTEw7CisgICAgICAvKiB3ZSBjb25uZWN0ZWQgdG8gcGFkLWFkZGVkIHNpZ25hbCB0byBnZXQgcGFkcyBmcm9tIHRoZSBtYW5hZ2VyICovCisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInVzaW5nIFVEUCBzcmMgcGFkIGFzIG91dHB1dCIpOworICAgIH0KKyAgfQorCisgIC8qIFJUQ1AgcG9ydCAqLworICBpZiAoc3RyZWFtLT51ZHBzcmNbMV0pIHsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgZ3N0X2VsZW1lbnRfc2V0X2xvY2tlZF9zdGF0ZSAoc3RyZWFtLT51ZHBzcmNbMV0sIFRSVUUpOworICAgIGdzdF9iaW5fYWRkIChHU1RfQklOX0NBU1QgKHNyYyksIHN0cmVhbS0+dWRwc3JjWzFdKTsKKworICAgIGlmIChzdHJlYW0tPnByb2ZpbGUgPT0gR1NUX1JUU1BfUFJPRklMRV9TQVZQIHx8CisgICAgICAgIHN0cmVhbS0+cHJvZmlsZSA9PSBHU1RfUlRTUF9QUk9GSUxFX1NBVlBGKQorICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXNydGNwIik7CisgICAgZWxzZQorICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXJ0Y3AiKTsKKyAgICBnX29iamVjdF9zZXQgKHN0cmVhbS0+dWRwc3JjWzFdLCAiY2FwcyIsIGNhcHMsIE5VTEwpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAgIGlmIChzdHJlYW0tPmNoYW5uZWxwYWRbMV0pIHsKKyAgICAgIEdzdFBhZCAqcGFkOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb25uZWN0aW5nIFVEUCBzb3VyY2UgMSB0byBtYW5hZ2VyIik7CisKKyAgICAgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzdHJlYW0tPnVkcHNyY1sxXSwgInNyYyIpOworICAgICAgZ3N0X3BhZF9saW5rX2Z1bGwgKHBhZCwgc3RyZWFtLT5jaGFubmVscGFkWzFdLAorICAgICAgICAgIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGxlYXZlIHVubGlua2VkICovCisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCisvKiBjb25maWd1cmUgdGhlIFVEUCBzaW5rIGJhY2sgdG8gdGhlIHNlcnZlciBmb3Igc3RhdHVzIHJlcG9ydHMgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV91ZHBfc2lua3MgKEdzdFJUU1BTcmMgKiBzcmMsCisgICAgR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwgR3N0UlRTUFRyYW5zcG9ydCAqIHRyYW5zcG9ydCkKK3sKKyAgR3N0UGFkICpwYWQ7CisgIGdpbnQgcnRwX3BvcnQsIHJ0Y3BfcG9ydDsKKyAgZ2Jvb2xlYW4gZG9fcnRwLCBkb19ydGNwOworICBjb25zdCBnY2hhciAqZGVzdGluYXRpb247CisgIGdjaGFyICp1cmksICpuYW1lOworICBndWludCB0dGwgPSAwOworICBHU29ja2V0ICpzb2NrZXQ7CisKKyAgLyogZ2V0IHRyYW5zcG9ydCBpbmZvICovCisgIGdzdF9ydHNwc3JjX2dldF90cmFuc3BvcnRfaW5mbyAoc3JjLCBzdHJlYW0sIHRyYW5zcG9ydCwgJmRlc3RpbmF0aW9uLAorICAgICAgJnJ0cF9wb3J0LCAmcnRjcF9wb3J0LCAmdHRsKTsKKworICAvKiBzZWUgd2hhdCB3ZSBuZWVkIHRvIGRvICovCisgIGRvX3J0cCA9IChydHBfcG9ydCAhPSAtMSk7CisgIC8qIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgc2VydmVyIGRvZXMgbm90IHdhbnQgdXMgdG8gc2VuZCBSVENQIGluIHdoaWNoIGNhc2UKKyAgICogdGhlIHBvcnQgaXMgLTEgKi8KKyAgZG9fcnRjcCA9IChydGNwX3BvcnQgIT0gLTEgJiYgc3JjLT5tYW5hZ2VyICE9IE5VTEwgJiYgc3JjLT5kb19ydGNwKTsKKworICAvKiB3ZSBuZWVkIGEgZGVzdGluYXRpb24gd2hlbiB3ZSBoYXZlIFJUUCBvciBSVENQIHBvcnRzICovCisgIGlmIChkZXN0aW5hdGlvbiA9PSBOVUxMICYmIChkb19ydHAgfHwgZG9fcnRjcCkpCisgICAgZ290byBub19kZXN0aW5hdGlvbjsKKworICAvKiB0cnkgdG8gY29uc3RydWN0IHRoZSBmYWtlc3JjIHRvIHRoZSBSVFAgcG9ydCBvZiB0aGUgc2VydmVyIHRvIG9wZW4gdXAgYW55CisgICAqIE5BVCBmaXJld2FsbHMgKi8KKyAgaWYgKGRvX3J0cCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNvbmZpZ3VyZSBSVFAgVURQIHNpbmsgZm9yICVzOiVkIiwgZGVzdGluYXRpb24sCisgICAgICAgIHJ0cF9wb3J0KTsKKworICAgIHVyaSA9IGdfc3RyZHVwX3ByaW50ZiAoInVkcDovLyVzOiVkIiwgZGVzdGluYXRpb24sIHJ0cF9wb3J0KTsKKyAgICBzdHJlYW0tPnVkcHNpbmtbMF0gPQorICAgICAgICBnc3RfZWxlbWVudF9tYWtlX2Zyb21fdXJpIChHU1RfVVJJX1NJTkssIHVyaSwgTlVMTCwgTlVMTCk7CisgICAgZ19mcmVlICh1cmkpOworICAgIGlmIChzdHJlYW0tPnVkcHNpbmtbMF0gPT0gTlVMTCkKKyAgICAgIGdvdG8gbm9fc2lua19lbGVtZW50OworCisgICAgLyogZG9uJ3Qgam9pbiBtdWx0aWNhc3QgZ3JvdXAsIHdlIHdpbGwgaGF2ZSB0aGUgc291cmNlIHNvY2tldCBkbyB0aGF0ICovCisgICAgLyogbm8gc3luYyBvciBhc3luYyBzdGF0ZSBjaGFuZ2VzIG5lZWRlZCAqLworICAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHN0cmVhbS0+dWRwc2lua1swXSksICJhdXRvLW11bHRpY2FzdCIsIEZBTFNFLAorICAgICAgICAibG9vcCIsIEZBTFNFLCAic3luYyIsIEZBTFNFLCAiYXN5bmMiLCBGQUxTRSwgTlVMTCk7CisgICAgaWYgKHR0bCA+IDApCisgICAgICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzdHJlYW0tPnVkcHNpbmtbMF0pLCAidHRsIiwgdHRsLCBOVUxMKTsKKworICAgIGlmIChzdHJlYW0tPnVkcHNyY1swXSkgeworICAgICAgLyogY29uZmlndXJlIHNvY2tldCwgd2UgZ2l2ZSBpdCB0aGUgc2FtZSBVRFAgc29ja2V0IGFzIHRoZSB1ZHBzcmMgZm9yIFJUUAorICAgICAgICogc28gdGhhdCBOQVQgZmlyZXdhbGxzIHdpbGwgb3BlbiBhIGhvbGUgZm9yIHVzICovCisgICAgICBnX29iamVjdF9nZXQgKEdfT0JKRUNUIChzdHJlYW0tPnVkcHNyY1swXSksICJ1c2VkLXNvY2tldCIsICZzb2NrZXQsIE5VTEwpOworICAgICAgaWYgKCFzb2NrZXQpCisgICAgICAgIGdvdG8gbm9fc29ja2V0OworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJSVFAgVURQIHNyYyBoYXMgc29jayAlcCIsIHNvY2tldCk7CisgICAgICAvKiBjb25maWd1cmUgc29ja2V0IGFuZCBtYWtlIHN1cmUgdWRwc2luayBkb2VzIG5vdCBjbG9zZSBpdCB3aGVuIHNodXR0aW5nCisgICAgICAgKiBkb3duLCBpdCBiZWxvbmdzIHRvIHVkcHNyYyBhZnRlciBhbGwuICovCisgICAgICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzdHJlYW0tPnVkcHNpbmtbMF0pLCAic29ja2V0Iiwgc29ja2V0LAorICAgICAgICAgICJjbG9zZS1zb2NrZXQiLCBGQUxTRSwgTlVMTCk7CisgICAgICBnX29iamVjdF91bnJlZiAoc29ja2V0KTsKKyAgICB9CisKKyAgICAvKiB0aGUgc291cmNlIGZvciB0aGUgZHVtbXkgcGFja2V0cyB0byBvcGVuIHVwIE5BVCAqLworICAgIHN0cmVhbS0+ZmFrZXNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzcmMiLCBOVUxMKTsKKyAgICBpZiAoc3RyZWFtLT5mYWtlc3JjID09IE5VTEwpCisgICAgICBnb3RvIG5vX2Zha2VzcmNfZWxlbWVudDsKKworICAgIC8qIHJhbmRvbSBkYXRhIGluIDUgYnVmZmVycywgYSBzaXplIG9mIDIwMCBieXRlcyBzaG91bGQgYmUgZmluZSAqLworICAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHN0cmVhbS0+ZmFrZXNyYyksICJmaWxsdHlwZSIsIDMsICJudW0tYnVmZmVycyIsIDUsCisgICAgICAgICJzaXpldHlwZSIsIDIsICJzaXplbWF4IiwgMjAwLCAic2lsZW50IiwgVFJVRSwgTlVMTCk7CisKKyAgICAvKiBrZWVwIGV2ZXJ5dGhpbmcgbG9ja2VkICovCisgICAgZ3N0X2VsZW1lbnRfc2V0X2xvY2tlZF9zdGF0ZSAoc3RyZWFtLT51ZHBzaW5rWzBdLCBUUlVFKTsKKyAgICBnc3RfZWxlbWVudF9zZXRfbG9ja2VkX3N0YXRlIChzdHJlYW0tPmZha2VzcmMsIFRSVUUpOworCisgICAgZ3N0X29iamVjdF9yZWYgKHN0cmVhbS0+dWRwc2lua1swXSk7CisgICAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU5fQ0FTVCAoc3JjKSwgc3RyZWFtLT51ZHBzaW5rWzBdKTsKKyAgICBnc3Rfb2JqZWN0X3JlZiAoc3RyZWFtLT5mYWtlc3JjKTsKKyAgICBnc3RfYmluX2FkZCAoR1NUX0JJTl9DQVNUIChzcmMpLCBzdHJlYW0tPmZha2VzcmMpOworCisgICAgZ3N0X2VsZW1lbnRfbGlua19wYWRzX2Z1bGwgKHN0cmVhbS0+ZmFrZXNyYywgInNyYyIsIHN0cmVhbS0+dWRwc2lua1swXSwKKyAgICAgICAgInNpbmsiLCBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgIH0KKyAgaWYgKGRvX3J0Y3ApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb25maWd1cmUgUlRDUCBVRFAgc2luayBmb3IgJXM6JWQiLCBkZXN0aW5hdGlvbiwKKyAgICAgICAgcnRjcF9wb3J0KTsKKworICAgIHVyaSA9IGdfc3RyZHVwX3ByaW50ZiAoInVkcDovLyVzOiVkIiwgZGVzdGluYXRpb24sIHJ0Y3BfcG9ydCk7CisgICAgc3RyZWFtLT51ZHBzaW5rWzFdID0KKyAgICAgICAgZ3N0X2VsZW1lbnRfbWFrZV9mcm9tX3VyaSAoR1NUX1VSSV9TSU5LLCB1cmksIE5VTEwsIE5VTEwpOworICAgIGdfZnJlZSAodXJpKTsKKyAgICBpZiAoc3RyZWFtLT51ZHBzaW5rWzFdID09IE5VTEwpCisgICAgICBnb3RvIG5vX3NpbmtfZWxlbWVudDsKKworICAgIC8qIGRvbid0IGpvaW4gbXVsdGljYXN0IGdyb3VwLCB3ZSB3aWxsIGhhdmUgdGhlIHNvdXJjZSBzb2NrZXQgZG8gdGhhdCAqLworICAgIC8qIG5vIHN5bmMgb3IgYXN5bmMgc3RhdGUgY2hhbmdlcyBuZWVkZWQgKi8KKyAgICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzdHJlYW0tPnVkcHNpbmtbMV0pLCAiYXV0by1tdWx0aWNhc3QiLCBGQUxTRSwKKyAgICAgICAgImxvb3AiLCBGQUxTRSwgInN5bmMiLCBGQUxTRSwgImFzeW5jIiwgRkFMU0UsIE5VTEwpOworICAgIGlmICh0dGwgPiAwKQorICAgICAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc3RyZWFtLT51ZHBzaW5rWzBdKSwgInR0bCIsIHR0bCwgTlVMTCk7CisKKyAgICBpZiAoc3RyZWFtLT51ZHBzcmNbMV0pIHsKKyAgICAgIC8qIGNvbmZpZ3VyZSBzb2NrZXQsIHdlIGdpdmUgaXQgdGhlIHNhbWUgVURQIHNvY2tldCBhcyB0aGUgdWRwc3JjIGZvciBSVENQCisgICAgICAgKiBiZWNhdXNlIHNvbWUgc2VydmVycyBjaGVjayB0aGUgcG9ydCBudW1iZXIgb2Ygd2hlcmUgaXQgc2VuZHMgUlRDUCB0byBpZGVudGlmeQorICAgICAgICogdGhlIFJUQ1AgcGFja2V0cyBpdCByZWNlaXZlcyAqLworICAgICAgZ19vYmplY3RfZ2V0IChHX09CSkVDVCAoc3RyZWFtLT51ZHBzcmNbMV0pLCAidXNlZC1zb2NrZXQiLCAmc29ja2V0LCBOVUxMKTsKKyAgICAgIGlmICghc29ja2V0KQorICAgICAgICBnb3RvIG5vX3NvY2tldDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiUlRDUCBVRFAgc3JjIGhhcyBzb2NrICVwIiwgc29ja2V0KTsKKyAgICAgIC8qIGNvbmZpZ3VyZSBzb2NrZXQgYW5kIG1ha2Ugc3VyZSB1ZHBzaW5rIGRvZXMgbm90IGNsb3NlIGl0IHdoZW4gc2h1dHRpbmcKKyAgICAgICAqIGRvd24sIGl0IGJlbG9uZ3MgdG8gdWRwc3JjIGFmdGVyIGFsbC4gKi8KKyAgICAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHN0cmVhbS0+dWRwc2lua1sxXSksICJzb2NrZXQiLCBzb2NrZXQsCisgICAgICAgICAgImNsb3NlLXNvY2tldCIsIEZBTFNFLCBOVUxMKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChzb2NrZXQpOworICAgIH0KKworICAgIC8qIHdlIGtlZXAgdGhpcyBwbGF5aW5nIGFsd2F5cyAqLworICAgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKHN0cmVhbS0+dWRwc2lua1sxXSwgVFJVRSk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzdHJlYW0tPnVkcHNpbmtbMV0sIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICAgIGdzdF9vYmplY3RfcmVmIChzdHJlYW0tPnVkcHNpbmtbMV0pOworICAgIGdzdF9iaW5fYWRkIChHU1RfQklOX0NBU1QgKHNyYyksIHN0cmVhbS0+dWRwc2lua1sxXSk7CisKKyAgICBzdHJlYW0tPnJ0Y3BwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc3RyZWFtLT51ZHBzaW5rWzFdLCAic2luayIpOworCisgICAgLyogZ2V0IHNlc3Npb24gUlRDUCBwYWQgKi8KKyAgICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgic2VuZF9ydGNwX3NyY18ldSIsIHN0cmVhbS0+aWQpOworICAgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoc3JjLT5tYW5hZ2VyLCBuYW1lKTsKKyAgICBnX2ZyZWUgKG5hbWUpOworCisgICAgLyogYW5kIGxpbmsgKi8KKyAgICBpZiAocGFkKSB7CisgICAgICBnc3RfcGFkX2xpbmtfZnVsbCAocGFkLCBzdHJlYW0tPnJ0Y3BwYWQsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub19kZXN0aW5hdGlvbjoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNyYywgIm5vIGRlc3RpbmF0aW9uIGFkZHJlc3Mgc3BlY2lmaWVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19zaW5rX2VsZW1lbnQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzcmMsICJubyBVRFAgc2luayBlbGVtZW50IGZvdW5kIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19mYWtlc3JjX2VsZW1lbnQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzcmMsICJubyBmYWtlc3JjIGVsZW1lbnQgZm91bmQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX3NvY2tldDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNyYywgImZhaWxlZCB0byBjcmVhdGUgc29ja2V0Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qIHNldHMgdXAgYWxsIGVsZW1lbnRzIG5lZWRlZCBmb3Igc3RyZWFtaW5nIG92ZXIgdGhlIHNwZWNpZmllZCB0cmFuc3BvcnQuCisgKiBEb2VzIG5vdCB5ZXQgZXhwb3NlIHRoZSBlbGVtZW50IHBhZHMsIHRoaXMgd2lsbCBiZSBkb25lIHdoZW4gdGhlcmUgaXMgYWN0dWFsbAorICogZGF0YWZsb3cgZGV0ZWN0ZWQsIHdoaWNoIG1pZ2h0IG5ldmVyIGhhcHBlbiB3aGVuIFVEUCBpcyBibG9ja2VkIGluIGEKKyAqIGZpcmV3YWxsLCBmb3IgZXhhbXBsZS4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCAoR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwKKyAgICBHc3RSVFNQVHJhbnNwb3J0ICogdHJhbnNwb3J0KQoreworICBHc3RSVFNQU3JjICpzcmM7CisgIEdzdFBhZCAqb3V0cGFkID0gTlVMTDsKKyAgR3N0UGFkVGVtcGxhdGUgKnRlbXBsYXRlOworICBnY2hhciAqbmFtZTsKKyAgY29uc3QgZ2NoYXIgKm1lZGlhX3R5cGU7CisgIGd1aW50IGksIGxlbjsKKworICBzcmMgPSBzdHJlYW0tPnBhcmVudDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb25maWd1cmluZyB0cmFuc3BvcnQgZm9yIHN0cmVhbSAlcCIsIHN0cmVhbSk7CisKKyAgLyogZ2V0IHRoZSBwcm9wZXIgbWVkaWEgdHlwZSBmb3IgdGhpcyBzdHJlYW0gbm93ICovCisgIGlmIChnc3RfcnRzcF90cmFuc3BvcnRfZ2V0X21lZGlhX3R5cGUgKHRyYW5zcG9ydCwgJm1lZGlhX3R5cGUpIDwgMCkKKyAgICBnb3RvIHVua25vd25fdHJhbnNwb3J0OworICBpZiAoIW1lZGlhX3R5cGUpCisgICAgZ290byB1bmtub3duX3RyYW5zcG9ydDsKKworICAvKiBjb25maWd1cmUgdGhlIGZpbmFsIG1lZGlhIHR5cGUgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic2V0dGluZyBtZWRpYSB0eXBlIHRvICVzIiwgbWVkaWFfdHlwZSk7CisKKyAgbGVuID0gc3RyZWFtLT5wdG1hcC0+bGVuOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnM7CisgICAgUHRNYXBJdGVtICppdGVtID0gJmdfYXJyYXlfaW5kZXggKHN0cmVhbS0+cHRtYXAsIFB0TWFwSXRlbSwgaSk7CisKKyAgICBpZiAoaXRlbS0+Y2FwcyA9PSBOVUxMKQorICAgICAgY29udGludWU7CisKKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoaXRlbS0+Y2FwcywgMCk7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAocywgbWVkaWFfdHlwZSk7CisgICAgLyogc2V0IHNzcmMgaWYga25vd24gKi8KKyAgICBpZiAodHJhbnNwb3J0LT5zc3JjKQorICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJzc3JjIiwgR19UWVBFX1VJTlQsIHRyYW5zcG9ydC0+c3NyYywgTlVMTCk7CisgIH0KKworICAvKiB0cnkgdG8gZ2V0IGFuZCBjb25maWd1cmUgYSBtYW5hZ2VyLCBjaGFubmVscGFkWzAtMV0gd2lsbCBiZSBjb25maWd1cmVkIHdpdGgKKyAgICogdGhlIHBhZHMgZm9yIHRoZSBtYW5hZ2VyLCBvciBOVUxMIHdoZW4gbm8gbWFuYWdlciBpcyBuZWVkZWQuICovCisgIGlmICghZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV9tYW5hZ2VyIChzcmMsIHN0cmVhbSwgdHJhbnNwb3J0KSkKKyAgICBnb3RvIG5vX21hbmFnZXI7CisKKyAgc3dpdGNoICh0cmFuc3BvcnQtPmxvd2VyX3RyYW5zcG9ydCkgeworICAgIGNhc2UgR1NUX1JUU1BfTE9XRVJfVFJBTlNfVENQOgorICAgICAgaWYgKCFnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RjcCAoc3JjLCBzdHJlYW0sIHRyYW5zcG9ydCwgJm91dHBhZCkpCisgICAgICAgIGdvdG8gdHJhbnNwb3J0X2ZhaWxlZDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1JUU1BfTE9XRVJfVFJBTlNfVURQX01DQVNUOgorICAgICAgaWYgKCFnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX21jYXN0IChzcmMsIHN0cmVhbSwgdHJhbnNwb3J0LCAmb3V0cGFkKSkKKyAgICAgICAgZ290byB0cmFuc3BvcnRfZmFpbGVkOworICAgICAgLyogZmFsbHRocm91Z2gsIHRoZSByZXN0IGlzIHRoZSBzYW1lIGZvciBVRFAgYW5kIE1DQVNUICovCisgICAgY2FzZSBHU1RfUlRTUF9MT1dFUl9UUkFOU19VRFA6CisgICAgICBpZiAoIWdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdWRwIChzcmMsIHN0cmVhbSwgdHJhbnNwb3J0LCAmb3V0cGFkKSkKKyAgICAgICAgZ290byB0cmFuc3BvcnRfZmFpbGVkOworICAgICAgLyogY29uZmlndXJlIHVkcHNpbmtzIGJhY2sgdG8gdGhlIHNlcnZlciBmb3IgUlRDUCBtZXNzYWdlcyBhbmQgZm9yIHRoZQorICAgICAgICogZHVtbXkgUlRQIG1lc3NhZ2VzIHRvIG9wZW4gTkFULiAqLworICAgICAgaWYgKCFnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3VkcF9zaW5rcyAoc3JjLCBzdHJlYW0sIHRyYW5zcG9ydCkpCisgICAgICAgIGdvdG8gdHJhbnNwb3J0X2ZhaWxlZDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnb3RvIHVua25vd25fdHJhbnNwb3J0OworICB9CisKKyAgaWYgKG91dHBhZCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNyZWF0aW5nIGdob3N0cGFkIik7CisKKyAgICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChvdXRwYWQpOworCisgICAgLyogY3JlYXRlIGdob3N0cGFkLCBkb24ndCBhZGQganVzdCB5ZXQsIHRoaXMgd2lsbCBiZSBkb25lIHdoZW4gd2UgYWN0aXZhdGUKKyAgICAgKiB0aGUgc3RyZWFtLiAqLworICAgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzdHJlYW1fJXUiLCBzdHJlYW0tPmlkKTsKKyAgICB0ZW1wbGF0ZSA9IGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldCAoJnJ0cHRlbXBsYXRlKTsKKyAgICBzdHJlYW0tPnNyY3BhZCA9IGdzdF9naG9zdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKG5hbWUsIG91dHBhZCwgdGVtcGxhdGUpOworICAgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChzdHJlYW0tPnNyY3BhZCwgZ3N0X3J0c3BzcmNfaGFuZGxlX3NyY19ldmVudCk7CisgICAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKHN0cmVhbS0+c3JjcGFkLCBnc3RfcnRzcHNyY19oYW5kbGVfc3JjX3F1ZXJ5KTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmICh0ZW1wbGF0ZSk7CisgICAgZ19mcmVlIChuYW1lKTsKKworICAgIGdzdF9vYmplY3RfdW5yZWYgKG91dHBhZCk7CisgIH0KKyAgLyogbWFyayBwYWQgYXMgb2sgKi8KKyAgc3RyZWFtLT5sYXN0X3JldCA9IEdTVF9GTE9XX09LOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLwordHJhbnNwb3J0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImZhaWxlZCB0byBjb25maWd1cmUgdHJhbnNwb3J0Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit1bmtub3duX3RyYW5zcG9ydDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInVua25vd24gdHJhbnNwb3J0Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19tYW5hZ2VyOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY2Fubm90IGdldCBhIHNlc3Npb24gbWFuYWdlciIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKiBzZW5kIGEgY291cGxlIG9mIGR1bW15IHJhbmRvbSBwYWNrZXRzIG9uIHRoZSByZWNlaXZlciBSVFAgcG9ydCB0byB0aGUgc2VydmVyLAorICogdGhpcyBzaG91bGQgbWFrZSBhIGZpcmV3YWxsIHRoaW5rIHdlIGluaXRpYXRlZCB0aGUgZGF0YSB0cmFuc2ZlciBhbmQKKyAqIGhvcGVmdWxseSBhbGxvdyBwYWNrZXRzIHRvIGdvIGZyb20gdGhlIHNlbmRlciBwb3J0IHRvIG91ciBSVFAgcmVjZWl2ZXIgcG9ydCAqLworc3RhdGljIGdib29sZWFuCitnc3RfcnRzcHNyY19zZW5kX2R1bW15X3BhY2tldHMgKEdzdFJUU1BTcmMgKiBzcmMpCit7CisgIEdMaXN0ICp3YWxrOworCisgIGlmIChzcmMtPm5hdF9tZXRob2QgIT0gR1NUX1JUU1BfTkFUX0RVTU1ZKQorICAgIHJldHVybiBUUlVFOworCisgIGZvciAod2FsayA9IHNyYy0+c3RyZWFtczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BTdHJlYW0gKnN0cmVhbSA9IChHc3RSVFNQU3RyZWFtICopIHdhbGstPmRhdGE7CisKKyAgICBpZiAoc3RyZWFtLT5mYWtlc3JjICYmIHN0cmVhbS0+dWRwc2lua1swXSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic2VuZGluZyBkdW1teSBwYWNrZXQgdG8gc3RyZWFtICVwIiwgc3RyZWFtKTsKKyAgICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc3RyZWFtLT51ZHBzaW5rWzBdLCBHU1RfU1RBVEVfTlVMTCk7CisgICAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHN0cmVhbS0+ZmFrZXNyYywgR1NUX1NUQVRFX05VTEwpOworICAgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzdHJlYW0tPnVkcHNpbmtbMF0sIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc3RyZWFtLT5mYWtlc3JjLCBHU1RfU1RBVEVfUExBWUlORyk7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCisvKiBBZGRzIHRoZSBzb3VyY2UgcGFkcyBvZiBhbGwgY29uZmlndXJlZCBzdHJlYW1zIHRvIHRoZSBlbGVtZW50LgorICogVGhpcyBjb2RlIGlzIHBlcmZvcm1lZCB3aGVuIHdlIGRldGVjdGVkIGRhdGFmbG93LgorICoKKyAqIFdlIGRldGVjdCBkYXRhZmxvdyBmcm9tIGVpdGhlciB0aGUgX2xvb3AgZnVuY3Rpb24gb3Igd2l0aCBwYWQgcHJvYmVzIG9uIHRoZQorICogdWRwIHNvdXJjZXMuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfYWN0aXZhdGVfc3RyZWFtcyAoR3N0UlRTUFNyYyAqIHNyYykKK3sKKyAgR0xpc3QgKndhbGs7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiYWN0aXZhdGluZyBzdHJlYW1zIik7CisKKyAgZm9yICh3YWxrID0gc3JjLT5zdHJlYW1zOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtID0gKEdzdFJUU1BTdHJlYW0gKikgd2Fsay0+ZGF0YTsKKworICAgIGlmIChzdHJlYW0tPnVkcHNyY1swXSkgeworICAgICAgLyogcmVtb3ZlIHRpbWVvdXQsIHdlIGFyZSBzdHJlYW1pbmcgbm93IGFuZCB0aW1lb3V0cyB3aWxsIGJlIGhhbmRsZWQgYnkKKyAgICAgICAqIHRoZSBzZXNzaW9uIG1hbmFnZXIgYW5kIGppdHRlciBidWZmZXIgKi8KKyAgICAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHN0cmVhbS0+dWRwc3JjWzBdKSwgInRpbWVvdXQiLCAoZ3VpbnQ2NCkgMCwgTlVMTCk7CisgICAgfQorICAgIGlmIChzdHJlYW0tPnNyY3BhZCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiYWN0aXZhdGluZyBzdHJlYW0gcGFkICVwIiwgc3RyZWFtKTsKKyAgICAgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc3RyZWFtLT5zcmNwYWQsIFRSVUUpOworCisgICAgICAvKiBpZiB3ZSBkb24ndCBoYXZlIGEgc2Vzc2lvbiBtYW5hZ2VyLCBzZXQgdGhlIGNhcHMgbm93LiBJZiB3ZSBoYXZlIGEKKyAgICAgICAqIHNlc3Npb24sIHdlIHdpbGwgZ2V0IGEgbm90aWZpY2F0aW9uIG9mIHRoZSBwYWQgYW5kIHRoZSBjYXBzLiAqLworICAgICAgaWYgKCFzcmMtPm1hbmFnZXIpIHsKKyAgICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgICBjYXBzID0gc3RyZWFtX2dldF9jYXBzX2Zvcl9wdCAoc3RyZWFtLCBzdHJlYW0tPmRlZmF1bHRfcHQpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzZXR0aW5nIHBhZCBjYXBzIGZvciBzdHJlYW0gJXAiLCBzdHJlYW0pOworICAgICAgICBnc3RfcGFkX3NldF9jYXBzIChzdHJlYW0tPnNyY3BhZCwgY2Fwcyk7CisgICAgICB9CisgICAgICAvKiBhZGQgdGhlIHBhZCAqLworICAgICAgaWYgKCFzdHJlYW0tPmFkZGVkKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImFkZGluZyBzdHJlYW0gcGFkICVwIiwgc3RyZWFtKTsKKyAgICAgICAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAoc3JjKSwgc3RyZWFtLT5zcmNwYWQpOworICAgICAgICBzdHJlYW0tPmFkZGVkID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiB1bmJsb2NrIGFsbCBwYWRzICovCisgIGZvciAod2FsayA9IHNyYy0+c3RyZWFtczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BTdHJlYW0gKnN0cmVhbSA9IChHc3RSVFNQU3RyZWFtICopIHdhbGstPmRhdGE7CisKKyAgICBpZiAoc3RyZWFtLT5ibG9ja2lkKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJ1bmJsb2NraW5nIHN0cmVhbSBwYWQgJXAiLCBzdHJlYW0pOworICAgICAgZ3N0X3BhZF9yZW1vdmVfcHJvYmUgKHN0cmVhbS0+YmxvY2tlZHBhZCwgc3RyZWFtLT5ibG9ja2lkKTsKKyAgICAgIHN0cmVhbS0+YmxvY2tpZCA9IDA7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY19jb25maWd1cmVfY2FwcyAoR3N0UlRTUFNyYyAqIHNyYywgR3N0U2VnbWVudCAqIHNlZ21lbnQsCisgICAgZ2Jvb2xlYW4gcmVzZXRfbWFuYWdlcikKK3sKKyAgR0xpc3QgKndhbGs7CisgIGd1aW50NjQgc3RhcnQsIHN0b3A7CisgIGdkb3VibGUgcGxheV9zcGVlZCwgcGxheV9zY2FsZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb25maWd1cmluZyBzdHJlYW0gY2FwcyIpOworCisgIHN0YXJ0ID0gc2VnbWVudC0+cG9zaXRpb247CisgIHN0b3AgPSBzZWdtZW50LT5kdXJhdGlvbjsKKyAgcGxheV9zcGVlZCA9IHNlZ21lbnQtPnJhdGU7CisgIHBsYXlfc2NhbGUgPSBzZWdtZW50LT5hcHBsaWVkX3JhdGU7CisKKyAgZm9yICh3YWxrID0gc3JjLT5zdHJlYW1zOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtID0gKEdzdFJUU1BTdHJlYW0gKikgd2Fsay0+ZGF0YTsKKyAgICBndWludCBqLCBsZW47CisKKyAgICBpZiAoIXN0cmVhbS0+c2V0dXApCisgICAgICBjb250aW51ZTsKKworICAgIGxlbiA9IHN0cmVhbS0+cHRtYXAtPmxlbjsKKyAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisgICAgICBQdE1hcEl0ZW0gKml0ZW0gPSAmZ19hcnJheV9pbmRleCAoc3RyZWFtLT5wdG1hcCwgUHRNYXBJdGVtLCBqKTsKKworICAgICAgaWYgKGl0ZW0tPmNhcHMgPT0gTlVMTCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChpdGVtLT5jYXBzKTsKKyAgICAgIC8qIHVwZGF0ZSBjYXBzICovCisgICAgICBpZiAoc3RyZWFtLT50aW1lYmFzZSAhPSAtMSkKKyAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgImNsb2NrLWJhc2UiLCBHX1RZUEVfVUlOVCwKKyAgICAgICAgICAgIChndWludCkgc3RyZWFtLT50aW1lYmFzZSwgTlVMTCk7CisgICAgICBpZiAoc3RyZWFtLT5zZXFiYXNlICE9IC0xKQorICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAic2VxbnVtLWJhc2UiLCBHX1RZUEVfVUlOVCwKKyAgICAgICAgICAgIChndWludCkgc3RyZWFtLT5zZXFiYXNlLCBOVUxMKTsKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJucHQtc3RhcnQiLCBHX1RZUEVfVUlOVDY0LCBzdGFydCwgTlVMTCk7CisgICAgICBpZiAoc3RvcCAhPSAtMSkKKyAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgIm5wdC1zdG9wIiwgR19UWVBFX1VJTlQ2NCwgc3RvcCwgTlVMTCk7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAicGxheS1zcGVlZCIsIEdfVFlQRV9ET1VCTEUsIHBsYXlfc3BlZWQsIE5VTEwpOworICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgInBsYXktc2NhbGUiLCBHX1RZUEVfRE9VQkxFLCBwbGF5X3NjYWxlLCBOVUxMKTsKKworICAgICAgaXRlbS0+Y2FwcyA9IGNhcHM7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzdHJlYW0gJXAsIHB0ICVkLCBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBzdHJlYW0sCisgICAgICAgICAgaXRlbS0+cHQsIGNhcHMpOworCisgICAgICBpZiAoaXRlbS0+cHQgPT0gc3RyZWFtLT5kZWZhdWx0X3B0KSB7CisgICAgICAgIGlmIChzdHJlYW0tPnVkcHNyY1swXSkKKyAgICAgICAgICBnX29iamVjdF9zZXQgKHN0cmVhbS0+dWRwc3JjWzBdLCAiY2FwcyIsIGNhcHMsIE5VTEwpOworICAgICAgICBzdHJlYW0tPm5lZWRfY2FwcyA9IFRSVUU7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChyZXNldF9tYW5hZ2VyICYmIHNyYy0+bWFuYWdlcikgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNsZWFyIHNlc3Npb24iKTsKKyAgICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHNyYy0+bWFuYWdlciwgImNsZWFyLXB0LW1hcCIsIE5VTEwpOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRzcHNyY19jb21iaW5lX2Zsb3dzIChHc3RSVFNQU3JjICogc3JjLCBHc3RSVFNQU3RyZWFtICogc3RyZWFtLAorICAgIEdzdEZsb3dSZXR1cm4gcmV0KQoreworICBHTGlzdCAqc3RyZWFtczsKKworICAvKiBzdG9yZSB0aGUgdmFsdWUgKi8KKyAgc3RyZWFtLT5sYXN0X3JldCA9IHJldDsKKworICAvKiBpZiBpdCdzIHN1Y2Nlc3Mgd2UgY2FuIHJldHVybiB0aGUgdmFsdWUgcmlnaHQgYXdheSAqLworICBpZiAocmV0ID09IEdTVF9GTE9XX09LKQorICAgIGdvdG8gZG9uZTsKKworICAvKiBhbnkgb3RoZXIgZXJyb3IgdGhhdCBpcyBub3QtbGlua2VkIGNhbiBiZSByZXR1cm5lZCByaWdodAorICAgKiBhd2F5ICovCisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfTk9UX0xJTktFRCkKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogb25seSByZXR1cm4gTk9UX0xJTktFRCBpZiBhbGwgb3RoZXIgcGFkcyByZXR1cm5lZCBOT1RfTElOS0VEICovCisgIGZvciAoc3RyZWFtcyA9IHNyYy0+c3RyZWFtczsgc3RyZWFtczsgc3RyZWFtcyA9IGdfbGlzdF9uZXh0IChzdHJlYW1zKSkgeworICAgIEdzdFJUU1BTdHJlYW0gKm9zdHJlYW0gPSAoR3N0UlRTUFN0cmVhbSAqKSBzdHJlYW1zLT5kYXRhOworCisgICAgcmV0ID0gb3N0cmVhbS0+bGFzdF9yZXQ7CisgICAgLyogc29tZSBvdGhlciByZXR1cm4gdmFsdWUgKG11c3QgYmUgU1VDQ0VTUyBidXQgd2UgY2FuIHJldHVybgorICAgICAqIG90aGVyIHZhbHVlcyBhcyB3ZWxsKSAqLworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfTk9UX0xJTktFRCkKKyAgICAgIGdvdG8gZG9uZTsKKyAgfQorICAvKiBpZiB3ZSBnZXQgaGVyZSwgYWxsIG90aGVyIHBhZHMgd2VyZSB1bmxpbmtlZCBhbmQgd2UgcmV0dXJuCisgICAqIE5PVF9MSU5LRUQgdGhlbiAqLworZG9uZToKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRzcHNyY19zdHJlYW1fcHVzaF9ldmVudCAoR3N0UlRTUFNyYyAqIHNyYywgR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBnYm9vbGVhbiByZXMgPSBUUlVFOworCisgIC8qIG9ubHkgc3RyZWFtcyB0aGF0IGhhdmUgYSBjb25uZWN0aW9uIHRvIHRoZSBvdXRzaWRlIHdvcmxkICovCisgIGlmICghc3RyZWFtLT5zZXR1cCkKKyAgICBnb3RvIGRvbmU7CisKKyAgaWYgKHN0cmVhbS0+dWRwc3JjWzBdKSB7CisgICAgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpOworICAgIHJlcyA9IGdzdF9lbGVtZW50X3NlbmRfZXZlbnQgKHN0cmVhbS0+dWRwc3JjWzBdLCBldmVudCk7CisgIH0gZWxzZSBpZiAoc3RyZWFtLT5jaGFubmVscGFkWzBdKSB7CisgICAgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpOworICAgIGlmIChHU1RfUEFEX0lTX1NSQyAoc3RyZWFtLT5jaGFubmVscGFkWzBdKSkKKyAgICAgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAoc3RyZWFtLT5jaGFubmVscGFkWzBdLCBldmVudCk7CisgICAgZWxzZQorICAgICAgcmVzID0gZ3N0X3BhZF9zZW5kX2V2ZW50IChzdHJlYW0tPmNoYW5uZWxwYWRbMF0sIGV2ZW50KTsKKyAgfQorCisgIGlmIChzdHJlYW0tPnVkcHNyY1sxXSkgeworICAgIGdzdF9ldmVudF9yZWYgKGV2ZW50KTsKKyAgICByZXMgJj0gZ3N0X2VsZW1lbnRfc2VuZF9ldmVudCAoc3RyZWFtLT51ZHBzcmNbMV0sIGV2ZW50KTsKKyAgfSBlbHNlIGlmIChzdHJlYW0tPmNoYW5uZWxwYWRbMV0pIHsKKyAgICBnc3RfZXZlbnRfcmVmIChldmVudCk7CisgICAgaWYgKEdTVF9QQURfSVNfU1JDIChzdHJlYW0tPmNoYW5uZWxwYWRbMV0pKQorICAgICAgcmVzICY9IGdzdF9wYWRfcHVzaF9ldmVudCAoc3RyZWFtLT5jaGFubmVscGFkWzFdLCBldmVudCk7CisgICAgZWxzZQorICAgICAgcmVzICY9IGdzdF9wYWRfc2VuZF9ldmVudCAoc3RyZWFtLT5jaGFubmVscGFkWzFdLCBldmVudCk7CisgIH0KKworZG9uZToKKyAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRzcHNyY19wdXNoX2V2ZW50IChHc3RSVFNQU3JjICogc3JjLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHTGlzdCAqc3RyZWFtczsKKyAgZ2Jvb2xlYW4gcmVzID0gVFJVRTsKKworICBmb3IgKHN0cmVhbXMgPSBzcmMtPnN0cmVhbXM7IHN0cmVhbXM7IHN0cmVhbXMgPSBnX2xpc3RfbmV4dCAoc3RyZWFtcykpIHsKKyAgICBHc3RSVFNQU3RyZWFtICpvc3RyZWFtID0gKEdzdFJUU1BTdHJlYW0gKikgc3RyZWFtcy0+ZGF0YTsKKworICAgIGdzdF9ldmVudF9yZWYgKGV2ZW50KTsKKyAgICByZXMgJj0gZ3N0X3J0c3BzcmNfc3RyZWFtX3B1c2hfZXZlbnQgKHNyYywgb3N0cmVhbSwgZXZlbnQpOworICB9CisgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorYWNjZXB0X2NlcnRpZmljYXRlX2NiIChHVGxzQ29ubmVjdGlvbiAqIGNvbm4sIEdUbHNDZXJ0aWZpY2F0ZSAqIHBlZXJfY2VydCwKKyAgICBHVGxzQ2VydGlmaWNhdGVGbGFncyBlcnJvcnMsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0UlRTUFNyYyAqc3JjID0gdXNlcl9kYXRhOworICBnYm9vbGVhbiBhY2NlcHQgPSBGQUxTRTsKKworICBnX3NpZ25hbF9lbWl0IChzcmMsIGdzdF9ydHNwc3JjX3NpZ25hbHNbU0lHTkFMX0FDQ0VQVF9DRVJUSUZJQ0FURV0sIDAsIGNvbm4sCisgICAgICBwZWVyX2NlcnQsIGVycm9ycywgJmFjY2VwdCk7CisKKyAgcmV0dXJuIGFjY2VwdDsKK30KKworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwX2Nvbm5pbmZvX2Nvbm5lY3QgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFJUU1BDb25uSW5mbyAqIGluZm8sCisgICAgZ2Jvb2xlYW4gYXN5bmMpCit7CisgIEdzdFJUU1BSZXN1bHQgcmVzOworICBHc3RSVFNQTWVzc2FnZSByZXNwb25zZTsKKyAgZ2Jvb2xlYW4gcmV0cnkgPSBGQUxTRTsKKyAgbWVtc2V0ICgmcmVzcG9uc2UsIDAsIHNpemVvZiAocmVzcG9uc2UpKTsKKyAgZ3N0X3J0c3BfbWVzc2FnZV9pbml0ICgmcmVzcG9uc2UpOworICBkbyB7CisgICAgaWYgKGluZm8tPmNvbm5lY3Rpb24gPT0gTlVMTCkgeworICAgICAgaWYgKGluZm8tPnVybCA9PSBOVUxMKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInBhcnNpbmcgdXJpICglcykuLi4iLCBpbmZvLT5sb2NhdGlvbik7CisgICAgICAgIGlmICgocmVzID0gZ3N0X3J0c3BfdXJsX3BhcnNlIChpbmZvLT5sb2NhdGlvbiwgJmluZm8tPnVybCkpIDwgMCkKKyAgICAgICAgICBnb3RvIHBhcnNlX2Vycm9yOworICAgICAgfQorICAgICAgLyogY3JlYXRlIGNvbm5lY3Rpb24gKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNyZWF0aW5nIGNvbm5lY3Rpb24gKCVzKS4uLiIsIGluZm8tPmxvY2F0aW9uKTsKKyAgICAgIGlmICgocmVzID0gZ3N0X3J0c3BfY29ubmVjdGlvbl9jcmVhdGUgKGluZm8tPnVybCwgJmluZm8tPmNvbm5lY3Rpb24pKSA8IDApCisgICAgICAgIGdvdG8gY291bGRfbm90X2NyZWF0ZTsKKworICAgICAgaWYgKHJldHJ5KSB7CisgICAgICAgIGdzdF9ydHNwc3JjX3NldHVwX2F1dGggKHNyYywgJnJlc3BvbnNlKTsKKyAgICAgIH0KKworICAgICAgZ19mcmVlIChpbmZvLT51cmxfc3RyKTsKKyAgICAgIGluZm8tPnVybF9zdHIgPSBnc3RfcnRzcF91cmxfZ2V0X3JlcXVlc3RfdXJpIChpbmZvLT51cmwpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzYW5pdGl6ZWQgdXJpICVzIiwgaW5mby0+dXJsX3N0cik7CisKKyAgICAgIGlmIChpbmZvLT51cmwtPnRyYW5zcG9ydHMgJiBHU1RfUlRTUF9MT1dFUl9UUkFOU19UTFMpIHsKKyAgICAgICAgaWYgKCFnc3RfcnRzcF9jb25uZWN0aW9uX3NldF90bHNfdmFsaWRhdGlvbl9mbGFncyAoaW5mby0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICBzcmMtPnRsc192YWxpZGF0aW9uX2ZsYWdzKSkKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgIlVuYWJsZSB0byBzZXQgVExTIHZhbGlkYXRpb24gZmxhZ3MiKTsKKworICAgICAgICBpZiAoc3JjLT50bHNfZGF0YWJhc2UpCisgICAgICAgICAgZ3N0X3J0c3BfY29ubmVjdGlvbl9zZXRfdGxzX2RhdGFiYXNlIChpbmZvLT5jb25uZWN0aW9uLAorICAgICAgICAgICAgICBzcmMtPnRsc19kYXRhYmFzZSk7CisKKyAgICAgICAgaWYgKHNyYy0+dGxzX2ludGVyYWN0aW9uKQorICAgICAgICAgIGdzdF9ydHNwX2Nvbm5lY3Rpb25fc2V0X3Rsc19pbnRlcmFjdGlvbiAoaW5mby0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgc3JjLT50bHNfaW50ZXJhY3Rpb24pOworICAgICAgICBnc3RfcnRzcF9jb25uZWN0aW9uX3NldF9hY2NlcHRfY2VydGlmaWNhdGVfZnVuYyAoaW5mby0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgIGFjY2VwdF9jZXJ0aWZpY2F0ZV9jYiwgc3JjLCBOVUxMKTsKKyAgICAgIH0KKworICAgICAgaWYgKGluZm8tPnVybC0+dHJhbnNwb3J0cyAmIEdTVF9SVFNQX0xPV0VSX1RSQU5TX0hUVFApCisgICAgICAgIGdzdF9ydHNwX2Nvbm5lY3Rpb25fc2V0X3R1bm5lbGVkIChpbmZvLT5jb25uZWN0aW9uLCBUUlVFKTsKKworICAgICAgaWYgKHNyYy0+cHJveHlfaG9zdCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzZXR0aW5nIHByb3h5ICVzOiVkIiwgc3JjLT5wcm94eV9ob3N0LAorICAgICAgICAgICAgc3JjLT5wcm94eV9wb3J0KTsKKyAgICAgICAgZ3N0X3J0c3BfY29ubmVjdGlvbl9zZXRfcHJveHkgKGluZm8tPmNvbm5lY3Rpb24sIHNyYy0+cHJveHlfaG9zdCwKKyAgICAgICAgICAgIHNyYy0+cHJveHlfcG9ydCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFpbmZvLT5jb25uZWN0ZWQpIHsKKyAgICAgIC8qIGNvbm5lY3QgKi8KKyAgICAgIGlmIChhc3luYykKKyAgICAgICAgR1NUX0VMRU1FTlRfUFJPR1JFU1MgKHNyYywgQ09OVElOVUUsICJjb25uZWN0IiwKKyAgICAgICAgICAgICgiQ29ubmVjdGluZyB0byAlcyIsIGluZm8tPmxvY2F0aW9uKSk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb25uZWN0aW5nICglcykuLi4iLCBpbmZvLT5sb2NhdGlvbik7CisgICAgICByZXMgPSBnc3RfcnRzcF9jb25uZWN0aW9uX2Nvbm5lY3Rfd2l0aF9yZXNwb25zZSAoaW5mby0+Y29ubmVjdGlvbiwKKyAgICAgICAgICBzcmMtPnB0Y3BfdGltZW91dCwgJnJlc3BvbnNlKTsKKworICAgICAgaWYgKHJlc3BvbnNlLnR5cGUgPT0gR1NUX1JUU1BfTUVTU0FHRV9IVFRQX1JFU1BPTlNFICYmCisgICAgICAgICAgcmVzcG9uc2UudHlwZV9kYXRhLnJlc3BvbnNlLmNvZGUgPT0gR1NUX1JUU1BfU1RTX1VOQVVUSE9SSVpFRCkgeworICAgICAgICBnc3RfcnRzcF9jb25uaW5mb19jbG9zZSAoc3JjLCBpbmZvLCBUUlVFKTsKKyAgICAgICAgaWYgKCFyZXRyeSkKKyAgICAgICAgICByZXRyeSA9IFRSVUU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXRyeSA9IEZBTFNFOyAgICAgICAgLy8gd2Ugc2hvdWxkIG5vdCByZXRyeSBtb3JlIHRoYW4gb25jZQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0cnkgPSBGQUxTRTsKKyAgICAgIH0KKworICAgICAgaWYgKHJlcyA9PSBHU1RfUlRTUF9PSykKKyAgICAgICAgaW5mby0+Y29ubmVjdGVkID0gVFJVRTsKKyAgICAgIGVsc2UgaWYgKCFyZXRyeSkKKyAgICAgICAgZ290byBjb3VsZF9ub3RfY29ubmVjdDsKKyAgICB9CisgIH0gd2hpbGUgKCFpbmZvLT5jb25uZWN0ZWQgJiYgcmV0cnkpOworCisgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZyZXNwb25zZSk7CisgIHJldHVybiBHU1RfUlRTUF9PSzsKKworICAvKiBFUlJPUlMgKi8KK3BhcnNlX2Vycm9yOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoc3JjLCAiTm8gdmFsaWQgUlRTUCBVUkwgd2FzIHByb3ZpZGVkIik7CisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJnJlc3BvbnNlKTsKKyAgICByZXR1cm4gcmVzOworICB9Citjb3VsZF9ub3RfY3JlYXRlOgorICB7CisgICAgZ2NoYXIgKnN0ciA9IGdzdF9ydHNwX3N0cnJlc3VsdCAocmVzKTsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzcmMsICJDb3VsZCBub3QgY3JlYXRlIGNvbm5lY3Rpb24uICglcykiLCBzdHIpOworICAgIGdfZnJlZSAoc3RyKTsKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVzcG9uc2UpOworICAgIHJldHVybiByZXM7CisgIH0KK2NvdWxkX25vdF9jb25uZWN0OgorICB7CisgICAgZ2NoYXIgKnN0ciA9IGdzdF9ydHNwX3N0cnJlc3VsdCAocmVzKTsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzcmMsICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIuICglcykiLCBzdHIpOworICAgIGdfZnJlZSAoc3RyKTsKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVzcG9uc2UpOworICAgIHJldHVybiByZXM7CisgIH0KK30KKworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwX2Nvbm5pbmZvX2Nsb3NlIChHc3RSVFNQU3JjICogc3JjLCBHc3RSVFNQQ29ubkluZm8gKiBpbmZvLAorICAgIGdib29sZWFuIGZyZWUpCit7CisgIEdTVF9SVFNQX1NUQVRFX0xPQ0sgKHNyYyk7CisgIGlmIChpbmZvLT5jb25uZWN0ZWQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjbG9zaW5nIGNvbm5lY3Rpb24uLi4iKTsKKyAgICBnc3RfcnRzcF9jb25uZWN0aW9uX2Nsb3NlIChpbmZvLT5jb25uZWN0aW9uKTsKKyAgICBpbmZvLT5jb25uZWN0ZWQgPSBGQUxTRTsKKyAgfQorICBpZiAoZnJlZSAmJiBpbmZvLT5jb25uZWN0aW9uKSB7CisgICAgLyogZnJlZSBjb25uZWN0aW9uICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZnJlZWluZyBjb25uZWN0aW9uLi4uIik7CisgICAgZ3N0X3J0c3BfY29ubmVjdGlvbl9mcmVlIChpbmZvLT5jb25uZWN0aW9uKTsKKyAgICBpbmZvLT5jb25uZWN0aW9uID0gTlVMTDsKKyAgICBpbmZvLT5mbHVzaGluZyA9IEZBTFNFOworICB9CisgIEdTVF9SVFNQX1NUQVRFX1VOTE9DSyAoc3JjKTsKKyAgcmV0dXJuIEdTVF9SVFNQX09LOworfQorCitzdGF0aWMgR3N0UlRTUFJlc3VsdAorZ3N0X3J0c3BfY29ubmluZm9fcmVjb25uZWN0IChHc3RSVFNQU3JjICogc3JjLCBHc3RSVFNQQ29ubkluZm8gKiBpbmZvLAorICAgIGdib29sZWFuIGFzeW5jKQoreworICBHc3RSVFNQUmVzdWx0IHJlczsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJyZWNvbm5lY3RpbmcgY29ubmVjdGlvbi4uLiIpOworICBnc3RfcnRzcF9jb25uaW5mb19jbG9zZSAoc3JjLCBpbmZvLCBGQUxTRSk7CisgIHJlcyA9IGdzdF9ydHNwX2Nvbm5pbmZvX2Nvbm5lY3QgKHNyYywgaW5mbywgYXN5bmMpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY19jb25uZWN0aW9uX2ZsdXNoIChHc3RSVFNQU3JjICogc3JjLCBnYm9vbGVhbiBmbHVzaCkKK3sKKyAgR0xpc3QgKndhbGs7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic2V0IGZsdXNoaW5nICVkIiwgZmx1c2gpOworICBHU1RfUlRTUF9TVEFURV9MT0NLIChzcmMpOworICBpZiAoc3JjLT5jb25uaW5mby5jb25uZWN0aW9uICYmIHNyYy0+Y29ubmluZm8uZmx1c2hpbmcgIT0gZmx1c2gpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb25uZWN0aW9uIGZsdXNoIik7CisgICAgZ3N0X3J0c3BfY29ubmVjdGlvbl9mbHVzaCAoc3JjLT5jb25uaW5mby5jb25uZWN0aW9uLCBmbHVzaCk7CisgICAgc3JjLT5jb25uaW5mby5mbHVzaGluZyA9IGZsdXNoOworICB9CisgIGZvciAod2FsayA9IHNyYy0+c3RyZWFtczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BTdHJlYW0gKnN0cmVhbSA9IChHc3RSVFNQU3RyZWFtICopIHdhbGstPmRhdGE7CisgICAgaWYgKHN0cmVhbS0+Y29ubmluZm8uY29ubmVjdGlvbiAmJiBzdHJlYW0tPmNvbm5pbmZvLmZsdXNoaW5nICE9IGZsdXNoKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzdHJlYW0gJXAgZmx1c2giLCBzdHJlYW0pOworICAgICAgZ3N0X3J0c3BfY29ubmVjdGlvbl9mbHVzaCAoc3RyZWFtLT5jb25uaW5mby5jb25uZWN0aW9uLCBmbHVzaCk7CisgICAgICBzdHJlYW0tPmNvbm5pbmZvLmZsdXNoaW5nID0gZmx1c2g7CisgICAgfQorICB9CisgIEdTVF9SVFNQX1NUQVRFX1VOTE9DSyAoc3JjKTsKK30KKworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX2luaXRfcmVxdWVzdCAoR3N0UlRTUFNyYyAqIHNyYywgR3N0UlRTUE1lc3NhZ2UgKiBtc2csCisgICAgR3N0UlRTUE1ldGhvZCBtZXRob2QsIGNvbnN0IGdjaGFyICogdXJpKQoreworICBHc3RSVFNQUmVzdWx0IHJlczsKKworICByZXMgPSBnc3RfcnRzcF9tZXNzYWdlX2luaXRfcmVxdWVzdCAobXNnLCBtZXRob2QsIHVyaSk7CisgIGlmIChyZXMgPCAwKQorICAgIHJldHVybiByZXM7CisKKyAgLyogc2V0IHVzZXItYWdlbnQgKi8KKyAgaWYgKHNyYy0+dXNlcl9hZ2VudCkKKyAgICBnc3RfcnRzcF9tZXNzYWdlX2FkZF9oZWFkZXIgKG1zZywgR1NUX1JUU1BfSERSX1VTRVJfQUdFTlQsIHNyYy0+dXNlcl9hZ2VudCk7CisKKyAgcmV0dXJuIHJlczsKK30KKworLyogRklYTUUsIGhhbmRsZSBzZXJ2ZXIgcmVxdWVzdCwgcmVwbHkgd2l0aCBPSywgZm9yIG5vdyAqLworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX2hhbmRsZV9yZXF1ZXN0IChHc3RSVFNQU3JjICogc3JjLCBHc3RSVFNQQ29ubkluZm8gKiBjb25uaW5mbywKKyAgICBHc3RSVFNQTWVzc2FnZSAqIHJlcXVlc3QpCit7CisgIEdzdFJUU1BNZXNzYWdlIHJlc3BvbnNlID0geyAwIH07CisgIEdzdFJUU1BSZXN1bHQgcmVzOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImdvdCBzZXJ2ZXIgcmVxdWVzdCBtZXNzYWdlIik7CisKKyAgREVCVUdfUlRTUCAoc3JjLCByZXF1ZXN0KTsKKworICByZXMgPSBnc3RfcnRzcF9leHRfbGlzdF9yZWNlaXZlX3JlcXVlc3QgKHNyYy0+ZXh0ZW5zaW9ucywgcmVxdWVzdCk7CisKKyAgaWYgKHJlcyA9PSBHU1RfUlRTUF9FTk9USU1QTCkgeworICAgIC8qIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sIHNlbmQgT0sgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJwcmVwYXJlIE9LIHJlcGx5Iik7CisgICAgcmVzID0KKyAgICAgICAgZ3N0X3J0c3BfbWVzc2FnZV9pbml0X3Jlc3BvbnNlICgmcmVzcG9uc2UsIEdTVF9SVFNQX1NUU19PSywgIk9LIiwKKyAgICAgICAgcmVxdWVzdCk7CisgICAgaWYgKHJlcyA8IDApCisgICAgICBnb3RvIHNlbmRfZXJyb3I7CisKKyAgICAvKiBsZXQgYXBwIHBhcnNlIGFuZCByZXBseSAqLworICAgIGdfc2lnbmFsX2VtaXQgKHNyYywgZ3N0X3J0c3BzcmNfc2lnbmFsc1tTSUdOQUxfSEFORExFX1JFUVVFU1RdLAorICAgICAgICAwLCByZXF1ZXN0LCAmcmVzcG9uc2UpOworCisgICAgREVCVUdfUlRTUCAoc3JjLCAmcmVzcG9uc2UpOworCisgICAgcmVzID0gZ3N0X3J0c3BzcmNfY29ubmVjdGlvbl9zZW5kIChzcmMsIGNvbm5pbmZvLCAmcmVzcG9uc2UsIE5VTEwpOworICAgIGlmIChyZXMgPCAwKQorICAgICAgZ290byBzZW5kX2Vycm9yOworCisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJnJlc3BvbnNlKTsKKyAgfSBlbHNlIGlmIChyZXMgPT0gR1NUX1JUU1BfRUVPRikKKyAgICByZXR1cm4gcmVzOworCisgIHJldHVybiBHU1RfUlRTUF9PSzsKKworICAvKiBFUlJPUlMgKi8KK3NlbmRfZXJyb3I6CisgIHsKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVzcG9uc2UpOworICAgIHJldHVybiByZXM7CisgIH0KK30KKworLyogc2VuZCBzZXJ2ZXIga2VlcC1hbGl2ZSAqLworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX3NlbmRfa2VlcF9hbGl2ZSAoR3N0UlRTUFNyYyAqIHNyYykKK3sKKyAgR3N0UlRTUE1lc3NhZ2UgcmVxdWVzdCA9IHsgMCB9OworICBHc3RSVFNQUmVzdWx0IHJlczsKKyAgR3N0UlRTUE1ldGhvZCBtZXRob2Q7CisgIGNvbnN0IGdjaGFyICpjb250cm9sOworCisgIGlmIChzcmMtPmRvX3J0c3Bfa2VlcF9hbGl2ZSA9PSBGQUxTRSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImRvLXJ0c3Ata2VlcC1hbGl2ZSBpcyBGQUxTRSwgbm90IHNlbmRpbmcuIik7CisgICAgZ3N0X3J0c3BfY29ubmVjdGlvbl9yZXNldF90aW1lb3V0IChzcmMtPmNvbm5pbmZvLmNvbm5lY3Rpb24pOworICAgIHJldHVybiBHU1RfUlRTUF9PSzsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNyZWF0aW5nIHNlcnZlciBrZWVwLWFsaXZlIik7CisKKyAgLyogZmluZCBhIG1ldGhvZCB0byB1c2UgZm9yIGtlZXAtYWxpdmUgKi8KKyAgaWYgKHNyYy0+bWV0aG9kcyAmIEdTVF9SVFNQX0dFVF9QQVJBTUVURVIpCisgICAgbWV0aG9kID0gR1NUX1JUU1BfR0VUX1BBUkFNRVRFUjsKKyAgZWxzZQorICAgIG1ldGhvZCA9IEdTVF9SVFNQX09QVElPTlM7CisKKyAgY29udHJvbCA9IGdldF9hZ2dyZWdhdGVfY29udHJvbCAoc3JjKTsKKyAgaWYgKGNvbnRyb2wgPT0gTlVMTCkKKyAgICBnb3RvIG5vX2NvbnRyb2w7CisKKyAgcmVzID0gZ3N0X3J0c3BzcmNfaW5pdF9yZXF1ZXN0IChzcmMsICZyZXF1ZXN0LCBtZXRob2QsIGNvbnRyb2wpOworICBpZiAocmVzIDwgMCkKKyAgICBnb3RvIHNlbmRfZXJyb3I7CisKKyAgcmVxdWVzdC50eXBlX2RhdGEucmVxdWVzdC52ZXJzaW9uID0gc3JjLT52ZXJzaW9uOworCisgIHJlcyA9IGdzdF9ydHNwc3JjX2Nvbm5lY3Rpb25fc2VuZCAoc3JjLCAmc3JjLT5jb25uaW5mbywgJnJlcXVlc3QsIE5VTEwpOworICBpZiAocmVzIDwgMCkKKyAgICBnb3RvIHNlbmRfZXJyb3I7CisKKyAgZ3N0X3J0c3BfY29ubmVjdGlvbl9yZXNldF90aW1lb3V0IChzcmMtPmNvbm5pbmZvLmNvbm5lY3Rpb24pOworICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVxdWVzdCk7CisKKyAgcmV0dXJuIEdTVF9SVFNQX09LOworCisgIC8qIEVSUk9SUyAqLworbm9fY29udHJvbDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAibm8gY29udHJvbCB1cmwgdG8gc2VuZCBrZWVwYWxpdmUiKTsKKyAgICByZXR1cm4gR1NUX1JUU1BfT0s7CisgIH0KK3NlbmRfZXJyb3I6CisgIHsKKyAgICBnY2hhciAqc3RyID0gZ3N0X3J0c3Bfc3RycmVzdWx0IChyZXMpOworCisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJnJlcXVlc3QpOworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNyYywgUkVTT1VSQ0UsIFdSSVRFLCAoTlVMTCksCisgICAgICAgICgiQ291bGQgbm90IHNlbmQga2VlcC1hbGl2ZS4gKCVzKSIsIHN0cikpOworICAgIGdfZnJlZSAoc3RyKTsKKyAgICByZXR1cm4gcmVzOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRzcHNyY19oYW5kbGVfZGF0YSAoR3N0UlRTUFNyYyAqIHNyYywgR3N0UlRTUE1lc3NhZ2UgKiBtZXNzYWdlKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBnaW50IGNoYW5uZWw7CisgIEdzdFJUU1BTdHJlYW0gKnN0cmVhbTsKKyAgR3N0UGFkICpvdXRwYWQgPSBOVUxMOworICBndWludDggKmRhdGE7CisgIGd1aW50IHNpemU7CisgIEdzdEJ1ZmZlciAqYnVmOworICBnYm9vbGVhbiBpc19ydGNwOworCisgIGNoYW5uZWwgPSBtZXNzYWdlLT50eXBlX2RhdGEuZGF0YS5jaGFubmVsOworCisgIHN0cmVhbSA9IGZpbmRfc3RyZWFtIChzcmMsICZjaGFubmVsLCAoZ3BvaW50ZXIpIGZpbmRfc3RyZWFtX2J5X2NoYW5uZWwpOworICBpZiAoIXN0cmVhbSkKKyAgICBnb3RvIHVua25vd25fc3RyZWFtOworCisgIGlmIChjaGFubmVsID09IHN0cmVhbS0+Y2hhbm5lbFswXSkgeworICAgIG91dHBhZCA9IHN0cmVhbS0+Y2hhbm5lbHBhZFswXTsKKyAgICBpc19ydGNwID0gRkFMU0U7CisgIH0gZWxzZSBpZiAoY2hhbm5lbCA9PSBzdHJlYW0tPmNoYW5uZWxbMV0pIHsKKyAgICBvdXRwYWQgPSBzdHJlYW0tPmNoYW5uZWxwYWRbMV07CisgICAgaXNfcnRjcCA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgaXNfcnRjcCA9IEZBTFNFOworICB9CisKKyAgLyogdGFrZSBhIGxvb2sgYXQgdGhlIGJvZHkgdG8gZmlndXJlIG91dCB3aGF0IHdlIGhhdmUgKi8KKyAgZ3N0X3J0c3BfbWVzc2FnZV9nZXRfYm9keSAobWVzc2FnZSwgJmRhdGEsICZzaXplKTsKKyAgaWYgKHNpemUgPCAyKQorICAgIGdvdG8gaW52YWxpZF9sZW5ndGg7CisKKyAgLyogY2hhbm5lbHMgYXJlIG5vdCBjb3JyZWN0IG9uIHNvbWUgc2VydmVycywgZG8gZXh0cmEgY2hlY2sgKi8KKyAgaWYgKGRhdGFbMV0gPj0gMjAwICYmIGRhdGFbMV0gPD0gMjA0KSB7CisgICAgLyogaG1tIFJUQ1AgbWVzc2FnZSBzd2l0Y2ggdG8gdGhlIFJUQ1AgcGFkIG9mIHRoZSBzYW1lIHN0cmVhbS4gKi8KKyAgICBvdXRwYWQgPSBzdHJlYW0tPmNoYW5uZWxwYWRbMV07CisgICAgaXNfcnRjcCA9IFRSVUU7CisgIH0KKworICAvKiB3ZSBoYXZlIG5vIGNsdWUgd2hhdCB0aGlzIGlzLCBqdXN0IGlnbm9yZSB0aGVuLiAqLworICBpZiAob3V0cGFkID09IE5VTEwpCisgICAgZ290byB1bmtub3duX3N0cmVhbTsKKworICAvKiB0YWtlIHRoZSBtZXNzYWdlIGJvZHkgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyAqLworICBnc3RfcnRzcF9tZXNzYWdlX3N0ZWFsX2JvZHkgKG1lc3NhZ2UsICZkYXRhLCAmc2l6ZSk7CisKKyAgLyogc3RyaXAgdGhlIHRyYWlsaW5nIFwwICovCisgIHNpemUgLT0gMTsKKworICBidWYgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgZ3N0X2J1ZmZlcl9hcHBlbmRfbWVtb3J5IChidWYsCisgICAgICBnc3RfbWVtb3J5X25ld193cmFwcGVkICgwLCBkYXRhLCBzaXplLCAwLCBzaXplLCBkYXRhLCBnX2ZyZWUpKTsKKworICAvKiBkb24ndCBuZWVkIG1lc3NhZ2UgYW55bW9yZSAqLworICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0IChtZXNzYWdlKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJwdXNoaW5nIGRhdGEgb2Ygc2l6ZSAlZCBvbiBjaGFubmVsICVkIiwgc2l6ZSwKKyAgICAgIGNoYW5uZWwpOworCisgIGlmIChzcmMtPm5lZWRfYWN0aXZhdGUpIHsKKyAgICBnY2hhciAqc3RyZWFtX2lkOworICAgIEdzdEV2ZW50ICpldmVudDsKKyAgICBHQ2hlY2tzdW0gKmNzOworICAgIGdjaGFyICp1cmk7CisgICAgR0xpc3QgKnN0cmVhbXM7CisgICAgZ3VpbnQgZ3JvdXBfaWQgPSBnc3RfdXRpbF9ncm91cF9pZF9uZXh0ICgpOworCisgICAgLyogZ2VuZXJhdGUgYW4gU0hBMjU2IHN1bSBvZiB0aGUgVVJJICovCisgICAgY3MgPSBnX2NoZWNrc3VtX25ldyAoR19DSEVDS1NVTV9TSEEyNTYpOworICAgIHVyaSA9IHNyYy0+Y29ubmluZm8ubG9jYXRpb247CisgICAgZ19jaGVja3N1bV91cGRhdGUgKGNzLCAoY29uc3QgZ3VjaGFyICopIHVyaSwgc3RybGVuICh1cmkpKTsKKworICAgIGZvciAoc3RyZWFtcyA9IHNyYy0+c3RyZWFtczsgc3RyZWFtczsgc3RyZWFtcyA9IGdfbGlzdF9uZXh0IChzdHJlYW1zKSkgeworICAgICAgR3N0UlRTUFN0cmVhbSAqb3N0cmVhbSA9IChHc3RSVFNQU3RyZWFtICopIHN0cmVhbXMtPmRhdGE7CisgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICBzdHJlYW1faWQgPQorICAgICAgICAgIGdfc3RyZHVwX3ByaW50ZiAoIiVzLyVkIiwgZ19jaGVja3N1bV9nZXRfc3RyaW5nIChjcyksIG9zdHJlYW0tPmlkKTsKKyAgICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKHN0cmVhbV9pZCk7CisgICAgICBnc3RfZXZlbnRfc2V0X2dyb3VwX2lkIChldmVudCwgZ3JvdXBfaWQpOworCisgICAgICBnX2ZyZWUgKHN0cmVhbV9pZCk7CisgICAgICBnc3RfcnRzcHNyY19zdHJlYW1fcHVzaF9ldmVudCAoc3JjLCBvc3RyZWFtLCBldmVudCk7CisKKyAgICAgIGlmICgoY2FwcyA9IHN0cmVhbV9nZXRfY2Fwc19mb3JfcHQgKG9zdHJlYW0sIG9zdHJlYW0tPmRlZmF1bHRfcHQpKSkgeworICAgICAgICAvKiBvbmx5IHN0cmVhbXMgdGhhdCBoYXZlIGEgY29ubmVjdGlvbiB0byB0aGUgb3V0c2lkZSB3b3JsZCAqLworICAgICAgICBpZiAob3N0cmVhbS0+c2V0dXApIHsKKyAgICAgICAgICBpZiAob3N0cmVhbS0+dWRwc3JjWzBdKSB7CisgICAgICAgICAgICBnc3RfZWxlbWVudF9zZW5kX2V2ZW50IChvc3RyZWFtLT51ZHBzcmNbMF0sCisgICAgICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSk7CisgICAgICAgICAgfSBlbHNlIGlmIChvc3RyZWFtLT5jaGFubmVscGFkWzBdKSB7CisgICAgICAgICAgICBpZiAoR1NUX1BBRF9JU19TUkMgKG9zdHJlYW0tPmNoYW5uZWxwYWRbMF0pKQorICAgICAgICAgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKG9zdHJlYW0tPmNoYW5uZWxwYWRbMF0sCisgICAgICAgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X2NhcHMgKGNhcHMpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZ3N0X3BhZF9zZW5kX2V2ZW50IChvc3RyZWFtLT5jaGFubmVscGFkWzBdLAorICAgICAgICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSk7CisgICAgICAgICAgfQorICAgICAgICAgIG9zdHJlYW0tPm5lZWRfY2FwcyA9IEZBTFNFOworCisgICAgICAgICAgaWYgKG9zdHJlYW0tPnByb2ZpbGUgPT0gR1NUX1JUU1BfUFJPRklMRV9TQVZQIHx8CisgICAgICAgICAgICAgIG9zdHJlYW0tPnByb2ZpbGUgPT0gR1NUX1JUU1BfUFJPRklMRV9TQVZQRikKKyAgICAgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXBwbGljYXRpb24veC1zcnRjcCIpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXBwbGljYXRpb24veC1ydGNwIik7CisKKyAgICAgICAgICBpZiAob3N0cmVhbS0+dWRwc3JjWzFdKSB7CisgICAgICAgICAgICBnc3RfZWxlbWVudF9zZW5kX2V2ZW50IChvc3RyZWFtLT51ZHBzcmNbMV0sCisgICAgICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSk7CisgICAgICAgICAgfSBlbHNlIGlmIChvc3RyZWFtLT5jaGFubmVscGFkWzFdKSB7CisgICAgICAgICAgICBpZiAoR1NUX1BBRF9JU19TUkMgKG9zdHJlYW0tPmNoYW5uZWxwYWRbMV0pKQorICAgICAgICAgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKG9zdHJlYW0tPmNoYW5uZWxwYWRbMV0sCisgICAgICAgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X2NhcHMgKGNhcHMpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZ3N0X3BhZF9zZW5kX2V2ZW50IChvc3RyZWFtLT5jaGFubmVscGFkWzFdLAorICAgICAgICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGdfY2hlY2tzdW1fZnJlZSAoY3MpOworCisgICAgZ3N0X3J0c3BzcmNfYWN0aXZhdGVfc3RyZWFtcyAoc3JjKTsKKyAgICBzcmMtPm5lZWRfYWN0aXZhdGUgPSBGQUxTRTsKKyAgICBzcmMtPm5lZWRfc2VnbWVudCA9IFRSVUU7CisgIH0KKworICBpZiAoc3JjLT5iYXNlX3RpbWUgPT0gLTEpIHsKKyAgICAvKiBUYWtlIGN1cnJlbnQgcnVubmluZ190aW1lLiBUaGlzIHRpbWVzdGFtcCB3aWxsIGJlIHB1dCBvbgorICAgICAqIHRoZSBmaXJzdCBidWZmZXIgb2YgZWFjaCBzdHJlYW0gYmVjYXVzZSB3ZSBhcmUgYSBsaXZlIHNvdXJjZSBhbmQgc28gd2UKKyAgICAgKiB0aW1lc3RhbXAgd2l0aCB0aGUgcnVubmluZ190aW1lLiBXaGVuIHdlIGFyZSBkZWFsaW5nIHdpdGggVENQLCB3ZSBhbHNvCisgICAgICogb25seSB0aW1lc3RhbXAgdGhlIGZpcnN0IGJ1ZmZlciAodXNpbmcgdGhlIERJU0NPTlQgZmxhZykgYmVjYXVzZSBhIHNlcnZlcgorICAgICAqIHR5cGljYWxseSBidXJzdHMgZGF0YSwgZm9yIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8gY29tcGVuc2F0ZSBieSBzcGVlZGluZworICAgICAqIHVwIHRoZSBtZWRpYS4gVGhlIG90aGVyIHRpbWVzdGFtcHMgd2lsbCBiZSBpbnRlcnBvbGxhdGVkIGZyb20gdGhpcyBvbmUKKyAgICAgKiB1c2luZyB0aGUgUlRQIHRpbWVzdGFtcHMuICovCisgICAgR1NUX09CSkVDVF9MT0NLIChzcmMpOworICAgIGlmIChHU1RfRUxFTUVOVF9DTE9DSyAoc3JjKSkgeworICAgICAgR3N0Q2xvY2tUaW1lIG5vdzsKKyAgICAgIEdzdENsb2NrVGltZSBiYXNlX3RpbWU7CisKKyAgICAgIG5vdyA9IGdzdF9jbG9ja19nZXRfdGltZSAoR1NUX0VMRU1FTlRfQ0xPQ0sgKHNyYykpOworICAgICAgYmFzZV90aW1lID0gR1NUX0VMRU1FTlRfQ0FTVCAoc3JjKS0+YmFzZV90aW1lOworCisgICAgICBzcmMtPmJhc2VfdGltZSA9IG5vdyAtIGJhc2VfdGltZTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZmlyc3QgYnVmZmVyIGF0IHRpbWUgJSIgR1NUX1RJTUVfRk9STUFUICIsIGJhc2UgJSIKKyAgICAgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKG5vdyksIEdTVF9USU1FX0FSR1MgKGJhc2VfdGltZSkpOworICAgIH0KKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc3JjKTsKKyAgfQorCisgIC8qIElmIG5lZWRlZCBzZW5kIGEgbmV3IHNlZ21lbnQsIGRvbid0IGZvcmdldCB3ZSBhcmUgbGl2ZSBhbmQgYnVmZmVyIGFyZQorICAgKiB0aW1lc3RhbXBlZCB3aXRoIHJ1bm5pbmcgdGltZSAqLworICBpZiAoc3JjLT5uZWVkX3NlZ21lbnQpIHsKKyAgICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgICAgc3JjLT5uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKyAgICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgICBnc3RfcnRzcHNyY19wdXNoX2V2ZW50IChzcmMsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKyAgfQorCisgIGlmIChzdHJlYW0tPm5lZWRfY2FwcykgeworICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICBpZiAoKGNhcHMgPSBzdHJlYW1fZ2V0X2NhcHNfZm9yX3B0IChzdHJlYW0sIHN0cmVhbS0+ZGVmYXVsdF9wdCkpKSB7CisgICAgICAvKiBvbmx5IHN0cmVhbXMgdGhhdCBoYXZlIGEgY29ubmVjdGlvbiB0byB0aGUgb3V0c2lkZSB3b3JsZCAqLworICAgICAgaWYgKHN0cmVhbS0+c2V0dXApIHsKKyAgICAgICAgLyogT25seSBuZWVkIHRvIHVwZGF0ZSB0aGUgVENQIGNhcHMgaGVyZSwgVURQIGlzIGFscmVhZHkgaGFuZGxlZCAqLworICAgICAgICBpZiAoc3RyZWFtLT5jaGFubmVscGFkWzBdKSB7CisgICAgICAgICAgaWYgKEdTVF9QQURfSVNfU1JDIChzdHJlYW0tPmNoYW5uZWxwYWRbMF0pKQorICAgICAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzdHJlYW0tPmNoYW5uZWxwYWRbMF0sCisgICAgICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZ3N0X3BhZF9zZW5kX2V2ZW50IChzdHJlYW0tPmNoYW5uZWxwYWRbMF0sCisgICAgICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSk7CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtLT5uZWVkX2NhcHMgPSBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdHJlYW0tPm5lZWRfY2FwcyA9IEZBTFNFOworICB9CisKKyAgaWYgKHN0cmVhbS0+ZGlzY29udCAmJiAhaXNfcnRjcCkgeworICAgIC8qIG1hcmsgZmlyc3QgUlRQIGJ1ZmZlciBhcyBkaXNjb250ICovCisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgc3RyZWFtLT5kaXNjb250ID0gRkFMU0U7CisgICAgLyogZmlyc3QgYnVmZmVyIGdldHMgdGhlIHRpbWVzdGFtcCwgb3RoZXIgYnVmZmVycyBhcmUgbm90IHRpbWVzdGFtcGVkIGFuZAorICAgICAqIHRoZWlyIHByZXNlbnRhdGlvbiB0aW1lIHdpbGwgYmUgaW50ZXJwb2xsYXRlZCBmcm9tIHRoZSBydHAgdGltZXN0YW1wcy4gKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzZXR0aW5nIHRpbWVzdGFtcCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHNyYy0+YmFzZV90aW1lKSk7CisKKyAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKSA9IHNyYy0+YmFzZV90aW1lOworICB9CisKKyAgLyogY2hhaW4gdG8gdGhlIHBlZXIgcGFkICovCisgIGlmIChHU1RfUEFEX0lTX1NJTksgKG91dHBhZCkpCisgICAgcmV0ID0gZ3N0X3BhZF9jaGFpbiAob3V0cGFkLCBidWYpOworICBlbHNlCisgICAgcmV0ID0gZ3N0X3BhZF9wdXNoIChvdXRwYWQsIGJ1Zik7CisKKyAgaWYgKCFpc19ydGNwKSB7CisgICAgLyogY29tYmluZSBhbGwgc3RyZWFtIGZsb3dzIGZvciB0aGUgZGF0YSB0cmFuc3BvcnQgKi8KKyAgICByZXQgPSBnc3RfcnRzcHNyY19jb21iaW5lX2Zsb3dzIChzcmMsIHN0cmVhbSwgcmV0KTsKKyAgfQorICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLwordW5rbm93bl9zdHJlYW06CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJ1bmtub3duIHN0cmVhbSBvbiBjaGFubmVsICVkLCBpZ25vcmVkIiwgY2hhbm5lbCk7CisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAobWVzc2FnZSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CitpbnZhbGlkX2xlbmd0aDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNyYywgUkVTT1VSQ0UsIFJFQUQsIChOVUxMKSwKKyAgICAgICAgKCJTaG9ydCBtZXNzYWdlIHJlY2VpdmVkLCBpZ25vcmluZy4iKSk7CisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAobWVzc2FnZSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkIChHc3RSVFNQU3JjICogc3JjKQoreworICBHc3RSVFNQTWVzc2FnZSBtZXNzYWdlID0geyAwIH07CisgIEdzdFJUU1BSZXN1bHQgcmVzOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHVGltZVZhbCB0dl90aW1lb3V0OworCisgIHdoaWxlIChUUlVFKSB7CisgICAgLyogZ2V0IHRoZSBuZXh0IHRpbWVvdXQgaW50ZXJ2YWwgKi8KKyAgICBnc3RfcnRzcF9jb25uZWN0aW9uX25leHRfdGltZW91dCAoc3JjLT5jb25uaW5mby5jb25uZWN0aW9uLCAmdHZfdGltZW91dCk7CisKKyAgICAvKiBzZWUgaWYgdGhlIHRpbWVvdXQgcGVyaW9kIGV4cGlyZWQgKi8KKyAgICBpZiAoKHR2X3RpbWVvdXQudHZfc2VjIHwgdHZfdGltZW91dC50dl91c2VjKSA9PSAwKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJ0aW1vdXQsIHNlbmRpbmcga2VlcC1hbGl2ZSIpOworICAgICAgLyogc2VuZCBrZWVwLWFsaXZlLCBvbmx5IGFjdCBvbiBpbnRlcnJ1cHQsIGEgd2FybmluZyB3aWxsIGJlIHBvc3RlZCBmb3IKKyAgICAgICAqIG90aGVyIGVycm9ycy4gKi8KKyAgICAgIGlmICgocmVzID0gZ3N0X3J0c3BzcmNfc2VuZF9rZWVwX2FsaXZlIChzcmMpKSA9PSBHU1RfUlRTUF9FSU5UUikKKyAgICAgICAgZ290byBpbnRlcnJ1cHQ7CisgICAgICAvKiBnZXQgbmV3IHRpbWVvdXQgKi8KKyAgICAgIGdzdF9ydHNwX2Nvbm5lY3Rpb25fbmV4dF90aW1lb3V0IChzcmMtPmNvbm5pbmZvLmNvbm5lY3Rpb24sICZ0dl90aW1lb3V0KTsKKyAgICB9CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJkb2luZyByZWNlaXZlIHdpdGggdGltZW91dCAlbGQgc2Vjb25kcywgJWxkIHVzZWMiLAorICAgICAgICB0dl90aW1lb3V0LnR2X3NlYywgdHZfdGltZW91dC50dl91c2VjKTsKKworICAgIC8qIHByb3RlY3QgdGhlIGNvbm5lY3Rpb24gd2l0aCB0aGUgY29ubmVjdGlvbiBsb2NrIHNvIHRoYXQgd2UgY2FuIHNlZSB3aGVuCisgICAgICogd2UgYXJlIGZpbmlzaGVkIGRvaW5nIHNlcnZlciBjb21tdW5pY2F0aW9uICovCisgICAgcmVzID0KKyAgICAgICAgZ3N0X3J0c3BzcmNfY29ubmVjdGlvbl9yZWNlaXZlIChzcmMsICZzcmMtPmNvbm5pbmZvLAorICAgICAgICAmbWVzc2FnZSwgc3JjLT5wdGNwX3RpbWVvdXQpOworCisgICAgc3dpdGNoIChyZXMpIHsKKyAgICAgIGNhc2UgR1NUX1JUU1BfT0s6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIndlIHJlY2VpdmVkIGEgc2VydmVyIG1lc3NhZ2UiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9SVFNQX0VJTlRSOgorICAgICAgICAvKiB3ZSBnb3QgaW50ZXJydXB0ZWQgdGhpcyBtZWFucyB3ZSBuZWVkIHRvIHN0b3AgKi8KKyAgICAgICAgZ290byBpbnRlcnJ1cHQ7CisgICAgICBjYXNlIEdTVF9SVFNQX0VUSU1FT1VUOgorICAgICAgICAvKiBubyByZXBseSwgc2VuZCBrZWVwIGFsaXZlICovCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInRpbWVvdXQsIHNlbmRpbmcga2VlcC1hbGl2ZSIpOworICAgICAgICBpZiAoKHJlcyA9IGdzdF9ydHNwc3JjX3NlbmRfa2VlcF9hbGl2ZSAoc3JjKSkgPT0gR1NUX1JUU1BfRUlOVFIpCisgICAgICAgICAgZ290byBpbnRlcnJ1cHQ7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgY2FzZSBHU1RfUlRTUF9FRU9GOgorICAgICAgICAvKiBnbyBFT1Mgd2hlbiB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiAqLworICAgICAgICBnb3RvIHNlcnZlcl9lb2Y7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIHJlY2VpdmVfZXJyb3I7CisgICAgfQorCisgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHsKKyAgICAgIGNhc2UgR1NUX1JUU1BfTUVTU0FHRV9SRVFVRVNUOgorICAgICAgICAvKiBzZXJ2ZXIgc2VuZHMgdXMgYSByZXF1ZXN0IG1lc3NhZ2UsIGhhbmRsZSBpdCAqLworICAgICAgICByZXMgPSBnc3RfcnRzcHNyY19oYW5kbGVfcmVxdWVzdCAoc3JjLCAmc3JjLT5jb25uaW5mbywgJm1lc3NhZ2UpOworICAgICAgICBpZiAocmVzID09IEdTVF9SVFNQX0VFT0YpCisgICAgICAgICAgZ290byBzZXJ2ZXJfZW9mOworICAgICAgICBlbHNlIGlmIChyZXMgPCAwKQorICAgICAgICAgIGdvdG8gaGFuZGxlX3JlcXVlc3RfZmFpbGVkOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1JUU1BfTUVTU0FHRV9SRVNQT05TRToKKyAgICAgICAgLyogd2UgaWdub3JlIHJlc3BvbnNlIG1lc3NhZ2VzICovCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImlnbm9yaW5nIHJlc3BvbnNlIG1lc3NhZ2UiKTsKKyAgICAgICAgREVCVUdfUlRTUCAoc3JjLCAmbWVzc2FnZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfUlRTUF9NRVNTQUdFX0RBVEE6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImdvdCBkYXRhIG1lc3NhZ2UiKTsKKyAgICAgICAgcmV0ID0gZ3N0X3J0c3BzcmNfaGFuZGxlX2RhdGEgKHNyYywgJm1lc3NhZ2UpOworICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGdvdG8gaGFuZGxlX2RhdGFfZmFpbGVkOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiaWdub3JpbmcgdW5rbm93biBtZXNzYWdlIHR5cGUgJWQiLAorICAgICAgICAgICAgbWVzc2FnZS50eXBlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworCisgIC8qIEVSUk9SUyAqLworc2VydmVyX2VvZjoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIndlIGdvdCBhbiBlb2YgZnJvbSB0aGUgc2VydmVyIik7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoc3JjLCBSRVNPVVJDRSwgUkVBRCwgKE5VTEwpLAorICAgICAgICAoIlRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uLiIpKTsKKyAgICBzcmMtPmNvbm5pbmZvLmNvbm5lY3RlZCA9IEZBTFNFOworICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZtZXNzYWdlKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRU9TOworICB9CitpbnRlcnJ1cHQ6CisgIHsKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmbWVzc2FnZSk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZ290IGludGVycnVwdGVkIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICB9CityZWNlaXZlX2Vycm9yOgorICB7CisgICAgZ2NoYXIgKnN0ciA9IGdzdF9ydHNwX3N0cnJlc3VsdCAocmVzKTsKKworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBSRUFELCAoTlVMTCksCisgICAgICAgICgiQ291bGQgbm90IHJlY2VpdmUgbWVzc2FnZS4gKCVzKSIsIHN0cikpOworICAgIGdfZnJlZSAoc3RyKTsKKworICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZtZXNzYWdlKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2hhbmRsZV9yZXF1ZXN0X2ZhaWxlZDoKKyAgeworICAgIGdjaGFyICpzdHIgPSBnc3RfcnRzcF9zdHJyZXN1bHQgKHJlcyk7CisKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgV1JJVEUsIChOVUxMKSwKKyAgICAgICAgKCJDb3VsZCBub3QgaGFuZGxlIHNlcnZlciBtZXNzYWdlLiAoJXMpIiwgc3RyKSk7CisgICAgZ19mcmVlIChzdHIpOworICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZtZXNzYWdlKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2hhbmRsZV9kYXRhX2ZhaWxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNvdWxkIG5vIGhhbmRsZSBkYXRhIG1lc3NhZ2UiKTsKKyAgICByZXR1cm4gcmV0OworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRzcHNyY19sb29wX3VkcCAoR3N0UlRTUFNyYyAqIHNyYykKK3sKKyAgR3N0UlRTUFJlc3VsdCByZXM7CisgIEdzdFJUU1BNZXNzYWdlIG1lc3NhZ2UgPSB7IDAgfTsKKyAgZ2ludCByZXRyeSA9IDA7CisKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBHVGltZVZhbCB0dl90aW1lb3V0OworCisgICAgLyogZ2V0IHRoZSBuZXh0IHRpbWVvdXQgaW50ZXJ2YWwgKi8KKyAgICBnc3RfcnRzcF9jb25uZWN0aW9uX25leHRfdGltZW91dCAoc3JjLT5jb25uaW5mby5jb25uZWN0aW9uLCAmdHZfdGltZW91dCk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJkb2luZyByZWNlaXZlIHdpdGggdGltZW91dCAlZCBzZWNvbmRzIiwKKyAgICAgICAgKGdpbnQpIHR2X3RpbWVvdXQudHZfc2VjKTsKKworICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZtZXNzYWdlKTsKKworICAgIC8qIHdlIHNob3VsZCBjb250aW51ZSByZWFkaW5nIHRoZSBUQ1Agc29ja2V0IGJlY2F1c2UgdGhlIHNlcnZlciBtaWdodAorICAgICAqIHNlbmQgdXMgcmVxdWVzdHMuIFdoZW4gdGhlIHNlc3Npb24gdGltZW91dCBleHBpcmVzLCB3ZSBuZWVkIHRvIHNlbmQgYQorICAgICAqIGtlZXAtYWxpdmUgcmVxdWVzdCB0byBrZWVwIHRoZSBzZXNzaW9uIG9wZW4uICovCisgICAgcmVzID0gZ3N0X3J0c3BzcmNfY29ubmVjdGlvbl9yZWNlaXZlIChzcmMsICZzcmMtPmNvbm5pbmZvLAorICAgICAgICAmbWVzc2FnZSwgJnR2X3RpbWVvdXQpOworCisgICAgc3dpdGNoIChyZXMpIHsKKyAgICAgIGNhc2UgR1NUX1JUU1BfT0s6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIndlIHJlY2VpdmVkIGEgc2VydmVyIG1lc3NhZ2UiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9SVFNQX0VJTlRSOgorICAgICAgICAvKiB3ZSBnb3QgaW50ZXJydXB0ZWQsIHNlZSB3aGF0IHdlIGhhdmUgdG8gZG8gKi8KKyAgICAgICAgZ290byBpbnRlcnJ1cHQ7CisgICAgICBjYXNlIEdTVF9SVFNQX0VUSU1FT1VUOgorICAgICAgICAvKiBzZW5kIGtlZXAtYWxpdmUsIGlnbm9yZSB0aGUgcmVzdWx0LCBhIHdhcm5pbmcgd2lsbCBiZSBwb3N0ZWQuICovCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInRpbWVvdXQsIHNlbmRpbmcga2VlcC1hbGl2ZSIpOworICAgICAgICBpZiAoKHJlcyA9IGdzdF9ydHNwc3JjX3NlbmRfa2VlcF9hbGl2ZSAoc3JjKSkgPT0gR1NUX1JUU1BfRUlOVFIpCisgICAgICAgICAgZ290byBpbnRlcnJ1cHQ7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgY2FzZSBHU1RfUlRTUF9FRU9GOgorICAgICAgICAvKiBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uLiBub3QgdmVyeSBmYXRhbCBmb3IgVURQLCByZWNvbm5lY3QgYW5kCisgICAgICAgICAqIHNlZSB3aGF0IGhhcHBlbnMuICovCisgICAgICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNyYywgUkVTT1VSQ0UsIFJFQUQsIChOVUxMKSwKKyAgICAgICAgICAgICgiVGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24uIikpOworICAgICAgICBpZiAoc3JjLT51ZHBfcmVjb25uZWN0KSB7CisgICAgICAgICAgaWYgKChyZXMgPQorICAgICAgICAgICAgICAgICAgZ3N0X3J0c3BfY29ubmluZm9fcmVjb25uZWN0IChzcmMsICZzcmMtPmNvbm5pbmZvLCBGQUxTRSkpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gY29ubmVjdF9lcnJvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIHNlcnZlcl9lb2Y7CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICBjYXNlIEdTVF9SVFNQX0VORVQ6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIkFuIGV0aGVybmV0IHByb2JsZW0gb2NjdXJlZC4iKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNyYywgUkVTT1VSQ0UsIFJFQUQsIChOVUxMKSwKKyAgICAgICAgICAgICgiVW5oYW5kbGVkIHJldHVybiB2YWx1ZSAlZC4iLCByZXMpKTsKKyAgICAgICAgZ290byByZWNlaXZlX2Vycm9yOworICAgIH0KKworICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7CisgICAgICBjYXNlIEdTVF9SVFNQX01FU1NBR0VfUkVRVUVTVDoKKyAgICAgICAgLyogc2VydmVyIHNlbmRzIHVzIGEgcmVxdWVzdCBtZXNzYWdlLCBoYW5kbGUgaXQgKi8KKyAgICAgICAgcmVzID0gZ3N0X3J0c3BzcmNfaGFuZGxlX3JlcXVlc3QgKHNyYywgJnNyYy0+Y29ubmluZm8sICZtZXNzYWdlKTsKKyAgICAgICAgaWYgKHJlcyA9PSBHU1RfUlRTUF9FRU9GKQorICAgICAgICAgIGdvdG8gc2VydmVyX2VvZjsKKyAgICAgICAgZWxzZSBpZiAocmVzIDwgMCkKKyAgICAgICAgICBnb3RvIGhhbmRsZV9yZXF1ZXN0X2ZhaWxlZDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9SVFNQX01FU1NBR0VfUkVTUE9OU0U6CisgICAgICAgIC8qIHdlIGlnbm9yZSByZXNwb25zZSBhbmQgZGF0YSBtZXNzYWdlcyAqLworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJpZ25vcmluZyByZXNwb25zZSBtZXNzYWdlIik7CisgICAgICAgIERFQlVHX1JUU1AgKHNyYywgJm1lc3NhZ2UpOworICAgICAgICBpZiAobWVzc2FnZS50eXBlX2RhdGEucmVzcG9uc2UuY29kZSA9PSBHU1RfUlRTUF9TVFNfVU5BVVRIT1JJWkVEKSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiYnV0IGlzIFVuYXV0aG9yaXplZCByZXNwb25zZSAuLi4iKTsKKyAgICAgICAgICBpZiAoZ3N0X3J0c3BzcmNfc2V0dXBfYXV0aCAoc3JjLCAmbWVzc2FnZSkgJiYgIShyZXRyeSsrKSkgeworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic28gcmV0cnlpbmcga2VlcC1hbGl2ZSIpOworICAgICAgICAgICAgaWYgKChyZXMgPSBnc3RfcnRzcHNyY19zZW5kX2tlZXBfYWxpdmUgKHNyYykpID09IEdTVF9SVFNQX0VJTlRSKQorICAgICAgICAgICAgICBnb3RvIGludGVycnVwdDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0cnkgPSAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfUlRTUF9NRVNTQUdFX0RBVEE6CisgICAgICAgIC8qIHdlIGlnbm9yZSByZXNwb25zZSBhbmQgZGF0YSBtZXNzYWdlcyAqLworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJpZ25vcmluZyBkYXRhIG1lc3NhZ2UiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgImlnbm9yaW5nIHVua25vd24gbWVzc2FnZSB0eXBlICVkIiwKKyAgICAgICAgICAgIG1lc3NhZ2UudHlwZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKworICAvKiB3ZSBnZXQgaGVyZSB3aGVuIHRoZSBjb25uZWN0aW9uIGdvdCBpbnRlcnJ1cHRlZCAqLworaW50ZXJydXB0OgorICB7CisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJm1lc3NhZ2UpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImdvdCBpbnRlcnJ1cHRlZCIpOworICAgIHJldHVybiBHU1RfRkxPV19GTFVTSElORzsKKyAgfQorY29ubmVjdF9lcnJvcjoKKyAgeworICAgIGdjaGFyICpzdHIgPSBnc3RfcnRzcF9zdHJyZXN1bHQgKHJlcyk7CisgICAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgICBzcmMtPmNvbm5pbmZvLmNvbm5lY3RlZCA9IEZBTFNFOworICAgIGlmIChyZXMgIT0gR1NUX1JUU1BfRUlOVFIpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBPUEVOX1JFQURfV1JJVEUsIChOVUxMKSwKKyAgICAgICAgICAoIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlci4gKCVzKSIsIHN0cikpOworICAgICAgZ19mcmVlIChzdHIpOworICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldCA9IEdTVF9GTE9XX0ZMVVNISU5HOworICAgIH0KKyAgICByZXR1cm4gcmV0OworICB9CityZWNlaXZlX2Vycm9yOgorICB7CisgICAgZ2NoYXIgKnN0ciA9IGdzdF9ydHNwX3N0cnJlc3VsdCAocmVzKTsKKworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBSRUFELCAoTlVMTCksCisgICAgICAgICgiQ291bGQgbm90IHJlY2VpdmUgbWVzc2FnZS4gKCVzKSIsIHN0cikpOworICAgIGdfZnJlZSAoc3RyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2hhbmRsZV9yZXF1ZXN0X2ZhaWxlZDoKKyAgeworICAgIGdjaGFyICpzdHIgPSBnc3RfcnRzcF9zdHJyZXN1bHQgKHJlcyk7CisgICAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmbWVzc2FnZSk7CisgICAgaWYgKHJlcyAhPSBHU1RfUlRTUF9FSU5UUikgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIFdSSVRFLCAoTlVMTCksCisgICAgICAgICAgKCJDb3VsZCBub3QgaGFuZGxlIHNlcnZlciBtZXNzYWdlLiAoJXMpIiwgc3RyKSk7CisgICAgICBnX2ZyZWUgKHN0cik7CisgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0ID0gR1NUX0ZMT1dfRkxVU0hJTkc7CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0KK3NlcnZlcl9lb2Y6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJ3ZSBnb3QgYW4gZW9mIGZyb20gdGhlIHNlcnZlciIpOworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNyYywgUkVTT1VSQ0UsIFJFQUQsIChOVUxMKSwKKyAgICAgICAgKCJUaGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbi4iKSk7CisgICAgc3JjLT5jb25uaW5mby5jb25uZWN0ZWQgPSBGQUxTRTsKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmbWVzc2FnZSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VPUzsKKyAgfQorfQorCitzdGF0aWMgR3N0UlRTUFJlc3VsdAorZ3N0X3J0c3BzcmNfcmVjb25uZWN0IChHc3RSVFNQU3JjICogc3JjLCBnYm9vbGVhbiBhc3luYykKK3sKKyAgR3N0UlRTUFJlc3VsdCByZXMgPSBHU1RfUlRTUF9PSzsKKyAgZ2Jvb2xlYW4gcmVzdGFydDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJkb2luZyByZWNvbm5lY3QiKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHNyYyk7CisgIC8qIG9ubHkgcmVzdGFydCB3aGVuIHRoZSBwYWRzIHdlcmUgbm90IHlldCBhY3RpdmF0ZWQsIGVsc2Ugd2Ugd2VyZQorICAgKiBzdHJlYW1pbmcgb3ZlciBVRFAgKi8KKyAgcmVzdGFydCA9IHNyYy0+bmVlZF9hY3RpdmF0ZTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7CisKKyAgLyogbm8gbmVlZCB0byByZXN0YXJ0LCB3ZSdyZSBkb25lICovCisgIGlmICghcmVzdGFydCkKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogd2UgY2FuIHRyeSBvbmx5IFRDUCBub3cgKi8KKyAgc3JjLT5jdXJfcHJvdG9jb2xzID0gR1NUX1JUU1BfTE9XRVJfVFJBTlNfVENQOworCisgIC8qIGNsb3NlIGFuZCBjbGVhbnVwIG91ciBzdGF0ZSAqLworICBpZiAoKHJlcyA9IGdzdF9ydHNwc3JjX2Nsb3NlIChzcmMsIGFzeW5jLCBGQUxTRSkpIDwgMCkKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogc2VlIGlmIHdlIGhhdmUgVENQIGxlZnQgdG8gdHJ5LiBBbHNvIGRvbid0IHRyeSBUQ1Agd2hlbiB3ZSB3ZXJlIGNvbmZpZ3VyZWQKKyAgICogd2l0aCBhbiBTRFAuICovCisgIGlmICghKHNyYy0+cHJvdG9jb2xzICYgR1NUX1JUU1BfTE9XRVJfVFJBTlNfVENQKSB8fCBzcmMtPmZyb21fc2RwKQorICAgIGdvdG8gbm9fcHJvdG9jb2xzOworCisgIC8qIFdlIHBvc3QgYSB3YXJuaW5nIG1lc3NhZ2Ugbm93IHRvIGluZm9ybSB0aGUgdXNlcgorICAgKiB0aGF0IG5vdGhpbmcgaGFwcGVuZWQuIEl0J3MgbW9zdCBsaWtlbHkgYSBmaXJld2FsbCB0aGluZy4gKi8KKyAgR1NUX0VMRU1FTlRfV0FSTklORyAoc3JjLCBSRVNPVVJDRSwgUkVBRCwgKE5VTEwpLAorICAgICAgKCJDb3VsZCBub3QgcmVjZWl2ZSBhbnkgVURQIHBhY2tldHMgZm9yICUuNGYgc2Vjb25kcywgbWF5YmUgeW91ciAiCisgICAgICAgICAgImZpcmV3YWxsIGlzIGJsb2NraW5nIGl0LiBSZXRyeWluZyB1c2luZyBhIHRjcCBjb25uZWN0aW9uLiIsCisgICAgICAgICAgZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSAoc3JjLT51ZHBfdGltZW91dCkgLyAxMDAwMDAwLjApKTsKKworICAvKiBvcGVuIG5ldyBjb25uZWN0aW9uIHVzaW5nIHRjcCAqLworICBpZiAoZ3N0X3J0c3BzcmNfb3BlbiAoc3JjLCBhc3luYykgPCAwKQorICAgIGdvdG8gb3Blbl9mYWlsZWQ7CisKKyAgLyogc3RhcnQgcGxheWJhY2sgKi8KKyAgaWYgKGdzdF9ydHNwc3JjX3BsYXkgKHNyYywgJnNyYy0+c2VnbWVudCwgYXN5bmMsIE5VTEwpIDwgMCkKKyAgICBnb3RvIHBsYXlfZmFpbGVkOworCitkb25lOgorICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworbm9fcHJvdG9jb2xzOgorICB7CisgICAgc3JjLT5jdXJfcHJvdG9jb2xzID0gMDsKKyAgICAvKiBubyB0cmFuc3BvcnQgcG9zc2libGUsIHBvc3QgYW4gZXJyb3IgYW5kIHN0b3AgKi8KKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgUkVBRCwgKE5VTEwpLAorICAgICAgICAoIkNvdWxkIG5vdCByZWNlaXZlIGFueSBVRFAgcGFja2V0cyBmb3IgJS40ZiBzZWNvbmRzLCBtYXliZSB5b3VyICIKKyAgICAgICAgICAgICJmaXJld2FsbCBpcyBibG9ja2luZyBpdC4gTm8gb3RoZXIgcHJvdG9jb2xzIHRvIHRyeS4iLAorICAgICAgICAgICAgZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSAoc3JjLT51ZHBfdGltZW91dCkgLyAxMDAwMDAwLjApKTsKKyAgICByZXR1cm4gR1NUX1JUU1BfRVJST1I7CisgIH0KK29wZW5fZmFpbGVkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAib3BlbiBmYWlsZWQiKTsKKyAgICByZXR1cm4gR1NUX1JUU1BfT0s7CisgIH0KK3BsYXlfZmFpbGVkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicGxheSBmYWlsZWQiKTsKKyAgICByZXR1cm4gR1NUX1JUU1BfT0s7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX2xvb3Bfc3RhcnRfY21kIChHc3RSVFNQU3JjICogc3JjLCBnaW50IGNtZCkKK3sKKyAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIENNRF9PUEVOOgorICAgICAgR1NUX0VMRU1FTlRfUFJPR1JFU1MgKHNyYywgU1RBUlQsICJvcGVuIiwgKCJPcGVuaW5nIFN0cmVhbSIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX1BMQVk6CisgICAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBTVEFSVCwgInJlcXVlc3QiLCAoIlNlbmRpbmcgUExBWSByZXF1ZXN0IikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfUEFVU0U6CisgICAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBTVEFSVCwgInJlcXVlc3QiLCAoIlNlbmRpbmcgUEFVU0UgcmVxdWVzdCIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0NMT1NFOgorICAgICAgR1NUX0VMRU1FTlRfUFJPR1JFU1MgKHNyYywgU1RBUlQsICJjbG9zZSIsICgiQ2xvc2luZyBTdHJlYW0iKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX2xvb3BfY29tcGxldGVfY21kIChHc3RSVFNQU3JjICogc3JjLCBnaW50IGNtZCkKK3sKKyAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIENNRF9PUEVOOgorICAgICAgR1NUX0VMRU1FTlRfUFJPR1JFU1MgKHNyYywgQ09NUExFVEUsICJvcGVuIiwgKCJPcGVuZWQgU3RyZWFtIikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfUExBWToKKyAgICAgIEdTVF9FTEVNRU5UX1BST0dSRVNTIChzcmMsIENPTVBMRVRFLCAicmVxdWVzdCIsICgiU2VudCBQTEFZIHJlcXVlc3QiKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9QQVVTRToKKyAgICAgIEdTVF9FTEVNRU5UX1BST0dSRVNTIChzcmMsIENPTVBMRVRFLCAicmVxdWVzdCIsICgiU2VudCBQQVVTRSByZXF1ZXN0IikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfQ0xPU0U6CisgICAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBDT01QTEVURSwgImNsb3NlIiwgKCJDbG9zZWQgU3RyZWFtIikpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY19sb29wX2NhbmNlbF9jbWQgKEdzdFJUU1BTcmMgKiBzcmMsIGdpbnQgY21kKQoreworICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgQ01EX09QRU46CisgICAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBDQU5DRUxFRCwgIm9wZW4iLCAoIk9wZW4gY2FuY2VsZWQiKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9QTEFZOgorICAgICAgR1NUX0VMRU1FTlRfUFJPR1JFU1MgKHNyYywgQ0FOQ0VMRUQsICJyZXF1ZXN0IiwgKCJQTEFZIGNhbmNlbGVkIikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfUEFVU0U6CisgICAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBDQU5DRUxFRCwgInJlcXVlc3QiLCAoIlBBVVNFIGNhbmNlbGVkIikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfQ0xPU0U6CisgICAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBDQU5DRUxFRCwgImNsb3NlIiwgKCJDbG9zZSBjYW5jZWxlZCIpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfbG9vcF9lcnJvcl9jbWQgKEdzdFJUU1BTcmMgKiBzcmMsIGdpbnQgY21kKQoreworICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgQ01EX09QRU46CisgICAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBFUlJPUiwgIm9wZW4iLCAoIk9wZW4gZmFpbGVkIikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfUExBWToKKyAgICAgIEdTVF9FTEVNRU5UX1BST0dSRVNTIChzcmMsIEVSUk9SLCAicmVxdWVzdCIsICgiUExBWSBmYWlsZWQiKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9QQVVTRToKKyAgICAgIEdTVF9FTEVNRU5UX1BST0dSRVNTIChzcmMsIEVSUk9SLCAicmVxdWVzdCIsICgiUEFVU0UgZmFpbGVkIikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfQ0xPU0U6CisgICAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBFUlJPUiwgImNsb3NlIiwgKCJDbG9zZSBmYWlsZWQiKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX2xvb3BfZW5kX2NtZCAoR3N0UlRTUFNyYyAqIHNyYywgZ2ludCBjbWQsIEdzdFJUU1BSZXN1bHQgcmV0KQoreworICBpZiAocmV0ID09IEdTVF9SVFNQX09LKQorICAgIGdzdF9ydHNwc3JjX2xvb3BfY29tcGxldGVfY21kIChzcmMsIGNtZCk7CisgIGVsc2UgaWYgKHJldCA9PSBHU1RfUlRTUF9FSU5UUikKKyAgICBnc3RfcnRzcHNyY19sb29wX2NhbmNlbF9jbWQgKHNyYywgY21kKTsKKyAgZWxzZQorICAgIGdzdF9ydHNwc3JjX2xvb3BfZXJyb3JfY21kIChzcmMsIGNtZCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCAoR3N0UlRTUFNyYyAqIHNyYywgZ2ludCBjbWQsIGdpbnQgbWFzaykKK3sKKyAgZ2ludCBvbGQ7CisgIGdib29sZWFuIGZsdXNoZWQgPSBGQUxTRTsKKworICAvKiBzdGFydCBuZXcgcmVxdWVzdCAqLworICBnc3RfcnRzcHNyY19sb29wX3N0YXJ0X2NtZCAoc3JjLCBjbWQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNlbmRpbmcgY21kICVzIiwgY21kX3RvX3N0cmluZyAoY21kKSk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChzcmMpOworICBvbGQgPSBzcmMtPnBlbmRpbmdfY21kOworICBpZiAob2xkID09IENNRF9SRUNPTk5FQ1QpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJpZ25vcmUsIHdlIHdlcmUgcmVjb25uZWN0aW5nIik7CisgICAgY21kID0gQ01EX1JFQ09OTkVDVDsKKyAgfSBlbHNlIGlmIChvbGQgPT0gQ01EX0NMT1NFKSB7CisgICAgLyogb3VyIENNRF9DTE9TRSBtaWdodCBoYXZlIGludGVycnV0cGVkIENNRF9MT09QLiBnc3RfcnRzcHNyY19sb29wCisgICAgICogd2lsbCBzZW5kIGEgQ01EX1dBSVQgd2hpY2ggd291bGQgY2FuY2VsIG91ciBwZW5kaW5nIENNRF9DTE9TRSAoaWYKKyAgICAgKiBzdGlsbCBwZW5kaW5nKS4gV2UganVzdCBhdm9pZCBpdCBoZXJlIGJ5IG1ha2luZyBzdXJlIENNRF9DTE9TRSBpcworICAgICAqIHN0aWxsIHRoZSBwZW5kaW5nIGNvbW1hbmQuICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiaWdub3JlLCB3ZSB3ZXJlIGNsb3NpbmciKTsKKyAgICBjbWQgPSBDTURfQ0xPU0U7CisgIH0gZWxzZSBpZiAob2xkICE9IENNRF9XQUlUKSB7CisgICAgc3JjLT5wZW5kaW5nX2NtZCA9IENNRF9XQUlUOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcmMpOworICAgIC8qIGNhbmNlbCBwcmV2aW91cyByZXF1ZXN0ICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY2FuY2VsIHByZXZpb3VzIHJlcXVlc3QgJXMiLCBjbWRfdG9fc3RyaW5nIChvbGQpKTsKKyAgICBnc3RfcnRzcHNyY19sb29wX2NhbmNlbF9jbWQgKHNyYywgb2xkKTsKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKHNyYyk7CisgIH0KKyAgc3JjLT5wZW5kaW5nX2NtZCA9IGNtZDsKKyAgLyogaW50ZXJydXB0IGlmIGFsbG93ZWQgKi8KKyAgaWYgKHNyYy0+YnVzeV9jbWQgJiBtYXNrKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY29ubmVjdGlvbiBmbHVzaCBidXN5ICVzIiwKKyAgICAgICAgY21kX3RvX3N0cmluZyAoc3JjLT5idXN5X2NtZCkpOworICAgIGdzdF9ydHNwc3JjX2Nvbm5lY3Rpb25fZmx1c2ggKHNyYywgVFJVRSk7CisgICAgZmx1c2hlZCA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAibm90IGludGVycnVwdGluZyBidXN5IGNtZCAlcyIsCisgICAgICAgIGNtZF90b19zdHJpbmcgKHNyYy0+YnVzeV9jbWQpKTsKKyAgfQorICBpZiAoc3JjLT50YXNrKQorICAgIGdzdF90YXNrX3N0YXJ0IChzcmMtPnRhc2spOworICBHU1RfT0JKRUNUX1VOTE9DSyAoc3JjKTsKKworICByZXR1cm4gZmx1c2hlZDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRzcHNyY19sb29wIChHc3RSVFNQU3JjICogc3JjKQoreworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBpZiAoIXNyYy0+Y29ubmluZm8uY29ubmVjdGlvbiB8fCAhc3JjLT5jb25uaW5mby5jb25uZWN0ZWQpCisgICAgZ290byBub19jb25uZWN0aW9uOworCisgIGlmIChzcmMtPmludGVybGVhdmVkKQorICAgIHJldCA9IGdzdF9ydHNwc3JjX2xvb3BfaW50ZXJsZWF2ZWQgKHNyYyk7CisgIGVsc2UKKyAgICByZXQgPSBnc3RfcnRzcHNyY19sb29wX3VkcCAoc3JjKTsKKworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gcGF1c2U7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub19jb25uZWN0aW9uOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJ3ZSBhcmUgbm90IGNvbm5lY3RlZCIpOworICAgIHJldCA9IEdTVF9GTE9XX0ZMVVNISU5HOworICAgIGdvdG8gcGF1c2U7CisgIH0KK3BhdXNlOgorICB7CisgICAgY29uc3QgZ2NoYXIgKnJlYXNvbiA9IGdzdF9mbG93X2dldF9uYW1lIChyZXQpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicGF1c2luZyB0YXNrLCByZWFzb24gJXMiLCByZWFzb24pOworICAgIHNyYy0+cnVubmluZyA9IEZBTFNFOworICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfRU9TKSB7CisgICAgICAvKiBwZXJmb3JtIEVPUyBsb2dpYyAqLworICAgICAgaWYgKHNyYy0+c2VnbWVudC5mbGFncyAmIEdTVF9TRUVLX0ZMQUdfU0VHTUVOVCkgeworICAgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHNyYyksCisgICAgICAgICAgICBnc3RfbWVzc2FnZV9uZXdfc2VnbWVudF9kb25lIChHU1RfT0JKRUNUX0NBU1QgKHNyYyksCisgICAgICAgICAgICAgICAgc3JjLT5zZWdtZW50LmZvcm1hdCwgc3JjLT5zZWdtZW50LnBvc2l0aW9uKSk7CisgICAgICAgIGdzdF9ydHNwc3JjX3B1c2hfZXZlbnQgKHNyYywKKyAgICAgICAgICAgIGdzdF9ldmVudF9uZXdfc2VnbWVudF9kb25lIChzcmMtPnNlZ21lbnQuZm9ybWF0LAorICAgICAgICAgICAgICAgIHNyYy0+c2VnbWVudC5wb3NpdGlvbikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ3N0X3J0c3BzcmNfcHVzaF9ldmVudCAoc3JjLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXQgPT0gR1NUX0ZMT1dfTk9UX0xJTktFRCB8fCByZXQgPCBHU1RfRkxPV19FT1MpIHsKKyAgICAgIC8qIGZvciBmYXRhbCBlcnJvcnMgd2UgcG9zdCBhbiBlcnJvciBtZXNzYWdlLCBwb3N0IHRoZSBlcnJvciBiZWZvcmUgdGhlCisgICAgICAgKiBFT1Mgc28gdGhlIGFwcCBrbm93cyBhYm91dCB0aGUgZXJyb3IgZmlyc3QuICovCisgICAgICBHU1RfRUxFTUVOVF9GTE9XX0VSUk9SIChzcmMsIHJldCk7CisgICAgICBnc3RfcnRzcHNyY19wdXNoX2V2ZW50IChzcmMsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKyAgICB9CisgICAgZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCAoc3JjLCBDTURfV0FJVCwgQ01EX0xPT1ApOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworc3RhdGljIGNvbnN0IGdjaGFyICoKK2dzdF9ydHNwX2F1dGhfbWV0aG9kX3RvX3N0cmluZyAoR3N0UlRTUEF1dGhNZXRob2QgbWV0aG9kKQoreworICBnaW50IGluZGV4ID0gMDsKKworICB3aGlsZSAobWV0aG9kICE9IDApIHsKKyAgICBpbmRleCsrOworICAgIG1ldGhvZCA+Pj0gMTsKKyAgfQorICBzd2l0Y2ggKGluZGV4KSB7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuICJOb25lIjsKKyAgICBjYXNlIDE6CisgICAgICByZXR1cm4gIkJhc2ljIjsKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gIkRpZ2VzdCI7CisgIH0KKworICByZXR1cm4gIlVua25vd24iOworfQorI2VuZGlmCisKKy8qIFBhcnNlIGEgV1dXLUF1dGhlbnRpY2F0ZSBSZXNwb25zZSBoZWFkZXIgYW5kIGRldGVybWluZSB0aGUKKyAqIGF2YWlsYWJsZSBhdXRoZW50aWNhdGlvbiBtZXRob2RzCisgKgorICogVGhpcyBjb2RlIHNob3VsZCBhbHNvIGNvcGUgd2l0aCB0aGUgZmFjdCB0aGF0IGVhY2ggV1dXLUF1dGhlbnRpY2F0ZQorICogaGVhZGVyIGNhbiBjb250YWluIG11bHRpcGxlIGNoYWxsZW5nZSBtZXRob2RzICsgdG9rZW5zCisgKgorICogQXQgdGhlIG1vbWVudCwgZm9yIEJhc2ljIGF1dGgsIHdlIGp1c3QgZG8gYSBtaW5pbWFsIGNoZWNrIGFuZCBkb24ndAorICogZXZlbiBwYXJzZSBvdXQgdGhlIHJlYWxtICovCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfcGFyc2VfYXV0aF9oZHIgKEdzdFJUU1BNZXNzYWdlICogcmVzcG9uc2UsCisgICAgR3N0UlRTUEF1dGhNZXRob2QgKiBtZXRob2RzLCBHc3RSVFNQQ29ubmVjdGlvbiAqIGNvbm4sIGdib29sZWFuICogc3RhbGUpCit7CisgIEdzdFJUU1BBdXRoQ3JlZGVudGlhbCAqKmNyZWRlbnRpYWxzLCAqKmNyZWRlbnRpYWw7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAocmVzcG9uc2UgIT0gTlVMTCk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKG1ldGhvZHMgIT0gTlVMTCk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKHN0YWxlICE9IE5VTEwpOworCisgIGNyZWRlbnRpYWxzID0KKyAgICAgIGdzdF9ydHNwX21lc3NhZ2VfcGFyc2VfYXV0aF9jcmVkZW50aWFscyAocmVzcG9uc2UsCisgICAgICBHU1RfUlRTUF9IRFJfV1dXX0FVVEhFTlRJQ0FURSk7CisgIGlmICghY3JlZGVudGlhbHMpCisgICAgcmV0dXJuOworCisgIGNyZWRlbnRpYWwgPSBjcmVkZW50aWFsczsKKyAgd2hpbGUgKCpjcmVkZW50aWFsKSB7CisgICAgaWYgKCgqY3JlZGVudGlhbCktPnNjaGVtZSA9PSBHU1RfUlRTUF9BVVRIX0JBU0lDKSB7CisgICAgICAqbWV0aG9kcyB8PSBHU1RfUlRTUF9BVVRIX0JBU0lDOworICAgIH0gZWxzZSBpZiAoKCpjcmVkZW50aWFsKS0+c2NoZW1lID09IEdTVF9SVFNQX0FVVEhfRElHRVNUKSB7CisgICAgICBHc3RSVFNQQXV0aFBhcmFtICoqcGFyYW0gPSAoKmNyZWRlbnRpYWwpLT5wYXJhbXM7CisKKyAgICAgICptZXRob2RzIHw9IEdTVF9SVFNQX0FVVEhfRElHRVNUOworCisgICAgICBnc3RfcnRzcF9jb25uZWN0aW9uX2NsZWFyX2F1dGhfcGFyYW1zIChjb25uKTsKKyAgICAgICpzdGFsZSA9IEZBTFNFOworCisgICAgICB3aGlsZSAoKnBhcmFtKSB7CisgICAgICAgIGlmIChzdHJjbXAgKCgqcGFyYW0pLT5uYW1lLCAic3RhbGUiKSA9PSAwCisgICAgICAgICAgICAmJiBnX2FzY2lpX3N0cmNhc2VjbXAgKCgqcGFyYW0pLT52YWx1ZSwgIlRSVUUiKSA9PSAwKQorICAgICAgICAgICpzdGFsZSA9IFRSVUU7CisgICAgICAgIGdzdF9ydHNwX2Nvbm5lY3Rpb25fc2V0X2F1dGhfcGFyYW0gKGNvbm4sICgqcGFyYW0pLT5uYW1lLAorICAgICAgICAgICAgKCpwYXJhbSktPnZhbHVlKTsKKyAgICAgICAgcGFyYW0rKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjcmVkZW50aWFsKys7CisgIH0KKworICBnc3RfcnRzcF9hdXRoX2NyZWRlbnRpYWxzX2ZyZWUgKGNyZWRlbnRpYWxzKTsKK30KKworLyoqCisgKiBnc3RfcnRzcHNyY19zZXR1cF9hdXRoOgorICogQHNyYzogdGhlIHJ0c3Agc291cmNlCisgKgorICogQ29uZmlndXJlIGEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGFuZCBhdXRoIG1ldGhvZCBvbiB0aGUKKyAqIGNvbm5lY3Rpb24gb2JqZWN0IGJhc2VkIG9uIGEgcmVzcG9uc2Ugd2UgcmVjZWl2ZWQgZnJvbSB0aGUKKyAqIHBlZXIuCisgKgorICogQ3VycmVudGx5LCB0aGlzIHJlcXVpcmVzIHRoYXQgYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgd2VyZSBzdXBwbGllZAorICogaW4gdGhlIHVyaS4gSW4gdGhlIGZ1dHVyZSwgdGhleSBtYXkgYmUgcmVxdWVzdGVkIG9uIGRlbWFuZCBieSBzZW5kaW5nCisgKiBhIG1lc3NhZ2UgdXAgdGhlIGJ1cy4KKyAqCisgKiBSZXR1cm5zOiBUUlVFIGlmIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGNvdWxkIGJlIHNldCB1cCBjb3JyZWN0bHkuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfc2V0dXBfYXV0aCAoR3N0UlRTUFNyYyAqIHNyYywgR3N0UlRTUE1lc3NhZ2UgKiByZXNwb25zZSkKK3sKKyAgZ2NoYXIgKnVzZXIgPSBOVUxMOworICBnY2hhciAqcGFzcyA9IE5VTEw7CisgIEdzdFJUU1BBdXRoTWV0aG9kIGF2YWlsX21ldGhvZHMgPSBHU1RfUlRTUF9BVVRIX05PTkU7CisgIEdzdFJUU1BBdXRoTWV0aG9kIG1ldGhvZDsKKyAgR3N0UlRTUFJlc3VsdCBhdXRoX3Jlc3VsdDsKKyAgR3N0UlRTUFVybCAqdXJsOworICBHc3RSVFNQQ29ubmVjdGlvbiAqY29ubjsKKyAgZ2Jvb2xlYW4gc3RhbGUgPSBGQUxTRTsKKworICBjb25uID0gc3JjLT5jb25uaW5mby5jb25uZWN0aW9uOworCisgIC8qIElkZW50aWZ5IHRoZSBhdmFpbGFibGUgYXV0aCBtZXRob2RzIGFuZCBzZWUgaWYgYW55IGFyZSBzdXBwb3J0ZWQgKi8KKyAgZ3N0X3J0c3BzcmNfcGFyc2VfYXV0aF9oZHIgKHJlc3BvbnNlLCAmYXZhaWxfbWV0aG9kcywgY29ubiwgJnN0YWxlKTsKKworICBpZiAoYXZhaWxfbWV0aG9kcyA9PSBHU1RfUlRTUF9BVVRIX05PTkUpCisgICAgZ290byBub19hdXRoX2F2YWlsYWJsZTsKKworICAvKiBGb3IgZGlnZXN0IGF1dGgsIGlmIHRoZSByZXNwb25zZSBpbmRpY2F0ZXMgdGhhdCB0aGUgc2Vzc2lvbgorICAgKiBkYXRhIGFyZSBzdGFsZSwgd2UganVzdCB1cGRhdGUgdGhlbSBpbiB0aGUgY29ubmVjdGlvbiBvYmplY3QgYW5kCisgICAqIHJldHVybiBUUlVFIHRvIHJldHJ5IHRoZSByZXF1ZXN0ICovCisgIGlmIChzdGFsZSkKKyAgICBzcmMtPnRyaWVkX3VybF9hdXRoID0gRkFMU0U7CisKKyAgdXJsID0gZ3N0X3J0c3BfY29ubmVjdGlvbl9nZXRfdXJsIChjb25uKTsKKworICAvKiBEbyB3ZSBoYXZlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBhdmFpbGFibGU/ICovCisgIGlmICh1cmwgIT0gTlVMTCAmJiAhc3JjLT50cmllZF91cmxfYXV0aCAmJiB1cmwtPnVzZXIgIT0gTlVMTAorICAgICAgJiYgdXJsLT5wYXNzd2QgIT0gTlVMTCkgeworICAgIHVzZXIgPSB1cmwtPnVzZXI7CisgICAgcGFzcyA9IHVybC0+cGFzc3dkOworICAgIHNyYy0+dHJpZWRfdXJsX2F1dGggPSBUUlVFOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywKKyAgICAgICAgIkF0dGVtcHRpbmcgYXV0aGVudGljYXRpb24gdXNpbmcgY3JlZGVudGlhbHMgZnJvbSB0aGUgVVJMIik7CisgIH0gZWxzZSB7CisgICAgdXNlciA9IHNyYy0+dXNlcl9pZDsKKyAgICBwYXNzID0gc3JjLT51c2VyX3B3OworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywKKyAgICAgICAgIkF0dGVtcHRpbmcgYXV0aGVudGljYXRpb24gdXNpbmcgY3JlZGVudGlhbHMgZnJvbSB0aGUgcHJvcGVydGllcyIpOworICB9CisKKyAgLyogRklYTUU6IElmIHRoZSB1cmwgZGlkbid0IGNvbnRhaW4gdXNlcm5hbWUgYW5kIHBhc3N3b3JkIG9yIHdlIHRyaWVkIHRoZW0KKyAgICogYWxyZWFkeSwgcmVxdWVzdCBhIHVzZXJuYW1lIGFuZCBwYXNzd2QgZnJvbSB0aGUgYXBwbGljYXRpb24gdmlhIHNvbWUga2luZAorICAgKiBvZiBjcmVkZW50aWFscyByZXF1ZXN0IG1lc3NhZ2UgKi8KKworICAvKiBJZiB3ZSBkb24ndCBoYXZlIGEgdXNlcm5hbWUgYW5kIHBhc3N3ZCBhdCB0aGlzIHBvaW50LCBiYWlsIG91dC4gKi8KKyAgaWYgKHVzZXIgPT0gTlVMTCB8fCBwYXNzID09IE5VTEwpCisgICAgZ290byBub191c2VyX3Bhc3M7CisKKyAgLyogVHJ5IHRvIGNvbmZpZ3VyZSBmb3IgZWFjaCBhdmFpbGFibGUgYXV0aGVudGljYXRpb24gbWV0aG9kLCBzdHJvbmdlc3QgdG8KKyAgICogd2Vha2VzdCAqLworICBmb3IgKG1ldGhvZCA9IEdTVF9SVFNQX0FVVEhfTUFYOyBtZXRob2QgIT0gR1NUX1JUU1BfQVVUSF9OT05FOyBtZXRob2QgPj49IDEpIHsKKyAgICAvKiBDaGVjayBpZiB0aGlzIG1ldGhvZCBpcyBhdmFpbGFibGUgb24gdGhlIHNlcnZlciAqLworICAgIGlmICgobWV0aG9kICYgYXZhaWxfbWV0aG9kcykgPT0gMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogUGFzcyB0aGUgY3JlZGVudGlhbHMgdG8gdGhlIGNvbm5lY3Rpb24gdG8gdHJ5IG9uIHRoZSBuZXh0IHJlcXVlc3QgKi8KKyAgICBhdXRoX3Jlc3VsdCA9IGdzdF9ydHNwX2Nvbm5lY3Rpb25fc2V0X2F1dGggKGNvbm4sIG1ldGhvZCwgdXNlciwgcGFzcyk7CisgICAgLyogSU5WQUwgaW5kaWNhdGVzIGFuIGludmFsaWQgdXNlcm5hbWUvcGFzc3dkIHdlcmUgc3VwcGxpZWQsIHNvIHdlJ2xsIGp1c3QKKyAgICAgKiBpZ25vcmUgaXQgYW5kIGVuZCB1cCByZXRyeWluZyBsYXRlciAqLworICAgIGlmIChhdXRoX3Jlc3VsdCA9PSBHU1RfUlRTUF9PSyB8fCBhdXRoX3Jlc3VsdCA9PSBHU1RfUlRTUF9FSU5WQUwpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIkF0dGVtcHRpbmcgJXMgYXV0aGVudGljYXRpb24iLAorICAgICAgICAgIGdzdF9ydHNwX2F1dGhfbWV0aG9kX3RvX3N0cmluZyAobWV0aG9kKSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAobWV0aG9kID09IEdTVF9SVFNQX0FVVEhfTk9ORSkKKyAgICBnb3RvIG5vX2F1dGhfYXZhaWxhYmxlOworCisgIHJldHVybiBUUlVFOworCitub19hdXRoX2F2YWlsYWJsZToKKyAgeworICAgIC8qIE91dHB1dCBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgd2UgY291bGRuJ3QgY29ubmVjdCBiZWNhdXNlIHRoZXJlIHdlcmUKKyAgICAgKiBubyBzdXBwb3J0ZWQgYXV0aGVudGljYXRpb24gcHJvdG9jb2xzICovCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwgKE5VTEwpLAorICAgICAgICAoIk5vIHN1cHBvcnRlZCBhdXRoZW50aWNhdGlvbiBwcm90b2NvbCB3YXMgZm91bmQiKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub191c2VyX3Bhc3M6CisgIHsKKyAgICAvKiBXZSBkb24ndCBmaXJlIGFuIGVycm9yIG1lc3NhZ2UsIHdlIGp1c3QgcmV0dXJuIEZBTFNFIGFuZCBsZXQgdGhlCisgICAgICogbm9ybWFsIE5PVF9BVVRIT1JJWkVEIGVycm9yIGJlIHByb3BhZ2F0ZWQgKi8KKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwX3NyY19yZWNlaXZlX3Jlc3BvbnNlIChHc3RSVFNQU3JjICogc3JjLCBHc3RSVFNQQ29ubkluZm8gKiBjb25uaW5mbywKKyAgICBHc3RSVFNQTWVzc2FnZSAqIHJlc3BvbnNlLCBHc3RSVFNQU3RhdHVzQ29kZSAqIGNvZGUpCit7CisgIEdzdFJUU1BTdGF0dXNDb2RlIHRoZWNvZGU7CisgIGdjaGFyICpjb250ZW50X2Jhc2UgPSBOVUxMOworICBHc3RSVFNQUmVzdWx0IHJlcyA9IGdzdF9ydHNwc3JjX2Nvbm5lY3Rpb25fcmVjZWl2ZSAoc3JjLCBjb25uaW5mbywKKyAgICAgIHJlc3BvbnNlLCBzcmMtPnB0Y3BfdGltZW91dCk7CisKKyAgaWYgKHJlcyA8IDApCisgICAgZ290byByZWNlaXZlX2Vycm9yOworCisgIERFQlVHX1JUU1AgKHNyYywgcmVzcG9uc2UpOworCisgIHN3aXRjaCAocmVzcG9uc2UtPnR5cGUpIHsKKyAgICBjYXNlIEdTVF9SVFNQX01FU1NBR0VfUkVRVUVTVDoKKyAgICAgIHJlcyA9IGdzdF9ydHNwc3JjX2hhbmRsZV9yZXF1ZXN0IChzcmMsIGNvbm5pbmZvLCByZXNwb25zZSk7CisgICAgICBpZiAocmVzID09IEdTVF9SVFNQX0VFT0YpCisgICAgICAgIGdvdG8gc2VydmVyX2VvZjsKKyAgICAgIGVsc2UgaWYgKHJlcyA8IDApCisgICAgICAgIGdvdG8gaGFuZGxlX3JlcXVlc3RfZmFpbGVkOworCisgICAgICAvKiBOb3QgYSByZXNwb25zZSwgcmVjZWl2ZSBuZXh0IG1lc3NhZ2UgKi8KKyAgICAgIHJldHVybiBnc3RfcnRzcF9zcmNfcmVjZWl2ZV9yZXNwb25zZSAoc3JjLCBjb25uaW5mbywgcmVzcG9uc2UsIGNvZGUpOworICAgIGNhc2UgR1NUX1JUU1BfTUVTU0FHRV9SRVNQT05TRToKKyAgICAgIC8qIG9rLCBhIHJlc3BvbnNlIGlzIGdvb2QgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInJlY2VpdmVkIHJlc3BvbnNlIG1lc3NhZ2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1JUU1BfTUVTU0FHRV9EQVRBOgorICAgICAgLyogZ2V0IG5leHQgcmVzcG9uc2UgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImhhbmRsZSBkYXRhIHJlc3BvbnNlIG1lc3NhZ2UiKTsKKyAgICAgIGdzdF9ydHNwc3JjX2hhbmRsZV9kYXRhIChzcmMsIHJlc3BvbnNlKTsKKworICAgICAgLyogTm90IGEgcmVzcG9uc2UsIHJlY2VpdmUgbmV4dCBtZXNzYWdlICovCisgICAgICByZXR1cm4gZ3N0X3J0c3Bfc3JjX3JlY2VpdmVfcmVzcG9uc2UgKHNyYywgY29ubmluZm8sIHJlc3BvbnNlLCBjb2RlKTsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJpZ25vcmluZyB1bmtub3duIG1lc3NhZ2UgdHlwZSAlZCIsCisgICAgICAgICAgcmVzcG9uc2UtPnR5cGUpOworCisgICAgICAvKiBOb3QgYSByZXNwb25zZSwgcmVjZWl2ZSBuZXh0IG1lc3NhZ2UgKi8KKyAgICAgIHJldHVybiBnc3RfcnRzcF9zcmNfcmVjZWl2ZV9yZXNwb25zZSAoc3JjLCBjb25uaW5mbywgcmVzcG9uc2UsIGNvZGUpOworICB9CisKKyAgdGhlY29kZSA9IHJlc3BvbnNlLT50eXBlX2RhdGEucmVzcG9uc2UuY29kZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJnb3QgcmVzcG9uc2UgbWVzc2FnZSAlZCIsIHRoZWNvZGUpOworCisgIC8qIGlmIHRoZSBjYWxsZXIgd2FudGVkIHRoZSByZXN1bHQgY29kZSwgd2Ugc3RvcmUgaXQuICovCisgIGlmIChjb2RlKQorICAgICpjb2RlID0gdGhlY29kZTsKKworICAvKiBJZiB0aGUgcmVxdWVzdCBkaWRuJ3Qgc3VjY2VlZCwgYmFpbCBvdXQgYmVmb3JlIGRvaW5nIGFueSBtb3JlICovCisgIGlmICh0aGVjb2RlICE9IEdTVF9SVFNQX1NUU19PSykKKyAgICByZXR1cm4gR1NUX1JUU1BfT0s7CisKKyAgLyogc3RvcmUgbmV3IGNvbnRlbnQgYmFzZSBpZiBhbnkgKi8KKyAgZ3N0X3J0c3BfbWVzc2FnZV9nZXRfaGVhZGVyIChyZXNwb25zZSwgR1NUX1JUU1BfSERSX0NPTlRFTlRfQkFTRSwKKyAgICAgICZjb250ZW50X2Jhc2UsIDApOworICBpZiAoY29udGVudF9iYXNlKSB7CisgICAgZ19mcmVlIChzcmMtPmNvbnRlbnRfYmFzZSk7CisgICAgc3JjLT5jb250ZW50X2Jhc2UgPSBnX3N0cmR1cCAoY29udGVudF9iYXNlKTsKKyAgfQorCisgIHJldHVybiBHU1RfUlRTUF9PSzsKKworICAvKiBFUlJPUlMgKi8KK3JlY2VpdmVfZXJyb3I6CisgIHsKKyAgICBzd2l0Y2ggKHJlcykgeworICAgICAgY2FzZSBHU1RfUlRTUF9FRU9GOgorICAgICAgICByZXR1cm4gR1NUX1JUU1BfRUVPRjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICB7CisgICAgICAgIGdjaGFyICpzdHIgPSBnc3RfcnRzcF9zdHJyZXN1bHQgKHJlcyk7CisKKyAgICAgICAgaWYgKHJlcyAhPSBHU1RfUlRTUF9FSU5UUikgeworICAgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBSRUFELCAoTlVMTCksCisgICAgICAgICAgICAgICgiQ291bGQgbm90IHJlY2VpdmUgbWVzc2FnZS4gKCVzKSIsIHN0cikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAicmVjZWl2ZSBpbnRlcnJ1cHRlZCIpOworICAgICAgICB9CisgICAgICAgIGdfZnJlZSAoc3RyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7CisgIH0KK2hhbmRsZV9yZXF1ZXN0X2ZhaWxlZDoKKyAgeworICAgIC8qIEVSUk9SIHdhcyBwb3N0ZWQgKi8KKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0IChyZXNwb25zZSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorc2VydmVyX2VvZjoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIndlIGdvdCBhbiBlb2YgZnJvbSB0aGUgc2VydmVyIik7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoc3JjLCBSRVNPVVJDRSwgUkVBRCwgKE5VTEwpLAorICAgICAgICAoIlRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uLiIpKTsKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0IChyZXNwb25zZSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorfQorCisKK3N0YXRpYyBHc3RSVFNQUmVzdWx0Citnc3RfcnRzcHNyY190cnlfc2VuZCAoR3N0UlRTUFNyYyAqIHNyYywgR3N0UlRTUENvbm5JbmZvICogY29ubmluZm8sCisgICAgR3N0UlRTUE1lc3NhZ2UgKiByZXF1ZXN0LCBHc3RSVFNQTWVzc2FnZSAqIHJlc3BvbnNlLAorICAgIEdzdFJUU1BTdGF0dXNDb2RlICogY29kZSkKK3sKKyAgR3N0UlRTUFJlc3VsdCByZXM7CisgIGdpbnQgdHJ5ID0gMDsKKyAgZ2Jvb2xlYW4gYWxsb3dfc2VuZCA9IFRSVUU7CisKK2FnYWluOgorICBpZiAoIXNyYy0+c2hvcnRfaGVhZGVyKQorICAgIGdzdF9ydHNwX2V4dF9saXN0X2JlZm9yZV9zZW5kIChzcmMtPmV4dGVuc2lvbnMsIHJlcXVlc3QpOworCisgIGdfc2lnbmFsX2VtaXQgKHNyYywgZ3N0X3J0c3BzcmNfc2lnbmFsc1tTSUdOQUxfQkVGT1JFX1NFTkRdLCAwLAorICAgICAgcmVxdWVzdCwgJmFsbG93X3NlbmQpOworICBpZiAoIWFsbG93X3NlbmQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJza2lwcGluZyBtZXNzYWdlLCBkaXNhYmxlZCBieSBzaWduYWwiKTsKKyAgICByZXR1cm4gR1NUX1JUU1BfT0s7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzZW5kaW5nIG1lc3NhZ2UiKTsKKworICBERUJVR19SVFNQIChzcmMsIHJlcXVlc3QpOworCisgIHJlcyA9IGdzdF9ydHNwc3JjX2Nvbm5lY3Rpb25fc2VuZCAoc3JjLCBjb25uaW5mbywgcmVxdWVzdCwgc3JjLT5wdGNwX3RpbWVvdXQpOworICBpZiAocmVzIDwgMCkKKyAgICBnb3RvIHNlbmRfZXJyb3I7CisKKyAgZ3N0X3J0c3BfY29ubmVjdGlvbl9yZXNldF90aW1lb3V0IChjb25uaW5mby0+Y29ubmVjdGlvbik7CisgIGlmICghcmVzcG9uc2UpCisgICAgcmV0dXJuIHJlczsKKworICByZXMgPSBnc3RfcnRzcF9zcmNfcmVjZWl2ZV9yZXNwb25zZSAoc3JjLCBjb25uaW5mbywgcmVzcG9uc2UsIGNvZGUpOworICBpZiAocmVzID09IEdTVF9SVFNQX0VFT0YpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgInNlcnZlciBjbG9zZWQgY29ubmVjdGlvbiIpOworICAgIC8qIG9ubHkgdHJ5IG9uY2UgYWZ0ZXIgcmVjb25uZWN0LCB0aGVuIGZhbGx0aHJvdWdoIGFuZCBlcnJvciBvdXQgKi8KKyAgICBpZiAoKHRyeSA9PSAwKSAmJiAhc3JjLT5pbnRlcmxlYXZlZCAmJiBzcmMtPnVkcF9yZWNvbm5lY3QpIHsKKyAgICAgIHRyeSsrOworICAgICAgLyogaWYgcmVjb25uZWN0IHN1Y2NlZWRzLCB0cnkgYWdhaW4gKi8KKyAgICAgIGlmICgocmVzID0gZ3N0X3J0c3BfY29ubmluZm9fcmVjb25uZWN0IChzcmMsICZzcmMtPmNvbm5pbmZvLCBGQUxTRSkpID09IDApCisgICAgICAgIGdvdG8gYWdhaW47CisgICAgfQorICB9CisgIGdzdF9ydHNwX2V4dF9saXN0X2FmdGVyX3NlbmQgKHNyYy0+ZXh0ZW5zaW9ucywgcmVxdWVzdCwgcmVzcG9uc2UpOworCisgIHJldHVybiByZXM7CisKK3NlbmRfZXJyb3I6CisgIHsKKyAgICBnY2hhciAqc3RyID0gZ3N0X3J0c3Bfc3RycmVzdWx0IChyZXMpOworCisgICAgaWYgKHJlcyAhPSBHU1RfUlRTUF9FSU5UUikgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIFdSSVRFLCAoTlVMTCksCisgICAgICAgICAgKCJDb3VsZCBub3Qgc2VuZCBtZXNzYWdlLiAoJXMpIiwgc3RyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAic2VuZCBpbnRlcnJ1cHRlZCIpOworICAgIH0KKyAgICBnX2ZyZWUgKHN0cik7CisgICAgcmV0dXJuIHJlczsKKyAgfQorfQorCisvKioKKyAqIGdzdF9ydHNwc3JjX3NlbmQ6CisgKiBAc3JjOiB0aGUgcnRzcCBzb3VyY2UKKyAqIEBjb25uaW5mbzogdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gdG8gc2VuZCBvbgorICogQHJlcXVlc3Q6IG11c3QgcG9pbnQgdG8gYSB2YWxpZCByZXF1ZXN0CisgKiBAcmVzcG9uc2U6IG11c3QgcG9pbnQgdG8gYW4gZW1wdHkgI0dzdFJUU1BNZXNzYWdlCisgKiBAY29kZTogYW4gb3B0aW9uYWwgY29kZSByZXN1bHQKKyAqIEB2ZXJzaW9uczogTGlzdCBvZiB2ZXJzaW9ucyB0byB0cnksIHNldHRpbmcgaXQgYmFjayBvbnRvIHRoZSBAcmVxdWVzdCBtZXNzYWdlCisgKiAgICAgICAgICAgIGlmIG5vdCBzZXQsIGBzcmMtPnZlcnNpb25gIHdpbGwgYmUgdXNlZCBhcyBSVFNQIHZlcnNpb24uCisgKgorICogc2VuZCBAcmVxdWVzdCBhbmQgcmV0cmlldmUgdGhlIHJlc3BvbnNlIGluIEByZXNwb25zZS4gb3B0aW9uYWxseSBAY29kZSBjYW4gYmUKKyAqIG5vbi1OVUxMIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBjb250YWluIHRoZSBzdGF0dXMgY29kZSBvZiB0aGUgcmVzcG9uc2UuCisgKgorICogSWYgVGhpcyBmdW5jdGlvbiByZXR1cm5zICNHU1RfUlRTUF9PSywgQHJlc3BvbnNlIHdpbGwgY29udGFpbiBhIHZhbGlkIHJlc3BvbnNlCisgKiBtZXNzYWdlIHRoYXQgc2hvdWxkIGJlIGNsZWFuZWQgd2l0aCBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0KCkgYWZ0ZXIgdXNhZ2UuCisgKgorICogSWYgQGNvZGUgaXMgTlVMTCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAjR1NUX1JUU1BfRVJST1IgKHdpdGggYW4gaW52YWxpZAorICogQHJlc3BvbnNlIG1lc3NhZ2UpIGlmIHRoZSByZXNwb25zZSBjb2RlIHdhcyBub3QgMjAwIChPSykuCisgKgorICogSWYgdGhlIGF0dGVtcHQgcmVzdWx0cyBpbiBhbiBhdXRoZW50aWNhdGlvbiBmYWlsdXJlLCB0aGVuIHRoaXMgd2lsbCBhdHRlbXB0CisgKiB0byByZXRyaWV2ZSBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFscyB2aWEgZ3N0X3J0c3BzcmNfc2V0dXBfYXV0aCBhbmQgcmV0cnkKKyAqIHRoZSByZXF1ZXN0LgorICoKKyAqIFJldHVybnM6ICNHU1RfUlRTUF9PSyBpZiB0aGUgcHJvY2Vzc2luZyB3YXMgc3VjY2Vzc2Z1bC4KKyAqLworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX3NlbmQgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFJUU1BDb25uSW5mbyAqIGNvbm5pbmZvLAorICAgIEdzdFJUU1BNZXNzYWdlICogcmVxdWVzdCwgR3N0UlRTUE1lc3NhZ2UgKiByZXNwb25zZSwKKyAgICBHc3RSVFNQU3RhdHVzQ29kZSAqIGNvZGUsIEdzdFJUU1BWZXJzaW9uICogdmVyc2lvbnMpCit7CisgIEdzdFJUU1BTdGF0dXNDb2RlIGludF9jb2RlID0gR1NUX1JUU1BfU1RTX09LOworICBHc3RSVFNQUmVzdWx0IHJlcyA9IEdTVF9SVFNQX0VSUk9SOworICBnaW50IGNvdW50OworICBnYm9vbGVhbiByZXRyeTsKKyAgR3N0UlRTUE1ldGhvZCBtZXRob2QgPSBHU1RfUlRTUF9JTlZBTElEOworICBnaW50IHZlcnNpb25fcmV0cnkgPSAwOworCisgIGNvdW50ID0gMDsKKyAgZG8geworICAgIHJldHJ5ID0gRkFMU0U7CisKKyAgICAvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgbG9vcCBmb3JldmVyICovCisgICAgaWYgKGNvdW50KysgPiA4KQorICAgICAgYnJlYWs7CisKKyAgICAvKiBzYXZlIG1ldGhvZCBzbyB3ZSBjYW4gZGlzYWJsZSBpdCB3aGVuIHRoZSBzZXJ2ZXIgY29tcGxhaW5zICovCisgICAgbWV0aG9kID0gcmVxdWVzdC0+dHlwZV9kYXRhLnJlcXVlc3QubWV0aG9kOworCisgICAgaWYgKCF2ZXJzaW9ucykKKyAgICAgIHJlcXVlc3QtPnR5cGVfZGF0YS5yZXF1ZXN0LnZlcnNpb24gPSBzcmMtPnZlcnNpb247CisKKyAgICBpZiAoKHJlcyA9CisgICAgICAgICAgICBnc3RfcnRzcHNyY190cnlfc2VuZCAoc3JjLCBjb25uaW5mbywgcmVxdWVzdCwgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgJmludF9jb2RlKSkgPCAwKQorICAgICAgZ290byBlcnJvcjsKKworICAgIHN3aXRjaCAoaW50X2NvZGUpIHsKKyAgICAgIGNhc2UgR1NUX1JUU1BfU1RTX1VOQVVUSE9SSVpFRDoKKyAgICAgIGNhc2UgR1NUX1JUU1BfU1RTX05PVF9GT1VORDoKKyAgICAgICAgaWYgKGdzdF9ydHNwc3JjX3NldHVwX2F1dGggKHNyYywgcmVzcG9uc2UpKSB7CisgICAgICAgICAgLyogVHJ5IHRoZSByZXF1ZXN0L3Jlc3BvbnNlIGFnYWluIGFmdGVyIGNvbmZpZ3VyaW5nIHRoZSBhdXRoIGluZm8KKyAgICAgICAgICAgKiBhbmQgbG9vcCBhZ2FpbiAqLworICAgICAgICAgIHJldHJ5ID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1JUU1BfU1RTX1JUU1BfVkVSU0lPTl9OT1RfU1VQUE9SVEVEOgorICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHNyYywgIlZlcnNpb24gJXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyIiwKKyAgICAgICAgICAgIHZlcnNpb25zID8gZ3N0X3J0c3BfdmVyc2lvbl9hc190ZXh0ICh2ZXJzaW9uc1t2ZXJzaW9uX3JldHJ5XSkgOgorICAgICAgICAgICAgInVua25vd24iKTsKKyAgICAgICAgaWYgKHZlcnNpb25zICYmIHZlcnNpb25zW3ZlcnNpb25fcmV0cnldICE9IEdTVF9SVFNQX1ZFUlNJT05fSU5WQUxJRCkgeworICAgICAgICAgIEdTVF9JTkZPX09CSkVDVCAoc3JjLCAiVW5zdXBwb3J0ZWQgdmVyc2lvbiAlcyA9PiB0cnlpbmcgJXMiLAorICAgICAgICAgICAgICBnc3RfcnRzcF92ZXJzaW9uX2FzX3RleHQgKHJlcXVlc3QtPnR5cGVfZGF0YS5yZXF1ZXN0LnZlcnNpb24pLAorICAgICAgICAgICAgICBnc3RfcnRzcF92ZXJzaW9uX2FzX3RleHQgKHZlcnNpb25zW3ZlcnNpb25fcmV0cnldKSk7CisgICAgICAgICAgcmVxdWVzdC0+dHlwZV9kYXRhLnJlcXVlc3QudmVyc2lvbiA9IHZlcnNpb25zW3ZlcnNpb25fcmV0cnldOworICAgICAgICAgIHJldHJ5ID0gVFJVRTsKKyAgICAgICAgICB2ZXJzaW9uX3JldHJ5Kys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogZmFsbHRyb3VnaCAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IHdoaWxlIChyZXRyeSA9PSBUUlVFKTsKKworICAvKiBJZiB0aGUgdXNlciByZXF1ZXN0ZWQgdGhlIGNvZGUsIGxldCB0aGVtIGhhbmRsZSBlcnJvcnMsIG90aGVyd2lzZQorICAgKiBwb3N0IGFuIGVycm9yIGJlbG93ICovCisgIGlmIChjb2RlICE9IE5VTEwpCisgICAgKmNvZGUgPSBpbnRfY29kZTsKKyAgZWxzZSBpZiAoaW50X2NvZGUgIT0gR1NUX1JUU1BfU1RTX09LKQorICAgIGdvdG8gZXJyb3JfcmVzcG9uc2U7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK2Vycm9yOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZ290IGVycm9yICVkIiwgcmVzKTsKKyAgICByZXR1cm4gcmVzOworICB9CitlcnJvcl9yZXNwb25zZToKKyAgeworICAgIHJlcyA9IEdTVF9SVFNQX0VSUk9SOworCisgICAgc3dpdGNoIChyZXNwb25zZS0+dHlwZV9kYXRhLnJlc3BvbnNlLmNvZGUpIHsKKyAgICAgIGNhc2UgR1NUX1JUU1BfU1RTX05PVF9GT1VORDoKKyAgICAgICAgUlRTUF9TUkNfUkVTUE9OU0VfRVJST1IgKHNyYywgcmVzcG9uc2UsIFJFU09VUkNFLCBOT1RfRk9VTkQsCisgICAgICAgICAgICAiTm90IGZvdW5kIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfUlRTUF9TVFNfVU5BVVRIT1JJWkVEOgorICAgICAgICBSVFNQX1NSQ19SRVNQT05TRV9FUlJPUiAoc3JjLCByZXNwb25zZSwgUkVTT1VSQ0UsIE5PVF9BVVRIT1JJWkVELAorICAgICAgICAgICAgIlVuYXV0aG9yaXplZCIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1JUU1BfU1RTX01PVkVEX1BFUk1BTkVOVExZOgorICAgICAgY2FzZSBHU1RfUlRTUF9TVFNfTU9WRV9URU1QT1JBUklMWToKKyAgICAgIHsKKyAgICAgICAgZ2NoYXIgKm5ld19sb2NhdGlvbjsKKyAgICAgICAgR3N0UlRTUExvd2VyVHJhbnMgdHJhbnNwb3J0czsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJnb3QgcmVkaXJlY3Rpb24iKTsKKyAgICAgICAgLyogaWYgd2UgZG9uJ3QgaGF2ZSBhIExvY2F0aW9uIEhlYWRlciwgd2UgbXVzdCBlcnJvciAqLworICAgICAgICBpZiAoZ3N0X3J0c3BfbWVzc2FnZV9nZXRfaGVhZGVyIChyZXNwb25zZSwgR1NUX1JUU1BfSERSX0xPQ0FUSU9OLAorICAgICAgICAgICAgICAgICZuZXdfbG9jYXRpb24sIDApIDwgMCkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBXaGVuIHdlIHJlY2VpdmUgYSByZWRpcmVjdCByZXN1bHQsIHdlIGdvIGJhY2sgdG8gdGhlIElOSVQgc3RhdGUgYWZ0ZXIKKyAgICAgICAgICogcGFyc2luZyB0aGUgbmV3IFVSSS4gVGhlIGNhbGxlciBzaG91bGQgZG8gdGhlIG5lZWRlZCBzdGVwcyB0byBpc3N1ZQorICAgICAgICAgKiBhIG5ldyBzZXR1cCB3aGVuIGl0IGRldGVjdHMgdGhpcyBzdGF0ZSBjaGFuZ2UuICovCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInJlZGlyZWN0aW9uIHRvICVzIiwgbmV3X2xvY2F0aW9uKTsKKworICAgICAgICAvKiBzYXZlIGN1cnJlbnQgdHJhbnNwb3J0cyAqLworICAgICAgICBpZiAoc3JjLT5jb25uaW5mby51cmwpCisgICAgICAgICAgdHJhbnNwb3J0cyA9IHNyYy0+Y29ubmluZm8udXJsLT50cmFuc3BvcnRzOworICAgICAgICBlbHNlCisgICAgICAgICAgdHJhbnNwb3J0cyA9IEdTVF9SVFNQX0xPV0VSX1RSQU5TX1VOS05PV047CisKKyAgICAgICAgZ3N0X3J0c3BzcmNfdXJpX3NldF91cmkgKEdTVF9VUklfSEFORExFUiAoc3JjKSwgbmV3X2xvY2F0aW9uLCBOVUxMKTsKKworICAgICAgICAvKiBzZXQgb2xkIHRyYW5zcG9ydHMgKi8KKyAgICAgICAgaWYgKHNyYy0+Y29ubmluZm8udXJsICYmIHRyYW5zcG9ydHMgIT0gR1NUX1JUU1BfTE9XRVJfVFJBTlNfVU5LTk9XTikKKyAgICAgICAgICBzcmMtPmNvbm5pbmZvLnVybC0+dHJhbnNwb3J0cyA9IHRyYW5zcG9ydHM7CisKKyAgICAgICAgc3JjLT5uZWVkX3JlZGlyZWN0ID0gVFJVRTsKKyAgICAgICAgcmVzID0gR1NUX1JUU1BfT0s7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBHU1RfUlRTUF9TVFNfTk9UX0FDQ0VQVEFCTEU6CisgICAgICBjYXNlIEdTVF9SVFNQX1NUU19OT1RfSU1QTEVNRU5URUQ6CisgICAgICBjYXNlIEdTVF9SVFNQX1NUU19NRVRIT0RfTk9UX0FMTE9XRUQ6CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiZ290IE5PVCBJTVBMRU1FTlRFRCwgZGlzYWJsZSBtZXRob2QgJXMiLAorICAgICAgICAgICAgZ3N0X3J0c3BfbWV0aG9kX2FzX3RleHQgKG1ldGhvZCkpOworICAgICAgICBzcmMtPm1ldGhvZHMgJj0gfm1ldGhvZDsKKyAgICAgICAgcmVzID0gR1NUX1JUU1BfT0s7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgUlRTUF9TUkNfUkVTUE9OU0VfRVJST1IgKHNyYywgcmVzcG9uc2UsIFJFU09VUkNFLCBSRUFELAorICAgICAgICAgICAgIlVuaGFuZGxlZCBlcnJvciIpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgLyogaWYgd2UgcmV0dXJuIEVSUk9SIHdlIHNob3VsZCB1bnNldCB0aGUgcmVzcG9uc2Ugb3Vyc2VsdmVzICovCisgICAgaWYgKHJlcyA9PSBHU1RfUlRTUF9FUlJPUikKKyAgICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKHJlc3BvbnNlKTsKKworICAgIHJldHVybiByZXM7CisgIH0KK30KKworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX3NlbmRfY2IgKEdzdFJUU1BFeHRlbnNpb24gKiBleHQsIEdzdFJUU1BNZXNzYWdlICogcmVxdWVzdCwKKyAgICBHc3RSVFNQTWVzc2FnZSAqIHJlc3BvbnNlLCBHc3RSVFNQU3JjICogc3JjKQoreworICByZXR1cm4gZ3N0X3J0c3BzcmNfc2VuZCAoc3JjLCAmc3JjLT5jb25uaW5mbywgcmVxdWVzdCwgcmVzcG9uc2UsIE5VTEwsIE5VTEwpOworfQorCisKKy8qIHBhcnNlIHRoZSByZXNwb25zZSBhbmQgY29sbGVjdCBhbGwgdGhlIHN1cHBvcnRlZCBtZXRob2RzLiBXZSBuZWVkIHRoaXMKKyAqIGluZm9ybWF0aW9uIHNvIHRoYXQgd2UgZG9uJ3QgdHJ5IHRvIHNlbmQgYW4gdW5zdXBwb3J0ZWQgcmVxdWVzdCB0byB0aGUKKyAqIHNlcnZlci4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfcnRzcHNyY19wYXJzZV9tZXRob2RzIChHc3RSVFNQU3JjICogc3JjLCBHc3RSVFNQTWVzc2FnZSAqIHJlc3BvbnNlKQoreworICBHc3RSVFNQSGVhZGVyRmllbGQgZmllbGQ7CisgIGdjaGFyICpyZXNwb3B0aW9uczsKKyAgZ2ludCBpbmR4ID0gMDsKKworICAvKiByZXNldCBzdXBwb3J0ZWQgbWV0aG9kcyAqLworICBzcmMtPm1ldGhvZHMgPSAwOworCisgIC8qIFRyeSBBbGxvdyBIZWFkZXIgZmlyc3QgKi8KKyAgZmllbGQgPSBHU1RfUlRTUF9IRFJfQUxMT1c7CisgIHdoaWxlIChUUlVFKSB7CisgICAgcmVzcG9wdGlvbnMgPSBOVUxMOworICAgIGdzdF9ydHNwX21lc3NhZ2VfZ2V0X2hlYWRlciAocmVzcG9uc2UsIGZpZWxkLCAmcmVzcG9wdGlvbnMsIGluZHgpOworICAgIGlmICghcmVzcG9wdGlvbnMpCisgICAgICBicmVhazsKKworICAgIHNyYy0+bWV0aG9kcyB8PSBnc3RfcnRzcF9vcHRpb25zX2Zyb21fdGV4dCAocmVzcG9wdGlvbnMpOworCisgICAgaW5keCsrOworICB9CisKKyAgaW5keCA9IDA7CisgIGZpZWxkID0gR1NUX1JUU1BfSERSX1BVQkxJQzsKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICByZXNwb3B0aW9ucyA9IE5VTEw7CisgICAgZ3N0X3J0c3BfbWVzc2FnZV9nZXRfaGVhZGVyIChyZXNwb25zZSwgZmllbGQsICZyZXNwb3B0aW9ucywgaW5keCk7CisgICAgaWYgKCFyZXNwb3B0aW9ucykKKyAgICAgIGJyZWFrOworCisgICAgc3JjLT5tZXRob2RzIHw9IGdzdF9ydHNwX29wdGlvbnNfZnJvbV90ZXh0IChyZXNwb3B0aW9ucyk7CisKKyAgICBpbmR4Kys7CisgIH0KKworICBpZiAoc3JjLT5tZXRob2RzID09IDApIHsKKyAgICAvKiBuZWl0aGVyIEFsbG93IG5vciBQdWJsaWMgYXJlIHJlcXVpcmVkLCBhc3N1bWUgdGhlIHNlcnZlciBzdXBwb3J0cworICAgICAqIGF0IGxlYXN0IERFU0NSSUJFLCBTRVRVUCwgd2UgYWx3YXlzIGFzc3VtZSBpdCBzdXBwb3J0cyBQTEFZIGFzCisgICAgICogd2VsbC4gKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb3VsZCBub3QgZ2V0IE9QVElPTlMiKTsKKyAgICBzcmMtPm1ldGhvZHMgPSBHU1RfUlRTUF9ERVNDUklCRSB8IEdTVF9SVFNQX1NFVFVQOworICB9CisgIC8qIGFsd2F5cyBhc3N1bWUgUExBWSwgRklYTUUsIGV4dGVuc2lvbnMgc2hvdWxkIGJlIGFibGUgdG8gb3ZlcnJpZGUKKyAgICogdGhpcyAqLworICBzcmMtPm1ldGhvZHMgfD0gR1NUX1JUU1BfUExBWTsKKyAgLyogYWxzbyBhc3N1bWUgaXQgd2lsbCBzdXBwb3J0IFJhbmdlICovCisgIHNyYy0+c2Vla2FibGUgPSBHX01BWEZMT0FUOworCisgIC8qIHdlIG5lZWQgZGVzY3JpYmUgYW5kIHNldHVwICovCisgIGlmICghKHNyYy0+bWV0aG9kcyAmIEdTVF9SVFNQX0RFU0NSSUJFKSkKKyAgICBnb3RvIG5vX2Rlc2NyaWJlOworICBpZiAoIShzcmMtPm1ldGhvZHMgJiBHU1RfUlRTUF9TRVRVUCkpCisgICAgZ290byBub19zZXR1cDsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK25vX2Rlc2NyaWJlOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwgKE5VTEwpLAorICAgICAgICAoIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IERFU0NSSUJFLiIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX3NldHVwOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwgKE5VTEwpLAorICAgICAgICAoIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IFNFVFVQLiIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogbWFza3MgdG8gYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGhhcmRjb2RlZCBwcm90b2NvbCBvcmRlciBvZiBwcmVmZXJlbmNlCisgKiBpbiBjb2RlIGJlbG93ICovCitzdGF0aWMgY29uc3QgZ3VpbnQgcHJvdG9jb2xfbWFza3NbXSA9IHsKKyAgR1NUX1JUU1BfTE9XRVJfVFJBTlNfVURQLAorICBHU1RfUlRTUF9MT1dFUl9UUkFOU19VRFBfTUNBU1QsCisgIEdTVF9SVFNQX0xPV0VSX1RSQU5TX1RDUCwKKyAgMAorfTsKKworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX2NyZWF0ZV90cmFuc3BvcnRzX3N0cmluZyAoR3N0UlRTUFNyYyAqIHNyYywKKyAgICBHc3RSVFNQTG93ZXJUcmFucyBwcm90b2NvbHMsIEdzdFJUU1BQcm9maWxlIHByb2ZpbGUsIGdjaGFyICoqIHRyYW5zcG9ydHMpCit7CisgIEdzdFJUU1BSZXN1bHQgcmVzOworICBHU3RyaW5nICpyZXN1bHQ7CisgIGdib29sZWFuIGFkZF91ZHBfc3RyOworCisgICp0cmFuc3BvcnRzID0gTlVMTDsKKworICByZXMgPQorICAgICAgZ3N0X3J0c3BfZXh0X2xpc3RfZ2V0X3RyYW5zcG9ydHMgKHNyYy0+ZXh0ZW5zaW9ucywgcHJvdG9jb2xzLCB0cmFuc3BvcnRzKTsKKworICBpZiAocmVzIDwgMCkKKyAgICBnb3RvIGZhaWxlZDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJnb3QgdHJhbnNwb3J0cyAlcyIsIEdTVF9TVFJfTlVMTCAoKnRyYW5zcG9ydHMpKTsKKworICAvKiBleHRlbnNpb24gbGlzdGVkIHRyYW5zcG9ydHMsIHVzZSB0aG9zZSAqLworICBpZiAoKnRyYW5zcG9ydHMgIT0gTlVMTCkKKyAgICByZXR1cm4gR1NUX1JUU1BfT0s7CisKKyAgLyogaXQncyB0aGUgZGVmYXVsdCAqLworICBhZGRfdWRwX3N0ciA9IEZBTFNFOworCisgIC8qIHRoZSBkZWZhdWx0IFJUU1AgdHJhbnNwb3J0cyAqLworICByZXN1bHQgPSBnX3N0cmluZ19uZXcgKCJSVFAiKTsKKworICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICBjYXNlIEdTVF9SVFNQX1BST0ZJTEVfQVZQOgorICAgICAgZ19zdHJpbmdfYXBwZW5kIChyZXN1bHQsICIvQVZQIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9SVFNQX1BST0ZJTEVfU0FWUDoKKyAgICAgIGdfc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiL1NBVlAiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1JUU1BfUFJPRklMRV9BVlBGOgorICAgICAgZ19zdHJpbmdfYXBwZW5kIChyZXN1bHQsICIvQVZQRiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUlRTUF9QUk9GSUxFX1NBVlBGOgorICAgICAgZ19zdHJpbmdfYXBwZW5kIChyZXN1bHQsICIvU0FWUEYiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChwcm90b2NvbHMgJiBHU1RfUlRTUF9MT1dFUl9UUkFOU19VRFApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJhZGRpbmcgVURQIHVuaWNhc3QiKTsKKyAgICBpZiAoYWRkX3VkcF9zdHIpCisgICAgICBnX3N0cmluZ19hcHBlbmQgKHJlc3VsdCwgIi9VRFAiKTsKKyAgICBnX3N0cmluZ19hcHBlbmQgKHJlc3VsdCwgIjt1bmljYXN0O2NsaWVudF9wb3J0PSUldTEtJSV1MiIpOworICB9IGVsc2UgaWYgKHByb3RvY29scyAmIEdTVF9SVFNQX0xPV0VSX1RSQU5TX1VEUF9NQ0FTVCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImFkZGluZyBVRFAgbXVsdGljYXN0Iik7CisgICAgLyogd2UgZG9uJ3QgaGF2ZSB0byBhbGxvY2F0ZSBhbnkgVURQIHBvcnRzIHlldCwgaWYgdGhlIHNlbGVjdGVkIHRyYW5zcG9ydAorICAgICAqIHR1cm5zIG91dCB0byBiZSBtdWx0aWNhc3Qgd2UgY2FuIGNyZWF0ZSB0aGVtIGFuZCBqb2luIHRoZSBtdWx0aWNhc3QKKyAgICAgKiBncm91cCBpbmRpY2F0ZWQgaW4gdGhlIHRyYW5zcG9ydCByZXBseSAqLworICAgIGlmIChhZGRfdWRwX3N0cikKKyAgICAgIGdfc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiL1VEUCIpOworICAgIGdfc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiO211bHRpY2FzdCIpOworICAgIGlmIChzcmMtPm5leHRfcG9ydF9udW0gIT0gMCkgeworICAgICAgaWYgKHNyYy0+Y2xpZW50X3BvcnRfcmFuZ2UubWF4ID4gMCAmJgorICAgICAgICAgIHNyYy0+bmV4dF9wb3J0X251bSA+PSBzcmMtPmNsaWVudF9wb3J0X3JhbmdlLm1heCkKKyAgICAgICAgZ290byBub19wb3J0czsKKworICAgICAgZ19zdHJpbmdfYXBwZW5kX3ByaW50ZiAocmVzdWx0LCAiO2NsaWVudF9wb3J0PSVkLSVkIiwKKyAgICAgICAgICBzcmMtPm5leHRfcG9ydF9udW0sIHNyYy0+bmV4dF9wb3J0X251bSArIDEpOworICAgIH0KKyAgfSBlbHNlIGlmIChwcm90b2NvbHMgJiBHU1RfUlRTUF9MT1dFUl9UUkFOU19UQ1ApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJhZGRpbmcgVENQIik7CisKKyAgICBnX3N0cmluZ19hcHBlbmQgKHJlc3VsdCwgIi9UQ1A7dW5pY2FzdDtpbnRlcmxlYXZlZD0lJWkxLSUlaTIiKTsKKyAgfQorICAqdHJhbnNwb3J0cyA9IGdfc3RyaW5nX2ZyZWUgKHJlc3VsdCwgRkFMU0UpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInByZXBhcmVkIHRyYW5zcG9ydHMgJXMiLCBHU1RfU1RSX05VTEwgKCp0cmFuc3BvcnRzKSk7CisKKyAgcmV0dXJuIEdTVF9SVFNQX09LOworCisgIC8qIEVSUk9SUyAqLworZmFpbGVkOgorICB7CisgICAgR1NUX0VSUk9SICgiZXh0ZW5zaW9uIGdhdmUgZXJyb3IgJWQiLCByZXMpOworICAgIHJldHVybiByZXM7CisgIH0KK25vX3BvcnRzOgorICB7CisgICAgR1NUX0VSUk9SICgibm8gbW9yZSBwb3J0cyBhdmFpbGFibGUiKTsKKyAgICByZXR1cm4gR1NUX1JUU1BfRVJST1I7CisgIH0KK30KKworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX3ByZXBhcmVfdHJhbnNwb3J0cyAoR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwgZ2NoYXIgKiogdHJhbnNwb3J0cywKKyAgICBnaW50IG9yaWdfcnRwcG9ydCwgZ2ludCBvcmlnX3J0Y3Bwb3J0KQoreworICBHc3RSVFNQU3JjICpzcmM7CisgIGdpbnQgbnJfdWRwLCBucl9pbnQ7CisgIGdjaGFyICpuZXh0LCAqcDsKKyAgZ2ludCBydHBwb3J0ID0gMCwgcnRjcHBvcnQgPSAwOworICBHU3RyaW5nICpzdHI7CisKKyAgc3JjID0gc3RyZWFtLT5wYXJlbnQ7CisKKyAgLyogZmluZCBudW1iZXIgb2YgcGxhY2Vob2xkZXJzIGZpcnN0ICovCisgIGlmIChzdHJzdHIgKCp0cmFuc3BvcnRzLCAiJSVpMiIpKQorICAgIG5yX2ludCA9IDI7CisgIGVsc2UgaWYgKHN0cnN0ciAoKnRyYW5zcG9ydHMsICIlJWkxIikpCisgICAgbnJfaW50ID0gMTsKKyAgZWxzZQorICAgIG5yX2ludCA9IDA7CisKKyAgaWYgKHN0cnN0ciAoKnRyYW5zcG9ydHMsICIlJXUyIikpCisgICAgbnJfdWRwID0gMjsKKyAgZWxzZSBpZiAoc3Ryc3RyICgqdHJhbnNwb3J0cywgIiUldTEiKSkKKyAgICBucl91ZHAgPSAxOworICBlbHNlCisgICAgbnJfdWRwID0gMDsKKworICBpZiAobnJfdWRwID09IDAgJiYgbnJfaW50ID09IDApCisgICAgZ290byBkb25lOworCisgIGlmIChucl91ZHAgPiAwKSB7CisgICAgaWYgKCFvcmlnX3J0cHBvcnQgfHwgIW9yaWdfcnRjcHBvcnQpIHsKKyAgICAgIGlmICghZ3N0X3J0c3BzcmNfYWxsb2NfdWRwX3BvcnRzIChzdHJlYW0sICZydHBwb3J0LCAmcnRjcHBvcnQpKQorICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9IGVsc2UgeworICAgICAgcnRwcG9ydCA9IG9yaWdfcnRwcG9ydDsKKyAgICAgIHJ0Y3Bwb3J0ID0gb3JpZ19ydGNwcG9ydDsKKyAgICB9CisgIH0KKworICBzdHIgPSBnX3N0cmluZ19uZXcgKCIiKTsKKyAgcCA9ICp0cmFuc3BvcnRzOworICB3aGlsZSAoKG5leHQgPSBzdHJzdHIgKHAsICIlJSIpKSkgeworICAgIGdfc3RyaW5nX2FwcGVuZF9sZW4gKHN0ciwgcCwgbmV4dCAtIHApOworICAgIGlmIChuZXh0WzJdID09ICd1JykgeworICAgICAgaWYgKG5leHRbM10gPT0gJzEnKQorICAgICAgICBnX3N0cmluZ19hcHBlbmRfcHJpbnRmIChzdHIsICIlZCIsIHJ0cHBvcnQpOworICAgICAgZWxzZSBpZiAobmV4dFszXSA9PSAnMicpCisgICAgICAgIGdfc3RyaW5nX2FwcGVuZF9wcmludGYgKHN0ciwgIiVkIiwgcnRjcHBvcnQpOworICAgIH0KKyAgICBpZiAobmV4dFsyXSA9PSAnaScpIHsKKyAgICAgIGlmIChuZXh0WzNdID09ICcxJykKKyAgICAgICAgZ19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoc3RyLCAiJWQiLCBzcmMtPmZyZWVfY2hhbm5lbCk7CisgICAgICBlbHNlIGlmIChuZXh0WzNdID09ICcyJykKKyAgICAgICAgZ19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoc3RyLCAiJWQiLCBzcmMtPmZyZWVfY2hhbm5lbCArIDEpOworCisgICAgfQorCisgICAgcCA9IG5leHQgKyA0OworICB9CisgIGlmIChzcmMtPnZlcnNpb24gPj0gR1NUX1JUU1BfVkVSU0lPTl8yXzApCisgICAgc3JjLT5mcmVlX2NoYW5uZWwgKz0gMjsKKworICAvKiBhcHBlbmQgZmluYWwgcGFydCAqLworICBnX3N0cmluZ19hcHBlbmQgKHN0ciwgcCk7CisKKyAgZ19mcmVlICgqdHJhbnNwb3J0cyk7CisgICp0cmFuc3BvcnRzID0gZ19zdHJpbmdfZnJlZSAoc3RyLCBGQUxTRSk7CisKK2RvbmU6CisgIHJldHVybiBHU1RfUlRTUF9PSzsKKworICAvKiBFUlJPUlMgKi8KK2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBhbGxvY2F0ZSB1ZHAgcG9ydHMiKTsKKyAgICByZXR1cm4gR1NUX1JUU1BfRVJST1I7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorc2lnbmFsX2dldF9zcnRjcF9wYXJhbXMgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFJUU1BTdHJlYW0gKiBzdHJlYW0pCit7CisgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworCisgIGdfc2lnbmFsX2VtaXQgKHNyYywgZ3N0X3J0c3BzcmNfc2lnbmFsc1tTSUdOQUxfUkVRVUVTVF9SVENQX0tFWV0sIDAsCisgICAgICBzdHJlYW0tPmlkLCAmY2Fwcyk7CisKKyAgaWYgKGNhcHMgIT0gTlVMTCkKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJTUlRQIHBhcmFtZXRlcnMgcmVjZWl2ZWQiKTsKKworICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIEdzdENhcHMgKgorZGVmYXVsdF9zcnRjcF9wYXJhbXMgKHZvaWQpCit7CisgIGd1aW50IGk7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdEJ1ZmZlciAqYnVmOworICBndWludDggKmtleV9kYXRhOworI2RlZmluZSBLRVlfU0laRSAzMAorICBndWludCBkYXRhX3NpemUgPSBHU1RfUk9VTkRfVVBfNCAoS0VZX1NJWkUpOworCisgIC8qIGNyZWF0ZSBhIHJhbmRvbSBrZXkgKi8KKyAga2V5X2RhdGEgPSBnX21hbGxvYyAoZGF0YV9zaXplKTsKKyAgZm9yIChpID0gMDsgaSA8IGRhdGFfc2l6ZTsgaSArPSA0KQorICAgIEdTVF9XUklURV9VSU5UMzJfQkUgKGtleV9kYXRhICsgaSwgZ19yYW5kb21faW50ICgpKTsKKworICBidWYgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChrZXlfZGF0YSwgS0VZX1NJWkUpOworCisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXBwbGljYXRpb24veC1zcnRjcCIsCisgICAgICAic3J0cC1rZXkiLCBHU1RfVFlQRV9CVUZGRVIsIGJ1ZiwKKyAgICAgICJzcnRwLWNpcGhlciIsIEdfVFlQRV9TVFJJTkcsICJhZXMtMTI4LWljbSIsCisgICAgICAic3J0cC1hdXRoIiwgR19UWVBFX1NUUklORywgImhtYWMtc2hhMS04MCIsCisgICAgICAic3J0Y3AtY2lwaGVyIiwgR19UWVBFX1NUUklORywgImFlcy0xMjgtaWNtIiwKKyAgICAgICJzcnRjcC1hdXRoIiwgR19UWVBFX1NUUklORywgImhtYWMtc2hhMS04MCIsIE5VTEwpOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKK3N0YXRpYyBnY2hhciAqCitnc3RfcnRzcHNyY19zdHJlYW1fbWFrZV9rZXltZ210IChHc3RSVFNQU3JjICogc3JjLCBHc3RSVFNQU3RyZWFtICogc3RyZWFtKQoreworICBnY2hhciAqYmFzZTY0LCAqcmVzdWx0ID0gTlVMTDsKKyAgR3N0TUlLRVlNZXNzYWdlICptaWtleV9tc2c7CisKKyAgc3RyZWFtLT5zcnRjcHBhcmFtcyA9IHNpZ25hbF9nZXRfc3J0Y3BfcGFyYW1zIChzcmMsIHN0cmVhbSk7CisgIGlmIChzdHJlYW0tPnNydGNwcGFyYW1zID09IE5VTEwpCisgICAgc3RyZWFtLT5zcnRjcHBhcmFtcyA9IGRlZmF1bHRfc3J0Y3BfcGFyYW1zICgpOworCisgIG1pa2V5X21zZyA9IGdzdF9taWtleV9tZXNzYWdlX25ld19mcm9tX2NhcHMgKHN0cmVhbS0+c3J0Y3BwYXJhbXMpOworICBpZiAobWlrZXlfbXNnKSB7CisgICAgLyogYWRkIHBvbGljeSAnMCcgZm9yIG91ciBTU1JDICovCisgICAgZ3N0X21pa2V5X21lc3NhZ2VfYWRkX2NzX3NydHAgKG1pa2V5X21zZywgMCwgc3RyZWFtLT5zZW5kX3NzcmMsIDApOworCisgICAgYmFzZTY0ID0gZ3N0X21pa2V5X21lc3NhZ2VfYmFzZTY0X2VuY29kZSAobWlrZXlfbXNnKTsKKyAgICBnc3RfbWlrZXlfbWVzc2FnZV91bnJlZiAobWlrZXlfbXNnKTsKKworICAgIGlmIChiYXNlNjQpIHsKKyAgICAgIHJlc3VsdCA9IGdzdF9zZHBfbWFrZV9rZXltZ210IChzdHJlYW0tPmNvbm5pbmZvLmxvY2F0aW9uLCBiYXNlNjQpOworICAgICAgZ19mcmVlIChiYXNlNjQpOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBHc3RSVFNQUmVzdWx0Citnc3RfcnRzcF9zcmNfc2V0dXBfc3RyZWFtX2Zyb21fcmVzcG9uc2UgKEdzdFJUU1BTcmMgKiBzcmMsCisgICAgR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwgR3N0UlRTUE1lc3NhZ2UgKiByZXNwb25zZSwKKyAgICBHc3RSVFNQTG93ZXJUcmFucyAqIHByb3RvY29scywgZ2ludCByZXRyeSwgZ2ludCAqIHJ0cHBvcnQsIGdpbnQgKiBydGNwcG9ydCkKK3sKKyAgZ2NoYXIgKnJlc3B0cmFucyA9IE5VTEw7CisgIEdzdFJUU1BUcmFuc3BvcnQgdHJhbnNwb3J0ID0geyAwIH07CisKKyAgZ3N0X3J0c3BfbWVzc2FnZV9nZXRfaGVhZGVyIChyZXNwb25zZSwgR1NUX1JUU1BfSERSX1RSQU5TUE9SVCwgJnJlc3B0cmFucywgMCk7CisgIGlmICghcmVzcHRyYW5zKSB7CisgICAgZ3N0X3J0c3BzcmNfc3RyZWFtX2ZyZWVfdWRwIChzdHJlYW0pOworICAgIGdvdG8gbm9fdHJhbnNwb3J0OworICB9CisKKyAgLyogcGFyc2UgdHJhbnNwb3J0LCBnbyB0byBuZXh0IHN0cmVhbSBvbiBwYXJzZSBlcnJvciAqLworICBpZiAoZ3N0X3J0c3BfdHJhbnNwb3J0X3BhcnNlIChyZXNwdHJhbnMsICZ0cmFuc3BvcnQpICE9IEdTVF9SVFNQX09LKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJmYWlsZWQgdG8gcGFyc2UgdHJhbnNwb3J0ICVzIiwgcmVzcHRyYW5zKTsKKyAgICByZXR1cm4gR1NUX1JUU1BfRUxBU1Q7CisgIH0KKworICAvKiB1cGRhdGUgYWxsb3dlZCB0cmFuc3BvcnRzIGZvciBvdGhlciBzdHJlYW1zLiBvbmNlIHRoZSB0cmFuc3BvcnQgb2YKKyAgICogb25lIHN0cmVhbSBoYXMgYmVlbiBkZXRlcm1pbmVkLCB3ZSBtYWtlIHN1cmUgdGhhdCBhbGwgb3RoZXIgc3RyZWFtcworICAgKiBhcmUgY29uZmlndXJlZCBpbiB0aGUgc2FtZSB3YXkgKi8KKyAgc3dpdGNoICh0cmFuc3BvcnQubG93ZXJfdHJhbnNwb3J0KSB7CisgICAgY2FzZSBHU1RfUlRTUF9MT1dFUl9UUkFOU19UQ1A6CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzdHJlYW0gJXAgYXMgVENQIGludGVybGVhdmVkIiwgc3RyZWFtKTsKKyAgICAgIGlmIChwcm90b2NvbHMpCisgICAgICAgICpwcm90b2NvbHMgPSBHU1RfUlRTUF9MT1dFUl9UUkFOU19UQ1A7CisgICAgICBzcmMtPmludGVybGVhdmVkID0gVFJVRTsKKyAgICAgIGlmIChzcmMtPnZlcnNpb24gPCBHU1RfUlRTUF9WRVJTSU9OXzJfMCkgeworICAgICAgICAvKiB1cGRhdGUgZnJlZSBjaGFubmVscyAqLworICAgICAgICBzcmMtPmZyZWVfY2hhbm5lbCA9IE1BWCAodHJhbnNwb3J0LmludGVybGVhdmVkLm1pbiwgc3JjLT5mcmVlX2NoYW5uZWwpOworICAgICAgICBzcmMtPmZyZWVfY2hhbm5lbCA9IE1BWCAodHJhbnNwb3J0LmludGVybGVhdmVkLm1heCwgc3JjLT5mcmVlX2NoYW5uZWwpOworICAgICAgICBzcmMtPmZyZWVfY2hhbm5lbCsrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUlRTUF9MT1dFUl9UUkFOU19VRFBfTUNBU1Q6CisgICAgICAvKiBvbmx5IGFsbG93IG11bHRpY2FzdCBmb3Igb3RoZXIgc3RyZWFtcyAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic3RyZWFtICVwIGFzIFVEUCBtdWx0aWNhc3QiLCBzdHJlYW0pOworICAgICAgaWYgKHByb3RvY29scykKKyAgICAgICAgKnByb3RvY29scyA9IEdTVF9SVFNQX0xPV0VSX1RSQU5TX1VEUF9NQ0FTVDsKKyAgICAgIC8qIGlmIHRoZSBzZXJ2ZXIgc2VsZWN0ZWQgb3VyIHBvcnRzLCBpbmNyZW1lbnQgb3VyIGNvdW50ZXJzIHNvIHRoYXQKKyAgICAgICAqIHdlIHNlbGVjdCBhIG5ldyBwb3J0IGxhdGVyICovCisgICAgICBpZiAoc3JjLT5uZXh0X3BvcnRfbnVtID09IHRyYW5zcG9ydC5wb3J0Lm1pbiAmJgorICAgICAgICAgIHNyYy0+bmV4dF9wb3J0X251bSArIDEgPT0gdHJhbnNwb3J0LnBvcnQubWF4KSB7CisgICAgICAgIHNyYy0+bmV4dF9wb3J0X251bSArPSAyOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUlRTUF9MT1dFUl9UUkFOU19VRFA6CisgICAgICAvKiBvbmx5IGFsbG93IHVuaWNhc3QgZm9yIG90aGVyIHN0cmVhbXMgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInN0cmVhbSAlcCBhcyBVRFAgdW5pY2FzdCIsIHN0cmVhbSk7CisgICAgICBpZiAocHJvdG9jb2xzKQorICAgICAgICAqcHJvdG9jb2xzID0gR1NUX1JUU1BfTE9XRVJfVFJBTlNfVURQOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInN0cmVhbSAlcCB1bmtub3duIHRyYW5zcG9ydCAlZCIsIHN0cmVhbSwKKyAgICAgICAgICB0cmFuc3BvcnQubG93ZXJfdHJhbnNwb3J0KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKCFzcmMtPmludGVybGVhdmVkIHx8ICFyZXRyeSkgeworICAgIC8qIG5vdyBjb25maWd1cmUgdGhlIHN0cmVhbSB3aXRoIHRoZSBzZWxlY3RlZCB0cmFuc3BvcnQgKi8KKyAgICBpZiAoIWdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0IChzdHJlYW0sICZ0cmFuc3BvcnQpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsCisgICAgICAgICAgImNvdWxkIG5vdCBjb25maWd1cmUgc3RyZWFtICVwIHRyYW5zcG9ydCwgc2tpcHBpbmcgc3RyZWFtIiwgc3RyZWFtKTsKKyAgICAgIGdvdG8gZG9uZTsKKyAgICB9IGVsc2UgaWYgKHN0cmVhbS0+dWRwc3JjWzBdICYmIHN0cmVhbS0+dWRwc3JjWzFdICYmIHJ0cHBvcnQgJiYgcnRjcHBvcnQpIHsKKyAgICAgIC8qIHJldGFpbiB0aGUgZmlyc3QgYWxsb2NhdGVkIFVEUCBwb3J0IHBhaXIgKi8KKyAgICAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKHN0cmVhbS0+dWRwc3JjWzBdKSwgInBvcnQiLCBydHBwb3J0LCBOVUxMKTsKKyAgICAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKHN0cmVhbS0+dWRwc3JjWzFdKSwgInBvcnQiLCBydGNwcG9ydCwgTlVMTCk7CisgICAgfQorICB9CisgIC8qIHdlIG5lZWQgdG8gYWN0aXZhdGUgYXQgbGVhc3Qgb25lIHN0cmVhbSB3aGVuIHdlIGRldGVjdCBhY3Rpdml0eSAqLworICBzcmMtPm5lZWRfYWN0aXZhdGUgPSBUUlVFOworCisgIC8qIHN0cmVhbSBpcyBzZXR1cCBub3cgKi8KKyAgc3RyZWFtLT5zZXR1cCA9IFRSVUU7CisgIHN0cmVhbS0+d2FpdGluZ19zZXR1cF9yZXNwb25zZSA9IEZBTFNFOworCisgIGlmIChzcmMtPnZlcnNpb24gPj0gR1NUX1JUU1BfVkVSU0lPTl8yXzApIHsKKyAgICBnY2hhciAqcHJvcCwgKm1lZGlhX3Byb3BlcnRpZXM7CisgICAgZ2NoYXIgKipwcm9wczsKKyAgICBnaW50IGk7CisKKyAgICBpZiAoZ3N0X3J0c3BfbWVzc2FnZV9nZXRfaGVhZGVyIChyZXNwb25zZSwgR1NUX1JUU1BfSERSX01FRElBX1BST1BFUlRJRVMsCisgICAgICAgICAgICAmbWVkaWFfcHJvcGVydGllcywgMCkgIT0gR1NUX1JUU1BfT0spIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBXUklURSwgKE5VTEwpLAorICAgICAgICAgICgiRXJyb3I6IE5vIE1FRElBX1BST1BFUlRZIGhlYWRlciBpbiBhIFNFVFVQIHJlcXVlc3QgaW4gUlRTUCAyLjAiCisgICAgICAgICAgICAgICIgLSB0aGlzIGhlYWRlciBpcyBtYW5kYXRvcnkuIikpOworCisgICAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0IChyZXNwb25zZSk7CisgICAgICByZXR1cm4gR1NUX1JUU1BfRVJST1I7CisgICAgfQorCisgICAgcHJvcHMgPSBnX3N0cnNwbGl0IChtZWRpYV9wcm9wZXJ0aWVzLCAiLCIsIC0yKTsKKyAgICBmb3IgKGkgPSAwOyBwcm9wc1tpXTsgaSsrKSB7CisgICAgICBwcm9wID0gcHJvcHNbaV07CisKKyAgICAgIHdoaWxlICgqcHJvcCA9PSAnICcpCisgICAgICAgIHByb3ArKzsKKworICAgICAgaWYgKHN0cnN0ciAocHJvcCwgIlJhbmRvbS1BY2Nlc3MiKSkgeworICAgICAgICBnY2hhciAqKnJhbmRvbV9zZWVrYWJsZV92YWwgPSBnX3N0cnNwbGl0IChwcm9wLCAiPSIsIDIpOworCisgICAgICAgIGlmICghcmFuZG9tX3NlZWthYmxlX3ZhbFsxXSkKKyAgICAgICAgICBzcmMtPnNlZWthYmxlID0gR19NQVhGTE9BVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNyYy0+c2Vla2FibGUgPSBnX2FzY2lpX3N0cnRvZCAocmFuZG9tX3NlZWthYmxlX3ZhbFsxXSwgTlVMTCk7CisKKyAgICAgICAgZ19zdHJmcmVldiAocmFuZG9tX3NlZWthYmxlX3ZhbCk7CisgICAgICB9IGVsc2UgaWYgKCFnX3N0cmNtcDAgKHByb3AsICJOby1TZWVraW5nIikpIHsKKyAgICAgICAgc3JjLT5zZWVrYWJsZSA9IC0xLjA7CisgICAgICB9IGVsc2UgaWYgKCFnX3N0cmNtcDAgKHByb3AsICJCZWdpbm5pbmctT25seSIpKSB7CisgICAgICAgIHNyYy0+c2Vla2FibGUgPSAwLjA7CisgICAgICB9CisgICAgfQorCisgICAgZ19zdHJmcmVldiAocHJvcHMpOworICB9CisKK2RvbmU6CisgIC8qIGNsZWFuIHVwIG91ciB0cmFuc3BvcnQgc3RydWN0ICovCisgIGdzdF9ydHNwX3RyYW5zcG9ydF9pbml0ICgmdHJhbnNwb3J0KTsKKyAgLyogY2xlYW4gdXAgdXNlZCBSVFNQIG1lc3NhZ2VzICovCisgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKHJlc3BvbnNlKTsKKworICByZXR1cm4gR1NUX1JUU1BfT0s7CisKK25vX3RyYW5zcG9ydDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAoIlNlcnZlciBkaWQgbm90IHNlbGVjdCB0cmFuc3BvcnQuIikpOworCisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAocmVzcG9uc2UpOworICAgIHJldHVybiBHU1RfUlRTUF9FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgR3N0UlRTUFJlc3VsdAorZ3N0X3J0c3BzcmNfc2V0dXBfc3RyZWFtc19lbmQgKEdzdFJUU1BTcmMgKiBzcmMsIGdib29sZWFuIGFzeW5jKQoreworICBHTGlzdCAqdG1wOworICBHc3RSVFNQQ29ubkluZm8gKmNvbm5pbmZvOworCisgIGdfYXNzZXJ0IChzcmMtPnZlcnNpb24gPj0gR1NUX1JUU1BfVkVSU0lPTl8yXzApOworCisgIGNvbm5pbmZvID0gJnNyYy0+Y29ubmluZm87CisgIGZvciAodG1wID0gc3JjLT5zdHJlYW1zOyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkgeworICAgIEdzdFJUU1BTdHJlYW0gKnN0cmVhbSA9IChHc3RSVFNQU3RyZWFtICopIHRtcC0+ZGF0YTsKKyAgICBHc3RSVFNQTWVzc2FnZSByZXNwb25zZSA9IHsgMCwgfTsKKworICAgIGlmICghc3RyZWFtLT53YWl0aW5nX3NldHVwX3Jlc3BvbnNlKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoIXNyYy0+Y29ubmluZm8uY29ubmVjdGlvbikKKyAgICAgIGNvbm5pbmZvID0gJigoR3N0UlRTUFN0cmVhbSAqKSB0bXAtPmRhdGEpLT5jb25uaW5mbzsKKworICAgIGdzdF9ydHNwX3NyY19yZWNlaXZlX3Jlc3BvbnNlIChzcmMsIGNvbm5pbmZvLCAmcmVzcG9uc2UsIE5VTEwpOworCisgICAgZ3N0X3J0c3Bfc3JjX3NldHVwX3N0cmVhbV9mcm9tX3Jlc3BvbnNlIChzcmMsIHN0cmVhbSwKKyAgICAgICAgJnJlc3BvbnNlLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKyAgfQorCisgIHJldHVybiBHU1RfUlRTUF9PSzsKK30KKworLyogUGVyZm9ybSB0aGUgU0VUVVAgcmVxdWVzdCBmb3IgYWxsIHRoZSBzdHJlYW1zLgorICoKKyAqIFdlIGFzayB0aGUgc2VydmVyIGZvciBhIHNwZWNpZmljIHRyYW5zcG9ydCwgd2hpY2ggaW5pdGlhbGx5IGluY2x1ZGVzIGFsbCB0aGUKKyAqIG9uZXMgd2UgY2FuIHN1cHBvcnQgKFVEUC9UQ1AvTVVMVElDQVNUKS4gRm9yIHRoZSBVRFAgdHJhbnNwb3J0IHdlIGFsbG9jYXRlCisgKiB0d28gbG9jYWwgVURQIHBvcnRzIHRoYXQgd2Ugc2VuZCB0byB0aGUgc2VydmVyLgorICoKKyAqIE9uY2UgdGhlIHNlcnZlciByZXBsaWVkIHdpdGggYSB0cmFuc3BvcnQsIHdlIGNvbmZpZ3VyZSB0aGUgb3RoZXIgc3RyZWFtcworICogd2l0aCB0aGUgc2FtZSB0cmFuc3BvcnQuCisgKgorICogSW4gY2FzZSBzZXR1cCByZXF1ZXN0IGFyZSBub3QgcGlwZWxpbmVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYWxzbyBjb25maWd1cmUgdGhlCisgKiBzdHJlYW0gZm9yIHRoZSBzZWxlY3RlZCB0cmFuc3BvcnQsICogd2hpY2ggYmFzaWNhbGx5IG1lYW5zIGNyZWF0aW5nIHRoZSBwaXBlbGluZS4KKyAqIE90aGVyd2lzZSwgdGhlIGZpcnN0IHN0cmVhbSBpcyBzZXR1cCByaWdodCBhd2F5IGZyb20gdGhlIHJlcGx5IGFuZCBhCisgKiBDTURfRklOQUxJWkVfU0VUVVAgY29tbWFuZCBpcyBzZXQgZm9yIHRoZSBzdHJlYW0gcGlwZWxpbmVzIHRvIGhhcHBlbiBvbiB0aGUKKyAqIHJlbWFpbmluZyBzdHJlYW1zIGZyb20gdGhlIFJUU1AgdGhyZWFkLgorICovCitzdGF0aWMgR3N0UlRTUFJlc3VsdAorZ3N0X3J0c3BzcmNfc2V0dXBfc3RyZWFtc19zdGFydCAoR3N0UlRTUFNyYyAqIHNyYywgZ2Jvb2xlYW4gYXN5bmMpCit7CisgIEdMaXN0ICp3YWxrOworICBHc3RSVFNQUmVzdWx0IHJlcyA9IEdTVF9SVFNQX0VSUk9SOworICBHc3RSVFNQTWVzc2FnZSByZXF1ZXN0ID0geyAwIH07CisgIEdzdFJUU1BNZXNzYWdlIHJlc3BvbnNlID0geyAwIH07CisgIEdzdFJUU1BTdHJlYW0gKnN0cmVhbSA9IE5VTEw7CisgIEdzdFJUU1BMb3dlclRyYW5zIHByb3RvY29sczsKKyAgR3N0UlRTUFN0YXR1c0NvZGUgY29kZTsKKyAgZ2Jvb2xlYW4gdW5zdXBwb3J0ZWRfcmVhbCA9IEZBTFNFOworICBnaW50IHJ0cHBvcnQsIHJ0Y3Bwb3J0OworICBHc3RSVFNQVXJsICp1cmw7CisgIGdjaGFyICpodmFsOworICBnY2hhciAqcGlwZWxpbmVkX3JlcXVlc3RfaWQgPSBOVUxMOworCisgIGlmIChzcmMtPmNvbm5pbmZvLmNvbm5lY3Rpb24pIHsKKyAgICB1cmwgPSBnc3RfcnRzcF9jb25uZWN0aW9uX2dldF91cmwgKHNyYy0+Y29ubmluZm8uY29ubmVjdGlvbik7CisgICAgLyogd2UgaW5pdGlhbGx5IGFsbG93IGFsbCBjb25maWd1cmVkIGxvd2VyIHRyYW5zcG9ydHMuIGJhc2VkIG9uIHRoZSBVUkwKKyAgICAgKiB0cmFuc3BvcnRzIGFuZCB0aGUgcmVwbGllcyBmcm9tIHRoZSBzZXJ2ZXIgd2UgbmFycm93IHRoZW0gZG93bi4gKi8KKyAgICBwcm90b2NvbHMgPSB1cmwtPnRyYW5zcG9ydHMgJiBzcmMtPmN1cl9wcm90b2NvbHM7CisgIH0gZWxzZSB7CisgICAgdXJsID0gTlVMTDsKKyAgICBwcm90b2NvbHMgPSBzcmMtPmN1cl9wcm90b2NvbHM7CisgIH0KKworICBpZiAocHJvdG9jb2xzID09IDApCisgICAgZ290byBub19wcm90b2NvbHM7CisKKyAgLyogcmVzZXQgc29tZSBzdGF0ZSAqLworICBzcmMtPmZyZWVfY2hhbm5lbCA9IDA7CisgIHNyYy0+aW50ZXJsZWF2ZWQgPSBGQUxTRTsKKyAgc3JjLT5uZWVkX2FjdGl2YXRlID0gRkFMU0U7CisgIC8qIGtlZXAgdHJhY2sgb2YgbmV4dCBwb3J0IG51bWJlciwgMCBpcyByYW5kb20gKi8KKyAgc3JjLT5uZXh0X3BvcnRfbnVtID0gc3JjLT5jbGllbnRfcG9ydF9yYW5nZS5taW47CisgIHJ0cHBvcnQgPSBydGNwcG9ydCA9IDA7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHNyYy0+c3RyZWFtcyA9PSBOVUxMKSkKKyAgICBnb3RvIG5vX3N0cmVhbXM7CisKKyAgZm9yICh3YWxrID0gc3JjLT5zdHJlYW1zOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRTUENvbm5JbmZvICpjb25uaW5mbzsKKyAgICBnY2hhciAqdHJhbnNwb3J0czsKKyAgICBnaW50IHJldHJ5ID0gMDsKKyAgICBndWludCBtYXNrID0gMDsKKyAgICBnYm9vbGVhbiBzZWxlY3RlZDsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgc3RyZWFtID0gKEdzdFJUU1BTdHJlYW0gKikgd2Fsay0+ZGF0YTsKKworICAgIGNhcHMgPSBzdHJlYW1fZ2V0X2NhcHNfZm9yX3B0IChzdHJlYW0sIHN0cmVhbS0+ZGVmYXVsdF9wdCk7CisgICAgaWYgKGNhcHMgPT0gTlVMTCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic2tpcHBpbmcgc3RyZWFtICVwLCBubyBjYXBzIiwgc3RyZWFtKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChzdHJlYW0tPnNraXBwZWQpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNraXBwaW5nIHN0cmVhbSAlcCIsIHN0cmVhbSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvKiBzZWUgaWYgd2UgbmVlZCB0byBjb25maWd1cmUgdGhpcyBzdHJlYW0gKi8KKyAgICBpZiAoIWdzdF9ydHNwX2V4dF9saXN0X2NvbmZpZ3VyZV9zdHJlYW0gKHNyYy0+ZXh0ZW5zaW9ucywgY2FwcykpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNraXBwaW5nIHN0cmVhbSAlcCwgZGlzYWJsZWQgYnkgZXh0ZW5zaW9uIiwKKyAgICAgICAgICBzdHJlYW0pOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgZ19zaWduYWxfZW1pdCAoc3JjLCBnc3RfcnRzcHNyY19zaWduYWxzW1NJR05BTF9TRUxFQ1RfU1RSRUFNXSwgMCwKKyAgICAgICAgc3RyZWFtLT5pZCwgY2FwcywgJnNlbGVjdGVkKTsKKyAgICBpZiAoIXNlbGVjdGVkKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJza2lwcGluZyBzdHJlYW0gJXAsIGRpc2FibGVkIGJ5IHNpZ25hbCIsIHN0cmVhbSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvKiBtZXJnZS9vdmVyd3JpdGUgZ2xvYmFsIGNhcHMgKi8KKyAgICBpZiAoY2FwcykgeworICAgICAgZ3VpbnQgaiwgbnVtOworICAgICAgR3N0U3RydWN0dXJlICpzOworCisgICAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgICAgIG51bSA9IGdzdF9zdHJ1Y3R1cmVfbl9maWVsZHMgKHNyYy0+cHJvcHMpOworICAgICAgZm9yIChqID0gMDsgaiA8IG51bTsgaisrKSB7CisgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lOworICAgICAgICBjb25zdCBHVmFsdWUgKnZhbDsKKworICAgICAgICBuYW1lID0gZ3N0X3N0cnVjdHVyZV9udGhfZmllbGRfbmFtZSAoc3JjLT5wcm9wcywgaik7CisgICAgICAgIHZhbCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzcmMtPnByb3BzLCBuYW1lKTsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKHMsIG5hbWUsIHZhbCk7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY29waWVkICVzIiwgbmFtZSk7CisgICAgICB9CisgICAgfQorCisgICAgLyogc2tpcCBzZXR1cCBpZiB3ZSBoYXZlIG5vIFVSTCBmb3IgaXQgKi8KKyAgICBpZiAoc3RyZWFtLT5jb25uaW5mby5sb2NhdGlvbiA9PSBOVUxMKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJza2lwcGluZyBzdHJlYW0gJXAsIG5vIHNldHVwIiwgc3RyZWFtKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChzcmMtPmNvbm5pbmZvLmNvbm5lY3Rpb24gPT0gTlVMTCkgeworICAgICAgaWYgKCFnc3RfcnRzcF9jb25uaW5mb19jb25uZWN0IChzcmMsICZzdHJlYW0tPmNvbm5pbmZvLCBhc3luYykpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic2tpcHBpbmcgc3RyZWFtICVwLCBmYWlsZWQgdG8gY29ubmVjdCIsIHN0cmVhbSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgY29ubmluZm8gPSAmc3RyZWFtLT5jb25uaW5mbzsKKyAgICB9IGVsc2UgeworICAgICAgY29ubmluZm8gPSAmc3JjLT5jb25uaW5mbzsKKyAgICB9CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZG9pbmcgc2V0dXAgb2Ygc3RyZWFtICVwIHdpdGggJXMiLCBzdHJlYW0sCisgICAgICAgIHN0cmVhbS0+Y29ubmluZm8ubG9jYXRpb24pOworCisgICAgLyogaWYgd2UgaGF2ZSBhIG11bHRpY2FzdCBjb25uZWN0aW9uLCBvbmx5IHN1Z2dlc3QgbXVsdGljYXN0IGZyb20gbm93IG9uICovCisgICAgaWYgKHN0cmVhbS0+aXNfbXVsdGljYXN0KQorICAgICAgcHJvdG9jb2xzICY9IEdTVF9SVFNQX0xPV0VSX1RSQU5TX1VEUF9NQ0FTVDsKKworICBuZXh0X3Byb3RvY29sOgorICAgIC8qIGZpcnN0IHNlbGVjdGFibGUgcHJvdG9jb2wgKi8KKyAgICB3aGlsZSAocHJvdG9jb2xfbWFza3NbbWFza10gJiYgIShwcm90b2NvbHMgJiBwcm90b2NvbF9tYXNrc1ttYXNrXSkpCisgICAgICBtYXNrKys7CisgICAgaWYgKCFwcm90b2NvbF9tYXNrc1ttYXNrXSkKKyAgICAgIGdvdG8gbm9fcHJvdG9jb2xzOworCisgIHJldHJ5OgorICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInByb3RvY29scyA9IDB4JXgsIHByb3RvY29sIG1hc2sgPSAweCV4IiwgcHJvdG9jb2xzLAorICAgICAgICBwcm90b2NvbF9tYXNrc1ttYXNrXSk7CisgICAgLyogY3JlYXRlIGEgc3RyaW5nIHdpdGggZmlyc3QgdHJhbnNwb3J0IGluIGxpbmUgKi8KKyAgICB0cmFuc3BvcnRzID0gTlVMTDsKKyAgICByZXMgPSBnc3RfcnRzcHNyY19jcmVhdGVfdHJhbnNwb3J0c19zdHJpbmcgKHNyYywKKyAgICAgICAgcHJvdG9jb2xzICYgcHJvdG9jb2xfbWFza3NbbWFza10sIHN0cmVhbS0+cHJvZmlsZSwgJnRyYW5zcG9ydHMpOworICAgIGlmIChyZXMgPCAwIHx8IHRyYW5zcG9ydHMgPT0gTlVMTCkKKyAgICAgIGdvdG8gc2V0dXBfdHJhbnNwb3J0X2ZhaWxlZDsKKworICAgIGlmIChzdHJsZW4gKHRyYW5zcG9ydHMpID09IDApIHsKKyAgICAgIGdfZnJlZSAodHJhbnNwb3J0cyk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJubyB0cmFuc3BvcnRzIGZvdW5kIik7CisgICAgICBtYXNrKys7CisgICAgICBnb3RvIG5leHRfcHJvdG9jb2w7CisgICAgfQorCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicmVwbGFjZSBwb3J0cyBpbiAlcyIsIEdTVF9TVFJfTlVMTCAodHJhbnNwb3J0cykpOworCisgICAgLyogcmVwbGFjZSBwbGFjZWhvbGRlcnMgd2l0aCByZWFsIHZhbHVlcywgdGhpcyBmdW5jdGlvbiB3aWxsIG9wdGlvbmFsbHkKKyAgICAgKiBhbGxvY2F0ZSBVRFAgcG9ydHMgYW5kIG90aGVyIGluZm8gbmVlZGVkIHRvIGV4ZWN1dGUgdGhlIHNldHVwIHJlcXVlc3QgKi8KKyAgICByZXMgPSBnc3RfcnRzcHNyY19wcmVwYXJlX3RyYW5zcG9ydHMgKHN0cmVhbSwgJnRyYW5zcG9ydHMsCisgICAgICAgIHJldHJ5ID4gMCA/IHJ0cHBvcnQgOiAwLCByZXRyeSA+IDAgPyBydGNwcG9ydCA6IDApOworICAgIGlmIChyZXMgPCAwKSB7CisgICAgICBnX2ZyZWUgKHRyYW5zcG9ydHMpOworICAgICAgZ290byBzZXR1cF90cmFuc3BvcnRfZmFpbGVkOworICAgIH0KKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInRyYW5zcG9ydCBpcyBub3cgJXMiLCBHU1RfU1RSX05VTEwgKHRyYW5zcG9ydHMpKTsKKyAgICAvKiBjcmVhdGUgU0VUVVAgcmVxdWVzdCAqLworICAgIHJlcyA9CisgICAgICAgIGdzdF9ydHNwc3JjX2luaXRfcmVxdWVzdCAoc3JjLCAmcmVxdWVzdCwgR1NUX1JUU1BfU0VUVVAsCisgICAgICAgIHN0cmVhbS0+Y29ubmluZm8ubG9jYXRpb24pOworICAgIGlmIChyZXMgPCAwKSB7CisgICAgICBnX2ZyZWUgKHRyYW5zcG9ydHMpOworICAgICAgZ290byBjcmVhdGVfcmVxdWVzdF9mYWlsZWQ7CisgICAgfQorCisgICAgaWYgKHNyYy0+dmVyc2lvbiA+PSBHU1RfUlRTUF9WRVJTSU9OXzJfMCkgeworICAgICAgaWYgKCFwaXBlbGluZWRfcmVxdWVzdF9pZCkKKyAgICAgICAgcGlwZWxpbmVkX3JlcXVlc3RfaWQgPSBnX3N0cmR1cF9wcmludGYgKCIlZCIsCisgICAgICAgICAgICBnX3JhbmRvbV9pbnRfcmFuZ2UgKDAsIEdfTUFYSU5UMzIpKTsKKworICAgICAgZ3N0X3J0c3BfbWVzc2FnZV9hZGRfaGVhZGVyICgmcmVxdWVzdCwgR1NUX1JUU1BfSERSX1BJUEVMSU5FRF9SRVFVRVNUUywKKyAgICAgICAgICBwaXBlbGluZWRfcmVxdWVzdF9pZCk7CisgICAgICBnc3RfcnRzcF9tZXNzYWdlX2FkZF9oZWFkZXIgKCZyZXF1ZXN0LCBHU1RfUlRTUF9IRFJfQUNDRVBUX1JBTkdFUywKKyAgICAgICAgICAibnB0LCBjbG9jaywgc21wdGUsIGNsb2NrIik7CisgICAgfQorCisgICAgLyogc2VsZWN0IHRyYW5zcG9ydCAqLworICAgIGdzdF9ydHNwX21lc3NhZ2VfdGFrZV9oZWFkZXIgKCZyZXF1ZXN0LCBHU1RfUlRTUF9IRFJfVFJBTlNQT1JULCB0cmFuc3BvcnRzKTsKKworICAgIC8qIHNldCB1cCBrZXlzICovCisgICAgaWYgKHN0cmVhbS0+cHJvZmlsZSA9PSBHU1RfUlRTUF9QUk9GSUxFX1NBVlAgfHwKKyAgICAgICAgc3RyZWFtLT5wcm9maWxlID09IEdTVF9SVFNQX1BST0ZJTEVfU0FWUEYpIHsKKyAgICAgIGh2YWwgPSBnc3RfcnRzcHNyY19zdHJlYW1fbWFrZV9rZXltZ210IChzcmMsIHN0cmVhbSk7CisgICAgICBnc3RfcnRzcF9tZXNzYWdlX3Rha2VfaGVhZGVyICgmcmVxdWVzdCwgR1NUX1JUU1BfSERSX0tFWU1HTVQsIGh2YWwpOworICAgIH0KKworICAgIC8qIGlmIHRoZSB1c2VyIHdhbnRzIGEgbm9uIGRlZmF1bHQgUlRQIHBhY2tldCBzaXplIHdlIGFkZCB0aGUgYmxvY2tzaXplCisgICAgICogcGFyYW1ldGVyICovCisgICAgaWYgKHNyYy0+cnRwX2Jsb2Nrc2l6ZSA+IDApIHsKKyAgICAgIGh2YWwgPSBnX3N0cmR1cF9wcmludGYgKCIlZCIsIHNyYy0+cnRwX2Jsb2Nrc2l6ZSk7CisgICAgICBnc3RfcnRzcF9tZXNzYWdlX3Rha2VfaGVhZGVyICgmcmVxdWVzdCwgR1NUX1JUU1BfSERSX0JMT0NLU0laRSwgaHZhbCk7CisgICAgfQorCisgICAgaWYgKGFzeW5jKQorICAgICAgR1NUX0VMRU1FTlRfUFJPR1JFU1MgKHNyYywgQ09OVElOVUUsICJyZXF1ZXN0IiwgKCJTRVRVUCBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICBzdHJlYW0tPmlkKSk7CisKKyAgICAvKiBoYW5kbGUgdGhlIGNvZGUgb3Vyc2VsdmVzICovCisgICAgcmVzID0KKyAgICAgICAgZ3N0X3J0c3BzcmNfc2VuZCAoc3JjLCBjb25uaW5mbywgJnJlcXVlc3QsCisgICAgICAgIHBpcGVsaW5lZF9yZXF1ZXN0X2lkID8gTlVMTCA6ICZyZXNwb25zZSwgJmNvZGUsIE5VTEwpOworICAgIGlmIChyZXMgPCAwKQorICAgICAgZ290byBzZW5kX2Vycm9yOworCisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICBjYXNlIEdTVF9SVFNQX1NUU19PSzoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9SVFNQX1NUU19VTlNVUFBPUlRFRF9UUkFOU1BPUlQ6CisgICAgICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZyZXF1ZXN0KTsKKyAgICAgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJnJlc3BvbnNlKTsKKyAgICAgICAgLyogY2xlYW51cCBvZiBsZWZ0b3ZlciB0cmFuc3BvcnQgKi8KKyAgICAgICAgZ3N0X3J0c3BzcmNfc3RyZWFtX2ZyZWVfdWRwIChzdHJlYW0pOworICAgICAgICAvKiBNUyBXTVNlcnZlciBSVFNQIE1VU1QgdXNlIHNhbWUgVURQIHBhaXIgaW4gYWxsIFNFVFVQIHJlcXVlc3RzOworICAgICAgICAgKiB3ZSBtaWdodCBiZSBpbiB0aGlzIGNhc2UgKi8KKyAgICAgICAgaWYgKHN0cmVhbS0+Y29udGFpbmVyICYmIHJ0cHBvcnQgJiYgcnRjcHBvcnQgJiYgIXJldHJ5KSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicmV0cnlpbmcgd2l0aCBvcmlnaW5hbCBwb3J0IHBhaXIgJXUtJXUiLAorICAgICAgICAgICAgICBydHBwb3J0LCBydGNwcG9ydCk7CisgICAgICAgICAgcmV0cnkrKzsKKyAgICAgICAgICBnb3RvIHJldHJ5OworICAgICAgICB9CisgICAgICAgIC8qIHRoaXMgdHJhbnNwb3J0IGRpZCBub3QgZ28gZG93biB3ZWxsLCBidXQgd2UgbWF5IGhhdmUgb3RoZXJzIHRvIHRyeQorICAgICAgICAgKiB0aGF0IHdlIGRpZCBub3Qgc2VuZCB5ZXQsIHRyeSB0aG9zZSBhbmQgb25seSBnaXZlIHVwIHRoZW4KKyAgICAgICAgICogYnV0IG5vdCB3aXRob3V0IGNoZWNraW5nIGZvciBsb3N0IGNhdXNlL2V4dGVuc2lvbiBzbyB3ZSBjYW4KKyAgICAgICAgICogcG9zdCBhIG5pY2VyL21vcmUgdXNlZnVsIGVycm9yIG1lc3NhZ2UgbGF0ZXIgKi8KKyAgICAgICAgaWYgKCF1bnN1cHBvcnRlZF9yZWFsKQorICAgICAgICAgIHVuc3VwcG9ydGVkX3JlYWwgPSBzdHJlYW0tPmlzX3JlYWw7CisgICAgICAgIC8qIHNlbGVjdCBuZXh0IGF2YWlsYWJsZSBwcm90b2NvbCwgZ2l2ZSB1cCBvbiB0aGlzIHN0cmVhbSBpZiBub25lICovCisgICAgICAgIG1hc2srKzsKKyAgICAgICAgd2hpbGUgKHByb3RvY29sX21hc2tzW21hc2tdICYmICEocHJvdG9jb2xzICYgcHJvdG9jb2xfbWFza3NbbWFza10pKQorICAgICAgICAgIG1hc2srKzsKKyAgICAgICAgaWYgKCFwcm90b2NvbF9tYXNrc1ttYXNrXSB8fCB1bnN1cHBvcnRlZF9yZWFsKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBlbHNlCisgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIGNsZWFudXAgb2YgbGVmdG92ZXIgdHJhbnNwb3J0IGFuZCBtb3ZlIHRvIHRoZSBuZXh0IHN0cmVhbSAqLworICAgICAgICBnc3RfcnRzcHNyY19zdHJlYW1fZnJlZV91ZHAgKHN0cmVhbSk7CisgICAgICAgIGdvdG8gcmVzcG9uc2VfZXJyb3I7CisgICAgfQorCisKKyAgICBpZiAoIXBpcGVsaW5lZF9yZXF1ZXN0X2lkKSB7CisgICAgICAvKiBwYXJzZSByZXNwb25zZSB0cmFuc3BvcnQgKi8KKyAgICAgIHJlcyA9IGdzdF9ydHNwX3NyY19zZXR1cF9zdHJlYW1fZnJvbV9yZXNwb25zZSAoc3JjLCBzdHJlYW0sCisgICAgICAgICAgJnJlc3BvbnNlLCAmcHJvdG9jb2xzLCByZXRyeSwgJnJ0cHBvcnQsICZydGNwcG9ydCk7CisgICAgICBzd2l0Y2ggKHJlcykgeworICAgICAgICBjYXNlIEdTVF9SVFNQX0VSUk9SOgorICAgICAgICAgIGdvdG8gY2xlYW51cF9lcnJvcjsKKyAgICAgICAgY2FzZSBHU1RfUlRTUF9FTEFTVDoKKyAgICAgICAgICBnb3RvIHJldHJ5OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzdHJlYW0tPndhaXRpbmdfc2V0dXBfcmVzcG9uc2UgPSBUUlVFOworICAgICAgLyogd2UgbmVlZCB0byBhY3RpdmF0ZSBhdCBsZWFzdCBvbmUgc3RyZWFtIHdoZW4gd2UgZGV0ZWN0IGFjdGl2aXR5ICovCisgICAgICBzcmMtPm5lZWRfYWN0aXZhdGUgPSBUUlVFOworICAgIH0KKworICAgIHsKKyAgICAgIEdMaXN0ICpza2lwID0gd2FsazsKKworICAgICAgd2hpbGUgKFRSVUUpIHsKKyAgICAgICAgR3N0UlRTUFN0cmVhbSAqc3NraXA7CisKKyAgICAgICAgc2tpcCA9IGdfbGlzdF9uZXh0IChza2lwKTsKKyAgICAgICAgaWYgKHNraXAgPT0gTlVMTCkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBzc2tpcCA9IChHc3RSVFNQU3RyZWFtICopIHNraXAtPmRhdGE7CisKKyAgICAgICAgLyogc2tpcCBhbGwgc3RyZWFtcyB3aXRoIHRoZSBzYW1lIGNvbnRyb2wgdXJsICovCisgICAgICAgIGlmIChnX3N0cl9lcXVhbCAoc3RyZWFtLT5jb25uaW5mby5sb2NhdGlvbiwgc3NraXAtPmNvbm5pbmZvLmxvY2F0aW9uKSkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImZvdW5kIHN0cmVhbSAlcCB3aXRoIHNhbWUgY29udHJvbCAlcyIsCisgICAgICAgICAgICAgIHNza2lwLCBzc2tpcC0+Y29ubmluZm8ubG9jYXRpb24pOworICAgICAgICAgIHNza2lwLT5za2lwcGVkID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVxdWVzdCk7CisgIH0KKworICBpZiAocGlwZWxpbmVkX3JlcXVlc3RfaWQpIHsKKyAgICBnc3RfcnRzcHNyY19zZXR1cF9zdHJlYW1zX2VuZCAoc3JjLCBUUlVFKTsKKyAgfQorCisgIC8qIHN0b3JlIHRoZSB0cmFuc3BvcnQgcHJvdG9jb2wgdGhhdCB3YXMgY29uZmlndXJlZCAqLworICBzcmMtPmN1cl9wcm90b2NvbHMgPSBwcm90b2NvbHM7CisKKyAgZ3N0X3J0c3BfZXh0X2xpc3Rfc3RyZWFtX3NlbGVjdCAoc3JjLT5leHRlbnNpb25zLCB1cmwpOworCisgIGlmIChwaXBlbGluZWRfcmVxdWVzdF9pZCkKKyAgICBnX2ZyZWUgKHBpcGVsaW5lZF9yZXF1ZXN0X2lkKTsKKworICAvKiBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGFjdGl2YXRlLCBlcnJvciBvdXQgKi8KKyAgaWYgKCFzcmMtPm5lZWRfYWN0aXZhdGUpCisgICAgZ290byBub3RoaW5nX3RvX2FjdGl2YXRlOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitub19wcm90b2NvbHM6CisgIHsKKyAgICAvKiBubyB0cmFuc3BvcnQgcG9zc2libGUsIHBvc3QgYW4gZXJyb3IgYW5kIHN0b3AgKi8KKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgUkVBRCwgKE5VTEwpLAorICAgICAgICAoIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciwgbm8gcHJvdG9jb2xzIGxlZnQiKSk7CisgICAgcmV0dXJuIEdTVF9SVFNQX0VSUk9SOworICB9Citub19zdHJlYW1zOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgiU0RQIGNvbnRhaW5zIG5vIHN0cmVhbXMiKSk7CisgICAgcmV0dXJuIEdTVF9SVFNQX0VSUk9SOworICB9CitjcmVhdGVfcmVxdWVzdF9mYWlsZWQ6CisgIHsKKyAgICBnY2hhciAqc3RyID0gZ3N0X3J0c3Bfc3RycmVzdWx0IChyZXMpOworCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgTElCUkFSWSwgSU5JVCwgKE5VTEwpLAorICAgICAgICAoIkNvdWxkIG5vdCBjcmVhdGUgcmVxdWVzdC4gKCVzKSIsIHN0cikpOworICAgIGdfZnJlZSAoc3RyKTsKKyAgICBnb3RvIGNsZWFudXBfZXJyb3I7CisgIH0KK3NldHVwX3RyYW5zcG9ydF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJDb3VsZCBub3Qgc2V0dXAgdHJhbnNwb3J0LiIpKTsKKyAgICByZXMgPSBHU1RfUlRTUF9FUlJPUjsKKyAgICBnb3RvIGNsZWFudXBfZXJyb3I7CisgIH0KK3Jlc3BvbnNlX2Vycm9yOgorICB7CisgICAgY29uc3QgZ2NoYXIgKnN0ciA9IGdzdF9ydHNwX3N0YXR1c19hc190ZXh0IChjb2RlKTsKKworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBXUklURSwgKE5VTEwpLAorICAgICAgICAoIkVycm9yICglZCk6ICVzIiwgY29kZSwgR1NUX1NUUl9OVUxMIChzdHIpKSk7CisgICAgcmVzID0gR1NUX1JUU1BfRVJST1I7CisgICAgZ290byBjbGVhbnVwX2Vycm9yOworICB9CitzZW5kX2Vycm9yOgorICB7CisgICAgZ2NoYXIgKnN0ciA9IGdzdF9ydHNwX3N0cnJlc3VsdCAocmVzKTsKKworICAgIGlmIChyZXMgIT0gR1NUX1JUU1BfRUlOVFIpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBXUklURSwgKE5VTEwpLAorICAgICAgICAgICgiQ291bGQgbm90IHNlbmQgbWVzc2FnZS4gKCVzKSIsIHN0cikpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgInNlbmQgaW50ZXJydXB0ZWQiKTsKKyAgICB9CisgICAgZ19mcmVlIChzdHIpOworICAgIGdvdG8gY2xlYW51cF9lcnJvcjsKKyAgfQorbm90aGluZ190b19hY3RpdmF0ZToKKyAgeworICAgIC8qIG5vbmUgb2YgdGhlIGF2YWlsYWJsZSBlcnJvciBjb2RlcyBpcyByZWFsbHkgcmlnaHQgLi4gKi8KKyAgICBpZiAodW5zdXBwb3J0ZWRfcmVhbCkgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgU1RSRUFNLCBDT0RFQ19OT1RfRk9VTkQsCisgICAgICAgICAgKF8oIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgIgorICAgICAgICAgICAgICAgICAgIkdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iKSksCisgICAgICAgICAgKE5VTEwpKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgU1RSRUFNLCBDT0RFQ19OT1RfRk9VTkQsCisgICAgICAgICAgKF8oIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyAiCisgICAgICAgICAgICAgICAgICAibW9yZSB0cmFuc3BvcnQgcHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyAiCisgICAgICAgICAgICAgICAgICAidGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiBwbHVnaW4uIikpLCAoTlVMTCkpOworICAgIH0KKyAgICByZXR1cm4gR1NUX1JUU1BfRVJST1I7CisgIH0KK2NsZWFudXBfZXJyb3I6CisgIHsKKyAgICBpZiAocGlwZWxpbmVkX3JlcXVlc3RfaWQpCisgICAgICBnX2ZyZWUgKHBpcGVsaW5lZF9yZXF1ZXN0X2lkKTsKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVxdWVzdCk7CisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJnJlc3BvbnNlKTsKKyAgICByZXR1cm4gcmVzOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfcGFyc2VfcmFuZ2UgKEdzdFJUU1BTcmMgKiBzcmMsIGNvbnN0IGdjaGFyICogcmFuZ2UsCisgICAgR3N0U2VnbWVudCAqIHNlZ21lbnQpCit7CisgIGdpbnQ2NCBzZWNvbmRzOworICBHc3RSVFNQVGltZVJhbmdlICp0aGVyYW5nZTsKKworICBpZiAoc3JjLT5yYW5nZSkKKyAgICBnc3RfcnRzcF9yYW5nZV9mcmVlIChzcmMtPnJhbmdlKTsKKworICBpZiAoZ3N0X3J0c3BfcmFuZ2VfcGFyc2UgKHJhbmdlLCAmdGhlcmFuZ2UpID09IEdTVF9SVFNQX09LKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicGFyc2VkIHJhbmdlICVzIiwgcmFuZ2UpOworICAgIHNyYy0+cmFuZ2UgPSB0aGVyYW5nZTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJmYWlsZWQgdG8gcGFyc2UgcmFuZ2UgJXMiLCByYW5nZSk7CisgICAgc3JjLT5yYW5nZSA9IE5VTEw7CisgICAgZ3N0X3NlZ21lbnRfaW5pdCAoc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJyYW5nZTogdHlwZSAlZCwgbWluICVmIC0gdHlwZSAlZCwgIG1heCAlZiAiLAorICAgICAgdGhlcmFuZ2UtPm1pbi50eXBlLCB0aGVyYW5nZS0+bWluLnNlY29uZHMsIHRoZXJhbmdlLT5tYXgudHlwZSwKKyAgICAgIHRoZXJhbmdlLT5tYXguc2Vjb25kcyk7CisKKyAgaWYgKHRoZXJhbmdlLT5taW4udHlwZSA9PSBHU1RfUlRTUF9USU1FX05PVykKKyAgICBzZWNvbmRzID0gMDsKKyAgZWxzZSBpZiAodGhlcmFuZ2UtPm1pbi50eXBlID09IEdTVF9SVFNQX1RJTUVfRU5EKQorICAgIHNlY29uZHMgPSAwOworICBlbHNlCisgICAgc2Vjb25kcyA9IHRoZXJhbmdlLT5taW4uc2Vjb25kcyAqIEdTVF9TRUNPTkQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicmFuZ2U6IG1pbiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChzZWNvbmRzKSk7CisKKyAgLyogd2UgbmVlZCB0byBzdGFydCBwbGF5YmFjayB3aXRob3V0IGNsaXBwaW5nIGZyb20gdGhlIHBvc2l0aW9uIHJlcG9ydGVkIGJ5CisgICAqIHRoZSBzZXJ2ZXIgKi8KKyAgc2VnbWVudC0+c3RhcnQgPSBzZWNvbmRzOworICBzZWdtZW50LT5wb3NpdGlvbiA9IHNlY29uZHM7CisKKyAgaWYgKHRoZXJhbmdlLT5tYXgudHlwZSA9PSBHU1RfUlRTUF9USU1FX05PVykKKyAgICBzZWNvbmRzID0gLTE7CisgIGVsc2UgaWYgKHRoZXJhbmdlLT5tYXgudHlwZSA9PSBHU1RfUlRTUF9USU1FX0VORCkKKyAgICBzZWNvbmRzID0gLTE7CisgIGVsc2UKKyAgICBzZWNvbmRzID0gdGhlcmFuZ2UtPm1heC5zZWNvbmRzICogR1NUX1NFQ09ORDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJyYW5nZTogbWF4ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHNlY29uZHMpKTsKKworICAvKiBsaXZlIChXTVMpIHNlcnZlciBtaWdodCBzZW5kIG92ZXJmbG93ZWQgbGFyZ2UgbWF4IGFzIGl0cyBpZGVhIG9mIGluZmluaXR5LAorICAgKiBjb21wZW5zYXRlIHRvIHByZXZlbnQgcHJvYmxlbXMgbGF0ZXIgb24gKi8KKyAgaWYgKHNlY29uZHMgIT0gLTEgJiYgc2Vjb25kcyA8IDApIHsKKyAgICBzZWNvbmRzID0gLTE7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiaW5zYW5lIHJhbmdlLCBzZXQgdG8gTk9ORSIpOworICB9CisKKyAgLyogbGl2ZSAoV01TKSBtaWdodCBzZW5kIG1pbiA9PSBtYXgsIHdoaWNoIGlzIG5vdCB3b3J0aCByZWNvcmRpbmcgKi8KKyAgaWYgKHNlZ21lbnQtPmR1cmF0aW9uID09IC0xICYmIHNlY29uZHMgPT0gc2VnbWVudC0+c3RhcnQpCisgICAgc2Vjb25kcyA9IC0xOworCisgIC8qIGRvbid0IGNoYW5nZSBkdXJhdGlvbiB3aXRoIHVua25vd24gdmFsdWUsIHdlIG1pZ2h0IGhhdmUgYSB2YWxpZCB2YWx1ZQorICAgKiB0aGVyZSB0aGF0IHdlIHdhbnQgdG8ga2VlcC4gKi8KKyAgaWYgKHNlY29uZHMgIT0gLTEpCisgICAgc2VnbWVudC0+ZHVyYXRpb24gPSBzZWNvbmRzOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBQYXJzZSBjbG9jayBwcm9maXZlZCBieSB0aGUgc2VydmVyIHdpdGggZm9sbG93aW5nIHN5bnRheDoKKyAqCisgKiAiR3N0TmV0VGltZVByb3ZpZGVyIDx3cmFwcGVkLWNsb2NrPiA8c2VydmVyLUlQOnBvcnQ+IDxjbG9jay10aW1lPiIKKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfcnRzcHNyY19wYXJzZV9nc3RfY2xvY2sgKEdzdFJUU1BTcmMgKiBzcmMsIGNvbnN0IGdjaGFyICogZ3N0Y2xvY2spCit7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIGlmIChnX3N0cl9oYXNfcHJlZml4IChnc3RjbG9jaywgIkdzdE5ldFRpbWVQcm92aWRlciAiKSkgeworICAgIGdjaGFyICoqZmllbGRzID0gTlVMTCwgKipwYXJ0cyA9IE5VTEw7CisgICAgZ2NoYXIgKnJlbW90ZV9pcCwgKnN0cjsKKyAgICBnaW50IHBvcnQ7CisgICAgR3N0Q2xvY2tUaW1lIGJhc2VfdGltZTsKKyAgICBHc3RDbG9jayAqbmV0Y2xvY2s7CisKKyAgICBmaWVsZHMgPSBnX3N0cnNwbGl0IChnc3RjbG9jaywgIiAiLCAwKTsKKworICAgIC8qIHdyYXBwZWQgY2xvY2ssIG5vdCB2ZXJ5IGludGVyZXN0aW5nIGZvciBub3cgKi8KKyAgICBpZiAoZmllbGRzWzFdID09IE5VTEwpCisgICAgICBnb3RvIGNsZWFudXA7CisKKyAgICAvKiByZW1vdGUgSVAgYWRkcmVzcyBhbmQgcG9ydCAqLworICAgIGlmICgoc3RyID0gZmllbGRzWzJdKSA9PSBOVUxMKQorICAgICAgZ290byBjbGVhbnVwOworCisgICAgcGFydHMgPSBnX3N0cnNwbGl0IChzdHIsICI6IiwgMCk7CisKKyAgICBpZiAoKHJlbW90ZV9pcCA9IHBhcnRzWzBdKSA9PSBOVUxMKQorICAgICAgZ290byBjbGVhbnVwOworCisgICAgaWYgKChzdHIgPSBwYXJ0c1sxXSkgPT0gTlVMTCkKKyAgICAgIGdvdG8gY2xlYW51cDsKKworICAgIHBvcnQgPSBhdG9pIChzdHIpOworICAgIGlmIChwb3J0ID09IDApCisgICAgICBnb3RvIGNsZWFudXA7CisKKyAgICAvKiBiYXNlLXRpbWUgKi8KKyAgICBpZiAoKHN0ciA9IGZpZWxkc1szXSkgPT0gTlVMTCkKKyAgICAgIGdvdG8gY2xlYW51cDsKKworICAgIGJhc2VfdGltZSA9IGdfYXNjaWlfc3RydG91bGwgKHN0ciwgTlVMTCwgMTApOworCisgICAgbmV0Y2xvY2sgPQorICAgICAgICBnc3RfbmV0X2NsaWVudF9jbG9ja19uZXcgKChnY2hhciAqKSAiR3N0UlRTUENsb2NrIiwgcmVtb3RlX2lwLCBwb3J0LAorICAgICAgICBiYXNlX3RpbWUpOworCisgICAgaWYgKHNyYy0+cHJvdmlkZWRfY2xvY2spCisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChzcmMtPnByb3ZpZGVkX2Nsb2NrKTsKKyAgICBzcmMtPnByb3ZpZGVkX2Nsb2NrID0gbmV0Y2xvY2s7CisKKyAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHNyYyksCisgICAgICAgIGdzdF9tZXNzYWdlX25ld19jbG9ja19wcm92aWRlIChHU1RfT0JKRUNUX0NBU1QgKHNyYyksCisgICAgICAgICAgICBzcmMtPnByb3ZpZGVkX2Nsb2NrLCBUUlVFKSk7CisKKyAgICByZXMgPSBUUlVFOworICBjbGVhbnVwOgorICAgIGdfc3RyZnJlZXYgKGZpZWxkcyk7CisgICAgZ19zdHJmcmVldiAocGFydHMpOworICB9CisgIHJldHVybiByZXM7Cit9CisKKy8qIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIFJUU1Agc3RhdGUgbG9jayAqLworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX29wZW5fZnJvbV9zZHAgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFNEUE1lc3NhZ2UgKiBzZHAsCisgICAgZ2Jvb2xlYW4gYXN5bmMpCit7CisgIEdzdFJUU1BSZXN1bHQgcmVzOworICBnaW50IGksIG5fc3RyZWFtczsKKworICAvKiBwcmVwYXJlIGdsb2JhbCBzdHJlYW0gY2FwcyBwcm9wZXJ0aWVzICovCisgIGlmIChzcmMtPnByb3BzKQorICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2FsbF9maWVsZHMgKHNyYy0+cHJvcHMpOworICBlbHNlCisgICAgc3JjLT5wcm9wcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5ICgiUlRTUFByb3BlcnRpZXMiKTsKKworICBERUJVR19TRFAgKHNyYywgc2RwKTsKKworICBnc3RfcnRzcF9leHRfbGlzdF9wYXJzZV9zZHAgKHNyYy0+ZXh0ZW5zaW9ucywgc2RwLCBzcmMtPnByb3BzKTsKKworICAvKiBsZXQgdGhlIGFwcCBpbnNwZWN0IGFuZCBjaGFuZ2UgdGhlIFNEUCAqLworICBnX3NpZ25hbF9lbWl0IChzcmMsIGdzdF9ydHNwc3JjX3NpZ25hbHNbU0lHTkFMX09OX1NEUF0sIDAsIHNkcCk7CisKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNyYy0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKworICAvKiBwYXJzZSByYW5nZSBmb3IgZHVyYXRpb24gcmVwb3J0aW5nLiAqLworICB7CisgICAgY29uc3QgZ2NoYXIgKnJhbmdlOworCisgICAgZm9yIChpID0gMDs7IGkrKykgeworICAgICAgcmFuZ2UgPSBnc3Rfc2RwX21lc3NhZ2VfZ2V0X2F0dHJpYnV0ZV92YWxfbiAoc2RwLCAicmFuZ2UiLCBpKTsKKyAgICAgIGlmIChyYW5nZSA9PSBOVUxMKQorICAgICAgICBicmVhazsKKworICAgICAgLyoga2VlcCB0cmFjayBvZiB0aGUgcmFuZ2UgYW5kIGNvbmZpZ3VyZSBpdCBpbiB0aGUgc2VnbWVudCAqLworICAgICAgaWYgKGdzdF9ydHNwc3JjX3BhcnNlX3JhbmdlIChzcmMsIHJhbmdlLCAmc3JjLT5zZWdtZW50KSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIC8qIHBhcnNlIGNsb2NrIGluZm9ybWF0aW9uLiBUaGlzIGlzIEdTdHJlYW1lciBzcGVjaWZpYywgYSBzZXJ2ZXIgY2FuIHRlbGwgdGhlCisgICAqIGNsaWVudCB3aGF0IGNsb2NrIGl0IGlzIHVzaW5nIGFuZCB3cmFwIHRoYXQgaW4gYSBuZXR3b3JrIGNsb2NrLiBUaGUKKyAgICogYWR2YW50YWdlIG9mIHRoYXQgaXMgdGhhdCB3ZSBjYW4gc2xhdmUgdG8gaXQuICovCisgIHsKKyAgICBjb25zdCBnY2hhciAqZ3N0Y2xvY2s7CisKKyAgICBmb3IgKGkgPSAwOzsgaSsrKSB7CisgICAgICBnc3RjbG9jayA9IGdzdF9zZHBfbWVzc2FnZV9nZXRfYXR0cmlidXRlX3ZhbF9uIChzZHAsICJ4LWdzdC1jbG9jayIsIGkpOworICAgICAgaWYgKGdzdGNsb2NrID09IE5VTEwpCisgICAgICAgIGJyZWFrOworCisgICAgICAvKiBwYXJzZSB0aGUgY2xvY2sgYW5kIGV4cG9zZSBpdCBpbiB0aGUgcHJvdmlkZV9jbG9jayBtZXRob2QgKi8KKyAgICAgIGlmIChnc3RfcnRzcHNyY19wYXJzZV9nc3RfY2xvY2sgKHNyYywgZ3N0Y2xvY2spKQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgLyogdHJ5IHRvIGZpbmQgYSBnbG9iYWwgY29udHJvbCBhdHRyaWJ1dGUuIE5vdGUgdGhhdCBhICcqJyBtZWFucyB0aGF0IHdlIHNob3VsZAorICAgKiBkbyBhZ2dyZWdhdGUgY29udHJvbCB3aXRoIHRoZSBjdXJyZW50IHVybCAoc28gd2UgZG9uJ3QgZG8gYW55dGhpbmcgYW5kCisgICAqIGxlYXZlIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gYXMgaXMpICovCisgIHsKKyAgICBjb25zdCBnY2hhciAqY29udHJvbDsKKworICAgIGZvciAoaSA9IDA7OyBpKyspIHsKKyAgICAgIGNvbnRyb2wgPSBnc3Rfc2RwX21lc3NhZ2VfZ2V0X2F0dHJpYnV0ZV92YWxfbiAoc2RwLCAiY29udHJvbCIsIGkpOworICAgICAgaWYgKGNvbnRyb2wgPT0gTlVMTCkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIG9ubHkgdGFrZSBmdWxseSBxdWFsaWZpZWQgdXJscyAqLworICAgICAgaWYgKGdfc3RyX2hhc19wcmVmaXggKGNvbnRyb2wsICJydHNwOi8vIikpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoY29udHJvbCkgeworICAgICAgZ19mcmVlIChzcmMtPmNvbm5pbmZvLmxvY2F0aW9uKTsKKyAgICAgIHNyYy0+Y29ubmluZm8ubG9jYXRpb24gPSBnX3N0cmR1cCAoY29udHJvbCk7CisgICAgICAvKiBtYWtlIGEgY29ubmVjdGlvbiBmb3IgdGhpcywgaWYgdGhlcmUgd2FzIGEgY29ubmVjdGlvbiBhbHJlYWR5LCBub3RoaW5nCisgICAgICAgKiBoYXBwZW5zLiAqLworICAgICAgaWYgKGdzdF9ydHNwX2Nvbm5pbmZvX2Nvbm5lY3QgKHNyYywgJnNyYy0+Y29ubmluZm8sIGFzeW5jKSA8IDApIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoc3JjLCAiY291bGQgbm90IGNvbm5lY3QiKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogd2UgbmVlZCB0byBrZWVwIHRoZSBjb250cm9sIHVybCBzZXBhcmF0ZSBmcm9tIHRoZSBjb25uZWN0aW9uIHVybCBiZWNhdXNlCisgICAgICogdGhlIHJ1bGVzIGZvciBjb25zdHJ1Y3RpbmcgdGhlIG1lZGlhIGNvbnRyb2wgdXJsIG5lZWQgaXQgKi8KKyAgICBnX2ZyZWUgKHNyYy0+Y29udHJvbCk7CisgICAgc3JjLT5jb250cm9sID0gZ19zdHJkdXAgKGNvbnRyb2wpOworICB9CisKKyAgLyogY3JlYXRlIHN0cmVhbXMgKi8KKyAgbl9zdHJlYW1zID0gZ3N0X3NkcF9tZXNzYWdlX21lZGlhc19sZW4gKHNkcCk7CisgIGZvciAoaSA9IDA7IGkgPCBuX3N0cmVhbXM7IGkrKykgeworICAgIGdzdF9ydHNwc3JjX2NyZWF0ZV9zdHJlYW0gKHNyYywgc2RwLCBpLCBuX3N0cmVhbXMpOworICB9CisKKyAgc3JjLT5zdGF0ZSA9IEdTVF9SVFNQX1NUQVRFX0lOSVQ7CisKKyAgLyogc2V0dXAgc3RyZWFtcyAqLworICBpZiAoKHJlcyA9IGdzdF9ydHNwc3JjX3NldHVwX3N0cmVhbXNfc3RhcnQgKHNyYywgYXN5bmMpKSA8IDApCisgICAgZ290byBzZXR1cF9mYWlsZWQ7CisKKyAgLyogcmVzZXQgb3VyIHN0YXRlICovCisgIHNyYy0+bmVlZF9yYW5nZSA9IFRSVUU7CisgIHNyYy0+c2tpcCA9IEZBTFNFOworCisgIHNyYy0+c3RhdGUgPSBHU1RfUlRTUF9TVEFURV9SRUFEWTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworc2V0dXBfZmFpbGVkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoc3JjLCAic2V0dXAgZmFpbGVkIik7CisgICAgZ3N0X3J0c3BzcmNfY2xlYW51cCAoc3JjKTsKKyAgICByZXR1cm4gcmVzOworICB9Cit9CisKK3N0YXRpYyBHc3RSVFNQUmVzdWx0Citnc3RfcnRzcHNyY19yZXRyaWV2ZV9zZHAgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFNEUE1lc3NhZ2UgKiogc2RwLAorICAgIGdib29sZWFuIGFzeW5jKQoreworICBHc3RSVFNQUmVzdWx0IHJlczsKKyAgR3N0UlRTUE1lc3NhZ2UgcmVxdWVzdCA9IHsgMCB9OworICBHc3RSVFNQTWVzc2FnZSByZXNwb25zZSA9IHsgMCB9OworICBndWludDggKmRhdGE7CisgIGd1aW50IHNpemU7CisgIGdjaGFyICpyZXNwY29udCA9IE5VTEw7CisgIEdzdFJUU1BWZXJzaW9uIHZlcnNpb25zW10gPQorICAgICAgeyBHU1RfUlRTUF9WRVJTSU9OXzJfMCwgR1NUX1JUU1BfVkVSU0lPTl9JTlZBTElEIH07CisKKyAgc3JjLT52ZXJzaW9uID0gc3JjLT5kZWZhdWx0X3ZlcnNpb247CisgIGlmIChzcmMtPmRlZmF1bHRfdmVyc2lvbiA9PSBHU1RfUlRTUF9WRVJTSU9OXzJfMCkgeworICAgIHZlcnNpb25zWzBdID0gR1NUX1JUU1BfVkVSU0lPTl8xXzA7CisgIH0KKworcmVzdGFydDoKKyAgc3JjLT5uZWVkX3JlZGlyZWN0ID0gRkFMU0U7CisKKyAgLyogY2FuJ3QgY29udGludWUgd2l0aG91dCBhIHZhbGlkIHVybCAqLworICBpZiAoR19VTkxJS0VMWSAoc3JjLT5jb25uaW5mby51cmwgPT0gTlVMTCkpIHsKKyAgICByZXMgPSBHU1RfUlRTUF9FSU5WQUw7CisgICAgZ290byBub191cmw7CisgIH0KKyAgc3JjLT50cmllZF91cmxfYXV0aCA9IEZBTFNFOworCisgIGlmICgocmVzID0gZ3N0X3J0c3BfY29ubmluZm9fY29ubmVjdCAoc3JjLCAmc3JjLT5jb25uaW5mbywgYXN5bmMpKSA8IDApCisgICAgZ290byBjb25uZWN0X2ZhaWxlZDsKKworICAvKiBjcmVhdGUgT1BUSU9OUyAqLworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjcmVhdGUgb3B0aW9ucy4uLiAoJXMpIiwgYXN5bmMgPyAiYXN5bmMiIDogInN5bmMiKTsKKyAgcmVzID0KKyAgICAgIGdzdF9ydHNwc3JjX2luaXRfcmVxdWVzdCAoc3JjLCAmcmVxdWVzdCwgR1NUX1JUU1BfT1BUSU9OUywKKyAgICAgIHNyYy0+Y29ubmluZm8udXJsX3N0cik7CisgIGlmIChyZXMgPCAwKQorICAgIGdvdG8gY3JlYXRlX3JlcXVlc3RfZmFpbGVkOworCisgIC8qIHNlbmQgT1BUSU9OUyAqLworICByZXF1ZXN0LnR5cGVfZGF0YS5yZXF1ZXN0LnZlcnNpb24gPSBzcmMtPnZlcnNpb247CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNlbmQgb3B0aW9ucy4uLiIpOworCisgIGlmIChhc3luYykKKyAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBDT05USU5VRSwgIm9wZW4iLCAoIlJldHJpZXZpbmcgc2VydmVyIG9wdGlvbnMiKSk7CisKKyAgaWYgKChyZXMgPQorICAgICAgICAgIGdzdF9ydHNwc3JjX3NlbmQgKHNyYywgJnNyYy0+Y29ubmluZm8sICZyZXF1ZXN0LCAmcmVzcG9uc2UsCisgICAgICAgICAgICAgIE5VTEwsIHZlcnNpb25zKSkgPCAwKSB7CisgICAgZ290byBzZW5kX2Vycm9yOworICB9CisKKyAgc3JjLT52ZXJzaW9uID0gcmVxdWVzdC50eXBlX2RhdGEucmVxdWVzdC52ZXJzaW9uOworICBHU1RfSU5GT19PQkpFQ1QgKHNyYywgIk5vdyB1c2luZyB2ZXJzaW9uOiAlcyIsCisgICAgICBnc3RfcnRzcF92ZXJzaW9uX2FzX3RleHQgKHNyYy0+dmVyc2lvbikpOworCisgIC8qIHBhcnNlIE9QVElPTlMgKi8KKyAgaWYgKCFnc3RfcnRzcHNyY19wYXJzZV9tZXRob2RzIChzcmMsICZyZXNwb25zZSkpCisgICAgZ290byBtZXRob2RzX2Vycm9yOworCisgIC8qIGNyZWF0ZSBERVNDUklCRSAqLworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjcmVhdGUgZGVzY3JpYmUuLi4iKTsKKyAgcmVzID0KKyAgICAgIGdzdF9ydHNwc3JjX2luaXRfcmVxdWVzdCAoc3JjLCAmcmVxdWVzdCwgR1NUX1JUU1BfREVTQ1JJQkUsCisgICAgICBzcmMtPmNvbm5pbmZvLnVybF9zdHIpOworICBpZiAocmVzIDwgMCkKKyAgICBnb3RvIGNyZWF0ZV9yZXF1ZXN0X2ZhaWxlZDsKKworICAvKiB3ZSBvbmx5IGFjY2VwdCBTRFAgZm9yIG5vdyAqLworICBnc3RfcnRzcF9tZXNzYWdlX2FkZF9oZWFkZXIgKCZyZXF1ZXN0LCBHU1RfUlRTUF9IRFJfQUNDRVBULAorICAgICAgImFwcGxpY2F0aW9uL3NkcCIpOworCisgIC8qIHNlbmQgREVTQ1JJQkUgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic2VuZCBkZXNjcmliZS4uLiIpOworCisgIGlmIChhc3luYykKKyAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBDT05USU5VRSwgIm9wZW4iLCAoIlJldHJpZXZpbmcgbWVkaWEgaW5mbyIpKTsKKworICBpZiAoKHJlcyA9CisgICAgICAgICAgZ3N0X3J0c3BzcmNfc2VuZCAoc3JjLCAmc3JjLT5jb25uaW5mbywgJnJlcXVlc3QsICZyZXNwb25zZSwKKyAgICAgICAgICAgICAgTlVMTCwgTlVMTCkpIDwgMCkKKyAgICBnb3RvIHNlbmRfZXJyb3I7CisKKyAgLyogd2Ugb25seSBwZXJmb3JtIHJlZGlyZWN0IGZvciBkZXNjcmliZSBhbmQgcGxheSwgY3VycmVudGx5ICovCisgIGlmIChzcmMtPm5lZWRfcmVkaXJlY3QpIHsKKyAgICAvKiBjbG9zZSBjb25uZWN0aW9uLCB3ZSBkb24ndCBoYXZlIHRvIHNlbmQgYSBURUFSRE9XTiB5ZXQsIGlnbm9yZSB0aGUKKyAgICAgKiByZXN1bHQuICovCisgICAgZ3N0X3J0c3BfY29ubmluZm9fY2xvc2UgKHNyYywgJnNyYy0+Y29ubmluZm8sIFRSVUUpOworCisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJnJlcXVlc3QpOworICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZyZXNwb25zZSk7CisKKyAgICAvKiBhbmQgbm93IHJldHJ5ICovCisgICAgZ290byByZXN0YXJ0OworICB9CisKKyAgLyogaXQgY291bGQgYmUgdGhhdCB0aGUgREVTQ1JJQkUgbWV0aG9kIHdhcyBub3QgaW1wbGVtZW50ZWQgKi8KKyAgaWYgKCEoc3JjLT5tZXRob2RzICYgR1NUX1JUU1BfREVTQ1JJQkUpKQorICAgIGdvdG8gbm9fZGVzY3JpYmU7CisKKyAgLyogY2hlY2sgaWYgcmVwbHkgaXMgU0RQICovCisgIGdzdF9ydHNwX21lc3NhZ2VfZ2V0X2hlYWRlciAoJnJlc3BvbnNlLCBHU1RfUlRTUF9IRFJfQ09OVEVOVF9UWVBFLCAmcmVzcGNvbnQsCisgICAgICAwKTsKKyAgLyogY291bGQgbm90IGJlIHNldCBidXQgc2luY2UgdGhlIHJlcXVlc3QgcmV0dXJuZWQgT0ssIHdlIGFzc3VtZSBpdAorICAgKiB3YXMgU0RQLCBlbHNlIGNoZWNrIGl0LiAqLworICBpZiAocmVzcGNvbnQpIHsKKyAgICBjb25zdCBnY2hhciAqcHJvcHMgPSBzdHJjaHIgKHJlc3Bjb250LCAnOycpOworCisgICAgaWYgKHByb3BzKSB7CisgICAgICBnY2hhciAqbWltZXR5cGUgPSBnX3N0cm5kdXAgKHJlc3Bjb250LCBwcm9wcyAtIHJlc3Bjb250KTsKKworICAgICAgbWltZXR5cGUgPSBnX3N0cnN0cmlwIChtaW1ldHlwZSk7CisgICAgICBpZiAoZ19hc2NpaV9zdHJjYXNlY21wIChtaW1ldHlwZSwgImFwcGxpY2F0aW9uL3NkcCIpICE9IDApIHsKKyAgICAgICAgZ19mcmVlIChtaW1ldHlwZSk7CisgICAgICAgIGdvdG8gd3JvbmdfY29udGVudF90eXBlOworICAgICAgfQorCisgICAgICAvKiBUT0RPOiBDaGVjayBmb3IgY2hhcnNldCBwcm9wZXJ0eSBhbmQgZG8gY29udmVyc2lvbnMgb2YgYWxsIG1lc3NhZ2VzIGlmCisgICAgICAgKiBuZWVkZWQuIFNvbWUgc2VydmVycyBhY3R1YWxseSBzZW5kIHRoYXQgcHJvcGVydHkgKi8KKworICAgICAgZ19mcmVlIChtaW1ldHlwZSk7CisgICAgfSBlbHNlIGlmIChnX2FzY2lpX3N0cmNhc2VjbXAgKHJlc3Bjb250LCAiYXBwbGljYXRpb24vc2RwIikgIT0gMCkgeworICAgICAgZ290byB3cm9uZ19jb250ZW50X3R5cGU7CisgICAgfQorICB9CisKKyAgLyogZ2V0IG1lc3NhZ2UgYm9keSBhbmQgcGFyc2UgYXMgU0RQICovCisgIGdzdF9ydHNwX21lc3NhZ2VfZ2V0X2JvZHkgKCZyZXNwb25zZSwgJmRhdGEsICZzaXplKTsKKyAgaWYgKGRhdGEgPT0gTlVMTCB8fCBzaXplID09IDApCisgICAgZ290byBub19kZXNjcmliZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJwYXJzZSBTRFAuLi4iKTsKKyAgZ3N0X3NkcF9tZXNzYWdlX25ldyAoc2RwKTsKKyAgZ3N0X3NkcF9tZXNzYWdlX3BhcnNlX2J1ZmZlciAoZGF0YSwgc2l6ZSwgKnNkcCk7CisKKyAgLyogY2xlYW4gdXAgYW55IG1lc3NhZ2VzICovCisgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZyZXF1ZXN0KTsKKyAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJnJlc3BvbnNlKTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworbm9fdXJsOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIE5PVF9GT1VORCwgKE5VTEwpLAorICAgICAgICAoIk5vIHZhbGlkIFJUU1AgVVJMIHdhcyBwcm92aWRlZCIpKTsKKyAgICBnb3RvIGNsZWFudXBfZXJyb3I7CisgIH0KK2Nvbm5lY3RfZmFpbGVkOgorICB7CisgICAgZ2NoYXIgKnN0ciA9IGdzdF9ydHNwX3N0cnJlc3VsdCAocmVzKTsKKworICAgIGlmIChyZXMgIT0gR1NUX1JUU1BfRUlOVFIpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBPUEVOX1JFQURfV1JJVEUsIChOVUxMKSwKKyAgICAgICAgICAoIkZhaWxlZCB0byBjb25uZWN0LiAoJXMpIiwgc3RyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiY29ubmVjdCBpbnRlcnJ1cHRlZCIpOworICAgIH0KKyAgICBnX2ZyZWUgKHN0cik7CisgICAgZ290byBjbGVhbnVwX2Vycm9yOworICB9CitjcmVhdGVfcmVxdWVzdF9mYWlsZWQ6CisgIHsKKyAgICBnY2hhciAqc3RyID0gZ3N0X3J0c3Bfc3RycmVzdWx0IChyZXMpOworCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgTElCUkFSWSwgSU5JVCwgKE5VTEwpLAorICAgICAgICAoIkNvdWxkIG5vdCBjcmVhdGUgcmVxdWVzdC4gKCVzKSIsIHN0cikpOworICAgIGdfZnJlZSAoc3RyKTsKKyAgICBnb3RvIGNsZWFudXBfZXJyb3I7CisgIH0KK3NlbmRfZXJyb3I6CisgIHsKKyAgICAvKiBEb24ndCBwb3N0IGEgbWVzc2FnZSAtIHRoZSBydHNwX3NlbmQgbWV0aG9kIHdpbGwgaGF2ZQorICAgICAqIHRha2VuIGNhcmUgb2YgaXQgYmVjYXVzZSB3ZSBwYXNzZWQgTlVMTCBmb3IgdGhlIHJlc3BvbnNlIGNvZGUgKi8KKyAgICBnb3RvIGNsZWFudXBfZXJyb3I7CisgIH0KK21ldGhvZHNfZXJyb3I6CisgIHsKKyAgICAvKiBlcnJvciB3YXMgcG9zdGVkICovCisgICAgcmVzID0gR1NUX1JUU1BfRVJST1I7CisgICAgZ290byBjbGVhbnVwX2Vycm9yOworICB9Cit3cm9uZ19jb250ZW50X3R5cGU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBTRFAsIGdvdCAlcy4iLCByZXNwY29udCkpOworICAgIHJlcyA9IEdTVF9SVFNQX0VSUk9SOworICAgIGdvdG8gY2xlYW51cF9lcnJvcjsKKyAgfQorbm9fZGVzY3JpYmU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJTZXJ2ZXIgY2FuIG5vdCBwcm92aWRlIGFuIFNEUC4iKSk7CisgICAgcmVzID0gR1NUX1JUU1BfRVJST1I7CisgICAgZ290byBjbGVhbnVwX2Vycm9yOworICB9CitjbGVhbnVwX2Vycm9yOgorICB7CisgICAgaWYgKHNyYy0+Y29ubmluZm8uY29ubmVjdGlvbikgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZnJlZSBjb25uZWN0aW9uIik7CisgICAgICBnc3RfcnRzcF9jb25uaW5mb19jbG9zZSAoc3JjLCAmc3JjLT5jb25uaW5mbywgVFJVRSk7CisgICAgfQorICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZyZXF1ZXN0KTsKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVzcG9uc2UpOworICAgIHJldHVybiByZXM7CisgIH0KK30KKworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX29wZW4gKEdzdFJUU1BTcmMgKiBzcmMsIGdib29sZWFuIGFzeW5jKQoreworICBHc3RSVFNQUmVzdWx0IHJldDsKKworICBzcmMtPm1ldGhvZHMgPQorICAgICAgR1NUX1JUU1BfU0VUVVAgfCBHU1RfUlRTUF9QTEFZIHwgR1NUX1JUU1BfUEFVU0UgfCBHU1RfUlRTUF9URUFSRE9XTjsKKworICBpZiAoc3JjLT5zZHAgPT0gTlVMTCkgeworICAgIGlmICgocmV0ID0gZ3N0X3J0c3BzcmNfcmV0cmlldmVfc2RwIChzcmMsICZzcmMtPnNkcCwgYXN5bmMpKSA8IDApCisgICAgICBnb3RvIG5vX3NkcDsKKyAgfQorCisgIGlmICgocmV0ID0gZ3N0X3J0c3BzcmNfb3Blbl9mcm9tX3NkcCAoc3JjLCBzcmMtPnNkcCwgYXN5bmMpKSA8IDApCisgICAgZ290byBvcGVuX2ZhaWxlZDsKKworZG9uZToKKyAgaWYgKGFzeW5jKQorICAgIGdzdF9ydHNwc3JjX2xvb3BfZW5kX2NtZCAoc3JjLCBDTURfT1BFTiwgcmV0KTsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworbm9fc2RwOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJjYW4ndCBnZXQgc2RwIik7CisgICAgc3JjLT5vcGVuX2Vycm9yID0gVFJVRTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK29wZW5fZmFpbGVkOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJjYW4ndCBzZXR1cCBzdHJlYW1pbmcgZnJvbSBzZHAiKTsKKyAgICBzcmMtPm9wZW5fZXJyb3IgPSBUUlVFOworICAgIGdvdG8gZG9uZTsKKyAgfQorfQorCitzdGF0aWMgR3N0UlRTUFJlc3VsdAorZ3N0X3J0c3BzcmNfY2xvc2UgKEdzdFJUU1BTcmMgKiBzcmMsIGdib29sZWFuIGFzeW5jLCBnYm9vbGVhbiBvbmx5X2Nsb3NlKQoreworICBHc3RSVFNQTWVzc2FnZSByZXF1ZXN0ID0geyAwIH07CisgIEdzdFJUU1BNZXNzYWdlIHJlc3BvbnNlID0geyAwIH07CisgIEdzdFJUU1BSZXN1bHQgcmVzID0gR1NUX1JUU1BfT0s7CisgIEdMaXN0ICp3YWxrOworICBjb25zdCBnY2hhciAqY29udHJvbDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJURUFSRE9XTi4uLiIpOworCisgIGdzdF9ydHNwc3JjX3NldF9zdGF0ZSAoc3JjLCBHU1RfU1RBVEVfUkVBRFkpOworCisgIGlmIChzcmMtPnN0YXRlIDwgR1NUX1JUU1BfU1RBVEVfUkVBRFkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJub3QgcmVhZHksIGRvaW5nIGNsZWFudXAiKTsKKyAgICBnb3RvIGNsb3NlOworICB9CisKKyAgaWYgKG9ubHlfY2xvc2UpCisgICAgZ290byBjbG9zZTsKKworICAvKiBjb25zdHJ1Y3QgYSBjb250cm9sIHVybCAqLworICBjb250cm9sID0gZ2V0X2FnZ3JlZ2F0ZV9jb250cm9sIChzcmMpOworCisgIGlmICghKHNyYy0+bWV0aG9kcyAmIChHU1RfUlRTUF9QTEFZIHwgR1NUX1JUU1BfVEVBUkRPV04pKSkKKyAgICBnb3RvIG5vdF9zdXBwb3J0ZWQ7CisKKyAgZm9yICh3YWxrID0gc3JjLT5zdHJlYW1zOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtID0gKEdzdFJUU1BTdHJlYW0gKikgd2Fsay0+ZGF0YTsKKyAgICBjb25zdCBnY2hhciAqc2V0dXBfdXJsOworICAgIEdzdFJUU1BDb25uSW5mbyAqaW5mbzsKKworICAgIC8qIHRyeSBhZ2dyZWdhdGUgY29udHJvbCBmaXJzdCBidXQgZG8gbm9uLWFnZ3JlZ2F0ZSBjb250cm9sIG90aGVyd2lzZSAqLworICAgIGlmIChjb250cm9sKQorICAgICAgc2V0dXBfdXJsID0gY29udHJvbDsKKyAgICBlbHNlIGlmICgoc2V0dXBfdXJsID0gc3RyZWFtLT5jb25uaW5mby5sb2NhdGlvbikgPT0gTlVMTCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKHNyYy0+Y29ubmluZm8uY29ubmVjdGlvbikgeworICAgICAgaW5mbyA9ICZzcmMtPmNvbm5pbmZvOworICAgIH0gZWxzZSBpZiAoc3RyZWFtLT5jb25uaW5mby5jb25uZWN0aW9uKSB7CisgICAgICBpbmZvID0gJnN0cmVhbS0+Y29ubmluZm87CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoIWluZm8tPmNvbm5lY3RlZCkKKyAgICAgIGdvdG8gbmV4dDsKKworICAgIC8qIGRvIFRFQVJET1dOICovCisgICAgcmVzID0KKyAgICAgICAgZ3N0X3J0c3BzcmNfaW5pdF9yZXF1ZXN0IChzcmMsICZyZXF1ZXN0LCBHU1RfUlRTUF9URUFSRE9XTiwgc2V0dXBfdXJsKTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgIGdvdG8gY3JlYXRlX3JlcXVlc3RfZmFpbGVkOworCisgICAgaWYgKGFzeW5jKQorICAgICAgR1NUX0VMRU1FTlRfUFJPR1JFU1MgKHNyYywgQ09OVElOVUUsICJjbG9zZSIsICgiQ2xvc2luZyBzdHJlYW0iKSk7CisKKyAgICBpZiAoKHJlcyA9CisgICAgICAgICAgICBnc3RfcnRzcHNyY19zZW5kIChzcmMsIGluZm8sICZyZXF1ZXN0LCAmcmVzcG9uc2UsIE5VTEwsIE5VTEwpKSA8IDApCisgICAgICBnb3RvIHNlbmRfZXJyb3I7CisKKyAgICAvKiBGSVhNRSwgcGFyc2UgcmVzdWx0PyAqLworICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZyZXF1ZXN0KTsKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVzcG9uc2UpOworCisgIG5leHQ6CisgICAgLyogZWFybHkgZXhpdCB3aGVuIHdlIGRpZCBhZ2dyZWdhdGUgY29udHJvbCAqLworICAgIGlmIChjb250cm9sKQorICAgICAgYnJlYWs7CisgIH0KKworY2xvc2U6CisgIC8qIGNsb3NlIGNvbm5lY3Rpb25zICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNsb3NpbmcgY29ubmVjdGlvbi4uLiIpOworICBnc3RfcnRzcF9jb25uaW5mb19jbG9zZSAoc3JjLCAmc3JjLT5jb25uaW5mbywgVFJVRSk7CisgIGZvciAod2FsayA9IHNyYy0+c3RyZWFtczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BTdHJlYW0gKnN0cmVhbSA9IChHc3RSVFNQU3RyZWFtICopIHdhbGstPmRhdGE7CisgICAgZ3N0X3J0c3BfY29ubmluZm9fY2xvc2UgKHNyYywgJnN0cmVhbS0+Y29ubmluZm8sIFRSVUUpOworICB9CisKKyAgLyogY2xlYW51cCAqLworICBnc3RfcnRzcHNyY19jbGVhbnVwIChzcmMpOworCisgIHNyYy0+c3RhdGUgPSBHU1RfUlRTUF9TVEFURV9JTlZBTElEOworCisgIGlmIChhc3luYykKKyAgICBnc3RfcnRzcHNyY19sb29wX2VuZF9jbWQgKHNyYywgQ01EX0NMT1NFLCByZXMpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitjcmVhdGVfcmVxdWVzdF9mYWlsZWQ6CisgIHsKKyAgICBnY2hhciAqc3RyID0gZ3N0X3J0c3Bfc3RycmVzdWx0IChyZXMpOworCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgTElCUkFSWSwgSU5JVCwgKE5VTEwpLAorICAgICAgICAoIkNvdWxkIG5vdCBjcmVhdGUgcmVxdWVzdC4gKCVzKSIsIHN0cikpOworICAgIGdfZnJlZSAoc3RyKTsKKyAgICBnb3RvIGNsb3NlOworICB9CitzZW5kX2Vycm9yOgorICB7CisgICAgZ2NoYXIgKnN0ciA9IGdzdF9ydHNwX3N0cnJlc3VsdCAocmVzKTsKKworICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZyZXF1ZXN0KTsKKyAgICBpZiAocmVzICE9IEdTVF9SVFNQX0VJTlRSKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgV1JJVEUsIChOVUxMKSwKKyAgICAgICAgICAoIkNvdWxkIG5vdCBzZW5kIG1lc3NhZ2UuICglcykiLCBzdHIpKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJURUFSRE9XTiBpbnRlcnJ1cHRlZCIpOworICAgIH0KKyAgICBnX2ZyZWUgKHN0cik7CisgICAgZ290byBjbG9zZTsKKyAgfQorbm90X3N1cHBvcnRlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywKKyAgICAgICAgIlRFQVJET1dOIGFuZCBQTEFZIG5vdCBzdXBwb3J0ZWQsIGNhbid0IGRvIFRFQVJET1dOIik7CisgICAgZ290byBjbG9zZTsKKyAgfQorfQorCisvKiBSVFAtSW5mbyBpcyBvZiB0aGUgZm9ybWF0OgorICoKKyAqIHVybD08VVJMPjtbc2VxPTxzZXFiYXNlPjtydHB0aW1lPTx0aW1lYmFzZT5dIFssIHVybD0uLi5dCisgKgorICogcnRwdGltZSBjb3JyZXNwb25kcyB0byB0aGUgdGltZXN0YW1wIGZvciB0aGUgTlBUIHRpbWUgZ2l2ZW4gaW4gdGhlIGhlYWRlcgorICogc2VxYmFzZSBjb3JyZXNwb25kcyB0byB0aGUgbmV4dCBzZXF1ZW5jZSBudW1iZXIgd2UgcmVjZWl2ZWQuIFRoaXMgbnVtYmVyCisgKiBpbmRpY2F0ZXMgdGhlIGZpcnN0IHNlcW51bSBhZnRlciB0aGUgc2VlayBhbmQgc2hvdWxkIGJlIHVzZWQgdG8gZGlzY2FyZAorICogcGFja2V0cyB0aGF0IGFyZSBmcm9tIGJlZm9yZSB0aGUgc2Vlay4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfcnRzcHNyY19wYXJzZV9ydHBpbmZvIChHc3RSVFNQU3JjICogc3JjLCBnY2hhciAqIHJ0cGluZm8pCit7CisgIGdjaGFyICoqaW5mb3M7CisgIGdpbnQgaSwgajsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJwYXJzaW5nIFJUUC1JbmZvICVzIiwgcnRwaW5mbyk7CisKKyAgaW5mb3MgPSBnX3N0cnNwbGl0IChydHBpbmZvLCAiLCIsIDApOworICBmb3IgKGkgPSAwOyBpbmZvc1tpXTsgaSsrKSB7CisgICAgZ2NoYXIgKipmaWVsZHM7CisgICAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtOworICAgIGdpbnQzMiBzZXFiYXNlOworICAgIGdpbnQ2NCB0aW1lYmFzZTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInBhcnNpbmcgaW5mbyAlcyIsIGluZm9zW2ldKTsKKworICAgIC8qIGluaXQgdmFsdWVzLCB0eXBlcyBvZiBzZXFiYXNlIGFuZCB0aW1lYmFzZSBhcmUgYmlnZ2VyIHRoYW4gbmVlZGVkIHNvIHdlCisgICAgICogY2FuIHN0b3JlIC0xIGFzIHVuaW5pdGlhbGl6ZWQgdmFsdWVzICovCisgICAgc3RyZWFtID0gTlVMTDsKKyAgICBzZXFiYXNlID0gLTE7CisgICAgdGltZWJhc2UgPSAtMTsKKworICAgIC8qIHBhcnNlIHVybCwgZmluZCBzdHJlYW0gZm9yIHVybC4KKyAgICAgKiBwYXJzZSBzZXEgYW5kIHJ0cHRpbWUuIFRoZSBzZXEgbnVtYmVyIHNob3VsZCBiZSBjb25maWd1cmVkIGluIHRoZSBydHAKKyAgICAgKiBkZXBheWxvYWRlciBvciBzZXNzaW9uIG1hbmFnZXIgdG8gZGV0ZWN0IGdhcHMuIFNhbWUgZm9yIHRoZSBydHB0aW1lLCBpdAorICAgICAqIHNob3VsZCBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBpbml0aWFsIHRpbWUgbmV3c2VnbWVudC4gKi8KKyAgICBmaWVsZHMgPSBnX3N0cnNwbGl0IChpbmZvc1tpXSwgIjsiLCAwKTsKKyAgICBmb3IgKGogPSAwOyBmaWVsZHNbal07IGorKykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicGFyc2luZyBmaWVsZCAlcyIsIGZpZWxkc1tqXSk7CisgICAgICAvKiByZW1vdmUgbGVhZGluZyB3aGl0ZXNwYWNlICovCisgICAgICBmaWVsZHNbal0gPSBnX3N0cmNodWcgKGZpZWxkc1tqXSk7CisgICAgICBpZiAoZ19zdHJfaGFzX3ByZWZpeCAoZmllbGRzW2pdLCAidXJsPSIpKSB7CisgICAgICAgIC8qIGdldCB0aGUgdXJsIGFuZCB0aGUgc3RyZWFtICovCisgICAgICAgIHN0cmVhbSA9CisgICAgICAgICAgICBmaW5kX3N0cmVhbSAoc3JjLCAoZmllbGRzW2pdICsgNCksIChncG9pbnRlcikgZmluZF9zdHJlYW1fYnlfc2V0dXApOworICAgICAgfSBlbHNlIGlmIChnX3N0cl9oYXNfcHJlZml4IChmaWVsZHNbal0sICJzZXE9IikpIHsKKyAgICAgICAgc2VxYmFzZSA9IGF0b2kgKGZpZWxkc1tqXSArIDQpOworICAgICAgfSBlbHNlIGlmIChnX3N0cl9oYXNfcHJlZml4IChmaWVsZHNbal0sICJydHB0aW1lPSIpKSB7CisgICAgICAgIHRpbWViYXNlID0gZ19hc2NpaV9zdHJ0b2xsIChmaWVsZHNbal0gKyA4LCBOVUxMLCAxMCk7CisgICAgICB9CisgICAgfQorICAgIGdfc3RyZnJlZXYgKGZpZWxkcyk7CisgICAgLyogbm93IHdlIG5lZWQgdG8gc3RvcmUgdGhlIHZhbHVlcyBmb3IgdGhlIGNhcHMgb2YgdGhlIHN0cmVhbSAqLworICAgIGlmIChzdHJlYW0gIT0gTlVMTCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLAorICAgICAgICAgICJmb3VuZCBzdHJlYW0gJXAsIHNldHRpbmc6IHNlcWJhc2UgJWQsIHRpbWViYXNlICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICAgICBzdHJlYW0sIHNlcWJhc2UsIHRpbWViYXNlKTsKKworICAgICAgLyogd2UgaGF2ZSBhIHN0cmVhbSwgY29uZmlndXJlIGRldGVjdGVkIHBhcmFtcyAqLworICAgICAgc3RyZWFtLT5zZXFiYXNlID0gc2VxYmFzZTsKKyAgICAgIHN0cmVhbS0+dGltZWJhc2UgPSB0aW1lYmFzZTsKKyAgICB9CisgIH0KKyAgZ19zdHJmcmVldiAoaW5mb3MpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfaGFuZGxlX3J0Y3BfaW50ZXJ2YWwgKEdzdFJUU1BTcmMgKiBzcmMsIGdjaGFyICogcnRjcCkKK3sKKyAgZ3VpbnQ2NCBpbnRlcnZhbDsKKyAgR0xpc3QgKndhbGs7CisKKyAgaW50ZXJ2YWwgPSBzdHJ0b3VsIChydGNwLCBOVUxMLCAxMCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInJ0Y3AgaW50ZXJ2YWw6ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBtcyIsIGludGVydmFsKTsKKworICBpZiAoIWludGVydmFsKQorICAgIHJldHVybjsKKworICBpbnRlcnZhbCAqPSBHU1RfTVNFQ09ORDsKKworICBmb3IgKHdhbGsgPSBzcmMtPnN0cmVhbXM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RSVFNQU3RyZWFtICpzdHJlYW0gPSAoR3N0UlRTUFN0cmVhbSAqKSB3YWxrLT5kYXRhOworCisgICAgLyogYWxyZWFkeSAob3B0aW9uYWxseSkgcmV0cmlldmVkIHRoaXMgd2hlbiBjb25maWd1cmluZyBtYW5hZ2VyICovCisgICAgaWYgKHN0cmVhbS0+c2Vzc2lvbikgeworICAgICAgR09iamVjdCAqcnRwc2Vzc2lvbiA9IHN0cmVhbS0+c2Vzc2lvbjsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY29uZmlndXJlIHJ0Y3AgaW50ZXJ2YWwgaW4gc2Vzc2lvbiAlcCIsCisgICAgICAgICAgcnRwc2Vzc2lvbik7CisgICAgICBnX29iamVjdF9zZXQgKHJ0cHNlc3Npb24sICJydGNwLW1pbi1pbnRlcnZhbCIsIGludGVydmFsLCBOVUxMKTsKKyAgICB9CisgIH0KKworICAvKiBub3cgaXQgaGFwcGVucyB0aGF0IChYZW5vbikgc2VydmVyIHNlbmRpbmcgdGhpcyBtYXkgYWxzbyBwcm92aWRlIGJvZ3VzCisgICAqIFJUQ1AgU1Igc3luYyBkYXRhIChpLmUuIHdpdGggcXVpdGUgc29tZSBqaXR0ZXIpLCBzbyBuZXZlciBtaW5kIHRob3NlCisgICAqIGFuZCBqdXN0IHVzZSBSVFAtSW5mbyB0byBzeW5jICovCisgIGlmIChzcmMtPm1hbmFnZXIpIHsKKyAgICBHT2JqZWN0Q2xhc3MgKmtsYXNzOworCisgICAga2xhc3MgPSBHX09CSkVDVF9HRVRfQ0xBU1MgKEdfT0JKRUNUIChzcmMtPm1hbmFnZXIpKTsKKyAgICBpZiAoZ19vYmplY3RfY2xhc3NfZmluZF9wcm9wZXJ0eSAoa2xhc3MsICJydGNwLXN5bmMiKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY29uZmlndXJpbmcgcnRwIHN5bmMgbWV0aG9kIik7CisgICAgICBnX29iamVjdF9zZXQgKHNyYy0+bWFuYWdlciwgInJ0Y3Atc3luYyIsIFJUQ1BfU1lOQ19SVFAsIE5VTEwpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgZ2RvdWJsZQorZ3N0X3J0c3BzcmNfZ2V0X2Zsb2F0IChjb25zdCBnY2hhciAqIGRzdHIpCit7CisgIGdjaGFyIHNbR19BU0NJSV9EVE9TVFJfQlVGX1NJWkVdID0geyAwLCB9OworCisgIC8qIGNhbm9uaWNhbGlzZSBmbG9hdGluZyBwb2ludCBzdHJpbmcgc28gd2UgY2FuIGhhbmRsZSBmbG9hdCBzdHJpbmdzCisgICAqIGluIHRoZSBmb3JtICIyNC45MzAiIG9yICIyNCw5MzAiIGlycmVzcGVjdGl2ZSBvZiB0aGUgY3VycmVudCBsb2NhbGUgKi8KKyAgZ19zdHJsY3B5IChzLCBkc3RyLCBzaXplb2YgKHMpKTsKKyAgZ19zdHJkZWxpbWl0IChzLCAiLCIsICcuJyk7CisgIHJldHVybiBnX2FzY2lpX3N0cnRvZCAocywgTlVMTCk7Cit9CisKK3N0YXRpYyBnY2hhciAqCitnZW5fcmFuZ2VfaGVhZGVyIChHc3RSVFNQU3JjICogc3JjLCBHc3RTZWdtZW50ICogc2VnbWVudCkKK3sKKyAgZ2NoYXIgdmFsX3N0cltHX0FTQ0lJX0RUT1NUUl9CVUZfU0laRV0gPSB7IDAsIH07CisKKyAgaWYgKHNyYy0+cmFuZ2UgJiYgc3JjLT5yYW5nZS0+bWluLnR5cGUgPT0gR1NUX1JUU1BfVElNRV9OT1cpIHsKKyAgICBnX3N0cmxjcHkgKHZhbF9zdHIsICJub3ciLCBzaXplb2YgKHZhbF9zdHIpKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoc2VnbWVudC0+cG9zaXRpb24gPT0gMCkgeworICAgICAgZ19zdHJsY3B5ICh2YWxfc3RyLCAiMCIsIHNpemVvZiAodmFsX3N0cikpOworICAgIH0gZWxzZSB7CisgICAgICBnX2FzY2lpX2R0b3N0ciAodmFsX3N0ciwgc2l6ZW9mICh2YWxfc3RyKSwKKyAgICAgICAgICAoKGdkb3VibGUpIHNlZ21lbnQtPnBvc2l0aW9uKSAvIEdTVF9TRUNPTkQpOworICAgIH0KKyAgfQorICByZXR1cm4gZ19zdHJkdXBfcHJpbnRmICgibnB0PSVzLSIsIHZhbF9zdHIpOworfQorCitzdGF0aWMgdm9pZAorY2xlYXJfcnRwX2Jhc2UgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFJUU1BTdHJlYW0gKiBzdHJlYW0pCit7CisgIGd1aW50IGksIGxlbjsKKworICBzdHJlYW0tPnRpbWViYXNlID0gLTE7CisgIHN0cmVhbS0+c2VxYmFzZSA9IC0xOworCisgIGxlbiA9IHN0cmVhbS0+cHRtYXAtPmxlbjsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgUHRNYXBJdGVtICppdGVtID0gJmdfYXJyYXlfaW5kZXggKHN0cmVhbS0+cHRtYXAsIFB0TWFwSXRlbSwgaSk7CisgICAgR3N0U3RydWN0dXJlICpzOworCisgICAgaWYgKGl0ZW0tPmNhcHMgPT0gTlVMTCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaXRlbS0+Y2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGl0ZW0tPmNhcHMpOworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChpdGVtLT5jYXBzLCAwKTsKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZHMgKHMsICJjbG9jay1iYXNlIiwgInNlcW51bS1iYXNlIiwgTlVMTCk7CisgICAgaWYgKGl0ZW0tPnB0ID09IHN0cmVhbS0+ZGVmYXVsdF9wdCAmJiBzdHJlYW0tPnVkcHNyY1swXSkKKyAgICAgIGdfb2JqZWN0X3NldCAoc3RyZWFtLT51ZHBzcmNbMF0sICJjYXBzIiwgaXRlbS0+Y2FwcywgTlVMTCk7CisgIH0KKyAgc3RyZWFtLT5uZWVkX2NhcHMgPSBUUlVFOworfQorCitzdGF0aWMgR3N0UlRTUFJlc3VsdAorZ3N0X3J0c3BzcmNfZW5zdXJlX29wZW4gKEdzdFJUU1BTcmMgKiBzcmMsIGdib29sZWFuIGFzeW5jKQoreworICBHc3RSVFNQUmVzdWx0IHJlcyA9IEdTVF9SVFNQX09LOworCisgIGlmIChzcmMtPnN0YXRlIDwgR1NUX1JUU1BfU1RBVEVfUkVBRFkpIHsKKyAgICByZXMgPSBHU1RfUlRTUF9FUlJPUjsKKyAgICBpZiAoc3JjLT5vcGVuX2Vycm9yKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJ0aGUgc3RyZWFtIHdhcyBpbiBlcnJvciIpOworICAgICAgZ290byBkb25lOworICAgIH0KKyAgICBpZiAoYXN5bmMpCisgICAgICBnc3RfcnRzcHNyY19sb29wX3N0YXJ0X2NtZCAoc3JjLCBDTURfT1BFTik7CisKKyAgICBpZiAoKHJlcyA9IGdzdF9ydHNwc3JjX29wZW4gKHNyYywgYXN5bmMpKSA8IDApIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImZhaWxlZCB0byBvcGVuIHN0cmVhbSIpOworICAgICAgZ290byBkb25lOworICAgIH0KKyAgfQorCitkb25lOgorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0UlRTUFJlc3VsdAorZ3N0X3J0c3BzcmNfcGxheSAoR3N0UlRTUFNyYyAqIHNyYywgR3N0U2VnbWVudCAqIHNlZ21lbnQsIGdib29sZWFuIGFzeW5jLAorICAgIGNvbnN0IGdjaGFyICogc2Vla19zdHlsZSkKK3sKKyAgR3N0UlRTUE1lc3NhZ2UgcmVxdWVzdCA9IHsgMCB9OworICBHc3RSVFNQTWVzc2FnZSByZXNwb25zZSA9IHsgMCB9OworICBHc3RSVFNQUmVzdWx0IHJlcyA9IEdTVF9SVFNQX09LOworICBHTGlzdCAqd2FsazsKKyAgZ2NoYXIgKmh2YWw7CisgIGdpbnQgaHZhbF9pZHg7CisgIGNvbnN0IGdjaGFyICpjb250cm9sOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIlBMQVkuLi4iKTsKKworcmVzdGFydDoKKyAgaWYgKChyZXMgPSBnc3RfcnRzcHNyY19lbnN1cmVfb3BlbiAoc3JjLCBhc3luYykpIDwgMCkKKyAgICBnb3RvIG9wZW5fZmFpbGVkOworCisgIGlmICghKHNyYy0+bWV0aG9kcyAmIEdTVF9SVFNQX1BMQVkpKQorICAgIGdvdG8gbm90X3N1cHBvcnRlZDsKKworICBpZiAoc3JjLT5zdGF0ZSA9PSBHU1RfUlRTUF9TVEFURV9QTEFZSU5HKQorICAgIGdvdG8gd2FzX3BsYXlpbmc7CisKKyAgaWYgKCFzcmMtPmNvbm5pbmZvLmNvbm5lY3Rpb24gfHwgIXNyYy0+Y29ubmluZm8uY29ubmVjdGVkKQorICAgIGdvdG8gZG9uZTsKKworICAvKiBzZW5kIHNvbWUgZHVtbXkgcGFja2V0cyBiZWZvcmUgd2UgYWN0aXZhdGUgdGhlIHJlY2VpdmUgaW4gdGhlCisgICAqIHVkcCBzb3VyY2VzICovCisgIGdzdF9ydHNwc3JjX3NlbmRfZHVtbXlfcGFja2V0cyAoc3JjKTsKKworICAvKiByZXF1aXJlIG5ldyBTUiBwYWNrZXRzICovCisgIGlmIChzcmMtPm1hbmFnZXIpCisgICAgZ19zaWduYWxfZW1pdF9ieV9uYW1lIChzcmMtPm1hbmFnZXIsICJyZXNldC1zeW5jIiwgTlVMTCk7CisKKyAgLyogY29uc3RydWN0IGEgY29udHJvbCB1cmwgKi8KKyAgY29udHJvbCA9IGdldF9hZ2dyZWdhdGVfY29udHJvbCAoc3JjKTsKKworICBmb3IgKHdhbGsgPSBzcmMtPnN0cmVhbXM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RSVFNQU3RyZWFtICpzdHJlYW0gPSAoR3N0UlRTUFN0cmVhbSAqKSB3YWxrLT5kYXRhOworICAgIGNvbnN0IGdjaGFyICpzZXR1cF91cmw7CisgICAgR3N0UlRTUENvbm5JbmZvICpjb25uaW5mbzsKKworICAgIC8qIHRyeSBhZ2dyZWdhdGUgY29udHJvbCBmaXJzdCBidXQgZG8gbm9uLWFnZ3JlZ2F0ZSBjb250cm9sIG90aGVyd2lzZSAqLworICAgIGlmIChjb250cm9sKQorICAgICAgc2V0dXBfdXJsID0gY29udHJvbDsKKyAgICBlbHNlIGlmICgoc2V0dXBfdXJsID0gc3RyZWFtLT5jb25uaW5mby5sb2NhdGlvbikgPT0gTlVMTCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKHNyYy0+Y29ubmluZm8uY29ubmVjdGlvbikgeworICAgICAgY29ubmluZm8gPSAmc3JjLT5jb25uaW5mbzsKKyAgICB9IGVsc2UgaWYgKHN0cmVhbS0+Y29ubmluZm8uY29ubmVjdGlvbikgeworICAgICAgY29ubmluZm8gPSAmc3RyZWFtLT5jb25uaW5mbzsKKyAgICB9IGVsc2UgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLyogZG8gcGxheSAqLworICAgIHJlcyA9IGdzdF9ydHNwc3JjX2luaXRfcmVxdWVzdCAoc3JjLCAmcmVxdWVzdCwgR1NUX1JUU1BfUExBWSwgc2V0dXBfdXJsKTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgIGdvdG8gY3JlYXRlX3JlcXVlc3RfZmFpbGVkOworCisgICAgaWYgKHNyYy0+bmVlZF9yYW5nZSAmJiBzcmMtPnNlZWthYmxlID49IDAuMCkgeworICAgICAgaHZhbCA9IGdlbl9yYW5nZV9oZWFkZXIgKHNyYywgc2VnbWVudCk7CisKKyAgICAgIGdzdF9ydHNwX21lc3NhZ2VfdGFrZV9oZWFkZXIgKCZyZXF1ZXN0LCBHU1RfUlRTUF9IRFJfUkFOR0UsIGh2YWwpOworCisgICAgICAvKiBzdG9yZSB0aGUgbmV3c2VnbWVudCBldmVudCBzbyBpdCBjYW4gYmUgc2VudCBmcm9tIHRoZSBzdHJlYW1pbmcgdGhyZWFkLiAqLworICAgICAgc3JjLT5uZWVkX3NlZ21lbnQgPSBUUlVFOworICAgIH0KKworICAgIGlmIChzZWdtZW50LT5yYXRlICE9IDEuMCkgeworICAgICAgZ2NoYXIgaHZhbFtHX0FTQ0lJX0RUT1NUUl9CVUZfU0laRV07CisKKyAgICAgIGdfYXNjaWlfZHRvc3RyIChodmFsLCBzaXplb2YgKGh2YWwpLCBzZWdtZW50LT5yYXRlKTsKKyAgICAgIGlmIChzcmMtPnNraXApCisgICAgICAgIGdzdF9ydHNwX21lc3NhZ2VfYWRkX2hlYWRlciAoJnJlcXVlc3QsIEdTVF9SVFNQX0hEUl9TQ0FMRSwgaHZhbCk7CisgICAgICBlbHNlCisgICAgICAgIGdzdF9ydHNwX21lc3NhZ2VfYWRkX2hlYWRlciAoJnJlcXVlc3QsIEdTVF9SVFNQX0hEUl9TUEVFRCwgaHZhbCk7CisgICAgfQorCisgICAgaWYgKHNlZWtfc3R5bGUpCisgICAgICBnc3RfcnRzcF9tZXNzYWdlX2FkZF9oZWFkZXIgKCZyZXF1ZXN0LCBHU1RfUlRTUF9IRFJfU0VFS19TVFlMRSwKKyAgICAgICAgICBzZWVrX3N0eWxlKTsKKworICAgIGlmIChhc3luYykKKyAgICAgIEdTVF9FTEVNRU5UX1BST0dSRVNTIChzcmMsIENPTlRJTlVFLCAicmVxdWVzdCIsICgiU2VuZGluZyBQTEFZIHJlcXVlc3QiKSk7CisKKyAgICBpZiAoKHJlcyA9CisgICAgICAgICAgICBnc3RfcnRzcHNyY19zZW5kIChzcmMsIGNvbm5pbmZvLCAmcmVxdWVzdCwgJnJlc3BvbnNlLCBOVUxMLCBOVUxMKSkKKyAgICAgICAgPCAwKQorICAgICAgZ290byBzZW5kX2Vycm9yOworCisgICAgaWYgKHNyYy0+bmVlZF9yZWRpcmVjdCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLAorICAgICAgICAgICJyZWRpcmVjdDogdGVhcmluZyBkb3duIGFuZCByZXN0YXJ0aW5nIHdpdGggbmV3IHVybCIpOworICAgICAgLyogdGVhcmRvd24gYW5kIHJlc3RhcnQgd2l0aCBuZXcgdXJsICovCisgICAgICBnc3RfcnRzcHNyY19jbG9zZSAoc3JjLCBUUlVFLCBGQUxTRSk7CisgICAgICAvKiByZXNldCBwcm90b2NvbHMgdG8gZm9yY2UgcmUtbmVnb3RpYXRpb24gd2l0aCByZWRpcmVjdGVkIHVybCAqLworICAgICAgc3JjLT5jdXJfcHJvdG9jb2xzID0gc3JjLT5wcm90b2NvbHM7CisgICAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVxdWVzdCk7CisgICAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVzcG9uc2UpOworICAgICAgZ290byByZXN0YXJ0OworICAgIH0KKworICAgIC8qIHNlZWsgbWF5IGhhdmUgc2lsZW50bHkgZmFpbGVkIGFzIGl0IGlzIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICBpZiAoIShzcmMtPm1ldGhvZHMgJiBHU1RfUlRTUF9QTEFZKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiUExBWSBSYW5nZSBub3Qgc3VwcG9ydGVkOyByZS1lbmFibGUgUExBWSIpOworCisgICAgICBpZiAoc3JjLT52ZXJzaW9uID49IEdTVF9SVFNQX1ZFUlNJT05fMl8wICYmIHNyYy0+c2Vla2FibGUgPj0gMC4wKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiU2VydmVyIGRlY2xhcmVkIHN0cmVhbSBhcyBzZWVrYWJsZSBidXQiCisgICAgICAgICAgICAiIHBsYXlpbmcgd2l0aCByYW5nZSBmYWlsZWQuLi4gSWdub3JpbmcgaW5mb3JtYXRpb24uIik7CisgICAgICB9CisgICAgICAvKiBvYnZpb3VzbHkgaXQgaXMgc3VwcG9ydGVkIGFzIHdlIG1hZGUgaXQgaGVyZSAqLworICAgICAgc3JjLT5tZXRob2RzIHw9IEdTVF9SVFNQX1BMQVk7CisgICAgICBzcmMtPnNlZWthYmxlID0gLTEuMDsKKyAgICAgIC8qIGJ1dCB0aGVyZSBpcyBub3RoaW5nIHRvIHBhcnNlIGluIHRoZSByZXNwb25zZSwKKyAgICAgICAqIHNvIGNvbnZleSB3ZSBoYXZlIG5vIGlkZWEgYW5kIG5vdCB0byBleHBlY3QgYW55dGhpbmcgcGFydGljdWxhciAqLworICAgICAgY2xlYXJfcnRwX2Jhc2UgKHNyYywgc3RyZWFtKTsKKyAgICAgIGlmIChjb250cm9sKSB7CisgICAgICAgIEdMaXN0ICpydW47CisKKyAgICAgICAgLyogbmVlZCB0byBkbyBmb3IgYWxsIHN0cmVhbXMgKi8KKyAgICAgICAgZm9yIChydW4gPSBzcmMtPnN0cmVhbXM7IHJ1bjsgcnVuID0gZ19saXN0X25leHQgKHJ1bikpCisgICAgICAgICAgY2xlYXJfcnRwX2Jhc2UgKHNyYywgKEdzdFJUU1BTdHJlYW0gKikgcnVuLT5kYXRhKTsKKyAgICAgIH0KKyAgICAgIC8qIE5PVEUgdGhlIGFib3ZlIGFsc28gZGlzYWJsZXMgbnB0IGJhc2VkIGVvcyBkZXRlY3Rpb24gKi8KKyAgICAgIC8qIGFuZCBiZWxvdyBmb3JjZXMgcG9zaXRpb24gdG8gMCwKKyAgICAgICAqIHdoaWNoIGlzIHZpc2libGUgZmVlZGJhY2sgd2UgbG9zdCB0aGUgcGxvdCAqLworICAgICAgc2VnbWVudC0+c3RhcnQgPSBzZWdtZW50LT5wb3NpdGlvbiA9IHNyYy0+bGFzdF9wb3M7CisgICAgfQorCisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJnJlcXVlc3QpOworCisgICAgLyogcGFyc2UgUlRQIG5wdCBmaWVsZC4gVGhpcyBpcyB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtIChOb3JtYWwKKyAgICAgKiBQbGF5IFRpbWUpIGFuZCBzaG91bGQgYmUgcHV0IGluIHRoZSBORVdTRUdNRU5UIHBvc2l0aW9uIGZpZWxkLiAqLworICAgIGlmIChnc3RfcnRzcF9tZXNzYWdlX2dldF9oZWFkZXIgKCZyZXNwb25zZSwgR1NUX1JUU1BfSERSX1JBTkdFLCAmaHZhbCwKKyAgICAgICAgICAgIDApID09IEdTVF9SVFNQX09LKQorICAgICAgZ3N0X3J0c3BzcmNfcGFyc2VfcmFuZ2UgKHNyYywgaHZhbCwgc2VnbWVudCk7CisKKyAgICAvKiBhc3N1bWUgMS4wIHJhdGUgbm93LCBvdmVyd3JpdGUgd2hlbiB0aGUgU0NBTEUgb3IgU1BFRUQgaGVhZGVycyBhcmUgcHJlc2VudC4gKi8KKyAgICBzZWdtZW50LT5yYXRlID0gMS4wOworCisgICAgLyogcGFyc2UgU3BlZWQgaGVhZGVyLiBUaGlzIGlzIHRoZSBpbnRlbmRlZCBwbGF5YmFjayByYXRlIG9mIHRoZSBzdHJlYW0KKyAgICAgKiBhbmQgc2hvdWxkIGJlIHB1dCBpbiB0aGUgTkVXU0VHTUVOVCByYXRlIGZpZWxkLiAqLworICAgIGlmIChnc3RfcnRzcF9tZXNzYWdlX2dldF9oZWFkZXIgKCZyZXNwb25zZSwgR1NUX1JUU1BfSERSX1NQRUVELCAmaHZhbCwKKyAgICAgICAgICAgIDApID09IEdTVF9SVFNQX09LKSB7CisgICAgICBzZWdtZW50LT5yYXRlID0gZ3N0X3J0c3BzcmNfZ2V0X2Zsb2F0IChodmFsKTsKKyAgICB9IGVsc2UgaWYgKGdzdF9ydHNwX21lc3NhZ2VfZ2V0X2hlYWRlciAoJnJlc3BvbnNlLCBHU1RfUlRTUF9IRFJfU0NBTEUsCisgICAgICAgICAgICAmaHZhbCwgMCkgPT0gR1NUX1JUU1BfT0spIHsKKyAgICAgIHNlZ21lbnQtPnJhdGUgPSBnc3RfcnRzcHNyY19nZXRfZmxvYXQgKGh2YWwpOworICAgIH0KKworICAgIC8qIHBhcnNlIHRoZSBSVFAtSW5mbyBoZWFkZXIgZmllbGQgKGlmIEFOWSkgdG8gZ2V0IHRoZSBiYXNlIHNlcW51bSBhbmQgdGltZXN0YW1wCisgICAgICogZm9yIHRoZSBSVFAgcGFja2V0cy4gSWYgdGhpcyBpcyBub3QgcHJlc2VudCwgd2UgYXNzdW1lIGFsbCBzdGFydHMgZnJvbSAwLi4uCisgICAgICogVGhpcyBpcyBpbmZvIGZvciB0aGUgUlRQIHNlc3Npb24gbWFuYWdlciB0aGF0IHdlIHBhc3MgdG8gaXQgaW4gY2Fwcy4gKi8KKyAgICBodmFsX2lkeCA9IDA7CisgICAgd2hpbGUgKGdzdF9ydHNwX21lc3NhZ2VfZ2V0X2hlYWRlciAoJnJlc3BvbnNlLCBHU1RfUlRTUF9IRFJfUlRQX0lORk8sCisgICAgICAgICAgICAmaHZhbCwgaHZhbF9pZHgrKykgPT0gR1NUX1JUU1BfT0spCisgICAgICBnc3RfcnRzcHNyY19wYXJzZV9ydHBpbmZvIChzcmMsIGh2YWwpOworCisgICAgLyogc29tZSBzZXJ2ZXJzIGluZGljYXRlIFJUQ1AgcGFyYW1ldGVycyBpbiBQTEFZIHJlc3BvbnNlLAorICAgICAqIHJhdGhlciB0aGFuIHByb3Blcmx5IGluIFNEUCAqLworICAgIGlmIChnc3RfcnRzcF9tZXNzYWdlX2dldF9oZWFkZXIgKCZyZXNwb25zZSwgR1NUX1JUU1BfSERSX1JUQ1BfSU5URVJWQUwsCisgICAgICAgICAgICAmaHZhbCwgMCkgPT0gR1NUX1JUU1BfT0spCisgICAgICBnc3RfcnRzcHNyY19oYW5kbGVfcnRjcF9pbnRlcnZhbCAoc3JjLCBodmFsKTsKKworICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZyZXNwb25zZSk7CisKKyAgICAvKiBlYXJseSBleGl0IHdoZW4gd2UgZGlkIGFnZ3JlZ2F0ZSBjb250cm9sICovCisgICAgaWYgKGNvbnRyb2wpCisgICAgICBicmVhazsKKyAgfQorICAvKiBjb25maWd1cmUgdGhlIGNhcHMgb2YgdGhlIHN0cmVhbXMgYWZ0ZXIgd2UgcGFyc2VkIGFsbCBoZWFkZXJzLiBPbmx5IHJlc2V0CisgICAqIHRoZSBtYW5hZ2VyIG9iamVjdCB3aGVuIHdlIHNldCBhIG5ldyBSYW5nZSBoZWFkZXIgKHdlIGRpZCBhIHNlZWspICovCisgIGdzdF9ydHNwc3JjX2NvbmZpZ3VyZV9jYXBzIChzcmMsIHNlZ21lbnQsIHNyYy0+bmVlZF9yYW5nZSk7CisKKyAgLyogc2V0IHRvIFBMQVlJTkcgYWZ0ZXIgd2UgaGF2ZSBjb25maWd1cmVkIHRoZSBjYXBzLCBvdGhlcndpc2Ugd2UKKyAgICogbWlnaHQgZW5kIHVwIGNhbGxpbmcgcmVxdWVzdF9rZXkgKHdpdGggU1JUUCkgd2hpbGUgY2FwcyBhcmUgc3RpbGwKKyAgICogYmVpbmcgY29uZmlndXJlZC4gKi8KKyAgZ3N0X3J0c3BzcmNfc2V0X3N0YXRlIChzcmMsIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICAvKiBzZXQgYWdhaW4gd2hlbiBuZWVkZWQgKi8KKyAgc3JjLT5uZWVkX3JhbmdlID0gRkFMU0U7CisKKyAgc3JjLT5ydW5uaW5nID0gVFJVRTsKKyAgc3JjLT5iYXNlX3RpbWUgPSAtMTsKKyAgc3JjLT5zdGF0ZSA9IEdTVF9SVFNQX1NUQVRFX1BMQVlJTkc7CisKKyAgLyogbWFyayBkaXNjb250ICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIm1hcmsgRElTQ09OVCwgd2UgZGlkIGEgc2VlayB0byBhbm90aGVyIHBvc2l0aW9uIik7CisgIGZvciAod2FsayA9IHNyYy0+c3RyZWFtczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BTdHJlYW0gKnN0cmVhbSA9IChHc3RSVFNQU3RyZWFtICopIHdhbGstPmRhdGE7CisgICAgc3RyZWFtLT5kaXNjb250ID0gVFJVRTsKKyAgfQorCitkb25lOgorICBpZiAoYXN5bmMpCisgICAgZ3N0X3J0c3BzcmNfbG9vcF9lbmRfY21kIChzcmMsIENNRF9QTEFZLCByZXMpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitvcGVuX2ZhaWxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImZhaWxlZCB0byBvcGVuIHN0cmVhbSIpOworICAgIGdvdG8gZG9uZTsKKyAgfQorbm90X3N1cHBvcnRlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIlBMQVkgaXMgbm90IHN1cHBvcnRlZCIpOworICAgIGdvdG8gZG9uZTsKKyAgfQord2FzX3BsYXlpbmc6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJ3ZSB3ZXJlIGFscmVhZHkgUExBWUlORyIpOworICAgIGdvdG8gZG9uZTsKKyAgfQorY3JlYXRlX3JlcXVlc3RfZmFpbGVkOgorICB7CisgICAgZ2NoYXIgKnN0ciA9IGdzdF9ydHNwX3N0cnJlc3VsdCAocmVzKTsKKworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIExJQlJBUlksIElOSVQsIChOVUxMKSwKKyAgICAgICAgKCJDb3VsZCBub3QgY3JlYXRlIHJlcXVlc3QuICglcykiLCBzdHIpKTsKKyAgICBnX2ZyZWUgKHN0cik7CisgICAgZ290byBkb25lOworICB9CitzZW5kX2Vycm9yOgorICB7CisgICAgZ2NoYXIgKnN0ciA9IGdzdF9ydHNwX3N0cnJlc3VsdCAocmVzKTsKKworICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZyZXF1ZXN0KTsKKyAgICBpZiAocmVzICE9IEdTVF9SVFNQX0VJTlRSKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgV1JJVEUsIChOVUxMKSwKKyAgICAgICAgICAoIkNvdWxkIG5vdCBzZW5kIG1lc3NhZ2UuICglcykiLCBzdHIpKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJQTEFZIGludGVycnVwdGVkIik7CisgICAgfQorICAgIGdfZnJlZSAoc3RyKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX3BhdXNlIChHc3RSVFNQU3JjICogc3JjLCBnYm9vbGVhbiBhc3luYykKK3sKKyAgR3N0UlRTUFJlc3VsdCByZXMgPSBHU1RfUlRTUF9PSzsKKyAgR3N0UlRTUE1lc3NhZ2UgcmVxdWVzdCA9IHsgMCB9OworICBHc3RSVFNQTWVzc2FnZSByZXNwb25zZSA9IHsgMCB9OworICBHTGlzdCAqd2FsazsKKyAgY29uc3QgZ2NoYXIgKmNvbnRyb2w7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiUEFVU0UuLi4iKTsKKworICBpZiAoKHJlcyA9IGdzdF9ydHNwc3JjX2Vuc3VyZV9vcGVuIChzcmMsIGFzeW5jKSkgPCAwKQorICAgIGdvdG8gb3Blbl9mYWlsZWQ7CisKKyAgaWYgKCEoc3JjLT5tZXRob2RzICYgR1NUX1JUU1BfUEFVU0UpKQorICAgIGdvdG8gbm90X3N1cHBvcnRlZDsKKworICBpZiAoc3JjLT5zdGF0ZSA9PSBHU1RfUlRTUF9TVEFURV9SRUFEWSkKKyAgICBnb3RvIHdhc19wYXVzZWQ7CisKKyAgaWYgKCFzcmMtPmNvbm5pbmZvLmNvbm5lY3Rpb24gfHwgIXNyYy0+Y29ubmluZm8uY29ubmVjdGVkKQorICAgIGdvdG8gbm9fY29ubmVjdGlvbjsKKworICAvKiBjb25zdHJ1Y3QgYSBjb250cm9sIHVybCAqLworICBjb250cm9sID0gZ2V0X2FnZ3JlZ2F0ZV9jb250cm9sIChzcmMpOworCisgIC8qIGxvb3Agb3ZlciB0aGUgc3RyZWFtcy4gV2UgbWlnaHQgZXhpdCB0aGUgbG9vcCBlYXJseSB3aGVuIHdlIGNvdWxkIGRvIGFuCisgICAqIGFnZ3JlZ2F0ZSBjb250cm9sICovCisgIGZvciAod2FsayA9IHNyYy0+c3RyZWFtczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BTdHJlYW0gKnN0cmVhbSA9IChHc3RSVFNQU3RyZWFtICopIHdhbGstPmRhdGE7CisgICAgR3N0UlRTUENvbm5JbmZvICpjb25uaW5mbzsKKyAgICBjb25zdCBnY2hhciAqc2V0dXBfdXJsOworCisgICAgLyogdHJ5IGFnZ3JlZ2F0ZSBjb250cm9sIGZpcnN0IGJ1dCBkbyBub24tYWdncmVnYXRlIGNvbnRyb2wgb3RoZXJ3aXNlICovCisgICAgaWYgKGNvbnRyb2wpCisgICAgICBzZXR1cF91cmwgPSBjb250cm9sOworICAgIGVsc2UgaWYgKChzZXR1cF91cmwgPSBzdHJlYW0tPmNvbm5pbmZvLmxvY2F0aW9uKSA9PSBOVUxMKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoc3JjLT5jb25uaW5mby5jb25uZWN0aW9uKSB7CisgICAgICBjb25uaW5mbyA9ICZzcmMtPmNvbm5pbmZvOworICAgIH0gZWxzZSBpZiAoc3RyZWFtLT5jb25uaW5mby5jb25uZWN0aW9uKSB7CisgICAgICBjb25uaW5mbyA9ICZzdHJlYW0tPmNvbm5pbmZvOworICAgIH0gZWxzZSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAoYXN5bmMpCisgICAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBDT05USU5VRSwgInJlcXVlc3QiLAorICAgICAgICAgICgiU2VuZGluZyBQQVVTRSByZXF1ZXN0IikpOworCisgICAgaWYgKChyZXMgPQorICAgICAgICAgICAgZ3N0X3J0c3BzcmNfaW5pdF9yZXF1ZXN0IChzcmMsICZyZXF1ZXN0LCBHU1RfUlRTUF9QQVVTRSwKKyAgICAgICAgICAgICAgICBzZXR1cF91cmwpKSA8IDApCisgICAgICBnb3RvIGNyZWF0ZV9yZXF1ZXN0X2ZhaWxlZDsKKworICAgIGlmICgocmVzID0KKyAgICAgICAgICAgIGdzdF9ydHNwc3JjX3NlbmQgKHNyYywgY29ubmluZm8sICZyZXF1ZXN0LCAmcmVzcG9uc2UsIE5VTEwsCisgICAgICAgICAgICAgICAgTlVMTCkpIDwgMCkKKyAgICAgIGdvdG8gc2VuZF9lcnJvcjsKKworICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZyZXF1ZXN0KTsKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVzcG9uc2UpOworCisgICAgLyogZXhpdCBlYXJseSB3aGVuIHdlIGRpZCBhZ3JlZ2F0ZSBjb250cm9sICovCisgICAgaWYgKGNvbnRyb2wpCisgICAgICBicmVhazsKKyAgfQorCisgIC8qIGNoYW5nZSBlbGVtZW50IHN0YXRlcyBub3cgKi8KKyAgZ3N0X3J0c3BzcmNfc2V0X3N0YXRlIChzcmMsIEdTVF9TVEFURV9QQVVTRUQpOworCitub19jb25uZWN0aW9uOgorICBzcmMtPnN0YXRlID0gR1NUX1JUU1BfU1RBVEVfUkVBRFk7CisKK2RvbmU6CisgIGlmIChhc3luYykKKyAgICBnc3RfcnRzcHNyY19sb29wX2VuZF9jbWQgKHNyYywgQ01EX1BBVVNFLCByZXMpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitvcGVuX2ZhaWxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImZhaWxlZCB0byBvcGVuIHN0cmVhbSIpOworICAgIGdvdG8gZG9uZTsKKyAgfQorbm90X3N1cHBvcnRlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIlBBVVNFIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK3dhc19wYXVzZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJ3ZSB3ZXJlIGFscmVhZHkgUEFVU0VEIik7CisgICAgZ290byBkb25lOworICB9CitjcmVhdGVfcmVxdWVzdF9mYWlsZWQ6CisgIHsKKyAgICBnY2hhciAqc3RyID0gZ3N0X3J0c3Bfc3RycmVzdWx0IChyZXMpOworCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgTElCUkFSWSwgSU5JVCwgKE5VTEwpLAorICAgICAgICAoIkNvdWxkIG5vdCBjcmVhdGUgcmVxdWVzdC4gKCVzKSIsIHN0cikpOworICAgIGdfZnJlZSAoc3RyKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK3NlbmRfZXJyb3I6CisgIHsKKyAgICBnY2hhciAqc3RyID0gZ3N0X3J0c3Bfc3RycmVzdWx0IChyZXMpOworCisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJnJlcXVlc3QpOworICAgIGlmIChyZXMgIT0gR1NUX1JUU1BfRUlOVFIpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBXUklURSwgKE5VTEwpLAorICAgICAgICAgICgiQ291bGQgbm90IHNlbmQgbWVzc2FnZS4gKCVzKSIsIHN0cikpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgIlBBVVNFIGludGVycnVwdGVkIik7CisgICAgfQorICAgIGdfZnJlZSAoc3RyKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX2hhbmRsZV9tZXNzYWdlIChHc3RCaW4gKiBiaW4sIEdzdE1lc3NhZ2UgKiBtZXNzYWdlKQoreworICBHc3RSVFNQU3JjICpydHNwc3JjOworCisgIHJ0c3BzcmMgPSBHU1RfUlRTUFNSQyAoYmluKTsKKworICBzd2l0Y2ggKEdTVF9NRVNTQUdFX1RZUEUgKG1lc3NhZ2UpKSB7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FT1M6CisgICAgICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VMRU1FTlQ6CisgICAgeworICAgICAgY29uc3QgR3N0U3RydWN0dXJlICpzID0gZ3N0X21lc3NhZ2VfZ2V0X3N0cnVjdHVyZSAobWVzc2FnZSk7CisKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiR3N0VURQU3JjVGltZW91dCIpKSB7CisgICAgICAgIGdib29sZWFuIGlnbm9yZV90aW1lb3V0OworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgInRpbWVvdXQgb24gVURQIHBvcnQiKTsKKworICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHJ0c3BzcmMpOworICAgICAgICBpZ25vcmVfdGltZW91dCA9IHJ0c3BzcmMtPmlnbm9yZV90aW1lb3V0OworICAgICAgICBydHNwc3JjLT5pZ25vcmVfdGltZW91dCA9IFRSVUU7CisgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHNwc3JjKTsKKworICAgICAgICAvKiB3ZSBvbmx5IGFjdCBvbiB0aGUgZmlyc3QgdWRwIHRpbWVvdXQgbWVzc2FnZSwgb3RoZXJzIGFyZSBpcnJlbGV2YW50CisgICAgICAgICAqIGFuZCBjYW4gYmUgaWdub3JlZC4gKi8KKyAgICAgICAgaWYgKCFpZ25vcmVfdGltZW91dCkKKyAgICAgICAgICBnc3RfcnRzcHNyY19sb29wX3NlbmRfY21kIChydHNwc3JjLCBDTURfUkVDT05ORUNULCBDTURfTE9PUCk7CisgICAgICAgIC8qIGVhdCBhbmQgZnJlZSAqLworICAgICAgICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIEdTVF9CSU5fQ0xBU1MgKHBhcmVudF9jbGFzcyktPmhhbmRsZV9tZXNzYWdlIChiaW4sIG1lc3NhZ2UpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX01FU1NBR0VfRVJST1I6CisgICAgeworICAgICAgR3N0T2JqZWN0ICp1ZHBzcmM7CisgICAgICBHc3RSVFNQU3RyZWFtICpzdHJlYW07CisgICAgICBHc3RGbG93UmV0dXJuIHJldDsKKworICAgICAgdWRwc3JjID0gR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRzcHNyYywgImdvdCBlcnJvciBmcm9tICVzIiwKKyAgICAgICAgICBHU1RfRUxFTUVOVF9OQU1FICh1ZHBzcmMpKTsKKworICAgICAgc3RyZWFtID0gZmluZF9zdHJlYW0gKHJ0c3BzcmMsIHVkcHNyYywgKGdwb2ludGVyKSBmaW5kX3N0cmVhbV9ieV91ZHBzcmMpOworICAgICAgaWYgKCFzdHJlYW0pCisgICAgICAgIGdvdG8gZm9yd2FyZDsKKworICAgICAgLyogd2UgaWdub3JlIHRoZSBSVENQIHVkcHNyYyAqLworICAgICAgaWYgKHN0cmVhbS0+dWRwc3JjWzFdID09IEdTVF9FTEVNRU5UX0NBU1QgKHVkcHNyYykpCisgICAgICAgIGdvdG8gZG9uZTsKKworICAgICAgLyogaWYgd2UgZ2V0IGVycm9yIG1lc3NhZ2VzIGZyb20gdGhlIHVkcCBzb3VyY2VzLCB0aGF0J3Mgbm90IGEgcHJvYmxlbSBhcworICAgICAgICogbG9uZyBhcyBub3QgYWxsIG9mIHRoZW0gZXJyb3Igb3V0LiBXZSBhbHNvIGRvbid0IHJlYWxseSBrbm93IHdoYXQgdGhlCisgICAgICAgKiBwcm9ibGVtIGlzLCB0aGUgbWVzc2FnZSBkb2VzIG5vdCBnaXZlIGVub3VnaCBkZXRhaWwuLi4gKi8KKyAgICAgIHJldCA9IGdzdF9ydHNwc3JjX2NvbWJpbmVfZmxvd3MgKHJ0c3BzcmMsIHN0cmVhbSwgR1NUX0ZMT1dfTk9UX0xJTktFRCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHNwc3JjLCAiY29tYmluZWQgZmxvd3M6ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBmb3J3YXJkOworCisgICAgZG9uZToKKyAgICAgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIGJyZWFrOworCisgICAgZm9yd2FyZDoKKyAgICAgIC8qIGZhdGFsIGJ1dCBub3Qgb3VyIG1lc3NhZ2UsIGZvcndhcmQgKi8KKyAgICAgIEdTVF9CSU5fQ0xBU1MgKHBhcmVudF9jbGFzcyktPmhhbmRsZV9tZXNzYWdlIChiaW4sIG1lc3NhZ2UpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgeworICAgICAgR1NUX0JJTl9DTEFTUyAocGFyZW50X2NsYXNzKS0+aGFuZGxlX21lc3NhZ2UgKGJpbiwgbWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworLyogdGhlIHRocmVhZCB3aGVyZSBldmVyeXRoaW5nIGhhcHBlbnMgKi8KK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY190aHJlYWQgKEdzdFJUU1BTcmMgKiBzcmMpCit7CisgIGdpbnQgY21kOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoc3JjKTsKKyAgY21kID0gc3JjLT5wZW5kaW5nX2NtZDsKKyAgaWYgKGNtZCA9PSBDTURfUkVDT05ORUNUIHx8IGNtZCA9PSBDTURfUExBWSB8fCBjbWQgPT0gQ01EX1BBVVNFCisgICAgICB8fCBjbWQgPT0gQ01EX0xPT1AgfHwgY21kID09IENNRF9PUEVOKQorICAgIHNyYy0+cGVuZGluZ19jbWQgPSBDTURfTE9PUDsKKyAgZWxzZQorICAgIHNyYy0+cGVuZGluZ19jbWQgPSBDTURfV0FJVDsKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZ290IGNvbW1hbmQgJXMiLCBjbWRfdG9fc3RyaW5nIChjbWQpKTsKKworICAvKiB3ZSBnb3QgdGhlIG1lc3NhZ2UgY29tbWFuZCwgc28gZW5zdXJlIGNvbW11bmljYXRpb24gaXMgcG9zc2libGUgYWdhaW4gKi8KKyAgZ3N0X3J0c3BzcmNfY29ubmVjdGlvbl9mbHVzaCAoc3JjLCBGQUxTRSk7CisKKyAgc3JjLT5idXN5X2NtZCA9IGNtZDsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7CisKKyAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIENNRF9PUEVOOgorICAgICAgZ3N0X3J0c3BzcmNfb3BlbiAoc3JjLCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX1BMQVk6CisgICAgICBnc3RfcnRzcHNyY19wbGF5IChzcmMsICZzcmMtPnNlZ21lbnQsIFRSVUUsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfUEFVU0U6CisgICAgICBnc3RfcnRzcHNyY19wYXVzZSAoc3JjLCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0NMT1NFOgorICAgICAgZ3N0X3J0c3BzcmNfY2xvc2UgKHNyYywgVFJVRSwgRkFMU0UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfTE9PUDoKKyAgICAgIGdzdF9ydHNwc3JjX2xvb3AgKHNyYyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9SRUNPTk5FQ1Q6CisgICAgICBnc3RfcnRzcHNyY19yZWNvbm5lY3QgKHNyYywgRkFMU0UpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgR1NUX09CSkVDVF9MT0NLIChzcmMpOworICAvKiBhbmQgZ28gYmFjayB0byBzbGVlcCAqLworICBpZiAoc3JjLT5wZW5kaW5nX2NtZCA9PSBDTURfV0FJVCkgeworICAgIGlmIChzcmMtPnRhc2spCisgICAgICBnc3RfdGFza19wYXVzZSAoc3JjLT50YXNrKTsKKyAgfQorICAvKiByZXNldCB3YWl0aW5nICovCisgIHNyYy0+YnVzeV9jbWQgPSBDTURfV0FJVDsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfc3RhcnQgKEdzdFJUU1BTcmMgKiBzcmMpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInN0YXJ0aW5nIik7CisKKyAgR1NUX09CSkVDVF9MT0NLIChzcmMpOworCisgIHNyYy0+cGVuZGluZ19jbWQgPSBDTURfV0FJVDsKKworICBpZiAoc3JjLT50YXNrID09IE5VTEwpIHsKKyAgICBzcmMtPnRhc2sgPSBnc3RfdGFza19uZXcgKChHc3RUYXNrRnVuY3Rpb24pIGdzdF9ydHNwc3JjX3RocmVhZCwgc3JjLCBOVUxMKTsKKyAgICBpZiAoc3JjLT50YXNrID09IE5VTEwpCisgICAgICBnb3RvIHRhc2tfZXJyb3I7CisKKyAgICBnc3RfdGFza19zZXRfbG9jayAoc3JjLT50YXNrLCBHU1RfUlRTUF9TVFJFQU1fR0VUX0xPQ0sgKHNyYykpOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcmMpOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLwordGFza19lcnJvcjoKKyAgeworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcmMpOworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNyYywgImZhaWxlZCB0byBjcmVhdGUgdGFzayIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHNwc3JjX3N0b3AgKEdzdFJUU1BTcmMgKiBzcmMpCit7CisgIEdzdFRhc2sgKnRhc2s7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic3RvcHBpbmciKTsKKworICAvKiBhbHNvIGNhbmNlbHMgcGVuZGluZyB0YXNrICovCisgIGdzdF9ydHNwc3JjX2xvb3Bfc2VuZF9jbWQgKHNyYywgQ01EX1dBSVQsIENNRF9BTEwpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoc3JjKTsKKyAgaWYgKCh0YXNrID0gc3JjLT50YXNrKSkgeworICAgIHNyYy0+dGFzayA9IE5VTEw7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7CisKKyAgICBnc3RfdGFza19zdG9wICh0YXNrKTsKKworICAgIC8qIG1ha2Ugc3VyZSBpdCBpcyBub3QgcnVubmluZyAqLworICAgIEdTVF9SVFNQX1NUUkVBTV9MT0NLIChzcmMpOworICAgIEdTVF9SVFNQX1NUUkVBTV9VTkxPQ0sgKHNyYyk7CisKKyAgICAvKiBub3cgd2FpdCBmb3IgdGhlIHRhc2sgdG8gZmluaXNoICovCisgICAgZ3N0X3Rhc2tfam9pbiAodGFzayk7CisKKyAgICAvKiBhbmQgZnJlZSB0aGUgdGFzayAqLworICAgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1QgKHRhc2spKTsKKworICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3JjKTsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoc3JjKTsKKworICAvKiBlbnN1cmUgc3luY2hyb25vdXNseSBhbGwgaXMgY2xvc2VkIGFuZCBjbGVhbiAqLworICBnc3RfcnRzcHNyY19jbG9zZSAoc3JjLCBGQUxTRSwgVFJVRSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0UlRTUFNyYyAqcnRzcHNyYzsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHJ0c3BzcmMgPSBHU1RfUlRTUFNSQyAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBpZiAoIWdzdF9ydHNwc3JjX3N0YXJ0IChydHNwc3JjKSkKKyAgICAgICAgZ290byBzdGFydF9mYWlsZWQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgLyogaW5pdCBzb21lIHN0YXRlICovCisgICAgICBydHNwc3JjLT5jdXJfcHJvdG9jb2xzID0gcnRzcHNyYy0+cHJvdG9jb2xzOworICAgICAgLyogZmlyc3QgYXR0ZW1wdCwgZG9uJ3QgaWdub3JlIHRpbWVvdXRzICovCisgICAgICBydHNwc3JjLT5pZ25vcmVfdGltZW91dCA9IEZBTFNFOworICAgICAgcnRzcHNyYy0+b3Blbl9lcnJvciA9IEZBTFNFOworICAgICAgZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCAocnRzcHNyYywgQ01EX09QRU4sIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19QTEFZSU5HOgorICAgICAgc2V0X21hbmFnZXJfYnVmZmVyX21vZGUgKHJ0c3BzcmMpOworICAgICAgLyogZmFsbC10aHJvdWdoICovCisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgLyogdW5ibG9jayB0aGUgdGNwIHRhc2tzIGFuZCBtYWtlIHRoZSBsb29wIHdhaXRpbmcgKi8KKyAgICAgIGlmIChnc3RfcnRzcHNyY19sb29wX3NlbmRfY21kIChydHNwc3JjLCBDTURfV0FJVCwgQ01EX0xPT1ApKSB7CisgICAgICAgIC8qIG1ha2Ugc3VyZSBpdCBpcyB3YWl0aW5nIGJlZm9yZSB3ZSBzZW5kIFBBVVNFIG9yIFBMQVkgYmVsb3cgKi8KKyAgICAgICAgR1NUX1JUU1BfU1RSRUFNX0xPQ0sgKHJ0c3BzcmMpOworICAgICAgICBHU1RfUlRTUF9TVFJFQU1fVU5MT0NLIChydHNwc3JjKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKyAgaWYgKHJldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpCisgICAgZ290byBkb25lOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOgorICAgICAgcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfTk9fUFJFUk9MTDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUExBWUlORzoKKyAgICAgIGdzdF9ydHNwc3JjX2xvb3Bfc2VuZF9jbWQgKHJ0c3BzcmMsIENNRF9QTEFZLCAwKTsKKyAgICAgIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QTEFZSU5HX1RPX1BBVVNFRDoKKyAgICAgIC8qIHNlbmQgcGF1c2UgcmVxdWVzdCBhbmQga2VlcCB0aGUgaWRsZSB0YXNrIGFyb3VuZCAqLworICAgICAgZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCAocnRzcHNyYywgQ01EX1BBVVNFLCBDTURfTE9PUCk7CisgICAgICByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX05PX1BSRVJPTEw7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCAocnRzcHNyYywgQ01EX0NMT1NFLCBDTURfQUxMKTsKKyAgICAgIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgZ3N0X3J0c3BzcmNfc3RvcCAocnRzcHNyYyk7CisgICAgICByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1M7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogT3RoZXJ3aXNlIGl0J3Mgc3VjY2Vzcywgd2UgZG9uJ3Qgd2FudCB0byByZXR1cm4gc3B1cmlvdXMKKyAgICAgICAqIE5PX1BSRVJPTEwgb3IgQVNZTkMgZnJvbSBpbnRlcm5hbCBlbGVtZW50cyBhcyB3ZSBjYXJlIGZvcgorICAgICAgICogc3RhdGUgY2hhbmdlcyBvdXJzZWx2ZXMgaGVyZQorICAgICAgICoKKyAgICAgICAqIFRoaXMgaXMgdG8gY2F0Y2ggUEFVU0VELT5QQVVTRUQgYW5kIFBMQVlJTkctPlBMQVlJTkcgdHJhbnNpdGlvbnMuCisgICAgICAgKi8KKyAgICAgIGlmIChHU1RfU1RBVEVfVFJBTlNJVElPTl9ORVhUICh0cmFuc2l0aW9uKSA9PSBHU1RfU1RBVEVfUEFVU0VEKQorICAgICAgICByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX05PX1BSRVJPTEw7CisgICAgICBlbHNlCisgICAgICAgIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUzsKKyAgICAgIGJyZWFrOworICB9CisKK2RvbmU6CisgIHJldHVybiByZXQ7CisKK3N0YXJ0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0c3BzcmMsICJzdGFydCBmYWlsZWQiKTsKKyAgICByZXR1cm4gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfc2VuZF9ldmVudCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJlczsKKyAgR3N0UlRTUFNyYyAqcnRzcHNyYzsKKworICBydHNwc3JjID0gR1NUX1JUU1BTUkMgKGVsZW1lbnQpOworCisgIGlmIChHU1RfRVZFTlRfSVNfRE9XTlNUUkVBTSAoZXZlbnQpKSB7CisgICAgcmVzID0gZ3N0X3J0c3BzcmNfcHVzaF9ldmVudCAocnRzcHNyYywgZXZlbnQpOworICB9IGVsc2UgeworICAgIHJlcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zZW5kX2V2ZW50IChlbGVtZW50LCBldmVudCk7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCisKKy8qKiogR1NUVVJJSEFORExFUiBJTlRFUkZBQ0UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIEdzdFVSSVR5cGUKK2dzdF9ydHNwc3JjX3VyaV9nZXRfdHlwZSAoR1R5cGUgdHlwZSkKK3sKKyAgcmV0dXJuIEdTVF9VUklfU1JDOworfQorCitzdGF0aWMgY29uc3QgZ2NoYXIgKmNvbnN0ICoKK2dzdF9ydHNwc3JjX3VyaV9nZXRfcHJvdG9jb2xzIChHVHlwZSB0eXBlKQoreworICBzdGF0aWMgY29uc3QgZ2NoYXIgKnByb3RvY29sc1tdID0KKyAgICAgIHsgInJ0c3AiLCAicnRzcHUiLCAicnRzcHQiLCAicnRzcGgiLCAicnRzcC1zZHAiLAorICAgICJydHNwcyIsICJydHNwc3UiLCAicnRzcHN0IiwgInJ0c3BzaCIsIE5VTEwKKyAgfTsKKworICByZXR1cm4gcHJvdG9jb2xzOworfQorCitzdGF0aWMgZ2NoYXIgKgorZ3N0X3J0c3BzcmNfdXJpX2dldF91cmkgKEdzdFVSSUhhbmRsZXIgKiBoYW5kbGVyKQoreworICBHc3RSVFNQU3JjICpzcmMgPSBHU1RfUlRTUFNSQyAoaGFuZGxlcik7CisKKyAgLyogRklYTUU6IG1ha2UgdGhyZWFkLXNhZmUgKi8KKyAgcmV0dXJuIGdfc3RyZHVwIChzcmMtPmNvbm5pbmZvLmxvY2F0aW9uKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRzcHNyY191cmlfc2V0X3VyaSAoR3N0VVJJSGFuZGxlciAqIGhhbmRsZXIsIGNvbnN0IGdjaGFyICogdXJpLAorICAgIEdFcnJvciAqKiBlcnJvcikKK3sKKyAgR3N0UlRTUFNyYyAqc3JjOworICBHc3RSVFNQUmVzdWx0IHJlczsKKyAgR3N0U0RQUmVzdWx0IHNyZXM7CisgIEdzdFJUU1BVcmwgKm5ld3VybCA9IE5VTEw7CisgIEdzdFNEUE1lc3NhZ2UgKnNkcCA9IE5VTEw7CisKKyAgc3JjID0gR1NUX1JUU1BTUkMgKGhhbmRsZXIpOworCisgIC8qIHNhbWUgVVJJLCB3ZSdyZSBmaW5lICovCisgIGlmIChzcmMtPmNvbm5pbmZvLmxvY2F0aW9uICYmIHVyaSAmJiAhc3RyY21wICh1cmksIHNyYy0+Y29ubmluZm8ubG9jYXRpb24pKQorICAgIGdvdG8gd2FzX29rOworCisgIGlmIChnX3N0cl9oYXNfcHJlZml4ICh1cmksICJydHNwLXNkcDovLyIpKSB7CisgICAgc3JlcyA9IGdzdF9zZHBfbWVzc2FnZV9uZXcgKCZzZHApOworICAgIGlmIChzcmVzIDwgMCkKKyAgICAgIGdvdG8gc2RwX2ZhaWxlZDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInBhcnNpbmcgU0RQIG1lc3NhZ2UiKTsKKyAgICBzcmVzID0gZ3N0X3NkcF9tZXNzYWdlX3BhcnNlX3VyaSAodXJpLCBzZHApOworICAgIGlmIChzcmVzIDwgMCkKKyAgICAgIGdvdG8gaW52YWxpZF9zZHA7CisgIH0gZWxzZSB7CisgICAgLyogdHJ5IHRvIHBhcnNlICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicGFyc2luZyBVUkkiKTsKKyAgICBpZiAoKHJlcyA9IGdzdF9ydHNwX3VybF9wYXJzZSAodXJpLCAmbmV3dXJsKSkgPCAwKQorICAgICAgZ290byBwYXJzZV9lcnJvcjsKKyAgfQorCisgIC8qIGlmIHdvcmtlZCwgZnJlZSBwcmV2aW91cyBhbmQgc3RvcmUgbmV3IHVybCBvYmplY3QgYWxvbmcgd2l0aCB0aGUgb3JpZ2luYWwKKyAgICogbG9jYXRpb24uICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNvbmZpZ3VyaW5nIFVSSSIpOworICBnX2ZyZWUgKHNyYy0+Y29ubmluZm8ubG9jYXRpb24pOworICBzcmMtPmNvbm5pbmZvLmxvY2F0aW9uID0gZ19zdHJkdXAgKHVyaSk7CisgIGdzdF9ydHNwX3VybF9mcmVlIChzcmMtPmNvbm5pbmZvLnVybCk7CisgIHNyYy0+Y29ubmluZm8udXJsID0gbmV3dXJsOworICBnX2ZyZWUgKHNyYy0+Y29ubmluZm8udXJsX3N0cik7CisgIGlmIChuZXd1cmwpCisgICAgc3JjLT5jb25uaW5mby51cmxfc3RyID0gZ3N0X3J0c3BfdXJsX2dldF9yZXF1ZXN0X3VyaSAoc3JjLT5jb25uaW5mby51cmwpOworICBlbHNlCisgICAgc3JjLT5jb25uaW5mby51cmxfc3RyID0gTlVMTDsKKworICBpZiAoc3JjLT5zZHApCisgICAgZ3N0X3NkcF9tZXNzYWdlX2ZyZWUgKHNyYy0+c2RwKTsKKyAgc3JjLT5zZHAgPSBzZHA7CisgIHNyYy0+ZnJvbV9zZHAgPSBzZHAgIT0gTlVMTDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzZXQgdXJpOiAlcyIsIEdTVF9TVFJfTlVMTCAodXJpKSk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInJlcXVlc3QgdXJpIGlzOiAlcyIsCisgICAgICBHU1RfU1RSX05VTEwgKHNyYy0+Y29ubmluZm8udXJsX3N0cikpOworCisgIHJldHVybiBUUlVFOworCisgIC8qIFNwZWNpYWwgY2FzZXMgKi8KK3dhc19vazoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIlVSSSB3YXMgb2s6ICclcyciLCBHU1RfU1RSX05VTEwgKHVyaSkpOworICAgIHJldHVybiBUUlVFOworICB9CitzZHBfZmFpbGVkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoc3JjLCAiQ291bGQgbm90IGNyZWF0ZSBuZXcgU0RQICglZCkiLCBzcmVzKTsKKyAgICBnX3NldF9lcnJvcl9saXRlcmFsIChlcnJvciwgR1NUX1VSSV9FUlJPUiwgR1NUX1VSSV9FUlJPUl9CQURfVVJJLAorICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBTRFAiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfc2RwOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoc3JjLCAiTm90IGEgdmFsaWQgU0RQICglZCkgJyVzJyIsIHNyZXMsCisgICAgICAgIEdTVF9TVFJfTlVMTCAodXJpKSk7CisgICAgZ3N0X3NkcF9tZXNzYWdlX2ZyZWUgKHNkcCk7CisgICAgZ19zZXRfZXJyb3JfbGl0ZXJhbCAoZXJyb3IsIEdTVF9VUklfRVJST1IsIEdTVF9VUklfRVJST1JfQkFEX1VSSSwKKyAgICAgICAgIkludmFsaWQgU0RQIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitwYXJzZV9lcnJvcjoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNyYywgIk5vdCBhIHZhbGlkIFJUU1AgdXJsICclcycgKCVkKSIsCisgICAgICAgIEdTVF9TVFJfTlVMTCAodXJpKSwgcmVzKTsKKyAgICBnX3NldF9lcnJvcl9saXRlcmFsIChlcnJvciwgR1NUX1VSSV9FUlJPUiwgR1NUX1VSSV9FUlJPUl9CQURfVVJJLAorICAgICAgICAiSW52YWxpZCBSVFNQIFVSSSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwgZ3BvaW50ZXIgaWZhY2VfZGF0YSkKK3sKKyAgR3N0VVJJSGFuZGxlckludGVyZmFjZSAqaWZhY2UgPSAoR3N0VVJJSGFuZGxlckludGVyZmFjZSAqKSBnX2lmYWNlOworCisgIGlmYWNlLT5nZXRfdHlwZSA9IGdzdF9ydHNwc3JjX3VyaV9nZXRfdHlwZTsKKyAgaWZhY2UtPmdldF9wcm90b2NvbHMgPSBnc3RfcnRzcHNyY191cmlfZ2V0X3Byb3RvY29sczsKKyAgaWZhY2UtPmdldF91cmkgPSBnc3RfcnRzcHNyY191cmlfZ2V0X3VyaTsKKyAgaWZhY2UtPnNldF91cmkgPSBnc3RfcnRzcHNyY191cmlfc2V0X3VyaTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgX1JUU1BLZXlWYWx1ZQoreworICBHc3RSVFNQSGVhZGVyRmllbGQgZmllbGQ7CisgIGdjaGFyICp2YWx1ZTsKKyAgZ2NoYXIgKmN1c3RvbV9rZXk7ICAgICAgICAgICAgLyogY3VzdG9tIGhlYWRlciBzdHJpbmcgKGZpZWxkIGlzIElOVkFMSUQgdGhlbikgKi8KK30gUlRTUEtleVZhbHVlOworCitzdGF0aWMgdm9pZAora2V5X3ZhbHVlX2ZvcmVhY2ggKEdBcnJheSAqIGFycmF5LCBHRnVuYyBmdW5jLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGd1aW50IGk7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoYXJyYXkgIT0gTlVMTCk7CisKKyAgZm9yIChpID0gMDsgaSA8IGFycmF5LT5sZW47IGkrKykgeworICAgICgqZnVuYykgKCZnX2FycmF5X2luZGV4IChhcnJheSwgUlRTUEtleVZhbHVlLCBpKSwgdXNlcl9kYXRhKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZHVtcF9rZXlfdmFsdWUgKGdwb2ludGVyIGRhdGEsIGdwb2ludGVyIHVzZXJfZGF0YSBHX0dOVUNfVU5VU0VEKQoreworICBSVFNQS2V5VmFsdWUgKmtleV92YWx1ZSA9IChSVFNQS2V5VmFsdWUgKikgZGF0YTsKKyAgR3N0UlRTUFNyYyAqc3JjID0gR1NUX1JUU1BTUkMgKHVzZXJfZGF0YSk7CisgIGNvbnN0IGdjaGFyICprZXlfc3RyaW5nOworCisgIGlmIChrZXlfdmFsdWUtPmN1c3RvbV9rZXkgIT0gTlVMTCkKKyAgICBrZXlfc3RyaW5nID0ga2V5X3ZhbHVlLT5jdXN0b21fa2V5OworICBlbHNlCisgICAga2V5X3N0cmluZyA9IGdzdF9ydHNwX2hlYWRlcl9hc190ZXh0IChrZXlfdmFsdWUtPmZpZWxkKTsKKworICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAga2V5OiAnJXMnLCB2YWx1ZTogJyVzJyIsIGtleV9zdHJpbmcsCisgICAgICBrZXlfdmFsdWUtPnZhbHVlKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX3ByaW50X3J0c3BfbWVzc2FnZSAoR3N0UlRTUFNyYyAqIHNyYywgY29uc3QgR3N0UlRTUE1lc3NhZ2UgKiBtc2cpCit7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQgc2l6ZTsKKyAgR1N0cmluZyAqYm9keV9zdHJpbmcgPSBOVUxMOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKHNyYyAhPSBOVUxMKTsKKyAgZ19yZXR1cm5faWZfZmFpbCAobXNnICE9IE5VTEwpOworCisgIGlmIChnc3RfZGVidWdfY2F0ZWdvcnlfZ2V0X3RocmVzaG9sZCAoR1NUX0NBVF9ERUZBVUxUKSA8IEdTVF9MRVZFTF9MT0cpCisgICAgcmV0dXJuOworCisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICBzd2l0Y2ggKG1zZy0+dHlwZSkgeworICAgIGNhc2UgR1NUX1JUU1BfTUVTU0FHRV9SRVFVRVNUOgorICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIlJUU1AgcmVxdWVzdCBtZXNzYWdlICVwIiwgbXNnKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgcmVxdWVzdCBsaW5lOiIpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgIG1ldGhvZDogJyVzJyIsCisgICAgICAgICAgZ3N0X3J0c3BfbWV0aG9kX2FzX3RleHQgKG1zZy0+dHlwZV9kYXRhLnJlcXVlc3QubWV0aG9kKSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgdXJpOiAgICAnJXMnIiwgbXNnLT50eXBlX2RhdGEucmVxdWVzdC51cmkpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgIHZlcnNpb246ICclcyciLAorICAgICAgICAgIGdzdF9ydHNwX3ZlcnNpb25fYXNfdGV4dCAobXNnLT50eXBlX2RhdGEucmVxdWVzdC52ZXJzaW9uKSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiIGhlYWRlcnM6Iik7CisgICAgICBrZXlfdmFsdWVfZm9yZWFjaCAobXNnLT5oZHJfZmllbGRzLCBkdW1wX2tleV92YWx1ZSwgc3JjKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgYm9keToiKTsKKyAgICAgIGdzdF9ydHNwX21lc3NhZ2VfZ2V0X2JvZHkgKG1zZywgJmRhdGEsICZzaXplKTsKKyAgICAgIGlmIChzaXplID4gMCkgeworICAgICAgICBib2R5X3N0cmluZyA9IGdfc3RyaW5nX25ld19sZW4gKChjb25zdCBnY2hhciAqKSBkYXRhLCBzaXplKTsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAlcyglZCkiLCBib2R5X3N0cmluZy0+c3RyLCBzaXplKTsKKyAgICAgICAgZ19zdHJpbmdfZnJlZSAoYm9keV9zdHJpbmcsIFRSVUUpOworICAgICAgICBib2R5X3N0cmluZyA9IE5VTEw7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9SVFNQX01FU1NBR0VfUkVTUE9OU0U6CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiUlRTUCByZXNwb25zZSBtZXNzYWdlICVwIiwgbXNnKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgc3RhdHVzIGxpbmU6Iik7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgY29kZTogICAnJWQnIiwgbXNnLT50eXBlX2RhdGEucmVzcG9uc2UuY29kZSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgcmVhc29uOiAnJXMnIiwgbXNnLT50eXBlX2RhdGEucmVzcG9uc2UucmVhc29uKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgICB2ZXJzaW9uOiAnJXMiLAorICAgICAgICAgIGdzdF9ydHNwX3ZlcnNpb25fYXNfdGV4dCAobXNnLT50eXBlX2RhdGEucmVzcG9uc2UudmVyc2lvbikpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiBoZWFkZXJzOiIpOworICAgICAga2V5X3ZhbHVlX2ZvcmVhY2ggKG1zZy0+aGRyX2ZpZWxkcywgZHVtcF9rZXlfdmFsdWUsIHNyYyk7CisgICAgICBnc3RfcnRzcF9tZXNzYWdlX2dldF9ib2R5IChtc2csICZkYXRhLCAmc2l6ZSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiIGJvZHk6IGxlbmd0aCAlZCIsIHNpemUpOworICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIGJvZHlfc3RyaW5nID0gZ19zdHJpbmdfbmV3X2xlbiAoKGNvbnN0IGdjaGFyICopIGRhdGEsIHNpemUpOworICAgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICVzKCVkKSIsIGJvZHlfc3RyaW5nLT5zdHIsIHNpemUpOworICAgICAgICBnX3N0cmluZ19mcmVlIChib2R5X3N0cmluZywgVFJVRSk7CisgICAgICAgIGJvZHlfc3RyaW5nID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1JUU1BfTUVTU0FHRV9IVFRQX1JFUVVFU1Q6CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiSFRUUCByZXF1ZXN0IG1lc3NhZ2UgJXAiLCBtc2cpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiByZXF1ZXN0IGxpbmU6Iik7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgbWV0aG9kOiAgJyVzJyIsCisgICAgICAgICAgZ3N0X3J0c3BfbWV0aG9kX2FzX3RleHQgKG1zZy0+dHlwZV9kYXRhLnJlcXVlc3QubWV0aG9kKSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgdXJpOiAgICAgJyVzJyIsIG1zZy0+dHlwZV9kYXRhLnJlcXVlc3QudXJpKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgICB2ZXJzaW9uOiAnJXMnIiwKKyAgICAgICAgICBnc3RfcnRzcF92ZXJzaW9uX2FzX3RleHQgKG1zZy0+dHlwZV9kYXRhLnJlcXVlc3QudmVyc2lvbikpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiBoZWFkZXJzOiIpOworICAgICAga2V5X3ZhbHVlX2ZvcmVhY2ggKG1zZy0+aGRyX2ZpZWxkcywgZHVtcF9rZXlfdmFsdWUsIHNyYyk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiIGJvZHk6Iik7CisgICAgICBnc3RfcnRzcF9tZXNzYWdlX2dldF9ib2R5IChtc2csICZkYXRhLCAmc2l6ZSk7CisgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgYm9keV9zdHJpbmcgPSBnX3N0cmluZ19uZXdfbGVuICgoY29uc3QgZ2NoYXIgKikgZGF0YSwgc2l6ZSk7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgJXMoJWQpIiwgYm9keV9zdHJpbmctPnN0ciwgc2l6ZSk7CisgICAgICAgIGdfc3RyaW5nX2ZyZWUgKGJvZHlfc3RyaW5nLCBUUlVFKTsKKyAgICAgICAgYm9keV9zdHJpbmcgPSBOVUxMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUlRTUF9NRVNTQUdFX0hUVFBfUkVTUE9OU0U6CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiSFRUUCByZXNwb25zZSBtZXNzYWdlICVwIiwgbXNnKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgc3RhdHVzIGxpbmU6Iik7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgY29kZTogICAgJyVkJyIsIG1zZy0+dHlwZV9kYXRhLnJlc3BvbnNlLmNvZGUpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgIHJlYXNvbjogICclcyciLCBtc2ctPnR5cGVfZGF0YS5yZXNwb25zZS5yZWFzb24pOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgIHZlcnNpb246ICclcyciLAorICAgICAgICAgIGdzdF9ydHNwX3ZlcnNpb25fYXNfdGV4dCAobXNnLT50eXBlX2RhdGEucmVzcG9uc2UudmVyc2lvbikpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiBoZWFkZXJzOiIpOworICAgICAga2V5X3ZhbHVlX2ZvcmVhY2ggKG1zZy0+aGRyX2ZpZWxkcywgZHVtcF9rZXlfdmFsdWUsIHNyYyk7CisgICAgICBnc3RfcnRzcF9tZXNzYWdlX2dldF9ib2R5IChtc2csICZkYXRhLCAmc2l6ZSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiIGJvZHk6IGxlbmd0aCAlZCIsIHNpemUpOworICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIGJvZHlfc3RyaW5nID0gZ19zdHJpbmdfbmV3X2xlbiAoKGNvbnN0IGdjaGFyICopIGRhdGEsIHNpemUpOworICAgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICVzKCVkKSIsIGJvZHlfc3RyaW5nLT5zdHIsIHNpemUpOworICAgICAgICBnX3N0cmluZ19mcmVlIChib2R5X3N0cmluZywgVFJVRSk7CisgICAgICAgIGJvZHlfc3RyaW5nID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1JUU1BfTUVTU0FHRV9EQVRBOgorICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIlJUU1AgZGF0YSBtZXNzYWdlICVwIiwgbXNnKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgY2hhbm5lbDogJyVkJyIsIG1zZy0+dHlwZV9kYXRhLmRhdGEuY2hhbm5lbCk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiIHNpemU6ICAgICclZCciLCBtc2ctPmJvZHlfc2l6ZSk7CisgICAgICBnc3RfcnRzcF9tZXNzYWdlX2dldF9ib2R5IChtc2csICZkYXRhLCAmc2l6ZSk7CisgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgYm9keV9zdHJpbmcgPSBnX3N0cmluZ19uZXdfbGVuICgoY29uc3QgZ2NoYXIgKikgZGF0YSwgc2l6ZSk7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgJXMoJWQpIiwgYm9keV9zdHJpbmctPnN0ciwgc2l6ZSk7CisgICAgICAgIGdfc3RyaW5nX2ZyZWUgKGJvZHlfc3RyaW5nLCBUUlVFKTsKKyAgICAgICAgYm9keV9zdHJpbmcgPSBOVUxMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICJ1bnN1cHBvcnRlZCBtZXNzYWdlIHR5cGUgJWQiLCBtc2ctPnR5cGUpOworICAgICAgYnJlYWs7CisgIH0KKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY19wcmludF9zZHBfbWVkaWEgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFNEUE1lZGlhICogbWVkaWEpCit7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgICBtZWRpYTogICAgICAgJyVzJyIsIEdTVF9TVFJfTlVMTCAobWVkaWEtPm1lZGlhKSk7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgICBwb3J0OiAgICAgICAgJyV1JyIsIG1lZGlhLT5wb3J0KTsKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgIG51bV9wb3J0czogICAnJXUnIiwgbWVkaWEtPm51bV9wb3J0cyk7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgICBwcm90bzogICAgICAgJyVzJyIsIEdTVF9TVFJfTlVMTCAobWVkaWEtPnByb3RvKSk7CisgIGlmIChtZWRpYS0+Zm10cyAmJiBtZWRpYS0+Zm10cy0+bGVuID4gMCkgeworICAgIGd1aW50IGk7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgZm9ybWF0czoiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWVkaWEtPmZtdHMtPmxlbjsgaSsrKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgIGZvcm1hdCAgJyVzJyIsIGdfYXJyYXlfaW5kZXggKG1lZGlhLT5mbXRzLAorICAgICAgICAgICAgICBnY2hhciAqLCBpKSk7CisgICAgfQorICB9CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgICBpbmZvcm1hdGlvbjogJyVzJyIsCisgICAgICBHU1RfU1RSX05VTEwgKG1lZGlhLT5pbmZvcm1hdGlvbikpOworICBpZiAobWVkaWEtPmNvbm5lY3Rpb25zICYmIG1lZGlhLT5jb25uZWN0aW9ucy0+bGVuID4gMCkgeworICAgIGd1aW50IGk7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgY29ubmVjdGlvbnM6Iik7CisgICAgZm9yIChpID0gMDsgaSA8IG1lZGlhLT5jb25uZWN0aW9ucy0+bGVuOyBpKyspIHsKKyAgICAgIEdzdFNEUENvbm5lY3Rpb24gKmNvbm4gPQorICAgICAgICAgICZnX2FycmF5X2luZGV4IChtZWRpYS0+Y29ubmVjdGlvbnMsIEdzdFNEUENvbm5lY3Rpb24sIGkpOworCisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgIG5ldHR5cGU6ICAgICAgJyVzJyIsCisgICAgICAgICAgR1NUX1NUUl9OVUxMIChjb25uLT5uZXR0eXBlKSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgIGFkZHJ0eXBlOiAgICAgJyVzJyIsCisgICAgICAgICAgR1NUX1NUUl9OVUxMIChjb25uLT5hZGRydHlwZSkpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgICBhZGRyZXNzOiAgICAgICclcyciLAorICAgICAgICAgIEdTVF9TVFJfTlVMTCAoY29ubi0+YWRkcmVzcykpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgICB0dGw6ICAgICAgICAgICcldSciLCBjb25uLT50dGwpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgICBhZGRyX251bWJlcjogICcldSciLCBjb25uLT5hZGRyX251bWJlcik7CisgICAgfQorICB9CisgIGlmIChtZWRpYS0+YmFuZHdpZHRocyAmJiBtZWRpYS0+YmFuZHdpZHRocy0+bGVuID4gMCkgeworICAgIGd1aW50IGk7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgYmFuZHdpZHRoczoiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWVkaWEtPmJhbmR3aWR0aHMtPmxlbjsgaSsrKSB7CisgICAgICBHc3RTRFBCYW5kd2lkdGggKmJ3ID0KKyAgICAgICAgICAmZ19hcnJheV9pbmRleCAobWVkaWEtPmJhbmR3aWR0aHMsIEdzdFNEUEJhbmR3aWR0aCwgaSk7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgICAgdHlwZTogICAgICAgICAnJXMnIiwgR1NUX1NUUl9OVUxMIChidy0+Ynd0eXBlKSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgIGJhbmR3aWR0aDogICAgJyV1JyIsIGJ3LT5iYW5kd2lkdGgpOworICAgIH0KKyAgfQorICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAga2V5OiIpOworICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgIHR5cGU6ICAgICAgICclcyciLCBHU1RfU1RSX05VTEwgKG1lZGlhLT5rZXkudHlwZSkpOworICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgIGRhdGE6ICAgICAgICclcyciLCBHU1RfU1RSX05VTEwgKG1lZGlhLT5rZXkuZGF0YSkpOworICBpZiAobWVkaWEtPmF0dHJpYnV0ZXMgJiYgbWVkaWEtPmF0dHJpYnV0ZXMtPmxlbiA+IDApIHsKKyAgICBndWludCBpOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgIGF0dHJpYnV0ZXM6Iik7CisgICAgZm9yIChpID0gMDsgaSA8IG1lZGlhLT5hdHRyaWJ1dGVzLT5sZW47IGkrKykgeworICAgICAgR3N0U0RQQXR0cmlidXRlICphdHRyID0KKyAgICAgICAgICAmZ19hcnJheV9pbmRleCAobWVkaWEtPmF0dHJpYnV0ZXMsIEdzdFNEUEF0dHJpYnV0ZSwgaSk7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgICAgYXR0cmlidXRlICclcycgOiAnJXMnIiwgYXR0ci0+a2V5LCBhdHRyLT52YWx1ZSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQKK2dzdF9ydHNwc3JjX3ByaW50X3NkcF9tZXNzYWdlIChHc3RSVFNQU3JjICogc3JjLCBjb25zdCBHc3RTRFBNZXNzYWdlICogbXNnKQoreworICBnX3JldHVybl9pZl9mYWlsIChzcmMgIT0gTlVMTCk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKG1zZyAhPSBOVUxMKTsKKworICBpZiAoZ3N0X2RlYnVnX2NhdGVnb3J5X2dldF90aHJlc2hvbGQgKEdTVF9DQVRfREVGQVVMVCkgPCBHU1RfTEVWRUxfTE9HKQorICAgIHJldHVybjsKKworICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgInNkcCBwYWNrZXQgJXA6IiwgbXNnKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiB2ZXJzaW9uOiAgICAgICAnJXMnIiwgR1NUX1NUUl9OVUxMIChtc2ctPnZlcnNpb24pKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiBvcmlnaW46Iik7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgIHVzZXJuYW1lOiAgICAgJyVzJyIsCisgICAgICBHU1RfU1RSX05VTEwgKG1zZy0+b3JpZ2luLnVzZXJuYW1lKSk7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgIHNlc3NfaWQ6ICAgICAgJyVzJyIsCisgICAgICBHU1RfU1RSX05VTEwgKG1zZy0+b3JpZ2luLnNlc3NfaWQpKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgc2Vzc192ZXJzaW9uOiAnJXMnIiwKKyAgICAgIEdTVF9TVFJfTlVMTCAobXNnLT5vcmlnaW4uc2Vzc192ZXJzaW9uKSk7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgIG5ldHR5cGU6ICAgICAgJyVzJyIsCisgICAgICBHU1RfU1RSX05VTEwgKG1zZy0+b3JpZ2luLm5ldHR5cGUpKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgYWRkcnR5cGU6ICAgICAnJXMnIiwKKyAgICAgIEdTVF9TVFJfTlVMTCAobXNnLT5vcmlnaW4uYWRkcnR5cGUpKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgYWRkcjogICAgICAgICAnJXMnIiwgR1NUX1NUUl9OVUxMIChtc2ctPm9yaWdpbi5hZGRyKSk7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgc2Vzc2lvbl9uYW1lOiAgJyVzJyIsCisgICAgICBHU1RfU1RSX05VTEwgKG1zZy0+c2Vzc2lvbl9uYW1lKSk7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgaW5mb3JtYXRpb246ICAgJyVzJyIsIEdTVF9TVFJfTlVMTCAobXNnLT5pbmZvcm1hdGlvbikpOworICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiIHVyaTogICAgICAgICAgICclcyciLCBHU1RfU1RSX05VTEwgKG1zZy0+dXJpKSk7CisKKyAgaWYgKG1zZy0+ZW1haWxzICYmIG1zZy0+ZW1haWxzLT5sZW4gPiAwKSB7CisgICAgZ3VpbnQgaTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgZW1haWxzOiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBtc2ctPmVtYWlscy0+bGVuOyBpKyspIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgIGVtYWlsICclcyciLCBnX2FycmF5X2luZGV4IChtc2ctPmVtYWlscywgZ2NoYXIgKiwKKyAgICAgICAgICAgICAgaSkpOworICAgIH0KKyAgfQorICBpZiAobXNnLT5waG9uZXMgJiYgbXNnLT5waG9uZXMtPmxlbiA+IDApIHsKKyAgICBndWludCBpOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiBwaG9uZXM6Iik7CisgICAgZm9yIChpID0gMDsgaSA8IG1zZy0+cGhvbmVzLT5sZW47IGkrKykgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgcGhvbmUgJyVzJyIsIGdfYXJyYXlfaW5kZXggKG1zZy0+cGhvbmVzLCBnY2hhciAqLAorICAgICAgICAgICAgICBpKSk7CisgICAgfQorICB9CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgY29ubmVjdGlvbjoiKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgbmV0dHlwZTogICAgICAnJXMnIiwKKyAgICAgIEdTVF9TVFJfTlVMTCAobXNnLT5jb25uZWN0aW9uLm5ldHR5cGUpKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgYWRkcnR5cGU6ICAgICAnJXMnIiwKKyAgICAgIEdTVF9TVFJfTlVMTCAobXNnLT5jb25uZWN0aW9uLmFkZHJ0eXBlKSk7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgIGFkZHJlc3M6ICAgICAgJyVzJyIsCisgICAgICBHU1RfU1RSX05VTEwgKG1zZy0+Y29ubmVjdGlvbi5hZGRyZXNzKSk7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgIHR0bDogICAgICAgICAgJyV1JyIsIG1zZy0+Y29ubmVjdGlvbi50dGwpOworICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICBhZGRyX251bWJlcjogICcldSciLCBtc2ctPmNvbm5lY3Rpb24uYWRkcl9udW1iZXIpOworICBpZiAobXNnLT5iYW5kd2lkdGhzICYmIG1zZy0+YmFuZHdpZHRocy0+bGVuID4gMCkgeworICAgIGd1aW50IGk7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiIGJhbmR3aWR0aHM6Iik7CisgICAgZm9yIChpID0gMDsgaSA8IG1zZy0+YmFuZHdpZHRocy0+bGVuOyBpKyspIHsKKyAgICAgIEdzdFNEUEJhbmR3aWR0aCAqYncgPQorICAgICAgICAgICZnX2FycmF5X2luZGV4IChtc2ctPmJhbmR3aWR0aHMsIEdzdFNEUEJhbmR3aWR0aCwgaSk7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgIHR5cGU6ICAgICAgICAgJyVzJyIsIEdTVF9TVFJfTlVMTCAoYnctPmJ3dHlwZSkpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgYmFuZHdpZHRoOiAgICAnJXUnIiwgYnctPmJhbmR3aWR0aCk7CisgICAgfQorICB9CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIga2V5OiIpOworICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICB0eXBlOiAgICAgICAgICclcyciLCBHU1RfU1RSX05VTEwgKG1zZy0+a2V5LnR5cGUpKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgZGF0YTogICAgICAgICAnJXMnIiwgR1NUX1NUUl9OVUxMIChtc2ctPmtleS5kYXRhKSk7CisgIGlmIChtc2ctPmF0dHJpYnV0ZXMgJiYgbXNnLT5hdHRyaWJ1dGVzLT5sZW4gPiAwKSB7CisgICAgZ3VpbnQgaTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgYXR0cmlidXRlczoiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbXNnLT5hdHRyaWJ1dGVzLT5sZW47IGkrKykgeworICAgICAgR3N0U0RQQXR0cmlidXRlICphdHRyID0KKyAgICAgICAgICAmZ19hcnJheV9pbmRleCAobXNnLT5hdHRyaWJ1dGVzLCBHc3RTRFBBdHRyaWJ1dGUsIGkpOworCisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICBhdHRyaWJ1dGUgJyVzJyA6ICclcyciLCBhdHRyLT5rZXksIGF0dHItPnZhbHVlKTsKKyAgICB9CisgIH0KKyAgaWYgKG1zZy0+bWVkaWFzICYmIG1zZy0+bWVkaWFzLT5sZW4gPiAwKSB7CisgICAgZ3VpbnQgaTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgbWVkaWFzOiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBtc2ctPm1lZGlhcy0+bGVuOyBpKyspIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgIG1lZGlhICV1OiIsIGkpOworICAgICAgZ3N0X3J0c3BzcmNfcHJpbnRfc2RwX21lZGlhIChzcmMsICZnX2FycmF5X2luZGV4IChtc2ctPm1lZGlhcywKKyAgICAgICAgICAgICAgR3N0U0RQTWVkaWEsIGkpKTsKKyAgICB9CisgIH0KKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRzcC9nc3RydHNwc3JjLmggYi9nc3QvcnRzcC9nc3RydHNwc3JjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5MjFkMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHNwL2dzdHJ0c3BzcmMuaApAQCAtMCwwICsxLDMwNyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRTUFNSQ19IX18KKyNkZWZpbmUgX19HU1RfUlRTUFNSQ19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworR19CRUdJTl9ERUNMUworCisjaW5jbHVkZSA8Z3N0L3J0c3AvcnRzcC5oPgorI2luY2x1ZGUgPGdpby9naW8uaD4KKworI2luY2x1ZGUgImdzdHJ0c3BleHQuaCIKKworI2RlZmluZSBHU1RfVFlQRV9SVFNQU1JDIFwKKyAgKGdzdF9ydHNwc3JjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFNQU1JDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRTUFNSQyxHc3RSVFNQU3JjKSkKKyNkZWZpbmUgR1NUX1JUU1BTUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRTUFNSQyxHc3RSVFNQU3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRTUFNSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUU1BTUkMpKQorI2RlZmluZSBHU1RfSVNfUlRTUFNSQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFNQU1JDKSkKKyNkZWZpbmUgR1NUX1JUU1BTUkNfQ0FTVChvYmopIFwKKyAgKChHc3RSVFNQU3JjICopKG9iaikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFNQU3JjIEdzdFJUU1BTcmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UlRTUFNyY0NsYXNzIEdzdFJUU1BTcmNDbGFzczsKKworI2RlZmluZSBHU1RfUlRTUF9TVEFURV9HRVRfTE9DSyhydHNwKSAgICAoJkdTVF9SVFNQU1JDX0NBU1QocnRzcCktPnN0YXRlX3JlY19sb2NrKQorI2RlZmluZSBHU1RfUlRTUF9TVEFURV9MT0NLKHJ0c3ApICAgICAgICAoZ19yZWNfbXV0ZXhfbG9jayAoR1NUX1JUU1BfU1RBVEVfR0VUX0xPQ0socnRzcCkpKQorI2RlZmluZSBHU1RfUlRTUF9TVEFURV9VTkxPQ0socnRzcCkgICAgICAoZ19yZWNfbXV0ZXhfdW5sb2NrIChHU1RfUlRTUF9TVEFURV9HRVRfTE9DSyhydHNwKSkpCisKKyNkZWZpbmUgR1NUX1JUU1BfU1RSRUFNX0dFVF9MT0NLKHJ0c3ApICAgKCZHU1RfUlRTUFNSQ19DQVNUKHJ0c3ApLT5zdHJlYW1fcmVjX2xvY2spCisjZGVmaW5lIEdTVF9SVFNQX1NUUkVBTV9MT0NLKHJ0c3ApICAgICAgIChnX3JlY19tdXRleF9sb2NrIChHU1RfUlRTUF9TVFJFQU1fR0VUX0xPQ0socnRzcCkpKQorI2RlZmluZSBHU1RfUlRTUF9TVFJFQU1fVU5MT0NLKHJ0c3ApICAgICAoZ19yZWNfbXV0ZXhfdW5sb2NrIChHU1RfUlRTUF9TVFJFQU1fR0VUX0xPQ0socnRzcCkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UlRTUENvbm5JbmZvIEdzdFJUU1BDb25uSW5mbzsKKworc3RydWN0IF9Hc3RSVFNQQ29ubkluZm8geworICBnY2hhciAgICAgICAgICAgICAgKmxvY2F0aW9uOworICBHc3RSVFNQVXJsICAgICAgICAgKnVybDsKKyAgZ2NoYXIgICAgICAgICAgICAgICp1cmxfc3RyOworICBHc3RSVFNQQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb247CisgIGdib29sZWFuICAgICAgICAgICAgY29ubmVjdGVkOworICBnYm9vbGVhbiAgICAgICAgICAgIGZsdXNoaW5nOworCisgIEdNdXRleCAgICAgICAgICAgICAgc2VuZF9sb2NrOworICBHTXV0ZXggICAgICAgICAgICAgIHJlY3ZfbG9jazsKK307CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFNQU3RyZWFtIEdzdFJUU1BTdHJlYW07CisKK3N0cnVjdCBfR3N0UlRTUFN0cmVhbSB7CisgIGdpbnQgICAgICAgICAgaWQ7CisKKyAgR3N0UlRTUFNyYyAgICpwYXJlbnQ7IC8qIHBhcmVudCwgbm8gZXh0cmEgcmVmIHRvIHBhcmVudCBpcyB0YWtlbiAqLworCisgIC8qIHBhZCB3ZSBleHBvc2Ugb3IgTlVMTCB3aGVuIGl0IGRvZXMgbm90IGhhdmUgYW4gYWN0dWFsIHBhZCAqLworICBHc3RQYWQgICAgICAgKnNyY3BhZDsKKyAgR3N0Rmxvd1JldHVybiBsYXN0X3JldDsKKyAgZ2Jvb2xlYW4gICAgICBhZGRlZDsKKyAgZ2Jvb2xlYW4gICAgICBzZXR1cDsKKyAgZ2Jvb2xlYW4gICAgICBza2lwcGVkOworICBnYm9vbGVhbiAgICAgIGVvczsKKyAgZ2Jvb2xlYW4gICAgICBkaXNjb250OworICBnYm9vbGVhbiAgICAgIG5lZWRfY2FwczsKKyAgZ2Jvb2xlYW4gICAgICB3YWl0aW5nX3NldHVwX3Jlc3BvbnNlOworCisgIC8qIGZvciBpbnRlcmxlYXZlZCBtb2RlICovCisgIGd1aW50OCAgICAgICAgY2hhbm5lbFsyXTsKKyAgR3N0UGFkICAgICAgICpjaGFubmVscGFkWzJdOworCisgIC8qIG91ciB1ZHAgc291cmNlcyAqLworICBHc3RFbGVtZW50ICAgKnVkcHNyY1syXTsKKyAgR3N0UGFkICAgICAgICpibG9ja2VkcGFkOworICBndWxvbmcgICAgICAgIGJsb2NraWQ7CisgIGdib29sZWFuICAgICAgaXNfaXB2NjsKKworICAvKiBvdXIgdWRwIHNpbmtzIGJhY2sgdG8gdGhlIHNlcnZlciAqLworICBHc3RFbGVtZW50ICAgKnVkcHNpbmtbMl07CisgIEdzdFBhZCAgICAgICAqcnRjcHBhZDsKKworICAvKiBmYWtlc3JjIGZvciBzZW5kaW5nIGR1bW15IGRhdGEgKi8KKyAgR3N0RWxlbWVudCAgICpmYWtlc3JjOworCisgIC8qIHN0YXRlICovCisgIGd1aW50ICAgICAgICAgcG9ydDsKKyAgZ2Jvb2xlYW4gICAgICBjb250YWluZXI7CisgIGdib29sZWFuICAgICAgaXNfcmVhbDsKKyAgZ3VpbnQ4ICAgICAgICBkZWZhdWx0X3B0OworICBHc3RSVFNQUHJvZmlsZSBwcm9maWxlOworICBHQXJyYXkgICAgICAgKnB0bWFwOworICAvKiBvcmlnaW5hbCBjb250cm9sIHVybCAqLworICBnY2hhciAgICAgICAgKmNvbnRyb2xfdXJsOworICBndWludDMyICAgICAgIHNzcmM7CisgIGd1aW50MzIgICAgICAgc2VxYmFzZTsKKyAgZ3VpbnQ2NCAgICAgICB0aW1lYmFzZTsKKyAgR3N0RWxlbWVudCAgICpzcnRwZGVjOworICBHc3RDYXBzICAgICAgKnNydGNwcGFyYW1zOworICBHc3RFbGVtZW50ICAgKnNydHBlbmM7CisgIGd1aW50MzIgICAgICAgc2VuZF9zc3JjOworCisgIC8qIHBlciBzdHJlYW0gY29ubmVjdGlvbiAqLworICBHc3RSVFNQQ29ubkluZm8gIGNvbm5pbmZvOworCisgIC8qIHNlc3Npb24gKi8KKyAgR09iamVjdCAgICAgICpzZXNzaW9uOworCisgIC8qIHNydHAga2V5IG1hbmFnZW1lbnQgKi8KKyAgR3N0TUlLRVlNZXNzYWdlICptaWtleTsKKworICAvKiBiYW5kd2lkdGggKi8KKyAgZ3VpbnQgICAgICAgICBhc19iYW5kd2lkdGg7CisgIGd1aW50ICAgICAgICAgcnNfYmFuZHdpZHRoOworICBndWludCAgICAgICAgIHJyX2JhbmR3aWR0aDsKKworICAvKiBkZXN0aW5hdGlvbiAqLworICBnY2hhciAgICAgICAgKmRlc3RpbmF0aW9uOworICBnYm9vbGVhbiAgICAgIGlzX211bHRpY2FzdDsKKyAgZ3VpbnQgICAgICAgICB0dGw7CisKKyAgLyogQSB1bmlxdWUgYW5kIHN0YWJsZSBpZCB3ZSB3aWxsIHVzZSBmb3IgdGhlIHN0cmVhbSBzdGFydCBldmVudCAqLworICBnY2hhciAqc3RyZWFtX2lkOworCisgIEdzdFN0cnVjdHVyZSAgICAgKnJ0eF9wdF9tYXA7Cit9OworCisvKioKKyAqIEdzdFJUU1BOYXRNZXRob2Q6CisgKiBAR1NUX1JUU1BfTkFUX05PTkU6IG5vbmUKKyAqIEBHU1RfUlRTUF9OQVRfRFVNTVk6IHNlbmQgZHVtbXkgcGFja2V0cworICoKKyAqIERpZmZlcmVudCBtZXRob2RzIGZvciB0cnlpbmcgdG8gdHJhdmVyc2UgZmlyZXdhbGxzLgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgR1NUX1JUU1BfTkFUX05PTkUsCisgIEdTVF9SVFNQX05BVF9EVU1NWQorfSBHc3RSVFNQTmF0TWV0aG9kOworCitzdHJ1Y3QgX0dzdFJUU1BTcmMgeworICBHc3RCaW4gICAgICAgICAgIHBhcmVudDsKKworICAvKiB0YXNrIGFuZCBtdXRleCBmb3IgaW50ZXJsZWF2ZWQgbW9kZSAqLworICBnYm9vbGVhbiAgICAgICAgIGludGVybGVhdmVkOworICBHc3RUYXNrICAgICAgICAgKnRhc2s7CisgIEdSZWNNdXRleCAgICAgICAgc3RyZWFtX3JlY19sb2NrOworICBHc3RTZWdtZW50ICAgICAgIHNlZ21lbnQ7CisgIGdib29sZWFuICAgICAgICAgcnVubmluZzsKKyAgZ2Jvb2xlYW4gICAgICAgICBuZWVkX3JhbmdlOworICBnYm9vbGVhbiAgICAgICAgIHNraXA7CisgIGdpbnQgICAgICAgICAgICAgZnJlZV9jaGFubmVsOworICBnYm9vbGVhbiAgICAgICAgIG5lZWRfc2VnbWVudDsKKyAgR3N0Q2xvY2tUaW1lICAgICBiYXNlX3RpbWU7CisKKyAgLyogVURQIG1vZGUgbG9vcCAqLworICBnaW50ICAgICAgICAgICAgIHBlbmRpbmdfY21kOworICBnaW50ICAgICAgICAgICAgIGJ1c3lfY21kOworICBnYm9vbGVhbiAgICAgICAgIGlnbm9yZV90aW1lb3V0OworICBnYm9vbGVhbiAgICAgICAgIG9wZW5fZXJyb3I7CisKKyAgLyogbXV0ZXggZm9yIHByb3RlY3Rpbmcgc3RhdGUgY2hhbmdlcyAqLworICBHUmVjTXV0ZXggICAgICAgIHN0YXRlX3JlY19sb2NrOworCisgIEdzdFNEUE1lc3NhZ2UgICAqc2RwOworICBnYm9vbGVhbiAgICAgICAgIGZyb21fc2RwOworICBHTGlzdCAgICAgICAgICAgKnN0cmVhbXM7CisgIEdzdFN0cnVjdHVyZSAgICAqcHJvcHM7CisgIGdib29sZWFuICAgICAgICAgbmVlZF9hY3RpdmF0ZTsKKworICAvKiBwcm9wZXJ0aWVzICovCisgIEdzdFJUU1BMb3dlclRyYW5zIHByb3RvY29sczsKKyAgZ2Jvb2xlYW4gICAgICAgICAgZGVidWc7CisgIGd1aW50ICAgICAgICAgICAgIHJldHJ5OworICBndWludDY0ICAgICAgICAgICB1ZHBfdGltZW91dDsKKyAgR1RpbWVWYWwgICAgICAgICAgdGNwX3RpbWVvdXQ7CisgIEdUaW1lVmFsICAgICAgICAgKnB0Y3BfdGltZW91dDsKKyAgZ3VpbnQgICAgICAgICAgICAgbGF0ZW5jeTsKKyAgZ2Jvb2xlYW4gICAgICAgICAgZHJvcF9vbl9sYXRlbmN5OworICBndWludDY0ICAgICAgICAgICBjb25uZWN0aW9uX3NwZWVkOworICBHc3RSVFNQTmF0TWV0aG9kICBuYXRfbWV0aG9kOworICBnYm9vbGVhbiAgICAgICAgICBkb19ydGNwOworICBnYm9vbGVhbiAgICAgICAgICBkb19ydHNwX2tlZXBfYWxpdmU7CisgIGdjaGFyICAgICAgICAgICAgKnByb3h5X2hvc3Q7CisgIGd1aW50ICAgICAgICAgICAgIHByb3h5X3BvcnQ7CisgIGdjaGFyICAgICAgICAgICAgKnByb3h5X3VzZXI7ICAgICAgICAvKiBmcm9tIHVybCBvciBwcm9wZXJ0eSAqLworICBnY2hhciAgICAgICAgICAgICpwcm94eV9wYXNzd2Q7ICAgICAgLyogZnJvbSB1cmwgb3IgcHJvcGVydHkgKi8KKyAgZ2NoYXIgICAgICAgICAgICAqcHJvcF9wcm94eV9pZDsgICAgIC8qIHNldCB2aWEgcHJvcGVydHkgKi8KKyAgZ2NoYXIgICAgICAgICAgICAqcHJvcF9wcm94eV9wdzsgICAgIC8qIHNldCB2aWEgcHJvcGVydHkgKi8KKyAgZ3VpbnQgICAgICAgICAgICAgcnRwX2Jsb2Nrc2l6ZTsKKyAgZ2NoYXIgICAgICAgICAgICAqdXNlcl9pZDsKKyAgZ2NoYXIgICAgICAgICAgICAqdXNlcl9wdzsKKyAgZ2ludCAgICAgICAgICAgICAgYnVmZmVyX21vZGU7CisgIEdzdFJUU1BSYW5nZSAgICAgIGNsaWVudF9wb3J0X3JhbmdlOworICBnaW50ICAgICAgICAgICAgICB1ZHBfYnVmZmVyX3NpemU7CisgIGdib29sZWFuICAgICAgICAgIHNob3J0X2hlYWRlcjsKKyAgZ3VpbnQgICAgICAgICAgICAgcHJvYmF0aW9uOworICBnYm9vbGVhbiAgICAgICAgICB1ZHBfcmVjb25uZWN0OworICBnY2hhciAgICAgICAgICAgICptdWx0aV9pZmFjZTsKKyAgZ2Jvb2xlYW4gICAgICAgICAgbnRwX3N5bmM7CisgIGdib29sZWFuICAgICAgICAgIHVzZV9waXBlbGluZV9jbG9jazsKKyAgR3N0U3RydWN0dXJlICAgICAqc2RlczsKKyAgR1Rsc0NlcnRpZmljYXRlRmxhZ3MgdGxzX3ZhbGlkYXRpb25fZmxhZ3M7CisgIEdUbHNEYXRhYmFzZSAgICAgKnRsc19kYXRhYmFzZTsKKyAgR1Rsc0ludGVyYWN0aW9uICAqdGxzX2ludGVyYWN0aW9uOworICBnYm9vbGVhbiAgICAgICAgICBkb19yZXRyYW5zbWlzc2lvbjsKKyAgZ2ludCAgICAgICAgICAgICAgbnRwX3RpbWVfc291cmNlOworICBnY2hhciAgICAgICAgICAgICp1c2VyX2FnZW50OworICBHc3RDbG9ja1RpbWUgICAgICBtYXhfcnRjcF9ydHBfdGltZV9kaWZmOworICBnYm9vbGVhbiAgICAgICAgICByZmM3MjczX3N5bmM7CisgIGd1aW50NjQgICAgICAgICAgIG1heF90c19vZmZzZXRfYWRqdXN0bWVudDsKKyAgZ2ludDY0ICAgICAgICAgICAgbWF4X3RzX29mZnNldDsKKyAgZ2Jvb2xlYW4gICAgICAgICAgbWF4X3RzX29mZnNldF9pc19zZXQ7CisKKyAgLyogc3RhdGUgKi8KKyAgR3N0UlRTUFN0YXRlICAgICAgIHN0YXRlOworICBnY2hhciAgICAgICAgICAgICAqY29udGVudF9iYXNlOworICBHc3RSVFNQTG93ZXJUcmFucyAgY3VyX3Byb3RvY29sczsKKyAgZ2Jvb2xlYW4gICAgICAgICAgIHRyaWVkX3VybF9hdXRoOworICBnY2hhciAgICAgICAgICAgICAqYWRkcjsKKyAgZ2Jvb2xlYW4gICAgICAgICAgIG5lZWRfcmVkaXJlY3Q7CisgIEdzdFJUU1BUaW1lUmFuZ2UgICpyYW5nZTsKKyAgZ2NoYXIgICAgICAgICAgICAgKmNvbnRyb2w7CisgIGd1aW50ICAgICAgICAgICAgICBuZXh0X3BvcnRfbnVtOworICBHc3RDbG9jayAgICAgICAgICAqcHJvdmlkZWRfY2xvY2s7CisKKyAgLyogc3VwcG9ydGVkIG1ldGhvZHMgKi8KKyAgZ2ludCAgICAgICAgICAgICAgIG1ldGhvZHM7CisKKyAgLyogc2Vla2FiaWxpdHkKKyAgICogLTEuMCA6IFN0cmVhbSBpcyBub3Qgc2Vla2FibGUKKyAgICogIDAuMCA6IHNlZWthYmxlIG9ubHkgdG8gdGhlIGJlZ2lubmluZworICAgKiBHX01BWEZMT0FUIDogQW55IHZhbHVlIGlzIHBvc3NpYmxlCisgICAqCisgICAqIEFueSBvdGhlciBwb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGxvbmdlc3QgZHVyYXRpb24KKyAgICogYmV0d2VlbiBhbnkgdHdvIHJhbmRvbSBhY2Nlc3MgcG9pbnRzCisgICAqICAqLworICBnZmxvYXQgICAgICAgICAgICAgc2Vla2FibGU7CisgIEdzdENsb2NrVGltZSAgICAgICBsYXN0X3BvczsKKworICAvKiBzZXNzaW9uIG1hbmFnZW1lbnQgKi8KKyAgR3N0RWxlbWVudCAgICAgICptYW5hZ2VyOworICBndWxvbmcgICAgICAgICAgIG1hbmFnZXJfc2lnX2lkOworICBndWxvbmcgICAgICAgICAgIG1hbmFnZXJfcHRtYXBfaWQ7CisgIGdib29sZWFuICAgICAgICAgdXNlX2J1ZmZlcmluZzsKKworICBHc3RSVFNQQ29ubkluZm8gIGNvbm5pbmZvOworCisgIC8qIGEgbGlzdCBvZiBSVFNQIGV4dGVuc2lvbnMgYXMgR3N0RWxlbWVudCAqLworICBHc3RSVFNQRXh0ZW5zaW9uTGlzdCAgKmV4dGVuc2lvbnM7CisKKyAgR3N0UlRTUFZlcnNpb24gZGVmYXVsdF92ZXJzaW9uOworICBHc3RSVFNQVmVyc2lvbiB2ZXJzaW9uOworfTsKKworc3RydWN0IF9Hc3RSVFNQU3JjQ2xhc3MgeworICBHc3RCaW5DbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRzcHNyY19nZXRfdHlwZSh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUU1BTUkNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRzcC9tZXNvbi5idWlsZCBiL2dzdC9ydHNwL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZThhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRzcC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDE1IEBACitydHNwX3NvdXJjZXMgPSBbCisgICdnc3RydHNwLmMnLAorICAnZ3N0cnRzcHNyYy5jJywKKyAgJ2dzdHJ0cGRlYy5jJywKKyAgJ2dzdHJ0c3BleHQuYycsCitdCisKK2dzdHJ0c3AgPSBsaWJyYXJ5KCdnc3RydHNwJywKKyAgcnRzcF9zb3VyY2VzLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdGJhc2VfZGVwLCBnaW9fZGVwLCBnc3RydHBfZGVwLCBnc3RydHNwX2RlcCwgZ3N0c2RwX2RlcCwgZ3N0bmV0X2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3Qvc2hhcGV3aXBlL01ha2VmaWxlLmFtIGIvZ3N0L3NoYXBld2lwZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjNkOTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3NoYXBld2lwZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDkgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdHNoYXBld2lwZS5sYQorCitsaWJnc3RzaGFwZXdpcGVfbGFfU09VUkNFUyA9IGdzdHNoYXBld2lwZS5jCisKK2xpYmdzdHNoYXBld2lwZV9sYV9DRkxBR1MgPSAkKEdJT19DRkxBR1MpICQoR1NUX0NGTEFHUykgJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykKK2xpYmdzdHNoYXBld2lwZV9sYV9MSUJBREQgPSAkKEdJT19MSUJTKSAkKEdTVF9MSUJTKSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R2aWRlby1AR1NUX0FQSV9WRVJTSU9OQAorbGliZ3N0c2hhcGV3aXBlX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3RzaGFwZXdpcGUuaApkaWZmIC0tZ2l0IGEvZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYyBiL2dzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EwZGZkYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmMKQEAgLTAsMCArMSwxMTUwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOSwyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXNoYXBld2lwZQorICoKKyAqIFRoZSBzaGFwZXdpcGUgZWxlbWVudCBwcm92aWRlcyBjdXN0b20gdHJhbnNpdGlvbnMgb24gdmlkZW8gc3RyZWFtcworICogYmFzZWQgb24gYSBncmF5c2NhbGUgYml0bWFwLiBUaGUgc3RhdGUgb2YgdGhlIHRyYW5zaXRpb24gY2FuIGJlCisgKiBjb250cm9sbGVkIGJ5IHRoZSBwb3NpdGlvbiBwcm9wZXJ0eSBhbmQgYW4gb3B0aW9uYWwgYmxlbmRlZCBib3JkZXIKKyAqIGNhbiBiZSBhZGRlZCBieSB0aGUgYm9yZGVyIHByb3BlcnR5LgorICoKKyAqIFRyYW5zaXRpb24gYml0bWFwcyBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIHRoZQorICogPHVsaW5rIHVybD0iaHR0cDovL2NpbmVsZXJyYS5vcmcvdHJhbnNpdGlvbnMucGhwIj5DaW5lbGVycmEgdHJhbnNpdGlvbjwvdWxpbms+CisgKiBwYWdlLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiB2aWRlb3Rlc3RzcmMgISB2aWRlby94LXJhdyxmb3JtYXQ9QVlVVix3aWR0aD02NDAsaGVpZ2h0PTQ4MCAhIHNoYXBld2lwZSBwb3NpdGlvbj0wLjUgbmFtZT1zaGFwZSAhIHZpZGVvbWl4ZXIgbmFtZT1taXhlciAhIHZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsgICAgIGZpbGVzcmMgbG9jYXRpb249bWFzay5wbmcgISB0eXBlZmluZCAhIGRlY29kZWJpbiAhIHZpZGVvY29udmVydCAhIHZpZGVvc2NhbGUgISBxdWV1ZSAhIHNoYXBlLm1hc2tfc2luayAgICB2aWRlb3Rlc3RzcmMgcGF0dGVybj1zbm93ICEgdmlkZW8veC1yYXcsZm9ybWF0PUFZVVYsd2lkdGg9NjQwLGhlaWdodD00ODAgISBxdWV1ZSAhIG1peGVyLgorICogXXwgVGhpcyBwaXBlbGluZSBhZGRzIHRoZSB0cmFuc2l0aW9uIGZyb20gbWFzay5wbmcgd2l0aCBwb3NpdGlvbiAwLjUgdG8gYW4gU01QVEUgdGVzdCBzY3JlZW4gYW5kIHNub3cuCisgKiA8L3JlZnNlY3QyPgorICovCisKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImdzdHNoYXBld2lwZS5oIgorCitzdGF0aWMgdm9pZCBnc3Rfc2hhcGVfd2lwZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgdm9pZCBnc3Rfc2hhcGVfd2lwZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3Rfc2hhcGVfd2lwZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyB2b2lkIGdzdF9zaGFwZV93aXBlX3Jlc2V0IChHc3RTaGFwZVdpcGUgKiBzZWxmKTsKK3N0YXRpYyB2b2lkIGdzdF9zaGFwZV93aXBlX3VwZGF0ZV9xb3MgKEdzdFNoYXBlV2lwZSAqIHNlbGYsIGdkb3VibGUgcHJvcG9ydGlvbiwKKyAgICBHc3RDbG9ja1RpbWVEaWZmIGRpZmYsIEdzdENsb2NrVGltZSB0aW1lKTsKK3N0YXRpYyB2b2lkIGdzdF9zaGFwZV93aXBlX3Jlc2V0X3FvcyAoR3N0U2hhcGVXaXBlICogc2VsZik7CitzdGF0aWMgdm9pZCBnc3Rfc2hhcGVfd2lwZV9yZWFkX3FvcyAoR3N0U2hhcGVXaXBlICogc2VsZiwgZ2RvdWJsZSAqIHByb3BvcnRpb24sCisgICAgR3N0Q2xvY2tUaW1lICogdGltZSk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3Rfc2hhcGVfd2lwZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfc2hhcGVfd2lwZV92aWRlb19zaW5rX2NoYWluIChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9zaGFwZV93aXBlX3ZpZGVvX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9zaGFwZV93aXBlX3ZpZGVvX3Npbmtfc2V0Y2FwcyAoR3N0U2hhcGVXaXBlICogc2VsZiwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3NoYXBlX3dpcGVfdmlkZW9fc2lua19nZXRjYXBzIChHc3RTaGFwZVdpcGUgKiBzZWxmLAorICAgIEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGZpbHRlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NoYXBlX3dpcGVfdmlkZW9fc2lua19xdWVyeSAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UXVlcnkgKiBxdWVyeSk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfc2hhcGVfd2lwZV9tYXNrX3NpbmtfY2hhaW4gKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NoYXBlX3dpcGVfbWFza19zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc2hhcGVfd2lwZV9tYXNrX3Npbmtfc2V0Y2FwcyAoR3N0U2hhcGVXaXBlICogc2VsZiwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3NoYXBlX3dpcGVfbWFza19zaW5rX2dldGNhcHMgKEdzdFNoYXBlV2lwZSAqIHNlbGYsCisgICAgR3N0UGFkICogcGFkLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc2hhcGVfd2lwZV9tYXNrX3NpbmtfcXVlcnkgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdFF1ZXJ5ICogcXVlcnkpOworc3RhdGljIGdib29sZWFuIGdzdF9zaGFwZV93aXBlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3NoYXBlX3dpcGVfc3JjX2dldGNhcHMgKEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGZpbHRlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NoYXBlX3dpcGVfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUE9TSVRJT04sCisgIFBST1BfQk9SREVSCit9OworCisjZGVmaW5lIERFRkFVTFRfUE9TSVRJT04gMC4wCisjZGVmaW5lIERFRkFVTFRfQk9SREVSIDAuMAorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgdmlkZW9fc2lua19wYWRfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJ2aWRlb19zaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBBWVVWLCBBUkdCLCBCR1JBLCBBQkdSLCBSR0JBIH0iKSkpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgbWFza19zaW5rX3BhZF90ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJtYXNrX3NpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgR1JBWTgsICIKKyAgICAgICAgIndpZHRoID0gIiBHU1RfVklERU9fU0laRV9SQU5HRSAiLCAiCisgICAgICAgICJoZWlnaHQgPSAiIEdTVF9WSURFT19TSVpFX1JBTkdFICIsICIgImZyYW1lcmF0ZSA9IDAvMSA7ICIKKyAgICAgICAgInZpZGVvL3gtcmF3LCAiICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9WSURFT19ORSAoR1JBWTE2KSAiLCAiCisgICAgICAgICJ3aWR0aCA9ICIgR1NUX1ZJREVPX1NJWkVfUkFOR0UgIiwgIgorICAgICAgICAiaGVpZ2h0ID0gIiBHU1RfVklERU9fU0laRV9SQU5HRSAiLCAiICJmcmFtZXJhdGUgPSAwLzEiKSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfcGFkX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwgR1NUX1BBRF9TUkMsIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgQVlVViwgQVJHQiwgQkdSQSwgQUJHUiwgUkdCQSB9IikpKTsKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3NoYXBlX3dpcGVfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3NoYXBlX3dpcGVfZGVidWcKKworI2RlZmluZSBnc3Rfc2hhcGVfd2lwZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RTaGFwZVdpcGUsIGdzdF9zaGFwZV93aXBlLCBHU1RfVFlQRV9FTEVNRU5UKTsKKworc3RhdGljIHZvaWQKK2dzdF9zaGFwZV93aXBlX2NsYXNzX2luaXQgKEdzdFNoYXBlV2lwZUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3Rfc2hhcGVfd2lwZV9maW5hbGl6ZTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3NoYXBlX3dpcGVfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfc2hhcGVfd2lwZV9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QT1NJVElPTiwKKyAgICAgIGdfcGFyYW1fc3BlY19mbG9hdCAoInBvc2l0aW9uIiwgIlBvc2l0aW9uIiwgIlBvc2l0aW9uIG9mIHRoZSBtYXNrIiwKKyAgICAgICAgICAwLjAsIDEuMCwgREVGQVVMVF9QT1NJVElPTiwKKyAgICAgICAgICBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQk9SREVSLAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgiYm9yZGVyIiwgIkJvcmRlciIsICJCb3JkZXIgb2YgdGhlIG1hc2siLAorICAgICAgICAgIDAuMCwgMS4wLCBERUZBVUxUX0JPUkRFUiwKKyAgICAgICAgICBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2hhcGVfd2lwZV9jaGFuZ2Vfc3RhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiU2hhcGUgV2lwZSB0cmFuc2l0aW9uIGZpbHRlciIsCisgICAgICAiRmlsdGVyL0VkaXRvci9WaWRlbyIsCisgICAgICAiQWRkcyBhIHNoYXBlIHdpcGUgdHJhbnNpdGlvbiB0byBhIHZpZGVvIHN0cmVhbSIsCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmdmlkZW9fc2lua19wYWRfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZtYXNrX3NpbmtfcGFkX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmc3JjX3BhZF90ZW1wbGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc2hhcGVfd2lwZV9pbml0IChHc3RTaGFwZVdpcGUgKiBzZWxmKQoreworICBzZWxmLT52aWRlb19zaW5rcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmdmlkZW9fc2lua19wYWRfdGVtcGxhdGUsICJ2aWRlb19zaW5rIik7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChzZWxmLT52aWRlb19zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zaGFwZV93aXBlX3ZpZGVvX3NpbmtfY2hhaW4pKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHNlbGYtPnZpZGVvX3NpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NoYXBlX3dpcGVfdmlkZW9fc2lua19ldmVudCkpOworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAoc2VsZi0+dmlkZW9fc2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2hhcGVfd2lwZV92aWRlb19zaW5rX3F1ZXJ5KSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzZWxmKSwgc2VsZi0+dmlkZW9fc2lua3BhZCk7CisKKyAgc2VsZi0+bWFza19zaW5rcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmbWFza19zaW5rX3BhZF90ZW1wbGF0ZSwgIm1hc2tfc2luayIpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoc2VsZi0+bWFza19zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zaGFwZV93aXBlX21hc2tfc2lua19jaGFpbikpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoc2VsZi0+bWFza19zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zaGFwZV93aXBlX21hc2tfc2lua19ldmVudCkpOworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAoc2VsZi0+bWFza19zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zaGFwZV93aXBlX21hc2tfc2lua19xdWVyeSkpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoc2VsZiksIHNlbGYtPm1hc2tfc2lua3BhZCk7CisKKyAgc2VsZi0+c3JjcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzcmNfcGFkX3RlbXBsYXRlLCAic3JjIik7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChzZWxmLT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NoYXBlX3dpcGVfc3JjX2V2ZW50KSk7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChzZWxmLT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NoYXBlX3dpcGVfc3JjX3F1ZXJ5KSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzZWxmKSwgc2VsZi0+c3JjcGFkKTsKKworICBnX211dGV4X2luaXQgKCZzZWxmLT5tYXNrX211dGV4KTsKKyAgZ19jb25kX2luaXQgKCZzZWxmLT5tYXNrX2NvbmQpOworCisgIGdzdF9zaGFwZV93aXBlX3Jlc2V0IChzZWxmKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zaGFwZV93aXBlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTaGFwZVdpcGUgKnNlbGYgPSBHU1RfU0hBUEVfV0lQRSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUE9TSVRJT046CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIHNlbGYtPm1hc2tfcG9zaXRpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JPUkRFUjoKKyAgICAgIGdfdmFsdWVfc2V0X2Zsb2F0ICh2YWx1ZSwgc2VsZi0+bWFza19ib3JkZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3NoYXBlX3dpcGVfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFNoYXBlV2lwZSAqc2VsZiA9IEdTVF9TSEFQRV9XSVBFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QT1NJVElPTjp7CisgICAgICBnZmxvYXQgZiA9IGdfdmFsdWVfZ2V0X2Zsb2F0ICh2YWx1ZSk7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzZWxmLCAiU2V0dGluZyBtYXNrIHBvc2l0aW9uOiAlZiIsIGYpOworICAgICAgc2VsZi0+bWFza19wb3NpdGlvbiA9IGY7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0JPUkRFUjp7CisgICAgICBnZmxvYXQgZiA9IGdfdmFsdWVfZ2V0X2Zsb2F0ICh2YWx1ZSk7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzZWxmLCAiU2V0dGluZyBtYXNrIGJvcmRlcjogJWYiLCBmKTsKKyAgICAgIHNlbGYtPm1hc2tfYm9yZGVyID0gZjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc2hhcGVfd2lwZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0U2hhcGVXaXBlICpzZWxmID0gR1NUX1NIQVBFX1dJUEUgKG9iamVjdCk7CisKKyAgZ3N0X3NoYXBlX3dpcGVfcmVzZXQgKHNlbGYpOworCisgIGdfY29uZF9jbGVhciAoJnNlbGYtPm1hc2tfY29uZCk7CisgIGdfbXV0ZXhfY2xlYXIgKCZzZWxmLT5tYXNrX211dGV4KTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc2hhcGVfd2lwZV9yZXNldCAoR3N0U2hhcGVXaXBlICogc2VsZikKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlJlc2V0dGluZyBpbnRlcm5hbCBzdGF0ZSIpOworCisgIGlmIChzZWxmLT5tYXNrKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKHNlbGYtPm1hc2spOworICBzZWxmLT5tYXNrID0gTlVMTDsKKworICBnX211dGV4X2xvY2sgKCZzZWxmLT5tYXNrX211dGV4KTsKKyAgZ19jb25kX3NpZ25hbCAoJnNlbGYtPm1hc2tfY29uZCk7CisgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bWFza19tdXRleCk7CisKKyAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoJnNlbGYtPnZpbmZvKTsKKyAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoJnNlbGYtPm1pbmZvKTsKKyAgc2VsZi0+bWFza19icHAgPSAwOworCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWxmLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworCisgIGdzdF9zaGFwZV93aXBlX3Jlc2V0X3FvcyAoc2VsZik7CisgIHNlbGYtPmZyYW1lX2R1cmF0aW9uID0gMDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2hhcGVfd2lwZV92aWRlb19zaW5rX3NldGNhcHMgKEdzdFNoYXBlV2lwZSAqIHNlbGYsIEdzdENhcHMgKiBjYXBzKQoreworICBnYm9vbGVhbiByZXQgPSBUUlVFOworICBHc3RWaWRlb0luZm8gaW5mbzsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiU2V0dGluZyBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgaWYgKCFnc3RfdmlkZW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBjYXBzKSkKKyAgICBnb3RvIGludmFsaWRfY2FwczsKKworICBpZiAoKHNlbGYtPnZpbmZvLndpZHRoICE9IGluZm8ud2lkdGggfHwgc2VsZi0+dmluZm8uaGVpZ2h0ICE9IGluZm8uaGVpZ2h0KSAmJgorICAgICAgc2VsZi0+dmluZm8ud2lkdGggPiAwICYmIHNlbGYtPnZpbmZvLmhlaWdodCA+IDApIHsKKyAgICBnX211dGV4X2xvY2sgKCZzZWxmLT5tYXNrX211dGV4KTsKKyAgICBpZiAoc2VsZi0+bWFzaykKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHNlbGYtPm1hc2spOworICAgIHNlbGYtPm1hc2sgPSBOVUxMOworICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bWFza19tdXRleCk7CisgIH0KKworCisgIGlmIChpbmZvLmZwc19uICE9IDApCisgICAgc2VsZi0+ZnJhbWVfZHVyYXRpb24gPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKEdTVF9TRUNPTkQsIGluZm8uZnBzX2QsIGluZm8uZnBzX24pOworICBlbHNlCisgICAgc2VsZi0+ZnJhbWVfZHVyYXRpb24gPSAwOworCisgIHNlbGYtPnZpbmZvID0gaW5mbzsKKworICByZXQgPSBnc3RfcGFkX3NldF9jYXBzIChzZWxmLT5zcmNwYWQsIGNhcHMpOworCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX2NhcHM6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiSW52YWxpZCBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9zaGFwZV93aXBlX3ZpZGVvX3NpbmtfZ2V0Y2FwcyAoR3N0U2hhcGVXaXBlICogc2VsZiwgR3N0UGFkICogcGFkLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKnRlbXBsLCAqcmV0LCAqdG1wOworCisgIHJldCA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAocGFkKTsKKyAgaWYgKHJldCAhPSBOVUxMKQorICAgIHJldHVybiByZXQ7CisKKyAgdGVtcGwgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAocGFkKTsKKyAgdG1wID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKHNlbGYtPnNyY3BhZCwgTlVMTCk7CisgIGlmICh0bXApIHsKKyAgICByZXQgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHRtcCwgdGVtcGwpOworICAgIGdzdF9jYXBzX3VucmVmICh0ZW1wbCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHRtcCk7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gdGVtcGw7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAic3JjcGFkIGFjY2VwdGVkIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCByZXQpOworCisgIGlmIChnc3RfY2Fwc19pc19lbXB0eSAocmV0KSkKKyAgICBnb3RvIGRvbmU7CisKKyAgdG1wID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKHBhZCwgTlVMTCk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgInBlZXJwYWQgYWNjZXB0ZWQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIHRtcCk7CisgIGlmICh0bXApIHsKKyAgICBHc3RDYXBzICppbnRlcnNlY3Rpb247CisKKyAgICBpbnRlcnNlY3Rpb24gPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHRtcCwgcmV0KTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmV0KTsKKyAgICByZXQgPSBpbnRlcnNlY3Rpb247CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiaW50ZXJzZWN0aW9uOiAlIiBHU1RfUFRSX0ZPUk1BVCwgdG1wKTsKKworICBpZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKHJldCkpCisgICAgZ290byBkb25lOworCisgIGlmIChzZWxmLT52aW5mby5oZWlnaHQgJiYgc2VsZi0+dmluZm8ud2lkdGgpIHsKKyAgICBndWludCBpLCBuOworCisgICAgcmV0ID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAocmV0KTsKKyAgICBuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKHJldCk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgR3N0U3RydWN0dXJlICpzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAocmV0LCBpKTsKKworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHNlbGYtPnZpbmZvLndpZHRoLCAiaGVpZ2h0IiwKKyAgICAgICAgICBHX1RZUEVfSU5ULCBzZWxmLT52aW5mby5oZWlnaHQsIE5VTEwpOworICAgIH0KKyAgfQorCisgIHRtcCA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChzZWxmLT5tYXNrX3NpbmtwYWQsIE5VTEwpOworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJtYXNrIGFjY2VwdGVkIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCB0bXApOworICBpZiAodG1wKSB7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uLCAqdG1wMjsKKyAgICBndWludCBpLCBuOworCisgICAgdG1wMiA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChzZWxmLT5tYXNrX3NpbmtwYWQpOworICAgIGludGVyc2VjdGlvbiA9IGdzdF9jYXBzX2ludGVyc2VjdCAodG1wLCB0bXAyKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wMik7CisgICAgdG1wID0gaW50ZXJzZWN0aW9uOworCisgICAgdG1wID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAodG1wKTsKKyAgICBuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKHRtcCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlICh0bXAsIGkpOworCisgICAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZHMgKHMsICJmb3JtYXQiLCAiZnJhbWVyYXRlIiwgTlVMTCk7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzLCAidmlkZW8veC1yYXciKTsKKyAgICB9CisKKyAgICBpbnRlcnNlY3Rpb24gPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHRtcCwgcmV0KTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmV0KTsKKyAgICByZXQgPSBpbnRlcnNlY3Rpb247CisgIH0KK2RvbmU6CisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJSZXR1cm5pbmcgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIHJldCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2hhcGVfd2lwZV9tYXNrX3Npbmtfc2V0Y2FwcyAoR3N0U2hhcGVXaXBlICogc2VsZiwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIGdpbnQgd2lkdGgsIGhlaWdodCwgYnBwOworICBHc3RWaWRlb0luZm8gaW5mbzsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiU2V0dGluZyBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgaWYgKCFnc3RfdmlkZW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBjYXBzKSkgeworICAgIHJldCA9IEZBTFNFOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIHdpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKCZpbmZvKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUICgmaW5mbyk7CisgIGJwcCA9IEdTVF9WSURFT19JTkZPX0NPTVBfREVQVEggKCZpbmZvLCAwKTsKKworICBpZiAoKHNlbGYtPnZpbmZvLndpZHRoICE9IHdpZHRoIHx8IHNlbGYtPnZpbmZvLmhlaWdodCAhPSBoZWlnaHQpICYmCisgICAgICBzZWxmLT52aW5mby53aWR0aCA+IDAgJiYgc2VsZi0+dmluZm8uaGVpZ2h0ID4gMCkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsICJNYXNrIGNhcHMgbXVzdCBoYXZlIHRoZSBzYW1lIHdpZHRoL2hlaWdodCAiCisgICAgICAgICJhcyB0aGUgdmlkZW8gY2FwcyIpOworICAgIHJldCA9IEZBTFNFOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIHNlbGYtPm1hc2tfYnBwID0gYnBwOworICBzZWxmLT5taW5mbyA9IGluZm87CisKK2RvbmU6CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9zaGFwZV93aXBlX21hc2tfc2lua19nZXRjYXBzIChHc3RTaGFwZVdpcGUgKiBzZWxmLCBHc3RQYWQgKiBwYWQsCisgICAgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0Q2FwcyAqcmV0LCAqdG1wLCAqdGNhcHM7CisgIGd1aW50IGksIG47CisKKyAgcmV0ID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChwYWQpOworICBpZiAocmV0ICE9IE5VTEwpCisgICAgcmV0dXJuIHJldDsKKworICB0Y2FwcyA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChzZWxmLT52aWRlb19zaW5rcGFkKTsKKyAgdG1wID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKHNlbGYtPnZpZGVvX3NpbmtwYWQsIE5VTEwpOworICBpZiAodG1wKSB7CisgICAgcmV0ID0gZ3N0X2NhcHNfaW50ZXJzZWN0ICh0bXAsIHRjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmICh0bXApOworICB9IGVsc2UgeworICAgIHJldCA9IHRjYXBzOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgInZpZGVvIHNpbmsgYWNjZXB0ZWQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIHJldCk7CisKKyAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChyZXQpKQorICAgIGdvdG8gZG9uZTsKKworICB0bXAgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAoc2VsZi0+c3JjcGFkLCBOVUxMKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgInNyY3BhZCBhY2NlcHRlZCBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgcmV0KTsKKworICBpZiAodG1wKSB7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uOworCisgICAgaW50ZXJzZWN0aW9uID0gZ3N0X2NhcHNfaW50ZXJzZWN0IChyZXQsIHRtcCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHJldCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHRtcCk7CisgICAgcmV0ID0gaW50ZXJzZWN0aW9uOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgImludGVyc2VjdGlvbjogJSIgR1NUX1BUUl9GT1JNQVQsIHJldCk7CisKKyAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChyZXQpKQorICAgIGdvdG8gZG9uZTsKKworICByZXQgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChyZXQpOworICBuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKHJldCk7CisgIHRtcCA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHJldCwgaSk7CisgICAgR3N0U3RydWN0dXJlICp0OworCisgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAocywgInZpZGVvL3gtcmF3Iik7CisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGRzIChzLCAiZm9ybWF0IiwgImZyYW1lcmF0ZSIsIE5VTEwpOworCisgICAgaWYgKHNlbGYtPnZpbmZvLndpZHRoICYmIHNlbGYtPnZpbmZvLmhlaWdodCkKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAid2lkdGgiLCBHX1RZUEVfSU5ULCBzZWxmLT52aW5mby53aWR0aCwgImhlaWdodCIsCisgICAgICAgICAgR19UWVBFX0lOVCwgc2VsZi0+dmluZm8uaGVpZ2h0LCBOVUxMKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT04sIDAsIDEsIE5VTEwpOworCisgICAgdCA9IGdzdF9zdHJ1Y3R1cmVfY29weSAocyk7CisKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsIEdTVF9WSURFT19ORSAoR1JBWTE2KSwgTlVMTCk7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHQsICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiR1JBWTgiLCBOVUxMKTsKKworICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKHRtcCwgdCk7CisgIH0KKyAgZ3N0X2NhcHNfYXBwZW5kIChyZXQsIHRtcCk7CisKKyAgdG1wID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKHBhZCwgTlVMTCk7CisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJwZWVyIGFjY2VwdGVkIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCB0bXApOworCisgIGlmICh0bXApIHsKKyAgICBHc3RDYXBzICppbnRlcnNlY3Rpb247CisKKyAgICBpbnRlcnNlY3Rpb24gPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHRtcCwgcmV0KTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmV0KTsKKyAgICByZXQgPSBpbnRlcnNlY3Rpb247CisgIH0KKworZG9uZToKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgIlJldHVybmluZyBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgcmV0KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3Rfc2hhcGVfd2lwZV9zcmNfZ2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RTaGFwZVdpcGUgKnNlbGYgPSBHU1RfU0hBUEVfV0lQRSAoZ3N0X3BhZF9nZXRfcGFyZW50IChwYWQpKTsKKyAgR3N0Q2FwcyAqdGVtcGwsICpyZXQsICp0bXA7CisKKyAgcmV0ID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChwYWQpOworICBpZiAocmV0ICE9IE5VTEwpCisgICAgcmV0dXJuIHJldDsKKworICByZXQgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHNlbGYtPnZpZGVvX3NpbmtwYWQpOworICBpZiAocmV0ICE9IE5VTEwpCisgICAgcmV0dXJuIHJldDsKKworICB0ZW1wbCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChzZWxmLT52aWRlb19zaW5rcGFkKTsKKyAgdG1wID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKHNlbGYtPnZpZGVvX3NpbmtwYWQsIE5VTEwpOworICBpZiAodG1wKSB7CisgICAgcmV0ID0gZ3N0X2NhcHNfaW50ZXJzZWN0ICh0bXAsIHRlbXBsKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGVtcGwpOworICAgIGdzdF9jYXBzX3VucmVmICh0bXApOworICB9IGVsc2UgeworICAgIHJldCA9IHRlbXBsOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgInZpZGVvIHNpbmsgYWNjZXB0ZWQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIHJldCk7CisKKyAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChyZXQpKQorICAgIGdvdG8gZG9uZTsKKworICB0bXAgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAocGFkLCBOVUxMKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgInBlZXIgYWNjZXB0ZWQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIHJldCk7CisgIGlmICh0bXApIHsKKyAgICBHc3RDYXBzICppbnRlcnNlY3Rpb247CisKKyAgICBpbnRlcnNlY3Rpb24gPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHRtcCwgcmV0KTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmV0KTsKKyAgICByZXQgPSBpbnRlcnNlY3Rpb247CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiaW50ZXJzZWN0aW9uOiAlIiBHU1RfUFRSX0ZPUk1BVCwgcmV0KTsKKworICBpZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKHJldCkpCisgICAgZ290byBkb25lOworCisgIGlmIChzZWxmLT52aW5mby5oZWlnaHQgJiYgc2VsZi0+dmluZm8ud2lkdGgpIHsKKyAgICBndWludCBpLCBuOworCisgICAgcmV0ID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAocmV0KTsKKyAgICBuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKHJldCk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgR3N0U3RydWN0dXJlICpzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAocmV0LCBpKTsKKworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHNlbGYtPnZpbmZvLndpZHRoLCAiaGVpZ2h0IiwKKyAgICAgICAgICBHX1RZUEVfSU5ULCBzZWxmLT52aW5mby5oZWlnaHQsIE5VTEwpOworICAgIH0KKyAgfQorCisgIHRtcCA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChzZWxmLT5tYXNrX3NpbmtwYWQsIE5VTEwpOworICBHU1RfTE9HX09CSkVDVCAocGFkLCAibWFzayBzaW5rIGFjY2VwdGVkIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCByZXQpOworICBpZiAodG1wKSB7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uLCAqdG1wMjsKKyAgICBndWludCBpLCBuOworCisgICAgdG1wMiA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChzZWxmLT5tYXNrX3NpbmtwYWQpOworICAgIGludGVyc2VjdGlvbiA9IGdzdF9jYXBzX2ludGVyc2VjdCAodG1wLCB0bXAyKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wMik7CisKKyAgICB0bXAgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChpbnRlcnNlY3Rpb24pOworICAgIG4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAodG1wKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHRtcCwgaSk7CisKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkcyAocywgImZvcm1hdCIsICJmcmFtZXJhdGUiLCBOVUxMKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHMsICJ2aWRlby94LXJhdyIpOworICAgIH0KKworICAgIGludGVyc2VjdGlvbiA9IGdzdF9jYXBzX2ludGVyc2VjdCAodG1wLCByZXQpOworICAgIGdzdF9jYXBzX3VucmVmICh0bXApOworICAgIGdzdF9jYXBzX3VucmVmIChyZXQpOworICAgIHJldCA9IGludGVyc2VjdGlvbjsKKyAgfQorCitkb25lOgorCisgIGdzdF9vYmplY3RfdW5yZWYgKHNlbGYpOworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJSZXR1cm5pbmcgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIHJldCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2hhcGVfd2lwZV92aWRlb19zaW5rX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RTaGFwZVdpcGUgKnNlbGYgPSAoR3N0U2hhcGVXaXBlICopIHBhcmVudDsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJIYW5kbGluZyBxdWVyeSBvZiB0eXBlICclcyciLAorICAgICAgZ3N0X3F1ZXJ5X3R5cGVfZ2V0X25hbWUgKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpKTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKmZpbHRlciwgKmNhcHM7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9jYXBzIChxdWVyeSwgJmZpbHRlcik7CisgICAgICBjYXBzID0gZ3N0X3NoYXBlX3dpcGVfdmlkZW9fc2lua19nZXRjYXBzIChzZWxmLCBwYWQsIGZpbHRlcik7CisgICAgICBnc3RfcXVlcnlfc2V0X2NhcHNfcmVzdWx0IChxdWVyeSwgY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBnc3RfcGFkX3F1ZXJ5X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NoYXBlX3dpcGVfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0U2hhcGVXaXBlICpzZWxmID0gR1NUX1NIQVBFX1dJUEUgKHBhcmVudCk7CisgIGdib29sZWFuIHJldDsKKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiSGFuZGxpbmcgcXVlcnkgb2YgdHlwZSAnJXMnIiwKKyAgICAgIGdzdF9xdWVyeV90eXBlX2dldF9uYW1lIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpmaWx0ZXIsICpjYXBzOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY2FwcyAocXVlcnksICZmaWx0ZXIpOworICAgICAgY2FwcyA9IGdzdF9zaGFwZV93aXBlX3NyY19nZXRjYXBzIChwYWQsIGZpbHRlcik7CisgICAgICBnc3RfcXVlcnlfc2V0X2NhcHNfcmVzdWx0IChxdWVyeSwgY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBnc3RfcGFkX3BlZXJfcXVlcnkgKHNlbGYtPnZpZGVvX3NpbmtwYWQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zaGFwZV93aXBlX3VwZGF0ZV9xb3MgKEdzdFNoYXBlV2lwZSAqIHNlbGYsIGdkb3VibGUgcHJvcG9ydGlvbiwKKyAgICBHc3RDbG9ja1RpbWVEaWZmIGRpZmYsIEdzdENsb2NrVGltZSB0aW1lc3RhbXApCit7CisgIEdTVF9PQkpFQ1RfTE9DSyAoc2VsZik7CisgIHNlbGYtPnByb3BvcnRpb24gPSBwcm9wb3J0aW9uOworICBpZiAoR19MSUtFTFkgKHRpbWVzdGFtcCAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKSkgeworICAgIGlmIChHX1VOTElLRUxZIChkaWZmID4gMCkpCisgICAgICBzZWxmLT5lYXJsaWVzdF90aW1lID0gdGltZXN0YW1wICsgMiAqIGRpZmYgKyBzZWxmLT5mcmFtZV9kdXJhdGlvbjsKKyAgICBlbHNlCisgICAgICBzZWxmLT5lYXJsaWVzdF90aW1lID0gdGltZXN0YW1wICsgZGlmZjsKKyAgfSBlbHNlIHsKKyAgICBzZWxmLT5lYXJsaWVzdF90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoc2VsZik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc2hhcGVfd2lwZV9yZXNldF9xb3MgKEdzdFNoYXBlV2lwZSAqIHNlbGYpCit7CisgIGdzdF9zaGFwZV93aXBlX3VwZGF0ZV9xb3MgKHNlbGYsIDAuNSwgMCwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc2hhcGVfd2lwZV9yZWFkX3FvcyAoR3N0U2hhcGVXaXBlICogc2VsZiwgZ2RvdWJsZSAqIHByb3BvcnRpb24sCisgICAgR3N0Q2xvY2tUaW1lICogdGltZSkKK3sKKyAgR1NUX09CSkVDVF9MT0NLIChzZWxmKTsKKyAgKnByb3BvcnRpb24gPSBzZWxmLT5wcm9wb3J0aW9uOworICAqdGltZSA9IHNlbGYtPmVhcmxpZXN0X3RpbWU7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChzZWxmKTsKK30KKworLyogUGVyZm9ybSBxb3MgY2FsY3VsYXRpb25zIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBuZXh0IGZyYW1lLiBSZXR1cm5zIFRSVUUgaWYKKyAqIHRoZSBmcmFtZSBzaG91bGQgYmUgcHJvY2Vzc2VkLCBGQUxTRSBpZiB0aGUgZnJhbWUgY2FuIGJlIGRyb3BwZWQgZW50aXJlbHkgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NoYXBlX3dpcGVfZG9fcW9zIChHc3RTaGFwZVdpcGUgKiBzZWxmLCBHc3RDbG9ja1RpbWUgdGltZXN0YW1wKQoreworICBHc3RDbG9ja1RpbWUgcW9zdGltZSwgZWFybGllc3RfdGltZTsKKyAgZ2RvdWJsZSBwcm9wb3J0aW9uOworCisgIC8qIG5vIHRpbWVzdGFtcCwgY2FuJ3QgZG8gUW9TID0+IHByb2Nlc3MgZnJhbWUgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAodGltZXN0YW1wKSkpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoc2VsZiwgImludmFsaWQgdGltZXN0YW1wLCBjYW4ndCBkbyBRb1MsIHByb2Nlc3MgZnJhbWUiKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIC8qIGdldCBsYXRlc3QgUW9TIG9ic2VydmF0aW9uIHZhbHVlcyAqLworICBnc3Rfc2hhcGVfd2lwZV9yZWFkX3FvcyAoc2VsZiwgJnByb3BvcnRpb24sICZlYXJsaWVzdF90aW1lKTsKKworICAvKiBza2lwIHFvcyBpZiB3ZSBoYXZlIG5vIG9ic2VydmF0aW9uICh5ZXQpID0+IHByb2Nlc3MgZnJhbWUgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZWFybGllc3RfdGltZSkpKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNlbGYsICJubyBvYnNlcnZhdGlvbiB5ZXQsIHByb2Nlc3MgZnJhbWUiKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIC8qIHFvcyBpcyBkb25lIG9uIHJ1bm5pbmcgdGltZSAqLworICBxb3N0aW1lID0gZ3N0X3NlZ21lbnRfdG9fcnVubmluZ190aW1lICgmc2VsZi0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgdGltZXN0YW1wKTsKKworICAvKiBzZWUgaG93IG91ciBuZXh0IHRpbWVzdGFtcCByZWxhdGVzIHRvIHRoZSBsYXRlc3QgcW9zIHRpbWVzdGFtcCAqLworICBHU1RfTE9HX09CSkVDVCAoc2VsZiwgInFvc3RpbWUgJSIgR1NUX1RJTUVfRk9STUFUICIsIGVhcmxpZXN0ICUiCisgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHFvc3RpbWUpLCBHU1RfVElNRV9BUkdTIChlYXJsaWVzdF90aW1lKSk7CisKKyAgaWYgKHFvc3RpbWUgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSAmJiBxb3N0aW1lIDw9IGVhcmxpZXN0X3RpbWUpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAid2UgYXJlIGxhdGUsIGRyb3AgZnJhbWUiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAoc2VsZiwgInByb2Nlc3MgZnJhbWUiKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNkZWZpbmUgQ1JFQVRFX0FSR0JfRlVOQ1RJT05TKGRlcHRoLCBuYW1lLCBzaGlmdCwgYSwgciwgZywgYikgXAorc3RhdGljIHZvaWQgXAorZ3N0X3NoYXBlX3dpcGVfYmxlbmRfIyNuYW1lIyNfIyNkZXB0aCAoR3N0U2hhcGVXaXBlICogc2VsZiwgR3N0VmlkZW9GcmFtZSAqIGluZnJhbWUsIFwKKyAgICBHc3RWaWRlb0ZyYW1lICogbWFza2ZyYW1lLCBHc3RWaWRlb0ZyYW1lICogb3V0ZnJhbWUpIFwKK3sgXAorICBjb25zdCBndWludCMjZGVwdGggKm1hc2sgPSAoY29uc3QgZ3VpbnQjI2RlcHRoICopIEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChtYXNrZnJhbWUsIDApOyBcCisgIGNvbnN0IGd1aW50OCAqaW5wdXQgPSAoY29uc3QgZ3VpbnQ4ICopIEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbmZyYW1lLCAwKTsgXAorICBndWludDggKm91dHB1dCA9IChndWludDggKikgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dGZyYW1lLCAwKTsgXAorICBndWludCBpLCBqOyBcCisgIGdpbnQgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluZnJhbWUpOyBcCisgIGdpbnQgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5mcmFtZSk7IFwKKyAgZ3VpbnQgbWFza19pbmNyZW1lbnQgPSAoKGRlcHRoID09IDE2KSA/IEdTVF9ST1VORF9VUF8yICh3aWR0aCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHU1RfUk9VTkRfVVBfNCAod2lkdGgpKSAtIHdpZHRoOyBcCisgIGdmbG9hdCBwb3NpdGlvbiA9IHNlbGYtPm1hc2tfcG9zaXRpb247IFwKKyAgZ2Zsb2F0IGxvdyA9IHBvc2l0aW9uIC0gKHNlbGYtPm1hc2tfYm9yZGVyIC8gMi4wZik7IFwKKyAgZ2Zsb2F0IGhpZ2ggPSBwb3NpdGlvbiArIChzZWxmLT5tYXNrX2JvcmRlciAvIDIuMGYpOyBcCisgIGd1aW50MzIgbG93X2ksIGhpZ2hfaSwgcm91bmRfaTsgXAorICBcCisgIGlmIChsb3cgPCAwLjBmKSB7IFwKKyAgICBoaWdoID0gMC4wZjsgXAorICAgIGxvdyA9IDAuMGY7IFwKKyAgfSBcCisgIFwKKyAgaWYgKGhpZ2ggPiAxLjBmKSB7IFwKKyAgICBsb3cgPSAxLjBmOyBcCisgICAgaGlnaCA9IDEuMGY7IFwKKyAgfSBcCisgIFwKKyAgbG93X2kgPSBsb3cgKiA2NTUzNjsgXAorICBoaWdoX2kgPSBoaWdoICogNjU1MzY7IFwKKyAgcm91bmRfaSA9IChoaWdoX2kgLSBsb3dfaSkgPj4gMTsgXAorICBcCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeyBcCisgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsgXAorICAgICAgZ3VpbnQzMiBpbiA9ICptYXNrIDw8IHNoaWZ0OyBcCisgICAgICBcCisgICAgICBpZiAoaW4gPCBsb3dfaSkgeyBcCisgICAgICAgIG91dHB1dFthXSA9IDB4MDA7ICAgICAgIC8qIEEgKi8gXAorICAgICAgICBvdXRwdXRbcl0gPSBpbnB1dFtyXTsgICAvKiBSICovIFwKKyAgICAgICAgb3V0cHV0W2ddID0gaW5wdXRbZ107ICAgLyogRyAqLyBcCisgICAgICAgIG91dHB1dFtiXSA9IGlucHV0W2JdOyAgIC8qIEIgKi8gXAorICAgICAgfSBlbHNlIGlmIChpbiA+PSBoaWdoX2kpIHsgXAorICAgICAgICBvdXRwdXRbYV0gPSBpbnB1dFthXTsgICAvKiBBICovIFwKKyAgICAgICAgb3V0cHV0W3JdID0gaW5wdXRbcl07ICAgLyogUiAqLyBcCisgICAgICAgIG91dHB1dFtnXSA9IGlucHV0W2ddOyAgIC8qIEcgKi8gXAorICAgICAgICBvdXRwdXRbYl0gPSBpbnB1dFtiXTsgICAvKiBCICovIFwKKyAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgZ3VpbnQzMiB2YWw7IFwKKyAgICAgICAgLyogTm90ZTogVGhpcyB3aWxsIG5ldmVyIG92ZXJmbG93IG9yIGJlIGxhcmdlciB0aGFuIDI1NSEgKi8gXAorICAgICAgICB2YWwgPSAoKChpbiAtIGxvd19pKSA8PCAxNikgKyByb3VuZF9pKSAvIChoaWdoX2kgLSBsb3dfaSk7IFwKKyAgICAgICAgdmFsID0gKHZhbCAqIGlucHV0W2FdICsgMzI3NjgpID4+IDE2OyBcCisgICAgICAgIFwKKyAgICAgICAgb3V0cHV0W2FdID0gdmFsOyAgICAgICAgLyogQSAqLyBcCisgICAgICAgIG91dHB1dFtyXSA9IGlucHV0W3JdOyAgIC8qIFIgKi8gXAorICAgICAgICBvdXRwdXRbZ10gPSBpbnB1dFtnXTsgICAvKiBHICovIFwKKyAgICAgICAgb3V0cHV0W2JdID0gaW5wdXRbYl07ICAgLyogQiAqLyBcCisgICAgICB9IFwKKyAgICAgIFwKKyAgICAgIG1hc2srKzsgXAorICAgICAgaW5wdXQgKz0gNDsgXAorICAgICAgb3V0cHV0ICs9IDQ7IFwKKyAgICB9IFwKKyAgICBtYXNrICs9IG1hc2tfaW5jcmVtZW50OyBcCisgIH0gXAorfQorCitDUkVBVEVfQVJHQl9GVU5DVElPTlMgKDE2LCBhcmdiLCAwLCAwLCAxLCAyLCAzKTsKK0NSRUFURV9BUkdCX0ZVTkNUSU9OUyAoOCwgYXJnYiwgOCwgMCwgMSwgMiwgMyk7CisKK0NSRUFURV9BUkdCX0ZVTkNUSU9OUyAoMTYsIGJncmEsIDAsIDMsIDIsIDEsIDApOworQ1JFQVRFX0FSR0JfRlVOQ1RJT05TICg4LCBiZ3JhLCA4LCAzLCAyLCAxLCAwKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9zaGFwZV93aXBlX3ZpZGVvX3NpbmtfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0U2hhcGVXaXBlICpzZWxmID0gR1NUX1NIQVBFX1dJUEUgKHBhcmVudCk7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdEJ1ZmZlciAqbWFzayA9IE5VTEwsICpvdXRidWYgPSBOVUxMOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworICBHc3RWaWRlb0ZyYW1lIGluZnJhbWUsIG91dGZyYW1lLCBtYXNrZnJhbWU7CisKKyAgaWYgKEdfVU5MSUtFTFkgKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoJnNlbGYtPnZpbmZvKSA9PQorICAgICAgICAgIEdTVF9WSURFT19GT1JNQVRfVU5LTk9XTikpCisgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKTsKKyAgdGltZXN0YW1wID0KKyAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmc2VsZi0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLCB0aW1lc3RhbXApOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAodGltZXN0YW1wKSkKKyAgICBnc3Rfb2JqZWN0X3N5bmNfdmFsdWVzIChHU1RfT0JKRUNUIChzZWxmKSwgdGltZXN0YW1wKTsKKworICBHU1RfTE9HX09CSkVDVCAoc2VsZiwKKyAgICAgICJCbGVuZGluZyBidWZmZXIgd2l0aCB0aW1lc3RhbXAgJSIgR1NUX1RJTUVfRk9STUFUICIgYXQgcG9zaXRpb24gJWYiLAorICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSwgc2VsZi0+bWFza19wb3NpdGlvbik7CisKKyAgZ19tdXRleF9sb2NrICgmc2VsZi0+bWFza19tdXRleCk7CisgIGlmIChzZWxmLT5zaHV0ZG93bikKKyAgICBnb3RvIHNodXRkb3duOworCisgIGlmICghc2VsZi0+bWFzaykKKyAgICBnX2NvbmRfd2FpdCAoJnNlbGYtPm1hc2tfY29uZCwgJnNlbGYtPm1hc2tfbXV0ZXgpOworCisgIGlmIChzZWxmLT5tYXNrID09IE5VTEwgfHwgc2VsZi0+c2h1dGRvd24pIHsKKyAgICBnb3RvIHNodXRkb3duOworICB9IGVsc2UgeworICAgIG1hc2sgPSBnc3RfYnVmZmVyX3JlZiAoc2VsZi0+bWFzayk7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5tYXNrX211dGV4KTsKKworICBpZiAoIWdzdF9zaGFwZV93aXBlX2RvX3FvcyAoc2VsZiwgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcikpKQorICAgIGdvdG8gcW9zOworCisgIC8qIFdpbGwgYmxlbmQgaW5wbGFjZSBpZiBidWZmZXIgaXMgd3JpdGFibGUgKi8KKyAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChidWZmZXIpOworICBnc3RfdmlkZW9fZnJhbWVfbWFwICgmb3V0ZnJhbWUsICZzZWxmLT52aW5mbywgb3V0YnVmLCBHU1RfTUFQX1JFQURXUklURSk7CisgIGdzdF92aWRlb19mcmFtZV9tYXAgKCZpbmZyYW1lLCAmc2VsZi0+dmluZm8sIG91dGJ1ZiwgR1NUX01BUF9SRUFEKTsKKworICBnc3RfdmlkZW9fZnJhbWVfbWFwICgmbWFza2ZyYW1lLCAmc2VsZi0+bWluZm8sIG1hc2ssIEdTVF9NQVBfUkVBRCk7CisKKyAgc3dpdGNoIChHU1RfVklERU9fSU5GT19GT1JNQVQgKCZzZWxmLT52aW5mbykpIHsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVlVVjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQUJHUjoKKyAgICAgIGlmIChzZWxmLT5tYXNrX2JwcCA9PSAxNikKKyAgICAgICAgZ3N0X3NoYXBlX3dpcGVfYmxlbmRfYXJnYl8xNiAoc2VsZiwgJmluZnJhbWUsICZtYXNrZnJhbWUsICZvdXRmcmFtZSk7CisgICAgICBlbHNlCisgICAgICAgIGdzdF9zaGFwZV93aXBlX2JsZW5kX2FyZ2JfOCAoc2VsZiwgJmluZnJhbWUsICZtYXNrZnJhbWUsICZvdXRmcmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICAgIGlmIChzZWxmLT5tYXNrX2JwcCA9PSAxNikKKyAgICAgICAgZ3N0X3NoYXBlX3dpcGVfYmxlbmRfYmdyYV8xNiAoc2VsZiwgJmluZnJhbWUsICZtYXNrZnJhbWUsICZvdXRmcmFtZSk7CisgICAgICBlbHNlCisgICAgICAgIGdzdF9zaGFwZV93aXBlX2JsZW5kX2JncmFfOCAoc2VsZiwgJmluZnJhbWUsICZtYXNrZnJhbWUsICZvdXRmcmFtZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICBicmVhazsKKyAgfQorCisgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJm91dGZyYW1lKTsKKyAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmaW5mcmFtZSk7CisKKyAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmbWFza2ZyYW1lKTsKKworICBnc3RfYnVmZmVyX3VucmVmIChtYXNrKTsKKworICByZXQgPSBnc3RfcGFkX3B1c2ggKHNlbGYtPnNyY3BhZCwgb3V0YnVmKTsKKyAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSykpCisgICAgZ290byBwdXNoX2ZhaWxlZDsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVycm9ycyAqLworbm90X25lZ290aWF0ZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiTm8gdmFsaWQgY2FwcyB5ZXQiKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgfQorc2h1dGRvd246CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiU2h1dHRpbmcgZG93biIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICB9Citxb3M6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiRHJvcHBpbmcgYnVmZmVyIGJlY2F1c2Ugb2YgUW9TIik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChtYXNrKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK3B1c2hfZmFpbGVkOgorICB7CisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19GTFVTSElORykKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsICJQdXNoaW5nIGJ1ZmZlciBkb3duc3RyZWFtIGZhaWxlZDogJXMiLAorICAgICAgICAgIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgICByZXR1cm4gcmV0OworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfc2hhcGVfd2lwZV9tYXNrX3NpbmtfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0U2hhcGVXaXBlICpzZWxmID0gR1NUX1NIQVBFX1dJUEUgKHBhcmVudCk7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgZ19tdXRleF9sb2NrICgmc2VsZi0+bWFza19tdXRleCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJTZXR0aW5nIG5ldyBtYXNrIGJ1ZmZlcjogJSIgR1NUX1BUUl9GT1JNQVQsIGJ1ZmZlcik7CisKKyAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmc2VsZi0+bWFzaywgYnVmZmVyKTsKKyAgZ19jb25kX3NpZ25hbCAoJnNlbGYtPm1hc2tfY29uZCk7CisgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bWFza19tdXRleCk7CisKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9zaGFwZV93aXBlX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFNoYXBlV2lwZSAqc2VsZiA9IEdTVF9TSEFQRV9XSVBFIChlbGVtZW50KTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBzZWxmLT5zaHV0ZG93biA9IEZBTFNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIC8qIFVuYmxvY2sgdmlkZW8gc2luayBjaGFpbiBmdW5jdGlvbiAqLworICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bWFza19tdXRleCk7CisgICAgICBzZWxmLT5zaHV0ZG93biA9IFRSVUU7CisgICAgICBnX2NvbmRfc2lnbmFsICgmc2VsZi0+bWFza19jb25kKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bWFza19tdXRleCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSkKKyAgICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3NoYXBlX3dpcGVfcmVzZXQgKHNlbGYpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2hhcGVfd2lwZV92aWRlb19zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RTaGFwZVdpcGUgKnNlbGYgPSBHU1RfU0hBUEVfV0lQRSAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJHb3QgJXMgZXZlbnQiLCBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICByZXQgPSBnc3Rfc2hhcGVfd2lwZV92aWRlb19zaW5rX3NldGNhcHMgKHNlbGYsIGNhcHMpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDoKKyAgICB7CisgICAgICBHc3RTZWdtZW50IHNlZzsKKworICAgICAgZ3N0X2V2ZW50X2NvcHlfc2VnbWVudCAoZXZlbnQsICZzZWcpOworICAgICAgaWYgKHNlZy5mb3JtYXQgPT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwKKyAgICAgICAgICAgICJHb3QgU0VHTUVOVCBldmVudCBpbiBHU1RfRk9STUFUX1RJTUUgJSIgR1NUX1BUUl9GT1JNQVQsICZzZWcpOworICAgICAgICBzZWxmLT5zZWdtZW50ID0gc2VnOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlbGYtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgICAgICB9CisgICAgfQorICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9zaGFwZV93aXBlX3Jlc2V0X3FvcyAoc2VsZik7CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChzZWxmLT5zcmNwYWQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2hhcGVfd2lwZV9tYXNrX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFNoYXBlV2lwZSAqc2VsZiA9IEdTVF9TSEFQRV9XSVBFIChwYXJlbnQpOworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJHb3QgJXMgZXZlbnQiLCBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICBnc3Rfc2hhcGVfd2lwZV9tYXNrX3Npbmtfc2V0Y2FwcyAoc2VsZiwgY2Fwcyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPm1hc2tfbXV0ZXgpOworICAgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmc2VsZi0+bWFzaywgTlVMTCk7CisgICAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPm1hc2tfbXV0ZXgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRHJvcHBpbmcgYWxsIGV2ZW50cyBoZXJlICovCisgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zaGFwZV93aXBlX21hc2tfc2lua19xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0U2hhcGVXaXBlICpzZWxmID0gR1NUX1NIQVBFX1dJUEUgKHBhcmVudCk7CisgIGdib29sZWFuIHJldDsKKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiSGFuZGxpbmcgcXVlcnkgb2YgdHlwZSAnJXMnIiwKKyAgICAgIGdzdF9xdWVyeV90eXBlX2dldF9uYW1lIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpmaWx0ZXIsICpjYXBzOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY2FwcyAocXVlcnksICZmaWx0ZXIpOworICAgICAgY2FwcyA9IGdzdF9zaGFwZV93aXBlX21hc2tfc2lua19nZXRjYXBzIChzZWxmLCBwYWQsIGZpbHRlcik7CisgICAgICBnc3RfcXVlcnlfc2V0X2NhcHNfcmVzdWx0IChxdWVyeSwgY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBnc3RfcGFkX3F1ZXJ5X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3Rfc2hhcGVfd2lwZV9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RTaGFwZVdpcGUgKnNlbGYgPSBHU1RfU0hBUEVfV0lQRSAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJHb3QgJXMgZXZlbnQiLCBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1FPUzp7CisgICAgICBHc3RRT1NUeXBlIHR5cGU7CisgICAgICBHc3RDbG9ja1RpbWVEaWZmIGRpZmY7CisgICAgICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworICAgICAgZ2RvdWJsZSBwcm9wb3J0aW9uOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfcW9zIChldmVudCwgJnR5cGUsICZwcm9wb3J0aW9uLCAmZGlmZiwgJnRpbWVzdGFtcCk7CisKKyAgICAgIGdzdF9zaGFwZV93aXBlX3VwZGF0ZV9xb3MgKHNlbGYsIHByb3BvcnRpb24sIGRpZmYsIHRpbWVzdGFtcCk7CisgICAgfQorICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IGdzdF9wYWRfcHVzaF9ldmVudCAoc2VsZi0+dmlkZW9fc2lua3BhZCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3Rfc2hhcGVfd2lwZV9kZWJ1ZywgInNoYXBld2lwZSIsIDAsCisgICAgICAic2hhcGV3aXBlIGVsZW1lbnQiKTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJzaGFwZXdpcGUiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX1NIQVBFX1dJUEUpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHNoYXBld2lwZSwKKyAgICAiU2hhcGUgV2lwZSB0cmFuc2l0aW9uIGZpbHRlciIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuaCBiL2dzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY3MzFjZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmgKQEAgLTAsMCArMSw4MSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1NIQVBFX1dJUEVfSF9fCisjZGVmaW5lIF9fR1NUX1NIQVBFX1dJUEVfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9TSEFQRV9XSVBFIFwKKyAgKGdzdF9zaGFwZV93aXBlX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9TSEFQRV9XSVBFKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfU0hBUEVfV0lQRSxHc3RTaGFwZVdpcGUpKQorI2RlZmluZSBHU1RfU0hBUEVfV0lQRV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9TSEFQRV9XSVBFLEdzdFNoYXBlV2lwZUNsYXNzKSkKKyNkZWZpbmUgR1NUX1NIQVBFX1dJUEVfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLEdTVF9UWVBFX1NIQVBFX1dJUEUsR3N0U2hhcGVXaXBlQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfU0hBUEVfV0lQRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1NIQVBFX1dJUEUpKQorI2RlZmluZSBHU1RfSVNfU0hBUEVfV0lQRV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9TSEFQRV9XSVBFKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFNoYXBlV2lwZSBHc3RTaGFwZVdpcGU7Cit0eXBlZGVmIHN0cnVjdCBfR3N0U2hhcGVXaXBlQ2xhc3MgR3N0U2hhcGVXaXBlQ2xhc3M7CisKK3N0cnVjdCBfR3N0U2hhcGVXaXBlCit7CisgIEdzdEVsZW1lbnQgcGFyZW50OworCisgIC8qIHByaXZhdGUgKi8KKyAgR3N0UGFkICp2aWRlb19zaW5rcGFkOworICBHc3RQYWQgKm1hc2tfc2lua3BhZDsKKworICBHc3RQYWQgKnNyY3BhZDsKKworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgR3N0QnVmZmVyICptYXNrOworICBnZmxvYXQgbWFza19wb3NpdGlvbjsKKyAgZ2Zsb2F0IG1hc2tfYm9yZGVyOworICBHTXV0ZXggbWFza19tdXRleDsKKyAgR0NvbmQgbWFza19jb25kOworICBnaW50IG1hc2tfYnBwOworCisgIEdzdFZpZGVvSW5mbyB2aW5mbzsKKyAgR3N0VmlkZW9JbmZvIG1pbmZvOworCisgIGdib29sZWFuIHNodXRkb3duOworCisgIGdkb3VibGUgcHJvcG9ydGlvbjsKKyAgR3N0Q2xvY2tUaW1lIGVhcmxpZXN0X3RpbWU7CisgIEdzdENsb2NrVGltZSBmcmFtZV9kdXJhdGlvbjsKK307CisKK3N0cnVjdCBfR3N0U2hhcGVXaXBlQ2xhc3MKK3sKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9zaGFwZV93aXBlX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1NIQVBFX1dJUEVfSF9fICovCmRpZmYgLS1naXQgYS9nc3Qvc2hhcGV3aXBlL21lc29uLmJ1aWxkIGIvZ3N0L3NoYXBld2lwZS9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2IzY2RmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3NoYXBld2lwZS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDggQEAKK2dzdHNoYXBld2lwZSA9IGxpYnJhcnkoJ2dzdHNoYXBld2lwZScsCisgICdnc3RzaGFwZXdpcGUuYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ2lvX2RlcCwgZ3N0X2RlcCwgZ3N0dmlkZW9fZGVwXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKZGlmZiAtLWdpdCBhL2dzdC9zbXB0ZS9NYWtlZmlsZS5hbSBiL2dzdC9zbXB0ZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTExMWIyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3NtcHRlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTAgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdHNtcHRlLmxhCisKK2xpYmdzdHNtcHRlX2xhX1NPVVJDRVMgPSBnc3RzbXB0ZS5jIGdzdG1hc2suYyBiYXJib3h3aXBlcy5jIHBhaW50LmMgZ3N0c21wdGVhbHBoYS5jIHBsdWdpbi5jCisKK25vaW5zdF9IRUFERVJTID0gZ3N0c21wdGUuaCBnc3RtYXNrLmggcGFpbnQuaCBnc3RzbXB0ZWFscGhhLmgKKworbGliZ3N0c21wdGVfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKQorbGliZ3N0c21wdGVfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpICQoR1NUX0JBU0VfTElCUykgJChMSUJNKSBcCisJCQktbGdzdHZpZGVvLSQoR1NUX0FQSV9WRVJTSU9OKSAKK2xpYmdzdHNtcHRlX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKZGlmZiAtLWdpdCBhL2dzdC9zbXB0ZS9iYXJib3h3aXBlcy5jIGIvZ3N0L3NtcHRlL2JhcmJveHdpcGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1NWVhYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9zbXB0ZS9iYXJib3h3aXBlcy5jCkBAIC0wLDAgKzEsOTU3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAicGFpbnQuaCIKKyNpbmNsdWRlICJnc3RtYXNrLmgiCisKK2VudW0KK3sKKyAgQk9YX1ZFUlRJQ0FMID0gMSwKKyAgQk9YX0hPUklaT05UQUwgPSAyLAorICBCT1hfQ0xPQ0sgPSAzLAorICBUUklHQU5MRV9MSU5FQVIgPSA0Cit9OworCitzdGF0aWMgY29uc3QgZ2ludCBib3hlc18xYltdWzddID0geworI2RlZmluZSBXSVBFX0IxXzEgICAgICAgMAorICB7Qk9YX1ZFUlRJQ0FMLCAwLCAwLCAwLCAxLCAxLCAxfSwKKyNkZWZpbmUgV0lQRV9CMV8yICAgICAgIDEKKyAge0JPWF9IT1JJWk9OVEFMLCAwLCAwLCAwLCAxLCAxLCAxfQorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgYm94ZXNfMmJbXVs3ICogMl0gPSB7CisjZGVmaW5lIFdJUEVfQjJfMjEgICAgICAwCisgIHtCT1hfVkVSVElDQUwsIDAsIDAsIDEsIDEsIDIsIDAsCisgICAgICBCT1hfVkVSVElDQUwsIDEsIDAsIDAsIDIsIDIsIDF9LAorI2RlZmluZSBXSVBFX0IyXzIyICAgICAgMQorICB7Qk9YX0hPUklaT05UQUwsIDAsIDAsIDEsIDIsIDEsIDAsCisgICAgICBCT1hfSE9SSVpPTlRBTCwgMCwgMSwgMCwgMiwgMiwgMX0sCit9OworCitzdGF0aWMgY29uc3QgZ2ludCBib3hfY2xvY2tfMWJbXVsxICogMTBdID0geworI2RlZmluZSBXSVBFX0IxXzI0MSAgICAgMAorICB7Qk9YX0NMT0NLLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxLCAxfSwKKyNkZWZpbmUgV0lQRV9CMV8yNDIgICAgIDEKKyAge0JPWF9DTE9DSywgMCwgMSwgMCwgMSwgMSwgMCwgMCwgMCwgMX0sCisjZGVmaW5lIFdJUEVfQjFfMjQzICAgICAyCisgIHtCT1hfQ0xPQ0ssIDEsIDEsIDAsIDAsIDEsIDAsIDEsIDAsIDF9LAorI2RlZmluZSBXSVBFX0IxXzI0NCAgICAgMworICB7Qk9YX0NMT0NLLCAxLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxfSwKK307CisKKyNkZWZpbmUgV0lQRV9CMl8yMjEgICAgIDAKK3N0YXRpYyBjb25zdCBnaW50IGJveF9jbG9ja18yYltdWzIgKiAxMF0gPSB7CisjZGVmaW5lIFdJUEVfQjJfMjIxICAgICAwCisgIHtCT1hfQ0xPQ0ssIDEsIDAsIDAsIDIsIDAsIDAsIDEsIDIsIDEsCisgICAgICBCT1hfQ0xPQ0ssIDEsIDAsIDAsIDEsIDIsIDEsIDAsIDAsIDJ9LAorI2RlZmluZSBXSVBFX0IyXzIyMiAgICAgMQorICB7Qk9YX0NMT0NLLCAyLCAxLCAwLCAyLCAyLCAwLCAwLCAxLCAxLAorICAgICAgQk9YX0NMT0NLLCAyLCAxLCAwLCAwLCAxLCAxLCAyLCAwLCAyfSwKKyNkZWZpbmUgV0lQRV9CMl8yMjMgICAgIDIKKyAge0JPWF9DTE9DSywgMSwgMiwgMCwgMCwgMiwgMCwgMSwgMCwgMSwKKyAgICAgIEJPWF9DTE9DSywgMSwgMiwgMCwgMSwgMCwgMSwgMiwgMiwgMn0sCisjZGVmaW5lIFdJUEVfQjJfMjI0ICAgICAzCisgIHtCT1hfQ0xPQ0ssIDAsIDEsIDAsIDAsIDAsIDAsIDIsIDEsIDEsCisgICAgICBCT1hfQ0xPQ0ssIDAsIDEsIDAsIDIsIDEsIDEsIDAsIDIsIDJ9LAorI2RlZmluZSBXSVBFX0IyXzIyNSAgICAgNAorICB7Qk9YX0NMT0NLLCAxLCAwLCAwLCAyLCAwLCAwLCAxLCAyLCAxLAorICAgICAgQk9YX0NMT0NLLCAxLCAyLCAwLCAwLCAyLCAwLCAxLCAwLCAxfSwKKyNkZWZpbmUgV0lQRV9CMl8yMjYgICAgIDUKKyAge0JPWF9DTE9DSywgMCwgMSwgMCwgMCwgMCwgMCwgMiwgMSwgMSwKKyAgICAgIEJPWF9DTE9DSywgMiwgMSwgMCwgMiwgMiwgMCwgMCwgMSwgMX0sCisjZGVmaW5lIFdJUEVfQjJfMjMxICAgICA2CisgIHtCT1hfQ0xPQ0ssIDEsIDAsIDAsIDEsIDIsIDAsIDIsIDAsIDEsCisgICAgICBCT1hfQ0xPQ0ssIDEsIDAsIDAsIDEsIDIsIDAsIDAsIDAsIDF9LAorI2RlZmluZSBXSVBFX0IyXzIzMiAgICAgNworICB7Qk9YX0NMT0NLLCAyLCAxLCAwLCAwLCAxLCAwLCAyLCAwLCAxLAorICAgICAgQk9YX0NMT0NLLCAyLCAxLCAwLCAwLCAxLCAwLCAyLCAyLCAxfSwKKyNkZWZpbmUgV0lQRV9CMl8yMzMgICAgIDgKKyAge0JPWF9DTE9DSywgMSwgMiwgMCwgMSwgMCwgMCwgMiwgMiwgMSwKKyAgICAgIEJPWF9DTE9DSywgMSwgMiwgMCwgMSwgMCwgMCwgMCwgMiwgMX0sCisjZGVmaW5lIFdJUEVfQjJfMjM0ICAgICA5CisgIHtCT1hfQ0xPQ0ssIDAsIDEsIDAsIDIsIDEsIDAsIDAsIDAsIDEsCisgICAgICBCT1hfQ0xPQ0ssIDAsIDEsIDAsIDIsIDEsIDAsIDAsIDIsIDF9LAorI2RlZmluZSBXSVBFX0IyXzI1MSAgICAgMTAKKyAge0JPWF9DTE9DSywgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMiwgMSwKKyAgICAgIEJPWF9DTE9DSywgMiwgMCwgMCwgMSwgMCwgMCwgMiwgMiwgMX0sCisjZGVmaW5lIFdJUEVfQjJfMjUyICAgICAxMQorICB7Qk9YX0NMT0NLLCAwLCAwLCAwLCAwLCAxLCAwLCAyLCAwLCAxLAorICAgICAgQk9YX0NMT0NLLCAwLCAyLCAwLCAwLCAxLCAwLCAyLCAyLCAxfSwKKyNkZWZpbmUgV0lQRV9CMl8yNTMgICAgIDEyCisgIHtCT1hfQ0xPQ0ssIDAsIDIsIDAsIDEsIDIsIDAsIDAsIDAsIDEsCisgICAgICBCT1hfQ0xPQ0ssIDIsIDIsIDAsIDEsIDIsIDAsIDIsIDAsIDF9LAorI2RlZmluZSBXSVBFX0IyXzI1NCAgICAgMTMKKyAge0JPWF9DTE9DSywgMiwgMCwgMCwgMiwgMSwgMCwgMCwgMCwgMSwKKyAgICAgIEJPWF9DTE9DSywgMiwgMiwgMCwgMiwgMSwgMCwgMCwgMiwgMX0sCit9OworCitzdGF0aWMgY29uc3QgZ2ludCBib3hfY2xvY2tfNGJbXVs0ICogMTBdID0geworI2RlZmluZSBXSVBFX0I0XzIwMSAgICAgMAorICB7Qk9YX0NMT0NLLCAxLCAxLCAwLCAxLCAwLCAwLCAyLCAxLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDIsIDEsIDEsIDEsIDIsIDIsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMSwgMiwgMiwgMCwgMSwgMywKKyAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMCwgMSwgMywgMSwgMCwgNH0sCisjZGVmaW5lIFdJUEVfQjRfMjAyICAgICAxCisgIHtCT1hfQ0xPQ0ssIDEsIDEsIDAsIDEsIDAsIDMsIDIsIDEsIDQsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMiwgMSwgMCwgMSwgMiwgMSwKKyAgICAgICAgQk9YX0NMT0NLLCAxLCAxLCAwLCAxLCAyLCAxLCAwLCAxLCAyLAorICAgICAgQk9YX0NMT0NLLCAxLCAxLCAwLCAwLCAxLCAyLCAxLCAwLCAzfSwKKyNkZWZpbmUgV0lQRV9CNF8yMDMgICAgIDIKKyAge0JPWF9DTE9DSywgMSwgMSwgMCwgMSwgMCwgMiwgMiwgMSwgMywKKyAgICAgICAgQk9YX0NMT0NLLCAxLCAxLCAwLCAyLCAxLCAzLCAxLCAyLCA0LAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDEsIDIsIDAsIDAsIDEsIDEsCisgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDAsIDEsIDEsIDEsIDAsIDJ9LAorI2RlZmluZSBXSVBFX0I0XzIwNCAgICAgMworICB7Qk9YX0NMT0NLLCAxLCAxLCAwLCAxLCAwLCAxLCAyLCAxLCAyLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDIsIDEsIDIsIDEsIDIsIDMsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMSwgMiwgMywgMCwgMSwgNCwKKyAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMCwgMSwgMCwgMSwgMCwgMX0sCisjZGVmaW5lIFdJUEVfQjRfMjA1ICAgICA0CisgIHtCT1hfQ0xPQ0ssIDEsIDEsIDAsIDEsIDAsIDAsIDIsIDEsIDEsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMiwgMSwgMSwgMSwgMiwgMiwKKyAgICAgICAgQk9YX0NMT0NLLCAxLCAxLCAwLCAxLCAyLCAwLCAwLCAxLCAxLAorICAgICAgQk9YX0NMT0NLLCAxLCAxLCAwLCAwLCAxLCAxLCAxLCAwLCAyfSwKKyNkZWZpbmUgV0lQRV9CNF8yMDYgICAgIDUKKyAge0JPWF9DTE9DSywgMSwgMSwgMCwgMSwgMCwgMSwgMiwgMSwgMiwKKyAgICAgICAgQk9YX0NMT0NLLCAxLCAxLCAwLCAyLCAxLCAwLCAxLCAyLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDEsIDIsIDEsIDAsIDEsIDIsCisgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDAsIDEsIDAsIDEsIDAsIDF9LAorI2RlZmluZSBXSVBFX0I0XzIwNyAgICAgNgorICB7Qk9YX0NMT0NLLCAxLCAxLCAwLCAxLCAwLCAwLCAyLCAxLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDIsIDEsIDAsIDEsIDIsIDEsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMSwgMiwgMCwgMCwgMSwgMSwKKyAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMCwgMSwgMCwgMSwgMCwgMX0sCisjZGVmaW5lIFdJUEVfQjRfMjExICAgICA3CisgIHtCT1hfQ0xPQ0ssIDEsIDEsIDAsIDEsIDAsIDAsIDIsIDEsIDEsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMiwgMSwgMSwgMSwgMiwgMiwKKyAgICAgICAgQk9YX0NMT0NLLCAxLCAxLCAwLCAxLCAwLCAwLCAwLCAxLCAxLAorICAgICAgQk9YX0NMT0NLLCAxLCAxLCAwLCAwLCAxLCAxLCAxLCAyLCAyfSwKKyNkZWZpbmUgV0lQRV9CNF8yMTIgICAgIDgKKyAge0JPWF9DTE9DSywgMSwgMSwgMCwgMiwgMSwgMCwgMSwgMCwgMSwKKyAgICAgICAgQk9YX0NMT0NLLCAxLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAyLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDIsIDEsIDAsIDEsIDIsIDEsCisgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDEsIDIsIDEsIDAsIDEsIDJ9LAorI2RlZmluZSBXSVBFX0I0XzIxMyAgICAgOQorICB7Qk9YX0NMT0NLLCAxLCAxLCAwLCAxLCAwLCAwLCAyLCAxLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDEsIDAsIDAsIDAsIDEsIDEsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMSwgMiwgMCwgMiwgMSwgMSwKKyAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMSwgMiwgMCwgMCwgMSwgMX0sCisjZGVmaW5lIFdJUEVfQjRfMjE0ICAgICAxMAorICB7Qk9YX0NMT0NLLCAxLCAxLCAwLCAyLCAxLCAwLCAxLCAwLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDIsIDEsIDAsIDEsIDIsIDEsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMCwgMSwgMCwgMSwgMCwgMSwKKyAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMCwgMSwgMCwgMSwgMiwgMX0sCisjZGVmaW5lIFdJUEVfQjRfMjI3ICAgICAxMQorICB7Qk9YX0NMT0NLLCAxLCAwLCAwLCAyLCAwLCAwLCAxLCAxLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDAsIDAsIDEsIDEsIDEsIDAsIDAsIDIsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMiwgMCwgMiwgMiwgMCwgMSwgMSwgMSwKKyAgICAgIEJPWF9DTE9DSywgMSwgMiwgMCwgMSwgMSwgMSwgMCwgMiwgMn0sCisjZGVmaW5lIFdJUEVfQjRfMjI4ICAgICAxMgorICB7Qk9YX0NMT0NLLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAxLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDAsIDEsIDAsIDEsIDEsIDEsIDAsIDIsIDIsCisgICAgICAgIEJPWF9DTE9DSywgMiwgMSwgMCwgMiwgMCwgMCwgMSwgMSwgMSwKKyAgICAgIEJPWF9DTE9DSywgMiwgMSwgMCwgMSwgMSwgMSwgMiwgMiwgMn0sCisjZGVmaW5lIFdJUEVfQjRfMjM1ICAgICAxMworICB7Qk9YX0NMT0NLLCAxLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDAsIDAsIDEsIDEsIDAsIDIsIDAsIDEsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMiwgMCwgMSwgMSwgMCwgMiwgMiwgMSwKKyAgICAgIEJPWF9DTE9DSywgMSwgMiwgMCwgMSwgMSwgMCwgMCwgMiwgMX0sCisjZGVmaW5lIFdJUEVfQjRfMjM2ICAgICAxNAorICB7Qk9YX0NMT0NLLCAwLCAxLCAwLCAxLCAxLCAwLCAwLCAwLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDAsIDEsIDAsIDEsIDEsIDAsIDAsIDIsIDEsCisgICAgICAgIEJPWF9DTE9DSywgMiwgMSwgMCwgMSwgMSwgMCwgMiwgMCwgMSwKKyAgICAgIEJPWF9DTE9DSywgMiwgMSwgMCwgMSwgMSwgMCwgMiwgMiwgMX0sCit9OworCitzdGF0aWMgY29uc3QgZ2ludCBib3hfY2xvY2tfOGJbXVs4ICogMTBdID0geworI2RlZmluZSBXSVBFX0I4XzI2MSAgICAgMAorICB7Qk9YX0NMT0NLLCAyLCAxLCAwLCAyLCAyLCAwLCA0LCAxLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDIsIDEsIDAsIDQsIDEsIDEsIDIsIDAsIDIsCisgICAgICAgIEJPWF9DTE9DSywgMiwgMSwgMCwgMiwgMCwgMiwgMCwgMSwgMywKKyAgICAgICAgQk9YX0NMT0NLLCAyLCAxLCAwLCAwLCAxLCAzLCAyLCAyLCA0LAorICAgICAgICBCT1hfQ0xPQ0ssIDIsIDMsIDAsIDIsIDIsIDAsIDQsIDMsIDEsCisgICAgICAgIEJPWF9DTE9DSywgMiwgMywgMCwgNCwgMywgMSwgMiwgNCwgMiwKKyAgICAgICAgQk9YX0NMT0NLLCAyLCAzLCAwLCAyLCA0LCAyLCAwLCAzLCAzLAorICAgICAgQk9YX0NMT0NLLCAyLCAzLCAwLCAwLCAzLCAzLCAyLCAyLCA0fSwKKyNkZWZpbmUgV0lQRV9COF8yNjIgICAgIDEKKyAge0JPWF9DTE9DSywgMSwgMiwgMCwgMiwgMiwgMCwgMSwgMCwgMSwKKyAgICAgICAgQk9YX0NMT0NLLCAxLCAyLCAwLCAxLCAwLCAxLCAwLCAyLCAyLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDIsIDAsIDAsIDIsIDIsIDEsIDQsIDMsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMiwgMCwgMSwgNCwgMywgMiwgMiwgNCwKKyAgICAgICAgQk9YX0NMT0NLLCAzLCAyLCAwLCAyLCAyLCAwLCAzLCAwLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDMsIDIsIDAsIDMsIDAsIDEsIDQsIDIsIDIsCisgICAgICAgIEJPWF9DTE9DSywgMywgMiwgMCwgNCwgMiwgMiwgMywgNCwgMywKKyAgICAgIEJPWF9DTE9DSywgMywgMiwgMCwgMywgNCwgMywgMiwgMiwgNH0sCisjZGVmaW5lIFdJUEVfQjhfMjYzICAgICAyCisgIHtCT1hfQ0xPQ0ssIDIsIDEsIDAsIDIsIDAsIDAsIDQsIDEsIDEsCisgICAgICAgIEJPWF9DTE9DSywgMiwgMSwgMCwgNCwgMSwgMSwgMiwgMiwgMiwKKyAgICAgICAgQk9YX0NMT0NLLCAyLCAxLCAwLCAyLCAwLCAwLCAwLCAxLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDIsIDEsIDAsIDAsIDEsIDEsIDIsIDIsIDIsCisgICAgICAgIEJPWF9DTE9DSywgMiwgMywgMCwgMiwgNCwgMCwgNCwgMywgMSwKKyAgICAgICAgQk9YX0NMT0NLLCAyLCAzLCAwLCA0LCAzLCAxLCAyLCAyLCAyLAorICAgICAgICBCT1hfQ0xPQ0ssIDIsIDMsIDAsIDIsIDQsIDAsIDAsIDMsIDEsCisgICAgICBCT1hfQ0xPQ0ssIDIsIDMsIDAsIDAsIDMsIDEsIDIsIDIsIDJ9LAorI2RlZmluZSBXSVBFX0I4XzI2NCAgICAgMworICB7Qk9YX0NMT0NLLCAxLCAyLCAwLCAwLCAyLCAwLCAxLCAwLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDIsIDAsIDEsIDAsIDEsIDIsIDIsIDIsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMiwgMCwgMCwgMiwgMCwgMSwgNCwgMSwKKyAgICAgICAgQk9YX0NMT0NLLCAxLCAyLCAwLCAxLCA0LCAxLCAyLCAyLCAyLAorICAgICAgICBCT1hfQ0xPQ0ssIDMsIDIsIDAsIDQsIDIsIDAsIDMsIDAsIDEsCisgICAgICAgIEJPWF9DTE9DSywgMywgMiwgMCwgMywgMCwgMSwgMiwgMiwgMiwKKyAgICAgICAgQk9YX0NMT0NLLCAzLCAyLCAwLCA0LCAyLCAwLCAzLCA0LCAxLAorICAgICAgQk9YX0NMT0NLLCAzLCAyLCAwLCAzLCA0LCAxLCAyLCAyLCAyfSwKK307CisKK3N0YXRpYyBjb25zdCBnaW50IHRyaWFuZ2xlc18ydFtdWzIgKiA5XSA9IHsKKyAgLyogMyAtPiA2ICovCisjZGVmaW5lIFdJUEVfVDJfMyAgICAgICAwCisgIHswLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLAorICAgICAgMSwgMCwgMSwgMCwgMCwgMCwgMSwgMSwgMX0sCisjZGVmaW5lIFdJUEVfVDJfNCAgICAgICBXSVBFX1QyXzMrMQorICB7MCwgMCwgMSwgMSwgMCwgMCwgMCwgMSwgMSwKKyAgICAgIDEsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDF9LAorI2RlZmluZSBXSVBFX1QyXzUgICAgICAgV0lQRV9UMl80KzEKKyAgezAsIDAsIDEsIDAsIDEsIDEsIDEsIDEsIDAsCisgICAgICAxLCAwLCAxLCAwLCAwLCAxLCAxLCAxLCAwfSwKKyNkZWZpbmUgV0lQRV9UMl82ICAgICAgIFdJUEVfVDJfNSsxCisgIHswLCAwLCAxLCAxLCAwLCAxLCAwLCAxLCAwLAorICAgICAgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMSwgMX0sCisjZGVmaW5lIFdJUEVfVDJfNDEgICAgICBXSVBFX1QyXzYrMQorICB7MCwgMCwgMCwgMSwgMCwgMSwgMCwgMSwgMSwKKyAgICAgIDEsIDAsIDEsIDAsIDEsIDEsIDEsIDEsIDJ9LAorI2RlZmluZSBXSVBFX1QyXzQyICAgICAgV0lQRV9UMl80MSsxCisgIHswLCAwLCAxLCAxLCAwLCAwLCAxLCAxLCAxLAorICAgICAgMCwgMCwgMSwgMCwgMSwgMiwgMSwgMSwgMX0sCisjZGVmaW5lIFdJUEVfVDJfNDUgICAgICBXSVBFX1QyXzQyKzEKKyAgezAsIDAsIDEsIDEsIDAsIDAsIDAsIDEsIDAsCisgICAgICAxLCAwLCAwLCAwLCAxLCAwLCAxLCAxLCAxfSwKKyNkZWZpbmUgV0lQRV9UMl80NiAgICAgIFdJUEVfVDJfNDUrMQorICB7MCwgMCwgMCwgMSwgMCwgMSwgMSwgMSwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDB9LAorI2RlZmluZSBXSVBFX1QyXzI0NSAgICAgV0lQRV9UMl80NisxCisgIHswLCAwLCAwLCAyLCAwLCAwLCAyLCAyLCAxLAorICAgICAgMiwgMiwgMCwgMCwgMiwgMCwgMCwgMCwgMX0sCisjZGVmaW5lIFdJUEVfVDJfMjQ2ICAgICBXSVBFX1QyXzI0NSsxCisgIHswLCAyLCAwLCAwLCAwLCAwLCAyLCAwLCAxLAorICAgICAgMiwgMCwgMCwgMiwgMiwgMCwgMCwgMiwgMX0sCit9OworCitzdGF0aWMgY29uc3QgZ2ludCB0cmlhbmdsZXNfM3RbXVszICogOV0gPSB7CisgIC8qIDIzIC0+IDI2ICovCisjZGVmaW5lIFdJUEVfVDNfMjMgICAgICAwCisgIHswLCAwLCAxLCAxLCAwLCAwLCAwLCAyLCAxLAorICAgICAgICAxLCAwLCAwLCAwLCAyLCAxLCAyLCAyLCAxLAorICAgICAgMSwgMCwgMCwgMiwgMCwgMSwgMiwgMiwgMX0sCisjZGVmaW5lIFdJUEVfVDNfMjQgICAgICAxCisgIHswLCAwLCAxLCAyLCAwLCAxLCAyLCAxLCAwLAorICAgICAgICAwLCAwLCAxLCAyLCAxLCAwLCAwLCAyLCAxLAorICAgICAgMiwgMSwgMCwgMCwgMiwgMSwgMiwgMiwgMX0sCisjZGVmaW5lIFdJUEVfVDNfMjUgICAgICAyCisgIHswLCAwLCAxLCAwLCAyLCAxLCAxLCAyLCAwLAorICAgICAgICAwLCAwLCAxLCAyLCAwLCAxLCAxLCAyLCAwLAorICAgICAgMiwgMCwgMSwgMSwgMiwgMCwgMiwgMiwgMX0sCisjZGVmaW5lIFdJUEVfVDNfMjYgICAgICAzCisgIHswLCAwLCAxLCAyLCAwLCAxLCAwLCAxLCAwLAorICAgICAgICAyLCAwLCAxLCAwLCAxLCAwLCAyLCAyLCAxLAorICAgICAgMCwgMSwgMCwgMCwgMiwgMSwgMiwgMiwgMX0sCit9OworCitzdGF0aWMgY29uc3QgZ2ludCB0cmlhbmdsZXNfNHRbXVs0ICogOV0gPSB7CisjZGVmaW5lIFdJUEVfVDRfNjEgICAgICAwCisgIHswLCAwLCAxLCAxLCAwLCAwLCAxLCAyLCAxLAorICAgICAgICAwLCAwLCAxLCAwLCAyLCAyLCAxLCAyLCAxLAorICAgICAgICAxLCAwLCAwLCAyLCAwLCAxLCAxLCAyLCAxLAorICAgICAgMiwgMCwgMSwgMSwgMiwgMSwgMiwgMiwgMn0sCisjZGVmaW5lIFdJUEVfVDRfNjIgICAgICAxCisgIHswLCAwLCAyLCAyLCAwLCAxLCAwLCAxLCAxLAorICAgICAgICAyLCAwLCAxLCAwLCAxLCAxLCAyLCAxLCAwLAorICAgICAgICAwLCAxLCAxLCAyLCAxLCAwLCAyLCAyLCAxLAorICAgICAgMCwgMSwgMSwgMCwgMiwgMiwgMiwgMiwgMX0sCisjZGVmaW5lIFdJUEVfVDRfNjMgICAgICAyCisgIHswLCAwLCAyLCAxLCAwLCAxLCAwLCAyLCAxLAorICAgICAgICAxLCAwLCAxLCAwLCAyLCAxLCAxLCAyLCAwLAorICAgICAgICAxLCAwLCAxLCAxLCAyLCAwLCAyLCAyLCAxLAorICAgICAgMSwgMCwgMSwgMiwgMCwgMiwgMiwgMiwgMX0sCisjZGVmaW5lIFdJUEVfVDRfNjQgICAgICAzCisgIHswLCAwLCAxLCAyLCAwLCAyLCAyLCAxLCAxLAorICAgICAgICAwLCAwLCAxLCAwLCAxLCAwLCAyLCAxLCAxLAorICAgICAgICAwLCAxLCAwLCAyLCAxLCAxLCAwLCAyLCAxLAorICAgICAgMiwgMSwgMSwgMCwgMiwgMSwgMiwgMiwgMn0sCisjZGVmaW5lIFdJUEVfVDRfNjUgICAgICA0CisgIHswLCAwLCAwLCAxLCAwLCAxLCAxLCAyLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAyLCAxLCAxLCAyLCAwLAorICAgICAgICAxLCAwLCAxLCAyLCAwLCAwLCAxLCAyLCAwLAorICAgICAgMiwgMCwgMCwgMSwgMiwgMCwgMiwgMiwgMX0sCisjZGVmaW5lIFdJUEVfVDRfNjYgICAgICA1CisgIHswLCAwLCAxLCAyLCAwLCAwLCAwLCAxLCAwLAorICAgICAgICAyLCAwLCAwLCAwLCAxLCAwLCAyLCAxLCAxLAorICAgICAgICAwLCAxLCAwLCAyLCAxLCAxLCAyLCAyLCAwLAorICAgICAgMCwgMSwgMCwgMCwgMiwgMSwgMiwgMiwgMH0sCisjZGVmaW5lIFdJUEVfVDRfNjcgICAgICA2CisgIHswLCAwLCAxLCAxLCAwLCAwLCAwLCAyLCAwLAorICAgICAgICAxLCAwLCAwLCAwLCAyLCAwLCAxLCAyLCAxLAorICAgICAgICAxLCAwLCAwLCAxLCAyLCAxLCAyLCAyLCAwLAorICAgICAgMSwgMCwgMCwgMiwgMCwgMSwgMiwgMiwgMH0sCisjZGVmaW5lIFdJUEVfVDRfNjggICAgICA3CisgIHswLCAwLCAwLCAyLCAwLCAxLCAyLCAxLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAxLCAxLCAyLCAxLCAwLAorICAgICAgICAwLCAxLCAxLCAyLCAxLCAwLCAwLCAyLCAwLAorICAgICAgMiwgMSwgMCwgMCwgMiwgMCwgMiwgMiwgMX0sCisjZGVmaW5lIFdJUEVfVDRfMTAxICAgICA4CisgIHswLCAwLCAxLCAyLCAwLCAxLCAxLCAxLCAwLAorICAgICAgICAwLCAwLCAxLCAxLCAxLCAwLCAwLCAyLCAxLAorICAgICAgICAxLCAxLCAwLCAwLCAyLCAxLCAyLCAyLCAxLAorICAgICAgMiwgMCwgMSwgMSwgMSwgMCwgMiwgMiwgMX0sCit9OworCitzdGF0aWMgY29uc3QgZ2ludCB0cmlhbmdsZXNfOHRbXVs4ICogOV0gPSB7CisgIC8qIDcgKi8KKyNkZWZpbmUgV0lQRV9UOF83ICAgICAgIDAKKyAgezAsIDAsIDAsIDEsIDAsIDEsIDEsIDEsIDEsCisgICAgICAgIDEsIDAsIDEsIDIsIDAsIDAsIDEsIDEsIDEsCisgICAgICAgIDIsIDAsIDAsIDEsIDEsIDEsIDIsIDEsIDEsCisgICAgICAgIDEsIDEsIDEsIDIsIDEsIDEsIDIsIDIsIDAsCisgICAgICAgIDEsIDEsIDEsIDEsIDIsIDEsIDIsIDIsIDAsCisgICAgICAgIDEsIDEsIDEsIDAsIDIsIDAsIDEsIDIsIDEsCisgICAgICAgIDAsIDEsIDEsIDEsIDEsIDEsIDAsIDIsIDAsCisgICAgICAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxfSwKKyNkZWZpbmUgV0lQRV9UOF80MyAgICAgIDEKKyAgezAsIDAsIDEsIDEsIDAsIDAsIDEsIDEsIDEsCisgICAgICAgIDEsIDAsIDAsIDIsIDAsIDEsIDEsIDEsIDEsCisgICAgICAgIDIsIDAsIDEsIDEsIDEsIDEsIDIsIDEsIDIsCisgICAgICAgIDEsIDEsIDEsIDIsIDEsIDIsIDIsIDIsIDEsCisgICAgICAgIDEsIDEsIDEsIDEsIDIsIDAsIDIsIDIsIDEsCisgICAgICAgIDEsIDEsIDEsIDAsIDIsIDEsIDEsIDIsIDAsCisgICAgICAgIDAsIDEsIDIsIDEsIDEsIDEsIDAsIDIsIDEsCisgICAgICAwLCAwLCAxLCAwLCAxLCAyLCAxLCAxLCAxfSwKKyNkZWZpbmUgV0lQRV9UOF80NCAgICAgIDIKKyAgezAsIDAsIDEsIDEsIDAsIDIsIDEsIDEsIDEsCisgICAgICAgIDEsIDAsIDIsIDIsIDAsIDEsIDEsIDEsIDEsCisgICAgICAgIDIsIDAsIDEsIDEsIDEsIDEsIDIsIDEsIDAsCisgICAgICAgIDEsIDEsIDEsIDIsIDEsIDAsIDIsIDIsIDEsCisgICAgICAgIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDEsCisgICAgICAgIDEsIDEsIDEsIDAsIDIsIDEsIDEsIDIsIDIsCisgICAgICAgIDAsIDEsIDAsIDEsIDEsIDEsIDAsIDIsIDEsCisgICAgICAwLCAwLCAxLCAwLCAxLCAwLCAxLCAxLCAxfSwKKyNkZWZpbmUgV0lQRV9UOF80NyAgICAgIDMKKyAgezAsIDAsIDAsIDEsIDAsIDEsIDEsIDEsIDAsCisgICAgICAgIDEsIDAsIDEsIDIsIDAsIDAsIDEsIDEsIDAsCisgICAgICAgIDIsIDAsIDAsIDEsIDEsIDAsIDIsIDEsIDEsCisgICAgICAgIDEsIDEsIDAsIDIsIDEsIDEsIDIsIDIsIDAsCisgICAgICAgIDEsIDEsIDAsIDEsIDIsIDEsIDIsIDIsIDAsCisgICAgICAgIDEsIDEsIDAsIDAsIDIsIDAsIDEsIDIsIDEsCisgICAgICAgIDAsIDEsIDEsIDEsIDEsIDAsIDAsIDIsIDAsCisgICAgICAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAwfSwKKyNkZWZpbmUgV0lQRV9UOF80OCAgICAgIDQKKyAgezAsIDAsIDEsIDEsIDAsIDAsIDAsIDEsIDAsCisgICAgICAgIDEsIDAsIDAsIDAsIDEsIDAsIDEsIDEsIDEsCisgICAgICAgIDEsIDAsIDAsIDIsIDAsIDEsIDIsIDEsIDAsCisgICAgICAgIDEsIDAsIDAsIDEsIDEsIDEsIDIsIDEsIDAsCisgICAgICAgIDAsIDEsIDAsIDEsIDEsIDEsIDEsIDIsIDAsCisgICAgICAgIDAsIDEsIDAsIDAsIDIsIDEsIDEsIDIsIDAsCisgICAgICAgIDEsIDEsIDEsIDIsIDEsIDAsIDEsIDIsIDAsCisgICAgICAyLCAxLCAwLCAxLCAyLCAwLCAyLCAyLCAxfSwKK307CisKK3N0YXRpYyBjb25zdCBnaW50IHRyaWFuZ2xlc18xNnRbXVsxNiAqIDldID0geworICAvKiA4ICovCisjZGVmaW5lIFdJUEVfVDE2XzggICAgICAwCisgIHswLCAwLCAxLCAyLCAwLCAxLCAxLCAxLCAwLAorICAgICAgICAyLCAwLCAxLCAxLCAxLCAwLCAyLCAyLCAxLAorICAgICAgICAxLCAxLCAwLCAwLCAyLCAxLCAyLCAyLCAxLAorICAgICAgICAwLCAwLCAxLCAxLCAxLCAwLCAwLCAyLCAxLAorICAgICAgICAyLCAwLCAxLCA0LCAwLCAxLCAzLCAxLCAwLAorICAgICAgICA0LCAwLCAxLCAzLCAxLCAwLCA0LCAyLCAxLAorICAgICAgICAzLCAxLCAwLCAyLCAyLCAxLCA0LCAyLCAxLAorICAgICAgICAyLCAwLCAxLCAzLCAxLCAwLCAyLCAyLCAxLAorICAgICAgICAwLCAyLCAxLCAyLCAyLCAxLCAxLCAzLCAwLAorICAgICAgICAyLCAyLCAxLCAxLCAzLCAwLCAyLCA0LCAxLAorICAgICAgICAxLCAzLCAwLCAwLCA0LCAxLCAyLCA0LCAxLAorICAgICAgICAwLCAyLCAxLCAxLCAzLCAwLCAwLCA0LCAxLAorICAgICAgICAyLCAyLCAxLCA0LCAyLCAxLCAzLCAzLCAwLAorICAgICAgICA0LCAyLCAxLCAzLCAzLCAwLCA0LCA0LCAxLAorICAgICAgICAzLCAzLCAwLCAyLCA0LCAxLCA0LCA0LCAxLAorICAgICAgMiwgMiwgMSwgMywgMywgMCwgMiwgNCwgMX0KK307CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RXaXBlQ29uZmlnIEdzdFdpcGVDb25maWc7CisKK3N0cnVjdCBfR3N0V2lwZUNvbmZpZworeworICBjb25zdCBnaW50ICpvYmplY3RzOworICBnaW50IG5vYmplY3RzOworICBnaW50IHhzY2FsZTsKKyAgZ2ludCB5c2NhbGU7CisgIGdpbnQgY3NjYWxlOworfTsKKworc3RhdGljIGNvbnN0IEdzdFdpcGVDb25maWcgd2lwZV9jb25maWdbXSA9IHsKKyNkZWZpbmUgV0lQRV9DT05GSUdfMSAgIDAKKyAge2JveGVzXzFiW1dJUEVfQjFfMV0sIDEsIDAsIDAsIDB9LCAgICAvKiAxICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzIgICBXSVBFX0NPTkZJR18xKzEKKyAge2JveGVzXzFiW1dJUEVfQjFfMl0sIDEsIDAsIDAsIDB9LCAgICAvKiAyICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzMgICBXSVBFX0NPTkZJR18yKzEKKyAge3RyaWFuZ2xlc18ydFtXSVBFX1QyXzNdLCAyLCAwLCAwLCAwfSwgICAgICAgIC8qIDMgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfNCAgIFdJUEVfQ09ORklHXzMrMQorICB7dHJpYW5nbGVzXzJ0W1dJUEVfVDJfNF0sIDIsIDAsIDAsIDB9LCAgICAgICAgLyogNCAqLworI2RlZmluZSBXSVBFX0NPTkZJR181ICAgV0lQRV9DT05GSUdfNCsxCisgIHt0cmlhbmdsZXNfMnRbV0lQRV9UMl81XSwgMiwgMCwgMCwgMH0sICAgICAgICAvKiA1ICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzYgICBXSVBFX0NPTkZJR181KzEKKyAge3RyaWFuZ2xlc18ydFtXSVBFX1QyXzZdLCAyLCAwLCAwLCAwfSwgICAgICAgIC8qIDYgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfNyAgIFdJUEVfQ09ORklHXzYrMQorICB7dHJpYW5nbGVzXzh0W1dJUEVfVDhfN10sIDgsIDEsIDEsIDB9LCAgICAgICAgLyogNyAqLworI2RlZmluZSBXSVBFX0NPTkZJR184ICAgV0lQRV9DT05GSUdfNysxCisgIHt0cmlhbmdsZXNfMTZ0W1dJUEVfVDE2XzhdLCAxNiwgMiwgMiwgMH0sICAgICAvKiA4ICovCisKKyNkZWZpbmUgV0lQRV9DT05GSUdfMjEgIFdJUEVfQ09ORklHXzgrMQorICB7Ym94ZXNfMmJbV0lQRV9CMl8yMV0sIDIsIDEsIDEsIDB9LCAgIC8qIDIxICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzIyICBXSVBFX0NPTkZJR18yMSsxCisgIHtib3hlc18yYltXSVBFX0IyXzIyXSwgMiwgMSwgMSwgMH0sICAgLyogMjIgKi8KKworI2RlZmluZSBXSVBFX0NPTkZJR18yMyAgV0lQRV9DT05GSUdfMjIrMQorICB7dHJpYW5nbGVzXzN0W1dJUEVfVDNfMjNdLCAzLCAxLCAxLCAwfSwgICAgICAgLyogMjMgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjQgIFdJUEVfQ09ORklHXzIzKzEKKyAge3RyaWFuZ2xlc18zdFtXSVBFX1QzXzI0XSwgMywgMSwgMSwgMH0sICAgICAgIC8qIDI0ICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzI1ICBXSVBFX0NPTkZJR18yNCsxCisgIHt0cmlhbmdsZXNfM3RbV0lQRV9UM18yNV0sIDMsIDEsIDEsIDB9LCAgICAgICAvKiAyNSAqLworI2RlZmluZSBXSVBFX0NPTkZJR18yNiAgV0lQRV9DT05GSUdfMjUrMQorICB7dHJpYW5nbGVzXzN0W1dJUEVfVDNfMjZdLCAzLCAxLCAxLCAwfSwgICAgICAgLyogMjYgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfNDEgIFdJUEVfQ09ORklHXzI2KzEKKyAge3RyaWFuZ2xlc18ydFtXSVBFX1QyXzQxXSwgMiwgMCwgMCwgMX0sICAgICAgIC8qIDQxICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzQyICBXSVBFX0NPTkZJR180MSsxCisgIHt0cmlhbmdsZXNfMnRbV0lQRV9UMl80Ml0sIDIsIDAsIDAsIDF9LCAgICAgICAvKiA0MiAqLworI2RlZmluZSBXSVBFX0NPTkZJR180MyAgV0lQRV9DT05GSUdfNDIrMQorICB7dHJpYW5nbGVzXzh0W1dJUEVfVDhfNDNdLCA4LCAxLCAxLCAxfSwgICAgICAgLyogNDMgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfNDQgIFdJUEVfQ09ORklHXzQzKzEKKyAge3RyaWFuZ2xlc184dFtXSVBFX1Q4XzQ0XSwgOCwgMSwgMSwgMX0sICAgICAgIC8qIDQ0ICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzQ1ICBXSVBFX0NPTkZJR180NCsxCisgIHt0cmlhbmdsZXNfMnRbV0lQRV9UMl80NV0sIDIsIDAsIDAsIDB9LCAgICAgICAvKiA0NSAqLworI2RlZmluZSBXSVBFX0NPTkZJR180NiAgV0lQRV9DT05GSUdfNDUrMQorICB7dHJpYW5nbGVzXzJ0W1dJUEVfVDJfNDZdLCAyLCAwLCAwLCAwfSwgICAgICAgLyogNDYgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfNDcgIFdJUEVfQ09ORklHXzQ2KzEKKyAge3RyaWFuZ2xlc184dFtXSVBFX1Q4XzQ3XSwgOCwgMSwgMSwgMH0sICAgICAgIC8qIDQ3ICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzQ4ICBXSVBFX0NPTkZJR180NysxCisgIHt0cmlhbmdsZXNfOHRbV0lQRV9UOF80OF0sIDgsIDEsIDEsIDB9LCAgICAgICAvKiA0OCAqLworI2RlZmluZSBXSVBFX0NPTkZJR182MSAgV0lQRV9DT05GSUdfNDgrMQorICB7dHJpYW5nbGVzXzR0W1dJUEVfVDRfNjFdLCA0LCAxLCAxLCAxfSwgICAgICAgLyogNjEgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfNjIgIFdJUEVfQ09ORklHXzYxKzEKKyAge3RyaWFuZ2xlc180dFtXSVBFX1Q0XzYyXSwgNCwgMSwgMSwgMX0sICAgICAgIC8qIDYyICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzYzICBXSVBFX0NPTkZJR182MisxCisgIHt0cmlhbmdsZXNfNHRbV0lQRV9UNF82M10sIDQsIDEsIDEsIDF9LCAgICAgICAvKiA2MyAqLworI2RlZmluZSBXSVBFX0NPTkZJR182NCAgV0lQRV9DT05GSUdfNjMrMQorICB7dHJpYW5nbGVzXzR0W1dJUEVfVDRfNjRdLCA0LCAxLCAxLCAxfSwgICAgICAgLyogNjQgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfNjUgIFdJUEVfQ09ORklHXzY0KzEKKyAge3RyaWFuZ2xlc180dFtXSVBFX1Q0XzY1XSwgNCwgMSwgMSwgMH0sICAgICAgIC8qIDY1ICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzY2ICBXSVBFX0NPTkZJR182NSsxCisgIHt0cmlhbmdsZXNfNHRbV0lQRV9UNF82Nl0sIDQsIDEsIDEsIDB9LCAgICAgICAvKiA2NiAqLworI2RlZmluZSBXSVBFX0NPTkZJR182NyAgV0lQRV9DT05GSUdfNjYrMQorICB7dHJpYW5nbGVzXzR0W1dJUEVfVDRfNjddLCA0LCAxLCAxLCAwfSwgICAgICAgLyogNjcgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfNjggIFdJUEVfQ09ORklHXzY3KzEKKyAge3RyaWFuZ2xlc180dFtXSVBFX1Q0XzY4XSwgNCwgMSwgMSwgMH0sICAgICAgIC8qIDY4ICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzEwMSBXSVBFX0NPTkZJR182OCsxCisgIHt0cmlhbmdsZXNfNHRbV0lQRV9UNF8xMDFdLCA0LCAxLCAxLCAwfSwgICAgICAvKiAxMDEgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjAxIFdJUEVfQ09ORklHXzEwMSsxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMDFdLCA0LCAxLCAxLCAyfSwgICAgICAvKiAyMDEgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjAyIFdJUEVfQ09ORklHXzIwMSsxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMDJdLCA0LCAxLCAxLCAyfSwgICAgICAvKiAyMDIgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjAzIFdJUEVfQ09ORklHXzIwMisxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMDNdLCA0LCAxLCAxLCAyfSwgICAgICAvKiAyMDMgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjA0IFdJUEVfQ09ORklHXzIwMysxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMDRdLCA0LCAxLCAxLCAyfSwgICAgICAvKiAyMDQgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjA1IFdJUEVfQ09ORklHXzIwNCsxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMDVdLCA0LCAxLCAxLCAxfSwgICAgICAvKiAyMDUgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjA2IFdJUEVfQ09ORklHXzIwNSsxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMDZdLCA0LCAxLCAxLCAxfSwgICAgICAvKiAyMDYgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjA3IFdJUEVfQ09ORklHXzIwNisxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMDddLCA0LCAxLCAxLCAwfSwgICAgICAvKiAyMDcgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjExIFdJUEVfQ09ORklHXzIwNysxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMTFdLCA0LCAxLCAxLCAxfSwgICAgICAvKiAyMTEgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjEyIFdJUEVfQ09ORklHXzIxMSsxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMTJdLCA0LCAxLCAxLCAxfSwgICAgICAvKiAyMTIgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjEzIFdJUEVfQ09ORklHXzIxMisxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMTNdLCA0LCAxLCAxLCAwfSwgICAgICAvKiAyMTMgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjE0IFdJUEVfQ09ORklHXzIxMysxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMTRdLCA0LCAxLCAxLCAwfSwgICAgICAvKiAyMTQgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjIxIFdJUEVfQ09ORklHXzIxNCsxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yMjFdLCAyLCAxLCAxLCAxfSwgICAgICAvKiAyMjEgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjIyIFdJUEVfQ09ORklHXzIyMSsxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yMjJdLCAyLCAxLCAxLCAxfSwgICAgICAvKiAyMjIgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjIzIFdJUEVfQ09ORklHXzIyMisxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yMjNdLCAyLCAxLCAxLCAxfSwgICAgICAvKiAyMjMgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjI0IFdJUEVfQ09ORklHXzIyMysxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yMjRdLCAyLCAxLCAxLCAxfSwgICAgICAvKiAyMjQgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjI1IFdJUEVfQ09ORklHXzIyNCsxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yMjVdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyMjUgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjI2IFdJUEVfQ09ORklHXzIyNSsxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yMjZdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyMjYgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjI3IFdJUEVfQ09ORklHXzIyNisxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMjddLCA0LCAxLCAxLCAxfSwgICAgICAvKiAyMjcgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjI4IFdJUEVfQ09ORklHXzIyNysxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMjhdLCA0LCAxLCAxLCAxfSwgICAgICAvKiAyMjggKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjMxIFdJUEVfQ09ORklHXzIyOCsxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yMzFdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyMzEgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjMyIFdJUEVfQ09ORklHXzIzMSsxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yMzJdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyMzIgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjMzIFdJUEVfQ09ORklHXzIzMisxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yMzNdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyMzMgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjM0IFdJUEVfQ09ORklHXzIzMysxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yMzRdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyMzQgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjM1IFdJUEVfQ09ORklHXzIzNCsxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMzVdLCA0LCAxLCAxLCAwfSwgICAgICAvKiAyMzUgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjM2IFdJUEVfQ09ORklHXzIzNSsxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMzZdLCA0LCAxLCAxLCAwfSwgICAgICAvKiAyMzYgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjQxIFdJUEVfQ09ORklHXzIzNisxCisgIHtib3hfY2xvY2tfMWJbV0lQRV9CMV8yNDFdLCAxLCAwLCAwLCAwfSwgICAgICAvKiAyNDEgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjQyIFdJUEVfQ09ORklHXzI0MSsxCisgIHtib3hfY2xvY2tfMWJbV0lQRV9CMV8yNDJdLCAxLCAwLCAwLCAwfSwgICAgICAvKiAyNDIgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjQzIFdJUEVfQ09ORklHXzI0MisxCisgIHtib3hfY2xvY2tfMWJbV0lQRV9CMV8yNDNdLCAxLCAwLCAwLCAwfSwgICAgICAvKiAyNDMgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjQ0IFdJUEVfQ09ORklHXzI0MysxCisgIHtib3hfY2xvY2tfMWJbV0lQRV9CMV8yNDRdLCAxLCAwLCAwLCAwfSwgICAgICAvKiAyNDQgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjQ1IFdJUEVfQ09ORklHXzI0NCsxCisgIHt0cmlhbmdsZXNfMnRbV0lQRV9UMl8yNDVdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyNDUgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjQ2IFdJUEVfQ09ORklHXzI0NSsxCisgIHt0cmlhbmdsZXNfMnRbV0lQRV9UMl8yNDZdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyNDYgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjUxIFdJUEVfQ09ORklHXzI0NisxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yNTFdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyNTEgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjUyIFdJUEVfQ09ORklHXzI1MSsxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yNTJdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyNTIgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjUzIFdJUEVfQ09ORklHXzI1MisxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yNTNdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyNTMgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjU0IFdJUEVfQ09ORklHXzI1MysxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yNTRdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyNTQgKi8KKworI2RlZmluZSBXSVBFX0NPTkZJR18yNjEgV0lQRV9DT05GSUdfMjU0KzEKKyAge2JveF9jbG9ja184YltXSVBFX0I4XzI2MV0sIDgsIDIsIDIsIDJ9LCAgICAgIC8qIDI2MSAqLworI2RlZmluZSBXSVBFX0NPTkZJR18yNjIgV0lQRV9DT05GSUdfMjYxKzEKKyAge2JveF9jbG9ja184YltXSVBFX0I4XzI2Ml0sIDgsIDIsIDIsIDJ9LCAgICAgIC8qIDI2MiAqLworI2RlZmluZSBXSVBFX0NPTkZJR18yNjMgV0lQRV9DT05GSUdfMjYyKzEKKyAge2JveF9jbG9ja184YltXSVBFX0I4XzI2M10sIDgsIDIsIDIsIDF9LCAgICAgIC8qIDI2MyAqLworI2RlZmluZSBXSVBFX0NPTkZJR18yNjQgV0lQRV9DT05GSUdfMjYzKzEKKyAge2JveF9jbG9ja184YltXSVBFX0I4XzI2NF0sIDgsIDIsIDIsIDF9LCAgICAgIC8qIDI2NCAqLworfTsKKworc3RhdGljIHZvaWQKK2dzdF93aXBlX2JveGVzX2RyYXcgKEdzdE1hc2sgKiBtYXNrKQoreworICBjb25zdCBHc3RXaXBlQ29uZmlnICpjb25maWcgPSBtYXNrLT51c2VyX2RhdGE7CisgIGNvbnN0IGdpbnQgKmltcGFjdHMgPSBjb25maWctPm9iamVjdHM7CisgIGdpbnQgd2lkdGggPSAobWFzay0+d2lkdGggPj4gY29uZmlnLT54c2NhbGUpOworICBnaW50IGhlaWdodCA9IChtYXNrLT5oZWlnaHQgPj4gY29uZmlnLT55c2NhbGUpOworICBnaW50IGRlcHRoID0gKDEgPDwgbWFzay0+YnBwKSA+PiBjb25maWctPmNzY2FsZTsKKworICBnaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+bm9iamVjdHM7IGkrKykgeworICAgIHN3aXRjaCAoaW1wYWN0c1swXSkgeworICAgICAgY2FzZSBCT1hfVkVSVElDQUw6CisgICAgICAgIC8qIHZib3ggZG9lcyBub3QgZHJhdyBsYXN0IHBpeGVscyAqLworICAgICAgICBnc3Rfc21wdGVfcGFpbnRfdmJveCAobWFzay0+ZGF0YSwgbWFzay0+d2lkdGgsCisgICAgICAgICAgICBpbXBhY3RzWzFdICogd2lkdGgsIGltcGFjdHNbMl0gKiBoZWlnaHQsIGltcGFjdHNbM10gKiBkZXB0aCwKKyAgICAgICAgICAgIGltcGFjdHNbNF0gKiB3aWR0aCwgaW1wYWN0c1s1XSAqIGhlaWdodCwgaW1wYWN0c1s2XSAqIGRlcHRoKTsKKyAgICAgICAgaW1wYWN0cyArPSA3OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQk9YX0hPUklaT05UQUw6CisgICAgICAgIC8qIGhib3ggZG9lcyBub3QgZHJhdyBsYXN0IHBpeGVscyAqLworICAgICAgICBnc3Rfc21wdGVfcGFpbnRfaGJveCAobWFzay0+ZGF0YSwgbWFzay0+d2lkdGgsCisgICAgICAgICAgICBpbXBhY3RzWzFdICogd2lkdGgsIGltcGFjdHNbMl0gKiBoZWlnaHQsIGltcGFjdHNbM10gKiBkZXB0aCwKKyAgICAgICAgICAgIGltcGFjdHNbNF0gKiB3aWR0aCwgaW1wYWN0c1s1XSAqIGhlaWdodCwgaW1wYWN0c1s2XSAqIGRlcHRoKTsKKyAgICAgICAgaW1wYWN0cyArPSA3OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQk9YX0NMT0NLOgorICAgICAgeworICAgICAgICBnaW50IHgwLCB5MCwgeDEsIHkxLCB4MiwgeTI7CisKKyAgICAgICAgLyogbWFrZSBzdXJlIG5vdCB0byBkcmF3IG91dHNpZGUgdGhlIGFyZWEgKi8KKyAgICAgICAgeDAgPSBNSU4gKGltcGFjdHNbMV0gKiB3aWR0aCwgbWFzay0+d2lkdGggLSAxKTsKKyAgICAgICAgeTAgPSBNSU4gKGltcGFjdHNbMl0gKiBoZWlnaHQsIG1hc2stPmhlaWdodCAtIDEpOworICAgICAgICB4MSA9IE1JTiAoaW1wYWN0c1s0XSAqIHdpZHRoLCBtYXNrLT53aWR0aCAtIDEpOworICAgICAgICB5MSA9IE1JTiAoaW1wYWN0c1s1XSAqIGhlaWdodCwgbWFzay0+aGVpZ2h0IC0gMSk7CisgICAgICAgIHgyID0gTUlOIChpbXBhY3RzWzddICogd2lkdGgsIG1hc2stPndpZHRoIC0gMSk7CisgICAgICAgIHkyID0gTUlOIChpbXBhY3RzWzhdICogaGVpZ2h0LCBtYXNrLT5oZWlnaHQgLSAxKTsKKworICAgICAgICBnc3Rfc21wdGVfcGFpbnRfYm94X2Nsb2NrIChtYXNrLT5kYXRhLCBtYXNrLT53aWR0aCwKKyAgICAgICAgICAgIHgwLCB5MCwgaW1wYWN0c1szXSAqIGRlcHRoLCB4MSwgeTEsIGltcGFjdHNbNl0gKiBkZXB0aCwKKyAgICAgICAgICAgIHgyLCB5MiwgaW1wYWN0c1s5XSAqIGRlcHRoKTsKKyAgICAgICAgaW1wYWN0cyArPSAxMDsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3dpcGVfdHJpYW5nbGVzX2Nsb2NrX2RyYXcgKEdzdE1hc2sgKiBtYXNrKQoreworICBjb25zdCBHc3RXaXBlQ29uZmlnICpjb25maWcgPSBtYXNrLT51c2VyX2RhdGE7CisgIGNvbnN0IGdpbnQgKmltcGFjdHMgPSBjb25maWctPm9iamVjdHM7CisgIGdpbnQgd2lkdGggPSAobWFzay0+d2lkdGggPj4gY29uZmlnLT54c2NhbGUpOworICBnaW50IGhlaWdodCA9IChtYXNrLT5oZWlnaHQgPj4gY29uZmlnLT55c2NhbGUpOworICBnaW50IGRlcHRoID0gKDEgPDwgbWFzay0+YnBwKSA+PiBjb25maWctPmNzY2FsZTsKKyAgZ2ludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBjb25maWctPm5vYmplY3RzOyBpKyspIHsKKyAgICBnaW50IHgwLCB5MCwgeDEsIHkxLCB4MiwgeTI7CisKKyAgICAvKiBtYWtlIHN1cmUgbm90IHRvIGRyYXcgb3V0c2lkZSB0aGUgYXJlYSAqLworICAgIHgwID0gTUlOIChpbXBhY3RzWzBdICogd2lkdGgsIG1hc2stPndpZHRoIC0gMSk7CisgICAgeTAgPSBNSU4gKGltcGFjdHNbMV0gKiBoZWlnaHQsIG1hc2stPmhlaWdodCAtIDEpOworICAgIHgxID0gTUlOIChpbXBhY3RzWzNdICogd2lkdGgsIG1hc2stPndpZHRoIC0gMSk7CisgICAgeTEgPSBNSU4gKGltcGFjdHNbNF0gKiBoZWlnaHQsIG1hc2stPmhlaWdodCAtIDEpOworICAgIHgyID0gTUlOIChpbXBhY3RzWzZdICogd2lkdGgsIG1hc2stPndpZHRoIC0gMSk7CisgICAgeTIgPSBNSU4gKGltcGFjdHNbN10gKiBoZWlnaHQsIG1hc2stPmhlaWdodCAtIDEpOworCisgICAgZ3N0X3NtcHRlX3BhaW50X3RyaWFuZ2xlX2Nsb2NrIChtYXNrLT5kYXRhLCBtYXNrLT53aWR0aCwKKyAgICAgICAgeDAsIHkwLCBpbXBhY3RzWzJdICogZGVwdGgsIHgxLCB5MSwgaW1wYWN0c1s1XSAqIGRlcHRoLAorICAgICAgICB4MiwgeTIsIGltcGFjdHNbOF0gKiBkZXB0aCk7CisgICAgaW1wYWN0cyArPSA5OworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2lwZV90cmlhbmdsZXNfZHJhdyAoR3N0TWFzayAqIG1hc2spCit7CisgIGNvbnN0IEdzdFdpcGVDb25maWcgKmNvbmZpZyA9IG1hc2stPnVzZXJfZGF0YTsKKyAgY29uc3QgZ2ludCAqaW1wYWN0cyA9IGNvbmZpZy0+b2JqZWN0czsKKyAgZ2ludCB3aWR0aCA9IChtYXNrLT53aWR0aCA+PiBjb25maWctPnhzY2FsZSk7CisgIGdpbnQgaGVpZ2h0ID0gKG1hc2stPmhlaWdodCA+PiBjb25maWctPnlzY2FsZSk7CisgIGdpbnQgZGVwdGggPSAoMSA8PCBtYXNrLT5icHApID4+IGNvbmZpZy0+Y3NjYWxlOworCisgIGdpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5ub2JqZWN0czsgaSsrKSB7CisgICAgZ2ludCB4MCwgeTAsIHgxLCB5MSwgeDIsIHkyOworCisgICAgLyogbWFrZSBzdXJlIG5vdCB0byBkcmF3IG91dHNpZGUgdGhlIGFyZWEgKi8KKyAgICB4MCA9IE1JTiAoaW1wYWN0c1swXSAqIHdpZHRoLCBtYXNrLT53aWR0aCAtIDEpOworICAgIHkwID0gTUlOIChpbXBhY3RzWzFdICogaGVpZ2h0LCBtYXNrLT5oZWlnaHQgLSAxKTsKKyAgICB4MSA9IE1JTiAoaW1wYWN0c1szXSAqIHdpZHRoLCBtYXNrLT53aWR0aCAtIDEpOworICAgIHkxID0gTUlOIChpbXBhY3RzWzRdICogaGVpZ2h0LCBtYXNrLT5oZWlnaHQgLSAxKTsKKyAgICB4MiA9IE1JTiAoaW1wYWN0c1s2XSAqIHdpZHRoLCBtYXNrLT53aWR0aCAtIDEpOworICAgIHkyID0gTUlOIChpbXBhY3RzWzddICogaGVpZ2h0LCBtYXNrLT5oZWlnaHQgLSAxKTsKKworICAgIGdzdF9zbXB0ZV9wYWludF90cmlhbmdsZV9saW5lYXIgKG1hc2stPmRhdGEsIG1hc2stPndpZHRoLAorICAgICAgICB4MCwgeTAsIGltcGFjdHNbMl0gKiBkZXB0aCwgeDEsIHkxLCBpbXBhY3RzWzVdICogZGVwdGgsCisgICAgICAgIHgyLCB5MiwgaW1wYWN0c1s4XSAqIGRlcHRoKTsKKyAgICBpbXBhY3RzICs9IDk7CisgIH0KK30KKworLyogc2VlIGFsc286CisgKiBodHRwOi8vd3d3LnczYy5ybC5hYy51ay9wYXN0dGFsa3Mvc2xpZGVtYWtlci9YTUxfTXVsdGltZWRpYS9odG1scy90cmFuc2l0aW9ucy5odG1sCisgKi8KK3N0YXRpYyBjb25zdCBHc3RNYXNrRGVmaW5pdGlvbiBkZWZpbml0aW9uc1tdID0geworICB7MSwgImJhci13aXBlLWxyIiwKKyAgICAgICAgIkEgYmFyIG1vdmVzIGZyb20gbGVmdCB0byByaWdodCIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMV19LAorICB7MiwgImJhci13aXBlLXRiIiwKKyAgICAgICAgIkEgYmFyIG1vdmVzIGZyb20gdG9wIHRvIGJvdHRvbSIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMl19LAorICB7MywgImJveC13aXBlLXRsIiwKKyAgICAgICAgIkEgYm94IGV4cGFuZHMgZnJvbSB0aGUgdXBwZXItbGVmdCBjb3JuZXIgdG8gdGhlIGxvd2VyLXJpZ2h0IGNvcm5lciIsCisgICAgICAgIGdzdF93aXBlX3RyaWFuZ2xlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzNdfSwKKyAgezQsICJib3gtd2lwZS10ciIsCisgICAgICAgICJBIGJveCBleHBhbmRzIGZyb20gdGhlIHVwcGVyLXJpZ2h0IGNvcm5lciB0byB0aGUgbG93ZXItbGVmdCBjb3JuZXIiLAorICAgICAgICBnc3Rfd2lwZV90cmlhbmdsZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR180XX0sCisgIHs1LCAiYm94LXdpcGUtYnIiLAorICAgICAgICAiQSBib3ggZXhwYW5kcyBmcm9tIHRoZSBsb3dlci1yaWdodCBjb3JuZXIgdG8gdGhlIHVwcGVyLWxlZnQgY29ybmVyIiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfNV19LAorICB7NiwgImJveC13aXBlLWJsIiwKKyAgICAgICAgIkEgYm94IGV4cGFuZHMgZnJvbSB0aGUgbG93ZXItbGVmdCBjb3JuZXIgdG8gdGhlIHVwcGVyLXJpZ2h0IGNvcm5lciIsCisgICAgICAgIGdzdF93aXBlX3RyaWFuZ2xlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzZdfSwKKyAgezcsICJmb3VyLWJveC13aXBlLWNpIiwKKyAgICAgICAgIkEgYm94IHNoYXBlIGV4cGFuZHMgZnJvbSBlYWNoIG9mIHRoZSBmb3VyIGNvcm5lcnMgdG93YXJkIHRoZSBjZW50ZXIiLAorICAgICAgICBnc3Rfd2lwZV90cmlhbmdsZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR183XX0sCisgIHs4LCAiZm91ci1ib3gtd2lwZS1jbyIsCisgICAgICAgICJBIGJveCBzaGFwZSBleHBhbmRzIGZyb20gdGhlIGNlbnRlciBvZiBlYWNoIHF1YWRyYW50IHRvd2FyZCB0aGUgY29ybmVycyBvZiBlYWNoIHF1YWRyYW50IiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfOF19LAorICB7MjEsICJiYXJuZG9vci12IiwKKyAgICAgICAgIkEgY2VudHJhbCwgdmVydGljYWwgbGluZSBzcGxpdHMgYW5kIGV4cGFuZHMgdG93YXJkIHRoZSBsZWZ0IGFuZCByaWdodCBlZGdlcyIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjFdfSwKKyAgezIyLCAiYmFybmRvb3ItaCIsCisgICAgICAgICJBIGNlbnRyYWwsIGhvcml6b250YWwgbGluZSBzcGxpdHMgYW5kIGV4cGFuZHMgdG93YXJkIHRoZSB0b3AgYW5kIGJvdHRvbSBlZGdlcyIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjJdfSwKKyAgezIzLCAiYm94LXdpcGUtdGMiLAorICAgICAgICAiQSBib3ggZXhwYW5kcyBmcm9tIHRoZSB0b3AgZWRnZSdzIG1pZHBvaW50IHRvIHRoZSBib3R0b20gY29ybmVycyIsCisgICAgICAgIGdzdF93aXBlX3RyaWFuZ2xlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzIzXX0sCisgIHsyNCwgImJveC13aXBlLXJjIiwKKyAgICAgICAgIkEgYm94IGV4cGFuZHMgZnJvbSB0aGUgcmlnaHQgZWRnZSdzIG1pZHBvaW50IHRvIHRoZSBsZWZ0IGNvcm5lcnMiLAorICAgICAgICBnc3Rfd2lwZV90cmlhbmdsZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18yNF19LAorICB7MjUsICJib3gtd2lwZS1iYyIsCisgICAgICAgICJBIGJveCBleHBhbmRzIGZyb20gdGhlIGJvdHRvbSBlZGdlJ3MgbWlkcG9pbnQgdG8gdGhlIHRvcCBjb3JuZXJzIiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjVdfSwKKyAgezI2LCAiYm94LXdpcGUtbGMiLAorICAgICAgICAiQSBib3ggZXhwYW5kcyBmcm9tIHRoZSBsZWZ0IGVkZ2UncyBtaWRwb2ludCB0byB0aGUgcmlnaHQgY29ybmVycyIsCisgICAgICAgIGdzdF93aXBlX3RyaWFuZ2xlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzI2XX0sCisgIHs0MSwgImRpYWdvbmFsLXRsIiwKKyAgICAgICAgIkEgZGlhZ29uYWwgbGluZSBtb3ZlcyBmcm9tIHRoZSB1cHBlci1sZWZ0IGNvcm5lciB0byB0aGUgbG93ZXItcmlnaHQgY29ybmVyIiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfNDFdfSwKKyAgezQyLCAiZGlhZ29uYWwtdHIiLAorICAgICAgICAiQSBkaWFnb25hbCBsaW5lIG1vdmVzIGZyb20gdGhlIHVwcGVyIHJpZ2h0IGNvcm5lciB0byB0aGUgbG93ZXItbGVmdCBjb3JuZXIiLAorICAgICAgICBnc3Rfd2lwZV90cmlhbmdsZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR180Ml19LAorICB7NDMsICJib3d0aWUtdiIsCisgICAgICAgICJUd28gd2VkZ2Ugc2hhcGVzIHNsaWRlIGluIGZyb20gdGhlIHRvcCBhbmQgYm90dG9tIGVkZ2VzIHRvd2FyZCB0aGUgY2VudGVyIiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfNDNdfSwKKyAgezQ0LCAiYm93dGllLWgiLAorICAgICAgICAiVHdvIHdlZGdlIHNoYXBlcyBzbGlkZSBpbiBmcm9tIHRoZSBsZWZ0IGFuZCByaWdodCBlZGdlcyB0b3dhcmQgdGhlIGNlbnRlciIsCisgICAgICAgIGdzdF93aXBlX3RyaWFuZ2xlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzQ0XX0sCisgIHs0NSwgImJhcm5kb29yLWRibCIsCisgICAgICAgICJBIGRpYWdvbmFsIGxpbmUgZnJvbSB0aGUgbG93ZXItbGVmdCB0byB1cHBlci1yaWdodCBjb3JuZXJzIHNwbGl0cyBhbmQgZXhwYW5kcyB0b3dhcmQgdGhlIG9wcG9zaXRlIGNvcm5lcnMiLAorICAgICAgICBnc3Rfd2lwZV90cmlhbmdsZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR180NV19LAorICB7NDYsICJiYXJuZG9vci1kdGwiLAorICAgICAgICAiQSBkaWFnb25hbCBsaW5lIGZyb20gdXBwZXItbGVmdCB0byBsb3dlci1yaWdodCBjb3JuZXJzIHNwbGl0cyBhbmQgZXhwYW5kcyB0b3dhcmQgdGhlIG9wcG9zaXRlIGNvcm5lcnMiLAorICAgICAgICBnc3Rfd2lwZV90cmlhbmdsZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR180Nl19LAorICB7NDcsICJtaXNjLWRpYWdvbmFsLWRiZCIsCisgICAgICAgICJGb3VyIHdlZGdlIHNoYXBlcyBzcGxpdCBmcm9tIHRoZSBjZW50ZXIgYW5kIHJldHJhY3QgdG93YXJkIHRoZSBmb3VyIGVkZ2VzIiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfNDddfSwKKyAgezQ4LCAibWlzYy1kaWFnb25hbC1kZCIsCisgICAgICAgICJBIGRpYW1vbmQgY29ubmVjdGluZyB0aGUgZm91ciBlZGdlIG1pZHBvaW50cyBzaW11bHRhbmVvdXNseSBjb250cmFjdHMgdG93YXJkIHRoZSBjZW50ZXIgYW5kIGV4cGFuZHMgdG93YXJkIHRoZSBlZGdlcyIsCisgICAgICAgIGdzdF93aXBlX3RyaWFuZ2xlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzQ4XX0sCisgIHs2MSwgInZlZS1kIiwKKyAgICAgICAgIkEgd2VkZ2Ugc2hhcGUgbW92ZXMgZnJvbSB0b3AgdG8gYm90dG9tIiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfNjFdfSwKKyAgezYyLCAidmVlLWwiLAorICAgICAgICAiQSB3ZWRnZSBzaGFwZSBtb3ZlcyBmcm9tIHJpZ2h0IHRvIGxlZnQiLAorICAgICAgICBnc3Rfd2lwZV90cmlhbmdsZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR182Ml19LAorICB7NjMsICJ2ZWUtdSIsCisgICAgICAgICJBIHdlZGdlIHNoYXBlIG1vdmVzIGZyb20gYm90dG9tIHRvIHRvcCIsCisgICAgICAgIGdzdF93aXBlX3RyaWFuZ2xlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzYzXX0sCisgIHs2NCwgInZlZS1yIiwKKyAgICAgICAgIkEgd2VkZ2Ugc2hhcGUgbW92ZXMgZnJvbSBsZWZ0IHRvIHJpZ2h0IiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfNjRdfSwKKyAgezY1LCAiYmFybnZlZS1kIiwKKyAgICAgICAgIkEgJ1YnIHNoYXBlIGV4dGVuZGluZyBmcm9tIHRoZSBib3R0b20gZWRnZSdzIG1pZHBvaW50IHRvIHRoZSBvcHBvc2l0ZSBjb3JuZXJzIGNvbnRyYWN0cyB0b3dhcmQgdGhlIGNlbnRlciBhbmQgZXhwYW5kcyB0b3dhcmQgdGhlIGVkZ2VzIiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfNjVdfSwKKyAgezY2LCAiYmFybnZlZS1sIiwKKyAgICAgICAgIkEgJ1YnIHNoYXBlIGV4dGVuZGluZyBmcm9tIHRoZSBsZWZ0IGVkZ2UncyBtaWRwb2ludCB0byB0aGUgb3Bwb3NpdGUgY29ybmVycyBjb250cmFjdHMgdG93YXJkIHRoZSBjZW50ZXIgYW5kIGV4cGFuZHMgdG93YXJkIHRoZSBlZGdlcyIsCisgICAgICAgIGdzdF93aXBlX3RyaWFuZ2xlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzY2XX0sCisgIHs2NywgImJhcm52ZWUtdSIsCisgICAgICAgICJBICdWJyBzaGFwZSBleHRlbmRpbmcgZnJvbSB0aGUgdG9wIGVkZ2UncyBtaWRwb2ludCB0byB0aGUgb3Bwb3NpdGUgY29ybmVycyBjb250cmFjdHMgdG93YXJkIHRoZSBjZW50ZXIgYW5kIGV4cGFuZHMgdG93YXJkIHRoZSBlZGdlcyIsCisgICAgICAgIGdzdF93aXBlX3RyaWFuZ2xlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzY3XX0sCisgIHs2OCwgImJhcm52ZWUtciIsCisgICAgICAgICJBICdWJyBzaGFwZSBleHRlbmRpbmcgZnJvbSB0aGUgcmlnaHQgZWRnZSdzIG1pZHBvaW50IHRvIHRoZSBvcHBvc2l0ZSBjb3JuZXJzIGNvbnRyYWN0cyB0b3dhcmQgdGhlIGNlbnRlciBhbmQgZXhwYW5kcyB0b3dhcmQgdGhlIGVkZ2VzIiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfNjhdfSwKKyAgezEwMSwgImlyaXMtcmVjdCIsCisgICAgICAgICJBIHJlY3RhbmdsZSBleHBhbmRzIGZyb20gdGhlIGNlbnRlci4iLAorICAgICAgICBnc3Rfd2lwZV90cmlhbmdsZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18xMDFdfSwKKyAgezIwMSwgImNsb2NrLWN3MTIiLAorICAgICAgICAiQSByYWRpYWwgaGFuZCBzd2VlcHMgY2xvY2t3aXNlIGZyb20gdGhlIHR3ZWx2ZSBvJ2Nsb2NrIHBvc2l0aW9uIiwKKyAgICAgICAgZ3N0X3dpcGVfYm94ZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18yMDFdfSwKKyAgezIwMiwgImNsb2NrLWN3MyIsCisgICAgICAgICJBIHJhZGlhbCBoYW5kIHN3ZWVwcyBjbG9ja3dpc2UgZnJvbSB0aGUgdGhyZWUgbydjbG9jayBwb3NpdGlvbiIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjAyXX0sCisgIHsyMDMsICJjbG9jay1jdzYiLAorICAgICAgICAiQSByYWRpYWwgaGFuZCBzd2VlcHMgY2xvY2t3aXNlIGZyb20gdGhlIHNpeCBvJ2Nsb2NrIHBvc2l0aW9uIiwKKyAgICAgICAgZ3N0X3dpcGVfYm94ZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18yMDNdfSwKKyAgezIwNCwgImNsb2NrLWN3OSIsCisgICAgICAgICJBIHJhZGlhbCBoYW5kIHN3ZWVwcyBjbG9ja3dpc2UgZnJvbSB0aGUgbmluZSBvJ2Nsb2NrIHBvc2l0aW9uIiwKKyAgICAgICAgZ3N0X3dpcGVfYm94ZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18yMDRdfSwKKyAgezIwNSwgInBpbndoZWVsLXRidiIsCisgICAgICAgICJUd28gcmFkaWFsIGhhbmRzIHN3ZWVwIGNsb2Nrd2lzZSBmcm9tIHRoZSB0d2VsdmUgYW5kIHNpeCBvJ2Nsb2NrIHBvc2l0aW9ucyIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjA1XX0sCisgIHsyMDYsICJwaW53aGVlbC10YmgiLAorICAgICAgICAiVHdvIHJhZGlhbCBoYW5kcyBzd2VlcCBjbG9ja3dpc2UgZnJvbSB0aGUgbmluZSBhbmQgdGhyZWUgbydjbG9jayBwb3NpdGlvbnMiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzIwNl19LAorICB7MjA3LCAicGlud2hlZWwtZmIiLAorICAgICAgICAiRm91ciByYWRpYWwgaGFuZHMgc3dlZXAgY2xvY2t3aXNlIiwKKyAgICAgICAgZ3N0X3dpcGVfYm94ZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18yMDddfSwKKyAgezIxMSwgImZhbi1jdCIsCisgICAgICAgICJBIGZhbiB1bmZvbGRzIGZyb20gdGhlIHRvcCBlZGdlLCB0aGUgZmFuIGF4aXMgYXQgdGhlIGNlbnRlciIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjExXX0sCisgIHsyMTIsICJmYW4tY3IiLAorICAgICAgICAiQSBmYW4gdW5mb2xkcyBmcm9tIHRoZSByaWdodCBlZGdlLCB0aGUgZmFuIGF4aXMgYXQgdGhlIGNlbnRlciIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjEyXX0sCisgIHsyMTMsICJkb3VibGVmYW4tZm92IiwKKyAgICAgICAgIlR3byBmYW5zLCB0aGVpciBheGVzIGF0IHRoZSBjZW50ZXIsIHVuZm9sZCBmcm9tIHRoZSB0b3AgYW5kIGJvdHRvbSIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjEzXX0sCisgIHsyMTQsICJkb3VibGVmYW4tZm9oIiwKKyAgICAgICAgIlR3byBmYW5zLCB0aGVpciBheGVzIGF0IHRoZSBjZW50ZXIsIHVuZm9sZCBmcm9tIHRoZSBsZWZ0IGFuZCByaWdodCIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjE0XX0sCisgIHsyMjEsICJzaW5nbGVzd2VlcC1jd3QiLAorICAgICAgICAiQSByYWRpYWwgaGFuZCBzd2VlcHMgY2xvY2t3aXNlIGZyb20gdGhlIHRvcCBlZGdlJ3MgbWlkcG9pbnQiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzIyMV19LAorICB7MjIyLCAic2luZ2xlc3dlZXAtY3dyIiwKKyAgICAgICAgIkEgcmFkaWFsIGhhbmQgc3dlZXBzIGNsb2Nrd2lzZSBmcm9tIHRoZSByaWdodCBlZGdlJ3MgbWlkcG9pbnQiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzIyMl19LAorICB7MjIzLCAic2luZ2xlc3dlZXAtY3diIiwKKyAgICAgICAgIkEgcmFkaWFsIGhhbmQgc3dlZXBzIGNsb2Nrd2lzZSBmcm9tIHRoZSBib3R0b20gZWRnZSdzIG1pZHBvaW50IiwKKyAgICAgICAgZ3N0X3dpcGVfYm94ZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18yMjNdfSwKKyAgezIyNCwgInNpbmdsZXN3ZWVwLWN3bCIsCisgICAgICAgICJBIHJhZGlhbCBoYW5kIHN3ZWVwcyBjbG9ja3dpc2UgZnJvbSB0aGUgbGVmdCBlZGdlJ3MgbWlkcG9pbnQiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzIyNF19LAorICB7MjI1LCAiZG91Ymxlc3dlZXAtcHYiLAorICAgICAgICAiVHdvIHJhZGlhbCBoYW5kcyBzd2VlcCBjbG9ja3dpc2UgYW5kIGNvdW50ZXItY2xvY2t3aXNlIGZyb20gdGhlIHRvcCBhbmQgYm90dG9tIGVkZ2VzJyBtaWRwb2ludHMiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzIyNV19LAorICB7MjI2LCAiZG91Ymxlc3dlZXAtcGQiLAorICAgICAgICAiVHdvIHJhZGlhbCBoYW5kcyBzd2VlcCBjbG9ja3dpc2UgYW5kIGNvdW50ZXItY2xvY2t3aXNlIGZyb20gdGhlIGxlZnQgYW5kIHJpZ2h0IGVkZ2VzJyBtaWRwb2ludHMiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzIyNl19LAorICB7MjI3LCAiZG91Ymxlc3dlZXAtb3YiLAorICAgICAgICAiVHdvIHJhZGlhbCBoYW5kcyBhdHRhY2hlZCBhdCB0aGUgdG9wIGFuZCBib3R0b20gZWRnZXMnIG1pZHBvaW50cyBzd2VlcCBmcm9tIHJpZ2h0IHRvIGxlZnQiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzIyN119LAorICB7MjI4LCAiZG91Ymxlc3dlZXAtb2giLAorICAgICAgICAiVHdvIHJhZGlhbCBoYW5kcyBhdHRhY2hlZCBhdCB0aGUgbGVmdCBhbmQgcmlnaHQgZWRnZXMnIG1pZHBvaW50cyBzd2VlcCBmcm9tIHRvcCB0byBib3R0b20iLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzIyOF19LAorICB7MjMxLCAiZmFuLXQiLAorICAgICAgICAiQSBmYW4gdW5mb2xkcyBmcm9tIHRoZSBib3R0b20sIHRoZSBmYW4gYXhpcyBhdCB0aGUgdG9wIGVkZ2UncyBtaWRwb2ludCIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjMxXX0sCisgIHsyMzIsICJmYW4tciIsCisgICAgICAgICJBIGZhbiB1bmZvbGRzIGZyb20gdGhlIGxlZnQsIHRoZSBmYW4gYXhpcyBhdCB0aGUgcmlnaHQgZWRnZSdzIG1pZHBvaW50IiwKKyAgICAgICAgZ3N0X3dpcGVfYm94ZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18yMzJdfSwKKyAgezIzMywgImZhbi1iIiwKKyAgICAgICAgIkEgZmFuIHVuZm9sZHMgZnJvbSB0aGUgdG9wLCB0aGUgZmFuIGF4aXMgYXQgdGhlIGJvdHRvbSBlZGdlJ3MgbWlkcG9pbnQiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzIzM119LAorICB7MjM0LCAiZmFuLWwiLAorICAgICAgICAiQSBmYW4gdW5mb2xkcyBmcm9tIHRoZSByaWdodCwgdGhlIGZhbiBheGlzIGF0IHRoZSBsZWZ0IGVkZ2UncyBtaWRwb2ludCIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjM0XX0sCisgIHsyMzUsICJkb3VibGVmYW4tZml2IiwKKyAgICAgICAgIlR3byBmYW5zLCB0aGVpciBheGVzIGF0IHRoZSB0b3AgYW5kIGJvdHRvbSwgdW5mb2xkIGZyb20gdGhlIGNlbnRlciIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjM1XX0sCisgIHsyMzYsICJkb3VibGVmYW4tZmloIiwKKyAgICAgICAgIlR3byBmYW5zLCB0aGVpciBheGVzIGF0IHRoZSBsZWZ0IGFuZCByaWdodCwgdW5mb2xkIGZyb20gdGhlIGNlbnRlciIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjM2XX0sCisgIHsyNDEsICJzaW5nbGVzd2VlcC1jd3RsIiwKKyAgICAgICAgIkEgcmFkaWFsIGhhbmQgc3dlZXBzIGNsb2Nrd2lzZSBmcm9tIHRoZSB1cHBlci1sZWZ0IGNvcm5lciIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjQxXX0sCisgIHsyNDIsICJzaW5nbGVzd2VlcC1jd2JsIiwKKyAgICAgICAgIkEgcmFkaWFsIGhhbmQgc3dlZXBzIGNvdW50ZXItY2xvY2t3aXNlIGZyb20gdGhlIGxvd2VyLWxlZnQgY29ybmVyLiIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjQyXX0sCisgIHsyNDMsICJzaW5nbGVzd2VlcC1jd2JyIiwKKyAgICAgICAgIkEgcmFkaWFsIGhhbmQgc3dlZXBzIGNsb2Nrd2lzZSBmcm9tIHRoZSBsb3dlci1yaWdodCBjb3JuZXIiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzI0M119LAorICB7MjQ0LCAic2luZ2xlc3dlZXAtY3d0ciIsCisgICAgICAgICJBIHJhZGlhbCBoYW5kIHN3ZWVwcyBjb3VudGVyLWNsb2Nrd2lzZSBmcm9tIHRoZSB1cHBlci1yaWdodCBjb3JuZXIiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzI0NF19LAorICB7MjQ1LCAiZG91Ymxlc3dlZXAtcGR0bCIsCisgICAgICAgICJUd28gcmFkaWFsIGhhbmRzIGF0dGFjaGVkIGF0IHRoZSB1cHBlci1sZWZ0IGFuZCBsb3dlci1yaWdodCBjb3JuZXJzIHN3ZWVwIGRvd24gYW5kIHVwIiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2Nsb2NrX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjQ1XX0sCisgIHsyNDYsICJkb3VibGVzd2VlcC1wZGJsIiwKKyAgICAgICAgIlR3byByYWRpYWwgaGFuZHMgYXR0YWNoZWQgYXQgdGhlIGxvd2VyLWxlZnQgYW5kIHVwcGVyLXJpZ2h0IGNvcm5lcnMgc3dlZXAgZG93biBhbmQgdXAiLAorICAgICAgICBnc3Rfd2lwZV90cmlhbmdsZXNfY2xvY2tfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18yNDZdfSwKKyAgezI1MSwgInNhbG9vbmRvb3ItdCIsCisgICAgICAgICJUd28gcmFkaWFsIGhhbmRzIGF0dGFjaGVkIGF0IHRoZSB1cHBlci1sZWZ0IGFuZCB1cHBlci1yaWdodCBjb3JuZXJzIHN3ZWVwIGRvd24iLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzI1MV19LAorICB7MjUyLCAic2Fsb29uZG9vci1sIiwKKyAgICAgICAgIlR3byByYWRpYWwgaGFuZHMgYXR0YWNoZWQgYXQgdGhlIHVwcGVyLWxlZnQgYW5kIGxvd2VyLWxlZnQgY29ybmVycyBzd2VlcCB0byB0aGUgcmlnaHQiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzI1Ml19LAorICB7MjUzLCAic2Fsb29uZG9vci1iIiwKKyAgICAgICAgIlR3byByYWRpYWwgaGFuZHMgYXR0YWNoZWQgYXQgdGhlIGxvd2VyLWxlZnQgYW5kIGxvd2VyLXJpZ2h0IGNvcm5lcnMgc3dlZXAgdXAiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzI1M119LAorICB7MjU0LCAic2Fsb29uZG9vci1yIiwKKyAgICAgICAgIlR3byByYWRpYWwgaGFuZHMgYXR0YWNoZWQgYXQgdGhlIHVwcGVyLXJpZ2h0IGFuZCBsb3dlci1yaWdodCBjb3JuZXJzIHN3ZWVwIHRvIHRoZSBsZWZ0IiwKKyAgICAgICAgZ3N0X3dpcGVfYm94ZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18yNTRdfSwKKyAgezI2MSwgIndpbmRzaGllbGQtciIsCisgICAgICAgICJUd28gcmFkaWFsIGhhbmRzIGF0dGFjaGVkIGF0IHRoZSBtaWRwb2ludHMgb2YgdGhlIHRvcCBhbmQgYm90dG9tIGhhbHZlcyBzd2VlcCBmcm9tIHJpZ2h0IHRvIGxlZnQiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzI2MV19LAorICB7MjYyLCAid2luZHNoaWVsZC11IiwKKyAgICAgICAgIlR3byByYWRpYWwgaGFuZHMgYXR0YWNoZWQgYXQgdGhlIG1pZHBvaW50cyBvZiB0aGUgbGVmdCBhbmQgcmlnaHQgaGFsdmVzIHN3ZWVwIGZyb20gdG9wIHRvIGJvdHRvbSIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjYyXX0sCisgIHsyNjMsICJ3aW5kc2hpZWxkLXYiLAorICAgICAgICAiVHdvIHNldHMgb2YgcmFkaWFsIGhhbmRzIGF0dGFjaGVkIGF0IHRoZSBtaWRwb2ludHMgb2YgdGhlIHRvcCBhbmQgYm90dG9tIGhhbHZlcyBzd2VlcCBmcm9tIHRvcCB0byBib3R0b20gYW5kIGJvdHRvbSB0byB0b3AiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzI2M119LAorICB7MjY0LCAid2luZHNoaWVsZC1oIiwKKyAgICAgICAgIlR3byBzZXRzIG9mIHJhZGlhbCBoYW5kcyBhdHRhY2hlZCBhdCB0aGUgbWlkcG9pbnRzIG9mIHRoZSBsZWZ0IGFuZCByaWdodCBoYWx2ZXMgc3dlZXAgZnJvbSBsZWZ0IHRvIHJpZ2h0IGFuZCByaWdodCB0byBsZWZ0IiwKKyAgICAgICAgZ3N0X3dpcGVfYm94ZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18yNjRdfSwKKyAgezAsIE5VTEwsIE5VTEwsIE5VTEx9Cit9OworCit2b2lkCitfZ3N0X2JhcmJveHdpcGVzX3JlZ2lzdGVyICh2b2lkKQoreworICBnaW50IGkgPSAwOworCisgIHdoaWxlIChkZWZpbml0aW9uc1tpXS5zaG9ydF9uYW1lKSB7CisgICAgX2dzdF9tYXNrX3JlZ2lzdGVyICgmZGVmaW5pdGlvbnNbaV0pOworICAgIGkrKzsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3N0L3NtcHRlL2dzdG1hc2suYyBiL2dzdC9zbXB0ZS9nc3RtYXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiNTkxOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9zbXB0ZS9nc3RtYXNrLmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RtYXNrLmgiCisjaW5jbHVkZSAicGFpbnQuaCIKKworc3RhdGljIEdMaXN0ICptYXNrcyA9IE5VTEw7CisKK3ZvaWQKK19nc3RfbWFza19pbml0ICh2b2lkKQoreworICBfZ3N0X2JhcmJveHdpcGVzX3JlZ2lzdGVyICgpOworfQorCitzdGF0aWMgZ2ludAorZ3N0X21hc2tfY29tcGFyZSAoR3N0TWFza0RlZmluaXRpb24gKiBkZWYxLCBHc3RNYXNrRGVmaW5pdGlvbiAqIGRlZjIpCit7CisgIHJldHVybiAoZGVmMS0+dHlwZSAtIGRlZjItPnR5cGUpOworfQorCit2b2lkCitfZ3N0X21hc2tfcmVnaXN0ZXIgKGNvbnN0IEdzdE1hc2tEZWZpbml0aW9uICogZGVmaW5pdGlvbikKK3sKKyAgbWFza3MgPQorICAgICAgZ19saXN0X2luc2VydF9zb3J0ZWQgKG1hc2tzLCAoZ3BvaW50ZXIpIGRlZmluaXRpb24sCisgICAgICAoR0NvbXBhcmVGdW5jKSBnc3RfbWFza19jb21wYXJlKTsKK30KKworY29uc3QgR0xpc3QgKgorZ3N0X21hc2tfZ2V0X2RlZmluaXRpb25zICh2b2lkKQoreworICByZXR1cm4gbWFza3M7Cit9CisKK3N0YXRpYyBHc3RNYXNrRGVmaW5pdGlvbiAqCitnc3RfbWFza19maW5kX2RlZmluaXRpb24gKGdpbnQgdHlwZSkKK3sKKyAgR0xpc3QgKndhbGsgPSBtYXNrczsKKworICB3aGlsZSAod2FsaykgeworICAgIEdzdE1hc2tEZWZpbml0aW9uICpkZWYgPSAoR3N0TWFza0RlZmluaXRpb24gKikgd2Fsay0+ZGF0YTsKKworICAgIGlmIChkZWYtPnR5cGUgPT0gdHlwZSkKKyAgICAgIHJldHVybiBkZWY7CisKKyAgICB3YWxrID0gZ19saXN0X25leHQgKHdhbGspOworICB9CisgIHJldHVybiBOVUxMOworfQorCitHc3RNYXNrICoKK2dzdF9tYXNrX2ZhY3RvcnlfbmV3IChnaW50IHR5cGUsIGdib29sZWFuIGludmVydCwgZ2ludCBicHAsIGdpbnQgd2lkdGgsCisgICAgZ2ludCBoZWlnaHQpCit7CisgIEdzdE1hc2tEZWZpbml0aW9uICpkZWZpbml0aW9uOworICBHc3RNYXNrICptYXNrID0gTlVMTDsKKworICBkZWZpbml0aW9uID0gZ3N0X21hc2tfZmluZF9kZWZpbml0aW9uICh0eXBlKTsKKyAgaWYgKGRlZmluaXRpb24pIHsKKyAgICBtYXNrID0gZ19uZXcwIChHc3RNYXNrLCAxKTsKKworICAgIG1hc2stPnR5cGUgPSBkZWZpbml0aW9uLT50eXBlOworICAgIG1hc2stPmJwcCA9IGJwcDsKKyAgICBtYXNrLT53aWR0aCA9IHdpZHRoOworICAgIG1hc2stPmhlaWdodCA9IGhlaWdodDsKKyAgICBtYXNrLT5kZXN0cm95X2Z1bmMgPSBkZWZpbml0aW9uLT5kZXN0cm95X2Z1bmM7CisgICAgbWFzay0+dXNlcl9kYXRhID0gZGVmaW5pdGlvbi0+dXNlcl9kYXRhOworICAgIG1hc2stPmRhdGEgPSBnX21hbGxvYyAod2lkdGggKiBoZWlnaHQgKiBzaXplb2YgKGd1aW50MzIpKTsKKworICAgIGRlZmluaXRpb24tPmRyYXdfZnVuYyAobWFzayk7CisKKyAgICBpZiAoaW52ZXJ0KSB7CisgICAgICBnaW50IGksIGo7CisgICAgICBndWludDMyICpkYXRhcCA9IG1hc2stPmRhdGE7CisgICAgICBndWludDMyIG1heCA9ICgxIDw8IGJwcCk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICAgICpkYXRhcCA9IG1heCAtICpkYXRhcDsKKyAgICAgICAgICBkYXRhcCsrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIG1hc2s7Cit9CisKK3ZvaWQKK19nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3kgKEdzdE1hc2sgKiBtYXNrKQoreworICBnX2ZyZWUgKG1hc2stPmRhdGEpOworICBnX2ZyZWUgKG1hc2spOworfQorCit2b2lkCitnc3RfbWFza19kZXN0cm95IChHc3RNYXNrICogbWFzaykKK3sKKyAgaWYgKG1hc2stPmRlc3Ryb3lfZnVuYykKKyAgICBtYXNrLT5kZXN0cm95X2Z1bmMgKG1hc2spOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3NtcHRlL2dzdG1hc2suaCBiL2dzdC9zbXB0ZS9nc3RtYXNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhNTA4MgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9zbXB0ZS9nc3RtYXNrLmgKQEAgLTAsMCArMSw2NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9NQVNLX0hfXworI2RlZmluZSBfX0dTVF9NQVNLX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCit0eXBlZGVmIHN0cnVjdCBfR3N0TWFzayBHc3RNYXNrOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE1hc2tEZWZpbml0aW9uIEdzdE1hc2tEZWZpbml0aW9uOworCit0eXBlZGVmIHZvaWQgICAgICAgICAgICAoKkdzdE1hc2tEcmF3RnVuYykgICAgICAgICAgICAgIChHc3RNYXNrICptYXNrKTsKK3R5cGVkZWYgdm9pZCAgICAgICAgICAgICgqR3N0TWFza0Rlc3Ryb3lGdW5jKSAgICAgICAgICAgKEdzdE1hc2sgKm1hc2spOworCitzdHJ1Y3QgX0dzdE1hc2tEZWZpbml0aW9uIHsKKyAgZ2ludCAgICAgICAgICAgICAgICAgICB0eXBlOworICBjb25zdCBnY2hhciAgICAgICAgICAgKnNob3J0X25hbWU7CisgIGNvbnN0IGdjaGFyICAgICAgICAgICAqbG9uZ19uYW1lOworICBHc3RNYXNrRHJhd0Z1bmMgICAgICAgIGRyYXdfZnVuYzsKKyAgR3N0TWFza0Rlc3Ryb3lGdW5jICAgICBkZXN0cm95X2Z1bmM7CisgIGdjb25zdHBvaW50ZXIgICAgICAgICAgdXNlcl9kYXRhOworfTsKKworc3RydWN0IF9Hc3RNYXNrIHsKKyAgZ2ludCAgICAgICAgICAgICAgICAgICB0eXBlOworICBndWludDMyICAgICAgICAgICAgICAgKmRhdGE7CisgIGdjb25zdHBvaW50ZXIgICAgICAgICAgdXNlcl9kYXRhOworCisgIGdpbnQgICAgICAgICAgICAgICAgICAgd2lkdGg7CisgIGdpbnQgICAgICAgICAgICAgICAgICAgaGVpZ2h0OworICBnaW50ICAgICAgICAgICAgICAgICAgIGJwcDsKKworICBHc3RNYXNrRGVzdHJveUZ1bmMgICAgIGRlc3Ryb3lfZnVuYzsKK307CisKK3ZvaWQgICAgICAgICAgICAgICAgICAgIF9nc3RfbWFza19pbml0ICAgICAgICAgICAgICAgICAgKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgICAgICAgX2dzdF9tYXNrX3JlZ2lzdGVyICAgICAgICAgICAgICAoY29uc3QgR3N0TWFza0RlZmluaXRpb24gKmRlZmluaXRpb24pOworCit2b2lkICAgICAgICAgICAgICAgICAgICBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95ICAgICAgIChHc3RNYXNrICptYXNrKTsKKworY29uc3QgR0xpc3QqICAgICAgICAgICAgZ3N0X21hc2tfZ2V0X2RlZmluaXRpb25zICAgICAgICAodm9pZCk7CitHc3RNYXNrKiAgICAgICAgICAgICAgICBnc3RfbWFza19mYWN0b3J5X25ldyAgICAgICAgICAgIChnaW50IHR5cGUsIGdib29sZWFuIGludmVydCwgZ2ludCBicHAsIGdpbnQgd2lkdGgsIGdpbnQgaGVpZ2h0KTsKK3ZvaWQgICAgICAgICAgICAgICAgICAgIGdzdF9tYXNrX2Rlc3Ryb3kgICAgICAgICAgICAgICAgKEdzdE1hc2sgKm1hc2spOworCit2b2lkIF9nc3RfYmFyYm94d2lwZXNfcmVnaXN0ZXIgKHZvaWQpOworCisjZW5kaWYgLyogX19HU1RfTUFTS19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9zbXB0ZS9nc3RzbXB0ZS5jIGIvZ3N0L3NtcHRlL2dzdHNtcHRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjNTIyYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9zbXB0ZS9nc3RzbXB0ZS5jCkBAIC0wLDAgKzEsNjcxIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtc21wdGUKKyAqCisgKiBzbXB0ZSBjYW4gYWNjZXB0IEk0MjAgdmlkZW8gc3RyZWFtcyB3aXRoIHRoZSBzYW1lIHdpZHRoLCBoZWlnaHQgYW5kCisgKiBmcmFtZXJhdGUuIFRoZSB0d28gaW5jb21taW5nIGJ1ZmZlcnMgYXJlIGJsZW5kZWQgdG9nZXRoZXIgdXNpbmcgYW4gZWZmZWN0CisgKiBzcGVjaWZpYyBhbHBoYSBtYXNrLiAKKyAqCisgKiBUaGUgI0dzdFNtcHRlOmRlcHRoIHByb3BlcnR5IGRlZmluZXMgdGhlIHByZXNpc2lvbiBpbiBiaXRzIG9mIHRoZSBtYXNrLiBBCisgKiBoaWdoZXIgcHJlc2lzaW9uIHdpbGwgY3JlYXRlIGEgbWFzayB3aXRoIHNtb290aGVyIGdyYWRpZW50cyBpbiBvcmRlciB0byBhdm9pZAorICogYmFuZGluZy4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+U2FtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgdmlkZW90ZXN0c3JjIHBhdHRlcm49MSAhIHNtcHRlIG5hbWU9cyBib3JkZXI9MjAwMDAgdHlwZT0yMzQgZHVyYXRpb249MjAwMDAwMDAwMCAhIHZpZGVvY29udmVydCAhIHhpbWFnZXNpbmsgdmlkZW90ZXN0c3JjICEgcy4KKyAqIF18IEEgcGlwZWxpbmUgdG8gZGVtb25zdHJhdGUgdGhlIHNtcHRlIHRyYW5zaXRpb24uCisgKiBJdCBzaG93cyBhIHBpbndoZWVsIHRyYW5zaXRpb24gYSBmcm9tIGEgc25vdyB2aWRlb3Rlc3RzcmMgdG8gYW4gc21wdGUKKyAqIHBhdHRlcm4gdmlkZW90ZXN0c3JjLiBUaGUgdHJhbnNpdGlvbiB3aWxsIHRha2UgMiBzZWNvbmRzIHRvIGNvbXBsZXRlLiBUaGUKKyAqIGVkZ2VzIG9mIHRoZSB0cmFuc2l0aW9uIGFyZSBzbW9vdGhlZCB3aXRoIGEgMjAwMDAgYmlnIGJvcmRlci4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdzdHNtcHRlLmgiCisjaW5jbHVkZSAicGFpbnQuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3NtcHRlX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9zbXB0ZV9kZWJ1ZworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3NtcHRlX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgiSTQyMCIpCisgICAgKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3Rfc21wdGVfc2luazFfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rMSIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoIkk0MjAiKQorICAgICkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3NtcHRlX3NpbmsyX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luazIiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJJNDIwIikKKyAgICApCisgICAgKTsKKworCisvKiBTTVBURSBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKKyNkZWZpbmUgREVGQVVMVF9QUk9QX1RZUEUJMQorI2RlZmluZSBERUZBVUxUX1BST1BfQk9SREVSCTAKKyNkZWZpbmUgREVGQVVMVF9QUk9QX0RFUFRICTE2CisjZGVmaW5lIERFRkFVTFRfUFJPUF9EVVJBVElPTglHU1RfU0VDT05ECisjZGVmaW5lIERFRkFVTFRfUFJPUF9JTlZFUlQgICBGQUxTRQorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9UWVBFLAorICBQUk9QX0JPUkRFUiwKKyAgUFJPUF9ERVBUSCwKKyAgUFJPUF9EVVJBVElPTiwKKyAgUFJPUF9JTlZFUlQKK307CisKKyNkZWZpbmUgR1NUX1RZUEVfU01QVEVfVFJBTlNJVElPTl9UWVBFIChnc3Rfc21wdGVfdHJhbnNpdGlvbl90eXBlX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9zbXB0ZV90cmFuc2l0aW9uX3R5cGVfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBzbXB0ZV90cmFuc2l0aW9uX3R5cGUgPSAwOworICBHRW51bVZhbHVlICpzbXB0ZV90cmFuc2l0aW9uczsKKworICBpZiAoIXNtcHRlX3RyYW5zaXRpb25fdHlwZSkgeworICAgIGNvbnN0IEdMaXN0ICpkZWZpbml0aW9uczsKKyAgICBnaW50IGkgPSAwOworCisgICAgZGVmaW5pdGlvbnMgPSBnc3RfbWFza19nZXRfZGVmaW5pdGlvbnMgKCk7CisgICAgc21wdGVfdHJhbnNpdGlvbnMgPQorICAgICAgICBnX25ldzAgKEdFbnVtVmFsdWUsIGdfbGlzdF9sZW5ndGggKChHTGlzdCAqKSBkZWZpbml0aW9ucykgKyAxKTsKKworICAgIHdoaWxlIChkZWZpbml0aW9ucykgeworICAgICAgR3N0TWFza0RlZmluaXRpb24gKmRlZmluaXRpb24gPSAoR3N0TWFza0RlZmluaXRpb24gKikgZGVmaW5pdGlvbnMtPmRhdGE7CisKKyAgICAgIGRlZmluaXRpb25zID0gZ19saXN0X25leHQgKGRlZmluaXRpb25zKTsKKworICAgICAgc21wdGVfdHJhbnNpdGlvbnNbaV0udmFsdWUgPSBkZWZpbml0aW9uLT50eXBlOworICAgICAgLyogb2xkZXIgR0xpYiB2ZXJzaW9ucyBoYXZlIHRoZSB0d28gZmllbGRzIGFzIG5vbi1jb25zdCwgaGVuY2UgdGhlIGNhc3QgKi8KKyAgICAgIHNtcHRlX3RyYW5zaXRpb25zW2ldLnZhbHVlX25pY2sgPSAoZ2NoYXIgKikgZGVmaW5pdGlvbi0+c2hvcnRfbmFtZTsKKyAgICAgIHNtcHRlX3RyYW5zaXRpb25zW2ldLnZhbHVlX25hbWUgPSAoZ2NoYXIgKikgZGVmaW5pdGlvbi0+bG9uZ19uYW1lOworCisgICAgICBpKys7CisgICAgfQorCisgICAgc21wdGVfdHJhbnNpdGlvbl90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFNNUFRFVHJhbnNpdGlvblR5cGUiLCBzbXB0ZV90cmFuc2l0aW9ucyk7CisgIH0KKyAgcmV0dXJuIHNtcHRlX3RyYW5zaXRpb25fdHlwZTsKK30KKworCitzdGF0aWMgdm9pZCBnc3Rfc21wdGVfZmluYWxpemUgKEdzdFNNUFRFICogc21wdGUpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfc21wdGVfY29sbGVjdGVkIChHc3RDb2xsZWN0UGFkcyAqIHBhZHMsCisgICAgR3N0U01QVEUgKiBzbXB0ZSk7CisKK3N0YXRpYyB2b2lkIGdzdF9zbXB0ZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3Rfc21wdGVfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3NtcHRlX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKKy8qc3RhdGljIGd1aW50IGdzdF9zbXB0ZV9zaWduYWxzW0xBU1RfU0lHTkFMXSA9IHsgMCB9OyAqLworCisjZGVmaW5lIGdzdF9zbXB0ZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RTTVBURSwgZ3N0X3NtcHRlLCBHU1RfVFlQRV9FTEVNRU5UKTsKKworc3RhdGljIHZvaWQKK2dzdF9zbXB0ZV9jbGFzc19pbml0IChHc3RTTVBURUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBwYXJlbnRfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3Rfc21wdGVfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfc21wdGVfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IChHT2JqZWN0RmluYWxpemVGdW5jKSBnc3Rfc21wdGVfZmluYWxpemU7CisKKyAgX2dzdF9tYXNrX2luaXQgKCk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9UWVBFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJ0eXBlIiwgIlR5cGUiLCAiVGhlIHR5cGUgb2YgdHJhbnNpdGlvbiB0byB1c2UiLAorICAgICAgICAgIEdTVF9UWVBFX1NNUFRFX1RSQU5TSVRJT05fVFlQRSwgREVGQVVMVF9QUk9QX1RZUEUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQk9SREVSLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImJvcmRlciIsICJCb3JkZXIiLAorICAgICAgICAgICJUaGUgYm9yZGVyIHdpZHRoIG9mIHRoZSB0cmFuc2l0aW9uIiwgMCwgR19NQVhJTlQsCisgICAgICAgICAgREVGQVVMVF9QUk9QX0JPUkRFUiwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfREVQVEgsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiZGVwdGgiLCAiRGVwdGgiLCAiRGVwdGggb2YgdGhlIG1hc2sgaW4gYml0cyIsIDEsIDI0LAorICAgICAgICAgIERFRkFVTFRfUFJPUF9ERVBUSCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfRFVSQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgiZHVyYXRpb24iLCAiRHVyYXRpb24iLAorICAgICAgICAgICJEdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiBlZmZlY3QgaW4gbmFub3NlY29uZHMiLCAwLCBHX01BWFVJTlQ2NCwKKyAgICAgICAgICBERUZBVUxUX1BST1BfRFVSQVRJT04sIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0lOVkVSVCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiaW52ZXJ0IiwgIkludmVydCIsCisgICAgICAgICAgIkludmVydCB0cmFuc2l0aW9uIG1hc2siLCBERUZBVUxUX1BST1BfSU5WRVJULAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc21wdGVfY2hhbmdlX3N0YXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfc21wdGVfc2luazFfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfc21wdGVfc2luazJfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfc21wdGVfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlNNUFRFIHRyYW5zaXRpb25zIiwKKyAgICAgICJGaWx0ZXIvRWRpdG9yL1ZpZGVvIiwKKyAgICAgICJBcHBseSB0aGUgc3RhbmRhcmQgU01QVEUgdHJhbnNpdGlvbnMgb24gdmlkZW8gaW1hZ2VzIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY2hlbGxvLmJlPiIpOworfQorCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdodCAgeWVsICBjeWEgIGdybiAgbWFnICByZWQgIGJsdSAgYmxrICAgLUkgICAgUSAqLworc3RhdGljIGNvbnN0IGludCB5X2NvbG9yc1tdID0geyAyNTUsIDIyNiwgMTc5LCAxNTAsIDEwNSwgNzYsIDI5LCAxNiwgMTYsIDAgfTsKK3N0YXRpYyBjb25zdCBpbnQgdV9jb2xvcnNbXSA9IHsgMTI4LCAwLCAxNzAsIDQ2LCAyMTIsIDg1LCAyNTUsIDEyOCwgMCwgMTI4IH07CitzdGF0aWMgY29uc3QgaW50IHZfY29sb3JzW10gPSB7IDEyOCwgMTU1LCAwLCAyMSwgMjM1LCAyNTUsIDEwNywgMTI4LCAxMjgsIDI1NSB9OworCitzdGF0aWMgdm9pZAorZmlsbF9pNDIwIChHc3RWaWRlb0luZm8gKiB2aW5mbywgZ3VpbnQ4ICogZGF0YSwgZ2ludCBoZWlnaHQsIGdpbnQgY29sb3IpCit7CisgIGdpbnQgc2l6ZSA9IEdTVF9WSURFT19JTkZPX0NPTVBfU1RSSURFICh2aW5mbywgMCkgKiBHU1RfUk9VTkRfVVBfMiAoaGVpZ2h0KTsKKyAgZ2ludCBzaXplNCA9IHNpemUgPj4gMjsKKyAgZ3VpbnQ4ICp5cCA9IGRhdGE7CisgIGd1aW50OCAqdXAgPSBkYXRhICsgR1NUX1ZJREVPX0lORk9fQ09NUF9PRkZTRVQgKHZpbmZvLCAxKTsKKyAgZ3VpbnQ4ICp2cCA9IGRhdGEgKyBHU1RfVklERU9fSU5GT19DT01QX09GRlNFVCAodmluZm8sIDIpOworCisgIG1lbXNldCAoeXAsIHlfY29sb3JzW2NvbG9yXSwgc2l6ZSk7CisgIG1lbXNldCAodXAsIHVfY29sb3JzW2NvbG9yXSwgc2l6ZTQpOworICBtZW1zZXQgKHZwLCB2X2NvbG9yc1tjb2xvcl0sIHNpemU0KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc21wdGVfdXBkYXRlX21hc2sgKEdzdFNNUFRFICogc21wdGUsIGdpbnQgdHlwZSwgZ2Jvb2xlYW4gaW52ZXJ0LAorICAgIGdpbnQgZGVwdGgsIGdpbnQgd2lkdGgsIGdpbnQgaGVpZ2h0KQoreworICBHc3RNYXNrICpuZXdtYXNrOworCisgIGlmIChzbXB0ZS0+bWFzaykgeworICAgIGlmIChzbXB0ZS0+dHlwZSA9PSB0eXBlICYmCisgICAgICAgIHNtcHRlLT5pbnZlcnQgPT0gaW52ZXJ0ICYmCisgICAgICAgIHNtcHRlLT5kZXB0aCA9PSBkZXB0aCAmJgorICAgICAgICBzbXB0ZS0+d2lkdGggPT0gd2lkdGggJiYgc21wdGUtPmhlaWdodCA9PSBoZWlnaHQpCisgICAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIG5ld21hc2sgPSBnc3RfbWFza19mYWN0b3J5X25ldyAodHlwZSwgaW52ZXJ0LCBkZXB0aCwgd2lkdGgsIGhlaWdodCk7CisgIGlmIChuZXdtYXNrKSB7CisgICAgaWYgKHNtcHRlLT5tYXNrKSB7CisgICAgICBnc3RfbWFza19kZXN0cm95IChzbXB0ZS0+bWFzayk7CisgICAgfQorICAgIHNtcHRlLT5tYXNrID0gbmV3bWFzazsKKyAgICBzbXB0ZS0+dHlwZSA9IHR5cGU7CisgICAgc21wdGUtPmludmVydCA9IGludmVydDsKKyAgICBzbXB0ZS0+ZGVwdGggPSBkZXB0aDsKKyAgICBzbXB0ZS0+d2lkdGggPSB3aWR0aDsKKyAgICBzbXB0ZS0+aGVpZ2h0ID0gaGVpZ2h0OworCisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zbXB0ZV9zZXRjYXBzIChHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTTVBURSAqc21wdGU7CisgIGdib29sZWFuIHJldDsKKyAgR3N0VmlkZW9JbmZvIHZpbmZvOworCisgIHNtcHRlID0gR1NUX1NNUFRFIChHU1RfUEFEX1BBUkVOVCAocGFkKSk7CisKKyAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoJnZpbmZvKTsKKyAgaWYgKCFnc3RfdmlkZW9faW5mb19mcm9tX2NhcHMgKCZ2aW5mbywgY2FwcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHNtcHRlLT53aWR0aCA9IEdTVF9WSURFT19JTkZPX1dJRFRIICgmdmluZm8pOworICBzbXB0ZS0+aGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUICgmdmluZm8pOworICBzbXB0ZS0+ZnBzX251bSA9IEdTVF9WSURFT19JTkZPX0ZQU19OICgmdmluZm8pOworICBzbXB0ZS0+ZnBzX2Rlbm9tID0gR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZ2aW5mbyk7CisKKyAgLyogZmlndXJlIG91dCB0aGUgZHVyYXRpb24gaW4gZnJhbWVzICovCisgIHNtcHRlLT5lbmRfcG9zaXRpb24gPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHNtcHRlLT5kdXJhdGlvbiwKKyAgICAgIHNtcHRlLT5mcHNfbnVtLCBHU1RfU0VDT05EICogc21wdGUtPmZwc19kZW5vbSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc21wdGUsICJkdXJhdGlvbjogJWQgZnJhbWVzIiwgc21wdGUtPmVuZF9wb3NpdGlvbik7CisKKyAgcmV0ID0KKyAgICAgIGdzdF9zbXB0ZV91cGRhdGVfbWFzayAoc21wdGUsIHNtcHRlLT50eXBlLCBzbXB0ZS0+aW52ZXJ0LCBzbXB0ZS0+ZGVwdGgsCisgICAgICBzbXB0ZS0+d2lkdGgsIHNtcHRlLT5oZWlnaHQpOworCisgIGlmIChwYWQgPT0gc21wdGUtPnNpbmtwYWQxKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc21wdGUsICJzZXR0aW5nIHBhZDEgaW5mbyIpOworICAgIHNtcHRlLT52aW5mbzEgPSB2aW5mbzsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzbXB0ZSwgInNldHRpbmcgcGFkMiBpbmZvIik7CisgICAgc21wdGUtPnZpbmZvMiA9IHZpbmZvOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc21wdGVfc2lua19ldmVudCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLAorICAgIEdzdENvbGxlY3REYXRhICogZGF0YSwgR3N0RXZlbnQgKiBldmVudCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RQYWQgKnBhZDsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgcGFkID0gZGF0YS0+cGFkOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICByZXQgPSBnc3Rfc21wdGVfc2V0Y2FwcyAocGFkLCBjYXBzKTsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgZXZlbnQgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChldmVudCAhPSBOVUxMKQorICAgIHJldHVybiBnc3RfY29sbGVjdF9wYWRzX2V2ZW50X2RlZmF1bHQgKHBhZHMsIGRhdGEsIGV2ZW50LCBGQUxTRSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zbXB0ZV9pbml0IChHc3RTTVBURSAqIHNtcHRlKQoreworICBzbXB0ZS0+c2lua3BhZDEgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZnc3Rfc21wdGVfc2luazFfdGVtcGxhdGUsICJzaW5rMSIpOworICBHU1RfUEFEX1NFVF9QUk9YWV9DQVBTIChzbXB0ZS0+c2lua3BhZDEpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoc21wdGUpLCBzbXB0ZS0+c2lua3BhZDEpOworCisgIHNtcHRlLT5zaW5rcGFkMiA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJmdzdF9zbXB0ZV9zaW5rMl90ZW1wbGF0ZSwgInNpbmsyIik7CisgIEdTVF9QQURfU0VUX1BST1hZX0NBUFMgKHNtcHRlLT5zaW5rcGFkMik7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzbXB0ZSksIHNtcHRlLT5zaW5rcGFkMik7CisKKyAgc21wdGUtPnNyY3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJmdzdF9zbXB0ZV9zcmNfdGVtcGxhdGUsICJzcmMiKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKHNtcHRlKSwgc21wdGUtPnNyY3BhZCk7CisKKyAgc21wdGUtPmNvbGxlY3QgPSBnc3RfY29sbGVjdF9wYWRzX25ldyAoKTsKKyAgZ3N0X2NvbGxlY3RfcGFkc19zZXRfZnVuY3Rpb24gKHNtcHRlLT5jb2xsZWN0LAorICAgICAgKEdzdENvbGxlY3RQYWRzRnVuY3Rpb24pIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc21wdGVfY29sbGVjdGVkKSwgc21wdGUpOworICBnc3RfY29sbGVjdF9wYWRzX3NldF9ldmVudF9mdW5jdGlvbiAoc21wdGUtPmNvbGxlY3QsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NtcHRlX3NpbmtfZXZlbnQpLCBzbXB0ZSk7CisKKyAgZ3N0X2NvbGxlY3RfcGFkc19hZGRfcGFkIChzbXB0ZS0+Y29sbGVjdCwgc21wdGUtPnNpbmtwYWQxLAorICAgICAgc2l6ZW9mIChHc3RDb2xsZWN0RGF0YSksIE5VTEwsIFRSVUUpOworICBnc3RfY29sbGVjdF9wYWRzX2FkZF9wYWQgKHNtcHRlLT5jb2xsZWN0LCBzbXB0ZS0+c2lua3BhZDIsCisgICAgICBzaXplb2YgKEdzdENvbGxlY3REYXRhKSwgTlVMTCwgVFJVRSk7CisKKyAgc21wdGUtPnR5cGUgPSBERUZBVUxUX1BST1BfVFlQRTsKKyAgc21wdGUtPmJvcmRlciA9IERFRkFVTFRfUFJPUF9CT1JERVI7CisgIHNtcHRlLT5kZXB0aCA9IERFRkFVTFRfUFJPUF9ERVBUSDsKKyAgc21wdGUtPmR1cmF0aW9uID0gREVGQVVMVF9QUk9QX0RVUkFUSU9OOworICBzbXB0ZS0+aW52ZXJ0ID0gREVGQVVMVF9QUk9QX0lOVkVSVDsKKyAgc21wdGUtPmZwc19udW0gPSAwOworICBzbXB0ZS0+ZnBzX2Rlbm9tID0gMTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zbXB0ZV9maW5hbGl6ZSAoR3N0U01QVEUgKiBzbXB0ZSkKK3sKKyAgaWYgKHNtcHRlLT5jb2xsZWN0KSB7CisgICAgZ3N0X29iamVjdF91bnJlZiAoc21wdGUtPmNvbGxlY3QpOworICB9CisgIGlmIChzbXB0ZS0+bWFzaykgeworICAgIGdzdF9tYXNrX2Rlc3Ryb3kgKHNtcHRlLT5tYXNrKTsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAoKEdPYmplY3QgKikgc21wdGUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NtcHRlX3Jlc2V0IChHc3RTTVBURSAqIHNtcHRlKQoreworICBzbXB0ZS0+d2lkdGggPSAtMTsKKyAgc21wdGUtPmhlaWdodCA9IC0xOworICBzbXB0ZS0+cG9zaXRpb24gPSAwOworICBzbXB0ZS0+ZW5kX3Bvc2l0aW9uID0gMDsKKyAgc21wdGUtPnNlbmRfc3RyZWFtX3N0YXJ0ID0gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zbXB0ZV9ibGVuZF9pNDIwIChHc3RWaWRlb0ZyYW1lICogZnJhbWUxLCBHc3RWaWRlb0ZyYW1lICogZnJhbWUyLAorICAgIEdzdFZpZGVvRnJhbWUgKiBvZnJhbWUsIEdzdE1hc2sgKiBtYXNrLCBnaW50IGJvcmRlciwgZ2ludCBwb3MpCit7CisgIGd1aW50MzIgKm1hc2twOworICBnaW50IHZhbHVlOworICBnaW50IGksIGo7CisgIGdpbnQgbWluLCBtYXg7CisgIGd1aW50OCAqaW4xLCAqaW4yLCAqb3V0LCAqaW4xdSwgKmluMXYsICppbjJ1LCAqaW4ydiwgKm91dHUsICpvdXR2OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgaWYgKGJvcmRlciA9PSAwKQorICAgIGJvcmRlcisrOworCisgIG1pbiA9IHBvcyAtIGJvcmRlcjsKKyAgbWF4ID0gcG9zOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChmcmFtZTEpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChmcmFtZTEpOworCisgIGluMSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lMSwgMCk7CisgIGluMiA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lMiwgMCk7CisgIG91dCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKG9mcmFtZSwgMCk7CisKKyAgaW4xdSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lMSwgMSk7CisgIGluMXYgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZTEsIDIpOworICBpbjJ1ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZnJhbWUyLCAxKTsKKyAgaW4ydiA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lMiwgMik7CisgIG91dHUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChvZnJhbWUsIDEpOworICBvdXR2ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAob2ZyYW1lLCAyKTsKKworICBtYXNrcCA9IG1hc2stPmRhdGE7CisKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgIHZhbHVlID0gKm1hc2twKys7CisgICAgICB2YWx1ZSA9ICgoQ0xBTVAgKHZhbHVlLCBtaW4sIG1heCkgLSBtaW4pIDw8IDgpIC8gYm9yZGVyOworCisgICAgICBvdXRbal0gPSAoKGluMVtqXSAqIHZhbHVlKSArIChpbjJbal0gKiAoMjU2IC0gdmFsdWUpKSkgPj4gODsKKyAgICAgIGlmICghKGkgJiAxKSAmJiAhKGogJiAxKSkgeworICAgICAgICBvdXR1W2ogLyAyXSA9CisgICAgICAgICAgICAoKGluMXVbaiAvIDJdICogdmFsdWUpICsgKGluMnVbaiAvIDJdICogKDI1NiAtIHZhbHVlKSkpID4+IDg7CisgICAgICAgIG91dHZbaiAvIDJdID0KKyAgICAgICAgICAgICgoaW4xdltqIC8gMl0gKiB2YWx1ZSkgKyAoaW4ydltqIC8gMl0gKiAoMjU2IC0gdmFsdWUpKSkgPj4gODsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbjEgKz0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChmcmFtZTEsIDApOworICAgIGluMiArPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lMiwgMCk7CisgICAgb3V0ICs9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAob2ZyYW1lLCAwKTsKKworICAgIGlmICghKGkgJiAxKSkgeworICAgICAgaW4xdSArPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lMSwgMSk7CisgICAgICBpbjJ1ICs9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUyLCAxKTsKKyAgICAgIGluMXYgKz0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChmcmFtZTEsIDIpOworICAgICAgaW4ydiArPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lMSwgMik7CisgICAgICBvdXR1ICs9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAob2ZyYW1lLCAxKTsKKyAgICAgIG91dHYgKz0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChvZnJhbWUsIDIpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NtcHRlX2NvbGxlY3RlZCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLCBHc3RTTVBURSAqIHNtcHRlKQoreworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0Q2xvY2tUaW1lIHRzOworICBHc3RCdWZmZXIgKmluMSA9IE5VTEwsICppbjIgPSBOVUxMOworICBHU0xpc3QgKmNvbGxlY3RlZDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdFZpZGVvRnJhbWUgZnJhbWUxLCBmcmFtZTIsIG9mcmFtZTsKKworICBpZiAoR19VTkxJS0VMWSAoc21wdGUtPmZwc19udW0gPT0gMCkpCisgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKworICBpZiAoIWdzdF9wYWRfaGFzX2N1cnJlbnRfY2FwcyAoc21wdGUtPnNpbmtwYWQxKSB8fAorICAgICAgIWdzdF9wYWRfaGFzX2N1cnJlbnRfY2FwcyAoc21wdGUtPnNpbmtwYWQyKSkKKyAgICBnb3RvIG5vdF9uZWdvdGlhdGVkOworCisgIGlmICghZ3N0X3ZpZGVvX2luZm9faXNfZXF1YWwgKCZzbXB0ZS0+dmluZm8xLCAmc21wdGUtPnZpbmZvMikpCisgICAgZ290byBpbnB1dF9mb3JtYXRzX2RvX25vdF9tYXRjaDsKKworICBpZiAoc21wdGUtPnNlbmRfc3RyZWFtX3N0YXJ0KSB7CisgICAgZ2NoYXIgc19pZFszMl07CisKKyAgICAvKiBzdHJlYW0tc3RhcnQgKEZJWE1FOiBjcmVhdGUgaWQgYmFzZWQgb24gaW5wdXQgaWRzKSAqLworICAgIGdfc25wcmludGYgKHNfaWQsIHNpemVvZiAoc19pZCksICJzbXB0ZS0lMDh4IiwgZ19yYW5kb21faW50ICgpKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNtcHRlLT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0IChzX2lkKSk7CisgICAgc21wdGUtPnNlbmRfc3RyZWFtX3N0YXJ0ID0gRkFMU0U7CisgIH0KKworICB0cyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHNtcHRlLT5wb3NpdGlvbiAqIEdTVF9TRUNPTkQsCisgICAgICBzbXB0ZS0+ZnBzX2Rlbm9tLCBzbXB0ZS0+ZnBzX251bSk7CisKKyAgZm9yIChjb2xsZWN0ZWQgPSBwYWRzLT5kYXRhOyBjb2xsZWN0ZWQ7IGNvbGxlY3RlZCA9IGdfc2xpc3RfbmV4dCAoY29sbGVjdGVkKSkgeworICAgIEdzdENvbGxlY3REYXRhICpkYXRhOworCisgICAgZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSBjb2xsZWN0ZWQtPmRhdGE7CisKKyAgICBpZiAoZGF0YS0+cGFkID09IHNtcHRlLT5zaW5rcGFkMSkKKyAgICAgIGluMSA9IGdzdF9jb2xsZWN0X3BhZHNfcG9wIChwYWRzLCBkYXRhKTsKKyAgICBlbHNlIGlmIChkYXRhLT5wYWQgPT0gc21wdGUtPnNpbmtwYWQyKQorICAgICAgaW4yID0gZ3N0X2NvbGxlY3RfcGFkc19wb3AgKHBhZHMsIGRhdGEpOworICB9CisKKyAgaWYgKGluMSA9PSBOVUxMKSB7CisgICAgLyogaWYgbm8gaW5wdXQsIG1ha2UgcGljdHVyZSBibGFjayAqLworICAgIGluMSA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoR1NUX1ZJREVPX0lORk9fU0laRSAoJnNtcHRlLT52aW5mbzEpKTsKKyAgICBnc3RfYnVmZmVyX21hcCAoaW4xLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICBmaWxsX2k0MjAgKCZzbXB0ZS0+dmluZm8xLCBtYXAuZGF0YSwgc21wdGUtPmhlaWdodCwgNyk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoaW4xLCAmbWFwKTsKKyAgfQorICBpZiAoaW4yID09IE5VTEwpIHsKKyAgICAvKiBpZiBubyBpbnB1dCwgbWFrZSBwaWN0dXJlIHdoaXRlICovCisgICAgaW4yID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChHU1RfVklERU9fSU5GT19TSVpFICgmc21wdGUtPnZpbmZvMikpOworICAgIGdzdF9idWZmZXJfbWFwIChpbjIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgIGZpbGxfaTQyMCAoJnNtcHRlLT52aW5mbzIsIG1hcC5kYXRhLCBzbXB0ZS0+aGVpZ2h0LCAwKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChpbjIsICZtYXApOworICB9CisKKyAgaWYgKHNtcHRlLT5wb3NpdGlvbiA8IHNtcHRlLT5lbmRfcG9zaXRpb24pIHsKKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKEdTVF9WSURFT19JTkZPX1NJWkUgKCZzbXB0ZS0+dmluZm8xKSk7CisKKyAgICAvKiBzZXQgY2FwcyBpZiBub3QgZG9uZSB5ZXQgKi8KKyAgICBpZiAoIWdzdF9wYWRfaGFzX2N1cnJlbnRfY2FwcyAoc21wdGUtPnNyY3BhZCkpIHsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisgICAgICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgICAgIGNhcHMgPSBnc3RfdmlkZW9faW5mb190b19jYXBzICgmc21wdGUtPnZpbmZvMSk7CisKKyAgICAgIGdzdF9wYWRfc2V0X2NhcHMgKHNtcHRlLT5zcmNwYWQsIGNhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc21wdGUtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworICAgIH0KKworICAgIGdzdF92aWRlb19mcmFtZV9tYXAgKCZmcmFtZTEsICZzbXB0ZS0+dmluZm8xLCBpbjEsIEdTVF9NQVBfUkVBRCk7CisgICAgZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJmZyYW1lMiwgJnNtcHRlLT52aW5mbzIsIGluMiwgR1NUX01BUF9SRUFEKTsKKyAgICAvKiByZS11c2UgZWl0aGVyIGluZm8sIG5vdyBrbm93IHRoZXkgYXJlIGVzc2VudGlhbGx5IGlkZW50aWNhbCAqLworICAgIGdzdF92aWRlb19mcmFtZV9tYXAgKCZvZnJhbWUsICZzbXB0ZS0+dmluZm8xLCBvdXRidWYsIEdTVF9NQVBfV1JJVEUpOworICAgIGdzdF9zbXB0ZV9ibGVuZF9pNDIwICgmZnJhbWUxLCAmZnJhbWUyLCAmb2ZyYW1lLCBzbXB0ZS0+bWFzaywgc21wdGUtPmJvcmRlciwKKyAgICAgICAgKCgxIDw8IHNtcHRlLT5kZXB0aCkgKyBzbXB0ZS0+Ym9yZGVyKSAqCisgICAgICAgIHNtcHRlLT5wb3NpdGlvbiAvIHNtcHRlLT5lbmRfcG9zaXRpb24pOworICAgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJmZyYW1lMSk7CisgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmZnJhbWUyKTsKKyAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKCZvZnJhbWUpOworICB9IGVsc2UgeworICAgIG91dGJ1ZiA9IGluMjsKKyAgICBnc3RfYnVmZmVyX3JlZiAoaW4yKTsKKyAgfQorCisgIHNtcHRlLT5wb3NpdGlvbisrOworCisgIGlmIChpbjEpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoaW4xKTsKKyAgaWYgKGluMikKKyAgICBnc3RfYnVmZmVyX3VucmVmIChpbjIpOworCisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpID0gdHM7CisKKyAgcmV0dXJuIGdzdF9wYWRfcHVzaCAoc21wdGUtPnNyY3BhZCwgb3V0YnVmKTsKKworICAvKiBFUlJPUlMgKi8KK25vdF9uZWdvdGlhdGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNtcHRlLCBDT1JFLCBORUdPVElBVElPTiwgKE5VTEwpLAorICAgICAgICAoIk5vIGlucHV0IGZvcm1hdCBuZWdvdGlhdGVkIikpOworICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgfQoraW5wdXRfZm9ybWF0c19kb19ub3RfbWF0Y2g6CisgIHsKKyAgICBHc3RDYXBzICpjYXBzMSwgKmNhcHMyOworCisgICAgY2FwczEgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHNtcHRlLT5zaW5rcGFkMSk7CisgICAgY2FwczIgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHNtcHRlLT5zaW5rcGFkMik7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNtcHRlLCBDT1JFLCBORUdPVElBVElPTiwgKE5VTEwpLAorICAgICAgICAoImlucHV0IGZvcm1hdHMgZG9uJ3QgbWF0Y2g6ICUiIEdTVF9QVFJfRk9STUFUICIgdnMuICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICAgICAgY2FwczEsIGNhcHMyKSk7CisgICAgaWYgKGNhcHMxKQorICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMxKTsKKyAgICBpZiAoY2FwczIpCisgICAgICBnc3RfY2Fwc191bnJlZiAoY2FwczIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3NtcHRlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTTVBURSAqc21wdGU7CisKKyAgc21wdGUgPSBHU1RfU01QVEUgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1RZUEU6CisgICAgICBzbXB0ZS0+dHlwZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CT1JERVI6CisgICAgICBzbXB0ZS0+Ym9yZGVyID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfREVQVEg6CisgICAgICBzbXB0ZS0+ZGVwdGggPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9EVVJBVElPTjoKKyAgICAgIHNtcHRlLT5kdXJhdGlvbiA9IGdfdmFsdWVfZ2V0X3VpbnQ2NCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0lOVkVSVDoKKyAgICAgIHNtcHRlLT5pbnZlcnQgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc21wdGVfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFNNUFRFICpzbXB0ZTsKKworICBzbXB0ZSA9IEdTVF9TTVBURSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfVFlQRToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBzbXB0ZS0+dHlwZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQk9SREVSOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgc21wdGUtPmJvcmRlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfREVQVEg6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBzbXB0ZS0+ZGVwdGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RVUkFUSU9OOgorICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgc21wdGUtPmR1cmF0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JTlZFUlQ6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgc21wdGUtPmludmVydCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3NtcHRlX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0U01QVEUgKnNtcHRlOworCisgIHNtcHRlID0gR1NUX1NNUFRFIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X3NtcHRlX3Jlc2V0IChzbXB0ZSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc21wdGUsICJzdGFydGluZyBjb2xsZWN0cGFkcyIpOworICAgICAgZ3N0X2NvbGxlY3RfcGFkc19zdGFydCAoc21wdGUtPmNvbGxlY3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzbXB0ZSwgInN0b3BwaW5nIGNvbGxlY3RwYWRzIik7CisgICAgICBnc3RfY29sbGVjdF9wYWRzX3N0b3AgKHNtcHRlLT5jb2xsZWN0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3Rfc21wdGVfcmVzZXQgKHNtcHRlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3NtcHRlX3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3Rfc21wdGVfZGVidWcsICJzbXB0ZSIsIDAsCisgICAgICAiU01QVEUgdHJhbnNpdGlvbiBlZmZlY3QiKTsKKworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInNtcHRlIiwgR1NUX1JBTktfTk9ORSwgR1NUX1RZUEVfU01QVEUpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3NtcHRlL2dzdHNtcHRlLmggYi9nc3Qvc21wdGUvZ3N0c21wdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDM5OTQyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3NtcHRlL2dzdHNtcHRlLmgKQEAgLTAsMCArMSw4NSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9TTVBURV9IX18KKyNkZWZpbmUgX19HU1RfU01QVEVfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Y29sbGVjdHBhZHMuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworR19CRUdJTl9ERUNMUworCisjaW5jbHVkZSAiZ3N0bWFzay5oIgorCisjZGVmaW5lIEdTVF9UWVBFX1NNUFRFIFwKKyAgKGdzdF9zbXB0ZV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfU01QVEUob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9TTVBURSxHc3RTTVBURSkpCisjZGVmaW5lIEdTVF9TTVBURV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9TTVBURSxHc3RTTVBURUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1NNUFRFKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfU01QVEUpKQorI2RlZmluZSBHU1RfSVNfU01QVEVfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfU01QVEUpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0U01QVEUgR3N0U01QVEU7Cit0eXBlZGVmIHN0cnVjdCBfR3N0U01QVEVDbGFzcyBHc3RTTVBURUNsYXNzOworCitzdHJ1Y3QgX0dzdFNNUFRFIHsKKyAgR3N0RWxlbWVudCAgICAgZWxlbWVudDsKKworICAvKiBwYWRzICovCisgIEdzdFBhZCAgICAgICAgKnNyY3BhZCwKKyAgICAgICAgICAgICAgICAqc2lua3BhZDEsCisgICAgICAgICAgICAgICAgKnNpbmtwYWQyOworICBHc3RDb2xsZWN0UGFkcyAqY29sbGVjdDsKKyAgZ2Jvb2xlYW4gICAgICAgIHNlbmRfc3RyZWFtX3N0YXJ0OworCisgIC8qIHByb3BlcnRpZXMgKi8KKyAgZ2ludCAgICAgICAgICAgdHlwZTsKKyAgZ2ludCAgICAgICAgICAgYm9yZGVyOworICBnaW50ICAgICAgICAgICBkZXB0aDsKKyAgZ3VpbnQ2NCAgICAgICAgZHVyYXRpb247CisgIGdib29sZWFuICAgICAgIGludmVydDsKKworICAvKiBuZWdvdGlhdGVkIGZvcm1hdCAqLworICBnaW50ICAgICAgICAgICB3aWR0aDsKKyAgZ2ludCAgICAgICAgICAgaGVpZ2h0OworICBnaW50ICAgICAgICAgICBmcHNfbnVtOworICBnaW50ICAgICAgICAgICBmcHNfZGVub207CisgIEdzdFZpZGVvSW5mbyAgIHZpbmZvMTsKKyAgR3N0VmlkZW9JbmZvICAgdmluZm8yOworCisgIC8qIHN0YXRlIG9mIHRoZSBlZmZlY3QgKi8KKyAgZ2ludCAgICAgICAgICAgcG9zaXRpb247CisgIGdpbnQgICAgICAgICAgIGVuZF9wb3NpdGlvbjsKKyAgR3N0TWFzayAgICAgICAqbWFzazsKK307CisKK3N0cnVjdCBfR3N0U01QVEVDbGFzcyB7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3Rfc21wdGVfZ2V0X3R5cGUgKHZvaWQpOworZ2Jvb2xlYW4gZ3N0X3NtcHRlX3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1NNUFRFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3NtcHRlL2dzdHNtcHRlYWxwaGEuYyBiL2dzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwNzQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmMKQEAgLTAsMCArMSw4MTEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOD4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1zbXB0ZWFscGhhCisgKgorICogc21wdGVhbHBoYSBjYW4gYWNjZXB0IGFuIEk0MjAgb3IgQVlVViB2aWRlbyBzdHJlYW0uIEFuIGFscGhhIGNoYW5uZWwgaXMgYWRkZWQKKyAqIHVzaW5nIGFuIGVmZmVjdCBzcGVjaWZpYyBTTVBURSBtYXNrIGluIHRoZSBJNDIwIGlucHV0IGNhc2UuIEluIHRoZSBBWVVWIGNhc2UsCisgKiB0aGUgYWxwaGEgY2hhbm5lbCBpcyBtb2RpZmllZCB1c2luZyB0aGUgZWZmZWN0IHNwZWNpZmljIFNNUFRFIG1hc2suCisgKgorICogVGhlICNHc3RTbXB0ZUFscGhhOnBvc2l0aW9uIHByb3BlcnR5IGlzIGEgY29udHJvbGxhYmUgZG91YmxlIGJldHdlZW4gMC4wIGFuZAorICogMS4wIHRoYXQgc3BlY2lmaWVzIHRoZSBwb3NpdGlvbiBpbiB0aGUgdHJhbnNpdGlvbi4gMC4wIGlzIHRoZSBzdGFydCBvZiB0aGUKKyAqIHRyYW5zaXRpb24gd2l0aCB0aGUgYWxwaGEgY2hhbm5lbCB0byBjb21wbGV0ZSBvcGFxdWUgd2hlcmUgMS4wIGhhcyB0aGUgYWxwaGEKKyAqIGNoYW5uZWwgc2V0IHRvIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQuCisgKgorICogVGhlICNHc3RTbXB0ZUFscGhhOmRlcHRoIHByb3BlcnR5IGRlZmluZXMgdGhlIHByZWNpc2lvbiBpbiBiaXRzIG9mIHRoZSBtYXNrLgorICogQSBoaWdoZXIgcHJlc2lzaW9uIHdpbGwgY3JlYXRlIGEgbWFzayB3aXRoIHNtb290aGVyIGdyYWRpZW50cyBpbiBvcmRlciB0bworICogYXZvaWQgYmFuZGluZy4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+U2FtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiA8cGFyYT4KKyAqIEhlcmUgaXMgYSBwaXBlbGluZSB0byBkZW1vbnN0cmF0ZSB0aGUgc21wdGUgdHJhbnNpdGlvbiA6CisgKiA8cHJvZ3JhbWxpc3Rpbmc+CisgKiBnc3QtbGF1bmNoLTEuMCAtdiB2aWRlb3Rlc3RzcmMgISBzbXB0ZWFscGhhIGJvcmRlcj0yMDAwMCB0eXBlPTQ0CisgKiBwb3NpdGlvbj0wLjUgISB2aWRlb21peGVyICEgdmlkZW9jb252ZXJ0ICEgeGltYWdlc2luaworICogPC9wcm9ncmFtbGlzdGluZz4KKyAqIFRoaXMgc2hvd3MgYSBtaWR3YXkgYm93dGllLWggdHJhbnNpdGlvbiBhIGZyb20gYSB2aWRlb3Rlc3RzcmMgdG8gYQorICogdHJhbnNwYXJlbnQgaW1hZ2UuIFRoZSBlZGdlcyBvZiB0aGUgdHJhbnNpdGlvbiBhcmUgc21vb3RoZWQgd2l0aCBhCisgKiAyMDAwMCBiaWcgYm9yZGVyLgorICogPC9wYXJhPgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RzbXB0ZWFscGhhLmgiCisjaW5jbHVkZSAicGFpbnQuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3NtcHRlX2FscGhhX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9zbXB0ZV9hbHBoYV9kZWJ1ZworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3NtcHRlX2FscGhhX3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoIkFZVVYiKSAiOyIKKyAgICAgICAgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIkFSR0IiKSAiOyIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIkJHUkEiKSAiOyIKKyAgICAgICAgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIlJHQkEiKSAiOyIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIkFSR0IiKSkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3NtcHRlX2FscGhhX3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoIkk0MjAiKSAiOyIKKyAgICAgICAgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIllWMTIiKQorICAgICAgICAiOyIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIkFZVVYiKQorICAgICAgICAiOyIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIkFSR0IiKSAiOyIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIkJHUkEiKQorICAgICAgICAiOyIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIlJHQkEiKSAiOyIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIkFSR0IiKSkKKyAgICApOworCisvKiBTTVBURSBzaWduYWxzIGFuZCBwcm9wZXJ0aWVzICovCisKKyNkZWZpbmUgREVGQVVMVF9QUk9QX1RZUEUJMQorI2RlZmluZSBERUZBVUxUX1BST1BfQk9SREVSCTAKKyNkZWZpbmUgREVGQVVMVF9QUk9QX0RFUFRICTE2CisjZGVmaW5lIERFRkFVTFRfUFJPUF9QT1NJVElPTgkwLjAKKyNkZWZpbmUgREVGQVVMVF9QUk9QX0lOVkVSVCAgIEZBTFNFCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX1RZUEUsCisgIFBST1BfQk9SREVSLAorICBQUk9QX0RFUFRILAorICBQUk9QX1BPU0lUSU9OLAorICBQUk9QX0lOVkVSVAorfTsKKworI2RlZmluZSBBWVVWX1NJWkUodyxoKSAgICAgKCh3KSAqIChoKSAqIDQpCisKKyNkZWZpbmUgR1NUX1RZUEVfU01QVEVfVFJBTlNJVElPTl9UWVBFIChnc3Rfc21wdGVfYWxwaGFfdHJhbnNpdGlvbl90eXBlX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9zbXB0ZV9hbHBoYV90cmFuc2l0aW9uX3R5cGVfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBzbXB0ZV90cmFuc2l0aW9uX3R5cGUgPSAwOworICBHRW51bVZhbHVlICpzbXB0ZV90cmFuc2l0aW9uczsKKworICBpZiAoIXNtcHRlX3RyYW5zaXRpb25fdHlwZSkgeworICAgIGNvbnN0IEdMaXN0ICpkZWZpbml0aW9uczsKKyAgICBnaW50IGkgPSAwOworCisgICAgZGVmaW5pdGlvbnMgPSBnc3RfbWFza19nZXRfZGVmaW5pdGlvbnMgKCk7CisgICAgc21wdGVfdHJhbnNpdGlvbnMgPQorICAgICAgICBnX25ldzAgKEdFbnVtVmFsdWUsIGdfbGlzdF9sZW5ndGggKChHTGlzdCAqKSBkZWZpbml0aW9ucykgKyAxKTsKKworICAgIHdoaWxlIChkZWZpbml0aW9ucykgeworICAgICAgR3N0TWFza0RlZmluaXRpb24gKmRlZmluaXRpb24gPSAoR3N0TWFza0RlZmluaXRpb24gKikgZGVmaW5pdGlvbnMtPmRhdGE7CisKKyAgICAgIGRlZmluaXRpb25zID0gZ19saXN0X25leHQgKGRlZmluaXRpb25zKTsKKworICAgICAgc21wdGVfdHJhbnNpdGlvbnNbaV0udmFsdWUgPSBkZWZpbml0aW9uLT50eXBlOworICAgICAgLyogb2xkZXIgR0xpYiB2ZXJzaW9ucyBoYXZlIHRoZSB0d28gZmllbGRzIGFzIG5vbi1jb25zdCwgaGVuY2UgdGhlIGNhc3QgKi8KKyAgICAgIHNtcHRlX3RyYW5zaXRpb25zW2ldLnZhbHVlX25pY2sgPSAoZ2NoYXIgKikgZGVmaW5pdGlvbi0+c2hvcnRfbmFtZTsKKyAgICAgIHNtcHRlX3RyYW5zaXRpb25zW2ldLnZhbHVlX25hbWUgPSAoZ2NoYXIgKikgZGVmaW5pdGlvbi0+bG9uZ19uYW1lOworCisgICAgICBpKys7CisgICAgfQorCisgICAgc21wdGVfdHJhbnNpdGlvbl90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFNNUFRFQWxwaGFUcmFuc2l0aW9uVHlwZSIsCisgICAgICAgIHNtcHRlX3RyYW5zaXRpb25zKTsKKyAgfQorICByZXR1cm4gc21wdGVfdHJhbnNpdGlvbl90eXBlOworfQorCisKK3N0YXRpYyB2b2lkIGdzdF9zbXB0ZV9hbHBoYV9maW5hbGl6ZSAoR3N0U01QVEVBbHBoYSAqIHNtcHRlKTsKKworc3RhdGljIHZvaWQgZ3N0X3NtcHRlX2FscGhhX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9zbXB0ZV9hbHBoYV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc21wdGVfYWxwaGFfc2V0X2luZm8gKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwKKyAgICBHc3RDYXBzICogaW5jYXBzLCBHc3RWaWRlb0luZm8gKiBpbl9pbmZvLAorICAgIEdzdENhcHMgKiBvdXRjYXBzLCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfc21wdGVfYWxwaGFfdHJhbnNmb3JtX2ZyYW1lIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsCisgICAgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLCBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lKTsKK3N0YXRpYyB2b2lkIGdzdF9zbXB0ZV9hbHBoYV9iZWZvcmVfdHJhbnNmb3JtIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0QnVmZmVyICogYnVmKTsKK3N0YXRpYyBHc3RDYXBzICpnc3Rfc21wdGVfYWxwaGFfdHJhbnNmb3JtX2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLCBHc3RDYXBzICogZnJvbSwgR3N0Q2FwcyAqIGZpbHRlcik7CisKKyNkZWZpbmUgZ3N0X3NtcHRlX2FscGhhX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFNNUFRFQWxwaGEsIGdzdF9zbXB0ZV9hbHBoYSwgR1NUX1RZUEVfVklERU9fRklMVEVSKTsKKworc3RhdGljIHZvaWQKK2dzdF9zbXB0ZV9hbHBoYV9jbGFzc19pbml0IChHc3RTTVBURUFscGhhQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSAoa2xhc3MpOworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKnRyYW5zX2NsYXNzID0gKEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqKSBrbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzcyA9IChHc3RWaWRlb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9zbXB0ZV9hbHBoYV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9zbXB0ZV9hbHBoYV9nZXRfcHJvcGVydHk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSAoR09iamVjdEZpbmFsaXplRnVuYykgZ3N0X3NtcHRlX2FscGhhX2ZpbmFsaXplOworCisgIF9nc3RfbWFza19pbml0ICgpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfVFlQRSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgidHlwZSIsICJUeXBlIiwgIlRoZSB0eXBlIG9mIHRyYW5zaXRpb24gdG8gdXNlIiwKKyAgICAgICAgICBHU1RfVFlQRV9TTVBURV9UUkFOU0lUSU9OX1RZUEUsIERFRkFVTFRfUFJPUF9UWVBFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0JPUkRFUiwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJib3JkZXIiLCAiQm9yZGVyIiwKKyAgICAgICAgICAiVGhlIGJvcmRlciB3aWR0aCBvZiB0aGUgdHJhbnNpdGlvbiIsIDAsIEdfTUFYSU5ULAorICAgICAgICAgIERFRkFVTFRfUFJPUF9CT1JERVIsCisgICAgICAgICAgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0RFUFRILAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImRlcHRoIiwgIkRlcHRoIiwgIkRlcHRoIG9mIHRoZSBtYXNrIGluIGJpdHMiLCAxLCAyNCwKKyAgICAgICAgICBERUZBVUxUX1BST1BfREVQVEgsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1BPU0lUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoInBvc2l0aW9uIiwgIlBvc2l0aW9uIiwKKyAgICAgICAgICAiUG9zaXRpb24gb2YgdGhlIHRyYW5zaXRpb24gZWZmZWN0IiwgMC4wLCAxLjAsIERFRkFVTFRfUFJPUF9QT1NJVElPTiwKKyAgICAgICAgICBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RTTVBURUFscGhhOmludmVydDoKKyAgICoKKyAgICogU2V0IHRvIFRSVUUgdG8gaW52ZXJ0IHRoZSB0cmFuc2l0aW9uIG1hc2sgKGllLiBmbGlwIGl0IGhvcml6b250YWxseSkuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0lOVkVSVCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiaW52ZXJ0IiwgIkludmVydCIsCisgICAgICAgICAgIkludmVydCB0cmFuc2l0aW9uIG1hc2siLCBERUZBVUxUX1BST1BfUE9TSVRJT04sCisgICAgICAgICAgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIHRyYW5zX2NsYXNzLT5iZWZvcmVfdHJhbnNmb3JtID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc21wdGVfYWxwaGFfYmVmb3JlX3RyYW5zZm9ybSk7CisgIHRyYW5zX2NsYXNzLT50cmFuc2Zvcm1fY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NtcHRlX2FscGhhX3RyYW5zZm9ybV9jYXBzKTsKKworICB2ZmlsdGVyX2NsYXNzLT5zZXRfaW5mbyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc21wdGVfYWxwaGFfc2V0X2luZm8pOworICB2ZmlsdGVyX2NsYXNzLT50cmFuc2Zvcm1fZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zbXB0ZV9hbHBoYV90cmFuc2Zvcm1fZnJhbWUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9zbXB0ZV9hbHBoYV9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3NtcHRlX2FscGhhX3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJTTVBURSB0cmFuc2l0aW9ucyIsCisgICAgICAiRmlsdGVyL0VkaXRvci9WaWRlbyIsCisgICAgICAiQXBwbHkgdGhlIHN0YW5kYXJkIFNNUFRFIHRyYW5zaXRpb25zIGFzIGFscGhhIG9uIHZpZGVvIGltYWdlcyIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc21wdGVfYWxwaGFfdXBkYXRlX21hc2sgKEdzdFNNUFRFQWxwaGEgKiBzbXB0ZSwgZ2ludCB0eXBlLAorICAgIGdib29sZWFuIGludmVydCwgZ2ludCBkZXB0aCwgZ2ludCB3aWR0aCwgZ2ludCBoZWlnaHQpCit7CisgIEdzdE1hc2sgKm5ld21hc2s7CisKKyAgLyogdHJ5IHRvIGF2b2lkIHJlZ2VuZXJhdGluZyB0aGUgbWFzayBpZiB3ZSBhbHJlYWR5IGhhdmUgb25lIHRoYXQgaXMKKyAgICogY29ycmVjdCAqLworICBpZiAoc21wdGUtPm1hc2spIHsKKyAgICBpZiAoc21wdGUtPnR5cGUgPT0gdHlwZSAmJgorICAgICAgICBzbXB0ZS0+aW52ZXJ0ID09IGludmVydCAmJgorICAgICAgICBzbXB0ZS0+ZGVwdGggPT0gZGVwdGggJiYKKyAgICAgICAgc21wdGUtPndpZHRoID09IHdpZHRoICYmIHNtcHRlLT5oZWlnaHQgPT0gaGVpZ2h0KQorICAgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBzbXB0ZS0+dHlwZSA9IHR5cGU7CisgIHNtcHRlLT5pbnZlcnQgPSBpbnZlcnQ7CisgIHNtcHRlLT5kZXB0aCA9IGRlcHRoOworICBzbXB0ZS0+d2lkdGggPSB3aWR0aDsKKyAgc21wdGUtPmhlaWdodCA9IGhlaWdodDsKKworICAvKiBOb3QgbmVnb3RpYXRlZCB5ZXQgKi8KKyAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIG5ld21hc2sgPSBnc3RfbWFza19mYWN0b3J5X25ldyAodHlwZSwgaW52ZXJ0LCBkZXB0aCwgd2lkdGgsIGhlaWdodCk7CisgIGlmICghbmV3bWFzaykKKyAgICBnb3RvIG1hc2tfZmFpbGVkOworCisgIGlmIChzbXB0ZS0+bWFzaykKKyAgICBnc3RfbWFza19kZXN0cm95IChzbXB0ZS0+bWFzayk7CisKKyAgc21wdGUtPm1hc2sgPSBuZXdtYXNrOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworbWFza19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzbXB0ZSwgImZhaWxlZCB0byBjcmVhdGUgYSBtYXNrIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc21wdGVfYWxwaGFfaW5pdCAoR3N0U01QVEVBbHBoYSAqIHNtcHRlKQoreworICBzbXB0ZS0+dHlwZSA9IERFRkFVTFRfUFJPUF9UWVBFOworICBzbXB0ZS0+Ym9yZGVyID0gREVGQVVMVF9QUk9QX0JPUkRFUjsKKyAgc21wdGUtPmRlcHRoID0gREVGQVVMVF9QUk9QX0RFUFRIOworICBzbXB0ZS0+cG9zaXRpb24gPSBERUZBVUxUX1BST1BfUE9TSVRJT047CisgIHNtcHRlLT5pbnZlcnQgPSBERUZBVUxUX1BST1BfSU5WRVJUOworfQorCisjZGVmaW5lIENSRUFURV9BUkdCX0ZVTkMobmFtZSwgQSwgUiwgRywgQikgXAorc3RhdGljIHZvaWQgXAorZ3N0X3NtcHRlX2FscGhhX3Byb2Nlc3NfIyNuYW1lIyNfIyNuYW1lIChHc3RTTVBURUFscGhhICogc21wdGUsIFwKKyAgICBjb25zdCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUsIEdzdE1hc2sgKiBtYXNrLCBcCisgICAgZ2ludCBib3JkZXIsIGdpbnQgcG9zKSBcCit7IFwKKyAgZ2ludCBpLCBqOyBcCisgIGNvbnN0IGd1aW50MzIgKm1hc2twOyBcCisgIGdpbnQgdmFsdWU7IFwKKyAgZ2ludCBtaW4sIG1heDsgXAorICBnaW50IHdpZHRoLCBoZWlnaHQ7IFwKKyAgZ3VpbnQ4ICppbiwgKm91dDsgXAorICBnaW50IHNyY193cmFwLCBkZXN0X3dyYXA7IFwKKyAgXAorICBpZiAoYm9yZGVyID09IDApIFwKKyAgICBib3JkZXIrKzsgXAorICBcCisgIG1pbiA9IHBvcyAtIGJvcmRlcjsgXAorICBtYXggPSBwb3M7IFwKKyAgR1NUX0RFQlVHX09CSkVDVCAoc21wdGUsICJwb3MgJWQsIG1pbiAlZCwgbWF4ICVkLCBib3JkZXIgJWQiLCBwb3MsIG1pbiwgbWF4LCBcCisgICAgICBib3JkZXIpOyBcCisgIFwKKyAgbWFza3AgPSBtYXNrLT5kYXRhOyBcCisgIFwKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKG91dF9mcmFtZSk7IFwKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAob3V0X2ZyYW1lKTsgXAorICBcCisgIGluID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAwKTsgXAorICBvdXQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsgXAorICBzcmNfd3JhcCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGluX2ZyYW1lLCAwKSAtICh3aWR0aCA8PCAyKTsgXAorICBkZXN0X3dyYXAgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChvdXRfZnJhbWUsIDApIC0gKHdpZHRoIDw8IDIpOyBcCisgIFwKKyAgLyogd2UgYmFzaWNhbGx5IGNvcHkgdGhlIHNvdXJjZSB0byBkZXN0IGJ1dCB3ZSBzY2FsZSB0aGUgYWxwaGEgY2hhbm5lbCB3aXRoIFwKKyAgICogdGhlIG1hc2sgKi8gXAorICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsgXAorICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7IFwKKyAgICAgIHZhbHVlID0gKm1hc2twKys7IFwKKyAgICAgIG91dFtBXSA9IChpbltBXSAqICgoQ0xBTVAgKHZhbHVlLCBtaW4sIG1heCkgLSBtaW4pIDw8IDgpIC8gYm9yZGVyKSA+PiA4OyBcCisgICAgICBvdXRbUl0gPSBpbltSXTsgXAorICAgICAgb3V0W0ddID0gaW5bR107IFwKKyAgICAgIG91dFtCXSA9IGluW0JdOyBcCisgICAgICBvdXQgKz0gNDsgXAorICAgICAgaW4gKz0gNDsgXAorICAgIH0gXAorICAgIGluICs9IHNyY193cmFwOyBcCisgICAgb3V0ICs9IGRlc3Rfd3JhcDsgXAorICB9IFwKK30KKworQ1JFQVRFX0FSR0JfRlVOQyAoYXJnYiwgMCwgMSwgMiwgMyk7CitDUkVBVEVfQVJHQl9GVU5DIChiZ3JhLCAzLCAyLCAxLCAwKTsKK0NSRUFURV9BUkdCX0ZVTkMgKGFiZ3IsIDAsIDMsIDIsIDEpOworQ1JFQVRFX0FSR0JfRlVOQyAocmdiYSwgMywgMCwgMSwgMik7CisKK3N0YXRpYyB2b2lkCitnc3Rfc21wdGVfYWxwaGFfcHJvY2Vzc19heXV2X2F5dXYgKEdzdFNNUFRFQWxwaGEgKiBzbXB0ZSwKKyAgICBjb25zdCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUsIEdzdE1hc2sgKiBtYXNrLAorICAgIGdpbnQgYm9yZGVyLCBnaW50IHBvcykKK3sKKyAgZ2ludCBpLCBqOworICBjb25zdCBndWludDMyICptYXNrcDsKKyAgZ2ludCB2YWx1ZTsKKyAgZ2ludCBtaW4sIG1heDsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBndWludDggKmluLCAqb3V0OworICBnaW50IHNyY193cmFwLCBkZXN0X3dyYXA7CisKKyAgaWYgKGJvcmRlciA9PSAwKQorICAgIGJvcmRlcisrOworCisgIG1pbiA9IHBvcyAtIGJvcmRlcjsKKyAgbWF4ID0gcG9zOworICBHU1RfREVCVUdfT0JKRUNUIChzbXB0ZSwgInBvcyAlZCwgbWluICVkLCBtYXggJWQsIGJvcmRlciAlZCIsIHBvcywgbWluLCBtYXgsCisgICAgICBib3JkZXIpOworCisgIG1hc2twID0gbWFzay0+ZGF0YTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAob3V0X2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAob3V0X2ZyYW1lKTsKKworICBpbiA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIG91dCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworICBzcmNfd3JhcCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGluX2ZyYW1lLCAwKSAtICh3aWR0aCA8PCAyKTsKKyAgZGVzdF93cmFwID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAob3V0X2ZyYW1lLCAwKSAtICh3aWR0aCA8PCAyKTsKKworICAvKiB3ZSBiYXNpY2FsbHkgY29weSB0aGUgc291cmNlIHRvIGRlc3QgYnV0IHdlIHNjYWxlIHRoZSBhbHBoYSBjaGFubmVsIHdpdGgKKyAgICogdGhlIG1hc2sgKi8KKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgIHZhbHVlID0gKm1hc2twKys7CisgICAgICAqb3V0KysgPSAoKmluKysgKiAoKENMQU1QICh2YWx1ZSwgbWluLCBtYXgpIC0gbWluKSA8PCA4KSAvIGJvcmRlcikgPj4gODsKKyAgICAgICpvdXQrKyA9ICppbisrOworICAgICAgKm91dCsrID0gKmluKys7CisgICAgICAqb3V0KysgPSAqaW4rKzsKKyAgICB9CisgICAgaW4gKz0gc3JjX3dyYXA7CisgICAgb3V0ICs9IGRlc3Rfd3JhcDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3NtcHRlX2FscGhhX3Byb2Nlc3NfaTQyMF9heXV2IChHc3RTTVBURUFscGhhICogc21wdGUsCisgICAgY29uc3QgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLCBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lLCBHc3RNYXNrICogbWFzaywKKyAgICBnaW50IGJvcmRlciwgZ2ludCBwb3MpCit7CisgIGNvbnN0IGd1aW50OCAqc3JjWTsKKyAgY29uc3QgZ3VpbnQ4ICpzcmNVOworICBjb25zdCBndWludDggKnNyY1Y7CisgIGd1aW50OCAqb3V0OworICBnaW50IGksIGo7CisgIGdpbnQgc3JjX3dyYXAsIHNyY191X3dyYXAsIHNyY192X3dyYXAsIGRlc3Rfd3JhcDsKKyAgZ2ludCB5X3N0cmlkZSwgdV9zdHJpZGUsIHZfc3RyaWRlOworICBnYm9vbGVhbiBvZGRfd2lkdGg7CisgIGNvbnN0IGd1aW50MzIgKm1hc2twOworICBnaW50IHZhbHVlOworICBnaW50IG1pbiwgbWF4OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgaWYgKGJvcmRlciA9PSAwKQorICAgIGJvcmRlcisrOworCisgIG1pbiA9IHBvcyAtIGJvcmRlcjsKKyAgbWF4ID0gcG9zOworICBHU1RfREVCVUdfT0JKRUNUIChzbXB0ZSwgInBvcyAlZCwgbWluICVkLCBtYXggJWQsIGJvcmRlciAlZCIsIHBvcywgbWluLCBtYXgsCisgICAgICBib3JkZXIpOworCisgIG1hc2twID0gbWFzay0+ZGF0YTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAob3V0X2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAob3V0X2ZyYW1lKTsKKworICB5X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoaW5fZnJhbWUsIDApOworICB1X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoaW5fZnJhbWUsIDEpOworICB2X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoaW5fZnJhbWUsIDIpOworCisgIHNyY193cmFwID0geV9zdHJpZGUgLSB3aWR0aDsKKyAgc3JjX3Vfd3JhcCA9IHVfc3RyaWRlIC0gKHdpZHRoIC8gMik7CisgIHNyY192X3dyYXAgPSB2X3N0cmlkZSAtICh3aWR0aCAvIDIpOworCisgIHNyY1kgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChpbl9mcmFtZSwgMCk7CisgIHNyY1UgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChpbl9mcmFtZSwgMSk7CisgIHNyY1YgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChpbl9mcmFtZSwgMik7CisKKyAgb3V0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisgIGRlc3Rfd3JhcCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKG91dF9mcmFtZSwgMCkgLSAod2lkdGggPDwgMik7CisKKyAgb2RkX3dpZHRoID0gKHdpZHRoICUgMiAhPSAwKTsKKworICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGggLyAyOyBqKyspIHsKKyAgICAgIHZhbHVlID0gKm1hc2twKys7CisgICAgICAqb3V0KysgPSAoMHhmZiAqICgoQ0xBTVAgKHZhbHVlLCBtaW4sIG1heCkgLSBtaW4pIDw8IDgpIC8gYm9yZGVyKSA+PiA4OworICAgICAgKm91dCsrID0gKnNyY1krKzsKKyAgICAgICpvdXQrKyA9ICpzcmNVOworICAgICAgKm91dCsrID0gKnNyY1Y7CisgICAgICB2YWx1ZSA9ICptYXNrcCsrOworICAgICAgKm91dCsrID0gKDB4ZmYgKiAoKENMQU1QICh2YWx1ZSwgbWluLCBtYXgpIC0gbWluKSA8PCA4KSAvIGJvcmRlcikgPj4gODsKKyAgICAgICpvdXQrKyA9ICpzcmNZKys7CisgICAgICAqb3V0KysgPSAqc3JjVSsrOworICAgICAgKm91dCsrID0gKnNyY1YrKzsKKyAgICB9CisgICAgLyogTWlnaHQgaGF2ZSBvbmUgb2RkIGNvbHVtbiBsZWZ0IHRvIGRvICovCisgICAgaWYgKG9kZF93aWR0aCkgeworICAgICAgdmFsdWUgPSAqbWFza3ArKzsKKyAgICAgICpvdXQrKyA9ICgweGZmICogKChDTEFNUCAodmFsdWUsIG1pbiwgbWF4KSAtIG1pbikgPDwgOCkgLyBib3JkZXIpID4+IDg7CisgICAgICAqb3V0KysgPSAqc3JjWSsrOworICAgICAgKm91dCsrID0gKnNyY1U7CisgICAgICAqb3V0KysgPSAqc3JjVjsKKyAgICB9CisgICAgaWYgKGkgJSAyID09IDApIHsKKyAgICAgIHNyY1UgLT0gd2lkdGggLyAyOworICAgICAgc3JjViAtPSB3aWR0aCAvIDI7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY1UgKz0gc3JjX3Vfd3JhcDsKKyAgICAgIHNyY1YgKz0gc3JjX3Zfd3JhcDsKKyAgICB9CisgICAgc3JjWSArPSBzcmNfd3JhcDsKKyAgICBvdXQgKz0gZGVzdF93cmFwOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc21wdGVfYWxwaGFfYmVmb3JlX3RyYW5zZm9ybSAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFNNUFRFQWxwaGEgKnNtcHRlID0gR1NUX1NNUFRFX0FMUEhBICh0cmFucyk7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIHN0cmVhbV90aW1lOworCisgIC8qIGZpcnN0IHN5bmMgdGhlIGNvbnRyb2xsZXIgdG8gdGhlIGN1cnJlbnQgc3RyZWFtX3RpbWUgb2YgdGhlIGJ1ZmZlciAqLworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKTsKKyAgc3RyZWFtX3RpbWUgPQorICAgICAgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZ0cmFucy0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLCB0aW1lc3RhbXApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNtcHRlLCAic3luYyB0byAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHN0cmVhbV90aW1lKSkKKyAgICBnc3Rfb2JqZWN0X3N5bmNfdmFsdWVzIChHU1RfT0JKRUNUIChzbXB0ZSksIHN0cmVhbV90aW1lKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9zbXB0ZV9hbHBoYV90cmFuc2Zvcm1fZnJhbWUgKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwKKyAgICBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUpCit7CisgIEdzdFNNUFRFQWxwaGEgKnNtcHRlID0gR1NUX1NNUFRFX0FMUEhBICh2ZmlsdGVyKTsKKyAgZ2RvdWJsZSBwb3NpdGlvbjsKKyAgZ2ludCBib3JkZXI7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFzbXB0ZS0+cHJvY2VzcykpCisgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHNtcHRlKTsKKyAgcG9zaXRpb24gPSBzbXB0ZS0+cG9zaXRpb247CisgIGJvcmRlciA9IHNtcHRlLT5ib3JkZXI7CisKKyAgLyogcnVuIHRoZSB0eXBlIHNwZWNpZmljIGZpbHRlciBjb2RlICovCisgIHNtcHRlLT5wcm9jZXNzIChzbXB0ZSwgaW5fZnJhbWUsIG91dF9mcmFtZSwKKyAgICAgIHNtcHRlLT5tYXNrLCBib3JkZXIsICgoMSA8PCBzbXB0ZS0+ZGVwdGgpICsgYm9yZGVyKSAqIHBvc2l0aW9uKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNtcHRlKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVJST1JTICovCitub3RfbmVnb3RpYXRlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzbXB0ZSwgQ09SRSwgTkVHT1RJQVRJT04sIChOVUxMKSwKKyAgICAgICAgKCJObyBpbnB1dCBmb3JtYXQgbmVnb3RpYXRlZCIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3NtcHRlX2FscGhhX3RyYW5zZm9ybV9jYXBzIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0UGFkRGlyZWN0aW9uIGRpcmVjdGlvbiwgR3N0Q2FwcyAqIGZyb20sIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKnJlc3VsdCwgKnRtcF9jYXBzLCAqdG1wbF9jYXBzID0gTlVMTDsKKyAgZ2ludCBpLCBqOworCisgIHRtcF9jYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIGZvciAoaSA9IDA7IGkgPCBnc3RfY2Fwc19nZXRfc2l6ZSAoZnJvbSk7IGkrKykgeworICAgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICAgIGNvbnN0IEdWYWx1ZSAqdmFsLCAqbHZhbDsKKyAgICBHVmFsdWUgbGlzdCA9IHsgMCwgfTsKKyAgICBHVmFsdWUgYXZhbCA9IHsgMCwgfTsKKyAgICBjb25zdCBnY2hhciAqc3RyOworCisgICAgc3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9jb3B5IChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChmcm9tLCBpKSk7CisgICAgLyogd2UgY2FuIHRyYW5zZm9ybSBJNDIwIHRvIEFZVVYsCisgICAgICogc28gbmVlZCB0byBsb2NhdGUgYW5kIHN1YnN0aXR1dGUgQVlVViBmb3IgdGhlIGJvdGggb2YgdGhlbSAqLworICAgIHZhbCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJmb3JtYXQiKTsKKyAgICBpZiAodmFsICYmIEdTVF9WQUxVRV9IT0xEU19MSVNUICh2YWwpKSB7CisgICAgICBnYm9vbGVhbiBzZWVuX2F5dXYgPSBGQUxTRSwgc2Vlbl9pNDIwID0gRkFMU0U7CisKKyAgICAgIGdfdmFsdWVfaW5pdCAoJmxpc3QsIEdTVF9UWVBFX0xJU1QpOworICAgICAgZm9yIChqID0gMDsgaiA8IGdzdF92YWx1ZV9saXN0X2dldF9zaXplICh2YWwpOyBqKyspIHsKKyAgICAgICAgbHZhbCA9IGdzdF92YWx1ZV9saXN0X2dldF92YWx1ZSAodmFsLCBqKTsKKyAgICAgICAgaWYgKChzdHIgPSBnX3ZhbHVlX2dldF9zdHJpbmcgKGx2YWwpKSkgeworICAgICAgICAgIGlmIChzdHJjbXAgKHN0ciwgIkFZVVYiKSA9PSAwKSB7CisgICAgICAgICAgICBzZWVuX2F5dXYgPSBUUlVFOworICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wIChzdHIsICJJNDIwIikgPT0gMCkgeworICAgICAgICAgICAgc2Vlbl9pNDIwID0gVFJVRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzZWVuX2F5dXYgJiYgIXNlZW5faTQyMCkgeworICAgICAgICBzdHIgPSAiSTQyMCI7CisgICAgICB9IGVsc2UgaWYgKHNlZW5faTQyMCAmJiAhc2Vlbl9heXV2KSB7CisgICAgICAgIHN0ciA9ICJBWVVWIjsKKyAgICAgIH0gZWxzZQorICAgICAgICBzdHIgPSBOVUxMOworICAgICAgaWYgKHN0cikgeworICAgICAgICBnX3ZhbHVlX2NvcHkgKHZhbCwgJmxpc3QpOworICAgICAgICBnX3ZhbHVlX2luaXQgKCZhdmFsLCBHX1RZUEVfU1RSSU5HKTsKKyAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICgmYXZhbCwgc3RyKTsKKyAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmbGlzdCwgJmF2YWwpOworICAgICAgICBnX3ZhbHVlX3Jlc2V0ICgmYXZhbCk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJmb3JtYXQiLCAmbGlzdCk7CisgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZsaXN0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHZhbCAmJiBHX1ZBTFVFX0hPTERTX1NUUklORyAodmFsKSkgeworICAgICAgaWYgKChzdHIgPSBnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbCkpICYmCisgICAgICAgICAgKChzdHJjbXAgKHN0ciwgIkFZVVYiKSA9PSAwKSB8fCAoc3RyY21wIChzdHIsICJJNDIwIikgPT0gMCkpKSB7CisgICAgICAgIGdfdmFsdWVfaW5pdCAoJmxpc3QsIEdTVF9UWVBFX0xJU1QpOworICAgICAgICBnX3ZhbHVlX2luaXQgKCZhdmFsLCBHX1RZUEVfU1RSSU5HKTsKKyAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICgmYXZhbCwgIkFZVVYiKTsKKyAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmbGlzdCwgJmF2YWwpOworICAgICAgICBnX3ZhbHVlX3Jlc2V0ICgmYXZhbCk7CisgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAoJmF2YWwsICJJNDIwIik7CisgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJmxpc3QsICZhdmFsKTsKKyAgICAgICAgZ192YWx1ZV9yZXNldCAoJmF2YWwpOworICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAoc3RydWN0dXJlLCAiZm9ybWF0IiwgJmxpc3QpOworICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmbGlzdCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzdHJ1Y3R1cmUsICJmb3JtYXQiKTsKKyAgICB9CisKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAoc3RydWN0dXJlLCAiY29sb3JpbWV0cnkiKTsKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAoc3RydWN0dXJlLCAiY2hyb21hLXNpdGUiKTsKKworICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKHRtcF9jYXBzLCBzdHJ1Y3R1cmUpOworICB9CisKKyAgLyogR2V0IHRoZSBhcHByb3ByaWF0ZSB0ZW1wbGF0ZSAqLworICBpZiAoZGlyZWN0aW9uID09IEdTVF9QQURfU0lOSykgeworICAgIHRtcGxfY2FwcyA9CisgICAgICAgIGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldF9jYXBzICgmZ3N0X3NtcHRlX2FscGhhX3NyY190ZW1wbGF0ZSk7CisgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IEdTVF9QQURfU1JDKSB7CisgICAgdG1wbF9jYXBzID0KKyAgICAgICAgZ3N0X3N0YXRpY19wYWRfdGVtcGxhdGVfZ2V0X2NhcHMgKCZnc3Rfc21wdGVfYWxwaGFfc2lua190ZW1wbGF0ZSk7CisgIH0gZWxzZSB7CisgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgIH0KKworICAvKiBJbnRlcnNlY3Qgd2l0aCBvdXIgdGVtcGxhdGUgY2FwcyAqLworICByZXN1bHQgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHRtcF9jYXBzLCB0bXBsX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAodG1wbF9jYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHRtcF9jYXBzKTsKKworICByZXN1bHQgPSBnc3RfY2Fwc19zaW1wbGlmeSAocmVzdWx0KTsKKworICBHU1RfTE9HX09CSkVDVCAodHJhbnMsICJ0cmFuc2Zvcm1lZCAlIiBHU1RfUFRSX0ZPUk1BVCAiIHRvICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgZnJvbSwgcmVzdWx0KTsKKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAodHJhbnMsICJVc2luZyBmaWx0ZXIgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgZmlsdGVyKTsKKyAgICBpbnRlcnNlY3Rpb24gPQorICAgICAgICBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCByZXN1bHQsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHJlc3VsdCk7CisgICAgcmVzdWx0ID0gaW50ZXJzZWN0aW9uOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHRyYW5zLCAiSW50ZXJzZWN0aW9uICUiIEdTVF9QVFJfRk9STUFULCByZXN1bHQpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc21wdGVfYWxwaGFfc2V0X2luZm8gKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwgR3N0Q2FwcyAqIGluY2FwcywKKyAgICBHc3RWaWRlb0luZm8gKiBpbl9pbmZvLCBHc3RDYXBzICogb3V0Y2FwcywgR3N0VmlkZW9JbmZvICogb3V0X2luZm8pCit7CisgIEdzdFNNUFRFQWxwaGEgKnNtcHRlID0gR1NUX1NNUFRFX0FMUEhBICh2ZmlsdGVyKTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIHNtcHRlLT5wcm9jZXNzID0gTlVMTDsKKyAgc21wdGUtPmluX2Zvcm1hdCA9IEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoaW5faW5mbyk7CisgIHNtcHRlLT5vdXRfZm9ybWF0ID0gR1NUX1ZJREVPX0lORk9fRk9STUFUIChvdXRfaW5mbyk7CisKKyAgLyogdHJ5IHRvIHVwZGF0ZSB0aGUgbWFzayBub3csIHRoaXMgd2lsbCBhbHNvIGFkanVzdCB0aGUgd2lkdGgvaGVpZ2h0IG9uCisgICAqIHN1Y2Nlc3MgKi8KKyAgR1NUX09CSkVDVF9MT0NLIChzbXB0ZSk7CisgIHJldCA9CisgICAgICBnc3Rfc21wdGVfYWxwaGFfdXBkYXRlX21hc2sgKHNtcHRlLCBzbXB0ZS0+dHlwZSwgc21wdGUtPmludmVydCwKKyAgICAgIHNtcHRlLT5kZXB0aCwgR1NUX1ZJREVPX0lORk9fV0lEVEggKG91dF9pbmZvKSwKKyAgICAgIEdTVF9WSURFT19JTkZPX0hFSUdIVCAob3V0X2luZm8pKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNtcHRlKTsKKworICBpZiAoIXJldCkKKyAgICBnb3RvIG1hc2tfZmFpbGVkOworCisgIHN3aXRjaCAoc21wdGUtPm91dF9mb3JtYXQpIHsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVlVVjoKKyAgICAgIHN3aXRjaCAoc21wdGUtPmluX2Zvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVlVVjoKKyAgICAgICAgICBzbXB0ZS0+cHJvY2VzcyA9IGdzdF9zbXB0ZV9hbHBoYV9wcm9jZXNzX2F5dXZfYXl1djsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgICAgICAgc21wdGUtPnByb2Nlc3MgPSBnc3Rfc21wdGVfYWxwaGFfcHJvY2Vzc19pNDIwX2F5dXY7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICAgIHN3aXRjaCAoc21wdGUtPmluX2Zvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICAgICAgICBzbXB0ZS0+cHJvY2VzcyA9IGdzdF9zbXB0ZV9hbHBoYV9wcm9jZXNzX2FyZ2JfYXJnYjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgICAgc3dpdGNoIChzbXB0ZS0+aW5fZm9ybWF0KSB7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgICAgICAgIHNtcHRlLT5wcm9jZXNzID0gZ3N0X3NtcHRlX2FscGhhX3Byb2Nlc3NfcmdiYV9yZ2JhOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FCR1I6CisgICAgICBzd2l0Y2ggKHNtcHRlLT5pbl9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FCR1I6CisgICAgICAgICAgc21wdGUtPnByb2Nlc3MgPSBnc3Rfc21wdGVfYWxwaGFfcHJvY2Vzc19hYmdyX2FiZ3I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICAgIHN3aXRjaCAoc21wdGUtPmluX2Zvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICAgICAgICBzbXB0ZS0+cHJvY2VzcyA9IGdzdF9zbXB0ZV9hbHBoYV9wcm9jZXNzX2JncmFfYmdyYTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCittYXNrX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNtcHRlLCAiZmFpbGVkIGNyZWF0aW5nIHRoZSBtYXNrIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc21wdGVfYWxwaGFfZmluYWxpemUgKEdzdFNNUFRFQWxwaGEgKiBzbXB0ZSkKK3sKKyAgaWYgKHNtcHRlLT5tYXNrKQorICAgIGdzdF9tYXNrX2Rlc3Ryb3kgKHNtcHRlLT5tYXNrKTsKKyAgc21wdGUtPm1hc2sgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAoKEdPYmplY3QgKikgc21wdGUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NtcHRlX2FscGhhX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTTVBURUFscGhhICpzbXB0ZSA9IEdTVF9TTVBURV9BTFBIQSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfVFlQRTp7CisgICAgICBnaW50IHR5cGU7CisKKyAgICAgIHR5cGUgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc21wdGUpOworICAgICAgZ3N0X3NtcHRlX2FscGhhX3VwZGF0ZV9tYXNrIChzbXB0ZSwgdHlwZSwgc21wdGUtPmludmVydCwKKyAgICAgICAgICBzbXB0ZS0+ZGVwdGgsIHNtcHRlLT53aWR0aCwgc21wdGUtPmhlaWdodCk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc21wdGUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9CT1JERVI6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNtcHRlKTsKKyAgICAgIHNtcHRlLT5ib3JkZXIgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzbXB0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfREVQVEg6eworICAgICAgZ2ludCBkZXB0aDsKKworICAgICAgZGVwdGggPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKworICAgICAgR1NUX09CSkVDVF9MT0NLIChzbXB0ZSk7CisgICAgICBnc3Rfc21wdGVfYWxwaGFfdXBkYXRlX21hc2sgKHNtcHRlLCBzbXB0ZS0+dHlwZSwgc21wdGUtPmludmVydCwKKyAgICAgICAgICBkZXB0aCwgc21wdGUtPndpZHRoLCBzbXB0ZS0+aGVpZ2h0KTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzbXB0ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX1BPU0lUSU9OOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChzbXB0ZSk7CisgICAgICBzbXB0ZS0+cG9zaXRpb24gPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzbXB0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSU5WRVJUOnsKKyAgICAgIGdib29sZWFuIGludmVydDsKKworICAgICAgaW52ZXJ0ID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9MT0NLIChzbXB0ZSk7CisgICAgICBnc3Rfc21wdGVfYWxwaGFfdXBkYXRlX21hc2sgKHNtcHRlLCBzbXB0ZS0+dHlwZSwgaW52ZXJ0LAorICAgICAgICAgIHNtcHRlLT5kZXB0aCwgc21wdGUtPndpZHRoLCBzbXB0ZS0+aGVpZ2h0KTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzbXB0ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3NtcHRlX2FscGhhX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTTVBURUFscGhhICpzbXB0ZTsKKworICBzbXB0ZSA9IEdTVF9TTVBURV9BTFBIQSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfVFlQRToKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc21wdGUpOworICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHNtcHRlLT50eXBlKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzbXB0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQk9SREVSOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChzbXB0ZSk7CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBzbXB0ZS0+Ym9yZGVyKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzbXB0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfREVQVEg6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNtcHRlKTsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHNtcHRlLT5kZXB0aCk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc21wdGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BPU0lUSU9OOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChzbXB0ZSk7CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCBzbXB0ZS0+cG9zaXRpb24pOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNtcHRlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JTlZFUlQ6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNtcHRlKTsKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBzbXB0ZS0+aW52ZXJ0KTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzbXB0ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2dib29sZWFuCitnc3Rfc21wdGVfYWxwaGFfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9zbXB0ZV9hbHBoYV9kZWJ1ZywgInNtcHRlYWxwaGEiLCAwLAorICAgICAgIlNNUFRFIGFscGhhIGVmZmVjdCIpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAic21wdGVhbHBoYSIsIEdTVF9SQU5LX05PTkUsCisgICAgICBHU1RfVFlQRV9TTVBURV9BTFBIQSk7Cit9CmRpZmYgLS1naXQgYS9nc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5oIGIvZ3N0L3NtcHRlL2dzdHNtcHRlYWxwaGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGQyYjM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3NtcHRlL2dzdHNtcHRlYWxwaGEuaApAQCAtMCwwICsxLDc5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1NNUFRFX0FMUEhBX0hfXworI2RlZmluZSBfX0dTVF9TTVBURV9BTFBIQV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9maWx0ZXIuaD4KKworCitHX0JFR0lOX0RFQ0xTCisKKyNpbmNsdWRlICJnc3RtYXNrLmgiCisKKyNkZWZpbmUgR1NUX1RZUEVfU01QVEVfQUxQSEEgXAorICAoZ3N0X3NtcHRlX2FscGhhX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9TTVBURV9BTFBIQShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1NNUFRFX0FMUEhBLEdzdFNNUFRFQWxwaGEpKQorI2RlZmluZSBHU1RfU01QVEVfQUxQSEFfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfU01QVEVfQUxQSEEsR3N0U01QVEVBbHBoYUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1NNUFRFX0FMUEhBKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfU01QVEVfQUxQSEEpKQorI2RlZmluZSBHU1RfSVNfU01QVEVfQUxQSEFfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfU01QVEVfQUxQSEEpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0U01QVEVBbHBoYSBHc3RTTVBURUFscGhhOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFNNUFRFQWxwaGFDbGFzcyBHc3RTTVBURUFscGhhQ2xhc3M7CisKK3N0cnVjdCBfR3N0U01QVEVBbHBoYSB7CisgIEdzdFZpZGVvRmlsdGVyIGVsZW1lbnQ7CisKKyAgLyogcHJvcGVydGllcyAqLworICBnaW50ICAgICAgICAgICB0eXBlOworICBnaW50ICAgICAgICAgICBib3JkZXI7CisgIGdpbnQgICAgICAgICAgIGRlcHRoOworICBnZG91YmxlICAgICAgICBwb3NpdGlvbjsKKyAgZ2Jvb2xlYW4gICAgICAgaW52ZXJ0OworCisgIC8qIG5lZ290aWF0ZWQgZm9ybWF0ICovCisgIEdzdFZpZGVvRm9ybWF0IGluX2Zvcm1hdCwgb3V0X2Zvcm1hdDsKKyAgZ2ludCAgICAgICAgICAgd2lkdGg7CisgIGdpbnQgICAgICAgICAgIGhlaWdodDsKKworICAvKiBzdGF0ZSBvZiB0aGUgZWZmZWN0ICovCisgIEdzdE1hc2sgICAgICAgKm1hc2s7CisKKyAgLyogcHJvY2Vzc2luZyBmdW5jdGlvbiAqLworICB2b2lkICgqcHJvY2VzcykgKEdzdFNNUFRFQWxwaGEgKiBzbXB0ZSwgY29uc3QgR3N0VmlkZW9GcmFtZSAqIGluLCBHc3RWaWRlb0ZyYW1lICogb3V0LAorICAgIEdzdE1hc2sgKiBtYXNrLCBnaW50IGJvcmRlciwgZ2ludCBwb3MpOworfTsKKworc3RydWN0IF9Hc3RTTVBURUFscGhhQ2xhc3MgeworICBHc3RWaWRlb0ZpbHRlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9zbXB0ZV9hbHBoYV9nZXRfdHlwZSAodm9pZCk7CitnYm9vbGVhbiBnc3Rfc21wdGVfYWxwaGFfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9TTVBURV9BTFBIQV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9zbXB0ZS9tZXNvbi5idWlsZCBiL2dzdC9zbXB0ZS9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTUzOWQzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3NtcHRlL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMTcgQEAKK3NtcHRlX3NvdXJjZXMgPSBbCisgICdnc3RzbXB0ZS5jJywKKyAgJ2dzdG1hc2suYycsCisgICdiYXJib3h3aXBlcy5jJywKKyAgJ3BhaW50LmMnLAorICAnZ3N0c21wdGVhbHBoYS5jJywKKyAgJ3BsdWdpbi5jJywKK10KKworZ3N0c21wdGUgPSBsaWJyYXJ5KCdnc3RzbXB0ZScsCisgIHNtcHRlX3NvdXJjZXMsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0dmlkZW9fZGVwLCBnc3RfZGVwLCBsaWJtXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKZGlmZiAtLWdpdCBhL2dzdC9zbXB0ZS9wYWludC5jIGIvZ3N0L3NtcHRlL3BhaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q5NzMyMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9zbXB0ZS9wYWludC5jCkBAIC0wLDAgKzEsMzM4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInBhaW50LmgiCisKKyNpZm5kZWYgTV9QSQorI2RlZmluZSBNX1BJICAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CisjZW5kaWYKKwordm9pZAorZ3N0X3NtcHRlX3BhaW50X3Zib3ggKGd1aW50MzIgKiBkZXN0LCBnaW50IHN0cmlkZSwKKyAgICBnaW50IHgwLCBnaW50IHkwLCBnaW50IGMwLCBnaW50IHgxLCBnaW50IHkxLCBnaW50IGMxKQoreworICBnaW50IGksIGo7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKworICB3aWR0aCA9IHgxIC0geDA7CisgIGhlaWdodCA9IHkxIC0geTA7CisKKyAgZ19hc3NlcnQgKHdpZHRoID4gMCk7CisgIGdfYXNzZXJ0IChoZWlnaHQgPiAwKTsKKworICBkZXN0ID0gZGVzdCArIHkwICogc3RyaWRlICsgeDA7CisKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgIGRlc3Rbal0gPSAoYzEgKiBqICsgYzAgKiAod2lkdGggLSBqKSkgLyB3aWR0aDsKKyAgICB9CisgICAgZGVzdCArPSBzdHJpZGU7CisgIH0KK30KKwordm9pZAorZ3N0X3NtcHRlX3BhaW50X2hib3ggKGd1aW50MzIgKiBkZXN0LCBnaW50IHN0cmlkZSwKKyAgICBnaW50IHgwLCBnaW50IHkwLCBnaW50IGMwLCBnaW50IHgxLCBnaW50IHkxLCBnaW50IGMxKQoreworICBnaW50IGksIGo7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKworICB3aWR0aCA9IHgxIC0geDA7CisgIGhlaWdodCA9IHkxIC0geTA7CisKKyAgZ19hc3NlcnQgKHdpZHRoID4gMCk7CisgIGdfYXNzZXJ0IChoZWlnaHQgPiAwKTsKKworICBkZXN0ID0gZGVzdCArIHkwICogc3RyaWRlICsgeDA7CisKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgZ3VpbnQzMiB2YWx1ZSA9IChjMSAqIGkgKyBjMCAqIChoZWlnaHQgLSBpKSkgLyBoZWlnaHQ7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgZGVzdFtqXSA9IHZhbHVlOworICAgIH0KKyAgICBkZXN0ICs9IHN0cmlkZTsKKyAgfQorfQorCisjZGVmaW5lIFNURVBfM0RfTElORShkeGFicyxkeWFicyxkemFicyxzZHgsc2R5LHNkeix4cix5cix6cixweCxweSxweikgICAgICAgICAgIFwKK0dfU1RNVF9TVEFSVCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoZHhhYnMgPj0gZHlhYnMgJiYgZHhhYnMgPj0gZHphYnMpIHsgICAgICAgICAgICAgICBcCisgICAgeXIgKz0gZHlhYnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB6ciArPSBkemFiczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh5ciA+PSBkeGFicykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBweSArPSBzZHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHlyIC09IGR4YWJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHpyID49IGR6YWJzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHB6ICs9IHNkejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgenIgLT0gZHhhYnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBweCArPSBzZHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgaWYgKGR5YWJzID49IGR4YWJzICYmIGR5YWJzID49IGR6YWJzKSB7ICAgICAgICBcCisgICAgeHIgKz0gZHhhYnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB6ciArPSBkemFiczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh4ciA+PSBkeWFicykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBweCArPSBzZHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHhyIC09IGR5YWJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHpyID49IGR6YWJzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHB6ICs9IHNkejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgenIgLT0gZHlhYnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBweSArPSBzZHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeXIgKz0gZHlhYnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB4ciArPSBkeGFiczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh5ciA+PSBkeWFicykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBweSArPSBzZHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHlyIC09IGR6YWJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHhyID49IGR5YWJzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHB4ICs9IHNkeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeHIgLT0gZHphYnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBweiArPSBzZHo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IEdfU1RNVF9FTkQKKworI2RlZmluZSBTV0FQX0lOVChhLGIpICAgICAgICAgICBcCitHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgIFwKKyAgZ2ludCB0bXA7ICAgICAgICAgICAgICAgICAgICAgXAorICB0bXAgPSAoYSk7ICAgICAgICAgICAgICAgICAgICBcCisgIChhKSA9IChiKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgKGIpID0gKHRtcCk7ICAgICAgICAgICAgICAgICAgXAorfSBHX1NUTVRfRU5ECisKKyNkZWZpbmUgU0lHTihhKSAoKGEpIDwgMCA/IC0xIDogMSkKKworI2RlZmluZSBQUkVQQVJFXzNEX0xJTkUoeDAseTAsejAseDEseTEsejEsZHhhYnMsZHlhYnMsZHphYnMsc2R4LHNkeSxzZHoseHIseXIsenIscHgscHkscHopXAorR19TVE1UX1NUQVJUIHsgICAgICAgICAgICAgICAgICBcCisgIGdpbnQgZHgsIGR5LCBkejsgICAgICAgICAgICAgIFwKKyAgZHggPSB4MSAtIHgwOyAgICAgICAgICAgICAgICAgXAorICBkeSA9IHkxIC0geTA7ICAgICAgICAgICAgICAgICBcCisgIGR6ID0gejEgLSB6MDsgICAgICAgICAgICAgICAgIFwKKyAgZHhhYnMgPSBhYnMgKGR4KTsgICAgICAgICAgICAgXAorICBkeWFicyA9IGFicyAoZHkpOyAgICAgICAgICAgICBcCisgIGR6YWJzID0gYWJzIChkeik7ICAgICAgICAgICAgIFwKKyAgc2R4ID0gU0lHTiAoZHgpOyAgICAgICAgICAgICAgXAorICBzZHkgPSBTSUdOIChkeSk7ICAgICAgICAgICAgICBcCisgIHNkeiA9IFNJR04gKGR6KTsgICAgICAgICAgICAgIFwKKyAgeHIgPSBkeGFicyA+PiAxOyAgICAgICAgICAgICAgXAorICB5ciA9IGR5YWJzID4+IDE7ICAgICAgICAgICAgICBcCisgIHpyID0gZHphYnMgPj4gMTsgICAgICAgICAgICAgIFwKKyAgcHggPSB4MDsgICAgICAgICAgICAgICAgICAgICAgXAorICBweSA9IHkwOyAgICAgICAgICAgICAgICAgICAgICBcCisgIHB6ID0gejA7ICAgICAgICAgICAgICAgICAgICAgIFwKK30gR19TVE1UX0VORAorCit2b2lkCitnc3Rfc21wdGVfcGFpbnRfdHJpYW5nbGVfbGluZWFyIChndWludDMyICogZGVzdCwgZ2ludCBzdHJpZGUsCisgICAgZ2ludCB4MCwgZ2ludCB5MCwgZ2ludCBjMCwKKyAgICBnaW50IHgxLCBnaW50IHkxLCBnaW50IGMxLCBnaW50IHgyLCBnaW50IHkyLCBnaW50IGMyKQoreworICBnaW50IHNkeGwsIHNkeWwsIHNkY2wsIGR4bGFicywgZHlsYWJzLCBkY2xhYnMsIHhybCwgeXJsLCBjcmwsIHB4bCwgcHlsLCBwY2w7CisgIGdpbnQgc2R4ciwgc2R5ciwgc2RjciwgZHhyYWJzLCBkeXJhYnMsIGRjcmFicywgeHJyLCB5cnIsIGNyciwgcHhyLCBweXIsIHBjcjsKKyAgZ2ludCBpLCBqLCBrLCBzZWdfc3RhcnQsIHNlZ19lbmQ7CisKKyAgaWYgKHkwID4geTEpIHsKKyAgICBTV0FQX0lOVCAoeDAsIHgxKTsKKyAgICBTV0FQX0lOVCAoeTAsIHkxKTsKKyAgICBTV0FQX0lOVCAoYzAsIGMxKTsKKyAgfQorICBpZiAoeTAgPiB5MikgeworICAgIFNXQVBfSU5UICh4MCwgeDIpOworICAgIFNXQVBfSU5UICh5MCwgeTIpOworICAgIFNXQVBfSU5UIChjMCwgYzIpOworICB9CisgIGlmICh5MSA+IHkyKSB7CisgICAgU1dBUF9JTlQgKHgxLCB4Mik7CisgICAgU1dBUF9JTlQgKHkxLCB5Mik7CisgICAgU1dBUF9JTlQgKGMxLCBjMik7CisgIH0KKworICBQUkVQQVJFXzNEX0xJTkUgKHgwLCB5MCwgYzAsIHgyLCB5MiwgYzIsCisgICAgICBkeGxhYnMsIGR5bGFicywgZGNsYWJzLCBzZHhsLCBzZHlsLCBzZGNsLCB4cmwsIHlybCwgY3JsLCBweGwsIHB5bCwgcGNsKTsKKworICBQUkVQQVJFXzNEX0xJTkUgKHgwLCB5MCwgYzAsIHgxLCB5MSwgYzEsCisgICAgICBkeHJhYnMsIGR5cmFicywgZGNyYWJzLCBzZHhyLCBzZHlyLCBzZGNyLCB4cnIsIHlyciwgY3JyLCBweHIsIHB5ciwgcGNyKTsKKworICBkZXN0ID0gZGVzdCArIHN0cmlkZSAqIHkwOworICBzZWdfc3RhcnQgPSB5MDsKKyAgc2VnX2VuZCA9IHkxOworCisgIC8qIGRvIHR3byBwYXNzZXMgKi8KKyAgZm9yIChrID0gMDsgayA8IDI7IGsrKykgeworICAgIGZvciAoaSA9IHNlZ19zdGFydDsgaSA8IHNlZ19lbmQ7IGkrKykgeworICAgICAgZ2ludCBzID0gcHhsLCBlID0gcHhyLCBzYyA9IHBjbCwgZWMgPSBwY3I7CisgICAgICBnaW50IHNpZ24gPSBTSUdOIChlIC0gcyk7CisKKyAgICAgIGUgKz0gc2lnbjsKKyAgICAgIGZvciAoaiA9IHM7IGogIT0gZTsgaiArPSBzaWduKSB7CisgICAgICAgIGRlc3Rbal0gPSAoZWMgKiAoaiAtIHMpICsgc2MgKiAoZSAtIGopKSAvIChlIC0gcyk7CisgICAgICB9CisKKyAgICAgIHdoaWxlIChweXIgPT0gaSkgeworICAgICAgICBTVEVQXzNEX0xJTkUgKGR4cmFicywgZHlyYWJzLCBkY3JhYnMsIHNkeHIsIHNkeXIsIHNkY3IsCisgICAgICAgICAgICB4cnIsIHlyciwgY3JyLCBweHIsIHB5ciwgcGNyKTsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChweWwgPT0gaSkgeworICAgICAgICBTVEVQXzNEX0xJTkUgKGR4bGFicywgZHlsYWJzLCBkY2xhYnMsIHNkeGwsIHNkeWwsIHNkY2wsCisgICAgICAgICAgICB4cmwsIHlybCwgY3JsLCBweGwsIHB5bCwgcGNsKTsKKyAgICAgIH0KKyAgICAgIGRlc3QgKz0gc3RyaWRlOworICAgIH0KKworICAgIFBSRVBBUkVfM0RfTElORSAoeDEsIHkxLCBjMSwgeDIsIHkyLCBjMiwKKyAgICAgICAgZHhyYWJzLCBkeXJhYnMsIGRjcmFicywgc2R4ciwgc2R5ciwgc2RjciwgeHJyLCB5cnIsIGNyciwgcHhyLCBweXIsIHBjcik7CisKKyAgICBzZWdfc3RhcnQgPSB5MTsKKyAgICBzZWdfZW5kID0geTI7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2RyYXdfYnJlc2VuaGFtX2xpbmUgKGd1aW50MzIgKiBkZXN0LCBnaW50IHN0cmlkZSwKKyAgICBnaW50IHgwLCBnaW50IHkwLCBnaW50IHgxLCBnaW50IHkxLCBndWludDMyIGNvbCkKK3sKKyAgZ2ludCBkeCwgZHk7CisgIGdpbnQgeF9pbmNyLCB5X2luY3I7CisgIGdpbnQgaSwgZHByLCBkcHJ1LCBQLCBpbmRlcDsKKworICBkeCA9IGFicyAoeDEgLSB4MCk7CisgIGR5ID0gYWJzICh5MSAtIHkwKTsKKworICBkZXN0ID0gZGVzdCArIHkwICogc3RyaWRlICsgeDA7CisKKyAgeF9pbmNyID0gU0lHTiAoeDEgLSB4MCk7CisgIHlfaW5jciA9IFNJR04gKHkxIC0geTApICogc3RyaWRlOworCisgIGlmIChkeCA+PSBkeSkgeworICAgIGRwciA9IGR5IDw8IDE7CisgICAgaSA9IGR4OworICAgIGluZGVwID0geF9pbmNyOworICB9IGVsc2UgeworICAgIGRwciA9IGR4IDw8IDE7CisgICAgaSA9IGR5OworICAgIGluZGVwID0geV9pbmNyOworICB9CisKKyAgZHBydSA9IGRwciAtIChpIDw8IDEpOworICBQID0gZHByIC0gaTsKKworICBmb3IgKDsgaSA+PSAwOyBpLS0pIHsKKyAgICAqZGVzdCA9IGNvbDsKKworICAgIGlmIChQID4gMCkgeworICAgICAgZGVzdCArPSB4X2luY3I7CisgICAgICBkZXN0ICs9IHlfaW5jcjsKKyAgICAgIFAgKz0gZHBydTsKKyAgICB9IGVsc2UgeworICAgICAgZGVzdCArPSBpbmRlcDsKKyAgICAgIFAgKz0gZHByOworICAgIH0KKyAgfQorfQorCit2b2lkCitnc3Rfc21wdGVfcGFpbnRfdHJpYW5nbGVfY2xvY2sgKGd1aW50MzIgKiBkZXN0LCBnaW50IHN0cmlkZSwKKyAgICBnaW50IHgwLCBnaW50IHkwLCBnaW50IGMwLAorICAgIGdpbnQgeDEsIGdpbnQgeTEsIGdpbnQgYzEsIGdpbnQgeDIsIGdpbnQgeTIsIGdpbnQgYzIpCit7CisgIGdpbnQgaTsKKyAgZ2ludCBzaWduOworICBnZmxvYXQgYW5nbGUsIGFuZ2xlX2U7CisgIGdmbG9hdCBsZW4xOworCisgIGFuZ2xlX2UgPSBhY29zICgoKHgxIC0geDApICogKHgyIC0geDApICsgKHkxIC0geTApICogKHkyIC0geTApKSAvCisgICAgICAoc3FydCAoKHgxIC0geDApICogKHgxIC0geDApICsgKHkxIC0geTApICogKHkxIC0geTApKSAqCisgICAgICAgICAgc3FydCAoKHgyIC0geDApICogKHgyIC0geDApICsgKHkyIC0geTApICogKHkyIC0geTApKSkpOworCisgIGxlbjEgPSBzcXJ0ICgoeDEgLSB4MCkgKiAoeDEgLSB4MCkgKyAoeTEgLSB5MCkgKiAoeTEgLSB5MCkpOworCisgIGlmICh4MSA9PSB4MikgeworICAgIHNpZ24gPSBTSUdOICh5MiAtIHkxKTsKKworICAgIGZvciAoaSA9IHkxOyBpICE9ICh5MiArIHNpZ24pOyBpICs9IHNpZ24pIHsKKyAgICAgIGlmICh5MSA9PSBpKQorICAgICAgICBhbmdsZSA9IDA7CisgICAgICBlbHNlCisgICAgICAgIGFuZ2xlID0gYWNvcyAoKCh4MSAtIHgwKSAqICh4MiAtIHgwKSArICh5MSAtIHkwKSAqIChpIC0geTApKSAvCisgICAgICAgICAgICAobGVuMSAqIHNxcnQgKCh4MSAtIHgwKSAqICh4MSAtIHgwKSArIChpIC0geTApICogKGkgLQorICAgICAgICAgICAgICAgICAgICAgICAgeTApKSkpIC8gYW5nbGVfZTsKKworICAgICAgZHJhd19icmVzZW5oYW1fbGluZSAoZGVzdCwgc3RyaWRlLAorICAgICAgICAgIHgwLCB5MCwgeDEsIGksIChjMiAqIGFuZ2xlICsgYzEgKiAoMS4wIC0gYW5nbGUpKSk7CisgICAgfQorICB9IGVsc2UgaWYgKHkxID09IHkyKSB7CisgICAgc2lnbiA9IFNJR04gKHgyIC0geDEpOworCisgICAgZm9yIChpID0geDE7IGkgIT0gKHgyICsgc2lnbik7IGkgKz0gc2lnbikgeworICAgICAgaWYgKHgxID09IGkpCisgICAgICAgIGFuZ2xlID0gMDsKKyAgICAgIGVsc2UKKyAgICAgICAgYW5nbGUgPSBhY29zICgoKHgxIC0geDApICogKGkgLSB4MCkgKyAoeTEgLSB5MCkgKiAoeTIgLSB5MCkpIC8KKyAgICAgICAgICAgIChsZW4xICogc3FydCAoKGkgLSB4MCkgKiAoaSAtIHgwKSArICh5MiAtIHkwKSAqICh5MiAtCisgICAgICAgICAgICAgICAgICAgICAgICB5MCkpKSkgLyBhbmdsZV9lOworCisgICAgICBkcmF3X2JyZXNlbmhhbV9saW5lIChkZXN0LCBzdHJpZGUsCisgICAgICAgICAgeDAsIHkwLCBpLCB5MSwgKGMyICogYW5nbGUgKyBjMSAqICgxLjAgLSBhbmdsZSkpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ193YXJuaW5nICgicGFpbnQgdHJpYW5nbGUgY2xvY2s6IG5vdCBzdXBwb3J0ZWQiKTsKKyAgICByZXR1cm47CisgIH0KK30KKwordm9pZAorZ3N0X3NtcHRlX3BhaW50X2JveF9jbG9jayAoZ3VpbnQzMiAqIGRlc3QsIGdpbnQgc3RyaWRlLAorICAgIGdpbnQgeDAsIGdpbnQgeTAsIGdpbnQgYzAsCisgICAgZ2ludCB4MSwgZ2ludCB5MSwgZ2ludCBjMSwgZ2ludCB4MiwgZ2ludCB5MiwgZ2ludCBjMikKK3sKKyAgZ2Zsb2F0IGFuZ2xlX20sIGNvbF9tOworICBnaW50IHh2LCB5djsKKworICBpZiAoeDEgPT0geDApIHsKKyAgICB4diA9IHgyOworICAgIHl2ID0geTE7CisgIH0gZWxzZSBpZiAoeTEgPT0geTApIHsKKyAgICB4diA9IHgxOworICAgIHl2ID0geTI7CisgIH0gZWxzZSB7CisgICAgZ193YXJuaW5nICgicGFpbnQgYm94IGNsb2NrOiBub3Qgc3VwcG9ydGVkIik7CisgICAgcmV0dXJuOworICB9CisKKyAgYW5nbGVfbSA9IDIgKiBhY29zICgoKHgxIC0geDApICogKHh2IC0geDApICsgKHkxIC0geTApICogKHl2IC0geTApKSAvCisgICAgICAoc3FydCAoKHgxIC0geDApICogKHgxIC0geDApICsgKHkxIC0geTApICogKHkxIC0geTApKSAqCisgICAgICAgICAgc3FydCAoKHh2IC0geDApICogKHh2IC0geDApICsgKHl2IC0geTApICogKHl2IC0geTApKSkpIC8gTV9QSTsKKworICBjb2xfbSA9IGMyICogYW5nbGVfbSArIGMxICogKDEuMCAtIGFuZ2xlX20pOworCisgIGdzdF9zbXB0ZV9wYWludF90cmlhbmdsZV9jbG9jayAoZGVzdCwgc3RyaWRlLAorICAgICAgeDAsIHkwLCBjMCwgeDEsIHkxLCBjMSwgeHYsIHl2LCBjb2xfbSk7CisgIGdzdF9zbXB0ZV9wYWludF90cmlhbmdsZV9jbG9jayAoZGVzdCwgc3RyaWRlLAorICAgICAgeDAsIHkwLCBjMCwgeHYsIHl2LCBjb2xfbSwgeDIsIHkyLCBjMik7Cit9CmRpZmYgLS1naXQgYS9nc3Qvc21wdGUvcGFpbnQuaCBiL2dzdC9zbXB0ZS9wYWludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MTVlMGIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3Qvc21wdGUvcGFpbnQuaApAQCAtMCwwICsxLDQ3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9TTVBURV9QQUlOVF9IX18KKyNkZWZpbmUgX19HU1RfU01QVEVfUEFJTlRfSF9fCisKKyNpbmNsdWRlIDxnbGliLmg+CisKK3ZvaWQgICAgZ3N0X3NtcHRlX3BhaW50X3Zib3ggICAgICAgICAgICAoZ3VpbnQzMiAqZGVzdCwgZ2ludCBzdHJpZGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50IHgwLCBnaW50IHkwLCBnaW50IGMwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCB4MSwgZ2ludCB5MSwgZ2ludCBjMSk7Cit2b2lkICAgIGdzdF9zbXB0ZV9wYWludF9oYm94ICAgICAgICAgICAgKGd1aW50MzIgKmRlc3QsIGdpbnQgc3RyaWRlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCB4MCwgZ2ludCB5MCwgZ2ludCBjMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgeDEsIGdpbnQgeTEsIGdpbnQgYzEpOworCit2b2lkICAgIGdzdF9zbXB0ZV9wYWludF90cmlhbmdsZV9saW5lYXIgKGd1aW50MzIgKmRlc3QsIGdpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50IHgwLCBnaW50IHkwLCBnaW50IGMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50IHgxLCBnaW50IHkxLCBnaW50IGMxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCB4MiwgZ2ludCB5MiwgZ2ludCBjMik7CisKK3ZvaWQgICAgZ3N0X3NtcHRlX3BhaW50X3RyaWFuZ2xlX2Nsb2NrICAoZ3VpbnQzMiAqZGVzdCwgZ2ludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgeDAsIGdpbnQgeTAsIGdpbnQgYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgeDEsIGdpbnQgeTEsIGdpbnQgYzEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50IHgyLCBnaW50IHkyLCBnaW50IGMyKTsKKwordm9pZCAgICBnc3Rfc21wdGVfcGFpbnRfYm94X2Nsb2NrICAgICAgIChndWludDMyICpkZXN0LCBnaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCB4MCwgZ2ludCB5MCwgZ2ludCBjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCB4MSwgZ2ludCB5MSwgZ2ludCBjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCB4MiwgZ2ludCB5MiwgZ2ludCBjMik7CisKKyNlbmRpZiAvKiBfX0dTVF9TTVBURV9QQUlOVF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9zbXB0ZS9wbHVnaW4uYyBiL2dzdC9zbXB0ZS9wbHVnaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2ViYThhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3NtcHRlL3BsdWdpbi5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOD4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdvb2dsZS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0c21wdGUuaCIKKyNpbmNsdWRlICJnc3RzbXB0ZWFscGhhLmgiCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3Rfc21wdGVfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3NtcHRlX2FscGhhX3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHNtcHRlLAorICAgICJBcHBseSB0aGUgc3RhbmRhcmQgU01QVEUgdHJhbnNpdGlvbnMgb24gdmlkZW8gaW1hZ2VzIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgIkxHUEwiLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3Qvc3BlY3RydW0vLmdpdGlnbm9yZSBiL2dzdC9zcGVjdHJ1bS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZjM2NmYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3Qvc3BlY3RydW0vLmdpdGlnbm9yZQpAQCAtMCwwICsxLDkgQEAKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorKi5vCisqLmxvCisqLmxhCisuZGVwcworLmxpYnMKK2RlbW8tYXVkaW90ZXN0CitkZW1vLW9zc3NyYwpkaWZmIC0tZ2l0IGEvZ3N0L3NwZWN0cnVtL01ha2VmaWxlLmFtIGIvZ3N0L3NwZWN0cnVtL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMGM5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3Qvc3BlY3RydW0vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMSBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0c3BlY3RydW0ubGEKKworbGliZ3N0c3BlY3RydW1fbGFfU09VUkNFUyA9IGdzdHNwZWN0cnVtLmMKK2xpYmdzdHNwZWN0cnVtX2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQ0ZMQUdTKQorbGliZ3N0c3BlY3RydW1fbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIFwKKwktbGdzdGZmdC0kKEdTVF9BUElfVkVSU0lPTikgLWxnc3RhdWRpby0kKEdTVF9BUElfVkVSU0lPTikgXAorCSQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykgJChMSUJNKQorbGliZ3N0c3BlY3RydW1fbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdHNwZWN0cnVtLmgKZGlmZiAtLWdpdCBhL2dzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jIGIvZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlODk2MAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jCkBAIC0wLDAgKzEsMTAwNyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICA8MjAwNiwyMDExPiBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKiAgICAgICAgICAgICAgIDwyMDA3LTIwMDk+IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1zcGVjdHJ1bQorICoKKyAqIFRoZSBTcGVjdHJ1bSBlbGVtZW50IGFuYWx5emVzIHRoZSBmcmVxdWVuY3kgc3BlY3RydW0gb2YgYW4gYXVkaW8gc2lnbmFsLgorICogSWYgdGhlICNHc3RTcGVjdHJ1bTpwb3N0LW1lc3NhZ2VzIHByb3BlcnR5IGlzICVUUlVFLCBpdCBzZW5kcyBhbmFseXNpcyByZXN1bHRzCisgKiBhcyBlbGVtZW50IG1lc3NhZ2VzIG5hbWVkCisgKiA8Y2xhc3NuYW1lPiZxdW90O3NwZWN0cnVtJnF1b3Q7PC9jbGFzc25hbWU+IGFmdGVyIGVhY2ggaW50ZXJ2YWwgb2YgdGltZSBnaXZlbgorICogYnkgdGhlICNHc3RTcGVjdHJ1bTppbnRlcnZhbCBwcm9wZXJ0eS4KKyAqCisgKiBUaGUgbWVzc2FnZSdzIHN0cnVjdHVyZSBjb250YWlucyBzb21lIGNvbWJpbmF0aW9uIG9mIHRoZXNlIGZpZWxkczoKKyAqIDxpdGVtaXplZGxpc3Q+CisgKiA8bGlzdGl0ZW0+CisgKiAgIDxwYXJhPgorICogICAjR3N0Q2xvY2tUaW1lCisgKiAgIDxjbGFzc25hbWU+JnF1b3Q7dGltZXN0YW1wJnF1b3Q7PC9jbGFzc25hbWU+OgorICogICB0aGUgdGltZXN0YW1wIG9mIHRoZSBidWZmZXIgdGhhdCB0cmlnZ2VyZWQgdGhlIG1lc3NhZ2UuCisgKiAgIDwvcGFyYT4KKyAqIDwvbGlzdGl0ZW0+CisgKiA8bGlzdGl0ZW0+CisgKiAgIDxwYXJhPgorICogICAjR3N0Q2xvY2tUaW1lCisgKiAgIDxjbGFzc25hbWU+JnF1b3Q7c3RyZWFtLXRpbWUmcXVvdDs8L2NsYXNzbmFtZT46CisgKiAgIHRoZSBzdHJlYW0gdGltZSBvZiB0aGUgYnVmZmVyLgorICogICA8L3BhcmE+CisgKiA8L2xpc3RpdGVtPgorICogPGxpc3RpdGVtPgorICogICA8cGFyYT4KKyAqICAgI0dzdENsb2NrVGltZQorICogICA8Y2xhc3NuYW1lPiZxdW90O3J1bm5pbmctdGltZSZxdW90OzwvY2xhc3NuYW1lPjoKKyAqICAgdGhlIHJ1bm5pbmdfdGltZSBvZiB0aGUgYnVmZmVyLgorICogICA8L3BhcmE+CisgKiA8L2xpc3RpdGVtPgorICogPGxpc3RpdGVtPgorICogICA8cGFyYT4KKyAqICAgI0dzdENsb2NrVGltZQorICogICA8Y2xhc3NuYW1lPiZxdW90O2R1cmF0aW9uJnF1b3Q7PC9jbGFzc25hbWU+OgorICogICB0aGUgZHVyYXRpb24gb2YgdGhlIGJ1ZmZlci4KKyAqICAgPC9wYXJhPgorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgICNHc3RDbG9ja1RpbWUKKyAqICAgPGNsYXNzbmFtZT4mcXVvdDtlbmR0aW1lJnF1b3Q7PC9jbGFzc25hbWU+OgorICogICB0aGUgZW5kIHRpbWUgb2YgdGhlIGJ1ZmZlciB0aGF0IHRyaWdnZXJlZCB0aGUgbWVzc2FnZSBhcyBzdHJlYW0gdGltZSAodGhpcworICogICBpcyBkZXByZWNhdGVkLCBhcyBpdCBjYW4gYmUgY2FsY3VsYXRlZCBmcm9tIHN0cmVhbS10aW1lICsgZHVyYXRpb24pCisgKiAgIDwvcGFyYT4KKyAqIDwvbGlzdGl0ZW0+CisgKiA8bGlzdGl0ZW0+CisgKiAgIDxwYXJhPgorICogICAjR3N0VmFsdWVMaXN0IG9mICNnZmxvYXQKKyAqICAgPGNsYXNzbmFtZT4mcXVvdDttYWduaXR1ZGUmcXVvdDs8L2NsYXNzbmFtZT46CisgKiAgIHRoZSBsZXZlbCBmb3IgZWFjaCBmcmVxdWVuY3kgYmFuZCBpbiBkQi4gQWxsIHZhbHVlcyBiZWxvdyB0aGUgdmFsdWUgb2YgdGhlCisgKiAgICNHc3RTcGVjdHJ1bTp0aHJlc2hvbGQgcHJvcGVydHkgd2lsbCBiZSBzZXQgdG8gdGhlIHRocmVzaG9sZC4gT25seSBwcmVzZW50CisgKiAgIGlmIHRoZSAjR3N0U3BlY3RydW06bWVzc2FnZS1tYWduaXR1ZGUgcHJvcGVydHkgaXMgJVRSVUUuCisgKiAgIDwvcGFyYT4KKyAqIDwvbGlzdGl0ZW0+CisgKiA8bGlzdGl0ZW0+CisgKiAgIDxwYXJhPgorICogICAjR3N0VmFsdWVMaXN0IG9mICNnZmxvYXQKKyAqICAgPGNsYXNzbmFtZT4mcXVvdDtwaGFzZSZxdW90OzwvY2xhc3NuYW1lPjoKKyAqICAgVGhlIHBoYXNlIGZvciBlYWNoIGZyZXF1ZW5jeSBiYW5kLiBUaGUgdmFsdWUgaXMgYmV0d2VlbiAtcGkgYW5kIHBpLiBPbmx5CisgKiAgIHByZXNlbnQgaWYgdGhlICNHc3RTcGVjdHJ1bTptZXNzYWdlLXBoYXNlIHByb3BlcnR5IGlzICVUUlVFLgorICogICA8L3BhcmE+CisgKiA8L2xpc3RpdGVtPgorICogPC9pdGVtaXplZGxpc3Q+CisgKgorICogSWYgI0dzdFNwZWN0cnVtOm11bHRpLWNoYW5uZWwgcHJvcGVydHkgaXMgc2V0IHRvIHRydWUuIG1hZ25pdHVkZSBhbmQgcGhhc2UKKyAqIGZpZWxkcyB3aWxsIGJlIGVhY2ggYSBuZXN0ZWQgI0dzdFZhbHVlQXJyYXkuIFRoZSBmaXJzdCBkaW1lbnNpb24gYXJlIHRoZQorICogY2hhbm5lbHMgYW5kIHRoZSBzZWNvbmQgZGltZW5zaW9uIGFyZSB0aGUgdmFsdWVzLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGFwcGxpY2F0aW9uPC90aXRsZT4KKyAqIDxpbmZvcm1hbGV4YW1wbGU+PHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJDIj4KKyAqIDx4aTppbmNsdWRlIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzL1hJbmNsdWRlIiBwYXJzZT0idGV4dCIgaHJlZj0iLi4vLi4vLi4vLi4vdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vc3BlY3RydW0tZXhhbXBsZS5jIiAvPgorICogPC9wcm9ncmFtbGlzdGluZz48L2luZm9ybWFsZXhhbXBsZT4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgImdzdHNwZWN0cnVtLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9zcGVjdHJ1bV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3Rfc3BlY3RydW1fZGVidWcKKworLyogZWxlbWVudGZhY3RvcnkgaW5mb3JtYXRpb24gKi8KKyNpZiBHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOCisjIGRlZmluZSBGT1JNQVRTICJ7IFMxNkxFLCBTMjRMRSwgUzMyTEUsIEYzMkxFLCBGNjRMRSB9IgorI2Vsc2UKKyMgZGVmaW5lIEZPUk1BVFMgInsgUzE2QkUsIFMyNEJFLCBTMzJCRSwgRjMyQkUsIEY2NEJFIH0iCisjZW5kaWYKKworI2RlZmluZSBBTExPV0VEX0NBUFMgXAorICBHU1RfQVVESU9fQ0FQU19NQUtFIChGT1JNQVRTKSAiLCAiIFwKKyAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkIgorCisvKiBTcGVjdHJ1bSBwcm9wZXJ0aWVzICovCisjZGVmaW5lIERFRkFVTFRfUE9TVF9NRVNTQUdFUwkgICAgICAgIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9NRVNTQUdFX01BR05JVFVERQlUUlVFCisjZGVmaW5lIERFRkFVTFRfTUVTU0FHRV9QSEFTRQkJRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9JTlRFUlZBTAkJKEdTVF9TRUNPTkQgLyAxMCkKKyNkZWZpbmUgREVGQVVMVF9CQU5EUwkJCTEyOAorI2RlZmluZSBERUZBVUxUX1RIUkVTSE9MRAkJLTYwCisjZGVmaW5lIERFRkFVTFRfTVVMVElfQ0hBTk5FTAkJRkFMU0UKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUE9TVF9NRVNTQUdFUywKKyAgUFJPUF9NRVNTQUdFX01BR05JVFVERSwKKyAgUFJPUF9NRVNTQUdFX1BIQVNFLAorICBQUk9QX0lOVEVSVkFMLAorICBQUk9QX0JBTkRTLAorICBQUk9QX1RIUkVTSE9MRCwKKyAgUFJPUF9NVUxUSV9DSEFOTkVMCit9OworCisjZGVmaW5lIGdzdF9zcGVjdHJ1bV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RTcGVjdHJ1bSwgZ3N0X3NwZWN0cnVtLCBHU1RfVFlQRV9BVURJT19GSUxURVIpOworCitzdGF0aWMgdm9pZCBnc3Rfc3BlY3RydW1fZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X3NwZWN0cnVtX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9zcGVjdHJ1bV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NwZWN0cnVtX3N0YXJ0IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpOworc3RhdGljIGdib29sZWFuIGdzdF9zcGVjdHJ1bV9zdG9wIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3NwZWN0cnVtX3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdEJ1ZmZlciAqIGluKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc3BlY3RydW1fc2V0dXAgKEdzdEF1ZGlvRmlsdGVyICogYmFzZSwKKyAgICBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKTsKKworc3RhdGljIHZvaWQKK2dzdF9zcGVjdHJ1bV9jbGFzc19pbml0IChHc3RTcGVjdHJ1bUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqdHJhbnNfY2xhc3MgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKGtsYXNzKTsKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyAqZmlsdGVyX2NsYXNzID0gR1NUX0FVRElPX0ZJTFRFUl9DTEFTUyAoa2xhc3MpOworICBHc3RDYXBzICpjYXBzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9zcGVjdHJ1bV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9zcGVjdHJ1bV9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3NwZWN0cnVtX2ZpbmFsaXplOworCisgIHRyYW5zX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3BlY3RydW1fc3RhcnQpOworICB0cmFuc19jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3BlY3RydW1fc3RvcCk7CisgIHRyYW5zX2NsYXNzLT50cmFuc2Zvcm1faXAgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NwZWN0cnVtX3RyYW5zZm9ybV9pcCk7CisgIHRyYW5zX2NsYXNzLT5wYXNzdGhyb3VnaF9vbl9zYW1lX2NhcHMgPSBUUlVFOworCisgIGZpbHRlcl9jbGFzcy0+c2V0dXAgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NwZWN0cnVtX3NldHVwKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BPU1RfTUVTU0FHRVMsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInBvc3QtbWVzc2FnZXMiLCAiUG9zdCBNZXNzYWdlcyIsCisgICAgICAgICAgIldoZXRoZXIgdG8gcG9zdCBhICdzcGVjdHJ1bScgZWxlbWVudCBtZXNzYWdlIG9uIHRoZSBidXMgZm9yIGVhY2ggIgorICAgICAgICAgICJwYXNzZWQgaW50ZXJ2YWwiLCBERUZBVUxUX1BPU1RfTUVTU0FHRVMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NRVNTQUdFX01BR05JVFVERSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgibWVzc2FnZS1tYWduaXR1ZGUiLCAiTWFnbml0dWRlIiwKKyAgICAgICAgICAiV2hldGhlciB0byBhZGQgYSAnbWFnbml0dWRlJyBmaWVsZCB0byB0aGUgc3RydWN0dXJlIG9mIGFueSAiCisgICAgICAgICAgIidzcGVjdHJ1bScgZWxlbWVudCBtZXNzYWdlcyBwb3N0ZWQgb24gdGhlIGJ1cyIsCisgICAgICAgICAgREVGQVVMVF9NRVNTQUdFX01BR05JVFVERSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01FU1NBR0VfUEhBU0UsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoIm1lc3NhZ2UtcGhhc2UiLCAiUGhhc2UiLAorICAgICAgICAgICJXaGV0aGVyIHRvIGFkZCBhICdwaGFzZScgZmllbGQgdG8gdGhlIHN0cnVjdHVyZSBvZiBhbnkgIgorICAgICAgICAgICInc3BlY3RydW0nIGVsZW1lbnQgbWVzc2FnZXMgcG9zdGVkIG9uIHRoZSBidXMiLAorICAgICAgICAgIERFRkFVTFRfTUVTU0FHRV9QSEFTRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9JTlRFUlZBTCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJpbnRlcnZhbCIsICJJbnRlcnZhbCIsCisgICAgICAgICAgIkludGVydmFsIG9mIHRpbWUgYmV0d2VlbiBtZXNzYWdlIHBvc3RzIChpbiBuYW5vc2Vjb25kcykiLAorICAgICAgICAgIDEsIEdfTUFYVUlOVDY0LCBERUZBVUxUX0lOVEVSVkFMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFORFMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoImJhbmRzIiwgIkJhbmRzIiwgIk51bWJlciBvZiBmcmVxdWVuY3kgYmFuZHMiLAorICAgICAgICAgIDIsICgoZ3VpbnQpIEdfTUFYSU5UICsgMikgLyAyLCBERUZBVUxUX0JBTkRTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVEhSRVNIT0xELAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInRocmVzaG9sZCIsICJUaHJlc2hvbGQiLAorICAgICAgICAgICJkQiB0aHJlc2hvbGQgZm9yIHJlc3VsdC4gQWxsIGxvd2VyIHZhbHVlcyB3aWxsIGJlIHNldCB0byB0aGlzIiwKKyAgICAgICAgICBHX01JTklOVCwgMCwgREVGQVVMVF9USFJFU0hPTEQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NVUxUSV9DSEFOTkVMLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJtdWx0aS1jaGFubmVsIiwgIk11bHRpY2hhbm5lbCByZXN1bHRzIiwKKyAgICAgICAgICAiU2VuZCBzZXBhcmF0ZSByZXN1bHRzIGZvciBlYWNoIGNoYW5uZWwiLAorICAgICAgICAgIERFRkFVTFRfTVVMVElfQ0hBTk5FTCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9zcGVjdHJ1bV9kZWJ1ZywgInNwZWN0cnVtIiwgMCwKKyAgICAgICJhdWRpbyBzcGVjdHJ1bSBhbmFseXNlciBlbGVtZW50Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgIlNwZWN0cnVtIGFuYWx5emVyIiwKKyAgICAgICJGaWx0ZXIvQW5hbHl6ZXIvQXVkaW8iLAorICAgICAgIlJ1biBhbiBGRlQgb24gdGhlIGF1ZGlvIHNpZ25hbCwgb3V0cHV0IHNwZWN0cnVtIGRhdGEiLAorICAgICAgIkVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+LCAiCisgICAgICAiU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PiwgIgorICAgICAgIlNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPiIpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQUxMT1dFRF9DQVBTKTsKKyAgZ3N0X2F1ZGlvX2ZpbHRlcl9jbGFzc19hZGRfcGFkX3RlbXBsYXRlcyAoZmlsdGVyX2NsYXNzLCBjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwZWN0cnVtX2luaXQgKEdzdFNwZWN0cnVtICogc3BlY3RydW0pCit7CisgIHNwZWN0cnVtLT5wb3N0X21lc3NhZ2VzID0gREVGQVVMVF9QT1NUX01FU1NBR0VTOworICBzcGVjdHJ1bS0+bWVzc2FnZV9tYWduaXR1ZGUgPSBERUZBVUxUX01FU1NBR0VfTUFHTklUVURFOworICBzcGVjdHJ1bS0+bWVzc2FnZV9waGFzZSA9IERFRkFVTFRfTUVTU0FHRV9QSEFTRTsKKyAgc3BlY3RydW0tPmludGVydmFsID0gREVGQVVMVF9JTlRFUlZBTDsKKyAgc3BlY3RydW0tPmJhbmRzID0gREVGQVVMVF9CQU5EUzsKKyAgc3BlY3RydW0tPnRocmVzaG9sZCA9IERFRkFVTFRfVEhSRVNIT0xEOworCisgIGdfbXV0ZXhfaW5pdCAoJnNwZWN0cnVtLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGVjdHJ1bV9hbGxvY19jaGFubmVsX2RhdGEgKEdzdFNwZWN0cnVtICogc3BlY3RydW0pCit7CisgIGdpbnQgaTsKKyAgR3N0U3BlY3RydW1DaGFubmVsICpjZDsKKyAgZ3VpbnQgYmFuZHMgPSBzcGVjdHJ1bS0+YmFuZHM7CisgIGd1aW50IG5mZnQgPSAyICogYmFuZHMgLSAyOworCisgIGdfYXNzZXJ0IChzcGVjdHJ1bS0+Y2hhbm5lbF9kYXRhID09IE5VTEwpOworCisgIHNwZWN0cnVtLT5udW1fY2hhbm5lbHMgPSAoc3BlY3RydW0tPm11bHRpX2NoYW5uZWwpID8KKyAgICAgIEdTVF9BVURJT19GSUxURVJfQ0hBTk5FTFMgKHNwZWN0cnVtKSA6IDE7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3BlY3RydW0sICJhbGxvY2F0aW5nIGRhdGEgZm9yICVkIGNoYW5uZWxzIiwKKyAgICAgIHNwZWN0cnVtLT5udW1fY2hhbm5lbHMpOworCisgIHNwZWN0cnVtLT5jaGFubmVsX2RhdGEgPSBnX25ldyAoR3N0U3BlY3RydW1DaGFubmVsLCBzcGVjdHJ1bS0+bnVtX2NoYW5uZWxzKTsKKyAgZm9yIChpID0gMDsgaSA8IHNwZWN0cnVtLT5udW1fY2hhbm5lbHM7IGkrKykgeworICAgIGNkID0gJnNwZWN0cnVtLT5jaGFubmVsX2RhdGFbaV07CisgICAgY2QtPmZmdF9jdHggPSBnc3RfZmZ0X2YzMl9uZXcgKG5mZnQsIEZBTFNFKTsKKyAgICBjZC0+aW5wdXQgPSBnX25ldzAgKGdmbG9hdCwgbmZmdCk7CisgICAgY2QtPmlucHV0X3RtcCA9IGdfbmV3MCAoZ2Zsb2F0LCBuZmZ0KTsKKyAgICBjZC0+ZnJlcWRhdGEgPSBnX25ldzAgKEdzdEZGVEYzMkNvbXBsZXgsIGJhbmRzKTsKKyAgICBjZC0+c3BlY3RfbWFnbml0dWRlID0gZ19uZXcwIChnZmxvYXQsIGJhbmRzKTsKKyAgICBjZC0+c3BlY3RfcGhhc2UgPSBnX25ldzAgKGdmbG9hdCwgYmFuZHMpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BlY3RydW1fZnJlZV9jaGFubmVsX2RhdGEgKEdzdFNwZWN0cnVtICogc3BlY3RydW0pCit7CisgIGlmIChzcGVjdHJ1bS0+Y2hhbm5lbF9kYXRhKSB7CisgICAgZ2ludCBpOworICAgIEdzdFNwZWN0cnVtQ2hhbm5lbCAqY2Q7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcGVjdHJ1bSwgImZyZWVpbmcgZGF0YSBmb3IgJWQgY2hhbm5lbHMiLAorICAgICAgICBzcGVjdHJ1bS0+bnVtX2NoYW5uZWxzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzcGVjdHJ1bS0+bnVtX2NoYW5uZWxzOyBpKyspIHsKKyAgICAgIGNkID0gJnNwZWN0cnVtLT5jaGFubmVsX2RhdGFbaV07CisgICAgICBpZiAoY2QtPmZmdF9jdHgpCisgICAgICAgIGdzdF9mZnRfZjMyX2ZyZWUgKGNkLT5mZnRfY3R4KTsKKyAgICAgIGdfZnJlZSAoY2QtPmlucHV0KTsKKyAgICAgIGdfZnJlZSAoY2QtPmlucHV0X3RtcCk7CisgICAgICBnX2ZyZWUgKGNkLT5mcmVxZGF0YSk7CisgICAgICBnX2ZyZWUgKGNkLT5zcGVjdF9tYWduaXR1ZGUpOworICAgICAgZ19mcmVlIChjZC0+c3BlY3RfcGhhc2UpOworICAgIH0KKyAgICBnX2ZyZWUgKHNwZWN0cnVtLT5jaGFubmVsX2RhdGEpOworICAgIHNwZWN0cnVtLT5jaGFubmVsX2RhdGEgPSBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BlY3RydW1fZmx1c2ggKEdzdFNwZWN0cnVtICogc3BlY3RydW0pCit7CisgIHNwZWN0cnVtLT5udW1fZnJhbWVzID0gMDsKKyAgc3BlY3RydW0tPm51bV9mZnQgPSAwOworCisgIHNwZWN0cnVtLT5hY2N1bXVsYXRlZF9lcnJvciA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BlY3RydW1fcmVzZXRfc3RhdGUgKEdzdFNwZWN0cnVtICogc3BlY3RydW0pCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNwZWN0cnVtLCAicmVzZXR0aW5nIHN0YXRlIik7CisKKyAgZ3N0X3NwZWN0cnVtX2ZyZWVfY2hhbm5lbF9kYXRhIChzcGVjdHJ1bSk7CisgIGdzdF9zcGVjdHJ1bV9mbHVzaCAoc3BlY3RydW0pOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwZWN0cnVtX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RTcGVjdHJ1bSAqc3BlY3RydW0gPSBHU1RfU1BFQ1RSVU0gKG9iamVjdCk7CisKKyAgZ3N0X3NwZWN0cnVtX3Jlc2V0X3N0YXRlIChzcGVjdHJ1bSk7CisgIGdfbXV0ZXhfY2xlYXIgKCZzcGVjdHJ1bS0+bG9jayk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwZWN0cnVtX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTcGVjdHJ1bSAqZmlsdGVyID0gR1NUX1NQRUNUUlVNIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QT1NUX01FU1NBR0VTOgorICAgICAgZmlsdGVyLT5wb3N0X21lc3NhZ2VzID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01FU1NBR0VfTUFHTklUVURFOgorICAgICAgZmlsdGVyLT5tZXNzYWdlX21hZ25pdHVkZSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NRVNTQUdFX1BIQVNFOgorICAgICAgZmlsdGVyLT5tZXNzYWdlX3BoYXNlID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0lOVEVSVkFMOnsKKyAgICAgIGd1aW50NjQgaW50ZXJ2YWwgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIGdfbXV0ZXhfbG9jayAoJmZpbHRlci0+bG9jayk7CisgICAgICBpZiAoZmlsdGVyLT5pbnRlcnZhbCAhPSBpbnRlcnZhbCkgeworICAgICAgICBmaWx0ZXItPmludGVydmFsID0gaW50ZXJ2YWw7CisgICAgICAgIGdzdF9zcGVjdHJ1bV9yZXNldF9zdGF0ZSAoZmlsdGVyKTsKKyAgICAgIH0KKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmZmlsdGVyLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfQkFORFM6eworICAgICAgZ3VpbnQgYmFuZHMgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBnX211dGV4X2xvY2sgKCZmaWx0ZXItPmxvY2spOworICAgICAgaWYgKGZpbHRlci0+YmFuZHMgIT0gYmFuZHMpIHsKKyAgICAgICAgZmlsdGVyLT5iYW5kcyA9IGJhbmRzOworICAgICAgICBnc3Rfc3BlY3RydW1fcmVzZXRfc3RhdGUgKGZpbHRlcik7CisgICAgICB9CisgICAgICBnX211dGV4X3VubG9jayAoJmZpbHRlci0+bG9jayk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX1RIUkVTSE9MRDoKKyAgICAgIGZpbHRlci0+dGhyZXNob2xkID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTVVMVElfQ0hBTk5FTDp7CisgICAgICBnYm9vbGVhbiBtdWx0aV9jaGFubmVsID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgZ19tdXRleF9sb2NrICgmZmlsdGVyLT5sb2NrKTsKKyAgICAgIGlmIChmaWx0ZXItPm11bHRpX2NoYW5uZWwgIT0gbXVsdGlfY2hhbm5lbCkgeworICAgICAgICBmaWx0ZXItPm11bHRpX2NoYW5uZWwgPSBtdWx0aV9jaGFubmVsOworICAgICAgICBnc3Rfc3BlY3RydW1fcmVzZXRfc3RhdGUgKGZpbHRlcik7CisgICAgICB9CisgICAgICBnX211dGV4X3VubG9jayAoJmZpbHRlci0+bG9jayk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwZWN0cnVtX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTcGVjdHJ1bSAqZmlsdGVyID0gR1NUX1NQRUNUUlVNIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QT1NUX01FU1NBR0VTOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIGZpbHRlci0+cG9zdF9tZXNzYWdlcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUVTU0FHRV9NQUdOSVRVREU6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZmlsdGVyLT5tZXNzYWdlX21hZ25pdHVkZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUVTU0FHRV9QSEFTRToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBmaWx0ZXItPm1lc3NhZ2VfcGhhc2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0lOVEVSVkFMOgorICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgZmlsdGVyLT5pbnRlcnZhbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkFORFM6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgZmlsdGVyLT5iYW5kcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSRVNIT0xEOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZmlsdGVyLT50aHJlc2hvbGQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01VTFRJX0NIQU5ORUw6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZmlsdGVyLT5tdWx0aV9jaGFubmVsKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BlY3RydW1fc3RhcnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucykKK3sKKyAgR3N0U3BlY3RydW0gKnNwZWN0cnVtID0gR1NUX1NQRUNUUlVNICh0cmFucyk7CisKKyAgZ3N0X3NwZWN0cnVtX3Jlc2V0X3N0YXRlIChzcGVjdHJ1bSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NwZWN0cnVtX3N0b3AgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucykKK3sKKyAgR3N0U3BlY3RydW0gKnNwZWN0cnVtID0gR1NUX1NQRUNUUlVNICh0cmFucyk7CisKKyAgZ3N0X3NwZWN0cnVtX3Jlc2V0X3N0YXRlIChzcGVjdHJ1bSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIG1peGluZyBkYXRhIHJlYWRlcnMgKi8KKworc3RhdGljIHZvaWQKK2lucHV0X2RhdGFfbWl4ZWRfZmxvYXQgKGNvbnN0IGd1aW50OCAqIF9pbiwgZ2Zsb2F0ICogb3V0LCBndWludCBsZW4sCisgICAgZ3VpbnQgY2hhbm5lbHMsIGdmbG9hdCBtYXhfdmFsdWUsIGd1aW50IG9wLCBndWludCBuZmZ0KQoreworICBndWludCBpLCBqLCBpcCA9IDA7CisgIGdmbG9hdCB2OworICBnZmxvYXQgKmluID0gKGdmbG9hdCAqKSBfaW47CisKKyAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7CisgICAgdiA9IGluW2lwKytdOworICAgIGZvciAoaSA9IDE7IGkgPCBjaGFubmVsczsgaSsrKQorICAgICAgdiArPSBpbltpcCsrXTsKKyAgICBvdXRbb3BdID0gdiAvIGNoYW5uZWxzOworICAgIG9wID0gKG9wICsgMSkgJSBuZmZ0OworICB9Cit9CisKK3N0YXRpYyB2b2lkCitpbnB1dF9kYXRhX21peGVkX2RvdWJsZSAoY29uc3QgZ3VpbnQ4ICogX2luLCBnZmxvYXQgKiBvdXQsIGd1aW50IGxlbiwKKyAgICBndWludCBjaGFubmVscywgZ2Zsb2F0IG1heF92YWx1ZSwgZ3VpbnQgb3AsIGd1aW50IG5mZnQpCit7CisgIGd1aW50IGksIGosIGlwID0gMDsKKyAgZ2Zsb2F0IHY7CisgIGdkb3VibGUgKmluID0gKGdkb3VibGUgKikgX2luOworCisgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykgeworICAgIHYgPSBpbltpcCsrXTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgY2hhbm5lbHM7IGkrKykKKyAgICAgIHYgKz0gaW5baXArK107CisgICAgb3V0W29wXSA9IHYgLyBjaGFubmVsczsKKyAgICBvcCA9IChvcCArIDEpICUgbmZmdDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAoraW5wdXRfZGF0YV9taXhlZF9pbnQzMl9tYXggKGNvbnN0IGd1aW50OCAqIF9pbiwgZ2Zsb2F0ICogb3V0LCBndWludCBsZW4sCisgICAgZ3VpbnQgY2hhbm5lbHMsIGdmbG9hdCBtYXhfdmFsdWUsIGd1aW50IG9wLCBndWludCBuZmZ0KQoreworICBndWludCBpLCBqLCBpcCA9IDA7CisgIGdpbnQzMiAqaW4gPSAoZ2ludDMyICopIF9pbjsKKyAgZ2Zsb2F0IHY7CisKKyAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7CisgICAgdiA9IGluW2lwKytdIC8gbWF4X3ZhbHVlOworICAgIGZvciAoaSA9IDE7IGkgPCBjaGFubmVsczsgaSsrKQorICAgICAgdiArPSBpbltpcCsrXSAvIG1heF92YWx1ZTsKKyAgICBvdXRbb3BdID0gdiAvIGNoYW5uZWxzOworICAgIG9wID0gKG9wICsgMSkgJSBuZmZ0OworICB9Cit9CisKK3N0YXRpYyB2b2lkCitpbnB1dF9kYXRhX21peGVkX2ludDI0X21heCAoY29uc3QgZ3VpbnQ4ICogX2luLCBnZmxvYXQgKiBvdXQsIGd1aW50IGxlbiwKKyAgICBndWludCBjaGFubmVscywgZ2Zsb2F0IG1heF92YWx1ZSwgZ3VpbnQgb3AsIGd1aW50IG5mZnQpCit7CisgIGd1aW50IGksIGo7CisgIGdmbG9hdCB2ID0gMC4wOworCisgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CisjaWYgR19CWVRFX09SREVSID09IEdfQklHX0VORElBTgorICAgICAgZ2ludDMyIHZhbHVlID0gR1NUX1JFQURfVUlOVDI0X0JFIChfaW4pOworI2Vsc2UKKyAgICAgIGdpbnQzMiB2YWx1ZSA9IEdTVF9SRUFEX1VJTlQyNF9MRSAoX2luKTsKKyNlbmRpZgorICAgICAgaWYgKHZhbHVlICYgMHgwMDgwMDAwMCkKKyAgICAgICAgdmFsdWUgfD0gMHhmZjAwMDAwMDsKKyAgICAgIHYgKz0gdmFsdWUgLyBtYXhfdmFsdWU7CisgICAgICBfaW4gKz0gMzsKKyAgICB9CisgICAgb3V0W29wXSA9IHYgLyBjaGFubmVsczsKKyAgICBvcCA9IChvcCArIDEpICUgbmZmdDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAoraW5wdXRfZGF0YV9taXhlZF9pbnQxNl9tYXggKGNvbnN0IGd1aW50OCAqIF9pbiwgZ2Zsb2F0ICogb3V0LCBndWludCBsZW4sCisgICAgZ3VpbnQgY2hhbm5lbHMsIGdmbG9hdCBtYXhfdmFsdWUsIGd1aW50IG9wLCBndWludCBuZmZ0KQoreworICBndWludCBpLCBqLCBpcCA9IDA7CisgIGdpbnQxNiAqaW4gPSAoZ2ludDE2ICopIF9pbjsKKyAgZ2Zsb2F0IHY7CisKKyAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7CisgICAgdiA9IGluW2lwKytdIC8gbWF4X3ZhbHVlOworICAgIGZvciAoaSA9IDE7IGkgPCBjaGFubmVsczsgaSsrKQorICAgICAgdiArPSBpbltpcCsrXSAvIG1heF92YWx1ZTsKKyAgICBvdXRbb3BdID0gdiAvIGNoYW5uZWxzOworICAgIG9wID0gKG9wICsgMSkgJSBuZmZ0OworICB9Cit9CisKKy8qIG5vbiBtaXhpbmcgZGF0YSByZWFkZXJzICovCisKK3N0YXRpYyB2b2lkCitpbnB1dF9kYXRhX2Zsb2F0IChjb25zdCBndWludDggKiBfaW4sIGdmbG9hdCAqIG91dCwgZ3VpbnQgbGVuLCBndWludCBjaGFubmVscywKKyAgICBnZmxvYXQgbWF4X3ZhbHVlLCBndWludCBvcCwgZ3VpbnQgbmZmdCkKK3sKKyAgZ3VpbnQgaiwgaXA7CisgIGdmbG9hdCAqaW4gPSAoZ2Zsb2F0ICopIF9pbjsKKworICBmb3IgKGogPSAwLCBpcCA9IDA7IGogPCBsZW47IGorKywgaXAgKz0gY2hhbm5lbHMpIHsKKyAgICBvdXRbb3BdID0gaW5baXBdOworICAgIG9wID0gKG9wICsgMSkgJSBuZmZ0OworICB9Cit9CisKK3N0YXRpYyB2b2lkCitpbnB1dF9kYXRhX2RvdWJsZSAoY29uc3QgZ3VpbnQ4ICogX2luLCBnZmxvYXQgKiBvdXQsIGd1aW50IGxlbiwgZ3VpbnQgY2hhbm5lbHMsCisgICAgZ2Zsb2F0IG1heF92YWx1ZSwgZ3VpbnQgb3AsIGd1aW50IG5mZnQpCit7CisgIGd1aW50IGosIGlwOworICBnZG91YmxlICppbiA9IChnZG91YmxlICopIF9pbjsKKworICBmb3IgKGogPSAwLCBpcCA9IDA7IGogPCBsZW47IGorKywgaXAgKz0gY2hhbm5lbHMpIHsKKyAgICBvdXRbb3BdID0gaW5baXBdOworICAgIG9wID0gKG9wICsgMSkgJSBuZmZ0OworICB9Cit9CisKK3N0YXRpYyB2b2lkCitpbnB1dF9kYXRhX2ludDMyX21heCAoY29uc3QgZ3VpbnQ4ICogX2luLCBnZmxvYXQgKiBvdXQsIGd1aW50IGxlbiwKKyAgICBndWludCBjaGFubmVscywgZ2Zsb2F0IG1heF92YWx1ZSwgZ3VpbnQgb3AsIGd1aW50IG5mZnQpCit7CisgIGd1aW50IGosIGlwOworICBnaW50MzIgKmluID0gKGdpbnQzMiAqKSBfaW47CisKKyAgZm9yIChqID0gMCwgaXAgPSAwOyBqIDwgbGVuOyBqKyssIGlwICs9IGNoYW5uZWxzKSB7CisgICAgb3V0W29wXSA9IGluW2lwXSAvIG1heF92YWx1ZTsKKyAgICBvcCA9IChvcCArIDEpICUgbmZmdDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAoraW5wdXRfZGF0YV9pbnQyNF9tYXggKGNvbnN0IGd1aW50OCAqIF9pbiwgZ2Zsb2F0ICogb3V0LCBndWludCBsZW4sCisgICAgZ3VpbnQgY2hhbm5lbHMsIGdmbG9hdCBtYXhfdmFsdWUsIGd1aW50IG9wLCBndWludCBuZmZ0KQoreworICBndWludCBqOworCisgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykgeworI2lmIEdfQllURV9PUkRFUiA9PSBHX0JJR19FTkRJQU4KKyAgICBnaW50MzIgdiA9IEdTVF9SRUFEX1VJTlQyNF9CRSAoX2luKTsKKyNlbHNlCisgICAgZ2ludDMyIHYgPSBHU1RfUkVBRF9VSU5UMjRfTEUgKF9pbik7CisjZW5kaWYKKyAgICBpZiAodiAmIDB4MDA4MDAwMDApCisgICAgICB2IHw9IDB4ZmYwMDAwMDA7CisgICAgX2luICs9IDMgKiBjaGFubmVsczsKKyAgICBvdXRbb3BdID0gdiAvIG1heF92YWx1ZTsKKyAgICBvcCA9IChvcCArIDEpICUgbmZmdDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAoraW5wdXRfZGF0YV9pbnQxNl9tYXggKGNvbnN0IGd1aW50OCAqIF9pbiwgZ2Zsb2F0ICogb3V0LCBndWludCBsZW4sCisgICAgZ3VpbnQgY2hhbm5lbHMsIGdmbG9hdCBtYXhfdmFsdWUsIGd1aW50IG9wLCBndWludCBuZmZ0KQoreworICBndWludCBqLCBpcDsKKyAgZ2ludDE2ICppbiA9IChnaW50MTYgKikgX2luOworCisgIGZvciAoaiA9IDAsIGlwID0gMDsgaiA8IGxlbjsgaisrLCBpcCArPSBjaGFubmVscykgeworICAgIG91dFtvcF0gPSBpbltpcF0gLyBtYXhfdmFsdWU7CisgICAgb3AgPSAob3AgKyAxKSAlIG5mZnQ7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BlY3RydW1fc2V0dXAgKEdzdEF1ZGlvRmlsdGVyICogYmFzZSwgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbykKK3sKKyAgR3N0U3BlY3RydW0gKnNwZWN0cnVtID0gR1NUX1NQRUNUUlVNIChiYXNlKTsKKyAgZ2Jvb2xlYW4gbXVsdGlfY2hhbm5lbCA9IHNwZWN0cnVtLT5tdWx0aV9jaGFubmVsOworICBHc3RTcGVjdHJ1bUlucHV0RGF0YSBpbnB1dF9kYXRhID0gTlVMTDsKKworICBnX211dGV4X2xvY2sgKCZzcGVjdHJ1bS0+bG9jayk7CisgIHN3aXRjaCAoR1NUX0FVRElPX0lORk9fRk9STUFUIChpbmZvKSkgeworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMTY6CisgICAgICBpbnB1dF9kYXRhID0KKyAgICAgICAgICBtdWx0aV9jaGFubmVsID8gaW5wdXRfZGF0YV9pbnQxNl9tYXggOiBpbnB1dF9kYXRhX21peGVkX2ludDE2X21heDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMjQ6CisgICAgICBpbnB1dF9kYXRhID0KKyAgICAgICAgICBtdWx0aV9jaGFubmVsID8gaW5wdXRfZGF0YV9pbnQyNF9tYXggOiBpbnB1dF9kYXRhX21peGVkX2ludDI0X21heDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMzI6CisgICAgICBpbnB1dF9kYXRhID0KKyAgICAgICAgICBtdWx0aV9jaGFubmVsID8gaW5wdXRfZGF0YV9pbnQzMl9tYXggOiBpbnB1dF9kYXRhX21peGVkX2ludDMyX21heDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GMzI6CisgICAgICBpbnB1dF9kYXRhID0gbXVsdGlfY2hhbm5lbCA/IGlucHV0X2RhdGFfZmxvYXQgOiBpbnB1dF9kYXRhX21peGVkX2Zsb2F0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX0Y2NDoKKyAgICAgIGlucHV0X2RhdGEgPSBtdWx0aV9jaGFubmVsID8gaW5wdXRfZGF0YV9kb3VibGUgOiBpbnB1dF9kYXRhX21peGVkX2RvdWJsZTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICB9CisgIHNwZWN0cnVtLT5pbnB1dF9kYXRhID0gaW5wdXRfZGF0YTsKKworICBnc3Rfc3BlY3RydW1fcmVzZXRfc3RhdGUgKHNwZWN0cnVtKTsKKyAgZ19tdXRleF91bmxvY2sgKCZzcGVjdHJ1bS0+bG9jayk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHVmFsdWUgKgorZ3N0X3NwZWN0cnVtX21lc3NhZ2VfYWRkX2NvbnRhaW5lciAoR3N0U3RydWN0dXJlICogcywgR1R5cGUgdHlwZSwKKyAgICBjb25zdCBnY2hhciAqIG5hbWUpCit7CisgIEdWYWx1ZSB2ID0geyAwLCB9OworCisgIGdfdmFsdWVfaW5pdCAoJnYsIHR5cGUpOworICAvKiB3aWxsIGNvcHktYnktdmFsdWUgKi8KKyAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKHMsIG5hbWUsICZ2KTsKKyAgZ192YWx1ZV91bnNldCAoJnYpOworICByZXR1cm4gKEdWYWx1ZSAqKSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BlY3RydW1fbWVzc2FnZV9hZGRfbGlzdCAoR1ZhbHVlICogY3YsIGdmbG9hdCAqIGRhdGEsIGd1aW50IG51bV92YWx1ZXMpCit7CisgIEdWYWx1ZSB2ID0geyAwLCB9OworICBndWludCBpOworCisgIGdfdmFsdWVfaW5pdCAoJnYsIEdfVFlQRV9GTE9BVCk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fdmFsdWVzOyBpKyspIHsKKyAgICBnX3ZhbHVlX3NldF9mbG9hdCAoJnYsIGRhdGFbaV0pOworICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoY3YsICZ2KTsgICAgICAgLyogY29waWVzIGJ5IHZhbHVlICovCisgIH0KKyAgZ192YWx1ZV91bnNldCAoJnYpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwZWN0cnVtX21lc3NhZ2VfYWRkX2FycmF5IChHVmFsdWUgKiBjdiwgZ2Zsb2F0ICogZGF0YSwgZ3VpbnQgbnVtX3ZhbHVlcykKK3sKKyAgR1ZhbHVlIHYgPSB7IDAsIH07CisgIEdWYWx1ZSBhID0geyAwLCB9OworICBndWludCBpOworCisgIGdfdmFsdWVfaW5pdCAoJmEsIEdTVF9UWVBFX0FSUkFZKTsKKworICBnX3ZhbHVlX2luaXQgKCZ2LCBHX1RZUEVfRkxPQVQpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3ZhbHVlczsgaSsrKSB7CisgICAgZ192YWx1ZV9zZXRfZmxvYXQgKCZ2LCBkYXRhW2ldKTsKKyAgICBnc3RfdmFsdWVfYXJyYXlfYXBwZW5kX3ZhbHVlICgmYSwgJnYpOyAgICAgIC8qIGNvcGllcyBieSB2YWx1ZSAqLworICB9CisgIGdfdmFsdWVfdW5zZXQgKCZ2KTsKKworICBnc3RfdmFsdWVfYXJyYXlfYXBwZW5kX3ZhbHVlIChjdiwgJmEpOyAgICAgICAgLyogY29waWVzIGJ5IHZhbHVlICovCisgIGdfdmFsdWVfdW5zZXQgKCZhKTsKK30KKworc3RhdGljIEdzdE1lc3NhZ2UgKgorZ3N0X3NwZWN0cnVtX21lc3NhZ2VfbmV3IChHc3RTcGVjdHJ1bSAqIHNwZWN0cnVtLCBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLAorICAgIEdzdENsb2NrVGltZSBkdXJhdGlvbikKK3sKKyAgR3N0QmFzZVRyYW5zZm9ybSAqdHJhbnMgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0FTVCAoc3BlY3RydW0pOworICBHc3RTcGVjdHJ1bUNoYW5uZWwgKmNkOworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIEdWYWx1ZSAqbWN2ID0gTlVMTCwgKnBjdiA9IE5VTEw7CisgIEdzdENsb2NrVGltZSBlbmR0aW1lLCBydW5uaW5nX3RpbWUsIHN0cmVhbV90aW1lOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNwZWN0cnVtLCAicHJlcGFyaW5nIG1lc3NhZ2UsIGJhbmRzID0lZCAiLCBzcGVjdHJ1bS0+YmFuZHMpOworCisgIHJ1bm5pbmdfdGltZSA9IGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJnRyYW5zLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICB0aW1lc3RhbXApOworICBzdHJlYW1fdGltZSA9IGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmdHJhbnMtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgIHRpbWVzdGFtcCk7CisgIC8qIGVuZHRpbWUgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisgIGVuZHRpbWUgPSBzdHJlYW1fdGltZSArIGR1cmF0aW9uOworCisgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAoInNwZWN0cnVtIiwKKyAgICAgICJlbmR0aW1lIiwgR1NUX1RZUEVfQ0xPQ0tfVElNRSwgZW5kdGltZSwKKyAgICAgICJ0aW1lc3RhbXAiLCBHX1RZUEVfVUlOVDY0LCB0aW1lc3RhbXAsCisgICAgICAic3RyZWFtLXRpbWUiLCBHX1RZUEVfVUlOVDY0LCBzdHJlYW1fdGltZSwKKyAgICAgICJydW5uaW5nLXRpbWUiLCBHX1RZUEVfVUlOVDY0LCBydW5uaW5nX3RpbWUsCisgICAgICAiZHVyYXRpb24iLCBHX1RZUEVfVUlOVDY0LCBkdXJhdGlvbiwgTlVMTCk7CisKKyAgaWYgKCFzcGVjdHJ1bS0+bXVsdGlfY2hhbm5lbCkgeworICAgIGNkID0gJnNwZWN0cnVtLT5jaGFubmVsX2RhdGFbMF07CisKKyAgICBpZiAoc3BlY3RydW0tPm1lc3NhZ2VfbWFnbml0dWRlKSB7CisgICAgICAvKiBGSVhNRSAwLjExOiB0aGlzIHNob3VsZCBiZSBhbiBhcnJheSwgbm90IGEgbGlzdCAqLworICAgICAgbWN2ID0gZ3N0X3NwZWN0cnVtX21lc3NhZ2VfYWRkX2NvbnRhaW5lciAocywgR1NUX1RZUEVfTElTVCwgIm1hZ25pdHVkZSIpOworICAgICAgZ3N0X3NwZWN0cnVtX21lc3NhZ2VfYWRkX2xpc3QgKG1jdiwgY2QtPnNwZWN0X21hZ25pdHVkZSwgc3BlY3RydW0tPmJhbmRzKTsKKyAgICB9CisgICAgaWYgKHNwZWN0cnVtLT5tZXNzYWdlX3BoYXNlKSB7CisgICAgICAvKiBGSVhNRSAwLjExOiB0aGlzIHNob3VsZCBiZSBhbiBhcnJheSwgbm90IGEgbGlzdCAqLworICAgICAgcGN2ID0gZ3N0X3NwZWN0cnVtX21lc3NhZ2VfYWRkX2NvbnRhaW5lciAocywgR1NUX1RZUEVfTElTVCwgInBoYXNlIik7CisgICAgICBnc3Rfc3BlY3RydW1fbWVzc2FnZV9hZGRfbGlzdCAocGN2LCBjZC0+c3BlY3RfcGhhc2UsIHNwZWN0cnVtLT5iYW5kcyk7CisgICAgfQorICB9IGVsc2UgeworICAgIGd1aW50IGM7CisgICAgZ3VpbnQgY2hhbm5lbHMgPSBHU1RfQVVESU9fRklMVEVSX0NIQU5ORUxTIChzcGVjdHJ1bSk7CisKKyAgICBpZiAoc3BlY3RydW0tPm1lc3NhZ2VfbWFnbml0dWRlKSB7CisgICAgICBtY3YgPSBnc3Rfc3BlY3RydW1fbWVzc2FnZV9hZGRfY29udGFpbmVyIChzLCBHU1RfVFlQRV9BUlJBWSwgIm1hZ25pdHVkZSIpOworICAgIH0KKyAgICBpZiAoc3BlY3RydW0tPm1lc3NhZ2VfcGhhc2UpIHsKKyAgICAgIHBjdiA9IGdzdF9zcGVjdHJ1bV9tZXNzYWdlX2FkZF9jb250YWluZXIgKHMsIEdTVF9UWVBFX0FSUkFZLCAicGhhc2UiKTsKKyAgICB9CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykgeworICAgICAgY2QgPSAmc3BlY3RydW0tPmNoYW5uZWxfZGF0YVtjXTsKKworICAgICAgaWYgKHNwZWN0cnVtLT5tZXNzYWdlX21hZ25pdHVkZSkgeworICAgICAgICBnc3Rfc3BlY3RydW1fbWVzc2FnZV9hZGRfYXJyYXkgKG1jdiwgY2QtPnNwZWN0X21hZ25pdHVkZSwKKyAgICAgICAgICAgIHNwZWN0cnVtLT5iYW5kcyk7CisgICAgICB9CisgICAgICBpZiAoc3BlY3RydW0tPm1lc3NhZ2VfcGhhc2UpIHsKKyAgICAgICAgZ3N0X3NwZWN0cnVtX21lc3NhZ2VfYWRkX2FycmF5IChwY3YsIGNkLT5zcGVjdF9waGFzZSwgc3BlY3RydW0tPmJhbmRzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGdzdF9tZXNzYWdlX25ld19lbGVtZW50IChHU1RfT0JKRUNUIChzcGVjdHJ1bSksIHMpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwZWN0cnVtX3J1bl9mZnQgKEdzdFNwZWN0cnVtICogc3BlY3RydW0sIEdzdFNwZWN0cnVtQ2hhbm5lbCAqIGNkLAorICAgIGd1aW50IGlucHV0X3BvcykKK3sKKyAgZ3VpbnQgaTsKKyAgZ3VpbnQgYmFuZHMgPSBzcGVjdHJ1bS0+YmFuZHM7CisgIGd1aW50IG5mZnQgPSAyICogYmFuZHMgLSAyOworICBnaW50IHRocmVzaG9sZCA9IHNwZWN0cnVtLT50aHJlc2hvbGQ7CisgIGdmbG9hdCAqaW5wdXQgPSBjZC0+aW5wdXQ7CisgIGdmbG9hdCAqaW5wdXRfdG1wID0gY2QtPmlucHV0X3RtcDsKKyAgZ2Zsb2F0ICpzcGVjdF9tYWduaXR1ZGUgPSBjZC0+c3BlY3RfbWFnbml0dWRlOworICBnZmxvYXQgKnNwZWN0X3BoYXNlID0gY2QtPnNwZWN0X3BoYXNlOworICBHc3RGRlRGMzJDb21wbGV4ICpmcmVxZGF0YSA9IGNkLT5mcmVxZGF0YTsKKyAgR3N0RkZURjMyICpmZnRfY3R4ID0gY2QtPmZmdF9jdHg7CisKKyAgZm9yIChpID0gMDsgaSA8IG5mZnQ7IGkrKykKKyAgICBpbnB1dF90bXBbaV0gPSBpbnB1dFsoaW5wdXRfcG9zICsgaSkgJSBuZmZ0XTsKKworICBnc3RfZmZ0X2YzMl93aW5kb3cgKGZmdF9jdHgsIGlucHV0X3RtcCwgR1NUX0ZGVF9XSU5ET1dfSEFNTUlORyk7CisKKyAgZ3N0X2ZmdF9mMzJfZmZ0IChmZnRfY3R4LCBpbnB1dF90bXAsIGZyZXFkYXRhKTsKKworICBpZiAoc3BlY3RydW0tPm1lc3NhZ2VfbWFnbml0dWRlKSB7CisgICAgZ2RvdWJsZSB2YWw7CisgICAgLyogQ2FsY3VsYXRlIG1hZ25pdHVkZSBpbiBkYiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBiYW5kczsgaSsrKSB7CisgICAgICB2YWwgPSBmcmVxZGF0YVtpXS5yICogZnJlcWRhdGFbaV0ucjsKKyAgICAgIHZhbCArPSBmcmVxZGF0YVtpXS5pICogZnJlcWRhdGFbaV0uaTsKKyAgICAgIHZhbCAvPSBuZmZ0ICogbmZmdDsKKyAgICAgIHZhbCA9IDEwLjAgKiBsb2cxMCAodmFsKTsKKyAgICAgIGlmICh2YWwgPCB0aHJlc2hvbGQpCisgICAgICAgIHZhbCA9IHRocmVzaG9sZDsKKyAgICAgIHNwZWN0X21hZ25pdHVkZVtpXSArPSB2YWw7CisgICAgfQorICB9CisKKyAgaWYgKHNwZWN0cnVtLT5tZXNzYWdlX3BoYXNlKSB7CisgICAgLyogQ2FsY3VsYXRlIHBoYXNlICovCisgICAgZm9yIChpID0gMDsgaSA8IGJhbmRzOyBpKyspCisgICAgICBzcGVjdF9waGFzZVtpXSArPSBhdGFuMiAoZnJlcWRhdGFbaV0uaSwgZnJlcWRhdGFbaV0ucik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGVjdHJ1bV9wcmVwYXJlX21lc3NhZ2VfZGF0YSAoR3N0U3BlY3RydW0gKiBzcGVjdHJ1bSwKKyAgICBHc3RTcGVjdHJ1bUNoYW5uZWwgKiBjZCkKK3sKKyAgZ3VpbnQgaTsKKyAgZ3VpbnQgYmFuZHMgPSBzcGVjdHJ1bS0+YmFuZHM7CisgIGd1aW50IG51bV9mZnQgPSBzcGVjdHJ1bS0+bnVtX2ZmdDsKKworICAvKiBDYWxjdWxhdGUgYXZlcmFnZSAqLworICBpZiAoc3BlY3RydW0tPm1lc3NhZ2VfbWFnbml0dWRlKSB7CisgICAgZ2Zsb2F0ICpzcGVjdF9tYWduaXR1ZGUgPSBjZC0+c3BlY3RfbWFnbml0dWRlOworICAgIGZvciAoaSA9IDA7IGkgPCBiYW5kczsgaSsrKQorICAgICAgc3BlY3RfbWFnbml0dWRlW2ldIC89IG51bV9mZnQ7CisgIH0KKyAgaWYgKHNwZWN0cnVtLT5tZXNzYWdlX3BoYXNlKSB7CisgICAgZ2Zsb2F0ICpzcGVjdF9waGFzZSA9IGNkLT5zcGVjdF9waGFzZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYmFuZHM7IGkrKykKKyAgICAgIHNwZWN0X3BoYXNlW2ldIC89IG51bV9mZnQ7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGVjdHJ1bV9yZXNldF9tZXNzYWdlX2RhdGEgKEdzdFNwZWN0cnVtICogc3BlY3RydW0sCisgICAgR3N0U3BlY3RydW1DaGFubmVsICogY2QpCit7CisgIGd1aW50IGJhbmRzID0gc3BlY3RydW0tPmJhbmRzOworICBnZmxvYXQgKnNwZWN0X21hZ25pdHVkZSA9IGNkLT5zcGVjdF9tYWduaXR1ZGU7CisgIGdmbG9hdCAqc3BlY3RfcGhhc2UgPSBjZC0+c3BlY3RfcGhhc2U7CisKKyAgLyogcmVzZXQgc3BlY3RydW0gYWNjdW11bGF0b3JzICovCisgIG1lbXNldCAoc3BlY3RfbWFnbml0dWRlLCAwLCBiYW5kcyAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgIG1lbXNldCAoc3BlY3RfcGhhc2UsIDAsIGJhbmRzICogc2l6ZW9mIChnZmxvYXQpKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9zcGVjdHJ1bV90cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RTcGVjdHJ1bSAqc3BlY3RydW0gPSBHU1RfU1BFQ1RSVU0gKHRyYW5zKTsKKyAgZ3VpbnQgcmF0ZSA9IEdTVF9BVURJT19GSUxURVJfUkFURSAoc3BlY3RydW0pOworICBndWludCBjaGFubmVscyA9IEdTVF9BVURJT19GSUxURVJfQ0hBTk5FTFMgKHNwZWN0cnVtKTsKKyAgZ3VpbnQgYnBzID0gR1NUX0FVRElPX0ZJTFRFUl9CUFMgKHNwZWN0cnVtKTsKKyAgZ3VpbnQgYnBmID0gR1NUX0FVRElPX0ZJTFRFUl9CUEYgKHNwZWN0cnVtKTsKKyAgZ3VpbnQgb3V0cHV0X2NoYW5uZWxzID0gc3BlY3RydW0tPm11bHRpX2NoYW5uZWwgPyBjaGFubmVscyA6IDE7CisgIGd1aW50IGM7CisgIGdmbG9hdCBtYXhfdmFsdWUgPSAoMVVMIDw8ICgoYnBzIDw8IDMpIC0gMSkpIC0gMTsKKyAgZ3VpbnQgYmFuZHMgPSBzcGVjdHJ1bS0+YmFuZHM7CisgIGd1aW50IG5mZnQgPSAyICogYmFuZHMgLSAyOworICBndWludCBpbnB1dF9wb3M7CisgIGdmbG9hdCAqaW5wdXQ7CisgIEdzdE1hcEluZm8gbWFwOworICBjb25zdCBndWludDggKmRhdGE7CisgIGdzaXplIHNpemU7CisgIGd1aW50IGZmdF90b2RvLCBtc2dfdG9kbywgYmxvY2tfc2l6ZTsKKyAgZ2Jvb2xlYW4gaGF2ZV9mdWxsX2ludGVydmFsOworICBHc3RTcGVjdHJ1bUNoYW5uZWwgKmNkOworICBHc3RTcGVjdHJ1bUlucHV0RGF0YSBpbnB1dF9kYXRhOworCisgIGdfbXV0ZXhfbG9jayAoJnNwZWN0cnVtLT5sb2NrKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworICBzaXplID0gbWFwLnNpemU7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNwZWN0cnVtLCAiaW5wdXQgc2l6ZTogJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyIsIHNpemUpOworCisgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKGJ1ZmZlcikpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcGVjdHJ1bSwgIkRpc2NvbnRpbnVpdHkgZGV0ZWN0ZWQgLS0gZmx1c2hpbmciKTsKKyAgICBnc3Rfc3BlY3RydW1fZmx1c2ggKHNwZWN0cnVtKTsKKyAgfQorCisgIC8qIElmIHdlIGRvbid0IGhhdmUgYSBGRlQgY29udGV4dCB5ZXQgKG9yIGl0IHdhcyByZXNldCBkdWUgdG8gcGFyYW1ldGVyCisgICAqIGNoYW5nZXMpIGdldCBvbmUgYW5kIGFsbG9jYXRlIG1lbW9yeSBmb3IgZXZlcnl0aGluZworICAgKi8KKyAgaWYgKHNwZWN0cnVtLT5jaGFubmVsX2RhdGEgPT0gTlVMTCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNwZWN0cnVtLCAiYWxsb2NhdGluZyBmb3IgYmFuZHMgJXUiLCBiYW5kcyk7CisKKyAgICBnc3Rfc3BlY3RydW1fYWxsb2NfY2hhbm5lbF9kYXRhIChzcGVjdHJ1bSk7CisKKyAgICAvKiBudW1iZXIgb2Ygc2FtcGxlIGZyYW1lcyB3ZSBwcm9jZXNzIGJlZm9yZSBwb3N0aW5nIGEgbWVzc2FnZQorICAgICAqIGludGVydmFsIGlzIGluIG5zICovCisgICAgc3BlY3RydW0tPmZyYW1lc19wZXJfaW50ZXJ2YWwgPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHNwZWN0cnVtLT5pbnRlcnZhbCwgcmF0ZSwgR1NUX1NFQ09ORCk7CisgICAgc3BlY3RydW0tPmZyYW1lc190b2RvID0gc3BlY3RydW0tPmZyYW1lc19wZXJfaW50ZXJ2YWw7CisgICAgLyogcm91bmRpbmcgZXJyb3IgZm9yIGZyYW1lc19wZXJfaW50ZXJ2YWwgaW4gbnMsCisgICAgICogYWdncmVnYXRlZCBpdCBpbiBhY2N1bXVsYXRlZF9lcnJvciAqLworICAgIHNwZWN0cnVtLT5lcnJvcl9wZXJfaW50ZXJ2YWwgPSAoc3BlY3RydW0tPmludGVydmFsICogcmF0ZSkgJSBHU1RfU0VDT05EOworICAgIGlmIChzcGVjdHJ1bS0+ZnJhbWVzX3Blcl9pbnRlcnZhbCA9PSAwKQorICAgICAgc3BlY3RydW0tPmZyYW1lc19wZXJfaW50ZXJ2YWwgPSAxOworCisgICAgR1NUX0lORk9fT0JKRUNUIChzcGVjdHJ1bSwgImludGVydmFsICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBmcGkgJSIKKyAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCAiLCBlcnJvciAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHNwZWN0cnVtLT5pbnRlcnZhbCksIHNwZWN0cnVtLT5mcmFtZXNfcGVyX2ludGVydmFsLAorICAgICAgICBHU1RfVElNRV9BUkdTIChzcGVjdHJ1bS0+ZXJyb3JfcGVyX2ludGVydmFsKSk7CisKKyAgICBzcGVjdHJ1bS0+aW5wdXRfcG9zID0gMDsKKworICAgIGdzdF9zcGVjdHJ1bV9mbHVzaCAoc3BlY3RydW0pOworICB9CisKKyAgaWYgKHNwZWN0cnVtLT5udW1fZnJhbWVzID09IDApCisgICAgc3BlY3RydW0tPm1lc3NhZ2VfdHMgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKTsKKworICBpbnB1dF9wb3MgPSBzcGVjdHJ1bS0+aW5wdXRfcG9zOworICBpbnB1dF9kYXRhID0gc3BlY3RydW0tPmlucHV0X2RhdGE7CisKKyAgd2hpbGUgKHNpemUgPj0gYnBmKSB7CisgICAgLyogcnVuIGlucHV0X2RhdGEgZm9yIGEgY2h1bmsgb2YgZGF0YSAqLworICAgIGZmdF90b2RvID0gbmZmdCAtIChzcGVjdHJ1bS0+bnVtX2ZyYW1lcyAlIG5mZnQpOworICAgIG1zZ190b2RvID0gc3BlY3RydW0tPmZyYW1lc190b2RvIC0gc3BlY3RydW0tPm51bV9mcmFtZXM7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNwZWN0cnVtLAorICAgICAgICAibWVzc2FnZSBmcmFtZXMgdG9kbzogJXUsIGZmdCBmcmFtZXMgdG9kbzogJXUsIGlucHV0IGZyYW1lcyAlIgorICAgICAgICBHX0dTSVpFX0ZPUk1BVCwgbXNnX3RvZG8sIGZmdF90b2RvLCAoc2l6ZSAvIGJwZikpOworICAgIGJsb2NrX3NpemUgPSBtc2dfdG9kbzsKKyAgICBpZiAoYmxvY2tfc2l6ZSA+IChzaXplIC8gYnBmKSkKKyAgICAgIGJsb2NrX3NpemUgPSAoc2l6ZSAvIGJwZik7CisgICAgaWYgKGJsb2NrX3NpemUgPiBmZnRfdG9kbykKKyAgICAgIGJsb2NrX3NpemUgPSBmZnRfdG9kbzsKKworICAgIGZvciAoYyA9IDA7IGMgPCBvdXRwdXRfY2hhbm5lbHM7IGMrKykgeworICAgICAgY2QgPSAmc3BlY3RydW0tPmNoYW5uZWxfZGF0YVtjXTsKKyAgICAgIGlucHV0ID0gY2QtPmlucHV0OworICAgICAgLyogTW92ZSB0aGUgY3VycmVudCBmcmFtZXMgaW50byBvdXIgcmluZ2J1ZmZlcnMgKi8KKyAgICAgIGlucHV0X2RhdGEgKGRhdGEgKyBjICogYnBzLCBpbnB1dCwgYmxvY2tfc2l6ZSwgY2hhbm5lbHMsIG1heF92YWx1ZSwKKyAgICAgICAgICBpbnB1dF9wb3MsIG5mZnQpOworICAgIH0KKyAgICBkYXRhICs9IGJsb2NrX3NpemUgKiBicGY7CisgICAgc2l6ZSAtPSBibG9ja19zaXplICogYnBmOworICAgIGlucHV0X3BvcyA9IChpbnB1dF9wb3MgKyBibG9ja19zaXplKSAlIG5mZnQ7CisgICAgc3BlY3RydW0tPm51bV9mcmFtZXMgKz0gYmxvY2tfc2l6ZTsKKworICAgIGhhdmVfZnVsbF9pbnRlcnZhbCA9IChzcGVjdHJ1bS0+bnVtX2ZyYW1lcyA9PSBzcGVjdHJ1bS0+ZnJhbWVzX3RvZG8pOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHNwZWN0cnVtLAorICAgICAgICAic2l6ZTogJSIgR19HU0laRV9GT1JNQVQgIiwgZG8tZmZ0ID0gJWQsIGRvLW1lc3NhZ2UgPSAlZCIsIHNpemUsCisgICAgICAgIChzcGVjdHJ1bS0+bnVtX2ZyYW1lcyAlIG5mZnQgPT0gMCksIGhhdmVfZnVsbF9pbnRlcnZhbCk7CisKKyAgICAvKiBJZiB3ZSBoYXZlIGVub3VnaCBmcmFtZXMgZm9yIGFuIEZGVCBvciB3ZSBoYXZlIGFsbCBmcmFtZXMgcmVxdWlyZWQgZm9yCisgICAgICogdGhlIGludGVydmFsIGFuZCB3ZSBoYXZlbid0IHJ1biBhIEZGVCwgdGhlbiBydW4gYW4gRkZUICovCisgICAgaWYgKChzcGVjdHJ1bS0+bnVtX2ZyYW1lcyAlIG5mZnQgPT0gMCkgfHwKKyAgICAgICAgKGhhdmVfZnVsbF9pbnRlcnZhbCAmJiAhc3BlY3RydW0tPm51bV9mZnQpKSB7CisgICAgICBmb3IgKGMgPSAwOyBjIDwgb3V0cHV0X2NoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgY2QgPSAmc3BlY3RydW0tPmNoYW5uZWxfZGF0YVtjXTsKKyAgICAgICAgZ3N0X3NwZWN0cnVtX3J1bl9mZnQgKHNwZWN0cnVtLCBjZCwgaW5wdXRfcG9zKTsKKyAgICAgIH0KKyAgICAgIHNwZWN0cnVtLT5udW1fZmZ0Kys7CisgICAgfQorCisgICAgLyogRG8gd2UgaGF2ZSB0aGUgRkZUcyBmb3Igb25lIGludGVydmFsPyAqLworICAgIGlmIChoYXZlX2Z1bGxfaW50ZXJ2YWwpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNwZWN0cnVtLCAibmZmdDogJXUgZnJhbWVzOiAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgIiBmcGk6ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBlcnJvcjogJSIgR1NUX1RJTUVfRk9STUFULCBuZmZ0LAorICAgICAgICAgIHNwZWN0cnVtLT5udW1fZnJhbWVzLCBzcGVjdHJ1bS0+ZnJhbWVzX3Blcl9pbnRlcnZhbCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChzcGVjdHJ1bS0+YWNjdW11bGF0ZWRfZXJyb3IpKTsKKworICAgICAgc3BlY3RydW0tPmZyYW1lc190b2RvID0gc3BlY3RydW0tPmZyYW1lc19wZXJfaW50ZXJ2YWw7CisgICAgICBpZiAoc3BlY3RydW0tPmFjY3VtdWxhdGVkX2Vycm9yID49IEdTVF9TRUNPTkQpIHsKKyAgICAgICAgc3BlY3RydW0tPmFjY3VtdWxhdGVkX2Vycm9yIC09IEdTVF9TRUNPTkQ7CisgICAgICAgIHNwZWN0cnVtLT5mcmFtZXNfdG9kbysrOworICAgICAgfQorICAgICAgc3BlY3RydW0tPmFjY3VtdWxhdGVkX2Vycm9yICs9IHNwZWN0cnVtLT5lcnJvcl9wZXJfaW50ZXJ2YWw7CisKKyAgICAgIGlmIChzcGVjdHJ1bS0+cG9zdF9tZXNzYWdlcykgeworICAgICAgICBHc3RNZXNzYWdlICptOworCisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBvdXRwdXRfY2hhbm5lbHM7IGMrKykgeworICAgICAgICAgIGNkID0gJnNwZWN0cnVtLT5jaGFubmVsX2RhdGFbY107CisgICAgICAgICAgZ3N0X3NwZWN0cnVtX3ByZXBhcmVfbWVzc2FnZV9kYXRhIChzcGVjdHJ1bSwgY2QpOworICAgICAgICB9CisKKyAgICAgICAgbSA9IGdzdF9zcGVjdHJ1bV9tZXNzYWdlX25ldyAoc3BlY3RydW0sIHNwZWN0cnVtLT5tZXNzYWdlX3RzLAorICAgICAgICAgICAgc3BlY3RydW0tPmludGVydmFsKTsKKworICAgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UIChzcGVjdHJ1bSksIG0pOworICAgICAgfQorCisgICAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHNwZWN0cnVtLT5tZXNzYWdlX3RzKSkKKyAgICAgICAgc3BlY3RydW0tPm1lc3NhZ2VfdHMgKz0KKyAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoc3BlY3RydW0tPm51bV9mcmFtZXMsIEdTVF9TRUNPTkQsIHJhdGUpOworCisgICAgICBmb3IgKGMgPSAwOyBjIDwgb3V0cHV0X2NoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgY2QgPSAmc3BlY3RydW0tPmNoYW5uZWxfZGF0YVtjXTsKKyAgICAgICAgZ3N0X3NwZWN0cnVtX3Jlc2V0X21lc3NhZ2VfZGF0YSAoc3BlY3RydW0sIGNkKTsKKyAgICAgIH0KKyAgICAgIHNwZWN0cnVtLT5udW1fZnJhbWVzID0gMDsKKyAgICAgIHNwZWN0cnVtLT5udW1fZmZ0ID0gMDsKKyAgICB9CisgIH0KKworICBzcGVjdHJ1bS0+aW5wdXRfcG9zID0gaW5wdXRfcG9zOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIGdfbXV0ZXhfdW5sb2NrICgmc3BlY3RydW0tPmxvY2spOworCisgIGdfYXNzZXJ0IChzaXplID09IDApOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInNwZWN0cnVtIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgIEdTVF9UWVBFX1NQRUNUUlVNKTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHNwZWN0cnVtLAorICAgICJSdW4gYW4gRkZUIG9uIHRoZSBhdWRpbyBzaWduYWwsIG91dHB1dCBzcGVjdHJ1bSBkYXRhIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5oIGIvZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlN2U4YQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9TUEVDVFJVTV9IX18KKyNkZWZpbmUgX19HU1RfU1BFQ1RSVU1fSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisjaW5jbHVkZSA8Z3N0L2ZmdC9nc3RmZnRmMzIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1NQRUNUUlVNICAgICAgICAgICAgKGdzdF9zcGVjdHJ1bV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfU1BFQ1RSVU0ob2JqKSAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9TUEVDVFJVTSxHc3RTcGVjdHJ1bSkpCisjZGVmaW5lIEdTVF9JU19TUEVDVFJVTShvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1NQRUNUUlVNKSkKKyNkZWZpbmUgR1NUX1NQRUNUUlVNX0NMQVNTKGtsYXNzKSAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSwgR1NUX1RZUEVfU1BFQ1RSVU0sR3N0U3BlY3RydW1DbGFzcykpCisjZGVmaW5lIEdTVF9JU19TUEVDVFJVTV9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksIEdTVF9UWVBFX1NQRUNUUlVNKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RTcGVjdHJ1bSBHc3RTcGVjdHJ1bTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RTcGVjdHJ1bUNsYXNzIEdzdFNwZWN0cnVtQ2xhc3M7Cit0eXBlZGVmIHN0cnVjdCBfR3N0U3BlY3RydW1DaGFubmVsIEdzdFNwZWN0cnVtQ2hhbm5lbDsKKwordHlwZWRlZiB2b2lkICgqR3N0U3BlY3RydW1JbnB1dERhdGEpKGNvbnN0IGd1aW50OCAqIGluLCBnZmxvYXQgKiBvdXQsCisgICAgZ3VpbnQgbGVuLCBndWludCBjaGFubmVscywgZ2Zsb2F0IG1heF92YWx1ZSwgZ3VpbnQgb3AsIGd1aW50IG5mZnQpOworCitzdHJ1Y3QgX0dzdFNwZWN0cnVtQ2hhbm5lbAoreworICBnZmxvYXQgKmlucHV0OworICBnZmxvYXQgKmlucHV0X3RtcDsKKyAgR3N0RkZURjMyQ29tcGxleCAqZnJlcWRhdGE7CisgIGdmbG9hdCAqc3BlY3RfbWFnbml0dWRlOyAgICAgIC8qIGFjY3VtdWxhdGVkIG1hbmdpdHVkZSBhbmQgcGhhc2UgKi8KKyAgZ2Zsb2F0ICpzcGVjdF9waGFzZTsgICAgICAgICAgLyogd2lsbCBiZSBzY2FsZWQgYnkgbnVtX2ZmdCBiZWZvcmUgc2VuZGluZyAqLworICBHc3RGRlRGMzIgKmZmdF9jdHg7Cit9OworCitzdHJ1Y3QgX0dzdFNwZWN0cnVtCit7CisgIEdzdEF1ZGlvRmlsdGVyIHBhcmVudDsKKworICAvKiBwcm9wZXJ0aWVzICovCisgIGdib29sZWFuIHBvc3RfbWVzc2FnZXM7ICAgICAgIC8qIHdoZXRoZXIgb3Igbm90IHRvIHBvc3QgbWVzc2FnZXMgKi8KKyAgZ2Jvb2xlYW4gbWVzc2FnZV9tYWduaXR1ZGU7CisgIGdib29sZWFuIG1lc3NhZ2VfcGhhc2U7CisgIGd1aW50NjQgaW50ZXJ2YWw7ICAgICAgICAgICAgIC8qIGhvdyBtYW55IG5hbm9zZWNvbmRzIGJldHdlZW4gZW1pdHMgKi8KKyAgZ3VpbnQ2NCBmcmFtZXNfcGVyX2ludGVydmFsOyAgLyogaG93IG1hbnkgZnJhbWVzIHBlciBpbnRlcnZhbCAqLworICBndWludDY0IGZyYW1lc190b2RvOworICBndWludCBiYW5kczsgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3BlY3RydW0gYmFuZHMgKi8KKyAgZ2ludCB0aHJlc2hvbGQ7ICAgICAgICAgICAgICAgLyogZW5lcmd5IGxldmVsIHRyZXNob2xkICovCisgIGdib29sZWFuIG11bHRpX2NoYW5uZWw7ICAgICAgIC8qIHNlbmQgc2VwYXJhdGUgY2hhbm5lbCByZXN1bHRzICovCisKKyAgZ3VpbnQ2NCBudW1fZnJhbWVzOyAgICAgICAgICAgLyogZnJhbWUgY291bnQgKDEgc2FtcGxlIHBlciBjaGFubmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaW5jZSBsYXN0IGVtaXQgKi8KKyAgZ3VpbnQ2NCBudW1fZmZ0OyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIEZGVHMgc2luY2UgbGFzdCBlbWl0ICovCisgIEdzdENsb2NrVGltZSBtZXNzYWdlX3RzOyAgICAgIC8qIHN0YXJ0dGltZSBmb3IgbmV4dCBtZXNzYWdlICovCisKKyAgLyogPHByaXZhdGU+ICovCisgIEdzdFNwZWN0cnVtQ2hhbm5lbCAqY2hhbm5lbF9kYXRhOworICBndWludCBudW1fY2hhbm5lbHM7CisKKyAgZ3VpbnQgaW5wdXRfcG9zOworICBndWludDY0IGVycm9yX3Blcl9pbnRlcnZhbDsKKyAgZ3VpbnQ2NCBhY2N1bXVsYXRlZF9lcnJvcjsKKworICBHTXV0ZXggbG9jazsKKworICBHc3RTcGVjdHJ1bUlucHV0RGF0YSBpbnB1dF9kYXRhOworfTsKKworc3RydWN0IF9Hc3RTcGVjdHJ1bUNsYXNzCit7CisgIEdzdEF1ZGlvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3NwZWN0cnVtX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1NQRUNUUlVNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3NwZWN0cnVtL21lc29uLmJ1aWxkIGIvZ3N0L3NwZWN0cnVtL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZDVlOTcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3Qvc3BlY3RydW0vbWVzb24uYnVpbGQKQEAgLTAsMCArMSw4IEBACitnc3RzcGVjdHJ1bSA9IGxpYnJhcnkoJ2dzdHNwZWN0cnVtJywKKyAgJ2dzdHNwZWN0cnVtLmMnLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdGJhc2VfZGVwLCBnc3RmZnRfZGVwLCBnc3RhdWRpb19kZXAsIGxpYm1dLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L3VkcC9NYWtlZmlsZS5hbSBiL2dzdC91ZHAvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk3NDA1YQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC91ZHAvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMyBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0dWRwLmxhCisKK2xpYmdzdHVkcF9sYV9TT1VSQ0VTID0gZ3N0dWRwLmMgZ3N0dWRwc3JjLmMgZ3N0dWRwc2luay5jIGdzdG11bHRpdWRwc2luay5jIGdzdGR5bnVkcHNpbmsuYyBnc3R1ZHBuZXR1dGlscy5jCisKK2xpYmdzdHVkcF9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfTkVUX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKEdJT19DRkxBR1MpCitsaWJnc3R1ZHBfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpICQoR1NUX0JBU0VfTElCUykgJChHU1RfTkVUX0xJQlMpICQoR0lPX0xJQlMpCitsaWJnc3R1ZHBfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdHVkcHNpbmsuaCBnc3R1ZHBzcmMuaCBnc3RtdWx0aXVkcHNpbmsuaCBnc3RkeW51ZHBzaW5rLmggZ3N0dWRwbmV0dXRpbHMuaAorCitFWFRSQV9ESVNUID0gUkVBRE1FCisKK0NMRUFORklMRVMgPSAkKEJVSUxUX1NPVVJDRVMpCmRpZmYgLS1naXQgYS9nc3QvdWRwL1JFQURNRSBiL2dzdC91ZHAvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliN2NlYmIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdWRwL1JFQURNRQpAQCAtMCwwICsxLDcgQEAKKyogV2hhdCBpcyBVRFAgc3JjL3Npbms/CisKK0l0IGlzIGEgc2V0IG9mIGVsZW1lbnQgdG8gdHJhbnNmZXIgZGF0YSB1c2luZyBVRFAsIG5vdGhpbmcgbW9yZSwgbm90aGluZyBsZXNzLgorSXRzIG1haW4gcHVycG9zZSBpcyB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggUlRQIGJ1dCB0aGV5IGFyZSBrZXB0IGFzCitzZXBhcmF0ZSBlbGVtZW50cyBiZWNhdXNlIHdlIGNhbi4KKworCmRpZmYgLS1naXQgYS9nc3QvdWRwL2dzdGR5bnVkcHNpbmsuYyBiL2dzdC91ZHAvZ3N0ZHludWRwc2luay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZTZkNzUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdWRwL2dzdGR5bnVkcHNpbmsuYwpAQCAtMCwwICsxLDU5OSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBQaGlsaXBwZSBLaGFsYWYgPGJ1cmdlckBzcGVlZHkub3JnPgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gTm9raWEgQ29ycG9yYXRpb24gPGthaS52ZWhtYW5lbkBub2tpYS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBKb25pIFZhbHRhbmVuIDxqb25pLnZhbHRhbmVuQG1vdmlhbC5maT4KKyAqIENvcHlyaWdodCAoQykgPDIwMTI+IENvbGxhYm9yYSBMdGQuCisgKiAgIEF1dGhvcjogU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgImdzdGR5bnVkcHNpbmsuaCIKKworI2luY2x1ZGUgPGdzdC9uZXQvZ3N0bmV0YWRkcmVzc21ldGEuaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZHludWRwc2lua19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAoZHludWRwc2lua19kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKKworLyogRHluVURQU2luayBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIG1ldGhvZHMgKi8KKyAgU0lHTkFMX0dFVF9TVEFUUywKKworICAvKiBzaWduYWxzICovCisKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworI2RlZmluZSBVRFBfREVGQVVMVF9TT0NLRVQJCU5VTEwKKyNkZWZpbmUgVURQX0RFRkFVTFRfQ0xPU0VfU09DS0VUCVRSVUUKKyNkZWZpbmUgVURQX0RFRkFVTFRfQklORF9BRERSRVNTCU5VTEwKKyNkZWZpbmUgVURQX0RFRkFVTFRfQklORF9QT1JUICAgCTAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfU09DS0VULAorICBQUk9QX1NPQ0tFVF9WNiwKKyAgUFJPUF9DTE9TRV9TT0NLRVQsCisgIFBST1BfQklORF9BRERSRVNTLAorICBQUk9QX0JJTkRfUE9SVAorfTsKKworc3RhdGljIHZvaWQgZ3N0X2R5bnVkcHNpbmtfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfZHludWRwc2lua19yZW5kZXIgKEdzdEJhc2VTaW5rICogc2luaywKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9keW51ZHBzaW5rX3N0b3AgKEdzdEJhc2VTaW5rICogYnNpbmspOworc3RhdGljIGdib29sZWFuIGdzdF9keW51ZHBzaW5rX3N0YXJ0IChHc3RCYXNlU2luayAqIGJzaW5rKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZHludWRwc2lua191bmxvY2sgKEdzdEJhc2VTaW5rICogYnNpbmspOworc3RhdGljIGdib29sZWFuIGdzdF9keW51ZHBzaW5rX3VubG9ja19zdG9wIChHc3RCYXNlU2luayAqIGJzaW5rKTsKKworc3RhdGljIHZvaWQgZ3N0X2R5bnVkcHNpbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2R5bnVkcHNpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIEdzdFN0cnVjdHVyZSAqZ3N0X2R5bnVkcHNpbmtfZ2V0X3N0YXRzIChHc3REeW5VRFBTaW5rICogc2luaywKKyAgICBjb25zdCBnY2hhciAqIGhvc3QsIGdpbnQgcG9ydCk7CisKK3N0YXRpYyBndWludCBnc3RfZHludWRwc2lua19zaWduYWxzW0xBU1RfU0lHTkFMXSA9IHsgMCB9OworCisjZGVmaW5lIGdzdF9keW51ZHBzaW5rX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdER5blVEUFNpbmssIGdzdF9keW51ZHBzaW5rLCBHU1RfVFlQRV9CQVNFX1NJTkspOworCitzdGF0aWMgdm9pZAorZ3N0X2R5bnVkcHNpbmtfY2xhc3NfaW5pdCAoR3N0RHluVURQU2lua0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RCYXNlU2lua0NsYXNzICpnc3RiYXNlc2lua19jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdGJhc2VzaW5rX2NsYXNzID0gKEdzdEJhc2VTaW5rQ2xhc3MgKikga2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2R5bnVkcHNpbmtfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfZHludWRwc2lua19nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2R5bnVkcHNpbmtfZmluYWxpemU7CisKKyAgZ3N0X2R5bnVkcHNpbmtfc2lnbmFsc1tTSUdOQUxfR0VUX1NUQVRTXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJnZXQtc3RhdHMiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QgfCBHX1NJR05BTF9BQ1RJT04sCisgICAgICBHX1NUUlVDVF9PRkZTRVQgKEdzdER5blVEUFNpbmtDbGFzcywgZ2V0X3N0YXRzKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHU1RfVFlQRV9TVFJVQ1RVUkUsIDIsCisgICAgICBHX1RZUEVfU1RSSU5HLCBHX1RZUEVfSU5UKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NPQ0tFVCwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJzb2NrZXQiLCAiU29ja2V0IiwKKyAgICAgICAgICAiU29ja2V0IHRvIHVzZSBmb3IgVURQIHNlbmRpbmcuIChOVUxMID09IGFsbG9jYXRlKSIsCisgICAgICAgICAgR19UWVBFX1NPQ0tFVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU09DS0VUX1Y2LAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoInNvY2tldC12NiIsICJTb2NrZXQgSVB2NiIsCisgICAgICAgICAgIlNvY2tldCB0byB1c2UgZm9yIFVEUHY2IHNlbmRpbmcuIChOVUxMID09IGFsbG9jYXRlKSIsCisgICAgICAgICAgR19UWVBFX1NPQ0tFVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ0xPU0VfU09DS0VULAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJjbG9zZS1zb2NrZXQiLCAiQ2xvc2Ugc29ja2V0IiwKKyAgICAgICAgICAiQ2xvc2Ugc29ja2V0IGlmIHBhc3NlZCBhcyBwcm9wZXJ0eSBvbiBzdGF0ZSBjaGFuZ2UiLAorICAgICAgICAgIFVEUF9ERUZBVUxUX0NMT1NFX1NPQ0tFVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9CSU5EX0FERFJFU1MsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiYmluZC1hZGRyZXNzIiwgIkJpbmQgQWRkcmVzcyIsCisgICAgICAgICAgIkFkZHJlc3MgdG8gYmluZCB0aGUgc29ja2V0IHRvIiwgVURQX0RFRkFVTFRfQklORF9BRERSRVNTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0JJTkRfUE9SVCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJiaW5kLXBvcnQiLCAiQmluZCBQb3J0IiwKKyAgICAgICAgICAiUG9ydCB0byBiaW5kIHRoZSBzb2NrZXQgdG8iLCAwLCBHX01BWFVJTlQxNiwKKyAgICAgICAgICBVRFBfREVGQVVMVF9CSU5EX1BPUlQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlVEUCBwYWNrZXQgc2VuZGVyIiwKKyAgICAgICJTaW5rL05ldHdvcmsiLAorICAgICAgIlNlbmQgZGF0YSBvdmVyIHRoZSBuZXR3b3JrIHZpYSBVRFAgd2l0aCBwYWNrZXQgZGVzdGluYXRpb25zIHBpY2tlZCB1cCAiCisgICAgICAiZHluYW1pY2FsbHkgZnJvbSBtZXRhIG9uIHRoZSBidWZmZXJzIHBhc3NlZCIsCisgICAgICAiUGhpbGlwcGUgS2hhbGFmIDxidXJnZXJAc3BlZWR5Lm9yZz4iKTsKKworICBnc3RiYXNlc2lua19jbGFzcy0+cmVuZGVyID0gZ3N0X2R5bnVkcHNpbmtfcmVuZGVyOworICBnc3RiYXNlc2lua19jbGFzcy0+c3RhcnQgPSBnc3RfZHludWRwc2lua19zdGFydDsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnN0b3AgPSBnc3RfZHludWRwc2lua19zdG9wOworICBnc3RiYXNlc2lua19jbGFzcy0+dW5sb2NrID0gZ3N0X2R5bnVkcHNpbmtfdW5sb2NrOworICBnc3RiYXNlc2lua19jbGFzcy0+dW5sb2NrX3N0b3AgPSBnc3RfZHludWRwc2lua191bmxvY2tfc3RvcDsKKworICBrbGFzcy0+Z2V0X3N0YXRzID0gZ3N0X2R5bnVkcHNpbmtfZ2V0X3N0YXRzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChkeW51ZHBzaW5rX2RlYnVnLCAiZHludWRwc2luayIsIDAsICJVRFAgc2luayIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2R5bnVkcHNpbmtfaW5pdCAoR3N0RHluVURQU2luayAqIHNpbmspCit7CisgIHNpbmstPnNvY2tldCA9IFVEUF9ERUZBVUxUX1NPQ0tFVDsKKyAgc2luay0+c29ja2V0X3Y2ID0gVURQX0RFRkFVTFRfU09DS0VUOworICBzaW5rLT5jbG9zZV9zb2NrZXQgPSBVRFBfREVGQVVMVF9DTE9TRV9TT0NLRVQ7CisgIHNpbmstPmV4dGVybmFsX3NvY2tldCA9IEZBTFNFOworICBzaW5rLT5iaW5kX2FkZHJlc3MgPSBVRFBfREVGQVVMVF9CSU5EX0FERFJFU1M7CisgIHNpbmstPmJpbmRfcG9ydCA9IFVEUF9ERUZBVUxUX0JJTkRfUE9SVDsKKworICBzaW5rLT51c2VkX3NvY2tldCA9IE5VTEw7CisgIHNpbmstPnVzZWRfc29ja2V0X3Y2ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9keW51ZHBzaW5rX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3REeW5VRFBTaW5rICpzaW5rOworCisgIHNpbmsgPSBHU1RfRFlOVURQU0lOSyAob2JqZWN0KTsKKworICBpZiAoc2luay0+c29ja2V0KQorICAgIGdfb2JqZWN0X3VucmVmIChzaW5rLT5zb2NrZXQpOworICBzaW5rLT5zb2NrZXQgPSBOVUxMOworCisgIGlmIChzaW5rLT5zb2NrZXRfdjYpCisgICAgZ19vYmplY3RfdW5yZWYgKHNpbmstPnNvY2tldF92Nik7CisgIHNpbmstPnNvY2tldF92NiA9IE5VTEw7CisKKyAgaWYgKHNpbmstPnVzZWRfc29ja2V0KQorICAgIGdfb2JqZWN0X3VucmVmIChzaW5rLT51c2VkX3NvY2tldCk7CisgIHNpbmstPnVzZWRfc29ja2V0ID0gTlVMTDsKKworICBpZiAoc2luay0+dXNlZF9zb2NrZXRfdjYpCisgICAgZ19vYmplY3RfdW5yZWYgKHNpbmstPnVzZWRfc29ja2V0X3Y2KTsKKyAgc2luay0+dXNlZF9zb2NrZXRfdjYgPSBOVUxMOworCisgIGdfZnJlZSAoc2luay0+YmluZF9hZGRyZXNzKTsKKyAgc2luay0+YmluZF9hZGRyZXNzID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZHludWRwc2lua19yZW5kZXIgKEdzdEJhc2VTaW5rICogYnNpbmssIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0RHluVURQU2luayAqc2luazsKKyAgZ3NzaXplIHJldDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdE5ldEFkZHJlc3NNZXRhICptZXRhOworICBHU29ja2V0QWRkcmVzcyAqYWRkcjsKKyAgR0Vycm9yICplcnIgPSBOVUxMOworICBHU29ja2V0RmFtaWx5IGZhbWlseTsKKyAgR1NvY2tldCAqc29ja2V0OworCisgIG1ldGEgPSBnc3RfYnVmZmVyX2dldF9uZXRfYWRkcmVzc19tZXRhIChidWZmZXIpOworCisgIGlmIChtZXRhID09IE5VTEwpIHsKKyAgICBHU1RfREVCVUcgKCJSZWNlaXZlZCBidWZmZXIgd2l0aG91dCBHc3ROZXRBZGRyZXNzTWV0YSwgc2tpcHBpbmciKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KKworICBzaW5rID0gR1NUX0RZTlVEUFNJTksgKGJzaW5rKTsKKworICAvKiBsZXQncyBnZXQgdGhlIGFkZHJlc3MgZnJvbSB0aGUgbWV0YWRhdGEgKi8KKyAgYWRkciA9IG1ldGEtPmFkZHI7CisKKyAgZmFtaWx5ID0gZ19zb2NrZXRfYWRkcmVzc19nZXRfZmFtaWx5IChhZGRyKTsKKyAgaWYgKGZhbWlseSA9PSBHX1NPQ0tFVF9GQU1JTFlfSVBWNiAmJiAhc2luay0+dXNlZF9zb2NrZXRfdjYpCisgICAgZ290byBpbnZhbGlkX2ZhbWlseTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIEdTVF9ERUJVRyAoImFib3V0IHRvIHNlbmQgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyIsIG1hcC5zaXplKTsKKworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgeworICAgIGdjaGFyICpob3N0OworCisgICAgaG9zdCA9CisgICAgICAgIGdfaW5ldF9hZGRyZXNzX3RvX3N0cmluZyAoZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9hZGRyZXNzCisgICAgICAgIChHX0lORVRfU09DS0VUX0FERFJFU1MgKGFkZHIpKSk7CisgICAgR1NUX0RFQlVHICgic2VuZGluZyAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIHRvIGNsaWVudCAlcyBwb3J0ICVkIiwKKyAgICAgICAgbWFwLnNpemUsIGhvc3QsCisgICAgICAgIGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfcG9ydCAoR19JTkVUX1NPQ0tFVF9BRERSRVNTIChhZGRyKSkpOworICAgIGdfZnJlZSAoaG9zdCk7CisgIH0KKyNlbmRpZgorCisgIC8qIFNlbGVjdCBzb2NrZXQgdG8gc2VuZCBmcm9tIGZvciB0aGlzIGFkZHJlc3MgKi8KKyAgaWYgKGZhbWlseSA9PSBHX1NPQ0tFVF9GQU1JTFlfSVBWNiB8fCAhc2luay0+dXNlZF9zb2NrZXQpCisgICAgc29ja2V0ID0gc2luay0+dXNlZF9zb2NrZXRfdjY7CisgIGVsc2UKKyAgICBzb2NrZXQgPSBzaW5rLT51c2VkX3NvY2tldDsKKworICByZXQgPQorICAgICAgZ19zb2NrZXRfc2VuZF90byAoc29ja2V0LCBhZGRyLCAoZ2NoYXIgKikgbWFwLmRhdGEsIG1hcC5zaXplLAorICAgICAgc2luay0+Y2FuY2VsbGFibGUsICZlcnIpOworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgIGlmIChyZXQgPCAwKQorICAgIGdvdG8gc2VuZF9lcnJvcjsKKworICBHU1RfREVCVUcgKCJzZW50ICUiIEdfR1NTSVpFX0ZPUk1BVCAiIGJ5dGVzIiwgcmV0KTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKK3NlbmRfZXJyb3I6CisgIHsKKyAgICBHc3RGbG93UmV0dXJuIGZsb3dfcmV0OworCisgICAgaWYgKGdfZXJyb3JfbWF0Y2hlcyAoZXJyLCBHX0lPX0VSUk9SLCBHX0lPX0VSUk9SX0NBTkNFTExFRCkpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJzZW5kIGNhbmNlbGxlZCIpOworICAgICAgZmxvd19yZXQgPSBHU1RfRkxPV19GTFVTSElORzsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNpbmssIFJFU09VUkNFLCBXUklURSwgKE5VTEwpLAorICAgICAgICAgICgic2VuZCBlcnJvcjogJXMiLCBlcnItPm1lc3NhZ2UpKTsKKyAgICAgIGZsb3dfcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgfQorICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgIHJldHVybiBmbG93X3JldDsKKyAgfQoraW52YWxpZF9mYW1pbHk6CisgIHsKKyAgICBHU1RfREVCVUcgKCJpbnZhbGlkIGFkZHJlc3MgZmFtaWx5IChnb3QgJWQpIiwgZmFtaWx5KTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9keW51ZHBzaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3REeW5VRFBTaW5rICp1ZHBzaW5rOworCisgIHVkcHNpbmsgPSBHU1RfRFlOVURQU0lOSyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU09DS0VUOgorICAgICAgaWYgKHVkcHNpbmstPnNvY2tldCAhPSBOVUxMICYmIHVkcHNpbmstPnNvY2tldCAhPSB1ZHBzaW5rLT51c2VkX3NvY2tldCAmJgorICAgICAgICAgIHVkcHNpbmstPmNsb3NlX3NvY2tldCkgeworICAgICAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgICAgICAgaWYgKCFnX3NvY2tldF9jbG9zZSAodWRwc2luay0+c29ja2V0LCAmZXJyKSkgeworICAgICAgICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBjbG9zZSBzb2NrZXQgJXA6ICVzIiwgdWRwc2luay0+c29ja2V0LAorICAgICAgICAgICAgICBlcnItPm1lc3NhZ2UpOworICAgICAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAodWRwc2luay0+c29ja2V0KQorICAgICAgICBnX29iamVjdF91bnJlZiAodWRwc2luay0+c29ja2V0KTsKKyAgICAgIHVkcHNpbmstPnNvY2tldCA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgR1NUX0RFQlVHICgic2V0dGluZyBzb2NrZXQgdG8gJXAiLCB1ZHBzaW5rLT5zb2NrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NPQ0tFVF9WNjoKKyAgICAgIGlmICh1ZHBzaW5rLT5zb2NrZXRfdjYgIT0gTlVMTAorICAgICAgICAgICYmIHVkcHNpbmstPnNvY2tldF92NiAhPSB1ZHBzaW5rLT51c2VkX3NvY2tldF92NgorICAgICAgICAgICYmIHVkcHNpbmstPmNsb3NlX3NvY2tldCkgeworICAgICAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgICAgICAgaWYgKCFnX3NvY2tldF9jbG9zZSAodWRwc2luay0+c29ja2V0X3Y2LCAmZXJyKSkgeworICAgICAgICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBjbG9zZSBzb2NrZXQgJXA6ICVzIiwgdWRwc2luay0+c29ja2V0X3Y2LAorICAgICAgICAgICAgICBlcnItPm1lc3NhZ2UpOworICAgICAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAodWRwc2luay0+c29ja2V0X3Y2KQorICAgICAgICBnX29iamVjdF91bnJlZiAodWRwc2luay0+c29ja2V0X3Y2KTsKKyAgICAgIHVkcHNpbmstPnNvY2tldF92NiA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgR1NUX0RFQlVHICgic2V0dGluZyBzb2NrZXQgdjYgdG8gJXAiLCB1ZHBzaW5rLT5zb2NrZXRfdjYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NMT1NFX1NPQ0tFVDoKKyAgICAgIHVkcHNpbmstPmNsb3NlX3NvY2tldCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CSU5EX0FERFJFU1M6CisgICAgICBnX2ZyZWUgKHVkcHNpbmstPmJpbmRfYWRkcmVzcyk7CisgICAgICB1ZHBzaW5rLT5iaW5kX2FkZHJlc3MgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CSU5EX1BPUlQ6CisgICAgICB1ZHBzaW5rLT5iaW5kX3BvcnQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9keW51ZHBzaW5rX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3REeW5VRFBTaW5rICp1ZHBzaW5rOworCisgIHVkcHNpbmsgPSBHU1RfRFlOVURQU0lOSyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU09DS0VUOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgdWRwc2luay0+c29ja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TT0NLRVRfVjY6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCB1ZHBzaW5rLT5zb2NrZXRfdjYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NMT1NFX1NPQ0tFVDoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCB1ZHBzaW5rLT5jbG9zZV9zb2NrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JJTkRfQUREUkVTUzoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHVkcHNpbmstPmJpbmRfYWRkcmVzcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQklORF9QT1JUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdWRwc2luay0+YmluZF9wb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9keW51ZHBzaW5rX2NyZWF0ZV9jYW5jZWxsYWJsZSAoR3N0RHluVURQU2luayAqIHNpbmspCit7CisgIEdQb2xsRkQgcG9sbGZkOworCisgIHNpbmstPmNhbmNlbGxhYmxlID0gZ19jYW5jZWxsYWJsZV9uZXcgKCk7CisgIHNpbmstPm1hZGVfY2FuY2VsX2ZkID0gZ19jYW5jZWxsYWJsZV9tYWtlX3BvbGxmZCAoc2luay0+Y2FuY2VsbGFibGUsICZwb2xsZmQpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2R5bnVkcHNpbmtfZnJlZV9jYW5jZWxsYWJsZSAoR3N0RHluVURQU2luayAqIHNpbmspCit7CisgIGlmIChzaW5rLT5tYWRlX2NhbmNlbF9mZCkgeworICAgIGdfY2FuY2VsbGFibGVfcmVsZWFzZV9mZCAoc2luay0+Y2FuY2VsbGFibGUpOworICAgIHNpbmstPm1hZGVfY2FuY2VsX2ZkID0gRkFMU0U7CisgIH0KKyAgZ19vYmplY3RfdW5yZWYgKHNpbmstPmNhbmNlbGxhYmxlKTsKKyAgc2luay0+Y2FuY2VsbGFibGUgPSBOVUxMOworfQorCisvKiBjcmVhdGUgYSBzb2NrZXQgZm9yIHNlbmRpbmcgdG8gcmVtb3RlIG1hY2hpbmUgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2R5bnVkcHNpbmtfc3RhcnQgKEdzdEJhc2VTaW5rICogYnNpbmspCit7CisgIEdzdER5blVEUFNpbmsgKnVkcHNpbms7CisgIEdFcnJvciAqZXJyID0gTlVMTDsKKworICB1ZHBzaW5rID0gR1NUX0RZTlVEUFNJTksgKGJzaW5rKTsKKworICBnc3RfZHludWRwc2lua19jcmVhdGVfY2FuY2VsbGFibGUgKHVkcHNpbmspOworCisgIHVkcHNpbmstPmV4dGVybmFsX3NvY2tldCA9IEZBTFNFOworCisgIGlmICh1ZHBzaW5rLT5zb2NrZXQpIHsKKyAgICBpZiAoZ19zb2NrZXRfZ2V0X2ZhbWlseSAodWRwc2luay0+c29ja2V0KSA9PSBHX1NPQ0tFVF9GQU1JTFlfSVBWNikgeworICAgICAgdWRwc2luay0+dXNlZF9zb2NrZXRfdjYgPSBHX1NPQ0tFVCAoZ19vYmplY3RfcmVmICh1ZHBzaW5rLT5zb2NrZXQpKTsKKyAgICAgIHVkcHNpbmstPmV4dGVybmFsX3NvY2tldCA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIHVkcHNpbmstPnVzZWRfc29ja2V0ID0gR19TT0NLRVQgKGdfb2JqZWN0X3JlZiAodWRwc2luay0+c29ja2V0KSk7CisgICAgICB1ZHBzaW5rLT5leHRlcm5hbF9zb2NrZXQgPSBUUlVFOworICAgIH0KKyAgfQorCisgIGlmICh1ZHBzaW5rLT5zb2NrZXRfdjYpIHsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ19zb2NrZXRfZ2V0X2ZhbWlseSAodWRwc2luay0+c29ja2V0KSAhPQorICAgICAgICBHX1NPQ0tFVF9GQU1JTFlfSVBWNiwgRkFMU0UpOworCisgICAgaWYgKHVkcHNpbmstPnVzZWRfc29ja2V0X3Y2CisgICAgICAgICYmIHVkcHNpbmstPnVzZWRfc29ja2V0X3Y2ICE9IHVkcHNpbmstPnNvY2tldF92NikgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAodWRwc2luaywKKyAgICAgICAgICAiUHJvdmlkZWQgZGlmZmVyZW50IElQdjYgc29ja2V0cyBpbiBzb2NrZXQgYW5kIHNvY2tldC12NiBwcm9wZXJ0aWVzIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgdWRwc2luay0+dXNlZF9zb2NrZXRfdjYgPSBHX1NPQ0tFVCAoZ19vYmplY3RfcmVmICh1ZHBzaW5rLT5zb2NrZXRfdjYpKTsKKyAgICB1ZHBzaW5rLT5leHRlcm5hbF9zb2NrZXQgPSBUUlVFOworICB9CisKKyAgaWYgKCF1ZHBzaW5rLT51c2VkX3NvY2tldCAmJiAhdWRwc2luay0+dXNlZF9zb2NrZXRfdjYpIHsKKyAgICBHU29ja2V0QWRkcmVzcyAqYmluZF9hZGRyOworICAgIEdJbmV0QWRkcmVzcyAqYmluZF9pYWRkcjsKKworICAgIGlmICh1ZHBzaW5rLT5iaW5kX2FkZHJlc3MpIHsKKyAgICAgIEdTb2NrZXRGYW1pbHkgZmFtaWx5OworCisgICAgICBiaW5kX2lhZGRyID0gZ19pbmV0X2FkZHJlc3NfbmV3X2Zyb21fc3RyaW5nICh1ZHBzaW5rLT5iaW5kX2FkZHJlc3MpOworICAgICAgaWYgKCFiaW5kX2lhZGRyKSB7CisgICAgICAgIEdMaXN0ICpyZXN1bHRzOworICAgICAgICBHUmVzb2x2ZXIgKnJlc29sdmVyOworCisgICAgICAgIHJlc29sdmVyID0gZ19yZXNvbHZlcl9nZXRfZGVmYXVsdCAoKTsKKyAgICAgICAgcmVzdWx0cyA9CisgICAgICAgICAgICBnX3Jlc29sdmVyX2xvb2t1cF9ieV9uYW1lIChyZXNvbHZlciwgdWRwc2luay0+YmluZF9hZGRyZXNzLAorICAgICAgICAgICAgdWRwc2luay0+Y2FuY2VsbGFibGUsICZlcnIpOworICAgICAgICBpZiAoIXJlc3VsdHMpIHsKKyAgICAgICAgICBnX29iamVjdF91bnJlZiAocmVzb2x2ZXIpOworICAgICAgICAgIGdvdG8gbmFtZV9yZXNvbHZlOworICAgICAgICB9CisgICAgICAgIGJpbmRfaWFkZHIgPSBHX0lORVRfQUREUkVTUyAoZ19vYmplY3RfcmVmIChyZXN1bHRzLT5kYXRhKSk7CisgICAgICAgIGdfcmVzb2x2ZXJfZnJlZV9hZGRyZXNzZXMgKHJlc3VsdHMpOworICAgICAgICBnX29iamVjdF91bnJlZiAocmVzb2x2ZXIpOworICAgICAgfQorCisgICAgICBiaW5kX2FkZHIgPSBnX2luZXRfc29ja2V0X2FkZHJlc3NfbmV3IChiaW5kX2lhZGRyLCB1ZHBzaW5rLT5iaW5kX3BvcnQpOworICAgICAgZ19vYmplY3RfdW5yZWYgKGJpbmRfaWFkZHIpOworICAgICAgZmFtaWx5ID0gZ19zb2NrZXRfYWRkcmVzc19nZXRfZmFtaWx5IChHX1NPQ0tFVF9BRERSRVNTIChiaW5kX2FkZHIpKTsKKworICAgICAgaWYgKCh1ZHBzaW5rLT51c2VkX3NvY2tldCA9CisgICAgICAgICAgICAgIGdfc29ja2V0X25ldyAoZmFtaWx5LCBHX1NPQ0tFVF9UWVBFX0RBVEFHUkFNLAorICAgICAgICAgICAgICAgICAgR19TT0NLRVRfUFJPVE9DT0xfVURQLCAmZXJyKSkgPT0gTlVMTCkgeworICAgICAgICBnX29iamVjdF91bnJlZiAoYmluZF9hZGRyKTsKKyAgICAgICAgZ290byBub19zb2NrZXQ7CisgICAgICB9CisKKyAgICAgIGdfc29ja2V0X2JpbmQgKHVkcHNpbmstPnVzZWRfc29ja2V0LCBiaW5kX2FkZHIsIFRSVUUsICZlcnIpOworICAgICAgaWYgKGVyciAhPSBOVUxMKQorICAgICAgICBnb3RvIGJpbmRfZXJyb3I7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGNyZWF0ZSBzZW5kZXIgc29ja2V0cyBpZiBub25lIGF2YWlsYWJsZSAqLworICAgICAgaWYgKCh1ZHBzaW5rLT51c2VkX3NvY2tldCA9IGdfc29ja2V0X25ldyAoR19TT0NLRVRfRkFNSUxZX0lQVjQsCisgICAgICAgICAgICAgICAgICBHX1NPQ0tFVF9UWVBFX0RBVEFHUkFNLCBHX1NPQ0tFVF9QUk9UT0NPTF9VRFAsICZlcnIpKSA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vX3NvY2tldDsKKworICAgICAgYmluZF9pYWRkciA9IGdfaW5ldF9hZGRyZXNzX25ld19hbnkgKEdfU09DS0VUX0ZBTUlMWV9JUFY0KTsKKyAgICAgIGJpbmRfYWRkciA9IGdfaW5ldF9zb2NrZXRfYWRkcmVzc19uZXcgKGJpbmRfaWFkZHIsIDApOworICAgICAgZ19zb2NrZXRfYmluZCAodWRwc2luay0+dXNlZF9zb2NrZXQsIGJpbmRfYWRkciwgVFJVRSwgJmVycik7CisgICAgICBnX29iamVjdF91bnJlZiAoYmluZF9hZGRyKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChiaW5kX2lhZGRyKTsKKyAgICAgIGlmIChlcnIgIT0gTlVMTCkKKyAgICAgICAgZ290byBiaW5kX2Vycm9yOworCisgICAgICBpZiAoKHVkcHNpbmstPnVzZWRfc29ja2V0X3Y2ID0gZ19zb2NrZXRfbmV3IChHX1NPQ0tFVF9GQU1JTFlfSVBWNiwKKyAgICAgICAgICAgICAgICAgIEdfU09DS0VUX1RZUEVfREFUQUdSQU0sIEdfU09DS0VUX1BST1RPQ09MX1VEUCwKKyAgICAgICAgICAgICAgICAgICZlcnIpKSA9PSBOVUxMKSB7CisgICAgICAgIEdTVF9JTkZPX09CSkVDVCAodWRwc2luaywgIkZhaWxlZCB0byBjcmVhdGUgSVB2NiBzb2NrZXQ6ICVzIiwKKyAgICAgICAgICAgIGVyci0+bWVzc2FnZSk7CisgICAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYmluZF9pYWRkciA9IGdfaW5ldF9hZGRyZXNzX25ld19hbnkgKEdfU09DS0VUX0ZBTUlMWV9JUFY2KTsKKyAgICAgICAgYmluZF9hZGRyID0gZ19pbmV0X3NvY2tldF9hZGRyZXNzX25ldyAoYmluZF9pYWRkciwgMCk7CisgICAgICAgIGdfc29ja2V0X2JpbmQgKHVkcHNpbmstPnVzZWRfc29ja2V0X3Y2LCBiaW5kX2FkZHIsIFRSVUUsICZlcnIpOworICAgICAgICBnX29iamVjdF91bnJlZiAoYmluZF9hZGRyKTsKKyAgICAgICAgZ19vYmplY3RfdW5yZWYgKGJpbmRfaWFkZHIpOworICAgICAgICBpZiAoZXJyICE9IE5VTEwpCisgICAgICAgICAgZ290byBiaW5kX2Vycm9yOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmICh1ZHBzaW5rLT51c2VkX3NvY2tldCkKKyAgICBnX3NvY2tldF9zZXRfYnJvYWRjYXN0ICh1ZHBzaW5rLT51c2VkX3NvY2tldCwgVFJVRSk7CisgIGlmICh1ZHBzaW5rLT51c2VkX3NvY2tldF92NikKKyAgICBnX3NvY2tldF9zZXRfYnJvYWRjYXN0ICh1ZHBzaW5rLT51c2VkX3NvY2tldF92NiwgVFJVRSk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub19zb2NrZXQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUICh1ZHBzaW5rLCAiRmFpbGVkIHRvIGNyZWF0ZSBJUHY0IHNvY2tldDogJXMiLAorICAgICAgICBlcnItPm1lc3NhZ2UpOworICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorYmluZF9lcnJvcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh1ZHBzaW5rLCBSRVNPVVJDRSwgRkFJTEVELCAoTlVMTCksCisgICAgICAgICgiRmFpbGVkIHRvIGJpbmQgc29ja2V0OiAlcyIsIGVyci0+bWVzc2FnZSkpOworICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbmFtZV9yZXNvbHZlOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHVkcHNpbmssIFJFU09VUkNFLCBGQUlMRUQsIChOVUxMKSwKKyAgICAgICAgKCJGYWlsZWQgdG8gcmVzb2x2ZSBiaW5kIGFkZHJlc3MgJXM6ICVzIiwgdWRwc2luay0+YmluZF9hZGRyZXNzLAorICAgICAgICAgICAgZXJyLT5tZXNzYWdlKSk7CisgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RTdHJ1Y3R1cmUgKgorZ3N0X2R5bnVkcHNpbmtfZ2V0X3N0YXRzIChHc3REeW5VRFBTaW5rICogc2luaywgY29uc3QgZ2NoYXIgKiBob3N0LCBnaW50IHBvcnQpCit7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9keW51ZHBzaW5rX3N0b3AgKEdzdEJhc2VTaW5rICogYnNpbmspCit7CisgIEdzdER5blVEUFNpbmsgKnVkcHNpbms7CisKKyAgdWRwc2luayA9IEdTVF9EWU5VRFBTSU5LIChic2luayk7CisKKyAgaWYgKHVkcHNpbmstPnVzZWRfc29ja2V0KSB7CisgICAgaWYgKHVkcHNpbmstPmNsb3NlX3NvY2tldCB8fCAhdWRwc2luay0+ZXh0ZXJuYWxfc29ja2V0KSB7CisgICAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgICAgIGlmICghZ19zb2NrZXRfY2xvc2UgKHVkcHNpbmstPnVzZWRfc29ja2V0LCAmZXJyKSkgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUICh1ZHBzaW5rLCAiRmFpbGVkIHRvIGNsb3NlIHNvY2tldDogJXMiLCBlcnItPm1lc3NhZ2UpOworICAgICAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnX29iamVjdF91bnJlZiAodWRwc2luay0+dXNlZF9zb2NrZXQpOworICAgIHVkcHNpbmstPnVzZWRfc29ja2V0ID0gTlVMTDsKKyAgfQorCisgIGlmICh1ZHBzaW5rLT51c2VkX3NvY2tldF92NikgeworICAgIGlmICh1ZHBzaW5rLT5jbG9zZV9zb2NrZXQgfHwgIXVkcHNpbmstPmV4dGVybmFsX3NvY2tldCkgeworICAgICAgR0Vycm9yICplcnIgPSBOVUxMOworCisgICAgICBpZiAoIWdfc29ja2V0X2Nsb3NlICh1ZHBzaW5rLT51c2VkX3NvY2tldF92NiwgJmVycikpIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAodWRwc2luaywgIkZhaWxlZCB0byBjbG9zZSBzb2NrZXQ6ICVzIiwgZXJyLT5tZXNzYWdlKTsKKyAgICAgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgICB9CisgICAgfQorCisgICAgZ19vYmplY3RfdW5yZWYgKHVkcHNpbmstPnVzZWRfc29ja2V0X3Y2KTsKKyAgICB1ZHBzaW5rLT51c2VkX3NvY2tldF92NiA9IE5VTEw7CisgIH0KKworICBnc3RfZHludWRwc2lua19mcmVlX2NhbmNlbGxhYmxlICh1ZHBzaW5rKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZHludWRwc2lua191bmxvY2sgKEdzdEJhc2VTaW5rICogYnNpbmspCit7CisgIEdzdER5blVEUFNpbmsgKnVkcHNpbms7CisKKyAgdWRwc2luayA9IEdTVF9EWU5VRFBTSU5LIChic2luayk7CisKKyAgZ19jYW5jZWxsYWJsZV9jYW5jZWwgKHVkcHNpbmstPmNhbmNlbGxhYmxlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZHludWRwc2lua191bmxvY2tfc3RvcCAoR3N0QmFzZVNpbmsgKiBic2luaykKK3sKKyAgR3N0RHluVURQU2luayAqdWRwc2luazsKKworICB1ZHBzaW5rID0gR1NUX0RZTlVEUFNJTksgKGJzaW5rKTsKKworICBnc3RfZHludWRwc2lua19mcmVlX2NhbmNlbGxhYmxlICh1ZHBzaW5rKTsKKyAgZ3N0X2R5bnVkcHNpbmtfY3JlYXRlX2NhbmNlbGxhYmxlICh1ZHBzaW5rKTsKKworICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2dzdC91ZHAvZ3N0ZHludWRwc2luay5oIGIvZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ4NWJiNgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC91ZHAvZ3N0ZHludWRwc2luay5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gUGhpbGlwcGUgS2hhbGFmIDxidXJnZXJAc3BlZWR5Lm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0RZTlVEUFNJTktfSF9fCisjZGVmaW5lIF9fR1NUX0RZTlVEUFNJTktfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXNpbmsuaD4KKyNpbmNsdWRlIDxnaW8vZ2lvLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2luY2x1ZGUgImdzdHVkcG5ldHV0aWxzLmgiCisKKyNkZWZpbmUgR1NUX1RZUEVfRFlOVURQU0lOSyAgICAgICAgICAgICAoZ3N0X2R5bnVkcHNpbmtfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0RZTlVEUFNJTksob2JqKSAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfRFlOVURQU0lOSyxHc3REeW5VRFBTaW5rKSkKKyNkZWZpbmUgR1NUX0RZTlVEUFNJTktfQ0xBU1Moa2xhc3MpICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9EWU5VRFBTSU5LLEdzdER5blVEUFNpbmtDbGFzcykpCisjZGVmaW5lIEdTVF9JU19EWU5VRFBTSU5LKG9iaikgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0RZTlVEUFNJTkspKQorI2RlZmluZSBHU1RfSVNfRFlOVURQU0lOS19DTEFTUyhrbGFzcykgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0RZTlVEUFNJTkspKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0RHluVURQU2luayBHc3REeW5VRFBTaW5rOwordHlwZWRlZiBzdHJ1Y3QgX0dzdER5blVEUFNpbmtDbGFzcyBHc3REeW5VRFBTaW5rQ2xhc3M7CisKKworLyogc2VuZHMgdWRwIHBhY2tldHMgdG8gaG9zdC9wb3J0IHBhaXJzIGNvbnRhaW5lZCBpbiB0aGUgR3N0TmV0QnVmZmVyIHJlY2VpdmVkLgorICovCitzdHJ1Y3QgX0dzdER5blVEUFNpbmsgeworICBHc3RCYXNlU2luayBwYXJlbnQ7CisKKyAgLyogcHJvcGVydGllcyAqLworICBHU29ja2V0ICpzb2NrZXQsICpzb2NrZXRfdjY7CisgIGdib29sZWFuIGNsb3NlX3NvY2tldDsKKyAgZ2NoYXIgKmJpbmRfYWRkcmVzczsKKyAgZ2ludCBiaW5kX3BvcnQ7CisKKyAgLyogdGhlIHNvY2tldCBpbiB1c2UgKi8KKyAgR1NvY2tldCAqdXNlZF9zb2NrZXQsICp1c2VkX3NvY2tldF92NjsKKyAgZ2Jvb2xlYW4gZXh0ZXJuYWxfc29ja2V0OworICBnYm9vbGVhbiBtYWRlX2NhbmNlbF9mZDsKKyAgR0NhbmNlbGxhYmxlICpjYW5jZWxsYWJsZTsKK307CisKK3N0cnVjdCBfR3N0RHluVURQU2lua0NsYXNzIHsKKyAgR3N0QmFzZVNpbmtDbGFzcyBwYXJlbnRfY2xhc3M7CisKKyAgLyogZWxlbWVudCBtZXRob2RzICovCisgIEdzdFN0cnVjdHVyZSogICgqZ2V0X3N0YXRzKSAgICAoR3N0RHluVURQU2luayAqc2luaywgY29uc3QgZ2NoYXIgKmhvc3QsIGdpbnQgcG9ydCk7CisKKyAgLyogc2lnbmFscyAqLworfTsKKworR1R5cGUgZ3N0X2R5bnVkcHNpbmtfZ2V0X3R5cGUodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9EWU5VRFBTSU5LX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYyBiL2dzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2OTYzNAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmMKQEAgLTAsMCArMSwxODc0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBKYXJra28gUGFsdmlhaW5lbiA8amFya2tvLnBhbHZpYWluZW5Ac2VzY2EuY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAxMj4gQ29sbGFib3JhIEx0ZC4KKyAqICAgQXV0aG9yOiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1tdWx0aXVkcHNpbmsKKyAqIEBzZWVfYWxzbzogdWRwc2luaywgbXVsdGlmZHNpbmsKKyAqCisgKiBtdWx0aXVkcHNpbmsgaXMgYSBuZXR3b3JrIHNpbmsgdGhhdCBzZW5kcyBVRFAgcGFja2V0cyB0byBtdWx0aXBsZQorICogY2xpZW50cy4KKyAqIEl0IGNhbiBiZSBjb21iaW5lZCB3aXRoIHJ0cCBwYXlsb2FkIGVuY29kZXJzIHRvIGltcGxlbWVudCBSVFAgc3RyZWFtaW5nLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlICJnc3RtdWx0aXVkcHNpbmsuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisKKyNpZm5kZWYgR19PU19XSU4zMgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0L2dsaWItY29tcGF0LXByaXZhdGUuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAobXVsdGl1ZHBzaW5rX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChtdWx0aXVkcHNpbmtfZGVidWcpCisKKyNkZWZpbmUgVURQX01BWF9TSVpFIDY1NTA3CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKKy8qIE11bHRpVURQU2luayBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIG1ldGhvZHMgKi8KKyAgU0lHTkFMX0FERCwKKyAgU0lHTkFMX1JFTU9WRSwKKyAgU0lHTkFMX0NMRUFSLAorICBTSUdOQUxfR0VUX1NUQVRTLAorCisgIC8qIHNpZ25hbHMgKi8KKyAgU0lHTkFMX0NMSUVOVF9BRERFRCwKKyAgU0lHTkFMX0NMSUVOVF9SRU1PVkVELAorCisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKKyNkZWZpbmUgREVGQVVMVF9TT0NLRVQgICAgICAgICAgICAgTlVMTAorI2RlZmluZSBERUZBVUxUX0NMT1NFX1NPQ0tFVCAgICAgICBUUlVFCisjZGVmaW5lIERFRkFVTFRfVVNFRF9TT0NLRVQgICAgICAgIE5VTEwKKyNkZWZpbmUgREVGQVVMVF9DTElFTlRTICAgICAgICAgICAgTlVMTAorLyogRklYTUUsIHRoaXMgc2hvdWxkIGJlIGRpc2FibGVkIGJ5IGRlZmF1bHQsIHdlIGRvbid0IG5lZWQgdG8gam9pbiBhIG11bHRpY2FzdAorICogZ3JvdXAgZm9yIHNlbmRpbmcsIGlmIHRoaXMgc29ja2V0IGlzIGFsc28gdXNlZCBmb3IgcmVjZWl2aW5nLCBpdCBzaG91bGQKKyAqIGJlIGNvbmZpZ3VyZWQgaW4gdGhlIGVsZW1lbnQgdGhhdCBkb2VzIHRoZSByZWNlaXZlLiAqLworI2RlZmluZSBERUZBVUxUX0FVVE9fTVVMVElDQVNUICAgICBUUlVFCisjZGVmaW5lIERFRkFVTFRfTVVMVElDQVNUX0lGQUNFICAgIE5VTEwKKyNkZWZpbmUgREVGQVVMVF9UVEwgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgREVGQVVMVF9UVExfTUMgICAgICAgICAgICAgMQorI2RlZmluZSBERUZBVUxUX0xPT1AgICAgICAgICAgICAgICBUUlVFCisjZGVmaW5lIERFRkFVTFRfRk9SQ0VfSVBWNCAgICAgICAgIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfUU9TX0RTQ1AgICAgICAgICAgIC0xCisjZGVmaW5lIERFRkFVTFRfU0VORF9EVVBMSUNBVEVTICAgIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9CVUZGRVJfU0laRSAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX0JJTkRfQUREUkVTUyAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfQklORF9QT1JUICAgICAgICAgIDAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQllURVNfVE9fU0VSVkUsCisgIFBST1BfQllURVNfU0VSVkVELAorICBQUk9QX1NPQ0tFVCwKKyAgUFJPUF9TT0NLRVRfVjYsCisgIFBST1BfQ0xPU0VfU09DS0VULAorICBQUk9QX1VTRURfU09DS0VULAorICBQUk9QX1VTRURfU09DS0VUX1Y2LAorICBQUk9QX0NMSUVOVFMsCisgIFBST1BfQVVUT19NVUxUSUNBU1QsCisgIFBST1BfTVVMVElDQVNUX0lGQUNFLAorICBQUk9QX1RUTCwKKyAgUFJPUF9UVExfTUMsCisgIFBST1BfTE9PUCwKKyAgUFJPUF9GT1JDRV9JUFY0LAorICBQUk9QX1FPU19EU0NQLAorICBQUk9QX1NFTkRfRFVQTElDQVRFUywKKyAgUFJPUF9CVUZGRVJfU0laRSwKKyAgUFJPUF9CSU5EX0FERFJFU1MsCisgIFBST1BfQklORF9QT1JUCit9OworCitzdGF0aWMgdm9pZCBnc3RfbXVsdGl1ZHBzaW5rX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X211bHRpdWRwc2lua19yZW5kZXIgKEdzdEJhc2VTaW5rICogc2luaywKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X211bHRpdWRwc2lua19yZW5kZXJfbGlzdCAoR3N0QmFzZVNpbmsgKiBic2luaywKKyAgICBHc3RCdWZmZXJMaXN0ICogYnVmZmVyX2xpc3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X211bHRpdWRwc2lua19zdGFydCAoR3N0QmFzZVNpbmsgKiBic2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X211bHRpdWRwc2lua19zdG9wIChHc3RCYXNlU2luayAqIGJzaW5rKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbXVsdGl1ZHBzaW5rX3VubG9jayAoR3N0QmFzZVNpbmsgKiBic2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X211bHRpdWRwc2lua191bmxvY2tfc3RvcCAoR3N0QmFzZVNpbmsgKiBic2luayk7CisKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aXVkcHNpbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X211bHRpdWRwc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aXVkcHNpbmtfYWRkX2ludGVybmFsIChHc3RNdWx0aVVEUFNpbmsgKiBzaW5rLAorICAgIGNvbnN0IGdjaGFyICogaG9zdCwgZ2ludCBwb3J0LCBnYm9vbGVhbiBsb2NrKTsKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aXVkcHNpbmtfY2xlYXJfaW50ZXJuYWwgKEdzdE11bHRpVURQU2luayAqIHNpbmssCisgICAgZ2Jvb2xlYW4gbG9jayk7CisKK3N0YXRpYyBndWludCBnc3RfbXVsdGl1ZHBzaW5rX3NpZ25hbHNbTEFTVF9TSUdOQUxdID0geyAwIH07CisKKyNkZWZpbmUgZ3N0X211bHRpdWRwc2lua19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RNdWx0aVVEUFNpbmssIGdzdF9tdWx0aXVkcHNpbmssIEdTVF9UWVBFX0JBU0VfU0lOSyk7CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGl1ZHBzaW5rX2NsYXNzX2luaXQgKEdzdE11bHRpVURQU2lua0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RCYXNlU2lua0NsYXNzICpnc3RiYXNlc2lua19jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdGJhc2VzaW5rX2NsYXNzID0gKEdzdEJhc2VTaW5rQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X211bHRpdWRwc2lua19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9tdWx0aXVkcHNpbmtfZmluYWxpemU7CisKKyAgLyoqCisgICAqIEdzdE11bHRpVURQU2luazo6YWRkOgorICAgKiBAZ3N0bXVsdGl1ZHBzaW5rOiB0aGUgc2luayBvbiB3aGljaCB0aGUgc2lnbmFsIGlzIGVtaXR0ZWQKKyAgICogQGhvc3Q6IHRoZSBob3N0bmFtZS9JUCBhZGRyZXNzIG9mIHRoZSBjbGllbnQgdG8gYWRkCisgICAqIEBwb3J0OiB0aGUgcG9ydCBvZiB0aGUgY2xpZW50IHRvIGFkZAorICAgKgorICAgKiBBZGQgYSBjbGllbnQgd2l0aCBkZXN0aW5hdGlvbiBAaG9zdCBhbmQgQHBvcnQgdG8gdGhlIGxpc3Qgb2YKKyAgICogY2xpZW50cy4gV2hlbiB0aGUgc2FtZSBob3N0L3BvcnQgcGFpciBpcyBhZGRlZCBtdWx0aXBsZSB0aW1lcywgdGhlCisgICAqIHNlbmQtZHVwbGljYXRlcyBwcm9wZXJ0eSBkZWZpbmVzIGlmIHRoZSBwYWNrZXRzIGFyZSBzZW50IG11bHRpcGxlIHRpbWVzIHRvCisgICAqIHRoZSBzYW1lIGhvc3QvcG9ydCBwYWlyIG9yIG5vdC4KKyAgICoKKyAgICogV2hlbiBhIGhvc3QvcG9ydCBwYWlyIGlzIGFkZGVkIG11bHRpcGxlIHRpbWVzLCBhbiBlcXVhbCBhbW91bnQgb2YgcmVtb3ZlCisgICAqIGNhbGxzIG11c3QgYmUgcGVyZm9ybWVkIHRvIGFjdHVhbGx5IHJlbW92ZSB0aGUgaG9zdC9wb3J0IHBhaXIgZnJvbSB0aGUgbGlzdAorICAgKiBvZiBkZXN0aW5hdGlvbnMuCisgICAqLworICBnc3RfbXVsdGl1ZHBzaW5rX3NpZ25hbHNbU0lHTkFMX0FERF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgiYWRkIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNUIHwgR19TSUdOQUxfQUNUSU9OLAorICAgICAgR19TVFJVQ1RfT0ZGU0VUIChHc3RNdWx0aVVEUFNpbmtDbGFzcywgYWRkKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMiwKKyAgICAgIEdfVFlQRV9TVFJJTkcsIEdfVFlQRV9JTlQpOworICAvKioKKyAgICogR3N0TXVsdGlVRFBTaW5rOjpyZW1vdmU6CisgICAqIEBnc3RtdWx0aXVkcHNpbms6IHRoZSBzaW5rIG9uIHdoaWNoIHRoZSBzaWduYWwgaXMgZW1pdHRlZAorICAgKiBAaG9zdDogdGhlIGhvc3RuYW1lL0lQIGFkZHJlc3Mgb2YgdGhlIGNsaWVudCB0byByZW1vdmUKKyAgICogQHBvcnQ6IHRoZSBwb3J0IG9mIHRoZSBjbGllbnQgdG8gcmVtb3ZlCisgICAqCisgICAqIFJlbW92ZSB0aGUgY2xpZW50IHdpdGggZGVzdGluYXRpb24gQGhvc3QgYW5kIEBwb3J0IGZyb20gdGhlIGxpc3Qgb2YKKyAgICogY2xpZW50cy4KKyAgICovCisgIGdzdF9tdWx0aXVkcHNpbmtfc2lnbmFsc1tTSUdOQUxfUkVNT1ZFXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJyZW1vdmUiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QgfCBHX1NJR05BTF9BQ1RJT04sCisgICAgICBHX1NUUlVDVF9PRkZTRVQgKEdzdE11bHRpVURQU2lua0NsYXNzLCByZW1vdmUpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLAorICAgICAgR19UWVBFX1NUUklORywgR19UWVBFX0lOVCk7CisgIC8qKgorICAgKiBHc3RNdWx0aVVEUFNpbms6OmNsZWFyOgorICAgKiBAZ3N0bXVsdGl1ZHBzaW5rOiB0aGUgc2luayBvbiB3aGljaCB0aGUgc2lnbmFsIGlzIGVtaXR0ZWQKKyAgICoKKyAgICogQ2xlYXIgdGhlIGxpc3Qgb2YgY2xpZW50cy4KKyAgICovCisgIGdzdF9tdWx0aXVkcHNpbmtfc2lnbmFsc1tTSUdOQUxfQ0xFQVJdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoImNsZWFyIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNUIHwgR19TSUdOQUxfQUNUSU9OLAorICAgICAgR19TVFJVQ1RfT0ZGU0VUIChHc3RNdWx0aVVEUFNpbmtDbGFzcywgY2xlYXIpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAwKTsKKyAgLyoqCisgICAqIEdzdE11bHRpVURQU2luazo6Z2V0LXN0YXRzOgorICAgKiBAZ3N0bXVsdGl1ZHBzaW5rOiB0aGUgc2luayBvbiB3aGljaCB0aGUgc2lnbmFsIGlzIGVtaXR0ZWQKKyAgICogQGhvc3Q6IHRoZSBob3N0bmFtZS9JUCBhZGRyZXNzIG9mIHRoZSBjbGllbnQgdG8gZ2V0IHN0YXRzIG9uCisgICAqIEBwb3J0OiB0aGUgcG9ydCBvZiB0aGUgY2xpZW50IHRvIGdldCBzdGF0cyBvbgorICAgKgorICAgKiBHZXQgdGhlIHN0YXRpc3RpY3Mgb2YgdGhlIGNsaWVudCB3aXRoIGRlc3RpbmF0aW9uIEBob3N0IGFuZCBAcG9ydC4KKyAgICoKKyAgICogUmV0dXJuczogYSBHc3RTdHJ1Y3R1cmU6IGJ5dGVzX3NlbnQsIHBhY2tldHNfc2VudCwKKyAgICogICAgICAgICAgIGNvbm5lY3RfdGltZSAoaW4gZXBvY2ggc2Vjb25kcyksIGRpc2Nvbm5lY3RfdGltZSAoaW4gZXBvY2ggc2Vjb25kcykKKyAgICovCisgIGdzdF9tdWx0aXVkcHNpbmtfc2lnbmFsc1tTSUdOQUxfR0VUX1NUQVRTXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJnZXQtc3RhdHMiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QgfCBHX1NJR05BTF9BQ1RJT04sCisgICAgICBHX1NUUlVDVF9PRkZTRVQgKEdzdE11bHRpVURQU2lua0NsYXNzLCBnZXRfc3RhdHMpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdTVF9UWVBFX1NUUlVDVFVSRSwgMiwKKyAgICAgIEdfVFlQRV9TVFJJTkcsIEdfVFlQRV9JTlQpOworICAvKioKKyAgICogR3N0TXVsdGlVRFBTaW5rOjpjbGllbnQtYWRkZWQ6CisgICAqIEBnc3RtdWx0aXVkcHNpbms6IHRoZSBzaW5rIGVtaXR0aW5nIHRoZSBzaWduYWwKKyAgICogQGhvc3Q6IHRoZSBob3N0bmFtZS9JUCBhZGRyZXNzIG9mIHRoZSBhZGRlZCBjbGllbnQKKyAgICogQHBvcnQ6IHRoZSBwb3J0IG9mIHRoZSBhZGRlZCBjbGllbnQKKyAgICoKKyAgICogU2lnbmFsIGVtaXRlZCB3aGVuIGEgbmV3IGNsaWVudCBpcyBhZGRlZCB0byB0aGUgbGlzdCBvZgorICAgKiBjbGllbnRzLgorICAgKi8KKyAgZ3N0X211bHRpdWRwc2lua19zaWduYWxzW1NJR05BTF9DTElFTlRfQURERURdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoImNsaWVudC1hZGRlZCIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RNdWx0aVVEUFNpbmtDbGFzcywgY2xpZW50X2FkZGVkKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMiwKKyAgICAgIEdfVFlQRV9TVFJJTkcsIEdfVFlQRV9JTlQpOworICAvKioKKyAgICogR3N0TXVsdGlVRFBTaW5rOjpjbGllbnQtcmVtb3ZlZDoKKyAgICogQGdzdG11bHRpdWRwc2luazogdGhlIHNpbmsgZW1pdHRpbmcgdGhlIHNpZ25hbAorICAgKiBAaG9zdDogdGhlIGhvc3RuYW1lL0lQIGFkZHJlc3Mgb2YgdGhlIHJlbW92ZWQgY2xpZW50CisgICAqIEBwb3J0OiB0aGUgcG9ydCBvZiB0aGUgcmVtb3ZlZCBjbGllbnQKKyAgICoKKyAgICogU2lnbmFsIGVtaXRlZCB3aGVuIGEgY2xpZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZgorICAgKiBjbGllbnRzLgorICAgKi8KKyAgZ3N0X211bHRpdWRwc2lua19zaWduYWxzW1NJR05BTF9DTElFTlRfUkVNT1ZFRF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgiY2xpZW50LXJlbW92ZWQiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0TXVsdGlVRFBTaW5rQ2xhc3MsCisgICAgICAgICAgY2xpZW50X3JlbW92ZWQpLCBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywKKyAgICAgIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfU1RSSU5HLCBHX1RZUEVfSU5UKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0JZVEVTX1RPX1NFUlZFLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoImJ5dGVzLXRvLXNlcnZlIiwgIkJ5dGVzIHRvIHNlcnZlIiwKKyAgICAgICAgICAiTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIHRvIHNlcnZlIHRvIGNsaWVudHMiLCAwLCBHX01BWFVJTlQ2NCwgMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0JZVEVTX1NFUlZFRCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJieXRlcy1zZXJ2ZWQiLCAiQnl0ZXMgc2VydmVkIiwKKyAgICAgICAgICAiVG90YWwgbnVtYmVyIG9mIGJ5dGVzIHNlbnQgdG8gYWxsIGNsaWVudHMiLCAwLCBHX01BWFVJTlQ2NCwgMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NPQ0tFVCwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJzb2NrZXQiLCAiU29ja2V0IEhhbmRsZSIsCisgICAgICAgICAgIlNvY2tldCB0byB1c2UgZm9yIFVEUCBzZW5kaW5nLiAoTlVMTCA9PSBhbGxvY2F0ZSkiLAorICAgICAgICAgIEdfVFlQRV9TT0NLRVQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NPQ0tFVF9WNiwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJzb2NrZXQtdjYiLCAiU29ja2V0IEhhbmRsZSBJUHY2IiwKKyAgICAgICAgICAiU29ja2V0IHRvIHVzZSBmb3IgVURQdjYgc2VuZGluZy4gKE5VTEwgPT0gYWxsb2NhdGUpIiwKKyAgICAgICAgICBHX1RZUEVfU09DS0VULCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DTE9TRV9TT0NLRVQsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImNsb3NlLXNvY2tldCIsICJDbG9zZSBzb2NrZXQiLAorICAgICAgICAgICJDbG9zZSBzb2NrZXQgaWYgcGFzc2VkIGFzIHByb3BlcnR5IG9uIHN0YXRlIGNoYW5nZSIsCisgICAgICAgICAgREVGQVVMVF9DTE9TRV9TT0NLRVQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1VTRURfU09DS0VULAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoInVzZWQtc29ja2V0IiwgIlVzZWQgU29ja2V0IEhhbmRsZSIsCisgICAgICAgICAgIlNvY2tldCBjdXJyZW50bHkgaW4gdXNlIGZvciBVRFAgc2VuZGluZy4gKE5VTEwgPT0gbm8gc29ja2V0KSIsCisgICAgICAgICAgR19UWVBFX1NPQ0tFVCwgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9VU0VEX1NPQ0tFVF9WNiwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJ1c2VkLXNvY2tldC12NiIsICJVc2VkIFNvY2tldCBIYW5kbGUgSVB2NiIsCisgICAgICAgICAgIlNvY2tldCBjdXJyZW50bHkgaW4gdXNlIGZvciBVRFB2NiBzZW5kaW5nLiAoTlVMTCA9PSBubyBzb2NrZXQpIiwKKyAgICAgICAgICBHX1RZUEVfU09DS0VULCBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NMSUVOVFMsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiY2xpZW50cyIsICJDbGllbnRzIiwKKyAgICAgICAgICAiQSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBob3N0OnBvcnQgcGFpcnMgd2l0aCBkZXN0aW5hdGlvbnMiLAorICAgICAgICAgIERFRkFVTFRfQ0xJRU5UUywgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQVVUT19NVUxUSUNBU1QsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImF1dG8tbXVsdGljYXN0IiwKKyAgICAgICAgICAiQXV0b21hdGljYWxseSBqb2luL2xlYXZlIG11bHRpY2FzdCBncm91cHMiLAorICAgICAgICAgICJBdXRvbWF0aWNhbGx5IGpvaW4vbGVhdmUgdGhlIG11bHRpY2FzdCBncm91cHMsIEZBTFNFIG1lYW5zIHVzZXIiCisgICAgICAgICAgIiBoYXMgdG8gZG8gaXQgaGltc2VsZiIsIERFRkFVTFRfQVVUT19NVUxUSUNBU1QsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTVVMVElDQVNUX0lGQUNFLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoIm11bHRpY2FzdC1pZmFjZSIsICJNdWx0aWNhc3QgSW50ZXJmYWNlIiwKKyAgICAgICAgICAiVGhlIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHdoaWNoIHRvIGpvaW4gdGhlIG11bHRpY2FzdCBncm91cCIsCisgICAgICAgICAgREVGQVVMVF9NVUxUSUNBU1RfSUZBQ0UsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RUTCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ0dGwiLCAiVW5pY2FzdCBUVEwiLAorICAgICAgICAgICJVc2VkIGZvciBzZXR0aW5nIHRoZSB1bmljYXN0IFRUTCBwYXJhbWV0ZXIiLAorICAgICAgICAgIDAsIDI1NSwgREVGQVVMVF9UVEwsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RUTF9NQywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ0dGwtbWMiLCAiTXVsdGljYXN0IFRUTCIsCisgICAgICAgICAgIlVzZWQgZm9yIHNldHRpbmcgdGhlIG11bHRpY2FzdCBUVEwgcGFyYW1ldGVyIiwKKyAgICAgICAgICAwLCAyNTUsIERFRkFVTFRfVFRMX01DLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9MT09QLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJsb29wIiwgIk11bHRpY2FzdCBMb29wYmFjayIsCisgICAgICAgICAgIlVzZWQgZm9yIHNldHRpbmcgdGhlIG11bHRpY2FzdCBsb29wIHBhcmFtZXRlci4gVFJVRSA9IGVuYWJsZSwiCisgICAgICAgICAgIiBGQUxTRSA9IGRpc2FibGUiLCBERUZBVUxUX0xPT1AsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RNdWx0aVVEUFNpbms6OmZvcmNlLWlwdjQ6CisgICAqCisgICAqIEZvcmNlIHRoZSB1c2Ugb2YgYW4gSVB2NCBzb2NrZXQuCisgICAqCisgICAqIFNpbmNlOiAxLjAuMgorICAgKi8KKyNpZm5kZWYgR1NUX1JFTU9WRV9ERVBSRUNBVEVECisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRk9SQ0VfSVBWNCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZm9yY2UtaXB2NCIsICJGb3JjZSBJUHY0IiwKKyAgICAgICAgICAiRm9yY2luZyB0aGUgdXNlIG9mIGFuIElQdjQgc29ja2V0IChERVBSRUNBVEVELCBoYXMgbm8gZWZmZWN0IGFueW1vcmUpIiwKKyAgICAgICAgICBERUZBVUxUX0ZPUkNFX0lQVjQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR19QQVJBTV9ERVBSRUNBVEVEKSk7CisjZW5kaWYKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9RT1NfRFNDUCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJxb3MtZHNjcCIsICJRb1MgZGlmZiBzcnYgY29kZSBwb2ludCIsCisgICAgICAgICAgIlF1YWxpdHkgb2YgU2VydmljZSwgZGlmZmVyZW50aWF0ZWQgc2VydmljZXMgY29kZSBwb2ludCAoLTEgZGVmYXVsdCkiLAorICAgICAgICAgIC0xLCA2MywgREVGQVVMVF9RT1NfRFNDUCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgLyoqCisgICAqIEdzdE11bHRpVURQU2luazo6c2VuZC1kdXBsaWNhdGVzOgorICAgKgorICAgKiBXaGVuIGEgaG9zdC9wb3J0IHBhaXIgaXMgYWRkZWQgbXV0bGlwbGUgdGltZXMsIHNlbmQgdGhlIHBhY2tldCB0byB0aGUgaG9zdAorICAgKiBtdWx0aXBsZSB0aW1lcyBhcyB3ZWxsLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9TRU5EX0RVUExJQ0FURVMsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInNlbmQtZHVwbGljYXRlcyIsICJTZW5kIER1cGxpY2F0ZXMiLAorICAgICAgICAgICJXaGVuIGEgZGlzdGluYXRpb24vcG9ydCBwYWlyIGlzIGFkZGVkIG11bHRpcGxlIHRpbWVzLCBzZW5kIHBhY2tldHMgIgorICAgICAgICAgICJtdWx0aXBsZSB0aW1lcyBhcyB3ZWxsIiwgREVGQVVMVF9TRU5EX0RVUExJQ0FURVMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9CVUZGRVJfU0laRSwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJidWZmZXItc2l6ZSIsICJCdWZmZXIgU2l6ZSIsCisgICAgICAgICAgIlNpemUgb2YgdGhlIGtlcm5lbCBzZW5kIGJ1ZmZlciBpbiBieXRlcywgMD1kZWZhdWx0IiwgMCwgR19NQVhJTlQsCisgICAgICAgICAgREVGQVVMVF9CVUZGRVJfU0laRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9CSU5EX0FERFJFU1MsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiYmluZC1hZGRyZXNzIiwgIkJpbmQgQWRkcmVzcyIsCisgICAgICAgICAgIkFkZHJlc3MgdG8gYmluZCB0aGUgc29ja2V0IHRvIiwgREVGQVVMVF9CSU5EX0FERFJFU1MsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQklORF9QT1JULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImJpbmQtcG9ydCIsICJCaW5kIFBvcnQiLAorICAgICAgICAgICJQb3J0IHRvIGJpbmQgdGhlIHNvY2tldCB0byIsIDAsIEdfTUFYVUlOVDE2LAorICAgICAgICAgIERFRkFVTFRfQklORF9QT1JULCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJVRFAgcGFja2V0IHNlbmRlciIsCisgICAgICAiU2luay9OZXR3b3JrIiwKKyAgICAgICJTZW5kIGRhdGEgb3ZlciB0aGUgbmV0d29yayB2aWEgVURQIHRvIG9uZSBvciBtdWx0aXBsZSByZWNpcGllbnRzICIKKyAgICAgICJ3aGljaCBjYW4gYmUgYWRkZWQgb3IgcmVtb3ZlZCBhdCBydW50aW1lIHVzaW5nIGFjdGlvbiBzaWduYWxzIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdGJhc2VzaW5rX2NsYXNzLT5yZW5kZXIgPSBnc3RfbXVsdGl1ZHBzaW5rX3JlbmRlcjsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnJlbmRlcl9saXN0ID0gZ3N0X211bHRpdWRwc2lua19yZW5kZXJfbGlzdDsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnN0YXJ0ID0gZ3N0X211bHRpdWRwc2lua19zdGFydDsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnN0b3AgPSBnc3RfbXVsdGl1ZHBzaW5rX3N0b3A7CisgIGdzdGJhc2VzaW5rX2NsYXNzLT51bmxvY2sgPSBnc3RfbXVsdGl1ZHBzaW5rX3VubG9jazsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnVubG9ja19zdG9wID0gZ3N0X211bHRpdWRwc2lua191bmxvY2tfc3RvcDsKKyAga2xhc3MtPmFkZCA9IGdzdF9tdWx0aXVkcHNpbmtfYWRkOworICBrbGFzcy0+cmVtb3ZlID0gZ3N0X211bHRpdWRwc2lua19yZW1vdmU7CisgIGtsYXNzLT5jbGVhciA9IGdzdF9tdWx0aXVkcHNpbmtfY2xlYXI7CisgIGtsYXNzLT5nZXRfc3RhdHMgPSBnc3RfbXVsdGl1ZHBzaW5rX2dldF9zdGF0czsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAobXVsdGl1ZHBzaW5rX2RlYnVnLCAibXVsdGl1ZHBzaW5rIiwgMCwgIlVEUCBzaW5rIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGl1ZHBzaW5rX2NyZWF0ZV9jYW5jZWxsYWJsZSAoR3N0TXVsdGlVRFBTaW5rICogc2luaykKK3sKKyAgR1BvbGxGRCBwb2xsZmQ7CisKKyAgc2luay0+Y2FuY2VsbGFibGUgPSBnX2NhbmNlbGxhYmxlX25ldyAoKTsKKyAgc2luay0+bWFkZV9jYW5jZWxfZmQgPSBnX2NhbmNlbGxhYmxlX21ha2VfcG9sbGZkIChzaW5rLT5jYW5jZWxsYWJsZSwgJnBvbGxmZCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGl1ZHBzaW5rX2ZyZWVfY2FuY2VsbGFibGUgKEdzdE11bHRpVURQU2luayAqIHNpbmspCit7CisgIGlmIChzaW5rLT5tYWRlX2NhbmNlbF9mZCkgeworICAgIGdfY2FuY2VsbGFibGVfcmVsZWFzZV9mZCAoc2luay0+Y2FuY2VsbGFibGUpOworICAgIHNpbmstPm1hZGVfY2FuY2VsX2ZkID0gRkFMU0U7CisgIH0KKyAgZ19vYmplY3RfdW5yZWYgKHNpbmstPmNhbmNlbGxhYmxlKTsKKyAgc2luay0+Y2FuY2VsbGFibGUgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X211bHRpdWRwc2lua19pbml0IChHc3RNdWx0aVVEUFNpbmsgKiBzaW5rKQoreworICBndWludCBtYXhfbWVtOworCisgIGdfbXV0ZXhfaW5pdCAoJnNpbmstPmNsaWVudF9sb2NrKTsKKyAgc2luay0+Y2xpZW50cyA9IE5VTEw7CisgIHNpbmstPm51bV92NF91bmlxdWUgPSAwOworICBzaW5rLT5udW1fdjRfYWxsID0gMDsKKyAgc2luay0+bnVtX3Y2X3VuaXF1ZSA9IDA7CisgIHNpbmstPm51bV92Nl9hbGwgPSAwOworCisgIHNpbmstPnNvY2tldCA9IERFRkFVTFRfU09DS0VUOworICBzaW5rLT5zb2NrZXRfdjYgPSBERUZBVUxUX1NPQ0tFVDsKKyAgc2luay0+dXNlZF9zb2NrZXQgPSBERUZBVUxUX1VTRURfU09DS0VUOworICBzaW5rLT51c2VkX3NvY2tldF92NiA9IERFRkFVTFRfVVNFRF9TT0NLRVQ7CisgIHNpbmstPmNsb3NlX3NvY2tldCA9IERFRkFVTFRfQ0xPU0VfU09DS0VUOworICBzaW5rLT5leHRlcm5hbF9zb2NrZXQgPSAoc2luay0+c29ja2V0ICE9IE5VTEwpOworICBzaW5rLT5hdXRvX211bHRpY2FzdCA9IERFRkFVTFRfQVVUT19NVUxUSUNBU1Q7CisgIHNpbmstPnR0bCA9IERFRkFVTFRfVFRMOworICBzaW5rLT50dGxfbWMgPSBERUZBVUxUX1RUTF9NQzsKKyAgc2luay0+bG9vcCA9IERFRkFVTFRfTE9PUDsKKyAgc2luay0+Zm9yY2VfaXB2NCA9IERFRkFVTFRfRk9SQ0VfSVBWNDsKKyAgc2luay0+cW9zX2RzY3AgPSBERUZBVUxUX1FPU19EU0NQOworICBzaW5rLT5zZW5kX2R1cGxpY2F0ZXMgPSBERUZBVUxUX1NFTkRfRFVQTElDQVRFUzsKKyAgc2luay0+bXVsdGlfaWZhY2UgPSBnX3N0cmR1cCAoREVGQVVMVF9NVUxUSUNBU1RfSUZBQ0UpOworCisgIGdzdF9tdWx0aXVkcHNpbmtfY3JlYXRlX2NhbmNlbGxhYmxlIChzaW5rKTsKKworICAvKiBwcmUtYWxsb2NhdGUgT3V0cHV0VmVjdG9yLCBNYXBJbmZvIGFuZCBPdXRwdXRNZXNzYWdlIGFycmF5cworICAgKiBmb3IgdXNlIGluIHRoZSByZW5kZXIgYW5kIHJlbmRlcl9saXN0IGZ1bmN0aW9ucyAqLworICBtYXhfbWVtID0gZ3N0X2J1ZmZlcl9nZXRfbWF4X21lbW9yeSAoKTsKKworICBzaW5rLT5uX3ZlY3MgPSBtYXhfbWVtOworICBzaW5rLT52ZWNzID0gZ19uZXcgKEdPdXRwdXRWZWN0b3IsIHNpbmstPm5fdmVjcyk7CisKKyAgc2luay0+bl9tYXBzID0gbWF4X21lbTsKKyAgc2luay0+bWFwcyA9IGdfbmV3IChHc3RNYXBJbmZvLCBzaW5rLT5uX21hcHMpOworCisgIHNpbmstPm5fbWVzc2FnZXMgPSAxOworICBzaW5rLT5tZXNzYWdlcyA9IGdfbmV3IChHc3RPdXRwdXRNZXNzYWdlLCBzaW5rLT5uX21lc3NhZ2VzKTsKKworICAvKiB3ZSBhc3N1bWUgdGhhdCB0aGUgbnVtYmVyIG9mIG1lbW9yaWVzIHBlciBidWZmZXIgY2FuIGZpdCBpbnRvIGEgZ3VpbnQ4ICovCisgIGdfd2Fybl9pZl9mYWlsIChtYXhfbWVtIDw9IEdfTUFYVUlOVDgpOworfQorCitzdGF0aWMgR3N0VURQQ2xpZW50ICoKK2dzdF91ZHBfY2xpZW50X25ldyAoR3N0TXVsdGlVRFBTaW5rICogc2luaywgY29uc3QgZ2NoYXIgKiBob3N0LCBnaW50IHBvcnQpCit7CisgIEdzdFVEUENsaWVudCAqY2xpZW50OworICBHSW5ldEFkZHJlc3MgKmFkZHI7CisgIEdSZXNvbHZlciAqcmVzb2x2ZXI7CisgIEdFcnJvciAqZXJyID0gTlVMTDsKKworICBhZGRyID0gZ19pbmV0X2FkZHJlc3NfbmV3X2Zyb21fc3RyaW5nIChob3N0KTsKKyAgaWYgKCFhZGRyKSB7CisgICAgR0xpc3QgKnJlc3VsdHM7CisKKyAgICByZXNvbHZlciA9IGdfcmVzb2x2ZXJfZ2V0X2RlZmF1bHQgKCk7CisgICAgcmVzdWx0cyA9CisgICAgICAgIGdfcmVzb2x2ZXJfbG9va3VwX2J5X25hbWUgKHJlc29sdmVyLCBob3N0LCBzaW5rLT5jYW5jZWxsYWJsZSwgJmVycik7CisgICAgaWYgKCFyZXN1bHRzKQorICAgICAgZ290byBuYW1lX3Jlc29sdmU7CisgICAgYWRkciA9IEdfSU5FVF9BRERSRVNTIChnX29iamVjdF9yZWYgKHJlc3VsdHMtPmRhdGEpKTsKKworICAgIGdfcmVzb2x2ZXJfZnJlZV9hZGRyZXNzZXMgKHJlc3VsdHMpOworICAgIGdfb2JqZWN0X3VucmVmIChyZXNvbHZlcik7CisgIH0KKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgIHsKKyAgICBnY2hhciAqaXAgPSBnX2luZXRfYWRkcmVzc190b19zdHJpbmcgKGFkZHIpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgIklQIGFkZHJlc3MgZm9yIGhvc3QgJXMgaXMgJXMiLCBob3N0LCBpcCk7CisgICAgZ19mcmVlIChpcCk7CisgIH0KKyNlbmRpZgorCisgIGNsaWVudCA9IGdfc2xpY2VfbmV3MCAoR3N0VURQQ2xpZW50KTsKKyAgY2xpZW50LT5yZWZfY291bnQgPSAxOworICBjbGllbnQtPmFkZF9jb3VudCA9IDA7CisgIGNsaWVudC0+aG9zdCA9IGdfc3RyZHVwIChob3N0KTsKKyAgY2xpZW50LT5wb3J0ID0gcG9ydDsKKyAgY2xpZW50LT5hZGRyID0gZ19pbmV0X3NvY2tldF9hZGRyZXNzX25ldyAoYWRkciwgcG9ydCk7CisgIGdfb2JqZWN0X3VucmVmIChhZGRyKTsKKworICByZXR1cm4gY2xpZW50OworCituYW1lX3Jlc29sdmU6CisgIHsKKyAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICBnX29iamVjdF91bnJlZiAocmVzb2x2ZXIpOworCisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworLyogY2FsbCB3aXRoIGNsaWVudCBsb2NrIGhlbGQgKi8KK3N0YXRpYyB2b2lkCitnc3RfdWRwX2NsaWVudF91bnJlZiAoR3N0VURQQ2xpZW50ICogY2xpZW50KQoreworICBpZiAoLS1jbGllbnQtPnJlZl9jb3VudCA9PSAwKSB7CisgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudC0+YWRkcik7CisgICAgZ19mcmVlIChjbGllbnQtPmhvc3QpOworICAgIGdfc2xpY2VfZnJlZSAoR3N0VURQQ2xpZW50LCBjbGllbnQpOworICB9Cit9CisKKy8qIGNhbGwgd2l0aCBjbGllbnQgbG9jayBoZWxkICovCitzdGF0aWMgaW5saW5lIEdzdFVEUENsaWVudCAqCitnc3RfdWRwX2NsaWVudF9yZWYgKEdzdFVEUENsaWVudCAqIGNsaWVudCkKK3sKKyAgKytjbGllbnQtPnJlZl9jb3VudDsKKyAgcmV0dXJuIGNsaWVudDsKK30KKworc3RhdGljIGdpbnQKK2NsaWVudF9jb21wYXJlIChHc3RVRFBDbGllbnQgKiBhLCBHc3RVRFBDbGllbnQgKiBiKQoreworICBpZiAoKGEtPnBvcnQgPT0gYi0+cG9ydCkgJiYgKHN0cmNtcCAoYS0+aG9zdCwgYi0+aG9zdCkgPT0gMCkpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGl1ZHBzaW5rX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RNdWx0aVVEUFNpbmsgKnNpbms7CisKKyAgc2luayA9IEdTVF9NVUxUSVVEUFNJTksgKG9iamVjdCk7CisKKyAgZ19saXN0X2ZvcmVhY2ggKHNpbmstPmNsaWVudHMsIChHRnVuYykgZ3N0X3VkcF9jbGllbnRfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoc2luay0+Y2xpZW50cyk7CisKKyAgaWYgKHNpbmstPnNvY2tldCkKKyAgICBnX29iamVjdF91bnJlZiAoc2luay0+c29ja2V0KTsKKyAgc2luay0+c29ja2V0ID0gTlVMTDsKKworICBpZiAoc2luay0+c29ja2V0X3Y2KQorICAgIGdfb2JqZWN0X3VucmVmIChzaW5rLT5zb2NrZXRfdjYpOworICBzaW5rLT5zb2NrZXRfdjYgPSBOVUxMOworCisgIGlmIChzaW5rLT51c2VkX3NvY2tldCkKKyAgICBnX29iamVjdF91bnJlZiAoc2luay0+dXNlZF9zb2NrZXQpOworICBzaW5rLT51c2VkX3NvY2tldCA9IE5VTEw7CisKKyAgaWYgKHNpbmstPnVzZWRfc29ja2V0X3Y2KQorICAgIGdfb2JqZWN0X3VucmVmIChzaW5rLT51c2VkX3NvY2tldF92Nik7CisgIHNpbmstPnVzZWRfc29ja2V0X3Y2ID0gTlVMTDsKKworICBnc3RfbXVsdGl1ZHBzaW5rX2ZyZWVfY2FuY2VsbGFibGUgKHNpbmspOworCisgIGdfZnJlZSAoc2luay0+bXVsdGlfaWZhY2UpOworICBzaW5rLT5tdWx0aV9pZmFjZSA9IE5VTEw7CisKKyAgZ19mcmVlIChzaW5rLT52ZWNzKTsKKyAgc2luay0+dmVjcyA9IE5VTEw7CisgIGdfZnJlZSAoc2luay0+bWFwcyk7CisgIHNpbmstPm1hcHMgPSBOVUxMOworICBnX2ZyZWUgKHNpbmstPm1lc3NhZ2VzKTsKKyAgc2luay0+bWVzc2FnZXMgPSBOVUxMOworCisgIGdfZnJlZSAoc2luay0+YmluZF9hZGRyZXNzKTsKKyAgc2luay0+YmluZF9hZGRyZXNzID0gTlVMTDsKKworICBnX211dGV4X2NsZWFyICgmc2luay0+Y2xpZW50X2xvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworLyogcmVwbGFjZW1lbnQgdW50aWwgd2UgY2FuIGRlcGVuZCB1bmNvbmRpdGlvbmFsbHkgb24gdGhlIHJlYWwgb25lIGluIEdMaWIgKi8KKyNpZm5kZWYgSEFWRV9HX1NPQ0tFVF9TRU5EX01FU1NBR0VTCisjZGVmaW5lIGdfc29ja2V0X3NlbmRfbWVzc2FnZXMgZ3N0X3NvY2tldF9zZW5kX21lc3NhZ2VzCisKK3N0YXRpYyBnaW50Citnc3Rfc29ja2V0X3NlbmRfbWVzc2FnZXMgKEdTb2NrZXQgKiBzb2NrZXQsIEdzdE91dHB1dE1lc3NhZ2UgKiBtZXNzYWdlcywKKyAgICBndWludCBudW1fbWVzc2FnZXMsIGdpbnQgZmxhZ3MsIEdDYW5jZWxsYWJsZSAqIGNhbmNlbGxhYmxlLCBHRXJyb3IgKiogZXJyb3IpCit7CisgIGdzc2l6ZSByZXN1bHQ7CisgIGdpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX21lc3NhZ2VzOyArK2kpIHsKKyAgICBHc3RPdXRwdXRNZXNzYWdlICptc2cgPSAmbWVzc2FnZXNbaV07CisgICAgR0Vycm9yICptc2dfZXJyb3IgPSBOVUxMOworCisgICAgcmVzdWx0ID0gZ19zb2NrZXRfc2VuZF9tZXNzYWdlIChzb2NrZXQsIG1zZy0+YWRkcmVzcywKKyAgICAgICAgbXNnLT52ZWN0b3JzLCBtc2ctPm51bV92ZWN0b3JzLAorICAgICAgICBtc2ctPmNvbnRyb2xfbWVzc2FnZXMsIG1zZy0+bnVtX2NvbnRyb2xfbWVzc2FnZXMsCisgICAgICAgIGZsYWdzLCBjYW5jZWxsYWJsZSwgJm1zZ19lcnJvcik7CisKKyAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgLyogaWYgd2UgY291bGRuJ3Qgc2VuZCBhbGwgbWVzc2FnZXMsIGp1c3QgcmV0dXJuIGhvdyBtYW55IHdlIGRpZAorICAgICAgICogbWFuYWdlIHRvIHNlbmQsIHByb3ZpZGVkIHdlIG1hbmFnZWQgdG8gc2VuZCBhdCBsZWFzdCBvbmUgKi8KKyAgICAgIGlmIChtc2dfZXJyb3ItPmNvZGUgPT0gR19JT19FUlJPUl9XT1VMRF9CTE9DSyAmJiBpID4gMCkgeworICAgICAgICBnX2Vycm9yX2ZyZWUgKG1zZ19lcnJvcik7CisgICAgICAgIHJldHVybiBpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ19wcm9wYWdhdGVfZXJyb3IgKGVycm9yLCBtc2dfZXJyb3IpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgfQorCisgICAgbXNnLT5ieXRlc19zZW50ID0gcmVzdWx0OworICB9CisKKyAgcmV0dXJuIGk7Cit9CisjZW5kaWYgLyogSEFWRV9HX1NPQ0tFVF9TRU5EX01FU1NBR0VTICovCisKK3N0YXRpYyBnc2l6ZQorZmlsbF92ZWN0b3JzIChHT3V0cHV0VmVjdG9yICogdmVjcywgR3N0TWFwSW5mbyAqIG1hcHMsIGd1aW50IG4sIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0TWVtb3J5ICptZW07CisgIGdzaXplIHNpemUgPSAwOworICBndWludCBpOworCisgIGdfYXNzZXJ0IChnc3RfYnVmZmVyX25fbWVtb3J5IChidWYpID09IG4pOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICBtZW0gPSBnc3RfYnVmZmVyX3BlZWtfbWVtb3J5IChidWYsIGkpOworICAgIGlmIChnc3RfbWVtb3J5X21hcCAobWVtLCAmbWFwc1tpXSwgR1NUX01BUF9SRUFEKSkgeworICAgICAgdmVjc1tpXS5idWZmZXIgPSBtYXBzW2ldLmRhdGE7CisgICAgICB2ZWNzW2ldLnNpemUgPSBtYXBzW2ldLnNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9XQVJOSU5HICgiRmFpbGVkIHRvIG1hcCBtZW1vcnkgJXAgZm9yIHJlYWRpbmciLCBtZW0pOworICAgICAgdmVjc1tpXS5idWZmZXIgPSAiIjsKKyAgICAgIHZlY3NbaV0uc2l6ZSA9IDA7CisgICAgfQorICAgIHNpemUgKz0gdmVjc1tpXS5zaXplOworICB9CisKKyAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBnc2l6ZQorZ3N0X3VkcF9jYWxjX21lc3NhZ2Vfc2l6ZSAoR3N0T3V0cHV0TWVzc2FnZSAqIG1zZykKK3sKKyAgZ3NpemUgc2l6ZSA9IDA7CisgIGd1aW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG1zZy0+bnVtX3ZlY3RvcnM7ICsraSkKKyAgICBzaXplICs9IG1zZy0+dmVjdG9yc1tpXS5zaXplOworCisgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgZ2ludAorZ3N0X3VkcF9tZXNzc2FnZXNfZmluZF9maXJzdF9ub3Rfc2VudCAoR3N0T3V0cHV0TWVzc2FnZSAqIG1lc3NhZ2VzLAorICAgIGd1aW50IG51bV9tZXNzYWdlcykKK3sKKyAgZ3VpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX21lc3NhZ2VzOyArK2kpIHsKKyAgICBHc3RPdXRwdXRNZXNzYWdlICptc2cgPSAmbWVzc2FnZXNbaV07CisKKyAgICBpZiAobXNnLT5ieXRlc19zZW50ID09IDAgJiYgZ3N0X3VkcF9jYWxjX21lc3NhZ2Vfc2l6ZSAobXNnKSA+IDApCisgICAgICByZXR1cm4gaTsKKyAgfQorCisgIHJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSBnY2hhciAqCitnc3RfdWRwX2FkZHJlc3NfZ2V0X3N0cmluZyAoR1NvY2tldEFkZHJlc3MgKiBhZGRyLCBnY2hhciAqIHMsIGdzaXplIHNpemUpCit7CisgIEdJbmV0U29ja2V0QWRkcmVzcyAqaXNhID0gR19JTkVUX1NPQ0tFVF9BRERSRVNTIChhZGRyKTsKKyAgR0luZXRBZGRyZXNzICppYTsKKyAgZ2NoYXIgKmFkZHJfc3RyOworCisgIGlhID0gZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9hZGRyZXNzIChpc2EpOworICBhZGRyX3N0ciA9IGdfaW5ldF9hZGRyZXNzX3RvX3N0cmluZyAoaWEpOworICBnX3NucHJpbnRmIChzLCBzaXplLCAiJXM6JXUiLCBhZGRyX3N0ciwgZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9wb3J0IChpc2EpKTsKKyAgZ19mcmVlIChhZGRyX3N0cik7CisKKyAgcmV0dXJuIHM7Cit9CisKKy8qIFdyYXBwZXIgYXJvdW5kIGdfc29ja2V0X3NlbmRfbWVzc2FnZXMoKSBwbHVzIGVycm9yIGhhbmRsaW5nIChpZ25vcmluZykuCisgKiBSZXR1cm5zIEZBTFNFIGlmIHdlIGdvdCBjYW5jZWxsZWQsIG90aGVyd2lzZSBUUlVFLiAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tdWx0aXVkcHNpbmtfc2VuZF9tZXNzYWdlcyAoR3N0TXVsdGlVRFBTaW5rICogc2luaywgR1NvY2tldCAqIHNvY2tldCwKKyAgICBHc3RPdXRwdXRNZXNzYWdlICogbWVzc2FnZXMsIGd1aW50IG51bV9tZXNzYWdlcykKK3sKKyAgZ2Jvb2xlYW4gc2VudF9tYXhfc2l6ZV93YXJuaW5nID0gRkFMU0U7CisKKyAgd2hpbGUgKG51bV9tZXNzYWdlcyA+IDApIHsKKyAgICBnY2hhciBhc3RyWzY0XSBHX0dOVUNfVU5VU0VEOworICAgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgICBndWludCBtc2dfc2l6ZSwgc2tpcCwgaTsKKyAgICBnaW50IHJldCwgZXJyX2lkeDsKKworICAgIHJldCA9IGdfc29ja2V0X3NlbmRfbWVzc2FnZXMgKHNvY2tldCwgbWVzc2FnZXMsIG51bV9tZXNzYWdlcywgMCwKKyAgICAgICAgc2luay0+Y2FuY2VsbGFibGUsICZlcnIpOworCisgICAgaWYgKEdfVU5MSUtFTFkgKHJldCA8IDApKSB7CisgICAgICBHc3RPdXRwdXRNZXNzYWdlICptc2c7CisKKyAgICAgIGlmIChnX2Vycm9yX21hdGNoZXMgKGVyciwgR19JT19FUlJPUiwgR19JT19FUlJPUl9DQU5DRUxMRUQpKSB7CisgICAgICAgIEdzdEZsb3dSZXR1cm4gZmxvd19yZXQ7CisKKyAgICAgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisKKyAgICAgICAgZmxvd19yZXQgPSBnc3RfYmFzZV9zaW5rX3dhaXRfcHJlcm9sbCAoR1NUX0JBU0VfU0lOSyAoc2luaykpOworCisgICAgICAgIGlmIChmbG93X3JldCA9PSBHU1RfRkxPV19PSykKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICByZXR1cm4gZmxvd19yZXQ7CisgICAgICB9CisKKyAgICAgIGVycl9pZHggPSBnc3RfdWRwX21lc3NzYWdlc19maW5kX2ZpcnN0X25vdF9zZW50IChtZXNzYWdlcywgbnVtX21lc3NhZ2VzKTsKKyAgICAgIGlmIChlcnJfaWR4IDwgMCkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIG1zZyA9ICZtZXNzYWdlc1tlcnJfaWR4XTsKKyAgICAgIG1zZ19zaXplID0gZ3N0X3VkcF9jYWxjX21lc3NhZ2Vfc2l6ZSAobXNnKTsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNpbmssICJlcnJvciBzZW5kaW5nICV1IGJ5dGVzIHRvIGNsaWVudCAlczogJXMiLCBtc2dfc2l6ZSwKKyAgICAgICAgICBnc3RfdWRwX2FkZHJlc3NfZ2V0X3N0cmluZyAobXNnLT5hZGRyZXNzLCBhc3RyLCBzaXplb2YgKGFzdHIpKSwKKyAgICAgICAgICBlcnItPm1lc3NhZ2UpOworCisgICAgICBza2lwID0gMTsKKyAgICAgIGlmIChtc2dfc2l6ZSA+IFVEUF9NQVhfU0laRSkgeworICAgICAgICBpZiAoIXNlbnRfbWF4X3NpemVfd2FybmluZykgeworICAgICAgICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNpbmssIFJFU09VUkNFLCBXUklURSwKKyAgICAgICAgICAgICAgKCJBdHRlbXB0aW5nIHRvIHNlbmQgYSBVRFAgcGFja2V0cyBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemUgIgorICAgICAgICAgICAgICAgICAgIigldSA+ICVkKSIsIG1zZ19zaXplLCBVRFBfTUFYX1NJWkUpLAorICAgICAgICAgICAgICAoIlJlYXNvbjogJXMiLCBlcnIgPyBlcnItPm1lc3NhZ2UgOiAidW5rbm93biByZWFzb24iKSk7CisgICAgICAgICAgc2VudF9tYXhfc2l6ZV93YXJuaW5nID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNpbmssIFJFU09VUkNFLCBXUklURSwKKyAgICAgICAgICAgICgiRXJyb3Igc2VuZGluZyBVRFAgcGFja2V0cyIpLCAoImNsaWVudCAlcywgcmVhc29uOiAlcyIsCisgICAgICAgICAgICAgICAgZ3N0X3VkcF9hZGRyZXNzX2dldF9zdHJpbmcgKG1zZy0+YWRkcmVzcywgYXN0ciwgc2l6ZW9mIChhc3RyKSksCisgICAgICAgICAgICAgICAgKGVyciAhPSBOVUxMKSA/IGVyci0+bWVzc2FnZSA6ICJ1bmtub3duIHJlYXNvbiIpKTsKKworICAgICAgICBmb3IgKGkgPSBlcnJfaWR4ICsgMTsgaSA8IG51bV9tZXNzYWdlczsgKytpLCArK3NraXApIHsKKyAgICAgICAgICBpZiAobWVzc2FnZXNbaV0uYWRkcmVzcyAhPSBtc2ctPmFkZHJlc3MpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2tpcHBpbmcgJWQgbWVzc2FnZShzKSB0byBzYW1lIGNsaWVudCIsIHNraXApOworICAgICAgfQorCisgICAgICAvKiBpZ25vcmUgYW55IGVycm9ycyBhbmQgdHJ5IHNlbmRpbmcgdGhlIHJlc3QgKi8KKyAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgcmV0ID0gc2tpcDsKKyAgICB9CisKKyAgICBnX2Fzc2VydCAocmV0IDw9IG51bV9tZXNzYWdlcyk7CisKKyAgICBtZXNzYWdlcyArPSByZXQ7CisgICAgbnVtX21lc3NhZ2VzIC09IHJldDsKKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tdWx0aXVkcHNpbmtfcmVuZGVyX2J1ZmZlcnMgKEdzdE11bHRpVURQU2luayAqIHNpbmssIEdzdEJ1ZmZlciAqKiBidWZmZXJzLAorICAgIGd1aW50IG51bV9idWZmZXJzLCBndWludDggKiBtZW1fbnVtcywgZ3VpbnQgdG90YWxfbWVtX251bSkKK3sKKyAgR3N0T3V0cHV0TWVzc2FnZSAqbXNnczsKKyAgZ2Jvb2xlYW4gc2VuZF9kdXBsaWNhdGVzOworICBHc3RVRFBDbGllbnQgKipjbGllbnRzOworICBHT3V0cHV0VmVjdG9yICp2ZWNzOworICBHc3RNYXBJbmZvICptYXBfaW5mb3M7CisgIEdzdEZsb3dSZXR1cm4gZmxvd19yZXQ7CisgIGd1aW50IG51bV9hZGRyX3Y0LCBudW1fYWRkcl92NjsKKyAgZ3VpbnQgbnVtX2FkZHIsIG51bV9tc2dzOworICBndWludCBpLCBqLCBtZW07CisgIGdzaXplIHNpemUgPSAwOworICBHTGlzdCAqbDsKKworICBzZW5kX2R1cGxpY2F0ZXMgPSBzaW5rLT5zZW5kX2R1cGxpY2F0ZXM7CisKKyAgZ19tdXRleF9sb2NrICgmc2luay0+Y2xpZW50X2xvY2spOworCisgIGlmIChzZW5kX2R1cGxpY2F0ZXMpIHsKKyAgICBudW1fYWRkcl92NCA9IHNpbmstPm51bV92NF9hbGw7CisgICAgbnVtX2FkZHJfdjYgPSBzaW5rLT5udW1fdjZfYWxsOworICB9IGVsc2UgeworICAgIG51bV9hZGRyX3Y0ID0gc2luay0+bnVtX3Y0X3VuaXF1ZTsKKyAgICBudW1fYWRkcl92NiA9IHNpbmstPm51bV92Nl91bmlxdWU7CisgIH0KKyAgbnVtX2FkZHIgPSBudW1fYWRkcl92NCArIG51bV9hZGRyX3Y2OworCisgIGlmIChudW1fYWRkciA9PSAwKQorICAgIGdvdG8gbm9fY2xpZW50czsKKworICBjbGllbnRzID0gZ19uZXdhIChHc3RVRFBDbGllbnQgKiwgbnVtX2FkZHIpOworICBmb3IgKGwgPSBzaW5rLT5jbGllbnRzLCBpID0gMDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgeworICAgIEdzdFVEUENsaWVudCAqY2xpZW50ID0gbC0+ZGF0YTsKKworICAgIGNsaWVudHNbaSsrXSA9IGdzdF91ZHBfY2xpZW50X3JlZiAoY2xpZW50KTsKKyAgICBmb3IgKGogPSAxOyBzZW5kX2R1cGxpY2F0ZXMgJiYgaiA8IGNsaWVudC0+YWRkX2NvdW50OyArK2opCisgICAgICBjbGllbnRzW2krK10gPSBnc3RfdWRwX2NsaWVudF9yZWYgKGNsaWVudCk7CisgIH0KKyAgZ19hc3NlcnRfY21wdWludCAoaSwgPT0sIG51bV9hZGRyKTsKKworICBnX211dGV4X3VubG9jayAoJnNpbmstPmNsaWVudF9sb2NrKTsKKworICBHU1RfTE9HX09CSkVDVCAoc2luaywgIiV1IGJ1ZmZlcnMsICV1IG1lbW9yaWVzIC0+IHRvIGJlIHNlbnQgdG8gJXUgY2xpZW50cyIsCisgICAgICBudW1fYnVmZmVycywgdG90YWxfbWVtX251bSwgbnVtX2FkZHIpOworCisgIC8qIGVuc3VyZSBvdXIgcHJlLWFsbG9jYXRlZCBzY3JhdGNoIHNwYWNlIGFycmF5cyBhcmUgbGFyZ2UgZW5vdWdoICovCisgIGlmIChzaW5rLT5uX3ZlY3MgPCB0b3RhbF9tZW1fbnVtKSB7CisgICAgc2luay0+bl92ZWNzID0gR1NUX1JPVU5EX1VQXzE2ICh0b3RhbF9tZW1fbnVtKTsKKyAgICBnX2ZyZWUgKHNpbmstPnZlY3MpOworICAgIHNpbmstPnZlY3MgPSBnX25ldyAoR091dHB1dFZlY3Rvciwgc2luay0+bl92ZWNzKTsKKyAgfQorICB2ZWNzID0gc2luay0+dmVjczsKKworICBpZiAoc2luay0+bl9tYXBzIDwgdG90YWxfbWVtX251bSkgeworICAgIHNpbmstPm5fbWFwcyA9IEdTVF9ST1VORF9VUF8xNiAodG90YWxfbWVtX251bSk7CisgICAgZ19mcmVlIChzaW5rLT5tYXBzKTsKKyAgICBzaW5rLT5tYXBzID0gZ19uZXcgKEdzdE1hcEluZm8sIHNpbmstPm5fbWFwcyk7CisgIH0KKyAgbWFwX2luZm9zID0gc2luay0+bWFwczsKKworICBudW1fbXNncyA9IG51bV9hZGRyICogbnVtX2J1ZmZlcnM7CisgIGlmIChzaW5rLT5uX21lc3NhZ2VzIDwgbnVtX21zZ3MpIHsKKyAgICBzaW5rLT5uX21lc3NhZ2VzID0gR1NUX1JPVU5EX1VQXzE2IChudW1fbXNncyk7CisgICAgZ19mcmVlIChzaW5rLT5tZXNzYWdlcyk7CisgICAgc2luay0+bWVzc2FnZXMgPSBnX25ldyAoR3N0T3V0cHV0TWVzc2FnZSwgc2luay0+bl9tZXNzYWdlcyk7CisgIH0KKyAgbXNncyA9IHNpbmstPm1lc3NhZ2VzOworCisgIC8qIHBvcHVsYXRlIGZpcnN0IG51bV9idWZmZXJzIG1lc3NhZ2VzIHdpdGggb3V0cHV0IHZlY3RvcnMgZm9yIHRoZSBidWZmZXJzICovCisgIGZvciAoaSA9IDAsIG1lbSA9IDA7IGkgPCBudW1fYnVmZmVyczsgKytpKSB7CisgICAgc2l6ZSArPSBmaWxsX3ZlY3RvcnMgKCZ2ZWNzW21lbV0sICZtYXBfaW5mb3NbbWVtXSwgbWVtX251bXNbaV0sIGJ1ZmZlcnNbaV0pOworICAgIG1zZ3NbaV0udmVjdG9ycyA9ICZ2ZWNzW21lbV07CisgICAgbXNnc1tpXS5udW1fdmVjdG9ycyA9IG1lbV9udW1zW2ldOworICAgIG1zZ3NbaV0ubnVtX2NvbnRyb2xfbWVzc2FnZXMgPSAwOworICAgIG1zZ3NbaV0uYnl0ZXNfc2VudCA9IDA7CisgICAgbXNnc1tpXS5jb250cm9sX21lc3NhZ2VzID0gTlVMTDsKKyAgICBtc2dzW2ldLmFkZHJlc3MgPSBjbGllbnRzWzBdLT5hZGRyOworICAgIG1lbSArPSBtZW1fbnVtc1tpXTsKKyAgfQorCisgIC8qIEZJWE1FOiBob3cgYWJvdXQgc29tZSBsb2NraW5nPyAodGhlcmUgd2Fzbid0IGFueSBiZWZvcmUgZWl0aGVyLCBidXQuLikgKi8KKyAgc2luay0+Ynl0ZXNfdG9fc2VydmUgKz0gc2l6ZTsKKworICAvKiBub3cgY29weSB0aGUgcHJlLWZpbGxlZCBudW1fYnVmZmVyIG1lc3NhZ2VzIG92ZXIgdG8gdGhlIG5leHQgbnVtX2J1ZmZlcgorICAgKiBtZXNzYWdlcyBmb3IgdGhlIG5leHQgY2xpZW50LCB3aGVyZSB3ZSBhbHNvIGNoYW5nZSB0aGUgdGFyZ2V0IGFkZGRyZXNzICovCisgIGZvciAoaSA9IDE7IGkgPCBudW1fYWRkcjsgKytpKSB7CisgICAgZm9yIChqID0gMDsgaiA8IG51bV9idWZmZXJzOyArK2opIHsKKyAgICAgIG1zZ3NbaSAqIG51bV9idWZmZXJzICsgal0gPSBtc2dzW2pdOworICAgICAgbXNnc1tpICogbnVtX2J1ZmZlcnMgKyBqXS5hZGRyZXNzID0gY2xpZW50c1tpXS0+YWRkcjsKKyAgICB9CisgIH0KKworICAvKiBub3cgc2VuZCBpdCEgKi8KKworICAvKiBubyBJUHY0IHNvY2tldD8gU2VuZCBpdCBhbGwgZnJvbSB0aGUgSVB2NiBzb2NrZXQgdGhlbi4uICovCisgIGlmIChzaW5rLT51c2VkX3NvY2tldCA9PSBOVUxMKSB7CisgICAgZmxvd19yZXQgPSBnc3RfbXVsdGl1ZHBzaW5rX3NlbmRfbWVzc2FnZXMgKHNpbmssIHNpbmstPnVzZWRfc29ja2V0X3Y2LAorICAgICAgICBtc2dzLCBudW1fbXNncyk7CisgIH0gZWxzZSB7CisgICAgZ3VpbnQgbnVtX21zZ3NfdjQgPSBudW1fYnVmZmVycyAqIG51bV9hZGRyX3Y0OworICAgIGd1aW50IG51bV9tc2dzX3Y2ID0gbnVtX2J1ZmZlcnMgKiBudW1fYWRkcl92NjsKKworICAgIC8qIG91ciBjbGllbnQgbGlzdCBpcyBzb3J0ZWQgd2l0aCBJUHY0IGNsaWVudHMgZmlyc3QgYW5kIElQdjYgb25lcyBsYXN0ICovCisgICAgZmxvd19yZXQgPSBnc3RfbXVsdGl1ZHBzaW5rX3NlbmRfbWVzc2FnZXMgKHNpbmssIHNpbmstPnVzZWRfc29ja2V0LAorICAgICAgICBtc2dzLCBudW1fbXNnc192NCk7CisKKyAgICBpZiAoZmxvd19yZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIGNhbmNlbGxlZDsKKworICAgIGZsb3dfcmV0ID0gZ3N0X211bHRpdWRwc2lua19zZW5kX21lc3NhZ2VzIChzaW5rLCBzaW5rLT51c2VkX3NvY2tldF92NiwKKyAgICAgICAgbXNncyArIG51bV9tc2dzX3Y0LCBudW1fbXNnc192Nik7CisgIH0KKworICBpZiAoZmxvd19yZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBjYW5jZWxsZWQ7CisKKyAgLyogbm93IHVwZGF0ZSBzdGF0cyAqLworICBnX211dGV4X2xvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9hZGRyOyArK2kpIHsKKyAgICBHc3RVRFBDbGllbnQgKmNsaWVudCA9IGNsaWVudHNbaV07CisKKyAgICBmb3IgKGogPSAwOyBqIDwgbnVtX2J1ZmZlcnM7ICsraikgeworICAgICAgZ3NpemUgYnl0ZXNfc2VudDsKKworICAgICAgYnl0ZXNfc2VudCA9IG1zZ3NbaSAqIG51bV9idWZmZXJzICsgal0uYnl0ZXNfc2VudDsKKworICAgICAgY2xpZW50LT5ieXRlc19zZW50ICs9IGJ5dGVzX3NlbnQ7CisgICAgICBjbGllbnQtPnBhY2tldHNfc2VudCsrOworICAgICAgc2luay0+Ynl0ZXNfc2VydmVkICs9IGJ5dGVzX3NlbnQ7CisgICAgfQorICAgIGdzdF91ZHBfY2xpZW50X3VucmVmIChjbGllbnQpOworICB9CisKKyAgZ19tdXRleF91bmxvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisKK291dDoKKworICBmb3IgKGkgPSAwOyBpIDwgbWVtOyArK2kpCisgICAgZ3N0X21lbW9yeV91bm1hcCAobWFwX2luZm9zW2ldLm1lbW9yeSwgJm1hcF9pbmZvc1tpXSk7CisKKyAgcmV0dXJuIGZsb3dfcmV0OworCitub19jbGllbnRzOgorICB7CisgICAgZ19tdXRleF91bmxvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNpbmssICJubyBjbGllbnRzIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CitjYW5jZWxsZWQ6CisgIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHNpbmssICJjYW5jZWxsZWQiKTsKKworICAgIGdfbXV0ZXhfbG9jayAoJnNpbmstPmNsaWVudF9sb2NrKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2FkZHI7ICsraSkKKyAgICAgIGdzdF91ZHBfY2xpZW50X3VucmVmIChjbGllbnRzW2ldKTsKKyAgICBnX211dGV4X3VubG9jayAoJnNpbmstPmNsaWVudF9sb2NrKTsKKyAgICBnb3RvIG91dDsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X211bHRpdWRwc2lua19yZW5kZXJfbGlzdCAoR3N0QmFzZVNpbmsgKiBic2luaywgR3N0QnVmZmVyTGlzdCAqIGJ1ZmZlcl9saXN0KQoreworICBHc3RNdWx0aVVEUFNpbmsgKnNpbms7CisgIEdzdEJ1ZmZlciAqKmJ1ZmZlcnM7CisgIEdzdEZsb3dSZXR1cm4gZmxvdzsKKyAgZ3VpbnQ4ICptZW1fbnVtczsKKyAgZ3VpbnQgdG90YWxfbWVtczsKKyAgZ3VpbnQgaSwgbnVtX2J1ZmZlcnM7CisKKyAgc2luayA9IEdTVF9NVUxUSVVEUFNJTktfQ0FTVCAoYnNpbmspOworCisgIG51bV9idWZmZXJzID0gZ3N0X2J1ZmZlcl9saXN0X2xlbmd0aCAoYnVmZmVyX2xpc3QpOworICBpZiAobnVtX2J1ZmZlcnMgPT0gMCkKKyAgICBnb3RvIG5vX2RhdGE7CisKKyAgYnVmZmVycyA9IGdfbmV3YSAoR3N0QnVmZmVyICosIG51bV9idWZmZXJzKTsKKyAgbWVtX251bXMgPSBnX25ld2EgKGd1aW50OCwgbnVtX2J1ZmZlcnMpOworICBmb3IgKGkgPSAwLCB0b3RhbF9tZW1zID0gMDsgaSA8IG51bV9idWZmZXJzOyArK2kpIHsKKyAgICBidWZmZXJzW2ldID0gZ3N0X2J1ZmZlcl9saXN0X2dldCAoYnVmZmVyX2xpc3QsIGkpOworICAgIG1lbV9udW1zW2ldID0gZ3N0X2J1ZmZlcl9uX21lbW9yeSAoYnVmZmVyc1tpXSk7CisgICAgdG90YWxfbWVtcyArPSBtZW1fbnVtc1tpXTsKKyAgfQorCisgIGZsb3cgPSBnc3RfbXVsdGl1ZHBzaW5rX3JlbmRlcl9idWZmZXJzIChzaW5rLCBidWZmZXJzLCBudW1fYnVmZmVycywKKyAgICAgIG1lbV9udW1zLCB0b3RhbF9tZW1zKTsKKworICByZXR1cm4gZmxvdzsKKworbm9fZGF0YToKKyAgeworICAgIEdTVF9MT0dfT0JKRUNUIChzaW5rLCAiZW1wdHkgYnVmZmVyIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbXVsdGl1ZHBzaW5rX3JlbmRlciAoR3N0QmFzZVNpbmsgKiBic2luaywgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RNdWx0aVVEUFNpbmsgKnNpbms7CisgIEdzdEZsb3dSZXR1cm4gZmxvdzsKKyAgZ3VpbnQ4IG5fbWVtOworCisgIHNpbmsgPSBHU1RfTVVMVElVRFBTSU5LX0NBU1QgKGJzaW5rKTsKKworICBuX21lbSA9IGdzdF9idWZmZXJfbl9tZW1vcnkgKGJ1ZmZlcik7CisKKyAgaWYgKG5fbWVtID4gMCkKKyAgICBmbG93ID0gZ3N0X211bHRpdWRwc2lua19yZW5kZXJfYnVmZmVycyAoc2luaywgJmJ1ZmZlciwgMSwgJm5fbWVtLCBuX21lbSk7CisgIGVsc2UKKyAgICBmbG93ID0gR1NUX0ZMT1dfT0s7CisKKyAgcmV0dXJuIGZsb3c7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGl1ZHBzaW5rX3NldF9jbGllbnRzX3N0cmluZyAoR3N0TXVsdGlVRFBTaW5rICogc2luaywKKyAgICBjb25zdCBnY2hhciAqIHN0cmluZykKK3sKKyAgZ2NoYXIgKipjbGllbnRzOworICBnaW50IGk7CisKKyAgY2xpZW50cyA9IGdfc3Ryc3BsaXQgKHN0cmluZywgIiwiLCAwKTsKKworICBnX211dGV4X2xvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisgIC8qIGNsZWFyIGFsbCBleGlzdGluZyBjbGllbnRzICovCisgIGdzdF9tdWx0aXVkcHNpbmtfY2xlYXJfaW50ZXJuYWwgKHNpbmssIEZBTFNFKTsKKyAgZm9yIChpID0gMDsgY2xpZW50c1tpXTsgaSsrKSB7CisgICAgZ2NoYXIgKmhvc3QsICpwOworICAgIGdpbnQ2NCBwb3J0ID0gMDsKKworICAgIGhvc3QgPSBjbGllbnRzW2ldOworICAgIHAgPSBzdHJzdHIgKGNsaWVudHNbaV0sICI6Iik7CisgICAgaWYgKHAgIT0gTlVMTCkgeworICAgICAgKnAgPSAnXDAnOworICAgICAgcG9ydCA9IGdfYXNjaWlfc3RydG9sbCAocCArIDEsIE5VTEwsIDEwKTsKKyAgICB9CisgICAgaWYgKHBvcnQgIT0gMCkKKyAgICAgIGdzdF9tdWx0aXVkcHNpbmtfYWRkX2ludGVybmFsIChzaW5rLCBob3N0LCBwb3J0LCBGQUxTRSk7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisKKyAgZ19zdHJmcmVldiAoY2xpZW50cyk7Cit9CisKK3N0YXRpYyBnY2hhciAqCitnc3RfbXVsdGl1ZHBzaW5rX2dldF9jbGllbnRzX3N0cmluZyAoR3N0TXVsdGlVRFBTaW5rICogc2luaykKK3sKKyAgR1N0cmluZyAqc3RyOworICBHTGlzdCAqY2xpZW50czsKKworICBzdHIgPSBnX3N0cmluZ19uZXcgKCIiKTsKKworICBnX211dGV4X2xvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisgIGNsaWVudHMgPSBzaW5rLT5jbGllbnRzOworICB3aGlsZSAoY2xpZW50cykgeworICAgIEdzdFVEUENsaWVudCAqY2xpZW50OworICAgIGdpbnQgY291bnQ7CisKKyAgICBjbGllbnQgPSAoR3N0VURQQ2xpZW50ICopIGNsaWVudHMtPmRhdGE7CisKKyAgICBjbGllbnRzID0gZ19saXN0X25leHQgKGNsaWVudHMpOworCisgICAgY291bnQgPSBjbGllbnQtPmFkZF9jb3VudDsKKyAgICB3aGlsZSAoY291bnQtLSkgeworICAgICAgZ19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoc3RyLCAiJXM6JWQlcyIsIGNsaWVudC0+aG9zdCwgY2xpZW50LT5wb3J0LAorICAgICAgICAgIChjbGllbnRzIHx8IGNvdW50ID4gMSA/ICIsIiA6ICIiKSk7CisgICAgfQorICB9CisgIGdfbXV0ZXhfdW5sb2NrICgmc2luay0+Y2xpZW50X2xvY2spOworCisgIHJldHVybiBnX3N0cmluZ19mcmVlIChzdHIsIEZBTFNFKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aXVkcHNpbmtfc2V0dXBfcW9zX2RzY3AgKEdzdE11bHRpVURQU2luayAqIHNpbmssIEdTb2NrZXQgKiBzb2NrZXQpCit7CisgIC8qIGRvbid0IHRvdWNoIG9uIC0xICovCisgIGlmIChzaW5rLT5xb3NfZHNjcCA8IDApCisgICAgcmV0dXJuOworCisgIGlmIChzb2NrZXQgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyNpZmRlZiBJUF9UT1MKKyAgeworICAgIGdpbnQgdG9zOworICAgIGdpbnQgZmQ7CisKKyAgICBmZCA9IGdfc29ja2V0X2dldF9mZCAoc29ja2V0KTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJzZXR0aW5nIFRPUyB0byAlZCIsIHNpbmstPnFvc19kc2NwKTsKKworICAgIC8qIEV4dHJhY3QgYW5kIHNoaWZ0IDYgYml0cyBvZiBEU0ZJRUxEICovCisgICAgdG9zID0gKHNpbmstPnFvc19kc2NwICYgMHgzZikgPDwgMjsKKworICAgIGlmIChzZXRzb2Nrb3B0IChmZCwgSVBQUk9UT19JUCwgSVBfVE9TLCAmdG9zLCBzaXplb2YgKHRvcykpIDwgMCkgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAoc2luaywgImNvdWxkIG5vdCBzZXQgVE9TOiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgfQorI2lmZGVmIElQVjZfVENMQVNTCisgICAgaWYgKGdfc29ja2V0X2dldF9mYW1pbHkgKHNvY2tldCkgPT0gR19TT0NLRVRfRkFNSUxZX0lQVjYpIHsKKyAgICAgIGlmIChzZXRzb2Nrb3B0IChmZCwgSVBQUk9UT19JUFY2LCBJUFY2X1RDTEFTUywgJnRvcywgc2l6ZW9mICh0b3MpKSA8IDApIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoc2luaywgImNvdWxkIG5vdCBzZXQgVENMQVNTOiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICB9CisgICAgfQorI2VuZGlmCisgIH0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorZ3N0X211bHRpdWRwc2lua19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0TXVsdGlVRFBTaW5rICp1ZHBzaW5rOworCisgIHVkcHNpbmsgPSBHU1RfTVVMVElVRFBTSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TT0NLRVQ6CisgICAgICBpZiAodWRwc2luay0+c29ja2V0ICE9IE5VTEwgJiYgdWRwc2luay0+c29ja2V0ICE9IHVkcHNpbmstPnVzZWRfc29ja2V0ICYmCisgICAgICAgICAgdWRwc2luay0+Y2xvc2Vfc29ja2V0KSB7CisgICAgICAgIEdFcnJvciAqZXJyID0gTlVMTDsKKworICAgICAgICBpZiAoIWdfc29ja2V0X2Nsb3NlICh1ZHBzaW5rLT5zb2NrZXQsICZlcnIpKSB7CisgICAgICAgICAgR1NUX0VSUk9SICgiZmFpbGVkIHRvIGNsb3NlIHNvY2tldCAlcDogJXMiLCB1ZHBzaW5rLT5zb2NrZXQsCisgICAgICAgICAgICAgIGVyci0+bWVzc2FnZSk7CisgICAgICAgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICh1ZHBzaW5rLT5zb2NrZXQpCisgICAgICAgIGdfb2JqZWN0X3VucmVmICh1ZHBzaW5rLT5zb2NrZXQpOworICAgICAgdWRwc2luay0+c29ja2V0ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUICh1ZHBzaW5rLCAic2V0dGluZyBzb2NrZXQgdG8gJXAiLCB1ZHBzaW5rLT5zb2NrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NPQ0tFVF9WNjoKKyAgICAgIGlmICh1ZHBzaW5rLT5zb2NrZXRfdjYgIT0gTlVMTAorICAgICAgICAgICYmIHVkcHNpbmstPnNvY2tldF92NiAhPSB1ZHBzaW5rLT51c2VkX3NvY2tldF92NgorICAgICAgICAgICYmIHVkcHNpbmstPmNsb3NlX3NvY2tldCkgeworICAgICAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgICAgICAgaWYgKCFnX3NvY2tldF9jbG9zZSAodWRwc2luay0+c29ja2V0X3Y2LCAmZXJyKSkgeworICAgICAgICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBjbG9zZSBzb2NrZXQgJXA6ICVzIiwgdWRwc2luay0+c29ja2V0X3Y2LAorICAgICAgICAgICAgICBlcnItPm1lc3NhZ2UpOworICAgICAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAodWRwc2luay0+c29ja2V0X3Y2KQorICAgICAgICBnX29iamVjdF91bnJlZiAodWRwc2luay0+c29ja2V0X3Y2KTsKKyAgICAgIHVkcHNpbmstPnNvY2tldF92NiA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAodWRwc2luaywgInNldHRpbmcgc29ja2V0IHRvICVwIiwgdWRwc2luay0+c29ja2V0X3Y2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTE9TRV9TT0NLRVQ6CisgICAgICB1ZHBzaW5rLT5jbG9zZV9zb2NrZXQgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0xJRU5UUzoKKyAgICAgIGdzdF9tdWx0aXVkcHNpbmtfc2V0X2NsaWVudHNfc3RyaW5nICh1ZHBzaW5rLCBnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQVVUT19NVUxUSUNBU1Q6CisgICAgICB1ZHBzaW5rLT5hdXRvX211bHRpY2FzdCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NVUxUSUNBU1RfSUZBQ0U6CisgICAgICBnX2ZyZWUgKHVkcHNpbmstPm11bHRpX2lmYWNlKTsKKworICAgICAgaWYgKGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpID09IE5VTEwpCisgICAgICAgIHVkcHNpbmstPm11bHRpX2lmYWNlID0gZ19zdHJkdXAgKERFRkFVTFRfTVVMVElDQVNUX0lGQUNFKTsKKyAgICAgIGVsc2UKKyAgICAgICAgdWRwc2luay0+bXVsdGlfaWZhY2UgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UVEw6CisgICAgICB1ZHBzaW5rLT50dGwgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UVExfTUM6CisgICAgICB1ZHBzaW5rLT50dGxfbWMgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9MT09QOgorICAgICAgdWRwc2luay0+bG9vcCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GT1JDRV9JUFY0OgorICAgICAgdWRwc2luay0+Zm9yY2VfaXB2NCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9RT1NfRFNDUDoKKyAgICAgIHVkcHNpbmstPnFvc19kc2NwID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBnc3RfbXVsdGl1ZHBzaW5rX3NldHVwX3Fvc19kc2NwICh1ZHBzaW5rLCB1ZHBzaW5rLT51c2VkX3NvY2tldCk7CisgICAgICBnc3RfbXVsdGl1ZHBzaW5rX3NldHVwX3Fvc19kc2NwICh1ZHBzaW5rLCB1ZHBzaW5rLT51c2VkX3NvY2tldF92Nik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0VORF9EVVBMSUNBVEVTOgorICAgICAgdWRwc2luay0+c2VuZF9kdXBsaWNhdGVzID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JVRkZFUl9TSVpFOgorICAgICAgdWRwc2luay0+YnVmZmVyX3NpemUgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CSU5EX0FERFJFU1M6CisgICAgICBnX2ZyZWUgKHVkcHNpbmstPmJpbmRfYWRkcmVzcyk7CisgICAgICB1ZHBzaW5rLT5iaW5kX2FkZHJlc3MgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CSU5EX1BPUlQ6CisgICAgICB1ZHBzaW5rLT5iaW5kX3BvcnQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aXVkcHNpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE11bHRpVURQU2luayAqdWRwc2luazsKKworICB1ZHBzaW5rID0gR1NUX01VTFRJVURQU0lOSyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQllURVNfVE9fU0VSVkU6CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCB1ZHBzaW5rLT5ieXRlc190b19zZXJ2ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQllURVNfU0VSVkVEOgorICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgdWRwc2luay0+Ynl0ZXNfc2VydmVkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TT0NLRVQ6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCB1ZHBzaW5rLT5zb2NrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NPQ0tFVF9WNjoKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHVkcHNpbmstPnNvY2tldF92Nik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0xPU0VfU09DS0VUOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHVkcHNpbmstPmNsb3NlX3NvY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFRF9TT0NLRVQ6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCB1ZHBzaW5rLT51c2VkX3NvY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFRF9TT0NLRVRfVjY6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCB1ZHBzaW5rLT51c2VkX3NvY2tldF92Nik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0xJRU5UUzoKKyAgICAgIGdfdmFsdWVfdGFrZV9zdHJpbmcgKHZhbHVlLAorICAgICAgICAgIGdzdF9tdWx0aXVkcHNpbmtfZ2V0X2NsaWVudHNfc3RyaW5nICh1ZHBzaW5rKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQVVUT19NVUxUSUNBU1Q6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgdWRwc2luay0+YXV0b19tdWx0aWNhc3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01VTFRJQ0FTVF9JRkFDRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHVkcHNpbmstPm11bHRpX2lmYWNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UVEw6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB1ZHBzaW5rLT50dGwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RUTF9NQzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHVkcHNpbmstPnR0bF9tYyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTE9PUDoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCB1ZHBzaW5rLT5sb29wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GT1JDRV9JUFY0OgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHVkcHNpbmstPmZvcmNlX2lwdjQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1FPU19EU0NQOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdWRwc2luay0+cW9zX2RzY3ApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NFTkRfRFVQTElDQVRFUzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCB1ZHBzaW5rLT5zZW5kX2R1cGxpY2F0ZXMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JVRkZFUl9TSVpFOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdWRwc2luay0+YnVmZmVyX3NpemUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JJTkRfQUREUkVTUzoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHVkcHNpbmstPmJpbmRfYWRkcmVzcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQklORF9QT1JUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdWRwc2luay0+YmluZF9wb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbXVsdGl1ZHBzaW5rX2NvbmZpZ3VyZV9jbGllbnQgKEdzdE11bHRpVURQU2luayAqIHNpbmssCisgICAgR3N0VURQQ2xpZW50ICogY2xpZW50KQoreworICBHSW5ldFNvY2tldEFkZHJlc3MgKnNhZGRyID0gR19JTkVUX1NPQ0tFVF9BRERSRVNTIChjbGllbnQtPmFkZHIpOworICBHSW5ldEFkZHJlc3MgKmFkZHIgPSBnX2luZXRfc29ja2V0X2FkZHJlc3NfZ2V0X2FkZHJlc3MgKHNhZGRyKTsKKyAgR1NvY2tldEZhbWlseSBmYW1pbHkgPSBnX3NvY2tldF9hZGRyZXNzX2dldF9mYW1pbHkgKEdfU09DS0VUX0FERFJFU1MgKHNhZGRyKSk7CisgIEdTb2NrZXQgKnNvY2tldDsKKyAgR0Vycm9yICplcnIgPSBOVUxMOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJjb25maWd1cmluZyBjbGllbnQgJXAiLCBjbGllbnQpOworCisgIGlmIChmYW1pbHkgPT0gR19TT0NLRVRfRkFNSUxZX0lQVjYgJiYgIXNpbmstPnVzZWRfc29ja2V0X3Y2KQorICAgIGdvdG8gaW52YWxpZF9mYW1pbHk7CisKKyAgLyogU2VsZWN0IHNvY2tldCB0byBzZW5kIGZyb20gZm9yIHRoaXMgYWRkcmVzcyAqLworICBpZiAoZmFtaWx5ID09IEdfU09DS0VUX0ZBTUlMWV9JUFY2IHx8ICFzaW5rLT51c2VkX3NvY2tldCkKKyAgICBzb2NrZXQgPSBzaW5rLT51c2VkX3NvY2tldF92NjsKKyAgZWxzZQorICAgIHNvY2tldCA9IHNpbmstPnVzZWRfc29ja2V0OworCisgIGlmIChnX2luZXRfYWRkcmVzc19nZXRfaXNfbXVsdGljYXN0IChhZGRyKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJ3ZSBoYXZlIGEgbXVsdGljYXN0IGNsaWVudCAlcCIsIGNsaWVudCk7CisgICAgaWYgKHNpbmstPmF1dG9fbXVsdGljYXN0KSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiYXV0b2pvaW5pbmcgZ3JvdXAiKTsKKyAgICAgIGlmICghZ19zb2NrZXRfam9pbl9tdWx0aWNhc3RfZ3JvdXAgKHNvY2tldCwgYWRkciwgRkFMU0UsCisgICAgICAgICAgICAgIHNpbmstPm11bHRpX2lmYWNlLCAmZXJyKSkKKyAgICAgICAgZ290byBqb2luX2dyb3VwX2ZhaWxlZDsKKyAgICB9CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgInNldHRpbmcgbG9vcCB0byAlZCIsIHNpbmstPmxvb3ApOworICAgIGdfc29ja2V0X3NldF9tdWx0aWNhc3RfbG9vcGJhY2sgKHNvY2tldCwgc2luay0+bG9vcCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgInNldHRpbmcgdHRsIHRvICVkIiwgc2luay0+dHRsX21jKTsKKyAgICBnX3NvY2tldF9zZXRfbXVsdGljYXN0X3R0bCAoc29ja2V0LCBzaW5rLT50dGxfbWMpOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJzZXR0aW5nIHVuaWNhc3QgdHRsIHRvICVkIiwgc2luay0+dHRsKTsKKyAgICBnX3NvY2tldF9zZXRfdHRsIChzb2NrZXQsIHNpbmstPnR0bCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitqb2luX2dyb3VwX2ZhaWxlZDoKKyAgeworICAgIGdzdF9tdWx0aXVkcHNpbmtfc3RvcCAoR1NUX0JBU0VfU0lOSyAoc2luaykpOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJDb3VsZCBub3Qgam9pbiBtdWx0aWNhc3QgZ3JvdXA6ICVzIiwKKyAgICAgICAgICAgIGVyciA/IGVyci0+bWVzc2FnZSA6ICJ1bmtub3duIHJlYXNvbiIpKTsKKyAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfZmFtaWx5OgorICB7CisgICAgZ3N0X211bHRpdWRwc2lua19zdG9wIChHU1RfQkFTRV9TSU5LIChzaW5rKSk7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNpbmssIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAoIkludmFsaWQgYWRkcmVzcyBmYW1pbHkgKGdvdCAlZCkiLCBmYW1pbHkpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogY3JlYXRlIGEgc29ja2V0IGZvciBzZW5kaW5nIHRvIHJlbW90ZSBtYWNoaW5lICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWx0aXVkcHNpbmtfc3RhcnQgKEdzdEJhc2VTaW5rICogYnNpbmspCit7CisgIEdzdE11bHRpVURQU2luayAqc2luazsKKyAgR0xpc3QgKmNsaWVudHM7CisgIEdzdFVEUENsaWVudCAqY2xpZW50OworICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgc2luayA9IEdTVF9NVUxUSVVEUFNJTksgKGJzaW5rKTsKKworICBzaW5rLT5leHRlcm5hbF9zb2NrZXQgPSBGQUxTRTsKKworICBpZiAoc2luay0+c29ja2V0KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgInVzaW5nIGNvbmZpZ3VyZWQgc29ja2V0Iik7CisgICAgaWYgKGdfc29ja2V0X2dldF9mYW1pbHkgKHNpbmstPnNvY2tldCkgPT0gR19TT0NLRVRfRkFNSUxZX0lQVjYpIHsKKyAgICAgIHNpbmstPnVzZWRfc29ja2V0X3Y2ID0gR19TT0NLRVQgKGdfb2JqZWN0X3JlZiAoc2luay0+c29ja2V0KSk7CisgICAgICBzaW5rLT5leHRlcm5hbF9zb2NrZXQgPSBUUlVFOworICAgIH0gZWxzZSB7CisgICAgICBzaW5rLT51c2VkX3NvY2tldCA9IEdfU09DS0VUIChnX29iamVjdF9yZWYgKHNpbmstPnNvY2tldCkpOworICAgICAgc2luay0+ZXh0ZXJuYWxfc29ja2V0ID0gVFJVRTsKKyAgICB9CisgIH0KKworICBpZiAoc2luay0+c29ja2V0X3Y2KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgInVzaW5nIGNvbmZpZ3VyZWQgSVB2NiBzb2NrZXQiKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCAoIXNpbmstPnNvY2tldCB8fCBnX3NvY2tldF9nZXRfZmFtaWx5IChzaW5rLT5zb2NrZXQpICE9CisgICAgICAgIEdfU09DS0VUX0ZBTUlMWV9JUFY2LCBGQUxTRSk7CisKKyAgICBpZiAoc2luay0+dXNlZF9zb2NrZXRfdjYgJiYgc2luay0+dXNlZF9zb2NrZXRfdjYgIT0gc2luay0+c29ja2V0X3Y2KSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChzaW5rLAorICAgICAgICAgICJQcm92aWRlZCBkaWZmZXJlbnQgSVB2NiBzb2NrZXRzIGluIHNvY2tldCBhbmQgc29ja2V0LXY2IHByb3BlcnRpZXMiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBzaW5rLT51c2VkX3NvY2tldF92NiA9IEdfU09DS0VUIChnX29iamVjdF9yZWYgKHNpbmstPnNvY2tldF92NikpOworICAgIHNpbmstPmV4dGVybmFsX3NvY2tldCA9IFRSVUU7CisgIH0KKworICBpZiAoIXNpbmstPnVzZWRfc29ja2V0ICYmICFzaW5rLT51c2VkX3NvY2tldF92NikgeworICAgIEdTb2NrZXRBZGRyZXNzICpiaW5kX2FkZHI7CisgICAgR0luZXRBZGRyZXNzICpiaW5kX2lhZGRyOworCisgICAgaWYgKHNpbmstPmJpbmRfYWRkcmVzcykgeworICAgICAgR1NvY2tldEZhbWlseSBmYW1pbHk7CisKKyAgICAgIGJpbmRfaWFkZHIgPSBnX2luZXRfYWRkcmVzc19uZXdfZnJvbV9zdHJpbmcgKHNpbmstPmJpbmRfYWRkcmVzcyk7CisgICAgICBpZiAoIWJpbmRfaWFkZHIpIHsKKyAgICAgICAgR0xpc3QgKnJlc3VsdHM7CisgICAgICAgIEdSZXNvbHZlciAqcmVzb2x2ZXI7CisKKyAgICAgICAgcmVzb2x2ZXIgPSBnX3Jlc29sdmVyX2dldF9kZWZhdWx0ICgpOworICAgICAgICByZXN1bHRzID0KKyAgICAgICAgICAgIGdfcmVzb2x2ZXJfbG9va3VwX2J5X25hbWUgKHJlc29sdmVyLCBzaW5rLT5iaW5kX2FkZHJlc3MsCisgICAgICAgICAgICBzaW5rLT5jYW5jZWxsYWJsZSwgJmVycik7CisgICAgICAgIGlmICghcmVzdWx0cykgeworICAgICAgICAgIGdfb2JqZWN0X3VucmVmIChyZXNvbHZlcik7CisgICAgICAgICAgZ290byBuYW1lX3Jlc29sdmU7CisgICAgICAgIH0KKyAgICAgICAgYmluZF9pYWRkciA9IEdfSU5FVF9BRERSRVNTIChnX29iamVjdF9yZWYgKHJlc3VsdHMtPmRhdGEpKTsKKyAgICAgICAgZ19yZXNvbHZlcl9mcmVlX2FkZHJlc3NlcyAocmVzdWx0cyk7CisgICAgICAgIGdfb2JqZWN0X3VucmVmIChyZXNvbHZlcik7CisgICAgICB9CisKKyAgICAgIGJpbmRfYWRkciA9IGdfaW5ldF9zb2NrZXRfYWRkcmVzc19uZXcgKGJpbmRfaWFkZHIsIHNpbmstPmJpbmRfcG9ydCk7CisgICAgICBnX29iamVjdF91bnJlZiAoYmluZF9pYWRkcik7CisgICAgICBmYW1pbHkgPSBnX3NvY2tldF9hZGRyZXNzX2dldF9mYW1pbHkgKEdfU09DS0VUX0FERFJFU1MgKGJpbmRfYWRkcikpOworCisgICAgICBpZiAoKHNpbmstPnVzZWRfc29ja2V0ID0KKyAgICAgICAgICAgICAgZ19zb2NrZXRfbmV3IChmYW1pbHksIEdfU09DS0VUX1RZUEVfREFUQUdSQU0sCisgICAgICAgICAgICAgICAgICBHX1NPQ0tFVF9QUk9UT0NPTF9VRFAsICZlcnIpKSA9PSBOVUxMKSB7CisgICAgICAgIGdfb2JqZWN0X3VucmVmIChiaW5kX2FkZHIpOworICAgICAgICBnb3RvIG5vX3NvY2tldDsKKyAgICAgIH0KKworICAgICAgZ19zb2NrZXRfYmluZCAoc2luay0+dXNlZF9zb2NrZXQsIGJpbmRfYWRkciwgVFJVRSwgJmVycik7CisgICAgICBnX29iamVjdF91bnJlZiAoYmluZF9hZGRyKTsKKyAgICAgIGlmIChlcnIgIT0gTlVMTCkKKyAgICAgICAgZ290byBiaW5kX2Vycm9yOworICAgIH0gZWxzZSB7CisgICAgICAvKiBjcmVhdGUgc2VuZGVyIHNvY2tldHMgaWYgbm9uZSBhdmFpbGFibGUgKi8KKyAgICAgIGlmICgoc2luay0+dXNlZF9zb2NrZXQgPSBnX3NvY2tldF9uZXcgKEdfU09DS0VUX0ZBTUlMWV9JUFY0LAorICAgICAgICAgICAgICAgICAgR19TT0NLRVRfVFlQRV9EQVRBR1JBTSwgR19TT0NLRVRfUFJPVE9DT0xfVURQLCAmZXJyKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBub19zb2NrZXQ7CisKKyAgICAgIGJpbmRfaWFkZHIgPSBnX2luZXRfYWRkcmVzc19uZXdfYW55IChHX1NPQ0tFVF9GQU1JTFlfSVBWNCk7CisgICAgICBiaW5kX2FkZHIgPSBnX2luZXRfc29ja2V0X2FkZHJlc3NfbmV3IChiaW5kX2lhZGRyLCBzaW5rLT5iaW5kX3BvcnQpOworICAgICAgZ19zb2NrZXRfYmluZCAoc2luay0+dXNlZF9zb2NrZXQsIGJpbmRfYWRkciwgVFJVRSwgJmVycik7CisgICAgICBnX29iamVjdF91bnJlZiAoYmluZF9hZGRyKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChiaW5kX2lhZGRyKTsKKyAgICAgIGlmIChlcnIgIT0gTlVMTCkKKyAgICAgICAgZ290byBiaW5kX2Vycm9yOworCisgICAgICBpZiAoKHNpbmstPnVzZWRfc29ja2V0X3Y2ID0gZ19zb2NrZXRfbmV3IChHX1NPQ0tFVF9GQU1JTFlfSVBWNiwKKyAgICAgICAgICAgICAgICAgIEdfU09DS0VUX1RZUEVfREFUQUdSQU0sIEdfU09DS0VUX1BST1RPQ09MX1VEUCwKKyAgICAgICAgICAgICAgICAgICZlcnIpKSA9PSBOVUxMKSB7CisgICAgICAgIEdTVF9JTkZPX09CSkVDVCAoc2luaywgIkZhaWxlZCB0byBjcmVhdGUgSVB2NiBzb2NrZXQ6ICVzIiwKKyAgICAgICAgICAgIGVyci0+bWVzc2FnZSk7CisgICAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYmluZF9pYWRkciA9IGdfaW5ldF9hZGRyZXNzX25ld19hbnkgKEdfU09DS0VUX0ZBTUlMWV9JUFY2KTsKKyAgICAgICAgYmluZF9hZGRyID0gZ19pbmV0X3NvY2tldF9hZGRyZXNzX25ldyAoYmluZF9pYWRkciwgc2luay0+YmluZF9wb3J0KTsKKyAgICAgICAgZ19zb2NrZXRfYmluZCAoc2luay0+dXNlZF9zb2NrZXRfdjYsIGJpbmRfYWRkciwgVFJVRSwgJmVycik7CisgICAgICAgIGdfb2JqZWN0X3VucmVmIChiaW5kX2FkZHIpOworICAgICAgICBnX29iamVjdF91bnJlZiAoYmluZF9pYWRkcik7CisgICAgICAgIGlmIChlcnIgIT0gTlVMTCkKKyAgICAgICAgICBnb3RvIGJpbmRfZXJyb3I7CisgICAgICB9CisgICAgfQorICB9CisjaWZkZWYgU09fU05EQlVGCisgIHsKKyAgICBzb2NrbGVuX3QgbGVuOworICAgIGdpbnQgc25kc2l6ZSwgcmV0OworCisgICAgbGVuID0gc2l6ZW9mIChzbmRzaXplKTsKKyAgICBpZiAoc2luay0+YnVmZmVyX3NpemUgIT0gMCkgeworICAgICAgc25kc2l6ZSA9IHNpbmstPmJ1ZmZlcl9zaXplOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2V0dGluZyB1ZHAgYnVmZmVyIG9mICVkIGJ5dGVzIiwgc25kc2l6ZSk7CisgICAgICAvKiBzZXQgYnVmZmVyIHNpemUsIE5vdGUgdGhhdCBvbiBMaW51eCB0aGlzIGlzIHR5cGljYWxseSBsaW1pdGVkIHRvIGEKKyAgICAgICAqIG1heGltdW0gb2YgYXJvdW5kIDEwMEsuIEFsc28gYSBtaW5pbXVtIG9mIDEyOCBieXRlcyBpcyByZXF1aXJlZCBvbgorICAgICAgICogTGludXguICovCisKKyAgICAgIGlmIChzaW5rLT51c2VkX3NvY2tldCkgeworICAgICAgICByZXQgPQorICAgICAgICAgICAgc2V0c29ja29wdCAoZ19zb2NrZXRfZ2V0X2ZkIChzaW5rLT51c2VkX3NvY2tldCksIFNPTF9TT0NLRVQsCisgICAgICAgICAgICBTT19TTkRCVUYsICh2b2lkICopICZzbmRzaXplLCBsZW4pOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChzaW5rLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgICAgICAgKCJDb3VsZCBub3QgY3JlYXRlIGEgYnVmZmVyIG9mIHJlcXVlc3RlZCAlZCBieXRlcywgJWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgIHNuZHNpemUsIHJldCwgZ19zdHJlcnJvciAoZXJybm8pKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHNpbmstPnVzZWRfc29ja2V0X3Y2KSB7CisgICAgICAgIHJldCA9CisgICAgICAgICAgICBzZXRzb2Nrb3B0IChnX3NvY2tldF9nZXRfZmQgKHNpbmstPnVzZWRfc29ja2V0X3Y2KSwgU09MX1NPQ0tFVCwKKyAgICAgICAgICAgIFNPX1NOREJVRiwgKHZvaWQgKikgJnNuZHNpemUsIGxlbik7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNpbmssIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAgICAgICAoIkNvdWxkIG5vdCBjcmVhdGUgYSBidWZmZXIgb2YgcmVxdWVzdGVkICVkIGJ5dGVzLCAlZDogJXMiLAorICAgICAgICAgICAgICAgICAgc25kc2l6ZSwgcmV0LCBnX3N0cmVycm9yIChlcnJubykpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIHJlYWQgdGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlIGJ1ZmZlci4gTm90ZSB0aGF0IG9uIGxpbnV4IHRoaXMgcmV0dXJucyAyeCB0aGUKKyAgICAgKiB2YWx1ZSB3ZSBzZXQgYmVjYXVzZSB0aGUga2VybmVsIGFsbG9jYXRlcyBleHRyYSBtZW1vcnkgZm9yIG1ldGFkYXRhLgorICAgICAqIFRoZSBkZWZhdWx0IG9uIExpbnV4IGlzIGFib3V0IDEwMEsgKHdoaWNoIGlzIGFib3V0IDUwSyB3aXRob3V0IG1ldGFkYXRhKSAqLworICAgIGlmIChzaW5rLT51c2VkX3NvY2tldCkgeworICAgICAgcmV0ID0KKyAgICAgICAgICBnZXRzb2Nrb3B0IChnX3NvY2tldF9nZXRfZmQgKHNpbmstPnVzZWRfc29ja2V0KSwgU09MX1NPQ0tFVCwKKyAgICAgICAgICBTT19TTkRCVUYsICh2b2lkICopICZzbmRzaXplLCAmbGVuKTsKKyAgICAgIGlmIChyZXQgPT0gMCkKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgImhhdmUgVURQIGJ1ZmZlciBvZiAlZCBieXRlcyIsIHNuZHNpemUpOworICAgICAgZWxzZQorICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiY291bGQgbm90IGdldCBVRFAgYnVmZmVyIHNpemUiKTsKKyAgICB9CisKKyAgICBpZiAoc2luay0+dXNlZF9zb2NrZXRfdjYpIHsKKyAgICAgIHJldCA9CisgICAgICAgICAgZ2V0c29ja29wdCAoZ19zb2NrZXRfZ2V0X2ZkIChzaW5rLT51c2VkX3NvY2tldF92NiksIFNPTF9TT0NLRVQsCisgICAgICAgICAgU09fU05EQlVGLCAodm9pZCAqKSAmc25kc2l6ZSwgJmxlbik7CisgICAgICBpZiAocmV0ID09IDApCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJoYXZlIFVEUHY2IGJ1ZmZlciBvZiAlZCBieXRlcyIsIHNuZHNpemUpOworICAgICAgZWxzZQorICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiY291bGQgbm90IGdldCBVRFB2NiBidWZmZXIgc2l6ZSIpOworICAgIH0KKyAgfQorI2VuZGlmCisKKyNpZmRlZiBTT19CSU5EVE9ERVZJQ0UKKyAgaWYgKHNpbmstPm11bHRpX2lmYWNlKSB7CisgICAgaWYgKHNpbmstPnVzZWRfc29ja2V0KSB7CisgICAgICBpZiAoc2V0c29ja29wdCAoZ19zb2NrZXRfZ2V0X2ZkIChzaW5rLT51c2VkX3NvY2tldCksIFNPTF9TT0NLRVQsCisgICAgICAgICAgICAgIFNPX0JJTkRUT0RFVklDRSwgc2luay0+bXVsdGlfaWZhY2UsCisgICAgICAgICAgICAgIHN0cmxlbiAoc2luay0+bXVsdGlfaWZhY2UpKSA8IDApCisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc2luaywgInNldHNvY2tvcHQgU09fQklORFRPREVWSUNFIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgfQorICAgIGlmIChzaW5rLT51c2VkX3NvY2tldF92NikgeworICAgICAgaWYgKHNldHNvY2tvcHQgKGdfc29ja2V0X2dldF9mZCAoc2luay0+dXNlZF9zb2NrZXRfdjYpLCBTT0xfU09DS0VULAorICAgICAgICAgICAgICBTT19CSU5EVE9ERVZJQ0UsIHNpbmstPm11bHRpX2lmYWNlLAorICAgICAgICAgICAgICBzdHJsZW4gKHNpbmstPm11bHRpX2lmYWNlKSkgPCAwKQorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNpbmssICJzZXRzb2Nrb3B0IFNPX0JJTkRUT0RFVklDRSBmYWlsZWQgKHY2KTogJXMiLAorICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgfQorICB9CisjZW5kaWYKKworICBpZiAoc2luay0+dXNlZF9zb2NrZXQpCisgICAgZ19zb2NrZXRfc2V0X2Jyb2FkY2FzdCAoc2luay0+dXNlZF9zb2NrZXQsIFRSVUUpOworICBpZiAoc2luay0+dXNlZF9zb2NrZXRfdjYpCisgICAgZ19zb2NrZXRfc2V0X2Jyb2FkY2FzdCAoc2luay0+dXNlZF9zb2NrZXRfdjYsIFRSVUUpOworCisgIHNpbmstPmJ5dGVzX3RvX3NlcnZlID0gMDsKKyAgc2luay0+Ynl0ZXNfc2VydmVkID0gMDsKKworICBnc3RfbXVsdGl1ZHBzaW5rX3NldHVwX3Fvc19kc2NwIChzaW5rLCBzaW5rLT51c2VkX3NvY2tldCk7CisgIGdzdF9tdWx0aXVkcHNpbmtfc2V0dXBfcW9zX2RzY3AgKHNpbmssIHNpbmstPnVzZWRfc29ja2V0X3Y2KTsKKworICAvKiBsb29rIGZvciBtdWx0aWNhc3QgY2xpZW50cyBhbmQgam9pbiBtdWx0aWNhc3QgZ3JvdXBzIGFwcHJvcHJpYXRlbHkKKyAgICAgc2V0IGFsc28gdHRsIGFuZCBtdWx0aWNhc3QgbG9vcGJhY2sgZGVsaXZlcnkgYXBwcm9wcmlhdGVseSAgKi8KKyAgZm9yIChjbGllbnRzID0gc2luay0+Y2xpZW50czsgY2xpZW50czsgY2xpZW50cyA9IGdfbGlzdF9uZXh0IChjbGllbnRzKSkgeworICAgIGNsaWVudCA9IChHc3RVRFBDbGllbnQgKikgY2xpZW50cy0+ZGF0YTsKKworICAgIGlmICghZ3N0X211bHRpdWRwc2lua19jb25maWd1cmVfY2xpZW50IChzaW5rLCBjbGllbnQpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworbm9fc29ja2V0OgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNpbmssIFJFU09VUkNFLCBGQUlMRUQsIChOVUxMKSwKKyAgICAgICAgKCJDb3VsZCBub3QgY3JlYXRlIHNvY2tldDogJXMiLCBlcnItPm1lc3NhZ2UpKTsKKyAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2JpbmRfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2luaywgUkVTT1VSQ0UsIEZBSUxFRCwgKE5VTEwpLAorICAgICAgICAoIkZhaWxlZCB0byBiaW5kIHNvY2tldDogJXMiLCBlcnItPm1lc3NhZ2UpKTsKKyAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25hbWVfcmVzb2x2ZToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBSRVNPVVJDRSwgRkFJTEVELCAoTlVMTCksCisgICAgICAgICgiRmFpbGVkIHRvIHJlc29sdmUgYmluZCBhZGRyZXNzICVzOiAlcyIsIHNpbmstPmJpbmRfYWRkcmVzcywKKyAgICAgICAgICAgIGVyci0+bWVzc2FnZSkpOworICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWx0aXVkcHNpbmtfc3RvcCAoR3N0QmFzZVNpbmsgKiBic2luaykKK3sKKyAgR3N0TXVsdGlVRFBTaW5rICp1ZHBzaW5rOworCisgIHVkcHNpbmsgPSBHU1RfTVVMVElVRFBTSU5LIChic2luayk7CisKKyAgaWYgKHVkcHNpbmstPnVzZWRfc29ja2V0KSB7CisgICAgaWYgKHVkcHNpbmstPmNsb3NlX3NvY2tldCB8fCAhdWRwc2luay0+ZXh0ZXJuYWxfc29ja2V0KSB7CisgICAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgICAgIGlmICghZ19zb2NrZXRfY2xvc2UgKHVkcHNpbmstPnVzZWRfc29ja2V0LCAmZXJyKSkgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUICh1ZHBzaW5rLCAiRmFpbGVkIHRvIGNsb3NlIHNvY2tldDogJXMiLCBlcnItPm1lc3NhZ2UpOworICAgICAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnX29iamVjdF91bnJlZiAodWRwc2luay0+dXNlZF9zb2NrZXQpOworICAgIHVkcHNpbmstPnVzZWRfc29ja2V0ID0gTlVMTDsKKyAgfQorCisgIGlmICh1ZHBzaW5rLT51c2VkX3NvY2tldF92NikgeworICAgIGlmICh1ZHBzaW5rLT5jbG9zZV9zb2NrZXQgfHwgIXVkcHNpbmstPmV4dGVybmFsX3NvY2tldCkgeworICAgICAgR0Vycm9yICplcnIgPSBOVUxMOworCisgICAgICBpZiAoIWdfc29ja2V0X2Nsb3NlICh1ZHBzaW5rLT51c2VkX3NvY2tldF92NiwgJmVycikpIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAodWRwc2luaywgIkZhaWxlZCB0byBjbG9zZSBzb2NrZXQ6ICVzIiwgZXJyLT5tZXNzYWdlKTsKKyAgICAgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgICB9CisgICAgfQorCisgICAgZ19vYmplY3RfdW5yZWYgKHVkcHNpbmstPnVzZWRfc29ja2V0X3Y2KTsKKyAgICB1ZHBzaW5rLT51c2VkX3NvY2tldF92NiA9IE5VTEw7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdpbnQKK2dzdF91ZHBfY2xpZW50X2NvbXBhcmVfc29ja2V0X2ZhbWlseSAoR3N0VURQQ2xpZW50ICogYSwgR3N0VURQQ2xpZW50ICogYikKK3sKKyAgR1NvY2tldEZhbWlseSBmYSA9IGdfc29ja2V0X2FkZHJlc3NfZ2V0X2ZhbWlseSAoYS0+YWRkcik7CisgIEdTb2NrZXRGYW1pbHkgZmIgPSBnX3NvY2tldF9hZGRyZXNzX2dldF9mYW1pbHkgKGItPmFkZHIpOworCisgIGlmIChmYSA9PSBmYikKKyAgICByZXR1cm4gMDsKKworICAvKiBhIHNob3VsZCBnbyBiZWZvcmUgYiAqLworICBpZiAoZmEgPT0gR19TT0NLRVRfRkFNSUxZX0lQVjQgJiYgZmIgPT0gR19TT0NLRVRfRkFNSUxZX0lQVjYpCisgICAgcmV0dXJuIC0xOworCisgIC8qIGIgc2hvdWxkIGdvIGJlZm9yZSBhICovCisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorZ3N0X211bHRpdWRwc2lua19hZGRfaW50ZXJuYWwgKEdzdE11bHRpVURQU2luayAqIHNpbmssIGNvbnN0IGdjaGFyICogaG9zdCwKKyAgICBnaW50IHBvcnQsIGdib29sZWFuIGxvY2spCit7CisgIEdTb2NrZXRGYW1pbHkgZmFtaWx5OworICBHc3RVRFBDbGllbnQgKmNsaWVudDsKKyAgR3N0VURQQ2xpZW50IHVkcGNsaWVudDsKKyAgR1RpbWVWYWwgbm93OworICBHTGlzdCAqZmluZDsKKworICB1ZHBjbGllbnQuaG9zdCA9IChnY2hhciAqKSBob3N0OworICB1ZHBjbGllbnQucG9ydCA9IHBvcnQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgImFkZGluZyBjbGllbnQgb24gaG9zdCAlcywgcG9ydCAlZCIsIGhvc3QsIHBvcnQpOworCisgIGlmIChsb2NrKQorICAgIGdfbXV0ZXhfbG9jayAoJnNpbmstPmNsaWVudF9sb2NrKTsKKworICBmaW5kID0gZ19saXN0X2ZpbmRfY3VzdG9tIChzaW5rLT5jbGllbnRzLCAmdWRwY2xpZW50LAorICAgICAgKEdDb21wYXJlRnVuYykgY2xpZW50X2NvbXBhcmUpOworCisgIGlmICghZmluZCkgeworICAgIGZpbmQgPSBnX2xpc3RfZmluZF9jdXN0b20gKHNpbmstPmNsaWVudHNfdG9fYmVfcmVtb3ZlZCwgJnVkcGNsaWVudCwKKyAgICAgICAgKEdDb21wYXJlRnVuYykgY2xpZW50X2NvbXBhcmUpOworICAgIGlmIChmaW5kKQorICAgICAgZ3N0X3VkcF9jbGllbnRfcmVmIChmaW5kLT5kYXRhKTsKKyAgfQorCisgIGlmIChmaW5kKSB7CisgICAgY2xpZW50ID0gKEdzdFVEUENsaWVudCAqKSBmaW5kLT5kYXRhOworCisgICAgZmFtaWx5ID0gZ19zb2NrZXRfYWRkcmVzc19nZXRfZmFtaWx5IChjbGllbnQtPmFkZHIpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgImZvdW5kICVkIGV4aXN0aW5nIGNsaWVudHMgd2l0aCBob3N0ICVzLCBwb3J0ICVkIiwKKyAgICAgICAgY2xpZW50LT5hZGRfY291bnQsIGhvc3QsIHBvcnQpOworICB9IGVsc2UgeworICAgIGNsaWVudCA9IGdzdF91ZHBfY2xpZW50X25ldyAoc2luaywgaG9zdCwgcG9ydCk7CisgICAgaWYgKCFjbGllbnQpCisgICAgICBnb3RvIGVycm9yOworCisgICAgZmFtaWx5ID0gZ19zb2NrZXRfYWRkcmVzc19nZXRfZmFtaWx5IChjbGllbnQtPmFkZHIpOworCisgICAgZ19nZXRfY3VycmVudF90aW1lICgmbm93KTsKKyAgICBjbGllbnQtPmNvbm5lY3RfdGltZSA9IEdTVF9USU1FVkFMX1RPX1RJTUUgKG5vdyk7CisKKyAgICBpZiAoc2luay0+dXNlZF9zb2NrZXQpCisgICAgICBnc3RfbXVsdGl1ZHBzaW5rX2NvbmZpZ3VyZV9jbGllbnQgKHNpbmssIGNsaWVudCk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiYWRkIGNsaWVudCB3aXRoIGhvc3QgJXMsIHBvcnQgJWQiLCBob3N0LCBwb3J0KTsKKworICAgIC8qIGtlZXAgSVB2NCBjbGllbnRzIGF0IHRoZSBiZWdpbm5pbmcsIGFuZCBJUHY2IGF0IHRoZSBlbmQsIHdlIGNhbiBtYWtlCisgICAgICogdXNlIG9mIHRoaXMgaW4gZ3N0X211bHRpdWRwc2lua19yZW5kZXJfYnVmZmVycygpICovCisgICAgc2luay0+Y2xpZW50cyA9IGdfbGlzdF9pbnNlcnRfc29ydGVkIChzaW5rLT5jbGllbnRzLCBjbGllbnQsCisgICAgICAgIChHQ29tcGFyZUZ1bmMpIGdzdF91ZHBfY2xpZW50X2NvbXBhcmVfc29ja2V0X2ZhbWlseSk7CisKKyAgICBpZiAoZmFtaWx5ID09IEdfU09DS0VUX0ZBTUlMWV9JUFY0KQorICAgICAgKytzaW5rLT5udW1fdjRfdW5pcXVlOworICAgIGVsc2UKKyAgICAgICsrc2luay0+bnVtX3Y2X3VuaXF1ZTsKKyAgfQorCisgICsrY2xpZW50LT5hZGRfY291bnQ7CisKKyAgaWYgKGZhbWlseSA9PSBHX1NPQ0tFVF9GQU1JTFlfSVBWNCkKKyAgICArK3NpbmstPm51bV92NF9hbGw7CisgIGVsc2UKKyAgICArK3NpbmstPm51bV92Nl9hbGw7CisKKyAgaWYgKGxvY2spCisgICAgZ19tdXRleF91bmxvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisKKyAgZ19zaWduYWxfZW1pdCAoR19PQkpFQ1QgKHNpbmspLAorICAgICAgZ3N0X211bHRpdWRwc2lua19zaWduYWxzW1NJR05BTF9DTElFTlRfQURERURdLCAwLCBob3N0LCBwb3J0KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiYWRkZWQgY2xpZW50IG9uIGhvc3QgJXMsIHBvcnQgJWQiLCBob3N0LCBwb3J0KTsKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworZXJyb3I6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiZGlkIG5vdCBhZGQgY2xpZW50IG9uIGhvc3QgJXMsIHBvcnQgJWQiLCBob3N0LAorICAgICAgICBwb3J0KTsKKyAgICBpZiAobG9jaykKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2luay0+Y2xpZW50X2xvY2spOworICAgIHJldHVybjsKKyAgfQorfQorCit2b2lkCitnc3RfbXVsdGl1ZHBzaW5rX2FkZCAoR3N0TXVsdGlVRFBTaW5rICogc2luaywgY29uc3QgZ2NoYXIgKiBob3N0LCBnaW50IHBvcnQpCit7CisgIGdzdF9tdWx0aXVkcHNpbmtfYWRkX2ludGVybmFsIChzaW5rLCBob3N0LCBwb3J0LCBUUlVFKTsKK30KKwordm9pZAorZ3N0X211bHRpdWRwc2lua19yZW1vdmUgKEdzdE11bHRpVURQU2luayAqIHNpbmssIGNvbnN0IGdjaGFyICogaG9zdCwgZ2ludCBwb3J0KQoreworICBHU29ja2V0RmFtaWx5IGZhbWlseTsKKyAgR0xpc3QgKmZpbmQ7CisgIEdzdFVEUENsaWVudCB1ZHBjbGllbnQ7CisgIEdzdFVEUENsaWVudCAqY2xpZW50OworICBHVGltZVZhbCBub3c7CisKKyAgdWRwY2xpZW50Lmhvc3QgPSAoZ2NoYXIgKikgaG9zdDsKKyAgdWRwY2xpZW50LnBvcnQgPSBwb3J0OworCisgIGdfbXV0ZXhfbG9jayAoJnNpbmstPmNsaWVudF9sb2NrKTsKKyAgZmluZCA9IGdfbGlzdF9maW5kX2N1c3RvbSAoc2luay0+Y2xpZW50cywgJnVkcGNsaWVudCwKKyAgICAgIChHQ29tcGFyZUZ1bmMpIGNsaWVudF9jb21wYXJlKTsKKyAgaWYgKCFmaW5kKQorICAgIGdvdG8gbm90X2ZvdW5kOworCisgIGNsaWVudCA9IChHc3RVRFBDbGllbnQgKikgZmluZC0+ZGF0YTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiZm91bmQgJWQgY2xpZW50cyB3aXRoIGhvc3QgJXMsIHBvcnQgJWQiLAorICAgICAgY2xpZW50LT5hZGRfY291bnQsIGhvc3QsIHBvcnQpOworCisgIC0tY2xpZW50LT5hZGRfY291bnQ7CisKKyAgZmFtaWx5ID0gZ19zb2NrZXRfYWRkcmVzc19nZXRfZmFtaWx5IChjbGllbnQtPmFkZHIpOworICBpZiAoZmFtaWx5ID09IEdfU09DS0VUX0ZBTUlMWV9JUFY0KQorICAgIC0tc2luay0+bnVtX3Y0X2FsbDsKKyAgZWxzZQorICAgIC0tc2luay0+bnVtX3Y2X2FsbDsKKworICBpZiAoY2xpZW50LT5hZGRfY291bnQgPT0gMCkgeworICAgIEdJbmV0U29ja2V0QWRkcmVzcyAqc2FkZHIgPSBHX0lORVRfU09DS0VUX0FERFJFU1MgKGNsaWVudC0+YWRkcik7CisgICAgR0luZXRBZGRyZXNzICphZGRyID0gZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9hZGRyZXNzIChzYWRkcik7CisgICAgR1NvY2tldCAqc29ja2V0OworCisgICAgLyogU2VsZWN0IHNvY2tldCB0byBzZW5kIGZyb20gZm9yIHRoaXMgYWRkcmVzcyAqLworICAgIGlmIChmYW1pbHkgPT0gR19TT0NLRVRfRkFNSUxZX0lQVjYgfHwgIXNpbmstPnVzZWRfc29ja2V0KQorICAgICAgc29ja2V0ID0gc2luay0+dXNlZF9zb2NrZXRfdjY7CisgICAgZWxzZQorICAgICAgc29ja2V0ID0gc2luay0+dXNlZF9zb2NrZXQ7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAicmVtb3ZlIGNsaWVudCB3aXRoIGhvc3QgJXMsIHBvcnQgJWQiLCBob3N0LCBwb3J0KTsKKworICAgIGdfZ2V0X2N1cnJlbnRfdGltZSAoJm5vdyk7CisgICAgY2xpZW50LT5kaXNjb25uZWN0X3RpbWUgPSBHU1RfVElNRVZBTF9UT19USU1FIChub3cpOworCisgICAgaWYgKHNvY2tldCAmJiBzaW5rLT5hdXRvX211bHRpY2FzdAorICAgICAgICAmJiBnX2luZXRfYWRkcmVzc19nZXRfaXNfbXVsdGljYXN0IChhZGRyKSkgeworICAgICAgR0Vycm9yICplcnIgPSBOVUxMOworCisgICAgICBpZiAoIWdfc29ja2V0X2xlYXZlX211bHRpY2FzdF9ncm91cCAoc29ja2V0LCBhZGRyLCBGQUxTRSwKKyAgICAgICAgICAgICAgc2luay0+bXVsdGlfaWZhY2UsICZlcnIpKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJGYWlsZWQgdG8gbGVhdmUgbXVsdGljYXN0IGdyb3VwOiAlcyIsCisgICAgICAgICAgICBlcnItPm1lc3NhZ2UpOworICAgICAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmFtaWx5ID09IEdfU09DS0VUX0ZBTUlMWV9JUFY0KQorICAgICAgLS1zaW5rLT5udW1fdjRfdW5pcXVlOworICAgIGVsc2UKKyAgICAgIC0tc2luay0+bnVtX3Y2X3VuaXF1ZTsKKworICAgIC8qIEtlZXAgc3RhdGUgY29uc2lzdGVudCBmb3Igc3RyZWFtaW5nIHRocmVhZCwgc28gcmVtb3ZlIGZyb20gY2xpZW50IGxpc3QsCisgICAgICogYnV0IGtlZXAgaXQgYXJvdW5kIHVudGlsIGFmdGVyIHRoZSBzaWduYWwgaGFzIGJlZW4gZW1pdHRlZCwgaW4gY2FzZSBhCisgICAgICogY2FsbGJhY2sgd2FudHMgdG8gZ2V0IHN0YXRzIGZvciB0aGF0IGNsaWVudCBvciBzbyAqLworICAgIHNpbmstPmNsaWVudHMgPSBnX2xpc3RfZGVsZXRlX2xpbmsgKHNpbmstPmNsaWVudHMsIGZpbmQpOworCisgICAgc2luay0+Y2xpZW50c190b19iZV9yZW1vdmVkID0KKyAgICAgICAgZ19saXN0X3ByZXBlbmQgKHNpbmstPmNsaWVudHNfdG9fYmVfcmVtb3ZlZCwgY2xpZW50KTsKKworICAgIC8qIFVubG9jayB0byBlbWl0IHNpZ25hbCBiZWZvcmUgd2UgZGVsZXRlIHRoZSBhY3R1YWwgY2xpZW50ICovCisgICAgZ19tdXRleF91bmxvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisgICAgZ19zaWduYWxfZW1pdCAoR19PQkpFQ1QgKHNpbmspLAorICAgICAgICBnc3RfbXVsdGl1ZHBzaW5rX3NpZ25hbHNbU0lHTkFMX0NMSUVOVF9SRU1PVkVEXSwgMCwgaG9zdCwgcG9ydCk7CisgICAgZ19tdXRleF9sb2NrICgmc2luay0+Y2xpZW50X2xvY2spOworCisgICAgc2luay0+Y2xpZW50c190b19iZV9yZW1vdmVkID0KKyAgICAgICAgZ19saXN0X3JlbW92ZSAoc2luay0+Y2xpZW50c190b19iZV9yZW1vdmVkLCBjbGllbnQpOworCisgICAgZ3N0X3VkcF9jbGllbnRfdW5yZWYgKGNsaWVudCk7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworbm90X2ZvdW5kOgorICB7CisgICAgZ19tdXRleF91bmxvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzaW5rLCAiY2xpZW50IGF0IGhvc3QgJXMsIHBvcnQgJWQgbm90IGZvdW5kIiwKKyAgICAgICAgaG9zdCwgcG9ydCk7CisgICAgcmV0dXJuOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGl1ZHBzaW5rX2NsZWFyX2ludGVybmFsIChHc3RNdWx0aVVEUFNpbmsgKiBzaW5rLCBnYm9vbGVhbiBsb2NrKQoreworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiY2xlYXJpbmciKTsKKyAgLyogd2Ugb25seSBuZWVkIHRvIHJlbW92ZSB0aGUgY2xpZW50IHN0cnVjdHVyZSwgdGhlcmUgaXMgbm8gYWRkaXRpb25hbAorICAgKiBzb2NrZXQgb3IgYW55dGhpbmcgdG8gZnJlZSBmb3IgVURQICovCisgIGlmIChsb2NrKQorICAgIGdfbXV0ZXhfbG9jayAoJnNpbmstPmNsaWVudF9sb2NrKTsKKyAgZ19saXN0X2ZvcmVhY2ggKHNpbmstPmNsaWVudHMsIChHRnVuYykgZ3N0X3VkcF9jbGllbnRfdW5yZWYsIHNpbmspOworICBnX2xpc3RfZnJlZSAoc2luay0+Y2xpZW50cyk7CisgIHNpbmstPmNsaWVudHMgPSBOVUxMOworICBzaW5rLT5udW1fdjRfdW5pcXVlID0gMDsKKyAgc2luay0+bnVtX3Y0X2FsbCA9IDA7CisgIHNpbmstPm51bV92Nl91bmlxdWUgPSAwOworICBzaW5rLT5udW1fdjZfYWxsID0gMDsKKyAgaWYgKGxvY2spCisgICAgZ19tdXRleF91bmxvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7Cit9CisKK3ZvaWQKK2dzdF9tdWx0aXVkcHNpbmtfY2xlYXIgKEdzdE11bHRpVURQU2luayAqIHNpbmspCit7CisgIGdzdF9tdWx0aXVkcHNpbmtfY2xlYXJfaW50ZXJuYWwgKHNpbmssIFRSVUUpOworfQorCitHc3RTdHJ1Y3R1cmUgKgorZ3N0X211bHRpdWRwc2lua19nZXRfc3RhdHMgKEdzdE11bHRpVURQU2luayAqIHNpbmssIGNvbnN0IGdjaGFyICogaG9zdCwKKyAgICBnaW50IHBvcnQpCit7CisgIEdzdFVEUENsaWVudCAqY2xpZW50OworICBHc3RTdHJ1Y3R1cmUgKnJlc3VsdCA9IE5VTEw7CisgIEdzdFVEUENsaWVudCB1ZHBjbGllbnQ7CisgIEdMaXN0ICpmaW5kOworCisgIHVkcGNsaWVudC5ob3N0ID0gKGdjaGFyICopIGhvc3Q7CisgIHVkcGNsaWVudC5wb3J0ID0gcG9ydDsKKworICBnX211dGV4X2xvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisKKyAgZmluZCA9IGdfbGlzdF9maW5kX2N1c3RvbSAoc2luay0+Y2xpZW50cywgJnVkcGNsaWVudCwKKyAgICAgIChHQ29tcGFyZUZ1bmMpIGNsaWVudF9jb21wYXJlKTsKKworICBpZiAoIWZpbmQpCisgICAgZmluZCA9IGdfbGlzdF9maW5kX2N1c3RvbSAoc2luay0+Y2xpZW50c190b19iZV9yZW1vdmVkLCAmdWRwY2xpZW50LAorICAgICAgICAoR0NvbXBhcmVGdW5jKSBjbGllbnRfY29tcGFyZSk7CisKKyAgaWYgKCFmaW5kKQorICAgIGdvdG8gbm90X2ZvdW5kOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJzdGF0cyBmb3IgY2xpZW50IHdpdGggaG9zdCAlcywgcG9ydCAlZCIsIGhvc3QsIHBvcnQpOworCisgIGNsaWVudCA9IChHc3RVRFBDbGllbnQgKikgZmluZC0+ZGF0YTsKKworICByZXN1bHQgPSBnc3Rfc3RydWN0dXJlX25ld19lbXB0eSAoIm11bHRpdWRwc2luay1zdGF0cyIpOworCisgIGdzdF9zdHJ1Y3R1cmVfc2V0IChyZXN1bHQsCisgICAgICAiYnl0ZXMtc2VudCIsIEdfVFlQRV9VSU5UNjQsIGNsaWVudC0+Ynl0ZXNfc2VudCwKKyAgICAgICJwYWNrZXRzLXNlbnQiLCBHX1RZUEVfVUlOVDY0LCBjbGllbnQtPnBhY2tldHNfc2VudCwKKyAgICAgICJjb25uZWN0LXRpbWUiLCBHX1RZUEVfVUlOVDY0LCBjbGllbnQtPmNvbm5lY3RfdGltZSwKKyAgICAgICJkaXNjb25uZWN0LXRpbWUiLCBHX1RZUEVfVUlOVDY0LCBjbGllbnQtPmRpc2Nvbm5lY3RfdGltZSwgTlVMTCk7CisKKyAgZ19tdXRleF91bmxvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisKKyAgcmV0dXJuIHJlc3VsdDsKKworICAvKiBFUlJPUlMgKi8KK25vdF9mb3VuZDoKKyAgeworICAgIGdfbXV0ZXhfdW5sb2NrICgmc2luay0+Y2xpZW50X2xvY2spOworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc2luaywgImNsaWVudCB3aXRoIGhvc3QgJXMsIHBvcnQgJWQgbm90IGZvdW5kIiwKKyAgICAgICAgaG9zdCwgcG9ydCk7CisgICAgLyogQXBwYXJlbnRseSAoc2VlIGNvbW1lbnQgaW4gZ3N0bXVsdGlmZHNpbmsuYykgcmV0dXJuaW5nIE5VTEwgZnJvbSBoZXJlIG1heQorICAgICAqIGNvbmZ1c2UvYnJlYWsgcHl0aG9uIGJpbmRpbmdzICovCisgICAgcmV0dXJuIGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5ICgibXVsdGl1ZHBzaW5rLXN0YXRzIik7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbXVsdGl1ZHBzaW5rX3VubG9jayAoR3N0QmFzZVNpbmsgKiBic2luaykKK3sKKyAgR3N0TXVsdGlVRFBTaW5rICpzaW5rOworCisgIHNpbmsgPSBHU1RfTVVMVElVRFBTSU5LIChic2luayk7CisKKyAgZ19jYW5jZWxsYWJsZV9jYW5jZWwgKHNpbmstPmNhbmNlbGxhYmxlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbXVsdGl1ZHBzaW5rX3VubG9ja19zdG9wIChHc3RCYXNlU2luayAqIGJzaW5rKQoreworICBHc3RNdWx0aVVEUFNpbmsgKnNpbms7CisKKyAgc2luayA9IEdTVF9NVUxUSVVEUFNJTksgKGJzaW5rKTsKKworICBnc3RfbXVsdGl1ZHBzaW5rX2ZyZWVfY2FuY2VsbGFibGUgKHNpbmspOworICBnc3RfbXVsdGl1ZHBzaW5rX2NyZWF0ZV9jYW5jZWxsYWJsZSAoc2luayk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvdWRwL2dzdG11bHRpdWRwc2luay5oIGIvZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODQ5ZjM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaApAQCAtMCwwICsxLDE1MCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfTVVMVElVRFBTSU5LX0hfXworI2RlZmluZSBfX0dTVF9NVUxUSVVEUFNJTktfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXNpbmsuaD4KKyNpbmNsdWRlIDxnaW8vZ2lvLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2luY2x1ZGUgImdzdHVkcG5ldHV0aWxzLmgiCisKKyNkZWZpbmUgR1NUX1RZUEVfTVVMVElVRFBTSU5LICAgICAgICAgICAgKGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX01VTFRJVURQU0lOSyhvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX01VTFRJVURQU0lOSyxHc3RNdWx0aVVEUFNpbmspKQorI2RlZmluZSBHU1RfTVVMVElVRFBTSU5LX0NMQVNTKGtsYXNzKSAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9NVUxUSVVEUFNJTkssR3N0TXVsdGlVRFBTaW5rQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfTVVMVElVRFBTSU5LKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfTVVMVElVRFBTSU5LKSkKKyNkZWZpbmUgR1NUX0lTX01VTFRJVURQU0lOS19DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfTVVMVElVRFBTSU5LKSkKKyNkZWZpbmUgR1NUX01VTFRJVURQU0lOS19DQVNUKG9iaikgICAgICAgKChHc3RNdWx0aVVEUFNpbmsqKShvYmopKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0TXVsdGlVRFBTaW5rIEdzdE11bHRpVURQU2luazsKK3R5cGVkZWYgc3RydWN0IF9Hc3RNdWx0aVVEUFNpbmtDbGFzcyBHc3RNdWx0aVVEUFNpbmtDbGFzczsKKworI2lmIEdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgNDMsIDIpCisjZGVmaW5lIEhBVkVfR19TT0NLRVRfU0VORF9NRVNTQUdFUworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9HX1NPQ0tFVF9TRU5EX01FU1NBR0VTCisvKiBzYW1lIGFzIEdPdXRwdXRNZXNzYWdlIHVzZWQgZm9yIGdfc29ja2V0X3NlbmRfbWVzc2FnZXMoKSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgR1NvY2tldEFkZHJlc3MgICAgICAgICAqYWRkcmVzczsKKworICBHT3V0cHV0VmVjdG9yICAgICAgICAgICp2ZWN0b3JzOworICBndWludCAgICAgICAgICAgICAgICAgICBudW1fdmVjdG9yczsKKworICBndWludCAgICAgICAgICAgICAgICAgICBieXRlc19zZW50OworCisgIEdTb2NrZXRDb250cm9sTWVzc2FnZSAqKmNvbnRyb2xfbWVzc2FnZXM7CisgIGd1aW50ICAgICAgICAgICAgICAgICAgIG51bV9jb250cm9sX21lc3NhZ2VzOworfSBHc3RPdXRwdXRNZXNzYWdlOworI2Vsc2UKK3R5cGVkZWYgR091dHB1dE1lc3NhZ2UgR3N0T3V0cHV0TWVzc2FnZTsKKyNlbmRpZiAvKiBIQVZFX0dfU09DS0VUX1NFTkRfTUVTU0FHRVMqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIGdpbnQgcmVmX2NvdW50OyAgICAgICAgIC8qIGZvciBtZW1vcnkgbWFuYWdlbWVudCAqLworICBnaW50IGFkZF9jb3VudDsgICAgICAgICAvKiBob3cgb2Z0ZW4gdGhpcyBhZGRyZXNzIGhhcyBiZWVuIGFkZGVkICovCisKKyAgR1NvY2tldEFkZHJlc3MgKmFkZHI7CisgIGdjaGFyICpob3N0OworICBnaW50IHBvcnQ7CisKKyAgLyogUGVyLWNsaWVudCBzdGF0cyAqLworICBndWludDY0IGJ5dGVzX3NlbnQ7CisgIGd1aW50NjQgcGFja2V0c19zZW50OworICBndWludDY0IGNvbm5lY3RfdGltZTsKKyAgZ3VpbnQ2NCBkaXNjb25uZWN0X3RpbWU7Cit9IEdzdFVEUENsaWVudDsKKworLyogc2VuZHMgdWRwIHBhY2tldHMgdG8gbXVsdGlwbGUgaG9zdC9wb3J0IHBhaXJzLgorICovCitzdHJ1Y3QgX0dzdE11bHRpVURQU2luayB7CisgIEdzdEJhc2VTaW5rIHBhcmVudDsKKworICBHU29ja2V0ICAgICAgICp1c2VkX3NvY2tldCwgKnVzZWRfc29ja2V0X3Y2OworCisgIEdDYW5jZWxsYWJsZSAgKmNhbmNlbGxhYmxlOworICBnYm9vbGVhbiAgICAgICBtYWRlX2NhbmNlbF9mZDsKKworICAvKiBjbGllbnQgbWFuYWdlbWVudCAqLworICBHTXV0ZXggICAgICAgICBjbGllbnRfbG9jazsKKyAgR0xpc3QgICAgICAgICAqY2xpZW50czsKKyAgZ3VpbnQgICAgICAgICAgbnVtX3Y0X3VuaXF1ZTsgIC8qIG51bWJlciBJUHY0IGNsaWVudHMgKGV4Y2x1ZGluZyBkdXBsaWNhdGVzKSAqLworICBndWludCAgICAgICAgICBudW1fdjRfYWxsOyAgICAgLyogbnVtYmVyIElQdjQgY2xpZW50cyAoaW5jbHVkaW5nIGR1cGxpY2F0ZXMpICovCisgIGd1aW50ICAgICAgICAgIG51bV92Nl91bmlxdWU7ICAvKiBudW1iZXIgSVB2NiBjbGllbnRzIChleGNsdWRpbmcgZHVwbGljYXRlcykgKi8KKyAgZ3VpbnQgICAgICAgICAgbnVtX3Y2X2FsbDsgICAgIC8qIG51bWJlciBJUHY2IGNsaWVudHMgKGluY2x1ZGluZyBkdXBsaWNhdGVzKSAqLworICBHTGlzdCAgICAgICAgICpjbGllbnRzX3RvX2JlX3JlbW92ZWQ7CisKKyAgLyogcHJlLWFsbG9jYXRlZCBzY3JhcCBzcGFjZSBmb3IgcmVuZGVyIGZ1bmN0aW9uICovCisgIEdPdXRwdXRWZWN0b3IgICAgKnZlY3M7CisgIGd1aW50ICAgICAgICAgICAgIG5fdmVjczsKKyAgR3N0TWFwSW5mbyAgICAgICAqbWFwczsKKyAgZ3VpbnQgICAgICAgICAgICAgbl9tYXBzOworICBHc3RPdXRwdXRNZXNzYWdlICptZXNzYWdlczsKKyAgZ3VpbnQgICAgICAgICAgICAgbl9tZXNzYWdlczsKKworICAvKiBwcm9wZXJ0aWVzICovCisgIGd1aW50NjQgICAgICAgIGJ5dGVzX3RvX3NlcnZlOworICBndWludDY0ICAgICAgICBieXRlc19zZXJ2ZWQ7CisgIEdTb2NrZXQgICAgICAgKnNvY2tldCwgKnNvY2tldF92NjsKKyAgZ2Jvb2xlYW4gICAgICAgY2xvc2Vfc29ja2V0OworCisgIGdib29sZWFuICAgICAgIGV4dGVybmFsX3NvY2tldDsKKworICBnYm9vbGVhbiAgICAgICBhdXRvX211bHRpY2FzdDsKKyAgZ2NoYXIgICAgICAgICAqbXVsdGlfaWZhY2U7CisgIGdpbnQgICAgICAgICAgIHR0bDsKKyAgZ2ludCAgICAgICAgICAgdHRsX21jOworICBnYm9vbGVhbiAgICAgICBsb29wOworICBnYm9vbGVhbiAgICAgICBmb3JjZV9pcHY0OworICBnaW50ICAgICAgICAgICBxb3NfZHNjcDsKKworICBnYm9vbGVhbiAgICAgICBzZW5kX2R1cGxpY2F0ZXM7CisgIGdpbnQgICAgICAgICAgIGJ1ZmZlcl9zaXplOworICBnY2hhciAgICAgICAgICpiaW5kX2FkZHJlc3M7CisgIGdpbnQgICAgICAgICAgIGJpbmRfcG9ydDsKK307CisKK3N0cnVjdCBfR3N0TXVsdGlVRFBTaW5rQ2xhc3MgeworICBHc3RCYXNlU2lua0NsYXNzIHBhcmVudF9jbGFzczsKKworICAvKiBlbGVtZW50IG1ldGhvZHMgKi8KKyAgdm9pZCAgICAgICAgICAoKmFkZCkgICAgICAgICAgKEdzdE11bHRpVURQU2luayAqc2luaywgY29uc3QgZ2NoYXIgKmhvc3QsIGdpbnQgcG9ydCk7CisgIHZvaWQgICAgICAgICAgKCpyZW1vdmUpICAgICAgIChHc3RNdWx0aVVEUFNpbmsgKnNpbmssIGNvbnN0IGdjaGFyICpob3N0LCBnaW50IHBvcnQpOworICB2b2lkICAgICAgICAgICgqY2xlYXIpICAgICAgICAoR3N0TXVsdGlVRFBTaW5rICpzaW5rKTsKKyAgR3N0U3RydWN0dXJlKiAoKmdldF9zdGF0cykgICAgKEdzdE11bHRpVURQU2luayAqc2luaywgY29uc3QgZ2NoYXIgKmhvc3QsIGdpbnQgcG9ydCk7CisKKyAgLyogc2lnbmFscyAqLworICB2b2lkICAgICAgICAgICgqY2xpZW50X2FkZGVkKSAoR3N0RWxlbWVudCAqZWxlbWVudCwgY29uc3QgZ2NoYXIgKmhvc3QsIGdpbnQgcG9ydCk7CisgIHZvaWQgICAgICAgICAgKCpjbGllbnRfcmVtb3ZlZCkgKEdzdEVsZW1lbnQgKmVsZW1lbnQsIGNvbnN0IGdjaGFyICpob3N0LCBnaW50IHBvcnQpOworfTsKKworR1R5cGUgZ3N0X211bHRpdWRwc2lua19nZXRfdHlwZSh2b2lkKTsKKwordm9pZCAgICAgICAgICAgIGdzdF9tdWx0aXVkcHNpbmtfYWRkICAgICAgICAgICAgKEdzdE11bHRpVURQU2luayAqc2luaywgY29uc3QgZ2NoYXIgKmhvc3QsIGdpbnQgcG9ydCk7Cit2b2lkICAgICAgICAgICAgZ3N0X211bHRpdWRwc2lua19yZW1vdmUgICAgICAgICAoR3N0TXVsdGlVRFBTaW5rICpzaW5rLCBjb25zdCBnY2hhciAqaG9zdCwgZ2ludCBwb3J0KTsKK3ZvaWQgICAgICAgICAgICBnc3RfbXVsdGl1ZHBzaW5rX2NsZWFyICAgICAgICAgIChHc3RNdWx0aVVEUFNpbmsgKnNpbmspOworR3N0U3RydWN0dXJlKiAgIGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3N0YXRzICAgICAgKEdzdE11bHRpVURQU2luayAqc2luaywgY29uc3QgZ2NoYXIgKmhvc3QsIGdpbnQgcG9ydCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9NVUxUSVVEUFNJTktfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvdWRwL2dzdHVkcC5jIGIvZ3N0L3VkcC9nc3R1ZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjAyMTEyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3VkcC9nc3R1ZHAuYwpAQCAtMCwwICsxLDY3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L25ldC9nc3RuZXRhZGRyZXNzbWV0YS5oPgorCisjaW5jbHVkZSAiZ3N0dWRwc3JjLmgiCisjaW5jbHVkZSAiZ3N0bXVsdGl1ZHBzaW5rLmgiCisjaW5jbHVkZSAiZ3N0dWRwc2luay5oIgorI2luY2x1ZGUgImdzdGR5bnVkcHNpbmsuaCIKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICAvKiBub3QgdXNpbmcgR0xJQl9DSEVDS19WRVJTSU9OIG9uIHB1cnBvc2UsIHJ1bi10aW1lIHZlcnNpb24gbWF0dGVycyAqLworICBpZiAoZ2xpYl9jaGVja192ZXJzaW9uICgyLCAzNiwgMCkgIT0gTlVMTCkgeworICAgIEdTVF9XQVJOSU5HICgiWW91ciBHTGliIHZlcnNpb24gaXMgPCAyLjM2LCBVRFAgbXVsdGljYXN0aW5nIHN1cHBvcnQgbWF5ICIKKyAgICAgICAgImJlIGJyb2tlbiwgc2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODgzNzgiKTsKKyAgfQorCisgIC8qIHJlZ2lzdGVyIGluZm8gb2YgdGhlIG5ldGFkZHJlc3MgbWV0YWRhdGEgc28gdGhhdCB3ZSBjYW4gdXNlIGl0IGZyb20KKyAgICogbXVsdGlwbGUgdGhyZWFkcyByaWdodCBhd2F5LiBOb3RlIHRoYXQgdGhlIHBsdWdpbiBsb2FkaW5nIGlzIGFsd2F5cworICAgKiBzZXJpYWxpemVkICovCisgIGdzdF9uZXRfYWRkcmVzc19tZXRhX2dldF9pbmZvICgpOworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInVkcHNpbmsiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX1VEUFNJTkspKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJtdWx0aXVkcHNpbmsiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX01VTFRJVURQU0lOSykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImR5bnVkcHNpbmsiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX0RZTlVEUFNJTkspKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJ1ZHBzcmMiLCBHU1RfUkFOS19OT05FLCBHU1RfVFlQRV9VRFBTUkMpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHVkcCwKKyAgICAidHJhbnNmZXIgZGF0YSB2aWEgVURQIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuYyBiL2dzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGRjNWVmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jCkBAIC0wLDAgKzEsMTA4IEBACisvKiBHU3RyZWFtZXIgVURQIG5ldHdvcmsgdXRpbGl0eSBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA2IEpvbmkgVmFsdGFuZW4gPGpvbmkudmFsdGFuZW5AbW92aWFsLmZpPgorICogQ29weXJpZ2h0IChDKSAyMDA5IEphcmtrbyBQYWx2aWFpbmVuIDxqYXJra28ucGFsdmlhaW5lbkBzZXNjYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0dWRwbmV0dXRpbHMuaCIKKworZ2Jvb2xlYW4KK2dzdF91ZHBfcGFyc2VfdXJpIChjb25zdCBnY2hhciAqIHVyaXN0ciwgZ2NoYXIgKiogaG9zdCwgZ3VpbnQxNiAqIHBvcnQpCit7CisgIGdjaGFyICpwcm90b2NvbCwgKmxvY2F0aW9uX3N0YXJ0OworICBnY2hhciAqbG9jYXRpb24sICpsb2NhdGlvbl9lbmQ7CisgIGdjaGFyICpjb2xwdHI7CisKKyAgLyogY29uc2lkZXIgbm8gcHJvdG9jb2wgdG8gYmUgdWRwOi8vICovCisgIHByb3RvY29sID0gZ3N0X3VyaV9nZXRfcHJvdG9jb2wgKHVyaXN0cik7CisgIGlmICghcHJvdG9jb2wpCisgICAgZ290byBub19wcm90b2NvbDsKKyAgaWYgKHN0cmNtcCAocHJvdG9jb2wsICJ1ZHAiKSAhPSAwKQorICAgIGdvdG8gd3JvbmdfcHJvdG9jb2w7CisgIGdfZnJlZSAocHJvdG9jb2wpOworCisgIGxvY2F0aW9uX3N0YXJ0ID0gZ3N0X3VyaV9nZXRfbG9jYXRpb24gKHVyaXN0cik7CisgIGlmICghbG9jYXRpb25fc3RhcnQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9ERUJVRyAoImdvdCBsb2NhdGlvbiAnJXMnIiwgbG9jYXRpb25fc3RhcnQpOworCisgIC8qIFZMQyBjb21wYXRpYmlsaXR5LCBzdHJpcCBldmVyeXRoaW5nIGJlZm9yZSB0aGUgQCBzaWduLiBWTEMgdXNlcyB0aGF0IGFzIHRoZQorICAgKiByZW1vdGUgYWRkcmVzcy4gKi8KKyAgbG9jYXRpb24gPSBnX3N0cnN0cl9sZW4gKGxvY2F0aW9uX3N0YXJ0LCAtMSwgIkAiKTsKKyAgaWYgKGxvY2F0aW9uID09IE5VTEwpCisgICAgbG9jYXRpb24gPSBsb2NhdGlvbl9zdGFydDsKKyAgZWxzZQorICAgIGxvY2F0aW9uICs9IDE7CisKKyAgaWYgKGxvY2F0aW9uWzBdID09ICdbJykgeworICAgIEdTVF9ERUJVRyAoInBhcnNlIElQVjYgYWRkcmVzcyAnJXMnIiwgbG9jYXRpb24pOworICAgIGxvY2F0aW9uX2VuZCA9IHN0cmNociAobG9jYXRpb24sICddJyk7CisgICAgaWYgKGxvY2F0aW9uX2VuZCA9PSBOVUxMKQorICAgICAgZ290byB3cm9uZ19hZGRyZXNzOworCisgICAgKmhvc3QgPSBnX3N0cm5kdXAgKGxvY2F0aW9uICsgMSwgbG9jYXRpb25fZW5kIC0gbG9jYXRpb24gLSAxKTsKKyAgICBjb2xwdHIgPSBzdHJyY2hyIChsb2NhdGlvbl9lbmQsICc6Jyk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHICgicGFyc2UgSVBWNCBhZGRyZXNzICclcyciLCBsb2NhdGlvbik7CisgICAgY29scHRyID0gc3RycmNociAobG9jYXRpb24sICc6Jyk7CisKKyAgICBpZiAoY29scHRyICE9IE5VTEwpIHsKKyAgICAgICpob3N0ID0gZ19zdHJuZHVwIChsb2NhdGlvbiwgY29scHRyIC0gbG9jYXRpb24pOworICAgIH0gZWxzZSB7CisgICAgICAqaG9zdCA9IGdfc3RyZHVwIChsb2NhdGlvbik7CisgICAgfQorICB9CisgIEdTVF9ERUJVRyAoImhvc3Qgc2V0IHRvICclcyciLCAqaG9zdCk7CisKKyAgaWYgKGNvbHB0ciAhPSBOVUxMKSB7CisgICAgKnBvcnQgPSBnX2FzY2lpX3N0cnRvbGwgKGNvbHB0ciArIDEsIE5VTEwsIDEwKTsKKyAgfSBlbHNlIHsKKyAgICAqcG9ydCA9IDA7CisgIH0KKyAgZ19mcmVlIChsb2NhdGlvbl9zdGFydCk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub19wcm90b2NvbDoKKyAgeworICAgIEdTVF9FUlJPUiAoImVycm9yIHBhcnNpbmcgdXJpICVzOiBubyBwcm90b2NvbCIsIHVyaXN0cik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit3cm9uZ19wcm90b2NvbDoKKyAgeworICAgIEdTVF9FUlJPUiAoImVycm9yIHBhcnNpbmcgdXJpICVzOiB3cm9uZyBwcm90b2NvbCAoJXMgIT0gdWRwKSIsIHVyaXN0ciwKKyAgICAgICAgcHJvdG9jb2wpOworICAgIGdfZnJlZSAocHJvdG9jb2wpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQord3JvbmdfYWRkcmVzczoKKyAgeworICAgIEdTVF9FUlJPUiAoImVycm9yIHBhcnNpbmcgdXJpICVzIiwgdXJpc3RyKTsKKyAgICBnX2ZyZWUgKGxvY2F0aW9uKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuaCBiL2dzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjJiZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIEdTdHJlYW1lciBVRFAgbmV0d29yayB1dGlsaXR5IGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChDKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgSm9uaSBWYWx0YW5lbiA8am9uaS52YWx0YW5lbkBtb3ZpYWwuZmk+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2lmbmRlZiBfX0dTVF9VRFBfTkVUX1VUSUxTX0hfXworI2RlZmluZSBfX0dTVF9VRFBfTkVUX1VUSUxTX0hfXworCitnYm9vbGVhbiAgICAgZ3N0X3VkcF9wYXJzZV91cmkgICAgICAgICAgICAoY29uc3QgZ2NoYXIgKnVyaXN0ciwgZ2NoYXIgKipob3N0LCBndWludDE2ICpwb3J0KTsKKworI2VuZGlmIC8qIF9fR1NUX1VEUF9ORVRfVVRJTFNfSF9fKi8KKwpkaWZmIC0tZ2l0IGEvZ3N0L3VkcC9nc3R1ZHBzaW5rLmMgYi9nc3QvdWRwL2dzdHVkcHNpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjRkNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3VkcC9nc3R1ZHBzaW5rLmMKQEAgLTAsMCArMSwyNTkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMTI+IENvbGxhYm9yYSBMdGQuCisgKiAgIEF1dGhvcjogU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LXVkcHNpbmsKKyAqIEBzZWVfYWxzbzogdWRwc3JjLCBtdWx0aWZkc2luaworICoKKyAqIHVkcHNpbmsgaXMgYSBuZXR3b3JrIHNpbmsgdGhhdCBzZW5kcyBVRFAgcGFja2V0cyB0byB0aGUgbmV0d29yay4KKyAqIEl0IGNhbiBiZSBjb21iaW5lZCB3aXRoIFJUUCBwYXlsb2FkZXJzIHRvIGltcGxlbWVudCBSVFAgc3RyZWFtaW5nLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgYXVkaW90ZXN0c3JjICEgdWRwc2luaworICogXXwKKyAqIDwvcmVmc2VjdDI+CisgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlICJnc3R1ZHBzaW5rLmgiCisKKyNkZWZpbmUgVURQX0RFRkFVTFRfSE9TVCAgICAgICAgImxvY2FsaG9zdCIKKyNkZWZpbmUgVURQX0RFRkFVTFRfUE9SVCAgICAgICAgNTAwNAorCisvKiBVRFBTaW5rIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfSE9TVCwKKyAgUFJPUF9QT1JULAorICBQUk9QX1VSSSwKKyAgLyogRklMTCBNRSAqLworfTsKKworc3RhdGljIHZvaWQgZ3N0X3VkcHNpbmtfZmluYWxpemUgKEdzdFVEUFNpbmsgKiB1ZHBzaW5rKTsKKworc3RhdGljIHZvaWQgZ3N0X3VkcHNpbmtfdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwKKyAgICBncG9pbnRlciBpZmFjZV9kYXRhKTsKKworc3RhdGljIHZvaWQgZ3N0X3VkcHNpbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3VkcHNpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCisvKnN0YXRpYyBndWludCBnc3RfdWRwc2lua19zaWduYWxzW0xBU1RfU0lHTkFMXSA9IHsgMCB9OyAqLworI2RlZmluZSBnc3RfdWRwc2lua19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoR3N0VURQU2luaywgZ3N0X3VkcHNpbmssIEdTVF9UWVBFX01VTFRJVURQU0lOSywKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1VSSV9IQU5ETEVSLCBnc3RfdWRwc2lua191cmlfaGFuZGxlcl9pbml0KSk7CisKK3N0YXRpYyB2b2lkCitnc3RfdWRwc2lua19jbGFzc19pbml0IChHc3RVRFBTaW5rQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF91ZHBzaW5rX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3VkcHNpbmtfZ2V0X3Byb3BlcnR5OworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gKEdPYmplY3RGaW5hbGl6ZUZ1bmMpIGdzdF91ZHBzaW5rX2ZpbmFsaXplOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfSE9TVCwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJob3N0IiwgImhvc3QiLAorICAgICAgICAgICJUaGUgaG9zdC9JUC9NdWx0aWNhc3QgZ3JvdXAgdG8gc2VuZCB0aGUgcGFja2V0cyB0byIsCisgICAgICAgICAgVURQX0RFRkFVTFRfSE9TVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfUE9SVCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJwb3J0IiwgInBvcnQiLCAiVGhlIHBvcnQgdG8gc2VuZCB0aGUgcGFja2V0cyB0byIsCisgICAgICAgICAgMCwgNjU1MzUsIFVEUF9ERUZBVUxUX1BPUlQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlVEUCBwYWNrZXQgc2VuZGVyIiwKKyAgICAgICJTaW5rL05ldHdvcmsiLAorICAgICAgIlNlbmQgZGF0YSBvdmVyIHRoZSBuZXR3b3JrIHZpYSBVRFAiLCAiV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF91ZHBzaW5rX2luaXQgKEdzdFVEUFNpbmsgKiB1ZHBzaW5rKQoreworICB1ZHBzaW5rLT5ob3N0ID0gZ19zdHJkdXAgKFVEUF9ERUZBVUxUX0hPU1QpOworICB1ZHBzaW5rLT5wb3J0ID0gVURQX0RFRkFVTFRfUE9SVDsKKyAgdWRwc2luay0+dXJpID0gZ19zdHJkdXBfcHJpbnRmICgidWRwOi8vJXM6JWQiLCB1ZHBzaW5rLT5ob3N0LCB1ZHBzaW5rLT5wb3J0KTsKKworICBnc3RfbXVsdGl1ZHBzaW5rX2FkZCAoR1NUX01VTFRJVURQU0lOSyAodWRwc2luayksIHVkcHNpbmstPmhvc3QsCisgICAgICB1ZHBzaW5rLT5wb3J0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF91ZHBzaW5rX2ZpbmFsaXplIChHc3RVRFBTaW5rICogdWRwc2luaykKK3sKKyAgZ19mcmVlICh1ZHBzaW5rLT5ob3N0KTsKKyAgdWRwc2luay0+aG9zdCA9IE5VTEw7CisKKyAgZ19mcmVlICh1ZHBzaW5rLT51cmkpOworICB1ZHBzaW5rLT51cmkgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAoKEdPYmplY3QgKikgdWRwc2luayk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3VkcHNpbmtfc2V0X3VyaSAoR3N0VURQU2luayAqIHNpbmssIGNvbnN0IGdjaGFyICogdXJpLCBHRXJyb3IgKiogZXJyb3IpCit7CisgIGdjaGFyICpob3N0OworICBndWludDE2IHBvcnQ7CisKKyAgZ3N0X211bHRpdWRwc2lua19yZW1vdmUgKEdTVF9NVUxUSVVEUFNJTksgKHNpbmspLCBzaW5rLT5ob3N0LCBzaW5rLT5wb3J0KTsKKworICBpZiAoIWdzdF91ZHBfcGFyc2VfdXJpICh1cmksICZob3N0LCAmcG9ydCkpCisgICAgZ290byB3cm9uZ191cmk7CisKKyAgZ19mcmVlIChzaW5rLT5ob3N0KTsKKyAgc2luay0+aG9zdCA9IGhvc3Q7CisgIHNpbmstPnBvcnQgPSBwb3J0OworCisgIGdfZnJlZSAoc2luay0+dXJpKTsKKyAgc2luay0+dXJpID0gZ19zdHJkdXAgKHVyaSk7CisKKyAgZ3N0X211bHRpdWRwc2lua19hZGQgKEdTVF9NVUxUSVVEUFNJTksgKHNpbmspLCBzaW5rLT5ob3N0LCBzaW5rLT5wb3J0KTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX3VyaToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBSRVNPVVJDRSwgUkVBRCwgKE5VTEwpLAorICAgICAgICAoImVycm9yIHBhcnNpbmcgdXJpICVzIiwgdXJpKSk7CisgICAgZ19zZXRfZXJyb3JfbGl0ZXJhbCAoZXJyb3IsIEdTVF9VUklfRVJST1IsIEdTVF9VUklfRVJST1JfQkFEX1VSSSwKKyAgICAgICAgIkNvdWxkIG5vdCBwYXJzZSBVRFAgVVJJIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdWRwc2lua19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VURQU2luayAqdWRwc2luazsKKworICB1ZHBzaW5rID0gR1NUX1VEUFNJTksgKG9iamVjdCk7CisKKyAgLyogcmVtb3ZlIG9sZCBob3N0ICovCisgIGdzdF9tdWx0aXVkcHNpbmtfcmVtb3ZlIChHU1RfTVVMVElVRFBTSU5LICh1ZHBzaW5rKSwKKyAgICAgIHVkcHNpbmstPmhvc3QsIHVkcHNpbmstPnBvcnQpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9IT1NUOgorICAgIHsKKyAgICAgIGNvbnN0IGdjaGFyICpob3N0OworCisgICAgICBob3N0ID0gZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSk7CisgICAgICBnX2ZyZWUgKHVkcHNpbmstPmhvc3QpOworICAgICAgdWRwc2luay0+aG9zdCA9IGdfc3RyZHVwIChob3N0KTsKKyAgICAgIGdfZnJlZSAodWRwc2luay0+dXJpKTsKKyAgICAgIHVkcHNpbmstPnVyaSA9CisgICAgICAgICAgZ19zdHJkdXBfcHJpbnRmICgidWRwOi8vJXM6JWQiLCB1ZHBzaW5rLT5ob3N0LCB1ZHBzaW5rLT5wb3J0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfUE9SVDoKKyAgICAgIHVkcHNpbmstPnBvcnQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGdfZnJlZSAodWRwc2luay0+dXJpKTsKKyAgICAgIHVkcHNpbmstPnVyaSA9CisgICAgICAgICAgZ19zdHJkdXBfcHJpbnRmICgidWRwOi8vJXM6JWQiLCB1ZHBzaW5rLT5ob3N0LCB1ZHBzaW5rLT5wb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KKyAgLyogYWRkIG5ldyBob3N0ICovCisgIGdzdF9tdWx0aXVkcHNpbmtfYWRkIChHU1RfTVVMVElVRFBTSU5LICh1ZHBzaW5rKSwKKyAgICAgIHVkcHNpbmstPmhvc3QsIHVkcHNpbmstPnBvcnQpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3VkcHNpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFVEUFNpbmsgKnVkcHNpbms7CisKKyAgdWRwc2luayA9IEdTVF9VRFBTSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9IT1NUOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgdWRwc2luay0+aG9zdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUE9SVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHVkcHNpbmstPnBvcnQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKioqIEdTVFVSSUhBTkRMRVIgSU5URVJGQUNFICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBHc3RVUklUeXBlCitnc3RfdWRwc2lua191cmlfZ2V0X3R5cGUgKEdUeXBlIHR5cGUpCit7CisgIHJldHVybiBHU1RfVVJJX1NJTks7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqY29uc3QgKgorZ3N0X3VkcHNpbmtfdXJpX2dldF9wcm90b2NvbHMgKEdUeXBlIHR5cGUpCit7CisgIHN0YXRpYyBjb25zdCBnY2hhciAqcHJvdG9jb2xzW10gPSB7ICJ1ZHAiLCBOVUxMIH07CisKKyAgcmV0dXJuIHByb3RvY29sczsKK30KKworc3RhdGljIGdjaGFyICoKK2dzdF91ZHBzaW5rX3VyaV9nZXRfdXJpIChHc3RVUklIYW5kbGVyICogaGFuZGxlcikKK3sKKyAgR3N0VURQU2luayAqc2luayA9IEdTVF9VRFBTSU5LIChoYW5kbGVyKTsKKworICByZXR1cm4gZ19zdHJkdXAgKHNpbmstPnVyaSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3VkcHNpbmtfdXJpX3NldF91cmkgKEdzdFVSSUhhbmRsZXIgKiBoYW5kbGVyLCBjb25zdCBnY2hhciAqIHVyaSwKKyAgICBHRXJyb3IgKiogZXJyb3IpCit7CisgIHJldHVybiBnc3RfdWRwc2lua19zZXRfdXJpIChHU1RfVURQU0lOSyAoaGFuZGxlciksIHVyaSwgZXJyb3IpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3VkcHNpbmtfdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwgZ3BvaW50ZXIgaWZhY2VfZGF0YSkKK3sKKyAgR3N0VVJJSGFuZGxlckludGVyZmFjZSAqaWZhY2UgPSAoR3N0VVJJSGFuZGxlckludGVyZmFjZSAqKSBnX2lmYWNlOworCisgIGlmYWNlLT5nZXRfdHlwZSA9IGdzdF91ZHBzaW5rX3VyaV9nZXRfdHlwZTsKKyAgaWZhY2UtPmdldF9wcm90b2NvbHMgPSBnc3RfdWRwc2lua191cmlfZ2V0X3Byb3RvY29sczsKKyAgaWZhY2UtPmdldF91cmkgPSBnc3RfdWRwc2lua191cmlfZ2V0X3VyaTsKKyAgaWZhY2UtPnNldF91cmkgPSBnc3RfdWRwc2lua191cmlfc2V0X3VyaTsKK30KZGlmZiAtLWdpdCBhL2dzdC91ZHAvZ3N0dWRwc2luay5oIGIvZ3N0L3VkcC9nc3R1ZHBzaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdiNWIzNAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC91ZHAvZ3N0dWRwc2luay5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfVURQU0lOS19IX18KKyNkZWZpbmUgX19HU1RfVURQU0lOS19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlICJnc3RtdWx0aXVkcHNpbmsuaCIKKworR19CRUdJTl9ERUNMUworCisjaW5jbHVkZSAiZ3N0dWRwbmV0dXRpbHMuaCIKKworI2RlZmluZSBHU1RfVFlQRV9VRFBTSU5LICAgICAgICAgICAgICAgIChnc3RfdWRwc2lua19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfVURQU0lOSyhvYmopICAgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9VRFBTSU5LLEdzdFVEUFNpbmspKQorI2RlZmluZSBHU1RfVURQU0lOS19DTEFTUyhrbGFzcykgICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1VEUFNJTkssR3N0VURQU2lua0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1VEUFNJTksob2JqKSAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfVURQU0lOSykpCisjZGVmaW5lIEdTVF9JU19VRFBTSU5LX0NMQVNTKGtsYXNzKSAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVURQU0lOSykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RVRFBTaW5rIEdzdFVEUFNpbms7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VURQU2lua0NsYXNzIEdzdFVEUFNpbmtDbGFzczsKKworc3RydWN0IF9Hc3RVRFBTaW5rIHsKKyAgR3N0TXVsdGlVRFBTaW5rIHBhcmVudDsKKworICBnY2hhciAqaG9zdDsKKyAgZ3VpbnQxNiBwb3J0OworCisgIGdjaGFyICp1cmk7Cit9OworCitzdHJ1Y3QgX0dzdFVEUFNpbmtDbGFzcyB7CisgIEdzdE11bHRpVURQU2lua0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF91ZHBzaW5rX2dldF90eXBlKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfVURQU0lOS19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC91ZHAvZ3N0dWRwc3JjLmMgYi9nc3QvdWRwL2dzdHVkcHNyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZWNhNWQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdWRwL2dzdHVkcHNyYy5jCkBAIC0wLDAgKzEsMTc2MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gTm9raWEgQ29ycG9yYXRpb24gPGthaS52ZWhtYW5lbkBub2tpYS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDEyPiBDb2xsYWJvcmEgTHRkLgorICogICBBdXRob3I6IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgQ2VudHJpY3VsYXIgTHRkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtdWRwc3JjCisgKiBAc2VlX2Fsc286IHVkcHNpbmssIG11bHRpZmRzaW5rCisgKgorICogdWRwc3JjIGlzIGEgbmV0d29yayBzb3VyY2UgdGhhdCByZWFkcyBVRFAgcGFja2V0cyBmcm9tIHRoZSBuZXR3b3JrLgorICogSXQgY2FuIGJlIGNvbWJpbmVkIHdpdGggUlRQIGRlcGF5bG9hZGVycyB0byBpbXBsZW1lbnQgUlRQIHN0cmVhbWluZy4KKyAqCisgKiBUaGUgdWRwc3JjIGVsZW1lbnQgc3VwcG9ydHMgYXV0b21hdGljIHBvcnQgYWxsb2NhdGlvbiBieSBzZXR0aW5nIHRoZQorICogI0dzdFVEUFNyYzpwb3J0IHByb3BlcnR5IHRvIDAuIEFmdGVyIHNldHRpbmcgdGhlIHVkcHNyYyB0byBQQVVTRUQsIHRoZQorICogYWxsb2NhdGVkIHBvcnQgY2FuIGJlIG9idGFpbmVkIGJ5IHJlYWRpbmcgdGhlIHBvcnQgcHJvcGVydHkuCisgKgorICogdWRwc3JjIGNhbiByZWFkIGZyb20gbXVsdGljYXN0IGdyb3VwcyBieSBzZXR0aW5nIHRoZSAjR3N0VURQU3JjOm11bHRpY2FzdC1ncm91cAorICogcHJvcGVydHkgdG8gdGhlIElQIGFkZHJlc3Mgb2YgdGhlIG11bHRpY2FzdCBncm91cC4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5IG9uZSBjYW4gcHJvdmlkZSBhIGN1c3RvbSBzb2NrZXQgdG8gdWRwc3JjIHdpdGggdGhlICNHc3RVRFBTcmM6c29ja2V0CisgKiBwcm9wZXJ0eSwgdWRwc3JjIHdpbGwgdGhlbiBub3QgYWxsb2NhdGUgYSBzb2NrZXQgaXRzZWxmIGJ1dCB1c2UgdGhlIHByb3ZpZGVkCisgKiBvbmUuCisgKgorICogVGhlICNHc3RVRFBTcmM6Y2FwcyBwcm9wZXJ0eSBpcyBtYWlubHkgdXNlZCB0byBnaXZlIGEgdHlwZSB0byB0aGUgVURQIHBhY2tldAorICogc28gdGhhdCB0aGV5IGNhbiBiZSBhdXRvcGx1Z2dlZCBpbiBHU3RyZWFtZXIgcGlwZWxpbmVzLiBUaGlzIGlzIHZlcnkgdXNlZnVsCisgKiBmb3IgUlRQIGltcGxlbWVudGF0aW9ucyB3aGVyZSB0aGUgY29udGVudHMgb2YgdGhlIFVEUCBwYWNrZXRzIGlzIHRyYW5zZmVyZWQKKyAqIG91dC1vZi1ib3VuZHMgdXNpbmcgU0RQIG9yIG90aGVyIG1lYW5zLgorICoKKyAqIFRoZSAjR3N0VURQU3JjOmJ1ZmZlci1zaXplIHByb3BlcnR5IGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGtlcm5lbAorICogYnVmZmVyc2l6ZXMgdXNlZCBmb3IgcmVjZWl2aW5nIHBhY2tldHMuIFRoZSBidWZmZXIgc2l6ZSBtYXkgYmUgaW5jcmVhc2VkIGZvcgorICogaGlnaC12b2x1bWUgY29ubmVjdGlvbnMsIG9yIG1heSBiZSBkZWNyZWFzZWQgdG8gbGltaXQgdGhlIHBvc3NpYmxlIGJhY2tsb2cgb2YKKyAqIGluY29taW5nIGRhdGEuIFRoZSBzeXN0ZW0gcGxhY2VzIGFuIGFic29sdXRlIGxpbWl0IG9uIHRoZXNlIHZhbHVlcywgb24gTGludXgsCisgKiBmb3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQgYnVmZmVyIHNpemUgaXMgdHlwaWNhbGx5IDUwSyBhbmQgY2FuIGJlIGluY3JlYXNlZCB0bworICogbWF4aW1hbGx5IDEwMEsuCisgKgorICogVGhlICNHc3RVRFBTcmM6c2tpcC1maXJzdC1ieXRlcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIHN0cmlwIG9mZiBhbiBhcmJpdHJhcnkKKyAqIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcmF3IHVkcCBwYWNrZXQgYW5kIGNhbiBiZSB1c2VkIHRvIHN0cmlwCisgKiBvZmYgcHJvcHJpZXRhcnkgaGVhZGVyLCBmb3IgZXhhbXBsZS4KKyAqCisgKiBUaGUgdWRwc3JjIGlzIGFsd2F5cyBhIGxpdmUgc291cmNlLiBJdCBkb2VzIGhvd2V2ZXIgbm90IHByb3ZpZGUgYSAjR3N0Q2xvY2ssCisgKiB0aGlzIGlzIGxlZnQgZm9yIGRvd25zdHJlYW0gZWxlbWVudHMgc3VjaCBhcyBhbiBSVFAgc2Vzc2lvbiBtYW5hZ2VyIG9yIGRlbXV4ZXIKKyAqIChzdWNoIGFzIGFuIE1QRUcgZGVtdXhlcikuIEFzIHdpdGggYWxsIGxpdmUgc291cmNlcywgdGhlIGNhcHR1cmVkIGJ1ZmZlcnMKKyAqIHdpbGwgaGF2ZSB0aGVpciB0aW1lc3RhbXAgc2V0IHRvIHRoZSBjdXJyZW50IHJ1bm5pbmcgdGltZSBvZiB0aGUgcGlwZWxpbmUuCisgKgorICogdWRwc3JjIGltcGxlbWVudHMgYSAjR3N0VVJJSGFuZGxlciBpbnRlcmZhY2UgdGhhdCBoYW5kbGVzIHVkcDovL2hvc3Q6cG9ydAorICogdHlwZSBVUklzLgorICoKKyAqIElmIHRoZSAjR3N0VURQU3JjOnRpbWVvdXQgcHJvcGVydHkgaXMgc2V0IHRvIGEgdmFsdWUgYmlnZ2VyIHRoYW4gMCwgdWRwc3JjCisgKiB3aWxsIGdlbmVyYXRlIGFuIGVsZW1lbnQgbWVzc2FnZSBuYW1lZAorICogPGNsYXNzbmFtZT4mcXVvdDtHc3RVRFBTcmNUaW1lb3V0JnF1b3Q7PC9jbGFzc25hbWU+CisgKiBpZiBubyBkYXRhIHdhcyByZWNpZXZlZCBpbiB0aGUgZ2l2ZW4gdGltZW91dC4KKyAqIFRoZSBtZXNzYWdlJ3Mgc3RydWN0dXJlIGNvbnRhaW5zIG9uZSBmaWVsZDoKKyAqIDxpdGVtaXplZGxpc3Q+CisgKiA8bGlzdGl0ZW0+CisgKiAgIDxwYXJhPgorICogICAjZ3VpbnQ2NAorICogICA8Y2xhc3NuYW1lPiZxdW90O3RpbWVvdXQmcXVvdDs8L2NsYXNzbmFtZT46IHRoZSB0aW1lb3V0IGluIG1pY3Jvc2Vjb25kcyB0aGF0CisgKiAgIGV4cGlyZWQgd2hlbiB3YWl0aW5nIGZvciBkYXRhLgorICogICA8L3BhcmE+CisgKiA8L2xpc3RpdGVtPgorICogPC9pdGVtaXplZGxpc3Q+CisgKiBUaGUgbWVzc2FnZSBpcyB0eXBpY2FsbHkgdXNlZCB0byBkZXRlY3QgdGhhdCBubyBVRFAgYXJyaXZlcyBpbiB0aGUgcmVjZWl2ZXIKKyAqIGJlY2F1c2UgaXQgaXMgYmxvY2tlZCBieSBhIGZpcmV3YWxsLgorICoKKyAqIEEgY3VzdG9tIGZpbGUgZGVzY3JpcHRvciBjYW4gYmUgY29uZmlndXJlZCB3aXRoIHRoZQorICogI0dzdFVEUFNyYzpzb2NrZXQgcHJvcGVydHkuIFRoZSBzb2NrZXQgd2lsbCBiZSBjbG9zZWQgd2hlbiBzZXR0aW5nCisgKiB0aGUgZWxlbWVudCB0byBSRUFEWSBieSBkZWZhdWx0LiBUaGlzIGJlaGF2aW91ciBjYW4gYmUgb3ZlcnJpZGVuCisgKiB3aXRoIHRoZSAjR3N0VURQU3JjOmNsb3NlLXNvY2tldCBwcm9wZXJ0eSwgaW4gd2hpY2ggY2FzZSB0aGUKKyAqIGFwcGxpY2F0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nIHRoZSBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiB1ZHBzcmMgISBmYWtlc2luayBkdW1wPTEKKyAqIF18IEEgcGlwZWxpbmUgdG8gcmVhZCBmcm9tIHRoZSBkZWZhdWx0IHBvcnQgYW5kIGR1bXAgdGhlIHVkcCBwYWNrZXRzLgorICogVG8gYWN0dWFsbHkgZ2VuZXJhdGUgdWRwIHBhY2tldHMgb24gdGhlIGRlZmF1bHQgcG9ydCBvbmUgY2FuIHVzZSB0aGUKKyAqIHVkcHNpbmsgZWxlbWVudC4gV2hlbiBydW5uaW5nIHRoZSBmb2xsb3dpbmcgcGlwZWxpbmUgaW4gYW5vdGhlciB0ZXJtaW5hbCwgdGhlCisgKiBhYm92ZSBtZW50aW9uZWQgcGlwZWxpbmUgc2hvdWxkIGR1bXAgZGF0YSBwYWNrZXRzIHRvIHRoZSBjb25zb2xlLgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyAhIHVkcHNpbmsKKyAqIF18CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgdWRwc3JjIHBvcnQ9MCAhIGZha2VzaW5rCisgKiBdfCByZWFkIHVkcCBwYWNrZXRzIGZyb20gYSBmcmVlIHBvcnQuCisgKiA8L3JlZnNlY3QyPgorICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKy8qIE5lZWRlZCB0byBnZXQgc3RydWN0IGluNl9wa3RpbmZvLgorICogQWxzbyBhbGwgdGhlc2UgaGF2ZSB0byBiZSBiZWZvcmUgZ2xpYi5oIGlzIGluY2x1ZGVkIGFzCisgKiBvdGhlcndpc2Ugc3RydWN0IGluNl9wa3RpbmZvIGlzIG5vdCBkZWZpbmVkIGNvbXBsZXRlbHkKKyAqIGR1ZSB0byBicm9rZW4gZ2xpYmMgaGVhZGVycyAqLworI2RlZmluZSBfR05VX1NPVVJDRQorLyogTmVlZGVkIGZvciBPU1gvaU9TIHRvIGRlZmluZSB0aGUgSVB2NiB2YXJpYW50cyAqLworI2RlZmluZSBfX0FQUExFX1VTRV9SRkNfMzU0MgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnc3R1ZHBzcmMuaCIKKworI2luY2x1ZGUgPGdzdC9uZXQvZ3N0bmV0YWRkcmVzc21ldGEuaD4KKworI2luY2x1ZGUgPGdpby9nbmV0d29ya2luZy5oPgorCisvKiBSZXF1aXJlZCBmb3Igb3RoZXIgcGFydHMgb2YgaW5fcGt0aW5mbyAvIGluNl9wa3RpbmZvIGJ1dCBvbmx5CisgKiBvbiBub24tV2luZG93cyBhbmQgY2FuIGJlIGluY2x1ZGVkIGFmdGVyIGdsaWIuaCAqLworI2lmbmRlZiBHX1BMQVRGT1JNX1dJTjMyCisjaW5jbHVkZSA8bmV0aW5ldC9pcC5oPgorI2VuZGlmCisKKy8qIENvbnRyb2wgbWVzc2FnZXMgZm9yIGdldHRpbmcgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKyNpZmRlZiBJUF9QS1RJTkZPCitHVHlwZSBnc3RfaXBfcGt0aW5mb19tZXNzYWdlX2dldF90eXBlICh2b2lkKTsKKworI2RlZmluZSBHU1RfVFlQRV9JUF9QS1RJTkZPX01FU1NBR0UgICAgICAgICAoZ3N0X2lwX3BrdGluZm9fbWVzc2FnZV9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX0lQX1BLVElORk9fTUVTU0FHRShvKSAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgobyksIEdTVF9UWVBFX0lQX1BLVElORk9fTUVTU0FHRSwgR3N0SVBQa3RpbmZvTWVzc2FnZSkpCisjZGVmaW5lIEdTVF9JUF9QS1RJTkZPX01FU1NBR0VfQ0xBU1MoYykgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBHU1RfVFlQRV9JUF9QS1RJTkZPX01FU1NBR0UsIEdzdElQUGt0aW5mb01lc3NhZ2VDbGFzcykpCisjZGVmaW5lIEdTVF9JU19JUF9QS1RJTkZPX01FU1NBR0UobykgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG8pLCBHU1RfVFlQRV9JUF9QS1RJTkZPX01FU1NBR0UpKQorI2RlZmluZSBHU1RfSVNfSVBfUEtUSU5GT19NRVNTQUdFX0NMQVNTKGMpICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgR1NUX1RZUEVfSVBfUEtUSU5GT19NRVNTQUdFKSkKKyNkZWZpbmUgR1NUX0lQX1BLVElORk9fTUVTU0FHRV9HRVRfQ0xBU1MobykgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvKSwgR1NUX1RZUEVfSVBfUEtUSU5GT19NRVNTQUdFLCBHc3RJUFBrdGluZm9NZXNzYWdlQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0SVBQa3RpbmZvTWVzc2FnZSBHc3RJUFBrdGluZm9NZXNzYWdlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdElQUGt0aW5mb01lc3NhZ2VDbGFzcyBHc3RJUFBrdGluZm9NZXNzYWdlQ2xhc3M7CisKK3N0cnVjdCBfR3N0SVBQa3RpbmZvTWVzc2FnZUNsYXNzCit7CisgIEdTb2NrZXRDb250cm9sTWVzc2FnZUNsYXNzIHBhcmVudF9jbGFzczsKKworfTsKKworc3RydWN0IF9Hc3RJUFBrdGluZm9NZXNzYWdlCit7CisgIEdTb2NrZXRDb250cm9sTWVzc2FnZSBwYXJlbnQ7CisKKyAgZ3VpbnQgaWZpbmRleDsKKyNpZm5kZWYgR19QTEFURk9STV9XSU4zMgorI2lmbmRlZiBfX05ldEJTRF9fCisgIHN0cnVjdCBpbl9hZGRyIHNwZWNfZHN0OworI2VuZGlmCisjZW5kaWYKKyAgc3RydWN0IGluX2FkZHIgYWRkcjsKK307CisKK0dfREVGSU5FX1RZUEUgKEdzdElQUGt0aW5mb01lc3NhZ2UsIGdzdF9pcF9wa3RpbmZvX21lc3NhZ2UsCisgICAgR19UWVBFX1NPQ0tFVF9DT05UUk9MX01FU1NBR0UpOworCitzdGF0aWMgZ3NpemUKK2dzdF9pcF9wa3RpbmZvX21lc3NhZ2VfZ2V0X3NpemUgKEdTb2NrZXRDb250cm9sTWVzc2FnZSAqIG1lc3NhZ2UpCit7CisgIHJldHVybiBzaXplb2YgKHN0cnVjdCBpbl9wa3RpbmZvKTsKK30KKworc3RhdGljIGludAorZ3N0X2lwX3BrdGluZm9fbWVzc2FnZV9nZXRfbGV2ZWwgKEdTb2NrZXRDb250cm9sTWVzc2FnZSAqIG1lc3NhZ2UpCit7CisgIHJldHVybiBJUFBST1RPX0lQOworfQorCitzdGF0aWMgaW50Citnc3RfaXBfcGt0aW5mb19tZXNzYWdlX2dldF9tc2dfdHlwZSAoR1NvY2tldENvbnRyb2xNZXNzYWdlICogbWVzc2FnZSkKK3sKKyAgcmV0dXJuIElQX1BLVElORk87Cit9CisKK3N0YXRpYyBHU29ja2V0Q29udHJvbE1lc3NhZ2UgKgorZ3N0X2lwX3BrdGluZm9fbWVzc2FnZV9kZXNlcmlhbGl6ZSAoZ2ludCBsZXZlbCwKKyAgICBnaW50IHR5cGUsIGdzaXplIHNpemUsIGdwb2ludGVyIGRhdGEpCit7CisgIHN0cnVjdCBpbl9wa3RpbmZvICpwa3RpbmZvOworICBHc3RJUFBrdGluZm9NZXNzYWdlICptZXNzYWdlOworCisgIGlmIChsZXZlbCAhPSBJUFBST1RPX0lQIHx8IHR5cGUgIT0gSVBfUEtUSU5GTykKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoc2l6ZSA8IHNpemVvZiAoc3RydWN0IGluX3BrdGluZm8pKQorICAgIHJldHVybiBOVUxMOworCisgIHBrdGluZm8gPSBkYXRhOworCisgIG1lc3NhZ2UgPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX0lQX1BLVElORk9fTUVTU0FHRSwgTlVMTCk7CisgIG1lc3NhZ2UtPmlmaW5kZXggPSBwa3RpbmZvLT5pcGlfaWZpbmRleDsKKyNpZm5kZWYgR19QTEFURk9STV9XSU4zMgorI2lmbmRlZiBfX05ldEJTRF9fCisgIG1lc3NhZ2UtPnNwZWNfZHN0ID0gcGt0aW5mby0+aXBpX3NwZWNfZHN0OworI2VuZGlmCisjZW5kaWYKKyAgbWVzc2FnZS0+YWRkciA9IHBrdGluZm8tPmlwaV9hZGRyOworCisgIHJldHVybiBHX1NPQ0tFVF9DT05UUk9MX01FU1NBR0UgKG1lc3NhZ2UpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2lwX3BrdGluZm9fbWVzc2FnZV9pbml0IChHc3RJUFBrdGluZm9NZXNzYWdlICogbWVzc2FnZSkKK3sKK30KKworc3RhdGljIHZvaWQKK2dzdF9pcF9wa3RpbmZvX21lc3NhZ2VfY2xhc3NfaW5pdCAoR3N0SVBQa3RpbmZvTWVzc2FnZUNsYXNzICogY2xhc3MpCit7CisgIEdTb2NrZXRDb250cm9sTWVzc2FnZUNsYXNzICpzY21fY2xhc3M7CisKKyAgc2NtX2NsYXNzID0gR19TT0NLRVRfQ09OVFJPTF9NRVNTQUdFX0NMQVNTIChjbGFzcyk7CisgIHNjbV9jbGFzcy0+Z2V0X3NpemUgPSBnc3RfaXBfcGt0aW5mb19tZXNzYWdlX2dldF9zaXplOworICBzY21fY2xhc3MtPmdldF9sZXZlbCA9IGdzdF9pcF9wa3RpbmZvX21lc3NhZ2VfZ2V0X2xldmVsOworICBzY21fY2xhc3MtPmdldF90eXBlID0gZ3N0X2lwX3BrdGluZm9fbWVzc2FnZV9nZXRfbXNnX3R5cGU7CisgIHNjbV9jbGFzcy0+ZGVzZXJpYWxpemUgPSBnc3RfaXBfcGt0aW5mb19tZXNzYWdlX2Rlc2VyaWFsaXplOworfQorI2VuZGlmCisKKyNpZmRlZiBJUFY2X1BLVElORk8KK0dUeXBlIGdzdF9pcHY2X3BrdGluZm9fbWVzc2FnZV9nZXRfdHlwZSAodm9pZCk7CisKKyNkZWZpbmUgR1NUX1RZUEVfSVBWNl9QS1RJTkZPX01FU1NBR0UgICAgICAgICAoZ3N0X2lwdjZfcGt0aW5mb19tZXNzYWdlX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfSVBWNl9QS1RJTkZPX01FU1NBR0UobykgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG8pLCBHU1RfVFlQRV9JUFY2X1BLVElORk9fTUVTU0FHRSwgR3N0SVBWNlBrdGluZm9NZXNzYWdlKSkKKyNkZWZpbmUgR1NUX0lQVjZfUEtUSU5GT19NRVNTQUdFX0NMQVNTKGMpICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgR1NUX1RZUEVfSVBWNl9QS1RJTkZPX01FU1NBR0UsIEdzdElQVjZQa3RpbmZvTWVzc2FnZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0lQVjZfUEtUSU5GT19NRVNTQUdFKG8pICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvKSwgR1NUX1RZUEVfSVBWNl9QS1RJTkZPX01FU1NBR0UpKQorI2RlZmluZSBHU1RfSVNfSVBWNl9QS1RJTkZPX01FU1NBR0VfQ0xBU1MoYykgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBHU1RfVFlQRV9JUFY2X1BLVElORk9fTUVTU0FHRSkpCisjZGVmaW5lIEdTVF9JUFY2X1BLVElORk9fTUVTU0FHRV9HRVRfQ0xBU1MobykgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvKSwgR1NUX1RZUEVfSVBWNl9QS1RJTkZPX01FU1NBR0UsIEdzdElQVjZQa3RpbmZvTWVzc2FnZUNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdElQVjZQa3RpbmZvTWVzc2FnZSBHc3RJUFY2UGt0aW5mb01lc3NhZ2U7Cit0eXBlZGVmIHN0cnVjdCBfR3N0SVBWNlBrdGluZm9NZXNzYWdlQ2xhc3MgR3N0SVBWNlBrdGluZm9NZXNzYWdlQ2xhc3M7CisKK3N0cnVjdCBfR3N0SVBWNlBrdGluZm9NZXNzYWdlQ2xhc3MKK3sKKyAgR1NvY2tldENvbnRyb2xNZXNzYWdlQ2xhc3MgcGFyZW50X2NsYXNzOworCit9OworCitzdHJ1Y3QgX0dzdElQVjZQa3RpbmZvTWVzc2FnZQoreworICBHU29ja2V0Q29udHJvbE1lc3NhZ2UgcGFyZW50OworCisgIGd1aW50IGlmaW5kZXg7CisgIHN0cnVjdCBpbjZfYWRkciBhZGRyOworfTsKKworR19ERUZJTkVfVFlQRSAoR3N0SVBWNlBrdGluZm9NZXNzYWdlLCBnc3RfaXB2Nl9wa3RpbmZvX21lc3NhZ2UsCisgICAgR19UWVBFX1NPQ0tFVF9DT05UUk9MX01FU1NBR0UpOworCitzdGF0aWMgZ3NpemUKK2dzdF9pcHY2X3BrdGluZm9fbWVzc2FnZV9nZXRfc2l6ZSAoR1NvY2tldENvbnRyb2xNZXNzYWdlICogbWVzc2FnZSkKK3sKKyAgcmV0dXJuIHNpemVvZiAoc3RydWN0IGluNl9wa3RpbmZvKTsKK30KKworc3RhdGljIGludAorZ3N0X2lwdjZfcGt0aW5mb19tZXNzYWdlX2dldF9sZXZlbCAoR1NvY2tldENvbnRyb2xNZXNzYWdlICogbWVzc2FnZSkKK3sKKyAgcmV0dXJuIElQUFJPVE9fSVBWNjsKK30KKworc3RhdGljIGludAorZ3N0X2lwdjZfcGt0aW5mb19tZXNzYWdlX2dldF9tc2dfdHlwZSAoR1NvY2tldENvbnRyb2xNZXNzYWdlICogbWVzc2FnZSkKK3sKKyAgcmV0dXJuIElQVjZfUEtUSU5GTzsKK30KKworc3RhdGljIEdTb2NrZXRDb250cm9sTWVzc2FnZSAqCitnc3RfaXB2Nl9wa3RpbmZvX21lc3NhZ2VfZGVzZXJpYWxpemUgKGdpbnQgbGV2ZWwsCisgICAgZ2ludCB0eXBlLCBnc2l6ZSBzaXplLCBncG9pbnRlciBkYXRhKQoreworICBzdHJ1Y3QgaW42X3BrdGluZm8gKnBrdGluZm87CisgIEdzdElQVjZQa3RpbmZvTWVzc2FnZSAqbWVzc2FnZTsKKworICBpZiAobGV2ZWwgIT0gSVBQUk9UT19JUFY2IHx8IHR5cGUgIT0gSVBWNl9QS1RJTkZPKQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChzaXplIDwgc2l6ZW9mIChzdHJ1Y3QgaW42X3BrdGluZm8pKQorICAgIHJldHVybiBOVUxMOworCisgIHBrdGluZm8gPSBkYXRhOworCisgIG1lc3NhZ2UgPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX0lQVjZfUEtUSU5GT19NRVNTQUdFLCBOVUxMKTsKKyAgbWVzc2FnZS0+aWZpbmRleCA9IHBrdGluZm8tPmlwaTZfaWZpbmRleDsKKyAgbWVzc2FnZS0+YWRkciA9IHBrdGluZm8tPmlwaTZfYWRkcjsKKworICByZXR1cm4gR19TT0NLRVRfQ09OVFJPTF9NRVNTQUdFIChtZXNzYWdlKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9pcHY2X3BrdGluZm9fbWVzc2FnZV9pbml0IChHc3RJUFY2UGt0aW5mb01lc3NhZ2UgKiBtZXNzYWdlKQoreworfQorCitzdGF0aWMgdm9pZAorZ3N0X2lwdjZfcGt0aW5mb19tZXNzYWdlX2NsYXNzX2luaXQgKEdzdElQVjZQa3RpbmZvTWVzc2FnZUNsYXNzICogY2xhc3MpCit7CisgIEdTb2NrZXRDb250cm9sTWVzc2FnZUNsYXNzICpzY21fY2xhc3M7CisKKyAgc2NtX2NsYXNzID0gR19TT0NLRVRfQ09OVFJPTF9NRVNTQUdFX0NMQVNTIChjbGFzcyk7CisgIHNjbV9jbGFzcy0+Z2V0X3NpemUgPSBnc3RfaXB2Nl9wa3RpbmZvX21lc3NhZ2VfZ2V0X3NpemU7CisgIHNjbV9jbGFzcy0+Z2V0X2xldmVsID0gZ3N0X2lwdjZfcGt0aW5mb19tZXNzYWdlX2dldF9sZXZlbDsKKyAgc2NtX2NsYXNzLT5nZXRfdHlwZSA9IGdzdF9pcHY2X3BrdGluZm9fbWVzc2FnZV9nZXRfbXNnX3R5cGU7CisgIHNjbV9jbGFzcy0+ZGVzZXJpYWxpemUgPSBnc3RfaXB2Nl9wa3RpbmZvX21lc3NhZ2VfZGVzZXJpYWxpemU7Cit9CisKKyNlbmRpZgorCisjaWZkZWYgSVBfUkVDVkRTVEFERFIKK0dUeXBlIGdzdF9pcF9yZWN2ZHN0YWRkcl9tZXNzYWdlX2dldF90eXBlICh2b2lkKTsKKworI2RlZmluZSBHU1RfVFlQRV9JUF9SRUNWRFNUQUREUl9NRVNTQUdFICAgICAgICAgKGdzdF9pcF9yZWN2ZHN0YWRkcl9tZXNzYWdlX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfSVBfUkVDVkRTVEFERFJfTUVTU0FHRShvKSAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgobyksIEdTVF9UWVBFX0lQX1JFQ1ZEU1RBRERSX01FU1NBR0UsIEdzdElQUmVjdmRzdGFkZHJNZXNzYWdlKSkKKyNkZWZpbmUgR1NUX0lQX1JFQ1ZEU1RBRERSX01FU1NBR0VfQ0xBU1MoYykgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBHU1RfVFlQRV9JUF9SRUNWRFNUQUREUl9NRVNTQUdFLCBHc3RJUFJlY3Zkc3RhZGRyTWVzc2FnZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0lQX1JFQ1ZEU1RBRERSX01FU1NBR0UobykgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG8pLCBHU1RfVFlQRV9JUF9SRUNWRFNUQUREUl9NRVNTQUdFKSkKKyNkZWZpbmUgR1NUX0lTX0lQX1JFQ1ZEU1RBRERSX01FU1NBR0VfQ0xBU1MoYykgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBHU1RfVFlQRV9JUF9SRUNWRFNUQUREUl9NRVNTQUdFKSkKKyNkZWZpbmUgR1NUX0lQX1JFQ1ZEU1RBRERSX01FU1NBR0VfR0VUX0NMQVNTKG8pIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgobyksIEdTVF9UWVBFX0lQX1JFQ1ZEU1RBRERSX01FU1NBR0UsIEdzdElQUmVjdmRzdGFkZHJNZXNzYWdlQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0SVBSZWN2ZHN0YWRkck1lc3NhZ2UgR3N0SVBSZWN2ZHN0YWRkck1lc3NhZ2U7Cit0eXBlZGVmIHN0cnVjdCBfR3N0SVBSZWN2ZHN0YWRkck1lc3NhZ2VDbGFzcyBHc3RJUFJlY3Zkc3RhZGRyTWVzc2FnZUNsYXNzOworCitzdHJ1Y3QgX0dzdElQUmVjdmRzdGFkZHJNZXNzYWdlQ2xhc3MKK3sKKyAgR1NvY2tldENvbnRyb2xNZXNzYWdlQ2xhc3MgcGFyZW50X2NsYXNzOworCit9OworCitzdHJ1Y3QgX0dzdElQUmVjdmRzdGFkZHJNZXNzYWdlCit7CisgIEdTb2NrZXRDb250cm9sTWVzc2FnZSBwYXJlbnQ7CisKKyAgZ3VpbnQgaWZpbmRleDsKKyAgc3RydWN0IGluX2FkZHIgYWRkcjsKK307CisKK0dfREVGSU5FX1RZUEUgKEdzdElQUmVjdmRzdGFkZHJNZXNzYWdlLCBnc3RfaXBfcmVjdmRzdGFkZHJfbWVzc2FnZSwKKyAgICBHX1RZUEVfU09DS0VUX0NPTlRST0xfTUVTU0FHRSk7CisKK3N0YXRpYyBnc2l6ZQorZ3N0X2lwX3JlY3Zkc3RhZGRyX21lc3NhZ2VfZ2V0X3NpemUgKEdTb2NrZXRDb250cm9sTWVzc2FnZSAqIG1lc3NhZ2UpCit7CisgIHJldHVybiBzaXplb2YgKHN0cnVjdCBpbl9hZGRyKTsKK30KKworc3RhdGljIGludAorZ3N0X2lwX3JlY3Zkc3RhZGRyX21lc3NhZ2VfZ2V0X2xldmVsIChHU29ja2V0Q29udHJvbE1lc3NhZ2UgKiBtZXNzYWdlKQoreworICByZXR1cm4gSVBQUk9UT19JUDsKK30KKworc3RhdGljIGludAorZ3N0X2lwX3JlY3Zkc3RhZGRyX21lc3NhZ2VfZ2V0X21zZ190eXBlIChHU29ja2V0Q29udHJvbE1lc3NhZ2UgKiBtZXNzYWdlKQoreworICByZXR1cm4gSVBfUkVDVkRTVEFERFI7Cit9CisKK3N0YXRpYyBHU29ja2V0Q29udHJvbE1lc3NhZ2UgKgorZ3N0X2lwX3JlY3Zkc3RhZGRyX21lc3NhZ2VfZGVzZXJpYWxpemUgKGdpbnQgbGV2ZWwsCisgICAgZ2ludCB0eXBlLCBnc2l6ZSBzaXplLCBncG9pbnRlciBkYXRhKQoreworICBzdHJ1Y3QgaW5fYWRkciAqYWRkcjsKKyAgR3N0SVBSZWN2ZHN0YWRkck1lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgaWYgKGxldmVsICE9IElQUFJPVE9fSVAgfHwgdHlwZSAhPSBJUF9SRUNWRFNUQUREUikKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoc2l6ZSA8IHNpemVvZiAoc3RydWN0IGluX2FkZHIpKQorICAgIHJldHVybiBOVUxMOworCisgIGFkZHIgPSBkYXRhOworCisgIG1lc3NhZ2UgPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX0lQX1JFQ1ZEU1RBRERSX01FU1NBR0UsIE5VTEwpOworICBtZXNzYWdlLT5hZGRyID0gKmFkZHI7CisKKyAgcmV0dXJuIEdfU09DS0VUX0NPTlRST0xfTUVTU0FHRSAobWVzc2FnZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaXBfcmVjdmRzdGFkZHJfbWVzc2FnZV9pbml0IChHc3RJUFJlY3Zkc3RhZGRyTWVzc2FnZSAqIG1lc3NhZ2UpCit7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaXBfcmVjdmRzdGFkZHJfbWVzc2FnZV9jbGFzc19pbml0IChHc3RJUFJlY3Zkc3RhZGRyTWVzc2FnZUNsYXNzICogY2xhc3MpCit7CisgIEdTb2NrZXRDb250cm9sTWVzc2FnZUNsYXNzICpzY21fY2xhc3M7CisKKyAgc2NtX2NsYXNzID0gR19TT0NLRVRfQ09OVFJPTF9NRVNTQUdFX0NMQVNTIChjbGFzcyk7CisgIHNjbV9jbGFzcy0+Z2V0X3NpemUgPSBnc3RfaXBfcmVjdmRzdGFkZHJfbWVzc2FnZV9nZXRfc2l6ZTsKKyAgc2NtX2NsYXNzLT5nZXRfbGV2ZWwgPSBnc3RfaXBfcmVjdmRzdGFkZHJfbWVzc2FnZV9nZXRfbGV2ZWw7CisgIHNjbV9jbGFzcy0+Z2V0X3R5cGUgPSBnc3RfaXBfcmVjdmRzdGFkZHJfbWVzc2FnZV9nZXRfbXNnX3R5cGU7CisgIHNjbV9jbGFzcy0+ZGVzZXJpYWxpemUgPSBnc3RfaXBfcmVjdmRzdGFkZHJfbWVzc2FnZV9kZXNlcmlhbGl6ZTsKK30KKyNlbmRpZgorCisvKiBub3QgMTAwJSBjb3JyZWN0LCBidXQgYSBnb29kIHVwcGVyIGJvdW5kIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBwdXJwb3NlcyAqLworI2RlZmluZSBNQVhfSVBWNF9VRFBfUEFDS0VUX1NJWkUgKDY1NTM2IC0gOCkKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAodWRwc3JjX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUICh1ZHBzcmNfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKKyNkZWZpbmUgVURQX0RFRkFVTFRfUE9SVCAgICAgICAgICAgICAgICA1MDA0CisjZGVmaW5lIFVEUF9ERUZBVUxUX01VTFRJQ0FTVF9HUk9VUCAgICAgIjAuMC4wLjAiCisjZGVmaW5lIFVEUF9ERUZBVUxUX01VTFRJQ0FTVF9JRkFDRSAgICAgTlVMTAorI2RlZmluZSBVRFBfREVGQVVMVF9VUkkgICAgICAgICAgICAgICAgICJ1ZHA6Ly8iVURQX0RFRkFVTFRfTVVMVElDQVNUX0dST1VQIjoiR19TVFJJTkdJRlkoVURQX0RFRkFVTFRfUE9SVCkKKyNkZWZpbmUgVURQX0RFRkFVTFRfQ0FQUyAgICAgICAgICAgICAgICBOVUxMCisjZGVmaW5lIFVEUF9ERUZBVUxUX1NPQ0tFVCAgICAgICAgICAgICAgTlVMTAorI2RlZmluZSBVRFBfREVGQVVMVF9CVUZGRVJfU0laRQkJMAorI2RlZmluZSBVRFBfREVGQVVMVF9USU1FT1VUICAgICAgICAgICAgIDAKKyNkZWZpbmUgVURQX0RFRkFVTFRfU0tJUF9GSVJTVF9CWVRFUwkwCisjZGVmaW5lIFVEUF9ERUZBVUxUX0NMT1NFX1NPQ0tFVCAgICAgICBUUlVFCisjZGVmaW5lIFVEUF9ERUZBVUxUX1VTRURfU09DS0VUICAgICAgICBOVUxMCisjZGVmaW5lIFVEUF9ERUZBVUxUX0FVVE9fTVVMVElDQVNUICAgICBUUlVFCisjZGVmaW5lIFVEUF9ERUZBVUxUX1JFVVNFICAgICAgICAgICAgICBUUlVFCisjZGVmaW5lIFVEUF9ERUZBVUxUX0xPT1AgICAgICAgICAgICAgICBUUlVFCisjZGVmaW5lIFVEUF9ERUZBVUxUX1JFVFJJRVZFX1NFTkRFUl9BRERSRVNTIFRSVUUKKworZW51bQoreworICBQUk9QXzAsCisKKyAgUFJPUF9QT1JULAorICBQUk9QX01VTFRJQ0FTVF9HUk9VUCwKKyAgUFJPUF9NVUxUSUNBU1RfSUZBQ0UsCisgIFBST1BfVVJJLAorICBQUk9QX0NBUFMsCisgIFBST1BfU09DS0VULAorICBQUk9QX0JVRkZFUl9TSVpFLAorICBQUk9QX1RJTUVPVVQsCisgIFBST1BfU0tJUF9GSVJTVF9CWVRFUywKKyAgUFJPUF9DTE9TRV9TT0NLRVQsCisgIFBST1BfVVNFRF9TT0NLRVQsCisgIFBST1BfQVVUT19NVUxUSUNBU1QsCisgIFBST1BfUkVVU0UsCisgIFBST1BfQUREUkVTUywKKyAgUFJPUF9MT09QLAorICBQUk9QX1JFVFJJRVZFX1NFTkRFUl9BRERSRVNTCit9OworCitzdGF0aWMgdm9pZCBnc3RfdWRwc3JjX3VyaV9oYW5kbGVyX2luaXQgKGdwb2ludGVyIGdfaWZhY2UsIGdwb2ludGVyIGlmYWNlX2RhdGEpOworCitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3VkcHNyY19nZXRjYXBzIChHc3RCYXNlU3JjICogc3JjLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF91ZHBzcmNfY3JlYXRlIChHc3RQdXNoU3JjICogcHNyYywgR3N0QnVmZmVyICoqIGJ1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3VkcHNyY19jbG9zZSAoR3N0VURQU3JjICogc3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdWRwc3JjX3VubG9jayAoR3N0QmFzZVNyYyAqIGJzcmMpOworc3RhdGljIGdib29sZWFuIGdzdF91ZHBzcmNfdW5sb2NrX3N0b3AgKEdzdEJhc2VTcmMgKiBic3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdWRwc3JjX25lZ290aWF0ZSAoR3N0QmFzZVNyYyAqIGJhc2VzcmMpOworCitzdGF0aWMgdm9pZCBnc3RfdWRwc3JjX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIHZvaWQgZ3N0X3VkcHNyY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfdWRwc3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF91ZHBzcmNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworI2RlZmluZSBnc3RfdWRwc3JjX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RVRFBTcmMsIGdzdF91ZHBzcmMsIEdTVF9UWVBFX1BVU0hfU1JDLAorICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfVVJJX0hBTkRMRVIsIGdzdF91ZHBzcmNfdXJpX2hhbmRsZXJfaW5pdCkpOworCitzdGF0aWMgdm9pZAorZ3N0X3VkcHNyY19jbGFzc19pbml0IChHc3RVRFBTcmNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0QmFzZVNyY0NsYXNzICpnc3RiYXNlc3JjX2NsYXNzOworICBHc3RQdXNoU3JjQ2xhc3MgKmdzdHB1c2hzcmNfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RiYXNlc3JjX2NsYXNzID0gKEdzdEJhc2VTcmNDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cHVzaHNyY19jbGFzcyA9IChHc3RQdXNoU3JjQ2xhc3MgKikga2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHVkcHNyY19kZWJ1ZywgInVkcHNyYyIsIDAsICJVRFAgc3JjIik7CisKKyNpZmRlZiBJUF9QS1RJTkZPCisgIEdTVF9UWVBFX0lQX1BLVElORk9fTUVTU0FHRTsKKyNlbmRpZgorI2lmZGVmIElQVjZfUEtUSU5GTworICBHU1RfVFlQRV9JUFY2X1BLVElORk9fTUVTU0FHRTsKKyNlbmRpZgorI2lmZGVmIElQX1JFQ1ZEU1RBRERSCisgIEdTVF9UWVBFX0lQX1JFQ1ZEU1RBRERSX01FU1NBR0U7CisjZW5kaWYKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdWRwc3JjX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3VkcHNyY19nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3VkcHNyY19maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1BPUlQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicG9ydCIsICJQb3J0IiwKKyAgICAgICAgICAiVGhlIHBvcnQgdG8gcmVjZWl2ZSB0aGUgcGFja2V0cyBmcm9tLCAwPWFsbG9jYXRlIiwgMCwgR19NQVhVSU5UMTYsCisgICAgICAgICAgVURQX0RFRkFVTFRfUE9SVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qIEZJWE1FIDIuMDogUmVtb3ZlIG11bHRpY2FzdC1ncm91cCBwcm9wZXJ0eSAqLworI2lmbmRlZiBHU1RfUkVNT1ZFX0RFUFJFQ0FURUQKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NVUxUSUNBU1RfR1JPVVAsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgibXVsdGljYXN0LWdyb3VwIiwgIk11bHRpY2FzdCBHcm91cCIsCisgICAgICAgICAgIlRoZSBBZGRyZXNzIG9mIG11bHRpY2FzdCBncm91cCB0byBqb2luLiAoREVQUkVDQVRFRDogIgorICAgICAgICAgICJVc2UgYWRkcmVzcyBwcm9wZXJ0eSBpbnN0ZWFkKSIsIFVEUF9ERUZBVUxUX01VTFRJQ0FTVF9HUk9VUCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHX1BBUkFNX0RFUFJFQ0FURUQpKTsKKyNlbmRpZgorICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01VTFRJQ0FTVF9JRkFDRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJtdWx0aWNhc3QtaWZhY2UiLCAiTXVsdGljYXN0IEludGVyZmFjZSIsCisgICAgICAgICAgIlRoZSBuZXR3b3JrIGludGVyZmFjZSBvbiB3aGljaCB0byBqb2luIHRoZSBtdWx0aWNhc3QgZ3JvdXAuIgorICAgICAgICAgICJUaGlzIGFsbG93cyBtdWx0aXBsZSBpbnRlcmZhY2VzIHNlcGVyYXRlZCBieSBjb21tYS4gKFwiZXRoMCxldGgxXCIpIiwKKyAgICAgICAgICBVRFBfREVGQVVMVF9NVUxUSUNBU1RfSUZBQ0UsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVVJJLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInVyaSIsICJVUkkiLAorICAgICAgICAgICJVUkkgaW4gdGhlIGZvcm0gb2YgdWRwOi8vbXVsdGljYXN0X2dyb3VwOnBvcnQiLCBVRFBfREVGQVVMVF9VUkksCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ0FQUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoImNhcHMiLCAiQ2FwcyIsCisgICAgICAgICAgIlRoZSBjYXBzIG9mIHRoZSBzb3VyY2UgcGFkIiwgR1NUX1RZUEVfQ0FQUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TT0NLRVQsCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgic29ja2V0IiwgIlNvY2tldCIsCisgICAgICAgICAgIlNvY2tldCB0byB1c2UgZm9yIFVEUCByZWNlcHRpb24uIChOVUxMID09IGFsbG9jYXRlKSIsCisgICAgICAgICAgR19UWVBFX1NPQ0tFVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQlVGRkVSX1NJWkUsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiYnVmZmVyLXNpemUiLCAiQnVmZmVyIFNpemUiLAorICAgICAgICAgICJTaXplIG9mIHRoZSBrZXJuZWwgcmVjZWl2ZSBidWZmZXIgaW4gYnl0ZXMsIDA9ZGVmYXVsdCIsIDAsIEdfTUFYSU5ULAorICAgICAgICAgIFVEUF9ERUZBVUxUX0JVRkZFUl9TSVpFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9USU1FT1VULAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoInRpbWVvdXQiLCAiVGltZW91dCIsCisgICAgICAgICAgIlBvc3QgYSBtZXNzYWdlIGFmdGVyIHRpbWVvdXQgbmFub3NlY29uZHMgKDAgPSBkaXNhYmxlZCkiLCAwLAorICAgICAgICAgIEdfTUFYVUlOVDY0LCBVRFBfREVGQVVMVF9USU1FT1VULAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLAorICAgICAgUFJPUF9TS0lQX0ZJUlNUX0JZVEVTLCBnX3BhcmFtX3NwZWNfaW50ICgic2tpcC1maXJzdC1ieXRlcyIsCisgICAgICAgICAgIlNraXAgZmlyc3QgYnl0ZXMiLCAibnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAgZm9yIGVhY2ggdWRwIHBhY2tldCIsIDAsCisgICAgICAgICAgR19NQVhJTlQsIFVEUF9ERUZBVUxUX1NLSVBfRklSU1RfQllURVMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ0xPU0VfU09DS0VULAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJjbG9zZS1zb2NrZXQiLCAiQ2xvc2Ugc29ja2V0IiwKKyAgICAgICAgICAiQ2xvc2Ugc29ja2V0IGlmIHBhc3NlZCBhcyBwcm9wZXJ0eSBvbiBzdGF0ZSBjaGFuZ2UiLAorICAgICAgICAgIFVEUF9ERUZBVUxUX0NMT1NFX1NPQ0tFVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9VU0VEX1NPQ0tFVCwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJ1c2VkLXNvY2tldCIsICJTb2NrZXQgSGFuZGxlIiwKKyAgICAgICAgICAiU29ja2V0IGN1cnJlbnRseSBpbiB1c2UgZm9yIFVEUCByZWNlcHRpb24uIChOVUxMID0gbm8gc29ja2V0KSIsCisgICAgICAgICAgR19UWVBFX1NPQ0tFVCwgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9BVVRPX01VTFRJQ0FTVCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiYXV0by1tdWx0aWNhc3QiLCAiQXV0byBNdWx0aWNhc3QiLAorICAgICAgICAgICJBdXRvbWF0aWNhbGx5IGpvaW4vbGVhdmUgbXVsdGljYXN0IGdyb3VwcyIsCisgICAgICAgICAgVURQX0RFRkFVTFRfQVVUT19NVUxUSUNBU1QsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkVVU0UsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInJldXNlIiwgIlJldXNlIiwgIkVuYWJsZSByZXVzZSBvZiB0aGUgcG9ydCIsCisgICAgICAgICAgVURQX0RFRkFVTFRfUkVVU0UsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0FERFJFU1MsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiYWRkcmVzcyIsICJBZGRyZXNzIiwKKyAgICAgICAgICAiQWRkcmVzcyB0byByZWNlaXZlIHBhY2tldHMgZm9yLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlICIKKyAgICAgICAgICAibXVsdGljYXN0LWdyb3VwIHByb3BlcnR5IGZvciBub3ciLCBVRFBfREVGQVVMVF9NVUxUSUNBU1RfR1JPVVAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RVRFBTcmM6Omxvb3A6CisgICAqCisgICAqIENhbiBiZSB1c2VkIHRvIGRpc2FibGUgbXVsdGljYXN0IGxvb3BiYWNrLgorICAgKgorICAgKiBTaW5jZTogMS44CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0xPT1AsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImxvb3AiLCAiTXVsdGljYXN0IExvb3BiYWNrIiwKKyAgICAgICAgICAiVXNlZCBmb3Igc2V0dGluZyB0aGUgbXVsdGljYXN0IGxvb3AgcGFyYW1ldGVyLiBUUlVFID0gZW5hYmxlLCIKKyAgICAgICAgICAiIEZBTFNFID0gZGlzYWJsZSIsIFVEUF9ERUZBVUxUX0xPT1AsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RVRFBTcmM6OnJldHJpZXZlLXNlbmRlci1hZGRyZXNzOgorICAgKgorICAgKiBXaGV0aGVyIHRvIHJldHJpZXZlIHRoZSBzZW5kZXIgYWRkcmVzcyBhbmQgYWRkIGl0IHRvIHRoZSBidWZmZXJzIGFzCisgICAqIG1ldGEuIERpc2FibGluZyB0aGlzIG1pZ2h0IHJlc3VsdCBpbiBtaW5vciBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMKKyAgICogaW4gY2VydGFpbiBzY2VuYXJpb3MuCisgICAqCisgICAqIFNpbmNlOiAxLjEwCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JFVFJJRVZFX1NFTkRFUl9BRERSRVNTLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJyZXRyaWV2ZS1zZW5kZXItYWRkcmVzcyIsCisgICAgICAgICAgIlJldHJpZXZlIFNlbmRlciBBZGRyZXNzIiwKKyAgICAgICAgICAiV2hldGhlciB0byByZXRyaWV2ZSB0aGUgc2VuZGVyIGFkZHJlc3MgYW5kIGFkZCBpdCB0byBidWZmZXJzIGFzICIKKyAgICAgICAgICAibWV0YS4gRGlzYWJsaW5nIHRoaXMgbWlnaHQgcmVzdWx0IGluIG1pbm9yIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyAiCisgICAgICAgICAgImluIGNlcnRhaW4gc2NlbmFyaW9zIiwgVURQX0RFRkFVTFRfUkVUUklFVkVfU0VOREVSX0FERFJFU1MsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiVURQIHBhY2tldCByZWNlaXZlciIsICJTb3VyY2UvTmV0d29yayIsCisgICAgICAiUmVjZWl2ZSBkYXRhIG92ZXIgdGhlIG5ldHdvcmsgdmlhIFVEUCIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4sICIKKyAgICAgICJUaGlqcyBWZXJtZWlyIDx0aGlqcy52ZXJtZWlyQGJhcmNvLmNvbT4iKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfdWRwc3JjX2NoYW5nZV9zdGF0ZTsKKworICBnc3RiYXNlc3JjX2NsYXNzLT51bmxvY2sgPSBnc3RfdWRwc3JjX3VubG9jazsKKyAgZ3N0YmFzZXNyY19jbGFzcy0+dW5sb2NrX3N0b3AgPSBnc3RfdWRwc3JjX3VubG9ja19zdG9wOworICBnc3RiYXNlc3JjX2NsYXNzLT5nZXRfY2FwcyA9IGdzdF91ZHBzcmNfZ2V0Y2FwczsKKyAgZ3N0YmFzZXNyY19jbGFzcy0+bmVnb3RpYXRlID0gZ3N0X3VkcHNyY19uZWdvdGlhdGU7CisKKyAgZ3N0cHVzaHNyY19jbGFzcy0+Y3JlYXRlID0gZ3N0X3VkcHNyY19jcmVhdGU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdWRwc3JjX2luaXQgKEdzdFVEUFNyYyAqIHVkcHNyYykKK3sKKyAgdWRwc3JjLT51cmkgPQorICAgICAgZ19zdHJkdXBfcHJpbnRmICgidWRwOi8vJXM6JXUiLCBVRFBfREVGQVVMVF9NVUxUSUNBU1RfR1JPVVAsCisgICAgICBVRFBfREVGQVVMVF9QT1JUKTsKKworICB1ZHBzcmMtPmFkZHJlc3MgPSBnX3N0cmR1cCAoVURQX0RFRkFVTFRfTVVMVElDQVNUX0dST1VQKTsKKyAgdWRwc3JjLT5wb3J0ID0gVURQX0RFRkFVTFRfUE9SVDsKKyAgdWRwc3JjLT5zb2NrZXQgPSBVRFBfREVGQVVMVF9TT0NLRVQ7CisgIHVkcHNyYy0+bXVsdGlfaWZhY2UgPSBnX3N0cmR1cCAoVURQX0RFRkFVTFRfTVVMVElDQVNUX0lGQUNFKTsKKyAgdWRwc3JjLT5idWZmZXJfc2l6ZSA9IFVEUF9ERUZBVUxUX0JVRkZFUl9TSVpFOworICB1ZHBzcmMtPnRpbWVvdXQgPSBVRFBfREVGQVVMVF9USU1FT1VUOworICB1ZHBzcmMtPnNraXBfZmlyc3RfYnl0ZXMgPSBVRFBfREVGQVVMVF9TS0lQX0ZJUlNUX0JZVEVTOworICB1ZHBzcmMtPmNsb3NlX3NvY2tldCA9IFVEUF9ERUZBVUxUX0NMT1NFX1NPQ0tFVDsKKyAgdWRwc3JjLT5leHRlcm5hbF9zb2NrZXQgPSAodWRwc3JjLT5zb2NrZXQgIT0gTlVMTCk7CisgIHVkcHNyYy0+YXV0b19tdWx0aWNhc3QgPSBVRFBfREVGQVVMVF9BVVRPX01VTFRJQ0FTVDsKKyAgdWRwc3JjLT51c2VkX3NvY2tldCA9IFVEUF9ERUZBVUxUX1VTRURfU09DS0VUOworICB1ZHBzcmMtPnJldXNlID0gVURQX0RFRkFVTFRfUkVVU0U7CisgIHVkcHNyYy0+bG9vcCA9IFVEUF9ERUZBVUxUX0xPT1A7CisgIHVkcHNyYy0+cmV0cmlldmVfc2VuZGVyX2FkZHJlc3MgPSBVRFBfREVGQVVMVF9SRVRSSUVWRV9TRU5ERVJfQUREUkVTUzsKKworICAvKiBjb25maWd1cmUgYmFzZXNyYyB0byBiZSBhIGxpdmUgc291cmNlICovCisgIGdzdF9iYXNlX3NyY19zZXRfbGl2ZSAoR1NUX0JBU0VfU1JDICh1ZHBzcmMpLCBUUlVFKTsKKyAgLyogbWFrZSBiYXNlc3JjIG91dHB1dCBhIHNlZ21lbnQgaW4gdGltZSAqLworICBnc3RfYmFzZV9zcmNfc2V0X2Zvcm1hdCAoR1NUX0JBU0VfU1JDICh1ZHBzcmMpLCBHU1RfRk9STUFUX1RJTUUpOworICAvKiBtYWtlIGJhc2VzcmMgc2V0IHRpbWVzdGFtcHMgb24gb3V0Z29pbmcgYnVmZmVycyBiYXNlZCBvbiB0aGUgcnVubmluZ190aW1lCisgICAqIHdoZW4gdGhleSB3ZXJlIGNhcHR1cmVkICovCisgIGdzdF9iYXNlX3NyY19zZXRfZG9fdGltZXN0YW1wIChHU1RfQkFTRV9TUkMgKHVkcHNyYyksIFRSVUUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3VkcHNyY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0VURQU3JjICp1ZHBzcmM7CisKKyAgdWRwc3JjID0gR1NUX1VEUFNSQyAob2JqZWN0KTsKKworICBpZiAodWRwc3JjLT5jYXBzKQorICAgIGdzdF9jYXBzX3VucmVmICh1ZHBzcmMtPmNhcHMpOworICB1ZHBzcmMtPmNhcHMgPSBOVUxMOworCisgIGdfZnJlZSAodWRwc3JjLT5tdWx0aV9pZmFjZSk7CisgIHVkcHNyYy0+bXVsdGlfaWZhY2UgPSBOVUxMOworCisgIGdfZnJlZSAodWRwc3JjLT51cmkpOworICB1ZHBzcmMtPnVyaSA9IE5VTEw7CisKKyAgZ19mcmVlICh1ZHBzcmMtPmFkZHJlc3MpOworICB1ZHBzcmMtPmFkZHJlc3MgPSBOVUxMOworCisgIGlmICh1ZHBzcmMtPnNvY2tldCkKKyAgICBnX29iamVjdF91bnJlZiAodWRwc3JjLT5zb2NrZXQpOworICB1ZHBzcmMtPnNvY2tldCA9IE5VTEw7CisKKyAgaWYgKHVkcHNyYy0+dXNlZF9zb2NrZXQpCisgICAgZ19vYmplY3RfdW5yZWYgKHVkcHNyYy0+dXNlZF9zb2NrZXQpOworICB1ZHBzcmMtPnVzZWRfc29ja2V0ID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF91ZHBzcmNfZ2V0Y2FwcyAoR3N0QmFzZVNyYyAqIHNyYywgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0VURQU3JjICp1ZHBzcmM7CisgIEdzdENhcHMgKmNhcHMsICpyZXN1bHQ7CisKKyAgdWRwc3JjID0gR1NUX1VEUFNSQyAoc3JjKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHNyYyk7CisgIGlmICgoY2FwcyA9IHVkcHNyYy0+Y2FwcykpCisgICAgZ3N0X2NhcHNfcmVmIChjYXBzKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7CisKKyAgaWYgKGNhcHMpIHsKKyAgICBpZiAoZmlsdGVyKSB7CisgICAgICByZXN1bHQgPSBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCBjYXBzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgPSBjYXBzOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSAoZmlsdGVyKSA/IGdzdF9jYXBzX3JlZiAoZmlsdGVyKSA6IGdzdF9jYXBzX25ld19hbnkgKCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2dzdF91ZHBzcmNfcmVzZXRfbWVtb3J5X2FsbG9jYXRvciAoR3N0VURQU3JjICogc3JjKQoreworICBpZiAoc3JjLT5tZW0gIT0gTlVMTCkgeworICAgIGdzdF9tZW1vcnlfdW5tYXAgKHNyYy0+bWVtLCAmc3JjLT5tYXApOworICAgIGdzdF9tZW1vcnlfdW5yZWYgKHNyYy0+bWVtKTsKKyAgICBzcmMtPm1lbSA9IE5VTEw7CisgIH0KKyAgaWYgKHNyYy0+bWVtX21heCAhPSBOVUxMKSB7CisgICAgZ3N0X21lbW9yeV91bm1hcCAoc3JjLT5tZW1fbWF4LCAmc3JjLT5tYXBfbWF4KTsKKyAgICBnc3RfbWVtb3J5X3VucmVmIChzcmMtPm1lbV9tYXgpOworICAgIHNyYy0+bWVtX21heCA9IE5VTEw7CisgIH0KKworICBzcmMtPnZlY1swXS5idWZmZXIgPSBOVUxMOworICBzcmMtPnZlY1swXS5zaXplID0gMDsKKyAgc3JjLT52ZWNbMV0uYnVmZmVyID0gTlVMTDsKKyAgc3JjLT52ZWNbMV0uc2l6ZSA9IDA7CisKKyAgaWYgKHNyYy0+YWxsb2NhdG9yICE9IE5VTEwpIHsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzcmMtPmFsbG9jYXRvcik7CisgICAgc3JjLT5hbGxvY2F0b3IgPSBOVUxMOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3VkcHNyY19uZWdvdGlhdGUgKEdzdEJhc2VTcmMgKiBiYXNlc3JjKQoreworICBHc3RVRFBTcmMgKnNyYyA9IEdTVF9VRFBTUkNfQ0FTVCAoYmFzZXNyYyk7CisgIGdib29sZWFuIHJldDsKKworICAvKiBqdXN0IGNoYWluIHVwIHRvIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLCB3ZSBqdXN0IHdhbnQgdG8KKyAgICogcmV0cmlldmUgdGhlIGFsbG9jYXRvciBhdCB0aGUgZW5kIG9mIGl0IChpZiB0aGVyZSBpcyBvbmUpICovCisgIHJldCA9IEdTVF9CQVNFX1NSQ19DTEFTUyAocGFyZW50X2NsYXNzKS0+bmVnb3RpYXRlIChiYXNlc3JjKTsKKworICBpZiAocmV0KSB7CisgICAgR3N0QWxsb2NhdGlvblBhcmFtcyBuZXdfcGFyYW1zOworICAgIEdzdEFsbG9jYXRvciAqbmV3X2FsbG9jYXRvciA9IE5VTEw7CisKKyAgICAvKiByZXRyaWV2ZSBuZXcgYWxsb2NhdG9yICovCisgICAgZ3N0X2Jhc2Vfc3JjX2dldF9hbGxvY2F0b3IgKGJhc2VzcmMsICZuZXdfYWxsb2NhdG9yLCAmbmV3X3BhcmFtcyk7CisKKyAgICBpZiAoc3JjLT5hbGxvY2F0b3IgIT0gbmV3X2FsbG9jYXRvciB8fAorICAgICAgICBtZW1jbXAgKCZzcmMtPnBhcmFtcywgJm5ld19wYXJhbXMsIHNpemVvZiAoR3N0QWxsb2NhdGlvblBhcmFtcykpICE9IDApIHsKKyAgICAgIC8qIGRyb3Agb2xkIGFsbG9jYXRvciBhbmQgdGhyb3cgYXdheSBhbnkgbWVtb3J5IGFsbG9jYXRlZCB3aXRoIGl0ICovCisgICAgICBnc3RfdWRwc3JjX3Jlc2V0X21lbW9yeV9hbGxvY2F0b3IgKHNyYyk7CisKKyAgICAgIC8qIGFuZCBzYXZlIHRoZSBuZXcgYWxsb2NhdG9yIGFuZC9vciBuZXcgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzICovCisgICAgICBzcmMtPmFsbG9jYXRvciA9IG5ld19hbGxvY2F0b3I7CisgICAgICBzcmMtPnBhcmFtcyA9IG5ld19wYXJhbXM7CisKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoc3JjLCAibmV3IGFsbG9jYXRvcjogJSIgR1NUX1BUUl9GT1JNQVQsIG5ld19hbGxvY2F0b3IpOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3VkcHNyY19hbGxvY19tZW0gKEdzdFVEUFNyYyAqIHNyYywgR3N0TWVtb3J5ICoqIHBfbWVtLCBHc3RNYXBJbmZvICogbWFwLAorICAgIGdzaXplIHNpemUpCit7CisgIEdzdE1lbW9yeSAqbWVtOworCisgIG1lbSA9IGdzdF9hbGxvY2F0b3JfYWxsb2MgKHNyYy0+YWxsb2NhdG9yLCBzaXplLCAmc3JjLT5wYXJhbXMpOworCisgIGlmICghZ3N0X21lbW9yeV9tYXAgKG1lbSwgbWFwLCBHU1RfTUFQX1dSSVRFKSkgeworICAgIGdzdF9tZW1vcnlfdW5yZWYgKG1lbSk7CisgICAgbWVtc2V0IChtYXAsIDAsIHNpemVvZiAoR3N0TWFwSW5mbykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICAqcF9tZW0gPSBtZW07CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF91ZHBzcmNfZW5zdXJlX21lbSAoR3N0VURQU3JjICogc3JjKQoreworICBpZiAoc3JjLT5tZW0gPT0gTlVMTCkgeworICAgIGdzaXplIG1lbV9zaXplID0gMTUwMDsgICAgICAvKiB0eXBpY2FsIG1heC4gTVRVICovCisKKyAgICAvKiBpZiBwYWNrZXRzIGFyZSBsaWtlbHkgdG8gYmUgc21hbGxlciwganVzdCB1c2UgdGhhdCBzaXplLCBvdGhlcndpc2UKKyAgICAgKiBkZWZhdWx0IHRvIGFzc3VtaW5nIGluY29taW5nIHBhY2tldHMgYXJlIGFyb3VuZCBNVFUgc2l6ZSAqLworICAgIGlmIChzcmMtPm1heF9zaXplID4gMCAmJiBzcmMtPm1heF9zaXplIDwgbWVtX3NpemUpCisgICAgICBtZW1fc2l6ZSA9IHNyYy0+bWF4X3NpemU7CisKKyAgICBpZiAoIWdzdF91ZHBzcmNfYWxsb2NfbWVtIChzcmMsICZzcmMtPm1lbSwgJnNyYy0+bWFwLCBtZW1fc2l6ZSkpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBzcmMtPnZlY1swXS5idWZmZXIgPSBzcmMtPm1hcC5kYXRhOworICAgIHNyYy0+dmVjWzBdLnNpemUgPSBzcmMtPm1hcC5zaXplOworICB9CisKKyAgaWYgKHNyYy0+bWVtX21heCA9PSBOVUxMKSB7CisgICAgZ3NpemUgbWF4X3NpemUgPSBNQVhfSVBWNF9VRFBfUEFDS0VUX1NJWkU7CisKKyAgICBpZiAoIWdzdF91ZHBzcmNfYWxsb2NfbWVtIChzcmMsICZzcmMtPm1lbV9tYXgsICZzcmMtPm1hcF9tYXgsIG1heF9zaXplKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHNyYy0+dmVjWzFdLmJ1ZmZlciA9IHNyYy0+bWFwX21heC5kYXRhOworICAgIHNyYy0+dmVjWzFdLnNpemUgPSBzcmMtPm1hcF9tYXguc2l6ZTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3VkcHNyY19jcmVhdGVfY2FuY2VsbGFibGUgKEdzdFVEUFNyYyAqIHNyYykKK3sKKyAgR1BvbGxGRCBwb2xsZmQ7CisKKyAgc3JjLT5jYW5jZWxsYWJsZSA9IGdfY2FuY2VsbGFibGVfbmV3ICgpOworICBzcmMtPm1hZGVfY2FuY2VsX2ZkID0gZ19jYW5jZWxsYWJsZV9tYWtlX3BvbGxmZCAoc3JjLT5jYW5jZWxsYWJsZSwgJnBvbGxmZCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdWRwc3JjX2ZyZWVfY2FuY2VsbGFibGUgKEdzdFVEUFNyYyAqIHNyYykKK3sKKyAgaWYgKHNyYy0+bWFkZV9jYW5jZWxfZmQpIHsKKyAgICBnX2NhbmNlbGxhYmxlX3JlbGVhc2VfZmQgKHNyYy0+Y2FuY2VsbGFibGUpOworICAgIHNyYy0+bWFkZV9jYW5jZWxfZmQgPSBGQUxTRTsKKyAgfQorICBnX29iamVjdF91bnJlZiAoc3JjLT5jYW5jZWxsYWJsZSk7CisgIHNyYy0+Y2FuY2VsbGFibGUgPSBOVUxMOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3VkcHNyY19jcmVhdGUgKEdzdFB1c2hTcmMgKiBwc3JjLCBHc3RCdWZmZXIgKiogYnVmKQoreworICBHc3RVRFBTcmMgKnVkcHNyYzsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBHU29ja2V0QWRkcmVzcyAqc2FkZHIgPSBOVUxMOworICBHU29ja2V0QWRkcmVzcyAqKnBfc2FkZHI7CisgIGdpbnQgZmxhZ3MgPSBHX1NPQ0tFVF9NU0dfTk9ORTsKKyAgZ2Jvb2xlYW4gdHJ5X2FnYWluOworICBHRXJyb3IgKmVyciA9IE5VTEw7CisgIGdzc2l6ZSByZXM7CisgIGdzaXplIG9mZnNldDsKKyAgR1NvY2tldENvbnRyb2xNZXNzYWdlICoqbXNncyA9IE5VTEw7CisgIEdTb2NrZXRDb250cm9sTWVzc2FnZSAqKipwX21zZ3M7CisgIGdpbnQgbl9tc2dzID0gMCwgaTsKKworICB1ZHBzcmMgPSBHU1RfVURQU1JDX0NBU1QgKHBzcmMpOworCisgIGlmICghZ3N0X3VkcHNyY19lbnN1cmVfbWVtICh1ZHBzcmMpKQorICAgIGdvdG8gbWVtb3J5X2FsbG9jX2Vycm9yOworCisgIC8qIG9wdGltaXphdGlvbjogdXNlIG1lc3NhZ2VzIG9ubHkgaW4gbXVsdGljYXN0IG1vZGUgYW5kCisgICAqIGlmIHdlIGNhbid0IGxldCB0aGUga2VybmVsIGRvIHRoZSBmaWx0ZXJpbmcgZm9yIHVzICovCisgIHBfbXNncyA9CisgICAgICAoZ19pbmV0X2FkZHJlc3NfZ2V0X2lzX211bHRpY2FzdCAoZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9hZGRyZXNzCisgICAgICAgICAgKHVkcHNyYy0+YWRkcikpKSA/ICZtc2dzIDogTlVMTDsKKyNpZmRlZiBJUF9NVUxUSUNBU1RfQUxMCisgIGlmIChnX2luZXRfYWRkcmVzc19nZXRfZmFtaWx5IChnX2luZXRfc29ja2V0X2FkZHJlc3NfZ2V0X2FkZHJlc3MKKyAgICAgICAgICAodWRwc3JjLT5hZGRyKSkgPT0gR19TT0NLRVRfRkFNSUxZX0lQVjQpCisgICAgcF9tc2dzID0gTlVMTDsKKyNlbmRpZgorCisgIC8qIFJldHJpZXZlIHNlbmRlciBhZGRyZXNzIHVubGVzcyB3ZSd2ZSBiZWVuIGNvbmZpZ3VyZWQgbm90IHRvIGRvIHNvICovCisgIHBfc2FkZHIgPSAodWRwc3JjLT5yZXRyaWV2ZV9zZW5kZXJfYWRkcmVzcykgPyAmc2FkZHIgOiBOVUxMOworCityZXRyeToKKyAgaWYgKHNhZGRyICE9IE5VTEwpIHsKKyAgICBnX29iamVjdF91bnJlZiAoc2FkZHIpOworICAgIHNhZGRyID0gTlVMTDsKKyAgfQorCisgIGRvIHsKKyAgICBnaW50NjQgdGltZW91dDsKKworICAgIHRyeV9hZ2FpbiA9IEZBTFNFOworCisgICAgaWYgKHVkcHNyYy0+dGltZW91dCkKKyAgICAgIHRpbWVvdXQgPSB1ZHBzcmMtPnRpbWVvdXQgLyAxMDAwOworICAgIGVsc2UKKyAgICAgIHRpbWVvdXQgPSAtMTsKKworICAgIEdTVF9MT0dfT0JKRUNUICh1ZHBzcmMsICJkb2luZyBzZWxlY3QsIHRpbWVvdXQgJSIgR19HSU5UNjRfRk9STUFULCB0aW1lb3V0KTsKKworICAgIGlmICghZ19zb2NrZXRfY29uZGl0aW9uX3RpbWVkX3dhaXQgKHVkcHNyYy0+dXNlZF9zb2NrZXQsIEdfSU9fSU4gfCBHX0lPX1BSSSwKKyAgICAgICAgICAgIHRpbWVvdXQsIHVkcHNyYy0+Y2FuY2VsbGFibGUsICZlcnIpKSB7CisgICAgICBpZiAoZ19lcnJvcl9tYXRjaGVzIChlcnIsIEdfSU9fRVJST1IsIEdfSU9fRVJST1JfQlVTWSkKKyAgICAgICAgICB8fCBnX2Vycm9yX21hdGNoZXMgKGVyciwgR19JT19FUlJPUiwgR19JT19FUlJPUl9DQU5DRUxMRUQpKSB7CisgICAgICAgIGdvdG8gc3RvcHBlZDsKKyAgICAgIH0gZWxzZSBpZiAoZ19lcnJvcl9tYXRjaGVzIChlcnIsIEdfSU9fRVJST1IsIEdfSU9fRVJST1JfVElNRURfT1VUKSkgeworICAgICAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICAgICAgLyogdGltZW91dCwgcG9zdCBlbGVtZW50IG1lc3NhZ2UgKi8KKyAgICAgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUICh1ZHBzcmMpLAorICAgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2VsZW1lbnQgKEdTVF9PQkpFQ1RfQ0FTVCAodWRwc3JjKSwKKyAgICAgICAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoIkdzdFVEUFNyY1RpbWVvdXQiLAorICAgICAgICAgICAgICAgICAgICAidGltZW91dCIsIEdfVFlQRV9VSU5UNjQsIHVkcHNyYy0+dGltZW91dCwgTlVMTCkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdvdG8gc2VsZWN0X2Vycm9yOworICAgICAgfQorCisgICAgICB0cnlfYWdhaW4gPSBUUlVFOworICAgIH0KKyAgfSB3aGlsZSAoR19VTkxJS0VMWSAodHJ5X2FnYWluKSk7CisKKyAgcmVzID0KKyAgICAgIGdfc29ja2V0X3JlY2VpdmVfbWVzc2FnZSAodWRwc3JjLT51c2VkX3NvY2tldCwgcF9zYWRkciwgdWRwc3JjLT52ZWMsIDIsCisgICAgICBwX21zZ3MsICZuX21zZ3MsICZmbGFncywgdWRwc3JjLT5jYW5jZWxsYWJsZSwgJmVycik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHJlcyA8IDApKSB7CisgICAgLyogR19JT19FUlJPUl9IT1NUX1VOUkVBQ0hBQkxFIGZvciBhIFVEUCBzb2NrZXQgbWVhbnMgdGhhdCBhIHBhY2tldCBzZW50CisgICAgICogd2l0aCB1ZHBzaW5rIGdlbmVyYXRlZCBhICJwb3J0IHVucmVhY2hhYmxlIiBJQ01QIHJlc3BvbnNlLiBXZSBpZ25vcmUKKyAgICAgKiB0aGF0IGFuZCB0cnkgYWdhaW4uCisgICAgICogT24gV2luZG93cyB3ZSBnZXQgR19JT19FUlJPUl9DT05ORUNUSU9OX0NMT1NFRCBpbnN0ZWFkICovCisjaWYgR0xJQl9DSEVDS19WRVJTSU9OKDIsNDQsMCkKKyAgICBpZiAoZ19lcnJvcl9tYXRjaGVzIChlcnIsIEdfSU9fRVJST1IsIEdfSU9fRVJST1JfSE9TVF9VTlJFQUNIQUJMRSkgfHwKKyAgICAgICAgZ19lcnJvcl9tYXRjaGVzIChlcnIsIEdfSU9fRVJST1IsIEdfSU9fRVJST1JfQ09OTkVDVElPTl9DTE9TRUQpKSB7CisjZWxzZQorICAgIGlmIChnX2Vycm9yX21hdGNoZXMgKGVyciwgR19JT19FUlJPUiwgR19JT19FUlJPUl9IT1NUX1VOUkVBQ0hBQkxFKSkgeworI2VuZGlmCisgICAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorICAgIGdvdG8gcmVjZWl2ZV9lcnJvcjsKKyAgfQorCisgIC8qIHJlbWVtYmVyIG1heGltdW0gcGFja2V0IHNpemUgKi8KKyAgaWYgKHJlcyA+IHVkcHNyYy0+bWF4X3NpemUpCisgICAgdWRwc3JjLT5tYXhfc2l6ZSA9IHJlczsKKworICAvKiBSZXRyeSBpZiBtdWx0aWNhc3QgYW5kIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIG5vdCBvdXJzLiBXZSBkb24ndCB3YW50CisgICAqIHRvIHJlY2VpdmUgYXJiaXRyYXJ5IHBhY2tldHMgKi8KKyAgaWYgKHBfbXNncykgeworICAgIEdJbmV0QWRkcmVzcyAqaWFkZHIgPSBnX2luZXRfc29ja2V0X2FkZHJlc3NfZ2V0X2FkZHJlc3MgKHVkcHNyYy0+YWRkcik7CisgICAgZ2Jvb2xlYW4gc2tpcF9wYWNrZXQgPSBGQUxTRTsKKyAgICBnc2l6ZSBpYWRkcl9zaXplID0gZ19pbmV0X2FkZHJlc3NfZ2V0X25hdGl2ZV9zaXplIChpYWRkcik7CisgICAgY29uc3QgZ3VpbnQ4ICppYWRkcl9ieXRlcyA9IGdfaW5ldF9hZGRyZXNzX3RvX2J5dGVzIChpYWRkcik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbl9tc2dzICYmICFza2lwX3BhY2tldDsgaSsrKSB7CisjaWZkZWYgSVBfUEtUSU5GTworICAgICAgaWYgKEdTVF9JU19JUF9QS1RJTkZPX01FU1NBR0UgKG1zZ3NbaV0pKSB7CisgICAgICAgIEdzdElQUGt0aW5mb01lc3NhZ2UgKm1zZyA9IEdTVF9JUF9QS1RJTkZPX01FU1NBR0UgKG1zZ3NbaV0pOworCisgICAgICAgIGlmIChzaXplb2YgKG1zZy0+YWRkcikgPT0gaWFkZHJfc2l6ZQorICAgICAgICAgICAgJiYgbWVtY21wIChpYWRkcl9ieXRlcywgJm1zZy0+YWRkciwgc2l6ZW9mIChtc2ctPmFkZHIpKSkKKyAgICAgICAgICBza2lwX3BhY2tldCA9IFRSVUU7CisgICAgICB9CisjZW5kaWYKKyNpZmRlZiBJUFY2X1BLVElORk8KKyAgICAgIGlmIChHU1RfSVNfSVBWNl9QS1RJTkZPX01FU1NBR0UgKG1zZ3NbaV0pKSB7CisgICAgICAgIEdzdElQVjZQa3RpbmZvTWVzc2FnZSAqbXNnID0gR1NUX0lQVjZfUEtUSU5GT19NRVNTQUdFIChtc2dzW2ldKTsKKworICAgICAgICBpZiAoc2l6ZW9mIChtc2ctPmFkZHIpID09IGlhZGRyX3NpemUKKyAgICAgICAgICAgICYmIG1lbWNtcCAoaWFkZHJfYnl0ZXMsICZtc2ctPmFkZHIsIHNpemVvZiAobXNnLT5hZGRyKSkpCisgICAgICAgICAgc2tpcF9wYWNrZXQgPSBUUlVFOworICAgICAgfQorI2VuZGlmCisjaWZkZWYgSVBfUkVDVkRTVEFERFIKKyAgICAgIGlmIChHU1RfSVNfSVBfUkVDVkRTVEFERFJfTUVTU0FHRSAobXNnc1tpXSkpIHsKKyAgICAgICAgR3N0SVBSZWN2ZHN0YWRkck1lc3NhZ2UgKm1zZyA9IEdTVF9JUF9SRUNWRFNUQUREUl9NRVNTQUdFIChtc2dzW2ldKTsKKworICAgICAgICBpZiAoc2l6ZW9mIChtc2ctPmFkZHIpID09IGlhZGRyX3NpemUKKyAgICAgICAgICAgICYmIG1lbWNtcCAoaWFkZHJfYnl0ZXMsICZtc2ctPmFkZHIsIHNpemVvZiAobXNnLT5hZGRyKSkpCisgICAgICAgICAgc2tpcF9wYWNrZXQgPSBUUlVFOworICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG5fbXNnczsgaSsrKSB7CisgICAgICBnX29iamVjdF91bnJlZiAobXNnc1tpXSk7CisgICAgfQorICAgIGdfZnJlZSAobXNncyk7CisKKyAgICBpZiAoc2tpcF9wYWNrZXQpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHVkcHNyYywKKyAgICAgICAgICAiRHJvcHBpbmcgcGFja2V0IGZvciBhIGRpZmZlcmVudCBtdWx0aWNhc3QgYWRkcmVzcyIpOworICAgICAgZ290byByZXRyeTsKKyAgICB9CisgIH0KKworICBvdXRidWYgPSBnc3RfYnVmZmVyX25ldyAoKTsKKworICAvKiBhcHBlbmQgZmlyc3QgbWVtb3J5IGNodW5rIHRvIGJ1ZmZlciAqLworICBnc3RfYnVmZmVyX2FwcGVuZF9tZW1vcnkgKG91dGJ1ZiwgdWRwc3JjLT5tZW0pOworCisgIC8qIGlmIHRoZSBwYWNrZXQgZGlkbid0IGZpdCBpbnRvIHRoZSBmaXJzdCBjaHVuaywgYWRkIHNlY29uZCBvbmUgYXMgd2VsbCAqLworICBpZiAocmVzID4gdWRwc3JjLT5tYXAuc2l6ZSkgeworICAgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAob3V0YnVmLCB1ZHBzcmMtPm1lbV9tYXgpOworICAgIGdzdF9tZW1vcnlfdW5tYXAgKHVkcHNyYy0+bWVtX21heCwgJnVkcHNyYy0+bWFwX21heCk7CisgICAgdWRwc3JjLT52ZWNbMV0uYnVmZmVyID0gTlVMTDsKKyAgICB1ZHBzcmMtPnZlY1sxXS5zaXplID0gMDsKKyAgICB1ZHBzcmMtPm1lbV9tYXggPSBOVUxMOworICB9CisKKyAgLyogbWFrZSBzdXJlIHdlIGFsbG9jYXRlIGEgbmV3IGNodW5rIG5leHQgdGltZSAod2UgZG8gdGhpcyBvbmx5IGhlcmUgYmVjYXVzZQorICAgKiB3ZSBsb29rIGF0IG1hcC5zaXplIHRvIHNlZSBpZiB0aGUgc2Vjb25kIG1lbW9yeSBjaHVuayBpcyBuZWVkZWQgYWJvdmUpICovCisgIGdzdF9tZW1vcnlfdW5tYXAgKHVkcHNyYy0+bWVtLCAmdWRwc3JjLT5tYXApOworICB1ZHBzcmMtPnZlY1swXS5idWZmZXIgPSBOVUxMOworICB1ZHBzcmMtPnZlY1swXS5zaXplID0gMDsKKyAgdWRwc3JjLT5tZW0gPSBOVUxMOworCisgIG9mZnNldCA9IHVkcHNyYy0+c2tpcF9maXJzdF9ieXRlczsKKworICBpZiAoR19VTkxJS0VMWSAob2Zmc2V0ID4gMCAmJiByZXMgPCBvZmZzZXQpKQorICAgIGdvdG8gc2tpcF9lcnJvcjsKKworICBnc3RfYnVmZmVyX3Jlc2l6ZSAob3V0YnVmLCBvZmZzZXQsIHJlcyAtIG9mZnNldCk7CisKKyAgLyogdXNlIGJ1ZmZlciBtZXRhZGF0YSBzbyByZWNlaXZlcnMgY2FuIGFsc28gdHJhY2sgdGhlIGFkZHJlc3MgKi8KKyAgaWYgKHNhZGRyKSB7CisgICAgZ3N0X2J1ZmZlcl9hZGRfbmV0X2FkZHJlc3NfbWV0YSAob3V0YnVmLCBzYWRkcik7CisgICAgZ19vYmplY3RfdW5yZWYgKHNhZGRyKTsKKyAgICBzYWRkciA9IE5VTEw7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAodWRwc3JjLCAicmVhZCBwYWNrZXQgb2YgJWQgYnl0ZXMiLCAoaW50KSByZXMpOworCisgICpidWYgPSBHU1RfQlVGRkVSX0NBU1QgKG91dGJ1Zik7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIC8qIEVSUk9SUyAqLworbWVtb3J5X2FsbG9jX2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHVkcHNyYywgUkVTT1VSQ0UsIFJFQUQsIChOVUxMKSwKKyAgICAgICAgKCJGYWlsZWQgdG8gYWxsb2NhdGUgb3IgbWFwIG1lbW9yeSIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK3NlbGVjdF9lcnJvcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh1ZHBzcmMsIFJFU09VUkNFLCBSRUFELCAoTlVMTCksCisgICAgICAgICgic2VsZWN0IGVycm9yOiAlcyIsIGVyci0+bWVzc2FnZSkpOworICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorc3RvcHBlZDoKKyAgeworICAgIEdTVF9ERUJVRyAoInN0b3AgY2FsbGVkIik7CisgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICB9CityZWNlaXZlX2Vycm9yOgorICB7CisgICAgaWYgKGdfZXJyb3JfbWF0Y2hlcyAoZXJyLCBHX0lPX0VSUk9SLCBHX0lPX0VSUk9SX0JVU1kpIHx8CisgICAgICAgIGdfZXJyb3JfbWF0Y2hlcyAoZXJyLCBHX0lPX0VSUk9SLCBHX0lPX0VSUk9SX0NBTkNFTExFRCkpIHsKKyAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAodWRwc3JjLCBSRVNPVVJDRSwgUkVBRCwgKE5VTEwpLAorICAgICAgICAgICgicmVjZWl2ZSBlcnJvciAlIiBHX0dTU0laRV9GT1JNQVQgIjogJXMiLCByZXMsIGVyci0+bWVzc2FnZSkpOworICAgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgfQorICB9Citza2lwX2Vycm9yOgorICB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmKTsKKworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh1ZHBzcmMsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksCisgICAgICAgICgiVURQIGJ1ZmZlciB0byBzbWFsbCB0byBza2lwIGhlYWRlciIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdWRwc3JjX3NldF91cmkgKEdzdFVEUFNyYyAqIHNyYywgY29uc3QgZ2NoYXIgKiB1cmksIEdFcnJvciAqKiBlcnJvcikKK3sKKyAgZ2NoYXIgKmFkZHJlc3M7CisgIGd1aW50MTYgcG9ydDsKKworICBpZiAoIWdzdF91ZHBfcGFyc2VfdXJpICh1cmksICZhZGRyZXNzLCAmcG9ydCkpCisgICAgZ290byB3cm9uZ191cmk7CisKKyAgaWYgKHBvcnQgPT0gKGd1aW50MTYpIC0gMSkKKyAgICBwb3J0ID0gVURQX0RFRkFVTFRfUE9SVDsKKworICBnX2ZyZWUgKHNyYy0+YWRkcmVzcyk7CisgIHNyYy0+YWRkcmVzcyA9IGFkZHJlc3M7CisgIHNyYy0+cG9ydCA9IHBvcnQ7CisKKyAgZ19mcmVlIChzcmMtPnVyaSk7CisgIHNyYy0+dXJpID0gZ19zdHJkdXAgKHVyaSk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCit3cm9uZ191cmk6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgUkVBRCwgKE5VTEwpLAorICAgICAgICAoImVycm9yIHBhcnNpbmcgdXJpICVzIiwgdXJpKSk7CisgICAgZ19zZXRfZXJyb3JfbGl0ZXJhbCAoZXJyb3IsIEdTVF9VUklfRVJST1IsIEdTVF9VUklfRVJST1JfQkFEX1VSSSwKKyAgICAgICAgIkNvdWxkIG5vdCBwYXJzZSBVRFAgVVJJIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdWRwc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RVRFBTcmMgKnVkcHNyYyA9IEdTVF9VRFBTUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0JVRkZFUl9TSVpFOgorICAgICAgdWRwc3JjLT5idWZmZXJfc2l6ZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BPUlQ6CisgICAgICB1ZHBzcmMtPnBvcnQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGdfZnJlZSAodWRwc3JjLT51cmkpOworICAgICAgdWRwc3JjLT51cmkgPQorICAgICAgICAgIGdfc3RyZHVwX3ByaW50ZiAoInVkcDovLyVzOiV1IiwgdWRwc3JjLT5hZGRyZXNzLCB1ZHBzcmMtPnBvcnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01VTFRJQ0FTVF9HUk9VUDoKKyAgICBjYXNlIFBST1BfQUREUkVTUzoKKyAgICB7CisgICAgICBjb25zdCBnY2hhciAqZ3JvdXA7CisKKyAgICAgIGdfZnJlZSAodWRwc3JjLT5hZGRyZXNzKTsKKyAgICAgIGlmICgoZ3JvdXAgPSBnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSkpCisgICAgICAgIHVkcHNyYy0+YWRkcmVzcyA9IGdfc3RyZHVwIChncm91cCk7CisgICAgICBlbHNlCisgICAgICAgIHVkcHNyYy0+YWRkcmVzcyA9IGdfc3RyZHVwIChVRFBfREVGQVVMVF9NVUxUSUNBU1RfR1JPVVApOworCisgICAgICBnX2ZyZWUgKHVkcHNyYy0+dXJpKTsKKyAgICAgIHVkcHNyYy0+dXJpID0KKyAgICAgICAgICBnX3N0cmR1cF9wcmludGYgKCJ1ZHA6Ly8lczoldSIsIHVkcHNyYy0+YWRkcmVzcywgdWRwc3JjLT5wb3J0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfTVVMVElDQVNUX0lGQUNFOgorICAgICAgZ19mcmVlICh1ZHBzcmMtPm11bHRpX2lmYWNlKTsKKworICAgICAgaWYgKGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpID09IE5VTEwpCisgICAgICAgIHVkcHNyYy0+bXVsdGlfaWZhY2UgPSBnX3N0cmR1cCAoVURQX0RFRkFVTFRfTVVMVElDQVNUX0lGQUNFKTsKKyAgICAgIGVsc2UKKyAgICAgICAgdWRwc3JjLT5tdWx0aV9pZmFjZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VSSToKKyAgICAgIGdzdF91ZHBzcmNfc2V0X3VyaSAodWRwc3JjLCBnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0FQUzoKKyAgICB7CisgICAgICBjb25zdCBHc3RDYXBzICpuZXdfY2Fwc192YWwgPSBnc3RfdmFsdWVfZ2V0X2NhcHMgKHZhbHVlKTsKKyAgICAgIEdzdENhcHMgKm5ld19jYXBzOworICAgICAgR3N0Q2FwcyAqb2xkX2NhcHM7CisKKyAgICAgIGlmIChuZXdfY2Fwc192YWwgPT0gTlVMTCkgeworICAgICAgICBuZXdfY2FwcyA9IGdzdF9jYXBzX25ld19hbnkgKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBuZXdfY2FwcyA9IGdzdF9jYXBzX2NvcHkgKG5ld19jYXBzX3ZhbCk7CisgICAgICB9CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAodWRwc3JjKTsKKyAgICAgIG9sZF9jYXBzID0gdWRwc3JjLT5jYXBzOworICAgICAgdWRwc3JjLT5jYXBzID0gbmV3X2NhcHM7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAodWRwc3JjKTsKKyAgICAgIGlmIChvbGRfY2FwcykKKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKG9sZF9jYXBzKTsKKworICAgICAgZ3N0X3BhZF9tYXJrX3JlY29uZmlndXJlIChHU1RfQkFTRV9TUkNfUEFEICh1ZHBzcmMpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfU09DS0VUOgorICAgICAgaWYgKHVkcHNyYy0+c29ja2V0ICE9IE5VTEwgJiYgdWRwc3JjLT5zb2NrZXQgIT0gdWRwc3JjLT51c2VkX3NvY2tldCAmJgorICAgICAgICAgIHVkcHNyYy0+Y2xvc2Vfc29ja2V0KSB7CisgICAgICAgIEdFcnJvciAqZXJyID0gTlVMTDsKKworICAgICAgICBpZiAoIWdfc29ja2V0X2Nsb3NlICh1ZHBzcmMtPnNvY2tldCwgJmVycikpIHsKKyAgICAgICAgICBHU1RfRVJST1IgKCJmYWlsZWQgdG8gY2xvc2Ugc29ja2V0ICVwOiAlcyIsIHVkcHNyYy0+c29ja2V0LAorICAgICAgICAgICAgICBlcnItPm1lc3NhZ2UpOworICAgICAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAodWRwc3JjLT5zb2NrZXQpCisgICAgICAgIGdfb2JqZWN0X3VucmVmICh1ZHBzcmMtPnNvY2tldCk7CisgICAgICB1ZHBzcmMtPnNvY2tldCA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgR1NUX0RFQlVHICgic2V0dGluZyBzb2NrZXQgdG8gJXAiLCB1ZHBzcmMtPnNvY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVElNRU9VVDoKKyAgICAgIHVkcHNyYy0+dGltZW91dCA9IGdfdmFsdWVfZ2V0X3VpbnQ2NCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NLSVBfRklSU1RfQllURVM6CisgICAgICB1ZHBzcmMtPnNraXBfZmlyc3RfYnl0ZXMgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTE9TRV9TT0NLRVQ6CisgICAgICB1ZHBzcmMtPmNsb3NlX3NvY2tldCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9BVVRPX01VTFRJQ0FTVDoKKyAgICAgIHVkcHNyYy0+YXV0b19tdWx0aWNhc3QgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVVU0U6CisgICAgICB1ZHBzcmMtPnJldXNlID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0xPT1A6CisgICAgICB1ZHBzcmMtPmxvb3AgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVUUklFVkVfU0VOREVSX0FERFJFU1M6CisgICAgICB1ZHBzcmMtPnJldHJpZXZlX3NlbmRlcl9hZGRyZXNzID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdWRwc3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RVRFBTcmMgKnVkcHNyYyA9IEdTVF9VRFBTUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0JVRkZFUl9TSVpFOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdWRwc3JjLT5idWZmZXJfc2l6ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUE9SVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHVkcHNyYy0+cG9ydCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTVVMVElDQVNUX0dST1VQOgorICAgIGNhc2UgUFJPUF9BRERSRVNTOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgdWRwc3JjLT5hZGRyZXNzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NVUxUSUNBU1RfSUZBQ0U6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCB1ZHBzcmMtPm11bHRpX2lmYWNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VUkk6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCB1ZHBzcmMtPnVyaSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0FQUzoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAodWRwc3JjKTsKKyAgICAgIGdzdF92YWx1ZV9zZXRfY2FwcyAodmFsdWUsIHVkcHNyYy0+Y2Fwcyk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAodWRwc3JjKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TT0NLRVQ6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCB1ZHBzcmMtPnNvY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVElNRU9VVDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHVkcHNyYy0+dGltZW91dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0tJUF9GSVJTVF9CWVRFUzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHVkcHNyYy0+c2tpcF9maXJzdF9ieXRlcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0xPU0VfU09DS0VUOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHVkcHNyYy0+Y2xvc2Vfc29ja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VEX1NPQ0tFVDoKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHVkcHNyYy0+dXNlZF9zb2NrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FVVE9fTVVMVElDQVNUOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHVkcHNyYy0+YXV0b19tdWx0aWNhc3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JFVVNFOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHVkcHNyYy0+cmV1c2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0xPT1A6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgdWRwc3JjLT5sb29wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRVRSSUVWRV9TRU5ERVJfQUREUkVTUzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCB1ZHBzcmMtPnJldHJpZXZlX3NlbmRlcl9hZGRyZXNzKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdJbmV0QWRkcmVzcyAqCitnc3RfdWRwc3JjX3Jlc29sdmUgKEdzdFVEUFNyYyAqIHNyYywgY29uc3QgZ2NoYXIgKiBhZGRyZXNzKQoreworICBHSW5ldEFkZHJlc3MgKmFkZHI7CisgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgR1Jlc29sdmVyICpyZXNvbHZlcjsKKworICBhZGRyID0gZ19pbmV0X2FkZHJlc3NfbmV3X2Zyb21fc3RyaW5nIChhZGRyZXNzKTsKKyAgaWYgKCFhZGRyKSB7CisgICAgR0xpc3QgKnJlc3VsdHM7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJyZXNvbHZpbmcgSVAgYWRkcmVzcyBmb3IgaG9zdCAlcyIsIGFkZHJlc3MpOworICAgIHJlc29sdmVyID0gZ19yZXNvbHZlcl9nZXRfZGVmYXVsdCAoKTsKKyAgICByZXN1bHRzID0KKyAgICAgICAgZ19yZXNvbHZlcl9sb29rdXBfYnlfbmFtZSAocmVzb2x2ZXIsIGFkZHJlc3MsIHNyYy0+Y2FuY2VsbGFibGUsICZlcnIpOworICAgIGlmICghcmVzdWx0cykKKyAgICAgIGdvdG8gbmFtZV9yZXNvbHZlOworICAgIGFkZHIgPSBHX0lORVRfQUREUkVTUyAoZ19vYmplY3RfcmVmIChyZXN1bHRzLT5kYXRhKSk7CisKKyAgICBnX3Jlc29sdmVyX2ZyZWVfYWRkcmVzc2VzIChyZXN1bHRzKTsKKyAgICBnX29iamVjdF91bnJlZiAocmVzb2x2ZXIpOworICB9CisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworICB7CisgICAgZ2NoYXIgKmlwID0gZ19pbmV0X2FkZHJlc3NfdG9fc3RyaW5nIChhZGRyKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIklQIGFkZHJlc3MgZm9yIGhvc3QgJXMgaXMgJXMiLCBhZGRyZXNzLCBpcCk7CisgICAgZ19mcmVlIChpcCk7CisgIH0KKyNlbmRpZgorCisgIHJldHVybiBhZGRyOworCituYW1lX3Jlc29sdmU6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgIkZhaWxlZCB0byByZXNvbHZlICVzOiAlcyIsIGFkZHJlc3MsIGVyci0+bWVzc2FnZSk7CisgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgZ19vYmplY3RfdW5yZWYgKHJlc29sdmVyKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCisvKiBjcmVhdGUgYSBzb2NrZXQgZm9yIHNlbmRpbmcgdG8gcmVtb3RlIG1hY2hpbmUgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3VkcHNyY19vcGVuIChHc3RVRFBTcmMgKiBzcmMpCit7CisgIEdJbmV0QWRkcmVzcyAqYWRkciwgKmJpbmRfYWRkcjsKKyAgR1NvY2tldEFkZHJlc3MgKmJpbmRfc2FkZHI7CisgIEdFcnJvciAqZXJyID0gTlVMTDsKKworICBnc3RfdWRwc3JjX2NyZWF0ZV9jYW5jZWxsYWJsZSAoc3JjKTsKKworICBpZiAoc3JjLT5zb2NrZXQgPT0gTlVMTCkgeworICAgIC8qIG5lZWQgdG8gYWxsb2NhdGUgYSBzb2NrZXQgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJhbGxvY2F0aW5nIHNvY2tldCBmb3IgJXM6JWQiLCBzcmMtPmFkZHJlc3MsCisgICAgICAgIHNyYy0+cG9ydCk7CisKKyAgICBhZGRyID0gZ3N0X3VkcHNyY19yZXNvbHZlIChzcmMsIHNyYy0+YWRkcmVzcyk7CisgICAgaWYgKCFhZGRyKQorICAgICAgZ290byBuYW1lX3Jlc29sdmU7CisKKyAgICBpZiAoKHNyYy0+dXNlZF9zb2NrZXQgPQorICAgICAgICAgICAgZ19zb2NrZXRfbmV3IChnX2luZXRfYWRkcmVzc19nZXRfZmFtaWx5IChhZGRyKSwKKyAgICAgICAgICAgICAgICBHX1NPQ0tFVF9UWVBFX0RBVEFHUkFNLCBHX1NPQ0tFVF9QUk9UT0NPTF9VRFAsICZlcnIpKSA9PSBOVUxMKQorICAgICAgZ290byBub19zb2NrZXQ7CisKKyAgICBzcmMtPmV4dGVybmFsX3NvY2tldCA9IEZBTFNFOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZ290IHNvY2tldCAlcCIsIHNyYy0+dXNlZF9zb2NrZXQpOworCisgICAgaWYgKHNyYy0+YWRkcikKKyAgICAgIGdfb2JqZWN0X3VucmVmIChzcmMtPmFkZHIpOworICAgIHNyYy0+YWRkciA9CisgICAgICAgIEdfSU5FVF9TT0NLRVRfQUREUkVTUyAoZ19pbmV0X3NvY2tldF9hZGRyZXNzX25ldyAoYWRkciwgc3JjLT5wb3J0KSk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJiaW5kaW5nIG9uIHBvcnQgJWQiLCBzcmMtPnBvcnQpOworCisgICAgLyogRm9yIG11bHRpY2FzdCwgYmluZCB0byBBTlkgYW5kIGpvaW4gdGhlIG11bHRpY2FzdCBncm91cCBsYXRlciAqLworICAgIGlmIChnX2luZXRfYWRkcmVzc19nZXRfaXNfbXVsdGljYXN0IChhZGRyKSkKKyAgICAgIGJpbmRfYWRkciA9IGdfaW5ldF9hZGRyZXNzX25ld19hbnkgKGdfaW5ldF9hZGRyZXNzX2dldF9mYW1pbHkgKGFkZHIpKTsKKyAgICBlbHNlCisgICAgICBiaW5kX2FkZHIgPSBHX0lORVRfQUREUkVTUyAoZ19vYmplY3RfcmVmIChhZGRyKSk7CisKKyAgICBnX29iamVjdF91bnJlZiAoYWRkcik7CisKKyAgICBiaW5kX3NhZGRyID0gZ19pbmV0X3NvY2tldF9hZGRyZXNzX25ldyAoYmluZF9hZGRyLCBzcmMtPnBvcnQpOworICAgIGdfb2JqZWN0X3VucmVmIChiaW5kX2FkZHIpOworICAgIGlmICghZ19zb2NrZXRfYmluZCAoc3JjLT51c2VkX3NvY2tldCwgYmluZF9zYWRkciwgc3JjLT5yZXVzZSwgJmVycikpCisgICAgICBnb3RvIGJpbmRfZXJyb3I7CisKKyAgICBnX29iamVjdF91bnJlZiAoYmluZF9zYWRkcik7CisgICAgZ19zb2NrZXRfc2V0X211bHRpY2FzdF9sb29wYmFjayAoc3JjLT51c2VkX3NvY2tldCwgc3JjLT5sb29wKTsKKyAgfSBlbHNlIHsKKyAgICBHSW5ldFNvY2tldEFkZHJlc3MgKmxvY2FsX2FkZHI7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJ1c2luZyBwcm92aWRlZCBzb2NrZXQgJXAiLCBzcmMtPnNvY2tldCk7CisgICAgLyogd2UgdXNlIHRoZSBjb25maWd1cmVkIHNvY2tldCwgdHJ5IHRvIGdldCBzb21lIGluZm8gYWJvdXQgaXQgKi8KKyAgICBzcmMtPnVzZWRfc29ja2V0ID0gR19TT0NLRVQgKGdfb2JqZWN0X3JlZiAoc3JjLT5zb2NrZXQpKTsKKyAgICBzcmMtPmV4dGVybmFsX3NvY2tldCA9IFRSVUU7CisKKyAgICBsb2NhbF9hZGRyID0KKyAgICAgICAgR19JTkVUX1NPQ0tFVF9BRERSRVNTIChnX3NvY2tldF9nZXRfbG9jYWxfYWRkcmVzcyAoc3JjLT51c2VkX3NvY2tldCwKKyAgICAgICAgICAgICZlcnIpKTsKKyAgICBpZiAoIWxvY2FsX2FkZHIpCisgICAgICBnb3RvIGdldHNvY2tuYW1lX2Vycm9yOworCisgICAgYWRkciA9IGdzdF91ZHBzcmNfcmVzb2x2ZSAoc3JjLCBzcmMtPmFkZHJlc3MpOworICAgIGlmICghYWRkcikKKyAgICAgIGdvdG8gbmFtZV9yZXNvbHZlOworCisgICAgLyogSWYgYm91bmQgdG8gQU5ZIGFuZCBhZGRyZXNzIHBvaW50cyB0byBhIG11bHRpY2FzdCBhZGRyZXNzLCBtYWtlCisgICAgICogc3VyZSB0aGF0IGFkZHJlc3MgaXMgbm90IG92ZXJyaWRkZW4gd2l0aCBBTlkgYnV0IHdlIGhhdmUgdGhlCisgICAgICogb3Bwb3J0dW5pdHkgbGF0ZXIgdG8gam9pbiB0aGUgbXVsdGljYXN0IGFkZHJlc3MuIFRoaXMgZW5zdXJlcyB0aGF0IHdlCisgICAgICogaGF2ZSB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgZm9yIHNvY2tldHMgY3JlYXRlZCBieSB1ZHBzcmMgKi8KKyAgICBpZiAoIXNyYy0+YXV0b19tdWx0aWNhc3QgfHwKKyAgICAgICAgIWdfaW5ldF9hZGRyZXNzX2dldF9pc19hbnkgKGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcworICAgICAgICAgICAgKGxvY2FsX2FkZHIpKQorICAgICAgICB8fCAhZ19pbmV0X2FkZHJlc3NfZ2V0X2lzX211bHRpY2FzdCAoYWRkcikpIHsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChhZGRyKTsKKyAgICAgIGlmIChzcmMtPmFkZHIpCisgICAgICAgIGdfb2JqZWN0X3VucmVmIChzcmMtPmFkZHIpOworICAgICAgc3JjLT5hZGRyID0gbG9jYWxfYWRkcjsKKyAgICB9IGVsc2UgeworICAgICAgZ19vYmplY3RfdW5yZWYgKGxvY2FsX2FkZHIpOworICAgICAgaWYgKHNyYy0+YWRkcikKKyAgICAgICAgZ19vYmplY3RfdW5yZWYgKHNyYy0+YWRkcik7CisgICAgICBzcmMtPmFkZHIgPQorICAgICAgICAgIEdfSU5FVF9TT0NLRVRfQUREUkVTUyAoZ19pbmV0X3NvY2tldF9hZGRyZXNzX25ldyAoYWRkciwgc3JjLT5wb3J0KSk7CisgICAgICBnX29iamVjdF91bnJlZiAoYWRkcik7CisgICAgfQorICB9CisKKyAgeworICAgIGdpbnQgdmFsID0gMDsKKworICAgIGlmIChzcmMtPmJ1ZmZlcl9zaXplICE9IDApIHsKKyAgICAgIEdFcnJvciAqb3B0X2VyciA9IE5VTEw7CisKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoc3JjLCAic2V0dGluZyB1ZHAgYnVmZmVyIG9mICVkIGJ5dGVzIiwgc3JjLT5idWZmZXJfc2l6ZSk7CisgICAgICAvKiBzZXQgYnVmZmVyIHNpemUsIE5vdGUgdGhhdCBvbiBMaW51eCB0aGlzIGlzIHR5cGljYWxseSBsaW1pdGVkIHRvIGEKKyAgICAgICAqIG1heGltdW0gb2YgYXJvdW5kIDEwMEsuIEFsc28gYSBtaW5pbXVtIG9mIDEyOCBieXRlcyBpcyByZXF1aXJlZCBvbgorICAgICAgICogTGludXguICovCisgICAgICBpZiAoIWdfc29ja2V0X3NldF9vcHRpb24gKHNyYy0+dXNlZF9zb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwKKyAgICAgICAgICAgICAgc3JjLT5idWZmZXJfc2l6ZSwgJm9wdF9lcnIpKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNyYywgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICAgICAoIkNvdWxkIG5vdCBjcmVhdGUgYSBidWZmZXIgb2YgcmVxdWVzdGVkICVkIGJ5dGVzOiAlcyIsCisgICAgICAgICAgICAgICAgc3JjLT5idWZmZXJfc2l6ZSwgb3B0X2Vyci0+bWVzc2FnZSkpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKG9wdF9lcnIpOworICAgICAgICBvcHRfZXJyID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZWFkIHRoZSB2YWx1ZSBvZiB0aGUgcmVjZWl2ZSBidWZmZXIuIE5vdGUgdGhhdCBvbiBsaW51eCB0aGlzIHJldHVybnMKKyAgICAgKiAyeCB0aGUgdmFsdWUgd2Ugc2V0IGJlY2F1c2UgdGhlIGtlcm5lbCBhbGxvY2F0ZXMgZXh0cmEgbWVtb3J5IGZvcgorICAgICAqIG1ldGFkYXRhLiBUaGUgZGVmYXVsdCBvbiBMaW51eCBpcyBhYm91dCAxMDBLICh3aGljaCBpcyBhYm91dCA1MEsKKyAgICAgKiB3aXRob3V0IG1ldGFkYXRhKSAqLworICAgIGlmIChnX3NvY2tldF9nZXRfb3B0aW9uIChzcmMtPnVzZWRfc29ja2V0LCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsICZ2YWwsCisgICAgICAgICAgICBOVUxMKSkgeworICAgICAgR1NUX0lORk9fT0JKRUNUIChzcmMsICJoYXZlIHVkcCBidWZmZXIgb2YgJWQgYnl0ZXMiLCB2YWwpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb3VsZCBub3QgZ2V0IHVkcCBidWZmZXIgc2l6ZSIpOworICAgIH0KKyAgfQorCisgIGdfc29ja2V0X3NldF9icm9hZGNhc3QgKHNyYy0+dXNlZF9zb2NrZXQsIFRSVUUpOworCisgIGlmIChzcmMtPmF1dG9fbXVsdGljYXN0CisgICAgICAmJgorICAgICAgZ19pbmV0X2FkZHJlc3NfZ2V0X2lzX211bHRpY2FzdCAoZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9hZGRyZXNzCisgICAgICAgICAgKHNyYy0+YWRkcikpKSB7CisKKyAgICBpZiAoc3JjLT5tdWx0aV9pZmFjZSkgeworICAgICAgR1N0cnYgbXVsdGlfaWZhY2VzID0gZ19zdHJzcGxpdCAoc3JjLT5tdWx0aV9pZmFjZSwgIiwiLCAtMSk7CisgICAgICBnY2hhciAqKmlmYWNlcyA9IG11bHRpX2lmYWNlczsKKyAgICAgIHdoaWxlICgqaWZhY2VzKSB7CisgICAgICAgIGdfc3Ryc3RyaXAgKCppZmFjZXMpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJqb2luaW5nIG11bHRpY2FzdCBncm91cCAlcyBpbnRlcmZhY2UgJXMiLAorICAgICAgICAgICAgc3JjLT5hZGRyZXNzLCAqaWZhY2VzKTsKKyAgICAgICAgaWYgKCFnX3NvY2tldF9qb2luX211bHRpY2FzdF9ncm91cCAoc3JjLT51c2VkX3NvY2tldCwKKyAgICAgICAgICAgICAgICBnX2luZXRfc29ja2V0X2FkZHJlc3NfZ2V0X2FkZHJlc3MgKHNyYy0+YWRkciksCisgICAgICAgICAgICAgICAgRkFMU0UsICppZmFjZXMsICZlcnIpKSB7CisgICAgICAgICAgZ19zdHJmcmVldiAobXVsdGlfaWZhY2VzKTsKKyAgICAgICAgICBnb3RvIG1lbWJlcnNoaXA7CisgICAgICAgIH0KKworICAgICAgICBpZmFjZXMrKzsKKyAgICAgIH0KKyAgICAgIGdfc3RyZnJlZXYgKG11bHRpX2lmYWNlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImpvaW5pbmcgbXVsdGljYXN0IGdyb3VwICVzIiwgc3JjLT5hZGRyZXNzKTsKKyAgICAgIGlmICghZ19zb2NrZXRfam9pbl9tdWx0aWNhc3RfZ3JvdXAgKHNyYy0+dXNlZF9zb2NrZXQsCisgICAgICAgICAgICAgIGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcyAoc3JjLT5hZGRyKSwgRkFMU0UsIE5VTEwsICZlcnIpKQorICAgICAgICBnb3RvIG1lbWJlcnNoaXA7CisgICAgfQorCisgICAgaWYgKGdfaW5ldF9hZGRyZXNzX2dldF9mYW1pbHkgKGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcworICAgICAgICAgICAgKHNyYy0+YWRkcikpID09IEdfU09DS0VUX0ZBTUlMWV9JUFY0KSB7CisjaWYgZGVmaW5lZChJUF9NVUxUSUNBU1RfQUxMKQorICAgICAgaWYgKCFnX3NvY2tldF9zZXRfb3B0aW9uIChzcmMtPnVzZWRfc29ja2V0LCBJUFBST1RPX0lQLCBJUF9NVUxUSUNBU1RfQUxMLAorICAgICAgICAgICAgICAwLCAmZXJyKSkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgIkZhaWxlZCB0byBkaXNhYmxlIElQX01VTFRJQ0FTVF9BTEw6ICVzIiwKKyAgICAgICAgICAgIGVyci0+bWVzc2FnZSk7CisgICAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgfQorI2VsaWYgZGVmaW5lZChJUF9QS1RJTkZPKQorICAgICAgaWYgKCFnX3NvY2tldF9zZXRfb3B0aW9uIChzcmMtPnVzZWRfc29ja2V0LCBJUFBST1RPX0lQLCBJUF9QS1RJTkZPLCBUUlVFLAorICAgICAgICAgICAgICAmZXJyKSkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgIkZhaWxlZCB0byBlbmFibGUgSVBfUEtUSU5GTzogJXMiLAorICAgICAgICAgICAgZXJyLT5tZXNzYWdlKTsKKyAgICAgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgICB9CisjZWxpZiBkZWZpbmVkKElQX1JFQ1ZEU1RBRERSKQorICAgICAgaWYgKCFnX3NvY2tldF9zZXRfb3B0aW9uIChzcmMtPnVzZWRfc29ja2V0LCBJUFBST1RPX0lQLCBJUF9SRUNWRFNUQUREUiwKKyAgICAgICAgICAgICAgVFJVRSwgJmVycikpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJGYWlsZWQgdG8gZW5hYmxlIElQX1JFQ1ZEU1RBRERSOiAlcyIsCisgICAgICAgICAgICBlcnItPm1lc3NhZ2UpOworICAgICAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICAgIH0KKyNlbHNlCisjcHJhZ21hIG1lc3NhZ2UoIk5vIEFQSSBhdmFpbGFibGUgZm9yIGdldHRpbmcgSVB2NCBkZXN0aW5hdGlvbiBhZGRyZXNzIikKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiTm8gQVBJIGF2YWlsYWJsZSBmb3IgZ2V0dGluZyBJUHY0IGRlc3RpbmF0aW9uICIKKyAgICAgICAgICAiYWRkcmVzcywgd2lsbCByZWNlaXZlIHBhY2tldHMgZm9yIGV2ZXJ5IGRlc3RpbmF0aW9uIHRvIG91ciBwb3J0Iik7CisjZW5kaWYKKyAgICB9IGVsc2UKKyAgICAgICAgaWYgKGdfaW5ldF9hZGRyZXNzX2dldF9mYW1pbHkgKGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcworICAgICAgICAgICAgKHNyYy0+YWRkcikpID09IEdfU09DS0VUX0ZBTUlMWV9JUFY2KSB7CisjaWZkZWYgSVBWNl9QS1RJTkZPCisjaWZkZWYgSVBWNl9SRUNWUEtUSU5GTworICAgICAgaWYgKCFnX3NvY2tldF9zZXRfb3B0aW9uIChzcmMtPnVzZWRfc29ja2V0LCBJUFBST1RPX0lQVjYsCisgICAgICAgICAgICAgIElQVjZfUkVDVlBLVElORk8sIFRSVUUsICZlcnIpKSB7CisjZWxzZQorICAgICAgaWYgKCFnX3NvY2tldF9zZXRfb3B0aW9uIChzcmMtPnVzZWRfc29ja2V0LCBJUFBST1RPX0lQVjYsIElQVjZfUEtUSU5GTywKKyAgICAgICAgICAgICAgVFJVRSwgJmVycikpIHsKKyNlbmRpZgorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgIkZhaWxlZCB0byBlbmFibGUgSVBWNl9QS1RJTkZPOiAlcyIsCisgICAgICAgICAgICBlcnItPm1lc3NhZ2UpOworICAgICAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICAgIH0KKyNlbHNlCisjcHJhZ21hIG1lc3NhZ2UoIk5vIEFQSSBhdmFpbGFibGUgZm9yIGdldHRpbmcgSVB2NiBkZXN0aW5hdGlvbiBhZGRyZXNzIikKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiTm8gQVBJIGF2YWlsYWJsZSBmb3IgZ2V0dGluZyBJUHY2IGRlc3RpbmF0aW9uICIKKyAgICAgICAgICAiYWRkcmVzcywgd2lsbCByZWNlaXZlIHBhY2tldHMgZm9yIGV2ZXJ5IGRlc3RpbmF0aW9uIHRvIG91ciBwb3J0Iik7CisjZW5kaWYKKyAgICB9CisgIH0KKworICAvKiBOT1RFOiBzb2NrYWRkcl9pbi5zaW5fcG9ydCB3b3JrcyBmb3IgaXB2NCBhbmQgaXB2NiBiZWNhdXNlIHNpbl9wb3J0CisgICAqIGZvbGxvd3Mgc3NfZmFtaWx5IG9uIGJvdGggKi8KKyAgeworICAgIEdJbmV0U29ja2V0QWRkcmVzcyAqYWRkcjsKKyAgICBndWludDE2IHBvcnQ7CisKKyAgICBhZGRyID0KKyAgICAgICAgR19JTkVUX1NPQ0tFVF9BRERSRVNTIChnX3NvY2tldF9nZXRfbG9jYWxfYWRkcmVzcyAoc3JjLT51c2VkX3NvY2tldCwKKyAgICAgICAgICAgICZlcnIpKTsKKyAgICBpZiAoIWFkZHIpCisgICAgICBnb3RvIGdldHNvY2tuYW1lX2Vycm9yOworCisgICAgcG9ydCA9IGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfcG9ydCAoYWRkcik7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiYm91bmQsIG9uIHBvcnQgJWQiLCBwb3J0KTsKKyAgICBpZiAocG9ydCAhPSBzcmMtPnBvcnQpIHsKKyAgICAgIHNyYy0+cG9ydCA9IHBvcnQ7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJub3RpZnlpbmcgcG9ydCAlZCIsIHBvcnQpOworICAgICAgZ19vYmplY3Rfbm90aWZ5IChHX09CSkVDVCAoc3JjKSwgInBvcnQiKTsKKyAgICB9CisgICAgZ19vYmplY3RfdW5yZWYgKGFkZHIpOworICB9CisKKyAgc3JjLT5hbGxvY2F0b3IgPSBOVUxMOworICBnc3RfYWxsb2NhdGlvbl9wYXJhbXNfaW5pdCAoJnNyYy0+cGFyYW1zKTsKKworICBzcmMtPm1heF9zaXplID0gMDsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK25hbWVfcmVzb2x2ZToKKyAgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fc29ja2V0OgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwgKE5VTEwpLAorICAgICAgICAoIm5vIHNvY2tldCBlcnJvcjogJXMiLCBlcnItPm1lc3NhZ2UpKTsKKyAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICBnX29iamVjdF91bnJlZiAoYWRkcik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitiaW5kX2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgiYmluZCBmYWlsZWQ6ICVzIiwgZXJyLT5tZXNzYWdlKSk7CisgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgZ19vYmplY3RfdW5yZWYgKGJpbmRfc2FkZHIpOworICAgIGdzdF91ZHBzcmNfY2xvc2UgKHNyYyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CittZW1iZXJzaGlwOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgiY291bGQgbm90IGFkZCBtZW1iZXJzaGlwOiAlcyIsIGVyci0+bWVzc2FnZSkpOworICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgIGdzdF91ZHBzcmNfY2xvc2UgKHNyYyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitnZXRzb2NrbmFtZV9lcnJvcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAoImdldHNvY2tuYW1lIGZhaWxlZDogJXMiLCBlcnItPm1lc3NhZ2UpKTsKKyAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICBnc3RfdWRwc3JjX2Nsb3NlIChzcmMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF91ZHBzcmNfdW5sb2NrIChHc3RCYXNlU3JjICogYnNyYykKK3sKKyAgR3N0VURQU3JjICpzcmM7CisKKyAgc3JjID0gR1NUX1VEUFNSQyAoYnNyYyk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIkZsdXNoaW5nIik7CisgIGdfY2FuY2VsbGFibGVfY2FuY2VsIChzcmMtPmNhbmNlbGxhYmxlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdWRwc3JjX3VubG9ja19zdG9wIChHc3RCYXNlU3JjICogYnNyYykKK3sKKyAgR3N0VURQU3JjICpzcmM7CisKKyAgc3JjID0gR1NUX1VEUFNSQyAoYnNyYyk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIk5vIGxvbmdlciBmbHVzaGluZyIpOworCisgIGdzdF91ZHBzcmNfZnJlZV9jYW5jZWxsYWJsZSAoc3JjKTsKKyAgZ3N0X3VkcHNyY19jcmVhdGVfY2FuY2VsbGFibGUgKHNyYyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3VkcHNyY19jbG9zZSAoR3N0VURQU3JjICogc3JjKQoreworICBHU1RfREVCVUcgKCJjbG9zaW5nIHNvY2tldHMiKTsKKworICBpZiAoc3JjLT51c2VkX3NvY2tldCkgeworICAgIGlmIChzcmMtPmF1dG9fbXVsdGljYXN0CisgICAgICAgICYmCisgICAgICAgIGdfaW5ldF9hZGRyZXNzX2dldF9pc19tdWx0aWNhc3QgKGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcworICAgICAgICAgICAgKHNyYy0+YWRkcikpKSB7CisgICAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgICAgIGlmIChzcmMtPm11bHRpX2lmYWNlKSB7CisgICAgICAgIEdTdHJ2IG11bHRpX2lmYWNlcyA9IGdfc3Ryc3BsaXQgKHNyYy0+bXVsdGlfaWZhY2UsICIsIiwgLTEpOworICAgICAgICBnY2hhciAqKmlmYWNlcyA9IG11bHRpX2lmYWNlczsKKyAgICAgICAgd2hpbGUgKCppZmFjZXMpIHsKKyAgICAgICAgICBnX3N0cnN0cmlwICgqaWZhY2VzKTsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJsZWF2aW5nIG11bHRpY2FzdCBncm91cCAlcyBpbnRlcmZhY2UgJXMiLAorICAgICAgICAgICAgICBzcmMtPmFkZHJlc3MsICppZmFjZXMpOworICAgICAgICAgIGlmICghZ19zb2NrZXRfbGVhdmVfbXVsdGljYXN0X2dyb3VwIChzcmMtPnVzZWRfc29ja2V0LAorICAgICAgICAgICAgICAgICAgZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9hZGRyZXNzIChzcmMtPmFkZHIpLAorICAgICAgICAgICAgICAgICAgRkFMU0UsICppZmFjZXMsICZlcnIpKSB7CisgICAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChzcmMsICJGYWlsZWQgdG8gbGVhdmUgbXVsdGljYXN0IGdyb3VwOiAlcyIsCisgICAgICAgICAgICAgICAgZXJyLT5tZXNzYWdlKTsKKyAgICAgICAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZmFjZXMrKzsKKyAgICAgICAgfQorICAgICAgICBnX3N0cmZyZWV2IChtdWx0aV9pZmFjZXMpOworCisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJsZWF2aW5nIG11bHRpY2FzdCBncm91cCAlcyIsIHNyYy0+YWRkcmVzcyk7CisgICAgICAgIGlmICghZ19zb2NrZXRfbGVhdmVfbXVsdGljYXN0X2dyb3VwIChzcmMtPnVzZWRfc29ja2V0LAorICAgICAgICAgICAgICAgIGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcyAoc3JjLT5hZGRyKSwgRkFMU0UsCisgICAgICAgICAgICAgICAgTlVMTCwgJmVycikpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChzcmMsICJGYWlsZWQgdG8gbGVhdmUgbXVsdGljYXN0IGdyb3VwOiAlcyIsCisgICAgICAgICAgICAgIGVyci0+bWVzc2FnZSk7CisgICAgICAgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3JjLT5jbG9zZV9zb2NrZXQgfHwgIXNyYy0+ZXh0ZXJuYWxfc29ja2V0KSB7CisgICAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisgICAgICBpZiAoIWdfc29ja2V0X2Nsb3NlIChzcmMtPnVzZWRfc29ja2V0LCAmZXJyKSkgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChzcmMsICJGYWlsZWQgdG8gY2xvc2Ugc29ja2V0OiAlcyIsIGVyci0+bWVzc2FnZSk7CisgICAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgfQorICAgIH0KKworICAgIGdfb2JqZWN0X3VucmVmIChzcmMtPnVzZWRfc29ja2V0KTsKKyAgICBzcmMtPnVzZWRfc29ja2V0ID0gTlVMTDsKKyAgICBnX29iamVjdF91bnJlZiAoc3JjLT5hZGRyKTsKKyAgICBzcmMtPmFkZHIgPSBOVUxMOworICB9CisKKyAgZ3N0X3VkcHNyY19yZXNldF9tZW1vcnlfYWxsb2NhdG9yIChzcmMpOworCisgIGdzdF91ZHBzcmNfZnJlZV9jYW5jZWxsYWJsZSAoc3JjKTsKKworICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF91ZHBzcmNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0VURQU3JjICpzcmM7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJlc3VsdDsKKworICBzcmMgPSBHU1RfVURQU1JDIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGlmICghZ3N0X3VkcHNyY19vcGVuIChzcmMpKQorICAgICAgICBnb3RvIG9wZW5fZmFpbGVkOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIGlmICgocmVzdWx0ID0KKyAgICAgICAgICBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LAorICAgICAgICAgICAgICB0cmFuc2l0aW9uKSkgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKQorICAgIGdvdG8gZmFpbHVyZTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGdzdF91ZHBzcmNfY2xvc2UgKHNyYyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKKyAgLyogRVJST1JTICovCitvcGVuX2ZhaWxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImZhaWxlZCB0byBvcGVuIHNvY2tldCIpOworICAgIHJldHVybiBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisgIH0KK2ZhaWx1cmU6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJwYXJlbnQgZmFpbGVkIHN0YXRlIGNoYW5nZSIpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKworCisKKworLyoqKiBHU1RVUklIQU5ETEVSIElOVEVSRkFDRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgR3N0VVJJVHlwZQorZ3N0X3VkcHNyY191cmlfZ2V0X3R5cGUgKEdUeXBlIHR5cGUpCit7CisgIHJldHVybiBHU1RfVVJJX1NSQzsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyICpjb25zdCAqCitnc3RfdWRwc3JjX3VyaV9nZXRfcHJvdG9jb2xzIChHVHlwZSB0eXBlKQoreworICBzdGF0aWMgY29uc3QgZ2NoYXIgKnByb3RvY29sc1tdID0geyAidWRwIiwgTlVMTCB9OworCisgIHJldHVybiBwcm90b2NvbHM7Cit9CisKK3N0YXRpYyBnY2hhciAqCitnc3RfdWRwc3JjX3VyaV9nZXRfdXJpIChHc3RVUklIYW5kbGVyICogaGFuZGxlcikKK3sKKyAgR3N0VURQU3JjICpzcmMgPSBHU1RfVURQU1JDIChoYW5kbGVyKTsKKworICByZXR1cm4gZ19zdHJkdXAgKHNyYy0+dXJpKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdWRwc3JjX3VyaV9zZXRfdXJpIChHc3RVUklIYW5kbGVyICogaGFuZGxlciwgY29uc3QgZ2NoYXIgKiB1cmksCisgICAgR0Vycm9yICoqIGVycm9yKQoreworICByZXR1cm4gZ3N0X3VkcHNyY19zZXRfdXJpIChHU1RfVURQU1JDIChoYW5kbGVyKSwgdXJpLCBlcnJvcik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdWRwc3JjX3VyaV9oYW5kbGVyX2luaXQgKGdwb2ludGVyIGdfaWZhY2UsIGdwb2ludGVyIGlmYWNlX2RhdGEpCit7CisgIEdzdFVSSUhhbmRsZXJJbnRlcmZhY2UgKmlmYWNlID0gKEdzdFVSSUhhbmRsZXJJbnRlcmZhY2UgKikgZ19pZmFjZTsKKworICBpZmFjZS0+Z2V0X3R5cGUgPSBnc3RfdWRwc3JjX3VyaV9nZXRfdHlwZTsKKyAgaWZhY2UtPmdldF9wcm90b2NvbHMgPSBnc3RfdWRwc3JjX3VyaV9nZXRfcHJvdG9jb2xzOworICBpZmFjZS0+Z2V0X3VyaSA9IGdzdF91ZHBzcmNfdXJpX2dldF91cmk7CisgIGlmYWNlLT5zZXRfdXJpID0gZ3N0X3VkcHNyY191cmlfc2V0X3VyaTsKK30KZGlmZiAtLWdpdCBhL2dzdC91ZHAvZ3N0dWRwc3JjLmggYi9nc3QvdWRwL2dzdHVkcHNyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2Zjg0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdWRwL2dzdHVkcHNyYy5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfVURQU1JDX0hfXworI2RlZmluZSBfX0dTVF9VRFBTUkNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0cHVzaHNyYy5oPgorI2luY2x1ZGUgPGdpby9naW8uaD4KKworR19CRUdJTl9ERUNMUworCisjaW5jbHVkZSAiZ3N0dWRwbmV0dXRpbHMuaCIKKworI2RlZmluZSBHU1RfVFlQRV9VRFBTUkMgXAorICAoZ3N0X3VkcHNyY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfVURQU1JDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVURQU1JDLEdzdFVEUFNyYykpCisjZGVmaW5lIEdTVF9VRFBTUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfVURQU1JDLEdzdFVEUFNyY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1VEUFNSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1VEUFNSQykpCisjZGVmaW5lIEdTVF9JU19VRFBTUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVURQU1JDKSkKKyNkZWZpbmUgR1NUX1VEUFNSQ19DQVNUKG9iaikgKChHc3RVRFBTcmMgKikob2JqKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFVEUFNyYyBHc3RVRFBTcmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VURQU3JjQ2xhc3MgR3N0VURQU3JjQ2xhc3M7CisKK3N0cnVjdCBfR3N0VURQU3JjIHsKKyAgR3N0UHVzaFNyYyBwYXJlbnQ7CisKKyAgLyogcHJvcGVydGllcyAqLworICBnY2hhciAgICAgKmFkZHJlc3M7CisgIGdpbnQgICAgICAgcG9ydDsKKyAgZ2NoYXIgICAgICptdWx0aV9pZmFjZTsKKyAgZ2ludCAgICAgICB0dGw7CisgIEdzdENhcHMgICAqY2FwczsKKyAgZ2ludCAgICAgICBidWZmZXJfc2l6ZTsKKyAgZ3VpbnQ2NCAgICB0aW1lb3V0OworICBnaW50ICAgICAgIHNraXBfZmlyc3RfYnl0ZXM7CisgIEdTb2NrZXQgICAqc29ja2V0OworICBnYm9vbGVhbiAgIGNsb3NlX3NvY2tldDsKKyAgZ2Jvb2xlYW4gICBhdXRvX211bHRpY2FzdDsKKyAgZ2Jvb2xlYW4gICByZXVzZTsKKyAgZ2Jvb2xlYW4gICBsb29wOworICBnYm9vbGVhbiAgIHJldHJpZXZlX3NlbmRlcl9hZGRyZXNzOworCisgIC8qIHN0YXRzICovCisgIGd1aW50ICAgICAgbWF4X3NpemU7CisKKyAgLyogb3VyIHNvY2tldHMgKi8KKyAgR1NvY2tldCAgICp1c2VkX3NvY2tldDsKKyAgR0luZXRTb2NrZXRBZGRyZXNzICphZGRyOworICBnYm9vbGVhbiAgIGV4dGVybmFsX3NvY2tldDsKKworICBnYm9vbGVhbiAgIG1hZGVfY2FuY2VsX2ZkOworICBHQ2FuY2VsbGFibGUgKmNhbmNlbGxhYmxlOworCisgIC8qIG1lbW9yeSBtYW5hZ2VtZW50ICovCisgIEdzdEFsbG9jYXRvciAqYWxsb2NhdG9yOworICBHc3RBbGxvY2F0aW9uUGFyYW1zIHBhcmFtczsKKworICBHc3RNZW1vcnkgICAqbWVtOworICBHc3RNYXBJbmZvICAgbWFwOworICBHc3RNZW1vcnkgICAqbWVtX21heDsKKyAgR3N0TWFwSW5mbyAgIG1hcF9tYXg7CisgIEdJbnB1dFZlY3RvciB2ZWNbMl07CisKKyAgZ2NoYXIgICAgICp1cmk7Cit9OworCitzdHJ1Y3QgX0dzdFVEUFNyY0NsYXNzIHsKKyAgR3N0UHVzaFNyY0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF91ZHBzcmNfZ2V0X3R5cGUodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKworI2VuZGlmIC8qIF9fR1NUX1VEUFNSQ19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC91ZHAvbWVzb24uYnVpbGQgYi9nc3QvdWRwL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYzU3NmQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdWRwL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMTcgQEAKK3VkcF9zb3VyY2VzID0gWworICAnZ3N0dWRwLmMnLAorICAnZ3N0dWRwc3JjLmMnLAorICAnZ3N0dWRwc2luay5jJywKKyAgJ2dzdG11bHRpdWRwc2luay5jJywKKyAgJ2dzdGR5bnVkcHNpbmsuYycsCisgICdnc3R1ZHBuZXR1dGlscy5jJworXQorCitnc3R1ZHAgPSBsaWJyYXJ5KCdnc3R1ZHAnLAorICB1ZHBfc291cmNlcywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luYywgbGlic2luY10sCisgIGRlcGVuZGVuY2llcyA6IFtnc3RfZGVwLCBnc3RiYXNlX2RlcCwgZ3N0bmV0X2RlcCwgZ2lvX2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9ib3gvTWFrZWZpbGUuYW0gYi9nc3QvdmlkZW9ib3gvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRiNWExMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb2JveC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDIwIEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3R2aWRlb2JveC5sYQorCitPUkNfU09VUkNFPWdzdHZpZGVvYm94b3JjCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29tbW9uL29yYy5tYWsKKworbGliZ3N0dmlkZW9ib3hfbGFfU09VUkNFUyA9IGdzdHZpZGVvYm94LmMKK25vZGlzdF9saWJnc3R2aWRlb2JveF9sYV9TT1VSQ0VTID0gJChPUkNfTk9ESVNUX1NPVVJDRVMpCitsaWJnc3R2aWRlb2JveF9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJCQkgICAkKEdTVF9CQVNFX0NGTEFHUykgXAorCQkJICAgJChHU1RfQ0ZMQUdTKSBcCisJCQkgICAkKE9SQ19DRkxBR1MpCitsaWJnc3R2aWRlb2JveF9sYV9MSUJBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgXAorCQkJICAgJChHU1RfQkFTRV9MSUJTKSBcCisJCQkgICAkKEdTVF9MSUJTKSBcCisJCQkgICAkKE9SQ19MSUJTKSBcCisJCQkgICAtbGdzdHZpZGVvLUBHU1RfQVBJX1ZFUlNJT05ACitsaWJnc3R2aWRlb2JveF9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gZ3N0dmlkZW9ib3guaAorRVhUUkFfRElTVCArPSBSRUFETUUKZGlmZiAtLWdpdCBhL2dzdC92aWRlb2JveC9SRUFETUUgYi9nc3QvdmlkZW9ib3gvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MWRhNTkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdmlkZW9ib3gvUkVBRE1FCkBAIC0wLDAgKzEsMjEgQEAKK1ZpZGVvYm94CistLS0tLS0tLQorCitUaGlzIHBsdWdpbiBjcm9wcyBvciBlbmxhcmdlcyB0aGUgaW1hZ2UuIEl0IHRha2VzIDQgdmFsdWVzIGFzIGlucHV0LCBhCit0b3AsIGJvdHRvbSwgbGVmdCBhbmQgcmlnaHQgb2Zmc2V0LiBQb3NpdGl2ZSB2YWx1ZXMgd2lsbCBjcm9wIHRoYXQgbXVjaAorcGl4ZWxzIGZyb20gdGhlIHJlc3BlY3RpdmUgYm9yZGVyIG9mIHRoZSBpbWFnZSwgbmVnYXRpdmUgdmFsdWVzIHdpbGwgYWRkCit0aGF0IG11Y2ggcGl4ZWxzLiBXaGVuIHBpeGVscyBhcmUgYWRkZWQsIHlvdSBjYW4gc3BlY2lmeSB0aGVpciBjb2xvci4gCitTb21lIHByZWRlZmluZWQgY29sb3JzIGFyZSB1c2FibGUgd2l0aCBhbiBlbnVtIHByb3BlcnR5LgorCitUaGUgcGx1Z2luIGlzIGFscGhhIGNoYW5uZWwgYXdhcmUgYW5kIHdpbGwgdHJ5IHRvIG5lZ290aWF0ZSB3aXRoIGEgZm9ybWF0Cit0aGF0IHN1cHBvcnRzIGFscGhhIGNoYW5uZWxzIGZpcnN0LiBXaGVuIGFscGhhIGNoYW5uZWwgaXMgYWN0aXZlIHR3bworb3RoZXIgcHJvcGVydGllcywgYWxwaGEgYW5kIGJvcmRlcl9hbHBoYSBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGFscGhhCit2YWx1ZXMgb2YgdGhlIGlubmVyIHBpY3R1cmUgYW5kIHRoZSBib3JkZXIgcmVzcGVjdGl2ZWx5LiBhbiBhbHBoYSB2YWx1ZSBvZgorMC4wIG1lYW5zIHRvdGFsIHRyYW5zcGFyZW5jeSwgMS4wIGlzIG9wYXF1ZS4KKworVGhlIHZpZGVvYm94IHBsdWdpbiBoYXMgbWFueSB1c2VzIHN1Y2ggYXMgZG9pbmcgYSBtb3NhaWMgb2YgcGljdHVyZXMsIAorbGV0dGVyYm94aW5nIHZpZGVvLCBjdXR0aW5nIG91dCBwaWVjZXMgb2YgdmlkZW8sIHBpY3R1cmUgaW4gcGljdHVyZSwgZXRjLi4KKworVE9ETworCistIGFkZCBlbnVtIHRvIHNwZWNpZnkgY29tbW9uIGFzcGVjdCByYXRpb3Mvc2l6ZXMgYW5kIGFkZCBib3JkZXJzL2Nyb3AKZGlmZiAtLWdpdCBhL2dzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jIGIvZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhmOTg0YwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jCkBAIC0wLDAgKzEsMzM0NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC12aWRlb2JveAorICogQHNlZV9hbHNvOiAjR3N0VmlkZW9Dcm9wCisgKgorICogVGhpcyBwbHVnaW4gY3JvcHMgb3IgZW5sYXJnZXMgdGhlIGltYWdlLiBJdCB0YWtlcyA0IHZhbHVlcyBhcyBpbnB1dCwgYQorICogdG9wLCBib3R0b20sIGxlZnQgYW5kIHJpZ2h0IG9mZnNldC4gUG9zaXRpdmUgdmFsdWVzIHdpbGwgY3JvcCB0aGF0IG11Y2gKKyAqIHBpeGVscyBmcm9tIHRoZSByZXNwZWN0aXZlIGJvcmRlciBvZiB0aGUgaW1hZ2UsIG5lZ2F0aXZlIHZhbHVlcyB3aWxsIGFkZAorICogdGhhdCBtdWNoIHBpeGVscy4gV2hlbiBwaXhlbHMgYXJlIGFkZGVkLCB5b3UgY2FuIHNwZWNpZnkgdGhlaXIgY29sb3IuIAorICogU29tZSBwcmVkZWZpbmVkIGNvbG9ycyBhcmUgdXNhYmxlIHdpdGggYW4gZW51bSBwcm9wZXJ0eS4KKyAqIAorICogVGhlIHBsdWdpbiBpcyBhbHBoYSBjaGFubmVsIGF3YXJlIGFuZCB3aWxsIHRyeSB0byBuZWdvdGlhdGUgd2l0aCBhIGZvcm1hdAorICogdGhhdCBzdXBwb3J0cyBhbHBoYSBjaGFubmVscyBmaXJzdC4gV2hlbiBhbHBoYSBjaGFubmVsIGlzIGFjdGl2ZSB0d28KKyAqIG90aGVyIHByb3BlcnRpZXMsIGFscGhhIGFuZCBib3JkZXJfYWxwaGEgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBhbHBoYQorICogdmFsdWVzIG9mIHRoZSBpbm5lciBwaWN0dXJlIGFuZCB0aGUgYm9yZGVyIHJlc3BlY3RpdmVseS4gYW4gYWxwaGEgdmFsdWUgb2YKKyAqIDAuMCBtZWFucyB0b3RhbCB0cmFuc3BhcmVuY3ksIDEuMCBpcyBvcGFxdWUuCisgKiAKKyAqIFRoZSB2aWRlb2JveCBwbHVnaW4gaGFzIG1hbnkgdXNlcyBzdWNoIGFzIGRvaW5nIGEgbW9zYWljIG9mIHBpY3R1cmVzLCAKKyAqIGxldHRlcmJveGluZyB2aWRlbywgY3V0dGluZyBvdXQgcGllY2VzIG9mIHZpZGVvLCBwaWN0dXJlIGluIHBpY3R1cmUsIGV0Yy4uCisgKgorICogU2V0dGluZyBhdXRvY3JvcCB0byB0cnVlIGNoYW5nZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSBwbHVnaW4gc28gdGhhdAorICogY2FwcyBkZXRlcm1pbmUgY3JvcCBwcm9wZXJ0aWVzIHJhdGhlciB0aGFuIHRoZSBvdGhlciB3YXkgYXJvdW5kOiBnaXZlbgorICogaW5wdXQgYW5kIG91dHB1dCBkaW1lbnNpb25zLCB0aGUgY3JvcCB2YWx1ZXMgYXJlIHNlbGVjdGVkIHNvIHRoYXQgdGhlCisgKiBzbWFsbGVyIGZyYW1lIGlzIGVmZmVjdGl2ZWx5IGNlbnRlcmVkIGluIHRoZSBsYXJnZXIgZnJhbWUuICBUaGlzCisgKiBpbnZvbHZlcyBlaXRoZXIgY3JvcHBpbmcgb3IgcGFkZGluZy4KKyAqIAorICogSWYgeW91IHVzZSBhdXRvY3JvcCB0aGVyZSBpcyBsaXR0bGUgcG9pbnQgaW4gc2V0dGluZyB0aGUgb3RoZXIKKyAqIHByb3BlcnRpZXMgbWFudWFsbHkgYmVjYXVzZSB0aGV5IHdpbGwgYmUgb3ZlcnJpZGVuIGlmIHRoZSBjYXBzIGNoYW5nZSwKKyAqIGJ1dCBub3RoaW5nIHN0b3BzIHlvdSBmcm9tIGRvaW5nIHNvLgorICogCisgKiBTYW1wbGUgcGlwZWxpbmU6CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdmlkZW90ZXN0c3JjICEgdmlkZW9ib3ggYXV0b2Nyb3A9dHJ1ZSAhIFwKKyAqICAgInZpZGVvL3gtcmF3LCB3aWR0aD02MDAsIGhlaWdodD00MDAiICEgdmlkZW9jb252ZXJ0ICEgeGltYWdlc2luaworICogXXwKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3R2aWRlb2JveC5oIgorI2luY2x1ZGUgImdzdHZpZGVvYm94b3JjLmgiCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHZpZGVvYm94X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHZpZGVvYm94X2RlYnVnCisKKy8qIEZyb20gdmlkZW90ZXN0c3JjLmMgKi8KK3N0YXRpYyBjb25zdCBndWludDggeXV2X3NkdHZfY29sb3JzX1lbVklERU9fQk9YX0ZJTExfTEFTVF0gPQorICAgIHsgMTYsIDE0NSwgNDEsIDgxLCAyMTAsIDIzNSB9Oworc3RhdGljIGNvbnN0IGd1aW50OCB5dXZfc2R0dl9jb2xvcnNfVVtWSURFT19CT1hfRklMTF9MQVNUXSA9CisgICAgeyAxMjgsIDU0LCAyNDAsIDkwLCAxNiwgMTI4IH07CitzdGF0aWMgY29uc3QgZ3VpbnQ4IHl1dl9zZHR2X2NvbG9yc19WW1ZJREVPX0JPWF9GSUxMX0xBU1RdID0KKyAgICB7IDEyOCwgMzQsIDExMCwgMjQwLCAxNDYsIDEyOCB9OworCitzdGF0aWMgY29uc3QgZ3VpbnQ4IHl1dl9oZHR2X2NvbG9yc19ZW1ZJREVPX0JPWF9GSUxMX0xBU1RdID0KKyAgICB7IDE2LCAxNzMsIDMyLCA2MywgMjE5LCAyMzUgfTsKK3N0YXRpYyBjb25zdCBndWludDggeXV2X2hkdHZfY29sb3JzX1VbVklERU9fQk9YX0ZJTExfTEFTVF0gPQorICAgIHsgMTI4LCA0MiwgMjQwLCAxMDIsIDE2LCAxMjggfTsKK3N0YXRpYyBjb25zdCBndWludDggeXV2X2hkdHZfY29sb3JzX1ZbVklERU9fQk9YX0ZJTExfTEFTVF0gPQorICAgIHsgMTI4LCAyNiwgMTE4LCAyNDAsIDEzOCwgMTI4IH07CisKK3N0YXRpYyBjb25zdCBndWludDggcmdiX2NvbG9yc19SW1ZJREVPX0JPWF9GSUxMX0xBU1RdID0KKyAgICB7IDAsIDAsIDAsIDI1NSwgMjU1LCAyNTUgfTsKK3N0YXRpYyBjb25zdCBndWludDggcmdiX2NvbG9yc19HW1ZJREVPX0JPWF9GSUxMX0xBU1RdID0KKyAgICB7IDAsIDI1NSwgMCwgMCwgMjU1LCAyNTUgfTsKK3N0YXRpYyBjb25zdCBndWludDggcmdiX2NvbG9yc19CW1ZJREVPX0JPWF9GSUxMX0xBU1RdID0KKyAgICB7IDAsIDAsIDI1NSwgMCwgMCwgMjU1IH07CisKKy8qIEdlbmVyYXRlZCBieSAtYmFkL2V4dC9jb2cvZ2VuZXJhdGVfdGFibGVzICovCitzdGF0aWMgY29uc3QgaW50IGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfaGR0dltdID0geworICAyOTgsIDAsIDQ1OSwgLTYzNTE0LAorICAyOTgsIC01NSwgLTEzNiwgMTk2ODEsCisgIDI5OCwgNTQxLCAwLCAtNzM5ODgsCit9OworCitzdGF0aWMgY29uc3QgaW50IGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfc2R0dltdID0geworICAyOTgsIDAsIDQwOSwgLTU3MDY4LAorICAyOTgsIC0xMDAsIC0yMDgsIDM0NzA3LAorICAyOTgsIDUxNiwgMCwgLTcwODcwLAorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9oZHR2W10gPSB7CisgIDQ3LCAxNTcsIDE2LCA0MDk2LAorICAtMjYsIC04NywgMTEyLCAzMjc2OCwKKyAgMTEyLCAtMTAyLCAtMTAsIDMyNzY4LAorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9zZHR2W10gPSB7CisgIDY2LCAxMjksIDI1LCA0MDk2LAorICAtMzgsIC03NCwgMTEyLCAzMjc2OCwKKyAgMTEyLCAtOTQsIC0xOCwgMzI3NjgsCit9OworCitzdGF0aWMgY29uc3QgZ2ludCBjb2dfeWNiY3Jfc2R0dl90b195Y2Jjcl9oZHR2X21hdHJpeF84Yml0W10gPSB7CisgIDI1NiwgLTMwLCAtNTMsIDEwNjAwLAorICAwLCAyNjEsIDI5LCAtNDM2NywKKyAgMCwgMTksIDI2MiwgLTMyODksCit9OworCitzdGF0aWMgY29uc3QgZ2ludCBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0W10gPSB7CisgIDI1NiwgMjUsIDQ5LCAtOTUzNiwKKyAgMCwgMjUzLCAtMjgsIDM5NTgsCisgIDAsIC0xOSwgMjUyLCAyOTE4LAorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgY29nX2lkZW50aXR5X21hdHJpeF84Yml0W10gPSB7CisgIDI1NiwgMCwgMCwgMCwKKyAgMCwgMjU2LCAwLCAwLAorICAwLCAwLCAyNTYsIDAsCit9OworCisjZGVmaW5lIEFQUExZX01BVFJJWChtLG8sdjEsdjIsdjMpICgobVtvKjRdICogdjEgKyBtW28qNCsxXSAqIHYyICsgbVtvKjQrMl0gKiB2MyArIG1bbyo0KzNdKSA+PiA4KQorCitzdGF0aWMgdm9pZAorZmlsbF9heXV2IChHc3RWaWRlb0JveEZpbGwgZmlsbF90eXBlLCBndWludCBiX2FscGhhLAorICAgIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSwgZ2Jvb2xlYW4gc2R0dikKK3sKKyAgZ3VpbnQzMiBlbXB0eV9waXhlbDsKKyAgZ3VpbnQ4ICpkZXN0OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgc3RyaWRlOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChmcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGZyYW1lKTsKKworICBiX2FscGhhID0gQ0xBTVAgKGJfYWxwaGEsIDAsIDI1NSk7CisKKyAgaWYgKHNkdHYpCisgICAgZW1wdHlfcGl4ZWwgPSBHVUlOVDMyX0ZST01fQkUgKChiX2FscGhhIDw8IDI0KSB8CisgICAgICAgICh5dXZfc2R0dl9jb2xvcnNfWVtmaWxsX3R5cGVdIDw8IDE2KSB8CisgICAgICAgICh5dXZfc2R0dl9jb2xvcnNfVVtmaWxsX3R5cGVdIDw8IDgpIHwgeXV2X3NkdHZfY29sb3JzX1ZbZmlsbF90eXBlXSk7CisgIGVsc2UKKyAgICBlbXB0eV9waXhlbCA9IEdVSU5UMzJfRlJPTV9CRSAoKGJfYWxwaGEgPDwgMjQpIHwKKyAgICAgICAgKHl1dl9oZHR2X2NvbG9yc19ZW2ZpbGxfdHlwZV0gPDwgMTYpIHwKKyAgICAgICAgKHl1dl9oZHR2X2NvbG9yc19VW2ZpbGxfdHlwZV0gPDwgOCkgfCB5dXZfaGR0dl9jb2xvcnNfVltmaWxsX3R5cGVdKTsKKworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZyYW1lLCAwKTsKKyAgc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoZnJhbWUsIDApOworCisgIGlmIChHX0xJS0VMWSAoc3RyaWRlID09IDQgKiB3aWR0aCkpCisgICAgdmlkZW9fYm94X29yY19zcGxhdF91MzIgKChndWludDMyICopIGRlc3QsIGVtcHR5X3BpeGVsLCB3aWR0aCAqIGhlaWdodCk7CisgIGVsc2UgaWYgKGhlaWdodCkgeworICAgIGZvciAoOyBoZWlnaHQ7IC0taGVpZ2h0KSB7CisgICAgICB2aWRlb19ib3hfb3JjX3NwbGF0X3UzMiAoKGd1aW50MzIgKikgZGVzdCwgZW1wdHlfcGl4ZWwsIHdpZHRoKTsKKyAgICAgIGRlc3QgKz0gc3RyaWRlOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorY29weV9heXV2X2F5dXYgKGd1aW50IGlfYWxwaGEsIEdzdFZpZGVvRnJhbWUgKiBkZXN0X2ZyYW1lLAorICAgIGdib29sZWFuIGRlc3Rfc2R0diwgZ2ludCBkZXN0X3gsIGdpbnQgZGVzdF95LCBHc3RWaWRlb0ZyYW1lICogc3JjX2ZyYW1lLAorICAgIGdib29sZWFuIHNyY19zZHR2LCBnaW50IHNyY194LCBnaW50IHNyY195LCBnaW50IHcsIGdpbnQgaCkKK3sKKyAgZ2ludCBpLCBqOworICBnaW50IHNyY19zdHJpZGU7CisgIGdpbnQgZGVzdF9zdHJpZGU7CisgIGd1aW50OCAqZGVzdCwgKnNyYzsKKworICBzcmNfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoc3JjX2ZyYW1lLCAwKTsKKyAgZGVzdF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChkZXN0X2ZyYW1lLCAwKTsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjX2ZyYW1lLCAwKTsKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0X2ZyYW1lLCAwKTsKKworICBkZXN0ID0gZGVzdCArIGRlc3RfeSAqIGRlc3Rfc3RyaWRlICsgZGVzdF94ICogNDsKKyAgc3JjID0gc3JjICsgc3JjX3kgKiBzcmNfc3RyaWRlICsgc3JjX3ggKiA0OworCisgIHcgKj0gNDsKKworICBpZiAoZGVzdF9zZHR2ICE9IHNyY19zZHR2KSB7CisgICAgZ2ludCBtYXRyaXhbMTJdOworICAgIGdpbnQgeSwgdSwgdjsKKworICAgIG1lbWNweSAobWF0cml4LAorICAgICAgICBkZXN0X3NkdHYgPyBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0IDoKKyAgICAgICAgY29nX3ljYmNyX3NkdHZfdG9feWNiY3JfaGR0dl9tYXRyaXhfOGJpdCwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqICs9IDQpIHsKKyAgICAgICAgLyogT1JDIEZJWE1FICovCisgICAgICAgIGRlc3Rbal0gPSAoc3JjW2pdICogaV9hbHBoYSkgPj4gODsKKyAgICAgICAgeSA9IHNyY1tqICsgMV07CisgICAgICAgIHUgPSBzcmNbaiArIDJdOworICAgICAgICB2ID0gc3JjW2ogKyAzXTsKKyAgICAgICAgZGVzdFtqICsgMV0gPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeSwgdSwgdik7CisgICAgICAgIGRlc3RbaiArIDJdID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHksIHUsIHYpOworICAgICAgICBkZXN0W2ogKyAzXSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5LCB1LCB2KTsKKyAgICAgIH0KKyAgICAgIGRlc3QgKz0gZGVzdF9zdHJpZGU7CisgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IHc7IGogKz0gNCkgeworICAgICAgICAvKiBPUkMgRklYTUUgKi8KKyAgICAgICAgZGVzdFtqXSA9IChzcmNbal0gKiBpX2FscGhhKSA+PiA4OworICAgICAgICBkZXN0W2ogKyAxXSA9IHNyY1tqICsgMV07CisgICAgICAgIGRlc3RbaiArIDJdID0gc3JjW2ogKyAyXTsKKyAgICAgICAgZGVzdFtqICsgM10gPSBzcmNbaiArIDNdOworICAgICAgfQorICAgICAgZGVzdCArPSBkZXN0X3N0cmlkZTsKKyAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorY29weV9heXV2X2k0MjAgKGd1aW50IGlfYWxwaGEsIEdzdFZpZGVvRnJhbWUgKiBkZXN0X2ZyYW1lLAorICAgIGdib29sZWFuIGRlc3Rfc2R0diwgZ2ludCBkZXN0X3gsIGdpbnQgZGVzdF95LCBHc3RWaWRlb0ZyYW1lICogc3JjX2ZyYW1lLAorICAgIGdib29sZWFuIHNyY19zZHR2LCBnaW50IHNyY194LCBnaW50IHNyY195LCBnaW50IHcsIGdpbnQgaCkKK3sKKyAgZ2ludCBpLCBqOworICBndWludDggKmRlc3RZLCAqZGVzdFkyLCAqZGVzdFUsICpkZXN0VjsKKyAgZ2ludCBkZXN0X3N0cmlkZVksIGRlc3Rfc3RyaWRlVSwgZGVzdF9zdHJpZGVWOworICBjb25zdCBndWludDggKnNyYzI7CisgIGdpbnQgc3JjX3N0cmlkZTsKKyAgZ2ludCB5X2lkeCwgdXZfaWR4OworICBnaW50IHkxLCB5MiwgeTMsIHk0OworICBnaW50IHUxLCB1MiwgdTMsIHU0OworICBnaW50IHYxLCB2MiwgdjMsIHY0OworICBnaW50IG1hdHJpeFsxMl07CisgIGd1aW50OCAqc3JjOworICBnaW50IGRlc3RfaGVpZ2h0LCBzcmNfaGVpZ2h0LCBkZXN0X3dpZHRoOworCisgIGRlc3RfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoZGVzdF9mcmFtZSk7CisgIGRlc3Rfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGRlc3RfZnJhbWUpOworICBzcmNfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoc3JjX2ZyYW1lKTsKKworICBkZXN0X3N0cmlkZVkgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGRlc3RfZnJhbWUsIDApOworICBkZXN0X3N0cmlkZVUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGRlc3RfZnJhbWUsIDEpOworICBkZXN0X3N0cmlkZVYgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGRlc3RfZnJhbWUsIDIpOworCisgIHNyY19zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChzcmNfZnJhbWUsIDApOworCisgIGRlc3RZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdF9mcmFtZSwgMCk7CisgIGRlc3RVID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdF9mcmFtZSwgMSk7CisgIGRlc3RWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdF9mcmFtZSwgMik7CisKKyAgZGVzdFkgPSBkZXN0WSArIGRlc3RfeSAqIGRlc3Rfc3RyaWRlWSArIGRlc3RfeDsKKyAgZGVzdFkyID0gKGRlc3RfeSA8IGRlc3RfaGVpZ2h0KSA/IGRlc3RZICsgZGVzdF9zdHJpZGVZIDogZGVzdFk7CisgIGRlc3RVID0gZGVzdFUgKyAoZGVzdF95IC8gMikgKiBkZXN0X3N0cmlkZVUgKyBkZXN0X3ggLyAyOworICBkZXN0ViA9IGRlc3RWICsgKGRlc3RfeSAvIDIpICogZGVzdF9zdHJpZGVWICsgZGVzdF94IC8gMjsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjX2ZyYW1lLCAwKTsKKyAgc3JjID0gc3JjICsgc3JjX3kgKiBzcmNfc3RyaWRlICsgc3JjX3ggKiA0OworICBzcmMyID0gKHNyY195IDwgc3JjX2hlaWdodCkgPyBzcmMgKyBzcmNfc3RyaWRlIDogc3JjOworCisgIGggPSBkZXN0X3kgKyBoOworICB3ID0gZGVzdF94ICsgdzsKKworICBpZiAoc3JjX3NkdHYgIT0gZGVzdF9zZHR2KQorICAgIG1lbWNweSAobWF0cml4LAorICAgICAgICBkZXN0X3NkdHYgPyBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0IDoKKyAgICAgICAgY29nX3ljYmNyX3NkdHZfdG9feWNiY3JfaGR0dl9tYXRyaXhfOGJpdCwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKyAgZWxzZQorICAgIG1lbWNweSAobWF0cml4LCBjb2dfaWRlbnRpdHlfbWF0cml4XzhiaXQsIDEyICogc2l6ZW9mIChnaW50KSk7CisKKyAgLyogMS4gSGFuZGxlIHRoZSBmaXJzdCBkZXN0aW5hdGlvbiBzY2FubGluZSBzcGVjaWFsbHkgaWYgaXQKKyAgICogICAgZG9lc24ndCBzdGFydCBhdCB0aGUgbWFjcm8gcGl4ZWwgYm91bmRhcnksIGkuZS4gYmxlbmQKKyAgICogICAgd2l0aCB0aGUgYmFja2dyb3VuZCEgKi8KKyAgaWYgKGRlc3RfeSAlIDIgPT0gMSkgeworICAgIC8qIDEuMS4gSGFuZGxlIHRoZSBmaXJzdCBkZXN0aW5hdGlvbiBwaXhlbCBpZiBpdCBkb2Vzbid0CisgICAgICogICAgICBzdGFydCBhdCB0aGUgbWFjcm8gcGl4ZWwgYm91bmRhcnksIGkuZS4gYmxlbmQgd2l0aAorICAgICAqICAgICAgdGhlIGJhY2tncm91bmQhICovCisgICAgaWYgKGRlc3RfeCAlIDIgPT0gMSkgeworICAgICAgeTEgPSBzcmNbNCAqIDAgKyAxXTsKKyAgICAgIHUxID0gc3JjWzQgKiAwICsgMl07CisgICAgICB2MSA9IHNyY1s0ICogMCArIDNdOworCisgICAgICBkZXN0WVswXSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0VVswXSA9CisgICAgICAgICAgQ0xBTVAgKCgzICogZGVzdFVbMF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkpIC8gNCwgMCwKKyAgICAgICAgICAyNTUpOworICAgICAgZGVzdFZbMF0gPQorICAgICAgICAgIENMQU1QICgoMyAqIGRlc3RWWzBdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkxLCB1MSwgdjEpKSAvIDQsIDAsCisgICAgICAgICAgMjU1KTsKKworICAgICAgaiA9IGRlc3RfeCArIDE7CisgICAgICB5X2lkeCA9IHV2X2lkeCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGogPSBkZXN0X3g7CisgICAgICB5X2lkeCA9IHV2X2lkeCA9IDA7CisgICAgfQorCisgICAgLyogMS4yLiBDb3B5IGFsbCBtYWNybyBwaXhlbHMgZnJvbSB0aGUgc291cmNlIHRvIHRoZSBkZXN0aW5hdGlvbgorICAgICAqICAgICAgYnV0IGJsZW5kIHdpdGggdGhlIGJhY2tncm91bmQgYmVjYXVzZSB3ZSdyZSBvbmx5IGZpbGxpbmcKKyAgICAgKiAgICAgIHRoZSBsb3dlciBwYXJ0IG9mIHRoZSBtYWNybyBwaXhlbHMuICovCisgICAgZm9yICg7IGogPCB3IC0gMTsgaiArPSAyKSB7CisgICAgICB5MSA9IHNyY1s0ICogeV9pZHggKyAxXTsKKyAgICAgIHkyID0gc3JjWzQgKiB5X2lkeCArIDQgKyAxXTsKKworICAgICAgdTEgPSBzcmNbNCAqIHlfaWR4ICsgMl07CisgICAgICB1MiA9IHNyY1s0ICogeV9pZHggKyA0ICsgMl07CisKKyAgICAgIHYxID0gc3JjWzQgKiB5X2lkeCArIDNdOworICAgICAgdjIgPSBzcmNbNCAqIHlfaWR4ICsgNCArIDNdOworCisgICAgICBkZXN0WVt5X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFlbeV9pZHggKyAxXSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUyLCB2MiksIDAsIDI1NSk7CisgICAgICBkZXN0VVt1dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgICgyICogZGVzdFVbdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTIsIHUyLCB2MikpIC8gNCwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKDIgKiBkZXN0Vlt1dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwgdTIsIHYyKSkgLyA0LCAwLCAyNTUpOworCisgICAgICB5X2lkeCArPSAyOworICAgICAgdXZfaWR4Kys7CisgICAgfQorCisgICAgLyogMS4zLiBOb3cgY29weSB0aGUgbGFzdCBwaXhlbCBpZiBvbmUgZXhpc3RzIGFuZCBibGVuZCBpdAorICAgICAqICAgICAgd2l0aCB0aGUgYmFja2dyb3VuZCBiZWNhdXNlIHdlIG9ubHkgZmlsbCBwYXJ0IG9mCisgICAgICogICAgICB0aGUgbWFjcm8gcGl4ZWwuIEluIGNhc2UgdGhpcyBpcyB0aGUgbGFzdCBwaXhlbCBvZgorICAgICAqICAgICAgdGhlIGRlc3RpbmF0aW9uIHdlIHdpbGwgYSBsYXJnZXIgcGFydC4gKi8KKyAgICBpZiAoaiA9PSB3IC0gMSAmJiBqID09IGRlc3Rfd2lkdGggLSAxKSB7CisgICAgICB5MSA9IHNyY1s0ICogeV9pZHggKyAxXTsKKyAgICAgIHUxID0gc3JjWzQgKiB5X2lkeCArIDJdOworICAgICAgdjEgPSBzcmNbNCAqIHlfaWR4ICsgM107CisKKyAgICAgIGRlc3RZW3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0VVt1dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgIChkZXN0VVt1dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwgdjEpKSAvIDIsIDAsIDI1NSk7CisgICAgICBkZXN0Vlt1dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgIChkZXN0Vlt1dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkxLCB1MSwgdjEpKSAvIDIsIDAsIDI1NSk7CisgICAgfSBlbHNlIGlmIChqID09IHcgLSAxKSB7CisgICAgICB5MSA9IHNyY1s0ICogeV9pZHggKyAxXTsKKyAgICAgIHUxID0gc3JjWzQgKiB5X2lkeCArIDJdOworICAgICAgdjEgPSBzcmNbNCAqIHlfaWR4ICsgM107CisKKyAgICAgIGRlc3RZW3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0VVt1dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgICgzICogZGVzdFVbdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyA0LCAwLAorICAgICAgICAgIDI1NSk7CisgICAgICBkZXN0Vlt1dl9pZHhdID0KKyAgICAgICAgICBDTEFNUCAoKDMgKiBkZXN0Vlt1dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkxLCB1MSwgdjEpKSAvIDQsCisgICAgICAgICAgMCwgMjU1KTsKKyAgICB9CisKKyAgICBkZXN0WSArPSBkZXN0X3N0cmlkZVk7CisgICAgZGVzdFkyICs9IGRlc3Rfc3RyaWRlWTsKKyAgICBkZXN0VSArPSBkZXN0X3N0cmlkZVU7CisgICAgZGVzdFYgKz0gZGVzdF9zdHJpZGVWOworICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIHNyYzIgKz0gc3JjX3N0cmlkZTsKKyAgICBpID0gZGVzdF95ICsgMTsKKyAgfSBlbHNlIHsKKyAgICBpID0gZGVzdF95OworICB9CisKKyAgLyogMi4gQ29weSBhbGwgbWFjcm8gcGl4ZWwgc2NhbmxpbmVzLCB0aGUgZGVzdGluYXRpb24gc2NhbmxpbmUKKyAgICogICAgbm93IHN0YXJ0cyBhdCBtYWNybyBwaXhlbCBib3VuZGFyeS4gKi8KKyAgZm9yICg7IGkgPCBoIC0gMTsgaSArPSAyKSB7CisgICAgLyogMi4xLiBIYW5kbGUgdGhlIGZpcnN0IGRlc3RpbmF0aW9uIHBpeGVsIGlmIGl0IGRvZXNuJ3QKKyAgICAgKiAgICAgIHN0YXJ0IGF0IHRoZSBtYWNybyBwaXhlbCBib3VuZGFyeSwgaS5lLiBibGVuZCB3aXRoCisgICAgICogICAgICB0aGUgYmFja2dyb3VuZCEgKi8KKyAgICBpZiAoZGVzdF94ICUgMiA9PSAxKSB7CisgICAgICB5MSA9IHNyY1s0ICogMCArIDFdOworICAgICAgeTIgPSBzcmMyWzQgKiAwICsgMV07CisgICAgICB1MSA9IHNyY1s0ICogMCArIDJdOworICAgICAgdTIgPSBzcmMyWzQgKiAwICsgMl07CisgICAgICB2MSA9IHNyY1s0ICogMCArIDNdOworICAgICAgdjIgPSBzcmMyWzQgKiAwICsgM107CisKKyAgICAgIGRlc3RZWzBdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RZMlswXSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUyLCB2MiksIDAsIDI1NSk7CisgICAgICBkZXN0VVswXSA9IENMQU1QICgKKyAgICAgICAgICAoMiAqIGRlc3RVWzBdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MiwgdTIsIHYyKSkgLyA0LCAwLCAyNTUpOworICAgICAgZGVzdFZbMF0gPSBDTEFNUCAoCisgICAgICAgICAgKDIgKiBkZXN0VlswXSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTIsIHUyLCB2MikpIC8gNCwgMCwgMjU1KTsKKyAgICAgIGogPSBkZXN0X3ggKyAxOworICAgICAgeV9pZHggPSB1dl9pZHggPSAxOworICAgIH0gZWxzZSB7CisgICAgICBqID0gZGVzdF94OworICAgICAgeV9pZHggPSB1dl9pZHggPSAwOworICAgIH0KKworICAgIC8qIDIuMi4gQ29weSBhbGwgbWFjcm8gcGl4ZWxzIGZyb20gdGhlIHNvdXJjZSB0byB0aGUgZGVzdGluYXRpb24uCisgICAgICogICAgICBBbGwgcGl4ZWxzIG5vdyBzdGFydCBhdCBtYWNybyBwaXhlbCBib3VuZGFyeSwgaS5lLiBubworICAgICAqICAgICAgYmxlbmRpbmcgd2l0aCB0aGUgYmFja2dyb3VuZCBpcyBuZWNlc3NhcnkuICovCisgICAgZm9yICg7IGogPCB3IC0gMTsgaiArPSAyKSB7CisgICAgICB5MSA9IHNyY1s0ICogeV9pZHggKyAxXTsKKyAgICAgIHkyID0gc3JjWzQgKiB5X2lkeCArIDQgKyAxXTsKKyAgICAgIHkzID0gc3JjMls0ICogeV9pZHggKyAxXTsKKyAgICAgIHk0ID0gc3JjMls0ICogeV9pZHggKyA0ICsgMV07CisKKyAgICAgIHUxID0gc3JjWzQgKiB5X2lkeCArIDJdOworICAgICAgdTIgPSBzcmNbNCAqIHlfaWR4ICsgNCArIDJdOworICAgICAgdTMgPSBzcmMyWzQgKiB5X2lkeCArIDJdOworICAgICAgdTQgPSBzcmMyWzQgKiB5X2lkeCArIDQgKyAyXTsKKworICAgICAgdjEgPSBzcmNbNCAqIHlfaWR4ICsgM107CisgICAgICB2MiA9IHNyY1s0ICogeV9pZHggKyA0ICsgM107CisgICAgICB2MyA9IHNyYzJbNCAqIHlfaWR4ICsgM107CisgICAgICB2NCA9IHNyYzJbNCAqIHlfaWR4ICsgNCArIDNdOworCisgICAgICBkZXN0WVt5X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFlbeV9pZHggKyAxXSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUyLCB2MiksIDAsIDI1NSk7CisgICAgICBkZXN0WTJbeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MywgdTMsIHYzKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RZMlt5X2lkeCArIDFdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5NCwgdTQsIHY0KSwgMCwgMjU1KTsKKworICAgICAgZGVzdFVbdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwgdjEpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkyLAorICAgICAgICAgICAgICAgICAgdTIsIHYyKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MywgdTMsCisgICAgICAgICAgICAgICAgICB2MykgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTQsIHU0LCB2NCkpIC8gNCwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwKKyAgICAgICAgICAgICAgICAgIHUyLCB2MikgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTMsIHUzLAorICAgICAgICAgICAgICAgICAgdjMpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHk0LCB1NCwgdjQpKSAvIDQsIDAsIDI1NSk7CisKKyAgICAgIHlfaWR4ICs9IDI7CisgICAgICB1dl9pZHgrKzsKKyAgICB9CisKKyAgICAvKiAyLjMuIE5vdyBjb3B5IHRoZSBsYXN0IHBpeGVsIGlmIG9uZSBleGlzdHMgYW5kIGJsZW5kIGl0CisgICAgICogICAgICB3aXRoIHRoZSBiYWNrZ3JvdW5kIGJlY2F1c2Ugd2Ugb25seSBmaWxsIHBhcnQgb2YKKyAgICAgKiAgICAgIHRoZSBtYWNybyBwaXhlbC4gSW4gY2FzZSB0aGlzIGlzIHRoZSBsYXN0IHBpeGVsIG9mCisgICAgICogICAgICB0aGUgZGVzdGluYXRpb24gd2Ugd2lsbCBhIGxhcmdlciBwYXJ0LiAqLworICAgIGlmIChqID09IHcgLSAxICYmIGogPT0gZGVzdF93aWR0aCAtIDEpIHsKKyAgICAgIHkxID0gc3JjWzQgKiB5X2lkeCArIDFdOworICAgICAgeTIgPSBzcmMyWzQgKiB5X2lkeCArIDFdOworCisgICAgICB1MSA9IHNyY1s0ICogeV9pZHggKyAyXTsKKyAgICAgIHUyID0gc3JjMls0ICogeV9pZHggKyAyXTsKKworICAgICAgdjEgPSBzcmNbNCAqIHlfaWR4ICsgM107CisgICAgICB2MiA9IHNyYzJbNCAqIHlfaWR4ICsgM107CisKKyAgICAgIGRlc3RZW3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WTJbeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MiwgdTIsIHYyKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVW3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwKKyAgICAgICAgICAgICAgICAgIHUyLCB2MikpIC8gMiwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwKKyAgICAgICAgICAgICAgICAgIHUyLCB2MikpIC8gMiwgMCwgMjU1KTsKKyAgICB9IGVsc2UgaWYgKGogPT0gdyAtIDEpIHsKKyAgICAgIHkxID0gc3JjWzQgKiB5X2lkeCArIDFdOworICAgICAgeTIgPSBzcmMyWzQgKiB5X2lkeCArIDFdOworCisgICAgICB1MSA9IHNyY1s0ICogeV9pZHggKyAyXTsKKyAgICAgIHUyID0gc3JjMls0ICogeV9pZHggKyAyXTsKKworICAgICAgdjEgPSBzcmNbNCAqIHlfaWR4ICsgM107CisgICAgICB2MiA9IHNyYzJbNCAqIHlfaWR4ICsgM107CisKKyAgICAgIGRlc3RZW3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WTJbeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MiwgdTIsIHYyKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVW3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKDIgKiBkZXN0VVt1dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwgdTIsIHYyKSkgLyA0LCAwLCAyNTUpOworICAgICAgZGVzdFZbdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoMiAqIGRlc3RWW3V2X2lkeF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLAorICAgICAgICAgICAgICAgICAgdjEpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkyLCB1MiwgdjIpKSAvIDQsIDAsIDI1NSk7CisgICAgfQorCisgICAgZGVzdFkgKz0gMiAqIGRlc3Rfc3RyaWRlWTsKKyAgICBkZXN0WTIgKz0gMiAqIGRlc3Rfc3RyaWRlWTsKKyAgICBkZXN0VSArPSBkZXN0X3N0cmlkZVU7CisgICAgZGVzdFYgKz0gZGVzdF9zdHJpZGVWOworICAgIHNyYyArPSAyICogc3JjX3N0cmlkZTsKKyAgICBzcmMyICs9IDIgKiBzcmNfc3RyaWRlOworICB9CisKKyAgLyogMy4gSGFuZGxlIHRoZSBsYXN0IHNjYW5saW5lIGlmIG9uZSBleGlzdHMuIFRoaXMgYWdhaW4KKyAgICogICAgZG9lc24ndCBzdGFydCBhdCBtYWNybyBwaXhlbCBib3VuZGFyeSBidXQgc2hvdWxkCisgICAqICAgIG9ubHkgZmlsbCB0aGUgdXBwZXIgcGFydCBvZiB0aGUgbWFjcm8gcGl4ZWxzLiAqLworICBpZiAoaSA9PSBoIC0gMSAmJiBpID09IGRlc3RfaGVpZ2h0IC0gMSkgeworICAgIC8qIDMuMS4gSGFuZGxlIHRoZSBmaXJzdCBkZXN0aW5hdGlvbiBwaXhlbCBpZiBpdCBkb2Vzbid0CisgICAgICogICAgICBzdGFydCBhdCB0aGUgbWFjcm8gcGl4ZWwgYm91bmRhcnksIGkuZS4gYmxlbmQgd2l0aAorICAgICAqICAgICAgdGhlIGJhY2tncm91bmQhICovCisgICAgaWYgKGRlc3RfeCAlIDIgPT0gMSkgeworICAgICAgeTEgPSBzcmNbNCAqIDAgKyAxXTsKKyAgICAgIHUxID0gc3JjWzQgKiAwICsgMl07CisgICAgICB2MSA9IHNyY1s0ICogMCArIDNdOworCisgICAgICBkZXN0WVswXSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0VVswXSA9CisgICAgICAgICAgQ0xBTVAgKChkZXN0VVswXSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyAyLCAwLCAyNTUpOworICAgICAgZGVzdFZbMF0gPQorICAgICAgICAgIENMQU1QICgoZGVzdFZbMF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTEsIHUxLCB2MSkpIC8gMiwgMCwgMjU1KTsKKworICAgICAgaiA9IGRlc3RfeCArIDE7CisgICAgICB5X2lkeCA9IHV2X2lkeCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGogPSBkZXN0X3g7CisgICAgICB5X2lkeCA9IHV2X2lkeCA9IDA7CisgICAgfQorCisgICAgLyogMy4yLiBDb3B5IGFsbCBtYWNybyBwaXhlbHMgZnJvbSB0aGUgc291cmNlIHRvIHRoZSBkZXN0aW5hdGlvbgorICAgICAqICAgICAgYnV0IGJsZW5kIHdpdGggdGhlIGJhY2tncm91bmQgYmVjYXVzZSB3ZSdyZSBvbmx5IGZpbGxpbmcKKyAgICAgKiAgICAgIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSBtYWNybyBwaXhlbHMuICovCisgICAgZm9yICg7IGogPCB3IC0gMTsgaiArPSAyKSB7CisgICAgICB5MSA9IHNyY1s0ICogeV9pZHggKyAxXTsKKyAgICAgIHkyID0gc3JjWzQgKiB5X2lkeCArIDQgKyAxXTsKKworICAgICAgdTEgPSBzcmNbNCAqIHlfaWR4ICsgMl07CisgICAgICB1MiA9IHNyY1s0ICogeV9pZHggKyA0ICsgMl07CisKKyAgICAgIHYxID0gc3JjWzQgKiB5X2lkeCArIDNdOworICAgICAgdjIgPSBzcmNbNCAqIHlfaWR4ICsgNCArIDNdOworCisgICAgICBkZXN0WVt5X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFlbeV9pZHggKyAxXSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUyLCB2MiksIDAsIDI1NSk7CisKKyAgICAgIGRlc3RVW3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKDIgKiBkZXN0VVt1dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MiwgdTIsIHYyKSkgLyA0LCAwLCAyNTUpOworICAgICAgZGVzdFZbdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoMiAqIGRlc3RWW3V2X2lkeF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTEsIHUxLAorICAgICAgICAgICAgICAgICAgdjEpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkyLCB1MiwgdjIpKSAvIDQsIDAsIDI1NSk7CisKKyAgICAgIHlfaWR4ICs9IDI7CisgICAgICB1dl9pZHgrKzsKKyAgICB9CisKKyAgICAvKiAzLjMuIE5vdyBjb3B5IHRoZSBsYXN0IHBpeGVsIGlmIG9uZSBleGlzdHMgYW5kIGJsZW5kIGl0CisgICAgICogICAgICB3aXRoIHRoZSBiYWNrZ3JvdW5kIGJlY2F1c2Ugd2Ugb25seSBmaWxsIHBhcnQgb2YKKyAgICAgKiAgICAgIHRoZSBtYWNybyBwaXhlbC4gSW4gY2FzZSB0aGlzIGlzIHRoZSBsYXN0IHBpeGVsIG9mCisgICAgICogICAgICB0aGUgZGVzdGluYXRpb24gd2Ugd2lsbCBhIGxhcmdlciBwYXJ0LiAqLworICAgIGlmIChqID09IHcgLSAxICYmIGogPT0gZGVzdF93aWR0aCAtIDEpIHsKKyAgICAgIHkxID0gc3JjWzQgKiB5X2lkeCArIDFdOworICAgICAgdTEgPSBzcmNbNCAqIHlfaWR4ICsgMl07CisgICAgICB2MSA9IHNyY1s0ICogeV9pZHggKyAzXTsKKworICAgICAgZGVzdFlbeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVW3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKGRlc3RVW3V2X2lkeF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkpIC8gMiwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKGRlc3RWW3V2X2lkeF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkpIC8gMiwgMCwgMjU1KTsKKyAgICB9IGVsc2UgaWYgKGogPT0gdyAtIDEpIHsKKyAgICAgIHkxID0gc3JjWzQgKiB5X2lkeCArIDFdOworICAgICAgdTEgPSBzcmNbNCAqIHlfaWR4ICsgMl07CisgICAgICB2MSA9IHNyY1s0ICogeV9pZHggKyAzXTsKKworICAgICAgZGVzdFlbeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVW3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKDMgKiBkZXN0VVt1dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwgdjEpKSAvIDQsIDAsCisgICAgICAgICAgMjU1KTsKKyAgICAgIGRlc3RWW3V2X2lkeF0gPQorICAgICAgICAgIENMQU1QICgoMyAqIGRlc3RWW3V2X2lkeF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkpIC8gNCwKKyAgICAgICAgICAwLCAyNTUpOworICAgIH0KKyAgfSBlbHNlIGlmIChpID09IGggLSAxKSB7CisgICAgLyogMy4xLiBIYW5kbGUgdGhlIGZpcnN0IGRlc3RpbmF0aW9uIHBpeGVsIGlmIGl0IGRvZXNuJ3QKKyAgICAgKiAgICAgIHN0YXJ0IGF0IHRoZSBtYWNybyBwaXhlbCBib3VuZGFyeSwgaS5lLiBibGVuZCB3aXRoCisgICAgICogICAgICB0aGUgYmFja2dyb3VuZCEgKi8KKyAgICBpZiAoZGVzdF94ICUgMiA9PSAxKSB7CisgICAgICB5MSA9IHNyY1s0ICogMCArIDFdOworICAgICAgdTEgPSBzcmNbNCAqIDAgKyAyXTsKKyAgICAgIHYxID0gc3JjWzQgKiAwICsgM107CisKKyAgICAgIGRlc3RZWzBdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVWzBdID0KKyAgICAgICAgICBDTEFNUCAoKDMgKiBkZXN0VVswXSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyA0LCAwLAorICAgICAgICAgIDI1NSk7CisgICAgICBkZXN0VlswXSA9CisgICAgICAgICAgQ0xBTVAgKCgzICogZGVzdFZbMF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTEsIHUxLCB2MSkpIC8gNCwgMCwKKyAgICAgICAgICAyNTUpOworCisgICAgICBqID0gZGVzdF94ICsgMTsKKyAgICAgIHlfaWR4ID0gdXZfaWR4ID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgaiA9IGRlc3RfeDsKKyAgICAgIHlfaWR4ID0gdXZfaWR4ID0gMDsKKyAgICB9CisKKyAgICAvKiAzLjIuIENvcHkgYWxsIG1hY3JvIHBpeGVscyBmcm9tIHRoZSBzb3VyY2UgdG8gdGhlIGRlc3RpbmF0aW9uCisgICAgICogICAgICBidXQgYmxlbmQgd2l0aCB0aGUgYmFja2dyb3VuZCBiZWNhdXNlIHdlJ3JlIG9ubHkgZmlsbGluZworICAgICAqICAgICAgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIG1hY3JvIHBpeGVscy4gKi8KKyAgICBmb3IgKDsgaiA8IHcgLSAxOyBqICs9IDIpIHsKKyAgICAgIHkxID0gc3JjWzQgKiB5X2lkeCArIDFdOworICAgICAgeTIgPSBzcmNbNCAqIHlfaWR4ICsgNCArIDFdOworCisgICAgICB1MSA9IHNyY1s0ICogeV9pZHggKyAyXTsKKyAgICAgIHUyID0gc3JjWzQgKiB5X2lkeCArIDQgKyAyXTsKKworICAgICAgdjEgPSBzcmNbNCAqIHlfaWR4ICsgM107CisgICAgICB2MiA9IHNyY1s0ICogeV9pZHggKyA0ICsgM107CisKKyAgICAgIGRlc3RZW3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WVt5X2lkeCArIDFdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MiwgdTIsIHYyKSwgMCwgMjU1KTsKKworICAgICAgZGVzdFVbdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoMiAqIGRlc3RVW3V2X2lkeF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLAorICAgICAgICAgICAgICAgICAgdjEpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkyLCB1MiwgdjIpKSAvIDQsIDAsIDI1NSk7CisgICAgICBkZXN0Vlt1dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgICgyICogZGVzdFZbdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTIsIHUyLCB2MikpIC8gNCwgMCwgMjU1KTsKKworICAgICAgeV9pZHggKz0gMjsKKyAgICAgIHV2X2lkeCsrOworICAgIH0KKworICAgIC8qIDMuMy4gTm93IGNvcHkgdGhlIGxhc3QgcGl4ZWwgaWYgb25lIGV4aXN0cyBhbmQgYmxlbmQgaXQKKyAgICAgKiAgICAgIHdpdGggdGhlIGJhY2tncm91bmQgYmVjYXVzZSB3ZSBvbmx5IGZpbGwgcGFydCBvZgorICAgICAqICAgICAgdGhlIG1hY3JvIHBpeGVsLiBJbiBjYXNlIHRoaXMgaXMgdGhlIGxhc3QgcGl4ZWwgb2YKKyAgICAgKiAgICAgIHRoZSBkZXN0aW5hdGlvbiB3ZSB3aWxsIGEgbGFyZ2VyIHBhcnQuICovCisgICAgaWYgKGogPT0gdyAtIDEgJiYgaiA9PSBkZXN0X3dpZHRoIC0gMSkgeworICAgICAgeTEgPSBzcmNbNCAqIHlfaWR4ICsgMV07CisgICAgICB1MSA9IHNyY1s0ICogeV9pZHggKyAyXTsKKyAgICAgIHYxID0gc3JjWzQgKiB5X2lkeCArIDNdOworCisgICAgICBkZXN0WVt5X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFVbdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoZGVzdFVbdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyAyLCAwLCAyNTUpOworICAgICAgZGVzdFZbdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoZGVzdFZbdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyAyLCAwLCAyNTUpOworICAgIH0gZWxzZSBpZiAoaiA9PSB3IC0gMSkgeworICAgICAgeTEgPSBzcmNbNCAqIHlfaWR4ICsgMV07CisgICAgICB1MSA9IHNyY1s0ICogeV9pZHggKyAyXTsKKyAgICAgIHYxID0gc3JjWzQgKiB5X2lkeCArIDNdOworCisgICAgICBkZXN0WVt5X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFVbdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoMyAqIGRlc3RVW3V2X2lkeF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkpIC8gNCwgMCwKKyAgICAgICAgICAyNTUpOworICAgICAgZGVzdFZbdXZfaWR4XSA9CisgICAgICAgICAgQ0xBTVAgKCgzICogZGVzdFZbdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyA0LAorICAgICAgICAgIDAsIDI1NSk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitmaWxsX3BsYW5hcl95dXYgKEdzdFZpZGVvQm94RmlsbCBmaWxsX3R5cGUsIGd1aW50IGJfYWxwaGEsCisgICAgR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBnYm9vbGVhbiBzZHR2KQoreworICBndWludDggZW1wdHlfcGl4ZWxbM107CisgIGd1aW50OCAqZGVzdFksICpkZXN0VSwgKmRlc3RWOworICBnaW50IHN0cmlkZVksIHN0cmlkZVUsIHN0cmlkZVY7CisgIGdpbnQgaGVpZ2h0WSwgaGVpZ2h0VSwgaGVpZ2h0VjsKKyAgZ2ludCB3aWR0aFksIHdpZHRoVSwgd2lkdGhWOworCisgIGlmIChzZHR2KSB7CisgICAgZW1wdHlfcGl4ZWxbMF0gPSB5dXZfc2R0dl9jb2xvcnNfWVtmaWxsX3R5cGVdOworICAgIGVtcHR5X3BpeGVsWzFdID0geXV2X3NkdHZfY29sb3JzX1VbZmlsbF90eXBlXTsKKyAgICBlbXB0eV9waXhlbFsyXSA9IHl1dl9zZHR2X2NvbG9yc19WW2ZpbGxfdHlwZV07CisgIH0gZWxzZSB7CisgICAgZW1wdHlfcGl4ZWxbMF0gPSB5dXZfaGR0dl9jb2xvcnNfWVtmaWxsX3R5cGVdOworICAgIGVtcHR5X3BpeGVsWzFdID0geXV2X2hkdHZfY29sb3JzX1VbZmlsbF90eXBlXTsKKyAgICBlbXB0eV9waXhlbFsyXSA9IHl1dl9oZHR2X2NvbG9yc19WW2ZpbGxfdHlwZV07CisgIH0KKworICBzdHJpZGVZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChmcmFtZSwgMCk7CisgIHN0cmlkZVUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAxKTsKKyAgc3RyaWRlViA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUsIDIpOworCisgIGRlc3RZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZnJhbWUsIDApOworICBkZXN0VSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lLCAxKTsKKyAgZGVzdFYgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZSwgMik7CisKKyAgd2lkdGhZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGZyYW1lLCAwKTsKKyAgd2lkdGhVID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGZyYW1lLCAxKTsKKyAgd2lkdGhWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGZyYW1lLCAyKTsKKworICBoZWlnaHRZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChmcmFtZSwgMCk7CisgIGhlaWdodFUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9IRUlHSFQgKGZyYW1lLCAxKTsKKyAgaGVpZ2h0ViA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZnJhbWUsIDIpOworCisgIGlmIChzdHJpZGVZID09IHdpZHRoWSkgeworICAgIG1lbXNldCAoZGVzdFksIGVtcHR5X3BpeGVsWzBdLCBzdHJpZGVZICogaGVpZ2h0WSk7CisgIH0gZWxzZSBpZiAoaGVpZ2h0WSkgeworICAgIGZvciAoOyBoZWlnaHRZOyAtLWhlaWdodFkpIHsKKyAgICAgIG1lbXNldCAoZGVzdFksIGVtcHR5X3BpeGVsWzBdLCB3aWR0aFkpOworICAgICAgZGVzdFkgKz0gc3RyaWRlWTsKKyAgICB9CisgIH0KKyAgaWYgKHN0cmlkZVUgPT0gd2lkdGhVKSB7CisgICAgbWVtc2V0IChkZXN0VSwgZW1wdHlfcGl4ZWxbMV0sIHN0cmlkZVUgKiBoZWlnaHRVKTsKKyAgfSBlbHNlIGlmIChoZWlnaHRVKSB7CisgICAgZm9yICg7IGhlaWdodFU7IC0taGVpZ2h0VSkgeworICAgICAgbWVtc2V0IChkZXN0VSwgZW1wdHlfcGl4ZWxbMV0sIHdpZHRoVSk7CisgICAgICBkZXN0VSArPSBzdHJpZGVVOworICAgIH0KKyAgfQorICBpZiAoc3RyaWRlViA9PSB3aWR0aFYpIHsKKyAgICBtZW1zZXQgKGRlc3RWLCBlbXB0eV9waXhlbFsyXSwgc3RyaWRlViAqIGhlaWdodFYpOworICB9IGVsc2UgaWYgKGhlaWdodFYpIHsKKyAgICBmb3IgKDsgaGVpZ2h0VjsgLS1oZWlnaHRWKSB7CisgICAgICBtZW1zZXQgKGRlc3RWLCBlbXB0eV9waXhlbFsyXSwgd2lkdGhWKTsKKyAgICAgIGRlc3RWICs9IHN0cmlkZVY7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5X3k0NDRfeTQ0NCAoZ3VpbnQgaV9hbHBoYSwgR3N0VmlkZW9GcmFtZSAqIGRlc3QsCisgICAgZ2Jvb2xlYW4gZGVzdF9zZHR2LCBnaW50IGRlc3RfeCwgZ2ludCBkZXN0X3ksIEdzdFZpZGVvRnJhbWUgKiBzcmMsCisgICAgZ2Jvb2xlYW4gc3JjX3NkdHYsIGdpbnQgc3JjX3gsIGdpbnQgc3JjX3ksIGdpbnQgdywgZ2ludCBoKQoreworICBnaW50IGksIGo7CisgIGd1aW50OCAqZGVzdFksICpkZXN0VSwgKmRlc3RWOworICBjb25zdCBndWludDggKnNyY1ksICpzcmNVLCAqc3JjVjsKKyAgZ2ludCBkZXN0X3N0cmlkZVksIGRlc3Rfc3RyaWRlVSwgZGVzdF9zdHJpZGVWOworICBnaW50IHNyY19zdHJpZGVZLCBzcmNfc3RyaWRlVSwgc3JjX3N0cmlkZVY7CisKKyAgZGVzdF9zdHJpZGVZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChkZXN0LCAwKTsKKyAgZGVzdF9zdHJpZGVVID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChkZXN0LCAxKTsKKyAgZGVzdF9zdHJpZGVWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChkZXN0LCAyKTsKKworICBzcmNfc3RyaWRlWSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoc3JjLCAwKTsKKyAgc3JjX3N0cmlkZVUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKHNyYywgMSk7CisgIHNyY19zdHJpZGVWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChzcmMsIDIpOworCisgIGRlc3RZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdCwgMCk7CisgIGRlc3RVID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdCwgMSk7CisgIGRlc3RWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdCwgMik7CisKKyAgc3JjWSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKHNyYywgMCk7CisgIHNyY1UgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChzcmMsIDEpOworICBzcmNWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoc3JjLCAyKTsKKworICBkZXN0WSA9IGRlc3RZICsgZGVzdF95ICogZGVzdF9zdHJpZGVZICsgZGVzdF94OworICBkZXN0VSA9IGRlc3RVICsgZGVzdF95ICogZGVzdF9zdHJpZGVVICsgZGVzdF94OworICBkZXN0ViA9IGRlc3RWICsgZGVzdF95ICogZGVzdF9zdHJpZGVWICsgZGVzdF94OworCisgIHNyY1kgPSBzcmNZICsgc3JjX3kgKiBzcmNfc3RyaWRlWSArIHNyY194OworICBzcmNVID0gc3JjVSArIHNyY195ICogc3JjX3N0cmlkZVUgKyBzcmNfeDsKKyAgc3JjViA9IHNyY1YgKyBzcmNfeSAqIHNyY19zdHJpZGVWICsgc3JjX3g7CisKKyAgaWYgKHNyY19zZHR2ICE9IGRlc3Rfc2R0dikgeworICAgIGdpbnQgbWF0cml4WzEyXTsKKyAgICBnaW50IHksIHUsIHY7CisKKyAgICBtZW1jcHkgKG1hdHJpeCwKKyAgICAgICAgZGVzdF9zZHR2ID8gY29nX3ljYmNyX2hkdHZfdG9feWNiY3Jfc2R0dl9tYXRyaXhfOGJpdCA6CisgICAgICAgIGNvZ195Y2Jjcl9zZHR2X3RvX3ljYmNyX2hkdHZfbWF0cml4XzhiaXQsIDEyICogc2l6ZW9mIChnaW50KSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgdzsgaisrKSB7CisgICAgICAgIHkgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgc3JjWVtqXSwgc3JjVVtqXSwgc3JjVltqXSk7CisgICAgICAgIHUgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgc3JjWVtqXSwgc3JjVVtqXSwgc3JjVltqXSk7CisgICAgICAgIHYgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgc3JjWVtqXSwgc3JjVVtqXSwgc3JjVltqXSk7CisKKyAgICAgICAgZGVzdFlbal0gPSB5OworICAgICAgICBkZXN0VVtqXSA9IHU7CisgICAgICAgIGRlc3RWW2pdID0gdjsKKyAgICAgIH0KKyAgICAgIGRlc3RZICs9IGRlc3Rfc3RyaWRlWTsKKyAgICAgIGRlc3RVICs9IGRlc3Rfc3RyaWRlVTsKKyAgICAgIGRlc3RWICs9IGRlc3Rfc3RyaWRlVjsKKworICAgICAgc3JjWSArPSBzcmNfc3RyaWRlWTsKKyAgICAgIHNyY1UgKz0gc3JjX3N0cmlkZVU7CisgICAgICBzcmNWICs9IHNyY19zdHJpZGVWOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICBtZW1jcHkgKGRlc3RZLCBzcmNZLCB3KTsKKyAgICAgIG1lbWNweSAoZGVzdFUsIHNyY1UsIHcpOworICAgICAgbWVtY3B5IChkZXN0Viwgc3JjViwgdyk7CisKKyAgICAgIGRlc3RZICs9IGRlc3Rfc3RyaWRlWTsKKyAgICAgIGRlc3RVICs9IGRlc3Rfc3RyaWRlVTsKKyAgICAgIGRlc3RWICs9IGRlc3Rfc3RyaWRlVjsKKworICAgICAgc3JjWSArPSBzcmNfc3RyaWRlWTsKKyAgICAgIHNyY1UgKz0gc3JjX3N0cmlkZVU7CisgICAgICBzcmNWICs9IHNyY19zdHJpZGVWOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorY29weV95NDJiX3k0MmIgKGd1aW50IGlfYWxwaGEsIEdzdFZpZGVvRnJhbWUgKiBkZXN0LAorICAgIGdib29sZWFuIGRlc3Rfc2R0diwgZ2ludCBkZXN0X3gsIGdpbnQgZGVzdF95LCBHc3RWaWRlb0ZyYW1lICogc3JjLAorICAgIGdib29sZWFuIHNyY19zZHR2LCBnaW50IHNyY194LCBnaW50IHNyY195LCBnaW50IHcsIGdpbnQgaCkKK3sKKyAgZ2ludCBpLCBqOworICBndWludDggKmRlc3RZLCAqZGVzdFUsICpkZXN0VjsKKyAgY29uc3QgZ3VpbnQ4ICpzcmNZLCAqc3JjVSwgKnNyY1Y7CisgIGdpbnQgZGVzdF9zdHJpZGVZLCBkZXN0X3N0cmlkZVUsIGRlc3Rfc3RyaWRlVjsKKyAgZ2ludCBzcmNfc3RyaWRlWSwgc3JjX3N0cmlkZVUsIHNyY19zdHJpZGVWOworICBnaW50IHNyY195X2lkeCwgc3JjX3V2X2lkeDsKKyAgZ2ludCBkZXN0X3lfaWR4LCBkZXN0X3V2X2lkeDsKKyAgZ2ludCBtYXRyaXhbMTJdOworICBnaW50IHkxLCB5MjsKKyAgZ2ludCB1MSwgdTI7CisgIGdpbnQgdjEsIHYyOworICBnaW50IGRlc3Rfd2lkdGg7CisKKyAgZGVzdF93aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoZGVzdCk7CisKKyAgZGVzdF9zdHJpZGVZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChkZXN0LCAwKTsKKyAgZGVzdF9zdHJpZGVVID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChkZXN0LCAxKTsKKyAgZGVzdF9zdHJpZGVWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChkZXN0LCAyKTsKKworICBzcmNfc3RyaWRlWSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoc3JjLCAwKTsKKyAgc3JjX3N0cmlkZVUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKHNyYywgMSk7CisgIHNyY19zdHJpZGVWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChzcmMsIDIpOworCisgIGRlc3RZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdCwgMCk7CisgIGRlc3RVID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdCwgMSk7CisgIGRlc3RWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdCwgMik7CisKKyAgc3JjWSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKHNyYywgMCk7CisgIHNyY1UgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChzcmMsIDEpOworICBzcmNWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoc3JjLCAyKTsKKworICBkZXN0WSA9IGRlc3RZICsgZGVzdF95ICogZGVzdF9zdHJpZGVZICsgZGVzdF94OworICBkZXN0VSA9IGRlc3RVICsgZGVzdF95ICogZGVzdF9zdHJpZGVVICsgZGVzdF94IC8gMjsKKyAgZGVzdFYgPSBkZXN0ViArIGRlc3RfeSAqIGRlc3Rfc3RyaWRlViArIGRlc3RfeCAvIDI7CisKKyAgc3JjWSA9IHNyY1kgKyBzcmNfeSAqIHNyY19zdHJpZGVZICsgc3JjX3g7CisgIHNyY1UgPSBzcmNVICsgc3JjX3kgKiBzcmNfc3RyaWRlVSArIHNyY194IC8gMjsKKyAgc3JjViA9IHNyY1YgKyBzcmNfeSAqIHNyY19zdHJpZGVWICsgc3JjX3ggLyAyOworCisgIGggPSBkZXN0X3kgKyBoOworICB3ID0gZGVzdF94ICsgdzsKKworICBpZiAoc3JjX3NkdHYgIT0gZGVzdF9zZHR2KQorICAgIG1lbWNweSAobWF0cml4LAorICAgICAgICBkZXN0X3NkdHYgPyBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0IDoKKyAgICAgICAgY29nX3ljYmNyX3NkdHZfdG9feWNiY3JfaGR0dl9tYXRyaXhfOGJpdCwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKyAgZWxzZQorICAgIG1lbWNweSAobWF0cml4LCBjb2dfaWRlbnRpdHlfbWF0cml4XzhiaXQsIDEyICogc2l6ZW9mIChnaW50KSk7CisKKyAgLyogMS4gQ29weSBhbGwgbWFjcm8gcGl4ZWwgc2NhbmxpbmVzLCB0aGUgZGVzdGluYXRpb24gc2NhbmxpbmUKKyAgICogICAgbm93IHN0YXJ0cyBhdCBtYWNybyBwaXhlbCBib3VuZGFyeS4gKi8KKyAgZm9yIChpID0gZGVzdF95OyBpIDwgaDsgaSsrKSB7CisgICAgLyogMS4xLiBIYW5kbGUgdGhlIGZpcnN0IGRlc3RpbmF0aW9uIHBpeGVsIGlmIGl0IGRvZXNuJ3QKKyAgICAgKiAgICAgIHN0YXJ0IGF0IHRoZSBtYWNybyBwaXhlbCBib3VuZGFyeSwgaS5lLiBibGVuZCB3aXRoCisgICAgICogICAgICB0aGUgYmFja2dyb3VuZCEgKi8KKyAgICBpZiAoZGVzdF94ICUgMiA9PSAxKSB7CisgICAgICB5MSA9IHNyY1lbMF07CisgICAgICB1MSA9IHNyY1VbMF07CisgICAgICB2MSA9IHNyY1ZbMF07CisKKyAgICAgIGRlc3RZWzBdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVWzBdID0gQ0xBTVAgKAorICAgICAgICAgIChkZXN0VVswXSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyAyLCAwLCAyNTUpOworICAgICAgZGVzdFZbMF0gPSBDTEFNUCAoCisgICAgICAgICAgKGRlc3RWWzBdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkxLCB1MSwgdjEpKSAvIDIsIDAsIDI1NSk7CisgICAgICBqID0gZGVzdF94ICsgMTsKKyAgICAgIHNyY195X2lkeCA9IGRlc3RfeV9pZHggPSBkZXN0X3V2X2lkeCA9IDE7CisgICAgICBzcmNfdXZfaWR4ID0gKHNyY194ICUgMikgKyAxOworICAgIH0gZWxzZSB7CisgICAgICBqID0gZGVzdF94OworICAgICAgc3JjX3lfaWR4ID0gZGVzdF95X2lkeCA9IGRlc3RfdXZfaWR4ID0gMDsKKyAgICAgIHNyY191dl9pZHggPSAoc3JjX3ggJSAyKTsKKyAgICB9CisKKyAgICAvKiAxLjIuIENvcHkgYWxsIG1hY3JvIHBpeGVscyBmcm9tIHRoZSBzb3VyY2UgdG8gdGhlIGRlc3RpbmF0aW9uLgorICAgICAqICAgICAgQWxsIHBpeGVscyBub3cgc3RhcnQgYXQgbWFjcm8gcGl4ZWwgYm91bmRhcnksIGkuZS4gbm8KKyAgICAgKiAgICAgIGJsZW5kaW5nIHdpdGggdGhlIGJhY2tncm91bmQgaXMgbmVjZXNzYXJ5LiAqLworICAgIGZvciAoOyBqIDwgdyAtIDE7IGogKz0gMikgeworICAgICAgeTEgPSBzcmNZW3NyY195X2lkeF07CisgICAgICB5MiA9IHNyY1lbc3JjX3lfaWR4ICsgMV07CisKKyAgICAgIHUxID0gc3JjVVtzcmNfdXZfaWR4IC8gMl07CisgICAgICB2MSA9IHNyY1Zbc3JjX3V2X2lkeCAvIDJdOworICAgICAgc3JjX3V2X2lkeCsrOworICAgICAgdTIgPSBzcmNVW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHYyID0gc3JjVltzcmNfdXZfaWR4IC8gMl07CisgICAgICBzcmNfdXZfaWR4Kys7CisKKyAgICAgIGRlc3RZW2Rlc3RfeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RZW2Rlc3RfeV9pZHggKyAxXSA9CisgICAgICAgICAgQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MiwgdTIsIHYyKSwgMCwgMjU1KTsKKworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTIsCisgICAgICAgICAgICAgICAgICB1MiwgdjIpKSAvIDIsIDAsIDI1NSk7CisgICAgICBkZXN0VltkZXN0X3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwKKyAgICAgICAgICAgICAgICAgIHUyLCB2MikpIC8gMiwgMCwgMjU1KTsKKworICAgICAgZGVzdF95X2lkeCArPSAyOworICAgICAgc3JjX3lfaWR4ICs9IDI7CisgICAgICBkZXN0X3V2X2lkeCsrOworICAgIH0KKworICAgIC8qIDEuMy4gTm93IGNvcHkgdGhlIGxhc3QgcGl4ZWwgaWYgb25lIGV4aXN0cyBhbmQgYmxlbmQgaXQKKyAgICAgKiAgICAgIHdpdGggdGhlIGJhY2tncm91bmQgYmVjYXVzZSB3ZSBvbmx5IGZpbGwgcGFydCBvZgorICAgICAqICAgICAgdGhlIG1hY3JvIHBpeGVsLiBJbiBjYXNlIHRoaXMgaXMgdGhlIGxhc3QgcGl4ZWwgb2YKKyAgICAgKiAgICAgIHRoZSBkZXN0aW5hdGlvbiB3ZSB3aWxsIGEgbGFyZ2VyIHBhcnQuICovCisgICAgaWYgKGogPT0gdyAtIDEgJiYgaiA9PSBkZXN0X3dpZHRoIC0gMSkgeworICAgICAgeTEgPSBzcmNZW3NyY195X2lkeF07CisgICAgICB1MSA9IHNyY1Vbc3JjX3V2X2lkeCAvIDJdOworICAgICAgdjEgPSBzcmNWW3NyY191dl9pZHggLyAyXTsKKworICAgICAgZGVzdFlbZGVzdF95X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW2Rlc3RfdXZfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgfSBlbHNlIGlmIChqID09IHcgLSAxKSB7CisgICAgICB5MSA9IHNyY1lbc3JjX3lfaWR4XTsKKyAgICAgIHUxID0gc3JjVVtzcmNfdXZfaWR4IC8gMl07CisgICAgICB2MSA9IHNyY1Zbc3JjX3V2X2lkeCAvIDJdOworCisgICAgICBkZXN0WVtkZXN0X3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0VVtkZXN0X3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKGRlc3RVW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkpIC8gMiwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW2Rlc3RfdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoZGVzdFZbZGVzdF91dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSkgLyAyLCAwLCAyNTUpOworICAgIH0KKworICAgIGRlc3RZICs9IGRlc3Rfc3RyaWRlWTsKKyAgICBkZXN0VSArPSBkZXN0X3N0cmlkZVU7CisgICAgZGVzdFYgKz0gZGVzdF9zdHJpZGVWOworICAgIHNyY1kgKz0gc3JjX3N0cmlkZVk7CisKKyAgICBzcmNVICs9IHNyY19zdHJpZGVVOworICAgIHNyY1YgKz0gc3JjX3N0cmlkZVY7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NvcHlfeTQxYl95NDFiIChndWludCBpX2FscGhhLCBHc3RWaWRlb0ZyYW1lICogZGVzdCwKKyAgICBnYm9vbGVhbiBkZXN0X3NkdHYsIGdpbnQgZGVzdF94LCBnaW50IGRlc3RfeSwgR3N0VmlkZW9GcmFtZSAqIHNyYywKKyAgICBnYm9vbGVhbiBzcmNfc2R0diwgZ2ludCBzcmNfeCwgZ2ludCBzcmNfeSwgZ2ludCB3LCBnaW50IGgpCit7CisgIGdpbnQgaSwgajsKKyAgZ3VpbnQ4ICpkZXN0WSwgKmRlc3RVLCAqZGVzdFY7CisgIGNvbnN0IGd1aW50OCAqc3JjWSwgKnNyY1UsICpzcmNWOworICBnaW50IGRlc3Rfc3RyaWRlWSwgZGVzdF9zdHJpZGVVLCBkZXN0X3N0cmlkZVY7CisgIGdpbnQgc3JjX3N0cmlkZVksIHNyY19zdHJpZGVVLCBzcmNfc3RyaWRlVjsKKyAgZ2ludCBzcmNfeV9pZHgsIHNyY191dl9pZHg7CisgIGdpbnQgZGVzdF95X2lkeCwgZGVzdF91dl9pZHg7CisgIGdpbnQgbWF0cml4WzEyXTsKKyAgZ2ludCB5MSwgeTIsIHkzLCB5NDsKKyAgZ2ludCB1MSwgdTIsIHUzLCB1NDsKKyAgZ2ludCB2MSwgdjIsIHYzLCB2NDsKKyAgZ2ludCBkZXN0X3dpZHRoOworCisgIGRlc3Rfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGRlc3QpOworCisgIGRlc3Rfc3RyaWRlWSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZGVzdCwgMCk7CisgIGRlc3Rfc3RyaWRlVSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZGVzdCwgMSk7CisgIGRlc3Rfc3RyaWRlViA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZGVzdCwgMik7CisKKyAgc3JjX3N0cmlkZVkgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKHNyYywgMCk7CisgIHNyY19zdHJpZGVVID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChzcmMsIDEpOworICBzcmNfc3RyaWRlViA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoc3JjLCAyKTsKKworICBkZXN0WSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGRlc3QsIDApOworICBkZXN0VSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGRlc3QsIDEpOworICBkZXN0ViA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGRlc3QsIDIpOworCisgIHNyY1kgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChzcmMsIDApOworICBzcmNVID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoc3JjLCAxKTsKKyAgc3JjViA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKHNyYywgMik7CisKKyAgZGVzdFkgPSBkZXN0WSArIGRlc3RfeSAqIGRlc3Rfc3RyaWRlWSArIGRlc3RfeDsKKyAgZGVzdFUgPSBkZXN0VSArIGRlc3RfeSAqIGRlc3Rfc3RyaWRlVSArIGRlc3RfeCAvIDQ7CisgIGRlc3RWID0gZGVzdFYgKyBkZXN0X3kgKiBkZXN0X3N0cmlkZVYgKyBkZXN0X3ggLyA0OworCisgIHNyY1kgPSBzcmNZICsgc3JjX3kgKiBzcmNfc3RyaWRlWSArIHNyY194OworICBzcmNVID0gc3JjVSArIHNyY195ICogc3JjX3N0cmlkZVUgKyBzcmNfeCAvIDQ7CisgIHNyY1YgPSBzcmNWICsgc3JjX3kgKiBzcmNfc3RyaWRlViArIHNyY194IC8gNDsKKworICBoID0gZGVzdF95ICsgaDsKKyAgdyA9IGRlc3RfeCArIHc7CisKKyAgaWYgKHNyY19zZHR2ICE9IGRlc3Rfc2R0dikKKyAgICBtZW1jcHkgKG1hdHJpeCwKKyAgICAgICAgZGVzdF9zZHR2ID8gY29nX3ljYmNyX2hkdHZfdG9feWNiY3Jfc2R0dl9tYXRyaXhfOGJpdCA6CisgICAgICAgIGNvZ195Y2Jjcl9zZHR2X3RvX3ljYmNyX2hkdHZfbWF0cml4XzhiaXQsIDEyICogc2l6ZW9mIChnaW50KSk7CisgIGVsc2UKKyAgICBtZW1jcHkgKG1hdHJpeCwgY29nX2lkZW50aXR5X21hdHJpeF84Yml0LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgIC8qIDEuIENvcHkgYWxsIG1hY3JvIHBpeGVsIHNjYW5saW5lcywgdGhlIGRlc3RpbmF0aW9uIHNjYW5saW5lCisgICAqICAgIG5vdyBzdGFydHMgYXQgbWFjcm8gcGl4ZWwgYm91bmRhcnkuICovCisgIGZvciAoaSA9IGRlc3RfeTsgaSA8IGg7IGkrKykgeworICAgIC8qIDEuMS4gSGFuZGxlIHRoZSBmaXJzdCBkZXN0aW5hdGlvbiBwaXhlbCBpZiBpdCBkb2Vzbid0CisgICAgICogICAgICBzdGFydCBhdCB0aGUgbWFjcm8gcGl4ZWwgYm91bmRhcnksIGkuZS4gYmxlbmQgd2l0aAorICAgICAqICAgICAgdGhlIGJhY2tncm91bmQhICovCisgICAgaWYgKGRlc3RfeCAlIDQgPT0gMSkgeworICAgICAgeTEgPSBzcmNZWzBdOworICAgICAgeTIgPSBzcmNZWzFdOworICAgICAgeTMgPSBzcmNZWzJdOworICAgICAgdTEgPSBzcmNVWzBdOworICAgICAgdjEgPSBzcmNWWzBdOworCisgICAgICBkZXN0WVswXSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WVsxXSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WVsyXSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTMsIHUxLCB2MSksIDAsIDI1NSk7CisKKyAgICAgIGRlc3RVWzBdID0gQ0xBTVAgKAorICAgICAgICAgIChkZXN0VVswXSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTIsIHUxLAorICAgICAgICAgICAgICAgICAgdjEpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkzLCB1MSwgdjEpKSAvIDQsIDAsIDI1NSk7CisgICAgICBkZXN0VlswXSA9CisgICAgICAgICAgQ0xBTVAgKChkZXN0VlswXSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTIsIHUxLAorICAgICAgICAgICAgICAgICAgdjEpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkzLCB1MSwgdjEpKSAvIDQsIDAsIDI1NSk7CisKKyAgICAgIGogPSBkZXN0X3ggKyAzOworICAgICAgc3JjX3lfaWR4ID0gZGVzdF95X2lkeCA9IDM7CisgICAgICBkZXN0X3V2X2lkeCA9IDE7CisgICAgICBzcmNfdXZfaWR4ID0gKHNyY194ICUgNCkgKyAzOworICAgIH0gZWxzZSBpZiAoZGVzdF94ICUgNCA9PSAyKSB7CisgICAgICB5MSA9IHNyY1lbMF07CisgICAgICB5MiA9IHNyY1lbMV07CisgICAgICB1MSA9IHNyY1VbMF07CisgICAgICB2MSA9IHNyY1ZbMF07CisKKyAgICAgIGRlc3RZWzBdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RZWzFdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MiwgdTEsIHYxKSwgMCwgMjU1KTsKKworICAgICAgZGVzdFVbMF0gPSBDTEFNUCAoCisgICAgICAgICAgKDIgKiBkZXN0VVswXSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTIsIHUxLCB2MSkpIC8gNCwgMCwgMjU1KTsKKyAgICAgIGRlc3RWWzBdID0KKyAgICAgICAgICBDTEFNUCAoKDIgKiBkZXN0VlswXSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTIsIHUxLCB2MSkpIC8gNCwgMCwgMjU1KTsKKworICAgICAgaiA9IGRlc3RfeCArIDI7CisgICAgICBzcmNfeV9pZHggPSBkZXN0X3lfaWR4ID0gMjsKKyAgICAgIGRlc3RfdXZfaWR4ID0gMTsKKyAgICAgIHNyY191dl9pZHggPSAoc3JjX3ggJSA0KSArIDI7CisgICAgfSBlbHNlIGlmIChkZXN0X3ggJSA0ID09IDMpIHsKKyAgICAgIHkxID0gc3JjWVswXTsKKyAgICAgIHUxID0gc3JjVVswXTsKKyAgICAgIHYxID0gc3JjVlswXTsKKworICAgICAgZGVzdFlbMF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworCisgICAgICBkZXN0VVswXSA9IENMQU1QICgKKyAgICAgICAgICAoMyAqIGRlc3RVWzBdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwgdjEpKSAvIDQsIDAsIDI1NSk7CisgICAgICBkZXN0VlswXSA9IENMQU1QICgKKyAgICAgICAgICAoMyAqIGRlc3RWWzBdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkxLCB1MSwgdjEpKSAvIDQsIDAsIDI1NSk7CisKKyAgICAgIGogPSBkZXN0X3ggKyAxOworICAgICAgc3JjX3lfaWR4ID0gZGVzdF95X2lkeCA9IDE7CisgICAgICBkZXN0X3V2X2lkeCA9IDE7CisgICAgICBzcmNfdXZfaWR4ID0gKHNyY194ICUgNCkgKyAxOworICAgIH0gZWxzZSB7CisgICAgICBqID0gZGVzdF94OworICAgICAgc3JjX3lfaWR4ID0gZGVzdF95X2lkeCA9IGRlc3RfdXZfaWR4ID0gMDsKKyAgICAgIHNyY191dl9pZHggPSAoc3JjX3ggJSA0KTsKKyAgICB9CisKKyAgICAvKiAxLjIuIENvcHkgYWxsIG1hY3JvIHBpeGVscyBmcm9tIHRoZSBzb3VyY2UgdG8gdGhlIGRlc3RpbmF0aW9uLgorICAgICAqICAgICAgQWxsIHBpeGVscyBub3cgc3RhcnQgYXQgbWFjcm8gcGl4ZWwgYm91bmRhcnksIGkuZS4gbm8KKyAgICAgKiAgICAgIGJsZW5kaW5nIHdpdGggdGhlIGJhY2tncm91bmQgaXMgbmVjZXNzYXJ5LiAqLworICAgIGZvciAoOyBqIDwgdyAtIDM7IGogKz0gNCkgeworICAgICAgeTEgPSBzcmNZW3NyY195X2lkeF07CisgICAgICB5MiA9IHNyY1lbc3JjX3lfaWR4ICsgMV07CisgICAgICB5MyA9IHNyY1lbc3JjX3lfaWR4ICsgMl07CisgICAgICB5NCA9IHNyY1lbc3JjX3lfaWR4ICsgM107CisKKyAgICAgIHUxID0gc3JjVVtzcmNfdXZfaWR4IC8gNF07CisgICAgICB2MSA9IHNyY1Zbc3JjX3V2X2lkeCAvIDRdOworICAgICAgc3JjX3V2X2lkeCsrOworICAgICAgdTIgPSBzcmNVW3NyY191dl9pZHggLyA0XTsKKyAgICAgIHYyID0gc3JjVltzcmNfdXZfaWR4IC8gNF07CisgICAgICBzcmNfdXZfaWR4Kys7CisgICAgICB1MyA9IHNyY1Vbc3JjX3V2X2lkeCAvIDRdOworICAgICAgdjMgPSBzcmNWW3NyY191dl9pZHggLyA0XTsKKyAgICAgIHNyY191dl9pZHgrKzsKKyAgICAgIHU0ID0gc3JjVVtzcmNfdXZfaWR4IC8gNF07CisgICAgICB2NCA9IHNyY1Zbc3JjX3V2X2lkeCAvIDRdOworICAgICAgc3JjX3V2X2lkeCsrOworCisgICAgICBkZXN0WVtkZXN0X3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WVtkZXN0X3lfaWR4ICsgMV0gPQorICAgICAgICAgIENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUyLCB2MiksIDAsIDI1NSk7CisgICAgICBkZXN0WVtkZXN0X3lfaWR4ICsgMl0gPQorICAgICAgICAgIENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTMsIHUzLCB2MyksIDAsIDI1NSk7CisgICAgICBkZXN0WVtkZXN0X3lfaWR4ICsgM10gPQorICAgICAgICAgIENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTQsIHU0LCB2NCksIDAsIDI1NSk7CisKKyAgICAgIGRlc3RVW2Rlc3RfdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwgdjEpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkyLAorICAgICAgICAgICAgICAgICAgdTIsIHYyKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MywgdTMsCisgICAgICAgICAgICAgICAgICB2MykgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTQsIHU0LCB2NCkpIC8gNCwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW2Rlc3RfdXZfaWR4XSA9CisgICAgICAgICAgQ0xBTVAgKChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTEsIHUxLCB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgIDIsIHkyLCB1MiwgdjIpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkzLCB1MywKKyAgICAgICAgICAgICAgICAgIHYzKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5NCwgdTQsIHY0KSkgLyA0LCAwLCAyNTUpOworCisgICAgICBkZXN0X3lfaWR4ICs9IDQ7CisgICAgICBzcmNfeV9pZHggKz0gNDsKKyAgICAgIGRlc3RfdXZfaWR4Kys7CisgICAgfQorCisgICAgLyogMS4zLiBOb3cgY29weSB0aGUgbGFzdCBwaXhlbCBpZiBvbmUgZXhpc3RzIGFuZCBibGVuZCBpdAorICAgICAqICAgICAgd2l0aCB0aGUgYmFja2dyb3VuZCBiZWNhdXNlIHdlIG9ubHkgZmlsbCBwYXJ0IG9mCisgICAgICogICAgICB0aGUgbWFjcm8gcGl4ZWwuIEluIGNhc2UgdGhpcyBpcyB0aGUgbGFzdCBwaXhlbCBvZgorICAgICAqICAgICAgdGhlIGRlc3RpbmF0aW9uIHdlIHdpbGwgYSBsYXJnZXIgcGFydC4gKi8KKyAgICBpZiAoaiA9PSB3IC0gMSAmJiBqID09IGRlc3Rfd2lkdGggLSAxKSB7CisgICAgICB5MSA9IHNyY1lbc3JjX3lfaWR4XTsKKyAgICAgIHUxID0gc3JjVVtzcmNfdXZfaWR4IC8gNF07CisgICAgICB2MSA9IHNyY1Zbc3JjX3V2X2lkeCAvIDRdOworCisgICAgICBkZXN0WVtkZXN0X3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0VVtkZXN0X3V2X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFZbZGVzdF91dl9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICB9IGVsc2UgaWYgKGogPT0gdyAtIDEpIHsKKyAgICAgIHkxID0gc3JjWVtzcmNfeV9pZHhdOworICAgICAgdTEgPSBzcmNVW3NyY191dl9pZHggLyA0XTsKKyAgICAgIHYxID0gc3JjVltzcmNfdXZfaWR4IC8gNF07CisKKyAgICAgIGRlc3RZW2Rlc3RfeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVW2Rlc3RfdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoZGVzdFVbZGVzdF91dl9pZHhdICsgMyAqIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkpIC8gNCwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW2Rlc3RfdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoZGVzdFZbZGVzdF91dl9pZHhdICsgMyAqIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkpIC8gNCwgMCwgMjU1KTsKKyAgICB9IGVsc2UgaWYgKGogPT0gdyAtIDIgJiYgaiA9PSBkZXN0X3dpZHRoIC0gMikgeworICAgICAgeTEgPSBzcmNZW3NyY195X2lkeF07CisgICAgICB5MiA9IHNyY1lbc3JjX3lfaWR4ICsgMV07CisgICAgICB1MSA9IHNyY1Vbc3JjX3V2X2lkeCAvIDRdOworICAgICAgdjEgPSBzcmNWW3NyY191dl9pZHggLyA0XTsKKworICAgICAgZGVzdFlbZGVzdF95X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFlbZGVzdF95X2lkeCArIDFdID0KKyAgICAgICAgICBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkyLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW2Rlc3RfdXZfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgfSBlbHNlIGlmIChqID09IHcgLSAyKSB7CisgICAgICB5MSA9IHNyY1lbc3JjX3lfaWR4XTsKKyAgICAgIHkyID0gc3JjWVtzcmNfeV9pZHggKyAxXTsKKyAgICAgIHUxID0gc3JjVVtzcmNfdXZfaWR4IC8gNF07CisgICAgICB2MSA9IHNyY1Zbc3JjX3V2X2lkeCAvIDRdOworCisgICAgICBkZXN0WVtkZXN0X3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WVtkZXN0X3lfaWR4ICsgMV0gPQorICAgICAgICAgIENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0VVtkZXN0X3V2X2lkeF0gPQorICAgICAgICAgIENMQU1QICgoZGVzdFVbZGVzdF91dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSkgLyAyLCAwLCAyNTUpOworICAgICAgZGVzdFZbZGVzdF91dl9pZHhdID0KKyAgICAgICAgICBDTEFNUCAoKGRlc3RWW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkpIC8gMiwgMCwgMjU1KTsKKyAgICB9IGVsc2UgaWYgKGogPT0gdyAtIDMgJiYgaiA9PSBkZXN0X3dpZHRoIC0gMykgeworICAgICAgeTEgPSBzcmNZW3NyY195X2lkeF07CisgICAgICB5MiA9IHNyY1lbc3JjX3lfaWR4ICsgMV07CisgICAgICB5MyA9IHNyY1lbc3JjX3lfaWR4ICsgMl07CisgICAgICB1MSA9IHNyY1Vbc3JjX3V2X2lkeCAvIDRdOworICAgICAgdjEgPSBzcmNWW3NyY191dl9pZHggLyA0XTsKKworICAgICAgZGVzdFlbZGVzdF95X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFlbZGVzdF95X2lkeCArIDFdID0KKyAgICAgICAgICBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkyLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFlbZGVzdF95X2lkeCArIDJdID0KKyAgICAgICAgICBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkzLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW2Rlc3RfdXZfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgfSBlbHNlIGlmIChqID09IHcgLSAzKSB7CisgICAgICB5MSA9IHNyY1lbc3JjX3lfaWR4XTsKKyAgICAgIHkyID0gc3JjWVtzcmNfeV9pZHggKyAxXTsKKyAgICAgIHkzID0gc3JjWVtzcmNfeV9pZHggKyAyXTsKKyAgICAgIHUxID0gc3JjVVtzcmNfdXZfaWR4IC8gNF07CisgICAgICB2MSA9IHNyY1Zbc3JjX3V2X2lkeCAvIDRdOworCisgICAgICBkZXN0WVtkZXN0X3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WVtkZXN0X3lfaWR4ICsgMV0gPQorICAgICAgICAgIENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WVtkZXN0X3lfaWR4ICsgMl0gPQorICAgICAgICAgIENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTMsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0VVtkZXN0X3V2X2lkeF0gPQorICAgICAgICAgIENMQU1QICgoMyAqIGRlc3RVW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkpIC8gNCwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW2Rlc3RfdXZfaWR4XSA9CisgICAgICAgICAgQ0xBTVAgKCgzICogZGVzdFZbZGVzdF91dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSkgLyA0LCAwLCAyNTUpOworICAgIH0KKworICAgIGRlc3RZICs9IGRlc3Rfc3RyaWRlWTsKKyAgICBkZXN0VSArPSBkZXN0X3N0cmlkZVU7CisgICAgZGVzdFYgKz0gZGVzdF9zdHJpZGVWOworICAgIHNyY1kgKz0gc3JjX3N0cmlkZVk7CisgICAgc3JjVSArPSBzcmNfc3RyaWRlVTsKKyAgICBzcmNWICs9IHNyY19zdHJpZGVWOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5X2k0MjBfaTQyMCAoZ3VpbnQgaV9hbHBoYSwgR3N0VmlkZW9GcmFtZSAqIGRlc3QsCisgICAgZ2Jvb2xlYW4gZGVzdF9zZHR2LCBnaW50IGRlc3RfeCwgZ2ludCBkZXN0X3ksIEdzdFZpZGVvRnJhbWUgKiBzcmMsCisgICAgZ2Jvb2xlYW4gc3JjX3NkdHYsIGdpbnQgc3JjX3gsIGdpbnQgc3JjX3ksIGdpbnQgdywgZ2ludCBoKQoreworICBnaW50IGksIGo7CisgIGd1aW50OCAqZGVzdFksICpkZXN0VSwgKmRlc3RWOworICBjb25zdCBndWludDggKnNyY1ksICpzcmNVLCAqc3JjVjsKKyAgZ3VpbnQ4ICpkZXN0WTI7CisgIGNvbnN0IGd1aW50OCAqc3JjWTIsICpzcmNVMiwgKnNyY1YyOworICBnaW50IGRlc3Rfc3RyaWRlWSwgZGVzdF9zdHJpZGVVLCBkZXN0X3N0cmlkZVY7CisgIGdpbnQgc3JjX3N0cmlkZVksIHNyY19zdHJpZGVVLCBzcmNfc3RyaWRlVjsKKyAgZ2ludCBzcmNfeV9pZHgsIHNyY191dl9pZHg7CisgIGdpbnQgZGVzdF95X2lkeCwgZGVzdF91dl9pZHg7CisgIGdpbnQgbWF0cml4WzEyXTsKKyAgZ2ludCB5MSwgeTIsIHkzLCB5NDsKKyAgZ2ludCB1MSwgdTIsIHUzLCB1NDsKKyAgZ2ludCB2MSwgdjIsIHYzLCB2NDsKKyAgZ2ludCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodDsKKworICBkZXN0X3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChkZXN0KTsKKyAgZGVzdF9oZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChkZXN0KTsKKworICBkZXN0X3N0cmlkZVkgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGRlc3QsIDApOworICBkZXN0X3N0cmlkZVUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGRlc3QsIDEpOworICBkZXN0X3N0cmlkZVYgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGRlc3QsIDIpOworCisgIHNyY19zdHJpZGVZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChzcmMsIDApOworICBzcmNfc3RyaWRlVSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoc3JjLCAxKTsKKyAgc3JjX3N0cmlkZVYgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKHNyYywgMik7CisKKyAgZGVzdFkgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChkZXN0LCAwKTsKKyAgZGVzdFUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChkZXN0LCAxKTsKKyAgZGVzdFYgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChkZXN0LCAyKTsKKworICBzcmNZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoc3JjLCAwKTsKKyAgc3JjVSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKHNyYywgMSk7CisgIHNyY1YgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChzcmMsIDIpOworCisgIGRlc3RZID0gZGVzdFkgKyBkZXN0X3kgKiBkZXN0X3N0cmlkZVkgKyBkZXN0X3g7CisgIGRlc3RVID0gZGVzdFUgKyAoZGVzdF95IC8gMikgKiBkZXN0X3N0cmlkZVUgKyBkZXN0X3ggLyAyOworICBkZXN0ViA9IGRlc3RWICsgKGRlc3RfeSAvIDIpICogZGVzdF9zdHJpZGVWICsgZGVzdF94IC8gMjsKKworICBzcmNZID0gc3JjWSArIHNyY195ICogc3JjX3N0cmlkZVkgKyBzcmNfeDsKKyAgc3JjVSA9IHNyY1UgKyAoc3JjX3kgLyAyKSAqIHNyY19zdHJpZGVVICsgc3JjX3ggLyAyOworICBzcmNWID0gc3JjViArIChzcmNfeSAvIDIpICogc3JjX3N0cmlkZVYgKyBzcmNfeCAvIDI7CisKKyAgZGVzdFkyID0gZGVzdFkgKyBkZXN0X3N0cmlkZVk7CisgIHNyY1kyID0gc3JjWSArIHNyY19zdHJpZGVZOworCisgIGggPSBkZXN0X3kgKyBoOworICB3ID0gZGVzdF94ICsgdzsKKworICBpZiAoc3JjX3NkdHYgIT0gZGVzdF9zZHR2KQorICAgIG1lbWNweSAobWF0cml4LAorICAgICAgICBkZXN0X3NkdHYgPyBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0IDoKKyAgICAgICAgY29nX3ljYmNyX3NkdHZfdG9feWNiY3JfaGR0dl9tYXRyaXhfOGJpdCwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKyAgZWxzZQorICAgIG1lbWNweSAobWF0cml4LCBjb2dfaWRlbnRpdHlfbWF0cml4XzhiaXQsIDEyICogc2l6ZW9mIChnaW50KSk7CisKKyAgLyogMS4gSGFuZGxlIHRoZSBmaXJzdCBkZXN0aW5hdGlvbiBzY2FubGluZSBzcGVjaWFsbHkgaWYgaXQKKyAgICogICAgZG9lc24ndCBzdGFydCBhdCB0aGUgbWFjcm8gcGl4ZWwgYm91bmRhcnksIGkuZS4gYmxlbmQKKyAgICogICAgd2l0aCB0aGUgYmFja2dyb3VuZCEgKi8KKyAgaWYgKGRlc3RfeSAlIDIgPT0gMSkgeworICAgIC8qIDEuMS4gSGFuZGxlIHRoZSBmaXJzdCBkZXN0aW5hdGlvbiBwaXhlbCBpZiBpdCBkb2Vzbid0CisgICAgICogICAgICBzdGFydCBhdCB0aGUgbWFjcm8gcGl4ZWwgYm91bmRhcnksIGkuZS4gYmxlbmQgd2l0aAorICAgICAqICAgICAgdGhlIGJhY2tncm91bmQhICovCisgICAgaWYgKGRlc3RfeCAlIDIgPT0gMSkgeworICAgICAgeTEgPSBzcmNZWzBdOworICAgICAgdTEgPSBzcmNVWzBdOworICAgICAgdjEgPSBzcmNWWzBdOworCisgICAgICBkZXN0WVswXSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0VVswXSA9CisgICAgICAgICAgQ0xBTVAgKCgzICogZGVzdFVbMF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkpIC8gNCwgMCwKKyAgICAgICAgICAyNTUpOworICAgICAgZGVzdFZbMF0gPQorICAgICAgICAgIENMQU1QICgoMyAqIGRlc3RWWzBdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkxLCB1MSwgdjEpKSAvIDQsIDAsCisgICAgICAgICAgMjU1KTsKKworICAgICAgaiA9IGRlc3RfeCArIDE7CisgICAgICBzcmNfeV9pZHggPSBkZXN0X3lfaWR4ID0gZGVzdF91dl9pZHggPSAxOworICAgICAgc3JjX3V2X2lkeCA9IChzcmNfeCAlIDIpICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgaiA9IGRlc3RfeDsKKyAgICAgIHNyY195X2lkeCA9IGRlc3RfeV9pZHggPSBkZXN0X3V2X2lkeCA9IDA7CisgICAgICBzcmNfdXZfaWR4ID0gKHNyY194ICUgMik7CisgICAgfQorCisgICAgLyogMS4yLiBDb3B5IGFsbCBtYWNybyBwaXhlbHMgZnJvbSB0aGUgc291cmNlIHRvIHRoZSBkZXN0aW5hdGlvbgorICAgICAqICAgICAgYnV0IGJsZW5kIHdpdGggdGhlIGJhY2tncm91bmQgYmVjYXVzZSB3ZSdyZSBvbmx5IGZpbGxpbmcKKyAgICAgKiAgICAgIHRoZSBsb3dlciBwYXJ0IG9mIHRoZSBtYWNybyBwaXhlbHMuICovCisgICAgZm9yICg7IGogPCB3IC0gMTsgaiArPSAyKSB7CisgICAgICB5MSA9IHNyY1lbc3JjX3lfaWR4XTsKKyAgICAgIHkyID0gc3JjWVtzcmNfeV9pZHggKyAxXTsKKworICAgICAgdTEgPSBzcmNVW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHYxID0gc3JjVltzcmNfdXZfaWR4IC8gMl07CisgICAgICBzcmNfdXZfaWR4Kys7CisgICAgICB1MiA9IHNyY1Vbc3JjX3V2X2lkeCAvIDJdOworICAgICAgdjIgPSBzcmNWW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHNyY191dl9pZHgrKzsKKworICAgICAgZGVzdFlbZGVzdF95X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFlbZGVzdF95X2lkeCArIDFdID0KKyAgICAgICAgICBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkyLCB1MiwgdjIpLCAwLCAyNTUpOworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0KKyAgICAgICAgICBDTEFNUCAoKDIgKiBkZXN0VVtkZXN0X3V2X2lkeF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLAorICAgICAgICAgICAgICAgICAgdjEpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkyLCB1MiwgdjIpKSAvIDQsIDAsIDI1NSk7CisgICAgICBkZXN0VltkZXN0X3V2X2lkeF0gPQorICAgICAgICAgIENMQU1QICgoMiAqIGRlc3RWW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTIsIHUyLCB2MikpIC8gNCwgMCwgMjU1KTsKKworICAgICAgZGVzdF95X2lkeCArPSAyOworICAgICAgc3JjX3lfaWR4ICs9IDI7CisgICAgICBkZXN0X3V2X2lkeCsrOworICAgIH0KKworICAgIC8qIDEuMy4gTm93IGNvcHkgdGhlIGxhc3QgcGl4ZWwgaWYgb25lIGV4aXN0cyBhbmQgYmxlbmQgaXQKKyAgICAgKiAgICAgIHdpdGggdGhlIGJhY2tncm91bmQgYmVjYXVzZSB3ZSBvbmx5IGZpbGwgcGFydCBvZgorICAgICAqICAgICAgdGhlIG1hY3JvIHBpeGVsLiBJbiBjYXNlIHRoaXMgaXMgdGhlIGxhc3QgcGl4ZWwgb2YKKyAgICAgKiAgICAgIHRoZSBkZXN0aW5hdGlvbiB3ZSB3aWxsIGEgbGFyZ2VyIHBhcnQuICovCisgICAgaWYgKGogPT0gdyAtIDEgJiYgaiA9PSBkZXN0X3dpZHRoIC0gMSkgeworICAgICAgeTEgPSBzcmNZW3NyY195X2lkeF07CisgICAgICB1MSA9IHNyY1Vbc3JjX3V2X2lkeCAvIDJdOworICAgICAgdjEgPSBzcmNWW3NyY191dl9pZHggLyAyXTsKKworICAgICAgZGVzdFlbZGVzdF95X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgIChkZXN0VVtkZXN0X3V2X2lkeF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkpIC8gMiwgMCwKKyAgICAgICAgICAyNTUpOworICAgICAgZGVzdFZbZGVzdF91dl9pZHhdID0KKyAgICAgICAgICBDTEFNUCAoKGRlc3RWW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkpIC8gMiwgMCwgMjU1KTsKKyAgICB9IGVsc2UgaWYgKGogPT0gdyAtIDEpIHsKKyAgICAgIHkxID0gc3JjWVtzcmNfeV9pZHhdOworICAgICAgdTEgPSBzcmNVW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHYxID0gc3JjVltzcmNfdXZfaWR4IC8gMl07CisKKyAgICAgIGRlc3RZW2Rlc3RfeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVW2Rlc3RfdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoMyAqIGRlc3RVW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyA0LAorICAgICAgICAgIDAsIDI1NSk7CisgICAgICBkZXN0VltkZXN0X3V2X2lkeF0gPQorICAgICAgICAgIENMQU1QICgoMyAqIGRlc3RWW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkpIC8gNCwgMCwgMjU1KTsKKyAgICB9CisKKyAgICBkZXN0WSArPSBkZXN0X3N0cmlkZVk7CisgICAgZGVzdFkyICs9IGRlc3Rfc3RyaWRlWTsKKyAgICBkZXN0VSArPSBkZXN0X3N0cmlkZVU7CisgICAgZGVzdFYgKz0gZGVzdF9zdHJpZGVWOworICAgIHNyY1kgKz0gc3JjX3N0cmlkZVk7CisgICAgc3JjWTIgKz0gc3JjX3N0cmlkZVk7CisgICAgc3JjX3krKzsKKyAgICBpZiAoc3JjX3kgJSAyID09IDApIHsKKyAgICAgIHNyY1UgKz0gc3JjX3N0cmlkZVU7CisgICAgICBzcmNWICs9IHNyY19zdHJpZGVWOworICAgIH0KKyAgICBpID0gZGVzdF95ICsgMTsKKyAgfSBlbHNlIHsKKyAgICBpID0gZGVzdF95OworICB9CisKKyAgLyogMi4gQ29weSBhbGwgbWFjcm8gcGl4ZWwgc2NhbmxpbmVzLCB0aGUgZGVzdGluYXRpb24gc2NhbmxpbmUKKyAgICogICAgbm93IHN0YXJ0cyBhdCBtYWNybyBwaXhlbCBib3VuZGFyeS4gKi8KKyAgZm9yICg7IGkgPCBoIC0gMTsgaSArPSAyKSB7CisgICAgLyogMi4xLiBIYW5kbGUgdGhlIGZpcnN0IGRlc3RpbmF0aW9uIHBpeGVsIGlmIGl0IGRvZXNuJ3QKKyAgICAgKiAgICAgIHN0YXJ0IGF0IHRoZSBtYWNybyBwaXhlbCBib3VuZGFyeSwgaS5lLiBibGVuZCB3aXRoCisgICAgICogICAgICB0aGUgYmFja2dyb3VuZCEgKi8KKworICAgIHNyY1UyID0gc3JjVTsKKyAgICBzcmNWMiA9IHNyY1Y7CisgICAgaWYgKHNyY195ICUgMiA9PSAxKSB7CisgICAgICBzcmNVMiArPSBzcmNfc3RyaWRlVTsKKyAgICAgIHNyY1YyICs9IHNyY19zdHJpZGVWOworICAgIH0KKworICAgIGlmIChkZXN0X3ggJSAyID09IDEpIHsKKyAgICAgIHkxID0gc3JjWVswXTsKKyAgICAgIHkyID0gc3JjWTJbMF07CisgICAgICB1MSA9IHNyY1VbMF07CisgICAgICB2MSA9IHNyY1ZbMF07CisgICAgICB1MiA9IHNyY1UyWzBdOworICAgICAgdjIgPSBzcmNWMlswXTsKKworICAgICAgZGVzdFlbMF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFkyWzBdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MiwgdTIsIHYyKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVWzBdID0gQ0xBTVAgKAorICAgICAgICAgICgyICogZGVzdFVbMF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLAorICAgICAgICAgICAgICAgICAgdjEpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkyLCB1MiwgdjIpKSAvIDQsIDAsIDI1NSk7CisgICAgICBkZXN0VlswXSA9IENMQU1QICgKKyAgICAgICAgICAoMiAqIGRlc3RWWzBdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwgdTIsIHYyKSkgLyA0LCAwLCAyNTUpOworICAgICAgaiA9IGRlc3RfeCArIDE7CisgICAgICBzcmNfeV9pZHggPSBkZXN0X3lfaWR4ID0gZGVzdF91dl9pZHggPSAxOworICAgICAgc3JjX3V2X2lkeCA9IChzcmNfeCAlIDIpICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgaiA9IGRlc3RfeDsKKyAgICAgIHNyY195X2lkeCA9IGRlc3RfeV9pZHggPSBkZXN0X3V2X2lkeCA9IDA7CisgICAgICBzcmNfdXZfaWR4ID0gKHNyY194ICUgMik7CisgICAgfQorCisgICAgLyogMi4yLiBDb3B5IGFsbCBtYWNybyBwaXhlbHMgZnJvbSB0aGUgc291cmNlIHRvIHRoZSBkZXN0aW5hdGlvbi4KKyAgICAgKiAgICAgIEFsbCBwaXhlbHMgbm93IHN0YXJ0IGF0IG1hY3JvIHBpeGVsIGJvdW5kYXJ5LCBpLmUuIG5vCisgICAgICogICAgICBibGVuZGluZyB3aXRoIHRoZSBiYWNrZ3JvdW5kIGlzIG5lY2Vzc2FyeS4gKi8KKyAgICBmb3IgKDsgaiA8IHcgLSAxOyBqICs9IDIpIHsKKyAgICAgIHkxID0gc3JjWVtzcmNfeV9pZHhdOworICAgICAgeTIgPSBzcmNZW3NyY195X2lkeCArIDFdOworICAgICAgeTMgPSBzcmNZMltzcmNfeV9pZHhdOworICAgICAgeTQgPSBzcmNZMltzcmNfeV9pZHggKyAxXTsKKworICAgICAgdTEgPSBzcmNVW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHUzID0gc3JjVTJbc3JjX3V2X2lkeCAvIDJdOworICAgICAgdjEgPSBzcmNWW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHYzID0gc3JjVjJbc3JjX3V2X2lkeCAvIDJdOworICAgICAgc3JjX3V2X2lkeCsrOworICAgICAgdTIgPSBzcmNVW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHU0ID0gc3JjVTJbc3JjX3V2X2lkeCAvIDJdOworICAgICAgdjIgPSBzcmNWW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHY0ID0gc3JjVjJbc3JjX3V2X2lkeCAvIDJdOworICAgICAgc3JjX3V2X2lkeCsrOworCisgICAgICBkZXN0WVtkZXN0X3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WVtkZXN0X3lfaWR4ICsgMV0gPQorICAgICAgICAgIENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUyLCB2MiksIDAsIDI1NSk7CisgICAgICBkZXN0WTJbZGVzdF95X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkzLCB1MywgdjMpLCAwLCAyNTUpOworICAgICAgZGVzdFkyW2Rlc3RfeV9pZHggKyAxXSA9CisgICAgICAgICAgQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5NCwgdTQsIHY0KSwgMCwgMjU1KTsKKworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTIsCisgICAgICAgICAgICAgICAgICB1MiwgdjIpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkzLCB1MywKKyAgICAgICAgICAgICAgICAgIHYzKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5NCwgdTQsIHY0KSkgLyA0LCAwLCAyNTUpOworICAgICAgZGVzdFZbZGVzdF91dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTEsIHUxLCB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTIsCisgICAgICAgICAgICAgICAgICB1MiwgdjIpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkzLCB1MywKKyAgICAgICAgICAgICAgICAgIHYzKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5NCwgdTQsIHY0KSkgLyA0LCAwLCAyNTUpOworCisgICAgICBkZXN0X3lfaWR4ICs9IDI7CisgICAgICBzcmNfeV9pZHggKz0gMjsKKyAgICAgIGRlc3RfdXZfaWR4Kys7CisgICAgfQorCisgICAgLyogMi4zLiBOb3cgY29weSB0aGUgbGFzdCBwaXhlbCBpZiBvbmUgZXhpc3RzIGFuZCBibGVuZCBpdAorICAgICAqICAgICAgd2l0aCB0aGUgYmFja2dyb3VuZCBiZWNhdXNlIHdlIG9ubHkgZmlsbCBwYXJ0IG9mCisgICAgICogICAgICB0aGUgbWFjcm8gcGl4ZWwuIEluIGNhc2UgdGhpcyBpcyB0aGUgbGFzdCBwaXhlbCBvZgorICAgICAqICAgICAgdGhlIGRlc3RpbmF0aW9uIHdlIHdpbGwgYSBsYXJnZXIgcGFydC4gKi8KKyAgICBpZiAoaiA9PSB3IC0gMSAmJiBqID09IGRlc3Rfd2lkdGggLSAxKSB7CisgICAgICB5MSA9IHNyY1lbc3JjX3lfaWR4XTsKKyAgICAgIHkyID0gc3JjWTJbc3JjX3lfaWR4XTsKKworICAgICAgdTEgPSBzcmNVW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHUyID0gc3JjVTJbc3JjX3V2X2lkeCAvIDJdOworCisgICAgICB2MSA9IHNyY1Zbc3JjX3V2X2lkeCAvIDJdOworICAgICAgdjIgPSBzcmNWMltzcmNfdXZfaWR4IC8gMl07CisKKyAgICAgIGRlc3RZW2Rlc3RfeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RZMltkZXN0X3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUyLCB2MiksIDAsIDI1NSk7CisgICAgICBkZXN0VVtkZXN0X3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwKKyAgICAgICAgICAgICAgICAgIHUyLCB2MikpIC8gMiwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW2Rlc3RfdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwgdjEpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkyLAorICAgICAgICAgICAgICAgICAgdTIsIHYyKSkgLyAyLCAwLCAyNTUpOworICAgIH0gZWxzZSBpZiAoaiA9PSB3IC0gMSkgeworICAgICAgeTEgPSBzcmNZW3NyY195X2lkeF07CisgICAgICB5MiA9IHNyY1kyW3NyY195X2lkeF07CisKKyAgICAgIHUxID0gc3JjVVtzcmNfdXZfaWR4IC8gMl07CisgICAgICB1MiA9IHNyY1UyW3NyY191dl9pZHggLyAyXTsKKworICAgICAgdjEgPSBzcmNWW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHYyID0gc3JjVjJbc3JjX3V2X2lkeCAvIDJdOworCisgICAgICBkZXN0WVtkZXN0X3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WTJbZGVzdF95X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkyLCB1MiwgdjIpLCAwLCAyNTUpOworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgICgyICogZGVzdFVbZGVzdF91dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwgdTIsIHYyKSkgLyA0LCAwLCAyNTUpOworICAgICAgZGVzdFZbZGVzdF91dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgICgyICogZGVzdFZbZGVzdF91dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwgdTIsIHYyKSkgLyA0LCAwLCAyNTUpOworICAgIH0KKworICAgIGRlc3RZICs9IDIgKiBkZXN0X3N0cmlkZVk7CisgICAgZGVzdFkyICs9IDIgKiBkZXN0X3N0cmlkZVk7CisgICAgZGVzdFUgKz0gZGVzdF9zdHJpZGVVOworICAgIGRlc3RWICs9IGRlc3Rfc3RyaWRlVjsKKyAgICBzcmNZICs9IDIgKiBzcmNfc3RyaWRlWTsKKyAgICBzcmNZMiArPSAyICogc3JjX3N0cmlkZVk7CisKKyAgICBzcmNfeSArPSAyOworICAgIHNyY1UgKz0gc3JjX3N0cmlkZVU7CisgICAgc3JjViArPSBzcmNfc3RyaWRlVjsKKyAgfQorCisgIC8qIDMuIEhhbmRsZSB0aGUgbGFzdCBzY2FubGluZSBpZiBvbmUgZXhpc3RzLiBUaGlzIGFnYWluCisgICAqICAgIGRvZXNuJ3Qgc3RhcnQgYXQgbWFjcm8gcGl4ZWwgYm91bmRhcnkgYnV0IHNob3VsZAorICAgKiAgICBvbmx5IGZpbGwgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIG1hY3JvIHBpeGVscy4gKi8KKyAgaWYgKGkgPT0gaCAtIDEgJiYgaSA9PSBkZXN0X2hlaWdodCAtIDEpIHsKKyAgICAvKiAzLjEuIEhhbmRsZSB0aGUgZmlyc3QgZGVzdGluYXRpb24gcGl4ZWwgaWYgaXQgZG9lc24ndAorICAgICAqICAgICAgc3RhcnQgYXQgdGhlIG1hY3JvIHBpeGVsIGJvdW5kYXJ5LCBpLmUuIGJsZW5kIHdpdGgKKyAgICAgKiAgICAgIHRoZSBiYWNrZ3JvdW5kISAqLworICAgIGlmIChkZXN0X3ggJSAyID09IDEpIHsKKyAgICAgIHkxID0gc3JjWVswXTsKKyAgICAgIHUxID0gc3JjVVswXTsKKyAgICAgIHYxID0gc3JjVlswXTsKKworICAgICAgZGVzdFlbMF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFVbMF0gPQorICAgICAgICAgIENMQU1QICgoZGVzdFVbMF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkpIC8gMiwgMCwgMjU1KTsKKyAgICAgIGRlc3RWWzBdID0KKyAgICAgICAgICBDTEFNUCAoKGRlc3RWWzBdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkxLCB1MSwgdjEpKSAvIDIsIDAsIDI1NSk7CisKKyAgICAgIGogPSBkZXN0X3ggKyAxOworICAgICAgc3JjX3lfaWR4ID0gZGVzdF95X2lkeCA9IGRlc3RfdXZfaWR4ID0gMTsKKyAgICAgIHNyY191dl9pZHggPSAoc3JjX3ggJSAyKSArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGogPSBkZXN0X3g7CisgICAgICBzcmNfeV9pZHggPSBkZXN0X3lfaWR4ID0gZGVzdF91dl9pZHggPSAwOworICAgICAgc3JjX3V2X2lkeCA9IChzcmNfeCAlIDIpOworICAgIH0KKworICAgIC8qIDMuMi4gQ29weSBhbGwgbWFjcm8gcGl4ZWxzIGZyb20gdGhlIHNvdXJjZSB0byB0aGUgZGVzdGluYXRpb24KKyAgICAgKiAgICAgIGJ1dCBibGVuZCB3aXRoIHRoZSBiYWNrZ3JvdW5kIGJlY2F1c2Ugd2UncmUgb25seSBmaWxsaW5nCisgICAgICogICAgICB0aGUgdXBwZXIgcGFydCBvZiB0aGUgbWFjcm8gcGl4ZWxzLiAqLworICAgIGZvciAoOyBqIDwgdyAtIDE7IGogKz0gMikgeworICAgICAgeTEgPSBzcmNZW3NyY195X2lkeF07CisgICAgICB5MiA9IHNyY1lbc3JjX3lfaWR4ICsgMV07CisKKyAgICAgIHUxID0gc3JjVVtzcmNfdXZfaWR4IC8gMl07CisgICAgICB2MSA9IHNyY1Zbc3JjX3V2X2lkeCAvIDJdOworICAgICAgc3JjX3V2X2lkeCsrOworICAgICAgdTIgPSBzcmNVW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHYyID0gc3JjVltzcmNfdXZfaWR4IC8gMl07CisgICAgICBzcmNfdXZfaWR4Kys7CisKKyAgICAgIGRlc3RZW2Rlc3RfeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RZW2Rlc3RfeV9pZHggKyAxXSA9CisgICAgICAgICAgQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MiwgdTIsIHYyKSwgMCwgMjU1KTsKKworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgICgyICogZGVzdFVbZGVzdF91dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MiwgdTIsIHYyKSkgLyA0LCAwLCAyNTUpOworICAgICAgZGVzdFZbZGVzdF91dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgICgyICogZGVzdFZbZGVzdF91dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwgdTIsIHYyKSkgLyA0LCAwLCAyNTUpOworCisgICAgICBkZXN0X3lfaWR4ICs9IDI7CisgICAgICBzcmNfeV9pZHggKz0gMjsKKyAgICAgIGRlc3RfdXZfaWR4Kys7CisgICAgfQorCisgICAgLyogMy4zLiBOb3cgY29weSB0aGUgbGFzdCBwaXhlbCBpZiBvbmUgZXhpc3RzIGFuZCBibGVuZCBpdAorICAgICAqICAgICAgd2l0aCB0aGUgYmFja2dyb3VuZCBiZWNhdXNlIHdlIG9ubHkgZmlsbCBwYXJ0IG9mCisgICAgICogICAgICB0aGUgbWFjcm8gcGl4ZWwuIEluIGNhc2UgdGhpcyBpcyB0aGUgbGFzdCBwaXhlbCBvZgorICAgICAqICAgICAgdGhlIGRlc3RpbmF0aW9uIHdlIHdpbGwgYSBsYXJnZXIgcGFydC4gKi8KKyAgICBpZiAoaiA9PSB3IC0gMSAmJiBqID09IGRlc3Rfd2lkdGggLSAxKSB7CisgICAgICB5MSA9IHNyY1lbc3JjX3lfaWR4XTsKKyAgICAgIHUxID0gc3JjVVtzcmNfdXZfaWR4IC8gMl07CisgICAgICB2MSA9IHNyY1Zbc3JjX3V2X2lkeCAvIDJdOworCisgICAgICBkZXN0WVtkZXN0X3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0VVtkZXN0X3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKGRlc3RVW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyAyLCAwLAorICAgICAgICAgIDI1NSk7CisgICAgICBkZXN0VltkZXN0X3V2X2lkeF0gPQorICAgICAgICAgIENMQU1QICgoZGVzdFZbZGVzdF91dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSkgLyAyLCAwLCAyNTUpOworICAgIH0gZWxzZSBpZiAoaiA9PSB3IC0gMSkgeworICAgICAgeTEgPSBzcmNZW3NyY195X2lkeF07CisgICAgICB1MSA9IHNyY1Vbc3JjX3V2X2lkeCAvIDJdOworICAgICAgdjEgPSBzcmNWW3NyY191dl9pZHggLyAyXTsKKworICAgICAgZGVzdFlbZGVzdF95X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgICgzICogZGVzdFVbZGVzdF91dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwgdjEpKSAvIDQsCisgICAgICAgICAgMCwgMjU1KTsKKyAgICAgIGRlc3RWW2Rlc3RfdXZfaWR4XSA9CisgICAgICAgICAgQ0xBTVAgKCgzICogZGVzdFZbZGVzdF91dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSkgLyA0LCAwLCAyNTUpOworICAgIH0KKyAgfSBlbHNlIGlmIChpID09IGggLSAxKSB7CisgICAgLyogMy4xLiBIYW5kbGUgdGhlIGZpcnN0IGRlc3RpbmF0aW9uIHBpeGVsIGlmIGl0IGRvZXNuJ3QKKyAgICAgKiAgICAgIHN0YXJ0IGF0IHRoZSBtYWNybyBwaXhlbCBib3VuZGFyeSwgaS5lLiBibGVuZCB3aXRoCisgICAgICogICAgICB0aGUgYmFja2dyb3VuZCEgKi8KKyAgICBpZiAoZGVzdF94ICUgMiA9PSAxKSB7CisgICAgICB5MSA9IHNyY1lbMF07CisgICAgICB1MSA9IHNyY1VbMF07CisgICAgICB2MSA9IHNyY1ZbMF07CisKKyAgICAgIGRlc3RZWzBdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVWzBdID0KKyAgICAgICAgICBDTEFNUCAoKDMgKiBkZXN0VVswXSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyA0LCAwLAorICAgICAgICAgIDI1NSk7CisgICAgICBkZXN0VlswXSA9CisgICAgICAgICAgQ0xBTVAgKCgzICogZGVzdFZbMF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTEsIHUxLCB2MSkpIC8gNCwgMCwKKyAgICAgICAgICAyNTUpOworCisgICAgICBqID0gZGVzdF94ICsgMTsKKyAgICAgIHNyY195X2lkeCA9IGRlc3RfeV9pZHggPSBkZXN0X3V2X2lkeCA9IDE7CisgICAgICBzcmNfdXZfaWR4ID0gKHNyY194ICUgMikgKyAxOworICAgIH0gZWxzZSB7CisgICAgICBqID0gZGVzdF94OworICAgICAgc3JjX3lfaWR4ID0gZGVzdF95X2lkeCA9IGRlc3RfdXZfaWR4ID0gMDsKKyAgICAgIHNyY191dl9pZHggPSAoc3JjX3ggJSAyKTsKKyAgICB9CisKKyAgICAvKiAzLjIuIENvcHkgYWxsIG1hY3JvIHBpeGVscyBmcm9tIHRoZSBzb3VyY2UgdG8gdGhlIGRlc3RpbmF0aW9uCisgICAgICogICAgICBidXQgYmxlbmQgd2l0aCB0aGUgYmFja2dyb3VuZCBiZWNhdXNlIHdlJ3JlIG9ubHkgZmlsbGluZworICAgICAqICAgICAgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIG1hY3JvIHBpeGVscy4gKi8KKyAgICBmb3IgKDsgaiA8IHcgLSAxOyBqICs9IDIpIHsKKyAgICAgIHkxID0gc3JjWVtzcmNfeV9pZHhdOworICAgICAgeTIgPSBzcmNZW3NyY195X2lkeCArIDFdOworCisgICAgICB1MSA9IHNyY1Vbc3JjX3V2X2lkeCAvIDJdOworICAgICAgdjEgPSBzcmNWW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHNyY191dl9pZHgrKzsKKyAgICAgIHUyID0gc3JjVVtzcmNfdXZfaWR4IC8gMl07CisgICAgICB2MiA9IHNyY1Zbc3JjX3V2X2lkeCAvIDJdOworICAgICAgc3JjX3V2X2lkeCsrOworCisgICAgICBkZXN0WVtkZXN0X3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WVtkZXN0X3lfaWR4ICsgMV0gPQorICAgICAgICAgIENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUyLCB2MiksIDAsIDI1NSk7CisKKyAgICAgIGRlc3RVW2Rlc3RfdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoMiAqIGRlc3RVW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTIsIHUyLCB2MikpIC8gNCwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW2Rlc3RfdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoMiAqIGRlc3RWW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTIsIHUyLCB2MikpIC8gNCwgMCwgMjU1KTsKKworICAgICAgZGVzdF95X2lkeCArPSAyOworICAgICAgc3JjX3lfaWR4ICs9IDI7CisgICAgICBkZXN0X3V2X2lkeCsrOworICAgIH0KKworICAgIC8qIDMuMy4gTm93IGNvcHkgdGhlIGxhc3QgcGl4ZWwgaWYgb25lIGV4aXN0cyBhbmQgYmxlbmQgaXQKKyAgICAgKiAgICAgIHdpdGggdGhlIGJhY2tncm91bmQgYmVjYXVzZSB3ZSBvbmx5IGZpbGwgcGFydCBvZgorICAgICAqICAgICAgdGhlIG1hY3JvIHBpeGVsLiBJbiBjYXNlIHRoaXMgaXMgdGhlIGxhc3QgcGl4ZWwgb2YKKyAgICAgKiAgICAgIHRoZSBkZXN0aW5hdGlvbiB3ZSB3aWxsIGEgbGFyZ2VyIHBhcnQuICovCisgICAgaWYgKGogPT0gdyAtIDEgJiYgaiA9PSBkZXN0X3dpZHRoIC0gMSkgeworICAgICAgeTEgPSBzcmNZW3NyY195X2lkeF07CisgICAgICB1MSA9IHNyY1Vbc3JjX3V2X2lkeCAvIDJdOworICAgICAgdjEgPSBzcmNWW3NyY191dl9pZHggLyAyXTsKKworICAgICAgZGVzdFlbZGVzdF95X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgIChkZXN0VVtkZXN0X3V2X2lkeF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkpIC8gMiwgMCwKKyAgICAgICAgICAyNTUpOworICAgICAgZGVzdFZbZGVzdF91dl9pZHhdID0KKyAgICAgICAgICBDTEFNUCAoKGRlc3RWW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkpIC8gMiwgMCwgMjU1KTsKKyAgICB9IGVsc2UgaWYgKGogPT0gdyAtIDEpIHsKKyAgICAgIHkxID0gc3JjWVtzcmNfeV9pZHhdOworICAgICAgdTEgPSBzcmNVW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHYxID0gc3JjVltzcmNfdXZfaWR4IC8gMl07CisKKyAgICAgIGRlc3RZW2Rlc3RfeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVW2Rlc3RfdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoMyAqIGRlc3RVW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyA0LAorICAgICAgICAgIDAsIDI1NSk7CisgICAgICBkZXN0VltkZXN0X3V2X2lkeF0gPQorICAgICAgICAgIENMQU1QICgoMyAqIGRlc3RWW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkpIC8gNCwgMCwgMjU1KTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NvcHlfaTQyMF9heXV2IChndWludCBpX2FscGhhLCBHc3RWaWRlb0ZyYW1lICogZGVzdF9mcmFtZSwKKyAgICBnYm9vbGVhbiBkZXN0X3NkdHYsIGdpbnQgZGVzdF94LCBnaW50IGRlc3RfeSwgR3N0VmlkZW9GcmFtZSAqIHNyY19mcmFtZSwKKyAgICBnYm9vbGVhbiBzcmNfc2R0diwgZ2ludCBzcmNfeCwgZ2ludCBzcmNfeSwgZ2ludCB3LCBnaW50IGgpCit7CisgIGNvbnN0IGd1aW50OCAqc3JjWSwgKnNyY1UsICpzcmNWOworICBnaW50IHNyY19zdHJpZGVZLCBzcmNfc3RyaWRlVSwgc3JjX3N0cmlkZVY7CisgIGdpbnQgZGVzdF9zdHJpZGU7CisgIGd1aW50OCAqZGVzdDsKKworICBzcmNfc3RyaWRlWSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoc3JjX2ZyYW1lLCAwKTsKKyAgc3JjX3N0cmlkZVUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKHNyY19mcmFtZSwgMSk7CisgIHNyY19zdHJpZGVWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChzcmNfZnJhbWUsIDIpOworCisgIHNyY1kgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChzcmNfZnJhbWUsIDApOworICBzcmNVID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoc3JjX2ZyYW1lLCAxKTsKKyAgc3JjViA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKHNyY19mcmFtZSwgMik7CisKKyAgZGVzdF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChkZXN0X2ZyYW1lLCAwKTsKKworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3RfZnJhbWUsIDApOworICBkZXN0ID0gZGVzdCArIGRlc3RfeSAqIGRlc3Rfc3RyaWRlICsgZGVzdF94ICogNDsKKworICBzcmNZID0gc3JjWSArIHNyY195ICogc3JjX3N0cmlkZVkgKyBzcmNfeDsKKyAgc3JjVSA9IHNyY1UgKyAoc3JjX3kgLyAyKSAqIHNyY19zdHJpZGVVICsgc3JjX3ggLyAyOworICBzcmNWID0gc3JjViArIChzcmNfeSAvIDIpICogc3JjX3N0cmlkZVYgKyBzcmNfeCAvIDI7CisKKyAgaV9hbHBoYSA9IENMQU1QIChpX2FscGhhLCAwLCAyNTUpOworCisgIGlmIChzcmNfc2R0diAhPSBkZXN0X3NkdHYpIHsKKyAgICBnaW50IGksIGosIHV2X2lkeDsKKyAgICBnaW50IHksIHUsIHY7CisgICAgZ2ludCB5MSwgdTEsIHYxOworICAgIGdpbnQgbWF0cml4WzEyXTsKKworICAgIG1lbWNweSAobWF0cml4LAorICAgICAgICBkZXN0X3NkdHYgPyBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0IDoKKyAgICAgICAgY29nX3ljYmNyX3NkdHZfdG9feWNiY3JfaGR0dl9tYXRyaXhfOGJpdCwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDAsIHV2X2lkeCA9IHNyY194ICUgMjsgaiA8IHc7IGorKywgdXZfaWR4KyspIHsKKyAgICAgICAgeSA9IHNyY1lbal07CisgICAgICAgIHUgPSBzcmNVW3V2X2lkeCAvIDJdOworICAgICAgICB2ID0gc3JjVlt1dl9pZHggLyAyXTsKKworICAgICAgICB5MSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5LCB1LCB2KTsKKyAgICAgICAgdTEgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeSwgdSwgdik7CisgICAgICAgIHYxID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHksIHUsIHYpOworCisgICAgICAgIGRlc3RbNCAqIGogKyAwXSA9IGlfYWxwaGE7CisgICAgICAgIGRlc3RbNCAqIGogKyAxXSA9IHkxOworICAgICAgICBkZXN0WzQgKiBqICsgMl0gPSB1MTsKKyAgICAgICAgZGVzdFs0ICogaiArIDNdID0gdjE7CisgICAgICB9CisgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOworCisgICAgICBzcmNfeSsrOworICAgICAgc3JjWSArPSBzcmNfc3RyaWRlWTsKKyAgICAgIGlmIChzcmNfeSAlIDIgPT0gMCkgeworICAgICAgICBzcmNVICs9IHNyY19zdHJpZGVVOworICAgICAgICBzcmNWICs9IHNyY19zdHJpZGVWOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBnaW50IGksIGosIHV2X2lkeDsKKyAgICBnaW50IHksIHUsIHY7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwLCB1dl9pZHggPSBzcmNfeCAlIDI7IGogPCB3OyBqKyssIHV2X2lkeCsrKSB7CisgICAgICAgIHkgPSBzcmNZW2pdOworICAgICAgICB1ID0gc3JjVVt1dl9pZHggLyAyXTsKKyAgICAgICAgdiA9IHNyY1ZbdXZfaWR4IC8gMl07CisKKyAgICAgICAgZGVzdFs0ICogaiArIDBdID0gaV9hbHBoYTsKKyAgICAgICAgZGVzdFs0ICogaiArIDFdID0geTsKKyAgICAgICAgZGVzdFs0ICogaiArIDJdID0gdTsKKyAgICAgICAgZGVzdFs0ICogaiArIDNdID0gdjsKKyAgICAgIH0KKyAgICAgIGRlc3QgKz0gZGVzdF9zdHJpZGU7CisKKyAgICAgIHNyY195Kys7CisgICAgICBzcmNZICs9IHNyY19zdHJpZGVZOworICAgICAgaWYgKHNyY195ICUgMiA9PSAwKSB7CisgICAgICAgIHNyY1UgKz0gc3JjX3N0cmlkZVU7CisgICAgICAgIHNyY1YgKz0gc3JjX3N0cmlkZVY7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitmaWxsX3JnYjMyIChHc3RWaWRlb0JveEZpbGwgZmlsbF90eXBlLCBndWludCBiX2FscGhhLAorICAgIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSwgZ2Jvb2xlYW4gc2R0dikKK3sKKyAgZ3VpbnQzMiBlbXB0eV9waXhlbDsKKyAgZ2ludCBwWzRdOworICBndWludDggKmRlc3Q7CisgIGd1aW50IHN0cmlkZTsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChmcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGZyYW1lKTsKKworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZyYW1lLCAwKTsKKyAgc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoZnJhbWUsIDApOworCisgIHBbMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKGZyYW1lLCAzKTsKKyAgcFsxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX09GRlNFVCAoZnJhbWUsIDApOworICBwWzJdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfT0ZGU0VUIChmcmFtZSwgMSk7CisgIHBbM10gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKGZyYW1lLCAyKTsKKworICBiX2FscGhhID0gQ0xBTVAgKGJfYWxwaGEsIDAsIDI1NSk7CisKKyAgaWYgKEdTVF9WSURFT19GUkFNRV9OX0NPTVBPTkVOVFMgKGZyYW1lKSA9PSA0KSB7CisgICAgZW1wdHlfcGl4ZWwgPSBHVUlOVDMyX0ZST01fTEUgKChiX2FscGhhIDw8IChwWzBdICogOCkpIHwKKyAgICAgICAgKHJnYl9jb2xvcnNfUltmaWxsX3R5cGVdIDw8IChwWzFdICogOCkpIHwKKyAgICAgICAgKHJnYl9jb2xvcnNfR1tmaWxsX3R5cGVdIDw8IChwWzJdICogOCkpIHwKKyAgICAgICAgKHJnYl9jb2xvcnNfQltmaWxsX3R5cGVdIDw8IChwWzNdICogOCkpKTsKKyAgfSBlbHNlIHsKKyAgICBlbXB0eV9waXhlbCA9IEdVSU5UMzJfRlJPTV9MRSAoCisgICAgICAgIChyZ2JfY29sb3JzX1JbZmlsbF90eXBlXSA8PCAocFsxXSAqIDgpKSB8CisgICAgICAgIChyZ2JfY29sb3JzX0dbZmlsbF90eXBlXSA8PCAocFsyXSAqIDgpKSB8CisgICAgICAgIChyZ2JfY29sb3JzX0JbZmlsbF90eXBlXSA8PCAocFszXSAqIDgpKSk7CisgIH0KKworICBpZiAoc3RyaWRlID09IHdpZHRoICogNCkgeworICAgIHZpZGVvX2JveF9vcmNfc3BsYXRfdTMyICgoZ3VpbnQzMiAqKSBkZXN0LCBlbXB0eV9waXhlbCwgd2lkdGggKiBoZWlnaHQpOworICB9IGVsc2UgaWYgKGhlaWdodCkgeworICAgIGZvciAoOyBoZWlnaHQ7IC0taGVpZ2h0KSB7CisgICAgICB2aWRlb19ib3hfb3JjX3NwbGF0X3UzMiAoKGd1aW50MzIgKikgZGVzdCwgZW1wdHlfcGl4ZWwsIHdpZHRoKTsKKyAgICAgIGRlc3QgKz0gc3RyaWRlOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZmlsbF9yZ2IyNCAoR3N0VmlkZW9Cb3hGaWxsIGZpbGxfdHlwZSwgZ3VpbnQgYl9hbHBoYSwKKyAgICBHc3RWaWRlb0ZyYW1lICogZnJhbWUsIGdib29sZWFuIHNkdHYpCit7CisgIGdpbnQgZGVzdF9zdHJpZGU7CisgIGdpbnQgcFs0XTsKKyAgZ2ludCBpLCBqOworICBndWludDggKmRlc3Q7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChmcmFtZSk7CisKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7CisgIGRlc3Rfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoZnJhbWUsIDApOworCisgIHBbMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKGZyYW1lLCAwKTsKKyAgcFsyXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX09GRlNFVCAoZnJhbWUsIDEpOworICBwWzNdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfT0ZGU0VUIChmcmFtZSwgMik7CisKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgIGRlc3RbMyAqIGogKyBwWzFdXSA9IHJnYl9jb2xvcnNfUltmaWxsX3R5cGVdOworICAgICAgZGVzdFszICogaiArIHBbMl1dID0gcmdiX2NvbG9yc19HW2ZpbGxfdHlwZV07CisgICAgICBkZXN0WzMgKiBqICsgcFszXV0gPSByZ2JfY29sb3JzX0JbZmlsbF90eXBlXTsKKyAgICB9CisgICAgZGVzdCArPSBkZXN0X3N0cmlkZTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorY29weV9yZ2IzMiAoZ3VpbnQgaV9hbHBoYSwgR3N0VmlkZW9GcmFtZSAqIGRlc3RfZnJhbWUsCisgICAgZ2Jvb2xlYW4gZGVzdF9zZHR2LCBnaW50IGRlc3RfeCwgZ2ludCBkZXN0X3ksIEdzdFZpZGVvRnJhbWUgKiBzcmNfZnJhbWUsCisgICAgZ2Jvb2xlYW4gc3JjX3NkdHYsIGdpbnQgc3JjX3gsIGdpbnQgc3JjX3ksIGdpbnQgdywgZ2ludCBoKQoreworICBnaW50IGksIGo7CisgIGdpbnQgc3JjX3N0cmlkZSwgZGVzdF9zdHJpZGU7CisgIGdib29sZWFuIGluX2FscGhhLCBvdXRfYWxwaGE7CisgIGdpbnQgaW5fYnBwLCBvdXRfYnBwOworICBnaW50IHBfb3V0WzRdOworICBnaW50IHBfaW5bNF07CisgIGdib29sZWFuIHBhY2tlZF9vdXQ7CisgIGdib29sZWFuIHBhY2tlZF9pbjsKKyAgZ3VpbnQ4ICpzcmMsICpkZXN0OworCisgIHNyY19zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChzcmNfZnJhbWUsIDApOworICBkZXN0X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGRlc3RfZnJhbWUsIDApOworICBpbl9icHAgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFIChzcmNfZnJhbWUsIDApOworICBvdXRfYnBwID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUFNUUklERSAoZGVzdF9mcmFtZSwgMCk7CisgIHBhY2tlZF9pbiA9IChpbl9icHAgPCA0KTsKKyAgcGFja2VkX291dCA9IChvdXRfYnBwIDwgNCk7CisKKyAgb3V0X2FscGhhID0gR1NUX1ZJREVPX0lORk9fSEFTX0FMUEhBICgmZGVzdF9mcmFtZS0+aW5mbyk7CisgIHBfb3V0WzBdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfT0ZGU0VUIChkZXN0X2ZyYW1lLCAzKTsKKyAgcF9vdXRbMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKGRlc3RfZnJhbWUsIDApOworICBwX291dFsyXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX09GRlNFVCAoZGVzdF9mcmFtZSwgMSk7CisgIHBfb3V0WzNdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfT0ZGU0VUIChkZXN0X2ZyYW1lLCAyKTsKKworICBpbl9hbHBoYSA9IEdTVF9WSURFT19JTkZPX0hBU19BTFBIQSAoJnNyY19mcmFtZS0+aW5mbyk7CisgIHBfaW5bMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKHNyY19mcmFtZSwgMyk7CisgIHBfaW5bMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKHNyY19mcmFtZSwgMCk7CisgIHBfaW5bMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKHNyY19mcmFtZSwgMSk7CisgIHBfaW5bM10gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKHNyY19mcmFtZSwgMik7CisKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0X2ZyYW1lLCAwKTsKKyAgZGVzdCA9IGRlc3QgKyBkZXN0X3kgKiBkZXN0X3N0cmlkZSArIGRlc3RfeCAqIG91dF9icHA7CisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmNfZnJhbWUsIDApOworICBzcmMgPSBzcmMgKyBzcmNfeSAqIHNyY19zdHJpZGUgKyBzcmNfeCAqIGluX2JwcDsKKworICBpZiAoaW5fYWxwaGEgJiYgb3V0X2FscGhhKSB7CisgICAgdyAqPSA0OworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqICs9IDQpIHsKKyAgICAgICAgZGVzdFtqICsgcF9vdXRbMF1dID0gKHNyY1tqICsgcF9pblswXV0gKiBpX2FscGhhKSA+PiA4OworICAgICAgICBkZXN0W2ogKyBwX291dFsxXV0gPSBzcmNbaiArIHBfaW5bMV1dOworICAgICAgICBkZXN0W2ogKyBwX291dFsyXV0gPSBzcmNbaiArIHBfaW5bMl1dOworICAgICAgICBkZXN0W2ogKyBwX291dFszXV0gPSBzcmNbaiArIHBfaW5bM11dOworICAgICAgfQorICAgICAgZGVzdCArPSBkZXN0X3N0cmlkZTsKKyAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIH0KKyAgfSBlbHNlIGlmIChvdXRfYWxwaGEgJiYgIXBhY2tlZF9pbikgeworICAgIHcgKj0gNDsKKyAgICBpX2FscGhhID0gQ0xBTVAgKGlfYWxwaGEsIDAsIDI1NSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgdzsgaiArPSA0KSB7CisgICAgICAgIGRlc3RbaiArIHBfb3V0WzBdXSA9IGlfYWxwaGE7CisgICAgICAgIGRlc3RbaiArIHBfb3V0WzFdXSA9IHNyY1tqICsgcF9pblsxXV07CisgICAgICAgIGRlc3RbaiArIHBfb3V0WzJdXSA9IHNyY1tqICsgcF9pblsyXV07CisgICAgICAgIGRlc3RbaiArIHBfb3V0WzNdXSA9IHNyY1tqICsgcF9pblszXV07CisgICAgICB9CisgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOworICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgfQorICB9IGVsc2UgaWYgKG91dF9hbHBoYSAmJiBwYWNrZWRfaW4pIHsKKyAgICBpX2FscGhhID0gQ0xBTVAgKGlfYWxwaGEsIDAsIDI1NSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgdzsgaisrKSB7CisgICAgICAgIGRlc3RbNCAqIGogKyBwX291dFswXV0gPSBpX2FscGhhOworICAgICAgICBkZXN0WzQgKiBqICsgcF9vdXRbMV1dID0gc3JjW2luX2JwcCAqIGogKyBwX2luWzFdXTsKKyAgICAgICAgZGVzdFs0ICogaiArIHBfb3V0WzJdXSA9IHNyY1tpbl9icHAgKiBqICsgcF9pblsyXV07CisgICAgICAgIGRlc3RbNCAqIGogKyBwX291dFszXV0gPSBzcmNbaW5fYnBwICogaiArIHBfaW5bM11dOworICAgICAgfQorICAgICAgZGVzdCArPSBkZXN0X3N0cmlkZTsKKyAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIH0KKyAgfSBlbHNlIGlmICghcGFja2VkX291dCAmJiAhcGFja2VkX2luKSB7CisgICAgdyAqPSA0OworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqICs9IDQpIHsKKyAgICAgICAgZGVzdFtqICsgcF9vdXRbMV1dID0gc3JjW2ogKyBwX2luWzFdXTsKKyAgICAgICAgZGVzdFtqICsgcF9vdXRbMl1dID0gc3JjW2ogKyBwX2luWzJdXTsKKyAgICAgICAgZGVzdFtqICsgcF9vdXRbM11dID0gc3JjW2ogKyBwX2luWzNdXTsKKyAgICAgIH0KKyAgICAgIGRlc3QgKz0gZGVzdF9zdHJpZGU7CisgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IHc7IGorKykgeworICAgICAgICBkZXN0W291dF9icHAgKiBqICsgcF9vdXRbMV1dID0gc3JjW2luX2JwcCAqIGogKyBwX2luWzFdXTsKKyAgICAgICAgZGVzdFtvdXRfYnBwICogaiArIHBfb3V0WzJdXSA9IHNyY1tpbl9icHAgKiBqICsgcF9pblsyXV07CisgICAgICAgIGRlc3Rbb3V0X2JwcCAqIGogKyBwX291dFszXV0gPSBzcmNbaW5fYnBwICogaiArIHBfaW5bM11dOworICAgICAgfQorICAgICAgZGVzdCArPSBkZXN0X3N0cmlkZTsKKyAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorY29weV9yZ2IzMl9heXV2IChndWludCBpX2FscGhhLCBHc3RWaWRlb0ZyYW1lICogZGVzdF9mcmFtZSwKKyAgICBnYm9vbGVhbiBkZXN0X3NkdHYsIGdpbnQgZGVzdF94LCBnaW50IGRlc3RfeSwgR3N0VmlkZW9GcmFtZSAqIHNyY19mcmFtZSwKKyAgICBnYm9vbGVhbiBzcmNfc2R0diwgZ2ludCBzcmNfeCwgZ2ludCBzcmNfeSwgZ2ludCB3LCBnaW50IGgpCit7CisgIGdpbnQgaSwgajsKKyAgZ2ludCBzcmNfc3RyaWRlLCBkZXN0X3N0cmlkZTsKKyAgZ2Jvb2xlYW4gaW5fYWxwaGE7CisgIGdpbnQgaW5fYnBwOworICBnaW50IHBfaW5bNF07CisgIGdib29sZWFuIHBhY2tlZF9pbjsKKyAgZ2ludCBtYXRyaXhbMTJdOworICBnaW50IGE7CisgIGdpbnQgeSwgdSwgdjsKKyAgZ2ludCByLCBnLCBiOworICBndWludDggKmRlc3QsICpzcmM7CisKKyAgZGVzdF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChkZXN0X2ZyYW1lLCAwKTsKKyAgc3JjX3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKHNyY19mcmFtZSwgMCk7CisgIGluX2JwcCA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BTVFJJREUgKHNyY19mcmFtZSwgMCk7CisgIHBhY2tlZF9pbiA9IChpbl9icHAgPCA0KTsKKworICBpbl9hbHBoYSA9IEdTVF9WSURFT19JTkZPX0hBU19BTFBIQSAoJnNyY19mcmFtZS0+aW5mbyk7CisgIHBfaW5bMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKHNyY19mcmFtZSwgMyk7CisgIHBfaW5bMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKHNyY19mcmFtZSwgMCk7CisgIHBfaW5bMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKHNyY19mcmFtZSwgMSk7CisgIHBfaW5bM10gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKHNyY19mcmFtZSwgMik7CisKKyAgbWVtY3B5IChtYXRyaXgsCisgICAgICAoZGVzdF9zZHR2KSA/IGNvZ19yZ2JfdG9feWNiY3JfbWF0cml4XzhiaXRfc2R0diA6CisgICAgICBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X2hkdHYsIDEyICogc2l6ZW9mIChnaW50KSk7CisKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0X2ZyYW1lLCAwKTsKKyAgZGVzdCA9IGRlc3QgKyBkZXN0X3kgKiBkZXN0X3N0cmlkZSArIGRlc3RfeCAqIDQ7CisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmNfZnJhbWUsIDApOworICBzcmMgPSBzcmMgKyBzcmNfeSAqIHNyY19zdHJpZGUgKyBzcmNfeCAqIGluX2JwcDsKKworICBpZiAoaW5fYWxwaGEpIHsKKyAgICB3ICo9IDQ7CisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IHc7IGogKz0gNCkgeworICAgICAgICBhID0gKHNyY1tqICsgcF9pblswXV0gKiBpX2FscGhhKSA+PiA4OworICAgICAgICByID0gc3JjW2ogKyBwX2luWzFdXTsKKyAgICAgICAgZyA9IHNyY1tqICsgcF9pblsyXV07CisgICAgICAgIGIgPSBzcmNbaiArIHBfaW5bM11dOworCisgICAgICAgIHkgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgciwgZywgYik7CisgICAgICAgIHUgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgciwgZywgYik7CisgICAgICAgIHYgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgciwgZywgYik7CisKKyAgICAgICAgZGVzdFtqICsgMF0gPSBhOworICAgICAgICBkZXN0W2ogKyAxXSA9IENMQU1QICh5LCAwLCAyNTUpOworICAgICAgICBkZXN0W2ogKyAyXSA9IENMQU1QICh1LCAwLCAyNTUpOworICAgICAgICBkZXN0W2ogKyAzXSA9IENMQU1QICh2LCAwLCAyNTUpOworICAgICAgfQorICAgICAgZGVzdCArPSBkZXN0X3N0cmlkZTsKKyAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIH0KKyAgfSBlbHNlIGlmICghcGFja2VkX2luKSB7CisgICAgdyAqPSA0OworICAgIGlfYWxwaGEgPSBDTEFNUCAoaV9hbHBoYSwgMCwgMjU1KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqICs9IDQpIHsKKyAgICAgICAgYSA9IGlfYWxwaGE7CisgICAgICAgIHIgPSBzcmNbaiArIHBfaW5bMV1dOworICAgICAgICBnID0gc3JjW2ogKyBwX2luWzJdXTsKKyAgICAgICAgYiA9IHNyY1tqICsgcF9pblszXV07CisKKyAgICAgICAgeSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAwLCByLCBnLCBiKTsKKyAgICAgICAgdSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCByLCBnLCBiKTsKKyAgICAgICAgdiA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCByLCBnLCBiKTsKKworICAgICAgICBkZXN0W2ogKyAwXSA9IGE7CisgICAgICAgIGRlc3RbaiArIDFdID0gQ0xBTVAgKHksIDAsIDI1NSk7CisgICAgICAgIGRlc3RbaiArIDJdID0gQ0xBTVAgKHUsIDAsIDI1NSk7CisgICAgICAgIGRlc3RbaiArIDNdID0gQ0xBTVAgKHYsIDAsIDI1NSk7CisgICAgICB9CisgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOworICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgfQorICB9IGVsc2UgeworICAgIGlfYWxwaGEgPSBDTEFNUCAoaV9hbHBoYSwgMCwgMjU1KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqKyspIHsKKyAgICAgICAgYSA9IGlfYWxwaGE7CisgICAgICAgIHIgPSBzcmNbaW5fYnBwICogaiArIHBfaW5bMV1dOworICAgICAgICBnID0gc3JjW2luX2JwcCAqIGogKyBwX2luWzJdXTsKKyAgICAgICAgYiA9IHNyY1tpbl9icHAgKiBqICsgcF9pblszXV07CisKKyAgICAgICAgeSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAwLCByLCBnLCBiKTsKKyAgICAgICAgdSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCByLCBnLCBiKTsKKyAgICAgICAgdiA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCByLCBnLCBiKTsKKworICAgICAgICBkZXN0WzQgKiBqICsgMF0gPSBhOworICAgICAgICBkZXN0WzQgKiBqICsgMV0gPSBDTEFNUCAoeSwgMCwgMjU1KTsKKyAgICAgICAgZGVzdFs0ICogaiArIDJdID0gQ0xBTVAgKHUsIDAsIDI1NSk7CisgICAgICAgIGRlc3RbNCAqIGogKyAzXSA9IENMQU1QICh2LCAwLCAyNTUpOworICAgICAgfQorICAgICAgZGVzdCArPSBkZXN0X3N0cmlkZTsKKyAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorY29weV9heXV2X3JnYjMyIChndWludCBpX2FscGhhLCBHc3RWaWRlb0ZyYW1lICogZGVzdF9mcmFtZSwKKyAgICBnYm9vbGVhbiBkZXN0X3NkdHYsIGdpbnQgZGVzdF94LCBnaW50IGRlc3RfeSwgR3N0VmlkZW9GcmFtZSAqIHNyY19mcmFtZSwKKyAgICBnYm9vbGVhbiBzcmNfc2R0diwgZ2ludCBzcmNfeCwgZ2ludCBzcmNfeSwgZ2ludCB3LCBnaW50IGgpCit7CisgIGdpbnQgaSwgajsKKyAgZ2ludCBzcmNfc3RyaWRlLCBkZXN0X3N0cmlkZTsKKyAgZ2Jvb2xlYW4gb3V0X2FscGhhOworICBnaW50IG91dF9icHA7CisgIGdpbnQgcF9vdXRbNF07CisgIGdib29sZWFuIHBhY2tlZF9vdXQ7CisgIGdpbnQgbWF0cml4WzEyXTsKKyAgZ2ludCBhOworICBnaW50IHksIHUsIHY7CisgIGdpbnQgciwgZywgYjsKKyAgZ3VpbnQ4ICpzcmMsICpkZXN0OworCisgIHNyY19zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChzcmNfZnJhbWUsIDApOworICBkZXN0X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGRlc3RfZnJhbWUsIDApOworICBvdXRfYnBwID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUFNUUklERSAoZGVzdF9mcmFtZSwgMCk7CisgIHBhY2tlZF9vdXQgPSAob3V0X2JwcCA8IDQpOworCisgIG91dF9hbHBoYSA9IEdTVF9WSURFT19JTkZPX0hBU19BTFBIQSAoJmRlc3RfZnJhbWUtPmluZm8pOworICBwX291dFswXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX09GRlNFVCAoZGVzdF9mcmFtZSwgMyk7CisgIHBfb3V0WzFdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfT0ZGU0VUIChkZXN0X2ZyYW1lLCAwKTsKKyAgcF9vdXRbMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKGRlc3RfZnJhbWUsIDEpOworICBwX291dFszXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX09GRlNFVCAoZGVzdF9mcmFtZSwgMik7CisKKyAgbWVtY3B5IChtYXRyaXgsCisgICAgICAoc3JjX3NkdHYpID8gY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9zZHR2IDoKKyAgICAgIGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfaGR0diwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3RfZnJhbWUsIDApOworICBkZXN0ID0gZGVzdCArIGRlc3RfeSAqIGRlc3Rfc3RyaWRlICsgZGVzdF94ICogb3V0X2JwcDsKKyAgc3JjID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyY19mcmFtZSwgMCk7CisgIHNyYyA9IHNyYyArIHNyY195ICogc3JjX3N0cmlkZSArIHNyY194ICogNDsKKworICBpZiAob3V0X2FscGhhKSB7CisgICAgdyAqPSA0OworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqICs9IDQpIHsKKyAgICAgICAgYSA9IChzcmNbaiArIDBdICogaV9hbHBoYSkgPj4gODsKKyAgICAgICAgeSA9IHNyY1tqICsgMV07CisgICAgICAgIHUgPSBzcmNbaiArIDJdOworICAgICAgICB2ID0gc3JjW2ogKyAzXTsKKworICAgICAgICByID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHksIHUsIHYpOworICAgICAgICBnID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHksIHUsIHYpOworICAgICAgICBiID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHksIHUsIHYpOworCisgICAgICAgIGRlc3RbaiArIHBfb3V0WzBdXSA9IGE7CisgICAgICAgIGRlc3RbaiArIHBfb3V0WzFdXSA9IENMQU1QIChyLCAwLCAyNTUpOworICAgICAgICBkZXN0W2ogKyBwX291dFsyXV0gPSBDTEFNUCAoZywgMCwgMjU1KTsKKyAgICAgICAgZGVzdFtqICsgcF9vdXRbM11dID0gQ0xBTVAgKGIsIDAsIDI1NSk7CisgICAgICB9CisgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOworICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgfQorICB9IGVsc2UgaWYgKCFwYWNrZWRfb3V0KSB7CisgICAgdyAqPSA0OworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqICs9IDQpIHsKKyAgICAgICAgeSA9IHNyY1tqICsgMV07CisgICAgICAgIHUgPSBzcmNbaiArIDJdOworICAgICAgICB2ID0gc3JjW2ogKyAzXTsKKworICAgICAgICByID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHksIHUsIHYpOworICAgICAgICBnID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHksIHUsIHYpOworICAgICAgICBiID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHksIHUsIHYpOworCisgICAgICAgIGRlc3RbaiArIHBfb3V0WzFdXSA9IENMQU1QIChyLCAwLCAyNTUpOworICAgICAgICBkZXN0W2ogKyBwX291dFsyXV0gPSBDTEFNUCAoZywgMCwgMjU1KTsKKyAgICAgICAgZGVzdFtqICsgcF9vdXRbM11dID0gQ0xBTVAgKGIsIDAsIDI1NSk7CisgICAgICB9CisgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOworICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqKyspIHsKKyAgICAgICAgeSA9IHNyY1s0ICogaiArIDFdOworICAgICAgICB1ID0gc3JjWzQgKiBqICsgMl07CisgICAgICAgIHYgPSBzcmNbNCAqIGogKyAzXTsKKworICAgICAgICByID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHksIHUsIHYpOworICAgICAgICBnID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHksIHUsIHYpOworICAgICAgICBiID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHksIHUsIHYpOworCisgICAgICAgIGRlc3Rbb3V0X2JwcCAqIGogKyBwX291dFsxXV0gPSBDTEFNUCAociwgMCwgMjU1KTsKKyAgICAgICAgZGVzdFtvdXRfYnBwICogaiArIHBfb3V0WzJdXSA9IENMQU1QIChnLCAwLCAyNTUpOworICAgICAgICBkZXN0W291dF9icHAgKiBqICsgcF9vdXRbM11dID0gQ0xBTVAgKGIsIDAsIDI1NSk7CisgICAgICB9CisgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOworICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitmaWxsX2dyYXkgKEdzdFZpZGVvQm94RmlsbCBmaWxsX3R5cGUsIGd1aW50IGJfYWxwaGEsCisgICAgR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBnYm9vbGVhbiBzZHR2KQoreworICBnaW50IGksIGo7CisgIGdpbnQgZGVzdF9zdHJpZGU7CisgIGd1aW50OCAqZGVzdDsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBHc3RWaWRlb0Zvcm1hdCBmb3JtYXQ7CisKKyAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZSQU1FX0ZPUk1BVCAoZnJhbWUpOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChmcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGZyYW1lKTsKKworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZyYW1lLCAwKTsKKyAgZGVzdF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChmcmFtZSwgMCk7CisKKyAgaWYgKGZvcm1hdCA9PSBHU1RfVklERU9fRk9STUFUX0dSQVk4KSB7CisgICAgZ3VpbnQ4IHZhbCA9IHl1dl9zZHR2X2NvbG9yc19ZW2ZpbGxfdHlwZV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgIG1lbXNldCAoZGVzdCwgdmFsLCB3aWR0aCk7CisgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBndWludDE2IHZhbCA9IHl1dl9zZHR2X2NvbG9yc19ZW2ZpbGxfdHlwZV0gPDwgODsKKworICAgIGlmIChmb3JtYXQgPT0gR1NUX1ZJREVPX0ZPUk1BVF9HUkFZMTZfQkUpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICAgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRlc3QgKyAyICogaiwgdmFsKTsKKyAgICAgICAgfQorICAgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICBHU1RfV1JJVEVfVUlOVDE2X0xFIChkZXN0ICsgMiAqIGosIHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgZGVzdCArPSBkZXN0X3N0cmlkZTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NvcHlfcGFja2VkX3NpbXBsZSAoZ3VpbnQgaV9hbHBoYSwgR3N0VmlkZW9GcmFtZSAqIGRlc3RfZnJhbWUsCisgICAgZ2Jvb2xlYW4gZGVzdF9zZHR2LCBnaW50IGRlc3RfeCwgZ2ludCBkZXN0X3ksIEdzdFZpZGVvRnJhbWUgKiBzcmNfZnJhbWUsCisgICAgZ2Jvb2xlYW4gc3JjX3NkdHYsIGdpbnQgc3JjX3gsIGdpbnQgc3JjX3ksIGdpbnQgdywgZ2ludCBoKQoreworICBnaW50IGk7CisgIGdpbnQgc3JjX3N0cmlkZSwgZGVzdF9zdHJpZGU7CisgIGdpbnQgcGl4ZWxfc3RyaWRlLCByb3dfc2l6ZTsKKyAgZ3VpbnQ4ICpzcmMsICpkZXN0OworCisgIHNyY19zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChzcmNfZnJhbWUsIDApOworICBkZXN0X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGRlc3RfZnJhbWUsIDApOworICBwaXhlbF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFIChkZXN0X2ZyYW1lLCAwKTsKKyAgcm93X3NpemUgPSB3ICogcGl4ZWxfc3RyaWRlOworCisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdF9mcmFtZSwgMCk7CisgIGRlc3QgPSBkZXN0ICsgZGVzdF95ICogZGVzdF9zdHJpZGUgKyBkZXN0X3ggKiBwaXhlbF9zdHJpZGU7CisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmNfZnJhbWUsIDApOworICBzcmMgPSBzcmMgKyBzcmNfeSAqIHNyY19zdHJpZGUgKyBzcmNfeCAqIHBpeGVsX3N0cmlkZTsKKworICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgbWVtY3B5IChkZXN0LCBzcmMsIHJvd19zaXplKTsKKyAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOworICAgIHNyYyArPSBzcmNfc3RyaWRlOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitmaWxsX3l1eTIgKEdzdFZpZGVvQm94RmlsbCBmaWxsX3R5cGUsIGd1aW50IGJfYWxwaGEsCisgICAgR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBnYm9vbGVhbiBzZHR2KQoreworICBndWludDggeSwgdSwgdjsKKyAgZ2ludCBpLCBqOworICBnaW50IHN0cmlkZTsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBndWludDggKmRlc3Q7CisgIEdzdFZpZGVvRm9ybWF0IGZvcm1hdDsKKworICBmb3JtYXQgPSBHU1RfVklERU9fRlJBTUVfRk9STUFUIChmcmFtZSk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoZnJhbWUpOworCisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZnJhbWUsIDApOworICBzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChmcmFtZSwgMCk7CisKKyAgeSA9IChzZHR2KSA/IHl1dl9zZHR2X2NvbG9yc19ZW2ZpbGxfdHlwZV0gOiB5dXZfaGR0dl9jb2xvcnNfWVtmaWxsX3R5cGVdOworICB1ID0gKHNkdHYpID8geXV2X3NkdHZfY29sb3JzX1VbZmlsbF90eXBlXSA6IHl1dl9oZHR2X2NvbG9yc19VW2ZpbGxfdHlwZV07CisgIHYgPSAoc2R0dikgPyB5dXZfc2R0dl9jb2xvcnNfVltmaWxsX3R5cGVdIDogeXV2X2hkdHZfY29sb3JzX1ZbZmlsbF90eXBlXTsKKworICB3aWR0aCA9IHdpZHRoICsgKHdpZHRoICUgMik7CisKKyAgaWYgKGZvcm1hdCA9PSBHU1RfVklERU9fRk9STUFUX1lVWTIpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaiArPSAyKSB7CisgICAgICAgIGRlc3RbaiAqIDIgKyAwXSA9IHk7CisgICAgICAgIGRlc3RbaiAqIDIgKyAxXSA9IHU7CisgICAgICAgIGRlc3RbaiAqIDIgKyAyXSA9IHk7CisgICAgICAgIGRlc3RbaiAqIDIgKyAzXSA9IHY7CisgICAgICB9CisKKyAgICAgIGRlc3QgKz0gc3RyaWRlOworICAgIH0KKyAgfSBlbHNlIGlmIChmb3JtYXQgPT0gR1NUX1ZJREVPX0ZPUk1BVF9ZVllVKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGogKz0gMikgeworICAgICAgICBkZXN0W2ogKiAyICsgMF0gPSB5OworICAgICAgICBkZXN0W2ogKiAyICsgMV0gPSB2OworICAgICAgICBkZXN0W2ogKiAyICsgMl0gPSB5OworICAgICAgICBkZXN0W2ogKiAyICsgM10gPSB1OworICAgICAgfQorCisgICAgICBkZXN0ICs9IHN0cmlkZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGogKz0gMikgeworICAgICAgICBkZXN0W2ogKiAyICsgMF0gPSB1OworICAgICAgICBkZXN0W2ogKiAyICsgMV0gPSB5OworICAgICAgICBkZXN0W2ogKiAyICsgMl0gPSB2OworICAgICAgICBkZXN0W2ogKiAyICsgM10gPSB5OworICAgICAgfQorCisgICAgICBkZXN0ICs9IHN0cmlkZTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NvcHlfeXV5Ml95dXkyIChndWludCBpX2FscGhhLCBHc3RWaWRlb0ZyYW1lICogZGVzdF9mcmFtZSwKKyAgICBnYm9vbGVhbiBkZXN0X3NkdHYsIGdpbnQgZGVzdF94LCBnaW50IGRlc3RfeSwgR3N0VmlkZW9GcmFtZSAqIHNyY19mcmFtZSwKKyAgICBnYm9vbGVhbiBzcmNfc2R0diwgZ2ludCBzcmNfeCwgZ2ludCBzcmNfeSwgZ2ludCB3LCBnaW50IGgpCit7CisgIGdpbnQgaSwgajsKKyAgZ2ludCBzcmNfc3RyaWRlLCBkZXN0X3N0cmlkZTsKKyAgZ3VpbnQ4ICpzcmMsICpkZXN0OworICBHc3RWaWRlb0Zvcm1hdCBzcmNfZm9ybWF0OworCisgIHNyY19mb3JtYXQgPSBHU1RfVklERU9fRlJBTUVfRk9STUFUIChzcmNfZnJhbWUpOworCisgIHNyY19zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChzcmNfZnJhbWUsIDApOworICBkZXN0X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGRlc3RfZnJhbWUsIDApOworCisgIGRlc3RfeCA9IChkZXN0X3ggJiB+MSk7CisgIHNyY194ID0gKHNyY194ICYgfjEpOworCisgIHcgPSB3ICsgKHcgJSAyKTsKKworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3RfZnJhbWUsIDApOworICBkZXN0ID0gZGVzdCArIGRlc3RfeSAqIGRlc3Rfc3RyaWRlICsgZGVzdF94ICogMjsKKyAgc3JjID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyY19mcmFtZSwgMCk7CisgIHNyYyA9IHNyYyArIHNyY195ICogc3JjX3N0cmlkZSArIHNyY194ICogMjsKKworICBpZiAoc3JjX3NkdHYgIT0gZGVzdF9zZHR2KSB7CisgICAgZ2ludCB5MSwgdTEsIHYxOworICAgIGdpbnQgeTIsIHUyLCB2MjsKKyAgICBnaW50IG1hdHJpeFsxMl07CisKKyAgICBtZW1jcHkgKG1hdHJpeCwKKyAgICAgICAgZGVzdF9zZHR2ID8gY29nX3ljYmNyX2hkdHZfdG9feWNiY3Jfc2R0dl9tYXRyaXhfOGJpdCA6CisgICAgICAgIGNvZ195Y2Jjcl9zZHR2X3RvX3ljYmNyX2hkdHZfbWF0cml4XzhiaXQsIDEyICogc2l6ZW9mIChnaW50KSk7CisKKyAgICBpZiAoc3JjX2Zvcm1hdCA9PSBHU1RfVklERU9fRk9STUFUX1lVWTIpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHc7IGogKz0gMikgeworICAgICAgICAgIHkxID0gc3JjW2ogKiAyICsgMF07CisgICAgICAgICAgeTIgPSBzcmNbaiAqIDIgKyAyXTsKKyAgICAgICAgICB1MSA9IHUyID0gc3JjW2ogKiAyICsgMV07CisgICAgICAgICAgdjEgPSB2MiA9IHNyY1tqICogMiArIDNdOworCisgICAgICAgICAgZGVzdFtqICogMiArIDBdID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpOworICAgICAgICAgIGRlc3RbaiAqIDIgKyAxXSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKTsKKyAgICAgICAgICBkZXN0W2ogKiAyICsgMl0gPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUyLCB2Mik7CisgICAgICAgICAgZGVzdFtqICogMiArIDNdID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkyLCB1MiwgdjIpOworICAgICAgICB9CisgICAgICAgIGRlc3QgKz0gZGVzdF9zdHJpZGU7CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3JjX2Zvcm1hdCA9PSBHU1RfVklERU9fRk9STUFUX1lWWVUpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHc7IGogKz0gMikgeworICAgICAgICAgIHkxID0gc3JjW2ogKiAyICsgMF07CisgICAgICAgICAgeTIgPSBzcmNbaiAqIDIgKyAyXTsKKyAgICAgICAgICB2MSA9IHYyID0gc3JjW2ogKiAyICsgMV07CisgICAgICAgICAgdTEgPSB1MiA9IHNyY1tqICogMiArIDNdOworCisgICAgICAgICAgZGVzdFtqICogMiArIDBdID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpOworICAgICAgICAgIGRlc3RbaiAqIDIgKyAxXSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsIHYxKTsKKyAgICAgICAgICBkZXN0W2ogKiAyICsgMl0gPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUyLCB2Mik7CisgICAgICAgICAgZGVzdFtqICogMiArIDNdID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkyLCB1MiwgdjIpOworICAgICAgICB9CisgICAgICAgIGRlc3QgKz0gZGVzdF9zdHJpZGU7CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqICs9IDIpIHsKKyAgICAgICAgICB1MSA9IHUyID0gc3JjW2ogKiAyICsgMF07CisgICAgICAgICAgdjEgPSB2MiA9IHNyY1tqICogMiArIDJdOworICAgICAgICAgIHkxID0gc3JjW2ogKiAyICsgMV07CisgICAgICAgICAgeTIgPSBzcmNbaiAqIDIgKyAzXTsKKworICAgICAgICAgIGRlc3RbaiAqIDIgKyAxXSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKTsKKyAgICAgICAgICBkZXN0W2ogKiAyICsgMF0gPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSk7CisgICAgICAgICAgZGVzdFtqICogMiArIDNdID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MiwgdjIpOworICAgICAgICAgIGRlc3RbaiAqIDIgKyAyXSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwgdTIsIHYyKTsKKyAgICAgICAgfQorICAgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOworICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgbWVtY3B5IChkZXN0LCBzcmMsIHcgKiAyKTsKKyAgICAgIGRlc3QgKz0gZGVzdF9zdHJpZGU7CisgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICB9CisgIH0KK30KKworI2RlZmluZSBERUZBVUxUX0xFRlQgICAgICAwCisjZGVmaW5lIERFRkFVTFRfUklHSFQgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9UT1AgICAgICAgMAorI2RlZmluZSBERUZBVUxUX0JPVFRPTSAgICAwCisjZGVmaW5lIERFRkFVTFRfRklMTF9UWVBFIFZJREVPX0JPWF9GSUxMX0JMQUNLCisjZGVmaW5lIERFRkFVTFRfQUxQSEEgICAgIDEuMAorI2RlZmluZSBERUZBVUxUX0JPUkRFUl9BTFBIQSAxLjAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTEVGVCwKKyAgUFJPUF9SSUdIVCwKKyAgUFJPUF9UT1AsCisgIFBST1BfQk9UVE9NLAorICBQUk9QX0ZJTExfVFlQRSwKKyAgUFJPUF9BTFBIQSwKKyAgUFJPUF9CT1JERVJfQUxQSEEsCisgIFBST1BfQVVUT0NST1AKKyAgICAgIC8qIEZJTEwgTUUgKi8KK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfdmlkZW9fYm94X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBBWVVWLCAiCisgICAgICAgICAgICAiQVJHQiwgQkdSQSwgQUJHUiwgUkdCQSwgeFJHQiwgQkdSeCwgeEJHUiwgUkdCeCwgUkdCLCBCR1IsICIKKyAgICAgICAgICAgICJZNDQ0LCBZNDJCLCBZVVkyLCBZVllVLCBVWVZZLCBJNDIwLCBZVjEyLCBZNDFCLCAiCisgICAgICAgICAgICAiR1JBWTgsIEdSQVkxNl9CRSwgR1JBWTE2X0xFIH0gIikpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF92aWRlb19ib3hfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IEFZVVYsICIKKyAgICAgICAgICAgICJBUkdCLCBCR1JBLCBBQkdSLCBSR0JBLCB4UkdCLCBCR1J4LCB4QkdSLCBSR0J4LCBSR0IsIEJHUiwgIgorICAgICAgICAgICAgIlk0NDQsIFk0MkIsIFlVWTIsIFlWWVUsIFVZVlksIEk0MjAsIFlWMTIsIFk0MUIsICIKKyAgICAgICAgICAgICJHUkFZOCwgR1JBWTE2X0JFLCBHUkFZMTZfTEUgfSAiKSkKKyAgICApOworCisjZGVmaW5lIGdzdF92aWRlb19ib3hfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0VmlkZW9Cb3gsIGdzdF92aWRlb19ib3gsIEdTVF9UWVBFX1ZJREVPX0ZJTFRFUik7CisKK3N0YXRpYyB2b2lkIGdzdF92aWRlb19ib3hfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3ZpZGVvX2JveF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdmlkZW9fYm94X3JlY2FsY190cmFuc2Zvcm0gKEdzdFZpZGVvQm94ICogdmlkZW9fYm94KTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfdmlkZW9fYm94X3RyYW5zZm9ybV9jYXBzIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0UGFkRGlyZWN0aW9uIGRpcmVjdGlvbiwgR3N0Q2FwcyAqIGZyb20sIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIHZvaWQgZ3N0X3ZpZGVvX2JveF9iZWZvcmVfdHJhbnNmb3JtIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0QnVmZmVyICogaW4pOworc3RhdGljIGdib29sZWFuIGdzdF92aWRlb19ib3hfc3JjX2V2ZW50IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdmlkZW9fYm94X3NldF9pbmZvIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsIEdzdENhcHMgKiBpbiwKKyAgICBHc3RWaWRlb0luZm8gKiBpbl9pbmZvLCBHc3RDYXBzICogb3V0LCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfdmlkZW9fYm94X3RyYW5zZm9ybV9mcmFtZSAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLAorICAgIEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSk7CisKKyNkZWZpbmUgR1NUX1RZUEVfVklERU9fQk9YX0ZJTEwgKGdzdF92aWRlb19ib3hfZmlsbF9nZXRfdHlwZSgpKQorc3RhdGljIEdUeXBlCitnc3RfdmlkZW9fYm94X2ZpbGxfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSB2aWRlb19ib3hfZmlsbF90eXBlID0gMDsKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmlkZW9fYm94X2ZpbGxbXSA9IHsKKyAgICB7VklERU9fQk9YX0ZJTExfQkxBQ0ssICJCbGFjayIsICJibGFjayJ9LAorICAgIHtWSURFT19CT1hfRklMTF9HUkVFTiwgIkdyZWVuIiwgImdyZWVuIn0sCisgICAge1ZJREVPX0JPWF9GSUxMX0JMVUUsICJCbHVlIiwgImJsdWUifSwKKyAgICB7VklERU9fQk9YX0ZJTExfUkVELCAiUmVkIiwgInJlZCJ9LAorICAgIHtWSURFT19CT1hfRklMTF9ZRUxMT1csICJZZWxsb3ciLCAieWVsbG93In0sCisgICAge1ZJREVPX0JPWF9GSUxMX1dISVRFLCAiV2hpdGUiLCAid2hpdGUifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0sCisgIH07CisKKyAgaWYgKCF2aWRlb19ib3hfZmlsbF90eXBlKSB7CisgICAgdmlkZW9fYm94X2ZpbGxfdHlwZSA9CisgICAgICAgIGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RWaWRlb0JveEZpbGwiLCB2aWRlb19ib3hfZmlsbCk7CisgIH0KKyAgcmV0dXJuIHZpZGVvX2JveF9maWxsX3R5cGU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fYm94X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RWaWRlb0JveCAqdmlkZW9fYm94ID0gR1NUX1ZJREVPX0JPWCAob2JqZWN0KTsKKworICBnX211dGV4X2NsZWFyICgmdmlkZW9fYm94LT5tdXRleCk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2JveF9jbGFzc19pbml0IChHc3RWaWRlb0JveENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikgKGtsYXNzKTsKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzICp0cmFuc19jbGFzcyA9IChHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKikga2xhc3M7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgKnZmaWx0ZXJfY2xhc3MgPSAoR3N0VmlkZW9GaWx0ZXJDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdmlkZW9fYm94X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3ZpZGVvX2JveF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3ZpZGVvX2JveF9maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0ZJTExfVFlQRSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgiZmlsbCIsICJGaWxsIiwgIkhvdyB0byBmaWxsIHRoZSBib3JkZXJzIiwKKyAgICAgICAgICBHU1RfVFlQRV9WSURFT19CT1hfRklMTCwgREVGQVVMVF9GSUxMX1RZUEUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSkpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0xFRlQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgibGVmdCIsICJMZWZ0IiwKKyAgICAgICAgICAiUGl4ZWxzIHRvIGJveCBhdCBsZWZ0ICg8MCAgPSBhZGQgYSBib3JkZXIpIiwgR19NSU5JTlQsIEdfTUFYSU5ULAorICAgICAgICAgIERFRkFVTFRfTEVGVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfUklHSFQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicmlnaHQiLCAiUmlnaHQiLAorICAgICAgICAgICJQaXhlbHMgdG8gYm94IGF0IHJpZ2h0ICg8MCA9IGFkZCBhIGJvcmRlcikiLCBHX01JTklOVCwgR19NQVhJTlQsCisgICAgICAgICAgREVGQVVMVF9SSUdIVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfVE9QLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInRvcCIsICJUb3AiLAorICAgICAgICAgICJQaXhlbHMgdG8gYm94IGF0IHRvcCAoPDAgPSBhZGQgYSBib3JkZXIpIiwgR19NSU5JTlQsIEdfTUFYSU5ULAorICAgICAgICAgIERFRkFVTFRfVE9QLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9CT1RUT00sCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiYm90dG9tIiwgIkJvdHRvbSIsCisgICAgICAgICAgIlBpeGVscyB0byBib3ggYXQgYm90dG9tICg8MCA9IGFkZCBhIGJvcmRlcikiLCBHX01JTklOVCwgR19NQVhJTlQsCisgICAgICAgICAgREVGQVVMVF9CT1RUT00sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSkpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0FMUEhBLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoImFscGhhIiwgIkFscGhhIiwgIkFscGhhIHZhbHVlIHBpY3R1cmUiLCAwLjAsIDEuMCwKKyAgICAgICAgICBERUZBVUxUX0FMUEhBLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9CT1JERVJfQUxQSEEsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYm9yZGVyLWFscGhhIiwgIkJvcmRlciBBbHBoYSIsCisgICAgICAgICAgIkFscGhhIHZhbHVlIG9mIHRoZSBib3JkZXIiLCAwLjAsIDEuMCwgREVGQVVMVF9CT1JERVJfQUxQSEEsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSkpOworICAvKioKKyAgICogR3N0VmlkZW9Cb3g6YXV0b2Nyb3A6CisgICAqCisgICAqIElmIHNldCB0byAlVFJVRSB2aWRlb2JveCB3aWxsIGF1dG9tYXRpY2FsbHkgY3JvcC9wYWQgdGhlIGlucHV0CisgICAqIHZpZGVvIHRvIGJlIGNlbnRlcmVkIGluIHRoZSBvdXRwdXQuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0FVVE9DUk9QLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJhdXRvY3JvcCIsICJBdXRvIGNyb3AiLAorICAgICAgICAgICJBdXRvIGNyb3AiLCBGQUxTRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgdHJhbnNfY2xhc3MtPmJlZm9yZV90cmFuc2Zvcm0gPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19ib3hfYmVmb3JlX3RyYW5zZm9ybSk7CisgIHRyYW5zX2NsYXNzLT50cmFuc2Zvcm1fY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3ZpZGVvX2JveF90cmFuc2Zvcm1fY2Fwcyk7CisgIHRyYW5zX2NsYXNzLT5zcmNfZXZlbnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3ZpZGVvX2JveF9zcmNfZXZlbnQpOworCisgIHZmaWx0ZXJfY2xhc3MtPnNldF9pbmZvID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19ib3hfc2V0X2luZm8pOworICB2ZmlsdGVyX2NsYXNzLT50cmFuc2Zvcm1fZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19ib3hfdHJhbnNmb3JtX2ZyYW1lKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiVmlkZW8gYm94IGZpbHRlciIsCisgICAgICAiRmlsdGVyL0VmZmVjdC9WaWRlbyIsCisgICAgICAiUmVzaXplcyBhIHZpZGVvIGJ5IGFkZGluZyBib3JkZXJzIG9yIGNyb3BwaW5nIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF92aWRlb19ib3hfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF92aWRlb19ib3hfc3JjX3RlbXBsYXRlKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19ib3hfaW5pdCAoR3N0VmlkZW9Cb3ggKiB2aWRlb19ib3gpCit7CisgIHZpZGVvX2JveC0+Ym94X3JpZ2h0ID0gREVGQVVMVF9SSUdIVDsKKyAgdmlkZW9fYm94LT5ib3hfbGVmdCA9IERFRkFVTFRfTEVGVDsKKyAgdmlkZW9fYm94LT5ib3hfdG9wID0gREVGQVVMVF9UT1A7CisgIHZpZGVvX2JveC0+Ym94X2JvdHRvbSA9IERFRkFVTFRfQk9UVE9NOworICB2aWRlb19ib3gtPmNyb3BfcmlnaHQgPSAwOworICB2aWRlb19ib3gtPmNyb3BfbGVmdCA9IDA7CisgIHZpZGVvX2JveC0+Y3JvcF90b3AgPSAwOworICB2aWRlb19ib3gtPmNyb3BfYm90dG9tID0gMDsKKyAgdmlkZW9fYm94LT5maWxsX3R5cGUgPSBERUZBVUxUX0ZJTExfVFlQRTsKKyAgdmlkZW9fYm94LT5hbHBoYSA9IERFRkFVTFRfQUxQSEE7CisgIHZpZGVvX2JveC0+Ym9yZGVyX2FscGhhID0gREVGQVVMVF9CT1JERVJfQUxQSEE7CisgIHZpZGVvX2JveC0+YXV0b2Nyb3AgPSBGQUxTRTsKKworICBnX211dGV4X2luaXQgKCZ2aWRlb19ib3gtPm11dGV4KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19ib3hfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFZpZGVvQm94ICp2aWRlb19ib3ggPSBHU1RfVklERU9fQk9YIChvYmplY3QpOworCisgIGdfbXV0ZXhfbG9jayAoJnZpZGVvX2JveC0+bXV0ZXgpOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTEVGVDoKKyAgICAgIHZpZGVvX2JveC0+Ym94X2xlZnQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGlmICh2aWRlb19ib3gtPmJveF9sZWZ0IDwgMCkgeworICAgICAgICB2aWRlb19ib3gtPmJvcmRlcl9sZWZ0ID0gLXZpZGVvX2JveC0+Ym94X2xlZnQ7CisgICAgICAgIHZpZGVvX2JveC0+Y3JvcF9sZWZ0ID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZpZGVvX2JveC0+Ym9yZGVyX2xlZnQgPSAwOworICAgICAgICB2aWRlb19ib3gtPmNyb3BfbGVmdCA9IHZpZGVvX2JveC0+Ym94X2xlZnQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUklHSFQ6CisgICAgICB2aWRlb19ib3gtPmJveF9yaWdodCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgaWYgKHZpZGVvX2JveC0+Ym94X3JpZ2h0IDwgMCkgeworICAgICAgICB2aWRlb19ib3gtPmJvcmRlcl9yaWdodCA9IC12aWRlb19ib3gtPmJveF9yaWdodDsKKyAgICAgICAgdmlkZW9fYm94LT5jcm9wX3JpZ2h0ID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZpZGVvX2JveC0+Ym9yZGVyX3JpZ2h0ID0gMDsKKyAgICAgICAgdmlkZW9fYm94LT5jcm9wX3JpZ2h0ID0gdmlkZW9fYm94LT5ib3hfcmlnaHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVE9QOgorICAgICAgdmlkZW9fYm94LT5ib3hfdG9wID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBpZiAodmlkZW9fYm94LT5ib3hfdG9wIDwgMCkgeworICAgICAgICB2aWRlb19ib3gtPmJvcmRlcl90b3AgPSAtdmlkZW9fYm94LT5ib3hfdG9wOworICAgICAgICB2aWRlb19ib3gtPmNyb3BfdG9wID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZpZGVvX2JveC0+Ym9yZGVyX3RvcCA9IDA7CisgICAgICAgIHZpZGVvX2JveC0+Y3JvcF90b3AgPSB2aWRlb19ib3gtPmJveF90b3A7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQk9UVE9NOgorICAgICAgdmlkZW9fYm94LT5ib3hfYm90dG9tID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBpZiAodmlkZW9fYm94LT5ib3hfYm90dG9tIDwgMCkgeworICAgICAgICB2aWRlb19ib3gtPmJvcmRlcl9ib3R0b20gPSAtdmlkZW9fYm94LT5ib3hfYm90dG9tOworICAgICAgICB2aWRlb19ib3gtPmNyb3BfYm90dG9tID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZpZGVvX2JveC0+Ym9yZGVyX2JvdHRvbSA9IDA7CisgICAgICAgIHZpZGVvX2JveC0+Y3JvcF9ib3R0b20gPSB2aWRlb19ib3gtPmJveF9ib3R0b207CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRklMTF9UWVBFOgorICAgICAgdmlkZW9fYm94LT5maWxsX3R5cGUgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQUxQSEE6CisgICAgICB2aWRlb19ib3gtPmFscGhhID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQk9SREVSX0FMUEhBOgorICAgICAgdmlkZW9fYm94LT5ib3JkZXJfYWxwaGEgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9BVVRPQ1JPUDoKKyAgICAgIHZpZGVvX2JveC0+YXV0b2Nyb3AgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisgIGdzdF92aWRlb19ib3hfcmVjYWxjX3RyYW5zZm9ybSAodmlkZW9fYm94KTsKKworICBHU1RfREVCVUdfT0JKRUNUICh2aWRlb19ib3gsICJDYWxsaW5nIHJlY29uZmlndXJlIik7CisgIGdzdF9iYXNlX3RyYW5zZm9ybV9yZWNvbmZpZ3VyZV9zcmMgKEdTVF9CQVNFX1RSQU5TRk9STV9DQVNUICh2aWRlb19ib3gpKTsKKworICBnX211dGV4X3VubG9jayAoJnZpZGVvX2JveC0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2JveF9hdXRvY3JvcCAoR3N0VmlkZW9Cb3ggKiB2aWRlb19ib3gpCit7CisgIGdpbnQgY3JvcF93ID0gdmlkZW9fYm94LT5pbl93aWR0aCAtIHZpZGVvX2JveC0+b3V0X3dpZHRoOworICBnaW50IGNyb3BfaCA9IHZpZGVvX2JveC0+aW5faGVpZ2h0IC0gdmlkZW9fYm94LT5vdXRfaGVpZ2h0OworCisgIHZpZGVvX2JveC0+Ym94X2xlZnQgPSBjcm9wX3cgLyAyOworICBpZiAodmlkZW9fYm94LT5ib3hfbGVmdCA8IDApIHsKKyAgICB2aWRlb19ib3gtPmJvcmRlcl9sZWZ0ID0gLXZpZGVvX2JveC0+Ym94X2xlZnQ7CisgICAgdmlkZW9fYm94LT5jcm9wX2xlZnQgPSAwOworICB9IGVsc2UgeworICAgIHZpZGVvX2JveC0+Ym9yZGVyX2xlZnQgPSAwOworICAgIHZpZGVvX2JveC0+Y3JvcF9sZWZ0ID0gdmlkZW9fYm94LT5ib3hfbGVmdDsKKyAgfQorCisgIC8qIFJvdW5kIGRvd24vdXAgZm9yIG9kZCB3aWR0aCBkaWZmZXJlbmNlcyAqLworICBpZiAoY3JvcF93IDwgMCkKKyAgICBjcm9wX3cgLT0gMTsKKyAgZWxzZQorICAgIGNyb3BfdyArPSAxOworCisgIHZpZGVvX2JveC0+Ym94X3JpZ2h0ID0gY3JvcF93IC8gMjsKKyAgaWYgKHZpZGVvX2JveC0+Ym94X3JpZ2h0IDwgMCkgeworICAgIHZpZGVvX2JveC0+Ym9yZGVyX3JpZ2h0ID0gLXZpZGVvX2JveC0+Ym94X3JpZ2h0OworICAgIHZpZGVvX2JveC0+Y3JvcF9yaWdodCA9IDA7CisgIH0gZWxzZSB7CisgICAgdmlkZW9fYm94LT5ib3JkZXJfcmlnaHQgPSAwOworICAgIHZpZGVvX2JveC0+Y3JvcF9yaWdodCA9IHZpZGVvX2JveC0+Ym94X3JpZ2h0OworICB9CisKKyAgdmlkZW9fYm94LT5ib3hfdG9wID0gY3JvcF9oIC8gMjsKKyAgaWYgKHZpZGVvX2JveC0+Ym94X3RvcCA8IDApIHsKKyAgICB2aWRlb19ib3gtPmJvcmRlcl90b3AgPSAtdmlkZW9fYm94LT5ib3hfdG9wOworICAgIHZpZGVvX2JveC0+Y3JvcF90b3AgPSAwOworICB9IGVsc2UgeworICAgIHZpZGVvX2JveC0+Ym9yZGVyX3RvcCA9IDA7CisgICAgdmlkZW9fYm94LT5jcm9wX3RvcCA9IHZpZGVvX2JveC0+Ym94X3RvcDsKKyAgfQorCisgIC8qIFJvdW5kIGRvd24vdXAgZm9yIG9kZCBoZWlnaHQgZGlmZmVyZW5jZXMgKi8KKyAgaWYgKGNyb3BfaCA8IDApCisgICAgY3JvcF9oIC09IDE7CisgIGVsc2UKKyAgICBjcm9wX2ggKz0gMTsKKyAgdmlkZW9fYm94LT5ib3hfYm90dG9tID0gY3JvcF9oIC8gMjsKKworICBpZiAodmlkZW9fYm94LT5ib3hfYm90dG9tIDwgMCkgeworICAgIHZpZGVvX2JveC0+Ym9yZGVyX2JvdHRvbSA9IC12aWRlb19ib3gtPmJveF9ib3R0b207CisgICAgdmlkZW9fYm94LT5jcm9wX2JvdHRvbSA9IDA7CisgIH0gZWxzZSB7CisgICAgdmlkZW9fYm94LT5ib3JkZXJfYm90dG9tID0gMDsKKyAgICB2aWRlb19ib3gtPmNyb3BfYm90dG9tID0gdmlkZW9fYm94LT5ib3hfYm90dG9tOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fYm94X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWaWRlb0JveCAqdmlkZW9fYm94ID0gR1NUX1ZJREVPX0JPWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTEVGVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHZpZGVvX2JveC0+Ym94X2xlZnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JJR0hUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdmlkZW9fYm94LT5ib3hfcmlnaHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RPUDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHZpZGVvX2JveC0+Ym94X3RvcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQk9UVE9NOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdmlkZW9fYm94LT5ib3hfYm90dG9tKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GSUxMX1RZUEU6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgdmlkZW9fYm94LT5maWxsX3R5cGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FMUEhBOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgdmlkZW9fYm94LT5hbHBoYSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQk9SREVSX0FMUEhBOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgdmlkZW9fYm94LT5ib3JkZXJfYWxwaGEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FVVE9DUk9QOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHZpZGVvX2JveC0+YXV0b2Nyb3ApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgaW5saW5lIGdpbnQKK2dzdF92aWRlb19ib3hfdHJhbnNmb3JtX2RpbWVuc2lvbiAoZ2ludCB2YWwsIGdpbnQgZGVsdGEpCit7CisgIGdpbnQ2NCBuZXdfdmFsID0gKGdpbnQ2NCkgdmFsICsgKGdpbnQ2NCkgZGVsdGE7CisKKyAgbmV3X3ZhbCA9IENMQU1QIChuZXdfdmFsLCAxLCBHX01BWElOVCk7CisKKyAgcmV0dXJuIChnaW50KSBuZXdfdmFsOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92aWRlb19ib3hfdHJhbnNmb3JtX2RpbWVuc2lvbl92YWx1ZSAoY29uc3QgR1ZhbHVlICogc3JjX3ZhbCwKKyAgICBnaW50IGRlbHRhLCBHVmFsdWUgKiBkZXN0X3ZhbCkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKworICBnX3ZhbHVlX2luaXQgKGRlc3RfdmFsLCBHX1ZBTFVFX1RZUEUgKHNyY192YWwpKTsKKworICBpZiAoR19WQUxVRV9IT0xEU19JTlQgKHNyY192YWwpKSB7CisgICAgZ2ludCBpdmFsID0gZ192YWx1ZV9nZXRfaW50IChzcmNfdmFsKTsKKworICAgIGl2YWwgPSBnc3RfdmlkZW9fYm94X3RyYW5zZm9ybV9kaW1lbnNpb24gKGl2YWwsIGRlbHRhKTsKKyAgICBnX3ZhbHVlX3NldF9pbnQgKGRlc3RfdmFsLCBpdmFsKTsKKyAgfSBlbHNlIGlmIChHU1RfVkFMVUVfSE9MRFNfSU5UX1JBTkdFIChzcmNfdmFsKSkgeworICAgIGdpbnQgbWluID0gZ3N0X3ZhbHVlX2dldF9pbnRfcmFuZ2VfbWluIChzcmNfdmFsKTsKKyAgICBnaW50IG1heCA9IGdzdF92YWx1ZV9nZXRfaW50X3JhbmdlX21heCAoc3JjX3ZhbCk7CisKKyAgICBtaW4gPSBnc3RfdmlkZW9fYm94X3RyYW5zZm9ybV9kaW1lbnNpb24gKG1pbiwgZGVsdGEpOworICAgIG1heCA9IGdzdF92aWRlb19ib3hfdHJhbnNmb3JtX2RpbWVuc2lvbiAobWF4LCBkZWx0YSk7CisgICAgaWYgKG1pbiA+PSBtYXgpIHsKKyAgICAgIHJldCA9IEZBTFNFOworICAgICAgZ192YWx1ZV91bnNldCAoZGVzdF92YWwpOworICAgIH0gZWxzZSB7CisgICAgICBnc3RfdmFsdWVfc2V0X2ludF9yYW5nZSAoZGVzdF92YWwsIG1pbiwgbWF4KTsKKyAgICB9CisgIH0gZWxzZSBpZiAoR1NUX1ZBTFVFX0hPTERTX0xJU1QgKHNyY192YWwpKSB7CisgICAgZ2ludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGdzdF92YWx1ZV9saXN0X2dldF9zaXplIChzcmNfdmFsKTsgKytpKSB7CisgICAgICBjb25zdCBHVmFsdWUgKmxpc3RfdmFsOworICAgICAgR1ZhbHVlIG5ld3ZhbCA9IHsgMCwgfTsKKworICAgICAgbGlzdF92YWwgPSBnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUgKHNyY192YWwsIGkpOworICAgICAgaWYgKGdzdF92aWRlb19ib3hfdHJhbnNmb3JtX2RpbWVuc2lvbl92YWx1ZSAobGlzdF92YWwsIGRlbHRhLCAmbmV3dmFsKSkKKyAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlIChkZXN0X3ZhbCwgJm5ld3ZhbCk7CisgICAgICBnX3ZhbHVlX3Vuc2V0ICgmbmV3dmFsKTsKKyAgICB9CisKKyAgICBpZiAoZ3N0X3ZhbHVlX2xpc3RfZ2V0X3NpemUgKGRlc3RfdmFsKSA9PSAwKSB7CisgICAgICBnX3ZhbHVlX3Vuc2V0IChkZXN0X3ZhbCk7CisgICAgICByZXQgPSBGQUxTRTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ192YWx1ZV91bnNldCAoZGVzdF92YWwpOworICAgIHJldCA9IEZBTFNFOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3ZpZGVvX2JveF90cmFuc2Zvcm1fY2FwcyAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdENhcHMgKiBmcm9tLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RWaWRlb0JveCAqdmlkZW9fYm94ID0gR1NUX1ZJREVPX0JPWCAodHJhbnMpOworICBHc3RDYXBzICp0bywgKnJldDsKKyAgR3N0Q2FwcyAqdGVtcGw7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBHc3RQYWQgKm90aGVyOworICBnaW50IGksIGo7CisKKyAgdG8gPSBnc3RfY2Fwc19uZXdfZW1wdHkgKCk7CisgIGZvciAoaSA9IDA7IGkgPCBnc3RfY2Fwc19nZXRfc2l6ZSAoZnJvbSk7IGkrKykgeworICAgIGNvbnN0IEdWYWx1ZSAqZnZhbCwgKmx2YWw7CisgICAgR1ZhbHVlIGxpc3QgPSB7IDAsIH07CisgICAgR1ZhbHVlIHZhbCA9IHsgMCwgfTsKKyAgICBnYm9vbGVhbiBzZWVuX3l1diA9IEZBTFNFLCBzZWVuX3JnYiA9IEZBTFNFOworICAgIGNvbnN0IGdjaGFyICpzdHI7CisKKyAgICBzdHJ1Y3R1cmUgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGZyb20sIGkpKTsKKworICAgIC8qIFRyYW5zZm9ybSB3aWR0aC9oZWlnaHQgKi8KKyAgICBpZiAodmlkZW9fYm94LT5hdXRvY3JvcCkgeworICAgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHN0cnVjdHVyZSwgIndpZHRoIik7CisgICAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAoc3RydWN0dXJlLCAiaGVpZ2h0Iik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdpbnQgZHcgPSAwLCBkaCA9IDA7CisgICAgICBjb25zdCBHVmFsdWUgKnY7CisgICAgICBHVmFsdWUgd192YWwgPSB7IDAsIH07CisgICAgICBHVmFsdWUgaF92YWwgPSB7IDAsIH07CisKKyAgICAgIC8qIGNhbGN1bGF0ZSB3aWR0aCBhbmQgaGVpZ2h0ICovCisgICAgICBpZiAoZGlyZWN0aW9uID09IEdTVF9QQURfU0lOSykgeworICAgICAgICBkdyAtPSB2aWRlb19ib3gtPmJveF9sZWZ0OworICAgICAgICBkdyAtPSB2aWRlb19ib3gtPmJveF9yaWdodDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGR3ICs9IHZpZGVvX2JveC0+Ym94X2xlZnQ7CisgICAgICAgIGR3ICs9IHZpZGVvX2JveC0+Ym94X3JpZ2h0OworICAgICAgfQorCisgICAgICBpZiAoZGlyZWN0aW9uID09IEdTVF9QQURfU0lOSykgeworICAgICAgICBkaCAtPSB2aWRlb19ib3gtPmJveF90b3A7CisgICAgICAgIGRoIC09IHZpZGVvX2JveC0+Ym94X2JvdHRvbTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRoICs9IHZpZGVvX2JveC0+Ym94X3RvcDsKKyAgICAgICAgZGggKz0gdmlkZW9fYm94LT5ib3hfYm90dG9tOworICAgICAgfQorCisgICAgICB2ID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgIndpZHRoIik7CisgICAgICBpZiAoIWdzdF92aWRlb19ib3hfdHJhbnNmb3JtX2RpbWVuc2lvbl92YWx1ZSAodiwgZHcsICZ3X3ZhbCkpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2aWRlb19ib3gsCisgICAgICAgICAgICAiY291bGQgbm90IHRyYW5mb3JtIHdpZHRoIHZhbHVlIHdpdGggZHc9JWQiICIsIGNhcHMgc3RydWN0dXJlPSUiCisgICAgICAgICAgICBHU1RfUFRSX0ZPUk1BVCwgZHcsIHN0cnVjdHVyZSk7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJ3aWR0aCIsICZ3X3ZhbCk7CisKKyAgICAgIHYgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCAiaGVpZ2h0Iik7CisgICAgICBpZiAoIWdzdF92aWRlb19ib3hfdHJhbnNmb3JtX2RpbWVuc2lvbl92YWx1ZSAodiwgZGgsICZoX3ZhbCkpIHsKKyAgICAgICAgZ192YWx1ZV91bnNldCAoJndfdmFsKTsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2aWRlb19ib3gsCisgICAgICAgICAgICAiY291bGQgbm90IHRyYW5mb3JtIGhlaWdodCB2YWx1ZSB3aXRoIGRoPSVkIiAiLCBjYXBzIHN0cnVjdHVyZT0lIgorICAgICAgICAgICAgR1NUX1BUUl9GT1JNQVQsIGRoLCBzdHJ1Y3R1cmUpOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAoc3RydWN0dXJlLCAiaGVpZ2h0IiwgJmhfdmFsKTsKKyAgICAgIGdfdmFsdWVfdW5zZXQgKCZ3X3ZhbCk7CisgICAgICBnX3ZhbHVlX3Vuc2V0ICgmaF92YWwpOworICAgIH0KKworICAgIC8qIFN1cHBvcnRlZCBjb252ZXJzaW9uczoKKyAgICAgKiBJNDIwLT5BWVVWCisgICAgICogSTQyMC0+WVYxMgorICAgICAqIFlWMTItPkFZVVYKKyAgICAgKiBZVjEyLT5JNDIwCisgICAgICogQVlVVi0+STQyMAorICAgICAqIEFZVVYtPllWMTIKKyAgICAgKiBBWVVWLT54UkdCICgyNGJwcCwgMzJicHAsIGluY2wuIGFscGhhKQorICAgICAqIHhSR0ItPnhSR0IgKDI0YnBwLCAzMmJwcCwgZnJvbS90byBhbGwgdmFyaWFudHMsIGluY2wuIGFscGhhKQorICAgICAqIHhSR0ItPkFZVVYgKDI0YnBwLCAzMmJwcCwgaW5jbC4gYWxwaGEpCisgICAgICoKKyAgICAgKiBQYXNzdGhyb3VnaCBvbmx5IGZvciBldmVyeXRoaW5nIGVsc2UuCisgICAgICovCisgICAgZnZhbCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJmb3JtYXQiKTsKKyAgICBpZiAoZnZhbCAmJiBHU1RfVkFMVUVfSE9MRFNfTElTVCAoZnZhbCkpIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBnc3RfdmFsdWVfbGlzdF9nZXRfc2l6ZSAoZnZhbCk7IGorKykgeworICAgICAgICBsdmFsID0gZ3N0X3ZhbHVlX2xpc3RfZ2V0X3ZhbHVlIChmdmFsLCBqKTsKKyAgICAgICAgaWYgKChzdHIgPSBnX3ZhbHVlX2dldF9zdHJpbmcgKGx2YWwpKSkgeworICAgICAgICAgIGlmIChzdHJjbXAgKHN0ciwgIkFZVVYiKSA9PSAwKSB7CisgICAgICAgICAgICBzZWVuX3l1diA9IFRSVUU7CisgICAgICAgICAgICBzZWVuX3JnYiA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGVsc2UgaWYgKHN0cnN0ciAoc3RyLCAiUkdCIikgfHwgc3Ryc3RyIChzdHIsICJCR1IiKSkgeworICAgICAgICAgICAgc2Vlbl9yZ2IgPSBUUlVFOworICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wIChzdHIsICJJNDIwIikgPT0gMCB8fCBzdHJjbXAgKHN0ciwgIllWMTIiKSA9PSAwKSB7CisgICAgICAgICAgICBzZWVuX3l1diA9IFRSVUU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChmdmFsICYmIEdfVkFMVUVfSE9MRFNfU1RSSU5HIChmdmFsKSkgeworICAgICAgaWYgKChzdHIgPSBnX3ZhbHVlX2dldF9zdHJpbmcgKGZ2YWwpKSkgeworICAgICAgICBpZiAoc3RyY21wIChzdHIsICJBWVVWIikgPT0gMCkgeworICAgICAgICAgIHNlZW5feXV2ID0gVFJVRTsKKyAgICAgICAgICBzZWVuX3JnYiA9IFRSVUU7CisgICAgICAgIH0gZWxzZSBpZiAoc3Ryc3RyIChzdHIsICJSR0IiKSB8fCBzdHJzdHIgKHN0ciwgIkJHUiIpKSB7CisgICAgICAgICAgc2Vlbl9yZ2IgPSBUUlVFOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCAoc3RyLCAiSTQyMCIpID09IDAgfHwgc3RyY21wIChzdHIsICJZVjEyIikgPT0gMCkgeworICAgICAgICAgIHNlZW5feXV2ID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChzZWVuX3l1diB8fCBzZWVuX3JnYikgeworICAgICAgZ192YWx1ZV9pbml0ICgmbGlzdCwgR1NUX1RZUEVfTElTVCk7CisKKyAgICAgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR19UWVBFX1NUUklORyk7CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKCZ2YWwsICJBWVVWIik7CisgICAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfdmFsdWUgKCZsaXN0LCAmdmFsKTsKKyAgICAgIGdfdmFsdWVfdW5zZXQgKCZ2YWwpOworCisgICAgICBpZiAoc2Vlbl95dXYpIHsKKyAgICAgICAgZ192YWx1ZV9pbml0ICgmdmFsLCBHX1RZUEVfU1RSSU5HKTsKKyAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICgmdmFsLCAiSTQyMCIpOworICAgICAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfdmFsdWUgKCZsaXN0LCAmdmFsKTsKKyAgICAgICAgZ192YWx1ZV9yZXNldCAoJnZhbCk7CisgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAoJnZhbCwgIllWMTIiKTsKKyAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmbGlzdCwgJnZhbCk7CisgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZ2YWwpOworICAgICAgfQorICAgICAgaWYgKHNlZW5fcmdiKSB7CisgICAgICAgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR19UWVBFX1NUUklORyk7CisgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAoJnZhbCwgIlJHQngiKTsKKyAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmbGlzdCwgJnZhbCk7CisgICAgICAgIGdfdmFsdWVfcmVzZXQgKCZ2YWwpOworICAgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKCZ2YWwsICJCR1J4Iik7CisgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJmxpc3QsICZ2YWwpOworICAgICAgICBnX3ZhbHVlX3Jlc2V0ICgmdmFsKTsKKyAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICgmdmFsLCAieFJHQiIpOworICAgICAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfdmFsdWUgKCZsaXN0LCAmdmFsKTsKKyAgICAgICAgZ192YWx1ZV9yZXNldCAoJnZhbCk7CisgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAoJnZhbCwgInhCR1IiKTsKKyAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmbGlzdCwgJnZhbCk7CisgICAgICAgIGdfdmFsdWVfcmVzZXQgKCZ2YWwpOworICAgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKCZ2YWwsICJSR0JBIik7CisgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJmxpc3QsICZ2YWwpOworICAgICAgICBnX3ZhbHVlX3Jlc2V0ICgmdmFsKTsKKyAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICgmdmFsLCAiQkdSQSIpOworICAgICAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfdmFsdWUgKCZsaXN0LCAmdmFsKTsKKyAgICAgICAgZ192YWx1ZV9yZXNldCAoJnZhbCk7CisgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAoJnZhbCwgIkFSR0IiKTsKKyAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmbGlzdCwgJnZhbCk7CisgICAgICAgIGdfdmFsdWVfcmVzZXQgKCZ2YWwpOworICAgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKCZ2YWwsICJBQkdSIik7CisgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJmxpc3QsICZ2YWwpOworICAgICAgICBnX3ZhbHVlX3Jlc2V0ICgmdmFsKTsKKyAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICgmdmFsLCAiUkdCIik7CisgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJmxpc3QsICZ2YWwpOworICAgICAgICBnX3ZhbHVlX3Jlc2V0ICgmdmFsKTsKKyAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICgmdmFsLCAiQkdSIik7CisgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJmxpc3QsICZ2YWwpOworICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdmFsKTsKKyAgICAgIH0KKyAgICAgIGdzdF92YWx1ZV9saXN0X21lcmdlICgmdmFsLCBmdmFsLCAmbGlzdCk7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAoc3RydWN0dXJlLCAiZm9ybWF0IiwgJnZhbCk7CisgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdmFsKTsKKyAgICAgIGdfdmFsdWVfdW5zZXQgKCZsaXN0KTsKKyAgICB9CisKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAoc3RydWN0dXJlLCAiY29sb3JpbWV0cnkiKTsKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAoc3RydWN0dXJlLCAiY2hyb21hLXNpdGUiKTsKKworICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKHRvLCBzdHJ1Y3R1cmUpOworICB9CisKKyAgLyogZmlsdGVyIGFnYWluc3Qgc2V0IGFsbG93ZWQgY2FwcyBvbiB0aGUgcGFkICovCisgIG90aGVyID0gKGRpcmVjdGlvbiA9PSBHU1RfUEFEX1NJTkspID8gdHJhbnMtPnNyY3BhZCA6IHRyYW5zLT5zaW5rcGFkOworICB0ZW1wbCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChvdGhlcik7CisgIHJldCA9IGdzdF9jYXBzX2ludGVyc2VjdCAodG8sIHRlbXBsKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHRvKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHRlbXBsKTsKKworICBHU1RfREVCVUdfT0JKRUNUICh2aWRlb19ib3gsICJkaXJlY3Rpb24gJWQsIHRyYW5zZm9ybWVkICUiIEdTVF9QVFJfRk9STUFUCisgICAgICAiIHRvICUiIEdTVF9QVFJfRk9STUFULCBkaXJlY3Rpb24sIGZyb20sIHJldCk7CisKKyAgaWYgKHJldCAmJiBmaWx0ZXIpIHsKKyAgICBHc3RDYXBzICppbnRlcnNlY3Rpb247CisKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2aWRlb19ib3gsICJVc2luZyBmaWx0ZXIgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgZmlsdGVyKTsKKyAgICBpbnRlcnNlY3Rpb24gPQorICAgICAgICBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCByZXQsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHJldCk7CisgICAgcmV0ID0gaW50ZXJzZWN0aW9uOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHZpZGVvX2JveCwgIkludGVyc2VjdGlvbiAlIiBHU1RfUFRSX0ZPUk1BVCwgcmV0KTsKKyAgfQorCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCitiYWlsOgorICB7CisgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChzdHJ1Y3R1cmUpOworICAgIGdzdF9jYXBzX3VucmVmICh0byk7CisgICAgdG8gPSBnc3RfY2Fwc19uZXdfZW1wdHkgKCk7CisgICAgcmV0dXJuIHRvOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZpZGVvX2JveF9yZWNhbGNfdHJhbnNmb3JtIChHc3RWaWRlb0JveCAqIHZpZGVvX2JveCkKK3sKKyAgZ2Jvb2xlYW4gcmVzID0gVFJVRTsKKworICAvKiBpZiB3ZSBoYXZlIHRoZSBzYW1lIGZvcm1hdCBpbiBhbmQgb3V0IGFuZCB3ZSBkb24ndCBuZWVkIHRvIHBlcmZvcm0gYW55CisgICAqIGNyb3BwaW5nIGF0IGFsbCwgd2UgY2FuIGp1c3Qgb3BlcmF0ZSBpbiBwYXNzdGhyb3VnaCBtb2RlICovCisgIGlmICh2aWRlb19ib3gtPmluX2Zvcm1hdCA9PSB2aWRlb19ib3gtPm91dF9mb3JtYXQgJiYKKyAgICAgIHZpZGVvX2JveC0+Ym94X2xlZnQgPT0gMCAmJiB2aWRlb19ib3gtPmJveF9yaWdodCA9PSAwICYmCisgICAgICB2aWRlb19ib3gtPmJveF90b3AgPT0gMCAmJiB2aWRlb19ib3gtPmJveF9ib3R0b20gPT0gMCAmJgorICAgICAgdmlkZW9fYm94LT5pbl9zZHR2ID09IHZpZGVvX2JveC0+b3V0X3NkdHYpIHsKKworICAgIEdTVF9MT0dfT0JKRUNUICh2aWRlb19ib3gsICJ3ZSBhcmUgdXNpbmcgcGFzc3Rocm91Z2giKTsKKyAgICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X3Bhc3N0aHJvdWdoIChHU1RfQkFTRV9UUkFOU0ZPUk1fQ0FTVCAodmlkZW9fYm94KSwKKyAgICAgICAgVFJVRSk7CisgIH0gZWxzZSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHZpZGVvX2JveCwgIndlIGFyZSBub3QgdXNpbmcgcGFzc3Rocm91Z2giKTsKKyAgICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X3Bhc3N0aHJvdWdoIChHU1RfQkFTRV9UUkFOU0ZPUk1fQ0FTVCAodmlkZW9fYm94KSwKKyAgICAgICAgRkFMU0UpOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZpZGVvX2JveF9zZWxlY3RfcHJvY2Vzc2luZ19mdW5jdGlvbnMgKEdzdFZpZGVvQm94ICogdmlkZW9fYm94KQoreworICBzd2l0Y2ggKHZpZGVvX2JveC0+b3V0X2Zvcm1hdCkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgdmlkZW9fYm94LT5maWxsID0gZmlsbF9heXV2OworICAgICAgc3dpdGNoICh2aWRlb19ib3gtPmluX2Zvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVlVVjoKKyAgICAgICAgICB2aWRlb19ib3gtPmNvcHkgPSBjb3B5X2F5dXZfYXl1djsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVjEyOgorICAgICAgICAgIHZpZGVvX2JveC0+Y29weSA9IGNvcHlfaTQyMF9heXV2OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FCR1I6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX3hSR0I6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94QkdSOgorICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCeDoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUng6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1I6CisgICAgICAgICAgdmlkZW9fYm94LT5jb3B5ID0gY29weV9yZ2IzMl9heXV2OworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWMTI6CisgICAgICB2aWRlb19ib3gtPmZpbGwgPSBmaWxsX3BsYW5hcl95dXY7CisgICAgICBzd2l0Y2ggKHZpZGVvX2JveC0+aW5fZm9ybWF0KSB7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgICAgIHZpZGVvX2JveC0+Y29weSA9IGNvcHlfYXl1dl9pNDIwOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfSTQyMDoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWMTI6CisgICAgICAgICAgdmlkZW9fYm94LT5jb3B5ID0gY29weV9pNDIwX2k0MjA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQUJHUjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeFJHQjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeEJHUjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCeDoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSeDoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1I6CisgICAgICB2aWRlb19ib3gtPmZpbGwgPSAodmlkZW9fYm94LT5vdXRfZm9ybWF0ID09IEdTVF9WSURFT19GT1JNQVRfQkdSCisgICAgICAgICAgfHwgdmlkZW9fYm94LT5vdXRfZm9ybWF0ID09CisgICAgICAgICAgR1NUX1ZJREVPX0ZPUk1BVF9SR0IpID8gZmlsbF9yZ2IyNCA6IGZpbGxfcmdiMzI7CisgICAgICBzd2l0Y2ggKHZpZGVvX2JveC0+aW5fZm9ybWF0KSB7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BUkdCOgorICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQUJHUjoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQkE6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1JBOgorICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeFJHQjoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX3hCR1I6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0J4OgorICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSeDoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQjoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUjoKKyAgICAgICAgICB2aWRlb19ib3gtPmNvcHkgPSBjb3B5X3JnYjMyOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVlVVjoKKyAgICAgICAgICB2aWRlb19ib3gtPmNvcHkgPSBjb3B5X2F5dXZfcmdiMzI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfR1JBWTg6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0dSQVkxNl9CRToKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfR1JBWTE2X0xFOgorICAgICAgdmlkZW9fYm94LT5maWxsID0gZmlsbF9ncmF5OworICAgICAgc3dpdGNoICh2aWRlb19ib3gtPmluX2Zvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfR1JBWTg6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9HUkFZMTZfQkU6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9HUkFZMTZfTEU6CisgICAgICAgICAgdmlkZW9fYm94LT5jb3B5ID0gY29weV9wYWNrZWRfc2ltcGxlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lVWTI6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWWVU6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICB2aWRlb19ib3gtPmZpbGwgPSBmaWxsX3l1eTI7CisgICAgICBzd2l0Y2ggKHZpZGVvX2JveC0+aW5fZm9ybWF0KSB7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVVkyOgorICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVZZVToKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICAgICAgdmlkZW9fYm94LT5jb3B5ID0gY29weV95dXkyX3l1eTI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQ0NDoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQyQjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQxQjoKKyAgICAgIHZpZGVvX2JveC0+ZmlsbCA9IGZpbGxfcGxhbmFyX3l1djsKKyAgICAgIHN3aXRjaCAodmlkZW9fYm94LT5pbl9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0NDQ6CisgICAgICAgICAgdmlkZW9fYm94LT5jb3B5ID0gY29weV95NDQ0X3k0NDQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOgorICAgICAgICAgIHZpZGVvX2JveC0+Y29weSA9IGNvcHlfeTQyYl95NDJiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQxQjoKKyAgICAgICAgICB2aWRlb19ib3gtPmNvcHkgPSBjb3B5X3k0MWJfeTQxYjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiB2aWRlb19ib3gtPmZpbGwgIT0gTlVMTCAmJiB2aWRlb19ib3gtPmNvcHkgIT0gTlVMTDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9fYm94X3NldF9pbmZvIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsIEdzdENhcHMgKiBpbiwKKyAgICBHc3RWaWRlb0luZm8gKiBpbl9pbmZvLCBHc3RDYXBzICogb3V0LCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0VmlkZW9Cb3ggKnZpZGVvX2JveCA9IEdTVF9WSURFT19CT1ggKHZmaWx0ZXIpOworICBnYm9vbGVhbiByZXQ7CisKKyAgZ19tdXRleF9sb2NrICgmdmlkZW9fYm94LT5tdXRleCk7CisKKyAgdmlkZW9fYm94LT5pbl9mb3JtYXQgPSBHU1RfVklERU9fSU5GT19GT1JNQVQgKGluX2luZm8pOworICB2aWRlb19ib3gtPmluX3dpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKGluX2luZm8pOworICB2aWRlb19ib3gtPmluX2hlaWdodCA9IEdTVF9WSURFT19JTkZPX0hFSUdIVCAoaW5faW5mbyk7CisKKyAgdmlkZW9fYm94LT5vdXRfZm9ybWF0ID0gR1NUX1ZJREVPX0lORk9fRk9STUFUIChvdXRfaW5mbyk7CisgIHZpZGVvX2JveC0+b3V0X3dpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKG91dF9pbmZvKTsKKyAgdmlkZW9fYm94LT5vdXRfaGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChvdXRfaW5mbyk7CisKKyAgdmlkZW9fYm94LT5pbl9zZHR2ID0KKyAgICAgIGluX2luZm8tPmNvbG9yaW1ldHJ5Lm1hdHJpeCA9PSBHU1RfVklERU9fQ09MT1JfTUFUUklYX0JUNjAxOworICB2aWRlb19ib3gtPm91dF9zZHR2ID0KKyAgICAgIG91dF9pbmZvLT5jb2xvcmltZXRyeS5tYXRyaXggPT0gR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9CVDYwMTsKKworICBHU1RfREVCVUdfT0JKRUNUICh2aWRlb19ib3gsICJJbnB1dCB3OiAlZCBoOiAlZCIsIHZpZGVvX2JveC0+aW5fd2lkdGgsCisgICAgICB2aWRlb19ib3gtPmluX2hlaWdodCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHZpZGVvX2JveCwgIk91dHB1dCB3OiAlZCBoOiAlZCIsIHZpZGVvX2JveC0+b3V0X3dpZHRoLAorICAgICAgdmlkZW9fYm94LT5vdXRfaGVpZ2h0KTsKKworICBpZiAodmlkZW9fYm94LT5hdXRvY3JvcCkKKyAgICBnc3RfdmlkZW9fYm94X2F1dG9jcm9wICh2aWRlb19ib3gpOworCisgIC8qIHJlY2FsYyB0aGUgdHJhbnNmb3JtYXRpb24gc3RyYXRlZ3kgKi8KKyAgcmV0ID0gZ3N0X3ZpZGVvX2JveF9yZWNhbGNfdHJhbnNmb3JtICh2aWRlb19ib3gpOworCisgIGlmIChyZXQpCisgICAgcmV0ID0gZ3N0X3ZpZGVvX2JveF9zZWxlY3RfcHJvY2Vzc2luZ19mdW5jdGlvbnMgKHZpZGVvX2JveCk7CisgIGdfbXV0ZXhfdW5sb2NrICgmdmlkZW9fYm94LT5tdXRleCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9fYm94X3NyY19ldmVudCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RWaWRlb0JveCAqdmlkZW9fYm94ID0gR1NUX1ZJREVPX0JPWCAodHJhbnMpOworICBHc3RTdHJ1Y3R1cmUgKm5ld19zdHJ1Y3R1cmU7CisgIGNvbnN0IEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBjb25zdCBnY2hhciAqZXZlbnRfbmFtZTsKKyAgZ2RvdWJsZSBwb2ludGVyX3g7CisgIGdkb3VibGUgcG9pbnRlcl95OworCisgIEdTVF9PQkpFQ1RfTE9DSyAodmlkZW9fYm94KTsKKyAgaWYgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX05BVklHQVRJT04gJiYKKyAgICAgICh2aWRlb19ib3gtPmJveF9sZWZ0ICE9IDAgfHwgdmlkZW9fYm94LT5ib3hfdG9wICE9IDApKSB7CisgICAgc3RydWN0dXJlID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUgKGV2ZW50KTsKKyAgICBldmVudF9uYW1lID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJldmVudCIpOworCisgICAgaWYgKGV2ZW50X25hbWUgJiYKKyAgICAgICAgKHN0cmNtcCAoZXZlbnRfbmFtZSwgIm1vdXNlLW1vdmUiKSA9PSAwIHx8CisgICAgICAgICAgICBzdHJjbXAgKGV2ZW50X25hbWUsICJtb3VzZS1idXR0b24tcHJlc3MiKSA9PSAwIHx8CisgICAgICAgICAgICBzdHJjbXAgKGV2ZW50X25hbWUsICJtb3VzZS1idXR0b24tcmVsZWFzZSIpID09IDApKSB7CisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfZG91YmxlIChzdHJ1Y3R1cmUsICJwb2ludGVyX3giLCAmcG9pbnRlcl94KSAmJgorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2RvdWJsZSAoc3RydWN0dXJlLCAicG9pbnRlcl95IiwgJnBvaW50ZXJfeSkpIHsKKyAgICAgICAgZ2RvdWJsZSBuZXdfcG9pbnRlcl94LCBuZXdfcG9pbnRlcl95OworICAgICAgICBHc3RFdmVudCAqbmV3X2V2ZW50OworCisgICAgICAgIG5ld19wb2ludGVyX3ggPSBwb2ludGVyX3ggKyB2aWRlb19ib3gtPmJveF9sZWZ0OworICAgICAgICBuZXdfcG9pbnRlcl95ID0gcG9pbnRlcl95ICsgdmlkZW9fYm94LT5ib3hfdG9wOworCisgICAgICAgIG5ld19zdHJ1Y3R1cmUgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHN0cnVjdHVyZSk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfc3RydWN0dXJlLAorICAgICAgICAgICAgInBvaW50ZXJfeCIsIEdfVFlQRV9ET1VCTEUsIChnZG91YmxlKSAobmV3X3BvaW50ZXJfeCksCisgICAgICAgICAgICAicG9pbnRlcl95IiwgR19UWVBFX0RPVUJMRSwgKGdkb3VibGUpIChuZXdfcG9pbnRlcl95KSwgTlVMTCk7CisKKyAgICAgICAgbmV3X2V2ZW50ID0gZ3N0X2V2ZW50X25ld19uYXZpZ2F0aW9uIChuZXdfc3RydWN0dXJlKTsKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgIGV2ZW50ID0gbmV3X2V2ZW50OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2aWRlb19ib3gsICJGYWlsZWQgdG8gcmVhZCBuYXZpZ2F0aW9uIGV2ZW50Iik7CisgICAgICB9CisgICAgfQorICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLICh2aWRlb19ib3gpOworCisgIHJldHVybiBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNyY19ldmVudCAodHJhbnMsIGV2ZW50KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19ib3hfcHJvY2VzcyAoR3N0VmlkZW9Cb3ggKiB2aWRlb19ib3gsIEdzdFZpZGVvRnJhbWUgKiBpbiwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0KQoreworICBndWludCBiX2FscGhhID0gQ0xBTVAgKHZpZGVvX2JveC0+Ym9yZGVyX2FscGhhICogMjU2LCAwLCAyNTUpOworICBndWludCBpX2FscGhhID0gQ0xBTVAgKHZpZGVvX2JveC0+YWxwaGEgKiAyNTYsIDAsIDI1NSk7CisgIEdzdFZpZGVvQm94RmlsbCBmaWxsX3R5cGUgPSB2aWRlb19ib3gtPmZpbGxfdHlwZTsKKyAgZ2ludCBiciwgYmwsIGJ0LCBiYiwgY3JvcF93LCBjcm9wX2g7CisKKyAgY3JvcF9oID0gMDsKKyAgY3JvcF93ID0gMDsKKworICBiciA9IHZpZGVvX2JveC0+Ym94X3JpZ2h0OworICBibCA9IHZpZGVvX2JveC0+Ym94X2xlZnQ7CisgIGJ0ID0gdmlkZW9fYm94LT5ib3hfdG9wOworICBiYiA9IHZpZGVvX2JveC0+Ym94X2JvdHRvbTsKKworICBpZiAoYnIgPj0gMCAmJiBibCA+PSAwKSB7CisgICAgY3JvcF93ID0gdmlkZW9fYm94LT5pbl93aWR0aCAtIChiciArIGJsKTsKKyAgfSBlbHNlIGlmIChiciA+PSAwICYmIGJsIDwgMCkgeworICAgIGNyb3BfdyA9IHZpZGVvX2JveC0+aW5fd2lkdGggLSAoYnIpOworICB9IGVsc2UgaWYgKGJyIDwgMCAmJiBibCA+PSAwKSB7CisgICAgY3JvcF93ID0gdmlkZW9fYm94LT5pbl93aWR0aCAtIChibCk7CisgIH0gZWxzZSBpZiAoYnIgPCAwICYmIGJsIDwgMCkgeworICAgIGNyb3BfdyA9IHZpZGVvX2JveC0+aW5fd2lkdGg7CisgIH0KKworICBpZiAoYmIgPj0gMCAmJiBidCA+PSAwKSB7CisgICAgY3JvcF9oID0gdmlkZW9fYm94LT5pbl9oZWlnaHQgLSAoYmIgKyBidCk7CisgIH0gZWxzZSBpZiAoYmIgPj0gMCAmJiBidCA8IDApIHsKKyAgICBjcm9wX2ggPSB2aWRlb19ib3gtPmluX2hlaWdodCAtIChiYik7CisgIH0gZWxzZSBpZiAoYmIgPCAwICYmIGJ0ID49IDApIHsKKyAgICBjcm9wX2ggPSB2aWRlb19ib3gtPmluX2hlaWdodCAtIChidCk7CisgIH0gZWxzZSBpZiAoYmIgPCAwICYmIGJ0IDwgMCkgeworICAgIGNyb3BfaCA9IHZpZGVvX2JveC0+aW5faGVpZ2h0OworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodmlkZW9fYm94LCAiQm9yZGVycyBhcmU6IEw6JWQsIFI6JWQsIFQ6JWQsIEI6JWQiLCBibCwgYnIsCisgICAgICBidCwgYmIpOworICBHU1RfREVCVUdfT0JKRUNUICh2aWRlb19ib3gsICJBbHBoYSB2YWx1ZSBpczogJXUgKGZyYW1lKSAldSAoYm9yZGVyKSIsCisgICAgICBpX2FscGhhLCBiX2FscGhhKTsKKworICBpZiAoY3JvcF9oIDwgMCB8fCBjcm9wX3cgPCAwKSB7CisgICAgdmlkZW9fYm94LT5maWxsIChmaWxsX3R5cGUsIGJfYWxwaGEsIG91dCwgdmlkZW9fYm94LT5vdXRfc2R0dik7CisgIH0gZWxzZSBpZiAoYmIgPT0gMCAmJiBidCA9PSAwICYmIGJyID09IDAgJiYgYmwgPT0gMCkgeworICAgIHZpZGVvX2JveC0+Y29weSAoaV9hbHBoYSwgb3V0LCB2aWRlb19ib3gtPm91dF9zZHR2LCAwLCAwLCBpbiwKKyAgICAgICAgdmlkZW9fYm94LT5pbl9zZHR2LCAwLCAwLCBjcm9wX3csIGNyb3BfaCk7CisgIH0gZWxzZSB7CisgICAgZ2ludCBzcmNfeCA9IDAsIHNyY195ID0gMDsKKyAgICBnaW50IGRlc3RfeCA9IDAsIGRlc3RfeSA9IDA7CisKKyAgICAvKiBGaWxsIGV2ZXJ5dGhpbmcgaWYgYSBib3JkZXIgc2hvdWxkIGJlIGFkZGVkIHNvbWV3aGVyZSAqLworICAgIGlmIChidCA8IDAgfHwgYmIgPCAwIHx8IGJyIDwgMCB8fCBibCA8IDApCisgICAgICB2aWRlb19ib3gtPmZpbGwgKGZpbGxfdHlwZSwgYl9hbHBoYSwgb3V0LCB2aWRlb19ib3gtPm91dF9zZHR2KTsKKworICAgIC8qIFRvcCBib3JkZXIgKi8KKyAgICBpZiAoYnQgPCAwKSB7CisgICAgICBkZXN0X3kgKz0gLWJ0OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfeSArPSBidDsKKyAgICB9CisKKyAgICAvKiBMZWZ0IGJvcmRlciAqLworICAgIGlmIChibCA8IDApIHsKKyAgICAgIGRlc3RfeCArPSAtYmw7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY194ICs9IGJsOworICAgIH0KKworICAgIC8qIEZyYW1lICovCisgICAgdmlkZW9fYm94LT5jb3B5IChpX2FscGhhLCBvdXQsIHZpZGVvX2JveC0+b3V0X3NkdHYsIGRlc3RfeCwgZGVzdF95LAorICAgICAgICBpbiwgdmlkZW9fYm94LT5pbl9zZHR2LCBzcmNfeCwgc3JjX3ksIGNyb3BfdywgY3JvcF9oKTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUICh2aWRlb19ib3gsICJpbWFnZSBjcmVhdGVkIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fYm94X2JlZm9yZV90cmFuc2Zvcm0gKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywgR3N0QnVmZmVyICogaW4pCit7CisgIEdzdFZpZGVvQm94ICp2aWRlb19ib3ggPSBHU1RfVklERU9fQk9YICh0cmFucyk7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIHN0cmVhbV90aW1lOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbik7CisgIHN0cmVhbV90aW1lID0KKyAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmdHJhbnMtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgdGltZXN0YW1wKTsKKworICBHU1RfREVCVUdfT0JKRUNUICh2aWRlb19ib3gsICJzeW5jIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtX3RpbWUpKQorICAgIGdzdF9vYmplY3Rfc3luY192YWx1ZXMgKEdTVF9PQkpFQ1QgKHZpZGVvX2JveCksIHN0cmVhbV90aW1lKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92aWRlb19ib3hfdHJhbnNmb3JtX2ZyYW1lIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsCisgICAgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLCBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lKQoreworICBHc3RWaWRlb0JveCAqdmlkZW9fYm94ID0gR1NUX1ZJREVPX0JPWCAodmZpbHRlcik7CisKKyAgZ19tdXRleF9sb2NrICgmdmlkZW9fYm94LT5tdXRleCk7CisgIGdzdF92aWRlb19ib3hfcHJvY2VzcyAodmlkZW9fYm94LCBpbl9mcmFtZSwgb3V0X2ZyYW1lKTsKKyAgZ19tdXRleF91bmxvY2sgKCZ2aWRlb19ib3gtPm11dGV4KTsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCisvKiBGSVhNRTogMC4xMSBtZXJnZSB3aXRoIHZpZGVvY3JvcCBwbHVnaW4gKi8KK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHZpZGVvYm94X2RlYnVnLCAidmlkZW9ib3giLCAwLAorICAgICAgIlJlc2l6ZXMgYSB2aWRlbyBieSBhZGRpbmcgYm9yZGVycyBvciBjcm9wcGluZyIpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAidmlkZW9ib3giLCBHU1RfUkFOS19OT05FLAorICAgICAgR1NUX1RZUEVfVklERU9fQk9YKTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHZpZGVvYm94LAorICAgICJyZXNpemVzIGEgdmlkZW8gYnkgYWRkaW5nIGJvcmRlcnMgb3IgY3JvcHBpbmciLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmggYi9nc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmI5OGFjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmgKQEAgLTAsMCArMSw5MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZmlsdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpZm5kZWYgX19HU1RfVklERU9fQk9YX0hfXworI2RlZmluZSBfX0dTVF9WSURFT19CT1hfSF9fCisKKyNkZWZpbmUgR1NUX1RZUEVfVklERU9fQk9YIFwKKyAgKGdzdF92aWRlb19ib3hfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1ZJREVPX0JPWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1ZJREVPX0JPWCxHc3RWaWRlb0JveCkpCisjZGVmaW5lIEdTVF9WSURFT19CT1hfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfVklERU9fQk9YLEdzdFZpZGVvQm94Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVklERU9fQk9YKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfVklERU9fQk9YKSkKKyNkZWZpbmUgR1NUX0lTX1ZJREVPX0JPWF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9WSURFT19CT1gpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0VmlkZW9Cb3ggR3N0VmlkZW9Cb3g7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VmlkZW9Cb3hDbGFzcyBHc3RWaWRlb0JveENsYXNzOworCit0eXBlZGVmIGVudW0KK3sKKyAgVklERU9fQk9YX0ZJTExfQkxBQ0ssCisgIFZJREVPX0JPWF9GSUxMX0dSRUVOLAorICBWSURFT19CT1hfRklMTF9CTFVFLAorICBWSURFT19CT1hfRklMTF9SRUQsCisgIFZJREVPX0JPWF9GSUxMX1lFTExPVywKKyAgVklERU9fQk9YX0ZJTExfV0hJVEUsCisgIFZJREVPX0JPWF9GSUxMX0xBU1QKK30KK0dzdFZpZGVvQm94RmlsbDsKKworc3RydWN0IF9Hc3RWaWRlb0JveAoreworICBHc3RWaWRlb0ZpbHRlciBlbGVtZW50OworCisgIC8qIDxwcml2YXRlPiAqLworCisgIC8qIEd1YXJkaW5nIGV2ZXJ5dGhpbmcgYmVsb3cgKi8KKyAgR011dGV4IG11dGV4OworICAvKiBjYXBzICovCisgIEdzdFZpZGVvRm9ybWF0IGluX2Zvcm1hdDsKKyAgZ2ludCBpbl93aWR0aCwgaW5faGVpZ2h0OworICBnYm9vbGVhbiBpbl9zZHR2OworICBHc3RWaWRlb0Zvcm1hdCBvdXRfZm9ybWF0OworICBnaW50IG91dF93aWR0aCwgb3V0X2hlaWdodDsKKyAgZ2Jvb2xlYW4gb3V0X3NkdHY7CisKKyAgZ2ludCBib3hfbGVmdCwgYm94X3JpZ2h0LCBib3hfdG9wLCBib3hfYm90dG9tOworCisgIGdpbnQgYm9yZGVyX2xlZnQsIGJvcmRlcl9yaWdodCwgYm9yZGVyX3RvcCwgYm9yZGVyX2JvdHRvbTsKKyAgZ2ludCBjcm9wX2xlZnQsIGNyb3BfcmlnaHQsIGNyb3BfdG9wLCBjcm9wX2JvdHRvbTsKKworICBnZG91YmxlIGFscGhhOworICBnZG91YmxlIGJvcmRlcl9hbHBoYTsKKworICBHc3RWaWRlb0JveEZpbGwgZmlsbF90eXBlOworCisgIGdib29sZWFuIGF1dG9jcm9wOworCisgIHZvaWQgKCpmaWxsKSAoR3N0VmlkZW9Cb3hGaWxsIGZpbGxfdHlwZSwgZ3VpbnQgYl9hbHBoYSwgR3N0VmlkZW9GcmFtZSAqZGVzdCwgZ2Jvb2xlYW4gc2R0dik7CisgIHZvaWQgKCpjb3B5KSAoZ3VpbnQgaV9hbHBoYSwgR3N0VmlkZW9GcmFtZSAqIGRlc3QsIGdib29sZWFuIGRlc3Rfc2R0diwgZ2ludCBkZXN0X3gsIGdpbnQgZGVzdF95LCBHc3RWaWRlb0ZyYW1lICogc3JjLCBnYm9vbGVhbiBzcmNfc2R0diwgZ2ludCBzcmNfeCwgZ2ludCBzcmNfeSwgZ2ludCB3LCBnaW50IGgpOworfTsKKworc3RydWN0IF9Hc3RWaWRlb0JveENsYXNzCit7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3ZpZGVvX2JveF9nZXRfdHlwZSAodm9pZCk7CisKKyNlbmRpZiAvKiBfX0dTVF9WSURFT19CT1hfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMtZGlzdC5jIGIvZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLWRpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOThiNDkwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLWRpc3QuYwpAQCAtMCwwICsxLDI0MiBAQAorCisvKiBhdXRvZ2VuZXJhdGVkIGZyb20gZ3N0dmlkZW9ib3hvcmMub3JjICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpZm5kZWYgX09SQ19JTlRFR0VSX1RZUEVERUZTXworI2RlZmluZSBfT1JDX0lOVEVHRVJfVFlQRURFRlNfCisjaWYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyNpbmNsdWRlIDxzdGRpbnQuaD4KK3R5cGVkZWYgaW50OF90IG9yY19pbnQ4OwordHlwZWRlZiBpbnQxNl90IG9yY19pbnQxNjsKK3R5cGVkZWYgaW50MzJfdCBvcmNfaW50MzI7Cit0eXBlZGVmIGludDY0X3Qgb3JjX2ludDY0OwordHlwZWRlZiB1aW50OF90IG9yY191aW50ODsKK3R5cGVkZWYgdWludDE2X3Qgb3JjX3VpbnQxNjsKK3R5cGVkZWYgdWludDMyX3Qgb3JjX3VpbnQzMjsKK3R5cGVkZWYgdWludDY0X3Qgb3JjX3VpbnQ2NDsKKyNkZWZpbmUgT1JDX1VJTlQ2NF9DKHgpIFVJTlQ2NF9DKHgpCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQordHlwZWRlZiBzaWduZWQgX19pbnQ4IG9yY19pbnQ4OwordHlwZWRlZiBzaWduZWQgX19pbnQxNiBvcmNfaW50MTY7Cit0eXBlZGVmIHNpZ25lZCBfX2ludDMyIG9yY19pbnQzMjsKK3R5cGVkZWYgc2lnbmVkIF9faW50NjQgb3JjX2ludDY0OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDggb3JjX3VpbnQ4OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDE2IG9yY191aW50MTY7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50MzIgb3JjX3VpbnQzMjsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgKHgjI1VpNjQpCisjZGVmaW5lIGlubGluZSBfX2lubGluZQorI2Vsc2UKKyNpbmNsdWRlIDxsaW1pdHMuaD4KK3R5cGVkZWYgc2lnbmVkIGNoYXIgb3JjX2ludDg7Cit0eXBlZGVmIHNob3J0IG9yY19pbnQxNjsKK3R5cGVkZWYgaW50IG9yY19pbnQzMjsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBvcmNfdWludDg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IG9yY191aW50MTY7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBvcmNfdWludDMyOworI2lmIElOVF9NQVggPT0gTE9OR19NQVgKK3R5cGVkZWYgbG9uZyBsb25nIG9yY19pbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSAoeCMjVUxMKQorI2Vsc2UKK3R5cGVkZWYgbG9uZyBvcmNfaW50NjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgb3JjX3VpbnQ2NDsKKyNkZWZpbmUgT1JDX1VJTlQ2NF9DKHgpICh4IyNVTCkKKyNlbmRpZgorI2VuZGlmCit0eXBlZGVmIHVuaW9uCit7CisgIG9yY19pbnQxNiBpOworICBvcmNfaW50OCB4MlsyXTsKK30gb3JjX3VuaW9uMTY7Cit0eXBlZGVmIHVuaW9uCit7CisgIG9yY19pbnQzMiBpOworICBmbG9hdCBmOworICBvcmNfaW50MTYgeDJbMl07CisgIG9yY19pbnQ4IHg0WzRdOworfSBvcmNfdW5pb24zMjsKK3R5cGVkZWYgdW5pb24KK3sKKyAgb3JjX2ludDY0IGk7CisgIGRvdWJsZSBmOworICBvcmNfaW50MzIgeDJbMl07CisgIGZsb2F0IHgyZlsyXTsKKyAgb3JjX2ludDE2IHg0WzRdOworfSBvcmNfdW5pb242NDsKKyNlbmRpZgorI2lmbmRlZiBPUkNfUkVTVFJJQ1QKKyNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorI2RlZmluZSBPUkNfUkVTVFJJQ1QgcmVzdHJpY3QKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID49IDQKKyNkZWZpbmUgT1JDX1JFU1RSSUNUIF9fcmVzdHJpY3RfXworI2Vsc2UKKyNkZWZpbmUgT1JDX1JFU1RSSUNUCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIE9SQ19JTlRFUk5BTAorI2lmIGRlZmluZWQoX19TVU5QUk9fQykgJiYgKF9fU1VOUFJPX0MgPj0gMHg1OTApCisjZGVmaW5lIE9SQ19JTlRFUk5BTCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisjZWxpZiBkZWZpbmVkKF9fU1VOUFJPX0MpICYmIChfX1NVTlBST19DID49IDB4NTUwKQorI2RlZmluZSBPUkNfSU5URVJOQUwgX19oaWRkZW4KKyNlbGlmIGRlZmluZWQgKF9fR05VQ19fKQorI2RlZmluZSBPUkNfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlkZGVuIikpKQorI2Vsc2UKKyNkZWZpbmUgT1JDX0lOVEVSTkFMCisjZW5kaWYKKyNlbmRpZgorCisKKyNpZm5kZWYgRElTQUJMRV9PUkMKKyNpbmNsdWRlIDxvcmMvb3JjLmg+CisjZW5kaWYKK3ZvaWQgdmlkZW9fYm94X29yY19zcGxhdF91MzIgKGd1aW50MzIgKiBPUkNfUkVTVFJJQ1QgZDEsIGludCBwMSwgaW50IG4pOworCisKKy8qIGJlZ2luIE9yYyBDIHRhcmdldCBwcmVhbWJsZSAqLworI2RlZmluZSBPUkNfQ0xBTVAoeCxhLGIpICgoeCk8KGEpID8gKGEpIDogKCh4KT4oYikgPyAoYikgOiAoeCkpKQorI2RlZmluZSBPUkNfQUJTKGEpICgoYSk8MCA/IC0oYSkgOiAoYSkpCisjZGVmaW5lIE9SQ19NSU4oYSxiKSAoKGEpPChiKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgT1JDX01BWChhLGIpICgoYSk+KGIpID8gKGEpIDogKGIpKQorI2RlZmluZSBPUkNfU0JfTUFYIDEyNworI2RlZmluZSBPUkNfU0JfTUlOICgtMS1PUkNfU0JfTUFYKQorI2RlZmluZSBPUkNfVUJfTUFYIChvcmNfdWludDgpIDI1NQorI2RlZmluZSBPUkNfVUJfTUlOIDAKKyNkZWZpbmUgT1JDX1NXX01BWCAzMjc2NworI2RlZmluZSBPUkNfU1dfTUlOICgtMS1PUkNfU1dfTUFYKQorI2RlZmluZSBPUkNfVVdfTUFYIChvcmNfdWludDE2KTY1NTM1CisjZGVmaW5lIE9SQ19VV19NSU4gMAorI2RlZmluZSBPUkNfU0xfTUFYIDIxNDc0ODM2NDcKKyNkZWZpbmUgT1JDX1NMX01JTiAoLTEtT1JDX1NMX01BWCkKKyNkZWZpbmUgT1JDX1VMX01BWCA0Mjk0OTY3Mjk1VQorI2RlZmluZSBPUkNfVUxfTUlOIDAKKyNkZWZpbmUgT1JDX0NMQU1QX1NCKHgpIE9SQ19DTEFNUCh4LE9SQ19TQl9NSU4sT1JDX1NCX01BWCkKKyNkZWZpbmUgT1JDX0NMQU1QX1VCKHgpIE9SQ19DTEFNUCh4LE9SQ19VQl9NSU4sT1JDX1VCX01BWCkKKyNkZWZpbmUgT1JDX0NMQU1QX1NXKHgpIE9SQ19DTEFNUCh4LE9SQ19TV19NSU4sT1JDX1NXX01BWCkKKyNkZWZpbmUgT1JDX0NMQU1QX1VXKHgpIE9SQ19DTEFNUCh4LE9SQ19VV19NSU4sT1JDX1VXX01BWCkKKyNkZWZpbmUgT1JDX0NMQU1QX1NMKHgpIE9SQ19DTEFNUCh4LE9SQ19TTF9NSU4sT1JDX1NMX01BWCkKKyNkZWZpbmUgT1JDX0NMQU1QX1VMKHgpIE9SQ19DTEFNUCh4LE9SQ19VTF9NSU4sT1JDX1VMX01BWCkKKyNkZWZpbmUgT1JDX1NXQVBfVyh4KSAoKCgoeCkmMHhmZlUpPDw4KSB8ICgoKHgpJjB4ZmYwMFUpPj44KSkKKyNkZWZpbmUgT1JDX1NXQVBfTCh4KSAoKCgoeCkmMHhmZlUpPDwyNCkgfCAoKCh4KSYweGZmMDBVKTw8OCkgfCAoKCh4KSYweGZmMDAwMFUpPj44KSB8ICgoKHgpJjB4ZmYwMDAwMDBVKT4+MjQpKQorI2RlZmluZSBPUkNfU1dBUF9RKHgpICgoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZikpPDw1NikgfCAoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZjAwKSk8PDQwKSB8ICgoKHgpJk9SQ19VSU5UNjRfQygweGZmMDAwMCkpPDwyNCkgfCAoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZjAwMDAwMCkpPDw4KSB8ICgoKHgpJk9SQ19VSU5UNjRfQygweGZmMDAwMDAwMDApKT4+OCkgfCAoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZjAwMDAwMDAwMDApKT4+MjQpIHwgKCgoeCkmT1JDX1VJTlQ2NF9DKDB4ZmYwMDAwMDAwMDAwMDApKT4+NDApIHwgKCgoeCkmT1JDX1VJTlQ2NF9DKDB4ZmYwMDAwMDAwMDAwMDAwMCkpPj41NikpCisjZGVmaW5lIE9SQ19QVFJfT0ZGU0VUKHB0cixvZmZzZXQpICgodm9pZCAqKSgoKHVuc2lnbmVkIGNoYXIgKikocHRyKSkgKyAob2Zmc2V0KSkpCisjZGVmaW5lIE9SQ19ERU5PUk1BTCh4KSAoKHgpICYgKCgoKHgpJjB4N2Y4MDAwMDApID09IDApID8gMHhmZjgwMDAwMCA6IDB4ZmZmZmZmZmYpKQorI2RlZmluZSBPUkNfSVNOQU4oeCkgKCgoKHgpJjB4N2Y4MDAwMDApID09IDB4N2Y4MDAwMDApICYmICgoKHgpJjB4MDA3ZmZmZmYpICE9IDApKQorI2RlZmluZSBPUkNfREVOT1JNQUxfRE9VQkxFKHgpICgoeCkgJiAoKCgoeCkmT1JDX1VJTlQ2NF9DKDB4N2ZmMDAwMDAwMDAwMDAwMCkpID09IDApID8gT1JDX1VJTlQ2NF9DKDB4ZmZmMDAwMDAwMDAwMDAwMCkgOiBPUkNfVUlOVDY0X0MoMHhmZmZmZmZmZmZmZmZmZmZmKSkpCisjZGVmaW5lIE9SQ19JU05BTl9ET1VCTEUoeCkgKCgoKHgpJk9SQ19VSU5UNjRfQygweDdmZjAwMDAwMDAwMDAwMDApKSA9PSBPUkNfVUlOVDY0X0MoMHg3ZmYwMDAwMDAwMDAwMDAwKSkgJiYgKCgoeCkmT1JDX1VJTlQ2NF9DKDB4MDAwZmZmZmZmZmZmZmZmZikpICE9IDApKQorI2lmbmRlZiBPUkNfUkVTVFJJQ1QKKyNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorI2RlZmluZSBPUkNfUkVTVFJJQ1QgcmVzdHJpY3QKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID49IDQKKyNkZWZpbmUgT1JDX1JFU1RSSUNUIF9fcmVzdHJpY3RfXworI2Vsc2UKKyNkZWZpbmUgT1JDX1JFU1RSSUNUCisjZW5kaWYKKyNlbmRpZgorLyogZW5kIE9yYyBDIHRhcmdldCBwcmVhbWJsZSAqLworCisKKworLyogdmlkZW9fYm94X29yY19zcGxhdF91MzIgKi8KKyNpZmRlZiBESVNBQkxFX09SQwordm9pZAordmlkZW9fYm94X29yY19zcGxhdF91MzIgKGd1aW50MzIgKiBPUkNfUkVTVFJJQ1QgZDEsIGludCBwMSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIG9yY191bmlvbjMyIHZhcjMyOworICBvcmNfdW5pb24zMiB2YXIzMzsKKworICBwdHIwID0gKG9yY191bmlvbjMyICopIGQxOworCisgIC8qIDA6IGxvYWRwbCAqLworICB2YXIzMi5pID0gcDE7CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDE6IGNvcHlsICovCisgICAgdmFyMzMuaSA9IHZhcjMyLmk7CisgICAgLyogMjogc3RvcmVsICovCisgICAgcHRyMFtpXSA9IHZhcjMzOworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX3ZpZGVvX2JveF9vcmNfc3BsYXRfdTMyIChPcmNFeGVjdXRvciAqIE9SQ19SRVNUUklDVCBleCkKK3sKKyAgaW50IGk7CisgIGludCBuID0gZXgtPm47CisgIG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgb3JjX3VuaW9uMzIgdmFyMzI7CisgIG9yY191bmlvbjMyIHZhcjMzOworCisgIHB0cjAgPSAob3JjX3VuaW9uMzIgKikgZXgtPmFycmF5c1swXTsKKworICAvKiAwOiBsb2FkcGwgKi8KKyAgdmFyMzIuaSA9IGV4LT5wYXJhbXNbMjRdOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAxOiBjb3B5bCAqLworICAgIHZhcjMzLmkgPSB2YXIzMi5pOworICAgIC8qIDI6IHN0b3JlbCAqLworICAgIHB0cjBbaV0gPSB2YXIzMzsKKyAgfQorCit9CisKK3ZvaWQKK3ZpZGVvX2JveF9vcmNfc3BsYXRfdTMyIChndWludDMyICogT1JDX1JFU1RSSUNUIGQxLCBpbnQgcDEsIGludCBuKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgOSwgMjMsIDExOCwgMTA1LCAxMDAsIDEwMSwgMTExLCA5NSwgOTgsIDExMSwgMTIwLCA5NSwgMTExLCAxMTQsIDk5LAorICAgICAgICA5NSwgMTE1LCAxMTIsIDEwOCwgOTcsIDExNiwgOTUsIDExNywgNTEsIDUwLCAxMSwgNCwgNCwgMTYsIDQsIDExMiwKKyAgICAgICAgMCwgMjQsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwgX2JhY2t1cF92aWRlb19ib3hfb3JjX3NwbGF0X3UzMik7CisjZWxzZQorICAgICAgcCA9IG9yY19wcm9ncmFtX25ldyAoKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9uYW1lIChwLCAidmlkZW9fYm94X29yY19zcGxhdF91MzIiKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsIF9iYWNrdXBfdmlkZW9fYm94X29yY19zcGxhdF91MzIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCA0LCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9wYXJhbWV0ZXIgKHAsIDQsICJwMSIpOworCisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvcHlsIiwgMCwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9QMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9EMV0gPSBkMTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX1AxXSA9IHAxOworCisgIGZ1bmMgPSBjLT5leGVjOworICBmdW5jIChleCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy1kaXN0LmggYi9nc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMtZGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYzJkMGIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMtZGlzdC5oCkBAIC0wLDAgKzEsOTAgQEAKKworLyogYXV0b2dlbmVyYXRlZCBmcm9tIGdzdHZpZGVvYm94b3JjLm9yYyAqLworCisjaWZuZGVmIF9HU1RWSURFT0JPWE9SQ19IXworI2RlZmluZSBfR1NUVklERU9CT1hPUkNfSF8KKworI2luY2x1ZGUgPGdsaWIuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKworI2lmbmRlZiBfT1JDX0lOVEVHRVJfVFlQRURFRlNfCisjZGVmaW5lIF9PUkNfSU5URUdFUl9UWVBFREVGU18KKyNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorI2luY2x1ZGUgPHN0ZGludC5oPgordHlwZWRlZiBpbnQ4X3Qgb3JjX2ludDg7Cit0eXBlZGVmIGludDE2X3Qgb3JjX2ludDE2OwordHlwZWRlZiBpbnQzMl90IG9yY19pbnQzMjsKK3R5cGVkZWYgaW50NjRfdCBvcmNfaW50NjQ7Cit0eXBlZGVmIHVpbnQ4X3Qgb3JjX3VpbnQ4OwordHlwZWRlZiB1aW50MTZfdCBvcmNfdWludDE2OwordHlwZWRlZiB1aW50MzJfdCBvcmNfdWludDMyOwordHlwZWRlZiB1aW50NjRfdCBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgVUlOVDY0X0MoeCkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCit0eXBlZGVmIHNpZ25lZCBfX2ludDggb3JjX2ludDg7Cit0eXBlZGVmIHNpZ25lZCBfX2ludDE2IG9yY19pbnQxNjsKK3R5cGVkZWYgc2lnbmVkIF9faW50MzIgb3JjX2ludDMyOwordHlwZWRlZiBzaWduZWQgX19pbnQ2NCBvcmNfaW50NjQ7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50OCBvcmNfdWludDg7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50MTYgb3JjX3VpbnQxNjsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQzMiBvcmNfdWludDMyOwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSAoeCMjVWk2NCkKKyNkZWZpbmUgaW5saW5lIF9faW5saW5lCisjZWxzZQorI2luY2x1ZGUgPGxpbWl0cy5oPgordHlwZWRlZiBzaWduZWQgY2hhciBvcmNfaW50ODsKK3R5cGVkZWYgc2hvcnQgb3JjX2ludDE2OwordHlwZWRlZiBpbnQgb3JjX2ludDMyOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIG9yY191aW50ODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgb3JjX3VpbnQxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IG9yY191aW50MzI7CisjaWYgSU5UX01BWCA9PSBMT05HX01BWAordHlwZWRlZiBsb25nIGxvbmcgb3JjX2ludDY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgb3JjX3VpbnQ2NDsKKyNkZWZpbmUgT1JDX1VJTlQ2NF9DKHgpICh4IyNVTEwpCisjZWxzZQordHlwZWRlZiBsb25nIG9yY19pbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgKHgjI1VMKQorI2VuZGlmCisjZW5kaWYKK3R5cGVkZWYgdW5pb24geyBvcmNfaW50MTYgaTsgb3JjX2ludDggeDJbMl07IH0gb3JjX3VuaW9uMTY7Cit0eXBlZGVmIHVuaW9uIHsgb3JjX2ludDMyIGk7IGZsb2F0IGY7IG9yY19pbnQxNiB4MlsyXTsgb3JjX2ludDggeDRbNF07IH0gb3JjX3VuaW9uMzI7Cit0eXBlZGVmIHVuaW9uIHsgb3JjX2ludDY0IGk7IGRvdWJsZSBmOyBvcmNfaW50MzIgeDJbMl07IGZsb2F0IHgyZlsyXTsgb3JjX2ludDE2IHg0WzRdOyB9IG9yY191bmlvbjY0OworI2VuZGlmCisjaWZuZGVmIE9SQ19SRVNUUklDVAorI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjZGVmaW5lIE9SQ19SRVNUUklDVCByZXN0cmljdAorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNAorI2RlZmluZSBPUkNfUkVTVFJJQ1QgX19yZXN0cmljdF9fCisjZWxzZQorI2RlZmluZSBPUkNfUkVTVFJJQ1QKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgT1JDX0lOVEVSTkFMCisjaWYgZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU5MCkKKyNkZWZpbmUgT1JDX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNlbGlmIGRlZmluZWQoX19TVU5QUk9fQykgJiYgKF9fU1VOUFJPX0MgPj0gMHg1NTApCisjZGVmaW5lIE9SQ19JTlRFUk5BTCBfX2hpZGRlbgorI2VsaWYgZGVmaW5lZCAoX19HTlVDX18pCisjZGVmaW5lIE9SQ19JTlRFUk5BTCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisjZWxzZQorI2RlZmluZSBPUkNfSU5URVJOQUwKKyNlbmRpZgorI2VuZGlmCisKK3ZvaWQgdmlkZW9fYm94X29yY19zcGxhdF91MzIgKGd1aW50MzIgKiBPUkNfUkVTVFJJQ1QgZDEsIGludCBwMSwgaW50IG4pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLm9yYyBiL2dzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy5vcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiZjllNwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy5vcmMKQEAgLTAsMCArMSw3IEBACisKKy5mdW5jdGlvbiB2aWRlb19ib3hfb3JjX3NwbGF0X3UzMgorLmRlc3QgNCBkMSBndWludDMyCisucGFyYW0gNCBwMQorCitjb3B5bCBkMSwgcDEKKwpkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvYm94L21lc29uLmJ1aWxkIGIvZ3N0L3ZpZGVvYm94L21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMGVkZTAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdmlkZW9ib3gvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwyNyBAQAorb3Jjc3JjID0gJ2dzdHZpZGVvYm94b3JjJworaWYgaGF2ZV9vcmNjCisgIG9yY19oID0gY3VzdG9tX3RhcmdldChvcmNzcmMgKyAnLmgnLAorICAgIGlucHV0IDogb3Jjc3JjICsgJy5vcmMnLAorICAgIG91dHB1dCA6IG9yY3NyYyArICcuaCcsCisgICAgY29tbWFuZCA6IG9yY2NfYXJncyArIFsnLS1oZWFkZXInLCAnLW8nLCAnQE9VVFBVVEAnLCAnQElOUFVUQCddKQorICBvcmNfYyA9IGN1c3RvbV90YXJnZXQob3Jjc3JjICsgJy5jJywKKyAgICBpbnB1dCA6IG9yY3NyYyArICcub3JjJywKKyAgICBvdXRwdXQgOiBvcmNzcmMgKyAnLmMnLAorICAgIGNvbW1hbmQgOiBvcmNjX2FyZ3MgKyBbJy0taW1wbGVtZW50YXRpb24nLCAnLW8nLCAnQE9VVFBVVEAnLCAnQElOUFVUQCddKQorZWxzZQorICBvcmNfaCA9IGNvbmZpZ3VyZV9maWxlKGlucHV0IDogb3Jjc3JjICsgJy1kaXN0LmgnLAorICAgIG91dHB1dCA6IG9yY3NyYyArICcuaCcsCisgICAgY29uZmlndXJhdGlvbiA6IGNvbmZpZ3VyYXRpb25fZGF0YSgpKQorICBvcmNfYyA9IGNvbmZpZ3VyZV9maWxlKGlucHV0IDogb3Jjc3JjICsgJy1kaXN0LmMnLAorICAgIG91dHB1dCA6IG9yY3NyYyArICcuYycsCisgICAgY29uZmlndXJhdGlvbiA6IGNvbmZpZ3VyYXRpb25fZGF0YSgpKQorZW5kaWYKKworZ3N0dmlkZW9ib3ggPSBsaWJyYXJ5KCdnc3R2aWRlb2JveCcsCisgICdnc3R2aWRlb2JveC5jJywgb3JjX2MsIG9yY19oLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW29yY19kZXAsIGdzdGJhc2VfZGVwLCBnc3R2aWRlb19kZXBdLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvY3JvcC9NYWtlZmlsZS5hbSBiL2dzdC92aWRlb2Nyb3AvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyMGMyMQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb2Nyb3AvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMiBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0dmlkZW9jcm9wLmxhCisKKyMgTm90ZTogd2Ugb25seSB1c2UgZGVmaW5lcyBmcm9tIGdzdC92aWRlby92aWRlby5oLCBidXQgbm9uZQorIyBvZiB0aGUgZnVuY3Rpb25zLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgdG8gbGliZ3N0dmlkZW8KKworbGliZ3N0dmlkZW9jcm9wX2xhX1NPVVJDRVMgPSBnc3R2aWRlb2Nyb3AuYyBnc3Rhc3BlY3RyYXRpb2Nyb3AuYworbGliZ3N0dmlkZW9jcm9wX2xhX0NGTEFHUyA9ICQoR1NUX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKQorbGliZ3N0dmlkZW9jcm9wX2xhX0xJQkFERCA9ICQoR1NUX0JBU0VfTElCUykgJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0dmlkZW8tJChHU1RfQVBJX1ZFUlNJT04pCitsaWJnc3R2aWRlb2Nyb3BfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdHZpZGVvY3JvcC5oIGdzdGFzcGVjdHJhdGlvY3JvcC5oCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9jcm9wL2dzdGFzcGVjdHJhdGlvY3JvcC5jIGIvZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzFkOWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYwpAQCAtMCwwICsxLDQ5MSBAQAorLyogR1N0cmVhbWVyIHZpZGVvIGZyYW1lIGNyb3BwaW5nIHRvIGFzcGVjdC1yYXRpbworICogQ29weXJpZ2h0IChDKSAyMDA5IFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXNwZWN0cmF0aW9jcm9wCisgKiBAc2VlX2Fsc286ICNHc3RWaWRlb0Nyb3AKKyAqCisgKiBUaGlzIGVsZW1lbnQgY3JvcHMgdmlkZW8gZnJhbWVzIHRvIGEgc3BlY2lmaWVkICNHc3RBc3BlY3RSYXRpb0Nyb3A6YXNwZWN0LXJhdGlvLgorICoKKyAqIElmIHRoZSBhc3BlY3QtcmF0aW8gaXMgYWxyZWFkeSBjb3JyZWN0LCB0aGUgZWxlbWVudCB3aWxsIG9wZXJhdGUKKyAqIGluIHBhc3MtdGhyb3VnaCBtb2RlLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiB2aWRlb3Rlc3RzcmMgISB2aWRlby94LXJhdyxoZWlnaHQ9NjQwLHdpZHRoPTQ4MCAhIGFzcGVjdHJhdGlvY3JvcCBhc3BlY3QtcmF0aW89MTYvOSAhIHhpbWFnZXNpbmsKKyAqIF18IFRoaXMgcGlwZWxpbmUgZ2VuZXJhdGVzIGEgdmlkZW9zdHJlYW0gaW4gNC8zIGFuZCBjcm9wcyBpdCB0byAxNi85LgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpbmNsdWRlICJnc3Rhc3BlY3RyYXRpb2Nyb3AuaCIKKworI2luY2x1ZGUgImdzdC9nbGliLWNvbXBhdC1wcml2YXRlLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGFzcGVjdF9yYXRpb19jcm9wX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGFzcGVjdF9yYXRpb19jcm9wX2RlYnVnCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0FTUEVDVF9SQVRJT19DUk9QLAorfTsKKworLyogd2Ugc3VwcG9ydCB0aGUgc2FtZSBjYXBzIGFzIHZpZGVvY3JvcCAoc3luYyBjaGFuZ2VzKSAqLworI2RlZmluZSBBU1BFQ1RfUkFUSU9fQ1JPUF9DQVBTICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHU1RfVklERU9fQ0FQU19NQUtFICgieyBSR0J4LCB4UkdCLCBCR1J4LCB4QkdSLCAiICAgIFwKKyAgICAgICJSR0JBLCBBUkdCLCBCR1JBLCBBQkdSLCBSR0IsIEJHUiwgQVlVViwgWVVZMiwgIiBcCisgICAgICAiWVZZVSwgVVlWWSwgSTQyMCwgWVYxMiwgUkdCMTYsIFJHQjE1LCBHUkFZOCwgIiAgXAorICAgICAgIk5WMTIsIE5WMjEsIEdSQVkxNl9MRSwgR1JBWTE2X0JFIH0iKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoQVNQRUNUX1JBVElPX0NST1BfQ0FQUykKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoQVNQRUNUX1JBVElPX0NST1BfQ0FQUykKKyAgICApOworCisjZGVmaW5lIGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RBc3BlY3RSYXRpb0Nyb3AsIGdzdF9hc3BlY3RfcmF0aW9fY3JvcCwgR1NUX1RZUEVfQklOKTsKKworc3RhdGljIHZvaWQgZ3N0X2FzcGVjdF9yYXRpb19jcm9wX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfYXNwZWN0X3JhdGlvX2Nyb3Bfc2V0X2Nyb3BwaW5nIChHc3RBc3BlY3RSYXRpb0Nyb3AgKgorICAgIGFzcGVjdF9yYXRpb19jcm9wLCBnaW50IHRvcCwgZ2ludCByaWdodCwgZ2ludCBib3R0b20sIGdpbnQgbGVmdCk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X2FzcGVjdF9yYXRpb19jcm9wX2dldF9jYXBzIChHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdFF1ZXJ5ICogcXVlcnkpOworc3RhdGljIGdib29sZWFuIGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9zZXRfY2FwcyAoR3N0QXNwZWN0UmF0aW9Dcm9wICoKKyAgICBhc3BlY3RfcmF0aW9fY3JvcCwgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIGdib29sZWFuIGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2dCk7CitzdGF0aWMgdm9pZCBnc3RfYXNwZWN0X3JhdGlvX2Nyb3BfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X2FzcGVjdF9yYXRpb190cmFuc2Zvcm1fc3RydWN0dXJlIChHc3RBc3BlY3RSYXRpb0Nyb3AgKgorICAgIGFzcGVjdF9yYXRpb19jcm9wLCBHc3RTdHJ1Y3R1cmUgKiBzdHJ1Y3R1cmUsIEdzdFN0cnVjdHVyZSAqKiBuZXdfc3RydWN0dXJlLAorICAgIGdib29sZWFuIHNldF92aWRlb2Nyb3ApOworCitzdGF0aWMgdm9pZAorZ3N0X2FzcGVjdF9yYXRpb19jcm9wX3NldF9jcm9wcGluZyAoR3N0QXNwZWN0UmF0aW9Dcm9wICogYXNwZWN0X3JhdGlvX2Nyb3AsCisgICAgZ2ludCB0b3AsIGdpbnQgcmlnaHQsIGdpbnQgYm90dG9tLCBnaW50IGxlZnQpCit7CisgIEdWYWx1ZSB2YWx1ZSA9IHsgMCB9OworICBpZiAoR19VTkxJS0VMWSAoIWFzcGVjdF9yYXRpb19jcm9wLT52aWRlb2Nyb3ApKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhc3BlY3RfcmF0aW9fY3JvcCwKKyAgICAgICAgIkNhbid0IHNldCB0aGUgc2V0dGluZ3MgaWYgdGhlcmUgaXMgbm8gY3JvcHBpbmcgZWxlbWVudCIpOworICAgIHJldHVybjsKKyAgfQorCisgIGdfdmFsdWVfaW5pdCAoJnZhbHVlLCBHX1RZUEVfSU5UKTsKKyAgZ192YWx1ZV9zZXRfaW50ICgmdmFsdWUsIHRvcCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGFzcGVjdF9yYXRpb19jcm9wLCAic2V0IHRvcCBjcm9wcGluZyB0bzogJWQiLCB0b3ApOworICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChhc3BlY3RfcmF0aW9fY3JvcC0+dmlkZW9jcm9wKSwgInRvcCIsCisgICAgICAmdmFsdWUpOworICBnX3ZhbHVlX3NldF9pbnQgKCZ2YWx1ZSwgcmlnaHQpOworICBHU1RfREVCVUdfT0JKRUNUIChhc3BlY3RfcmF0aW9fY3JvcCwgInNldCByaWdodCBjcm9wcGluZyB0bzogJWQiLCByaWdodCk7CisgIGdfb2JqZWN0X3NldF9wcm9wZXJ0eSAoR19PQkpFQ1QgKGFzcGVjdF9yYXRpb19jcm9wLT52aWRlb2Nyb3ApLCAicmlnaHQiLAorICAgICAgJnZhbHVlKTsKKyAgZ192YWx1ZV9zZXRfaW50ICgmdmFsdWUsIGJvdHRvbSk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGFzcGVjdF9yYXRpb19jcm9wLCAic2V0IGJvdHRvbSBjcm9wcGluZyB0bzogJWQiLCBib3R0b20pOworICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChhc3BlY3RfcmF0aW9fY3JvcC0+dmlkZW9jcm9wKSwgImJvdHRvbSIsCisgICAgICAmdmFsdWUpOworICBnX3ZhbHVlX3NldF9pbnQgKCZ2YWx1ZSwgbGVmdCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGFzcGVjdF9yYXRpb19jcm9wLCAic2V0IGxlZnQgY3JvcHBpbmcgdG86ICVkIiwgbGVmdCk7CisgIGdfb2JqZWN0X3NldF9wcm9wZXJ0eSAoR19PQkpFQ1QgKGFzcGVjdF9yYXRpb19jcm9wLT52aWRlb2Nyb3ApLCAibGVmdCIsCisgICAgICAmdmFsdWUpOworCisgIGdfdmFsdWVfdW5zZXQgKCZ2YWx1ZSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FzcGVjdF9yYXRpb19jcm9wX3NldF9jYXBzIChHc3RBc3BlY3RSYXRpb0Nyb3AgKiBhc3BlY3RfcmF0aW9fY3JvcCwKKyAgICBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UGFkICpwZWVyX3BhZDsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGdib29sZWFuIHJldDsKKworICBnX211dGV4X2xvY2sgKCZhc3BlY3RfcmF0aW9fY3JvcC0+Y3JvcF9sb2NrKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgZ3N0X2FzcGVjdF9yYXRpb190cmFuc2Zvcm1fc3RydWN0dXJlIChhc3BlY3RfcmF0aW9fY3JvcCwgc3RydWN0dXJlLCBOVUxMLAorICAgICAgVFJVRSk7CisgIHBlZXJfcGFkID0KKyAgICAgIGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChHU1RfRUxFTUVOVCAoYXNwZWN0X3JhdGlvX2Nyb3AtPnZpZGVvY3JvcCksCisgICAgICAic2luayIpOworICByZXQgPSBnc3RfcGFkX3NldF9jYXBzIChwZWVyX3BhZCwgY2Fwcyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBlZXJfcGFkKTsKKyAgZ19tdXRleF91bmxvY2sgKCZhc3BlY3RfcmF0aW9fY3JvcC0+Y3JvcF9sb2NrKTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYXNwZWN0X3JhdGlvX2Nyb3Bfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldnQpCit7CisgIEdzdEFzcGVjdFJhdGlvQ3JvcCAqYXNwZWN0X3JhdGlvX2Nyb3AgPSBHU1RfQVNQRUNUX1JBVElPX0NST1AgKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZ0KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2dCwgJmNhcHMpOworICAgICAgZ3N0X2FzcGVjdF9yYXRpb19jcm9wX3NldF9jYXBzIChhc3BlY3RfcmF0aW9fY3JvcCwgY2Fwcyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2dCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXNwZWN0X3JhdGlvX2Nyb3BfY2xhc3NfaW5pdCAoR3N0QXNwZWN0UmF0aW9Dcm9wQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2FzcGVjdF9yYXRpb19jcm9wX2ZpbmFsaXplOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQVNQRUNUX1JBVElPX0NST1AsCisgICAgICBnc3RfcGFyYW1fc3BlY19mcmFjdGlvbiAoImFzcGVjdC1yYXRpbyIsICJhc3BlY3QtcmF0aW8iLAorICAgICAgICAgICJUYXJnZXQgYXNwZWN0LXJhdGlvIG9mIHZpZGVvIiwgMCwgMSwgR19NQVhJTlQsIDEsIDAsIDEsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgImFzcGVjdHJhdGlvY3JvcCIsCisgICAgICAiRmlsdGVyL0VmZmVjdC9WaWRlbyIsCisgICAgICAiQ3JvcHMgdmlkZW8gaW50byBhIHVzZXItZGVmaW5lZCBhc3BlY3QtcmF0aW8iLAorICAgICAgIlRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2FzcGVjdF9yYXRpb19jcm9wX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RBc3BlY3RSYXRpb0Nyb3AgKmFzcGVjdF9yYXRpb19jcm9wOworCisgIGFzcGVjdF9yYXRpb19jcm9wID0gR1NUX0FTUEVDVF9SQVRJT19DUk9QIChvYmplY3QpOworCisgIGdfbXV0ZXhfY2xlYXIgKCZhc3BlY3RfcmF0aW9fY3JvcC0+Y3JvcF9sb2NrKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXNwZWN0X3JhdGlvX2Nyb3BfaW5pdCAoR3N0QXNwZWN0UmF0aW9Dcm9wICogYXNwZWN0X3JhdGlvX2Nyb3ApCit7CisgIEdzdFBhZCAqbGlua19wYWQ7CisgIEdzdFBhZCAqc3JjX3BhZDsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoYXNwZWN0X3JhdGlvX2Nyb3BfZGVidWcsICJhc3BlY3RyYXRpb2Nyb3AiLCAwLAorICAgICAgImFzcGVjdHJhdGlvY3JvcCIpOworCisgIGFzcGVjdF9yYXRpb19jcm9wLT5hcl9udW0gPSAwOworICBhc3BlY3RfcmF0aW9fY3JvcC0+YXJfZGVub20gPSAxOworCisgIGdfbXV0ZXhfaW5pdCAoJmFzcGVjdF9yYXRpb19jcm9wLT5jcm9wX2xvY2spOworCisgIC8qIGFkZCB0aGUgdHJhbnNmb3JtIGVsZW1lbnQgKi8KKyAgYXNwZWN0X3JhdGlvX2Nyb3AtPnZpZGVvY3JvcCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvY3JvcCIsIE5VTEwpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAoYXNwZWN0X3JhdGlvX2Nyb3ApLCBhc3BlY3RfcmF0aW9fY3JvcC0+dmlkZW9jcm9wKTsKKworICAvKiBjcmVhdGUgZ2hvc3QgcGFkIHNyYyAqLworICBsaW5rX3BhZCA9CisgICAgICBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoR1NUX0VMRU1FTlQgKGFzcGVjdF9yYXRpb19jcm9wLT52aWRlb2Nyb3ApLAorICAgICAgInNyYyIpOworICBzcmNfcGFkID0gZ3N0X2dob3N0X3BhZF9uZXcgKCJzcmMiLCBsaW5rX3BhZCk7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChzcmNfcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9zcmNfcXVlcnkpKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKGFzcGVjdF9yYXRpb19jcm9wKSwgc3JjX3BhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGxpbmtfcGFkKTsKKyAgLyogY3JlYXRlIGdob3N0IHBhZCBzaW5rICovCisgIGxpbmtfcGFkID0KKyAgICAgIGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChHU1RfRUxFTUVOVCAoYXNwZWN0X3JhdGlvX2Nyb3AtPnZpZGVvY3JvcCksCisgICAgICAic2luayIpOworICBhc3BlY3RfcmF0aW9fY3JvcC0+c2luayA9IGdzdF9naG9zdF9wYWRfbmV3ICgic2luayIsIGxpbmtfcGFkKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKGFzcGVjdF9yYXRpb19jcm9wKSwKKyAgICAgIGFzcGVjdF9yYXRpb19jcm9wLT5zaW5rKTsKKyAgZ3N0X29iamVjdF91bnJlZiAobGlua19wYWQpOworCisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChhc3BlY3RfcmF0aW9fY3JvcC0+c2luaywKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXNwZWN0X3JhdGlvX2Nyb3Bfc2lua19ldmVudCkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2FzcGVjdF9yYXRpb190cmFuc2Zvcm1fc3RydWN0dXJlIChHc3RBc3BlY3RSYXRpb0Nyb3AgKiBhc3BlY3RfcmF0aW9fY3JvcCwKKyAgICBHc3RTdHJ1Y3R1cmUgKiBzdHJ1Y3R1cmUsIEdzdFN0cnVjdHVyZSAqKiBuZXdfc3RydWN0dXJlLAorICAgIGdib29sZWFuIHNldF92aWRlb2Nyb3ApCit7CisgIGdkb3VibGUgaW5jb21pbmdfYXI7CisgIGdkb3VibGUgcmVxdWVzdGVkX2FyOworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgY3JvcHZhbHVlOworICBnaW50IHBhcl9kLCBwYXJfbjsKKworICAvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgYXNwZWN0IHJhdGlvICovCisgIGlmIChhc3BlY3RfcmF0aW9fY3JvcC0+YXJfbnVtIDwgMSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFzcGVjdF9yYXRpb19jcm9wLCAiTm8gY3JvcHBpbmcgcmVxdWVzdGVkIik7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIC8qIGdldCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgY2FwcyAqLworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAid2lkdGgiLCAmd2lkdGgpIHx8CisgICAgICAhZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJoZWlnaHQiLCAmaGVpZ2h0KSkKKyAgICBnb3RvIGJlYWNoOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfZnJhY3Rpb24gKHN0cnVjdHVyZSwgInBpeGVsLWFzcGVjdC1yYXRpbyIsCisgICAgICAgICAgJnBhcl9uLCAmcGFyX2QpKSB7CisgICAgcGFyX2QgPSBwYXJfbiA9IDE7CisgIH0KKworICBpbmNvbWluZ19hciA9ICgoZ2RvdWJsZSkgKHdpZHRoICogcGFyX24pKSAvIChoZWlnaHQgKiBwYXJfZCk7CisgIEdTVF9MT0dfT0JKRUNUIChhc3BlY3RfcmF0aW9fY3JvcCwKKyAgICAgICJpbmNvbWluZyBjYXBzIHdpZHRoKCVkKSwgaGVpZ2h0KCVkKSwgcGFyICglZC8lZCkgOiBhciA9ICVmIiwgd2lkdGgsCisgICAgICBoZWlnaHQsIHBhcl9uLCBwYXJfZCwgaW5jb21pbmdfYXIpOworCisgIHJlcXVlc3RlZF9hciA9CisgICAgICAoZ2RvdWJsZSkgYXNwZWN0X3JhdGlvX2Nyb3AtPmFyX251bSAvIGFzcGVjdF9yYXRpb19jcm9wLT5hcl9kZW5vbTsKKworICAvKiBjaGVjayBpZiB0aGUgb3JpZ2luYWwgYXNwZWN0LXJhdGlvIGlzIHRoZSBhc3BlY3QtcmF0aW8gdGhhdCB3ZSB3YW50ICovCisgIGlmIChyZXF1ZXN0ZWRfYXIgPT0gaW5jb21pbmdfYXIpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhc3BlY3RfcmF0aW9fY3JvcCwKKyAgICAgICAgIklucHV0IHZpZGVvIGFscmVhZHkgaGFzIHRoZSBjb3JyZWN0IGFzcGVjdCByYXRpbyAoJS4zZiA9PSAlLjNmKSIsCisgICAgICAgIGluY29taW5nX2FyLCByZXF1ZXN0ZWRfYXIpOworICAgIGdvdG8gYmVhY2g7CisgIH0gZWxzZSBpZiAocmVxdWVzdGVkX2FyID4gaW5jb21pbmdfYXIpIHsKKyAgICAvKiBmaXggYXNwZWN0IHJhdGlvIHdpdGggY3JvcHBpbmcgb24gdG9wIGFuZCBib3R0b20gKi8KKyAgICBjcm9wdmFsdWUgPQorICAgICAgICAoKCgoZG91YmxlKSBhc3BlY3RfcmF0aW9fY3JvcC0+YXJfZGVub20gLworICAgICAgICAgICAgICAgIChkb3VibGUpIChhc3BlY3RfcmF0aW9fY3JvcC0+YXJfbnVtKSkgKiAoKGRvdWJsZSkgcGFyX24gLworICAgICAgICAgICAgICAgIChkb3VibGUpIHBhcl9kKSAqIHdpZHRoKSAtIGhlaWdodCkgLyAyOworICAgIGlmIChjcm9wdmFsdWUgPCAwKSB7CisgICAgICBjcm9wdmFsdWUgKj0gLTE7CisgICAgfQorICAgIGlmIChjcm9wdmFsdWUgPj0gKGhlaWdodCAvIDIpKQorICAgICAgZ290byBjcm9wX2ZhaWxlZDsKKyAgICBpZiAoc2V0X3ZpZGVvY3JvcCkgeworICAgICAgZ3N0X2FzcGVjdF9yYXRpb19jcm9wX3NldF9jcm9wcGluZyAoYXNwZWN0X3JhdGlvX2Nyb3AsIGNyb3B2YWx1ZSwgMCwKKyAgICAgICAgICBjcm9wdmFsdWUsIDApOworICAgIH0KKyAgICBpZiAobmV3X3N0cnVjdHVyZSkgeworICAgICAgKm5ld19zdHJ1Y3R1cmUgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHN0cnVjdHVyZSk7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoKm5ld19zdHJ1Y3R1cmUsCisgICAgICAgICAgImhlaWdodCIsIEdfVFlQRV9JTlQsIChpbnQpIChoZWlnaHQgLSAoY3JvcHZhbHVlICogMikpLCBOVUxMKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogZml4IGFzcGVjdCByYXRpbyB3aXRoIGNyb3BwaW5nIG9uIGxlZnQgYW5kIHJpZ2h0ICovCisgICAgY3JvcHZhbHVlID0KKyAgICAgICAgKCgoKGRvdWJsZSkgYXNwZWN0X3JhdGlvX2Nyb3AtPmFyX251bSAvCisgICAgICAgICAgICAgICAgKGRvdWJsZSkgKGFzcGVjdF9yYXRpb19jcm9wLT5hcl9kZW5vbSkpICogKChkb3VibGUpIHBhcl9kIC8KKyAgICAgICAgICAgICAgICAoZG91YmxlKSBwYXJfbikgKiBoZWlnaHQpIC0gd2lkdGgpIC8gMjsKKyAgICBpZiAoY3JvcHZhbHVlIDwgMCkgeworICAgICAgY3JvcHZhbHVlICo9IC0xOworICAgIH0KKyAgICBpZiAoY3JvcHZhbHVlID49ICh3aWR0aCAvIDIpKQorICAgICAgZ290byBjcm9wX2ZhaWxlZDsKKyAgICBpZiAoc2V0X3ZpZGVvY3JvcCkgeworICAgICAgZ3N0X2FzcGVjdF9yYXRpb19jcm9wX3NldF9jcm9wcGluZyAoYXNwZWN0X3JhdGlvX2Nyb3AsIDAsIGNyb3B2YWx1ZSwKKyAgICAgICAgICAwLCBjcm9wdmFsdWUpOworICAgIH0KKyAgICBpZiAobmV3X3N0cnVjdHVyZSkgeworICAgICAgKm5ld19zdHJ1Y3R1cmUgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHN0cnVjdHVyZSk7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoKm5ld19zdHJ1Y3R1cmUsCisgICAgICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgKGludCkgKHdpZHRoIC0gKGNyb3B2YWx1ZSAqIDIpKSwgTlVMTCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuOworCitjcm9wX2ZhaWxlZDoKKyAgR1NUX1dBUk5JTkdfT0JKRUNUIChhc3BlY3RfcmF0aW9fY3JvcCwKKyAgICAgICJjYW4ndCBjcm9wIHRvIGFzcGVjdCByYXRpbyByZXF1ZXN0ZWQiKTsKKyAgZ290byBiZWFjaDsKK2JlYWNoOgorICBpZiAoc2V0X3ZpZGVvY3JvcCkgeworICAgIGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9zZXRfY3JvcHBpbmcgKGFzcGVjdF9yYXRpb19jcm9wLCAwLCAwLCAwLCAwKTsKKyAgfQorCisgIGlmIChuZXdfc3RydWN0dXJlKSB7CisgICAgKm5ld19zdHJ1Y3R1cmUgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHN0cnVjdHVyZSk7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X2FzcGVjdF9yYXRpb19jcm9wX3RyYW5zZm9ybV9jYXBzIChHc3RBc3BlY3RSYXRpb0Nyb3AgKiBhc3BlY3RfcmF0aW9fY3JvcCwKKyAgICBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0Q2FwcyAqdHJhbnNmb3JtOworICBnaW50IHNpemUsIGk7CisKKyAgdHJhbnNmb3JtID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIHNpemUgPSBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIEdzdFN0cnVjdHVyZSAqczsKKyAgICBHc3RTdHJ1Y3R1cmUgKnRyYW5zX3M7CisKKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSk7CisKKyAgICBnc3RfYXNwZWN0X3JhdGlvX3RyYW5zZm9ybV9zdHJ1Y3R1cmUgKGFzcGVjdF9yYXRpb19jcm9wLCBzLCAmdHJhbnNfcywKKyAgICAgICAgRkFMU0UpOworICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKHRyYW5zZm9ybSwgdHJhbnNfcyk7CisgIH0KKworICByZXR1cm4gdHJhbnNmb3JtOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfYXNwZWN0X3JhdGlvX2Nyb3BfZ2V0X2NhcHMgKEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0UGFkICpwZWVyOworICBHc3RBc3BlY3RSYXRpb0Nyb3AgKmFzcGVjdF9yYXRpb19jcm9wOworICBHc3RDYXBzICpyZXR1cm5fY2FwczsKKworICBhc3BlY3RfcmF0aW9fY3JvcCA9IEdTVF9BU1BFQ1RfUkFUSU9fQ1JPUCAoZ3N0X3BhZF9nZXRfcGFyZW50IChwYWQpKTsKKworICBnX211dGV4X2xvY2sgKCZhc3BlY3RfcmF0aW9fY3JvcC0+Y3JvcF9sb2NrKTsKKworICBwZWVyID0gZ3N0X3BhZF9nZXRfcGVlciAoYXNwZWN0X3JhdGlvX2Nyb3AtPnNpbmspOworICBpZiAocGVlciA9PSBOVUxMKSB7CisgICAgcmV0dXJuX2NhcHMgPSBnc3Rfc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXRfY2FwcyAoJnNyY190ZW1wbGF0ZSk7CisgIH0gZWxzZSB7CisgICAgR3N0Q2FwcyAqcGVlcl9jYXBzOworCisgICAgcGVlcl9jYXBzID0gZ3N0X3BhZF9xdWVyeV9jYXBzIChwZWVyLCBmaWx0ZXIpOworICAgIHJldHVybl9jYXBzID0KKyAgICAgICAgZ3N0X2FzcGVjdF9yYXRpb19jcm9wX3RyYW5zZm9ybV9jYXBzIChhc3BlY3RfcmF0aW9fY3JvcCwgcGVlcl9jYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcl9jYXBzKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwZWVyKTsKKyAgfQorCisgIGdfbXV0ZXhfdW5sb2NrICgmYXNwZWN0X3JhdGlvX2Nyb3AtPmNyb3BfbG9jayk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGFzcGVjdF9yYXRpb19jcm9wKTsKKworICBpZiAocmV0dXJuX2NhcHMgJiYgZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqdG1wID0KKyAgICAgICAgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgcmV0dXJuX2NhcHMsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfcmVwbGFjZSAoJnJldHVybl9jYXBzLCB0bXApOworICAgIGdzdF9jYXBzX3VucmVmICh0bXApOworICB9CisKKyAgcmV0dXJuIHJldHVybl9jYXBzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hc3BlY3RfcmF0aW9fY3JvcF9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqZmlsdGVyLCAqY2FwczsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2NhcHMgKHF1ZXJ5LCAmZmlsdGVyKTsKKyAgICAgIGNhcHMgPSBnc3RfYXNwZWN0X3JhdGlvX2Nyb3BfZ2V0X2NhcHMgKHBhZCwgZmlsdGVyKTsKKyAgICAgIGdzdF9xdWVyeV9zZXRfY2Fwc19yZXN1bHQgKHF1ZXJ5LCBjYXBzKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXNwZWN0X3JhdGlvX2Nyb3Bfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEFzcGVjdFJhdGlvQ3JvcCAqYXNwZWN0X3JhdGlvX2Nyb3A7CisgIGdib29sZWFuIHJlY2hlY2sgPSBGQUxTRTsKKworICBhc3BlY3RfcmF0aW9fY3JvcCA9IEdTVF9BU1BFQ1RfUkFUSU9fQ1JPUCAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGFzcGVjdF9yYXRpb19jcm9wKTsKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0FTUEVDVF9SQVRJT19DUk9QOgorICAgICAgaWYgKEdTVF9WQUxVRV9IT0xEU19GUkFDVElPTiAodmFsdWUpKSB7CisgICAgICAgIGFzcGVjdF9yYXRpb19jcm9wLT5hcl9udW0gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX251bWVyYXRvciAodmFsdWUpOworICAgICAgICBhc3BlY3RfcmF0aW9fY3JvcC0+YXJfZGVub20gPQorICAgICAgICAgICAgZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9kZW5vbWluYXRvciAodmFsdWUpOworICAgICAgICByZWNoZWNrID0gZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChhc3BlY3RfcmF0aW9fY3JvcC0+c2luayk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChhc3BlY3RfcmF0aW9fY3JvcCk7CisKKyAgaWYgKHJlY2hlY2spIHsKKyAgICBHc3RDYXBzICpjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChhc3BlY3RfcmF0aW9fY3JvcC0+c2luayk7CisgICAgaWYgKGNhcHMgIT0gTlVMTCkgeworICAgICAgZ3N0X2FzcGVjdF9yYXRpb19jcm9wX3NldF9jYXBzIChhc3BlY3RfcmF0aW9fY3JvcCwgY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXNwZWN0X3JhdGlvX2Nyb3BfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEFzcGVjdFJhdGlvQ3JvcCAqYXNwZWN0X3JhdGlvX2Nyb3A7CisKKyAgYXNwZWN0X3JhdGlvX2Nyb3AgPSBHU1RfQVNQRUNUX1JBVElPX0NST1AgKG9iamVjdCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChhc3BlY3RfcmF0aW9fY3JvcCk7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9BU1BFQ1RfUkFUSU9fQ1JPUDoKKyAgICAgIGdzdF92YWx1ZV9zZXRfZnJhY3Rpb24gKHZhbHVlLCBhc3BlY3RfcmF0aW9fY3JvcC0+YXJfbnVtLAorICAgICAgICAgIGFzcGVjdF9yYXRpb19jcm9wLT5hcl9kZW5vbSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChhc3BlY3RfcmF0aW9fY3JvcCk7Cit9CmRpZmYgLS1naXQgYS9nc3QvdmlkZW9jcm9wL2dzdGFzcGVjdHJhdGlvY3JvcC5oIGIvZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2FlYjVjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuaApAQCAtMCwwICsxLDY3IEBACisvKiBHU3RyZWFtZXIgdmlkZW8gZnJhbWUgY3JvcHBpbmcgdG8gYXNwZWN0LXJhdGlvCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0FTUEVDVF9SQVRJT19DUk9QX0hfXworI2RlZmluZSBfX0dTVF9BU1BFQ1RfUkFUSU9fQ1JPUF9IX18KKworI2luY2x1ZGUgPGdzdC9nc3RiaW4uaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0FTUEVDVF9SQVRJT19DUk9QIFwKKyAgKGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVNQRUNUX1JBVElPX0NST1Aob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9BU1BFQ1RfUkFUSU9fQ1JPUCxHc3RBc3BlY3RSYXRpb0Nyb3ApKQorI2RlZmluZSBHU1RfQVNQRUNUX1JBVElPX0NST1BfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfQVNQRUNUX1JBVElPX0NST1AsR3N0QXNwZWN0UmF0aW9Dcm9wQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQVNQRUNUX1JBVElPX0NST1Aob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9BU1BFQ1RfUkFUSU9fQ1JPUCkpCisjZGVmaW5lIEdTVF9JU19BU1BFQ1RfUkFUSU9fQ1JPUF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9BU1BFQ1RfUkFUSU9fQ1JPUCkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBc3BlY3RSYXRpb0Nyb3AgR3N0QXNwZWN0UmF0aW9Dcm9wOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEFzcGVjdFJhdGlvQ3JvcENsYXNzIEdzdEFzcGVjdFJhdGlvQ3JvcENsYXNzOworCitzdHJ1Y3QgX0dzdEFzcGVjdFJhdGlvQ3JvcAoreworICBHc3RCaW4gcGFyZW50OworCisgIC8qIG91ciB2aWRlb2Nyb3AgZWxlbWVudCAqLworICBHc3RFbGVtZW50ICp2aWRlb2Nyb3A7CisKKyAgR3N0UGFkICpzaW5rOworCisgIC8qIHRhcmdldCBhc3BlY3QgcmF0aW8gKi8KKyAgZ2ludCBhcl9udW07IC8qIGlmIDwgMSB0aGVuIGRvbid0IGNoYW5nZSBhciAqLworICBnaW50IGFyX2Rlbm9tOworCisgIEdNdXRleCBjcm9wX2xvY2s7Cit9OworCitzdHJ1Y3QgX0dzdEFzcGVjdFJhdGlvQ3JvcENsYXNzCit7CisgIEdzdEJpbkNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9BU1BFQ1RfUkFUSU9fQ1JPUF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYyBiL2dzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlN2Q2NwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmMKQEAgLTAsMCArMSw5MTkgQEAKKy8qIEdTdHJlYW1lciB2aWRlbyBmcmFtZSBjcm9wcGluZworICogQ29weXJpZ2h0IChDKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtdmlkZW9jcm9wCisgKiBAc2VlX2Fsc286ICNHc3RWaWRlb0JveAorICoKKyAqIFRoaXMgZWxlbWVudCBjcm9wcyB2aWRlbyBmcmFtZXMsIG1lYW5pbmcgaXQgY2FuIHJlbW92ZSBwYXJ0cyBvZiB0aGUKKyAqIHBpY3R1cmUgb24gdGhlIGxlZnQsIHJpZ2h0LCB0b3Agb3IgYm90dG9tIG9mIHRoZSBwaWN0dXJlIGFuZCBvdXRwdXQKKyAqIGEgc21hbGxlciBwaWN0dXJlIHRoYW4gdGhlIGlucHV0IHBpY3R1cmUsIHdpdGggdGhlIHVud2FudGVkIHBhcnRzIGF0IHRoZQorICogYm9yZGVyIHJlbW92ZWQuCisgKgorICogVGhlIHZpZGVvY3JvcCBlbGVtZW50IGlzIHNpbWlsYXIgdG8gdGhlIHZpZGVvYm94IGVsZW1lbnQsIGJ1dCBpdHMgbWFpbgorICogZ29hbCBpcyB0byBzdXBwb3J0IGEgbXVsdGl0dWRlIG9mIGZvcm1hdHMgYXMgZWZmaWNpZW50bHkgYXMgcG9zc2libGUuCisgKiBVbmxpa2UgdmlkZWJveCwgaXQgY2Fubm90IGFkZCBib3JkZXJzIHRvIHRoZSBwaWN0dXJlIGFuZCB1bmxpa2UgdmlkZWJveAorICogaXQgd2lsbCBhbHdheXMgb3V0cHV0IGltYWdlcyBpbiBleGFjdGx5IHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgaW5wdXQgaW1hZ2UuCisgKgorICogSWYgdGhlcmUgaXMgbm90aGluZyB0byBjcm9wLCB0aGUgZWxlbWVudCB3aWxsIG9wZXJhdGUgaW4gcGFzcy10aHJvdWdoIG1vZGUuCisgKgorICogTm90ZSB0aGF0IG5vIHNwZWNpYWwgZWZmb3J0cyBhcmUgbWFkZSB0byBoYW5kbGUgY2hyb21hLXN1YnNhbXBsZWQgZm9ybWF0cworICogaW4gdGhlIGNhc2Ugb2Ygb2RkLXZhbHVlZCBjcm9wcGluZyBhbmQgY29tcGVuc2F0ZSBmb3Igc3ViLXVuaXQgY2hyb21hIHBsYW5lCisgKiBzaGlmdHMgZm9yIHN1Y2ggZm9ybWF0cyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgI0dzdFZpZGVvQ3JvcDpsZWZ0IG9yCisgKiAjR3N0VmlkZW9Dcm9wOnRvcCBwcm9wZXJ0eSBpcyBzZXQgdG8gYW4gb2RkIG51bWJlci4gVGhpcyBkb2Vzbid0IG1hdHRlciBmb3IgCisgKiBtb3N0IHVzZSBjYXNlcywgYnV0IGl0IG1pZ2h0IG1hdHRlciBmb3IgeW91cnMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyAhIHZpZGVvY3JvcCB0b3A9NDIgbGVmdD0xIHJpZ2h0PTQgYm90dG9tPTAgISB4aW1hZ2VzaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisvKiBUT0RPOgorICogIC0gZm9yIHBhY2tlZCBmb3JtYXRzLCB3ZSBjb3VsZCBhdm9pZCBtZW1jcHkoKSBpbiBjYXNlIGNyb3BfbGVmdAorICogICAgYW5kIGNyb3BfcmlnaHQgYXJlIDAgYW5kIGp1c3QgY3JlYXRlIGEgc3ViLWJ1ZmZlciBvZiB0aGUgaW5wdXQKKyAqICAgIGJ1ZmZlcgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworI2luY2x1ZGUgImdzdHZpZGVvY3JvcC5oIgorI2luY2x1ZGUgImdzdGFzcGVjdHJhdGlvY3JvcC5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHZpZGVvY3JvcF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCB2aWRlb2Nyb3BfZGVidWcKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTEVGVCwKKyAgUFJPUF9SSUdIVCwKKyAgUFJPUF9UT1AsCisgIFBST1BfQk9UVE9NCit9OworCisvKiB3ZSBzdXBwb3J0IHRoZSBzYW1lIGNhcHMgYXMgYXNwZWN0cmF0aW9jcm9wIChzeW5jIGNoYW5nZXMpICovCisjZGVmaW5lIFZJREVPX0NST1BfQ0FQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHU1RfVklERU9fQ0FQU19NQUtFICgieyBSR0J4LCB4UkdCLCBCR1J4LCB4QkdSLCAiICAgIFwKKyAgICAgICJSR0JBLCBBUkdCLCBCR1JBLCBBQkdSLCBSR0IsIEJHUiwgQVlVViwgWVVZMiwgIiBcCisgICAgICAiWVZZVSwgVVlWWSwgSTQyMCwgWVYxMiwgUkdCMTYsIFJHQjE1LCBHUkFZOCwgIiAgXAorICAgICAgIk5WMTIsIE5WMjEsIEdSQVkxNl9MRSwgR1JBWTE2X0JFIH0iKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoVklERU9fQ1JPUF9DQVBTKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChWSURFT19DUk9QX0NBUFMpCisgICAgKTsKKworI2RlZmluZSBnc3RfdmlkZW9fY3JvcF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RWaWRlb0Nyb3AsIGdzdF92aWRlb19jcm9wLCBHU1RfVFlQRV9WSURFT19GSUxURVIpOworCitzdGF0aWMgdm9pZCBnc3RfdmlkZW9fY3JvcF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfdmlkZW9fY3JvcF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBHc3RDYXBzICpnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fY2FwcyAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdENhcHMgKiBjYXBzLCBHc3RDYXBzICogZmlsdGVyX2NhcHMpOworc3RhdGljIGdib29sZWFuIGdzdF92aWRlb19jcm9wX3NyY19ldmVudCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3ZpZGVvX2Nyb3Bfc2V0X2luZm8gKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwgR3N0Q2FwcyAqIGluLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXQsIEdzdFZpZGVvSW5mbyAqIG91dF9pbmZvKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF92aWRlb19jcm9wX3RyYW5zZm9ybV9mcmFtZSAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLAorICAgIEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdmlkZW9fY3JvcF9kZWNpZGVfYWxsb2NhdGlvbiAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworc3RhdGljIGdib29sZWFuIGdzdF92aWRlb19jcm9wX3Byb3Bvc2VfYWxsb2NhdGlvbiAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdFF1ZXJ5ICogZGVjaWRlX3F1ZXJ5LCBHc3RRdWVyeSAqIHF1ZXJ5KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF92aWRlb19jcm9wX3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZpZGVvX2Nyb3Bfc3JjX2V2ZW50IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdEV2ZW50ICpuZXdfZXZlbnQ7CisgIEdzdFN0cnVjdHVyZSAqbmV3X3N0cnVjdHVyZTsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGNvbnN0IGdjaGFyICpldmVudF9uYW1lOworICBkb3VibGUgcG9pbnRlcl94OworICBkb3VibGUgcG9pbnRlcl95OworCisgIEdzdFZpZGVvQ3JvcCAqdmNyb3AgPSBHU1RfVklERU9fQ1JPUCAodHJhbnMpOworICBuZXdfZXZlbnQgPSBOVUxMOworCisgIEdTVF9PQkpFQ1RfTE9DSyAodmNyb3ApOworICBpZiAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSA9PSBHU1RfRVZFTlRfTkFWSUdBVElPTiAmJgorICAgICAgKHZjcm9wLT5jcm9wX2xlZnQgIT0gMCB8fCB2Y3JvcC0+Y3JvcF90b3AgIT0gMCkpIHsKKyAgICBzdHJ1Y3R1cmUgPSBnc3RfZXZlbnRfZ2V0X3N0cnVjdHVyZSAoZXZlbnQpOworICAgIGV2ZW50X25hbWUgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImV2ZW50Iik7CisKKyAgICBpZiAoZXZlbnRfbmFtZSAmJgorICAgICAgICAoc3RyY21wIChldmVudF9uYW1lLCAibW91c2UtbW92ZSIpID09IDAgfHwKKyAgICAgICAgICAgIHN0cmNtcCAoZXZlbnRfbmFtZSwgIm1vdXNlLWJ1dHRvbi1wcmVzcyIpID09IDAgfHwKKyAgICAgICAgICAgIHN0cmNtcCAoZXZlbnRfbmFtZSwgIm1vdXNlLWJ1dHRvbi1yZWxlYXNlIikgPT0gMCkpIHsKKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2RvdWJsZSAoc3RydWN0dXJlLCAicG9pbnRlcl94IiwgJnBvaW50ZXJfeCkgJiYKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9kb3VibGUgKHN0cnVjdHVyZSwgInBvaW50ZXJfeSIsICZwb2ludGVyX3kpKSB7CisKKyAgICAgICAgbmV3X3N0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfY29weSAoc3RydWN0dXJlKTsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG5ld19zdHJ1Y3R1cmUsCisgICAgICAgICAgICAicG9pbnRlcl94IiwgR19UWVBFX0RPVUJMRSwgKGRvdWJsZSkgKHBvaW50ZXJfeCArIHZjcm9wLT5jcm9wX2xlZnQpLAorICAgICAgICAgICAgInBvaW50ZXJfeSIsIEdfVFlQRV9ET1VCTEUsIChkb3VibGUpIChwb2ludGVyX3kgKyB2Y3JvcC0+Y3JvcF90b3ApLAorICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgbmV3X2V2ZW50ID0gZ3N0X2V2ZW50X25ld19uYXZpZ2F0aW9uIChuZXdfc3RydWN0dXJlKTsKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHZjcm9wLCAiRmFpbGVkIHRvIHJlYWQgbmF2aWdhdGlvbiBldmVudCIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEdTVF9PQkpFQ1RfVU5MT0NLICh2Y3JvcCk7CisKKyAgcmV0dXJuIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAocGFyZW50X2NsYXNzKS0+c3JjX2V2ZW50ICh0cmFucywKKyAgICAgIChuZXdfZXZlbnQgPyBuZXdfZXZlbnQgOiBldmVudCkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2Nyb3BfY2xhc3NfaW5pdCAoR3N0VmlkZW9Dcm9wQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqYmFzZXRyYW5zZm9ybV9jbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGJhc2V0cmFuc2Zvcm1fY2xhc3MgPSAoR3N0QmFzZVRyYW5zZm9ybUNsYXNzICopIGtsYXNzOworICB2ZmlsdGVyX2NsYXNzID0gKEdzdFZpZGVvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3ZpZGVvX2Nyb3Bfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfdmlkZW9fY3JvcF9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9MRUZULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImxlZnQiLCAiTGVmdCIsCisgICAgICAgICAgIlBpeGVscyB0byBjcm9wIGF0IGxlZnQgKC0xIHRvIGF1dG8tY3JvcCkiLCAtMSwgR19NQVhJTlQsIDAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwKKyAgICAgICAgICBHU1RfUEFSQU1fTVVUQUJMRV9QTEFZSU5HKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUklHSFQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicmlnaHQiLCAiUmlnaHQiLAorICAgICAgICAgICJQaXhlbHMgdG8gY3JvcCBhdCByaWdodCAoLTEgdG8gYXV0by1jcm9wKSIsIC0xLCBHX01BWElOVCwgMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfAorICAgICAgICAgIEdTVF9QQVJBTV9NVVRBQkxFX1BMQVlJTkcpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UT1AsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgidG9wIiwgIlRvcCIsICJQaXhlbHMgdG8gY3JvcCBhdCB0b3AgKC0xIHRvIGF1dG8tY3JvcCkiLAorICAgICAgICAgIC0xLCBHX01BWElOVCwgMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfAorICAgICAgICAgIEdTVF9QQVJBTV9NVVRBQkxFX1BMQVlJTkcpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9CT1RUT00sCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiYm90dG9tIiwgIkJvdHRvbSIsCisgICAgICAgICAgIlBpeGVscyB0byBjcm9wIGF0IGJvdHRvbSAoLTEgdG8gYXV0by1jcm9wKSIsIC0xLCBHX01BWElOVCwgMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfAorICAgICAgICAgIEdTVF9QQVJBTV9NVVRBQkxFX1BMQVlJTkcpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJDcm9wIiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1ZpZGVvIiwKKyAgICAgICJDcm9wcyB2aWRlbyBpbnRvIGEgdXNlci1kZWZpbmVkIHJlZ2lvbiIsCisgICAgICAiVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4iKTsKKworICBiYXNldHJhbnNmb3JtX2NsYXNzLT50cmFuc2Zvcm1faXBfb25fcGFzc3Rocm91Z2ggPSBGQUxTRTsKKyAgYmFzZXRyYW5zZm9ybV9jbGFzcy0+dHJhbnNmb3JtX2NhcHMgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19jcm9wX3RyYW5zZm9ybV9jYXBzKTsKKyAgYmFzZXRyYW5zZm9ybV9jbGFzcy0+c3JjX2V2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19jcm9wX3NyY19ldmVudCk7CisgIGJhc2V0cmFuc2Zvcm1fY2xhc3MtPmRlY2lkZV9hbGxvY2F0aW9uID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdmlkZW9fY3JvcF9kZWNpZGVfYWxsb2NhdGlvbik7CisgIGJhc2V0cmFuc2Zvcm1fY2xhc3MtPnByb3Bvc2VfYWxsb2NhdGlvbiA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3ZpZGVvX2Nyb3BfcHJvcG9zZV9hbGxvY2F0aW9uKTsKKyAgYmFzZXRyYW5zZm9ybV9jbGFzcy0+dHJhbnNmb3JtX2lwID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1faXApOworCisgIHZmaWx0ZXJfY2xhc3MtPnNldF9pbmZvID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19jcm9wX3NldF9pbmZvKTsKKyAgdmZpbHRlcl9jbGFzcy0+dHJhbnNmb3JtX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fZnJhbWUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2Nyb3BfaW5pdCAoR3N0VmlkZW9Dcm9wICogdmNyb3ApCit7CisgIHZjcm9wLT5jcm9wX3JpZ2h0ID0gMDsKKyAgdmNyb3AtPmNyb3BfbGVmdCA9IDA7CisgIHZjcm9wLT5jcm9wX3RvcCA9IDA7CisgIHZjcm9wLT5jcm9wX2JvdHRvbSA9IDA7Cit9CisKKyNkZWZpbmUgUk9VTkRfRE9XTl8yKG4pICAoKG4pJih+MSkpCisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fcGFja2VkX2NvbXBsZXggKEdzdFZpZGVvQ3JvcCAqIHZjcm9wLAorICAgIEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSwgZ2ludCB4LCBnaW50IHkpCit7CisgIGd1aW50OCAqaW5fZGF0YSwgKm91dF9kYXRhOworICBndWludCBpLCBkeDsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnaW50IGluX3N0cmlkZTsKKyAgZ2ludCBvdXRfc3RyaWRlOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChvdXRfZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChvdXRfZnJhbWUpOworCisgIGluX2RhdGEgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBvdXRfZGF0YSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIGluX3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGluX2ZyYW1lLCAwKTsKKyAgb3V0X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKG91dF9mcmFtZSwgMCk7CisKKyAgaW5fZGF0YSArPSB2Y3JvcC0+Y3JvcF90b3AgKiBpbl9zdHJpZGU7CisKKyAgLyogcm91bmRpbmcgZG93biBoZXJlIHNvIHdlIGVuZCB1cCBhdCB0aGUgc3RhcnQgb2YgYSBtYWNyby1waXhlbCBhbmQgbm90CisgICAqIGluIHRoZSBtaWRkbGUgb2Ygb25lICovCisgIGluX2RhdGEgKz0gUk9VTkRfRE9XTl8yICh2Y3JvcC0+Y3JvcF9sZWZ0KSAqCisgICAgICBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFIChpbl9mcmFtZSwgMCk7CisKKyAgZHggPSB3aWR0aCAqIEdTVF9WSURFT19GUkFNRV9DT01QX1BTVFJJREUgKG91dF9mcmFtZSwgMCk7CisKKyAgLyogVVlWWSA9IDQ6MjoyIC0gW1UwIFkwIFYwIFkxXSBbVTIgWTIgVjIgWTNdIFtVNCBZNCBWNCBZNV0KKyAgICogWVVZViA9IDQ6MjoyIC0gW1kwIFUwIFkxIFYwXSBbWTIgVTIgWTMgVjJdIFtZNCBVNCBZNSBWNF0gPSBZVVkyICovCisgIGlmICgodmNyb3AtPmNyb3BfbGVmdCAlIDIpICE9IDApIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKKyAgICAgIGdpbnQgajsKKworICAgICAgbWVtY3B5IChvdXRfZGF0YSwgaW5fZGF0YSwgZHgpOworCisgICAgICAvKiBtb3ZlIGp1c3QgdGhlIFkgc2FtcGxlcyBvbmUgcGl4ZWwgdG8gdGhlIGxlZnQsIGRvbid0IHdvcnJ5IGFib3V0CisgICAgICAgKiBjaHJvbWEgc2hpZnQgKi8KKyAgICAgIGZvciAoaiA9IHZjcm9wLT5tYWNyb195X29mZjsgaiA8IG91dF9zdHJpZGUgLSAyOyBqICs9IDIpCisgICAgICAgIG91dF9kYXRhW2pdID0gaW5fZGF0YVtqICsgMl07CisKKyAgICAgIGluX2RhdGEgKz0gaW5fc3RyaWRlOworICAgICAgb3V0X2RhdGEgKz0gb3V0X3N0cmlkZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7CisgICAgICBtZW1jcHkgKG91dF9kYXRhLCBpbl9kYXRhLCBkeCk7CisgICAgICBpbl9kYXRhICs9IGluX3N0cmlkZTsKKyAgICAgIG91dF9kYXRhICs9IG91dF9zdHJpZGU7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fcGFja2VkX3NpbXBsZSAoR3N0VmlkZW9Dcm9wICogdmNyb3AsCisgICAgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLCBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lLCBnaW50IHgsIGdpbnQgeSkKK3sKKyAgZ3VpbnQ4ICppbl9kYXRhLCAqb3V0X2RhdGE7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ3VpbnQgaSwgZHg7CisgIGdpbnQgaW5fc3RyaWRlLCBvdXRfc3RyaWRlOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChvdXRfZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChvdXRfZnJhbWUpOworCisgIGluX2RhdGEgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBvdXRfZGF0YSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIGluX3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGluX2ZyYW1lLCAwKTsKKyAgb3V0X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKG91dF9mcmFtZSwgMCk7CisKKyAgaW5fZGF0YSArPSAodmNyb3AtPmNyb3BfdG9wICsgeSkgKiBpbl9zdHJpZGU7CisgIGluX2RhdGEgKz0KKyAgICAgICh2Y3JvcC0+Y3JvcF9sZWZ0ICsgeCkgKiBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFIChpbl9mcmFtZSwgMCk7CisKKyAgZHggPSB3aWR0aCAqIEdTVF9WSURFT19GUkFNRV9DT01QX1BTVFJJREUgKG91dF9mcmFtZSwgMCk7CisKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7CisgICAgbWVtY3B5IChvdXRfZGF0YSwgaW5fZGF0YSwgZHgpOworICAgIGluX2RhdGEgKz0gaW5fc3RyaWRlOworICAgIG91dF9kYXRhICs9IG91dF9zdHJpZGU7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19jcm9wX3RyYW5zZm9ybV9wbGFuYXIgKEdzdFZpZGVvQ3JvcCAqIHZjcm9wLAorICAgIEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSwgZ2ludCB4LCBnaW50IHkpCit7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCBjcm9wX3RvcCwgY3JvcF9sZWZ0OworICBndWludDggKnlfb3V0LCAqdV9vdXQsICp2X291dDsKKyAgZ3VpbnQ4ICp5X2luLCAqdV9pbiwgKnZfaW47CisgIGd1aW50IGksIGR4OworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChvdXRfZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChvdXRfZnJhbWUpOworICBjcm9wX2xlZnQgPSB2Y3JvcC0+Y3JvcF9sZWZ0ICsgeDsKKyAgY3JvcF90b3AgPSB2Y3JvcC0+Y3JvcF90b3AgKyB5OworCisgIC8qIFkgcGxhbmUgKi8KKyAgeV9pbiA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIHlfb3V0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgeV9pbiArPSAoY3JvcF90b3AgKiBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChpbl9mcmFtZSwgMCkpICsgY3JvcF9sZWZ0OworICBkeCA9IHdpZHRoOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgeworICAgIG1lbWNweSAoeV9vdXQsIHlfaW4sIGR4KTsKKyAgICB5X2luICs9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGluX2ZyYW1lLCAwKTsKKyAgICB5X291dCArPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChvdXRfZnJhbWUsIDApOworICB9CisKKyAgLyogVSArIFYgcGxhbmVzICovCisgIHVfaW4gPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDEpOworICB1X291dCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDEpOworCisgIHVfaW4gKz0gKGNyb3BfdG9wIC8gMikgKiBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChpbl9mcmFtZSwgMSk7CisgIHVfaW4gKz0gY3JvcF9sZWZ0IC8gMjsKKworICB2X2luID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAyKTsKKyAgdl9vdXQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAyKTsKKworICB2X2luICs9IChjcm9wX3RvcCAvIDIpICogR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoaW5fZnJhbWUsIDIpOworICB2X2luICs9IGNyb3BfbGVmdCAvIDI7CisKKyAgZHggPSBHU1RfUk9VTkRfVVBfMiAod2lkdGgpIC8gMjsKKworICBmb3IgKGkgPSAwOyBpIDwgR1NUX1JPVU5EX1VQXzIgKGhlaWdodCkgLyAyOyArK2kpIHsKKyAgICBtZW1jcHkgKHVfb3V0LCB1X2luLCBkeCk7CisgICAgbWVtY3B5ICh2X291dCwgdl9pbiwgZHgpOworICAgIHVfaW4gKz0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoaW5fZnJhbWUsIDEpOworICAgIHVfb3V0ICs9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKG91dF9mcmFtZSwgMSk7CisgICAgdl9pbiArPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChpbl9mcmFtZSwgMik7CisgICAgdl9vdXQgKz0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAob3V0X2ZyYW1lLCAyKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX3NlbWlfcGxhbmFyIChHc3RWaWRlb0Nyb3AgKiB2Y3JvcCwKKyAgICBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUsIGdpbnQgeCwgZ2ludCB5KQoreworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgY3JvcF90b3AsIGNyb3BfbGVmdDsKKyAgZ3VpbnQ4ICp5X291dCwgKnV2X291dDsKKyAgZ3VpbnQ4ICp5X2luLCAqdXZfaW47CisgIGd1aW50IGksIGR4OworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChvdXRfZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChvdXRfZnJhbWUpOworICBjcm9wX2xlZnQgPSB2Y3JvcC0+Y3JvcF9sZWZ0ICsgeDsKKyAgY3JvcF90b3AgPSB2Y3JvcC0+Y3JvcF90b3AgKyB5OworCisgIC8qIFkgcGxhbmUgKi8KKyAgeV9pbiA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIHlfb3V0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgLyogVVYgcGxhbmUgKi8KKyAgdXZfaW4gPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDEpOworICB1dl9vdXQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAxKTsKKworICB5X2luICs9IGNyb3BfdG9wICogR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoaW5fZnJhbWUsIDApICsgY3JvcF9sZWZ0OworICBkeCA9IHdpZHRoOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgeworICAgIG1lbWNweSAoeV9vdXQsIHlfaW4sIGR4KTsKKyAgICB5X2luICs9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGluX2ZyYW1lLCAwKTsKKyAgICB5X291dCArPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChvdXRfZnJhbWUsIDApOworICB9CisKKyAgdXZfaW4gKz0gKGNyb3BfdG9wIC8gMikgKiBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChpbl9mcmFtZSwgMSk7CisgIHV2X2luICs9IEdTVF9ST1VORF9ET1dOXzIgKGNyb3BfbGVmdCk7CisgIGR4ID0gR1NUX1JPVU5EX1VQXzIgKHdpZHRoKTsKKworICBmb3IgKGkgPSAwOyBpIDwgR1NUX1JPVU5EX1VQXzIgKGhlaWdodCkgLyAyOyBpKyspIHsKKyAgICBtZW1jcHkgKHV2X291dCwgdXZfaW4sIGR4KTsKKyAgICB1dl9pbiArPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChpbl9mcmFtZSwgMSk7CisgICAgdXZfb3V0ICs9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKG91dF9mcmFtZSwgMSk7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92aWRlb19jcm9wX3RyYW5zZm9ybV9mcmFtZSAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLAorICAgIEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSkKK3sKKyAgR3N0VmlkZW9Dcm9wICp2Y3JvcCA9IEdTVF9WSURFT19DUk9QICh2ZmlsdGVyKTsKKyAgR3N0VmlkZW9Dcm9wTWV0YSAqbWV0YSA9IGdzdF9idWZmZXJfZ2V0X3ZpZGVvX2Nyb3BfbWV0YSAoaW5fZnJhbWUtPmJ1ZmZlcik7CisgIGdpbnQgeCA9IDAsIHkgPSAwOworCisgIGlmIChHX1VOTElLRUxZICh2Y3JvcC0+bmVlZF91cGRhdGUpKSB7CisgICAgaWYgKCFnc3RfdmlkZW9fY3JvcF9zZXRfaW5mbyAodmZpbHRlciwgTlVMTCwgJnZjcm9wLT5pbl9pbmZvLCBOVUxMLAorICAgICAgICAgICAgJnZjcm9wLT5vdXRfaW5mbykpIHsKKyAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgICB9CisgIH0KKworICBpZiAobWV0YSkgeworICAgIHggPSBtZXRhLT54OworICAgIHkgPSBtZXRhLT55OworICB9CisKKyAgc3dpdGNoICh2Y3JvcC0+cGFja2luZykgeworICAgIGNhc2UgVklERU9fQ1JPUF9QSVhFTF9GT1JNQVRfUEFDS0VEX1NJTVBMRToKKyAgICAgIGdzdF92aWRlb19jcm9wX3RyYW5zZm9ybV9wYWNrZWRfc2ltcGxlICh2Y3JvcCwgaW5fZnJhbWUsIG91dF9mcmFtZSwgeCwgeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFZJREVPX0NST1BfUElYRUxfRk9STUFUX1BBQ0tFRF9DT01QTEVYOgorICAgICAgZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX3BhY2tlZF9jb21wbGV4ICh2Y3JvcCwgaW5fZnJhbWUsIG91dF9mcmFtZSwgeCwKKyAgICAgICAgICB5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVklERU9fQ1JPUF9QSVhFTF9GT1JNQVRfUExBTkFSOgorICAgICAgZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX3BsYW5hciAodmNyb3AsIGluX2ZyYW1lLCBvdXRfZnJhbWUsIHgsIHkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWSURFT19DUk9QX1BJWEVMX0ZPUk1BVF9TRU1JX1BMQU5BUjoKKyAgICAgIGdzdF92aWRlb19jcm9wX3RyYW5zZm9ybV9zZW1pX3BsYW5hciAodmNyb3AsIGluX2ZyYW1lLCBvdXRfZnJhbWUsIHgsIHkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICB9CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92aWRlb19jcm9wX2RlY2lkZV9hbGxvY2F0aW9uIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdFZpZGVvQ3JvcCAqY3JvcCA9IEdTVF9WSURFT19DUk9QICh0cmFucyk7CisgIGdib29sZWFuIHVzZV9jcm9wX21ldGE7CisKKyAgdXNlX2Nyb3BfbWV0YSA9IChnc3RfcXVlcnlfZmluZF9hbGxvY2F0aW9uX21ldGEgKHF1ZXJ5LAorICAgICAgICAgIEdTVF9WSURFT19DUk9QX01FVEFfQVBJX1RZUEUsIE5VTEwpICYmCisgICAgICBnc3RfcXVlcnlfZmluZF9hbGxvY2F0aW9uX21ldGEgKHF1ZXJ5LCBHU1RfVklERU9fTUVUQV9BUElfVFlQRSwgTlVMTCkpOworCisgIGlmICgoY3JvcC0+Y3JvcF9sZWZ0IHwgY3JvcC0+Y3JvcF9yaWdodCB8IGNyb3AtPmNyb3BfdG9wIHwgY3JvcC0+CisgICAgICAgICAgY3JvcF9ib3R0b20pID09IDApIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGNyb3AsICJ3ZSBhcmUgdXNpbmcgcGFzc3Rocm91Z2giKTsKKyAgICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X3Bhc3N0aHJvdWdoIChHU1RfQkFTRV9UUkFOU0ZPUk0gKGNyb3ApLCBUUlVFKTsKKyAgICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X2luX3BsYWNlIChHU1RfQkFTRV9UUkFOU0ZPUk0gKGNyb3ApLCBGQUxTRSk7CisgIH0gZWxzZSBpZiAodXNlX2Nyb3BfbWV0YSkgeworICAgIEdTVF9JTkZPX09CSkVDVCAoY3JvcCwgIndlIGFyZSBkb2luZyBpbi1wbGFjZSB0cmFuc2Zvcm0gdXNpbmcgY3JvcCBtZXRhIik7CisgICAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9wYXNzdGhyb3VnaCAoR1NUX0JBU0VfVFJBTlNGT1JNIChjcm9wKSwgRkFMU0UpOworICAgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfaW5fcGxhY2UgKEdTVF9CQVNFX1RSQU5TRk9STSAoY3JvcCksIFRSVUUpOworICB9IGVsc2UgeworICAgIEdTVF9JTkZPX09CSkVDVCAoY3JvcCwgIndlIGFyZSBub3QgdXNpbmcgcGFzc3Rocm91Z2giKTsKKyAgICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X3Bhc3N0aHJvdWdoIChHU1RfQkFTRV9UUkFOU0ZPUk0gKGNyb3ApLCBGQUxTRSk7CisgICAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9pbl9wbGFjZSAoR1NUX0JBU0VfVFJBTlNGT1JNIChjcm9wKSwgRkFMU0UpOworICB9CisKKyAgcmV0dXJuIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGVjaWRlX2FsbG9jYXRpb24gKHRyYW5zLAorICAgICAgcXVlcnkpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92aWRlb19jcm9wX3Byb3Bvc2VfYWxsb2NhdGlvbiAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdFF1ZXJ5ICogZGVjaWRlX3F1ZXJ5LCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICAvKiBpZiB3ZSBhcmUgbm90IHBhc3N0aHJvdWdoLCB3ZSBjYW4gaGFuZGxlIHZpZGVvIG1ldGEgYW5kIGNyb3AgbWV0YSAqLworICBpZiAoZGVjaWRlX3F1ZXJ5KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodHJhbnMsICJBZHZlcnRpc2luZyB2aWRlbyBtZXRhIGFuZCBjcm9wIG1ldGEgc3VwcG9ydCIpOworICAgIGdzdF9xdWVyeV9hZGRfYWxsb2NhdGlvbl9tZXRhIChxdWVyeSwgR1NUX1ZJREVPX01FVEFfQVBJX1RZUEUsIE5VTEwpOworICAgIGdzdF9xdWVyeV9hZGRfYWxsb2NhdGlvbl9tZXRhIChxdWVyeSwgR1NUX1ZJREVPX0NST1BfTUVUQV9BUElfVFlQRSwgTlVMTCk7CisgIH0KKworICByZXR1cm4gR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5wcm9wb3NlX2FsbG9jYXRpb24gKHRyYW5zLAorICAgICAgZGVjaWRlX3F1ZXJ5LCBxdWVyeSk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RWaWRlb0Nyb3AgKnZjcm9wID0gR1NUX1ZJREVPX0NST1AgKHRyYW5zKTsKKyAgR3N0VmlkZW9NZXRhICp2aWRlb19tZXRhOworICBHc3RWaWRlb0Nyb3BNZXRhICpjcm9wX21ldGE7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHRyYW5zLCAiVHJhbnNmb3JtaW5nIGluLXBsYWNlIik7CisKKyAgLyogVGhlIHZpZGVvIG1ldGEgaXMgcmVxdWlyZWQgc2luY2Ugd2UgYXJlIGdvaW5nIHRvIG1ha2UgdGhlIGNhcHMKKyAgICogd2lkdGgvaGVpZ2h0IHNtYWxsZXIsIHdoaWNoIHdvdWxkIG5vdCByZXN1bHQgaW4gYSB1c2FibGUgR3N0VmlkZW9JbmZvIGZvcgorICAgKiBtYXBwaW5nIHRoZSBidWZmZXIuICovCisgIHZpZGVvX21ldGEgPSBnc3RfYnVmZmVyX2dldF92aWRlb19tZXRhIChidWYpOworICBpZiAoIXZpZGVvX21ldGEpIHsKKyAgICB2aWRlb19tZXRhID0gZ3N0X2J1ZmZlcl9hZGRfdmlkZW9fbWV0YSAoYnVmLCBHU1RfVklERU9fRlJBTUVfRkxBR19OT05FLAorICAgICAgICBHU1RfVklERU9fSU5GT19GT1JNQVQgKCZ2Y3JvcC0+aW5faW5mbyksIHZjcm9wLT5pbl9pbmZvLndpZHRoLAorICAgICAgICB2Y3JvcC0+aW5faW5mby5oZWlnaHQpOworICB9CisKKyAgY3JvcF9tZXRhID0gZ3N0X2J1ZmZlcl9nZXRfdmlkZW9fY3JvcF9tZXRhIChidWYpOworICBpZiAoIWNyb3BfbWV0YSkgeworICAgIGNyb3BfbWV0YSA9IGdzdF9idWZmZXJfYWRkX3ZpZGVvX2Nyb3BfbWV0YSAoYnVmKTsKKyAgICBjcm9wX21ldGEtPndpZHRoID0gdmNyb3AtPmluX2luZm8ud2lkdGg7CisgICAgY3JvcF9tZXRhLT5oZWlnaHQgPSB2Y3JvcC0+aW5faW5mby5oZWlnaHQ7CisgIH0KKworICBjcm9wX21ldGEtPnggKz0gdmNyb3AtPmNyb3BfbGVmdDsKKyAgY3JvcF9tZXRhLT55ICs9IHZjcm9wLT5jcm9wX3RvcDsKKyAgY3JvcF9tZXRhLT53aWR0aCA9IEdTVF9WSURFT19JTkZPX1dJRFRIICgmdmNyb3AtPm91dF9pbmZvKTsKKyAgY3JvcF9tZXRhLT5oZWlnaHQgPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZ2Y3JvcC0+b3V0X2luZm8pOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIGdpbnQKK2dzdF92aWRlb19jcm9wX3RyYW5zZm9ybV9kaW1lbnNpb24gKGdpbnQgdmFsLCBnaW50IGRlbHRhKQoreworICBnaW50NjQgbmV3X3ZhbCA9IChnaW50NjQpIHZhbCArIChnaW50NjQpIGRlbHRhOworCisgIG5ld192YWwgPSBDTEFNUCAobmV3X3ZhbCwgMSwgR19NQVhJTlQpOworCisgIHJldHVybiAoZ2ludCkgbmV3X3ZhbDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fZGltZW5zaW9uX3ZhbHVlIChjb25zdCBHVmFsdWUgKiBzcmNfdmFsLAorICAgIGdpbnQgZGVsdGEsIEdWYWx1ZSAqIGRlc3RfdmFsLCBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLCBnYm9vbGVhbiBkeW5hbWljKQoreworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIGlmIChHX1ZBTFVFX0hPTERTX0lOVCAoc3JjX3ZhbCkpIHsKKyAgICBnaW50IGl2YWwgPSBnX3ZhbHVlX2dldF9pbnQgKHNyY192YWwpOworICAgIGl2YWwgPSBnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fZGltZW5zaW9uIChpdmFsLCBkZWx0YSk7CisKKyAgICBpZiAoZHluYW1pYykgeworICAgICAgaWYgKGRpcmVjdGlvbiA9PSBHU1RfUEFEX1NSQykgeworICAgICAgICBpZiAoaXZhbCA9PSBHX01BWElOVCkgeworICAgICAgICAgIGdfdmFsdWVfaW5pdCAoZGVzdF92YWwsIEdfVFlQRV9JTlQpOworICAgICAgICAgIGdfdmFsdWVfc2V0X2ludCAoZGVzdF92YWwsIGl2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdfdmFsdWVfaW5pdCAoZGVzdF92YWwsIEdTVF9UWVBFX0lOVF9SQU5HRSk7CisgICAgICAgICAgZ3N0X3ZhbHVlX3NldF9pbnRfcmFuZ2UgKGRlc3RfdmFsLCBpdmFsLCBHX01BWElOVCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpdmFsID09IDEpIHsKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKGRlc3RfdmFsLCBHX1RZUEVfSU5UKTsKKyAgICAgICAgICBnX3ZhbHVlX3NldF9pbnQgKGRlc3RfdmFsLCBpdmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKGRlc3RfdmFsLCBHU1RfVFlQRV9JTlRfUkFOR0UpOworICAgICAgICAgIGdzdF92YWx1ZV9zZXRfaW50X3JhbmdlIChkZXN0X3ZhbCwgMSwgaXZhbCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZ192YWx1ZV9pbml0IChkZXN0X3ZhbCwgR19UWVBFX0lOVCk7CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKGRlc3RfdmFsLCBpdmFsKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoR1NUX1ZBTFVFX0hPTERTX0lOVF9SQU5HRSAoc3JjX3ZhbCkpIHsKKyAgICBnaW50IG1pbiA9IGdzdF92YWx1ZV9nZXRfaW50X3JhbmdlX21pbiAoc3JjX3ZhbCk7CisgICAgZ2ludCBtYXggPSBnc3RfdmFsdWVfZ2V0X2ludF9yYW5nZV9tYXggKHNyY192YWwpOworCisgICAgbWluID0gZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX2RpbWVuc2lvbiAobWluLCBkZWx0YSk7CisgICAgbWF4ID0gZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX2RpbWVuc2lvbiAobWF4LCBkZWx0YSk7CisKKyAgICBpZiAoZHluYW1pYykgeworICAgICAgaWYgKGRpcmVjdGlvbiA9PSBHU1RfUEFEX1NSQykKKyAgICAgICAgbWF4ID0gR19NQVhJTlQ7CisgICAgICBlbHNlCisgICAgICAgIG1pbiA9IDE7CisgICAgfQorCisgICAgaWYgKG1pbiA9PSBtYXgpIHsKKyAgICAgIGdfdmFsdWVfaW5pdCAoZGVzdF92YWwsIEdfVFlQRV9JTlQpOworICAgICAgZ192YWx1ZV9zZXRfaW50IChkZXN0X3ZhbCwgbWluKTsKKyAgICB9IGVsc2UgeworICAgICAgZ192YWx1ZV9pbml0IChkZXN0X3ZhbCwgR1NUX1RZUEVfSU5UX1JBTkdFKTsKKyAgICAgIGdzdF92YWx1ZV9zZXRfaW50X3JhbmdlIChkZXN0X3ZhbCwgbWluLCBtYXgpOworICAgIH0KKyAgfSBlbHNlIGlmIChHU1RfVkFMVUVfSE9MRFNfTElTVCAoc3JjX3ZhbCkpIHsKKyAgICBnaW50IGk7CisKKyAgICBnX3ZhbHVlX2luaXQgKGRlc3RfdmFsLCBHU1RfVFlQRV9MSVNUKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBnc3RfdmFsdWVfbGlzdF9nZXRfc2l6ZSAoc3JjX3ZhbCk7ICsraSkgeworICAgICAgY29uc3QgR1ZhbHVlICpsaXN0X3ZhbDsKKyAgICAgIEdWYWx1ZSBuZXd2YWwgPSB7IDAsIH07CisKKyAgICAgIGxpc3RfdmFsID0gZ3N0X3ZhbHVlX2xpc3RfZ2V0X3ZhbHVlIChzcmNfdmFsLCBpKTsKKyAgICAgIGlmIChnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fZGltZW5zaW9uX3ZhbHVlIChsaXN0X3ZhbCwgZGVsdGEsICZuZXd2YWwsCisgICAgICAgICAgICAgIGRpcmVjdGlvbiwgZHluYW1pYykpCisgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoZGVzdF92YWwsICZuZXd2YWwpOworICAgICAgZ192YWx1ZV91bnNldCAoJm5ld3ZhbCk7CisgICAgfQorCisgICAgaWYgKGdzdF92YWx1ZV9saXN0X2dldF9zaXplIChkZXN0X3ZhbCkgPT0gMCkgeworICAgICAgZ192YWx1ZV91bnNldCAoZGVzdF92YWwpOworICAgICAgcmV0ID0gRkFMU0U7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldCA9IEZBTFNFOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLCBHc3RDYXBzICogY2FwcywgR3N0Q2FwcyAqIGZpbHRlcl9jYXBzKQoreworICBHc3RWaWRlb0Nyb3AgKnZjcm9wOworICBHc3RDYXBzICpvdGhlcl9jYXBzOworICBnaW50IGR5LCBkeCwgaSwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wOworICBnYm9vbGVhbiB3X2R5bmFtaWMsIGhfZHluYW1pYzsKKworICB2Y3JvcCA9IEdTVF9WSURFT19DUk9QICh0cmFucyk7CisKKyAgR1NUX09CSkVDVF9MT0NLICh2Y3JvcCk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHZjcm9wLCAibD0lZCxyPSVkLGI9JWQsdD0lZCIsCisgICAgICB2Y3JvcC0+cHJvcF9sZWZ0LCB2Y3JvcC0+cHJvcF9yaWdodCwgdmNyb3AtPnByb3BfYm90dG9tLCB2Y3JvcC0+cHJvcF90b3ApOworCisgIHdfZHluYW1pYyA9ICh2Y3JvcC0+cHJvcF9sZWZ0ID09IC0xIHx8IHZjcm9wLT5wcm9wX3JpZ2h0ID09IC0xKTsKKyAgaF9keW5hbWljID0gKHZjcm9wLT5wcm9wX3RvcCA9PSAtMSB8fCB2Y3JvcC0+cHJvcF9ib3R0b20gPT0gLTEpOworCisgIGxlZnQgPSAodmNyb3AtPnByb3BfbGVmdCA9PSAtMSkgPyAwIDogdmNyb3AtPnByb3BfbGVmdDsKKyAgcmlnaHQgPSAodmNyb3AtPnByb3BfcmlnaHQgPT0gLTEpID8gMCA6IHZjcm9wLT5wcm9wX3JpZ2h0OworICBib3R0b20gPSAodmNyb3AtPnByb3BfYm90dG9tID09IC0xKSA/IDAgOiB2Y3JvcC0+cHJvcF9ib3R0b207CisgIHRvcCA9ICh2Y3JvcC0+cHJvcF90b3AgPT0gLTEpID8gMCA6IHZjcm9wLT5wcm9wX3RvcDsKKworICBHU1RfT0JKRUNUX1VOTE9DSyAodmNyb3ApOworCisgIGlmIChkaXJlY3Rpb24gPT0gR1NUX1BBRF9TUkMpIHsKKyAgICBkeCA9IGxlZnQgKyByaWdodDsKKyAgICBkeSA9IHRvcCArIGJvdHRvbTsKKyAgfSBlbHNlIHsKKyAgICBkeCA9IDAgLSAobGVmdCArIHJpZ2h0KTsKKyAgICBkeSA9IDAgLSAodG9wICsgYm90dG9tKTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUICh2Y3JvcCwgInRyYW5zZm9ybWluZyBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICBvdGhlcl9jYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIGZvciAoaSA9IDA7IGkgPCBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7ICsraSkgeworICAgIGNvbnN0IEdWYWx1ZSAqdjsKKyAgICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZSwgKm5ld19zdHJ1Y3R1cmU7CisgICAgR1ZhbHVlIHdfdmFsID0geyAwLCB9LCBoX3ZhbCA9IHsKKyAgICAwLH07CisKKyAgICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCBpKTsKKworICAgIHYgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCAid2lkdGgiKTsKKyAgICBpZiAoIWdzdF92aWRlb19jcm9wX3RyYW5zZm9ybV9kaW1lbnNpb25fdmFsdWUgKHYsIGR4LCAmd192YWwsIGRpcmVjdGlvbiwKKyAgICAgICAgICAgIHdfZHluYW1pYykpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodmNyb3AsICJjb3VsZCBub3QgdHJhbmZvcm0gd2lkdGggdmFsdWUgd2l0aCBkeD0lZCIKKyAgICAgICAgICAiLCBjYXBzIHN0cnVjdHVyZT0lIiBHU1RfUFRSX0ZPUk1BVCwgZHgsIHN0cnVjdHVyZSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICB2ID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImhlaWdodCIpOworICAgIGlmICghZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX2RpbWVuc2lvbl92YWx1ZSAodiwgZHksICZoX3ZhbCwgZGlyZWN0aW9uLAorICAgICAgICAgICAgaF9keW5hbWljKSkgeworICAgICAgZ192YWx1ZV91bnNldCAoJndfdmFsKTsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodmNyb3AsICJjb3VsZCBub3QgdHJhbmZvcm0gaGVpZ2h0IHZhbHVlIHdpdGggZHk9JWQiCisgICAgICAgICAgIiwgY2FwcyBzdHJ1Y3R1cmU9JSIgR1NUX1BUUl9GT1JNQVQsIGR5LCBzdHJ1Y3R1cmUpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgbmV3X3N0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfY29weSAoc3RydWN0dXJlKTsKKyAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAobmV3X3N0cnVjdHVyZSwgIndpZHRoIiwgJndfdmFsKTsKKyAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAobmV3X3N0cnVjdHVyZSwgImhlaWdodCIsICZoX3ZhbCk7CisgICAgZ192YWx1ZV91bnNldCAoJndfdmFsKTsKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmaF92YWwpOworICAgIEdTVF9MT0dfT0JKRUNUICh2Y3JvcCwgInRyYW5zZm9ybWVkIHN0cnVjdHVyZSAlMmQ6ICUiIEdTVF9QVFJfRk9STUFUCisgICAgICAgICIgPT4gJSIgR1NUX1BUUl9GT1JNQVQsIGksIHN0cnVjdHVyZSwgbmV3X3N0cnVjdHVyZSk7CisgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAob3RoZXJfY2FwcywgbmV3X3N0cnVjdHVyZSk7CisgIH0KKworICBpZiAoIWdzdF9jYXBzX2lzX2VtcHR5IChvdGhlcl9jYXBzKSAmJiBmaWx0ZXJfY2FwcykgeworICAgIEdzdENhcHMgKnRtcCA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXJfY2Fwcywgb3RoZXJfY2FwcywKKyAgICAgICAgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc19yZXBsYWNlICgmb3RoZXJfY2FwcywgdG1wKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgfQorCisgIHJldHVybiBvdGhlcl9jYXBzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92aWRlb19jcm9wX3NldF9pbmZvIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsIEdzdENhcHMgKiBpbiwKKyAgICBHc3RWaWRlb0luZm8gKiBpbl9pbmZvLCBHc3RDYXBzICogb3V0LCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0VmlkZW9Dcm9wICpjcm9wID0gR1NUX1ZJREVPX0NST1AgKHZmaWx0ZXIpOworICBpbnQgZHgsIGR5OworCisgIEdTVF9PQkpFQ1RfTE9DSyAoY3JvcCk7CisgIGNyb3AtPm5lZWRfdXBkYXRlID0gRkFMU0U7CisgIGNyb3AtPmNyb3BfbGVmdCA9IGNyb3AtPnByb3BfbGVmdDsKKyAgY3JvcC0+Y3JvcF9yaWdodCA9IGNyb3AtPnByb3BfcmlnaHQ7CisgIGNyb3AtPmNyb3BfdG9wID0gY3JvcC0+cHJvcF90b3A7CisgIGNyb3AtPmNyb3BfYm90dG9tID0gY3JvcC0+cHJvcF9ib3R0b207CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChjcm9wKTsKKworICBkeCA9IEdTVF9WSURFT19JTkZPX1dJRFRIIChpbl9pbmZvKSAtIEdTVF9WSURFT19JTkZPX1dJRFRIIChvdXRfaW5mbyk7CisgIGR5ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbl9pbmZvKSAtIEdTVF9WSURFT19JTkZPX0hFSUdIVCAob3V0X2luZm8pOworCisgIGlmIChjcm9wLT5jcm9wX2xlZnQgPT0gLTEgJiYgY3JvcC0+Y3JvcF9yaWdodCA9PSAtMSkgeworICAgIGNyb3AtPmNyb3BfbGVmdCA9IGR4IC8gMjsKKyAgICBjcm9wLT5jcm9wX3JpZ2h0ID0gZHggLyAyICsgKGR4ICYgMSk7CisgIH0gZWxzZSBpZiAoY3JvcC0+Y3JvcF9sZWZ0ID09IC0xKSB7CisgICAgaWYgKEdfVU5MSUtFTFkgKGNyb3AtPmNyb3BfcmlnaHQgPiBkeCkpCisgICAgICBnb3RvIGNyb3BwaW5nX3Rvb19tdWNoOworICAgIGNyb3AtPmNyb3BfbGVmdCA9IGR4IC0gY3JvcC0+Y3JvcF9yaWdodDsKKyAgfSBlbHNlIGlmIChjcm9wLT5jcm9wX3JpZ2h0ID09IC0xKSB7CisgICAgaWYgKEdfVU5MSUtFTFkgKGNyb3AtPmNyb3BfbGVmdCA+IGR4KSkKKyAgICAgIGdvdG8gY3JvcHBpbmdfdG9vX211Y2g7CisgICAgY3JvcC0+Y3JvcF9yaWdodCA9IGR4IC0gY3JvcC0+Y3JvcF9sZWZ0OworICB9CisKKyAgaWYgKGNyb3AtPmNyb3BfdG9wID09IC0xICYmIGNyb3AtPmNyb3BfYm90dG9tID09IC0xKSB7CisgICAgY3JvcC0+Y3JvcF90b3AgPSBkeSAvIDI7CisgICAgY3JvcC0+Y3JvcF9ib3R0b20gPSBkeSAvIDIgKyAoZHkgJiAxKTsKKyAgfSBlbHNlIGlmIChjcm9wLT5jcm9wX3RvcCA9PSAtMSkgeworICAgIGlmIChHX1VOTElLRUxZIChjcm9wLT5jcm9wX2JvdHRvbSA+IGR5KSkKKyAgICAgIGdvdG8gY3JvcHBpbmdfdG9vX211Y2g7CisgICAgY3JvcC0+Y3JvcF90b3AgPSBkeSAtIGNyb3AtPmNyb3BfYm90dG9tOworICB9IGVsc2UgaWYgKGNyb3AtPmNyb3BfYm90dG9tID09IC0xKSB7CisgICAgaWYgKEdfVU5MSUtFTFkgKGNyb3AtPmNyb3BfdG9wID4gZHkpKQorICAgICAgZ290byBjcm9wcGluZ190b29fbXVjaDsKKyAgICBjcm9wLT5jcm9wX2JvdHRvbSA9IGR5IC0gY3JvcC0+Y3JvcF90b3A7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoKGNyb3AtPmNyb3BfbGVmdCArIGNyb3AtPmNyb3BfcmlnaHQpID49CisgICAgICAgICAgR1NUX1ZJREVPX0lORk9fV0lEVEggKGluX2luZm8pCisgICAgICAgICAgfHwgKGNyb3AtPmNyb3BfdG9wICsgY3JvcC0+Y3JvcF9ib3R0b20pID49CisgICAgICAgICAgR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbl9pbmZvKSkpCisgICAgZ290byBjcm9wcGluZ190b29fbXVjaDsKKworICBpZiAoaW4gJiYgb3V0KQorICAgIEdTVF9MT0dfT0JKRUNUIChjcm9wLCAiaW5jYXBzID0gJSIgR1NUX1BUUl9GT1JNQVQgIiwgb3V0Y2FwcyA9ICUiCisgICAgICAgIEdTVF9QVFJfRk9STUFULCBpbiwgb3V0KTsKKworICBpZiAoR1NUX1ZJREVPX0lORk9fSVNfUkdCIChpbl9pbmZvKQorICAgICAgfHwgR1NUX1ZJREVPX0lORk9fSVNfR1JBWSAoaW5faW5mbykpIHsKKyAgICBjcm9wLT5wYWNraW5nID0gVklERU9fQ1JPUF9QSVhFTF9GT1JNQVRfUEFDS0VEX1NJTVBMRTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoaW5faW5mbykpIHsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgICBjcm9wLT5wYWNraW5nID0gVklERU9fQ1JPUF9QSVhFTF9GT1JNQVRfUEFDS0VEX1NJTVBMRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVZZVToKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVVkyOgorICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICAgIGNyb3AtPnBhY2tpbmcgPSBWSURFT19DUk9QX1BJWEVMX0ZPUk1BVF9QQUNLRURfQ09NUExFWDsKKyAgICAgICAgaWYgKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoaW5faW5mbykgPT0gR1NUX1ZJREVPX0ZPUk1BVF9VWVZZKSB7CisgICAgICAgICAgLyogVVlWWSA9IDQ6MjoyIC0gW1UwIFkwIFYwIFkxXSBbVTIgWTIgVjIgWTNdIFtVNCBZNCBWNCBZNV0gKi8KKyAgICAgICAgICBjcm9wLT5tYWNyb195X29mZiA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogWVVZViA9IDQ6MjoyIC0gW1kwIFUwIFkxIFYwXSBbWTIgVTIgWTMgVjJdIFtZNCBVNCBZNSBWNF0gPSBZVVkyICovCisgICAgICAgICAgY3JvcC0+bWFjcm9feV9vZmYgPSAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVYxMjoKKyAgICAgICAgY3JvcC0+cGFja2luZyA9IFZJREVPX0NST1BfUElYRUxfRk9STUFUX1BMQU5BUjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYxMjoKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9OVjIxOgorICAgICAgICBjcm9wLT5wYWNraW5nID0gVklERU9fQ1JPUF9QSVhFTF9GT1JNQVRfU0VNSV9QTEFOQVI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byB1bmtub3duX2Zvcm1hdDsKKyAgICB9CisgIH0KKworICBjcm9wLT5pbl9pbmZvID0gKmluX2luZm87CisgIGNyb3AtPm91dF9pbmZvID0gKm91dF9pbmZvOworCisgIC8qIEVuc3VyZSBvdXIgZGVjaWRlX2FsbG9jYXRpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gKi8KKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9wYXNzdGhyb3VnaCAoR1NUX0JBU0VfVFJBTlNGT1JNIChjcm9wKSwgRkFMU0UpOworICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X2luX3BsYWNlIChHU1RfQkFTRV9UUkFOU0ZPUk0gKGNyb3ApLCBGQUxTRSk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1IgKi8KK2Nyb3BwaW5nX3Rvb19tdWNoOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjcm9wLCAid2UgYXJlIGNyb3BwaW5nIHRvbyBtdWNoIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit1bmtub3duX2Zvcm1hdDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY3JvcCwgIlVuc3VwcG9ydGVkIGZvcm1hdCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKiBjYWxsZWQgd2l0aCBvYmplY3QgbG9jayAqLworc3RhdGljIGlubGluZSB2b2lkCitnc3RfdmlkZW9fY3JvcF9zZXRfY3JvcCAoR3N0VmlkZW9Dcm9wICogdmNyb3AsIGdpbnQgbmV3X3ZhbHVlLCBnaW50ICogcHJvcCkKK3sKKyAgaWYgKCpwcm9wICE9IG5ld192YWx1ZSkgeworICAgICpwcm9wID0gbmV3X3ZhbHVlOworICAgIHZjcm9wLT5uZWVkX3VwZGF0ZSA9IFRSVUU7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19jcm9wX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWaWRlb0Nyb3AgKnZpZGVvX2Nyb3A7CisKKyAgdmlkZW9fY3JvcCA9IEdTVF9WSURFT19DUk9QIChvYmplY3QpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAodmlkZW9fY3JvcCk7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MRUZUOgorICAgICAgZ3N0X3ZpZGVvX2Nyb3Bfc2V0X2Nyb3AgKHZpZGVvX2Nyb3AsIGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpLAorICAgICAgICAgICZ2aWRlb19jcm9wLT5wcm9wX2xlZnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JJR0hUOgorICAgICAgZ3N0X3ZpZGVvX2Nyb3Bfc2V0X2Nyb3AgKHZpZGVvX2Nyb3AsIGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpLAorICAgICAgICAgICZ2aWRlb19jcm9wLT5wcm9wX3JpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UT1A6CisgICAgICBnc3RfdmlkZW9fY3JvcF9zZXRfY3JvcCAodmlkZW9fY3JvcCwgZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSksCisgICAgICAgICAgJnZpZGVvX2Nyb3AtPnByb3BfdG9wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CT1RUT006CisgICAgICBnc3RfdmlkZW9fY3JvcF9zZXRfY3JvcCAodmlkZW9fY3JvcCwgZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSksCisgICAgICAgICAgJnZpZGVvX2Nyb3AtPnByb3BfYm90dG9tKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KKyAgR1NUX0xPR19PQkpFQ1QgKHZpZGVvX2Nyb3AsICJsPSVkLHI9JWQsYj0lZCx0PSVkLCBuZWVkX3VwZGF0ZTolZCIsCisgICAgICB2aWRlb19jcm9wLT5wcm9wX2xlZnQsIHZpZGVvX2Nyb3AtPnByb3BfcmlnaHQsIHZpZGVvX2Nyb3AtPnByb3BfYm90dG9tLAorICAgICAgdmlkZW9fY3JvcC0+cHJvcF90b3AsIHZpZGVvX2Nyb3AtPm5lZWRfdXBkYXRlKTsKKworICBHU1RfT0JKRUNUX1VOTE9DSyAodmlkZW9fY3JvcCk7CisKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3JlY29uZmlndXJlX3NyYyAoR1NUX0JBU0VfVFJBTlNGT1JNICh2aWRlb19jcm9wKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fY3JvcF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VmlkZW9Dcm9wICp2aWRlb19jcm9wOworCisgIHZpZGVvX2Nyb3AgPSBHU1RfVklERU9fQ1JPUCAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHZpZGVvX2Nyb3ApOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTEVGVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHZpZGVvX2Nyb3AtPnByb3BfbGVmdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUklHSFQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB2aWRlb19jcm9wLT5wcm9wX3JpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UT1A6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB2aWRlb19jcm9wLT5wcm9wX3RvcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQk9UVE9NOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdmlkZW9fY3JvcC0+cHJvcF9ib3R0b20pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAodmlkZW9fY3JvcCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHZpZGVvY3JvcF9kZWJ1ZywgInZpZGVvY3JvcCIsIDAsICJ2aWRlb2Nyb3AiKTsKKworICBpZiAoZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInZpZGVvY3JvcCIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfVklERU9fQ1JPUCkKKyAgICAgICYmIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJhc3BlY3RyYXRpb2Nyb3AiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX0FTUEVDVF9SQVRJT19DUk9QKSkKKyAgICByZXR1cm4gVFJVRTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICB2aWRlb2Nyb3AsCisgICAgIkNyb3BzIHZpZGVvIGludG8gYSB1c2VyLWRlZmluZWQgcmVnaW9uIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmggYi9nc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NTRlODQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5oCkBAIC0wLDAgKzEsODMgQEAKKy8qIEdTdHJlYW1lciB2aWRlbyBmcmFtZSBjcm9wcGluZworICogQ29weXJpZ2h0IChDKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9WSURFT19DUk9QX0hfXworI2RlZmluZSBfX0dTVF9WSURFT19DUk9QX0hfXworCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9WSURFT19DUk9QIFwKKyAgKGdzdF92aWRlb19jcm9wX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WSURFT19DUk9QKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVklERU9fQ1JPUCxHc3RWaWRlb0Nyb3ApKQorI2RlZmluZSBHU1RfVklERU9fQ1JPUF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WSURFT19DUk9QLEdzdFZpZGVvQ3JvcENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1ZJREVPX0NST1Aob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WSURFT19DUk9QKSkKKyNkZWZpbmUgR1NUX0lTX1ZJREVPX0NST1BfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVklERU9fQ1JPUCkpCisKK3R5cGVkZWYgZW51bSB7CisgIFZJREVPX0NST1BfUElYRUxfRk9STUFUX1BBQ0tFRF9TSU1QTEUgPSAwLCAgLyogUkdCeCwgQVlVViAqLworICBWSURFT19DUk9QX1BJWEVMX0ZPUk1BVF9QQUNLRURfQ09NUExFWCwgICAgIC8qIFVZVlksIFlWWVUgKi8KKyAgVklERU9fQ1JPUF9QSVhFTF9GT1JNQVRfUExBTkFSLCAgICAgICAgICAgICAvKiBJNDIwLCBZVjEyICovCisgIFZJREVPX0NST1BfUElYRUxfRk9STUFUX1NFTUlfUExBTkFSICAgICAgICAgLyogTlYxMiwgTlYyMSAqLworfSBWaWRlb0Nyb3BQaXhlbEZvcm1hdDsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZpZGVvQ3JvcEltYWdlRGV0YWlscyBHc3RWaWRlb0Nyb3BJbWFnZURldGFpbHM7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWaWRlb0Nyb3AgR3N0VmlkZW9Dcm9wOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZpZGVvQ3JvcENsYXNzIEdzdFZpZGVvQ3JvcENsYXNzOworCitzdHJ1Y3QgX0dzdFZpZGVvQ3JvcAoreworICBHc3RWaWRlb0ZpbHRlciBwYXJlbnQ7CisKKyAgLyo8IHByaXZhdGUgPiovCisgIGdpbnQgcHJvcF9sZWZ0OworICBnaW50IHByb3BfcmlnaHQ7CisgIGdpbnQgcHJvcF90b3A7CisgIGdpbnQgcHJvcF9ib3R0b207CisgIGdib29sZWFuIG5lZWRfdXBkYXRlOworCisgIEdzdFZpZGVvSW5mbyBpbl9pbmZvOworICBHc3RWaWRlb0luZm8gb3V0X2luZm87CisKKyAgZ2ludCBjcm9wX2xlZnQ7CisgIGdpbnQgY3JvcF9yaWdodDsKKyAgZ2ludCBjcm9wX3RvcDsKKyAgZ2ludCBjcm9wX2JvdHRvbTsKKworICBWaWRlb0Nyb3BQaXhlbEZvcm1hdCAgcGFja2luZzsKKyAgZ2ludCBtYWNyb195X29mZjsKK307CisKK3N0cnVjdCBfR3N0VmlkZW9Dcm9wQ2xhc3MKK3sKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfdmlkZW9fY3JvcF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9WSURFT19DUk9QX0hfXyAqLworCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9jcm9wL21lc29uLmJ1aWxkIGIvZ3N0L3ZpZGVvY3JvcC9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDZiN2JlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvY3JvcC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDggQEAKK2dzdHZpZGVvY3JvcCA9IGxpYnJhcnkoJ2dzdHZpZGVvY3JvcCcsCisgICdnc3R2aWRlb2Nyb3AuYycsICdnc3Rhc3BlY3RyYXRpb2Nyb3AuYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0X2RlcCwgZ3N0YmFzZV9kZXAsIGdzdHZpZGVvX2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9maWx0ZXIvLmdpdGlnbm9yZSBiL2dzdC92aWRlb2ZpbHRlci8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYzA4ODAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdmlkZW9maWx0ZXIvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDMgQEAKK2dzdHZpZGVvZXhhbXBsZS5oCitnc3R2aWRlb2V4YW1wbGUuYworCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW0gYi9nc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I1MTdmZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb2ZpbHRlci9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDIyIEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3R2aWRlb2ZpbHRlci5sYQorCitub2luc3RfSEVBREVSUyA9IGdzdHZpZGVvZmxpcC5oIGdzdHZpZGVvYmFsYW5jZS5oIGdzdGdhbW1hLmggZ3N0dmlkZW9tZWRpYW4uaAorCitFWFRSQV9ESVNUID0gZ3N0dmlkZW90ZW1wbGF0ZS5jIG1ha2VfZmlsdGVyCitDTEVBTkZJTEVTID0gZ3N0dmlkZW9leGFtcGxlLmMKKworbGliZ3N0dmlkZW9maWx0ZXJfbGFfU09VUkNFUyA9IHBsdWdpbi5jIFwKKwkJCWdzdHZpZGVvZmxpcC5jIFwKKwkJCWdzdHZpZGVvYmFsYW5jZS5jIFwKKwkJCWdzdGdhbW1hLmMgXAorCQkJZ3N0dmlkZW9tZWRpYW4uYworbGliZ3N0dmlkZW9maWx0ZXJfbGFfQ0ZMQUdTID0gJChHU1RfQ0ZMQUdTKSBcCisJCQkkKEdTVF9CQVNFX0NGTEFHUykgXAorCQkJJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykKK2xpYmdzdHZpZGVvZmlsdGVyX2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSBcCisJCQktbGdzdHZpZGVvLUBHU1RfQVBJX1ZFUlNJT05AIFwKKwkJCSQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykKK2xpYmdzdHZpZGVvZmlsdGVyX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykgJChMSUJNKQorCitnc3R2aWRlb2V4YW1wbGUuYzogJChzcmNkaXIpL21ha2VfZmlsdGVyICQoc3JjZGlyKS9nc3R2aWRlb3RlbXBsYXRlLmMKKwkkKHNyY2RpcikvbWFrZV9maWx0ZXIgVmlkZW9leGFtcGxlICQoc3JjZGlyKS9nc3R2aWRlb3RlbXBsYXRlLmMKZGlmZiAtLWdpdCBhL2dzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jIGIvZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0NDA5ZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jCkBAIC0wLDAgKzEsNDE0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBBcndlZCB2LiBNZXJrYXR6IDx2Lm1lcmthdHpAZ214Lm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIChwcm9iYWJseSkgZ2VuZXJhdGVkIGZyb20KKyAqIGdzdHZpZGVvdGVtcGxhdGUuYyx2IDEuMTIgMjAwNC8wMS8wNyAyMTowNzoxMiBkcyBFeHAgCisgKiBhbmQKKyAqIG1ha2VfZmlsdGVyLHYgMS42IDIwMDQvMDEvMDcgMjE6MzM6MDEgZHMgRXhwIAorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWdhbW1hCisgKgorICogUGVyZm9ybXMgZ2FtbWEgY29ycmVjdGlvbiBvbiBhIHZpZGVvIHN0cmVhbS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdmlkZW90ZXN0c3JjICEgZ2FtbWEgZ2FtbWE9Mi4wICEgdmlkZW9jb252ZXJ0ICEgeGltYWdlc2luaworICogXXwgVGhpcyBwaXBlbGluZSB3aWxsIG1ha2UgdGhlIGltYWdlICJicmlnaHRlciIuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdmlkZW90ZXN0c3JjICEgZ2FtbWEgZ2FtbWE9MC41ICEgdmlkZW9jb252ZXJ0ICEgeGltYWdlc2luaworICogXXwgVGhpcyBwaXBlbGluZSB3aWxsIG1ha2UgdGhlIGltYWdlICJkYXJrZXIiLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RnYW1tYS5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnYW1tYV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnYW1tYV9kZWJ1ZworCisvKiBHc3RHYW1tYSBwcm9wZXJ0aWVzICovCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9HQU1NQQorICAgICAgLyogRklMTCBNRSAqLworfTsKKworI2RlZmluZSBERUZBVUxUX1BST1BfR0FNTUEgIDEKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9nYW1tYV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgQVlVViwgIgorICAgICAgICAgICAgIkFSR0IsIEJHUkEsIEFCR1IsIFJHQkEsIFk0NDQsICIKKyAgICAgICAgICAgICJ4UkdCLCBSR0J4LCB4QkdSLCBCR1J4LCBSR0IsIEJHUiwgWTQyQiwgTlYxMiwgIgorICAgICAgICAgICAgIk5WMjEsIFlVWTIsIFVZVlksIFlWWVUsIEk0MjAsIFlWMTIsIElZVVYsIFk0MUIgfSIpKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfZ2FtbWFfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IEFZVVYsICIKKyAgICAgICAgICAgICJBUkdCLCBCR1JBLCBBQkdSLCBSR0JBLCBZNDQ0LCAiCisgICAgICAgICAgICAieFJHQiwgUkdCeCwgeEJHUiwgQkdSeCwgUkdCLCBCR1IsIFk0MkIsIE5WMTIsICIKKyAgICAgICAgICAgICJOVjIxLCBZVVkyLCBVWVZZLCBZVllVLCBJNDIwLCBZVjEyLCBJWVVWLCBZNDFCIH0iKSkKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfZ2FtbWFfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2dhbW1hX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9nYW1tYV9zZXRfaW5mbyAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RDYXBzICogaW5jYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfZ2FtbWFfdHJhbnNmb3JtX2ZyYW1lX2lwIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsCisgICAgR3N0VmlkZW9GcmFtZSAqIGZyYW1lKTsKK3N0YXRpYyB2b2lkIGdzdF9nYW1tYV9iZWZvcmVfdHJhbnNmb3JtIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnNmb3JtLAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyB2b2lkIGdzdF9nYW1tYV9jYWxjdWxhdGVfdGFibGVzIChHc3RHYW1tYSAqIGdhbW1hKTsKKworR19ERUZJTkVfVFlQRSAoR3N0R2FtbWEsIGdzdF9nYW1tYSwgR1NUX1RZUEVfVklERU9fRklMVEVSKTsKKworc3RhdGljIHZvaWQKK2dzdF9nYW1tYV9jbGFzc19pbml0IChHc3RHYW1tYUNsYXNzICogZ19jbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBnX2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGdfY2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqdHJhbnNfY2xhc3MgPSAoR3N0QmFzZVRyYW5zZm9ybUNsYXNzICopIGdfY2xhc3M7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgKnZmaWx0ZXJfY2xhc3MgPSAoR3N0VmlkZW9GaWx0ZXJDbGFzcyAqKSBnX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnYW1tYV9kZWJ1ZywgImdhbW1hIiwgMCwgImdhbW1hIik7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2dhbW1hX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2dhbW1hX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0dBTU1BLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoImdhbW1hIiwgIkdhbW1hIiwgImdhbW1hIiwKKyAgICAgICAgICAwLjAxLCAxMCwgREVGQVVMVF9QUk9QX0dBTU1BLAorICAgICAgICAgIEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlZpZGVvIGdhbW1hIGNvcnJlY3Rpb24iLCAiRmlsdGVyL0VmZmVjdC9WaWRlbyIsCisgICAgICAiQWRqdXN0cyBnYW1tYSBvbiBhIHZpZGVvIHN0cmVhbSIsICJBcndlZCB2LiBNZXJrYXR6IDx2Lm1lcmthdHpAZ214Lm5ldCIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9nYW1tYV9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X2dhbW1hX3NyY190ZW1wbGF0ZSk7CisKKyAgdHJhbnNfY2xhc3MtPmJlZm9yZV90cmFuc2Zvcm0gPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9nYW1tYV9iZWZvcmVfdHJhbnNmb3JtKTsKKyAgdHJhbnNfY2xhc3MtPnRyYW5zZm9ybV9pcF9vbl9wYXNzdGhyb3VnaCA9IEZBTFNFOworCisgIHZmaWx0ZXJfY2xhc3MtPnNldF9pbmZvID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9nYW1tYV9zZXRfaW5mbyk7CisgIHZmaWx0ZXJfY2xhc3MtPnRyYW5zZm9ybV9mcmFtZV9pcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2dhbW1hX3RyYW5zZm9ybV9mcmFtZV9pcCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZ2FtbWFfaW5pdCAoR3N0R2FtbWEgKiBnYW1tYSkKK3sKKyAgLyogcHJvcGVydGllcyAqLworICBnYW1tYS0+Z2FtbWEgPSBERUZBVUxUX1BST1BfR0FNTUE7CisgIGdzdF9nYW1tYV9jYWxjdWxhdGVfdGFibGVzIChnYW1tYSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZ2FtbWFfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEdhbW1hICpnYW1tYSA9IEdTVF9HQU1NQSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfR0FNTUE6eworICAgICAgZ2RvdWJsZSB2YWwgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZ2FtbWEsICJDaGFuZ2luZyBnYW1tYSBmcm9tICVsZiB0byAlbGYiLCBnYW1tYS0+Z2FtbWEsCisgICAgICAgICAgdmFsKTsKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZ2FtbWEpOworICAgICAgZ2FtbWEtPmdhbW1hID0gdmFsOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGdhbW1hKTsKKyAgICAgIGdzdF9nYW1tYV9jYWxjdWxhdGVfdGFibGVzIChnYW1tYSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2dhbW1hX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RHYW1tYSAqZ2FtbWEgPSBHU1RfR0FNTUEgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0dBTU1BOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgZ2FtbWEtPmdhbW1hKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9nYW1tYV9jYWxjdWxhdGVfdGFibGVzIChHc3RHYW1tYSAqIGdhbW1hKQoreworICBnaW50IG47CisgIGdkb3VibGUgdmFsOworICBnZG91YmxlIGV4cDsKKyAgZ2Jvb2xlYW4gcGFzc3Rocm91Z2ggPSBGQUxTRTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGdhbW1hKTsKKyAgaWYgKGdhbW1hLT5nYW1tYSA9PSAxLjApIHsKKyAgICBwYXNzdGhyb3VnaCA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgZXhwID0gMS4wIC8gZ2FtbWEtPmdhbW1hOworICAgIGZvciAobiA9IDA7IG4gPCAyNTY7IG4rKykgeworICAgICAgdmFsID0gbiAvIDI1NS4wOworICAgICAgdmFsID0gcG93ICh2YWwsIGV4cCk7CisgICAgICB2YWwgPSAyNTUuMCAqIHZhbDsKKyAgICAgIGdhbW1hLT5nYW1tYV90YWJsZVtuXSA9IChndWludDgpIGZsb29yICh2YWwgKyAwLjUpOworICAgIH0KKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoZ2FtbWEpOworCisgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfcGFzc3Rocm91Z2ggKEdTVF9CQVNFX1RSQU5TRk9STSAoZ2FtbWEpLCBwYXNzdGhyb3VnaCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZ2FtbWFfcGxhbmFyX3l1dl9pcCAoR3N0R2FtbWEgKiBnYW1tYSwgR3N0VmlkZW9GcmFtZSAqIGZyYW1lKQoreworICBnaW50IGksIGosIGhlaWdodDsKKyAgZ2ludCB3aWR0aCwgc3RyaWRlLCByb3dfd3JhcDsKKyAgY29uc3QgZ3VpbnQ4ICp0YWJsZSA9IGdhbW1hLT5nYW1tYV90YWJsZTsKKyAgZ3VpbnQ4ICpkYXRhOworCisgIGRhdGEgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZSwgMCk7CisgIHN0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUsIDApOworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9DT01QX1dJRFRIIChmcmFtZSwgMCk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZnJhbWUsIDApOworICByb3dfd3JhcCA9IHN0cmlkZSAtIHdpZHRoOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAqZGF0YSA9IHRhYmxlWypkYXRhXTsKKyAgICAgIGRhdGErKzsKKyAgICB9CisgICAgZGF0YSArPSByb3dfd3JhcDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2dhbW1hX3BhY2tlZF95dXZfaXAgKEdzdEdhbW1hICogZ2FtbWEsIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSkKK3sKKyAgZ2ludCBpLCBqLCBoZWlnaHQ7CisgIGdpbnQgd2lkdGgsIHN0cmlkZSwgcm93X3dyYXA7CisgIGdpbnQgcGl4ZWxfc3RyaWRlOworICBjb25zdCBndWludDggKnRhYmxlID0gZ2FtbWEtPmdhbW1hX3RhYmxlOworICBndWludDggKmRhdGE7CisKKyAgZGF0YSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lLCAwKTsKKyAgc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChmcmFtZSwgMCk7CisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGZyYW1lLCAwKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChmcmFtZSwgMCk7CisgIHBpeGVsX3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BTVFJJREUgKGZyYW1lLCAwKTsKKyAgcm93X3dyYXAgPSBzdHJpZGUgLSBwaXhlbF9zdHJpZGUgKiB3aWR0aDsKKworICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgKmRhdGEgPSB0YWJsZVsqZGF0YV07CisgICAgICBkYXRhICs9IHBpeGVsX3N0cmlkZTsKKyAgICB9CisgICAgZGF0YSArPSByb3dfd3JhcDsKKyAgfQorfQorCitzdGF0aWMgY29uc3QgaW50IGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfc2R0dltdID0geworICAyOTgsIDAsIDQwOSwgLTU3MDY4LAorICAyOTgsIC0xMDAsIC0yMDgsIDM0NzA3LAorICAyOTgsIDUxNiwgMCwgLTcwODcwLAorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9zZHR2W10gPSB7CisgIDY2LCAxMjksIDI1LCA0MDk2LAorICAtMzgsIC03NCwgMTEyLCAzMjc2OCwKKyAgMTEyLCAtOTQsIC0xOCwgMzI3NjgsCit9OworCisjZGVmaW5lIEFQUExZX01BVFJJWChtLG8sdjEsdjIsdjMpICgobVtvKjRdICogdjEgKyBtW28qNCsxXSAqIHYyICsgbVtvKjQrMl0gKiB2MyArIG1bbyo0KzNdKSA+PiA4KQorCitzdGF0aWMgdm9pZAorZ3N0X2dhbW1hX3BhY2tlZF9yZ2JfaXAgKEdzdEdhbW1hICogZ2FtbWEsIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSkKK3sKKyAgZ2ludCBpLCBqLCBoZWlnaHQ7CisgIGdpbnQgd2lkdGgsIHN0cmlkZSwgcm93X3dyYXA7CisgIGdpbnQgcGl4ZWxfc3RyaWRlOworICBjb25zdCBndWludDggKnRhYmxlID0gZ2FtbWEtPmdhbW1hX3RhYmxlOworICBnaW50IG9mZnNldHNbM107CisgIGdpbnQgciwgZywgYjsKKyAgZ2ludCB5LCB1LCB2OworICBndWludDggKmRhdGE7CisKKyAgZGF0YSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7CisgIHN0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGZyYW1lLCAwKTsKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZnJhbWUsIDApOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9IRUlHSFQgKGZyYW1lLCAwKTsKKworICBvZmZzZXRzWzBdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfT0ZGU0VUIChmcmFtZSwgMCk7CisgIG9mZnNldHNbMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKGZyYW1lLCAxKTsKKyAgb2Zmc2V0c1syXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX09GRlNFVCAoZnJhbWUsIDIpOworCisgIHBpeGVsX3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BTVFJJREUgKGZyYW1lLCAwKTsKKyAgcm93X3dyYXAgPSBzdHJpZGUgLSBwaXhlbF9zdHJpZGUgKiB3aWR0aDsKKworICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgciA9IGRhdGFbb2Zmc2V0c1swXV07CisgICAgICBnID0gZGF0YVtvZmZzZXRzWzFdXTsKKyAgICAgIGIgPSBkYXRhW29mZnNldHNbMl1dOworCisgICAgICB5ID0gQVBQTFlfTUFUUklYIChjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYsIDAsIHIsIGcsIGIpOworICAgICAgdSA9IEFQUExZX01BVFJJWCAoY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9zZHR2LCAxLCByLCBnLCBiKTsKKyAgICAgIHYgPSBBUFBMWV9NQVRSSVggKGNvZ19yZ2JfdG9feWNiY3JfbWF0cml4XzhiaXRfc2R0diwgMiwgciwgZywgYik7CisKKyAgICAgIHkgPSB0YWJsZVtDTEFNUCAoeSwgMCwgMjU1KV07CisgICAgICByID0gQVBQTFlfTUFUUklYIChjb2dfeWNiY3JfdG9fcmdiX21hdHJpeF84Yml0X3NkdHYsIDAsIHksIHUsIHYpOworICAgICAgZyA9IEFQUExZX01BVFJJWCAoY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9zZHR2LCAxLCB5LCB1LCB2KTsKKyAgICAgIGIgPSBBUFBMWV9NQVRSSVggKGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfc2R0diwgMiwgeSwgdSwgdik7CisKKyAgICAgIGRhdGFbb2Zmc2V0c1swXV0gPSBDTEFNUCAociwgMCwgMjU1KTsKKyAgICAgIGRhdGFbb2Zmc2V0c1sxXV0gPSBDTEFNUCAoZywgMCwgMjU1KTsKKyAgICAgIGRhdGFbb2Zmc2V0c1syXV0gPSBDTEFNUCAoYiwgMCwgMjU1KTsKKyAgICAgIGRhdGEgKz0gcGl4ZWxfc3RyaWRlOworICAgIH0KKyAgICBkYXRhICs9IHJvd193cmFwOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2dhbW1hX3NldF9pbmZvIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsIEdzdENhcHMgKiBpbmNhcHMsCisgICAgR3N0VmlkZW9JbmZvICogaW5faW5mbywgR3N0Q2FwcyAqIG91dGNhcHMsIEdzdFZpZGVvSW5mbyAqIG91dF9pbmZvKQoreworICBHc3RHYW1tYSAqZ2FtbWEgPSBHU1RfR0FNTUEgKHZmaWx0ZXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGdhbW1hLAorICAgICAgInNldHRpbmcgY2FwczogaW4gJSIgR1NUX1BUUl9GT1JNQVQgIiBvdXQgJSIgR1NUX1BUUl9GT1JNQVQsIGluY2FwcywKKyAgICAgIG91dGNhcHMpOworCisgIHN3aXRjaCAoR1NUX1ZJREVPX0lORk9fRk9STUFUIChpbl9pbmZvKSkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9JNDIwOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVjEyOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDFCOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDQ0OgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9OVjEyOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9OVjIxOgorICAgICAgZ2FtbWEtPnByb2Nlc3MgPSBnc3RfZ2FtbWFfcGxhbmFyX3l1dl9pcDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVVkyOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9VWVZZOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVllVOgorICAgICAgZ2FtbWEtPnByb2Nlc3MgPSBnc3RfZ2FtbWFfcGFja2VkX3l1dl9pcDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BUkdCOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BQkdSOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1JBOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94UkdCOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94QkdSOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0J4OgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1J4OgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUjoKKyAgICAgIGdhbW1hLT5wcm9jZXNzID0gZ3N0X2dhbW1hX3BhY2tlZF9yZ2JfaXA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ290byBpbnZhbGlkX2NhcHM7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfY2FwczoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGdhbW1hLCAiSW52YWxpZCBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgaW5jYXBzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9nYW1tYV9iZWZvcmVfdHJhbnNmb3JtIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwgR3N0QnVmZmVyICogb3V0YnVmKQoreworICBHc3RHYW1tYSAqZ2FtbWEgPSBHU1RfR0FNTUEgKGJhc2UpOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBzdHJlYW1fdGltZTsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKTsKKyAgc3RyZWFtX3RpbWUgPQorICAgICAgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZiYXNlLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsIHRpbWVzdGFtcCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZ2FtbWEsICJzeW5jIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtX3RpbWUpKQorICAgIGdzdF9vYmplY3Rfc3luY192YWx1ZXMgKEdTVF9PQkpFQ1QgKGdhbW1hKSwgc3RyZWFtX3RpbWUpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2dhbW1hX3RyYW5zZm9ybV9mcmFtZV9pcCAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RWaWRlb0ZyYW1lICogZnJhbWUpCit7CisgIEdzdEdhbW1hICpnYW1tYSA9IEdTVF9HQU1NQSAodmZpbHRlcik7CisKKyAgaWYgKCFnYW1tYS0+cHJvY2VzcykKKyAgICBnb3RvIG5vdF9uZWdvdGlhdGVkOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZ2FtbWEpOworICBnYW1tYS0+cHJvY2VzcyAoZ2FtbWEsIGZyYW1lKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGdhbW1hKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVJST1JTICovCitub3RfbmVnb3RpYXRlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGdhbW1hLCAiTm90IG5lZ290aWF0ZWQgeWV0Iik7CisgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuaCBiL2dzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZjk2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuaApAQCAtMCwwICsxLDc1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBBcndlZCB2LiBNZXJrYXR6IDx2Lm1lcmthdHpAZ214Lm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9WSURFT19HQU1NQV9IX18KKyNkZWZpbmUgX19HU1RfVklERU9fR0FNTUFfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9HQU1NQSBcCisgIChnc3RfZ2FtbWFfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0dBTU1BKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfR0FNTUEsR3N0R2FtbWEpKQorI2RlZmluZSBHU1RfR0FNTUFfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfR0FNTUEsR3N0R2FtbWFDbGFzcykpCisjZGVmaW5lIEdTVF9JU19HQU1NQShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0dBTU1BKSkKKyNkZWZpbmUgR1NUX0lTX0dBTU1BX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0dBTU1BKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEdhbW1hIEdzdEdhbW1hOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEdhbW1hQ2xhc3MgR3N0R2FtbWFDbGFzczsKKworLyoqCisgKiBHc3RHYW1tYToKKyAqCisgKiBPcGFxdWUgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0R2FtbWEKK3sKKyAgR3N0VmlkZW9GaWx0ZXIgdmlkZW9maWx0ZXI7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKyAgLyogcHJvcGVydGllcyAqLworICBnZG91YmxlIGdhbW1hOworCisgIC8qIHRhYmxlcyAqLworICBndWludDggZ2FtbWFfdGFibGVbMjU2XTsKKworICB2b2lkICgqcHJvY2VzcykgKEdzdEdhbW1hICpnYW1tYSwgR3N0VmlkZW9GcmFtZSAqZnJhbWUpOworfTsKKworc3RydWN0IF9Hc3RHYW1tYUNsYXNzCit7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2dhbW1hX2dldF90eXBlKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfVklERU9fR0FNTUFfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmMgYi9nc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4YmNkNwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYwpAQCAtMCwwICsxLDg0MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDEwPiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyAocHJvYmFibHkpIGdlbmVyYXRlZCBmcm9tIGdzdHZpZGVvYmFsYW5jZS5jLAorICogZ3N0dmlkZW9iYWxhbmNlLmMsdiAxLjcgMjAwMy8xMS8wOCAwMjo0ODo1OSBkc2NobGVlZiBFeHAgCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtdmlkZW9iYWxhbmNlCisgKgorICogQWRqdXN0cyBicmlnaHRuZXNzLCBjb250cmFzdCwgaHVlLCBzYXR1cmF0aW9uIG9uIGEgdmlkZW8gc3RyZWFtLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB2aWRlb3Rlc3RzcmMgISB2aWRlb2JhbGFuY2Ugc2F0dXJhdGlvbj0wLjAgISB2aWRlb2NvbnZlcnQgISB4aW1hZ2VzaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIGNvbnZlcnRzIHRoZSBpbWFnZSB0byBibGFjayBhbmQgd2hpdGUgYnkgc2V0dGluZyB0aGUKKyAqIHNhdHVyYXRpb24gdG8gMC4wLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvbWF0aC1jb21wYXQuaD4KKworI2luY2x1ZGUgImdzdHZpZGVvYmFsYW5jZS5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2NvbG9yYmFsYW5jZS5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDICh2aWRlb2JhbGFuY2VfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgdmlkZW9iYWxhbmNlX2RlYnVnCisKKy8qIEdzdFZpZGVvQmFsYW5jZSBwcm9wZXJ0aWVzICovCisjZGVmaW5lIERFRkFVTFRfUFJPUF9DT05UUkFTVAkJMS4wCisjZGVmaW5lIERFRkFVTFRfUFJPUF9CUklHSFRORVNTCQkwLjAKKyNkZWZpbmUgREVGQVVMVF9QUk9QX0hVRQkJMC4wCisjZGVmaW5lIERFRkFVTFRfUFJPUF9TQVRVUkFUSU9OCQkxLjAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQ09OVFJBU1QsCisgIFBST1BfQlJJR0hUTkVTUywKKyAgUFJPUF9IVUUsCisgIFBST1BfU0FUVVJBVElPTgorfTsKKworI2RlZmluZSBQUk9DRVNTSU5HX0NBUFMgXAorICAieyBBWVVWLCBBUkdCLCBCR1JBLCBBQkdSLCBSR0JBLCBZNDQ0LCB4UkdCLCBSR0J4LCAiIFwKKyAgInhCR1IsIEJHUngsIFJHQiwgQkdSLCBZNDJCLCBZVVkyLCBVWVZZLCBZVllVLCAiIFwKKyAgIkk0MjAsIFlWMTIsIElZVVYsIFk0MUIsIE5WMTIsIE5WMjEgfSIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF92aWRlb19iYWxhbmNlX3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoUFJPQ0VTU0lOR19DQVBTKSAiOyIKKyAgICAgICAgInZpZGVvL3gtcmF3KEFOWSkiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfdmlkZW9fYmFsYW5jZV9zaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKFBST0NFU1NJTkdfQ0FQUykgIjsiCisgICAgICAgICJ2aWRlby94LXJhdyhBTlkpIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfdmlkZW9fYmFsYW5jZV9jb2xvcmJhbGFuY2VfaW5pdCAoR3N0Q29sb3JCYWxhbmNlSW50ZXJmYWNlICoKKyAgICBpZmFjZSk7CisKK3N0YXRpYyB2b2lkIGdzdF92aWRlb19iYWxhbmNlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF92aWRlb19iYWxhbmNlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworI2RlZmluZSBnc3RfdmlkZW9fYmFsYW5jZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoR3N0VmlkZW9CYWxhbmNlLCBnc3RfdmlkZW9fYmFsYW5jZSwKKyAgICBHU1RfVFlQRV9WSURFT19GSUxURVIsCisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9DT0xPUl9CQUxBTkNFLAorICAgICAgICBnc3RfdmlkZW9fYmFsYW5jZV9jb2xvcmJhbGFuY2VfaW5pdCkpOworCisvKgorICogbG9vay11cCB0YWJsZXMgKExVVCkuCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fYmFsYW5jZV91cGRhdGVfdGFibGVzIChHc3RWaWRlb0JhbGFuY2UgKiB2YikKK3sKKyAgZ2ludCBpLCBqOworICBnZG91YmxlIHksIHUsIHYsIGh1ZV9jb3MsIGh1ZV9zaW47CisKKyAgLyogWSAqLworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICB5ID0gMTYgKyAoKGkgLSAxNikgKiB2Yi0+Y29udHJhc3QgKyB2Yi0+YnJpZ2h0bmVzcyAqIDI1NSk7CisgICAgaWYgKHkgPCAwKQorICAgICAgeSA9IDA7CisgICAgZWxzZSBpZiAoeSA+IDI1NSkKKyAgICAgIHkgPSAyNTU7CisgICAgdmItPnRhYmxleVtpXSA9IHJpbnQgKHkpOworICB9CisKKyAgaHVlX2NvcyA9IGNvcyAoR19QSSAqIHZiLT5odWUpOworICBodWVfc2luID0gc2luIChHX1BJICogdmItPmh1ZSk7CisKKyAgLyogVS9WIGxvb2t1cCB0YWJsZXMgYXJlIDJELCBzaW5jZSB3ZSBuZWVkIGJvdGggVS9WIGZvciBlYWNoIHRhYmxlCisgICAqIHNlcGFyYXRlbHkuICovCisgIGZvciAoaSA9IC0xMjg7IGkgPCAxMjg7IGkrKykgeworICAgIGZvciAoaiA9IC0xMjg7IGogPCAxMjg7IGorKykgeworICAgICAgdSA9IDEyOCArICgoaSAqIGh1ZV9jb3MgKyBqICogaHVlX3NpbikgKiB2Yi0+c2F0dXJhdGlvbik7CisgICAgICB2ID0gMTI4ICsgKCgtaSAqIGh1ZV9zaW4gKyBqICogaHVlX2NvcykgKiB2Yi0+c2F0dXJhdGlvbik7CisgICAgICBpZiAodSA8IDApCisgICAgICAgIHUgPSAwOworICAgICAgZWxzZSBpZiAodSA+IDI1NSkKKyAgICAgICAgdSA9IDI1NTsKKyAgICAgIGlmICh2IDwgMCkKKyAgICAgICAgdiA9IDA7CisgICAgICBlbHNlIGlmICh2ID4gMjU1KQorICAgICAgICB2ID0gMjU1OworICAgICAgdmItPnRhYmxldVtpICsgMTI4XVtqICsgMTI4XSA9IHJpbnQgKHUpOworICAgICAgdmItPnRhYmxldltpICsgMTI4XVtqICsgMTI4XSA9IHJpbnQgKHYpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92aWRlb19iYWxhbmNlX2lzX3Bhc3N0aHJvdWdoIChHc3RWaWRlb0JhbGFuY2UgKiB2aWRlb2JhbGFuY2UpCit7CisgIHJldHVybiB2aWRlb2JhbGFuY2UtPmNvbnRyYXN0ID09IDEuMCAmJgorICAgICAgdmlkZW9iYWxhbmNlLT5icmlnaHRuZXNzID09IDAuMCAmJgorICAgICAgdmlkZW9iYWxhbmNlLT5odWUgPT0gMC4wICYmIHZpZGVvYmFsYW5jZS0+c2F0dXJhdGlvbiA9PSAxLjA7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fYmFsYW5jZV91cGRhdGVfcHJvcGVydGllcyAoR3N0VmlkZW9CYWxhbmNlICogdmlkZW9iYWxhbmNlKQoreworICBnYm9vbGVhbiBwYXNzdGhyb3VnaDsKKyAgR3N0QmFzZVRyYW5zZm9ybSAqYmFzZSA9IEdTVF9CQVNFX1RSQU5TRk9STSAodmlkZW9iYWxhbmNlKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHZpZGVvYmFsYW5jZSk7CisgIHBhc3N0aHJvdWdoID0gZ3N0X3ZpZGVvX2JhbGFuY2VfaXNfcGFzc3Rocm91Z2ggKHZpZGVvYmFsYW5jZSk7CisgIGlmICghcGFzc3Rocm91Z2gpCisgICAgZ3N0X3ZpZGVvX2JhbGFuY2VfdXBkYXRlX3RhYmxlcyAodmlkZW9iYWxhbmNlKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHZpZGVvYmFsYW5jZSk7CisKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9wYXNzdGhyb3VnaCAoYmFzZSwgcGFzc3Rocm91Z2gpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2JhbGFuY2VfcGxhbmFyX3l1diAoR3N0VmlkZW9CYWxhbmNlICogdmlkZW9iYWxhbmNlLAorICAgIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSkKK3sKKyAgZ2ludCB4LCB5OworICBndWludDggKnlkYXRhOworICBndWludDggKnVkYXRhLCAqdmRhdGE7CisgIGdpbnQgeXN0cmlkZSwgdXN0cmlkZSwgdnN0cmlkZTsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnaW50IHdpZHRoMiwgaGVpZ2h0MjsKKyAgZ3VpbnQ4ICp0YWJsZXkgPSB2aWRlb2JhbGFuY2UtPnRhYmxleTsKKyAgZ3VpbnQ4ICoqdGFibGV1ID0gdmlkZW9iYWxhbmNlLT50YWJsZXU7CisgIGd1aW50OCAqKnRhYmxldiA9IHZpZGVvYmFsYW5jZS0+dGFibGV2OworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChmcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGZyYW1lKTsKKworICB5ZGF0YSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7CisgIHlzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChmcmFtZSwgMCk7CisKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgZ3VpbnQ4ICp5cHRyOworCisgICAgeXB0ciA9IHlkYXRhICsgeSAqIHlzdHJpZGU7CisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICp5cHRyID0gdGFibGV5Wyp5cHRyXTsKKyAgICAgIHlwdHIrKzsKKyAgICB9CisgIH0KKworICB3aWR0aDIgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZnJhbWUsIDEpOworICBoZWlnaHQyID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChmcmFtZSwgMSk7CisKKyAgdWRhdGEgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZnJhbWUsIDEpOworICB2ZGF0YSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMik7CisgIHVzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChmcmFtZSwgMSk7CisgIHZzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChmcmFtZSwgMik7CisKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDI7IHkrKykgeworICAgIGd1aW50OCAqdXB0ciwgKnZwdHI7CisgICAgZ3VpbnQ4IHUxLCB2MTsKKworICAgIHVwdHIgPSB1ZGF0YSArIHkgKiB1c3RyaWRlOworICAgIHZwdHIgPSB2ZGF0YSArIHkgKiB2c3RyaWRlOworCisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoMjsgeCsrKSB7CisgICAgICB1MSA9ICp1cHRyOworICAgICAgdjEgPSAqdnB0cjsKKworICAgICAgKnVwdHIrKyA9IHRhYmxldVt1MV1bdjFdOworICAgICAgKnZwdHIrKyA9IHRhYmxldlt1MV1bdjFdOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2JhbGFuY2Vfc2VtaXBsYW5hcl95dXYgKEdzdFZpZGVvQmFsYW5jZSAqIHZpZGVvYmFsYW5jZSwKKyAgICBHc3RWaWRlb0ZyYW1lICogZnJhbWUpCit7CisgIGdpbnQgeCwgeTsKKyAgZ3VpbnQ4ICp5ZGF0YTsKKyAgZ3VpbnQ4ICp1dmRhdGE7CisgIGdpbnQgeXN0cmlkZSwgdXZzdHJpZGU7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCB3aWR0aDIsIGhlaWdodDI7CisgIGd1aW50OCAqdGFibGV5ID0gdmlkZW9iYWxhbmNlLT50YWJsZXk7CisgIGd1aW50OCAqKnRhYmxldSA9IHZpZGVvYmFsYW5jZS0+dGFibGV1OworICBndWludDggKip0YWJsZXYgPSB2aWRlb2JhbGFuY2UtPnRhYmxldjsKKyAgZ2ludCB1cG9zLCB2cG9zOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChmcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGZyYW1lKTsKKworICB5ZGF0YSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7CisgIHlzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChmcmFtZSwgMCk7CisKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgZ3VpbnQ4ICp5cHRyOworCisgICAgeXB0ciA9IHlkYXRhICsgeSAqIHlzdHJpZGU7CisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICp5cHRyID0gdGFibGV5Wyp5cHRyXTsKKyAgICAgIHlwdHIrKzsKKyAgICB9CisgIH0KKworICB3aWR0aDIgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZnJhbWUsIDEpOworICBoZWlnaHQyID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChmcmFtZSwgMSk7CisKKyAgdXZkYXRhID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZyYW1lLCAxKTsKKyAgdXZzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChmcmFtZSwgMSk7CisKKyAgdXBvcyA9IEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoJmZyYW1lLT5pbmZvKSA9PSBHU1RfVklERU9fRk9STUFUX05WMTIgPyAwIDogMTsKKyAgdnBvcyA9IEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoJmZyYW1lLT5pbmZvKSA9PSBHU1RfVklERU9fRk9STUFUX05WMTIgPyAxIDogMDsKKworICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0MjsgeSsrKSB7CisgICAgZ3VpbnQ4ICp1dnB0cjsKKyAgICBndWludDggdTEsIHYxOworCisgICAgdXZwdHIgPSB1dmRhdGEgKyB5ICogdXZzdHJpZGU7CisKKyAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGgyOyB4KyspIHsKKyAgICAgIHUxID0gdXZwdHJbdXBvc107CisgICAgICB2MSA9IHV2cHRyW3Zwb3NdOworCisgICAgICB1dnB0clt1cG9zXSA9IHRhYmxldVt1MV1bdjFdOworICAgICAgdXZwdHJbdnBvc10gPSB0YWJsZXZbdTFdW3YxXTsKKyAgICAgIHV2cHRyICs9IDI7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fYmFsYW5jZV9wYWNrZWRfeXV2IChHc3RWaWRlb0JhbGFuY2UgKiB2aWRlb2JhbGFuY2UsCisgICAgR3N0VmlkZW9GcmFtZSAqIGZyYW1lKQoreworICBnaW50IHgsIHksIHN0cmlkZTsKKyAgZ3VpbnQ4ICp5ZGF0YSwgKnVkYXRhLCAqdmRhdGE7CisgIGdpbnQgeW9mZiwgdW9mZiwgdm9mZjsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnaW50IHdpZHRoMiwgaGVpZ2h0MjsKKyAgZ3VpbnQ4ICp0YWJsZXkgPSB2aWRlb2JhbGFuY2UtPnRhYmxleTsKKyAgZ3VpbnQ4ICoqdGFibGV1ID0gdmlkZW9iYWxhbmNlLT50YWJsZXU7CisgIGd1aW50OCAqKnRhYmxldiA9IHZpZGVvYmFsYW5jZS0+dGFibGV2OworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChmcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGZyYW1lKTsKKworICBzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChmcmFtZSwgMCk7CisgIHlkYXRhID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZnJhbWUsIDApOworICB5b2ZmID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUFNUUklERSAoZnJhbWUsIDApOworCisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgIGd1aW50OCAqeXB0cjsKKworICAgIHlwdHIgPSB5ZGF0YSArIHkgKiBzdHJpZGU7CisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICp5cHRyID0gdGFibGV5Wyp5cHRyXTsKKyAgICAgIHlwdHIgKz0geW9mZjsKKyAgICB9CisgIH0KKworICB3aWR0aDIgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZnJhbWUsIDEpOworICBoZWlnaHQyID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChmcmFtZSwgMSk7CisKKyAgdWRhdGEgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZSwgMSk7CisgIHZkYXRhID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZnJhbWUsIDIpOworICB1b2ZmID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUFNUUklERSAoZnJhbWUsIDEpOworICB2b2ZmID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUFNUUklERSAoZnJhbWUsIDIpOworCisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQyOyB5KyspIHsKKyAgICBndWludDggKnVwdHIsICp2cHRyOworICAgIGd1aW50OCB1MSwgdjE7CisKKyAgICB1cHRyID0gdWRhdGEgKyB5ICogc3RyaWRlOworICAgIHZwdHIgPSB2ZGF0YSArIHkgKiBzdHJpZGU7CisKKyAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGgyOyB4KyspIHsKKyAgICAgIHUxID0gKnVwdHI7CisgICAgICB2MSA9ICp2cHRyOworCisgICAgICAqdXB0ciA9IHRhYmxldVt1MV1bdjFdOworICAgICAgKnZwdHIgPSB0YWJsZXZbdTFdW3YxXTsKKworICAgICAgdXB0ciArPSB1b2ZmOworICAgICAgdnB0ciArPSB2b2ZmOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgY29uc3QgaW50IGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfc2R0dltdID0geworICAyOTgsIDAsIDQwOSwgLTU3MDY4LAorICAyOTgsIC0xMDAsIC0yMDgsIDM0NzA3LAorICAyOTgsIDUxNiwgMCwgLTcwODcwLAorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9zZHR2W10gPSB7CisgIDY2LCAxMjksIDI1LCA0MDk2LAorICAtMzgsIC03NCwgMTEyLCAzMjc2OCwKKyAgMTEyLCAtOTQsIC0xOCwgMzI3NjgsCit9OworCisjZGVmaW5lIEFQUExZX01BVFJJWChtLG8sdjEsdjIsdjMpICgobVtvKjRdICogdjEgKyBtW28qNCsxXSAqIHYyICsgbVtvKjQrMl0gKiB2MyArIG1bbyo0KzNdKSA+PiA4KQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2JhbGFuY2VfcGFja2VkX3JnYiAoR3N0VmlkZW9CYWxhbmNlICogdmlkZW9iYWxhbmNlLAorICAgIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSkKK3sKKyAgZ2ludCBpLCBqLCBoZWlnaHQ7CisgIGdpbnQgd2lkdGgsIHN0cmlkZSwgcm93X3dyYXA7CisgIGdpbnQgcGl4ZWxfc3RyaWRlOworICBndWludDggKmRhdGE7CisgIGdpbnQgb2Zmc2V0c1szXTsKKyAgZ2ludCByLCBnLCBiOworICBnaW50IHksIHUsIHY7CisgIGdpbnQgdV90bXAsIHZfdG1wOworICBndWludDggKnRhYmxleSA9IHZpZGVvYmFsYW5jZS0+dGFibGV5OworICBndWludDggKip0YWJsZXUgPSB2aWRlb2JhbGFuY2UtPnRhYmxldTsKKyAgZ3VpbnQ4ICoqdGFibGV2ID0gdmlkZW9iYWxhbmNlLT50YWJsZXY7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoZnJhbWUpOworCisgIG9mZnNldHNbMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKGZyYW1lLCAwKTsKKyAgb2Zmc2V0c1sxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX09GRlNFVCAoZnJhbWUsIDEpOworICBvZmZzZXRzWzJdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfT0ZGU0VUIChmcmFtZSwgMik7CisKKyAgZGF0YSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7CisgIHN0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGZyYW1lLCAwKTsKKworICBwaXhlbF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFIChmcmFtZSwgMCk7CisgIHJvd193cmFwID0gc3RyaWRlIC0gcGl4ZWxfc3RyaWRlICogd2lkdGg7CisKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgIHIgPSBkYXRhW29mZnNldHNbMF1dOworICAgICAgZyA9IGRhdGFbb2Zmc2V0c1sxXV07CisgICAgICBiID0gZGF0YVtvZmZzZXRzWzJdXTsKKworICAgICAgeSA9IEFQUExZX01BVFJJWCAoY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9zZHR2LCAwLCByLCBnLCBiKTsKKyAgICAgIHVfdG1wID0gQVBQTFlfTUFUUklYIChjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYsIDEsIHIsIGcsIGIpOworICAgICAgdl90bXAgPSBBUFBMWV9NQVRSSVggKGNvZ19yZ2JfdG9feWNiY3JfbWF0cml4XzhiaXRfc2R0diwgMiwgciwgZywgYik7CisKKyAgICAgIHkgPSBDTEFNUCAoeSwgMCwgMjU1KTsKKyAgICAgIHVfdG1wID0gQ0xBTVAgKHVfdG1wLCAwLCAyNTUpOworICAgICAgdl90bXAgPSBDTEFNUCAodl90bXAsIDAsIDI1NSk7CisKKyAgICAgIHkgPSB0YWJsZXlbeV07CisgICAgICB1ID0gdGFibGV1W3VfdG1wXVt2X3RtcF07CisgICAgICB2ID0gdGFibGV2W3VfdG1wXVt2X3RtcF07CisKKyAgICAgIHIgPSBBUFBMWV9NQVRSSVggKGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfc2R0diwgMCwgeSwgdSwgdik7CisgICAgICBnID0gQVBQTFlfTUFUUklYIChjb2dfeWNiY3JfdG9fcmdiX21hdHJpeF84Yml0X3NkdHYsIDEsIHksIHUsIHYpOworICAgICAgYiA9IEFQUExZX01BVFJJWCAoY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9zZHR2LCAyLCB5LCB1LCB2KTsKKworICAgICAgZGF0YVtvZmZzZXRzWzBdXSA9IENMQU1QIChyLCAwLCAyNTUpOworICAgICAgZGF0YVtvZmZzZXRzWzFdXSA9IENMQU1QIChnLCAwLCAyNTUpOworICAgICAgZGF0YVtvZmZzZXRzWzJdXSA9IENMQU1QIChiLCAwLCAyNTUpOworICAgICAgZGF0YSArPSBwaXhlbF9zdHJpZGU7CisgICAgfQorICAgIGRhdGEgKz0gcm93X3dyYXA7CisgIH0KK30KKworLyogZ2V0IG5vdGlmaWVkIG9mIGNhcHMgYW5kIHBsdWcgaW4gdGhlIGNvcnJlY3QgcHJvY2VzcyBmdW5jdGlvbiAqLworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9fYmFsYW5jZV9zZXRfaW5mbyAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RDYXBzICogaW5jYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0VmlkZW9CYWxhbmNlICp2aWRlb2JhbGFuY2UgPSBHU1RfVklERU9fQkFMQU5DRSAodmZpbHRlcik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodmlkZW9iYWxhbmNlLAorICAgICAgImluICUiIEdTVF9QVFJfRk9STUFUICIgb3V0ICUiIEdTVF9QVFJfRk9STUFULCBpbmNhcHMsIG91dGNhcHMpOworCisgIHZpZGVvYmFsYW5jZS0+cHJvY2VzcyA9IE5VTEw7CisKKyAgc3dpdGNoIChHU1RfVklERU9fSU5GT19GT1JNQVQgKGluX2luZm8pKSB7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWMTI6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MUI6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MkI6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0NDQ6CisgICAgICB2aWRlb2JhbGFuY2UtPnByb2Nlc3MgPSBnc3RfdmlkZW9fYmFsYW5jZV9wbGFuYXJfeXV2OworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lVWTI6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FZVVY6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWWVU6CisgICAgICB2aWRlb2JhbGFuY2UtPnByb2Nlc3MgPSBnc3RfdmlkZW9fYmFsYW5jZV9wYWNrZWRfeXV2OworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX05WMTI6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX05WMjE6CisgICAgICB2aWRlb2JhbGFuY2UtPnByb2Nlc3MgPSBnc3RfdmlkZW9fYmFsYW5jZV9zZW1pcGxhbmFyX3l1djsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BUkdCOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BQkdSOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1JBOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94UkdCOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94QkdSOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0J4OgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1J4OgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUjoKKyAgICAgIHZpZGVvYmFsYW5jZS0+cHJvY2VzcyA9IGdzdF92aWRlb19iYWxhbmNlX3BhY2tlZF9yZ2I7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKCFnc3RfdmlkZW9fYmFsYW5jZV9pc19wYXNzdGhyb3VnaCAodmlkZW9iYWxhbmNlKSkKKyAgICAgICAgZ290byB1bmtub3duX2Zvcm1hdDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCit1bmtub3duX2Zvcm1hdDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHZpZGVvYmFsYW5jZSwgInVua25vd24gZm9ybWF0ICUiIEdTVF9QVFJfRk9STUFULCBpbmNhcHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2JhbGFuY2VfYmVmb3JlX3RyYW5zZm9ybSAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0VmlkZW9CYWxhbmNlICpiYWxhbmNlID0gR1NUX1ZJREVPX0JBTEFOQ0UgKGJhc2UpOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBzdHJlYW1fdGltZTsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKTsKKyAgc3RyZWFtX3RpbWUgPQorICAgICAgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZiYXNlLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsIHRpbWVzdGFtcCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmFsYW5jZSwgInN5bmMgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSk7CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdHJlYW1fdGltZSkpCisgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoYmFsYW5jZSksIHN0cmVhbV90aW1lKTsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3ZpZGVvX2JhbGFuY2VfdHJhbnNmb3JtX2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLCBHc3RDYXBzICogY2FwcywgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0VmlkZW9CYWxhbmNlICpiYWxhbmNlID0gR1NUX1ZJREVPX0JBTEFOQ0UgKHRyYW5zKTsKKyAgR3N0Q2FwcyAqcmV0OworCisgIGlmICghZ3N0X3ZpZGVvX2JhbGFuY2VfaXNfcGFzc3Rocm91Z2ggKGJhbGFuY2UpKSB7CisgICAgc3RhdGljIEdzdFN0YXRpY0NhcHMgcmF3X2NhcHMgPQorICAgICAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKFBST0NFU1NJTkdfQ0FQUykpOworCisgICAgY2FwcyA9IGdzdF9jYXBzX2ludGVyc2VjdCAoY2FwcywgZ3N0X3N0YXRpY19jYXBzX2dldCAoJnJhd19jYXBzKSk7CisKKyAgICBpZiAoZmlsdGVyKSB7CisgICAgICByZXQgPSBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCBjYXBzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIH0gZWxzZSB7CisgICAgICByZXQgPSBjYXBzOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZmlsdGVyKSB7CisgICAgICByZXQgPSBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCBjYXBzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIH0gZWxzZSB7CisgICAgICByZXQgPSBnc3RfY2Fwc19yZWYgKGNhcHMpOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdmlkZW9fYmFsYW5jZV90cmFuc2Zvcm1fZnJhbWVfaXAgKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwKKyAgICBHc3RWaWRlb0ZyYW1lICogZnJhbWUpCit7CisgIEdzdFZpZGVvQmFsYW5jZSAqdmlkZW9iYWxhbmNlID0gR1NUX1ZJREVPX0JBTEFOQ0UgKHZmaWx0ZXIpOworCisgIGlmICghdmlkZW9iYWxhbmNlLT5wcm9jZXNzKQorICAgIGdvdG8gbm90X25lZ290aWF0ZWQ7CisKKyAgR1NUX09CSkVDVF9MT0NLICh2aWRlb2JhbGFuY2UpOworICB2aWRlb2JhbGFuY2UtPnByb2Nlc3MgKHZpZGVvYmFsYW5jZSwgZnJhbWUpOworICBHU1RfT0JKRUNUX1VOTE9DSyAodmlkZW9iYWxhbmNlKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVJST1JTICovCitub3RfbmVnb3RpYXRlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHZpZGVvYmFsYW5jZSwgIk5vdCBuZWdvdGlhdGVkIHlldCIpOworICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2JhbGFuY2VfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdMaXN0ICpjaGFubmVscyA9IE5VTEw7CisgIEdzdFZpZGVvQmFsYW5jZSAqYmFsYW5jZSA9IEdTVF9WSURFT19CQUxBTkNFIChvYmplY3QpOworCisgIGdfZnJlZSAoYmFsYW5jZS0+dGFibGV1WzBdKTsKKworICBjaGFubmVscyA9IGJhbGFuY2UtPmNoYW5uZWxzOworICB3aGlsZSAoY2hhbm5lbHMpIHsKKyAgICBHc3RDb2xvckJhbGFuY2VDaGFubmVsICpjaGFubmVsID0gY2hhbm5lbHMtPmRhdGE7CisKKyAgICBnX29iamVjdF91bnJlZiAoY2hhbm5lbCk7CisgICAgY2hhbm5lbHMtPmRhdGEgPSBOVUxMOworICAgIGNoYW5uZWxzID0gZ19saXN0X25leHQgKGNoYW5uZWxzKTsKKyAgfQorCisgIGlmIChiYWxhbmNlLT5jaGFubmVscykKKyAgICBnX2xpc3RfZnJlZSAoYmFsYW5jZS0+Y2hhbm5lbHMpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19iYWxhbmNlX2NsYXNzX2luaXQgKEdzdFZpZGVvQmFsYW5jZUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqdHJhbnNfY2xhc3MgPSAoR3N0QmFzZVRyYW5zZm9ybUNsYXNzICopIGtsYXNzOworICBHc3RWaWRlb0ZpbHRlckNsYXNzICp2ZmlsdGVyX2NsYXNzID0gKEdzdFZpZGVvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHZpZGVvYmFsYW5jZV9kZWJ1ZywgInZpZGVvYmFsYW5jZSIsIDAsCisgICAgICAidmlkZW9iYWxhbmNlIik7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfdmlkZW9fYmFsYW5jZV9maW5hbGl6ZTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3ZpZGVvX2JhbGFuY2Vfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfdmlkZW9fYmFsYW5jZV9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DT05UUkFTVCwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJjb250cmFzdCIsICJDb250cmFzdCIsICJjb250cmFzdCIsCisgICAgICAgICAgMC4wLCAyLjAsIERFRkFVTFRfUFJPUF9DT05UUkFTVCwKKyAgICAgICAgICBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQlJJR0hUTkVTUywKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJicmlnaHRuZXNzIiwgIkJyaWdodG5lc3MiLCAiYnJpZ2h0bmVzcyIsIC0xLjAsIDEuMCwKKyAgICAgICAgICBERUZBVUxUX1BST1BfQlJJR0hUTkVTUywKKyAgICAgICAgICBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSFVFLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoImh1ZSIsICJIdWUiLCAiaHVlIiwgLTEuMCwgMS4wLCBERUZBVUxUX1BST1BfSFVFLAorICAgICAgICAgIEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TQVRVUkFUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoInNhdHVyYXRpb24iLCAiU2F0dXJhdGlvbiIsICJzYXR1cmF0aW9uIiwgMC4wLCAyLjAsCisgICAgICAgICAgREVGQVVMVF9QUk9QX1NBVFVSQVRJT04sCisgICAgICAgICAgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJWaWRlbyBiYWxhbmNlIiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1ZpZGVvIiwKKyAgICAgICJBZGp1c3RzIGJyaWdodG5lc3MsIGNvbnRyYXN0LCBodWUsIHNhdHVyYXRpb24gb24gYSB2aWRlbyBzdHJlYW0iLAorICAgICAgIkRhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF92aWRlb19iYWxhbmNlX3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfdmlkZW9fYmFsYW5jZV9zcmNfdGVtcGxhdGUpOworCisgIHRyYW5zX2NsYXNzLT5iZWZvcmVfdHJhbnNmb3JtID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdmlkZW9fYmFsYW5jZV9iZWZvcmVfdHJhbnNmb3JtKTsKKyAgdHJhbnNfY2xhc3MtPnRyYW5zZm9ybV9pcF9vbl9wYXNzdGhyb3VnaCA9IEZBTFNFOworICB0cmFuc19jbGFzcy0+dHJhbnNmb3JtX2NhcHMgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19iYWxhbmNlX3RyYW5zZm9ybV9jYXBzKTsKKworICB2ZmlsdGVyX2NsYXNzLT5zZXRfaW5mbyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdmlkZW9fYmFsYW5jZV9zZXRfaW5mbyk7CisgIHZmaWx0ZXJfY2xhc3MtPnRyYW5zZm9ybV9mcmFtZV9pcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3ZpZGVvX2JhbGFuY2VfdHJhbnNmb3JtX2ZyYW1lX2lwKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19iYWxhbmNlX2luaXQgKEdzdFZpZGVvQmFsYW5jZSAqIHZpZGVvYmFsYW5jZSkKK3sKKyAgY29uc3QgZ2NoYXIgKmNoYW5uZWxzWzRdID0geyAiSFVFIiwgIlNBVFVSQVRJT04iLAorICAgICJCUklHSFRORVNTIiwgIkNPTlRSQVNUIgorICB9OworICBnaW50IGk7CisKKyAgLyogSW5pdGlhbGl6ZSBwcm9wZXJ0aWV3cyAqLworICB2aWRlb2JhbGFuY2UtPmNvbnRyYXN0ID0gREVGQVVMVF9QUk9QX0NPTlRSQVNUOworICB2aWRlb2JhbGFuY2UtPmJyaWdodG5lc3MgPSBERUZBVUxUX1BST1BfQlJJR0hUTkVTUzsKKyAgdmlkZW9iYWxhbmNlLT5odWUgPSBERUZBVUxUX1BST1BfSFVFOworICB2aWRlb2JhbGFuY2UtPnNhdHVyYXRpb24gPSBERUZBVUxUX1BST1BfU0FUVVJBVElPTjsKKworICB2aWRlb2JhbGFuY2UtPnRhYmxldVswXSA9IGdfbmV3IChndWludDgsIDI1NiAqIDI1NiAqIDIpOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICB2aWRlb2JhbGFuY2UtPnRhYmxldVtpXSA9CisgICAgICAgIHZpZGVvYmFsYW5jZS0+dGFibGV1WzBdICsgaSAqIDI1NiAqIHNpemVvZiAoZ3VpbnQ4KTsKKyAgICB2aWRlb2JhbGFuY2UtPnRhYmxldltpXSA9CisgICAgICAgIHZpZGVvYmFsYW5jZS0+dGFibGV1WzBdICsgMjU2ICogMjU2ICogc2l6ZW9mIChndWludDgpICsKKyAgICAgICAgaSAqIDI1NiAqIHNpemVvZiAoZ3VpbnQ4KTsKKyAgfQorCisgIGdzdF92aWRlb19iYWxhbmNlX3VwZGF0ZV9wcm9wZXJ0aWVzICh2aWRlb2JhbGFuY2UpOworCisgIC8qIEdlbmVyYXRlIHRoZSBjaGFubmVscyBsaXN0ICovCisgIGZvciAoaSA9IDA7IGkgPCBHX05fRUxFTUVOVFMgKGNoYW5uZWxzKTsgaSsrKSB7CisgICAgR3N0Q29sb3JCYWxhbmNlQ2hhbm5lbCAqY2hhbm5lbDsKKworICAgIGNoYW5uZWwgPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX0NPTE9SX0JBTEFOQ0VfQ0hBTk5FTCwgTlVMTCk7CisgICAgY2hhbm5lbC0+bGFiZWwgPSBnX3N0cmR1cCAoY2hhbm5lbHNbaV0pOworICAgIGNoYW5uZWwtPm1pbl92YWx1ZSA9IC0xMDAwOworICAgIGNoYW5uZWwtPm1heF92YWx1ZSA9IDEwMDA7CisKKyAgICB2aWRlb2JhbGFuY2UtPmNoYW5uZWxzID0gZ19saXN0X2FwcGVuZCAodmlkZW9iYWxhbmNlLT5jaGFubmVscywgY2hhbm5lbCk7CisgIH0KK30KKworc3RhdGljIGNvbnN0IEdMaXN0ICoKK2dzdF92aWRlb19iYWxhbmNlX2NvbG9yYmFsYW5jZV9saXN0X2NoYW5uZWxzIChHc3RDb2xvckJhbGFuY2UgKiBiYWxhbmNlKQoreworICBHc3RWaWRlb0JhbGFuY2UgKnZpZGVvYmFsYW5jZSA9IEdTVF9WSURFT19CQUxBTkNFIChiYWxhbmNlKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAodmlkZW9iYWxhbmNlICE9IE5VTEwsIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX1ZJREVPX0JBTEFOQ0UgKHZpZGVvYmFsYW5jZSksIE5VTEwpOworCisgIHJldHVybiB2aWRlb2JhbGFuY2UtPmNoYW5uZWxzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2JhbGFuY2VfY29sb3JiYWxhbmNlX3NldF92YWx1ZSAoR3N0Q29sb3JCYWxhbmNlICogYmFsYW5jZSwKKyAgICBHc3RDb2xvckJhbGFuY2VDaGFubmVsICogY2hhbm5lbCwgZ2ludCB2YWx1ZSkKK3sKKyAgR3N0VmlkZW9CYWxhbmNlICp2YiA9IEdTVF9WSURFT19CQUxBTkNFIChiYWxhbmNlKTsKKyAgZ2RvdWJsZSBuZXdfdmFsOworICBnYm9vbGVhbiBjaGFuZ2VkID0gRkFMU0U7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAodmIgIT0gTlVMTCk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19WSURFT19CQUxBTkNFICh2YikpOworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfVklERU9fRklMVEVSICh2YikpOworICBnX3JldHVybl9pZl9mYWlsIChjaGFubmVsLT5sYWJlbCAhPSBOVUxMKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHZiKTsKKyAgaWYgKCFnX2FzY2lpX3N0cmNhc2VjbXAgKGNoYW5uZWwtPmxhYmVsLCAiSFVFIikpIHsKKyAgICBuZXdfdmFsID0gKHZhbHVlICsgMTAwMC4wKSAqIDIuMCAvIDIwMDAuMCAtIDEuMDsKKyAgICBjaGFuZ2VkID0gbmV3X3ZhbCAhPSB2Yi0+aHVlOworICAgIHZiLT5odWUgPSBuZXdfdmFsOworICB9IGVsc2UgaWYgKCFnX2FzY2lpX3N0cmNhc2VjbXAgKGNoYW5uZWwtPmxhYmVsLCAiU0FUVVJBVElPTiIpKSB7CisgICAgbmV3X3ZhbCA9ICh2YWx1ZSArIDEwMDAuMCkgKiAyLjAgLyAyMDAwLjA7CisgICAgY2hhbmdlZCA9IG5ld192YWwgIT0gdmItPnNhdHVyYXRpb247CisgICAgdmItPnNhdHVyYXRpb24gPSBuZXdfdmFsOworICB9IGVsc2UgaWYgKCFnX2FzY2lpX3N0cmNhc2VjbXAgKGNoYW5uZWwtPmxhYmVsLCAiQlJJR0hUTkVTUyIpKSB7CisgICAgbmV3X3ZhbCA9ICh2YWx1ZSArIDEwMDAuMCkgKiAyLjAgLyAyMDAwLjAgLSAxLjA7CisgICAgY2hhbmdlZCA9IG5ld192YWwgIT0gdmItPmJyaWdodG5lc3M7CisgICAgdmItPmJyaWdodG5lc3MgPSBuZXdfdmFsOworICB9IGVsc2UgaWYgKCFnX2FzY2lpX3N0cmNhc2VjbXAgKGNoYW5uZWwtPmxhYmVsLCAiQ09OVFJBU1QiKSkgeworICAgIG5ld192YWwgPSAodmFsdWUgKyAxMDAwLjApICogMi4wIC8gMjAwMC4wOworICAgIGNoYW5nZWQgPSBuZXdfdmFsICE9IHZiLT5jb250cmFzdDsKKyAgICB2Yi0+Y29udHJhc3QgPSBuZXdfdmFsOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLICh2Yik7CisKKyAgaWYgKGNoYW5nZWQpCisgICAgZ3N0X3ZpZGVvX2JhbGFuY2VfdXBkYXRlX3Byb3BlcnRpZXMgKHZiKTsKKworICBpZiAoY2hhbmdlZCkgeworICAgIGdzdF9jb2xvcl9iYWxhbmNlX3ZhbHVlX2NoYW5nZWQgKGJhbGFuY2UsIGNoYW5uZWwsCisgICAgICAgIGdzdF9jb2xvcl9iYWxhbmNlX2dldF92YWx1ZSAoYmFsYW5jZSwgY2hhbm5lbCkpOworICB9Cit9CisKK3N0YXRpYyBnaW50Citnc3RfdmlkZW9fYmFsYW5jZV9jb2xvcmJhbGFuY2VfZ2V0X3ZhbHVlIChHc3RDb2xvckJhbGFuY2UgKiBiYWxhbmNlLAorICAgIEdzdENvbG9yQmFsYW5jZUNoYW5uZWwgKiBjaGFubmVsKQoreworICBHc3RWaWRlb0JhbGFuY2UgKnZiID0gR1NUX1ZJREVPX0JBTEFOQ0UgKGJhbGFuY2UpOworICBnaW50IHZhbHVlID0gMDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAodmIgIT0gTlVMTCwgMCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfVklERU9fQkFMQU5DRSAodmIpLCAwKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNoYW5uZWwtPmxhYmVsICE9IE5VTEwsIDApOworCisgIGlmICghZ19hc2NpaV9zdHJjYXNlY21wIChjaGFubmVsLT5sYWJlbCwgIkhVRSIpKSB7CisgICAgdmFsdWUgPSAodmItPmh1ZSArIDEpICogMjAwMC4wIC8gMi4wIC0gMTAwMC4wOworICB9IGVsc2UgaWYgKCFnX2FzY2lpX3N0cmNhc2VjbXAgKGNoYW5uZWwtPmxhYmVsLCAiU0FUVVJBVElPTiIpKSB7CisgICAgdmFsdWUgPSB2Yi0+c2F0dXJhdGlvbiAqIDIwMDAuMCAvIDIuMCAtIDEwMDAuMDsKKyAgfSBlbHNlIGlmICghZ19hc2NpaV9zdHJjYXNlY21wIChjaGFubmVsLT5sYWJlbCwgIkJSSUdIVE5FU1MiKSkgeworICAgIHZhbHVlID0gKHZiLT5icmlnaHRuZXNzICsgMSkgKiAyMDAwLjAgLyAyLjAgLSAxMDAwLjA7CisgIH0gZWxzZSBpZiAoIWdfYXNjaWlfc3RyY2FzZWNtcCAoY2hhbm5lbC0+bGFiZWwsICJDT05UUkFTVCIpKSB7CisgICAgdmFsdWUgPSB2Yi0+Y29udHJhc3QgKiAyMDAwLjAgLyAyLjAgLSAxMDAwLjA7CisgIH0KKworICByZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBHc3RDb2xvckJhbGFuY2VUeXBlCitnc3RfdmlkZW9fYmFsYW5jZV9jb2xvcmJhbGFuY2VfZ2V0X2JhbGFuY2VfdHlwZSAoR3N0Q29sb3JCYWxhbmNlICogYmFsYW5jZSkKK3sKKyAgcmV0dXJuIEdTVF9DT0xPUl9CQUxBTkNFX1NPRlRXQVJFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2JhbGFuY2VfY29sb3JiYWxhbmNlX2luaXQgKEdzdENvbG9yQmFsYW5jZUludGVyZmFjZSAqIGlmYWNlKQoreworICBpZmFjZS0+bGlzdF9jaGFubmVscyA9IGdzdF92aWRlb19iYWxhbmNlX2NvbG9yYmFsYW5jZV9saXN0X2NoYW5uZWxzOworICBpZmFjZS0+c2V0X3ZhbHVlID0gZ3N0X3ZpZGVvX2JhbGFuY2VfY29sb3JiYWxhbmNlX3NldF92YWx1ZTsKKyAgaWZhY2UtPmdldF92YWx1ZSA9IGdzdF92aWRlb19iYWxhbmNlX2NvbG9yYmFsYW5jZV9nZXRfdmFsdWU7CisgIGlmYWNlLT5nZXRfYmFsYW5jZV90eXBlID0gZ3N0X3ZpZGVvX2JhbGFuY2VfY29sb3JiYWxhbmNlX2dldF9iYWxhbmNlX3R5cGU7Cit9CisKK3N0YXRpYyBHc3RDb2xvckJhbGFuY2VDaGFubmVsICoKK2dzdF92aWRlb19iYWxhbmNlX2ZpbmRfY2hhbm5lbCAoR3N0VmlkZW9CYWxhbmNlICogYmFsYW5jZSwgY29uc3QgZ2NoYXIgKiBsYWJlbCkKK3sKKyAgR0xpc3QgKmw7CisKKyAgZm9yIChsID0gYmFsYW5jZS0+Y2hhbm5lbHM7IGw7IGwgPSBsLT5uZXh0KSB7CisgICAgR3N0Q29sb3JCYWxhbmNlQ2hhbm5lbCAqY2hhbm5lbCA9IGwtPmRhdGE7CisKKyAgICBpZiAoZ19hc2NpaV9zdHJjYXNlY21wIChjaGFubmVsLT5sYWJlbCwgbGFiZWwpID09IDApCisgICAgICByZXR1cm4gY2hhbm5lbDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19iYWxhbmNlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWaWRlb0JhbGFuY2UgKmJhbGFuY2UgPSBHU1RfVklERU9fQkFMQU5DRSAob2JqZWN0KTsKKyAgZ2RvdWJsZSBkOworICBjb25zdCBnY2hhciAqbGFiZWwgPSBOVUxMOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoYmFsYW5jZSk7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DT05UUkFTVDoKKyAgICAgIGQgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhbGFuY2UsICJDaGFuZ2luZyBjb250cmFzdCBmcm9tICVsZiB0byAlbGYiLAorICAgICAgICAgIGJhbGFuY2UtPmNvbnRyYXN0LCBkKTsKKyAgICAgIGlmIChkICE9IGJhbGFuY2UtPmNvbnRyYXN0KQorICAgICAgICBsYWJlbCA9ICJDT05UUkFTVCI7CisgICAgICBiYWxhbmNlLT5jb250cmFzdCA9IGQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQlJJR0hUTkVTUzoKKyAgICAgIGQgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhbGFuY2UsICJDaGFuZ2luZyBicmlnaHRuZXNzIGZyb20gJWxmIHRvICVsZiIsCisgICAgICAgICAgYmFsYW5jZS0+YnJpZ2h0bmVzcywgZCk7CisgICAgICBpZiAoZCAhPSBiYWxhbmNlLT5icmlnaHRuZXNzKQorICAgICAgICBsYWJlbCA9ICJCUklHSFRORVNTIjsKKyAgICAgIGJhbGFuY2UtPmJyaWdodG5lc3MgPSBkOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0hVRToKKyAgICAgIGQgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhbGFuY2UsICJDaGFuZ2luZyBodWUgZnJvbSAlbGYgdG8gJWxmIiwgYmFsYW5jZS0+aHVlLAorICAgICAgICAgIGQpOworICAgICAgaWYgKGQgIT0gYmFsYW5jZS0+aHVlKQorICAgICAgICBsYWJlbCA9ICJIVUUiOworICAgICAgYmFsYW5jZS0+aHVlID0gZDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TQVRVUkFUSU9OOgorICAgICAgZCA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFsYW5jZSwgIkNoYW5naW5nIHNhdHVyYXRpb24gZnJvbSAlbGYgdG8gJWxmIiwKKyAgICAgICAgICBiYWxhbmNlLT5zYXR1cmF0aW9uLCBkKTsKKyAgICAgIGlmIChkICE9IGJhbGFuY2UtPnNhdHVyYXRpb24pCisgICAgICAgIGxhYmVsID0gIlNBVFVSQVRJT04iOworICAgICAgYmFsYW5jZS0+c2F0dXJhdGlvbiA9IGQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGJhbGFuY2UpOworICBnc3RfdmlkZW9fYmFsYW5jZV91cGRhdGVfcHJvcGVydGllcyAoYmFsYW5jZSk7CisKKyAgaWYgKGxhYmVsKSB7CisgICAgR3N0Q29sb3JCYWxhbmNlQ2hhbm5lbCAqY2hhbm5lbCA9CisgICAgICAgIGdzdF92aWRlb19iYWxhbmNlX2ZpbmRfY2hhbm5lbCAoYmFsYW5jZSwgbGFiZWwpOworICAgIGdzdF9jb2xvcl9iYWxhbmNlX3ZhbHVlX2NoYW5nZWQgKEdTVF9DT0xPUl9CQUxBTkNFIChiYWxhbmNlKSwgY2hhbm5lbCwKKyAgICAgICAgZ3N0X2NvbG9yX2JhbGFuY2VfZ2V0X3ZhbHVlIChHU1RfQ09MT1JfQkFMQU5DRSAoYmFsYW5jZSksIGNoYW5uZWwpKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2JhbGFuY2VfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFZpZGVvQmFsYW5jZSAqYmFsYW5jZSA9IEdTVF9WSURFT19CQUxBTkNFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DT05UUkFTVDoKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIGJhbGFuY2UtPmNvbnRyYXN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CUklHSFRORVNTOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgYmFsYW5jZS0+YnJpZ2h0bmVzcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSFVFOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgYmFsYW5jZS0+aHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TQVRVUkFUSU9OOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgYmFsYW5jZS0+c2F0dXJhdGlvbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmggYi9nc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5ZjkyMQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuaApAQCAtMCwwICsxLDc5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1ZJREVPX0JBTEFOQ0VfSF9fCisjZGVmaW5lIF9fR1NUX1ZJREVPX0JBTEFOQ0VfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9WSURFT19CQUxBTkNFIFwKKyAgKGdzdF92aWRlb19iYWxhbmNlX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WSURFT19CQUxBTkNFKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVklERU9fQkFMQU5DRSxHc3RWaWRlb0JhbGFuY2UpKQorI2RlZmluZSBHU1RfVklERU9fQkFMQU5DRV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WSURFT19CQUxBTkNFLEdzdFZpZGVvQmFsYW5jZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1ZJREVPX0JBTEFOQ0Uob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WSURFT19CQUxBTkNFKSkKKyNkZWZpbmUgR1NUX0lTX1ZJREVPX0JBTEFOQ0VfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVklERU9fQkFMQU5DRSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWaWRlb0JhbGFuY2UgR3N0VmlkZW9CYWxhbmNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZpZGVvQmFsYW5jZUNsYXNzIEdzdFZpZGVvQmFsYW5jZUNsYXNzOworCisvKioKKyAqIEdzdFZpZGVvQmFsYW5jZToKKyAqCisgKiBPcGFxdWUgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0VmlkZW9CYWxhbmNlIHsKKyAgR3N0VmlkZW9GaWx0ZXIgdmlkZW9maWx0ZXI7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKworICAvKiBjaGFubmVscyBmb3IgaW50ZXJmYWNlICovCisgIEdMaXN0ICpjaGFubmVsczsKKworICAvKiBwcm9wZXJ0aWVzICovCisgIGdkb3VibGUgY29udHJhc3Q7CisgIGdkb3VibGUgYnJpZ2h0bmVzczsKKyAgZ2RvdWJsZSBodWU7CisgIGdkb3VibGUgc2F0dXJhdGlvbjsKKworICAvKiB0YWJsZXMgKi8KKyAgZ3VpbnQ4IHRhYmxleVsyNTZdOworICBndWludDggKnRhYmxldVsyNTZdOworICBndWludDggKnRhYmxldlsyNTZdOworCisgIHZvaWQgKCpwcm9jZXNzKSAoR3N0VmlkZW9CYWxhbmNlICpiYWxhbmNlLCBHc3RWaWRlb0ZyYW1lICpmcmFtZSk7Cit9OworCitzdHJ1Y3QgX0dzdFZpZGVvQmFsYW5jZUNsYXNzIHsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfdmlkZW9fYmFsYW5jZV9nZXRfdHlwZSh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1ZJREVPX0JBTEFOQ0VfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmMgYi9nc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxMzJmNQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYwpAQCAtMCwwICsxLDEzNDYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSA8MjAxMD4gU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDExPiBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIChwcm9iYWJseSkgZ2VuZXJhdGVkIGZyb20gZ3N0dmlkZW9mbGlwLmMsCisgKiBnc3R2aWRlb2ZsaXAuYyx2IDEuNyAyMDAzLzExLzA4IDAyOjQ4OjU5IGRzY2hsZWVmIEV4cCAKKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtdmlkZW9mbGlwCisgKgorICogRmxpcHMgYW5kIHJvdGF0ZXMgdmlkZW8uCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHZpZGVvdGVzdHNyYyAhIHZpZGVvZmxpcCBtZXRob2Q9Y2xvY2t3aXNlICEgdmlkZW9jb252ZXJ0ICEgeGltYWdlc2luaworICogXXwgVGhpcyBwaXBlbGluZSBmbGlwcyB0aGUgdGVzdCBpbWFnZSA5MCBkZWdyZWVzIGNsb2Nrd2lzZS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3R2aWRlb2ZsaXAuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworLyogR3N0VmlkZW9GbGlwIHByb3BlcnRpZXMgKi8KK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX01FVEhPRCwKKyAgUFJPUF9WSURFT19ESVJFQ1RJT04KKyAgICAgIC8qIEZJTEwgTUUgKi8KK307CisKKyNkZWZpbmUgUFJPUF9NRVRIT0RfREVGQVVMVCBHU1RfVklERU9fRkxJUF9NRVRIT0RfSURFTlRJVFkKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAodmlkZW9fZmxpcF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCB2aWRlb19mbGlwX2RlYnVnCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfdmlkZW9fZmxpcF9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgQVlVViwgIgorICAgICAgICAgICAgIkFSR0IsIEJHUkEsIEFCR1IsIFJHQkEsIFk0NDQsIHhSR0IsIFJHQngsIHhCR1IsIEJHUngsICIKKyAgICAgICAgICAgICJSR0IsIEJHUiwgSTQyMCwgWVYxMiwgSVlVViwgWVVZMiwgVVlWWSwgWVZZVSwgTlYxMiwgTlYyMSwgIgorICAgICAgICAgICAgIkdSQVk4LCBHUkFZMTZfQkUsIEdSQVkxNl9MRSB9IikpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF92aWRlb19mbGlwX3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBBWVVWLCAiCisgICAgICAgICAgICAiQVJHQiwgQkdSQSwgQUJHUiwgUkdCQSwgWTQ0NCwgeFJHQiwgUkdCeCwgeEJHUiwgQkdSeCwgIgorICAgICAgICAgICAgIlJHQiwgQkdSLCBJNDIwLCBZVjEyLCBJWVVWLCBZVVkyLCBVWVZZLCBZVllVLCBOVjEyLCBOVjIxLCAiCisgICAgICAgICAgICAiR1JBWTgsIEdSQVkxNl9CRSwgR1JBWTE2X0xFIH0iKSkKKyAgICApOworCisjZGVmaW5lIEdTVF9UWVBFX1ZJREVPX0ZMSVBfTUVUSE9EIChnc3RfdmlkZW9fZmxpcF9tZXRob2RfZ2V0X3R5cGUoKSkKKworc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmlkZW9fZmxpcF9tZXRob2RzW10gPSB7CisgIHtHU1RfVklERU9fRkxJUF9NRVRIT0RfSURFTlRJVFksICJJZGVudGl0eSAobm8gcm90YXRpb24pIiwgIm5vbmUifSwKKyAge0dTVF9WSURFT19GTElQX01FVEhPRF85MFIsICJSb3RhdGUgY2xvY2t3aXNlIDkwIGRlZ3JlZXMiLCAiY2xvY2t3aXNlIn0sCisgIHtHU1RfVklERU9fRkxJUF9NRVRIT0RfMTgwLCAiUm90YXRlIDE4MCBkZWdyZWVzIiwgInJvdGF0ZS0xODAifSwKKyAge0dTVF9WSURFT19GTElQX01FVEhPRF85MEwsICJSb3RhdGUgY291bnRlci1jbG9ja3dpc2UgOTAgZGVncmVlcyIsCisgICAgICAiY291bnRlcmNsb2Nrd2lzZSJ9LAorICB7R1NUX1ZJREVPX0ZMSVBfTUVUSE9EX0hPUklaLCAiRmxpcCBob3Jpem9udGFsbHkiLCAiaG9yaXpvbnRhbC1mbGlwIn0sCisgIHtHU1RfVklERU9fRkxJUF9NRVRIT0RfVkVSVCwgIkZsaXAgdmVydGljYWxseSIsICJ2ZXJ0aWNhbC1mbGlwIn0sCisgIHtHU1RfVklERU9fRkxJUF9NRVRIT0RfVFJBTlMsCisgICAgICAiRmxpcCBhY3Jvc3MgdXBwZXIgbGVmdC9sb3dlciByaWdodCBkaWFnb25hbCIsICJ1cHBlci1sZWZ0LWRpYWdvbmFsIn0sCisgIHtHU1RfVklERU9fRkxJUF9NRVRIT0RfT1RIRVIsCisgICAgICAiRmxpcCBhY3Jvc3MgdXBwZXIgcmlnaHQvbG93ZXIgbGVmdCBkaWFnb25hbCIsICJ1cHBlci1yaWdodC1kaWFnb25hbCJ9LAorICB7R1NUX1ZJREVPX0ZMSVBfTUVUSE9EX0FVVE8sCisgICAgICAiU2VsZWN0IGZsaXAgbWV0aG9kIGJhc2VkIG9uIGltYWdlLW9yaWVudGF0aW9uIHRhZyIsICJhdXRvbWF0aWMifSwKKyAgezAsIE5VTEwsIE5VTEx9LAorfTsKKworc3RhdGljIEdUeXBlCitnc3RfdmlkZW9fZmxpcF9tZXRob2RfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSB2aWRlb19mbGlwX21ldGhvZF90eXBlID0gMDsKKworICBpZiAoIXZpZGVvX2ZsaXBfbWV0aG9kX3R5cGUpIHsKKyAgICB2aWRlb19mbGlwX21ldGhvZF90eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFZpZGVvRmxpcE1ldGhvZCIsCisgICAgICAgIHZpZGVvX2ZsaXBfbWV0aG9kcyk7CisgIH0KKyAgcmV0dXJuIHZpZGVvX2ZsaXBfbWV0aG9kX3R5cGU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fZmxpcF92aWRlb19kaXJlY3Rpb25faW50ZXJmYWNlX2luaXQgKEdzdFZpZGVvRGlyZWN0aW9uSW50ZXJmYWNlICoKKyAgICBpZmFjZSkKK3sKKyAgLyogV2UgaW1wbGVtZW50IHRoZSB2aWRlby1kaXJlY3Rpb24gcHJvcGVydHkgKi8KK30KKworI2RlZmluZSBnc3RfdmlkZW9fZmxpcF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoR3N0VmlkZW9GbGlwLCBnc3RfdmlkZW9fZmxpcCwgR1NUX1RZUEVfVklERU9fRklMVEVSLAorICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfVklERU9fRElSRUNUSU9OLAorICAgICAgICBnc3RfdmlkZW9fZmxpcF92aWRlb19kaXJlY3Rpb25faW50ZXJmYWNlX2luaXQpKTsKKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3ZpZGVvX2ZsaXBfdHJhbnNmb3JtX2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLCBHc3RDYXBzICogY2FwcywgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0VmlkZW9GbGlwICp2aWRlb2ZsaXAgPSBHU1RfVklERU9fRkxJUCAodHJhbnMpOworICBHc3RDYXBzICpyZXQ7CisgIGdpbnQgd2lkdGgsIGhlaWdodCwgaTsKKworICByZXQgPSBnc3RfY2Fwc19jb3B5IChjYXBzKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZ3N0X2NhcHNfZ2V0X3NpemUgKHJldCk7IGkrKykgeworICAgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAocmV0LCBpKTsKKyAgICBnaW50IHBhcl9uLCBwYXJfZDsKKworICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgIndpZHRoIiwgJndpZHRoKSAmJgorICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImhlaWdodCIsICZoZWlnaHQpKSB7CisKKyAgICAgIHN3aXRjaCAodmlkZW9mbGlwLT5hY3RpdmVfbWV0aG9kKSB7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OXzkwUjoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fOTBMOgorICAgICAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9VTF9MUjoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fVVJfTEw6CisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHN0cnVjdHVyZSwgIndpZHRoIiwgR19UWVBFX0lOVCwgaGVpZ2h0LAorICAgICAgICAgICAgICAiaGVpZ2h0IiwgR19UWVBFX0lOVCwgd2lkdGgsIE5VTEwpOworICAgICAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9mcmFjdGlvbiAoc3RydWN0dXJlLCAicGl4ZWwtYXNwZWN0LXJhdGlvIiwKKyAgICAgICAgICAgICAgICAgICZwYXJfbiwgJnBhcl9kKSkgeworICAgICAgICAgICAgaWYgKHBhcl9uICE9IDEgfHwgcGFyX2QgIT0gMSkgeworICAgICAgICAgICAgICBHVmFsdWUgdmFsID0geyAwLCB9OworCisgICAgICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR1NUX1RZUEVfRlJBQ1RJT04pOworICAgICAgICAgICAgICBnc3RfdmFsdWVfc2V0X2ZyYWN0aW9uICgmdmFsLCBwYXJfZCwgcGFyX24pOworICAgICAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAoc3RydWN0dXJlLCAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgJnZhbCk7CisgICAgICAgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZ2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fSURFTlRJVFk6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OXzE4MDoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fSE9SSVo6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OX1ZFUlQ6CisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHN0cnVjdHVyZSwgIndpZHRoIiwgR19UWVBFX0lOVCwgd2lkdGgsCisgICAgICAgICAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBoZWlnaHQsIE5VTEwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9DVVNUT006CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2aWRlb2ZsaXAsICJ1bnN1cG9ydGVkIGN1c3RvbSBvcmllbnRhdGlvbiIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHZpZGVvZmxpcCwgInRyYW5zZm9ybWVkICUiIEdTVF9QVFJfRk9STUFUICIgdG8gJSIKKyAgICAgIEdTVF9QVFJfRk9STUFULCBjYXBzLCByZXQpOworCisgIGlmIChmaWx0ZXIpIHsKKyAgICBHc3RDYXBzICppbnRlcnNlY3Rpb247CisKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2aWRlb2ZsaXAsICJVc2luZyBmaWx0ZXIgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgZmlsdGVyKTsKKyAgICBpbnRlcnNlY3Rpb24gPQorICAgICAgICBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCByZXQsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHJldCk7CisgICAgcmV0ID0gaW50ZXJzZWN0aW9uOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHZpZGVvZmxpcCwgIkludGVyc2VjdGlvbiAlIiBHU1RfUFRSX0ZPUk1BVCwgcmV0KTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fZmxpcF9wbGFuYXJfeXV2IChHc3RWaWRlb0ZsaXAgKiB2aWRlb2ZsaXAsIEdzdFZpZGVvRnJhbWUgKiBkZXN0LAorICAgIGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBzcmMpCit7CisgIGdpbnQgeCwgeTsKKyAgZ3VpbnQ4IGNvbnN0ICpzOworICBndWludDggKmQ7CisgIGdpbnQgc3JjX3lfc3RyaWRlLCBzcmNfdV9zdHJpZGUsIHNyY192X3N0cmlkZTsKKyAgZ2ludCBzcmNfeV9oZWlnaHQsIHNyY191X2hlaWdodCwgc3JjX3ZfaGVpZ2h0OworICBnaW50IHNyY195X3dpZHRoLCBzcmNfdV93aWR0aCwgc3JjX3Zfd2lkdGg7CisgIGdpbnQgZGVzdF95X3N0cmlkZSwgZGVzdF91X3N0cmlkZSwgZGVzdF92X3N0cmlkZTsKKyAgZ2ludCBkZXN0X3lfaGVpZ2h0LCBkZXN0X3VfaGVpZ2h0LCBkZXN0X3ZfaGVpZ2h0OworICBnaW50IGRlc3RfeV93aWR0aCwgZGVzdF91X3dpZHRoLCBkZXN0X3Zfd2lkdGg7CisKKyAgc3JjX3lfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoc3JjLCAwKTsKKyAgc3JjX3Vfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoc3JjLCAxKTsKKyAgc3JjX3Zfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoc3JjLCAyKTsKKworICBkZXN0X3lfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoZGVzdCwgMCk7CisgIGRlc3RfdV9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChkZXN0LCAxKTsKKyAgZGVzdF92X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGRlc3QsIDIpOworCisgIHNyY195X3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKHNyYywgMCk7CisgIHNyY191X3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKHNyYywgMSk7CisgIHNyY192X3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKHNyYywgMik7CisKKyAgZGVzdF95X3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGRlc3QsIDApOworICBkZXN0X3Vfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZGVzdCwgMSk7CisgIGRlc3Rfdl93aWR0aCA9IEdTVF9WSURFT19GUkFNRV9DT01QX1dJRFRIIChkZXN0LCAyKTsKKworICBzcmNfeV9oZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9IRUlHSFQgKHNyYywgMCk7CisgIHNyY191X2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoc3JjLCAxKTsKKyAgc3JjX3ZfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChzcmMsIDIpOworCisgIGRlc3RfeV9oZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9IRUlHSFQgKGRlc3QsIDApOworICBkZXN0X3VfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChkZXN0LCAxKTsKKyAgZGVzdF92X2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZGVzdCwgMik7CisKKyAgc3dpdGNoICh2aWRlb2ZsaXAtPmFjdGl2ZV9tZXRob2QpIHsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl85MFI6CisgICAgICAvKiBGbGlwIFkgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAwKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMCk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF95X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3lfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3RfeV9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbKHNyY195X2hlaWdodCAtIDEgLSB4KSAqIHNyY195X3N0cmlkZSArIHldOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBGbGlwIFUgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAxKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMSk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF91X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3Vfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3RfdV9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbKHNyY191X2hlaWdodCAtIDEgLSB4KSAqIHNyY191X3N0cmlkZSArIHldOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBGbGlwIFYgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAyKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMik7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF92X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3Zfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3Rfdl9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbKHNyY192X2hlaWdodCAtIDEgLSB4KSAqIHNyY192X3N0cmlkZSArIHldOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl85MEw6CisgICAgICAvKiBGbGlwIFkgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAwKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMCk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF95X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3lfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3RfeV9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbeCAqIHNyY195X3N0cmlkZSArIChzcmNfeV93aWR0aCAtIDEgLSB5KV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIEZsaXAgVSAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDEpOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAxKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3VfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfdV93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZFt5ICogZGVzdF91X3N0cmlkZSArIHhdID0KKyAgICAgICAgICAgICAgc1t4ICogc3JjX3Vfc3RyaWRlICsgKHNyY191X3dpZHRoIC0gMSAtIHkpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogRmxpcCBWICovCisgICAgICBzID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyYywgMik7CisgICAgICBkID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3QsIDIpOworICAgICAgZm9yICh5ID0gMDsgeSA8IGRlc3Rfdl9oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZGVzdF92X3dpZHRoOyB4KyspIHsKKyAgICAgICAgICBkW3kgKiBkZXN0X3Zfc3RyaWRlICsgeF0gPQorICAgICAgICAgICAgICBzW3ggKiBzcmNfdl9zdHJpZGUgKyAoc3JjX3Zfd2lkdGggLSAxIC0geSldOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl8xODA6CisgICAgICAvKiBGbGlwIFkgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAwKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMCk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF95X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3lfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3RfeV9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbKHNyY195X2hlaWdodCAtIDEgLSB5KSAqIHNyY195X3N0cmlkZSArIChzcmNfeV93aWR0aCAtIDEgLSB4KV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIEZsaXAgVSAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDEpOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAxKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3VfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfdV93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZFt5ICogZGVzdF91X3N0cmlkZSArIHhdID0KKyAgICAgICAgICAgICAgc1soc3JjX3VfaGVpZ2h0IC0gMSAtIHkpICogc3JjX3Vfc3RyaWRlICsgKHNyY191X3dpZHRoIC0gMSAtIHgpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogRmxpcCBWICovCisgICAgICBzID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyYywgMik7CisgICAgICBkID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3QsIDIpOworICAgICAgZm9yICh5ID0gMDsgeSA8IGRlc3Rfdl9oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZGVzdF92X3dpZHRoOyB4KyspIHsKKyAgICAgICAgICBkW3kgKiBkZXN0X3Zfc3RyaWRlICsgeF0gPQorICAgICAgICAgICAgICBzWyhzcmNfdl9oZWlnaHQgLSAxIC0geSkgKiBzcmNfdl9zdHJpZGUgKyAoc3JjX3Zfd2lkdGggLSAxIC0geCldOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9IT1JJWjoKKyAgICAgIC8qIEZsaXAgWSAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDApOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAwKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3lfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfeV93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZFt5ICogZGVzdF95X3N0cmlkZSArIHhdID0KKyAgICAgICAgICAgICAgc1t5ICogc3JjX3lfc3RyaWRlICsgKHNyY195X3dpZHRoIC0gMSAtIHgpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogRmxpcCBVICovCisgICAgICBzID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyYywgMSk7CisgICAgICBkID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3QsIDEpOworICAgICAgZm9yICh5ID0gMDsgeSA8IGRlc3RfdV9oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZGVzdF91X3dpZHRoOyB4KyspIHsKKyAgICAgICAgICBkW3kgKiBkZXN0X3Vfc3RyaWRlICsgeF0gPQorICAgICAgICAgICAgICBzW3kgKiBzcmNfdV9zdHJpZGUgKyAoc3JjX3Vfd2lkdGggLSAxIC0geCldOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBGbGlwIFYgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAyKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMik7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF92X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3Zfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3Rfdl9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbeSAqIHNyY192X3N0cmlkZSArIChzcmNfdl93aWR0aCAtIDEgLSB4KV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OX1ZFUlQ6CisgICAgICAvKiBGbGlwIFkgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAwKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMCk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF95X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3lfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3RfeV9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbKHNyY195X2hlaWdodCAtIDEgLSB5KSAqIHNyY195X3N0cmlkZSArIHhdOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBGbGlwIFUgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAxKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMSk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF91X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3Vfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3RfdV9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbKHNyY191X2hlaWdodCAtIDEgLSB5KSAqIHNyY191X3N0cmlkZSArIHhdOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBGbGlwIFYgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAyKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMik7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF92X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3Zfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3Rfdl9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbKHNyY192X2hlaWdodCAtIDEgLSB5KSAqIHNyY192X3N0cmlkZSArIHhdOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9VTF9MUjoKKyAgICAgIC8qIEZsaXAgWSAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDApOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAwKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3lfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfeV93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZFt5ICogZGVzdF95X3N0cmlkZSArIHhdID0gc1t4ICogc3JjX3lfc3RyaWRlICsgeV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIEZsaXAgVSAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDEpOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAxKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3VfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfdV93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZFt5ICogZGVzdF91X3N0cmlkZSArIHhdID0gc1t4ICogc3JjX3Vfc3RyaWRlICsgeV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIEZsaXAgViAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDIpOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAyKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3VfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfdV93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZFt5ICogZGVzdF92X3N0cmlkZSArIHhdID0gc1t4ICogc3JjX3Zfc3RyaWRlICsgeV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OX1VSX0xMOgorICAgICAgLyogRmxpcCBZICovCisgICAgICBzID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyYywgMCk7CisgICAgICBkID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3QsIDApOworICAgICAgZm9yICh5ID0gMDsgeSA8IGRlc3RfeV9oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZGVzdF95X3dpZHRoOyB4KyspIHsKKyAgICAgICAgICBkW3kgKiBkZXN0X3lfc3RyaWRlICsgeF0gPQorICAgICAgICAgICAgICBzWyhzcmNfeV9oZWlnaHQgLSAxIC0geCkgKiBzcmNfeV9zdHJpZGUgKyAoc3JjX3lfd2lkdGggLSAxIC0geSldOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBGbGlwIFUgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAxKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMSk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF91X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3Vfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3RfdV9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbKHNyY191X2hlaWdodCAtIDEgLSB4KSAqIHNyY191X3N0cmlkZSArIChzcmNfdV93aWR0aCAtIDEgLSB5KV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIEZsaXAgViAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDIpOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAyKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3ZfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3Rfdl93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZFt5ICogZGVzdF92X3N0cmlkZSArIHhdID0KKyAgICAgICAgICAgICAgc1soc3JjX3ZfaGVpZ2h0IC0gMSAtIHgpICogc3JjX3Zfc3RyaWRlICsgKHNyY192X3dpZHRoIC0gMSAtIHkpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fSURFTlRJVFk6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fZmxpcF9zZW1pX3BsYW5hcl95dXYgKEdzdFZpZGVvRmxpcCAqIHZpZGVvZmxpcCwgR3N0VmlkZW9GcmFtZSAqIGRlc3QsCisgICAgY29uc3QgR3N0VmlkZW9GcmFtZSAqIHNyYykKK3sKKyAgZ2ludCB4LCB5OworICBndWludDggY29uc3QgKnM7CisgIGd1aW50OCAqZDsKKyAgZ2ludCBzX29mZiwgZF9vZmY7CisgIGdpbnQgc3JjX3lfc3RyaWRlLCBzcmNfdXZfc3RyaWRlOworICBnaW50IHNyY195X2hlaWdodCwgc3JjX3V2X2hlaWdodDsKKyAgZ2ludCBzcmNfeV93aWR0aCwgc3JjX3V2X3dpZHRoOworICBnaW50IGRlc3RfeV9zdHJpZGUsIGRlc3RfdXZfc3RyaWRlOworICBnaW50IGRlc3RfeV9oZWlnaHQsIGRlc3RfdXZfaGVpZ2h0OworICBnaW50IGRlc3RfeV93aWR0aCwgZGVzdF91dl93aWR0aDsKKworCisgIHNyY195X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKHNyYywgMCk7CisgIHNyY191dl9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChzcmMsIDEpOworCisgIGRlc3RfeV9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChkZXN0LCAwKTsKKyAgZGVzdF91dl9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChkZXN0LCAxKTsKKworICBzcmNfeV93aWR0aCA9IEdTVF9WSURFT19GUkFNRV9DT01QX1dJRFRIIChzcmMsIDApOworICBzcmNfdXZfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoc3JjLCAxKTsKKworICBkZXN0X3lfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZGVzdCwgMCk7CisgIGRlc3RfdXZfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZGVzdCwgMSk7CisKKyAgc3JjX3lfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChzcmMsIDApOworICBzcmNfdXZfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChzcmMsIDEpOworCisgIGRlc3RfeV9oZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9IRUlHSFQgKGRlc3QsIDApOworICBkZXN0X3V2X2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZGVzdCwgMSk7CisKKyAgc3dpdGNoICh2aWRlb2ZsaXAtPmFjdGl2ZV9tZXRob2QpIHsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl85MFI6CisgICAgICAvKiBGbGlwIFkgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAwKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMCk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF95X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3lfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3RfeV9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbKHNyY195X2hlaWdodCAtIDEgLSB4KSAqIHNyY195X3N0cmlkZSArIHldOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBGbGlwIFVWICovCisgICAgICBzID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyYywgMSk7CisgICAgICBkID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3QsIDEpOworICAgICAgZm9yICh5ID0gMDsgeSA8IGRlc3RfdXZfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfdXZfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRfb2ZmID0geSAqIGRlc3RfdXZfc3RyaWRlICsgeCAqIDI7CisgICAgICAgICAgc19vZmYgPSAoc3JjX3V2X2hlaWdodCAtIDEgLSB4KSAqIHNyY191dl9zdHJpZGUgKyB5ICogMjsKKyAgICAgICAgICBkW2Rfb2ZmXSA9IHNbc19vZmZdOworICAgICAgICAgIGRbZF9vZmYgKyAxXSA9IHNbc19vZmYgKyAxXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fOTBMOgorICAgICAgLyogRmxpcCBZICovCisgICAgICBzID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyYywgMCk7CisgICAgICBkID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3QsIDApOworICAgICAgZm9yICh5ID0gMDsgeSA8IGRlc3RfeV9oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZGVzdF95X3dpZHRoOyB4KyspIHsKKyAgICAgICAgICBkW3kgKiBkZXN0X3lfc3RyaWRlICsgeF0gPQorICAgICAgICAgICAgICBzW3ggKiBzcmNfeV9zdHJpZGUgKyAoc3JjX3lfd2lkdGggLSAxIC0geSldOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBGbGlwIFVWICovCisgICAgICBzID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyYywgMSk7CisgICAgICBkID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3QsIDEpOworICAgICAgZm9yICh5ID0gMDsgeSA8IGRlc3RfdXZfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfdXZfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRfb2ZmID0geSAqIGRlc3RfdXZfc3RyaWRlICsgeCAqIDI7CisgICAgICAgICAgc19vZmYgPSB4ICogc3JjX3V2X3N0cmlkZSArIChzcmNfdXZfd2lkdGggLSAxIC0geSkgKiAyOworICAgICAgICAgIGRbZF9vZmZdID0gc1tzX29mZl07CisgICAgICAgICAgZFtkX29mZiArIDFdID0gc1tzX29mZiArIDFdOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl8xODA6CisgICAgICAvKiBGbGlwIFkgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAwKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMCk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF95X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3lfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3RfeV9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbKHNyY195X2hlaWdodCAtIDEgLSB5KSAqIHNyY195X3N0cmlkZSArIChzcmNfeV93aWR0aCAtIDEgLSB4KV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIEZsaXAgVVYgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAxKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMSk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF91dl9oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZGVzdF91dl93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZF9vZmYgPSB5ICogZGVzdF91dl9zdHJpZGUgKyB4ICogMjsKKyAgICAgICAgICBzX29mZiA9IChzcmNfdXZfaGVpZ2h0IC0gMSAtIHkpICogc3JjX3V2X3N0cmlkZSArIChzcmNfdXZfd2lkdGggLSAxIC0KKyAgICAgICAgICAgICAgeCkgKiAyOworICAgICAgICAgIGRbZF9vZmZdID0gc1tzX29mZl07CisgICAgICAgICAgZFtkX29mZiArIDFdID0gc1tzX29mZiArIDFdOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9IT1JJWjoKKyAgICAgIC8qIEZsaXAgWSAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDApOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAwKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3lfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfeV93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZFt5ICogZGVzdF95X3N0cmlkZSArIHhdID0KKyAgICAgICAgICAgICAgc1t5ICogc3JjX3lfc3RyaWRlICsgKHNyY195X3dpZHRoIC0gMSAtIHgpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogRmxpcCBVViAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDEpOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAxKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3V2X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3V2X3dpZHRoOyB4KyspIHsKKyAgICAgICAgICBkX29mZiA9IHkgKiBkZXN0X3V2X3N0cmlkZSArIHggKiAyOworICAgICAgICAgIHNfb2ZmID0geSAqIHNyY191dl9zdHJpZGUgKyAoc3JjX3V2X3dpZHRoIC0gMSAtIHgpICogMjsKKyAgICAgICAgICBkW2Rfb2ZmXSA9IHNbc19vZmZdOworICAgICAgICAgIGRbZF9vZmYgKyAxXSA9IHNbc19vZmYgKyAxXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fVkVSVDoKKyAgICAgIC8qIEZsaXAgWSAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDApOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAwKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3lfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfeV93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZFt5ICogZGVzdF95X3N0cmlkZSArIHhdID0KKyAgICAgICAgICAgICAgc1soc3JjX3lfaGVpZ2h0IC0gMSAtIHkpICogc3JjX3lfc3RyaWRlICsgeF07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIEZsaXAgVVYgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAxKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMSk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF91dl9oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZGVzdF91dl93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZF9vZmYgPSB5ICogZGVzdF91dl9zdHJpZGUgKyB4ICogMjsKKyAgICAgICAgICBzX29mZiA9IChzcmNfdXZfaGVpZ2h0IC0gMSAtIHkpICogc3JjX3V2X3N0cmlkZSArIHggKiAyOworICAgICAgICAgIGRbZF9vZmZdID0gc1tzX29mZl07CisgICAgICAgICAgZFtkX29mZiArIDFdID0gc1tzX29mZiArIDFdOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9VTF9MUjoKKyAgICAgIC8qIEZsaXAgWSAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDApOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAwKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3lfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfeV93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZFt5ICogZGVzdF95X3N0cmlkZSArIHhdID0gc1t4ICogc3JjX3lfc3RyaWRlICsgeV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIEZsaXAgVVYgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAxKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMSk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF91dl9oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZGVzdF91dl93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZF9vZmYgPSB5ICogZGVzdF91dl9zdHJpZGUgKyB4ICogMjsKKyAgICAgICAgICBzX29mZiA9IHggKiBzcmNfdXZfc3RyaWRlICsgeSAqIDI7CisgICAgICAgICAgZFtkX29mZl0gPSBzW3Nfb2ZmXTsKKyAgICAgICAgICBkW2Rfb2ZmICsgMV0gPSBzW3Nfb2ZmICsgMV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OX1VSX0xMOgorICAgICAgLyogRmxpcCBZICovCisgICAgICBzID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyYywgMCk7CisgICAgICBkID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3QsIDApOworICAgICAgZm9yICh5ID0gMDsgeSA8IGRlc3RfeV9oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZGVzdF95X3dpZHRoOyB4KyspIHsKKyAgICAgICAgICBkW3kgKiBkZXN0X3lfc3RyaWRlICsgeF0gPQorICAgICAgICAgICAgICBzWyhzcmNfeV9oZWlnaHQgLSAxIC0geCkgKiBzcmNfeV9zdHJpZGUgKyAoc3JjX3lfd2lkdGggLSAxIC0geSldOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBGbGlwIFVWICovCisgICAgICBzID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyYywgMSk7CisgICAgICBkID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3QsIDEpOworICAgICAgZm9yICh5ID0gMDsgeSA8IGRlc3RfdXZfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfdXZfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRfb2ZmID0geSAqIGRlc3RfdXZfc3RyaWRlICsgeCAqIDI7CisgICAgICAgICAgc19vZmYgPSAoc3JjX3V2X2hlaWdodCAtIDEgLSB4KSAqIHNyY191dl9zdHJpZGUgKyAoc3JjX3V2X3dpZHRoIC0gMSAtCisgICAgICAgICAgICAgIHkpICogMjsKKyAgICAgICAgICBkW2Rfb2ZmXSA9IHNbc19vZmZdOworICAgICAgICAgIGRbZF9vZmYgKyAxXSA9IHNbc19vZmYgKyAxXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fSURFTlRJVFk6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fZmxpcF9wYWNrZWRfc2ltcGxlIChHc3RWaWRlb0ZsaXAgKiB2aWRlb2ZsaXAsIEdzdFZpZGVvRnJhbWUgKiBkZXN0LAorICAgIGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBzcmMpCit7CisgIGdpbnQgeCwgeSwgejsKKyAgZ3VpbnQ4IGNvbnN0ICpzOworICBndWludDggKmQ7CisgIGdpbnQgc3cgPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKHNyYyk7CisgIGdpbnQgc2ggPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChzcmMpOworICBnaW50IGR3ID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChkZXN0KTsKKyAgZ2ludCBkaCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGRlc3QpOworICBnaW50IHNyY19zdHJpZGUsIGRlc3Rfc3RyaWRlOworICBnaW50IGJwcDsKKworICBzID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyYywgMCk7CisgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMCk7CisKKyAgc3JjX3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKHNyYywgMCk7CisgIGRlc3Rfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoZGVzdCwgMCk7CisgIC8qIFRoaXMgaXMgb25seSB0cnVlIGZvciBub24tc3Vic2FtcGxlZCBmb3JtYXRzISAqLworICBicHAgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFIChzcmMsIDApOworCisgIHN3aXRjaCAodmlkZW9mbGlwLT5hY3RpdmVfbWV0aG9kKSB7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fOTBSOgorICAgICAgZm9yICh5ID0gMDsgeSA8IGRoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGR3OyB4KyspIHsKKyAgICAgICAgICBmb3IgKHogPSAwOyB6IDwgYnBwOyB6KyspIHsKKyAgICAgICAgICAgIGRbeSAqIGRlc3Rfc3RyaWRlICsgeCAqIGJwcCArIHpdID0KKyAgICAgICAgICAgICAgICBzWyhzaCAtIDEgLSB4KSAqIHNyY19zdHJpZGUgKyB5ICogYnBwICsgel07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl85MEw6CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZHc7IHgrKykgeworICAgICAgICAgIGZvciAoeiA9IDA7IHogPCBicHA7IHorKykgeworICAgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyB4ICogYnBwICsgel0gPQorICAgICAgICAgICAgICAgIHNbeCAqIHNyY19zdHJpZGUgKyAoc3cgLSAxIC0geSkgKiBicHAgKyB6XTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OXzE4MDoKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkdzsgeCsrKSB7CisgICAgICAgICAgZm9yICh6ID0gMDsgeiA8IGJwcDsgeisrKSB7CisgICAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArIHggKiBicHAgKyB6XSA9CisgICAgICAgICAgICAgICAgc1soc2ggLSAxIC0geSkgKiBzcmNfc3RyaWRlICsgKHN3IC0gMSAtIHgpICogYnBwICsgel07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9IT1JJWjoKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkdzsgeCsrKSB7CisgICAgICAgICAgZm9yICh6ID0gMDsgeiA8IGJwcDsgeisrKSB7CisgICAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArIHggKiBicHAgKyB6XSA9CisgICAgICAgICAgICAgICAgc1t5ICogc3JjX3N0cmlkZSArIChzdyAtIDEgLSB4KSAqIGJwcCArIHpdOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fVkVSVDoKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkdzsgeCsrKSB7CisgICAgICAgICAgZm9yICh6ID0gMDsgeiA8IGJwcDsgeisrKSB7CisgICAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArIHggKiBicHAgKyB6XSA9CisgICAgICAgICAgICAgICAgc1soc2ggLSAxIC0geSkgKiBzcmNfc3RyaWRlICsgeCAqIGJwcCArIHpdOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fVUxfTFI6CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZHc7IHgrKykgeworICAgICAgICAgIGZvciAoeiA9IDA7IHogPCBicHA7IHorKykgeworICAgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyB4ICogYnBwICsgel0gPSBzW3ggKiBzcmNfc3RyaWRlICsgeSAqIGJwcCArIHpdOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fVVJfTEw6CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZHc7IHgrKykgeworICAgICAgICAgIGZvciAoeiA9IDA7IHogPCBicHA7IHorKykgeworICAgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyB4ICogYnBwICsgel0gPQorICAgICAgICAgICAgICAgIHNbKHNoIC0gMSAtIHgpICogc3JjX3N0cmlkZSArIChzdyAtIDEgLSB5KSAqIGJwcCArIHpdOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fSURFTlRJVFk6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19mbGlwX3k0MjIgKEdzdFZpZGVvRmxpcCAqIHZpZGVvZmxpcCwgR3N0VmlkZW9GcmFtZSAqIGRlc3QsCisgICAgY29uc3QgR3N0VmlkZW9GcmFtZSAqIHNyYykKK3sKKyAgZ2ludCB4LCB5OworICBndWludDggY29uc3QgKnM7CisgIGd1aW50OCAqZDsKKyAgZ2ludCBzdyA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoc3JjKTsKKyAgZ2ludCBzaCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKHNyYyk7CisgIGdpbnQgZHcgPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGRlc3QpOworICBnaW50IGRoID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoZGVzdCk7CisgIGdpbnQgc3JjX3N0cmlkZSwgZGVzdF9zdHJpZGU7CisgIGdpbnQgYnBwOworICBnaW50IHlfb2Zmc2V0OworICBnaW50IHVfb2Zmc2V0OworICBnaW50IHZfb2Zmc2V0OworICBnaW50IHlfc3RyaWRlOworCisgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAwKTsKKyAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAwKTsKKworICBzcmNfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoc3JjLCAwKTsKKyAgZGVzdF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChkZXN0LCAwKTsKKworICB5X29mZnNldCA9IEdTVF9WSURFT19GUkFNRV9DT01QX09GRlNFVCAoc3JjLCAwKTsKKyAgdV9vZmZzZXQgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKHNyYywgMSk7CisgIHZfb2Zmc2V0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfT0ZGU0VUIChzcmMsIDIpOworICB5X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BTVFJJREUgKHNyYywgMCk7CisgIGJwcCA9IHlfc3RyaWRlOworCisgIHN3aXRjaCAodmlkZW9mbGlwLT5hY3RpdmVfbWV0aG9kKSB7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fOTBSOgorICAgICAgZm9yICh5ID0gMDsgeSA8IGRoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGR3OyB4ICs9IDIpIHsKKyAgICAgICAgICBndWludDggdTsKKyAgICAgICAgICBndWludDggdjsKKyAgICAgICAgICAvKiB1L3YgbXVzdCBiZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBvZmZzZXQgb2YgdGhlIGV2ZW4gY29sdW1uICovCisgICAgICAgICAgZ2ludCBldmVuX3kgPSAoeSAmIH4xKTsKKworICAgICAgICAgIHUgPSBzWyhzaCAtIDEgLSB4KSAqIHNyY19zdHJpZGUgKyBldmVuX3kgKiBicHAgKyB1X29mZnNldF07CisgICAgICAgICAgaWYgKHggKyAxIDwgZHcpCisgICAgICAgICAgICB1ID0gKHNbKHNoIC0gMSAtICh4ICsgMSkpICogc3JjX3N0cmlkZSArIGV2ZW5feSAqIGJwcCArIHVfb2Zmc2V0XQorICAgICAgICAgICAgICAgICsgdSkgPj4gMTsKKyAgICAgICAgICB2ID0gc1soc2ggLSAxIC0geCkgKiBzcmNfc3RyaWRlICsgZXZlbl95ICogYnBwICsgdl9vZmZzZXRdOworICAgICAgICAgIGlmICh4ICsgMSA8IGR3KQorICAgICAgICAgICAgdiA9IChzWyhzaCAtIDEgLSAoeCArIDEpKSAqIHNyY19zdHJpZGUgKyBldmVuX3kgKiBicHAgKyB2X29mZnNldF0KKyAgICAgICAgICAgICAgICArIHYpID4+IDE7CisKKyAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArIHggKiBicHAgKyB1X29mZnNldF0gPSB1OworICAgICAgICAgIGRbeSAqIGRlc3Rfc3RyaWRlICsgeCAqIGJwcCArIHZfb2Zmc2V0XSA9IHY7CisgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyB4ICogYnBwICsgeV9vZmZzZXRdID0KKyAgICAgICAgICAgICAgc1soc2ggLSAxIC0geCkgKiBzcmNfc3RyaWRlICsgeSAqIGJwcCArIHlfb2Zmc2V0XTsKKyAgICAgICAgICBpZiAoeCArIDEgPCBkdykKKyAgICAgICAgICAgIGRbeSAqIGRlc3Rfc3RyaWRlICsgKHggKyAxKSAqIGJwcCArIHlfb2Zmc2V0XSA9CisgICAgICAgICAgICAgICAgc1soc2ggLSAxIC0gKHggKyAxKSkgKiBzcmNfc3RyaWRlICsgeSAqIGJwcCArIHlfb2Zmc2V0XTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fOTBMOgorICAgICAgZm9yICh5ID0gMDsgeSA8IGRoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGR3OyB4ICs9IDIpIHsKKyAgICAgICAgICBndWludDggdTsKKyAgICAgICAgICBndWludDggdjsKKyAgICAgICAgICAvKiB1L3YgbXVzdCBiZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBvZmZzZXQgb2YgdGhlIGV2ZW4gY29sdW1uICovCisgICAgICAgICAgZ2ludCBldmVuX3kgPSAoKHN3IC0gMSAtIHkpICYgfjEpOworCisgICAgICAgICAgdSA9IHNbeCAqIHNyY19zdHJpZGUgKyBldmVuX3kgKiBicHAgKyB1X29mZnNldF07CisgICAgICAgICAgaWYgKHggKyAxIDwgZHcpCisgICAgICAgICAgICB1ID0gKHNbKHggKyAxKSAqIHNyY19zdHJpZGUgKyBldmVuX3kgKiBicHAgKyB1X29mZnNldF0gKyB1KSA+PiAxOworICAgICAgICAgIHYgPSBzW3ggKiBzcmNfc3RyaWRlICsgZXZlbl95ICogYnBwICsgdl9vZmZzZXRdOworICAgICAgICAgIGlmICh4ICsgMSA8IGR3KQorICAgICAgICAgICAgdiA9IChzWyh4ICsgMSkgKiBzcmNfc3RyaWRlICsgZXZlbl95ICogYnBwICsgdl9vZmZzZXRdICsgdikgPj4gMTsKKworICAgICAgICAgIGRbeSAqIGRlc3Rfc3RyaWRlICsgeCAqIGJwcCArIHVfb2Zmc2V0XSA9IHU7CisgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyB4ICogYnBwICsgdl9vZmZzZXRdID0gdjsKKyAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArIHggKiBicHAgKyB5X29mZnNldF0gPQorICAgICAgICAgICAgICBzW3ggKiBzcmNfc3RyaWRlICsgKHN3IC0gMSAtIHkpICogYnBwICsgeV9vZmZzZXRdOworICAgICAgICAgIGlmICh4ICsgMSA8IGR3KQorICAgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyAoeCArIDEpICogYnBwICsgeV9vZmZzZXRdID0KKyAgICAgICAgICAgICAgICBzWyh4ICsgMSkgKiBzcmNfc3RyaWRlICsgKHN3IC0gMSAtIHkpICogYnBwICsgeV9vZmZzZXRdOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl8xODA6CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZHc7IHggKz0gMikgeworICAgICAgICAgIGd1aW50OCB1OworICAgICAgICAgIGd1aW50OCB2OworICAgICAgICAgIC8qIHUvdiBtdXN0IGJlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIG9mZnNldCBvZiB0aGUgZXZlbiBjb2x1bW4gKi8KKyAgICAgICAgICBnaW50IGV2ZW5feCA9ICgoc3cgLSAxIC0geCkgJiB+MSk7CisKKyAgICAgICAgICB1ID0gKHNbKHNoIC0gMSAtIHkpICogc3JjX3N0cmlkZSArIGV2ZW5feCAqIGJwcCArIHVfb2Zmc2V0XSArCisgICAgICAgICAgICAgIHNbKHNoIC0gMSAtIHkpICogc3JjX3N0cmlkZSArIGV2ZW5feCAqIGJwcCArIHVfb2Zmc2V0XSkgLyAyOworICAgICAgICAgIHYgPSAoc1soc2ggLSAxIC0geSkgKiBzcmNfc3RyaWRlICsgZXZlbl94ICogYnBwICsgdl9vZmZzZXRdICsKKyAgICAgICAgICAgICAgc1soc2ggLSAxIC0geSkgKiBzcmNfc3RyaWRlICsgZXZlbl94ICogYnBwICsgdl9vZmZzZXRdKSAvIDI7CisKKyAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArIHggKiBicHAgKyB1X29mZnNldF0gPSB1OworICAgICAgICAgIGRbeSAqIGRlc3Rfc3RyaWRlICsgeCAqIGJwcCArIHZfb2Zmc2V0XSA9IHY7CisgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyB4ICogYnBwICsgeV9vZmZzZXRdID0KKyAgICAgICAgICAgICAgc1soc2ggLSAxIC0geSkgKiBzcmNfc3RyaWRlICsgKHN3IC0gMSAtIHgpICogYnBwICsgeV9vZmZzZXRdOworICAgICAgICAgIGlmICh4ICsgMSA8IGR3KQorICAgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyAoeCArIDEpICogYnBwICsgeV9vZmZzZXRdID0KKyAgICAgICAgICAgICAgICBzWyhzaCAtIDEgLSB5KSAqIHNyY19zdHJpZGUgKyAoc3cgLSAxIC0gKHggKyAxKSkgKiBicHAgKworICAgICAgICAgICAgICAgIHlfb2Zmc2V0XTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fSE9SSVo6CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZHc7IHggKz0gMikgeworICAgICAgICAgIGd1aW50OCB1OworICAgICAgICAgIGd1aW50OCB2OworICAgICAgICAgIC8qIHUvdiBtdXN0IGJlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIG9mZnNldCBvZiB0aGUgZXZlbiBjb2x1bW4gKi8KKyAgICAgICAgICBnaW50IGV2ZW5feCA9ICgoc3cgLSAxIC0geCkgJiB+MSk7CisKKyAgICAgICAgICB1ID0gKHNbeSAqIHNyY19zdHJpZGUgKyBldmVuX3ggKiBicHAgKyB1X29mZnNldF0gKworICAgICAgICAgICAgICBzW3kgKiBzcmNfc3RyaWRlICsgZXZlbl94ICogYnBwICsgdV9vZmZzZXRdKSAvIDI7CisgICAgICAgICAgdiA9IChzW3kgKiBzcmNfc3RyaWRlICsgZXZlbl94ICogYnBwICsgdl9vZmZzZXRdICsKKyAgICAgICAgICAgICAgc1t5ICogc3JjX3N0cmlkZSArIGV2ZW5feCAqIGJwcCArIHZfb2Zmc2V0XSkgLyAyOworCisgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyB4ICogYnBwICsgdV9vZmZzZXRdID0gdTsKKyAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArIHggKiBicHAgKyB2X29mZnNldF0gPSB2OworICAgICAgICAgIGRbeSAqIGRlc3Rfc3RyaWRlICsgeCAqIGJwcCArIHlfb2Zmc2V0XSA9CisgICAgICAgICAgICAgIHNbeSAqIHNyY19zdHJpZGUgKyAoc3cgLSAxIC0geCkgKiBicHAgKyB5X29mZnNldF07CisgICAgICAgICAgaWYgKHggKyAxIDwgZHcpCisgICAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArICh4ICsgMSkgKiBicHAgKyB5X29mZnNldF0gPQorICAgICAgICAgICAgICAgIHNbeSAqIHNyY19zdHJpZGUgKyAoc3cgLSAxIC0gKHggKyAxKSkgKiBicHAgKyB5X29mZnNldF07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OX1ZFUlQ6CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZHc7IHggKz0gMikgeworICAgICAgICAgIGd1aW50OCB1OworICAgICAgICAgIGd1aW50OCB2OworICAgICAgICAgIC8qIHUvdiBtdXN0IGJlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIG9mZnNldCBvZiB0aGUgZXZlbiBjb2x1bW4gKi8KKyAgICAgICAgICBnaW50IGV2ZW5feCA9ICh4ICYgfjEpOworCisgICAgICAgICAgdSA9IChzWyhzaCAtIDEgLSB5KSAqIHNyY19zdHJpZGUgKyBldmVuX3ggKiBicHAgKyB1X29mZnNldF0gKworICAgICAgICAgICAgICBzWyhzaCAtIDEgLSB5KSAqIHNyY19zdHJpZGUgKyBldmVuX3ggKiBicHAgKyB1X29mZnNldF0pIC8gMjsKKyAgICAgICAgICB2ID0gKHNbKHNoIC0gMSAtIHkpICogc3JjX3N0cmlkZSArIGV2ZW5feCAqIGJwcCArIHZfb2Zmc2V0XSArCisgICAgICAgICAgICAgIHNbKHNoIC0gMSAtIHkpICogc3JjX3N0cmlkZSArIGV2ZW5feCAqIGJwcCArIHZfb2Zmc2V0XSkgLyAyOworCisgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyB4ICogYnBwICsgdV9vZmZzZXRdID0gdTsKKyAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArIHggKiBicHAgKyB2X29mZnNldF0gPSB2OworICAgICAgICAgIGRbeSAqIGRlc3Rfc3RyaWRlICsgeCAqIGJwcCArIHlfb2Zmc2V0XSA9CisgICAgICAgICAgICAgIHNbKHNoIC0gMSAtIHkpICogc3JjX3N0cmlkZSArIHggKiBicHAgKyB5X29mZnNldF07CisgICAgICAgICAgaWYgKHggKyAxIDwgZHcpCisgICAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArICh4ICsgMSkgKiBicHAgKyB5X29mZnNldF0gPQorICAgICAgICAgICAgICAgIHNbKHNoIC0gMSAtIHkpICogc3JjX3N0cmlkZSArICh4ICsgMSkgKiBicHAgKyB5X29mZnNldF07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OX1VMX0xSOgorICAgICAgZm9yICh5ID0gMDsgeSA8IGRoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGR3OyB4ICs9IDIpIHsKKyAgICAgICAgICBndWludDggdTsKKyAgICAgICAgICBndWludDggdjsKKyAgICAgICAgICAvKiB1L3YgbXVzdCBiZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBvZmZzZXQgb2YgdGhlIGV2ZW4gY29sdW1uICovCisgICAgICAgICAgZ2ludCBldmVuX3kgPSAoeSAmIH4xKTsKKworICAgICAgICAgIHUgPSBzW3ggKiBzcmNfc3RyaWRlICsgZXZlbl95ICogYnBwICsgdV9vZmZzZXRdOworICAgICAgICAgIGlmICh4ICsgMSA8IGR3KQorICAgICAgICAgICAgdSA9IChzWyh4ICsgMSkgKiBzcmNfc3RyaWRlICsgZXZlbl95ICogYnBwICsgdV9vZmZzZXRdICsgdSkgPj4gMTsKKyAgICAgICAgICB2ID0gc1t4ICogc3JjX3N0cmlkZSArIGV2ZW5feSAqIGJwcCArIHZfb2Zmc2V0XTsKKyAgICAgICAgICBpZiAoeCArIDEgPCBkdykKKyAgICAgICAgICAgIHYgPSAoc1soeCArIDEpICogc3JjX3N0cmlkZSArIGV2ZW5feSAqIGJwcCArIHZfb2Zmc2V0XSArIHYpID4+IDE7CisKKyAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArIHggKiBicHAgKyB1X29mZnNldF0gPSB1OworICAgICAgICAgIGRbeSAqIGRlc3Rfc3RyaWRlICsgeCAqIGJwcCArIHZfb2Zmc2V0XSA9IHY7CisgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyB4ICogYnBwICsgeV9vZmZzZXRdID0KKyAgICAgICAgICAgICAgc1t4ICogc3JjX3N0cmlkZSArIHkgKiBicHAgKyB5X29mZnNldF07CisgICAgICAgICAgaWYgKHggKyAxIDwgZHcpCisgICAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArICh4ICsgMSkgKiBicHAgKyB5X29mZnNldF0gPQorICAgICAgICAgICAgICAgIHNbKHggKyAxKSAqIHNyY19zdHJpZGUgKyB5ICogYnBwICsgeV9vZmZzZXRdOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9VUl9MTDoKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkdzsgeCArPSAyKSB7CisgICAgICAgICAgZ3VpbnQ4IHU7CisgICAgICAgICAgZ3VpbnQ4IHY7CisgICAgICAgICAgLyogdS92IG11c3QgYmUgY2FsY3VsYXRlZCB1c2luZyB0aGUgb2Zmc2V0IG9mIHRoZSBldmVuIGNvbHVtbiAqLworICAgICAgICAgIGdpbnQgZXZlbl95ID0gKChzdyAtIDEgLSB5KSAmIH4xKTsKKworICAgICAgICAgIHUgPSBzWyhzaCAtIDEgLSB4KSAqIHNyY19zdHJpZGUgKyBldmVuX3kgKiBicHAgKyB1X29mZnNldF07CisgICAgICAgICAgaWYgKHggKyAxIDwgZHcpCisgICAgICAgICAgICB1ID0gKHNbKHNoIC0gMSAtICh4ICsgMSkpICogc3JjX3N0cmlkZSArIGV2ZW5feSAqIGJwcCArIHVfb2Zmc2V0XQorICAgICAgICAgICAgICAgICsgdSkgPj4gMTsKKyAgICAgICAgICB2ID0gc1soc2ggLSAxIC0geCkgKiBzcmNfc3RyaWRlICsgZXZlbl95ICogYnBwICsgdl9vZmZzZXRdOworICAgICAgICAgIGlmICh4ICsgMSA8IGR3KQorICAgICAgICAgICAgdiA9IChzWyhzaCAtIDEgLSAoeCArIDEpKSAqIHNyY19zdHJpZGUgKyBldmVuX3kgKiBicHAgKyB2X29mZnNldF0KKyAgICAgICAgICAgICAgICArIHYpID4+IDE7CisKKyAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArIHggKiBicHAgKyB1X29mZnNldF0gPSB1OworICAgICAgICAgIGRbeSAqIGRlc3Rfc3RyaWRlICsgeCAqIGJwcCArIHZfb2Zmc2V0XSA9IHY7CisgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyB4ICogYnBwICsgeV9vZmZzZXRdID0KKyAgICAgICAgICAgICAgc1soc2ggLSAxIC0geCkgKiBzcmNfc3RyaWRlICsgKHN3IC0gMSAtIHkpICogYnBwICsgeV9vZmZzZXRdOworICAgICAgICAgIGlmICh4ICsgMSA8IGR3KQorICAgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyAoeCArIDEpICogYnBwICsgeV9vZmZzZXRdID0KKyAgICAgICAgICAgICAgICBzWyhzaCAtIDEgLSAoeCArIDEpKSAqIHNyY19zdHJpZGUgKyAoc3cgLSAxIC0geSkgKiBicHAgKworICAgICAgICAgICAgICAgIHlfb2Zmc2V0XTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fSURFTlRJVFk6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9fZmxpcF9zZXRfaW5mbyAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RDYXBzICogaW5jYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0VmlkZW9GbGlwICp2ZiA9IEdTVF9WSURFT19GTElQICh2ZmlsdGVyKTsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgdmYtPnByb2Nlc3MgPSBOVUxMOworCisgIGlmIChHU1RfVklERU9fSU5GT19GT1JNQVQgKGluX2luZm8pICE9IEdTVF9WSURFT19JTkZPX0ZPUk1BVCAob3V0X2luZm8pKQorICAgIGdvdG8gaW52YWxpZF9jYXBzOworCisgIC8qIENoZWNrIHRoYXQgdGhleSBhcmUgY29ycmVjdCAqLworICBzd2l0Y2ggKHZmLT5hY3RpdmVfbWV0aG9kKSB7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fOTBSOgorICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OXzkwTDoKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9VTF9MUjoKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9VUl9MTDoKKyAgICAgIGlmICgoaW5faW5mby0+d2lkdGggIT0gb3V0X2luZm8tPmhlaWdodCkgfHwKKyAgICAgICAgICAoaW5faW5mby0+aGVpZ2h0ICE9IG91dF9pbmZvLT53aWR0aCkpIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAodmYsICJ3ZSBhcmUgaW52ZXJ0aW5nIHdpZHRoIGFuZCBoZWlnaHQgYnV0IGNhcHMgIgorICAgICAgICAgICAgImFyZSBub3QgY29ycmVjdCA6ICVkeCVkIHRvICVkeCVkIiwgaW5faW5mby0+d2lkdGgsCisgICAgICAgICAgICBpbl9pbmZvLT5oZWlnaHQsIG91dF9pbmZvLT53aWR0aCwgb3V0X2luZm8tPmhlaWdodCk7CisgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9JREVOVElUWToKKworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fMTgwOgorICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OX0hPUklaOgorICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OX1ZFUlQ6CisgICAgICBpZiAoKGluX2luZm8tPndpZHRoICE9IG91dF9pbmZvLT53aWR0aCkgfHwKKyAgICAgICAgICAoaW5faW5mby0+aGVpZ2h0ICE9IG91dF9pbmZvLT5oZWlnaHQpKSB7CisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHZmLCAid2UgYXJlIGtlZXBpbmcgd2lkdGggYW5kIGhlaWdodCBidXQgY2FwcyAiCisgICAgICAgICAgICAiYXJlIG5vdCBjb3JyZWN0IDogJWR4JWQgdG8gJWR4JWQiLCBpbl9pbmZvLT53aWR0aCwKKyAgICAgICAgICAgIGluX2luZm8tPmhlaWdodCwgb3V0X2luZm8tPndpZHRoLCBvdXRfaW5mby0+aGVpZ2h0KTsKKyAgICAgICAgZ290byBiZWFjaDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gVFJVRTsKKworICBzd2l0Y2ggKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoaW5faW5mbykpIHsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfSTQyMDoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVYxMjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQ0NDoKKyAgICAgIHZmLT5wcm9jZXNzID0gZ3N0X3ZpZGVvX2ZsaXBfcGxhbmFyX3l1djsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVVkyOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9VWVZZOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVllVOgorICAgICAgdmYtPnByb2Nlc3MgPSBnc3RfdmlkZW9fZmxpcF95NDIyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FZVVY6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FSR0I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FCR1I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQkE6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX3hSR0I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX3hCR1I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQng6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUng6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9HUkFZODoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfR1JBWTE2X0JFOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9HUkFZMTZfTEU6CisgICAgICB2Zi0+cHJvY2VzcyA9IGdzdF92aWRlb19mbGlwX3BhY2tlZF9zaW1wbGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYxMjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYyMToKKyAgICAgIHZmLT5wcm9jZXNzID0gZ3N0X3ZpZGVvX2ZsaXBfc2VtaV9wbGFuYXJfeXV2OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKK2JlYWNoOgorICByZXR1cm4gcmV0ICYmICh2Zi0+cHJvY2VzcyAhPSBOVUxMKTsKKworaW52YWxpZF9jYXBzOgorICBHU1RfRVJST1JfT0JKRUNUICh2ZiwgIkludmFsaWQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQgIiAtPiAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIGluY2Fwcywgb3V0Y2Fwcyk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19mbGlwX3NldF9tZXRob2QgKEdzdFZpZGVvRmxpcCAqIHZpZGVvZmxpcCwKKyAgICBHc3RWaWRlb09yaWVudGF0aW9uTWV0aG9kIG1ldGhvZCwgZ2Jvb2xlYW4gZnJvbV90YWcpCit7CisgIEdTVF9PQkpFQ1RfTE9DSyAodmlkZW9mbGlwKTsKKworICBpZiAobWV0aG9kID09IEdTVF9WSURFT19PUklFTlRBVElPTl9DVVNUT00pIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHZpZGVvZmxpcCwgInVuc3VwcG9ydGVkIGN1c3RvbSBvcmllbnRhdGlvbiIpOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLICh2aWRlb2ZsaXApOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFN0b3JlIHVwZGF0ZWQgbWV0aG9kICovCisgIGlmIChmcm9tX3RhZykKKyAgICB2aWRlb2ZsaXAtPnRhZ19tZXRob2QgPSBtZXRob2Q7CisgIGVsc2UKKyAgICB2aWRlb2ZsaXAtPm1ldGhvZCA9IG1ldGhvZDsKKworICAvKiBHZXQgdGhlIG5ldyBtZXRob2QgKi8KKyAgaWYgKHZpZGVvZmxpcC0+bWV0aG9kID09IEdTVF9WSURFT19PUklFTlRBVElPTl9BVVRPKQorICAgIG1ldGhvZCA9IHZpZGVvZmxpcC0+dGFnX21ldGhvZDsKKyAgZWxzZQorICAgIG1ldGhvZCA9IHZpZGVvZmxpcC0+bWV0aG9kOworCisgIGlmIChtZXRob2QgIT0gdmlkZW9mbGlwLT5hY3RpdmVfbWV0aG9kKSB7CisgICAgR0VudW1WYWx1ZSAqYWN0aXZlX21ldGhvZF9lbnVtLCAqbWV0aG9kX2VudW07CisgICAgR3N0QmFzZVRyYW5zZm9ybSAqYnRyYW5zID0gR1NUX0JBU0VfVFJBTlNGT1JNICh2aWRlb2ZsaXApOworICAgIEdFbnVtQ2xhc3MgKmVudW1fY2xhc3MgPQorICAgICAgICBnX3R5cGVfY2xhc3NfcmVmIChHU1RfVFlQRV9WSURFT19PUklFTlRBVElPTl9NRVRIT0QpOworCisgICAgYWN0aXZlX21ldGhvZF9lbnVtID0KKyAgICAgICAgZ19lbnVtX2dldF92YWx1ZSAoZW51bV9jbGFzcywgdmlkZW9mbGlwLT5hY3RpdmVfbWV0aG9kKTsKKyAgICBtZXRob2RfZW51bSA9IGdfZW51bV9nZXRfdmFsdWUgKGVudW1fY2xhc3MsIG1ldGhvZCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodmlkZW9mbGlwLCAiQ2hhbmdpbmcgbWV0aG9kIGZyb20gJXMgdG8gJXMiLAorICAgICAgICBhY3RpdmVfbWV0aG9kX2VudW0gPyBhY3RpdmVfbWV0aG9kX2VudW0tPnZhbHVlX25pY2sgOiAiKG5pbCkiLAorICAgICAgICBtZXRob2RfZW51bSA/IG1ldGhvZF9lbnVtLT52YWx1ZV9uaWNrIDogIihuaWwpIik7CisgICAgZ190eXBlX2NsYXNzX3VucmVmIChlbnVtX2NsYXNzKTsKKworICAgIHZpZGVvZmxpcC0+YWN0aXZlX21ldGhvZCA9IG1ldGhvZDsKKworICAgIEdTVF9PQkpFQ1RfVU5MT0NLICh2aWRlb2ZsaXApOworCisgICAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9wYXNzdGhyb3VnaCAoYnRyYW5zLAorICAgICAgICBtZXRob2QgPT0gR1NUX1ZJREVPX09SSUVOVEFUSU9OX0lERU5USVRZKTsKKyAgICBnc3RfYmFzZV90cmFuc2Zvcm1fcmVjb25maWd1cmVfc3JjIChidHJhbnMpOworICB9IGVsc2UgeworICAgIEdTVF9PQkpFQ1RfVU5MT0NLICh2aWRlb2ZsaXApOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fZmxpcF9iZWZvcmVfdHJhbnNmb3JtIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdEJ1ZmZlciAqIGluKQoreworICBHc3RWaWRlb0ZsaXAgKnZpZGVvZmxpcCA9IEdTVF9WSURFT19GTElQICh0cmFucyk7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIHN0cmVhbV90aW1lOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbik7CisgIHN0cmVhbV90aW1lID0KKyAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmdHJhbnMtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgdGltZXN0YW1wKTsKKworICBHU1RfREVCVUdfT0JKRUNUICh2aWRlb2ZsaXAsICJzeW5jIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtX3RpbWUpKQorICAgIGdzdF9vYmplY3Rfc3luY192YWx1ZXMgKEdTVF9PQkpFQ1QgKHZpZGVvZmxpcCksIHN0cmVhbV90aW1lKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92aWRlb19mbGlwX3RyYW5zZm9ybV9mcmFtZSAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLAorICAgIEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSkKK3sKKyAgR0VudW1DbGFzcyAqZW51bV9jbGFzczsKKyAgR0VudW1WYWx1ZSAqYWN0aXZlX21ldGhvZF9lbnVtOworICBHc3RWaWRlb0ZsaXAgKnZpZGVvZmxpcCA9IEdTVF9WSURFT19GTElQICh2ZmlsdGVyKTsKKworICBpZiAoR19VTkxJS0VMWSAodmlkZW9mbGlwLT5wcm9jZXNzID09IE5VTEwpKQorICAgIGdvdG8gbm90X25lZ290aWF0ZWQ7CisKKyAgZW51bV9jbGFzcyA9IGdfdHlwZV9jbGFzc19yZWYgKEdTVF9UWVBFX1ZJREVPX09SSUVOVEFUSU9OX01FVEhPRCk7CisgIGFjdGl2ZV9tZXRob2RfZW51bSA9IGdfZW51bV9nZXRfdmFsdWUgKGVudW1fY2xhc3MsIHZpZGVvZmxpcC0+YWN0aXZlX21ldGhvZCk7CisgIEdTVF9MT0dfT0JKRUNUICh2aWRlb2ZsaXAsICJ2aWRlb2ZsaXA6IGZsaXBwaW5nICglcykiLAorICAgICAgYWN0aXZlX21ldGhvZF9lbnVtID8gYWN0aXZlX21ldGhvZF9lbnVtLT52YWx1ZV9uaWNrIDogIihuaWwpIik7CisgIGdfdHlwZV9jbGFzc191bnJlZiAoZW51bV9jbGFzcyk7CisKKyAgR1NUX09CSkVDVF9MT0NLICh2aWRlb2ZsaXApOworICB2aWRlb2ZsaXAtPnByb2Nlc3MgKHZpZGVvZmxpcCwgb3V0X2ZyYW1lLCBpbl9mcmFtZSk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLICh2aWRlb2ZsaXApOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworbm90X25lZ290aWF0ZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUICh2aWRlb2ZsaXAsICJOb3QgbmVnb3RpYXRlZCB5ZXQiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9fZmxpcF9zcmNfZXZlbnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0VmlkZW9GbGlwICp2ZiA9IEdTVF9WSURFT19GTElQICh0cmFucyk7CisgIGdkb3VibGUgbmV3X3gsIG5ld195LCB4LCB5OworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2Jvb2xlYW4gcmV0OworICBHc3RWaWRlb0luZm8gKm91dF9pbmZvID0gJkdTVF9WSURFT19GSUxURVIgKHRyYW5zKS0+b3V0X2luZm87CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodmYsICJoYW5kbGluZyAlcyBldmVudCIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfTkFWSUdBVElPTjoKKyAgICAgIGV2ZW50ID0KKyAgICAgICAgICBHU1RfRVZFTlQgKGdzdF9taW5pX29iamVjdF9tYWtlX3dyaXRhYmxlIChHU1RfTUlOSV9PQkpFQ1QgKGV2ZW50KSkpOworCisgICAgICBzdHJ1Y3R1cmUgPSAoR3N0U3RydWN0dXJlICopIGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChldmVudCk7CisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfZG91YmxlIChzdHJ1Y3R1cmUsICJwb2ludGVyX3giLCAmeCkgJiYKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9kb3VibGUgKHN0cnVjdHVyZSwgInBvaW50ZXJfeSIsICZ5KSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh2ZiwgImNvbnZlcnRpbmcgJWZ4JWYiLCB4LCB5KTsKKyAgICAgICAgc3dpdGNoICh2Zi0+YWN0aXZlX21ldGhvZCkgeworICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OXzkwUjoKKyAgICAgICAgICAgIG5ld194ID0geTsKKyAgICAgICAgICAgIG5ld195ID0gb3V0X2luZm8tPndpZHRoIC0geDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OXzkwTDoKKyAgICAgICAgICAgIG5ld194ID0gb3V0X2luZm8tPmhlaWdodCAtIHk7CisgICAgICAgICAgICBuZXdfeSA9IHg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9VUl9MTDoKKyAgICAgICAgICAgIG5ld194ID0gb3V0X2luZm8tPmhlaWdodCAtIHk7CisgICAgICAgICAgICBuZXdfeSA9IG91dF9pbmZvLT53aWR0aCAtIHg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9VTF9MUjoKKyAgICAgICAgICAgIG5ld194ID0geTsKKyAgICAgICAgICAgIG5ld195ID0geDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OXzE4MDoKKyAgICAgICAgICAgIG5ld194ID0gb3V0X2luZm8tPndpZHRoIC0geDsKKyAgICAgICAgICAgIG5ld195ID0gb3V0X2luZm8tPmhlaWdodCAtIHk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9IT1JJWjoKKyAgICAgICAgICAgIG5ld194ID0gb3V0X2luZm8tPndpZHRoIC0geDsKKyAgICAgICAgICAgIG5ld195ID0geTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OX1ZFUlQ6CisgICAgICAgICAgICBuZXdfeCA9IHg7CisgICAgICAgICAgICBuZXdfeSA9IG91dF9pbmZvLT5oZWlnaHQgLSB5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG5ld194ID0geDsKKyAgICAgICAgICAgIG5ld195ID0geTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHZmLCAidG8gJWZ4JWYiLCBuZXdfeCwgbmV3X3kpOworICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoc3RydWN0dXJlLCAicG9pbnRlcl94IiwgR19UWVBFX0RPVUJMRSwgbmV3X3gsCisgICAgICAgICAgICAicG9pbnRlcl95IiwgR19UWVBFX0RPVUJMRSwgbmV3X3ksIE5VTEwpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zcmNfZXZlbnQgKHRyYW5zLCBldmVudCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9fZmxpcF9zaW5rX2V2ZW50IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFZpZGVvRmxpcCAqdmYgPSBHU1RfVklERU9fRkxJUCAodHJhbnMpOworICBHc3RUYWdMaXN0ICp0YWdsaXN0OworICBnY2hhciAqb3JpZW50YXRpb247CisgIGdib29sZWFuIHJldDsKKworICBHU1RfREVCVUdfT0JKRUNUICh2ZiwgImhhbmRsaW5nICVzIGV2ZW50IiwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9UQUc6CisgICAgICBnc3RfZXZlbnRfcGFyc2VfdGFnIChldmVudCwgJnRhZ2xpc3QpOworCisgICAgICBpZiAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ2xpc3QsICJpbWFnZS1vcmllbnRhdGlvbiIsICZvcmllbnRhdGlvbikpIHsKKyAgICAgICAgaWYgKCFnX3N0cmNtcDAgKCJyb3RhdGUtMCIsIG9yaWVudGF0aW9uKSkKKyAgICAgICAgICBnc3RfdmlkZW9fZmxpcF9zZXRfbWV0aG9kICh2ZiwgR1NUX1ZJREVPX09SSUVOVEFUSU9OX0lERU5USVRZLCBUUlVFKTsKKyAgICAgICAgZWxzZSBpZiAoIWdfc3RyY21wMCAoInJvdGF0ZS05MCIsIG9yaWVudGF0aW9uKSkKKyAgICAgICAgICBnc3RfdmlkZW9fZmxpcF9zZXRfbWV0aG9kICh2ZiwgR1NUX1ZJREVPX09SSUVOVEFUSU9OXzkwUiwgVFJVRSk7CisgICAgICAgIGVsc2UgaWYgKCFnX3N0cmNtcDAgKCJyb3RhdGUtMTgwIiwgb3JpZW50YXRpb24pKQorICAgICAgICAgIGdzdF92aWRlb19mbGlwX3NldF9tZXRob2QgKHZmLCBHU1RfVklERU9fT1JJRU5UQVRJT05fMTgwLCBUUlVFKTsKKyAgICAgICAgZWxzZSBpZiAoIWdfc3RyY21wMCAoInJvdGF0ZS0yNzAiLCBvcmllbnRhdGlvbikpCisgICAgICAgICAgZ3N0X3ZpZGVvX2ZsaXBfc2V0X21ldGhvZCAodmYsIEdTVF9WSURFT19PUklFTlRBVElPTl85MEwsIFRSVUUpOworICAgICAgICBlbHNlIGlmICghZ19zdHJjbXAwICgiZmxpcC1yb3RhdGUtMCIsIG9yaWVudGF0aW9uKSkKKyAgICAgICAgICBnc3RfdmlkZW9fZmxpcF9zZXRfbWV0aG9kICh2ZiwgR1NUX1ZJREVPX09SSUVOVEFUSU9OX0hPUklaLCBUUlVFKTsKKyAgICAgICAgZWxzZSBpZiAoIWdfc3RyY21wMCAoImZsaXAtcm90YXRlLTkwIiwgb3JpZW50YXRpb24pKQorICAgICAgICAgIGdzdF92aWRlb19mbGlwX3NldF9tZXRob2QgKHZmLCBHU1RfVklERU9fT1JJRU5UQVRJT05fVUxfTFIsIFRSVUUpOworICAgICAgICBlbHNlIGlmICghZ19zdHJjbXAwICgiZmxpcC1yb3RhdGUtMTgwIiwgb3JpZW50YXRpb24pKQorICAgICAgICAgIGdzdF92aWRlb19mbGlwX3NldF9tZXRob2QgKHZmLCBHU1RfVklERU9fT1JJRU5UQVRJT05fVkVSVCwgVFJVRSk7CisgICAgICAgIGVsc2UgaWYgKCFnX3N0cmNtcDAgKCJmbGlwLXJvdGF0ZS0yNzAiLCBvcmllbnRhdGlvbikpCisgICAgICAgICAgZ3N0X3ZpZGVvX2ZsaXBfc2V0X21ldGhvZCAodmYsIEdTVF9WSURFT19PUklFTlRBVElPTl9VUl9MTCwgVFJVRSk7CisKKyAgICAgICAgZ19mcmVlIChvcmllbnRhdGlvbik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNpbmtfZXZlbnQgKHRyYW5zLCBldmVudCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19mbGlwX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWaWRlb0ZsaXAgKnZpZGVvZmxpcCA9IEdTVF9WSURFT19GTElQIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NRVRIT0Q6CisgICAgY2FzZSBQUk9QX1ZJREVPX0RJUkVDVElPTjoKKyAgICAgIGdzdF92aWRlb19mbGlwX3NldF9tZXRob2QgKHZpZGVvZmxpcCwgZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpLCBGQUxTRSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fZmxpcF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VmlkZW9GbGlwICp2aWRlb2ZsaXAgPSBHU1RfVklERU9fRkxJUCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTUVUSE9EOgorICAgIGNhc2UgUFJPUF9WSURFT19ESVJFQ1RJT046CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgdmlkZW9mbGlwLT5tZXRob2QpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2ZsaXBfY2xhc3NfaW5pdCAoR3N0VmlkZW9GbGlwQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzICp0cmFuc19jbGFzcyA9IChHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKikga2xhc3M7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgKnZmaWx0ZXJfY2xhc3MgPSAoR3N0VmlkZW9GaWx0ZXJDbGFzcyAqKSBrbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAodmlkZW9fZmxpcF9kZWJ1ZywgInZpZGVvZmxpcCIsIDAsICJ2aWRlb2ZsaXAiKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdmlkZW9fZmxpcF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF92aWRlb19mbGlwX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01FVEhPRCwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgibWV0aG9kIiwgIm1ldGhvZCIsCisgICAgICAgICAgIm1ldGhvZCAoZGVwcmVjYXRlZCwgdXNlIHZpZGVvLWRpcmVjdGlvbiBpbnN0ZWFkKSIsCisgICAgICAgICAgR1NUX1RZUEVfVklERU9fRkxJUF9NRVRIT0QsIFBST1BfTUVUSE9EX0RFRkFVTFQsCisgICAgICAgICAgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QgfAorICAgICAgICAgIEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3Nfb3ZlcnJpZGVfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVklERU9fRElSRUNUSU9OLAorICAgICAgInZpZGVvLWRpcmVjdGlvbiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJWaWRlbyBmbGlwcGVyIiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1ZpZGVvIiwKKyAgICAgICJGbGlwcyBhbmQgcm90YXRlcyB2aWRlbyIsICJEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfdmlkZW9fZmxpcF9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3ZpZGVvX2ZsaXBfc3JjX3RlbXBsYXRlKTsKKworICB0cmFuc19jbGFzcy0+dHJhbnNmb3JtX2NhcHMgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19mbGlwX3RyYW5zZm9ybV9jYXBzKTsKKyAgdHJhbnNfY2xhc3MtPmJlZm9yZV90cmFuc2Zvcm0gPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19mbGlwX2JlZm9yZV90cmFuc2Zvcm0pOworICB0cmFuc19jbGFzcy0+c3JjX2V2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19mbGlwX3NyY19ldmVudCk7CisgIHRyYW5zX2NsYXNzLT5zaW5rX2V2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19mbGlwX3NpbmtfZXZlbnQpOworCisgIHZmaWx0ZXJfY2xhc3MtPnNldF9pbmZvID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19mbGlwX3NldF9pbmZvKTsKKyAgdmZpbHRlcl9jbGFzcy0+dHJhbnNmb3JtX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdmlkZW9fZmxpcF90cmFuc2Zvcm1fZnJhbWUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2ZsaXBfaW5pdCAoR3N0VmlkZW9GbGlwICogdmlkZW9mbGlwKQoreworICAvKiBBVVRPIGlzIG5vdCB2YWxpZCBmb3IgYWN0aXZlIG1ldGhvZCwgdGhpcyBpcyBqdXN0IHRvIGVuc3VyZSB3ZSBzZXR1cCB0aGUKKyAgICogbWV0aG9kIGluIGdzdF92aWRlb19mbGlwX3NldF9tZXRob2QoKSAqLworICB2aWRlb2ZsaXAtPmFjdGl2ZV9tZXRob2QgPSBHU1RfVklERU9fT1JJRU5UQVRJT05fQVVUTzsKK30KZGlmZiAtLWdpdCBhL2dzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuaCBiL2dzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmNhOGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1ZJREVPX0ZMSVBfSF9fCisjZGVmaW5lIF9fR1NUX1ZJREVPX0ZMSVBfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworLyoqCisgKiBHc3RWaWRlb0ZsaXBNZXRob2Q6CisgKiBAR1NUX1ZJREVPX0ZMSVBfTUVUSE9EX0lERU5USVRZOiBJZGVudGl0eSAobm8gcm90YXRpb24pCisgKiBAR1NUX1ZJREVPX0ZMSVBfTUVUSE9EXzkwUjogUm90YXRlIGNsb2Nrd2lzZSA5MCBkZWdyZWVzCisgKiBAR1NUX1ZJREVPX0ZMSVBfTUVUSE9EXzE4MDogUm90YXRlIDE4MCBkZWdyZWVzCisgKiBAR1NUX1ZJREVPX0ZMSVBfTUVUSE9EXzkwTDogUm90YXRlIGNvdW50ZXItY2xvY2t3aXNlIDkwIGRlZ3JlZXMKKyAqIEBHU1RfVklERU9fRkxJUF9NRVRIT0RfSE9SSVo6IEZsaXAgaG9yaXpvbnRhbGx5CisgKiBAR1NUX1ZJREVPX0ZMSVBfTUVUSE9EX1ZFUlQ6IEZsaXAgdmVydGljYWxseQorICogQEdTVF9WSURFT19GTElQX01FVEhPRF9UUkFOUzogRmxpcCBhY3Jvc3MgdXBwZXIgbGVmdC9sb3dlciByaWdodCBkaWFnb25hbAorICogQEdTVF9WSURFT19GTElQX01FVEhPRF9PVEhFUjogRmxpcCBhY3Jvc3MgdXBwZXIgcmlnaHQvbG93ZXIgbGVmdCBkaWFnb25hbAorICogQEdTVF9WSURFT19GTElQX01FVEhPRF9BVVRPOiBTZWxlY3QgZmxpcCBtZXRob2QgYmFzZWQgb24gaW1hZ2Utb3JpZW50YXRpb24gdGFnCisgKgorICogVGhlIGRpZmZlcmVudCBmbGlwIG1ldGhvZHMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEdTVF9WSURFT19GTElQX01FVEhPRF9JREVOVElUWSwKKyAgR1NUX1ZJREVPX0ZMSVBfTUVUSE9EXzkwUiwKKyAgR1NUX1ZJREVPX0ZMSVBfTUVUSE9EXzE4MCwKKyAgR1NUX1ZJREVPX0ZMSVBfTUVUSE9EXzkwTCwKKyAgR1NUX1ZJREVPX0ZMSVBfTUVUSE9EX0hPUklaLAorICBHU1RfVklERU9fRkxJUF9NRVRIT0RfVkVSVCwKKyAgR1NUX1ZJREVPX0ZMSVBfTUVUSE9EX1RSQU5TLAorICBHU1RfVklERU9fRkxJUF9NRVRIT0RfT1RIRVIsCisgIEdTVF9WSURFT19GTElQX01FVEhPRF9BVVRPCit9IEdzdFZpZGVvRmxpcE1ldGhvZDsKKworI2RlZmluZSBHU1RfVFlQRV9WSURFT19GTElQIFwKKyAgKGdzdF92aWRlb19mbGlwX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WSURFT19GTElQKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVklERU9fRkxJUCxHc3RWaWRlb0ZsaXApKQorI2RlZmluZSBHU1RfVklERU9fRkxJUF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WSURFT19GTElQLEdzdFZpZGVvRmxpcENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1ZJREVPX0ZMSVAob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WSURFT19GTElQKSkKKyNkZWZpbmUgR1NUX0lTX1ZJREVPX0ZMSVBfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVklERU9fRkxJUCkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWaWRlb0ZsaXAgR3N0VmlkZW9GbGlwOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZpZGVvRmxpcENsYXNzIEdzdFZpZGVvRmxpcENsYXNzOworCisvKioKKyAqIEdzdFZpZGVvRmxpcDoKKyAqCisgKiBPcGFxdWUgZGF0YXN0cnVjdHVyZS4KKyAqLworc3RydWN0IF9Hc3RWaWRlb0ZsaXAgeworICBHc3RWaWRlb0ZpbHRlciB2aWRlb2ZpbHRlcjsKKworICAvKiA8IHByaXZhdGUgPiAqLworICBHc3RWaWRlb09yaWVudGF0aW9uTWV0aG9kIG1ldGhvZDsKKyAgR3N0VmlkZW9PcmllbnRhdGlvbk1ldGhvZCB0YWdfbWV0aG9kOworICBHc3RWaWRlb09yaWVudGF0aW9uTWV0aG9kIGFjdGl2ZV9tZXRob2Q7CisgIHZvaWQgKCpwcm9jZXNzKSAoR3N0VmlkZW9GbGlwICp2aWRlb2ZsaXAsIEdzdFZpZGVvRnJhbWUgKmRlc3QsIGNvbnN0IEdzdFZpZGVvRnJhbWUgKnNyYyk7Cit9OworCitzdHJ1Y3QgX0dzdFZpZGVvRmxpcENsYXNzIHsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfdmlkZW9fZmxpcF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9WSURFT19GTElQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvbWVkaWFuLmMgYi9nc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9tZWRpYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDJjZDIzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvbWVkaWFuLmMKQEAgLTAsMCArMSwzMjMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0dmlkZW9tZWRpYW4uaCIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHZpZGVvX21lZGlhbl9zcmNfZmFjdG9yeSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBJNDIwLCBZVjEyIH0iKSkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgdmlkZW9fbWVkaWFuX3NpbmtfZmFjdG9yeSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IEk0MjAsIFlWMTIgfSIpKQorICAgICk7CisKKworLyogTWVkaWFuIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworI2RlZmluZSBERUZBVUxUX0ZJTFRFUlNJWkUgICA1CisjZGVmaW5lIERFRkFVTFRfTFVNX09OTFkgICAgIFRSVUUKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0ZJTFRFUlNJWkUsCisgIFBST1BfTFVNX09OTFkKK307CisKKyNkZWZpbmUgR1NUX1RZUEVfVklERU9fTUVESUFOX1NJWkUgKGdzdF92aWRlb19tZWRpYW5fc2l6ZV9nZXRfdHlwZSgpKQorCitzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSB2aWRlb19tZWRpYW5fc2l6ZXNbXSA9IHsKKyAge0dTVF9WSURFT19NRURJQU5fU0laRV81LCAiTWVkaWFuIG9mIDUgbmVpZ2hib3VyIHBpeGVscyIsICI1In0sCisgIHtHU1RfVklERU9fTUVESUFOX1NJWkVfOSwgIk1lZGlhbiBvZiA5IG5laWdoYm91ciBwaXhlbHMiLCAiOSJ9LAorICB7MCwgTlVMTCwgTlVMTH0sCit9OworCitzdGF0aWMgR1R5cGUKK2dzdF92aWRlb19tZWRpYW5fc2l6ZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIHZpZGVvX21lZGlhbl9zaXplX3R5cGUgPSAwOworCisgIGlmICghdmlkZW9fbWVkaWFuX3NpemVfdHlwZSkgeworICAgIHZpZGVvX21lZGlhbl9zaXplX3R5cGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0VmlkZW9NZWRpYW5TaXplIiwKKyAgICAgICAgdmlkZW9fbWVkaWFuX3NpemVzKTsKKyAgfQorICByZXR1cm4gdmlkZW9fbWVkaWFuX3NpemVfdHlwZTsKK30KKworI2RlZmluZSBnc3RfdmlkZW9fbWVkaWFuX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFZpZGVvTWVkaWFuLCBnc3RfdmlkZW9fbWVkaWFuLCBHU1RfVFlQRV9WSURFT19GSUxURVIpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfdmlkZW9fbWVkaWFuX3RyYW5zZm9ybV9mcmFtZSAoR3N0VmlkZW9GaWx0ZXIgKiBmaWx0ZXIsCisgICAgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLCBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lKTsKKworc3RhdGljIHZvaWQgZ3N0X3ZpZGVvX21lZGlhbl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfdmlkZW9fbWVkaWFuX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19tZWRpYW5fY2xhc3NfaW5pdCAoR3N0VmlkZW9NZWRpYW5DbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIHZmaWx0ZXJfY2xhc3MgPSAoR3N0VmlkZW9GaWx0ZXJDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdmlkZW9fbWVkaWFuX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3ZpZGVvX21lZGlhbl9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9GSUxURVJTSVpFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJmaWx0ZXJzaXplIiwgIkZpbHRlcnNpemUiLCAiVGhlIHNpemUgb2YgdGhlIGZpbHRlciIsCisgICAgICAgICAgR1NUX1RZUEVfVklERU9fTUVESUFOX1NJWkUsIERFRkFVTFRfRklMVEVSU0laRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0xVTV9PTkxZLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJsdW0tb25seSIsICJMdW0gT25seSIsICJPbmx5IGFwcGx5IGZpbHRlciBvbiAiCisgICAgICAgICAgImx1bWluYW5jZSIsIERFRkFVTFRfTFVNX09OTFksCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmdmlkZW9fbWVkaWFuX3NpbmtfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJnZpZGVvX21lZGlhbl9zcmNfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJNZWRpYW4gZWZmZWN0IiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1ZpZGVvIiwgIkFwcGx5IGEgbWVkaWFuIGZpbHRlciB0byBhbiBpbWFnZSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICB2ZmlsdGVyX2NsYXNzLT50cmFuc2Zvcm1fZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19tZWRpYW5fdHJhbnNmb3JtX2ZyYW1lKTsKK30KKwordm9pZAorZ3N0X3ZpZGVvX21lZGlhbl9pbml0IChHc3RWaWRlb01lZGlhbiAqIG1lZGlhbikKK3sKKyAgbWVkaWFuLT5maWx0ZXJzaXplID0gREVGQVVMVF9GSUxURVJTSVpFOworICBtZWRpYW4tPmx1bV9vbmx5ID0gREVGQVVMVF9MVU1fT05MWTsKK30KKworI2RlZmluZSBQSVhfU09SVChhLGIpIHsgaWYgKChhKT4oYikpIFBJWF9TV0FQKChhKSwoYikpOyB9CisjZGVmaW5lIFBJWF9TV0FQKGEsYikgeyB1bnNpZ25lZCBjaGFyIHRlbXA9KGEpOyhhKT0oYik7KGIpPXRlbXA7IH0KKworc3RhdGljIHZvaWQKK21lZGlhbl81IChndWludDggKiBkZXN0LCBnaW50IGRzdHJpZGUsIGNvbnN0IGd1aW50OCAqIHNyYywgZ2ludCBzc3RyaWRlLAorICAgIGdpbnQgd2lkdGgsIGdpbnQgaGVpZ2h0KQoreworICB1bnNpZ25lZCBjaGFyIHBbNV07CisgIGludCBpLCBqLCBrOworCisgIC8qIGNvcHkgdGhlIHRvcCBhbmQgYm90dG9tIHJvd3MgaW50byB0aGUgcmVzdWx0IGFycmF5ICovCisgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgZGVzdFtpXSA9IHNyY1tpXTsKKyAgICBkZXN0WyhoZWlnaHQgLSAxKSAqIGRzdHJpZGUgKyBpXSA9IHNyY1soaGVpZ2h0IC0gMSkgKiBzc3RyaWRlICsgaV07CisgIH0KKworICAvKiBwcm9jZXNzIHRoZSBpbnRlcmlvciBwaXhlbHMgKi8KKyAgZm9yIChrID0gMjsgayA8IGhlaWdodDsgaysrKSB7CisgICAgZGVzdCArPSBkc3RyaWRlOworICAgIHNyYyArPSBzc3RyaWRlOworCisgICAgZGVzdFswXSA9IHNyY1swXTsKKyAgICBmb3IgKGogPSAyLCBpID0gMTsgaiA8IHdpZHRoOyBqKyssIGkrKykgeworICAgICAgcFswXSA9IHNyY1tpIC0gc3N0cmlkZV07CisgICAgICBwWzFdID0gc3JjW2kgLSAxXTsKKyAgICAgIHBbMl0gPSBzcmNbaV07CisgICAgICBwWzNdID0gc3JjW2kgKyAxXTsKKyAgICAgIHBbNF0gPSBzcmNbaSArIHNzdHJpZGVdOworICAgICAgUElYX1NPUlQgKHBbMF0sIHBbMV0pOworICAgICAgUElYX1NPUlQgKHBbM10sIHBbNF0pOworICAgICAgUElYX1NPUlQgKHBbMF0sIHBbM10pOworICAgICAgUElYX1NPUlQgKHBbMV0sIHBbNF0pOworICAgICAgUElYX1NPUlQgKHBbMV0sIHBbMl0pOworICAgICAgUElYX1NPUlQgKHBbMl0sIHBbM10pOworICAgICAgUElYX1NPUlQgKHBbMV0sIHBbMl0pOworICAgICAgZGVzdFtpXSA9IHBbMl07CisgICAgfQorICAgIGRlc3RbaV0gPSBzcmNbaV07CisgIH0KK30KKworc3RhdGljIHZvaWQKK21lZGlhbl85IChndWludDggKiBkZXN0LCBnaW50IGRzdHJpZGUsIGNvbnN0IGd1aW50OCAqIHNyYywgZ2ludCBzc3RyaWRlLAorICAgIGdpbnQgd2lkdGgsIGdpbnQgaGVpZ2h0KQoreworICB1bnNpZ25lZCBjaGFyIHBbOV07CisgIGludCBpLCBqLCBrOworCisgIC8qY29weSB0aGUgdG9wIGFuZCBib3R0b20gcm93cyBpbnRvIHRoZSByZXN1bHQgYXJyYXkgKi8KKyAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICBkZXN0W2ldID0gc3JjW2ldOworICAgIGRlc3RbKGhlaWdodCAtIDEpICogZHN0cmlkZSArIGldID0gc3JjWyhoZWlnaHQgLSAxKSAqIHNzdHJpZGUgKyBpXTsKKyAgfQorICAvKiBwcm9jZXNzIHRoZSBpbnRlcmlvciBwaXhlbHMgKi8KKyAgZm9yIChrID0gMjsgayA8IGhlaWdodDsgaysrKSB7CisgICAgZGVzdCArPSBkc3RyaWRlOworICAgIHNyYyArPSBzc3RyaWRlOworCisgICAgZGVzdFswXSA9IHNyY1swXTsKKyAgICBmb3IgKGogPSAyLCBpID0gMTsgaiA8IHdpZHRoOyBqKyssIGkrKykgeworICAgICAgcFswXSA9IHNyY1tpIC0gc3N0cmlkZSAtIDFdOworICAgICAgcFsxXSA9IHNyY1tpIC0gc3N0cmlkZV07CisgICAgICBwWzJdID0gc3JjW2kgLSBzc3RyaWRlICsgMV07CisgICAgICBwWzNdID0gc3JjW2kgLSAxXTsKKyAgICAgIHBbNF0gPSBzcmNbaV07CisgICAgICBwWzVdID0gc3JjW2kgKyAxXTsKKyAgICAgIHBbNl0gPSBzcmNbaSArIHNzdHJpZGUgLSAxXTsKKyAgICAgIHBbN10gPSBzcmNbaSArIHNzdHJpZGVdOworICAgICAgcFs4XSA9IHNyY1tpICsgc3N0cmlkZSArIDFdOworICAgICAgUElYX1NPUlQgKHBbMV0sIHBbMl0pOworICAgICAgUElYX1NPUlQgKHBbNF0sIHBbNV0pOworICAgICAgUElYX1NPUlQgKHBbN10sIHBbOF0pOworICAgICAgUElYX1NPUlQgKHBbMF0sIHBbMV0pOworICAgICAgUElYX1NPUlQgKHBbM10sIHBbNF0pOworICAgICAgUElYX1NPUlQgKHBbNl0sIHBbN10pOworICAgICAgUElYX1NPUlQgKHBbMV0sIHBbMl0pOworICAgICAgUElYX1NPUlQgKHBbNF0sIHBbNV0pOworICAgICAgUElYX1NPUlQgKHBbN10sIHBbOF0pOworICAgICAgUElYX1NPUlQgKHBbMF0sIHBbM10pOworICAgICAgUElYX1NPUlQgKHBbNV0sIHBbOF0pOworICAgICAgUElYX1NPUlQgKHBbNF0sIHBbN10pOworICAgICAgUElYX1NPUlQgKHBbM10sIHBbNl0pOworICAgICAgUElYX1NPUlQgKHBbMV0sIHBbNF0pOworICAgICAgUElYX1NPUlQgKHBbMl0sIHBbNV0pOworICAgICAgUElYX1NPUlQgKHBbNF0sIHBbN10pOworICAgICAgUElYX1NPUlQgKHBbNF0sIHBbMl0pOworICAgICAgUElYX1NPUlQgKHBbNl0sIHBbNF0pOworICAgICAgUElYX1NPUlQgKHBbNF0sIHBbMl0pOworICAgICAgZGVzdFtpXSA9IHBbNF07CisgICAgfQorICAgIGRlc3RbaV0gPSBzcmNbaV07CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92aWRlb19tZWRpYW5fdHJhbnNmb3JtX2ZyYW1lIChHc3RWaWRlb0ZpbHRlciAqIGZpbHRlciwKKyAgICBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUpCit7CisgIEdzdFZpZGVvTWVkaWFuICptZWRpYW4gPSBHU1RfVklERU9fTUVESUFOIChmaWx0ZXIpOworCisgIGlmIChtZWRpYW4tPmZpbHRlcnNpemUgPT0gNSkgeworICAgIG1lZGlhbl81IChHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKSwKKyAgICAgICAgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAob3V0X2ZyYW1lLCAwKSwKKyAgICAgICAgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAwKSwKKyAgICAgICAgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoaW5fZnJhbWUsIDApLAorICAgICAgICBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKSwgR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpKTsKKworICAgIGlmIChtZWRpYW4tPmx1bV9vbmx5KSB7CisgICAgICBnc3RfdmlkZW9fZnJhbWVfY29weV9wbGFuZSAob3V0X2ZyYW1lLCBpbl9mcmFtZSwgMSk7CisgICAgICBnc3RfdmlkZW9fZnJhbWVfY29weV9wbGFuZSAob3V0X2ZyYW1lLCBpbl9mcmFtZSwgMik7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lZGlhbl81IChHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAxKSwKKyAgICAgICAgICBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChvdXRfZnJhbWUsIDEpLAorICAgICAgICAgIEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMSksCisgICAgICAgICAgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoaW5fZnJhbWUsIDEpLAorICAgICAgICAgIEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpIC8gMiwKKyAgICAgICAgICBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSkgLyAyKTsKKyAgICAgIG1lZGlhbl81IChHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAyKSwKKyAgICAgICAgICBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChvdXRfZnJhbWUsIDIpLAorICAgICAgICAgIEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMiksCisgICAgICAgICAgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoaW5fZnJhbWUsIDIpLAorICAgICAgICAgIEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpIC8gMiwKKyAgICAgICAgICBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSkgLyAyKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbWVkaWFuXzkgKEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApLAorICAgICAgICBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChvdXRfZnJhbWUsIDApLAorICAgICAgICBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApLAorICAgICAgICBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChpbl9mcmFtZSwgMCksCisgICAgICAgIEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpLCBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSkpOworCisgICAgaWYgKG1lZGlhbi0+bHVtX29ubHkpIHsKKyAgICAgIGdzdF92aWRlb19mcmFtZV9jb3B5X3BsYW5lIChvdXRfZnJhbWUsIGluX2ZyYW1lLCAxKTsKKyAgICAgIGdzdF92aWRlb19mcmFtZV9jb3B5X3BsYW5lIChvdXRfZnJhbWUsIGluX2ZyYW1lLCAyKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVkaWFuXzkgKEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDEpLAorICAgICAgICAgIEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKG91dF9mcmFtZSwgMSksCisgICAgICAgICAgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAxKSwKKyAgICAgICAgICBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChpbl9mcmFtZSwgMSksCisgICAgICAgICAgR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSkgLyAyLAorICAgICAgICAgIEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKSAvIDIpOworICAgICAgbWVkaWFuXzkgKEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDIpLAorICAgICAgICAgIEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKG91dF9mcmFtZSwgMiksCisgICAgICAgICAgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAyKSwKKyAgICAgICAgICBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChpbl9mcmFtZSwgMiksCisgICAgICAgICAgR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSkgLyAyLAorICAgICAgICAgIEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKSAvIDIpOworICAgIH0KKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19tZWRpYW5fc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFZpZGVvTWVkaWFuICptZWRpYW47CisKKyAgbWVkaWFuID0gR1NUX1ZJREVPX01FRElBTiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfRklMVEVSU0laRToKKyAgICAgIG1lZGlhbi0+ZmlsdGVyc2l6ZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9MVU1fT05MWToKKyAgICAgIG1lZGlhbi0+bHVtX29ubHkgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19tZWRpYW5fZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFZpZGVvTWVkaWFuICptZWRpYW47CisKKyAgbWVkaWFuID0gR1NUX1ZJREVPX01FRElBTiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfRklMVEVSU0laRToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBtZWRpYW4tPmZpbHRlcnNpemUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0xVTV9PTkxZOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIG1lZGlhbi0+bHVtX29ubHkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvbWVkaWFuLmggYi9nc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9tZWRpYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODc3NjcyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvbWVkaWFuLmgKQEAgLTAsMCArMSw2NiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9WSURFT19NRURJQU5fSF9fCisjZGVmaW5lIF9fR1NUX1ZJREVPX01FRElBTl9IX18KKworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2ZpbHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfVklERU9fTUVESUFOIFwKKyAgKGdzdF92aWRlb19tZWRpYW5fZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1ZJREVPX01FRElBTihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1ZJREVPX01FRElBTixHc3RWaWRlb01lZGlhbikpCisjZGVmaW5lIEdTVF9WSURFT19NRURJQU5fQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfVklERU9fTUVESUFOLEdzdFZpZGVvTWVkaWFuQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVklERU9fTUVESUFOKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfVklERU9fTUVESUFOKSkKKyNkZWZpbmUgR1NUX0lTX1ZJREVPX01FRElBTl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9WSURFT19NRURJQU4pKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0VmlkZW9NZWRpYW4gR3N0VmlkZW9NZWRpYW47Cit0eXBlZGVmIHN0cnVjdCBfR3N0VmlkZW9NZWRpYW5DbGFzcyBHc3RWaWRlb01lZGlhbkNsYXNzOworCit0eXBlZGVmIGVudW0KK3sKKyAgR1NUX1ZJREVPX01FRElBTl9TSVpFXzUgPSA1LAorICBHU1RfVklERU9fTUVESUFOX1NJWkVfOSA9IDkKK30gR3N0VmlkZW9NZWRpYW5TaXplOworCitzdHJ1Y3QgX0dzdFZpZGVvTWVkaWFuIHsKKyAgR3N0VmlkZW9GaWx0ZXIgcGFyZW50OworCisgIEdzdFZpZGVvTWVkaWFuU2l6ZSBmaWx0ZXJzaXplOworICBnYm9vbGVhbiBsdW1fb25seTsKK307CisKK3N0cnVjdCBfR3N0VmlkZW9NZWRpYW5DbGFzcyB7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3ZpZGVvX21lZGlhbl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9WSURFT19NRURJQU5fSF9fICovCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW90ZW1wbGF0ZS5jIGIvZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjA1MjZhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvdGVtcGxhdGUuYwpAQCAtMCwwICsxLDI1MyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgKHByb2JhYmx5KSBnZW5lcmF0ZWQgZnJvbQorICogJElkJAorICogYW5kCisgKiBNQUtFRklMVEVSVkVSU0lPTgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3R2aWRlb2ZpbHRlci5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIEdTVF9UWVBFX1ZJREVPVEVNUExBVEUgXAorICAoZ3N0X3ZpZGVvdGVtcGxhdGVfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1ZJREVPVEVNUExBVEUob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9WSURFT1RFTVBMQVRFLEdzdFZpZGVvdGVtcGxhdGUpKQorI2RlZmluZSBHU1RfVklERU9URU1QTEFURV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WSURFT1RFTVBMQVRFLEdzdFZpZGVvdGVtcGxhdGVDbGFzcykpCisjZGVmaW5lIEdTVF9JU19WSURFT1RFTVBMQVRFKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfVklERU9URU1QTEFURSkpCisjZGVmaW5lIEdTVF9JU19WSURFT1RFTVBMQVRFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1ZJREVPVEVNUExBVEUpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0VmlkZW90ZW1wbGF0ZSBHc3RWaWRlb3RlbXBsYXRlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZpZGVvdGVtcGxhdGVDbGFzcyBHc3RWaWRlb3RlbXBsYXRlQ2xhc3M7CisKK3N0cnVjdCBfR3N0VmlkZW90ZW1wbGF0ZQoreworICBHc3RWaWRlb2ZpbHRlciB2aWRlb2ZpbHRlcjsKKworfTsKKworc3RydWN0IF9Hc3RWaWRlb3RlbXBsYXRlQ2xhc3MKK3sKKyAgR3N0VmlkZW9maWx0ZXJDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCisKKy8qIEdzdFZpZGVvdGVtcGxhdGUgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCitlbnVtCit7CisgIFBST1BfMAorICAgICAgLyogRklMTCBNRSAqLworfTsKKworc3RhdGljIHZvaWQgZ3N0X3ZpZGVvdGVtcGxhdGVfYmFzZV9pbml0IChncG9pbnRlciBnX2NsYXNzKTsKK3N0YXRpYyB2b2lkIGdzdF92aWRlb3RlbXBsYXRlX2NsYXNzX2luaXQgKGdwb2ludGVyIGdfY2xhc3MsCisgICAgZ3BvaW50ZXIgY2xhc3NfZGF0YSk7CitzdGF0aWMgdm9pZCBnc3RfdmlkZW90ZW1wbGF0ZV9pbml0IChHVHlwZUluc3RhbmNlICogaW5zdGFuY2UsIGdwb2ludGVyIGdfY2xhc3MpOworCitzdGF0aWMgdm9pZCBnc3RfdmlkZW90ZW1wbGF0ZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfdmlkZW90ZW1wbGF0ZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyB2b2lkIGdzdF92aWRlb3RlbXBsYXRlX3BsYW5hcjQxMSAoR3N0VmlkZW9maWx0ZXIgKiB2aWRlb2ZpbHRlciwKKyAgICB2b2lkICpkZXN0LCB2b2lkICpzcmMpOworc3RhdGljIHZvaWQgZ3N0X3ZpZGVvdGVtcGxhdGVfc2V0dXAgKEdzdFZpZGVvZmlsdGVyICogdmlkZW9maWx0ZXIpOworCitHVHlwZQorZ3N0X3ZpZGVvdGVtcGxhdGVfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSB2aWRlb3RlbXBsYXRlX3R5cGUgPSAwOworCisgIGlmICghdmlkZW90ZW1wbGF0ZV90eXBlKSB7CisgICAgc3RhdGljIGNvbnN0IEdUeXBlSW5mbyB2aWRlb3RlbXBsYXRlX2luZm8gPSB7CisgICAgICBzaXplb2YgKEdzdFZpZGVvdGVtcGxhdGVDbGFzcyksCisgICAgICBnc3RfdmlkZW90ZW1wbGF0ZV9iYXNlX2luaXQsCisgICAgICBOVUxMLAorICAgICAgZ3N0X3ZpZGVvdGVtcGxhdGVfY2xhc3NfaW5pdCwKKyAgICAgIE5VTEwsCisgICAgICBOVUxMLAorICAgICAgc2l6ZW9mIChHc3RWaWRlb3RlbXBsYXRlKSwKKyAgICAgIDAsCisgICAgICBnc3RfdmlkZW90ZW1wbGF0ZV9pbml0LAorICAgIH07CisKKyAgICB2aWRlb3RlbXBsYXRlX3R5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChHU1RfVFlQRV9WSURFT0ZJTFRFUiwKKyAgICAgICAgIkdzdFZpZGVvdGVtcGxhdGUiLCAmdmlkZW90ZW1wbGF0ZV9pbmZvLCAwKTsKKyAgfQorICByZXR1cm4gdmlkZW90ZW1wbGF0ZV90eXBlOworfQorCitzdGF0aWMgY29uc3QgR3N0VmlkZW9maWx0ZXJGb3JtYXQgZ3N0X3ZpZGVvdGVtcGxhdGVfZm9ybWF0c1tdID0geworICB7Ikk0MjAiLCAxMiwgZ3N0X3ZpZGVvdGVtcGxhdGVfcGxhbmFyNDExLH0sCit9OworCisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW90ZW1wbGF0ZV9iYXNlX2luaXQgKGdwb2ludGVyIGdfY2xhc3MpCit7CisKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGdfY2xhc3MpOworICBHc3RWaWRlb2ZpbHRlckNsYXNzICp2aWRlb2ZpbHRlcl9jbGFzcyA9IEdTVF9WSURFT0ZJTFRFUl9DTEFTUyAoZ19jbGFzcyk7CisgIGludCBpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJWaWRlbyBmaWx0ZXIgdGVtcGxhdGUiLAorICAgICAgIkZpbHRlci9FZmZlY3QvVmlkZW8iLAorICAgICAgIlRlbXBsYXRlIGZvciBhIHZpZGVvIGZpbHRlciIsICJEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4iKTsKKworICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTIChnc3RfdmlkZW90ZW1wbGF0ZV9mb3JtYXRzKTsgaSsrKSB7CisgICAgZ3N0X3ZpZGVvZmlsdGVyX2NsYXNzX2FkZF9mb3JtYXQgKHZpZGVvZmlsdGVyX2NsYXNzLAorICAgICAgICBnc3RfdmlkZW90ZW1wbGF0ZV9mb3JtYXRzICsgaSk7CisgIH0KKworICBnc3RfdmlkZW9maWx0ZXJfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZXMgKEdTVF9WSURFT0ZJTFRFUl9DTEFTUyAoZ19jbGFzcykpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvdGVtcGxhdGVfY2xhc3NfaW5pdCAoZ3BvaW50ZXIgZ19jbGFzcywgZ3BvaW50ZXIgY2xhc3NfZGF0YSkKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RWaWRlb2ZpbHRlckNsYXNzICp2aWRlb2ZpbHRlcl9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGdfY2xhc3MpOworICB2aWRlb2ZpbHRlcl9jbGFzcyA9IEdTVF9WSURFT0ZJTFRFUl9DTEFTUyAoZ19jbGFzcyk7CisKKyNpZiAwCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUVUSE9ELAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJtZXRob2QiLCAibWV0aG9kIiwgIm1ldGhvZCIsCisgICAgICAgICAgR1NUX1RZUEVfVklERU9URU1QTEFURV9NRVRIT0QsIEdTVF9WSURFT1RFTVBMQVRFX01FVEhPRF8xLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworI2VuZGlmCisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3ZpZGVvdGVtcGxhdGVfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfdmlkZW90ZW1wbGF0ZV9nZXRfcHJvcGVydHk7CisKKyAgdmlkZW9maWx0ZXJfY2xhc3MtPnNldHVwID0gZ3N0X3ZpZGVvdGVtcGxhdGVfc2V0dXA7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW90ZW1wbGF0ZV9pbml0IChHVHlwZUluc3RhbmNlICogaW5zdGFuY2UsIGdwb2ludGVyIGdfY2xhc3MpCit7CisgIEdzdFZpZGVvdGVtcGxhdGUgKnZpZGVvdGVtcGxhdGUgPSBHU1RfVklERU9URU1QTEFURSAoaW5zdGFuY2UpOworICBHc3RWaWRlb2ZpbHRlciAqdmlkZW9maWx0ZXI7CisKKyAgR1NUX0RFQlVHICgiZ3N0X3ZpZGVvdGVtcGxhdGVfaW5pdCIpOworCisgIHZpZGVvZmlsdGVyID0gR1NUX1ZJREVPRklMVEVSICh2aWRlb3RlbXBsYXRlKTsKKworICAvKiBkbyBzdHVmZiAqLworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvdGVtcGxhdGVfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFZpZGVvdGVtcGxhdGUgKnNyYzsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfVklERU9URU1QTEFURSAob2JqZWN0KSk7CisgIHNyYyA9IEdTVF9WSURFT1RFTVBMQVRFIChvYmplY3QpOworCisgIEdTVF9ERUJVRyAoImdzdF92aWRlb3RlbXBsYXRlX3NldF9wcm9wZXJ0eSIpOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyNpZiAwCisgICAgY2FzZSBQUk9QX01FVEhPRDoKKyAgICAgIHNyYy0+bWV0aG9kID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb3RlbXBsYXRlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWaWRlb3RlbXBsYXRlICpzcmM7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1ZJREVPVEVNUExBVEUgKG9iamVjdCkpOworICBzcmMgPSBHU1RfVklERU9URU1QTEFURSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyNpZiAwCisgICAgY2FzZSBQUk9QX01FVEhPRDoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBzcmMtPm1ldGhvZCk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInZpZGVvdGVtcGxhdGUiLCBHU1RfUkFOS19OT05FLAorICAgICAgR1NUX1RZUEVfVklERU9URU1QTEFURSk7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICB2aWRlb3RlbXBsYXRlLAorICAgICJUZW1wbGF0ZSBmb3IgYSB2aWRlbyBmaWx0ZXIiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQorCisgICAgIHN0YXRpYyB2b2lkIGdzdF92aWRlb3RlbXBsYXRlX3NldHVwIChHc3RWaWRlb2ZpbHRlciAqIHZpZGVvZmlsdGVyKQoreworICBHc3RWaWRlb3RlbXBsYXRlICp2aWRlb3RlbXBsYXRlOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19WSURFT1RFTVBMQVRFICh2aWRlb2ZpbHRlcikpOworICB2aWRlb3RlbXBsYXRlID0gR1NUX1ZJREVPVEVNUExBVEUgKHZpZGVvZmlsdGVyKTsKKworICAvKiBpZiBhbnkgc2V0dXAgbmVlZHMgdG8gYmUgZG9uZSwgZG8gaXQgaGVyZSAqLworCit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW90ZW1wbGF0ZV9wbGFuYXI0MTEgKEdzdFZpZGVvZmlsdGVyICogdmlkZW9maWx0ZXIsCisgICAgdm9pZCAqZGVzdCwgdm9pZCAqc3JjKQoreworICBHc3RWaWRlb3RlbXBsYXRlICp2aWRlb3RlbXBsYXRlOworICBpbnQgd2lkdGggPSBnc3RfdmlkZW9maWx0ZXJfZ2V0X2lucHV0X3dpZHRoICh2aWRlb2ZpbHRlcik7CisgIGludCBoZWlnaHQgPSBnc3RfdmlkZW9maWx0ZXJfZ2V0X2lucHV0X2hlaWdodCAodmlkZW9maWx0ZXIpOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19WSURFT1RFTVBMQVRFICh2aWRlb2ZpbHRlcikpOworICB2aWRlb3RlbXBsYXRlID0gR1NUX1ZJREVPVEVNUExBVEUgKHZpZGVvZmlsdGVyKTsKKworICAvKiBkbyBzb21ldGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4gIFRoaXMgc2ltcGx5IGNvcGllcyB0aGUgc291cmNlCisgICAqIHRvIHRoZSBkZXN0aW5hdGlvbi4gKi8KKyAgbWVtY3B5IChkZXN0LCBzcmMsIHdpZHRoICogaGVpZ2h0ICsgKHdpZHRoIC8gMikgKiAoaGVpZ2h0IC8gMikgKiAyKTsKK30KZGlmZiAtLWdpdCBhL2dzdC92aWRlb2ZpbHRlci9tYWtlX2ZpbHRlciBiL2dzdC92aWRlb2ZpbHRlci9tYWtlX2ZpbHRlcgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OTJkMGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvZmlsdGVyL21ha2VfZmlsdGVyCkBAIC0wLDAgKzEsMzkgQEAKKyMhL2Jpbi9zaAorCitMQU5HPUMKK2V4cG9ydCBMQU5HCitMQ19DT0xMQVRFPUMKK2V4cG9ydCBMQ19DT0xMQVRFCisKK1RlbXBsYXRlPSQxOworc3JjZmlsZT0kMjsKKworaWYgdGVzdCB4IiQxIiA9IHggOyB0aGVuCisJZWNobyAiJDAgT2JqZWN0bmFtZSBbc3JjZmlsZV1cbiI7CisJZWNobyAiICBjcmVhdGVzIGdzdG9iamVjdG5hbWUue2MsaH0gaW1wbGVtZW50aW5nIEdzdE9iamVjdG5hbWUsXG4iOworCWVjaG8gIiAgc3ViY2xhc3NpbmcgR3N0VmlkZW9maWx0ZXIuXG4iOworCWV4aXQgMTsKK2ZpCisKK2lmIHRlc3QgeCIkMiIgPSB4IDsgdGhlbgorCXNyY2ZpbGU9ImdzdHZpZGVvdGVtcGxhdGUuYyIKK2ZpCisKK2lkPWBlY2hvICckSWQkJyB8IHNlZCBcCisJLWUgJ3MvXCRJW2RdOiBcKFteJF0qXClcJC9cMS9nJ2AKK2VjaG8gJGlkCisKK1RFTVBMQVRFPWBlY2hvICRUZW1wbGF0ZSB8IHRyIFs6bG93ZXI6XSBbOnVwcGVyOl1gCit0ZW1wbGF0ZT1gZWNobyAkVGVtcGxhdGUgfCB0ciBbOnVwcGVyOl0gWzpsb3dlcjpdYAorCisjIHJlbWVtYmVyIHRvIGJyZWFrIHVwIHRoZSBJZDogaW4gdGhlIGxpbmUgYmVsb3cKK3NlZCBcCisJLWUgJ3MvZ3N0dmlkZW90ZW1wbGF0ZVwuYy9TT1VSQ0VGSUxFL2cnIFwKKwktZSAicy9WaWRlb3RlbXBsYXRlLyRUZW1wbGF0ZS9nIiBcCisJLWUgInMvdmlkZW90ZW1wbGF0ZS8kdGVtcGxhdGUvZyIgXAorCS1lICJzL1ZJREVPVEVNUExBVEUvJFRFTVBMQVRFL2ciIFwKKwktZSAncy9cJElbZF06IFwoW14kXSpcKVwkL1wxL2cnIFwKKwktZSAncy9TT1VSQ0VGSUxFL2dzdHZpZGVvdGVtcGxhdGVcLmMvZycgXAorCS1lICJzJU1BS0VGSUxURVJWRVJTSU9OJSRpZCVnIiBcCisJJHNyY2ZpbGUgPmdzdCR0ZW1wbGF0ZS5jLnRtcCAmJiBtdiBnc3QkdGVtcGxhdGUuYy50bXAgZ3N0JHRlbXBsYXRlLmMKKwpkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvZmlsdGVyL21lc29uLmJ1aWxkIGIvZ3N0L3ZpZGVvZmlsdGVyL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYWMxZDUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdmlkZW9maWx0ZXIvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxNiBAQAordmZpbHRlcl9zb3VyY2VzID0gWworICAncGx1Z2luLmMnLAorICAnZ3N0dmlkZW9mbGlwLmMnLAorICAnZ3N0dmlkZW9iYWxhbmNlLmMnLAorICAnZ3N0Z2FtbWEuYycsCisgICdnc3R2aWRlb21lZGlhbi5jJywKK10KKworZ3N0dmlkZW9maWx0ZXIgPSBsaWJyYXJ5KCdnc3R2aWRlb2ZpbHRlcicsCisgIHZmaWx0ZXJfc291cmNlcywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgZ3N0dmlkZW9fZGVwLCBsaWJtXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKZGlmZiAtLWdpdCBhL2dzdC92aWRlb2ZpbHRlci9wbHVnaW4uYyBiL2dzdC92aWRlb2ZpbHRlci9wbHVnaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTczNmRjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvZmlsdGVyL3BsdWdpbi5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImdzdGdhbW1hLmgiCisjaW5jbHVkZSAiZ3N0dmlkZW9mbGlwLmgiCisjaW5jbHVkZSAiZ3N0dmlkZW9iYWxhbmNlLmgiCisjaW5jbHVkZSAiZ3N0dmlkZW9tZWRpYW4uaCIKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gKGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJnYW1tYSIsIEdTVF9SQU5LX05PTkUsIEdTVF9UWVBFX0dBTU1BKQorICAgICAgJiYgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInZpZGVvYmFsYW5jZSIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfVklERU9fQkFMQU5DRSkKKyAgICAgICYmIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJ2aWRlb2ZsaXAiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX1ZJREVPX0ZMSVApCisgICAgICAmJiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAidmlkZW9tZWRpYW4iLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX1ZJREVPX01FRElBTikpOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgdmlkZW9maWx0ZXIsCisgICAgIlZpZGVvIGZpbHRlcnMgcGx1Z2luIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9nc3QvdmlkZW9taXhlci9NYWtlZmlsZS5hbSBiL2dzdC92aWRlb21peGVyL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMDI4OWEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdmlkZW9taXhlci9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDIzIEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3R2aWRlb21peGVyLmxhCisKK09SQ19TT1VSQ0U9dmlkZW9taXhlcm9yYworCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29tbW9uL29yYy5tYWsKKworbGliZ3N0dmlkZW9taXhlcl9sYV9TT1VSQ0VTID0gXAorCWJsZW5kLmMgXAorCXZpZGVvbWl4ZXIyLmMKKworbm9kaXN0X2xpYmdzdHZpZGVvbWl4ZXJfbGFfU09VUkNFUyA9ICQoT1JDX05PRElTVF9TT1VSQ0VTKQorbGliZ3N0dmlkZW9taXhlcl9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykgJChPUkNfQ0ZMQUdTKQorbGliZ3N0dmlkZW9taXhlcl9sYV9MSUJBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgXAorCS1sZ3N0dmlkZW8tQEdTVF9BUElfVkVSU0lPTkAgXAorCSQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykgJChPUkNfTElCUykgJChMSUJNKQorbGliZ3N0dmlkZW9taXhlcl9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKKyMgaGVhZGVycyB3ZSBuZWVkIGJ1dCBkb24ndCB3YW50IGluc3RhbGxlZAorbm9pbnN0X0hFQURFUlMgPSBcCisJYmxlbmQuaCBcCisJdmlkZW9taXhlcjIuaCBcCisJdmlkZW9taXhlcjJwYWQuaApkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvbWl4ZXIvUkVBRE1FIGIvZ3N0L3ZpZGVvbWl4ZXIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OTRhNDgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdmlkZW9taXhlci9SRUFETUUKQEAgLTAsMCArMSwyNyBAQAorVmlkZW8gTWl4ZXIKKy0tLS0tLS0tLS0tCisKK0EgZ2VuZXJpY2UgdmlkZW8gbWl4ZXIsIGl0IGJsZW5kcyB0aGUgYXl1diBidWZmZXJzIGZyb20gYWxsIHBhZHMgb250byAKK2EgbmV3IGJ1ZmZlci4gVGhlIG5ldyBidWZmZXIgaGFzIGJ5IGRlZmF1bHQgYSBjaGVja2VyYm9hcmQgcGF0dGVybiBidXQKK2l0cyBjb2xvciBjYW4gYmUgY2hhbmdlZCB3aXRoIGEgcHJvcGVydHkuCitUaGUgbWl4ZXIgY2FuIG1peCBzdHJlYW1zIHdpdGggZGlmZmVyZW50IGZyYW1lcmF0ZXMgYW5kIHZpZGVvIHNpemVzLiBJdAordXNlcyB0aGUgZHVyYXRpb24gdmFsdWUgb2YgdGhlIGJ1ZmZlciB0byBzY2hlZHVsZSB0aGUgcmVuZGVyaW5nIG9mIHRoZQorYnVmZmVycy4gRm9yIHN0cmVhbXMgd2l0aCBhIGRpZmZlcmVudCByZXNvbHRpb24gdGhhbiB0aGUgZmluYWwgb3V0cHV0CityZXNvbHV0aW9uIG9uZSBjYW4gc3BlY2lmeSB0aGUgcG9zaXRpb24gb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciB3aGVyZSB0aGlzCitpbWFnZSBzaG91bGQgYmUgcGxhY2VkIHdpdGggdGhlIHBhZCBwcm9wZXJ0aWVzIHhwb3MgYW5kIHlwb3MuCitUaGUgb3ZlcmFsbCBhbHBoYSB2YWx1ZSBvZiBhIHN0cmVhbSBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgd2l0aCBhIHBhZAorcHJvcGVydHkuCitCeSBkZWZhdWx0LCB0aGUgc3RyZWFtcyBhcmUgYmxlbmRlZCBpbiB0aGUgb3JkZXIgdGhhdCB0aGUgcGFkcyB3ZXJlIAorcmVxdWVzdGVkIGZyb20gdGhlIGVsZW1lbnQuIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgY2hhbmdpbmcgdGhlIAorem9yZGVyIHBhZCBwcm9wZXJ0eSBvZiB0aGUgc3RyZWFtLCBhIHN0cmVhbSB3aXRoIGxvd2VyIHpvcmRlciBnZXRzCitkcmF3biBmaXJzdC4KKworCitUT0RPCistLS0tCisKKy0gcmVhbGx5IGltcGxlbWVudCB6b3JkZXIKKy0gdGFrZSBJNDIwIHl1diBhcyB3ZWxsCistIG91dHB1dCBBWVVWIGlmIHBvc3NpYmxlLgorLSBpbXBsZW1lbnQgZGlmZmVyZW50IGJsZW5kIG1vZGVzLCBzb21lIGNvZGUgaXMgYWxyZWFkeSBkb25lCistIHVzZSBmaWx0ZXIgY2FwcyBvbiBzcmNwYWQgdG8gZGVjaWRlIG9uIHRoZSBmaW5hbCBvdXRwdXQgc2l6ZQpkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYyBiL2dzdC92aWRlb21peGVyL2JsZW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzZjkyNQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb21peGVyL2JsZW5kLmMKQEAgLTAsMCArMSwxMDYxIEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwNCBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pbmRmcnVpdCBCdi4KKyAqICAgQXV0aG9yOiBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisgKiAgIEF1dGhvcjogQWxleCBVZ2FydGUgPGFsZXh1Z2FydGVAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFsZXggVWdhcnRlIDxhdWdhcnRlQHZpY29tdGVjaC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiYmxlbmQuaCIKKyNpbmNsdWRlICJ2aWRlb21peGVyb3JjLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjZGVmaW5lIEJMRU5EKEQsUyxhbHBoYSkgKCgoRCkgKiAoMjU2IC0gKGFscGhhKSkgKyAoUykgKiAoYWxwaGEpKSA+PiA4KQorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfdmlkZW9taXhlcl9ibGVuZF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfdmlkZW9taXhlcl9ibGVuZF9kZWJ1ZworCisvKiBCZWxvdyBhcmUgdGhlIGltcGxlbWVudGF0aW9ucyBvZiBldmVyeXRoaW5nICovCisKKy8qIEEzMiBpcyBmb3IgQVlVViwgQVJHQiBhbmQgQkdSQSAqLworI2RlZmluZSBCTEVORF9BMzIobmFtZSwgbWV0aG9kLCBMT09QKQkJXAorc3RhdGljIHZvaWQgXAorbWV0aG9kIyNfICMjbmFtZSAoR3N0VmlkZW9GcmFtZSAqIHNyY2ZyYW1lLCBnaW50IHhwb3MsIGdpbnQgeXBvcywgXAorICAgIGdkb3VibGUgc3JjX2FscGhhLCBHc3RWaWRlb0ZyYW1lICogZGVzdGZyYW1lKSBcCit7IFwKKyAgZ3VpbnQgc19hbHBoYTsgXAorICBnaW50IHNyY19zdHJpZGUsIGRlc3Rfc3RyaWRlOyBcCisgIGdpbnQgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQ7IFwKKyAgZ3VpbnQ4ICpzcmMsICpkZXN0OyBcCisgIGdpbnQgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0OyBcCisgIFwKKyAgc3JjX3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChzcmNmcmFtZSk7IFwKKyAgc3JjX2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKHNyY2ZyYW1lKTsgXAorICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjZnJhbWUsIDApOyBcCisgIHNyY19zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKHNyY2ZyYW1lLCAwKTsgXAorICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3RmcmFtZSwgMCk7IFwKKyAgZGVzdF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGRlc3RmcmFtZSwgMCk7IFwKKyAgZGVzdF93aWR0aCA9IEdTVF9WSURFT19GUkFNRV9DT01QX1dJRFRIIChkZXN0ZnJhbWUsIDApOyBcCisgIGRlc3RfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChkZXN0ZnJhbWUsIDApOyBcCisgIFwKKyAgc19hbHBoYSA9IENMQU1QICgoZ2ludCkgKHNyY19hbHBoYSAqIDI1NiksIDAsIDI1Nik7IFwKKyAgXAorICAvKiBJZiBpdCdzIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQuLi4gd2UganVzdCByZXR1cm4gKi8gXAorICBpZiAoR19VTkxJS0VMWSAoc19hbHBoYSA9PSAwKSkgXAorICAgIHJldHVybjsgXAorICBcCisgIC8qIGFkanVzdCBzcmMgcG9pbnRlcnMgZm9yIG5lZ2F0aXZlIHNpemVzICovIFwKKyAgaWYgKHhwb3MgPCAwKSB7IFwKKyAgICBzcmMgKz0gLXhwb3MgKiA0OyBcCisgICAgc3JjX3dpZHRoIC09IC14cG9zOyBcCisgICAgeHBvcyA9IDA7IFwKKyAgfSBcCisgIGlmICh5cG9zIDwgMCkgeyBcCisgICAgc3JjICs9IC15cG9zICogc3JjX3N0cmlkZTsgXAorICAgIHNyY19oZWlnaHQgLT0gLXlwb3M7IFwKKyAgICB5cG9zID0gMDsgXAorICB9IFwKKyAgLyogYWRqdXN0IHdpZHRoL2hlaWdodCBpZiB0aGUgc3JjIGlzIGJpZ2dlciB0aGFuIGRlc3QgKi8gXAorICBpZiAoeHBvcyArIHNyY193aWR0aCA+IGRlc3Rfd2lkdGgpIHsgXAorICAgIHNyY193aWR0aCA9IGRlc3Rfd2lkdGggLSB4cG9zOyBcCisgIH0gXAorICBpZiAoeXBvcyArIHNyY19oZWlnaHQgPiBkZXN0X2hlaWdodCkgeyBcCisgICAgc3JjX2hlaWdodCA9IGRlc3RfaGVpZ2h0IC0geXBvczsgXAorICB9IFwKKyAgXAorICBpZiAoc3JjX2hlaWdodCA+IDAgJiYgc3JjX3dpZHRoID4gMCkgeyBcCisgICAgZGVzdCA9IGRlc3QgKyA0ICogeHBvcyArICh5cG9zICogZGVzdF9zdHJpZGUpOyBcCisgIFwKKyAgICBMT09QIChkZXN0LCBzcmMsIHNyY19oZWlnaHQsIHNyY193aWR0aCwgc3JjX3N0cmlkZSwgZGVzdF9zdHJpZGUsIHNfYWxwaGEpOyBcCisgIH0gXAorfQorCisjZGVmaW5lIEJMRU5EX0EzMl9MT09QKG5hbWUsIG1ldGhvZCkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgXAorXyMjbWV0aG9kIyNfbG9vcF8jI25hbWUgKGd1aW50OCAqIGRlc3QsIGNvbnN0IGd1aW50OCAqIHNyYywgZ2ludCBzcmNfaGVpZ2h0LCBcCisgICAgZ2ludCBzcmNfd2lkdGgsIGdpbnQgc3JjX3N0cmlkZSwgZ2ludCBkZXN0X3N0cmlkZSwgZ3VpbnQgc19hbHBoYSkgXAoreyBcCisgIHNfYWxwaGEgPSBNSU4gKDI1NSwgc19hbHBoYSk7IFwKKyAgdmlkZW9fbWl4ZXJfb3JjXyMjbWV0aG9kIyNfIyNuYW1lIChkZXN0LCBkZXN0X3N0cmlkZSwgc3JjLCBzcmNfc3RyaWRlLCBcCisgICAgICBzX2FscGhhLCBzcmNfd2lkdGgsIHNyY19oZWlnaHQpOyBcCit9CisKK0JMRU5EX0EzMl9MT09QIChhcmdiLCBibGVuZCk7CitCTEVORF9BMzJfTE9PUCAoYmdyYSwgYmxlbmQpOworQkxFTkRfQTMyX0xPT1AgKGFyZ2IsIG92ZXJsYXkpOworQkxFTkRfQTMyX0xPT1AgKGJncmEsIG92ZXJsYXkpOworCisjaWYgR19CWVRFX09SREVSID09IEdfTElUVExFX0VORElBTgorQkxFTkRfQTMyIChhcmdiLCBibGVuZCwgX2JsZW5kX2xvb3BfYXJnYik7CitCTEVORF9BMzIgKGJncmEsIGJsZW5kLCBfYmxlbmRfbG9vcF9iZ3JhKTsKK0JMRU5EX0EzMiAoYXJnYiwgb3ZlcmxheSwgX292ZXJsYXlfbG9vcF9hcmdiKTsKK0JMRU5EX0EzMiAoYmdyYSwgb3ZlcmxheSwgX292ZXJsYXlfbG9vcF9iZ3JhKTsKKyNlbHNlCitCTEVORF9BMzIgKGFyZ2IsIGJsZW5kLCBfYmxlbmRfbG9vcF9iZ3JhKTsKK0JMRU5EX0EzMiAoYmdyYSwgYmxlbmQsIF9ibGVuZF9sb29wX2FyZ2IpOworQkxFTkRfQTMyIChhcmdiLCBvdmVybGF5LCBfb3ZlcmxheV9sb29wX2JncmEpOworQkxFTkRfQTMyIChiZ3JhLCBvdmVybGF5LCBfb3ZlcmxheV9sb29wX2FyZ2IpOworI2VuZGlmCisKKyNkZWZpbmUgQTMyX0NIRUNLRVJfQyhuYW1lLCBSR0IsIEEsIEMxLCBDMiwgQzMpIFwKK3N0YXRpYyB2b2lkIFwKK2ZpbGxfY2hlY2tlcl8jI25hbWUjI19jIChHc3RWaWRlb0ZyYW1lICogZnJhbWUpIFwKK3sgXAorICBnaW50IGksIGo7IFwKKyAgZ2ludCB2YWw7IFwKKyAgc3RhdGljIGNvbnN0IGdpbnQgdGFiW10gPSB7IDgwLCAxNjAsIDgwLCAxNjAgfTsgXAorICBnaW50IHdpZHRoLCBoZWlnaHQ7IFwKKyAgZ3VpbnQ4ICpkZXN0OyBcCisgIFwKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7IFwKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZnJhbWUsIDApOyBcCisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZnJhbWUsIDApOyBcCisgIFwKKyAgaWYgKCFSR0IpIHsgXAorICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeyBcCisgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeyBcCisgICAgICAgIGRlc3RbQV0gPSAweGZmOyBcCisgICAgICAgIGRlc3RbQzFdID0gdGFiWygoaSAmIDB4OCkgPj4gMykgKyAoKGogJiAweDgpID4+IDMpXTsgXAorICAgICAgICBkZXN0W0MyXSA9IDEyODsgXAorICAgICAgICBkZXN0W0MzXSA9IDEyODsgXAorICAgICAgICBkZXN0ICs9IDQ7IFwKKyAgICAgIH0gXAorICAgIH0gXAorICB9IGVsc2UgeyBcCisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7IFwKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7IFwKKyAgICAgICAgdmFsID0gdGFiWygoaSAmIDB4OCkgPj4gMykgKyAoKGogJiAweDgpID4+IDMpXTsgXAorICAgICAgICBkZXN0W0FdID0gMHhGRjsgXAorICAgICAgICBkZXN0W0MxXSA9IHZhbDsgXAorICAgICAgICBkZXN0W0MyXSA9IHZhbDsgXAorICAgICAgICBkZXN0W0MzXSA9IHZhbDsgXAorICAgICAgICBkZXN0ICs9IDQ7IFwKKyAgICAgIH0gXAorICAgIH0gXAorICB9IFwKK30KKworQTMyX0NIRUNLRVJfQyAoYXJnYiwgVFJVRSwgMCwgMSwgMiwgMyk7CitBMzJfQ0hFQ0tFUl9DIChiZ3JhLCBUUlVFLCAzLCAyLCAxLCAwKTsKK0EzMl9DSEVDS0VSX0MgKGF5dXYsIEZBTFNFLCAwLCAxLCAyLCAzKTsKKworI2RlZmluZSBZVVZfVE9fUihZLFUsVikgKENMQU1QICgxLjE2NCAqIChZIC0gMTYpICsgMS41OTYgKiAoViAtIDEyOCksIDAsIDI1NSkpCisjZGVmaW5lIFlVVl9UT19HKFksVSxWKSAoQ0xBTVAgKDEuMTY0ICogKFkgLSAxNikgLSAwLjgxMyAqIChWIC0gMTI4KSAtIDAuMzkxICogKFUgLSAxMjgpLCAwLCAyNTUpKQorI2RlZmluZSBZVVZfVE9fQihZLFUsVikgKENMQU1QICgxLjE2NCAqIChZIC0gMTYpICsgMi4wMTggKiAoVSAtIDEyOCksIDAsIDI1NSkpCisKKyNkZWZpbmUgQTMyX0NPTE9SKG5hbWUsIFJHQiwgQSwgQzEsIEMyLCBDMykgXAorc3RhdGljIHZvaWQgXAorZmlsbF9jb2xvcl8jI25hbWUgKEdzdFZpZGVvRnJhbWUgKiBmcmFtZSwgZ2ludCBZLCBnaW50IFUsIGdpbnQgVikgXAoreyBcCisgIGdpbnQgYzEsIGMyLCBjMzsgXAorICBndWludDMyIHZhbDsgXAorICBnaW50IHdpZHRoLCBoZWlnaHQ7IFwKKyAgZ3VpbnQ4ICpkZXN0OyBcCisgIFwKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7IFwKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZnJhbWUsIDApOyBcCisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZnJhbWUsIDApOyBcCisgIFwKKyAgaWYgKFJHQikgeyBcCisgICAgYzEgPSBZVVZfVE9fUiAoWSwgVSwgVik7IFwKKyAgICBjMiA9IFlVVl9UT19HIChZLCBVLCBWKTsgXAorICAgIGMzID0gWVVWX1RPX0IgKFksIFUsIFYpOyBcCisgIH0gZWxzZSB7IFwKKyAgICBjMSA9IFk7IFwKKyAgICBjMiA9IFU7IFwKKyAgICBjMyA9IFY7IFwKKyAgfSBcCisgIHZhbCA9IEdVSU5UMzJfRlJPTV9CRSAoKDB4ZmYgPDwgQSkgfCAoYzEgPDwgQzEpIHwgKGMyIDw8IEMyKSB8IChjMyA8PCBDMykpOyBcCisgIFwKKyAgdmlkZW9fbWl4ZXJfb3JjX3NwbGF0X3UzMiAoKGd1aW50MzIgKikgZGVzdCwgdmFsLCBoZWlnaHQgKiB3aWR0aCk7IFwKK30KKworQTMyX0NPTE9SIChhcmdiLCBUUlVFLCAyNCwgMTYsIDgsIDApOworQTMyX0NPTE9SIChiZ3JhLCBUUlVFLCAwLCA4LCAxNiwgMjQpOworQTMyX0NPTE9SIChhYmdyLCBUUlVFLCAyNCwgMCwgOCwgMTYpOworQTMyX0NPTE9SIChyZ2JhLCBUUlVFLCAwLCAyNCwgMTYsIDgpOworQTMyX0NPTE9SIChheXV2LCBGQUxTRSwgMjQsIDE2LCA4LCAwKTsKKworLyogWTQ0NCwgWTQyQiwgSTQyMCwgWVYxMiwgWTQxQiAqLworI2RlZmluZSBQTEFOQVJfWVVWX0JMRU5EKGZvcm1hdF9uYW1lLGZvcm1hdF9lbnVtLHhfcm91bmQseV9yb3VuZCxNRU1DUFksQkxFTkRMT09QKSBcCitpbmxpbmUgc3RhdGljIHZvaWQgXAorX2JsZW5kXyMjZm9ybWF0X25hbWUgKGNvbnN0IGd1aW50OCAqIHNyYywgZ3VpbnQ4ICogZGVzdCwgXAorICAgIGdpbnQgc3JjX3N0cmlkZSwgZ2ludCBkZXN0X3N0cmlkZSwgZ2ludCBzcmNfd2lkdGgsIGdpbnQgc3JjX2hlaWdodCwgXAorICAgIGdkb3VibGUgc3JjX2FscGhhKSBcCit7IFwKKyAgZ2ludCBpOyBcCisgIGdpbnQgYl9hbHBoYTsgXAorICBcCisgIC8qIElmIGl0J3MgY29tcGxldGVseSB0cmFuc3BhcmVudC4uLiB3ZSBqdXN0IHJldHVybiAqLyBcCisgIGlmIChHX1VOTElLRUxZIChzcmNfYWxwaGEgPT0gMC4wKSkgeyBcCisgICAgR1NUX0lORk8gKCJGYXN0IGNvcHkgKGFscGhhID09IDAuMCkiKTsgXAorICAgIHJldHVybjsgXAorICB9IFwKKyAgXAorICAvKiBJZiBpdCdzIGNvbXBsZXRlbHkgb3BhcXVlLCB3ZSBkbyBhIGZhc3QgY29weSAqLyBcCisgIGlmIChHX1VOTElLRUxZIChzcmNfYWxwaGEgPT0gMS4wKSkgeyBcCisgICAgR1NUX0lORk8gKCJGYXN0IGNvcHkgKGFscGhhID09IDEuMCkiKTsgXAorICAgIGZvciAoaSA9IDA7IGkgPCBzcmNfaGVpZ2h0OyBpKyspIHsgXAorICAgICAgTUVNQ1BZIChkZXN0LCBzcmMsIHNyY193aWR0aCk7IFwKKyAgICAgIHNyYyArPSBzcmNfc3RyaWRlOyBcCisgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOyBcCisgICAgfSBcCisgICAgcmV0dXJuOyBcCisgIH0gXAorICBcCisgIGJfYWxwaGEgPSBDTEFNUCAoKGdpbnQpIChzcmNfYWxwaGEgKiAyNTYpLCAwLCAyNTYpOyBcCisgIFwKKyAgQkxFTkRMT09QKGRlc3QsIGRlc3Rfc3RyaWRlLCBzcmMsIHNyY19zdHJpZGUsIGJfYWxwaGEsIHNyY193aWR0aCwgc3JjX2hlaWdodCk7IFwKK30gXAorXAorc3RhdGljIHZvaWQgXAorYmxlbmRfIyNmb3JtYXRfbmFtZSAoR3N0VmlkZW9GcmFtZSAqIHNyY2ZyYW1lLCBnaW50IHhwb3MsIGdpbnQgeXBvcywgXAorICAgIGdkb3VibGUgc3JjX2FscGhhLCBHc3RWaWRlb0ZyYW1lICogZGVzdGZyYW1lKSBcCit7IFwKKyAgY29uc3QgZ3VpbnQ4ICpiX3NyYzsgXAorICBndWludDggKmJfZGVzdDsgXAorICBnaW50IGJfc3JjX3dpZHRoOyBcCisgIGdpbnQgYl9zcmNfaGVpZ2h0OyBcCisgIGdpbnQgeG9mZnNldCA9IDA7IFwKKyAgZ2ludCB5b2Zmc2V0ID0gMDsgXAorICBnaW50IHNyY19jb21wX3Jvd3N0cmlkZSwgZGVzdF9jb21wX3Jvd3N0cmlkZTsgXAorICBnaW50IHNyY19jb21wX2hlaWdodDsgXAorICBnaW50IHNyY19jb21wX3dpZHRoOyBcCisgIGdpbnQgY29tcF95cG9zLCBjb21wX3hwb3M7IFwKKyAgZ2ludCBjb21wX3lvZmZzZXQsIGNvbXBfeG9mZnNldDsgXAorICBnaW50IGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0OyBcCisgIGNvbnN0IEdzdFZpZGVvRm9ybWF0SW5mbyAqaW5mbzsgXAorICBnaW50IHNyY193aWR0aCwgc3JjX2hlaWdodDsgXAorICBcCisgIHNyY193aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoc3JjZnJhbWUpOyBcCisgIHNyY19oZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChzcmNmcmFtZSk7IFwKKyAgXAorICBpbmZvID0gc3JjZnJhbWUtPmluZm8uZmluZm87IFwKKyAgZGVzdF93aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoZGVzdGZyYW1lKTsgXAorICBkZXN0X2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGRlc3RmcmFtZSk7IFwKKyAgXAorICB4cG9zID0geF9yb3VuZCAoeHBvcyk7IFwKKyAgeXBvcyA9IHlfcm91bmQgKHlwb3MpOyBcCisgIFwKKyAgYl9zcmNfd2lkdGggPSBzcmNfd2lkdGg7IFwKKyAgYl9zcmNfaGVpZ2h0ID0gc3JjX2hlaWdodDsgXAorICBcCisgIC8qIGFkanVzdCBzcmMgcG9pbnRlcnMgZm9yIG5lZ2F0aXZlIHNpemVzICovIFwKKyAgaWYgKHhwb3MgPCAwKSB7IFwKKyAgICB4b2Zmc2V0ID0gLXhwb3M7IFwKKyAgICBiX3NyY193aWR0aCAtPSAteHBvczsgXAorICAgIHhwb3MgPSAwOyBcCisgIH0gXAorICBpZiAoeXBvcyA8IDApIHsgXAorICAgIHlvZmZzZXQgPSAteXBvczsgXAorICAgIGJfc3JjX2hlaWdodCAtPSAteXBvczsgXAorICAgIHlwb3MgPSAwOyBcCisgIH0gXAorICAvKiBJZiB4IG9yIHkgb2Zmc2V0IGFyZSBsYXJnZXIgdGhlbiB0aGUgc291cmNlIGl0J3Mgb3V0c2lkZSBvZiB0aGUgcGljdHVyZSAqLyBcCisgIGlmICh4b2Zmc2V0ID49IHNyY193aWR0aCB8fCB5b2Zmc2V0ID49IHNyY19oZWlnaHQpIHsgXAorICAgIHJldHVybjsgXAorICB9IFwKKyAgXAorICAvKiBhZGp1c3Qgd2lkdGgvaGVpZ2h0IGlmIHRoZSBzcmMgaXMgYmlnZ2VyIHRoYW4gZGVzdCAqLyBcCisgIGlmICh4cG9zICsgYl9zcmNfd2lkdGggPiBkZXN0X3dpZHRoKSB7IFwKKyAgICBiX3NyY193aWR0aCA9IGRlc3Rfd2lkdGggLSB4cG9zOyBcCisgIH0gXAorICBpZiAoeXBvcyArIGJfc3JjX2hlaWdodCA+IGRlc3RfaGVpZ2h0KSB7IFwKKyAgICBiX3NyY19oZWlnaHQgPSBkZXN0X2hlaWdodCAtIHlwb3M7IFwKKyAgfSBcCisgIGlmIChiX3NyY193aWR0aCA8PSAwIHx8IGJfc3JjX2hlaWdodCA8PSAwKSB7IFwKKyAgICByZXR1cm47IFwKKyAgfSBcCisgIFwKKyAgLyogRmlyc3QgbWl4IFksIHRoZW4gVSwgdGhlbiBWICovIFwKKyAgYl9zcmMgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChzcmNmcmFtZSwgMCk7IFwKKyAgYl9kZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdGZyYW1lLCAwKTsgXAorICBzcmNfY29tcF9yb3dzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKHNyY2ZyYW1lLCAwKTsgXAorICBkZXN0X2NvbXBfcm93c3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChkZXN0ZnJhbWUsIDApOyBcCisgIHNyY19jb21wX3dpZHRoID0gR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX1dJRFRIKGluZm8sIDAsIGJfc3JjX3dpZHRoKTsgXAorICBzcmNfY29tcF9oZWlnaHQgPSBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfSEVJR0hUKGluZm8sIDAsIGJfc3JjX2hlaWdodCk7IFwKKyAgY29tcF94cG9zID0gKHhwb3MgPT0gMCkgPyAwIDogR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX1dJRFRIIChpbmZvLCAwLCB4cG9zKTsgXAorICBjb21wX3lwb3MgPSAoeXBvcyA9PSAwKSA/IDAgOiBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfSEVJR0hUIChpbmZvLCAwLCB5cG9zKTsgXAorICBjb21wX3hvZmZzZXQgPSAoeG9mZnNldCA9PSAwKSA/IDAgOiBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfV0lEVEggKGluZm8sIDAsIHhvZmZzZXQpOyBcCisgIGNvbXBfeW9mZnNldCA9ICh5b2Zmc2V0ID09IDApID8gMCA6IEdTVF9WSURFT19GT1JNQVRfSU5GT19TQ0FMRV9IRUlHSFQgKGluZm8sIDAsIHlvZmZzZXQpOyBcCisgIF9ibGVuZF8jI2Zvcm1hdF9uYW1lIChiX3NyYyArIGNvbXBfeG9mZnNldCArIGNvbXBfeW9mZnNldCAqIHNyY19jb21wX3Jvd3N0cmlkZSwgXAorICAgICAgYl9kZXN0ICsgY29tcF94cG9zICsgY29tcF95cG9zICogZGVzdF9jb21wX3Jvd3N0cmlkZSwgXAorICAgICAgc3JjX2NvbXBfcm93c3RyaWRlLCBcCisgICAgICBkZXN0X2NvbXBfcm93c3RyaWRlLCBzcmNfY29tcF93aWR0aCwgc3JjX2NvbXBfaGVpZ2h0LCBcCisgICAgICBzcmNfYWxwaGEpOyBcCisgIFwKKyAgYl9zcmMgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChzcmNmcmFtZSwgMSk7IFwKKyAgYl9kZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdGZyYW1lLCAxKTsgXAorICBzcmNfY29tcF9yb3dzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKHNyY2ZyYW1lLCAxKTsgXAorICBkZXN0X2NvbXBfcm93c3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChkZXN0ZnJhbWUsIDEpOyBcCisgIHNyY19jb21wX3dpZHRoID0gR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX1dJRFRIKGluZm8sIDEsIGJfc3JjX3dpZHRoKTsgXAorICBzcmNfY29tcF9oZWlnaHQgPSBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfSEVJR0hUKGluZm8sIDEsIGJfc3JjX2hlaWdodCk7IFwKKyAgY29tcF94cG9zID0gKHhwb3MgPT0gMCkgPyAwIDogR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX1dJRFRIIChpbmZvLCAxLCB4cG9zKTsgXAorICBjb21wX3lwb3MgPSAoeXBvcyA9PSAwKSA/IDAgOiBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfSEVJR0hUIChpbmZvLCAxLCB5cG9zKTsgXAorICBjb21wX3hvZmZzZXQgPSAoeG9mZnNldCA9PSAwKSA/IDAgOiBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfV0lEVEggKGluZm8sIDEsIHhvZmZzZXQpOyBcCisgIGNvbXBfeW9mZnNldCA9ICh5b2Zmc2V0ID09IDApID8gMCA6IEdTVF9WSURFT19GT1JNQVRfSU5GT19TQ0FMRV9IRUlHSFQgKGluZm8sIDEsIHlvZmZzZXQpOyBcCisgIF9ibGVuZF8jI2Zvcm1hdF9uYW1lIChiX3NyYyArIGNvbXBfeG9mZnNldCArIGNvbXBfeW9mZnNldCAqIHNyY19jb21wX3Jvd3N0cmlkZSwgXAorICAgICAgYl9kZXN0ICsgY29tcF94cG9zICsgY29tcF95cG9zICogZGVzdF9jb21wX3Jvd3N0cmlkZSwgXAorICAgICAgc3JjX2NvbXBfcm93c3RyaWRlLCBcCisgICAgICBkZXN0X2NvbXBfcm93c3RyaWRlLCBzcmNfY29tcF93aWR0aCwgc3JjX2NvbXBfaGVpZ2h0LCBcCisgICAgICBzcmNfYWxwaGEpOyBcCisgIFwKKyAgYl9zcmMgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChzcmNmcmFtZSwgMik7IFwKKyAgYl9kZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdGZyYW1lLCAyKTsgXAorICBzcmNfY29tcF9yb3dzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKHNyY2ZyYW1lLCAyKTsgXAorICBkZXN0X2NvbXBfcm93c3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChkZXN0ZnJhbWUsIDIpOyBcCisgIHNyY19jb21wX3dpZHRoID0gR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX1dJRFRIKGluZm8sIDIsIGJfc3JjX3dpZHRoKTsgXAorICBzcmNfY29tcF9oZWlnaHQgPSBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfSEVJR0hUKGluZm8sIDIsIGJfc3JjX2hlaWdodCk7IFwKKyAgY29tcF94cG9zID0gKHhwb3MgPT0gMCkgPyAwIDogR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX1dJRFRIIChpbmZvLCAyLCB4cG9zKTsgXAorICBjb21wX3lwb3MgPSAoeXBvcyA9PSAwKSA/IDAgOiBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfSEVJR0hUIChpbmZvLCAyLCB5cG9zKTsgXAorICBjb21wX3hvZmZzZXQgPSAoeG9mZnNldCA9PSAwKSA/IDAgOiBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfV0lEVEggKGluZm8sIDIsIHhvZmZzZXQpOyBcCisgIGNvbXBfeW9mZnNldCA9ICh5b2Zmc2V0ID09IDApID8gMCA6IEdTVF9WSURFT19GT1JNQVRfSU5GT19TQ0FMRV9IRUlHSFQgKGluZm8sIDIsIHlvZmZzZXQpOyBcCisgIF9ibGVuZF8jI2Zvcm1hdF9uYW1lIChiX3NyYyArIGNvbXBfeG9mZnNldCArIGNvbXBfeW9mZnNldCAqIHNyY19jb21wX3Jvd3N0cmlkZSwgXAorICAgICAgYl9kZXN0ICsgY29tcF94cG9zICsgY29tcF95cG9zICogZGVzdF9jb21wX3Jvd3N0cmlkZSwgXAorICAgICAgc3JjX2NvbXBfcm93c3RyaWRlLCBcCisgICAgICBkZXN0X2NvbXBfcm93c3RyaWRlLCBzcmNfY29tcF93aWR0aCwgc3JjX2NvbXBfaGVpZ2h0LCBcCisgICAgICBzcmNfYWxwaGEpOyBcCit9CisKKyNkZWZpbmUgUExBTkFSX1lVVl9GSUxMX0NIRUNLRVIoZm9ybWF0X25hbWUsIGZvcm1hdF9lbnVtLCBNRU1TRVQpIFwKK3N0YXRpYyB2b2lkIFwKK2ZpbGxfY2hlY2tlcl8jI2Zvcm1hdF9uYW1lIChHc3RWaWRlb0ZyYW1lICogZnJhbWUpIFwKK3sgXAorICBnaW50IGksIGo7IFwKKyAgc3RhdGljIGNvbnN0IGludCB0YWJbXSA9IHsgODAsIDE2MCwgODAsIDE2MCB9OyBcCisgIGd1aW50OCAqcDsgXAorICBnaW50IGNvbXBfd2lkdGgsIGNvbXBfaGVpZ2h0OyBcCisgIGdpbnQgcm93c3RyaWRlOyBcCisgIFwKKyAgcCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lLCAwKTsgXAorICBjb21wX3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGZyYW1lLCAwKTsgXAorICBjb21wX2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZnJhbWUsIDApOyBcCisgIHJvd3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUsIDApOyBcCisgIFwKKyAgZm9yIChpID0gMDsgaSA8IGNvbXBfaGVpZ2h0OyBpKyspIHsgXAorICAgIGZvciAoaiA9IDA7IGogPCBjb21wX3dpZHRoOyBqKyspIHsgXAorICAgICAgKnArKyA9IHRhYlsoKGkgJiAweDgpID4+IDMpICsgKChqICYgMHg4KSA+PiAzKV07IFwKKyAgICB9IFwKKyAgICBwICs9IHJvd3N0cmlkZSAtIGNvbXBfd2lkdGg7IFwKKyAgfSBcCisgIFwKKyAgcCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lLCAxKTsgXAorICBjb21wX3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGZyYW1lLCAxKTsgXAorICBjb21wX2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZnJhbWUsIDEpOyBcCisgIHJvd3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUsIDEpOyBcCisgIFwKKyAgZm9yIChpID0gMDsgaSA8IGNvbXBfaGVpZ2h0OyBpKyspIHsgXAorICAgIE1FTVNFVCAocCwgMHg4MCwgY29tcF93aWR0aCk7IFwKKyAgICBwICs9IHJvd3N0cmlkZTsgXAorICB9IFwKKyAgXAorICBwID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZnJhbWUsIDIpOyBcCisgIGNvbXBfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZnJhbWUsIDIpOyBcCisgIGNvbXBfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChmcmFtZSwgMik7IFwKKyAgcm93c3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChmcmFtZSwgMik7IFwKKyAgXAorICBmb3IgKGkgPSAwOyBpIDwgY29tcF9oZWlnaHQ7IGkrKykgeyBcCisgICAgTUVNU0VUIChwLCAweDgwLCBjb21wX3dpZHRoKTsgXAorICAgIHAgKz0gcm93c3RyaWRlOyBcCisgIH0gXAorfQorCisjZGVmaW5lIFBMQU5BUl9ZVVZfRklMTF9DT0xPUihmb3JtYXRfbmFtZSxmb3JtYXRfZW51bSxNRU1TRVQpIFwKK3N0YXRpYyB2b2lkIFwKK2ZpbGxfY29sb3JfIyNmb3JtYXRfbmFtZSAoR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBcCisgICAgZ2ludCBjb2xZLCBnaW50IGNvbFUsIGdpbnQgY29sVikgXAoreyBcCisgIGd1aW50OCAqcDsgXAorICBnaW50IGNvbXBfd2lkdGgsIGNvbXBfaGVpZ2h0OyBcCisgIGdpbnQgcm93c3RyaWRlOyBcCisgIGdpbnQgaTsgXAorICBcCisgIHAgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZSwgMCk7IFwKKyAgY29tcF93aWR0aCA9IEdTVF9WSURFT19GUkFNRV9DT01QX1dJRFRIIChmcmFtZSwgMCk7IFwKKyAgY29tcF9oZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9IRUlHSFQgKGZyYW1lLCAwKTsgXAorICByb3dzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAwKTsgXAorICBcCisgIGZvciAoaSA9IDA7IGkgPCBjb21wX2hlaWdodDsgaSsrKSB7IFwKKyAgICBNRU1TRVQgKHAsIGNvbFksIGNvbXBfd2lkdGgpOyBcCisgICAgcCArPSByb3dzdHJpZGU7IFwKKyAgfSBcCisgIFwKKyAgcCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lLCAxKTsgXAorICBjb21wX3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGZyYW1lLCAxKTsgXAorICBjb21wX2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZnJhbWUsIDEpOyBcCisgIHJvd3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUsIDEpOyBcCisgIFwKKyAgZm9yIChpID0gMDsgaSA8IGNvbXBfaGVpZ2h0OyBpKyspIHsgXAorICAgIE1FTVNFVCAocCwgY29sVSwgY29tcF93aWR0aCk7IFwKKyAgICBwICs9IHJvd3N0cmlkZTsgXAorICB9IFwKKyAgXAorICBwID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZnJhbWUsIDIpOyBcCisgIGNvbXBfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZnJhbWUsIDIpOyBcCisgIGNvbXBfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChmcmFtZSwgMik7IFwKKyAgcm93c3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChmcmFtZSwgMik7IFwKKyAgXAorICBmb3IgKGkgPSAwOyBpIDwgY29tcF9oZWlnaHQ7IGkrKykgeyBcCisgICAgTUVNU0VUIChwLCBjb2xWLCBjb21wX3dpZHRoKTsgXAorICAgIHAgKz0gcm93c3RyaWRlOyBcCisgIH0gXAorfQorCisjZGVmaW5lIEdTVF9ST1VORF9VUF8xKHgpICh4KQorCitQTEFOQVJfWVVWX0JMRU5EIChpNDIwLCBHU1RfVklERU9fRk9STUFUX0k0MjAsIEdTVF9ST1VORF9VUF8yLAorICAgIEdTVF9ST1VORF9VUF8yLCBtZW1jcHksIHZpZGVvX21peGVyX29yY19ibGVuZF91OCk7CitQTEFOQVJfWVVWX0ZJTExfQ0hFQ0tFUiAoaTQyMCwgR1NUX1ZJREVPX0ZPUk1BVF9JNDIwLCBtZW1zZXQpOworUExBTkFSX1lVVl9GSUxMX0NPTE9SIChpNDIwLCBHU1RfVklERU9fRk9STUFUX0k0MjAsIG1lbXNldCk7CitQTEFOQVJfWVVWX0ZJTExfQ09MT1IgKHl2MTIsIEdTVF9WSURFT19GT1JNQVRfWVYxMiwgbWVtc2V0KTsKK1BMQU5BUl9ZVVZfQkxFTkQgKHk0NDQsIEdTVF9WSURFT19GT1JNQVRfWTQ0NCwgR1NUX1JPVU5EX1VQXzEsCisgICAgR1NUX1JPVU5EX1VQXzEsIG1lbWNweSwgdmlkZW9fbWl4ZXJfb3JjX2JsZW5kX3U4KTsKK1BMQU5BUl9ZVVZfRklMTF9DSEVDS0VSICh5NDQ0LCBHU1RfVklERU9fRk9STUFUX1k0NDQsIG1lbXNldCk7CitQTEFOQVJfWVVWX0ZJTExfQ09MT1IgKHk0NDQsIEdTVF9WSURFT19GT1JNQVRfWTQ0NCwgbWVtc2V0KTsKK1BMQU5BUl9ZVVZfQkxFTkQgKHk0MmIsIEdTVF9WSURFT19GT1JNQVRfWTQyQiwgR1NUX1JPVU5EX1VQXzIsCisgICAgR1NUX1JPVU5EX1VQXzEsIG1lbWNweSwgdmlkZW9fbWl4ZXJfb3JjX2JsZW5kX3U4KTsKK1BMQU5BUl9ZVVZfRklMTF9DSEVDS0VSICh5NDJiLCBHU1RfVklERU9fRk9STUFUX1k0MkIsIG1lbXNldCk7CitQTEFOQVJfWVVWX0ZJTExfQ09MT1IgKHk0MmIsIEdTVF9WSURFT19GT1JNQVRfWTQyQiwgbWVtc2V0KTsKK1BMQU5BUl9ZVVZfQkxFTkQgKHk0MWIsIEdTVF9WSURFT19GT1JNQVRfWTQxQiwgR1NUX1JPVU5EX1VQXzQsCisgICAgR1NUX1JPVU5EX1VQXzEsIG1lbWNweSwgdmlkZW9fbWl4ZXJfb3JjX2JsZW5kX3U4KTsKK1BMQU5BUl9ZVVZfRklMTF9DSEVDS0VSICh5NDFiLCBHU1RfVklERU9fRk9STUFUX1k0MUIsIG1lbXNldCk7CitQTEFOQVJfWVVWX0ZJTExfQ09MT1IgKHk0MWIsIEdTVF9WSURFT19GT1JNQVRfWTQxQiwgbWVtc2V0KTsKKworLyogTlYxMiwgTlYyMSAqLworI2RlZmluZSBOVl9ZVVZfQkxFTkQoZm9ybWF0X25hbWUsTUVNQ1BZLEJMRU5ETE9PUCkgXAoraW5saW5lIHN0YXRpYyB2b2lkIFwKK19ibGVuZF8jI2Zvcm1hdF9uYW1lIChjb25zdCBndWludDggKiBzcmMsIGd1aW50OCAqIGRlc3QsIFwKKyAgICBnaW50IHNyY19zdHJpZGUsIGdpbnQgZGVzdF9zdHJpZGUsIGdpbnQgc3JjX3dpZHRoLCBnaW50IHNyY19oZWlnaHQsIFwKKyAgICBnZG91YmxlIHNyY19hbHBoYSkgXAoreyBcCisgIGdpbnQgaTsgXAorICBnaW50IGJfYWxwaGE7IFwKKyAgXAorICAvKiBJZiBpdCdzIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQuLi4gd2UganVzdCByZXR1cm4gKi8gXAorICBpZiAoR19VTkxJS0VMWSAoc3JjX2FscGhhID09IDAuMCkpIHsgXAorICAgIEdTVF9JTkZPICgiRmFzdCBjb3B5IChhbHBoYSA9PSAwLjApIik7IFwKKyAgICByZXR1cm47IFwKKyAgfSBcCisgIFwKKyAgLyogSWYgaXQncyBjb21wbGV0ZWx5IG9wYXF1ZSwgd2UgZG8gYSBmYXN0IGNvcHkgKi8gXAorICBpZiAoR19VTkxJS0VMWSAoc3JjX2FscGhhID09IDEuMCkpIHsgXAorICAgIEdTVF9JTkZPICgiRmFzdCBjb3B5IChhbHBoYSA9PSAxLjApIik7IFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3JjX2hlaWdodDsgaSsrKSB7IFwKKyAgICAgIE1FTUNQWSAoZGVzdCwgc3JjLCBzcmNfd2lkdGgpOyBcCisgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsgXAorICAgICAgZGVzdCArPSBkZXN0X3N0cmlkZTsgXAorICAgIH0gXAorICAgIHJldHVybjsgXAorICB9IFwKKyAgXAorICBiX2FscGhhID0gQ0xBTVAgKChnaW50KSAoc3JjX2FscGhhICogMjU2KSwgMCwgMjU2KTsgXAorICBcCisgIEJMRU5ETE9PUChkZXN0LCBkZXN0X3N0cmlkZSwgc3JjLCBzcmNfc3RyaWRlLCBiX2FscGhhLCBzcmNfd2lkdGgsIHNyY19oZWlnaHQpOyBcCit9IFwKK1wKK3N0YXRpYyB2b2lkIFwKK2JsZW5kXyMjZm9ybWF0X25hbWUgKEdzdFZpZGVvRnJhbWUgKiBzcmNmcmFtZSwgZ2ludCB4cG9zLCBnaW50IHlwb3MsIFwKKyAgICBnZG91YmxlIHNyY19hbHBoYSwgR3N0VmlkZW9GcmFtZSAqIGRlc3RmcmFtZSkgICAgICAgICAgICAgICAgICAgIFwKK3sgXAorICBjb25zdCBndWludDggKmJfc3JjOyBcCisgIGd1aW50OCAqYl9kZXN0OyBcCisgIGdpbnQgYl9zcmNfd2lkdGg7IFwKKyAgZ2ludCBiX3NyY19oZWlnaHQ7IFwKKyAgZ2ludCB4b2Zmc2V0ID0gMDsgXAorICBnaW50IHlvZmZzZXQgPSAwOyBcCisgIGdpbnQgc3JjX2NvbXBfcm93c3RyaWRlLCBkZXN0X2NvbXBfcm93c3RyaWRlOyBcCisgIGdpbnQgc3JjX2NvbXBfaGVpZ2h0OyBcCisgIGdpbnQgc3JjX2NvbXBfd2lkdGg7IFwKKyAgZ2ludCBjb21wX3lwb3MsIGNvbXBfeHBvczsgXAorICBnaW50IGNvbXBfeW9mZnNldCwgY29tcF94b2Zmc2V0OyBcCisgIGdpbnQgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQ7IFwKKyAgY29uc3QgR3N0VmlkZW9Gb3JtYXRJbmZvICppbmZvOyBcCisgIGdpbnQgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0OyBcCisgIFwKKyAgc3JjX3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChzcmNmcmFtZSk7IFwKKyAgc3JjX2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKHNyY2ZyYW1lKTsgXAorICBcCisgIGluZm8gPSBzcmNmcmFtZS0+aW5mby5maW5mbzsgXAorICBkZXN0X3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChkZXN0ZnJhbWUpOyBcCisgIGRlc3RfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoZGVzdGZyYW1lKTsgXAorICBcCisgIHhwb3MgPSBHU1RfUk9VTkRfVVBfMiAoeHBvcyk7IFwKKyAgeXBvcyA9IEdTVF9ST1VORF9VUF8yICh5cG9zKTsgXAorICBcCisgIGJfc3JjX3dpZHRoID0gc3JjX3dpZHRoOyBcCisgIGJfc3JjX2hlaWdodCA9IHNyY19oZWlnaHQ7IFwKKyAgXAorICAvKiBhZGp1c3Qgc3JjIHBvaW50ZXJzIGZvciBuZWdhdGl2ZSBzaXplcyAqLyBcCisgIGlmICh4cG9zIDwgMCkgeyBcCisgICAgeG9mZnNldCA9IC14cG9zOyBcCisgICAgYl9zcmNfd2lkdGggLT0gLXhwb3M7IFwKKyAgICB4cG9zID0gMDsgXAorICB9IFwKKyAgaWYgKHlwb3MgPCAwKSB7IFwKKyAgICB5b2Zmc2V0ICs9IC15cG9zOyBcCisgICAgYl9zcmNfaGVpZ2h0IC09IC15cG9zOyBcCisgICAgeXBvcyA9IDA7IFwKKyAgfSBcCisgIC8qIElmIHggb3IgeSBvZmZzZXQgYXJlIGxhcmdlciB0aGVuIHRoZSBzb3VyY2UgaXQncyBvdXRzaWRlIG9mIHRoZSBwaWN0dXJlICovIFwKKyAgaWYgKHhvZmZzZXQgPiBzcmNfd2lkdGggfHwgeW9mZnNldCA+IHNyY19oZWlnaHQpIHsgXAorICAgIHJldHVybjsgXAorICB9IFwKKyAgXAorICAvKiBhZGp1c3Qgd2lkdGgvaGVpZ2h0IGlmIHRoZSBzcmMgaXMgYmlnZ2VyIHRoYW4gZGVzdCAqLyBcCisgIGlmICh4cG9zICsgc3JjX3dpZHRoID4gZGVzdF93aWR0aCkgeyBcCisgICAgYl9zcmNfd2lkdGggPSBkZXN0X3dpZHRoIC0geHBvczsgXAorICB9IFwKKyAgaWYgKHlwb3MgKyBzcmNfaGVpZ2h0ID4gZGVzdF9oZWlnaHQpIHsgXAorICAgIGJfc3JjX2hlaWdodCA9IGRlc3RfaGVpZ2h0IC0geXBvczsgXAorICB9IFwKKyAgaWYgKGJfc3JjX3dpZHRoIDwgMCB8fCBiX3NyY19oZWlnaHQgPCAwKSB7IFwKKyAgICByZXR1cm47IFwKKyAgfSBcCisgIFwKKyAgLyogRmlyc3QgbWl4IFksIHRoZW4gVVYgKi8gXAorICBiX3NyYyA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKHNyY2ZyYW1lLCAwKTsgXAorICBiX2Rlc3QgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChkZXN0ZnJhbWUsIDApOyBcCisgIHNyY19jb21wX3Jvd3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoc3JjZnJhbWUsIDApOyBcCisgIGRlc3RfY29tcF9yb3dzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGRlc3RmcmFtZSwgMCk7IFwKKyAgc3JjX2NvbXBfd2lkdGggPSBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfV0lEVEgoaW5mbywgMCwgYl9zcmNfd2lkdGgpOyBcCisgIHNyY19jb21wX2hlaWdodCA9IEdTVF9WSURFT19GT1JNQVRfSU5GT19TQ0FMRV9IRUlHSFQoaW5mbywgMCwgYl9zcmNfaGVpZ2h0KTsgXAorICBjb21wX3hwb3MgPSAoeHBvcyA9PSAwKSA/IDAgOiBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfV0lEVEggKGluZm8sIDAsIHhwb3MpOyBcCisgIGNvbXBfeXBvcyA9ICh5cG9zID09IDApID8gMCA6IEdTVF9WSURFT19GT1JNQVRfSU5GT19TQ0FMRV9IRUlHSFQgKGluZm8sIDAsIHlwb3MpOyBcCisgIGNvbXBfeG9mZnNldCA9ICh4b2Zmc2V0ID09IDApID8gMCA6IEdTVF9WSURFT19GT1JNQVRfSU5GT19TQ0FMRV9XSURUSCAoaW5mbywgMCwgeG9mZnNldCk7IFwKKyAgY29tcF95b2Zmc2V0ID0gKHlvZmZzZXQgPT0gMCkgPyAwIDogR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX0hFSUdIVCAoaW5mbywgMCwgeW9mZnNldCk7IFwKKyAgX2JsZW5kXyMjZm9ybWF0X25hbWUgKGJfc3JjICsgY29tcF94b2Zmc2V0ICsgY29tcF95b2Zmc2V0ICogc3JjX2NvbXBfcm93c3RyaWRlLCBcCisgICAgICBiX2Rlc3QgKyBjb21wX3hwb3MgKyBjb21wX3lwb3MgKiBkZXN0X2NvbXBfcm93c3RyaWRlLCBcCisgICAgICBzcmNfY29tcF9yb3dzdHJpZGUsIFwKKyAgICAgIGRlc3RfY29tcF9yb3dzdHJpZGUsIHNyY19jb21wX3dpZHRoLCBzcmNfY29tcF9oZWlnaHQsIFwKKyAgICAgIHNyY19hbHBoYSk7IFwKKyAgXAorICBiX3NyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmNmcmFtZSwgMSk7IFwKKyAgYl9kZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3RmcmFtZSwgMSk7IFwKKyAgc3JjX2NvbXBfcm93c3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChzcmNmcmFtZSwgMSk7IFwKKyAgZGVzdF9jb21wX3Jvd3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZGVzdGZyYW1lLCAxKTsgXAorICBzcmNfY29tcF93aWR0aCA9IEdTVF9WSURFT19GT1JNQVRfSU5GT19TQ0FMRV9XSURUSChpbmZvLCAxLCBiX3NyY193aWR0aCk7IFwKKyAgc3JjX2NvbXBfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX0hFSUdIVChpbmZvLCAxLCBiX3NyY19oZWlnaHQpOyBcCisgIGNvbXBfeHBvcyA9ICh4cG9zID09IDApID8gMCA6IEdTVF9WSURFT19GT1JNQVRfSU5GT19TQ0FMRV9XSURUSCAoaW5mbywgMSwgeHBvcyk7IFwKKyAgY29tcF95cG9zID0gKHlwb3MgPT0gMCkgPyAwIDogR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX0hFSUdIVCAoaW5mbywgMSwgeXBvcyk7IFwKKyAgY29tcF94b2Zmc2V0ID0gKHhvZmZzZXQgPT0gMCkgPyAwIDogR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX1dJRFRIIChpbmZvLCAxLCB4b2Zmc2V0KTsgXAorICBjb21wX3lvZmZzZXQgPSAoeW9mZnNldCA9PSAwKSA/IDAgOiBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfSEVJR0hUIChpbmZvLCAxLCB5b2Zmc2V0KTsgXAorICBfYmxlbmRfIyNmb3JtYXRfbmFtZSAoYl9zcmMgKyBjb21wX3hvZmZzZXQgKiAyICsgY29tcF95b2Zmc2V0ICogc3JjX2NvbXBfcm93c3RyaWRlLCBcCisgICAgICBiX2Rlc3QgKyBjb21wX3hwb3MgKiAyICsgY29tcF95cG9zICogZGVzdF9jb21wX3Jvd3N0cmlkZSwgXAorICAgICAgc3JjX2NvbXBfcm93c3RyaWRlLCBcCisgICAgICBkZXN0X2NvbXBfcm93c3RyaWRlLCAyICogc3JjX2NvbXBfd2lkdGgsIHNyY19jb21wX2hlaWdodCwgXAorICAgICAgc3JjX2FscGhhKTsgXAorfQorCisjZGVmaW5lIE5WX1lVVl9GSUxMX0NIRUNLRVIoZm9ybWF0X25hbWUsIE1FTVNFVCkgICAgICAgIFwKK3N0YXRpYyB2b2lkIFwKK2ZpbGxfY2hlY2tlcl8jI2Zvcm1hdF9uYW1lIChHc3RWaWRlb0ZyYW1lICogZnJhbWUpIFwKK3sgXAorICBnaW50IGksIGo7IFwKKyAgc3RhdGljIGNvbnN0IGludCB0YWJbXSA9IHsgODAsIDE2MCwgODAsIDE2MCB9OyBcCisgIGd1aW50OCAqcDsgXAorICBnaW50IGNvbXBfd2lkdGgsIGNvbXBfaGVpZ2h0OyBcCisgIGdpbnQgcm93c3RyaWRlOyBcCisgIFwKKyAgcCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lLCAwKTsgXAorICBjb21wX3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGZyYW1lLCAwKTsgXAorICBjb21wX2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZnJhbWUsIDApOyBcCisgIHJvd3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUsIDApOyBcCisgIFwKKyAgZm9yIChpID0gMDsgaSA8IGNvbXBfaGVpZ2h0OyBpKyspIHsgXAorICAgIGZvciAoaiA9IDA7IGogPCBjb21wX3dpZHRoOyBqKyspIHsgXAorICAgICAgKnArKyA9IHRhYlsoKGkgJiAweDgpID4+IDMpICsgKChqICYgMHg4KSA+PiAzKV07IFwKKyAgICB9IFwKKyAgICBwICs9IHJvd3N0cmlkZSAtIGNvbXBfd2lkdGg7IFwKKyAgfSBcCisgIFwKKyAgcCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMSk7IFwKKyAgY29tcF93aWR0aCA9IEdTVF9WSURFT19GUkFNRV9DT01QX1dJRFRIIChmcmFtZSwgMSk7IFwKKyAgY29tcF9oZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9IRUlHSFQgKGZyYW1lLCAxKTsgXAorICByb3dzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAxKTsgXAorICBcCisgIGZvciAoaSA9IDA7IGkgPCBjb21wX2hlaWdodDsgaSsrKSB7IFwKKyAgICBNRU1TRVQgKHAsIDB4ODAsIGNvbXBfd2lkdGggKiAyKTsgXAorICAgIHAgKz0gcm93c3RyaWRlOyBcCisgIH0gXAorfQorCisjZGVmaW5lIE5WX1lVVl9GSUxMX0NPTE9SKGZvcm1hdF9uYW1lLE1FTVNFVCkgXAorc3RhdGljIHZvaWQgXAorZmlsbF9jb2xvcl8jI2Zvcm1hdF9uYW1lIChHc3RWaWRlb0ZyYW1lICogZnJhbWUsIFwKKyAgICBnaW50IGNvbFksIGdpbnQgY29sVSwgZ2ludCBjb2xWKSBcCit7IFwKKyAgZ3VpbnQ4ICp5LCAqdSwgKnY7IFwKKyAgZ2ludCBjb21wX3dpZHRoLCBjb21wX2hlaWdodDsgXAorICBnaW50IHJvd3N0cmlkZTsgXAorICBnaW50IGksIGo7IFwKKyAgXAorICB5ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZnJhbWUsIDApOyBcCisgIGNvbXBfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZnJhbWUsIDApOyBcCisgIGNvbXBfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChmcmFtZSwgMCk7IFwKKyAgcm93c3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChmcmFtZSwgMCk7IFwKKyAgXAorICBmb3IgKGkgPSAwOyBpIDwgY29tcF9oZWlnaHQ7IGkrKykgeyBcCisgICAgTUVNU0VUICh5LCBjb2xZLCBjb21wX3dpZHRoKTsgXAorICAgIHkgKz0gcm93c3RyaWRlOyBcCisgIH0gXAorICBcCisgIHUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZSwgMSk7IFwKKyAgdiA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lLCAyKTsgXAorICBjb21wX3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGZyYW1lLCAxKTsgXAorICBjb21wX2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZnJhbWUsIDEpOyBcCisgIHJvd3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUsIDEpOyBcCisgIFwKKyAgZm9yIChpID0gMDsgaSA8IGNvbXBfaGVpZ2h0OyBpKyspIHsgXAorICAgIGZvciAoaiA9IDA7IGogPCBjb21wX3dpZHRoOyBqKyspIHsgXAorICAgICAgdVtqKjJdID0gY29sVTsgXAorICAgICAgdltqKjJdID0gY29sVjsgXAorICAgIH0gXAorICAgIHUgKz0gcm93c3RyaWRlOyBcCisgICAgdiArPSByb3dzdHJpZGU7IFwKKyAgfSBcCit9CisKK05WX1lVVl9CTEVORCAobnYxMiwgbWVtY3B5LCB2aWRlb19taXhlcl9vcmNfYmxlbmRfdTgpOworTlZfWVVWX0ZJTExfQ0hFQ0tFUiAobnYxMiwgbWVtc2V0KTsKK05WX1lVVl9GSUxMX0NPTE9SIChudjEyLCBtZW1zZXQpOworTlZfWVVWX0JMRU5EIChudjIxLCBtZW1jcHksIHZpZGVvX21peGVyX29yY19ibGVuZF91OCk7CitOVl9ZVVZfRklMTF9DSEVDS0VSIChudjIxLCBtZW1zZXQpOworCisvKiBSR0IsIEJHUiwgeFJHQiwgeEJHUiwgUkdCeCwgQkdSeCAqLworCisjZGVmaW5lIFJHQl9CTEVORChuYW1lLCBicHAsIE1FTUNQWSwgQkxFTkRMT09QKSBcCitzdGF0aWMgdm9pZCBcCitibGVuZF8jI25hbWUgKEdzdFZpZGVvRnJhbWUgKiBzcmNmcmFtZSwgZ2ludCB4cG9zLCBnaW50IHlwb3MsIFwKKyAgICBnZG91YmxlIHNyY19hbHBoYSwgR3N0VmlkZW9GcmFtZSAqIGRlc3RmcmFtZSkgXAoreyBcCisgIGdpbnQgYl9hbHBoYTsgXAorICBnaW50IGk7IFwKKyAgZ2ludCBzcmNfc3RyaWRlLCBkZXN0X3N0cmlkZTsgXAorICBnaW50IGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0OyBcCisgIGd1aW50OCAqZGVzdCwgKnNyYzsgXAorICBnaW50IHNyY193aWR0aCwgc3JjX2hlaWdodDsgXAorICBcCisgIHNyY193aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoc3JjZnJhbWUpOyBcCisgIHNyY19oZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChzcmNmcmFtZSk7IFwKKyAgXAorICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjZnJhbWUsIDApOyBcCisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdGZyYW1lLCAwKTsgXAorICBcCisgIGRlc3Rfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGRlc3RmcmFtZSk7IFwKKyAgZGVzdF9oZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChkZXN0ZnJhbWUpOyBcCisgIFwKKyAgc3JjX3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoc3JjZnJhbWUsIDApOyBcCisgIGRlc3Rfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChkZXN0ZnJhbWUsIDApOyBcCisgIFwKKyAgYl9hbHBoYSA9IENMQU1QICgoZ2ludCkgKHNyY19hbHBoYSAqIDI1NiksIDAsIDI1Nik7IFwKKyAgXAorICAvKiBhZGp1c3Qgc3JjIHBvaW50ZXJzIGZvciBuZWdhdGl2ZSBzaXplcyAqLyBcCisgIGlmICh4cG9zIDwgMCkgeyBcCisgICAgc3JjICs9IC14cG9zICogYnBwOyBcCisgICAgc3JjX3dpZHRoIC09IC14cG9zOyBcCisgICAgeHBvcyA9IDA7IFwKKyAgfSBcCisgIGlmICh5cG9zIDwgMCkgeyBcCisgICAgc3JjICs9IC15cG9zICogc3JjX3N0cmlkZTsgXAorICAgIHNyY19oZWlnaHQgLT0gLXlwb3M7IFwKKyAgICB5cG9zID0gMDsgXAorICB9IFwKKyAgLyogYWRqdXN0IHdpZHRoL2hlaWdodCBpZiB0aGUgc3JjIGlzIGJpZ2dlciB0aGFuIGRlc3QgKi8gXAorICBpZiAoeHBvcyArIHNyY193aWR0aCA+IGRlc3Rfd2lkdGgpIHsgXAorICAgIHNyY193aWR0aCA9IGRlc3Rfd2lkdGggLSB4cG9zOyBcCisgIH0gXAorICBpZiAoeXBvcyArIHNyY19oZWlnaHQgPiBkZXN0X2hlaWdodCkgeyBcCisgICAgc3JjX2hlaWdodCA9IGRlc3RfaGVpZ2h0IC0geXBvczsgXAorICB9IFwKKyAgXAorICBkZXN0ID0gZGVzdCArIGJwcCAqIHhwb3MgKyAoeXBvcyAqIGRlc3Rfc3RyaWRlKTsgXAorICAvKiBJZiBpdCdzIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQuLi4gd2UganVzdCByZXR1cm4gKi8gXAorICBpZiAoR19VTkxJS0VMWSAoc3JjX2FscGhhID09IDAuMCkpIHsgXAorICAgIEdTVF9JTkZPICgiRmFzdCBjb3B5IChhbHBoYSA9PSAwLjApIik7IFwKKyAgICByZXR1cm47IFwKKyAgfSBcCisgIFwKKyAgLyogSWYgaXQncyBjb21wbGV0ZWx5IG9wYXF1ZSwgd2UgZG8gYSBmYXN0IGNvcHkgKi8gXAorICBpZiAoR19VTkxJS0VMWSAoc3JjX2FscGhhID09IDEuMCkpIHsgXAorICAgIEdTVF9JTkZPICgiRmFzdCBjb3B5IChhbHBoYSA9PSAxLjApIik7IFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3JjX2hlaWdodDsgaSsrKSB7IFwKKyAgICAgIE1FTUNQWSAoZGVzdCwgc3JjLCBicHAgKiBzcmNfd2lkdGgpOyBcCisgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsgXAorICAgICAgZGVzdCArPSBkZXN0X3N0cmlkZTsgXAorICAgIH0gXAorICAgIHJldHVybjsgXAorICB9IFwKKyAgXAorICBCTEVORExPT1AoZGVzdCwgZGVzdF9zdHJpZGUsIHNyYywgc3JjX3N0cmlkZSwgYl9hbHBoYSwgc3JjX3dpZHRoICogYnBwLCBzcmNfaGVpZ2h0KTsgXAorfQorCisjZGVmaW5lIFJHQl9GSUxMX0NIRUNLRVJfQyhuYW1lLCBicHAsIHIsIGcsIGIpIFwKK3N0YXRpYyB2b2lkIFwKK2ZpbGxfY2hlY2tlcl8jI25hbWUjI19jIChHc3RWaWRlb0ZyYW1lICogZnJhbWUpIFwKK3sgXAorICBnaW50IGksIGo7IFwKKyAgc3RhdGljIGNvbnN0IGludCB0YWJbXSA9IHsgODAsIDE2MCwgODAsIDE2MCB9OyBcCisgIGdpbnQgc3RyaWRlLCBkZXN0X2FkZCwgd2lkdGgsIGhlaWdodDsgXAorICBndWludDggKmRlc3Q7IFwKKyAgXAorICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoZnJhbWUpOyBcCisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGZyYW1lKTsgXAorICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZyYW1lLCAwKTsgXAorICBzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAwKTsgXAorICBkZXN0X2FkZCA9IHN0cmlkZSAtIHdpZHRoICogYnBwOyBcCisgIFwKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7IFwKKyAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeyBcCisgICAgICBkZXN0W3JdID0gdGFiWygoaSAmIDB4OCkgPj4gMykgKyAoKGogJiAweDgpID4+IDMpXTsgICAgICAgLyogcmVkICovIFwKKyAgICAgIGRlc3RbZ10gPSB0YWJbKChpICYgMHg4KSA+PiAzKSArICgoaiAmIDB4OCkgPj4gMyldOyAgICAgICAvKiBncmVlbiAqLyBcCisgICAgICBkZXN0W2JdID0gdGFiWygoaSAmIDB4OCkgPj4gMykgKyAoKGogJiAweDgpID4+IDMpXTsgICAgICAgLyogYmx1ZSAqLyBcCisgICAgICBkZXN0ICs9IGJwcDsgXAorICAgIH0gXAorICAgIGRlc3QgKz0gZGVzdF9hZGQ7IFwKKyAgfSBcCit9CisKKyNkZWZpbmUgUkdCX0ZJTExfQ09MT1IobmFtZSwgYnBwLCBNRU1TRVRfUkdCKSBcCitzdGF0aWMgdm9pZCBcCitmaWxsX2NvbG9yXyMjbmFtZSAoR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBcCisgICAgZ2ludCBjb2xZLCBnaW50IGNvbFUsIGdpbnQgY29sVikgXAoreyBcCisgIGdpbnQgcmVkLCBncmVlbiwgYmx1ZTsgXAorICBnaW50IGk7IFwKKyAgZ2ludCBkZXN0X3N0cmlkZTsgXAorICBnaW50IHdpZHRoLCBoZWlnaHQ7IFwKKyAgZ3VpbnQ4ICpkZXN0OyBcCisgIFwKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGZyYW1lKTsgXAorICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChmcmFtZSk7IFwKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7IFwKKyAgZGVzdF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAwKTsgXAorICBcCisgIHJlZCA9IFlVVl9UT19SIChjb2xZLCBjb2xVLCBjb2xWKTsgXAorICBncmVlbiA9IFlVVl9UT19HIChjb2xZLCBjb2xVLCBjb2xWKTsgXAorICBibHVlID0gWVVWX1RPX0IgKGNvbFksIGNvbFUsIGNvbFYpOyBcCisgIFwKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7IFwKKyAgICBNRU1TRVRfUkdCIChkZXN0LCByZWQsIGdyZWVuLCBibHVlLCB3aWR0aCk7IFwKKyAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOyBcCisgIH0gXAorfQorCisjZGVmaW5lIE1FTVNFVF9SR0JfQyhuYW1lLCByLCBnLCBiKSBcCitzdGF0aWMgaW5saW5lIHZvaWQgXAorX21lbXNldF8jI25hbWUjI19jIChndWludDgqIGRlc3QsIGdpbnQgcmVkLCBnaW50IGdyZWVuLCBnaW50IGJsdWUsIGdpbnQgd2lkdGgpIHsgXAorICBnaW50IGo7IFwKKyAgXAorICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeyBcCisgICAgZGVzdFtyXSA9IHJlZDsgXAorICAgIGRlc3RbZ10gPSBncmVlbjsgXAorICAgIGRlc3RbYl0gPSBibHVlOyBcCisgICAgZGVzdCArPSAzOyBcCisgIH0gXAorfQorCisjZGVmaW5lIE1FTVNFVF9YUkdCKG5hbWUsIHIsIGcsIGIpIFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBcCitfbWVtc2V0XyMjbmFtZSAoZ3VpbnQ4KiBkZXN0LCBnaW50IHJlZCwgZ2ludCBncmVlbiwgZ2ludCBibHVlLCBnaW50IHdpZHRoKSB7IFwKKyAgZ3VpbnQzMiB2YWw7IFwKKyAgXAorICB2YWwgPSBHVUlOVDMyX0ZST01fQkUgKChyZWQgPDwgcikgfCAoZ3JlZW4gPDwgZykgfCAoYmx1ZSA8PCBiKSk7IFwKKyAgdmlkZW9fbWl4ZXJfb3JjX3NwbGF0X3UzMiAoKGd1aW50MzIgKikgZGVzdCwgdmFsLCB3aWR0aCk7IFwKK30KKworI2RlZmluZSBfb3JjX21lbWNweV91MzIoZGVzdCxzcmMsbGVuKSB2aWRlb19taXhlcl9vcmNfbWVtY3B5X3UzMigoZ3VpbnQzMiAqKSBkZXN0LCAoY29uc3QgZ3VpbnQzMiAqKSBzcmMsIGxlbi80KQorCitSR0JfQkxFTkQgKHJnYiwgMywgbWVtY3B5LCB2aWRlb19taXhlcl9vcmNfYmxlbmRfdTgpOworUkdCX0ZJTExfQ0hFQ0tFUl9DIChyZ2IsIDMsIDAsIDEsIDIpOworTUVNU0VUX1JHQl9DIChyZ2IsIDAsIDEsIDIpOworUkdCX0ZJTExfQ09MT1IgKHJnYl9jLCAzLCBfbWVtc2V0X3JnYl9jKTsKKworTUVNU0VUX1JHQl9DIChiZ3IsIDIsIDEsIDApOworUkdCX0ZJTExfQ09MT1IgKGJncl9jLCAzLCBfbWVtc2V0X2Jncl9jKTsKKworUkdCX0JMRU5EICh4cmdiLCA0LCBfb3JjX21lbWNweV91MzIsIHZpZGVvX21peGVyX29yY19ibGVuZF91OCk7CitSR0JfRklMTF9DSEVDS0VSX0MgKHhyZ2IsIDQsIDEsIDIsIDMpOworTUVNU0VUX1hSR0IgKHhyZ2IsIDI0LCAxNiwgMCk7CitSR0JfRklMTF9DT0xPUiAoeHJnYiwgNCwgX21lbXNldF94cmdiKTsKKworTUVNU0VUX1hSR0IgKHhiZ3IsIDAsIDE2LCAyNCk7CitSR0JfRklMTF9DT0xPUiAoeGJnciwgNCwgX21lbXNldF94YmdyKTsKKworTUVNU0VUX1hSR0IgKHJnYngsIDI0LCAxNiwgOCk7CitSR0JfRklMTF9DT0xPUiAocmdieCwgNCwgX21lbXNldF9yZ2J4KTsKKworTUVNU0VUX1hSR0IgKGJncngsIDgsIDE2LCAyNCk7CitSR0JfRklMTF9DT0xPUiAoYmdyeCwgNCwgX21lbXNldF9iZ3J4KTsKKworLyogWVVZMiwgWVZZVSwgVVlWWSAqLworCisjZGVmaW5lIFBBQ0tFRF80MjJfQkxFTkQobmFtZSwgTUVNQ1BZLCBCTEVORExPT1ApIFwKK3N0YXRpYyB2b2lkIFwKK2JsZW5kXyMjbmFtZSAoR3N0VmlkZW9GcmFtZSAqIHNyY2ZyYW1lLCBnaW50IHhwb3MsIGdpbnQgeXBvcywgXAorICAgIGdkb3VibGUgc3JjX2FscGhhLCBHc3RWaWRlb0ZyYW1lICogZGVzdGZyYW1lKSBcCit7IFwKKyAgZ2ludCBiX2FscGhhOyBcCisgIGdpbnQgaTsgXAorICBnaW50IHNyY19zdHJpZGUsIGRlc3Rfc3RyaWRlOyBcCisgIGdpbnQgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQ7IFwKKyAgZ3VpbnQ4ICpzcmMsICpkZXN0OyBcCisgIGdpbnQgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0OyBcCisgIFwKKyAgc3JjX3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChzcmNmcmFtZSk7IFwKKyAgc3JjX2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKHNyY2ZyYW1lKTsgXAorICBcCisgIGRlc3Rfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGRlc3RmcmFtZSk7IFwKKyAgZGVzdF9oZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChkZXN0ZnJhbWUpOyBcCisgIFwKKyAgc3JjID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyY2ZyYW1lLCAwKTsgXAorICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3RmcmFtZSwgMCk7IFwKKyAgXAorICBzcmNfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChzcmNmcmFtZSwgMCk7IFwKKyAgZGVzdF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGRlc3RmcmFtZSwgMCk7IFwKKyAgXAorICBiX2FscGhhID0gQ0xBTVAgKChnaW50KSAoc3JjX2FscGhhICogMjU2KSwgMCwgMjU2KTsgXAorICBcCisgIHhwb3MgPSBHU1RfUk9VTkRfVVBfMiAoeHBvcyk7IFwKKyAgXAorICAvKiBhZGp1c3Qgc3JjIHBvaW50ZXJzIGZvciBuZWdhdGl2ZSBzaXplcyAqLyBcCisgIGlmICh4cG9zIDwgMCkgeyBcCisgICAgc3JjICs9IC14cG9zICogMjsgXAorICAgIHNyY193aWR0aCAtPSAteHBvczsgXAorICAgIHhwb3MgPSAwOyBcCisgIH0gXAorICBpZiAoeXBvcyA8IDApIHsgXAorICAgIHNyYyArPSAteXBvcyAqIHNyY19zdHJpZGU7IFwKKyAgICBzcmNfaGVpZ2h0IC09IC15cG9zOyBcCisgICAgeXBvcyA9IDA7IFwKKyAgfSBcCisgIFwKKyAgLyogYWRqdXN0IHdpZHRoL2hlaWdodCBpZiB0aGUgc3JjIGlzIGJpZ2dlciB0aGFuIGRlc3QgKi8gXAorICBpZiAoeHBvcyArIHNyY193aWR0aCA+IGRlc3Rfd2lkdGgpIHsgXAorICAgIHNyY193aWR0aCA9IGRlc3Rfd2lkdGggLSB4cG9zOyBcCisgIH0gXAorICBpZiAoeXBvcyArIHNyY19oZWlnaHQgPiBkZXN0X2hlaWdodCkgeyBcCisgICAgc3JjX2hlaWdodCA9IGRlc3RfaGVpZ2h0IC0geXBvczsgXAorICB9IFwKKyAgXAorICBkZXN0ID0gZGVzdCArIDIgKiB4cG9zICsgKHlwb3MgKiBkZXN0X3N0cmlkZSk7IFwKKyAgLyogSWYgaXQncyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50Li4uIHdlIGp1c3QgcmV0dXJuICovIFwKKyAgaWYgKEdfVU5MSUtFTFkgKHNyY19hbHBoYSA9PSAwLjApKSB7IFwKKyAgICBHU1RfSU5GTyAoIkZhc3QgY29weSAoYWxwaGEgPT0gMC4wKSIpOyBcCisgICAgcmV0dXJuOyBcCisgIH0gXAorICBcCisgIC8qIElmIGl0J3MgY29tcGxldGVseSBvcGFxdWUsIHdlIGRvIGEgZmFzdCBjb3B5ICovIFwKKyAgaWYgKEdfVU5MSUtFTFkgKHNyY19hbHBoYSA9PSAxLjApKSB7IFwKKyAgICBHU1RfSU5GTyAoIkZhc3QgY29weSAoYWxwaGEgPT0gMS4wKSIpOyBcCisgICAgZm9yIChpID0gMDsgaSA8IHNyY19oZWlnaHQ7IGkrKykgeyBcCisgICAgICBNRU1DUFkgKGRlc3QsIHNyYywgMiAqIHNyY193aWR0aCk7IFwKKyAgICAgIHNyYyArPSBzcmNfc3RyaWRlOyBcCisgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOyBcCisgICAgfSBcCisgICAgcmV0dXJuOyBcCisgIH0gXAorICBcCisgIEJMRU5ETE9PUChkZXN0LCBkZXN0X3N0cmlkZSwgc3JjLCBzcmNfc3RyaWRlLCBiX2FscGhhLCAyICogc3JjX3dpZHRoLCBzcmNfaGVpZ2h0KTsgXAorfQorCisjZGVmaW5lIFBBQ0tFRF80MjJfRklMTF9DSEVDS0VSX0MobmFtZSwgWTEsIFUsIFkyLCBWKSBcCitzdGF0aWMgdm9pZCBcCitmaWxsX2NoZWNrZXJfIyNuYW1lIyNfYyAoR3N0VmlkZW9GcmFtZSAqIGZyYW1lKSBcCit7IFwKKyAgZ2ludCBpLCBqOyBcCisgIHN0YXRpYyBjb25zdCBpbnQgdGFiW10gPSB7IDgwLCAxNjAsIDgwLCAxNjAgfTsgXAorICBnaW50IGRlc3RfYWRkOyBcCisgIGdpbnQgd2lkdGgsIGhlaWdodDsgXAorICBndWludDggKmRlc3Q7IFwKKyAgXAorICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoZnJhbWUpOyBcCisgIHdpZHRoID0gR1NUX1JPVU5EX1VQXzIgKHdpZHRoKTsgXAorICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChmcmFtZSk7IFwKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7IFwKKyAgZGVzdF9hZGQgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAwKSAtIHdpZHRoICogMjsgXAorICB3aWR0aCAvPSAyOyBcCisgIFwKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7IFwKKyAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeyBcCisgICAgICBkZXN0W1kxXSA9IHRhYlsoKGkgJiAweDgpID4+IDMpICsgKChqICYgMHg4KSA+PiAzKV07IFwKKyAgICAgIGRlc3RbWTJdID0gdGFiWygoaSAmIDB4OCkgPj4gMykgKyAoKGogJiAweDgpID4+IDMpXTsgXAorICAgICAgZGVzdFtVXSA9IDEyODsgXAorICAgICAgZGVzdFtWXSA9IDEyODsgXAorICAgICAgZGVzdCArPSA0OyBcCisgICAgfSBcCisgICAgZGVzdCArPSBkZXN0X2FkZDsgXAorICB9IFwKK30KKworI2RlZmluZSBQQUNLRURfNDIyX0ZJTExfQ09MT1IobmFtZSwgWTEsIFUsIFkyLCBWKSBcCitzdGF0aWMgdm9pZCBcCitmaWxsX2NvbG9yXyMjbmFtZSAoR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBcCisgICAgZ2ludCBjb2xZLCBnaW50IGNvbFUsIGdpbnQgY29sVikgXAoreyBcCisgIGdpbnQgaTsgXAorICBnaW50IGRlc3Rfc3RyaWRlOyBcCisgIGd1aW50MzIgdmFsOyBcCisgIGdpbnQgd2lkdGgsIGhlaWdodDsgXAorICBndWludDggKmRlc3Q7IFwKKyAgXAorICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoZnJhbWUpOyBcCisgIHdpZHRoID0gR1NUX1JPVU5EX1VQXzIgKHdpZHRoKTsgXAorICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChmcmFtZSk7IFwKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7IFwKKyAgZGVzdF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAwKTsgXAorICB3aWR0aCAvPSAyOyBcCisgIFwKKyAgdmFsID0gR1VJTlQzMl9GUk9NX0JFICgoY29sWSA8PCBZMSkgfCAoY29sWSA8PCBZMikgfCAoY29sVSA8PCBVKSB8IChjb2xWIDw8IFYpKTsgXAorICBcCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeyBcCisgICAgdmlkZW9fbWl4ZXJfb3JjX3NwbGF0X3UzMiAoKGd1aW50MzIgKikgZGVzdCwgdmFsLCB3aWR0aCk7IFwKKyAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOyBcCisgIH0gXAorfQorCitQQUNLRURfNDIyX0JMRU5EICh5dXkyLCBtZW1jcHksIHZpZGVvX21peGVyX29yY19ibGVuZF91OCk7CitQQUNLRURfNDIyX0ZJTExfQ0hFQ0tFUl9DICh5dXkyLCAwLCAxLCAyLCAzKTsKK1BBQ0tFRF80MjJfRklMTF9DSEVDS0VSX0MgKHV5dnksIDEsIDAsIDMsIDIpOworUEFDS0VEXzQyMl9GSUxMX0NPTE9SICh5dXkyLCAyNCwgMTYsIDgsIDApOworUEFDS0VEXzQyMl9GSUxMX0NPTE9SICh5dnl1LCAyNCwgMCwgOCwgMTYpOworUEFDS0VEXzQyMl9GSUxMX0NPTE9SICh1eXZ5LCAxNiwgMjQsIDAsIDgpOworCisvKiBJbml0IGZ1bmN0aW9uICovCitCbGVuZEZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9ibGVuZF9hcmdiOworQmxlbmRGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYmdyYTsKK0JsZW5kRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX292ZXJsYXlfYXJnYjsKK0JsZW5kRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX292ZXJsYXlfYmdyYTsKKy8qIEFZVVYvQUJHUiBpcyBlcXVhbCB0byBBUkdCLCBSR0JBIGlzIGVxdWFsIHRvIEJHUkEgKi8KK0JsZW5kRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3k0NDQ7CitCbGVuZEZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9ibGVuZF95NDJiOworQmxlbmRGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfaTQyMDsKKy8qIEk0MjAgaXMgZXF1YWwgdG8gWVYxMiAqLworQmxlbmRGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfbnYxMjsKK0JsZW5kRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX252MjE7CitCbGVuZEZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9ibGVuZF95NDFiOworQmxlbmRGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfcmdiOworLyogQkdSIGlzIGVxdWFsIHRvIFJHQiAqLworQmxlbmRGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfcmdieDsKKy8qIEJHUngsIHhSR0IsIHhCR1IgYXJlIGVxdWFsIHRvIFJHQnggKi8KK0JsZW5kRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3l1eTI7CisvKiBZVllVIGFuZCBVWVZZIGFyZSBlcXVhbCB0byBZVVkyICovCisKK0ZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9hcmdiOworRmlsbENoZWNrZXJGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX2JncmE7CisvKiBBQkdSIGlzIGVxdWFsIHRvIEFSR0IsIFJHQkEgaXMgZXF1YWwgdG8gQkdSQSAqLworRmlsbENoZWNrZXJGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX2F5dXY7CitGaWxsQ2hlY2tlckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfeTQ0NDsKK0ZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl95NDJiOworRmlsbENoZWNrZXJGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX2k0MjA7CisvKiBJNDIwIGlzIGVxdWFsIHRvIFlWMTIgKi8KK0ZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9udjEyOworRmlsbENoZWNrZXJGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX252MjE7CitGaWxsQ2hlY2tlckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfeTQxYjsKK0ZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9yZ2I7CisvKiBCR1IgaXMgZXF1YWwgdG8gUkdCICovCitGaWxsQ2hlY2tlckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfeHJnYjsKKy8qIEJHUngsIHhSR0IsIHhCR1IgYXJlIGVxdWFsIHRvIFJHQnggKi8KK0ZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl95dXkyOworLyogWVZZVSBpcyBlcXVhbCB0byBZVVkyICovCitGaWxsQ2hlY2tlckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfdXl2eTsKKworRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYXJnYjsKK0ZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX2JncmE7CitGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl9hYmdyOworRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfcmdiYTsKK0ZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX2F5dXY7CitGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl95NDQ0OworRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeTQyYjsKK0ZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX2k0MjA7CitGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl95djEyOworRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfbnYxMjsKKy8qIE5WMjEgaXMgZXF1YWwgdG8gTlYxMiAqLworRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeTQxYjsKK0ZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX3JnYjsKK0ZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX2JncjsKK0ZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX3hyZ2I7CitGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl94YmdyOworRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfcmdieDsKK0ZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX2Jncng7CitGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl95dXkyOworRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeXZ5dTsKK0ZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX3V5dnk7CisKK3ZvaWQKK2dzdF92aWRlb19taXhlcl9pbml0X2JsZW5kICh2b2lkKQoreworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3ZpZGVvbWl4ZXJfYmxlbmRfZGVidWcsICJ2aWRlb21peGVyX2JsZW5kIiwgMCwKKyAgICAgICJ2aWRlbyBtaXhlciBibGVuZGluZyBmdW5jdGlvbnMiKTsKKworICBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYXJnYiA9IGJsZW5kX2FyZ2I7CisgIGdzdF92aWRlb19taXhlcl9ibGVuZF9iZ3JhID0gYmxlbmRfYmdyYTsKKyAgZ3N0X3ZpZGVvX21peGVyX292ZXJsYXlfYXJnYiA9IG92ZXJsYXlfYXJnYjsKKyAgZ3N0X3ZpZGVvX21peGVyX292ZXJsYXlfYmdyYSA9IG92ZXJsYXlfYmdyYTsKKyAgZ3N0X3ZpZGVvX21peGVyX2JsZW5kX2k0MjAgPSBibGVuZF9pNDIwOworICBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfbnYxMiA9IGJsZW5kX252MTI7CisgIGdzdF92aWRlb19taXhlcl9ibGVuZF9udjIxID0gYmxlbmRfbnYyMTsKKyAgZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3k0NDQgPSBibGVuZF95NDQ0OworICBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfeTQyYiA9IGJsZW5kX3k0MmI7CisgIGdzdF92aWRlb19taXhlcl9ibGVuZF95NDFiID0gYmxlbmRfeTQxYjsKKyAgZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3JnYiA9IGJsZW5kX3JnYjsKKyAgZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3hyZ2IgPSBibGVuZF94cmdiOworICBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfeXV5MiA9IGJsZW5kX3l1eTI7CisKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9hcmdiID0gZmlsbF9jaGVja2VyX2FyZ2JfYzsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9iZ3JhID0gZmlsbF9jaGVja2VyX2JncmFfYzsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9heXV2ID0gZmlsbF9jaGVja2VyX2F5dXZfYzsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9pNDIwID0gZmlsbF9jaGVja2VyX2k0MjA7CisgIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfbnYxMiA9IGZpbGxfY2hlY2tlcl9udjEyOworICBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX252MjEgPSBmaWxsX2NoZWNrZXJfbnYyMTsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl95NDQ0ID0gZmlsbF9jaGVja2VyX3k0NDQ7CisgIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfeTQyYiA9IGZpbGxfY2hlY2tlcl95NDJiOworICBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3k0MWIgPSBmaWxsX2NoZWNrZXJfeTQxYjsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9yZ2IgPSBmaWxsX2NoZWNrZXJfcmdiX2M7CisgIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfeHJnYiA9IGZpbGxfY2hlY2tlcl94cmdiX2M7CisgIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfeXV5MiA9IGZpbGxfY2hlY2tlcl95dXkyX2M7CisgIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfdXl2eSA9IGZpbGxfY2hlY2tlcl91eXZ5X2M7CisKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYXJnYiA9IGZpbGxfY29sb3JfYXJnYjsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYmdyYSA9IGZpbGxfY29sb3JfYmdyYTsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYWJnciA9IGZpbGxfY29sb3JfYWJncjsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfcmdiYSA9IGZpbGxfY29sb3JfcmdiYTsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYXl1diA9IGZpbGxfY29sb3JfYXl1djsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfaTQyMCA9IGZpbGxfY29sb3JfaTQyMDsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeXYxMiA9IGZpbGxfY29sb3JfeXYxMjsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfbnYxMiA9IGZpbGxfY29sb3JfbnYxMjsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeTQ0NCA9IGZpbGxfY29sb3JfeTQ0NDsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeTQyYiA9IGZpbGxfY29sb3JfeTQyYjsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeTQxYiA9IGZpbGxfY29sb3JfeTQxYjsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfcmdiID0gZmlsbF9jb2xvcl9yZ2JfYzsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYmdyID0gZmlsbF9jb2xvcl9iZ3JfYzsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeHJnYiA9IGZpbGxfY29sb3JfeHJnYjsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeGJnciA9IGZpbGxfY29sb3JfeGJncjsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfcmdieCA9IGZpbGxfY29sb3JfcmdieDsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYmdyeCA9IGZpbGxfY29sb3JfYmdyeDsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeXV5MiA9IGZpbGxfY29sb3JfeXV5MjsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeXZ5dSA9IGZpbGxfY29sb3JfeXZ5dTsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfdXl2eSA9IGZpbGxfY29sb3JfdXl2eTsKK30KZGlmZiAtLWdpdCBhL2dzdC92aWRlb21peGVyL2JsZW5kLmggYi9nc3QvdmlkZW9taXhlci9ibGVuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMTZjNTYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdmlkZW9taXhlci9ibGVuZC5oCkBAIC0wLDAgKzEsMTAzIEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOSBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQkxFTkRfSF9fCisjZGVmaW5lIF9fQkxFTkRfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKK3R5cGVkZWYgdm9pZCAoKkJsZW5kRnVuY3Rpb24pIChHc3RWaWRlb0ZyYW1lICpzcmNmcmFtZSwgZ2ludCB4cG9zLCBnaW50IHlwb3MsIGdkb3VibGUgc3JjX2FscGhhLCBHc3RWaWRlb0ZyYW1lICogZGVzdGZyYW1lKTsKK3R5cGVkZWYgdm9pZCAoKkZpbGxDaGVja2VyRnVuY3Rpb24pIChHc3RWaWRlb0ZyYW1lICogZnJhbWUpOwordHlwZWRlZiB2b2lkICgqRmlsbENvbG9yRnVuY3Rpb24pIChHc3RWaWRlb0ZyYW1lICogZnJhbWUsIGdpbnQgYzEsIGdpbnQgYzIsIGdpbnQgYzMpOworCitleHRlcm4gQmxlbmRGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYXJnYjsKK2V4dGVybiBCbGVuZEZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9ibGVuZF9iZ3JhOworI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYXl1diBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYXJnYgorI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYWJnciBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYXJnYgorI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfcmdiYSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYmdyYQorZXh0ZXJuIEJsZW5kRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX292ZXJsYXlfYXJnYjsKK2V4dGVybiBCbGVuZEZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9vdmVybGF5X2JncmE7CisjZGVmaW5lIGdzdF92aWRlb19taXhlcl9vdmVybGF5X2F5dXYgZ3N0X3ZpZGVvX21peGVyX292ZXJsYXlfYXJnYgorI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfb3ZlcmxheV9hYmdyIGdzdF92aWRlb19taXhlcl9vdmVybGF5X2FyZ2IKKyNkZWZpbmUgZ3N0X3ZpZGVvX21peGVyX292ZXJsYXlfcmdiYSBnc3RfdmlkZW9fbWl4ZXJfb3ZlcmxheV9iZ3JhCitleHRlcm4gQmxlbmRGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfaTQyMDsKKyNkZWZpbmUgZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3l2MTIgZ3N0X3ZpZGVvX21peGVyX2JsZW5kX2k0MjAKK2V4dGVybiBCbGVuZEZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9ibGVuZF9udjEyOworZXh0ZXJuIEJsZW5kRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX252MjE7CitleHRlcm4gQmxlbmRGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfeTQxYjsKK2V4dGVybiBCbGVuZEZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9ibGVuZF95NDJiOworZXh0ZXJuIEJsZW5kRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3k0NDQ7CitleHRlcm4gQmxlbmRGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfcmdiOworI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYmdyIGdzdF92aWRlb19taXhlcl9ibGVuZF9yZ2IKK2V4dGVybiBCbGVuZEZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9ibGVuZF9yZ2J4OworI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYmdyeCBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfcmdieAorI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfeHJnYiBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfcmdieAorI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfeGJnciBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfcmdieAorZXh0ZXJuIEJsZW5kRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3l1eTI7CisjZGVmaW5lIGdzdF92aWRlb19taXhlcl9ibGVuZF91eXZ5IGdzdF92aWRlb19taXhlcl9ibGVuZF95dXkyOworI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfeXZ5dSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfeXV5MjsKKworZXh0ZXJuIEZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9hcmdiOworI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX2FiZ3IgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9hcmdiCitleHRlcm4gRmlsbENoZWNrZXJGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX2JncmE7CisjZGVmaW5lIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfcmdiYSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX2JncmEKK2V4dGVybiBGaWxsQ2hlY2tlckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfYXl1djsKK2V4dGVybiBGaWxsQ2hlY2tlckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfaTQyMDsKKyNkZWZpbmUgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl95djEyIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfaTQyMAorZXh0ZXJuIEZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9udjEyOworZXh0ZXJuIEZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9udjIxOworZXh0ZXJuIEZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl95NDFiOworZXh0ZXJuIEZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl95NDJiOworZXh0ZXJuIEZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl95NDQ0OworZXh0ZXJuIEZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9yZ2I7CisjZGVmaW5lIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfYmdyIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfcmdiCitleHRlcm4gRmlsbENoZWNrZXJGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3JnYng7CisjZGVmaW5lIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfYmdyeCBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3JnYngKKyNkZWZpbmUgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl94cmdiIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfcmdieAorI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3hiZ3IgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9yZ2J4CitleHRlcm4gRmlsbENoZWNrZXJGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3l1eTI7CisjZGVmaW5lIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfeXZ5dSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3l1eTI7CitleHRlcm4gRmlsbENoZWNrZXJGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3V5dnk7CisKK2V4dGVybiBGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl9hcmdiOworZXh0ZXJuIEZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX2FiZ3I7CitleHRlcm4gRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYmdyYTsKK2V4dGVybiBGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl9yZ2JhOworZXh0ZXJuIEZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX2F5dXY7CitleHRlcm4gRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfaTQyMDsKK2V4dGVybiBGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl95djEyOworZXh0ZXJuIEZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX252MTI7CisjZGVmaW5lIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX252MjEgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfbnYxMjsKK2V4dGVybiBGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl95NDFiOworZXh0ZXJuIEZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX3k0MmI7CitleHRlcm4gRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeTQ0NDsKK2V4dGVybiBGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl9yZ2I7CitleHRlcm4gRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYmdyOworZXh0ZXJuIEZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX3hyZ2I7CitleHRlcm4gRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeGJncjsKK2V4dGVybiBGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl9yZ2J4OworZXh0ZXJuIEZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX2Jncng7CitleHRlcm4gRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeXV5MjsKK2V4dGVybiBGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl95dnl1OworZXh0ZXJuIEZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX3V5dnk7CisKK3ZvaWQgZ3N0X3ZpZGVvX21peGVyX2luaXRfYmxlbmQgKHZvaWQpOworCisjZW5kaWYgLyogX19CTEVORF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC92aWRlb21peGVyL21lc29uLmJ1aWxkIGIvZ3N0L3ZpZGVvbWl4ZXIvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQyNWE0MwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb21peGVyL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMzIgQEAKK3ZtaXhlcl9zb3VyY2VzID0gWworICAnYmxlbmQuYycsCisgICd2aWRlb21peGVyMi5jJywKK10KKworb3Jjc3JjID0gJ3ZpZGVvbWl4ZXJvcmMnCitpZiBoYXZlX29yY2MKKyAgb3JjX2ggPSBjdXN0b21fdGFyZ2V0KG9yY3NyYyArICcuaCcsCisgICAgaW5wdXQgOiBvcmNzcmMgKyAnLm9yYycsCisgICAgb3V0cHV0IDogb3Jjc3JjICsgJy5oJywKKyAgICBjb21tYW5kIDogb3JjY19hcmdzICsgWyctLWhlYWRlcicsICctbycsICdAT1VUUFVUQCcsICdASU5QVVRAJ10pCisgIG9yY19jID0gY3VzdG9tX3RhcmdldChvcmNzcmMgKyAnLmMnLAorICAgIGlucHV0IDogb3Jjc3JjICsgJy5vcmMnLAorICAgIG91dHB1dCA6IG9yY3NyYyArICcuYycsCisgICAgY29tbWFuZCA6IG9yY2NfYXJncyArIFsnLS1pbXBsZW1lbnRhdGlvbicsICctbycsICdAT1VUUFVUQCcsICdASU5QVVRAJ10pCitlbHNlCisgIG9yY19oID0gY29uZmlndXJlX2ZpbGUoaW5wdXQgOiBvcmNzcmMgKyAnLWRpc3QuaCcsCisgICAgb3V0cHV0IDogb3Jjc3JjICsgJy5oJywKKyAgICBjb25maWd1cmF0aW9uIDogY29uZmlndXJhdGlvbl9kYXRhKCkpCisgIG9yY19jID0gY29uZmlndXJlX2ZpbGUoaW5wdXQgOiBvcmNzcmMgKyAnLWRpc3QuYycsCisgICAgb3V0cHV0IDogb3Jjc3JjICsgJy5jJywKKyAgICBjb25maWd1cmF0aW9uIDogY29uZmlndXJhdGlvbl9kYXRhKCkpCitlbmRpZgorCitnc3R2aWRlb21peGVyID0gbGlicmFyeSgnZ3N0dmlkZW9taXhlcicsCisgIHZtaXhlcl9zb3VyY2VzLCBvcmNfYywgb3JjX2gsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbb3JjX2RlcCwgZ3N0dmlkZW9fZGVwLCBnc3RiYXNlX2RlcCwgbGlibV0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jIGIvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmYyZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYwpAQCAtMCwwICsxLDIyOTEgQEAKKy8qIEdlbmVyaWMgdmlkZW8gbWl4ZXIgcGx1Z2luCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDggV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC12aWRlb21peGVyCisgKgorICogVmlkZW9taXhlciBjYW4gYWNjZXB0IEFZVVYsIEFSR0IgYW5kIEJHUkEgdmlkZW8gc3RyZWFtcy4gRm9yIGVhY2ggb2YgdGhlIHJlcXVlc3RlZAorICogc2luayBwYWRzIGl0IHdpbGwgY29tcGFyZSB0aGUgaW5jb21pbmcgZ2VvbWV0cnkgYW5kIGZyYW1lcmF0ZSB0byBkZWZpbmUgdGhlCisgKiBvdXRwdXQgcGFyYW1ldGVycy4gSW5kZWVkIG91dHB1dCB2aWRlbyBmcmFtZXMgd2lsbCBoYXZlIHRoZSBnZW9tZXRyeSBvZiB0aGUKKyAqIGJpZ2dlc3QgaW5jb21pbmcgdmlkZW8gc3RyZWFtIGFuZCB0aGUgZnJhbWVyYXRlIG9mIHRoZSBmYXN0ZXN0IGluY29taW5nIG9uZS4KKyAqCisgKiBWaWRlb21peGVyIHdpbGwgZG8gY29sb3JzcGFjZSBjb252ZXJzaW9uLgorICogCisgKiBJbmRpdmlkdWFsIHBhcmFtZXRlcnMgZm9yIGVhY2ggaW5wdXQgc3RyZWFtIGNhbiBiZSBjb25maWd1cmVkIG9uIHRoZQorICogI0dzdFZpZGVvTWl4ZXIyUGFkLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5TYW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBcCisgKiAgIHZpZGVvdGVzdHNyYyBwYXR0ZXJuPTEgISBcCisgKiAgIHZpZGVvL3gtcmF3LGZvcm1hdD1BWVVWLGZyYW1lcmF0ZT1cKGZyYWN0aW9uXCkxMC8xLHdpZHRoPTEwMCxoZWlnaHQ9MTAwICEgXAorICogICB2aWRlb2JveCBib3JkZXItYWxwaGE9MCB0b3A9LTcwIGJvdHRvbT0tNzAgcmlnaHQ9LTIyMCAhIFwKKyAqICAgdmlkZW9taXhlciBuYW1lPW1peCBzaW5rXzA6OmFscGhhPTAuNyBzaW5rXzE6OmFscGhhPTAuNSAhIFwKKyAqICAgdmlkZW9jb252ZXJ0ICEgeHZpbWFnZXNpbmsgXAorICogICB2aWRlb3Rlc3RzcmMgISBcCisgKiAgIHZpZGVvL3gtcmF3LGZvcm1hdD1BWVVWLGZyYW1lcmF0ZT1cKGZyYWN0aW9uXCk1LzEsd2lkdGg9MzIwLGhlaWdodD0yNDAgISBtaXguCisgKiBdfCBBIHBpcGVsaW5lIHRvIGRlbW9uc3RyYXRlIHZpZGVvbWl4ZXIgdXNlZCB0b2dldGhlciB3aXRoIHZpZGVvYm94LgorICogVGhpcyBzaG91bGQgc2hvdyBhIDMyMHgyNDAgcGl4ZWxzIHZpZGVvIHRlc3Qgc291cmNlIHdpdGggc29tZSB0cmFuc3BhcmVuY3kKKyAqIHNob3dpbmcgdGhlIGJhY2tncm91bmQgY2hlY2tlciBwYXR0ZXJuLiBBbm90aGVyIHZpZGVvIHRlc3Qgc291cmNlIHdpdGgganVzdAorICogdGhlIHNub3cgcGF0dGVybiBvZiAxMDB4MTAwIHBpeGVscyBpcyBvdmVybGFpZCBvbiB0b3Agb2YgdGhlIGZpcnN0IG9uZSBvbgorICogdGhlIGxlZnQgdmVydGljYWxseSBjZW50ZXJlZCB3aXRoIGEgc21hbGwgdHJhbnNwYXJlbmN5IHNob3dpbmcgdGhlIGZpcnN0CisgKiB2aWRlbyB0ZXN0IHNvdXJjZSBiZWhpbmQgYW5kIHRoZSBjaGVja2VyIHBhdHRlcm4gdW5kZXIgaXQuIE5vdGUgdGhhdCB0aGUKKyAqIGZyYW1lcmF0ZSBvZiB0aGUgb3V0cHV0IHZpZGVvIGlzIDEwIGZyYW1lcyBwZXIgc2Vjb25kLgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHZpZGVvdGVzdHNyYyBwYXR0ZXJuPTEgISBcCisgKiAgIHZpZGVvL3gtcmF3LCBmcmFtZXJhdGU9XChmcmFjdGlvblwpMTAvMSwgd2lkdGg9MTAwLCBoZWlnaHQ9MTAwICEgXAorICogICB2aWRlb21peGVyIG5hbWU9bWl4ICEgdmlkZW9jb252ZXJ0ICEgeGltYWdlc2luayBcCisgKiAgIHZpZGVvdGVzdHNyYyAhICBcCisgKiAgIHZpZGVvL3gtcmF3LCBmcmFtZXJhdGU9XChmcmFjdGlvblwpNS8xLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAgISBtaXguCisgKiBdfCBBIHBpcGVsaW5lIHRvIGRlbW9zdHJhdGUgYmdyYSBtaXhpbmcuIChUaGlzIGRvZXMgbm90IGRlbW9uc3RyYXRlIGFscGhhIGJsZW5kaW5nKS4gCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdmlkZW90ZXN0c3JjIHBhdHRlcm49MSAhIFwKKyAqICAgdmlkZW8veC1yYXcsZm9ybWF0ID1JNDIwLCBmcmFtZXJhdGU9XChmcmFjdGlvblwpMTAvMSwgd2lkdGg9MTAwLCBoZWlnaHQ9MTAwICEgXAorICogICB2aWRlb21peGVyIG5hbWU9bWl4ICEgdmlkZW9jb252ZXJ0ICEgeGltYWdlc2luayBcCisgKiAgIHZpZGVvdGVzdHNyYyAhIFwKKyAqICAgdmlkZW8veC1yYXcsZm9ybWF0PUk0MjAsIGZyYW1lcmF0ZT1cKGZyYWN0aW9uXCk1LzEsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCAhIG1peC4KKyAqIF18IEEgcGlwZWxpbmUgdG8gdGVzdCBJNDIwCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdmlkZW9taXhlciBuYW1lPW1peGVyIHNpbmtfMTo6YWxwaGE9MC41IHNpbmtfMTo6eHBvcz01MCBzaW5rXzE6Onlwb3M9NTAgISBcCisgKiAgIHZpZGVvY29udmVydCAhIHhpbWFnZXNpbmsgXAorICogICB2aWRlb3Rlc3RzcmMgcGF0dGVybj1zbm93IHRpbWVzdGFtcC1vZmZzZXQ9MzAwMDAwMDAwMCAhIFwKKyAqICAgInZpZGVvL3gtcmF3LGZvcm1hdD1BWVVWLHdpZHRoPTY0MCxoZWlnaHQ9NDgwLGZyYW1lcmF0ZT0oZnJhY3Rpb24pMzAvMSIgISBcCisgKiAgIHRpbWVvdmVybGF5ICEgcXVldWUyICEgbWl4ZXIuIFwKKyAqICAgdmlkZW90ZXN0c3JjIHBhdHRlcm49c21wdGUgISBcCisgKiAgICJ2aWRlby94LXJhdyxmb3JtYXQ9QVlVVix3aWR0aD04MDAsaGVpZ2h0PTYwMCxmcmFtZXJhdGU9KGZyYWN0aW9uKTEwLzEiICEgXAorICogICB0aW1lb3ZlcmxheSAhIHF1ZXVlMiAhIG1peGVyLgorICogXXwgQSBwaXBlbGluZSB0byBkZW1vbnN0cmF0ZSBzeW5jaHJvbml6ZWQgbWl4aW5nICh0aGUgc2Vjb25kIHN0cmVhbSBzdGFydHMgYWZ0ZXIgMyBzZWNvbmRzKQorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInZpZGVvbWl4ZXIyLmgiCisjaW5jbHVkZSAidmlkZW9taXhlcjJwYWQuaCIKKworI2lmZGVmIERJU0FCTEVfT1JDCisjZGVmaW5lIG9yY19tZW1zZXQgbWVtc2V0CisjZWxzZQorI2luY2x1ZGUgPG9yYy9vcmNmdW5jdGlvbnMuaD4KKyNlbmRpZgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfdmlkZW9taXhlcjJfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3ZpZGVvbWl4ZXIyX2RlYnVnCisKKyNkZWZpbmUgR1NUX1ZJREVPX01JWEVSMl9HRVRfTE9DSyhtaXgpIFwKKyAgKCZHU1RfVklERU9fTUlYRVIyKG1peCktPmxvY2spCisjZGVmaW5lIEdTVF9WSURFT19NSVhFUjJfTE9DSyhtaXgpIFwKKyAgKGdfbXV0ZXhfbG9jayhHU1RfVklERU9fTUlYRVIyX0dFVF9MT0NLIChtaXgpKSkKKyNkZWZpbmUgR1NUX1ZJREVPX01JWEVSMl9VTkxPQ0sobWl4KSBcCisgIChnX211dGV4X3VubG9jayhHU1RfVklERU9fTUlYRVIyX0dFVF9MT0NLIChtaXgpKSkKKyNkZWZpbmUgR1NUX1ZJREVPX01JWEVSMl9HRVRfU0VUQ0FQU19MT0NLKG1peCkgXAorICAoJkdTVF9WSURFT19NSVhFUjIobWl4KS0+c2V0Y2Fwc19sb2NrKQorI2RlZmluZSBHU1RfVklERU9fTUlYRVIyX1NFVENBUFNfTE9DSyhtaXgpIFwKKyAgKGdfbXV0ZXhfbG9jayhHU1RfVklERU9fTUlYRVIyX0dFVF9TRVRDQVBTX0xPQ0sgKG1peCkpKQorI2RlZmluZSBHU1RfVklERU9fTUlYRVIyX1NFVENBUFNfVU5MT0NLKG1peCkgXAorICAoZ19tdXRleF91bmxvY2soR1NUX1ZJREVPX01JWEVSMl9HRVRfU0VUQ0FQU19MT0NLIChtaXgpKSkKKworI2RlZmluZSBGT1JNQVRTICIgeyBBWVVWLCBCR1JBLCBBUkdCLCBSR0JBLCBBQkdSLCBZNDQ0LCBZNDJCLCBZVVkyLCBVWVZZLCAiXAorICAgICAgICAgICAgICAgICIgICBZVllVLCBJNDIwLCBZVjEyLCBOVjEyLCBOVjIxLCBZNDFCLCBSR0IsIEJHUiwgeFJHQiwgeEJHUiwgIlwKKyAgICAgICAgICAgICAgICAiICAgUkdCeCwgQkdSeCB9ICIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoRk9STUFUUykpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2lua18ldSIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfUkVRVUVTVCwKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKEZPUk1BVFMpKQorICAgICk7CisKK3N0YXRpYyB2b2lkIGdzdF92aWRlb21peGVyMl9jaGlsZF9wcm94eV9pbml0IChncG9pbnRlciBnX2lmYWNlLAorICAgIGdwb2ludGVyIGlmYWNlX2RhdGEpOworc3RhdGljIGdib29sZWFuIGdzdF92aWRlb21peGVyMl9wdXNoX3NpbmtfZXZlbnQgKEdzdFZpZGVvTWl4ZXIyICogbWl4LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIHZvaWQgZ3N0X3ZpZGVvbWl4ZXIyX3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKTsKK3N0YXRpYyB2b2lkIGdzdF92aWRlb21peGVyMl9yZXNldF9xb3MgKEdzdFZpZGVvTWl4ZXIyICogbWl4KTsKKworc3RydWN0IF9Hc3RWaWRlb01peGVyMkNvbGxlY3QKK3sKKyAgR3N0Q29sbGVjdERhdGEgY29sbGVjdDsgICAgICAgLyogd2UgZXh0ZW5kIHRoZSBDb2xsZWN0RGF0YSAqLworCisgIEdzdFZpZGVvTWl4ZXIyUGFkICptaXhwYWQ7CisKKyAgR3N0QnVmZmVyICpxdWV1ZWQ7ICAgICAgICAgICAgLyogYnVmZmVyIGZvciB3aGljaCB3ZSBkb24ndCBrbm93IHRoZSBlbmQgdGltZSB5ZXQgKi8KKyAgR3N0VmlkZW9JbmZvIHF1ZXVlZF92aW5mbzsKKworICBHc3RCdWZmZXIgKmJ1ZmZlcjsgICAgICAgICAgICAvKiBidWZmZXIgdGhhdCBzaG91bGQgYmUgYmxlbmRlZCBub3cgKi8KKyAgR3N0VmlkZW9JbmZvIGJ1ZmZlcl92aW5mbzsKKworICBHc3RDbG9ja1RpbWUgc3RhcnRfdGltZTsKKyAgR3N0Q2xvY2tUaW1lIGVuZF90aW1lOworfTsKKworI2RlZmluZSBERUZBVUxUX1BBRF9aT1JERVIgMAorI2RlZmluZSBERUZBVUxUX1BBRF9YUE9TICAgMAorI2RlZmluZSBERUZBVUxUX1BBRF9ZUE9TICAgMAorI2RlZmluZSBERUZBVUxUX1BBRF9BTFBIQSAgMS4wCitlbnVtCit7CisgIFBST1BfUEFEXzAsCisgIFBST1BfUEFEX1pPUkRFUiwKKyAgUFJPUF9QQURfWFBPUywKKyAgUFJPUF9QQURfWVBPUywKKyAgUFJPUF9QQURfQUxQSEEKK307CisKK0dfREVGSU5FX1RZUEUgKEdzdFZpZGVvTWl4ZXIyUGFkLCBnc3RfdmlkZW9taXhlcjJfcGFkLCBHU1RfVFlQRV9QQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvbWl4ZXIyX2NvbGxlY3RfZnJlZSAoR3N0Q29sbGVjdERhdGEgKiBkYXRhKQoreworICBHc3RWaWRlb01peGVyMkNvbGxlY3QgKmNkYXRhID0gKEdzdFZpZGVvTWl4ZXIyQ29sbGVjdCAqKSBkYXRhOworCisgIGdzdF9idWZmZXJfcmVwbGFjZSAoJmNkYXRhLT5idWZmZXIsIE5VTEwpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3ZpZGVvbWl4ZXIyX3NyY19zZXRjYXBzIChHc3RQYWQgKiBwYWQsIEdzdFZpZGVvTWl4ZXIyICogbWl4LAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9taXhlcjJfdXBkYXRlX3NyY19jYXBzIChHc3RWaWRlb01peGVyMiAqIG1peCkKK3sKKyAgR1NMaXN0ICpsOworICBnaW50IGJlc3Rfd2lkdGggPSAtMSwgYmVzdF9oZWlnaHQgPSAtMTsKKyAgZ2RvdWJsZSBiZXN0X2ZwcyA9IC0xLCBjdXJfZnBzOworICBnaW50IGJlc3RfZnBzX24gPSAtMSwgYmVzdF9mcHNfZCA9IC0xOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIEdTVF9WSURFT19NSVhFUjJfU0VUQ0FQU19MT0NLIChtaXgpOworICBHU1RfVklERU9fTUlYRVIyX0xPQ0sgKG1peCk7CisKKyAgZm9yIChsID0gbWl4LT5zaW5rcGFkczsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICBHc3RWaWRlb01peGVyMlBhZCAqbXBhZCA9IGwtPmRhdGE7CisgICAgZ2ludCB0aGlzX3dpZHRoLCB0aGlzX2hlaWdodDsKKyAgICBnaW50IGZwc19uLCBmcHNfZDsKKyAgICBnaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgICBmcHNfbiA9IEdTVF9WSURFT19JTkZPX0ZQU19OICgmbXBhZC0+aW5mbyk7CisgICAgZnBzX2QgPSBHU1RfVklERU9fSU5GT19GUFNfRCAoJm1wYWQtPmluZm8pOworICAgIHdpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKCZtcGFkLT5pbmZvKTsKKyAgICBoZWlnaHQgPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZtcGFkLT5pbmZvKTsKKworICAgIGlmICh3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKQorICAgICAgY29udGludWU7CisKKyAgICB0aGlzX3dpZHRoID0gd2lkdGggKyBNQVggKG1wYWQtPnhwb3MsIDApOworICAgIHRoaXNfaGVpZ2h0ID0gaGVpZ2h0ICsgTUFYIChtcGFkLT55cG9zLCAwKTsKKworICAgIGlmIChiZXN0X3dpZHRoIDwgdGhpc193aWR0aCkKKyAgICAgIGJlc3Rfd2lkdGggPSB0aGlzX3dpZHRoOworICAgIGlmIChiZXN0X2hlaWdodCA8IHRoaXNfaGVpZ2h0KQorICAgICAgYmVzdF9oZWlnaHQgPSB0aGlzX2hlaWdodDsKKworICAgIGlmIChmcHNfZCA9PSAwKQorICAgICAgY3VyX2ZwcyA9IDAuMDsKKyAgICBlbHNlCisgICAgICBnc3RfdXRpbF9mcmFjdGlvbl90b19kb3VibGUgKGZwc19uLCBmcHNfZCwgJmN1cl9mcHMpOworCisgICAgaWYgKGJlc3RfZnBzIDwgY3VyX2ZwcykgeworICAgICAgYmVzdF9mcHMgPSBjdXJfZnBzOworICAgICAgYmVzdF9mcHNfbiA9IGZwc19uOworICAgICAgYmVzdF9mcHNfZCA9IGZwc19kOworICAgIH0KKyAgfQorCisgIGlmIChiZXN0X2Zwc19uIDw9IDAgfHwgYmVzdF9mcHNfZCA8PSAwIHx8IGJlc3RfZnBzID09IDAuMCkgeworICAgIGJlc3RfZnBzX24gPSAyNTsKKyAgICBiZXN0X2Zwc19kID0gMTsKKyAgICBiZXN0X2ZwcyA9IDI1LjA7CisgIH0KKworICBpZiAoYmVzdF93aWR0aCA+IDAgJiYgYmVzdF9oZWlnaHQgPiAwICYmIGJlc3RfZnBzID4gMCkgeworICAgIEdzdENhcHMgKmNhcHMsICpwZWVyY2FwczsKKyAgICBHc3RTdHJ1Y3R1cmUgKnM7CisgICAgR3N0VmlkZW9JbmZvIGluZm87CisKKyAgICBpZiAoR1NUX1ZJREVPX0lORk9fRlBTX04gKCZtaXgtPmluZm8pICE9IGJlc3RfZnBzX24gfHwKKyAgICAgICAgR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZtaXgtPmluZm8pICE9IGJlc3RfZnBzX2QpIHsKKyAgICAgIGlmIChtaXgtPnNlZ21lbnQucG9zaXRpb24gIT0gLTEpIHsKKyAgICAgICAgbWl4LT50c19vZmZzZXQgPSBtaXgtPnNlZ21lbnQucG9zaXRpb24gLSBtaXgtPnNlZ21lbnQuc3RhcnQ7CisgICAgICAgIG1peC0+bmZyYW1lcyA9IDA7CisgICAgICB9CisgICAgfQorICAgIGdzdF92aWRlb19pbmZvX2luaXQgKCZpbmZvKTsKKyAgICBnc3RfdmlkZW9faW5mb19zZXRfZm9ybWF0ICgmaW5mbywgR1NUX1ZJREVPX0lORk9fRk9STUFUICgmbWl4LT5pbmZvKSwKKyAgICAgICAgYmVzdF93aWR0aCwgYmVzdF9oZWlnaHQpOworICAgIGluZm8uZnBzX24gPSBiZXN0X2Zwc19uOworICAgIGluZm8uZnBzX2QgPSBiZXN0X2Zwc19kOworICAgIGluZm8ucGFyX24gPSBHU1RfVklERU9fSU5GT19QQVJfTiAoJm1peC0+aW5mbyk7CisgICAgaW5mby5wYXJfZCA9IEdTVF9WSURFT19JTkZPX1BBUl9EICgmbWl4LT5pbmZvKTsKKworICAgIGNhcHMgPSBnc3RfdmlkZW9faW5mb190b19jYXBzICgmaW5mbyk7CisKKyAgICBwZWVyY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChtaXgtPnNyY3BhZCwgTlVMTCk7CisgICAgaWYgKHBlZXJjYXBzICYmICFnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChwZWVyY2FwcywgY2FwcykpIHsKKyAgICAgIEdzdENhcHMgKnRtcDsKKworICAgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJ3aWR0aCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgR19NQVhJTlQsICJoZWlnaHQiLAorICAgICAgICAgIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgR19NQVhJTlQsICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTl9SQU5HRSwKKyAgICAgICAgICAwLCAxLCBHX01BWElOVCwgMSwgTlVMTCk7CisKKyAgICAgIHRtcCA9IGdzdF9jYXBzX2ludGVyc2VjdCAoY2FwcywgcGVlcmNhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICAgIGNhcHMgPSB0bXA7CisgICAgICBpZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKGNhcHMpKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1peCwgImVtcHR5IGNhcHMiKTsKKyAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgIEdTVF9WSURFT19NSVhFUjJfVU5MT0NLIChtaXgpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc190cnVuY2F0ZSAoY2Fwcyk7CisgICAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ludCAocywgIndpZHRoIiwgYmVzdF93aWR0aCk7CisgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ludCAocywgImhlaWdodCIsIGJlc3RfaGVpZ2h0KTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfZnJhY3Rpb24gKHMsICJmcmFtZXJhdGUiLCBiZXN0X2Zwc19uLAorICAgICAgICAgIGJlc3RfZnBzX2QpOworCisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJ3aWR0aCIsICZpbmZvLndpZHRoKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImhlaWdodCIsICZpbmZvLmhlaWdodCk7CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9mcmFjdGlvbiAocywgImZyYWN0aW9uIiwgJmluZm8uZnBzX24sICZpbmZvLmZwc19kKTsKKyAgICB9CisKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgY2FwcyA9IGdzdF92aWRlb19pbmZvX3RvX2NhcHMgKCZpbmZvKTsKKworICAgIEdTVF9WSURFT19NSVhFUjJfVU5MT0NLIChtaXgpOworICAgIHJldCA9IGdzdF92aWRlb21peGVyMl9zcmNfc2V0Y2FwcyAobWl4LT5zcmNwYWQsIG1peCwgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICB9IGVsc2UgeworICAgIEdTVF9WSURFT19NSVhFUjJfVU5MT0NLIChtaXgpOworICB9CisKK2RvbmU6CisgIEdTVF9WSURFT19NSVhFUjJfU0VUQ0FQU19VTkxPQ0sgKG1peCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9taXhlcjJfdXBkYXRlX2NvbnZlcnRlcnMgKEdzdFZpZGVvTWl4ZXIyICogbWl4KQoreworICBHU0xpc3QgKnRtcDsKKyAgR3N0VmlkZW9Gb3JtYXQgYmVzdF9mb3JtYXQ7CisgIEdzdFZpZGVvSW5mbyBiZXN0X2luZm87CisgIEdzdFZpZGVvTWl4ZXIyUGFkICpwYWQ7CisgIGdib29sZWFuIG5lZWRfYWxwaGEgPSBGQUxTRTsKKyAgZ2Jvb2xlYW4gYXRfbGVhc3Rfb25lX2FscGhhID0gRkFMU0U7CisgIEdzdENhcHMgKmRvd25zdHJlYW1fY2FwczsKKyAgR3N0Q2FwcyAqcG9zc2libGVfY2FwczsKKyAgZ2NoYXIgKmJlc3RfY29sb3JpbWV0cnk7CisgIGNvbnN0IGdjaGFyICpiZXN0X2Nocm9tYTsKKyAgR0hhc2hUYWJsZSAqZm9ybWF0c190YWJsZTsKKyAgZ2ludCBiZXN0X2Zvcm1hdF9udW1iZXIgPSAwOworCisgIGJlc3RfZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9VTktOT1dOOworICBnc3RfdmlkZW9faW5mb19pbml0ICgmYmVzdF9pbmZvKTsKKworICBkb3duc3RyZWFtX2NhcHMgPSBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgKG1peC0+c3JjcGFkKTsKKworICBpZiAoIWRvd25zdHJlYW1fY2FwcyB8fCBnc3RfY2Fwc19pc19lbXB0eSAoZG93bnN0cmVhbV9jYXBzKSkgeworICAgIGlmIChkb3duc3RyZWFtX2NhcHMpCisgICAgICBnc3RfY2Fwc191bnJlZiAoZG93bnN0cmVhbV9jYXBzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBmb3JtYXRzX3RhYmxlID0gZ19oYXNoX3RhYmxlX25ldyAoZ19kaXJlY3RfaGFzaCwgZ19kaXJlY3RfZXF1YWwpOworCisgIC8qIGZpcnN0IGZpbmQgbmV3IHByZWZlcnJlZCBmb3JtYXQgKi8KKyAgZm9yICh0bXAgPSBtaXgtPnNpbmtwYWRzOyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkgeworICAgIEdzdFN0cnVjdHVyZSAqczsKKyAgICBnaW50IGZvcm1hdF9udW1iZXI7CisKKyAgICBwYWQgPSB0bXAtPmRhdGE7CisKKyAgICBpZiAoIXBhZC0+aW5mby5maW5mbykKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKHBhZC0+aW5mby5maW5mby0+ZmxhZ3MgJiBHU1RfVklERU9fRk9STUFUX0ZMQUdfQUxQSEEpCisgICAgICBhdF9sZWFzdF9vbmVfYWxwaGEgPSBUUlVFOworCisgICAgLyogSWYgd2Ugd2FudCBhbHBoYSwgZGlzcmVnYXJkIGFsbCB0aGUgb3RoZXIgZm9ybWF0cyAqLworICAgIGlmIChuZWVkX2FscGhhICYmICEocGFkLT5pbmZvLmZpbmZvLT5mbGFncyAmIEdTVF9WSURFT19GT1JNQVRfRkxBR19BTFBIQSkpCisgICAgICBjb250aW51ZTsKKworICAgIC8qIFRoaXMgY2FuIGhhcHBlbiBpZiB3ZSByZWxlYXNlIGEgcGFkIGFuZCBhbm90aGVyIHBhZCBoYXNuJ3QgYmVlbiBuZWdvdGlhdGVkIHlldCAqLworICAgIGlmIChHU1RfVklERU9fSU5GT19GT1JNQVQgKCZwYWQtPmluZm8pID09IEdTVF9WSURFT19GT1JNQVRfVU5LTk9XTikKKyAgICAgIGNvbnRpbnVlOworCisgICAgcG9zc2libGVfY2FwcyA9IGdzdF92aWRlb19pbmZvX3RvX2NhcHMgKCZwYWQtPmluZm8pOworCisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHBvc3NpYmxlX2NhcHMsIDApOworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkcyAocywgIndpZHRoIiwgImhlaWdodCIsICJmcmFtZXJhdGUiLAorICAgICAgICAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgImludGVybGFjZS1tb2RlIiwgTlVMTCk7CisKKyAgICAvKiBDYW4gZG93bnN0cmVhbSBhY2NlcHQgdGhpcyBmb3JtYXQgPyAqLworICAgIGlmICghZ3N0X2NhcHNfY2FuX2ludGVyc2VjdCAoZG93bnN0cmVhbV9jYXBzLCBwb3NzaWJsZV9jYXBzKSkgeworICAgICAgZ3N0X2NhcHNfdW5yZWYgKHBvc3NpYmxlX2NhcHMpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgZ3N0X2NhcHNfdW5yZWYgKHBvc3NpYmxlX2NhcHMpOworCisgICAgZm9ybWF0X251bWJlciA9CisgICAgICAgIEdQT0lOVEVSX1RPX0lOVCAoZ19oYXNoX3RhYmxlX2xvb2t1cCAoZm9ybWF0c190YWJsZSwKKyAgICAgICAgICAgIEdJTlRfVE9fUE9JTlRFUiAoR1NUX1ZJREVPX0lORk9fRk9STUFUICgmcGFkLT5pbmZvKSkpKTsKKyAgICBmb3JtYXRfbnVtYmVyICs9IDE7CisKKyAgICBnX2hhc2hfdGFibGVfcmVwbGFjZSAoZm9ybWF0c190YWJsZSwKKyAgICAgICAgR0lOVF9UT19QT0lOVEVSIChHU1RfVklERU9fSU5GT19GT1JNQVQgKCZwYWQtPmluZm8pKSwKKyAgICAgICAgR0lOVF9UT19QT0lOVEVSIChmb3JtYXRfbnVtYmVyKSk7CisKKyAgICAvKiBJZiB0aGF0IHBhZCBpcyB0aGUgZmlyc3Qgd2l0aCBhbHBoYSwgc2V0IGl0IGFzIHRoZSBuZXcgYmVzdCBmb3JtYXQgKi8KKyAgICBpZiAoIW5lZWRfYWxwaGEgJiYgKHBhZC0+aW5mby5maW5mby0+ZmxhZ3MgJiBHU1RfVklERU9fRk9STUFUX0ZMQUdfQUxQSEEpKSB7CisgICAgICBuZWVkX2FscGhhID0gVFJVRTsKKyAgICAgIGJlc3RfZm9ybWF0ID0gR1NUX1ZJREVPX0lORk9fRk9STUFUICgmcGFkLT5pbmZvKTsKKyAgICAgIGJlc3RfaW5mbyA9IHBhZC0+aW5mbzsKKyAgICAgIGJlc3RfZm9ybWF0X251bWJlciA9IGZvcm1hdF9udW1iZXI7CisgICAgfSBlbHNlIGlmIChmb3JtYXRfbnVtYmVyID4gYmVzdF9mb3JtYXRfbnVtYmVyKSB7CisgICAgICBiZXN0X2Zvcm1hdCA9IEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoJnBhZC0+aW5mbyk7CisgICAgICBiZXN0X2luZm8gPSBwYWQtPmluZm87CisgICAgICBiZXN0X2Zvcm1hdF9udW1iZXIgPSBmb3JtYXRfbnVtYmVyOworICAgIH0KKyAgfQorCisgIGdfaGFzaF90YWJsZV91bnJlZiAoZm9ybWF0c190YWJsZSk7CisKKyAgaWYgKGJlc3RfZm9ybWF0ID09IEdTVF9WSURFT19GT1JNQVRfVU5LTk9XTikgeworICAgIGRvd25zdHJlYW1fY2FwcyA9IGdzdF9jYXBzX2ZpeGF0ZSAoZG93bnN0cmVhbV9jYXBzKTsKKyAgICBnc3RfdmlkZW9faW5mb19mcm9tX2NhcHMgKCZiZXN0X2luZm8sIGRvd25zdHJlYW1fY2Fwcyk7CisgICAgYmVzdF9mb3JtYXQgPSBHU1RfVklERU9fSU5GT19GT1JNQVQgKCZiZXN0X2luZm8pOworICB9CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGRvd25zdHJlYW1fY2Fwcyk7CisKKyAgaWYgKGF0X2xlYXN0X29uZV9hbHBoYQorICAgICAgJiYgIShiZXN0X2luZm8uZmluZm8tPmZsYWdzICYgR1NUX1ZJREVPX0ZPUk1BVF9GTEFHX0FMUEhBKSkgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtaXgsIENPUkUsIE5FR09USUFUSU9OLAorICAgICAgICAoIkF0IGxlYXN0IG9uZSBvZiB0aGUgaW5wdXQgcGFkcyBjb250YWlucyBhbHBoYSwgYnV0IGRvd25zdHJlYW0gY2FuJ3Qgc3VwcG9ydCBhbHBoYS4iKSwKKyAgICAgICAgKCJFaXRoZXIgY29udmVydCB5b3VyIGlucHV0cyB0byBub3QgY29udGFpbiBhbHBoYSBvciBhZGQgYSB2aWRlb2NvbnZlcnQgYWZ0ZXIgdGhlIG1peGVyIikpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGJlc3RfY29sb3JpbWV0cnkgPSBnc3RfdmlkZW9fY29sb3JpbWV0cnlfdG9fc3RyaW5nICgmKGJlc3RfaW5mby5jb2xvcmltZXRyeSkpOworICBiZXN0X2Nocm9tYSA9IGdzdF92aWRlb19jaHJvbWFfdG9fc3RyaW5nIChiZXN0X2luZm8uY2hyb21hX3NpdGUpOworCisgIGlmIChHU1RfVklERU9fSU5GT19GUFNfTiAoJm1peC0+aW5mbykgIT0gR1NUX1ZJREVPX0lORk9fRlBTX04gKCZiZXN0X2luZm8pIHx8CisgICAgICBHU1RfVklERU9fSU5GT19GUFNfRCAoJm1peC0+aW5mbykgIT0gR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZiZXN0X2luZm8pKSB7CisgICAgaWYgKG1peC0+c2VnbWVudC5wb3NpdGlvbiAhPSAtMSkgeworICAgICAgbWl4LT50c19vZmZzZXQgPSBtaXgtPnNlZ21lbnQucG9zaXRpb24gLSBtaXgtPnNlZ21lbnQuc3RhcnQ7CisgICAgICBtaXgtPm5mcmFtZXMgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBtaXgtPnRzX29mZnNldCArPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKG1peC0+bmZyYW1lcywKKyAgICAgICAgICBHU1RfU0VDT05EICogR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZtaXgtPmluZm8pLAorICAgICAgICAgIEdTVF9WSURFT19JTkZPX0ZQU19OICgmbWl4LT5pbmZvKSk7CisgICAgICBtaXgtPm5mcmFtZXMgPSAwOworICAgIH0KKyAgfQorCisgIG1peC0+aW5mbyA9IGJlc3RfaW5mbzsKKworICBHU1RfREVCVUdfT0JKRUNUIChtaXgsCisgICAgICAiVGhlIG91dHB1dCBmb3JtYXQgd2lsbCBub3cgYmUgOiAlZCB3aXRoIGNvbG9yaW1ldHJ5IDogJXMgYW5kIGNocm9tYSA6ICVzIiwKKyAgICAgIGJlc3RfZm9ybWF0LCBiZXN0X2NvbG9yaW1ldHJ5LCBiZXN0X2Nocm9tYSk7CisKKyAgLyogVGhlbiBicm93c2UgdGhlIHNpbmtzIG9uY2UgbW9yZSwgc2V0dGluZyBvciB1bnNldHRpbmcgY29udmVyc2lvbiBpZiBuZWVkZWQgKi8KKyAgZm9yICh0bXAgPSBtaXgtPnNpbmtwYWRzOyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkgeworICAgIGdjaGFyICpjb2xvcmltZXRyeTsKKyAgICBjb25zdCBnY2hhciAqY2hyb21hOworCisgICAgcGFkID0gdG1wLT5kYXRhOworCisgICAgaWYgKCFwYWQtPmluZm8uZmluZm8pCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChHU1RfVklERU9fSU5GT19GT1JNQVQgKCZwYWQtPmluZm8pID09IEdTVF9WSURFT19GT1JNQVRfVU5LTk9XTikKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKHBhZC0+Y29udmVydCkKKyAgICAgIGdzdF92aWRlb19jb252ZXJ0ZXJfZnJlZSAocGFkLT5jb252ZXJ0KTsKKworICAgIHBhZC0+Y29udmVydCA9IE5VTEw7CisKKyAgICBjb2xvcmltZXRyeSA9IGdzdF92aWRlb19jb2xvcmltZXRyeV90b19zdHJpbmcgKCYocGFkLT5pbmZvLmNvbG9yaW1ldHJ5KSk7CisgICAgY2hyb21hID0gZ3N0X3ZpZGVvX2Nocm9tYV90b19zdHJpbmcgKHBhZC0+aW5mby5jaHJvbWFfc2l0ZSk7CisKKyAgICBpZiAoYmVzdF9mb3JtYXQgIT0gR1NUX1ZJREVPX0lORk9fRk9STUFUICgmcGFkLT5pbmZvKSB8fAorICAgICAgICBnX3N0cmNtcDAgKGNvbG9yaW1ldHJ5LCBiZXN0X2NvbG9yaW1ldHJ5KSB8fAorICAgICAgICBnX3N0cmNtcDAgKGNocm9tYSwgYmVzdF9jaHJvbWEpKSB7CisgICAgICBHc3RWaWRlb0luZm8gdG1wX2luZm8gPSBwYWQtPmluZm87CisgICAgICB0bXBfaW5mby5maW5mbyA9IGJlc3RfaW5mby5maW5mbzsKKyAgICAgIHRtcF9pbmZvLmNocm9tYV9zaXRlID0gYmVzdF9pbmZvLmNocm9tYV9zaXRlOworICAgICAgdG1wX2luZm8uY29sb3JpbWV0cnkgPSBiZXN0X2luZm8uY29sb3JpbWV0cnk7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgIlRoaXMgcGFkIHdpbGwgYmUgY29udmVydGVkIGZyb20gJWQgdG8gJWQiLAorICAgICAgICAgIEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoJnBhZC0+aW5mbyksCisgICAgICAgICAgR1NUX1ZJREVPX0lORk9fRk9STUFUICgmYmVzdF9pbmZvKSk7CisgICAgICBwYWQtPmNvbnZlcnQgPSBnc3RfdmlkZW9fY29udmVydGVyX25ldyAoJnBhZC0+aW5mbywgJnRtcF9pbmZvLCBOVUxMKTsKKyAgICAgIHBhZC0+bmVlZF9jb252ZXJzaW9uX3VwZGF0ZSA9IFRSVUU7CisgICAgICBpZiAoIXBhZC0+Y29udmVydCkgeworICAgICAgICBnX2ZyZWUgKGNvbG9yaW1ldHJ5KTsKKyAgICAgICAgZ19mcmVlIChiZXN0X2NvbG9yaW1ldHJ5KTsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJObyBwYXRoIGZvdW5kIGZvciBjb252ZXJzaW9uIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiVGhpcyBwYWQgd2lsbCBub3QgbmVlZCBjb252ZXJzaW9uIik7CisgICAgfQorICAgIGdfZnJlZSAoY29sb3JpbWV0cnkpOworICB9CisKKyAgZ19mcmVlIChiZXN0X2NvbG9yaW1ldHJ5KTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZpZGVvbWl4ZXIyX3BhZF9zaW5rX3NldGNhcHMgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RWaWRlb01peGVyMiAqbWl4OworICBHc3RWaWRlb01peGVyMlBhZCAqbWl4cGFkOworICBHc3RWaWRlb0luZm8gaW5mbzsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgR1NUX0lORk9fT0JKRUNUIChwYWQsICJTZXR0aW5nIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIG1peCA9IEdTVF9WSURFT19NSVhFUjIgKHBhcmVudCk7CisgIG1peHBhZCA9IEdTVF9WSURFT19NSVhFUjJfUEFEIChwYWQpOworCisgIGlmICghZ3N0X3ZpZGVvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgY2FwcykpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwYWQsICJGYWlsZWQgdG8gcGFyc2UgY2FwcyIpOworICAgIGdvdG8gYmVhY2g7CisgIH0KKworICBHU1RfVklERU9fTUlYRVIyX0xPQ0sgKG1peCk7CisgIGlmIChHU1RfVklERU9fSU5GT19GT1JNQVQgKCZtaXgtPmluZm8pICE9IEdTVF9WSURFT19GT1JNQVRfVU5LTk9XTikgeworICAgIGlmIChHU1RfVklERU9fSU5GT19QQVJfTiAoJm1peC0+aW5mbykgIT0gR1NUX1ZJREVPX0lORk9fUEFSX04gKCZpbmZvKQorICAgICAgICB8fCBHU1RfVklERU9fSU5GT19QQVJfRCAoJm1peC0+aW5mbykgIT0gR1NUX1ZJREVPX0lORk9fUEFSX0QgKCZpbmZvKSB8fAorICAgICAgICBHU1RfVklERU9fSU5GT19JTlRFUkxBQ0VfTU9ERSAoJm1peC0+aW5mbykgIT0KKyAgICAgICAgR1NUX1ZJREVPX0lORk9fSU5URVJMQUNFX01PREUgKCZpbmZvKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLAorICAgICAgICAgICJnb3QgaW5wdXQgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCAiLCBidXQgIiAiY3VycmVudCBjYXBzIGFyZSAlIgorICAgICAgICAgIEdTVF9QVFJfRk9STUFULCBjYXBzLCBtaXgtPmN1cnJlbnRfY2Fwcyk7CisgICAgICBHU1RfVklERU9fTUlYRVIyX1VOTE9DSyAobWl4KTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKworICBtaXhwYWQtPmluZm8gPSBpbmZvOworCisgIEdTVF9DT0xMRUNUX1BBRFNfU1RSRUFNX0xPQ0sgKG1peC0+Y29sbGVjdCk7CisKKyAgcmV0ID0gZ3N0X3ZpZGVvbWl4ZXIyX3VwZGF0ZV9jb252ZXJ0ZXJzIChtaXgpOworCisgIEdTVF9WSURFT19NSVhFUjJfVU5MT0NLIChtaXgpOworICBpZiAocmV0KQorICAgIHJldCA9IGdzdF92aWRlb21peGVyMl91cGRhdGVfc3JjX2NhcHMgKG1peCk7CisgIEdTVF9DT0xMRUNUX1BBRFNfU1RSRUFNX1VOTE9DSyAobWl4LT5jb2xsZWN0KTsKKworYmVhY2g6CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF92aWRlb21peGVyMl9wYWRfc2lua19nZXRjYXBzIChHc3RQYWQgKiBwYWQsIEdzdFZpZGVvTWl4ZXIyICogbWl4LAorICAgIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIEdzdENhcHMgKnRlbXBsYXRlX2NhcHM7CisgIEdzdENhcHMgKmZpbHRlcmVkX2NhcHM7CisgIEdzdENhcHMgKnJldHVybmVkX2NhcHM7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgZ2Jvb2xlYW4gaGFkX2N1cnJlbnRfY2FwcyA9IFRSVUU7CisgIGdpbnQgaSwgbjsKKworICB0ZW1wbGF0ZV9jYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9QQUQgKG1peC0+c3JjcGFkKSk7CisKKyAgc3JjY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX1BBRCAobWl4LT5zcmNwYWQpKTsKKyAgaWYgKHNyY2NhcHMgPT0gTlVMTCkgeworICAgIGhhZF9jdXJyZW50X2NhcHMgPSBGQUxTRTsKKyAgICBzcmNjYXBzID0gdGVtcGxhdGVfY2FwczsKKyAgfQorCisgIHNyY2NhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChzcmNjYXBzKTsKKworICBuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKHNyY2NhcHMpOworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHNyY2NhcHMsIGkpOworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAid2lkdGgiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIEdfTUFYSU5ULAorICAgICAgICAiaGVpZ2h0IiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCBHX01BWElOVCwKKyAgICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OX1JBTkdFLCAwLCAxLCBHX01BWElOVCwgMSwgTlVMTCk7CisgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgInBpeGVsLWFzcGVjdC1yYXRpbyIpKQorICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iLCBHU1RfVFlQRV9GUkFDVElPTiwgMSwgMSwKKyAgICAgICAgICBOVUxMKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkcyAocywgImNvbG9yaW1ldHJ5IiwgImNocm9tYS1zaXRlIiwgImZvcm1hdCIsCisgICAgICAgIE5VTEwpOworICB9CisKKyAgZmlsdGVyZWRfY2FwcyA9IHNyY2NhcHM7CisgIGlmIChmaWx0ZXIpCisgICAgZmlsdGVyZWRfY2FwcyA9IGdzdF9jYXBzX2ludGVyc2VjdCAoc3JjY2FwcywgZmlsdGVyKTsKKyAgcmV0dXJuZWRfY2FwcyA9IGdzdF9jYXBzX2ludGVyc2VjdCAoZmlsdGVyZWRfY2FwcywgdGVtcGxhdGVfY2Fwcyk7CisKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworICBpZiAoZmlsdGVyKQorICAgIGdzdF9jYXBzX3VucmVmIChmaWx0ZXJlZF9jYXBzKTsKKyAgaWYgKGhhZF9jdXJyZW50X2NhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKHRlbXBsYXRlX2NhcHMpOworCisgIHJldHVybiByZXR1cm5lZF9jYXBzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92aWRlb21peGVyMl9wYWRfc2lua19hY2NlcHRjYXBzIChHc3RQYWQgKiBwYWQsIEdzdFZpZGVvTWl4ZXIyICogbWl4LAorICAgIEdzdENhcHMgKiBjYXBzKQoreworICBnYm9vbGVhbiByZXQ7CisgIEdzdENhcHMgKm1vZGlmaWVkX2NhcHM7CisgIEdzdENhcHMgKmFjY2VwdGVkX2NhcHM7CisgIEdzdENhcHMgKnRlbXBsYXRlX2NhcHM7CisgIGdib29sZWFuIGhhZF9jdXJyZW50X2NhcHMgPSBUUlVFOworICBnaW50IGksIG47CisgIEdzdFN0cnVjdHVyZSAqczsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICIlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgYWNjZXB0ZWRfY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX1BBRCAobWl4LT5zcmNwYWQpKTsKKworICB0ZW1wbGF0ZV9jYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9QQUQgKG1peC0+c3JjcGFkKSk7CisKKyAgaWYgKGFjY2VwdGVkX2NhcHMgPT0gTlVMTCkgeworICAgIGFjY2VwdGVkX2NhcHMgPSB0ZW1wbGF0ZV9jYXBzOworICAgIGhhZF9jdXJyZW50X2NhcHMgPSBGQUxTRTsKKyAgfQorCisgIGFjY2VwdGVkX2NhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChhY2NlcHRlZF9jYXBzKTsKKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAic3JjIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIGFjY2VwdGVkX2NhcHMpOworCisgIG4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAoYWNjZXB0ZWRfY2Fwcyk7CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoYWNjZXB0ZWRfY2FwcywgaSk7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJ3aWR0aCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgR19NQVhJTlQsCisgICAgICAgICJoZWlnaHQiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIEdfTUFYSU5ULAorICAgICAgICAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT05fUkFOR0UsIDAsIDEsIEdfTUFYSU5ULCAxLCBOVUxMKTsKKyAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAicGl4ZWwtYXNwZWN0LXJhdGlvIikpCisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgInBpeGVsLWFzcGVjdC1yYXRpbyIsIEdTVF9UWVBFX0ZSQUNUSU9OLCAxLCAxLAorICAgICAgICAgIE5VTEwpOworCisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGRzIChzLCAiY29sb3JpbWV0cnkiLCAiY2hyb21hLXNpdGUiLCAiZm9ybWF0IiwKKyAgICAgICAgTlVMTCk7CisgIH0KKworICBtb2RpZmllZF9jYXBzID0gZ3N0X2NhcHNfaW50ZXJzZWN0IChhY2NlcHRlZF9jYXBzLCB0ZW1wbGF0ZV9jYXBzKTsKKworICByZXQgPSBnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChjYXBzLCBhY2NlcHRlZF9jYXBzKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiJXNhY2NlcHRlZCBjYXBzICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgKHJldCA/ICIiIDogIm5vdCAiKSwgY2Fwcyk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgImFjY2VwdGFibGUgY2FwcyBhcmUgJSIgR1NUX1BUUl9GT1JNQVQsIGFjY2VwdGVkX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoYWNjZXB0ZWRfY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChtb2RpZmllZF9jYXBzKTsKKyAgaWYgKGhhZF9jdXJyZW50X2NhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKHRlbXBsYXRlX2NhcHMpOworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92aWRlb21peGVyMl9zaW5rX3F1ZXJ5IChHc3RDb2xsZWN0UGFkcyAqIHBhZHMsIEdzdENvbGxlY3REYXRhICogY2RhdGEsCisgICAgR3N0UXVlcnkgKiBxdWVyeSwgR3N0VmlkZW9NaXhlcjIgKiBtaXgpCit7CisgIEdzdFZpZGVvTWl4ZXIyUGFkICpwYWQgPSBHU1RfVklERU9fTUlYRVIyX1BBRCAoY2RhdGEtPnBhZCk7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqZmlsdGVyLCAqY2FwczsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2NhcHMgKHF1ZXJ5LCAmZmlsdGVyKTsKKyAgICAgIGNhcHMgPSBnc3RfdmlkZW9taXhlcjJfcGFkX3NpbmtfZ2V0Y2FwcyAoR1NUX1BBRCAocGFkKSwgbWl4LCBmaWx0ZXIpOworICAgICAgZ3N0X3F1ZXJ5X3NldF9jYXBzX3Jlc3VsdCAocXVlcnksIGNhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9BQ0NFUFRfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfYWNjZXB0X2NhcHMgKHF1ZXJ5LCAmY2Fwcyk7CisgICAgICByZXQgPSBnc3RfdmlkZW9taXhlcjJfcGFkX3NpbmtfYWNjZXB0Y2FwcyAoR1NUX1BBRCAocGFkKSwgbWl4LCBjYXBzKTsKKyAgICAgIGdzdF9xdWVyeV9zZXRfYWNjZXB0X2NhcHNfcmVzdWx0IChxdWVyeSwgcmV0KTsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IGdzdF9jb2xsZWN0X3BhZHNfcXVlcnlfZGVmYXVsdCAocGFkcywgY2RhdGEsIHF1ZXJ5LCBGQUxTRSk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvbWl4ZXIyX3BhZF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VmlkZW9NaXhlcjJQYWQgKnBhZCA9IEdTVF9WSURFT19NSVhFUjJfUEFEIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QQURfWk9SREVSOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHBhZC0+em9yZGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QQURfWFBPUzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHBhZC0+eHBvcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUEFEX1lQT1M6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBwYWQtPnlwb3MpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BBRF9BTFBIQToKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIHBhZC0+YWxwaGEpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgaW50CitwYWRfem9yZGVyX2NvbXBhcmUgKGNvbnN0IEdzdFZpZGVvTWl4ZXIyUGFkICogcGFkMSwKKyAgICBjb25zdCBHc3RWaWRlb01peGVyMlBhZCAqIHBhZDIpCit7CisgIHJldHVybiBwYWQxLT56b3JkZXIgLSBwYWQyLT56b3JkZXI7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9taXhlcjJfcGFkX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWaWRlb01peGVyMlBhZCAqcGFkID0gR1NUX1ZJREVPX01JWEVSMl9QQUQgKG9iamVjdCk7CisgIEdzdFZpZGVvTWl4ZXIyICptaXggPSBHU1RfVklERU9fTUlYRVIyIChnc3RfcGFkX2dldF9wYXJlbnQgKEdTVF9QQUQgKHBhZCkpKTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUEFEX1pPUkRFUjoKKyAgICAgIEdTVF9WSURFT19NSVhFUjJfTE9DSyAobWl4KTsKKyAgICAgIHBhZC0+em9yZGVyID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworCisgICAgICBtaXgtPnNpbmtwYWRzID0gZ19zbGlzdF9zb3J0IChtaXgtPnNpbmtwYWRzLAorICAgICAgICAgIChHQ29tcGFyZUZ1bmMpIHBhZF96b3JkZXJfY29tcGFyZSk7CisgICAgICBHU1RfVklERU9fTUlYRVIyX1VOTE9DSyAobWl4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QQURfWFBPUzoKKyAgICAgIHBhZC0+eHBvcyA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BBRF9ZUE9TOgorICAgICAgcGFkLT55cG9zID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUEFEX0FMUEhBOgorICAgICAgcGFkLT5hbHBoYSA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorCisgIGdzdF9vYmplY3RfdW5yZWYgKG1peCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9taXhlcjJfcGFkX2NsYXNzX2luaXQgKEdzdFZpZGVvTWl4ZXIyUGFkQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdmlkZW9taXhlcjJfcGFkX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3ZpZGVvbWl4ZXIyX3BhZF9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QQURfWk9SREVSLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJ6b3JkZXIiLCAiWi1PcmRlciIsICJaIE9yZGVyIG9mIHRoZSBwaWN0dXJlIiwKKyAgICAgICAgICAwLCAxMDAwMCwgREVGQVVMVF9QQURfWk9SREVSLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QQURfWFBPUywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ4cG9zIiwgIlggUG9zaXRpb24iLCAiWCBQb3NpdGlvbiBvZiB0aGUgcGljdHVyZSIsCisgICAgICAgICAgR19NSU5JTlQsIEdfTUFYSU5ULCBERUZBVUxUX1BBRF9YUE9TLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QQURfWVBPUywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ5cG9zIiwgIlkgUG9zaXRpb24iLCAiWSBQb3NpdGlvbiBvZiB0aGUgcGljdHVyZSIsCisgICAgICAgICAgR19NSU5JTlQsIEdfTUFYSU5ULCBERUZBVUxUX1BBRF9ZUE9TLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QQURfQUxQSEEsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYWxwaGEiLCAiQWxwaGEiLCAiQWxwaGEgb2YgdGhlIHBpY3R1cmUiLCAwLjAsIDEuMCwKKyAgICAgICAgICBERUZBVUxUX1BBRF9BTFBIQSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9taXhlcjJfcGFkX2luaXQgKEdzdFZpZGVvTWl4ZXIyUGFkICogbWl4ZXJwYWQpCit7CisgIG1peGVycGFkLT56b3JkZXIgPSBERUZBVUxUX1BBRF9aT1JERVI7CisgIG1peGVycGFkLT54cG9zID0gREVGQVVMVF9QQURfWFBPUzsKKyAgbWl4ZXJwYWQtPnlwb3MgPSBERUZBVUxUX1BBRF9ZUE9TOworICBtaXhlcnBhZC0+YWxwaGEgPSBERUZBVUxUX1BBRF9BTFBIQTsKKyAgbWl4ZXJwYWQtPmNvbnZlcnQgPSBOVUxMOworICBtaXhlcnBhZC0+bmVlZF9jb252ZXJzaW9uX3VwZGF0ZSA9IEZBTFNFOworfQorCisvKiBHc3RWaWRlb01peGVyMiAqLworI2RlZmluZSBERUZBVUxUX0JBQ0tHUk9VTkQgVklERU9fTUlYRVIyX0JBQ0tHUk9VTkRfQ0hFQ0tFUgorZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQkFDS0dST1VORAorfTsKKworI2RlZmluZSBHU1RfVFlQRV9WSURFT19NSVhFUjJfQkFDS0dST1VORCAoZ3N0X3ZpZGVvbWl4ZXIyX2JhY2tncm91bmRfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X3ZpZGVvbWl4ZXIyX2JhY2tncm91bmRfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSB2aWRlb19taXhlcl9iYWNrZ3JvdW5kX3R5cGUgPSAwOworCisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIHZpZGVvX21peGVyX2JhY2tncm91bmRbXSA9IHsKKyAgICB7VklERU9fTUlYRVIyX0JBQ0tHUk9VTkRfQ0hFQ0tFUiwgIkNoZWNrZXIgcGF0dGVybiIsICJjaGVja2VyIn0sCisgICAge1ZJREVPX01JWEVSMl9CQUNLR1JPVU5EX0JMQUNLLCAiQmxhY2siLCAiYmxhY2sifSwKKyAgICB7VklERU9fTUlYRVIyX0JBQ0tHUk9VTkRfV0hJVEUsICJXaGl0ZSIsICJ3aGl0ZSJ9LAorICAgIHtWSURFT19NSVhFUjJfQkFDS0dST1VORF9UUkFOU1BBUkVOVCwKKyAgICAgICAgIlRyYW5zcGFyZW50IEJhY2tncm91bmQgdG8gZW5hYmxlIGZ1cnRoZXIgbWl4aW5nIiwgInRyYW5zcGFyZW50In0sCisgICAgezAsIE5VTEwsIE5VTEx9LAorICB9OworCisgIGlmICghdmlkZW9fbWl4ZXJfYmFja2dyb3VuZF90eXBlKSB7CisgICAgdmlkZW9fbWl4ZXJfYmFja2dyb3VuZF90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFZpZGVvTWl4ZXIyQmFja2dyb3VuZCIsCisgICAgICAgIHZpZGVvX21peGVyX2JhY2tncm91bmQpOworICB9CisgIHJldHVybiB2aWRlb19taXhlcl9iYWNrZ3JvdW5kX3R5cGU7Cit9CisKKyNkZWZpbmUgZ3N0X3ZpZGVvbWl4ZXIyX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RWaWRlb01peGVyMiwgZ3N0X3ZpZGVvbWl4ZXIyLCBHU1RfVFlQRV9FTEVNRU5ULAorICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfQ0hJTERfUFJPWFksCisgICAgICAgIGdzdF92aWRlb21peGVyMl9jaGlsZF9wcm94eV9pbml0KSk7CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9taXhlcjJfdXBkYXRlX3FvcyAoR3N0VmlkZW9NaXhlcjIgKiBtaXgsIGdkb3VibGUgcHJvcG9ydGlvbiwKKyAgICBHc3RDbG9ja1RpbWVEaWZmIGRpZmYsIEdzdENsb2NrVGltZSB0aW1lc3RhbXApCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKG1peCwKKyAgICAgICJVcGRhdGluZyBRb1M6IHByb3BvcnRpb24gJWxmLCBkaWZmICUiIEdTVF9TVElNRV9GT1JNQVQgIiwgdGltZXN0YW1wICUiCisgICAgICBHU1RfVElNRV9GT1JNQVQsIHByb3BvcnRpb24sIEdTVF9TVElNRV9BUkdTIChkaWZmKSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAobWl4KTsKKyAgbWl4LT5wcm9wb3J0aW9uID0gcHJvcG9ydGlvbjsKKyAgaWYgKEdfTElLRUxZICh0aW1lc3RhbXAgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkpIHsKKyAgICBpZiAoIW1peC0+bGl2ZSAmJiBHX1VOTElLRUxZIChkaWZmID4gMCkpCisgICAgICBtaXgtPmVhcmxpZXN0X3RpbWUgPQorICAgICAgICAgIHRpbWVzdGFtcCArIDIgKiBkaWZmICsgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludF9yb3VuZCAoR1NUX1NFQ09ORCwKKyAgICAgICAgICBHU1RfVklERU9fSU5GT19GUFNfRCAoJm1peC0+aW5mbyksIEdTVF9WSURFT19JTkZPX0ZQU19OICgmbWl4LT5pbmZvKSk7CisgICAgZWxzZQorICAgICAgbWl4LT5lYXJsaWVzdF90aW1lID0gdGltZXN0YW1wICsgZGlmZjsKKyAgfSBlbHNlIHsKKyAgICBtaXgtPmVhcmxpZXN0X3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChtaXgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvbWl4ZXIyX3Jlc2V0X3FvcyAoR3N0VmlkZW9NaXhlcjIgKiBtaXgpCit7CisgIGdzdF92aWRlb21peGVyMl91cGRhdGVfcW9zIChtaXgsIDAuNSwgMCwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgIG1peC0+cW9zX3Byb2Nlc3NlZCA9IG1peC0+cW9zX2Ryb3BwZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvbWl4ZXIyX3JlYWRfcW9zIChHc3RWaWRlb01peGVyMiAqIG1peCwgZ2RvdWJsZSAqIHByb3BvcnRpb24sCisgICAgR3N0Q2xvY2tUaW1lICogdGltZSkKK3sKKyAgR1NUX09CSkVDVF9MT0NLIChtaXgpOworICAqcHJvcG9ydGlvbiA9IG1peC0+cHJvcG9ydGlvbjsKKyAgKnRpbWUgPSBtaXgtPmVhcmxpZXN0X3RpbWU7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChtaXgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvbWl4ZXIyX3Jlc2V0IChHc3RWaWRlb01peGVyMiAqIG1peCkKK3sKKyAgR1NMaXN0ICpsOworCisgIGdzdF92aWRlb19pbmZvX2luaXQgKCZtaXgtPmluZm8pOworICBtaXgtPnRzX29mZnNldCA9IDA7CisgIG1peC0+bmZyYW1lcyA9IDA7CisKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJm1peC0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgbWl4LT5zZWdtZW50LnBvc2l0aW9uID0gLTE7CisKKyAgZ3N0X3ZpZGVvbWl4ZXIyX3Jlc2V0X3FvcyAobWl4KTsKKworICBmb3IgKGwgPSBtaXgtPnNpbmtwYWRzOyBsOyBsID0gbC0+bmV4dCkgeworICAgIEdzdFZpZGVvTWl4ZXIyUGFkICpwID0gbC0+ZGF0YTsKKyAgICBHc3RWaWRlb01peGVyMkNvbGxlY3QgKm1peGNvbCA9IHAtPm1peGNvbDsKKworICAgIGdzdF9idWZmZXJfcmVwbGFjZSAoJm1peGNvbC0+YnVmZmVyLCBOVUxMKTsKKyAgICBtaXhjb2wtPnN0YXJ0X3RpbWUgPSAtMTsKKyAgICBtaXhjb2wtPmVuZF90aW1lID0gLTE7CisKKyAgICBnc3RfdmlkZW9faW5mb19pbml0ICgmcC0+aW5mbyk7CisgIH0KKworICBtaXgtPm5ld3NlZ19wZW5kaW5nID0gVFJVRTsKK30KKworLyogIDEgPT0gT0sKKyAqICAwID09IG5lZWQgbW9yZSBkYXRhCisgKiAtMSA9PSBFT1MKKyAqIC0yID09IGVycm9yCisgKi8KK3N0YXRpYyBnaW50Citnc3RfdmlkZW9taXhlcjJfZmlsbF9xdWV1ZXMgKEdzdFZpZGVvTWl4ZXIyICogbWl4LAorICAgIEdzdENsb2NrVGltZSBvdXRwdXRfc3RhcnRfdGltZSwgR3N0Q2xvY2tUaW1lIG91dHB1dF9lbmRfdGltZSkKK3sKKyAgR1NMaXN0ICpsOworICBnYm9vbGVhbiBlb3MgPSBUUlVFOworICBnYm9vbGVhbiBuZWVkX21vcmVfZGF0YSA9IEZBTFNFOworCisgIGZvciAobCA9IG1peC0+c2lua3BhZHM7IGw7IGwgPSBsLT5uZXh0KSB7CisgICAgR3N0VmlkZW9NaXhlcjJQYWQgKnBhZCA9IGwtPmRhdGE7CisgICAgR3N0VmlkZW9NaXhlcjJDb2xsZWN0ICptaXhjb2wgPSBwYWQtPm1peGNvbDsKKyAgICBHc3RTZWdtZW50ICpzZWdtZW50ID0gJnBhZC0+bWl4Y29sLT5jb2xsZWN0LnNlZ21lbnQ7CisgICAgR3N0QnVmZmVyICpidWY7CisgICAgR3N0VmlkZW9JbmZvICp2aW5mbzsKKworICAgIGJ1ZiA9IGdzdF9jb2xsZWN0X3BhZHNfcGVlayAobWl4LT5jb2xsZWN0LCAmbWl4Y29sLT5jb2xsZWN0KTsKKyAgICBpZiAoYnVmKSB7CisgICAgICBHc3RDbG9ja1RpbWUgc3RhcnRfdGltZSwgZW5kX3RpbWU7CisKKyAgICAgIHN0YXJ0X3RpbWUgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKTsKKyAgICAgIGlmIChzdGFydF90aW1lID09IC0xKSB7CisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBhZCwgIk5lZWQgdGltZXN0YW1wZWQgYnVmZmVycyEiKTsKKyAgICAgICAgcmV0dXJuIC0yOworICAgICAgfQorCisgICAgICB2aW5mbyA9ICZwYWQtPmluZm87CisKKyAgICAgIC8qIEZJWE1FOiBNYWtlIGFsbCB0aGlzIHdvcmsgd2l0aCBuZWdhdGl2ZSByYXRlcyAqLworCisgICAgICBpZiAoKG1peGNvbC0+YnVmZmVyICYmIHN0YXJ0X3RpbWUgPCBHU1RfQlVGRkVSX1RJTUVTVEFNUCAobWl4Y29sLT5idWZmZXIpKQorICAgICAgICAgIHx8IChtaXhjb2wtPnF1ZXVlZAorICAgICAgICAgICAgICAmJiBzdGFydF90aW1lIDwgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG1peGNvbC0+cXVldWVkKSkpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYWQsICJCdWZmZXIgZnJvbSB0aGUgcGFzdCwgZHJvcHBpbmciKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgYnVmID0gZ3N0X2NvbGxlY3RfcGFkc19wb3AgKG1peC0+Y29sbGVjdCwgJm1peGNvbC0+Y29sbGVjdCk7CisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgIG5lZWRfbW9yZV9kYXRhID0gVFJVRTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChtaXhjb2wtPnF1ZXVlZCkgeworICAgICAgICBlbmRfdGltZSA9IHN0YXJ0X3RpbWUgLSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAobWl4Y29sLT5xdWV1ZWQpOworICAgICAgICBzdGFydF90aW1lID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKG1peGNvbC0+cXVldWVkKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgYnVmID0gZ3N0X2J1ZmZlcl9yZWYgKG1peGNvbC0+cXVldWVkKTsKKyAgICAgICAgdmluZm8gPSAmbWl4Y29sLT5xdWV1ZWRfdmluZm87CisgICAgICB9IGVsc2UgeworICAgICAgICBlbmRfdGltZSA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1Zik7CisKKyAgICAgICAgaWYgKGVuZF90aW1lID09IC0xKSB7CisgICAgICAgICAgbWl4Y29sLT5xdWV1ZWQgPSBidWY7CisgICAgICAgICAgYnVmID0gZ3N0X2NvbGxlY3RfcGFkc19wb3AgKG1peC0+Y29sbGVjdCwgJm1peGNvbC0+Y29sbGVjdCk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICBtaXhjb2wtPnF1ZXVlZF92aW5mbyA9IHBhZC0+aW5mbzsKKyAgICAgICAgICBuZWVkX21vcmVfZGF0YSA9IFRSVUU7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZ19hc3NlcnQgKHN0YXJ0X3RpbWUgIT0gLTEgJiYgZW5kX3RpbWUgIT0gLTEpOworICAgICAgZW5kX3RpbWUgKz0gc3RhcnRfdGltZTsgICAvKiBjb252ZXJ0IGZyb20gZHVyYXRpb24gdG8gcG9zaXRpb24gKi8KKworICAgICAgLyogQ2hlY2sgaWYgaXQncyBpbnNpZGUgdGhlIHNlZ21lbnQgKi8KKyAgICAgIGlmIChzdGFydF90aW1lID49IHNlZ21lbnQtPnN0b3AgfHwgZW5kX3RpbWUgPCBzZWdtZW50LT5zdGFydCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJCdWZmZXIgb3V0c2lkZSB0aGUgc2VnbWVudCIpOworCisgICAgICAgIGlmIChidWYgPT0gbWl4Y29sLT5xdWV1ZWQpIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgIGdzdF9idWZmZXJfcmVwbGFjZSAoJm1peGNvbC0+cXVldWVkLCBOVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgIGJ1ZiA9IGdzdF9jb2xsZWN0X3BhZHNfcG9wIChtaXgtPmNvbGxlY3QsICZtaXhjb2wtPmNvbGxlY3QpOworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBuZWVkX21vcmVfZGF0YSA9IFRSVUU7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKiBDbGlwIHRvIHNlZ21lbnQgYW5kIGNvbnZlcnQgdG8gcnVubmluZyB0aW1lICovCisgICAgICBzdGFydF90aW1lID0gTUFYIChzdGFydF90aW1lLCBzZWdtZW50LT5zdGFydCk7CisgICAgICBpZiAoc2VnbWVudC0+c3RvcCAhPSAtMSkKKyAgICAgICAgZW5kX3RpbWUgPSBNSU4gKGVuZF90aW1lLCBzZWdtZW50LT5zdG9wKTsKKyAgICAgIHN0YXJ0X3RpbWUgPQorICAgICAgICAgIGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLCBzdGFydF90aW1lKTsKKyAgICAgIGVuZF90aW1lID0KKyAgICAgICAgICBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKHNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgZW5kX3RpbWUpOworICAgICAgZ19hc3NlcnQgKHN0YXJ0X3RpbWUgIT0gLTEgJiYgZW5kX3RpbWUgIT0gLTEpOworCisgICAgICAvKiBDb252ZXJ0IHRvIHRoZSBvdXRwdXQgc2VnbWVudCByYXRlICovCisgICAgICBpZiAoQUJTIChtaXgtPnNlZ21lbnQucmF0ZSkgIT0gMS4wKSB7CisgICAgICAgIHN0YXJ0X3RpbWUgKj0gQUJTIChtaXgtPnNlZ21lbnQucmF0ZSk7CisgICAgICAgIGVuZF90aW1lICo9IEFCUyAobWl4LT5zZWdtZW50LnJhdGUpOworICAgICAgfQorCisgICAgICBpZiAobWl4Y29sLT5lbmRfdGltZSAhPSAtMSAmJiBtaXhjb2wtPmVuZF90aW1lID4gZW5kX3RpbWUpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiQnVmZmVyIGZyb20gdGhlIHBhc3QsIGRyb3BwaW5nIik7CisgICAgICAgIGlmIChidWYgPT0gbWl4Y29sLT5xdWV1ZWQpIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgIGdzdF9idWZmZXJfcmVwbGFjZSAoJm1peGNvbC0+cXVldWVkLCBOVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgIGJ1ZiA9IGdzdF9jb2xsZWN0X3BhZHNfcG9wIChtaXgtPmNvbGxlY3QsICZtaXhjb2wtPmNvbGxlY3QpOworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBuZWVkX21vcmVfZGF0YSA9IFRSVUU7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoZW5kX3RpbWUgPj0gb3V0cHV0X3N0YXJ0X3RpbWUgJiYgc3RhcnRfdGltZSA8IG91dHB1dF9lbmRfdGltZSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsCisgICAgICAgICAgICAiVGFraW5nIG5ldyBidWZmZXIgd2l0aCBzdGFydCB0aW1lICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHN0YXJ0X3RpbWUpKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmbWl4Y29sLT5idWZmZXIsIGJ1Zik7CisgICAgICAgIG1peGNvbC0+YnVmZmVyX3ZpbmZvID0gKnZpbmZvOworICAgICAgICBtaXhjb2wtPnN0YXJ0X3RpbWUgPSBzdGFydF90aW1lOworICAgICAgICBtaXhjb2wtPmVuZF90aW1lID0gZW5kX3RpbWU7CisKKyAgICAgICAgaWYgKGJ1ZiA9PSBtaXhjb2wtPnF1ZXVlZCkgeworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmbWl4Y29sLT5xdWV1ZWQsIE5VTEwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgICAgYnVmID0gZ3N0X2NvbGxlY3RfcGFkc19wb3AgKG1peC0+Y29sbGVjdCwgJm1peGNvbC0+Y29sbGVjdCk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgfQorICAgICAgICBlb3MgPSBGQUxTRTsKKyAgICAgIH0gZWxzZSBpZiAoc3RhcnRfdGltZSA+PSBvdXRwdXRfZW5kX3RpbWUpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiS2VlcGluZyBidWZmZXIgdW50aWwgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoc3RhcnRfdGltZSkpOworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICBlb3MgPSBGQUxTRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgIlRvbyBvbGQgYnVmZmVyIC0tIGRyb3BwaW5nIik7CisgICAgICAgIGlmIChidWYgPT0gbWl4Y29sLT5xdWV1ZWQpIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgIGdzdF9idWZmZXJfcmVwbGFjZSAoJm1peGNvbC0+cXVldWVkLCBOVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgIGJ1ZiA9IGdzdF9jb2xsZWN0X3BhZHNfcG9wIChtaXgtPmNvbGxlY3QsICZtaXhjb2wtPmNvbGxlY3QpOworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBuZWVkX21vcmVfZGF0YSA9IFRSVUU7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAobWl4Y29sLT5lbmRfdGltZSAhPSAtMSkgeworICAgICAgICBpZiAobWl4Y29sLT5lbmRfdGltZSA8PSBvdXRwdXRfc3RhcnRfdGltZSkgeworICAgICAgICAgIGdzdF9idWZmZXJfcmVwbGFjZSAoJm1peGNvbC0+YnVmZmVyLCBOVUxMKTsKKyAgICAgICAgICBtaXhjb2wtPnN0YXJ0X3RpbWUgPSBtaXhjb2wtPmVuZF90aW1lID0gLTE7CisgICAgICAgICAgaWYgKCFHU1RfQ09MTEVDVF9QQURTX1NUQVRFX0lTX1NFVCAobWl4Y29sLAorICAgICAgICAgICAgICAgICAgR1NUX0NPTExFQ1RfUEFEU19TVEFURV9FT1MpKQorICAgICAgICAgICAgbmVlZF9tb3JlX2RhdGEgPSBUUlVFOworICAgICAgICB9IGVsc2UgaWYgKCFHU1RfQ09MTEVDVF9QQURTX1NUQVRFX0lTX1NFVCAobWl4Y29sLAorICAgICAgICAgICAgICAgIEdTVF9DT0xMRUNUX1BBRFNfU1RBVEVfRU9TKSkgeworICAgICAgICAgIGVvcyA9IEZBTFNFOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKG5lZWRfbW9yZV9kYXRhKQorICAgIHJldHVybiAwOworICBpZiAoZW9zKQorICAgIHJldHVybiAtMTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92aWRlb21peGVyMl9ibGVuZF9idWZmZXJzIChHc3RWaWRlb01peGVyMiAqIG1peCwKKyAgICBHc3RDbG9ja1RpbWUgb3V0cHV0X3N0YXJ0X3RpbWUsIEdzdENsb2NrVGltZSBvdXRwdXRfZW5kX3RpbWUsCisgICAgR3N0QnVmZmVyICoqIG91dGJ1ZikKK3sKKyAgR1NMaXN0ICpsOworICBndWludCBvdXRzaXplOworICBCbGVuZEZ1bmN0aW9uIGNvbXBvc2l0ZTsKKyAgR3N0VmlkZW9GcmFtZSBvdXRmcmFtZTsKKyAgc3RhdGljIEdzdEFsbG9jYXRpb25QYXJhbXMgcGFyYW1zID0geyAwLCAxNSwgMCwgMCwgfTsKKworICBvdXRzaXplID0gR1NUX1ZJREVPX0lORk9fU0laRSAoJm1peC0+aW5mbyk7CisKKyAgKm91dGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCBvdXRzaXplLCAmcGFyYW1zKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKCpvdXRidWYpID0gb3V0cHV0X3N0YXJ0X3RpbWU7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKCpvdXRidWYpID0gb3V0cHV0X2VuZF90aW1lIC0gb3V0cHV0X3N0YXJ0X3RpbWU7CisKKyAgZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJm91dGZyYW1lLCAmbWl4LT5pbmZvLCAqb3V0YnVmLCBHU1RfTUFQX1JFQURXUklURSk7CisKKyAgLyogZGVmYXVsdCB0byBibGVuZGluZyAqLworICBjb21wb3NpdGUgPSBtaXgtPmJsZW5kOworICBzd2l0Y2ggKG1peC0+YmFja2dyb3VuZCkgeworICAgIGNhc2UgVklERU9fTUlYRVIyX0JBQ0tHUk9VTkRfQ0hFQ0tFUjoKKyAgICAgIG1peC0+ZmlsbF9jaGVja2VyICgmb3V0ZnJhbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWSURFT19NSVhFUjJfQkFDS0dST1VORF9CTEFDSzoKKyAgICAgIG1peC0+ZmlsbF9jb2xvciAoJm91dGZyYW1lLCAxNiwgMTI4LCAxMjgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWSURFT19NSVhFUjJfQkFDS0dST1VORF9XSElURToKKyAgICAgIG1peC0+ZmlsbF9jb2xvciAoJm91dGZyYW1lLCAyNDAsIDEyOCwgMTI4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVklERU9fTUlYRVIyX0JBQ0tHUk9VTkRfVFJBTlNQQVJFTlQ6CisgICAgeworICAgICAgZ3VpbnQgaSwgcGxhbmUsIG51bV9wbGFuZXMsIGhlaWdodDsKKworICAgICAgbnVtX3BsYW5lcyA9IEdTVF9WSURFT19GUkFNRV9OX1BMQU5FUyAoJm91dGZyYW1lKTsKKyAgICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IG51bV9wbGFuZXM7ICsrcGxhbmUpIHsKKyAgICAgICAgZ3VpbnQ4ICpwZGF0YTsKKyAgICAgICAgZ3NpemUgcm93c2l6ZSwgcGxhbmVfc3RyaWRlOworCisgICAgICAgIHBkYXRhID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKCZvdXRmcmFtZSwgcGxhbmUpOworICAgICAgICBwbGFuZV9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFICgmb3V0ZnJhbWUsIHBsYW5lKTsKKyAgICAgICAgcm93c2l6ZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1dJRFRIICgmb3V0ZnJhbWUsIHBsYW5lKQorICAgICAgICAgICAgKiBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFICgmb3V0ZnJhbWUsIHBsYW5lKTsKKyAgICAgICAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUICgmb3V0ZnJhbWUsIHBsYW5lKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7CisgICAgICAgICAgbWVtc2V0IChwZGF0YSwgMCwgcm93c2l6ZSk7CisgICAgICAgICAgcGRhdGEgKz0gcGxhbmVfc3RyaWRlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIHVzZSBvdmVybGF5IHRvIGtlZXAgYmFja2dyb3VuZCB0cmFuc3BhcmVudCAqLworICAgICAgY29tcG9zaXRlID0gbWl4LT5vdmVybGF5OworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgZm9yIChsID0gbWl4LT5zaW5rcGFkczsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICBHc3RWaWRlb01peGVyMlBhZCAqcGFkID0gbC0+ZGF0YTsKKyAgICBHc3RWaWRlb01peGVyMkNvbGxlY3QgKm1peGNvbCA9IHBhZC0+bWl4Y29sOworCisgICAgaWYgKG1peGNvbC0+YnVmZmVyICE9IE5VTEwpIHsKKyAgICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisgICAgICBnaW50NjQgc3RyZWFtX3RpbWU7CisgICAgICBHc3RTZWdtZW50ICpzZWc7CisgICAgICBHc3RWaWRlb0ZyYW1lIGNvbnZlcnRlZF9mcmFtZTsKKyAgICAgIEdzdEJ1ZmZlciAqY29udmVydGVkX2J1ZiA9IE5VTEw7CisgICAgICBHc3RWaWRlb0ZyYW1lIGZyYW1lOworCisgICAgICBzZWcgPSAmbWl4Y29sLT5jb2xsZWN0LnNlZ21lbnQ7CisKKyAgICAgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChtaXhjb2wtPmJ1ZmZlcik7CisKKyAgICAgIHN0cmVhbV90aW1lID0KKyAgICAgICAgICBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoc2VnLCBHU1RfRk9STUFUX1RJTUUsIHRpbWVzdGFtcCk7CisKKyAgICAgIC8qIHN5bmMgb2JqZWN0IHByb3BlcnRpZXMgb24gc3RyZWFtIHRpbWUgKi8KKyAgICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtX3RpbWUpKQorICAgICAgICBnc3Rfb2JqZWN0X3N5bmNfdmFsdWVzIChHU1RfT0JKRUNUIChwYWQpLCBzdHJlYW1fdGltZSk7CisKKyAgICAgIGdzdF92aWRlb19mcmFtZV9tYXAgKCZmcmFtZSwgJm1peGNvbC0+YnVmZmVyX3ZpbmZvLCBtaXhjb2wtPmJ1ZmZlciwKKyAgICAgICAgICBHU1RfTUFQX1JFQUQpOworCisgICAgICBpZiAocGFkLT5jb252ZXJ0KSB7CisgICAgICAgIGdpbnQgY29udmVydGVkX3NpemU7CisKKyAgICAgICAgLyogV2Ugd2FpdCB1bnRpbCBoZXJlIHRvIHNldCB0aGUgY29udmVyc2lvbiBpbmZvcywgaW4gY2FzZSBtaXgtPmluZm8gY2hhbmdlZCAqLworICAgICAgICBpZiAocGFkLT5uZWVkX2NvbnZlcnNpb25fdXBkYXRlKSB7CisgICAgICAgICAgcGFkLT5jb252ZXJzaW9uX2luZm8gPSBtaXgtPmluZm87CisgICAgICAgICAgZ3N0X3ZpZGVvX2luZm9fc2V0X2Zvcm1hdCAoJihwYWQtPmNvbnZlcnNpb25faW5mbyksCisgICAgICAgICAgICAgIEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoJm1peC0+aW5mbyksIHBhZC0+aW5mby53aWR0aCwKKyAgICAgICAgICAgICAgcGFkLT5pbmZvLmhlaWdodCk7CisgICAgICAgICAgcGFkLT5uZWVkX2NvbnZlcnNpb25fdXBkYXRlID0gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBjb252ZXJ0ZWRfc2l6ZSA9IHBhZC0+Y29udmVyc2lvbl9pbmZvLnNpemU7CisgICAgICAgIGNvbnZlcnRlZF9zaXplID0gY29udmVydGVkX3NpemUgPiBvdXRzaXplID8gY29udmVydGVkX3NpemUgOiBvdXRzaXplOworICAgICAgICBjb252ZXJ0ZWRfYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIGNvbnZlcnRlZF9zaXplLCAmcGFyYW1zKTsKKworICAgICAgICBnc3RfdmlkZW9fZnJhbWVfbWFwICgmY29udmVydGVkX2ZyYW1lLCAmKHBhZC0+Y29udmVyc2lvbl9pbmZvKSwKKyAgICAgICAgICAgIGNvbnZlcnRlZF9idWYsIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgICAgICAgZ3N0X3ZpZGVvX2NvbnZlcnRlcl9mcmFtZSAocGFkLT5jb252ZXJ0LCAmZnJhbWUsICZjb252ZXJ0ZWRfZnJhbWUpOworICAgICAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKCZmcmFtZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb252ZXJ0ZWRfZnJhbWUgPSBmcmFtZTsKKyAgICAgIH0KKworICAgICAgY29tcG9zaXRlICgmY29udmVydGVkX2ZyYW1lLCBwYWQtPnhwb3MsIHBhZC0+eXBvcywgcGFkLT5hbHBoYSwgJm91dGZyYW1lKTsKKworICAgICAgaWYgKHBhZC0+Y29udmVydCkKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoY29udmVydGVkX2J1Zik7CisKKyAgICAgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJmNvbnZlcnRlZF9mcmFtZSk7CisgICAgfQorICB9CisgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJm91dGZyYW1lKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKKy8qIFBlcmZvcm0gcW9zIGNhbGN1bGF0aW9ucyBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgbmV4dCBmcmFtZS4gUmV0dXJucyBUUlVFIGlmCisgKiB0aGUgZnJhbWUgc2hvdWxkIGJlIHByb2Nlc3NlZCwgRkFMU0UgaWYgdGhlIGZyYW1lIGNhbiBiZSBkcm9wcGVkIGVudGlyZWx5ICovCitzdGF0aWMgZ2ludDY0Citnc3RfdmlkZW9taXhlcjJfZG9fcW9zIChHc3RWaWRlb01peGVyMiAqIG1peCwgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCkKK3sKKyAgR3N0Q2xvY2tUaW1lIHFvc3RpbWUsIGVhcmxpZXN0X3RpbWU7CisgIGdkb3VibGUgcHJvcG9ydGlvbjsKKyAgZ2ludDY0IGppdHRlcjsKKworICAvKiBubyB0aW1lc3RhbXAsIGNhbid0IGRvIFFvUyA9PiBwcm9jZXNzIGZyYW1lICovCisgIGlmIChHX1VOTElLRUxZICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHRpbWVzdGFtcCkpKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKG1peCwgImludmFsaWQgdGltZXN0YW1wLCBjYW4ndCBkbyBRb1MsIHByb2Nlc3MgZnJhbWUiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBnZXQgbGF0ZXN0IFFvUyBvYnNlcnZhdGlvbiB2YWx1ZXMgKi8KKyAgZ3N0X3ZpZGVvbWl4ZXIyX3JlYWRfcW9zIChtaXgsICZwcm9wb3J0aW9uLCAmZWFybGllc3RfdGltZSk7CisKKyAgLyogc2tpcCBxb3MgaWYgd2UgaGF2ZSBubyBvYnNlcnZhdGlvbiAoeWV0KSA9PiBwcm9jZXNzIGZyYW1lICovCisgIGlmIChHX1VOTElLRUxZICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGVhcmxpZXN0X3RpbWUpKSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChtaXgsICJubyBvYnNlcnZhdGlvbiB5ZXQsIHByb2Nlc3MgZnJhbWUiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBxb3MgaXMgZG9uZSBvbiBydW5uaW5nIHRpbWUgKi8KKyAgcW9zdGltZSA9CisgICAgICBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZtaXgtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgdGltZXN0YW1wKTsKKworICAvKiBzZWUgaG93IG91ciBuZXh0IHRpbWVzdGFtcCByZWxhdGVzIHRvIHRoZSBsYXRlc3QgcW9zIHRpbWVzdGFtcCAqLworICBHU1RfTE9HX09CSkVDVCAobWl4LCAicW9zdGltZSAlIiBHU1RfVElNRV9GT1JNQVQgIiwgZWFybGllc3QgJSIKKyAgICAgIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAocW9zdGltZSksIEdTVF9USU1FX0FSR1MgKGVhcmxpZXN0X3RpbWUpKTsKKworICBqaXR0ZXIgPSBHU1RfQ0xPQ0tfRElGRiAocW9zdGltZSwgZWFybGllc3RfdGltZSk7CisgIGlmIChxb3N0aW1lICE9IEdTVF9DTE9DS19USU1FX05PTkUgJiYgaml0dGVyID4gMCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1peCwgIndlIGFyZSBsYXRlLCBkcm9wIGZyYW1lIik7CisgICAgcmV0dXJuIGppdHRlcjsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChtaXgsICJwcm9jZXNzIGZyYW1lIik7CisgIHJldHVybiBqaXR0ZXI7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdmlkZW9taXhlcjJfY29sbGVjdGVkIChHc3RDb2xsZWN0UGFkcyAqIHBhZHMsIEdzdFZpZGVvTWl4ZXIyICogbWl4KQoreworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0Q2xvY2tUaW1lIG91dHB1dF9zdGFydF90aW1lLCBvdXRwdXRfZW5kX3RpbWU7CisgIEdzdEJ1ZmZlciAqb3V0YnVmID0gTlVMTDsKKyAgZ2ludCByZXM7CisgIGdpbnQ2NCBqaXR0ZXI7CisKKyAgLyogSWYgd2UncmUgbm90IG5lZ290aWF0ZWQgeWV0Li4uICovCisgIGlmIChHU1RfVklERU9fSU5GT19GT1JNQVQgKCZtaXgtPmluZm8pID09IEdTVF9WSURFT19GT1JNQVRfVU5LTk9XTikKKyAgICByZXR1cm4gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisKKyAgaWYgKG1peC0+c2VuZF9zdHJlYW1fc3RhcnQpIHsKKyAgICBnY2hhciBzX2lkWzMyXTsKKworICAgIC8qIHN0cmVhbS1zdGFydCAoRklYTUU6IGNyZWF0ZSBpZCBiYXNlZCBvbiBpbnB1dCBpZHMpICovCisgICAgZ19zbnByaW50ZiAoc19pZCwgc2l6ZW9mIChzX2lkKSwgIm1peC0lMDh4IiwgZ19yYW5kb21faW50ICgpKTsKKyAgICBpZiAoIWdzdF9wYWRfcHVzaF9ldmVudCAobWl4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0IChzX2lkKSkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobWl4LT5zcmNwYWQsICJTZW5kaW5nIHN0cmVhbSBzdGFydCBldmVudCBmYWlsZWQiKTsKKyAgICB9CisgICAgbWl4LT5zZW5kX3N0cmVhbV9zdGFydCA9IEZBTFNFOworICB9CisKKyAgaWYgKGdzdF9wYWRfY2hlY2tfcmVjb25maWd1cmUgKG1peC0+c3JjcGFkKSkKKyAgICBnc3RfdmlkZW9taXhlcjJfdXBkYXRlX3NyY19jYXBzIChtaXgpOworCisgIGlmIChtaXgtPnNlbmRfY2FwcykgeworICAgIGlmICghZ3N0X3BhZF9wdXNoX2V2ZW50IChtaXgtPnNyY3BhZCwKKyAgICAgICAgICAgIGdzdF9ldmVudF9uZXdfY2FwcyAobWl4LT5jdXJyZW50X2NhcHMpKSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtaXgtPnNyY3BhZCwgIlNlbmRpbmcgY2FwcyBldmVudCBmYWlsZWQiKTsKKyAgICB9CisgICAgbWl4LT5zZW5kX2NhcHMgPSBGQUxTRTsKKyAgfQorCisgIEdTVF9WSURFT19NSVhFUjJfTE9DSyAobWl4KTsKKworICBpZiAobWl4LT5uZXdzZWdfcGVuZGluZykgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1peCwgIlNlbmRpbmcgTkVXU0VHTUVOVCBldmVudCIpOworICAgIEdTVF9WSURFT19NSVhFUjJfVU5MT0NLIChtaXgpOworICAgIGlmICghZ3N0X3BhZF9wdXNoX2V2ZW50IChtaXgtPnNyY3BhZCwKKyAgICAgICAgICAgIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJm1peC0+c2VnbWVudCkpKSB7CisgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgIGdvdG8gZG9uZV91bmxvY2tlZDsKKyAgICB9CisgICAgR1NUX1ZJREVPX01JWEVSMl9MT0NLIChtaXgpOworICAgIG1peC0+bmV3c2VnX3BlbmRpbmcgPSBGQUxTRTsKKyAgfQorCisgIGlmIChtaXgtPnNlZ21lbnQucG9zaXRpb24gPT0gLTEpCisgICAgb3V0cHV0X3N0YXJ0X3RpbWUgPSBtaXgtPnNlZ21lbnQuc3RhcnQ7CisgIGVsc2UKKyAgICBvdXRwdXRfc3RhcnRfdGltZSA9IG1peC0+c2VnbWVudC5wb3NpdGlvbjsKKworICBvdXRwdXRfZW5kX3RpbWUgPQorICAgICAgbWl4LT50c19vZmZzZXQgKyBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKG1peC0+bmZyYW1lcyArIDEsCisgICAgICBHU1RfU0VDT05EICogR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZtaXgtPmluZm8pLAorICAgICAgR1NUX1ZJREVPX0lORk9fRlBTX04gKCZtaXgtPmluZm8pKSArIG1peC0+c2VnbWVudC5zdGFydDsKKworICBpZiAob3V0cHV0X2VuZF90aW1lID49IG1peC0+c2VnbWVudC5zdG9wKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAobWl4LCAiU2VnbWVudCBkb25lIik7CisgICAgaWYgKCEobWl4LT5zZWdtZW50LmZsYWdzICYgR1NUX1NFR01FTlRfRkxBR19TRUdNRU5UKSkgeworICAgICAgR1NUX1ZJREVPX01JWEVSMl9VTkxPQ0sgKG1peCk7CisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKG1peC0+c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisKKyAgICAgIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgICAgIGdvdG8gZG9uZV91bmxvY2tlZDsKKyAgICB9CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAobWl4LT5wZW5kaW5nX3RhZ3MpKSB7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChtaXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld190YWcgKG1peC0+cGVuZGluZ190YWdzKSk7CisgICAgbWl4LT5wZW5kaW5nX3RhZ3MgPSBOVUxMOworICB9CisKKyAgaWYgKG1peC0+c2VnbWVudC5zdG9wICE9IC0xKQorICAgIG91dHB1dF9lbmRfdGltZSA9IE1JTiAob3V0cHV0X2VuZF90aW1lLCBtaXgtPnNlZ21lbnQuc3RvcCk7CisKKyAgcmVzID0gZ3N0X3ZpZGVvbWl4ZXIyX2ZpbGxfcXVldWVzIChtaXgsIG91dHB1dF9zdGFydF90aW1lLCBvdXRwdXRfZW5kX3RpbWUpOworCisgIGlmIChyZXMgPT0gMCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1peCwgIk5lZWQgbW9yZSBkYXRhIGZvciBkZWNpc2lvbnMiKTsKKyAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICBnb3RvIGRvbmU7CisgIH0gZWxzZSBpZiAocmVzID09IC0xKSB7CisgICAgR1NUX1ZJREVPX01JWEVSMl9VTkxPQ0sgKG1peCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAobWl4LCAiQWxsIHNpbmtwYWRzIGFyZSBFT1MgLS0gZm9yd2FyZGluZyIpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAobWl4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FT1M7CisgICAgZ290byBkb25lX3VubG9ja2VkOworICB9IGVsc2UgaWYgKHJlcyA9PSAtMikgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKG1peCwgIkVycm9yIGNvbGxlY3RpbmcgYnVmZmVycyIpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGppdHRlciA9IGdzdF92aWRlb21peGVyMl9kb19xb3MgKG1peCwgb3V0cHV0X3N0YXJ0X3RpbWUpOworICBpZiAoaml0dGVyIDw9IDApIHsKKyAgICByZXQgPQorICAgICAgICBnc3RfdmlkZW9taXhlcjJfYmxlbmRfYnVmZmVycyAobWl4LCBvdXRwdXRfc3RhcnRfdGltZSwKKyAgICAgICAgb3V0cHV0X2VuZF90aW1lLCAmb3V0YnVmKTsKKyAgICBtaXgtPnFvc19wcm9jZXNzZWQrKzsKKyAgfSBlbHNlIHsKKyAgICBHc3RNZXNzYWdlICptc2c7CisKKyAgICBtaXgtPnFvc19kcm9wcGVkKys7CisKKyAgICAvKiBUT0RPOiBsaXZlICovCisgICAgbXNnID0KKyAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X3FvcyAoR1NUX09CSkVDVF9DQVNUIChtaXgpLCBGQUxTRSwKKyAgICAgICAgZ3N0X3NlZ21lbnRfdG9fcnVubmluZ190aW1lICgmbWl4LT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgICBvdXRwdXRfc3RhcnRfdGltZSksIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmbWl4LT5zZWdtZW50LAorICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBvdXRwdXRfc3RhcnRfdGltZSksIG91dHB1dF9zdGFydF90aW1lLAorICAgICAgICBvdXRwdXRfZW5kX3RpbWUgLSBvdXRwdXRfc3RhcnRfdGltZSk7CisgICAgZ3N0X21lc3NhZ2Vfc2V0X3Fvc192YWx1ZXMgKG1zZywgaml0dGVyLCBtaXgtPnByb3BvcnRpb24sIDEwMDAwMDApOworICAgIGdzdF9tZXNzYWdlX3NldF9xb3Nfc3RhdHMgKG1zZywgR1NUX0ZPUk1BVF9CVUZGRVJTLCBtaXgtPnFvc19wcm9jZXNzZWQsCisgICAgICAgIG1peC0+cW9zX2Ryb3BwZWQpOworICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAobWl4KSwgbXNnKTsKKworICAgIHJldCA9IEdTVF9GTE9XX09LOworICB9CisKKyAgbWl4LT5zZWdtZW50LnBvc2l0aW9uID0gb3V0cHV0X2VuZF90aW1lOworICBtaXgtPm5mcmFtZXMrKzsKKworICBHU1RfVklERU9fTUlYRVIyX1VOTE9DSyAobWl4KTsKKyAgaWYgKG91dGJ1ZikgeworICAgIEdTVF9MT0dfT0JKRUNUIChtaXgsCisgICAgICAgICJQdXNoaW5nIGJ1ZmZlciB3aXRoIHRzICUiIEdTVF9USU1FX0ZPUk1BVCAiIGFuZCBkdXJhdGlvbiAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpKSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSkpOworICAgIHJldCA9IGdzdF9wYWRfcHVzaCAobWl4LT5zcmNwYWQsIG91dGJ1Zik7CisgIH0KKyAgZ290byBkb25lX3VubG9ja2VkOworCitkb25lOgorICBHU1RfVklERU9fTUlYRVIyX1VOTE9DSyAobWl4KTsKKworZG9uZV91bmxvY2tlZDoKKyAgcmV0dXJuIHJldDsKK30KKworLyogRklYTUUsIHRoZSBkdXJhdGlvbiBxdWVyeSBzaG91bGQgcmVmbGVjdCBob3cgbG9uZyB5b3Ugd2lsbCBwcm9kdWNlCisgKiBkYXRhLCB0aGF0IGlzIHRoZSBhbW91bnQgb2Ygc3RyZWFtIHRpbWUgdW50aWwgeW91IHdpbGwgZW1pdCBFT1MuCisgKgorICogRm9yIHN5bmNocm9uaXplZCBtaXhpbmcgdGhpcyBpcyBhbHdheXMgdGhlIG1heCBvZiBhbGwgdGhlIGR1cmF0aW9ucworICogb2YgdXBzdHJlYW0gc2luY2Ugd2UgZW1pdCBFT1Mgd2hlbiBhbGwgb2YgdGhlbSBmaW5pc2hlZC4KKyAqCisgKiBXZSBkb24ndCBkbyBzeW5jaHJvbml6ZWQgbWl4aW5nIHNvIHRoaXMgcmVhbGx5IGRlcGVuZHMgb24gd2hlcmUgdGhlCisgKiBzdHJlYW1zIHdoZXJlIHB1bmNoZWQgaW4gYW5kIHdoYXQgdGhlaXIgcmVsYXRpdmUgb2Zmc2V0cyBhcmUgYWdhaW5zdAorICogZWFjaG90aGVyIHdoaWNoIHdlIGNhbiBnZXQgZnJvbSB0aGUgZmlyc3QgdGltZXN0YW1wcyB3ZSBzZWUuCisgKgorICogV2hlbiB3ZSBhZGQgYSBuZXcgc3RyZWFtIChvciByZW1vdmUgYSBzdHJlYW0pIHRoZSBkdXJhdGlvbiBtaWdodAorICogYWxzbyBiZWNvbWUgaW52YWxpZCBhZ2FpbiBhbmQgd2UgbmVlZCB0byBwb3N0IGEgbmV3IERVUkFUSU9OCisgKiBtZXNzYWdlIHRvIG5vdGlmeSB0aGlzIGZhY3QgdG8gdGhlIHBhcmVudC4KKyAqIEZvciBub3cgd2UgdGFrZSB0aGUgbWF4IG9mIGFsbCB0aGUgdXBzdHJlYW0gZWxlbWVudHMgc28gdGhlIHNpbXBsZQorICogY2FzZXMgd29yayBhdCBsZWFzdCBzb21ld2hhdC4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9taXhlcjJfcXVlcnlfZHVyYXRpb24gKEdzdFZpZGVvTWl4ZXIyICogbWl4LCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHVmFsdWUgaXRlbSA9IHsgMCB9OworICBnaW50NjQgbWF4OworICBnYm9vbGVhbiByZXM7CisgIEdzdEZvcm1hdCBmb3JtYXQ7CisgIEdzdEl0ZXJhdG9yICppdDsKKyAgZ2Jvb2xlYW4gZG9uZTsKKworICAvKiBwYXJzZSBmb3JtYXQgKi8KKyAgZ3N0X3F1ZXJ5X3BhcnNlX2R1cmF0aW9uIChxdWVyeSwgJmZvcm1hdCwgTlVMTCk7CisKKyAgbWF4ID0gLTE7CisgIHJlcyA9IFRSVUU7CisgIGRvbmUgPSBGQUxTRTsKKworICAvKiBUYWtlIG1heGltdW0gb2YgYWxsIGR1cmF0aW9ucyAqLworICBpdCA9IGdzdF9lbGVtZW50X2l0ZXJhdGVfc2lua19wYWRzIChHU1RfRUxFTUVOVF9DQVNUIChtaXgpKTsKKyAgd2hpbGUgKCFkb25lKSB7CisgICAgc3dpdGNoIChnc3RfaXRlcmF0b3JfbmV4dCAoaXQsICZpdGVtKSkgeworICAgICAgY2FzZSBHU1RfSVRFUkFUT1JfRE9ORToKKyAgICAgICAgZG9uZSA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfSVRFUkFUT1JfT0s6CisgICAgICB7CisgICAgICAgIEdzdFBhZCAqcGFkOworICAgICAgICBnaW50NjQgZHVyYXRpb247CisKKyAgICAgICAgcGFkID0gZ192YWx1ZV9nZXRfb2JqZWN0ICgmaXRlbSk7CisKKyAgICAgICAgLyogYXNrIHNpbmsgcGVlciBmb3IgZHVyYXRpb24gKi8KKyAgICAgICAgcmVzICY9IGdzdF9wYWRfcGVlcl9xdWVyeV9kdXJhdGlvbiAocGFkLCBmb3JtYXQsICZkdXJhdGlvbik7CisgICAgICAgIC8qIHRha2UgbWF4IGZyb20gYWxsIHZhbGlkIHJldHVybiB2YWx1ZXMgKi8KKyAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgIC8qIHZhbGlkIHVua25vd24gbGVuZ3RoLCBzdG9wIHNlYXJjaGluZyAqLworICAgICAgICAgIGlmIChkdXJhdGlvbiA9PSAtMSkgeworICAgICAgICAgICAgbWF4ID0gZHVyYXRpb247CisgICAgICAgICAgICBkb25lID0gVFJVRTsKKyAgICAgICAgICB9CisgICAgICAgICAgLyogZWxzZSBzZWUgaWYgYmlnZ2VyIHRoYW4gY3VycmVudCBtYXggKi8KKyAgICAgICAgICBlbHNlIGlmIChkdXJhdGlvbiA+IG1heCkKKyAgICAgICAgICAgIG1heCA9IGR1cmF0aW9uOworICAgICAgICB9CisgICAgICAgIGdfdmFsdWVfcmVzZXQgKCZpdGVtKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEdTVF9JVEVSQVRPUl9SRVNZTkM6CisgICAgICAgIG1heCA9IC0xOworICAgICAgICByZXMgPSBUUlVFOworICAgICAgICBnc3RfaXRlcmF0b3JfcmVzeW5jIChpdCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICAgIGRvbmUgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZ192YWx1ZV91bnNldCAoJml0ZW0pOworICBnc3RfaXRlcmF0b3JfZnJlZSAoaXQpOworCisgIGlmIChyZXMpIHsKKyAgICAvKiBhbmQgc3RvcmUgdGhlIG1heCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1peCwgIlRvdGFsIGR1cmF0aW9uIGluIGZvcm1hdCAlczogJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFULCBnc3RfZm9ybWF0X2dldF9uYW1lIChmb3JtYXQpLCBHU1RfVElNRV9BUkdTIChtYXgpKTsKKyAgICBnc3RfcXVlcnlfc2V0X2R1cmF0aW9uIChxdWVyeSwgZm9ybWF0LCBtYXgpOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9taXhlcjJfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0VmlkZW9NaXhlcjIgKm1peCA9IEdTVF9WSURFT19NSVhFUjIgKHBhcmVudCk7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX1BPU0lUSU9OOgorICAgIHsKKyAgICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9wb3NpdGlvbiAocXVlcnksICZmb3JtYXQsIE5VTEwpOworCisgICAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfVElNRToKKyAgICAgICAgICBnc3RfcXVlcnlfc2V0X3Bvc2l0aW9uIChxdWVyeSwgZm9ybWF0LAorICAgICAgICAgICAgICBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJm1peC0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICAgICAgICAgICAgbWl4LT5zZWdtZW50LnBvc2l0aW9uKSk7CisgICAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9EVVJBVElPTjoKKyAgICAgIHJlcyA9IGdzdF92aWRlb21peGVyMl9xdWVyeV9kdXJhdGlvbiAobWl4LCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9RVUVSWV9DQVBTOgorICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIEZJWE1FLCBuZWVkcyBhIGN1c3RvbSBxdWVyeSBoYW5kbGVyIGJlY2F1c2Ugd2UgaGF2ZSBtdWx0aXBsZQorICAgICAgICogc2lua3BhZHMgKi8KKyAgICAgIHJlcyA9IEZBTFNFOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9taXhlcjJfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0VmlkZW9NaXhlcjIgKm1peCA9IEdTVF9WSURFT19NSVhFUjIgKHBhcmVudCk7CisgIGdib29sZWFuIHJlc3VsdDsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9RT1M6CisgICAgeworICAgICAgR3N0UU9TVHlwZSB0eXBlOworICAgICAgR3N0Q2xvY2tUaW1lRGlmZiBkaWZmOworICAgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKyAgICAgIGdkb3VibGUgcHJvcG9ydGlvbjsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3FvcyAoZXZlbnQsICZ0eXBlLCAmcHJvcG9ydGlvbiwgJmRpZmYsICZ0aW1lc3RhbXApOworCisgICAgICBnc3RfdmlkZW9taXhlcjJfdXBkYXRlX3FvcyAobWl4LCBwcm9wb3J0aW9uLCBkaWZmLCB0aW1lc3RhbXApOworCisgICAgICByZXN1bHQgPSBnc3RfdmlkZW9taXhlcjJfcHVzaF9zaW5rX2V2ZW50IChtaXgsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9TRUVLOgorICAgIHsKKyAgICAgIGdkb3VibGUgcmF0ZTsKKyAgICAgIEdzdEZvcm1hdCBmbXQ7CisgICAgICBHc3RTZWVrRmxhZ3MgZmxhZ3M7CisgICAgICBHc3RTZWVrVHlwZSBzdGFydF90eXBlLCBzdG9wX3R5cGU7CisgICAgICBnaW50NjQgc3RhcnQsIHN0b3A7CisgICAgICBHU0xpc3QgKmw7CisgICAgICBnZG91YmxlIGFic19yYXRlOworCisgICAgICAvKiBwYXJzZSB0aGUgc2VlayBwYXJhbWV0ZXJzICovCisgICAgICBnc3RfZXZlbnRfcGFyc2Vfc2VlayAoZXZlbnQsICZyYXRlLCAmZm10LCAmZmxhZ3MsICZzdGFydF90eXBlLAorICAgICAgICAgICZzdGFydCwgJnN0b3BfdHlwZSwgJnN0b3ApOworCisgICAgICBpZiAocmF0ZSA8PSAwLjApIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAobWl4LCAiTmVnYXRpdmUgcmF0ZXMgbm90IHN1cHBvcnRlZCB5ZXQiKTsKKyAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAobWl4LCAiSGFuZGxpbmcgU0VFSyBldmVudCIpOworCisgICAgICBhYnNfcmF0ZSA9IEFCUyAocmF0ZSk7CisKKyAgICAgIEdTVF9WSURFT19NSVhFUjJfTE9DSyAobWl4KTsKKyAgICAgIGZvciAobCA9IG1peC0+c2lua3BhZHM7IGw7IGwgPSBsLT5uZXh0KSB7CisgICAgICAgIEdzdFZpZGVvTWl4ZXIyUGFkICpwID0gbC0+ZGF0YTsKKworICAgICAgICBpZiAoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX0ZMVVNIKSB7CisgICAgICAgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmcC0+bWl4Y29sLT5idWZmZXIsIE5VTEwpOworICAgICAgICAgIHAtPm1peGNvbC0+c3RhcnRfdGltZSA9IHAtPm1peGNvbC0+ZW5kX3RpbWUgPSAtMTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbnZlcnQgdG8gdGhlIG91dHB1dCBzZWdtZW50IHJhdGUgKi8KKyAgICAgICAgaWYgKEFCUyAobWl4LT5zZWdtZW50LnJhdGUpICE9IGFic19yYXRlKSB7CisgICAgICAgICAgaWYgKEFCUyAobWl4LT5zZWdtZW50LnJhdGUpICE9IDEuMCAmJiBwLT5taXhjb2wtPmJ1ZmZlcikgeworICAgICAgICAgICAgcC0+bWl4Y29sLT5zdGFydF90aW1lIC89IEFCUyAobWl4LT5zZWdtZW50LnJhdGUpOworICAgICAgICAgICAgcC0+bWl4Y29sLT5lbmRfdGltZSAvPSBBQlMgKG1peC0+c2VnbWVudC5yYXRlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGFic19yYXRlICE9IDEuMCAmJiBwLT5taXhjb2wtPmJ1ZmZlcikgeworICAgICAgICAgICAgcC0+bWl4Y29sLT5zdGFydF90aW1lICo9IGFic19yYXRlOworICAgICAgICAgICAgcC0+bWl4Y29sLT5lbmRfdGltZSAqPSBhYnNfcmF0ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEdTVF9WSURFT19NSVhFUjJfVU5MT0NLIChtaXgpOworCisgICAgICBnc3Rfc2VnbWVudF9kb19zZWVrICgmbWl4LT5zZWdtZW50LCByYXRlLCBmbXQsIGZsYWdzLCBzdGFydF90eXBlLCBzdGFydCwKKyAgICAgICAgICBzdG9wX3R5cGUsIHN0b3AsIE5VTEwpOworICAgICAgbWl4LT5zZWdtZW50LnBvc2l0aW9uID0gLTE7CisgICAgICBtaXgtPnRzX29mZnNldCA9IDA7CisgICAgICBtaXgtPm5mcmFtZXMgPSAwOworICAgICAgbWl4LT5uZXdzZWdfcGVuZGluZyA9IFRSVUU7CisKKyAgICAgIGdzdF92aWRlb21peGVyMl9yZXNldF9xb3MgKG1peCk7CisKKyAgICAgIHJlc3VsdCA9IGdzdF9jb2xsZWN0X3BhZHNfc3JjX2V2ZW50X2RlZmF1bHQgKG1peC0+Y29sbGVjdCwgcGFkLCBldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfTkFWSUdBVElPTjoKKyAgICAgIC8qIG5hdmlnYXRpb24gaXMgcmF0aGVyIHBvaW50bGVzcy4gKi8KKyAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyoganVzdCBmb3J3YXJkIHRoZSByZXN0IGZvciBub3cgKi8KKyAgICAgIHJlc3VsdCA9IGdzdF92aWRlb21peGVyMl9wdXNoX3NpbmtfZXZlbnQgKG1peCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92aWRlb21peGVyMl9zcmNfc2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RWaWRlb01peGVyMiAqIG1peCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworICBHc3RWaWRlb0luZm8gaW5mbzsKKworICBHU1RfSU5GT19PQkpFQ1QgKHBhZCwgInNldCBzcmMgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIGlmICghZ3N0X3ZpZGVvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgY2FwcykpCisgICAgZ290byBkb25lOworCisgIEdTVF9WSURFT19NSVhFUjJfTE9DSyAobWl4KTsKKworICBtaXgtPmJsZW5kID0gTlVMTDsKKyAgbWl4LT5vdmVybGF5ID0gTlVMTDsKKyAgbWl4LT5maWxsX2NoZWNrZXIgPSBOVUxMOworICBtaXgtPmZpbGxfY29sb3IgPSBOVUxMOworCisgIGlmIChHU1RfVklERU9fSU5GT19GUFNfTiAoJm1peC0+aW5mbykgIT0gR1NUX1ZJREVPX0lORk9fRlBTX04gKCZpbmZvKSB8fAorICAgICAgR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZtaXgtPmluZm8pICE9IEdTVF9WSURFT19JTkZPX0ZQU19EICgmaW5mbykpIHsKKyAgICBpZiAobWl4LT5zZWdtZW50LnBvc2l0aW9uICE9IC0xKSB7CisgICAgICBtaXgtPnRzX29mZnNldCA9IG1peC0+c2VnbWVudC5wb3NpdGlvbiAtIG1peC0+c2VnbWVudC5zdGFydDsKKyAgICAgIG1peC0+bmZyYW1lcyA9IDA7CisgICAgfQorICAgIGdzdF92aWRlb21peGVyMl9yZXNldF9xb3MgKG1peCk7CisgIH0KKworICBtaXgtPmluZm8gPSBpbmZvOworCisgIHN3aXRjaCAoR1NUX1ZJREVPX0lORk9fRk9STUFUICgmbWl4LT5pbmZvKSkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgbWl4LT5ibGVuZCA9IGdzdF92aWRlb19taXhlcl9ibGVuZF9heXV2OworICAgICAgbWl4LT5vdmVybGF5ID0gZ3N0X3ZpZGVvX21peGVyX292ZXJsYXlfYXl1djsKKyAgICAgIG1peC0+ZmlsbF9jaGVja2VyID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9heXV2OworICAgICAgbWl4LT5maWxsX2NvbG9yID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYXl1djsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICAgIG1peC0+YmxlbmQgPSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYXJnYjsKKyAgICAgIG1peC0+b3ZlcmxheSA9IGdzdF92aWRlb19taXhlcl9vdmVybGF5X2FyZ2I7CisgICAgICBtaXgtPmZpbGxfY2hlY2tlciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfYXJnYjsKKyAgICAgIG1peC0+ZmlsbF9jb2xvciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX2FyZ2I7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgICBtaXgtPmJsZW5kID0gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX2JncmE7CisgICAgICBtaXgtPm92ZXJsYXkgPSBnc3RfdmlkZW9fbWl4ZXJfb3ZlcmxheV9iZ3JhOworICAgICAgbWl4LT5maWxsX2NoZWNrZXIgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX2JncmE7CisgICAgICBtaXgtPmZpbGxfY29sb3IgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl9iZ3JhOworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BQkdSOgorICAgICAgbWl4LT5ibGVuZCA9IGdzdF92aWRlb19taXhlcl9ibGVuZF9hYmdyOworICAgICAgbWl4LT5vdmVybGF5ID0gZ3N0X3ZpZGVvX21peGVyX292ZXJsYXlfYWJncjsKKyAgICAgIG1peC0+ZmlsbF9jaGVja2VyID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9hYmdyOworICAgICAgbWl4LT5maWxsX2NvbG9yID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYWJncjsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICAgIG1peC0+YmxlbmQgPSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfcmdiYTsKKyAgICAgIG1peC0+b3ZlcmxheSA9IGdzdF92aWRlb19taXhlcl9vdmVybGF5X3JnYmE7CisgICAgICBtaXgtPmZpbGxfY2hlY2tlciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfcmdiYTsKKyAgICAgIG1peC0+ZmlsbF9jb2xvciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX3JnYmE7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0NDQ6CisgICAgICBtaXgtPmJsZW5kID0gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3k0NDQ7CisgICAgICBtaXgtPm92ZXJsYXkgPSBtaXgtPmJsZW5kOworICAgICAgbWl4LT5maWxsX2NoZWNrZXIgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3k0NDQ7CisgICAgICBtaXgtPmZpbGxfY29sb3IgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl95NDQ0OworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOgorICAgICAgbWl4LT5ibGVuZCA9IGdzdF92aWRlb19taXhlcl9ibGVuZF95NDJiOworICAgICAgbWl4LT5vdmVybGF5ID0gbWl4LT5ibGVuZDsKKyAgICAgIG1peC0+ZmlsbF9jaGVja2VyID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl95NDJiOworICAgICAgbWl4LT5maWxsX2NvbG9yID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeTQyYjsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVVZMjoKKyAgICAgIG1peC0+YmxlbmQgPSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfeXV5MjsKKyAgICAgIG1peC0+b3ZlcmxheSA9IG1peC0+YmxlbmQ7CisgICAgICBtaXgtPmZpbGxfY2hlY2tlciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfeXV5MjsKKyAgICAgIG1peC0+ZmlsbF9jb2xvciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX3l1eTI7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICBtaXgtPmJsZW5kID0gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3V5dnk7CisgICAgICBtaXgtPm92ZXJsYXkgPSBtaXgtPmJsZW5kOworICAgICAgbWl4LT5maWxsX2NoZWNrZXIgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3V5dnk7CisgICAgICBtaXgtPmZpbGxfY29sb3IgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl91eXZ5OworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVllVOgorICAgICAgbWl4LT5ibGVuZCA9IGdzdF92aWRlb19taXhlcl9ibGVuZF95dnl1OworICAgICAgbWl4LT5vdmVybGF5ID0gbWl4LT5ibGVuZDsKKyAgICAgIG1peC0+ZmlsbF9jaGVja2VyID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl95dnl1OworICAgICAgbWl4LT5maWxsX2NvbG9yID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeXZ5dTsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfSTQyMDoKKyAgICAgIG1peC0+YmxlbmQgPSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfaTQyMDsKKyAgICAgIG1peC0+b3ZlcmxheSA9IG1peC0+YmxlbmQ7CisgICAgICBtaXgtPmZpbGxfY2hlY2tlciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfaTQyMDsKKyAgICAgIG1peC0+ZmlsbF9jb2xvciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX2k0MjA7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWMTI6CisgICAgICBtaXgtPmJsZW5kID0gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3l2MTI7CisgICAgICBtaXgtPm92ZXJsYXkgPSBtaXgtPmJsZW5kOworICAgICAgbWl4LT5maWxsX2NoZWNrZXIgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3l2MTI7CisgICAgICBtaXgtPmZpbGxfY29sb3IgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl95djEyOworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9OVjEyOgorICAgICAgbWl4LT5ibGVuZCA9IGdzdF92aWRlb19taXhlcl9ibGVuZF9udjEyOworICAgICAgbWl4LT5vdmVybGF5ID0gbWl4LT5ibGVuZDsKKyAgICAgIG1peC0+ZmlsbF9jaGVja2VyID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9udjEyOworICAgICAgbWl4LT5maWxsX2NvbG9yID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfbnYxMjsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYyMToKKyAgICAgIG1peC0+YmxlbmQgPSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfbnYyMTsKKyAgICAgIG1peC0+b3ZlcmxheSA9IG1peC0+YmxlbmQ7CisgICAgICBtaXgtPmZpbGxfY2hlY2tlciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfbnYyMTsKKyAgICAgIG1peC0+ZmlsbF9jb2xvciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX252MjE7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MUI6CisgICAgICBtaXgtPmJsZW5kID0gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3k0MWI7CisgICAgICBtaXgtPm92ZXJsYXkgPSBtaXgtPmJsZW5kOworICAgICAgbWl4LT5maWxsX2NoZWNrZXIgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3k0MWI7CisgICAgICBtaXgtPmZpbGxfY29sb3IgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl95NDFiOworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgICBtaXgtPmJsZW5kID0gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3JnYjsKKyAgICAgIG1peC0+b3ZlcmxheSA9IG1peC0+YmxlbmQ7CisgICAgICBtaXgtPmZpbGxfY2hlY2tlciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfcmdiOworICAgICAgbWl4LT5maWxsX2NvbG9yID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfcmdiOworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1I6CisgICAgICBtaXgtPmJsZW5kID0gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX2JncjsKKyAgICAgIG1peC0+b3ZlcmxheSA9IG1peC0+YmxlbmQ7CisgICAgICBtaXgtPmZpbGxfY2hlY2tlciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfYmdyOworICAgICAgbWl4LT5maWxsX2NvbG9yID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYmdyOworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94UkdCOgorICAgICAgbWl4LT5ibGVuZCA9IGdzdF92aWRlb19taXhlcl9ibGVuZF94cmdiOworICAgICAgbWl4LT5vdmVybGF5ID0gbWl4LT5ibGVuZDsKKyAgICAgIG1peC0+ZmlsbF9jaGVja2VyID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl94cmdiOworICAgICAgbWl4LT5maWxsX2NvbG9yID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeHJnYjsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeEJHUjoKKyAgICAgIG1peC0+YmxlbmQgPSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfeGJncjsKKyAgICAgIG1peC0+b3ZlcmxheSA9IG1peC0+YmxlbmQ7CisgICAgICBtaXgtPmZpbGxfY2hlY2tlciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfeGJncjsKKyAgICAgIG1peC0+ZmlsbF9jb2xvciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX3hiZ3I7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQng6CisgICAgICBtaXgtPmJsZW5kID0gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3JnYng7CisgICAgICBtaXgtPm92ZXJsYXkgPSBtaXgtPmJsZW5kOworICAgICAgbWl4LT5maWxsX2NoZWNrZXIgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3JnYng7CisgICAgICBtaXgtPmZpbGxfY29sb3IgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl9yZ2J4OworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1J4OgorICAgICAgbWl4LT5ibGVuZCA9IGdzdF92aWRlb19taXhlcl9ibGVuZF9iZ3J4OworICAgICAgbWl4LT5vdmVybGF5ID0gbWl4LT5ibGVuZDsKKyAgICAgIG1peC0+ZmlsbF9jaGVja2VyID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9iZ3J4OworICAgICAgbWl4LT5maWxsX2NvbG9yID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYmdyeDsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgR1NUX1ZJREVPX01JWEVSMl9VTkxPQ0sgKG1peCk7CisKKyAgaWYgKG1peC0+Y3VycmVudF9jYXBzID09IE5VTEwgfHwKKyAgICAgIGdzdF9jYXBzX2lzX2VxdWFsIChjYXBzLCBtaXgtPmN1cnJlbnRfY2FwcykgPT0gRkFMU0UpIHsKKyAgICBnc3RfY2Fwc19yZXBsYWNlICgmbWl4LT5jdXJyZW50X2NhcHMsIGNhcHMpOworICAgIG1peC0+c2VuZF9jYXBzID0gVFJVRTsKKyAgfQorCitkb25lOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3ZpZGVvbWl4ZXIyX3NpbmtfY2xpcCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLAorICAgIEdzdENvbGxlY3REYXRhICogZGF0YSwgR3N0QnVmZmVyICogYnVmLCBHc3RCdWZmZXIgKiogb3V0YnVmLAorICAgIEdzdFZpZGVvTWl4ZXIyICogbWl4KQoreworICBHc3RWaWRlb01peGVyMlBhZCAqcGFkID0gR1NUX1ZJREVPX01JWEVSMl9QQUQgKGRhdGEtPnBhZCk7CisgIEdzdFZpZGVvTWl4ZXIyQ29sbGVjdCAqbWl4Y29sID0gcGFkLT5taXhjb2w7CisgIEdzdENsb2NrVGltZSBzdGFydF90aW1lLCBlbmRfdGltZTsKKworICBzdGFydF90aW1lID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1Zik7CisgIGlmIChzdGFydF90aW1lID09IC0xKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocGFkLCAiVGltZXN0YW1wZWQgYnVmZmVycyByZXF1aXJlZCEiKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIGVuZF90aW1lID0gR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKTsKKyAgaWYgKGVuZF90aW1lID09IC0xICYmIEdTVF9WSURFT19JTkZPX0ZQU19OICgmcGFkLT5pbmZvKSAhPSAwKQorICAgIGVuZF90aW1lID0KKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludF9yb3VuZCAoR1NUX1NFQ09ORCwKKyAgICAgICAgR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZwYWQtPmluZm8pLCBHU1RfVklERU9fSU5GT19GUFNfTiAoJnBhZC0+aW5mbykpOworICBpZiAoZW5kX3RpbWUgPT0gLTEpIHsKKyAgICAqb3V0YnVmID0gYnVmOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorCisgIHN0YXJ0X3RpbWUgPSBNQVggKHN0YXJ0X3RpbWUsIG1peGNvbC0+Y29sbGVjdC5zZWdtZW50LnN0YXJ0KTsKKyAgc3RhcnRfdGltZSA9CisgICAgICBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZtaXhjb2wtPmNvbGxlY3Quc2VnbWVudCwKKyAgICAgIEdTVF9GT1JNQVRfVElNRSwgc3RhcnRfdGltZSk7CisKKyAgZW5kX3RpbWUgKz0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1Zik7CisgIGlmIChtaXhjb2wtPmNvbGxlY3Quc2VnbWVudC5zdG9wICE9IC0xKQorICAgIGVuZF90aW1lID0gTUlOIChlbmRfdGltZSwgbWl4Y29sLT5jb2xsZWN0LnNlZ21lbnQuc3RvcCk7CisgIGVuZF90aW1lID0KKyAgICAgIGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJm1peGNvbC0+Y29sbGVjdC5zZWdtZW50LAorICAgICAgR1NUX0ZPUk1BVF9USU1FLCBlbmRfdGltZSk7CisKKyAgLyogQ29udmVydCB0byB0aGUgb3V0cHV0IHNlZ21lbnQgcmF0ZSAqLworICBpZiAoQUJTIChtaXgtPnNlZ21lbnQucmF0ZSkgIT0gMS4wKSB7CisgICAgc3RhcnRfdGltZSAqPSBBQlMgKG1peC0+c2VnbWVudC5yYXRlKTsKKyAgICBlbmRfdGltZSAqPSBBQlMgKG1peC0+c2VnbWVudC5yYXRlKTsKKyAgfQorCisgIGlmIChtaXhjb2wtPmJ1ZmZlciAhPSBOVUxMICYmIGVuZF90aW1lIDwgbWl4Y29sLT5lbmRfdGltZSkgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgKm91dGJ1ZiA9IE5VTEw7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CisKKyAgKm91dGJ1ZiA9IGJ1ZjsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvbWl4ZXIyX2ZsdXNoIChHc3RDb2xsZWN0UGFkcyAqIHBhZHMsIEdzdFZpZGVvTWl4ZXIyICogbWl4KQoreworICBpZiAobWl4LT5wZW5kaW5nX3RhZ3MpIHsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKG1peC0+cGVuZGluZ190YWdzKTsKKyAgICBtaXgtPnBlbmRpbmdfdGFncyA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9taXhlcjJfc2lua19ldmVudCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLCBHc3RDb2xsZWN0RGF0YSAqIGNkYXRhLAorICAgIEdzdEV2ZW50ICogZXZlbnQsIEdzdFZpZGVvTWl4ZXIyICogbWl4KQoreworICBHc3RWaWRlb01peGVyMlBhZCAqcGFkID0gR1NUX1ZJREVPX01JWEVSMl9QQUQgKGNkYXRhLT5wYWQpOworICBnYm9vbGVhbiByZXQgPSBUUlVFLCBkaXNjYXJkID0gRkFMU0U7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiR290ICVzIGV2ZW50OiAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSwgZXZlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICByZXQgPQorICAgICAgICAgIGdzdF92aWRlb21peGVyMl9wYWRfc2lua19zZXRjYXBzIChHU1RfUEFEIChwYWQpLCBHU1RfT0JKRUNUIChtaXgpLAorICAgICAgICAgIGNhcHMpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBldmVudCA9IE5VTEw7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDp7CisgICAgICBHc3RTZWdtZW50IHNlZzsKKyAgICAgIGdzdF9ldmVudF9jb3B5X3NlZ21lbnQgKGV2ZW50LCAmc2VnKTsKKworICAgICAgZ19hc3NlcnQgKHNlZy5mb3JtYXQgPT0gR1NUX0ZPUk1BVF9USU1FKTsKKyAgICAgIGdzdF92aWRlb21peGVyMl9yZXNldF9xb3MgKG1peCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIG1peC0+bmV3c2VnX3BlbmRpbmcgPSBUUlVFOworCisgICAgICBnc3RfdmlkZW9taXhlcjJfcmVzZXRfcW9zIChtaXgpOworICAgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmcGFkLT5taXhjb2wtPmJ1ZmZlciwgTlVMTCk7CisgICAgICBwYWQtPm1peGNvbC0+c3RhcnRfdGltZSA9IC0xOworICAgICAgcGFkLT5taXhjb2wtPmVuZF90aW1lID0gLTE7CisKKyAgICAgIG1peC0+c2VnbWVudC5wb3NpdGlvbiA9IC0xOworICAgICAgbWl4LT50c19vZmZzZXQgPSAwOworICAgICAgbWl4LT5uZnJhbWVzID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX1RBRzoKKyAgICB7CisgICAgICAvKiBjb2xsZWN0IHRhZ3MgaGVyZSBzbyB3ZSBjYW4gcHVzaCB0aGVtIG91dCB3aGVuIHdlIGNvbGxlY3QgZGF0YSAqLworICAgICAgR3N0VGFnTGlzdCAqdGFnczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3RhZyAoZXZlbnQsICZ0YWdzKTsKKyAgICAgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfbWVyZ2UgKG1peC0+cGVuZGluZ190YWdzLCB0YWdzLCBHU1RfVEFHX01FUkdFX0FQUEVORCk7CisgICAgICBpZiAobWl4LT5wZW5kaW5nX3RhZ3MpCisgICAgICAgIGdzdF90YWdfbGlzdF91bnJlZiAobWl4LT5wZW5kaW5nX3RhZ3MpOworICAgICAgbWl4LT5wZW5kaW5nX3RhZ3MgPSB0YWdzOworICAgICAgZXZlbnQgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChldmVudCAhPSBOVUxMKQorICAgIHJldHVybiBnc3RfY29sbGVjdF9wYWRzX2V2ZW50X2RlZmF1bHQgKHBhZHMsIGNkYXRhLCBldmVudCwgZGlzY2FyZCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitmb3J3YXJkX2V2ZW50X2Z1bmMgKEdWYWx1ZSAqIGl0ZW0sIEdWYWx1ZSAqIHJldCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UGFkICpwYWQgPSBnX3ZhbHVlX2dldF9vYmplY3QgKGl0ZW0pOworICBnc3RfZXZlbnRfcmVmIChldmVudCk7CisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJBYm91dCB0byBzZW5kIGV2ZW50ICVzIiwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKyAgaWYgKCFnc3RfcGFkX3B1c2hfZXZlbnQgKHBhZCwgZXZlbnQpKSB7CisgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAocmV0LCBGQUxTRSk7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYWQsICJTZW5kaW5nIGV2ZW50ICAlcCAoJXMpIGZhaWxlZC4iLAorICAgICAgICBldmVudCwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocGFkLCAiU2VudCBldmVudCAgJXAgKCVzKS4iLAorICAgICAgICBldmVudCwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9taXhlcjJfcHVzaF9zaW5rX2V2ZW50IChHc3RWaWRlb01peGVyMiAqIG1peCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0SXRlcmF0b3IgKml0OworICBHVmFsdWUgdnJldCA9IHsgMCB9OworCisgIEdTVF9MT0dfT0JKRUNUIChtaXgsICJGb3J3YXJkaW5nIGV2ZW50ICVwICglcykiLCBldmVudCwKKyAgICAgIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgZ192YWx1ZV9pbml0ICgmdnJldCwgR19UWVBFX0JPT0xFQU4pOworICBnX3ZhbHVlX3NldF9ib29sZWFuICgmdnJldCwgVFJVRSk7CisgIGl0ID0gZ3N0X2VsZW1lbnRfaXRlcmF0ZV9zaW5rX3BhZHMgKEdTVF9FTEVNRU5UX0NBU1QgKG1peCkpOworICBnc3RfaXRlcmF0b3JfZm9sZCAoaXQsIChHc3RJdGVyYXRvckZvbGRGdW5jdGlvbikgZm9yd2FyZF9ldmVudF9mdW5jLCAmdnJldCwKKyAgICAgIGV2ZW50KTsKKyAgZ3N0X2l0ZXJhdG9yX2ZyZWUgKGl0KTsKKyAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisKKyAgcmV0dXJuIGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKCZ2cmV0KTsKK30KKworLyogR3N0RWxlbWVudCB2bWV0aG9kcyAqLworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfdmlkZW9taXhlcjJfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0VmlkZW9NaXhlcjIgKm1peCA9IEdTVF9WSURFT19NSVhFUjIgKGVsZW1lbnQpOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIG1peC0+c2VuZF9zdHJlYW1fc3RhcnQgPSBUUlVFOworICAgICAgbWl4LT5zZW5kX2NhcHMgPSBUUlVFOworICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJm1peC0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgICAgIGdzdF9jYXBzX3JlcGxhY2UgKCZtaXgtPmN1cnJlbnRfY2FwcywgTlVMTCk7CisgICAgICBHU1RfTE9HX09CSkVDVCAobWl4LCAic3RhcnRpbmcgY29sbGVjdHBhZHMiKTsKKyAgICAgIGdzdF9jb2xsZWN0X3BhZHNfc3RhcnQgKG1peC0+Y29sbGVjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgR1NUX0xPR19PQkpFQ1QgKG1peCwgInN0b3BwaW5nIGNvbGxlY3RwYWRzIik7CisgICAgICBnc3RfY29sbGVjdF9wYWRzX3N0b3AgKG1peC0+Y29sbGVjdCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3ZpZGVvbWl4ZXIyX3Jlc2V0IChtaXgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdFBhZCAqCitnc3RfdmlkZW9taXhlcjJfcmVxdWVzdF9uZXdfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLCBjb25zdCBnY2hhciAqIHJlcV9uYW1lLCBjb25zdCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0VmlkZW9NaXhlcjIgKm1peDsKKyAgR3N0VmlkZW9NaXhlcjJQYWQgKm1peHBhZDsKKyAgR3N0RWxlbWVudENsYXNzICprbGFzcyA9IEdTVF9FTEVNRU5UX0dFVF9DTEFTUyAoZWxlbWVudCk7CisKKyAgbWl4ID0gR1NUX1ZJREVPX01JWEVSMiAoZWxlbWVudCk7CisKKyAgaWYgKHRlbXBsID09IGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLCAic2lua18ldSIpKSB7CisgICAgZ3VpbnQgc2VyaWFsID0gMDsKKyAgICBnY2hhciAqbmFtZSA9IE5VTEw7CisgICAgR3N0VmlkZW9NaXhlcjJDb2xsZWN0ICptaXhjb2wgPSBOVUxMOworCisgICAgR1NUX1ZJREVPX01JWEVSMl9MT0NLIChtaXgpOworICAgIGlmIChyZXFfbmFtZSA9PSBOVUxMIHx8IHN0cmxlbiAocmVxX25hbWUpIDwgNgorICAgICAgICB8fCAhZ19zdHJfaGFzX3ByZWZpeCAocmVxX25hbWUsICJzaW5rXyIpKSB7CisgICAgICAvKiBubyBuYW1lIGdpdmVuIHdoZW4gcmVxdWVzdGluZyB0aGUgcGFkLCB1c2UgbmV4dCBhdmFpbGFibGUgaW50ICovCisgICAgICBzZXJpYWwgPSBtaXgtPm5leHRfc2lua3BhZCsrOworICAgIH0gZWxzZSB7CisgICAgICAvKiBwYXJzZSBzZXJpYWwgbnVtYmVyIGZyb20gcmVxdWVzdGVkIHBhZG5hbWUgKi8KKyAgICAgIHNlcmlhbCA9IGdfYXNjaWlfc3RydG91bGwgKCZyZXFfbmFtZVs1XSwgTlVMTCwgMTApOworICAgICAgaWYgKHNlcmlhbCA+PSBtaXgtPm5leHRfc2lua3BhZCkKKyAgICAgICAgbWl4LT5uZXh0X3NpbmtwYWQgPSBzZXJpYWwgKyAxOworICAgIH0KKyAgICAvKiBjcmVhdGUgbmV3IHBhZCB3aXRoIHRoZSBuYW1lICovCisgICAgbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInNpbmtfJXUiLCBzZXJpYWwpOworICAgIG1peHBhZCA9IGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfVklERU9fTUlYRVIyX1BBRCwgIm5hbWUiLCBuYW1lLCAiZGlyZWN0aW9uIiwKKyAgICAgICAgdGVtcGwtPmRpcmVjdGlvbiwgInRlbXBsYXRlIiwgdGVtcGwsIE5VTEwpOworICAgIGdfZnJlZSAobmFtZSk7CisKKyAgICBtaXhwYWQtPnpvcmRlciA9IG1peC0+bnVtcGFkczsKKyAgICBtaXhwYWQtPnhwb3MgPSBERUZBVUxUX1BBRF9YUE9TOworICAgIG1peHBhZC0+eXBvcyA9IERFRkFVTFRfUEFEX1lQT1M7CisgICAgbWl4cGFkLT5hbHBoYSA9IERFRkFVTFRfUEFEX0FMUEhBOworCisgICAgbWl4Y29sID0gKEdzdFZpZGVvTWl4ZXIyQ29sbGVjdCAqKQorICAgICAgICBnc3RfY29sbGVjdF9wYWRzX2FkZF9wYWQgKG1peC0+Y29sbGVjdCwgR1NUX1BBRCAobWl4cGFkKSwKKyAgICAgICAgc2l6ZW9mIChHc3RWaWRlb01peGVyMkNvbGxlY3QpLAorICAgICAgICAoR3N0Q29sbGVjdERhdGFEZXN0cm95Tm90aWZ5KSBnc3RfdmlkZW9taXhlcjJfY29sbGVjdF9mcmVlLCBUUlVFKTsKKworICAgIC8qIEtlZXAgdHJhY2sgb2YgZWFjaCBvdGhlciAqLworICAgIG1peGNvbC0+bWl4cGFkID0gbWl4cGFkOworICAgIG1peHBhZC0+bWl4Y29sID0gbWl4Y29sOworCisgICAgbWl4Y29sLT5zdGFydF90aW1lID0gLTE7CisgICAgbWl4Y29sLT5lbmRfdGltZSA9IC0xOworCisgICAgLyogS2VlcCBhbiBpbnRlcm5hbCBsaXN0IG9mIG1peHBhZHMgZm9yIHpvcmRlcmluZyAqLworICAgIG1peC0+c2lua3BhZHMgPSBnX3NsaXN0X2luc2VydF9zb3J0ZWQgKG1peC0+c2lua3BhZHMsIG1peHBhZCwKKyAgICAgICAgKEdDb21wYXJlRnVuYykgcGFkX3pvcmRlcl9jb21wYXJlKTsKKyAgICBtaXgtPm51bXBhZHMrKzsKKyAgICBHU1RfVklERU9fTUlYRVIyX1VOTE9DSyAobWl4KTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGVsZW1lbnQsICJBZGRpbmcgcGFkICVzIiwgR1NUX1BBRF9OQU1FIChtaXhwYWQpKTsKKworICAvKiBhZGQgdGhlIHBhZCB0byB0aGUgZWxlbWVudCAqLworICBnc3RfZWxlbWVudF9hZGRfcGFkIChlbGVtZW50LCBHU1RfUEFEIChtaXhwYWQpKTsKKyAgZ3N0X2NoaWxkX3Byb3h5X2NoaWxkX2FkZGVkIChHU1RfQ0hJTERfUFJPWFkgKG1peCksIEdfT0JKRUNUIChtaXhwYWQpLAorICAgICAgR1NUX09CSkVDVF9OQU1FIChtaXhwYWQpKTsKKworICByZXR1cm4gR1NUX1BBRCAobWl4cGFkKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb21peGVyMl9yZWxlYXNlX3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZCAqIHBhZCkKK3sKKyAgR3N0VmlkZW9NaXhlcjIgKm1peCA9IE5VTEw7CisgIEdzdFZpZGVvTWl4ZXIyUGFkICptaXhwYWQ7CisgIGdib29sZWFuIHVwZGF0ZV9jYXBzOworCisgIG1peCA9IEdTVF9WSURFT19NSVhFUjIgKGVsZW1lbnQpOworCisgIEdTVF9WSURFT19NSVhFUjJfTE9DSyAobWl4KTsKKyAgaWYgKEdfVU5MSUtFTFkgKGdfc2xpc3RfZmluZCAobWl4LT5zaW5rcGFkcywgcGFkKSA9PSBOVUxMKSkgeworICAgIGdfd2FybmluZyAoIlVua25vd24gcGFkICVzIiwgR1NUX1BBRF9OQU1FIChwYWQpKTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgbWl4cGFkID0gR1NUX1ZJREVPX01JWEVSMl9QQUQgKHBhZCk7CisKKyAgaWYgKG1peHBhZC0+Y29udmVydCkKKyAgICBnc3RfdmlkZW9fY29udmVydGVyX2ZyZWUgKG1peHBhZC0+Y29udmVydCk7CisgIG1peHBhZC0+Y29udmVydCA9IE5VTEw7CisKKyAgbWl4LT5zaW5rcGFkcyA9IGdfc2xpc3RfcmVtb3ZlIChtaXgtPnNpbmtwYWRzLCBwYWQpOworICBnc3RfY2hpbGRfcHJveHlfY2hpbGRfcmVtb3ZlZCAoR1NUX0NISUxEX1BST1hZIChtaXgpLCBHX09CSkVDVCAobWl4cGFkKSwKKyAgICAgIEdTVF9PQkpFQ1RfTkFNRSAobWl4cGFkKSk7CisgIG1peC0+bnVtcGFkcy0tOworCisgIEdTVF9DT0xMRUNUX1BBRFNfU1RSRUFNX0xPQ0sgKG1peC0+Y29sbGVjdCk7CisgIGdzdF92aWRlb21peGVyMl91cGRhdGVfY29udmVydGVycyAobWl4KTsKKyAgR1NUX0NPTExFQ1RfUEFEU19TVFJFQU1fVU5MT0NLIChtaXgtPmNvbGxlY3QpOworCisgIHVwZGF0ZV9jYXBzID0gR1NUX1ZJREVPX0lORk9fRk9STUFUICgmbWl4LT5pbmZvKSAhPSBHU1RfVklERU9fRk9STUFUX1VOS05PV047CisgIEdTVF9WSURFT19NSVhFUjJfVU5MT0NLIChtaXgpOworCisgIGdzdF9jb2xsZWN0X3BhZHNfcmVtb3ZlX3BhZCAobWl4LT5jb2xsZWN0LCBwYWQpOworCisgIGlmICh1cGRhdGVfY2FwcykKKyAgICBnc3RfdmlkZW9taXhlcjJfdXBkYXRlX3NyY19jYXBzIChtaXgpOworCisgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKGVsZW1lbnQsIHBhZCk7CisgIHJldHVybjsKK2Vycm9yOgorICBHU1RfVklERU9fTUlYRVIyX1VOTE9DSyAobWl4KTsKK30KKworLyogR09iamVjdCB2bWV0aG9kcyAqLworc3RhdGljIHZvaWQKK2dzdF92aWRlb21peGVyMl9maW5hbGl6ZSAoR09iamVjdCAqIG8pCit7CisgIEdzdFZpZGVvTWl4ZXIyICptaXggPSBHU1RfVklERU9fTUlYRVIyIChvKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChtaXgtPmNvbGxlY3QpOworICBnX211dGV4X2NsZWFyICgmbWl4LT5sb2NrKTsKKyAgZ19tdXRleF9jbGVhciAoJm1peC0+c2V0Y2Fwc19sb2NrKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG8pOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvbWl4ZXIyX2Rpc3Bvc2UgKEdPYmplY3QgKiBvKQoreworICBHc3RWaWRlb01peGVyMiAqbWl4ID0gR1NUX1ZJREVPX01JWEVSMiAobyk7CisgIEdTTGlzdCAqdG1wOworCisgIGZvciAodG1wID0gbWl4LT5zaW5rcGFkczsgdG1wOyB0bXAgPSB0bXAtPm5leHQpIHsKKyAgICBHc3RWaWRlb01peGVyMlBhZCAqbWl4cGFkID0gdG1wLT5kYXRhOworCisgICAgaWYgKG1peHBhZC0+Y29udmVydCkKKyAgICAgIGdzdF92aWRlb19jb252ZXJ0ZXJfZnJlZSAobWl4cGFkLT5jb252ZXJ0KTsKKyAgICBtaXhwYWQtPmNvbnZlcnQgPSBOVUxMOworICB9CisKKyAgaWYgKG1peC0+cGVuZGluZ190YWdzKSB7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmIChtaXgtPnBlbmRpbmdfdGFncyk7CisgICAgbWl4LT5wZW5kaW5nX3RhZ3MgPSBOVUxMOworICB9CisKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJm1peC0+Y3VycmVudF9jYXBzLCBOVUxMKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAobyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9taXhlcjJfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFZpZGVvTWl4ZXIyICptaXggPSBHU1RfVklERU9fTUlYRVIyIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9CQUNLR1JPVU5EOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIG1peC0+YmFja2dyb3VuZCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9taXhlcjJfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFZpZGVvTWl4ZXIyICptaXggPSBHU1RfVklERU9fTUlYRVIyIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9CQUNLR1JPVU5EOgorICAgICAgbWl4LT5iYWNrZ3JvdW5kID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBHc3RDaGlsZFByb3h5IGltcGxlbWVudGF0aW9uICovCitzdGF0aWMgR09iamVjdCAqCitnc3RfdmlkZW9taXhlcjJfY2hpbGRfcHJveHlfZ2V0X2NoaWxkX2J5X2luZGV4IChHc3RDaGlsZFByb3h5ICogY2hpbGRfcHJveHksCisgICAgZ3VpbnQgaW5kZXgpCit7CisgIEdzdFZpZGVvTWl4ZXIyICptaXggPSBHU1RfVklERU9fTUlYRVIyIChjaGlsZF9wcm94eSk7CisgIEdPYmplY3QgKm9iajsKKworICBHU1RfVklERU9fTUlYRVIyX0xPQ0sgKG1peCk7CisgIGlmICgob2JqID0gZ19zbGlzdF9udGhfZGF0YSAobWl4LT5zaW5rcGFkcywgaW5kZXgpKSkKKyAgICBnX29iamVjdF9yZWYgKG9iaik7CisgIEdTVF9WSURFT19NSVhFUjJfVU5MT0NLIChtaXgpOworICByZXR1cm4gb2JqOworfQorCitzdGF0aWMgZ3VpbnQKK2dzdF92aWRlb21peGVyMl9jaGlsZF9wcm94eV9nZXRfY2hpbGRyZW5fY291bnQgKEdzdENoaWxkUHJveHkgKiBjaGlsZF9wcm94eSkKK3sKKyAgZ3VpbnQgY291bnQgPSAwOworICBHc3RWaWRlb01peGVyMiAqbWl4ID0gR1NUX1ZJREVPX01JWEVSMiAoY2hpbGRfcHJveHkpOworCisgIEdTVF9WSURFT19NSVhFUjJfTE9DSyAobWl4KTsKKyAgY291bnQgPSBtaXgtPm51bXBhZHM7CisgIEdTVF9WSURFT19NSVhFUjJfVU5MT0NLIChtaXgpOworICBHU1RfSU5GT19PQkpFQ1QgKG1peCwgIkNoaWxkcmVuIENvdW50OiAlZCIsIGNvdW50KTsKKyAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvbWl4ZXIyX2NoaWxkX3Byb3h5X2luaXQgKGdwb2ludGVyIGdfaWZhY2UsIGdwb2ludGVyIGlmYWNlX2RhdGEpCit7CisgIEdzdENoaWxkUHJveHlJbnRlcmZhY2UgKmlmYWNlID0gZ19pZmFjZTsKKworICBHU1RfSU5GTyAoImludGlhbGl6aW5nIGNoaWxkIHByb3h5IGludGVyZmFjZSIpOworICBpZmFjZS0+Z2V0X2NoaWxkX2J5X2luZGV4ID0gZ3N0X3ZpZGVvbWl4ZXIyX2NoaWxkX3Byb3h5X2dldF9jaGlsZF9ieV9pbmRleDsKKyAgaWZhY2UtPmdldF9jaGlsZHJlbl9jb3VudCA9IGdzdF92aWRlb21peGVyMl9jaGlsZF9wcm94eV9nZXRfY2hpbGRyZW5fY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9taXhlcjJfY29uc3RydWN0ZWQgKEdPYmplY3QgKiBvYmopCit7CisgIEdzdFZpZGVvTWl4ZXIyICptaXggPSBHU1RfVklERU9fTUlYRVIyIChvYmopOworICBnY2hhciAqY3BfbmFtZTsKKworICBjcF9uYW1lID0gZ19zdHJjb25jYXQgKEdTVF9PQkpFQ1RfTkFNRSAob2JqKSwgIi1jb2xsZWN0cGFkcyIsIE5VTEwpOworICBnc3Rfb2JqZWN0X3NldF9uYW1lIChHU1RfT0JKRUNUIChtaXgtPmNvbGxlY3QpLCBjcF9uYW1lKTsKKyAgZ19mcmVlIChjcF9uYW1lKTsKKworICBHX09CSkVDVF9DTEFTUyAoZ3N0X3ZpZGVvbWl4ZXIyX3BhcmVudF9jbGFzcyktPmNvbnN0cnVjdGVkIChvYmopOworfQorCisvKiBHT2JqZWN0IGJvaWxlcnBsYXRlICovCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvbWl4ZXIyX2NsYXNzX2luaXQgKEdzdFZpZGVvTWl4ZXIyQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5jb25zdHJ1Y3RlZCA9IGdzdF92aWRlb21peGVyMl9jb25zdHJ1Y3RlZDsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfdmlkZW9taXhlcjJfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3RfdmlkZW9taXhlcjJfZGlzcG9zZTsKKworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfdmlkZW9taXhlcjJfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdmlkZW9taXhlcjJfc2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFDS0dST1VORCwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgiYmFja2dyb3VuZCIsICJCYWNrZ3JvdW5kIiwgIkJhY2tncm91bmQgdHlwZSIsCisgICAgICAgICAgR1NUX1RZUEVfVklERU9fTUlYRVIyX0JBQ0tHUk9VTkQsCisgICAgICAgICAgREVGQVVMVF9CQUNLR1JPVU5ELCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5yZXF1ZXN0X25ld19wYWQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb21peGVyMl9yZXF1ZXN0X25ld19wYWQpOworICBnc3RlbGVtZW50X2NsYXNzLT5yZWxlYXNlX3BhZCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3ZpZGVvbWl4ZXIyX3JlbGVhc2VfcGFkKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdmlkZW9taXhlcjJfY2hhbmdlX3N0YXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNyY19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX2ZhY3RvcnkpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJWaWRlbyBtaXhlciAyIiwKKyAgICAgICJGaWx0ZXIvRWRpdG9yL1ZpZGVvL0NvbXBvc2l0b3IiLAorICAgICAgIk1peCBtdWx0aXBsZSB2aWRlbyBzdHJlYW1zIiwgIldpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+LCAiCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgLyogUmVnaXN0ZXIgdGhlIHBhZCBjbGFzcyAqLworICBnX3R5cGVfY2xhc3NfcmVmIChHU1RfVFlQRV9WSURFT19NSVhFUjJfUEFEKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb21peGVyMl9pbml0IChHc3RWaWRlb01peGVyMiAqIG1peCkKK3sKKyAgR3N0RWxlbWVudENsYXNzICprbGFzcyA9IEdTVF9FTEVNRU5UX0dFVF9DTEFTUyAobWl4KTsKKworICBtaXgtPnNyY3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywKKyAgICAgICAgICAic3JjIiksICJzcmMiKTsKKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKEdTVF9QQUQgKG1peC0+c3JjcGFkKSwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdmlkZW9taXhlcjJfc3JjX3F1ZXJ5KSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChHU1RfUEFEIChtaXgtPnNyY3BhZCksCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3ZpZGVvbWl4ZXIyX3NyY19ldmVudCkpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAobWl4KSwgbWl4LT5zcmNwYWQpOworCisgIG1peC0+Y29sbGVjdCA9IGdzdF9jb2xsZWN0X3BhZHNfbmV3ICgpOworICBnc3RfY29sbGVjdF9wYWRzX3NldF9mbHVzaF9mdW5jdGlvbiAobWl4LT5jb2xsZWN0LAorICAgICAgKEdzdENvbGxlY3RQYWRzRmx1c2hGdW5jdGlvbikgZ3N0X3ZpZGVvbWl4ZXIyX2ZsdXNoLCBtaXgpOworICBtaXgtPmJhY2tncm91bmQgPSBERUZBVUxUX0JBQ0tHUk9VTkQ7CisgIG1peC0+Y3VycmVudF9jYXBzID0gTlVMTDsKKyAgbWl4LT5wZW5kaW5nX3RhZ3MgPSBOVUxMOworCisgIGdzdF9jb2xsZWN0X3BhZHNfc2V0X2Z1bmN0aW9uIChtaXgtPmNvbGxlY3QsCisgICAgICAoR3N0Q29sbGVjdFBhZHNGdW5jdGlvbikgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb21peGVyMl9jb2xsZWN0ZWQpLAorICAgICAgbWl4KTsKKyAgZ3N0X2NvbGxlY3RfcGFkc19zZXRfZXZlbnRfZnVuY3Rpb24gKG1peC0+Y29sbGVjdCwKKyAgICAgIChHc3RDb2xsZWN0UGFkc0V2ZW50RnVuY3Rpb24pIGdzdF92aWRlb21peGVyMl9zaW5rX2V2ZW50LCBtaXgpOworICBnc3RfY29sbGVjdF9wYWRzX3NldF9xdWVyeV9mdW5jdGlvbiAobWl4LT5jb2xsZWN0LAorICAgICAgKEdzdENvbGxlY3RQYWRzUXVlcnlGdW5jdGlvbikgZ3N0X3ZpZGVvbWl4ZXIyX3NpbmtfcXVlcnksIG1peCk7CisgIGdzdF9jb2xsZWN0X3BhZHNfc2V0X2NsaXBfZnVuY3Rpb24gKG1peC0+Y29sbGVjdCwKKyAgICAgIChHc3RDb2xsZWN0UGFkc0NsaXBGdW5jdGlvbikgZ3N0X3ZpZGVvbWl4ZXIyX3NpbmtfY2xpcCwgbWl4KTsKKworICBnX211dGV4X2luaXQgKCZtaXgtPmxvY2spOworICBnX211dGV4X2luaXQgKCZtaXgtPnNldGNhcHNfbG9jayk7CisgIC8qIGluaXRpYWxpemUgdmFyaWFibGVzICovCisgIGdzdF92aWRlb21peGVyMl9yZXNldCAobWl4KTsKK30KKworLyogRWxlbWVudCByZWdpc3RyYXRpb24gKi8KK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF92aWRlb21peGVyMl9kZWJ1ZywgInZpZGVvbWl4ZXIiLCAwLAorICAgICAgInZpZGVvIG1peGVyIik7CisKKyAgZ3N0X3ZpZGVvX21peGVyX2luaXRfYmxlbmQgKCk7CisKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJ2aWRlb21peGVyIiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgIEdTVF9UWVBFX1ZJREVPX01JWEVSMik7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICB2aWRlb21peGVyLAorICAgICJWaWRlbyBtaXhlciIsIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwKKyAgICBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5oIGIvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzZhNjVmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuaApAQCAtMCwwICsxLDEzMyBAQAorLyogR2VuZXJpYyB2aWRlbyBtaXhlciBwbHVnaW4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisgCisjaWZuZGVmIF9fR1NUX1ZJREVPX01JWEVSMl9IX18KKyNkZWZpbmUgX19HU1RfVklERU9fTUlYRVIyX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSAiYmxlbmQuaCIKKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3Rjb2xsZWN0cGFkcy5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfVklERU9fTUlYRVIyIChnc3RfdmlkZW9taXhlcjJfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1ZJREVPX01JWEVSMihvYmopIFwKKyAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1ZJREVPX01JWEVSMiwgR3N0VmlkZW9NaXhlcjIpKQorI2RlZmluZSBHU1RfVklERU9fTUlYRVIyX0NMQVNTKGtsYXNzKSBcCisgICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1ZJREVPX01JWEVSMiwgR3N0VmlkZW9NaXhlcjJDbGFzcykpCisjZGVmaW5lIEdTVF9JU19WSURFT19NSVhFUjIob2JqKSBcCisgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WSURFT19NSVhFUjIpKQorI2RlZmluZSBHU1RfSVNfVklERU9fTUlYRVIyX0NMQVNTKGtsYXNzKSBcCisgICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1ZJREVPX01JWEVSMikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWaWRlb01peGVyMiBHc3RWaWRlb01peGVyMjsKK3R5cGVkZWYgc3RydWN0IF9Hc3RWaWRlb01peGVyMkNsYXNzIEdzdFZpZGVvTWl4ZXIyQ2xhc3M7CisKKy8qKgorICogR3N0VmlkZW9NaXhlcjJCYWNrZ3JvdW5kOgorICogQFZJREVPX01JWEVSMl9CQUNLR1JPVU5EX0NIRUNLRVI6IGNoZWNrZXIgcGF0dGVybiBiYWNrZ3JvdW5kCisgKiBAVklERU9fTUlYRVIyX0JBQ0tHUk9VTkRfQkxBQ0s6IHNvbGlkIGNvbG9yIGJsYWNrIGJhY2tncm91bmQKKyAqIEBWSURFT19NSVhFUjJfQkFDS0dST1VORF9XSElURTogc29saWQgY29sb3Igd2hpdGUgYmFja2dyb3VuZAorICogQFZJREVPX01JWEVSMl9CQUNLR1JPVU5EX1RSQU5TUEFSRU5UOiBiYWNrZ3JvdW5kIGlzIGxlZnQgdHJhbnNwYXJlbnQgYW5kIGxheWVycyBhcmUgY29tcG9zaXRlZCB1c2luZyAiQSBPVkVSIEIiIGNvbXBvc2l0aW9uIHJ1bGVzLiBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSB0byBBWVVWIGFuZCBBUkdCIChhbmQgdmFyaWFudHMpIGFzIGl0IHByZXNlcnZlcyB0aGUgYWxwaGEgY2hhbm5lbCBhbmQgYWxsb3dzIGZvciBmdXJ0aGVyIG1peGluZy4KKyAqCisgKiBUaGUgZGlmZmVyZW50IGJhY2tncm91bmRzIHZpZGVvbWl4ZXIgY2FuIGJsZW5kIG92ZXIuCisgKi8KK3R5cGVkZWYgZW51bQoreworICBWSURFT19NSVhFUjJfQkFDS0dST1VORF9DSEVDS0VSLAorICBWSURFT19NSVhFUjJfQkFDS0dST1VORF9CTEFDSywKKyAgVklERU9fTUlYRVIyX0JBQ0tHUk9VTkRfV0hJVEUsCisgIFZJREVPX01JWEVSMl9CQUNLR1JPVU5EX1RSQU5TUEFSRU5ULAorfQorR3N0VmlkZW9NaXhlcjJCYWNrZ3JvdW5kOworCisvKioKKyAqIEdzdFZpZGVvTWl4ZXIyOgorICoKKyAqIFRoZSBvcGFxdWUgI0dzdFZpZGVvTWl4ZXIyIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IF9Hc3RWaWRlb01peGVyMgoreworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKworICAvKiBwYWQgKi8KKyAgR3N0UGFkICpzcmNwYWQ7CisKKyAgLyogTG9jayB0byBwcmV2ZW50IHRoZSBzdGF0ZSB0byBjaGFuZ2Ugd2hpbGUgYmxlbmRpbmcgKi8KKyAgR011dGV4IGxvY2s7CisKKyAgLyogTG9jayB0byBwcmV2ZW50IHR3byBzcmMgc2V0Y2FwcyBmcm9tIGhhcHBlbmluZyBhdCB0aGUgc2FtZSB0aW1lICAqLworICBHTXV0ZXggc2V0Y2Fwc19sb2NrOworCisgIC8qIFNpbmsgcGFkcyB1c2luZyBDb2xsZWN0IFBhZHMgMiovCisgIEdzdENvbGxlY3RQYWRzICpjb2xsZWN0OworCisgIC8qIHNpbmtwYWRzLCBhIEdTTGlzdCBvZiBHc3RWaWRlb01peGVyMlBhZHMgKi8KKyAgR1NMaXN0ICpzaW5rcGFkczsKKyAgZ2ludCBudW1wYWRzOworICAvKiBOZXh0IGF2YWlsYWJsZSBzaW5rcGFkIGluZGV4ICovCisgIGd1aW50IG5leHRfc2lua3BhZDsKKworICAvKiBPdXRwdXQgY2FwcyAqLworICBHc3RWaWRlb0luZm8gaW5mbzsKKworICAvKiBjdXJyZW50IGNhcHMgKi8KKyAgR3N0Q2FwcyAqY3VycmVudF9jYXBzOworICBnYm9vbGVhbiBzZW5kX2NhcHM7CisKKyAgZ2Jvb2xlYW4gbmV3c2VnX3BlbmRpbmc7CisKKyAgR3N0VmlkZW9NaXhlcjJCYWNrZ3JvdW5kIGJhY2tncm91bmQ7CisKKyAgLyogQ3VycmVudCBkb3duc3RyZWFtIHNlZ21lbnQgKi8KKyAgR3N0U2VnbWVudCBzZWdtZW50OworICBHc3RDbG9ja1RpbWUgdHNfb2Zmc2V0OworICBndWludDY0IG5mcmFtZXM7CisKKyAgLyogUW9TIHN0dWZmICovCisgIGdkb3VibGUgcHJvcG9ydGlvbjsKKyAgR3N0Q2xvY2tUaW1lIGVhcmxpZXN0X3RpbWU7CisgIGd1aW50NjQgcW9zX3Byb2Nlc3NlZCwgcW9zX2Ryb3BwZWQ7CisKKyAgQmxlbmRGdW5jdGlvbiBibGVuZCwgb3ZlcmxheTsKKyAgRmlsbENoZWNrZXJGdW5jdGlvbiBmaWxsX2NoZWNrZXI7CisgIEZpbGxDb2xvckZ1bmN0aW9uIGZpbGxfY29sb3I7CisKKyAgZ2Jvb2xlYW4gc2VuZF9zdHJlYW1fc3RhcnQ7CisKKyAgLyogbGF0ZW5jeSAqLworICBnYm9vbGVhbiBsaXZlOworCisgIEdzdFRhZ0xpc3QgKnBlbmRpbmdfdGFnczsKK307CisKK3N0cnVjdCBfR3N0VmlkZW9NaXhlcjJDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3ZpZGVvbWl4ZXIyX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9WSURFT19NSVhFUjJfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9taXhlci92aWRlb21peGVyMnBhZC5oIGIvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjJwYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzcxMWUyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjJwYWQuaApAQCAtMCwwICsxLDgzIEBACisvKiBHZW5lcmljIHZpZGVvIG1peGVyIHBsdWdpbgorICogQ29weXJpZ2h0IChDKSAyMDA4IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyAKKyNpZm5kZWYgX19HU1RfVklERU9fTUlYRVIyX1BBRF9IX18KKyNkZWZpbmUgX19HU1RfVklERU9fTUlYRVIyX1BBRF9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGNvbGxlY3RwYWRzLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9WSURFT19NSVhFUjJfUEFEIChnc3RfdmlkZW9taXhlcjJfcGFkX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WSURFT19NSVhFUjJfUEFEKG9iaikgXAorICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVklERU9fTUlYRVIyX1BBRCwgR3N0VmlkZW9NaXhlcjJQYWQpKQorI2RlZmluZSBHU1RfVklERU9fTUlYRVIyX1BBRF9DTEFTUyhrbGFzcykgXAorICAgICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WSURFT19NSVhFUl9QQUQsIEdzdFZpZGVvTWl4ZXIyUGFkQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVklERU9fTUlYRVIyX1BBRChvYmopIFwKKyAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1ZJREVPX01JWEVSMl9QQUQpKQorI2RlZmluZSBHU1RfSVNfVklERU9fTUlYRVIyX1BBRF9DTEFTUyhrbGFzcykgXAorICAgICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9WSURFT19NSVhFUjJfUEFEKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZpZGVvTWl4ZXIyUGFkIEdzdFZpZGVvTWl4ZXIyUGFkOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZpZGVvTWl4ZXIyUGFkQ2xhc3MgR3N0VmlkZW9NaXhlcjJQYWRDbGFzczsKK3R5cGVkZWYgc3RydWN0IF9Hc3RWaWRlb01peGVyMkNvbGxlY3QgR3N0VmlkZW9NaXhlcjJDb2xsZWN0OworCisvKioKKyAqIEdzdFZpZGVvTWl4ZXIyUGFkOgorICoKKyAqIFRoZSBvcGFxdWUgI0dzdFZpZGVvTWl4ZXIyUGFkIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IF9Hc3RWaWRlb01peGVyMlBhZAoreworICBHc3RQYWQgcGFyZW50OworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisKKyAgLyogY2FwcyAqLworICBHc3RWaWRlb0luZm8gaW5mbzsKKworICAvKiBwcm9wZXJ0aWVzICovCisgIGdpbnQgeHBvcywgeXBvczsKKyAgZ3VpbnQgem9yZGVyOworICBnZG91YmxlIGFscGhhOworCisgIEdzdFZpZGVvTWl4ZXIyQ29sbGVjdCAqbWl4Y29sOworCisgIC8qIGNhcHMgdXNlZCBmb3IgY29udmVyc2lvbiBpZiBuZWVkZWQgKi8KKyAgR3N0VmlkZW9JbmZvIGNvbnZlcnNpb25faW5mbzsKKworICAvKiBDb252ZXJ0ZXIsIGlmIE5VTEwgbm8gY29udmVyc2lvbiBpcyBkb25lICovCisgIEdzdFZpZGVvQ29udmVydGVyICpjb252ZXJ0OworCisgIGdib29sZWFuIG5lZWRfY29udmVyc2lvbl91cGRhdGU7Cit9OworCitzdHJ1Y3QgX0dzdFZpZGVvTWl4ZXIyUGFkQ2xhc3MKK3sKKyAgR3N0UGFkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3ZpZGVvbWl4ZXIyX3BhZF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYgLyogX19HU1RfVklERU9fTUlYRVIyX1BBRF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXJvcmMtZGlzdC5jIGIvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy1kaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjMjgyYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXJvcmMtZGlzdC5jCkBAIC0wLDAgKzEsMjQxNCBAQAorCisvKiBhdXRvZ2VuZXJhdGVkIGZyb20gdmlkZW9taXhlcm9yYy5vcmMgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPGdsaWIuaD4KKworI2lmbmRlZiBfT1JDX0lOVEVHRVJfVFlQRURFRlNfCisjZGVmaW5lIF9PUkNfSU5URUdFUl9UWVBFREVGU18KKyNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorI2luY2x1ZGUgPHN0ZGludC5oPgordHlwZWRlZiBpbnQ4X3Qgb3JjX2ludDg7Cit0eXBlZGVmIGludDE2X3Qgb3JjX2ludDE2OwordHlwZWRlZiBpbnQzMl90IG9yY19pbnQzMjsKK3R5cGVkZWYgaW50NjRfdCBvcmNfaW50NjQ7Cit0eXBlZGVmIHVpbnQ4X3Qgb3JjX3VpbnQ4OwordHlwZWRlZiB1aW50MTZfdCBvcmNfdWludDE2OwordHlwZWRlZiB1aW50MzJfdCBvcmNfdWludDMyOwordHlwZWRlZiB1aW50NjRfdCBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgVUlOVDY0X0MoeCkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCit0eXBlZGVmIHNpZ25lZCBfX2ludDggb3JjX2ludDg7Cit0eXBlZGVmIHNpZ25lZCBfX2ludDE2IG9yY19pbnQxNjsKK3R5cGVkZWYgc2lnbmVkIF9faW50MzIgb3JjX2ludDMyOwordHlwZWRlZiBzaWduZWQgX19pbnQ2NCBvcmNfaW50NjQ7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50OCBvcmNfdWludDg7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50MTYgb3JjX3VpbnQxNjsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQzMiBvcmNfdWludDMyOwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSAoeCMjVWk2NCkKKyNkZWZpbmUgaW5saW5lIF9faW5saW5lCisjZWxzZQorI2luY2x1ZGUgPGxpbWl0cy5oPgordHlwZWRlZiBzaWduZWQgY2hhciBvcmNfaW50ODsKK3R5cGVkZWYgc2hvcnQgb3JjX2ludDE2OwordHlwZWRlZiBpbnQgb3JjX2ludDMyOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIG9yY191aW50ODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgb3JjX3VpbnQxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IG9yY191aW50MzI7CisjaWYgSU5UX01BWCA9PSBMT05HX01BWAordHlwZWRlZiBsb25nIGxvbmcgb3JjX2ludDY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgb3JjX3VpbnQ2NDsKKyNkZWZpbmUgT1JDX1VJTlQ2NF9DKHgpICh4IyNVTEwpCisjZWxzZQordHlwZWRlZiBsb25nIG9yY19pbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgKHgjI1VMKQorI2VuZGlmCisjZW5kaWYKK3R5cGVkZWYgdW5pb24KK3sKKyAgb3JjX2ludDE2IGk7CisgIG9yY19pbnQ4IHgyWzJdOworfSBvcmNfdW5pb24xNjsKK3R5cGVkZWYgdW5pb24KK3sKKyAgb3JjX2ludDMyIGk7CisgIGZsb2F0IGY7CisgIG9yY19pbnQxNiB4MlsyXTsKKyAgb3JjX2ludDggeDRbNF07Cit9IG9yY191bmlvbjMyOwordHlwZWRlZiB1bmlvbgoreworICBvcmNfaW50NjQgaTsKKyAgZG91YmxlIGY7CisgIG9yY19pbnQzMiB4MlsyXTsKKyAgZmxvYXQgeDJmWzJdOworICBvcmNfaW50MTYgeDRbNF07Cit9IG9yY191bmlvbjY0OworI2VuZGlmCisjaWZuZGVmIE9SQ19SRVNUUklDVAorI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjZGVmaW5lIE9SQ19SRVNUUklDVCByZXN0cmljdAorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNAorI2RlZmluZSBPUkNfUkVTVFJJQ1QgX19yZXN0cmljdF9fCisjZWxzZQorI2RlZmluZSBPUkNfUkVTVFJJQ1QKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgT1JDX0lOVEVSTkFMCisjaWYgZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU5MCkKKyNkZWZpbmUgT1JDX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNlbGlmIGRlZmluZWQoX19TVU5QUk9fQykgJiYgKF9fU1VOUFJPX0MgPj0gMHg1NTApCisjZGVmaW5lIE9SQ19JTlRFUk5BTCBfX2hpZGRlbgorI2VsaWYgZGVmaW5lZCAoX19HTlVDX18pCisjZGVmaW5lIE9SQ19JTlRFUk5BTCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisjZWxzZQorI2RlZmluZSBPUkNfSU5URVJOQUwKKyNlbmRpZgorI2VuZGlmCisKKworI2lmbmRlZiBESVNBQkxFX09SQworI2luY2x1ZGUgPG9yYy9vcmMuaD4KKyNlbmRpZgordm9pZCB2aWRlb19taXhlcl9vcmNfc3BsYXRfdTMyIChndWludDMyICogT1JDX1JFU1RSSUNUIGQxLCBpbnQgcDEsIGludCBuKTsKK3ZvaWQgdmlkZW9fbWl4ZXJfb3JjX21lbWNweV91MzIgKGd1aW50MzIgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ3VpbnQzMiAqIE9SQ19SRVNUUklDVCBzMSwgaW50IG4pOwordm9pZCB2aWRlb19taXhlcl9vcmNfYmxlbmRfdTggKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgaW50IGQxX3N0cmlkZSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGludCBzMV9zdHJpZGUsIGludCBwMSwgaW50IG4sIGludCBtKTsKK3ZvaWQgdmlkZW9fbWl4ZXJfb3JjX2JsZW5kX2FyZ2IgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgaW50IGQxX3N0cmlkZSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGludCBzMV9zdHJpZGUsIGludCBwMSwgaW50IG4sIGludCBtKTsKK3ZvaWQgdmlkZW9fbWl4ZXJfb3JjX2JsZW5kX2JncmEgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgaW50IGQxX3N0cmlkZSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGludCBzMV9zdHJpZGUsIGludCBwMSwgaW50IG4sIGludCBtKTsKK3ZvaWQgdmlkZW9fbWl4ZXJfb3JjX292ZXJsYXlfYXJnYiAoZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIGQxLCBpbnQgZDFfc3RyaWRlLAorICAgIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMSwgaW50IHMxX3N0cmlkZSwgaW50IHAxLCBpbnQgbiwgaW50IG0pOwordm9pZCB2aWRlb19taXhlcl9vcmNfb3ZlcmxheV9iZ3JhIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsIGludCBkMV9zdHJpZGUsCisgICAgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBpbnQgczFfc3RyaWRlLCBpbnQgcDEsIGludCBuLCBpbnQgbSk7CisKKworLyogYmVnaW4gT3JjIEMgdGFyZ2V0IHByZWFtYmxlICovCisjZGVmaW5lIE9SQ19DTEFNUCh4LGEsYikgKCh4KTwoYSkgPyAoYSkgOiAoKHgpPihiKSA/IChiKSA6ICh4KSkpCisjZGVmaW5lIE9SQ19BQlMoYSkgKChhKTwwID8gLShhKSA6IChhKSkKKyNkZWZpbmUgT1JDX01JTihhLGIpICgoYSk8KGIpID8gKGEpIDogKGIpKQorI2RlZmluZSBPUkNfTUFYKGEsYikgKChhKT4oYikgPyAoYSkgOiAoYikpCisjZGVmaW5lIE9SQ19TQl9NQVggMTI3CisjZGVmaW5lIE9SQ19TQl9NSU4gKC0xLU9SQ19TQl9NQVgpCisjZGVmaW5lIE9SQ19VQl9NQVggKG9yY191aW50OCkgMjU1CisjZGVmaW5lIE9SQ19VQl9NSU4gMAorI2RlZmluZSBPUkNfU1dfTUFYIDMyNzY3CisjZGVmaW5lIE9SQ19TV19NSU4gKC0xLU9SQ19TV19NQVgpCisjZGVmaW5lIE9SQ19VV19NQVggKG9yY191aW50MTYpNjU1MzUKKyNkZWZpbmUgT1JDX1VXX01JTiAwCisjZGVmaW5lIE9SQ19TTF9NQVggMjE0NzQ4MzY0NworI2RlZmluZSBPUkNfU0xfTUlOICgtMS1PUkNfU0xfTUFYKQorI2RlZmluZSBPUkNfVUxfTUFYIDQyOTQ5NjcyOTVVCisjZGVmaW5lIE9SQ19VTF9NSU4gMAorI2RlZmluZSBPUkNfQ0xBTVBfU0IoeCkgT1JDX0NMQU1QKHgsT1JDX1NCX01JTixPUkNfU0JfTUFYKQorI2RlZmluZSBPUkNfQ0xBTVBfVUIoeCkgT1JDX0NMQU1QKHgsT1JDX1VCX01JTixPUkNfVUJfTUFYKQorI2RlZmluZSBPUkNfQ0xBTVBfU1coeCkgT1JDX0NMQU1QKHgsT1JDX1NXX01JTixPUkNfU1dfTUFYKQorI2RlZmluZSBPUkNfQ0xBTVBfVVcoeCkgT1JDX0NMQU1QKHgsT1JDX1VXX01JTixPUkNfVVdfTUFYKQorI2RlZmluZSBPUkNfQ0xBTVBfU0woeCkgT1JDX0NMQU1QKHgsT1JDX1NMX01JTixPUkNfU0xfTUFYKQorI2RlZmluZSBPUkNfQ0xBTVBfVUwoeCkgT1JDX0NMQU1QKHgsT1JDX1VMX01JTixPUkNfVUxfTUFYKQorI2RlZmluZSBPUkNfU1dBUF9XKHgpICgoKCh4KSYweGZmVSk8PDgpIHwgKCgoeCkmMHhmZjAwVSk+PjgpKQorI2RlZmluZSBPUkNfU1dBUF9MKHgpICgoKCh4KSYweGZmVSk8PDI0KSB8ICgoKHgpJjB4ZmYwMFUpPDw4KSB8ICgoKHgpJjB4ZmYwMDAwVSk+PjgpIHwgKCgoeCkmMHhmZjAwMDAwMFUpPj4yNCkpCisjZGVmaW5lIE9SQ19TV0FQX1EoeCkgKCgoKHgpJk9SQ19VSU5UNjRfQygweGZmKSk8PDU2KSB8ICgoKHgpJk9SQ19VSU5UNjRfQygweGZmMDApKTw8NDApIHwgKCgoeCkmT1JDX1VJTlQ2NF9DKDB4ZmYwMDAwKSk8PDI0KSB8ICgoKHgpJk9SQ19VSU5UNjRfQygweGZmMDAwMDAwKSk8PDgpIHwgKCgoeCkmT1JDX1VJTlQ2NF9DKDB4ZmYwMDAwMDAwMCkpPj44KSB8ICgoKHgpJk9SQ19VSU5UNjRfQygweGZmMDAwMDAwMDAwMCkpPj4yNCkgfCAoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZjAwMDAwMDAwMDAwMCkpPj40MCkgfCAoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZjAwMDAwMDAwMDAwMDAwKSk+PjU2KSkKKyNkZWZpbmUgT1JDX1BUUl9PRkZTRVQocHRyLG9mZnNldCkgKCh2b2lkICopKCgodW5zaWduZWQgY2hhciAqKShwdHIpKSArIChvZmZzZXQpKSkKKyNkZWZpbmUgT1JDX0RFTk9STUFMKHgpICgoeCkgJiAoKCgoeCkmMHg3ZjgwMDAwMCkgPT0gMCkgPyAweGZmODAwMDAwIDogMHhmZmZmZmZmZikpCisjZGVmaW5lIE9SQ19JU05BTih4KSAoKCgoeCkmMHg3ZjgwMDAwMCkgPT0gMHg3ZjgwMDAwMCkgJiYgKCgoeCkmMHgwMDdmZmZmZikgIT0gMCkpCisjZGVmaW5lIE9SQ19ERU5PUk1BTF9ET1VCTEUoeCkgKCh4KSAmICgoKCh4KSZPUkNfVUlOVDY0X0MoMHg3ZmYwMDAwMDAwMDAwMDAwKSkgPT0gMCkgPyBPUkNfVUlOVDY0X0MoMHhmZmYwMDAwMDAwMDAwMDAwKSA6IE9SQ19VSU5UNjRfQygweGZmZmZmZmZmZmZmZmZmZmYpKSkKKyNkZWZpbmUgT1JDX0lTTkFOX0RPVUJMRSh4KSAoKCgoeCkmT1JDX1VJTlQ2NF9DKDB4N2ZmMDAwMDAwMDAwMDAwMCkpID09IE9SQ19VSU5UNjRfQygweDdmZjAwMDAwMDAwMDAwMDApKSAmJiAoKCh4KSZPUkNfVUlOVDY0X0MoMHgwMDBmZmZmZmZmZmZmZmZmKSkgIT0gMCkpCisjaWZuZGVmIE9SQ19SRVNUUklDVAorI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjZGVmaW5lIE9SQ19SRVNUUklDVCByZXN0cmljdAorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNAorI2RlZmluZSBPUkNfUkVTVFJJQ1QgX19yZXN0cmljdF9fCisjZWxzZQorI2RlZmluZSBPUkNfUkVTVFJJQ1QKKyNlbmRpZgorI2VuZGlmCisvKiBlbmQgT3JjIEMgdGFyZ2V0IHByZWFtYmxlICovCisKKworCisvKiB2aWRlb19taXhlcl9vcmNfc3BsYXRfdTMyICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK3ZpZGVvX21peGVyX29yY19zcGxhdF91MzIgKGd1aW50MzIgKiBPUkNfUkVTVFJJQ1QgZDEsIGludCBwMSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIG9yY191bmlvbjMyIHZhcjMyOworICBvcmNfdW5pb24zMiB2YXIzMzsKKworICBwdHIwID0gKG9yY191bmlvbjMyICopIGQxOworCisgIC8qIDA6IGxvYWRwbCAqLworICB2YXIzMi5pID0gcDE7CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDE6IGNvcHlsICovCisgICAgdmFyMzMuaSA9IHZhcjMyLmk7CisgICAgLyogMjogc3RvcmVsICovCisgICAgcHRyMFtpXSA9IHZhcjMzOworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX3ZpZGVvX21peGVyX29yY19zcGxhdF91MzIgKE9yY0V4ZWN1dG9yICogT1JDX1JFU1RSSUNUIGV4KQoreworICBpbnQgaTsKKyAgaW50IG4gPSBleC0+bjsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBvcmNfdW5pb24zMiB2YXIzMjsKKyAgb3JjX3VuaW9uMzIgdmFyMzM7CisKKyAgcHRyMCA9IChvcmNfdW5pb24zMiAqKSBleC0+YXJyYXlzWzBdOworCisgIC8qIDA6IGxvYWRwbCAqLworICB2YXIzMi5pID0gZXgtPnBhcmFtc1syNF07CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDE6IGNvcHlsICovCisgICAgdmFyMzMuaSA9IHZhcjMyLmk7CisgICAgLyogMjogc3RvcmVsICovCisgICAgcHRyMFtpXSA9IHZhcjMzOworICB9CisKK30KKwordm9pZAordmlkZW9fbWl4ZXJfb3JjX3NwbGF0X3UzMiAoZ3VpbnQzMiAqIE9SQ19SRVNUUklDVCBkMSwgaW50IHAxLCBpbnQgbikKK3sKKyAgT3JjRXhlY3V0b3IgX2V4LCAqZXggPSAmX2V4OworICBzdGF0aWMgdm9sYXRpbGUgaW50IHBfaW5pdGVkID0gMDsKKyAgc3RhdGljIE9yY0NvZGUgKmMgPSAwOworICB2b2lkICgqZnVuYykgKE9yY0V4ZWN1dG9yICopOworCisgIGlmICghcF9pbml0ZWQpIHsKKyAgICBvcmNfb25jZV9tdXRleF9sb2NrICgpOworICAgIGlmICghcF9pbml0ZWQpIHsKKyAgICAgIE9yY1Byb2dyYW0gKnA7CisKKyNpZiAxCisgICAgICBzdGF0aWMgY29uc3Qgb3JjX3VpbnQ4IGJjW10gPSB7CisgICAgICAgIDEsIDksIDI1LCAxMTgsIDEwNSwgMTAwLCAxMDEsIDExMSwgOTUsIDEwOSwgMTA1LCAxMjAsIDEwMSwgMTE0LCA5NSwgMTExLAorICAgICAgICAxMTQsIDk5LCA5NSwgMTE1LCAxMTIsIDEwOCwgOTcsIDExNiwgOTUsIDExNywgNTEsIDUwLCAxMSwgNCwgNCwgMTYsCisgICAgICAgIDQsIDExMiwgMCwgMjQsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwgX2JhY2t1cF92aWRlb19taXhlcl9vcmNfc3BsYXRfdTMyKTsKKyNlbHNlCisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3ICgpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X25hbWUgKHAsICJ2aWRlb19taXhlcl9vcmNfc3BsYXRfdTMyIik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLCBfYmFja3VwX3ZpZGVvX21peGVyX29yY19zcGxhdF91MzIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCA0LCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9wYXJhbWV0ZXIgKHAsIDQsICJwMSIpOworCisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvcHlsIiwgMCwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9QMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9EMV0gPSBkMTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX1AxXSA9IHAxOworCisgIGZ1bmMgPSBjLT5leGVjOworICBmdW5jIChleCk7Cit9CisjZW5kaWYKKworCisvKiB2aWRlb19taXhlcl9vcmNfbWVtY3B5X3UzMiAqLworI2lmZGVmIERJU0FCTEVfT1JDCit2b2lkCit2aWRlb19taXhlcl9vcmNfbWVtY3B5X3UzMiAoZ3VpbnQzMiAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBndWludDMyICogT1JDX1JFU1RSSUNUIHMxLCBpbnQgbikKK3sKKyAgaW50IGk7CisgIG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb24zMiB2YXIzMjsKKyAgb3JjX3VuaW9uMzIgdmFyMzM7CisKKyAgcHRyMCA9IChvcmNfdW5pb24zMiAqKSBkMTsKKyAgcHRyNCA9IChvcmNfdW5pb24zMiAqKSBzMTsKKworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkbCAqLworICAgIHZhcjMyID0gcHRyNFtpXTsKKyAgICAvKiAxOiBjb3B5bCAqLworICAgIHZhcjMzLmkgPSB2YXIzMi5pOworICAgIC8qIDI6IHN0b3JlbCAqLworICAgIHB0cjBbaV0gPSB2YXIzMzsKKyAgfQorCit9CisKKyNlbHNlCitzdGF0aWMgdm9pZAorX2JhY2t1cF92aWRlb19taXhlcl9vcmNfbWVtY3B5X3UzMiAoT3JjRXhlY3V0b3IgKiBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgbiA9IGV4LT5uOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uMzIgdmFyMzI7CisgIG9yY191bmlvbjMyIHZhcjMzOworCisgIHB0cjAgPSAob3JjX3VuaW9uMzIgKikgZXgtPmFycmF5c1swXTsKKyAgcHRyNCA9IChvcmNfdW5pb24zMiAqKSBleC0+YXJyYXlzWzRdOworCisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRsICovCisgICAgdmFyMzIgPSBwdHI0W2ldOworICAgIC8qIDE6IGNvcHlsICovCisgICAgdmFyMzMuaSA9IHZhcjMyLmk7CisgICAgLyogMjogc3RvcmVsICovCisgICAgcHRyMFtpXSA9IHZhcjMzOworICB9CisKK30KKwordm9pZAordmlkZW9fbWl4ZXJfb3JjX21lbWNweV91MzIgKGd1aW50MzIgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ3VpbnQzMiAqIE9SQ19SRVNUUklDVCBzMSwgaW50IG4pCit7CisgIE9yY0V4ZWN1dG9yIF9leCwgKmV4ID0gJl9leDsKKyAgc3RhdGljIHZvbGF0aWxlIGludCBwX2luaXRlZCA9IDA7CisgIHN0YXRpYyBPcmNDb2RlICpjID0gMDsKKyAgdm9pZCAoKmZ1bmMpIChPcmNFeGVjdXRvciAqKTsKKworICBpZiAoIXBfaW5pdGVkKSB7CisgICAgb3JjX29uY2VfbXV0ZXhfbG9jayAoKTsKKyAgICBpZiAoIXBfaW5pdGVkKSB7CisgICAgICBPcmNQcm9ncmFtICpwOworCisjaWYgMQorICAgICAgc3RhdGljIGNvbnN0IG9yY191aW50OCBiY1tdID0geworICAgICAgICAxLCA5LCAyNiwgMTE4LCAxMDUsIDEwMCwgMTAxLCAxMTEsIDk1LCAxMDksIDEwNSwgMTIwLCAxMDEsIDExNCwgOTUsIDExMSwKKyAgICAgICAgMTE0LCA5OSwgOTUsIDEwOSwgMTAxLCAxMDksIDk5LCAxMTIsIDEyMSwgOTUsIDExNywgNTEsIDUwLCAxMSwgNCwgNCwKKyAgICAgICAgMTIsIDQsIDQsIDExMiwgMCwgNCwgMiwgMCwKKyAgICAgIH07CisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3X2Zyb21fc3RhdGljX2J5dGVjb2RlIChiYyk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLCBfYmFja3VwX3ZpZGVvX21peGVyX29yY19tZW1jcHlfdTMyKTsKKyNlbHNlCisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3ICgpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X25hbWUgKHAsICJ2aWRlb19taXhlcl9vcmNfbWVtY3B5X3UzMiIpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwgX2JhY2t1cF92aWRlb19taXhlcl9vcmNfbWVtY3B5X3UzMik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDQsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgNCwgInMxIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29weWwiLCAwLCBPUkNfVkFSX0QxLCBPUkNfVkFSX1MxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworI2VuZGlmCisKKyAgICAgIG9yY19wcm9ncmFtX2NvbXBpbGUgKHApOworICAgICAgYyA9IG9yY19wcm9ncmFtX3Rha2VfY29kZSAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9mcmVlIChwKTsKKyAgICB9CisgICAgcF9pbml0ZWQgPSBUUlVFOworICAgIG9yY19vbmNlX211dGV4X3VubG9jayAoKTsKKyAgfQorICBleC0+YXJyYXlzW09SQ19WQVJfQTJdID0gYzsKKyAgZXgtPnByb2dyYW0gPSAwOworCisgIGV4LT5uID0gbjsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX0QxXSA9IGQxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzFdID0gKHZvaWQgKikgczE7CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIHZpZGVvX21peGVyX29yY19ibGVuZF91OCAqLworI2lmZGVmIERJU0FCTEVfT1JDCit2b2lkCit2aWRlb19taXhlcl9vcmNfYmxlbmRfdTggKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgaW50IGQxX3N0cmlkZSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGludCBzMV9zdHJpZGUsIGludCBwMSwgaW50IG4sIGludCBtKQoreworICBpbnQgaTsKKyAgaW50IGo7CisgIG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfaW50OCB2YXIzNDsKKyAgb3JjX2ludDggdmFyMzU7CisgIG9yY191bmlvbjE2IHZhcjM2OworICBvcmNfaW50OCB2YXIzNzsKKyAgb3JjX3VuaW9uMTYgdmFyMzg7CisgIG9yY191bmlvbjE2IHZhcjM5OworICBvcmNfdW5pb24xNiB2YXI0MDsKKyAgb3JjX3VuaW9uMTYgdmFyNDE7CisgIG9yY191bmlvbjE2IHZhcjQyOworICBvcmNfdW5pb24xNiB2YXI0MzsKKyAgb3JjX3VuaW9uMTYgdmFyNDQ7CisKKyAgZm9yIChqID0gMDsgaiA8IG07IGorKykgeworICAgIHB0cjAgPSBPUkNfUFRSX09GRlNFVCAoZDEsIGQxX3N0cmlkZSAqIGopOworICAgIHB0cjQgPSBPUkNfUFRSX09GRlNFVCAoczEsIHMxX3N0cmlkZSAqIGopOworCisgICAgLyogNTogbG9hZHB3ICovCisgICAgdmFyMzYuaSA9IHAxOworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgLyogMDogbG9hZGIgKi8KKyAgICAgIHZhcjM0ID0gcHRyMFtpXTsKKyAgICAgIC8qIDE6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjM4LmkgPSAob3JjX3VpbnQ4KSB2YXIzNDsKKyAgICAgIC8qIDI6IGxvYWRiICovCisgICAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgICAvKiAzOiBjb252dWJ3ICovCisgICAgICB2YXIzOS5pID0gKG9yY191aW50OCkgdmFyMzU7CisgICAgICAvKiA0OiBzdWJ3ICovCisgICAgICB2YXI0MC5pID0gdmFyMzkuaSAtIHZhcjM4Lmk7CisgICAgICAvKiA2OiBtdWxsdyAqLworICAgICAgdmFyNDEuaSA9ICh2YXI0MC5pICogdmFyMzYuaSkgJiAweGZmZmY7CisgICAgICAvKiA3OiBzaGx3ICovCisgICAgICB2YXI0Mi5pID0gKChvcmNfdWludDE2KSB2YXIzOC5pKSA8PCA4OworICAgICAgLyogODogYWRkdyAqLworICAgICAgdmFyNDMuaSA9IHZhcjQyLmkgKyB2YXI0MS5pOworICAgICAgLyogOTogc2hydXcgKi8KKyAgICAgIHZhcjQ0LmkgPSAoKG9yY191aW50MTYpIHZhcjQzLmkpID4+IDg7CisgICAgICAvKiAxMDogY29udnN1c3diICovCisgICAgICB2YXIzNyA9IE9SQ19DTEFNUF9VQiAodmFyNDQuaSk7CisgICAgICAvKiAxMTogc3RvcmViICovCisgICAgICBwdHIwW2ldID0gdmFyMzc7CisgICAgfQorICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX3ZpZGVvX21peGVyX29yY19ibGVuZF91OCAoT3JjRXhlY3V0b3IgKiBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgajsKKyAgaW50IG4gPSBleC0+bjsKKyAgaW50IG0gPSBleC0+cGFyYW1zW09SQ19WQVJfQTFdOworICBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX2ludDggdmFyMzQ7CisgIG9yY19pbnQ4IHZhcjM1OworICBvcmNfdW5pb24xNiB2YXIzNjsKKyAgb3JjX2ludDggdmFyMzc7CisgIG9yY191bmlvbjE2IHZhcjM4OworICBvcmNfdW5pb24xNiB2YXIzOTsKKyAgb3JjX3VuaW9uMTYgdmFyNDA7CisgIG9yY191bmlvbjE2IHZhcjQxOworICBvcmNfdW5pb24xNiB2YXI0MjsKKyAgb3JjX3VuaW9uMTYgdmFyNDM7CisgIG9yY191bmlvbjE2IHZhcjQ0OworCisgIGZvciAoaiA9IDA7IGogPCBtOyBqKyspIHsKKyAgICBwdHIwID0gT1JDX1BUUl9PRkZTRVQgKGV4LT5hcnJheXNbMF0sIGV4LT5wYXJhbXNbMF0gKiBqKTsKKyAgICBwdHI0ID0gT1JDX1BUUl9PRkZTRVQgKGV4LT5hcnJheXNbNF0sIGV4LT5wYXJhbXNbNF0gKiBqKTsKKworICAgIC8qIDU6IGxvYWRwdyAqLworICAgIHZhcjM2LmkgPSBleC0+cGFyYW1zWzI0XTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIC8qIDA6IGxvYWRiICovCisgICAgICB2YXIzNCA9IHB0cjBbaV07CisgICAgICAvKiAxOiBjb252dWJ3ICovCisgICAgICB2YXIzOC5pID0gKG9yY191aW50OCkgdmFyMzQ7CisgICAgICAvKiAyOiBsb2FkYiAqLworICAgICAgdmFyMzUgPSBwdHI0W2ldOworICAgICAgLyogMzogY29udnVidyAqLworICAgICAgdmFyMzkuaSA9IChvcmNfdWludDgpIHZhcjM1OworICAgICAgLyogNDogc3VidyAqLworICAgICAgdmFyNDAuaSA9IHZhcjM5LmkgLSB2YXIzOC5pOworICAgICAgLyogNjogbXVsbHcgKi8KKyAgICAgIHZhcjQxLmkgPSAodmFyNDAuaSAqIHZhcjM2LmkpICYgMHhmZmZmOworICAgICAgLyogNzogc2hsdyAqLworICAgICAgdmFyNDIuaSA9ICgob3JjX3VpbnQxNikgdmFyMzguaSkgPDwgODsKKyAgICAgIC8qIDg6IGFkZHcgKi8KKyAgICAgIHZhcjQzLmkgPSB2YXI0Mi5pICsgdmFyNDEuaTsKKyAgICAgIC8qIDk6IHNocnV3ICovCisgICAgICB2YXI0NC5pID0gKChvcmNfdWludDE2KSB2YXI0My5pKSA+PiA4OworICAgICAgLyogMTA6IGNvbnZzdXN3YiAqLworICAgICAgdmFyMzcgPSBPUkNfQ0xBTVBfVUIgKHZhcjQ0LmkpOworICAgICAgLyogMTE6IHN0b3JlYiAqLworICAgICAgcHRyMFtpXSA9IHZhcjM3OworICAgIH0KKyAgfQorCit9CisKK3ZvaWQKK3ZpZGVvX21peGVyX29yY19ibGVuZF91OCAoZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIGQxLCBpbnQgZDFfc3RyaWRlLAorICAgIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMSwgaW50IHMxX3N0cmlkZSwgaW50IHAxLCBpbnQgbiwgaW50IG0pCit7CisgIE9yY0V4ZWN1dG9yIF9leCwgKmV4ID0gJl9leDsKKyAgc3RhdGljIHZvbGF0aWxlIGludCBwX2luaXRlZCA9IDA7CisgIHN0YXRpYyBPcmNDb2RlICpjID0gMDsKKyAgdm9pZCAoKmZ1bmMpIChPcmNFeGVjdXRvciAqKTsKKworICBpZiAoIXBfaW5pdGVkKSB7CisgICAgb3JjX29uY2VfbXV0ZXhfbG9jayAoKTsKKyAgICBpZiAoIXBfaW5pdGVkKSB7CisgICAgICBPcmNQcm9ncmFtICpwOworCisjaWYgMQorICAgICAgc3RhdGljIGNvbnN0IG9yY191aW50OCBiY1tdID0geworICAgICAgICAxLCA3LCA5LCAyNCwgMTE4LCAxMDUsIDEwMCwgMTAxLCAxMTEsIDk1LCAxMDksIDEwNSwgMTIwLCAxMDEsIDExNCwgOTUsCisgICAgICAgIDExMSwgMTE0LCA5OSwgOTUsIDk4LCAxMDgsIDEwMSwgMTEwLCAxMDAsIDk1LCAxMTcsIDU2LCAxMSwgMSwgMSwgMTIsCisgICAgICAgIDEsIDEsIDE0LCAxLCA4LCAwLCAwLCAwLCAxNiwgMiwgMjAsIDIsIDIwLCAyLCAxNTAsIDMyLAorICAgICAgICAwLCAxNTAsIDMzLCA0LCA5OCwgMzMsIDMzLCAzMiwgODksIDMzLCAzMywgMjQsIDkzLCAzMiwgMzIsIDE2LAorICAgICAgICA3MCwgMzMsIDMyLCAzMywgOTUsIDMzLCAzMywgMTYsIDE2MCwgMCwgMzMsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwgX2JhY2t1cF92aWRlb19taXhlcl9vcmNfYmxlbmRfdTgpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfMmQgKHApOworICAgICAgb3JjX3Byb2dyYW1fc2V0X25hbWUgKHAsICJ2aWRlb19taXhlcl9vcmNfYmxlbmRfdTgiKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsIF9iYWNrdXBfdmlkZW9fbWl4ZXJfb3JjX2JsZW5kX3U4KTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9kZXN0aW5hdGlvbiAocCwgMSwgImQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCAxLCAiczEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9jb25zdGFudCAocCwgMSwgMHgwMDAwMDAwOCwgImMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfcGFyYW1ldGVyIChwLCAyLCAicDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDIsICJ0MSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgMiwgInQyIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnVidyIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfRDEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZ1YnciLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1MxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJzdWJ3IiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsbHciLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1AxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJzaGx3IiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9DMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiYWRkdyIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDIsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInNocnV3IiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9DMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnN1c3diIiwgMCwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9UMiwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIE9SQ19FWEVDVVRPUl9NIChleCkgPSBtOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5wYXJhbXNbT1JDX1ZBUl9EMV0gPSBkMV9zdHJpZGU7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX1MxXSA9IHMxX3N0cmlkZTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX1AxXSA9IHAxOworCisgIGZ1bmMgPSBjLT5leGVjOworICBmdW5jIChleCk7Cit9CisjZW5kaWYKKworCisvKiB2aWRlb19taXhlcl9vcmNfYmxlbmRfYXJnYiAqLworI2lmZGVmIERJU0FCTEVfT1JDCit2b2lkCit2aWRlb19taXhlcl9vcmNfYmxlbmRfYXJnYiAoZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIGQxLCBpbnQgZDFfc3RyaWRlLAorICAgIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMSwgaW50IHMxX3N0cmlkZSwgaW50IHAxLCBpbnQgbiwgaW50IG0pCit7CisgIGludCBpOworICBpbnQgajsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjY0IHZhcjM5OworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID09IDIgJiYgZGVmaW5lZCAoX19pMzg2X18pCisgIHZvbGF0aWxlIG9yY191bmlvbjMyIHZhcjQwOworI2Vsc2UKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisjZW5kaWYKKyAgb3JjX3VuaW9uMzIgdmFyNDE7CisgIG9yY191bmlvbjE2IHZhcjQyOworICBvcmNfaW50OCB2YXI0MzsKKyAgb3JjX3VuaW9uMzIgdmFyNDQ7CisgIG9yY191bmlvbjY0IHZhcjQ1OworICBvcmNfdW5pb242NCB2YXI0NjsKKyAgb3JjX3VuaW9uNjQgdmFyNDc7CisgIG9yY191bmlvbjY0IHZhcjQ4OworICBvcmNfdW5pb24zMiB2YXI0OTsKKyAgb3JjX3VuaW9uNjQgdmFyNTA7CisgIG9yY191bmlvbjY0IHZhcjUxOworICBvcmNfdW5pb242NCB2YXI1MjsKKyAgb3JjX3VuaW9uNjQgdmFyNTM7CisgIG9yY191bmlvbjY0IHZhcjU0OworICBvcmNfdW5pb24zMiB2YXI1NTsKKyAgb3JjX3VuaW9uMzIgdmFyNTY7CisKKyAgZm9yIChqID0gMDsgaiA8IG07IGorKykgeworICAgIHB0cjAgPSBPUkNfUFRSX09GRlNFVCAoZDEsIGQxX3N0cmlkZSAqIGopOworICAgIHB0cjQgPSBPUkNfUFRSX09GRlNFVCAoczEsIHMxX3N0cmlkZSAqIGopOworCisgICAgLyogNTogbG9hZHB3ICovCisgICAgdmFyMzkueDRbMF0gPSBwMTsKKyAgICB2YXIzOS54NFsxXSA9IHAxOworICAgIHZhcjM5Lng0WzJdID0gcDE7CisgICAgdmFyMzkueDRbM10gPSBwMTsKKyAgICAvKiAxNjogbG9hZHBsICovCisgICAgdmFyNDAuaSA9IDB4MDAwMDAwZmY7ICAgICAgIC8qIDI1NSBvciAxLjI1OTg3ZS0zMjFmICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAvKiAwOiBsb2FkbCAqLworICAgICAgdmFyNDEgPSBwdHI0W2ldOworICAgICAgLyogMTogY29udmx3ICovCisgICAgICB2YXI0Mi5pID0gdmFyNDEuaTsKKyAgICAgIC8qIDI6IGNvbnZ3YiAqLworICAgICAgdmFyNDMgPSB2YXI0Mi5pOworICAgICAgLyogMzogc3BsYXRibCAqLworICAgICAgdmFyNDQuaSA9CisgICAgICAgICAgKCgoKG9yY191aW50MzIpIHZhcjQzKSAmIDB4ZmYpIDw8IDI0KSB8ICgoKChvcmNfdWludDMyKSB2YXI0MykgJiAweGZmKQorICAgICAgICAgIDw8IDE2KSB8ICgoKChvcmNfdWludDMyKSB2YXI0MykgJiAweGZmKSA8PCA4KSB8ICgoKG9yY191aW50MzIpIHZhcjQzKQorICAgICAgICAgICYgMHhmZik7CisgICAgICAvKiA0OiBjb252dWJ3ICovCisgICAgICB2YXI0NS54NFswXSA9IChvcmNfdWludDgpIHZhcjQ0Lng0WzBdOworICAgICAgdmFyNDUueDRbMV0gPSAob3JjX3VpbnQ4KSB2YXI0NC54NFsxXTsKKyAgICAgIHZhcjQ1Lng0WzJdID0gKG9yY191aW50OCkgdmFyNDQueDRbMl07CisgICAgICB2YXI0NS54NFszXSA9IChvcmNfdWludDgpIHZhcjQ0Lng0WzNdOworICAgICAgLyogNjogbXVsbHcgKi8KKyAgICAgIHZhcjQ2Lng0WzBdID0gKHZhcjQ1Lng0WzBdICogdmFyMzkueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNDYueDRbMV0gPSAodmFyNDUueDRbMV0gKiB2YXIzOS54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI0Ni54NFsyXSA9ICh2YXI0NS54NFsyXSAqIHZhcjM5Lng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjQ2Lng0WzNdID0gKHZhcjQ1Lng0WzNdICogdmFyMzkueDRbM10pICYgMHhmZmZmOworICAgICAgLyogNzogc2hydXcgKi8KKyAgICAgIHZhcjQ3Lng0WzBdID0gKChvcmNfdWludDE2KSB2YXI0Ni54NFswXSkgPj4gODsKKyAgICAgIHZhcjQ3Lng0WzFdID0gKChvcmNfdWludDE2KSB2YXI0Ni54NFsxXSkgPj4gODsKKyAgICAgIHZhcjQ3Lng0WzJdID0gKChvcmNfdWludDE2KSB2YXI0Ni54NFsyXSkgPj4gODsKKyAgICAgIHZhcjQ3Lng0WzNdID0gKChvcmNfdWludDE2KSB2YXI0Ni54NFszXSkgPj4gODsKKyAgICAgIC8qIDg6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjQ4Lng0WzBdID0gKG9yY191aW50OCkgdmFyNDEueDRbMF07CisgICAgICB2YXI0OC54NFsxXSA9IChvcmNfdWludDgpIHZhcjQxLng0WzFdOworICAgICAgdmFyNDgueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI0MS54NFsyXTsKKyAgICAgIHZhcjQ4Lng0WzNdID0gKG9yY191aW50OCkgdmFyNDEueDRbM107CisgICAgICAvKiA5OiBsb2FkbCAqLworICAgICAgdmFyNDkgPSBwdHIwW2ldOworICAgICAgLyogMTA6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjUwLng0WzBdID0gKG9yY191aW50OCkgdmFyNDkueDRbMF07CisgICAgICB2YXI1MC54NFsxXSA9IChvcmNfdWludDgpIHZhcjQ5Lng0WzFdOworICAgICAgdmFyNTAueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI0OS54NFsyXTsKKyAgICAgIHZhcjUwLng0WzNdID0gKG9yY191aW50OCkgdmFyNDkueDRbM107CisgICAgICAvKiAxMTogc3VidyAqLworICAgICAgdmFyNTEueDRbMF0gPSB2YXI0OC54NFswXSAtIHZhcjUwLng0WzBdOworICAgICAgdmFyNTEueDRbMV0gPSB2YXI0OC54NFsxXSAtIHZhcjUwLng0WzFdOworICAgICAgdmFyNTEueDRbMl0gPSB2YXI0OC54NFsyXSAtIHZhcjUwLng0WzJdOworICAgICAgdmFyNTEueDRbM10gPSB2YXI0OC54NFszXSAtIHZhcjUwLng0WzNdOworICAgICAgLyogMTI6IG11bGx3ICovCisgICAgICB2YXI1Mi54NFswXSA9ICh2YXI1MS54NFswXSAqIHZhcjQ3Lng0WzBdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjUyLng0WzFdID0gKHZhcjUxLng0WzFdICogdmFyNDcueDRbMV0pICYgMHhmZmZmOworICAgICAgdmFyNTIueDRbMl0gPSAodmFyNTEueDRbMl0gKiB2YXI0Ny54NFsyXSkgJiAweGZmZmY7CisgICAgICB2YXI1Mi54NFszXSA9ICh2YXI1MS54NFszXSAqIHZhcjQ3Lng0WzNdKSAmIDB4ZmZmZjsKKyAgICAgIC8qIDEzOiBkaXYyNTV3ICovCisgICAgICB2YXI1My54NFswXSA9CisgICAgICAgICAgKChvcmNfdWludDE2KSAoKChvcmNfdWludDE2KSAodmFyNTIueDRbMF0gKyAxMjgpKSArCisgICAgICAgICAgICAgICgoKG9yY191aW50MTYpICh2YXI1Mi54NFswXSArIDEyOCkpID4+IDgpKSkgPj4gODsKKyAgICAgIHZhcjUzLng0WzFdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI1Mi54NFsxXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjUyLng0WzFdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgdmFyNTMueDRbMl0gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjUyLng0WzJdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNTIueDRbMl0gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICB2YXI1My54NFszXSA9CisgICAgICAgICAgKChvcmNfdWludDE2KSAoKChvcmNfdWludDE2KSAodmFyNTIueDRbM10gKyAxMjgpKSArCisgICAgICAgICAgICAgICgoKG9yY191aW50MTYpICh2YXI1Mi54NFszXSArIDEyOCkpID4+IDgpKSkgPj4gODsKKyAgICAgIC8qIDE0OiBhZGR3ICovCisgICAgICB2YXI1NC54NFswXSA9IHZhcjUwLng0WzBdICsgdmFyNTMueDRbMF07CisgICAgICB2YXI1NC54NFsxXSA9IHZhcjUwLng0WzFdICsgdmFyNTMueDRbMV07CisgICAgICB2YXI1NC54NFsyXSA9IHZhcjUwLng0WzJdICsgdmFyNTMueDRbMl07CisgICAgICB2YXI1NC54NFszXSA9IHZhcjUwLng0WzNdICsgdmFyNTMueDRbM107CisgICAgICAvKiAxNTogY29udndiICovCisgICAgICB2YXI1NS54NFswXSA9IHZhcjU0Lng0WzBdOworICAgICAgdmFyNTUueDRbMV0gPSB2YXI1NC54NFsxXTsKKyAgICAgIHZhcjU1Lng0WzJdID0gdmFyNTQueDRbMl07CisgICAgICB2YXI1NS54NFszXSA9IHZhcjU0Lng0WzNdOworICAgICAgLyogMTc6IG9ybCAqLworICAgICAgdmFyNTYuaSA9IHZhcjU1LmkgfCB2YXI0MC5pOworICAgICAgLyogMTg6IHN0b3JlbCAqLworICAgICAgcHRyMFtpXSA9IHZhcjU2OworICAgIH0KKyAgfQorCit9CisKKyNlbHNlCitzdGF0aWMgdm9pZAorX2JhY2t1cF92aWRlb19taXhlcl9vcmNfYmxlbmRfYXJnYiAoT3JjRXhlY3V0b3IgKiBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgajsKKyAgaW50IG4gPSBleC0+bjsKKyAgaW50IG0gPSBleC0+cGFyYW1zW09SQ19WQVJfQTFdOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uNjQgdmFyMzk7CisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPT0gMiAmJiBkZWZpbmVkIChfX2kzODZfXykKKyAgdm9sYXRpbGUgb3JjX3VuaW9uMzIgdmFyNDA7CisjZWxzZQorICBvcmNfdW5pb24zMiB2YXI0MDsKKyNlbmRpZgorICBvcmNfdW5pb24zMiB2YXI0MTsKKyAgb3JjX3VuaW9uMTYgdmFyNDI7CisgIG9yY19pbnQ4IHZhcjQzOworICBvcmNfdW5pb24zMiB2YXI0NDsKKyAgb3JjX3VuaW9uNjQgdmFyNDU7CisgIG9yY191bmlvbjY0IHZhcjQ2OworICBvcmNfdW5pb242NCB2YXI0NzsKKyAgb3JjX3VuaW9uNjQgdmFyNDg7CisgIG9yY191bmlvbjMyIHZhcjQ5OworICBvcmNfdW5pb242NCB2YXI1MDsKKyAgb3JjX3VuaW9uNjQgdmFyNTE7CisgIG9yY191bmlvbjY0IHZhcjUyOworICBvcmNfdW5pb242NCB2YXI1MzsKKyAgb3JjX3VuaW9uNjQgdmFyNTQ7CisgIG9yY191bmlvbjMyIHZhcjU1OworICBvcmNfdW5pb24zMiB2YXI1NjsKKworICBmb3IgKGogPSAwOyBqIDwgbTsgaisrKSB7CisgICAgcHRyMCA9IE9SQ19QVFJfT0ZGU0VUIChleC0+YXJyYXlzWzBdLCBleC0+cGFyYW1zWzBdICogaik7CisgICAgcHRyNCA9IE9SQ19QVFJfT0ZGU0VUIChleC0+YXJyYXlzWzRdLCBleC0+cGFyYW1zWzRdICogaik7CisKKyAgICAvKiA1OiBsb2FkcHcgKi8KKyAgICB2YXIzOS54NFswXSA9IGV4LT5wYXJhbXNbMjRdOworICAgIHZhcjM5Lng0WzFdID0gZXgtPnBhcmFtc1syNF07CisgICAgdmFyMzkueDRbMl0gPSBleC0+cGFyYW1zWzI0XTsKKyAgICB2YXIzOS54NFszXSA9IGV4LT5wYXJhbXNbMjRdOworICAgIC8qIDE2OiBsb2FkcGwgKi8KKyAgICB2YXI0MC5pID0gMHgwMDAwMDBmZjsgICAgICAgLyogMjU1IG9yIDEuMjU5ODdlLTMyMWYgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIC8qIDA6IGxvYWRsICovCisgICAgICB2YXI0MSA9IHB0cjRbaV07CisgICAgICAvKiAxOiBjb252bHcgKi8KKyAgICAgIHZhcjQyLmkgPSB2YXI0MS5pOworICAgICAgLyogMjogY29udndiICovCisgICAgICB2YXI0MyA9IHZhcjQyLmk7CisgICAgICAvKiAzOiBzcGxhdGJsICovCisgICAgICB2YXI0NC5pID0KKyAgICAgICAgICAoKCgob3JjX3VpbnQzMikgdmFyNDMpICYgMHhmZikgPDwgMjQpIHwgKCgoKG9yY191aW50MzIpIHZhcjQzKSAmIDB4ZmYpCisgICAgICAgICAgPDwgMTYpIHwgKCgoKG9yY191aW50MzIpIHZhcjQzKSAmIDB4ZmYpIDw8IDgpIHwgKCgob3JjX3VpbnQzMikgdmFyNDMpCisgICAgICAgICAgJiAweGZmKTsKKyAgICAgIC8qIDQ6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjQ1Lng0WzBdID0gKG9yY191aW50OCkgdmFyNDQueDRbMF07CisgICAgICB2YXI0NS54NFsxXSA9IChvcmNfdWludDgpIHZhcjQ0Lng0WzFdOworICAgICAgdmFyNDUueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI0NC54NFsyXTsKKyAgICAgIHZhcjQ1Lng0WzNdID0gKG9yY191aW50OCkgdmFyNDQueDRbM107CisgICAgICAvKiA2OiBtdWxsdyAqLworICAgICAgdmFyNDYueDRbMF0gPSAodmFyNDUueDRbMF0gKiB2YXIzOS54NFswXSkgJiAweGZmZmY7CisgICAgICB2YXI0Ni54NFsxXSA9ICh2YXI0NS54NFsxXSAqIHZhcjM5Lng0WzFdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjQ2Lng0WzJdID0gKHZhcjQ1Lng0WzJdICogdmFyMzkueDRbMl0pICYgMHhmZmZmOworICAgICAgdmFyNDYueDRbM10gPSAodmFyNDUueDRbM10gKiB2YXIzOS54NFszXSkgJiAweGZmZmY7CisgICAgICAvKiA3OiBzaHJ1dyAqLworICAgICAgdmFyNDcueDRbMF0gPSAoKG9yY191aW50MTYpIHZhcjQ2Lng0WzBdKSA+PiA4OworICAgICAgdmFyNDcueDRbMV0gPSAoKG9yY191aW50MTYpIHZhcjQ2Lng0WzFdKSA+PiA4OworICAgICAgdmFyNDcueDRbMl0gPSAoKG9yY191aW50MTYpIHZhcjQ2Lng0WzJdKSA+PiA4OworICAgICAgdmFyNDcueDRbM10gPSAoKG9yY191aW50MTYpIHZhcjQ2Lng0WzNdKSA+PiA4OworICAgICAgLyogODogY29udnVidyAqLworICAgICAgdmFyNDgueDRbMF0gPSAob3JjX3VpbnQ4KSB2YXI0MS54NFswXTsKKyAgICAgIHZhcjQ4Lng0WzFdID0gKG9yY191aW50OCkgdmFyNDEueDRbMV07CisgICAgICB2YXI0OC54NFsyXSA9IChvcmNfdWludDgpIHZhcjQxLng0WzJdOworICAgICAgdmFyNDgueDRbM10gPSAob3JjX3VpbnQ4KSB2YXI0MS54NFszXTsKKyAgICAgIC8qIDk6IGxvYWRsICovCisgICAgICB2YXI0OSA9IHB0cjBbaV07CisgICAgICAvKiAxMDogY29udnVidyAqLworICAgICAgdmFyNTAueDRbMF0gPSAob3JjX3VpbnQ4KSB2YXI0OS54NFswXTsKKyAgICAgIHZhcjUwLng0WzFdID0gKG9yY191aW50OCkgdmFyNDkueDRbMV07CisgICAgICB2YXI1MC54NFsyXSA9IChvcmNfdWludDgpIHZhcjQ5Lng0WzJdOworICAgICAgdmFyNTAueDRbM10gPSAob3JjX3VpbnQ4KSB2YXI0OS54NFszXTsKKyAgICAgIC8qIDExOiBzdWJ3ICovCisgICAgICB2YXI1MS54NFswXSA9IHZhcjQ4Lng0WzBdIC0gdmFyNTAueDRbMF07CisgICAgICB2YXI1MS54NFsxXSA9IHZhcjQ4Lng0WzFdIC0gdmFyNTAueDRbMV07CisgICAgICB2YXI1MS54NFsyXSA9IHZhcjQ4Lng0WzJdIC0gdmFyNTAueDRbMl07CisgICAgICB2YXI1MS54NFszXSA9IHZhcjQ4Lng0WzNdIC0gdmFyNTAueDRbM107CisgICAgICAvKiAxMjogbXVsbHcgKi8KKyAgICAgIHZhcjUyLng0WzBdID0gKHZhcjUxLng0WzBdICogdmFyNDcueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNTIueDRbMV0gPSAodmFyNTEueDRbMV0gKiB2YXI0Ny54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI1Mi54NFsyXSA9ICh2YXI1MS54NFsyXSAqIHZhcjQ3Lng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjUyLng0WzNdID0gKHZhcjUxLng0WzNdICogdmFyNDcueDRbM10pICYgMHhmZmZmOworICAgICAgLyogMTM6IGRpdjI1NXcgKi8KKyAgICAgIHZhcjUzLng0WzBdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI1Mi54NFswXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjUyLng0WzBdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgdmFyNTMueDRbMV0gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjUyLng0WzFdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNTIueDRbMV0gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICB2YXI1My54NFsyXSA9CisgICAgICAgICAgKChvcmNfdWludDE2KSAoKChvcmNfdWludDE2KSAodmFyNTIueDRbMl0gKyAxMjgpKSArCisgICAgICAgICAgICAgICgoKG9yY191aW50MTYpICh2YXI1Mi54NFsyXSArIDEyOCkpID4+IDgpKSkgPj4gODsKKyAgICAgIHZhcjUzLng0WzNdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI1Mi54NFszXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjUyLng0WzNdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgLyogMTQ6IGFkZHcgKi8KKyAgICAgIHZhcjU0Lng0WzBdID0gdmFyNTAueDRbMF0gKyB2YXI1My54NFswXTsKKyAgICAgIHZhcjU0Lng0WzFdID0gdmFyNTAueDRbMV0gKyB2YXI1My54NFsxXTsKKyAgICAgIHZhcjU0Lng0WzJdID0gdmFyNTAueDRbMl0gKyB2YXI1My54NFsyXTsKKyAgICAgIHZhcjU0Lng0WzNdID0gdmFyNTAueDRbM10gKyB2YXI1My54NFszXTsKKyAgICAgIC8qIDE1OiBjb252d2IgKi8KKyAgICAgIHZhcjU1Lng0WzBdID0gdmFyNTQueDRbMF07CisgICAgICB2YXI1NS54NFsxXSA9IHZhcjU0Lng0WzFdOworICAgICAgdmFyNTUueDRbMl0gPSB2YXI1NC54NFsyXTsKKyAgICAgIHZhcjU1Lng0WzNdID0gdmFyNTQueDRbM107CisgICAgICAvKiAxNzogb3JsICovCisgICAgICB2YXI1Ni5pID0gdmFyNTUuaSB8IHZhcjQwLmk7CisgICAgICAvKiAxODogc3RvcmVsICovCisgICAgICBwdHIwW2ldID0gdmFyNTY7CisgICAgfQorICB9CisKK30KKwordm9pZAordmlkZW9fbWl4ZXJfb3JjX2JsZW5kX2FyZ2IgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgaW50IGQxX3N0cmlkZSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGludCBzMV9zdHJpZGUsIGludCBwMSwgaW50IG4sIGludCBtKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgNywgOSwgMjYsIDExOCwgMTA1LCAxMDAsIDEwMSwgMTExLCA5NSwgMTA5LCAxMDUsIDEyMCwgMTAxLCAxMTQsIDk1LAorICAgICAgICAxMTEsIDExNCwgOTksIDk1LCA5OCwgMTA4LCAxMDEsIDExMCwgMTAwLCA5NSwgOTcsIDExNCwgMTAzLCA5OCwgMTEsIDQsCisgICAgICAgIDQsIDEyLCA0LCA0LCAxNCwgNCwgMjU1LCAwLCAwLCAwLCAxNCwgMiwgOCwgMCwgMCwgMCwKKyAgICAgICAgMTYsIDIsIDIwLCA0LCAyMCwgMiwgMjAsIDEsIDIwLCA0LCAyMCwgOCwgMjAsIDgsIDIwLCA4LAorICAgICAgICAxMTMsIDMyLCA0LCAxNjMsIDMzLCAzMiwgMTU3LCAzNCwgMzMsIDE1MiwgMzUsIDM0LCAyMSwgMiwgMTUwLCAzOCwKKyAgICAgICAgMzUsIDIxLCAyLCA4OSwgMzgsIDM4LCAyNCwgMjEsIDIsIDk1LCAzOCwgMzgsIDE3LCAyMSwgMiwgMTUwLAorICAgICAgICAzNywgMzIsIDExMywgMzIsIDAsIDIxLCAyLCAxNTAsIDM2LCAzMiwgMjEsIDIsIDk4LCAzNywgMzcsIDM2LAorICAgICAgICAyMSwgMiwgODksIDM3LCAzNywgMzgsIDIxLCAyLCA4MCwgMzcsIDM3LCAyMSwgMiwgNzAsIDM2LCAzNiwKKyAgICAgICAgMzcsIDIxLCAyLCAxNTcsIDMyLCAzNiwgMTIzLCAzMiwgMzIsIDE2LCAxMjgsIDAsIDMyLCAyLCAwLAorICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsIF9iYWNrdXBfdmlkZW9fbWl4ZXJfb3JjX2JsZW5kX2FyZ2IpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfMmQgKHApOworICAgICAgb3JjX3Byb2dyYW1fc2V0X25hbWUgKHAsICJ2aWRlb19taXhlcl9vcmNfYmxlbmRfYXJnYiIpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwgX2JhY2t1cF92aWRlb19taXhlcl9vcmNfYmxlbmRfYXJnYik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDQsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgNCwgInMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfY29uc3RhbnQgKHAsIDQsIDB4MDAwMDAwZmYsICJjMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2NvbnN0YW50IChwLCAyLCAweDAwMDAwMDA4LCAiYzIiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9wYXJhbWV0ZXIgKHAsIDIsICJwMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCAyLCAidDIiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDEsICJ0MyIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQ0Iik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA4LCAidDUiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDgsICJ0NiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgOCwgInQ3Iik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibG9hZGwiLCAwLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1MxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252bHciLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252d2IiLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QyLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJzcGxhdGJsIiwgMCwgT1JDX1ZBUl9UNCwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnVidyIsIDIsIE9SQ19WQVJfVDcsIE9SQ19WQVJfVDQsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGx3IiwgMiwgT1JDX1ZBUl9UNywgT1JDX1ZBUl9UNywgT1JDX1ZBUl9QMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2hydXciLCAyLCBPUkNfVkFSX1Q3LCBPUkNfVkFSX1Q3LCBPUkNfVkFSX0MyLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMiwgT1JDX1ZBUl9UNiwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibG9hZGwiLCAwLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMiwgT1JDX1ZBUl9UNSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic3VidyIsIDIsIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDUsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGx3IiwgMiwgT1JDX1ZBUl9UNiwgT1JDX1ZBUl9UNiwgT1JDX1ZBUl9UNywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiZGl2MjU1dyIsIDIsIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDYsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImFkZHciLCAyLCBPUkNfVkFSX1Q1LCBPUkNfVkFSX1Q1LCBPUkNfVkFSX1Q2LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252d2IiLCAyLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1Q1LCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJvcmwiLCAwLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0MxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJzdG9yZWwiLCAwLCBPUkNfVkFSX0QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworI2VuZGlmCisKKyAgICAgIG9yY19wcm9ncmFtX2NvbXBpbGUgKHApOworICAgICAgYyA9IG9yY19wcm9ncmFtX3Rha2VfY29kZSAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9mcmVlIChwKTsKKyAgICB9CisgICAgcF9pbml0ZWQgPSBUUlVFOworICAgIG9yY19vbmNlX211dGV4X3VubG9jayAoKTsKKyAgfQorICBleC0+YXJyYXlzW09SQ19WQVJfQTJdID0gYzsKKyAgZXgtPnByb2dyYW0gPSAwOworCisgIGV4LT5uID0gbjsKKyAgT1JDX0VYRUNVVE9SX00gKGV4KSA9IG07CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9EMV0gPSBkMTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX0QxXSA9IGQxX3N0cmlkZTsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX1MxXSA9ICh2b2lkICopIHMxOworICBleC0+cGFyYW1zW09SQ19WQVJfUzFdID0gczFfc3RyaWRlOworICBleC0+cGFyYW1zW09SQ19WQVJfUDFdID0gcDE7CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIHZpZGVvX21peGVyX29yY19ibGVuZF9iZ3JhICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK3ZpZGVvX21peGVyX29yY19ibGVuZF9iZ3JhIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsIGludCBkMV9zdHJpZGUsCisgICAgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBpbnQgczFfc3RyaWRlLCBpbnQgcDEsIGludCBuLCBpbnQgbSkKK3sKKyAgaW50IGk7CisgIGludCBqOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uNjQgdmFyNDA7CisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPT0gMiAmJiBkZWZpbmVkIChfX2kzODZfXykKKyAgdm9sYXRpbGUgb3JjX3VuaW9uMzIgdmFyNDE7CisjZWxzZQorICBvcmNfdW5pb24zMiB2YXI0MTsKKyNlbmRpZgorICBvcmNfdW5pb24zMiB2YXI0MjsKKyAgb3JjX3VuaW9uMzIgdmFyNDM7CisgIG9yY191bmlvbjE2IHZhcjQ0OworICBvcmNfaW50OCB2YXI0NTsKKyAgb3JjX3VuaW9uMzIgdmFyNDY7CisgIG9yY191bmlvbjY0IHZhcjQ3OworICBvcmNfdW5pb242NCB2YXI0ODsKKyAgb3JjX3VuaW9uNjQgdmFyNDk7CisgIG9yY191bmlvbjY0IHZhcjUwOworICBvcmNfdW5pb24zMiB2YXI1MTsKKyAgb3JjX3VuaW9uNjQgdmFyNTI7CisgIG9yY191bmlvbjY0IHZhcjUzOworICBvcmNfdW5pb242NCB2YXI1NDsKKyAgb3JjX3VuaW9uNjQgdmFyNTU7CisgIG9yY191bmlvbjY0IHZhcjU2OworICBvcmNfdW5pb24zMiB2YXI1NzsKKyAgb3JjX3VuaW9uMzIgdmFyNTg7CisKKyAgZm9yIChqID0gMDsgaiA8IG07IGorKykgeworICAgIHB0cjAgPSBPUkNfUFRSX09GRlNFVCAoZDEsIGQxX3N0cmlkZSAqIGopOworICAgIHB0cjQgPSBPUkNfUFRSX09GRlNFVCAoczEsIHMxX3N0cmlkZSAqIGopOworCisgICAgLyogNjogbG9hZHB3ICovCisgICAgdmFyNDAueDRbMF0gPSBwMTsKKyAgICB2YXI0MC54NFsxXSA9IHAxOworICAgIHZhcjQwLng0WzJdID0gcDE7CisgICAgdmFyNDAueDRbM10gPSBwMTsKKyAgICAvKiAxNzogbG9hZHBsICovCisgICAgdmFyNDEuaSA9IDB4ZmYwMDAwMDA7ICAgICAgIC8qIC0xNjc3NzIxNiBvciAyLjExMzcxZS0zMTRmICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAvKiAwOiBsb2FkbCAqLworICAgICAgdmFyNDIgPSBwdHI0W2ldOworICAgICAgLyogMTogc2hydWwgKi8KKyAgICAgIHZhcjQzLmkgPSAoKG9yY191aW50MzIpIHZhcjQyLmkpID4+IDI0OworICAgICAgLyogMjogY29udmx3ICovCisgICAgICB2YXI0NC5pID0gdmFyNDMuaTsKKyAgICAgIC8qIDM6IGNvbnZ3YiAqLworICAgICAgdmFyNDUgPSB2YXI0NC5pOworICAgICAgLyogNDogc3BsYXRibCAqLworICAgICAgdmFyNDYuaSA9CisgICAgICAgICAgKCgoKG9yY191aW50MzIpIHZhcjQ1KSAmIDB4ZmYpIDw8IDI0KSB8ICgoKChvcmNfdWludDMyKSB2YXI0NSkgJiAweGZmKQorICAgICAgICAgIDw8IDE2KSB8ICgoKChvcmNfdWludDMyKSB2YXI0NSkgJiAweGZmKSA8PCA4KSB8ICgoKG9yY191aW50MzIpIHZhcjQ1KQorICAgICAgICAgICYgMHhmZik7CisgICAgICAvKiA1OiBjb252dWJ3ICovCisgICAgICB2YXI0Ny54NFswXSA9IChvcmNfdWludDgpIHZhcjQ2Lng0WzBdOworICAgICAgdmFyNDcueDRbMV0gPSAob3JjX3VpbnQ4KSB2YXI0Ni54NFsxXTsKKyAgICAgIHZhcjQ3Lng0WzJdID0gKG9yY191aW50OCkgdmFyNDYueDRbMl07CisgICAgICB2YXI0Ny54NFszXSA9IChvcmNfdWludDgpIHZhcjQ2Lng0WzNdOworICAgICAgLyogNzogbXVsbHcgKi8KKyAgICAgIHZhcjQ4Lng0WzBdID0gKHZhcjQ3Lng0WzBdICogdmFyNDAueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNDgueDRbMV0gPSAodmFyNDcueDRbMV0gKiB2YXI0MC54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI0OC54NFsyXSA9ICh2YXI0Ny54NFsyXSAqIHZhcjQwLng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjQ4Lng0WzNdID0gKHZhcjQ3Lng0WzNdICogdmFyNDAueDRbM10pICYgMHhmZmZmOworICAgICAgLyogODogc2hydXcgKi8KKyAgICAgIHZhcjQ5Lng0WzBdID0gKChvcmNfdWludDE2KSB2YXI0OC54NFswXSkgPj4gODsKKyAgICAgIHZhcjQ5Lng0WzFdID0gKChvcmNfdWludDE2KSB2YXI0OC54NFsxXSkgPj4gODsKKyAgICAgIHZhcjQ5Lng0WzJdID0gKChvcmNfdWludDE2KSB2YXI0OC54NFsyXSkgPj4gODsKKyAgICAgIHZhcjQ5Lng0WzNdID0gKChvcmNfdWludDE2KSB2YXI0OC54NFszXSkgPj4gODsKKyAgICAgIC8qIDk6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjUwLng0WzBdID0gKG9yY191aW50OCkgdmFyNDIueDRbMF07CisgICAgICB2YXI1MC54NFsxXSA9IChvcmNfdWludDgpIHZhcjQyLng0WzFdOworICAgICAgdmFyNTAueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI0Mi54NFsyXTsKKyAgICAgIHZhcjUwLng0WzNdID0gKG9yY191aW50OCkgdmFyNDIueDRbM107CisgICAgICAvKiAxMDogbG9hZGwgKi8KKyAgICAgIHZhcjUxID0gcHRyMFtpXTsKKyAgICAgIC8qIDExOiBjb252dWJ3ICovCisgICAgICB2YXI1Mi54NFswXSA9IChvcmNfdWludDgpIHZhcjUxLng0WzBdOworICAgICAgdmFyNTIueDRbMV0gPSAob3JjX3VpbnQ4KSB2YXI1MS54NFsxXTsKKyAgICAgIHZhcjUyLng0WzJdID0gKG9yY191aW50OCkgdmFyNTEueDRbMl07CisgICAgICB2YXI1Mi54NFszXSA9IChvcmNfdWludDgpIHZhcjUxLng0WzNdOworICAgICAgLyogMTI6IHN1YncgKi8KKyAgICAgIHZhcjUzLng0WzBdID0gdmFyNTAueDRbMF0gLSB2YXI1Mi54NFswXTsKKyAgICAgIHZhcjUzLng0WzFdID0gdmFyNTAueDRbMV0gLSB2YXI1Mi54NFsxXTsKKyAgICAgIHZhcjUzLng0WzJdID0gdmFyNTAueDRbMl0gLSB2YXI1Mi54NFsyXTsKKyAgICAgIHZhcjUzLng0WzNdID0gdmFyNTAueDRbM10gLSB2YXI1Mi54NFszXTsKKyAgICAgIC8qIDEzOiBtdWxsdyAqLworICAgICAgdmFyNTQueDRbMF0gPSAodmFyNTMueDRbMF0gKiB2YXI0OS54NFswXSkgJiAweGZmZmY7CisgICAgICB2YXI1NC54NFsxXSA9ICh2YXI1My54NFsxXSAqIHZhcjQ5Lng0WzFdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjU0Lng0WzJdID0gKHZhcjUzLng0WzJdICogdmFyNDkueDRbMl0pICYgMHhmZmZmOworICAgICAgdmFyNTQueDRbM10gPSAodmFyNTMueDRbM10gKiB2YXI0OS54NFszXSkgJiAweGZmZmY7CisgICAgICAvKiAxNDogZGl2MjU1dyAqLworICAgICAgdmFyNTUueDRbMF0gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjU0Lng0WzBdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNTQueDRbMF0gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICB2YXI1NS54NFsxXSA9CisgICAgICAgICAgKChvcmNfdWludDE2KSAoKChvcmNfdWludDE2KSAodmFyNTQueDRbMV0gKyAxMjgpKSArCisgICAgICAgICAgICAgICgoKG9yY191aW50MTYpICh2YXI1NC54NFsxXSArIDEyOCkpID4+IDgpKSkgPj4gODsKKyAgICAgIHZhcjU1Lng0WzJdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI1NC54NFsyXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjU0Lng0WzJdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgdmFyNTUueDRbM10gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjU0Lng0WzNdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNTQueDRbM10gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICAvKiAxNTogYWRkdyAqLworICAgICAgdmFyNTYueDRbMF0gPSB2YXI1Mi54NFswXSArIHZhcjU1Lng0WzBdOworICAgICAgdmFyNTYueDRbMV0gPSB2YXI1Mi54NFsxXSArIHZhcjU1Lng0WzFdOworICAgICAgdmFyNTYueDRbMl0gPSB2YXI1Mi54NFsyXSArIHZhcjU1Lng0WzJdOworICAgICAgdmFyNTYueDRbM10gPSB2YXI1Mi54NFszXSArIHZhcjU1Lng0WzNdOworICAgICAgLyogMTY6IGNvbnZ3YiAqLworICAgICAgdmFyNTcueDRbMF0gPSB2YXI1Ni54NFswXTsKKyAgICAgIHZhcjU3Lng0WzFdID0gdmFyNTYueDRbMV07CisgICAgICB2YXI1Ny54NFsyXSA9IHZhcjU2Lng0WzJdOworICAgICAgdmFyNTcueDRbM10gPSB2YXI1Ni54NFszXTsKKyAgICAgIC8qIDE4OiBvcmwgKi8KKyAgICAgIHZhcjU4LmkgPSB2YXI1Ny5pIHwgdmFyNDEuaTsKKyAgICAgIC8qIDE5OiBzdG9yZWwgKi8KKyAgICAgIHB0cjBbaV0gPSB2YXI1ODsKKyAgICB9CisgIH0KKworfQorCisjZWxzZQorc3RhdGljIHZvaWQKK19iYWNrdXBfdmlkZW9fbWl4ZXJfb3JjX2JsZW5kX2JncmEgKE9yY0V4ZWN1dG9yICogT1JDX1JFU1RSSUNUIGV4KQoreworICBpbnQgaTsKKyAgaW50IGo7CisgIGludCBuID0gZXgtPm47CisgIGludCBtID0gZXgtPnBhcmFtc1tPUkNfVkFSX0ExXTsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjY0IHZhcjQwOworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID09IDIgJiYgZGVmaW5lZCAoX19pMzg2X18pCisgIHZvbGF0aWxlIG9yY191bmlvbjMyIHZhcjQxOworI2Vsc2UKKyAgb3JjX3VuaW9uMzIgdmFyNDE7CisjZW5kaWYKKyAgb3JjX3VuaW9uMzIgdmFyNDI7CisgIG9yY191bmlvbjMyIHZhcjQzOworICBvcmNfdW5pb24xNiB2YXI0NDsKKyAgb3JjX2ludDggdmFyNDU7CisgIG9yY191bmlvbjMyIHZhcjQ2OworICBvcmNfdW5pb242NCB2YXI0NzsKKyAgb3JjX3VuaW9uNjQgdmFyNDg7CisgIG9yY191bmlvbjY0IHZhcjQ5OworICBvcmNfdW5pb242NCB2YXI1MDsKKyAgb3JjX3VuaW9uMzIgdmFyNTE7CisgIG9yY191bmlvbjY0IHZhcjUyOworICBvcmNfdW5pb242NCB2YXI1MzsKKyAgb3JjX3VuaW9uNjQgdmFyNTQ7CisgIG9yY191bmlvbjY0IHZhcjU1OworICBvcmNfdW5pb242NCB2YXI1NjsKKyAgb3JjX3VuaW9uMzIgdmFyNTc7CisgIG9yY191bmlvbjMyIHZhcjU4OworCisgIGZvciAoaiA9IDA7IGogPCBtOyBqKyspIHsKKyAgICBwdHIwID0gT1JDX1BUUl9PRkZTRVQgKGV4LT5hcnJheXNbMF0sIGV4LT5wYXJhbXNbMF0gKiBqKTsKKyAgICBwdHI0ID0gT1JDX1BUUl9PRkZTRVQgKGV4LT5hcnJheXNbNF0sIGV4LT5wYXJhbXNbNF0gKiBqKTsKKworICAgIC8qIDY6IGxvYWRwdyAqLworICAgIHZhcjQwLng0WzBdID0gZXgtPnBhcmFtc1syNF07CisgICAgdmFyNDAueDRbMV0gPSBleC0+cGFyYW1zWzI0XTsKKyAgICB2YXI0MC54NFsyXSA9IGV4LT5wYXJhbXNbMjRdOworICAgIHZhcjQwLng0WzNdID0gZXgtPnBhcmFtc1syNF07CisgICAgLyogMTc6IGxvYWRwbCAqLworICAgIHZhcjQxLmkgPSAweGZmMDAwMDAwOyAgICAgICAvKiAtMTY3NzcyMTYgb3IgMi4xMTM3MWUtMzE0ZiAqLworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgLyogMDogbG9hZGwgKi8KKyAgICAgIHZhcjQyID0gcHRyNFtpXTsKKyAgICAgIC8qIDE6IHNocnVsICovCisgICAgICB2YXI0My5pID0gKChvcmNfdWludDMyKSB2YXI0Mi5pKSA+PiAyNDsKKyAgICAgIC8qIDI6IGNvbnZsdyAqLworICAgICAgdmFyNDQuaSA9IHZhcjQzLmk7CisgICAgICAvKiAzOiBjb252d2IgKi8KKyAgICAgIHZhcjQ1ID0gdmFyNDQuaTsKKyAgICAgIC8qIDQ6IHNwbGF0YmwgKi8KKyAgICAgIHZhcjQ2LmkgPQorICAgICAgICAgICgoKChvcmNfdWludDMyKSB2YXI0NSkgJiAweGZmKSA8PCAyNCkgfCAoKCgob3JjX3VpbnQzMikgdmFyNDUpICYgMHhmZikKKyAgICAgICAgICA8PCAxNikgfCAoKCgob3JjX3VpbnQzMikgdmFyNDUpICYgMHhmZikgPDwgOCkgfCAoKChvcmNfdWludDMyKSB2YXI0NSkKKyAgICAgICAgICAmIDB4ZmYpOworICAgICAgLyogNTogY29udnVidyAqLworICAgICAgdmFyNDcueDRbMF0gPSAob3JjX3VpbnQ4KSB2YXI0Ni54NFswXTsKKyAgICAgIHZhcjQ3Lng0WzFdID0gKG9yY191aW50OCkgdmFyNDYueDRbMV07CisgICAgICB2YXI0Ny54NFsyXSA9IChvcmNfdWludDgpIHZhcjQ2Lng0WzJdOworICAgICAgdmFyNDcueDRbM10gPSAob3JjX3VpbnQ4KSB2YXI0Ni54NFszXTsKKyAgICAgIC8qIDc6IG11bGx3ICovCisgICAgICB2YXI0OC54NFswXSA9ICh2YXI0Ny54NFswXSAqIHZhcjQwLng0WzBdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjQ4Lng0WzFdID0gKHZhcjQ3Lng0WzFdICogdmFyNDAueDRbMV0pICYgMHhmZmZmOworICAgICAgdmFyNDgueDRbMl0gPSAodmFyNDcueDRbMl0gKiB2YXI0MC54NFsyXSkgJiAweGZmZmY7CisgICAgICB2YXI0OC54NFszXSA9ICh2YXI0Ny54NFszXSAqIHZhcjQwLng0WzNdKSAmIDB4ZmZmZjsKKyAgICAgIC8qIDg6IHNocnV3ICovCisgICAgICB2YXI0OS54NFswXSA9ICgob3JjX3VpbnQxNikgdmFyNDgueDRbMF0pID4+IDg7CisgICAgICB2YXI0OS54NFsxXSA9ICgob3JjX3VpbnQxNikgdmFyNDgueDRbMV0pID4+IDg7CisgICAgICB2YXI0OS54NFsyXSA9ICgob3JjX3VpbnQxNikgdmFyNDgueDRbMl0pID4+IDg7CisgICAgICB2YXI0OS54NFszXSA9ICgob3JjX3VpbnQxNikgdmFyNDgueDRbM10pID4+IDg7CisgICAgICAvKiA5OiBjb252dWJ3ICovCisgICAgICB2YXI1MC54NFswXSA9IChvcmNfdWludDgpIHZhcjQyLng0WzBdOworICAgICAgdmFyNTAueDRbMV0gPSAob3JjX3VpbnQ4KSB2YXI0Mi54NFsxXTsKKyAgICAgIHZhcjUwLng0WzJdID0gKG9yY191aW50OCkgdmFyNDIueDRbMl07CisgICAgICB2YXI1MC54NFszXSA9IChvcmNfdWludDgpIHZhcjQyLng0WzNdOworICAgICAgLyogMTA6IGxvYWRsICovCisgICAgICB2YXI1MSA9IHB0cjBbaV07CisgICAgICAvKiAxMTogY29udnVidyAqLworICAgICAgdmFyNTIueDRbMF0gPSAob3JjX3VpbnQ4KSB2YXI1MS54NFswXTsKKyAgICAgIHZhcjUyLng0WzFdID0gKG9yY191aW50OCkgdmFyNTEueDRbMV07CisgICAgICB2YXI1Mi54NFsyXSA9IChvcmNfdWludDgpIHZhcjUxLng0WzJdOworICAgICAgdmFyNTIueDRbM10gPSAob3JjX3VpbnQ4KSB2YXI1MS54NFszXTsKKyAgICAgIC8qIDEyOiBzdWJ3ICovCisgICAgICB2YXI1My54NFswXSA9IHZhcjUwLng0WzBdIC0gdmFyNTIueDRbMF07CisgICAgICB2YXI1My54NFsxXSA9IHZhcjUwLng0WzFdIC0gdmFyNTIueDRbMV07CisgICAgICB2YXI1My54NFsyXSA9IHZhcjUwLng0WzJdIC0gdmFyNTIueDRbMl07CisgICAgICB2YXI1My54NFszXSA9IHZhcjUwLng0WzNdIC0gdmFyNTIueDRbM107CisgICAgICAvKiAxMzogbXVsbHcgKi8KKyAgICAgIHZhcjU0Lng0WzBdID0gKHZhcjUzLng0WzBdICogdmFyNDkueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNTQueDRbMV0gPSAodmFyNTMueDRbMV0gKiB2YXI0OS54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI1NC54NFsyXSA9ICh2YXI1My54NFsyXSAqIHZhcjQ5Lng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjU0Lng0WzNdID0gKHZhcjUzLng0WzNdICogdmFyNDkueDRbM10pICYgMHhmZmZmOworICAgICAgLyogMTQ6IGRpdjI1NXcgKi8KKyAgICAgIHZhcjU1Lng0WzBdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI1NC54NFswXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjU0Lng0WzBdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgdmFyNTUueDRbMV0gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjU0Lng0WzFdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNTQueDRbMV0gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICB2YXI1NS54NFsyXSA9CisgICAgICAgICAgKChvcmNfdWludDE2KSAoKChvcmNfdWludDE2KSAodmFyNTQueDRbMl0gKyAxMjgpKSArCisgICAgICAgICAgICAgICgoKG9yY191aW50MTYpICh2YXI1NC54NFsyXSArIDEyOCkpID4+IDgpKSkgPj4gODsKKyAgICAgIHZhcjU1Lng0WzNdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI1NC54NFszXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjU0Lng0WzNdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgLyogMTU6IGFkZHcgKi8KKyAgICAgIHZhcjU2Lng0WzBdID0gdmFyNTIueDRbMF0gKyB2YXI1NS54NFswXTsKKyAgICAgIHZhcjU2Lng0WzFdID0gdmFyNTIueDRbMV0gKyB2YXI1NS54NFsxXTsKKyAgICAgIHZhcjU2Lng0WzJdID0gdmFyNTIueDRbMl0gKyB2YXI1NS54NFsyXTsKKyAgICAgIHZhcjU2Lng0WzNdID0gdmFyNTIueDRbM10gKyB2YXI1NS54NFszXTsKKyAgICAgIC8qIDE2OiBjb252d2IgKi8KKyAgICAgIHZhcjU3Lng0WzBdID0gdmFyNTYueDRbMF07CisgICAgICB2YXI1Ny54NFsxXSA9IHZhcjU2Lng0WzFdOworICAgICAgdmFyNTcueDRbMl0gPSB2YXI1Ni54NFsyXTsKKyAgICAgIHZhcjU3Lng0WzNdID0gdmFyNTYueDRbM107CisgICAgICAvKiAxODogb3JsICovCisgICAgICB2YXI1OC5pID0gdmFyNTcuaSB8IHZhcjQxLmk7CisgICAgICAvKiAxOTogc3RvcmVsICovCisgICAgICBwdHIwW2ldID0gdmFyNTg7CisgICAgfQorICB9CisKK30KKwordm9pZAordmlkZW9fbWl4ZXJfb3JjX2JsZW5kX2JncmEgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgaW50IGQxX3N0cmlkZSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGludCBzMV9zdHJpZGUsIGludCBwMSwgaW50IG4sIGludCBtKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgNywgOSwgMjYsIDExOCwgMTA1LCAxMDAsIDEwMSwgMTExLCA5NSwgMTA5LCAxMDUsIDEyMCwgMTAxLCAxMTQsIDk1LAorICAgICAgICAxMTEsIDExNCwgOTksIDk1LCA5OCwgMTA4LCAxMDEsIDExMCwgMTAwLCA5NSwgOTgsIDEwMywgMTE0LCA5NywgMTEsIDQsCisgICAgICAgIDQsIDEyLCA0LCA0LCAxNCwgNCwgMCwgMCwgMCwgMjU1LCAxNCwgNCwgMjQsIDAsIDAsIDAsCisgICAgICAgIDE0LCAyLCA4LCAwLCAwLCAwLCAxNiwgMiwgMjAsIDQsIDIwLCA0LCAyMCwgMiwgMjAsIDEsCisgICAgICAgIDIwLCA0LCAyMCwgOCwgMjAsIDgsIDIwLCA4LCAxMTMsIDMyLCA0LCAxMjYsIDMzLCAzMiwgMTcsIDE2MywKKyAgICAgICAgMzQsIDMzLCAxNTcsIDM1LCAzNCwgMTUyLCAzNiwgMzUsIDIxLCAyLCAxNTAsIDM5LCAzNiwgMjEsIDIsIDg5LAorICAgICAgICAzOSwgMzksIDI0LCAyMSwgMiwgOTUsIDM5LCAzOSwgMTgsIDIxLCAyLCAxNTAsIDM4LCAzMiwgMTEzLCAzMiwKKyAgICAgICAgMCwgMjEsIDIsIDE1MCwgMzcsIDMyLCAyMSwgMiwgOTgsIDM4LCAzOCwgMzcsIDIxLCAyLCA4OSwgMzgsCisgICAgICAgIDM4LCAzOSwgMjEsIDIsIDgwLCAzOCwgMzgsIDIxLCAyLCA3MCwgMzcsIDM3LCAzOCwgMjEsIDIsIDE1NywKKyAgICAgICAgMzIsIDM3LCAxMjMsIDMyLCAzMiwgMTYsIDEyOCwgMCwgMzIsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwgX2JhY2t1cF92aWRlb19taXhlcl9vcmNfYmxlbmRfYmdyYSk7CisjZWxzZQorICAgICAgcCA9IG9yY19wcm9ncmFtX25ldyAoKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF8yZCAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgInZpZGVvX21peGVyX29yY19ibGVuZF9iZ3JhIik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLCBfYmFja3VwX3ZpZGVvX21peGVyX29yY19ibGVuZF9iZ3JhKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9kZXN0aW5hdGlvbiAocCwgNCwgImQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCA0LCAiczEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9jb25zdGFudCAocCwgNCwgMHhmZjAwMDAwMCwgImMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfY29uc3RhbnQgKHAsIDQsIDB4MDAwMDAwMTgsICJjMiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2NvbnN0YW50IChwLCAyLCAweDAwMDAwMDA4LCAiYzMiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9wYXJhbWV0ZXIgKHAsIDIsICJwMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDIiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDIsICJ0MyIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgMSwgInQ0Iik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDUiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDgsICJ0NiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgOCwgInQ3Iik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA4LCAidDgiKTsKKworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJsb2FkbCIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfUzEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInNocnVsIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9DMiwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udmx3IiwgMCwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udndiIiwgMCwgT1JDX1ZBUl9UNCwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic3BsYXRibCIsIDAsIE9SQ19WQVJfVDUsIE9SQ19WQVJfVDQsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZ1YnciLCAyLCBPUkNfVkFSX1Q4LCBPUkNfVkFSX1Q1LCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtdWxsdyIsIDIsIE9SQ19WQVJfVDgsIE9SQ19WQVJfVDgsIE9SQ19WQVJfUDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInNocnV3IiwgMiwgT1JDX1ZBUl9UOCwgT1JDX1ZBUl9UOCwgT1JDX1ZBUl9DMywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnVidyIsIDIsIE9SQ19WQVJfVDcsIE9SQ19WQVJfVDEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImxvYWRsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnVidyIsIDIsIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInN1YnciLCAyLCBPUkNfVkFSX1Q3LCBPUkNfVkFSX1Q3LCBPUkNfVkFSX1Q2LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtdWxsdyIsIDIsIE9SQ19WQVJfVDcsIE9SQ19WQVJfVDcsIE9SQ19WQVJfVDgsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImRpdjI1NXciLCAyLCBPUkNfVkFSX1Q3LCBPUkNfVkFSX1Q3LCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhZGR3IiwgMiwgT1JDX1ZBUl9UNiwgT1JDX1ZBUl9UNiwgT1JDX1ZBUl9UNywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udndiIiwgMiwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UNiwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAib3JsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9DMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic3RvcmVsIiwgMCwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIE9SQ19FWEVDVVRPUl9NIChleCkgPSBtOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5wYXJhbXNbT1JDX1ZBUl9EMV0gPSBkMV9zdHJpZGU7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX1MxXSA9IHMxX3N0cmlkZTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX1AxXSA9IHAxOworCisgIGZ1bmMgPSBjLT5leGVjOworICBmdW5jIChleCk7Cit9CisjZW5kaWYKKworCisvKiB2aWRlb19taXhlcl9vcmNfb3ZlcmxheV9hcmdiICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK3ZpZGVvX21peGVyX29yY19vdmVybGF5X2FyZ2IgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgaW50IGQxX3N0cmlkZSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGludCBzMV9zdHJpZGUsIGludCBwMSwgaW50IG4sIGludCBtKQoreworICBpbnQgaTsKKyAgaW50IGo7CisgIG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb242NCB2YXI0MTsKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA9PSAyICYmIGRlZmluZWQgKF9faTM4Nl9fKQorICB2b2xhdGlsZSBvcmNfdW5pb24zMiB2YXI0MjsKKyNlbHNlCisgIG9yY191bmlvbjMyIHZhcjQyOworI2VuZGlmCisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPT0gMiAmJiBkZWZpbmVkIChfX2kzODZfXykKKyAgdm9sYXRpbGUgb3JjX3VuaW9uMzIgdmFyNDM7CisjZWxzZQorICBvcmNfdW5pb24zMiB2YXI0MzsKKyNlbmRpZgorICBvcmNfdW5pb24zMiB2YXI0NDsKKyAgb3JjX3VuaW9uMTYgdmFyNDU7CisgIG9yY19pbnQ4IHZhcjQ2OworICBvcmNfdW5pb24zMiB2YXI0NzsKKyAgb3JjX3VuaW9uNjQgdmFyNDg7CisgIG9yY191bmlvbjY0IHZhcjQ5OworICBvcmNfdW5pb242NCB2YXI1MDsKKyAgb3JjX3VuaW9uNjQgdmFyNTE7CisgIG9yY191bmlvbjY0IHZhcjUyOworICBvcmNfdW5pb24zMiB2YXI1MzsKKyAgb3JjX3VuaW9uNjQgdmFyNTQ7CisgIG9yY191bmlvbjY0IHZhcjU1OworICBvcmNfdW5pb24zMiB2YXI1NjsKKyAgb3JjX3VuaW9uMTYgdmFyNTc7CisgIG9yY19pbnQ4IHZhcjU4OworICBvcmNfdW5pb24zMiB2YXI1OTsKKyAgb3JjX3VuaW9uNjQgdmFyNjA7CisgIG9yY191bmlvbjY0IHZhcjYxOworICBvcmNfdW5pb242NCB2YXI2MjsKKyAgb3JjX3VuaW9uNjQgdmFyNjM7CisgIG9yY191bmlvbjY0IHZhcjY0OworICBvcmNfdW5pb242NCB2YXI2NTsKKyAgb3JjX3VuaW9uNjQgdmFyNjY7CisgIG9yY191bmlvbjY0IHZhcjY3OworICBvcmNfdW5pb24zMiB2YXI2ODsKKyAgb3JjX3VuaW9uMzIgdmFyNjk7CisgIG9yY191bmlvbjMyIHZhcjcwOworICBvcmNfdW5pb24zMiB2YXI3MTsKKyAgb3JjX3VuaW9uMzIgdmFyNzI7CisKKyAgZm9yIChqID0gMDsgaiA8IG07IGorKykgeworICAgIHB0cjAgPSBPUkNfUFRSX09GRlNFVCAoZDEsIGQxX3N0cmlkZSAqIGopOworICAgIHB0cjQgPSBPUkNfUFRSX09GRlNFVCAoczEsIHMxX3N0cmlkZSAqIGopOworCisgICAgLyogNTogbG9hZHB3ICovCisgICAgdmFyNDEueDRbMF0gPSBwMTsKKyAgICB2YXI0MS54NFsxXSA9IHAxOworICAgIHZhcjQxLng0WzJdID0gcDE7CisgICAgdmFyNDEueDRbM10gPSBwMTsKKyAgICAvKiAxMDogbG9hZHBsICovCisgICAgdmFyNTMuaSA9IDB4ZmZmZmZmZmY7ICAgICAgIC8qIC0xIG9yIDIuMTIyZS0zMTRmICovCisgICAgLyogMjY6IGxvYWRwbCAqLworICAgIHZhcjQyLmkgPSAweGZmZmZmZjAwOyAgICAgICAvKiAtMjU2IG9yIDIuMTIyZS0zMTRmICovCisgICAgLyogMjk6IGxvYWRwbCAqLworICAgIHZhcjQzLmkgPSAweDAwMDAwMGZmOyAgICAgICAvKiAyNTUgb3IgMS4yNTk4N2UtMzIxZiAqLworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgLyogMDogbG9hZGwgKi8KKyAgICAgIHZhcjQ0ID0gcHRyNFtpXTsKKyAgICAgIC8qIDE6IGNvbnZsdyAqLworICAgICAgdmFyNDUuaSA9IHZhcjQ0Lmk7CisgICAgICAvKiAyOiBjb252d2IgKi8KKyAgICAgIHZhcjQ2ID0gdmFyNDUuaTsKKyAgICAgIC8qIDM6IHNwbGF0YmwgKi8KKyAgICAgIHZhcjQ3LmkgPQorICAgICAgICAgICgoKChvcmNfdWludDMyKSB2YXI0NikgJiAweGZmKSA8PCAyNCkgfCAoKCgob3JjX3VpbnQzMikgdmFyNDYpICYgMHhmZikKKyAgICAgICAgICA8PCAxNikgfCAoKCgob3JjX3VpbnQzMikgdmFyNDYpICYgMHhmZikgPDwgOCkgfCAoKChvcmNfdWludDMyKSB2YXI0NikKKyAgICAgICAgICAmIDB4ZmYpOworICAgICAgLyogNDogY29udnVidyAqLworICAgICAgdmFyNDgueDRbMF0gPSAob3JjX3VpbnQ4KSB2YXI0Ny54NFswXTsKKyAgICAgIHZhcjQ4Lng0WzFdID0gKG9yY191aW50OCkgdmFyNDcueDRbMV07CisgICAgICB2YXI0OC54NFsyXSA9IChvcmNfdWludDgpIHZhcjQ3Lng0WzJdOworICAgICAgdmFyNDgueDRbM10gPSAob3JjX3VpbnQ4KSB2YXI0Ny54NFszXTsKKyAgICAgIC8qIDY6IG11bGx3ICovCisgICAgICB2YXI0OS54NFswXSA9ICh2YXI0OC54NFswXSAqIHZhcjQxLng0WzBdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjQ5Lng0WzFdID0gKHZhcjQ4Lng0WzFdICogdmFyNDEueDRbMV0pICYgMHhmZmZmOworICAgICAgdmFyNDkueDRbMl0gPSAodmFyNDgueDRbMl0gKiB2YXI0MS54NFsyXSkgJiAweGZmZmY7CisgICAgICB2YXI0OS54NFszXSA9ICh2YXI0OC54NFszXSAqIHZhcjQxLng0WzNdKSAmIDB4ZmZmZjsKKyAgICAgIC8qIDc6IHNocnV3ICovCisgICAgICB2YXI1MC54NFswXSA9ICgob3JjX3VpbnQxNikgdmFyNDkueDRbMF0pID4+IDg7CisgICAgICB2YXI1MC54NFsxXSA9ICgob3JjX3VpbnQxNikgdmFyNDkueDRbMV0pID4+IDg7CisgICAgICB2YXI1MC54NFsyXSA9ICgob3JjX3VpbnQxNikgdmFyNDkueDRbMl0pID4+IDg7CisgICAgICB2YXI1MC54NFszXSA9ICgob3JjX3VpbnQxNikgdmFyNDkueDRbM10pID4+IDg7CisgICAgICAvKiA4OiBjb252dWJ3ICovCisgICAgICB2YXI1MS54NFswXSA9IChvcmNfdWludDgpIHZhcjQ0Lng0WzBdOworICAgICAgdmFyNTEueDRbMV0gPSAob3JjX3VpbnQ4KSB2YXI0NC54NFsxXTsKKyAgICAgIHZhcjUxLng0WzJdID0gKG9yY191aW50OCkgdmFyNDQueDRbMl07CisgICAgICB2YXI1MS54NFszXSA9IChvcmNfdWludDgpIHZhcjQ0Lng0WzNdOworICAgICAgLyogOTogbXVsbHcgKi8KKyAgICAgIHZhcjUyLng0WzBdID0gKHZhcjUxLng0WzBdICogdmFyNTAueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNTIueDRbMV0gPSAodmFyNTEueDRbMV0gKiB2YXI1MC54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI1Mi54NFsyXSA9ICh2YXI1MS54NFsyXSAqIHZhcjUwLng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjUyLng0WzNdID0gKHZhcjUxLng0WzNdICogdmFyNTAueDRbM10pICYgMHhmZmZmOworICAgICAgLyogMTE6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjU0Lng0WzBdID0gKG9yY191aW50OCkgdmFyNTMueDRbMF07CisgICAgICB2YXI1NC54NFsxXSA9IChvcmNfdWludDgpIHZhcjUzLng0WzFdOworICAgICAgdmFyNTQueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI1My54NFsyXTsKKyAgICAgIHZhcjU0Lng0WzNdID0gKG9yY191aW50OCkgdmFyNTMueDRbM107CisgICAgICAvKiAxMjogc3VidyAqLworICAgICAgdmFyNTUueDRbMF0gPSB2YXI1NC54NFswXSAtIHZhcjUwLng0WzBdOworICAgICAgdmFyNTUueDRbMV0gPSB2YXI1NC54NFsxXSAtIHZhcjUwLng0WzFdOworICAgICAgdmFyNTUueDRbMl0gPSB2YXI1NC54NFsyXSAtIHZhcjUwLng0WzJdOworICAgICAgdmFyNTUueDRbM10gPSB2YXI1NC54NFszXSAtIHZhcjUwLng0WzNdOworICAgICAgLyogMTM6IGxvYWRsICovCisgICAgICB2YXI1NiA9IHB0cjBbaV07CisgICAgICAvKiAxNDogY29udmx3ICovCisgICAgICB2YXI1Ny5pID0gdmFyNTYuaTsKKyAgICAgIC8qIDE1OiBjb252d2IgKi8KKyAgICAgIHZhcjU4ID0gdmFyNTcuaTsKKyAgICAgIC8qIDE2OiBzcGxhdGJsICovCisgICAgICB2YXI1OS5pID0KKyAgICAgICAgICAoKCgob3JjX3VpbnQzMikgdmFyNTgpICYgMHhmZikgPDwgMjQpIHwgKCgoKG9yY191aW50MzIpIHZhcjU4KSAmIDB4ZmYpCisgICAgICAgICAgPDwgMTYpIHwgKCgoKG9yY191aW50MzIpIHZhcjU4KSAmIDB4ZmYpIDw8IDgpIHwgKCgob3JjX3VpbnQzMikgdmFyNTgpCisgICAgICAgICAgJiAweGZmKTsKKyAgICAgIC8qIDE3OiBjb252dWJ3ICovCisgICAgICB2YXI2MC54NFswXSA9IChvcmNfdWludDgpIHZhcjU5Lng0WzBdOworICAgICAgdmFyNjAueDRbMV0gPSAob3JjX3VpbnQ4KSB2YXI1OS54NFsxXTsKKyAgICAgIHZhcjYwLng0WzJdID0gKG9yY191aW50OCkgdmFyNTkueDRbMl07CisgICAgICB2YXI2MC54NFszXSA9IChvcmNfdWludDgpIHZhcjU5Lng0WzNdOworICAgICAgLyogMTg6IG11bGx3ICovCisgICAgICB2YXI2MS54NFswXSA9ICh2YXI2MC54NFswXSAqIHZhcjU1Lng0WzBdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjYxLng0WzFdID0gKHZhcjYwLng0WzFdICogdmFyNTUueDRbMV0pICYgMHhmZmZmOworICAgICAgdmFyNjEueDRbMl0gPSAodmFyNjAueDRbMl0gKiB2YXI1NS54NFsyXSkgJiAweGZmZmY7CisgICAgICB2YXI2MS54NFszXSA9ICh2YXI2MC54NFszXSAqIHZhcjU1Lng0WzNdKSAmIDB4ZmZmZjsKKyAgICAgIC8qIDE5OiBkaXYyNTV3ICovCisgICAgICB2YXI2Mi54NFswXSA9CisgICAgICAgICAgKChvcmNfdWludDE2KSAoKChvcmNfdWludDE2KSAodmFyNjEueDRbMF0gKyAxMjgpKSArCisgICAgICAgICAgICAgICgoKG9yY191aW50MTYpICh2YXI2MS54NFswXSArIDEyOCkpID4+IDgpKSkgPj4gODsKKyAgICAgIHZhcjYyLng0WzFdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI2MS54NFsxXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjYxLng0WzFdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgdmFyNjIueDRbMl0gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjYxLng0WzJdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNjEueDRbMl0gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICB2YXI2Mi54NFszXSA9CisgICAgICAgICAgKChvcmNfdWludDE2KSAoKChvcmNfdWludDE2KSAodmFyNjEueDRbM10gKyAxMjgpKSArCisgICAgICAgICAgICAgICgoKG9yY191aW50MTYpICh2YXI2MS54NFszXSArIDEyOCkpID4+IDgpKSkgPj4gODsKKyAgICAgIC8qIDIwOiBjb252dWJ3ICovCisgICAgICB2YXI2My54NFswXSA9IChvcmNfdWludDgpIHZhcjU2Lng0WzBdOworICAgICAgdmFyNjMueDRbMV0gPSAob3JjX3VpbnQ4KSB2YXI1Ni54NFsxXTsKKyAgICAgIHZhcjYzLng0WzJdID0gKG9yY191aW50OCkgdmFyNTYueDRbMl07CisgICAgICB2YXI2My54NFszXSA9IChvcmNfdWludDgpIHZhcjU2Lng0WzNdOworICAgICAgLyogMjE6IG11bGx3ICovCisgICAgICB2YXI2NC54NFswXSA9ICh2YXI2My54NFswXSAqIHZhcjYyLng0WzBdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjY0Lng0WzFdID0gKHZhcjYzLng0WzFdICogdmFyNjIueDRbMV0pICYgMHhmZmZmOworICAgICAgdmFyNjQueDRbMl0gPSAodmFyNjMueDRbMl0gKiB2YXI2Mi54NFsyXSkgJiAweGZmZmY7CisgICAgICB2YXI2NC54NFszXSA9ICh2YXI2My54NFszXSAqIHZhcjYyLng0WzNdKSAmIDB4ZmZmZjsKKyAgICAgIC8qIDIyOiBhZGR3ICovCisgICAgICB2YXI2NS54NFswXSA9IHZhcjY0Lng0WzBdICsgdmFyNTIueDRbMF07CisgICAgICB2YXI2NS54NFsxXSA9IHZhcjY0Lng0WzFdICsgdmFyNTIueDRbMV07CisgICAgICB2YXI2NS54NFsyXSA9IHZhcjY0Lng0WzJdICsgdmFyNTIueDRbMl07CisgICAgICB2YXI2NS54NFszXSA9IHZhcjY0Lng0WzNdICsgdmFyNTIueDRbM107CisgICAgICAvKiAyMzogYWRkdyAqLworICAgICAgdmFyNjYueDRbMF0gPSB2YXI2Mi54NFswXSArIHZhcjUwLng0WzBdOworICAgICAgdmFyNjYueDRbMV0gPSB2YXI2Mi54NFsxXSArIHZhcjUwLng0WzFdOworICAgICAgdmFyNjYueDRbMl0gPSB2YXI2Mi54NFsyXSArIHZhcjUwLng0WzJdOworICAgICAgdmFyNjYueDRbM10gPSB2YXI2Mi54NFszXSArIHZhcjUwLng0WzNdOworICAgICAgLyogMjQ6IGRpdmx1dyAqLworICAgICAgdmFyNjcueDRbMF0gPQorICAgICAgICAgICgodmFyNjYueDRbMF0gJiAweGZmKSA9PQorICAgICAgICAgIDApID8gMjU1IDogT1JDX0NMQU1QX1VCICgoKG9yY191aW50MTYpIHZhcjY1Lng0WzBdKSAvCisgICAgICAgICAgKChvcmNfdWludDE2KSB2YXI2Ni54NFswXSAmIDB4ZmYpKTsKKyAgICAgIHZhcjY3Lng0WzFdID0KKyAgICAgICAgICAoKHZhcjY2Lng0WzFdICYgMHhmZikgPT0KKyAgICAgICAgICAwKSA/IDI1NSA6IE9SQ19DTEFNUF9VQiAoKChvcmNfdWludDE2KSB2YXI2NS54NFsxXSkgLworICAgICAgICAgICgob3JjX3VpbnQxNikgdmFyNjYueDRbMV0gJiAweGZmKSk7CisgICAgICB2YXI2Ny54NFsyXSA9CisgICAgICAgICAgKCh2YXI2Ni54NFsyXSAmIDB4ZmYpID09CisgICAgICAgICAgMCkgPyAyNTUgOiBPUkNfQ0xBTVBfVUIgKCgob3JjX3VpbnQxNikgdmFyNjUueDRbMl0pIC8KKyAgICAgICAgICAoKG9yY191aW50MTYpIHZhcjY2Lng0WzJdICYgMHhmZikpOworICAgICAgdmFyNjcueDRbM10gPQorICAgICAgICAgICgodmFyNjYueDRbM10gJiAweGZmKSA9PQorICAgICAgICAgIDApID8gMjU1IDogT1JDX0NMQU1QX1VCICgoKG9yY191aW50MTYpIHZhcjY1Lng0WzNdKSAvCisgICAgICAgICAgKChvcmNfdWludDE2KSB2YXI2Ni54NFszXSAmIDB4ZmYpKTsKKyAgICAgIC8qIDI1OiBjb252d2IgKi8KKyAgICAgIHZhcjY4Lng0WzBdID0gdmFyNjcueDRbMF07CisgICAgICB2YXI2OC54NFsxXSA9IHZhcjY3Lng0WzFdOworICAgICAgdmFyNjgueDRbMl0gPSB2YXI2Ny54NFsyXTsKKyAgICAgIHZhcjY4Lng0WzNdID0gdmFyNjcueDRbM107CisgICAgICAvKiAyNzogYW5kbCAqLworICAgICAgdmFyNjkuaSA9IHZhcjY4LmkgJiB2YXI0Mi5pOworICAgICAgLyogMjg6IGNvbnZ3YiAqLworICAgICAgdmFyNzAueDRbMF0gPSB2YXI2Ni54NFswXTsKKyAgICAgIHZhcjcwLng0WzFdID0gdmFyNjYueDRbMV07CisgICAgICB2YXI3MC54NFsyXSA9IHZhcjY2Lng0WzJdOworICAgICAgdmFyNzAueDRbM10gPSB2YXI2Ni54NFszXTsKKyAgICAgIC8qIDMwOiBhbmRsICovCisgICAgICB2YXI3MS5pID0gdmFyNzAuaSAmIHZhcjQzLmk7CisgICAgICAvKiAzMTogb3JsICovCisgICAgICB2YXI3Mi5pID0gdmFyNjkuaSB8IHZhcjcxLmk7CisgICAgICAvKiAzMjogc3RvcmVsICovCisgICAgICBwdHIwW2ldID0gdmFyNzI7CisgICAgfQorICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX3ZpZGVvX21peGVyX29yY19vdmVybGF5X2FyZ2IgKE9yY0V4ZWN1dG9yICogT1JDX1JFU1RSSUNUIGV4KQoreworICBpbnQgaTsKKyAgaW50IGo7CisgIGludCBuID0gZXgtPm47CisgIGludCBtID0gZXgtPnBhcmFtc1tPUkNfVkFSX0ExXTsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjY0IHZhcjQxOworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID09IDIgJiYgZGVmaW5lZCAoX19pMzg2X18pCisgIHZvbGF0aWxlIG9yY191bmlvbjMyIHZhcjQyOworI2Vsc2UKKyAgb3JjX3VuaW9uMzIgdmFyNDI7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA9PSAyICYmIGRlZmluZWQgKF9faTM4Nl9fKQorICB2b2xhdGlsZSBvcmNfdW5pb24zMiB2YXI0MzsKKyNlbHNlCisgIG9yY191bmlvbjMyIHZhcjQzOworI2VuZGlmCisgIG9yY191bmlvbjMyIHZhcjQ0OworICBvcmNfdW5pb24xNiB2YXI0NTsKKyAgb3JjX2ludDggdmFyNDY7CisgIG9yY191bmlvbjMyIHZhcjQ3OworICBvcmNfdW5pb242NCB2YXI0ODsKKyAgb3JjX3VuaW9uNjQgdmFyNDk7CisgIG9yY191bmlvbjY0IHZhcjUwOworICBvcmNfdW5pb242NCB2YXI1MTsKKyAgb3JjX3VuaW9uNjQgdmFyNTI7CisgIG9yY191bmlvbjMyIHZhcjUzOworICBvcmNfdW5pb242NCB2YXI1NDsKKyAgb3JjX3VuaW9uNjQgdmFyNTU7CisgIG9yY191bmlvbjMyIHZhcjU2OworICBvcmNfdW5pb24xNiB2YXI1NzsKKyAgb3JjX2ludDggdmFyNTg7CisgIG9yY191bmlvbjMyIHZhcjU5OworICBvcmNfdW5pb242NCB2YXI2MDsKKyAgb3JjX3VuaW9uNjQgdmFyNjE7CisgIG9yY191bmlvbjY0IHZhcjYyOworICBvcmNfdW5pb242NCB2YXI2MzsKKyAgb3JjX3VuaW9uNjQgdmFyNjQ7CisgIG9yY191bmlvbjY0IHZhcjY1OworICBvcmNfdW5pb242NCB2YXI2NjsKKyAgb3JjX3VuaW9uNjQgdmFyNjc7CisgIG9yY191bmlvbjMyIHZhcjY4OworICBvcmNfdW5pb24zMiB2YXI2OTsKKyAgb3JjX3VuaW9uMzIgdmFyNzA7CisgIG9yY191bmlvbjMyIHZhcjcxOworICBvcmNfdW5pb24zMiB2YXI3MjsKKworICBmb3IgKGogPSAwOyBqIDwgbTsgaisrKSB7CisgICAgcHRyMCA9IE9SQ19QVFJfT0ZGU0VUIChleC0+YXJyYXlzWzBdLCBleC0+cGFyYW1zWzBdICogaik7CisgICAgcHRyNCA9IE9SQ19QVFJfT0ZGU0VUIChleC0+YXJyYXlzWzRdLCBleC0+cGFyYW1zWzRdICogaik7CisKKyAgICAvKiA1OiBsb2FkcHcgKi8KKyAgICB2YXI0MS54NFswXSA9IGV4LT5wYXJhbXNbMjRdOworICAgIHZhcjQxLng0WzFdID0gZXgtPnBhcmFtc1syNF07CisgICAgdmFyNDEueDRbMl0gPSBleC0+cGFyYW1zWzI0XTsKKyAgICB2YXI0MS54NFszXSA9IGV4LT5wYXJhbXNbMjRdOworICAgIC8qIDEwOiBsb2FkcGwgKi8KKyAgICB2YXI1My5pID0gMHhmZmZmZmZmZjsgICAgICAgLyogLTEgb3IgMi4xMjJlLTMxNGYgKi8KKyAgICAvKiAyNjogbG9hZHBsICovCisgICAgdmFyNDIuaSA9IDB4ZmZmZmZmMDA7ICAgICAgIC8qIC0yNTYgb3IgMi4xMjJlLTMxNGYgKi8KKyAgICAvKiAyOTogbG9hZHBsICovCisgICAgdmFyNDMuaSA9IDB4MDAwMDAwZmY7ICAgICAgIC8qIDI1NSBvciAxLjI1OTg3ZS0zMjFmICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAvKiAwOiBsb2FkbCAqLworICAgICAgdmFyNDQgPSBwdHI0W2ldOworICAgICAgLyogMTogY29udmx3ICovCisgICAgICB2YXI0NS5pID0gdmFyNDQuaTsKKyAgICAgIC8qIDI6IGNvbnZ3YiAqLworICAgICAgdmFyNDYgPSB2YXI0NS5pOworICAgICAgLyogMzogc3BsYXRibCAqLworICAgICAgdmFyNDcuaSA9CisgICAgICAgICAgKCgoKG9yY191aW50MzIpIHZhcjQ2KSAmIDB4ZmYpIDw8IDI0KSB8ICgoKChvcmNfdWludDMyKSB2YXI0NikgJiAweGZmKQorICAgICAgICAgIDw8IDE2KSB8ICgoKChvcmNfdWludDMyKSB2YXI0NikgJiAweGZmKSA8PCA4KSB8ICgoKG9yY191aW50MzIpIHZhcjQ2KQorICAgICAgICAgICYgMHhmZik7CisgICAgICAvKiA0OiBjb252dWJ3ICovCisgICAgICB2YXI0OC54NFswXSA9IChvcmNfdWludDgpIHZhcjQ3Lng0WzBdOworICAgICAgdmFyNDgueDRbMV0gPSAob3JjX3VpbnQ4KSB2YXI0Ny54NFsxXTsKKyAgICAgIHZhcjQ4Lng0WzJdID0gKG9yY191aW50OCkgdmFyNDcueDRbMl07CisgICAgICB2YXI0OC54NFszXSA9IChvcmNfdWludDgpIHZhcjQ3Lng0WzNdOworICAgICAgLyogNjogbXVsbHcgKi8KKyAgICAgIHZhcjQ5Lng0WzBdID0gKHZhcjQ4Lng0WzBdICogdmFyNDEueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNDkueDRbMV0gPSAodmFyNDgueDRbMV0gKiB2YXI0MS54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI0OS54NFsyXSA9ICh2YXI0OC54NFsyXSAqIHZhcjQxLng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjQ5Lng0WzNdID0gKHZhcjQ4Lng0WzNdICogdmFyNDEueDRbM10pICYgMHhmZmZmOworICAgICAgLyogNzogc2hydXcgKi8KKyAgICAgIHZhcjUwLng0WzBdID0gKChvcmNfdWludDE2KSB2YXI0OS54NFswXSkgPj4gODsKKyAgICAgIHZhcjUwLng0WzFdID0gKChvcmNfdWludDE2KSB2YXI0OS54NFsxXSkgPj4gODsKKyAgICAgIHZhcjUwLng0WzJdID0gKChvcmNfdWludDE2KSB2YXI0OS54NFsyXSkgPj4gODsKKyAgICAgIHZhcjUwLng0WzNdID0gKChvcmNfdWludDE2KSB2YXI0OS54NFszXSkgPj4gODsKKyAgICAgIC8qIDg6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjUxLng0WzBdID0gKG9yY191aW50OCkgdmFyNDQueDRbMF07CisgICAgICB2YXI1MS54NFsxXSA9IChvcmNfdWludDgpIHZhcjQ0Lng0WzFdOworICAgICAgdmFyNTEueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI0NC54NFsyXTsKKyAgICAgIHZhcjUxLng0WzNdID0gKG9yY191aW50OCkgdmFyNDQueDRbM107CisgICAgICAvKiA5OiBtdWxsdyAqLworICAgICAgdmFyNTIueDRbMF0gPSAodmFyNTEueDRbMF0gKiB2YXI1MC54NFswXSkgJiAweGZmZmY7CisgICAgICB2YXI1Mi54NFsxXSA9ICh2YXI1MS54NFsxXSAqIHZhcjUwLng0WzFdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjUyLng0WzJdID0gKHZhcjUxLng0WzJdICogdmFyNTAueDRbMl0pICYgMHhmZmZmOworICAgICAgdmFyNTIueDRbM10gPSAodmFyNTEueDRbM10gKiB2YXI1MC54NFszXSkgJiAweGZmZmY7CisgICAgICAvKiAxMTogY29udnVidyAqLworICAgICAgdmFyNTQueDRbMF0gPSAob3JjX3VpbnQ4KSB2YXI1My54NFswXTsKKyAgICAgIHZhcjU0Lng0WzFdID0gKG9yY191aW50OCkgdmFyNTMueDRbMV07CisgICAgICB2YXI1NC54NFsyXSA9IChvcmNfdWludDgpIHZhcjUzLng0WzJdOworICAgICAgdmFyNTQueDRbM10gPSAob3JjX3VpbnQ4KSB2YXI1My54NFszXTsKKyAgICAgIC8qIDEyOiBzdWJ3ICovCisgICAgICB2YXI1NS54NFswXSA9IHZhcjU0Lng0WzBdIC0gdmFyNTAueDRbMF07CisgICAgICB2YXI1NS54NFsxXSA9IHZhcjU0Lng0WzFdIC0gdmFyNTAueDRbMV07CisgICAgICB2YXI1NS54NFsyXSA9IHZhcjU0Lng0WzJdIC0gdmFyNTAueDRbMl07CisgICAgICB2YXI1NS54NFszXSA9IHZhcjU0Lng0WzNdIC0gdmFyNTAueDRbM107CisgICAgICAvKiAxMzogbG9hZGwgKi8KKyAgICAgIHZhcjU2ID0gcHRyMFtpXTsKKyAgICAgIC8qIDE0OiBjb252bHcgKi8KKyAgICAgIHZhcjU3LmkgPSB2YXI1Ni5pOworICAgICAgLyogMTU6IGNvbnZ3YiAqLworICAgICAgdmFyNTggPSB2YXI1Ny5pOworICAgICAgLyogMTY6IHNwbGF0YmwgKi8KKyAgICAgIHZhcjU5LmkgPQorICAgICAgICAgICgoKChvcmNfdWludDMyKSB2YXI1OCkgJiAweGZmKSA8PCAyNCkgfCAoKCgob3JjX3VpbnQzMikgdmFyNTgpICYgMHhmZikKKyAgICAgICAgICA8PCAxNikgfCAoKCgob3JjX3VpbnQzMikgdmFyNTgpICYgMHhmZikgPDwgOCkgfCAoKChvcmNfdWludDMyKSB2YXI1OCkKKyAgICAgICAgICAmIDB4ZmYpOworICAgICAgLyogMTc6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjYwLng0WzBdID0gKG9yY191aW50OCkgdmFyNTkueDRbMF07CisgICAgICB2YXI2MC54NFsxXSA9IChvcmNfdWludDgpIHZhcjU5Lng0WzFdOworICAgICAgdmFyNjAueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI1OS54NFsyXTsKKyAgICAgIHZhcjYwLng0WzNdID0gKG9yY191aW50OCkgdmFyNTkueDRbM107CisgICAgICAvKiAxODogbXVsbHcgKi8KKyAgICAgIHZhcjYxLng0WzBdID0gKHZhcjYwLng0WzBdICogdmFyNTUueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNjEueDRbMV0gPSAodmFyNjAueDRbMV0gKiB2YXI1NS54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI2MS54NFsyXSA9ICh2YXI2MC54NFsyXSAqIHZhcjU1Lng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjYxLng0WzNdID0gKHZhcjYwLng0WzNdICogdmFyNTUueDRbM10pICYgMHhmZmZmOworICAgICAgLyogMTk6IGRpdjI1NXcgKi8KKyAgICAgIHZhcjYyLng0WzBdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI2MS54NFswXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjYxLng0WzBdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgdmFyNjIueDRbMV0gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjYxLng0WzFdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNjEueDRbMV0gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICB2YXI2Mi54NFsyXSA9CisgICAgICAgICAgKChvcmNfdWludDE2KSAoKChvcmNfdWludDE2KSAodmFyNjEueDRbMl0gKyAxMjgpKSArCisgICAgICAgICAgICAgICgoKG9yY191aW50MTYpICh2YXI2MS54NFsyXSArIDEyOCkpID4+IDgpKSkgPj4gODsKKyAgICAgIHZhcjYyLng0WzNdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI2MS54NFszXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjYxLng0WzNdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgLyogMjA6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjYzLng0WzBdID0gKG9yY191aW50OCkgdmFyNTYueDRbMF07CisgICAgICB2YXI2My54NFsxXSA9IChvcmNfdWludDgpIHZhcjU2Lng0WzFdOworICAgICAgdmFyNjMueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI1Ni54NFsyXTsKKyAgICAgIHZhcjYzLng0WzNdID0gKG9yY191aW50OCkgdmFyNTYueDRbM107CisgICAgICAvKiAyMTogbXVsbHcgKi8KKyAgICAgIHZhcjY0Lng0WzBdID0gKHZhcjYzLng0WzBdICogdmFyNjIueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNjQueDRbMV0gPSAodmFyNjMueDRbMV0gKiB2YXI2Mi54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI2NC54NFsyXSA9ICh2YXI2My54NFsyXSAqIHZhcjYyLng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjY0Lng0WzNdID0gKHZhcjYzLng0WzNdICogdmFyNjIueDRbM10pICYgMHhmZmZmOworICAgICAgLyogMjI6IGFkZHcgKi8KKyAgICAgIHZhcjY1Lng0WzBdID0gdmFyNjQueDRbMF0gKyB2YXI1Mi54NFswXTsKKyAgICAgIHZhcjY1Lng0WzFdID0gdmFyNjQueDRbMV0gKyB2YXI1Mi54NFsxXTsKKyAgICAgIHZhcjY1Lng0WzJdID0gdmFyNjQueDRbMl0gKyB2YXI1Mi54NFsyXTsKKyAgICAgIHZhcjY1Lng0WzNdID0gdmFyNjQueDRbM10gKyB2YXI1Mi54NFszXTsKKyAgICAgIC8qIDIzOiBhZGR3ICovCisgICAgICB2YXI2Ni54NFswXSA9IHZhcjYyLng0WzBdICsgdmFyNTAueDRbMF07CisgICAgICB2YXI2Ni54NFsxXSA9IHZhcjYyLng0WzFdICsgdmFyNTAueDRbMV07CisgICAgICB2YXI2Ni54NFsyXSA9IHZhcjYyLng0WzJdICsgdmFyNTAueDRbMl07CisgICAgICB2YXI2Ni54NFszXSA9IHZhcjYyLng0WzNdICsgdmFyNTAueDRbM107CisgICAgICAvKiAyNDogZGl2bHV3ICovCisgICAgICB2YXI2Ny54NFswXSA9CisgICAgICAgICAgKCh2YXI2Ni54NFswXSAmIDB4ZmYpID09CisgICAgICAgICAgMCkgPyAyNTUgOiBPUkNfQ0xBTVBfVUIgKCgob3JjX3VpbnQxNikgdmFyNjUueDRbMF0pIC8KKyAgICAgICAgICAoKG9yY191aW50MTYpIHZhcjY2Lng0WzBdICYgMHhmZikpOworICAgICAgdmFyNjcueDRbMV0gPQorICAgICAgICAgICgodmFyNjYueDRbMV0gJiAweGZmKSA9PQorICAgICAgICAgIDApID8gMjU1IDogT1JDX0NMQU1QX1VCICgoKG9yY191aW50MTYpIHZhcjY1Lng0WzFdKSAvCisgICAgICAgICAgKChvcmNfdWludDE2KSB2YXI2Ni54NFsxXSAmIDB4ZmYpKTsKKyAgICAgIHZhcjY3Lng0WzJdID0KKyAgICAgICAgICAoKHZhcjY2Lng0WzJdICYgMHhmZikgPT0KKyAgICAgICAgICAwKSA/IDI1NSA6IE9SQ19DTEFNUF9VQiAoKChvcmNfdWludDE2KSB2YXI2NS54NFsyXSkgLworICAgICAgICAgICgob3JjX3VpbnQxNikgdmFyNjYueDRbMl0gJiAweGZmKSk7CisgICAgICB2YXI2Ny54NFszXSA9CisgICAgICAgICAgKCh2YXI2Ni54NFszXSAmIDB4ZmYpID09CisgICAgICAgICAgMCkgPyAyNTUgOiBPUkNfQ0xBTVBfVUIgKCgob3JjX3VpbnQxNikgdmFyNjUueDRbM10pIC8KKyAgICAgICAgICAoKG9yY191aW50MTYpIHZhcjY2Lng0WzNdICYgMHhmZikpOworICAgICAgLyogMjU6IGNvbnZ3YiAqLworICAgICAgdmFyNjgueDRbMF0gPSB2YXI2Ny54NFswXTsKKyAgICAgIHZhcjY4Lng0WzFdID0gdmFyNjcueDRbMV07CisgICAgICB2YXI2OC54NFsyXSA9IHZhcjY3Lng0WzJdOworICAgICAgdmFyNjgueDRbM10gPSB2YXI2Ny54NFszXTsKKyAgICAgIC8qIDI3OiBhbmRsICovCisgICAgICB2YXI2OS5pID0gdmFyNjguaSAmIHZhcjQyLmk7CisgICAgICAvKiAyODogY29udndiICovCisgICAgICB2YXI3MC54NFswXSA9IHZhcjY2Lng0WzBdOworICAgICAgdmFyNzAueDRbMV0gPSB2YXI2Ni54NFsxXTsKKyAgICAgIHZhcjcwLng0WzJdID0gdmFyNjYueDRbMl07CisgICAgICB2YXI3MC54NFszXSA9IHZhcjY2Lng0WzNdOworICAgICAgLyogMzA6IGFuZGwgKi8KKyAgICAgIHZhcjcxLmkgPSB2YXI3MC5pICYgdmFyNDMuaTsKKyAgICAgIC8qIDMxOiBvcmwgKi8KKyAgICAgIHZhcjcyLmkgPSB2YXI2OS5pIHwgdmFyNzEuaTsKKyAgICAgIC8qIDMyOiBzdG9yZWwgKi8KKyAgICAgIHB0cjBbaV0gPSB2YXI3MjsKKyAgICB9CisgIH0KKworfQorCit2b2lkCit2aWRlb19taXhlcl9vcmNfb3ZlcmxheV9hcmdiIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsIGludCBkMV9zdHJpZGUsCisgICAgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBpbnQgczFfc3RyaWRlLCBpbnQgcDEsIGludCBuLCBpbnQgbSkKK3sKKyAgT3JjRXhlY3V0b3IgX2V4LCAqZXggPSAmX2V4OworICBzdGF0aWMgdm9sYXRpbGUgaW50IHBfaW5pdGVkID0gMDsKKyAgc3RhdGljIE9yY0NvZGUgKmMgPSAwOworICB2b2lkICgqZnVuYykgKE9yY0V4ZWN1dG9yICopOworCisgIGlmICghcF9pbml0ZWQpIHsKKyAgICBvcmNfb25jZV9tdXRleF9sb2NrICgpOworICAgIGlmICghcF9pbml0ZWQpIHsKKyAgICAgIE9yY1Byb2dyYW0gKnA7CisKKyNpZiAxCisgICAgICBzdGF0aWMgY29uc3Qgb3JjX3VpbnQ4IGJjW10gPSB7CisgICAgICAgIDEsIDcsIDksIDI4LCAxMTgsIDEwNSwgMTAwLCAxMDEsIDExMSwgOTUsIDEwOSwgMTA1LCAxMjAsIDEwMSwgMTE0LCA5NSwKKyAgICAgICAgMTExLCAxMTQsIDk5LCA5NSwgMTExLCAxMTgsIDEwMSwgMTE0LCAxMDgsIDk3LCAxMjEsIDk1LCA5NywgMTE0LCAxMDMsCisgICAgICAgIDk4LAorICAgICAgICAxMSwgNCwgNCwgMTIsIDQsIDQsIDE0LCA0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDE0LCA0LCAyNTUsIDAsCisgICAgICAgIDAsIDAsIDE0LCA0LCAwLCAyNTUsIDI1NSwgMjU1LCAxNCwgMiwgOCwgMCwgMCwgMCwgMTYsIDIsCisgICAgICAgIDIwLCA0LCAyMCwgMiwgMjAsIDEsIDIwLCA4LCAyMCwgOCwgMjAsIDgsIDIwLCA0LCAyMCwgOCwKKyAgICAgICAgMjAsIDgsIDExMywgMzIsIDQsIDE2MywgMzMsIDMyLCAxNTcsIDM0LCAzMywgMTUyLCAzOCwgMzQsIDIxLCAyLAorICAgICAgICAxNTAsIDM1LCAzOCwgMjEsIDIsIDg5LCAzNSwgMzUsIDI0LCAyMSwgMiwgOTUsIDM1LCAzNSwgMTksIDIxLAorICAgICAgICAyLCAxNTAsIDQwLCAzMiwgMjEsIDIsIDg5LCA0MCwgNDAsIDM1LCAxMTUsIDM4LCAxNiwgMjEsIDIsIDE1MCwKKyAgICAgICAgMzYsIDM4LCAyMSwgMiwgOTgsIDM2LCAzNiwgMzUsIDExMywgMzIsIDAsIDE2MywgMzMsIDMyLCAxNTcsIDM0LAorICAgICAgICAzMywgMTUyLCAzOCwgMzQsIDIxLCAyLCAxNTAsIDM3LCAzOCwgMjEsIDIsIDg5LCAzNywgMzcsIDM2LCAyMSwKKyAgICAgICAgMiwgODAsIDM3LCAzNywgMjEsIDIsIDE1MCwgMzksIDMyLCAyMSwgMiwgODksIDM5LCAzOSwgMzcsIDIxLAorICAgICAgICAyLCA3MCwgMzksIDM5LCA0MCwgMjEsIDIsIDcwLCAzNywgMzcsIDM1LCAyMSwgMiwgODEsIDM5LCAzOSwKKyAgICAgICAgMzcsIDIxLCAyLCAxNTcsIDMyLCAzOSwgMTA2LCAzMiwgMzIsIDE4LCAyMSwgMiwgMTU3LCAzOCwgMzcsIDEwNiwKKyAgICAgICAgMzgsIDM4LCAxNywgMTIzLCAzMiwgMzIsIDM4LCAxMjgsIDAsIDMyLCAyLCAwLAorICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsIF9iYWNrdXBfdmlkZW9fbWl4ZXJfb3JjX292ZXJsYXlfYXJnYik7CisjZWxzZQorICAgICAgcCA9IG9yY19wcm9ncmFtX25ldyAoKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF8yZCAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgInZpZGVvX21peGVyX29yY19vdmVybGF5X2FyZ2IiKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsIF9iYWNrdXBfdmlkZW9fbWl4ZXJfb3JjX292ZXJsYXlfYXJnYik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDQsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgNCwgInMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfY29uc3RhbnQgKHAsIDQsIDB4ZmZmZmZmZmYsICJjMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2NvbnN0YW50IChwLCA0LCAweDAwMDAwMGZmLCAiYzIiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9jb25zdGFudCAocCwgNCwgMHhmZmZmZmYwMCwgImMzIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfY29uc3RhbnQgKHAsIDIsIDB4MDAwMDAwMDgsICJjNCIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlciAocCwgMiwgInAxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDIsICJ0MiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgMSwgInQzIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA4LCAidDQiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDgsICJ0NSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgOCwgInQ2Iik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDciKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDgsICJ0OCIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgOCwgInQ5Iik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibG9hZGwiLCAwLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1MxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252bHciLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252d2IiLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QyLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJzcGxhdGJsIiwgMCwgT1JDX1ZBUl9UNywgT1JDX1ZBUl9UMywgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnVidyIsIDIsIE9SQ19WQVJfVDQsIE9SQ19WQVJfVDcsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGx3IiwgMiwgT1JDX1ZBUl9UNCwgT1JDX1ZBUl9UNCwgT1JDX1ZBUl9QMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2hydXciLCAyLCBPUkNfVkFSX1Q0LCBPUkNfVkFSX1Q0LCBPUkNfVkFSX0M0LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMiwgT1JDX1ZBUl9UOSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsbHciLCAyLCBPUkNfVkFSX1Q5LCBPUkNfVkFSX1Q5LCBPUkNfVkFSX1Q0LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJsb2FkcGwiLCAwLCBPUkNfVkFSX1Q3LCBPUkNfVkFSX0MxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMiwgT1JDX1ZBUl9UNSwgT1JDX1ZBUl9UNywgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic3VidyIsIDIsIE9SQ19WQVJfVDUsIE9SQ19WQVJfVDUsIE9SQ19WQVJfVDQsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImxvYWRsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udmx3IiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udndiIiwgMCwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic3BsYXRibCIsIDAsIE9SQ19WQVJfVDcsIE9SQ19WQVJfVDMsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZ1YnciLCAyLCBPUkNfVkFSX1Q2LCBPUkNfVkFSX1Q3LCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtdWxsdyIsIDIsIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDUsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImRpdjI1NXciLCAyLCBPUkNfVkFSX1Q2LCBPUkNfVkFSX1Q2LCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMiwgT1JDX1ZBUl9UOCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsbHciLCAyLCBPUkNfVkFSX1Q4LCBPUkNfVkFSX1Q4LCBPUkNfVkFSX1Q2LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhZGR3IiwgMiwgT1JDX1ZBUl9UOCwgT1JDX1ZBUl9UOCwgT1JDX1ZBUl9UOSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiYWRkdyIsIDIsIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDQsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImRpdmx1dyIsIDIsIE9SQ19WQVJfVDgsIE9SQ19WQVJfVDgsIE9SQ19WQVJfVDYsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZ3YiIsIDIsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDgsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImFuZGwiLCAwLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0MzLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252d2IiLCAyLCBPUkNfVkFSX1Q3LCBPUkNfVkFSX1Q2LCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhbmRsIiwgMCwgT1JDX1ZBUl9UNywgT1JDX1ZBUl9UNywgT1JDX1ZBUl9DMiwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAib3JsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UNywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic3RvcmVsIiwgMCwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIE9SQ19FWEVDVVRPUl9NIChleCkgPSBtOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5wYXJhbXNbT1JDX1ZBUl9EMV0gPSBkMV9zdHJpZGU7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX1MxXSA9IHMxX3N0cmlkZTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX1AxXSA9IHAxOworCisgIGZ1bmMgPSBjLT5leGVjOworICBmdW5jIChleCk7Cit9CisjZW5kaWYKKworCisvKiB2aWRlb19taXhlcl9vcmNfb3ZlcmxheV9iZ3JhICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK3ZpZGVvX21peGVyX29yY19vdmVybGF5X2JncmEgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgaW50IGQxX3N0cmlkZSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGludCBzMV9zdHJpZGUsIGludCBwMSwgaW50IG4sIGludCBtKQoreworICBpbnQgaTsKKyAgaW50IGo7CisgIG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb242NCB2YXI0MjsKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA9PSAyICYmIGRlZmluZWQgKF9faTM4Nl9fKQorICB2b2xhdGlsZSBvcmNfdW5pb24zMiB2YXI0MzsKKyNlbHNlCisgIG9yY191bmlvbjMyIHZhcjQzOworI2VuZGlmCisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPT0gMiAmJiBkZWZpbmVkIChfX2kzODZfXykKKyAgdm9sYXRpbGUgb3JjX3VuaW9uMzIgdmFyNDQ7CisjZWxzZQorICBvcmNfdW5pb24zMiB2YXI0NDsKKyNlbmRpZgorICBvcmNfdW5pb24zMiB2YXI0NTsKKyAgb3JjX3VuaW9uMzIgdmFyNDY7CisgIG9yY191bmlvbjE2IHZhcjQ3OworICBvcmNfaW50OCB2YXI0ODsKKyAgb3JjX3VuaW9uMzIgdmFyNDk7CisgIG9yY191bmlvbjY0IHZhcjUwOworICBvcmNfdW5pb242NCB2YXI1MTsKKyAgb3JjX3VuaW9uNjQgdmFyNTI7CisgIG9yY191bmlvbjY0IHZhcjUzOworICBvcmNfdW5pb242NCB2YXI1NDsKKyAgb3JjX3VuaW9uMzIgdmFyNTU7CisgIG9yY191bmlvbjY0IHZhcjU2OworICBvcmNfdW5pb242NCB2YXI1NzsKKyAgb3JjX3VuaW9uMzIgdmFyNTg7CisgIG9yY191bmlvbjMyIHZhcjU5OworICBvcmNfdW5pb24xNiB2YXI2MDsKKyAgb3JjX2ludDggdmFyNjE7CisgIG9yY191bmlvbjMyIHZhcjYyOworICBvcmNfdW5pb242NCB2YXI2MzsKKyAgb3JjX3VuaW9uNjQgdmFyNjQ7CisgIG9yY191bmlvbjY0IHZhcjY1OworICBvcmNfdW5pb242NCB2YXI2NjsKKyAgb3JjX3VuaW9uNjQgdmFyNjc7CisgIG9yY191bmlvbjY0IHZhcjY4OworICBvcmNfdW5pb242NCB2YXI2OTsKKyAgb3JjX3VuaW9uNjQgdmFyNzA7CisgIG9yY191bmlvbjMyIHZhcjcxOworICBvcmNfdW5pb24zMiB2YXI3MjsKKyAgb3JjX3VuaW9uMzIgdmFyNzM7CisgIG9yY191bmlvbjMyIHZhcjc0OworICBvcmNfdW5pb24zMiB2YXI3NTsKKworICBmb3IgKGogPSAwOyBqIDwgbTsgaisrKSB7CisgICAgcHRyMCA9IE9SQ19QVFJfT0ZGU0VUIChkMSwgZDFfc3RyaWRlICogaik7CisgICAgcHRyNCA9IE9SQ19QVFJfT0ZGU0VUIChzMSwgczFfc3RyaWRlICogaik7CisKKyAgICAvKiA2OiBsb2FkcHcgKi8KKyAgICB2YXI0Mi54NFswXSA9IHAxOworICAgIHZhcjQyLng0WzFdID0gcDE7CisgICAgdmFyNDIueDRbMl0gPSBwMTsKKyAgICB2YXI0Mi54NFszXSA9IHAxOworICAgIC8qIDExOiBsb2FkcGwgKi8KKyAgICB2YXI1NS5pID0gMHhmZmZmZmZmZjsgICAgICAgLyogLTEgb3IgMi4xMjJlLTMxNGYgKi8KKyAgICAvKiAyODogbG9hZHBsICovCisgICAgdmFyNDMuaSA9IDB4MDBmZmZmZmY7ICAgICAgIC8qIDE2Nzc3MjE1IG9yIDguMjg5MDVlLTMxN2YgKi8KKyAgICAvKiAzMTogbG9hZHBsICovCisgICAgdmFyNDQuaSA9IDB4ZmYwMDAwMDA7ICAgICAgIC8qIC0xNjc3NzIxNiBvciAyLjExMzcxZS0zMTRmICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAvKiAwOiBsb2FkbCAqLworICAgICAgdmFyNDUgPSBwdHI0W2ldOworICAgICAgLyogMTogc2hydWwgKi8KKyAgICAgIHZhcjQ2LmkgPSAoKG9yY191aW50MzIpIHZhcjQ1LmkpID4+IDI0OworICAgICAgLyogMjogY29udmx3ICovCisgICAgICB2YXI0Ny5pID0gdmFyNDYuaTsKKyAgICAgIC8qIDM6IGNvbnZ3YiAqLworICAgICAgdmFyNDggPSB2YXI0Ny5pOworICAgICAgLyogNDogc3BsYXRibCAqLworICAgICAgdmFyNDkuaSA9CisgICAgICAgICAgKCgoKG9yY191aW50MzIpIHZhcjQ4KSAmIDB4ZmYpIDw8IDI0KSB8ICgoKChvcmNfdWludDMyKSB2YXI0OCkgJiAweGZmKQorICAgICAgICAgIDw8IDE2KSB8ICgoKChvcmNfdWludDMyKSB2YXI0OCkgJiAweGZmKSA8PCA4KSB8ICgoKG9yY191aW50MzIpIHZhcjQ4KQorICAgICAgICAgICYgMHhmZik7CisgICAgICAvKiA1OiBjb252dWJ3ICovCisgICAgICB2YXI1MC54NFswXSA9IChvcmNfdWludDgpIHZhcjQ5Lng0WzBdOworICAgICAgdmFyNTAueDRbMV0gPSAob3JjX3VpbnQ4KSB2YXI0OS54NFsxXTsKKyAgICAgIHZhcjUwLng0WzJdID0gKG9yY191aW50OCkgdmFyNDkueDRbMl07CisgICAgICB2YXI1MC54NFszXSA9IChvcmNfdWludDgpIHZhcjQ5Lng0WzNdOworICAgICAgLyogNzogbXVsbHcgKi8KKyAgICAgIHZhcjUxLng0WzBdID0gKHZhcjUwLng0WzBdICogdmFyNDIueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNTEueDRbMV0gPSAodmFyNTAueDRbMV0gKiB2YXI0Mi54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI1MS54NFsyXSA9ICh2YXI1MC54NFsyXSAqIHZhcjQyLng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjUxLng0WzNdID0gKHZhcjUwLng0WzNdICogdmFyNDIueDRbM10pICYgMHhmZmZmOworICAgICAgLyogODogc2hydXcgKi8KKyAgICAgIHZhcjUyLng0WzBdID0gKChvcmNfdWludDE2KSB2YXI1MS54NFswXSkgPj4gODsKKyAgICAgIHZhcjUyLng0WzFdID0gKChvcmNfdWludDE2KSB2YXI1MS54NFsxXSkgPj4gODsKKyAgICAgIHZhcjUyLng0WzJdID0gKChvcmNfdWludDE2KSB2YXI1MS54NFsyXSkgPj4gODsKKyAgICAgIHZhcjUyLng0WzNdID0gKChvcmNfdWludDE2KSB2YXI1MS54NFszXSkgPj4gODsKKyAgICAgIC8qIDk6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjUzLng0WzBdID0gKG9yY191aW50OCkgdmFyNDUueDRbMF07CisgICAgICB2YXI1My54NFsxXSA9IChvcmNfdWludDgpIHZhcjQ1Lng0WzFdOworICAgICAgdmFyNTMueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI0NS54NFsyXTsKKyAgICAgIHZhcjUzLng0WzNdID0gKG9yY191aW50OCkgdmFyNDUueDRbM107CisgICAgICAvKiAxMDogbXVsbHcgKi8KKyAgICAgIHZhcjU0Lng0WzBdID0gKHZhcjUzLng0WzBdICogdmFyNTIueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNTQueDRbMV0gPSAodmFyNTMueDRbMV0gKiB2YXI1Mi54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI1NC54NFsyXSA9ICh2YXI1My54NFsyXSAqIHZhcjUyLng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjU0Lng0WzNdID0gKHZhcjUzLng0WzNdICogdmFyNTIueDRbM10pICYgMHhmZmZmOworICAgICAgLyogMTI6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjU2Lng0WzBdID0gKG9yY191aW50OCkgdmFyNTUueDRbMF07CisgICAgICB2YXI1Ni54NFsxXSA9IChvcmNfdWludDgpIHZhcjU1Lng0WzFdOworICAgICAgdmFyNTYueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI1NS54NFsyXTsKKyAgICAgIHZhcjU2Lng0WzNdID0gKG9yY191aW50OCkgdmFyNTUueDRbM107CisgICAgICAvKiAxMzogc3VidyAqLworICAgICAgdmFyNTcueDRbMF0gPSB2YXI1Ni54NFswXSAtIHZhcjUyLng0WzBdOworICAgICAgdmFyNTcueDRbMV0gPSB2YXI1Ni54NFsxXSAtIHZhcjUyLng0WzFdOworICAgICAgdmFyNTcueDRbMl0gPSB2YXI1Ni54NFsyXSAtIHZhcjUyLng0WzJdOworICAgICAgdmFyNTcueDRbM10gPSB2YXI1Ni54NFszXSAtIHZhcjUyLng0WzNdOworICAgICAgLyogMTQ6IGxvYWRsICovCisgICAgICB2YXI1OCA9IHB0cjBbaV07CisgICAgICAvKiAxNTogc2hydWwgKi8KKyAgICAgIHZhcjU5LmkgPSAoKG9yY191aW50MzIpIHZhcjU4LmkpID4+IDI0OworICAgICAgLyogMTY6IGNvbnZsdyAqLworICAgICAgdmFyNjAuaSA9IHZhcjU5Lmk7CisgICAgICAvKiAxNzogY29udndiICovCisgICAgICB2YXI2MSA9IHZhcjYwLmk7CisgICAgICAvKiAxODogc3BsYXRibCAqLworICAgICAgdmFyNjIuaSA9CisgICAgICAgICAgKCgoKG9yY191aW50MzIpIHZhcjYxKSAmIDB4ZmYpIDw8IDI0KSB8ICgoKChvcmNfdWludDMyKSB2YXI2MSkgJiAweGZmKQorICAgICAgICAgIDw8IDE2KSB8ICgoKChvcmNfdWludDMyKSB2YXI2MSkgJiAweGZmKSA8PCA4KSB8ICgoKG9yY191aW50MzIpIHZhcjYxKQorICAgICAgICAgICYgMHhmZik7CisgICAgICAvKiAxOTogY29udnVidyAqLworICAgICAgdmFyNjMueDRbMF0gPSAob3JjX3VpbnQ4KSB2YXI2Mi54NFswXTsKKyAgICAgIHZhcjYzLng0WzFdID0gKG9yY191aW50OCkgdmFyNjIueDRbMV07CisgICAgICB2YXI2My54NFsyXSA9IChvcmNfdWludDgpIHZhcjYyLng0WzJdOworICAgICAgdmFyNjMueDRbM10gPSAob3JjX3VpbnQ4KSB2YXI2Mi54NFszXTsKKyAgICAgIC8qIDIwOiBtdWxsdyAqLworICAgICAgdmFyNjQueDRbMF0gPSAodmFyNjMueDRbMF0gKiB2YXI1Ny54NFswXSkgJiAweGZmZmY7CisgICAgICB2YXI2NC54NFsxXSA9ICh2YXI2My54NFsxXSAqIHZhcjU3Lng0WzFdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjY0Lng0WzJdID0gKHZhcjYzLng0WzJdICogdmFyNTcueDRbMl0pICYgMHhmZmZmOworICAgICAgdmFyNjQueDRbM10gPSAodmFyNjMueDRbM10gKiB2YXI1Ny54NFszXSkgJiAweGZmZmY7CisgICAgICAvKiAyMTogZGl2MjU1dyAqLworICAgICAgdmFyNjUueDRbMF0gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjY0Lng0WzBdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNjQueDRbMF0gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICB2YXI2NS54NFsxXSA9CisgICAgICAgICAgKChvcmNfdWludDE2KSAoKChvcmNfdWludDE2KSAodmFyNjQueDRbMV0gKyAxMjgpKSArCisgICAgICAgICAgICAgICgoKG9yY191aW50MTYpICh2YXI2NC54NFsxXSArIDEyOCkpID4+IDgpKSkgPj4gODsKKyAgICAgIHZhcjY1Lng0WzJdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI2NC54NFsyXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjY0Lng0WzJdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgdmFyNjUueDRbM10gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjY0Lng0WzNdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNjQueDRbM10gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICAvKiAyMjogY29udnVidyAqLworICAgICAgdmFyNjYueDRbMF0gPSAob3JjX3VpbnQ4KSB2YXI1OC54NFswXTsKKyAgICAgIHZhcjY2Lng0WzFdID0gKG9yY191aW50OCkgdmFyNTgueDRbMV07CisgICAgICB2YXI2Ni54NFsyXSA9IChvcmNfdWludDgpIHZhcjU4Lng0WzJdOworICAgICAgdmFyNjYueDRbM10gPSAob3JjX3VpbnQ4KSB2YXI1OC54NFszXTsKKyAgICAgIC8qIDIzOiBtdWxsdyAqLworICAgICAgdmFyNjcueDRbMF0gPSAodmFyNjYueDRbMF0gKiB2YXI2NS54NFswXSkgJiAweGZmZmY7CisgICAgICB2YXI2Ny54NFsxXSA9ICh2YXI2Ni54NFsxXSAqIHZhcjY1Lng0WzFdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjY3Lng0WzJdID0gKHZhcjY2Lng0WzJdICogdmFyNjUueDRbMl0pICYgMHhmZmZmOworICAgICAgdmFyNjcueDRbM10gPSAodmFyNjYueDRbM10gKiB2YXI2NS54NFszXSkgJiAweGZmZmY7CisgICAgICAvKiAyNDogYWRkdyAqLworICAgICAgdmFyNjgueDRbMF0gPSB2YXI2Ny54NFswXSArIHZhcjU0Lng0WzBdOworICAgICAgdmFyNjgueDRbMV0gPSB2YXI2Ny54NFsxXSArIHZhcjU0Lng0WzFdOworICAgICAgdmFyNjgueDRbMl0gPSB2YXI2Ny54NFsyXSArIHZhcjU0Lng0WzJdOworICAgICAgdmFyNjgueDRbM10gPSB2YXI2Ny54NFszXSArIHZhcjU0Lng0WzNdOworICAgICAgLyogMjU6IGFkZHcgKi8KKyAgICAgIHZhcjY5Lng0WzBdID0gdmFyNjUueDRbMF0gKyB2YXI1Mi54NFswXTsKKyAgICAgIHZhcjY5Lng0WzFdID0gdmFyNjUueDRbMV0gKyB2YXI1Mi54NFsxXTsKKyAgICAgIHZhcjY5Lng0WzJdID0gdmFyNjUueDRbMl0gKyB2YXI1Mi54NFsyXTsKKyAgICAgIHZhcjY5Lng0WzNdID0gdmFyNjUueDRbM10gKyB2YXI1Mi54NFszXTsKKyAgICAgIC8qIDI2OiBkaXZsdXcgKi8KKyAgICAgIHZhcjcwLng0WzBdID0KKyAgICAgICAgICAoKHZhcjY5Lng0WzBdICYgMHhmZikgPT0KKyAgICAgICAgICAwKSA/IDI1NSA6IE9SQ19DTEFNUF9VQiAoKChvcmNfdWludDE2KSB2YXI2OC54NFswXSkgLworICAgICAgICAgICgob3JjX3VpbnQxNikgdmFyNjkueDRbMF0gJiAweGZmKSk7CisgICAgICB2YXI3MC54NFsxXSA9CisgICAgICAgICAgKCh2YXI2OS54NFsxXSAmIDB4ZmYpID09CisgICAgICAgICAgMCkgPyAyNTUgOiBPUkNfQ0xBTVBfVUIgKCgob3JjX3VpbnQxNikgdmFyNjgueDRbMV0pIC8KKyAgICAgICAgICAoKG9yY191aW50MTYpIHZhcjY5Lng0WzFdICYgMHhmZikpOworICAgICAgdmFyNzAueDRbMl0gPQorICAgICAgICAgICgodmFyNjkueDRbMl0gJiAweGZmKSA9PQorICAgICAgICAgIDApID8gMjU1IDogT1JDX0NMQU1QX1VCICgoKG9yY191aW50MTYpIHZhcjY4Lng0WzJdKSAvCisgICAgICAgICAgKChvcmNfdWludDE2KSB2YXI2OS54NFsyXSAmIDB4ZmYpKTsKKyAgICAgIHZhcjcwLng0WzNdID0KKyAgICAgICAgICAoKHZhcjY5Lng0WzNdICYgMHhmZikgPT0KKyAgICAgICAgICAwKSA/IDI1NSA6IE9SQ19DTEFNUF9VQiAoKChvcmNfdWludDE2KSB2YXI2OC54NFszXSkgLworICAgICAgICAgICgob3JjX3VpbnQxNikgdmFyNjkueDRbM10gJiAweGZmKSk7CisgICAgICAvKiAyNzogY29udndiICovCisgICAgICB2YXI3MS54NFswXSA9IHZhcjcwLng0WzBdOworICAgICAgdmFyNzEueDRbMV0gPSB2YXI3MC54NFsxXTsKKyAgICAgIHZhcjcxLng0WzJdID0gdmFyNzAueDRbMl07CisgICAgICB2YXI3MS54NFszXSA9IHZhcjcwLng0WzNdOworICAgICAgLyogMjk6IGFuZGwgKi8KKyAgICAgIHZhcjcyLmkgPSB2YXI3MS5pICYgdmFyNDMuaTsKKyAgICAgIC8qIDMwOiBjb252d2IgKi8KKyAgICAgIHZhcjczLng0WzBdID0gdmFyNjkueDRbMF07CisgICAgICB2YXI3My54NFsxXSA9IHZhcjY5Lng0WzFdOworICAgICAgdmFyNzMueDRbMl0gPSB2YXI2OS54NFsyXTsKKyAgICAgIHZhcjczLng0WzNdID0gdmFyNjkueDRbM107CisgICAgICAvKiAzMjogYW5kbCAqLworICAgICAgdmFyNzQuaSA9IHZhcjczLmkgJiB2YXI0NC5pOworICAgICAgLyogMzM6IG9ybCAqLworICAgICAgdmFyNzUuaSA9IHZhcjcyLmkgfCB2YXI3NC5pOworICAgICAgLyogMzQ6IHN0b3JlbCAqLworICAgICAgcHRyMFtpXSA9IHZhcjc1OworICAgIH0KKyAgfQorCit9CisKKyNlbHNlCitzdGF0aWMgdm9pZAorX2JhY2t1cF92aWRlb19taXhlcl9vcmNfb3ZlcmxheV9iZ3JhIChPcmNFeGVjdXRvciAqIE9SQ19SRVNUUklDVCBleCkKK3sKKyAgaW50IGk7CisgIGludCBqOworICBpbnQgbiA9IGV4LT5uOworICBpbnQgbSA9IGV4LT5wYXJhbXNbT1JDX1ZBUl9BMV07CisgIG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb242NCB2YXI0MjsKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA9PSAyICYmIGRlZmluZWQgKF9faTM4Nl9fKQorICB2b2xhdGlsZSBvcmNfdW5pb24zMiB2YXI0MzsKKyNlbHNlCisgIG9yY191bmlvbjMyIHZhcjQzOworI2VuZGlmCisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPT0gMiAmJiBkZWZpbmVkIChfX2kzODZfXykKKyAgdm9sYXRpbGUgb3JjX3VuaW9uMzIgdmFyNDQ7CisjZWxzZQorICBvcmNfdW5pb24zMiB2YXI0NDsKKyNlbmRpZgorICBvcmNfdW5pb24zMiB2YXI0NTsKKyAgb3JjX3VuaW9uMzIgdmFyNDY7CisgIG9yY191bmlvbjE2IHZhcjQ3OworICBvcmNfaW50OCB2YXI0ODsKKyAgb3JjX3VuaW9uMzIgdmFyNDk7CisgIG9yY191bmlvbjY0IHZhcjUwOworICBvcmNfdW5pb242NCB2YXI1MTsKKyAgb3JjX3VuaW9uNjQgdmFyNTI7CisgIG9yY191bmlvbjY0IHZhcjUzOworICBvcmNfdW5pb242NCB2YXI1NDsKKyAgb3JjX3VuaW9uMzIgdmFyNTU7CisgIG9yY191bmlvbjY0IHZhcjU2OworICBvcmNfdW5pb242NCB2YXI1NzsKKyAgb3JjX3VuaW9uMzIgdmFyNTg7CisgIG9yY191bmlvbjMyIHZhcjU5OworICBvcmNfdW5pb24xNiB2YXI2MDsKKyAgb3JjX2ludDggdmFyNjE7CisgIG9yY191bmlvbjMyIHZhcjYyOworICBvcmNfdW5pb242NCB2YXI2MzsKKyAgb3JjX3VuaW9uNjQgdmFyNjQ7CisgIG9yY191bmlvbjY0IHZhcjY1OworICBvcmNfdW5pb242NCB2YXI2NjsKKyAgb3JjX3VuaW9uNjQgdmFyNjc7CisgIG9yY191bmlvbjY0IHZhcjY4OworICBvcmNfdW5pb242NCB2YXI2OTsKKyAgb3JjX3VuaW9uNjQgdmFyNzA7CisgIG9yY191bmlvbjMyIHZhcjcxOworICBvcmNfdW5pb24zMiB2YXI3MjsKKyAgb3JjX3VuaW9uMzIgdmFyNzM7CisgIG9yY191bmlvbjMyIHZhcjc0OworICBvcmNfdW5pb24zMiB2YXI3NTsKKworICBmb3IgKGogPSAwOyBqIDwgbTsgaisrKSB7CisgICAgcHRyMCA9IE9SQ19QVFJfT0ZGU0VUIChleC0+YXJyYXlzWzBdLCBleC0+cGFyYW1zWzBdICogaik7CisgICAgcHRyNCA9IE9SQ19QVFJfT0ZGU0VUIChleC0+YXJyYXlzWzRdLCBleC0+cGFyYW1zWzRdICogaik7CisKKyAgICAvKiA2OiBsb2FkcHcgKi8KKyAgICB2YXI0Mi54NFswXSA9IGV4LT5wYXJhbXNbMjRdOworICAgIHZhcjQyLng0WzFdID0gZXgtPnBhcmFtc1syNF07CisgICAgdmFyNDIueDRbMl0gPSBleC0+cGFyYW1zWzI0XTsKKyAgICB2YXI0Mi54NFszXSA9IGV4LT5wYXJhbXNbMjRdOworICAgIC8qIDExOiBsb2FkcGwgKi8KKyAgICB2YXI1NS5pID0gMHhmZmZmZmZmZjsgICAgICAgLyogLTEgb3IgMi4xMjJlLTMxNGYgKi8KKyAgICAvKiAyODogbG9hZHBsICovCisgICAgdmFyNDMuaSA9IDB4MDBmZmZmZmY7ICAgICAgIC8qIDE2Nzc3MjE1IG9yIDguMjg5MDVlLTMxN2YgKi8KKyAgICAvKiAzMTogbG9hZHBsICovCisgICAgdmFyNDQuaSA9IDB4ZmYwMDAwMDA7ICAgICAgIC8qIC0xNjc3NzIxNiBvciAyLjExMzcxZS0zMTRmICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAvKiAwOiBsb2FkbCAqLworICAgICAgdmFyNDUgPSBwdHI0W2ldOworICAgICAgLyogMTogc2hydWwgKi8KKyAgICAgIHZhcjQ2LmkgPSAoKG9yY191aW50MzIpIHZhcjQ1LmkpID4+IDI0OworICAgICAgLyogMjogY29udmx3ICovCisgICAgICB2YXI0Ny5pID0gdmFyNDYuaTsKKyAgICAgIC8qIDM6IGNvbnZ3YiAqLworICAgICAgdmFyNDggPSB2YXI0Ny5pOworICAgICAgLyogNDogc3BsYXRibCAqLworICAgICAgdmFyNDkuaSA9CisgICAgICAgICAgKCgoKG9yY191aW50MzIpIHZhcjQ4KSAmIDB4ZmYpIDw8IDI0KSB8ICgoKChvcmNfdWludDMyKSB2YXI0OCkgJiAweGZmKQorICAgICAgICAgIDw8IDE2KSB8ICgoKChvcmNfdWludDMyKSB2YXI0OCkgJiAweGZmKSA8PCA4KSB8ICgoKG9yY191aW50MzIpIHZhcjQ4KQorICAgICAgICAgICYgMHhmZik7CisgICAgICAvKiA1OiBjb252dWJ3ICovCisgICAgICB2YXI1MC54NFswXSA9IChvcmNfdWludDgpIHZhcjQ5Lng0WzBdOworICAgICAgdmFyNTAueDRbMV0gPSAob3JjX3VpbnQ4KSB2YXI0OS54NFsxXTsKKyAgICAgIHZhcjUwLng0WzJdID0gKG9yY191aW50OCkgdmFyNDkueDRbMl07CisgICAgICB2YXI1MC54NFszXSA9IChvcmNfdWludDgpIHZhcjQ5Lng0WzNdOworICAgICAgLyogNzogbXVsbHcgKi8KKyAgICAgIHZhcjUxLng0WzBdID0gKHZhcjUwLng0WzBdICogdmFyNDIueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNTEueDRbMV0gPSAodmFyNTAueDRbMV0gKiB2YXI0Mi54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI1MS54NFsyXSA9ICh2YXI1MC54NFsyXSAqIHZhcjQyLng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjUxLng0WzNdID0gKHZhcjUwLng0WzNdICogdmFyNDIueDRbM10pICYgMHhmZmZmOworICAgICAgLyogODogc2hydXcgKi8KKyAgICAgIHZhcjUyLng0WzBdID0gKChvcmNfdWludDE2KSB2YXI1MS54NFswXSkgPj4gODsKKyAgICAgIHZhcjUyLng0WzFdID0gKChvcmNfdWludDE2KSB2YXI1MS54NFsxXSkgPj4gODsKKyAgICAgIHZhcjUyLng0WzJdID0gKChvcmNfdWludDE2KSB2YXI1MS54NFsyXSkgPj4gODsKKyAgICAgIHZhcjUyLng0WzNdID0gKChvcmNfdWludDE2KSB2YXI1MS54NFszXSkgPj4gODsKKyAgICAgIC8qIDk6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjUzLng0WzBdID0gKG9yY191aW50OCkgdmFyNDUueDRbMF07CisgICAgICB2YXI1My54NFsxXSA9IChvcmNfdWludDgpIHZhcjQ1Lng0WzFdOworICAgICAgdmFyNTMueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI0NS54NFsyXTsKKyAgICAgIHZhcjUzLng0WzNdID0gKG9yY191aW50OCkgdmFyNDUueDRbM107CisgICAgICAvKiAxMDogbXVsbHcgKi8KKyAgICAgIHZhcjU0Lng0WzBdID0gKHZhcjUzLng0WzBdICogdmFyNTIueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNTQueDRbMV0gPSAodmFyNTMueDRbMV0gKiB2YXI1Mi54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI1NC54NFsyXSA9ICh2YXI1My54NFsyXSAqIHZhcjUyLng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjU0Lng0WzNdID0gKHZhcjUzLng0WzNdICogdmFyNTIueDRbM10pICYgMHhmZmZmOworICAgICAgLyogMTI6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjU2Lng0WzBdID0gKG9yY191aW50OCkgdmFyNTUueDRbMF07CisgICAgICB2YXI1Ni54NFsxXSA9IChvcmNfdWludDgpIHZhcjU1Lng0WzFdOworICAgICAgdmFyNTYueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI1NS54NFsyXTsKKyAgICAgIHZhcjU2Lng0WzNdID0gKG9yY191aW50OCkgdmFyNTUueDRbM107CisgICAgICAvKiAxMzogc3VidyAqLworICAgICAgdmFyNTcueDRbMF0gPSB2YXI1Ni54NFswXSAtIHZhcjUyLng0WzBdOworICAgICAgdmFyNTcueDRbMV0gPSB2YXI1Ni54NFsxXSAtIHZhcjUyLng0WzFdOworICAgICAgdmFyNTcueDRbMl0gPSB2YXI1Ni54NFsyXSAtIHZhcjUyLng0WzJdOworICAgICAgdmFyNTcueDRbM10gPSB2YXI1Ni54NFszXSAtIHZhcjUyLng0WzNdOworICAgICAgLyogMTQ6IGxvYWRsICovCisgICAgICB2YXI1OCA9IHB0cjBbaV07CisgICAgICAvKiAxNTogc2hydWwgKi8KKyAgICAgIHZhcjU5LmkgPSAoKG9yY191aW50MzIpIHZhcjU4LmkpID4+IDI0OworICAgICAgLyogMTY6IGNvbnZsdyAqLworICAgICAgdmFyNjAuaSA9IHZhcjU5Lmk7CisgICAgICAvKiAxNzogY29udndiICovCisgICAgICB2YXI2MSA9IHZhcjYwLmk7CisgICAgICAvKiAxODogc3BsYXRibCAqLworICAgICAgdmFyNjIuaSA9CisgICAgICAgICAgKCgoKG9yY191aW50MzIpIHZhcjYxKSAmIDB4ZmYpIDw8IDI0KSB8ICgoKChvcmNfdWludDMyKSB2YXI2MSkgJiAweGZmKQorICAgICAgICAgIDw8IDE2KSB8ICgoKChvcmNfdWludDMyKSB2YXI2MSkgJiAweGZmKSA8PCA4KSB8ICgoKG9yY191aW50MzIpIHZhcjYxKQorICAgICAgICAgICYgMHhmZik7CisgICAgICAvKiAxOTogY29udnVidyAqLworICAgICAgdmFyNjMueDRbMF0gPSAob3JjX3VpbnQ4KSB2YXI2Mi54NFswXTsKKyAgICAgIHZhcjYzLng0WzFdID0gKG9yY191aW50OCkgdmFyNjIueDRbMV07CisgICAgICB2YXI2My54NFsyXSA9IChvcmNfdWludDgpIHZhcjYyLng0WzJdOworICAgICAgdmFyNjMueDRbM10gPSAob3JjX3VpbnQ4KSB2YXI2Mi54NFszXTsKKyAgICAgIC8qIDIwOiBtdWxsdyAqLworICAgICAgdmFyNjQueDRbMF0gPSAodmFyNjMueDRbMF0gKiB2YXI1Ny54NFswXSkgJiAweGZmZmY7CisgICAgICB2YXI2NC54NFsxXSA9ICh2YXI2My54NFsxXSAqIHZhcjU3Lng0WzFdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjY0Lng0WzJdID0gKHZhcjYzLng0WzJdICogdmFyNTcueDRbMl0pICYgMHhmZmZmOworICAgICAgdmFyNjQueDRbM10gPSAodmFyNjMueDRbM10gKiB2YXI1Ny54NFszXSkgJiAweGZmZmY7CisgICAgICAvKiAyMTogZGl2MjU1dyAqLworICAgICAgdmFyNjUueDRbMF0gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjY0Lng0WzBdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNjQueDRbMF0gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICB2YXI2NS54NFsxXSA9CisgICAgICAgICAgKChvcmNfdWludDE2KSAoKChvcmNfdWludDE2KSAodmFyNjQueDRbMV0gKyAxMjgpKSArCisgICAgICAgICAgICAgICgoKG9yY191aW50MTYpICh2YXI2NC54NFsxXSArIDEyOCkpID4+IDgpKSkgPj4gODsKKyAgICAgIHZhcjY1Lng0WzJdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI2NC54NFsyXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjY0Lng0WzJdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgdmFyNjUueDRbM10gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjY0Lng0WzNdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNjQueDRbM10gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICAvKiAyMjogY29udnVidyAqLworICAgICAgdmFyNjYueDRbMF0gPSAob3JjX3VpbnQ4KSB2YXI1OC54NFswXTsKKyAgICAgIHZhcjY2Lng0WzFdID0gKG9yY191aW50OCkgdmFyNTgueDRbMV07CisgICAgICB2YXI2Ni54NFsyXSA9IChvcmNfdWludDgpIHZhcjU4Lng0WzJdOworICAgICAgdmFyNjYueDRbM10gPSAob3JjX3VpbnQ4KSB2YXI1OC54NFszXTsKKyAgICAgIC8qIDIzOiBtdWxsdyAqLworICAgICAgdmFyNjcueDRbMF0gPSAodmFyNjYueDRbMF0gKiB2YXI2NS54NFswXSkgJiAweGZmZmY7CisgICAgICB2YXI2Ny54NFsxXSA9ICh2YXI2Ni54NFsxXSAqIHZhcjY1Lng0WzFdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjY3Lng0WzJdID0gKHZhcjY2Lng0WzJdICogdmFyNjUueDRbMl0pICYgMHhmZmZmOworICAgICAgdmFyNjcueDRbM10gPSAodmFyNjYueDRbM10gKiB2YXI2NS54NFszXSkgJiAweGZmZmY7CisgICAgICAvKiAyNDogYWRkdyAqLworICAgICAgdmFyNjgueDRbMF0gPSB2YXI2Ny54NFswXSArIHZhcjU0Lng0WzBdOworICAgICAgdmFyNjgueDRbMV0gPSB2YXI2Ny54NFsxXSArIHZhcjU0Lng0WzFdOworICAgICAgdmFyNjgueDRbMl0gPSB2YXI2Ny54NFsyXSArIHZhcjU0Lng0WzJdOworICAgICAgdmFyNjgueDRbM10gPSB2YXI2Ny54NFszXSArIHZhcjU0Lng0WzNdOworICAgICAgLyogMjU6IGFkZHcgKi8KKyAgICAgIHZhcjY5Lng0WzBdID0gdmFyNjUueDRbMF0gKyB2YXI1Mi54NFswXTsKKyAgICAgIHZhcjY5Lng0WzFdID0gdmFyNjUueDRbMV0gKyB2YXI1Mi54NFsxXTsKKyAgICAgIHZhcjY5Lng0WzJdID0gdmFyNjUueDRbMl0gKyB2YXI1Mi54NFsyXTsKKyAgICAgIHZhcjY5Lng0WzNdID0gdmFyNjUueDRbM10gKyB2YXI1Mi54NFszXTsKKyAgICAgIC8qIDI2OiBkaXZsdXcgKi8KKyAgICAgIHZhcjcwLng0WzBdID0KKyAgICAgICAgICAoKHZhcjY5Lng0WzBdICYgMHhmZikgPT0KKyAgICAgICAgICAwKSA/IDI1NSA6IE9SQ19DTEFNUF9VQiAoKChvcmNfdWludDE2KSB2YXI2OC54NFswXSkgLworICAgICAgICAgICgob3JjX3VpbnQxNikgdmFyNjkueDRbMF0gJiAweGZmKSk7CisgICAgICB2YXI3MC54NFsxXSA9CisgICAgICAgICAgKCh2YXI2OS54NFsxXSAmIDB4ZmYpID09CisgICAgICAgICAgMCkgPyAyNTUgOiBPUkNfQ0xBTVBfVUIgKCgob3JjX3VpbnQxNikgdmFyNjgueDRbMV0pIC8KKyAgICAgICAgICAoKG9yY191aW50MTYpIHZhcjY5Lng0WzFdICYgMHhmZikpOworICAgICAgdmFyNzAueDRbMl0gPQorICAgICAgICAgICgodmFyNjkueDRbMl0gJiAweGZmKSA9PQorICAgICAgICAgIDApID8gMjU1IDogT1JDX0NMQU1QX1VCICgoKG9yY191aW50MTYpIHZhcjY4Lng0WzJdKSAvCisgICAgICAgICAgKChvcmNfdWludDE2KSB2YXI2OS54NFsyXSAmIDB4ZmYpKTsKKyAgICAgIHZhcjcwLng0WzNdID0KKyAgICAgICAgICAoKHZhcjY5Lng0WzNdICYgMHhmZikgPT0KKyAgICAgICAgICAwKSA/IDI1NSA6IE9SQ19DTEFNUF9VQiAoKChvcmNfdWludDE2KSB2YXI2OC54NFszXSkgLworICAgICAgICAgICgob3JjX3VpbnQxNikgdmFyNjkueDRbM10gJiAweGZmKSk7CisgICAgICAvKiAyNzogY29udndiICovCisgICAgICB2YXI3MS54NFswXSA9IHZhcjcwLng0WzBdOworICAgICAgdmFyNzEueDRbMV0gPSB2YXI3MC54NFsxXTsKKyAgICAgIHZhcjcxLng0WzJdID0gdmFyNzAueDRbMl07CisgICAgICB2YXI3MS54NFszXSA9IHZhcjcwLng0WzNdOworICAgICAgLyogMjk6IGFuZGwgKi8KKyAgICAgIHZhcjcyLmkgPSB2YXI3MS5pICYgdmFyNDMuaTsKKyAgICAgIC8qIDMwOiBjb252d2IgKi8KKyAgICAgIHZhcjczLng0WzBdID0gdmFyNjkueDRbMF07CisgICAgICB2YXI3My54NFsxXSA9IHZhcjY5Lng0WzFdOworICAgICAgdmFyNzMueDRbMl0gPSB2YXI2OS54NFsyXTsKKyAgICAgIHZhcjczLng0WzNdID0gdmFyNjkueDRbM107CisgICAgICAvKiAzMjogYW5kbCAqLworICAgICAgdmFyNzQuaSA9IHZhcjczLmkgJiB2YXI0NC5pOworICAgICAgLyogMzM6IG9ybCAqLworICAgICAgdmFyNzUuaSA9IHZhcjcyLmkgfCB2YXI3NC5pOworICAgICAgLyogMzQ6IHN0b3JlbCAqLworICAgICAgcHRyMFtpXSA9IHZhcjc1OworICAgIH0KKyAgfQorCit9CisKK3ZvaWQKK3ZpZGVvX21peGVyX29yY19vdmVybGF5X2JncmEgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgaW50IGQxX3N0cmlkZSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGludCBzMV9zdHJpZGUsIGludCBwMSwgaW50IG4sIGludCBtKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgNywgOSwgMjgsIDExOCwgMTA1LCAxMDAsIDEwMSwgMTExLCA5NSwgMTA5LCAxMDUsIDEyMCwgMTAxLCAxMTQsIDk1LAorICAgICAgICAxMTEsIDExNCwgOTksIDk1LCAxMTEsIDExOCwgMTAxLCAxMTQsIDEwOCwgOTcsIDEyMSwgOTUsIDk4LCAxMDMsIDExNCwKKyAgICAgICAgOTcsCisgICAgICAgIDExLCA0LCA0LCAxMiwgNCwgNCwgMTQsIDQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMTQsIDQsIDAsIDAsCisgICAgICAgIDAsIDI1NSwgMTQsIDQsIDI1NSwgMjU1LCAyNTUsIDAsIDE0LCA0LCAyNCwgMCwgMCwgMCwgMTQsIDIsCisgICAgICAgIDgsIDAsIDAsIDAsIDE2LCAyLCAyMCwgNCwgMjAsIDQsIDIwLCAyLCAyMCwgMSwgMjAsIDgsCisgICAgICAgIDIwLCA4LCAyMCwgOCwgMjAsIDQsIDIwLCA4LCAyMCwgOCwgMTEzLCAzMiwgNCwgMTI2LCAzMywgMzIsCisgICAgICAgIDE5LCAxNjMsIDM0LCAzMywgMTU3LCAzNSwgMzQsIDE1MiwgMzksIDM1LCAyMSwgMiwgMTUwLCAzNiwgMzksIDIxLAorICAgICAgICAyLCA4OSwgMzYsIDM2LCAyNCwgMjEsIDIsIDk1LCAzNiwgMzYsIDIwLCAyMSwgMiwgMTUwLCA0MSwgMzIsCisgICAgICAgIDIxLCAyLCA4OSwgNDEsIDQxLCAzNiwgMTE1LCAzOSwgMTYsIDIxLCAyLCAxNTAsIDM3LCAzOSwgMjEsIDIsCisgICAgICAgIDk4LCAzNywgMzcsIDM2LCAxMTMsIDMyLCAwLCAxMjYsIDMzLCAzMiwgMTksIDE2MywgMzQsIDMzLCAxNTcsIDM1LAorICAgICAgICAzNCwgMTUyLCAzOSwgMzUsIDIxLCAyLCAxNTAsIDM4LCAzOSwgMjEsIDIsIDg5LCAzOCwgMzgsIDM3LCAyMSwKKyAgICAgICAgMiwgODAsIDM4LCAzOCwgMjEsIDIsIDE1MCwgNDAsIDMyLCAyMSwgMiwgODksIDQwLCA0MCwgMzgsIDIxLAorICAgICAgICAyLCA3MCwgNDAsIDQwLCA0MSwgMjEsIDIsIDcwLCAzOCwgMzgsIDM2LCAyMSwgMiwgODEsIDQwLCA0MCwKKyAgICAgICAgMzgsIDIxLCAyLCAxNTcsIDMyLCA0MCwgMTA2LCAzMiwgMzIsIDE4LCAyMSwgMiwgMTU3LCAzOSwgMzgsIDEwNiwKKyAgICAgICAgMzksIDM5LCAxNywgMTIzLCAzMiwgMzIsIDM5LCAxMjgsIDAsIDMyLCAyLCAwLAorICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsIF9iYWNrdXBfdmlkZW9fbWl4ZXJfb3JjX292ZXJsYXlfYmdyYSk7CisjZWxzZQorICAgICAgcCA9IG9yY19wcm9ncmFtX25ldyAoKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF8yZCAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgInZpZGVvX21peGVyX29yY19vdmVybGF5X2JncmEiKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsIF9iYWNrdXBfdmlkZW9fbWl4ZXJfb3JjX292ZXJsYXlfYmdyYSk7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDQsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgNCwgInMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfY29uc3RhbnQgKHAsIDQsIDB4ZmZmZmZmZmYsICJjMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2NvbnN0YW50IChwLCA0LCAweGZmMDAwMDAwLCAiYzIiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9jb25zdGFudCAocCwgNCwgMHgwMGZmZmZmZiwgImMzIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfY29uc3RhbnQgKHAsIDQsIDB4MDAwMDAwMTgsICJjNCIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2NvbnN0YW50IChwLCAyLCAweDAwMDAwMDA4LCAiYzUiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9wYXJhbWV0ZXIgKHAsIDIsICJwMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDIiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDIsICJ0MyIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgMSwgInQ0Iik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA4LCAidDUiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDgsICJ0NiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgOCwgInQ3Iik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDgiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDgsICJ0OSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgOCwgInQxMCIpOworCisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImxvYWRsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9TMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2hydWwiLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0M0LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252bHciLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QyLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252d2IiLCAwLCBPUkNfVkFSX1Q0LCBPUkNfVkFSX1QzLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJzcGxhdGJsIiwgMCwgT1JDX1ZBUl9UOCwgT1JDX1ZBUl9UNCwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnVidyIsIDIsIE9SQ19WQVJfVDUsIE9SQ19WQVJfVDgsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGx3IiwgMiwgT1JDX1ZBUl9UNSwgT1JDX1ZBUl9UNSwgT1JDX1ZBUl9QMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2hydXciLCAyLCBPUkNfVkFSX1Q1LCBPUkNfVkFSX1Q1LCBPUkNfVkFSX0M1LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMiwgT1JDX1ZBUl9UMTAsIE9SQ19WQVJfVDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGx3IiwgMiwgT1JDX1ZBUl9UMTAsIE9SQ19WQVJfVDEwLCBPUkNfVkFSX1Q1LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJsb2FkcGwiLCAwLCBPUkNfVkFSX1Q4LCBPUkNfVkFSX0MxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMiwgT1JDX1ZBUl9UNiwgT1JDX1ZBUl9UOCwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic3VidyIsIDIsIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDUsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImxvYWRsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2hydWwiLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0M0LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252bHciLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QyLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252d2IiLCAwLCBPUkNfVkFSX1Q0LCBPUkNfVkFSX1QzLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJzcGxhdGJsIiwgMCwgT1JDX1ZBUl9UOCwgT1JDX1ZBUl9UNCwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnVidyIsIDIsIE9SQ19WQVJfVDcsIE9SQ19WQVJfVDgsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGx3IiwgMiwgT1JDX1ZBUl9UNywgT1JDX1ZBUl9UNywgT1JDX1ZBUl9UNiwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiZGl2MjU1dyIsIDIsIE9SQ19WQVJfVDcsIE9SQ19WQVJfVDcsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZ1YnciLCAyLCBPUkNfVkFSX1Q5LCBPUkNfVkFSX1QxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtdWxsdyIsIDIsIE9SQ19WQVJfVDksIE9SQ19WQVJfVDksIE9SQ19WQVJfVDcsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImFkZHciLCAyLCBPUkNfVkFSX1Q5LCBPUkNfVkFSX1Q5LCBPUkNfVkFSX1QxMCwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiYWRkdyIsIDIsIE9SQ19WQVJfVDcsIE9SQ19WQVJfVDcsIE9SQ19WQVJfVDUsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImRpdmx1dyIsIDIsIE9SQ19WQVJfVDksIE9SQ19WQVJfVDksIE9SQ19WQVJfVDcsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZ3YiIsIDIsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDksIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImFuZGwiLCAwLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0MzLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252d2IiLCAyLCBPUkNfVkFSX1Q4LCBPUkNfVkFSX1Q3LCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhbmRsIiwgMCwgT1JDX1ZBUl9UOCwgT1JDX1ZBUl9UOCwgT1JDX1ZBUl9DMiwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAib3JsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UOCwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic3RvcmVsIiwgMCwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIE9SQ19FWEVDVVRPUl9NIChleCkgPSBtOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5wYXJhbXNbT1JDX1ZBUl9EMV0gPSBkMV9zdHJpZGU7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX1MxXSA9IHMxX3N0cmlkZTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX1AxXSA9IHAxOworCisgIGZ1bmMgPSBjLT5leGVjOworICBmdW5jIChleCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXJvcmMtZGlzdC5oIGIvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy1kaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBjMDcwZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXJvcmMtZGlzdC5oCkBAIC0wLDAgKzEsOTYgQEAKKworLyogYXV0b2dlbmVyYXRlZCBmcm9tIHZpZGVvbWl4ZXJvcmMub3JjICovCisKKyNpZm5kZWYgX1ZJREVPTUlYRVJPUkNfSF8KKyNkZWZpbmUgX1ZJREVPTUlYRVJPUkNfSF8KKworI2luY2x1ZGUgPGdsaWIuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKworI2lmbmRlZiBfT1JDX0lOVEVHRVJfVFlQRURFRlNfCisjZGVmaW5lIF9PUkNfSU5URUdFUl9UWVBFREVGU18KKyNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorI2luY2x1ZGUgPHN0ZGludC5oPgordHlwZWRlZiBpbnQ4X3Qgb3JjX2ludDg7Cit0eXBlZGVmIGludDE2X3Qgb3JjX2ludDE2OwordHlwZWRlZiBpbnQzMl90IG9yY19pbnQzMjsKK3R5cGVkZWYgaW50NjRfdCBvcmNfaW50NjQ7Cit0eXBlZGVmIHVpbnQ4X3Qgb3JjX3VpbnQ4OwordHlwZWRlZiB1aW50MTZfdCBvcmNfdWludDE2OwordHlwZWRlZiB1aW50MzJfdCBvcmNfdWludDMyOwordHlwZWRlZiB1aW50NjRfdCBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgVUlOVDY0X0MoeCkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCit0eXBlZGVmIHNpZ25lZCBfX2ludDggb3JjX2ludDg7Cit0eXBlZGVmIHNpZ25lZCBfX2ludDE2IG9yY19pbnQxNjsKK3R5cGVkZWYgc2lnbmVkIF9faW50MzIgb3JjX2ludDMyOwordHlwZWRlZiBzaWduZWQgX19pbnQ2NCBvcmNfaW50NjQ7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50OCBvcmNfdWludDg7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50MTYgb3JjX3VpbnQxNjsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQzMiBvcmNfdWludDMyOwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSAoeCMjVWk2NCkKKyNkZWZpbmUgaW5saW5lIF9faW5saW5lCisjZWxzZQorI2luY2x1ZGUgPGxpbWl0cy5oPgordHlwZWRlZiBzaWduZWQgY2hhciBvcmNfaW50ODsKK3R5cGVkZWYgc2hvcnQgb3JjX2ludDE2OwordHlwZWRlZiBpbnQgb3JjX2ludDMyOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIG9yY191aW50ODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgb3JjX3VpbnQxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IG9yY191aW50MzI7CisjaWYgSU5UX01BWCA9PSBMT05HX01BWAordHlwZWRlZiBsb25nIGxvbmcgb3JjX2ludDY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgb3JjX3VpbnQ2NDsKKyNkZWZpbmUgT1JDX1VJTlQ2NF9DKHgpICh4IyNVTEwpCisjZWxzZQordHlwZWRlZiBsb25nIG9yY19pbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgKHgjI1VMKQorI2VuZGlmCisjZW5kaWYKK3R5cGVkZWYgdW5pb24geyBvcmNfaW50MTYgaTsgb3JjX2ludDggeDJbMl07IH0gb3JjX3VuaW9uMTY7Cit0eXBlZGVmIHVuaW9uIHsgb3JjX2ludDMyIGk7IGZsb2F0IGY7IG9yY19pbnQxNiB4MlsyXTsgb3JjX2ludDggeDRbNF07IH0gb3JjX3VuaW9uMzI7Cit0eXBlZGVmIHVuaW9uIHsgb3JjX2ludDY0IGk7IGRvdWJsZSBmOyBvcmNfaW50MzIgeDJbMl07IGZsb2F0IHgyZlsyXTsgb3JjX2ludDE2IHg0WzRdOyB9IG9yY191bmlvbjY0OworI2VuZGlmCisjaWZuZGVmIE9SQ19SRVNUUklDVAorI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjZGVmaW5lIE9SQ19SRVNUUklDVCByZXN0cmljdAorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNAorI2RlZmluZSBPUkNfUkVTVFJJQ1QgX19yZXN0cmljdF9fCisjZWxzZQorI2RlZmluZSBPUkNfUkVTVFJJQ1QKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgT1JDX0lOVEVSTkFMCisjaWYgZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU5MCkKKyNkZWZpbmUgT1JDX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNlbGlmIGRlZmluZWQoX19TVU5QUk9fQykgJiYgKF9fU1VOUFJPX0MgPj0gMHg1NTApCisjZGVmaW5lIE9SQ19JTlRFUk5BTCBfX2hpZGRlbgorI2VsaWYgZGVmaW5lZCAoX19HTlVDX18pCisjZGVmaW5lIE9SQ19JTlRFUk5BTCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisjZWxzZQorI2RlZmluZSBPUkNfSU5URVJOQUwKKyNlbmRpZgorI2VuZGlmCisKK3ZvaWQgdmlkZW9fbWl4ZXJfb3JjX3NwbGF0X3UzMiAoZ3VpbnQzMiAqIE9SQ19SRVNUUklDVCBkMSwgaW50IHAxLCBpbnQgbik7Cit2b2lkIHZpZGVvX21peGVyX29yY19tZW1jcHlfdTMyIChndWludDMyICogT1JDX1JFU1RSSUNUIGQxLCBjb25zdCBndWludDMyICogT1JDX1JFU1RSSUNUIHMxLCBpbnQgbik7Cit2b2lkIHZpZGVvX21peGVyX29yY19ibGVuZF91OCAoZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIGQxLCBpbnQgZDFfc3RyaWRlLCBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGludCBzMV9zdHJpZGUsIGludCBwMSwgaW50IG4sIGludCBtKTsKK3ZvaWQgdmlkZW9fbWl4ZXJfb3JjX2JsZW5kX2FyZ2IgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgaW50IGQxX3N0cmlkZSwgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBpbnQgczFfc3RyaWRlLCBpbnQgcDEsIGludCBuLCBpbnQgbSk7Cit2b2lkIHZpZGVvX21peGVyX29yY19ibGVuZF9iZ3JhIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsIGludCBkMV9zdHJpZGUsIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMSwgaW50IHMxX3N0cmlkZSwgaW50IHAxLCBpbnQgbiwgaW50IG0pOwordm9pZCB2aWRlb19taXhlcl9vcmNfb3ZlcmxheV9hcmdiIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsIGludCBkMV9zdHJpZGUsIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMSwgaW50IHMxX3N0cmlkZSwgaW50IHAxLCBpbnQgbiwgaW50IG0pOwordm9pZCB2aWRlb19taXhlcl9vcmNfb3ZlcmxheV9iZ3JhIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsIGludCBkMV9zdHJpZGUsIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMSwgaW50IHMxX3N0cmlkZSwgaW50IHAxLCBpbnQgbiwgaW50IG0pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy5vcmMgYi9nc3QvdmlkZW9taXhlci92aWRlb21peGVyb3JjLm9yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmE4MjM3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy5vcmMKQEAgLTAsMCArMSwyMjEgQEAKKy5mdW5jdGlvbiB2aWRlb19taXhlcl9vcmNfc3BsYXRfdTMyCisuZGVzdCA0IGQxIGd1aW50MzIKKy5wYXJhbSA0IHAxIGd1aW50MzIKKworY29weWwgZDEsIHAxCisKKy5mdW5jdGlvbiB2aWRlb19taXhlcl9vcmNfbWVtY3B5X3UzMgorLmRlc3QgNCBkMSBndWludDMyCisuc291cmNlIDQgczEgZ3VpbnQzMgorCitjb3B5bCBkMSwgczEKKworLmZ1bmN0aW9uIHZpZGVvX21peGVyX29yY19ibGVuZF91OAorLmZsYWdzIDJkCisuZGVzdCAxIGQxIGd1aW50OAorLnNvdXJjZSAxIHMxIGd1aW50OAorLnBhcmFtIDIgcDEKKy50ZW1wIDIgdDEKKy50ZW1wIDIgdDIKKy5jb25zdCAxIGMxIDggCisKK2NvbnZ1YncgdDEsIGQxCitjb252dWJ3IHQyLCBzMQorc3VidyB0MiwgdDIsIHQxCittdWxsdyB0MiwgdDIsIHAxCitzaGx3IHQxLCB0MSwgYzEKK2FkZHcgdDIsIHQxLCB0Mgorc2hydXcgdDIsIHQyLCBjMQorY29udnN1c3diIGQxLCB0MgorCisKKy5mdW5jdGlvbiB2aWRlb19taXhlcl9vcmNfYmxlbmRfYXJnYgorLmZsYWdzIDJkCisuZGVzdCA0IGQgZ3VpbnQ4Cisuc291cmNlIDQgcyBndWludDgKKy5wYXJhbSAyIGFscGhhCisudGVtcCA0IHQKKy50ZW1wIDIgdHcKKy50ZW1wIDEgdGIKKy50ZW1wIDQgYQorLnRlbXAgOCBkX3dpZGUKKy50ZW1wIDggc193aWRlCisudGVtcCA4IGFfd2lkZQorLmNvbnN0IDQgYV9hbHBoYSAweDAwMDAwMGZmCisKK2xvYWRsIHQsIHMKK2NvbnZsdyB0dywgdAorY29udndiIHRiLCB0dworc3BsYXRibCBhLCB0YgoreDQgY29udnVidyBhX3dpZGUsIGEKK3g0IG11bGx3IGFfd2lkZSwgYV93aWRlLCBhbHBoYQoreDQgc2hydXcgYV93aWRlLCBhX3dpZGUsIDgKK3g0IGNvbnZ1Yncgc193aWRlLCB0Citsb2FkbCB0LCBkCit4NCBjb252dWJ3IGRfd2lkZSwgdAoreDQgc3VidyBzX3dpZGUsIHNfd2lkZSwgZF93aWRlCit4NCBtdWxsdyBzX3dpZGUsIHNfd2lkZSwgYV93aWRlCit4NCBkaXYyNTV3IHNfd2lkZSwgc193aWRlCit4NCBhZGR3IGRfd2lkZSwgZF93aWRlLCBzX3dpZGUKK3g0IGNvbnZ3YiB0LCBkX3dpZGUKK29ybCB0LCB0LCBhX2FscGhhCitzdG9yZWwgZCwgdAorCisuZnVuY3Rpb24gdmlkZW9fbWl4ZXJfb3JjX2JsZW5kX2JncmEKKy5mbGFncyAyZAorLmRlc3QgNCBkIGd1aW50OAorLnNvdXJjZSA0IHMgZ3VpbnQ4CisucGFyYW0gMiBhbHBoYQorLnRlbXAgNCB0CisudGVtcCA0IHQyCisudGVtcCAyIHR3CisudGVtcCAxIHRiCisudGVtcCA0IGEKKy50ZW1wIDggZF93aWRlCisudGVtcCA4IHNfd2lkZQorLnRlbXAgOCBhX3dpZGUKKy5jb25zdCA0IGFfYWxwaGEgMHhmZjAwMDAwMAorCitsb2FkbCB0LCBzCitzaHJ1bCB0MiwgdCwgMjQKK2NvbnZsdyB0dywgdDIKK2NvbnZ3YiB0YiwgdHcKK3NwbGF0YmwgYSwgdGIKK3g0IGNvbnZ1YncgYV93aWRlLCBhCit4NCBtdWxsdyBhX3dpZGUsIGFfd2lkZSwgYWxwaGEKK3g0IHNocnV3IGFfd2lkZSwgYV93aWRlLCA4Cit4NCBjb252dWJ3IHNfd2lkZSwgdAorbG9hZGwgdCwgZAoreDQgY29udnVidyBkX3dpZGUsIHQKK3g0IHN1Yncgc193aWRlLCBzX3dpZGUsIGRfd2lkZQoreDQgbXVsbHcgc193aWRlLCBzX3dpZGUsIGFfd2lkZQoreDQgZGl2MjU1dyBzX3dpZGUsIHNfd2lkZQoreDQgYWRkdyBkX3dpZGUsIGRfd2lkZSwgc193aWRlCit4NCBjb252d2IgdCwgZF93aWRlCitvcmwgdCwgdCwgYV9hbHBoYQorc3RvcmVsIGQsIHQKKworCisuZnVuY3Rpb24gdmlkZW9fbWl4ZXJfb3JjX292ZXJsYXlfYXJnYgorLmZsYWdzIDJkCisuZGVzdCA0IGQgZ3VpbnQ4Cisuc291cmNlIDQgcyBndWludDgKKy5wYXJhbSAyIGFscGhhCisudGVtcCA0IHQKKy50ZW1wIDIgdHcKKy50ZW1wIDEgdGIKKy50ZW1wIDggYWxwaGFfcworLnRlbXAgOCBhbHBoYV9zX2ludgorLnRlbXAgOCBhbHBoYV9kCisudGVtcCA0IGEKKy50ZW1wIDggZF93aWRlCisudGVtcCA4IHNfd2lkZQorLmNvbnN0IDQgeGZzIDB4ZmZmZmZmZmYKKy5jb25zdCA0IGFfYWxwaGEgMHgwMDAwMDBmZgorLmNvbnN0IDQgYV9hbHBoYV9pbnYgMHhmZmZmZmYwMAorCisjIGNhbGMgc291cmNlIGFscGhhIGFzIGFscGhhX3MgPSBhbHBoYV9zICogYWxwaGEgLyAyNTYKK2xvYWRsIHQsIHMKK2NvbnZsdyB0dywgdAorY29udndiIHRiLCB0dworc3BsYXRibCBhLCB0YgoreDQgY29udnVidyBhbHBoYV9zLCBhCit4NCBtdWxsdyBhbHBoYV9zLCBhbHBoYV9zLCBhbHBoYQoreDQgc2hydXcgYWxwaGFfcywgYWxwaGFfcywgOAoreDQgY29udnVidyBzX3dpZGUsIHQKK3g0IG11bGx3IHNfd2lkZSwgc193aWRlLCBhbHBoYV9zCisKKyMgY2FsYyBkZXN0aW5hdGlvbiBhbHBoYSBhcyBhbHBoYV9kID0gKDI1NS1hbHBoYV9zKSAqIGFscGhhX2QgLyAyNTUKK2xvYWRwbCBhLCB4ZnMKK3g0IGNvbnZ1YncgYWxwaGFfc19pbnYsIGEKK3g0IHN1YncgYWxwaGFfc19pbnYsIGFscGhhX3NfaW52LCBhbHBoYV9zCitsb2FkbCB0LCBkCitjb252bHcgdHcsIHQKK2NvbnZ3YiB0YiwgdHcKK3NwbGF0YmwgYSwgdGIKK3g0IGNvbnZ1YncgYWxwaGFfZCwgYQoreDQgbXVsbHcgYWxwaGFfZCwgYWxwaGFfZCwgYWxwaGFfc19pbnYKK3g0IGRpdjI1NXcgYWxwaGFfZCwgYWxwaGFfZAoreDQgY29udnVidyBkX3dpZGUsIHQKK3g0IG11bGx3IGRfd2lkZSwgZF93aWRlLCBhbHBoYV9kCisKKyMgY2FsYyBmaW5hbCBwaXhlbCBhcyBwaXhfZCA9IHBpeF9zKmFscGhhX3MgKyBwaXhfZCphbHBoYV9kKigyNTUtYWxwaGFfcykvMjU1Cit4NCBhZGR3IGRfd2lkZSwgZF93aWRlLCBzX3dpZGUKKworIyBjYWxjIHRoZSBmaW5hbCBkZXN0aW5hdGlvbiBhbHBoYV9kID0gYWxwaGFfcyArIGFscGhhX2QgKiAoMjU1LWFscGhhX3MpLzI1NQoreDQgYWRkdyBhbHBoYV9kLCBhbHBoYV9kLCBhbHBoYV9zCisKKyMgbm93IG5vcm1hbGl6ZSB0aGUgcGl4X2QgYnkgdGhlIGZpbmFsIGFscGhhIHRvIG1ha2UgaXQgYXNzb2NpYXRpdmUKK3g0IGRpdmx1dywgZF93aWRlLCBkX3dpZGUsIGFscGhhX2QKKworIyBwYWNrIHRoZSBuZXcgYWxwaGEgaW50byB0aGUgY29ycmVjdCBzcG90Cit4NCBjb252d2IgdCwgZF93aWRlCithbmRsIHQsIHQsIGFfYWxwaGFfaW52Cit4NCBjb252d2IgYSwgYWxwaGFfZAorYW5kbCBhLCBhLCBhX2FscGhhCitvcmwgIHQsIHQsIGEKK3N0b3JlbCBkLCB0CisKKy5mdW5jdGlvbiB2aWRlb19taXhlcl9vcmNfb3ZlcmxheV9iZ3JhCisuZmxhZ3MgMmQKKy5kZXN0IDQgZCBndWludDgKKy5zb3VyY2UgNCBzIGd1aW50OAorLnBhcmFtIDIgYWxwaGEKKy50ZW1wIDQgdAorLnRlbXAgNCB0MgorLnRlbXAgMiB0dworLnRlbXAgMSB0YgorLnRlbXAgOCBhbHBoYV9zCisudGVtcCA4IGFscGhhX3NfaW52CisudGVtcCA4IGFscGhhX2QKKy50ZW1wIDQgYQorLnRlbXAgOCBkX3dpZGUKKy50ZW1wIDggc193aWRlCisuY29uc3QgNCB4ZnMgMHhmZmZmZmZmZgorLmNvbnN0IDQgYV9hbHBoYSAweGZmMDAwMDAwCisuY29uc3QgNCBhX2FscGhhX2ludiAweDAwZmZmZmZmCisKKyMgY2FsYyBzb3VyY2UgYWxwaGEgYXMgYWxwaGFfcyA9IGFscGhhX3MgKiBhbHBoYSAvIDI1NgorbG9hZGwgdCwgcworc2hydWwgdDIsIHQsIDI0Citjb252bHcgdHcsIHQyCitjb252d2IgdGIsIHR3CitzcGxhdGJsIGEsIHRiCit4NCBjb252dWJ3IGFscGhhX3MsIGEKK3g0IG11bGx3IGFscGhhX3MsIGFscGhhX3MsIGFscGhhCit4NCBzaHJ1dyBhbHBoYV9zLCBhbHBoYV9zLCA4Cit4NCBjb252dWJ3IHNfd2lkZSwgdAoreDQgbXVsbHcgc193aWRlLCBzX3dpZGUsIGFscGhhX3MKKworIyBjYWxjIGRlc3RpbmF0aW9uIGFscGhhIGFzIGFscGhhX2QgPSAoMjU1LWFscGhhX3MpICogYWxwaGFfZCAvIDI1NQorbG9hZHBsIGEsIHhmcworeDQgY29udnVidyBhbHBoYV9zX2ludiwgYQoreDQgc3VidyBhbHBoYV9zX2ludiwgYWxwaGFfc19pbnYsIGFscGhhX3MKK2xvYWRsIHQsIGQKK3NocnVsIHQyLCB0LCAyNAorY29udmx3IHR3LCB0MgorY29udndiIHRiLCB0dworc3BsYXRibCBhLCB0YgoreDQgY29udnVidyBhbHBoYV9kLCBhCit4NCBtdWxsdyBhbHBoYV9kLCBhbHBoYV9kLCBhbHBoYV9zX2ludgoreDQgZGl2MjU1dyBhbHBoYV9kLCBhbHBoYV9kCit4NCBjb252dWJ3IGRfd2lkZSwgdAoreDQgbXVsbHcgZF93aWRlLCBkX3dpZGUsIGFscGhhX2QKKworIyBjYWxjIGZpbmFsIHBpeGVsIGFzIHBpeF9kID0gcGl4X3MqYWxwaGFfcyArIHBpeF9kKmFscGhhX2QqKDI1NS1hbHBoYV9zKS8yNTUKK3g0IGFkZHcgZF93aWRlLCBkX3dpZGUsIHNfd2lkZQorCisjIGNhbGMgdGhlIGZpbmFsIGRlc3RpbmF0aW9uIGFscGhhX2QgPSBhbHBoYV9zICsgYWxwaGFfZCAqICgyNTUtYWxwaGFfcykvMjU1Cit4NCBhZGR3IGFscGhhX2QsIGFscGhhX2QsIGFscGhhX3MKKworIyBub3cgbm9ybWFsaXplIHRoZSBwaXhfZCBieSB0aGUgZmluYWwgYWxwaGEgdG8gbWFrZSBpdCBhc3NvY2lhdGl2ZQoreDQgZGl2bHV3LCBkX3dpZGUsIGRfd2lkZSwgYWxwaGFfZAorCisjIHBhY2sgdGhlIG5ldyBhbHBoYSBpbnRvIHRoZSBjb3JyZWN0IHNwb3QKK3g0IGNvbnZ3YiB0LCBkX3dpZGUKK2FuZGwgdCwgdCwgYV9hbHBoYV9pbnYKK3g0IGNvbnZ3YiBhLCBhbHBoYV9kCithbmRsIGEsIGEsIGFfYWxwaGEKK29ybCAgdCwgdCwgYQorc3RvcmVsIGQsIHQKKwpkaWZmIC0tZ2l0IGEvZ3N0L3dhdmVuYy9NYWtlZmlsZS5hbSBiL2dzdC93YXZlbmMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVlNjYxZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC93YXZlbmMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxNiBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0d2F2ZW5jLmxhCisKK2xpYmdzdHdhdmVuY19sYV9TT1VSQ0VTID0gZ3N0d2F2ZW5jLmMKK2xpYmdzdHdhdmVuY19sYV9DRkxBR1MgPSAgXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9CQVNFX0NGTEFHUykgXAorCSQoR1NUX0NGTEFHUykKK2xpYmdzdHdhdmVuY19sYV9MSUJBREQgPSAJXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSBcCisJLWxnc3RhdWRpby1AR1NUX0FQSV9WRVJTSU9OQCBcCisJLWxnc3RyaWZmLUBHU1RfQVBJX1ZFUlNJT05AIFwKKwkkKEdTVF9CQVNFX0xJQlMpIFwKKwkkKEdTVF9MSUJTKQorbGliZ3N0d2F2ZW5jX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3R3YXZlbmMuaApkaWZmIC0tZ2l0IGEvZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYyBiL2dzdC93YXZlbmMvZ3N0d2F2ZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhOGJkMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC93YXZlbmMvZ3N0d2F2ZW5jLmMKQEAgLTAsMCArMSwxMTQ1IEBACisvKiAtKi0gbU9kZTogQzsgdGFiLXdpZHRoOiAyOyBpbmRlbnQtdGFicy1tb2RlOiB0OyBjLWJhc2ljLW9mZnNldDogMiAtKi0gKi8KKy8qIEdTdHJlYW1lciAud2F2IGVuY29kZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDI+IElhaW4gSG9sbWVzIDxpYWluQHByZXR0eXBlb3BsZS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICogCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LXdhdmVuYworICoKKyAqIEZvcm1hdCBhbiBhdWRpbyBzdHJlYW0gaW50byB0aGUgd2F2IGZvcm1hdC4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgY2RwYXJhbm9pYXNyYyBtb2RlPWNvbnRpbnVvdXMgISBxdWV1ZSAhIGF1ZGlvY29udmVydCAhIHdhdmVuYyAhIGZpbGVzaW5rIGxvY2F0aW9uPWNkLndhdgorICogXXwgUmlwIGEgd2hvbGUgYXVkaW8gQ0QgaW50byBhIHNpbmdsZSB3YXYgZmlsZSwgd2l0aCB0aGUgdHJhY2sgdGFibGUgd3JpdHRlbiBpbnRvIGEgQ1VFIHNoZWV0IGluc2lkZSB0aGUgZmlsZQorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGNkcGFyYW5vaWFzcmMgdHJhY2s9NSAhIHF1ZXVlICEgYXVkaW9jb252ZXJ0ICEgd2F2ZW5jICEgZmlsZXNpbmsgbG9jYXRpb249dHJhY2s1LndhdgorICogXXwgUmlwIHRyYWNrIDUgb2YgYW4gYXVkaW8gQ0QgaW50byBhIHNpbmdsZSB3YXYgZmlsZSBjb250YWluaW5nIHVuZW5jb2RlZCByYXcgYXVkaW8gc2FtcGxlcy4KKyAqIDwvcmVmc2VjdDI+CisgKgorICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnc3R3YXZlbmMuaCIKKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9yaWZmL3JpZmYtbWVkaWEuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RieXRld3JpdGVyLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHdhdmVuY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCB3YXZlbmNfZGVidWcKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogT2Zmc2V0IFNpemUgICAgRGVzY3JpcHRpb24gICBWYWx1ZQorICAgKiAweDAwICAgNCAgICAgICBJRCAgICAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWNhdGlvbiB2YWx1ZQorICAgKiAweDA0ICAgNCAgICAgICBQb3NpdGlvbiAgICAgIHBsYXkgb3JkZXIgcG9zaXRpb24KKyAgICogMHgwOCAgIDQgICAgICAgRGF0YSBDaHVuayBJRCBSSUZGIElEIG9mIGNvcnJlc3BvbmRpbmcgZGF0YSBjaHVuaworICAgKiAweDBjICAgNCAgICAgICBDaHVuayBTdGFydCAgIEJ5dGUgT2Zmc2V0IG9mIERhdGEgQ2h1bmsgKgorICAgKiAweDEwICAgNCAgICAgICBCbG9jayBTdGFydCAgIEJ5dGUgT2Zmc2V0IHRvIHNhbXBsZSBvZiBGaXJzdCBDaGFubmVsCisgICAqIDB4MTQgICA0ICAgICAgIFNhbXBsZSBPZmZzZXQgQnl0ZSBPZmZzZXQgdG8gc2FtcGxlIGJ5dGUgb2YgRmlyc3QgQ2hhbm5lbAorICAgKi8KKyAgZ3VpbnQzMiBpZDsKKyAgZ3VpbnQzMiBwb3NpdGlvbjsKKyAgZ3VpbnQ4IGRhdGFfY2h1bmtfaWRbNF07CisgIGd1aW50MzIgY2h1bmtfc3RhcnQ7CisgIGd1aW50MzIgYmxvY2tfc3RhcnQ7CisgIGd1aW50MzIgc2FtcGxlX29mZnNldDsKK30gR3N0V2F2RW5jQ3VlOworCit0eXBlZGVmIHN0cnVjdAoreworICAvKiBPZmZzZXQgU2l6ZSAgICBEZXNjcmlwdGlvbiAgICAgVmFsdWUKKyAgICogMHgwMCAgIDQgICAgICAgQ2h1bmsgSUQgICAgICAgICJsYWJsIiAoMHg2QzYxNjI2Qykgb3IgIm5vdGUiICgweDZFNkY3NDY1KQorICAgKiAweDA0ICAgNCAgICAgICBDaHVuayBEYXRhIFNpemUgZGVwZW5kcyBvbiBjb250YWluZWQgdGV4dAorICAgKiAweDA4ICAgNCAgICAgICBDdWUgUG9pbnQgSUQgICAgMCAtIDB4RkZGRkZGRkYKKyAgICogMHgwYyAgICAgICAgICAgVGV4dAorICAgKi8KKyAgZ3VpbnQ4IGNodW5rX2lkWzRdOworICBndWludDMyIGNodW5rX2RhdGFfc2l6ZTsKKyAgZ3VpbnQzMiBjdWVfcG9pbnRfaWQ7CisgIGdjaGFyICp0ZXh0OworfSBHc3RXYXZFbmNMYWJsLCBHc3RXYXZFbmNOb3RlOworCisvKiBGSVhNRTogbW9ubyBkb2Vzbid0IHByb2R1Y2UgY29ycmVjdCBmaWxlcyBpdCBzZWVtcywgYXQgbGVhc3QgbXBsYXllciB4cnVucyAqLworI2RlZmluZSBTSU5LX0NBUFMgXAorICAgICJhdWRpby94LXJhdywgIiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiICAgICAgICAgIFwKKyAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDY1NTM1IF0sICIgICAgICBcCisgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgUzMyTEUsIFMyNExFLCBTMTZMRSwgVTgsIEYzMkxFLCBGNjRMRSB9LCAiIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQiICAgICAgXAorICAgICI7ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImF1ZGlvL3gtYWxhdywgIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicmF0ZSA9IChpbnQpIFsgODAwMCwgMTkyMDAwIF0sICIgICAgXAorICAgICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdOyAiICAgICAgICBcCisgICAgImF1ZGlvL3gtbXVsYXcsICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicmF0ZSA9IChpbnQpIFsgODAwMCwgMTkyMDAwIF0sICIgICAgXAorICAgICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdIgorCisjZGVmaW5lIFNSQ19DQVBTIFwKKyAgICAiYXVkaW8veC13YXY7ICIgXAorICAgICJhdWRpby94LXJmNjQiCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFNJTktfQ0FQUykKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChTUkNfQ0FQUykKKyAgICApOworCisjZGVmaW5lIGdzdF93YXZlbmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdFdhdkVuYywgZ3N0X3dhdmVuYywgR1NUX1RZUEVfRUxFTUVOVCwKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1RBR19TRVRURVIsIE5VTEwpCisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9UT0NfU0VUVEVSLCBOVUxMKQorICAgICk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF93YXZlbmNfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3dhdmVuY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3dhdmVuY19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworc3RhdGljIGdib29sZWFuIGdzdF93YXZlbmNfc2lua19zZXRjYXBzIChHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBjYXBzKTsKKworc3RhdGljIHZvaWQKK2dzdF93YXZlbmNfY2xhc3NfaW5pdCAoR3N0V2F2RW5jQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworCisgIGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2ZW5jX2NoYW5nZV9zdGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgIldBViBhdWRpbyBtdXhlciIsCisgICAgICAiQ29kZWMvTXV4ZXIvQXVkaW8iLAorICAgICAgIkVuY29kZSByYXcgYXVkaW8gaW50byBXQVYiLCAiSWFpbiBIb2xtZXMgPGlhaW5AcHJldHR5cGVvcGxlLm9yZz4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNyY19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzaW5rX2ZhY3RvcnkpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUICh3YXZlbmNfZGVidWcsICJ3YXZlbmMiLCAwLCAiV0FWIGVuY29kZXIgZWxlbWVudCIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3dhdmVuY19pbml0IChHc3RXYXZFbmMgKiB3YXZlbmMpCit7CisgIHdhdmVuYy0+c2lua3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc2lua19mYWN0b3J5LCAic2luayIpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAod2F2ZW5jLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXZlbmNfY2hhaW4pKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHdhdmVuYy0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2ZW5jX2V2ZW50KSk7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKHdhdmVuYy0+c2lua3BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UICh3YXZlbmMpLCB3YXZlbmMtPnNpbmtwYWQpOworCisgIHdhdmVuYy0+c3JjcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzcmNfZmFjdG9yeSwgInNyYyIpOworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzICh3YXZlbmMtPnNyY3BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UICh3YXZlbmMpLCB3YXZlbmMtPnNyY3BhZCk7Cit9CisKKyNkZWZpbmUgUklGRl9DSFVOS19MRU4gICAgMTIKKyNkZWZpbmUgRk1UX1dBVl9DSFVOS19MRU4gMjQKKyNkZWZpbmUgRk1UX0VYVF9DSFVOS19MRU4gNDgKKyNkZWZpbmUgRkFDVF9DSFVOS19MRU4gICAgMTIKKyNkZWZpbmUgREFUQV9IRUFERVJfTEVOICAgOAorI2RlZmluZSBEUzY0X0NIVU5LX0xFTiAgICAzNgorCitzdGF0aWMgZ2Jvb2xlYW4KK3VzZV9mb3JtYXRfZXh0IChHc3RXYXZFbmMgKiB3YXZlbmMpCit7CisgIHJldHVybiB3YXZlbmMtPmNoYW5uZWxzID4gMjsKK30KKworc3RhdGljIGdib29sZWFuCit1c2VfZmFjdF9jaHVuayAoR3N0V2F2RW5jICogd2F2ZW5jKQoreworICByZXR1cm4gdXNlX2Zvcm1hdF9leHQgKHdhdmVuYykgJiYgIXdhdmVuYy0+dXNlX3JmNjQ7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9oZWFkZXJfbGVuIChHc3RXYXZFbmMgKiB3YXZlbmMpCit7CisgIGludCBsZW4gPSBSSUZGX0NIVU5LX0xFTjsKKworICBpZiAodXNlX2Zvcm1hdF9leHQgKHdhdmVuYykpCisgICAgbGVuICs9IEZNVF9FWFRfQ0hVTktfTEVOOworICBlbHNlCisgICAgbGVuICs9IEZNVF9XQVZfQ0hVTktfTEVOOworCisgIGlmICh1c2VfZmFjdF9jaHVuayAod2F2ZW5jKSkKKyAgICBsZW4gKz0gRkFDVF9DSFVOS19MRU47CisKKyAgaWYgKHdhdmVuYy0+dXNlX3JmNjQpCisgICAgbGVuICs9IERTNjRfQ0hVTktfTEVOOworCisgIHJldHVybiBsZW4gKyBEQVRBX0hFQURFUl9MRU47Cit9CisKK3N0YXRpYyBndWludDY0Citnc3RtYXNrX3RvX3dhdm1hc2sgKGd1aW50NjQgZ3N0bWFzaywgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gKiBwb3MpCit7CisgIGNvbnN0IEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHZhbGlkX3BvcyA9CisgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUIHwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUIHwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiB8CisgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxIHwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCB8CisgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX1JJR0hUIHwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlRfT0ZfQ0VOVEVSIHwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUX09GX0NFTlRFUiB8CisgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0NFTlRFUiB8CisgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQgfAorICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9SSUdIVCB8CisgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfQ0VOVEVSIHwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9MRUZUIHwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9DRU5URVIgfAorICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX1JJR0hUIHwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX0xFRlQgfAorICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX1JFQVJfQ0VOVEVSIHwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX1JJR0hUOworCisgIGNvbnN0IEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHdhdl9wb3NbXSA9IHsKKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwKKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxLAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCwKKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX1JJR0hULAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlRfT0ZfQ0VOVEVSLAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUX09GX0NFTlRFUiwKKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0NFTlRFUiwKKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQsCisgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9SSUdIVCwKKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfQ0VOVEVSLAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9MRUZULAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9DRU5URVIsCisgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX1JJR0hULAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX0xFRlQsCisgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX1JFQVJfQ0VOVEVSLAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX1JJR0hULAorICB9OworICBpbnQgazsKKyAgaW50IGNoYW4gPSAwOworICBndWludDY0IHJldCA9IDA7CisgIGd1aW50NjQgbWFzayA9IDE7CisKKyAgaWYgKGdzdG1hc2sgPT0gMCB8fCAoKGdzdG1hc2sgJiB+dmFsaWRfcG9zKSAhPSAwKSkKKyAgICByZXR1cm4gMDsKKworICBmb3IgKGsgPSAwOyBrIDwgR19OX0VMRU1FTlRTICh3YXZfcG9zKTsgKytrKSB7CisgICAgaWYgKGdzdG1hc2sgJiB3YXZfcG9zW2tdKSB7CisgICAgICByZXQgfD0gbWFzazsKKyAgICAgIHBvc1tjaGFuKytdID0gd2F2X3Bvc1trXTsKKyAgICB9CisgICAgbWFzayA8PD0gMTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBndWludDggKgord3JpdGVfZm10X2NodW5rIChHc3RXYXZFbmMgKiB3YXZlbmMsIGd1aW50OCAqIGhlYWRlcikKK3sKKyAgZ3VpbnQxNiB3QmxvY2tBbGlnbjsKKworICB3QmxvY2tBbGlnbiA9ICh3YXZlbmMtPndpZHRoIC8gOCkgKiB3YXZlbmMtPmNoYW5uZWxzOworCisgIG1lbWNweSAoaGVhZGVyLCAiZm10ICIsIDQpOworICAvKiB3Q2hhbm5lbHMgKi8KKyAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoaGVhZGVyICsgMTAsIHdhdmVuYy0+Y2hhbm5lbHMpOworICAvKiBkd1NhbXBsZXNQZXJTZWMgKi8KKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoaGVhZGVyICsgMTIsIHdhdmVuYy0+cmF0ZSk7CisgIC8qIGR3QXZnQnl0ZXNQZXJTZWMgKi8KKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoaGVhZGVyICsgMTYsIHdCbG9ja0FsaWduICogd2F2ZW5jLT5yYXRlKTsKKyAgLyogd0Jsb2NrQWxpZ24gKi8KKyAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoaGVhZGVyICsgMjAsIHdCbG9ja0FsaWduKTsKKyAgLyogd0JpdHNQZXJTYW1wbGUgKi8KKyAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoaGVhZGVyICsgMjIsIHdhdmVuYy0+d2lkdGgpOworCisgIGlmICh1c2VfZm9ybWF0X2V4dCAod2F2ZW5jKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdmVuYywgIlVzaW5nIFdBVkVfRk9STUFUX0VYVEVOU0lCTEUiKTsKKworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGhlYWRlciArIDQsIEZNVF9FWFRfQ0hVTktfTEVOIC0gOCk7CisKKyAgICAvKiB3Rm9ybWF0VGFnICovCisgICAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoaGVhZGVyICsgOCwgMHhGRkZFKTsKKyAgICAvKiBjYlNpemUgKi8KKyAgICBHU1RfV1JJVEVfVUlOVDE2X0xFIChoZWFkZXIgKyAyNCwgMjIpOworICAgIC8qIHdWYWxpZEJpdHNQZXJTYW1wbGUgKi8KKyAgICBHU1RfV1JJVEVfVUlOVDE2X0xFIChoZWFkZXIgKyAyNiwgd2F2ZW5jLT53aWR0aCk7CisgICAgLyogZHdDaGFubmVsTWFzayAqLworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGhlYWRlciArIDI4LCAoZ3VpbnQzMikgd2F2ZW5jLT5jaGFubmVsX21hc2spOworCisgICAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoaGVhZGVyICsgMzIsIHdhdmVuYy0+Zm9ybWF0KTsKKworICAgIG1lbWNweSAoaGVhZGVyICsgMzQsCisgICAgICAgICJceDAwXHgwMFx4MDBceDAwXHgxMFx4MDBceDgwXHgwMFx4MDBceEFBXHgwMFx4MzhceDlCXHg3MSIsIDE0KTsKKworICAgIGhlYWRlciArPSBGTVRfRVhUX0NIVU5LX0xFTjsKKworICB9IGVsc2UgeworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGhlYWRlciArIDQsIEZNVF9XQVZfQ0hVTktfTEVOIC0gOCk7CisKKyAgICAvKiB3Rm9ybWF0VGFnICovCisgICAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoaGVhZGVyICsgOCwgd2F2ZW5jLT5mb3JtYXQpOworICAgIGhlYWRlciArPSBGTVRfV0FWX0NIVU5LX0xFTjsKKyAgfQorCisgIHJldHVybiBoZWFkZXI7Cit9CisKK3N0YXRpYyBndWludDY0CitnZXRfbnVtX2ZyYW1lcyAoR3N0V2F2RW5jICogd2F2ZW5jKQoreworICBpZiAod2F2ZW5jLT5jaGFubmVscyA9PSAwIHx8IHdhdmVuYy0+d2lkdGggPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIHdhdmVuYy0+YXVkaW9fbGVuZ3RoIC8gKHdhdmVuYy0+d2lkdGggLyA4KSAvIHdhdmVuYy0+Y2hhbm5lbHM7Cit9CisKK3N0YXRpYyBndWludDggKgord3JpdGVfZmFjdF9jaHVuayAoR3N0V2F2RW5jICogd2F2ZW5jLCBndWludDggKiBoZWFkZXIpCit7CisgIG1lbWNweSAoaGVhZGVyLCAiZmFjdCIsIDQpOworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChoZWFkZXIgKyA0LCBGQUNUX0NIVU5LX0xFTiAtIDgpOworICAvKiBjb21wcmVzc2VkIGZpbGVzIGFyZSBvbmx5IHN1cHBvcnRlZCB1cCB0byAyIGNoYW5uZWxzLAorICAgKiB0aGF0IG1lYW5zIHdlIG5ldmVyIHdyaXRlIGEgZmFjdCBjaHVuayBmb3IgdGhlbSAqLworICBpZiAod2F2ZW5jLT51c2VfcmY2NCkKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0xFIChoZWFkZXIgKyA4LCAweEZGRkZGRkZGKTsKKyAgZWxzZQorICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGhlYWRlciArIDgsIChndWludDMyKSBnZXRfbnVtX2ZyYW1lcyAod2F2ZW5jKSk7CisgIHJldHVybiBoZWFkZXIgKyBGQUNUX0NIVU5LX0xFTjsKK30KKworc3RhdGljIGd1aW50OCAqCit3cml0ZV9kczY0X2NodW5rIChHc3RXYXZFbmMgKiB3YXZlbmMsIGd1aW50NjQgcmlmZkxlbiwgZ3VpbnQ4ICogaGVhZGVyKQoreworICBndWludDY0IG51bUZyYW1lcyA9IGdldF9udW1fZnJhbWVzICh3YXZlbmMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdmVuYywgInJpZmZMZW49JSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgIiwgYXVkaW8gbGVuZ3RoPSUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgbnVtRnJhbWVzPSUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICByaWZmTGVuLCB3YXZlbmMtPmF1ZGlvX2xlbmd0aCwgbnVtRnJhbWVzKTsKKworICBtZW1jcHkgKGhlYWRlciwgImRzNjQiLCA0KTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoaGVhZGVyICsgNCwgRFM2NF9DSFVOS19MRU4gLSA4KTsKKyAgLyogcmlmZlNpemUgKi8KKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoaGVhZGVyICsgOCwgKGd1aW50MzIpIChyaWZmTGVuICYgMHhGRkZGRkZGRikpOworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChoZWFkZXIgKyAxMiwgKGd1aW50MzIpIChyaWZmTGVuID4+IDMyKSk7CisgIC8qIGRhdGFTaXplICovCisgIEdTVF9XUklURV9VSU5UMzJfTEUgKGhlYWRlciArIDE2LAorICAgICAgKGd1aW50MzIpICh3YXZlbmMtPmF1ZGlvX2xlbmd0aCAmIDB4RkZGRkZGRkYpKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoaGVhZGVyICsgMjAsIChndWludDMyKSAod2F2ZW5jLT5hdWRpb19sZW5ndGggPj4gMzIpKTsKKyAgLyogc2FtcGxlQ291bnQgKi8KKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoaGVhZGVyICsgMjQsIChndWludDMyKSAobnVtRnJhbWVzICYgMHhGRkZGRkZGRikpOworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChoZWFkZXIgKyAyOCwgKGd1aW50MzIpIChudW1GcmFtZXMgPj4gMzIpKTsKKyAgLyogdGFibGVMZW5ndGggYWx3YXlzIHplcm8gZm9yIG5vdyAqLworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChoZWFkZXIgKyAzMiwgMCk7CisKKyAgcmV0dXJuIGhlYWRlciArIERTNjRfQ0hVTktfTEVOOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF93YXZlbmNfY3JlYXRlX2hlYWRlcl9idWYgKEdzdFdhdkVuYyAqIHdhdmVuYykKK3sKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKmhlYWRlcjsKKyAgZ3VpbnQ2NCByaWZmTGVuOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdmVuYywgIkhlYWRlciBzaXplOiAlZCIsIGdldF9oZWFkZXJfbGVuICh3YXZlbmMpKTsKKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChnZXRfaGVhZGVyX2xlbiAod2F2ZW5jKSk7CisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBoZWFkZXIgPSBtYXAuZGF0YTsKKyAgbWVtc2V0IChoZWFkZXIsIDAsIGdldF9oZWFkZXJfbGVuICh3YXZlbmMpKTsKKworICByaWZmTGVuID0gd2F2ZW5jLT5tZXRhX2xlbmd0aCArIHdhdmVuYy0+YXVkaW9fbGVuZ3RoCisgICAgICArIGdldF9oZWFkZXJfbGVuICh3YXZlbmMpIC0gODsKKworICAvKiBSSUZGIGNodW5rICovCisgIGlmICh3YXZlbmMtPnVzZV9yZjY0KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2ZW5jLCAiVXNpbmcgUkY2NCIpOworICAgIG1lbWNweSAoaGVhZGVyLCAiUkY2NCIsIDQpOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGhlYWRlciArIDQsIDB4RkZGRkZGRkYpOworICB9IGVsc2UgeworICAgIG1lbWNweSAoaGVhZGVyLCAiUklGRiIsIDQpOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGhlYWRlciArIDQsIChndWludDMyKSByaWZmTGVuKTsKKyAgfQorICBtZW1jcHkgKGhlYWRlciArIDgsICJXQVZFIiwgNCk7CisgIGhlYWRlciArPSBSSUZGX0NIVU5LX0xFTjsKKworICBpZiAod2F2ZW5jLT51c2VfcmY2NCkKKyAgICBoZWFkZXIgPSB3cml0ZV9kczY0X2NodW5rICh3YXZlbmMsIHJpZmZMZW4sIGhlYWRlcik7CisKKyAgaGVhZGVyID0gd3JpdGVfZm10X2NodW5rICh3YXZlbmMsIGhlYWRlcik7CisgIGlmICh1c2VfZmFjdF9jaHVuayAod2F2ZW5jKSkKKyAgICBoZWFkZXIgPSB3cml0ZV9mYWN0X2NodW5rICh3YXZlbmMsIGhlYWRlcik7CisKKyAgLyogZGF0YSBjaHVuayAqLworICBtZW1jcHkgKGhlYWRlciwgImRhdGEgIiwgNCk7CisgIGlmICh3YXZlbmMtPnVzZV9yZjY0KQorICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGhlYWRlciArIDQsIDB4RkZGRkZGRkYpOworICBlbHNlCisgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoaGVhZGVyICsgNCwgKGd1aW50MzIpIHdhdmVuYy0+YXVkaW9fbGVuZ3RoKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfd2F2ZW5jX3B1c2hfaGVhZGVyIChHc3RXYXZFbmMgKiB3YXZlbmMpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIC8qIHNlZWsgdG8gYmVnaW5uaW5nIG9mIGZpbGUgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfQllURVMpOworICBpZiAoIWdzdF9wYWRfcHVzaF9ldmVudCAod2F2ZW5jLT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2ZW5jLCAiU2VlayB0byB0aGUgYmVnaW5uaW5nIGZhaWxlZCIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdmVuYywgIndyaXRpbmcgaGVhZGVyLCBtZXRhX3NpemU9JXUsIGF1ZGlvX3NpemU9JSIKKyAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIHdhdmVuYy0+bWV0YV9sZW5ndGgsIHdhdmVuYy0+YXVkaW9fbGVuZ3RoKTsKKworICBvdXRidWYgPSBnc3Rfd2F2ZW5jX2NyZWF0ZV9oZWFkZXJfYnVmICh3YXZlbmMpOworICBHU1RfQlVGRkVSX09GRlNFVCAob3V0YnVmKSA9IDA7CisKKyAgcmV0ID0gZ3N0X3BhZF9wdXNoICh3YXZlbmMtPnNyY3BhZCwgb3V0YnVmKTsKKworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh3YXZlbmMsICJwdXNoIGhlYWRlciBmYWlsZWQ6IGZsb3cgPSAlcyIsCisgICAgICAgIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdmVuY19zaW5rX3NldGNhcHMgKEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFdhdkVuYyAqd2F2ZW5jOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgY29uc3QgZ2NoYXIgKm5hbWU7CisgIGdpbnQgY2hhbnMsIHJhdGU7CisgIEdzdENhcHMgKmNjYXBzOworCisgIHdhdmVuYyA9IEdTVF9XQVZFTkMgKGdzdF9wYWRfZ2V0X3BhcmVudCAocGFkKSk7CisKKyAgY2NhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHBhZCk7CisgIGlmICh3YXZlbmMtPnNlbnRfaGVhZGVyICYmIGNjYXBzICYmICFnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChjYXBzLCBjY2FwcykpIHsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2NhcHMpOworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2ZW5jLCAiY2Fubm90IGNoYW5nZSBmb3JtYXQgaW4gbWlkZGxlIG9mIHN0cmVhbSIpOworICAgIGdvdG8gZmFpbDsKKyAgfQorICBpZiAoY2NhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKGNjYXBzKTsKKworICBHU1RfREVCVUdfT0JKRUNUICh3YXZlbmMsICJnb3QgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBuYW1lID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAoc3RydWN0dXJlKTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2hhbm5lbHMiLCAmY2hhbnMpIHx8CisgICAgICAhZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJyYXRlIiwgJnJhdGUpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh3YXZlbmMsICJjYXBzIGluY29tcGxldGUiKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KKworICB3YXZlbmMtPmNoYW5uZWxzID0gY2hhbnM7CisgIHdhdmVuYy0+cmF0ZSA9IHJhdGU7CisgIHdhdmVuYy0+Y2hhbm5lbF9tYXNrID0gMDsKKworICBpZiAoc3RyY21wIChuYW1lLCAiYXVkaW8veC1yYXciKSA9PSAwKSB7CisgICAgR3N0QXVkaW9JbmZvIGluZm87CisgICAgZ3VpbnQ2NCBnc3RtYXNrOworCisgICAgaWYgKCFnc3RfYXVkaW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBjYXBzKSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh3YXZlbmMsICJDb3VsZCBub3QgcmV0cmlldmUgYXVkaW8gaW5mbyBmcm9tIGNhcHMiKTsKKyAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uc190b19tYXNrIChpbmZvLnBvc2l0aW9uLCB3YXZlbmMtPmNoYW5uZWxzLAorICAgICAgICAgICAgRkFMU0UsICZnc3RtYXNrKSkgeworICAgICAgd2F2ZW5jLT5jaGFubmVsX21hc2sgPSBnc3RtYXNrX3RvX3dhdm1hc2sgKGdzdG1hc2ssIHdhdmVuYy0+ZGVzdFBvcyk7CisgICAgICBtZW1jcHkgKHdhdmVuYy0+c3JjUG9zLCBpbmZvLnBvc2l0aW9uLCBzaXplb2YgKGluZm8ucG9zaXRpb24pKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdmVuYywgIkNoYW5uZWwgbWFzayBpbnB1dDogMHglIiBHX0dJTlQ2NF9NT0RJRklFUiAieCIKKyAgICAgICAgICAiIG91dHB1dDogMHglIiBHX0dJTlQ2NF9NT0RJRklFUiAieCIsIGdzdG1hc2ssIHdhdmVuYy0+Y2hhbm5lbF9tYXNrKTsKKyAgICB9CisgICAgd2F2ZW5jLT5hdWRpb19mb3JtYXQgPSBHU1RfQVVESU9fSU5GT19GT1JNQVQgKCZpbmZvKTsKKworICAgIGlmIChHU1RfQVVESU9fSU5GT19JU19JTlRFR0VSICgmaW5mbykpCisgICAgICB3YXZlbmMtPmZvcm1hdCA9IEdTVF9SSUZGX1dBVkVfRk9STUFUX1BDTTsKKyAgICBlbHNlIGlmIChHU1RfQVVESU9fSU5GT19JU19GTE9BVCAoJmluZm8pKQorICAgICAgd2F2ZW5jLT5mb3JtYXQgPSBHU1RfUklGRl9XQVZFX0ZPUk1BVF9JRUVFX0ZMT0FUOworICAgIGVsc2UKKyAgICAgIGdvdG8gZmFpbDsKKworICAgIHdhdmVuYy0+d2lkdGggPSBHU1RfQVVESU9fSU5GT19XSURUSCAoJmluZm8pOworICB9IGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImF1ZGlvL3gtYWxhdyIpID09IDApIHsKKyAgICB3YXZlbmMtPmZvcm1hdCA9IEdTVF9SSUZGX1dBVkVfRk9STUFUX0FMQVc7CisgICAgd2F2ZW5jLT53aWR0aCA9IDg7CisgIH0gZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYXVkaW8veC1tdWxhdyIpID09IDApIHsKKyAgICB3YXZlbmMtPmZvcm1hdCA9IEdTVF9SSUZGX1dBVkVfRk9STUFUX01VTEFXOworICAgIHdhdmVuYy0+d2lkdGggPSA4OworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2ZW5jLCAiVW5zdXBwb3J0ZWQgZm9ybWF0ICVzIiwgbmFtZSk7CisgICAgZ290byBmYWlsOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHdhdmVuYywKKyAgICAgICJhY2NlcHRlZCBjYXBzOiBmb3JtYXQ9MHglMDR4IGNoYW5zPSV1IHdpZHRoPSV1IHJhdGU9JXUiLAorICAgICAgd2F2ZW5jLT5mb3JtYXQsIHdhdmVuYy0+Y2hhbm5lbHMsIHdhdmVuYy0+d2lkdGgsIHdhdmVuYy0+cmF0ZSk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAod2F2ZW5jKTsKKyAgcmV0dXJuIFRSVUU7CisKK2ZhaWw6CisgIGdzdF9vYmplY3RfdW5yZWYgKHdhdmVuYyk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZwYXJzZV90YWdzX2ZvcmVhY2ggKGNvbnN0IEdzdFRhZ0xpc3QgKiB0YWdzLCBjb25zdCBnY2hhciAqIHRhZywKKyAgICBncG9pbnRlciBkYXRhKQoreworICBjb25zdCBzdHJ1Y3QKKyAgeworICAgIGd1aW50MzIgZmNjOworICAgIGNvbnN0IGdjaGFyICp0YWc7CisgIH0gcmlmZnRhZ3NbXSA9IHsKKyAgICB7CisgICAgR1NUX1JJRkZfSU5GT19JQVJMLCBHU1RfVEFHX0xPQ0FUSU9OfSwgeworICAgIEdTVF9SSUZGX0lORk9fSUFSVCwgR1NUX1RBR19BUlRJU1R9LCB7CisgICAgR1NUX1JJRkZfSU5GT19JQ01ULCBHU1RfVEFHX0NPTU1FTlR9LCB7CisgICAgR1NUX1JJRkZfSU5GT19JQ09QLCBHU1RfVEFHX0NPUFlSSUdIVH0sIHsKKyAgICBHU1RfUklGRl9JTkZPX0lDUkQsIEdTVF9UQUdfREFURX0sIHsKKyAgICBHU1RfUklGRl9JTkZPX0lHTlIsIEdTVF9UQUdfR0VOUkV9LCB7CisgICAgR1NUX1JJRkZfSU5GT19JS0VZLCBHU1RfVEFHX0tFWVdPUkRTfSwgeworICAgIEdTVF9SSUZGX0lORk9fSU5BTSwgR1NUX1RBR19USVRMRX0sIHsKKyAgICBHU1RfUklGRl9JTkZPX0lQUkQsIEdTVF9UQUdfQUxCVU19LCB7CisgICAgR1NUX1JJRkZfSU5GT19JU0JKLCBHU1RfVEFHX0FMQlVNX0FSVElTVH0sIHsKKyAgICBHU1RfUklGRl9JTkZPX0lTRlQsIEdTVF9UQUdfRU5DT0RFUn0sIHsKKyAgICBHU1RfUklGRl9JTkZPX0lTUkMsIEdTVF9UQUdfSVNSQ30sIHsKKyAgICAwLCBOVUxMfQorICB9OworICBnaW50IG47CisgIGdjaGFyICpzdHIgPSBOVUxMOworICBHc3RCeXRlV3JpdGVyICpidyA9IGRhdGE7CisgIGZvciAobiA9IDA7IHJpZmZ0YWdzW25dLmZjYyAhPSAwOyBuKyspIHsKKyAgICBpZiAoIXN0cmNtcCAocmlmZnRhZ3Nbbl0udGFnLCB0YWcpKSB7CisgICAgICBpZiAocmlmZnRhZ3Nbbl0uZmNjID09IEdTVF9SSUZGX0lORk9fSUNSRCkgeworICAgICAgICBHRGF0ZSAqZGF0ZTsKKyAgICAgICAgLyogc3BlY2lhbCBjYXNlIGZvciB0aGUgZGF0ZSB0YWcgKi8KKyAgICAgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfZGF0ZSAodGFncywgdGFnLCAmZGF0ZSkpIHsKKyAgICAgICAgICBzdHIgPQorICAgICAgICAgICAgICBnX3N0cmR1cF9wcmludGYgKCIlMDRkOiUwMmQ6JTAyZCIsIGdfZGF0ZV9nZXRfeWVhciAoZGF0ZSksCisgICAgICAgICAgICAgIGdfZGF0ZV9nZXRfbW9udGggKGRhdGUpLCBnX2RhdGVfZ2V0X2RheSAoZGF0ZSkpOworICAgICAgICAgIGdfZGF0ZV9mcmVlIChkYXRlKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ3MsIHRhZywgJnN0cik7CisgICAgICB9CisgICAgICBpZiAoc3RyKSB7CisgICAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlIChidywgcmlmZnRhZ3Nbbl0uZmNjKTsKKyAgICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKGJ3LCBHU1RfUk9VTkRfVVBfMiAoc3RybGVuIChzdHIpKSk7CisgICAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfc3RyaW5nIChidywgc3RyKTsKKyAgICAgICAgZ19mcmVlIChzdHIpOworICAgICAgICBzdHIgPSBOVUxMOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3dhdmVuY193cml0ZV90YWdzIChHc3RXYXZFbmMgKiB3YXZlbmMpCit7CisgIGNvbnN0IEdzdFRhZ0xpc3QgKnVzZXJfdGFnczsKKyAgR3N0VGFnTGlzdCAqdGFnczsKKyAgZ3VpbnQgc2l6ZTsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdEJ5dGVXcml0ZXIgYnc7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHdhdmVuYyAhPSBOVUxMLCBHU1RfRkxPV19PSyk7CisKKyAgdXNlcl90YWdzID0gZ3N0X3RhZ19zZXR0ZXJfZ2V0X3RhZ19saXN0IChHU1RfVEFHX1NFVFRFUiAod2F2ZW5jKSk7CisgIGlmICgoIXdhdmVuYy0+dGFncykgJiYgKCF1c2VyX3RhZ3MpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2ZW5jLCAiaGF2ZSBubyB0YWdzIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CisgIHRhZ3MgPQorICAgICAgZ3N0X3RhZ19saXN0X21lcmdlICh1c2VyX3RhZ3MsIHdhdmVuYy0+dGFncywKKyAgICAgIGdzdF90YWdfc2V0dGVyX2dldF90YWdfbWVyZ2VfbW9kZSAoR1NUX1RBR19TRVRURVIgKHdhdmVuYykpKTsKKworICBHU1RfREVCVUdfT0JKRUNUICh3YXZlbmMsICJ3cml0aW5nIHRhZ3MiKTsKKworICBnc3RfYnl0ZV93cml0ZXJfaW5pdF93aXRoX3NpemUgKCZidywgMTAyNCwgRkFMU0UpOworCisgIC8qIGFkZCBMSVNUIElORk8gY2h1bmsgKi8KKyAgZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICgmYncsIChjb25zdCBndWludDggKikgIkxJU1QiLCA0KTsKKyAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgMCk7CisgIGdzdF9ieXRlX3dyaXRlcl9wdXRfZGF0YSAoJmJ3LCAoY29uc3QgZ3VpbnQ4ICopICJJTkZPIiwgNCk7CisKKyAgLyogYWRkIHRhZ3MgKi8KKyAgZ3N0X3RhZ19saXN0X2ZvcmVhY2ggKHRhZ3MsIGdzdF93YXZwYXJzZV90YWdzX2ZvcmVhY2gsICZidyk7CisKKyAgLyogc2V0cyByZWFsIHNpemUgb2YgTElTVCBJTkZPIGNodW5rICovCisgIHNpemUgPSBnc3RfYnl0ZV93cml0ZXJfZ2V0X3BvcyAoJmJ3KTsKKyAgZ3N0X2J5dGVfd3JpdGVyX3NldF9wb3MgKCZidywgNCk7CisgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIHNpemUgLSA4KTsKKworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ3MpOworCisgIGJ1ZiA9IGdzdF9ieXRlX3dyaXRlcl9yZXNldF9hbmRfZ2V0X2J1ZmZlciAoJmJ3KTsKKyAgd2F2ZW5jLT5tZXRhX2xlbmd0aCArPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpOworICByZXR1cm4gZ3N0X3BhZF9wdXNoICh3YXZlbmMtPnNyY3BhZCwgYnVmKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2ZW5jX2lzX2N1ZV9pZF91bmlxdWUgKGd1aW50MzIgaWQsIEdMaXN0ICogbGlzdCkKK3sKKyAgR3N0V2F2RW5jQ3VlICpjdWU7CisKKyAgd2hpbGUgKGxpc3QpIHsKKyAgICBjdWUgPSBsaXN0LT5kYXRhOworICAgIGlmIChjdWUtPmlkID09IGlkKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIGxpc3QgPSBnX2xpc3RfbmV4dCAobGlzdCk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2ZW5jX3BhcnNlX2N1ZSAoR3N0V2F2RW5jICogd2F2ZW5jLCBndWludDMyIGlkLCBHc3RUb2NFbnRyeSAqIGVudHJ5KQoreworICBnaW50NjQgc3RhcnQ7CisgIEdzdFdhdkVuY0N1ZSAqY3VlOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChlbnRyeSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgZ3N0X3RvY19lbnRyeV9nZXRfc3RhcnRfc3RvcF90aW1lcyAoZW50cnksICZzdGFydCwgTlVMTCk7CisKKyAgY3VlID0gZ19uZXcgKEdzdFdhdkVuY0N1ZSwgMSk7CisgIGN1ZS0+aWQgPSBpZDsKKyAgY3VlLT5wb3NpdGlvbiA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAoc3RhcnQsIHdhdmVuYy0+cmF0ZSwgR1NUX1NFQ09ORCk7CisgIG1lbWNweSAoY3VlLT5kYXRhX2NodW5rX2lkLCAiZGF0YSIsIDQpOworICBjdWUtPmNodW5rX3N0YXJ0ID0gMDsKKyAgY3VlLT5ibG9ja19zdGFydCA9IDA7CisgIGN1ZS0+c2FtcGxlX29mZnNldCA9IGN1ZS0+cG9zaXRpb247CisgIHdhdmVuYy0+Y3VlcyA9IGdfbGlzdF9hcHBlbmQgKHdhdmVuYy0+Y3VlcywgY3VlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2ZW5jX3BhcnNlX2xhYmwgKEdzdFdhdkVuYyAqIHdhdmVuYywgZ3VpbnQzMiBpZCwgR3N0VG9jRW50cnkgKiBlbnRyeSkKK3sKKyAgZ2NoYXIgKnRhZzsKKyAgR3N0VGFnTGlzdCAqdGFnczsKKyAgR3N0V2F2RW5jTGFibCAqbGFibDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZW50cnkgIT0gTlVMTCwgRkFMU0UpOworCisgIHRhZ3MgPSBnc3RfdG9jX2VudHJ5X2dldF90YWdzIChlbnRyeSk7CisgIGlmICghdGFncykgeworICAgIEdTVF9JTkZPX09CSkVDVCAod2F2ZW5jLCAibm8gdGFncyBmb3IgZW50cnk6ICVkIiwgaWQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoIWdzdF90YWdfbGlzdF9nZXRfc3RyaW5nICh0YWdzLCBHU1RfVEFHX1RJVExFLCAmdGFnKSkgeworICAgIEdTVF9JTkZPX09CSkVDVCAod2F2ZW5jLCAibm8gdGl0bGUgdGFnIGZvciBlbnRyeTogJWQiLCBpZCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgbGFibCA9IGdfbmV3IChHc3RXYXZFbmNMYWJsLCAxKTsKKyAgbWVtY3B5IChsYWJsLT5jaHVua19pZCwgImxhYmwiLCA0KTsKKyAgbGFibC0+Y2h1bmtfZGF0YV9zaXplID0gNCArIHN0cmxlbiAodGFnKSArIDE7CisgIGxhYmwtPmN1ZV9wb2ludF9pZCA9IGlkOworICBsYWJsLT50ZXh0ID0gdGFnOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdmVuYywgImdvdCBsYWJsOiAnJXMnIiwgdGFnKTsKKworICB3YXZlbmMtPmxhYmxzID0gZ19saXN0X2FwcGVuZCAod2F2ZW5jLT5sYWJscywgbGFibCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdmVuY19wYXJzZV9ub3RlIChHc3RXYXZFbmMgKiB3YXZlbmMsIGd1aW50MzIgaWQsIEdzdFRvY0VudHJ5ICogZW50cnkpCit7CisgIGdjaGFyICp0YWc7CisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisgIEdzdFdhdkVuY05vdGUgKm5vdGU7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGVudHJ5ICE9IE5VTEwsIEZBTFNFKTsKKyAgdGFncyA9IGdzdF90b2NfZW50cnlfZ2V0X3RhZ3MgKGVudHJ5KTsKKyAgaWYgKCF0YWdzKSB7CisgICAgR1NUX0lORk9fT0JKRUNUICh3YXZlbmMsICJubyB0YWdzIGZvciBlbnRyeTogJWQiLCBpZCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ3MsIEdTVF9UQUdfQ09NTUVOVCwgJnRhZykpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHdhdmVuYywgIm5vIGNvbW1lbnQgdGFnIGZvciBlbnRyeTogJWQiLCBpZCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgbm90ZSA9IGdfbmV3IChHc3RXYXZFbmNOb3RlLCAxKTsKKyAgbWVtY3B5IChub3RlLT5jaHVua19pZCwgIm5vdGUiLCA0KTsKKyAgbm90ZS0+Y2h1bmtfZGF0YV9zaXplID0gNCArIHN0cmxlbiAodGFnKSArIDE7CisgIG5vdGUtPmN1ZV9wb2ludF9pZCA9IGlkOworICBub3RlLT50ZXh0ID0gdGFnOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdmVuYywgImdvdCBub3RlOiAnJXMnIiwgdGFnKTsKKworICB3YXZlbmMtPm5vdGVzID0gZ19saXN0X2FwcGVuZCAod2F2ZW5jLT5ub3Rlcywgbm90ZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdmVuY193cml0ZV9jdWVzIChndWludDggKiogZGF0YSwgR0xpc3QgKiBsaXN0KQoreworICBHc3RXYXZFbmNDdWUgKmN1ZTsKKworICB3aGlsZSAobGlzdCkgeworICAgIGN1ZSA9IGxpc3QtPmRhdGE7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoKmRhdGEsIGN1ZS0+aWQpOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKCpkYXRhICsgNCwgY3VlLT5wb3NpdGlvbik7CisgICAgbWVtY3B5ICgqZGF0YSArIDgsIChnY2hhciAqKSBjdWUtPmRhdGFfY2h1bmtfaWQsIDQpOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKCpkYXRhICsgMTIsIGN1ZS0+Y2h1bmtfc3RhcnQpOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKCpkYXRhICsgMTYsIGN1ZS0+YmxvY2tfc3RhcnQpOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKCpkYXRhICsgMjAsIGN1ZS0+c2FtcGxlX29mZnNldCk7CisgICAgKmRhdGEgKz0gMjQ7CisgICAgbGlzdCA9IGdfbGlzdF9uZXh0IChsaXN0KTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZlbmNfd3JpdGVfbGFibHMgKGd1aW50OCAqKiBkYXRhLCBHTGlzdCAqIGxpc3QpCit7CisgIEdzdFdhdkVuY0xhYmwgKmxhYmw7CisKKyAgd2hpbGUgKGxpc3QpIHsKKyAgICBsYWJsID0gbGlzdC0+ZGF0YTsKKyAgICBtZW1jcHkgKCpkYXRhLCAoZ2NoYXIgKikgbGFibC0+Y2h1bmtfaWQsIDQpOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKCpkYXRhICsgNCwgbGFibC0+Y2h1bmtfZGF0YV9zaXplKTsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0xFICgqZGF0YSArIDgsIGxhYmwtPmN1ZV9wb2ludF9pZCk7CisgICAgbWVtY3B5ICgqZGF0YSArIDEyLCAoZ2NoYXIgKikgbGFibC0+dGV4dCwgc3RybGVuIChsYWJsLT50ZXh0KSk7CisgICAgKmRhdGEgKz0gOCArIEdTVF9ST1VORF9VUF8yIChsYWJsLT5jaHVua19kYXRhX3NpemUpOworICAgIGxpc3QgPSBnX2xpc3RfbmV4dCAobGlzdCk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2ZW5jX3dyaXRlX25vdGVzIChndWludDggKiogZGF0YSwgR0xpc3QgKiBsaXN0KQoreworICBHc3RXYXZFbmNOb3RlICpub3RlOworCisgIHdoaWxlIChsaXN0KSB7CisgICAgbm90ZSA9IGxpc3QtPmRhdGE7CisgICAgbWVtY3B5ICgqZGF0YSwgKGdjaGFyICopIG5vdGUtPmNodW5rX2lkLCA0KTsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0xFICgqZGF0YSArIDQsIG5vdGUtPmNodW5rX2RhdGFfc2l6ZSk7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoKmRhdGEgKyA4LCBub3RlLT5jdWVfcG9pbnRfaWQpOworICAgIG1lbWNweSAoKmRhdGEgKyAxMiwgKGdjaGFyICopIG5vdGUtPnRleHQsIHN0cmxlbiAobm90ZS0+dGV4dCkpOworICAgICpkYXRhICs9IDggKyBHU1RfUk9VTkRfVVBfMiAobm90ZS0+Y2h1bmtfZGF0YV9zaXplKTsKKyAgICBsaXN0ID0gZ19saXN0X25leHQgKGxpc3QpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfd2F2ZW5jX3dyaXRlX3RvYyAoR3N0V2F2RW5jICogd2F2ZW5jKQoreworICBHTGlzdCAqbGlzdDsKKyAgR3N0VG9jICp0b2M7CisgIEdzdFRvY0VudHJ5ICplbnRyeSwgKnN1YmVudHJ5OworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQzMiBuY3Vlcywgc2l6ZSwgY3Vlc19zaXplLCBsYWJsc19zaXplLCBub3Rlc19zaXplOworCisgIGlmICghd2F2ZW5jLT50b2MpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh3YXZlbmMsICJoYXZlIG5vIHRvYywgY2hlY2tpbmcgdG9jX3NldHRlciIpOworICAgIHdhdmVuYy0+dG9jID0gZ3N0X3RvY19zZXR0ZXJfZ2V0X3RvYyAoR1NUX1RPQ19TRVRURVIgKHdhdmVuYykpOworICB9CisgIGlmICghd2F2ZW5jLT50b2MpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHdhdmVuYywgImhhdmUgbm8gdG9jIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CisKKyAgdG9jID0gZ3N0X3RvY19yZWYgKHdhdmVuYy0+dG9jKTsKKyAgc2l6ZSA9IDA7CisgIGN1ZXNfc2l6ZSA9IDA7CisgIGxhYmxzX3NpemUgPSAwOworICBub3Rlc19zaXplID0gMDsKKworICAvKiBjaGVjayBpZiB0aGUgVE9DIGVudHJpZXMgaXMgdmFsaWQgKi8KKyAgbGlzdCA9IGdzdF90b2NfZ2V0X2VudHJpZXMgKHRvYyk7CisgIGVudHJ5ID0gbGlzdC0+ZGF0YTsKKyAgaWYgKGdzdF90b2NfZW50cnlfaXNfYWx0ZXJuYXRpdmUgKGVudHJ5KSkgeworICAgIGxpc3QgPSBnc3RfdG9jX2VudHJ5X2dldF9zdWJfZW50cmllcyAoZW50cnkpOworICAgIHdoaWxlIChsaXN0KSB7CisgICAgICBzdWJlbnRyeSA9IGxpc3QtPmRhdGE7CisgICAgICBpZiAoIWdzdF90b2NfZW50cnlfaXNfc2VxdWVuY2UgKHN1YmVudHJ5KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgbGlzdCA9IGdfbGlzdF9uZXh0IChsaXN0KTsKKyAgICB9CisgICAgbGlzdCA9IGdzdF90b2NfZW50cnlfZ2V0X3N1Yl9lbnRyaWVzIChlbnRyeSk7CisgIH0KKyAgaWYgKGdzdF90b2NfZW50cnlfaXNfc2VxdWVuY2UgKGVudHJ5KSkgeworICAgIHdoaWxlIChsaXN0KSB7CisgICAgICBlbnRyeSA9IGxpc3QtPmRhdGE7CisgICAgICBpZiAoIWdzdF90b2NfZW50cnlfaXNfc2VxdWVuY2UgKGVudHJ5KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgbGlzdCA9IGdfbGlzdF9uZXh0IChsaXN0KTsKKyAgICB9CisgICAgbGlzdCA9IGdzdF90b2NfZ2V0X2VudHJpZXMgKHRvYyk7CisgIH0KKworICBuY3VlcyA9IGdfbGlzdF9sZW5ndGggKGxpc3QpOworICBHU1RfREVCVUdfT0JKRUNUICh3YXZlbmMsICJudW1iZXIgb2YgY3VlIGVudHJpZXM6ICVkIiwgbmN1ZXMpOworCisgIHdoaWxlIChsaXN0KSB7CisgICAgZ3VpbnQzMiBpZCA9IDA7CisgICAgZ2ludDY0IGlkNjQ7CisgICAgY29uc3QgZ2NoYXIgKnVpZDsKKworICAgIGVudHJ5ID0gbGlzdC0+ZGF0YTsKKyAgICB1aWQgPSBnc3RfdG9jX2VudHJ5X2dldF91aWQgKGVudHJ5KTsKKyAgICBpZDY0ID0gZ19hc2NpaV9zdHJ0b2xsICh1aWQsIE5VTEwsIDApOworICAgIC8qIGNoZWNrIGlmIGlkIHVuaXF1ZSBjb21wYXRpYmxlIHdpdGggZ3VpbnQzMiBlbHNlIGdlbmVyYXRlIHJhbmRvbSAqLworICAgIGlmIChpZDY0ID49IDAgJiYgZ3N0X3dhdmVuY19pc19jdWVfaWRfdW5pcXVlIChpZDY0LCB3YXZlbmMtPmN1ZXMpKSB7CisgICAgICBpZCA9IChndWludDMyKSBpZDY0OworICAgIH0gZWxzZSB7CisgICAgICBkbyB7CisgICAgICAgIGlkID0gZ19yYW5kb21faW50ICgpOworICAgICAgfSB3aGlsZSAoIWdzdF93YXZlbmNfaXNfY3VlX2lkX3VuaXF1ZSAoaWQsIHdhdmVuYy0+Y3VlcykpOworICAgIH0KKyAgICBnc3Rfd2F2ZW5jX3BhcnNlX2N1ZSAod2F2ZW5jLCBpZCwgZW50cnkpOworICAgIGdzdF93YXZlbmNfcGFyc2VfbGFibCAod2F2ZW5jLCBpZCwgZW50cnkpOworICAgIGdzdF93YXZlbmNfcGFyc2Vfbm90ZSAod2F2ZW5jLCBpZCwgZW50cnkpOworICAgIGxpc3QgPSBnX2xpc3RfbmV4dCAobGlzdCk7CisgIH0KKworICAvKiBjb3VudCBjdWVzIHNpemUgKi8KKyAgaWYgKHdhdmVuYy0+Y3VlcykgeworICAgIGN1ZXNfc2l6ZSA9IDI0ICogZ19saXN0X2xlbmd0aCAod2F2ZW5jLT5jdWVzKTsKKyAgICBzaXplICs9IDEyICsgY3Vlc19zaXplOworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2ZW5jLCAiY3VlJ3Mgbm90IGZvdW5kIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIC8qIGNvdW50IGxhYmxzIHNpemUgKi8KKyAgaWYgKHdhdmVuYy0+bGFibHMpIHsKKyAgICBsaXN0ID0gd2F2ZW5jLT5sYWJsczsKKyAgICB3aGlsZSAobGlzdCkgeworICAgICAgR3N0V2F2RW5jTGFibCAqbGFibDsKKyAgICAgIGxhYmwgPSBsaXN0LT5kYXRhOworICAgICAgbGFibHNfc2l6ZSArPSA4ICsgR1NUX1JPVU5EX1VQXzIgKGxhYmwtPmNodW5rX2RhdGFfc2l6ZSk7CisgICAgICBsaXN0ID0gZ19saXN0X25leHQgKGxpc3QpOworICAgIH0KKyAgICBzaXplICs9IGxhYmxzX3NpemU7CisgIH0KKyAgLyogY291bnQgbm90ZXMgc2l6ZSAqLworICBpZiAod2F2ZW5jLT5ub3RlcykgeworICAgIGxpc3QgPSB3YXZlbmMtPm5vdGVzOworICAgIHdoaWxlIChsaXN0KSB7CisgICAgICBHc3RXYXZFbmNOb3RlICpub3RlOworICAgICAgbm90ZSA9IGxpc3QtPmRhdGE7CisgICAgICBub3Rlc19zaXplICs9IDggKyBHU1RfUk9VTkRfVVBfMiAobm90ZS0+Y2h1bmtfZGF0YV9zaXplKTsKKyAgICAgIGxpc3QgPSBnX2xpc3RfbmV4dCAobGlzdCk7CisgICAgfQorICAgIHNpemUgKz0gbm90ZXNfc2l6ZTsKKyAgfQorICBpZiAod2F2ZW5jLT5sYWJscyB8fCB3YXZlbmMtPm5vdGVzKSB7CisgICAgc2l6ZSArPSAxMjsKKyAgfQorCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZSk7CisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBkYXRhID0gbWFwLmRhdGE7CisgIG1lbXNldCAoZGF0YSwgMCwgc2l6ZSk7CisKKyAgLyogd3JpdGUgQ3VlIENodW5rICovCisgIGlmICh3YXZlbmMtPmN1ZXMpIHsKKyAgICBtZW1jcHkgKGRhdGEsIChnY2hhciAqKSAiY3VlICIsIDQpOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGRhdGEgKyA0LCA0ICsgY3Vlc19zaXplKTsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhICsgOCwgbmN1ZXMpOworICAgIGRhdGEgKz0gMTI7CisgICAgZ3N0X3dhdmVuY193cml0ZV9jdWVzICgmZGF0YSwgd2F2ZW5jLT5jdWVzKTsKKworICAgIC8qIHdyaXRlIEFzc29jaWF0ZWQgRGF0YSBMaXN0IENodW5rICovCisgICAgaWYgKHdhdmVuYy0+bGFibHMgfHwgd2F2ZW5jLT5ub3RlcykgeworICAgICAgbWVtY3B5IChkYXRhLCAoZ2NoYXIgKikgIkxJU1QiLCA0KTsKKyAgICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGRhdGEgKyA0LCA0ICsgbGFibHNfc2l6ZSArIG5vdGVzX3NpemUpOworICAgICAgbWVtY3B5IChkYXRhICsgOCwgKGdjaGFyICopICJhZHRsIiwgNCk7CisgICAgICBkYXRhICs9IDEyOworICAgICAgaWYgKHdhdmVuYy0+bGFibHMpCisgICAgICAgIGdzdF93YXZlbmNfd3JpdGVfbGFibHMgKCZkYXRhLCB3YXZlbmMtPmxhYmxzKTsKKyAgICAgIGlmICh3YXZlbmMtPm5vdGVzKQorICAgICAgICBnc3Rfd2F2ZW5jX3dyaXRlX25vdGVzICgmZGF0YSwgd2F2ZW5jLT5ub3Rlcyk7CisgICAgfQorICB9CisKKyAgLyogZnJlZSByZXNvdXJjZXMgKi8KKyAgaWYgKHRvYykKKyAgICBnc3RfdG9jX3VucmVmICh0b2MpOworICBpZiAod2F2ZW5jLT5jdWVzKQorICAgIGdfbGlzdF9mcmVlX2Z1bGwgKHdhdmVuYy0+Y3VlcywgZ19mcmVlKTsKKyAgaWYgKHdhdmVuYy0+bGFibHMpCisgICAgZ19saXN0X2ZyZWVfZnVsbCAod2F2ZW5jLT5sYWJscywgZ19mcmVlKTsKKyAgaWYgKHdhdmVuYy0+bm90ZXMpCisgICAgZ19saXN0X2ZyZWVfZnVsbCAod2F2ZW5jLT5ub3RlcywgZ19mcmVlKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICB3YXZlbmMtPm1ldGFfbGVuZ3RoICs9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisKKyAgcmV0dXJuIGdzdF9wYWRfcHVzaCAod2F2ZW5jLT5zcmNwYWQsIGJ1Zik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdmVuY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisgIEdzdFdhdkVuYyAqd2F2ZW5jOworICBHc3RUYWdMaXN0ICp0YWdzOworICBHc3RUb2MgKnRvYzsKKworICB3YXZlbmMgPSBHU1RfV0FWRU5DIChwYXJlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICBnc3Rfd2F2ZW5jX3Npbmtfc2V0Y2FwcyAocGFkLCBjYXBzKTsKKworICAgICAgLyogaGF2ZSBvdXIgb3duIHNyYyBjYXBzICovCisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgeworICAgICAgR3N0Rmxvd1JldHVybiBmbG93OworICAgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2ZW5jLCAiZ290IEVPUyIpOworCisgICAgICBmbG93ID0gZ3N0X3dhdmVuY193cml0ZV90b2MgKHdhdmVuYyk7CisgICAgICBpZiAoZmxvdyAhPSBHU1RfRkxPV19PSykgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHdhdmVuYywgImVycm9yIHB1c2hpbmcgdG9jOiAlcyIsCisgICAgICAgICAgICBnc3RfZmxvd19nZXRfbmFtZSAoZmxvdykpOworICAgICAgfQorICAgICAgZmxvdyA9IGdzdF93YXZlbmNfd3JpdGVfdGFncyAod2F2ZW5jKTsKKyAgICAgIGlmIChmbG93ICE9IEdTVF9GTE9XX09LKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2ZW5jLCAiZXJyb3IgcHVzaGluZyB0YWdzOiAlcyIsCisgICAgICAgICAgICBnc3RfZmxvd19nZXRfbmFtZSAoZmxvdykpOworICAgICAgfQorCisgICAgICAvKiB3cml0ZSBoZWFkZXIgd2l0aCBjb3JyZWN0IGxlbmd0aCB2YWx1ZXMgKi8KKyAgICAgIGdzdF93YXZlbmNfcHVzaF9oZWFkZXIgKHdhdmVuYyk7CisKKyAgICAgIC8qIHdlJ3JlIGRvbmUgd2l0aCB0aGlzIGZpbGUgKi8KKyAgICAgIHdhdmVuYy0+ZmluaXNoZWRfcHJvcGVybHkgPSBUUlVFOworCisgICAgICAvKiBhbmQgZm9yd2FyZCB0aGUgRU9TIGV2ZW50ICovCisgICAgICByZXMgPSBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDoKKyAgICAgIC8qIEp1c3QgZHJvcCBpdCwgaXQncyBwcm9iYWJseSBpbiBUSU1FIGZvcm1hdAorICAgICAgICogYW55d2F5LiBXZSdsbCBzZW5kIG91ciBvd24gbmV3c2VnbWVudCBldmVudCAqLworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9UT0M6CisgICAgICBnc3RfZXZlbnRfcGFyc2VfdG9jIChldmVudCwgJnRvYywgTlVMTCk7CisgICAgICBpZiAodG9jKSB7CisgICAgICAgIGlmICh3YXZlbmMtPnRvYyAhPSB0b2MpIHsKKyAgICAgICAgICBpZiAod2F2ZW5jLT50b2MpCisgICAgICAgICAgICBnc3RfdG9jX3VucmVmICh3YXZlbmMtPnRvYyk7CisgICAgICAgICAgd2F2ZW5jLT50b2MgPSB0b2M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3N0X3RvY191bnJlZiAodG9jKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfVEFHOgorICAgICAgZ3N0X2V2ZW50X3BhcnNlX3RhZyAoZXZlbnQsICZ0YWdzKTsKKyAgICAgIGlmICh0YWdzKSB7CisgICAgICAgIGlmICh3YXZlbmMtPnRhZ3MgIT0gdGFncykgeworICAgICAgICAgIGlmICh3YXZlbmMtPnRhZ3MpCisgICAgICAgICAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHdhdmVuYy0+dGFncyk7CisgICAgICAgICAgd2F2ZW5jLT50YWdzID0gZ3N0X3RhZ19saXN0X3JlZiAodGFncyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJlcyA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfd2F2ZW5jX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RXYXZFbmMgKndhdmVuYyA9IEdTVF9XQVZFTkMgKHBhcmVudCk7CisgIEdzdEZsb3dSZXR1cm4gZmxvdyA9IEdTVF9GTE9XX09LOworCisgIGlmICh3YXZlbmMtPmNoYW5uZWxzIDw9IDApIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUICh3YXZlbmMsICJHb3QgZGF0YSB3aXRob3V0IGNhcHMiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoIXdhdmVuYy0+c2VudF9oZWFkZXIpKSB7CisgICAgR3N0U3RydWN0dXJlICpzOworICAgIEdzdENhcHMgKmNhcHMgPSBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgKHdhdmVuYy0+c3JjcGFkKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdmVuYywgImFsbG93ZWQgc3JjIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKyAgICBpZiAoIWdzdF9jYXBzX2lzX2ZpeGVkIChjYXBzKSkgeworICAgICAgY2FwcyA9IGdzdF9jYXBzX3RydW5jYXRlIChjYXBzKTsKKyAgICB9CisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICAgIHdhdmVuYy0+dXNlX3JmNjQgPSBnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiYXVkaW8veC1yZjY0Iik7CisKKyAgICBnc3RfcGFkX3NldF9jYXBzICh3YXZlbmMtPnNyY3BhZCwgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgLyogc3RhcnRpbmcgYSBmaWxlLCBtZWFucyB3ZSBoYXZlIHRvIGZpbmlzaCBpdCBwcm9wZXJseSAqLworICAgIHdhdmVuYy0+ZmluaXNoZWRfcHJvcGVybHkgPSBGQUxTRTsKKworICAgIC8qIHB1c2ggaW5pdGlhbCBib2d1cyBoZWFkZXIsIGl0IHdpbGwgYmUgdXBkYXRlZCBvbiBFT1MgKi8KKyAgICBmbG93ID0gZ3N0X3dhdmVuY19wdXNoX2hlYWRlciAod2F2ZW5jKTsKKyAgICBpZiAoZmxvdyAhPSBHU1RfRkxPV19PSykgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh3YXZlbmMsICJlcnJvciBwdXNoaW5nIGhlYWRlcjogJXMiLAorICAgICAgICAgIGdzdF9mbG93X2dldF9uYW1lIChmbG93KSk7CisgICAgICByZXR1cm4gZmxvdzsKKyAgICB9CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2ZW5jLCAid3JvdGUgZHVtbXkgaGVhZGVyIik7CisgICAgd2F2ZW5jLT5hdWRpb19sZW5ndGggPSAwOworICAgIHdhdmVuYy0+c2VudF9oZWFkZXIgPSBUUlVFOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHdhdmVuYywKKyAgICAgICJwdXNoaW5nICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMgcmF3IGF1ZGlvLCB0cz0lIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpLCBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKSkpOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoYnVmKTsKKworICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSA9IGdldF9oZWFkZXJfbGVuICh3YXZlbmMpICsgd2F2ZW5jLT5hdWRpb19sZW5ndGg7CisgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmKSA9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkU7CisKKyAgd2F2ZW5jLT5hdWRpb19sZW5ndGggKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKworICBpZiAod2F2ZW5jLT5jaGFubmVsX21hc2sgIT0gMCAmJgorICAgICAgIWdzdF9hdWRpb19idWZmZXJfcmVvcmRlcl9jaGFubmVscyAoYnVmLCB3YXZlbmMtPmF1ZGlvX2Zvcm1hdCwKKyAgICAgICAgICB3YXZlbmMtPmNoYW5uZWxzLCB3YXZlbmMtPnNyY1Bvcywgd2F2ZW5jLT5kZXN0UG9zKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2ZW5jLCAiQ291bGQgbm90IHJlb3JkZXIgY2hhbm5lbHMiKTsKKyAgfQorCisgIGZsb3cgPSBnc3RfcGFkX3B1c2ggKHdhdmVuYy0+c3JjcGFkLCBidWYpOworCisgIHJldHVybiBmbG93OworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF93YXZlbmNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTOworICBHc3RXYXZFbmMgKndhdmVuYyA9IEdTVF9XQVZFTkMgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOgorICAgICAgd2F2ZW5jLT5mb3JtYXQgPSAwOworICAgICAgd2F2ZW5jLT5jaGFubmVscyA9IDA7CisgICAgICB3YXZlbmMtPndpZHRoID0gMDsKKyAgICAgIHdhdmVuYy0+cmF0ZSA9IDA7CisgICAgICAvKiB1c2UgYm9ndXMgc2l6ZSBpbml0aWFsbHksIHdlJ2xsIHdyaXRlIHRoZSByZWFsCisgICAgICAgKiBoZWFkZXIgd2hlbiB3ZSBnZXQgRU9TIGFuZCBrbm93IHRoZSBleGFjdCBsZW5ndGggKi8KKyAgICAgIHdhdmVuYy0+YXVkaW9fbGVuZ3RoID0gMHg3RkZGMDAwMDsKKyAgICAgIHdhdmVuYy0+bWV0YV9sZW5ndGggPSAwOworICAgICAgd2F2ZW5jLT5zZW50X2hlYWRlciA9IEZBTFNFOworICAgICAgLyogaXRzIHRydWUgYmVjYXVzZSB3ZSBoYXZlbid0IHdyaXRlbiBhbnl0aGluZyAqLworICAgICAgd2F2ZW5jLT5maW5pc2hlZF9wcm9wZXJseSA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKyAgaWYgKHJldCAhPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpCisgICAgcmV0dXJuIHJldDsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgaWYgKCF3YXZlbmMtPmZpbmlzaGVkX3Byb3Blcmx5KSB7CisgICAgICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHdhdmVuYywgU1RSRUFNLCBNVVgsCisgICAgICAgICAgICAoIldhdiBzdHJlYW0gbm90IGZpbmlzaGVkIHByb3Blcmx5IiksCisgICAgICAgICAgICAoIldhdiBzdHJlYW0gbm90IGZpbmlzaGVkIHByb3Blcmx5LCBubyBFT1MgcmVjZWl2ZWQgIgorICAgICAgICAgICAgICAgICJiZWZvcmUgc2h1dGRvd24iKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdmVuYywgInRhZ3M6ICVwIiwgd2F2ZW5jLT50YWdzKTsKKyAgICAgIGlmICh3YXZlbmMtPnRhZ3MpIHsKKyAgICAgICAgZ3N0X3RhZ19saXN0X3VucmVmICh3YXZlbmMtPnRhZ3MpOworICAgICAgICB3YXZlbmMtPnRhZ3MgPSBOVUxMOworICAgICAgfQorICAgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2ZW5jLCAidG9jOiAlcCIsIHdhdmVuYy0+dG9jKTsKKyAgICAgIGlmICh3YXZlbmMtPnRvYykgeworICAgICAgICBnc3RfdG9jX3VucmVmICh3YXZlbmMtPnRvYyk7CisgICAgICAgIHdhdmVuYy0+dG9jID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGdzdF90YWdfc2V0dGVyX3Jlc2V0X3RhZ3MgKEdTVF9UQUdfU0VUVEVSICh3YXZlbmMpKTsKKyAgICAgIGdzdF90b2Nfc2V0dGVyX3Jlc2V0IChHU1RfVE9DX1NFVFRFUiAod2F2ZW5jKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAid2F2ZW5jIiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgIEdTVF9UWVBFX1dBVkVOQyk7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICB3YXZlbmMsCisgICAgIkVuY29kZSByYXcgYXVkaW8gaW50byBXQVYiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L3dhdmVuYy9nc3R3YXZlbmMuaCBiL2dzdC93YXZlbmMvZ3N0d2F2ZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiMzhiYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC93YXZlbmMvZ3N0d2F2ZW5jLmgKQEAgLTAsMCArMSw4MyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIElhaW4gSG9sbWVzIDxpYWluQHByZXR0eXBlb3BsZS5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1dBVl9FTkNfSF9fCisjZGVmaW5lIF9fR1NUX1dBVl9FTkNfSF9fCisKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1dBVkVOQyBcCisgIChnc3Rfd2F2ZW5jX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9XQVZFTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9XQVZFTkMsR3N0V2F2RW5jKSkKKyNkZWZpbmUgR1NUX1dBVkVOQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9XQVZFTkMsR3N0V2F2RW5jQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfV0FWRU5DKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfV0FWRU5DKSkKKyNkZWZpbmUgR1NUX0lTX1dBVkVOQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9XQVZFTkMpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0V2F2RW5jIEdzdFdhdkVuYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RXYXZFbmNDbGFzcyBHc3RXYXZFbmNDbGFzczsKKworc3RydWN0IF9Hc3RXYXZFbmMgeworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgR3N0UGFkICAgICpzaW5rcGFkOworICBHc3RQYWQgICAgKnNyY3BhZDsKKworICBHc3RUYWdMaXN0ICp0YWdzOworICBHc3RUb2MgICAgKnRvYzsKKyAgR0xpc3QgICAgICpjdWVzOworICBHTGlzdCAgICAgKmxhYmxzOworICBHTGlzdCAgICAgKm5vdGVzOworCisgIC8qIHVzZWZ1bCBhdWRpbyBkYXRhICovCisgIEdzdEF1ZGlvRm9ybWF0IGF1ZGlvX2Zvcm1hdDsKKyAgZ3VpbnQxNiAgICBmb3JtYXQ7CisgIGd1aW50ICAgICAgd2lkdGg7CisgIGd1aW50ICAgICAgcmF0ZTsKKyAgZ3VpbnQgICAgICBjaGFubmVsczsKKyAgZ3VpbnQ2NCAgICBjaGFubmVsX21hc2s7CisgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHNyY1Bvc1s2NF07CisgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIGRlc3RQb3NbNjRdOworICAKKyAgLyogZGF0YSBzaXplcyAqLworICBndWludDY0ICAgIGF1ZGlvX2xlbmd0aDsKKyAgZ3VpbnQzMiAgICBtZXRhX2xlbmd0aDsKKworICBnYm9vbGVhbiAgIHVzZV9yZjY0OworICBnYm9vbGVhbiAgIHNlbnRfaGVhZGVyOworICBnYm9vbGVhbiAgIGZpbmlzaGVkX3Byb3Blcmx5OworfTsKKworc3RydWN0IF9Hc3RXYXZFbmNDbGFzcyB7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3Rfd2F2ZW5jX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1dBVl9FTkNfSF9fICovCmRpZmYgLS1naXQgYS9nc3Qvd2F2ZW5jL21lc29uLmJ1aWxkIGIvZ3N0L3dhdmVuYy9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGE5Mjk5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3dhdmVuYy9tZXNvbi5idWlsZApAQCAtMCwwICsxLDggQEAKK2dzdHdhdmVuYyA9IGxpYnJhcnkoJ2dzdHdhdmVuYycsCisgICdnc3R3YXZlbmMuYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0YmFzZV9kZXAsIGdzdGF1ZGlvX2RlcCwgZ3N0cmlmZl9kZXBdLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L3dhdnBhcnNlLy5naXRpZ25vcmUgYi9nc3Qvd2F2cGFyc2UvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGY1ZWQzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3dhdnBhcnNlLy5naXRpZ25vcmUKQEAgLTAsMCArMSw3IEBACitNYWtlZmlsZQorTWFrZWZpbGUuaW4KKyoubworKi5sbworKi5sYQorLmRlcHMKKy5saWJzCmRpZmYgLS1naXQgYS9nc3Qvd2F2cGFyc2UvTWFrZWZpbGUuYW0gYi9nc3Qvd2F2cGFyc2UvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA3NmMyOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC93YXZwYXJzZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE5IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3R3YXZwYXJzZS5sYQorCitsaWJnc3R3YXZwYXJzZV9sYV9TT1VSQ0VTID0gZ3N0d2F2cGFyc2UuYworbGliZ3N0d2F2cGFyc2VfbGFfQ0ZMQUdTID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9CQVNFX0NGTEFHUykgXAorCSQoR1NUX0NGTEFHUykKK2xpYmdzdHdhdnBhcnNlX2xhX0xJQkFERCA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgXAorCS1sZ3N0cmlmZi1AR1NUX0FQSV9WRVJTSU9OQCBcCisJLWxnc3RhdWRpby1AR1NUX0FQSV9WRVJTSU9OQCBcCisJLWxnc3R0YWctQEdTVF9BUElfVkVSU0lPTkAgXAorCS1sZ3N0cGJ1dGlscy1AR1NUX0FQSV9WRVJTSU9OQCBcCisJJChHU1RfQkFTRV9MSUJTKSBcCisJJChHU1RfTElCUykgXAorCSQoTElCTSkKK2xpYmdzdHdhdnBhcnNlX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3R3YXZwYXJzZS5oCmRpZmYgLS1naXQgYS9nc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYyBiL2dzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MTcwMWYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYwpAQCAtMCwwICsxLDI5NjkgQEAKKy8qIC0qLSBNb2RlOiBDOyB0YWItd2lkdGg6IDI7IGluZGVudC10YWJzLW1vZGU6IHQ7IGMtYmFzaWMtb2Zmc2V0OiAyIC0qLSAqLworLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gTm9raWEgQ29ycG9yYXRpb24sIFN0ZWZhbiBLb3N0IDxzdGVmYW4ua29zdEBub2tpYS5jb20+LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXdhdnBhcnNlCisgKgorICogUGFyc2UgYSAud2F2IGZpbGUgaW50byByYXcgb3IgY29tcHJlc3NlZCBhdWRpby4KKyAqCisgKiBXYXZwYXJzZSBzdXBwb3J0cyBib3RoIHB1c2ggYW5kIHB1bGwgbW9kZSBvcGVyYXRpb25zLCBtYWtpbmcgaXQgcG9zc2libGUgdG8KKyAqIHN0cmVhbSBmcm9tIGEgbmV0d29yayBzb3VyY2UuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGZpbGVzcmMgbG9jYXRpb249c2luZS53YXYgISB3YXZwYXJzZSAhIGF1ZGlvY29udmVydCAhIGFsc2FzaW5rCisgKiBdfCBSZWFkIGEgd2F2IGZpbGUgYW5kIG91dHB1dCB0byB0aGUgc291bmRjYXJkIHVzaW5nIHRoZSBBTFNBIGVsZW1lbnQuIFRoZQorICogd2F2IGZpbGUgaXMgYXNzdW1lZCB0byBjb250YWluIHJhdyB1bmNvbXByZXNzZWQgc2FtcGxlcy4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBnbm9tZXZmc3NyYyBsb2NhdGlvbj1odHRwOi8vd3d3LmV4YW1wbGUub3JnL3NpbmUud2F2ICEgcXVldWUgISB3YXZwYXJzZSAhIGF1ZGlvY29udmVydCAhIGFsc2FzaW5rCisgKiBdfCBTdHJlYW0gZGF0YSBmcm9tIGEgbmV0d29yayB1cmwuCisgKiA8L3JlZnNlY3QyPgorICovCisKKy8qCisgKiBUT0RPOgorICogaHR0cDovL3JlcGxheWdhaW4uaHlkcm9nZW5hdWRpby5vcmcvZmlsZV9mb3JtYXRfd2F2Lmh0bWwKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJnc3R3YXZwYXJzZS5oIgorI2luY2x1ZGUgImdzdC9yaWZmL3JpZmYtbWVkaWEuaCIKKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3R0eXBlZmluZGhlbHBlci5oPgorI2luY2x1ZGUgPGdzdC9wYnV0aWxzL2Rlc2NyaXB0aW9ucy5oPgorI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAod2F2cGFyc2VfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHdhdnBhcnNlX2RlYnVnKQorCisvKiBEYXRhIHNpemUgY2h1bmsgb2YgUkY2NCwKKyAqIHNlZSBodHRwOi8vdGVjaC5lYnUuY2gvZG9jcy90ZWNoL3RlY2gzMzA2LTIwMDkucGRmICovCisjZGVmaW5lIEdTVF9SUzY0X1RBR19EUzY0IEdTVF9NQUtFX0ZPVVJDQyAoJ2QnLCdzJywnNicsJzQnKQorCitzdGF0aWMgdm9pZCBnc3Rfd2F2cGFyc2VfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfd2F2cGFyc2Vfc2lua19hY3RpdmF0ZSAoR3N0UGFkICogc2lua3BhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF93YXZwYXJzZV9zaW5rX2FjdGl2YXRlX21vZGUgKEdzdFBhZCAqIHNpbmtwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RQYWRNb2RlIG1vZGUsIGdib29sZWFuIGFjdGl2ZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3dhdnBhcnNlX3NlbmRfZXZlbnQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF93YXZwYXJzZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3dhdnBhcnNlX3BhZF9xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0UXVlcnkgKiBxdWVyeSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3dhdnBhcnNlX3BhZF9jb252ZXJ0IChHc3RQYWQgKiBwYWQsIEdzdEZvcm1hdCBzcmNfZm9ybWF0LAorICAgIGdpbnQ2NCBzcmNfdmFsdWUsIEdzdEZvcm1hdCAqIGRlc3RfZm9ybWF0LCBnaW50NjQgKiBkZXN0X3ZhbHVlKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3dhdnBhcnNlX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWYpOworc3RhdGljIGdib29sZWFuIGdzdF93YXZwYXJzZV9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyB2b2lkIGdzdF93YXZwYXJzZV9sb29wIChHc3RQYWQgKiBwYWQpOworc3RhdGljIGdib29sZWFuIGdzdF93YXZwYXJzZV9zcmNwYWRfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCitzdGF0aWMgdm9pZCBnc3Rfd2F2cGFyc2Vfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3dhdnBhcnNlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworI2RlZmluZSBERUZBVUxUX0lHTk9SRV9MRU5HVEggRkFMU0UKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfSUdOT1JFX0xFTkdUSCwKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlX2ZhY3RvcnkgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC13YXYiKQorICAgICk7CisKKyNkZWZpbmUgREVCVUdfSU5JVCBcCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUICh3YXZwYXJzZV9kZWJ1ZywgIndhdnBhcnNlIiwgMCwgIldBViBwYXJzZXIiKTsKKworI2RlZmluZSBnc3Rfd2F2cGFyc2VfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdFdhdlBhcnNlLCBnc3Rfd2F2cGFyc2UsIEdTVF9UWVBFX0VMRU1FTlQsCisgICAgREVCVUdfSU5JVCk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qIE9mZnNldCBTaXplICAgIERlc2NyaXB0aW9uICAgVmFsdWUKKyAgICogMHgwMCAgIDQgICAgICAgSUQgICAgICAgICAgICB1bmlxdWUgaWRlbnRpZmljYXRpb24gdmFsdWUKKyAgICogMHgwNCAgIDQgICAgICAgUG9zaXRpb24gICAgICBwbGF5IG9yZGVyIHBvc2l0aW9uCisgICAqIDB4MDggICA0ICAgICAgIERhdGEgQ2h1bmsgSUQgUklGRiBJRCBvZiBjb3JyZXNwb25kaW5nIGRhdGEgY2h1bmsKKyAgICogMHgwYyAgIDQgICAgICAgQ2h1bmsgU3RhcnQgICBCeXRlIE9mZnNldCBvZiBEYXRhIENodW5rICoKKyAgICogMHgxMCAgIDQgICAgICAgQmxvY2sgU3RhcnQgICBCeXRlIE9mZnNldCB0byBzYW1wbGUgb2YgRmlyc3QgQ2hhbm5lbAorICAgKiAweDE0ICAgNCAgICAgICBTYW1wbGUgT2Zmc2V0IEJ5dGUgT2Zmc2V0IHRvIHNhbXBsZSBieXRlIG9mIEZpcnN0IENoYW5uZWwKKyAgICovCisgIGd1aW50MzIgaWQ7CisgIGd1aW50MzIgcG9zaXRpb247CisgIGd1aW50MzIgZGF0YV9jaHVua19pZDsKKyAgZ3VpbnQzMiBjaHVua19zdGFydDsKKyAgZ3VpbnQzMiBibG9ja19zdGFydDsKKyAgZ3VpbnQzMiBzYW1wbGVfb2Zmc2V0OworfSBHc3RXYXZQYXJzZUN1ZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogT2Zmc2V0IFNpemUgICAgRGVzY3JpcHRpb24gICAgIFZhbHVlCisgICAqIDB4MDggICA0ICAgICAgIEN1ZSBQb2ludCBJRCAgICAwIC0gMHhGRkZGRkZGRgorICAgKiAweDBjICAgICAgICAgICBUZXh0CisgICAqLworICBndWludDMyIGN1ZV9wb2ludF9pZDsKKyAgZ2NoYXIgKnRleHQ7Cit9IEdzdFdhdlBhcnNlTGFibCwgR3N0V2F2UGFyc2VOb3RlOworCitzdGF0aWMgdm9pZAorZ3N0X3dhdnBhcnNlX2NsYXNzX2luaXQgKEdzdFdhdlBhcnNlQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzczsKKyAgR3N0UGFkVGVtcGxhdGUgKnNyY190ZW1wbGF0ZTsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKworICBwYXJlbnRfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKGtsYXNzKTsKKworICBvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3Rfd2F2cGFyc2VfZGlzcG9zZTsKKworICBvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF93YXZwYXJzZV9zZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3dhdnBhcnNlX2dldF9wcm9wZXJ0eTsKKworICAvKioKKyAgICogR3N0V2F2UGFyc2U6aWdub3JlLWxlbmd0aDoKKyAgICoKKyAgICogVGhpcyBzZWxlY3RzIHdoZXRoZXIgdGhlIGxlbmd0aCBmb3VuZCBpbiBhIGRhdGEgY2h1bmsKKyAgICogc2hvdWxkIGJlIGlnbm9yZWQuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc3RyZWFtZWQgYXVkaW8KKyAgICogd2hlcmUgdGhlIGxlbmd0aCBpcyB1bmtub3duIHVudGlsIHRoZSBlbmQgb2Ygc3RyZWFtaW5nLAorICAgKiBhbmQgdmFyaW91cyBzb2Z0d2FyZS9oYXJkd2FyZSBqdXN0IHB1dHMgc29tZSByYW5kb20gdmFsdWUKKyAgICogaW4gdGhlcmUgYW5kIGhvcGVzIGl0IGRvZXNuJ3QgYnJlYWsgdG9vIG11Y2guCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChvYmplY3RfY2xhc3MsIFBST1BfSUdOT1JFX0xFTkdUSCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiaWdub3JlLWxlbmd0aCIsCisgICAgICAgICAgIklnbm9yZSBsZW5ndGgiLAorICAgICAgICAgICJJZ25vcmUgbGVuZ3RoIGZyb20gdGhlIFdhdmUgaGVhZGVyIiwKKyAgICAgICAgICBERUZBVUxUX0lHTk9SRV9MRU5HVEgsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykKKyAgICAgICk7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3dhdnBhcnNlX2NoYW5nZV9zdGF0ZTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+c2VuZF9ldmVudCA9IGdzdF93YXZwYXJzZV9zZW5kX2V2ZW50OworCisgIC8qIHJlZ2lzdGVyIHBhZHMgKi8KKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmc2lua190ZW1wbGF0ZV9mYWN0b3J5KTsKKworICBzcmNfdGVtcGxhdGUgPSBnc3RfcGFkX3RlbXBsYXRlX25ldyAoInNyYyIsIEdTVF9QQURfU1JDLAorICAgICAgR1NUX1BBRF9BTFdBWVMsIGdzdF9yaWZmX2NyZWF0ZV9hdWRpb190ZW1wbGF0ZV9jYXBzICgpKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiV0FWIGF1ZGlvIGRlbXV4ZXIiLAorICAgICAgIkNvZGVjL0RlbXV4ZXIvQXVkaW8iLAorICAgICAgIlBhcnNlIGEgLndhdiBmaWxlIGludG8gcmF3IGF1ZGlvIiwKKyAgICAgICJFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3dhdnBhcnNlX25vdGVzX2ZyZWUgKEdzdFdhdlBhcnNlTm90ZSAqIG5vdGUpCit7CisgIGlmIChub3RlKQorICAgIGdfZnJlZSAobm90ZS0+dGV4dCk7CisgIGdfZnJlZSAobm90ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFyc2VfbGFibHNfZnJlZSAoR3N0V2F2UGFyc2VMYWJsICogbGFibCkKK3sKKyAgaWYgKGxhYmwpCisgICAgZ19mcmVlIChsYWJsLT50ZXh0KTsKKyAgZ19mcmVlIChsYWJsKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZwYXJzZV9yZXNldCAoR3N0V2F2UGFyc2UgKiB3YXYpCit7CisgIHdhdi0+c3RhdGUgPSBHU1RfV0FWUEFSU0VfU1RBUlQ7CisKKyAgLyogVGhlc2Ugd2lsbCBhbGwgYmUgc2V0IGNvcnJlY3RseSBpbiB0aGUgZm10IGNodW5rICovCisgIHdhdi0+ZGVwdGggPSAwOworICB3YXYtPnJhdGUgPSAwOworICB3YXYtPndpZHRoID0gMDsKKyAgd2F2LT5jaGFubmVscyA9IDA7CisgIHdhdi0+YmxvY2thbGlnbiA9IDA7CisgIHdhdi0+YnBzID0gMDsKKyAgd2F2LT5mYWN0ID0gMDsKKyAgd2F2LT5vZmZzZXQgPSAwOworICB3YXYtPmVuZF9vZmZzZXQgPSAwOworICB3YXYtPmRhdGFsZWZ0ID0gMDsKKyAgd2F2LT5kYXRhc2l6ZSA9IDA7CisgIHdhdi0+ZGF0YXN0YXJ0ID0gMDsKKyAgd2F2LT5jaHVua19zaXplID0gMDsKKyAgd2F2LT5kdXJhdGlvbiA9IDA7CisgIHdhdi0+Z290X2ZtdCA9IEZBTFNFOworICB3YXYtPmZpcnN0ID0gVFJVRTsKKworICBpZiAod2F2LT5zZWVrX2V2ZW50KQorICAgIGdzdF9ldmVudF91bnJlZiAod2F2LT5zZWVrX2V2ZW50KTsKKyAgd2F2LT5zZWVrX2V2ZW50ID0gTlVMTDsKKyAgaWYgKHdhdi0+YWRhcHRlcikgeworICAgIGdzdF9hZGFwdGVyX2NsZWFyICh3YXYtPmFkYXB0ZXIpOworICAgIGdfb2JqZWN0X3VucmVmICh3YXYtPmFkYXB0ZXIpOworICAgIHdhdi0+YWRhcHRlciA9IE5VTEw7CisgIH0KKyAgaWYgKHdhdi0+dGFncykKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHdhdi0+dGFncyk7CisgIHdhdi0+dGFncyA9IE5VTEw7CisgIGlmICh3YXYtPnRvYykKKyAgICBnc3RfdG9jX3VucmVmICh3YXYtPnRvYyk7CisgIHdhdi0+dG9jID0gTlVMTDsKKyAgaWYgKHdhdi0+Y3VlcykKKyAgICBnX2xpc3RfZnJlZV9mdWxsICh3YXYtPmN1ZXMsIGdfZnJlZSk7CisgIHdhdi0+Y3VlcyA9IE5VTEw7CisgIGlmICh3YXYtPmxhYmxzKQorICAgIGdfbGlzdF9mcmVlX2Z1bGwgKHdhdi0+bGFibHMsIChHRGVzdHJveU5vdGlmeSkgZ3N0X3dhdnBhcnNlX2xhYmxzX2ZyZWUpOworICB3YXYtPmxhYmxzID0gTlVMTDsKKyAgaWYgKHdhdi0+bm90ZXMpCisgICAgZ19saXN0X2ZyZWVfZnVsbCAod2F2LT5ub3RlcywgKEdEZXN0cm95Tm90aWZ5KSBnc3Rfd2F2cGFyc2Vfbm90ZXNfZnJlZSk7CisgIHdhdi0+bm90ZXMgPSBOVUxMOworICBpZiAod2F2LT5jYXBzKQorICAgIGdzdF9jYXBzX3VucmVmICh3YXYtPmNhcHMpOworICB3YXYtPmNhcHMgPSBOVUxMOworICBpZiAod2F2LT5zdGFydF9zZWdtZW50KQorICAgIGdzdF9ldmVudF91bnJlZiAod2F2LT5zdGFydF9zZWdtZW50KTsKKyAgd2F2LT5zdGFydF9zZWdtZW50ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZwYXJzZV9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RXYXZQYXJzZSAqd2F2ID0gR1NUX1dBVlBBUlNFIChvYmplY3QpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgIldBVjogRGlzcG9zZSIpOworICBnc3Rfd2F2cGFyc2VfcmVzZXQgKHdhdik7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFyc2VfaW5pdCAoR3N0V2F2UGFyc2UgKiB3YXZwYXJzZSkKK3sKKyAgZ3N0X3dhdnBhcnNlX3Jlc2V0ICh3YXZwYXJzZSk7CisKKyAgLyogc2luayAqLworICB3YXZwYXJzZS0+c2lua3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNpbmtfdGVtcGxhdGVfZmFjdG9yeSwgInNpbmsiKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZhdGVfZnVuY3Rpb24gKHdhdnBhcnNlLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXZwYXJzZV9zaW5rX2FjdGl2YXRlKSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2YXRlbW9kZV9mdW5jdGlvbiAod2F2cGFyc2UtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3dhdnBhcnNlX3NpbmtfYWN0aXZhdGVfbW9kZSkpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAod2F2cGFyc2UtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3dhdnBhcnNlX2NoYWluKSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uICh3YXZwYXJzZS0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2cGFyc2Vfc2lua19ldmVudCkpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVF9DQVNUICh3YXZwYXJzZSksIHdhdnBhcnNlLT5zaW5rcGFkKTsKKworICAvKiBzcmMgKi8KKyAgd2F2cGFyc2UtPnNyY3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlCisgICAgICAoR1NUX0VMRU1FTlRfR0VUX0NMQVNTICh3YXZwYXJzZSksICJzcmMiKSwgInNyYyIpOworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzICh3YXZwYXJzZS0+c3JjcGFkKTsKKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKHdhdnBhcnNlLT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3dhdnBhcnNlX3BhZF9xdWVyeSkpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAod2F2cGFyc2UtPnNyY3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2cGFyc2Vfc3JjcGFkX2V2ZW50KSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHdhdnBhcnNlKSwgd2F2cGFyc2UtPnNyY3BhZCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhcnNlX3BhcnNlX2ZpbGVfaGVhZGVyIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0QnVmZmVyICogYnVmKQoreworICBndWludDMyIGRvY3R5cGU7CisKKyAgaWYgKCFnc3RfcmlmZl9wYXJzZV9maWxlX2hlYWRlciAoZWxlbWVudCwgYnVmLCAmZG9jdHlwZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChkb2N0eXBlICE9IEdTVF9SSUZGX1JJRkZfV0FWRSkKKyAgICBnb3RvIG5vdF93YXY7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub3Rfd2F2OgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGVsZW1lbnQsIFNUUkVBTSwgV1JPTkdfVFlQRSwgKE5VTEwpLAorICAgICAgICAoIkZpbGUgaXMgbm90IGEgV0FWRSBmaWxlOiAweCUiIEdfR0lOVDMyX01PRElGSUVSICJ4IiwgZG9jdHlwZSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3dhdnBhcnNlX3N0cmVhbV9pbml0IChHc3RXYXZQYXJzZSAqIHdhdikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXM7CisgIEdzdEJ1ZmZlciAqYnVmID0gTlVMTDsKKworICBpZiAoKHJlcyA9IGdzdF9wYWRfcHVsbF9yYW5nZSAod2F2LT5zaW5rcGFkLAorICAgICAgICAgICAgICB3YXYtPm9mZnNldCwgMTIsICZidWYpKSAhPSBHU1RfRkxPV19PSykKKyAgICByZXR1cm4gcmVzOworICBlbHNlIGlmICghZ3N0X3dhdnBhcnNlX3BhcnNlX2ZpbGVfaGVhZGVyIChHU1RfRUxFTUVOVF9DQVNUICh3YXYpLCBidWYpKQorICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKworICB3YXYtPm9mZnNldCArPSAxMjsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhcnNlX3RpbWVfdG9fYnl0ZXBvcyAoR3N0V2F2UGFyc2UgKiB3YXYsIGdpbnQ2NCB0cywgZ2ludDY0ICogYnl0ZXBvcykKK3sKKyAgLyogLTEgYWx3YXlzIG1hcHMgdG8gLTEgKi8KKyAgaWYgKHRzID09IC0xKSB7CisgICAgKmJ5dGVwb3MgPSAtMTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIC8qIDAgYWx3YXlzIG1hcHMgdG8gMCAqLworICBpZiAodHMgPT0gMCkgeworICAgICpieXRlcG9zID0gMDsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGlmICh3YXYtPmJwcyA+IDApIHsKKyAgICAqYnl0ZXBvcyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9jZWlsICh0cywgKGd1aW50NjQpIHdhdi0+YnBzLCBHU1RfU0VDT05EKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfSBlbHNlIGlmICh3YXYtPmZhY3QpIHsKKyAgICBndWludDY0IGJwcyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAod2F2LT5kYXRhc2l6ZSwgd2F2LT5yYXRlLCB3YXYtPmZhY3QpOworICAgICpieXRlcG9zID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2NlaWwgKHRzLCBicHMsIEdTVF9TRUNPTkQpOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGVyZm9ybSBzZWVrcyBvbiB0aGUgZWxlbWVudC4KKyAqCisgKiBJdCBhbHNvIHdvcmtzIHdoZW4gZXZlbnQgaXMgTlVMTCwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIGp1c3QKKyAqIHN0YXJ0IGZyb20gdGhlIGxhc3QgY29uZmlndXJlZCBzZWdtZW50LiBUaGlzIHRlY2huaXF1ZSBpcworICogdXNlZCB3aGVuIGFjdGl2YXRpbmcgdGhlIGVsZW1lbnQgYW5kIHRvIHBlcmZvcm0gdGhlIHNlZWsgaW4KKyAqIFJFQURZLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYXJzZV9wZXJmb3JtX3NlZWsgKEdzdFdhdlBhcnNlICogd2F2LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBnYm9vbGVhbiByZXM7CisgIGdkb3VibGUgcmF0ZTsKKyAgR3N0Rm9ybWF0IGZvcm1hdCwgYmZvcm1hdDsKKyAgR3N0U2Vla0ZsYWdzIGZsYWdzOworICBHc3RTZWVrVHlwZSBjdXJfdHlwZSA9IEdTVF9TRUVLX1RZUEVfTk9ORSwgc3RvcF90eXBlOworICBnaW50NjQgY3VyLCBzdG9wLCB1cHN0cmVhbV9zaXplOworICBnYm9vbGVhbiBmbHVzaDsKKyAgZ2Jvb2xlYW4gdXBkYXRlOworICBHc3RTZWdtZW50IHNlZWtzZWdtZW50ID0geyAwLCB9OworICBnaW50NjQgbGFzdF9zdG9wOworICBndWludDMyIHNlcW51bSA9IDA7CisKKyAgaWYgKGV2ZW50KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiZG9pbmcgc2VlayB3aXRoIGV2ZW50Iik7CisKKyAgICBnc3RfZXZlbnRfcGFyc2Vfc2VlayAoZXZlbnQsICZyYXRlLCAmZm9ybWF0LCAmZmxhZ3MsCisgICAgICAgICZjdXJfdHlwZSwgJmN1ciwgJnN0b3BfdHlwZSwgJnN0b3ApOworICAgIHNlcW51bSA9IGdzdF9ldmVudF9nZXRfc2VxbnVtIChldmVudCk7CisKKyAgICAvKiBubyBuZWdhdGl2ZSByYXRlcyB5ZXQgKi8KKyAgICBpZiAocmF0ZSA8IDAuMCkKKyAgICAgIGdvdG8gbmVnYXRpdmVfcmF0ZTsKKworICAgIGlmIChmb3JtYXQgIT0gd2F2LT5zZWdtZW50LmZvcm1hdCkgeworICAgICAgR1NUX0lORk9fT0JKRUNUICh3YXYsICJjb252ZXJ0aW5nIHNlZWstZXZlbnQgZnJvbSAlcyB0byAlcyIsCisgICAgICAgICAgZ3N0X2Zvcm1hdF9nZXRfbmFtZSAoZm9ybWF0KSwKKyAgICAgICAgICBnc3RfZm9ybWF0X2dldF9uYW1lICh3YXYtPnNlZ21lbnQuZm9ybWF0KSk7CisgICAgICByZXMgPSBUUlVFOworICAgICAgaWYgKGN1cl90eXBlICE9IEdTVF9TRUVLX1RZUEVfTk9ORSkKKyAgICAgICAgcmVzID0KKyAgICAgICAgICAgIGdzdF9wYWRfcXVlcnlfY29udmVydCAod2F2LT5zcmNwYWQsIGZvcm1hdCwgY3VyLAorICAgICAgICAgICAgd2F2LT5zZWdtZW50LmZvcm1hdCwgJmN1cik7CisgICAgICBpZiAocmVzICYmIHN0b3BfdHlwZSAhPSBHU1RfU0VFS19UWVBFX05PTkUpCisgICAgICAgIHJlcyA9CisgICAgICAgICAgICBnc3RfcGFkX3F1ZXJ5X2NvbnZlcnQgKHdhdi0+c3JjcGFkLCBmb3JtYXQsIHN0b3AsCisgICAgICAgICAgICB3YXYtPnNlZ21lbnQuZm9ybWF0LCAmc3RvcCk7CisgICAgICBpZiAoIXJlcykKKyAgICAgICAgZ290byBub19mb3JtYXQ7CisKKyAgICAgIGZvcm1hdCA9IHdhdi0+c2VnbWVudC5mb3JtYXQ7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgImRvaW5nIHNlZWsgd2l0aG91dCBldmVudCIpOworICAgIGZsYWdzID0gMDsKKyAgICByYXRlID0gMS4wOworICAgIGN1cl90eXBlID0gR1NUX1NFRUtfVFlQRV9TRVQ7CisgICAgc3RvcF90eXBlID0gR1NUX1NFRUtfVFlQRV9TRVQ7CisgIH0KKworICAvKiBpbiBwdXNoIG1vZGUsIHdlIG11c3QgZGVsZWdhdGUgdG8gdXBzdHJlYW0gKi8KKyAgaWYgKHdhdi0+c3RyZWFtaW5nKSB7CisgICAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgICAvKiBpZiBzdHJlYW1pbmcgbm90IHlldCBzdGFydGVkOyBvbmx5IHByZXBhcmUgaW5pdGlhbCBuZXdzZWdtZW50ICovCisgICAgaWYgKCFldmVudCB8fCB3YXYtPnN0YXRlICE9IEdTVF9XQVZQQVJTRV9EQVRBKSB7CisgICAgICBpZiAod2F2LT5zdGFydF9zZWdtZW50KQorICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKHdhdi0+c3RhcnRfc2VnbWVudCk7CisgICAgICB3YXYtPnN0YXJ0X3NlZ21lbnQgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZ3YXYtPnNlZ21lbnQpOworICAgICAgcmVzID0gVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgLyogY29udmVydCBzZWVrIHBvc2l0aW9ucyB0byBieXRlIHBvc2l0aW9ucyBpbiBkYXRhIHNlY3Rpb25zICovCisgICAgICBpZiAoZm9ybWF0ID09IEdTVF9GT1JNQVRfVElNRSkgeworICAgICAgICAvKiBzaG91bGQgbm90IGZhaWwgKi8KKyAgICAgICAgaWYgKCFnc3Rfd2F2cGFyc2VfdGltZV90b19ieXRlcG9zICh3YXYsIGN1ciwgJmN1cikpCisgICAgICAgICAgZ290byBub19wb3NpdGlvbjsKKyAgICAgICAgaWYgKCFnc3Rfd2F2cGFyc2VfdGltZV90b19ieXRlcG9zICh3YXYsIHN0b3AsICZzdG9wKSkKKyAgICAgICAgICBnb3RvIG5vX3Bvc2l0aW9uOworICAgICAgfQorICAgICAgLyogbWluZCBzYW1wbGUgYm91bmRhcnkgYW5kIGhlYWRlciAqLworICAgICAgaWYgKGN1ciA+PSAwKSB7CisgICAgICAgIGN1ciAtPSAoY3VyICUgd2F2LT5ieXRlc19wZXJfc2FtcGxlKTsKKyAgICAgICAgY3VyICs9IHdhdi0+ZGF0YXN0YXJ0OworICAgICAgfQorICAgICAgaWYgKHN0b3AgPj0gMCkgeworICAgICAgICBzdG9wIC09IChzdG9wICUgd2F2LT5ieXRlc19wZXJfc2FtcGxlKTsKKyAgICAgICAgc3RvcCArPSB3YXYtPmRhdGFzdGFydDsKKyAgICAgIH0KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgIlB1c2hpbmcgQllURSBzZWVrIHJhdGUgJWcsICIKKyAgICAgICAgICAic3RhcnQgJSIgR19HSU5UNjRfRk9STUFUICIsIHN0b3AgJSIgR19HSU5UNjRfRk9STUFULCByYXRlLCBjdXIsCisgICAgICAgICAgc3RvcCk7CisgICAgICAvKiBCWVRFIHNlZWsgZXZlbnQgKi8KKyAgICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWVrIChyYXRlLCBHU1RfRk9STUFUX0JZVEVTLCBmbGFncywgY3VyX3R5cGUsIGN1ciwKKyAgICAgICAgICBzdG9wX3R5cGUsIHN0b3ApOworICAgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGV2ZW50LCBzZXFudW0pOworICAgICAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50ICh3YXYtPnNpbmtwYWQsIGV2ZW50KTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKKyAgfQorCisgIC8qIGdldCBmbHVzaCBmbGFnICovCisgIGZsdXNoID0gZmxhZ3MgJiBHU1RfU0VFS19GTEFHX0ZMVVNIOworCisgIC8qIG5vdyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgc3RyZWFtaW5nIHRocmVhZCBpcyBzdG9wcGVkLiBXZSBkbyB0aGlzIGJ5CisgICAqIGVpdGhlciBzZW5kaW5nIGEgRkxVU0hfU1RBUlQgZXZlbnQgZG93bnN0cmVhbSB3aGljaCB3aWxsIGNhdXNlIHRoZQorICAgKiBzdHJlYW1pbmcgdGhyZWFkIHRvIHN0b3Agd2l0aCBhIFdST05HX1NUQVRFLgorICAgKiBGb3IgYSBub24tZmx1c2hpbmcgc2VlayB3ZSBzaW1wbHkgcGF1c2UgdGhlIHRhc2ssIHdoaWNoIHdpbGwgaGFwcGVuIGFzIHNvb24KKyAgICogYXMgaXQgY29tcGxldGVzIG9uZSBpdGVyYXRpb24gKGFuZCB0aHVzIG1pZ2h0IGJsb2NrIHdoZW4gdGhlIHNpbmsgaXMKKyAgICogYmxvY2tpbmcgaW4gcHJlcm9sbCkuICovCisgIGlmIChmbHVzaCkgeworICAgIEdzdEV2ZW50ICpmZXZlbnQ7CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAic2VuZGluZyBmbHVzaCBzdGFydCIpOworCisgICAgZmV2ZW50ID0gZ3N0X2V2ZW50X25ld19mbHVzaF9zdGFydCAoKTsKKyAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZmV2ZW50LCBzZXFudW0pOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAod2F2LT5zaW5rcGFkLCBnc3RfZXZlbnRfcmVmIChmZXZlbnQpKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHdhdi0+c3JjcGFkLCBmZXZlbnQpOworICB9IGVsc2UgeworICAgIGdzdF9wYWRfcGF1c2VfdGFzayAod2F2LT5zaW5rcGFkKTsKKyAgfQorCisgIC8qIHdlIHNob3VsZCBub3cgYmUgYWJsZSB0byBncmFiIHRoZSBzdHJlYW1pbmcgdGhyZWFkIGJlY2F1c2Ugd2Ugc3RvcHBlZCBpdAorICAgKiB3aXRoIHRoZSBhYm92ZSBmbHVzaC9wYXVzZSBjb2RlICovCisgIEdTVF9QQURfU1RSRUFNX0xPQ0sgKHdhdi0+c2lua3BhZCk7CisKKyAgLyogc2F2ZSBjdXJyZW50IHBvc2l0aW9uICovCisgIGxhc3Rfc3RvcCA9IHdhdi0+c2VnbWVudC5wb3NpdGlvbjsKKworICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJzdG9wcGVkIHN0cmVhbWluZyBhdCAlIiBHX0dJTlQ2NF9GT1JNQVQsIGxhc3Rfc3RvcCk7CisKKyAgLyogY29weSBzZWdtZW50LCB3ZSBuZWVkIHRoaXMgYmVjYXVzZSB3ZSBzdGlsbCBuZWVkIHRoZSBvbGQKKyAgICogc2VnbWVudCB3aGVuIHdlIGNsb3NlIHRoZSBjdXJyZW50IHNlZ21lbnQuICovCisgIG1lbWNweSAoJnNlZWtzZWdtZW50LCAmd2F2LT5zZWdtZW50LCBzaXplb2YgKEdzdFNlZ21lbnQpKTsKKworICAvKiBjb25maWd1cmUgdGhlIHNlZWsgcGFyYW1ldGVycyBpbiB0aGUgc2Vla3NlZ21lbnQuIFdlIHdpbGwgdGhlbiBoYXZlIHRoZQorICAgKiByaWdodCB2YWx1ZXMgaW4gdGhlIHNlZ21lbnQgdG8gcGVyZm9ybSB0aGUgc2VlayAqLworICBpZiAoZXZlbnQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJjb25maWd1cmluZyBzZWVrIik7CisgICAgZ3N0X3NlZ21lbnRfZG9fc2VlayAoJnNlZWtzZWdtZW50LCByYXRlLCBmb3JtYXQsIGZsYWdzLAorICAgICAgICBjdXJfdHlwZSwgY3VyLCBzdG9wX3R5cGUsIHN0b3AsICZ1cGRhdGUpOworICB9CisKKyAgLyogZmlndXJlIG91dCB0aGUgbGFzdCBwb3NpdGlvbiB3ZSBuZWVkIHRvIHBsYXkuIElmIGl0J3MgY29uZmlndXJlZCAoc3RvcCAhPQorICAgKiAtMSksIHVzZSB0aGF0LCBlbHNlIHdlIHBsYXkgdW50aWwgdGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBmaWxlICovCisgIGlmICgoc3RvcCA9IHNlZWtzZWdtZW50LnN0b3ApID09IC0xKQorICAgIHN0b3AgPSBzZWVrc2VnbWVudC5kdXJhdGlvbjsKKworICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJjdXJfdHlwZSA9JWQiLCBjdXJfdHlwZSk7CisgIGlmICgoY3VyX3R5cGUgIT0gR1NUX1NFRUtfVFlQRV9OT05FKSkgeworICAgIC8qIGJyaW5nIG9mZnNldCB0byBieXRlcywgaWYgdGhlIGJwcyBpcyAwLCB3ZSBoYXZlIHRoZSBzZWdtZW50IGluIEJZVEVTIGFuZAorICAgICAqIHdlIGNhbiBqdXN0IGNvcHkgdGhlIGxhc3Rfc3RvcC4gSWYgbm90LCB3ZSB1c2UgdGhlIGJwcyB0byBjb252ZXJ0IFRJTUUgdG8KKyAgICAgKiBieXRlcy4gKi8KKyAgICBpZiAoIWdzdF93YXZwYXJzZV90aW1lX3RvX2J5dGVwb3MgKHdhdiwgc2Vla3NlZ21lbnQucG9zaXRpb24sCisgICAgICAgICAgICAoZ2ludDY0ICopICYgd2F2LT5vZmZzZXQpKQorICAgICAgd2F2LT5vZmZzZXQgPSBzZWVrc2VnbWVudC5wb3NpdGlvbjsKKyAgICBHU1RfTE9HX09CSkVDVCAod2F2LCAib2Zmc2V0PSUiIEdfR1VJTlQ2NF9GT1JNQVQsIHdhdi0+b2Zmc2V0KTsKKyAgICB3YXYtPm9mZnNldCAtPSAod2F2LT5vZmZzZXQgJSB3YXYtPmJ5dGVzX3Blcl9zYW1wbGUpOworICAgIEdTVF9MT0dfT0JKRUNUICh3YXYsICJvZmZzZXQ9JSIgR19HVUlOVDY0X0ZPUk1BVCwgd2F2LT5vZmZzZXQpOworICAgIHdhdi0+b2Zmc2V0ICs9IHdhdi0+ZGF0YXN0YXJ0OworICAgIEdTVF9MT0dfT0JKRUNUICh3YXYsICJvZmZzZXQ9JSIgR19HVUlOVDY0X0ZPUk1BVCwgd2F2LT5vZmZzZXQpOworICB9IGVsc2UgeworICAgIEdTVF9MT0dfT0JKRUNUICh3YXYsICJjb250aW51ZSBmcm9tIG9mZnNldD0lIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICB3YXYtPm9mZnNldCk7CisgIH0KKworICBpZiAoc3RvcF90eXBlICE9IEdTVF9TRUVLX1RZUEVfTk9ORSkgeworICAgIGlmICghZ3N0X3dhdnBhcnNlX3RpbWVfdG9fYnl0ZXBvcyAod2F2LCBzdG9wLCAoZ2ludDY0ICopICYgd2F2LT5lbmRfb2Zmc2V0KSkKKyAgICAgIHdhdi0+ZW5kX29mZnNldCA9IHN0b3A7CisgICAgR1NUX0xPR19PQkpFQ1QgKHdhdiwgImVuZF9vZmZzZXQ9JSIgR19HVUlOVDY0X0ZPUk1BVCwgd2F2LT5lbmRfb2Zmc2V0KTsKKyAgICB3YXYtPmVuZF9vZmZzZXQgLT0gKHdhdi0+ZW5kX29mZnNldCAlIHdhdi0+Ynl0ZXNfcGVyX3NhbXBsZSk7CisgICAgR1NUX0xPR19PQkpFQ1QgKHdhdiwgImVuZF9vZmZzZXQ9JSIgR19HVUlOVDY0X0ZPUk1BVCwgd2F2LT5lbmRfb2Zmc2V0KTsKKyAgICB3YXYtPmVuZF9vZmZzZXQgKz0gd2F2LT5kYXRhc3RhcnQ7CisgICAgR1NUX0xPR19PQkpFQ1QgKHdhdiwgImVuZF9vZmZzZXQ9JSIgR19HVUlOVDY0X0ZPUk1BVCwgd2F2LT5lbmRfb2Zmc2V0KTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfTE9HX09CSkVDVCAod2F2LCAiY29udGludWUgdG8gZW5kX29mZnNldD0lIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICB3YXYtPmVuZF9vZmZzZXQpOworICB9CisKKyAgLyogbWFrZSBzdXJlIGZpbGVzaXplIGlzIG5vdCBleGNlZWRlZCBkdWUgdG8gcm91bmRpbmcgZXJyb3JzIG9yIHNvLAorICAgKiBzYW1lIHByZWNhdXRpb24gYXMgaW4gX3N0cmVhbV9oZWFkZXJzICovCisgIGJmb3JtYXQgPSBHU1RfRk9STUFUX0JZVEVTOworICBpZiAoZ3N0X3BhZF9wZWVyX3F1ZXJ5X2R1cmF0aW9uICh3YXYtPnNpbmtwYWQsIGJmb3JtYXQsICZ1cHN0cmVhbV9zaXplKSkKKyAgICB3YXYtPmVuZF9vZmZzZXQgPSBNSU4gKHdhdi0+ZW5kX29mZnNldCwgdXBzdHJlYW1fc2l6ZSk7CisKKyAgaWYgKHdhdi0+ZGF0YXNpemUgPiAwICYmIHdhdi0+ZW5kX29mZnNldCA+IHdhdi0+ZGF0YXN0YXJ0ICsgd2F2LT5kYXRhc2l6ZSkKKyAgICB3YXYtPmVuZF9vZmZzZXQgPSB3YXYtPmRhdGFzdGFydCArIHdhdi0+ZGF0YXNpemU7CisKKyAgLyogdGhpcyBpcyB0aGUgcmFuZ2Ugb2YgYnl0ZXMgd2Ugd2lsbCB1c2UgZm9yIHBsYXliYWNrICovCisgIHdhdi0+b2Zmc2V0ID0gTUlOICh3YXYtPm9mZnNldCwgd2F2LT5lbmRfb2Zmc2V0KTsKKyAgd2F2LT5kYXRhbGVmdCA9IHdhdi0+ZW5kX29mZnNldCAtIHdhdi0+b2Zmc2V0OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwKKyAgICAgICJzZWVrOiByYXRlICVsZiwgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgZW5kICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICIsIHNlZ21lbnQgJSIgR1NUX1RJTUVfRk9STUFUICIgLS0gJSIgR1NUX1RJTUVfRk9STUFULCByYXRlLCB3YXYtPm9mZnNldCwKKyAgICAgIHdhdi0+ZW5kX29mZnNldCwgR1NUX1RJTUVfQVJHUyAoc2Vla3NlZ21lbnQuc3RhcnQpLCBHU1RfVElNRV9BUkdTIChzdG9wKSk7CisKKyAgLyogcHJlcGFyZSBmb3Igc3RyZWFtaW5nIGFnYWluICovCisgIGlmIChmbHVzaCkgeworICAgIEdzdEV2ZW50ICpmZXZlbnQ7CisKKyAgICAvKiBpZiB3ZSBzZW50IGEgRkxVU0hfU1RBUlQsIHdlIG5vdyBzZW5kIGEgRkxVU0hfU1RPUCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgInNlbmRpbmcgZmx1c2ggc3RvcCIpOworCisgICAgZmV2ZW50ID0gZ3N0X2V2ZW50X25ld19mbHVzaF9zdG9wIChUUlVFKTsKKyAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZmV2ZW50LCBzZXFudW0pOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAod2F2LT5zaW5rcGFkLCBnc3RfZXZlbnRfcmVmIChmZXZlbnQpKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHdhdi0+c3JjcGFkLCBmZXZlbnQpOworICB9CisKKyAgLyogbm93IHdlIGRpZCB0aGUgc2VlayBhbmQgY2FuIGFjdGl2YXRlIHRoZSBuZXcgc2VnbWVudCB2YWx1ZXMgKi8KKyAgbWVtY3B5ICgmd2F2LT5zZWdtZW50LCAmc2Vla3NlZ21lbnQsIHNpemVvZiAoR3N0U2VnbWVudCkpOworCisgIC8qIGlmIHdlJ3JlIGRvaW5nIGEgc2VnbWVudCBzZWVrLCBwb3N0IGEgU0VHTUVOVF9TVEFSVCBtZXNzYWdlICovCisgIGlmICh3YXYtPnNlZ21lbnQuZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NFR01FTlQpIHsKKyAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHdhdiksCisgICAgICAgIGdzdF9tZXNzYWdlX25ld19zZWdtZW50X3N0YXJ0IChHU1RfT0JKRUNUX0NBU1QgKHdhdiksCisgICAgICAgICAgICB3YXYtPnNlZ21lbnQuZm9ybWF0LCB3YXYtPnNlZ21lbnQucG9zaXRpb24pKTsKKyAgfQorCisgIC8qIG5vdyBjcmVhdGUgdGhlIG5ld3NlZ21lbnQgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiQ3JlYXRpbmcgbmV3c2VnbWVudCBmcm9tICUiIEdfR0lOVDY0X0ZPUk1BVAorICAgICAgIiB0byAlIiBHX0dJTlQ2NF9GT1JNQVQsIHdhdi0+c2VnbWVudC5wb3NpdGlvbiwgc3RvcCk7CisKKyAgLyogc3RvcmUgdGhlIG5ld3NlZ21lbnQgZXZlbnQgc28gaXQgY2FuIGJlIHNlbnQgZnJvbSB0aGUgc3RyZWFtaW5nIHRocmVhZC4gKi8KKyAgaWYgKHdhdi0+c3RhcnRfc2VnbWVudCkKKyAgICBnc3RfZXZlbnRfdW5yZWYgKHdhdi0+c3RhcnRfc2VnbWVudCk7CisgIHdhdi0+c3RhcnRfc2VnbWVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJndhdi0+c2VnbWVudCk7CisgIGdzdF9ldmVudF9zZXRfc2VxbnVtICh3YXYtPnN0YXJ0X3NlZ21lbnQsIHNlcW51bSk7CisKKyAgLyogbWFyayBkaXNjb250IGlmIHdlIGFyZSBnb2luZyB0byBzdHJlYW0gZnJvbSBhbm90aGVyIHBvc2l0aW9uLiAqLworICBpZiAobGFzdF9zdG9wICE9IHdhdi0+c2VnbWVudC5wb3NpdGlvbikgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgIm1hcmsgRElTQ09OVCwgd2UgZGlkIGEgc2VlayB0byBhbm90aGVyIHBvc2l0aW9uIik7CisgICAgd2F2LT5kaXNjb250ID0gVFJVRTsKKyAgfQorCisgIC8qIGFuZCBzdGFydCB0aGUgc3RyZWFtaW5nIHRhc2sgYWdhaW4gKi8KKyAgaWYgKCF3YXYtPnN0cmVhbWluZykgeworICAgIGdzdF9wYWRfc3RhcnRfdGFzayAod2F2LT5zaW5rcGFkLCAoR3N0VGFza0Z1bmN0aW9uKSBnc3Rfd2F2cGFyc2VfbG9vcCwKKyAgICAgICAgd2F2LT5zaW5rcGFkLCBOVUxMKTsKKyAgfQorCisgIEdTVF9QQURfU1RSRUFNX1VOTE9DSyAod2F2LT5zaW5rcGFkKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK25lZ2F0aXZlX3JhdGU6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJuZWdhdGl2ZSBwbGF5YmFjayByYXRlcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19mb3JtYXQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJ1bnN1cHBvcnRlZCBmb3JtYXQgZ2l2ZW4sIHNlZWsgYWJvcnRlZC4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX3Bvc2l0aW9uOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LAorICAgICAgICAiQ291bGQgbm90IGRldGVybWluZSBieXRlIHBvc2l0aW9uIGZvciBkZXNpcmVkIHRpbWUiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyoKKyAqIGdzdF93YXZwYXJzZV9wZWVrX2NodW5rX2luZm86CisgKiBAd2F2IFdhdnBhcnNlIG9iamVjdAorICogQHRhZyBob2xkZXIgZm9yIHRhZworICogQHNpemUgaG9sZGVyIGZvciB0YWcgc2l6ZQorICoKKyAqIFBlZWsgbmV4dCBjaHVuayBpbmZvICh0YWcgYW5kIHNpemUpCisgKgorICogUmV0dXJuczogJVRSVUUgd2hlbiB0aGUgY2h1bmsgaW5mbyAoaGVhZGVyKSBpcyBhdmFpbGFibGUKKyAqLworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2cGFyc2VfcGVla19jaHVua19pbmZvIChHc3RXYXZQYXJzZSAqIHdhdiwgZ3VpbnQzMiAqIHRhZywgZ3VpbnQzMiAqIHNpemUpCit7CisgIGNvbnN0IGd1aW50OCAqZGF0YSA9IE5VTEw7CisKKyAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAod2F2LT5hZGFwdGVyKSA8IDgpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGRhdGEgPSBnc3RfYWRhcHRlcl9tYXAgKHdhdi0+YWRhcHRlciwgOCk7CisgICp0YWcgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEpOworICAqc2l6ZSA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDQpOworICBnc3RfYWRhcHRlcl91bm1hcCAod2F2LT5hZGFwdGVyKTsKKworICBHU1RfREVCVUcgKCJOZXh0IGNodW5rIHNpemUgaXMgJXUgYnl0ZXMsIHR5cGUgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsICpzaXplLAorICAgICAgR1NUX0ZPVVJDQ19BUkdTICgqdGFnKSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBnc3Rfd2F2cGFyc2VfcGVla19jaHVuazoKKyAqIEB3YXYgV2F2cGFyc2Ugb2JqZWN0CisgKiBAdGFnIGhvbGRlciBmb3IgdGFnCisgKiBAc2l6ZSBob2xkZXIgZm9yIHRhZyBzaXplCisgKgorICogUGVlayBlbm91Z2ggZGF0YSBmb3Igb25lIGZ1bGwgY2h1bmsKKyAqCisgKiBSZXR1cm5zOiAlVFJVRSB3aGVuIHRoZSBmdWxsIGNodW5rIGlzIGF2YWlsYWJsZQorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYXJzZV9wZWVrX2NodW5rIChHc3RXYXZQYXJzZSAqIHdhdiwgZ3VpbnQzMiAqIHRhZywgZ3VpbnQzMiAqIHNpemUpCit7CisgIGd1aW50MzIgcGVla19zaXplID0gMDsKKyAgZ3VpbnQgYXZhaWxhYmxlOworCisgIGlmICghZ3N0X3dhdnBhcnNlX3BlZWtfY2h1bmtfaW5mbyAod2F2LCB0YWcsIHNpemUpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBzaXplIDAgLT4gZW1wdHkgZGF0YSBidWZmZXIgd291bGQgc3VycHJpc2UgbW9zdCBjYWxsZXJzLAorICAgKiBsYXJnZSBzaXplIC0+IGRvIG5vdCBib3RoZXIgdHJ5aW5nIHRvIHNxdWVlemUgdGhhdCBpbnRvIGFkYXB0ZXIsCisgICAqIHNvIHdlIHRocm93IHBvb3IgbWFuJ3MgZXhjZXB0aW9uLCB3aGljaCBjYW4gYmUgY2F1Z2h0IGlmIGNhbGxlciByZWFsbHkKKyAgICogd2FudHMgdG8gaGFuZGxlIDAgc2l6ZSBjaHVuayAqLworICBpZiAoISgqc2l6ZSkgfHwgKCpzaXplKSA+PSAoMSA8PCAzMCkpIHsKKyAgICBHU1RfSU5GTyAoIkludmFsaWQvdW5leHBlY3RlZCBjaHVuayBzaXplICV1IGZvciB0YWcgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICpzaXplLCBHU1RfRk9VUkNDX0FSR1MgKCp0YWcpKTsKKyAgICAvKiBjaGFpbiBzaG91bGQgZ2l2ZSB1cCAqLworICAgIHdhdi0+YWJvcnRfYnVmZmVyaW5nID0gVFJVRTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcGVla19zaXplID0gKCpzaXplICsgMSkgJiB+MTsKKyAgYXZhaWxhYmxlID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlICh3YXYtPmFkYXB0ZXIpOworCisgIGlmIChhdmFpbGFibGUgPj0gKDggKyBwZWVrX3NpemUpKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0gZWxzZSB7CisgICAgR1NUX0xPRyAoImJ1dCBvbmx5ICV1IGJ5dGVzIGF2YWlsYWJsZSBub3ciLCBhdmFpbGFibGUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKgorICogZ3N0X3dhdnBhcnNlX2NhbGN1bGF0ZV9kdXJhdGlvbjoKKyAqIEB3YXY6IHdhdnBhcnNlIG9iamVjdAorICoKKyAqIENhbGN1bGF0ZSBkdXJhdGlvbiBvbiBkZW1hbmQgYW5kIHN0b3JlIGluIEB3YXYuIFByZWZlciBicHMsIGJ1dCB1c2UgZmFjdCBhcyBhCisgKiBmYWxsYmFjay4KKyAqCisgKiBSZXR1cm5zOiAlVFJVRSBpZiBkdXJhdGlvbiBpcyBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhcnNlX2NhbGN1bGF0ZV9kdXJhdGlvbiAoR3N0V2F2UGFyc2UgKiB3YXYpCit7CisgIGlmICh3YXYtPmR1cmF0aW9uID4gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAod2F2LT5icHMgPiAwKSB7CisgICAgR1NUX0lORk9fT0JKRUNUICh3YXYsICJHb3QgZGF0YXNpemUgJSIgR19HVUlOVDY0X0ZPUk1BVCwgd2F2LT5kYXRhc2l6ZSk7CisgICAgd2F2LT5kdXJhdGlvbiA9CisgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9jZWlsICh3YXYtPmRhdGFzaXplLCBHU1RfU0VDT05ELAorICAgICAgICAoZ3VpbnQ2NCkgd2F2LT5icHMpOworICAgIEdTVF9JTkZPX09CSkVDVCAod2F2LCAiR290IGR1cmF0aW9uIChicHMpICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAod2F2LT5kdXJhdGlvbikpOworICAgIHJldHVybiBUUlVFOworICB9IGVsc2UgaWYgKHdhdi0+ZmFjdCkgeworICAgIHdhdi0+ZHVyYXRpb24gPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfY2VpbCAoR1NUX1NFQ09ORCwgd2F2LT5mYWN0LCB3YXYtPnJhdGUpOworICAgIEdTVF9JTkZPX09CSkVDVCAod2F2LCAiR290IGR1cmF0aW9uIChmYWN0KSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHdhdi0+ZHVyYXRpb24pKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdmVwYXJzZV9pZ25vcmVfY2h1bmsgKEdzdFdhdlBhcnNlICogd2F2LCBHc3RCdWZmZXIgKiBidWYsIGd1aW50MzIgdGFnLAorICAgIGd1aW50MzIgc2l6ZSkKK3sKKyAgZ3VpbnQgZmx1c2g7CisKKyAgaWYgKHdhdi0+c3RyZWFtaW5nKSB7CisgICAgaWYgKCFnc3Rfd2F2cGFyc2VfcGVla19jaHVuayAod2F2LCAmdGFnLCAmc2l6ZSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiSWdub3JpbmcgdGFnICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgR1NUX0ZPVVJDQ19BUkdTICh0YWcpKTsKKyAgZmx1c2ggPSA4ICsgKChzaXplICsgMSkgJiB+MSk7CisgIHdhdi0+b2Zmc2V0ICs9IGZsdXNoOworICBpZiAod2F2LT5zdHJlYW1pbmcpIHsKKyAgICBnc3RfYWRhcHRlcl9mbHVzaCAod2F2LT5hZGFwdGVyLCBmbHVzaCk7CisgIH0gZWxzZSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKgorICogZ3N0X3dhdnBhcnNlX2N1ZV9jaHVuazoKKyAqIEB3YXYgR3N0V2F2UGFyc2Ugb2JqZWN0CisgKiBAZGF0YSBob2xkZXIgZm9yIGRhdGEKKyAqIEBzaXplIGhvbGRlciBmb3IgZGF0YSBzaXplCisgKgorICogUGFyc2UgY3VlIGNodW5rIGZyb20gQGRhdGEgdG8gd2F2LT5jdWVzLgorICoKKyAqIFJldHVybnM6ICVUUlVFIHdoZW4gY3VlIGNodW5rIGlzIGF2YWlsYWJsZQorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYXJzZV9jdWVfY2h1bmsgKEdzdFdhdlBhcnNlICogd2F2LCBjb25zdCBndWludDggKiBkYXRhLCBndWludDMyIHNpemUpCit7CisgIGd1aW50MzIgaSwgbmN1ZXM7CisgIEdMaXN0ICpjdWVzID0gTlVMTDsKKyAgR3N0V2F2UGFyc2VDdWUgKmN1ZTsKKworICBpZiAod2F2LT5jdWVzKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh3YXYsICJmb3VuZCBhbm90aGVyIGN1ZSdzIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBuY3VlcyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSk7CisKKyAgaWYgKHNpemUgPCA0ICsgbmN1ZXMgKiAyNCkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2LCAiYnJva2VuIGZpbGUgJWQgJWQiLCBzaXplLCBuY3Vlcyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogcGFyc2UgZGF0YSAqLworICBkYXRhICs9IDQ7CisgIGZvciAoaSA9IDA7IGkgPCBuY3VlczsgaSsrKSB7CisgICAgY3VlID0gZ19uZXcwIChHc3RXYXZQYXJzZUN1ZSwgMSk7CisgICAgY3VlLT5pZCA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSk7CisgICAgY3VlLT5wb3NpdGlvbiA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDQpOworICAgIGN1ZS0+ZGF0YV9jaHVua19pZCA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDgpOworICAgIGN1ZS0+Y2h1bmtfc3RhcnQgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEgKyAxMik7CisgICAgY3VlLT5ibG9ja19zdGFydCA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDE2KTsKKyAgICBjdWUtPnNhbXBsZV9vZmZzZXQgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEgKyAyMCk7CisgICAgY3VlcyA9IGdfbGlzdF9hcHBlbmQgKGN1ZXMsIGN1ZSk7CisgICAgZGF0YSArPSAyNDsKKyAgfQorCisgIHdhdi0+Y3VlcyA9IGN1ZXM7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBnc3Rfd2F2cGFyc2VfbGFibF9jaHVuazoKKyAqIEB3YXYgR3N0V2F2UGFyc2Ugb2JqZWN0CisgKiBAZGF0YSBob2xkZXIgZm9yIGRhdGEKKyAqIEBzaXplIGhvbGRlciBmb3IgZGF0YSBzaXplCisgKgorICogUGFyc2UgbGFibCBmcm9tIEBkYXRhIHRvIHdhdi0+bGFibHMuCisgKgorICogUmV0dXJuczogJVRSVUUgd2hlbiBsYWJsIGNodW5rIGlzIGF2YWlsYWJsZQorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYXJzZV9sYWJsX2NodW5rIChHc3RXYXZQYXJzZSAqIHdhdiwgY29uc3QgZ3VpbnQ4ICogZGF0YSwgZ3VpbnQzMiBzaXplKQoreworICBHc3RXYXZQYXJzZUxhYmwgKmxhYmw7CisKKyAgaWYgKHNpemUgPCA1KQorICAgIHJldHVybiBGQUxTRTsKKworICBsYWJsID0gZ19uZXcwIChHc3RXYXZQYXJzZUxhYmwsIDEpOworCisgIC8qIHBhcnNlIGRhdGEgKi8KKyAgZGF0YSArPSA4OworICBsYWJsLT5jdWVfcG9pbnRfaWQgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEpOworICBsYWJsLT50ZXh0ID0gZ19tZW1kdXAgKGRhdGEgKyA0LCBzaXplIC0gNCk7CisKKyAgd2F2LT5sYWJscyA9IGdfbGlzdF9hcHBlbmQgKHdhdi0+bGFibHMsIGxhYmwpOworCisgIHJldHVybiBUUlVFOworfQorCisvKgorICogZ3N0X3dhdnBhcnNlX25vdGVfY2h1bms6CisgKiBAd2F2IEdzdFdhdlBhcnNlIG9iamVjdAorICogQGRhdGEgaG9sZGVyIGZvciBkYXRhCisgKiBAc2l6ZSBob2xkZXIgZm9yIGRhdGEgc2l6ZQorICoKKyAqIFBhcnNlIG5vdGUgZnJvbSBAZGF0YSB0byB3YXYtPm5vdGVzLgorICoKKyAqIFJldHVybnM6ICVUUlVFIHdoZW4gbm90ZSBjaHVuayBpcyBhdmFpbGFibGUKKyAqLworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2cGFyc2Vfbm90ZV9jaHVuayAoR3N0V2F2UGFyc2UgKiB3YXYsIGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50MzIgc2l6ZSkKK3sKKyAgR3N0V2F2UGFyc2VOb3RlICpub3RlOworCisgIGlmIChzaXplIDwgNSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbm90ZSA9IGdfbmV3MCAoR3N0V2F2UGFyc2VOb3RlLCAxKTsKKworICAvKiBwYXJzZSBkYXRhICovCisgIGRhdGEgKz0gODsKKyAgbm90ZS0+Y3VlX3BvaW50X2lkID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKyAgbm90ZS0+dGV4dCA9IGdfbWVtZHVwIChkYXRhICsgNCwgc2l6ZSAtIDQpOworCisgIHdhdi0+bm90ZXMgPSBnX2xpc3RfYXBwZW5kICh3YXYtPm5vdGVzLCBub3RlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIGdzdF93YXZwYXJzZV9zbXBsX2NodW5rOgorICogQHdhdiBHc3RXYXZQYXJzZSBvYmplY3QKKyAqIEBkYXRhIGhvbGRlciBmb3IgZGF0YQorICogQHNpemUgaG9sZGVyIGZvciBkYXRhIHNpemUKKyAqCisgKiBQYXJzZSBzbXBsIGNodW5rIGZyb20gQGRhdGEuCisgKgorICogUmV0dXJuczogJVRSVUUgd2hlbiBjdWUgY2h1bmsgaXMgYXZhaWxhYmxlCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhcnNlX3NtcGxfY2h1bmsgKEdzdFdhdlBhcnNlICogd2F2LCBjb25zdCBndWludDggKiBkYXRhLCBndWludDMyIHNpemUpCit7CisgIGd1aW50MzIgbm90ZV9udW1iZXI7CisKKyAgLyoKKyAgICAgbWFudWZhY3R1cmVyX2lkID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKyAgICAgcHJvZHVjdF9pZCA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDQpOworICAgICBzYW1wbGVfcGVyaW9kID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhICsgOCk7CisgICAqLworICBub3RlX251bWJlciA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDEyKTsKKyAgLyoKKyAgICAgcGl0Y2hfZnJhY3Rpb24gPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEgKyAxNik7CisgICAgIFNNUFRFX2Zvcm1hdCA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDIwKTsKKyAgICAgU01QVEVfb2Zmc2V0ID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhICsgMjQpOworICAgICBudW1fc2FtcGxlX2xvb3BzID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhICsgMjgpOworICAgICBMaXN0IG9mIFNhbXBsZSBMb29wcywgMjQgYnl0ZXMgZWFjaAorICAgKi8KKworICBpZiAoIXdhdi0+dGFncykKKyAgICB3YXYtPnRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBnc3RfdGFnX2xpc3RfYWRkICh3YXYtPnRhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgIEdTVF9UQUdfTUlESV9CQVNFX05PVEUsIChndWludCkgbm90ZV9udW1iZXIsIE5VTEwpOworICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIGdzdF93YXZwYXJzZV9hZHRsX2NodW5rOgorICogQHdhdiBHc3RXYXZQYXJzZSBvYmplY3QKKyAqIEBkYXRhIGhvbGRlciBmb3IgZGF0YQorICogQHNpemUgaG9sZGVyIGZvciBkYXRhIHNpemUKKyAqCisgKiBQYXJzZSBhZHRsIGZyb20gQGRhdGEuCisgKgorICogUmV0dXJuczogJVRSVUUgd2hlbiBhZHRsIGNodW5rIGlzIGF2YWlsYWJsZQorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYXJzZV9hZHRsX2NodW5rIChHc3RXYXZQYXJzZSAqIHdhdiwgY29uc3QgZ3VpbnQ4ICogZGF0YSwgZ3VpbnQzMiBzaXplKQoreworICBndWludDMyIGx0YWcsIGxzaXplLCBvZmZzZXQgPSAwOworCisgIHdoaWxlIChzaXplID49IDgpIHsKKyAgICBsdGFnID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhICsgb2Zmc2V0KTsKKyAgICBsc2l6ZSA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIG9mZnNldCArIDQpOworCisgICAgaWYgKGxzaXplICsgOCA+IHNpemUpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2LCAiSW52YWxpZCBhZHRsIHNpemU6ICV1ICsgOCA+ICV1IiwgbHNpemUsIHNpemUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAobHRhZykgeworICAgICAgY2FzZSBHU1RfUklGRl9UQUdfbGFibDoKKyAgICAgICAgZ3N0X3dhdnBhcnNlX2xhYmxfY2h1bmsgKHdhdiwgZGF0YSArIG9mZnNldCwgc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfUklGRl9UQUdfbm90ZToKKyAgICAgICAgZ3N0X3dhdnBhcnNlX25vdGVfY2h1bmsgKHdhdiwgZGF0YSArIG9mZnNldCwgc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh3YXYsICJVbmtub3dtIGFkdGwgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGx0YWcpKTsKKyAgICAgICAgR1NUX01FTURVTVBfT0JKRUNUICh3YXYsICJVbmtub3dtIGFkdGwiLCAmZGF0YVtvZmZzZXRdLCBsc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBvZmZzZXQgKz0gOCArIEdTVF9ST1VORF9VUF8yIChsc2l6ZSk7CisgICAgc2l6ZSAtPSA4ICsgR1NUX1JPVU5EX1VQXzIgKGxzaXplKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0VGFnTGlzdCAqCitnc3Rfd2F2cGFyc2VfZ2V0X3RhZ3NfdG9jX2VudHJ5IChHc3RUb2MgKiB0b2MsIGdjaGFyICogaWQpCit7CisgIEdzdFRhZ0xpc3QgKnRhZ3MgPSBOVUxMOworICBHc3RUb2NFbnRyeSAqZW50cnkgPSBOVUxMOworCisgIGVudHJ5ID0gZ3N0X3RvY19maW5kX2VudHJ5ICh0b2MsIGlkKTsKKyAgaWYgKGVudHJ5ICE9IE5VTEwpIHsKKyAgICB0YWdzID0gZ3N0X3RvY19lbnRyeV9nZXRfdGFncyAoZW50cnkpOworICAgIGlmICh0YWdzID09IE5VTEwpIHsKKyAgICAgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAgICAgZ3N0X3RvY19lbnRyeV9zZXRfdGFncyAoZW50cnksIHRhZ3MpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0YWdzOworfQorCisvKgorICogZ3N0X3dhdnBhcnNlX2NyZWF0ZV90b2M6CisgKiBAd2F2IEdzdFdhdlBhcnNlIG9iamVjdAorICoKKyAqIENyZWF0ZSBUT0MgZnJvbSB3YXYtPmN1ZXMgYW5kIHdhdi0+bGFibHMuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhcnNlX2NyZWF0ZV90b2MgKEdzdFdhdlBhcnNlICogd2F2KQoreworICBnaW50NjQgc3RhcnQsIHN0b3A7CisgIGdjaGFyICppZDsKKyAgR0xpc3QgKmxpc3Q7CisgIEdzdFdhdlBhcnNlQ3VlICpjdWU7CisgIEdzdFdhdlBhcnNlTGFibCAqbGFibDsKKyAgR3N0V2F2UGFyc2VOb3RlICpub3RlOworICBHc3RUYWdMaXN0ICp0YWdzOworICBHc3RUb2MgKnRvYzsKKyAgR3N0VG9jRW50cnkgKmVudHJ5ID0gTlVMTCwgKmN1cl9zdWJlbnRyeSA9IE5VTEwsICpwcmV2X3N1YmVudHJ5ID0gTlVMTDsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHdhdik7CisgIGlmICh3YXYtPnRvYykgeworICAgIEdTVF9PQkpFQ1RfVU5MT0NLICh3YXYpOworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2LCAiZm91bmQgYW5vdGhlciBUT0MiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoIXdhdi0+Y3VlcykgeworICAgIEdTVF9PQkpFQ1RfVU5MT0NLICh3YXYpOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgLyogRklYTUU6IHNlbmQgQ1VSUkVOVCBzY29wZSB0b2MgdG9vICovCisgIHRvYyA9IGdzdF90b2NfbmV3IChHU1RfVE9DX1NDT1BFX0dMT0JBTCk7CisKKyAgLyogYWRkIGN1ZSBlZGl0aW9uICovCisgIGVudHJ5ID0gZ3N0X3RvY19lbnRyeV9uZXcgKEdTVF9UT0NfRU5UUllfVFlQRV9FRElUSU9OLCAiY3VlIik7CisgIGdzdF90b2NfZW50cnlfc2V0X3N0YXJ0X3N0b3BfdGltZXMgKGVudHJ5LCAwLCB3YXYtPmR1cmF0aW9uKTsKKyAgZ3N0X3RvY19hcHBlbmRfZW50cnkgKHRvYywgZW50cnkpOworCisgIC8qIGFkZCB0cmFja3MgaW4gY3VlIGVkaXRpb24gKi8KKyAgbGlzdCA9IHdhdi0+Y3VlczsKKyAgd2hpbGUgKGxpc3QpIHsKKyAgICBjdWUgPSBsaXN0LT5kYXRhOworICAgIHByZXZfc3ViZW50cnkgPSBjdXJfc3ViZW50cnk7CisgICAgLyogcHJldmlvdXMgdHJhY2sgc3RvcCB0aW1lID0gY3VycmVudCB0cmFjayBzdGFydCB0aW1lICovCisgICAgaWYgKHByZXZfc3ViZW50cnkgIT0gTlVMTCkgeworICAgICAgZ3N0X3RvY19lbnRyeV9nZXRfc3RhcnRfc3RvcF90aW1lcyAocHJldl9zdWJlbnRyeSwgJnN0YXJ0LCBOVUxMKTsKKyAgICAgIHN0b3AgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKGN1ZS0+cG9zaXRpb24sIEdTVF9TRUNPTkQsIHdhdi0+cmF0ZSk7CisgICAgICBnc3RfdG9jX2VudHJ5X3NldF9zdGFydF9zdG9wX3RpbWVzIChwcmV2X3N1YmVudHJ5LCBzdGFydCwgc3RvcCk7CisgICAgfQorICAgIGlkID0gZ19zdHJkdXBfcHJpbnRmICgiJTA4eCIsIGN1ZS0+aWQpOworICAgIGN1cl9zdWJlbnRyeSA9IGdzdF90b2NfZW50cnlfbmV3IChHU1RfVE9DX0VOVFJZX1RZUEVfVFJBQ0ssIGlkKTsKKyAgICBnX2ZyZWUgKGlkKTsKKyAgICBzdGFydCA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAoY3VlLT5wb3NpdGlvbiwgR1NUX1NFQ09ORCwgd2F2LT5yYXRlKTsKKyAgICBzdG9wID0gd2F2LT5kdXJhdGlvbjsKKyAgICBnc3RfdG9jX2VudHJ5X3NldF9zdGFydF9zdG9wX3RpbWVzIChjdXJfc3ViZW50cnksIHN0YXJ0LCBzdG9wKTsKKyAgICBnc3RfdG9jX2VudHJ5X2FwcGVuZF9zdWJfZW50cnkgKGVudHJ5LCBjdXJfc3ViZW50cnkpOworICAgIGxpc3QgPSBnX2xpc3RfbmV4dCAobGlzdCk7CisgIH0KKworICAvKiBhZGQgdGFncyBpbiB0cmFja3MgKi8KKyAgbGlzdCA9IHdhdi0+bGFibHM7CisgIHdoaWxlIChsaXN0KSB7CisgICAgbGFibCA9IGxpc3QtPmRhdGE7CisgICAgaWQgPSBnX3N0cmR1cF9wcmludGYgKCIlMDh4IiwgbGFibC0+Y3VlX3BvaW50X2lkKTsKKyAgICB0YWdzID0gZ3N0X3dhdnBhcnNlX2dldF90YWdzX3RvY19lbnRyeSAodG9jLCBpZCk7CisgICAgZ19mcmVlIChpZCk7CisgICAgaWYgKHRhZ3MgIT0gTlVMTCkgeworICAgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFncywgR1NUX1RBR19NRVJHRV9BUFBFTkQsIEdTVF9UQUdfVElUTEUsIGxhYmwtPnRleHQsCisgICAgICAgICAgTlVMTCk7CisgICAgfQorICAgIGxpc3QgPSBnX2xpc3RfbmV4dCAobGlzdCk7CisgIH0KKyAgbGlzdCA9IHdhdi0+bm90ZXM7CisgIHdoaWxlIChsaXN0KSB7CisgICAgbm90ZSA9IGxpc3QtPmRhdGE7CisgICAgaWQgPSBnX3N0cmR1cF9wcmludGYgKCIlMDh4Iiwgbm90ZS0+Y3VlX3BvaW50X2lkKTsKKyAgICB0YWdzID0gZ3N0X3dhdnBhcnNlX2dldF90YWdzX3RvY19lbnRyeSAodG9jLCBpZCk7CisgICAgZ19mcmVlIChpZCk7CisgICAgaWYgKHRhZ3MgIT0gTlVMTCkgeworICAgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFncywgR1NUX1RBR19NRVJHRV9QUkVQRU5ELCBHU1RfVEFHX0NPTU1FTlQsCisgICAgICAgICAgbm90ZS0+dGV4dCwgTlVMTCk7CisgICAgfQorICAgIGxpc3QgPSBnX2xpc3RfbmV4dCAobGlzdCk7CisgIH0KKworICAvKiBzZW5kIGRhdGEgYXMgVE9DICovCisgIHdhdi0+dG9jID0gdG9jOworCisgIC8qIHNlbmQgVE9DIGV2ZW50ICovCisgIGlmICh3YXYtPnRvYykgeworICAgIEdTVF9PQkpFQ1RfVU5MT0NLICh3YXYpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAod2F2LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfdG9jICh3YXYtPnRvYywgRkFMU0UpKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisjZGVmaW5lIE1BWF9CVUZGRVJfU0laRSA0MDk2CisKK3N0YXRpYyBnYm9vbGVhbgorcGFyc2VfZHM2NCAoR3N0V2F2UGFyc2UgKiB3YXYsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50MzIgZGF0YVNpemVMb3csIGRhdGFTaXplSGlnaDsKKyAgZ3VpbnQzMiBzYW1wbGVDb3VudExvdywgc2FtcGxlQ291bnRIaWdoOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRhdGFTaXplTG93ID0gR1NUX1JFQURfVUlOVDMyX0xFIChtYXAuZGF0YSArIDIgKiA0KTsKKyAgZGF0YVNpemVIaWdoID0gR1NUX1JFQURfVUlOVDMyX0xFIChtYXAuZGF0YSArIDMgKiA0KTsKKyAgc2FtcGxlQ291bnRMb3cgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKG1hcC5kYXRhICsgNCAqIDQpOworICBzYW1wbGVDb3VudEhpZ2ggPSBHU1RfUkVBRF9VSU5UMzJfTEUgKG1hcC5kYXRhICsgNSAqIDQpOworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICBpZiAoZGF0YVNpemVIaWdoICE9IDB4RkZGRkZGRkYgJiYgZGF0YVNpemVMb3cgIT0gMHhGRkZGRkZGRikgeworICAgIHdhdi0+ZGF0YXNpemUgPSAoKGd1aW50NjQpIGRhdGFTaXplSGlnaCA8PCAzMikgfCBkYXRhU2l6ZUxvdzsKKyAgfQorICBpZiAoc2FtcGxlQ291bnRIaWdoICE9IDB4RkZGRkZGRkYgJiYgc2FtcGxlQ291bnRMb3cgIT0gMHhGRkZGRkZGRikgeworICAgIHdhdi0+ZmFjdCA9ICgoZ3VpbnQ2NCkgc2FtcGxlQ291bnRIaWdoIDw8IDMyKSB8IHNhbXBsZUNvdW50TG93OworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiR290ICdkczY0JyBUQUcsIGRhdGFzaXplIDogJSIgR19HSU5UNjRfRk9STUFUCisgICAgICAiIGZhY3Q6ICUiIEdfR0lOVDY0X0ZPUk1BVCwgd2F2LT5kYXRhc2l6ZSwgd2F2LT5mYWN0KTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMgKEdzdFdhdlBhcnNlICogd2F2KQoreworICBHc3RGbG93UmV0dXJuIHJlcyA9IEdTVF9GTE9XX09LOworICBHc3RCdWZmZXIgKmJ1ZiA9IE5VTEw7CisgIGdzdF9yaWZmX3N0cmZfYXVkcyAqaGVhZGVyID0gTlVMTDsKKyAgZ3VpbnQzMiB0YWcsIHNpemU7CisgIGdib29sZWFuIGdvdGRhdGEgPSBGQUxTRTsKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisgIGdjaGFyICpjb2RlY19uYW1lID0gTlVMTDsKKyAgZ2ludDY0IHVwc3RyZWFtX3NpemUgPSAwOworICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgLyogc2VhcmNoIGZvciAiX2ZtdCIgY2h1bmssIHdoaWNoIG11c3QgYmUgYmVmb3JlICJkYXRhIiAqLworICB3aGlsZSAoIXdhdi0+Z290X2ZtdCkgeworICAgIEdzdEJ1ZmZlciAqZXh0cmE7CisKKyAgICBpZiAod2F2LT5zdHJlYW1pbmcpIHsKKyAgICAgIGlmICghZ3N0X3dhdnBhcnNlX3BlZWtfY2h1bmsgKHdhdiwgJnRhZywgJnNpemUpKQorICAgICAgICByZXR1cm4gcmVzOworCisgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAod2F2LT5hZGFwdGVyLCA4KTsKKyAgICAgIHdhdi0+b2Zmc2V0ICs9IDg7CisKKyAgICAgIGlmIChzaXplKSB7CisgICAgICAgIGJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyICh3YXYtPmFkYXB0ZXIsIHNpemUpOworICAgICAgICBpZiAoc2l6ZSAmIDEpCisgICAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKHdhdi0+YWRhcHRlciwgMSk7CisgICAgICAgIHdhdi0+b2Zmc2V0ICs9IEdTVF9ST1VORF9VUF8yIChzaXplKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3ICgpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoKHJlcyA9IGdzdF9yaWZmX3JlYWRfY2h1bmsgKEdTVF9FTEVNRU5UX0NBU1QgKHdhdiksIHdhdi0+c2lua3BhZCwKKyAgICAgICAgICAgICAgICAgICZ3YXYtPm9mZnNldCwgJnRhZywgJmJ1ZikpICE9IEdTVF9GTE9XX09LKQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICh0YWcgPT0gR1NUX1JTNjRfVEFHX0RTNjQpIHsKKyAgICAgIGlmICghcGFyc2VfZHM2NCAod2F2LCBidWYpKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgICBlbHNlCisgICAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmICh0YWcgIT0gR1NUX1JJRkZfVEFHX2ZtdCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAic2tpcHBpbmcgJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiBjaHVuayIsCisgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTICh0YWcpKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICBidWYgPSBOVUxMOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKCEoZ3N0X3JpZmZfcGFyc2Vfc3RyZl9hdWRzIChHU1RfRUxFTUVOVF9DQVNUICh3YXYpLCBidWYsICZoZWFkZXIsCisgICAgICAgICAgICAgICAgJmV4dHJhKSkpCisgICAgICBnb3RvIHBhcnNlX2hlYWRlcl9lcnJvcjsKKworICAgIGJ1ZiA9IE5VTEw7ICAgICAgICAgICAgICAgICAvKiBwYXJzZV9zdHJmX2F1ZHMoKSB0b29rIG93bmVyc2hpcCBvZiBidWZmZXIgKi8KKworICAgIC8qIGRvIHNhbml0eSBjaGVja3Mgb2YgaGVhZGVyIGZpZWxkcyAqLworICAgIGlmIChoZWFkZXItPmNoYW5uZWxzID09IDApCisgICAgICBnb3RvIG5vX2NoYW5uZWxzOworICAgIGlmIChoZWFkZXItPnJhdGUgPT0gMCkKKyAgICAgIGdvdG8gbm9fcmF0ZTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgImNyZWF0aW5nIHRoZSBjYXBzIik7CisKKyAgICAvKiBOb3RlOiBnc3RfcmlmZl9jcmVhdGVfYXVkaW9fY2FwcyBtaWdodCBuZWVkIHRvIGZpeCB2YWx1ZXMgaW4KKyAgICAgKiB0aGUgaGVhZGVyIGhlYWRlciBkZXBlbmRpbmcgb24gdGhlIGZvcm1hdCwgc28gY2FsbCBpdCBmaXJzdCAqLworICAgIC8qIEZJWE1FOiBOZWVkIHRvIGhhbmRsZSB0aGUgY2hhbm5lbCByZW9yZGVyIG1hcCAqLworICAgIGNhcHMgPSBnc3RfcmlmZl9jcmVhdGVfYXVkaW9fY2FwcyAoaGVhZGVyLT5mb3JtYXQsIE5VTEwsIGhlYWRlciwgZXh0cmEsCisgICAgICAgIE5VTEwsICZjb2RlY19uYW1lLCBOVUxMKTsKKworICAgIGlmIChleHRyYSkKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGV4dHJhKTsKKworICAgIGlmICghY2FwcykKKyAgICAgIGdvdG8gdW5rbm93bl9mb3JtYXQ7CisKKyAgICAvKiBJZiB3ZSBnb3QgcmF3IGF1ZGlvIGZyb20gdXBzdHJlYW0sIHdlIHJlbW92ZSB0aGUgY29kZWNfZGF0YSBmaWVsZCwKKyAgICAgKiB3aGljaCBtYXkgaGF2ZSBiZWVuIGFkZGVkIGlmIHRoZSB3YXYgaGVhZGVyIGluY2x1ZGVkIGFuIGV4dGVuZGVkCisgICAgICogY2h1bmsuIFdlIHdhbnQgdG8ga2VlcCBpdCBmb3Igbm9uIHJhdyBhdWRpby4KKyAgICAgKi8KKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgICAgaWYgKHMgJiYgZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgImF1ZGlvL3gtcmF3IikpIHsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzLCAiY29kZWNfZGF0YSIpOworICAgIH0KKworICAgIC8qIGRvIG1vcmUgc2FuaXR5IGNoZWNrcyBvZiBoZWFkZXIgZmllbGRzCisgICAgICogKHRoZXNlIGNhbiBiZSBzYW5pdGl6ZWQgYnkgZ3N0X3JpZmZfY3JlYXRlX2F1ZGlvX2NhcHMoKQorICAgICAqLworICAgIHdhdi0+Zm9ybWF0ID0gaGVhZGVyLT5mb3JtYXQ7CisgICAgd2F2LT5yYXRlID0gaGVhZGVyLT5yYXRlOworICAgIHdhdi0+Y2hhbm5lbHMgPSBoZWFkZXItPmNoYW5uZWxzOworICAgIHdhdi0+YmxvY2thbGlnbiA9IGhlYWRlci0+YmxvY2thbGlnbjsKKyAgICB3YXYtPmRlcHRoID0gaGVhZGVyLT5iaXRzX3Blcl9zYW1wbGU7CisgICAgd2F2LT5hdl9icHMgPSBoZWFkZXItPmF2X2JwczsKKyAgICB3YXYtPnZiciA9IEZBTFNFOworCisgICAgZ19mcmVlIChoZWFkZXIpOworICAgIGhlYWRlciA9IE5VTEw7CisKKyAgICAvKiBkbyBmb3JtYXQgc3BlY2lmaWMgaGFuZGxpbmcgKi8KKyAgICBzd2l0Y2ggKHdhdi0+Zm9ybWF0KSB7CisgICAgICBjYXNlIEdTVF9SSUZGX1dBVkVfRk9STUFUX01QRUdMMTI6CisgICAgICBjYXNlIEdTVF9SSUZGX1dBVkVfRk9STUFUX01QRUdMMzoKKyAgICAgIHsKKyAgICAgICAgLyogTm90ZTogd29ya2Fyb3VuZCBmb3IgbXAyL21wMyBlbWJlZGRlZCBpbiB3YXYsIHRoYXQgcmVsaWVzIG9uIHRoZQorICAgICAgICAgKiBiaXRyYXRlIGluc2lkZSB0aGUgbXBlZyBzdHJlYW0gKi8KKyAgICAgICAgR1NUX0lORk8gKCJyZXNldHRpbmcgYnBzIGZyb20gJXUgdG8gMCBmb3IgbXAyLzMiLCB3YXYtPmF2X2Jwcyk7CisgICAgICAgIHdhdi0+YnBzID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEdTVF9SSUZGX1dBVkVfRk9STUFUX1BDTToKKyAgICAgICAgaWYgKHdhdi0+YmxvY2thbGlnbiA+IHdhdi0+Y2hhbm5lbHMgKiAoKHdhdi0+ZGVwdGggKyA3KSAvIDgpKQorICAgICAgICAgIGdvdG8gaW52YWxpZF9ibG9ja2FsaWduOworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICh3YXYtPmF2X2JwcyA+IHdhdi0+YmxvY2thbGlnbiAqIHdhdi0+cmF0ZSkKKyAgICAgICAgICBnb3RvIGludmFsaWRfYnBzOworICAgICAgICAvKiB1c2UgdGhlIGNvbmZpZ3VyZWQgYnBzICovCisgICAgICAgIHdhdi0+YnBzID0gd2F2LT5hdl9icHM7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHdhdi0+d2lkdGggPSAod2F2LT5ibG9ja2FsaWduICogOCkgLyB3YXYtPmNoYW5uZWxzOworICAgIHdhdi0+Ynl0ZXNfcGVyX3NhbXBsZSA9IHdhdi0+Y2hhbm5lbHMgKiB3YXYtPndpZHRoIC8gODsKKworICAgIGlmICh3YXYtPmJ5dGVzX3Blcl9zYW1wbGUgPD0gMCkKKyAgICAgIGdvdG8gbm9fYnl0ZXNfcGVyX3NhbXBsZTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgImJsb2NrYWxpZ24gPSAldSIsIChndWludCkgd2F2LT5ibG9ja2FsaWduKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJ3aWR0aCAgICAgID0gJXUiLCAoZ3VpbnQpIHdhdi0+d2lkdGgpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgImRlcHRoICAgICAgPSAldSIsIChndWludCkgd2F2LT5kZXB0aCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiYXZfYnBzICAgICA9ICV1IiwgKGd1aW50KSB3YXYtPmF2X2Jwcyk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiZnJlcXVlbmN5ICA9ICV1IiwgKGd1aW50KSB3YXYtPnJhdGUpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgImNoYW5uZWxzICAgPSAldSIsIChndWludCkgd2F2LT5jaGFubmVscyk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiYnl0ZXNfcGVyX3NhbXBsZSA9ICV1Iiwgd2F2LT5ieXRlc19wZXJfc2FtcGxlKTsKKworICAgIC8qIGJwcyBjYW4gYmUgMCB3aGVuIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBiaXRyYXRlIChtb3N0bHkgZm9yIGNvbXByZXNzZWQKKyAgICAgKiBmb3JtYXRzKS4gVGhpcyB3aWxsIG1ha2UgdGhlIGVsZW1lbnQgb3V0cHV0IGEgQllURSBmb3JtYXQgc2VnbWVudCBhbmQKKyAgICAgKiB3aWxsIG5vdCB0aW1lc3RhbXAgdGhlIG91dGdvaW5nIGJ1ZmZlcnMuCisgICAgICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiYnBzICAgICAgICA9ICV1IiwgKGd1aW50KSB3YXYtPmJwcyk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJjYXBzID0gJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgICAgLyogY3JlYXRlIHBhZCBsYXRlciBzbyB3ZSBjYW4gc25pZmYgdGhlIGZpcnN0IGZldyBieXRlcworICAgICAqIG9mIHRoZSByZWFsIGRhdGEgYW5kIGNvcnJlY3Qgb3VyIGNhcHMgaWYgbmVjZXNzYXJ5ICovCisgICAgZ3N0X2NhcHNfcmVwbGFjZSAoJndhdi0+Y2FwcywgY2Fwcyk7CisgICAgZ3N0X2NhcHNfcmVwbGFjZSAoJmNhcHMsIE5VTEwpOworCisgICAgd2F2LT5nb3RfZm10ID0gVFJVRTsKKworICAgIGlmICh3YXYtPnRhZ3MgPT0gTlVMTCkKKyAgICAgIHdhdi0+dGFncyA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisKKyAgICB7CisgICAgICBHc3RDYXBzICp0ZW1wbF9jYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHdhdi0+c2lua3BhZCk7CisgICAgICBnc3RfcGJfdXRpbHNfYWRkX2NvZGVjX2Rlc2NyaXB0aW9uX3RvX3RhZ19saXN0ICh3YXYtPnRhZ3MsCisgICAgICAgICAgR1NUX1RBR19DT05UQUlORVJfRk9STUFULCB0ZW1wbF9jYXBzKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmICh0ZW1wbF9jYXBzKTsKKyAgICB9CisKKyAgICAvKiBJZiBicHMgaXMgbm9uemVybywgdGhlbiB3ZSBkbyBoYXZlIGEgdmFsaWQgYml0cmF0ZSB0aGF0IGNhbiBiZQorICAgICAqIGFubm91bmNlZCBpbiBhIHRhZyBsaXN0LiAqLworICAgIGlmICh3YXYtPmJwcykgeworICAgICAgZ3VpbnQgYml0cmF0ZSA9IHdhdi0+YnBzICogODsKKyAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHdhdi0+dGFncywgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICAgIEdTVF9UQUdfQklUUkFURSwgYml0cmF0ZSwgTlVMTCk7CisgICAgfQorCisgICAgaWYgKGNvZGVjX25hbWUpIHsKKyAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHdhdi0+dGFncywgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICAgIEdTVF9UQUdfQVVESU9fQ09ERUMsIGNvZGVjX25hbWUsIE5VTEwpOworCisgICAgICBnX2ZyZWUgKGNvZGVjX25hbWUpOworICAgICAgY29kZWNfbmFtZSA9IE5VTEw7CisgICAgfQorCisgIH0KKworICBnc3RfcGFkX3BlZXJfcXVlcnlfZHVyYXRpb24gKHdhdi0+c2lua3BhZCwgR1NUX0ZPUk1BVF9CWVRFUywgJnVwc3RyZWFtX3NpemUpOworICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJ1cHN0cmVhbSBzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHVwc3RyZWFtX3NpemUpOworCisgIC8qIGxvb3AgaGVhZGVycyB1bnRpbCB3ZSBnZXQgZGF0YSAqLworICB3aGlsZSAoIWdvdGRhdGEpIHsKKyAgICBpZiAod2F2LT5zdHJlYW1pbmcpIHsKKyAgICAgIGlmICghZ3N0X3dhdnBhcnNlX3BlZWtfY2h1bmtfaW5mbyAod2F2LCAmdGFnLCAmc2l6ZSkpCisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9IGVsc2UgeworICAgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICAgIGJ1ZiA9IE5VTEw7CisgICAgICBpZiAoKHJlcyA9CisgICAgICAgICAgICAgIGdzdF9wYWRfcHVsbF9yYW5nZSAod2F2LT5zaW5rcGFkLCB3YXYtPm9mZnNldCwgOCwKKyAgICAgICAgICAgICAgICAgICZidWYpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBoZWFkZXJfcmVhZF9lcnJvcjsKKyAgICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICB0YWcgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKG1hcC5kYXRhKTsKKyAgICAgIHNpemUgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKG1hcC5kYXRhICsgNCk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIH0KKworICAgIEdTVF9JTkZPX09CSkVDVCAod2F2LAorICAgICAgICAiR290IFRBRzogJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiwgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgc2l6ZSAlIgorICAgICAgICBHX0dVSU5UMzJfRk9STUFULCBHU1RfRk9VUkNDX0FSR1MgKHRhZyksIHdhdi0+b2Zmc2V0LCBzaXplKTsKKworICAgIC8qIE1heGltdW0gdmFsaWQgc2l6ZSBpcyBJTlRfTUFYICovCisgICAgaWYgKHNpemUgJiAweDgwMDAwMDAwKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHdhdiwgIkludmFsaWQgc2l6ZSwgY2xpcHBpbmcgdG8gMHg3ZmZmZmZmZiIpOworICAgICAgc2l6ZSA9IDB4N2ZmZmZmZmY7CisgICAgfQorCisgICAgLyogQ2xpcCB0byB1cHN0cmVhbSBzaXplIGlmIGtub3duICovCisgICAgaWYgKHVwc3RyZWFtX3NpemUgPiAwICYmIHNpemUgKyB3YXYtPm9mZnNldCA+IHVwc3RyZWFtX3NpemUpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2LCAiQ2xpcHBpbmcgY2h1bmsgc2l6ZSB0byBmaWxlIHNpemUiKTsKKyAgICAgIGdfYXNzZXJ0ICh1cHN0cmVhbV9zaXplID49IHdhdi0+b2Zmc2V0KTsKKyAgICAgIHNpemUgPSB1cHN0cmVhbV9zaXplIC0gd2F2LT5vZmZzZXQ7CisgICAgfQorCisgICAgLyogd2F2IGlzIGEgc3QwMHBpZCBmb3JtYXQsIHdlIGRvbid0IGtub3cgZm9yIHN1cmUgd2hlcmUgZGF0YSBzdGFydHMuCisgICAgICogU28gd2UgaGF2ZSB0byBnbyBiaXQgYnkgYml0IHVudGlsIHdlIGZpbmQgdGhlICdkYXRhJyBoZWFkZXIKKyAgICAgKi8KKyAgICBzd2l0Y2ggKHRhZykgeworICAgICAgY2FzZSBHU1RfUklGRl9UQUdfZGF0YTp7CisgICAgICAgIGd1aW50NjQgc2l6ZTY0OworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgIkdvdCAnZGF0YScgVEFHLCBzaXplIDogJXUiLCBzaXplKTsKKyAgICAgICAgc2l6ZTY0ID0gc2l6ZTsKKyAgICAgICAgaWYgKHdhdi0+aWdub3JlX2xlbmd0aCkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgIklnbm9yaW5nIGxlbmd0aCIpOworICAgICAgICAgIHNpemU2NCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdhdi0+c3RyZWFtaW5nKSB7CisgICAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKHdhdi0+YWRhcHRlciwgOCk7CisgICAgICAgICAgZ290ZGF0YSA9IFRSVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgfQorICAgICAgICB3YXYtPm9mZnNldCArPSA4OworICAgICAgICB3YXYtPmRhdGFzdGFydCA9IHdhdi0+b2Zmc2V0OworICAgICAgICAvKiB1c2Ugc2l6ZSBmcm9tIGRzNjQgY2h1bmsgaWYgYXZhaWxhYmxlICovCisgICAgICAgIGlmIChzaXplNjQgPT0gLTEgJiYgd2F2LT5kYXRhc2l6ZSA+IDApIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJVc2luZyBkczY0IGRhdGFzaXplIik7CisgICAgICAgICAgc2l6ZTY0ID0gd2F2LT5kYXRhc2l6ZTsKKyAgICAgICAgfQorICAgICAgICB3YXYtPmNodW5rX3NpemUgPSBzaXplNjQ7CisKKyAgICAgICAgLyogSWYgc2l6ZSBpcyB6ZXJvLCB0aGVuIHRoZSBkYXRhIGNodW5rIHByb2JhYmx5IGFjdHVhbGx5IGV4dGVuZHMgdG8KKyAgICAgICAgICAgdGhlIGVuZCBvZiB0aGUgZmlsZSAqLworICAgICAgICBpZiAoc2l6ZTY0ID09IDAgJiYgdXBzdHJlYW1fc2l6ZSkgeworICAgICAgICAgIHNpemU2NCA9IHVwc3RyZWFtX3NpemUgLSB3YXYtPmRhdGFzdGFydDsKKyAgICAgICAgfQorICAgICAgICAvKiBPciB0aGUgZmlsZSBtaWdodCBiZSB0cnVuY2F0ZWQgKi8KKyAgICAgICAgZWxzZSBpZiAodXBzdHJlYW1fc2l6ZSkgeworICAgICAgICAgIHNpemU2NCA9IE1JTiAoc2l6ZTY0LCAodXBzdHJlYW1fc2l6ZSAtIHdhdi0+ZGF0YXN0YXJ0KSk7CisgICAgICAgIH0KKyAgICAgICAgd2F2LT5kYXRhc2l6ZSA9IHNpemU2NDsKKyAgICAgICAgd2F2LT5kYXRhbGVmdCA9IHNpemU2NDsKKyAgICAgICAgd2F2LT5lbmRfb2Zmc2V0ID0gc2l6ZTY0ICsgd2F2LT5kYXRhc3RhcnQ7CisgICAgICAgIGlmICghd2F2LT5zdHJlYW1pbmcpIHsKKyAgICAgICAgICAvKiBXZSB3aWxsIGNvbnRpbnVlIHBhcnNpbmcgdGFncyAndGlsbCBlbmQgKi8KKyAgICAgICAgICB3YXYtPm9mZnNldCArPSBzaXplNjQ7CisgICAgICAgIH0KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiZGF0YXNpemUgPSAlIiBHX0dVSU5UNjRfRk9STUFULCBzaXplNjQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgR1NUX1JJRkZfVEFHX2ZhY3Q6eworICAgICAgICBpZiAod2F2LT5mYWN0ID09IDAgJiYKKyAgICAgICAgICAgIHdhdi0+Zm9ybWF0ICE9IEdTVF9SSUZGX1dBVkVfRk9STUFUX01QRUdMMTIgJiYKKyAgICAgICAgICAgIHdhdi0+Zm9ybWF0ICE9IEdTVF9SSUZGX1dBVkVfRk9STUFUX01QRUdMMykgeworICAgICAgICAgIGNvbnN0IGd1aW50IGRhdGFfc2l6ZSA9IDQ7CisKKyAgICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHdhdiwgIkhhdmUgZmFjdCBjaHVuayIpOworICAgICAgICAgIGlmIChzaXplIDwgZGF0YV9zaXplKSB7CisgICAgICAgICAgICBpZiAoIWdzdF93YXZlcGFyc2VfaWdub3JlX2NodW5rICh3YXYsIGJ1ZiwgdGFnLCBzaXplKSkgeworICAgICAgICAgICAgICAvKiBuZWVkIG1vcmUgZGF0YSAqLworICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJuZWVkICV1LCBhdmFpbGFibGUgJXU7IGlnbm9yaW5nIGNodW5rIiwKKyAgICAgICAgICAgICAgICBkYXRhX3NpemUsIHNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIG51bWJlciBvZiBzYW1wbGVzIChmb3IgY29tcHJlc3NlZCBmb3JtYXRzKSAqLworICAgICAgICAgIGlmICh3YXYtPnN0cmVhbWluZykgeworICAgICAgICAgICAgY29uc3QgZ3VpbnQ4ICpkYXRhID0gTlVMTDsKKworICAgICAgICAgICAgaWYgKCFnc3Rfd2F2cGFyc2VfcGVla19jaHVuayAod2F2LCAmdGFnLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKHdhdi0+YWRhcHRlciwgOCk7CisgICAgICAgICAgICBkYXRhID0gZ3N0X2FkYXB0ZXJfbWFwICh3YXYtPmFkYXB0ZXIsIGRhdGFfc2l6ZSk7CisgICAgICAgICAgICB3YXYtPmZhY3QgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEpOworICAgICAgICAgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKHdhdi0+YWRhcHRlcik7CisgICAgICAgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAod2F2LT5hZGFwdGVyLCBHU1RfUk9VTkRfVVBfMiAoc2l6ZSkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgICAgYnVmID0gTlVMTDsKKyAgICAgICAgICAgIGlmICgocmVzID0KKyAgICAgICAgICAgICAgICAgICAgZ3N0X3BhZF9wdWxsX3JhbmdlICh3YXYtPnNpbmtwYWQsIHdhdi0+b2Zmc2V0ICsgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfc2l6ZSwgJmJ1ZikpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgICAgICBnb3RvIGhlYWRlcl9yZWFkX2Vycm9yOworICAgICAgICAgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChidWYsIDAsICZ3YXYtPmZhY3QsIDQpOworICAgICAgICAgICAgd2F2LT5mYWN0ID0gR1VJTlQzMl9GUk9NX0xFICh3YXYtPmZhY3QpOworICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICB9CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiaGF2ZSBmYWN0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHdhdi0+ZmFjdCk7CisgICAgICAgICAgd2F2LT5vZmZzZXQgKz0gOCArIEdTVF9ST1VORF9VUF8yIChzaXplKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoIWdzdF93YXZlcGFyc2VfaWdub3JlX2NodW5rICh3YXYsIGJ1ZiwgdGFnLCBzaXplKSkgeworICAgICAgICAgICAgLyogbmVlZCBtb3JlIGRhdGEgKi8KKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEdTVF9SSUZGX1RBR19hY2lkOnsKKyAgICAgICAgY29uc3QgZ3N0X3JpZmZfYWNpZCAqYWNpZCA9IE5VTEw7CisgICAgICAgIGNvbnN0IGd1aW50IGRhdGFfc2l6ZSA9IHNpemVvZiAoZ3N0X3JpZmZfYWNpZCk7CisgICAgICAgIGdmbG9hdCB0ZW1wbzsKKworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHdhdiwgIkhhdmUgYWNpZCBjaHVuayIpOworICAgICAgICBpZiAoc2l6ZSA8IGRhdGFfc2l6ZSkgeworICAgICAgICAgIGlmICghZ3N0X3dhdmVwYXJzZV9pZ25vcmVfY2h1bmsgKHdhdiwgYnVmLCB0YWcsIHNpemUpKSB7CisgICAgICAgICAgICAvKiBuZWVkIG1vcmUgZGF0YSAqLworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgIH0KKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJuZWVkICV1LCBhdmFpbGFibGUgJXU7IGlnbm9yaW5nIGNodW5rIiwKKyAgICAgICAgICAgICAgZGF0YV9zaXplLCBzaXplKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAod2F2LT5zdHJlYW1pbmcpIHsKKyAgICAgICAgICBpZiAoIWdzdF93YXZwYXJzZV9wZWVrX2NodW5rICh3YXYsICZ0YWcsICZzaXplKSkgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgIH0KKyAgICAgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAod2F2LT5hZGFwdGVyLCA4KTsKKyAgICAgICAgICBhY2lkID0gKGNvbnN0IGdzdF9yaWZmX2FjaWQgKikgZ3N0X2FkYXB0ZXJfbWFwICh3YXYtPmFkYXB0ZXIsCisgICAgICAgICAgICAgIGRhdGFfc2l6ZSk7CisgICAgICAgICAgdGVtcG8gPSBhY2lkLT50ZW1wbzsKKyAgICAgICAgICBnc3RfYWRhcHRlcl91bm1hcCAod2F2LT5hZGFwdGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgIGJ1ZiA9IE5VTEw7CisgICAgICAgICAgaWYgKChyZXMgPQorICAgICAgICAgICAgICAgICAgZ3N0X3BhZF9wdWxsX3JhbmdlICh3YXYtPnNpbmtwYWQsIHdhdi0+b2Zmc2V0ICsgOCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplLCAmYnVmKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICBnb3RvIGhlYWRlcl9yZWFkX2Vycm9yOworICAgICAgICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICAgICAgYWNpZCA9IChjb25zdCBnc3RfcmlmZl9hY2lkICopIG1hcC5kYXRhOworICAgICAgICAgIHRlbXBvID0gYWNpZC0+dGVtcG87CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICAgICAgfQorICAgICAgICAvKiBzZW5kIGRhdGEgYXMgdGFncyAqLworICAgICAgICBpZiAoIXdhdi0+dGFncykKKyAgICAgICAgICB3YXYtPnRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkICh3YXYtPnRhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgICAgICAgIEdTVF9UQUdfQkVBVFNfUEVSX01JTlVURSwgdGVtcG8sIE5VTEwpOworCisgICAgICAgIHNpemUgPSBHU1RfUk9VTkRfVVBfMiAoc2l6ZSk7CisgICAgICAgIGlmICh3YXYtPnN0cmVhbWluZykgeworICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoICh3YXYtPmFkYXB0ZXIsIHNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgd2F2LT5vZmZzZXQgKz0gOCArIHNpemU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgICAvKiBGSVhNRTogYWxsIGxpc3QgdGFncyBhZnRlciBkYXRhIGFyZSBpZ25vcmVkIGluIHN0cmVhbWluZyBtb2RlICovCisgICAgICBjYXNlIEdTVF9SSUZGX1RBR19MSVNUOnsKKyAgICAgICAgZ3VpbnQzMiBsdGFnOworCisgICAgICAgIGlmICh3YXYtPnN0cmVhbWluZykgeworICAgICAgICAgIGNvbnN0IGd1aW50OCAqZGF0YSA9IE5VTEw7CisKKyAgICAgICAgICBpZiAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlICh3YXYtPmFkYXB0ZXIpIDwgMTIpIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICB9CisgICAgICAgICAgZGF0YSA9IGdzdF9hZGFwdGVyX21hcCAod2F2LT5hZGFwdGVyLCAxMik7CisgICAgICAgICAgbHRhZyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDgpOworICAgICAgICAgIGdzdF9hZGFwdGVyX3VubWFwICh3YXYtPmFkYXB0ZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgICAgYnVmID0gTlVMTDsKKyAgICAgICAgICBpZiAoKHJlcyA9CisgICAgICAgICAgICAgICAgICBnc3RfcGFkX3B1bGxfcmFuZ2UgKHdhdi0+c2lua3BhZCwgd2F2LT5vZmZzZXQsIDEyLAorICAgICAgICAgICAgICAgICAgICAgICZidWYpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgIGdvdG8gaGVhZGVyX3JlYWRfZXJyb3I7CisgICAgICAgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChidWYsIDgsICZsdGFnLCA0KTsKKyAgICAgICAgICBsdGFnID0gR1VJTlQzMl9GUk9NX0xFIChsdGFnKTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGx0YWcpIHsKKyAgICAgICAgICBjYXNlIEdTVF9SSUZGX0xJU1RfSU5GTzp7CisgICAgICAgICAgICBjb25zdCBnaW50IGRhdGFfc2l6ZSA9IHNpemUgLSA0OworICAgICAgICAgICAgR3N0VGFnTGlzdCAqbmV3OworCisgICAgICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHdhdiwgIkhhdmUgTElTVCBjaHVuayBJTkZPIHNpemUgJXUiLCBkYXRhX3NpemUpOworICAgICAgICAgICAgaWYgKHdhdi0+c3RyZWFtaW5nKSB7CisgICAgICAgICAgICAgIGlmICghZ3N0X3dhdnBhcnNlX3BlZWtfY2h1bmsgKHdhdiwgJnRhZywgJnNpemUpKSB7CisgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoICh3YXYtPmFkYXB0ZXIsIDEyKTsKKyAgICAgICAgICAgICAgd2F2LT5vZmZzZXQgKz0gMTI7CisgICAgICAgICAgICAgIGlmIChkYXRhX3NpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgYnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHdhdi0+YWRhcHRlciwgZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YV9zaXplICYgMSkKKyAgICAgICAgICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoICh3YXYtPmFkYXB0ZXIsIDEpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB3YXYtPm9mZnNldCArPSAxMjsKKyAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICAgICAgYnVmID0gTlVMTDsKKyAgICAgICAgICAgICAgaWYgKGRhdGFfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJlcyA9CisgICAgICAgICAgICAgICAgICAgICAgICBnc3RfcGFkX3B1bGxfcmFuZ2UgKHdhdi0+c2lua3BhZCwgd2F2LT5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9zaXplLCAmYnVmKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgICBnb3RvIGhlYWRlcl9yZWFkX2Vycm9yOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGF0YV9zaXplID4gMCkgeworICAgICAgICAgICAgICAvKiBwYXJzZSB0YWdzICovCisgICAgICAgICAgICAgIGdzdF9yaWZmX3BhcnNlX2luZm8gKEdTVF9FTEVNRU5UICh3YXYpLCBidWYsICZuZXcpOworICAgICAgICAgICAgICBpZiAobmV3KSB7CisgICAgICAgICAgICAgICAgR3N0VGFnTGlzdCAqb2xkID0gd2F2LT50YWdzOworICAgICAgICAgICAgICAgIHdhdi0+dGFncyA9CisgICAgICAgICAgICAgICAgICAgIGdzdF90YWdfbGlzdF9tZXJnZSAob2xkLCBuZXcsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSk7CisgICAgICAgICAgICAgICAgaWYgKG9sZCkKKyAgICAgICAgICAgICAgICAgIGdzdF90YWdfbGlzdF91bnJlZiAob2xkKTsKKyAgICAgICAgICAgICAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKG5ldyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICAgICAgd2F2LT5vZmZzZXQgKz0gR1NUX1JPVU5EX1VQXzIgKGRhdGFfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBHU1RfUklGRl9MSVNUX2FkdGw6eworICAgICAgICAgICAgY29uc3QgZ2ludCBkYXRhX3NpemUgPSBzaXplIC0gNDsKKworICAgICAgICAgICAgR1NUX0lORk9fT0JKRUNUICh3YXYsICJIYXZlICdhZHRsJyBMSVNULCBzaXplICV1IiwgZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGlmICh3YXYtPnN0cmVhbWluZykgeworICAgICAgICAgICAgICBjb25zdCBndWludDggKmRhdGEgPSBOVUxMOworCisgICAgICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoICh3YXYtPmFkYXB0ZXIsIDEyKTsKKyAgICAgICAgICAgICAgd2F2LT5vZmZzZXQgKz0gMTI7CisgICAgICAgICAgICAgIGRhdGEgPSBnc3RfYWRhcHRlcl9tYXAgKHdhdi0+YWRhcHRlciwgZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgZ3N0X3dhdnBhcnNlX2FkdGxfY2h1bmsgKHdhdiwgZGF0YSwgZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKHdhdi0+YWRhcHRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgICAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgICAgICBidWYgPSBOVUxMOworICAgICAgICAgICAgICB3YXYtPm9mZnNldCArPSAxMjsKKyAgICAgICAgICAgICAgaWYgKChyZXMgPQorICAgICAgICAgICAgICAgICAgICAgIGdzdF9wYWRfcHVsbF9yYW5nZSAod2F2LT5zaW5rcGFkLCB3YXYtPm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9zaXplLCAmYnVmKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgZ290byBoZWFkZXJfcmVhZF9lcnJvcjsKKyAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgICAgICAgICAgZ3N0X3dhdnBhcnNlX2FkdGxfY2h1bmsgKHdhdiwgKGNvbnN0IGd1aW50OCAqKSBtYXAuZGF0YSwKKyAgICAgICAgICAgICAgICAgIGRhdGFfc2l6ZSk7CisgICAgICAgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3YXYtPm9mZnNldCArPSBHU1RfUk9VTkRfVVBfMiAoZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh3YXYsICJJZ25vcmluZyBMSVNUIGNodW5rICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAobHRhZykpOworICAgICAgICAgICAgaWYgKCFnc3Rfd2F2ZXBhcnNlX2lnbm9yZV9jaHVuayAod2F2LCBidWYsIHRhZywgc2l6ZSkpCisgICAgICAgICAgICAgIC8qIG5lZWQgbW9yZSBkYXRhICovCisgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBHU1RfUklGRl9UQUdfY3VlOnsKKyAgICAgICAgY29uc3QgZ3VpbnQgZGF0YV9zaXplID0gc2l6ZTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJIYXZlICdjdWUnIFRBRywgc2l6ZSA6ICV1IiwgZGF0YV9zaXplKTsKKyAgICAgICAgaWYgKHdhdi0+c3RyZWFtaW5nKSB7CisgICAgICAgICAgY29uc3QgZ3VpbnQ4ICpkYXRhID0gTlVMTDsKKworICAgICAgICAgIGlmICghZ3N0X3dhdnBhcnNlX3BlZWtfY2h1bmsgKHdhdiwgJnRhZywgJnNpemUpKSB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoICh3YXYtPmFkYXB0ZXIsIDgpOworICAgICAgICAgIHdhdi0+b2Zmc2V0ICs9IDg7CisgICAgICAgICAgZGF0YSA9IGdzdF9hZGFwdGVyX21hcCAod2F2LT5hZGFwdGVyLCBkYXRhX3NpemUpOworICAgICAgICAgIGlmICghZ3N0X3dhdnBhcnNlX2N1ZV9jaHVuayAod2F2LCBkYXRhLCBkYXRhX3NpemUpKSB7CisgICAgICAgICAgICBnb3RvIGhlYWRlcl9yZWFkX2Vycm9yOworICAgICAgICAgIH0KKyAgICAgICAgICBnc3RfYWRhcHRlcl91bm1hcCAod2F2LT5hZGFwdGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgICAgICAgIHdhdi0+b2Zmc2V0ICs9IDg7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICBidWYgPSBOVUxMOworICAgICAgICAgIGlmICgocmVzID0KKyAgICAgICAgICAgICAgICAgIGdzdF9wYWRfcHVsbF9yYW5nZSAod2F2LT5zaW5rcGFkLCB3YXYtPm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhX3NpemUsICZidWYpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgIGdvdG8gaGVhZGVyX3JlYWRfZXJyb3I7CisgICAgICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgICAgICBpZiAoIWdzdF93YXZwYXJzZV9jdWVfY2h1bmsgKHdhdiwgKGNvbnN0IGd1aW50OCAqKSBtYXAuZGF0YSwKKyAgICAgICAgICAgICAgICAgIGRhdGFfc2l6ZSkpIHsKKyAgICAgICAgICAgIGdvdG8gaGVhZGVyX3JlYWRfZXJyb3I7CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSA9IEdTVF9ST1VORF9VUF8yIChzaXplKTsKKyAgICAgICAgaWYgKHdhdi0+c3RyZWFtaW5nKSB7CisgICAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKHdhdi0+YWRhcHRlciwgc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgfQorICAgICAgICBzaXplID0gR1NUX1JPVU5EX1VQXzIgKHNpemUpOworICAgICAgICB3YXYtPm9mZnNldCArPSBzaXplOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgR1NUX1JJRkZfVEFHX3NtcGw6eworICAgICAgICBjb25zdCBnaW50IGRhdGFfc2l6ZSA9IHNpemU7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiSGF2ZSAnc21wbCcgVEFHLCBzaXplIDogJXUiLCBkYXRhX3NpemUpOworICAgICAgICBpZiAod2F2LT5zdHJlYW1pbmcpIHsKKyAgICAgICAgICBjb25zdCBndWludDggKmRhdGEgPSBOVUxMOworCisgICAgICAgICAgaWYgKCFnc3Rfd2F2cGFyc2VfcGVla19jaHVuayAod2F2LCAmdGFnLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICB9CisgICAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKHdhdi0+YWRhcHRlciwgOCk7CisgICAgICAgICAgd2F2LT5vZmZzZXQgKz0gODsKKyAgICAgICAgICBkYXRhID0gZ3N0X2FkYXB0ZXJfbWFwICh3YXYtPmFkYXB0ZXIsIGRhdGFfc2l6ZSk7CisgICAgICAgICAgaWYgKCFnc3Rfd2F2cGFyc2Vfc21wbF9jaHVuayAod2F2LCBkYXRhLCBkYXRhX3NpemUpKSB7CisgICAgICAgICAgICBnb3RvIGhlYWRlcl9yZWFkX2Vycm9yOworICAgICAgICAgIH0KKyAgICAgICAgICBnc3RfYWRhcHRlcl91bm1hcCAod2F2LT5hZGFwdGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgICAgICAgIHdhdi0+b2Zmc2V0ICs9IDg7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICBidWYgPSBOVUxMOworICAgICAgICAgIGlmICgocmVzID0KKyAgICAgICAgICAgICAgICAgIGdzdF9wYWRfcHVsbF9yYW5nZSAod2F2LT5zaW5rcGFkLCB3YXYtPm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhX3NpemUsICZidWYpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgIGdvdG8gaGVhZGVyX3JlYWRfZXJyb3I7CisgICAgICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgICAgICBpZiAoIWdzdF93YXZwYXJzZV9zbXBsX2NodW5rICh3YXYsIChjb25zdCBndWludDggKikgbWFwLmRhdGEsCisgICAgICAgICAgICAgICAgICBkYXRhX3NpemUpKSB7CisgICAgICAgICAgICBnb3RvIGhlYWRlcl9yZWFkX2Vycm9yOworICAgICAgICAgIH0KKyAgICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgICAgICB9CisgICAgICAgIHNpemUgPSBHU1RfUk9VTkRfVVBfMiAoc2l6ZSk7CisgICAgICAgIGlmICh3YXYtPnN0cmVhbWluZykgeworICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoICh3YXYtPmFkYXB0ZXIsIHNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSA9IEdTVF9ST1VORF9VUF8yIChzaXplKTsKKyAgICAgICAgd2F2LT5vZmZzZXQgKz0gc2l6ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHdhdiwgIklnbm9yaW5nIGNodW5rICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTICh0YWcpKTsKKyAgICAgICAgaWYgKCFnc3Rfd2F2ZXBhcnNlX2lnbm9yZV9jaHVuayAod2F2LCBidWYsIHRhZywgc2l6ZSkpCisgICAgICAgICAgLyogbmVlZCBtb3JlIGRhdGEgKi8KKyAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICh1cHN0cmVhbV9zaXplICYmICh3YXYtPm9mZnNldCA+PSB1cHN0cmVhbV9zaXplKSkgeworICAgICAgLyogTm93IHdlIGFyZSBnb25lIHRocm91Z2ggdGhlIHdob2xlIGZpbGUgKi8KKyAgICAgIGdvdGRhdGEgPSBUUlVFOworICAgIH0KKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgIkZpbmlzaGVkIHBhcnNpbmcgaGVhZGVycyIpOworCisgIGlmICh3YXYtPmJwcyA8PSAwICYmIHdhdi0+ZmFjdCkgeworI2lmIDAKKyAgICAvKiBub3QgYSBnb29kIGlkZWEsIGFzIGZvciBlbWJlZGRlZCBtcDIvbXAzIHdlIHNldCBicHMgdG8gMCBlYXJsaWVyICovCisgICAgd2F2LT5icHMgPQorICAgICAgICAoZ3VpbnQzMikgZ3N0X3V0aWxfdWludDY0X3NjYWxlICgoZ3VpbnQ2NCkgd2F2LT5yYXRlLCB3YXYtPmRhdGFzaXplLAorICAgICAgICAoZ3VpbnQ2NCkgd2F2LT5mYWN0KTsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHdhdiwgImNhbGN1bGF0ZWQgYnBzIDogJXUsIGVuYWJsaW5nIFZCUiIsIHdhdi0+YnBzKTsKKyNlbmRpZgorICAgIHdhdi0+dmJyID0gVFJVRTsKKyAgfQorCisgIGlmIChnc3Rfd2F2cGFyc2VfY2FsY3VsYXRlX2R1cmF0aW9uICh3YXYpKSB7CisgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJndhdi0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgICBpZiAoIXdhdi0+aWdub3JlX2xlbmd0aCkKKyAgICAgIHdhdi0+c2VnbWVudC5kdXJhdGlvbiA9IHdhdi0+ZHVyYXRpb247CisgICAgaWYgKCF3YXYtPnRvYykKKyAgICAgIGdzdF93YXZwYXJzZV9jcmVhdGVfdG9jICh3YXYpOworICB9IGVsc2UgeworICAgIC8qIG5vIGJpdHJhdGUsIGxldCBkb3duc3RyZWFtIHBlZXIgZG8gdGhlIG1hdGgsIHdlJ2xsIGZlZWQgaXQgYnl0ZXMuICovCisgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJndhdi0+c2VnbWVudCwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgICAgaWYgKCF3YXYtPmlnbm9yZV9sZW5ndGgpCisgICAgICB3YXYtPnNlZ21lbnQuZHVyYXRpb24gPSB3YXYtPmRhdGFzaXplOworICB9CisKKyAgLyogbm93IHdlIGhhdmUgYWxsIHRoZSBpbmZvIHRvIHBlcmZvcm0gYSBwZW5kaW5nIHNlZWsgaWYgYW55LCBpZiBubworICAgKiBldmVudCwgdGhpcyB3aWxsIHN0aWxsIGRvIHRoZSByaWdodCB0aGluZyBhbmQgaXQgd2lsbCBhbHNvIHNlbmQKKyAgICogdGhlIHJpZ2h0IG5ld3NlZ21lbnQgZXZlbnQgZG93bnN0cmVhbS4gKi8KKyAgZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2VlayAod2F2LCB3YXYtPnNlZWtfZXZlbnQpOworICAvKiByZW1vdmUgcGVuZGluZyBldmVudCAqLworICBnc3RfZXZlbnRfcmVwbGFjZSAoJndhdi0+c2Vla19ldmVudCwgTlVMTCk7CisKKyAgLyogd2UganVzdCBzdGFydGVkLCB3ZSBhcmUgZGlzY29udCAqLworICB3YXYtPmRpc2NvbnQgPSBUUlVFOworCisgIHdhdi0+c3RhdGUgPSBHU1RfV0FWUEFSU0VfREFUQTsKKworICAvKiBkZXRlcm1pbmUgcmVhc29uYWJsZSBtYXggYnVmZmVyIHNpemUsCisgICAqIHRoYXQgaXMsIGJ1ZmZlcnMgbm90IHRvbyBzbWFsbCBlaXRoZXIgc2l6ZSBvciB0aW1lIHdpc2UKKyAgICogc28gd2UgZG8gbm90IGVuZCB1cCB3aXRoIHRvbyBtYW55IG9mIHRoZW0gKi8KKyAgLyogdmFyIGFidXNlICovCisgIGlmIChnc3Rfd2F2cGFyc2VfdGltZV90b19ieXRlcG9zICh3YXYsIDQwICogR1NUX01TRUNPTkQsICZ1cHN0cmVhbV9zaXplKSkKKyAgICB3YXYtPm1heF9idWZfc2l6ZSA9IHVwc3RyZWFtX3NpemU7CisgIGVsc2UKKyAgICB3YXYtPm1heF9idWZfc2l6ZSA9IDA7CisgIHdhdi0+bWF4X2J1Zl9zaXplID0gTUFYICh3YXYtPm1heF9idWZfc2l6ZSwgTUFYX0JVRkZFUl9TSVpFKTsKKyAgaWYgKHdhdi0+YmxvY2thbGlnbiA+IDApCisgICAgd2F2LT5tYXhfYnVmX3NpemUgLT0gKHdhdi0+bWF4X2J1Zl9zaXplICUgd2F2LT5ibG9ja2FsaWduKTsKKworICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJtYXggYnVmZmVyIHNpemUgJXUiLCB3YXYtPm1heF9idWZfc2l6ZSk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIC8qIEVSUk9SICovCitleGl0OgorICB7CisgICAgZ19mcmVlIChjb2RlY19uYW1lKTsKKyAgICBnX2ZyZWUgKGhlYWRlcik7CisgICAgaWYgKGNhcHMpCisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorZmFpbDoKKyAgeworICAgIHJlcyA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZXhpdDsKKyAgfQorcGFyc2VfaGVhZGVyX2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHdhdiwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAoIkNvdWxkbid0IHBhcnNlIGF1ZGlvIGhlYWRlciIpKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KK25vX2NoYW5uZWxzOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHdhdiwgU1RSRUFNLCBGQUlMRUQsIChOVUxMKSwKKyAgICAgICAgKCJTdHJlYW0gY2xhaW1zIHRvIGNvbnRhaW4gbm8gY2hhbm5lbHMgLSBpbnZhbGlkIGRhdGEiKSk7CisgICAgZ290byBmYWlsOworICB9Citub19yYXRlOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHdhdiwgU1RSRUFNLCBGQUlMRUQsIChOVUxMKSwKKyAgICAgICAgKCJTdHJlYW0gd2l0aCBzYW1wbGVfcmF0ZSA9PSAwIC0gaW52YWxpZCBkYXRhIikpOworICAgIGdvdG8gZmFpbDsKKyAgfQoraW52YWxpZF9ibG9ja2FsaWduOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHdhdiwgU1RSRUFNLCBGQUlMRUQsIChOVUxMKSwKKyAgICAgICAgKCJTdHJlYW0gY2xhaW1zIGJsb2NrYWxpZ24gPSAldSwgd2hpY2ggaXMgbW9yZSB0aGFuICV1IC0gaW52YWxpZCBkYXRhIiwKKyAgICAgICAgICAgIHdhdi0+YmxvY2thbGlnbiwgd2F2LT5jaGFubmVscyAqICgod2F2LT5kZXB0aCArIDcpIC8gOCkpKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KK2ludmFsaWRfYnBzOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHdhdiwgU1RSRUFNLCBGQUlMRUQsIChOVUxMKSwKKyAgICAgICAgKCJTdHJlYW0gY2xhaW1zIGF2X2JzcCA9ICV1LCB3aGljaCBpcyBtb3JlIHRoYW4gJXUgLSBpbnZhbGlkIGRhdGEiLAorICAgICAgICAgICAgd2F2LT5hdl9icHMsIHdhdi0+YmxvY2thbGlnbiAqIHdhdi0+cmF0ZSkpOworICAgIGdvdG8gZmFpbDsKKyAgfQorbm9fYnl0ZXNfcGVyX3NhbXBsZToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh3YXYsIFNUUkVBTSwgRkFJTEVELCAoTlVMTCksCisgICAgICAgICgiQ291bGQgbm90IGNhbHVjbGF0ZSBieXRlcyBwZXIgc2FtcGxlIC0gaW52YWxpZCBkYXRhIikpOworICAgIGdvdG8gZmFpbDsKKyAgfQordW5rbm93bl9mb3JtYXQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAod2F2LCBTVFJFQU0sIFRZUEVfTk9UX0ZPVU5ELCAoTlVMTCksCisgICAgICAgICgiTm8gY2FwcyBmb3VuZCBmb3IgZm9ybWF0IDB4JXgsICV1IGNoYW5uZWxzLCAldSBIeiIsCisgICAgICAgICAgICB3YXYtPmZvcm1hdCwgd2F2LT5jaGFubmVscywgd2F2LT5yYXRlKSk7CisgICAgZ290byBmYWlsOworICB9CitoZWFkZXJfcmVhZF9lcnJvcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh3YXYsIFNUUkVBTSwgREVNVVgsIChOVUxMKSwKKyAgICAgICAgKCJDb3VsZG4ndCByZWFkIGluIGhlYWRlciAlZCAoJXMpIiwgcmVzLCBnc3RfZmxvd19nZXRfbmFtZSAocmVzKSkpOworICAgIGdvdG8gZmFpbDsKKyAgfQorfQorCisvKgorICogUmVhZCBXQVYgZmlsZSB0YWcgd2hlbiBzdHJlYW1pbmcKKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF93YXZwYXJzZV9wYXJzZV9zdHJlYW1faW5pdCAoR3N0V2F2UGFyc2UgKiB3YXYpCit7CisgIGlmIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHdhdi0+YWRhcHRlcikgPj0gMTIpIHsKKyAgICBHc3RCdWZmZXIgKnRtcDsKKworICAgIC8qIF90YWtlIGZsdXNoZXMgdGhlIGRhdGEgKi8KKyAgICB0bXAgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAod2F2LT5hZGFwdGVyLCAxMik7CisKKyAgICBHU1RfREVCVUcgKCJQYXJzaW5nIHdhdiBoZWFkZXIiKTsKKyAgICBpZiAoIWdzdF93YXZwYXJzZV9wYXJzZV9maWxlX2hlYWRlciAoR1NUX0VMRU1FTlRfQ0FTVCAod2F2KSwgdG1wKSkKKyAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKworICAgIHdhdi0+b2Zmc2V0ICs9IDEyOworICAgIC8qIEdvIHRvIG5leHQgc3RhdGUgKi8KKyAgICB3YXYtPnN0YXRlID0gR1NUX1dBVlBBUlNFX0hFQURFUjsKKyAgfQorICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKKy8qIGhhbmRsZSBhbiBldmVudCBzZW50IGRpcmVjdGx5IHRvIHRoZSBlbGVtZW50LgorICoKKyAqIFRoaXMgZXZlbnQgY2FuIGJlIHNlbnQgZWl0aGVyIGluIHRoZSBSRUFEWSBzdGF0ZSBvciB0aGUKKyAqID5SRUFEWSBzdGF0ZS4gVGhlIG9ubHkgZXZlbnQgb2YgaW50ZXJlc3QgcmVhbGx5IGlzIHRoZSBzZWVrCisgKiBldmVudC4KKyAqCisgKiBJbiB0aGUgUkVBRFkgc3RhdGUgd2UgY2FuIG9ubHkgc3RvcmUgdGhlIGV2ZW50IGFuZCB0cnkgdG8KKyAqIHJlc3BlY3QgaXQgd2hlbiBnb2luZyB0byBQQVVTRUQuIFdlIGFzc3VtZSB3ZSBhcmUgaW4gdGhlCisgKiBSRUFEWSBzdGF0ZSB3aGVuIG91ciBwYXJzaW5nIHN0YXRlICE9IEdTVF9XQVZQQVJTRV9EQVRBLgorICoKKyAqIFdoZW4gd2UgYXJlIHN0ZWFtaW5nLCB3ZSBjYW4gc2ltcGx5IHBlcmZvcm0gdGhlIHNlZWsgcmlnaHQKKyAqIGF3YXkuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhcnNlX3NlbmRfZXZlbnQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RXYXZQYXJzZSAqd2F2ID0gR1NUX1dBVlBBUlNFIChlbGVtZW50KTsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAicmVjZWl2ZWQgZXZlbnQgJXMiLCBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1NFRUs6CisgICAgICBpZiAod2F2LT5zdGF0ZSA9PSBHU1RfV0FWUEFSU0VfREFUQSkgeworICAgICAgICAvKiB3ZSBjYW4gaGFuZGxlIHRoZSBzZWVrIGRpcmVjdGx5IHdoZW4gc3RyZWFtaW5nIGRhdGEgKi8KKyAgICAgICAgcmVzID0gZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2VlayAod2F2LCBldmVudCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJxdWV1aW5nIHNlZWsgZm9yIGxhdGVyIik7CisKKyAgICAgICAgZ3N0X2V2ZW50X3JlcGxhY2UgKCZ3YXYtPnNlZWtfZXZlbnQsIGV2ZW50KTsKKworICAgICAgICAvKiB3ZSBhbHdheXMgcmV0dXJuIHRydWUgKi8KKyAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2cGFyc2VfaGF2ZV9kdHNfY2FwcyAoY29uc3QgR3N0Q2FwcyAqIGNhcHMsIEdzdFR5cGVGaW5kUHJvYmFiaWxpdHkgcHJvYikKK3sKKyAgR3N0U3RydWN0dXJlICpzOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiYXVkaW8veC1kdHMiKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIC8qIHR5cGVmaW5kIGJlaGF2aW9yIGZvciBEVFM6CisgICAqICBNQVhJTVVNOiBtdWx0aXBsZSBmcmFtZSBzeW5jcyBkZXRlY3RlZCwgY2VydGFpbmx5IERUUworICAgKiAgTElLRUxZOiBzaW5nbGUgZnJhbWUgc3luYyBhdCBvZmZzZXQgMC4gIE1heWJlIERUUz8KKyAgICogIFBPU1NJQkxFOiBzaW5nbGUgZnJhbWUgc3luYywgbm90IGF0IG9mZnNldCAwLiAgSGlnaGx5IHVubGlrZWx5CisgICAqICAgIHRvIGJlIERUUy4gICovCisgIGlmIChwcm9iID4gR1NUX1RZUEVfRklORF9MSUtFTFkpCisgICAgcmV0dXJuIFRSVUU7CisgIGlmIChwcm9iIDw9IEdTVF9UWVBFX0ZJTkRfUE9TU0lCTEUpCisgICAgcmV0dXJuIEZBTFNFOworICAvKiBmb3IgbWF5YmUsIGNoZWNrIGZvciBhdCBsZWFzdCBhIHZhbGlkLWxvb2tpbmcgcmF0ZSBhbmQgY2hhbm5lbHMgKi8KKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgImNoYW5uZWxzIikpCisgICAgcmV0dXJuIEZBTFNFOworICAvKiBhbmQgZm9yIGV4dHJhIGFzc3VyYW5jZSB3ZSBjb3VsZCBhbHNvIGNoZWNrIHRoZSByYXRlIGZyb20gdGhlIERUUyBmcmFtZQorICAgKiBhZ2FpbnN0IHRoZSBvbmUgaW4gdGhlIHdhdiBoZWFkZXIsIGJ1dCBmb3Igbm93IGxldCdzIG5vdCBkbyB0aGF0ICovCisgIHJldHVybiBnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgInJhdGUiKTsKK30KKworc3RhdGljIEdzdFRhZ0xpc3QgKgorZ3N0X3dhdnBhcnNlX2dldF91cHN0cmVhbV90YWdzIChHc3RXYXZQYXJzZSAqIHdhdiwgR3N0VGFnU2NvcGUgc2NvcGUpCit7CisgIEdzdFRhZ0xpc3QgKnRhZ3MgPSBOVUxMOworICBHc3RFdmVudCAqZXY7CisgIGdpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKChldiA9IGdzdF9wYWRfZ2V0X3N0aWNreV9ldmVudCAod2F2LT5zaW5rcGFkLCBHU1RfRVZFTlRfVEFHLCBpKyspKSkgeworICAgIGdzdF9ldmVudF9wYXJzZV90YWcgKGV2LCAmdGFncyk7CisgICAgaWYgKHRhZ3MgIT0gTlVMTCAmJiBnc3RfdGFnX2xpc3RfZ2V0X3Njb3BlICh0YWdzKSA9PSBzY29wZSkgeworICAgICAgdGFncyA9IGdzdF90YWdfbGlzdF9jb3B5ICh0YWdzKTsKKyAgICAgIGdzdF90YWdfbGlzdF9yZW1vdmVfdGFnICh0YWdzLCBHU1RfVEFHX0NPTlRBSU5FUl9GT1JNQVQpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgdGFncyA9IE5VTEw7CisgICAgZ3N0X2V2ZW50X3VucmVmIChldik7CisgIH0KKyAgcmV0dXJuIHRhZ3M7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFyc2VfYWRkX3NyY19wYWQgKEdzdFdhdlBhcnNlICogd2F2LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgR3N0VGFnTGlzdCAqdGFncywgKnV0YWdzOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgImFkZGluZyBzcmMgcGFkIik7CisKKyAgZ19hc3NlcnQgKHdhdi0+Y2FwcyAhPSBOVUxMKTsKKworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAod2F2LT5jYXBzLCAwKTsKKyAgaWYgKHMgJiYgZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgImF1ZGlvL3gtcmF3IikgJiYgYnVmICE9IE5VTEwpIHsKKyAgICBHc3RUeXBlRmluZFByb2JhYmlsaXR5IHByb2I7CisgICAgR3N0Q2FwcyAqdGZfY2FwczsKKworICAgIHRmX2NhcHMgPSBnc3RfdHlwZV9maW5kX2hlbHBlcl9mb3JfYnVmZmVyIChHU1RfT0JKRUNUICh3YXYpLCBidWYsICZwcm9iKTsKKyAgICBpZiAodGZfY2FwcyAhPSBOVUxMKSB7CisgICAgICBHU1RfTE9HICgidHlwZWZpbmQgY2FwcyA9ICUiIEdTVF9QVFJfRk9STUFUICIsIFA9JWQiLCB0Zl9jYXBzLCBwcm9iKTsKKyAgICAgIGlmIChnc3Rfd2F2cGFyc2VfaGF2ZV9kdHNfY2FwcyAodGZfY2FwcywgcHJvYikpIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUICh3YXYsICJGb3VuZCBEVFMgbWFya2VyIGluIGZpbGUgbWFya2VkIGFzIHJhdyBQQ00iKTsKKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKHdhdi0+Y2Fwcyk7CisgICAgICAgIHdhdi0+Y2FwcyA9IHRmX2NhcHM7CisKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZCAod2F2LT50YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgICBHU1RfVEFHX0FVRElPX0NPREVDLCAiZHRzIiwgTlVMTCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJmb3VuZCBjYXBzICUiIEdTVF9QVFJfRk9STUFUICIgZm9yIHN0cmVhbSAiCisgICAgICAgICAgICAibWFya2VkIGFzIHJhdyBQQ00gYXVkaW8sIGJ1dCBpZ25vcmluZyBmb3Igbm93IiwgdGZfY2Fwcyk7CisgICAgICAgIGdzdF9jYXBzX3VucmVmICh0Zl9jYXBzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBnc3RfcGFkX3NldF9jYXBzICh3YXYtPnNyY3BhZCwgd2F2LT5jYXBzKTsKKworICBpZiAod2F2LT5zdGFydF9zZWdtZW50KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiU2VuZCBzdGFydCBzZWdtZW50IGV2ZW50IG9uIG5ld3BhZCIpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAod2F2LT5zcmNwYWQsIHdhdi0+c3RhcnRfc2VnbWVudCk7CisgICAgd2F2LT5zdGFydF9zZWdtZW50ID0gTlVMTDsKKyAgfQorCisgIC8qIHVwc3RyZWFtIHRhZ3MsIGUuZy4gZnJvbSBpZDMvYXBlIHRhZyBiZWZvcmUgdGhlIHdhdiBmaWxlOyBhc3N1bWUgZm9yIG5vdworICAgKiB0aGF0IHRoZXJlJ2xsIGJlIG9ubHkgb25lIHNjb3BlL3R5cGUgb2YgdGFnIGxpc3QgZnJvbSB1cHN0cmVhbSwgaWYgYW55ICovCisgIHV0YWdzID0gZ3N0X3dhdnBhcnNlX2dldF91cHN0cmVhbV90YWdzICh3YXYsIEdTVF9UQUdfU0NPUEVfR0xPQkFMKTsKKyAgaWYgKHV0YWdzID09IE5VTEwpCisgICAgdXRhZ3MgPSBnc3Rfd2F2cGFyc2VfZ2V0X3Vwc3RyZWFtX3RhZ3MgKHdhdiwgR1NUX1RBR19TQ09QRV9TVFJFQU0pOworCisgIC8qIGlmIHRoZXJlJ3MgYSB0YWcgdXBzdHJlYW0gaXQncyBwcm9iYWJseSBiZWVuIGFkZGVkIHRvIG92ZXJyaWRlIHRoZQorICAgKiB0YWdzIGZyb20gaW5zaWRlIHRoZSB3YXYgaGVhZGVyLCBzbyBrZWVwIHVwc3RyZWFtIHRhZ3MgaWYgaW4gZG91YnQgKi8KKyAgdGFncyA9IGdzdF90YWdfbGlzdF9tZXJnZSAodXRhZ3MsIHdhdi0+dGFncywgR1NUX1RBR19NRVJHRV9LRUVQKTsKKworICBpZiAod2F2LT50YWdzICE9IE5VTEwpIHsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHdhdi0+dGFncyk7CisgICAgd2F2LT50YWdzID0gTlVMTDsKKyAgfQorCisgIGlmICh1dGFncyAhPSBOVUxMKQorICAgIGdzdF90YWdfbGlzdF91bnJlZiAodXRhZ3MpOworCisgIC8qIHNlbmQgdGFncyBkb3duc3RyZWFtLCBpZiBhbnkgKi8KKyAgaWYgKHRhZ3MgIT0gTlVMTCkKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHdhdi0+c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3RhZyAodGFncykpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhIChHc3RXYXZQYXJzZSAqIHdhdikKK3sKKyAgR3N0QnVmZmVyICpidWYgPSBOVUxMOworICBHc3RGbG93UmV0dXJuIHJlcyA9IEdTVF9GTE9XX09LOworICBndWludDY0IGRlc2lyZWQsIG9idGFpbmVkOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBuZXh0X3RpbWVzdGFtcCwgZHVyYXRpb247CisgIGd1aW50NjQgcG9zLCBuZXh0cG9zOworCitpdGVyYXRlX2FkYXB0ZXI6CisgIEdTVF9MT0dfT0JKRUNUICh3YXYsCisgICAgICAib2Zmc2V0OiAlIiBHX0dJTlQ2NF9GT1JNQVQgIiAsIGVuZDogJSIgR19HSU5UNjRfRk9STUFUICIgLCBkYXRhbGVmdDogJSIKKyAgICAgIEdfR0lOVDY0X0ZPUk1BVCwgd2F2LT5vZmZzZXQsIHdhdi0+ZW5kX29mZnNldCwgd2F2LT5kYXRhbGVmdCk7CisKKyAgaWYgKCh3YXYtPmRhdGFsZWZ0ID09IDAgfHwgd2F2LT5kYXRhbGVmdCA8IHdhdi0+YmxvY2thbGlnbikpIHsKKyAgICAvKiBJbiBjYXNlIGNodW5rIHNpemUgaXMgbm90IGRlY2xhcmVkIGluIHRoZSBiZWdpbmluZyBnZXQgc2l6ZSBmcm9tIHRoZQorICAgICAqIGZpbGUgc2l6ZSBkaXJlY3RseSAqLworICAgIGlmICh3YXYtPmNodW5rX3NpemUgPT0gMCkgeworICAgICAgZ2ludDY0IHVwc3RyZWFtX3NpemUgPSAwOworCisgICAgICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIGZpbGUgICAqLworICAgICAgaWYgKCFnc3RfcGFkX3BlZXJfcXVlcnlfZHVyYXRpb24gKHdhdi0+c2lua3BhZCwgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICAgICAgICAgICAgJnVwc3RyZWFtX3NpemUpKQorICAgICAgICBnb3RvIGZvdW5kX2VvczsKKworICAgICAgaWYgKHVwc3RyZWFtX3NpemUgPCB3YXYtPm9mZnNldCArIHdhdi0+ZGF0YXN0YXJ0KQorICAgICAgICBnb3RvIGZvdW5kX2VvczsKKworICAgICAgLyogSWYgZmlsZSBoYXMgdXBkYXRlZCBzaW5jZSB0aGUgYmVnZ2luaW5nIGNvbnRpbnVlIHJlYWRpbmcgdGhlIGZpbGUgKi8KKyAgICAgIHdhdi0+ZGF0YWxlZnQgPSB1cHN0cmVhbV9zaXplIC0gd2F2LT5vZmZzZXQgLSB3YXYtPmRhdGFzdGFydDsKKyAgICAgIHdhdi0+ZW5kX29mZnNldCA9IHVwc3RyZWFtX3NpemU7CisKKyAgICAgIC8qIEdldCB0aGUgbmV4dCBuIGJ5dGVzIGFuZCBvdXRwdXQgdGhlbSwgaWYgd2UgY2FuICovCisgICAgICBpZiAod2F2LT5kYXRhbGVmdCA9PSAwIHx8IHdhdi0+ZGF0YWxlZnQgPCB3YXYtPmJsb2NrYWxpZ24pCisgICAgICAgIGdvdG8gZm91bmRfZW9zOworICAgIH0gZWxzZSB7CisgICAgICBnb3RvIGZvdW5kX2VvczsKKyAgICB9CisgIH0KKworICAvKiBzY2FsZSB0aGUgYW1vdW50IG9mIGRhdGEgYnkgdGhlIHNlZ21lbnQgcmF0ZSBzbyB3ZSBnZXQgZXF1YWwKKyAgICogYW1vdW50cyBvZiBkYXRhIHJlZ2FyZGxlc3Mgb2YgdGhlIHBsYXliYWNrIHJhdGUgKi8KKyAgZGVzaXJlZCA9CisgICAgICBNSU4gKGdzdF9ndWludDY0X3RvX2dkb3VibGUgKHdhdi0+ZGF0YWxlZnQpLAorICAgICAgd2F2LT5tYXhfYnVmX3NpemUgKiBBQlMgKHdhdi0+c2VnbWVudC5yYXRlKSk7CisKKyAgaWYgKGRlc2lyZWQgPj0gd2F2LT5ibG9ja2FsaWduICYmIHdhdi0+YmxvY2thbGlnbiA+IDApCisgICAgZGVzaXJlZCAtPSAoZGVzaXJlZCAlIHdhdi0+YmxvY2thbGlnbik7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHdhdiwgIkZldGNoaW5nICUiIEdfR0lOVDY0X0ZPUk1BVCAiIGJ5dGVzIG9mIGRhdGEgIgorICAgICAgImZyb20gdGhlIHNpbmtwYWQiLCBkZXNpcmVkKTsKKworICBpZiAod2F2LT5zdHJlYW1pbmcpIHsKKyAgICBndWludCBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAod2F2LT5hZGFwdGVyKTsKKyAgICBndWludCBleHRyYTsKKworICAgIC8qIGZsdXNoIHNvbWUgYnl0ZXMgaWYgZXZpbCB1cHN0cmVhbSBzZW5kcyBzZWdtZW50IHRoYXQgc3RhcnRzCisgICAgICogYmVmb3JlIGRhdGEgb3IgZG9lcyBpcyBub3Qgc2VuZCBzYW1wbGUgYWxpZ25lZCBzZWdtZW50ICovCisgICAgaWYgKEdfTElLRUxZICh3YXYtPm9mZnNldCA+PSB3YXYtPmRhdGFzdGFydCkpIHsKKyAgICAgIGV4dHJhID0gKHdhdi0+b2Zmc2V0IC0gd2F2LT5kYXRhc3RhcnQpICUgd2F2LT5ieXRlc19wZXJfc2FtcGxlOworICAgIH0gZWxzZSB7CisgICAgICBleHRyYSA9IHdhdi0+ZGF0YXN0YXJ0IC0gd2F2LT5vZmZzZXQ7CisgICAgfQorCisgICAgaWYgKEdfVU5MSUtFTFkgKGV4dHJhKSkgeworICAgICAgZXh0cmEgPSB3YXYtPmJ5dGVzX3Blcl9zYW1wbGUgLSBleHRyYTsKKyAgICAgIGlmIChleHRyYSA8PSBhdmFpbCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJmbHVzaGluZyAldSBieXRlcyB0byBzYW1wbGUgYm91bmRhcnkiLCBleHRyYSk7CisgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoICh3YXYtPmFkYXB0ZXIsIGV4dHJhKTsKKyAgICAgICAgd2F2LT5vZmZzZXQgKz0gZXh0cmE7CisgICAgICAgIHdhdi0+ZGF0YWxlZnQgLT0gZXh0cmE7CisgICAgICAgIGdvdG8gaXRlcmF0ZV9hZGFwdGVyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiZmx1c2hpbmcgJXUgYnl0ZXMiLCBhdmFpbCk7CisgICAgICAgIGdzdF9hZGFwdGVyX2NsZWFyICh3YXYtPmFkYXB0ZXIpOworICAgICAgICB3YXYtPm9mZnNldCArPSBhdmFpbDsKKyAgICAgICAgd2F2LT5kYXRhbGVmdCAtPSBhdmFpbDsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgICAgfQorICAgIH0KKworICAgIGlmIChhdmFpbCA8IGRlc2lyZWQpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUICh3YXYsICJHb3Qgb25seSAldSBieXRlcyBvZiBkYXRhIGZyb20gdGhlIHNpbmtwYWQiLCBhdmFpbCk7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgICAgfQorCisgICAgYnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHdhdi0+YWRhcHRlciwgZGVzaXJlZCk7CisgIH0gZWxzZSB7CisgICAgaWYgKChyZXMgPSBnc3RfcGFkX3B1bGxfcmFuZ2UgKHdhdi0+c2lua3BhZCwgd2F2LT5vZmZzZXQsCisgICAgICAgICAgICAgICAgZGVzaXJlZCwgJmJ1ZikpICE9IEdTVF9GTE9XX09LKQorICAgICAgZ290byBwdWxsX2Vycm9yOworCisgICAgLyogd2UgbWF5IGdldCBhIHNob3J0IGJ1ZmZlciBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlICovCisgICAgaWYgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikgPCBkZXNpcmVkKSB7CisgICAgICBnc2l6ZSBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHdhdiwgIkdvdCBvbmx5ICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMgb2YgZGF0YSIsIHNpemUpOworICAgICAgaWYgKHNpemUgPj0gd2F2LT5ibG9ja2FsaWduKSB7CisgICAgICAgIGlmICh3YXYtPmJsb2NrYWxpZ24gPiAwKSB7CisgICAgICAgICAgYnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChidWYpOworICAgICAgICAgIGdzdF9idWZmZXJfcmVzaXplIChidWYsIDAsIHNpemUgLSAoc2l6ZSAlIHdhdi0+YmxvY2thbGlnbikpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICBnb3RvIGZvdW5kX2VvczsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBvYnRhaW5lZCA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisKKyAgLyogb3VyIHBvc2l0aW9ucyBpbiBieXRlcyAqLworICBwb3MgPSB3YXYtPm9mZnNldCAtIHdhdi0+ZGF0YXN0YXJ0OworICBuZXh0cG9zID0gcG9zICsgb2J0YWluZWQ7CisKKyAgLyogdXBkYXRlIG9mZnNldHMsIGRvZXMgbm90IG92ZXJmbG93LiAqLworICBidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKGJ1Zik7CisgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpID0gcG9zIC8gd2F2LT5ieXRlc19wZXJfc2FtcGxlOworICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKGJ1ZikgPSBuZXh0cG9zIC8gd2F2LT5ieXRlc19wZXJfc2FtcGxlOworCisgIC8qIGZpcnN0IGNodW5rIG9mIGRhdGE/IGNyZWF0ZSB0aGUgc291cmNlIHBhZC4gV2UgZG8gdGhpcyBvbmx5IGhlcmUgc28KKyAgICogd2UgY2FuIGRldGVjdCBicm9rZW4gLndhdiBmaWxlcyB3aXRoIGR0cyBkaXNndWlzZWQgYXMgcmF3IFBDTSAoc2lnaCkgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKHdhdi0+Zmlyc3QpKSB7CisgICAgd2F2LT5maXJzdCA9IEZBTFNFOworICAgIC8qIHRoaXMgd2lsbCBhbHNvIHB1c2ggdGhlIHNlZ21lbnQgZXZlbnRzICovCisgICAgZ3N0X3dhdnBhcnNlX2FkZF9zcmNfcGFkICh3YXYsIGJ1Zik7CisgIH0gZWxzZSB7CisgICAgLyogSWYgd2UgaGF2ZSBhIHBlbmRpbmcgc3RhcnQgc2VnbWVudCwgc2VuZCBpdCBub3cuICovCisgICAgaWYgKEdfVU5MSUtFTFkgKHdhdi0+c3RhcnRfc2VnbWVudCAhPSBOVUxMKSkgeworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50ICh3YXYtPnNyY3BhZCwgd2F2LT5zdGFydF9zZWdtZW50KTsKKyAgICAgIHdhdi0+c3RhcnRfc2VnbWVudCA9IE5VTEw7CisgICAgfQorICB9CisKKyAgaWYgKHdhdi0+YnBzID4gMCkgeworICAgIC8qIGFuZCB0aW1lc3RhbXBzIGlmIHdlIGhhdmUgYSBiaXRyYXRlLCBiZSBjYXJlZnVsIGZvciBvdmVyZmxvd3MgKi8KKyAgICB0aW1lc3RhbXAgPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfY2VpbCAocG9zLCBHU1RfU0VDT05ELCAoZ3VpbnQ2NCkgd2F2LT5icHMpOworICAgIG5leHRfdGltZXN0YW1wID0KKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2NlaWwgKG5leHRwb3MsIEdTVF9TRUNPTkQsIChndWludDY0KSB3YXYtPmJwcyk7CisgICAgZHVyYXRpb24gPSBuZXh0X3RpbWVzdGFtcCAtIHRpbWVzdGFtcDsKKworICAgIC8qIHVwZGF0ZSBjdXJyZW50IHJ1bm5pbmcgc2VnbWVudCBwb3NpdGlvbiAqLworICAgIGlmIChHX0xJS0VMWSAobmV4dF90aW1lc3RhbXAgPj0gd2F2LT5zZWdtZW50LnN0YXJ0KSkKKyAgICAgIHdhdi0+c2VnbWVudC5wb3NpdGlvbiA9IG5leHRfdGltZXN0YW1wOworICB9IGVsc2UgaWYgKHdhdi0+ZmFjdCkgeworICAgIGd1aW50NjQgYnBzID0KKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAod2F2LT5kYXRhc2l6ZSwgd2F2LT5yYXRlLCB3YXYtPmZhY3QpOworICAgIC8qIGFuZCB0aW1lc3RhbXBzIGlmIHdlIGhhdmUgYSBiaXRyYXRlLCBiZSBjYXJlZnVsIGZvciBvdmVyZmxvd3MgKi8KKyAgICB0aW1lc3RhbXAgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfY2VpbCAocG9zLCBHU1RfU0VDT05ELCBicHMpOworICAgIG5leHRfdGltZXN0YW1wID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2NlaWwgKG5leHRwb3MsIEdTVF9TRUNPTkQsIGJwcyk7CisgICAgZHVyYXRpb24gPSBuZXh0X3RpbWVzdGFtcCAtIHRpbWVzdGFtcDsKKyAgfSBlbHNlIHsKKyAgICAvKiBubyBiaXRyYXRlLCBhbGwgd2Uga25vdyBpcyB0aGF0IHRoZSBmaXJzdCBzYW1wbGUgaGFzIHRpbWVzdGFtcCAwLCBhbGwKKyAgICAgKiBvdGhlciBwb3NpdGlvbnMgYW5kIGR1cmF0aW9ucyBoYXZlIHVua25vd24gdGltZXN0YW1wLiAqLworICAgIGlmIChwb3MgPT0gMCkKKyAgICAgIHRpbWVzdGFtcCA9IDA7CisgICAgZWxzZQorICAgICAgdGltZXN0YW1wID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICBkdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgLyogdXBkYXRlIGN1cnJlbnQgcnVubmluZyBzZWdtZW50IHBvc2l0aW9uIHdpdGggYnl0ZSBvZmZzZXQgKi8KKyAgICBpZiAoR19MSUtFTFkgKG5leHRwb3MgPj0gd2F2LT5zZWdtZW50LnN0YXJ0KSkKKyAgICAgIHdhdi0+c2VnbWVudC5wb3NpdGlvbiA9IG5leHRwb3M7CisgIH0KKyAgaWYgKChwb3MgPiAwKSAmJiB3YXYtPnZicikgeworICAgIC8qIGRvbid0IHNldCB0aW1lc3RhbXBzIGZvciBWQlIgZmlsZXMgaWYgaXQncyBub3QgdGhlIGZpcnN0IGJ1ZmZlciAqLworICAgIHRpbWVzdGFtcCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICB9CisgIGlmICh3YXYtPmRpc2NvbnQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJtYXJraW5nIERJU0NPTlQiKTsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICB3YXYtPmRpc2NvbnQgPSBGQUxTRTsKKyAgfQorCisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpID0gdGltZXN0YW1wOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpID0gZHVyYXRpb247CisKKyAgR1NUX0xPR19PQkpFQ1QgKHdhdiwKKyAgICAgICJHb3QgYnVmZmVyLiB0aW1lc3RhbXA6JSIgR1NUX1RJTUVfRk9STUFUICIgLCBkdXJhdGlvbjolIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIsIHNpemU6JSIgR19HU0laRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCksCisgICAgICBHU1RfVElNRV9BUkdTIChkdXJhdGlvbiksIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikpOworCisgIGlmICgocmVzID0gZ3N0X3BhZF9wdXNoICh3YXYtPnNyY3BhZCwgYnVmKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBwdXNoX2Vycm9yOworCisgIGlmIChvYnRhaW5lZCA8IHdhdi0+ZGF0YWxlZnQpIHsKKyAgICB3YXYtPm9mZnNldCArPSBvYnRhaW5lZDsKKyAgICB3YXYtPmRhdGFsZWZ0IC09IG9idGFpbmVkOworICB9IGVsc2UgeworICAgIHdhdi0+b2Zmc2V0ICs9IHdhdi0+ZGF0YWxlZnQ7CisgICAgd2F2LT5kYXRhbGVmdCA9IDA7CisgIH0KKworICAvKiBJdGVyYXRlIHVudGlsIG5lZWQgbW9yZSBkYXRhLCBzbyBhZGFwdGVyIHNpemUgd29uJ3QgZ3JvdyAqLworICBpZiAod2F2LT5zdHJlYW1pbmcpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAod2F2LAorICAgICAgICAib2Zmc2V0OiAlIiBHX0dJTlQ2NF9GT1JNQVQgIiAsIGVuZDogJSIgR19HSU5UNjRfRk9STUFULCB3YXYtPm9mZnNldCwKKyAgICAgICAgd2F2LT5lbmRfb2Zmc2V0KTsKKyAgICBnb3RvIGl0ZXJhdGVfYWRhcHRlcjsKKyAgfQorICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SICovCitmb3VuZF9lb3M6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJmb3VuZCBFT1MiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRU9TOworICB9CitwdWxsX2Vycm9yOgorICB7CisgICAgLyogY2hlY2sgaWYgd2UgZ290IEVPUyAqLworICAgIGlmIChyZXMgPT0gR1NUX0ZMT1dfRU9TKQorICAgICAgZ290byBmb3VuZF9lb3M7CisKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHdhdiwKKyAgICAgICAgIkVycm9yIGdldHRpbmcgJSIgR19HSU5UNjRfRk9STUFUICIgYnl0ZXMgZnJvbSB0aGUgIgorICAgICAgICAic2lua3BhZCAoZGF0YWxlZnQgPSAlIiBHX0dJTlQ2NF9GT1JNQVQgIikiLCBkZXNpcmVkLCB3YXYtPmRhdGFsZWZ0KTsKKyAgICByZXR1cm4gcmVzOworICB9CitwdXNoX2Vycm9yOgorICB7CisgICAgR1NUX0lORk9fT0JKRUNUICh3YXYsCisgICAgICAgICJFcnJvciBwdXNoaW5nIG9uIHNyY3BhZCAlczolcywgcmVhc29uICVzLCBpcyBsaW5rZWQ/ID0gJWQiLAorICAgICAgICBHU1RfREVCVUdfUEFEX05BTUUgKHdhdi0+c3JjcGFkKSwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJlcyksCisgICAgICAgIGdzdF9wYWRfaXNfbGlua2VkICh3YXYtPnNyY3BhZCkpOworICAgIHJldHVybiByZXM7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZwYXJzZV9sb29wIChHc3RQYWQgKiBwYWQpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RXYXZQYXJzZSAqd2F2ID0gR1NUX1dBVlBBUlNFIChHU1RfUEFEX1BBUkVOVCAocGFkKSk7CisgIEdzdEV2ZW50ICpldmVudDsKKyAgZ2NoYXIgKnN0cmVhbV9pZDsKKworICBHU1RfTE9HX09CSkVDVCAod2F2LCAicHJvY2VzcyBkYXRhIik7CisKKyAgc3dpdGNoICh3YXYtPnN0YXRlKSB7CisgICAgY2FzZSBHU1RfV0FWUEFSU0VfU1RBUlQ6CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKHdhdiwgIkdTVF9XQVZQQVJTRV9TVEFSVCIpOworICAgICAgaWYgKChyZXQgPSBnc3Rfd2F2cGFyc2Vfc3RyZWFtX2luaXQgKHdhdikpICE9IEdTVF9GTE9XX09LKQorICAgICAgICBnb3RvIHBhdXNlOworCisgICAgICBzdHJlYW1faWQgPQorICAgICAgICAgIGdzdF9wYWRfY3JlYXRlX3N0cmVhbV9pZCAod2F2LT5zcmNwYWQsIEdTVF9FTEVNRU5UX0NBU1QgKHdhdiksIE5VTEwpOworICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoc3RyZWFtX2lkKTsKKyAgICAgIGdzdF9ldmVudF9zZXRfZ3JvdXBfaWQgKGV2ZW50LCBnc3RfdXRpbF9ncm91cF9pZF9uZXh0ICgpKTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAod2F2LT5zcmNwYWQsIGV2ZW50KTsKKyAgICAgIGdfZnJlZSAoc3RyZWFtX2lkKTsKKworICAgICAgd2F2LT5zdGF0ZSA9IEdTVF9XQVZQQVJTRV9IRUFERVI7CisgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKworICAgIGNhc2UgR1NUX1dBVlBBUlNFX0hFQURFUjoKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAod2F2LCAiR1NUX1dBVlBBUlNFX0hFQURFUiIpOworICAgICAgaWYgKChyZXQgPSBnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMgKHdhdikpICE9IEdTVF9GTE9XX09LKQorICAgICAgICBnb3RvIHBhdXNlOworCisgICAgICB3YXYtPnN0YXRlID0gR1NUX1dBVlBBUlNFX0RBVEE7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKHdhdiwgIkdTVF9XQVZQQVJTRV9EQVRBIik7CisgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKworICAgIGNhc2UgR1NUX1dBVlBBUlNFX0RBVEE6CisgICAgICBpZiAoKHJldCA9IGdzdF93YXZwYXJzZV9zdHJlYW1fZGF0YSAod2F2KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gcGF1c2U7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgIH0KKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworcGF1c2U6CisgIHsKKyAgICBjb25zdCBnY2hhciAqcmVhc29uID0gZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJwYXVzaW5nIHRhc2ssIHJlYXNvbiAlcyIsIHJlYXNvbik7CisgICAgZ3N0X3BhZF9wYXVzZV90YXNrIChwYWQpOworCisgICAgaWYgKHJldCA9PSBHU1RfRkxPV19FT1MpIHsKKyAgICAgIC8qIGhhbmRsZSBlbmQtb2Ytc3RyZWFtL3NlZ21lbnQgKi8KKyAgICAgIC8qIHNvIGFsaWduIG91ciBwb3NpdGlvbiB3aXRoIHRoZSBlbmQgb2YgaXQsIGlmIHRoZXJlIGlzIG9uZQorICAgICAgICogdGhpcyBlbnN1cmVzIGEgc3Vic2VxdWVudCB3aWxsIGFycml2ZSBhdCBjb3JyZWN0IGJhc2UvYWNjIHRpbWUgKi8KKyAgICAgIGlmICh3YXYtPnNlZ21lbnQuZm9ybWF0ID09IEdTVF9GT1JNQVRfVElNRSkgeworICAgICAgICBpZiAod2F2LT5zZWdtZW50LnJhdGUgPiAwLjAgJiYKKyAgICAgICAgICAgIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEICh3YXYtPnNlZ21lbnQuc3RvcCkpCisgICAgICAgICAgd2F2LT5zZWdtZW50LnBvc2l0aW9uID0gd2F2LT5zZWdtZW50LnN0b3A7CisgICAgICAgIGVsc2UgaWYgKHdhdi0+c2VnbWVudC5yYXRlIDwgMC4wKQorICAgICAgICAgIHdhdi0+c2VnbWVudC5wb3NpdGlvbiA9IHdhdi0+c2VnbWVudC5zdGFydDsKKyAgICAgIH0KKyAgICAgIGlmICh3YXYtPnN0YXRlID09IEdTVF9XQVZQQVJTRV9TVEFSVCB8fCAhd2F2LT5jYXBzKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SICh3YXYsIFNUUkVBTSwgV1JPTkdfVFlQRSwgKE5VTEwpLAorICAgICAgICAgICAgKCJObyB2YWxpZCBpbnB1dCBmb3VuZCBiZWZvcmUgZW5kIG9mIHN0cmVhbSIpKTsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50ICh3YXYtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogYWRkIHBhZCBiZWZvcmUgd2UgcGVyZm9ybSBFT1MgKi8KKyAgICAgICAgaWYgKEdfVU5MSUtFTFkgKHdhdi0+Zmlyc3QpKSB7CisgICAgICAgICAgd2F2LT5maXJzdCA9IEZBTFNFOworICAgICAgICAgIGdzdF93YXZwYXJzZV9hZGRfc3JjX3BhZCAod2F2LCBOVUxMKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHBlcmZvcm0gRU9TIGxvZ2ljICovCisgICAgICAgIGlmICh3YXYtPnNlZ21lbnQuZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NFR01FTlQpIHsKKyAgICAgICAgICBHc3RDbG9ja1RpbWUgc3RvcDsKKworICAgICAgICAgIGlmICgoc3RvcCA9IHdhdi0+c2VnbWVudC5zdG9wKSA9PSAtMSkKKyAgICAgICAgICAgIHN0b3AgPSB3YXYtPnNlZ21lbnQuZHVyYXRpb247CisKKyAgICAgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHdhdiksCisgICAgICAgICAgICAgIGdzdF9tZXNzYWdlX25ld19zZWdtZW50X2RvbmUgKEdTVF9PQkpFQ1RfQ0FTVCAod2F2KSwKKyAgICAgICAgICAgICAgICAgIHdhdi0+c2VnbWVudC5mb3JtYXQsIHN0b3ApKTsKKyAgICAgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHdhdi0+c3JjcGFkLAorICAgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X3NlZ21lbnRfZG9uZSAod2F2LT5zZWdtZW50LmZvcm1hdCwgc3RvcCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAod2F2LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAocmV0ID09IEdTVF9GTE9XX05PVF9MSU5LRUQgfHwgcmV0IDwgR1NUX0ZMT1dfRU9TKSB7CisgICAgICAvKiBmb3IgZmF0YWwgZXJyb3JzIHdlIHBvc3QgYW4gZXJyb3IgbWVzc2FnZSwgcG9zdCB0aGUgZXJyb3IKKyAgICAgICAqIGZpcnN0IHNvIHRoZSBhcHAga25vd3MgYWJvdXQgdGhlIGVycm9yIGZpcnN0LiAqLworICAgICAgR1NUX0VMRU1FTlRfRkxPV19FUlJPUiAod2F2LCByZXQpOworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50ICh3YXYtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF93YXZwYXJzZV9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdFdhdlBhcnNlICp3YXYgPSBHU1RfV0FWUEFSU0UgKHBhcmVudCk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHdhdiwgImFkYXB0ZXJfcHVzaCAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIiwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikpOworCisgIGdzdF9hZGFwdGVyX3B1c2ggKHdhdi0+YWRhcHRlciwgYnVmKTsKKworICBzd2l0Y2ggKHdhdi0+c3RhdGUpIHsKKyAgICBjYXNlIEdTVF9XQVZQQVJTRV9TVEFSVDoKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAod2F2LCAiR1NUX1dBVlBBUlNFX1NUQVJUIik7CisgICAgICBpZiAoKHJldCA9IGdzdF93YXZwYXJzZV9wYXJzZV9zdHJlYW1faW5pdCAod2F2KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gZG9uZTsKKworICAgICAgaWYgKHdhdi0+c3RhdGUgIT0gR1NUX1dBVlBBUlNFX0hFQURFUikKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIG90aGVyd2lzZSBmYWxsLXRocm91Z2ggKi8KKyAgICBjYXNlIEdTVF9XQVZQQVJTRV9IRUFERVI6CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKHdhdiwgIkdTVF9XQVZQQVJTRV9IRUFERVIiKTsKKyAgICAgIGlmICgocmV0ID0gZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzICh3YXYpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBkb25lOworCisgICAgICBpZiAoIXdhdi0+Z290X2ZtdCB8fCB3YXYtPmRhdGFzdGFydCA9PSAwKQorICAgICAgICBicmVhazsKKworICAgICAgd2F2LT5zdGF0ZSA9IEdTVF9XQVZQQVJTRV9EQVRBOworICAgICAgR1NUX0lORk9fT0JKRUNUICh3YXYsICJHU1RfV0FWUEFSU0VfREFUQSIpOworCisgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgICBjYXNlIEdTVF9XQVZQQVJTRV9EQVRBOgorICAgICAgaWYgKGJ1ZiAmJiBHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKSkKKyAgICAgICAgd2F2LT5kaXNjb250ID0gVFJVRTsKKyAgICAgIGlmICgocmV0ID0gZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhICh3YXYpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBkb25lOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfcmV0dXJuX3ZhbF9pZl9yZWFjaGVkIChHU1RfRkxPV19FUlJPUik7CisgIH0KK2RvbmU6CisgIGlmIChHX1VOTElLRUxZICh3YXYtPmFib3J0X2J1ZmZlcmluZykpIHsKKyAgICB3YXYtPmFib3J0X2J1ZmZlcmluZyA9IEZBTFNFOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIC8qIHNvcnQgb2YgZGVtdXgvcGFyc2UgZXJyb3IgKi8KKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAod2F2LCBTVFJFQU0sIERFTVVYLCAoTlVMTCksICgidW5oYW5kbGVkIGJ1ZmZlciBzaXplIikpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF93YXZwYXJzZV9mbHVzaF9kYXRhIChHc3RXYXZQYXJzZSAqIHdhdikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ3VpbnQgYXY7CisKKyAgaWYgKChhdiA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAod2F2LT5hZGFwdGVyKSkgPiAwKSB7CisgICAgcmV0ID0gZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhICh3YXYpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2cGFyc2Vfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFdhdlBhcnNlICp3YXYgPSBHU1RfV0FWUEFSU0UgKHBhcmVudCk7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHdhdiwgImhhbmRsaW5nICVzIGV2ZW50IiwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9DQVBTOgorICAgIHsKKyAgICAgIC8qIGRpc2NhcmQsIHdlJ2xsIGNvbWUgdXAgd2l0aCBwcm9wZXIgc3JjIGNhcHMgKi8KKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6CisgICAgeworICAgICAgZ2ludDY0IHN0YXJ0LCBzdG9wLCBvZmZzZXQgPSAwLCBlbmRfb2Zmc2V0ID0gLTE7CisgICAgICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgICAgIC8qIHNvbWUgZGVidWcgb3V0cHV0ICovCisgICAgICBnc3RfZXZlbnRfY29weV9zZWdtZW50IChldmVudCwgJnNlZ21lbnQpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAicmVjZWl2ZWQgbmV3c2VnbWVudCAlIiBHU1RfU0VHTUVOVF9GT1JNQVQsCisgICAgICAgICAgJnNlZ21lbnQpOworCisgICAgICBpZiAod2F2LT5zdGF0ZSAhPSBHU1RfV0FWUEFSU0VfREFUQSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJzdGlsbCBzdGFydGluZywgZWF0aW5nIGV2ZW50Iik7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgIH0KKworICAgICAgLyogbm93IHdlIGFyZSBlaXRoZXIgY29tbWl0dGVkIHRvIFRJTUUgb3IgQllURSBmb3JtYXQsCisgICAgICAgKiBhbmQgd2Ugb25seSBleHBlY3QgYSBCWVRFIHNlZ21lbnQsIGUuZy4gZm9sbG93aW5nIGEgc2VlayAqLworICAgICAgaWYgKHNlZ21lbnQuZm9ybWF0ID09IEdTVF9GT1JNQVRfQllURVMpIHsKKyAgICAgICAgLyogaGFuZGxlICh1bilzaWduZWQgaXNzdWVzICovCisgICAgICAgIHN0YXJ0ID0gc2VnbWVudC5zdGFydDsKKyAgICAgICAgc3RvcCA9IHNlZ21lbnQuc3RvcDsKKyAgICAgICAgaWYgKHN0YXJ0ID4gMCkgeworICAgICAgICAgIG9mZnNldCA9IHN0YXJ0OworICAgICAgICAgIHN0YXJ0IC09IHdhdi0+ZGF0YXN0YXJ0OworICAgICAgICAgIHN0YXJ0ID0gTUFYIChzdGFydCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0b3AgPiAwKSB7CisgICAgICAgICAgZW5kX29mZnNldCA9IHN0b3A7CisgICAgICAgICAgc3RvcCAtPSB3YXYtPmRhdGFzdGFydDsKKyAgICAgICAgICBzdG9wID0gTUFYIChzdG9wLCAwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod2F2LT5zZWdtZW50LmZvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICAgICAgICBndWludDY0IGJwcyA9IHdhdi0+YnBzOworCisgICAgICAgICAgLyogb3BlcmF0aW5nIGluIGZvcm1hdCBUSU1FLCBzbyB3ZSBjYW4gY29udmVydCAqLworICAgICAgICAgIGlmICghYnBzICYmIHdhdi0+ZmFjdCkKKyAgICAgICAgICAgIGJwcyA9CisgICAgICAgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAod2F2LT5kYXRhc2l6ZSwgd2F2LT5yYXRlLCB3YXYtPmZhY3QpOworICAgICAgICAgIGlmIChicHMpIHsKKyAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKQorICAgICAgICAgICAgICBzdGFydCA9CisgICAgICAgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfY2VpbCAoc3RhcnQsIEdTVF9TRUNPTkQsCisgICAgICAgICAgICAgICAgICAoZ3VpbnQ2NCkgd2F2LT5icHMpOworICAgICAgICAgICAgaWYgKHN0b3AgPj0gMCkKKyAgICAgICAgICAgICAgc3RvcCA9CisgICAgICAgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfY2VpbCAoc3RvcCwgR1NUX1NFQ09ORCwKKyAgICAgICAgICAgICAgICAgIChndWludDY0KSB3YXYtPmJwcyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJ1bnN1cHBvcnRlZCBzZWdtZW50IGZvcm1hdCwgaWdub3JpbmciKTsKKyAgICAgICAgZ290byBleGl0OworICAgICAgfQorCisgICAgICBzZWdtZW50LnN0YXJ0ID0gc3RhcnQ7CisgICAgICBzZWdtZW50LnN0b3AgPSBzdG9wOworCisgICAgICAvKiBhY2NlcHQgdXBzdHJlYW0ncyBub3Rpb24gb2Ygc2VnbWVudCBhbmQgZGlzdHJpYnV0ZSBhbG9uZyAqLworICAgICAgc2VnbWVudC5mb3JtYXQgPSB3YXYtPnNlZ21lbnQuZm9ybWF0OworICAgICAgc2VnbWVudC50aW1lID0gc2VnbWVudC5wb3NpdGlvbiA9IHNlZ21lbnQuc3RhcnQ7CisgICAgICBzZWdtZW50LmR1cmF0aW9uID0gd2F2LT5zZWdtZW50LmR1cmF0aW9uOworICAgICAgc2VnbWVudC5iYXNlID0gZ3N0X3NlZ21lbnRfdG9fcnVubmluZ190aW1lICgmd2F2LT5zZWdtZW50LAorICAgICAgICAgIEdTVF9GT1JNQVRfVElNRSwgd2F2LT5zZWdtZW50LnBvc2l0aW9uKTsKKworICAgICAgZ3N0X3NlZ21lbnRfY29weV9pbnRvICgmc2VnbWVudCwgJndhdi0+c2VnbWVudCk7CisKKyAgICAgIC8qIGFsc28gc3RvcmUgdGhlIG5ld3NlZ21lbnQgZXZlbnQgZm9yIHRoZSBzdHJlYW1pbmcgdGhyZWFkICovCisgICAgICBpZiAod2F2LT5zdGFydF9zZWdtZW50KQorICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKHdhdi0+c3RhcnRfc2VnbWVudCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJTdG9yaW5nIG5ld3NlZyAlIiBHU1RfU0VHTUVOVF9GT1JNQVQsICZzZWdtZW50KTsKKyAgICAgIHdhdi0+c3RhcnRfc2VnbWVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpOworCisgICAgICAvKiBzdHJlYW0gbGVmdG92ZXIgZGF0YSBpbiBjdXJyZW50IHNlZ21lbnQgKi8KKyAgICAgIGdzdF93YXZwYXJzZV9mbHVzaF9kYXRhICh3YXYpOworICAgICAgLyogYW5kIHNldCB1cCBzdHJlYW1pbmcgdGhyZWFkIGZvciBuZXh0IG9uZSAqLworICAgICAgd2F2LT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICB3YXYtPmVuZF9vZmZzZXQgPSBlbmRfb2Zmc2V0OworCisgICAgICBpZiAod2F2LT5kYXRhc2l6ZSA+IDAgJiYgKHdhdi0+ZW5kX29mZnNldCA9PSAtMQorICAgICAgICAgICAgICB8fCB3YXYtPmVuZF9vZmZzZXQgPiB3YXYtPmRhdGFzdGFydCArIHdhdi0+ZGF0YXNpemUpKQorICAgICAgICB3YXYtPmVuZF9vZmZzZXQgPSB3YXYtPmRhdGFzdGFydCArIHdhdi0+ZGF0YXNpemU7CisKKyAgICAgIGlmICh3YXYtPmVuZF9vZmZzZXQgIT0gLTEpIHsKKyAgICAgICAgd2F2LT5kYXRhbGVmdCA9IHdhdi0+ZW5kX29mZnNldCAtIHdhdi0+b2Zmc2V0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogaW5maW5pdHk7IHVwc3RyZWFtIHdpbGwgRU9TIHdoZW4gZG9uZSAqLworICAgICAgICB3YXYtPmRhdGFsZWZ0ID0gR19NQVhVSU5UNjQ7CisgICAgICB9CisgICAgZXhpdDoKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgIGlmICh3YXYtPnN0YXRlID09IEdTVF9XQVZQQVJTRV9TVEFSVCB8fCAhd2F2LT5jYXBzKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SICh3YXYsIFNUUkVBTSwgV1JPTkdfVFlQRSwgKE5VTEwpLAorICAgICAgICAgICAgKCJObyB2YWxpZCBpbnB1dCBmb3VuZCBiZWZvcmUgZW5kIG9mIHN0cmVhbSIpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGFkZCBwYWQgaWYgbmVlZGVkIHNvIEVPUyBpcyBzZWVuIGRvd25zdHJlYW0gKi8KKyAgICAgICAgaWYgKEdfVU5MSUtFTFkgKHdhdi0+Zmlyc3QpKSB7CisgICAgICAgICAgd2F2LT5maXJzdCA9IEZBTFNFOworICAgICAgICAgIGdzdF93YXZwYXJzZV9hZGRfc3JjX3BhZCAod2F2LCBOVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBzdHJlYW0gbGVmdG92ZXIgZGF0YSBpbiBjdXJyZW50IHNlZ21lbnQgKi8KKyAgICAgICAgICBnc3Rfd2F2cGFyc2VfZmx1c2hfZGF0YSAod2F2KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgIHsKKyAgICAgIEdzdENsb2NrVGltZSBkdXI7CisKKyAgICAgIGlmICh3YXYtPmFkYXB0ZXIpCisgICAgICAgIGdzdF9hZGFwdGVyX2NsZWFyICh3YXYtPmFkYXB0ZXIpOworICAgICAgd2F2LT5kaXNjb250ID0gVFJVRTsKKyAgICAgIGR1ciA9IHdhdi0+c2VnbWVudC5kdXJhdGlvbjsKKyAgICAgIGdzdF9zZWdtZW50X2luaXQgKCZ3YXYtPnNlZ21lbnQsIHdhdi0+c2VnbWVudC5mb3JtYXQpOworICAgICAgd2F2LT5zZWdtZW50LmR1cmF0aW9uID0gZHVyOworICAgICAgLyogZmFsbC10aHJvdWdoICovCisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHdhdi0+c2lua3BhZCwgcGFyZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKyNpZiAwCisvKiBjb252ZXJ0IGFuZCBxdWVyeSBzdHVmZiAqLworc3RhdGljIGNvbnN0IEdzdEZvcm1hdCAqCitnc3Rfd2F2cGFyc2VfZ2V0X2Zvcm1hdHMgKEdzdFBhZCAqIHBhZCkKK3sKKyAgc3RhdGljIGNvbnN0IEdzdEZvcm1hdCBmb3JtYXRzW10gPSB7CisgICAgR1NUX0ZPUk1BVF9USU1FLAorICAgIEdTVF9GT1JNQVRfQllURVMsCisgICAgR1NUX0ZPUk1BVF9ERUZBVUxULCAgICAgICAgIC8qIGEgImZyYW1lIiwgaWUgYSBzZXQgb2Ygc2FtcGxlcyBwZXIgSHogKi8KKyAgICAwCisgIH07CisKKyAgcmV0dXJuIGZvcm1hdHM7Cit9CisjZW5kaWYKKworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2cGFyc2VfcGFkX2NvbnZlcnQgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RGb3JtYXQgc3JjX2Zvcm1hdCwgZ2ludDY0IHNyY192YWx1ZSwKKyAgICBHc3RGb3JtYXQgKiBkZXN0X2Zvcm1hdCwgZ2ludDY0ICogZGVzdF92YWx1ZSkKK3sKKyAgR3N0V2F2UGFyc2UgKndhdnBhcnNlOworICBnYm9vbGVhbiByZXMgPSBUUlVFOworCisgIHdhdnBhcnNlID0gR1NUX1dBVlBBUlNFIChHU1RfUEFEX1BBUkVOVCAocGFkKSk7CisKKyAgaWYgKCpkZXN0X2Zvcm1hdCA9PSBzcmNfZm9ybWF0KSB7CisgICAgKmRlc3RfdmFsdWUgPSBzcmNfdmFsdWU7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBpZiAoKHdhdnBhcnNlLT5icHMgPT0gMCkgJiYgIXdhdnBhcnNlLT5mYWN0KQorICAgIGdvdG8gbm9fYnBzX2ZhY3Q7CisKKyAgR1NUX0lORk9fT0JKRUNUICh3YXZwYXJzZSwgImNvbnZlcnRpbmcgdmFsdWUgZnJvbSAlcyB0byAlcyIsCisgICAgICBnc3RfZm9ybWF0X2dldF9uYW1lIChzcmNfZm9ybWF0KSwgZ3N0X2Zvcm1hdF9nZXRfbmFtZSAoKmRlc3RfZm9ybWF0KSk7CisKKyAgc3dpdGNoIChzcmNfZm9ybWF0KSB7CisgICAgY2FzZSBHU1RfRk9STUFUX0JZVEVTOgorICAgICAgc3dpdGNoICgqZGVzdF9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0RFRkFVTFQ6CisgICAgICAgICAgKmRlc3RfdmFsdWUgPSBzcmNfdmFsdWUgLyB3YXZwYXJzZS0+Ynl0ZXNfcGVyX3NhbXBsZTsKKyAgICAgICAgICAvKiBtYWtlIHN1cmUgd2UgZW5kIHVwIG9uIGEgc2FtcGxlIGJvdW5kYXJ5ICovCisgICAgICAgICAgKmRlc3RfdmFsdWUgLT0gKmRlc3RfdmFsdWUgJSB3YXZwYXJzZS0+Ynl0ZXNfcGVyX3NhbXBsZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6CisgICAgICAgICAgLyogc3JjX3ZhbHVlICsgZGF0YXN0YXJ0ID0gb2Zmc2V0ICovCisgICAgICAgICAgR1NUX0lORk9fT0JKRUNUICh3YXZwYXJzZSwKKyAgICAgICAgICAgICAgInNyYz0lIiBHX0dJTlQ2NF9GT1JNQVQgIiwgb2Zmc2V0PSUiIEdfR0lOVDY0X0ZPUk1BVCwgc3JjX3ZhbHVlLAorICAgICAgICAgICAgICB3YXZwYXJzZS0+b2Zmc2V0KTsKKyAgICAgICAgICBpZiAod2F2cGFyc2UtPmJwcyA+IDApCisgICAgICAgICAgICAqZGVzdF92YWx1ZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9jZWlsIChzcmNfdmFsdWUsIEdTVF9TRUNPTkQsCisgICAgICAgICAgICAgICAgKGd1aW50NjQpIHdhdnBhcnNlLT5icHMpOworICAgICAgICAgIGVsc2UgaWYgKHdhdnBhcnNlLT5mYWN0KSB7CisgICAgICAgICAgICBndWludDY0IGJwcyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnRfY2VpbCAod2F2cGFyc2UtPmRhdGFzaXplLAorICAgICAgICAgICAgICAgIHdhdnBhcnNlLT5yYXRlLCB3YXZwYXJzZS0+ZmFjdCk7CisKKyAgICAgICAgICAgICpkZXN0X3ZhbHVlID0KKyAgICAgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50X2NlaWwgKHNyY192YWx1ZSwgR1NUX1NFQ09ORCwgYnBzKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBHU1RfRk9STUFUX0RFRkFVTFQ6CisgICAgICBzd2l0Y2ggKCpkZXN0X2Zvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfQllURVM6CisgICAgICAgICAgKmRlc3RfdmFsdWUgPSBzcmNfdmFsdWUgKiB3YXZwYXJzZS0+Ynl0ZXNfcGVyX3NhbXBsZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6CisgICAgICAgICAgKmRlc3RfdmFsdWUgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHNyY192YWx1ZSwgR1NUX1NFQ09ORCwKKyAgICAgICAgICAgICAgKGd1aW50NjQpIHdhdnBhcnNlLT5yYXRlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgR1NUX0ZPUk1BVF9USU1FOgorICAgICAgc3dpdGNoICgqZGVzdF9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0JZVEVTOgorICAgICAgICAgIGlmICh3YXZwYXJzZS0+YnBzID4gMCkKKyAgICAgICAgICAgICpkZXN0X3ZhbHVlID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzcmNfdmFsdWUsCisgICAgICAgICAgICAgICAgKGd1aW50NjQpIHdhdnBhcnNlLT5icHMsIEdTVF9TRUNPTkQpOworICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZ3VpbnQ2NCBicHMgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50ICh3YXZwYXJzZS0+ZGF0YXNpemUsCisgICAgICAgICAgICAgICAgd2F2cGFyc2UtPnJhdGUsIHdhdnBhcnNlLT5mYWN0KTsKKworICAgICAgICAgICAgKmRlc3RfdmFsdWUgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHNyY192YWx1ZSwgYnBzLCBHU1RfU0VDT05EKTsKKyAgICAgICAgICB9CisgICAgICAgICAgLyogbWFrZSBzdXJlIHdlIGVuZCB1cCBvbiBhIHNhbXBsZSBib3VuZGFyeSAqLworICAgICAgICAgICpkZXN0X3ZhbHVlIC09ICpkZXN0X3ZhbHVlICUgd2F2cGFyc2UtPmJsb2NrYWxpZ247CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICAgICpkZXN0X3ZhbHVlID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzcmNfdmFsdWUsCisgICAgICAgICAgICAgIChndWludDY0KSB3YXZwYXJzZS0+cmF0ZSwgR1NUX1NFQ09ORCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICAgICAgZ290byBkb25lOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gRkFMU0U7CisgICAgICBnb3RvIGRvbmU7CisgIH0KKworZG9uZToKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK25vX2Jwc19mYWN0OgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2cGFyc2UsICJicHMgMCBvciBubyBmYWN0IGNodW5rLCBjYW5ub3QgY29udmVydCIpOworICAgIHJlcyA9IEZBTFNFOworICAgIGdvdG8gZG9uZTsKKyAgfQorfQorCisvKiBoYW5kbGUgcXVlcmllcyBmb3IgbG9jYXRpb24gYW5kIGxlbmd0aCBpbiByZXF1ZXN0ZWQgZm9ybWF0ICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYXJzZV9wYWRfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnYm9vbGVhbiByZXMgPSBUUlVFOworICBHc3RXYXZQYXJzZSAqd2F2ID0gR1NUX1dBVlBBUlNFIChwYXJlbnQpOworCisgIC8qIG9ubHkgaWYgd2Uga25vdyAqLworICBpZiAod2F2LT5zdGF0ZSAhPSBHU1RfV0FWUEFSU0VfREFUQSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICIlcyBxdWVyeSIsIEdTVF9RVUVSWV9UWVBFX05BTUUgKHF1ZXJ5KSk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfUE9TSVRJT046CisgICAgeworICAgICAgZ2ludDY0IGN1cmI7CisgICAgICBnaW50NjQgY3VyOworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKworICAgICAgLyogdGhpcyBpcyBub3QgdmVyeSBwcmVjaXNlLCBhcyB3ZSBoYXZlIHB1c2hlZCBzZXZlcmxhIGJ1ZmZlciB1cHN0cmVhbSBmb3IgcHJlcm9sbGluZyAqLworICAgICAgY3VyYiA9IHdhdi0+b2Zmc2V0IC0gd2F2LT5kYXRhc3RhcnQ7CisgICAgICBnc3RfcXVlcnlfcGFyc2VfcG9zaXRpb24gKHF1ZXJ5LCAmZm9ybWF0LCBOVUxMKTsKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAod2F2LCAicG9zIHF1ZXJ5IGF0ICUiIEdfR0lOVDY0X0ZPUk1BVCwgY3VyYik7CisKKyAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9CWVRFUzoKKyAgICAgICAgICBmb3JtYXQgPSBHU1RfRk9STUFUX0JZVEVTOworICAgICAgICAgIGN1ciA9IGN1cmI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmVzID0gZ3N0X3dhdnBhcnNlX3BhZF9jb252ZXJ0IChwYWQsIEdTVF9GT1JNQVRfQllURVMsIGN1cmIsCisgICAgICAgICAgICAgICZmb3JtYXQsICZjdXIpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHJlcykKKyAgICAgICAgZ3N0X3F1ZXJ5X3NldF9wb3NpdGlvbiAocXVlcnksIGZvcm1hdCwgY3VyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9EVVJBVElPTjoKKyAgICB7CisgICAgICBnaW50NjQgZHVyYXRpb24gPSAwOworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKworICAgICAgaWYgKHdhdi0+aWdub3JlX2xlbmd0aCkgeworICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9kdXJhdGlvbiAocXVlcnksICZmb3JtYXQsIE5VTEwpOworCisgICAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfQllURVM6eworICAgICAgICAgIGZvcm1hdCA9IEdTVF9GT1JNQVRfQllURVM7CisgICAgICAgICAgZHVyYXRpb24gPSB3YXYtPmRhdGFzaXplOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9USU1FOgorICAgICAgICAgIGlmICgocmVzID0gZ3N0X3dhdnBhcnNlX2NhbGN1bGF0ZV9kdXJhdGlvbiAod2F2KSkpIHsKKyAgICAgICAgICAgIGR1cmF0aW9uID0gd2F2LT5kdXJhdGlvbjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAocmVzKQorICAgICAgICBnc3RfcXVlcnlfc2V0X2R1cmF0aW9uIChxdWVyeSwgZm9ybWF0LCBkdXJhdGlvbik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfQ09OVkVSVDoKKyAgICB7CisgICAgICBnaW50NjQgc3JjdmFsdWUsIGRzdHZhbHVlOworICAgICAgR3N0Rm9ybWF0IHNyY2Zvcm1hdCwgZHN0Zm9ybWF0OworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY29udmVydCAocXVlcnksICZzcmNmb3JtYXQsICZzcmN2YWx1ZSwKKyAgICAgICAgICAmZHN0Zm9ybWF0LCAmZHN0dmFsdWUpOworICAgICAgcmVzID0gZ3N0X3dhdnBhcnNlX3BhZF9jb252ZXJ0IChwYWQsIHNyY2Zvcm1hdCwgc3JjdmFsdWUsCisgICAgICAgICAgJmRzdGZvcm1hdCwgJmRzdHZhbHVlKTsKKyAgICAgIGlmIChyZXMpCisgICAgICAgIGdzdF9xdWVyeV9zZXRfY29udmVydCAocXVlcnksIHNyY2Zvcm1hdCwgc3JjdmFsdWUsIGRzdGZvcm1hdCwgZHN0dmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX1NFRUtJTkc6eworICAgICAgR3N0Rm9ybWF0IGZtdDsKKyAgICAgIGdib29sZWFuIHNlZWthYmxlID0gRkFMU0U7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9zZWVraW5nIChxdWVyeSwgJmZtdCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICBpZiAoZm10ID09IHdhdi0+c2VnbWVudC5mb3JtYXQpIHsKKyAgICAgICAgaWYgKHdhdi0+c3RyZWFtaW5nKSB7CisgICAgICAgICAgR3N0UXVlcnkgKnE7CisKKyAgICAgICAgICBxID0gZ3N0X3F1ZXJ5X25ld19zZWVraW5nIChHU1RfRk9STUFUX0JZVEVTKTsKKyAgICAgICAgICBpZiAoKHJlcyA9IGdzdF9wYWRfcGVlcl9xdWVyeSAod2F2LT5zaW5rcGFkLCBxKSkpIHsKKyAgICAgICAgICAgIGdzdF9xdWVyeV9wYXJzZV9zZWVraW5nIChxLCAmZm10LCAmc2Vla2FibGUsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHdhdiwgInVwc3RyZWFtIEJZVEUgc2Vla2FibGUgJWQiLCBzZWVrYWJsZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF9xdWVyeV91bnJlZiAocSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHdhdiwgImxvb3BpbmcgPT4gc2Vla2FibGUiKTsKKyAgICAgICAgICBzZWVrYWJsZSA9IFRSVUU7CisgICAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChmbXQgPT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICB9CisgICAgICBpZiAocmVzKSB7CisgICAgICAgIGdzdF9xdWVyeV9zZXRfc2Vla2luZyAocXVlcnksIGZtdCwgc2Vla2FibGUsIDAsIHdhdi0+c2VnbWVudC5kdXJhdGlvbik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhcnNlX3NyY3BhZF9ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFdhdlBhcnNlICp3YXZwYXJzZSA9IEdTVF9XQVZQQVJTRSAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAod2F2cGFyc2UsICIlcyBldmVudCIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICAgIC8qIGNhbiBvbmx5IGhhbmRsZSBldmVudHMgd2hlbiB3ZSBhcmUgaW4gdGhlIGRhdGEgc3RhdGUgKi8KKyAgICAgIGlmICh3YXZwYXJzZS0+c3RhdGUgPT0gR1NUX1dBVlBBUlNFX0RBVEEpIHsKKyAgICAgICAgcmVzID0gZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2VlayAod2F2cGFyc2UsIGV2ZW50KTsKKyAgICAgIH0KKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdTVF9FVkVOVF9UT0NfU0VMRUNUOgorICAgIHsKKyAgICAgIGNoYXIgKnVpZCA9IE5VTEw7CisgICAgICBHc3RUb2NFbnRyeSAqZW50cnkgPSBOVUxMOworICAgICAgR3N0RXZlbnQgKnNlZWtfZXZlbnQ7CisgICAgICBnaW50NjQgc3RhcnRfcG9zOworCisgICAgICBpZiAoIXdhdnBhcnNlLT50b2MpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2cGFyc2UsICJubyBUT0MgdG8gc2VsZWN0Iik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9ldmVudF9wYXJzZV90b2Nfc2VsZWN0IChldmVudCwgJnVpZCk7CisgICAgICAgIGlmICh1aWQgIT0gTlVMTCkgeworICAgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAod2F2cGFyc2UpOworICAgICAgICAgIGVudHJ5ID0gZ3N0X3RvY19maW5kX2VudHJ5ICh3YXZwYXJzZS0+dG9jLCB1aWQpOworICAgICAgICAgIGlmIChlbnRyeSA9PSBOVUxMKSB7CisgICAgICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAod2F2cGFyc2UpOworICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh3YXZwYXJzZSwgIm5vIFRPQyBlbnRyeSB3aXRoIGdpdmVuIFVJRDogJXMiLAorICAgICAgICAgICAgICAgIHVpZCk7CisgICAgICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ3N0X3RvY19lbnRyeV9nZXRfc3RhcnRfc3RvcF90aW1lcyAoZW50cnksICZzdGFydF9wb3MsIE5VTEwpOworICAgICAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHdhdnBhcnNlKTsKKyAgICAgICAgICAgIHNlZWtfZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZWsgKDEuMCwKKyAgICAgICAgICAgICAgICBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgICAgICAgR1NUX1NFRUtfRkxBR19GTFVTSCwKKyAgICAgICAgICAgICAgICBHU1RfU0VFS19UWVBFX1NFVCwgc3RhcnRfcG9zLCBHU1RfU0VFS19UWVBFX1NFVCwgLTEpOworICAgICAgICAgICAgcmVzID0gZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2VlayAod2F2cGFyc2UsIHNlZWtfZXZlbnQpOworICAgICAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChzZWVrX2V2ZW50KTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ19mcmVlICh1aWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2cGFyc2UsICJyZWNlaXZlZCBlbXB0eSBUT0Mgc2VsZWN0IGV2ZW50Iik7CisgICAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAod2F2cGFyc2UtPnNpbmtwYWQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhcnNlX3NpbmtfYWN0aXZhdGUgKEdzdFBhZCAqIHNpbmtwYWQsIEdzdE9iamVjdCAqIHBhcmVudCkKK3sKKyAgR3N0V2F2UGFyc2UgKndhdiA9IEdTVF9XQVZQQVJTRSAocGFyZW50KTsKKyAgR3N0UXVlcnkgKnF1ZXJ5OworICBnYm9vbGVhbiBwdWxsX21vZGU7CisKKyAgaWYgKHdhdi0+YWRhcHRlcikgeworICAgIGdzdF9hZGFwdGVyX2NsZWFyICh3YXYtPmFkYXB0ZXIpOworICAgIGdfb2JqZWN0X3VucmVmICh3YXYtPmFkYXB0ZXIpOworICAgIHdhdi0+YWRhcHRlciA9IE5VTEw7CisgIH0KKworICBxdWVyeSA9IGdzdF9xdWVyeV9uZXdfc2NoZWR1bGluZyAoKTsKKworICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeSAoc2lua3BhZCwgcXVlcnkpKSB7CisgICAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisgICAgZ290byBhY3RpdmF0ZV9wdXNoOworICB9CisKKyAgcHVsbF9tb2RlID0gZ3N0X3F1ZXJ5X2hhc19zY2hlZHVsaW5nX21vZGVfd2l0aF9mbGFncyAocXVlcnksCisgICAgICBHU1RfUEFEX01PREVfUFVMTCwgR1NUX1NDSEVEVUxJTkdfRkxBR19TRUVLQUJMRSk7CisgIGdzdF9xdWVyeV91bnJlZiAocXVlcnkpOworCisgIGlmICghcHVsbF9tb2RlKQorICAgIGdvdG8gYWN0aXZhdGVfcHVzaDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rcGFkLCAiYWN0aXZhdGluZyBwdWxsIik7CisgIHdhdi0+c3RyZWFtaW5nID0gRkFMU0U7CisgIHJldHVybiBnc3RfcGFkX2FjdGl2YXRlX21vZGUgKHNpbmtwYWQsIEdTVF9QQURfTU9ERV9QVUxMLCBUUlVFKTsKKworYWN0aXZhdGVfcHVzaDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmtwYWQsICJhY3RpdmF0aW5nIHB1c2giKTsKKyAgICB3YXYtPnN0cmVhbWluZyA9IFRSVUU7CisgICAgd2F2LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworICAgIHJldHVybiBnc3RfcGFkX2FjdGl2YXRlX21vZGUgKHNpbmtwYWQsIEdTVF9QQURfTU9ERV9QVVNILCBUUlVFKTsKKyAgfQorfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhcnNlX3NpbmtfYWN0aXZhdGVfbW9kZSAoR3N0UGFkICogc2lua3BhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFBhZE1vZGUgbW9kZSwgZ2Jvb2xlYW4gYWN0aXZlKQoreworICBnYm9vbGVhbiByZXM7CisKKyAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBHU1RfUEFEX01PREVfUFVTSDoKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9QQURfTU9ERV9QVUxMOgorICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICAvKiBpZiB3ZSBoYXZlIGEgc2NoZWR1bGVyIHdlIGNhbiBzdGFydCB0aGUgdGFzayAqLworICAgICAgICByZXMgPSBnc3RfcGFkX3N0YXJ0X3Rhc2sgKHNpbmtwYWQsIChHc3RUYXNrRnVuY3Rpb24pIGdzdF93YXZwYXJzZV9sb29wLAorICAgICAgICAgICAgc2lua3BhZCwgTlVMTCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXMgPSBnc3RfcGFkX3N0b3BfdGFzayAoc2lua3BhZCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF93YXZwYXJzZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdFdhdlBhcnNlICp3YXYgPSBHU1RfV0FWUEFSU0UgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGdzdF93YXZwYXJzZV9yZXNldCAod2F2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUExBWUlORzoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QTEFZSU5HX1RPX1BBVVNFRDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3Rfd2F2cGFyc2VfcmVzZXQgKHdhdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3dhdnBhcnNlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RXYXZQYXJzZSAqc2VsZjsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfV0FWUEFSU0UgKG9iamVjdCkpOworICBzZWxmID0gR1NUX1dBVlBBUlNFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9JR05PUkVfTEVOR1RIOgorICAgICAgc2VsZi0+aWdub3JlX2xlbmd0aCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKHNlbGYsIHByb3BfaWQsIHBzcGVjKTsKKyAgfQorCit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFyc2VfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFdhdlBhcnNlICpzZWxmOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19XQVZQQVJTRSAob2JqZWN0KSk7CisgIHNlbGYgPSBHU1RfV0FWUEFSU0UgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0lHTk9SRV9MRU5HVEg6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgc2VsZi0+aWdub3JlX2xlbmd0aCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChzZWxmLCBwcm9wX2lkLCBwc3BlYyk7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBnc3RfcmlmZl9pbml0ICgpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAid2F2cGFyc2UiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgR1NUX1RZUEVfV0FWUEFSU0UpOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgd2F2cGFyc2UsCisgICAgIlBhcnNlIGEgLndhdiBmaWxlIGludG8gcmF3IGF1ZGlvIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5oIGIvZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ0OWUzMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5oCkBAIC0wLDAgKzEsMTM4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBOb2tpYSBDb3Jwb3JhdGlvbiwgU3RlZmFuIEtvc3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1dBVlBBUlNFX0hfXworI2RlZmluZSBfX0dTVF9XQVZQQVJTRV9IX18KKworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgImdzdC9yaWZmL3JpZmYtaWRzLmgiCisjaW5jbHVkZSAiZ3N0L3JpZmYvcmlmZi1yZWFkLmgiCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfV0FWUEFSU0UgXAorICAoZ3N0X3dhdnBhcnNlX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9XQVZQQVJTRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1dBVlBBUlNFLEdzdFdhdlBhcnNlKSkKKyNkZWZpbmUgR1NUX1dBVlBBUlNFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1dBVlBBUlNFLEdzdFdhdlBhcnNlQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfV0FWUEFSU0Uob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9XQVZQQVJTRSkpCisjZGVmaW5lIEdTVF9JU19XQVZQQVJTRV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9XQVZQQVJTRSkpCisKK3R5cGVkZWYgZW51bSB7CisgIEdTVF9XQVZQQVJTRV9TVEFSVCwKKyAgR1NUX1dBVlBBUlNFX0hFQURFUiwKKyAgR1NUX1dBVlBBUlNFX0RBVEEKK30gR3N0V2F2UGFyc2VTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFdhdlBhcnNlIEdzdFdhdlBhcnNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFdhdlBhcnNlQ2xhc3MgR3N0V2F2UGFyc2VDbGFzczsKKworLyoqCisgKiBHc3RXYXZQYXJzZToKKyAqCisgKiBPcGFxdWUgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0V2F2UGFyc2UgeworICBHc3RFbGVtZW50IHBhcmVudDsKKworICAvKiBwYWRzICovCisgIEdzdFBhZCAqc2lua3BhZCwqc3JjcGFkOworCisgIC8qIGZvciBkZWxheWVkIHNvdXJjZSBwYWQgY3JlYXRpb24gZm9yIHdoZW4KKyAgICogd2UgaGF2ZSB0aGUgZmlyc3QgY2h1bmsgb2YgZGF0YSBhbmQga25vdworICAgKiB0aGUgZm9ybWF0IGZvciBzdXJlICovCisgIEdzdENhcHMgICAgICpjYXBzOworICBHc3RUYWdMaXN0ICAqdGFnczsKKyAgR3N0VG9jICAgICAgKnRvYzsKKyAgR0xpc3QgICAgICAgKmN1ZXM7CisgIEdMaXN0ICAgICAgICpsYWJsczsKKyAgR0xpc3QgICAgICAgKm5vdGVzOworICBHc3RFdmVudCAgICAqc3RhcnRfc2VnbWVudDsKKworICAvKiBXQVZFIGRlY29kaW5nIHN0YXRlICovCisgIEdzdFdhdlBhcnNlU3RhdGUgc3RhdGU7CisgIGdib29sZWFuIGFib3J0X2J1ZmZlcmluZzsKKworICAvKiBmb3JtYXQgb2YgYXVkaW8sIHNlZSBkZWZpbmVzIGJlbG93ICovCisgIGdpbnQgZm9ybWF0OworCisgIC8qIHVzZWZ1bCBhdWRpbyBkYXRhICovCisgIGd1aW50MTYgZGVwdGg7CisgIGd1aW50MzIgcmF0ZTsKKyAgZ3VpbnQxNiBjaGFubmVsczsKKyAgZ3VpbnQxNiBibG9ja2FsaWduOworICBndWludDE2IHdpZHRoOworICBndWludDMyIGF2X2JwczsKKyAgZ3VpbnQ2NCBmYWN0OworCisgIC8qIHJlYWwgYnBzIHVzZWQgb3IgMCB3aGVuIG5vIGJpdHJhdGUgaXMga25vd24gKi8KKyAgZ3VpbnQzMiBicHM7CisgIGdib29sZWFuIHZicjsKKworICBndWludCBieXRlc19wZXJfc2FtcGxlOworICBndWludCBtYXhfYnVmX3NpemU7CisKKyAgLyogcG9zaXRpb24gaW4gZGF0YSBwYXJ0ICovCisgIGd1aW50NjQJb2Zmc2V0OworICBndWludDY0CWVuZF9vZmZzZXQ7CisgIGd1aW50NjQgCWRhdGFsZWZ0OworICAvKiBvZmZzZXQvbGVuZ3RoIG9mIGRhdGEgcGFydCAqLworICBndWludDY0IAlkYXRhc3RhcnQ7CisgIGd1aW50NjQgCWRhdGFzaXplOworICAvKiBkdXJhdGlvbiBpbiB0aW1lICovCisgIGd1aW50NjQgCWR1cmF0aW9uOworCisgIC8qIHBlbmRpbmcgc2VlayAqLworICBHc3RFdmVudCAqc2Vla19ldmVudDsKKworICAvKiBGb3Igc3RyZWFtaW5nICovCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisgIGdib29sZWFuIGdvdF9mbXQ7CisgIGdib29sZWFuIHN0cmVhbWluZzsKKworICAvKiBjb25maWd1cmVkIHNlZ21lbnQsIHN0YXJ0L3N0b3AgZXhwcmVzc2VkIGluIHRpbWUgb3IgYnl0ZXMgKi8KKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIC8qIGZvciBsYXRlIHBhZCBjb25maWd1cmF0aW9uICovCisgIGdib29sZWFuIGZpcnN0OworICAvKiBkaXNjb250IGFmdGVyIHNlZWsgKi8KKyAgZ2Jvb2xlYW4gZGlzY29udDsKKworICBnYm9vbGVhbiBpZ25vcmVfbGVuZ3RoOworCisgIC8qIFNpemUgb2YgdGhlIGRhdGEgYXMgd3JpdHRlbiBpbiB0aGUgY2h1bmsgc2l6ZSAqLworICBndWludDMyIGNodW5rX3NpemU7Cit9OworCitzdHJ1Y3QgX0dzdFdhdlBhcnNlQ2xhc3MgeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3dhdnBhcnNlX2dldF90eXBlKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfV0FWUEFSU0VfSF9fICovCmRpZmYgLS1naXQgYS9nc3Qvd2F2cGFyc2UvbWVzb24uYnVpbGQgYi9nc3Qvd2F2cGFyc2UvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNlYmEzNAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC93YXZwYXJzZS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDkgQEAKK2dzdHdhd3BhcnNlID0gbGlicmFyeSgnZ3N0d2F2cGFyc2UnLAorICAnZ3N0d2F2cGFyc2UuYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0YmFzZV9kZXAsIGdzdHBidXRpbHNfZGVwLCBnc3RyaWZmX2RlcCwgZ3N0YXVkaW9fZGVwLAorCQkgIGdzdHRhZ19kZXAsIGxpYm1dLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L3k0bS9NYWtlZmlsZS5hbSBiL2dzdC95NG0vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlYjM3YgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC95NG0vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw5IEBACisKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdHk0bWVuYy5sYQorCitsaWJnc3R5NG1lbmNfbGFfU09VUkNFUyA9IGdzdHk0bWVuY29kZS5jCitsaWJnc3R5NG1lbmNfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKQorbGliZ3N0eTRtZW5jX2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHZpZGVvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKEdTVF9MSUJTKQorbGliZ3N0eTRtZW5jX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3R5NG1lbmNvZGUuaApkaWZmIC0tZ2l0IGEvZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYyBiL2dzdC95NG0vZ3N0eTRtZW5jb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExMTNiYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC95NG0vZ3N0eTRtZW5jb2RlLmMKQEAgLTAsMCArMSwzMTUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQteTRtZW5jCisgKgorICogPHJlZnNlY3QyPgorICogPHBhcmE+CisgKiBDcmVhdGVzIGEgWVU0TVBFRzIgcmF3IHZpZGVvIHN0cmVhbSBhcyBkZWZpbmVkIGJ5IHRoZSBtanBlZ3Rvb2xzIHByb2plY3QuCisgKiA8L3BhcmE+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiA8cGFyYT4KKyAqICh3cml0ZSBldmVyeXRoaW5nIGluIG9uZSBsaW5lLCB3aXRob3V0IHRoZSBiYWNrc2xhc2ggY2hhcmFjdGVycykKKyAqIDxwcm9ncmFtbGlzdGluZz4KKyAqIGdzdC1sYXVuY2gtMS4wIHZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz0yNTAgXAorICogISAndmlkZW8veC1yYXcsZm9ybWF0PShzdHJpbmcpSTQyMCx3aWR0aD0zMjAsaGVpZ2h0PTI0MCxmcmFtZXJhdGU9KGZyYWN0aW9uKTI1LzEnIFwKKyAqICEgeTRtZW5jICEgZmlsZXNpbmsgbG9jYXRpb249dGVzdC55dXYKKyAqIDwvcHJvZ3JhbWxpc3Rpbmc+CisgKiA8L3BhcmE+CisgKiA8L3JlZnNlY3QyPgorICoKKyAqLworCisvKiBzZWUgbWpwZWd0b29scy95dXY0bXBlZy5oIGZvciB5dXY0bXBlZyBmb3JtYXQgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlICJnc3R5NG1lbmNvZGUuaCIKKworLyogRmlsdGVyIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSB5NG1lbmNvZGVfc3JjX2ZhY3RvcnkgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gteXV2NG1wZWcsICIgInk0bXZlcnNpb24gPSAoaW50KSAyIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgeTRtZW5jb2RlX3NpbmtfZmFjdG9yeSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IElZVVYsIEk0MjAsIFk0MkIsIFk0MUIsIFk0NDQgfSIpKQorICAgICk7CisKKworc3RhdGljIHZvaWQgZ3N0X3k0bV9lbmNvZGVfcmVzZXQgKEdzdFk0bUVuY29kZSAqIGZpbHRlcik7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfeTRtX2VuY29kZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3k0bV9lbmNvZGVfaGFuZGxlX2ZyYW1lIChHc3RWaWRlb0VuY29kZXIgKiBlbmNvZGVyLAorICAgIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfeTRtX2VuY29kZV9zZXRfZm9ybWF0IChHc3RWaWRlb0VuY29kZXIgKiBlbmNvZGVyLAorICAgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqIHN0YXRlKTsKKworI2RlZmluZSBnc3RfeTRtX2VuY29kZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RZNG1FbmNvZGUsIGdzdF95NG1fZW5jb2RlLCBHU1RfVFlQRV9WSURFT19FTkNPREVSKTsKKworCitzdGF0aWMgdm9pZAorZ3N0X3k0bV9lbmNvZGVfY2xhc3NfaW5pdCAoR3N0WTRtRW5jb2RlQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0VmlkZW9FbmNvZGVyQ2xhc3MgKnZlbmNfY2xhc3MgPSBHU1RfVklERU9fRU5DT0RFUl9DTEFTUyAoa2xhc3MpOworCisgIGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfeTRtX2VuY29kZV9jaGFuZ2Vfc3RhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJnk0bWVuY29kZV9zcmNfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJnk0bWVuY29kZV9zaW5rX2ZhY3RvcnkpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiWVVWNE1QRUcgdmlkZW8gZW5jb2RlciIsICJDb2RlYy9FbmNvZGVyL1ZpZGVvIiwKKyAgICAgICJFbmNvZGVzIGEgWVVWIGZyYW1lIGludG8gdGhlIHl1djRtcGVnIGZvcm1hdCAobWpwZWd0b29scykiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisgIHZlbmNfY2xhc3MtPnNldF9mb3JtYXQgPSBnc3RfeTRtX2VuY29kZV9zZXRfZm9ybWF0OworICB2ZW5jX2NsYXNzLT5oYW5kbGVfZnJhbWUgPSBnc3RfeTRtX2VuY29kZV9oYW5kbGVfZnJhbWU7CisKK30KKworc3RhdGljIHZvaWQKK2dzdF95NG1fZW5jb2RlX2luaXQgKEdzdFk0bUVuY29kZSAqIGZpbHRlcikKK3sKKyAgR1NUX1BBRF9TRVRfQUNDRVBUX1RFTVBMQVRFIChHU1RfVklERU9fRU5DT0RFUl9TSU5LX1BBRCAoZmlsdGVyKSk7CisKKyAgLyogaW5pdCBwcm9wZXJ0aWVzICovCisgIGdzdF95NG1fZW5jb2RlX3Jlc2V0IChmaWx0ZXIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3k0bV9lbmNvZGVfcmVzZXQgKEdzdFk0bUVuY29kZSAqIGZpbHRlcikKK3sKKyAgZmlsdGVyLT5oZWFkZXIgPSBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfeTRtX2VuY29kZV9zZXRfZm9ybWF0IChHc3RWaWRlb0VuY29kZXIgKiBlbmNvZGVyLAorICAgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqIHN0YXRlKQoreworICBHc3RZNG1FbmNvZGUgKnk0bWVuYzsKKyAgR3N0VmlkZW9JbmZvICppbmZvOworICBHc3RWaWRlb0NvZGVjU3RhdGUgKm91dHB1dF9zdGF0ZTsKKworICB5NG1lbmMgPSBHU1RfWTRNX0VOQ09ERSAoZW5jb2Rlcik7CisgIGluZm8gPSAmc3RhdGUtPmluZm87CisKKyAgc3dpdGNoIChHU1RfVklERU9fSU5GT19GT1JNQVQgKGluZm8pKSB7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgICB5NG1lbmMtPmNvbG9yc3BhY2UgPSAiNDIwIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOgorICAgICAgeTRtZW5jLT5jb2xvcnNwYWNlID0gIjQyMiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQxQjoKKyAgICAgIHk0bWVuYy0+Y29sb3JzcGFjZSA9ICI0MTEiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0NDQ6CisgICAgICB5NG1lbmMtPmNvbG9yc3BhY2UgPSAiNDQ0IjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnb3RvIGludmFsaWRfZm9ybWF0OworICB9CisKKyAgeTRtZW5jLT5pbmZvID0gKmluZm87CisKKyAgb3V0cHV0X3N0YXRlID0KKyAgICAgIGdzdF92aWRlb19lbmNvZGVyX3NldF9vdXRwdXRfc3RhdGUgKGVuY29kZXIsCisgICAgICBnc3Rfc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXRfY2FwcyAoJnk0bWVuY29kZV9zcmNfZmFjdG9yeSksIHN0YXRlKTsKKyAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChvdXRwdXRfc3RhdGUpOworCisgIHJldHVybiBUUlVFOworCitpbnZhbGlkX2Zvcm1hdDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHk0bWVuYywgIkludmFsaWQgZm9ybWF0Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKK30KKworc3RhdGljIGlubGluZSBHc3RCdWZmZXIgKgorZ3N0X3k0bV9lbmNvZGVfZ2V0X3N0cmVhbV9oZWFkZXIgKEdzdFk0bUVuY29kZSAqIGZpbHRlciwgZ2Jvb2xlYW4gdGZmKQoreworICBncG9pbnRlciBoZWFkZXI7CisgIEdzdEJ1ZmZlciAqYnVmOworICBnY2hhciBpbnRlcmxhY2VkOworICBnc2l6ZSBsZW47CisKKyAgaWYgKEdTVF9WSURFT19JTkZPX0lTX0lOVEVSTEFDRUQgKCZmaWx0ZXItPmluZm8pKSB7CisgICAgaWYgKHRmZikKKyAgICAgIGludGVybGFjZWQgPSAndCc7CisgICAgZWxzZQorICAgICAgaW50ZXJsYWNlZCA9ICdiJzsKKyAgfSBlbHNlIHsKKyAgICBpbnRlcmxhY2VkID0gJ3AnOworICB9CisKKyAgaGVhZGVyID0gZ19zdHJkdXBfcHJpbnRmICgiWVVWNE1QRUcyIEMlcyBXJWQgSCVkIEklYyBGJWQ6JWQgQSVkOiVkXG4iLAorICAgICAgZmlsdGVyLT5jb2xvcnNwYWNlLCBHU1RfVklERU9fSU5GT19XSURUSCAoJmZpbHRlci0+aW5mbyksCisgICAgICBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZmaWx0ZXItPmluZm8pLCBpbnRlcmxhY2VkLAorICAgICAgR1NUX1ZJREVPX0lORk9fRlBTX04gKCZmaWx0ZXItPmluZm8pLAorICAgICAgR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZmaWx0ZXItPmluZm8pLAorICAgICAgR1NUX1ZJREVPX0lORk9fUEFSX04gKCZmaWx0ZXItPmluZm8pLAorICAgICAgR1NUX1ZJREVPX0lORk9fUEFSX0QgKCZmaWx0ZXItPmluZm8pKTsKKyAgbGVuID0gc3RybGVuIChoZWFkZXIpOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3ICgpOworICBnc3RfYnVmZmVyX2FwcGVuZF9tZW1vcnkgKGJ1ZiwKKyAgICAgIGdzdF9tZW1vcnlfbmV3X3dyYXBwZWQgKDAsIGhlYWRlciwgbGVuLCAwLCBsZW4sIGhlYWRlciwgZ19mcmVlKSk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGlubGluZSBHc3RCdWZmZXIgKgorZ3N0X3k0bV9lbmNvZGVfZ2V0X2ZyYW1lX2hlYWRlciAoR3N0WTRtRW5jb2RlICogZmlsdGVyKQoreworICBncG9pbnRlciBoZWFkZXI7CisgIEdzdEJ1ZmZlciAqYnVmOworICBnc2l6ZSBsZW47CisKKyAgaGVhZGVyID0gZ19zdHJkdXBfcHJpbnRmICgiRlJBTUVcbiIpOworICBsZW4gPSBzdHJsZW4gKGhlYWRlcik7CisKKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAoYnVmLAorICAgICAgZ3N0X21lbW9yeV9uZXdfd3JhcHBlZCAoMCwgaGVhZGVyLCBsZW4sIDAsIGxlbiwgaGVhZGVyLCBnX2ZyZWUpKTsKKworICByZXR1cm4gYnVmOworfQorCisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfeTRtX2VuY29kZV9oYW5kbGVfZnJhbWUgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIsCisgICAgR3N0VmlkZW9Db2RlY0ZyYW1lICogZnJhbWUpCit7CisgIEdzdFk0bUVuY29kZSAqZmlsdGVyID0gR1NUX1k0TV9FTkNPREUgKGVuY29kZXIpOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworCisgIC8qIGNoZWNrIHdlIGdvdCBzb21lIGRlY2VudCBpbmZvIGZyb20gY2FwcyAqLworICBpZiAoR1NUX1ZJREVPX0lORk9fRk9STUFUICgmZmlsdGVyLT5pbmZvKSA9PSBHU1RfVklERU9fRk9STUFUX1VOS05PV04pCisgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoZnJhbWUtPmlucHV0X2J1ZmZlcik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFmaWx0ZXItPmhlYWRlcikpIHsKKyAgICBnYm9vbGVhbiB0ZmYgPSBGQUxTRTsKKworICAgIGlmIChHU1RfVklERU9fSU5GT19JU19JTlRFUkxBQ0VEICgmZmlsdGVyLT5pbmZvKSkgeworICAgICAgdGZmID0KKyAgICAgICAgICBHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChmcmFtZS0+aW5wdXRfYnVmZmVyLAorICAgICAgICAgIEdTVF9WSURFT19CVUZGRVJfRkxBR19URkYpOworICAgIH0KKyAgICBmcmFtZS0+b3V0cHV0X2J1ZmZlciA9IGdzdF95NG1fZW5jb2RlX2dldF9zdHJlYW1faGVhZGVyIChmaWx0ZXIsIHRmZik7CisgICAgZmlsdGVyLT5oZWFkZXIgPSBUUlVFOworICAgIGZyYW1lLT5vdXRwdXRfYnVmZmVyID0KKyAgICAgICAgZ3N0X2J1ZmZlcl9hcHBlbmQgKGZyYW1lLT5vdXRwdXRfYnVmZmVyLAorICAgICAgICBnc3RfeTRtX2VuY29kZV9nZXRfZnJhbWVfaGVhZGVyIChmaWx0ZXIpKTsKKyAgfSBlbHNlIHsKKyAgICBmcmFtZS0+b3V0cHV0X2J1ZmZlciA9IGdzdF95NG1fZW5jb2RlX2dldF9mcmFtZV9oZWFkZXIgKGZpbHRlcik7CisgIH0KKworICBmcmFtZS0+b3V0cHV0X2J1ZmZlciA9CisgICAgICBnc3RfYnVmZmVyX2FwcGVuZCAoZnJhbWUtPm91dHB1dF9idWZmZXIsCisgICAgICBnc3RfYnVmZmVyX2NvcHkgKGZyYW1lLT5pbnB1dF9idWZmZXIpKTsKKworICAvKiBkZWNvcmF0ZSAqLworICBmcmFtZS0+b3V0cHV0X2J1ZmZlciA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoZnJhbWUtPm91dHB1dF9idWZmZXIpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoZnJhbWUtPm91dHB1dF9idWZmZXIpID0gdGltZXN0YW1wOworCisgIHJldHVybiBnc3RfdmlkZW9fZW5jb2Rlcl9maW5pc2hfZnJhbWUgKGVuY29kZXIsIGZyYW1lKTsKKworbm90X25lZ290aWF0ZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZmlsdGVyLCBDT1JFLCBORUdPVElBVElPTiwgKE5VTEwpLAorICAgICAgICAoImZvcm1hdCB3YXNuJ3QgbmVnb3RpYXRlZCIpKTsKKworICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF95NG1fZW5jb2RlX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFk0bUVuY29kZSAqZmlsdGVyID0gR1NUX1k0TV9FTkNPREUgKGVsZW1lbnQpOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9DQUxMX1BBUkVOVF9XSVRIX0RFRkFVTFQgKEdTVF9FTEVNRU5UX0NMQVNTLCBjaGFuZ2Vfc3RhdGUsCisgICAgICAoZWxlbWVudCwgdHJhbnNpdGlvbiksIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisgIGlmIChyZXQgIT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKQorICAgIHJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF95NG1fZW5jb2RlX3Jlc2V0IChmaWx0ZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUzsKK30KKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInk0bWVuYyIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICBHU1RfVFlQRV9ZNE1fRU5DT0RFKTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHk0bWVuYywKKyAgICAiRW5jb2RlcyBhIFlVViBmcmFtZSBpbnRvIHRoZSB5dXY0bXBlZyBmb3JtYXQgKG1qcGVndG9vbHMpIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC95NG0vZ3N0eTRtZW5jb2RlLmggYi9nc3QveTRtL2dzdHk0bWVuY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYTdhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QveTRtL2dzdHk0bWVuY29kZS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfWTRNRU5DT0RFX0hfXworI2RlZmluZSBfX0dTVF9ZNE1FTkNPREVfSF9fCisKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1k0TV9FTkNPREUgXAorICAoZ3N0X3k0bV9lbmNvZGVfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1k0TV9FTkNPREUob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSwgR1NUX1RZUEVfWTRNX0VOQ09ERSwgR3N0WTRtRW5jb2RlKSkKKyNkZWZpbmUgR1NUX1k0TV9FTkNPREVfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksIEdTVF9UWVBFX1k0TV9FTkNPREUsIEdzdFk0bUVuY29kZUNsYXNzKSkKKyNkZWZpbmUgR1NUX1k0TV9FTkNPREVfR0VUX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUygob2JqKSwgR1NUX1RZUEVfWTRNX0VOQ09ERSwgR3N0WTRtRW5jb2RlQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfWTRNX0VOQ09ERShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLCBHU1RfVFlQRV9ZNE1fRU5DT0RFKSkKKyNkZWZpbmUgR1NUX0lTX1k0TV9FTkNPREVfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksIEdTVF9UWVBFX1k0TV9FTkNPREUpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0WTRtRW5jb2RlIEdzdFk0bUVuY29kZTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RZNG1FbmNvZGVDbGFzcyBHc3RZNG1FbmNvZGVDbGFzczsKKworc3RydWN0IF9Hc3RZNG1FbmNvZGUgeworICBHc3RWaWRlb0VuY29kZXIgcGFyZW50OworCisgIC8qIGNhcHMgaW5mb3JtYXRpb24gKi8KKyAgR3N0VmlkZW9JbmZvIGluZm87CisKKyAgY29uc3QgZ2NoYXIgKmNvbG9yc3BhY2U7CisgIC8qIHN0YXRlIGluZm9ybWF0aW9uICovCisgIGdib29sZWFuIGhlYWRlcjsKK307CisKK3N0cnVjdCBfR3N0WTRtRW5jb2RlQ2xhc3MgeworICBHc3RWaWRlb0VuY29kZXJDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfeTRtX2VuY29kZV9nZXRfdHlwZSh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1k0TUVOQ09ERV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC95NG0vbWVzb24uYnVpbGQgYi9nc3QveTRtL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ODBlN2UKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QveTRtL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsOCBAQAorZ3N0eTRtZW5jID0gbGlicmFyeSgnZ3N0eTRtZW5jJywKKyAgJ2dzdHk0bWVuY29kZS5jJywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgZ3N0dmlkZW9fZGVwXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKZGlmZiAtLWdpdCBhL2hvb2tzL3ByZS1jb21taXQuaG9vayBiL2hvb2tzL3ByZS1jb21taXQuaG9vawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYzEwNjJiCi0tLSAvZGV2L251bGwKKysrIGIvaG9va3MvcHJlLWNvbW1pdC5ob29rCkBAIC0wLDAgKzEsODMgQEAKKyMhL2Jpbi9zaAorIworIyBDaGVjayB0aGF0IHRoZSBjb2RlIGZvbGxvd3MgYSBjb25zaXN0YW50IGNvZGUgc3R5bGUKKyMKKworIyBDaGVjayBmb3IgZXhpc3RlbmNlIG9mIGluZGVudCwgYW5kIGVycm9yIG91dCBpZiBub3QgcHJlc2VudC4KKyMgT24gc29tZSAqYnNkIHN5c3RlbXMgdGhlIGJpbmFyeSBzZWVtcyB0byBiZSBjYWxsZWQgZ251bmluZGVudCwKKyMgc28gY2hlY2sgZm9yIHRoYXQgZmlyc3QuCisKK3ZlcnNpb249YGdudWluZGVudCAtLXZlcnNpb24gMj4vZGV2L251bGxgCitpZiB0ZXN0ICJ4JHZlcnNpb24iID0gIngiOyB0aGVuCisgIHZlcnNpb249YGdpbmRlbnQgLS12ZXJzaW9uIDI+L2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JHZlcnNpb24iID0gIngiOyB0aGVuCisgICAgdmVyc2lvbj1gaW5kZW50IC0tdmVyc2lvbiAyPi9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JHZlcnNpb24iID0gIngiOyB0aGVuCisgICAgICBlY2hvICJHU3RyZWFtZXIgZ2l0IHByZS1jb21taXQgaG9vazoiCisgICAgICBlY2hvICJEaWQgbm90IGZpbmQgR05VIGluZGVudCwgcGxlYXNlIGluc3RhbGwgaXQgYmVmb3JlIGNvbnRpbnVpbmcuIgorICAgICAgZXhpdCAxCisgICAgZWxzZQorICAgICAgSU5ERU5UPWluZGVudAorICAgIGZpCisgIGVsc2UKKyAgICBJTkRFTlQ9Z2luZGVudAorICBmaQorZWxzZQorICBJTkRFTlQ9Z251aW5kZW50CitmaQorCitjYXNlIGAkSU5ERU5UIC0tdmVyc2lvbmAgaW4KKyAgR05VKikKKyAgICAgIDs7CisgIGRlZmF1bHQpCisgICAgICBlY2hvICJHU3RyZWFtZXIgZ2l0IHByZS1jb21taXQgaG9vazoiCisgICAgICBlY2hvICJEaWQgbm90IGZpbmQgR05VIGluZGVudCwgcGxlYXNlIGluc3RhbGwgaXQgYmVmb3JlIGNvbnRpbnVpbmcuIgorICAgICAgZWNobyAiKEZvdW5kICRJTkRFTlQsIGJ1dCBpdCBkb2Vzbid0IHNlZW0gdG8gYmUgR05VIGluZGVudCkiCisgICAgICBleGl0IDEKKyAgICAgIDs7Citlc2FjCisKK0lOREVOVF9QQVJBTUVURVJTPSItLWJyYWNlcy1vbi1pZi1saW5lIFwKKwktLWNhc2UtYnJhY2UtaW5kZW50YXRpb24wIFwKKwktLWNhc2UtaW5kZW50YXRpb24yIFwKKwktLWJyYWNlcy1hZnRlci1zdHJ1Y3QtZGVjbC1saW5lIFwKKwktLWxpbmUtbGVuZ3RoODAgXAorCS0tbm8tdGFicyBcCisJLS1jdWRkbGUtZWxzZSBcCisJLS1kb250LWxpbmUtdXAtcGFyZW50aGVzZXMgXAorCS0tY29udGludWF0aW9uLWluZGVudGF0aW9uNCBcCisJLS1ob25vdXItbmV3bGluZXMgXAorCS0tdGFiLXNpemU4IFwKKwktLWluZGVudC1sZXZlbDIgXAorCS0tbGVhdmUtcHJlcHJvY2Vzc29yLXNwYWNlIgorCitlY2hvICItLUNoZWNraW5nIHN0eWxlLS0iCitmb3IgZmlsZSBpbiBgZ2l0IGRpZmYtaW5kZXggLS1jYWNoZWQgLS1uYW1lLW9ubHkgSEVBRCAtLWRpZmYtZmlsdGVyPUFDTVJ8IGdyZXAgIlwuYyQiYCA7IGRvCisgICAgIyBuZiBpcyB0aGUgdGVtcG9yYXJ5IGNoZWNrb3V0LiBUaGlzIG1ha2VzIHN1cmUgd2UgY2hlY2sgYWdhaW5zdCB0aGUKKyAgICAjIHJldmlzaW9uIGluIHRoZSBpbmRleCAoYW5kIG5vdCB0aGUgY2hlY2tlZCBvdXQgdmVyc2lvbikuCisgICAgbmY9YGdpdCBjaGVja291dC1pbmRleCAtLXRlbXAgJHtmaWxlfSB8IGN1dCAtZiAxYAorICAgIG5ld2ZpbGU9YG1rdGVtcCAvdG1wLyR7bmZ9LlhYWFhYWGAgfHwgZXhpdCAxCisgICAgJElOREVOVCAke0lOREVOVF9QQVJBTUVURVJTfSBcCisJJG5mIC1vICRuZXdmaWxlIDI+PiAvZGV2L251bGwKKyAgICAjIEZJWE1FOiBDYWxsIGluZGVudCB0d2ljZSBhcyBpdCB0ZW5kcyB0byBkbyBsaW5lLWJyZWFrcworICAgICMgZGlmZmVyZW50IGZvciBldmVyeSBzZWNvbmQgY2FsbC4KKyAgICAkSU5ERU5UICR7SU5ERU5UX1BBUkFNRVRFUlN9IFwKKyAgICAgICAgJG5ld2ZpbGUgMj4+IC9kZXYvbnVsbAorICAgIGRpZmYgLXUgLXAgIiR7bmZ9IiAiJHtuZXdmaWxlfSIKKyAgICByPSQ/CisgICAgcm0gIiR7bmV3ZmlsZX0iCisgICAgcm0gIiR7bmZ9IgorICAgIGlmIFsgJHIgIT0gMCBdIDsgdGhlbgorZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKK2VjaG8gIiBDb2RlIHN0eWxlIGVycm9yIGluOiAkZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCitlY2hvICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorZWNobyAiIFBsZWFzZSBmaXggYmVmb3JlIGNvbW1pdHRpbmcuIERvbid0IGZvcmdldCB0byBydW4gZ2l0IGFkZCBiZWZvcmUgdHJ5aW5nIHRvIGNvbW1pdCBhZ2Fpbi4gICAgICAgICIKK2VjaG8gIiBJZiB0aGUgd2hvbGUgZmlsZSBpcyB0byBiZSBjb21taXR0ZWQsIHRoaXMgc2hvdWxkIHdvcmsgKHJ1biBmcm9tIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5KTogICAgICAiCitlY2hvICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorZWNobyAiICAgZ3N0LWluZGVudCAkZmlsZTsgZ2l0IGFkZCAkZmlsZTsgZ2l0IGNvbW1pdCIKK2VjaG8gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCitlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorICAgICAgICBleGl0IDEKKyAgICBmaQorZG9uZQorZWNobyAiLS1DaGVja2luZyBzdHlsZSBwYXNzLS0iCmRpZmYgLS1naXQgYS9tNC8uZ2l0aWdub3JlIGIvbTQvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTJmNmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbTQvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDE3IEBACitjb2Rlc2V0Lm00CitnZXR0ZXh0Lm00CitnbGliYzIxLm00CitpY29udi5tNAoraW50ZGl2MC5tNAoraW50dHlwZXMtcHJpLm00CitpbnR0eXBlcy5tNAoraW50dHlwZXNfaC5tNAoraXNjLXBvc2l4Lm00CitsY21lc3NhZ2UubTQKK2xpYi1sZC5tNAorbGliLWxpbmsubTQKK2xpYi1wcmVmaXgubTQKK3Byb2d0ZXN0Lm00CitzdGRpbnRfaC5tNAordWludG1heF90Lm00Cit1bG9uZ2xvbmcubTQKZGlmZiAtLWdpdCBhL200L01ha2VmaWxlLmFtIGIvbTQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM3MzhjYQotLS0gL2Rldi9udWxsCisrKyBiL200L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzUgQEAKK0VYVFJBX0RJU1QgPSBcCisJYTUyLm00IFwKKwlhYWxpYi5tNCBcCisJYXMtZmZtcGVnLm00IFwKKwlhcy1saWJsYW1lLm00IFwKKwlhcy1zbHVycC1mZm1wZWcubTQgXAorCWNoZWNrLWxpYmhlYWRlci5tNCBcCisJY29kZXNldC5tNCBcCisJZnJlZXR5cGUyLm00IFwKKwlnZXR0ZXh0Lm00IFwKKwlnbGliYzIxLm00IFwKKwlnbGliLm00IFwKKwlnc3QtYWxzYS5tNCBcCisJZ3N0LWFydHNjLm00IFwKKwlnc3QtZmlvbnJlYWQubTQgXAorCWdzdC1pdm9yYmlzLm00IFwKKwlnc3QtbWF0cm9za2EubTQgXAorCWdzdC1zZGwubTQgXAorCWdzdC1zaG91dDIubTQgXAorCWdzdC1zaWQubTQgXAorCWd0ay5tNCBcCisJaWNvbnYubTQgXAorCWludGRpdjAubTQgXAorCWludHR5cGVzX2gubTQgXAorCWludHR5cGVzLXByaS5tNCBcCisJbGNtZXNzYWdlLm00IFwKKwlsaWJmYW1lLm00IFwKKwlsaWItbGQubTQgXAorCWxpYi1saW5rLm00IFwKKwlsaWItcHJlZml4Lm00IFwKKwlvZ2cubTQgXAorCXByb2d0ZXN0Lm00IFwKKwlzdGRpbnRfaC5tNCBcCisJdWludG1heF90Lm00IFwKKwl2b3JiaXMubTQKZGlmZiAtLWdpdCBhL200L1JFQURNRSBiL200L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDQ0NTk4Ci0tLSAvZGV2L251bGwKKysrIGIvbTQvUkVBRE1FCkBAIC0wLDAgKzEsMyBAQAorQWxsIGFjbG9jYWwgLm00IGZpbGVzIHdlIG5lZWQgYXJlIHB1dCBoZXJlIGFuZCBjYXQnZCB0byBhY2luY2x1ZGUubTQgaW4gCit0aGUgc291cmNlIHJvb3QuICBPZmZpY2lhbCBvbmVzICh0YWtlbiBmcm9tIHRoZSByZWxldmFudCBkZXZlbCBwYWNrYWdlcykgCithcmUgbmFtZWQgYXMtaXMsIHVub2ZmaWNpYWwgb25lcyAob3IgY2hhbmdlZCBvbmVzKSBnZXQgYSBnc3QtcHJlZml4LgpkaWZmIC0tZ2l0IGEvbTQvYTUyLm00IGIvbTQvYTUyLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNjVkZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9hNTIubTQKQEAgLTAsMCArMSwxMjUgQEAKK2RubAorZG5sIEE1Ml9DSEVDSy1MSUJIRUFERVIoRkVBVFVSRS1OQU1FLCBMSUItTkFNRSwgTElCLUZVTkNUSU9OLCBIRUFERVItTkFNRSwKK2RubCAgICAgICAgICAgICAgICAgICAgIEFDVElPTi1JRi1GT1VORCwgQUNUSU9OLUlGLU5PVC1GT1VORCwKK2RubCAgICAgICAgICAgICAgICAgICAgIEVYVFJBLUxERkxBR1MsIEVYVFJBLUNQUEZMQUdTKQorZG5sCitkbmwgRkVBVFVSRS1OQU1FICAgICAgICAtIGZlYXR1cmUgbmFtZTsgbGlicmFyeSBhbmQgaGVhZGVyIGZpbGVzIGFyZSB0cmVhdGVkCitkbmwgICAgICAgICAgICAgICAgICAgICAgIGFzIGZlYXR1cmUsIHdoaWNoIHdlIGxvb2sgZm9yCitkbmwgTElCLU5BTUUgICAgICAgICAgICAtIGxpYnJhcnkgbmFtZSBhcyBpbiBBQ19DSEVDS19MSUIgbWFjcm8KK2RubCBMSUItRlVOQ1RJT04gICAgICAgIC0gbGlicmFyeSBzeW1ib2wgYXMgaW4gQUNfQ0hFQ0tfTElCIG1hY3JvCitkbmwgSEVBREVSLU5BTUUgICAgICAgICAtIGhlYWRlciBmaWxlIG5hbWUgYXMgaW4gQUNfQ0hFQ0tfSEVBREVSCitkbmwgQUNUSU9OLUlGLUZPVU5EICAgICAtIHdoZW4gZmVhdHVyZSBpcyBmb3VuZCB0aGVuIGV4ZWN1dGUgZ2l2ZW4gYWN0aW9uCitkbmwgQUNUSU9OLUlGLU5PVC1GT1VORCAtIHdoZW4gZmVhdHVyZSBpcyBub3QgZm91bmQgdGhlbiBleGVjdXRlIGdpdmVuIGFjdGlvbgorZG5sIEVYVFJBLUxERkxBR1MgICAgICAgLSBleHRyYSBsaW5rZXIgZmxhZ3MgKC1MIG9yIC1sKQorZG5sIEVYVFJBLUNQUEZMQUdTICAgICAgLSBleHRyYSBDIHByZXByb2Nlc3NvciBmbGFncywgaS5lLiAtSS91c3IvWDExUjYvaW5jbHVkZQorZG5sCitkbmwgQmFzZWQgb24gR1NUX0NIRUNLX0xJQkhFQURFUiBmcm9tIGdzdHJlYW1lciBwbHVnaW5zIDAuMy4xLgorZG5sCitBQ19ERUZVTihbQTUyX0NIRUNLX0xJQkhFQURFUl0sCitbCisgIEFDX0NIRUNLX0xJQihbJDJdLCBbJDNdLCBIQVZFX1skMV09eWVzLCBIQVZFX1skMV09bm8sIFskN10pCisgIGNoZWNrX2xpYmhlYWRlcl9mZWF0dXJlX25hbWU9dHJhbnNsaXQoWyQxXSwgQS1aLCBhLXopCisKKyAgaWYgdGVzdCAieCRIQVZFX1skMV0iID0gInh5ZXMiOyB0aGVuCisgICAgY2hlY2tfbGliaGVhZGVyX3NhdmVfQ1BQRkxBR1M9JENQUEZMQUdTCisgICAgQ1BQRkxBR1M9IlskOF0gJENQUEZMQUdTIgorICAgIEFDX0NIRUNLX0hFQURFUihbJDRdLCA6LCBIQVZFX1skMV09bm8pCisgICAgQ1BQRkxBR1M9JGNoZWNrX2xpYmhlYWRlcl9zYXZlX0NQUEZMQUdTCisgIGZpCisKKyAgaWYgdGVzdCAieCRIQVZFX1skMV0iID0gInh5ZXMiOyB0aGVuCisgICAgaWZlbHNlKFskNV0sICwgOiwgWyQ1XSkKKyAgZWxzZQorICAgIGlmZWxzZShbJDZdLCAsIDosIFskNl0pCisgIGZpCitdCispCisKK2RubAorZG5sIEFDX0NIRUNLX0E1MkRFQyhBQ1RJT04tSUYtRk9VTkQsIEFDVElPTi1JRi1OT1QtRk9VTkQpCitkbmwKK2RubCBBQ1RJT04tSUYtRk9VTkQgICAgIC0gd2hlbiBmZWF0dXJlIGlzIGZvdW5kIHRoZW4gZXhlY3V0ZSBnaXZlbiBhY3Rpb24KK2RubCBBQ1RJT04tSUYtTk9ULUZPVU5EIC0gd2hlbiBmZWF0dXJlIGlzIG5vdCBmb3VuZCB0aGVuIGV4ZWN1dGUgZ2l2ZW4gYWN0aW9uCitkbmwKK2RubCBEZWZpbmVzIEhBVkVfQTUyREVDIHRvIHllcyBpZiBsaWJhNTIgaXMgZm91bmQKK2RubAorZG5sIENGTEFHUyBhbmQgTERGTEFHUyBmb3IgdGhlIGxpYnJhcnkgYXJlIHN0b3JlZCBpbiBBNTJERUNfQ0ZMQUdTIGFuZAorZG5sIEE1MkRFQ19MSUJTLCByZXNwZWN0aXZlbHkKK2RubAorZG5sIEJhc2VkIG9uIEdTVF9DSEVDS19BNTJERUMgZnJvbSBnc3RyZWFtZXIgcGx1Z2lucyAwLjMuMy4xCitkbmwgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+LCBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CitkbmwKK0FDX0RFRlVOKFtBQ19DSEVDS19BNTJERUNdLCAKK1tkbmwKK0FDX0FSR19XSVRIKGE1MmRlYy1wcmVmaXgsCisgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1hNTJkZWMtcHJlZml4PVBGWF0sCisgICAgICAgICAgICAgICAgICAgW3ByZWZpeCB3aGVyZSBhNTJkZWMgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldKSwKKyAgICBhNTJkZWNfY29uZmlnX3ByZWZpeD0iJHdpdGh2YWwiLCBhNTJkZWNfY29uZmlnX3ByZWZpeD0iIikKKworaWYgdGVzdCB4JGE1MmRlY19jb25maWdfcHJlZml4ID0geCA7IHRoZW4KKyAgICBBNTJfQ0hFQ0tfTElCSEVBREVSKEE1MkRFQywgYTUyLCBhNTJfaW5pdCwgYTUyZGVjL2E1Mi5oLAorICAgICAgICBBNTJERUNfTElCUz0iLWxhNTIgLWxtIiwgLCAtbG0pCitlbHNlCisgICAgQTUyX0NIRUNLX0xJQkhFQURFUihBNTJERUMsIGE1MiwgYTUyX2luaXQsIGE1MmRlYy9hNTIuaCwgWworICAgICAgICAgICAgQTUyREVDX0xJQlM9Ii1sYTUyIC1MJGE1MmRlY19jb25maWdfcHJlZml4L2xpYiAtbG0iCisgICAgICAgICAgICBBNTJERUNfQ0ZMQUdTPSItSSRhNTJkZWNfY29uZmlnX3ByZWZpeC9pbmNsdWRlIgorICAgICAgICBdLCAsIC1MJGE1MmRlY19jb25maWdfcHJlZml4L2xpYiwgLUkkYTUyZGVjX2NvbmZpZ19wcmVmaXgvaW5jbHVkZSkKK2ZpCisKK2lmIHRlc3QgJEhBVkVfQTUyREVDID0gInllcyI7IHRoZW4KKyAgICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICBhY19zYXZlX0xJQlM9IiRMSUJTIgorICAgIENGTEFHUz0iJENGTEFHUyAkQTUyREVDX0NGTEFHUyIKKyAgICBMSUJTPSIkQTUyREVDX0xJQlMgJExJQlMiCisgICAgQUNfVFJZX1JVTihbCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxhNTJkZWMvYTUyLmg+CisKK2ludCAKK21haW4gKCkKK3sKKyAgYTUyX3N0YXRlX3QgKnN0YXRlOworICBzdGF0ZSA9IGE1Ml9pbml0ICgwKTsKKyAgYTUyX2ZyZWUgKHN0YXRlKTsKKyAgcmV0dXJuIDA7Cit9CisgICAgICAgIF0sLCBIQVZFX0E1MkRFQz1ubywgW2VjaG8gJGFjX24gImNyb3NzIGNvbXBpbGluZzsgYXNzdW1lZCBPSy4uLiAkYWNfYyJdKQorCisgICAgaWYgdGVzdCBIQVZFX0E1MkRFQyA9ICJubyI7IHRoZW4KKyAgICAgICAgZWNobyAiKioqIFlvdXIgYTUyZGVjIGlzIGJvcmtlZCBzb21laG93LiBQbGVhc2UgdXBkYXRlIHRvIDAuNy40LiIKKyAgICBlbHNlCisgICAgICAgIEFDX1RSWV9SVU4oWworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8YTUyZGVjL2E1Mi5oPgorCitpbnQgCittYWluICgpCit7CisgIGludCBpID0gc2l6ZW9mIChhNTJfc3RhdGVfdCk7CisgIGlmICggaSApCisgICAgcmV0dXJuIDA7Cit9CisgICAgICAgICAgICBdLCBIQVZFX0E1MkRFQz1ubywsIFtlY2hvICRhY19uICJjcm9zcyBjb21waWxpbmc7IGFzc3VtZWQgT0suLi4gJGFjX2MiXSkKKworICAgICAgICBpZiB0ZXN0IEhBVkVfQTUyREVDID0gIm5vIjsgdGhlbgorICAgICAgICAgICAgZWNobyAiKioqIFlvdXIgYTUyZGVjIGlzIHRvbyBvbGQuIFBsZWFzZSB1cGRhdGUgdG8gMC43LjQuIgorICAgICAgICBmaQorICAgIGZpCisgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisgICAgTElCUz0iJGFjX3NhdmVfTElCUyIKK2ZpCisKK2lmIHRlc3QgSEFWRV9BNTJERUMgPSAibm8iOyB0aGVuCisgICAgQTUyREVDX0NGTEFHUz0iIgorICAgIEE1MkRFQ19MSUJTPSIiCitmaQorCitpZiB0ZXN0ICJ4JEhBVkVfQTUyREVDIiA9ICJ4eWVzIjsgdGhlbgorICBpZmVsc2UoWyQxXSwgLCA6LCBbJDFdKQorZWxzZQorICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKQorZmkKKworQUNfU1VCU1QoQTUyREVDX0NGTEFHUykKK0FDX1NVQlNUKEE1MkRFQ19MSUJTKQorXSkKZGlmZiAtLWdpdCBhL200L2FhbGliLm00IGIvbTQvYWFsaWIubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlMGE2NAotLS0gL2Rldi9udWxsCisrKyBiL200L2FhbGliLm00CkBAIC0wLDAgKzEsMTc4IEBACisjIENvbmZpZ3VyZSBwYXRocyBmb3IgQUFMSUIKKyMgdG91Y2hlZCB1cCBmb3IgY2xlYW4gb3V0cHV0IGJ5IFRob21hcyBWYW5kZXIgU3RpY2hlbGUKKyMgSmFuIEh1Ymlja2EgNC8yMi8yMDAxCisjIHN0b2xlbiBmcm9tIFNhbSBMYW50aW5nYSA5LzIxLzk5CisjIHN0b2xlbiBmcm9tIE1hbmlzaCBTaW5naAorIyBzdG9sZW4gYmFjayBmcm9tIEZyYW5rIEJlbGV3CisjIHN0b2xlbiBmcm9tIE1hbmlzaCBTaW5naAorIyBTaGFtZWxlc3NseSBzdG9sZW4gZnJvbSBPd2VuIFRheWxvcgorCitkbmwgQU1fUEFUSF9BQUxJQihbTUlOSU1VTS1WRVJTSU9OLCBbQUNUSU9OLUlGLUZPVU5EIFssIEFDVElPTi1JRi1OT1QtRk9VTkRdXV0pCitkbmwgVGVzdCBmb3IgQUFMSUIsIGFuZCBkZWZpbmUgQUFMSUJfQ0ZMQUdTIGFuZCBBQUxJQl9MSUJTCitkbmwKK0FDX0RFRlVOKFtBTV9QQVRIX0FBTElCXSwKK1tkbmwgCitkbmwgR2V0IHRoZSBjZmxhZ3MgYW5kIGxpYnJhcmllcyBmcm9tIHRoZSBhYWxpYi1jb25maWcgc2NyaXB0CitkbmwKK0FDX0FSR19XSVRIKGFhbGliLXByZWZpeCwKKyAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1hYWxpYi1wcmVmaXg9UEZYXSwKKyAgICAgICAgICAgICAgICAgW3ByZWZpeCB3aGVyZSBBQUxJQiBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0pLAorICBhYWxpYl9wcmVmaXg9IiR3aXRodmFsIiwgYWFsaWJfcHJlZml4PSIiKQorCitBQ19BUkdfV0lUSChhYWxpYi1leGVjLXByZWZpeCwKKyAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1hYWxpYi1leGVjLXByZWZpeD1QRlhdLAorICAgICAgICAgICAgICAgICBbZXhlYyBwcmVmaXggd2hlcmUgQUFMSUIgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldKSwKKyAgYWFsaWJfZXhlY19wcmVmaXg9IiR3aXRodmFsIiwgYWFsaWJfZXhlY19wcmVmaXg9IiIpCisKK0FDX0FSR19FTkFCTEUoYWFsaWJ0ZXN0LCAKKyAgQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1hYWxpYnRlc3RdLAorICAgICAgICAgICAgICAgICBbZG8gbm90IHRyeSB0byBjb21waWxlIGFuZCBydW4gYSB0ZXN0IEFBTElCIHByb2dyYW1dKSwKKyAgLCBlbmFibGVfYWFsaWJ0ZXN0PXllcykKKworICBpZiB0ZXN0IHgkYWFsaWJfZXhlY19wcmVmaXggIT0geCA7IHRoZW4KKyAgICAgYWFsaWJfYXJncz0iJGFhbGliX2FyZ3MgLS1leGVjLXByZWZpeD0kYWFsaWJfZXhlY19wcmVmaXgiCisgICAgIGlmIHRlc3QgeCR7QUFMSUJfQ09ORklHK3NldH0gIT0geHNldCA7IHRoZW4KKyAgICAgICAgQUFMSUJfQ09ORklHPSRhYWxpYl9leGVjX3ByZWZpeC9iaW4vYWFsaWItY29uZmlnCisgICAgIGZpCisgIGZpCisgIGlmIHRlc3QgeCRhYWxpYl9wcmVmaXggIT0geCA7IHRoZW4KKyAgICAgYWFsaWJfYXJncz0iJGFhbGliX2FyZ3MgLS1wcmVmaXg9JGFhbGliX3ByZWZpeCIKKyAgICAgaWYgdGVzdCB4JHtBQUxJQl9DT05GSUcrc2V0fSAhPSB4c2V0IDsgdGhlbgorICAgICAgICBBQUxJQl9DT05GSUc9JGFhbGliX3ByZWZpeC9iaW4vYWFsaWItY29uZmlnCisgICAgIGZpCisgIGZpCisKKyAgQUNfUEFUSF9QUk9HKEFBTElCX0NPTkZJRywgYWFsaWItY29uZmlnLCBubykKKyAgbWluX2FhbGliX3ZlcnNpb249aWZlbHNlKFskMV0sICwwLjExLjAsJDEpCisgIEFDX01TR19DSEVDS0lORyhmb3IgQUFMSUIgLSB2ZXJzaW9uID49ICRtaW5fYWFsaWJfdmVyc2lvbikKKyAgbm9fYWFsaWI9IiIKKyAgaWYgdGVzdCAiJEFBTElCX0NPTkZJRyIgPSAibm8iIDsgdGhlbgorICAgIG5vX2FhbGliPXllcworICBlbHNlCisgICAgQUFMSUJfQ0ZMQUdTPWAkQUFMSUJfQ09ORklHICRhYWxpYmNvbmZfYXJncyAtLWNmbGFnc2AKKyAgICBBQUxJQl9MSUJTPWAkQUFMSUJfQ09ORklHICRhYWxpYmNvbmZfYXJncyAtLWxpYnNgCisKKyAgICBhYWxpYl9tYWpvcl92ZXJzaW9uPWAkQUFMSUJfQ09ORklHICRhYWxpYl9hcmdzIC0tdmVyc2lvbiB8IFwKKyAgICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wxLydgCisgICAgYWFsaWJfbWlub3JfdmVyc2lvbj1gJEFBTElCX0NPTkZJRyAkYWFsaWJfYXJncyAtLXZlcnNpb24gfCBcCisgICAgICAgICAgIHNlZCAncy9cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS9cMi8nYAorICAgIGFhbGliX21pY3JvX3ZlcnNpb249YCRBQUxJQl9DT05GSUcgJGFhbGliX2NvbmZpZ19hcmdzIC0tdmVyc2lvbiB8IFwKKyAgICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wzLydgCisgICAgaWYgdGVzdCAieCRlbmFibGVfYWFsaWJ0ZXN0IiA9ICJ4eWVzIiA7IHRoZW4KKyAgICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgIENGTEFHUz0iJENGTEFHUyAkQUFMSUJfQ0ZMQUdTIgorICAgICAgTElCUz0iJExJQlMgJEFBTElCX0xJQlMiCitkbmwKK2RubCBOb3cgY2hlY2sgaWYgdGhlIGluc3RhbGxlZCBBQUxJQiBpcyBzdWZmaWNpZW50bHkgbmV3LiAoQWxzbyBzYW5pdHkKK2RubCBjaGVja3MgdGhlIHJlc3VsdHMgb2YgYWFsaWItY29uZmlnIHRvIHNvbWUgZXh0ZW50CitkbmwKKyAgICAgIHJtIC1mIGNvbmYuYWFsaWJ0ZXN0CisgICAgICBBQ19UUllfUlVOKFsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImFhbGliLmgiCisKK2NoYXIqCitteV9zdHJkdXAgKGNoYXIgKnN0cikKK3sKKyAgY2hhciAqbmV3X3N0cjsKKyAgCisgIGlmIChzdHIpCisgICAgeworICAgICAgbmV3X3N0ciA9IChjaGFyICopbWFsbG9jICgoc3RybGVuIChzdHIpICsgMSkgKiBzaXplb2YoY2hhcikpOworICAgICAgc3RyY3B5IChuZXdfc3RyLCBzdHIpOworICAgIH0KKyAgZWxzZQorICAgIG5ld19zdHIgPSBOVUxMOworICAKKyAgcmV0dXJuIG5ld19zdHI7Cit9CisKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgbWFqb3IsIG1pbm9yLCBtaWNybzsKKyAgY2hhciAqdG1wX3ZlcnNpb247CisKKyAgLyogVGhpcyBoYW5ncyBvbiBzb21lIHN5c3RlbXMgKD8pCisgIHN5c3RlbSAoInRvdWNoIGNvbmYuYWFsaWJ0ZXN0Iik7CisgICovCisgIHsgRklMRSAqZnAgPSBmb3BlbigiY29uZi5hYWxpYnRlc3QiLCAiYSIpOyBpZiAoIGZwICkgZmNsb3NlKGZwKTsgfQorCisgIC8qIEhQL1VYIDkgKCVAIyEpIHdyaXRlcyB0byBzc2NhbmYgc3RyaW5ncyAqLworICB0bXBfdmVyc2lvbiA9IG15X3N0cmR1cCgiJG1pbl9hYWxpYl92ZXJzaW9uIik7CisgIGlmIChzc2NhbmYodG1wX3ZlcnNpb24sICIlZC4lZC4lZCIsICZtYWpvciwgJm1pbm9yLCAmbWljcm8pICE9IDMpIHsKKyAgICAgcHJpbnRmKCIlcywgYmFkIHZlcnNpb24gc3RyaW5nXG4iLCAiJG1pbl9hYWxpYl92ZXJzaW9uIik7CisgICAgIGV4aXQoMSk7CisgICB9CisKKyAgIGlmICgoJGFhbGliX21ham9yX3ZlcnNpb24gPiBtYWpvcikgfHwKKyAgICAgICgoJGFhbGliX21ham9yX3ZlcnNpb24gPT0gbWFqb3IpICYmICgkYWFsaWJfbWlub3JfdmVyc2lvbiA+IG1pbm9yKSkgfHwKKyAgICAgICgoJGFhbGliX21ham9yX3ZlcnNpb24gPT0gbWFqb3IpICYmICgkYWFsaWJfbWlub3JfdmVyc2lvbiA9PSBtaW5vcikgJiYgKCRhYWxpYl9taWNyb192ZXJzaW9uID49IG1pY3JvKSkpCisgICAgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJpbnRmKCJcbioqKiAnYWFsaWItY29uZmlnIC0tdmVyc2lvbicgcmV0dXJuZWQgJWQuJWQuJWQsIGJ1dCB0aGUgbWluaW11bSB2ZXJzaW9uXG4iLCAkYWFsaWJfbWFqb3JfdmVyc2lvbiwgJGFhbGliX21pbm9yX3ZlcnNpb24sICRhYWxpYl9taWNyb192ZXJzaW9uKTsKKyAgICAgIHByaW50ZigiKioqIG9mIEFBTElCIHJlcXVpcmVkIGlzICVkLiVkLiVkLiBJZiBhYWxpYi1jb25maWcgaXMgY29ycmVjdCwgdGhlbiBpdCBpc1xuIiwgbWFqb3IsIG1pbm9yLCBtaWNybyk7CisgICAgICBwcmludGYoIioqKiBiZXN0IHRvIHVwZ3JhZGUgdG8gdGhlIHJlcXVpcmVkIHZlcnNpb24uXG4iKTsKKyAgICAgIHByaW50ZigiKioqIElmIGFhbGliLWNvbmZpZyB3YXMgd3JvbmcsIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQUFMSUJfQ09ORklHXG4iKTsKKyAgICAgIHByaW50ZigiKioqIHRvIHBvaW50IHRvIHRoZSBjb3JyZWN0IGNvcHkgb2YgYWFsaWItY29uZmlnLCBhbmQgcmVtb3ZlIHRoZSBmaWxlXG4iKTsKKyAgICAgIHByaW50ZigiKioqIGNvbmZpZy5jYWNoZSBiZWZvcmUgcmUtcnVubmluZyBjb25maWd1cmVcbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCitdLCwgbm9fYWFsaWI9eWVzLFtlY2hvICRhY19uICJjcm9zcyBjb21waWxpbmc7IGFzc3VtZWQgT0suLi4gJGFjX2MiXSkKKyAgICAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKKyAgICAgICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorICAgICBmaQorICBmaQorICBpZiB0ZXN0ICJ4JG5vX2FhbGliIiA9IHggOyB0aGVuCisgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKSAgICAgCisgIGVsc2UKKyAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgaWYgdGVzdCAiJEFBTElCX0NPTkZJRyIgPSAibm8iIDsgdGhlbgorICAgICAgIGVjaG8gIioqKiBUaGUgYWFsaWItY29uZmlnIHNjcmlwdCBpbnN0YWxsZWQgYnkgQUFMSUIgY291bGQgbm90IGJlIGZvdW5kIgorICAgICAgIGVjaG8gIioqKiBJZiBBQUxJQiB3YXMgaW5zdGFsbGVkIGluIFBSRUZJWCwgbWFrZSBzdXJlIFBSRUZJWC9iaW4gaXMgaW4iCisgICAgICAgZWNobyAiKioqIHlvdXIgcGF0aCwgb3Igc2V0IHRoZSBBQUxJQl9DT05GSUcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIgorICAgICAgIGVjaG8gIioqKiBmdWxsIHBhdGggdG8gYWFsaWItY29uZmlnLiIKKyAgICAgZWxzZQorICAgICAgIGlmIHRlc3QgLWYgY29uZi5hYWxpYnRlc3QgOyB0aGVuCisgICAgICAgIDoKKyAgICAgICBlbHNlCisgICAgICAgICAgZWNobyAiKioqIENvdWxkIG5vdCBydW4gQUFMSUIgdGVzdCBwcm9ncmFtLCBjaGVja2luZyB3aHkuLi4iCisgICAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRBQUxJQl9DRkxBR1MiCisgICAgICAgICAgTElCUz0iJExJQlMgJEFBTElCX0xJQlMiCisgICAgICAgICAgQUNfVFJZX0xJTksoWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiQUFMSUIuaCIKK10sICAgICAgWyByZXR1cm4gMDsgXSwKKyAgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBjb21waWxlZCwgYnV0IGRpZCBub3QgcnVuLiBUaGlzIHVzdWFsbHkgbWVhbnMiCisgICAgICAgICAgZWNobyAiKioqIHRoYXQgdGhlIHJ1bi10aW1lIGxpbmtlciBpcyBub3QgZmluZGluZyBBQUxJQiBvciBmaW5kaW5nIHRoZSB3cm9uZyIKKyAgICAgICAgICBlY2hvICIqKiogdmVyc2lvbiBvZiBBQUxJQi4gSWYgaXQgaXMgbm90IGZpbmRpbmcgQUFMSUIsIHlvdSdsbCBuZWVkIHRvIHNldCB5b3VyIgorICAgICAgICAgIGVjaG8gIioqKiBMRF9MSUJSQVJZX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIGVkaXQgL2V0Yy9sZC5zby5jb25mIHRvIHBvaW50IgorICAgICAgICAgIGVjaG8gIioqKiB0byB0aGUgaW5zdGFsbGVkIGxvY2F0aW9uICBBbHNvLCBtYWtlIHN1cmUgeW91IGhhdmUgcnVuIGxkY29uZmlnIGlmIHRoYXQiCisgICAgICAgICAgZWNobyAiKioqIGlzIHJlcXVpcmVkIG9uIHlvdXIgc3lzdGVtIgorCSAgZWNobyAiKioqIgorICAgICAgICAgIGVjaG8gIioqKiBJZiB5b3UgaGF2ZSBhbiBvbGQgdmVyc2lvbiBpbnN0YWxsZWQsIGl0IGlzIGJlc3QgdG8gcmVtb3ZlIGl0LCBhbHRob3VnaCIKKyAgICAgICAgICBlY2hvICIqKiogeW91IG1heSBhbHNvIGJlIGFibGUgdG8gZ2V0IHRoaW5ncyB0byB3b3JrIGJ5IG1vZGlmeWluZyBMRF9MSUJSQVJZX1BBVEgiXSwKKyAgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBmYWlsZWQgdG8gY29tcGlsZSBvciBsaW5rLiBTZWUgdGhlIGZpbGUgY29uZmlnLmxvZyBmb3IgdGhlIgorICAgICAgICAgIGVjaG8gIioqKiBleGFjdCBlcnJvciB0aGF0IG9jY3VyZWQuIFRoaXMgdXN1YWxseSBtZWFucyBBQUxJQiB3YXMgaW5jb3JyZWN0bHkgaW5zdGFsbGVkIgorICAgICAgICAgIGVjaG8gIioqKiBvciB0aGF0IHlvdSBoYXZlIG1vdmVkIEFBTElCIHNpbmNlIGl0IHdhcyBpbnN0YWxsZWQuIEluIHRoZSBsYXR0ZXIgY2FzZSwgeW91IgorICAgICAgICAgIGVjaG8gIioqKiBtYXkgd2FudCB0byBlZGl0IHRoZSBhYWxpYi1jb25maWcgc2NyaXB0OiAkQUFMSUJfQ09ORklHIiBdKQorICAgICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgICAgICAgZmkKKyAgICAgZmkKKyAgICAgQUFMSUJfQ0ZMQUdTPSIiCisgICAgIEFBTElCX0xJQlM9IiIKKyAgICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkKKyAgZmkKKyAgQUNfU1VCU1QoQUFMSUJfQ0ZMQUdTKQorICBBQ19TVUJTVChBQUxJQl9MSUJTKQorICBybSAtZiBjb25mLmFhbGlidGVzdAorXSkKZGlmZiAtLWdpdCBhL200L2FzLWZmbXBlZy5tNCBiL200L2FzLWZmbXBlZy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTBjMzhkCi0tLSAvZGV2L251bGwKKysrIGIvbTQvYXMtZmZtcGVnLm00CkBAIC0wLDAgKzEsOTkgQEAKKyMgQ0ZMQUdTIGFuZCBsaWJyYXJ5IHBhdGhzIGZvciBGRk1QRUcKKyMgdGFrZW4gZnJvbSBBdXRvc3RhciBTYW5kYm94LCBodHRwOi8vYXV0b3N0YXJzLnNvdXJjZWZvcmdlLm5ldC8KKworZG5sIFVzYWdlOgorZG5sIEFNX1BBVEhfRkZNUEVHKFtNSU5JTVVNLVZFUlNJT04sIFtBQ1RJT04tSUYtRk9VTkQgWywgQUNUSU9OLUlGLU5PVC1GT1VORF1dXSkKK2RubCBGSVhNRTogdmVyc2lvbiBjaGVja2luZyBkb2VzIG5vdCB3b3JrIGN1cnJlbnRseQorZG5sCitkbmwgRXhhbXBsZToKK2RubCBBTV9QQVRIX0ZGTVBFRygwLjQuNiwgLCBBQ19NU0dfRVJST1IoWyoqKiBGRk1QRUcgPj0gMC40LjYgbm90IGluc3RhbGxlZCkpIAorZG5sCitkbmwgRGVmaW5lcyBGRk1QRUdfTElCUworZG5sIEZJWE1FOiBzaG91bGQgZGVmaW5lIEZGTVBFR19WRVJTSU9OCitkbmwKKworQUNfREVGVU4oW0FNX1BBVEhfRkZNUEVHXSwKK1sKKyAgZG5sIGFsbG93IGZvciBzcGVjaWZpY2F0aW9uIG9mIGEgc291cmNlIHBhdGggKGZvciB1bmluc3RhbGxlZCkKKyAgQUNfQVJHX1dJVEgoZmZtcGVnLXNvdXJjZSwKKyAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWZmbXBlZy1zb3VyY2U9RElSXSwKKyAgICAgICAgICAgICAgICAgICBbRGlyZWN0b3J5IHdoZXJlIEZGbXBlZyBzb3VyY2UgaXMgKG9wdGlvbmFsKV0pLAorICAgIGZmbXBlZ19zb3VyY2U9IiR3aXRodmFsIikKKworICBkbmwgc2F2ZSBDRkxBR1MgYW5kIExJQlMgaGVyZQorICBDRkxBR1Nfc2F2ZT0kQ0ZMQUdTCisgIExJQlNfc2F2ZT0kTElCUworICBpZiB0ZXN0ICJ4JGZmbXBlZ19zb3VyY2UiICE9ICJ4IjsgdGhlbgorICAgIGRubCB1bmluc3RhbGxlZCBGRm1wZWcgY29weQorICAgIEFDX01TR19OT1RJQ0UoW0xvb2tpbmcgZm9yIEZGbXBlZyBzb3VyY2UgaW4gJGZmbXBlZ19zb3VyY2VdKQorICAgIENGTEFHUz0iLUkkZmZtcGVnX3NvdXJjZS9saWJhdiAtSSRmZm1wZWdfc291cmNlL2xpYmF2Y29kZWMiCisgICAgTElCUz0iLUwkZmZtcGVnX3NvdXJjZS9saWJhdiAtTCRmZm1wZWdfc291cmNlL2xpYmF2Y29kZWMiCisgICAgQUNfREVGSU5FX1VOUVVPVEVEKEhBVkVfRkZNUEVHX1VOSU5TVEFMTEVELCAxLAorICAgICAgICAgICAgICAgICAgICAgICBbZGVmaW5lZCBpZiB3ZSBjb21waWxlIGFnYWluc3QgdW5pbnN0YWxsZWQgRkZtcGVnXSkKKyAgICBGRk1QRUdfQ09NTU9OX0lOQ0xVREU9IiNpbmNsdWRlIDxjb21tb24uaD4iCisgIGVsc2UKKyAgICBGRk1QRUdfQ09NTU9OX0lOQ0xVREU9IiNpbmNsdWRlIDxmZm1wZWcvY29tbW9uLmg+IgorICBmaQorICAKKyAgZG5sIGNoZWNrIGZvciBsaWJhdmNvZGVjCisgIEFDX0NIRUNLX0xJQihhdmNvZGVjLCBhdmNvZGVjX2luaXQsIEhBVkVfRkZNUEVHPXllcywgSEFWRV9GRk1QRUc9bm8pCisgIAorICBkbmwgY2hlY2sgZm9yIGF2Y29kZWMuaCBhbmQgYXZmb3JtYXQuaAorICBpZiB0ZXN0ICJ4JGZmbXBlZ19zb3VyY2UiICE9ICJ4IjsgdGhlbgorICAgIGRubCB1bmluc3RhbGxlZAorICAgIEFDX0NIRUNLX0hFQURFUihhdmNvZGVjLmgsICwgSEFWRV9GRk1QRUc9bm8sIFsvKiBvbmx5IGNvbXBpbGUgKi9dKQorICAgIEFDX0NIRUNLX0hFQURFUihhdmZvcm1hdC5oLCAsIEhBVkVfRkZNUEVHPW5vLCBbLyogb25seSBjb21waWxlICovXSkKKyAgZWxzZQorICAgIEFDX0NIRUNLX0hFQURFUihmZm1wZWcvYXZjb2RlYy5oLCAsIEhBVkVfRkZNUEVHPW5vKQorICAgIEFDX0NIRUNLX0hFQURFUihmZm1wZWcvYXZmb3JtYXQuaCwgLCBIQVZFX0ZGTVBFRz1ubykKKyAgZmkKKworZG5sIG5vdyBjaGVjayBpZiBpdCdzIHN1ZmZpY2llbnRseSBuZXcKKworICBBQ19MQU5HX1NBVkUoKQorICBBQ19MQU5HX0MoKQorCisgIGRubCBGSVhNRTogd2UgdXNlIHN0cmNtcCwgd2hpY2ggd2Uga25vdyBpcyBnb2luZyB0byBicmVhayBpZiBmZm1wZWcgZXZlciB1c2VzCisgIGRubCB0d28gZGlnaXRzIGZvciBhbnkgb2YgdGhlaXIgdmVyc2lvbiBudW1iZXJzLiAgSXQgbWFrZXMgdGhlIHRlc3Qgc28gbXVjaAorICBkbmwgZWFzaWVyIHRob3VnaCBzbyBsZXQncyBpZ25vcmUgdGhhdAorICBBQ19UUllfUlVOKFsKKyRGRk1QRUdfQ09NTU9OX0lOQ0xVREUKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitpbnQKK21haW4gKCkKK3sKKyAgaWYgKHN0cmNtcCAoRkZNUEVHX1ZFUlNJT04sICIkMSIpID09IC0xKQorICB7CisgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAgICAgICJFUlJPUjogeW91ciBjb3B5IG9mIGZmbXBlZyBpcyB0b28gb2xkICglcylcbiIsIEZGTVBFR19WRVJTSU9OKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CitdLCAsIEhBVkVfRkZNUEVHPW5vKQorCitkbmwgbm93IGRvIHRoZSBhY3R1YWwgImRvIHdlIGhhdmUgaXQgPyIgdGVzdAorICBpZiB0ZXN0ICJ4JEhBVkVfRkZNUEVHIiA9ICJ4eWVzIjsgdGhlbgorICAgIEZGTVBFR19MSUJTPSIkTElCUyAtbGF2Y29kZWMgLWxhdmZvcm1hdCIKKyAgICBGRk1QRUdfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgIEFDX01TR19OT1RJQ0Uod2UgaGF2ZSBmZm1wZWcpCisgICAgZG5sIGV4ZWN1dGUgd2hhdCB3ZSBoYXZlIHRvIGJlY2F1c2UgaXQncyBmb3VuZAorICAgIGlmZWxzZShbJDJdLCAsIDosIFskMl0pCisgIGVsc2UKKyAgICBGRk1QRUdfTElCUz0iIgorICAgIEZGTVBFR19DRkxBR1M9IiIKKyAgICBkbmwgZXhlY3V0ZSB3aGF0IHdlIGhhdmUgdG8gYmVjYXVzZSBpdCdzIG5vdCBmb3VuZAorICAgIGlmZWxzZShbJDNdLCAsIDosIFskM10pCisgIGZpCisKK2RubCBtYWtlIHZhcmlhYmxlcyBhdmFpbGFibGUKKyAgQUNfU1VCU1QoRkZNUEVHX0xJQlMpCisgIEFDX1NVQlNUKEZGTVBFR19DRkxBR1MpCisgIEFDX1NVQlNUKEhBVkVfRkZNUEVHKQorICBBQ19MQU5HX1JFU1RPUkUoKQorICBDRkxBR1M9JENGTEFHU19zYXZlCisgIExJQlM9JExJQlNfc2F2ZQorXSkKZGlmZiAtLWdpdCBhL200L2FzLWxpYmxhbWUubTQgYi9tNC9hcy1saWJsYW1lLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNzA3MGMKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9hcy1saWJsYW1lLm00CkBAIC0wLDAgKzEsNTAgQEAKKyMgQ0ZMQUdTIGFuZCBsaWJyYXJ5IHBhdGhzIGZvciBMSUJMQU1FCisjIHRha2VuIGZyb20gQXV0b3N0YXIgU2FuZGJveCwgaHR0cDovL2F1dG9zdGFycy5zb3VyY2Vmb3JnZS5uZXQvCisjIGluc3BpcmVkIGJ5IHhtbXMubTQKKworZG5sIFVzYWdlOgorZG5sIEFNX1BBVEhfTElCTEFNRShbTUlOSU1VTS1WRVJTSU9OLCBbQUNUSU9OLUlGLUZPVU5EIFssIEFDVElPTi1JRi1OT1QtRk9VTkRdXV0pCitkbmwgRklYTUU6IHZlcnNpb24gY2hlY2tpbmcgZG9lcyBub3Qgd29yayBjdXJyZW50bHkKK2RubAorZG5sIEV4YW1wbGU6CitkbmwgQU1fUEFUSF9MSUJMQU1FKDMuODksICwgQUNfTVNHX0VSUk9SKFsqKiogTElCTEFNRSA+PSAzLjg5IG5vdCBpbnN0YWxsZWQpKSAKK2RubAorZG5sIERlZmluZXMgTElCTEFNRV9MSUJTCitkbmwgRklYTUU6IHNob3VsZCBkZWZpbmUgTElCTEFNRV9WRVJTSU9OCitkbmwKKworQUNfREVGVU4oW0FNX1BBVEhfTElCTEFNRV0sCitbCisgIGRubCBjaGVjayBmb3IgdGhlIGxpYnJhcnkKKyAgQUNfQ0hFQ0tfTElCKG1wM2xhbWUsIGxhbWVfaW5pdCwgSEFWRV9MSUJMQU1FPXllcywgSEFWRV9MSUJMQU1FPW5vLCAtbG0pCisgIGRubCBjaGVjayBpZiBsYW1lLmggaXMgYXZhaWxhYmxlIGluIHRoZSBzdGFuZGFyZCBsb2NhdGlvbiBvciBub3QKKyAgSEFWRV9MQU1FX0hfU1REPW5vCisgIEFDX0NIRUNLX0hFQURFUihsYW1lLmgsIEhBVkVfTEFNRV9IX1NURD1ubywgOikKKyAgQUNfQ0hFQ0tfSEVBREVSKGxhbWUvbGFtZS5oLCBIQVZFX0xBTUVfSF9TVEQ9eWVzLCA6KQorICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGxhbWUuaCBpbiByaWdodCBsb2NhdGlvbikKKyAgaWYgdGVzdCAieCRIQVZFX0xBTUVfSF9TVEQiID0gInh5ZXMiOyB0aGVuCisgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgIGVsc2UKKyAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgIEhBVkVfTElCTEFNRT1ubworICAgIGlmIHRlc3QgIngkSEFWRV9MQU1FX0hfU1REIj0ieG5vIjsgdGhlbgorICAgICAgQUNfTVNHX1dBUk4obGFtZS5oIGZvdW5kIGluIGluY2x1ZGUgZGlyLCkKKyAgICAgIEFDX01TR19XQVJOKCB3aGlsZSBpdCBzaG91bGQgYmUgaW4gaXQncyBvd24gbGFtZS8gZGlyICEpCisgICAgZmkKKyBmaQorCisgIGRubCBub3cgZG8gdGhlIGFjdHVhbCAiZG8gd2UgaGF2ZSBpdCA/IiB0ZXN0CisgIGlmIHRlc3QgIngkSEFWRV9MSUJMQU1FIiA9ICJ4eWVzIjsgdGhlbgorICAgIExJQkxBTUVfTElCUz0iLWxtcDNsYW1lIC1sbSIKKyAgICBkbmwgZXhlY3V0ZSB3aGF0IHdlIGhhdmUgdG8gYmVjYXVzZSBpdCdzIGZvdW5kCisgICAgaWZlbHNlKFskMl0sICwgOiwgWyQyXSkKKyAgZWxzZQorICAgIExJQkxBTUVfTElCUz0iIgorICAgIGRubCBleGVjdXRlIHdoYXQgd2UgaGF2ZSB0byBiZWNhdXNlIGl0J3Mgbm90IGZvdW5kCisgICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkKKyAgZmkKKworICBkbmwgbWFrZSB2YXJpYWJsZXMgYXZhaWxhYmxlCisgIEFDX1NVQlNUKExJQkxBTUVfTElCUykKKyAgQUNfU1VCU1QoSEFWRV9MSUJMQU1FKQorXSkKZGlmZiAtLWdpdCBhL200L2FzLXNsdXJwLWZmbXBlZy5tNCBiL200L2FzLXNsdXJwLWZmbXBlZy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDU0YjQyCi0tLSAvZGV2L251bGwKKysrIGIvbTQvYXMtc2x1cnAtZmZtcGVnLm00CkBAIC0wLDAgKzEsNTkgQEAKK2RubCBzbHVycC1mZm1wZWcubTQgMC4xLjEKK2RubCBhIG1hY3JvIHRvIHNsdXJwIGluIGZmbXBlZydzIGN2cyBzb3VyY2UgaW5zaWRlIGEgcHJvamVjdCB0cmVlCitkbmwgdGFrZW4gZnJvbSBBdXRvc3RhciBTYW5kYm94LCBodHRwOi8vYXV0b3N0YXJzLnNvdXJjZWZvcmdlLm5ldC8KKworZG5sIFVzYWdlOgorZG5sIEFTX1NMVVJQX0ZGTVBFRyhESVJFQ1RPUlksIERBVEUsIFtBQ1RJT04tSUYtV09SS0VEIFssIEFDVElPTi1JRi1OT1QtV09SS0VEXV1dKQorZG5sCitkbmwgRXhhbXBsZToKK2RubCBBTV9QQVRIX0ZGTVBFRyhsaWIvZmZtcGVnLCAyMDAyLTEyLTE0IDEyOjAwIEdNVCkKK2RubAorZG5sIG1ha2Ugc3VyZSB5b3UgaGF2ZSBhIFRhZyBmaWxlIGluIHRoZSBkaXIgd2hlcmUgeW91IGNoZWNrIG91dCB0aGF0CitkbmwgaXMgdGhlIFRhZyBvZiBDVlMgeW91IHdhbnQgdG8gaGF2ZSBjaGVja2VkIG91dAorZG5sIGl0IHNob3VsZCBjb3JyZXNwb25kIHRvIHRoZSBEQVRFIGFyZ3VtZW50IHlvdSBzdXBwbHksIGllIHJlc29sdmUgdG8KK2RubCB0aGUgc2FtZSBkYXRlCitkbmwgKGluIGFuIGlkZWFsIHdvcmxkLCBjdnMgd291bGQgdW5kZXJzdGFuZCBpdCdzIG93biBUYWcgZmlsZSBmb3JtYXQgYXMKK2RubCBhIGRhdGUgc3BlYykKKworQUNfREVGVU4oW0FTX1NMVVJQX0ZGTVBFR10sCitbCisgICMgc2F2ZSBvcmlnaW5hbCBkaXIKKyAgRkFJTEVEPSIiCisgIERJUkVDVE9SWT1gcHdkYAorICAjIGdldC91cGRhdGUgY3ZzCisgIGlmIHRlc3QgISAtZCAkMTsgdGhlbiBta2RpciAtcCAkMTsgZmkKKyAgZG5sIHdlIG5lZWQgdG8gY2hlY2sgJHNyY2Rpci8kMSBvciBpdCB3aWxsIGFsd2F5cyBjaGVja291dCBmZm1wZWcgZXZlbiBpZiBpdCBpcyB0aGVyZQorICBkbmwgYXQgbGVhc3Qgd2hlbiB0b3Bfc3JjZGlyICE9IHRvcF9idWlsZGRpci4KKyAgZG5sIEZJWE1FOiB1bmZvcnR1bmF0ZWx5IHRoaXMgbWFrZXMgdGhlIGNoZWNrb3V0IGdvIGludG8gdG9wX3NyY2RpcgorICBjZCAkc3JjZGlyLyQxCisKKyAgaWYgdGVzdCAhIC1lIGZmbXBlZy9SRUFETUU7IHRoZW4KKyAgICAjIGNoZWNrIG91dCBjdnMgY29kZQorICAgIEFDX01TR19OT1RJQ0UoY2hlY2tpbmcgb3V0IGZmbXBlZyBjdnMgY29kZSBmcm9tICQyIGludG8gJDEpCisgICAgY3ZzIC1RIC16NCAtZDpwc2VydmVyOmFub255bW91c0BtcGxheWVyaHEuaHU6L2N2c3Jvb3QvZmZtcGVnIGNvIC1EICckMicgZmZtcGVnIHx8IEZBSUxFRD15ZXMKKyAgZWxzZQorICAgICMgY29tcGFyZSBhZ2FpbnN0IFRhZyBmaWxlIGFuZCBzZWUgaWYgaXQgbmVlZHMgdXBkYXRpbmcKKyAgICBpZiB0ZXN0ICJgY2F0IFRhZ2AiID09ICIkMiI7IHRoZW4KKyAgICAgIEFDX01TR19OT1RJQ0UoZmZtcGVnIGN2cyBjb2RlIGluIHN5bmMpCisgICAgZWxzZQorICAgICAgY2QgZmZtcGVnIAorICAgICAgQUNfTVNHX05PVElDRSh1cGRhdGluZyBmZm1wZWcgY3ZzIGNvZGUgdG8gJDIpCisgICAgICBjdnMgLVEgLXo0IHVwZGF0ZSAtZFAgLUQgJyQyJyB8fCBGQUlMRUQ9eWVzCisgICAgICBjZCAuLgorICAgIGZpCisgIGZpCisgIGlmIHRlc3QgIngkRkFJTEVEIiAhPSAieHllcyI7IHRoZW4KKyAgICBlY2hvICIkMiIgPiBUYWcgCisgIGZpCisgIAorICAjIG5vdyBnbyBiYWNrCisgIGNkICRESVJFQ1RPUlkKKworICBpZiB0ZXN0ICJ4JEZBSUxFRCIgPT0gInh5ZXMiOyB0aGVuCisgICAgWyQ0XQorICAgIGZhbHNlCisgIGVsc2UKKyAgICBbJDNdCisgICAgdHJ1ZQorICBmaQorXSkKZGlmZiAtLWdpdCBhL200L2NoZWNrLWxpYmhlYWRlci5tNCBiL200L2NoZWNrLWxpYmhlYWRlci5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2ZjNWE2Ci0tLSAvZGV2L251bGwKKysrIGIvbTQvY2hlY2stbGliaGVhZGVyLm00CkBAIC0wLDAgKzEsMzkgQEAKK2RubAorZG5sIENIRUNLLUxJQkhFQURFUihGRUFUVVJFLU5BTUUsIExJQi1OQU1FLCBMSUItRlVOQ1RJT04sIEhFQURFUi1OQU1FLAorZG5sICAgICAgICAgICAgICAgICBBQ1RJT04tSUYtRk9VTkQsIEFDVElPTi1JRi1OT1QtRk9VTkQsCitkbmwgICAgICAgICAgICAgICAgIEVYVFJBLUxERkxBR1MsIEVYVFJBLUNQUEZMQUdTKQorZG5sCitkbmwgRkVBVFVSRS1OQU1FICAgICAgICAtIGZlYXR1cmUgbmFtZTsgbGlicmFyeSBhbmQgaGVhZGVyIGZpbGVzIGFyZSB0cmVhdGVkCitkbmwgICAgICAgICAgICAgICAgICAgICAgIGFzIGZlYXR1cmUsIHdoaWNoIHdlIGxvb2sgZm9yCitkbmwgTElCLU5BTUUgICAgICAgICAgICAtIGxpYnJhcnkgbmFtZSBhcyBpbiBBQ19DSEVDS19MSUIgbWFjcm8KK2RubCBMSUItRlVOQ1RJT04gICAgICAgIC0gbGlicmFyeSBzeW1ib2wgYXMgaW4gQUNfQ0hFQ0tfTElCIG1hY3JvCitkbmwgSEVBREVSLU5BTUUgICAgICAgICAtIGhlYWRlciBmaWxlIG5hbWUgYXMgaW4gQUNfQ0hFQ0tfSEVBREVSCitkbmwgQUNUSU9OLUlGLUZPVU5EICAgICAtIHdoZW4gZmVhdHVyZSBpcyBmb3VuZCB0aGVuIGV4ZWN1dGUgZ2l2ZW4gYWN0aW9uCitkbmwgQUNUSU9OLUlGLU5PVC1GT1VORCAtIHdoZW4gZmVhdHVyZSBpcyBub3QgZm91bmQgdGhlbiBleGVjdXRlIGdpdmVuIGFjdGlvbgorZG5sIEVYVFJBLUxERkxBR1MgICAgICAgLSBleHRyYSBsaW5rZXIgZmxhZ3MgKC1MIG9yIC1sKQorZG5sIEVYVFJBLUNQUEZMQUdTICAgICAgLSBleHRyYSBDIHByZXByb2Nlc3NvciBmbGFncywgaS5lLiAtSS91c3IvWDExUjYvaW5jbHVkZQorZG5sCitkbmwgQmFzZWQgb24gR1NUX0NIRUNLX0xJQkhFQURFUiBmcm9tIGdzdHJlYW1lciBwbHVnaW5zIDAuMy4xLgorZG5sCitBQ19ERUZVTihbQ0hFQ0tfTElCSEVBREVSXSwKK1sKKyAgQUNfQ0hFQ0tfTElCKFskMl0sIFskM10sIEhBVkVfWyQxXT15ZXMsIEhBVkVfWyQxXT1ubywgWyQ3XSkKKyAgY2hlY2tfbGliaGVhZGVyX2ZlYXR1cmVfbmFtZT10cmFuc2xpdChbJDFdLCBBLVosIGEteikKKworICBpZiB0ZXN0ICJ4JEhBVkVfWyQxXSIgPSAieHllcyI7IHRoZW4KKyAgICBjaGVja19saWJoZWFkZXJfc2F2ZV9DUFBGTEFHUz0kQ1BQRkxBR1MKKyAgICBDUFBGTEFHUz0iWyQ4XSAkQ1BQRkxBR1MiCisgICAgQUNfQ0hFQ0tfSEVBREVSKFskNF0sIDosIEhBVkVfWyQxXT1ubykKKyAgICBDUFBGTEFHUz0kY2hlY2tfbGliaGVhZGVyX3NhdmVfQ1BQRkxBR1MKKyAgZmkKKworICBpZiB0ZXN0ICJ4JEhBVkVfWyQxXSIgPSAieHllcyI7IHRoZW4KKyAgICBpZmVsc2UoWyQ1XSwgLCA6LCBbJDVdKQorICAgIEFDX01TR19OT1RJQ0UoJGNoZWNrX2xpYmhlYWRlcl9mZWF0dXJlX25hbWUgd2FzIGZvdW5kKQorICBlbHNlCisgICAgaWZlbHNlKFskNl0sICwgOiwgWyQ2XSkKKyAgICBBQ19NU0dfV0FSTigkY2hlY2tfbGliaGVhZGVyX2ZlYXR1cmVfbmFtZSBub3QgZm91bmQpCisgIGZpCisgIEFDX1NVQlNUKEhBVkVfWyQxXSkKK10KKykKZGlmZiAtLWdpdCBhL200L2ZyZWV0eXBlMi5tNCBiL200L2ZyZWV0eXBlMi5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTk5MDcxCi0tLSAvZGV2L251bGwKKysrIGIvbTQvZnJlZXR5cGUyLm00CkBAIC0wLDAgKzEsMTQzIEBACisjIENvbmZpZ3VyZSBwYXRocyBmb3IgRnJlZVR5cGUyCisjIE1hcmNlbG8gTWFnYWxsb24gMjAwMS0xMC0yNiwgYmFzZWQgb24gZ3RrLm00IGJ5IE93ZW4gVGF5bG9yCisKK2RubCBBQ19DSEVDS19GVDIoW01JTklNVU0tVkVSU0lPTiwgW0FDVElPTi1JRi1GT1VORCBbLCBBQ1RJT04tSUYtTk9ULUZPVU5EXV1dKQorZG5sIFRlc3QgZm9yIEZyZWVUeXBlMiwgYW5kIGRlZmluZSBGVDJfQ0ZMQUdTIGFuZCBGVDJfTElCUworZG5sCitBQ19ERUZVTihbQUNfQ0hFQ0tfRlQyXSwKK1tkbmwKK2RubCBHZXQgdGhlIGNmbGFncyBhbmQgbGlicmFyaWVzIGZyb20gdGhlIGZyZWV0eXBlLWNvbmZpZyBzY3JpcHQKK2RubAorQUNfQVJHX1dJVEgoZnQtcHJlZml4LAorWyAgLS13aXRoLWZ0LXByZWZpeD1QUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZml4IHdoZXJlIEZyZWVUeXBlIGlzIGluc3RhbGxlZCAob3B0aW9uYWwpXSwKKyAgICAgICAgICAgIGZ0X2NvbmZpZ19wcmVmaXg9IiR3aXRodmFsIiwgZnRfY29uZmlnX3ByZWZpeD0iIikKK0FDX0FSR19XSVRIKGZ0LWV4ZWMtcHJlZml4LAorWyAgLS13aXRoLWZ0LWV4ZWMtcHJlZml4PVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjIHByZWZpeCB3aGVyZSBGcmVlVHlwZSBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0sCisgICAgICAgICAgICBmdF9jb25maWdfZXhlY19wcmVmaXg9IiR3aXRodmFsIiwgZnRfY29uZmlnX2V4ZWNfcHJlZml4PSIiKQorQUNfQVJHX0VOQUJMRShmcmVldHlwZXRlc3QsCitbICAtLWRpc2FibGUtZnJlZXR5cGV0ZXN0ICBEbyBub3QgdHJ5IHRvIGNvbXBpbGUgYW5kIHJ1bgorICAgICAgICAgICAgICAgICAgICAgICAgICBhIHRlc3QgRnJlZVR5cGUgcHJvZ3JhbV0sCisgICAgICAgICAgICAgIFtdLCBlbmFibGVfZnR0ZXN0PXllcykKKworaWYgdGVzdCB4JGZ0X2NvbmZpZ19leGVjX3ByZWZpeCAhPSB4IDsgdGhlbgorICBmdF9jb25maWdfYXJncz0iJGZ0X2NvbmZpZ19hcmdzIC0tZXhlYy1wcmVmaXg9JGZ0X2NvbmZpZ19leGVjX3ByZWZpeCIKKyAgaWYgdGVzdCB4JHtGVDJfQ09ORklHK3NldH0gIT0geHNldCA7IHRoZW4KKyAgICBGVDJfQ09ORklHPSRmdF9jb25maWdfZXhlY19wcmVmaXgvYmluL2ZyZWV0eXBlLWNvbmZpZworICBmaQorZmkKK2lmIHRlc3QgeCRmdF9jb25maWdfcHJlZml4ICE9IHggOyB0aGVuCisgIGZ0X2NvbmZpZ19hcmdzPSIkZnRfY29uZmlnX2FyZ3MgLS1wcmVmaXg9JGZ0X2NvbmZpZ19wcmVmaXgiCisgIGlmIHRlc3QgeCR7RlQyX0NPTkZJRytzZXR9ICE9IHhzZXQgOyB0aGVuCisgICAgRlQyX0NPTkZJRz0kZnRfY29uZmlnX3ByZWZpeC9iaW4vZnJlZXR5cGUtY29uZmlnCisgIGZpCitmaQorQUNfUEFUSF9QUk9HKEZUMl9DT05GSUcsIGZyZWV0eXBlLWNvbmZpZywgbm8pCisKK21pbl9mdF92ZXJzaW9uPWlmZWxzZShbJDFdLCAsNi4xLjAsJDEpCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIEZyZWVUeXBlIC0gdmVyc2lvbiA+PSAkbWluX2Z0X3ZlcnNpb24pCitub19mdD0iIgoraWYgdGVzdCAiJEZUMl9DT05GSUciID0gIm5vIiA7IHRoZW4KKyAgbm9fZnQ9eWVzCitlbHNlCisgIEZUMl9DRkxBR1M9YCRGVDJfQ09ORklHICRmdF9jb25maWdfYXJncyAtLWNmbGFnc2AKKyAgRlQyX0xJQlM9YCRGVDJfQ09ORklHICRmdF9jb25maWdfYXJncyAtLWxpYnNgCisgIGZ0X2NvbmZpZ19tYWpvcl92ZXJzaW9uPWAkRlQyX0NPTkZJRyAkZnRfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wxLydgCisgIGZ0X2NvbmZpZ19taW5vcl92ZXJzaW9uPWAkRlQyX0NPTkZJRyAkZnRfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wyLydgCisgIGZ0X2NvbmZpZ19taWNyb192ZXJzaW9uPWAkRlQyX0NPTkZJRyAkZnRfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wzLydgCisgIGZ0X21pbl9tYWpvcl92ZXJzaW9uPWBlY2hvICRtaW5fZnRfdmVyc2lvbiB8IFwKKyAgICAgICAgIHNlZCAncy9cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS9cMS8nYAorICBmdF9taW5fbWlub3JfdmVyc2lvbj1gZWNobyAkbWluX2Z0X3ZlcnNpb24gfCBcCisgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDIvJ2AKKyAgZnRfbWluX21pY3JvX3ZlcnNpb249YGVjaG8gJG1pbl9mdF92ZXJzaW9uIHwgXAorICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wzLydgCisgIGlmIHRlc3QgeCRlbmFibGVfZnR0ZXN0ID0geHllcyA7IHRoZW4KKyAgICBmdF9jb25maWdfaXNfbHQ9IiIKKyAgICBpZiB0ZXN0ICRmdF9jb25maWdfbWFqb3JfdmVyc2lvbiAtbHQgJGZ0X21pbl9tYWpvcl92ZXJzaW9uIDsgdGhlbgorICAgICAgZnRfY29uZmlnX2lzX2x0PXllcworICAgIGVsc2UKKyAgICAgIGlmIHRlc3QgJGZ0X2NvbmZpZ19tYWpvcl92ZXJzaW9uIC1lcSAkZnRfbWluX21ham9yX3ZlcnNpb24gOyB0aGVuCisgICAgICAgIGlmIHRlc3QgJGZ0X2NvbmZpZ19taW5vcl92ZXJzaW9uIC1sdCAkZnRfbWluX21pbm9yX3ZlcnNpb24gOyB0aGVuCisgICAgICAgICAgZnRfY29uZmlnX2lzX2x0PXllcworICAgICAgICBlbHNlCisgICAgICAgICAgaWYgdGVzdCAkZnRfY29uZmlnX21pbm9yX3ZlcnNpb24gLWVxICRmdF9taW5fbWlub3JfdmVyc2lvbiA7IHRoZW4KKyAgICAgICAgICAgIGlmIHRlc3QgJGZ0X2NvbmZpZ19taWNyb192ZXJzaW9uIC1sdCAkZnRfbWluX21pY3JvX3ZlcnNpb24gOyB0aGVuCisgICAgICAgICAgICAgIGZ0X2NvbmZpZ19pc19sdD15ZXMKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgZmkKKyAgICBpZiB0ZXN0IHgkZnRfY29uZmlnX2lzX2x0ID0geHllcyA7IHRoZW4KKyAgICAgIG5vX2Z0PXllcworICAgIGVsc2UKKyAgICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgIENGTEFHUz0iJENGTEFHUyAkRlQyX0NGTEFHUyIKKyAgICAgIExJQlM9IiRGVDJfTElCUyAkTElCUyIKK2RubAorZG5sIFNhbml0eSBjaGVja3MgZm9yIHRoZSByZXN1bHRzIG9mIGZyZWV0eXBlLWNvbmZpZyB0byBzb21lIGV4dGVudAorZG5sCisgICAgICBBQ19UUllfUlVOKFsKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2ludAorbWFpbigpCit7CisgIEZUX0xpYnJhcnkgbGlicmFyeTsKKyAgRlRfRXJyb3IgZXJyb3I7CisKKyAgZXJyb3IgPSBGVF9Jbml0X0ZyZWVUeXBlKCZsaWJyYXJ5KTsKKworICBpZiAoZXJyb3IpCisgICAgcmV0dXJuIDE7CisgIGVsc2UKKyAgeworICAgIEZUX0RvbmVfRnJlZVR5cGUobGlicmFyeSk7CisgICAgcmV0dXJuIDA7CisgIH0KK30KK10sLCBub19mdD15ZXMsW2VjaG8gJGFjX24gImNyb3NzIGNvbXBpbGluZzsgYXNzdW1lZCBPSy4uLiAkYWNfYyJdKQorICAgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisgICAgICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorICAgIGZpICAgICAgICAgICAgICMgdGVzdCAkZnRfY29uZmlnX3ZlcnNpb24gLWx0ICRmdF9taW5fdmVyc2lvbgorICBmaSAgICAgICAgICAgICAgICMgdGVzdCB4JGVuYWJsZV9mdHRlc3QgPSB4eWVzCitmaSAgICAgICAgICAgICAgICAgIyB0ZXN0ICIkRlQyX0NPTkZJRyIgPSAibm8iCitpZiB0ZXN0IHgkbm9fZnQgPSB4IDsgdGhlbgorICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKQorZWxzZQorICAgQUNfTVNHX1JFU1VMVChubykKKyAgIGlmIHRlc3QgIiRGVDJfQ09ORklHIiA9ICJubyIgOyB0aGVuCisgICAgIGVjaG8gIioqKiBUaGUgZnJlZXR5cGUtY29uZmlnIHNjcmlwdCBpbnN0YWxsZWQgYnkgRnJlZVR5cGUgMiBjb3VsZCBub3QgYmUgZm91bmQuIgorICAgICBlY2hvICIqKiogSWYgRnJlZVR5cGUgMiB3YXMgaW5zdGFsbGVkIGluIFBSRUZJWCwgbWFrZSBzdXJlIFBSRUZJWC9iaW4gaXMgaW4iCisgICAgIGVjaG8gIioqKiB5b3VyIHBhdGgsIG9yIHNldCB0aGUgRlQyX0NPTkZJRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUiCisgICAgIGVjaG8gIioqKiBmdWxsIHBhdGggdG8gZnJlZXR5cGUtY29uZmlnLiIKKyAgIGVsc2UKKyAgICAgaWYgdGVzdCB4JGZ0X2NvbmZpZ19pc19sdCA9IHh5ZXMgOyB0aGVuCisgICAgICAgZWNobyAiKioqIFlvdXIgaW5zdGFsbGVkIHZlcnNpb24gb2YgdGhlIEZyZWVUeXBlIDIgbGlicmFyeSBpcyB0b28gb2xkLiIKKyAgICAgICBlY2hvICIqKiogSWYgeW91IGhhdmUgZGlmZmVyZW50IHZlcnNpb25zIG9mIEZyZWVUeXBlIDIsIG1ha2Ugc3VyZSB0aGF0IgorICAgICAgIGVjaG8gIioqKiBjb3JyZWN0IHZhbHVlcyBmb3IgLS13aXRoLWZ0LXByZWZpeCBvciAtLXdpdGgtZnQtZXhlYy1wcmVmaXgiCisgICAgICAgZWNobyAiKioqIGFyZSB1c2VkLCBvciBzZXQgdGhlIEZUMl9DT05GSUcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIgorICAgICAgIGVjaG8gIioqKiBmdWxsIHBhdGggdG8gZnJlZXR5cGUtY29uZmlnLiIKKyAgICAgZWxzZQorICAgICAgIGVjaG8gIioqKiBUaGUgRnJlZVR5cGUgdGVzdCBwcm9ncmFtIGZhaWxlZCB0byBydW4uICBJZiB5b3VyIHN5c3RlbSB1c2VzIgorICAgICAgIGVjaG8gIioqKiBzaGFyZWQgbGlicmFyaWVzIGFuZCB0aGV5IGFyZSBpbnN0YWxsZWQgb3V0c2lkZSB0aGUgbm9ybWFsIgorICAgICAgIGVjaG8gIioqKiBzeXN0ZW0gbGlicmFyeSBwYXRoLCBtYWtlIHN1cmUgdGhlIHZhcmlhYmxlIExEX0xJQlJBUllfUEFUSCIKKyAgICAgICBlY2hvICIqKiogKG9yIHdoYXRldmVyIGlzIGFwcHJvcGlhdGUgZm9yIHlvdXIgc3lzdGVtKSBpcyBjb3JyZWN0bHkgc2V0LiIKKyAgICAgZmkKKyAgIGZpCisgICBGVDJfQ0ZMQUdTPSIiCisgICBGVDJfTElCUz0iIgorICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkKK2ZpCitBQ19TVUJTVChGVDJfQ0ZMQUdTKQorQUNfU1VCU1QoRlQyX0xJQlMpCitdKQpkaWZmIC0tZ2l0IGEvbTQvZ2xpYi5tNCBiL200L2dsaWIubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNjNjMyYgotLS0gL2Rldi9udWxsCisrKyBiL200L2dsaWIubTQKQEAgLTAsMCArMSwxOTYgQEAKKyMgQ29uZmlndXJlIHBhdGhzIGZvciBHTElCCisjIE93ZW4gVGF5bG9yICAgICA5Ny0xMS0zCisKK2RubCBBTV9QQVRIX0dMSUIoW01JTklNVU0tVkVSU0lPTiwgW0FDVElPTi1JRi1GT1VORCBbLCBBQ1RJT04tSUYtTk9ULUZPVU5EIFssIE1PRFVMRVNdXV1dKQorZG5sIFRlc3QgZm9yIEdMSUIsIGFuZCBkZWZpbmUgR0xJQl9DRkxBR1MgYW5kIEdMSUJfTElCUywgaWYgImdtb2R1bGUiIG9yIAorZG5sIGd0aHJlYWQgaXMgc3BlY2lmaWVkIGluIE1PRFVMRVMsIHBhc3MgdG8gZ2xpYi1jb25maWcKK2RubAorQUNfREVGVU4oW0FNX1BBVEhfR0xJQl0sCitbZG5sIAorZG5sIEdldCB0aGUgY2ZsYWdzIGFuZCBsaWJyYXJpZXMgZnJvbSB0aGUgZ2xpYi1jb25maWcgc2NyaXB0CitkbmwKK0FDX0FSR19XSVRIKGdsaWItcHJlZml4LFsgIC0td2l0aC1nbGliLXByZWZpeD1QRlggICBQcmVmaXggd2hlcmUgR0xJQiBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0sCisgICAgICAgICAgICBnbGliX2NvbmZpZ19wcmVmaXg9IiR3aXRodmFsIiwgZ2xpYl9jb25maWdfcHJlZml4PSIiKQorQUNfQVJHX1dJVEgoZ2xpYi1leGVjLXByZWZpeCxbICAtLXdpdGgtZ2xpYi1leGVjLXByZWZpeD1QRlggRXhlYyBwcmVmaXggd2hlcmUgR0xJQiBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0sCisgICAgICAgICAgICBnbGliX2NvbmZpZ19leGVjX3ByZWZpeD0iJHdpdGh2YWwiLCBnbGliX2NvbmZpZ19leGVjX3ByZWZpeD0iIikKK0FDX0FSR19FTkFCTEUoZ2xpYnRlc3QsIFsgIC0tZGlzYWJsZS1nbGlidGVzdCAgICAgICBEbyBub3QgdHJ5IHRvIGNvbXBpbGUgYW5kIHJ1biBhIHRlc3QgR0xJQiBwcm9ncmFtXSwKKwkJICAgICwgZW5hYmxlX2dsaWJ0ZXN0PXllcykKKworICBpZiB0ZXN0IHgkZ2xpYl9jb25maWdfZXhlY19wcmVmaXggIT0geCA7IHRoZW4KKyAgICAgZ2xpYl9jb25maWdfYXJncz0iJGdsaWJfY29uZmlnX2FyZ3MgLS1leGVjLXByZWZpeD0kZ2xpYl9jb25maWdfZXhlY19wcmVmaXgiCisgICAgIGlmIHRlc3QgeCR7R0xJQl9DT05GSUcrc2V0fSAhPSB4c2V0IDsgdGhlbgorICAgICAgICBHTElCX0NPTkZJRz0kZ2xpYl9jb25maWdfZXhlY19wcmVmaXgvYmluL2dsaWItY29uZmlnCisgICAgIGZpCisgIGZpCisgIGlmIHRlc3QgeCRnbGliX2NvbmZpZ19wcmVmaXggIT0geCA7IHRoZW4KKyAgICAgZ2xpYl9jb25maWdfYXJncz0iJGdsaWJfY29uZmlnX2FyZ3MgLS1wcmVmaXg9JGdsaWJfY29uZmlnX3ByZWZpeCIKKyAgICAgaWYgdGVzdCB4JHtHTElCX0NPTkZJRytzZXR9ICE9IHhzZXQgOyB0aGVuCisgICAgICAgIEdMSUJfQ09ORklHPSRnbGliX2NvbmZpZ19wcmVmaXgvYmluL2dsaWItY29uZmlnCisgICAgIGZpCisgIGZpCisKKyAgZm9yIG1vZHVsZSBpbiAuICQ0CisgIGRvCisgICAgICBjYXNlICIkbW9kdWxlIiBpbgorICAgICAgICAgZ21vZHVsZSkgCisgICAgICAgICAgICAgZ2xpYl9jb25maWdfYXJncz0iJGdsaWJfY29uZmlnX2FyZ3MgZ21vZHVsZSIKKyAgICAgICAgIDs7CisgICAgICAgICBndGhyZWFkKSAKKyAgICAgICAgICAgICBnbGliX2NvbmZpZ19hcmdzPSIkZ2xpYl9jb25maWdfYXJncyBndGhyZWFkIgorICAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgZG9uZQorCisgIEFDX1BBVEhfUFJPRyhHTElCX0NPTkZJRywgZ2xpYi1jb25maWcsIG5vKQorICBtaW5fZ2xpYl92ZXJzaW9uPWlmZWxzZShbJDFdLCAsMC45OS43LCQxKQorICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIEdMSUIgLSB2ZXJzaW9uID49ICRtaW5fZ2xpYl92ZXJzaW9uKQorICBub19nbGliPSIiCisgIGlmIHRlc3QgIiRHTElCX0NPTkZJRyIgPSAibm8iIDsgdGhlbgorICAgIG5vX2dsaWI9eWVzCisgIGVsc2UKKyAgICBHTElCX0NGTEFHUz1gJEdMSUJfQ09ORklHICRnbGliX2NvbmZpZ19hcmdzIC0tY2ZsYWdzYAorICAgIEdMSUJfTElCUz1gJEdMSUJfQ09ORklHICRnbGliX2NvbmZpZ19hcmdzIC0tbGlic2AKKyAgICBnbGliX2NvbmZpZ19tYWpvcl92ZXJzaW9uPWAkR0xJQl9DT05GSUcgJGdsaWJfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDEvJ2AKKyAgICBnbGliX2NvbmZpZ19taW5vcl92ZXJzaW9uPWAkR0xJQl9DT05GSUcgJGdsaWJfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDIvJ2AKKyAgICBnbGliX2NvbmZpZ19taWNyb192ZXJzaW9uPWAkR0xJQl9DT05GSUcgJGdsaWJfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDMvJ2AKKyAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9nbGlidGVzdCIgPSAieHllcyIgOyB0aGVuCisgICAgICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgIGFjX3NhdmVfTElCUz0iJExJQlMiCisgICAgICBDRkxBR1M9IiRDRkxBR1MgJEdMSUJfQ0ZMQUdTIgorICAgICAgTElCUz0iJEdMSUJfTElCUyAkTElCUyIKK2RubAorZG5sIE5vdyBjaGVjayBpZiB0aGUgaW5zdGFsbGVkIEdMSUIgaXMgc3VmZmljaWVudGx5IG5ldy4gKEFsc28gc2FuaXR5CitkbmwgY2hlY2tzIHRoZSByZXN1bHRzIG9mIGdsaWItY29uZmlnIHRvIHNvbWUgZXh0ZW50CitkbmwKKyAgICAgIHJtIC1mIGNvbmYuZ2xpYnRlc3QKKyAgICAgIEFDX1RSWV9SVU4oWworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitpbnQgCittYWluICgpCit7CisgIGludCBtYWpvciwgbWlub3IsIG1pY3JvOworICBjaGFyICp0bXBfdmVyc2lvbjsKKworICBzeXN0ZW0gKCJ0b3VjaCBjb25mLmdsaWJ0ZXN0Iik7CisKKyAgLyogSFAvVVggOSAoJUAjISkgd3JpdGVzIHRvIHNzY2FuZiBzdHJpbmdzICovCisgIHRtcF92ZXJzaW9uID0gZ19zdHJkdXAoIiRtaW5fZ2xpYl92ZXJzaW9uIik7CisgIGlmIChzc2NhbmYodG1wX3ZlcnNpb24sICIlZC4lZC4lZCIsICZtYWpvciwgJm1pbm9yLCAmbWljcm8pICE9IDMpIHsKKyAgICAgcHJpbnRmKCIlcywgYmFkIHZlcnNpb24gc3RyaW5nXG4iLCAiJG1pbl9nbGliX3ZlcnNpb24iKTsKKyAgICAgZXhpdCgxKTsKKyAgIH0KKworICBpZiAoKGdsaWJfbWFqb3JfdmVyc2lvbiAhPSAkZ2xpYl9jb25maWdfbWFqb3JfdmVyc2lvbikgfHwKKyAgICAgIChnbGliX21pbm9yX3ZlcnNpb24gIT0gJGdsaWJfY29uZmlnX21pbm9yX3ZlcnNpb24pIHx8CisgICAgICAoZ2xpYl9taWNyb192ZXJzaW9uICE9ICRnbGliX2NvbmZpZ19taWNyb192ZXJzaW9uKSkKKyAgICB7CisgICAgICBwcmludGYoIlxuKioqICdnbGliLWNvbmZpZyAtLXZlcnNpb24nIHJldHVybmVkICVkLiVkLiVkLCBidXQgR0xJQiAoJWQuJWQuJWQpXG4iLCAKKyAgICAgICAgICAgICAkZ2xpYl9jb25maWdfbWFqb3JfdmVyc2lvbiwgJGdsaWJfY29uZmlnX21pbm9yX3ZlcnNpb24sICRnbGliX2NvbmZpZ19taWNyb192ZXJzaW9uLAorICAgICAgICAgICAgIGdsaWJfbWFqb3JfdmVyc2lvbiwgZ2xpYl9taW5vcl92ZXJzaW9uLCBnbGliX21pY3JvX3ZlcnNpb24pOworICAgICAgcHJpbnRmICgiKioqIHdhcyBmb3VuZCEgSWYgZ2xpYi1jb25maWcgd2FzIGNvcnJlY3QsIHRoZW4gaXQgaXMgYmVzdFxuIik7CisgICAgICBwcmludGYgKCIqKiogdG8gcmVtb3ZlIHRoZSBvbGQgdmVyc2lvbiBvZiBHTElCLiBZb3UgbWF5IGFsc28gYmUgYWJsZSB0byBmaXggdGhlIGVycm9yXG4iKTsKKyAgICAgIHByaW50ZigiKioqIGJ5IG1vZGlmeWluZyB5b3VyIExEX0xJQlJBUllfUEFUSCBlbnZpcm9tZW50IHZhcmlhYmxlLCBvciBieSBlZGl0aW5nXG4iKTsKKyAgICAgIHByaW50ZigiKioqIC9ldGMvbGQuc28uY29uZi4gTWFrZSBzdXJlIHlvdSBoYXZlIHJ1biBsZGNvbmZpZyBpZiB0aGF0IGlzXG4iKTsKKyAgICAgIHByaW50ZigiKioqIHJlcXVpcmVkIG9uIHlvdXIgc3lzdGVtLlxuIik7CisgICAgICBwcmludGYoIioqKiBJZiBnbGliLWNvbmZpZyB3YXMgd3JvbmcsIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgR0xJQl9DT05GSUdcbiIpOworICAgICAgcHJpbnRmKCIqKiogdG8gcG9pbnQgdG8gdGhlIGNvcnJlY3QgY29weSBvZiBnbGliLWNvbmZpZywgYW5kIHJlbW92ZSB0aGUgZmlsZSBjb25maWcuY2FjaGVcbiIpOworICAgICAgcHJpbnRmKCIqKiogYmVmb3JlIHJlLXJ1bm5pbmcgY29uZmlndXJlXG4iKTsKKyAgICB9IAorICBlbHNlIGlmICgoZ2xpYl9tYWpvcl92ZXJzaW9uICE9IEdMSUJfTUFKT1JfVkVSU0lPTikgfHwKKwkgICAoZ2xpYl9taW5vcl92ZXJzaW9uICE9IEdMSUJfTUlOT1JfVkVSU0lPTikgfHwKKyAgICAgICAgICAgKGdsaWJfbWljcm9fdmVyc2lvbiAhPSBHTElCX01JQ1JPX1ZFUlNJT04pKQorICAgIHsKKyAgICAgIHByaW50ZigiKioqIEdMSUIgaGVhZGVyIGZpbGVzICh2ZXJzaW9uICVkLiVkLiVkKSBkbyBub3QgbWF0Y2hcbiIsCisJICAgICBHTElCX01BSk9SX1ZFUlNJT04sIEdMSUJfTUlOT1JfVkVSU0lPTiwgR0xJQl9NSUNST19WRVJTSU9OKTsKKyAgICAgIHByaW50ZigiKioqIGxpYnJhcnkgKHZlcnNpb24gJWQuJWQuJWQpXG4iLAorCSAgICAgZ2xpYl9tYWpvcl92ZXJzaW9uLCBnbGliX21pbm9yX3ZlcnNpb24sIGdsaWJfbWljcm9fdmVyc2lvbik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKChnbGliX21ham9yX3ZlcnNpb24gPiBtYWpvcikgfHwKKyAgICAgICAgKChnbGliX21ham9yX3ZlcnNpb24gPT0gbWFqb3IpICYmIChnbGliX21pbm9yX3ZlcnNpb24gPiBtaW5vcikpIHx8CisgICAgICAgICgoZ2xpYl9tYWpvcl92ZXJzaW9uID09IG1ham9yKSAmJiAoZ2xpYl9taW5vcl92ZXJzaW9uID09IG1pbm9yKSAmJiAoZ2xpYl9taWNyb192ZXJzaW9uID49IG1pY3JvKSkpCisgICAgICB7CisgICAgICAgIHJldHVybiAwOworICAgICAgIH0KKyAgICAgZWxzZQorICAgICAgeworICAgICAgICBwcmludGYoIlxuKioqIEFuIG9sZCB2ZXJzaW9uIG9mIEdMSUIgKCVkLiVkLiVkKSB3YXMgZm91bmQuXG4iLAorICAgICAgICAgICAgICAgZ2xpYl9tYWpvcl92ZXJzaW9uLCBnbGliX21pbm9yX3ZlcnNpb24sIGdsaWJfbWljcm9fdmVyc2lvbik7CisgICAgICAgIHByaW50ZigiKioqIFlvdSBuZWVkIGEgdmVyc2lvbiBvZiBHTElCIG5ld2VyIHRoYW4gJWQuJWQuJWQuIFRoZSBsYXRlc3QgdmVyc2lvbiBvZlxuIiwKKwkgICAgICAgbWFqb3IsIG1pbm9yLCBtaWNybyk7CisgICAgICAgIHByaW50ZigiKioqIEdMSUIgaXMgYWx3YXlzIGF2YWlsYWJsZSBmcm9tIGZ0cDovL2Z0cC5ndGsub3JnLlxuIik7CisgICAgICAgIHByaW50ZigiKioqXG4iKTsKKyAgICAgICAgcHJpbnRmKCIqKiogSWYgeW91IGhhdmUgYWxyZWFkeSBpbnN0YWxsZWQgYSBzdWZmaWNpZW50bHkgbmV3IHZlcnNpb24sIHRoaXMgZXJyb3JcbiIpOworICAgICAgICBwcmludGYoIioqKiBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB3cm9uZyBjb3B5IG9mIHRoZSBnbGliLWNvbmZpZyBzaGVsbCBzY3JpcHQgaXNcbiIpOworICAgICAgICBwcmludGYoIioqKiBiZWluZyBmb3VuZC4gVGhlIGVhc2llc3Qgd2F5IHRvIGZpeCB0aGlzIGlzIHRvIHJlbW92ZSB0aGUgb2xkIHZlcnNpb25cbiIpOworICAgICAgICBwcmludGYoIioqKiBvZiBHTElCLCBidXQgeW91IGNhbiBhbHNvIHNldCB0aGUgR0xJQl9DT05GSUcgZW52aXJvbm1lbnQgdG8gcG9pbnQgdG8gdGhlXG4iKTsKKyAgICAgICAgcHJpbnRmKCIqKiogY29ycmVjdCBjb3B5IG9mIGdsaWItY29uZmlnLiAoSW4gdGhpcyBjYXNlLCB5b3Ugd2lsbCBoYXZlIHRvXG4iKTsKKyAgICAgICAgcHJpbnRmKCIqKiogbW9kaWZ5IHlvdXIgTERfTElCUkFSWV9QQVRIIGVudmlyb21lbnQgdmFyaWFibGUsIG9yIGVkaXQgL2V0Yy9sZC5zby5jb25mXG4iKTsKKyAgICAgICAgcHJpbnRmKCIqKiogc28gdGhhdCB0aGUgY29ycmVjdCBsaWJyYXJpZXMgYXJlIGZvdW5kIGF0IHJ1bi10aW1lKSlcbiIpOworICAgICAgfQorICAgIH0KKyAgcmV0dXJuIDE7Cit9CitdLCwgbm9fZ2xpYj15ZXMsW2VjaG8gJGFjX24gImNyb3NzIGNvbXBpbGluZzsgYXNzdW1lZCBPSy4uLiAkYWNfYyJdKQorICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgICAgIGZpCisgIGZpCisgIGlmIHRlc3QgIngkbm9fZ2xpYiIgPSB4IDsgdGhlbgorICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICAgaWZlbHNlKFskMl0sICwgOiwgWyQyXSkgICAgIAorICBlbHNlCisgICAgIEFDX01TR19SRVNVTFQobm8pCisgICAgIGlmIHRlc3QgIiRHTElCX0NPTkZJRyIgPSAibm8iIDsgdGhlbgorICAgICAgIGVjaG8gIioqKiBUaGUgZ2xpYi1jb25maWcgc2NyaXB0IGluc3RhbGxlZCBieSBHTElCIGNvdWxkIG5vdCBiZSBmb3VuZCIKKyAgICAgICBlY2hvICIqKiogSWYgR0xJQiB3YXMgaW5zdGFsbGVkIGluIFBSRUZJWCwgbWFrZSBzdXJlIFBSRUZJWC9iaW4gaXMgaW4iCisgICAgICAgZWNobyAiKioqIHlvdXIgcGF0aCwgb3Igc2V0IHRoZSBHTElCX0NPTkZJRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUiCisgICAgICAgZWNobyAiKioqIGZ1bGwgcGF0aCB0byBnbGliLWNvbmZpZy4iCisgICAgIGVsc2UKKyAgICAgICBpZiB0ZXN0IC1mIGNvbmYuZ2xpYnRlc3QgOyB0aGVuCisgICAgICAgIDoKKyAgICAgICBlbHNlCisgICAgICAgICAgZWNobyAiKioqIENvdWxkIG5vdCBydW4gR0xJQiB0ZXN0IHByb2dyYW0sIGNoZWNraW5nIHdoeS4uLiIKKyAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJEdMSUJfQ0ZMQUdTIgorICAgICAgICAgIExJQlM9IiRMSUJTICRHTElCX0xJQlMiCisgICAgICAgICAgQUNfVFJZX0xJTksoWworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorXSwgICAgICBbIHJldHVybiAoKGdsaWJfbWFqb3JfdmVyc2lvbikgfHwgKGdsaWJfbWlub3JfdmVyc2lvbikgfHwgKGdsaWJfbWljcm9fdmVyc2lvbikpOyBdLAorICAgICAgICBbIGVjaG8gIioqKiBUaGUgdGVzdCBwcm9ncmFtIGNvbXBpbGVkLCBidXQgZGlkIG5vdCBydW4uIFRoaXMgdXN1YWxseSBtZWFucyIKKyAgICAgICAgICBlY2hvICIqKiogdGhhdCB0aGUgcnVuLXRpbWUgbGlua2VyIGlzIG5vdCBmaW5kaW5nIEdMSUIgb3IgZmluZGluZyB0aGUgd3JvbmciCisgICAgICAgICAgZWNobyAiKioqIHZlcnNpb24gb2YgR0xJQi4gSWYgaXQgaXMgbm90IGZpbmRpbmcgR0xJQiwgeW91J2xsIG5lZWQgdG8gc2V0IHlvdXIiCisgICAgICAgICAgZWNobyAiKioqIExEX0xJQlJBUllfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgZWRpdCAvZXRjL2xkLnNvLmNvbmYgdG8gcG9pbnQiCisgICAgICAgICAgZWNobyAiKioqIHRvIHRoZSBpbnN0YWxsZWQgbG9jYXRpb24gIEFsc28sIG1ha2Ugc3VyZSB5b3UgaGF2ZSBydW4gbGRjb25maWcgaWYgdGhhdCIKKyAgICAgICAgICBlY2hvICIqKiogaXMgcmVxdWlyZWQgb24geW91ciBzeXN0ZW0iCisJICBlY2hvICIqKioiCisgICAgICAgICAgZWNobyAiKioqIElmIHlvdSBoYXZlIGFuIG9sZCB2ZXJzaW9uIGluc3RhbGxlZCwgaXQgaXMgYmVzdCB0byByZW1vdmUgaXQsIGFsdGhvdWdoIgorICAgICAgICAgIGVjaG8gIioqKiB5b3UgbWF5IGFsc28gYmUgYWJsZSB0byBnZXQgdGhpbmdzIHRvIHdvcmsgYnkgbW9kaWZ5aW5nIExEX0xJQlJBUllfUEFUSCIKKyAgICAgICAgICBlY2hvICIqKioiCisgICAgICAgICAgZWNobyAiKioqIElmIHlvdSBoYXZlIGEgUmVkSGF0IDUuMCBzeXN0ZW0sIHlvdSBzaG91bGQgcmVtb3ZlIHRoZSBHVEsgcGFja2FnZSB0aGF0IgorICAgICAgICAgIGVjaG8gIioqKiBjYW1lIHdpdGggdGhlIHN5c3RlbSB3aXRoIHRoZSBjb21tYW5kIgorICAgICAgICAgIGVjaG8gIioqKiIKKyAgICAgICAgICBlY2hvICIqKiogICAgcnBtIC0tZXJhc2UgLS1ub2RlcHMgZ3RrIGd0ay1kZXZlbCIgXSwKKyAgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBmYWlsZWQgdG8gY29tcGlsZSBvciBsaW5rLiBTZWUgdGhlIGZpbGUgY29uZmlnLmxvZyBmb3IgdGhlIgorICAgICAgICAgIGVjaG8gIioqKiBleGFjdCBlcnJvciB0aGF0IG9jY3VyZWQuIFRoaXMgdXN1YWxseSBtZWFucyBHTElCIHdhcyBpbmNvcnJlY3RseSBpbnN0YWxsZWQiCisgICAgICAgICAgZWNobyAiKioqIG9yIHRoYXQgeW91IGhhdmUgbW92ZWQgR0xJQiBzaW5jZSBpdCB3YXMgaW5zdGFsbGVkLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHlvdSIKKyAgICAgICAgICBlY2hvICIqKiogbWF5IHdhbnQgdG8gZWRpdCB0aGUgZ2xpYi1jb25maWcgc2NyaXB0OiAkR0xJQl9DT05GSUciIF0pCisgICAgICAgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisgICAgICAgICAgTElCUz0iJGFjX3NhdmVfTElCUyIKKyAgICAgICBmaQorICAgICBmaQorICAgICBHTElCX0NGTEFHUz0iIgorICAgICBHTElCX0xJQlM9IiIKKyAgICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkKKyAgZmkKKyAgQUNfU1VCU1QoR0xJQl9DRkxBR1MpCisgIEFDX1NVQlNUKEdMSUJfTElCUykKKyAgcm0gLWYgY29uZi5nbGlidGVzdAorXSkKZGlmZiAtLWdpdCBhL200L2dzdC1hbHNhLm00IGIvbTQvZ3N0LWFsc2EubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0MWQwNgotLS0gL2Rldi9udWxsCisrKyBiL200L2dzdC1hbHNhLm00CkBAIC0wLDAgKzEsMTUwIEBACitkbmwgQ29uZmlndXJlIFBhdGhzIGZvciBBbHNhCitkbmwgU29tZSBtb2RpZmljYXRpb25zIGJ5IFJpY2hhcmQgQm91bHRvbiA8cmljaGFyZC1hbHNhQHRhcnRhcnVzLm9yZz4KK2RubCBDaHJpc3RvcGhlciBMYW5zZG93biA8bGFuc2RvY3RAY3MuYWxmcmVkLmVkdT4KK2RubCBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CitkbmwgTGFzdCBtb2RpZmljYXRpb246IGFsc2EubTQsdiAxLjIzIDIwMDQvMDEvMTYgMTg6MTQ6MjIgdGl3YWkgRXhwCitkbmwgQU1fUEFUSF9BTFNBKFtNSU5JTVVNLVZFUlNJT04gWywgQUNUSU9OLUlGLUZPVU5EIFssIEFDVElPTi1JRi1OT1QtRk9VTkRdXV0pCitkbmwgVGVzdCBmb3IgbGliYXNvdW5kLCBhbmQgZGVmaW5lIEFMU0FfQ0ZMQUdTIGFuZCBBTFNBX0xJQlMgYXMgYXBwcm9wcmlhdGUuCitkbmwgZW5hYmxlcyBhcmd1bWVudHMgLS13aXRoLWFsc2EtcHJlZml4PQorZG5sICAgICAgICAgICAgICAgICAgIC0td2l0aC1hbHNhLWVuYy1wcmVmaXg9CitkbmwgICAgICAgICAgICAgICAgICAgLS1kaXNhYmxlLWFsc2F0ZXN0CitkbmwKK2RubCBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGlmIEFDVElPTl9JRl9OT1RfRk9VTkQgaXMgbm90IHNwZWNpZmllZCwKK2RubCBhbmQgdGhlIGFsc2EgbGlicmFyaWVzIGFyZSBub3QgZm91bmQsIGEgZmF0YWwgQUNfTVNHX0VSUk9SKCkgd2lsbCByZXN1bHQuCitkbmwKK0FDX0RFRlVOKFtBTV9QQVRIX0FMU0FdLAorW2RubCBTYXZlIHRoZSBvcmlnaW5hbCBDRkxBR1MsIExERkxBR1MsIGFuZCBMSUJTCithbHNhX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorYWxzYV9zYXZlX0xERkxBR1M9IiRMREZMQUdTIgorYWxzYV9zYXZlX0xJQlM9IiRMSUJTIgorYWxzYV9mb3VuZD15ZXMKKworZG5sCitkbmwgR2V0IHRoZSBjZmxhZ3MgYW5kIGxpYnJhcmllcyBmb3IgYWxzYQorZG5sCitBQ19BUkdfV0lUSChhbHNhLXByZWZpeCwKKyAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1hbHNhLXByZWZpeD1QRlhdLAorICAgICAgICAgICAgICAgICBbcHJlZml4IHdoZXJlIEFsc2EgbGlicmFyeSBpcyBpbnN0YWxsZWQob3B0aW9uYWwpXSksCisgIFthbHNhX3ByZWZpeD0iJHdpdGh2YWwiXSwgW2Fsc2FfcHJlZml4PSIiXSkKKworQUNfQVJHX1dJVEgoYWxzYS1pbmMtcHJlZml4LAorICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWFsc2EtaW5jLXByZWZpeD1QRlhdLAorICAgICAgICAgICAgICAgICBbcHJlZml4IHdoZXJlIGluY2x1ZGUgbGlicmFyaWVzIGFyZSAob3B0aW9uYWwpXSksCisgIFthbHNhX2luY19wcmVmaXg9IiR3aXRodmFsIl0sIFthbHNhX2luY19wcmVmaXg9IiJdKQorCitkbmwgRklYTUU6IHRoaXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZAorZG5sIEFDX0FSR19FTkFCTEUoYWxzYXRlc3QsCitkbmwgIEFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtYWxzYXRlc3RdLAorZG5sICAgICAgICAgICAgICAgICBbZG8gbm90IHRyeSB0byBjb21waWxlIGFuZCBydW4gYSB0ZXN0IEFsc2EgcHJvZ3JhbV0sCitkbmwgICAgICAgICAgICAgICAgIFtlbmFibGVfYWxzYXRlc3Q9bm9dLCBbZW5hYmxlX2Fsc2F0ZXN0PXllc10pCisKK2RubCBBZGQgYW55IHNwZWNpYWwgaW5jbHVkZSBkaXJlY3RvcmllcworQUNfTVNHX0NIRUNLSU5HKGZvciBBTFNBIENGTEFHUykKK2lmIHRlc3QgIiRhbHNhX2luY19wcmVmaXgiICE9ICIiIDsgdGhlbgorCUFMU0FfQ0ZMQUdTPSIkQUxTQV9DRkxBR1MgLUkkYWxzYV9pbmNfcHJlZml4IgorCUNGTEFHUz0iJENGTEFHUyAtSSRhbHNhX2luY19wcmVmaXgiCitmaQorQUNfTVNHX1JFU1VMVCgkQUxTQV9DRkxBR1MpCisKK2RubCBhZGQgYW55IHNwZWNpYWwgbGliIGRpcnMKK0FDX01TR19DSEVDS0lORyhmb3IgQUxTQSBMREZMQUdTKQoraWYgdGVzdCAiJGFsc2FfcHJlZml4IiAhPSAiIiA7IHRoZW4KKwlBTFNBX0xJQlM9IiRBTFNBX0xJQlMgLUwkYWxzYV9wcmVmaXgiCisJTERGTEFHUz0iJExERkxBR1MgJEFMU0FfTElCUyIKK2ZpCisKK2RubCBhZGQgdGhlIGFsc2EgbGlicmFyeQorQUxTQV9MSUJTPSIkQUxTQV9MSUJTIC1sYXNvdW5kIC1sbSAtbGRsIC1scHRocmVhZCIKK0xJQlM9YGVjaG8gJExJQlMgfCBzZWQgJ3MvLWxtLy8nYAorTElCUz1gZWNobyAkTElCUyB8IHNlZCAncy8tbGRsLy8nYAorTElCUz1gZWNobyAkTElCUyB8IHNlZCAncy8tbHB0aHJlYWQvLydgCitMSUJTPWBlY2hvICRMSUJTIHwgc2VkICdzLyAgLy8nYAorTElCUz0iJEFMU0FfTElCUyAkTElCUyIKK0FDX01TR19SRVNVTFQoJEFMU0FfTElCUykKKworZG5sIENoZWNrIGZvciBhIHdvcmtpbmcgdmVyc2lvbiBvZiBsaWJhc291bmQgdGhhdCBpcyBvZiB0aGUgcmlnaHQgdmVyc2lvbi4KK21pbl9hbHNhX3ZlcnNpb249aWZlbHNlKFskMV0sICwwLjEuMSwkMSkKK0FDX01TR19DSEVDS0lORyhmb3IgbGliYXNvdW5kIGhlYWRlcnMgdmVyc2lvbiA+PSAkbWluX2Fsc2FfdmVyc2lvbikKK25vX2Fsc2E9IiIKKyAgICBhbHNhX21pbl9tYWpvcl92ZXJzaW9uPWBlY2hvICRtaW5fYWxzYV92ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDEvJ2AKKyAgICBhbHNhX21pbl9taW5vcl92ZXJzaW9uPWBlY2hvICRtaW5fYWxzYV92ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDIvJ2AKKyAgICBhbHNhX21pbl9taWNyb192ZXJzaW9uPWBlY2hvICRtaW5fYWxzYV92ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDMvJ2AKKworQUNfTEFOR19TQVZFCitBQ19MQU5HX0MKK0FDX1RSWV9DT01QSUxFKFsKKyNpbmNsdWRlIDxhbHNhL2Fzb3VuZGxpYi5oPgorXSwgWwordm9pZCBtYWluKHZvaWQpCit7CisvKiBlbnN1cmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworI2lmICFkZWZpbmVkKFNORF9MSUJfTUFKT1IpICYmIGRlZmluZWQoU09VTkRMSUJfVkVSU0lPTl9NQUpPUikKKyNkZWZpbmUgU05EX0xJQl9NQUpPUiBTT1VORExJQl9WRVJTSU9OX01BSk9SCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTTkRfTElCX01JTk9SKSAmJiBkZWZpbmVkKFNPVU5ETElCX1ZFUlNJT05fTUlOT1IpCisjZGVmaW5lIFNORF9MSUJfTUlOT1IgU09VTkRMSUJfVkVSU0lPTl9NSU5PUgorI2VuZGlmCisjaWYgIWRlZmluZWQoU05EX0xJQl9TVUJNSU5PUikgJiYgZGVmaW5lZChTT1VORExJQl9WRVJTSU9OX1NVQk1JTk9SKQorI2RlZmluZSBTTkRfTElCX1NVQk1JTk9SIFNPVU5ETElCX1ZFUlNJT05fU1VCTUlOT1IKKyNlbmRpZgorCisjICBpZihTTkRfTElCX01BSk9SID4gJGFsc2FfbWluX21ham9yX3ZlcnNpb24pCisgIGV4aXQoMCk7CisjICBlbHNlCisjICAgIGlmKFNORF9MSUJfTUFKT1IgPCAkYWxzYV9taW5fbWFqb3JfdmVyc2lvbikKKyMgICAgICAgZXJyb3Igbm90IHByZXNlbnQKKyMgICAgZW5kaWYKKworIyAgIGlmKFNORF9MSUJfTUlOT1IgPiAkYWxzYV9taW5fbWlub3JfdmVyc2lvbikKKyAgZXhpdCgwKTsKKyMgICBlbHNlCisjICAgICBpZihTTkRfTElCX01JTk9SIDwgJGFsc2FfbWluX21pbm9yX3ZlcnNpb24pCisjICAgICAgICAgIGVycm9yIG5vdCBwcmVzZW50CisjICAgICAgZW5kaWYKKworIyAgICAgIGlmKFNORF9MSUJfU1VCTUlOT1IgPCAkYWxzYV9taW5fbWljcm9fdmVyc2lvbikKKyMgICAgICAgIGVycm9yIG5vdCBwcmVzZW50CisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCitleGl0KDApOworfQorXSwKKyAgW0FDX01TR19SRVNVTFQoZm91bmQuKV0sCisgIFtBQ19NU0dfUkVTVUxUKG5vdCBwcmVzZW50LikKKyAgIGlmZWxzZShbJDNdLCAsIFtBQ19NU0dfRVJST1IoU3VmZmljaWVudGx5IG5ldyB2ZXJzaW9uIG9mIGxpYmFzb3VuZCBub3QgZm91bmQuKV0pCisgICBhbHNhX2ZvdW5kPW5vXQorKQorQUNfTEFOR19SRVNUT1JFCisKK2RubCBOb3cgdGhhdCB3ZSBrbm93IHRoYXQgd2UgaGF2ZSB0aGUgcmlnaHQgdmVyc2lvbiwgbGV0J3Mgc2VlIGlmIHdlIGhhdmUgdGhlIGxpYnJhcnkgYW5kIG5vdCBqdXN0IHRoZSBoZWFkZXJzLgoraWYgdGVzdCAieCRlbmFibGVfYWxzYXRlc3QiID0gInh5ZXMiOyB0aGVuCitBQ19DSEVDS19MSUIoW2Fzb3VuZF0sIFtzbmRfY3RsX29wZW5dLCwKKwlbaWZlbHNlKFskM10sICwgW0FDX01TR19FUlJPUihObyBsaW5rYWJsZSBsaWJhc291bmQgd2FzIGZvdW5kLildKQorCSBhbHNhX2ZvdW5kPW5vXQorKQorZmkKKworaWYgdGVzdCAieCRhbHNhX2ZvdW5kIiA9ICJ4eWVzIiA7IHRoZW4KKyAgIGlmZWxzZShbJDJdLCAsIDosIFskMl0pCisgICBMSUJTPWBlY2hvICRMSUJTIHwgc2VkICdzLy1sYXNvdW5kLy9nJ2AKKyAgIExJQlM9YGVjaG8gJExJQlMgfCBzZWQgJ3MvICAvLydgCisgICBMSUJTPSItbGFzb3VuZCAkTElCUyIKK2ZpCitpZiB0ZXN0ICJ4JGFsc2FfZm91bmQiID0gInhubyIgOyB0aGVuCisgICBpZmVsc2UoWyQzXSwgLCA6LCBbJDNdKQorICAgQ0ZMQUdTPSIkYWxzYV9zYXZlX0NGTEFHUyIKKyAgIExERkxBR1M9IiRhbHNhX3NhdmVfTERGTEFHUyIKKyAgIExJQlM9IiRhbHNhX3NhdmVfTElCUyIKKyAgIEFMU0FfQ0ZMQUdTPSIiCisgICBBTFNBX0xJQlM9IiIKK2ZpCisKK2RubCBUaGF0IHNob3VsZCBiZSBpdC4gIE5vdyBqdXN0IGV4cG9ydCBvdXQgc3ltYm9sczoKK0FDX1NVQlNUKEFMU0FfQ0ZMQUdTKQorQUNfU1VCU1QoQUxTQV9MSUJTKQorXSkKKwpkaWZmIC0tZ2l0IGEvbTQvZ3N0LWFydHNjLm00IGIvbTQvZ3N0LWFydHNjLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NTk5NjAKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9nc3QtYXJ0c2MubTQKQEAgLTAsMCArMSwyOCBAQAorZG5sIFBlcmZvcm0gYSBjaGVjayBmb3IgZXhpc3RlbmNlIG9mIEFSVFNDCitkbmwgUmljaGFyZCBCb3VsdG9uIDxyaWNoYXJkLWFsc2FAdGFydGFydXMub3JnPgorZG5sIExhc3QgbW9kaWZpY2F0aW9uOiAyNi8wNi8yMDAxCitkbmwgR1NUX0NIRUNLX0FSVFNDKCkKK2RubAorZG5sIFRoaXMgY2hlY2sgd2FzIHdyaXR0ZW4gZm9yIEdTdHJlYW1lcjogaXQgc2hvdWxkIGJlIHJlbmFtZWQgYW5kIGNoZWNrZWQKK2RubCBmb3IgcG9ydGFiaWxpdHkgaWYgeW91IGRlY2lkZSB0byB1c2UgaXQgZWxzZXdoZXJlLgorZG5sCitBQ19ERUZVTihbR1NUX0NIRUNLX0FSVFNDXSwKK1sgCisgIEFDX1BBVEhfUFJPRyhBUlRTQ19DT05GSUcsIGFydHNjLWNvbmZpZywgbm8pCisgIGlmIHRlc3QgIngkQVJUU0NfQ09ORklHIiA9ICJ4bm8iOyB0aGVuCisgICAgQUNfTVNHX1dBUk4oW0NvdWxkbid0IGZpbmQgYXJ0c2MtY29uZmlnXSkKKyAgICBIQVZFX0FSVFNDPW5vCisgICAgQVJUU0NfTElCUz0KKyAgICBBUlRTQ19DRkxBR1M9CisgIGVsc2UKKyAgICBBUlRTQ19MSUJTPWBhcnRzYy1jb25maWcgLS1saWJzYAorICAgIEFSVFNDX0NGTEFHUz1gYXJ0c2MtY29uZmlnIC0tY2ZsYWdzYAorICAgIGRubCBBQ19DSEVDS19IRUFERVIgdXNlcyBDUFBGTEFHUywgYnV0IG5vdCBDRkxBR1MuICAKKyAgICBkbmwgRklYTUU6IEVuc3VyZSBvbmx5IHN1aXRhYmxlIGZsYWdzIHJlc3VsdCBmcm9tIGFydHNjLWNvbmZpZyAtLWNmbGFncworICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgJEFSVFNDX0NGTEFHUyIKKyAgICBBQ19DSEVDS19IRUFERVIoYXJ0c2MuaCwgSEFWRV9BUlRTQz15ZXMsIEhBVkVfQVJUU0M9bm8pCisgIGZpCisgIEFDX1NVQlNUKEFSVFNDX0xJQlMpCisgIEFDX1NVQlNUKEFSVFNDX0NGTEFHUykgCitdKQorCmRpZmYgLS1naXQgYS9tNC9nc3QtZmlvbnJlYWQubTQgYi9tNC9nc3QtZmlvbnJlYWQubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAzYWE0NQotLS0gL2Rldi9udWxsCisrKyBiL200L2dzdC1maW9ucmVhZC5tNApAQCAtMCwwICsxLDQyIEBACitBQ19ERUZVTihbR1NUX0NIRUNLX0ZJT05SRUFEXSwgWworCisgIEFDX01TR19DSEVDS0lORyhmb3IgRklPTlJFQUQgaW4gc3lzL2lvY3RsLmgpCisgIEFDX0NBQ0hFX1ZBTChfY3ZfZ3N0X2Zpb25yZWFkX2luX3N5c19pb2N0bCwgWworICAgIEFDX1RSWV9DT01QSUxFKFsKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KK10sIFsKK2ludCB4ID0gRklPTlJFQUQ7CitpZiAoIHggKQorICByZXR1cm4gMDsKKyAgICBdLCBfY3ZfZ3N0X2Zpb25yZWFkX2luX3N5c19pb2N0bD0ieWVzIixfY3ZfZ3N0X2Zpb25yZWFkX2luX3N5c19pb2N0bD0ibm8iKQorICBdKQorCisgIEFDX01TR19SRVNVTFQoJF9jdl9nc3RfZmlvbnJlYWRfaW5fc3lzX2lvY3RsKQorCisgIGlmIHRlc3QgIiRfY3ZfZ3N0X2Zpb25yZWFkX2luX3N5c19pb2N0bCIgPSAieWVzIjsgdGhlbgorICAgIEFDX0RFRklORShbSEFWRV9GSU9OUkVBRF9JTl9TWVNfSU9DVExdLCAxLCBbRklPTlJFQUQgaW9jdGwgZm91bmQgaW4gc3lzL2lvY2x0LmhdKQorCisgIGVsc2UKKworICAgIEFDX01TR19DSEVDS0lORyhmb3IgRklPTlJFQUQgaW4gc3lzL2ZpbGlvLmgpCisgICAgQUNfQ0FDSEVfVkFMKF9jdl9nc3RfZmlvbnJlYWRfaW5fc3lzX2ZpbGlvLCBbCisgICAgICBBQ19UUllfQ09NUElMRShbCisgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgI2luY2x1ZGUgPHN5cy9maWxpby5oPgorICBdLCBbCisgIGludCB4ID0gRklPTlJFQUQ7CisgIGlmICggeCApCisgICAgcmV0dXJuIDA7CisgICAgICBdLCBfY3ZfZ3N0X2Zpb25yZWFkX2luX3N5c19maWxpbz0ieWVzIixfY3ZfZ3N0X2Zpb25yZWFkX2luX3N5c19maWxpbz0ibm8iKQorICAgIF0pCisKKyAgICBBQ19NU0dfUkVTVUxUKCRfY3ZfZ3N0X2Zpb25yZWFkX2luX3N5c19maWxpbykKKworICAgIGlmIHRlc3QgIiRfY3ZfZ3N0X2Zpb25yZWFkX2luX3N5c19maWxpbyIgPSAieWVzIjsgdGhlbgorICAgICAgQUNfREVGSU5FKFtIQVZFX0ZJT05SRUFEX0lOX1NZU19GSUxJT10sIDEsIFtGSU9OUkVBRCBpb2N0bCBmb3VuZCBpbiBzeXMvZmlsaW8uaF0pCisgICAgZmkKKworICBmaQorCitdKQpkaWZmIC0tZ2l0IGEvbTQvZ3N0LWl2b3JiaXMubTQgYi9tNC9nc3QtaXZvcmJpcy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTM1YmJiCi0tLSAvZGV2L251bGwKKysrIGIvbTQvZ3N0LWl2b3JiaXMubTQKQEAgLTAsMCArMSw2OCBAQAorIyBDb25maWd1cmUgcGF0aHMgZm9yIFRyZW1vcgorCitkbmwgWElQSF9QQVRIX0lWT1JCSVMoW0FDVElPTi1JRi1GT1VORCBbLCBBQ1RJT04tSUYtTk9ULUZPVU5EXV0pCitkbmwgVGVzdCBmb3IgbGliaXZvcmJpcywgYW5kIGRlZmluZSBJVk9SQklTX0NGTEFHUyBhbmQgSVZPUkJJU19MSUJTCitkbmwKK0FDX0RFRlVOKFtYSVBIX1BBVEhfSVZPUkJJU10sCitbZG5sIAorZG5sIEdldCB0aGUgY2ZsYWdzIGFuZCBsaWJyYXJpZXMKK2RubAorQUNfQVJHX1dJVEgoaXZvcmJpcyxbICAtLXdpdGgtaXZvcmJpcz1QRlggICBQcmVmaXggd2hlcmUgbGliaXZvcmJpcyBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0sIGl2b3JiaXNfcHJlZml4PSIkd2l0aHZhbCIsIGl2b3JiaXNfcHJlZml4PSIiKQorQUNfQVJHX1dJVEgoaXZvcmJpcy1saWJyYXJpZXMsWyAgLS13aXRoLWl2b3JiaXMtbGlicmFyaWVzPURJUiAgIERpcmVjdG9yeSB3aGVyZSBsaWJpdm9yYmlzIGxpYnJhcnkgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldLCBpdm9yYmlzX2xpYnJhcmllcz0iJHdpdGh2YWwiLCBpdm9yYmlzX2xpYnJhcmllcz0iIikKK0FDX0FSR19XSVRIKGl2b3JiaXMtaW5jbHVkZXMsWyAgLS13aXRoLWl2b3JiaXMtaW5jbHVkZXM9RElSICAgRGlyZWN0b3J5IHdoZXJlIGxpYml2b3JiaXMgaGVhZGVyIGZpbGVzIGFyZSBpbnN0YWxsZWQgKG9wdGlvbmFsKV0sIGl2b3JiaXNfaW5jbHVkZXM9IiR3aXRodmFsIiwgaXZvcmJpc19pbmNsdWRlcz0iIikKK0FDX0FSR19FTkFCTEUoaXZvcmJpc3Rlc3QsIFsgIC0tZGlzYWJsZS1pdm9yYmlzdGVzdCAgICAgICBEbyBub3QgdHJ5IHRvIGNvbXBpbGUgYW5kIHJ1biBhIHRlc3QgSXZvcmJpcyBwcm9ncmFtXSwsIGVuYWJsZV9pdm9yYmlzdGVzdD15ZXMpCisKKyAgaWYgdGVzdCAieCRpdm9yYmlzX2xpYnJhcmllcyIgIT0gIngiIDsgdGhlbgorICAgIElWT1JCSVNfTElCUz0iLUwkaXZvcmJpc19saWJyYXJpZXMiCisgIGVsaWYgdGVzdCAieCRpdm9yYmlzX3ByZWZpeCIgIT0gIngiIDsgdGhlbgorICAgIElWT1JCSVNfTElCUz0iLUwkaXZvcmJpc19wcmVmaXgvbGliIgorICBlbGlmIHRlc3QgIngkcHJlZml4IiAhPSAieE5PTkUiOyB0aGVuCisgICAgSVZPUkJJU19MSUJTPSItTCRwcmVmaXgvbGliIgorICBmaQorCisgIElWT1JCSVNfTElCUz0iJElWT1JCSVNfTElCUyAtbHZvcmJpc2lkZWMgLWxtIgorCisgIGlmIHRlc3QgIngkaXZvcmJpc19pbmNsdWRlcyIgIT0gIngiIDsgdGhlbgorICAgIElWT1JCSVNfQ0ZMQUdTPSItSSRpdm9yYmlzX2luY2x1ZGVzIgorICBlbGlmIHRlc3QgIngkaXZvcmJpc19wcmVmaXgiICE9ICJ4IiA7IHRoZW4KKyAgICBJVk9SQklTX0NGTEFHUz0iLUkkaXZvcmJpc19wcmVmaXgvaW5jbHVkZSIKKyAgZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0gInhOT05FIjsgdGhlbgorICAgIElWT1JCSVNfQ0ZMQUdTPSItSSRwcmVmaXgvaW5jbHVkZSIKKyAgZmkKKworICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIFRyZW1vcikKKyAgbm9faXZvcmJpcz0iIgorCisgIGlmIHRlc3QgIngkZW5hYmxlX2l2b3JiaXN0ZXN0IiA9ICJ4eWVzIiA7IHRoZW4KKyAgICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICBhY19zYXZlX0xJQlM9IiRMSUJTIgorICAgIENGTEFHUz0iJENGTEFHUyAkSVZPUkJJU19DRkxBR1MgJE9HR19DRkxBR1MiCisgICAgTElCUz0iJExJQlMgJElWT1JCSVNfTElCUyAkT0dHX0xJQlMiCitkbmwKK2RubCBOb3cgY2hlY2sgaWYgdGhlIGluc3RhbGxlZCBUcmVtb3IgaXMgc3VmZmljaWVudGx5IG5ldy4KK2RubAorICAgICAgcm0gLWYgY29uZi5pdm9yYmlzdGVzdAorICAgICAgQUNfVFJZX0NPTVBJTEUoWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dHJlbW9yL2NvZGVjLmg+CitdLCwsIG5vX2l2b3JiaXM9eWVzKQorICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgIGZpCisKKyAgaWYgdGVzdCAieCRub19pdm9yYmlzIiA9ICJ4IiA7IHRoZW4KKyAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgIGlmZWxzZShbJDFdLCAsIDosIFskMV0pICAgICAKKyAgZWxzZQorICAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgICBJVk9SQklTX0NGTEFHUz0iIgorICAgICBJVk9SQklTX0xJQlM9IiIKKyAgICAgSVZPUkJJU0ZJTEVfTElCUz0iIgorICAgICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKQorICBmaQorICBBQ19TVUJTVChJVk9SQklTX0NGTEFHUykKKyAgQUNfU1VCU1QoSVZPUkJJU19MSUJTKQorICBBQ19TVUJTVChJVk9SQklTRklMRV9MSUJTKQorXSkKZGlmZiAtLWdpdCBhL200L2dzdC1tYXRyb3NrYS5tNCBiL200L2dzdC1tYXRyb3NrYS5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTBjYWFhCi0tLSAvZGV2L251bGwKKysrIGIvbTQvZ3N0LW1hdHJvc2thLm00CkBAIC0wLDAgKzEsMjYyIEBACisjIENvbmZpZ3VyZSBwYXRocyBmb3IgbGliZWJtbAorCitkbmwgUEFUSF9FQk1MKFtBQ1RJT04tSUYtRk9VTkQgWywgQUNUSU9OLUlGLU5PVC1GT1VORF1dKQorZG5sIFRlc3QgZm9yIGxpYmVibWwsIGFuZCBkZWZpbmUgRUJNTF9DRkxBR1MgYW5kIEVCTUxfTElCUworZG5sCitBQ19ERUZVTihbUEFUSF9FQk1MXSwKK1tkbmwgCitkbmwgR2V0IHRoZSBjZmxhZ3MgYW5kIGxpYnJhcmllcworZG5sCitBQ19BUkdfV0lUSChlYm1sLXByZWZpeCxbICAtLXdpdGgtZWJtbC1wcmVmaXg9UEZYICAgICAgICBQcmVmaXggd2hlcmUgbGliZWJtbCBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0sIGVibWxfcHJlZml4PSIkd2l0aHZhbCIsIGVibWxfcHJlZml4PSIiKQorQUNfQVJHX1dJVEgoZWJtbC1pbmNsdWRlLFsgIC0td2l0aC1lYm1sLWluY2x1ZGU9RElSICAgICAgIFBhdGggdG8gd2hlcmUgdGhlIGxpYmVibWwgaW5jbHVkZSBmaWxlcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0sIGVibWxfaW5jbHVkZT0iJHdpdGh2YWwiLCBlYm1sX2luY2x1ZGU9IiIpCitBQ19BUkdfV0lUSChlYm1sLWxpYixbICAtLXdpdGgtZWJtbC1saWI9RElSICAgICAgICAgICBQYXRoIHRvIHdoZXJlIHRoZSBsaWJlYm1sIGxpYnJhcnkgaW5zdGFsbGVkIChvcHRpb25hbCldLCBlYm1sX2xpYj0iJHdpdGh2YWwiLCBlYm1sX2xpYj0iIikKK0FDX0FSR19FTkFCTEUoZWJtbHRlc3QsIFsgIC0tZGlzYWJsZS1lYm1sdGVzdCAgICAgICAgICAgIERvIG5vdCB0cnkgdG8gY29tcGlsZSBhbmQgcnVuIGEgdGVzdCBFQk1MIHByb2dyYW1dLCwgZW5hYmxlX2VibWx0ZXN0PXllcykKKworICBpZiB0ZXN0ICJ4JGVibWxfcHJlZml4IiAhPSAieCI7IHRoZW4KKyAgICBlYm1sX2FyZ3M9IiRlYm1sX2FyZ3MgLS1wcmVmaXg9JGVibWxfcHJlZml4IgorICAgIGlmIHRlc3QgIngkZWJtbF9pbmNsdWRlIiAhPSAieCI7IHRoZW4KKyAgICAgIEVCTUxfQ0ZMQUdTPSItSSRlYm1sX2luY2x1ZGUiCisgICAgZWxzZQorICAgICAgRUJNTF9DRkxBR1M9Ii1JJGVibWxfcHJlZml4L2luY2x1ZGUvZWJtbCIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkZWJtbF9saWIiICE9ICJ4IjsgdGhlbgorICAgICAgRUJNTF9MSUJTPSItTCRlYm1sX2xpYiIKKyAgICBlbHNlCisgICAgICBFQk1MX0xJQlM9Ii1MJGVibWxfcHJlZml4L2xpYiIKKyAgICBmaQorICBlbGlmIHRlc3QgIngkcHJlZml4IiAhPSAieE5PTkUiOyB0aGVuCisgICAgZWJtbF9hcmdzPSIkZWJtbF9hcmdzIC0tcHJlZml4PSRwcmVmaXgiCisgICAgaWYgdGVzdCAieCRlYm1sX2luY2x1ZGUiICE9ICJ4IjsgdGhlbgorICAgICAgRUJNTF9DRkxBR1M9Ii1JJGVibWxfaW5jbHVkZSIKKyAgICBlbHNlCisgICAgICBFQk1MX0NGTEFHUz0iLUkkcHJlZml4L2luY2x1ZGUvZWJtbCIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkZWJtbF9saWIiICE9ICJ4IjsgdGhlbgorICAgICAgRUJNTF9MSUJTPSItTCRlYm1sX2xpYiIKKyAgICBlbHNlCisgICAgICBFQk1MX0xJQlM9Ii1MJHByZWZpeC9saWIiCisgICAgZmkKKyAgZWxzZQorICAgIGlmIHRlc3QgIngkZWJtbF9pbmNsdWRlIiAhPSAieCI7IHRoZW4KKyAgICAgIEVCTUxfQ0ZMQUdTPSItSSRlYm1sX2luY2x1ZGUiCisgICAgZWxzZQorICAgICAgRUJNTF9DRkxBR1M9Ii1JL3Vzci9pbmNsdWRlL2VibWwgLUkvdXNyL2xvY2FsL2luY2x1ZGUvZWJtbCIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkZWJtbF9saWIiICE9ICJ4IjsgdGhlbgorICAgICAgRUJNTF9MSUJTPSItTCRlYm1sX2xpYiIKKyAgICBlbHNlCisgICAgICBFQk1MX0xJQlM9Ii1ML3Vzci9sb2NhbC9saWIiCisgICAgZmkKKyAgZmkKKworICBFQk1MX0xJQlM9IiRFQk1MX0xJQlMgLWxlYm1sIgorCisgIEFDX01TR19DSEVDS0lORyhmb3IgRUJNTCkKKyAgbm9fZWJtbD0iIgorCisKKyAgaWYgdGVzdCAieCRlbmFibGVfZWJtbHRlc3QiID0gInh5ZXMiIDsgdGhlbgorICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgIGFjX3NhdmVfTElCUz0iJExJQlMiCisgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRFQk1MX0NGTEFHUyIKKyAgICBMSUJTPSIkTElCUyAkRUJNTF9MSUJTIgorZG5sCitkbmwgTm93IGNoZWNrIGlmIHRoZSBpbnN0YWxsZWQgRUJNTCBpcyBzdWZmaWNpZW50bHkgbmV3LgorZG5sCisgICAgICBybSAtZiBjb25mLmVibWx0ZXN0CisgICAgICBBQ19UUllfUlVOKFsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPEVibWxDb25maWcuaD4KKworaW50IG1haW4gKCkKK3sKKyAgc3lzdGVtKCJ0b3VjaCBjb25mLmVibWx0ZXN0Iik7CisgIHJldHVybiAwOworfQorCitdLCwgbm9fZWJtbD15ZXMsW2VjaG8gJGFjX24gImNyb3NzIGNvbXBpbGluZzsgYXNzdW1lZCBPSy4uLiAkYWNfYyJdKQorICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgIGZpCisKKyAgaWYgdGVzdCAieCRub19lYm1sIiA9ICJ4IiA7IHRoZW4KKyAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgIGlmZWxzZShbJDFdLCAsIDosIFskMV0pICAgICAKKyAgZWxzZQorICAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgICBpZiB0ZXN0IC1mIGNvbmYuZWJtbHRlc3QgOyB0aGVuCisgICAgICAgOgorICAgICBlbHNlCisgICAgICAgZWNobyAiKioqIENvdWxkIG5vdCBydW4gRWJtbCB0ZXN0IHByb2dyYW0sIGNoZWNraW5nIHdoeS4uLiIKKyAgICAgICBDRkxBR1M9IiRDRkxBR1MgJEVCTUxfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRMSUJTICRFQk1MX0xJQlMiCisgICAgICAgQUNfVFJZX0xJTksoWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8RWJtbENvbmZpZy5oPgorXSwgICAgIFsgcmV0dXJuIDA7IF0sCisgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBjb21waWxlZCwgYnV0IGRpZCBub3QgcnVuLiBUaGlzIHVzdWFsbHkgbWVhbnMiCisgICAgICAgZWNobyAiKioqIHRoYXQgdGhlIHJ1bi10aW1lIGxpbmtlciBpcyBub3QgZmluZGluZyBFQk1MIG9yIGZpbmRpbmcgdGhlIHdyb25nIgorICAgICAgIGVjaG8gIioqKiB2ZXJzaW9uIG9mIEVCTUwuIElmIGl0IGlzIG5vdCBmaW5kaW5nIEVCTUwsIHlvdSdsbCBuZWVkIHRvIHNldCB5b3VyIgorICAgICAgIGVjaG8gIioqKiBMRF9MSUJSQVJZX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIGVkaXQgL2V0Yy9sZC5zby5jb25mIHRvIHBvaW50IgorICAgICAgIGVjaG8gIioqKiB0byB0aGUgaW5zdGFsbGVkIGxvY2F0aW9uICBBbHNvLCBtYWtlIHN1cmUgeW91IGhhdmUgcnVuIGxkY29uZmlnIGlmIHRoYXQiCisgICAgICAgZWNobyAiKioqIGlzIHJlcXVpcmVkIG9uIHlvdXIgc3lzdGVtIgorICAgICAgIGVjaG8gIioqKiIKKyAgICAgICBlY2hvICIqKiogSWYgeW91IGhhdmUgYW4gb2xkIHZlcnNpb24gaW5zdGFsbGVkLCBpdCBpcyBiZXN0IHRvIHJlbW92ZSBpdCwgYWx0aG91Z2giCisgICAgICAgZWNobyAiKioqIHlvdSBtYXkgYWxzbyBiZSBhYmxlIHRvIGdldCB0aGluZ3MgdG8gd29yayBieSBtb2RpZnlpbmcgTERfTElCUkFSWV9QQVRIIl0sCisgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBmYWlsZWQgdG8gY29tcGlsZSBvciBsaW5rLiBTZWUgdGhlIGZpbGUgY29uZmlnLmxvZyBmb3IgdGhlIgorICAgICAgIGVjaG8gIioqKiBleGFjdCBlcnJvciB0aGF0IG9jY3VyZWQuIFRoaXMgdXN1YWxseSBtZWFucyBFQk1MIHdhcyBpbmNvcnJlY3RseSBpbnN0YWxsZWQiCisgICAgICAgZWNobyAiKioqIG9yIHRoYXQgeW91IGhhdmUgbW92ZWQgRUJNTCBzaW5jZSBpdCB3YXMgaW5zdGFsbGVkLiIgXSkKKyAgICAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKKyAgICAgICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorICAgICBmaQorICAgICBFQk1MX0NGTEFHUz0iIgorICAgICBFQk1MX0xJQlM9IiIKKyAgICAgaWZlbHNlKFskMl0sICwgOiwgWyQyXSkKKyAgZmkKKyAgQUNfU1VCU1QoRUJNTF9DRkxBR1MpCisgIEFDX1NVQlNUKEVCTUxfTElCUykKKyAgcm0gLWYgY29uZi5lYm1sdGVzdAorXSkKKworIyBDb25maWd1cmUgcGF0aHMgZm9yIGxpYm1hdHJvc2thCisKK2RubCBQQVRIX01BVFJPU0tBKE1JTl9WRVJTSU9OLCBbQUNUSU9OLUlGLUZPVU5EIFssIEFDVElPTi1JRi1OT1QtRk9VTkRdXSkKK2RubCBUZXN0IGZvciBsaWJtYXRyb3NrYSwgYW5kIGRlZmluZSBNQVRST1NLQV9DRkxBR1MgYW5kIE1BVFJPU0tBX0xJQlMKK2RubAorQUNfREVGVU4oW1BBVEhfTUFUUk9TS0FdLAorW2RubCAKK2RubCBHZXQgdGhlIGNmbGFncyBhbmQgbGlicmFyaWVzCitkbmwKK0FDX0FSR19XSVRIKG1hdHJvc2thLXByZWZpeCxbICAtLXdpdGgtbWF0cm9za2EtcHJlZml4PVBGWCAgICBQcmVmaXggd2hlcmUgbGlibWF0cm9za2EgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldLCBtYXRyb3NrYV9wcmVmaXg9IiR3aXRodmFsIiwgbWF0cm9za2FfcHJlZml4PSIiKQorQUNfQVJHX1dJVEgobWF0cm9za2EtaW5jbHVkZSxbICAtLXdpdGgtbWF0cm9za2EtaW5jbHVkZT1ESVIgICBQYXRoIHRvIHdoZXJlIHRoZSBsaWJtYXRyb3NrYSBpbmNsdWRlIGZpbGVzIGluc3RhbGxlZCAob3B0aW9uYWwpXSwgbWF0cm9za2FfaW5jbHVkZT0iJHdpdGh2YWwiLCBtYXRyb3NrYV9pbmNsdWRlPSIiKQorQUNfQVJHX1dJVEgobWF0cm9za2EtbGliLFsgIC0td2l0aC1tYXRyb3NrYS1saWI9RElSICAgICAgIFBhdGggdG8gd2hlcmUgdGhlIGxpYm1hdHJvc2thIGxpYnJhcnkgaW5zdGFsbGVkIChvcHRpb25hbCldLCBtYXRyb3NrYV9saWI9IiR3aXRodmFsIiwgbWF0cm9za2FfbGliPSIiKQorQUNfQVJHX0VOQUJMRShtYXRyb3NrYXRlc3QsIFsgIC0tZGlzYWJsZS1tYXRyb3NrYXRlc3QgICAgICAgIERvIG5vdCB0cnkgdG8gY29tcGlsZSBhbmQgcnVuIGEgdGVzdCBNYXRyb3NrYSBwcm9ncmFtXSwsIGVuYWJsZV9tYXRyb3NrYXRlc3Q9eWVzKQorCisgIGlmIHRlc3QgIngkbWF0cm9za2FfcHJlZml4IiAhPSAieCI7IHRoZW4KKyAgICBtYXRyb3NrYV9hcmdzPSIkbWF0cm9za2FfYXJncyAtLXByZWZpeD0kbWF0cm9za2FfcHJlZml4IgorICAgIGlmIHRlc3QgIngkbWF0cm9za2FfaW5jbHVkZSIgIT0gIngiOyB0aGVuCisgICAgICBNQVRST1NLQV9DRkxBR1M9Ii1JJG1hdHJvc2thX2luY2x1ZGUiCisgICAgZWxzZQorICAgICAgTUFUUk9TS0FfQ0ZMQUdTPSItSSRtYXRyb3NrYV9wcmVmaXgvaW5jbHVkZS9tYXRyb3NrYSIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbWF0cm9za2FfbGliIiAhPSAieCI7IHRoZW4KKyAgICAgIE1BVFJPU0tBX0xJQlM9Ii1MJG1hdHJvc2thX2xpYiIKKyAgICBlbHNlCisgICAgICBNQVRST1NLQV9MSUJTPSItTCRtYXRyb3NrYV9wcmVmaXgvbGliIgorICAgIGZpCisgIGVsaWYgdGVzdCAieCRwcmVmaXgiICE9ICJ4Tk9ORSI7IHRoZW4KKyAgICBtYXRyb3NrYV9hcmdzPSIkbWF0cm9za2FfYXJncyAtLXByZWZpeD0kcHJlZml4IgorICAgIGlmIHRlc3QgIngkbWF0cm9za2FfaW5jbHVkZSIgIT0gIngiOyB0aGVuCisgICAgICBNQVRST1NLQV9DRkxBR1M9Ii1JJG1hdHJvc2thX2luY2x1ZGUiCisgICAgZWxzZQorICAgICAgTUFUUk9TS0FfQ0ZMQUdTPSItSSRwcmVmaXgvaW5jbHVkZS9tYXRyb3NrYSIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbWF0cm9za2FfbGliIiAhPSAieCI7IHRoZW4KKyAgICAgIE1BVFJPU0tBX0xJQlM9Ii1MJG1hdHJvc2thX2xpYiIKKyAgICBlbHNlCisgICAgICBNQVRST1NLQV9MSUJTPSItTCRwcmVmaXgvbGliIgorICAgIGZpCisgIGVsc2UKKyAgICBpZiB0ZXN0ICJ4JG1hdHJvc2thX2luY2x1ZGUiICE9ICJ4IjsgdGhlbgorICAgICAgTUFUUk9TS0FfQ0ZMQUdTPSItSSRtYXRyb3NrYV9pbmNsdWRlIgorICAgIGVsc2UKKyAgICAgIE1BVFJPU0tBX0NGTEFHUz0iLUkvdXNyL2luY2x1ZGUvbWF0cm9za2EgLUkvdXNyL2xvY2FsL2luY2x1ZGUvbWF0cm9za2EiCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JG1hdHJvc2thX2xpYiIgIT0gIngiOyB0aGVuCisgICAgICBNQVRST1NLQV9MSUJTPSItTCRtYXRyb3NrYV9saWIiCisgICAgZWxzZQorICAgICAgTUFUUk9TS0FfTElCUz0iLUwvdXNyL2xvY2FsL2xpYiIKKyAgICBmaQorICBmaQorCisgIE1BVFJPU0tBX0xJQlM9IiRNQVRST1NLQV9MSUJTIC1sbWF0cm9za2EiCisKKyAgQUNfTVNHX0NIRUNLSU5HKGZvciBNYXRyb3NrYSkKKyAgbm9fbWF0cm9za2E9IiIKKworCisgIGlmIHRlc3QgIngkZW5hYmxlX21hdHJvc2thdGVzdCIgPSAieHllcyIgOyB0aGVuCisgICAgYWNfc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgorICAgIGFjX3NhdmVfTElCUz0iJExJQlMiCisgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAkTUFUUk9TS0FfQ0ZMQUdTICRFQk1MX0NGTEFHUyIKKyAgICBMSUJTPSIkTElCUyAkTUFUUk9TS0FfTElCUyAkRUJNTF9MSUJTIgorZG5sCitkbmwgTm93IGNoZWNrIGlmIHRoZSBpbnN0YWxsZWQgTWF0cm9za2EgaXMgc3VmZmljaWVudGx5IG5ldy4KK2RubAorICAgICAgcm0gLWYgY29uZi5tYXRyb3NrYXRlc3QKKyAgICAgIEFDX0xBTkdfQ1BMVVNQTFVTCisgICAgICBBQ19UUllfUlVOKFsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPEVibWxDb25maWcuaD4KKyNpbmNsdWRlIDxLYXhWZXJzaW9uLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBMSUJNQVRST1NLQV9OQU1FU1BBQ0U7CisKK2ludCBtYWluICgpCit7CisgIEZJTEUgKmY7CisgIGYgPSBmb3BlbigiY29uZi5tYXRyb3NrYXRlc3QiLCAid2IiKTsKKyAgaWYgKGYgPT0gTlVMTCkKKyAgICByZXR1cm4gMTsKKyAgZnByaW50ZihmLCAiJXNcbiIsIEtheENvZGVWZXJzaW9uLmNfc3RyKCkpOworICBmY2xvc2UoZik7CisgIHJldHVybiAwOworfQorCitdLCwgbm9fbWF0cm9za2E9eWVzLFtlY2hvICRhY19uICJjcm9zcyBjb21waWxpbmc7IGFzc3VtZWQgT0suLi4gJGFjX2MiXSkKKyAgICAgIEFDX0xBTkdfQworICAgICAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIgorICAgICAgTElCUz0iJGFjX3NhdmVfTElCUyIKKyAgZmkKKworICBpZiB0ZXN0ICJ4JG5vX21hdHJvc2thIiA9ICJ4IiAtYSAtZiBjb25mLm1hdHJvc2thdGVzdCA7IHRoZW4KKyAgICBBQ19NU0dfUkVTVUxUKHllcykKKworICAgIEFDX01TR19DSEVDS0lORyhNYXRyb3NrYSB2ZXJzaW9uKQorCisgICAgbWF0cm9za2FfdmVyc2lvbj1gY2F0IGNvbmYubWF0cm9za2F0ZXN0YAorICAgIG1rX01BSlZFUj1gZWNobyAkMSB8IGN1dCAtZCIuIiAtZjFgCisgICAgbWtfTUlOVkVSPWBlY2hvICQxIHwgY3V0IC1kIi4iIC1mMmAKKyAgICBta19SRUxWRVI9YGVjaG8gJDEgfCBjdXQgLWQiLiIgLWYzYAorICAgIG12ZXJfb2s9YHNlZCAncztcLjtcIDtnJyA8IGNvbmYubWF0cm9za2F0ZXN0IHwgKHJlYWQgLWEgbXZlcgorICAgIGlmIHRlc3QgJHttdmVyW1swXV19IC1ndCAkbWtfTUFKVkVSIDsgdGhlbgorICAgICAgbXZlcl9vaz0xCisgICAgZWxpZiB0ZXN0ICR7bXZlcltbMF1dfSAtbHQgJG1rX01BSlZFUiA7IHRoZW4KKyAgICAgIG12ZXJfb2s9MAorICAgIGVsc2UKKyAgICAgIGlmIHRlc3QgJHttdmVyW1sxXV19IC1ndCAkbWtfTUlOVkVSIDsgdGhlbgorICAgICAgICBtdmVyX29rPTEKKyAgICAgIGVsaWYgdGVzdCAke212ZXJbWzFdXX0gLWx0ICRta19NSU5WRVIgOyB0aGVuCisgICAgICAgIG12ZXJfb2s9MAorICAgICAgZWxzZQorICAgICAgICBpZiB0ZXN0ICR7bXZlcltbMl1dfSAtZ2UgJG1rX1JFTFZFUiA7IHRoZW4KKyAgICAgICAgICBtdmVyX29rPTEKKyAgICAgICAgZWxzZQorICAgICAgICAgIG12ZXJfb2s9MAorICAgICAgICBmaQorICAgICAgZmkKKyAgICBmaQorICAgIGVjaG8gJG12ZXJfb2sgKWAKKyAgICBpZiB0ZXN0ICIkbXZlcl9vayIgPSAiMSIgOyB0aGVuCisgICAgICBBQ19NU0dfUkVTVUxUKCRtYXRyb3NrYV92ZXJzaW9uIG9rKQorICAgICAgIGlmZWxzZShbJDJdLCAsIDosIFskMl0pICAgICAKKyAgICBlbHNlCisgICAgICBBQ19NU0dfUkVTVUxUKCRtYXRyb3NrYV92ZXJzaW9uIHRvbyBvbGQpCisgICAgICBlY2hvICcqKiogWW91ciBNYXRyb3NrYSB2ZXJzaW9uIGlzIHRvbyBvbGQuIFVwZ3JhZGUgdG8gYXQgbGVhc3QgdmVyc2lvbicKKyAgICAgIGVjaG8gJyoqKiAkMSBhbmQgcmUtcnVuIGNvbmZpZ3VyZS4nCisgICAgICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkgICAgIAorICAgIGZpCisKKyAgZWxzZQorICAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgICBpZmVsc2UoWyQzXSwgLCA6LCBbJDNdKQorICBmaQorCisgIEFDX1NVQlNUKE1BVFJPU0tBX0NGTEFHUykKKyAgQUNfU1VCU1QoTUFUUk9TS0FfTElCUykKKyAgcm0gLWYgY29uZi5tYXRyb3NrYXRlc3QKK10pCmRpZmYgLS1naXQgYS9tNC9nc3Qtc2RsLm00IGIvbTQvZ3N0LXNkbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmMzMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbTQvZ3N0LXNkbC5tNApAQCAtMCwwICsxLDE4NCBAQAorIyBzdHVmZiBmb3IgU0RMLCBob3BlIHRoaXMgaGVscHMgaWYgd2UgcHV0IGl0IGhlcmUKKworIyBDb25maWd1cmUgcGF0aHMgZm9yIFNETAorIyBTYW0gTGFudGluZ2EgOS8yMS85OQorIyBzdG9sZW4gZnJvbSBNYW5pc2ggU2luZ2gKKyMgc3RvbGVuIGJhY2sgZnJvbSBGcmFuayBCZWxldworIyBzdG9sZW4gZnJvbSBNYW5pc2ggU2luZ2gKKyMgU2hhbWVsZXNzbHkgc3RvbGVuIGZyb20gT3dlbiBUYXlsb3IKKworZG5sIEFNX1BBVEhfU0RMKFtNSU5JTVVNLVZFUlNJT04sIFtBQ1RJT04tSUYtRk9VTkQgWywgQUNUSU9OLUlGLU5PVC1GT1VORF1dXSkKK2RubCBUZXN0IGZvciBTREwsIGFuZCBkZWZpbmUgU0RMX0NGTEFHUyBhbmQgU0RMX0xJQlMKK2RubAorQUNfREVGVU4oW0FNX1BBVEhfU0RMXSwKK1tkbmwgCitkbmwgR2V0IHRoZSBjZmxhZ3MgYW5kIGxpYnJhcmllcyBmcm9tIHRoZSBzZGwtY29uZmlnIHNjcmlwdAorZG5sCitBQ19BUkdfV0lUSChzZGwtcHJlZml4LAorICBBQ19IRUxQX1NUUklORyhbLS13aXRoLXNkbC1wcmVmaXg9UEZYXSwKKyAgICAgICAgICAgICAgICAgW3ByZWZpeCB3aGVyZSBTREwgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldKSwKKyAgc2RsX3ByZWZpeD0iJHdpdGh2YWwiLCBzZGxfcHJlZml4PSIiKQorCitBQ19BUkdfV0lUSChzZGwtZXhlYy1wcmVmaXgsCisgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtc2RsLWV4ZWMtcHJlZml4PVBGWF0sCisgICAgICAgICAgICAgICAgIFtleGVjIHByZWZpeCB3aGVyZSBTREwgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldKSwKKyAgc2RsX2V4ZWNfcHJlZml4PSIkd2l0aHZhbCIsIHNkbF9leGVjX3ByZWZpeD0iIikKKworQUNfQVJHX0VOQUJMRShzZGx0ZXN0LAorICBBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXNkbHRlc3RdLAorICAgICAgICAgICAgICAgICBbZG8gbm90IHRyeSB0byBjb21waWxlIGFuZCBydW4gYSB0ZXN0IFNETCBwcm9ncmFtXSksCisgICwgZW5hYmxlX3NkbHRlc3Q9eWVzKQorCisgIGlmIHRlc3QgeCRzZGxfZXhlY19wcmVmaXggIT0geCA7IHRoZW4KKyAgICAgc2RsX2FyZ3M9IiRzZGxfYXJncyAtLWV4ZWMtcHJlZml4PSRzZGxfZXhlY19wcmVmaXgiCisgICAgIGlmIHRlc3QgeCR7U0RMX0NPTkZJRytzZXR9ICE9IHhzZXQgOyB0aGVuCisgICAgICAgIFNETF9DT05GSUc9JHNkbF9leGVjX3ByZWZpeC9iaW4vc2RsLWNvbmZpZworICAgICBmaQorICBmaQorICBpZiB0ZXN0IHgkc2RsX3ByZWZpeCAhPSB4IDsgdGhlbgorICAgICBzZGxfYXJncz0iJHNkbF9hcmdzIC0tcHJlZml4PSRzZGxfcHJlZml4IgorICAgICBpZiB0ZXN0IHgke1NETF9DT05GSUcrc2V0fSAhPSB4c2V0IDsgdGhlbgorICAgICAgICBTRExfQ09ORklHPSRzZGxfcHJlZml4L2Jpbi9zZGwtY29uZmlnCisgICAgIGZpCisgIGZpCisKKyAgQUNfUEFUSF9QUk9HKFNETF9DT05GSUcsIHNkbC1jb25maWcsIG5vKQorICBtaW5fc2RsX3ZlcnNpb249aWZlbHNlKFskMV0sICwwLjExLjAsJDEpCisgIEFDX01TR19DSEVDS0lORyhmb3IgU0RMIC0gdmVyc2lvbiA+PSAkbWluX3NkbF92ZXJzaW9uKQorICBub19zZGw9IiIKKyAgaWYgdGVzdCAiJFNETF9DT05GSUciID0gIm5vIiA7IHRoZW4KKyAgICBub19zZGw9eWVzCisgIGVsc2UKKyAgICBTRExfQ0ZMQUdTPWAkU0RMX0NPTkZJRyAkc2RsY29uZl9hcmdzIC0tY2ZsYWdzYAorICAgIFNETF9MSUJTPWAkU0RMX0NPTkZJRyAkc2RsY29uZl9hcmdzIC0tbGlic2AKKworICAgIHNkbF9tYWpvcl92ZXJzaW9uPWAkU0RMX0NPTkZJRyAkc2RsX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDEvJ2AKKyAgICBzZGxfbWlub3JfdmVyc2lvbj1gJFNETF9DT05GSUcgJHNkbF9hcmdzIC0tdmVyc2lvbiB8IFwKKyAgICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wyLydgCisgICAgc2RsX21pY3JvX3ZlcnNpb249YCRTRExfQ09ORklHICRzZGxfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDMvJ2AKKyAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9zZGx0ZXN0IiA9ICJ4eWVzIiA7IHRoZW4KKyAgICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgIENGTEFHUz0iJENGTEFHUyAkU0RMX0NGTEFHUyIKKyAgICAgIExJQlM9IiRMSUJTICRTRExfTElCUyIKK2RubAorZG5sIE5vdyBjaGVjayBpZiB0aGUgaW5zdGFsbGVkIFNETCBpcyBzdWZmaWNpZW50bHkgbmV3LiAoQWxzbyBzYW5pdHkKK2RubCBjaGVja3MgdGhlIHJlc3VsdHMgb2Ygc2RsLWNvbmZpZyB0byBzb21lIGV4dGVudAorZG5sCisgICAgICBybSAtZiBjb25mLnNkbHRlc3QKKyAgICAgIEFDX1RSWV9SVU4oWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiU0RMLmgiCisKK2NoYXIqCitteV9zdHJkdXAgKGNoYXIgKnN0cikKK3sKKyAgY2hhciAqbmV3X3N0cjsKKyAgCisgIGlmIChzdHIpCisgICAgeworICAgICAgbmV3X3N0ciA9IChjaGFyICopbWFsbG9jICgoc3RybGVuIChzdHIpICsgMSkgKiBzaXplb2YoY2hhcikpOworICAgICAgc3RyY3B5IChuZXdfc3RyLCBzdHIpOworICAgIH0KKyAgZWxzZQorICAgIG5ld19zdHIgPSBOVUxMOworICAKKyAgcmV0dXJuIG5ld19zdHI7Cit9CisKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgbWFqb3IsIG1pbm9yLCBtaWNybzsKKyAgY2hhciAqdG1wX3ZlcnNpb247CisKKyAgLyogVGhpcyBoYW5ncyBvbiBzb21lIHN5c3RlbXMgKD8pCisgIHN5c3RlbSAoInRvdWNoIGNvbmYuc2RsdGVzdCIpOworICAqLworICB7IEZJTEUgKmZwID0gZm9wZW4oImNvbmYuc2RsdGVzdCIsICJhIik7IGlmICggZnAgKSBmY2xvc2UoZnApOyB9CisKKyAgLyogSFAvVVggOSAoJUAjISkgd3JpdGVzIHRvIHNzY2FuZiBzdHJpbmdzICovCisgIHRtcF92ZXJzaW9uID0gbXlfc3RyZHVwKCIkbWluX3NkbF92ZXJzaW9uIik7CisgIGlmIChzc2NhbmYodG1wX3ZlcnNpb24sICIlZC4lZC4lZCIsICZtYWpvciwgJm1pbm9yLCAmbWljcm8pICE9IDMpIHsKKyAgICAgcHJpbnRmKCIlcywgYmFkIHZlcnNpb24gc3RyaW5nXG4iLCAiJG1pbl9zZGxfdmVyc2lvbiIpOworICAgICBleGl0KDEpOworICAgfQorCisgICBpZiAoKCRzZGxfbWFqb3JfdmVyc2lvbiA+IG1ham9yKSB8fAorICAgICAgKCgkc2RsX21ham9yX3ZlcnNpb24gPT0gbWFqb3IpICYmICgkc2RsX21pbm9yX3ZlcnNpb24gPiBtaW5vcikpIHx8CisgICAgICAoKCRzZGxfbWFqb3JfdmVyc2lvbiA9PSBtYWpvcikgJiYgKCRzZGxfbWlub3JfdmVyc2lvbiA9PSBtaW5vcikgJiYgKCRzZGxfbWljcm9fdmVyc2lvbiA+PSBtaWNybykpKQorICAgIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50ZigiXG4qKiogJ3NkbC1jb25maWcgLS12ZXJzaW9uJyByZXR1cm5lZCAlZC4lZC4lZCwgYnV0IHRoZSBtaW5pbXVtIHZlcnNpb25cbiIsICRzZGxfbWFqb3JfdmVyc2lvbiwgJHNkbF9taW5vcl92ZXJzaW9uLCAkc2RsX21pY3JvX3ZlcnNpb24pOworICAgICAgcHJpbnRmKCIqKiogb2YgU0RMIHJlcXVpcmVkIGlzICVkLiVkLiVkLiBJZiBzZGwtY29uZmlnIGlzIGNvcnJlY3QsIHRoZW4gaXQgaXNcbiIsIG1ham9yLCBtaW5vciwgbWljcm8pOworICAgICAgcHJpbnRmKCIqKiogYmVzdCB0byB1cGdyYWRlIHRvIHRoZSByZXF1aXJlZCB2ZXJzaW9uLlxuIik7CisgICAgICBwcmludGYoIioqKiBJZiBzZGwtY29uZmlnIHdhcyB3cm9uZywgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBTRExfQ09ORklHXG4iKTsKKyAgICAgIHByaW50ZigiKioqIHRvIHBvaW50IHRvIHRoZSBjb3JyZWN0IGNvcHkgb2Ygc2RsLWNvbmZpZywgYW5kIHJlbW92ZSB0aGUgZmlsZVxuIik7CisgICAgICBwcmludGYoIioqKiBjb25maWcuY2FjaGUgYmVmb3JlIHJlLXJ1bm5pbmcgY29uZmlndXJlXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KK30KKworXSwsIG5vX3NkbD15ZXMsW2VjaG8gJGFjX24gImNyb3NzIGNvbXBpbGluZzsgYXNzdW1lZCBPSy4uLiAkYWNfYyJdKQorICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgICAgIGZpCisgIGZpCisgIGlmIHRlc3QgIngkbm9fc2RsIiA9IHggOyB0aGVuCisgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKSAgICAgCisgIGVsc2UKKyAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgaWYgdGVzdCAiJFNETF9DT05GSUciID0gIm5vIiA7IHRoZW4KKyAgICAgICBlY2hvICIqKiogVGhlIHNkbC1jb25maWcgc2NyaXB0IGluc3RhbGxlZCBieSBTREwgY291bGQgbm90IGJlIGZvdW5kIgorICAgICAgIGVjaG8gIioqKiBJZiBTREwgd2FzIGluc3RhbGxlZCBpbiBQUkVGSVgsIG1ha2Ugc3VyZSBQUkVGSVgvYmluIGlzIGluIgorICAgICAgIGVjaG8gIioqKiB5b3VyIHBhdGgsIG9yIHNldCB0aGUgU0RMX0NPTkZJRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUiCisgICAgICAgZWNobyAiKioqIGZ1bGwgcGF0aCB0byBzZGwtY29uZmlnLiIKKyAgICAgZWxzZQorICAgICAgIGlmIHRlc3QgLWYgY29uZi5zZGx0ZXN0IDsgdGhlbgorICAgICAgICA6CisgICAgICAgZWxzZQorICAgICAgICAgIGVjaG8gIioqKiBDb3VsZCBub3QgcnVuIFNETCB0ZXN0IHByb2dyYW0sIGNoZWNraW5nIHdoeS4uLiIKKyAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFNETF9DRkxBR1MiCisgICAgICAgICAgTElCUz0iJExJQlMgJFNETF9MSUJTIgorICAgICAgICAgIEFDX1RSWV9MSU5LKFsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIlNETC5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreyByZXR1cm4gMDsgfQorI3VuZGVmICBtYWluCisjZGVmaW5lIG1haW4gS19hbmRfUl9DX21haW4KK10sICAgICAgWyByZXR1cm4gMDsgXSwKKyAgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBjb21waWxlZCwgYnV0IGRpZCBub3QgcnVuLiBUaGlzIHVzdWFsbHkgbWVhbnMiCisgICAgICAgICAgZWNobyAiKioqIHRoYXQgdGhlIHJ1bi10aW1lIGxpbmtlciBpcyBub3QgZmluZGluZyBTREwgb3IgZmluZGluZyB0aGUgd3JvbmciCisgICAgICAgICAgZWNobyAiKioqIHZlcnNpb24gb2YgU0RMLiBJZiBpdCBpcyBub3QgZmluZGluZyBTREwsIHlvdSdsbCBuZWVkIHRvIHNldCB5b3VyIgorICAgICAgICAgIGVjaG8gIioqKiBMRF9MSUJSQVJZX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIGVkaXQgL2V0Yy9sZC5zby5jb25mIHRvIHBvaW50IgorICAgICAgICAgIGVjaG8gIioqKiB0byB0aGUgaW5zdGFsbGVkIGxvY2F0aW9uICBBbHNvLCBtYWtlIHN1cmUgeW91IGhhdmUgcnVuIGxkY29uZmlnIGlmIHRoYXQiCisgICAgICAgICAgZWNobyAiKioqIGlzIHJlcXVpcmVkIG9uIHlvdXIgc3lzdGVtIgorCSAgZWNobyAiKioqIgorICAgICAgICAgIGVjaG8gIioqKiBJZiB5b3UgaGF2ZSBhbiBvbGQgdmVyc2lvbiBpbnN0YWxsZWQsIGl0IGlzIGJlc3QgdG8gcmVtb3ZlIGl0LCBhbHRob3VnaCIKKyAgICAgICAgICBlY2hvICIqKiogeW91IG1heSBhbHNvIGJlIGFibGUgdG8gZ2V0IHRoaW5ncyB0byB3b3JrIGJ5IG1vZGlmeWluZyBMRF9MSUJSQVJZX1BBVEgiXSwKKyAgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBmYWlsZWQgdG8gY29tcGlsZSBvciBsaW5rLiBTZWUgdGhlIGZpbGUgY29uZmlnLmxvZyBmb3IgdGhlIgorICAgICAgICAgIGVjaG8gIioqKiBleGFjdCBlcnJvciB0aGF0IG9jY3VyZWQuIFRoaXMgdXN1YWxseSBtZWFucyBTREwgd2FzIGluY29ycmVjdGx5IGluc3RhbGxlZCIKKyAgICAgICAgICBlY2hvICIqKiogb3IgdGhhdCB5b3UgaGF2ZSBtb3ZlZCBTREwgc2luY2UgaXQgd2FzIGluc3RhbGxlZC4gSW4gdGhlIGxhdHRlciBjYXNlLCB5b3UiCisgICAgICAgICAgZWNobyAiKioqIG1heSB3YW50IHRvIGVkaXQgdGhlIHNkbC1jb25maWcgc2NyaXB0OiAkU0RMX0NPTkZJRyIgXSkKKyAgICAgICAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKKyAgICAgICAgICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorICAgICAgIGZpCisgICAgIGZpCisgICAgIFNETF9DRkxBR1M9IiIKKyAgICAgU0RMX0xJQlM9IiIKKyAgICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkKKyAgZmkKKyAgQUNfU1VCU1QoU0RMX0NGTEFHUykKKyAgQUNfU1VCU1QoU0RMX0xJQlMpCisgIHJtIC1mIGNvbmYuc2RsdGVzdAorXSkKKwpkaWZmIC0tZ2l0IGEvbTQvZ3N0LXNob3V0Mi5tNCBiL200L2dzdC1zaG91dDIubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1YTc2NwotLS0gL2Rldi9udWxsCisrKyBiL200L2dzdC1zaG91dDIubTQKQEAgLTAsMCArMSwxMDIgQEAKKyMgQ29uZmlndXJlIHBhdGhzIGZvciBsaWJzaG91dAorIyBKYWNrIE1vZmZpdHQgPGphY2tAaWNlY2FzdC5vcmc+IDA4LTA2LTIwMDEKKyMgU2hhbWVsZXNzbHkgc3RvbGVuIGZyb20gT3dlbiBUYXlsb3IgYW5kIE1hbmlzaCBTaW5naAorCitkbmwgQU1fUEFUSF9TSE9VVDIoW0FDVElPTi1JRi1GT1VORCBbLCBBQ1RJT04tSUYtTk9ULUZPVU5EXV0pCitkbmwgVGVzdCBmb3IgbGlic2hvdXQgMiwgYW5kIGRlZmluZSBTSE9VVDJfQ0ZMQUdTIGFuZCBTSE9VVDJfTElCUworZG5sCitBQ19ERUZVTihbQU1fUEFUSF9TSE9VVDJdLAorW2RubCAKK2RubCBHZXQgdGhlIGNmbGFncyBhbmQgbGlicmFyaWVzCitkbmwKK0FDX0FSR19XSVRIKHNob3V0Mi1wcmVmaXgsWyAgLS13aXRoLXNob3V0Mi1wcmVmaXg9UEZYICAgUHJlZml4IHdoZXJlIGxpYnNob3V0MiBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0sIHNob3V0Ml9wcmVmaXg9IiR3aXRodmFsIiwgc2hvdXQyX3ByZWZpeD0iIikKK0FDX0FSR19FTkFCTEUoc2hvdXQydGVzdCwgWyAgLS1kaXNhYmxlLXNob3V0MnRlc3QgICAgICAgRG8gbm90IHRyeSB0byBjb21waWxlIGFuZCBydW4gYSB0ZXN0IHNob3V0MiBwcm9ncmFtXSwsIGVuYWJsZV9zaG91dDJ0ZXN0PXllcykKKworICBpZiB0ZXN0ICJ4JHNob3V0Ml9wcmVmaXgiICE9ICJ4Tk9ORSIgOyB0aGVuCisgICAgU0hPVVQyX0NGTEFHUz0iLUkkc2hvdXQyX3ByZWZpeC9pbmNsdWRlIgorICAgIFNIT1VUMl9MSUJTPSItTCRzaG91dDJfcHJlZml4L2xpYiIKKyAgZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0gIngiOyB0aGVuCisgICAgU0hPVVQyX0NGTEFHUz0iLUkkcHJlZml4L2luY2x1ZGUiCisgICAgU0hPVVQyX0xJQlM9Ii1MJHByZWZpeC9saWIiCisgIGZpCisKKyAgU0hPVVQyX0xJQlM9IiRTSE9VVDJfTElCUyAtbHNob3V0IC1scHRocmVhZCIKKworICBjYXNlICRob3N0IGluCisgICotKi1zb2xhcmlzKikKKyAgCVNIT1VUMl9MSUJTPSIkU0hPVVQyX0xJQlMgLWxuc2wgLWxzb2NrZXQgLWxyZXNvbHYiCisgIGVzYWMKKworICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIHNob3V0MikKKyAgbm9fc2hvdXQyPSIiCisKKyAgaWYgdGVzdCAieCRlbmFibGVfc2hvdXQydGVzdCIgPSAieHllcyIgOyB0aGVuCisgICAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKyAgICBDRkxBR1M9IiRDRkxBR1MgJFNIT1VUMl9DRkxBR1MgJE9HR19DRkxBR1MgJFZPUkJJU19DRkxBR1MiCisgICAgTElCUz0iJExJQlMgJFNIT1VUMl9MSUJTICRPR0dfTElCUyAkVk9SQklTX0xJQlMiCitkbmwKK2RubCBOb3cgY2hlY2sgaWYgdGhlIGluc3RhbGxlZCBzaG91dDIgaXMgc3VmZmljaWVudGx5IG5ldy4KK2RubAorICAgICAgcm0gLWYgY29uZi5zaG91dDJ0ZXN0CisgICAgICBBQ19UUllfUlVOKFsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNob3V0L3Nob3V0Lmg+CisKK2ludCBtYWluICgpCit7CisgIGludCBtYWpvciwgbWlub3IsIHBhdGNoOworCisgIHN5c3RlbSgidG91Y2ggY29uZi5zaG91dDJ0ZXN0Iik7CisgIHNob3V0X3ZlcnNpb24oJm1ham9yLCAmbWlub3IsICZwYXRjaCk7CisgIGlmIChtYWpvciA8IDIpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitdLCwgbm9fc2hvdXQyPXllcyxbZWNobyAkYWNfbiAiY3Jvc3MgY29tcGlsaW5nOyBhc3N1bWVkIE9LLi4uICRhY19jIl0pCisgICAgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisgICAgICAgTElCUz0iJGFjX3NhdmVfTElCUyIKKyAgZmkKKworICBpZiB0ZXN0ICJ4JG5vX3Nob3V0MiIgPSAieCIgOyB0aGVuCisgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICBpZmVsc2UoWyQxXSwgLCA6LCBbJDFdKSAgICAgCisgIGVsc2UKKyAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgaWYgdGVzdCAtZiBjb25mLnNob3V0MnRlc3QgOyB0aGVuCisgICAgICAgOgorICAgICBlbHNlCisgICAgICAgZWNobyAiKioqIENvdWxkIG5vdCBydW4gU2hvdXQyIHRlc3QgcHJvZ3JhbSwgY2hlY2tpbmcgd2h5Li4uIgorICAgICAgIENGTEFHUz0iJENGTEFHUyAkU0hPVVQyX0NGTEFHUyAkT0dHX0NGTEFHUyAkVk9SQklTX0NGTEFHUyIKKyAgICAgICBMSUJTPSIkTElCUyAkU0hPVVQyX0xJQlMgJE9HR19MSUJTICRWT1JCSVNfTElCUyIKKyAgICAgICBBQ19UUllfTElOSyhbCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzaG91dC9zaG91dC5oPgorXSwgICAgIFsgcmV0dXJuIDA7IF0sCisgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBjb21waWxlZCwgYnV0IGRpZCBub3QgcnVuLiBUaGlzIHVzdWFsbHkgbWVhbnMiCisgICAgICAgZWNobyAiKioqIHRoYXQgdGhlIHJ1bi10aW1lIGxpbmtlciBpcyBub3QgZmluZGluZyBTaG91dDIgb3IgZmluZGluZyB0aGUgd3JvbmciCisgICAgICAgZWNobyAiKioqIHZlcnNpb24gb2YgU2hvdXQyLiBJZiBpdCBpcyBub3QgZmluZGluZyBTaG91dDIsIHlvdSdsbCBuZWVkIHRvIHNldCB5b3VyIgorICAgICAgIGVjaG8gIioqKiBMRF9MSUJSQVJZX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIGVkaXQgL2V0Yy9sZC5zby5jb25mIHRvIHBvaW50IgorICAgICAgIGVjaG8gIioqKiB0byB0aGUgaW5zdGFsbGVkIGxvY2F0aW9uICBBbHNvLCBtYWtlIHN1cmUgeW91IGhhdmUgcnVuIGxkY29uZmlnIGlmIHRoYXQiCisgICAgICAgZWNobyAiKioqIGlzIHJlcXVpcmVkIG9uIHlvdXIgc3lzdGVtIgorICAgICAgIGVjaG8gIioqKiIKKyAgICAgICBlY2hvICIqKiogSWYgeW91IGhhdmUgYW4gb2xkIHZlcnNpb24gaW5zdGFsbGVkLCBpdCBpcyBiZXN0IHRvIHJlbW92ZSBpdCwgYWx0aG91Z2giCisgICAgICAgZWNobyAiKioqIHlvdSBtYXkgYWxzbyBiZSBhYmxlIHRvIGdldCB0aGluZ3MgdG8gd29yayBieSBtb2RpZnlpbmcgTERfTElCUkFSWV9QQVRIIl0sCisgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBmYWlsZWQgdG8gY29tcGlsZSBvciBsaW5rLiBTZWUgdGhlIGZpbGUgY29uZmlnLmxvZyBmb3IgdGhlIgorICAgICAgIGVjaG8gIioqKiBleGFjdCBlcnJvciB0aGF0IG9jY3VyZWQuIFRoaXMgdXN1YWxseSBtZWFucyBTaG91dDIgd2FzIGluY29ycmVjdGx5IGluc3RhbGxlZCIKKyAgICAgICBlY2hvICIqKiogb3IgdGhhdCB5b3UgaGF2ZSBtb3ZlZCBTaG91dDIgc2luY2UgaXQgd2FzIGluc3RhbGxlZC4gSW4gdGhlIGxhdHRlciBjYXNlLCB5b3UiCisgICAgICAgZWNobyAiKioqIG1heSB3YW50IHRvIGVkaXQgdGhlIHNob3V0LWNvbmZpZyBzY3JpcHQ6ICRTSE9VVDJfQ09ORklHIiBdKQorICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgICAgIGZpCisgICAgIFNIT1VUMl9DRkxBR1M9IiIKKyAgICAgU0hPVVQyX0xJQlM9IiIKKyAgICAgaWZlbHNlKFskMl0sICwgOiwgWyQyXSkKKyAgZmkKKyAgQUNfU1VCU1QoU0hPVVQyX0NGTEFHUykKKyAgQUNfU1VCU1QoU0hPVVQyX0xJQlMpCisgIHJtIC1mIGNvbmYuc2hvdXQydGVzdAorXSkKZGlmZiAtLWdpdCBhL200L2dzdC1zaWQubTQgYi9tNC9nc3Qtc2lkLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZTI4NzcKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9nc3Qtc2lkLm00CkBAIC0wLDAgKzEsMzkgQEAKK2RubCBjaGVjayBmb3Igc2lkcGxheQorCitBQ19ERUZVTihbR1NUX1BBVEhfU0lEUExBWV0sCitbCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsaWJzaWRwbGF5IDEuMzYueF0pCisKK0FDX0xBTkdfUFVTSChDKyspCisKK0FDX0NIRUNLX0hFQURFUihzaWRwbGF5L3BsYXllci5oLCBIQVZFX1NJRFBMQVk9InllcyIsIEhBVkVfU0lEUExBWT0ibm8iKQorCitpZiB0ZXN0ICRIQVZFX1NJRFBMQVkgPSAieWVzIjsgdGhlbgorICBTSURQTEFZX0xJQlM9Ii1sc2lkcGxheSIKKworICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgLWxzaWRwbGF5IHdvcmtzXSkKKyAgYWNfbGlic19zYWZlPSRMSUJTCisKKyAgTElCUz0iLWxzaWRwbGF5IgorCisgIEFDX1RSWV9SVU4oWworICAgICNpbmNsdWRlIDxzaWRwbGF5L3BsYXllci5oPgorICAgIGludCBtYWluKCkKKyAgICB7IHNpZFR1bmUgdHVuZSA9IHNpZFR1bmUoMCk7ICB9CisgICAgXSwKKyAgICBIQVZFX1NJRFBMQVk9InllcyIsCisgICAgSEFWRV9TSURQTEFZPSJubyIsCisgICAgSEFWRV9TSURQTEFZPSJubyIpCisKKyAgTElCUz0iJGFjX2xpYnNfc2FmZSIKKworICBBQ19NU0dfUkVTVUxUKFskSEFWRV9TSURQTEFZXSkKK2ZpCisKK1NJRFBMQVlfQ0ZMQUdTPQorU0lEUExBWV9MSUJTPSItbHNpZHBsYXkiCitBQ19TVUJTVChTSURQTEFZX0NGTEFHUykKK0FDX1NVQlNUKFNJRFBMQVlfTElCUykKKworQUNfTEFOR19QT1AoQysrKQorXSkKZGlmZiAtLWdpdCBhL200L2d0ay5tNCBiL200L2d0ay5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmRkNDcyCi0tLSAvZGV2L251bGwKKysrIGIvbTQvZ3RrLm00CkBAIC0wLDAgKzEsMTk0IEBACisjIENvbmZpZ3VyZSBwYXRocyBmb3IgR1RLKworIyBPd2VuIFRheWxvciAgICAgOTctMTEtMworCitkbmwgQU1fUEFUSF9HVEsoW01JTklNVU0tVkVSU0lPTiwgW0FDVElPTi1JRi1GT1VORCBbLCBBQ1RJT04tSUYtTk9ULUZPVU5EIFssIE1PRFVMRVNdXV1dKQorZG5sIFRlc3QgZm9yIEdUSywgYW5kIGRlZmluZSBHVEtfQ0ZMQUdTIGFuZCBHVEtfTElCUworZG5sCitBQ19ERUZVTihbQU1fUEFUSF9HVEtdLAorW2RubCAKK2RubCBHZXQgdGhlIGNmbGFncyBhbmQgbGlicmFyaWVzIGZyb20gdGhlIGd0ay1jb25maWcgc2NyaXB0CitkbmwKK0FDX0FSR19XSVRIKGd0ay1wcmVmaXgsWyAgLS13aXRoLWd0ay1wcmVmaXg9UEZYICAgUHJlZml4IHdoZXJlIEdUSyBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0sCisgICAgICAgICAgICBndGtfY29uZmlnX3ByZWZpeD0iJHdpdGh2YWwiLCBndGtfY29uZmlnX3ByZWZpeD0iIikKK0FDX0FSR19XSVRIKGd0ay1leGVjLXByZWZpeCxbICAtLXdpdGgtZ3RrLWV4ZWMtcHJlZml4PVBGWCBFeGVjIHByZWZpeCB3aGVyZSBHVEsgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldLAorICAgICAgICAgICAgZ3RrX2NvbmZpZ19leGVjX3ByZWZpeD0iJHdpdGh2YWwiLCBndGtfY29uZmlnX2V4ZWNfcHJlZml4PSIiKQorQUNfQVJHX0VOQUJMRShndGt0ZXN0LCBbICAtLWRpc2FibGUtZ3RrdGVzdCAgICAgICBEbyBub3QgdHJ5IHRvIGNvbXBpbGUgYW5kIHJ1biBhIHRlc3QgR1RLIHByb2dyYW1dLAorCQkgICAgLCBlbmFibGVfZ3RrdGVzdD15ZXMpCisKKyAgZm9yIG1vZHVsZSBpbiAuICQ0CisgIGRvCisgICAgICBjYXNlICIkbW9kdWxlIiBpbgorICAgICAgICAgZ3RocmVhZCkgCisgICAgICAgICAgICAgZ3RrX2NvbmZpZ19hcmdzPSIkZ3RrX2NvbmZpZ19hcmdzIGd0aHJlYWQiCisgICAgICAgICA7OworICAgICAgZXNhYworICBkb25lCisKKyAgaWYgdGVzdCB4JGd0a19jb25maWdfZXhlY19wcmVmaXggIT0geCA7IHRoZW4KKyAgICAgZ3RrX2NvbmZpZ19hcmdzPSIkZ3RrX2NvbmZpZ19hcmdzIC0tZXhlYy1wcmVmaXg9JGd0a19jb25maWdfZXhlY19wcmVmaXgiCisgICAgIGlmIHRlc3QgeCR7R1RLX0NPTkZJRytzZXR9ICE9IHhzZXQgOyB0aGVuCisgICAgICAgIEdUS19DT05GSUc9JGd0a19jb25maWdfZXhlY19wcmVmaXgvYmluL2d0ay1jb25maWcKKyAgICAgZmkKKyAgZmkKKyAgaWYgdGVzdCB4JGd0a19jb25maWdfcHJlZml4ICE9IHggOyB0aGVuCisgICAgIGd0a19jb25maWdfYXJncz0iJGd0a19jb25maWdfYXJncyAtLXByZWZpeD0kZ3RrX2NvbmZpZ19wcmVmaXgiCisgICAgIGlmIHRlc3QgeCR7R1RLX0NPTkZJRytzZXR9ICE9IHhzZXQgOyB0aGVuCisgICAgICAgIEdUS19DT05GSUc9JGd0a19jb25maWdfcHJlZml4L2Jpbi9ndGstY29uZmlnCisgICAgIGZpCisgIGZpCisKKyAgQUNfUEFUSF9QUk9HKEdUS19DT05GSUcsIGd0ay1jb25maWcsIG5vKQorICBtaW5fZ3RrX3ZlcnNpb249aWZlbHNlKFskMV0sICwwLjk5LjcsJDEpCisgIEFDX01TR19DSEVDS0lORyhmb3IgR1RLIC0gdmVyc2lvbiA+PSAkbWluX2d0a192ZXJzaW9uKQorICBub19ndGs9IiIKKyAgaWYgdGVzdCAiJEdUS19DT05GSUciID0gIm5vIiA7IHRoZW4KKyAgICBub19ndGs9eWVzCisgIGVsc2UKKyAgICBHVEtfQ0ZMQUdTPWAkR1RLX0NPTkZJRyAkZ3RrX2NvbmZpZ19hcmdzIC0tY2ZsYWdzYAorICAgIEdUS19MSUJTPWAkR1RLX0NPTkZJRyAkZ3RrX2NvbmZpZ19hcmdzIC0tbGlic2AKKyAgICBndGtfY29uZmlnX21ham9yX3ZlcnNpb249YCRHVEtfQ09ORklHICRndGtfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDEvJ2AKKyAgICBndGtfY29uZmlnX21pbm9yX3ZlcnNpb249YCRHVEtfQ09ORklHICRndGtfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDIvJ2AKKyAgICBndGtfY29uZmlnX21pY3JvX3ZlcnNpb249YCRHVEtfQ09ORklHICRndGtfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDMvJ2AKKyAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9ndGt0ZXN0IiA9ICJ4eWVzIiA7IHRoZW4KKyAgICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgIENGTEFHUz0iJENGTEFHUyAkR1RLX0NGTEFHUyIKKyAgICAgIExJQlM9IiRHVEtfTElCUyAkTElCUyIKK2RubAorZG5sIE5vdyBjaGVjayBpZiB0aGUgaW5zdGFsbGVkIEdUSyBpcyBzdWZmaWNpZW50bHkgbmV3LiAoQWxzbyBzYW5pdHkKK2RubCBjaGVja3MgdGhlIHJlc3VsdHMgb2YgZ3RrLWNvbmZpZyB0byBzb21lIGV4dGVudAorZG5sCisgICAgICBybSAtZiBjb25mLmd0a3Rlc3QKKyAgICAgIEFDX1RSWV9SVU4oWworI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitpbnQgCittYWluICgpCit7CisgIGludCBtYWpvciwgbWlub3IsIG1pY3JvOworICBjaGFyICp0bXBfdmVyc2lvbjsKKworICBzeXN0ZW0gKCJ0b3VjaCBjb25mLmd0a3Rlc3QiKTsKKworICAvKiBIUC9VWCA5ICglQCMhKSB3cml0ZXMgdG8gc3NjYW5mIHN0cmluZ3MgKi8KKyAgdG1wX3ZlcnNpb24gPSBnX3N0cmR1cCgiJG1pbl9ndGtfdmVyc2lvbiIpOworICBpZiAoc3NjYW5mKHRtcF92ZXJzaW9uLCAiJWQuJWQuJWQiLCAmbWFqb3IsICZtaW5vciwgJm1pY3JvKSAhPSAzKSB7CisgICAgIHByaW50ZigiJXMsIGJhZCB2ZXJzaW9uIHN0cmluZ1xuIiwgIiRtaW5fZ3RrX3ZlcnNpb24iKTsKKyAgICAgZXhpdCgxKTsKKyAgIH0KKworICBpZiAoKGd0a19tYWpvcl92ZXJzaW9uICE9ICRndGtfY29uZmlnX21ham9yX3ZlcnNpb24pIHx8CisgICAgICAoZ3RrX21pbm9yX3ZlcnNpb24gIT0gJGd0a19jb25maWdfbWlub3JfdmVyc2lvbikgfHwKKyAgICAgIChndGtfbWljcm9fdmVyc2lvbiAhPSAkZ3RrX2NvbmZpZ19taWNyb192ZXJzaW9uKSkKKyAgICB7CisgICAgICBwcmludGYoIlxuKioqICdndGstY29uZmlnIC0tdmVyc2lvbicgcmV0dXJuZWQgJWQuJWQuJWQsIGJ1dCBHVEsrICglZC4lZC4lZClcbiIsIAorICAgICAgICAgICAgICRndGtfY29uZmlnX21ham9yX3ZlcnNpb24sICRndGtfY29uZmlnX21pbm9yX3ZlcnNpb24sICRndGtfY29uZmlnX21pY3JvX3ZlcnNpb24sCisgICAgICAgICAgICAgZ3RrX21ham9yX3ZlcnNpb24sIGd0a19taW5vcl92ZXJzaW9uLCBndGtfbWljcm9fdmVyc2lvbik7CisgICAgICBwcmludGYgKCIqKiogd2FzIGZvdW5kISBJZiBndGstY29uZmlnIHdhcyBjb3JyZWN0LCB0aGVuIGl0IGlzIGJlc3RcbiIpOworICAgICAgcHJpbnRmICgiKioqIHRvIHJlbW92ZSB0aGUgb2xkIHZlcnNpb24gb2YgR1RLKy4gWW91IG1heSBhbHNvIGJlIGFibGUgdG8gZml4IHRoZSBlcnJvclxuIik7CisgICAgICBwcmludGYoIioqKiBieSBtb2RpZnlpbmcgeW91ciBMRF9MSUJSQVJZX1BBVEggZW52aXJvbWVudCB2YXJpYWJsZSwgb3IgYnkgZWRpdGluZ1xuIik7CisgICAgICBwcmludGYoIioqKiAvZXRjL2xkLnNvLmNvbmYuIE1ha2Ugc3VyZSB5b3UgaGF2ZSBydW4gbGRjb25maWcgaWYgdGhhdCBpc1xuIik7CisgICAgICBwcmludGYoIioqKiByZXF1aXJlZCBvbiB5b3VyIHN5c3RlbS5cbiIpOworICAgICAgcHJpbnRmKCIqKiogSWYgZ3RrLWNvbmZpZyB3YXMgd3JvbmcsIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgR1RLX0NPTkZJR1xuIik7CisgICAgICBwcmludGYoIioqKiB0byBwb2ludCB0byB0aGUgY29ycmVjdCBjb3B5IG9mIGd0ay1jb25maWcsIGFuZCByZW1vdmUgdGhlIGZpbGUgY29uZmlnLmNhY2hlXG4iKTsKKyAgICAgIHByaW50ZigiKioqIGJlZm9yZSByZS1ydW5uaW5nIGNvbmZpZ3VyZVxuIik7CisgICAgfSAKKyNpZiBkZWZpbmVkIChHVEtfTUFKT1JfVkVSU0lPTikgJiYgZGVmaW5lZCAoR1RLX01JTk9SX1ZFUlNJT04pICYmIGRlZmluZWQgKEdUS19NSUNST19WRVJTSU9OKQorICBlbHNlIGlmICgoZ3RrX21ham9yX3ZlcnNpb24gIT0gR1RLX01BSk9SX1ZFUlNJT04pIHx8CisJICAgKGd0a19taW5vcl92ZXJzaW9uICE9IEdUS19NSU5PUl9WRVJTSU9OKSB8fAorICAgICAgICAgICAoZ3RrX21pY3JvX3ZlcnNpb24gIT0gR1RLX01JQ1JPX1ZFUlNJT04pKQorICAgIHsKKyAgICAgIHByaW50ZigiKioqIEdUSysgaGVhZGVyIGZpbGVzICh2ZXJzaW9uICVkLiVkLiVkKSBkbyBub3QgbWF0Y2hcbiIsCisJICAgICBHVEtfTUFKT1JfVkVSU0lPTiwgR1RLX01JTk9SX1ZFUlNJT04sIEdUS19NSUNST19WRVJTSU9OKTsKKyAgICAgIHByaW50ZigiKioqIGxpYnJhcnkgKHZlcnNpb24gJWQuJWQuJWQpXG4iLAorCSAgICAgZ3RrX21ham9yX3ZlcnNpb24sIGd0a19taW5vcl92ZXJzaW9uLCBndGtfbWljcm9fdmVyc2lvbik7CisgICAgfQorI2VuZGlmIC8qIGRlZmluZWQgKEdUS19NQUpPUl9WRVJTSU9OKSAuLi4gKi8KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICgoZ3RrX21ham9yX3ZlcnNpb24gPiBtYWpvcikgfHwKKyAgICAgICAgKChndGtfbWFqb3JfdmVyc2lvbiA9PSBtYWpvcikgJiYgKGd0a19taW5vcl92ZXJzaW9uID4gbWlub3IpKSB8fAorICAgICAgICAoKGd0a19tYWpvcl92ZXJzaW9uID09IG1ham9yKSAmJiAoZ3RrX21pbm9yX3ZlcnNpb24gPT0gbWlub3IpICYmIChndGtfbWljcm9fdmVyc2lvbiA+PSBtaWNybykpKQorICAgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgICB9CisgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcHJpbnRmKCJcbioqKiBBbiBvbGQgdmVyc2lvbiBvZiBHVEsrICglZC4lZC4lZCkgd2FzIGZvdW5kLlxuIiwKKyAgICAgICAgICAgICAgIGd0a19tYWpvcl92ZXJzaW9uLCBndGtfbWlub3JfdmVyc2lvbiwgZ3RrX21pY3JvX3ZlcnNpb24pOworICAgICAgICBwcmludGYoIioqKiBZb3UgbmVlZCBhIHZlcnNpb24gb2YgR1RLKyBuZXdlciB0aGFuICVkLiVkLiVkLiBUaGUgbGF0ZXN0IHZlcnNpb24gb2ZcbiIsCisJICAgICAgIG1ham9yLCBtaW5vciwgbWljcm8pOworICAgICAgICBwcmludGYoIioqKiBHVEsrIGlzIGFsd2F5cyBhdmFpbGFibGUgZnJvbSBmdHA6Ly9mdHAuZ3RrLm9yZy5cbiIpOworICAgICAgICBwcmludGYoIioqKlxuIik7CisgICAgICAgIHByaW50ZigiKioqIElmIHlvdSBoYXZlIGFscmVhZHkgaW5zdGFsbGVkIGEgc3VmZmljaWVudGx5IG5ldyB2ZXJzaW9uLCB0aGlzIGVycm9yXG4iKTsKKyAgICAgICAgcHJpbnRmKCIqKiogcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgd3JvbmcgY29weSBvZiB0aGUgZ3RrLWNvbmZpZyBzaGVsbCBzY3JpcHQgaXNcbiIpOworICAgICAgICBwcmludGYoIioqKiBiZWluZyBmb3VuZC4gVGhlIGVhc2llc3Qgd2F5IHRvIGZpeCB0aGlzIGlzIHRvIHJlbW92ZSB0aGUgb2xkIHZlcnNpb25cbiIpOworICAgICAgICBwcmludGYoIioqKiBvZiBHVEsrLCBidXQgeW91IGNhbiBhbHNvIHNldCB0aGUgR1RLX0NPTkZJRyBlbnZpcm9ubWVudCB0byBwb2ludCB0byB0aGVcbiIpOworICAgICAgICBwcmludGYoIioqKiBjb3JyZWN0IGNvcHkgb2YgZ3RrLWNvbmZpZy4gKEluIHRoaXMgY2FzZSwgeW91IHdpbGwgaGF2ZSB0b1xuIik7CisgICAgICAgIHByaW50ZigiKioqIG1vZGlmeSB5b3VyIExEX0xJQlJBUllfUEFUSCBlbnZpcm9tZW50IHZhcmlhYmxlLCBvciBlZGl0IC9ldGMvbGQuc28uY29uZlxuIik7CisgICAgICAgIHByaW50ZigiKioqIHNvIHRoYXQgdGhlIGNvcnJlY3QgbGlicmFyaWVzIGFyZSBmb3VuZCBhdCBydW4tdGltZSkpXG4iKTsKKyAgICAgIH0KKyAgICB9CisgIHJldHVybiAxOworfQorXSwsIG5vX2d0az15ZXMsW2VjaG8gJGFjX24gImNyb3NzIGNvbXBpbGluZzsgYXNzdW1lZCBPSy4uLiAkYWNfYyJdKQorICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgICAgIGZpCisgIGZpCisgIGlmIHRlc3QgIngkbm9fZ3RrIiA9IHggOyB0aGVuCisgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKSAgICAgCisgIGVsc2UKKyAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgaWYgdGVzdCAiJEdUS19DT05GSUciID0gIm5vIiA7IHRoZW4KKyAgICAgICBlY2hvICIqKiogVGhlIGd0ay1jb25maWcgc2NyaXB0IGluc3RhbGxlZCBieSBHVEsgY291bGQgbm90IGJlIGZvdW5kIgorICAgICAgIGVjaG8gIioqKiBJZiBHVEsgd2FzIGluc3RhbGxlZCBpbiBQUkVGSVgsIG1ha2Ugc3VyZSBQUkVGSVgvYmluIGlzIGluIgorICAgICAgIGVjaG8gIioqKiB5b3VyIHBhdGgsIG9yIHNldCB0aGUgR1RLX0NPTkZJRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUiCisgICAgICAgZWNobyAiKioqIGZ1bGwgcGF0aCB0byBndGstY29uZmlnLiIKKyAgICAgZWxzZQorICAgICAgIGlmIHRlc3QgLWYgY29uZi5ndGt0ZXN0IDsgdGhlbgorICAgICAgICA6CisgICAgICAgZWxzZQorICAgICAgICAgIGVjaG8gIioqKiBDb3VsZCBub3QgcnVuIEdUSyB0ZXN0IHByb2dyYW0sIGNoZWNraW5nIHdoeS4uLiIKKyAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJEdUS19DRkxBR1MiCisgICAgICAgICAgTElCUz0iJExJQlMgJEdUS19MSUJTIgorICAgICAgICAgIEFDX1RSWV9MSU5LKFsKKyNpbmNsdWRlIDxndGsvZ3RrLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KK10sICAgICAgWyByZXR1cm4gKChndGtfbWFqb3JfdmVyc2lvbikgfHwgKGd0a19taW5vcl92ZXJzaW9uKSB8fCAoZ3RrX21pY3JvX3ZlcnNpb24pKTsgXSwKKyAgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBjb21waWxlZCwgYnV0IGRpZCBub3QgcnVuLiBUaGlzIHVzdWFsbHkgbWVhbnMiCisgICAgICAgICAgZWNobyAiKioqIHRoYXQgdGhlIHJ1bi10aW1lIGxpbmtlciBpcyBub3QgZmluZGluZyBHVEsgb3IgZmluZGluZyB0aGUgd3JvbmciCisgICAgICAgICAgZWNobyAiKioqIHZlcnNpb24gb2YgR1RLLiBJZiBpdCBpcyBub3QgZmluZGluZyBHVEssIHlvdSdsbCBuZWVkIHRvIHNldCB5b3VyIgorICAgICAgICAgIGVjaG8gIioqKiBMRF9MSUJSQVJZX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIGVkaXQgL2V0Yy9sZC5zby5jb25mIHRvIHBvaW50IgorICAgICAgICAgIGVjaG8gIioqKiB0byB0aGUgaW5zdGFsbGVkIGxvY2F0aW9uICBBbHNvLCBtYWtlIHN1cmUgeW91IGhhdmUgcnVuIGxkY29uZmlnIGlmIHRoYXQiCisgICAgICAgICAgZWNobyAiKioqIGlzIHJlcXVpcmVkIG9uIHlvdXIgc3lzdGVtIgorCSAgZWNobyAiKioqIgorICAgICAgICAgIGVjaG8gIioqKiBJZiB5b3UgaGF2ZSBhbiBvbGQgdmVyc2lvbiBpbnN0YWxsZWQsIGl0IGlzIGJlc3QgdG8gcmVtb3ZlIGl0LCBhbHRob3VnaCIKKyAgICAgICAgICBlY2hvICIqKiogeW91IG1heSBhbHNvIGJlIGFibGUgdG8gZ2V0IHRoaW5ncyB0byB3b3JrIGJ5IG1vZGlmeWluZyBMRF9MSUJSQVJZX1BBVEgiCisgICAgICAgICAgZWNobyAiKioqIgorICAgICAgICAgIGVjaG8gIioqKiBJZiB5b3UgaGF2ZSBhIFJlZEhhdCA1LjAgc3lzdGVtLCB5b3Ugc2hvdWxkIHJlbW92ZSB0aGUgR1RLIHBhY2thZ2UgdGhhdCIKKyAgICAgICAgICBlY2hvICIqKiogY2FtZSB3aXRoIHRoZSBzeXN0ZW0gd2l0aCB0aGUgY29tbWFuZCIKKyAgICAgICAgICBlY2hvICIqKioiCisgICAgICAgICAgZWNobyAiKioqICAgIHJwbSAtLWVyYXNlIC0tbm9kZXBzIGd0ayBndGstZGV2ZWwiIF0sCisgICAgICAgIFsgZWNobyAiKioqIFRoZSB0ZXN0IHByb2dyYW0gZmFpbGVkIHRvIGNvbXBpbGUgb3IgbGluay4gU2VlIHRoZSBmaWxlIGNvbmZpZy5sb2cgZm9yIHRoZSIKKyAgICAgICAgICBlY2hvICIqKiogZXhhY3QgZXJyb3IgdGhhdCBvY2N1cmVkLiBUaGlzIHVzdWFsbHkgbWVhbnMgR1RLIHdhcyBpbmNvcnJlY3RseSBpbnN0YWxsZWQiCisgICAgICAgICAgZWNobyAiKioqIG9yIHRoYXQgeW91IGhhdmUgbW92ZWQgR1RLIHNpbmNlIGl0IHdhcyBpbnN0YWxsZWQuIEluIHRoZSBsYXR0ZXIgY2FzZSwgeW91IgorICAgICAgICAgIGVjaG8gIioqKiBtYXkgd2FudCB0byBlZGl0IHRoZSBndGstY29uZmlnIHNjcmlwdDogJEdUS19DT05GSUciIF0pCisgICAgICAgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisgICAgICAgICAgTElCUz0iJGFjX3NhdmVfTElCUyIKKyAgICAgICBmaQorICAgICBmaQorICAgICBHVEtfQ0ZMQUdTPSIiCisgICAgIEdUS19MSUJTPSIiCisgICAgIGlmZWxzZShbJDNdLCAsIDosIFskM10pCisgIGZpCisgIEFDX1NVQlNUKEdUS19DRkxBR1MpCisgIEFDX1NVQlNUKEdUS19MSUJTKQorICBybSAtZiBjb25mLmd0a3Rlc3QKK10pCmRpZmYgLS1naXQgYS9tNC9saWJmYW1lLm00IGIvbTQvbGliZmFtZS5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTcwNTg0Ci0tLSAvZGV2L251bGwKKysrIGIvbTQvbGliZmFtZS5tNApAQCAtMCwwICsxLDE4MiBAQAorZG5sIEFNX1BBVEhfTElCRkFNRShbTUlOSU1VTS1WRVJTSU9OLCBbQUNUSU9OLUlGLUZPVU5EIFssIEFDVElPTi1JRi1OT1QtRk9VTkQgWywgTU9EVUxFU11dXV0pCitkbmwgVGVzdCBmb3IgbGliZmFtZSwgYW5kIGRlZmluZSBMSUJGQU1FX0NGTEFHUyBhbmQgTElCRkFNRV9MSUJTCitkbmwgVml2aWVuIENoYXBwZWxpZXIgMTIvMTEvMDAKK2RubCBzdG9sZW4gZnJvbSBPUkJpdCBhdXRvY29uZgorZG5sCitBQ19ERUZVTihbQU1fUEFUSF9MSUJGQU1FXSwKK1tkbmwgCitkbmwgR2V0IHRoZSBjZmxhZ3MgYW5kIGxpYnJhcmllcyBmcm9tIHRoZSBsaWJmYW1lLWNvbmZpZyBzY3JpcHQKK2RubAorQUNfQVJHX1dJVEgobGliZmFtZS1wcmVmaXgsWyAgLS13aXRoLWxpYmZhbWUtcHJlZml4PVBGWCAgIFByZWZpeCB3aGVyZSBsaWJmYW1lIGlzIGluc3RhbGxlZCAob3B0aW9uYWwpXSwKKyAgICAgICAgICAgIGxpYmZhbWVfY29uZmlnX3ByZWZpeD0iJHdpdGh2YWwiLCBsaWJmYW1lX2NvbmZpZ19wcmVmaXg9IiIpCitBQ19BUkdfV0lUSChsaWJmYW1lLWV4ZWMtcHJlZml4LFsgIC0td2l0aC1saWJmYW1lLWV4ZWMtcHJlZml4PVBGWCBFeGVjIHByZWZpeCB3aGVyZSBsaWJmYW1lIGlzIGluc3RhbGxlZCAob3B0aW9uYWwpXSwKKyAgICAgICAgICAgIGxpYmZhbWVfY29uZmlnX2V4ZWNfcHJlZml4PSIkd2l0aHZhbCIsIGxpYmZhbWVfY29uZmlnX2V4ZWNfcHJlZml4PSIiKQorQUNfQVJHX0VOQUJMRShsaWJmYW1ldGVzdCwgWyAgLS1kaXNhYmxlLWxpYmZhbWV0ZXN0ICAgICAgIERvIG5vdCB0cnkgdG8gY29tcGlsZSBhbmQgcnVuIGEgdGVzdCBsaWJmYW1lIHByb2dyYW1dLAorCQkgICAgLCBlbmFibGVfbGliZmFtZXRlc3Q9eWVzKQorCisgIGlmIHRlc3QgeCRsaWJmYW1lX2NvbmZpZ19leGVjX3ByZWZpeCAhPSB4IDsgdGhlbgorICAgICBsaWJmYW1lX2NvbmZpZ19hcmdzPSIkbGliZmFtZV9jb25maWdfYXJncyAtLWV4ZWMtcHJlZml4PSRsaWJmYW1lX2NvbmZpZ19leGVjX3ByZWZpeCIKKyAgICAgaWYgdGVzdCB4JHtMSUJGQU1FX0NPTkZJRytzZXR9ICE9IHhzZXQgOyB0aGVuCisgICAgICAgIExJQkZBTUVfQ09ORklHPSRsaWJmYW1lX2NvbmZpZ19leGVjX3ByZWZpeC9iaW4vbGliZmFtZS1jb25maWcKKyAgICAgZmkKKyAgZmkKKyAgaWYgdGVzdCB4JGxpYmZhbWVfY29uZmlnX3ByZWZpeCAhPSB4IDsgdGhlbgorICAgICBsaWJmYW1lX2NvbmZpZ19hcmdzPSIkbGliZmFtZV9jb25maWdfYXJncyAtLXByZWZpeD0kbGliZmFtZV9jb25maWdfcHJlZml4IgorICAgICBpZiB0ZXN0IHgke0xJQkZBTUVfQ09ORklHK3NldH0gIT0geHNldCA7IHRoZW4KKyAgICAgICAgTElCRkFNRV9DT05GSUc9JGxpYmZhbWVfY29uZmlnX3ByZWZpeC9iaW4vbGliZmFtZS1jb25maWcKKyAgICAgZmkKKyAgZmkKKworICBBQ19QQVRIX1BST0coTElCRkFNRV9DT05GSUcsIGxpYmZhbWUtY29uZmlnLCBubykKKyAgbWluX2xpYmZhbWVfdmVyc2lvbj1pZmVsc2UoWyQxXSwgLCAwLjkuMCwgJDEpCisgIEFDX01TR19DSEVDS0lORyhmb3IgbGliZmFtZSAtIHZlcnNpb24gPj0gJG1pbl9saWJmYW1lX3ZlcnNpb24pCisgIG5vX2xpYmZhbWU9IiIKKyAgaWYgdGVzdCAiJExJQkZBTUVfQ09ORklHIiA9ICJubyIgOyB0aGVuCisgICAgbm9fbGliZmFtZT15ZXMKKyAgZWxzZQorICAgIExJQkZBTUVfQ0ZMQUdTPWAkTElCRkFNRV9DT05GSUcgJGxpYmZhbWVfY29uZmlnX2FyZ3MgLS1jZmxhZ3NgCisgICAgTElCRkFNRV9MSUJTPWAkTElCRkFNRV9DT05GSUcgJGxpYmZhbWVfY29uZmlnX2FyZ3MgLS1saWJzYAorICAgIGxpYmZhbWVfY29uZmlnX21ham9yX3ZlcnNpb249YCRMSUJGQU1FX0NPTkZJRyAkbGliZmFtZV9jb25maWdfYXJncyAtLXZlcnNpb24gfCBcCisJICAgc2VkIC1lICdzLFtbXjAtOS5dXSwsZycgLWUgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDEvJ2AKKyAgICBsaWJmYW1lX2NvbmZpZ19taW5vcl92ZXJzaW9uPWAkTElCRkFNRV9DT05GSUcgJGxpYmZhbWVfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorCSAgIHNlZCAtZSAncyxbW14wLTkuXV0sLGcnIC1lICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wyLydgCisgICAgbGliZmFtZV9jb25maWdfbWljcm9fdmVyc2lvbj1gJExJQkZBTUVfQ09ORklHICRsaWJmYW1lX2NvbmZpZ19hcmdzIC0tdmVyc2lvbiB8IFwKKwkgICBzZWQgLWUgJ3MsW1teMC05Ll1dLCxnJyAtZSAncy9cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS9cMy8nYAorICAgIGlmIHRlc3QgIngkZW5hYmxlX2xpYmZhbWV0ZXN0IiA9ICJ4eWVzIiA7IHRoZW4KKyAgICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgIENGTEFHUz0iJENGTEFHUyAkTElCRkFNRV9DRkxBR1MiCisgICAgICBMSUJTPSIkTElCRkFNRV9MSUJTICRMSUJTIgorZG5sCitkbmwgTm93IGNoZWNrIGlmIHRoZSBpbnN0YWxsZWQgTElCRkFNRSBpcyBzdWZmaWNpZW50bHkgbmV3LiAoQWxzbyBzYW5pdHkKK2RubCBjaGVja3MgdGhlIHJlc3VsdHMgb2YgbGliZmFtZS1jb25maWcgdG8gc29tZSBleHRlbnQKK2RubAorICAgICAgcm0gLWYgY29uZi5saWJmYW1ldGVzdAorICAgICAgQUNfVFJZX1JVTihbCisjaW5jbHVkZSA8ZmFtZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2ludCAKK21haW4gKCkKK3sKKyAgaW50IG1ham9yLCBtaW5vciwgbWljcm87CisgIGNoYXIgKnRtcF92ZXJzaW9uOworCisgIHN5c3RlbSAoInRvdWNoIGNvbmYubGliZmFtZXRlc3QiKTsKKworICAvKiBIUC9VWCA5ICglQCMhKSB3cml0ZXMgdG8gc3NjYW5mIHN0cmluZ3MgKi8KKyAgdG1wX3ZlcnNpb24gPSBzdHJkdXAoIiRtaW5fbGliZmFtZV92ZXJzaW9uIik7CisgIGlmIChzc2NhbmYodG1wX3ZlcnNpb24sICIlZC4lZC4lZCIsICZtYWpvciwgJm1pbm9yLCAmbWljcm8pICE9IDMpIHsKKyAgICAgcHJpbnRmKCIlcywgYmFkIHZlcnNpb24gc3RyaW5nXG4iLCAiJG1pbl9saWJmYW1lX3ZlcnNpb24iKTsKKyAgICAgZXhpdCgxKTsKKyAgIH0KKworICBpZiAoKGxpYmZhbWVfbWFqb3JfdmVyc2lvbiAhPSAkbGliZmFtZV9jb25maWdfbWFqb3JfdmVyc2lvbikgfHwKKyAgICAgIChsaWJmYW1lX21pbm9yX3ZlcnNpb24gIT0gJGxpYmZhbWVfY29uZmlnX21pbm9yX3ZlcnNpb24pIHx8CisgICAgICAobGliZmFtZV9taWNyb192ZXJzaW9uICE9ICRsaWJmYW1lX2NvbmZpZ19taWNyb192ZXJzaW9uKSkKKyAgICB7CisgICAgICBwcmludGYoIlxuKioqICdsaWJmYW1lLWNvbmZpZyAtLXZlcnNpb24nIHJldHVybmVkICVkLiVkLiVkLCBidXQgTGliZmFtZSAoJWQuJWQuJWQpXG4iLCAKKyAgICAgICAgICAgICAkbGliZmFtZV9jb25maWdfbWFqb3JfdmVyc2lvbiwgJGxpYmZhbWVfY29uZmlnX21pbm9yX3ZlcnNpb24sICRsaWJmYW1lX2NvbmZpZ19taWNyb192ZXJzaW9uLAorICAgICAgICAgICAgIGxpYmZhbWVfbWFqb3JfdmVyc2lvbiwgbGliZmFtZV9taW5vcl92ZXJzaW9uLCBsaWJmYW1lX21pY3JvX3ZlcnNpb24pOworICAgICAgcHJpbnRmICgiKioqIHdhcyBmb3VuZCEgSWYgbGliZmFtZS1jb25maWcgd2FzIGNvcnJlY3QsIHRoZW4gaXQgaXMgYmVzdFxuIik7CisgICAgICBwcmludGYgKCIqKiogdG8gcmVtb3ZlIHRoZSBvbGQgdmVyc2lvbiBvZiBsaWJmYW1lLiBZb3UgbWF5IGFsc28gYmUgYWJsZSB0byBmaXggdGhlIGVycm9yXG4iKTsKKyAgICAgIHByaW50ZigiKioqIGJ5IG1vZGlmeWluZyB5b3VyIExEX0xJQlJBUllfUEFUSCBlbnZpcm9tZW50IHZhcmlhYmxlLCBvciBieSBlZGl0aW5nXG4iKTsKKyAgICAgIHByaW50ZigiKioqIC9ldGMvbGQuc28uY29uZi4gTWFrZSBzdXJlIHlvdSBoYXZlIHJ1biBsZGNvbmZpZyBpZiB0aGF0IGlzXG4iKTsKKyAgICAgIHByaW50ZigiKioqIHJlcXVpcmVkIG9uIHlvdXIgc3lzdGVtLlxuIik7CisgICAgICBwcmludGYoIioqKiBJZiBsaWJmYW1lLWNvbmZpZyB3YXMgd3JvbmcsIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTElCRkFNRV9DT05GSUdcbiIpOworICAgICAgcHJpbnRmKCIqKiogdG8gcG9pbnQgdG8gdGhlIGNvcnJlY3QgY29weSBvZiBsaWJmYW1lLWNvbmZpZywgYW5kIHJlbW92ZSB0aGUgZmlsZSBjb25maWcuY2FjaGVcbiIpOworICAgICAgcHJpbnRmKCIqKiogYmVmb3JlIHJlLXJ1bm5pbmcgY29uZmlndXJlXG4iKTsKKyAgICB9IAorI2lmIGRlZmluZWQgKExJQkZBTUVfTUFKT1JfVkVSU0lPTikgJiYgZGVmaW5lZCAoTElCRkFNRV9NSU5PUl9WRVJTSU9OKSAmJiBkZWZpbmVkIChMSUJGQU1FX01JQ1JPX1ZFUlNJT04pCisgIGVsc2UgaWYgKChsaWJmYW1lX21ham9yX3ZlcnNpb24gIT0gTElCRkFNRV9NQUpPUl9WRVJTSU9OKSB8fAorCSAgIChsaWJmYW1lX21pbm9yX3ZlcnNpb24gIT0gTElCRkFNRV9NSU5PUl9WRVJTSU9OKSB8fAorICAgICAgICAgICAobGliZmFtZV9taWNyb192ZXJzaW9uICE9IExJQkZBTUVfTUlDUk9fVkVSU0lPTikpCisgICAgeworICAgICAgcHJpbnRmKCIqKiogbGliZmFtZSBoZWFkZXIgZmlsZXMgKHZlcnNpb24gJWQuJWQuJWQpIGRvIG5vdCBtYXRjaFxuIiwKKwkgICAgIExJQkZBTUVfTUFKT1JfVkVSU0lPTiwgTElCRkFNRV9NSU5PUl9WRVJTSU9OLCBMSUJGQU1FX01JQ1JPX1ZFUlNJT04pOworICAgICAgcHJpbnRmKCIqKiogbGlicmFyeSAodmVyc2lvbiAlZC4lZC4lZClcbiIsCisJICAgICBsaWJmYW1lX21ham9yX3ZlcnNpb24sIGxpYmZhbWVfbWlub3JfdmVyc2lvbiwgbGliZmFtZV9taWNyb192ZXJzaW9uKTsKKyAgICB9CisjZW5kaWYgLyogZGVmaW5lZCAoTElCRkFNRV9NQUpPUl9WRVJTSU9OKSAuLi4gKi8KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICgobGliZmFtZV9tYWpvcl92ZXJzaW9uID4gbWFqb3IpIHx8CisgICAgICAgICgobGliZmFtZV9tYWpvcl92ZXJzaW9uID09IG1ham9yKSAmJiAobGliZmFtZV9taW5vcl92ZXJzaW9uID4gbWlub3IpKSB8fAorICAgICAgICAoKGxpYmZhbWVfbWFqb3JfdmVyc2lvbiA9PSBtYWpvcikgJiYgKGxpYmZhbWVfbWlub3JfdmVyc2lvbiA9PSBtaW5vcikgJiYgKGxpYmZhbWVfbWljcm9fdmVyc2lvbiA+PSBtaWNybykpKQorICAgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgICB9CisgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcHJpbnRmKCJcbioqKiBBbiBvbGQgdmVyc2lvbiBvZiBsaWJmYW1lICglZC4lZC4lZCkgd2FzIGZvdW5kLlxuIiwKKyAgICAgICAgICAgICAgIGxpYmZhbWVfbWFqb3JfdmVyc2lvbiwgbGliZmFtZV9taW5vcl92ZXJzaW9uLCBsaWJmYW1lX21pY3JvX3ZlcnNpb24pOworICAgICAgICBwcmludGYoIioqKiBZb3UgbmVlZCBhIHZlcnNpb24gb2YgbGliZmFtZSBuZXdlciB0aGFuICVkLiVkLiVkLiBUaGUgbGF0ZXN0IHZlcnNpb24gb2ZcbiIsCisJICAgICAgIG1ham9yLCBtaW5vciwgbWljcm8pOworICAgICAgICBwcmludGYoIioqKiBsaWJmYW1lIGlzIGFsd2F5cyBhdmFpbGFibGUgZnJvbSBodHRwOi8vd3d3LWVsZXZlcy5lbnN0LWJyZXRhZ25lLmZyL35jaGFwcGVsaS9mYW1lXG4iKTsKKyAgICAgICAgcHJpbnRmKCIqKipcbiIpOworICAgICAgICBwcmludGYoIioqKiBJZiB5b3UgaGF2ZSBhbHJlYWR5IGluc3RhbGxlZCBhIHN1ZmZpY2llbnRseSBuZXcgdmVyc2lvbiwgdGhpcyBlcnJvclxuIik7CisgICAgICAgIHByaW50ZigiKioqIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHdyb25nIGNvcHkgb2YgdGhlIGxpYmZhbWUtY29uZmlnIHNoZWxsIHNjcmlwdCBpc1xuIik7CisgICAgICAgIHByaW50ZigiKioqIGJlaW5nIGZvdW5kLiBUaGUgZWFzaWVzdCB3YXkgdG8gZml4IHRoaXMgaXMgdG8gcmVtb3ZlIHRoZSBvbGQgdmVyc2lvblxuIik7CisgICAgICAgIHByaW50ZigiKioqIG9mIGxpYmZhbWUsIGJ1dCB5b3UgY2FuIGFsc28gc2V0IHRoZSBMSUJGQU1FX0NPTkZJRyBlbnZpcm9ubWVudCB0byBwb2ludCB0byB0aGVcbiIpOworICAgICAgICBwcmludGYoIioqKiBjb3JyZWN0IGNvcHkgb2YgbGliZmFtZS1jb25maWcuIChJbiB0aGlzIGNhc2UsIHlvdSB3aWxsIGhhdmUgdG9cbiIpOworICAgICAgICBwcmludGYoIioqKiBtb2RpZnkgeW91ciBMRF9MSUJSQVJZX1BBVEggZW52aXJvbWVudCB2YXJpYWJsZSwgb3IgZWRpdCAvZXRjL2xkLnNvLmNvbmZcbiIpOworICAgICAgICBwcmludGYoIioqKiBzbyB0aGF0IHRoZSBjb3JyZWN0IGxpYnJhcmllcyBhcmUgZm91bmQgYXQgcnVuLXRpbWUpKVxuIik7CisgICAgICB9CisgICAgfQorICByZXR1cm4gMTsKK30KK10sLCBub19saWJmYW1lPXllcyxbZWNobyAkYWNfbiAiY3Jvc3MgY29tcGlsaW5nOyBhc3N1bWVkIE9LLi4uICRhY19jIl0pCisgICAgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisgICAgICAgTElCUz0iJGFjX3NhdmVfTElCUyIKKyAgICAgZmkKKyAgZmkKKyAgaWYgdGVzdCAieCRub19saWJmYW1lIiA9IHggOyB0aGVuCisgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKSAgICAgCisgIGVsc2UKKyAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgaWYgdGVzdCAiJExJQkZBTUVfQ09ORklHIiA9ICJubyIgOyB0aGVuCisgICAgICAgZWNobyAiKioqIFRoZSBsaWJmYW1lLWNvbmZpZyBzY3JpcHQgaW5zdGFsbGVkIGJ5IGxpYmZhbWUgY291bGQgbm90IGJlIGZvdW5kIgorICAgICAgIGVjaG8gIioqKiBJZiBsaWJmYW1lIHdhcyBpbnN0YWxsZWQgaW4gUFJFRklYLCBtYWtlIHN1cmUgUFJFRklYL2JpbiBpcyBpbiIKKyAgICAgICBlY2hvICIqKiogeW91ciBwYXRoLCBvciBzZXQgdGhlIExJQkZBTUVfQ09ORklHIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSIKKyAgICAgICBlY2hvICIqKiogZnVsbCBwYXRoIHRvIGxpYmZhbWUtY29uZmlnLiIKKyAgICAgZWxzZQorICAgICAgIGlmIHRlc3QgLWYgY29uZi5saWJmYW1ldGVzdCA7IHRoZW4KKyAgICAgICAgOgorICAgICAgIGVsc2UKKyAgICAgICAgICBlY2hvICIqKiogQ291bGQgbm90IHJ1biBsaWJmYW1lIHRlc3QgcHJvZ3JhbSwgY2hlY2tpbmcgd2h5Li4uIgorICAgICAgICAgIENGTEFHUz0iJENGTEFHUyAkTElCRkFNRV9DRkxBR1MiCisgICAgICAgICAgTElCUz0iJExJQlMgJExJQkZBTUVfTElCUyIKKyAgICAgICAgICBBQ19UUllfTElOSyhbCisjaW5jbHVkZSA8ZmFtZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CitdLCAgICAgIFsgcmV0dXJuICgobGliZmFtZV9tYWpvcl92ZXJzaW9uKSB8fCAobGliZmFtZV9taW5vcl92ZXJzaW9uKSB8fCAobGliZmFtZV9taWNyb192ZXJzaW9uKSk7IF0sCisgICAgICAgIFsgZWNobyAiKioqIFRoZSB0ZXN0IHByb2dyYW0gY29tcGlsZWQsIGJ1dCBkaWQgbm90IHJ1bi4gVGhpcyB1c3VhbGx5IG1lYW5zIgorICAgICAgICAgIGVjaG8gIioqKiB0aGF0IHRoZSBydW4tdGltZSBsaW5rZXIgaXMgbm90IGZpbmRpbmcgbGliZmFtZSBvciBmaW5kaW5nIHRoZSB3cm9uZyIKKyAgICAgICAgICBlY2hvICIqKiogdmVyc2lvbiBvZiBMSUJGQU1FLiBJZiBpdCBpcyBub3QgZmluZGluZyBsaWJmYW1lLCB5b3UnbGwgbmVlZCB0byBzZXQgeW91ciIKKyAgICAgICAgICBlY2hvICIqKiogTERfTElCUkFSWV9QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBvciBlZGl0IC9ldGMvbGQuc28uY29uZiB0byBwb2ludCIKKyAgICAgICAgICBlY2hvICIqKiogdG8gdGhlIGluc3RhbGxlZCBsb2NhdGlvbiAgQWxzbywgbWFrZSBzdXJlIHlvdSBoYXZlIHJ1biBsZGNvbmZpZyBpZiB0aGF0IgorICAgICAgICAgIGVjaG8gIioqKiBpcyByZXF1aXJlZCBvbiB5b3VyIHN5c3RlbSIKKwkgIGVjaG8gIioqKiIKKyAgICAgICAgICBlY2hvICIqKiogSWYgeW91IGhhdmUgYW4gb2xkIHZlcnNpb24gaW5zdGFsbGVkLCBpdCBpcyBiZXN0IHRvIHJlbW92ZSBpdCwgYWx0aG91Z2giCisgICAgICAgICAgZWNobyAiKioqIHlvdSBtYXkgYWxzbyBiZSBhYmxlIHRvIGdldCB0aGluZ3MgdG8gd29yayBieSBtb2RpZnlpbmcgTERfTElCUkFSWV9QQVRIIgorICAgICAgICAgIGVjaG8gIioqKiIgXSwKKyAgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBmYWlsZWQgdG8gY29tcGlsZSBvciBsaW5rLiBTZWUgdGhlIGZpbGUgY29uZmlnLmxvZyBmb3IgdGhlIgorICAgICAgICAgIGVjaG8gIioqKiBleGFjdCBlcnJvciB0aGF0IG9jY3VyZWQuIFRoaXMgdXN1YWxseSBtZWFucyBsaWJmYW1lIHdhcyBpbmNvcnJlY3RseSBpbnN0YWxsZWQiCisgICAgICAgICAgZWNobyAiKioqIG9yIHRoYXQgeW91IGhhdmUgbW92ZWQgbGliZmFtZSBzaW5jZSBpdCB3YXMgaW5zdGFsbGVkLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHlvdSIKKyAgICAgICAgICBlY2hvICIqKiogbWF5IHdhbnQgdG8gZWRpdCB0aGUgbGliZmFtZS1jb25maWcgc2NyaXB0OiAkTElCRkFNRV9DT05GSUciIF0pCisgICAgICAgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisgICAgICAgICAgTElCUz0iJGFjX3NhdmVfTElCUyIKKyAgICAgICBmaQorICAgICBmaQorICAgICBMSUJGQU1FX0NGTEFHUz0iIgorICAgICBMSUJGQU1FX0xJQlM9IiIKKyAgICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkKKyAgZmkKKworICBBQ19TVUJTVChMSUJGQU1FX0NGTEFHUykKKyAgQUNfU1VCU1QoTElCRkFNRV9MSUJTKQorICBybSAtZiBjb25mLmxpYmZhbWV0ZXN0CitdKQpkaWZmIC0tZ2l0IGEvbTQvb2dnLm00IGIvbTQvb2dnLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMWYxYWIKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9vZ2cubTQKQEAgLTAsMCArMSwxMDIgQEAKKyMgQ29uZmlndXJlIHBhdGhzIGZvciBsaWJvZ2cKKyMgSmFjayBNb2ZmaXR0IDxqYWNrQGljZWNhc3Qub3JnPiAxMC0yMS0yMDAwCisjIFNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIE93ZW4gVGF5bG9yIGFuZCBNYW5pc2ggU2luZ2gKKworZG5sIFhJUEhfUEFUSF9PR0coW0FDVElPTi1JRi1GT1VORCBbLCBBQ1RJT04tSUYtTk9ULUZPVU5EXV0pCitkbmwgVGVzdCBmb3IgbGlib2dnLCBhbmQgZGVmaW5lIE9HR19DRkxBR1MgYW5kIE9HR19MSUJTCitkbmwKK0FDX0RFRlVOKFtYSVBIX1BBVEhfT0dHXSwKK1tkbmwgCitkbmwgR2V0IHRoZSBjZmxhZ3MgYW5kIGxpYnJhcmllcworZG5sCitBQ19BUkdfV0lUSChvZ2csWyAgLS13aXRoLW9nZz1QRlggICBQcmVmaXggd2hlcmUgbGlib2dnIGlzIGluc3RhbGxlZCAob3B0aW9uYWwpXSwgb2dnX3ByZWZpeD0iJHdpdGh2YWwiLCBvZ2dfcHJlZml4PSIiKQorQUNfQVJHX1dJVEgob2dnLWxpYnJhcmllcyxbICAtLXdpdGgtb2dnLWxpYnJhcmllcz1ESVIgICBEaXJlY3Rvcnkgd2hlcmUgbGlib2dnIGxpYnJhcnkgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldLCBvZ2dfbGlicmFyaWVzPSIkd2l0aHZhbCIsIG9nZ19saWJyYXJpZXM9IiIpCitBQ19BUkdfV0lUSChvZ2ctaW5jbHVkZXMsWyAgLS13aXRoLW9nZy1pbmNsdWRlcz1ESVIgICBEaXJlY3Rvcnkgd2hlcmUgbGlib2dnIGhlYWRlciBmaWxlcyBhcmUgaW5zdGFsbGVkIChvcHRpb25hbCldLCBvZ2dfaW5jbHVkZXM9IiR3aXRodmFsIiwgb2dnX2luY2x1ZGVzPSIiKQorQUNfQVJHX0VOQUJMRShvZ2d0ZXN0LCBbICAtLWRpc2FibGUtb2dndGVzdCAgICAgICBEbyBub3QgdHJ5IHRvIGNvbXBpbGUgYW5kIHJ1biBhIHRlc3QgT2dnIHByb2dyYW1dLCwgZW5hYmxlX29nZ3Rlc3Q9eWVzKQorCisgIGlmIHRlc3QgIngkb2dnX2xpYnJhcmllcyIgIT0gIngiIDsgdGhlbgorICAgIE9HR19MSUJTPSItTCRvZ2dfbGlicmFyaWVzIgorICBlbGlmIHRlc3QgIngkb2dnX3ByZWZpeCIgIT0gIngiIDsgdGhlbgorICAgIE9HR19MSUJTPSItTCRvZ2dfcHJlZml4L2xpYiIKKyAgZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0gInhOT05FIiA7IHRoZW4KKyAgICBPR0dfTElCUz0iLUwkcHJlZml4L2xpYiIKKyAgZmkKKworICBPR0dfTElCUz0iJE9HR19MSUJTIC1sb2dnIgorCisgIGlmIHRlc3QgIngkb2dnX2luY2x1ZGVzIiAhPSAieCIgOyB0aGVuCisgICAgT0dHX0NGTEFHUz0iLUkkb2dnX2luY2x1ZGVzIgorICBlbGlmIHRlc3QgIngkb2dnX3ByZWZpeCIgIT0gIngiIDsgdGhlbgorICAgIE9HR19DRkxBR1M9Ii1JJG9nZ19wcmVmaXgvaW5jbHVkZSIKKyAgZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0gInhOT05FIjsgdGhlbgorICAgIE9HR19DRkxBR1M9Ii1JJHByZWZpeC9pbmNsdWRlIgorICBmaQorCisgIEFDX01TR19DSEVDS0lORyhmb3IgT2dnKQorICBub19vZ2c9IiIKKworCisgIGlmIHRlc3QgIngkZW5hYmxlX29nZ3Rlc3QiID0gInh5ZXMiIDsgdGhlbgorICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgIGFjX3NhdmVfTElCUz0iJExJQlMiCisgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRPR0dfQ0ZMQUdTIgorICAgIExJQlM9IiRMSUJTICRPR0dfTElCUyIKK2RubAorZG5sIE5vdyBjaGVjayBpZiB0aGUgaW5zdGFsbGVkIE9nZyBpcyBzdWZmaWNpZW50bHkgbmV3LgorZG5sCisgICAgICBybSAtZiBjb25mLm9nZ3Rlc3QKKyAgICAgIEFDX1RSWV9SVU4oWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8b2dnL29nZy5oPgorCitpbnQgbWFpbiAoKQoreworICBzeXN0ZW0oInRvdWNoIGNvbmYub2dndGVzdCIpOworICByZXR1cm4gMDsKK30KKworXSwsIG5vX29nZz15ZXMsW2VjaG8gJGFjX24gImNyb3NzIGNvbXBpbGluZzsgYXNzdW1lZCBPSy4uLiAkYWNfYyJdKQorICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgIGZpCisKKyAgaWYgdGVzdCAieCRub19vZ2ciID0gIngiIDsgdGhlbgorICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICAgaWZlbHNlKFskMV0sICwgOiwgWyQxXSkgICAgIAorICBlbHNlCisgICAgIEFDX01TR19SRVNVTFQobm8pCisgICAgIGlmIHRlc3QgLWYgY29uZi5vZ2d0ZXN0IDsgdGhlbgorICAgICAgIDoKKyAgICAgZWxzZQorICAgICAgIGVjaG8gIioqKiBDb3VsZCBub3QgcnVuIE9nZyB0ZXN0IHByb2dyYW0sIGNoZWNraW5nIHdoeS4uLiIKKyAgICAgICBDRkxBR1M9IiRDRkxBR1MgJE9HR19DRkxBR1MiCisgICAgICAgTElCUz0iJExJQlMgJE9HR19MSUJTIgorICAgICAgIEFDX1RSWV9MSU5LKFsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9nZy9vZ2cuaD4KK10sICAgICBbIHJldHVybiAwOyBdLAorICAgICAgIFsgZWNobyAiKioqIFRoZSB0ZXN0IHByb2dyYW0gY29tcGlsZWQsIGJ1dCBkaWQgbm90IHJ1bi4gVGhpcyB1c3VhbGx5IG1lYW5zIgorICAgICAgIGVjaG8gIioqKiB0aGF0IHRoZSBydW4tdGltZSBsaW5rZXIgaXMgbm90IGZpbmRpbmcgT2dnIG9yIGZpbmRpbmcgdGhlIHdyb25nIgorICAgICAgIGVjaG8gIioqKiB2ZXJzaW9uIG9mIE9nZy4gSWYgaXQgaXMgbm90IGZpbmRpbmcgT2dnLCB5b3UnbGwgbmVlZCB0byBzZXQgeW91ciIKKyAgICAgICBlY2hvICIqKiogTERfTElCUkFSWV9QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBvciBlZGl0IC9ldGMvbGQuc28uY29uZiB0byBwb2ludCIKKyAgICAgICBlY2hvICIqKiogdG8gdGhlIGluc3RhbGxlZCBsb2NhdGlvbiAgQWxzbywgbWFrZSBzdXJlIHlvdSBoYXZlIHJ1biBsZGNvbmZpZyBpZiB0aGF0IgorICAgICAgIGVjaG8gIioqKiBpcyByZXF1aXJlZCBvbiB5b3VyIHN5c3RlbSIKKyAgICAgICBlY2hvICIqKioiCisgICAgICAgZWNobyAiKioqIElmIHlvdSBoYXZlIGFuIG9sZCB2ZXJzaW9uIGluc3RhbGxlZCwgaXQgaXMgYmVzdCB0byByZW1vdmUgaXQsIGFsdGhvdWdoIgorICAgICAgIGVjaG8gIioqKiB5b3UgbWF5IGFsc28gYmUgYWJsZSB0byBnZXQgdGhpbmdzIHRvIHdvcmsgYnkgbW9kaWZ5aW5nIExEX0xJQlJBUllfUEFUSCJdLAorICAgICAgIFsgZWNobyAiKioqIFRoZSB0ZXN0IHByb2dyYW0gZmFpbGVkIHRvIGNvbXBpbGUgb3IgbGluay4gU2VlIHRoZSBmaWxlIGNvbmZpZy5sb2cgZm9yIHRoZSIKKyAgICAgICBlY2hvICIqKiogZXhhY3QgZXJyb3IgdGhhdCBvY2N1cmVkLiBUaGlzIHVzdWFsbHkgbWVhbnMgT2dnIHdhcyBpbmNvcnJlY3RseSBpbnN0YWxsZWQiCisgICAgICAgZWNobyAiKioqIG9yIHRoYXQgeW91IGhhdmUgbW92ZWQgT2dnIHNpbmNlIGl0IHdhcyBpbnN0YWxsZWQuIiBdKQorICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgICAgIGZpCisgICAgIE9HR19DRkxBR1M9IiIKKyAgICAgT0dHX0xJQlM9IiIKKyAgICAgaWZlbHNlKFskMl0sICwgOiwgWyQyXSkKKyAgZmkKKyAgQUNfU1VCU1QoT0dHX0NGTEFHUykKKyAgQUNfU1VCU1QoT0dHX0xJQlMpCisgIHJtIC1mIGNvbmYub2dndGVzdAorXSkKZGlmZiAtLWdpdCBhL200L3ZvcmJpcy5tNCBiL200L3ZvcmJpcy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTI4ODkzCi0tLSAvZGV2L251bGwKKysrIGIvbTQvdm9yYmlzLm00CkBAIC0wLDAgKzEsMTI4IEBACisjIENvbmZpZ3VyZSBwYXRocyBmb3IgbGlidm9yYmlzCisjIEphY2sgTW9mZml0dCA8amFja0BpY2VjYXN0Lm9yZz4gMTAtMjEtMjAwMAorIyBTaGFtZWxlc3NseSBzdG9sZW4gZnJvbSBPd2VuIFRheWxvciBhbmQgTWFuaXNoIFNpbmdoCisjIHRob21hc3ZzIGFkZGVkIGNoZWNrIGZvciB2b3JiaXNfYml0cmF0ZV9hZGRibG9jayB3aGljaCBpcyBuZXcgaW4gcmMzCisjIHRob21hc3ZzIGFkZGVkIGNoZWNrIGZvciBPVl9FQ1RMX1JBVEVNQU5BR0VfU0VUIHdoaWNoIGlzIG5ldyBpbiAxLjAgZmluYWwKKworZG5sIFhJUEhfUEFUSF9WT1JCSVMoW0FDVElPTi1JRi1GT1VORCBbLCBBQ1RJT04tSUYtTk9ULUZPVU5EXV0pCitkbmwgVGVzdCBmb3IgbGlidm9yYmlzLCBhbmQgZGVmaW5lIFZPUkJJU19DRkxBR1MgYW5kIFZPUkJJU19MSUJTCitkbmwKK0FDX0RFRlVOKFtYSVBIX1BBVEhfVk9SQklTXSwKK1tkbmwgCitkbmwgR2V0IHRoZSBjZmxhZ3MgYW5kIGxpYnJhcmllcworZG5sCitBQ19BUkdfV0lUSCh2b3JiaXMsWyAgLS13aXRoLXZvcmJpcz1QRlggICBQcmVmaXggd2hlcmUgbGlidm9yYmlzIGlzIGluc3RhbGxlZCAob3B0aW9uYWwpXSwgdm9yYmlzX3ByZWZpeD0iJHdpdGh2YWwiLCB2b3JiaXNfcHJlZml4PSIiKQorQUNfQVJHX1dJVEgodm9yYmlzLWxpYnJhcmllcyxbICAtLXdpdGgtdm9yYmlzLWxpYnJhcmllcz1ESVIgICBEaXJlY3Rvcnkgd2hlcmUgbGlidm9yYmlzIGxpYnJhcnkgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldLCB2b3JiaXNfbGlicmFyaWVzPSIkd2l0aHZhbCIsIHZvcmJpc19saWJyYXJpZXM9IiIpCitBQ19BUkdfV0lUSCh2b3JiaXMtaW5jbHVkZXMsWyAgLS13aXRoLXZvcmJpcy1pbmNsdWRlcz1ESVIgICBEaXJlY3Rvcnkgd2hlcmUgbGlidm9yYmlzIGhlYWRlciBmaWxlcyBhcmUgaW5zdGFsbGVkIChvcHRpb25hbCldLCB2b3JiaXNfaW5jbHVkZXM9IiR3aXRodmFsIiwgdm9yYmlzX2luY2x1ZGVzPSIiKQorQUNfQVJHX0VOQUJMRSh2b3JiaXN0ZXN0LCBbICAtLWRpc2FibGUtdm9yYmlzdGVzdCAgICAgICBEbyBub3QgdHJ5IHRvIGNvbXBpbGUgYW5kIHJ1biBhIHRlc3QgVm9yYmlzIHByb2dyYW1dLCwgZW5hYmxlX3ZvcmJpc3Rlc3Q9eWVzKQorCisgIGlmIHRlc3QgIngkdm9yYmlzX2xpYnJhcmllcyIgIT0gIngiIDsgdGhlbgorICAgIFZPUkJJU19MSUJTPSItTCR2b3JiaXNfbGlicmFyaWVzIgorICBlbGlmIHRlc3QgIngkdm9yYmlzX3ByZWZpeCIgIT0gIngiIDsgdGhlbgorICAgIFZPUkJJU19MSUJTPSItTCR2b3JiaXNfcHJlZml4L2xpYiIKKyAgZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0gInhOT05FIjsgdGhlbgorICAgIFZPUkJJU19MSUJTPSItTCRwcmVmaXgvbGliIgorICBmaQorCisgIFZPUkJJU19MSUJTPSIkVk9SQklTX0xJQlMgLWx2b3JiaXMgLWxtIgorICBWT1JCSVNGSUxFX0xJQlM9Ii1sdm9yYmlzZmlsZSIKKyAgVk9SQklTRU5DX0xJQlM9Ii1sdm9yYmlzZW5jIgorCisgIGlmIHRlc3QgIngkdm9yYmlzX2luY2x1ZGVzIiAhPSAieCIgOyB0aGVuCisgICAgVk9SQklTX0NGTEFHUz0iLUkkdm9yYmlzX2luY2x1ZGVzIgorICBlbGlmIHRlc3QgIngkdm9yYmlzX3ByZWZpeCIgIT0gIngiIDsgdGhlbgorICAgIFZPUkJJU19DRkxBR1M9Ii1JJHZvcmJpc19wcmVmaXgvaW5jbHVkZSIKKyAgZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0gInhOT05FIjsgdGhlbgorICAgIFZPUkJJU19DRkxBR1M9Ii1JJHByZWZpeC9pbmNsdWRlIgorICBmaQorCisKKyAgQUNfTVNHX0NIRUNLSU5HKGZvciBWb3JiaXMpCisgIG5vX3ZvcmJpcz0iIgorCisKKyAgaWYgdGVzdCAieCRlbmFibGVfdm9yYmlzdGVzdCIgPSAieHllcyIgOyB0aGVuCisgICAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKyAgICBDRkxBR1M9IiRDRkxBR1MgJFZPUkJJU19DRkxBR1MgJE9HR19DRkxBR1MiCisgICAgTElCUz0iJExJQlMgJFZPUkJJU19MSUJTICRWT1JCSVNFTkNfTElCUyAkT0dHX0xJQlMiCitkbmwKK2RubCBOb3cgY2hlY2sgaWYgdGhlIGluc3RhbGxlZCBWb3JiaXMgaXMgc3VmZmljaWVudGx5IG5ldy4KK2RubAorICAgICAgcm0gLWYgY29uZi52b3JiaXN0ZXN0CisgICAgICBBQ19UUllfUlVOKFsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHZvcmJpcy9jb2RlYy5oPgorI2luY2x1ZGUgPHZvcmJpcy92b3JiaXNlbmMuaD4KKworaW50IG1haW4gKCkKK3sKKyAgICB2b3JiaXNfYmxvY2sgCXZiOworICAgIHZvcmJpc19kc3Bfc3RhdGUJdmQ7CisgICAgdm9yYmlzX2luZm8JCXZpOworCisgICAgdm9yYmlzX2luZm9faW5pdCAoJnZpKTsKKyAgICB2b3JiaXNfZW5jb2RlX2luaXQgKCZ2aSwgMiwgNDQxMDAsIC0xLCAxMjgwMDAsIC0xKTsKKyAgICB2b3JiaXNfYW5hbHlzaXNfaW5pdCAoJnZkLCAmdmkpOworICAgIHZvcmJpc19ibG9ja19pbml0ICgmdmQsICZ2Yik7CisgICAgLyogdGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgaW4gMS4wcmMzLCBzbyB0aGlzIGlzIHdoYXQgd2UncmUgdGVzdGluZyBmb3IgKi8KKyAgICB2b3JiaXNfYml0cmF0ZV9hZGRibG9jayAoJnZiKTsKKworICAgIC8qIHRoaXMgZGVmaW5lIHdhcyBhZGRlZCBpbiAxLjAgZmluYWwgKi8KKyNpZmRlZiBPVl9FQ1RMX1JBVEVNQU5BR0VfU0VUCisgICAgc3lzdGVtKCJ0b3VjaCBjb25mLnZvcmJpc3Rlc3QiKTsKKyAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgcmV0dXJuIC0xOworI2VuZGlmCit9CisKK10sLCBub192b3JiaXM9eWVzLFtlY2hvICRhY19uICJjcm9zcyBjb21waWxpbmc7IGFzc3VtZWQgT0suLi4gJGFjX2MiXSkKKyAgICAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKKyAgICAgICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorICBmaQorCisgIGlmIHRlc3QgIngkbm9fdm9yYmlzIiA9ICJ4IiA7IHRoZW4KKyAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgIGlmZWxzZShbJDFdLCAsIDosIFskMV0pICAgICAKKyAgZWxzZQorICAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgICBpZiB0ZXN0IC1mIGNvbmYudm9yYmlzdGVzdCA7IHRoZW4KKyAgICAgICA6CisgICAgIGVsc2UKKyAgICAgICBlY2hvICIqKiogQ291bGQgbm90IHJ1biBWb3JiaXMgdGVzdCBwcm9ncmFtLCBjaGVja2luZyB3aHkuLi4iCisgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRWT1JCSVNfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRMSUJTICRWT1JCSVNfTElCUyAkT0dHX0xJQlMiCisgICAgICAgQUNfVFJZX0xJTksoWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dm9yYmlzL2NvZGVjLmg+CitdLCAgICAgWyByZXR1cm4gMDsgXSwKKyAgICAgICBbIGVjaG8gIioqKiBUaGUgdGVzdCBwcm9ncmFtIGNvbXBpbGVkLCBidXQgZGlkIG5vdCBydW4uIFRoaXMgdXN1YWxseSBtZWFucyIKKyAgICAgICBlY2hvICIqKiogdGhhdCB0aGUgcnVuLXRpbWUgbGlua2VyIGlzIG5vdCBmaW5kaW5nIFZvcmJpcyBvciBmaW5kaW5nIHRoZSB3cm9uZyIKKyAgICAgICBlY2hvICIqKiogdmVyc2lvbiBvZiBWb3JiaXMuIElmIGl0IGlzIG5vdCBmaW5kaW5nIFZvcmJpcywgeW91J2xsIG5lZWQgdG8gc2V0IHlvdXIiCisgICAgICAgZWNobyAiKioqIExEX0xJQlJBUllfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgZWRpdCAvZXRjL2xkLnNvLmNvbmYgdG8gcG9pbnQiCisgICAgICAgZWNobyAiKioqIHRvIHRoZSBpbnN0YWxsZWQgbG9jYXRpb24gIEFsc28sIG1ha2Ugc3VyZSB5b3UgaGF2ZSBydW4gbGRjb25maWcgaWYgdGhhdCIKKyAgICAgICBlY2hvICIqKiogaXMgcmVxdWlyZWQgb24geW91ciBzeXN0ZW0iCisgICAgICAgZWNobyAiKioqIgorICAgICAgIGVjaG8gIioqKiBJZiB5b3UgaGF2ZSBhbiBvbGQgdmVyc2lvbiBpbnN0YWxsZWQsIGl0IGlzIGJlc3QgdG8gcmVtb3ZlIGl0LCBhbHRob3VnaCIKKyAgICAgICBlY2hvICIqKiogeW91IG1heSBhbHNvIGJlIGFibGUgdG8gZ2V0IHRoaW5ncyB0byB3b3JrIGJ5IG1vZGlmeWluZyBMRF9MSUJSQVJZX1BBVEgiXSwKKyAgICAgICBbIGVjaG8gIioqKiBUaGUgdGVzdCBwcm9ncmFtIGZhaWxlZCB0byBjb21waWxlIG9yIGxpbmsuIFNlZSB0aGUgZmlsZSBjb25maWcubG9nIGZvciB0aGUiCisgICAgICAgZWNobyAiKioqIGV4YWN0IGVycm9yIHRoYXQgb2NjdXJlZC4gVGhpcyB1c3VhbGx5IG1lYW5zIFZvcmJpcyB3YXMgaW5jb3JyZWN0bHkgaW5zdGFsbGVkIgorICAgICAgIGVjaG8gIioqKiBvciB0aGF0IHlvdSBoYXZlIG1vdmVkIFZvcmJpcyBzaW5jZSBpdCB3YXMgaW5zdGFsbGVkLiIgXSkKKyAgICAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKKyAgICAgICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorICAgICBmaQorICAgICBWT1JCSVNfQ0ZMQUdTPSIiCisgICAgIFZPUkJJU19MSUJTPSIiCisgICAgIFZPUkJJU0ZJTEVfTElCUz0iIgorICAgICBWT1JCSVNFTkNfTElCUz0iIgorICAgICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKQorICBmaQorICBBQ19TVUJTVChWT1JCSVNfQ0ZMQUdTKQorICBBQ19TVUJTVChWT1JCSVNfTElCUykKKyAgQUNfU1VCU1QoVk9SQklTRklMRV9MSUJTKQorICBBQ19TVUJTVChWT1JCSVNFTkNfTElCUykKKyAgcm0gLWYgY29uZi52b3JiaXN0ZXN0CitdKQpkaWZmIC0tZ2l0IGEvbWVzb24uYnVpbGQgYi9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTQ5ZWMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwzMzEgQEAKK3Byb2plY3QoJ2dzdC1wbHVnaW5zLWdvb2QnLCAnYycsCisgIHZlcnNpb24gOiAnMS4xMy4wLjEnLAorICBtZXNvbl92ZXJzaW9uIDogJz49IDAuMzYuMCcsCisgIGRlZmF1bHRfb3B0aW9ucyA6IFsgJ3dhcm5pbmdfbGV2ZWw9MScsCisgICAgICAgICAgICAgICAgICAgICAgJ2J1aWxkdHlwZT1kZWJ1Z29wdGltaXplZCcgXSkKKworZ3N0X3ZlcnNpb24gPSBtZXNvbi5wcm9qZWN0X3ZlcnNpb24oKQordmVyc2lvbl9hcnIgPSBnc3RfdmVyc2lvbi5zcGxpdCgnLicpCitnc3RfdmVyc2lvbl9tYWpvciA9IHZlcnNpb25fYXJyWzBdLnRvX2ludCgpCitnc3RfdmVyc2lvbl9taW5vciA9IHZlcnNpb25fYXJyWzFdLnRvX2ludCgpCitnc3RfdmVyc2lvbl9taWNybyA9IHZlcnNpb25fYXJyWzJdLnRvX2ludCgpCisgaWYgdmVyc2lvbl9hcnIubGVuZ3RoKCkgPT0gNAorICBnc3RfdmVyc2lvbl9uYW5vID0gdmVyc2lvbl9hcnJbM10udG9faW50KCkKK2Vsc2UKKyAgZ3N0X3ZlcnNpb25fbmFubyA9IDAKK2VuZGlmCisKK2dsaWJfcmVxID0gJz49IDIuNDAuMCcKK2dzdF9yZXEgPSAnPj0gQDBALkAxQC4wJy5mb3JtYXQoZ3N0X3ZlcnNpb25fbWFqb3IsIGdzdF92ZXJzaW9uX21pbm9yKQorCithcGlfdmVyc2lvbiA9ICcxLjAnCisKK3BsdWdpbnNfaW5zdGFsbF9kaXIgPSAnQDBAL2dzdHJlYW1lci0xLjAnLmZvcm1hdChnZXRfb3B0aW9uKCdsaWJkaXInKSkKKworY2MgPSBtZXNvbi5nZXRfY29tcGlsZXIoJ2MnKQorCitpZiBjYy5nZXRfaWQoKSA9PSAnbXN2YycKKyAgIyBJZ25vcmUgc2V2ZXJhbCBzcHVyaW91cyB3YXJuaW5ncyBmb3IgdGhpbmdzIGdzdHJlYW1lciBkb2VzIHZlcnkgY29tbW9ubHkKKyAgIyBJZiBhIHdhcm5pbmcgaXMgY29tcGxldGVseSB1c2VsZXNzIGFuZCBzcGFtbXksIHVzZSAnL3dkWFhYWCcgdG8gc3VwcHJlc3MgaXQKKyAgIyBJZiBhIHdhcm5pbmcgaXMgaGFybWxlc3MgYnV0IGhhcmQgdG8gZml4LCB1c2UgJy93b1hYWFgnIHNvIGl0J3Mgc2hvd24gb25jZQorICAjIE5PVEU6IE9ubHkgYWRkIHdhcm5pbmdzIGhlcmUgaWYgeW91IGFyZSBzdXJlIHRoZXkncmUgc3B1cmlvdXMKKyAgYWRkX3Byb2plY3RfYXJndW1lbnRzKAorICAgICAgJy93ZDQwMTgnLCAjIGltcGxpY2l0IHNpZ25lZC91bnNpZ25lZCBjb252ZXJzaW9uCisgICAgICAnL3dkNDE0NicsICMgdW5hcnkgbWludXMgb24gdW5zaWduZWQgKGJld2FyZSBJTlRfTUlOKQorICAgICAgJy93ZDQyNDQnLCAjIGxvc3N5IHR5cGUgY29udmVyc2lvbiAoZS5nLiBkb3VibGUgLT4gaW50KQorICAgICAgJy93ZDQzMDUnLCAjIHRydW5jYXRpbmcgdHlwZSBjb252ZXJzaW9uIChlLmcuIGRvdWJsZSAtPiBmbG9hdCkKKyAgICAgIGxhbmd1YWdlIDogJ2MnKQorICAjIERpc2FibGUgU0FGRVNFSCB3aXRoIE1TVkMgZm9yIHBsdWdpbnMgYW5kIGxpYnMgdGhhdCB1c2UgZXh0ZXJuYWwgZGVwcyB0aGF0CisgICMgYXJlIGJ1aWx0IHdpdGggTWluR1cKKyAgbm9zZWhfbGlua19hcmdzID0gWycvU0FGRVNFSDpOTyddCitlbHNlCisgIG5vc2VoX2xpbmtfYXJncyA9IFtdCitlbmRpZgorCisjIFN5bWJvbCB2aXNpYmlsaXR5CitpZiBjYy5oYXNfYXJndW1lbnQoJy1mdmlzaWJpbGl0eT1oaWRkZW4nKQorICBhZGRfcHJvamVjdF9hcmd1bWVudHMoJy1mdmlzaWJpbGl0eT1oaWRkZW4nLCBsYW5ndWFnZTogJ2MnKQorZW5kaWYKKworIyBEaXNhYmxlIHN0cmljdCBhbGlhc2luZworaWYgY2MuaGFzX2FyZ3VtZW50KCctZm5vLXN0cmljdC1hbGlhc2luZycpCisgIGFkZF9wcm9qZWN0X2FyZ3VtZW50cygnLWZuby1zdHJpY3QtYWxpYXNpbmcnLCBsYW5ndWFnZTogJ2MnKQorZW5kaWYKKworY2RhdGEgPSBjb25maWd1cmF0aW9uX2RhdGEoKQorCitjaGVja19oZWFkZXJzID0gWworICBbJ0hBVkVfRExGQ05fSCcsICdkbGZjbi5oJ10sCisgIFsnSEFWRV9GQ05UTF9IJywgJ2ZjbnRsLmgnXSwKKyAgWydIQVZFX0lOVFRZUEVTX0gnLCAnaW50dHlwZXMuaCddLAorICBbJ0hBVkVfTUVNT1JZX0gnLCAnbWVtb3J5LmgnXSwKKyAgWydIQVZFX1BST0NFU1NfSCcsICdwcm9jZXNzLmgnXSwKKyAgWydIQVZFX1NURElOVF9IJywgJ3N0ZGludC5oJ10sCisgIFsnSEFWRV9TVERMSUJfSCcsICdzdGRsaWIuaCddLAorICBbJ0hBVkVfU1RSSU5HU19IJywgJ3N0cmluZ3MuaCddLAorICBbJ0hBVkVfU1RSSU5HX0gnLCAnc3RyaW5nLmgnXSwKKyAgWydIQVZFX1NZU19JT0NUTF9IJywgJ3N5cy9pb2N0bC5oJ10sCisgIFsnSEFWRV9TWVNfUEFSQU1fSCcsICdzeXMvcGFyYW0uaCddLAorICBbJ0hBVkVfU1lTX1NPQ0tFVF9IJywgJ3N5cy9zb2NrZXQuaCddLAorICBbJ0hBVkVfU1lTX1NUQVRfSCcsICdzeXMvc3RhdC5oJ10sCisgIFsnSEFWRV9TWVNfVElNRV9IJywgJ3N5cy90aW1lLmgnXSwKKyAgWydIQVZFX1NZU19UWVBFU19IJywgJ3N5cy90eXBlcy5oJ10sCisgIFsnSEFWRV9VTklTVERfSCcsICd1bmlzdGQuaCddLAorXQorCitmb3JlYWNoIGggOiBjaGVja19oZWFkZXJzCisgIGlmIGNjLmhhc19oZWFkZXIoaC5nZXQoMSkpCisgICAgY2RhdGEuc2V0KGguZ2V0KDApLCAxKQorICBlbmRpZgorZW5kZm9yZWFjaAorCitjaGVja19mdW5jdGlvbnMgPSBbCisgIFsnSEFWRV9BU0lOSCcsICdhc2luaCcsICcjaW5jbHVkZTxtYXRoLmg+J10sCisgIFsnSEFWRV9DTE9DS19HRVRUSU1FJywgJ2Nsb2NrX2dldHRpbWUnLCAnI2luY2x1ZGU8dGltZS5oPiddLAorICBbJ0hBVkVfQ09TSCcsICdjb3NoJywgJyNpbmNsdWRlPG1hdGguaD4nXSwKKyMgY2hlY2sgdG9rZW4gSEFWRV9DUFVfQUxQSEEKKyMgY2hlY2sgdG9rZW4gSEFWRV9DUFVfQVJNCisjIGNoZWNrIHRva2VuIEhBVkVfQ1BVX0NSSVMKKyMgY2hlY2sgdG9rZW4gSEFWRV9DUFVfQ1JJU1YzMgorIyBjaGVjayB0b2tlbiBIQVZFX0NQVV9IUFBBCisjIGNoZWNrIHRva2VuIEhBVkVfQ1BVX0kzODYKKyMgY2hlY2sgdG9rZW4gSEFWRV9DUFVfSUE2NAorIyBjaGVjayB0b2tlbiBIQVZFX0NQVV9NNjhLCisjIGNoZWNrIHRva2VuIEhBVkVfQ1BVX01JUFMKKyMgY2hlY2sgdG9rZW4gSEFWRV9DUFVfUFBDCisjIGNoZWNrIHRva2VuIEhBVkVfQ1BVX1BQQzY0CisjIGNoZWNrIHRva2VuIEhBVkVfQ1BVX1MzOTAKKyMgY2hlY2sgdG9rZW4gSEFWRV9DUFVfU1BBUkMKKyMgY2hlY2sgdG9rZW4gSEFWRV9DUFVfWDg2XzY0CisgIFsnSEFWRV9EQ0dFVFRFWFQnLCAnZGNnZXR0ZXh0JywgJyNpbmNsdWRlPGxpYmludGwuaD4nXSwKKyMgY2hlY2sgdG9rZW4gSEFWRV9ESVJFQ1RTT1VORAorIyBjaGVjayB0b2tlbiBIQVZFX0VYUEVSSU1FTlRBTAorIyBjaGVjayB0b2tlbiBIQVZFX0VYVEVSTkFMCisjIGNoZWNrIHRva2VuIEhBVkVfRlBDTEFTUworIyBjaGVjayB0b2tlbiBIQVZFX0dDQ19BU00KKyAgWydIQVZFX0dFVFBBR0VTSVpFJywgJ2dldHBhZ2VzaXplJywgJyNpbmNsdWRlPHVuaXN0ZC5oPiddLAorIyBjaGVjayB0b2tlbiBIQVZFX0dFVFRFWFQKKyMgY2hlY2sgdG9rZW4gSEFWRV9HU1RfVjRMMgorIyBjaGVjayB0b2tlbiBIQVZFX0lPUworICBbJ0hBVkVfSVNJTkYnLCAnaXNpbmYnLCAnI2luY2x1ZGU8bWF0aC5oPiddLAorIyBjaGVjayB0b2tlbiBIQVZFX0xJQlY0TDIKKyAgWydIQVZFX01NQVAnLCAnbW1hcCcsICcjaW5jbHVkZTxzeXMvbW1hbi5oPiddLAorICBbJ0hBVkVfTU1BUDY0JywgJ21tYXA2NCcsICcjaW5jbHVkZTxzeXMvbW1hbi5oPiddLAorIyBjaGVjayB0b2tlbiBIQVZFX09TWF9BVURJTworIyBjaGVjayB0b2tlbiBIQVZFX09TWF9WSURFTworIyBjaGVjayB0b2tlbiBIQVZFX1JEVFNDCisgIFsnSEFWRV9TSU5IJywgJ3NpbmgnLCAnI2luY2x1ZGU8bWF0aC5oPiddLAorIyBjaGVjayB0b2tlbiBIQVZFX1dBVkVGT1JNCitdCisKK2xpYm0gPSBjYy5maW5kX2xpYnJhcnkoJ20nLCByZXF1aXJlZCA6IGZhbHNlKQorCitmb3JlYWNoIGYgOiBjaGVja19mdW5jdGlvbnMKKyAgaWYgY2MuaGFzX2Z1bmN0aW9uKGYuZ2V0KDEpLCBwcmVmaXggOiBmLmdldCgyKSwgZGVwZW5kZW5jaWVzIDogbGlibSkKKyAgICBjZGF0YS5zZXQoZi5nZXQoMCksIDEpCisgIGVuZGlmCitlbmRmb3JlYWNoCisKK2NkYXRhLnNldCgnU0laRU9GX0NIQVInLCBjYy5zaXplb2YoJ2NoYXInKSkKK2NkYXRhLnNldCgnU0laRU9GX0lOVCcsIGNjLnNpemVvZignaW50JykpCitjZGF0YS5zZXQoJ1NJWkVPRl9MT05HJywgY2Muc2l6ZW9mKCdsb25nJykpCitjZGF0YS5zZXQoJ1NJWkVPRl9TSE9SVCcsIGNjLnNpemVvZignc2hvcnQnKSkKK2NkYXRhLnNldCgnU0laRU9GX1ZPSURQJywgY2Muc2l6ZW9mKCd2b2lkKicpKQorY2RhdGEuc2V0KCdTSVpFT0ZfT0ZGX1QnLCBjYy5zaXplb2YoJ29mZl90JykpCisKKyMgSGVyZSBiZSBmaXhtZXMuCisjIEZJWE1FOiBjaGVjayBpZiB0aGlzIGlzIGNvcnJlY3QKK2NkYXRhLnNldCgnSEFWRV9DUFVfWDg2XzY0JywgaG9zdF9tYWNoaW5lLmNwdSgpID09ICdhbWQ2NCcpCitjZGF0YS5zZXQoJ0hBVkVfR0NDX0FTTScsIGNjLmdldF9pZCgpICE9ICdtc3ZjJykKK2NkYXRhLnNldCgnVkVSU0lPTicsICciQDBAIicuZm9ybWF0KGdzdF92ZXJzaW9uKSkKK2NkYXRhLnNldCgnUEFDS0FHRV9WRVJTSU9OJywgJyJAMEAiJy5mb3JtYXQoZ3N0X3ZlcnNpb24pKQorY2RhdGEuc2V0KCdHU1RfTElDRU5TRScsICciTEdQTCInKQorY2RhdGEuc2V0KCdQQUNLQUdFJywgJyJnc3QtcGx1Z2lucy1nb29kIicpCitjZGF0YS5zZXQoJ0dFVFRFWFRfUEFDS0FHRScsICciZ3N0LXBsdWdpbnMtZ29vZC0xLjAiJykKKworIyBHU3RyZWFtZXIgcGFja2FnZSBuYW1lIGFuZCBvcmlnaW4gdXJsCitnc3RfcGFja2FnZV9uYW1lID0gZ2V0X29wdGlvbignd2l0aC1wYWNrYWdlLW5hbWUnKQoraWYgZ3N0X3BhY2thZ2VfbmFtZSA9PSAnJworICBpZiBnc3RfdmVyc2lvbl9uYW5vID09IDAKKyAgICBnc3RfcGFja2FnZV9uYW1lID0gJ0dTdHJlYW1lciBHb29kIFBsdWctaW5zIHNvdXJjZSByZWxlYXNlJworICBlbGlmIGdzdF92ZXJzaW9uX25hbm8gPT0gMQorICAgIGdzdF9wYWNrYWdlX25hbWUgPSAnR1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0JworICBlbHNlCisgICAgZ3N0X3BhY2thZ2VfbmFtZSA9ICdHU3RyZWFtZXIgR29vZCBQbHVnLWlucyBwcmVyZWxlYXNlJworICBlbmRpZgorZW5kaWYKK2NkYXRhLnNldF9xdW90ZWQoJ0dTVF9QQUNLQUdFX05BTUUnLCBnc3RfcGFja2FnZV9uYW1lKQorY2RhdGEuc2V0X3F1b3RlZCgnR1NUX1BBQ0tBR0VfT1JJR0lOJywgZ2V0X29wdGlvbignd2l0aC1wYWNrYWdlLW9yaWdpbicpKQorCisjIE1hbmRhdG9yeSBHU1QgZGVwcworZ3N0X2RlcCA9IGRlcGVuZGVuY3koJ2dzdHJlYW1lci0xLjAnLCB2ZXJzaW9uIDogZ3N0X3JlcSwKKyAgZmFsbGJhY2sgOiBbJ2dzdHJlYW1lcicsICdnc3RfZGVwJ10pCitnc3RiYXNlX2RlcCA9IGRlcGVuZGVuY3koJ2dzdHJlYW1lci1iYXNlLTEuMCcsIHZlcnNpb24gOiBnc3RfcmVxLAorICBmYWxsYmFjayA6IFsnZ3N0cmVhbWVyJywgJ2dzdF9iYXNlX2RlcCddKQorZ3N0bmV0X2RlcCA9IGRlcGVuZGVuY3koJ2dzdHJlYW1lci1uZXQtMS4wJywgdmVyc2lvbiA6IGdzdF9yZXEsCisgIGZhbGxiYWNrIDogWydnc3RyZWFtZXInLCAnZ3N0X25ldF9kZXAnXSkKK2lmIGhvc3RfbWFjaGluZS5zeXN0ZW0oKSAhPSAnd2luZG93cycKKyAgZ3N0Y2hlY2tfZGVwID0gZGVwZW5kZW5jeSgnZ3N0cmVhbWVyLWNoZWNrLTEuMCcsIHZlcnNpb24gOiBnc3RfcmVxLAorICAgIGZhbGxiYWNrIDogWydnc3RyZWFtZXInLCAnZ3N0X2NoZWNrX2RlcCddKQorZW5kaWYKK2dzdGNvbnRyb2xsZXJfZGVwID0gZGVwZW5kZW5jeSgnZ3N0cmVhbWVyLWNvbnRyb2xsZXItMS4wJywgdmVyc2lvbiA6IGdzdF9yZXEsCisgIGZhbGxiYWNrIDogWydnc3RyZWFtZXInLCAnZ3N0X2NvbnRyb2xsZXJfZGVwJ10pCisKK2dzdHBidXRpbHNfZGVwID0gZGVwZW5kZW5jeSgnZ3N0cmVhbWVyLXBidXRpbHMtMS4wJywgdmVyc2lvbiA6IGdzdF9yZXEsCisgICAgZmFsbGJhY2sgOiBbJ2dzdC1wbHVnaW5zLWJhc2UnLCAncGJ1dGlsc19kZXAnXSkKK2dzdGFsbG9jYXRvcnNfZGVwID0gZGVwZW5kZW5jeSgnZ3N0cmVhbWVyLWFsbG9jYXRvcnMtMS4wJywgdmVyc2lvbiA6IGdzdF9yZXEsCisgICAgZmFsbGJhY2sgOiBbJ2dzdC1wbHVnaW5zLWJhc2UnLCAnYWxsb2NhdG9yc19kZXAnXSkKK2dzdGFwcF9kZXAgPSBkZXBlbmRlbmN5KCdnc3RyZWFtZXItYXBwLTEuMCcsIHZlcnNpb24gOiBnc3RfcmVxLAorICAgIGZhbGxiYWNrIDogWydnc3QtcGx1Z2lucy1iYXNlJywgJ2FwcF9kZXAnXSkKK2dzdGF1ZGlvX2RlcCA9IGRlcGVuZGVuY3koJ2dzdHJlYW1lci1hdWRpby0xLjAnLCB2ZXJzaW9uIDogZ3N0X3JlcSwKKyAgICBmYWxsYmFjayA6IFsnZ3N0LXBsdWdpbnMtYmFzZScsICdhdWRpb19kZXAnXSkKK2dzdGZmdF9kZXAgPSBkZXBlbmRlbmN5KCdnc3RyZWFtZXItZmZ0LTEuMCcsIHZlcnNpb24gOiBnc3RfcmVxLAorICAgIGZhbGxiYWNrIDogWydnc3QtcGx1Z2lucy1iYXNlJywgJ2ZmdF9kZXAnXSkKK2dzdHJpZmZfZGVwID0gZGVwZW5kZW5jeSgnZ3N0cmVhbWVyLXJpZmYtMS4wJywgdmVyc2lvbiA6IGdzdF9yZXEsCisgICAgZmFsbGJhY2sgOiBbJ2dzdC1wbHVnaW5zLWJhc2UnLCAncmlmZl9kZXAnXSkKK2dzdHJ0cF9kZXAgPSBkZXBlbmRlbmN5KCdnc3RyZWFtZXItcnRwLTEuMCcsIHZlcnNpb24gOiBnc3RfcmVxLAorICAgIGZhbGxiYWNrIDogWydnc3QtcGx1Z2lucy1iYXNlJywgJ3J0cF9kZXAnXSkKK2dzdHJ0c3BfZGVwID0gZGVwZW5kZW5jeSgnZ3N0cmVhbWVyLXJ0c3AtMS4wJywgdmVyc2lvbiA6IGdzdF9yZXEsCisgICAgZmFsbGJhY2sgOiBbJ2dzdC1wbHVnaW5zLWJhc2UnLCAncnRzcF9kZXAnXSkKK2dzdHNkcF9kZXAgPSBkZXBlbmRlbmN5KCdnc3RyZWFtZXItc2RwLTEuMCcsIHZlcnNpb24gOiBnc3RfcmVxLAorICAgIGZhbGxiYWNrIDogWydnc3QtcGx1Z2lucy1iYXNlJywgJ3NkcF9kZXAnXSkKK2dzdHRhZ19kZXAgPSBkZXBlbmRlbmN5KCdnc3RyZWFtZXItdGFnLTEuMCcsIHZlcnNpb24gOiBnc3RfcmVxLAorICAgIGZhbGxiYWNrIDogWydnc3QtcGx1Z2lucy1iYXNlJywgJ3RhZ19kZXAnXSkKK2dzdHZpZGVvX2RlcCA9IGRlcGVuZGVuY3koJ2dzdHJlYW1lci12aWRlby0xLjAnLCB2ZXJzaW9uIDogZ3N0X3JlcSwKKyAgICBmYWxsYmFjayA6IFsnZ3N0LXBsdWdpbnMtYmFzZScsICd2aWRlb19kZXAnXSkKKworIyBHU3RyZWFtZXIgT3BlbkdMCitnc3RnbF9kZXAgPSBkZXBlbmRlbmN5KCdnc3RyZWFtZXItZ2wtMS4wJywgdmVyc2lvbiA6IGdzdF9yZXEsCisgICAgZmFsbGJhY2sgOiBbJ2dzdC1wbHVnaW5zLWJhc2UnLCAnZ3N0Z2xfZGVwJ10sIHJlcXVpcmVkOiBmYWxzZSkKKworYnVpbGRfZ3N0Z2wgPSBnc3RnbF9kZXAuZm91bmQoKSAjIEZJWE1FOiBhZGQgb3B0aW9uPworCitpZiBidWlsZF9nc3RnbAorICBpZiBnc3RnbF9kZXAudHlwZV9uYW1lKCkgPT0gJ3BrZ2NvbmZpZycKKyAgICBnc3RfZ2xfYXBpcyA9IGdzdGdsX2RlcC5nZXRfcGtnY29uZmlnX3ZhcmlhYmxlKCdnbF9hcGlzJykuc3BsaXQoKQorICAgIGdzdF9nbF93aW5zeXMgPSBnc3RnbF9kZXAuZ2V0X3BrZ2NvbmZpZ192YXJpYWJsZSgnZ2xfd2luc3lzJykuc3BsaXQoKQorICAgIGdzdF9nbF9wbGF0Zm9ybXMgPSBnc3RnbF9kZXAuZ2V0X3BrZ2NvbmZpZ192YXJpYWJsZSgnZ2xfcGxhdGZvcm1zJykuc3BsaXQoKQorICBlbHNlCisgICAgZ3N0YmFzZSA9IHN1YnByb2plY3QoJ2dzdC1wbHVnaW5zLWJhc2UnKQorICAgIGdzdF9nbF9hcGlzID0gZ3N0YmFzZS5nZXRfdmFyaWFibGUoJ2VuYWJsZWRfZ2xfYXBpcycpCisgICAgZ3N0X2dsX3dpbnN5cyA9IGdzdGJhc2UuZ2V0X3ZhcmlhYmxlKCdlbmFibGVkX2dsX3dpbnN5cycpCisgICAgZ3N0X2dsX3BsYXRmb3JtcyA9IGdzdGJhc2UuZ2V0X3ZhcmlhYmxlKCdlbmFibGVkX2dsX3BsYXRmb3JtcycpCisgIGVuZGlmCisKKyAgbWVzc2FnZSgnR1N0cmVhbWVyIE9wZW5HTCB3aW5kb3cgc3lzdGVtczogQDBAJy5mb3JtYXQoJyAnLmpvaW4oZ3N0X2dsX3dpbnN5cykpKQorICBtZXNzYWdlKCdHU3RyZWFtZXIgT3BlbkdMIHBsYXRmb3JtczogQDBAJy5mb3JtYXQoJyAnLmpvaW4oZ3N0X2dsX3BsYXRmb3JtcykpKQorICBtZXNzYWdlKCdHU3RyZWFtZXIgT3BlbkdMIGFwaXM6IEAwQCcuZm9ybWF0KCcgJy5qb2luKGdzdF9nbF9hcGlzKSkpCisKKyAgZm9yZWFjaCB3cyA6IFsneDExJywgJ3dheWxhbmQnLCAnYW5kcm9pZCcsICdjb2NvYScsICdlYWdsJywgJ3dpbjMyJywgJ2Rpc3BtYW54JywgJ3Zpdl9mYiddCisgICAgc2V0X3ZhcmlhYmxlKCdnc3RfZ2xfaGF2ZV93aW5kb3dfQDBAJy5mb3JtYXQod3MpLCBnc3RfZ2xfd2luc3lzLmNvbnRhaW5zKHdzKSkKKyAgZW5kZm9yZWFjaAorCisgIGZvcmVhY2ggcCA6IFsnZ2x4JywgJ2VnbCcsICdjZ2wnLCAnZWFnbCcsICd3Z2wnXQorICAgIHNldF92YXJpYWJsZSgnZ3N0X2dsX2hhdmVfcGxhdGZvcm1fQDBAJy5mb3JtYXQocCksIGdzdF9nbF9wbGF0Zm9ybXMuY29udGFpbnMocCkpCisgIGVuZGZvcmVhY2gKKworICBmb3JlYWNoIGFwaSA6IFsnb3BlbmdsJywgJ2dsZXMyJ10KKyAgICBzZXRfdmFyaWFibGUoJ2dzdF9nbF9oYXZlX2FwaV9AMEAnLmZvcm1hdChhcGkpLCBnc3RfZ2xfYXBpcy5jb250YWlucyhhcGkpKQorICBlbmRmb3JlYWNoCitlbmRpZgorCit6bGliX2RlcCA9IGRlcGVuZGVuY3koJ3psaWInLCByZXF1aXJlZCA6IGZhbHNlKQorYnoybGliID0gY2MuZmluZF9saWJyYXJ5KCdiejInLCByZXF1aXJlZCA6IGZhbHNlKQorZ2xpYl9kZXBzID0gW2RlcGVuZGVuY3koJ2dsaWItMi4wJywgdmVyc2lvbiA6IGdsaWJfcmVxLCBmYWxsYmFjazogWydnbGliJywgJ2xpYmdsaWJfZGVwJ10pLAorICAgICAgICAgICAgIGRlcGVuZGVuY3koJ2dvYmplY3QtMi4wJywgZmFsbGJhY2s6IFsnZ2xpYicsICdsaWJnb2JqZWN0X2RlcCddKV0KK2dpb19kZXAgPSBkZXBlbmRlbmN5KCdnaW8tMi4wJywgZmFsbGJhY2s6IFsnZ2xpYicsICdsaWJnaW9fZGVwJ10pCisKK2NkYXRhLnNldCgnSEFWRV9aTElCJywgemxpYl9kZXAuZm91bmQoKSkKK2NkYXRhLnNldCgnSEFWRV9CWjInLCBiejJsaWIuZm91bmQoKSkKKworIyBDaGVjayBhbGwgb2YgdGhlIHRoaW5ncy4KKyMgVE9ETzogTm9uZSBvZiB0aGVzZSBhcmUgYWN0dWFsbHkgdXNlZCB5ZXQgYmVjYXVzZQorIyB0aGUgYnVpbGQgZmlsZXMgaGF2ZW4ndCBiZWVuIHdyaXR0ZW4KK2RlcHMgPSBbCisgIFsnZ3RrX2RlcCcsJ2d0aystMy4wJywgJycsICcnXSwKKyAgWydndGt4X2RlcCcsJ2d0aysteDExLTMuMCcsICcnLCAnJ10sCisgIFsnY2FjYV9kZXAnLCdjYWNhJywgJycsICcnXSwKKyAgWydsaWJyYXcxMzk0X2RlcCcsJ2xpYnJhdzEzOTQnLCAnPj0yLjAuMCcsICcnXSwKKyAgWydsaWJpZWM2MTg4M19kZXAnLCdsaWJpZWM2MTg4MycsICc+PTEuMC4wJywgJyddLAorXQorCitmb3JlYWNoIGQgOiBkZXBzCisgIHZhcm5hbWUgPSBkWzBdCisgIGRlcG5hbWUgPSBkWzFdCisgIHZlcnNpb24gPSBkWzJdCisgIGNvbmZobmFtZSA9IGRbM10KKyAgaWYgdmVyc2lvbiA9PSAnJworICAgIGN1cmRlcCA9IGRlcGVuZGVuY3koZGVwbmFtZSwgcmVxdWlyZWQgOiBmYWxzZSkKKyAgZWxzZQorICAgIGN1cmRlcCA9IGRlcGVuZGVuY3koZGVwbmFtZSwgcmVxdWlyZWQgOiBmYWxzZSwgdmVyc2lvbiA6IHZlcnNpb24pCisgIGVuZGlmCisgIHNldF92YXJpYWJsZSh2YXJuYW1lLCBjdXJkZXApCisgIGlmIGN1cmRlcC5mb3VuZCgpIGFuZCBjb25maG5hbWUgIT0gJycKKyAgICBjZGF0YS5zZXQoY29uZmhuYW1lLCAxKQorICBlbmRpZgorZW5kZm9yZWFjaAorCitnc3RfcGx1Z2luc19nb29kX2FyZ3MgPSBbJy1ESEFWRV9DT05GSUdfSCddCitjb25maWdpbmMgPSBpbmNsdWRlX2RpcmVjdG9yaWVzKCcuJykKK2xpYnNpbmMgPSBpbmNsdWRlX2RpcmVjdG9yaWVzKCdnc3QtbGlicycpCisKK2hhdmVfb3JjYyA9IGZhbHNlCitvcmNjX2FyZ3MgPSBbXQoraWYgZ2V0X29wdGlvbigndXNlX29yYycpICE9ICdubycKKyAgbmVlZF9vcmMgPSBnZXRfb3B0aW9uKCd1c2Vfb3JjJykgPT0gJ3llcycKKyAgIyBVc2VkIGJ5IHZhcmlvdXMgbGlicmFyaWVzL2VsZW1lbnRzIHRoYXQgdXNlIE9yYyBjb2RlCisgIG9yY19kZXAgPSBkZXBlbmRlbmN5KCdvcmMtMC40JywgdmVyc2lvbiA6ICc+PSAwLjQuMTcnLCByZXF1aXJlZCA6IG5lZWRfb3JjKQorICBvcmNjID0gZmluZF9wcm9ncmFtKCdvcmNjJywgcmVxdWlyZWQgOiBuZWVkX29yYykKKyAgaWYgb3JjX2RlcC5mb3VuZCgpIGFuZCBvcmNjLmZvdW5kKCkKKyAgICBoYXZlX29yY2MgPSB0cnVlCisgICAgb3JjY19hcmdzID0gW29yY2MsICctLWluY2x1ZGUnLCAnZ2xpYi5oJ10KKyAgICBjZGF0YS5zZXQoJ0hBVkVfT1JDJywgMSkKKyAgZWxzZQorICAgIG1lc3NhZ2UoJ09yYyBDb21waWxlciBub3QgZm91bmQsIHdpbGwgdXNlIGJhY2t1cCBDIGNvZGUnKQorICAgIGNkYXRhLnNldCgnRElTQUJMRV9PUkMnLCAxKQorICBlbmRpZgorZWxzZQorICBjZGF0YS5zZXQoJ0RJU0FCTEVfT1JDJywgMSkKK2VuZGlmCisKK2lmIGdzdF9kZXAudHlwZV9uYW1lKCkgPT0gJ2ludGVybmFsJworICAgIGdzdF9wcm9qID0gc3VicHJvamVjdCgnZ3N0cmVhbWVyJykKKworICAgIGlmIGdzdF9wcm9qLmdldF92YXJpYWJsZSgnZGlzYWJsZV9nc3RfZGVidWcnKQorICAgICAgICBtZXNzYWdlKCdHU3RyZWFtZXIgZGVidWcgc3lzdGVtIGlzIGRpc2FibGVkJykKKyAgICAgICAgYWRkX3Byb2plY3RfYXJndW1lbnRzKCctV25vLXVudXNlZCcsIGxhbmd1YWdlOiAnYycpCisgICAgZWxzZQorICAgICAgICBtZXNzYWdlKCdHU3RyZWFtZXIgZGVidWcgc3lzdGVtIGlzIGVuYWJsZWQnKQorICAgIGVuZGlmCitlbHNlCisgICAgIyBXZSBjYW4ndCBjaGVjayB0aGF0IGluIHRoZSBjYXNlIG9mIHN1YnByb2plY3RzIGFzIHdlIHdvbid0CisgICAgIyBiZSBhYmxlIHRvIGJ1aWxkIGFnYWluc3QgYW4gaW50ZXJuYWwgZGVwZW5kZW5jeSAod2hpY2ggaXMgbm90IGJ1aWx0IHlldCkKKyAgICBpZiBub3QgY2MuY29tcGlsZXMoJycnCisjaW5jbHVkZSA8Z3N0L2dzdGNvbmZpZy5oPgorI2lmZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworI2Vycm9yICJkZWJ1Z2dpbmcgZGlzYWJsZWQsIG1ha2UgY29tcGlsZXIgZmFpbCIKKyNlbmRpZicnJyAsIGRlcGVuZGVuY2llczogZ3N0X2RlcCkKKyAgICAgICAgbWVzc2FnZSgnR1N0cmVhbWVyIGRlYnVnIHN5c3RlbSBpcyBkaXNhYmxlZCcpCisgICAgICAgIGFkZF9wcm9qZWN0X2FyZ3VtZW50cygnLVduby11bnVzZWQnLCBsYW5ndWFnZTogJ2MnKQorICAgIGVsc2UKKyAgICAgICAgbWVzc2FnZSgnR1N0cmVhbWVyIGRlYnVnIHN5c3RlbSBpcyBlbmFibGVkJykKKyAgICBlbmRpZgorZW5kaWYKKworcHJlc2V0ZGlyID0gam9pbl9wYXRocyhnZXRfb3B0aW9uKCdkYXRhZGlyJyksICdnc3RyZWFtZXItJyArIGFwaV92ZXJzaW9uLCAncHJlc2V0cycpCisKK3N1YmRpcignZ3N0JykKK3N1YmRpcignc3lzJykKK3N1YmRpcignZXh0JykKK3N1YmRpcigndGVzdHMnKQorc3ViZGlyKCdwa2djb25maWcnKQorCisjIHhnZXR0ZXh0IGlzIG9wdGlvbmFsIChvbiBXaW5kb3dzIGZvciBpbnN0YW5jZSkKK2lmIGZpbmRfcHJvZ3JhbSgneGdldHRleHQnLCByZXF1aXJlZCA6IGZhbHNlKS5mb3VuZCgpCisgIHN1YmRpcigncG8nKQorZW5kaWYKKworY29uZmlndXJlX2ZpbGUob3V0cHV0IDogJ2NvbmZpZy5oJywgY29uZmlndXJhdGlvbiA6IGNkYXRhKQorCitweXRob24zID0gaW1wb3J0KCdweXRob24zJykuZmluZF9weXRob24oKQorcnVuX2NvbW1hbmQocHl0aG9uMywgJy1jJywgJ2ltcG9ydCBzaHV0aWw7IHNodXRpbC5jb3B5KCJob29rcy9wcmUtY29tbWl0Lmhvb2siLCAiLmdpdC9ob29rcy9wcmUtY29tbWl0IiknKQpkaWZmIC0tZ2l0IGEvbWVzb25fb3B0aW9ucy50eHQgYi9tZXNvbl9vcHRpb25zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2NmNDJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVzb25fb3B0aW9ucy50eHQKQEAgLTAsMCArMSwxMCBAQAorIyBFbmFibGUgVjRMMiBwbHVnaW4gdG8gcHJvYmUgZGV2aWNlcyBhdCBwbHVnaW4gbG9hZAorb3B0aW9uKCd2NGwyLXByb2JlJywgdHlwZSA6ICdib29sZWFuJywgdmFsdWUgOiB0cnVlKQorIyBVc2UgbGlidjRsMiBmb3Igc29tZSBvYnNjdXJlIGZvcm1hdCBjb252ZXJzaW9ucworb3B0aW9uKCd3aXRoLWxpYnY0bDInLCB0eXBlIDogJ2Jvb2xlYW4nLCB2YWx1ZSA6IHRydWUpCisjIFdoZXRoZXIgdG8gdXNlIG9yYyBvciBub3QgKGF1dG8gd2lsbCBhdXRvZGV0ZWN0LCB5ZXMgd2lsbCBlcnJvciBvdXQgaWYgbm90IGZvdW5kKQorb3B0aW9uKCd1c2Vfb3JjJywgdHlwZSA6ICdjb21ibycsIGNob2ljZXMgOiBbJ3llcycsICdubycsICdhdXRvJ10sIHZhbHVlIDogJ2F1dG8nKQorb3B0aW9uKCd3aXRoLXBhY2thZ2UtbmFtZScsIHR5cGUgOiAnc3RyaW5nJywKKyAgICAgICBkZXNjcmlwdGlvbiA6ICdwYWNrYWdlIG5hbWUgdG8gdXNlIGluIHBsdWdpbnMnKQorb3B0aW9uKCd3aXRoLXBhY2thZ2Utb3JpZ2luJywgdHlwZSA6ICdzdHJpbmcnLCB2YWx1ZSA6ICdVbmtub3duIHBhY2thZ2Ugb3JpZ2luJywKKyAgICAgICBkZXNjcmlwdGlvbiA6ICdwYWNrYWdlIG9yaWdpbiBVUkwgdG8gdXNlIGluIHBsdWdpbnMnKQpkaWZmIC0tZ2l0IGEvcGtnY29uZmlnLy5naXRpZ25vcmUgYi9wa2djb25maWcvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmQwZWYwCi0tLSAvZGV2L251bGwKKysrIGIvcGtnY29uZmlnLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorKi5wYwpkaWZmIC0tZ2l0IGEvcGtnY29uZmlnL01ha2VmaWxlLmFtIGIvcGtnY29uZmlnL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNzkxN2IKLS0tIC9kZXYvbnVsbAorKysgYi9wa2djb25maWcvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzMSBAQAorIyMjIGFsbCBvZiB0aGUgc3RhbmRhcmQgcGMgZmlsZXMgd2UgbmVlZCB0byBnZW5lcmF0ZQorcGN2ZXJmaWxlcyA9ICBcCisJZ3N0cmVhbWVyLXBsdWdpbnMtZ29vZC1AR1NUX0FQSV9WRVJTSU9OQC5wYworcGN2ZXJmaWxlc191bmluc3RhbGxlZCA9IFwKKwlnc3RyZWFtZXItcGx1Z2lucy1nb29kLUBHU1RfQVBJX1ZFUlNJT05ALXVuaW5zdGFsbGVkLnBjCisKKyMjIyBhbGwtbG9jYWw6ICQocGN2ZXJmaWxlcykgJChwY3ZlcmZpbGVzX3VuaW5zdGFsbGVkKQorYWxsLWxvY2FsOiAkKHBjdmVyZmlsZXNfdW5pbnN0YWxsZWQpCisKK2NwX3ZlcmJvc2UgPSAkKGNwX3ZlcmJvc2VfJChWKSkKK2NwX3ZlcmJvc2VfID0gJChjcF92ZXJib3NlXyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQorY3BfdmVyYm9zZV8wID0gQGVjaG8gIiAgQ1AgICAgICRAIjsKKworIyMjIGhvdyB0byBnZW5lcmF0ZSB2ZXJzaW9uZWQgLnBjIGZpbGVzIGZyb20gLnBjIGZpbGVzIGluIHRoaXMgZGlyCislLUBHU1RfQVBJX1ZFUlNJT05ALnBjOiAlLnBjCisJJChjcF92ZXJib3NlKWNwICQ8ICRACislLUBHU1RfQVBJX1ZFUlNJT05ALXVuaW5zdGFsbGVkLnBjOiAlLXVuaW5zdGFsbGVkLnBjCisJJChjcF92ZXJib3NlKWNwICQ8ICRACisKKyMgZG8gbm90IGluc3RhbGwgZm9yIG5vdworIyBwa2djb25maWdkaXIgPSAkKGxpYmRpcikvcGtnY29uZmlnCisjIHBrZ2NvbmZpZ19EQVRBID0gJChwY3ZlcmZpbGVzKQorCitDTEVBTkZJTEVTID0gJChwY3ZlcmZpbGVzKSAkKHBjdmVyZmlsZXNfdW5pbnN0YWxsZWQpCisjIHBjaW5maWxlcyA9IFwKKyMgICAgICAgICAgIGdzdHJlYW1lci1wbHVnaW5zLWdvb2QucGMuaW4gZ3N0cmVhbWVyLXBsdWdpbnMtZ29vZC11bmluc3RhbGxlZC5wYy5pbgorcGNpbmZpbGVzID0gXAorICAgICAgICAgICBnc3RyZWFtZXItcGx1Z2lucy1nb29kLXVuaW5zdGFsbGVkLnBjLmluCisKK0RJU1RDTEVBTkZJTEVTID0gJChwY2luZmlsZXM6LmluPSkKK0VYVFJBX0RJU1QgPSAkKHBjaW5maWxlcykKZGlmZiAtLWdpdCBhL3BrZ2NvbmZpZy9nc3RyZWFtZXItcGx1Z2lucy1nb29kLXVuaW5zdGFsbGVkLnBjLmluIGIvcGtnY29uZmlnL2dzdHJlYW1lci1wbHVnaW5zLWdvb2QtdW5pbnN0YWxsZWQucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3YTMyYgotLS0gL2Rldi9udWxsCisrKyBiL3BrZ2NvbmZpZy9nc3RyZWFtZXItcGx1Z2lucy1nb29kLXVuaW5zdGFsbGVkLnBjLmluCkBAIC0wLDAgKzEsMTMgQEAKK3ByZWZpeD0KK2V4ZWNfcHJlZml4PQorbGliZGlyPUBhYnNfdG9wX2J1aWxkZGlyQC9nc3QtbGlicy9nc3QKK2luY2x1ZGVkaXI9QGFic190b3BfYnVpbGRkaXJAL2dzdC1saWJzCitwbHVnaW5zZGlyPUBhYnNfdG9wX2J1aWxkZGlyQAorCitOYW1lOiBHU3RyZWFtZXIgR29vZCBQbHVnaW5zLCBVbmluc3RhbGxlZAorRGVzY3JpcHRpb246IFN0cmVhbWluZyBtZWRpYSBmcmFtZXdvcmssIGdvb2QgcGx1Z2lucywgdW5pbnN0YWxsZWQKK1ZlcnNpb246IEBWRVJTSU9OQAorUmVxdWlyZXM6IGdzdHJlYW1lci1AR1NUX0FQSV9WRVJTSU9OQCBnc3RyZWFtZXItcGx1Z2lucy1iYXNlLUBHU1RfQVBJX1ZFUlNJT05ACisKK0xpYnM6IAorQ2ZsYWdzOiAKZGlmZiAtLWdpdCBhL3BrZ2NvbmZpZy9tZXNvbi5idWlsZCBiL3BrZ2NvbmZpZy9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2JmMGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcGtnY29uZmlnL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMjQgQEAKK3BrZ2NvbmYgPSBjb25maWd1cmF0aW9uX2RhdGEoKQorCitwa2djb25mLnNldCgncHJlZml4JywgZ2V0X29wdGlvbigncHJlZml4JykpCitwa2djb25mLnNldCgnZXhlY19wcmVmaXgnLCAnJHtwcmVmaXh9JykKK3BrZ2NvbmYuc2V0KCdsaWJkaXInLCAnJHtwcmVmaXh9L0AwQCcuZm9ybWF0KGdldF9vcHRpb24oJ2xpYmRpcicpKSkKK3BrZ2NvbmYuc2V0KCdpbmNsdWRlZGlyJywgJyR7cHJlZml4fS9AMEAnLmZvcm1hdChnZXRfb3B0aW9uKCdpbmNsdWRlZGlyJykpKQorcGtnY29uZi5zZXQoJ0dTVF9BUElfVkVSU0lPTicsIGFwaV92ZXJzaW9uKQorcGtnY29uZi5zZXQoJ1ZFUlNJT04nLCBnc3RfdmVyc2lvbikKKworIyBuZWVkZWQgZm9yIGdlbmVyYXRpbmcgLXVuaW5zdGFsbGVkLnBjIGZpbGVzCitwa2djb25mLnNldCgnYWJzX3RvcF9idWlsZGRpcicsIGpvaW5fcGF0aHMobWVzb24uY3VycmVudF9idWlsZF9kaXIoKSwgJy4uJykpCitwa2djb25mLnNldCgnYWJzX3RvcF9zcmNkaXInLCBqb2luX3BhdGhzKG1lc29uLmN1cnJlbnRfc291cmNlX2RpcigpLCAnLi4nKSkKKworcGtnX2luc3RhbGxfZGlyID0gJ0AwQC9wa2djb25maWcnLmZvcm1hdChnZXRfb3B0aW9uKCdsaWJkaXInKSkKKworcGtnX2ZpbGVzID0gWydnc3RyZWFtZXItcGx1Z2lucy1nb29kJ10KKworZm9yZWFjaCBwIDogcGtnX2ZpbGVzCisgIGluZmlsZSA9IHAgKyAnLXVuaW5zdGFsbGVkLnBjLmluJworICBvdXRmaWxlID0gcCArICctMS4wLXVuaW5zdGFsbGVkLnBjJworICBjb25maWd1cmVfZmlsZShpbnB1dCA6IGluZmlsZSwKKyAgICBvdXRwdXQgOiBvdXRmaWxlLAorICAgIGNvbmZpZ3VyYXRpb24gOiBwa2djb25mKQorZW5kZm9yZWFjaApkaWZmIC0tZ2l0IGEvcG8vLmdpdGlnbm9yZSBiL3BvLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkMDBiZQotLS0gL2Rldi9udWxsCisrKyBiL3BvLy5naXRpZ25vcmUKQEAgLTAsMCArMSwxNyBAQAorKi5nbW8KK3JlbW92ZS1wb3RjZGF0ZS5zZWQKK3JlbW92ZS1wb3RjZGF0ZS5zaW4KK3N0YW1wLXBvCitQT1RGSUxFUworY2F0LWlkLXRibC5jCisqLnBvdAorTWFrZWZpbGUuaW4uaW4KK01ha2VmaWxlLmluLmluLm9yaWcKK01ha2V2YXJzLnRlbXBsYXRlCitSdWxlcy1xdW90Citib2xkcXVvdC5zZWQKK2VuQGJvbGRxdW90LmhlYWRlcgorZW5AcXVvdC5oZWFkZXIKK2luc2VydC1oZWFkZXIuc2luCitxdW90LnNlZAorLnBvdApkaWZmIC0tZ2l0IGEvcG8vTElOR1VBUyBiL3BvL0xJTkdVQVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3ZWI0YwotLS0gL2Rldi9udWxsCisrKyBiL3BvL0xJTkdVQVMKQEAgLTAsMCArMSBAQAorYWYgYXogYmcgY2EgY3MgZGEgZGUgZWwgZW5fR0IgZW8gZXMgZXUgZmkgZnIgZnVyIGdsIGhyIGh1IGlkIGl0IGphIGx0IGx2IG10IG5iIG5sIG9yIHBsIHB0X0JSIHJvIHJ1IHNrIHNsIHNxIHNyIHN2IHRyIHVrIHZpIHpoX0NOIHpoX0hLIHpoX1RXCmRpZmYgLS1naXQgYS9wby9NYWtldmFycyBiL3BvL01ha2V2YXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NmZkZTMKLS0tIC9kZXYvbnVsbAorKysgYi9wby9NYWtldmFycwpAQCAtMCwwICsxLDQ2IEBACisjIE1ha2VmaWxlIHZhcmlhYmxlcyBmb3IgUE8gZGlyZWN0b3J5IGluIGFueSBwYWNrYWdlIHVzaW5nIEdOVSBnZXR0ZXh0LgorCisjIFVzdWFsbHkgdGhlIG1lc3NhZ2UgZG9tYWluIGlzIHRoZSBzYW1lIGFzIHRoZSBwYWNrYWdlIG5hbWUuCitET01BSU4gPSBnc3QtcGx1Z2lucy1nb29kLTEuMAorCisjIFRoZXNlIHR3byB2YXJpYWJsZXMgZGVwZW5kIG9uIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGRpcmVjdG9yeS4KK3N1YmRpciA9IHBvCit0b3BfYnVpbGRkaXIgPSAuLgorCisjIFRoZXNlIG9wdGlvbnMgZ2V0IHBhc3NlZCB0byB4Z2V0dGV4dC4KK1hHRVRURVhUX09QVElPTlMgPSAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8KKworIyBUaGlzIGlzIHRoZSBjb3B5cmlnaHQgaG9sZGVyIHRoYXQgZ2V0cyBpbnNlcnRlZCBpbnRvIHRoZSBoZWFkZXIgb2YgdGhlCisjICQoRE9NQUlOKS5wb3QgZmlsZS4gIFNldCB0aGlzIHRvIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9mIHRoZSBzdXJyb3VuZGluZworIyBwYWNrYWdlLiAgKE5vdGUgdGhhdCB0aGUgbXNnc3RyIHN0cmluZ3MsIGV4dHJhY3RlZCBmcm9tIHRoZSBwYWNrYWdlJ3MKKyMgc291cmNlcywgYmVsb25nIHRvIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9mIHRoZSBwYWNrYWdlLikgIFRyYW5zbGF0b3JzIGFyZQorIyBleHBlY3RlZCB0byB0cmFuc2ZlciB0aGUgY29weXJpZ2h0IGZvciB0aGVpciB0cmFuc2xhdGlvbnMgdG8gdGhpcyBwZXJzb24KKyMgb3IgZW50aXR5LCBvciB0byBkaXNjbGFpbSB0aGVpciBjb3B5cmlnaHQuICBUaGUgZW1wdHkgc3RyaW5nIHN0YW5kcyBmb3IKKyMgdGhlIHB1YmxpYyBkb21haW47IGluIHRoaXMgY2FzZSB0aGUgdHJhbnNsYXRvcnMgYXJlIGV4cGVjdGVkIHRvIGRpc2NsYWltCisjIHRoZWlyIGNvcHlyaWdodC4KK0NPUFlSSUdIVF9IT0xERVIgPQorCisjIFRoaXMgaXMgdGhlIGVtYWlsIGFkZHJlc3Mgb3IgVVJMIHRvIHdoaWNoIHRoZSB0cmFuc2xhdG9ycyBzaGFsbCByZXBvcnQKKyMgYnVncyBpbiB0aGUgdW50cmFuc2xhdGVkIHN0cmluZ3M6CisjIC0gU3RyaW5ncyB3aGljaCBhcmUgbm90IGVudGlyZSBzZW50ZW5jZXMsIHNlZSB0aGUgbWFpbnRhaW5lciBndWlkZWxpbmVzCisjICAgaW4gdGhlIEdOVSBnZXR0ZXh0IGRvY3VtZW50YXRpb24sIHNlY3Rpb24gJ1ByZXBhcmluZyBTdHJpbmdzJy4KKyMgLSBTdHJpbmdzIHdoaWNoIHVzZSB1bmNsZWFyIHRlcm1zIG9yIHJlcXVpcmUgYWRkaXRpb25hbCBjb250ZXh0IHRvIGJlCisjICAgdW5kZXJzdG9vZC4KKyMgLSBTdHJpbmdzIHdoaWNoIG1ha2UgaW52YWxpZCBhc3N1bXB0aW9ucyBhYm91dCBub3RhdGlvbiBvZiBkYXRlLCB0aW1lIG9yCisjICAgbW9uZXkuCisjIC0gUGx1cmFsaXNhdGlvbiBwcm9ibGVtcy4KKyMgLSBJbmNvcnJlY3QgRW5nbGlzaCBzcGVsbGluZy4KKyMgLSBJbmNvcnJlY3QgZm9ybWF0dGluZy4KKyMgSXQgY2FuIGJlIHlvdXIgZW1haWwgYWRkcmVzcywgb3IgYSBtYWlsaW5nIGxpc3QgYWRkcmVzcyB3aGVyZSB0cmFuc2xhdG9ycworIyBjYW4gd3JpdGUgdG8gd2l0aG91dCBiZWluZyBzdWJzY3JpYmVkLCBvciB0aGUgVVJMIG9mIGEgd2ViIHBhZ2UgdGhyb3VnaAorIyB3aGljaCB0aGUgdHJhbnNsYXRvcnMgY2FuIGNvbnRhY3QgeW91LgorTVNHSURfQlVHU19BRERSRVNTID0gaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy8KKworIyBUaGlzIGlzIHRoZSBsaXN0IG9mIGxvY2FsZSBjYXRlZ29yaWVzLCBiZXlvbmQgTENfTUVTU0FHRVMsIGZvciB3aGljaCB0aGUKKyMgbWVzc2FnZSBjYXRhbG9ncyBzaGFsbCBiZSB1c2VkLiAgSXQgaXMgdXN1YWxseSBlbXB0eS4KK0VYVFJBX0xPQ0FMRV9DQVRFR09SSUVTID0KKworIyBBdm9pZCBsaW5lIG51bWJlcnMgaW4gKi5wbywgYnV0IGtlZXAgdGhlbSBpbiAqLnBvdC4KK01TR01FUkdFID0gbXNnbWVyZ2UgLS1uby1sb2NhdGlvbgorTVNHTUVSR0VfVVBEQVRFID0gbXNnbWVyZ2UgLS1uby1sb2NhdGlvbiAtLXVwZGF0ZSAtLWJhY2t1cD1vZmYKK01TR0ZJTFRFUiA9IG1zZ2ZpbHRlciAtLW5vLWxvY2F0aW9uCmRpZmYgLS1naXQgYS9wby9QT1RGSUxFUy5pbiBiL3BvL1BPVEZJTEVTLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OWRmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9wby9QT1RGSUxFUy5pbgpAQCAtMCwwICsxLDMyIEBACitleHQvZmxhYy9nc3RmbGFjZGVjLmMKK2V4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYworZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmMKK2V4dC9qcGVnL2dzdGpwZWdkZWMuYworZXh0L2xhbWUvZ3N0bGFtZW1wM2VuYy5jCitleHQvbGlicG5nL2dzdHBuZ2RlYy5jCitleHQvcHVsc2UvcHVsc2VzaW5rLmMKK2V4dC9zaG91dDIvZ3N0c2hvdXQyLmMKK2V4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmMKK2V4dC90d29sYW1lL2dzdHR3b2xhbWVtcDJlbmMuYworZ3N0L2F1ZGlvcGFyc2Vycy9nc3R3YXZwYWNrcGFyc2UuYworZ3N0L2F2aS9nc3RhdmlkZW11eC5jCitnc3QvYXZpL2dzdGF2aW11eC5jCitnc3QvaXNvbXA0L3F0ZGVtdXguYworZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNyYy5jCitnc3QvcnRzcC9nc3RydHNwc3JjLmMKK2dzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jCitzeXMvb3NzNC9vc3M0LXNpbmsuYworc3lzL29zczQvb3NzNC1zb3VyY2UuYworc3lzL29zcy9nc3Rvc3NzaW5rLmMKK3N5cy9vc3MvZ3N0b3Nzc3JjLmMKK3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3JpbmdidWZmZXIuYworc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYworc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jCitzeXMvdjRsMi9nc3R2NGwycmFkaW8uYworc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYworc3lzL3Y0bDIvZ3N0djRsMnNyYy5jCitzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmMKK3N5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jCitzeXMvdjRsMi9nc3R2NGwydmlkZW9lbmMuYworc3lzL3Y0bDIvdjRsMl9jYWxscy5jCitzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jCmRpZmYgLS1naXQgYS9wby9QT1RGSUxFUy5za2lwIGIvcG8vUE9URklMRVMuc2tpcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2YzMGU1Ci0tLSAvZGV2L251bGwKKysrIGIvcG8vUE9URklMRVMuc2tpcApAQCAtMCwwICsxLDQgQEAKK2dzdC9nb29tL2NvbnZvbHZlX2Z4LmMKK2dzdC9nb29tL21teC5jCitnc3QvZ29vbS94bW14LmMKK2dzdC9vbGRjb3JlL2dzdG11bHRpZmlsZXNyYy5jCmRpZmYgLS1naXQgYS9wby9hZi5wbyBiL3BvL2FmLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNzU2NTIKLS0tIC9kZXYvbnVsbAorKysgYi9wby9hZi5wbwpAQCAtMCwwICsxLDYyMSBAQAorIyBUcmFuc2xhdGlvbiBvZiBnc3RyZWFtZXIgcGx1Z2luIG1lc3NhZ2VzIHRvIEFmcmlrYWFucy4gCisjIENvcHlyaWdodCAoQykgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIHB1dCBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMgUGV0cmkgSm9vc3RlIDxya3dqcGpAcHVrLmFjLnphPiwgMjAwNC4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zIDAuNy42XG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMDQtMDMtMTggMTQ6MTYrMDIwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogUGV0cmkgSm9vc3RlIDxya3dqcGpAcHVrLmFjLnphPlxuIgorIkxhbmd1YWdlLVRlYW06IEFmcmlrYWFucyA8aTE4bkBhZi5vcmcuemE+XG4iCisiTGFuZ3VhZ2U6IGFmXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiIgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJLb24gbmllIGJlaGVlcnRvZXN0ZWwgXCIlc1wiIHRvZW1hYWsgbmllLiIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJLb24gbmllIGJlaGVlcnRvZXN0ZWwgXCIlc1wiIHRvZW1hYWsgbmllLiIKKworIywgZnV6enkKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiS29uIG5pZSBiZWhlZXJ0b2VzdGVsIFwiJXNcIiB0b2VtYWFrIG5pZS4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICIiCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICIiCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIkdlZW4gb2Ygb25nZWxkaWdlIGtsYW5rdG9ldm9lciwgQVZJLXN0cm9vbSBzYWwga29ycnVwIHdlZXMuIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICJLb24gbmllIG91ZGlvLXRvZXN0ZWwgXCIlc1wiIG9vcG1hYWsgdmlyIHNrcnlmIG5pZS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICIiCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiS29uIG5pZSBDRC10b2VzdGVsIG9vcG1hYWsgb20gdGUgbGVlcyBuaWUuIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIk5lZW0gb3AiCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICJNaWtyb2Zvb24iCisKKyMsIGZ1enp5Cittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAiTHluLWluIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIiIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICIiCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIiIKKworbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICIiCisKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgIiIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiVm9sdW1lIgorCittc2dpZCAiR2FpbiIKK21zZ3N0ciAiIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiTW9uaXRvciIKKworIywgZnV6enkKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJMdWlkc3ByZWtlciIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIiIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICIiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS29uIG5pZSBidWZmZXJzIHZhbmFmIHRvZXN0ZWwgXCIlc1wiIHZlcmtyeSBuaWUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICJLb24gbmllIGJ1ZmZlcnMgdmFuYWYgdG9lc3RlbCBcIiVzXCIgdmVya3J5IG5pZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAiVG9lc3RlbCBcIiVzXCIgaXMgbmllICduIHZhc2xlZ2dpbmd0b2VzdGVsIG5pZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICJUb2VzdGVsIFwiJXNcIiBpcyBuaWUgJ24gdmFzbGVnZ2luZ3RvZXN0ZWwgbmllLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIlRvZXN0ZWwgXCIlc1wiIGlzIG5pZSAnbiB2YXNsZWdnaW5ndG9lc3RlbCBuaWUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICJUb2VzdGVsIFwiJXNcIiBpcyBuaWUgJ24gdmFzbGVnZ2luZ3RvZXN0ZWwgbmllLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICJLb24gbmllIGJ1ZmZlcnMgdmFuYWYgdG9lc3RlbCBcIiVzXCIgdmVya3J5IG5pZS4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICIiCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJLb24gbmllIGdlbm9lZyBidWZmZXJzIHZhbmFmIHRvZXN0ZWwgXCIlc1wiIGtyeSBuaWUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJLb24gbmllIGJ1ZmZlcnMgdmFuYWYgdG9lc3RlbCBcIiVzXCIgdmVya3J5IG5pZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiVG9lc3RlbCBcIiVzXCIgaXMgbmllICduIHZhc2xlZ2dpbmd0b2VzdGVsIG5pZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiS29uIG5pZSBvdWRpby10b2VzdGVsIFwiJXNcIiB0b2VtYWFrIG5pZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiS29uIG5pZSBvdWRpby10b2VzdGVsIFwiJXNcIiB0b2VtYWFrIG5pZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJLb24gbmllIGJ1ZmZlcnMgdmFuYWYgdG9lc3RlbCBcIiVzXCIgdmVya3J5IG5pZS4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS29uIG5pZSBnZW5vZWcgYnVmZmVycyB2YW5hZiB0b2VzdGVsIFwiJXNcIiBrcnkgbmllLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJLb24gbmllIHNrcnlmIG5hIHRvZXN0ZWwgXCIlc1wiIG5pZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIktvbiBuaWUgdG9lc3RlbCBcIiVzXCIgb29wbWFhayB2aXIgbGVlcyBlbiBza3J5ZiBuaWUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIlRvZXN0ZWwgXCIlc1wiIGlzIG5pZSAnbiB2YXNsZWdnaW5ndG9lc3RlbCBuaWUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiVG9lc3RlbCBcIiVzXCIgaXMgbmllICduIHZhc2xlZ2dpbmd0b2VzdGVsIG5pZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICJUb2VzdGVsIFwiJXNcIiBpcyBuaWUgJ24gdmFzbGVnZ2luZ3RvZXN0ZWwgbmllLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIktvbiBuaWUgdG9lc3RlbCBcIiVzXCIgb29wbWFhayB2aXIgbGVlcyBlbiBza3J5ZiBuaWUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS29uIG5pZSBidWZmZXJzIHZhbmFmIHRvZXN0ZWwgXCIlc1wiIHZlcmtyeSBuaWUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIktvbiBuaWUgZ2Vub2VnIGJ1ZmZlcnMgdmFuYWYgdG9lc3RlbCBcIiVzXCIga3J5IG5pZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIktvbiBuaWUgYmVoZWVydG9lc3RlbCBcIiVzXCIgdG9lbWFhayBuaWUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS29uIG5pZSBiZWhlZXJ0b2VzdGVsIFwiJXNcIiB0b2VtYWFrIG5pZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiS29uIG5pZSBnZW5vZWcgYnVmZmVycyB2YW5hZiB0b2VzdGVsIFwiJXNcIiBrcnkgbmllLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiS29uIG5pZSBvdWRpby10b2VzdGVsIFwiJXNcIiB0b2VtYWFrIG5pZS4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIlRvZXN0ZWwgXCIlc1wiIGlzIG5pZSAnbiB2YXNsZWdnaW5ndG9lc3RlbCBuaWUuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiS29uIG5pZSBnZW5vZWcgYnVmZmVycyB2YW5hZiB0b2VzdGVsIFwiJXNcIiBrcnkgbmllLiIKKworI34gbXNnaWQgIkJhc3MiCisjfiBtc2dzdHIgIkJhcyIKKworI34gbXNnaWQgIlRyZWJsZSIKKyN+IG1zZ3N0ciAiVHJlYmxlIgorCisjfiBtc2dpZCAiU3ludGgiCisjfiBtc2dzdHIgIlNpbnRldGlzZWVyZGVyIgorCisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICJQQ00iCisKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICJMdWlkc3ByZWtlciIKKworI34gbXNnaWQgIkxpbmUtaW4iCisjfiBtc2dzdHIgIkx5bi1pbiIKKworI34gbXNnaWQgIkNEIgorI34gbXNnc3RyICJDRCIKKworI34gbXNnaWQgIk1peGVyIgorI34gbXNnc3RyICJNZW5nZXIiCisKKyN+IG1zZ2lkICJQQ00tMiIKKyN+IG1zZ3N0ciAiUENNLTIiCisKKyN+IG1zZ2lkICJSZWNvcmQiCisjfiBtc2dzdHIgIk5lZW0gb3AiCisKKyN+IG1zZ2lkICJJbi1nYWluIgorI34gbXNnc3RyICJJbi12ZXJzdGVya2luZyIKKworI34gbXNnaWQgIk91dC1nYWluIgorI34gbXNnc3RyICJVaXQtdmVyc3RlcmtpbmciCisKKyN+IG1zZ2lkICJMaW5lLTEiCisjfiBtc2dzdHIgIkx5bi0xIgorCisjfiBtc2dpZCAiTGluZS0yIgorI34gbXNnc3RyICJMeW4tMiIKKworI34gbXNnaWQgIkxpbmUtMyIKKyN+IG1zZ3N0ciAiTHluLTMiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTEiCisjfiBtc2dzdHIgIkRpZ2l0YWFsLTEiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTIiCisjfiBtc2dzdHIgIkRpZ2l0YWFsLTIiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTMiCisjfiBtc2dzdHIgIkRpZ2l0YWFsLTMiCisKKyN+IG1zZ2lkICJQaG9uZS1pbiIKKyN+IG1zZ3N0ciAiVGVsZWZvb24taW4iCisKKyN+IG1zZ2lkICJQaG9uZS1vdXQiCisjfiBtc2dzdHIgIlRlbGVmb29uLXVpdCIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICJWaWRlbyIKKworI34gbXNnaWQgIlJhZGlvIgorI34gbXNnc3RyICJSYWRpbyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIgorI34gbXNnc3RyICJLb24gbmllIG91ZGlvLXRvZXN0ZWwgXCIlc1wiIG9vcG1hYWsgdmlyIHNrcnlmIG5pZS4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiUmVhciIKKyN+IG1zZ3N0ciAiTmVlbSBvcCIKKworIywgZnV6enkKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICJWaWRlbyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJWaWRlbyBJbiIKKyN+IG1zZ3N0ciAiVmlkZW8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiUmVjb3JkIEdhaW4iCisjfiBtc2dzdHIgIk5lZW0gb3AiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiT3V0cHV0IEdhaW4iCisjfiBtc2dzdHIgIlVpdC12ZXJzdGVya2luZyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEJvb3N0IgorI34gbXNnc3RyICJNaWtyb2Zvb24iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgIk1vbml0b3IiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTWljcm9waG9uZSBHYWluIgorI34gbXNnc3RyICJNaWtyb2Zvb24iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiU3BlYWtlciBTb3VyY2UiCisjfiBtc2dzdHIgIkx1aWRzcHJla2VyIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgU291cmNlIgorI34gbXNnc3RyICJNaWtyb2Zvb24iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTWljcm9waG9uZSAxIgorI34gbXNnc3RyICJNaWtyb2Zvb24iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICJNaWtyb2Zvb24iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgIkRpZ2l0YWFsLTEiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRGlnaXRhbCBJbiIKKyN+IG1zZ3N0ciAiRGlnaXRhYWwtMSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICJNaWtyb2Zvb24iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIktvbiBuaWUgYnVmZmVycyB2YW5hZiB0b2VzdGVsIFwiJXNcIiB2ZXJrcnkgbmllLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGZpbGUgXCIlc1wiIGZvciB3cml0aW5nLiIKKyN+IG1zZ3N0ciAiS29uIG5pZSBsw6plciBcIiVzXCIgb29wbWFhayBvbSBpbiB0ZSBza3J5ZiBuaWUuIgorCisjfiBtc2dpZCAiRXJyb3IgY2xvc2luZyBmaWxlIFwiJXNcIi4iCisjfiBtc2dzdHIgIkZvdXQgdHlkZW5zIHRvZW1hYWsgdmFuIGzDqmVyIFwiJXNcIi4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBmaWxlIFwiJXNcIiBmb3IgcmVhZGluZy4iCisjfiBtc2dzdHIgIktvbiBuaWUgbMOqZXIgXCIlc1wiIG9vcG1hYWsgb20gdGUgbGVlcyBuaWUuIgorCisjfiBtc2dpZCAiTm8gZmlsZW5hbWUgc3BlY2lmaWVkLiIKKyN+IG1zZ3N0ciAiR2VlbiBsw6plcm5hYW0gZ2VzcGVzaWZpc2Vlci4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSBcIiVzXCIuIgorI34gbXNnc3RyICJLb24gbmllIHNrcnlmIG5hIGzDqmVyIFwiJXNcIiBuaWUuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gY29udHJvbCBkZXZpY2UgXCIlc1wiIGZvciB3cml0aW5nLiIKKyN+IG1zZ3N0ciAiS29uIG5pZSBiZWhlZXJ0b2VzdGVsIFwiJXNcIiBvb3BtYWFrIHZpciBza3J5ZiBuaWUuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGNvbmZpZ3VyZSBhdWRpbyBkZXZpY2UgXCIlc1wiLiIKKyN+IG1zZ3N0ciAiS29uIG5pZSBvdWRpby10b2VzdGVsIFwiJXNcIiBrb25maWd1cmVlciBuaWUuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IHNldCBhdWRpbyBkZXZpY2UgXCIlc1wiIHRvICVkIEh6LiIKKyN+IG1zZ3N0ciAiS29uIG5pZSBrbGFua3RvZXN0ZWwgXCIlc1wiIHZlcnN0ZWwgbmEgJWQgSHogbmllLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIHZpZGVvIGRldmljZSBcIiVzXCIgZm9yIHdyaXRpbmcuIgorI34gbXNnc3RyICJLb24gbmllIHZpZGVvLXRvZXN0ZWwgXCIlc1wiIG9vcG1hYWsgdmlyIHNrcnlmIG5pZS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgY2xvc2UgdmlkZW8gZGV2aWNlIFwiJXNcIi4iCisjfiBtc2dzdHIgIktvbiBuaWUgdmlkZW8tdG9lc3RlbCBcIiVzXCIgdG9lbWFhayBuaWUuIgorCisjfiBtc2dpZCAiT1NTIGRldmljZSBcIiVzXCIgaXMgYWxyZWFkeSBpbiB1c2UgYnkgYW5vdGhlciBwcm9ncmFtLiIKKyN+IG1zZ3N0ciAiT1NTLXRvZXN0ZWwgXCIlc1wiIGlzIHJlZWRzIGluIGdlYnJ1aWsgZGV1ciAnbiBhbmRlciBwcm9ncmFtLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBhY2Nlc3MgZGV2aWNlIFwiJXNcIiwgY2hlY2sgaXRzIHBlcm1pc3Npb25zLiIKKyN+IG1zZ3N0ciAiS29uIG5pZSB0b2VnYW5nIGtyeSB0b3QgdG9lc3RlbCBcIiVzXCIgbmllLCBreWsgbmEgdG9lZ2FuZ3NyZWd0ZS4iCisKKyN+IG1zZ2lkICJEZXZpY2UgXCIlc1wiIGRvZXMgbm90IGV4aXN0LiIKKyN+IG1zZ3N0ciAiVG9lc3RlbCBcIiVzXCIgYmVzdGFhbiBuaWUuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlIFwiJXNcIiBmb3Igd3JpdGluZy4iCisjfiBtc2dzdHIgIktvbiBuaWUgdG9lc3RlbCBcIiVzXCIgb29wbWFhayB2aXIgc2tyeWYgbmllLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSBcIiVzXCIgZm9yIHJlYWRpbmcuIgorI34gbXNnc3RyICJLb24gbmllIHRvZXN0ZWwgXCIlc1wiIG9vcG1hYWsgdmlyIGxlZXMgbmllLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIHZmcyBmaWxlIFwiJXNcIiBmb3IgcmVhZGluZy4iCisjfiBtc2dzdHIgIktvbiBuaWUgdmZzLWzDqmVyIFwiJXNcIiBvb3BtYWFrIHZpciBsZWVzIG5pZS4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTm8gZmlsZW5hbWUgZ2l2ZW4uIgorI34gbXNnc3RyICJHZWVuIGzDqmVybmFhbSBnZXNwZXNpZmlzZWVyLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiB2ZnMgZmlsZSBcIiVzXCIgZm9yIHdyaXRpbmc6ICVzLiIKKyN+IG1zZ3N0ciAiS29uIG5pZSB2ZnMtbMOqZXIgXCIlc1wiIG9vcG1hYWsgdmlyIHNrcnlmIG5pZS4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTm8gZmlsZW5hbWUgZ2l2ZW4iCisjfiBtc2dzdHIgIkdlZW4gbMOqZXJuYWFtIGdlc3Blc2lmaXNlZXIuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGNsb3NlIHZmcyBmaWxlIFwiJXNcIi4iCisjfiBtc2dzdHIgIktvbiBuaWUgdmZzLWzDqmVyIFwiJXNcIiB0b2VtYWFrIG5pZS4iCisKKyN+IG1zZ2lkICJObyBkZXZpY2Ugc3BlY2lmaWVkLiIKKyN+IG1zZ3N0ciAiR2VlbiB0b2VzdGVsIGdlc3Blc2lmaXNlZXIiCisKKyN+IG1zZ2lkICJEZXZpY2UgaXMgbm90IG9wZW4uIgorI34gbXNnc3RyICJUb2VzdGVsIGlzIG5pZSBvb3AgbmllLiIKKworI34gbXNnaWQgIkRldmljZSBpcyBvcGVuLiIKKyN+IG1zZ3N0ciAiVG9lc3RlbCBpcyBvb3AuIgpkaWZmIC0tZ2l0IGEvcG8vYXoucG8gYi9wby9hei5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGJhNGU4Ci0tLSAvZGV2L251bGwKKysrIGIvcG8vYXoucG8KQEAgLTAsMCArMSw2MjIgQEAKKyMgVHJhbnNsYXRpb24gb2YgJ2dzdC1wbHVnaW5zJyBtZXNzYWdlcyB0byBBemVyYmFpamFuaS4KKyMgQ29weXJpZ2h0IChDKSAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIGZpbGUgaXMgcHV0IGluIHRoZSBwdWJsaWMgZG9tYWluLgorIyBNyZl0aW4gxo9taXJvdiA8bWV0aW5Aa2FyZWdlbi5jb20+LCAyMDA0LgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtMC44LjBcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwNC0wMy0xOSAxODoyOSswMjAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBNZXRpbiBBbWlyb2ZmIDxtZXRpbkBrYXJlZ2VuLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBBemVyYmFpamFuaSA8dHJhbnNsYXRpb24tdGVhbS1hekBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+XG4iCisiTGFuZ3VhZ2U6IGF6XG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiWC1HZW5lcmF0b3I6IEtCYWJlbCAxLjAuMlxuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIiIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAiXCIlc1wiIGlkYXLJmSBhdmFkYW5sxLHEn8SxIGJhxJ9sYW5hIGJpbG3JmWRpLiIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJcIiVzXCIgaWRhcsmZIGF2YWRhbmzEscSfxLEgYmHEn2xhbmEgYmlsbcmZZGkuIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICJcIiVzXCIgaWRhcsmZIGF2YWRhbmzEscSfxLEgYmHEn2xhbmEgYmlsbcmZZGkuIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICIiCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICJTyZlodiB5YSBkYSBvbG1heWFuIGF1ZGlvIGdpcmnFn2ksIEFWSSB5YXnEsW3EsSBwb3p1bGFjYXFkxLFyLiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiXCIlc1wiIGF1ZGlvIGF2YWRhbmzEscSfxLEgeWF6bWEgw7zDp8O8biBhw6fEsWxhIGJpbG3JmWRpLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICIiCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICJDRCBhdmFkYW5sxLHEn8SxIG94dW1hIMO8w6fDvG4gYcOnxLFsYSBiaWxtyZlkaS4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAiUWV5ZCIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIk1pa3JvZm9uIgorCisjLCBmdXp6eQorbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIljJmXRkLWdpcmnFnyIKKworbXNnaWQgIkludGVybmFsIENEIgorbXNnc3RyICIiCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIiIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICIiCisKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiIgorCittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICIiCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIlPJmXMiCisKK21zZ2lkICJHYWluIgorbXNnc3RyICIiCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJNb25pdG9yIgorCisjLCBmdXp6eQorbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIlNwaWtlciIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIiIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICIiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiXCIlc1wiIGF2YWRhbmzEscSfxLFuZGFuIGJ1ZmZlcmzJmXIgYWzEsW5hIGJpbG3JmWRpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiXCIlc1wiIGF2YWRhbmzEscSfxLFuZGFuIGJ1ZmZlcmzJmXIgYWzEsW5hIGJpbG3JmWRpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICJcIiVzXCIgYXZhZGFubMSxxJ/EsSBjYXB0dXJlIGF2YWRhbmzEscSfxLEgZGV5aWwuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiXCIlc1wiIGF2YWRhbmzEscSfxLEgY2FwdHVyZSBhdmFkYW5sxLHEn8SxIGRleWlsLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIlwiJXNcIiBhdmFkYW5sxLHEn8SxIGNhcHR1cmUgYXZhZGFubMSxxJ/EsSBkZXlpbC4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIlwiJXNcIiBhdmFkYW5sxLHEn8SxIGNhcHR1cmUgYXZhZGFubMSxxJ/EsSBkZXlpbC4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiXCIlc1wiIGF2YWRhbmzEscSfxLFuZGFuIGJ1ZmZlcmzJmXIgYWzEsW5hIGJpbG3JmWRpLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlwiJXNcIiBhdmFkYW5sxLHEn8SxbmRhbiBraWZhecmZdCBxyZlkyZlyIGJ1ZmZlcmzJmXIgYWzEsW5hIGJpbG3JmWRpLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiXCIlc1wiIGF2YWRhbmzEscSfxLFuZGFuIGJ1ZmZlcmzJmXIgYWzEsW5hIGJpbG3JmWRpLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICJcIiVzXCIgYXZhZGFubMSxxJ/EsSBjYXB0dXJlIGF2YWRhbmzEscSfxLEgZGV5aWwuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIlwiJXNcIiBhdWRpbyBhdmFkYW5sxLHEn8SxIGJhxJ9sYW5hIGJpbG3JmWRpLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJcIiVzXCIgYXVkaW8gYXZhZGFubMSxxJ/EsSBiYcSfbGFuYSBiaWxtyZlkaS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJcIiVzXCIgYXZhZGFubMSxxJ/EsW5kYW4gYnVmZmVybMmZciBhbMSxbmEgYmlsbcmZZGkuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlwiJXNcIiBhdmFkYW5sxLHEn8SxbmRhbiBraWZhecmZdCBxyZlkyZlyIGJ1ZmZlcmzJmXIgYWzEsW5hIGJpbG3JmWRpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJcIiVzXCIgYXZhZGFubMSxxJ/EsW5hIHlhesSxbGEgYmlsbcmZZGkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJcIiVzXCIgYXZhZGFubMSxxJ/EsSBveHVtYSB2yZkgeWF6bWEgw7zDp8O8biBhw6fEsWxhIGJpbG3JmWRpLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICJcIiVzXCIgYXZhZGFubMSxxJ/EsSBjYXB0dXJlIGF2YWRhbmzEscSfxLEgZGV5aWwuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiXCIlc1wiIGF2YWRhbmzEscSfxLEgY2FwdHVyZSBhdmFkYW5sxLHEn8SxIGRleWlsLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgTTJNIGRldmljZS4iCittc2dzdHIgIlwiJXNcIiBhdmFkYW5sxLHEn8SxIGNhcHR1cmUgYXZhZGFubMSxxJ/EsSBkZXlpbC4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJcIiVzXCIgYXZhZGFubMSxxJ/EsSBveHVtYSB2yZkgeWF6bWEgw7zDp8O8biBhw6fEsWxhIGJpbG3JmWRpLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlwiJXNcIiBhdmFkYW5sxLHEn8SxbmRhbiBidWZmZXJsyZlyIGFsxLFuYSBiaWxtyZlkaS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiXCIlc1wiIGF2YWRhbmzEscSfxLFuZGFuIGtpZmF5yZl0IHHJmWTJmXIgYnVmZmVybMmZciBhbMSxbmEgYmlsbcmZZGkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJcIiVzXCIgaWRhcsmZIGF2YWRhbmzEscSfxLEgYmHEn2xhbmEgYmlsbcmZZGkuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiXCIlc1wiIGlkYXLJmSBhdmFkYW5sxLHEn8SxIGJhxJ9sYW5hIGJpbG3JmWRpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICJcIiVzXCIgYXZhZGFubMSxxJ/EsW5kYW4ga2lmYXnJmXQgccmZZMmZciBidWZmZXJsyZlyIGFsxLFuYSBiaWxtyZlkaS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIlwiJXNcIiBhdWRpbyBhdmFkYW5sxLHEn8SxIGJhxJ9sYW5hIGJpbG3JmWRpLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAiXCIlc1wiIGF2YWRhbmzEscSfxLEgY2FwdHVyZSBhdmFkYW5sxLHEn8SxIGRleWlsLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIlwiJXNcIiBhdmFkYW5sxLHEn8SxbmRhbiBraWZhecmZdCBxyZlkyZlyIGJ1ZmZlcmzJmXIgYWzEsW5hIGJpbG3JmWRpLiIKKworI34gbXNnaWQgIkJhc3MiCisjfiBtc2dzdHIgIkJhcyIKKworI34gbXNnaWQgIlRyZWJsZSIKKyN+IG1zZ3N0ciAixLBuY8mZIgorCisjfiBtc2dpZCAiU3ludGgiCisjfiBtc2dzdHIgIlNpbnQiCisKKyN+IG1zZ2lkICJQQ00iCisjfiBtc2dzdHIgIlBDTSIKKworI34gbXNnaWQgIlNwZWFrZXIiCisjfiBtc2dzdHIgIlNwaWtlciIKKworI34gbXNnaWQgIkxpbmUtaW4iCisjfiBtc2dzdHIgIljJmXRkLWdpcmnFnyIKKworI34gbXNnaWQgIkNEIgorI34gbXNnc3RyICJDRCIKKworI34gbXNnaWQgIk1peGVyIgorI34gbXNnc3RyICJNaWtzZXIiCisKKyN+IG1zZ2lkICJQQ00tMiIKKyN+IG1zZ3N0ciAiUENNLTIiCisKKyN+IG1zZ2lkICJSZWNvcmQiCisjfiBtc2dzdHIgIlFleWQiCisKKyN+IG1zZ2lkICJJbi1nYWluIgorI34gbXNnc3RyICJHaXJpxZ8tZ2FpbiIKKworI34gbXNnaWQgIk91dC1nYWluIgorI34gbXNnc3RyICLDh8SxeMSxxZ8tZ2FpbiIKKworI34gbXNnaWQgIkxpbmUtMSIKKyN+IG1zZ3N0ciAiWMmZdGQtMSIKKworI34gbXNnaWQgIkxpbmUtMiIKKyN+IG1zZ3N0ciAiWMmZdGQtMiIKKworI34gbXNnaWQgIkxpbmUtMyIKKyN+IG1zZ3N0ciAiWMmZdGQtMyIKKworI34gbXNnaWQgIkRpZ2l0YWwtMSIKKyN+IG1zZ3N0ciAiRGlqaXRhbC0xIgorCisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICJEaWppdGFsLTIiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTMiCisjfiBtc2dzdHIgIkRpaml0YWwtMyIKKworI34gbXNnaWQgIlBob25lLWluIgorI34gbXNnc3RyICJUZWxlZm9uLWdpcmnFn2kiCisKKyN+IG1zZ2lkICJQaG9uZS1vdXQiCisjfiBtc2dzdHIgIlRlbGVmb24tw6fEsXjEscWfxLEiCisKKyN+IG1zZ2lkICJWaWRlbyIKKyN+IG1zZ3N0ciAiVmlkZW8iCisKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAiUmFkaW8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKKyN+IG1zZ3N0ciAiXCIlc1wiIGF1ZGlvIGF2YWRhbmzEscSfxLEgeWF6bWEgw7zDp8O8biBhw6fEsWxhIGJpbG3JmWRpLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJSZWFyIgorI34gbXNnc3RyICJRZXlkIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlNpZGUiCisjfiBtc2dzdHIgIlZpZGVvIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlZpZGVvIEluIgorI34gbXNnc3RyICJWaWRlbyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJSZWNvcmQgR2FpbiIKKyN+IG1zZ3N0ciAiUWV5ZCIKKworIywgZnV6enkKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAiw4fEsXjEscWfLWdhaW4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAiTWlrcm9mb24iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgIk1vbml0b3IiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTWljcm9waG9uZSBHYWluIgorI34gbXNnc3RyICJNaWtyb2ZvbiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJTcGVha2VyIFNvdXJjZSIKKyN+IG1zZ3N0ciAiU3Bpa2VyIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgU291cmNlIgorI34gbXNnc3RyICJNaWtyb2ZvbiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDEiCisjfiBtc2dzdHIgIk1pa3JvZm9uIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAiTWlrcm9mb24iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgIkRpaml0YWwtMSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICJEaWppdGFsLTEiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTWljcm9waG9uZSIKKyN+IG1zZ3N0ciAiTWlrcm9mb24iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIlwiJXNcIiBhdmFkYW5sxLHEn8SxbmRhbiBidWZmZXJsyZlyIGFsxLFuYSBiaWxtyZlkaS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBmaWxlIFwiJXNcIiBmb3Igd3JpdGluZy4iCisjfiBtc2dzdHIgIlwiJXNcIiBmYXlsxLEgeWF6bWEgw7zDp8O8biBhw6fEsWxhIGJpbG3JmWRpLiIKKworI34gbXNnaWQgIkVycm9yIGNsb3NpbmcgZmlsZSBcIiVzXCIuIgorI34gbXNnc3RyICJcIiVzXCIgZmF5bMSxIGJhxJ9sYW5hIGJpbG3JmWRpLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGZpbGUgXCIlc1wiIGZvciByZWFkaW5nLiIKKyN+IG1zZ3N0ciAiXCIlc1wiIGZheWzEsSBveHVtYSDDvMOnw7xuIGHDp8SxbGEgYmlsbcmZZGkuIgorCisjfiBtc2dpZCAiTm8gZmlsZW5hbWUgc3BlY2lmaWVkLiIKKyN+IG1zZ3N0ciAiRmF5bCBhZMSxIHZlcmlsbcmZeWliLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlIFwiJXNcIi4iCisjfiBtc2dzdHIgIlwiJXNcIiBmYXlsxLFuYSB5YXrEsWxhIGJpbG3JmWRpLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGNvbnRyb2wgZGV2aWNlIFwiJXNcIiBmb3Igd3JpdGluZy4iCisjfiBtc2dzdHIgIlwiJXNcIiBpZGFyyZkgYXZhZGFubMSxxJ/EsSB5YXptYSDDvMOnw7xuIGHDp8SxbGEgYmlsbcmZZGkuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGNvbmZpZ3VyZSBhdWRpbyBkZXZpY2UgXCIlc1wiLiIKKyN+IG1zZ3N0ciAiXCIlc1wiIGF1ZGlvIGF2YWRhbmzEscSfxLEgcXVyYcWfZMSxcsSxbGEgYmlsbcmZZGkuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IHNldCBhdWRpbyBkZXZpY2UgXCIlc1wiIHRvICVkIEh6LiIKKyN+IG1zZ3N0ciAiXCIlc1wiIGF1ZGlvIGF2YWRhbmzEscSfxLEgJWQgSHotyZkga2XDp2lyaWzJmSBiaWxtyZlkaS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiB2aWRlbyBkZXZpY2UgXCIlc1wiIGZvciB3cml0aW5nLiIKKyN+IG1zZ3N0ciAiXCIlc1wiIHZpZGVvIGF2YWRhbmzEscSfxLEgeWF6bWEgw7zDp8O8biBhw6fEsWxhIGJpbG3JmWRpLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBjbG9zZSB2aWRlbyBkZXZpY2UgXCIlc1wiLiIKKyN+IG1zZ3N0ciAiXCIlc1wiIHZpZGVvIGF2YWRhbmzEscSfxLEgYmHEn2xhbmEgYmlsbcmZZGkuIgorCisjfiBtc2dpZCAiT1NTIGRldmljZSBcIiVzXCIgaXMgYWxyZWFkeSBpbiB1c2UgYnkgYW5vdGhlciBwcm9ncmFtLiIKKyN+IG1zZ3N0ciAiXCIlc1wiIE9TUyBhdmFkYW5sxLHEn8SxIGJhxZ9xYSBiaXIgcHJvcXJhbSB0yZlyyZlmaW5kyZluIGlzdGlmYWTJmWTJmWRpci4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgYWNjZXNzIGRldmljZSBcIiVzXCIsIGNoZWNrIGl0cyBwZXJtaXNzaW9ucy4iCisjfiBtc2dzdHIgIlwiJXNcIiBhdmFkYW5sxLHEn8SxbmEgeWV0acWfyZkgYmlsbcmZZGksIHPJmWxhaGl5ecmZdGzJmXJpbmkgeW94bGF5xLFuLiIKKworI34gbXNnaWQgIkRldmljZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QuIgorI34gbXNnc3RyICJcIiVzXCIgYXZhZGFubMSxxJ/EsSBtw7Z2Y3VkIGRleWlsLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSBcIiVzXCIgZm9yIHdyaXRpbmcuIgorI34gbXNnc3RyICJcIiVzXCIgYXZhZGFubMSxxJ/EsSB5YXptYSDDvMOnw7xuIGHDp8SxbGEgYmlsbcmZZGkuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlIFwiJXNcIiBmb3IgcmVhZGluZy4iCisjfiBtc2dzdHIgIlwiJXNcIiBhdmFkYW5sxLHEn8SxIG94dW1hIMO8w6fDvG4gYcOnxLFsYSBiaWxtyZlkaS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiB2ZnMgZmlsZSBcIiVzXCIgZm9yIHJlYWRpbmcuIgorI34gbXNnc3RyICJcIiVzXCIgdmZzIGZheWzEsSBveHVtYSDDvMOnw7xuIGHDp8SxbGEgYmlsbcmZZGkuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk5vIGZpbGVuYW1lIGdpdmVuLiIKKyN+IG1zZ3N0ciAiRmF5bCBhZMSxIHZlcmlsbcmZeWliLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiB2ZnMgZmlsZSBcIiVzXCIgZm9yIHdyaXRpbmc6ICVzLiIKKyN+IG1zZ3N0ciAiXCIlc1wiIHZmcyBmYXlsxLEgeWF6bWEgw7zDp8O8biBhw6fEsWxhIGJpbG3JmWRpLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJObyBmaWxlbmFtZSBnaXZlbiIKKyN+IG1zZ3N0ciAiRmF5bCBhZMSxIHZlcmlsbcmZeWliLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBjbG9zZSB2ZnMgZmlsZSBcIiVzXCIuIgorI34gbXNnc3RyICJcIiVzXCIgdmZzIGZheWzEsSBiYcSfbGFuYSBiaWxtyZlkaS4iCisKKyN+IG1zZ2lkICJObyBkZXZpY2Ugc3BlY2lmaWVkLiIKKyN+IG1zZ3N0ciAiQXZhZGFubMSxcSBiaWxkaXJpbG3JmXlpYi4iCisKKyN+IG1zZ2lkICJEZXZpY2UgaXMgbm90IG9wZW4uIgorI34gbXNnc3RyICJBdmFkYW5sxLFxIGHDp8SxcSBkZXlpbC4iCisKKyN+IG1zZ2lkICJEZXZpY2UgaXMgb3Blbi4iCisjfiBtc2dzdHIgIkF2YWRhbmzEsXEgYcOnxLFxZMSxci4iCmRpZmYgLS1naXQgYS9wby9iZy5wbyBiL3BvL2JnLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYTQ1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9wby9iZy5wbwpAQCAtMCwwICsxLDQzMSBAQAorIyBCdWxnYXJpYW4gdHJhbnNsYXRpb24gb2YgZ3N0LXBsdWdpbnMtZ29vZC4KKyMgQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLCAyMDE2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ3N0LXBsdWdpbnMtZ29vZCBwYWNrYWdlLgorIyBBbGV4YW5kZXIgU2hvcG92IDxhc2hAa2FtYmFuYXJpYS5vcmc+LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLCAyMDE2LgorIworIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZCAxLjcuMlxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDE2LTAyLTIxIDIxOjAzKzAyMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEFsZXhhbmRlciBTaG9wb3YgPGFzaEBrYW1iYW5hcmlhLm9yZz5cbiIKKyJMYW5ndWFnZS1UZWFtOiBCdWxnYXJpYW4gPGRpY3RAbHVkb3N0Lm5ldD5cbiIKKyJMYW5ndWFnZTogYmdcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD1uICE9IDE7XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgItCh0YrRgNCy0YrRgNGK0YIgSmFjayDQvdC1INC1INC+0YLQutGA0LjRgi4iCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgItCd0LXRg9GB0L/QtdGI0L3QviDQtNC10LrQvtC00LjRgNCw0L3QtSDQvdCwINC40LfQvtCx0YDQsNC20LXQvdC40LUsINGE0L7RgNC80LDRgiBKUEVHLiIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAi4oCeJXPigJwg0L7RgiDigJ4lc+KAnCIKKworbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAi0J3QtSDQvNC+0LbQtSDQtNCwINGB0LUg0L7RgdGK0YnQtdGB0YLQstC4INCy0YDRitC30LrQsCDQutGK0Lwg0YHRitGA0LLRitGALiIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICLQndC1INC1INC30LDQtNCw0LTQtdC9INCw0LTRgNC10YEuIgorCittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICLQodGK0YDQstGK0YDRitGCINC90LUg0LzQvtC20LUg0LTQsCDRgdC1INC+0YLQutGA0LjQtSDQv9C+INC40LzQtS4iCisKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAi0J3QtSDQvNC+0LbQtSDQtNCwINGB0LUg0L7RgdGK0YnQtdGB0YLQstC4INCy0YDRitC30LrQsCDQutGK0Lwg0YHRitGA0LLRitGA0LAuIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAi0J3QtdGD0YHQv9C10YjQvdC+INC+0YHRitGJ0LXRgdGC0LLRj9Cy0LDQvdC1INC90LAg0YjQuNGE0YDQuNGA0LDQvdCwINCy0YDRitC30LrQsC4iCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICLQktGK0LfQvdC40LrQvdCwINC80YDQtdC20L7QstCwINCz0YDQtdGI0LrQsCDQuNC70Lgg0YHRitGA0LLRitGA0YrRgiDQvdC10L7Rh9Cw0LrQstCw0L3QviDQv9GA0LXQutGK0YHQvdCwINCy0YDRitC30LrQsNGC0LAuIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICLQodGK0YDQstGK0YDRitGCINC40LfQv9GA0LDRgtC4INC70L7RiNC4INC00LDQvdC90LguIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgItCh0YrRgNCy0YrRgNGK0YIg0L3QtSDQv9C+0LTQtNGK0YDQttCwINGC0YrRgNGB0LXQvdC1LiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAi0JDRg9C00LjQviDQstGF0L7QtNGK0YIg0LvQuNC/0YHQstCwINC40LvQuCDQtSDQs9GA0LXRiNC10L0uINCf0L7RgtC+0LrRitGCINGBIEFWSSDRidC1INCx0YrQtNC1INC/0L7QstGA0LXQtNC10L0uIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICLQotC+0LfQuCDRhNCw0LnQuyDQvdC1INGB0YrQtNGK0YDQttCwINC40LfQv9GK0LvQvdC40LzQuCDQv9C+0YLQvtGG0LguIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICLQotC+0LfQuCDRhNCw0LnQuyDQtSDQv9C+0LLRgNC10LTQtdC9INC4INC90LUg0LzQvtC20LUg0LTQsCDQsdGK0LTQtSDQuNC30L/RitC70L3QtdC9LiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICLQn9C+0YLQvtC60YrRgiDQvdC1INC80L7QttC1INC00LAg0YHQtSDQuNC30L/RitC70L3QuCwg0LfQsNGJ0L7RgtC+INC1INGI0LjRhNGA0LjRgNCw0L0g0YEgUGxheVJlYWR5IERSTS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgItCi0L7Qt9C4INGE0LDQudC7INC1INC/0L7QstGA0LXQtNC10L0g0Lgg0L3QtSDQvNC+0LbQtSDQtNCwINCx0YrQtNC1INC40LfQv9GK0LvQvdC10L0uIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICLQndC10L/RgNCw0LLQuNC70LXQvSDRgNCw0LfQvNC10YAg0L3QsCDQsNGC0L7QvC4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgItCi0L7Qt9C4INGE0LDQudC7INC1INC90LXQv9GK0LvQtdC9INC4INC90LUg0LzQvtC20LUg0LTQsCDQsdGK0LTQtSDQuNC30L/RitC70L3QtdC9LiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAi0JLQuNC00LXQviDQv9C+0YLQvtC60YrRgiDQsiDRgtC+0LfQuCDRhNCw0LnQuyDQvNC+0LbQtSDQtNCwINC90LUg0YHQtSDQv9C+0LrQsNC20LUg0L/RgNCw0LLQuNC70L3Qvi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiIgorItCi0L7Qt9C4INGE0LDQudC7INGB0YrQtNGK0YDQttCwINC/0YDQtdC60LDQu9C10L3QviDQvNC90L7Qs9C+INC/0L7RgtC+0YbQuC4g0JjQt9C/0YrQu9C90Y/QstCw0YIg0YHQtSDRgdCw0LzQviDQv9GK0YDQstC40YLQtSAlZCIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisi0J3QtSDQtSDQvtGC0LrRgNC40YIg0L/QvtC00LTRitGA0LbQsNC9INC/0L7RgtC+0LouINCc0L7QttC1INC00LAg0YLRgNGP0LHQstCwINC00LAg0LjQvdGB0YLQsNC70LjRgNCw0YLQtSDQv9GA0LjRgdGC0LDQstC60LDRgtCwINC90LAgIgorIkdTdHJlYW1lciDigJQgUlRTUCwg0LrQvtC50YLQviDQv9C+0LTQtNGK0YDQttCwINC/0L7RgtC+0YbQuCDQvdCwIFJlYWwuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisi0J3QtSDQtSDQvtGC0LrRgNC40YIg0L/QvtC00LTRitGA0LbQsNC9INC/0L7RgtC+0LouINCc0L7QttC1INCx0Lgg0YLRgNGP0LHQstCwINC00LAg0YDQsNC30YDQtdGI0LjRgtC1INC/0L7QstC10YfQtSDRgtGA0LDQvdGB0L/QvtGA0YLQvdC4ICIKKyLQv9GA0L7RgtC+0LrQvtC70Lgg0LjQu9C4INCy0Lgg0LvQuNC/0YHQstCwINC/0YDQsNCy0LjQu9C90LDRgtCwINC/0YDQuNGB0YLQsNCy0LrQsCDQvdCwIEdTdHJlYW1lciDQt9CwIFJUU1AuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorItCQ0YPQtNC40L4g0YPRgdGC0YDQvtC50YHRgtCy0L7RgtC+INC90LUg0LzQvtC20LUg0LTQsCDRgdC1INC+0YLQstC+0YDQuCDQt9CwINC40LfQv9GK0LvQvdC10L3QuNC1LCDQuNC30L/QvtC70LfQstCwINGB0LUg0L7RgiDQtNGA0YPQs9C+ICIKKyLQv9GA0LjQu9C+0LbQtdC90LjQtS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorItCQ0YPQtNC40L4g0YPRgdGC0YDQvtC50YHRgtCy0L7RgtC+INC90LUg0LzQvtC20LUg0LTQsCDRgdC1INC+0YLQstC+0YDQuCDQt9CwINC40LfQv9GK0LvQvdC10L3QuNC1LCDQvdGP0LzQsNGC0LUg0L/RgNCw0LLQsCDQt9CwINGC0L7QstCwLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICLQo9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g0L3QtSDQvNC+0LbQtSDQtNCwINGB0LUg0L7RgtCy0L7RgNC4INC30LAg0LjQt9C/0YrQu9C90LXQvdC40LUuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorItCQ0YPQtNC40L4g0YPRgdGC0YDQvtC50YHRgtCy0L7RgtC+INC90LUg0LzQvtC20LUg0LTQsCDRgdC1INC+0YLQstC+0YDQuCDQt9CwINC40LfQv9GK0LvQvdC10L3QuNC1LiDQldC70LXQvNC10L3RgtGK0YIg0L3QtSDQv9C+0LTQtNGK0YDQttCwICIKKyLRgtCw0LfQuCDQstC10YDRgdC40Y8g0L3QsCBPU1MuIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgItCi0L7QstCwINCw0YPQtNC40L4g0YPRgdGC0YDQvtC50YHRgtCy0L4g0L3QtSDQv9C+0LTQtNGK0YDQttCwINC40LfQv9GK0LvQvdC10L3QuNC1LiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAi0JPRgNC10YjQutCwINC/0YDQuCDQuNC30L/RitC70L3QtdC90LjQtSDQvdCwINCw0YPQtNC40L7RgtC+LiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAi0KLQvtCy0LAg0LDRg9C00LjQviDRg9GB0YLRgNC+0LnRgdGC0LLQviDQvdC1INC/0L7QtNC00YrRgNC20LAg0LfQsNC/0LjRgS4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLQk9GA0LXRiNC60LAg0L/RgNC4INC30LDQv9C40YHQsCDQvtGCINCw0YPQtNC40L4g0YPRgdGC0YDQvtC50YHRgtCy0L7RgtC+LiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorItCQ0YPQtNC40L4g0YPRgdGC0YDQvtC50YHRgtCy0L7RgtC+INC90LUg0LzQvtC20LUg0LTQsCDRgdC1INC+0YLQstC+0YDQuCDQt9CwINC30LDQv9C40YEsINC90Y/QvNCw0YLQtSDQv9GA0LDQstCwINC30LAg0YLQvtCy0LAuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICLQkNGD0LTQuNC+INGD0YHRgtGA0L7QudGB0YLQstC+0YLQviDQvdC1INC80L7QttC1INC00LAg0YHQtSDQvtGC0LLQvtGA0Lgg0LfQsCDQt9Cw0L/QuNGBLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICLQo9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4gQ29yZUF1ZGlvINC90LUg0LUg0L7RgtC60YDQuNGC0L4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgItCj0YHRgtGA0L7QudGB0YLQstC+0YLQviBDb3JlQXVkaW8g0L3QtSDQvNC+0LbQtSDQtNCwINGB0LUg0L7RgtCy0L7RgNC4IgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAi0JjQt9GC0L7Rh9C90LjQuiDQt9CwINC30LDQv9C40YEiCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICLQnNC40LrRgNC+0YTQvtC9IgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAi0JLRhdC+0LQiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAi0JLRitGC0YDQtdGI0L3QviBDRCIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICLQktGF0L7QtCBTUERJRiIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICLQktGF0L7QtCBBVVggMSIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICLQktGF0L7QtCBBVVggMiIKKworbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICLQntCx0YDQsNGC0L3QsCDQstGA0YrQt9C60LAg0L3QsCDQutC+0LTQtdC60LAiCisKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgItCe0LHRgNCw0YLQvdCwINCy0YDRitC30LrQsCDQvdCwIFN1blZUUyIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAi0KHQuNC70LAg0L3QsCDQt9Cy0YPQutCwIgorCittc2dpZCAiR2FpbiIKK21zZ3N0ciAi0KPRgdC40LvQstCw0L3QtSIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgItCc0L7QvdC40YLQvtGAIgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAi0JLQs9GA0LDQtNC10L0g0LLQuNGB0L7QutC+0LPQvtCy0L7RgNC40YLQtdC7IgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICLQodC70YPRiNCw0LvQutC4IgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgItCY0LfRhdC+0LQiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgItCY0LfRhdC+0LQgU1BESUYiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgItCY0LfRhdC+0LQgQVVYIDEiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgItCY0LfRhdC+0LQgQVVYIDIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0JPRgNC10YjQutCwINC/0YDQuCDQv9GA0L7Rh9C40YLQsNC90LUgJWQg0LHQsNC50YLQsCDQvtGCINGD0YHRgtGA0L7QudGB0YLQstC+IOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorItCd0LXRg9GB0L/QtdGI0L3QviDQuNC30LHRgNC+0Y/QstCw0L3QtSDQvdCwINC/0L7QtNC00YrRgNC20LDQvdC40YLQtSDQvtGCINGD0YHRgtGA0L7QudGB0YLQstC+0YLQviDigJ4lc+KAnCDQstC40LTQtdC+INGE0L7RgNC80LDRgtC4IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICLQndC1INC80L7Qs9Cw0YIg0LTQsCDRgdC1INC/0L7Qu9GD0YfQsNGCINCx0YPRhNC10YDQuNGC0LUg0L7RgiDRg9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICLQlNGA0LDQudCy0LXRgNGK0YIg0LfQsCDRg9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g4oCeJXPigJwg0L3QtSDQv9C+0LTQtNGK0YDQttCwINC/0L7Qt9C90LDRgtC4INC80LXRgtC+0LTQsCDQt9CwINCSL9CYICVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAi0JTRgNCw0LnQstC10YDRitGCINC30LAg0YPRgdGC0YDQvtC50YHRgtCy0L7RgtC+IOKAniVz4oCcINC90LUg0L/QvtC00LTRitGA0LbQsCDQv9C+0LfQvdCw0YIg0LzQtdGC0L7QtCDQt9CwINCSL9CYLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICLQo9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g4oCeJXPigJwg0LUg0LfQsNC10YLQviIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAi0KPRgdGC0YDQvtC50YHRgtCy0L7RgtC+IOKAniVz4oCcINC90LUg0LzQvtC20LUg0LTQsCDQt9Cw0L/QuNGB0LLQsCDRgSDRgNCw0LfQtNC10LvQuNGC0LXQu9C90LAg0YHQv9C+0YHQvtCx0L3QvtGB0YIgJWTDlyVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICLQo9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g4oCeJXPigJwg0L3QtSDQvNC+0LbQtSDQtNCwINC30LDQv9C40YHQstCwINCyINGD0LrQsNC30LDQvdC40Y8g0YTQvtGA0LzQsNGCLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICLQo9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g4oCeJXPigJwg0L3QtSDQv9C+0LTQtNGK0YDQttCwINC90LXRgdGK0YHQtdC00L3QuCDRgNCw0LLQvdC40L3QuCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgItCd0LUg0LzQvtCz0LDRgiDQtNCwINGB0LUg0L/QvtC70YPRh9Cw0YIg0L/QsNGA0LDQvNC10YLRgNC40YLQtSDQvdCwINGD0YHRgtGA0L7QudGB0YLQstC+0YLQviDigJ4lc+KAnC4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIiIKKyLQo9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g0LfQsCDQstC40LTQtdC+INC90LUg0L/RgNC40LXQvNCwINC90L7QstC40YLQtSDQvdCw0YHRgtGA0L7QudC60Lgg0LfQsCDRh9C10YHRgtC+0YLQsNGC0LAg0L3QsCDQutCw0LTRgNC4LiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgItCS0LjQtNC10L4g0YPRgdGC0YDQvtC50YHRgtCy0L7RgtC+INC90LUg0YPQutCw0LfQstCwINGE0L7RgNC80LDRgi4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAi0JLQuNC00LXQviDRg9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g0LLRitGA0L3QsCDQvdC10L/RgNCw0LLQuNC70L3QuCDRgNCw0LfQvNC10YDQuCIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICLQktC40LTQtdC+INGD0YHRgtGA0L7QudGB0YLQstC+0YLQviDQuNC30L/QvtC70LfQstCwINC90LXQv9C+0LTQtNGK0YDQttCw0L3QsCDQv9GA0LXQt9GA0LXQtNC+0LLQsCDRgNCw0LfQstC40LLQutCwLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICLQktC40LTQtdC+INGD0YHRgtGA0L7QudGB0YLQstC+0YLQviDQuNC30L/QvtC70LfQstCwINC90LXQv9C+0LTQtNGK0YDQttCw0L0g0YTQvtGA0LzQsNGCINC90LAg0L/QuNC60YHQtdC70LjRgtC1LiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICLQndC10YPRgdC/0LXRiNC90L4g0L3QsNGB0YLRgNC+0LnQstCw0L3QtSDQvdCwINCy0YrRgtGA0LXRiNC90LjRgtC1INCx0YPRhNC10YDQuC4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgItCS0LjQtNC10L4g0YPRgdGC0YDQvtC50YHRgtCy0L7RgtC+INC90LUg0YPQutCw0LfQstCwINGA0LDQt9C80LXRgCDQvdCwINCx0YPRhNC10YDQsC4iCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICLQndGP0LzQsCDQsdGD0YTQtdGA0LgsINC60L7QuNGC0L4g0LTQsCDRgdC1INCy0L3QtdGB0LDRgi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LXRg9GB0L/QtdGI0L3QviDQv9C+0LvRg9GH0LDQstCw0L3QtSDQvdCwINC90LDRgdGC0YDQvtC50LrQuNGC0LUg0L3QsCDRgtGD0L3QtdGAICVkINC90LAg0YPRgdGC0YDQvtC50YHRgtCy0L4g4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCT0YDQtdGI0LrQsCDQv9GA0Lgg0L/QvtC70YPRh9Cw0LLQsNC90LUg0L3QsCDQstGK0LfQvNC+0LbQvdC+0YHRgtC40YLQtSDQvdCwINGD0YHRgtGA0L7QudGB0YLQstC+IOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgItCj0YHRgtGA0L7QudGB0YLQstC+0YLQviDigJ4lc+KAnCDQvdC1INC1INGC0YPQvdC10YAuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAi0J3QtdGD0YHQv9C10YjQvdC+INC/0L7Qu9GD0YfQsNCy0LDQvdC1INC90LAg0YDQsNC00LjQviDQstGF0L7QtNCwINC90LAg0YPRgdGC0YDQvtC50YHRgtCy0L4g4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAi0J3QtdGD0YHQv9C10YjQvdC+INC30LDQtNCw0LLQsNC90LUg0L3QsCDQstGF0L7QtCAlZCDQvdCwINGD0YHRgtGA0L7QudGB0YLQstC+IOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J3QtdGD0YHQv9C10YjQvdCwINGB0LzRj9C90LAg0L3QsCDQt9Cw0LPQu9GD0YjQsNCy0LDQvdC10YLQviDRg9GB0YLRgNC+0LnRgdGC0LLQviDigJ4lc+KAnC4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgItCd0LXRg9GB0L/QtdGI0L3QviDQt9Cw0LTQtdC70Y/QvdC1INC90LAg0L3QtdC+0LHRhdC+0LTQuNC80LDRgtCwINC/0LDQvNC10YIuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgItCd0LXRg9GB0L/QtdGI0L3QviDQt9Cw0LTQtdC70Y/QvdC1INC90LAg0L3QtdC+0LHRhdC+0LTQuNC80LDRgtCwINC/0LDQvNC10YIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgItCa0L7QvdCy0LXRgNGC0L7RgNGK0YIg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g4oCeJXPigJwg0L3QtSDQv9C+0LTQtNGK0YDQttCwINC/0L7Qt9C90LDRgtC4INC80LXRgtC+0LQg0LfQsCDQstGF0L7QtC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgItCa0L7QvdCy0LXRgNGC0L7RgNGK0YIg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g4oCeJXPigJwg0L3QtSDQv9C+0LTQtNGK0YDQttCwINC/0L7Qt9C90LDRgtC4INC80LXRgtC+0LQg0LfQsCDQuNC30YXQvtC0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAi0JrQvtC00LXRgNGK0YIg0YPRgdGC0YDQvtC50YHRgtCy0L7RgtC+IOKAniVz4oCcINC90LUg0L/QvtC00LTRitGA0LbQsCDQv9C+0LfQvdCw0YLQuCDQvNC10YLQvtC0INC30LAg0LLRhdC+0LQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAi0JrQvtC00LXRgNGK0YIg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g4oCeJXPigJwg0L3QtSDQv9C+0LTQtNGK0YDQttCwINC/0L7Qt9C90LDRgtC4INC80LXRgtC+0LQg0LfQsCDQuNC30YXQvtC0LiIKKworbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICLQndC10YPRgdC/0LXRiNC90L4g0YHRgtCw0YDRgtC40YDQsNC90LUg0L3QsCDQvdC40YjQutCw0YLQsCDQt9CwINC00LXQutC+0LTQuNGA0LDQvdC1LiIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAi0J3QtdGD0YHQv9C10YjQvdCwINC+0LHRgNCw0LHQvtGC0LrQsCDQvdCwINC60LDQtNGK0YAuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorItCT0YDQtdGI0LrQsCDQv9GA0Lgg0L/QvtC70YPRh9Cw0LLQsNC90LXRgtC+INC90LAg0LLRitC30LzQvtC20L3QvtGB0YLQuNGC0LUg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g4oCeJXPigJw6INC90LUg0LUg0LTRgNCw0LnQstC10YAgIgorInY0bDIuINCf0YDQvtCy0LXRgNC10YLQtSDQtNCw0LvQuCDQstGB0YrRidC90L7RgdGCINC90LUg0LUg0LTRgNCw0LnQstC10YAgdjRsMS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICLQndC10YPRgdC/0LXRiNC90L4g0LfQsNC/0LjRgtCy0LDQvdC1INC30LAg0LDRgtGA0LjQsdGD0YLQuNGC0LUg0LfQsCDQstGF0L7QtCAlZCDQvdCwINGD0YHRgtGA0L7QudGB0YLQstC+IOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICLQndC10YPRgdC/0LXRiNC90L4g0L/QvtC70YPRh9Cw0LLQsNC90LUg0L3QsCDQvdCw0YHRgtGA0L7QudC60LjRgtC1INC90LAg0YLRg9C90LXRgCAlZCDQvdCwINGD0YHRgtGA0L7QudGB0YLQstC+IOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LXRg9GB0L/QtdGI0L3QviDQt9Cw0L/QuNGC0LLQsNC90LUg0LfQsCDQvdC+0YDQvNCw0YLQsCDQvdCwINGD0YHRgtGA0L7QudGB0YLQstC+IOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J3QtdGD0YHQv9C10YjQvdC+INC/0L7Qu9GD0YfQsNCy0LDQvdC1INC90LAg0LrQvtC90YLRgNC+0LvQvdC40YLQtSDQsNGC0YDQuNCx0YPRgtC4INC90LAg0YPRgdGC0YDQvtC50YHRgtCy0L7RgtC+IOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICLQo9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g4oCeJXPigJwg0L3QtSDQvNC+0LbQtSDQtNCwINGB0LUg0LjQtNC10L3RgtC40YTQuNGG0LjRgNCwLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICLigJ4lc+KAnCDQvdC1INC1INGD0YHRgtGA0L7QudGB0YLQstC+LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgItCj0YHRgtGA0L7QudGB0YLQstC+0YLQviDigJ4lc+KAnCDQvdC1INC80L7QttC1INC00LAg0YHQtSDQvtGC0LLQvtGA0Lgg0LfQsCDRh9C10YLQtdC90LUg0Lgg0LfQsNC/0LjRgS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICLQo9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g4oCeJXPigJwg0L3QtSDQtSDRg9GB0YLRgNC+0LnRgdGC0LLQviDQt9CwINC30LDQv9C40YEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICLQo9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g4oCeJXPigJwg0L3QtSDQtSDQuNC30YXQvtC00L3QviDRg9GB0YLRgNC+0LnRgdGC0LLQvi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgTTJNIGRldmljZS4iCittc2dzdHIgItCj0YHRgtGA0L7QudGB0YLQstC+0YLQviDigJ4lc+KAnCDQvdC1INC1IE0yTS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgItCj0YHRgtGA0L7QudGB0YLQstC+0YLQviDigJ4lc+KAnCDQvdC1INC80L7QttC1INC00LAg0YHQtSDQtNGD0L/Qu9C10LrRgdC40YDQsCDQt9CwINGH0LXRgtC10L3QtSDQuCDQt9Cw0L/QuNGBLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J3QtdGD0YHQv9C10YjQvdC+INC30LDQtNCw0LLQsNC90LUg0L3QsCDQvdC+0YDQvNCw0YLQsCDQvdCwINGD0YHRgtGA0L7QudGB0YLQstC+IOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyLQndC10YPRgdC/0LXRiNC90L4g0L/QvtC70YPRh9Cw0LLQsNC90LUg0L3QsCDRgtC10LrRg9GJ0LDRgtCwINC90LDRgdGC0YDQvtC50LrQsCDQvdCwINGH0LXRgdGC0L7RgtCw0YLQsCDQt9CwINGD0YHRgtGA0L7QudGB0YLQstC+IOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisi0J3QtdGD0YHQv9C10YjQvdC+INC30LDQtNCw0LLQsNC90LUg0L3QsCDRgtC10LrRg9GJ0LDRgtCwINC90LDRgdGC0YDQvtC50LrQsCDQvdCwINGH0LXRgdGC0L7RgtCw0YLQsCDQvdCwINGD0YHRgtGA0L7QudGB0YLQstC+IOKAniVz4oCcINC00LAgIgorItC1ICVsdSBIei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J3QtdGD0YHQv9C10YjQvdC+INC/0L7Qu9GD0YfQsNCy0LDQvdC1INC90LAg0YHQuNC70LDRgtCwINC90LAg0YHQuNCz0L3QsNC70LAg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQviDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LXRg9GB0L/QtdGI0L3QviDQv9C+0LvRg9GH0LDQstCw0L3QtSDQvdCwINGB0YLQvtC50L3QvtGB0YLRgtCwINC90LAg0LrQvtC90YLRgNC+0LsgJWQg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQviDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LXRg9GB0L/QtdGI0L3QviDQt9Cw0LTQsNCy0LDQvdC1INC90LAg0YHRgtC+0LnQvdC+0YHRgtGC0LAgJWQg0L3QsCDQutC+0L3RgtGA0L7QuyAlZCDQvdCwINGD0YHRgtGA0L7QudGB0YLQstC+IOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorItCd0LXRg9GB0L/QtdGI0L3QviDQv9C+0LvRg9GH0LDQstCw0L3QtSDQvdCwINGC0LXQutGD0YnQuNGPINCy0YXQvtC0INC90LAg0YPRgdGC0YDQvtC50YHRgtCy0L4g4oCeJXPigJwuINCc0L7QttC1INCx0Lgg0LUg0YDQsNC00LjQvi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorItCd0LXRg9GB0L/QtdGI0L3QviDQv9C+0LvRg9GH0LDQstCw0L3QtSDQvdCwINGC0LXQutGD0YnQuNGPINC40LfRhdC+0LQg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQviDigJ4lc+KAnC4g0JzQvtC20LUg0LHQuCDQtSDRgNCw0LTQuNC+LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICLQndC10YPRgdC/0LXRiNC90L4g0LfQsNC00LDQstCw0L3QtSDQvdCwINC40LfRhdC+0LQgJWQg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQviDigJ4lc+KAnC4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICIiCisi0J/RgNC+0LzRj9C90LDRgtCwINC90LAg0YDQsNC30LTQtdC70LjRgtC10LvQvdCw0YLQsCDRgdC/0L7RgdC+0LHQvdC+0YHRgiDQv9C+INCy0YDQtdC80LUg0L3QsCDRgNCw0LHQvtGC0LAg0LLRgdC1INC+0YnQtSDQvdC1INGB0LUgIgorItC/0L7QtNC00YrRgNC20LAuIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICLQoNCw0LHQvtGC0LDRgtCwINCx0LXQtyDRh9Cw0YHQvtCy0L3QuNC6INC1INC90LXQstGK0LfQvNC+0LbQvdCwLiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAi0JLRitGC0YDQtdGI0L3QsCDQs9GA0LXRiNC60LAg0L3QsCDQv9C+0YLQvtC60LAg0L7RgiDQtNCw0L3QvdC4LiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgZmxvdyBlcnJvci4iCisjfiBtc2dzdHIgItCS0YrRgtGA0LXRiNC90LAg0LPRgNC10YjQutCwINCyINC/0L7RgtC+0LrQsCDRgSDQtNCw0L3QvdC4LiIKZGlmZiAtLWdpdCBhL3BvL2NhLnBvIGIvcG8vY2EucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIyYzc1MwotLS0gL2Rldi9udWxsCisrKyBiL3BvL2NhLnBvCkBAIC0wLDAgKzEsOTM1IEBACisjIENhdGFsYW4gdHJhbnNsYXRpb24gb2YgZ3N0LXBsdWdpbnMtZ29vZAorIyBDb3B5cmlnaHQgwqkgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIHB1dCBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMgSm9yZGkgTWFsbGFjaCA8am9yZGlAc2luZG9taW5pby5uZXQ+LCAyMDA1LgorIyBKb3JkaSBFc3RyYWRhIDxqb3JkaS5lc3RyYWRhQHlhbWFoYS1tb3Rvci5lcz4sIDIwMTEuCisjIEdpbCBGb3JjYWRhIDxnZm9yY2FkYUBnbm9tZS5vcmc+LCAyMDEyLgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZCAwLjEwLjI4LjJcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxMi0wMS0wMSAxNDoxOSswMTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBHaWwgRm9yY2FkYSA8Z2ZvcmNhZGFAZ25vbWUub3JnPlxuIgorIkxhbmd1YWdlLVRlYW06IENhdGFsYW4gPGNhQGRvZGRzLm5ldD5cbiIKKyJMYW5ndWFnZTogY2FcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD1uICE9IDE7XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiSGEgZmFsbGF0IGVuIGRlc2NvZGlmaWNhciBsYSBpbWF0Z2UgSlBFRyIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiwqslc8K7IHBlciDCqyVzwrsiCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIk5vIHMnaGEgcG9ndXQgY29ubmVjdGFyIGFsIHNlcnZpZG9yIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIk5vIHMnaGEgaW5kaWNhdCBjYXAgVVJMLiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiTm8gcydoYSBwb2d1dCByZXNvbGRyZSBlbCBub20gZGVsIHNlcnZpZG9yLiIKKworbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICJObyBzJ2hhIHBvZ3V0IGVzdGFibGlyIGxhIGNvbm5leGnDsyBhbCBzZXJ2aWRvci4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICJIYSBmYWxsYXQgbGEgY29uZmlndXJhY2nDsyBkZSBjb25uZXhpw7Mgc2VndXJhLiIKKworIywgZnV6enkKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICIiCisiUydoYSBwcm9kdcOvdCB1biBlcnJvciBkZSB4YXJ4YSwgbyBlbCBzZXJ2aWRvciBoYSB0YW5jYXQgbGEgY29ubmV4acOzICIKKyJpbmVzcGVyYWRhbWVudC4iCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIkVsIHNlcnZpZG9yIGhhIGVudmlhdCBkYWRlcyBlcnLDsm5pZXMuIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIkVsIHNlcnZpZG9yIG5vIGFkZW1ldCBsZXMgY2VycXVlcy4iCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIk1hbmNhIG8gbm8gw6lzIHbDoGxpZGEgbCdlbnRyYWRhIGQnw6B1ZGlvLCBlbCBmbHV4IEFWSSBlc3RhcsOgIG1hbG3DqHMuIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJBcXVlc3QgZml0eGVyIG5vIGNvbnTDqSBjYXAgZmx1eCByZXByb2R1w69ibGUuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJBcXVlc3QgZml0eGVyIG5vIMOpcyB2w6BsaWQgaSBubyBlcyBwb3QgcmVwcm9kdWlyLiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkFxdWVzdCBmaXR4ZXIgZXN0w6AgbWFsbcOocyBpIG5vIGVzIHBvdCByZXByb2R1aXIuIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICJMYSBtaWRhIGRlIGwnw6B0b20gbm8gw6lzIHbDoGxpZGEuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJBcXVlc3QgZml0eGVyIG5vIGVzdMOgIGNvbXBsZXQgaSBubyBlcyBwb3QgcmVwcm9kdWlyLiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiRWwgdsOtZGVvIGVuIGFxdWVzdCBmaXR4ZXIgcG9kcmlhIG5vIHJlcHJvZHVpci1zZSBjb3JyZWN0YW1lbnQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIiIKKyJBcXVlc3QgZml0eGVyIGNvbnTDqSBtYXNzYSBmbHV4b3MuIE5vbcOpcyBzJ2VzdGFuIHJlcHJvZHVpbnQgZWxzIHByaW1lcnMgJWQiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorIk5vIHMnaGEgdHJvYmF0IGNhcCBmbHV4IGNvbXBhdGlibGUuIFBvZHLDrWV1IG5lY2Vzc2l0YXIgaW5zdGFswrdsYXIgdW4gIgorImNvbm5lY3RvciBkJ2V4dGVuc2nDsyBSVFNQIGRlbCBHU3RyZWFtZXIgcGVyIGEgZmx1eG9zIGRlIG11bHRpbcOoZGlhIFJlYWwuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisiTm8gcydoYSB0cm9iYXQgY2FwIGZsdXggY29tcGF0aWJsZS4gUG9kcsOtZXUgbmVjZXNzaXRhciBwZXJtZXRyZSBtw6lzICIKKyJwcm90b2NvbHMgZGUgdHJhbnNwb3J0IG8gYsOpIHBvdHNlciBtYW5jYSBlbCBjb25uZWN0b3IgZCdleHRlbnNpw7MgUlRTUCBkZWwgIgorIkdTdHJlYW1lciBjb3JyZWN0ZS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisiTm8gcydoYSBwb2d1dCBvYnJpciBlbCBkaXNwb3NpdGl1IGQnw6B1ZGlvIHBlciBhIGxhIHJlcHJvZHVjY2nDsy4gVW5hIGFsdHJhICIKKyJhcGxpY2FjacOzIGVzdMOgIHV0aWxpdHphbnQgZWwgZGlzcG9zaXRpdS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIk5vIHMnaGEgcG9ndXQgb2JyaXIgZWwgZGlzcG9zaXRpdSBkJ8OgdWRpbyBwZXIgYSBsYSByZXByb2R1Y2Npw7MuIE5vIHRlbml1ICIKKyJwZXJtw61zIHBlciBvYnJpciBlbCBkaXNwb3NpdGl1LiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICJObyBzJ2hhIHBvZ3V0IG9icmlyIGVsIGRpc3Bvc2l0aXUgZCdhzIB1ZGlvIHBlciBhIGxhIHJlcHJvZHVjY2nDsy4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisiTm8gcydoYSBwb2d1dCBvYnJpciBlbCBkaXNwb3NpdGl1IGQnYcyAdWRpbyBwZXIgYSBsYSByZXByb2R1Y2Npw7MuIEFxdWVzdGEgIgorInZlcnNpb8yBIGRlIGwnT3BlbiBTb3VuZCBTeXN0ZW0gbm8gZcyBcyBjb21wYXRpYmxlIGFtYiBhcXVlc3QgZWxlbWVudC4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiQXF1ZXN0IGRpc3Bvc2l0aXUgZCfDoHVkaW8gbm8gcGVybWV0IGxhIHJlcHJvZHVjY2nDsy4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIlMnaGEgcHJvZHXDr3QgdW4gZXJyb3IgYWwgcmVwcm9kdWlyIGwnw6B1ZGlvLiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiQXF1ZXN0IGRpc3Bvc2l0aXUgZCfDoHVkaW8gbm8gcGVybWV0IGwnZW5yZWdpc3RyYW1lbnQuIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiUydoYSBwcm9kdcOvdCB1biBlcnJvciBhIGwnZW5yZWdpc3RyYXIgZGVzIGRlbCBkaXNwb3NpdGl1IGQnw6B1ZGlvLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIk5vIHMnaGEgcG9ndXQgb2JyaXIgZWwgZGlzcG9zaXRpdSBkJ2HMgHVkaW8gcGVyIGEgbCdlbnJlZ2lzdHJhbWVudC4gTm8gdGVuaXUgIgorInBlcm1pzIFzIHBlciBvYnJpciBlbCBkaXNwb3NpdGl1LiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiTm8gcydoYSBwb2d1dCBvYnJpciBlbCBkaXNwb3NpdGl1IGQnYcyAdWRpbyBwZXIgYSBsJ2VucmVnaXN0cmFtZW50LiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIiIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIkZvbnQgZCdlbnJlZ2lzdHJhbWVudCIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIk1pY3LDsmZvbiIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIkzDrW5pYSBkJ2VudHJhZGEiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiQ0QgaW50ZXJuIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIkVudHJhZGEgU1BESUYiCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiRW50cmFkYSBBVVggMSIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJFbnRyYWRhIEFVWCAyIgorCisjLCBmdXp6eQorbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICJCdWNsZSBsb2NhbCIKKworIywgZnV6enkKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgIkJ1Y2xlIGxvY2FsIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJWb2x1bSIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIkd1YW55IgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiTW9uaXRvciIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIkFsdGF2ZXUgaW5jb3Jwb3JhdCIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiQXVyaWN1bGFycyIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICJMw61uaWEgZGUgc29ydGlkYSIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiU29ydGlkYSBTUERJRiIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiU29ydGlkYSBBVVggMSIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiU29ydGlkYSBBVVggMiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIgorbXNnc3RyICJTJ2hhIHByb2R1w690IHVuIGVycm9yIGFsIGxsZWdpciAlZCBieXRlcyBkZXMgZGVsIGRpc3Bvc2l0aXUgwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICJObyBzJ2hhbiBwb2d1dCBtYXBlamFyIGxlcyBtZW3DsnJpZXMgaW50ZXJtw6hkaWVzIGRlbCBkaXNwb3NpdGl1IMKrJXPCuyIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIiIKKyJFbCBjb250cm9sYWRvciBkZWwgZGlzcG9zaXRpdSDCqyVzwrsgbm8gw6lzIGNvbXBhdGlibGUgYW1iIGNhcCBtw6h0b2RlIGRlICIKKyJjYXB0dXJhIGNvbmVndXQuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIiIKKyJFbCBjb250cm9sYWRvciBkZWwgZGlzcG9zaXRpdSDCqyVzwrsgbm8gw6lzIGNvbXBhdGlibGUgYW1iIGNhcCBtw6h0b2RlIGRlICIKKyJjYXB0dXJhIGNvbmVndXQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIkVsIGRpc3Bvc2l0aXUgwqslc8K7IG5vIMOpcyB1biBkaXNwb3NpdGl1IGRlIGNhcHR1cmEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiRWwgZGlzcG9zaXRpdSDCqyVzwrsgbm8gw6lzIHVuIGRpc3Bvc2l0aXUgZGUgY2FwdHVyYS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIkVsIGRpc3Bvc2l0aXUgwqslc8K7IG5vIMOpcyB1biBkaXNwb3NpdGl1IGRlIHNvcnRpZGEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiTm8gcydoYW4gcG9ndXQgb2J0ZW5pciBlbHMgcGFyw6BtZXRyZXMgZGVsIGRpc3Bvc2l0aXUgwqslc8K7IgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiIgorIkVsIGRpc3Bvc2l0aXUgZCdlbnRyYWRhIGRlIHbDrWRlbyBubyBoYSBhY2NlcHRhdCBlbCBwYXLDoG1ldHJlIG5vdSBkZSAiCisiZm90b2dyYW1lcyBwZXIgc2Vnb24uIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIiIKKyJFbCBkaXNwb3NpdGl1IGQnZW50cmFkYSBkZSB2w61kZW8gbm8gaGEgYWNjZXB0YXQgZWwgcGFyw6BtZXRyZSBub3UgZGUgIgorImZvdG9ncmFtZXMgcGVyIHNlZ29uLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiIgorIkVsIGNvbnRyb2xhZG9yIGRlbCBkaXNwb3NpdGl1IMKrJXPCuyBubyDDqXMgY29tcGF0aWJsZSBhbWIgY2FwIG3DqHRvZGUgZGUgIgorImNhcHR1cmEgY29uZWd1dC4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiIgorIkVsIGNvbnRyb2xhZG9yIGRlbCBkaXNwb3NpdGl1IMKrJXPCuyBubyDDqXMgY29tcGF0aWJsZSBhbWIgY2FwIG3DqHRvZGUgZGUgIgorImNhcHR1cmEgY29uZWd1dC4iCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiIgorIkVsIGRpc3Bvc2l0aXUgZCdlbnRyYWRhIGRlIHbDrWRlbyBubyBoYSBhY2NlcHRhdCBlbCBwYXLDoG1ldHJlIG5vdSBkZSAiCisiZm90b2dyYW1lcyBwZXIgc2Vnb24uIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIk5vIHMnaGFuIHBvZ3V0IG9idGVuaXIgZWxzIHBhcsOgbWV0cmVzIGRlbCBzaW50b25pdHphZG9yICVkIGVuIGVsIGRpc3Bvc2l0aXUgIgorIsKrJXPCuy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlMnaGEgcHJvZHXDr3QgdW4gZXJyb3IgYWwgbGxlZ2lyICVkIGJ5dGVzIGRlcyBkZWwgZGlzcG9zaXRpdSDCqyVzwrsuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIkVsIGRpc3Bvc2l0aXUgwqslc8K7IG5vIMOpcyB1biBkaXNwb3NpdGl1IGRlIHNvcnRpZGEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIk5vIHMnaGEgcG9ndXQgZXN0YWJsaXIgbCdlbnRyYWRhICVkIGVuIGVsIGRpc3Bvc2l0aXUgJXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiTm8gcydoYSBwb2d1dCBlc3RhYmxpciBsJ2VudHJhZGEgJWQgZW4gZWwgZGlzcG9zaXRpdSAlcy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJObyBzJ2hhIHBvZ3V0IG9idGVuaXIgbGEgaW50ZW5zaXRhdCBkZWwgc2VueWFsIHBlciBhbCBkaXNwb3NpdGl1IMKrJXPCuy4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJFbCBjb250cm9sYWRvciBkZWwgZGlzcG9zaXRpdSDCqyVzwrsgbm8gw6lzIGNvbXBhdGlibGUgYW1iIGNhcCBtw6h0b2RlIGRlICIKKyJjYXB0dXJhIGNvbmVndXQuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIkVsIGRpc3Bvc2l0aXUgZCdlbnRyYWRhIGRlIHbDrWRlbyBubyBoYSBhY2NlcHRhdCBlbCBwYXLDoG1ldHJlIG5vdSBkZSAiCisiZm90b2dyYW1lcyBwZXIgc2Vnb24uIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIkVsIGRpc3Bvc2l0aXUgZCdlbnRyYWRhIGRlIHbDrWRlbyBubyBoYSBhY2NlcHRhdCBlbCBwYXLDoG1ldHJlIG5vdSBkZSAiCisiZm90b2dyYW1lcyBwZXIgc2Vnb24uIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJFbCBkaXNwb3NpdGl1IGQnZW50cmFkYSBkZSB2w61kZW8gbm8gaGEgYWNjZXB0YXQgZWwgcGFyw6BtZXRyZSBub3UgZGUgIgorImZvdG9ncmFtZXMgcGVyIHNlZ29uLiIKKworIywgZnV6enkKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiSGEgZmFsbGF0IGVuIGRlc2NvZGlmaWNhciBsYSBpbWF0Z2UgSlBFRyIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorIlMnaGEgcHJvZHXDr3QgdW4gZXJyb3IgZW4gb2J0ZW5pciBsZXMgY2FwYWNpdGF0cyBkZWwgZGlzcG9zaXRpdSDCqyVzwrs6IG5vIMOpcyAiCisidW4gY29udHJvbGFkb3IgdjRsMi4gQ29tcHJvdmV1IHNpIMOpcyB1biBjb250cm9sYWRvciB2NGwxLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIiIKKyJTJ2hhIHByb2R1w690IHVuIGVycm9yIGVuIGNvbnN1bHRhciBlbHMgYXRyaWJ1dHMgZGUgbCdlbnRyYWRhICVkIGVuIGVsICIKKyJkaXNwb3NpdGl1ICVzIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJObyBzJ2hhbiBwb2d1dCBvYnRlbmlyIGVscyBwYXLDoG1ldHJlcyBkZWwgc2ludG9uaXR6YWRvciAlZCBlbiBlbCBkaXNwb3NpdGl1ICIKKyLCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiUydoYSBwcm9kdcOvdCB1biBlcnJvciBlbiBjb25zdWx0YXIgbGEgbm9ybWEgZW4gZWwgZGlzcG9zaXRpdSDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiTm8gcydoYSBwb2d1dCBvYnRlbmlyIGVscyBhdHJpYnV0cyBkZWxzIGNvbnRyb2xzIGVuIGVsIGRpc3Bvc2l0aXUgwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJObyBlcyBwb3QgaWRlbnRpZmljYXIgZWwgZGlzcG9zaXRpdSDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkFpeMOyIG5vIMOpcyB1biBkaXNwb3NpdGl1IMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJObyBzJ2hhIHBvZ3V0IG9icmlyIGVsIGRpc3Bvc2l0aXUgwqslc8K7IHBlciBhIGxlY3R1cmEgaSBsJ2VzY3JpcHR1cmEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiRWwgZGlzcG9zaXRpdSDCqyVzwrsgbm8gw6lzIHVuIGRpc3Bvc2l0aXUgZGUgY2FwdHVyYS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIkVsIGRpc3Bvc2l0aXUgwqslc8K7IG5vIMOpcyB1biBkaXNwb3NpdGl1IGRlIHNvcnRpZGEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiRWwgZGlzcG9zaXRpdSDCqyVzwrsgbm8gw6lzIHVuIGRpc3Bvc2l0aXUgZGUgc29ydGlkYS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJObyBzJ2hhIHBvZ3V0IG9icmlyIGVsIGRpc3Bvc2l0aXUgwqslc8K7IHBlciBhIGxlY3R1cmEgaSBsJ2VzY3JpcHR1cmEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJObyBzJ2hhIHBvZ3V0IGVzdGFibGlyIGxhIG5vcm1hIHBlciBhbCBkaXNwb3NpdGl1IMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiTm8gcydoYSBwb2d1dCBvYnRlbmlyIGxhIGZyZXHDvMOobmNpYSBhY3R1YWwgZGVsIHNpbnRvbml0emFkb3IgcGVyIGFsICIKKyJkaXNwb3NpdGl1IMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorIk5vIHMnaGEgcG9ndXQgZXN0YWJsaXIgbGEgZnJlccO8w6huY2lhIGFjdHVhbCBkZWwgc2ludG9uaXR6YWRvciBwZXIgYWwgIgorImRpc3Bvc2l0aXUgwqslc8K7IGEgJWx1IEh6LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJObyBzJ2hhIHBvZ3V0IG9idGVuaXIgbGEgaW50ZW5zaXRhdCBkZWwgc2VueWFsIHBlciBhbCBkaXNwb3NpdGl1IMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJObyBzJ2hhIHBvZ3V0IG9idGVuaXIgZWwgdmFsb3IgcGVyIGFsIGNvbnRyb2wgJWQgZW4gZWwgZGlzcG9zaXRpdSDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiTm8gcydoYSBwb2d1dCBlc3RhYmxpciBlbCB2YWxvciAlZCBwZXIgYWwgY29udHJvbCAlZCBlbiBlbCBkaXNwb3NpdGl1IMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJObyBzJ2hhIHBvZ3V0IG9idGVuaXIgbCdlbnRyYWRhIGFjdHVhbCBlbiBlbCBkaXNwb3NpdGl1IMKrJXPCuy4gUG90c2VyIMOpcyB1biAiCisiZGlzcG9zaXRpdSBkZSByw6BkaW8iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIk5vIHMnaGEgcG9ndXQgb2J0ZW5pciBsYSBzb3J0aWRhIGFjdHVhbCBlbiBlbCBkaXNwb3NpdGl1IMKrJXPCuy4gUG90c2VyIMOpcyB1biAiCisiZGlzcG9zaXRpdSBkZSByw6BkaW8iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiTm8gcydoYSBwb2d1dCBlc3RhYmxpciBsYSBzb3J0aWRhICVkIGVuIGVsIGRpc3Bvc2l0aXUgJXMuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiRW5jYXJhIG5vIGVzIHBlcm1ldCBlbCBjYW52aSBkZSBsYSByZXNvbHVjacOzIGVuIHRlbXBzIGQnZXhlY3VjacOzLiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAiTm8gZXMgcG90IG9wZXJhciBzZW5zZSB1biByZWxsb3RnZSIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAiUydoYSBwcm9kdcOvdCB1biBlcnJvciBpbnRlcm4gZGUgZmx1eCBkZSBkYWRlcy4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICJTJ2hhIHByb2R1w690IHVuIGVycm9yIGludGVybiBkZSBmbHV4IGRlIGRhZGVzLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIkVsIGRpc3Bvc2l0aXUgwqslc8K7IG5vIMOpcyB1biBkaXNwb3NpdGl1IGRlIHNvcnRpZGEuIgorCisjfiBtc2dpZCAiR290IHVuZXhwZWN0ZWQgZnJhbWUgc2l6ZSBvZiAldSBpbnN0ZWFkIG9mICV1LiIKKyN+IG1zZ3N0ciAiUydoYSBvYnRpbmd1dCB1bmEgbWlkYSBkZSBmb3RvZ3JhbWEgaW5lc3BlcmFkYSBkZSAldSBlbiBsbG9jIGRlICV1LiIKKworI34gbXNnaWQgIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiIgorI34gIlMnaGEgcHJvZHXDr3QgdW4gZXJyb3IgZW4gcHJvdmFyIGQnb2J0ZW5pciBmb3RvZ3JhbWVzIGRlIHbDrWRlbyBkZXMgZGVsICIKKyN+ICJkaXNwb3NpdGl1IMKrJXPCuy4iCisKKyN+IG1zZ2lkICJGYWlsZWQgYWZ0ZXIgJWQgdHJpZXMuIGRldmljZSAlcy4gc3lzdGVtIGVycm9yOiAlcyIKKyN+IG1zZ3N0ciAiIgorI34gIkhhIGZhbGxhdCBkZXNwcsOpcyBkZSAlZCBpbnRlbnRzLiBEaXNwb3NpdGl1ICVzLiBFcnJvciBkZSBzaXN0ZW1hOiAlcyIKKworI34gbXNnaWQgIkJhc3MiCisjfiBtc2dzdHIgIkJhaXhvcyIKKworI34gbXNnaWQgIlRyZWJsZSIKKyN+IG1zZ3N0ciAiQWd1dHMiCisKKyN+IG1zZ2lkICJTeW50aCIKKyN+IG1zZ3N0ciAiU2ludGV0aXR6YWRvciIKKworI34gbXNnaWQgIlBDTSIKKyN+IG1zZ3N0ciAiUENNIgorCisjfiBtc2dpZCAiU3BlYWtlciIKKyN+IG1zZ3N0ciAiQWx0YXZldSIKKworI34gbXNnaWQgIkxpbmUtaW4iCisjfiBtc2dzdHIgIkzDrW5pYSBkJ2VudHJhZGEiCisKKyN+IG1zZ2lkICJDRCIKKyN+IG1zZ3N0ciAiQ0QiCisKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAiTWVzY2xhZG9yIgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIlBDTS0yIgorCisjfiBtc2dpZCAiUmVjb3JkIgorI34gbXNnc3RyICJFbnJlZ2lzdHJhbWVudCIKKworI34gbXNnaWQgIkluLWdhaW4iCisjfiBtc2dzdHIgIkd1YW55IGQnZW50cmFkYSIKKworI34gbXNnaWQgIk91dC1nYWluIgorI34gbXNnc3RyICJHdWFueSBkZSBzb3J0aWRhIgorCisjfiBtc2dpZCAiTGluZS0xIgorI34gbXNnc3RyICJMw61uaWEtMSIKKworI34gbXNnaWQgIkxpbmUtMiIKKyN+IG1zZ3N0ciAiTMOtbmlhLTIiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIkzDrW5pYS0zIgorCisjfiBtc2dpZCAiRGlnaXRhbC0xIgorI34gbXNnc3RyICJEaWdpdGFsLTEiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTIiCisjfiBtc2dzdHIgIkRpZ2l0YWwtMiIKKworI34gbXNnaWQgIkRpZ2l0YWwtMyIKKyN+IG1zZ3N0ciAiRGlnaXRhbC0zIgorCisjfiBtc2dpZCAiUGhvbmUtaW4iCisjfiBtc2dzdHIgIkVudHJhZGEgZGVsIHRlbMOoZm9uIgorCisjfiBtc2dpZCAiUGhvbmUtb3V0IgorI34gbXNnc3RyICJTb3J0aWRhIGRlbCB0ZWzDqGZvbiIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICJWw61kZW8iCisKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAiUsOgZGlvIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKKyN+IG1zZ3N0ciAiIgorI34gIk5vIHMnaGEgcG9ndXQgb2JyaXIgZWwgZGlzcG9zaXRpdSBkJ8OgdWRpbyBwZXIgYSBsYSBnZXN0acOzIGRlbCBjb250cm9sIGRlbCAiCisjfiAibWVzY2xhZG9yLiIKKworI34gbXNnaWQgIiIKKyN+ICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIFRoaXMgdmVyc2lvbiBvZiAiCisjfiAidGhlIE9wZW4gU291bmQgU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIk5vIHMnaGEgcG9ndXQgb2JyaXIgZWwgZGlzcG9zaXRpdSBkJ8OgdWRpbyBwZXIgYSBsYSBnZXN0acOzIGRlbCBjb250cm9sIGRlbCAiCisjfiAibWVzY2xhZG9yLiBBcXVlc3RhIHZlcnNpw7MgZGUgbCdPcGVuIFNvdW5kIFN5c3RlbSBubyDDqXMgY29tcGF0aWJsZSBhbWIgIgorI34gImFxdWVzdCBlbGVtZW50LiIKKworI34gbXNnaWQgIk1hc3RlciIKKyN+IG1zZ3N0ciAiTWVzdHJlIgorCisjfiBtc2dpZCAiRnJvbnQiCisjfiBtc2dzdHIgIkZyb250YWwiCisKKyN+IG1zZ2lkICJSZWFyIgorI34gbXNnc3RyICJQb3N0ZXJpb3IiCisKKyN+IG1zZ2lkICJIZWFkcGhvbmVzIgorI34gbXNnc3RyICJBdXJpY3VsYXJzIgorCisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICJDZW50cmFsIgorCisjfiBtc2dpZCAiTEZFIgorI34gbXNnc3RyICJMRkUgKGVmZWN0ZXMgZGUgYmFpeGEgZnJlccO8w6huY2lhKSIKKworI34gbXNnaWQgIlN1cnJvdW5kIgorI34gbXNnc3RyICJTbyBlbnZvbHRhbnQiCisKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICJMYXRlcmFsIgorCisjfiBtc2dpZCAiQVVYIE91dCIKKyN+IG1zZ3N0ciAiU29ydGlkYSBBVVgiCisKKyN+IG1zZ2lkICIzRCBEZXB0aCIKKyN+IG1zZ3N0ciAiUHJvZnVuZGl0YXQgM0QiCisKKyN+IG1zZ2lkICIzRCBDZW50ZXIiCisjfiBtc2dzdHIgIkNlbnRyZSAzRCIKKworI34gbXNnaWQgIjNEIEVuaGFuY2UiCisjfiBtc2dzdHIgIk1pbGxvcmEgM0QiCisKKyN+IG1zZ2lkICJUZWxlcGhvbmUiCisjfiBtc2dzdHIgIlRlbMOoZm9uIgorCisjfiBtc2dpZCAiVmlkZW8gSW4iCisjfiBtc2dzdHIgIkVudHJhZGEgZGUgdsOtZGVvIgorCisjfiBtc2dpZCAiQVVYIEluIgorI34gbXNnc3RyICJFbnRyYWRhIEFVWCIKKworI34gbXNnaWQgIlJlY29yZCBHYWluIgorI34gbXNnc3RyICJHdWFueSBkJ2VucmVnaXN0cmFtZW50IgorCisjfiBtc2dpZCAiT3V0cHV0IEdhaW4iCisjfiBtc2dzdHIgIkd1YW55IGRlIHNvcnRpZGEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEJvb3N0IgorI34gbXNnc3RyICJBbXBsaWZpY2FjacOzIGRlbCBtaWNyw7Jmb24iCisKKyN+IG1zZ2lkICJEaWFnbm9zdGljIgorI34gbXNnc3RyICJEaWFnbsOyc3RpYyIKKworI34gbXNnaWQgIkJhc3MgQm9vc3QiCisjfiBtc2dzdHIgIkFtcGxpZmljYWNpw7MgZGVscyBiYWl4b3MiCisKKyN+IG1zZ2lkICJQbGF5YmFjayBQb3J0cyIKKyN+IG1zZ3N0ciAiUG9ydHMgZGUgcmVwcm9kdWNjacOzIgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIkVudHJhZGEiCisKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAiRm9udCBkZWwgbW9uaXRvciIKKworI34gbXNnaWQgIktleWJvYXJkIEJlZXAiCisjfiBtc2dzdHIgIlNvIGRlbCB0ZWNsYXQiCisKKyN+IG1zZ2lkICJTaW11bGF0ZSBTdGVyZW8iCisjfiBtc2dzdHIgIkVzdMOocmVvIHNpbXVsYXQiCisKKyN+IG1zZ2lkICJTdGVyZW8iCisjfiBtc2dzdHIgIkVzdMOocmVvIgorCisjfiBtc2dpZCAiU3Vycm91bmQgU291bmQiCisjfiBtc2dzdHIgIlNvIGVudm9sdGFudCIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKKyN+IG1zZ3N0ciAiR3VhbnkgZGVsIG1pY3LDsmZvbiIKKworI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICJGb250IGRlIGwnYWx0YXZldSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgU291cmNlIgorI34gbXNnc3RyICJGb250IGRlbCBtaWNyw7Jmb24iCisKKyN+IG1zZ2lkICJKYWNrIgorI34gbXNnc3RyICJKYWNrIgorCisjfiBtc2dpZCAiQ2VudGVyIC8gTEZFIgorI34gbXNnc3RyICJDZW50cmUgLyBMRkUgKGVmZWN0ZXMgZGUgYmFpeGEgZnJlccO8w6huY2lhKSIKKworI34gbXNnaWQgIlN0ZXJlbyBNaXgiCisjfiBtc2dzdHIgIk1lc2NsYSBlc3TDqHJlbyIKKworI34gbXNnaWQgIk1vbm8gTWl4IgorI34gbXNnc3RyICJNZXNjbGEgbW9ubyIKKworI34gbXNnaWQgIklucHV0IE1peCIKKyN+IG1zZ3N0ciAiTWVzY2xhIGQnZW50cmFkYSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAiTWljcsOyZm9uIDEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDIiCisjfiBtc2dzdHIgIk1pY3LDsmZvbiAyIgorCisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgIlNvcnRpZGEgZGlnaXRhbCIKKworI34gbXNnaWQgIkRpZ2l0YWwgSW4iCisjfiBtc2dzdHIgIkVudHJhZGEgZGlnaXRhbCIKKworI34gbXNnaWQgIkhETUkiCisjfiBtc2dzdHIgIkhETUkiCisKKyN+IG1zZ2lkICJNb2RlbSIKKyN+IG1zZ3N0ciAiTcOyZGVtIgorCisjfiBtc2dpZCAiSGFuZHNldCIKKyN+IG1zZ3N0ciAiQ29tYW5kYW1lbnQgYSBkaXN0w6BuY2lhIgorCisjfiBtc2dpZCAiT3RoZXIiCisjfiBtc2dzdHIgIkFsdHJlcyIKKworI34gbXNnaWQgIk5vbmUiCisjfiBtc2dzdHIgIkNhcCIKKworI34gbXNnaWQgIk9uIgorI34gbXNnc3RyICJFbmPDqHMiCisKKyN+IG1zZ2lkICJPZmYiCisjfiBtc2dzdHIgIkFwYWdhdCIKKworI34gbXNnaWQgIk11dGUiCisjfiBtc2dzdHIgIlNpbGVuY2kiCisKKyN+IG1zZ2lkICJGYXN0IgorI34gbXNnc3RyICJSw6BwaWQiCisKKyN+IG1zZ2lkICJWZXJ5IExvdyIKKyN+IG1zZ3N0ciAiTW9sdCBiYWl4YSIKKworI34gbXNnaWQgIkxvdyIKKyN+IG1zZ3N0ciAiQmFpeGEiCisKKyN+IG1zZ2lkICJNZWRpdW0iCisjfiBtc2dzdHIgIk1pdGphbmEiCisKKyN+IG1zZ2lkICJIaWdoIgorI34gbXNnc3RyICJBbHRhIgorCisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICJNb2x0IGFsdGEiCisKKyN+IG1zZ2lkICJQcm9kdWN0aW9uIgorI34gbXNnc3RyICJQcm9kdWNjacOzIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTWljcm9waG9uZSIKKyN+IG1zZ3N0ciAiTWljcsOyZm9uIGRlbCBxdWFkcmUgZnJvbnRhbCIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgSW4iCisjfiBtc2dzdHIgIkzDrW5pYSBkJ2VudHJhZGEgZGVsIHF1YWRyZSBmcm9udGFsIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiQXVyaWN1bGFycyBkZWwgcXVhZHJlIGZyb250YWwiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIE91dCIKKyN+IG1zZ3N0ciAiTMOtbmlhIGRlIHNvcnRpZGEgZGVsIHF1YWRyZSBmcm9udGFsIgorCisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3IgdmVyZCIKKworI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3Igcm9zYSIKKworI34gbXNnaWQgIkJsdWUgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3IgYmxhdSIKKworI34gbXNnaWQgIldoaXRlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmVjdG9yIGJsYW5jIgorCisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3IgbmVncmUiCisKKyN+IG1zZ2lkICJHcmF5IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmVjdG9yIGdyaXMiCisKKyN+IG1zZ2lkICJPcmFuZ2UgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3IgdGFyb25qYSIKKworI34gbXNnaWQgIlJlZCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5lY3RvciB2ZXJtZWxsIgorCisjfiBtc2dpZCAiWWVsbG93IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmVjdG9yIGdyb2MiCisKKyN+IG1zZ2lkICJHcmVlbiBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5lY3RvciB2ZXJkIGRlbCBxdWFkcmUgZnJvbnRhbCIKKworI34gbXNnaWQgIlBpbmsgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3Igcm9zYSBkZWwgcXVhZHJlIGZyb250YWwiCisKKyN+IG1zZ2lkICJCbHVlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmVjdG9yIGJsYXUgZGVsIHF1YWRyZSBmcm9udGFsIgorCisjfiBtc2dpZCAiV2hpdGUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3IgYmxhbmMgZGVsIHF1YWRyZSBmcm9udGFsIgorCisjfiBtc2dpZCAiQmxhY2sgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3IgbmVncmUgZGVsIHF1YWRyZSBmcm9udGFsIgorCisjfiBtc2dpZCAiR3JheSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5lY3RvciBncmlzIGRlbCBxdWFkcmUgZnJvbnRhbCIKKworI34gbXNnaWQgIk9yYW5nZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5lY3RvciB0YXJvbmphIGRlbCBxdWFkcmUgZnJvbnRhbCIKKworI34gbXNnaWQgIlJlZCBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5lY3RvciB2ZXJtZWxsIGRlbCBxdWFkcmUgZnJvbnRhbCIKKworI34gbXNnaWQgIlllbGxvdyBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5lY3RvciBncm9jIGRlbCBxdWFkcmUgZnJvbnRhbCIKKworI34gbXNnaWQgIlNwcmVhZCBPdXRwdXQiCisjfiBtc2dzdHIgIlNvcnRpZGEgZGUgcHJvcGFnYWNpw7MiCisKKyN+IG1zZ2lkICJEb3dubWl4IgorI34gbXNnc3RyICJEb3dubWl4IgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBJbnB1dCIKKyN+IG1zZ3N0ciAiRW50cmFkYSBkZWwgbWVzY2xhZG9yIHZpcnR1YWwiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIE91dHB1dCIKKyN+IG1zZ3N0ciAiU29ydGlkYSBkZWwgbWVzY2xhZG9yIHZpcnR1YWwiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIENoYW5uZWxzIgorI34gbXNnc3RyICJDYW5hbHMgZGVsIG1lc2NsYWRvciB2aXJ0dWFsIgorCisjfiBtc2dpZCAiJXMgJWQgRnVuY3Rpb24iCisjfiBtc2dzdHIgIkZ1bmNpw7MgJXMgJWQiCisKKyN+IG1zZ2lkICIlcyBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiRnVuY2nDsyAlcyIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzb3VuZCBzZXJ2ZXIiCisjfiBtc2dzdHIgIk5vIHMnaGEgcG9ndXQgZXN0YWJsaXIgbGEgY29ubmV4acOzIGFsIHNlcnZpZG9yIGRlIHNvIgorCisjfiBtc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IHNvdW5kIHNlcnZlciBjYXBhYmlsaXRpZXMiCisjfiBtc2dzdHIgIkhhIGZhbGxhdCBlbiBjb25zdWx0YXIgbGVzIGNhcGFjaXRhdHMgZGVsIHNlcnZpZG9yIGRlIHNvIgorCisjfiBtc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBvbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIlMnaGEgcHJvZHVpzIh0IHVuIGVycm9yIGFsIGxsZWdpciAlZCBieXRlcyBlbiBlbCBkaXNwb3NpdGl1IMKrJXPCuy4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZW5xdWV1ZSBidWZmZXJzIGluIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiIgorI34gIk5vIHMnaGFuIHBvZ3V0IGVudmlhciBhIGxhIGN1YSBsZXMgbWVtw7JyaWVzIGludGVybcOoZGllcyBlbiBlbCBkaXNwb3NpdGl1ICIKKyN+ICLCqyVzwrsuIgorCisjfiBtc2dpZCAiRGVzY3JpYmVzIHRoZSBzZWxlY3RlZCBpbnB1dCBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiRGVzY3JpdSBsJ2VsZW1lbnQgZCdlbnRyYWRhIHNlbGVjY2lvbmF0LiIKKworI34gbXNnaWQgIkRlc2NyaWJlcyB0aGUgc2VsZWN0ZWQgb3V0cHV0IGVsZW1lbnQgZm9yIEF1ZGlvL1ZpZGVvIENvbmZlcmVuY2luZy4iCisjfiBtc2dzdHIgIiIKKyN+ICJEZXNjcml1IGwnZWxlbWVudCBkZSBzb3J0aWRhIHNlbGVjY2lvbmF0IHBlciBhIGxlcyBjb25mZXLDqG5jaWVzIGQnw6B1ZGlvLyIKKyN+ICJ2w61kZW8uIgorCisjfiBtc2dpZCAiRGVzY3JpYmVzIHRoZSBzZWxlY3RlZCBvdXRwdXQgZWxlbWVudCBmb3IgTXVzaWMgYW5kIE1vdmllcy4iCisjfiBtc2dzdHIgIiIKKyN+ICJEZXNjcml1IGwnZWxlbWVudCBkZSBzb3J0aWRhIHNlbGVjY2lvbmF0IHBlciBhIGxhIG3DunNpY2EgaSBsZXMgIgorI34gInBlbMK3bMOtY3VsZXMuIgorCisjfiBtc2dpZCAiRGVzY3JpYmVzIHRoZSBzZWxlY3RlZCBvdXRwdXQgZWxlbWVudC4iCisjfiBtc2dzdHIgIkRlc2NyaXUgbCdlbGVtZW50IGRlIHNvcnRpZGEgc2VsZWNjaW9uYXQuIgorCisjfiBtc2dpZCAiR1N0cmVhbWVyIGF1ZGlvc2luayBmb3IgQXVkaW8vVmlkZW8gQ29uZmVyZW5jaW5nIgorI34gbXNnc3RyICJMJ2F1ZGlvc2luayBkZWwgR1N0cmVhbWVyIHBlciBhIGxlcyBjb25mZXLDqG5jaWVzIGQnw6B1ZGlvL3bDrWRlbyIKKworI34gbXNnaWQgIkdTdHJlYW1lciBhdWRpb3NpbmsgZm9yIE11c2ljIGFuZCBNb3ZpZXMiCisjfiBtc2dzdHIgIkwnYXVkaW9zaW5rIGRlbCBHU3RyZWFtZXIgcGVyIGEgbGEgbcO6c2ljYSBpIGxlcyBwZWzCt2zDrWN1bGVzIgorCisjfiBtc2dpZCAiIgorI34gIkdTdHJlYW1lciBjYW4gcGxheSBhdWRpbyB1c2luZyBhbnkgbnVtYmVyIG9mIG91dHB1dCBlbGVtZW50cy4gU29tZSAiCisjfiAicG9zc2libGUgY2hvaWNlcyBhcmUgb3Nzc2luaywgZXNkc2luayBhbmQgYWxzYXNpbmsuIFRoZSBhdWRpb3NpbmsgY2FuIGJlICIKKyN+ICJhIHBhcnRpYWwgcGlwZWxpbmUgaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkVsIEdTdHJlYW1lciBwb3QgcmVwcm9kdWlyIGwnw6B1ZGlvIHV0aWxpdHphbnQgcXVhbHNldm9sIG5vbWJyZSBkJ2VsZW1lbnRzICIKKyN+ICJkZSBzb3J0aWRhLiBBbGd1bmVzIG9wY2lvbnMgcG9zc2libGVzIHPDs24gbCdvc3NzaW5rLCBsJ2VzZHNpbmsgaSAiCisjfiAibCdhbHNhc2luay4gTCdhdWRpb3NpbmsgcG90IHNlciB1biBjb25kdWN0ZSBwYXJjaWFsIGVuIGxsb2MgZCd1biBzb2wgIgorI34gImVsZW1lbnQuIgorCisjfiBtc2dpZCAiIgorI34gIkdTdHJlYW1lciBjYW4gcGxheSB2aWRlbyB1c2luZyBhbnkgbnVtYmVyIG9mIG91dHB1dCBlbGVtZW50cy4gU29tZSAiCisjfiAicG9zc2libGUgY2hvaWNlcyBhcmUgeHZpbWFnZXNpbmssIHhpbWFnZXNpbmssIHNkbHZpZGVvc2luayBhbmQgYWFzaW5rLiAiCisjfiAiVGhlIHZpZGVvc2luayBjYW4gYmUgYSBwYXJ0aWFsIHBpcGVsaW5lIGluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJFbCBHU3RyZWFtZXIgcG90IHJlcHJvZHVpciBlbCB2w61kZW8gdXRpbGl0emFudCBxdWFsc2V2b2wgbm9tYnJlICIKKyN+ICJkJ2VsZW1lbnRzIGRlIHNvcnRpZGEuIEFsZ3VuZXMgb3BjaW9ucyBwb3NzaWJsZXMgc8OzbiBlbCB4dmltYWdlc2luaywgZWwgIgorI34gInhpbWFnZXNpbmssIGVsIHNkbHZpZGVvc2luayBpIGwnYWFzaW5rLiBFbCB2aWRlb3NpbmsgcG90IHNlciB1biBjb25kdWN0ZSAiCisjfiAicGFyY2lhbCBlbiBsbG9jIGQndW4gc29sIGVsZW1lbnQuIgorCisjfiBtc2dpZCAiIgorI34gIkdTdHJlYW1lciBjYW4gcHV0IHZpc3VhbGl6YXRpb24gcGx1Z2lucyBpbiBhIHBpcGVsaW5lIHRvIHRyYW5zZm9ybSBhdWRpbyAiCisjfiAic3RyZWFtIGluIHZpZGVvIGZyYW1lcy4gRGVmYXVsdCBpcyBnb29tIGJ1dCBtb3JlIHZpc3VhbGl6YXRpb24gcGx1Z2lucyAiCisjfiAid2lsbCBiZSBwb3J0ZWQgc29vbi4gVGhlIHZpc3VhbGl6YXRpb24gcGx1Z2luIGNhbiBiZSBhIHBhcnRpYWwgcGlwZWxpbmUgIgorI34gImluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJFbCBHU3RyZWFtZXIgcG90IHBvc2FyIGVscyBjb25uZWN0b3JzIGRlIHZpc3VhbGl0emFjacOzIGVuIHVuIGNvbmR1Y3RlIHBlciAiCisjfiAidHJhbnNmb3JtYXIgZWwgZmx1eCBkJ8OgdWRpbyBlbiBlbHMgZm90b2dyYW1lcyBkZWwgdsOtZGVvLiBQZXIgZGVmZWN0ZSDDqXMgIgorI34gImVsIGdvb20gcGVyw7IgYXZpYXQgcydpbXBvcnRhcmFuIG3DqXMgY29ubmVjdG9ycyBkZSB2aXN1YWxpdHphY2nDsy4gRWwgIgorI34gImNvbm5lY3RvciBkZSB2aXN1YWxpdHphY2nDsyBwb3Qgc2VyIHVuIGNvbmR1Y3RlIHBhcmNpYWwgZW4gbGxvYyBkJ3VuIHNvbCAiCisjfiAiZWxlbWVudC4iCisKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiByZWNvcmQgYXVkaW8gdXNpbmcgYW55IG51bWJlciBvZiBpbnB1dCBlbGVtZW50cy4gU29tZSAiCisjfiAicG9zc2libGUgY2hvaWNlcyBhcmUgb3Nzc3JjLCBlc2RzcmMgYW5kIGFsc2FzcmMuIFRoZSBhdWRpbyBzb3VyY2UgY2FuIGJlICIKKyN+ICJhIHBhcnRpYWwgcGlwZWxpbmUgaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkVsIEdTdHJlYW1lciBwb3QgZW5yZWdpc3RyYXIgbCfDoHVkaW8gdXRpbGl0emFudCBxdWFsc2V2b2wgbm9tYnJlICIKKyN+ICJkJ2VsZW1lbnRzIGQnZW50cmFkYS4gQWxndW5lcyBvcGNpb25zIHBvc3NpYmxlcyBzw7NuIGwnb3Nzc3JjLCBsJ2VzZHNyYyBpICIKKyN+ICJsJ2Fsc2FzcmMuIExhIGZvbnQgZCfDoHVkaW8gcG90IHNlciB1biBjb25kdWN0ZSBwYXJjaWFsIGVuIGxsb2MgZCd1biBzb2wgIgorI34gImVsZW1lbnQuIgorCisjfiBtc2dpZCAiIgorI34gIkdTdHJlYW1lciBjYW4gcmVjb3JkIHZpZGVvIGZyb20gYW55IG51bWJlciBvZiBpbnB1dCBlbGVtZW50cy4gU29tZSAiCisjfiAicG9zc2libGUgY2hvaWNlcyBhcmUgdjRsc3JjIGFuZCB2aWRlb3Rlc3RzcmMuIFRoZSB2aWRlbyBzb3VyY2UgY2FuIGJlIGEgIgorI34gInBhcnRpYWwgcGlwZWxpbmUgaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkVsIEdTdHJlYW1lciBwb3QgZW5yZWdpc3RyYXIgZWwgdsOtZGVvIGRlIHF1YWxzZXZvbCBub21icmUgZCdlbGVtZW50cyAiCisjfiAiZCdlbnRyYWRhLiBBbGd1bmVzIG9wY2lvbnMgcG9zc2libGVzIHPDs24gZWwgdjRsc3JjIGkgZWwgdmlkZW90ZXN0c3JjLiBMYSAiCisjfiAiZm9udCBkZWwgdsOtZGVvIHBvdCBzZXIgdW4gY29uZHVjdGUgcGFyY2lhbCBlbiBsbG9jIGQndW4gc29sIGVsZW1lbnQuIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgYXVkaW8gc291cmNlIgorI34gbXNnc3RyICJmb250IGQnw6B1ZGlvIGRlbCBHU3RyZWFtZXIgcGVyIGRlZmVjdGUiCisKKyN+IG1zZ2lkICJkZWZhdWx0IEdTdHJlYW1lciBhdWRpb3NpbmsiCisjfiBtc2dzdHIgImF1ZGlvc2luayBkZWwgR1N0cmVhbWVyIHBlciBkZWZlY3RlIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgdmlkZW8gc291cmNlIgorI34gbXNnc3RyICJmb250IGRlIHbDrWRlbyBkZWwgR1N0cmVhbWVyIHBlciBkZWZlY3RlIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgdmlkZW9zaW5rIgorI34gbXNnc3RyICJ2aWRlb3NpbmsgZGVsIEdTdHJlYW1lciBwZXIgZGVmZWN0ZSIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIHZpc3VhbGl6YXRpb24gcGx1Z2luIgorI34gbXNnc3RyICJjb25uZWN0b3IgZGUgdmlzdWFsaXR6YWNpw7MgZGVsIEdTdHJlYW1lciBwZXIgZGVmZWN0ZSIKKworI34gbXNnaWQgImRlc2NyaXB0aW9uIGZvciBHU3RyZWFtZXIgYXVkaW9zaW5rIGZvciBBdWRpby9WaWRlbyBDb25mZXJlbmNpbmciCisjfiBtc2dzdHIgIiIKKyN+ICJkZXNjcmlwY2nDsyBkZSBsJ2F1ZGlvc2luayBkZWwgR1N0cmVhbWVyIHBlciBhIGxlcyBjb25mZXLDqG5jaWVzIGQnw6B1ZGlvLyIKKyN+ICJ2w61kZW8iCisKKyN+IG1zZ2lkICJkZXNjcmlwdGlvbiBmb3IgR1N0cmVhbWVyIGF1ZGlvc2luayBmb3IgTXVzaWMgYW5kIE1vdmllcyIKKyN+IG1zZ3N0ciAiIgorI34gImRlc2NyaXBjacOzIGRlIGwnYXVkaW9zaW5rIGRlbCBHU3RyZWFtZXIgcGVyIGEgbGEgbcO6c2ljYSBpIGxlcyBwZWzCt2zDrWN1bGVzIgorCisjfiBtc2dpZCAiZGVzY3JpcHRpb24gZm9yIGRlZmF1bHQgR1N0cmVhbWVyIGF1ZGlvc2luayIKKyN+IG1zZ3N0ciAiZGVzY3JpcGNpw7MgZGUgbCdhdWRpb3NpbmsgZGVsIEdTdHJlYW1lciBwZXIgZGVmZWN0ZSIKKworI34gbXNnaWQgImRlc2NyaXB0aW9uIGZvciBkZWZhdWx0IEdTdHJlYW1lciBhdWRpb3NyYyIKKyN+IG1zZ3N0ciAiZGVzY3JpcGNpw7MgZGUgbCdhdWRpb3NyYyBkZWwgR1N0cmVhbWVyIHBlciBkZWZlY3RlIgpkaWZmIC0tZ2l0IGEvcG8vY3MucG8gYi9wby9jcy5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDcxYjUwCi0tLSAvZGV2L251bGwKKysrIGIvcG8vY3MucG8KQEAgLTAsMCArMSw0MzMgQEAKKyMgQ3plY2ggdHJhbnNsYXRpb24gb2YgZ3N0LXBsdWdpbnMtZ29vZC4KKyMgQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIHRoZSBhdXRob3Iocykgb2YgZ3N0LXBsdWdpbnMtZ29vZC4KKyMgVGhpcyBmaWxlIGlzIHB1dCBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMKKyMgTWlsb3NsYXYgVHJtYWMgPG1pdHJAdm9sbnkuY3o+LCAyMDA0LgorIyBQZXRyIEtvdmFyIDxwa25iZUB2b2xueS5jej4sIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEuCisjIE1hcmVrIMSMZXJub2Nrw70gPG1hcmVrQG1hbmV0LmN6PiwgMjAxMywgMjAxNSwgMjAxNi4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QtMS43LjJcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxNi0wMi0yNyAxNjo0MCswMTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBNYXJlayDEjGVybm9ja8O9IDxtYXJla0BtYW5ldC5jej5cbiIKKyJMYW5ndWFnZS1UZWFtOiBDemVjaCA8dHJhbnNsYXRpb24tdGVhbS1jc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+XG4iCisiTGFuZ3VhZ2U6IGNzXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0zOyBwbHVyYWw9KG49PTEpID8gMCA6IChuPj0yICYmIG48PTQpID8gMSA6IDI7XG4iCisiWC1HZW5lcmF0b3I6IEd0cmFuc2xhdG9yIDIuOTEuNlxuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICJTZXJ2ZXIgSmFjayBuZWJ5bCBuYWxlemVuIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICJTZWxoYWxvIGRla8OzZG92w6Fuw60gb2Jyw6F6a3UgSlBFRyIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAi4oCeJXPigJwgb2Qg4oCeJXPigJwiCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIk5lemRhxZlpbG8gc2Ugc3BvamVuw60gc2Ugc2VydmVyZW0iCisKK21zZ2lkICJObyBVUkwgc2V0LiIKK21zZ3N0ciAiTmVuw60gbmFzdGF2ZW5hIMW+w6FkbsOhIGFkcmVzYSBVUkwuIgorCittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJOZXpkYcWZaWwgc2UgcMWZZWtsYWQgbsOhenZ1IHNlcnZlcnUuIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIk5lemRhxZlpbG8gc2UgbmF2w6F6w6Fuw60gc3BvamVuw60gc2Ugc2VydmVyZW0uIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAiU2VsaGFsbyBuYXN0YXZlbsOtIHphYmV6cGXEjWVuw6lobyBwxZlpcG9qZW7DrS4iCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICJEb8WhbG8gayBjaHlixJsgc8OtdMSbIG5lYm8gc2VydmVyIG5lb8SNZWvDoXZhbsSbIHVrb27EjWlsIHNwb2plbsOtLiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiU2VydmVyIG9kZXNsYWwgY2h5Ym7DoSBkYXRhLiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICJTZXJ2ZXIgbmVwb2Rwb3J1amUgcMWZZXNrYWtvdsOhbsOtLiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAixb3DoWRuw70gbmVibyBuZXBsYXRuw70genZ1a292w70gdnN0dXAsIHByb3VkIEFWSSBidWRlIHBvxaFrb3plbi4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIlRlbnRvIHNvdWJvciBuZW9ic2FodWplIGhyYXRlbG7DqSBwcm91ZHkuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJUZW50byBzb3Vib3IgamUgbmVwbGF0bsO9IGEgbmVsemUgamVqIHDFmWVocsOhdC4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiTmVsemUgcMWZZWhyw6F0IHByb3VkLCBwcm90b8W+ZSBqZSDFoWlmcm92w6FuIHBvbW9jw60gRFJNIFBsYXlSZWFkeS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIlRlbnRvIHNvdWJvciBqZSBwb8Wha296ZW4gYSBuZWx6ZSBqZWogcMWZZWhyw6F0LiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiTmVwbGF0bsOhIGF0b21pY2vDoSB2ZWxpa29zdC4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIlRlbnRvIHNvdWJvciBuZW7DrSDDunBsbsO9IGEgbmVsemUgamVqIHDFmWVocsOhdC4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIlZpZGVvIHYgdG9tdG8gc291Ym9ydSBzZSBuZW11c8OtIHDFmWVocsOhdCBzcHLDoXZuxJsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIlRlbnRvIHNvdWJvciBvYnNhaHVqZSBwxZnDrWxpxaEgbW5vaG8gcHJvdWTFry4gUMWZZWhyw6F2w6Egc2UgcG91emUgcHJ2bsOtICVkIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyJOZWJ5bCBuYWxlemVuIMW+w6FkbsO9IHBvZHBvcm92YW7DvSBwcm91ZC4gQnVkZSBwYXRybsSbIG51dG7DqSBuYWluc3RhbG92YXQgIgorInrDoXN1dm7DvSBtb2R1bCByb3rFocOtxZllbsOtIEdTdHJlYW1lciBSVFNQIHBybyBtdWx0aW1lZGnDoWxuw60gcHJvdWR5IFJlYWwuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisiTmVieWwgbmFsZXplbiDFvsOhZG7DvSBwb2Rwb3JvdmFuw70gcHJvdWQuIFBhdHJuxJsgYnVkZSBudXRuw6kgcG92b2xpdCB2w61jZSAiCisicMWZZW5vc292w71jaCBwcm90b2tvbMWvLCBqaW5hayBuZWpzcMOtxaEgYnVkZSBzY2jDoXpldCBwb3TFmWVibsO9IHrDoXN1dm7DvSBtb2R1bCAiCisicm96xaHDrcWZZW7DrSBHU3RyZWFtZXIgUlRTUC4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisiWnZ1a292w6kgemHFmcOtemVuw60gbmVsemUgb3RldsWZw610IHBybyBwxZllaHLDoXbDoW7DrS4gWmHFmcOtemVuw60gamUgcG91xb7DrXbDoW5vIGppbm91ICIKKyJhcGxpa2Fjw60uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJadnVrb3bDqSB6YcWZw616ZW7DrSBuZWx6ZSBvdGV2xZnDrXQgcHJvIHDFmWVocsOhdsOhbsOtLiBOZW3DoXRlIG9wcsOhdm7Em27DrSBrIG90ZXbFmWVuw60gIgorInphxZnDrXplbsOtLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICJadnVrb3bDqSB6YcWZw616ZW7DrSBuZWx6ZSBvdGV2xZnDrXQgcHJvIMSNdGVuw60uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIk5lemRhxZlpbG8gc2Ugb3RldsWZZW7DrSB6dnVrb3bDqWhvIHphxZnDrXplbsOtIHBybyBwxZllaHLDoXbDoW7DrS4gVGF0byB2ZXJ6ZSBPcGVuICIKKyJTb3VuZCBTeXN0ZW0gbmVuw60gcMWZw61zbHXFoW7DvW0gcHJ2a2VtIHBvZHBvcm92w6FuYS4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiUMWZZWhyw6F2w6Fuw60gbmVuw60gdMOtbXRvIHp2dWtvdsO9bSB6YcWZw616ZW7DrW0gcG9kcG9yb3bDoW5vLiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAiQ2h5YmEgcMWZZWhyw6F2w6Fuw60genZ1a3UuIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJUb3RvIHp2dWtvdsOpIHphxZnDrXplbsOtIG5lcG9kcG9ydWplIG5haHLDoXbDoW7DrS4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJDaHliYSBwxZlpIG5haHLDoXbDoW7DrSB6ZSB6dnVrb3bDqWhvIHphxZnDrXplbsOtLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIlp2dWtvdsOpIHphxZnDrXplbsOtIG5lbHplIG90ZXbFmcOtdCBwcm8gbmFocsOhdsOhbsOtLiBOZW3DoXRlIG9wcsOhdm7Em27DrSBrIG90ZXbFmWVuw60gIgorInphxZnDrXplbsOtLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiWnZ1a292w6kgemHFmcOtemVuw60gbmVsemUgb3RldsWZw610IHBybyBuYWhyw6F2w6Fuw60uIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgIk5lYnlsbyBuYWxlemVubyB6YcWZw616ZW7DrSBDb3JlQXVkaW8iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIk5lbHplIG90ZXbFmcOtdCB6YcWZw616ZW7DrSBDb3JlQXVkaW8iCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICJaZHJvaiBuYWhyw6F2w6Fuw60iCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICJNaWtyb2ZvbiIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIkxpbmtvdsO9IHZzdHVwIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIkludGVybsOtIENEIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIlZzdHVwIFNQRElGIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIlZzdHVwIEFVWCAxIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIlZzdHVwIEFVWCAyIgorCittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIktvZGVrb3bDoSBzbXnEjWthIgorCittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICJTbXnEjWthIFN1blZUUyIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiSGxhc2l0b3N0IgorCittc2dpZCAiR2FpbiIKK21zZ3N0ciAiWmVzw61sZW7DrSIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIk1vbml0b3IiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJaYWJ1ZG92YW7DvSByZXByb2R1a3RvciIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiU2x1Y2jDoXRrbyIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICJMaW5rb3bDvSB2w71zdHVwIgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICJWw71zdHVwIFNQRElGIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICJWw71zdHVwIEFVWCAxIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICJWw71zdHVwIEFVWCAyIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkNoeWJhIHDFmWkgxI10ZW7DrSAlZCBiYWp0xa8gbmEgemHFmcOtemVuw60g4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisiU2VsaGFsbyB2eXR2b8WZZW7DrSBzZXpuYW11IG1vxb5uw71jaCBmb3Jtw6F0xa8gdmlkZWEsIHNlIGt0ZXLDvW1pIHVtw60gemHFmcOtemVuw60gIgorIuKAniVz4oCcIHByYWNvdmF0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICJOZXpkYcWZaWxvIHNlIG1hcG92w6Fuw60gdnlyb3Zuw6F2YWPDrSBwYW3Em3RpIHplIHphxZnDrXplbsOtIOKAniVz4oCcIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICJPdmxhZGHEjSB6YcWZw616ZW7DrSDigJ4lc+KAnCBuZXBvZHBvcnVqZSBWL1YgbWV0b2R1ICVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAiT3ZsYWRhxI0gemHFmcOtemVuw60g4oCeJXPigJwgbmVwb2Rwb3J1amUgxb7DoWRub3Ugem7DoW1vdSBWL1YgbWV0b2R1LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICJaYcWZw616ZW7DrSDigJ4lc+KAnCBqZSB6YW5lcHLDoXpkbsSbbm8iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIlphxZnDrXplbsOtIOKAniVz4oCcIG5ldW3DrSB6YWNoeXTDoXZhdCB2IHJvem3Em3J1ICVk4oCvw5figK8lZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiWmHFmcOtemVuw60g4oCeJXPigJwgbmV1bcOtIHphY2h5dMOhdmF0IHYgdG9tdG8ga29ua3LDqXRuw61tIGZvcm3DoXR1IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIlphxZnDrXplbsOtIOKAniVz4oCcIG5lcG9kcG9ydWplIG5lc291c2Vkw61jw60gc2xvxb5reSBvYnJhenUiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICJOZXpkYcWZaWxvIHNlIHpqacWhdMSbbsOtIHBhcmFtZXRyxa8gbmEgemHFmcOtemVuw60g4oCeJXPigJwiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIlZpZGVvemHFmcOtemVuw60gbmVwxZlpamFsbyBub3bDqSBuYXN0YXZlbsOtIHNuw61ta292w6kgcnljaGxvc3RpLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIlZpZGVvemHFmcOtemVuw60gbmVwb3NreXR1amUgdsO9c3R1cG7DrSBmb3Jtw6F0LiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICJWaWRlb3phxZnDrXplbsOtIHNkxJtsaWxvIG5lcGxhdG7DqSByb3ptxJtyeS4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiVmlkZW96YcWZw616ZW7DrSBwb3XFvsOtdsOhIG5lcG9kcG9yb3Zhbm91IG1ldG9kdSBwcm9rbMOhZMOhbsOtLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICJWaWRlb3phxZnDrXplbsOtIHBvdcW+w612w6EgbmVwb2Rwb3JvdmFuw70gcmFzdHJvdsO9IGZvcm3DoXQuIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIlNlbGhhbG8gbmFzdGF2ZW7DrSB2bml0xZluw60gc3BvbGXEjW7DqSB2eXJvdm7DoXZhY8OtIHBhbcSbdGkuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICJWaWRlb3phxZnDrXplbsOtIG5lZG9wb3J1xI11amUgbmlqYWtvdSB2ZWxpa29zdCB2eXJvdm7DoXZhY8OtIHBhbcSbdGkuIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAiTmVleGlzdHVqZSDFvsOhZG7DvSBzcG9sZcSNbsO9IHByb3VkIGRhdCwgemUga3RlcsOpaG8gYnkgxaFsbyBpbXBvcnRvdmF0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiU2VsaGFsbyB6amnFoXTEm27DrSBuYXN0YXZlbsOtIHR1bmVydSAlZCB1IHphxZnDrXplbsOtIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJDaHliYSBwxZlpIHpqacWhxaVvdsOhbsOtIHNjaG9wbm9zdMOtIHphxZnDrXplbsOtIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIlphxZnDrXplbsOtIOKAniVz4oCcIG5lbsOtIHR1bmVyLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIlNlbGhhbG8gesOtc2vDoW7DrSByw6FkaW92w6lobyB2c3R1cHUgdSB6YcWZw616ZW7DrSDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJOZXpkYcWZaWxvIHNlIG5hc3RhdmVuw60gdnN0dXB1ICVkIHUgemHFmcOtemVuw60g4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJTZWxoYWxhIHptxJtuYSBzdGF2dSB6YXBudXTDrS92eXBudXTDrSB6dnVrdSB1IHphxZnDrXplbsOtIOKAniVz4oCcLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiU2VsaGFsbyBwxZlpZMSbbGVuw60gcG/FvmFkb3ZhbsOpIHBhbcSbdGkuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIlNlbGhhbG8gcMWZaWTEm2xlbsOtIHBvxb5hZG92YW7DqSBwYW3Em3RpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJQxZlldm9kbsOtayBuYSB6YcWZw616ZW7DrSDigJ4lc+KAnCBuZXBvZHBvcnVqZSB2c3R1cG7DrSBmb3Jtw6F0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICJQxZlldm9kbsOtayBuYSB6YcWZw616ZW7DrSDigJ4lc+KAnCBuZXBvZHBvcnVqZSB2w71zdHVwbsOtIGZvcm3DoXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIktvZMOpciBuYSB6YcWZw616ZW7DrSDigJ4lc+KAnCBuZXBvZHBvcnVqZSB2c3R1cG7DrSBmb3Jtw6F0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiS29kw6lyIG5hIHphxZnDrXplbsOtIOKAniVz4oCcIG5lcG9kcG9ydWplIHbDvXN0dXBuw60gZm9ybcOhdCIKKworbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICJTZWxoYWxvIHNwdcWhdMSbbsOtIHZsw6FrbmEgZGVrb2TDqXJ1LiIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiU2VsaGFsbyB6cHJhY292w6Fuw60gc27DrW1rdS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisiQ2h5YmEgcMWZaSB6w61za8OhdsOhbsOtIGluZm9ybWFjw60gbyBzY2hvcG5vc3RlY2ggdSB6YcWZw616ZW7DrSDigJ4lc+KAnDogTmVqZWRuw6Egc2UgbyAiCisib3ZsYWRhxI0gdjRsMi4gWmtvbnRyb2x1anRlLCB6ZGEgc2UgbmVqZWRuw6EgbyBvdmxhZGHEjSB2NGwxLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIk5lemRhxZlpbG8gc2UgZG90w6F6w6Fuw60gbmEgdmxhc3Rub3N0aSB2c3R1cHUgJWQgdSB6YcWZw616ZW7DrSDigJ4lc+KAnCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJTZWxoYWxvIHpqacWhdMSbbsOtIG5hc3RhdmVuw60gdHVuZXJ1ICVkIHUgemHFmcOtemVuw60g4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmV6ZGHFmWlsbyBzZSBkb3TDoXrDoW7DrSBuYSBub3JtdSBuYSB6YcWZw616ZW7DrSDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5lemRhxZlpbG8gc2UgemppxaF0xJtuw60gdmxhc3Rub3N0w60gb3Zsw6FkYWPDrWNoIHBydmvFryB1IHphxZnDrXplbsOtIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJOZXpkYcWZaWxvIHNlIHJvenBvem5hdCB6YcWZw616ZW7DrSDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiVG90byBuZW7DrSB6YcWZw616ZW7DrSDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJOZXpkYcWZaWxvIHNlIG90ZXbFmcOtdCB6YcWZw616ZW7DrSDigJ4lc+KAnCBwcm8gxI10ZW7DrSBhIHrDoXBpcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICJaYcWZw616ZW7DrSDigJ4lc+KAnCBuZW7DrSB6YWNoeXTDoXZhY8OtbSB6YcWZw616ZW7DrW0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICJaYcWZw616ZW7DrSDigJ4lc+KAnCBuZW7DrSB2w71zdHVwbsOtbSB6YcWZw616ZW7DrW0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICJaYcWZw616ZW7DrSDigJ4lc+KAnCBuZW7DrSB6YcWZw616ZW7DrW0gTTJNLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiTmV6ZGHFmWlsbyBzZSBkdXBsaWtvdmF0IHphxZnDrXplbsOtIOKAniVz4oCcIHBybyDEjXRlbsOtIGEgesOhcGlzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiU2VsaGFsbyBuYXN0YXZlbsOtIG5vcm15IHUgemHFmcOtemVuw60g4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiU2VsaGFsbyB6amnFoXTEm27DrSBha3R1w6FsbsOtIGZyZWt2ZW5jZSB0dW5lcnUgdSB6YcWZw616ZW7DrSDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiU2VsaGFsbyBuYXN0YXZlbsOtIGFrdHXDoWxuw60gZnJla3ZlbmNlIHR1bmVydSB1IHphxZnDrXplbsOtIOKAniVz4oCcIG5hICVsdSBIei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiU2VsaGFsbyB6amnFoXTEm27DrSBzw61seSBzaWduw6FsdSB1IHphxZnDrXplbsOtIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiU2VsaGFsbyB6amnFoXTEm27DrSBob2Rub3R5IHUgb3Zsw6FkYWPDrWhvIHBydmt1ICVkIG5hIHphxZnDrXplbsOtIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiU2VsaGFsbyBuYXN0YXZlbsOtIGhvZG5vdHkgJWQgdSBvdmzDoWRhY8OtaG8gcHJ2a3UgJWQgbmEgemHFmcOtemVuw60g4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiU2VsaGFsbyB6w61za8OhbsOtIGFrdHXDoWxuw61obyB2c3R1cHUgbmEgemHFmcOtemVuw60g4oCeJXPigJwuIE1vxb5uw6Egc2UgamVkbsOhIG8gIgorInJhZGlvcMWZaWrDrW1hxI0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJTZWxoYWxvIHrDrXNrw6Fuw60gYWt0dcOhbG7DrWhvIHbDvXN0dXB1IG5hIHphxZnDrXplbsOtIOKAniVz4oCcLiBNb8W+bsOhIHNlIGplZG7DoSBvICIKKyJyYWRpb3DFmWlqw61tYcSNIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIlNlbGhhbG8gbmFzdGF2ZW7DrSB2w71zdHVwdSAlZCBuYSB6YcWZw616ZW7DrSAlcy4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICJabcSbbmEgcm96bGnFoWVuw60gemEgYsSbaHUgemF0w61tIG5lbsOtIHBvZHBvcm92w6FuYS4iCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIk5lbsOtIG1vxb5uw6kgZnVuZ292YXQgYmV6IGhvZGluIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBzdHJlYW0gZXJyb3IuIgorI34gbXNnc3RyICJWbml0xZluw60gY2h5YmEgZGF0b3bDqWhvIHByb3VkdS4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICJWbml0xZluw60gY2h5YmEgZGF0b3bDqWhvIHRva3UuIgpkaWZmIC0tZ2l0IGEvcG8vZGEucG8gYi9wby9kYS5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODcyYzIxCi0tLSAvZGV2L251bGwKKysrIGIvcG8vZGEucG8KQEAgLTAsMCArMSw0MzggQEAKKyMgRGFuaXNoIHRyYW5zbGF0aW9uIG9mIGdzdC1wbHVnaW5zLWdvb2QuCisjIENvcHlyaWdodCAoQykgMjAxNiBnc3QuCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSBnc3QtcGx1Z2lucy1nb29kIHBhY2thZ2UuCisjIE1vZ2VucyBKYWVnZXIgPG1vZ2Vuc0BqYWVnZXIudGY+LCAyMDA3LgorIyBKb2UgSGFuc2VuIDxqb2VkYWx0b24yQHlhaG9vLmRrPiwgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiwgMjAxMywgMjAxNCwgMjAxNSwgMjAxNi4KKyMKKyMgZ2FpbiAtPiBmb3Jow7hqZWxzZQorIyBib29zdCAtPiDDuGduaW5nPworIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZC0xLjcuMlxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDE2LTAzLTI3IDIzOjU0KzAyMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEpvZSBIYW5zZW4gPGpvZWRhbHRvbjJAeWFob28uZGs+XG4iCisiTGFuZ3VhZ2UtVGVhbTogRGFuaXNoIDxkYW5za0BkYW5zay1ncnVwcGVuLmRrPlxuIgorIkxhbmd1YWdlOiBkYVxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICJKYWNrLXNlcnZlciBibGV2IGlra2UgZnVuZGV0IgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICJNaXNseWtrZWRlcyBpIGF0IGFma29kZSBKUEVHLWJpbGxlZGUiCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIsK7JXPCqyBhZiDCuyVzwqsiCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIkt1bm5lIGlra2UgZm9yYmluZGUgdGlsIHNlcnZlciIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJJbmdlbiBhZHJlc3NlIGFuZ2l2ZXQuIgorCittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJLdW5uZSBpa2tlIHNsw6Ugc2VydmVybmF2biBvcC4iCisKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiS3VubmUgaWtrZSBza2FiZSBrb250YWt0IHRpbCBzZXJ2ZXJlbi4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICJPcHPDpnRuaW5nIGFmIHNpa2tlciBmb3JiaW5kZWxzZSBtaXNseWtrZWRlcy4iCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICIiCisiRGVyIG9wc3RvZCBlbiBuZXR2w6Zya3NmZWpsLCBlbGxlciBzZXJ2ZXJlbiBsdWtrZWRlIHV2ZW50ZXQgZm9yYmluZGVsc2VuLiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiU2VydmVyIHNlbmR0ZSB1Z3lsZGlnZSBkYXRhLiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICJTZXJ2ZXIgdW5kZXJzdMO4dHRlciBpa2tlIHPDuGduaW5nLiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAiSW5nZW4gZWxsZXIgZGVmZWt0IGluZGRhdGFseWQsIEFWSS1zZWt2ZW5zIHZpbCBibGl2ZSDDuGRlbGFndC4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIkRlbm5lIGZpbCBpbmRlaG9sZGVyIGluZ2VuIHNwaWxiYXIgc3Ryw7htLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRGVubmUgZmlsIGVyIHVmdWxkc3TDpm5kaWcgb2cga2FuIGlra2UgYWZzcGlsbGVzLiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICJLYW4gaWtrZSBhZnNwaWxsZSBzdHLDuG0sIGRhIGRlbiBlciBrcnlwdGVyZXQgbWVkIFBsYXlSZWFkeSBEUk0uIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJEZW5uZSBmaWwgZXIgw7hkZWxhZ3Qgb2cga2FuIGlra2UgYWZzcGlsbGVzLiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiVWd5bGRpZyBhdG9tc3TDuHJyZWxzZS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkRlbm5lIGZpbCBlciB1ZnVsZHN0w6ZuZGlnIG9nIGthbiBpa2tlIGFmc3BpbGxlcy4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIlZpZGVvZW4gaSBkZW5uZSBmaWwgYWZzcGlsbGVzIG3DpXNrZSBpa2tlIGtvcnJla3QuIgorCisjIGh2YWQgZXIgJWQgaSBkZXR0ZSBwcm9ncmFtPyBVbWlkZGVsYmFydCB2aWxsZSBqZWcgdHJvIGRldCBza3VsbGUKKyMgaGVkZGUsICJBZnBpbGxlciBrdW4gZsO4cnN0ZSAlZCIgbWVuIGRldCBrb21tZXIgc2VsdmbDuGxnZWxpZyBhbiBww6UgCisjIHNhbW1lbmjDpm5nZW4uCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIkRlbm5lIGZpbCBpbmRlaG9sZGVyIGZvciBtYW5nZSBzdHLDuG1tZS4gQWZzcGlsIGbDuHJzdCBrdW4gJWQiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorIkluZ2VuIHVuZGVyc3TDuHR0ZXQgc3Ryw7htIGJsZXYgZnVuZGV0LiBEdSBza2FsIG3DpXNrZSBpbnN0YWxsZXJlIGV0ICIKKyJ1ZHZpZGVsc2VzbW9kdWwgZm9yIEdTdHJlYW1lciBSVFNQIHRpbCBSZWFsIG1lZGlhLXN0csO4bW1lLiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorIkluZ2VuIHVuZGVyc3TDuHR0ZXQgc3Ryw7htIGJsZXYgZnVuZGV0LiBEdSBtYW5nbGVyIG3DpXNrZSBhdCB0aWxsYWRlIHlkZXJsaWdlcmUgIgorInRyYW5zcG9ydHByb3Rva29sbGVyIGVsbGVyIG1hbmdsZXIgbcOlc2tlIGRldCBrb3JyZWt0ZSB1ZHZpZGVsc2VzbW9kdWwgdGlsICIKKyJHU3RyZWFtZXIgUlRTUC4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisiS3VubmUgaWtrZSDDpWJuZSBseWRlbmhlZCB0aWwgYWZzcGlsbmluZy4gRW5oZWRlbiBhbnZlbmRlcyBhZiBldCBhbmRldCAiCisicHJvZ3JhbS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIkt1bm5lIGlra2Ugw6VibmUgbHlkZW5oZWQgdGlsIGFmc3BpbG5pbmcuIER1IGhhciBpa2tlIHJldHRpZ2hlZCB0aWwgYXQgw6VibmUgIgorImVuaGVkZW4uIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIkt1bm5lIGlra2Ugw6VibmUgZW5oZWQgdGlsIGFmc3BpbG5pbmcuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIkt1bm5lIGlra2Ugw6VibmUgbHlkZW5oZWQgdGlsIGFmc3BpbG5pbmcuIERlbm5lIHZlcnNpb24gYWYgT3BlbiBTb3VuZCBTeXN0ZW0gIgorImVyIGlra2UgdW5kZXJzdMO4dHRldCBhZiBkZXR0ZSBlbGVtZW50LiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJBZnNwaWxuaW5nIGVyIGlra2UgdW5kZXJzdMO4dHRldCBhZiBkZW5uZSBseWRlbmhlZC4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIkZlamwgdmVkIGx5ZGFmc3BpbG5pbmcuIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJPcHRhZ2Vsc2UgZXIgaWtrZSB1bmRlcnN0w7h0dGV0IGFmIGRlbm5lIGx5ZGVuaGVkLiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkZlamwgdmVkIG9wdGFnZWxzZSBmcmEgbHlkZW5oZWQuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiS3VubmUgaWtrZSDDpWJuZSBseWRlbmhlZCB0aWwgb3B0YWdlbHNlLiBEdSBoYXIgaWtrZSByZXR0aWdoZWQgdGlsIGF0IMOlYm5lICIKKyJlbmhlZGVuLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiS3VubmUgaWtrZSDDpWJuZSBseWRlbmhlZCB0aWwgb3B0YWdlbHNlLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICJDb3JlQXVkaW8tZW5oZWQgYmxldiBpa2tlIGZ1bmRldCIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiQ29yZUF1ZGlvLWVuaGVkIGt1bm5lIGlra2Ugw6VibmVzIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAiT3B0YWdlbHNlc2tpbGRlIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWlrcm9mb24iCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICJMaW5qZSBpbmQiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiSW50ZXJuIGNkIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIlNQRElGIGluZCIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICJBVVggMSBpbmQiCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAiQVVYIDIgaW5kIgorCittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIkNvZGVjLWxvb3BiYWNrIgorCittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICJTdW5WVFMtbG9vcGJhY2siCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIkx5ZHN0eXJrZSIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIkZvcmjDuGplbHNlIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiTW9uaXRvciIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIkluZGJ5Z2dldCBow7hqdGFsZXIiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIkhvdmVkdGVsZWZvbiIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICJMaW5qZSB1ZCIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiU1BESUYgdWQiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIkFVWCAxIHVkIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICJBVVggMiB1ZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIgorbXNnc3RyICJGZWpsIHZlZCBsw6ZzbmluZyBhZiAlZCBieXRlIHDDpSBlbmhlZCDCuyVzwqsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisiS3VubmUgaWtrZSBudW1tZXJlcmUgbXVsaWcgdmlkZW9mb3JtYXRlciBzb20gZW5oZWQgwrslc8KrIGthbiBmdW5nZXJlIG1lZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiS3VubmUgaWtrZSBhZmJpbGRlIG1lbGxlbWxhZ2VyIGZyYSBlbmhlZCDCuyVzwqsiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIkRyaXZlcmVuIHRpbCBlbmhlZCDCuyVzwqsgdW5kZXJzdMO4dHRlciBpa2tlIElPLW1ldG9kZW4gJWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICJEcml2ZXJlbiB0aWwgZW5oZWQgwrslc8KrIHVuZGVyc3TDuHR0ZXIgaW5nZW4ga2VuZHQgSU8tbWV0b2RlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICJFbmhlZGVuIMK7JXPCqyBlciBvcHRhZ2V0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICJFbmhlZGVuIMK7JXPCqyBrYW4gaWtrZSBvcHRhZ2UgbWVkICVkeCVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICJFbmhlZGVuIMK7JXPCqyBrYW4gaWtrZSBvcHRhZ2UgaSBkZXQgYW5naXZuZSBmb3JtYXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiRW5oZWRlbiDCuyVzwqsgdW5kZXJzdMO4dHRlciBpa2tlIHBsYW5lciwgZGVyIGlra2UgaMOmbmdlciBzYW1tZW4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICJLdW5uZSBpa2tlIGhlbnRlIHBhcmFtZXRyZSBmcmEgZW5oZWQgwrslc8KrIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICJWaWRlb2VuaGVkZW4gYWNjZXB0ZXJlZGUgaWtrZSBueSBpbmRzdGlsbGluZyBmb3IgYmlsbGVkcmF0ZS4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICJWaWRlb2VuaGVkZW4gYW5nYXYgaWtrZSB1ZGRhdGFmb3JtYXQuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIlZpZGVvZW5oZWQgcmV0dXJuZXJlZGUgdWd5bGRpZ2UgZGltZW5zaW9uZXIuIgorCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSW50ZXJsYWNlZF92aWRlbworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICJWaWRlb2VuaGVkZXIgYnJ1Z2VyIGVuIGludGVybGFjZS1tZXRvZGUsIGRlciBpa2tlIGVyIHVuZGVyc3TDuHR0ZXQuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIlZpZGVvZW5oZWRlciBicnVnZXIgZXQgYmlsbGVkcHVua3RzZm9ybWF0LCBkZXIgaWtrZSBlciB1bmRlcnN0w7h0dGV0LiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICJLdW5uZSBpa2tlIGtvbmZpZ3VyZXJlIGludGVybiBtZWxsZW1sYWdlcmvDuC4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIlZpZGVvZW5oZWQgZm9yZXNsb2cgaWtrZSBlbiBtZWxsZW1sYWdlcnN0w7hycmVsc2UuIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAiSW5nZW4gbmVkc3Ryw7htc2vDuCBhdCBpbXBvcnRlcmUgZnJhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiSGVudG5pbmcgYWYgaW5kc3RpbGxpbmdlciBmb3IgdHVuZXIgJWQgcMOlIGVuaGVkIMK7JXPCqyBmZWpsZWRlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJGZWpsIHVuZGVyIGhlbnRuaW5nIGFmIGthcGFjaXRldGVyIGZvciBlbmhlZCDCuyVzwqsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiRW5oZWQgwrslc8KrIGVyIGlra2UgZW4gdHVuZXIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiS3VubmUgaWtrZSBoZW50ZSByYWRpb2luZGRhdGEgZm9yIGVuaGVkIMK7JXPCqy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJLdW5uZSBpa2tlIHPDpnR0ZSBpbmRkYXRhICVkIGZvciBlbmhlZCAlcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkt1bm5lIGlra2Ugw6ZuZHJlIHRpbHN0YW5kIGZvciB0w6Zuay9zbHV0IGZvciBlbmhlZCDCuyVzwqsuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICJLdW5uZSBpa2tlIGFsbG9rZXJlIGRlbiBrcsOmdmVkZSBodWtvbW1lbHNlLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICJLdW5uZSBpa2tlIGFsbG9rZXJlIGRlbiBrcsOmdmVkZSBodWtvbW1lbHNlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisiS29udmVydGVyaW5nc3Byb2dyYW0gcMOlIGVuaGVkICVzIGhhciBpa2tlIGV0IHVuZGVyc3TDuHR0ZXQgaW5kZGF0YWZvcm1hdCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiS29udmVydGVyaW5nc3Byb2dyYW0gcMOlIGVuaGVkICVzIGhhciBpa2tlIGV0IHVuZGVyc3TDuHR0ZXQgdWRkYXRhZm9ybWF0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJLb2RlciBww6UgZW5oZWQgJXMgaGFyIGlra2UgZXQgdW5kZXJzdMO4dHRldCBpbmRkYXRhZm9ybWF0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiS29kZXIgcMOlIGVuaGVkICVzIGhhciBpa2tlIGV0IHVuZGVyc3TDuHR0ZXQgdWRkYXRhZm9ybWF0IgorCittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIkt1bm5lIGlra2Ugc3RhcnRlIGFma29kbmluZyBhZiB0csOlZC4iCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIkt1bm5lIGlra2UgYmVoYW5kbGUgYmlsbGVkLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyJGZWpsIHZlZCBoZW50bmluZyBhZiBlZ2Vuc2thYmVyIGZvciBlbmhlZCDCuyVzwqs6IERldCBlciBpa2tlIGVuIHY0MTIgZHJpdmVyLiAiCisiS29udHJvbGxlciBvbSBkZXQgZXIgZW4gdjQxMSBkcml2ZXIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiTGlzdG5pbmcgYWYgaW5kZGF0YS1hdHRyaWJ1dHRlciBmb3IgJWQgaSBlbmhlZCAlcyBmZWpsZWRlIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkhlbnRuaW5nIGFmIGluZHN0aWxsaW5nZXIgZm9yIHR1bmVyICVkIHDDpSBlbmhlZCDCuyVzwqsgZmVqbGVkZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICJMaXN0bmluZyBhZiBzdGFuZGFyZCBww6UgZW5oZWQgwrslc8KrIGZlamxlZGUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJIZW50bmluZyBhZiBrb250cm9sYXR0cmlidXR0ZXIgZm9yIGVuaGVkIMK7JXPCqyBmZWpsZWRlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJLYW4gaWtrZSBpZGVudGlmaWNlcmUgZW5oZWQgwrslc8KrLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICJEZXR0ZSBlciBpa2tlIGVuIGVuaGVkcyDCuyVzwqsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiS3VubmUgaWtrZSB0aWxnw6UgZW5oZWQgwrslc8KrLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIkVuaGVkIMK7JXPCqyBlciBpa2tlIGVuIG9wdGFnZWVuaGVkLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiRW5oZWQgwrslc8KrIGVyIGlra2UgZW4gdWRkYXRhZW5oZWQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICJFbmhlZCDCuyVzwqsgZXIgaWtrZSBlbiBNMk0tZW5oZWQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJLdW5uZSBpa2tlIGR1cCBlbmhlZCDCuyVzwqsgZm9yIGzDpnNuaW5nIG9nIHNrcml2bmluZy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkluZHN0aWxsaW5nIGFmIHN0YW5kYXJkIGZvciBlbmhlZCDCuyVzwqsgZmVqbGVkZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJLdW5uZSBpa2tlIGhlbnRlIG51dsOmcmVuZGUgdHVuZXItZnJla3ZlbnMgZm9yIGVuaGVkIMK7JXPCqy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiS3VubmUgaWtrZSBzw6Z0dGUgbnV2w6ZyZW5kZSB0dW5lci1mcmVrdmVucyBmb3IgZW5oZWQgwrslc8KrIHRpbCAlbHUgSHouIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkt1bm5lIGlra2UgaGVudGUgc2lnbmFsc3R5cmtlIGZvciBlbmhlZCDCuyVzwqsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJLdW5uZSBpa2tlIGhlbnRlIHbDpnJkaSBhZiBrb250cm9sICVkIGZvciBlbmhlZCDCuyVzwqsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJLdW5uZSBpa2tlIHPDpnR0ZSB2w6ZyZGkgJWQgcMOlIGtvbnRyb2wgJWQgZm9yIGVuaGVkIMK7JXPCqy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJLdW5uZSBpa2tlIGhlbnRlIG51dsOmcmVuZGUgaW5kZGF0YSBmb3IgZW5oZWQgwrslc8KrLiBNw6Vza2UgZXIgZGV0IGVuIHJhZGlvZW5oZWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIkt1bm5lIGlra2UgaGVudGUgbnV2w6ZyZW5kZSB1ZGRhdGEgZm9yIGVuaGVkIMK7JXPCqy4gTcOlc2tlIGVyIGRldCBlbiByYWRpb2VuaGVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIkt1bm5lIGlra2Ugc8OmdHRlIHVkZGF0YSAlZCBmb3IgZW5oZWQgJXMuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiw4ZuZHJpbmcgYWYgb3Bsw7hzbmluZyB1bmRlciBrw7hyc2VsIGVyIGVuZG51IGlra2UgdW5kZXJzdMO4dHRldC4iCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIkthbiBpa2tlIGZ1bmdlcmUgdWRlbiBldCB1ciIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAiSW50ZXJuIGRhdGFzdHLDuG1zZmVqbC4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICJJbnRlcm4gZGF0YXN0csO4bXNmZWpsLiIKKworI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAiRW5oZWRlbiDCuyVzwqsgdW5kZXJzdMO4dHRlciBpa2tlIHZpZGVvb3B0YWdlbHNlIgpkaWZmIC0tZ2l0IGEvcG8vZGUucG8gYi9wby9kZS5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDNlMmM2Ci0tLSAvZGV2L251bGwKKysrIGIvcG8vZGUucG8KQEAgLTAsMCArMSw4MzcgQEAKKyMgR2VybWFuIHRyYW5zbGF0aW9ucyBmb3IgZ3N0LXBsdWdpbnMtZ29vZCAxLjMuOTAKKyMgQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ3N0LXBsdWdpbnMtZ29vZCBwYWNrYWdlLgorIworIyBQQ00gPSBQQ00KKyMgTGluZS1pbiA9IExpbmUtRWluZ2FuZworIyBMaW5lLW91dCA9IExpbmUtQXVzZ2FuZworIyBQaXBlbGluZSA9IFdlaXRlcmxlaXR1bmcKKyMgU3RyZWFtID0gU3Ryb20KKyMgbWl4ZXIgID0gTWlzY2hlcgorIyBDaHJpc3RpYW4gS2lyYmFjaCA8Y2hyaXN0aWFuLmtpcmJhY2hAZ21haWwuY29tPiwgMjAxMCwgMjAxMSwgMjAxMiwgMjAxMywgMjAxNC4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QgMS43LjJcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxNi0wMi0yMiAyMzo0MiswMTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBDaHJpc3RpYW4gS2lyYmFjaCA8Y2hyaXN0aWFuLmtpcmJhY2hAZ21haWwuY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IEdlcm1hbiA8dHJhbnNsYXRpb24tdGVhbS1kZUBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+XG4iCisiTGFuZ3VhZ2U6IGRlXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0yOyBwbHVyYWw9KG4gIT0gMSk7XG4iCisiWC1HZW5lcmF0b3I6IFBvZWRpdCAxLjguN1xuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICJKYWNrLVNlcnZlciBuaWNodCBnZWZ1bmRlbiIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiRGVrb2RpZXJlbiBkZXMgSlBFRy1CaWxkZXMgc2NobHVnIGZlaGwiCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIsK7JXPCqyBkdXJjaCDCuyVzwqsiCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIlZlcmJpbmR1bmcgenVtIFNlcnZlciBrb25udGUgbmljaHQgaGVyZ2VzdGVsbHQgd2VyZGVuIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIktlaW5lIEFkcmVzc2UgZmVzdGdlbGVndC4iCisKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIlNlcnZlcm5hbWUga29ubnRlIG5pY2h0IGF1ZmdlbMO2c3Qgd2VyZGVuLiIKKworbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICJFcyBrb25udGUga2VpbmUgVmVyYmluZHVuZyB6dW0gU2VydmVyIGhlcmdlc3RlbGx0IHdlcmRlbi4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICJBdWZiYXUgZWluZXIgc2ljaGVybiBWZXJiaW5kdW5nIGlzdCBnZXNjaGVpdGVydC4iCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICIiCisiRWluIE5ldHp3ZXJrZmVobGVyIGlzdCBhdWZnZXRyZXRlbiwgb2RlciBkZXIgU2VydmVyIHNjaGxvc3MgZGllIFZlcmJpbmR1bmcgIgorInVuZXJ3YXJ0ZXQuIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICJTZXJ2ZXIgZ2FiIHVuZXJ3YXJ0ZXRlIERhdGVuIHp1cnXMiGNrLiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICJTdWNobGF1ZiB3aXJkIG5pY2h0IHZvbSBTZXJ2ZXIgdW50ZXJzdMO8dHp0LiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAiS2VpbiBvZGVyIHVuZ8O8bHRpZ2VyIEVpbmdhYmV0b24sIGRlciBBVkktU3Ryb20gd2lyZCBmZWhsZXJoYWZ0IHNlaW4uIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJEaWVzZSBEYXRlaSBlbnRow6RsdCBrZWluZSBhYnNwaWVsYmFyZW4gU3Ryw7ZtZS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkRpZXNlIERhdGVpIGlzdCB1bmfDvGx0aWcgdW5kIGthbm4gbmljaHQgd2llZGVyZ2VnZWJlbiB3ZXJkZW4uIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIiIKKyJEZXIgU3Ryb20ga2FubiBuaWNodCB3aWVkZXJnZWdlYmVuIHdlcmRlbiwgd2VpbCBlciBtaXQgUGxheVJlYWR5IERSTSAiCisidmVyc2NobMO8c3NlbHQgaXN0LiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRGllc2UgRGF0ZWkgaXN0IGJlc2Now6RkaWd0IHVuZCBrYW5uIG5pY2h0IHdpZWRlcmdlZ2ViZW4gd2VyZGVuLiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiVW5nw7xsdGlnZSBBdG9tLUdyw7bDn2UuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJEaWVzZSBEYXRlaSBpc3QgdW52b2xsc3TDpG5kaWcgdW5kIGthbm4gbmljaHQgd2llZGVyZ2VnZWJlbiB3ZXJkZW4uIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICJEYXMgVmlkZW8gaW4gZGllc2VyIERhdGVpIHdpcmQgdmllbGxlaWNodCBuaWNodCBrb3JyZWt0IHdpZWRlcmdlZ2ViZW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIiIKKyJEaWVzZSBEYXRlaSBlbnRow6RsdCB6dSB2aWVsZSBTdHLDtm1lLiBFcyB3ZXJkZW4gbnVyIGRpZSBlcnN0ZW4gJWQgIgorIndpZWRlcmdlZ2ViZW4iCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorIkVzIHd1cmRlIGtlaW4gdW50ZXJzdMO8dHp0ZXIgU3Ryb20gZ2VmdW5kZW4uIFNpZSBtw7xzc2VuIHZpZWxsZWljaHQgZWluIFBsdWdpbiAiCisienVyIFJUU1AtRXJ3ZWl0ZXJ1bmcgdm9uIEdTdHJlYW1lciBmw7xyIMK7UmVhbMKrLU1lZGllbnN0csO2bWUgaW5zdGFsbGllcmVuLiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorIkVzIHd1cmRlIGtlaW4gdW50ZXJzdMO8dHp0ZXIgU3Ryb20gZ2VmdW5kZW4uIFNpZSBtw7xzc2VuIGV2ZW50dWVsbCB6dXPDpHR6bGljaGUgIgorIlRyYW5zcG9ydC1Qcm90b2tvbGxlIGVybGF1YmVuIG9kZXIgZXMgZmVobHQgdmllbGxlaWNodCBkYXMgcmljaHRpZ2UgUGx1Z2luICIKKyJ6dXIgUlRTUC1FcndlaXRlcnVuZy4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisiRGFzIEF1ZGlvLUdlcsOkdCBrb25udGUgbmljaHQgenVyIFdpZWRlcmdhYmUgZ2XDtmZmbmV0IHdlcmRlbi4gRGFzIEdlcsOkdCB3aXJkICIKKyJ2b24gZWluZXIgYW5kZXJlbiBBbndlbmR1bmcgdmVyd2VuZGV0LiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiRGFzIEF1ZGlvLUdlcsOkdCBrb25udGUgbmljaHQgenVyIFdpZWRlcmdhYmUgZ2XDtmZmbmV0IHdlcmRlbi4gU2llIGhhYmVuIG5pY2h0ICIKKyJkaWUgQmVyZWNodGlndW5nZW4genVtIMOWZmZuZW4gZGVzIEdlcsOkdGVzLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICJEYXMgQXVkaW8tR2Vyw6R0IGtvbm50ZSBuaWNodCB6dXIgV2llZGVyZ2FiZSBnZcO2ZmZuZXQgd2VyZGVuLiAiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisiRGFzIEF1ZGlvLUdlcsOkdCBrb25udGUgbmljaHQgenVyIFdpZWRlcmdhYmUgZ2XDtmZmbmV0IHdlcmRlbi4gRGllc2UgVmVyc2lvbiAiCisiZGVzIE9wZW4gU291bmQgU3lzdGVtIChPU1MpIHdpcmQgbmljaHQgdm9uIGRpZXNlbSBFbGVtZW50IHVudGVyc3TDvHR6dC4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiV2llZGVyZ2FiZSB3aXJkIHZvbiBkaWVzZW0gQXVkaW8tR2Vyw6R0IG5pY2h0IHVudGVyc3TDvHR6dC4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIkZlaGxlciBiZWkgQXVkaW8tV2llZGVyZ2FiZS4iCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkF1Zm5haG1lIHdpcmQgdm9uIGRpZXNlbSBBdWRpby1HZXLDpHQgbmljaHQgdW50ZXJzdMO8dHp0LiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkZlaGxlciBiZWltIEF1Zm5laG1lbiB2b20gQXVkaW8tR2Vyw6R0LiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIkRhcyBBdWRpby1HZXLDpHQga29ubnRlIG5pY2h0IHp1ciBBdWZuYWhtZSBnZcO2ZmZuZXQgd2VyZGVuLiBTaWUgaGFiZW4gbmljaHQgIgorImRpZSBCZXJlY2h0aWd1bmdlbiB6dW0gw5ZmZm5lbiBkZXMgR2Vyw6R0ZXMuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICJEYXMgQXVkaW8tR2Vyw6R0IGtvbm50ZSBuaWNodCB6dXIgQXVmbmFobWUgZ2XDtmZmbmV0IHdlcmRlbi4gIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgIkNvcmVBdWRpby1HZXLDpHQgbmljaHQgZ2VmdW5kZW4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIkNvcmVBdWRpby1HZXLDpHQga29ubnRlIG5pY2h0IGdlw7ZmZm5ldCB3ZXJkZW4iCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICJBdWZuYWhtZXF1ZWxsZSIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIk1pa3JvZm9uIgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAiTGluZS1FaW5nYW5nIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIkludGVybmUgQ0QiCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAiU1BESUYtRWluZ2FuZyIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICJBVVgtRWluZ2FuZyAxIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIkFVWC1FaW5nYW5nIDIiCisKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiQ29kZWMtUsO8Y2tzY2hsZWlmZSIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiU3VuVlRTLVLDvGNrc2NobGVpZmUiCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIkxhdXRzdMOkcmtlIgorCittc2dpZCAiR2FpbiIKK21zZ3N0ciAiUGVnZWwiCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJNb25pdG9yIgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiRWluZ2ViYXV0ZXIgTGF1dHNwcmVjaGVyIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICJLb3BmaMO2cmVyIgorCisjIEhpZXIgaXN0IG1pciBub2NoIG5pY2h0cyBCZXNzZXJlcyBlaW5nZWZhbGxlbi4KK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiQXVzZ2FuZyIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiU1BESUYtQXVzZ2FuZyIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiQVVYLUF1c2dhbmcgMSIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiQVVYLUF1c2dhbmcgMiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIgorbXNnc3RyICJGZWhsZXIgYmVpbSBMZXNlbiB2b24gJWQgQnl0ZXMgdm9uIEdlcsOkdCDCuyVzwqsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisiQXVmesOkaGxlbiBtw7ZnbGljaGVyIFZpZGVvZm9ybWF0ZSwgbWl0IGRlbmVuIEdlcsOkdCDCuyVzwqsgYXJiZWl0ZW4ga2Fubiwgc2NobHVnICIKKyJmZWhsIgorCisjIMK7R2Vob2x0wqsgaXN0IGF1Y2ggbm9jaCBuaWNodCBvcHRpbWFsLCBhYmVyIMK7YWJnZWJpbGRldMKrIGdlaHQgYXVjaCBuaWNodCB3aXJrbGljaC4KKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIkRpZSBQdWZmZXIgZGVzIEdlcsOkdGVzIMK7JXPCqyBrb25udGVuIG5pY2h0IGdlaG9sdCB3ZXJkZW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICJEZXIgVHJlaWJlciB2b24gR2Vyw6R0IMK7JXPCqyB1bnRlcnN0w7x0enQgbmljaHQgZGllIEVBLU1ldGhvZGUgJWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICJEZXIgVHJlaWJlciB2b24gR2Vyw6R0IMK7JXPCqyB1bnRlcnN0w7x0enQga2VpbmUgYmVrYW5udGUgRUEtTWV0aG9kZSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICJHZXLDpHQgwrslc8KrIGlzdCBiZWxlZ3QiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIkRhcyBHZXLDpHQgwrslc8KrIGthbm4gbmljaHQgYmVpICVkeCVkIGF1Zm5laG1lbiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiRGFzIGFuZ2VnZWJlbmUgRm9ybWF0IGthbm4gbmljaHQgdm9tIEdlcsOkdCDCuyVzwqsgYXVzZ2VsZXNlbiB3ZXJkZW4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiR2Vyw6R0IMK7JXPCqyB1bnRlcnN0w7x0enQgZ2V0cmVubnRlIEViZW5lbiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIlBhcmFtZXRlciBrb25udGVuIG5pY2h0IHZvbiBHZXLDpHQgwrslc8KrIGF1c2dlbGVzZW4gd2VyZGVuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICIiCisiRGFzIFZpZGVvLUVpbmdhYmVnZXLDpHQgYWt6ZXB0aWVydGUgbmljaHQgZGllIG5ldWUgRWluc3RlbGx1bmcgenVyICIKKyJCaWxkd2llZGVyaG9sdW5nc3JhdGUuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiRGFzIFZpZGVvLUdlcsOkdCBnYWIga2VpbiBBdXNnYWJlZm9ybWF0IGFuLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICJEYXMgVmlkZW8tR2Vyw6R0IGdhYiB1bmfDvGx0aWdlIEFibWVzc3VuZ2VuIHp1csO8Y2suIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIiIKKyJWaWRlby1HZXLDpHRlIHZlcndlbmRldCBlaW5lIG5pY2h0IHVudGVyc3TDvHR6dCBNZXRob2RlIGRlciAiCisiWmVpbGVudmVyc2NoYWNodGVsdW5nLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICJEYXMgVmlkZW8tR2Vyw6R0IHZlcndlbmRldCBlaW4gbmljaHQgdW50ZXJzdMO8dHp0ZXMgUGl4ZWxmb3JtYXQuIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIkVpbnJpY2h0ZW4gZGVzIGludGVybmVuIFB1ZmZlci1Qb29scyBpc3QgZmVobGdlc2NobGFnZW4uIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICJEYXMgVmlkZW9nZXLDpHQgZ2FiIGtlaW5lIFB1ZmZlci1HcsO2w59lIGFuLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIkVzIGdpYnQga2VpbmVuIERvd25zdHJlYW0tUG9vbCwgYXVzIGRlbSBpbXBvcnRpZXJ0IHdlcmRlbiBrYW5uLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIkF1c2xlc2VuIGRlciBFaW5zdGVsbHVuZ2VuIHZvbiBFbXBmw6RuZ2VyIMK7JWTCqyBhdWYgR2Vyw6R0IMK7JXPCqyBzY2hsdWcgZmVobC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRmVobGVyIGJlaW0gRXJtaXR0ZWxuIGRlciBGdW5rdGlvbnNtZXJrbWFsZSB2b24gR2Vyw6R0IMK7JXPCqy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICLCuyVzwqsgaXN0IGtlaW4gRW1wZsOkbmdlci4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJFbXBmYW5nZW4gZWluZXMgRnVua3NpZ25hbHMgYXVmIEdlcsOkdCDCuyVzwqsgc2NobHVnIGZlaGwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiRmVzdGxlZ2VuIGRlciBFaW5nYWJlIMK7JWTCqyBkZXMgR2Vyw6R0cyDCuyVzwqsgc2NobHVnIGZlaGwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLDhG5kZXJuIGRlcyBTdHVtbXp1c3RhbmRzIHZvbiBHZXLDpHQgwrslc8KrIHNjaGx1ZyBmZWhsLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiQW5mb3JkZXJuIGRlcyBiZW7DtnRpZ2VuIEFyYmVpdHNzcGVpY2hlcnMgc2NobHVnIGZlaGwuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIkFuZm9yZGVybiBkZXMgYmVuw7Z0aWdlbiBBcmJlaXRzc3BlaWNoZXJzIHNjaGx1ZyBmZWhsLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJEZXIgVW13YW5kbGVyIGF1ZiBHZXLDpHQgJXMgaGF0IGtlaW4gdW50ZXJzdMO8dHp0ZXMgRWluZ2FiZWZvcm1hdCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiRGVyIFVtd2FuZGxlciBhdWYgR2Vyw6R0ICVzIGhhdCBrZWluIHVudGVyc3TDvHR6dGVzIEF1c2dhYmVmb3JtYXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIkRlciBLb2RpZXJlciBhdWYgR2Vyw6R0ICVzIGhhdCBrZWluIHVudGVyc3TDvHR6dGVzIEVpbmdhYmVmb3JtYXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICJEZXIgS29kaWVyZXIgYXVmIEdlcsOkdCAlcyBoYXQga2VpbiB1bnRlcnN0w7x0enRlcyBBdXNnYWJlZm9ybWF0IgorCittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIkJlZ2lubiBkZXIgRGVrb2RpZXJ1bmcgZGVzIEpQRUctQmlsZGVzIHNjaGx1ZyBmZWhsIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICJWZXJhcmJlaXRlbiBkZXMgRWluemVsYmlsZHMgc2NobHVnIGZlaGwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorIkZlaGxlciBiZWltIEJlc3RpbW1lbiBkZXIgRsOkaGlna2VpdGVuIGRlcyBHZXLDpHRzIMK7JXPCqzogRXMgaXN0IGtlaW4gwrt2NGwywqstIgorIlRyZWliZXIuIMOcYmVycHLDvGZlbiBTaWUsIG9iIGVzIGVpbiDCu3Y0bDHCqy1UcmVpYmVyIGlzdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICJBYmZyYWdlIGRlciBBdHRyaWJ1dGUgZGVyIEVpbmdhYmUgwrslZMKrIGltIEdlcsOkdCDCuyVzwqsgc2NobHVnIGZlaGwiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIkF1c2xlc2VuIGRlciBFaW5zdGVsbHVuZ2VuIGRlciBTZW5kZXJ3YWhsIMK7JWTCqyBhdWYgR2Vyw6R0IMK7JXPCqyBzY2hsdWcgZmVobC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICJBYmZyYWdlbiBkZXIgTm9ybSBhdWYgR2Vyw6R0IMK7JXPCqyBzY2hsdWcgZmVobC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkFiZnJhZ2UgZGVyIEtvbnRyb2xsYXR0cmlidXRlIGF1ZiBHZXLDpHQgwrslc8KrIHNjaGx1ZyBmZWhsLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJHZXLDpHQgwrslc8KrIGthbm4gbmljaHQgaWRlbnRpZml6aWVydCB3ZXJkZW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIsK7JXPCqyBpc3Qga2VpbiBHZXLDpHQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiR2Vyw6R0IMK7JXPCqyBrb25udGUgbmljaHQgenVtIExlc2VuIG9kZXIgU2NocmVpYmVuIGdlw7ZmZm5ldCB3ZXJkZW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiwrslc8KrIGlzdCBrZWluIEF1Zm5haG1lZ2Vyw6R0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiwrslc8KrIGlzdCBrZWluIFdpZWRlcmdhYmVnZXLDpHQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICJHZXLDpHQgwrslc8KrIGlzdCBrZWluIE0yTS1HZXLDpHQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJHZXLDpHQgwrslc8KrIGtvbm50ZSBuaWNodCB6dW0gTGVzZW4gb2RlciBTY2hyZWliZW4gZ2XDtmZmbmV0IHdlcmRlbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkZlc3RsZWdlbiBkZXIgTm9ybSBhdWYgR2Vyw6R0IMK7JXPCqyBzY2hsdWcgZmVobC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJBdXNsZXNlbiBkZXIgYWt0dWVsbGVuIFNlbmRlZnJlcXVlbnogZGVzIEdlcsOkdHMgwrslc8KrIHNjaGx1ZyBmZWhsLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisiRmVzdGxlZ2VuIGRlciBha3R1ZWxsZW4gU2VuZGVmcmVxdWVueiBkZXMgR2Vyw6R0cyDCuyVzwqsgYXVmICVsdSBIeiBzY2hsdWcgZmVobC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQXVzbGVzZW4gZGVyIGFrdHVlbGxlbiBTaWduYWxzdMOkcmtlIGRlcyBHZXLDpHRzIMK7JXPCqyBzY2hsdWcgZmVobC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkF1c2xlc2VuIGRlcyBXZXJ0ZXMgZGVyIEVpbnN0ZWxsdW5nIMK7JWTCqyBkZXMgR2Vyw6R0cyDCuyVzwqsgc2NobHVnIGZlaGwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiRmVzdGxlZ2VuIGRlcyBXZXJ0ZXMgwrslZMKrIGRlciBFaW5zdGVsbHVuZyDCuyVkwqsgZGVzIEdlcsOkdHMgwrslc8KrIHNjaGx1ZyBmZWhsLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIkF1c2xlc2VuIGRlciBha3R1ZWxsZW4gRWluZ2FiZSBhdWYgZGVtIEdlcsOkdCDCuyVzwqsgc2NobHVnIGZlaGwuIFZpZWxsZWljaHQgIgorImlzdCBlcyBlaW4gRnVua2dlcsOkdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIkF1c2xlc2VuIGRlciBha3R1ZWxsZW4gQXVzZ2FiZSBkZXMgR2VyYcyIdHMgwrslc8KrIHNjaGx1ZyBmZWhsLiBWaWVsbGVpY2h0IGlzdCAiCisiZXMgZWluIEZ1bmtnZXLDpHQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIkZlc3RsZWdlbiBkZXIgQXVzZ2FiZSDCuyVkwqsgZGVzIEdlcmHMiHRzIMK7JXPCqyBzY2hsdWcgZmVobC4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICJFaW4gV2VjaHNlbCBkZXIgQXVmbMO2c3VuZyB6dXIgTGF1ZnplaXQgd2lyZCBub2NoIG5pY2h0IHVudGVyc3TDvHR6dC4iCisKKyMgVGFrdGdlYmVyIGtsaW5ndCBndXQuCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICJFcyBrYW5uIG5pY2h0IG9obmUgZWluZW4gVGFrdGdlYmVyIGdlYXJiZWl0ZXQgd2VyZGVuLiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAiSW50ZXJuZXIgRGF0ZW5zdHJvbWZlaGxlci4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICJJbnRlcm5lciBEYXRlbnN0cm9tZmVobGVyLiIKKworI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAiR2Vyw6R0IMK7JXPCqyB1bnRlcnN0w7x0enQga2VpbmUgVmlkZW9hdWZuYWhtZSIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzb3VuZCBzZXJ2ZXIiCisjfiBtc2dzdHIgIkVzIGtvbm50ZSBrZWluZSBWZXJiaW5kdW5nIHp1bSBBdWRpby1TZXJ2ZXIgaGVyZ2VzdGVsbHQgd2VyZGVuIgorCisjfiBtc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IHNvdW5kIHNlcnZlciBjYXBhYmlsaXRpZXMiCisjfiBtc2dzdHIgIkFiZnJhZ2UgZGVyIEbDpGhpZ2tlaXRlbiBkZXMgQXVkaW8tU2VydmVycyBpc3QgZmVobGdlc2NobGFnZW4iCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICJCYXNzIgorCisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICJIw7ZoZW4iCisKKyN+IG1zZ2lkICJTeW50aCIKKyN+IG1zZ3N0ciAiU3ludGgiCisKKyN+IG1zZ2lkICJQQ00iCisjfiBtc2dzdHIgIlBDTSIKKworI34gbXNnaWQgIlNwZWFrZXIiCisjfiBtc2dzdHIgIkxhdXRzcHJlY2hlciIKKworI34gbXNnaWQgIkxpbmUtaW4iCisjfiBtc2dzdHIgIkxpbmUtRWluZ2FuZyIKKworI34gbXNnaWQgIkNEIgorI34gbXNnc3RyICJDRCIKKworI34gbXNnaWQgIk1peGVyIgorI34gbXNnc3RyICJNaXNjaGVyIgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIlBDTSAyIgorCisjfiBtc2dpZCAiUmVjb3JkIgorI34gbXNnc3RyICJBdWZuYWhtZSIKKworI34gbXNnaWQgIkluLWdhaW4iCisjfiBtc2dzdHIgIkVpbmdhbmdzcGVnZWwiCisKKyN+IG1zZ2lkICJPdXQtZ2FpbiIKKyN+IG1zZ3N0ciAiQXVzZ2FuZ3NwZWdlbCIKKworI34gbXNnaWQgIkxpbmUtMSIKKyN+IG1zZ3N0ciAiRWluZ2FuZy0xIgorCisjfiBtc2dpZCAiTGluZS0yIgorI34gbXNnc3RyICJFaW5nYW5nLTIiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIkVpbmdhbmctMyIKKworI34gbXNnaWQgIkRpZ2l0YWwtMSIKKyN+IG1zZ3N0ciAiRGlnaXRhbC0xIgorCisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICJEaWdpdGFsLTIiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTMiCisjfiBtc2dzdHIgIkRpZ2l0YWwtMyIKKworIyBNaWtyb2Zvbj8gWndlaWZlbGhhZnQuIEVoZXIgS29wZmjDtnJlciBvZGVyIFRlbGVmb24uCisjfiBtc2dpZCAiUGhvbmUtaW4iCisjfiBtc2dzdHIgIk1pa3JvZm9uZWluZ2FuZyIKKworIyBJc3QgaGllciBLb3BmaMO2cmVyIG9kZXIgVGVsZWZvbiBnZW1laW50PworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAiTWlrcm9mb25hdXNnYW5nIgorCisjfiBtc2dpZCAiVmlkZW8iCisjfiBtc2dzdHIgIlZpZGVvIgorCisjfiBtc2dpZCAiUmFkaW8iCisjfiBtc2dzdHIgIlJhZGlvIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKKyN+IG1zZ3N0ciAiRGFzIEF1ZGlvLUdlcsOkdCBrb25udGUgbmljaHQgZsO8ciBkYXMgTWlzY2hwdWx0IGdlw7ZmZm5ldCB3ZXJkZW4uIgorCisjfiBtc2dpZCAiIgorI34gIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4gVGhpcyB2ZXJzaW9uIG9mICIKKyN+ICJ0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiRGFzIEF1ZGlvLUdlcsOkdCBrb25udGUgbmljaHQgZsO8ciBkYXMgTWlzY2hwdWx0IGdlw7ZmZm5ldCB3ZXJkZW4uIERpZXNlICIKKyN+ICJWZXJzaW9uIGRlcyBPcGVuIFNvdW5kIFN5c3RlbSAoT1NTKSB3aXJkIG5pY2h0IHVudGVyc3TDvHR6dC4iCisKKyN+IG1zZ2lkICJNYXN0ZXIiCisjfiBtc2dzdHIgIkhhdXB0cmVnbGVyIgorCisjfiBtc2dpZCAiRnJvbnQiCisjfiBtc2dzdHIgIkZyb250IgorCisjfiBtc2dpZCAiUmVhciIKKyN+IG1zZ3N0ciAiQXVmbmFobWVSw7xja3NlaXRlIgorCisjfiBtc2dpZCAiSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiS29wZmjDtnJlciIKKworI34gbXNnaWQgIkNlbnRlciIKKyN+IG1zZ3N0ciAiTWl0dGUiCisKKyN+IG1zZ2lkICJMRkUiCisjfiBtc2dzdHIgIkxGRSIKKworI34gbXNnaWQgIlN1cnJvdW5kIgorI34gbXNnc3RyICJTdXJyb3VuZCIKKworI34gbXNnaWQgIlNpZGUiCisjfiBtc2dzdHIgIlNlaXRlIgorCisjfiBtc2dpZCAiQVVYIE91dCIKKyN+IG1zZ3N0ciAiQVVYLUF1c2dhbmciCisKKyN+IG1zZ2lkICIzRCBEZXB0aCIKKyN+IG1zZ3N0ciAiM0QtVGllZmUiCisKKyN+IG1zZ2lkICIzRCBDZW50ZXIiCisjfiBtc2dzdHIgIjNELU1pdHRlIgorCisjfiBtc2dpZCAiM0QgRW5oYW5jZSIKKyN+IG1zZ3N0ciAiRXJ3ZWl0ZXJ0ZXMgM0QiCisKKyN+IG1zZ2lkICJUZWxlcGhvbmUiCisjfiBtc2dzdHIgIlRlbGVmb24iCisKKyN+IG1zZ2lkICJWaWRlbyBJbiIKKyN+IG1zZ3N0ciAiVmlkZW8tRWluZ2FuZyIKKworI34gbXNnaWQgIkFVWCBJbiIKKyN+IG1zZ3N0ciAiQVVYLUVpbmdhbmciCisKKyN+IG1zZ2lkICJSZWNvcmQgR2FpbiIKKyN+IG1zZ3N0ciAiQXVmbmFobWVwZWdlbCIKKworI34gbXNnaWQgIk91dHB1dCBHYWluIgorI34gbXNnc3RyICJBdXNnYW5nc3BlZ2VsIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAiTWlrcm9mb252ZXJzdMOkcmt1bmciCisKKyN+IG1zZ2lkICJEaWFnbm9zdGljIgorI34gbXNnc3RyICJadXIgRGlhZ25vc2UiCisKKyN+IG1zZ2lkICJCYXNzIEJvb3N0IgorI34gbXNnc3RyICJCYXNzdmVyc3TDpHJrdW5nIgorCisjfiBtc2dpZCAiUGxheWJhY2sgUG9ydHMiCisjfiBtc2dzdHIgIldpZWRlcmdhYmUtUG9ydHMiCisKKyN+IG1zZ2lkICJJbnB1dCIKKyN+IG1zZ3N0ciAiRWluZ2FuZyIKKworI34gbXNnaWQgIk1vbml0b3IgU291cmNlIgorI34gbXNnc3RyICLDnGJlcndhY2h1bmdzcXVlbGxlIgorCisjfiBtc2dpZCAiS2V5Ym9hcmQgQmVlcCIKKyN+IG1zZ3N0ciAiVGFzdGF0dXItUGllcHNlbiIKKworI34gbXNnaWQgIlNpbXVsYXRlIFN0ZXJlbyIKKyN+IG1zZ3N0ciAiU3RlcmVvIHNpbXVsaWVyZW4iCisKKyN+IG1zZ2lkICJTdGVyZW8iCisjfiBtc2dzdHIgIlN0ZXJlbyIKKworI34gbXNnaWQgIlN1cnJvdW5kIFNvdW5kIgorI34gbXNnc3RyICJTdXJyb3VuZC1BdWRpbyIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKKyN+IG1zZ3N0ciAiTWlrcm9mb25wZWdlbCIKKworI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICJMYXV0c3ByZWNoZXJxdWVsbGUiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTWlrcm9mb25xdWVsbGUiCisKKyN+IG1zZ2lkICJKYWNrIgorI34gbXNnc3RyICJTdGVja2VyIgorCisjfiBtc2dpZCAiQ2VudGVyIC8gTEZFIgorI34gbXNnc3RyICJNaXR0ZSAvIExGRSIKKworI34gbXNnaWQgIlN0ZXJlbyBNaXgiCisjfiBtc2dzdHIgIlN0ZXJlby1NaXNjaHB1bHQiCisKKyN+IG1zZ2lkICJNb25vIE1peCIKKyN+IG1zZ3N0ciAiTW9uby1NaXNjaHB1bHQiCisKKyN+IG1zZ2lkICJJbnB1dCBNaXgiCisjfiBtc2dzdHIgIkVpbmdhbmdzLU1pc2NocHVsdCIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAiTWlrcm9mb24gMSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAiTWlrcm9mb24gMiIKKworI34gbXNnaWQgIkRpZ2l0YWwgT3V0IgorI34gbXNnc3RyICJEaWdpdGFsLUF1c2dhbmciCisKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICJEaWdpdGFsLUVpbmdhbmciCisKKyN+IG1zZ2lkICJIRE1JIgorI34gbXNnc3RyICJIRE1JIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgIk1vZGVtIgorCisjfiBtc2dpZCAiSGFuZHNldCIKKyN+IG1zZ3N0ciAiSMO2cmVyIgorCisjfiBtc2dpZCAiT3RoZXIiCisjfiBtc2dzdHIgIkFuZGVyZXMiCisKKyN+IG1zZ2lkICJOb25lIgorI34gbXNnc3RyICJLZWluIgorCisjfiBtc2dpZCAiT24iCisjfiBtc2dzdHIgIkFrdGl2aWVydCIKKworI34gbXNnaWQgIk9mZiIKKyN+IG1zZ3N0ciAiRGVha3RpdmllcnQiCisKKyN+IG1zZ2lkICJNdXRlIgorI34gbXNnc3RyICJTdHVtbSIKKworI34gbXNnaWQgIkZhc3QiCisjfiBtc2dzdHIgIlNjaG5lbGwiCisKKyN+IG1zZ2lkICJWZXJ5IExvdyIKKyN+IG1zZ3N0ciAiU2VociBuaWVkcmlnIgorCisjfiBtc2dpZCAiTG93IgorI34gbXNnc3RyICJOaWVkcmlnIgorCisjfiBtc2dpZCAiTWVkaXVtIgorI34gbXNnc3RyICJNZWRpdW0iCisKKyN+IG1zZ2lkICJIaWdoIgorI34gbXNnc3RyICJIb2NoIgorCisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICJTZWhyIGhvY2giCisKKyN+IG1zZ2lkICJQcm9kdWN0aW9uIgorI34gbXNnc3RyICJQcm9kdWt0aW9uIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTWljcm9waG9uZSIKKyN+IG1zZ3N0ciAiTWlrcm9mb24gYW0gVm9yZGVyZWluZ2FuZyIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgSW4iCisjfiBtc2dzdHIgIkxpbmUtRWluZ2FuZyBhbSBWb3JkZXJlaW5nYW5nIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiS29wZmjDtnJlciBhbSBWb3JkZXJlaW5nYW5nIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBPdXQiCisjfiBtc2dzdHIgIkxpbmUtQXVzZ2FuZyBhbSBWb3JkZXJlaW5nYW5nIgorCisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICJHcsO8bmVyIFN0ZWNrZXIiCisKKyN+IG1zZ2lkICJQaW5rIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUm9zYSBTdGVja2VyIgorCisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkJsYXVlciBTdGVja2VyIgorCisjfiBtc2dpZCAiV2hpdGUgQ29ubmVjdG9yIgorI34gbXNnc3RyICJXZWnDn2VyIFN0ZWNrZXIiCisKKyN+IG1zZ2lkICJCbGFjayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlNjaHdhcnplciBTdGVja2VyIgorCisjfiBtc2dpZCAiR3JheSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkdyYXVlciBTdGVja2VyIgorCisjfiBtc2dpZCAiT3JhbmdlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiT3JhbmdlciBTdGVja2VyIgorCisjfiBtc2dpZCAiUmVkIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUm90ZXIgU3RlY2tlciIKKworI34gbXNnaWQgIlllbGxvdyBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkdlbGJlciBTdGVja2VyIgorCisjfiBtc2dpZCAiR3JlZW4gRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJHcsO8bmVyIFN0ZWNrZXIgYW0gVm9yZGVyZWluZ2FuZyIKKworI34gbXNnaWQgIlBpbmsgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJSb3NhIFN0ZWNrZXIgYW0gVm9yZGVyZWluZ2FuZyIKKworI34gbXNnaWQgIkJsdWUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJCbGF1ZXIgU3RlY2tlciBhbSBWb3JkZXJlaW5nYW5nIgorCisjfiBtc2dpZCAiV2hpdGUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJXZWnDn2VyIFN0ZWNrZXIgYW0gVm9yZGVyZWluZ2FuZyIKKworI34gbXNnaWQgIkJsYWNrIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiU2Nod2FyemVyIFN0ZWNrZXIgYW0gVm9yZGVyZWluZ2FuZyIKKworI34gbXNnaWQgIkdyYXkgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJHcmF1ZXIgU3RlY2tlciBhbSBWb3JkZXJlaW5nYW5nIgorCisjfiBtc2dpZCAiT3JhbmdlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiT3JhbmdlciBTdGVja2VyIGFtIFZvcmRlcmVpbmdhbmciCisKKyN+IG1zZ2lkICJSZWQgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJSb3RlciBTdGVja2VyIGFtIFZvcmRlcmVpbmdhbmciCisKKyN+IG1zZ2lkICJZZWxsb3cgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJHZWxiZXIgU3RlY2tlciBhbSBWb3JkZXJlaW5nYW5nIgorCisjfiBtc2dpZCAiU3ByZWFkIE91dHB1dCIKKyN+IG1zZ3N0ciAiQXVzZ2FiZSB2ZXJzdHJldWVuIgorCisjfiBtc2dpZCAiRG93bm1peCIKKyN+IG1zZ3N0ciAiSGVydW50ZXJtaXNjaGVuIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBJbnB1dCIKKyN+IG1zZ3N0ciAiRWluZ2FuZyBkZXMgdmlydHVlbGxlbiBNaXNjaHB1bHRzIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBPdXRwdXQiCisjfiBtc2dzdHIgIkF1c2dhbmcgZGVzIHZpcnR1ZWxsZW4gTWlzY2hwdWx0cyIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgQ2hhbm5lbHMiCisjfiBtc2dzdHIgIkthbsOkbGUgZGVzIHZpcnR1ZWxsZW4gTWlzY2hwdWx0cyIKKworI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyAlZCBGdW5jdGlvbiIKKworI34gbXNnaWQgIiVzIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcy1GdW5rdGlvbiIKKworIyDCu0ZyYW1lwqsgc29sbHRlbiB3aXIgaW0gWnVzYW1tZW5oYW5nIG1pdCBWaWRlb3MgdmllbGxlaWNodCBiZXNzZXIgc28gYmVsYXNzZW4uIEhhYmUgaWNoIGluIGdub21lLXN1YnRpdGxlcyBhdWNoIHNvIGdlbWFjaHQuCisjfiBtc2dpZCAiR290IHVuZXhwZWN0ZWQgZnJhbWUgc2l6ZSBvZiAldSBpbnN0ZWFkIG9mICV1LiIKKyN+IG1zZ3N0ciAiVW5lcndhcnRldGUgRnJhbWUtR3LDtsOfZSB2b24gJXUgYW5zdGF0dCAldSB3dXJkZSBlcmhhbHRlbi4iCisKKyN+IG1zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIG9uIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiRmVobGVyIGJlaW0gTGVzZW4gdm9uICVkIEJ5dGVzIGF1ZiBHZXLDpHQgwrslc8KrLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlbnF1ZXVlIGJ1ZmZlcnMgaW4gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJBdWYgR2Vyw6R0IMK7JXPCqyBrb25udGVuIGtlaW5lIFB1ZmZlciBlaW5nZXJlaWh0IHdlcmRlbi4iCisKKyN+IG1zZ2lkICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkRlciBWZXJzdWNoIFZpZGVvYmlsZGVyIHZvbiBHZXLDpHQgwrslc8KrIGF1c3p1bGVzZW4gc2NobHVnIGZlaGwuIgorCisjfiBtc2dpZCAiRmFpbGVkIGFmdGVyICVkIHRyaWVzLiBkZXZpY2UgJXMuIHN5c3RlbSBlcnJvcjogJXMiCisjfiBtc2dzdHIgIiVkIFZlcnN1Y2hlIHNpbmQgZmVobGdlc2NobGFnZW4uIEdlcsOkdCDCuyVzwqsuIFN5c3RlbWZlaGxlcjogJXMiCisKKyN+IG1zZ2lkICIiCisjfiAiVGhlIGJ1ZmZlciB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzLCBvciBubyAiCisjfiAiYnVmZmVycyBoYXZlIGJlZW4gYWxsb2NhdGVkIHlldCwgb3IgdGhlIHVzZXJwdHIgb3IgbGVuZ3RoIGFyZSBpbnZhbGlkLiAiCisjfiAiZGV2aWNlICVzIgorI34gbXNnc3RyICIiCisjfiAiRGVyIFB1ZmZlcnR5cCB3aXJkIG5pY2h0IHVudGVyc3TDvHR6dCwgZGVyIEluZGV4IGlzdCBhdcOfZXJoYWxiIHNlaW5lciAiCisjfiAiR3Jlbnp3ZXJ0ZSwgZXMgc2luZCBiaXNoZXIgbm9jaCBrZWluZSBQdWZmZXIgYW5nZWZvcmRlcnQgd29yZGVuIG9kZXIgIgorI34gIsK7dXNlcnB0csKrIG9kZXIgZGllIEzDpG5nZSBzaW5kIHVuZ8O8bHRpZy4gR2Vyw6R0IMK7JXPCqyIKKworI34gbXNnaWQgIiIKKyN+ICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4gTm90IGVub3VnaCBtZW1vcnkuIgorI34gbXNnc3RyICIiCisjfiAiRGVyIFZlcnN1Y2ggVmlkZW9iaWxkZXIgdm9uIEdlcsOkdCDCuyVzwqsgYXVzenVsZXNlbiBzY2hsdWcgZmVobC4gTmljaHQgIgorI34gImdlbnVnIEFyYmVpdHNzcGVpY2hlci4iCisKKyMgV2FzIGlzdCBlaW4gWmVpZ2VycHVmZmVyPworIywgZnV6enkKKyN+IG1zZ2lkICJpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGVucXVldWUgYSB1c2VyIHBvaW50ZXIgYnVmZmVyLiBkZXZpY2UgJXMuIgorI34gbXNnc3RyICIiCisjfiAiVW5nZW7DvGdlbmQgQXJiZWl0c3NwZWljaGVyLCB1bSBlaW5lbiBaZWlnZXJwdWZmZXIgZWluZXMgQmVudXR6ZXJzICIKKyN+ICJlaW56dXJlaWhlbi4gR2Vyw6R0IMK7JXPCqy4iCisKKyN+IG1zZ2lkICJObyBmcmVlIGJ1ZmZlcnMgZm91bmQgaW4gdGhlIHBvb2wgYXQgaW5kZXggJWQuIgorI34gbXNnc3RyICJFcyB3dXJkZW4ga2VpbmUgZnJlaWVuIFB1ZmZlciBpbSBWb3JyYXQgYmVpIEluZGV4ICVkIGdlZnVuZGVuLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBnZXQgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiRGllIFB1ZmZlciBrb25udGVuIG5pY2h0IHZvbiBHZXLDpHQgwrslc8KrIGF1c2dlbGVzZW4gd2VyZGVuLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBnZXQgZW5vdWdoIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkVzIGtvbm50ZW4gbmljaHQgZ2VudWcgUHVmZmVyIHZvbiBHZXLDpHQgwrslc8KrIGF1c2dlbGVzZW4gd2VyZGVuLiIKZGlmZiAtLWdpdCBhL3BvL2VsLnBvIGIvcG8vZWwucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA1MDE3OQotLS0gL2Rldi9udWxsCisrKyBiL3BvL2VsLnBvCkBAIC0wLDAgKzEsODA2IEBACisjIEdyZWVrIHRyYW5zbGF0aW9uIGZvciBnc3QtcGx1Z2lucy1nb29kIHBhY2thZ2Ugb2YgR1N0cmVhbWVyIHByb2plY3QuCisjIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSBHU3RyZWFtZXIgY29yZSB0ZWFtCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSBnc3QtcGx1Z2lucy1nb29kIHBhY2thZ2UuCisjIFNpbW9zIFhlbml0ZWxsaXMgPHNpbW9zLmxpc3RzQGdvb2dsZW1haWwuY29tPiwgMjAwOS4KKyMgTWljaGFlbCBLb3RzYXJpbmlzIDxtazczNjI4QGdtYWlsLmNvbT4sIDIwMTAKKyMgU2F2dmFzIFJhZGV2aWMgPHZpY2VkYXJAZ21haWwuY29tPiwgMjAxMi4KK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QgMC4xMC4yOC4yXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTItMDUtMDUgMTk6MDUrMDEwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogU2F2dmFzIFJhZGV2aWMgPHZpY2VkYXJAZ21haWwuY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IEdyZWVrIDx0ZWFtQGxpc3RzLmdub21lLmdyPlxuIgorIkxhbmd1YWdlOiBlbFxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlgtQnVnczogUmVwb3J0IHRyYW5zbGF0aW9uIGVycm9ycyB0byB0aGUgTGFuZ3VhZ2UtVGVhbSBhZGRyZXNzLlxuIgorIlgtR2VuZXJhdG9yOiBMb2thbGl6ZSAwLjNcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD0obiAhPSAxKTtcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICLOkc+Azr/PhM+Fz4fOr86xIM6xz4DOv866z4nOtM65zrrOv8+Azr/Or863z4POt8+CIM+EzrfPgiDOtc65zrrPjM69zrHPgiBKUEVHIgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICInJXMnIM6xz4DPjCAnJXMnIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICLOlM61zr0gzq7PhM6xzr0gzrTPhc69zrHPhM6uIM63IM+Dz43Ovc60zrXPg863IM68zrUgz4TOv869IM60zrnOsc66zr/OvM65z4PPhM6uIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIs6UzrXOvSDOv8+Bzq/Pg864zrfOus61IFVSTC4iCisKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIs6UzrXOvSDOrs+EzrHOvSDOtM+Fzr3Osc+Ez4zPgiDOvyDPgM+Bzr/Pg860zrnOv8+BzrnPg868z4zPgiDPhM6/z4Ugzr/Ovc+MzrzOsc+Ezr/PgiDPhM6/z4UgzrTOuc6xzrrOv868zrnPg8+Ezq4uIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIs6UzrXOvSDOrs+EzrHOvSDOtM+Fzr3Osc+Ezq4gzrcgz4PPjc69zrTOtc+DzrcgzrzOtSDPhM6/zr0gzrTOuc6xzrrOv868zrnPg8+Ezq4uIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAizpHPgM6/z4TPhc+Hzq/OsSDOtc66zrrOr869zrfPg863z4IgzrHPg8+GzrHOu86/z43PgiDPg8+Nzr3OtM61z4POt8+CLiIKKworIywgZnV6enkKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICIiCisizqDPgc6/zq3Ous+Fz4jOtSDOrc69zrEgz4PPhs6szrvOvM6xIM60zrnOus+Ez43Ov8+FIM6uIM6/IM60zrnOsc66zr/OvM65z4PPhM6uz4Igzq3Ous67zrXOuc+DzrUgzr7Osc+Gzr3Ouc66zqwgz4TOtyDPg8+Nzr3OtM61z4POty4iCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIs6fIM60zrnOsc66zr/OvM65z4PPhM6uz4Igzq3Pg8+EzrXOuc67zrUgzrvOrM64zr/PgiDOtM61zrTOv868zq3Ovc6xLiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICLOnyDOtM65zrHOus6/zrzOuc+Dz4TOrs+CIM60zrXOvSDPhc+Azr/Pg8+EzrfPgc6vzrbOtc65IM6xzr3Osc62zq7PhM63z4POty4iCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIs6azrHOvM6vzrEgzq4gzqzOus+Fz4HOtyDOtc65z4POsc6zz4nOs86uIM6uz4fOv8+FLCDOtyBBVkkgz4HOv86uIM64zrEgzrrOsc+EzrHPgc+BzrXPjc+DzrXOuS4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIs6Rz4XPhM+MIM+Ezr8gzrHPgc+HzrXOr86/IM60zrXOvSDPgM61z4HOuc6tz4fOtc65IM6xzr3Osc+AzrHPgc6xzrPPjs6zzrnOvM61z4Igz4HOv86tz4IuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICLOpM6/IM6xz4HPh861zq/OvyDOsc+Fz4TPjCDOtM61zr0gzrXOr869zrHOuSDOrc6zzrrPhc+Bzr8gzrrOsc65IM60zrXOvSDOvM+Azr/Pgc61zq8gzr3OsSDOsc69zrHPgM6xz4HOsc+HzrjOtc6vLiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIs6kzr8gzrHPgc+HzrXOr86/IM6xz4XPhM+MIM61zq/Ovc6xzrkgzrrOsc+EzrXPg8+Ez4HOsc68zrzOrc69zr8gzrrOsc65IM60zrXOvSDOvM+Azr/Pgc61zq8gzr3OsSDOsc69zrHPgM6xz4HOsc+HzrjOtc6vLiAiCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIs6GzrrPhc+Bzr8gzrzOrc6zzrXOuM6/z4IgzrHPhM+MzrzOv8+FLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAizqTOvyDOsc+Bz4fOtc6vzr8gzrHPhc+Ez4wgzrXOr869zrHOuSDOsc69zr/Ou86/zrrOu86uz4HPic+Ezr8gzrrOsc65IM60zrXOvSDOvM+Azr/Pgc61zq8gzr3OsSDOsc69zrHPgM6xz4HOsc+HzrjOtc6vLiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAizqTOvyDOss6vzr3PhM61zr8gz4POtSDOsc+Fz4TPjCDPhM6/IM6xz4HPh861zq/OvyDOvM+Azr/Pgc61zq8gzr3OsSDOvM63zr0gzrHOvc6xz4DOsc+BzrHPh864zrXOryDPg8+Jz4PPhM6sLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICLOkc+Fz4TPjCDPhM6/IM6xz4HPh861zq/OvyDPgM61z4HOuc6tz4fOtc65IM+Azr/Ou867zq3PgiDPgc6/zq3Pgi4gzpHOvc6xz4DOsc+BzqzOs861z4TOsc65IM68z4zOvc6/IM63IM+Az4HPjs+EzrcgJWQiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorIs6UzrXOvSDOss+Bzq3OuM63zrrOtSDOus6xzrzOr86xIM+Fz4DOv8+Dz4TOt8+BzrnOts+MzrzOtc69zrcgz4HOv86uLiDOlc6vzr3Osc65IM+AzrnOuM6xzr3PjM69IM69zrEgz4DPgc6tz4DOtc65IM69zrEgzrrOrM69zrXPhM61ICIKKyLOtc6zzrrOsc+EzqzPg8+EzrHPg863IM6tzr3OsSDPgM+Bz4zPg864zrXPhM6/IEdTdHJlYW1lciBSVFNQIM6zzrnOsSDPhM65z4Igz4HOv86tz4IgUmVhbCDOvM6tz4PPic69LiAiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKyLOlM61zr0gzrLPgc6tzrjOt866zrUgzrrOsc68zq/OsSDPhc+Azr/Pg8+EzrfPgc65zrbPjM68zrXOvc63IM+Bzr/Ori4gzpXOr869zrHOuSDPgM65zrjOsc69z4zOvSDOvc6xIM+Hz4HOtc65zrHPg864zrXOryDOvc6xICIKKyLOtc+AzrnPhM+Bzq3PiM61z4TOtSDPgM61z4HOuc+Dz4PPjM+EzrXPgc6xIM+Az4HPic+Ez4zOus6/zrvOu86xIM68zrXPhM6xzrPPic6zzq7PgiDOriDOsc67zrvOuc+Oz4Igzr3OsSDPg86xz4IgzrvOtc6vz4DOtc65IM+Ezr8gz4PPic+Dz4TPjCAiCisiz4DPgc+Mz4POuM61z4TOvyBSVFNQIM+Ezr/PhSBHU3RyZWFtZXIuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIs6UzrXOvSDOrs+EzrHOvSDOtM+Fzr3Osc+Ez4wgz4TOvyDOrM69zr/Ouc6zzrzOsSDPhM63z4Igz4PPhc+DzrrOtc+Fzq7PgiDOrs+Hzr/PhSDOs865zrEgzrHOvc6xz4DOsc+BzrHOs8+JzrPOri4gzpcgz4PPhc+DzrrOtc+Fzq4gIgorIs+Hz4HOt8+DzrnOvM6/z4DOv865zrXOr8+EzrHOuSDOsc+Az4wgzrzOuc6xIM6szrvOu863IM61z4bOsc+BzrzOv86zzq4uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyLOlM61zr0gzq7PhM6xzr0gzrTPhc69zrHPhM+MIM+Ezr8gzqzOvc6/zrnOs868zrEgz4TOt8+CIM+Dz4XPg866zrXPhc6uz4Igzq7Ph86/z4UgzrPOuc6xIM6xzr3Osc+AzrHPgc6xzrPPic6zzq4uIM6UzrXOvSDOrc+HzrXPhM61IM+EzrEgIgorIs60zrnOus6xzrnPjs68zrHPhM6xIM69zrEgzrHOvc6/zq/Ovs61z4TOtSDPhM63zr0gz4PPhc+DzrrOtc+Fzq4uIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIs6UzrXOvSDOrs+EzrHOvSDOtM+Fzr3Osc+Ez4wgz4TOvyDOrM69zr/Ouc6zzrzOsSDPhM63z4Igz4PPhc+DzrrOtc+Fzq7PgiDOrs+Hzr/PhSDOs865zrEgzrHOvc6xz4DOsc+BzrHOs8+JzrPOri4gIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIs6UzrXOvSDOrs+EzrHOvSDOtM+Fzr3Osc+Ez4wgz4TOvyDOrM69zr/Ouc6zzrzOsSDPhM63z4Igz4PPhc+DzrrOtc+Fzq7PgiDOrs+Hzr/PhSDOs865zrEgzrHOvc6xz4DOsc+BzrHOs8+JzrPOri4gzpHPhc+Ezq4gzrcgzq3Ous60zr/Pg863ICIKKyLPhM6/z4UgT3BlbiBTb3VuZCBTeXN0ZW0gzrTOtc69IM+Fz4DOv8+Dz4TOt8+Bzq/Ots61z4TOsc65IM6xz4DPjCDOsc+Fz4TPjCDPhM6/IM+Dz4TOv865z4fOtc6vzr8uIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIs6Rz4XPhM6uIM63IM+Dz4XPg866zrXPhc6uIM6uz4fOv8+FIM60zrXOvSDPhc+Azr/Pg8+EzrfPgc6vzrbOtc65IM6xzr3Osc+AzrHPgc6xzrPPic6zzq4uIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICLOo8+GzqzOu868zrEgzrHOvc6xz4DOsc+BzrHOs8+JzrPOrs+CIM6uz4fOv8+FIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLOkc+Fz4TOriDOtyDPg8+Fz4POus61z4XOriDOrs+Hzr/PhSDOtM61zr0gz4XPgM6/z4PPhM63z4HOr862zrXOuSDOtc6zzrPPgc6xz4bOri4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLOo8+GzqzOu868zrEgzrrOsc+Ezqwgz4TOt869IM61zrPOs8+BzrHPhs6uIM6xz4DPjCDPhM63IM+Dz4XPg866zrXPhc6uIM6uz4fOv8+FLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIs6UzrXOvSDOrs+EzrHOvSDOtM+Fzr3Osc+Ez4wgz4TOvyDOrM69zr/Ouc6zzrzOsSDPhM63z4Igz4PPhc+DzrrOtc+Fzq7PgiDOrs+Hzr/PhSDOs865zrEgzrXOs86zz4HOsc+Gzq4uIM6UzrXOvSDOrc+HzrXPhM61IM+EzrEgIgorIs60zrnOus6xzrnPjs68zrHPhM6xIM69zrEgzrHOvc6/zq/Ovs61z4TOtSDPhM63zr0gz4PPhc+DzrrOtc+Fzq4uIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICLOlM61zr0gzq7PhM6xzr0gzrTPhc69zrHPhM+MIM+Ezr8gzqzOvc6/zrnOs868zrEgz4TOt8+CIM+Dz4XPg866zrXPhc6uz4Igzq7Ph86/z4UgzrPOuc6xIM61zrPOs8+BzrHPhs6uLiAiCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICIiCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICLOoM63zrPOriDOtc6zzrPPgc6xz4bOrs+CIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAizpzOuc66z4HPjM+Gz4nOvc6/IgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAizpXOr8+Dzr/OtM6/z4IgzrPPgc6xzrzOvM6uz4IiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAizpXPg8+Jz4TOtc+BzrnOus+MIENEIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIs6Vzq/Pg860zr/PgiBTUERJRiIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICLOlc6vz4POv860zrnPgiBBVVggMSIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICLOlc6vz4POv860zr/PgiBBVVggMiIKKworIywgZnV6enkKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAizpHOvc6xz4TPgc6/z4bOv860z4zPhM63z4POtyIKKworIywgZnV6enkKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgIs6Rzr3Osc+Ez4HOv8+Gzr/OtM+Mz4TOt8+DzrciCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIs6Izr3PhM6xz4POtyIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIs6azq3Pgc60zr/PgiIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIs6fzrjPjM69zrciCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICLOlc69z4PPic68zrHPhM+JzrzOrc69zr8gzrzOtc6zzqzPhs+Jzr3OvyIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAizpHOus6/z4XPg8+EzrnOus+MIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIs6Tz4HOsc68zrzOriDOtc6+z4zOtM6/z4UiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIlNQRElGIE91dCIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiQVVYIDEgT3V0IgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICJBVVggMiBPdXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAizqPPhs6szrvOvM6xIM66zrHPhM6sIM+EzrfOvSDOsc69zqzOs869z4nPg863ICVkIGJ5dGVzIM6xz4DOvyDPhM63zr0gz4PPhc+DzrrOtc+Fzq4gJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAizpHOtM+Fzr3Osc68zq/OsSDPh86xz4HPhM6/zrPPgc6sz4bOt8+DzrfPgiBidWZmZXIgzrPOuc6xIM+Ezrcgz4PPhc+DzrrOtc+Fzq4gJyVzJyIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIs6fIM6/zrTOt86zz4zPgiDPhM63z4Igz4PPhc+DzrrOtc+Fzq7PgiAnJXMnIM60zrXOvSDPhc+Azr/Pg8+EzrfPgc6vzrbOtc65IM66zqzPgM6/zrnOsSDOs869z4nPg8+Ezq4gzrzOrc64zr/OtM6/IM67zq7PiM63z4IuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIs6fIM6/zrTOt86zz4zPgiDPhM63z4Igz4PPhc+DzrrOtc+Fzq7PgiAnJXMnIM60zrXOvSDPhc+Azr/Pg8+EzrfPgc6vzrbOtc65IM66zqzPgM6/zrnOsSDOs869z4nPg8+Ezq4gzrzOrc64zr/OtM6/IM67zq7PiM63z4IuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIs6XIM+Dz4XPg866zrXPhc6uICclcycgzrTOtc69IM61zq/Ovc6xzrkgzrzOuc6xIM+Dz4XPg866zrXPhc6uIM67zq7PiM63z4IuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAizpcgz4PPhc+DzrrOtc+Fzq4gJyVzJyDOtM61zr0gzrXOr869zrHOuSDOvM65zrEgz4PPhc+DzrrOtc+Fzq4gzrvOrs+IzrfPgi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAizpTOtc69IM6uz4TOsc69IM60z4XOvc6xz4TOriDOtyDOsc69zqzOs869z4nPg863IM+Ez4nOvSDPgM6xz4HOsc68zq3PhM+Bz4nOvSDPg8+EzrfOvSDPg8+Fz4POus61z4XOriAnJXMnIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAizpcgz4PPhc+DzrrOtc+Fzq4gzrXOuc+Dz4zOtM6/z4UgzrLOr869z4TOtc6/IM60zrXOvSDOsc+Azr/OtM6tz4fOuM63zrrOtSDPhM63IM69zq3OsSDPgc+NzrjOvM65z4POtyDPhM6xz4fPjc+EzrfPhM6xz4IgzrrOsc+Bzq0uIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIs6XIM+Dz4XPg866zrXPhc6uIM61zrnPg8+MzrTOv8+FIM6yzq/Ovc+EzrXOvyDOtM61zr0gzrHPgM6/zrTOrc+HzrjOt866zrUgz4TOtyDOvc6tzrEgz4HPjc64zrzOuc+Dzrcgz4TOsc+Hz43PhM63z4TOsc+CIM66zrHPgc6tLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAizp8gzr/OtM63zrPPjM+CIM+EzrfPgiDPg8+Fz4POus61z4XOrs+CICclcycgzrTOtc69IM+Fz4DOv8+Dz4TOt8+Bzq/Ots61zrkgzrrOrM+Azr/Ouc6xIM6zzr3Pic+Dz4TOriDOvM6tzrjOv860zr8gzrvOrs+IzrfPgi4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAizpcgz4PPhc+DzrrOtc+Fzq4gzrXOuc+Dz4zOtM6/z4UgzrLOr869z4TOtc6/IM60zrXOvSDOsc+Azr/OtM6tz4fOuM63zrrOtSDPhM63IM69zq3OsSDPgc+NzrjOvM65z4POtyDPhM6xz4fPjc+EzrfPhM6xz4IgzrrOsc+Bzq0uIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAizpHPgM6/z4TPhc+Hzq/OsSDOsc69zqzOs869z4nPg863z4Igz4TPic69IM+Bz4XOuM68zq/Pg861z4nOvSDOtM6tzrrPhM63ICVkIM+Dz4TOt869IM+Dz4XPg866zrXPhc6uICclcycuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLOo8+GzqzOu868zrEgzrrOsc+Ezqwgz4TOt869IM6xzr3OrM6zzr3Pic+DzrcgJWQgYnl0ZXMgzrHPgM6/IM+EzrfOvSDPg8+Fz4POus61z4XOriAnJXMnLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICLOlyDPg8+Fz4POus61z4XOriAnJXMnIM60zrXOvSDOtc6vzr3Osc65IM+Dz4XPg866zrXPhc6uIM61zr7PjM60zr/PhS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAizpHPgM6/z4TPhc+Hzq/OsSDPgc+NzrjOvM65z4POt8+CIM61zrnPg86xzrPPic6zzq7PgiAlZCDPg8+EzrfOvSDPg8+Fz4POus61z4XOriAlcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICLOkc+Azr/PhM+Fz4fOr86xIM+Bz43OuM68zrnPg863z4IgzrXOuc+DzrHOs8+JzrPOrs+CICVkIM+Dz4TOt869IM+Dz4XPg866zrXPhc6uICVzLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIs6Rz4DOv8+Ez4XPh86vzrEgzrHOvc6szrPOvc+Jz4POt8+CIM65z4PPh8+Nz4Igz4POrs68zrHPhM6/z4IgzrPOuc6xIM+EzrfOvSDPg8+Fz4POus61z4XOriAnJXMnLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAizp8gzr/OtM63zrPPjM+CIM+EzrfPgiDPg8+Fz4POus61z4XOrs+CICclcycgzrTOtc69IM+Fz4DOv8+Dz4TOt8+Bzq/Ots61zrkgzrrOrM+Azr/Ouc6xIM6zzr3Pic+Dz4TOriDOvM6tzrjOv860zr8gzrvOrs+IzrfPgi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICLOkc+Azr/PhM+Fz4fOr86xIM6xz4DOv866z4nOtM65zrrOv8+Azr/Or863z4POt8+CIM+EzrfPgiDOtc65zrrPjM69zrHPgiBKUEVHIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisizqPPhs6szrvOvM6xIM66zrHPhM6sIM+EzrcgzrvOrs+IzrcgzrTPhc69zrHPhM6/z4TOrs+Ez4nOvSDPhM63z4Igz4PPhc+DzrrOtc+Fzq7PgiAnJXMnOiDOlM61zr0gzrXOr869zrHOuSDOv860zrfOs8+Mz4IgdjRsMi4gIgorIs6VzrvOrc6zzr7PhM61IM6xzr0gzrXOr869zrHOuSDOv860zrfOs8+Mz4IgdjRsMi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICLOkc+Azr/PhM+Fz4fOr86xIM6xzr3Or8+Hzr3Otc+Fz4POt8+CIM65zrTOuc6/z4TOrs+Ez4nOvSDPhM63z4IgzrXOuc+Dz4zOtM6/z4UgJWQgz4PPhM63IM+Dz4XPg866zrXPhc6uICVzIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIs6Rz4DOv8+Ez4XPh86vzrEgzrHOvc6szrPOvc+Jz4POt8+CIM+Ez4nOvSDPgc+FzrjOvM6vz4POtc+Jzr0gzrTOrc66z4TOtyAlZCDPg8+EzrfOvSDPg8+Fz4POus61z4XOriAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIs6Rz4DOv8+Ez4XPh86vzrEgzrHOvc6vz4fOvc61z4XPg863z4IgzrrOsc69zr/Ovc65zrrOv8+Azr/Or863z4POt8+CIM+Dz4TOtyDPg8+Fz4POus61z4XOriAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIs6Rz4DOv8+Ez4XPh86vzrEgzrrOsc+Ezqwgz4TOt869IM6xzr3OrM6zzr3Pic+Dzrcgz4TPic69IM+HzrHPgc6xzrrPhM63z4HOuc+Dz4TOuc66z47OvSDOtc67zq3Os8+Hzr/PhSDPg8+EzrfOvSDPg8+Fz4POus61z4XOriAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICLOlM61zr0gzq7PhM6xzr0gzrTPhc69zrHPhM6uIM63IM+EzrHPhc+Ezr/PgM6/zq/Ot8+Dzrcgz4TOt8+CIM+Dz4XPg866zrXPhc6uz4IgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAizpHPhc+Ezq4gzrTOtc69IM61zq/Ovc6xzrkgzrzOuc6xIM+Dz4XOus61z4XOriAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIiIKKyLOlM61zr0gzq7PhM6xzr0gzrTPhc69zrHPhM+MIM+Ezr8gzqzOvc6/zrnOs868zrEgz4TOt8+CIM+Dz4XPg866zrXPhc6uz4IgJyVzJyDOs865zrEgzrHOvc6szrPOvc+Jz4POtyDOus6xzrkgzrPPgc6sz4jOuc68zr8uICIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIs6XIM+Dz4XPg866zrXPhc6uICclcycgzrTOtc69IM61zq/Ovc6xzrkgzrzOuc6xIM+Dz4XPg866zrXPhc6uIM67zq7PiM63z4IuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICLOlyDPg8+Fz4POus61z4XOriAnJXMnIM60zrXOvSDOtc6vzr3Osc65IM+Dz4XPg866zrXPhc6uIM61zr7PjM60zr/PhS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICLOlyDPg8+Fz4POus61z4XOriAnJXMnIM60zrXOvSDOtc6vzr3Osc65IM+Dz4XPg866zrXPhc6uIM61zr7PjM60zr/PhS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICIiCisizpTOtc69IM6uz4TOsc69IM60z4XOvc6xz4TPjCDPhM6/IM6szr3Ov865zrPOvM6xIM+EzrfPgiDPg8+Fz4POus61z4XOrs+CICclcycgzrPOuc6xIM6xzr3OrM6zzr3Pic+DzrcgzrrOsc65IM6zz4HOrM+IzrnOvM6/LiAiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIs6Rz4DOv8+Ez4XPh86vzrEgz4HPjc64zrzOuc+DzrfPgiDOus6xzr3PjM69zrEgzrPOuc6xIM+EzrfOvSDPg8+Fz4POus61z4XOriAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyLOkc+Azr/PhM+Fz4fOr86xIM6xzr3OrM6zzr3Pic+DzrfPgiDPhM63z4Igz4TPgc6tz4fOv8+Fz4POsc+CIM+Dz4XPh869z4zPhM63z4TOsc+CIM60zq3Ous+EzrcgzrPOuc6xIM+EzrfOvSDPg8+Fz4POus61z4XOriAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisizpHPgM6/z4TPhc+Hzq/OsSDPgc+NzrjOvM65z4POt8+CIM+Ez4HOrc+Hzr/Phc+DzrHPgiDPg8+Fz4fOvc+Mz4TOt8+EzrHPgiDOtM6tzrrPhM63IM6zzrnOsSDPhM63zr0gz4PPhc+DzrrOtc+Fzq4gJyVzJyDPg8+EzrEgJWx1IEh6IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIs6Rz4DOv8+Ez4XPh86vzrEgzrHOvc6szrPOvc+Jz4POt8+CIM65z4PPh8+Nz4Igz4POrs68zrHPhM6/z4IgzrPOuc6xIM+EzrfOvSDPg8+Fz4POus61z4XOriAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAizpHPgM6/z4TPhc+Hzq/OsSDOsc69zqzOs869z4nPg863z4Igz4TOuc68zq7PgiDOs865zrEgz4TOv869IM6tzrvOtc6zz4fOvyAlZCDPg8+EzrfOvSDPg8+Fz4POus61z4XOriAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAizpHPgM6/z4TPhc+Hzq/OsSDPgc+NzrjOvM65z4POt8+CIM+EzrnOvM6uz4IgJWQgzrPOuc6xIM+Ezr/OvSDOrc67zrXOs8+Hzr8gJWQgz4PPhM63zr0gz4PPhc+DzrrOtc+Fzq4gJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyLOkc+Azr/PhM+Fz4fOr86xIM6xzr3OrM6zzr3Pic+DzrfPgiDPhM63z4Igz4TPgc6tz4fOv8+Fz4POsc+CIM61zrnPg86xzrPPic6zzq7PgiDPg8+EzrfOvSDPg8+Fz4POus61z4XOriAnJXMnLiDOoM65zrjOsc69z4zOvSDOvc6xICIKKyLOtc6vzr3Osc65IM68zrnOsSDPg8+Fz4POus61z4XOriDPgc6szrTOuc6/IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyLOkc+Azr/PhM+Fz4fOr86xIM6xzr3OrM6zzr3Pic+DzrfPgiDPhM63z4Igz4TPgc6tz4fOv8+Fz4POsc+CIM61zr7PjM60zr/PhSDPg8+EzrfOvSDPg8+Fz4POus61z4XOriAnJXMnLiDOoM65zrjOsc69z4zOvSDOvc6xIM61zq/Ovc6xzrkgIgorIs68zrnOsSDPg8+Fz4POus61z4XOriDPgc6szrTOuc6/IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIs6Rz4DOv8+Ez4XPh86vzrEgzr/Pgc65z4POvM6/z40gzrXOvs+MzrTOv8+FICVkIM+Dz4TOt869IM+Dz4XPg866zrXPhc6uICVzLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIiIKKyLOlyDOsc67zrvOsc6zzq4gz4TOt8+CIM6xzr3OrM67z4XPg863z4IgzrrOsc+Ezqwgz4TOtyDOtM65zqzPgc66zrXOuc6xIM67zrXOuc+Ezr/Phc+BzrPOr86xz4IgzrTOtc69IM+Fz4DOv8+Dz4TOt8+Bzq/Ots61z4TOsc65IM6xzrrPjM68zrEuIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICLOlM61zr0gzrXOr869zrHOuSDOtM+Fzr3Osc+Ezq4gzrcgzrvOtc65z4TOv8+Fz4HOs86vzrEgz4fPic+Bzq/PgiDPgc6/zrvPjM65ICIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzb3VuZCBzZXJ2ZXIiCisjfiBtc2dzdHIgIs6UzrXOvSDOrs+EzrHOvSDOtM+Fzr3Osc+Ezq4gzrcgz4PPjc69zrTOtc+DzrcgzrzOtSDPhM6/zr0gzrTOuc6xzrrOv868zrnPg8+Ezq4gzq7Ph86/z4UiCisKKyN+IG1zZ2lkICJGYWlsZWQgdG8gcXVlcnkgc291bmQgc2VydmVyIGNhcGFiaWxpdGllcyIKKyN+IG1zZ3N0ciAizpHPgM6/z4TPhc+Hzq/OsSDOsc69zrHOts6uz4TOt8+DzrfPgiDPhM+Jzr0gzrTPhc69zrHPhM6/z4TOrs+Ez4nOvSDPhM6/z4UgzrTOuc6xzrrOv868zrnPg8+Ezq4gzq7Ph86/z4UiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIs6Vz4PPic+EzrXPgc65zrrPjCDPg8+GzqzOu868zrEgz4HOv86uz4IgzrTOtc60zr/OvM6tzr3Pic69LiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgZmxvdyBlcnJvci4iCisjfiBtc2dzdHIgIs6Vz4PPic+EzrXPgc65zrrPjCDPg8+GzqzOu868zrEgz4HOv86uz4IgzrTOtc60zr/OvM6tzr3Pic69LiIKKworI34gbXNnaWQgIkJhc3MiCisjfiBtc2dzdHIgIs6cz4DOrM+DzrEiCisKKyN+IG1zZ2lkICJUcmVibGUiCisjfiBtc2dzdHIgIs6gz4HOr868zrEgKHRyZWJsZSkiCisKKyN+IG1zZ2lkICJTeW50aCIKKyN+IG1zZ3N0ciAiU3ludGgiCisKKyN+IG1zZ2lkICJQQ00iCisjfiBtc2dzdHIgIlBDTSIKKworI34gbXNnaWQgIlNwZWFrZXIiCisjfiBtc2dzdHIgIs6czrXOs86sz4bPic69zr8iCisKKyN+IG1zZ2lkICJMaW5lLWluIgorI34gbXNnc3RyICLOk8+BzrHOvM68zq4tzrXOuc+Dz4zOtM6/z4UiCisKKyN+IG1zZ2lkICJDRCIKKyN+IG1zZ3N0ciAiQ0QiCisKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAizpzOtc6vzrrPhM63z4IiCisKKyN+IG1zZ2lkICJQQ00tMiIKKyN+IG1zZ3N0ciAiUENNLTIiCisKKyN+IG1zZ2lkICJSZWNvcmQiCisjfiBtc2dzdHIgIs6VzrPOs8+BzrHPhs6uIgorCisjfiBtc2dpZCAiSW4tZ2FpbiIKKyN+IG1zZ3N0ciAizprOrc+BzrTOv8+CIM61zrnPg8+MzrTOv8+FIgorCisjfiBtc2dpZCAiT3V0LWdhaW4iCisjfiBtc2dzdHIgIs6azq3Pgc60zr/PgiDOtc6+z4zOtM6/z4UiCisKKyN+IG1zZ2lkICJMaW5lLTEiCisjfiBtc2dzdHIgIs6Tz4HOsc68zrzOri0xIgorCisjfiBtc2dpZCAiTGluZS0yIgorI34gbXNnc3RyICLOk8+BzrHOvM68zq4tMiIKKworI34gbXNnaWQgIkxpbmUtMyIKKyN+IG1zZ3N0ciAizpPPgc6xzrzOvM6uLTMiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTEiCisjfiBtc2dzdHIgIs6ozrfPhs65zrHOus+MLTEiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTIiCisjfiBtc2dzdHIgIs6ozrfPhs65zrHOus+MLTIiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTMiCisjfiBtc2dzdHIgIs6ozrfPhs65zrHOus+MLTMiCisKKyN+IG1zZ2lkICJQaG9uZS1pbiIKKyN+IG1zZ3N0ciAizpXOr8+Dzr/OtM6/z4Igz4TOt867zrXPhs+Ozr3Ov8+FIgorCisjfiBtc2dpZCAiUGhvbmUtb3V0IgorI34gbXNnc3RyICLOiM6+zr/OtM6/z4Igz4TOt867zrXPhs+Ozr3Ov8+FIgorCisjfiBtc2dpZCAiVmlkZW8iCisjfiBtc2dzdHIgIs6Szq/Ovc+EzrXOvyIKKworI34gbXNnaWQgIlJhZGlvIgorI34gbXNnc3RyICLOoc6szrTOuc6/IgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKKyN+IG1zZ3N0ciAiIgorI34gIs6UzrXOvSDOrs+EzrHOvSDOtM+Fzr3Osc+Ez4wgz4TOvyDOrM69zr/Ouc6zzrzOsSDPhM63z4Igz4PPhc+DzrrOtc+Fzq7PgiDOrs+Hzr/PhSDOs865zrEgz4fOtc65z4HOuc+DzrzPjCDPhM6/z4UgzrXOu86tzrPPh86/z4Ugz4TOv8+FICIKKyN+ICLOvM6vzrrPhM63LiAiCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICLOlM61zr0gzq7PhM6xzr0gzrTPhc69zrHPhM+MIM+Ezr8gzqzOvc6/zrnOs868zrEgz4TOt8+CIM+Dz4XPg866zrXPhc6uz4Igzq7Ph86/z4UgzrPOuc6xIM+HzrXOuc+BzrnPg868z4wgz4TOv8+FIM61zrvOrc6zz4fOv8+FIM+Ezr/PhSAiCisjfiAizrzOr866z4TOty4gzpHPhc+Ezq4gzrcgzq3Ous60zr/Pg863IM+Ezr/PhSBPcGVuIFNvdW5kIFN5c3RlbSDOtM61zr0gz4XPgM6/z4PPhM63z4HOr862zrXPhM6xzrkgzrHPgM+MIM6xz4XPhM+MIM6/z4QgIgorI34gIs+Dz4TOv865z4fOtc6vzr8uIgorCisjfiBtc2dpZCAiTWFzdGVyIgorI34gbXNnc3RyICLOk861zr3Ouc66z4zPgiAoTWFzdGVyKSIKKworI34gbXNnaWQgIkZyb250IgorI34gbXNnc3RyICLOnM+Az4HOv8+Dz4TOrCIKKworI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIs6gzq/Pg8+JIgorCisjfiBtc2dpZCAiSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAizpHOus6/z4XPg8+EzrnOus6sIgorCisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICLOms6tzr3PhM+Bzr8iCisKKyN+IG1zZ2lkICJMRkUiCisjfiBtc2dzdHIgIs6nzrHOvM63zrvPjs69IM+Dz4XPh869zr/PhM6uz4TPic69IChMRkUpIgorCisjfiBtc2dpZCAiU3Vycm91bmQiCisjfiBtc2dzdHIgIs6gzrXPgc65zrLOrM67zrvPic69IChTdXJyb3VuZCkiCisKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICLOoM67zrXPhc+BzrnOus+MIgorCisjfiBtc2dpZCAiQVVYIE91dCIKKyN+IG1zZ3N0ciAizojOvs6/zrTOv8+CIEFVWCIKKworI34gbXNnaWQgIjNEIERlcHRoIgorI34gbXNnc3RyICLOks6szrjOv8+CIDNEIgorCisjfiBtc2dpZCAiM0QgQ2VudGVyIgorI34gbXNnc3RyICLOms6tzr3PhM+Bzr8gM0QiCisKKyN+IG1zZ2lkICIzRCBFbmhhbmNlIgorI34gbXNnc3RyICLOlc69zq/Pg8+Hz4XPg863IDNEIgorCisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICLOpM63zrvOrc+Gz4nOvc6/IgorCisjfiBtc2dpZCAiVmlkZW8gSW4iCisjfiBtc2dzdHIgIs6Vzq/Pg86/zrTOv8+CIM6yzq/Ovc+EzrXOvyIKKworI34gbXNnaWQgIkFVWCBJbiIKKyN+IG1zZ3N0ciAizpXOr8+Dzr/OtM6/z4IgQVVYIgorCisjfiBtc2dpZCAiUmVjb3JkIEdhaW4iCisjfiBtc2dzdHIgIs6azq3Pgc60zr/PgiDOlc6zzrPPgc6xz4bOrs+CIgorCisjfiBtc2dpZCAiT3V0cHV0IEdhaW4iCisjfiBtc2dzdHIgIs6azq3Pgc60zr/PgiDOtc6+z4zOtM6/z4UiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEJvb3N0IgorI34gbXNnc3RyICLOlc69zq/Pg8+Hz4XPg863IM68zrnOus+Bzr/Phs+Ozr3Ov8+FIgorCisjfiBtc2dpZCAiRGlhZ25vc3RpYyIKKyN+IG1zZ3N0ciAizpTOuc6xzrPOvc+Jz4PPhM65zrrPjCIKKworI34gbXNnaWQgIkJhc3MgQm9vc3QiCisjfiBtc2dzdHIgIs6Vzr3Or8+Dz4fPhc+Dzrcgz4fOsc68zrfOu8+Ozr0iCisKKyN+IG1zZ2lkICJQbGF5YmFjayBQb3J0cyIKKyN+IG1zZ3N0ciAizpjPjc+BzrXPgiDOkc69zrHPgM6xz4HOsc6zz4nOs86uz4IiCisKKyN+IG1zZ2lkICJJbnB1dCIKKyN+IG1zZ3N0ciAizpXOr8+Dzr/OtM6/z4IiCisKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAizqDOsc+BzrHOus6/zrvOv8+NzrjOt8+Dzrcgz4DOt86zzq7PgiIKKworI34gbXNnaWQgIktleWJvYXJkIEJlZXAiCisjfiBtc2dzdHIgIs6Jz4fOv8+CIM+AzrvOt866z4TPgc6/zrvOv86zzq/Ov8+FIgorCisjfiBtc2dpZCAiU2ltdWxhdGUgU3RlcmVvIgorI34gbXNnc3RyICLOoM+Bzr/Pg86/zrzOv86vz4nPg863IM+Dz4TOrc+BzrXOvyIKKworI34gbXNnaWQgIlN0ZXJlbyIKKyN+IG1zZ3N0ciAizqPPhM6tz4HOtc6/IgorCisjfiBtc2dpZCAiU3Vycm91bmQgU291bmQiCisjfiBtc2dzdHIgIs6Jz4fOv8+CIFN1cnJvdW5kIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBHYWluIgorI34gbXNnc3RyICLOms6tz4HOtM6/z4IgzrzOuc66z4HOv8+Gz47Ovc6/z4UiCisKKyN+IG1zZ2lkICJTcGVha2VyIFNvdXJjZSIKKyN+IG1zZ3N0ciAizqDOt86zzq4gzrzOtc6zzrHPhs+Ozr3Ov8+FIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBTb3VyY2UiCisjfiBtc2dzdHIgIs6gzrfOs86uIM68zrnOus+Bzr/Phs+Ozr3Ov8+FIgorCisjfiBtc2dpZCAiSmFjayIKKyN+IG1zZ3N0ciAizpLPjc+DzrzOsSIKKworI34gbXNnaWQgIkNlbnRlciAvIExGRSIKKyN+IG1zZ3N0ciAizprOtc69z4TPgc65zrrPjCAvIM6nzrHOvM63zrvPjs69IM+Dz4XPh869zr/PhM6uz4TPic69IgorCisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAizqPPhM61z4HOtc6/z4bPic69zrnOus6uIM68zq/Ovs63IgorCisjfiBtc2dpZCAiTW9ubyBNaXgiCisjfiBtc2dzdHIgIs6czr/Ovc6/z4bPic69zrnOus6uIM68zq/Ovs63IgorCisjfiBtc2dpZCAiSW5wdXQgTWl4IgorI34gbXNnc3RyICLOnM6vzr7OtyDOtc65z4PPjM60zr/PhSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAizpzOuc66z4HPjM+Gz4nOvc6/IDEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDIiCisjfiBtc2dzdHIgIs6czrnOus+Bz4zPhs+Jzr3OvyAyIgorCisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgIs6ozrfPhs65zrHOus6uIM6tzr7Ov860zr/PgiIKKworI34gbXNnaWQgIkRpZ2l0YWwgSW4iCisjfiBtc2dzdHIgIs6ozrfPhs65zrHOus6uIM61zq/Pg86/zrTOv8+CIgorCisjfiBtc2dpZCAiSERNSSIKKyN+IG1zZ3N0ciAiSERNSSIKKworI34gbXNnaWQgIk1vZGVtIgorI34gbXNnc3RyICJNb2RlbSIKKworI34gbXNnaWQgIkhhbmRzZXQiCisjfiBtc2dzdHIgIs6kzrfOu861z4bPic69zrnOus6uIM+Dz4XPg866zrXPhc6uIgorCisjfiBtc2dpZCAiT3RoZXIiCisjfiBtc2dzdHIgIs6GzrvOu86/IgorCisjfiBtc2dpZCAiTm9uZSIKKyN+IG1zZ3N0ciAizprOsc69zq3Ovc6xIgorCisjfiBtc2dpZCAiT24iCisjfiBtc2dzdHIgIk9uIgorCisjfiBtc2dpZCAiT2ZmIgorI34gbXNnc3RyICJPZmYiCisKKyN+IG1zZ2lkICJNdXRlIgorI34gbXNnc3RyICLOo86vzrPOsc+DzrciCisKKyN+IG1zZ2lkICJGYXN0IgorI34gbXNnc3RyICLOk8+Bzq7Os86/z4HOsSIKKworI34gbXNnaWQgIlZlcnkgTG93IgorI34gbXNnc3RyICLOoM6/zrvPjSDPh86xzrzOt867zq4iCisKKyN+IG1zZ2lkICJMb3ciCisjfiBtc2dzdHIgIs6nzrHOvM63zrvOriIKKworI34gbXNnaWQgIk1lZGl1bSIKKyN+IG1zZ3N0ciAizpzOtc+DzrHOr86xIgorCisjfiBtc2dpZCAiSGlnaCIKKyN+IG1zZ3N0ciAizqXPiM63zrvOriIKKworI34gbXNnaWQgIlZlcnkgSGlnaCIKKyN+IG1zZ3N0ciAizqDOv867z40gz4XPiM63zrvOriIKKworI34gbXNnaWQgIlByb2R1Y3Rpb24iCisjfiBtc2dzdHIgIs6gzrHPgc6xzrPPic6zzq7PgiIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCisjfiBtc2dzdHIgIs6czrnOus+Bz4zPhs+Jzr3OvyDOvM+Az4HOv8+Dz4TOuc69zr/PjSDPgM6szr3Otc67IgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBJbiIKKyN+IG1zZ3N0ciAizpXOr8+Dzr/OtM6/z4IgzrPPgc6xzrzOvM6uz4IgzrzPgM+Bzr/Pg8+EzrnOvc6/z40gz4DOrM69zrXOuyIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIEhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIs6RzrrOv8+Fz4PPhM65zrrOrCDOvM+Az4HOv8+Dz4TOuc69zr/PjSDPgM6szr3Otc67IgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBPdXQiCisjfiBtc2dzdHIgIs6Izr7Ov860zr/PgiDOs8+BzrHOvM68zq7PgiDOvM+Az4HOv8+Dz4TOuc69zr/PjSDPgM6szr3Otc67IgorCisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICLOoM+BzqzPg865zr3OtyDPhc+Azr/OtM6/z4fOriIKKworI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICLOoc6/zrYgz4XPgM6/zrTOv8+Hzq4iCisKKyN+IG1zZ2lkICJCbHVlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAizpzPgM67zrUgz4XPgM6/zrTOv8+Hzq4iCisKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIs6bzrXPhc66zq4gz4XPgM6/zrTOv8+Hzq4iCisKKyN+IG1zZ2lkICJCbGFjayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIs6czrHPjc+Bzrcgz4XPgM6/zrTOv8+Hzq4iCisKKyN+IG1zZ2lkICJHcmF5IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAizpPOus+Bzrkgz4XPgM6/zrTOv8+Hzq4iCisKKyN+IG1zZ2lkICJPcmFuZ2UgQ29ubmVjdG9yIgorI34gbXNnc3RyICLOoM6/z4HPhM6/zrrOsc67zq8gz4XPgM6/zrTOv8+Hzq4iCisKKyN+IG1zZ2lkICJSZWQgQ29ubmVjdG9yIgorI34gbXNnc3RyICLOms+MzrrOus65zr3OtyDPhc+Azr/OtM6/z4fOriIKKworI34gbXNnaWQgIlllbGxvdyBDb25uZWN0b3IiCisjfiBtc2dzdHIgIs6azq/PhM+BzrnOvc63IM+Fz4DOv860zr/Ph86uIgorCisjfiBtc2dpZCAiR3JlZW4gRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLOoM+BzqzPg865zr3OtyDPhc+Azr/OtM6/z4fOriDOvM+Az4HOv8+Dz4TOuc69zr/PjSDPgM6szr3Otc67IgorCisjfiBtc2dpZCAiUGluayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIs6hzr/OtiDPhc+Azr/OtM6/z4fOriDOvM+Az4HOv8+Dz4TOuc69zr/PjSDPgM6szr3Otc67IgorCisjfiBtc2dpZCAiQmx1ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIs6cz4DOu861IM+Fz4DOv860zr/Ph86uIM68z4DPgc6/z4PPhM65zr3Ov8+NIM+AzqzOvc61zrsiCisKKyN+IG1zZ2lkICJXaGl0ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIs6bzrXPhc66zq4gz4XPgM6/zrTOv8+Hzq4gzrzPgM+Bzr/Pg8+EzrnOvc6/z40gz4DOrM69zrXOuyIKKworI34gbXNnaWQgIkJsYWNrIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAizpzOsc+Nz4HOtyDPhc+Azr/OtM6/z4fOriDOvM+Az4HOv8+Dz4TOuc69zr/PjSDPgM6szr3Otc67IgorCisjfiBtc2dpZCAiR3JheSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIs6TzrrPgc65IM+Fz4DOv860zr/Ph86uIM68z4DPgc6/z4PPhM65zr3Ov8+NIM+AzqzOvc61zrsiCisKKyN+IG1zZ2lkICJPcmFuZ2UgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLOoM6/z4HPhM6/zrrOsc67zq8gz4XPgM6/zrTOv8+Hzq4gzrzPgM+Bzr/Pg8+EzrnOvc6/z40gz4DOrM69zrXOuyIKKworI34gbXNnaWQgIlJlZCBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIs6az4zOus66zrnOvc63IM+Fz4DOv860zr/Ph86uIM68z4DPgc6/z4PPhM65zr3Ov8+NIM+AzqzOvc61zrsiCisKKyN+IG1zZ2lkICJZZWxsb3cgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLOms6vz4TPgc65zr3OtyDPhc+Azr/OtM6/z4fOriDOvM+Az4HOv8+Dz4TOuc69zr/PjSDPgM6szr3Otc67IgorCisjfiBtc2dpZCAiU3ByZWFkIE91dHB1dCIKKyN+IG1zZ3N0ciAizpXPhc+BzrXOr86xIM6tzr7Ov860zr/PgiIKKworI34gbXNnaWQgIkRvd25taXgiCisjfiBtc2dzdHIgIs6czq/Ovs63IM+Dz4XOs8+Hz47Ovc61z4XPg863z4IgKERvd25taXgpIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBJbnB1dCIKKyN+IG1zZ3N0ciAizpXOr8+Dzr/OtM6/z4IgzrXOuc66zr/Ovc65zrrOv8+NIM68zq/Ous+EzrciCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIE91dHB1dCIKKyN+IG1zZ3N0ciAizojOvs6/zrTOv8+CIM61zrnOus6/zr3Ouc66zr/PjSDOvM6vzrrPhM63IgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBDaGFubmVscyIKKyN+IG1zZ3N0ciAizprOsc69zqzOu865zrEgzrXOuc66zr/Ovc65zrrOv8+NIM68zq/Ous+EzrciCisKKyN+IG1zZ2lkICIlcyAlZCBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAizpvOtc65z4TOv8+Fz4HOs86vzrEgJXMgJWQiCisKKyN+IG1zZ2lkICIlcyBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAizpvOtc65z4TOv8+Fz4HOs86vzrEgJXMiCisKKyN+IG1zZ2lkICJHb3QgdW5leHBlY3RlZCBmcmFtZSBzaXplIG9mICV1IGluc3RlYWQgb2YgJXUuIgorI34gbXNnc3RyICLOkc+Az4HOv8+DzrTPjM66zrfPhM6/IM68zq3Os861zrjOv8+CIM+AzrvOsc65z4POr86/z4UgzrHPgM+MICV1IM6xzr3PhM6vIM+Ezr/PhSAldSIKKworI34gbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgb24gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLOo8+GzqzOu868zrEgzrrOsc+Ezqwgz4TOt869IM6xzr3OrM6zzr3Pic+DzrcgJWQgYnl0ZXMgz4PPhM63zr0gz4PPhc+DzrrOtc+Fzq4gJyVzJy4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZW5xdWV1ZSBidWZmZXJzIGluIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAizpHOtM+Fzr3Osc68zq/OsSDOuM6tz4POt8+CIM+DzrUgz4POtc65z4HOrCDPhM+Jzr0gYnVmZmVyIM+Dz4TOtyDPg8+Fz4POus61z4XOriAnJXMnLiIKKworI34gbXNnaWQgIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAizpHPgM6/z4TPhc+Hzq/OsSDOsc69zqzOs869z4nPg863z4Igz4DOu86xzrnPg86vz4nOvSDOss6vzr3PhM61zr8gzrHPgM+MIM+EzrfOvSDPg8+Fz4POus61z4XOriAnJXMnLiIKKworI34gbXNnaWQgIkZhaWxlZCBhZnRlciAlZCB0cmllcy4gZGV2aWNlICVzLiBzeXN0ZW0gZXJyb3I6ICVzIgorI34gbXNnc3RyICIiCisjfiAizpHPgM6/z4TPhc+Hzq/OsSDOrc+AzrXOuc+EzrEgzrHPgM+MICVkIM+Az4HOv8+Dz4DOrM64zrXOuc61z4IuIM+Dz4XPg866zrXPhc6uICVzLiDPg8+GzqzOu868zrEgz4PPhc+Dz4TOrs68zrHPhM6/z4I6ICVzIgorCisjfiBtc2dpZCAiRGVzY3JpYmVzIHRoZSBzZWxlY3RlZCBpbnB1dCBlbGVtZW50LiIKKyN+IG1zZ3N0ciAizqDOtc+BzrnOs8+BzqzPhs61zrkgz4TOvyDOtc+AzrnOu861zrPOvM6tzr3OvyDPg8+Ezr/Ouc+HzrXOr86/IM61zrnPg86xzrPPic6zzq7Pgi4iCisKKyN+IG1zZ2lkICJEZXNjcmliZXMgdGhlIHNlbGVjdGVkIG91dHB1dCBlbGVtZW50IGZvciBBdWRpby9WaWRlbyBDb25mZXJlbmNpbmcuIgorI34gbXNnc3RyICIiCisjfiAizqDOtc+BzrnOs8+BzqzPhs61zrkgz4TOvyDOtc+AzrnOu861zrPOvM6tzr3OvyDPg8+Ezr/Ouc+HzrXOr86/IM61zr7PjM60zr/PhSDOs865zrEgz4TOvyBBdWRpby9WaWRlbyBDb25mZXJlbmNpbmcuIgorCisjfiBtc2dpZCAiRGVzY3JpYmVzIHRoZSBzZWxlY3RlZCBvdXRwdXQgZWxlbWVudCBmb3IgTXVzaWMgYW5kIE1vdmllcy4iCisjfiBtc2dzdHIgIs6gzrXPgc65zrPPgc6sz4bOtc65IM+Ezr8gzrXPgM65zrvOtc6zzrzOrc69zr8gz4PPhM6/zrnPh861zq/OvyDOtc6+z4zOtM6/z4UgzrPOuc6xIM68zr/Phc+DzrnOus6uIM66zrHOuSDPhM6xzrnOvc6vzrXPgi4iCisKKyN+IG1zZ2lkICJEZXNjcmliZXMgdGhlIHNlbGVjdGVkIG91dHB1dCBlbGVtZW50LiIKKyN+IG1zZ3N0ciAizqDOtc+BzrnOs8+BzqzPhs61zrkgz4TOvyDOtc+AzrnOu861zrPOvM6tzr3OvyDPg8+Ezr/Ouc+HzrXOr86/IM61zr7Osc6zz4nOs86uz4IuIgpkaWZmIC0tZ2l0IGEvcG8vZW5fR0IucG8gYi9wby9lbl9HQi5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWJkZTgxCi0tLSAvZGV2L251bGwKKysrIGIvcG8vZW5fR0IucG8KQEAgLTAsMCArMSw2MjEgQEAKKyMgRW5nbGlzaCAoQnJpdGlzaCkgdHJhbnNsYXRpb24uCisjIENvcHlyaWdodCAoQykgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgR2FyZXRoIE93ZW4gPGdvd2VuNzJAeWFob28uY29tPiwgMjAwNC4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zIDAuOC4xXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMDQtMDQtMjYgMTA6NDEtMDQwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogR2FyZXRoIE93ZW4gPGdvd2VuNzJAeWFob28uY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IEVuZ2xpc2ggKEJyaXRpc2gpIDxlbl9nYkBsaS5vcmc+XG4iCisiTGFuZ3VhZ2U6IGVuX0dCXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiIgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJDb3VsZCBub3QgY2xvc2UgY29udHJvbCBkZXZpY2UgXCIlc1wiLiIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJDb3VsZCBub3QgY2xvc2UgY29udHJvbCBkZXZpY2UgXCIlc1wiLiIKKworIywgZnV6enkKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiQ291bGQgbm90IGNsb3NlIGNvbnRyb2wgZGV2aWNlIFwiJXNcIi4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICIiCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiWW91ciBvc3MgZGV2aWNlIGNvdWxkIG5vdCBiZSBwcm9iZWQgY29ycmVjdGx5IgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBcIiVzXCIgZm9yIHdyaXRpbmcuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAiIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICIiCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIkNvdWxkIG5vdCBvcGVuIENEIGRldmljZSBmb3IgcmVhZGluZy4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiWW91ciBvc3MgZGV2aWNlIGNvdWxkIG5vdCBiZSBwcm9iZWQgY29ycmVjdGx5IgorCisjLCBmdXp6eQorbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIlJlY29yZCIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIk1pY3JvcGhvbmUiCisKKyMsIGZ1enp5Cittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAiTGluZS1pbiIKKworbXNnaWQgIkludGVybmFsIENEIgorbXNnc3RyICIiCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIiIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICIiCisKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiIgorCittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICIiCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIlZvbHVtZSIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIiIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIk1vbml0b3IiCisKKyMsIGZ1enp5Cittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiU3BlYWtlciIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIiIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICIiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQ291bGQgbm90IGdldCBidWZmZXJzIGZyb20gZGV2aWNlIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIkNvdWxkIG5vdCBnZXQgYnVmZmVycyBmcm9tIGRldmljZSBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIkRldmljZSBcIiVzXCIgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiRGV2aWNlIFwiJXNcIiBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICJEZXZpY2UgXCIlc1wiIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiRGV2aWNlIFwiJXNcIiBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiQ291bGQgbm90IGdldCBidWZmZXJzIGZyb20gZGV2aWNlIFwiJXNcIi4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICIiCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJDb3VsZCBub3QgZ2V0IGVub3VnaCBidWZmZXJzIGZyb20gZGV2aWNlIFwiJXNcIi4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkNvdWxkIG5vdCBnZXQgYnVmZmVycyBmcm9tIGRldmljZSBcIiVzXCIuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIkRldmljZSBcIiVzXCIgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIkNvdWxkIG5vdCBjbG9zZSBhdWRpbyBkZXZpY2UgXCIlc1wiLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJDb3VsZCBub3QgY2xvc2UgYXVkaW8gZGV2aWNlIFwiJXNcIi4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJDb3VsZCBub3QgZ2V0IGJ1ZmZlcnMgZnJvbSBkZXZpY2UgXCIlc1wiLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJDb3VsZCBub3QgZ2V0IGVub3VnaCBidWZmZXJzIGZyb20gZGV2aWNlIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQ291bGQgbm90IHdyaXRlIHRvIGRldmljZSBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgXCIlc1wiIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICJEZXZpY2UgXCIlc1wiIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIkRldmljZSBcIiVzXCIgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiRGV2aWNlIFwiJXNcIiBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgXCIlc1wiIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkNvdWxkIG5vdCBnZXQgYnVmZmVycyBmcm9tIGRldmljZSBcIiVzXCIuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkNvdWxkIG5vdCBnZXQgZW5vdWdoIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQ291bGQgbm90IGNsb3NlIGNvbnRyb2wgZGV2aWNlIFwiJXNcIi4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJDb3VsZCBub3QgY2xvc2UgY29udHJvbCBkZXZpY2UgXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICJDb3VsZCBub3QgZ2V0IGVub3VnaCBidWZmZXJzIGZyb20gZGV2aWNlIFwiJXNcIi4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIkNvdWxkIG5vdCBjbG9zZSBhdWRpbyBkZXZpY2UgXCIlc1wiLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAiRGV2aWNlIFwiJXNcIiBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJDb3VsZCBub3QgZ2V0IGVub3VnaCBidWZmZXJzIGZyb20gZGV2aWNlIFwiJXNcIi4iCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICJCYXNzIgorCisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICJUcmVibGUiCisKKyN+IG1zZ2lkICJTeW50aCIKKyN+IG1zZ3N0ciAiU3ludGgiCisKKyN+IG1zZ2lkICJQQ00iCisjfiBtc2dzdHIgIlBDTSIKKworI34gbXNnaWQgIlNwZWFrZXIiCisjfiBtc2dzdHIgIlNwZWFrZXIiCisKKyN+IG1zZ2lkICJMaW5lLWluIgorI34gbXNnc3RyICJMaW5lLWluIgorCisjfiBtc2dpZCAiQ0QiCisjfiBtc2dzdHIgIkNEIgorCisjfiBtc2dpZCAiTWl4ZXIiCisjfiBtc2dzdHIgIk1peGVyIgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIlBDTS0yIgorCisjfiBtc2dpZCAiUmVjb3JkIgorI34gbXNnc3RyICJSZWNvcmQiCisKKyN+IG1zZ2lkICJJbi1nYWluIgorI34gbXNnc3RyICJJbi1nYWluIgorCisjfiBtc2dpZCAiT3V0LWdhaW4iCisjfiBtc2dzdHIgIk91dC1nYWluIgorCisjfiBtc2dpZCAiTGluZS0xIgorI34gbXNnc3RyICJMaW5lLTEiCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgIkxpbmUtMiIKKworI34gbXNnaWQgIkxpbmUtMyIKKyN+IG1zZ3N0ciAiTGluZS0zIgorCisjfiBtc2dpZCAiRGlnaXRhbC0xIgorI34gbXNnc3RyICJEaWdpdGFsLTEiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTIiCisjfiBtc2dzdHIgIkRpZ2l0YWwtMiIKKworI34gbXNnaWQgIkRpZ2l0YWwtMyIKKyN+IG1zZ3N0ciAiRGlnaXRhbC0zIgorCisjfiBtc2dpZCAiUGhvbmUtaW4iCisjfiBtc2dzdHIgIlBob25lLWluIgorCisjfiBtc2dpZCAiUGhvbmUtb3V0IgorI34gbXNnc3RyICJQaG9uZS1vdXQiCisKKyN+IG1zZ2lkICJWaWRlbyIKKyN+IG1zZ3N0ciAiVmlkZW8iCisKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAiUmFkaW8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKKyN+IG1zZ3N0ciAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIFwiJXNcIiBmb3Igd3JpdGluZy4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiUmVhciIKKyN+IG1zZ3N0ciAiUmVjb3JkIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlNpZGUiCisjfiBtc2dzdHIgIlZpZGVvIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlZpZGVvIEluIgorI34gbXNnc3RyICJWaWRlbyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJSZWNvcmQgR2FpbiIKKyN+IG1zZ3N0ciAiUmVjb3JkIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk91dHB1dCBHYWluIgorI34gbXNnc3RyICJPdXQtZ2FpbiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEJvb3N0IgorI34gbXNnc3RyICJNaWNyb3Bob25lIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1vbml0b3IgU291cmNlIgorI34gbXNnc3RyICJNb25pdG9yIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKKyN+IG1zZ3N0ciAiTWljcm9waG9uZSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJTcGVha2VyIFNvdXJjZSIKKyN+IG1zZ3N0ciAiU3BlYWtlciIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTWljcm9waG9uZSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDEiCisjfiBtc2dzdHIgIk1pY3JvcGhvbmUiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICJNaWNyb3Bob25lIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkRpZ2l0YWwgT3V0IgorI34gbXNnc3RyICJEaWdpdGFsLTEiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRGlnaXRhbCBJbiIKKyN+IG1zZ3N0ciAiRGlnaXRhbC0xIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCisjfiBtc2dzdHIgIk1pY3JvcGhvbmUiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkNvdWxkIG5vdCBnZXQgYnVmZmVycyBmcm9tIGRldmljZSBcIiVzXCIuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gZmlsZSBcIiVzXCIgZm9yIHdyaXRpbmcuIgorI34gbXNnc3RyICJDb3VsZCBub3Qgb3BlbiBmaWxlIFwiJXNcIiBmb3Igd3JpdGluZy4iCisKKyN+IG1zZ2lkICJFcnJvciBjbG9zaW5nIGZpbGUgXCIlc1wiLiIKKyN+IG1zZ3N0ciAiRXJyb3IgY2xvc2luZyBmaWxlIFwiJXNcIi4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBmaWxlIFwiJXNcIiBmb3IgcmVhZGluZy4iCisjfiBtc2dzdHIgIkNvdWxkIG5vdCBvcGVuIGZpbGUgXCIlc1wiIGZvciByZWFkaW5nLiIKKworI34gbXNnaWQgIk5vIGZpbGVuYW1lIHNwZWNpZmllZC4iCisjfiBtc2dzdHIgIk5vIGZpbGVuYW1lIHNwZWNpZmllZC4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSBcIiVzXCIuIgorI34gbXNnc3RyICJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSBcIiVzXCIuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gY29udHJvbCBkZXZpY2UgXCIlc1wiIGZvciB3cml0aW5nLiIKKyN+IG1zZ3N0ciAiQ291bGQgbm90IG9wZW4gY29udHJvbCBkZXZpY2UgXCIlc1wiIGZvciB3cml0aW5nLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBjb25maWd1cmUgYXVkaW8gZGV2aWNlIFwiJXNcIi4iCisjfiBtc2dzdHIgIkNvdWxkIG5vdCBjb25maWd1cmUgYXVkaW8gZGV2aWNlIFwiJXNcIi4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgc2V0IGF1ZGlvIGRldmljZSBcIiVzXCIgdG8gJWQgSHouIgorI34gbXNnc3RyICJDb3VsZCBub3Qgc2V0IGF1ZGlvIGRldmljZSBcIiVzXCIgdG8gJWQgSHouIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gdmlkZW8gZGV2aWNlIFwiJXNcIiBmb3Igd3JpdGluZy4iCisjfiBtc2dzdHIgIkNvdWxkIG5vdCBvcGVuIHZpZGVvIGRldmljZSBcIiVzXCIgZm9yIHdyaXRpbmcuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGNsb3NlIHZpZGVvIGRldmljZSBcIiVzXCIuIgorI34gbXNnc3RyICJDb3VsZCBub3QgY2xvc2UgdmlkZW8gZGV2aWNlIFwiJXNcIi4iCisKKyN+IG1zZ2lkICJPU1MgZGV2aWNlIFwiJXNcIiBpcyBhbHJlYWR5IGluIHVzZSBieSBhbm90aGVyIHByb2dyYW0uIgorI34gbXNnc3RyICJPU1MgZGV2aWNlIFwiJXNcIiBpcyBhbHJlYWR5IGluIHVzZSBieSBhbm90aGVyIHByb2dyYW0uIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGFjY2VzcyBkZXZpY2UgXCIlc1wiLCBjaGVjayBpdHMgcGVybWlzc2lvbnMuIgorI34gbXNnc3RyICJDb3VsZCBub3QgYWNjZXNzIGRldmljZSBcIiVzXCIsIGNoZWNrIGl0cyBwZXJtaXNzaW9ucy4iCisKKyN+IG1zZ2lkICJEZXZpY2UgXCIlc1wiIGRvZXMgbm90IGV4aXN0LiIKKyN+IG1zZ3N0ciAiRGV2aWNlIFwiJXNcIiBkb2VzIG5vdCBleGlzdC4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgXCIlc1wiIGZvciB3cml0aW5nLiIKKyN+IG1zZ3N0ciAiQ291bGQgbm90IG9wZW4gZGV2aWNlIFwiJXNcIiBmb3Igd3JpdGluZy4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgXCIlc1wiIGZvciByZWFkaW5nLiIKKyN+IG1zZ3N0ciAiQ291bGQgbm90IG9wZW4gZGV2aWNlIFwiJXNcIiBmb3IgcmVhZGluZy4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiB2ZnMgZmlsZSBcIiVzXCIgZm9yIHJlYWRpbmcuIgorI34gbXNnc3RyICJDb3VsZCBub3Qgb3BlbiB2ZnMgZmlsZSBcIiVzXCIgZm9yIHJlYWRpbmcuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk5vIGZpbGVuYW1lIGdpdmVuLiIKKyN+IG1zZ3N0ciAiTm8gZmlsZW5hbWUgZ2l2ZW4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gdmZzIGZpbGUgXCIlc1wiIGZvciB3cml0aW5nOiAlcy4iCisjfiBtc2dzdHIgIkNvdWxkIG5vdCBvcGVuIHZmcyBmaWxlIFwiJXNcIiBmb3Igd3JpdGluZy4iCisKKyN+IG1zZ2lkICJObyBmaWxlbmFtZSBnaXZlbiIKKyN+IG1zZ3N0ciAiTm8gZmlsZW5hbWUgZ2l2ZW4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgY2xvc2UgdmZzIGZpbGUgXCIlc1wiLiIKKyN+IG1zZ3N0ciAiQ291bGQgbm90IGNsb3NlIHZmcyBmaWxlIFwiJXNcIi4iCisKKyN+IG1zZ2lkICJObyBkZXZpY2Ugc3BlY2lmaWVkLiIKKyN+IG1zZ3N0ciAiTm8gZGV2aWNlIHNwZWNpZmllZC4iCisKKyN+IG1zZ2lkICJEZXZpY2UgaXMgbm90IG9wZW4uIgorI34gbXNnc3RyICJEZXZpY2UgaXMgbm90IG9wZW4uIgorCisjfiBtc2dpZCAiRGV2aWNlIGlzIG9wZW4uIgorI34gbXNnc3RyICJEZXZpY2UgaXMgb3Blbi4iCmRpZmYgLS1naXQgYS9wby9lby5wbyBiL3BvL2VvLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYTNmZDkKLS0tIC9kZXYvbnVsbAorKysgYi9wby9lby5wbwpAQCAtMCwwICsxLDUwNSBAQAorIyBFc3BlcmFudG8gdHJhbnNsYXRpb24gZm9yIGdzdC1wbHVnaW5zLWdvb2QuCisjIENvcHlyaWdodCAoQykgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGdzdC1wbHVnaW5zLWdvb2QgcGFja2FnZS4KKyMgS3Jpc3RqYW4gU0NITUlEVCA8a3Jpc3RqYW4uc2NobWlkdEBnb29nbGVtYWlsLmNvbT4sIDIwMTEuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kIDAuMTAuMjguMlxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDExLTA2LTA0IDIxOjQ4KzAxMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEtyaXN0amFuIFNDSE1JRFQgPGtyaXN0amFuLnNjaG1pZHRAZ29vZ2xlbWFpbC5jb20+XG4iCisiTGFuZ3VhZ2UtVGVhbTogRXNwZXJhbnRvIDx0cmFuc2xhdGlvbi10ZWFtLWVvQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD5cbiIKKyJMYW5ndWFnZTogZW9cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD0obiAhPSAxKTtcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICIiCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIiclcycgZGUgJyVzJyIKKworbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAiTmUgZWJsaXMga29uZWt0aSBhbCBzZXJ2aWxvIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisiTmUgZWJsaXMgbWFsZmVybWkgbGEgc29uYXBhcmF0b24gcG9yIHJlcHJvZHVrdGFkby4gxJxpIGVzdGFzIHV6YXRlIGRlIGFsaWEgIgorImFwbGlrYcS1by4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIk5lIGVibGlzIG1hbGZlcm1pIGxhIHNvbmFwYXJhdG9uIHBvciByZXByb2R1a3RhZG8uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAiIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICIiCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiTmUgZWJsaXMgbWFsZmVybWkgc29uYXBhcmF0b24gcG9yIHJlZ2lzdHJhZG8uIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIlJlZ2lzdHJpIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWlrcm9mb25vIgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAiIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIiIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICIiCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIiIKKworbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICIiCisKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgIiIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiTGHFrXRlY28iCisKK21zZ2lkICJHYWluIgorbXNnc3RyICIiCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJFa3Jhbm8iCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICIiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIiIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICIiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIiIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiVGlvIG5lIGVzdGFzICclcyctYXBhcmF0by4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiTmUgZWJsaXMgbWFsZmVybWkgc29uYXBhcmF0b24gcG9yIHJlZ2lzdHJhZG8uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICIiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIkludGVybmEgZGF0dW1mbHUtZXJhcm8uIgorCisjfiBtc2dpZCAiQmFzcyIKKyN+IG1zZ3N0ciAiQmFzbyIKKworI34gbXNnaWQgIlN5bnRoIgorI34gbXNnc3RyICJTaW50ZXppbG8iCisKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICJQYXJvbGlsbyIKKworI34gbXNnaWQgIkNEIgorI34gbXNnc3RyICJLRCIKKworI34gbXNnaWQgIk1peGVyIgorI34gbXNnc3RyICJNaWtzaWxvIgorCisjfiBtc2dpZCAiVmlkZW8iCisjfiBtc2dzdHIgIlZpZGVvIgorCisjfiBtc2dpZCAiUmFkaW8iCisjfiBtc2dzdHIgIlJhZGlvIgorCisjfiBtc2dpZCAiTWFzdGVyIgorI34gbXNnc3RyICLEiGVmZSIKKworI34gbXNnaWQgIkZyb250IgorI34gbXNnc3RyICJBbnRhxa1lIgorCisjfiBtc2dpZCAiUmVhciIKKyN+IG1zZ3N0ciAiTWFsYW50YcWtZSIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIkthcHRlbGVmb25vIgorCisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICJDZW50cmUiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCIKKyN+IG1zZ3N0ciAixIhpcmthxa1lIgorCisjfiBtc2dpZCAiU2lkZSIKKyN+IG1zZ3N0ciAiRmxhbmtlIgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIkVuaWdvIgorCisjfiBtc2dpZCAiU3RlcmVvIgorI34gbXNnc3RyICJEdWthbmFsZSIKKworI34gbXNnaWQgIlN1cnJvdW5kIFNvdW5kIgorI34gbXNnc3RyICLEiGlya2HFrWEgc29ubyIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAiTWlrcm9mb25vIDEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDIiCisjfiBtc2dzdHIgIk1pa3JvZm9ubyAyIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgIk1vZGVtbyIKKworI34gbXNnaWQgIk90aGVyIgorI34gbXNnc3RyICJBbGlhIgorCisjfiBtc2dpZCAiTm9uZSIKKyN+IG1zZ3N0ciAiTmVuaXUiCisKKyN+IG1zZ2lkICJPbiIKKyN+IG1zZ3N0ciAiRW7FnWFsdGl0ZSIKKworI34gbXNnaWQgIk9mZiIKKyN+IG1zZ3N0ciAiRWzFnWFsdGl0ZSIKKworI34gbXNnaWQgIk11dGUiCisjfiBtc2dzdHIgIlNpbGVudGlnaSIKKworI34gbXNnaWQgIkZhc3QiCisjfiBtc2dzdHIgIlJhcGlkZSIKKworI34gbXNnaWQgIlZlcnkgTG93IgorI34gbXNnc3RyICJUcmUgbWFsYWx0ZSIKKworI34gbXNnaWQgIkxvdyIKKyN+IG1zZ3N0ciAiTWFsYWx0ZSIKKworI34gbXNnaWQgIk1lZGl1bSIKKyN+IG1zZ3N0ciAiTWV6ZSIKKworI34gbXNnaWQgIkhpZ2giCisjfiBtc2dzdHIgIkFsdGUiCisKKyN+IG1zZ2lkICJWZXJ5IEhpZ2giCisjfiBtc2dzdHIgIlRyZSBhbHRlIgorCisjfiBtc2dpZCAiJXMgJWQgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzICVkIGZ1bmtjaW8iCisKKyN+IG1zZ2lkICIlcyBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiJXMgZnVuY2lvIgpkaWZmIC0tZ2l0IGEvcG8vZXMucG8gYi9wby9lcy5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTlkODMyCi0tLSAvZGV2L251bGwKKysrIGIvcG8vZXMucG8KQEAgLTAsMCArMSw4NzAgQEAKKyMgdHJhbnNsYXRpb24gb2YgZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjI2LjIucG8gdG8gRXNwYcOxb2wKKyMgc3BhbmlzaCB0cmFuc2xhdGlvbiBmb3IgZ3N0LXBsdWdpbnMtZ29vZAorIyBUaGlzIGZpbGUgaXMgcHV0IGluIHRoZSBwdWJsaWMgZG9tYWluLgorIyBKb3JnZSBHb256w6FsZXogR29uesOhbGV6IDxhbG9yaWVsQGdtYWlsLmNvbT4sIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kIDAuMTAuMjYuMlxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDExLTAyLTEyIDE4OjMwKzAxMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEpvcmdlIEdvbnrDoWxleiBHb256w6FsZXogPGFsb3JpZWxAZ21haWwuY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IFNwYW5pc2ggPGVzQGxpLm9yZz5cbiIKKyJMYW5ndWFnZTogZXNcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJYLUdlbmVyYXRvcjogS0JhYmVsIDEuMTEuNFxuIgorIlBsdXJhbC1Gb3JtczogbnBsdXJhbHM9MjsgcGx1cmFsPShuICE9IDEpO1xuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIkZhbGzDsyBhbCBkZWNvZGlmaWNhciBsYSBpbWFnZW4gSlBFRyIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiwqslc8K7IHBvciDCqyVzwrsiCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIk5vIHNlIHB1ZG8gY29uZWN0YXIgY29uIGVsIHNlcnZpZG9yIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIk5vIGV4aXN0ZSB1biBVUkwgZXN0YWJsZWNpZG8uIgorCittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJObyBzZSBwdWRvIHJlc29sdmVyIGVsIG5vbWJyZSBkZWwgc2Vydmlkb3IuIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIk5vIHNlIHB1ZG8gZXN0YWJsZWNlciBsYSBjb25leGnDs24gY29uIGVsIHNlcnZpZG9yLiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIkZhbGzDsyBsYSBjb25maWd1cmFjacOzbiBkZSBsYSBjb25leGnDs24gc2VndXJhLiIKKworIywgZnV6enkKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICIiCisiT2N1cnJpw7MgdW4gZXJyb3IgZGUgcmVkIG8gZWwgc2Vydmlkb3IgY2VycsOzIGxhIGNvbmV4acOzbiBkZSBmb3JtYSBpbmVzcGVyYWRhLiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiRWwgc2Vydmlkb3IgZW52acOzIGRhdG9zIGVycsOzbmVvcy4iCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiRWwgc2Vydmlkb3Igbm8gc29wb3J0YSBsYSBiw7pzcXVlZGEuIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICJFbCBhdWRpbyBubyBleGlzdGUgbyBubyBlcyB2w6FsaWRvLCBlbCBmbHVqbyBBVkkgZXN0YXLDoSBjb3JydXB0by4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIkVzdGUgYXJjaGl2byBubyBjb250aWVuZSBmbHVqb3MgcmVwcm9kdWNpYmxlcy4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkVzdGUgYXJjaGl2byBubyBlcyB2w6FsaWRvIHkgbm8gc2UgcHVlZGUgcmVwcm9kdWNpci4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJFc3RlIGFyY2hpdm8gZXN0w6EgY29ycnVwdG8geSBubyBzZSBwdWVkZSByZXByb2R1Y2lyLiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiRWwgdGFtYcOxbyBhdG9tIG5vIGVzIHbDoWxpZG8uIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJFc3RlIGFyY2hpdm8gZXN0w6EgaW5jb21wbGV0byB5IG5vIHNlIHB1ZWRlIHJlcHJvZHVjaXIuIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICIiCisiUHVlZGUgcXVlIGVsIHbDrWRlbyBlbiBlc3RlIGFyY2hpdm8gbm8gc2UgcHVlZGEgcmVwcm9kdWNpciBjb3JyZWN0YW1lbnRlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICIiCisiRXN0ZSBhcmNoaXZvIGNvbnRpZW5lIGRlbWFzaWFkb3MgZmx1am9zLiBTw7NsbyBzZSByZXByb2R1Y2lyw6EgZWwgcHJpbWVyICVkIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyJObyBzZSBlbmNvbnRyw7MgdW4gZmx1am8gc29wb3J0YWRvLiBQdWVkZSBxdWUgbmVjZXNpdGUgaW5zdGFsYXIgdW5hIGV4dGVuc2nDs24gIgorIlJUU1AgZGUgR1N0cmVhbWVyIHBhcmEgbG9zIGZvcm1hdG9zIGRlIGZsdWpvIFJlYWwuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisiTm8gc2UgZW5jb250csOzIHVuIGZsdWpvIHNvcG9ydGFkby4gUHVlZGUgcXVlIG5lY2VzaXRlIHBlcm1pdGlyIG3DoXMgIgorInByb3RvY29sb3MgZGUgdHJhbnNwb3J0ZSBvIGRlIG90cmEgZm9ybWEgcHVlZGUgcXVlIGxlIGZhbHRlIGxhIGV4dGVuc2nDs24gIgorImNvcnJlY3RhIGRlIFJUU1AgZGUgR1N0cmVhbWVyLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKyJObyBzZSBwdWRvIGFicmlyIGVsIGRpc3Bvc2l0aXZvIHBhcmEgcmVwcm9kdWNpci4gT3RyYSBhcGxpY2FjacOzbiBlc3TDoSB1c2FuZG8gIgorImVsIGRpc3Bvc2l0aXZvLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiTm8gc2UgcHVkbyBhYnJpciBlbCBkaXNwb3NpdGl2byBkZSBzb25pZG8gcGFyYSByZXByb2R1Y2lyLiBObyB0aWVuZSBwZXJtaXNvcyAiCisicGFyYSBhYnJpciBlbCBkaXNwb3NpdGl2by4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiTm8gc2UgcHVkbyBhYnJpciBlbCBkaXNwb3NpdGl2byBwYXJhIHJlcHJvZHVjaXIuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIk5vIHNlIHB1ZG8gYWJyaXIgZWwgZGlzcG9zaXRpdm8gZGUgc29uaWRvIHBhcmEgc3UgZ2VzdGnDs24gcG9yIGVsIGNvbnRyb2wgZGUgIgorIm1lemNsYWRvLiBFc3RlIGVsZW1lbnRvIG5vIHNvcG9ydGEgZXN0YSB2ZXJzacOzbiBkZWwgU2lzdGVtYSBkZSBzb25pZG8gIgorImFiaWVydG8gKE9TUykuIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkVzdGUgZGlzcG9zaXRpdm8gZGUgc29uaWRvIG5vIHNvcG9ydGEgbGEgcmVwcm9kdWNjacOzbi4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIkVycm9yIGRlIHJlcHJvZHVjY2nDs24gZGUgc29uaWRvLiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiRXN0ZSBkaXNwb3NpdGl2byBkZSBzb25pZG8gbm8gc29wb3J0YSBsYSBncmFiYWNpw7NuLiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkVycm9yIGFsIGdyYWJhciBkZWwgZGlzcG9zaXRpdm8gZGUgc29uaWRvLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIk5vIHNlIHB1ZG8gYWJyaXIgZWwgZGlzcG9zaXRpdm8gZGUgc29uaWRvIHBhcmEgZ3JhYmFyLiBObyB0aWVuZSBwZXJtaXNvcyAiCisicGFyYSBhYnJpciBlbCBkaXNwb3NpdGl2by4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIk5vIHNlIHB1ZG8gYWJyaXIgZWwgZGlzcG9zaXRpdm8gcGFyYSBncmFiYXIuIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAiT3JpZ2VuIGRlIGxhIGdyYWJhY2nDs24iCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICJNaWNyw7Nmb25vIgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAiTMOtbmVhIGRlIGVudHJhZGEiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiQ0QgaW50ZXJubyIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJFbnRyYWRhIFMvUERJRiIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICJFbnRyYWRhIEFVWCAxIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIkVudHJhZGEgQVVYIDIiCisKKyMsIGZ1enp5Cittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIkJ1Y2xlIGxvY2FsIgorCisjLCBmdXp6eQorbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiQnVjbGUgbG9jYWwiCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIlZvbHVtZW4iCisKK21zZ2lkICJHYWluIgorbXNnc3RyICJHYW5hbmNpYSIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIk1vbml0b3IiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJBbHRhdm96IGludGVncmFkbyIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiQXVyaWN1bGFyZXMiCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiTMOtbmVhIGRlIHNhbGlkYSIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiU2FsaWRhIFMvUERJRiIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiU2FsaWRhIEFVWCAxIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICJTYWxpZGEgQVVYIDIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRXJyb3IgYWwgbGVlciAlZCBieXRlcyBkZWwgZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorIkZhbGzDsyBhbCBlbnVtZXJhciBsb3MgcG9zaWJsZXMgZm9ybWF0b3MgZGUgdsOtZGVvIGNvbiBsb3MgcXVlIGVsIGRpc3Bvc2l0aXZvICIKKyLCqyVzwrsgcHVlZGUgdHJhYmFqYXIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIk5vIHNlIHB1ZGllcm9uIG1hcGVhciBsb3MgYsO6ZmVyZXMgZGVsIGRpc3Bvc2l0aXZvIMKrJXPCuyIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIiIKKyJFbCBjb250cm9sYWRvciBkZWwgZGlzcG9zaXRpdm8gwqslc8K7IG5vIHNvcG9ydGEgbmluZ8O6biBtw6l0b2RvIGRlIGNhcHR1cmEgIgorImNvbm9jaWRvLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICIiCisiRWwgY29udHJvbGFkb3IgZGVsIGRpc3Bvc2l0aXZvIMKrJXPCuyBubyBzb3BvcnRhIG5pbmfDum4gbcOpdG9kbyBkZSBjYXB0dXJhICIKKyJjb25vY2lkby4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIkVsIGRpc3Bvc2l0aXZvIMKrJXPCuyBubyBlcyB1biBkaXNwb3NpdGl2byBkZSBzYWxpZGEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICJFbCBkaXNwb3NpdGl2byDCqyVzwrsgbm8gcHVlZGUgY2FwdHVyYXIgYSAlZHglZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiRWwgZGlzcG9zaXRpdm8gwqslc8K7IG5vIHB1ZWRlIGNhcHR1cmFyIGVuIGVsIGZvcm1hdG8gZXNwZWNpZmljYWRvIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICJFbCBkaXNwb3NpdGl2byDCqyVzwrsgbm8gZXMgdW4gZGlzcG9zaXRpdm8gZGUgc2FsaWRhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIk5vIHNlIHB1ZGllcm9uIG9idGVuZXIgbG9zIHBhcsOhbWV0cm9zIHBhcmEgZWwgZGlzcG9zaXRpdm8gwqslc8K7IgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiIgorIkVsIGRpc3Bvc2l0aXZvIGRlIGVudHJhZGEgZGUgdsOtZGVvIG5vIGFjZXB0w7MgZWwgYWp1c3RlIGRlIGxhIG51ZXZhIHRhc2EgZGUgIgorImZvdG9ncmFtYXMuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIiIKKyJFbCBkaXNwb3NpdGl2byBkZSBlbnRyYWRhIGRlIHbDrWRlbyBubyBhY2VwdMOzIGVsIGFqdXN0ZSBkZSBsYSBudWV2YSB0YXNhIGRlICIKKyJmb3RvZ3JhbWFzLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiIgorIkVsIGNvbnRyb2xhZG9yIGRlbCBkaXNwb3NpdGl2byDCqyVzwrsgbm8gc29wb3J0YSBuaW5nw7puIG3DqXRvZG8gZGUgY2FwdHVyYSAiCisiY29ub2NpZG8uIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIiIKKyJFbCBjb250cm9sYWRvciBkZWwgZGlzcG9zaXRpdm8gwqslc8K7IG5vIHNvcG9ydGEgbmluZ8O6biBtw6l0b2RvIGRlIGNhcHR1cmEgIgorImNvbm9jaWRvLiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICIiCisiRWwgZGlzcG9zaXRpdm8gZGUgZW50cmFkYSBkZSB2w61kZW8gbm8gYWNlcHTDsyBlbCBhanVzdGUgZGUgbGEgbnVldmEgdGFzYSBkZSAiCisiZm90b2dyYW1hcy4iCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiRmFsbMOzIGFsIG9idGVuZXIgbGEgcG9zaWNpw7NuIGRlbCBzaW50b25pemFkb3IgJWQgZW4gZWwgZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRXJyb3IgYWwgbGVlciAlZCBieXRlcyBkZWwgZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICJFbCBkaXNwb3NpdGl2byDCqyVzwrsgbm8gZXMgdW4gZGlzcG9zaXRpdm8gZGUgc2FsaWRhLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJGYWxsw7MgYWwgZXN0YWJsZWNlciBsYSBlbnRyYWRhICVkIGVuIGVsIGRpc3Bvc2l0aXZvICVzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIkZhbGzDsyBhbCBlc3RhYmxlY2VyIGxhIGVudHJhZGEgJWQgZW4gZWwgZGlzcG9zaXRpdm8gJXMuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRmFsbMOzIGFsIG9idGVuZXIgbGEgcG90ZW5jaWEgZGUgbGEgc2XDsWFsIHBhcmEgZWwgZGlzcG9zaXRpdm8gwqslc8K7LiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIkVsIGNvbnRyb2xhZG9yIGRlbCBkaXNwb3NpdGl2byDCqyVzwrsgbm8gc29wb3J0YSBuaW5nw7puIG3DqXRvZG8gZGUgY2FwdHVyYSAiCisiY29ub2NpZG8uIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIkVsIGRpc3Bvc2l0aXZvIGRlIGVudHJhZGEgZGUgdsOtZGVvIG5vIGFjZXB0w7MgZWwgYWp1c3RlIGRlIGxhIG51ZXZhIHRhc2EgZGUgIgorImZvdG9ncmFtYXMuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIkVsIGRpc3Bvc2l0aXZvIGRlIGVudHJhZGEgZGUgdsOtZGVvIG5vIGFjZXB0w7MgZWwgYWp1c3RlIGRlIGxhIG51ZXZhIHRhc2EgZGUgIgorImZvdG9ncmFtYXMuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJFbCBkaXNwb3NpdGl2byBkZSBlbnRyYWRhIGRlIHbDrWRlbyBubyBhY2VwdMOzIGVsIGFqdXN0ZSBkZSBsYSBudWV2YSB0YXNhIGRlICIKKyJmb3RvZ3JhbWFzLiIKKworIywgZnV6enkKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiRmFsbMOzIGFsIGRlY29kaWZpY2FyIGxhIGltYWdlbiBKUEVHIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisiRXJyb3IgYWwgb2J0ZW5lciBsYXMgY2FwYWNpZGFkZXMgZGVsIGRpc3Bvc2l0aXZvIMKrJXPCuzogTm8gZXMgdW4gY29udHJvbGFkb3IgIgorInBhcmEgdjRsMi4gQ29tcHJ1ZWJlIHNpIGVzIHVuIGNvbnRyb2xhZG9yIHBhcmEgdjRsMS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICJGYWxsw7MgYWwgY29uc3VsdGFyIGxvcyBhdHJpYnV0b3MgZGUgbGEgZW50cmFkYSAlZCBlbiBlbCBkaXNwb3NpdGl2byAlcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiRmFsbMOzIGFsIG9idGVuZXIgbGEgcG9zaWNpw7NuIGRlbCBzaW50b25pemFkb3IgJWQgZW4gZWwgZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkZhbGzDsyBhbCBjb25zdWx0YXIgbGEgbm9ybWEgcGFyYSBlbCBkaXNwb3NpdGl2byDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJGYWxsw7MgYWwgb2J0ZW5lciBsb3MgYXRyaWJ1dG9zIGRlIGNvbnRyb2wgZW4gZWwgZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJObyBzZSBwdWVkZSBpZGVudGlmaWNhciBlbCBkaXNwb3NpdGl2byDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkVzdG8gbm8gZXMgdW4gZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIk5vIHNlIHB1ZG8gYWJyaXIgZWwgZGlzcG9zaXRpdm8gwqslc8K7IHBhcmEgbGVjdHVyYSB5IGVzY3JpdHVyYS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICJFbCBkaXNwb3NpdGl2byDCqyVzwrsgbm8gZXMgdW4gZGlzcG9zaXRpdm8gZGUgY2FwdHVyYS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIkVsIGRpc3Bvc2l0aXZvIMKrJXPCuyBubyBlcyB1biBkaXNwb3NpdGl2byBkZSBzYWxpZGEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiRWwgZGlzcG9zaXRpdm8gwqslc8K7IG5vIGVzIHVuIGRpc3Bvc2l0aXZvIGRlIHNhbGlkYS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJObyBzZSBwdWRvIGFicmlyIGVsIGRpc3Bvc2l0aXZvIMKrJXPCuyBwYXJhIGxlY3R1cmEgeSBlc2NyaXR1cmEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJGYWxsw7MgYWwgZXN0YWJsZWNlciBsYSBub3JtYSBwYXJhIGVsIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiRmFsbMOzIGFsIG9idGVuZXIgbGEgZnJlY3VlbmNpYSBhY3R1YWwgZGVsIHNpbnRvbml6YWRvciBwYXJhIGVsIGRpc3Bvc2l0aXZvICIKKyLCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIiIKKyJGYWxsw7MgYWwgZXN0YWJsZWNlciBsYSBmcmVjdWVuY2lhIGFjdHVhbCBkZWwgc2ludG9uaXphZG9yIHBhcmEgZWwgIgorImRpc3Bvc2l0aXZvIMKrJXPCuyBhICVsdSBIei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRmFsbMOzIGFsIG9idGVuZXIgbGEgcG90ZW5jaWEgZGUgbGEgc2XDsWFsIHBhcmEgZWwgZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRmFsbMOzIGFsIG9idGVuZXIgZWwgdmFsb3IgcGFyYSBlbCBjb250cm9sICVkIGRlbCBkaXNwb3NpdGl2byDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiRmFsbMOzIGFsIGVzdGFibGVjZXIgZWwgdmFsb3IgJWRzIHBhcmEgZWwgY29udHJvbCAlZCBkZWwgZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIkZhbGzDsyBhbCBvYnRlbmVyIGxhIGVudHJhZGEgYWN0dWFsIGVuIGVsIGRpc3Bvc2l0aXZvIMKrJXPCuy4gUXVpesOhIHNlYSB1biAiCisiZGlzcG9zaXRpdm8gZGUgcmFkaW8uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJGYWxsw7MgYWwgb2J0ZW5lciBsYSBzYWxpZGEgYWN0dWFsIGVuIGVsIGRpc3Bvc2l0aXZvIMKrJXPCuy4gUXVpesOhIHNlYSB1biAiCisiZGlzcG9zaXRpdm8gZGUgcmFkaW8uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIkZhbGzDsyBhbCBlc3RhYmxlY2VyIGxhIHNhbGlkYSAlZCBlbiBlbCBkaXNwb3NpdGl2byAlcy4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICJFbCBjYW1iaW8gZGUgcmVzb2x1Y2nDs24gZHVyYW50ZSBsYSByZXByb2R1Y2Npw7NuIGHDum4gbm8gZXN0w6Egc29wb3J0YWRvLiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAiTm8gc2UgcHVlZGUgb3BlcmFyIHNpbiByZWxvaiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAiRXJyb3IgaW50ZXJubyBkZSBmbHVqbyBkZSBkYXRvcy4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICJFcnJvciBlbiBlbCBmbHVqbyBkZSBkYXRvcyBpbnRlcm5vLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIkVsIGRpc3Bvc2l0aXZvIMKrJXPCuyBubyBlcyB1biBkaXNwb3NpdGl2byBkZSBzYWxpZGEuIgorCisjfiBtc2dpZCAiR290IHVuZXhwZWN0ZWQgZnJhbWUgc2l6ZSBvZiAldSBpbnN0ZWFkIG9mICV1LiIKKyN+IG1zZ3N0ciAiU2Ugb2J0dXZvIHVuIHRhbWHDsW8gZGUgY3VhZHJvIGluZXNwZXJhZG8gJXUgZW4gbHVnYXIgZGUgJXUuIgorCisjfiBtc2dpZCAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJGYWxsw7MgYWwgaW50ZW50YXIgb2J0ZW5lciBjdWFkcm9zIGRlIHbDrWRlbyBkZWwgZGlzcG9zaXRpdm8gwqslc8K7LiIKKworI34gbXNnaWQgIkZhaWxlZCBhZnRlciAlZCB0cmllcy4gZGV2aWNlICVzLiBzeXN0ZW0gZXJyb3I6ICVzIgorI34gbXNnc3RyICJGYWxsw7MgZGVzcHXDqXMgZGUgJWQgaW50ZW50b3MuIERpc3Bvc2l0aXZvICVzLiBFcnJvciBkZWwgc2lzdGVtYTogJXMiCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICJCYXNzIgorCisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICJBZ3Vkb3MiCisKKyN+IG1zZ2lkICJTeW50aCIKKyN+IG1zZ3N0ciAiU2ludGV0aXphZG9yIgorCisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICJQQ00iCisKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICJBbHRhdm96IgorCisjfiBtc2dpZCAiTGluZS1pbiIKKyN+IG1zZ3N0ciAiTMOtbmVhIGRlIGVudHJhZGEiCisKKyN+IG1zZ2lkICJDRCIKKyN+IG1zZ3N0ciAiQ0QiCisKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAiTWV6Y2xhZG9yIgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIlBDTS0yIgorCisjfiBtc2dpZCAiUmVjb3JkIgorI34gbXNnc3RyICJHcmFiYWNpw7NuIgorCisjfiBtc2dpZCAiSW4tZ2FpbiIKKyN+IG1zZ3N0ciAiR2FuYW5jaWEgZGUgZW50cmFkYSIKKworI34gbXNnaWQgIk91dC1nYWluIgorI34gbXNnc3RyICJHYW5hbmNpYSBkZSBzYWxpZGEiCisKKyN+IG1zZ2lkICJMaW5lLTEiCisjfiBtc2dzdHIgIkzDrW5lYS0xIgorCisjfiBtc2dpZCAiTGluZS0yIgorI34gbXNnc3RyICJMw61uZWEtMiIKKworI34gbXNnaWQgIkxpbmUtMyIKKyN+IG1zZ3N0ciAiTMOtbmVhLTMiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTEiCisjfiBtc2dzdHIgIkRpZ2l0YWwtMSIKKworI34gbXNnaWQgIkRpZ2l0YWwtMiIKKyN+IG1zZ3N0ciAiRGlnaXRhbC0yIgorCisjfiBtc2dpZCAiRGlnaXRhbC0zIgorI34gbXNnc3RyICJEaWdpdGFsLTMiCisKKyN+IG1zZ2lkICJQaG9uZS1pbiIKKyN+IG1zZ3N0ciAiRW50cmFkYSBkZSB0ZWzDqWZvbm8iCisKKyN+IG1zZ2lkICJQaG9uZS1vdXQiCisjfiBtc2dzdHIgIlNhbGlkYSBkZSB0ZWzDqWZvbm8iCisKKyN+IG1zZ2lkICJWaWRlbyIKKyN+IG1zZ3N0ciAiVsOtZGVvIgorCisjfiBtc2dpZCAiUmFkaW8iCisjfiBtc2dzdHIgIlJhZGlvIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKKyN+IG1zZ3N0ciAiIgorI34gIk5vIHNlIHB1ZG8gYWJyaXIgZWwgZGlzcG9zaXRpdm8gZGUgc29uaWRvIHBhcmEgc3UgZ2VzdGnDs24gcG9yIGVsIGNvbnRyb2wgIgorI34gImRlIG1lemNsYWRvLiIKKworI34gbXNnaWQgIiIKKyN+ICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIFRoaXMgdmVyc2lvbiBvZiAiCisjfiAidGhlIE9wZW4gU291bmQgU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIk5vIHNlIHB1ZG8gYWJyaXIgZWwgZGlzcG9zaXRpdm8gZGUgc29uaWRvIHBhcmEgc3UgZ2VzdGnDs24gcG9yIGVsIGNvbnRyb2wgIgorI34gImRlIG1lemNsYWRvLiBFc3RlIGVsZW1lbnRvIG5vIHNvcG9ydGEgZXN0YSB2ZXJzacOzbiBkZWwgU2lzdGVtYSBkZSBzb25pZG8gIgorI34gImFiaWVydG8gKE9TUykuIgorCisjfiBtc2dpZCAiTWFzdGVyIgorI34gbXNnc3RyICJNYWVzdHJvIgorCisjfiBtc2dpZCAiRnJvbnQiCisjfiBtc2dzdHIgIkZyb250YWwiCisKKyN+IG1zZ2lkICJSZWFyIgorI34gbXNnc3RyICJUcmFzZXJvIgorCisjfiBtc2dpZCAiSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiQXVyaWN1bGFyZXMiCisKKyN+IG1zZ2lkICJDZW50ZXIiCisjfiBtc2dzdHIgIkNlbnRybyIKKworI34gbXNnaWQgIkxGRSIKKyN+IG1zZ3N0ciAiTEZFIgorCisjfiBtc2dpZCAiU3Vycm91bmQiCisjfiBtc2dzdHIgIkVudm9sdmVudGUiCisKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICJMYXRlcmFsIgorCisjfiBtc2dpZCAiQVVYIE91dCIKKyN+IG1zZ3N0ciAiU2FsaWRhIEFVWCIKKworI34gbXNnaWQgIjNEIERlcHRoIgorI34gbXNnc3RyICJQcm9mdW5kaWRhZCAzRCIKKworI34gbXNnaWQgIjNEIENlbnRlciIKKyN+IG1zZ3N0ciAiQ2VudHJvIDNEIgorCisjfiBtc2dpZCAiM0QgRW5oYW5jZSIKKyN+IG1zZ3N0ciAiTWVqb3JhIDNEIgorCisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICJUZWxlzIFmb25vIgorCisjfiBtc2dpZCAiVmlkZW8gSW4iCisjfiBtc2dzdHIgIkVudHJhZGEgZGUgdsOtZGVvIgorCisjfiBtc2dpZCAiQVVYIEluIgorI34gbXNnc3RyICJFbnRyYWRhIEFVWCIKKworI34gbXNnaWQgIlJlY29yZCBHYWluIgorI34gbXNnc3RyICJHYW5hbmNpYSBkZSBncmFiYWNpw7NuIgorCisjfiBtc2dpZCAiT3V0cHV0IEdhaW4iCisjfiBtc2dzdHIgIkdhbmFuY2lhIGRlIHNhbGlkYSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgQm9vc3QiCisjfiBtc2dzdHIgIkF1bWVudG8gZGVsIG1pY3LDs2Zvbm8iCisKKyN+IG1zZ2lkICJEaWFnbm9zdGljIgorI34gbXNnc3RyICJEaWFnbm/MgXN0aWNvIgorCisjfiBtc2dpZCAiQmFzcyBCb29zdCIKKyN+IG1zZ3N0ciAiQXVtZW50byBkZSBiYWpvcyIKKworI34gbXNnaWQgIlBsYXliYWNrIFBvcnRzIgorI34gbXNnc3RyICJQdWVydG9zIGRlIHJlcHJvZHVjY2nDs24iCisKKyN+IG1zZ2lkICJJbnB1dCIKKyN+IG1zZ3N0ciAiRW50cmFkYSIKKworI34gbXNnaWQgIk1vbml0b3IgU291cmNlIgorI34gbXNnc3RyICJNb25pdG9yIGRlIG9yaWdlbiIKKworI34gbXNnaWQgIktleWJvYXJkIEJlZXAiCisjfiBtc2dzdHIgIlBpdGlkbyBkZSB0ZWNsYWRvIgorCisjfiBtc2dpZCAiU2ltdWxhdGUgU3RlcmVvIgorI34gbXNnc3RyICJTaW11bGFyIGVzdMOpcmVvIgorCisjfiBtc2dpZCAiU3RlcmVvIgorI34gbXNnc3RyICJFc3RlzIFyZW8iCisKKyN+IG1zZ2lkICJTdXJyb3VuZCBTb3VuZCIKKyN+IG1zZ3N0ciAiU29uaWRvIGVudm9sdmVudGUiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIkdhbmFuY2lhIGRlbCBtaWNyw7Nmb25vIgorCisjfiBtc2dpZCAiU3BlYWtlciBTb3VyY2UiCisjfiBtc2dzdHIgIkFsdGF2b3ogZGUgb3JpZ2VuIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBTb3VyY2UiCisjfiBtc2dzdHIgIk1pY3JvzIFmb25vIGRlIG9yaWdlbiIKKworI34gbXNnaWQgIkphY2siCisjfiBtc2dzdHIgIkphY2siCisKKyN+IG1zZ2lkICJDZW50ZXIgLyBMRkUiCisjfiBtc2dzdHIgIkNlbnRyYWRvIC8gTEZFIgorCisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAiTWV6Y2xhZG9yIGVzdMOpcmVvIgorCisjfiBtc2dpZCAiTW9ubyBNaXgiCisjfiBtc2dzdHIgIk1lemNsYWRvciBtb25vIgorCisjfiBtc2dpZCAiSW5wdXQgTWl4IgorI34gbXNnc3RyICJNZXpjbGFkb3IgZGUgZW50cmFkYSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAiTWljcsOzZm9ubyAxIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICJNaWNyw7Nmb25vIDIiCisKKyN+IG1zZ2lkICJEaWdpdGFsIE91dCIKKyN+IG1zZ3N0ciAiU2FsaWRhIGRpZ2l0YWwiCisKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICJFbnRyYWRhIGRpZ2l0YWwiCisKKyN+IG1zZ2lkICJIRE1JIgorI34gbXNnc3RyICJIRE1JIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgIk1vzIFkZW0iCisKKyN+IG1zZ2lkICJIYW5kc2V0IgorI34gbXNnc3RyICJBdXJpY3VsYXJlcyIKKworI34gbXNnaWQgIk90aGVyIgorI34gbXNnc3RyICJPdHJvIgorCisjfiBtc2dpZCAiTm9uZSIKKyN+IG1zZ3N0ciAiTmluZ3VubyIKKworI34gbXNnaWQgIk9uIgorI34gbXNnc3RyICJFbmNlbmRpZG8iCisKKyN+IG1zZ2lkICJPZmYiCisjfiBtc2dzdHIgIkFwYWdhZG8iCisKKyN+IG1zZ2lkICJNdXRlIgorI34gbXNnc3RyICJTaWxlbmNpYXIiCisKKyN+IG1zZ2lkICJGYXN0IgorI34gbXNnc3RyICJSw6FwaWRvIgorCisjfiBtc2dpZCAiVmVyeSBMb3ciCisjfiBtc2dzdHIgIk11eSBiYWpvIgorCisjfiBtc2dpZCAiTG93IgorI34gbXNnc3RyICJCYWpvIgorCisjfiBtc2dpZCAiTWVkaXVtIgorI34gbXNnc3RyICJNZWRpbyIKKworI34gbXNnaWQgIkhpZ2giCisjfiBtc2dzdHIgIkFsdG8iCisKKyN+IG1zZ2lkICJWZXJ5IEhpZ2giCisjfiBtc2dzdHIgIk11eSBhbHRvIgorCisjfiBtc2dpZCAiUHJvZHVjdGlvbiIKKyN+IG1zZ3N0ciAiUHJvZHVjY2nDs24iCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICJNaWNyb8yBZm9ubyBkZWwgcGFuZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgSW4iCisjfiBtc2dzdHIgIkVudHJhZGEgZGVsIHBhbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBIZWFkcGhvbmVzIgorI34gbXNnc3RyICJBdXJpY3VsYXJlcyBkZWwgcGFuZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgT3V0IgorI34gbXNnc3RyICJTYWxpZGEgZGVsIHBhbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJHcmVlbiBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIHZlcmRlIgorCisjfiBtc2dpZCAiUGluayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIHJvc2EiCisKKyN+IG1zZ2lkICJCbHVlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgYXp1bCIKKworI34gbXNnaWQgIldoaXRlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgYmxhbmNvIgorCisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBuZWdybyIKKworI34gbXNnaWQgIkdyYXkgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBncmlzIgorCisjfiBtc2dpZCAiT3JhbmdlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgbmFyYW5qYSIKKworI34gbXNnaWQgIlJlZCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIHJvam8iCisKKyN+IG1zZ2lkICJZZWxsb3cgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBhbWFyaWxsbyIKKworI34gbXNnaWQgIkdyZWVuIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgdmVyZGUgZGVsIHBhbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJQaW5rIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3Igcm9zYSBkZWwgcGFuZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIkJsdWUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBhenVsIGRlbCBwYW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiV2hpdGUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBibGFuY28gZGVsIHBhbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJCbGFjayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIG5lZ3JvIGRlbCBwYW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiR3JheSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIGdyaXMgZGVsIHBhbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJPcmFuZ2UgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBuYXJhbmphIGRlbCBwYW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiUmVkIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3Igcm9qbyBkZWwgcGFuZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIlllbGxvdyBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIGFtYXJpbGxvIGRlbCBwYW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiU3ByZWFkIE91dHB1dCIKKyN+IG1zZ3N0ciAiRXhwYW5kaXIgc2FsaWRhIgorCisjfiBtc2dpZCAiRG93bm1peCIKKyN+IG1zZ3N0ciAiUmVkdWNjacOzbiBkZSBjYW5hbGVzIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBJbnB1dCIKKyN+IG1zZ3N0ciAiRW50cmFkYSBkZWwgbWV6Y2xhZG9yIHZpcnR1YWwiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIE91dHB1dCIKKyN+IG1zZ3N0ciAiU2FsaWRhIGRlbCBtZXpjbGFkb3IgdmlydHVhbCIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgQ2hhbm5lbHMiCisjfiBtc2dzdHIgIkNhbmFsZXMgZGVsIG1lemNsYWRvciB2aXJ0dWFsIgorCisjfiBtc2dpZCAiJXMgJWQgRnVuY3Rpb24iCisjfiBtc2dzdHIgIkZ1bmNpw7NuICVzICVkIgorCisjfiBtc2dpZCAiJXMgRnVuY3Rpb24iCisjfiBtc2dzdHIgIkZ1bmNpw7NuICVzIgorCisjfiBtc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBvbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkVycm9yIGFsIGxlZXIgJWQgYnl0ZXMgZGVsIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZW5xdWV1ZSBidWZmZXJzIGluIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiTm8gc2UgcHVlZGVuIGVuY29sYXIgbG9zIGLDumZlcmVzIGVuIGVsIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc291bmQgc2VydmVyIgorI34gbXNnc3RyICJObyBzZSBwdWRvIGVzdGFibGVjZXIgbGEgY29uZXhpw7NuIGNvbiBlbCBzZXJ2aWRvciBkZSBzb25pZG8iCisKKyN+IG1zZ2lkICJGYWlsZWQgdG8gcXVlcnkgc291bmQgc2VydmVyIGNhcGFiaWxpdGllcyIKKyN+IG1zZ3N0ciAiRmFsbMOzIGFsIHByZWd1bnRhciBhbCBzZXJ2aWRvciBkZSBzb25pZG8gc3VzIGNhcGFjaWRhZGVzIgorCisjfiBtc2dpZCAiIgorI34gIlRoZSBidWZmZXIgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLCBvciB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcywgb3Igbm8gIgorI34gImJ1ZmZlcnMgaGF2ZSBiZWVuIGFsbG9jYXRlZCB5ZXQsIG9yIHRoZSB1c2VycHRyIG9yIGxlbmd0aCBhcmUgaW52YWxpZC4gIgorI34gImRldmljZSAlcyIKKyN+IG1zZ3N0ciAiIgorI34gIkVsIHRpcG8gZGUgYsO6ZmVyIG5vIGVzdMOhIHNvcG9ydGFkbyBvIGVsIMOtbmRpY2UgZXN0w6EgZnVlcmEgZGUgbG9zIGzDrW1pdGVzICIKKyN+ICJvIG5vIHNlIGhhbiByZWdpc3RyYWRvIGLDumZlcmVzIHRvZGF2w61hIG8gbGEgbG9uZ2l0dWQgbyBlbCB1c2VycHRyIHNvbiAiCisjfiAiaW52w6FsaWRvcy4gRGlzcG9zaXRpdm8gJXMiCisKKyN+IG1zZ2lkICIiCisjfiAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIE5vdCBlbm91Z2ggbWVtb3J5LiIKKyN+IG1zZ3N0ciAiIgorI34gIkZhbGzDsyBhbCBpbnRlbnRhciBvYnRlbmVyIGN1YWRyb3MgZGUgdsOtZGVvIGRlbCBkaXNwb3NpdGl2byDCqyVzwrsuIE5vIGhheSAiCisjfiAibWVtb3JpYSBzdWZpY2llbnRlLiIKKworI34gbXNnaWQgImluc3VmZmljaWVudCBtZW1vcnkgdG8gZW5xdWV1ZSBhIHVzZXIgcG9pbnRlciBidWZmZXIuIGRldmljZSAlcy4iCisjfiBtc2dzdHIgIiIKKyN+ICJNZW1vcmlhIGluc3VmaWNpZW50ZSBwYXJhIGVuY29sYXIgdW4gYsO6ZmVyIHB1bnRlcm8gZGUgdXN1YXJpby4gIgorI34gIkRpc3Bvc2l0aXZvICVzLiIKKworI34gbXNnaWQgIk5vIGZyZWUgYnVmZmVycyBmb3VuZCBpbiB0aGUgcG9vbCBhdCBpbmRleCAlZC4iCisjfiBtc2dzdHIgIk5vIHNlIGVuY29udHJhcm9uIGLDumZlcmVzIGxpYnJlcyBlbiBlbCDDrW5kaWNlICVkIGRlbCDCq3Bvb2zCuy4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZ2V0IGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIk5vIHNlIHB1ZGllcm9uIG9idGVuZXIgYsO6ZmVyZXMgZGVsIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZ2V0IGVub3VnaCBidWZmZXJzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJObyBzZSBwdWRpZXJvbiBvYnRlbmVyIGLDumZlcmVzIHN1ZmljaWVudGVzIGRlbCBkaXNwb3NpdGl2byDCqyVzwrsuIgorCisjfiBtc2dpZCAiRXJyb3Igc3RhcnRpbmcgc3RyZWFtaW5nIGNhcHR1cmUgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkVycm9yIGFsIGluaWNpYXIgZWwgZmx1am8gZGUgY2FwdHVyYSBkZWwgZGlzcG9zaXRpdm8gwqslc8K7LiIKKworI34gbXNnaWQgIkVycm9yIHN0b3BwaW5nIHN0cmVhbWluZyBjYXB0dXJlIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJFcnJvciBhbCBwYXJhciBlbCBmbHVqbyBkZSBjYXB0dXJhIGRlbCBkaXNwb3NpdGl2byDCqyVzwrsuIgorCisjfiBtc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzLiciCisjfiBtc2dzdHIgIkZhbGzDsyBhbCBvYnRlbmVyIGxvcyBhdHJpYnV0b3MgZGUgY29udHJvbCBlbiBlbCBkaXNwb3NpdGl2byDCqyVzwrsuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IHJlYWQgZnJvbSBDRC4iCisjfiBtc2dzdHIgIk5vIHNlIHB1ZG8gbGVlciBkZWwgQ0QuIgorCisjfiBtc2dpZCAiRGlzYyBpcyBub3QgYW4gQXVkaW8gQ0QuIgorI34gbXNnc3RyICJFbCBkaXNjbyBubyBlcyB1biBDRCBkZSBzb25pZG8uIgorCisjfiBtc2dpZCAiVGhpcyBmaWxlIGlzIGVuY3J5cHRlZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCisjfiBtc2dzdHIgIkVzdGUgYXJjaGl2byBlc3TDoSBjaWZyYWRvIHkgbm8gc2UgcHVlZGUgcmVwcm9kdWNpci4iCmRpZmYgLS1naXQgYS9wby9ldS5wbyBiL3BvL2V1LnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4M2I5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9wby9ldS5wbwpAQCAtMCwwICsxLDkxMiBAQAorIyB0cmFuc2xhdGlvbiBvZiBnc3QtcGx1Z2lucy1nb29kLm1hc3Rlci5wbyB0byBCYXNxdWUKKyMgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2LCAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ3N0LXBsdWdpbnMtZ29vZCBwYWNrYWdlLgorIworIyBJw7Fha2kgTGFycmHDsWFnYSBNdXJnb2l0aW8gPGRvb3Rlb0BldXNrYWxnbnUub3JnPiwgMjAwOSwgMjAxMC4KKyMgTWlrZWwgT2xhc2FnYXN0aSBVcmFuZ2EgPGhleV9uZWtlbkBtdW5kdXJhdC5uZXQ+LCAyMDA5LCAyMDEwLgorbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjE4LjJcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxMC0wMy0yNSAxMjozNyswMTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBNaWtlbCBPbGFzYWdhc3RpIFVyYW5nYSA8aGV5X25la2VuQG11bmR1cmF0Lm5ldD5cbiIKKyJMYW5ndWFnZS1UZWFtOiBCYXNxdWUgPHRyYW5zbGF0aW9uLXRlYW0tZXVAbGlzdHMuc291cmNlZm9yZ2UubmV0PlxuIgorIkxhbmd1YWdlOiBldVxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlgtR2VuZXJhdG9yOiBLQmFiZWwgMS4xMS40XG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0yOyBwbHVyYWw9KG4gIT0gMSk7XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiSHV0cyBlZ2luIGR1IEpQRUcgaXJ1ZGlhIGRlc2tvZGV0emVhbiIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiJyVzJyAtICclcyciCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIkV6aW4gaXphbiBkYSBrb25la3RhdHUgemVyYml0emFyaWFyZWtpbiIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJFemluIGl6YW4gZGEga29uZWt0YXR1IHplcmJpdHphcmlhcmVraW4iCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIkV6aW4gaXphbiBkYSBrb25leGlvYSBlemFycmkgc29pbnUtemVyYml0emFyaWFyZWtpbiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAiIgorIkV6IGRhZ28gYXVkaW8tc2FycmVyYXJpaywgZWRvIGJhbGlvZ2FiZWEgZGEuIEFWSSBrb3Jyb250ZWEgaG9uZGF0dWEgZWdvbmdvICIKKyJkYS4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIkZpdHhhdGVnaSBob3JyZXRhbiBleiBkYWdvIGVycmVwcm9kdXppIGRhaXRla2VlbiBrb3Jyb250ZXJpay4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkZpdHhhdGVnaSBoYXUgZXogZGEgYmFsaW96a29hIGV0YSBlemluIGRhIGVycmVwcm9kdXppdHUuIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRml0eGF0ZWdpIGhhdSBob25kYXR1YSBkYWdvLCBldGEgZXppbiBkYSBlcnJlcHJvZHV6aXR1LiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJGaXR4YXRlZ2kgaGF1IG9zYXR1IGdhYmVhIGRhZ28sIGV0YSBlemluIGRhIGVycmVwcm9kdXppdHUuIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICIiCisiTGl0ZWtlZW5hIGRhIGZpdHhhdGVnaSBob25ldGFrbyBiaWRlb2EgZXogYmVoYXIgYmV6YWxhIGVycmVwcm9kdXppdHplYS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiIgorIkZpdHhhdGVnaSBob3JyZWsga29ycm9udGUgZ2VoaWVnaSBkaXR1LiBFcnJlcHJvZHV6aXR1IHNvaWxpayBsZWhlbiAlZChyKWFrIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyJFeiBkYSBvbmFydHV0YWtvIGtvcnJvbnRlcmlrIGF1cmtpdHUuIEdTdHJlYW1lciBSVFNQIGhlZGFwZW5hIGluc3RhbGF0dSAiCisiYmVoYXJrbyBkdXp1IFJlYWwgbXVsdGltZWRpYWtvIGtvcnJvbnRlZW50emFrby4iCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKyJFeiBkYSBvbmFydHV0YWtvIGtvcnJvbnRlcmlrIGF1cmtpdHUuIEdhcnJhaW9rbyBwcm90b2tvbG8gZ2VoaWFnbyBiYWltZW50emVhICIKKyJiZWhhciBkYSBlZG8gR1N0cmVhbWVyIFJUU1AgaGVkYXBlbiBlZ29raWEgZmFsdGEgemFpenUuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIkV6aW4gaXphbiBkYSBhdWRpb2FyZW4gZ2FpbHVhIGlyZWtpIGVycmVwcm9kdXppdHpla28uIEJlc3RlIGFwbGlrYXppbyBiYXRlayAiCisiZGFyYWJpbCBnYWlsdWEuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJFemluIGl6YW4gZGEgYXVkaW9hcmVuIGdhaWx1YSBpcmVraSBlcnJlcHJvZHV6aXR6ZWtvLiBFeiBkdXp1IGJhaW1lbmlrICIKKyJnYWlsdWEgaXJla2l0emVrby4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiRXppbiBpemFuIGRhIGF1ZGlvYXJlbiBnYWlsdWEgaXJla2kgZXJyZXByb2R1eml0emVrby4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisiRXppbiBpemFuIGRhIGF1ZGlvYXJlbiBnYWlsdWEgaXJla2kgZXJyZXByb2R1eml0emVrby4gRWxlbWVudHUgaG9uZWsgZXogZHUgIgorIm9uYXJ0emVuIE9wZW4gU291bmQgU3lzdGVtLWVuIGJlcnRzaW8gaGF1LiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJBdWRpbyBnYWlsdSBob25layBleiBkdSBlcnJlcHJvZHV6aXR6ZWEgb25hcnR6ZW4uIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICJFcnJvcmVhIGF1ZGlvYSBlcnJlcHJvZHV6aXR6ZWFuLiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiQXVkaW8gZ2FpbHUgaG9uZWsgZXogZHUgZ3JhYmF0emVhIG9uYXJ0emVuLiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkVycm9yZWEgYXVkaW9rbyBnYWlsdXRpayBncmFiYXR6ZWFuLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIkV6aW4gaXphbiBkYSBhdWRpb2FyZW4gZ2FpbHVhIGlyZWtpIGdyYWJhdHpla28uIEV6IGR1enUgYmFpbWVuaWsgZ2FpbHVhICIKKyJpcmVraXR6ZWtvLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiRXppbiBpemFuIGRhIGF1ZGlvYXJlbiBnYWlsdWEgaXJla2kgZ3JhYmF0emVrby4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICIiCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICJHcmFiYXppb2FyZW4gaXR1cmJ1cnVhIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWlrcm9mb25vYSIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIlNhcnJlcmFrbyBsaW5lYSIKKworbXNnaWQgIkludGVybmFsIENEIgorbXNnc3RyICJCYXJuZWtvIENEYSIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJTUERJRiBzYXJyZXJhIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIjEuIHNhcnJlcmEgbGFndW5nYXJyaWEiCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAiMi4gc2FycmVyYSBsYWd1bmdhcnJpYSIKKworIywgZnV6enkKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiQXR6ZXJhLWJlZ2l6dGEiCisKKyMsIGZ1enp5Cittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICJBdHplcmEtYmVnaXp0YSIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiQm9sdW1lbmEiCisKK21zZ2lkICJHYWluIgorbXNnc3RyICJJcmFiYXppYSIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIk1vbml0b3JlYSIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIkJhcm5la28gYm96Z29yYWlsdWEiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIkVudHp1bmdhaWx1YSIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICJJcnRlZXJha28gbGluZWEiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIlNQRElGIGlydGVlcmEiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIjEuIGlydGVlcmEgbGFndW5nYXJyaWEiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIjIuIGlydGVlcmEgbGFndW5nYXJyaWEiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRXJyb3JlYSBnZXJ0YXR1IGRhICclMiRzJyBnYWlsdWFuICUxJGQgYnl0ZSBpcmFrdXJ0emVhbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiRXppbiBpemFuIGRpcmEgJyVzJyBnYWlsdWFyZW4gYnVmZmVycmFrIG1hcGF0dS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICIiCisiJyVzJyBnYWlsdWFyZW4ga29udHJvbGF0emFpbGVhayBleiBkdSBvbmFydHplbiBrYXB0dXJhLW1ldG9kbyBlemFndW5pay4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAiIgorIiclcycgZ2FpbHVhcmVuIGtvbnRyb2xhdHphaWxlYWsgZXogZHUgb25hcnR6ZW4ga2FwdHVyYS1tZXRvZG8gZXphZ3VuaWsuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICInJXMnIGdhaWx1YSBleiBkYSBpcnRlZXJha28gZ2FpbHUgYmF0LiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIiclcycgZ2FpbHVhIGV6IGRhIGthcHR1cmEtZ2FpbHUgYmF0LiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIiclcycgZ2FpbHVhIGV6IGRhIGthcHR1cmEtZ2FpbHUgYmF0LiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiJyVzJyBnYWlsdWEgZXogZGEgaXJ0ZWVyYWtvIGdhaWx1IGJhdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICJFemluIGl6YW4gZGlyYSAnJXMnIGdhaWx1YXJlbiBwYXJhbWV0cm9hayBlc2t1cmF0dSIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIiIKKyJCaWRlb2FyZW4gc2FycmVyYWtvIGdhaWx1YWsgZXogZHUgZm90b2dyYW1hLXRhbWFpbmFyZW4gZXphcnBlbiBiZXJyaWEgIgorIm9uYXJ0emVuLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICIiCisiQmlkZW9hcmVuIHNhcnJlcmFrbyBnYWlsdWFrIGV6IGR1IGZvdG9ncmFtYS10YW1haW5hcmVuIGV6YXJwZW4gYmVycmlhICIKKyJvbmFydHplbi4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIiIKKyInJXMnIGdhaWx1YXJlbiBrb250cm9sYXR6YWlsZWFrIGV6IGR1IG9uYXJ0emVuIGthcHR1cmEtbWV0b2RvIGV6YWd1bmlrLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICIiCisiJyVzJyBnYWlsdWFyZW4ga29udHJvbGF0emFpbGVhayBleiBkdSBvbmFydHplbiBrYXB0dXJhLW1ldG9kbyBlemFndW5pay4iCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiIgorIkJpZGVvYXJlbiBzYXJyZXJha28gZ2FpbHVhayBleiBkdSBmb3RvZ3JhbWEtdGFtYWluYXJlbiBlemFycGVuIGJlcnJpYSAiCisib25hcnR6ZW4uIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIkh1dHMgZWdpbiBkdSAnJTIkcycgZ2FpbHVrbyAlMSRkLiBzaW50b25pemFkb3JlYXJlbiBlemFycGVuYWsgZXNrdXJhdHplYW4uIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJFcnJvcmVhIGdlcnRhdHUgZGEgJyUyJHMnIGdhaWx1YW4gJTEkZCBieXRlIGlyYWt1cnR6ZWFuLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICInJXMnIGdhaWx1YSBleiBkYSBpcnRlZXJha28gZ2FpbHUgYmF0LiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJIdXRzIGVnaW4gZHUgJyUyJHMnIGdhaWx1a28gJTEkZC4gc2FycmVyYSBlemFydHplYW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiSHV0cyBlZ2luIGR1ICclMiRzJyBnYWlsdWtvICUxJGQuIHNhcnJlcmEgZXphcnR6ZWFuLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkh1dHMgZWdpbiBkdSAnJXMnIGdhaWx1YXJlbiBzZWluYWxlYXJlbiBpbmRhcnJhIGVza3VyYXR6ZWFuLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIiclcycgZ2FpbHVhcmVuIGtvbnRyb2xhdHphaWxlYWsgZXogZHUgb25hcnR6ZW4ga2FwdHVyYS1tZXRvZG8gZXphZ3VuaWsuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIkJpZGVvYXJlbiBzYXJyZXJha28gZ2FpbHVhayBleiBkdSBmb3RvZ3JhbWEtdGFtYWluYXJlbiBlemFycGVuIGJlcnJpYSAiCisib25hcnR6ZW4uIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIkJpZGVvYXJlbiBzYXJyZXJha28gZ2FpbHVhayBleiBkdSBmb3RvZ3JhbWEtdGFtYWluYXJlbiBlemFycGVuIGJlcnJpYSAiCisib25hcnR6ZW4uIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJCaWRlb2FyZW4gc2FycmVyYWtvIGdhaWx1YWsgZXogZHUgZm90b2dyYW1hLXRhbWFpbmFyZW4gZXphcnBlbiBiZXJyaWEgIgorIm9uYXJ0emVuLiIKKworIywgZnV6enkKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiSHV0cyBlZ2luIGR1IEpQRUcgaXJ1ZGlhIGRlc2tvZGV0emVhbiIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorIkVycm9yZWEgZ2VydGF0dSBkYSAnJXMnIGdhaWx1YXJlbiBhaGFsbWVuYSBlc2t1cmF0emVhbjogRXogZGEgdjRsMiAiCisia29udHJvbGF0emFpbGUgYmF0LiBCZWdpcmF0dSB2NGwxIGtvbnRyb2xhdHphaWxlIGJhdCBkZW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiSHV0cyBlZ2luIGR1ICUyJHMgZ2FpbHVrbyAlMSRkLiBzYXJyZXJhcmVuIGF0cmlidXR1YWsga29udHN1bHRhdHplYW4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIkh1dHMgZWdpbiBkdSAnJTIkcycgZ2FpbHVrbyAlMSRkLiBzaW50b25pemFkb3JlYXJlbiBlemFycGVuYWsgZXNrdXJhdHplYW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiSHV0cyBlZ2luIGR1ICclcycgZ2FpbHVhcmVuIGFyYXVhIGtvbnRzdWx0YXR6ZWFuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiSHV0cyBlZ2luIGR1dCAnJXMnIGdhaWx1YXJlbiBrb250cm9sLWF0cmlidXR1YWsgZXNrdXJhdHplYW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkV6aW4gZGEgJyVzJyBnYWlsdWEgaWRlbnRpZmlrYXR1LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICJIYXUgZXogZGEgJyVzJyBnYWlsdSBiYXQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiRXppbiBpemFuIGRhICclcycgZ2FpbHVhIGlyZWtpIGlyYWt1cnR6ZWtvIGV0YSBpZGF6dGVrby4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICInJXMnIGdhaWx1YSBleiBkYSBrYXB0dXJhLWdhaWx1IGJhdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIiclcycgZ2FpbHVhIGV6IGRhIGlydGVlcmFrbyBnYWlsdSBiYXQuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiJyVzJyBnYWlsdWEgZXogZGEgaXJ0ZWVyYWtvIGdhaWx1IGJhdC4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJFemluIGl6YW4gZGEgJyVzJyBnYWlsdWEgaXJla2kgaXJha3VydHpla28gZXRhIGlkYXp0ZWtvLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiSHV0cyBlZ2luIGR1ICclcycgZ2FpbHVhcmVuIGFyYXVhIGV6YXJ0emVhbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiSHV0cyBlZ2luIGR1ICclcycgZ2FpbHVhcmVuIHVuZWtvIHNpbnRvbml6YXppby1mcmVrdWVudHppYSBlc2t1cmF0emVhbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorIkh1dHMgZWdpbiBkdSAnJXMnIGdhaWx1YXJlbiB1bmVrbyBzaW50b25pemF6aW8tZnJla3VlbnR6aWEgJWx1IEh6LXRhbiAiCisiZXphcnR6ZWFuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJIdXRzIGVnaW4gZHUgJyVzJyBnYWlsdWFyZW4gc2VpbmFsZWFyZW4gaW5kYXJyYSBlc2t1cmF0emVhbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkh1dHMgZWdpbiBkdSAnJTIkcycgZ2FpbHVrbyAlMSRkLiBrb250cm9sYXJlbiBiYWxpb2EgZXNrdXJhdHplYW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiSHV0cyBlZ2luIGR1ICclMyRzJyBnYWlsdWtvICUyJGQuIGtvbnRyb2xhcmVuICUxJGQuIGJhbGlvYSBlc2t1cmF0emVhbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJIdXRzIGVnaW4gZHUgJyVzJyBnYWlsdWtvIHVuZWtvIHNhcnJlcmEgZXNrdXJhdHplYW4uIExpdGVrZWVuYSBkYSBpcnJhdGktIgorImdhaWx1IGJhdCBpemF0ZWEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiSHV0cyBlZ2luIGR1ICclcycgZ2FpbHVrbyB1bmVrbyBzYXJyZXJhIGVza3VyYXR6ZWFuLiBMaXRla2VlbmEgZGEgaXJyYXRpLSIKKyJnYWlsdSBiYXQgaXphdGVhLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiSHV0cyBlZ2luIGR1ICclMiRzJyBnYWlsdWtvICUxJGQuIHNhcnJlcmEgZXphcnR6ZWFuLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIk9yYWluZGlrIGV6IGRhZ28gb25hcnR1YSBleGVrdXRhdHUgYml0YXJ0ZWFuIGJlcmVpem1lbmEgYWxkYXR6ZWEuIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICJFemluIGR1IGZ1bnR6aW9uYXR1IGVybG9qdXJpayBnYWJlIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBzdHJlYW0gZXJyb3IuIgorI34gbXNnc3RyICJEYXR1LWtvcnJvbnRlYXJlbiBiYXJuZS1lcnJvcmVhLiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgZmxvdyBlcnJvci4iCisjfiBtc2dzdHIgIkRhdHUtZmx1eHVhcmVuIGJhcm5lLWVycm9yZWEuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAiJyVzJyBnYWlsdWEgZXogZGEgaXJ0ZWVyYWtvIGdhaWx1IGJhdC4iCisKKyN+IG1zZ2lkICJHb3QgdW5leHBlY3RlZCBmcmFtZSBzaXplIG9mICV1IGluc3RlYWQgb2YgJXUuIgorI34gbXNnc3RyICJVc3Rla2FiZWtvIGZvdG9ncmFtYS10YW1haW5hIGphc28gZGEgKCV1KSwgJXUgb3JkZXouIgorCisjfiBtc2dpZCAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJIdXRzIGVnaW4gZHUgJyVzJyBnYWlsdXRpayBiaWRlby1mb3RvZ3JhbWFrIGVza3VyYXR6ZW4gc2FpYXR6ZWFuLiIKKworI34gbXNnaWQgIkZhaWxlZCBhZnRlciAlZCB0cmllcy4gZGV2aWNlICVzLiBzeXN0ZW0gZXJyb3I6ICVzIgorI34gbXNnc3RyICJIdXRzIGVnaW4gZHUgJWQgc2FpbyBldGEgZ2Vyby4gJXMgZ2FpbHVhLiBTaXN0ZW1hLWVycm9yZWE6ICVzIgorCisjfiBtc2dpZCAiQmFzcyIKKyN+IG1zZ3N0ciAiQmF4dWEiCisKKyN+IG1zZ2lkICJUcmVibGUiCisjfiBtc2dzdHIgIkFsdHVhIgorCisjfiBtc2dpZCAiU3ludGgiCisjfiBtc2dzdHIgIlNpbnRldGl6YWRvcmVhIgorCisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICJQQ00iCisKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICJCb3pnb3JhaWx1YSIKKworI34gbXNnaWQgIkxpbmUtaW4iCisjfiBtc2dzdHIgIkxpbmVhLXNhcnJlcmEiCisKKyN+IG1zZ2lkICJDRCIKKyN+IG1zZ3N0ciAiQ0RhIgorCisjfiBtc2dpZCAiTWl4ZXIiCisjfiBtc2dzdHIgIk5haGFzdGFpbGVhIgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIlBDTS0yIgorCisjfiBtc2dpZCAiUmVjb3JkIgorI34gbXNnc3RyICJHcmFiYXppb2EiCisKKyN+IG1zZ2lkICJJbi1nYWluIgorI34gbXNnc3RyICJTYXJyZXJha28gaXJhYmF6aWEiCisKKyN+IG1zZ2lkICJPdXQtZ2FpbiIKKyN+IG1zZ3N0ciAiSXJ0ZWVyYWtvIGlyYWJhemlhIgorCisjfiBtc2dpZCAiTGluZS0xIgorI34gbXNnc3RyICIxLiBsaW5lYSIKKworI34gbXNnaWQgIkxpbmUtMiIKKyN+IG1zZ3N0ciAiMi4gbGluZWEiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIjMuIGxpbmVhIgorCisjfiBtc2dpZCAiRGlnaXRhbC0xIgorI34gbXNnc3RyICIxLiBkaWdpdGFsYSIKKworI34gbXNnaWQgIkRpZ2l0YWwtMiIKKyN+IG1zZ3N0ciAiMi4gZGlnaXRhbGEiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTMiCisjfiBtc2dzdHIgIjMuIGRpZ2l0YWxhIgorCisjfiBtc2dpZCAiUGhvbmUtaW4iCisjfiBtc2dzdHIgIkF1cmlrdWxhcnJlbiBzYXJyZXJhIgorCisjfiBtc2dpZCAiUGhvbmUtb3V0IgorI34gbXNnc3RyICJBdXJpa3VsYXJyZW4gaXJ0ZWVyYSIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICJCaWRlb2EiCisKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAiSXJyYXRpYSIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCisjfiBtc2dzdHIgIiIKKyN+ICJFemluIGl6YW4gZGEgYXVkaW9rbyBnYWlsdWEgaXJla2kgbmFoYXN0YWlsZWFyZW4ga29udHJvbGEga3VkZWF0emVrby4iCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJFemluIGl6YW4gZGEgYXVkaW9rbyBnYWlsdWEgaXJla2kgbmFoYXN0YWlsZWFyZW4ga29udHJvbGEga3VkZWF0emVrby4gIgorI34gIkVsZW1lbnR1IGhvbmVrIGV6IGR1IG9uYXJ0emVuIE9wZW4gU291bmQgU3lzdGVtLWVuIGJlcnRzaW8gaGF1LiIKKworI34gbXNnaWQgIk1hc3RlciIKKyN+IG1zZ3N0ciAiTWFpc3VhIgorCisjfiBtc2dpZCAiRnJvbnQiCisjfiBtc2dzdHIgIkF1cnJlYWxkZWtvYSIKKworI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIkF0emVhbGRla29hIgorCisjfiBtc2dpZCAiSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiQXVyaWt1bGFycmFrIgorCisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICJFcmRpa29hIgorCisjfiBtc2dpZCAiTEZFIgorI34gbXNnc3RyICJMRkUiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCIKKyN+IG1zZ3N0ciAiSW5ndXJhdHphaWxlYSIKKworI34gbXNnaWQgIlNpZGUiCisjfiBtc2dzdHIgIkFsYm9rb2EiCisKKyN+IG1zZ2lkICJBVVggT3V0IgorI34gbXNnc3RyICJJcnRlZXJhIGxhZ3VuZ2FycmlhIgorCisjfiBtc2dpZCAiM0QgRGVwdGgiCisjfiBtc2dzdHIgIjNEIHNha29uZXJhIgorCisjfiBtc2dpZCAiM0QgQ2VudGVyIgorI34gbXNnc3RyICIzRCB6ZW50cnVhIgorCisjfiBtc2dpZCAiM0QgRW5oYW5jZSIKKyN+IG1zZ3N0ciAiM0QgaG9iZXR1YSIKKworI34gbXNnaWQgIlRlbGVwaG9uZSIKKyN+IG1zZ3N0ciAiVGVsZWZvbm9hIgorCisjfiBtc2dpZCAiVmlkZW8gSW4iCisjfiBtc2dzdHIgIkJpZGVvLXNhcnJlcmEiCisKKyN+IG1zZ2lkICJBVVggSW4iCisjfiBtc2dzdHIgIlNhcnJlcmEgbGFndW5nYXJyaWEiCisKKyN+IG1zZ2lkICJSZWNvcmQgR2FpbiIKKyN+IG1zZ3N0ciAiR3JhYmF6aW9hcmVuIGlyYWJhemlhIgorCisjfiBtc2dpZCAiT3V0cHV0IEdhaW4iCisjfiBtc2dzdHIgIklydGVlcmFyZW4gaXJhYmF6aWEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEJvb3N0IgorI34gbXNnc3RyICJNaWtyb2Zvbm9hcmVuIGJ1bHR6YWRhIgorCisjfiBtc2dpZCAiRGlhZ25vc3RpYyIKKyN+IG1zZ3N0ciAiRGlhZ25vc3Rpa29hIgorCisjfiBtc2dpZCAiQmFzcyBCb29zdCIKKyN+IG1zZ3N0ciAiQmF4dWFyZW4gYnVsdHphZGEiCisKKyN+IG1zZ2lkICJQbGF5YmFjayBQb3J0cyIKKyN+IG1zZ3N0ciAiRXJyZXByb2R1a3ppb2FyZW4gYXRha2FrIgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIlNhcnJlcmEiCisKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTW9uaXRvcmVhcmVuIGl0dXJidXJ1YSIKKworI34gbXNnaWQgIktleWJvYXJkIEJlZXAiCisjfiBtc2dzdHIgIlRla2xhdHVhcmVuIHNvaW51YSIKKworI34gbXNnaWQgIlNpbXVsYXRlIFN0ZXJlbyIKKyN+IG1zZ3N0ciAiU2ltdWxhdHUgZXN0ZXJlb2EiCisKKyN+IG1zZ2lkICJTdGVyZW8iCisjfiBtc2dzdHIgIkVzdGVyZW9hIgorCisjfiBtc2dpZCAiU3Vycm91bmQgU291bmQiCisjfiBtc2dzdHIgIlNvaW51IGluZ3VyYXR6YWlsZWEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIk1pa3JvZm9ub2FyZW4gaXJhYmF6aWEiCisKKyN+IG1zZ2lkICJTcGVha2VyIFNvdXJjZSIKKyN+IG1zZ3N0ciAiQm96Z29yYWlsdWFyZW4gaXR1cmJ1cnVhIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBTb3VyY2UiCisjfiBtc2dzdHIgIk1pa3JvZm9ub2FyZW4gaXR1cmJ1cnVhIgorCisjfiBtc2dpZCAiSmFjayIKKyN+IG1zZ3N0ciAiSmFjayIKKworI34gbXNnaWQgIkNlbnRlciAvIExGRSIKKyN+IG1zZ3N0ciAiWmVudHJhdHVhIC8gTEZFIgorCisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAiRXN0ZXJlb3prbyBuYWhhc2tldGEiCisKKyN+IG1zZ2lkICJNb25vIE1peCIKKyN+IG1zZ3N0ciAiTW9ub3prbyBuYWhhc2tldGEiCisKKyN+IG1zZ2lkICJJbnB1dCBNaXgiCisjfiBtc2dzdHIgIlNhcnJlcmFrbyBuYWhhc2tldGEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDEiCisjfiBtc2dzdHIgIjEuIG1pa3JvZm9ub2EiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDIiCisjfiBtc2dzdHIgIjIuIG1pa3JvZm9ub2EiCisKKyN+IG1zZ2lkICJEaWdpdGFsIE91dCIKKyN+IG1zZ3N0ciAiSXJ0ZWVyYSBkaWdpdGFsYSIKKworI34gbXNnaWQgIkRpZ2l0YWwgSW4iCisjfiBtc2dzdHIgIlNhcnJlcmEgZGlnaXRhbGEiCisKKyN+IG1zZ2lkICJIRE1JIgorI34gbXNnc3RyICJIRE1JIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgIk1vZGVtYSIKKworI34gbXNnaWQgIkhhbmRzZXQiCisjfiBtc2dzdHIgIkF1cmlrdWxhcittaWtyb2Zvbm9hIgorCisjfiBtc2dpZCAiT3RoZXIiCisjfiBtc2dzdHIgIkJlc3RlbGFrb2EiCisKKyN+IG1zZ2lkICJOb25lIgorI34gbXNnc3RyICJCYXQgZXJlIGV6IgorCisjfiBtc2dpZCAiT24iCisjfiBtc2dzdHIgIlBpenR1IgorCisjfiBtc2dpZCAiT2ZmIgorI34gbXNnc3RyICJJdHphbGkiCisKKyN+IG1zZ2lkICJNdXRlIgorI34gbXNnc3RyICJNdXR1dHUiCisKKyN+IG1zZ2lkICJGYXN0IgorI34gbXNnc3RyICJCaXprb3JyYSIKKworI34gbXNnaWQgIlZlcnkgTG93IgorI34gbXNnc3RyICJPc28gbW90ZWxhIgorCisjfiBtc2dpZCAiTG93IgorI34gbXNnc3RyICJNb3RlbGEiCisKKyN+IG1zZ2lkICJNZWRpdW0iCisjfiBtc2dzdHIgIlRhcnRla29hIgorCisjfiBtc2dpZCAiSGlnaCIKKyN+IG1zZ3N0ciAiQWx0dWEiCisKKyN+IG1zZ2lkICJWZXJ5IEhpZ2giCisjfiBtc2dzdHIgIk9zbyBhbHR1YSIKKworI34gbXNnaWQgIlByb2R1Y3Rpb24iCisjfiBtc2dzdHIgIkVrb2l6cGVuYSIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCisjfiBtc2dzdHIgIkF1cnJlYWxkZWtvIHBhbmVsZWtvIG1pa3JvZm9ub2EiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIEluIgorI34gbXNnc3RyICJBdXJyZWFsZGVrbyBwYW5lbGVrbyBzYXJyZXJha28gbGluZWEiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBIZWFkcGhvbmVzIgorI34gbXNnc3RyICJBdXJyZWFsZGVrbyBwYW5lbGVrbyBhdXJpa3VsYXJyYWsiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIE91dCIKKyN+IG1zZ3N0ciAiQXVycmVhbGRla28gcGFuZWxla28gaXJ0ZWVyYWtvIGxpbmVhIgorCisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICJLb25la3RvcmUgYmVyZGVhIgorCisjfiBtc2dpZCAiUGluayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIktvbmVrdG9yZSBhcnJvc2EiCisKKyN+IG1zZ2lkICJCbHVlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiS29uZWt0b3JlIHVyZGluYSIKKworI34gbXNnaWQgIldoaXRlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiS29uZWt0b3JlIHp1cmlhIgorCisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICJLb25la3RvcmUgYmVsdHphIgorCisjfiBtc2dpZCAiR3JheSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIktvbmVrdG9yZSBncmlzYSIKKworI34gbXNnaWQgIk9yYW5nZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIktvbmVrdG9yZSBsYXJhbmphIgorCisjfiBtc2dpZCAiUmVkIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiS29uZWt0b3JlIGdvcnJpYSIKKworI34gbXNnaWQgIlllbGxvdyBDb25uZWN0b3IiCisjfiBtc2dzdHIgIktvbmVrdG9yZSBob3JpYSIKKworI34gbXNnaWQgIkdyZWVuIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQXVycmVhbGRla28gcGFuZWxla28ga29uZWt0b3JlIGJlcmRlYSIKKworI34gbXNnaWQgIlBpbmsgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJBdXJyZWFsZGVrbyBwYW5lbGVrbyBrb25la3RvcmUgYXJyb3NhIgorCisjfiBtc2dpZCAiQmx1ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkF1cnJlYWxkZWtvIHBhbmVsZWtvIGtvbmVrdG9yZSB1cmRpbmEiCisKKyN+IG1zZ2lkICJXaGl0ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkF1cnJlYWxkZWtvIHBhbmVsZWtvIGtvbmVrdG9yZSB6dXJpYSIKKworI34gbXNnaWQgIkJsYWNrIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQXVycmVhbGRla28gcGFuZWxla28ga29uZWt0b3JlIGJlbHR6YSIKKworI34gbXNnaWQgIkdyYXkgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJBdXJyZWFsZGVrbyBwYW5lbGVrbyBrb25la3RvcmUgZ3Jpc2EiCisKKyN+IG1zZ2lkICJPcmFuZ2UgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJBdXJyZWFsZGVrbyBwYW5lbGVrbyBrb25la3RvcmUgbGFyYW5qYSIKKworI34gbXNnaWQgIlJlZCBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkF1cnJlYWxkZWtvIHBhbmVsZWtvIGtvbmVrdG9yZSBnb3JyaWEiCisKKyN+IG1zZ2lkICJZZWxsb3cgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJBdXJyZWFsZGVrbyBwYW5lbGVrbyBrb25la3RvcmUgaG9yaWEiCisKKyN+IG1zZ2lkICJTcHJlYWQgT3V0cHV0IgorI34gbXNnc3RyICJaYWJhbGR1IGlydGVlcmEiCisKKyN+IG1zZ2lkICJEb3dubWl4IgorI34gbXNnc3RyICJUb2xlc3R1IG5haGFza2V0YSIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgSW5wdXQiCisjfiBtc2dzdHIgIk5haGFzdGFpbGUgYmlydHVhbGFyZW4gc2FycmVyYSIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgT3V0cHV0IgorI34gbXNnc3RyICJOYWhhc3RhaWxlIGJpcnR1YWxhcmVuIGlydGVlcmEiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIENoYW5uZWxzIgorI34gbXNnc3RyICJOYWhhc3RhaWxlIGJpcnR1YWxhcmVuIGthbmFsYWsiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiJXMgJWQgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzIGZ1bnR6aW9hIgorCisjfiBtc2dpZCAiJXMgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzIGZ1bnR6aW9hIgorCisjfiBtc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBvbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkVycm9yZWEgZ2VydGF0dSBkYSAnJTIkcycgZ2FpbHVhbiAlMSRkIGJ5dGUgaXJha3VydHplYW4uIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkV6aW4gaXphbiBkaXJhIGJ1ZmZlcnJhayBpbGFyYW4gamFycmkgJyVzJyBnYWlsdWFuLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzb3VuZCBzZXJ2ZXIiCisjfiBtc2dzdHIgIkV6aW4gaXphbiBkYSBrb25leGlvYSBlemFycmkgc29pbnUtemVyYml0emFyaWFyZWtpbiIKKworI34gbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBzb3VuZCBzZXJ2ZXIgY2FwYWJpbGl0aWVzIgorI34gbXNnc3RyICJIdXRzIGVnaW4gZHUgc29pbnUtemVyYml0emFyaWFyZW4gYWhhbG1lbmEga29udHN1bHRhdHplYW4iCisKKyN+IG1zZ2lkICJEZXNjcmliZXMgdGhlIHNlbGVjdGVkIGlucHV0IGVsZW1lbnQuIgorI34gbXNnc3RyICJTYXJyZXJha28gZWxlbWVudHUgaGF1dGF0dWEgZGVza3JpYmF0emVuIGR1LiIKKworI34gbXNnaWQgIkRlc2NyaWJlcyB0aGUgc2VsZWN0ZWQgb3V0cHV0IGVsZW1lbnQgZm9yIEF1ZGlvL1ZpZGVvIENvbmZlcmVuY2luZy4iCisjfiBtc2dzdHIgIiIKKyN+ICJBdWRpby0vQmlkZW8ta29uZmVyZW50emlhayBlZ2l0ZWtvIGlydGVlcmFrbyBlbGVtZW50dSBoYXV0YXR1YSAiCisjfiAiZGVza3JpYmF0emVuIGR1LiIKKworI34gbXNnaWQgIkRlc2NyaWJlcyB0aGUgc2VsZWN0ZWQgb3V0cHV0IGVsZW1lbnQgZm9yIE11c2ljIGFuZCBNb3ZpZXMuIgorI34gbXNnc3RyICJNdXNpa2FyZW4gZXRhIGZpbG1lbiBpcnRlZXJha28gZWxlbWVudHUgaGF1dGF0dWEgZGVza3JpYmF0emVuIGR1LiIKKworI34gbXNnaWQgIkRlc2NyaWJlcyB0aGUgc2VsZWN0ZWQgb3V0cHV0IGVsZW1lbnQuIgorI34gbXNnc3RyICJJcnRlZXJha28gZWxlbWVudHUgaGF1dGF0dWEgZGVza3JpYmF0emVuIGR1LiIKKworI34gbXNnaWQgIkdTdHJlYW1lciBhdWRpb3NpbmsgZm9yIEF1ZGlvL1ZpZGVvIENvbmZlcmVuY2luZyIKKyN+IG1zZ3N0ciAiQXVkaW8tL0JpZGVvLWtvbmZlcmVudHppYWsgZWdpdGVrbyBHU3RyZWFtZW4gYXVkaW8ta29sZWt0b3JlYSIKKworI34gbXNnaWQgIkdTdHJlYW1lciBhdWRpb3NpbmsgZm9yIE11c2ljIGFuZCBNb3ZpZXMiCisjfiBtc2dzdHIgIk11c2lrYXJlbiBldGEgZmlsbWVuIEdTdHJlYW1lciBhdWRpby1rb2xla3RvcmVhIgorCisjfiBtc2dpZCAiIgorI34gIkdTdHJlYW1lciBjYW4gcGxheSBhdWRpbyB1c2luZyBhbnkgbnVtYmVyIG9mIG91dHB1dCBlbGVtZW50cy4gU29tZSAiCisjfiAicG9zc2libGUgY2hvaWNlcyBhcmUgb3Nzc2luaywgZXNkc2luayBhbmQgYWxzYXNpbmsuIFRoZSBhdWRpb3NpbmsgY2FuIGJlICIKKyN+ICJhIHBhcnRpYWwgcGlwZWxpbmUgaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkhhaW5iYXQgaXJ0ZWVyYWtvIGVsZW1lbnR1IGVyYWJpbGl6IGVycmVwcm9kdXppIGRlemFrZSBhdWRpb2EgR1N0cmVhbWVyLSIKKyN+ICJlay4gSGFsYSBub2xhIG9zc3NpbmssIGVzZHNpbmsgZXRhIGFsc2FzaW5rLiBBdWRpby1rb2xla3RvcmVhIGthbmFsaXphemlvICIKKyN+ICJwYXJ0emlhbCBiYXQgaXphbiBkYWl0ZWtlLCBlbGVtZW50dSBiYXQgaXphbiBiZWhhcnJlYW4uIgorCisjfiBtc2dpZCAiIgorI34gIkdTdHJlYW1lciBjYW4gcGxheSB2aWRlbyB1c2luZyBhbnkgbnVtYmVyIG9mIG91dHB1dCBlbGVtZW50cy4gU29tZSAiCisjfiAicG9zc2libGUgY2hvaWNlcyBhcmUgeHZpbWFnZXNpbmssIHhpbWFnZXNpbmssIHNkbHZpZGVvc2luayBhbmQgYWFzaW5rLiAiCisjfiAiVGhlIHZpZGVvc2luayBjYW4gYmUgYSBwYXJ0aWFsIHBpcGVsaW5lIGluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJIYWluYmF0IGlydGVlcmFrbyBlbGVtZW50dSBlcmFiaWxpeiBlcnJlcHJvZHV6aSBkZXpha2UgYmlkZW9hIEdTdHJlYW1lci0iCisjfiAiZWsuIEhhbGEgbm9sYSB4dmltYWdlc2luaywgeGltYWdlc2luaywgc2RsdmlkZW9zaW5rIGV0YSBhYXNpbmsuIEJpZGVvLSIKKyN+ICJrb2xla3RvcmVhIGthbmFsaXphemlvIHBhcnR6aWFsIGJhdCBpemFuIGRhaXRla2UsIGVsZW1lbnR1IGJhdCBpemFuICIKKyN+ICJiZWhhcnJlYW4uIgorCisjfiBtc2dpZCAiIgorI34gIkdTdHJlYW1lciBjYW4gcHV0IHZpc3VhbGl6YXRpb24gcGx1Z2lucyBpbiBhIHBpcGVsaW5lIHRvIHRyYW5zZm9ybSBhdWRpbyAiCisjfiAic3RyZWFtIGluIHZpZGVvIGZyYW1lcy4gRGVmYXVsdCBpcyBnb29tIGJ1dCBtb3JlIHZpc3VhbGl6YXRpb24gcGx1Z2lucyAiCisjfiAid2lsbCBiZSBwb3J0ZWQgc29vbi4gVGhlIHZpc3VhbGl6YXRpb24gcGx1Z2luIGNhbiBiZSBhIHBhcnRpYWwgcGlwZWxpbmUgIgorI34gImluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJLYW5hbGl6YXppb2V0YW4gYmlzdGFyYXR6ZWtvIHBsdWdpbmFrIGphciBkaXR6YWtlIEdTdHJlYW1lci1laywgYXVkaW8tIgorI34gImtvcnJvbnRlYWsgYmlkZW8tZm90b2dyYW1hIGJpaHVydHpla28uIEdvb20gZGEgbGVoZW5ldHNpYSwgYmFpbmEgbGFzdGVyICIKKyN+ICJpemFuZ28gZGEgYmlzdGFyYXR6ZWtvIHBsdWdpbiBnZWhpYWdvLiBCaXN0YXJhdHpla28gcGx1Z2luYSBrYW5hbGl6YXppbyAiCisjfiAicGFydHppYWwgYmF0IGl6YW4gZGFpdGVrZSwgZWxlbWVudHUgYmF0IGl6YW4gYmVoYXJyZWFuLiIKKworI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHJlY29yZCBhdWRpbyB1c2luZyBhbnkgbnVtYmVyIG9mIGlucHV0IGVsZW1lbnRzLiBTb21lICIKKyN+ICJwb3NzaWJsZSBjaG9pY2VzIGFyZSBvc3NzcmMsIGVzZHNyYyBhbmQgYWxzYXNyYy4gVGhlIGF1ZGlvIHNvdXJjZSBjYW4gYmUgIgorI34gImEgcGFydGlhbCBwaXBlbGluZSBpbnN0ZWFkIG9mIGp1c3Qgb25lIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiSGFpbmJhdCBzYXJyZXJha28gZWxlbWVudHUgZXJhYmlsaXogZ3JhYmEgZGV6YWtlIGF1ZGlvYSBHU3RyZWFtZXItZWsuICIKKyN+ICJIYWxhIG5vbGEgb3Nzc3JjLCBlc2RzcmMgZXRhIGFsc2FzcmMuIEF1ZGlvLWl0dXJidXJ1YSBrYW5hbGl6YXppbyAiCisjfiAicGFydHppYWwgYmF0IGl6YW4gZGFpdGVrZSwgZWxlbWVudHUgYmF0IGl6YW4gYmVoYXJyZWFuLiIKKworI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHJlY29yZCB2aWRlbyBmcm9tIGFueSBudW1iZXIgb2YgaW5wdXQgZWxlbWVudHMuIFNvbWUgIgorI34gInBvc3NpYmxlIGNob2ljZXMgYXJlIHY0bHNyYyBhbmQgdmlkZW90ZXN0c3JjLiBUaGUgdmlkZW8gc291cmNlIGNhbiBiZSBhICIKKyN+ICJwYXJ0aWFsIHBpcGVsaW5lIGluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJIYWluYmF0IHNhcnJlcmFrbyBlbGVtZW50dSBlcmFiaWxpeiBncmFiYSBkZXpha2UgYmlkZW9hIEdTdHJlYW1lci1lay4gIgorI34gIkhhbGEgbm9sYSB2NGxzcmMgZXRhIHZpZGVvdGVzdHNyYy4gQmlkZW8taXR1cmJ1cnVhIGthbmFsaXphemlvIHBhcnR6aWFsICIKKyN+ICJiYXQgaXphbiBkYWl0ZWtlLCBlbGVtZW50dSBiYXQgaXphbiBiZWhhcnJlYW4uIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgYXVkaW8gc291cmNlIgorI34gbXNnc3RyICJHU3RyZWFtZXIgYXVkaW8taXR1cmJ1cnUgbGVoZW5ldHNpYSIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIGF1ZGlvc2luayIKKyN+IG1zZ3N0ciAiR1N0cmVhbWVyIGF1ZGlvLWtvbGVrdG9yZSBsZWhlbmV0c2lhIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgdmlkZW8gc291cmNlIgorI34gbXNnc3RyICJHU3RyZWFtZXIgYmlkZW8taXR1cmJ1cnUgbGVoZW5ldHNpYSIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIHZpZGVvc2luayIKKyN+IG1zZ3N0ciAiR1N0cmVhbWVyIGJpZGVvLWtvbGVrdG9yZSBsZWhlbmV0c2lhIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgdmlzdWFsaXphdGlvbiBwbHVnaW4iCisjfiBtc2dzdHIgIkdTdHJlYW1lciBiaXN0YXJhdHpla28gcGx1Z2luIGxlaGVuZXRzaWEiCisKKyN+IG1zZ2lkICJkZXNjcmlwdGlvbiBmb3IgR1N0cmVhbWVyIGF1ZGlvc2luayBmb3IgQXVkaW8vVmlkZW8gQ29uZmVyZW5jaW5nIgorI34gbXNnc3RyICIiCisjfiAiQXVkaW8tL0JpZGVvLWtvbmZlcmVudHppYWsgZWdpdGVrbyBHU3RyZWFtZW4gYXVkaW8ta29sZWt0b3JlYXJlbiAiCisjfiAiZGVza3JpYmFwZW5hIgorCisjfiBtc2dpZCAiZGVzY3JpcHRpb24gZm9yIEdTdHJlYW1lciBhdWRpb3NpbmsgZm9yIE11c2ljIGFuZCBNb3ZpZXMiCisjfiBtc2dzdHIgIk11c2lrYXJlbiBldGEgZmlsbWVuIEdTdHJlYW1lciBhdWRpby1rb2xla3RvcmVhcmVuIGRlc2tyaWJhcGVuYSIKKworI34gbXNnaWQgImRlc2NyaXB0aW9uIGZvciBkZWZhdWx0IEdTdHJlYW1lciBhdWRpb3NpbmsiCisjfiBtc2dzdHIgIkdTdHJlYW1lciBhdWRpby1rb2xla3RvcmUgbGVoZW5ldHNpYXJlbiBkZXNrcmliYXBlbmEiCisKKyN+IG1zZ2lkICJkZXNjcmlwdGlvbiBmb3IgZGVmYXVsdCBHU3RyZWFtZXIgYXVkaW9zcmMiCisjfiBtc2dzdHIgIkdTdHJlYW1lciBhdWRpb3NyYyBsZWhlbmV0c2lhcmVuIGRlc2tyaWJhcGVuYSIKZGlmZiAtLWdpdCBhL3BvL2ZpLnBvIGIvcG8vZmkucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5YTk3YwotLS0gL2Rldi9udWxsCisrKyBiL3BvL2ZpLnBvCkBAIC0wLDAgKzEsOTA3IEBACisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSBnc3QtcGx1Z2lucy1nb29kIHBhY2thZ2UuCisjIEZpbm5pc2ggbWVzc2FnZXMgZm9yIGdzdC1wbHVnaW5zLWdvb2QuCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIFRvbW1pIFZhaW5pa2FpbmVuLgorIyBDb3B5cmlnaHQgKEMpIDIwMDcgSWxra2EgVHVvaGVsYS4KKyMgU3VvbWVubm9zOiBodHRwOi8vZ25vbWUuZmkvCisjCisjIFRvbW1pIFZhaW5pa2FpbmVuIDx0aHZAaWtpLmZpPiwgMjAwOS0yMDEwLgorIyBJbGtrYSBUdW9oZWxhIDxoaWxlQGlraS5maT4sIDIwMDcuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kIDAuMTAuMjUuM1xuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDEwLTExLTE3IDIzOjAzKzAyMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IFRvbW1pIFZhaW5pa2FpbmVuIDxUb21taS5WYWluaWthaW5lbkBpa2kuZmk+XG4iCisiTGFuZ3VhZ2UtVGVhbTogRmlubmlzaCA8dHJhbnNsYXRpb24tdGVhbS1maUBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+XG4iCisiTGFuZ3VhZ2U6IGZpXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0yOyBwbHVyYWw9KG4gIT0gMSk7XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiSlBFRy1rdXZhbiBwdXJrdSBlcMOkb25uaXN0dWkiCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIuKAnSVz4oCdIGFydGlzdGlsdGEg4oCdJXPigJ0iCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIlBhbHZlbGltZWVuIGVpIHNhYXR1IHlodGV5dHTDpCIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJFaSBVUkw6w6TDpCBhc2V0ZXR0dW5hLiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiUGFsdmVsaW1lbiBuaW1lw6QgZWkgc2FhdHUgc2Vsdml0ZXR0ecOkLiIKKworbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICJZaHRleXR0w6QgcGFsdmVsaW1lZW4gZWkgdm9pdHUgYXZhdGEuIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAiVHVydmFsbGlzZW4geWh0ZXlkZW4gYXZhdXMgZXDDpG9ubmlzdHVpLiIKKworIywgZnV6enkKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICJUYXBhaHR1aSB2ZXJra292aXJoZSB0YWkgcGFsdmVsaW4gc3Vsa2kgeWh0ZXlkZW4geWxsw6R0dMOkZW4uIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICJQYWx2ZWxpbiBsw6RoZXR0aSB2aXJoZWVsbGlzdMOkIGRhdGFhLiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICJQYXZlbGluIGVpIHR1ZSBrZWxhdXN0YS4iCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIiIKKyLDhMOkbnTDpCBlaSBvbGUgdGFpIMOkw6RuaWzDpGhkZSBvbiB2aWFsbGluZW4sIEFWSS12aXJ0YSB0dWxlZSBvbGVtYWFuICIKKyJ2YXVyaW9pdHVudXQuIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJUaWVkb3N0byBlaSBzaXPDpGxsw6Qgc29pdGV0dGF2aWEgdmlydG9qYS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIlRpZWRvc3RvIG9uIHZpcmhlZWxsaW5lbiBlaWvDpCBzaXTDpCB2b2lkYSBlc2l0dMOkw6QuIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiVGllZG9zdG8gb24gdmlvaXR0dW51dCBlaWvDpCBzaXTDpCB2b2lkYSBuw6R5dHTDpMOkLiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJUaWVkb3N0byBvbiB2YWphYSBlaWvDpCBzaXTDpCB2b2lkYSBlc2l0dMOkw6QuIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICJUaWVkb3N0b3NzYSBvbGV2YWEgdmlkZW90YSBlaSBlaGvDpCB2b2lkYSBuw6R5dHTDpMOkIG9pa2Vpbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiVGllZG9zdG8gc2lzw6RsdMOkw6QgdXNlaXRhIHZpcnRvamEuIFNvaXRldGFhbiB2YWluIGVuc2ltbcOkaXNldCAlZCIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisiVHVldHR1YSB2aXJ0YWEgZWkgbMO2eXR5bnl0LiBLZW50aWVzIHNpbnVuIHRhcnZpdHNlZSBhc2VudGFhIEdTdHJlYW1lci1SVFNQLSIKKyJsYWFqZW5udXMga8OkeXR0w6TDpGtzZXNpIFJlYWwtbWVkaWEtdmlydG9qYS4iCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKyJUdWV0dHVhIHZpcnRhYSBlaSBsw7Z5dHlueXQuIFNpbnVuIGtlbnRpZXMgdGFydml0c2VlIHNhbGxpYSB1c2VhbXBpYSAiCisic2lpcnRvcHJvdG9rb2xsaWEsIHRhaSB2YWlodG9laHRvaXNlc3RpIHNpbnVsdGEgc2FhdHRhYSBwdXV0dHVhIG9pa2VhICIKKyJHU3RyZWFtZXItUlRTUC1sYWFqZW5udXNsaWl0w6RubsOkaW5lbi4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisiw4TDpG5pbGFpdGV0dGEgZWkgdm9pdHUgYXZhdGEgdG9pc3RldHRhdmFrc2kuIExhaXRlIG9uIHRvaXNlbiBzb3ZlbGx1a3NlbiAiCisia8OkeXTDtnNzw6QuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyLDhMOkbmlsYWl0ZXR0YSBlaSB2b2l0dSBhdmF0YSB0b2lzdGFtaXN0YSB2YXJ0ZW4uIExhaXR0ZWVuIGF2YWFtaXNlZW4gZWkgb2xlICIKKyJvaWtldWtzaWEuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIsOEw6RuaWxhaXRldHRhIGVpIHZvaXR1IGF2YXRhIHRvaXN0ZXR0YXZha3NpLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKyLDhMOkbmlsYWl0ZXR0YSBlaSB2b2l0dSBhdmF0YSB0b2lzdGFtaXN0YSB2YXJ0ZW4uIFTDpG3DpCBlbGVtZW50dGkgZWkgdHVlIHTDpHTDpCAiCisidmVyc2lvdGEgT3BlbiBTb3VuZCBTeXN0ZW1pc3TDpC4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiVMOkbcOkIMOkw6RuaWxhaXRlIGVpIHR1ZSB0b2lzdGFtaXN0YS4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIsOEw6RuZW50b2lzdG92aXJoZS4iCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIlTDpG3DpCDDpMOkbmlsYWl0ZSBlaSB0dWUgbmF1aG9pdHVzdGEuIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiVmlyaGUgbHVldHRhZXNzYSDDpMOkbmlsYWl0dGVlbHRhLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIsOEw6RuaWxhaXRldHRhIGVpIHZvaXR1IGF2YXRhIG5hdWhvaXR1c3RhIHZhcnRlbi4gTGFpdHRlZW4gYXZhYW1pc2VlbiBlaSBvbGUgIgorIm9pa2V1a3NpYS4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIsOEw6RuaWxhaXRldHRhIGVpIHZvaXR1IGF2YXRhIG5hdWhvaXR1c3RhIHZhcnRlbi4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICIiCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICJOYXVob2l0dXNsw6RoZGUiCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICJNaWtyb2ZvbmkiCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICJMaW5qYXR1bG8iCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiU2lzw6RpbmVuIENEIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIlNQRElGIHNpc8Okw6RuIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIkFVWCAxIHNpc8Okw6RuIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIkFVWCAyIHNpc8Okw6RuIgorCisjLCBmdXp6eQorbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICJUYWthaXNpbmt5dGtlbnTDpCIKKworIywgZnV6enkKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgIlRha2Fpc2lua3l0a2VudMOkIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICLDhMOkbmVudm9pbWFra3V1cyIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIkhlcmtreXlzIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiVGFya2thaWx1IgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiU2lzw6TDpG5yYWtlbm5ldHR1IGthaXV0aW4iCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIkt1dWxva2tlZXQiCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiTGluamEgdWxvcyIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiU1BESUYgdWxvcyIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiQVVYIDEgdWxvcyIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiQVVYIDIgdWxvcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIgorbXNnc3RyICJWaXJoZSBsdWV0dGFlc3NhICVkIHRhdnVhIGxhaXR0ZWVsdGEg4oCdJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIlB1c2tlcmVpdGEgbGFpdHRlZWx0YSDigJ0lc+KAnSBlaSB2b2l0dSBrYXJ0b2l0dGFhIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAiTGFpdHRlZW4g4oCdJXPigJ0gYWp1cmkgZWkgdHVlIG1pdMOkw6RuIHR1bm5ldHR1YSBrYWFwcGF1c3RhcGFhLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICJMYWl0dGVlbiDigJ0lc+KAnSBhanVyaSBlaSB0dWUgbWl0w6TDpG4gdHVubmV0dHVhIGthYXBwYXVzdGFwYWEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICJMYWl0ZSDigJ0lc+KAnSBlaSBvbGUgdWxvc3R1bG9sYWl0ZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICJMYWl0dGVlbHRhIOKAnSVz4oCdIGVpIHZvaSBrYWFwYXRhLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIkxhaXR0ZWVsdGEg4oCdJXPigJ0gZWkgdm9pIGthYXBhdGEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICJMYWl0ZSDigJ0lc+KAnSBlaSBvbGUgdWxvc3R1bG9sYWl0ZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICJMYWl0dGVlbHRhIOKAnSVz4oCdIGVpIHZvaXR1IHNhYWRhIHBhcmFtZXRyZWphIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiVmlkZW9zecO2dGVsYWl0ZSBlaSBoeXbDpGtzeSB1dXR0YSBrZWh5c25vcGV1c2FzZXR1c3RhLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICJWaWRlb3N5w7Z0ZWxhaXRlIGVpIGh5dsOka3N5IHV1dHRhIGtlaHlzbm9wZXVzYXNldHVzdGEuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICJMYWl0dGVlbiDigJ0lc+KAnSBhanVyaSBlaSB0dWUgbWl0w6TDpG4gdHVubmV0dHVhIGthYXBwYXVzdGFwYWEuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIkxhaXR0ZWVuIOKAnSVz4oCdIGFqdXJpIGVpIHR1ZSBtaXTDpMOkbiB0dW5uZXR0dWEga2FhcHBhdXN0YXBhYS4iCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiVmlkZW9zecO2dGVsYWl0ZSBlaSBoeXbDpGtzeSB1dXR0YSBrZWh5c25vcGV1c2FzZXR1c3RhLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlZpcml0dGltZW4gJWQgYXNldHVrc2lhIGVpIHZvaXR1IGx1a2VhIGxhaXR0ZWVsdGEg4oCdJXPigJ0uIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJWaXJoZSBsdWV0dGFlc3NhICVkIHRhdnVhIGxhaXR0ZWVsdGEg4oCdJXPigJ0uIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIkxhaXRlIOKAnSVz4oCdIGVpIG9sZSB1bG9zdHVsb2xhaXRlLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJTaXPDpMOkbnR1bG9hICVkIGVpIHZvaXR1IGFzZXR0YWEgbGFpdHRlZWxsZSAlcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJTaXPDpMOkbnR1bG9hICVkIGVpIHZvaXR1IGFzZXR0YWEgbGFpdHRlZWxsZSAlcy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJMYWl0dGVlbHRhIOKAnSVz4oCdIGVpIHNhYXR1IHNpZ25hYWxpbnZvaW1ha2t1dXR0YS4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIkxhaXR0ZWVuIOKAnSVz4oCdIGFqdXJpIGVpIHR1ZSBtaXTDpMOkbiB0dW5uZXR0dWEga2FhcHBhdXN0YXBhYS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICJWaWRlb3N5w7Z0ZWxhaXRlIGVpIGh5dsOka3N5IHV1dHRhIGtlaHlzbm9wZXVzYXNldHVzdGEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiVmlkZW9zecO2dGVsYWl0ZSBlaSBoeXbDpGtzeSB1dXR0YSBrZWh5c25vcGV1c2FzZXR1c3RhLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICJWaWRlb3N5w7Z0ZWxhaXRlIGVpIGh5dsOka3N5IHV1dHRhIGtlaHlzbm9wZXVzYXNldHVzdGEuIgorCisjLCBmdXp6eQorbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICJKUEVHLWt1dmFuIHB1cmt1IGVww6Rvbm5pc3R1aSIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorIlZpcmhlIGhhZXR0YWVzc2EgbGFpdHRlZW4g4oCdJXPigJ0gb21pbmFpc3V1a3NpYTogc2UgZWkgb2xlIHY0bDItYWp1cmkuVGFya2lzdGEsICIKKyJvbmtvIHNlIHY0bDEtYWp1cmkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiTMOkaHRlZW4gJWQgb21pbmFpc3V1a3NpYSBsYWl0dGVlbHRhICVzIGVpIHZvaXR1IGt5c3nDpCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJWaXJpdHRpbWVuICVkIGFzZXR1a3NpYSBlaSB2b2l0dSBsdWtlYSBsYWl0dGVlbHRhIOKAnSVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkxhaXR0ZWVuIOKAnSVz4oCdIHZpZGVvc3RhbmRhcmRpYSBlaSB2b2l0dSBreXN5w6QuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJMYWl0dGVlbiDigJ0lc+KAnSBvaGphaW5hdHRyaWJ1dXR0ZWphIGVpIHZvaXR1IGx1a2VhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJMYWl0ZXR0YSDigJ0lc+KAnSBlaSB2b2kgdHVubmlzdGFhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICJUw6Rtw6QgZWkgb2xlIGxhaXRlIOKAnSVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIkxhaXRldHRhIOKAnSVz4oCdIGVpIHZvaXR1IGF2YXRhIGx1ZXR0YXZha3NpIGphIGtpcmpvaXRldHRhdmFrc2kuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiTGFpdHRlZWx0YSDigJ0lc+KAnSBlaSB2b2kga2FhcGF0YS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIkxhaXRlIOKAnSVz4oCdIGVpIG9sZSB1bG9zdHVsb2xhaXRlLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgTTJNIGRldmljZS4iCittc2dzdHIgIkxhaXRlIOKAnSVz4oCdIGVpIG9sZSB1bG9zdHVsb2xhaXRlLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIkxhaXRldHRhIOKAnSVz4oCdIGVpIHZvaXR1IGF2YXRhIGx1ZXR0YXZha3NpIGphIGtpcmpvaXRldHRhdmFrc2kuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJMYWl0dGVlbiDigJ0lc+KAnSB2aWRlb3N0YW5kYXJkaWEgZWkgdm9pdHUgYXNldHRhYS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJOeXQgdmlyaXRldHR5w6QgdGFhanV1dHRhIGVpIHZvaXR1IGx1a2VhIGxhaXR0ZWVsdGEg4oCdJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIkxhaXR0ZWVuIOKAnSVz4oCdIHZpcml0dGltZW4gdGFhanV0dGEgZWkgdm9pdHUgYXNldHRhYSBhcnZvb24gJWx1IEh6LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJMYWl0dGVlbHRhIOKAnSVz4oCdIGVpIHNhYXR1IHNpZ25hYWxpbnZvaW1ha2t1dXR0YS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk9oamFpbWVsbGUgJWQgZWkgc2FhdHUgYXJ2b2EgbGFpdHRlZWx0YSDigJ0lc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkFydm9hICVkIGVpIHZvaXR1IGFzZXR0YWEgb2hqYWltZWxsZSAlZCBsYWl0dGVlbGxhIOKAnSVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIkxhaXR0ZWVuIOKAnSVz4oCdIHTDpG3DpG5oZXRraXN0w6Qgc2lzw6TDpG50dWxvYSBlaSB2b2l0dSBsdWtlYSwgc2UgZWkgZWhrw6Qgb2xlICIKKyJyYWRpb2xhaXRlIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiTGFpdHRlZW4g4oCdJXPigJ0gdMOkbcOkbmhldGtpc3TDpCBzaXPDpMOkbnR1bG9hIGVpIHZvaXR1IGx1a2VhLCBzZSBlaSBlaGvDpCBvbGUgIgorInJhZGlvbGFpdGUiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIlNpc8Okw6RudHVsb2EgJWQgZWkgdm9pdHUgYXNldHRhYSBsYWl0dGVlbGxlICVzLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIlJlc29sdXV0aW9uIHZhaWh0byBrw6R5dMO2biBhaWthbmEgZWkgb2xlIHZpZWzDpCBtYWhkb2xsaXN0YS4iCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIkVpIHZvaXR1IHRvaW1pYSBpbG1hbiBrZWxsb2EiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIlNpc8OkaXNlbiB0aWV0b3ZpcnJhbiB2aXJoZS4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICJTaXPDpGlzZW4gdGlldG92aXJyYW4gdmlyaGUuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAiTGFpdGUg4oCdJXPigJ0gZWkgb2xlIHVsb3N0dWxvbGFpdGUuIgorCisjfiBtc2dpZCAiR290IHVuZXhwZWN0ZWQgZnJhbWUgc2l6ZSBvZiAldSBpbnN0ZWFkIG9mICV1LiIKKyN+IG1zZ3N0ciAiU2FhdGlpbiBvZG90dGFtYXRvbiBrZWh5cyBrb29sdGFhbiAldSBvZG90ZXR1biAldSBzaWphYW4uIgorCisjfiBtc2dpZCAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJWaWRlb3J1dXR1amVuIG5vdXRhbWluZW4gbGFpdHRlZWx0YSDigJ0lc+KAnSBlcMOkb25uaXN0dWkuIgorCisjfiBtc2dpZCAiRmFpbGVkIGFmdGVyICVkIHRyaWVzLiBkZXZpY2UgJXMuIHN5c3RlbSBlcnJvcjogJXMiCisjfiBtc2dzdHIgIkVww6Rvbm5pc3R1aSAlZCB5cml0eWtzZW4gasOkbGtlZW46IGxhaXRlICVzLCBqw6RyamVzdGVsbcOkdmlyaGU6ICVzIgorCisjfiBtc2dpZCAiQmFzcyIKKyN+IG1zZ3N0ciAiQmFzc28iCisKKyN+IG1zZ2lkICJUcmVibGUiCisjfiBtc2dzdHIgIllsw6Qtw6TDpG5ldCIKKworI34gbXNnaWQgIlN5bnRoIgorI34gbXNnc3RyICJTeW50aCIKKworI34gbXNnaWQgIlBDTSIKKyN+IG1zZ3N0ciAiUENNIgorCisjfiBtc2dpZCAiU3BlYWtlciIKKyN+IG1zZ3N0ciAiS2FpdXRpbiIKKworI34gbXNnaWQgIkxpbmUtaW4iCisjfiBtc2dzdHIgIkxpbmphdHVsbyIKKworI34gbXNnaWQgIkNEIgorI34gbXNnc3RyICJDRCIKKworI34gbXNnaWQgIk1peGVyIgorI34gbXNnc3RyICJNaWtzZXJpIgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIlBDTS0yIgorCisjfiBtc2dpZCAiUmVjb3JkIgorI34gbXNnc3RyICJOYXVob2l0dXMiCisKKyN+IG1zZ2lkICJJbi1nYWluIgorI34gbXNnc3RyICJHYWluLXNpc8Okw6RuIgorCisjfiBtc2dpZCAiT3V0LWdhaW4iCisjfiBtc2dzdHIgIkdhaW4tdWxvcyIKKworI34gbXNnaWQgIkxpbmUtMSIKKyN+IG1zZ3N0ciAiTGluamEtMSIKKworI34gbXNnaWQgIkxpbmUtMiIKKyN+IG1zZ3N0ciAiTGluamEtMiIKKworI34gbXNnaWQgIkxpbmUtMyIKKyN+IG1zZ3N0ciAiTGluamEtMyIKKworI34gbXNnaWQgIkRpZ2l0YWwtMSIKKyN+IG1zZ3N0ciAiRGlnaXRhYWxpbmVuLTEiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTIiCisjfiBtc2dzdHIgIkRpZ2l0YWFsaW5lbi0yIgorCisjfiBtc2dpZCAiRGlnaXRhbC0zIgorI34gbXNnc3RyICJEaWdpdGFhbGluZW4tMyIKKworI34gbXNnaWQgIlBob25lLWluIgorI34gbXNnc3RyICJMZXZ5c29pdGludHVsbyIKKworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAiTGV2eXNvaXRpbmzDpGh0w7YiCisKKyN+IG1zZ2lkICJWaWRlbyIKKyN+IG1zZ3N0ciAiVmlkZW8iCisKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAiUmFkaW8iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIgorI34gbXNnc3RyICLDhMOkbmlsYWl0ZXR0YSBlaSB2b2l0dSBhdmF0YSBtaWtzZXJpbmhhbGxpbnRhYSB2YXJ0ZW4uIgorCisjfiBtc2dpZCAiIgorI34gIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4gVGhpcyB2ZXJzaW9uIG9mICIKKyN+ICJ0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiw4TDpG5pbGFpdGV0dGEgZWkgdm9pdHUgYXZhdGEgbWlrc2VyaW5oYWxsaW50YWEgdmFydGVuLiBUw6Rtw6QgZWxlbWVudHRpIGVpICIKKyN+ICJ0dWUgdMOkdMOkIHZlcnNpb3RhIE9wZW4gU291bmQgU3lzdGVtaXN0w6QuIgorCisjfiBtc2dpZCAiTWFzdGVyIgorI34gbXNnc3RyICJQw6TDpCIKKworI34gbXNnaWQgIkZyb250IgorI34gbXNnc3RyICJFdHUiCisKKyN+IG1zZ2lkICJSZWFyIgorI34gbXNnc3RyICJUYWthIgorCisjfiBtc2dpZCAiSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiS3V1bG9ra2VldCIKKworI34gbXNnaWQgIkNlbnRlciIKKyN+IG1zZ3N0ciAiS2Vza2kiCisKKyN+IG1zZ2lkICJMRkUiCisjfiBtc2dzdHIgIkxGRSIKKworI34gbXNnaWQgIlN1cnJvdW5kIgorI34gbXNnc3RyICJTdXJyb3VuZCIKKworI34gbXNnaWQgIlNpZGUiCisjfiBtc2dzdHIgIlNpdnUiCisKKyN+IG1zZ2lkICJBVVggT3V0IgorI34gbXNnc3RyICJBVVggdWxvcyIKKworI34gbXNnaWQgIjNEIERlcHRoIgorI34gbXNnc3RyICIzRC1zeXZ5eXMiCisKKyN+IG1zZ2lkICIzRCBDZW50ZXIiCisjfiBtc2dzdHIgIjNELWtlc2tpIgorCisjfiBtc2dpZCAiM0QgRW5oYW5jZSIKKyN+IG1zZ3N0ciAiM0QtdGVob3N0dXMiCisKKyN+IG1zZ2lkICJUZWxlcGhvbmUiCisjfiBtc2dzdHIgIlB1aGVsaW4iCisKKyN+IG1zZ2lkICJWaWRlbyBJbiIKKyN+IG1zZ3N0ciAiVmlkZW90dWxvIgorCisjfiBtc2dpZCAiQVVYIEluIgorI34gbXNnc3RyICJBVVggc2lzw6TDpG4iCisKKyN+IG1zZ2lkICJSZWNvcmQgR2FpbiIKKyN+IG1zZ3N0ciAiTmF1aG9pdHVzZ2FpbiIKKworI34gbXNnaWQgIk91dHB1dCBHYWluIgorI34gbXNnc3RyICJHYWluLXVsb3MiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEJvb3N0IgorI34gbXNnc3RyICJNaWtyb2Zvbml0ZWhvc3RpbiIKKworI34gbXNnaWQgIkRpYWdub3N0aWMiCisjfiBtc2dzdHIgIkRpYWdub3NvaW50aSIKKworI34gbXNnaWQgIkJhc3MgQm9vc3QiCisjfiBtc2dzdHIgIkJhc3NvdGVob3N0aW4iCisKKyN+IG1zZ2lkICJQbGF5YmFjayBQb3J0cyIKKyN+IG1zZ3N0ciAiVG9pc3RvcG9ydGl0IgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIlNpc8Okw6RuIgorCisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgIlRhcmtrYWlsdWzDpGhkZSIKKworI34gbXNnaWQgIktleWJvYXJkIEJlZXAiCisjfiBtc2dzdHIgIk7DpHBww6RpbWlzdMO2cGlpcHBhdXMiCisKKyN+IG1zZ2lkICJTaW11bGF0ZSBTdGVyZW8iCisjfiBtc2dzdHIgIlNpbXVsb2l0dSBzdGVyZW8iCisKKyN+IG1zZ2lkICJTdGVyZW8iCisjfiBtc2dzdHIgIlN0ZXJlbyIKKworI34gbXNnaWQgIlN1cnJvdW5kIFNvdW5kIgorI34gbXNnc3RyICJTdXJyb3VuZC3DpMOkbmkiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIk1pa3JvZm9uaS1nYWluIgorCisjfiBtc2dpZCAiU3BlYWtlciBTb3VyY2UiCisjfiBtc2dzdHIgIkthaXV0aW5sw6RoZGUiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTWlrcm9mb25pbMOkaGRlIgorCisjfiBtc2dpZCAiSmFjayIKKyN+IG1zZ3N0ciAiUGlzdG9rZSIKKworI34gbXNnaWQgIkNlbnRlciAvIExGRSIKKyN+IG1zZ3N0ciAiS2Vza2kgLyBMRkUiCisKKyN+IG1zZ2lkICJTdGVyZW8gTWl4IgorI34gbXNnc3RyICJTdGVyZW8gTWl4IgorCisjfiBtc2dpZCAiTW9ubyBNaXgiCisjfiBtc2dzdHIgIk1vbm8gTWl4IgorCisjfiBtc2dpZCAiSW5wdXQgTWl4IgorI34gbXNnc3RyICJTaXPDpMOkbiBNaXgiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDEiCisjfiBtc2dzdHIgIk1pa3JvZm9uaSAxIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICJNaWtyb2ZvbmkgMiIKKworI34gbXNnaWQgIkRpZ2l0YWwgT3V0IgorI34gbXNnc3RyICJEaWdpdGFhbGluZW4gdWxvcyIKKworI34gbXNnaWQgIkRpZ2l0YWwgSW4iCisjfiBtc2dzdHIgIkRpZ2l0YWFsaW5lbiBzaXPDpMOkbiIKKworI34gbXNnaWQgIkhETUkiCisjfiBtc2dzdHIgIkhETUkiCisKKyN+IG1zZ2lkICJNb2RlbSIKKyN+IG1zZ3N0ciAiTW9kZWVtaSIKKworI34gbXNnaWQgIkhhbmRzZXQiCisjfiBtc2dzdHIgIkt1dWxva2tlZXQiCisKKyN+IG1zZ2lkICJPdGhlciIKKyN+IG1zZ3N0ciAiTXV1IgorCisjfiBtc2dpZCAiTm9uZSIKKyN+IG1zZ3N0ciAiRWkgbWlrw6TDpG4iCisKKyN+IG1zZ2lkICJPbiIKKyN+IG1zZ3N0ciAiUMOkw6RsbMOkIgorCisjfiBtc2dpZCAiT2ZmIgorI34gbXNnc3RyICJQb2lzc2EiCisKKyN+IG1zZ2lkICJNdXRlIgorI34gbXNnc3RyICJWYWltZW5uZXR0dSIKKworI34gbXNnaWQgIkZhc3QiCisjfiBtc2dzdHIgIk5vcGVhIgorCisjfiBtc2dpZCAiVmVyeSBMb3ciCisjfiBtc2dzdHIgIkVyaXR0w6RpbiBtYXRhbGEiCisKKyN+IG1zZ2lkICJMb3ciCisjfiBtc2dzdHIgIk1hdGFsYSIKKworI34gbXNnaWQgIk1lZGl1bSIKKyN+IG1zZ3N0ciAiTWVkaXVtIgorCisjfiBtc2dpZCAiSGlnaCIKKyN+IG1zZ3N0ciAiS29ya2VhIgorCisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICJFcml0dMOkaW4ga29ya2VhIgorCisjfiBtc2dpZCAiUHJvZHVjdGlvbiIKKyN+IG1zZ3N0ciAiVHVvdGFudG8iCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICJFdHVwYW5lZWxpbiBtaWtyb2ZvbmkiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIEluIgorI34gbXNnc3RyICJFdHVwYW5lZWxpbiBsaW5qYXR1bG8iCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBIZWFkcGhvbmVzIgorI34gbXNnc3RyICJFdHVwYW5lZWxpbiBrdXVsb2trZWV0IgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBPdXQiCisjfiBtc2dzdHIgIkV0dXBhbmVlbGluIGxpbmphIHVsb3MiCisKKyN+IG1zZ2lkICJHcmVlbiBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlZpaHJlw6QgbGlpdGluIgorCisjfiBtc2dpZCAiUGluayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlZhYWxlYW5wdW5haW5lbiBsaWl0aW4iCisKKyN+IG1zZ2lkICJCbHVlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiU2luaW5lbiBsaWl0aW4iCisKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlZhbGtvaW5lbiBsaWl0aW4iCisKKyN+IG1zZ2lkICJCbGFjayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk11c3RhIGxpaXRpbiIKKworI34gbXNnaWQgIkdyYXkgQ29ubmVjdG9yIgorI34gbXNnc3RyICJIYXJtYWEgbGlpdGluIgorCisjfiBtc2dpZCAiT3JhbmdlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiT3JhbnNzaSBsaWl0aW4iCisKKyN+IG1zZ2lkICJSZWQgQ29ubmVjdG9yIgorI34gbXNnc3RyICJQdW5haW5lbiBsaWl0aW4iCisKKyN+IG1zZ2lkICJZZWxsb3cgQ29ubmVjdG9yIgorI34gbXNnc3RyICJLZWx0YWluZW4gbGlpdGluIgorCisjfiBtc2dpZCAiR3JlZW4gRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJWaWhyZcOkIGV0dXBhbmVlbGlsaWl0aW4iCisKKyN+IG1zZ2lkICJQaW5rIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiVmFhbGVhbnB1bmFpbmVuIGV0dXBhbmVlbGlsaWl0aW4iCisKKyN+IG1zZ2lkICJCbHVlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiU2luaW5lbiBldHVwYW5lZWxpbGlpdGluIgorCisjfiBtc2dpZCAiV2hpdGUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJWYWxrb2luZW4gZXR1cGFuZWVsaWxpaXRpbiIKKworI34gbXNnaWQgIkJsYWNrIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiTXVzdGEgZXR1cGFuZWVsaWxpaXRpbiIKKworI34gbXNnaWQgIkdyYXkgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJIYXJtYWEgZXR1cGFuZWVsaWxpaXRpbiIKKworI34gbXNnaWQgIk9yYW5nZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk9yYW5zc2kgZXR1cGFuZWVsaWxpaXRpbiIKKworI34gbXNnaWQgIlJlZCBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlB1bmFpbmVuIGV0dXBhbmVlbGlsaWl0aW4iCisKKyN+IG1zZ2lkICJZZWxsb3cgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJLZWx0YWluZW4gZXR1cGFuZWVsaWxpaXRpbiIKKworI34gbXNnaWQgIlNwcmVhZCBPdXRwdXQiCisjfiBtc2dzdHIgIkxldml0ZXR0eSB1bG9zIgorCisjfiBtc2dpZCAiRG93bm1peCIKKyN+IG1zZ3N0ciAiQWxhc21pa3NhdXMiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIElucHV0IgorI34gbXNnc3RyICJWaXJ0dWFhbGluZW4gbWlrc2VyaXR1bG8iCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIE91dHB1dCIKKyN+IG1zZ3N0ciAiVmlydHVhYWxpbmVuIG1pa3NlcmkgdWxvcyIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgQ2hhbm5lbHMiCisjfiBtc2dzdHIgIlZpcnR1YWFsaXNldCBtaWtzZXJpa2FuYXZhdCIKKworI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyAlZCAtdG9pbWludG8iCisKKyN+IG1zZ2lkICIlcyBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiJXMgLXRvaW1pbnRvIgorCisjfiBtc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBvbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIlZpcmhlIGx1ZXR0YWVzc2EgJWQgdGF2dWEgbGFpdHRlZWx0YSDigJ0lc+KAnS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZW5xdWV1ZSBidWZmZXJzIGluIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiUHVza3VyZWl0YSBlaSB2b2l0dSBsYWl0dGFhIGpvbm9vbiBsYWl0dGVlbGxhIOKAnSVz4oCdLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzb3VuZCBzZXJ2ZXIiCisjfiBtc2dzdHIgIllodGV5dHTDpCDDpMOkbmlwYWx2ZWxpbWVlbiBlaSB2b2l0dSBhdmF0YSIKKworI34gbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBzb3VuZCBzZXJ2ZXIgY2FwYWJpbGl0aWVzIgorI34gbXNnc3RyICLDhMOkbmlwYWx2ZWxpbWVuIG9taW5haXN1dWtzaWEgZWkgdm9pdHUgc2Vsdml0dMOkw6QiCisKKyN+IG1zZ2lkICIiCisjfiAiVGhlIGJ1ZmZlciB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzLCBvciBubyAiCisjfiAiYnVmZmVycyBoYXZlIGJlZW4gYWxsb2NhdGVkIHlldCwgb3IgdGhlIHVzZXJwdHIgb3IgbGVuZ3RoIGFyZSBpbnZhbGlkLiAiCisjfiAiZGV2aWNlICVzIgorI34gbXNnc3RyICIiCisjfiAiUHVza3VyaXR5eXBwaSBlaSBvbGUgdHVldHR1LCBpbmRla3NpIG9uIHJham9qZW4gdWxrb3B1b2xlbGxhLCBwdXNrdXJlaXRhICIKKyN+ICJlaSBvbGUgdmllbMOkIHZhcmF0dHUgdGFpIGvDpHl0dMOkasOkbiBvc29pdGluIHRhaSBwaXR1dXMgb3ZhdCB2aXJoZWVsbGlzZXQuICIKKyN+ICJsYWl0ZSAlcyIKKworI34gbXNnaWQgImluc3VmZmljaWVudCBtZW1vcnkgdG8gZW5xdWV1ZSBhIHVzZXIgcG9pbnRlciBidWZmZXIuIGRldmljZSAlcy4iCisjfiBtc2dzdHIgIiIKKyN+ICJtdWlzdGkgZWkgcmlpdMOkIGvDpHl0dMOkasOkbiBvc29pdGlucHVza3VyaW4gam9ub29uIGxpc8Okw6RtaXNlZW4uIGxhaXRlICVzIgorCisjfiBtc2dpZCAiTm8gZnJlZSBidWZmZXJzIGZvdW5kIGluIHRoZSBwb29sIGF0IGluZGV4ICVkLiIKKyN+IG1zZ3N0ciAiVmFwYWl0YSBwdXNrdXJlaXRhIGVpIGzDtnl0eW55dCBpbmRla3NpbGzDpCAlZC4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgcmVhZCBmcm9tIENELiIKKyN+IG1zZ3N0ciAiQ0QtbGV2eWx0w6QgZWkgdm9pdHUgbHVrZWEuIgorCisjfiBtc2dpZCAiRGlzYyBpcyBub3QgYW4gQXVkaW8gQ0QuIgorI34gbXNnc3RyICJMZXZ5IGVpIG9sZSDDpMOkbmktQ0QuIgorCisjfiBtc2dpZCAiVGhpcyBmaWxlIGlzIGVuY3J5cHRlZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCisjfiBtc2dzdHIgIlRpZWRvc3RvIG9uIHNhbGF0dHUgZWlrw6Qgc2l0w6Qgdm9pZGEgbsOkeXR0w6TDpC4iCisKKyN+IG1zZ2lkICJEZXNjcmliZXMgdGhlIHNlbGVjdGVkIGlucHV0IGVsZW1lbnQuIgorI34gbXNnc3RyICJLdXZhYSB2YWxpdHVuIGzDpGhkZS1lbGVtZW50aW4uIgorCisjfiBtc2dpZCAiRGVzY3JpYmVzIHRoZSBzZWxlY3RlZCBvdXRwdXQgZWxlbWVudCBmb3IgQXVkaW8vVmlkZW8gQ29uZmVyZW5jaW5nLiIKKyN+IG1zZ3N0ciAiS3V2YWEgw6TDpG5pLSBqYSB2aWRlb25ldXZvdHRlbHVpbGxlIHZhbGl0dW4gdWxvc3R1bG9lbGVtZW50aW4uIgorCisjfiBtc2dpZCAiRGVzY3JpYmVzIHRoZSBzZWxlY3RlZCBvdXRwdXQgZWxlbWVudCBmb3IgTXVzaWMgYW5kIE1vdmllcy4iCisjfiBtc2dzdHIgIkt1dmFhIG11c2lpa2lsbGUgamEgZWxva3V2aWxsZSB2YWxpdHVuIHVsb3N0dWxvZWxlbWVudGluLiIKKworI34gbXNnaWQgIkRlc2NyaWJlcyB0aGUgc2VsZWN0ZWQgb3V0cHV0IGVsZW1lbnQuIgorI34gbXNnc3RyICJLdXZhYSB2YWxpdHVuIHVsb3N0dWxvZWxlbWVudGluLiIKKworI34gbXNnaWQgIkdTdHJlYW1lciBhdWRpb3NpbmsgZm9yIEF1ZGlvL1ZpZGVvIENvbmZlcmVuY2luZyIKKyN+IG1zZ3N0ciAiR1N0cmVhbWVyLcOkw6RuaW5pZWx1IMOkw6RuaS0gamEgdmlkZW9uZXV2b3R0ZWx1aWxsZSIKKworI34gbXNnaWQgIkdTdHJlYW1lciBhdWRpb3NpbmsgZm9yIE11c2ljIGFuZCBNb3ZpZXMiCisjfiBtc2dzdHIgIkdTdHJlYW1lci3DpMOkbmluaWVsdSDDpMOkbmVsbGUgamEgZWxva3V2aWxsZSIKKworI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHBsYXkgYXVkaW8gdXNpbmcgYW55IG51bWJlciBvZiBvdXRwdXQgZWxlbWVudHMuIFNvbWUgIgorI34gInBvc3NpYmxlIGNob2ljZXMgYXJlIG9zc3NpbmssIGVzZHNpbmsgYW5kIGFsc2FzaW5rLiBUaGUgYXVkaW9zaW5rIGNhbiBiZSAiCisjfiAiYSBwYXJ0aWFsIHBpcGVsaW5lIGluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJHU3RyZWFtZXIgdm9pIHNvaXR0YWEgw6TDpG50w6Qga8OkeXR0w6RlbiB1c2VpdGEgZXJpIG5pZWx1ZWxlbWVudHRlasOkLiAiCisjfiAiTXV1dGFtaWEgdmFpaHRvZWh0b2phIG92YXQgb3Nzc2luaywgZXNkc2luayBqYSBhbHNhc2luay4gw4TDpG5pbmllbHUgdm9pICIKKyN+ICJvbGxhIG15w7ZzIGxpdWt1aGlobmFuIG9zYSBlaWvDpCB2YWluIHlrc2kgZWxlbWVudHRpLiIKKworI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHBsYXkgdmlkZW8gdXNpbmcgYW55IG51bWJlciBvZiBvdXRwdXQgZWxlbWVudHMuIFNvbWUgIgorI34gInBvc3NpYmxlIGNob2ljZXMgYXJlIHh2aW1hZ2VzaW5rLCB4aW1hZ2VzaW5rLCBzZGx2aWRlb3NpbmsgYW5kIGFhc2luay4gIgorI34gIlRoZSB2aWRlb3NpbmsgY2FuIGJlIGEgcGFydGlhbCBwaXBlbGluZSBpbnN0ZWFkIG9mIGp1c3Qgb25lIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiR1N0cmVhbWVyIHZvaSB0b2lzdGFhIHZpZGVvdGEga8OkeXR0w6RlbiB1c2VpdGEgZXJpIG5pZWx1ZWxlbWVudHRlasOkLiAiCisjfiAiTXV1dGFtaWEgdmFpaHRvZWh0b2phIG92YXQgeHZpbWFnZXNpbmssIHhpbWFnZXNpbmssIHNkbHZpZGVvc2luayBqYSAiCisjfiAiYWFzaW5rLiBWaWRlb25pZWx1IHZvaSBvbGxhIG15w7ZzIGxpdWt1aGlobmFuIG9zYSBlaWvDpCB2YWluIHlrc2kgZWxlbWVudHRpLiIKKworI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHB1dCB2aXN1YWxpemF0aW9uIHBsdWdpbnMgaW4gYSBwaXBlbGluZSB0byB0cmFuc2Zvcm0gYXVkaW8gIgorI34gInN0cmVhbSBpbiB2aWRlbyBmcmFtZXMuIERlZmF1bHQgaXMgZ29vbSBidXQgbW9yZSB2aXN1YWxpemF0aW9uIHBsdWdpbnMgIgorI34gIndpbGwgYmUgcG9ydGVkIHNvb24uIFRoZSB2aXN1YWxpemF0aW9uIHBsdWdpbiBjYW4gYmUgYSBwYXJ0aWFsIHBpcGVsaW5lICIKKyN+ICJpbnN0ZWFkIG9mIGp1c3Qgb25lIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiR3N0cmVhbWVyIHZvaSBsYWl0dGFhIHZpc3VhbGlzb2ludGlsaWl0w6RubsOkaXNpw6QgbGl1a3VoaWhuYWxsZSwgam9sbGUgc2UgIgorI34gIm11dW50YWEgw6TDpG5pdmlycmFuIHZpZGVvcnV1ZHVpa3NpLiBPbGV0dXNsaWl0w6RubsOkaW5lbiBvbiBnb29tLCBtdXR0YSAiCisjfiAibXVpdGEgb2xsYWFuIGxpc8Okw6Rtw6Rzc8OkIHBpYW4uIFZpc3VhbGlzb2lubmluIGxpaXTDpG5uw6RpbmVuIHZvaSBvbGxhIG15w7ZzICIKKyN+ICJsaXVrdWhpaG5hbiBvc2EgZWlrw6QgdmFpbiB5a3NpIGVsZW1lbnR0aS4iCisKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiByZWNvcmQgYXVkaW8gdXNpbmcgYW55IG51bWJlciBvZiBpbnB1dCBlbGVtZW50cy4gU29tZSAiCisjfiAicG9zc2libGUgY2hvaWNlcyBhcmUgb3Nzc3JjLCBlc2RzcmMgYW5kIGFsc2FzcmMuIFRoZSBhdWRpbyBzb3VyY2UgY2FuIGJlICIKKyN+ICJhIHBhcnRpYWwgcGlwZWxpbmUgaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkdTdHJlYW1lciB2b2kgbmF1aG9pdHRhYSDDpMOkbnTDpCBrw6R5dHTDpGVuIHVzZWl0YSBlcmkgbMOkaGRlLWVsZW1lbnR0ZWrDpC4gIgorI34gIk11dXRhbWlhIHZhaWh0b2VodG9qYSBvdmF0IG9zc3NyYywgZXNkc3JjIGphIGFsc2FzcmMuIMOEw6RuaWzDpGhkZSB2b2kgb2xsYSAiCisjfiAibXnDtnMgbGl1a3VoaWhuYW4gb3NhIGVpa8OkIHZhaW4geWtzaSBlbGVtZW50dGkuIgorCisjfiBtc2dpZCAiIgorI34gIkdTdHJlYW1lciBjYW4gcmVjb3JkIHZpZGVvIGZyb20gYW55IG51bWJlciBvZiBpbnB1dCBlbGVtZW50cy4gU29tZSAiCisjfiAicG9zc2libGUgY2hvaWNlcyBhcmUgdjRsc3JjIGFuZCB2aWRlb3Rlc3RzcmMuIFRoZSB2aWRlbyBzb3VyY2UgY2FuIGJlIGEgIgorI34gInBhcnRpYWwgcGlwZWxpbmUgaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkdTdHJlYW1lciB2b2kgbmF1aG9pdHRhYSB2aWRlb3RhIGvDpHl0dMOkZW4gdXNlaXRhIGVyaSBsw6RoZGUtZWxlbWVudHRlasOkLiAiCisjfiAiTXV1dGFtaWEgdmFpaHRvZWh0b2phIG92YXQgdjRsc3JjIGphIHZpZGVvdGVzdHNyYy4uIFZpZGVvbMOkaGRlIHZvaSBvbGxhICIKKyN+ICJtecO2cyBsaXVrdWhpaG5hbiBvc2EgZWlrw6QgdmFpbiB5a3NpIGVsZW1lbnR0aS4iCisKKyN+IG1zZ2lkICJkZWZhdWx0IEdTdHJlYW1lciBhdWRpbyBzb3VyY2UiCisjfiBtc2dzdHIgIkdTdHJlYW1lcmluIG9sZXR1c8Okw6RuaWzDpGhkZSIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIGF1ZGlvc2luayIKKyN+IG1zZ3N0ciAiR1N0cmVhbWVyaW4gb2xldHVzw6TDpG5pbmllbHUiCisKKyN+IG1zZ2lkICJkZWZhdWx0IEdTdHJlYW1lciB2aWRlbyBzb3VyY2UiCisjfiBtc2dzdHIgIkdTdHJlYW1lcmluIG9sZXR1c3ZpZGVvbMOkaGRlIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgdmlkZW9zaW5rIgorI34gbXNnc3RyICJHU3RyZWFtZXJpbiBvbGV0dXN2aWRlb25pZWx1IgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgdmlzdWFsaXphdGlvbiBwbHVnaW4iCisjfiBtc2dzdHIgIkdzdHJlYW1lcmluIHZpc3VhbGlzb2ludGllbiBvbGV0dXNsaWl0w6RubsOkaW5lbiIKKworI34gbXNnaWQgImRlc2NyaXB0aW9uIGZvciBHU3RyZWFtZXIgYXVkaW9zaW5rIGZvciBBdWRpby9WaWRlbyBDb25mZXJlbmNpbmciCisjfiBtc2dzdHIgImt1dmF1cyDDpMOkbmktIGphIHZpZGVvbmV1dm90dGVsdW4gR1N0cmVhbWVyLcOkw6RuaW5pZWx1bGxlIgorCisjfiBtc2dpZCAiZGVzY3JpcHRpb24gZm9yIEdTdHJlYW1lciBhdWRpb3NpbmsgZm9yIE11c2ljIGFuZCBNb3ZpZXMiCisjfiBtc2dzdHIgImt1dmF1cyBtdXNpaWtpbiBqYSBlbG9rdXZpZW4gR1N0cmVhbWVyLcOkw6RuaW5pZWx1bGxlIgorCisjfiBtc2dpZCAiZGVzY3JpcHRpb24gZm9yIGRlZmF1bHQgR1N0cmVhbWVyIGF1ZGlvc2luayIKKyN+IG1zZ3N0ciAiR1N0cmVhbWVyaW4gb2xldHVzw6TDpG5pbmllbHVuIGt1dmF1cyIKKworI34gbXNnaWQgImRlc2NyaXB0aW9uIGZvciBkZWZhdWx0IEdTdHJlYW1lciBhdWRpb3NyYyIKKyN+IG1zZ3N0ciAiR1N0cmVhbWVyaW4gb2xldHVzw6TDpG5pbMOkaHRlZW4ga3V2YXVzIgpkaWZmIC0tZ2l0IGEvcG8vZnIucG8gYi9wby9mci5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWNkODgxCi0tLSAvZGV2L251bGwKKysrIGIvcG8vZnIucG8KQEAgLTAsMCArMSw0NjMgQEAKKyMgVHJhbnNsYXRpb24gb2YgZ3N0LXBsdWdpbnMtZ29vZCB0byBGcmVuY2gKKyMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTEgR1N0cmVhbWVyIGNvcmUgdGVhbQorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ3N0LXBsdWdpbnMtZ29vZCBwYWNrYWdlLgorIworIyBOaWNvbGFzIFZlbGluIDxuaWNvbGFzQHZlbGluLmZyPiwgMjAwOC4KKyMgQ2xhdWRlIFBhcm96IDxjbGF1ZGVAMnhsaWJyZS5uZXQ+LCAyMDA4LTIwMTEuCisjIFN0w6lwaGFuZSBBdWxlcnkgPGxrcHBvQGZyZWUuZnI+LCAyMDE1LgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZCAxLjcuMlxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDE2LTAyLTIwIDE2OjI3KzAxMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IFN0w6lwaGFuZSBBdWxlcnkgPGxrcHBvQGZyZWUuZnI+XG4iCisiTGFuZ3VhZ2UtVGVhbTogRnJlbmNoIDx0cmFkdWNAdHJhZHVjLm9yZz5cbiIKKyJMYW5ndWFnZTogZnJcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAic2VydmV1ciBKYWNrIGludHJvdXZhYmxlIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICLDiWNoZWMgZGUgZMOpY29kYWdlIGRlIGzigJlpbWFnZSBKUEVHIgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICLCq8KgJXPCoMK7IHBhciDCq8KgJXPCoMK7IgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJJbXBvc3NpYmxlIGRlIHNlIGNvbm5lY3RlciBhdSBzZXJ2ZXVyIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIkF1Y3VuIFVSTCBkw6lmaW5pLiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiSW1wb3NzaWJsZSBkZSByw6lzb3VkcmUgbGUgbm9tIGR1IHNlcnZldXIuIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIkltcG9zc2libGUgZOKAmcOpdGFibGlyIHVuZSBjb25uZXhpb24gdmVycyBsZSBzZXJ2ZXVyLiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIkxhIGNvbmZpZ3VyYXRpb24gZOKAmXVuZSBjb25uZXhpb24gc8OpY3VyaXPDqWUgYSDDqWNob3XDqS4iCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICIiCisiVW5lIGVycmV1ciByw6lzZWF1IHPigJllc3QgcHJvZHVpdGUgb3UgbGUgc2VydmV1ciBhIGZlcm3DqSBhYnJ1cHRlbWVudCBsYSAiCisiY29ubmV4aW9uLiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiTGUgc2VydmV1ciBhIGVudm95w6kgZGUgbWF1dmFpc2VzIGRvbm7DqWVzLiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICJMZSBzZXJ2ZXVyIG5lIGfDqHJlIHBhcyBsYSByZWNoZXJjaGUuIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICJFbnRyw6llIGF1ZGlvIGFic2VudGUgb3Ugbm9uIHZhbGlkZSwgbGUgZmx1eCBBVkkgc2VyYSBjb3Jyb21wdS4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIkNlIGZpY2hpZXIgbmUgY29udGllbnQgYXVjdW4gZmx1eCBleHBsb2l0YWJsZS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkNlIGZpY2hpZXIgbidlc3QgcGFzIHZhbGlkZSBldCBuZSBwZXV0IGRvbmMgcGFzIMOqdHJlIGx1LiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICJJbXBvc3NpYmxlIGRlIGxpcmUgbGUgZmx1eCBjYXIgaWwgZXN0IGNoaWZmcsOpIHBhciB1biBEUk0gUGxheVJlYWR5LiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiQ2UgZmljaGllciBlc3QgY29ycm9tcHUgZXQgbmUgcGV1dCBwYXMgw6p0cmUgbHUuIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICJUYWlsbGUgZOKAmWF0b21lIG5vbiB2YWxpZGUuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJDZSBmaWNoaWVyIG7igJllc3QgcGFzIGNvbXBsZXQgZXQgbmUgcGV1dCBkb25jIHBhcyDDqnRyZSBsdS4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIiIKKyJJbCBlc3QgcG9zc2libGUgcXVlIGxhIHZpZMOpbyBkYW5zIGNlIGZpY2hpZXIgbmUgcHVpc3NlIHBhcyDDqnRyZSBsdWUgIgorImNvcnJlY3RlbWVudC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiQ2UgZmljaGllciBjb250aWVudCB0cm9wIGRlIGZsdXguIFNldWxzIGxlcyAlZCBwcmVtaWVycyBzZXJvbnQgbHVzIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyJBdWN1biBmbHV4IHByaXMgZW4gY2hhcmdlIG7igJlhIMOpdMOpIHRyb3V2w6kuIElsIGZhdXQgcGV1dC3DqnRyZSBpbnN0YWxsZXIgdW4gIgorImdyZWZmb24gZOKAmWV4dGVuc2lvbiBHU3RyZWFtZXIgUlRTUCBwb3VyIGxlcyBmbHV4IFJlYWwgbWVkaWEuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisiQXVjdW4gZmx1eCBwcmlzIGVuIGNoYXJnZSBu4oCZYSDDqXTDqSB0cm91dsOpLiBJbCBmYXV0IHBldXQtw6p0cmUgYXV0b3Jpc2VyICIKKyJkYXZhbnRhZ2UgZGUgcHJvdG9jb2xlcyBkZSB0cmFuc3BvcnQgb3UgaWwgbWFucXVlIHBldXQtw6p0cmUgbGUgYm9uIGdyZWZmb24gIgorImTigJlleHRlbnNpb24gR1N0cmVhbWVyIFJUU1AuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIkltcG9zc2libGUgZOKAmW91dnJpciBsZSBww6lyaXBow6lyaXF1ZSBhdWRpbyBlbiBsZWN0dXJlLiBMZSBww6lyaXBow6lyaXF1ZSBlc3QgIgorInV0aWxpc8OpIHBhciB1bmUgYXV0cmUgYXBwbGljYXRpb24uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJJbXBvc3NpYmxlIGTigJlvdXZyaXIgbGUgcMOpcmlwaMOpcmlxdWUgYXVkaW8gZW4gbGVjdHVyZS4gVm91cyBu4oCZYXZleiBwYXMgbGVzICIKKyJkcm9pdHMgbsOpY2Vzc2FpcmVzIHBvdXIgb3V2cmlyIGxlIHDDqXJpcGjDqXJpcXVlLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICJJbXBvc3NpYmxlIGTigJlvdXZyaXIgbGUgcMOpcmlwaMOpcmlxdWUgYXVkaW8gZW4gbGVjdHVyZS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisiSW1wb3NzaWJsZSBk4oCZb3V2cmlyIGxlIHDDqXJpcGjDqXJpcXVlIGF1ZGlvIGVuIGxlY3R1cmUuIENldHRlIHZlcnNpb24gZOKAmU9TUyAiCisiKE9wZW4gU291bmQgU3lzdGVtKSBu4oCZZXN0IHBhcyBwcmlzZSBlbiBjaGFyZ2UgcGFyIGNldCDDqWzDqW1lbnQuIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkxhIGxlY3R1cmUgbuKAmWVzdCBwYXMgcHJpc2UgZW4gY2hhcmdlIHBhciBjZSBww6lyaXBow6lyaXF1ZSBhdWRpby4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIkVycmV1ciBkZSBsZWN0dXJlIGF1ZGlvLiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiTOKAmWVucmVnaXN0cmVtZW50IG7igJllc3QgcGFzIHByaXMgZW4gY2hhcmdlIHBhciBjZSBww6lyaXBow6lyaXF1ZSBhdWRpby4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJFcnJldXIgbG9ycyBkZSBs4oCZZW5yZWdpc3RyZW1lbnQgw6AgcGFydGlyIGR1IHDDqXJpcGjDqXJpcXVlIGF1ZGlvLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIkltcG9zc2libGUgZOKAmW91dnJpciBsZSBww6lyaXBow6lyaXF1ZSBhdWRpbyBwb3VyIGzigJllbnJlZ2lzdHJlbWVudC4gVm91cyBu4oCZYXZleiAiCisicGFzIGxlcyBkcm9pdHMgbsOpY2Vzc2FpcmVzIHBvdXIgb3V2cmlyIGxlIHDDqXJpcGjDqXJpcXVlLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiSW1wb3NzaWJsZSBk4oCZb3V2cmlyIGxlIHDDqXJpcGjDqXJpcXVlIGF1ZGlvIHBvdXIgbOKAmWVucmVnaXN0cmVtZW50LiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICJQw6lyaXBow6hyaXF1ZSBDb3JlQXVkaW8gaW50cm91dmFibGUiCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIkxlIHDDqXJpcGjDqHJpcXVlIENvcmVBdWRpbyBu4oCZYSBwYXMgcHUgw6p0cmUgb3V2ZXJ0IgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAiU291cmNlIGTigJllbnJlZ2lzdHJlbWVudCIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIk1pY3JvIgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAiRW50csOpZSBsaWduZSIKKworbXNnaWQgIkludGVybmFsIENEIgorbXNnc3RyICJDRCBpbnRlcm5lIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIkVudHLDqWUgU1BESUYiCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiRW50csOpZSBBVVggMSIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJFbnRyw6llIEFVWCAyIgorCittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIkNvZGVjIGJvdWNsZSBpbnRlcm5lIgorCittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICJTdW5WVFMgYm91Y2xlIGludGVybmUiCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIlZvbHVtZSIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIkdhaW4iCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJNb25pdGV1ciIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIkhhdXQtcGFybGV1ciBpbnRlcm5lIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICLDiWNvdXRldXJzIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIlNvcnRpZSBsaWduZSIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiU29ydGllIFNQRElGIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICJTb3J0aWUgQVVYIDEiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIlNvcnRpZSBBVVggMiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIgorbXNnc3RyICJFcnJldXIgZGUgbGVjdHVyZSBkZSAlZCBvY3RldHMgc3VyIGxlIHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisiSW1wb3NzaWJsZSBk4oCZw6ludW3DqXJlciBsZXMgZm9ybWF0cyB2aWTDqW8gY29tcGF0aWJsZXMgYXZlYyBsZSBww6lyaXBow6lyaXF1ZSAiCisiwqvCoCVzwqDCuyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiSW1wb3NzaWJsZSBkZSBtYXBwZXIgbGVzIHRhbXBvbnMgZHUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIiIKKyJMZSBwaWxvdGUgZHUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuyBuZSBwcmVuZCBlbiBjaGFyZ2UgbGEgbcOpdGhvZGUgZOKAmWVudHLDqWUtIgorInNvcnRpZSAlZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIiIKKyJMZSBwaWxvdGUgZHUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuyBuZSBwcmVuZCBlbiBjaGFyZ2UgYXVjdW5lIG3DqXRob2RlIGTigJllbnRyw6llLSIKKyJzb3J0aWUgY29ubnVlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICJQw6lyaXBow6lyaXF1ZSDCq8KgJXPCoMK7IG9jY3Vww6kiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIiIKKyJMZSBww6lyaXBow6lyaXF1ZSDCq8KgJXPCoMK7IG5lIHBldXQgcGFzIGNhcHR1cmVyIGF2ZWMgdW5lIHLDqXNvbHV0aW9uIGRlICVkIHggJWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIkxlIHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrsgbmUgcGV1dCBwYXMgY2FwdHVyZXIgZGFucyBsZSBmb3JtYXQgc3DDqWNpZmnDqSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICJMZSBww6lyaXBow6lyaXF1ZSDCq8KgJXPCoMK7IG5lIHByZW5kIHBhcyBlbiBjaGFyZ2UgbGVzIHBsYW5zIG5vbiBjb250aWd1w6tzIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiSW1wb3NzaWJsZSBk4oCZb2J0ZW5pciBsZXMgcGFyYW3DqHRyZXMgZHUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuyIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiIgorIkxlIHDDqXJpcGjDqXJpcXVlIHZpZMOpbyBu4oCZYSBwYXMgYWNjZXB0w6kgbGUgbm91dmVhdSBwYXJhbcOodHJlIGRlIGZyw6lxdWVuY2UgIgorImTigJlpbWFnZS4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICJMZSBww6lyaXBow6lyaXF1ZSB2aWTDqW8gbuKAmWEgcGFzIGZvdXJuaSBkZSBmb3JtYXQgZGUgc29ydGllLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICJMZSBww6lyaXBow6lyaXF1ZSB2aWTDqW8gYSByZXRvdXJuw6kgdW5lIGRpbWVuc2lvbnMgaW5jb3JyZWN0ZS4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiIgorIkxlIHDDqXJpcGjDqXJpcXVlIHZpZMOpbyB1dGlsaXNlIHVuZSBtw6l0aG9kZSBk4oCZZW50cmVsYWNlbWVudCBub24gcHJpc2UgZW4gIgorImNoYXJnZS4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiTGUgcMOpcmlwaMOpcmlxdWUgdmlkw6lvIHV0aWxpc2UgdW4gZm9ybWF0IGRlIHBpeGVsIG5vbiBwcmlzIGVuIGNoYXJnZS4iCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiSW1wb3NzaWJsZSBkZSBjb25maWd1cmVyIGxlIHNwb29sZXIgaW50ZXJuZSBkZSB0YW1wb25zLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiTGUgcMOpcmlwaMOpcmlxdWUgdmlkw6lvIG7igJlhIHN1Z2fDqXLDqSBhdWN1bmUgdGFpbGxlIGRlIGNhY2hlLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJJbXBvc3NpYmxlIGTigJlvYnRlbmlyIGxlcyBwYXJhbcOodHJlcyBkdSBzeW50b25pc2V1ciAlZCBkdSBww6lyaXBow6lyaXF1ZSDCq8KgJXPCoMK7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJFcnJldXIgZOKAmWludGVycm9nYXRpb24gZGVzIGNhcGFjaXTDqXMgZHUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICJMZSBww6lyaXBow6lyaXF1ZSDCq8KgJXPCoMK7IG4nZXN0IHBhcyB1biBzeW50b25pc2V1ci4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJJbXBvc3NpYmxlIGTigJlvYnRlbmlyIHVuIGZsdXggcmFkaW8gZGVwdWlzIGxlIHDDqXJpcGjDqXJpcXVlICVzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIkltcG9zc2libGUgZGUgZMOpZmluaXIgbOKAmWVudHLDqWUgJWQgc3VyIGxlIHDDqXJpcGjDqXJpcXVlICVzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiSW1wb3NzaWJsZSBkZSBtb2RpZmllciBsYSBzb3VyZGluZSBkdSBww6lyaXBow6lyaXF1ZSDCq8KgJXPCoMK7LiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiSW1wb3NzaWJsZSBk4oCZYWxsb3VlciBsYSBtw6ltb2lyZSBuw6ljZXNzYWlyZS4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiSW1wb3NzaWJsZSBk4oCZYWxsb3VlciBsYSBtw6ltb2lyZSBuw6ljZXNzYWlyZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIkxlIGNvbnZlcnRpc3NldXIgZHUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuyBuZSBwcmVuZCBlbiBjaGFyZ2UgYXVjdW4gZm9ybWF0ICIKKyJk4oCZZW50csOpZSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIkxlIGNvbnZlcnRpc3NldXIgZHUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuyBuZSBwcmVuZCBlbiBjaGFyZ2UgYXVjdW4gZm9ybWF0IGRlICIKKyJzb3J0aWUiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJM4oCZZW5jb2RldXIgZHUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuyBuZSBwcmVuZCBlbiBjaGFyZ2UgYXVjdW4gZm9ybWF0IGTigJllbnRyw6llIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIkzigJllbmNvZGV1ciBkdSBww6lyaXBow6lyaXF1ZSDCq8KgJXPCoMK7IG5lIHByZW5kIGVuIGNoYXJnZSBhdWN1biBmb3JtYXQgZGUgc29ydGllIgorCittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIsOJY2hlYyBkZSBkw6ltYXJyYWdlIGR1IHByb2Nlc3N1cyBkZSBkw6ljb2RhZ2UuIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICLDiWNoZWMgZHUgdHJhaXRlbWVudCBkZSBmcmFtZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisiRXJyZXVyIGRlIHLDqWN1cMOpcmF0aW9uIGRlcyBjYXBhY2l0w6lzIHBvdXIgbGUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCu8KgOiBjZSBu4oCZZXN0ICIKKyJwYXMgdW4gcGlsb3RlIHY0bDIuIFbDqXJpZmlleiBzaSBj4oCZZXN0IHVuIHBpbG90ZSB2NGwxLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIiIKKyJJbXBvc3NpYmxlIGRlIHLDqWN1cMOpcmVyIGxlcyBhdHRyaWJ1dHMgZGUgbOKAmWVudHLDqWUgJWQgZHUgcMOpcmlwaMOpcmlxdWUgJXMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIkltcG9zc2libGUgZGUgcsOpY3Vww6lyZXIgbGVzIHBhcmFtw6h0cmVzIGR1IHN5bnRvbmlzZXVyICVkIGR1IHDDqXJpcGjDqXJpcXVlICIKKyLCq8KgJXPCoMK7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkltcG9zc2libGUgZGUgcsOpY3Vww6lyZXIgbGEgbm9ybWUgZHUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJJbXBvc3NpYmxlIGRlIHLDqWN1cMOpcmVyIGxlcyBhdHRyaWJ1dHMgZGUgY29udHLDtGxlIGR1IHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkltcG9zc2libGUgZOKAmWlkZW50aWZpZXIgbGUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQ2VjaSBu4oCZZXN0IHBhcyB1biBww6lyaXBow6lyaXF1ZSDCq8KgJXPCoMK7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIkltcG9zc2libGUgZOKAmW91dnJpciBsZSBww6lyaXBow6lyaXF1ZSDCq8KgJXPCoMK7IGVuIGxlY3R1cmUgZXQgw6ljcml0dXJlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIkxlIHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrsgbuKAmWVzdCBwYXMgdW4gcMOpcmlwaMOpcmlxdWUgZOKAmWVucmVnaXN0cmVtZW50LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiTGUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuyBu4oCZZXN0IHBhcyB1biBww6lyaXBow6lyaXF1ZSBkZSBzb3J0aWUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICJMZSBww6lyaXBow6lyaXF1ZSDCq8KgJXPCoMK7IG7igJllc3QgcGFzIHVuIHDDqXJpcGjDqXJpcXVlIE0yTS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIkltcG9zc2libGUgZGUgZHVwbGlxdWVyIGxlIHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrsgZW4gbGVjdHVyZSBldCDDqWNyaXR1cmUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJMYSBkw6lmaW5pdGlvbiBkZSBsYSBub3JtZSBkdSBww6lyaXBow6lyaXF1ZSDCq8KgJXPCoMK7IGEgw6ljaG91w6kuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIkltcG9zc2libGUgZGUgcsOpY3Vww6lyZXIgbGEgZnLDqXF1ZW5jZSBhY3R1ZWxsZSBkZSBzeW50b25pc2F0aW9uIGR1ICIKKyJww6lyaXBow6lyaXF1ZSDCq8KgJXPCoMK7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisiSW1wb3NzaWJsZSBkZSBkw6lmaW5pciBsYSBmcsOpcXVlbmNlIGRlIHN5bnRvbmlzYXRpb24gZHUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuyDDoCAiCisiJWx1wqBIei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiSW1wb3NzaWJsZSBk4oCZb2J0ZW5pciBsYSBmb3JjZSBkdSBzaWduYWwgZHUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJJbXBvc3NpYmxlIGRlIHLDqWN1cMOpcmVyIGxhIHZhbGV1ciBkdSBjb250csO0bGUgJWQgZHUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJJbXBvc3NpYmxlIGRlIHLDqWN1cMOpcmVyIGxhIHZhbGV1ciAlZCBkdSBjb250csO0bGUgJWQgZHUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJJbXBvc3NpYmxlIGRlIHLDqWN1cMOpcmVyIGzigJllbnRyw6llIGFjdHVlbGxlIGR1IHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrsuIEPigJllc3QgcGV1dC0iCisiw6p0cmUgdW4gcMOpcmlwaMOpcmlxdWUgcmFkaW8iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIkltcG9zc2libGUgZGUgcsOpY3Vww6lyZXIgbGEgc29ydGllIGFjdHVlbGxlIGR1IHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrsuIEPigJllc3QgIgorInBldXQtw6p0cmUgdW4gcMOpcmlwaMOpcmlxdWUgcmFkaW8iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiSW1wb3NzaWJsZSBkZSBkw6lmaW5pciBsYSBzb3J0aWUgJWQgZHUgcMOpcmlwaMOpcmlxdWUgJXMuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiIgorIkxhIG1vZGlmaWNhdGlvbiBkZSBsYSByw6lzb2x1dGlvbiBhdSBjb3VycyBkZSBs4oCZZXjDqWN1dGlvbiBu4oCZZXN0IHBhcyBlbmNvcmUgIgorInByaXNlIGVuIGNoYXJnZS4iCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIkltcG9zc2libGUgZGUgZm9uY3Rpb25uZXIgc2FucyBob3Jsb2dlIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBzdHJlYW0gZXJyb3IuIgorI34gbXNnc3RyICJFcnJldXIgZHUgZmx1eCBkZSBkb25uw6llcyBpbnRlcm5lLiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgZmxvdyBlcnJvci4iCisjfiBtc2dzdHIgIkVycmV1ciBkdSBmbHV4IGRlIGRvbm7DqWVzIGludGVybmUuIgpkaWZmIC0tZ2l0IGEvcG8vZnVyLnBvIGIvcG8vZnVyLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZmMxZTMKLS0tIC9kZXYvbnVsbAorKysgYi9wby9mdXIucG8KQEAgLTAsMCArMSw0MzYgQEAKKyMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KKyMgVGhpcyBmaWxlIGlzIHB1dCBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMgRkFCSU8gVE9NQVQgPGYudC5wdWJsaWNAZ21haWwuY29tPiwgMjAxNy4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QgMS4xMC4wXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTctMDItMTcgMTA6NTQrMDEwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogRmFiaW8gVG9tYXQgPGYudC5wdWJsaWNAZ21haWwuY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IEZyaXVsaWFuIDxmLnQucHVibGljQGdtYWlsLmNvbT5cbiIKKyJMYW5ndWFnZTogZnVyXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiWC1CdWdzOiBSZXBvcnQgdHJhbnNsYXRpb24gZXJyb3JzIHRvIHRoZSBMYW5ndWFnZS1UZWFtIGFkZHJlc3MuXG4iCisiWC1HZW5lcmF0b3I6IFBvZWRpdCAxLjguMTFcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD0obiAhPSAxKTtcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiU2Vydmlkw7RyIEphY2sgbm8gY2phdMOidCIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiTm8gc2kgw6ggcml2w6J0cyBhIGRlY29kaWZpY8OiIGxhIGltYWdqaW4gSlBFRyIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiJyVzJyBkaSAnJXMnIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJJbXB1c3NpYmlsIGNvbmV0aXNpIGFsIHNlcnZpZMO0ciIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJOaXNzdW4gVVJMIHN0YWJpbMOudC4iCisKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIkltcHVzc2liaWwgcmlzb2x2aSBpbCBub24gZGFsIHNlcnZpZMO0ci4iCisKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiSW1wdXNzaWJpbCBzdGFiaWzDriBsYSBjb25lc3Npb24gYWwgc2Vydmlkw7RyLiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIk5vIHNpIMOoIHJpdsOidHMgYSBjb25maWd1csOiIGxhIGNvbmVzc2lvbiBzaWd1cmUuIgorCittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorIkFsIMOoIGNhcGl0w6J0IHVuIGVyw7RyIGRpIHLDqnQgbyBpbCBzZXJ2aWTDtHIgYWwgw6Agc2llcsOidCBsYSBjb25lc3Npb24gaW4gIgorIm1hbmllcmUgaW5zcGlldGFkZS4iCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIklsIHNlcnZpZMO0ciBhbCDDoCBpbnZpw6J0IGTDonRzIHNiYWxpw6J0cy4iCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiSWwgc2Vydmlkw7RyIG5vbCBzdXB1YXJ0ZSBsYSByaWNlcmNqZS4iCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIk5pc3N1biBvIGludmFsaXQgYXVkaW8gaW4gamVudHJhZGUsIGlsIGZsdXMgQVZJIGFsIHNhcsOgIHJ1dmluw6J0LiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAiQ2hlc3QgZmlsZSBub2wgY29udGVuIGZsdXMgcmlwcm9kdXNpYmlpLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiQ2hlc3QgZmlsZSBub2wgw6ggdmFsaXQgZSBub2wgcHVlcyBqZXNzaSByaXByb2RvdC4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiIgorIkltcHVzc2liaWwgcmlwcm9kdXNpIGlsIGZsdXMgcGFyIHZpZSBjaGUgYWwgw6ggY2lmcsOidCBjdW4gUGxheVJlYWR5IERSTS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkNoZXN0IGZpbGUgYWwgw6ggcnV2aW7DonQgZSBub2wgcHVlcyBqZXNzaSByaXByb2RvdC4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIkRpbWVuc2lvbiBhdG9tIG5vIHZhbGlkZS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkNoZXN0IGZpbGUgbm9sIMOoIGNvbXBsZXQgZSBub2wgcHVlcyBqZXNzaSByaXByb2RvdC4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgImlsIHZpZGVvIGluIGNoZXN0IGZpbGUgYWwgcG9kYXLDqHMgbm8gZnVuemlvbsOiIGJlbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiQ2hlc3QgZmlsZSBhbCBjb250ZW4gbWFzc2UgZmx1cy4gU2kgcmlwcm9kdXNhcsOgIG5vbWUgaSBwcmlucyAlZCIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisiTmlzc3VuIGZsdXMgc3VwdWFydMOidCBhbCDDqCBzdMOidCBjamF0w6J0LiBBbCBwb2RhcsOocyBjb3ZlbnTDoiBkaSBpbnN0YWzDoiB1biAiCisicGx1Z2luIGRpIGVzdGVuc2lvbiBSVFNQIHBhciBHU3RyZWFtZXIgcGFpIGZsdXMgUmVhbCBtZWRpYS4iCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKyJOaXNzdW4gZmx1cyBzdXB1YXJ0w6J0IGFsIMOoIHN0w6J0IGNqYXTDonQuIEFsIHBvZGFyw6hzIGNvdmVudMOiIGRpIHBlcm1ldGkgcGx1aSAiCisicHJvdG9jb2kgZGkgdHJhc3B1YXJ0IG8gaW4gYWx0ZXJuYXRpdmUgYWwgcG9kYXLDqHMgbWFuY2rDoiBpbCBqdXN0IHBsdWdpbiBkaSAiCisiZXN0ZW5zaW9uIFJUU1AgcGFyIEdTdHJlYW1lci4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisiSW1wdXNzaWJpbCB2aWVyemkgaWwgZGlzcG9zaXTDrmYgYXVkaW8gcGUgcmlwcm9kdXppb24uIElsIGRpc3Bvc2l0w65mIGFsIMOoICIKKyJkb3Byw6J0IGRpIHVuZSBhbHRyZSBhcGxpY2F6aW9uLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiSW1wdXNzaWJpbCB2aWVyemkgaWwgZGlzcG9zaXTDrmYgYXVkaW8gcGUgcmlwcm9kdXppb24uIE5vIHNpIMOgIGkgcGVybcOocyBwYXIgIgorInZpZXJ6aSBpbCBkaXNwb3NpdMOuZi4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiSW1wdXNzaWJpbCB2aWVyemkgaWwgZGlzcG9zaXTDrmYgYXVkaW8gcGUgcmlwcm9kdXppb24uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIkltcHVzc2liaWwgdmllcnppIGlsIGRpc3Bvc2l0w65mIGF1ZGlvIHBlIHJpcHJvZHV6aW9uLiBDaGVzdGUgdmVyc2lvbiBkaSBPcGVuICIKKyJTb3VuZCBTeXN0ZW0gbm8gamUgc3VwdWFydGFkZSBkaSBjaGVzdCBlbGVtZW50LiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJMYSByaXByb2R1emlvbiBubyBqZSBzdXB1YXJ0YWRlIGRpIGNoZXN0IGRpc3Bvc2l0w65mIGF1ZGlvLiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAiRXLDtHIgZGkgcmlwcm9kdXppb24gYXVkaW8uIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJMYSByZWdqaXN0cmF6aW9uIG5vIGplIHN1cHVhcnRhZGUgZGkgY2hlc3QgZGlzcG9zaXTDrmYgYXVkaW8uIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiRXLDtHIgdGFsIHJlZ2ppc3Ryw6IgZGFsIGRpc3Bvc2l0w65mIGF1ZGlvLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIkltcHVzc2liaWwgdmllcnppIGlsIGRpc3Bvc2l0w65mIGF1ZGlvIHBlIHJlZ2ppc3RyYXppb24uIE5vIHNpIMOgIGkgcGVybcOocyBwYXIgIgorInZpZXJ6aSBpbCBkaXNwb3NpdMOuZi4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIkltcHVzc2liaWwgdmllcnppIGlsIGRpc3Bvc2l0w65mIGF1ZGlvIHBlIHJlZ2ppc3RyYXppb24uIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgIkRpc3Bvc2l0w65mIENvcmVBdWRpbyBubyBjamF0w6J0IgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICJOb2wgw6ggc3TDonQgcHVzc2liaWwgdmllcnppIGlsIGRpc3Bvc2l0w65mIENvcmVBdWRpbyIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIlNvcnppbnQgcmVnamlzdHJhemlvbiIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIk1pY3JvZm9uIgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAiTGluaWUgZGkgamVudHJhZGUiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiQ0QgaW50ZXJuaSIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJTUERJRiBqZW50cmFkZSIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICJBVVggMSBqZW50cmFkZSIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJBVVggMiBqZW50cmFkZSIKKworbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICJMb29wYmFjayBDb2RlYyIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiTG9vcGJhY2sgU3VuVlRTIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJWb2x1bSIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIlZ1YWRhZ24iCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJNb25pdG9yIgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiQ2Fzc2UgaW5jb3Jwb3JhZGUiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIkN1ZmlzIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIkxpbmllIGRpIGplc3N1ZGUiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIlNQRElGIGplc3N1ZGUiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIkFVWCAxIGplc3N1ZGUiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIkFVWCAyIGplc3N1ZGUiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRXLDtHIgdGFsIGxlaSAlZCBieXRlIGRhbCBkaXNwb3NpdMOuZiAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorIk5vIHNpIMOoIHJpdsOidHMgYSBmw6IgbGEgbGlzdGUgZGFpIHB1c3NpYmlpIGZvcm3DonRzIHZpZGVvIGN1aSBjdWFpIGlsICIKKyJkaXNwb3NpdMOuZiAnJXMnIGFsIHB1ZXMgbGF2b3LDoiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiSW1wdXNzaWJpbCBtYXDDoiBpIGJ1ZmZlciBkYWwgZGlzcG9zaXTDrmYgICclcyciCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIklsIGRyaXZlciBkYWwgZGlzcG9zaXTDrmYgJyVzJyBub2wgc3VwdWFydGUgaWwgbWV0b2RpIElPICVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAiSWwgZHJpdmVyIGRhbCBkaXNwb3NpdMOuZiAnJXMnIG5vbCBzdXB1YXJ0ZSBuaXNzdW4gbWV0b2RpIElPIGNvZ25vc3PDu3QuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIklsIGRpc3Bvc2l0w65mICclcycgYWwgw6ggb2N1cMOidCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiSWwgZGlzcG9zaXTDrmYgJyVzJyBub2wgcHVlcyBjYXR1csOiIGEgJWR4JWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIklsIGRpc3Bvc2l0w65mICclcycgbm9sIHB1ZXMgY2F0dXLDoiB0YWwgZm9ybcOidCBzcGVjaWZpY8OidCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICJJbXB1c3NpYmlsIG90aWduw64gaSBwYXJhbWV0cmlzIHN1bCBkaXNwb3NpdMOuZiAnJXMnIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICIiCisiSWwgZGlzcG9zaXTDrmYgdmlkZW8gbm9sIMOgIGFjZXTDonQgbGEgZ25vdmUgaW1wb3N0YXppb24gZGUgZnJlY3VlbmNlIGRpICIKKyJmb3RvZ3JhbXMuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiSWwgZGlzcG9zaXTDrmYgdmlkZW8gbm9sIMOgIGZ1cm7DrnQgdW4gZm9ybcOidCBkaSBqZXNzdWRlLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICJJbCBkaXNwb3NpdMOuZiB2aWRlbyBhbCDDoCB0b3Juw6J0IGRpbWVuc2lvbnMgbm8gdmFsaWRpcy4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiSWwgZGlzcG9zaXTDrmYgdmlkZW8gYWwgZG9wcmUgdW4gbWV0b2RpIGRpIGludGVybGF6YW1lbnQgbm8gc3VwdWFydMOidCIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICJJbCBkaXNwb3NpdMOuZiB2aWRlbyBhbCBkb3ByZSB1biBmb3Jtw6J0IHBpeGVsIG5vIHN1cHVhcnTDonQuIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiSWwgZGlzcG9zaXTDrmYgdmlkZW8gbm9sIMOgIHN1Z2plcsOudCBuaXNzdW5lIGRpbWVuc2lvbiBkaSBidWZmZXIuIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiTm8gc2kgw6ggcml2w6J0cyBhIHbDqiBpbXBvc3RhemlvbnMgZGFsIHNpbnRvbml6YWTDtHIgJWQgc3VsIGRpc3Bvc2l0w65mICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkVyw7RyIHRhbCBvdGlnbsOuIGxpIGZ1bnppb25hbGl0w6J0cyBwYWwgZGlzcG9zaXTDrmYgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICJJbCBkaXNwb3NpdMOuZiAnJXMnIG5vbCDDqCB1biBzaW50b25pemFkw7RyLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIk5vIHNpIMOoIHJpdsOidHMgYSB2w6ogbGlzIGplbnRyYWRpcyByYWRpbyBzdWwgZGlzcG9zaXTDrmYgJyVzJy4gIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiTm8gc2kgw6ggcml2w6J0cyBhIHN0YWJpbMOuIGxhIGplbnRyYWRlICVkIHN1bCBkaXNwb3NpdMOuZiAlcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5vIHNpIMOoIHJpdsOidHMgYSBjYW1iacOiIGlsIHN0w6J0IGRpIGNpZGluIHBhbCBkaXNwb3NpdMOuZiAnJXMnLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIk5vIHNpIMOoIHJpdsOidHMgYSBhc3NlZ27DoiBsYSBtZW1vcmllIGRvbWFuZGFkZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiSWwgY29udmVydGlkw7RyIHN1bCBkaXNwb3NpdMOuZiAlcyBub2wgw6AgZm9ybcOidHMgZGkgamVudHJhZGUgc3VwdWFydMOidHMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIklsIGNvbnZlcnRpZMO0ciBzdWwgZGlzcG9zaXTDrmYgJXMgbm9sIMOgIGZvcm3DonRzIGRpIGplc3N1ZGUgc3VwdWFydMOidHMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIklsIGNvZGlmaWNhZMO0ciBzdWwgZGlzcG9zaXTDrmYgJXMgbm9sIMOgIGZvcm3DonRzIGRpIGplbnRyYWRlIHN1cHVhcnTDonRzIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiSWwgY29kaWZpY2Fkw7RyIHN1bCBkaXNwb3NpdMOuZiAlcyBub2wgw6AgZm9ybcOidHMgZGkgamVzc3VkZSBzdXB1YXJ0w6J0cyIKKworbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIkltcHVzc2liaWwgcHJvY2Vzc8OiIGZvdG9ncmFtLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyJFcsO0ciB0YWwgb3RpZ27DriBsaXMgZnVuemlvbmFsaXTDonRzIHBhbCBkaXNwb3NpdMOuZiAnJXMnOiBub2wgw6ggdW4gZHJpdmVyICIKKyJ2NGwyLiBDb250cm9sZSBzZSBhbCDDqCB1biBkcml2ZXIgdjRsMS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICJObyBzaSDDqCByaXbDonRzIGEgaW50ZXJvZ8OiIGkgYXRyaWLDu3RzIGRpIGplbnRyYWRlICVkIHRhbCBkaXNwb3NpdMOuZiAlcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiTm8gc2kgw6ggcml2w6J0cyBhIG90aWduw64gbGEgaW1wb3N0YXppb24gZGFsIHNpbnRvbml6YWTDtHIgJWQgc3VsIGRpc3Bvc2l0w65mICIKKyInJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5vIHNpIMOoIHJpdsOidHMgYSBpbnRlcm9nw6IgbGEgbm9ybWUgc3VsIGRpc3Bvc2l0w65mICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJObyBzaSDDqCByaXbDonRzIGEgdsOqIGkgYXRyaWLDu3RzIGRhaSBjb250cm9pIHN1bCBkaXNwb3NpdMOuZiAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJJbXB1c3NpYmlsIGlkZW50aWZpY8OiIGlsIGRpc3Bvc2l0w65mICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkNoZXN0IG5vbCDDqCB1biBkaXNwb3NpdMOuZiAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIkltcHVzc2liaWwgdmllcnppIGlsIGRpc3Bvc2l0w65mICclcycgcGFyIGxlaSBlIHNjcml2aS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICJJbCBkaXNwb3NpdMOuZiAnJXMnIG5vbCDDqCB1biBkaXNwb3NpdMOuZiBkaSBjYXR1cmUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICJJbCBkaXNwb3NpdMOuZiAnJXMnIG5vbCDDqCB1biBkaXNwb3NpdMOuZiBkaSBqZXNzdWRlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiSWwgZGlzcG9zaXTDrmYgJyVzJyBub2wgw6ggdW4gZGlzcG9zaXTDrmYgTTJNLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJObyBzaSDDqCByaXbDonRzIGEgc3RhYmlsw64gbGEgbm9ybWUgcGFsIGRpc3Bvc2l0w65mICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIk5vIHNpIMOoIHJpdsOidHMgYSBvdGlnbsOuIGxhIGZyZWN1ZW5jZSBhdHXDomwgZGFsIHNpbnRvbml6YWTDtHIgcGFsIGRpc3Bvc2l0w65mICIKKyInJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisiTm8gc2kgw6ggcml2w6J0cyBhIG1ldGkgbGEgZnJlY3VlbmNlIGF0dcOibCBkYWwgc2ludG9uaXphZMO0ciBwYWwgZGlzcG9zaXTDrmYgIgorIiclcycgYSAlbHUgSHouIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5vIHNpIMOoIHJpdsOidHMgYSB2w6ogbGEgZnVhcmNlIGRhbCBzZWduw6JsIHBhbCBkaXNwb3NpdMOuZiAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTm8gc2kgw6ggcml2w6J0cyBhIHbDqiBpbCB2YWzDtHIgcGFsIGNvbnRyb2wgJWQgc3VsIGRpc3Bvc2l0w65mICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJObyBzaSDDqCByaXbDonRzIGEgbWV0aSBpbCB2YWzDtHIgJWQgcGFsIGNvbnRyb2wgJWQgc3VsIGRpc3Bvc2l0w65mICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiTm8gc2kgw6ggcml2w6J0cyBhIHbDqiBsYSBqZW50cmFkZSBhdHXDomwgc3VsIGRpc3Bvc2l0w65mICclcycuIEFsIHBvZGFyw6hzIGplc3NpICIKKyJ1biBkaXNwb3NpdMOuZiByYWRpbyIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiTm8gc2kgw6ggcml2w6J0cyBhIHbDqiBsYSBqZXNzdWRlIGF0dcOibCBzdWwgZGlzcG9zaXTDrmYgJyVzJy4gQWwgcG9kYXLDqHMgamVzc2kgIgorInVuIGRpc3Bvc2l0w65mIHJhZGlvIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIk5vIHNpIMOoIHJpdsOidHMgYSBzdGFiaWzDriBsYSBqZXNzdWRlICVkIHN1bCBkaXNwb3NpdMOuZiAlcy4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICJJbCBjYW1iacOiIGxhIHJpc29sdXppb24gZGlsdW5jIGxhIHZvcmUgbm9sIMOoIGFuY2plbcOyIHN1cHVhcnTDonQuIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICJJbXB1c3NpYmlsIG9wZXLDoiBjZW5jZSB1biBvcmxvaSIKZGlmZiAtLWdpdCBhL3BvL2dsLnBvIGIvcG8vZ2wucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzNTBlMAotLS0gL2Rldi9udWxsCisrKyBiL3BvL2dsLnBvCkBAIC0wLDAgKzEsOTEzIEBACisjIEdhbGljaWFuIHRyYW5zbGF0aW9uIG9mIGdzdC1wbHVnaW5zLWdvb2QuCisjIENvcHlyaWdodCAoQykgMjAwOSBnc3QtcGx1Z2lucy1nb29kJ3MgQ09QWVJJR0hUIEhPTERFUgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ3N0LXBsdWdpbnMtZ29vZCBwYWNrYWdlLgorIyBGcmFuIERpw6lndWV6IDxmcmFuZGllZ3VlekB1YnVudHUuY29tPiwgMjAwOSwgMjAxMCwgMjAxMS4KKyMgRnJhbiBEaWVndWV6IDxmcmFuZGllZ3VlekBnbm9tZS5vcmc+LCAyMDEyLgorbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZCAxLjAuM1xuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDEyLTEyLTE1IDAzOjQ2KzAyMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEZyYW4gRGllZ3VleiA8ZnJhbmRpZWd1ZXpAdWJ1bnR1LmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBHYWxpY2lhbiA8cHJveGVjdG9AdHJhc25vLm5ldD5cbiIKKyJMYW5ndWFnZTogZ2xcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD0obiAhPSAxKTtcbiIKKyJYLUdlbmVyYXRvcjogVmlydGFhbCAwLjcuMVxuIgorIlgtUHJvamVjdC1TdHlsZTogZ25vbWVcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICJQcm9kdWNpdXNlIHVuIGVycm8gYW8gZGVzY29kaWZpY2FyIGEgaW1heGUgSlBFRyIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiwqslc8K7IHBvciDCqyVzwrsiCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIk5vbiBmb2kgcG9zw61iZWwgY29uZWN0YXJzZSBhbyBzZXJ2aWRvciIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJObyBleGlzdGUgdW4gVVJMIGVzdGFiZWxlY2lkby4iCisKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIk5vbiBmb2kgcG9zw61iZWwgcmVzb2x2ZXIgbyBub21lIGRvIHNlcnZpZG9yLiIKKworbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICJOb24gZm9pIHBvc8OtYmVsIGVzdGFiZWxlY2VyIGEgY29uZXhpw7NuIGNvIHNlcnZpZG9yLiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIlByb2R1Y2l1c2UgdW4gZmFsbG8gZGUgY29uZmlndXJhY2nDs24gZGEgY29uZXhpw7NuIHNlZ3VyYS4iCisKKyMsIGZ1enp5Cittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorIlByb2R1Y2l1c2UgdW4gZXJybyBkZSByZWRlIG91IG8gc2Vydmlkb3IgcGVjaG91IGEgY29uZXhpw7NuIGRlIGZvcm1hICIKKyJpbmVzcGVyYWRhLiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiTyBzZXJ2aWRvciBlbnZpb3UgZGF0b3MgZXJyw7NuZW9zLiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICJPIHNlcnZpZG9yIG5vbiBhZG1pdGUgYSBidXNjYS4iCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIk8gYXVkaW8gbm9uIGV4aXN0ZSBvdSBub24gw6kgdsOhbGlkbywgbyBmbHV4byBBVkkgZXN0w6EgY29ycm9tcGlkby4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIkVzdGUgZmljaGVpcm8gbm9uIGNvbnTDqW4gbmluZ8O6biBmbHV4byByZXByb2R1Y8OtYmVsLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRXN0ZSBmaWNoZWlybyDDqSBpbmNvcnJlY3RvIGUgbm9uIHBvZGUgcmVwcm9kdWNpcnNlLiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkVzdGUgZmljaGVpcm8gZXN0w6EgZGFuYWRvIGUgbm9uIHBvZGUgcmVwcm9kdWNpcnNlLiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiVGFtYcOxbyBhdG9tIG5vbiB2w6FsaWRvLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRXN0ZSBmaWNoZWlybyBlc3TDoSBpbmNvbXBsZXRvIGUgbm9uIHBvZGUgcmVwcm9kdWNpcnNlLiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiRXN0ZSB2w61kZW8gbmVzdGUgZmljaGVpcm8gcG9kZXLDrWEgbm9uIHJlcHJvZHVjaXJzZSBjb3JyZWN0YW1lbnRlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICIiCisiRXN0ZSBmaWNoZWlybyBjb250w6luIGRlbWFzaWFkb3MgZmx1eG9zLiBTw7Mgc2UgcmVwcm9kdWNpcsOhIG8gcHJpbWVpcm8gJWQiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorIk5vbiBzZSBlbmNvbnRyb3UgdW4gZmx1eG8gY29tcGF0w61iZWwuIFBvZGUgcXVlIG5lY2VzaXRlIGluc3RhbGFyIHVuaGEgIgorImV4dGVuc2nDs24gUlRTUCBkZSBHU3RyZWFtZXIgcGFyYSBvcyBmb3JtYXRvcyBkZSBmbHV4byBSZWFsLiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorIk5vbiBzZSBlbmNvbnRyb3UgdW4gZmx1eG8gY29tcGF0w61iZWwuIFBvZGUgcXVlIG5lY2VzaXRlIHBlcm1pdGlyIG3DoWlzICIKKyJwcm90b2NvbG9zIGRlIHRyYW5zcG9ydGUgb3UgZGUgb3V0cmEgZm9ybWEgcG9kZSBxdWUgbGxlIGZhbHRlIGEgZXh0ZW5zacOzbiAiCisiY29ycmVjdGEgZGUgUlRTUCBkZSBHU3RyZWFtZXIuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIk5vbiBmb2kgcG9zw61iZWwgYWJyaXIgbyBkaXNwb3NpdGl2byBkZSBzb24gcGFyYSBhIHJlcHJvZHVjacOzbi4gTyBkaXNwb3NpdGl2byAiCisiZXN0w6Egc2VuZG8gZW1wcmVnYWRvIHBvciBvdXRybyBhcGxpY2F0aXZvLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiTm9uIGZvaSBwb3PDrWJlbCBhYnJpciBvIGRpc3Bvc2l0aXZvIGRlIHNvbi4gVm9zdGVkZSBub24gdGVuIHBlcm1pc29zIHBhcmEgIgorImFicmlyIG8gZGlzcG9zaXRpdm8uIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIk5vbiBmb2kgcG9zw61iZWwgYWJyaXIgbyBkaXNwb3NpdGl2byBkZSBzb24gcGFyYSBhIHJlcHJvZHVjacOzbi4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisiTm9uIGZvaSBwb3PDrWJlbCBhYnJpciBvIGRpc3Bvc2l0aXZvIGRlIHNvbiBwYXJhIGEgcmVwcm9kdWNpw7NuLiBFc3RhIHZlcnNpw7NuICIKKyJkbyBPcGVuIFNvdW5kIFN5c3RlbSBub24gZXN0w6EgYWRtaXRpZGEgcG9yIGVzdGUgZWxlbWVudG8uIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkVzdGUgZGlzcG9zaXRpdm8gZGUgc29uIG5vbiBhZG1pdGUgYSByZXByb2R1Y2nDs24uIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICJFcnJvIGRlIHJlcHJvZHVjacOzbiBkZSBzb24uIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJFc3RlIGRpc3Bvc2l0aXZvIGRlIHNvbiBub24gYWRtaXRlIGEgZ3JhdmFjacOzbi4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJFcnJvIGFvIGdyYXZhciBkbyBkaXNwb3NpdGl2byBkZSBzb24uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiTm9uIGZvaSBwb3PDrWJlbCBhYnJpciBvIGRpc3Bvc2l0aXZvIGRlIHNvbiBwYXJhIGEgZ3JhdmFjacOzbi4gVm9zdGVkZSBub24gdGVuICIKKyJwZXJtaXNvcyBwYXJhIGFicmlyIG8gZGlzcG9zaXRpdm8uIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICJOb24gZm9pIHBvc8OtYmVsIGFicmlyIG8gZGlzcG9zaXRpdm8gZGUgc29uIHBhcmEgYSBncmF2YWNpw7NuLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIiIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIk9yaXhlIGRhIGdyYXZhY2nDs24iCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICJNaWNyw7Nmb25vIgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAiTGnDsWEgZGUgZW50cmFkYSIKKworbXNnaWQgIkludGVybmFsIENEIgorbXNnc3RyICJDRCBpbnRlcm5vIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIkVudHJhZGEgU1BESUYiCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiRW50cmFkYSBBVVggMSIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJFbnRyYWRhIEFVWCAyIgorCisjLCBmdXp6eQorbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICJCdWNsZSBsb2NhbCIKKworIywgZnV6enkKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgIkJ1Y2xlIGxvY2FsIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJWb2x1bWUiCisKK21zZ2lkICJHYWluIgorbXNnc3RyICJHYW5hbmNpYSIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIk1vbml0b3IiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJBbHRvZmFsYW50ZSBpbnRlcm5vIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICJDYXNjb3MiCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiTGnDsWEgZGUgc2HDrWRhIgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICJTYcOtZGEgU1BESUYiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIlNhw61kYSBBVVggMSIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiU2HDrWRhIEFVWCAyIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlByb2R1Y2l1c2UgdW4gZXJybyBhbyBsZXIgJWQgYnl0ZXMgZGVzZGUgbyBkaXNwb3NpdGl2byDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisiUHJvZHVjaXVzZSB1biBmYWxsbyBhbyBlbnVtZXJhciBvcyBmb3JtYXRvcyBkZSB2w61kZW8gcG9zw61iZWlzIGNvcyBxdWUgbyAiCisiZGlzcG9zaXRpdm8gwqslc8K7IHBvZGUgcmVwcm9kdWNpciIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiTm9uIGZvaSBwb3PDrWJlbCBtYXBlYXIgb3MgYsO6ZmVyZXMgZG8gZGlzcG9zaXRpdm8gwqslc8K7IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICJPIGNvbnRyb2xhZG9yIGRvIGRpc3Bvc2l0aXZvIMKrJXPCuyBub24gYWRtaXRlIG8gbcOpdG9kbyBJTyAlZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIiIKKyJPIGNvbnRyb2xhZG9yIGRvIGRpc3Bvc2l0aXZvIMKrJXPCuyBub24gYWRtaXRlIGNhbHF1ZXJhIG3DqXRvZG8gSU8gY2/DsWVjaWRvLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICJPIGRpc3Bvc2l0aXZvIMKrJXPCuyBlc3TDoSBvY3VwYWRvIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICJPIGRpc3Bvc2l0aXZvIMKrJXPCuyBub24gcG9kZSBjYXB0dXJhciBhICVkeCVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICJPIGRpc3Bvc2l0aXZvIMKrJXPCuyBub24gcG9kZSBjYXB0dXJhciBvIGZvcm1hdG8gZXNwZWNpZmljYWRvIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICJPIGRpc3Bvc2l0aXZvIMKrJXPCuyBub24gYWRtaXRlIGEgY2FwdHVyYSBkZSB2w61kZW8uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiTm9uIGZvaSBwb3PDrWJlbCBvYnRlciBvcyBwYXLDoW1ldHJvcyBwYXJhIG8gZGlzcG9zaXRpdm8gwqslc8K7IgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICIiCisiTyBkaXNwb3NpdGl2byBkZSB2w61kZW8gbm9uIGFjZXB0YSBhIG5vdmEgY29uZmlndXJhY2nDs24gZGUgdGF4YSBkZSBtYXJjb3MuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIiIKKyJPIGRpc3Bvc2l0aXZvIGRlIHbDrWRlbyBub24gYWNlcHRhIGEgbm92YSBjb25maWd1cmFjacOzbiBkZSB0YXhhIGRlIG1hcmNvcy4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIk8gY29udHJvbGFkb3IgZG8gZGlzcG9zaXRpdm8gwqslc8K7IG5vbiBhZG1pdGUgbyBtw6l0b2RvIElPICVkIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIk8gY29udHJvbGFkb3IgZG8gZGlzcG9zaXRpdm8gwqslc8K7IG5vbiBhZG1pdGUgbyBtw6l0b2RvIElPICVkIgorCisjLCBmdXp6eQorbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICJPIGRpc3Bvc2l0aXZvIGRlIHbDrWRlbyBub24gcG9kZSBjcmVhciB1biBwb29sIGRlIGLDumZlci4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICJPIGRpc3Bvc2l0aXZvIGRlIHbDrWRlbyBub24gcG9kZSBjcmVhciB1biBwb29sIGRlIGLDumZlci4iCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJQcm9kdWNpdXNlIHVuIGVycm8gYW8gb2J0ZXIgYXMgY29uZmlndXJhY2nDs25zIGRvIHNpbnRvbml6YWRvciAlZCBubyAiCisiZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJQcm9kdWNpdXNlIHVuIGVycm8gYW8gbGVyIGFzIGNhcGFjaWRhZGVzIHBhcmEgbyBkaXNwb3NpdGl2byDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiTyBkaXNwb3NpdGl2byDCqyVzwrsgbm9uIMOpIHVuIHNpbnRvbml6YWRvci4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJQcm9kdWNpdXNlIHVuIGZhbGxvIGFvIG9idGVyIGEgZW50cmFkYSBkbyByYWRpbyBubyBkaXNwb3NpdGl2byAlcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJQcm9kdWNpdXNlIHVuIGZhbGxvIGFvIGVzdGFiZWxlY2VyIGEgZW50cmFkYSAlZCBubyBkaXNwb3NpdGl2byAlcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJQcm9kdWNpdXNlIHVuIGVycm8gYW8gY2FtYmlhciBvIGVzdGFkbyBkZSBlbm11ZGVjaWRvIHBhcmEgbyBkaXNwb3NpdGl2byDCqyVzwrsuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJPIGNvbnRyb2xhZG9yIGRvIGRpc3Bvc2l0aXZvIMKrJXPCuyBub24gYWRtaXRlIG8gbcOpdG9kbyBJTyAlZCIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJPIGRpc3Bvc2l0aXZvIGRlIHbDrWRlbyBub24gYWNlcHRhIGEgbm92YSBjb25maWd1cmFjacOzbiBkZSB0YXhhIGRlIG1hcmNvcy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisiTyBkaXNwb3NpdGl2byBkZSB2w61kZW8gbm9uIGFjZXB0YSBhIG5vdmEgY29uZmlndXJhY2nDs24gZGUgdGF4YSBkZSBtYXJjb3MuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJPIGRpc3Bvc2l0aXZvIGRlIHbDrWRlbyBub24gYWNlcHRhIGEgbm92YSBjb25maWd1cmFjacOzbiBkZSB0YXhhIGRlIG1hcmNvcy4iCisKKyMsIGZ1enp5Cittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIlByb2R1Y2l1c2UgdW4gZXJybyBhbyBkZXNjb2RpZmljYXIgYSBpbWF4ZSBKUEVHIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisiUHJvZHVjaXVzZSB1biBlcnJvIGFvIG9idGVyIGFzIGNhcGFjaWRhZGVzIGRvIGRpc3Bvc2l0aXZvIMKrJXPCuzogTm9uIMOpIHVuICIKKyJjb250cm9sYWRvciB2NGwyLiBDb21wcm9iZSBzZSDDqSB1biBjb250cm9sYWRvciB2NGwxLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIiIKKyJQcm9kdWNpdXNlIHVuIGVycm8gYW8gY29uc3VsdGFyIG9zIGF0cmlidXRvcyBkZSBlbnRyYWRhICVkIG5vIGRpc3Bvc2l0aXZvICVzIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJQcm9kdWNpdXNlIHVuIGVycm8gYW8gY29uZmlndXJhciBvIHNpbnRvbml6YWRvciAlZCBubyBkaXNwb3NpdGl2byDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiUHJvZHVjaXVzZSB1biBlcnJvIGFvIGNvbnN1bHRhciBhIG5vcm1hIG5vIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJQcm9kdWNpdXNlIHVuIGVycm8gYW8gb2J0ZXIgb3MgYXRyaWJ1dG9zIGRlIGNvbnRyb2wgZG8gZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJOb24gZm9pIHBvc8OtYmVsIGlkZW50aWZpY2FyIG8gZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICJFc3RlIG5vbiDDqSB1biBkaXNwb3NpdGl2byDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiTm9uIGZvaSBwb3PDrWJlbCBhYnJpciBvIGRpc3Bvc2l0aXZvIMKrJXPCuyBwYXJhIGxlY3R1cmEgZSBlc2NyaXR1cmEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiTyBkaXNwb3NpdGl2byDCqyVzwrsgbm9uIMOpIHVuIGRpc3Bvc2l0aXZvIGRlIGNhcHR1cmEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICJPIGRpc3Bvc2l0aXZvIMKrJXPCuyBub24gw6kgdW4gZGlzcG9zaXRpdm8gZGUgY2FwdHVyYS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICJPIGRpc3Bvc2l0aXZvIMKrJXPCuyBub24gw6kgdW4gZGlzcG9zaXRpdm8gZGUgY2FwdHVyYS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJOb24gZm9pIHBvc8OtYmVsIGFicmlyIG8gZGlzcG9zaXRpdm8gwqslc8K7IHBhcmEgbGVjdHVyYSBlIGVzY3JpdHVyYS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlByb2R1Y2l1c2UgdW4gZmFsbG8gYW8gZXN0YWJlbGVjZXIgYSBub3JtYSBubyBkaXNwb3NpdGl2byDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIlByb2R1Y2l1c2UgdW4gZmFsbG8gIGFvIG9idGVyIGEgZnJlY3VlbmNpYSBhY3R1YWwgZG8gc2ludG9uaXphZG9yIHBhcmEgbyAiCisiZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisiUHJvZHVjaXVzZSB1biBlcnJvIGFvIGVzdGFiZWxlY2VyIGEgZnJlY3VlbmNpYSBhY3R1YWwgZG8gc2ludG9uaXphZG9yIHBhcmEgbyAiCisiZGlzcG9zaXRpdm8gwqslc8K7IGEgJWx1IEh6LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiUHJvZHVjaXVzZSB1biBlcnJvIGFvIG9idGVyIGEgcG90ZW5jaWEgZG8gc2luYWwgcGFyYSBvIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJQcm9kdWNpdXNlIHVuIGVycm8gYW8gb2J0ZXIgbyB2YWxvciBwYXJhIG8gY29udHJvbCAlZCBkbyBkaXNwb3NpdGl2byDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiUHJvZHVjaXVzZSB1biBmYWxsbyBhbyBlc3RhYmVsZWNlciBvIHZhbG9yICVkcyBwYXJhIG8gY29udHJvbCAlZCBkbyAiCisiZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIlByb2R1Y2l1c2UgdW4gZmFsbG8gYW8gb2J0ZXIgYSBlbnRyYWRhIGFjdHVhbCBubyBkaXNwb3NpdGl2byDCqyVzwrsuIENpY8OhaXMgIgorInNleGEgdW4gZGlzcG9zaXRpdm8gZGUgcmFkaW8uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJQcm9kdWNpdXNlIHVuIGZhbGxvIGFvIG9idGVyIGEgZW50cmFkYSBhY3R1YWwgbm8gZGlzcG9zaXRpdm8gwqslc8K7LiBRdWl6YWlzICIKKyJzZXhhIHVuIGRpc3Bvc2l0aXZvIGRlIHJhZGlvIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIlByb2R1Y2l1c2UgdW4gZmFsbG8gYW8gZXN0YWJlbGVjZXIgYSBzYcOtZGEgJWQgbm8gZGlzcG9zaXRpdm8gJXMuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiQcOtbmRhIG5vbiBzZSBhZG1pdGUgbyBjYW1iaW8gZGUgcmVzb2x1Y2nDs24gZHVyYW50ZSBhIHJlcHJvZHVjacOzbi4iCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIk5vbiDDqSBwb3PDrWJlbCBvcGVyYXIgc2VuIHJlbG94byIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAiUHJvZHVjaXVzZSB1biBlcnJvIG5vIGZsdXhvIGRlIGRhdG9zIGludGVybm8uIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAiUHJvZHVjaXVzZSB1biBlcnJvIGludGVybm8gbm8gZmx1eG8gZGUgZGF0b3MuIgorCisjfiBtc2dpZCAiRGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBjYXB0dXJlIgorI34gbXNnc3RyICJPIGRpc3Bvc2l0aXZvIMKrJXPCuyBub24gYWRtaXRlIGEgY2FwdHVyYSBkZSB2w61kZW8uIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNvdW5kIHNlcnZlciIKKyN+IG1zZ3N0ciAiTm9uIGZvaSBwb3PDrWJlbCBlc3RhYmVsZWNlciBhIGNvbmV4acOzbiBjbyBzZXJ2aWRvciBkZSBzb24iCisKKyN+IG1zZ2lkICJGYWlsZWQgdG8gcXVlcnkgc291bmQgc2VydmVyIGNhcGFiaWxpdGllcyIKKyN+IG1zZ3N0ciAiUHJvZHVjaXVzZSB1biBlcnJvIGFvIGNvbnN1bHRhciBhcyBjYXBhY2lkYWRlcyBkbyBzZXJ2aWRvciBkZSBzb24iCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICJCYWl4b3MiCisKKyN+IG1zZ2lkICJUcmVibGUiCisjfiBtc2dzdHIgIkFndWRvcyIKKworI34gbXNnaWQgIlN5bnRoIgorI34gbXNnc3RyICJTaW50ZXRpemFkb3IiCisKKyN+IG1zZ2lkICJQQ00iCisjfiBtc2dzdHIgIlBDTSIKKworI34gbXNnaWQgIlNwZWFrZXIiCisjfiBtc2dzdHIgIkFsdG9mYWxhbnRlIgorCisjfiBtc2dpZCAiTGluZS1pbiIKKyN+IG1zZ3N0ciAiTGnDsWEgZGUgZW50cmFkYSIKKworI34gbXNnaWQgIkNEIgorI34gbXNnc3RyICJDRCIKKworI34gbXNnaWQgIk1peGVyIgorI34gbXNnc3RyICJNaXN0dXJhZG9yIgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIlBDTS0yIgorCisjfiBtc2dpZCAiUmVjb3JkIgorI34gbXNnc3RyICJHcmF2YXIiCisKKyN+IG1zZ2lkICJJbi1nYWluIgorI34gbXNnc3RyICJHYW5hbmNpYSBkZSBlbnRyYWRhIgorCisjfiBtc2dpZCAiT3V0LWdhaW4iCisjfiBtc2dzdHIgIkdhbmFuY2lhIGRlIHNhw61kYSIKKworI34gbXNnaWQgIkxpbmUtMSIKKyN+IG1zZ3N0ciAiTGnDsWEgMSIKKworI34gbXNnaWQgIkxpbmUtMiIKKyN+IG1zZ3N0ciAiTGnDsWEgMiIKKworI34gbXNnaWQgIkxpbmUtMyIKKyN+IG1zZ3N0ciAiTGnDsWEgMyIKKworI34gbXNnaWQgIkRpZ2l0YWwtMSIKKyN+IG1zZ3N0ciAiRGl4aXRhbCAxIgorCisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICJEaXhpdGFsIDIiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTMiCisjfiBtc2dzdHIgIkRpeGl0YWwgMyIKKworI34gbXNnaWQgIlBob25lLWluIgorI34gbXNnc3RyICJFbnRyYWRhIHRlbMOpZm9ubyIKKworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAiU2HDrWRhIHRlbMOpZm9ubyIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICJWw61kZW8iCisKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAiUmFkaW8iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIgorI34gbXNnc3RyICIiCisjfiAiTm9uIGZvaSBwb3PDrWJlbCBhYnJpciBvIGRpc3Bvc2l0aXZvIGRlIHNvbiBwYXJhIGEgc8O6YSB4ZXN0acOzbiBwb2xvICIKKyN+ICJjb250cm9sIGRlIG1pc3R1cmFkby4iCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJOb24gZm9pIHBvc8OtYmVsIGFicmlyIG8gZGlzcG9zaXRpdm8gZGUgc29uIHBhcmEgYSBzw7phIHhlc3Rpw7NuIHBvbG8gIgorI34gImNvbnRyb2wgZGUgbWlzdHVyYWRvLiBFc3RlIGVsZW1lbnRvIG5vbiBhZG1pdGUgZXN0YSB2ZXJzacOzbiBkbyBPcGVuIFNvdW5kICIKKyN+ICJTeXN0ZW0uIgorCisjfiBtc2dpZCAiTWFzdGVyIgorI34gbXNnc3RyICJNZXN0cmUiCisKKyN+IG1zZ2lkICJGcm9udCIKKyN+IG1zZ3N0ciAiRnJvbnRhbCIKKworI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIlRyZXNlaXJvIgorCisjfiBtc2dpZCAiSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiQXVyaWN1bGFyZXMiCisKKyN+IG1zZ2lkICJDZW50ZXIiCisjfiBtc2dzdHIgIkNlbnRybyIKKworI34gbXNnaWQgIkxGRSIKKyN+IG1zZ3N0ciAiTEZFIgorCisjfiBtc2dpZCAiU3Vycm91bmQiCisjfiBtc2dzdHIgIkVudm9sdmVudGUiCisKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICJMYXRlcmFsIgorCisjfiBtc2dpZCAiQVVYIE91dCIKKyN+IG1zZ3N0ciAiU2HDrWRhIEFVWCIKKworI34gbXNnaWQgIjNEIERlcHRoIgorI34gbXNnc3RyICJQcm9mdW5kaWRhZGUgM0QiCisKKyN+IG1zZ2lkICIzRCBDZW50ZXIiCisjfiBtc2dzdHIgIkNlbnRybyAzRCIKKworI34gbXNnaWQgIjNEIEVuaGFuY2UiCisjfiBtc2dzdHIgIk1lbGxvcmEgM0QiCisKKyN+IG1zZ2lkICJUZWxlcGhvbmUiCisjfiBtc2dzdHIgIlRlbMOpZm9ubyIKKworI34gbXNnaWQgIlZpZGVvIEluIgorI34gbXNnc3RyICJFbnRyYWRhIGRlIHbDrWRlbyIKKworI34gbXNnaWQgIkFVWCBJbiIKKyN+IG1zZ3N0ciAiRW50cmFkYSBBVVgiCisKKyN+IG1zZ2lkICJSZWNvcmQgR2FpbiIKKyN+IG1zZ3N0ciAiR2FuYW5jaWEgZGUgZ3JhdmFjacOzbiIKKworI34gbXNnaWQgIk91dHB1dCBHYWluIgorI34gbXNnc3RyICJHYW5hbmNpYSBkZSBzYcOtZGEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEJvb3N0IgorI34gbXNnc3RyICJBdW1lbnRvIGRvIG1pY3LDs2Zvbm8iCisKKyN+IG1zZ2lkICJEaWFnbm9zdGljIgorI34gbXNnc3RyICJEaWFnbsOzc3RpY28iCisKKyN+IG1zZ2lkICJCYXNzIEJvb3N0IgorI34gbXNnc3RyICJBdW1lbnRvIGRlIGJhaXhvcyIKKworI34gbXNnaWQgIlBsYXliYWNrIFBvcnRzIgorI34gbXNnc3RyICJQb3J0b3MgZGUgcmVwcm9kdWNpw7NuIgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIkVudHJhZGEiCisKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTW9uaXRvciBkZSBvcml4ZSIKKworI34gbXNnaWQgIktleWJvYXJkIEJlZXAiCisjfiBtc2dzdHIgIlBpdGlkbyBkZSB0ZWNsYWRvIgorCisjfiBtc2dpZCAiU2ltdWxhdGUgU3RlcmVvIgorI34gbXNnc3RyICJTaW11bGFyIGVzdMOpcmVvIgorCisjfiBtc2dpZCAiU3RlcmVvIgorI34gbXNnc3RyICJFc3TDqXJlbyIKKworI34gbXNnaWQgIlN1cnJvdW5kIFNvdW5kIgorI34gbXNnc3RyICJTb24gZW52b2x2ZW50ZSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKKyN+IG1zZ3N0ciAiR2FuYW5jaWEgZG8gbWljcsOzZm9ubyIKKworI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICJBbHRvZmFsYW50ZSBkZSBvcml4ZSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgU291cmNlIgorI34gbXNnc3RyICJNaWNyw7Nmb25vIGRlIG9yaXhlIgorCisjfiBtc2dpZCAiSmFjayIKKyN+IG1zZ3N0ciAiSmFjayIKKworI34gbXNnaWQgIkNlbnRlciAvIExGRSIKKyN+IG1zZ3N0ciAiQ2VudHJvIC8gTEZFIgorCisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAiTWlzdHVyYWRvciBlc3TDqXJlbyIKKworI34gbXNnaWQgIk1vbm8gTWl4IgorI34gbXNnc3RyICJNaXN0dXJhZG9yIG1vbm8iCisKKyN+IG1zZ2lkICJJbnB1dCBNaXgiCisjfiBtc2dzdHIgIk1pc3R1cmFkb3IgZGUgZW50cmFkYSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAiTWljcsOzZm9ubyAxIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICJNaWNyw7Nmb25vIDIiCisKKyN+IG1zZ2lkICJEaWdpdGFsIE91dCIKKyN+IG1zZ3N0ciAiU2HDrWRhIGRpeGl0YWwiCisKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICJFbnRyYWRhIGRpeGl0YWwiCisKKyN+IG1zZ2lkICJIRE1JIgorI34gbXNnc3RyICJIRE1JIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgIk3Ds2RlbSIKKworI34gbXNnaWQgIkhhbmRzZXQiCisjfiBtc2dzdHIgIkF1cmljdWxhcmVzIgorCisjfiBtc2dpZCAiT3RoZXIiCisjfiBtc2dzdHIgIk91dHJvIgorCisjfiBtc2dpZCAiTm9uZSIKKyN+IG1zZ3N0ciAiTmluZ8O6biIKKworI34gbXNnaWQgIk9uIgorI34gbXNnc3RyICJBY2VuZGlkbyIKKworI34gbXNnaWQgIk9mZiIKKyN+IG1zZ3N0ciAiQXBhZ2FkbyIKKworI34gbXNnaWQgIk11dGUiCisjfiBtc2dzdHIgIlNpbGVuY2lhciIKKworI34gbXNnaWQgIkZhc3QiCisjfiBtc2dzdHIgIlLDoXBpZG8iCisKKyN+IG1zZ2lkICJWZXJ5IExvdyIKKyN+IG1zZ3N0ciAiTW9pIGJhaXhvIgorCisjfiBtc2dpZCAiTG93IgorI34gbXNnc3RyICJCYWl4byIKKworI34gbXNnaWQgIk1lZGl1bSIKKyN+IG1zZ3N0ciAiTWVkaW8iCisKKyN+IG1zZ2lkICJIaWdoIgorI34gbXNnc3RyICJBbHRvIgorCisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICJNb2kgYWx0byIKKworI34gbXNnaWQgIlByb2R1Y3Rpb24iCisjfiBtc2dzdHIgIlByb2R1Y2nDs24iCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICJNaWNyw7Nmb25vIGRvIHBhbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIEluIgorI34gbXNnc3RyICJFbnRyYWRhIGRvIHBhbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBIZWFkcGhvbmVzIgorI34gbXNnc3RyICJBdXJpY3VsYXJlcyBkbyBwYW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBPdXQiCisjfiBtc2dzdHIgIlNhw61kYSBkbyBwYW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RhZG9yIHZlcmRlIgorCisjfiBtc2dpZCAiUGluayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdGFkb3Igcm9zYSIKKworI34gbXNnaWQgIkJsdWUgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RhZG9yIGF6dWwiCisKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdGFkb3IgYnJhbmNvIgorCisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RhZG9yIG5lZ3JvIgorCisjfiBtc2dpZCAiR3JheSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdGFkb3IgZ3JpcyIKKworI34gbXNnaWQgIk9yYW5nZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdGFkb3IgbGFyYW54YSIKKworI34gbXNnaWQgIlJlZCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdGFkb3IgdmVybWVsbG8iCisKKyN+IG1zZ2lkICJZZWxsb3cgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RhZG9yIGFtYXJlbG8iCisKKyN+IG1zZ2lkICJHcmVlbiBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdGFkb3IgdmVyZGUgZG8gcGFuZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIlBpbmsgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RhZG9yIHJvc2EgZG8gcGFuZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIkJsdWUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RhZG9yIGF6dWwgZG8gcGFuZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIldoaXRlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0YWRvciBicmFuY28gZG8gcGFuZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIkJsYWNrIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0YWRvciBuZWdybyBkbyBwYW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiR3JheSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdGFkb3IgZ3JpcyBkbyBwYW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiT3JhbmdlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0YWRvciBsYXJhbnhhZG8gcGFuZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIlJlZCBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdGFkb3IgdmVybWVsbG8gZG8gcGFuZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIlllbGxvdyBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdGFkb3IgYW1hcmVsbyBkbyBwYW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiU3ByZWFkIE91dHB1dCIKKyN+IG1zZ3N0ciAiRXhwYW5kaXIgc2HDrWRhIgorCisjfiBtc2dpZCAiRG93bm1peCIKKyN+IG1zZ3N0ciAiUmVkdWNpw7NuIGRlIGNhbmxlcyIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgSW5wdXQiCisjfiBtc2dzdHIgIkVudHJhZGEgZG8gbWlzdHVyYWRvciB2aXJ0dWFsIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBPdXRwdXQiCisjfiBtc2dzdHIgIlNhw61kYSBkbyBtaXN0dXJhZG9yIHZpcnR1YWwiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIENoYW5uZWxzIgorI34gbXNnc3RyICJDYW5sZXMgZG8gbWlzdHVyYWRvciB2aXJ0dWFsIgorCisjfiBtc2dpZCAiJXMgJWQgRnVuY3Rpb24iCisjfiBtc2dzdHIgIkZ1bmNpw7NuICVzICVkIgorCisjfiBtc2dpZCAiJXMgRnVuY3Rpb24iCisjfiBtc2dzdHIgIkZ1bmNpw7NuICVzIgorCisjfiBtc2dpZCAiR290IHVuZXhwZWN0ZWQgZnJhbWUgc2l6ZSBvZiAldSBpbnN0ZWFkIG9mICV1LiIKKyN+IG1zZ3N0ciAiT2J0w612b3NlIHVuIHRhbWHDsW8gZGUgbWFyY28gZGUgJXUgbm9uIGVzcGVyYWRvIG5vIGx1Z2FyIGRlICV1LiIKKworI34gbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgb24gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJQcm9kdWNpdXNlIHVuIGVycm8gYW8gbGVyICVkIGJ5dGVzIGRvIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZW5xdWV1ZSBidWZmZXJzIGluIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiTm9uIMOpIHBvc8OtYmVsIG1ldGVyIG5hIGNvbGEgb3MgYsO6ZmVyZXMgbm8gZGlzcG9zaXRpdm8gwqslc8K7LiIKKworI34gbXNnaWQgIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiIgorI34gIlByb2R1Y2l1c2UgdW4gZmFsbG8gYW8gdGVudGFyIG9idGVyIGNhZHJvcyBkZSB2w61kZW8gZG8gZGlzcG9zaXRpdm8gwqslc8K7LiIKKworI34gbXNnaWQgIkZhaWxlZCBhZnRlciAlZCB0cmllcy4gZGV2aWNlICVzLiBzeXN0ZW0gZXJyb3I6ICVzIgorI34gbXNnc3RyICIiCisjfiAiUHJvdWNpdXNlIHVuIGZhbGxvIGRlc3BvaXMgZGUgJWQgaW50ZW50b3MuIERpc3Bvc2l0aXZvICVzLiBFcnJvciBkbyAiCisjfiAic2lzdGVtYTogJXMiCisKKyN+IG1zZ2lkICJEZXNjcmliZXMgdGhlIHNlbGVjdGVkIGlucHV0IGVsZW1lbnQuIgorI34gbXNnc3RyICJEZXNjcmliZSBvIGVsZW1lbnRvIGRlIGVudHJhZGEgc2VsZWNjaW9uYWRvLiIKKworI34gbXNnaWQgIkRlc2NyaWJlcyB0aGUgc2VsZWN0ZWQgb3V0cHV0IGVsZW1lbnQgZm9yIEF1ZGlvL1ZpZGVvIENvbmZlcmVuY2luZy4iCisjfiBtc2dzdHIgIiIKKyN+ICJEZXNjcmliZSBvIGVsZW1lbnRvIGRlIHNhw61kYSBzZWxlY2Npb25hZG8gcGFyYSBhIENvbmZlcmVuY2lhIGRlIEF1ZGlvLyIKKyN+ICJWw61kZW8uIgorCisjfiBtc2dpZCAiRGVzY3JpYmVzIHRoZSBzZWxlY3RlZCBvdXRwdXQgZWxlbWVudCBmb3IgTXVzaWMgYW5kIE1vdmllcy4iCisjfiBtc2dzdHIgIiIKKyN+ICJEZXNjcmliZSBvIGVsZW1lbnRvIGRlIHNhw61kYSBzZWxlY2Npb25hZG8gcGFyYSBhIE3DunNpY2EgZSBQZWzDrWN1bGFzLiIKKworI34gbXNnaWQgIkRlc2NyaWJlcyB0aGUgc2VsZWN0ZWQgb3V0cHV0IGVsZW1lbnQuIgorI34gbXNnc3RyICJEZXNjcmliZSBvIGVsZW1lbnRvIGRlIHNhw61kYSBzZWxlY2Npb25hZG8uIgorCisjfiBtc2dpZCAiR1N0cmVhbWVyIGF1ZGlvc2luayBmb3IgQXVkaW8vVmlkZW8gQ29uZmVyZW5jaW5nIgorI34gbXNnc3RyICJHU3RyZWFtZXIgYXVkaW9zaW5rIHBhcmEgYSBDb25mZXJlbmNpYSBkZSBBdWRpby9WaWRlbyIKKworI34gbXNnaWQgIkdTdHJlYW1lciBhdWRpb3NpbmsgZm9yIE11c2ljIGFuZCBNb3ZpZXMiCisjfiBtc2dzdHIgIkdTdHJlYW1lciBhdWRpb3NpbmsgcGFyYSBNw7pzaWNhIGUgRmlsbWVzIgorCisjfiBtc2dpZCAiIgorI34gIkdTdHJlYW1lciBjYW4gcGxheSBhdWRpbyB1c2luZyBhbnkgbnVtYmVyIG9mIG91dHB1dCBlbGVtZW50cy4gU29tZSAiCisjfiAicG9zc2libGUgY2hvaWNlcyBhcmUgb3Nzc2luaywgZXNkc2luayBhbmQgYWxzYXNpbmsuIFRoZSBhdWRpb3NpbmsgY2FuIGJlICIKKyN+ICJhIHBhcnRpYWwgcGlwZWxpbmUgaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkdTdHJlYW1lciBwb2RlIHJlcHJvZHVjaXIgYXVkaW8gZW1wcmVnYW5kbyBjYWxxdWVyYSBuw7ptZXJvIGRlIGVsZW1lbnRvcyAiCisjfiAiZGUgc2HDrWRhLiBBbGd1bmhhIGVsZWNjacOzbiBwb3PDrWJlbCDDqSBvc3NpbmssIGVzZHNpbmsgZSBhbHNhc2luay4gTyAiCisjfiAiYXVkaW9zaW5rIHBvZGUgc2VyIHVuIHBpcGVsaW5lIHBhcmNpYWwgbm8gY2FuZG8gZGUgc8OzIHVuIGVsZW1lbnRvIMO6bmljby4iCisKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiBwbGF5IHZpZGVvIHVzaW5nIGFueSBudW1iZXIgb2Ygb3V0cHV0IGVsZW1lbnRzLiBTb21lICIKKyN+ICJwb3NzaWJsZSBjaG9pY2VzIGFyZSB4dmltYWdlc2luaywgeGltYWdlc2luaywgc2RsdmlkZW9zaW5rIGFuZCBhYXNpbmsuICIKKyN+ICJUaGUgdmlkZW9zaW5rIGNhbiBiZSBhIHBhcnRpYWwgcGlwZWxpbmUgaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkdTdHJlYW1lciBwb2RlIHJlcHJvZHVjaXIgdsOtZGVvIHVzYW5kbyBjYWxxdWVyYSBuw7ptZXJvIGRlIGVsZW1lbnRvcyBkZSAiCisjfiAic2HDrWRhLiBBcyBwb3PDrWJlaXMgZWxlY2Npw7NucyBzb24geHZpbWFnZXNpbmssIHhpbWFnZXNpbmssIHNkbHZpZGVvc2luayBlICIKKyN+ICJhYXNpbmsuIE8gdmlkZW9zaW5rIHBvZGUgc2VyIHVuIHBpcGVsaW5lIHBhcmNpYWwgbm8gbHVnYXIgZGUgdW4gZWxlbWVudG8gIgorI34gIsO6bmljby4iCisKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiBwdXQgdmlzdWFsaXphdGlvbiBwbHVnaW5zIGluIGEgcGlwZWxpbmUgdG8gdHJhbnNmb3JtIGF1ZGlvICIKKyN+ICJzdHJlYW0gaW4gdmlkZW8gZnJhbWVzLiBEZWZhdWx0IGlzIGdvb20gYnV0IG1vcmUgdmlzdWFsaXphdGlvbiBwbHVnaW5zICIKKyN+ICJ3aWxsIGJlIHBvcnRlZCBzb29uLiBUaGUgdmlzdWFsaXphdGlvbiBwbHVnaW4gY2FuIGJlIGEgcGFydGlhbCBwaXBlbGluZSAiCisjfiAiaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkdTdHJlYW1lciBwb2RlIHBvw7FlciBlbmdhZGlkb3MgZGUgdmlzdWFsaXphY2nDs24gbnVuIHBpcGVsaW5lIHBhcmEgIgorI34gInRyYW5zZm9ybWFyIHVuIGZsdXhvIGRlIGF1ZGlvIGVuIG1hcmNvcyBkZSB2w61kZW8uIFBvciBvbWlzacOzbiDDqSBnb29tIHBlcm8gIgorI34gInByb250byBjb252ZXJ0aXLDoW5zZSBtw6FpcyB2aXN1YWxpemFjacOzbnMuIE8gZW5nYWRpZG8gZGUgdmlzdWFsaXphY2nDs24gIgorI34gInBvZGUgc2VyIHVuIHBpcGVsaW5lIHBhcmNpYWwgbm8gbHVnYXIgZGUgc8OzIHVuIGVsZW1lbnRvLiIKKworI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHJlY29yZCBhdWRpbyB1c2luZyBhbnkgbnVtYmVyIG9mIGlucHV0IGVsZW1lbnRzLiBTb21lICIKKyN+ICJwb3NzaWJsZSBjaG9pY2VzIGFyZSBvc3NzcmMsIGVzZHNyYyBhbmQgYWxzYXNyYy4gVGhlIGF1ZGlvIHNvdXJjZSBjYW4gYmUgIgorI34gImEgcGFydGlhbCBwaXBlbGluZSBpbnN0ZWFkIG9mIGp1c3Qgb25lIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiR1N0cmVhbWVyIHBvZGUgZ3JhdmFyIGF1ZGlvIHVzYW5kbyBjYWxxdWVyYSBuw7ptZXJvIGRlIGVsZW1lbnRvcyBkZSAiCisjfiAiZW50cmFkYS4gQWxndW5oYXMgZGFzIHBvc8OtYmVpcyBlbGVjY2nDs25zIHNvbiBvc3NzcmMsIGVzZHNyYyBlIGFsc2FzcmMuIEEgIgorI34gIm9yaXhlIGRvIGF1ZGlvIHBvZGUgc2VyIHVuIHBpcGVsaW5lIHBhcmNpYWwgbm8gbHVnYXIgZGUgdW4gc8OzIGVsZW1lbnRvLiIKKworI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHJlY29yZCB2aWRlbyBmcm9tIGFueSBudW1iZXIgb2YgaW5wdXQgZWxlbWVudHMuIFNvbWUgIgorI34gInBvc3NpYmxlIGNob2ljZXMgYXJlIHY0bHNyYyBhbmQgdmlkZW90ZXN0c3JjLiBUaGUgdmlkZW8gc291cmNlIGNhbiBiZSBhICIKKyN+ICJwYXJ0aWFsIHBpcGVsaW5lIGluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJHU3RyZWFtZXIgcG9kZSBncmF2YXIgYXVkaW8gdXNhbmRvIGNhbHF1ZXJhIG7Dum1lcm8gZGUgZWxlbWVudG9zIGRlICIKKyN+ICJlbnRyYWRhLiBBbGd1bmhhcyBkYXMgcG9zw61iZWlzIGVsZWNjacOzbnMgc29uIHY0bHNyYyBlIHZpZGVvdGVzdHNyYy4gQSAiCisjfiAib3JpeGUgZG8gYXVkaW8gcG9kZSBzZXIgdW4gcGlwZWxpbmUgcGFyY2lhbCBubyBsdWdhciBkZSB1biBzw7MgZWxlbWVudG8uIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgYXVkaW8gc291cmNlIgorI34gbXNnc3RyICJvcml4ZSBkZSBzb24gZGUgR1N0cmVhbWVyIHByZWRlZmluaWRhIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgYXVkaW9zaW5rIgorI34gbXNnc3RyICJvcml4ZSBkbyBhdWRpb3NpbmsgR1N0cmVhbWVyIHByZWRlZmluaWRhIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgdmlkZW8gc291cmNlIgorI34gbXNnc3RyICJvcml4ZSBkbyB2w61kZW8gZGUgR1N0cmVhbWVyIHByZWRlZmluaWRvIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgdmlkZW9zaW5rIgorI34gbXNnc3RyICJ2aWRlb3NpbmsgZGUgR1N0cmVhbWVyIHByZWRlZmluaWRvIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgdmlzdWFsaXphdGlvbiBwbHVnaW4iCisjfiBtc2dzdHIgImVuZ2FkaWRvIGRlIHZpc3VhbGl6YWNpw7NuIEdTdHJlYW1lciBwcmVkZWZpbmlkbyIKKworI34gbXNnaWQgImRlc2NyaXB0aW9uIGZvciBHU3RyZWFtZXIgYXVkaW9zaW5rIGZvciBBdWRpby9WaWRlbyBDb25mZXJlbmNpbmciCisjfiBtc2dzdHIgIiIKKyN+ICJkZXNjcmljacOzbiBwYXJhIG8gYXVkaW9zaW5rIEdTdHJlYW1lciBwYXJhIGEgY29uZmVyZW5jaWEgZGUgYXVkaW8vdsOtZGVvIgorCisjfiBtc2dpZCAiZGVzY3JpcHRpb24gZm9yIEdTdHJlYW1lciBhdWRpb3NpbmsgZm9yIE11c2ljIGFuZCBNb3ZpZXMiCisjfiBtc2dzdHIgImRlc2NyaWNpw7NuIHBhcmEgbyBhdWRpb3NpbmsgZGUgR1N0cmVhbWVyIHBhcmEgTcO6c2ljYSBlIEZpbG1lcyIKKworI34gbXNnaWQgImRlc2NyaXB0aW9uIGZvciBkZWZhdWx0IEdTdHJlYW1lciBhdWRpb3NpbmsiCisjfiBtc2dzdHIgImRlc2NyaWNpw7NuIHBhcmEgbyBhdWRpb3NpbmsgZGUgR1N0cmVhbWVyIHByZWRlZmluaWRvIgorCisjfiBtc2dpZCAiZGVzY3JpcHRpb24gZm9yIGRlZmF1bHQgR1N0cmVhbWVyIGF1ZGlvc3JjIgorI34gbXNnc3RyICJkZXNjcmljacOzbiBwYXJhIG8gYXVkaW9zcmMgZGUgR1N0cmVhbWVyIHByZWRlZmluaWRvIgpkaWZmIC0tZ2l0IGEvcG8vaHIucG8gYi9wby9oci5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjg3YzE3Ci0tLSAvZGV2L251bGwKKysrIGIvcG8vaHIucG8KQEAgLTAsMCArMSw3ODYgQEAKKyMgVHJhbnNsYXRpb24gb2YgZ3N0LXBsdWdpbnMtZ29vZCB0byBDcm9hdGlhbi4KKyMgVGhpcyBmaWxlIGlzIHB1dCBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMKKyMgVG9taXNsYXYgS3J6bmFyIDx0b21pc2xhdi5rcnpuYXJAZ21haWwuY29tPiwgMjAxMi4KKyMgQm/FvmlkYXIgUHV0YW5lYyA8Ym96aWRhcnBAeWFob28uY29tPiwgMjAxNi4KK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QtMS4xMC4wXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTYtMTEtMTkgMTA6MjItMDgwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogQm/FvmlkYXIgUHV0YW5lYyA8Ym96aWRhcnBAeWFob28uY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IENyb2F0aWFuIDxsb2thbGl6YWNpamFAbGludXguaHI+XG4iCisiTGFuZ3VhZ2U6IGhyXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiWC1CdWdzOiBSZXBvcnQgdHJhbnNsYXRpb24gZXJyb3JzIHRvIHRoZSBMYW5ndWFnZS1UZWFtIGFkZHJlc3MuXG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0zOyBwbHVyYWw9KG4lMTA9PTEgJiYgbiUxMDAhPTExID8gMCA6IG4lMTA+PTIgJiYgbiIKKyIlMTA8PTQgJiYgKG4lMTAwPDEwIHx8IG4lMTAwPj0yMCkgPyAxIDogMik7XG4iCisiWC1HZW5lcmF0b3I6IFBvZWRpdCAxLjguNy4xXG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIuKAmEphY2vigJkgcG9zbHXFvml0ZWxqIG5pamUgcHJvbmHEkWVuIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICJOaWplIHVzcGplbG8gZGVrb2RpcmF0aSBKUEVHIHNsaWt1IgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICLigJglc+KAmSAo4oCYJXPigJkpIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJTcGFqYW5qZSBuYSBwb3NsdcW+aXRlbGogbmlqZSBtb2d1xIdlIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIlVSTCBhZHJlc2EgbmlqZSBpbWVub3ZhbmEuIgorCittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJOaWplIG1vZ3XEh2UgcmF6cmlqZcWhaXRpIGltZSBwb3NsdcW+aXRlbGphLiIKKworbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICJOaWplIG1vZ3XEh2UgdXNwb3N0YXZpdGkgdmV6dSBzIHBvc2x1xb5pdGVsamVtLiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIlVzcG9zdGF2bGphbmplIHNpZ3VybmUgdmV6ZSBuaWplIHVzcGplbG8uIgorCittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorIkRvZ29kaWxhIHNlIG1yZcW+bmEgZ3JlxaFrYSwgaWxpIGplIHBvc2x1xb5pdGVsaiBuZW/EjWVraXZhbm8gemF0dm9yaW8gdmV6dS4iCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIlBvc2x1xb5pdGVsaiBqZSBwb3NsYW8gbmVpc3ByYXZuZSBwb2RhdGtlLiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICJQb3NsdcW+aXRlbGogbmUgcG9kcsW+YXZhIHRyYcW+ZW5qZS4iCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIk5lbWEgYXVkaW8gdWxhemEgaWxpIGplIG5laXNwcmF2YW4sIEFWSSBzdHJlYW0gxIdlIGJpdGkgaXNrdmFyZW4uIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJPdmEgZGF0b3Rla2EgbmUgc2FkcsW+aSBuaWplZGFuIHVwb3RyZWJsaml2aSBzdHJlYW0gKHRvayBwb2RhdGFrYSkuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJEYXRvdGVrYSBqZSBuZWlzcHJhdm5hIGkgbmUgbW/FvmUgc2UgcmVwcm9kdWNpcmF0aS4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiIgorIk92YWogc3RyZWFtIG5pamUgbW9ndcSHZSByZXByb2R1Y2lyYXRpIGplciBqZSBrcmlwdGlyYW4gcyBQbGF5UmVhZHkgRFJNLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRGF0b3Rla2EgamUgaXNrdmFyZW5hIGkgbmUgbW/FvmUgc2UgcmVwcm9kdWNpcmF0aS4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIlZlbGnEjWluYSBhdG9tYSBqZSBuZWlzcHJhdm5hLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRGF0b3Rla2EgamUgbmVwb3RwdW5hIGkgbmUgbW/FvmUgc2UgcmVwcm9kdWNpcmF0aS4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIlZpZGVvIGl6IG92ZSBkYXRvdGVrZSBzZSBtb8W+ZGEgbmXEh2UgaXNwcmF2bm8gcmVwcm9kdWNpcmF0aS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiIgorIlUgb3ZvaiBkYXRvdGVjaSBpbWEgcHJldmnFoWUgc3RyZWFtb3ZhIChzdHJlYW1zKS4gU2FtbyBwcnZpaCAlZCDEh2Ugc2UgIgorInJlcHJvZHVjaXJhdGkiCisKKyMgaHR0cHM6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2RvY3VtZW50YXRpb24vcnRwLmh0bWwKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorIk5pamVkYW4gcG9kcsW+YW5pIHN0cmVhbSBuaWplIG5hxJFlbi4gTW/FvmRhIMSHZXRlIG1vcmF0aSBpbnN0YWxpcmF0aSBHU3RyZWFtZXIgIgorIlJUU1AgZG9kYXRuaSBwbHVnaW4gemEgUmVhbCBtZWRpanNrZSBzdHJlYW1vdmUuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisiTmlqZWRhbiBwb2Ryxb5hbmkgc3RyZWFtIG5pamUgbmHEkWVuLiBNb8W+ZGEgxIdldGUgbW9yYXRpIGRvcHVzdGl0aSB2acWhZSAiCisicHJpamVub3NuaWggcHJvdG9rb2xhIGlsaSBtb8W+ZGEgdmFtIG5lZG9zdGFqZSBvZGdvdmFyYWp1xIdpIEdTdHJlYW1lciBSVFNQICIKKyJkb2RhdG5pIHBsdWdpbi4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisiQXVkaW91cmXEkWFqIG5pamUgbW9ndcSHZSBvdHZvcml0aSB6YSByZXByb2R1a2NpanUuIFVyZcSRYWogdHJlbnV0YcSNbm8ga29yaXN0aSAiCisibmVrYSBkcnVnYSBhcGxpa2FjaWphLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiQXVkaW91cmXEkWFqIG5pamUgbW9ndcSHZSBvdHZvcml0aSB6YSByZXByb2R1a2NpanUuIE5lbWF0ZSBkb3B1xaF0ZW5qZSB6YSAiCisib3R2YXJhbmplIHVyZcSRYWphLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICJBdWRpb3VyZcSRYWogbmlqZSBtb2d1xIdlIG90dm9yaXRpIHphIHJlcHJvZHVrY2lqdS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisiQXVkaW91cmXEkWFqIG5pamUgbW9ndcSHZSBvdHZvcml0aSB6YSByZXByb2R1a2NpanUuIE92YWogZWxlbWVudCBuZSBwb2Ryxb5hdmEgIgorIm92dSBpbmHEjWljdSBPcGVuIFNvdW5kIFN5c3RlbS4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiT3ZhaiBhdWRpb3VyZcSRYWogbmUgcG9kcsW+YXZhIHJlcHJvZHVrY2lqdS4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIkdyZcWha2EgdSBhdWRpbyByZXByb2R1a2NpamkuIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJPdmFqIGF1ZGlvdXJlxJFhaiBuZSBwb2Ryxb5hdmEgc25pbWFuamUuIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiR3JlxaFrYSBzbmltYW5qYSBzIGF1ZGlvdXJlxJFhamEuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiQXVkaW91cmXEkWFqIG5pamUgbW9ndcSHZSBvdHZvcml0aSB6YSBzbmltYW5qZS4gTmVtYXRlIGRvcHXFoXRlbmplIHphIG90dmFyYW5qZSAiCisidXJlxJFhamEuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICJBdWRpb3VyZcSRYWogbmlqZSBtb2d1xIdlIG90dm9yaXRpIHphIHNuaW1hbmplLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICJDb3JlQXVkaW8gdXJlxJFhaiBuaWplIHByb25hxJFlbiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiQ29yZUF1ZGlvIHVyZcSRYWogbmlqZSBtb2d1xIdlIG90dm9yaXRpIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAiSXp2b3Igc25pbWFuamEiCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICJNaWtyb2ZvbiIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIkxpbmlqc2tpIHVsYXoiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiSW50ZXJuaSBDRCIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJTUERJRiB1bGF6IgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIkFVWCAxIHVsYXoiCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAiQVVYIDIgdWxheiIKKworbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICJLb2Rlay1wb3ZyYXRuYSBwZXRsamEiCisKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgIlN1blZUUy1wb3ZyYXRuYSBwZXRsamEiCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIkdsYXNub8SHYSIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIlBvamHEjWFuamUiCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJOYWR6b3IiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJVZ3JhxJFlbmkgenZ1xI1uaWsiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIlNsdcWhYWxpY2EiCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiTGluaWpza2kgaXpsYXoiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIlNQRElGIGl6bGF6IgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICJBVVggMSBpemxheiIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiQVVYIDIgaXpsYXoiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiR3JlxaFrYSDEjWl0YW5qYSAlZCBiYWp0b3ZhIHMgdXJlxJFhamEg4oCYJXPigJkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisiTmlqZSB1c3BqZWxvIG5hYnJvamF0aSBzdmUgbW9ndcSHZSB2aWRlbyBmb3JtYXRlIHMga29qaW1hIHVyZcSRYWog4oCYJXPigJkgbW/FvmUgIgorInJhZGl0aSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiTmlqZSBtb2d1xIdlIHByZXNsaWthdGkgKG1hcCkgbWXEkXVzcHJlbW5pa2UgaXogdXJlxJFhamEg4oCYJXPigJkiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIlVwcmF2bGphxI1raSBwcm9ncmFtIHVyZcSRYWphIOKAmCVz4oCZIG5lIHBvZHLFvmF2YSBJTyBtZXRvZHUgJWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICIiCisiVXByYXZsamHEjWtpIHByb2dyYW0gdXJlxJFhamEg4oCYJXPigJkgbmUgcG9kcsW+YXZhIG5pamVkbnUgcG96bmF0dSBJTyBtZXRvZHUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIlVyZcSRYWog4oCYJXPigJkgamUgemF1emV0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICJVcmXEkWFqIOKAmCVz4oCZIG5lIG1vxb5lIHNuaW1hdGkgcyByYXpsdcSNaXZvc3RpIG9kICVkeCVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICJVcmXEkWFqIOKAmCVz4oCZIG5lIG1vxb5lIHNuaW1hdGkgdSBzcGVjaWZpY2lyYW5vbSBmb3JtYXR1LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICJEZXZpY2Ug4oCYJXPigJkgbmUgcG9kcsW+YXZhIHByZWtpbnV0ZSByYXZuaW5lIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiUGFyYW1ldHJlIHVyZcSRYWphIOKAmCVz4oCZIG5pamUgbW9ndcSHZSBkb2JpdGkiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIlZpZGVvdXJlxJFhaiBuaWplIHByaWh2YXRpbyBub3Z1IGZyZWt2ZW5jaWp1IHNsaWthIChpbGkgcG9sdXNsaWthKS4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICJWaWRlb3VyZcSRYWogbmlqZSBwcmVkb8SNaW8gaXpsYXpuaSBmb3JtYXQuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIlZpZGVvdXJlxJFhaiBqZSB1enZyYXRpbyBzIG5laXNwcmF2bmltIGRpbWVuemlqYW1hLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICIiCisiVmlkZW91cmXEkWFqIGtvcmlzdGkgbmVwb2Ryxb5hbnUgbWV0b2R1IHBvbHVzbGlrYSAocHJvcmVkIGkgZnJla3ZlbmNpanUpLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICJWaWRlb3VyZcSRYWoga29yaXN0aSBuZXBvZHLFvmFuaSBmb3JtYXQgcGlrc2VsYS4iCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiTmlqZSB1c3BqZWxvIGtvbmZpZ3VyaXJhdGkgaW50ZXJudSB6YWxpaHUgbWXEkXVzcHJlbW5pa2EuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICJWaWRlb3VyZcSRYWogbmlqZSBwcmVkbG/FvmlvIG5pamVkbnUgdmVsacSNaW51IG1lxJF1c3ByZW1uaWthLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIk5lbWEgc2Ugb2QgbmlrdWRhIHV2ZXN0aSDigJhkb3duc3RyZWFt4oCZIHphbGloYS4iCisKKyMgdHVuZXIgPiDFoXRlbGFuamUgZnJla3ZlbmNpamUsIG1pamVuamFuamUgKGJpcmFuamUpIGthbmFsYQorIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmlqZSB1c3BqZWxvIGRvYml0aSBwb3N0YXZrZSB0dW5lcmEgJWQgbmEgdXJlxJFhaiDigJglc+KAmS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiR3JlxaFrYSBwcmkgZG9iaXZhbmp1IHBvZGF0YWthIG8gbW9ndcSHbm9zdGltYSB1cmXEkWFqYSDigJglc+KAmS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICJVcmXEkWFqIOKAmCVz4oCZIG5pamUgdHVuZXIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiTmlqZSB1c3BqZWxvIGRvYml0aSByYWRpanNraSB1bGF6IG5hIHVyZcSRYWp1IOKAmCVz4oCZLiAiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJOaWplIHVzcGplbG8gcG9zdGF2aXRpIHVsYXogJWQgbmEgdXJlxJFhaiAlcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5pamUgdXNwamVsbyBwcm9taWplbml0aSBzdGF0dXMgbXV0ZSAoWnbDu2sgKGRhL25lKSB6YSB1cmXEkWFqIOKAmCVz4oCZLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiTmlqZSB1c3BqZWxvIGl6ZHZvaml0aSBwb3RyZWJudSBtZW1vcmlqdS4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiTmlqZSB1c3BqZWxvIGRvZGlqZWxpdGkgcG90cmVibnUgbWVtb3JpanUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIktvbnZlcnRlciBuYSB1cmXEkWFqdSAlcyBuZW1hIHBvZHLFvmFuaSB1bGF6bmkgZm9ybWF0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICJLb252ZXJ0ZXIgbmEgdXJlxJFhanUgJXMgbmVtYSBwb2Ryxb5hbmkgaXpsYXpuaSBmb3JtYXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIktvZGVyIG5hIHVyZcSRYWp1ICVzIG5lbWEgcG9kcsW+YW5pIHVsYXpuaSBmb3JtYXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICJLb2RlciBuYSB1cmXEkWFqdSAlcyBuZW1hIHBvZHLFvmFuaSBpemxhem5pIGZvcm1hdCIKKworbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICJOaWplIHVzcGplbG8gemFwb8SNZXRpIGRla29kaXJhbmplIG5pdGkgKHRocmVhZCkuIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICJOaWplIHVzcGplbG8gb2JyYWRpdGkgc2xpa3UgKHBvbHVzbGlrdSkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorIkdyZcWha2EgcHJpIGRvYml2YW5qYSBtb2d1xIdub3N0aSB6YSB1cmXEkWFqIOKAmCVz4oCZOiBUbyBuaWplIHY0bDIgdXByYXZsamHEjWtpICIKKyJwcm9ncmFtLiBQcm92amVyaXRlIGRhIGxpIGplIHY0bDEgdXByYXZsamHEjWtpIHByb2dyYW0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiTmlqZSB1c3BqZWxvIGlzcGl0YXRpIHN2b2pzdHZhIHVsYXphICVkIHVyZcSRYWphICVzIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5pamUgdXNwamVsbyBkb2JpdGkgcG9zdGF2a2UgdHVuZXJhICVkIHVyZcSRYWphIOKAmCVz4oCZLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5pamUgdXNwamVsbyBpc3BpdGF0aSBub3JtdSAoc3RhbmRhcmQpIG5hIHVyZcSRYWp1IOKAmCVz4oCZLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmlqZSB1c3BqZWxvIGRvYml0aSB1cHJhdmxqYcSNa2Egc3ZvanN0dmEgdXJlxJFhamEg4oCYJXPigJkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5lIG1vxb5lIHNlIGlkZW50aWZpY2lyYXRpIHVyZcSRYWog4oCYJXPigJkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk92byBuaWplIHVyZcSRYWog4oCYJXPigJkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiVXJlxJFhaiDigJglc+KAmW5pamUgbW9ndcSHZSBvdHZvcml0aSB6YSDEjWl0YW5qZSBpIHBpc2FuamUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiVXJlxJFhaiDigJglc+KAmSBuaWplIHVyZcSRYWogemEgc25pbWFuamUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICJVcmXEkWFqIOKAmCVz4oCZIG5pamUgaXpsYXpuaSB1cmXEkWFqLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiVXJlxJFhaiDigJglc+KAmSBuaWplIE0yTSB1cmXEkWFqLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiVXJlxJFhaiDigJglc+KAmW5pamUgbW9ndcSHZSBkdXBsaWNpcmF0aSB6YSDEjWl0YW5qZSBpIHBpc2FuamUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJOaWplIHVzcGplbG8gcG9zdGF2aXRpIG5vcm11IChzdGFuZGFyZCkgemEgdXJlxJFhaiDigJglc+KAmS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJOaWplIHVzcGplbG8gZG9iaXRpIHRyZW51dGHEjW51IGZyZWt2ZW5jaWp1IHR1bmVyYSB6YSB1cmXEkWFqIOKAmCVz4oCZLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisiTmlqZSB1c3BqZWxvIHBvc3Rhdml0aSB0cmVudXRhxI1udSBmcmVrdmVuY2lqdSB0dW5lcmEgemEgdXJlxJFhaiDigJglc+KAmSBuYSAlbHUgIgorIkh6LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJOaWplIHVzcGplbG8gZG9iaXRpIHNuYWd1IHNpZ25hbGEgemEgdXJlxJFhaiDigJglc+KAmS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5pamUgdXNwamVsbyBkb2JpdGkgdnJpamVkbm9zdCB6YSBrb250cm9sdSAlZCBuYSB1cmXEkWFqdSDigJglc+KAmS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5pamUgdXNwamVsbyBwb3N0YXZpdGkgdnJpamVkbm9zdCAlZCB6YSBrb250cm9sdSAlZCBuYSB1cmXEkWFqdSDigJglc+KAmS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJOaWplIHVzcGplbG8gZG9iaXRpIHRyZW51dGHEjW5pIHVsYXogbmEgdXJlxJFhanUg4oCYJXPigJkuIE1vxb5kYSBqZSB0byByYWRpb3VyZcSRYWoiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIk5pamUgdXNwamVsbyBkb2JpdGkgdHJlbnV0YcSNbmkgaXpsYXogbmEgdXJlxJFhanUg4oCYJXPigJkuIE1vxb5kYSBqZSB0byByYWRpb3VyZcSRYWoiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiTmlqZSB1c3BqZWxvIHBvc3Rhdml0aSBpemxheiAlZCBuYSB1cmXEkWFqICVzLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIlByb21qZW5hIHJlem9sdWNpamUgdSB0aWpla3UgcmFkYSAocnVudGltZSkgam/FoSBuaWplIHBvZHLFvmFuYS4iCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIk5lIG1vZ3UgcmFkaXRpIGJleiB0YWt0YSAoc2F0YSkiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIkludGVybmEgZ3JlxaFrYSB0b2thIChzdHJlYW0pIHBvZGF0YWthLiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgZmxvdyBlcnJvci4iCisjfiBtc2dzdHIgIkludGVybmEgZ3JlxaFrYSBwcm90b2thIHBvZGF0YWthLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzb3VuZCBzZXJ2ZXIiCisjfiBtc2dzdHIgIk5lIG1vZ3Ugb3N0dmFyaXRpIHZlenUgcHJlbWEgcG9zbHXFvml0ZWxqdSB6dnVrYSIKKworI34gbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBzb3VuZCBzZXJ2ZXIgY2FwYWJpbGl0aWVzIgorI34gbXNnc3RyICJOaXNhbSB1c3BpbyBpc3BpdGF0aSBtb2d1xIdub3N0aSBwb3NsdcW+aXRlbGphIHp2dWthIgorCisjfiBtc2dpZCAiQmFzcyIKKyN+IG1zZ3N0ciAiTmlza2kiCisKKyN+IG1zZ2lkICJUcmVibGUiCisjfiBtc2dzdHIgIlZpc29raSIKKworI34gbXNnaWQgIlN5bnRoIgorI34gbXNnc3RyICJTaW50ZXRpemF0b3IiCisKKyN+IG1zZ2lkICJQQ00iCisjfiBtc2dzdHIgIlBDTSIKKworI34gbXNnaWQgIlNwZWFrZXIiCisjfiBtc2dzdHIgIlp2dcSNbmlrIgorCisjfiBtc2dpZCAiTGluZS1pbiIKKyN+IG1zZ3N0ciAiVWxhem5hIGxpbmlqYSIKKworI34gbXNnaWQgIkNEIgorI34gbXNnc3RyICJDRCIKKworI34gbXNnaWQgIk1peGVyIgorI34gbXNnc3RyICJNaWtzZXIiCisKKyN+IG1zZ2lkICJQQ00tMiIKKyN+IG1zZ3N0ciAiUENNLTIiCisKKyN+IG1zZ2lkICJSZWNvcmQiCisjfiBtc2dzdHIgIlNuaW1hbmplIgorCisjfiBtc2dpZCAiSW4tZ2FpbiIKKyN+IG1zZ3N0ciAiVWxhem5vIHBvamHEjWFuamUiCisKKyN+IG1zZ2lkICJPdXQtZ2FpbiIKKyN+IG1zZ3N0ciAiSXpsYXpubyBwb2phxI1hbmplIgorCisjfiBtc2dpZCAiTGluZS0xIgorI34gbXNnc3RyICJMaW5pamEgMSIKKworI34gbXNnaWQgIkxpbmUtMiIKKyN+IG1zZ3N0ciAiTGluaWphIDIiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIkxpbmlqYSAzIgorCisjfiBtc2dpZCAiRGlnaXRhbC0xIgorI34gbXNnc3RyICJEaWdpdGFsbmkgMSIKKworI34gbXNnaWQgIkRpZ2l0YWwtMiIKKyN+IG1zZ3N0ciAiRGlnaXRhbG5pIDIiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTMiCisjfiBtc2dzdHIgIkRpZ2l0YWxuaSAzIgorCisjfiBtc2dpZCAiUGhvbmUtaW4iCisjfiBtc2dzdHIgIlRlbGVmb25za2kgdWxheiIKKworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAiVGVsZWZvbnNraSBpemxheiIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICJWaWRlbyIKKworI34gbXNnaWQgIlJhZGlvIgorI34gbXNnc3RyICJSYWRpbyIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCisjfiBtc2dzdHIgIk5lIG1vZ3Ugb3R2b3JpdGkgenZ1xI1uaSB1cmXEkWFqIHphIHVwcmF2bGphbmplIG1pa3Nlcm9tLiIKKworI34gbXNnaWQgIiIKKyN+ICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIFRoaXMgdmVyc2lvbiBvZiAiCisjfiAidGhlIE9wZW4gU291bmQgU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIk5lIG1vZ3Ugb3R2b3JpdGkgenZ1xI1uaSB1cmXEkWFqIHphIHVwcmF2bGphbmplIG1pa3Nlcm9tLiBPdmFqIGVsZW1lbnQgbmUgIgorI34gInBvZHLFvmF2YSBvdnUgaW5hxI1pY3UgT3BlbiBTb3VuZCBTeXN0ZW0gc3VzdGF2YS4iCisKKyN+IG1zZ2lkICJNYXN0ZXIiCisjfiBtc2dzdHIgIkdsYXZuaSIKKworI34gbXNnaWQgIkZyb250IgorI34gbXNnc3RyICJQcmVkbmppIgorCisjfiBtc2dpZCAiUmVhciIKKyN+IG1zZ3N0ciAiU3RyYcW+bmppIgorCisjfiBtc2dpZCAiSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiU2x1xaFhbGljZSIKKworI34gbXNnaWQgIkNlbnRlciIKKyN+IG1zZ3N0ciAiU3JlZG5qaSIKKworI34gbXNnaWQgIkxGRSIKKyN+IG1zZ3N0ciAiTEZFIgorCisjfiBtc2dpZCAiU3Vycm91bmQiCisjfiBtc2dzdHIgIlN1cnJvdW5kIgorCisjfiBtc2dpZCAiU2lkZSIKKyN+IG1zZ3N0ciAiQm/EjW5pIgorCisjfiBtc2dpZCAiQVVYIE91dCIKKyN+IG1zZ3N0ciAiQVVYIGl6bGF6IgorCisjfiBtc2dpZCAiM0QgRGVwdGgiCisjfiBtc2dzdHIgIjNEIGR1YmluYSIKKworI34gbXNnaWQgIjNEIENlbnRlciIKKyN+IG1zZ3N0ciAiM0Qgc3JlZGnFoXRlIgorCisjfiBtc2dpZCAiM0QgRW5oYW5jZSIKKyN+IG1zZ3N0ciAiM0QgZG9wdW5hIgorCisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICJUZWxlZm9uIgorCisjfiBtc2dpZCAiVmlkZW8gSW4iCisjfiBtc2dzdHIgIlZpZGVvIHVsYXoiCisKKyN+IG1zZ2lkICJBVVggSW4iCisjfiBtc2dzdHIgIkFVWCB1bGF6IgorCisjfiBtc2dpZCAiUmVjb3JkIEdhaW4iCisjfiBtc2dzdHIgIlBvamHEjWFuamUgc25pbWFuamEiCisKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAiUG9qYcSNYW5qZSBpemxhemEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEJvb3N0IgorI34gbXNnc3RyICJQb2phxI1hbmplIG1pa3JvZm9uYSIKKworI34gbXNnaWQgIkRpYWdub3N0aWMiCisjfiBtc2dzdHIgIkRpamFnbm9zdGlrYSIKKworI34gbXNnaWQgIkJhc3MgQm9vc3QiCisjfiBtc2dzdHIgIlBvamHEjWFuamUgbmlza2loIgorCisjfiBtc2dpZCAiUGxheWJhY2sgUG9ydHMiCisjfiBtc2dzdHIgIlBvcnRvdmkgcmVwcm9kdWtjaWplIgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIlVsYXoiCisKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAiSXp2b3IgbmFkemlyYW5qYSIKKworI34gbXNnaWQgIktleWJvYXJkIEJlZXAiCisjfiBtc2dzdHIgIlRpcGtvdm5pxI1raSB6dnVrIgorCisjfiBtc2dpZCAiU2ltdWxhdGUgU3RlcmVvIgorI34gbXNnc3RyICJTaW11bGlyYWogc3RlcmVvIgorCisjfiBtc2dpZCAiU3RlcmVvIgorI34gbXNnc3RyICJTdGVyZW8iCisKKyN+IG1zZ2lkICJTdXJyb3VuZCBTb3VuZCIKKyN+IG1zZ3N0ciAiU3Vycm91bmQgenZ1ayIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKKyN+IG1zZ3N0ciAiUG9qYcSNYW5qZSBtaWtyb2ZvbmEiCisKKyN+IG1zZ2lkICJTcGVha2VyIFNvdXJjZSIKKyN+IG1zZ3N0ciAiSXp2b3IgenZ1xI1uaWthIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBTb3VyY2UiCisjfiBtc2dzdHIgIkl6dm9yIG1pa3JvZm9uYSIKKworI34gbXNnaWQgIkphY2siCisjfiBtc2dzdHIgIlByaWtsanXEjWFrIgorCisjfiBtc2dpZCAiQ2VudGVyIC8gTEZFIgorI34gbXNnc3RyICJTcmVkbmppIC8gTEZFIgorCisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAiU3RlcmVvIG1pa3NlciIKKworI34gbXNnaWQgIk1vbm8gTWl4IgorI34gbXNnc3RyICJNb25vIG1pa3NlciIKKworI34gbXNnaWQgIklucHV0IE1peCIKKyN+IG1zZ3N0ciAiVWxhem5pIG1pa3NlciIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAiTWlrcm9mb24gMSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAiTWlrcm9mb24gMiIKKworI34gbXNnaWQgIkRpZ2l0YWwgT3V0IgorI34gbXNnc3RyICJEaWdpdGFsbmkgaXpsYXoiCisKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICJEaWdpdGFsbmkgdWxheiIKKworI34gbXNnaWQgIkhETUkiCisjfiBtc2dzdHIgIkhETUkiCisKKyN+IG1zZ2lkICJNb2RlbSIKKyN+IG1zZ3N0ciAiTW9kZW0iCisKKyN+IG1zZ2lkICJIYW5kc2V0IgorI34gbXNnc3RyICJTbHXFoWFsaWNlIHMgbWlrcm9mb25vbSIKKworI34gbXNnaWQgIk90aGVyIgorI34gbXNnc3RyICJPc3RhbG8iCisKKyN+IG1zZ2lkICJOb25lIgorI34gbXNnc3RyICJOaWplZGFuIgorCisjfiBtc2dpZCAiT24iCisjfiBtc2dzdHIgIlVrbGp1xI1lbiIKKworI34gbXNnaWQgIk9mZiIKKyN+IG1zZ3N0ciAiSXNrbGp1xI1lbiIKKworI34gbXNnaWQgIk11dGUiCisjfiBtc2dzdHIgIlV0acWhYW4iCisKKyN+IG1zZ2lkICJGYXN0IgorI34gbXNnc3RyICJCcnpvIgorCisjfiBtc2dpZCAiVmVyeSBMb3ciCisjfiBtc2dzdHIgIlZybG8gbmlza2EiCisKKyN+IG1zZ2lkICJMb3ciCisjfiBtc2dzdHIgIk5pc2thIgorCisjfiBtc2dpZCAiTWVkaXVtIgorI34gbXNnc3RyICJTcmVkbmphIgorCisjfiBtc2dpZCAiSGlnaCIKKyN+IG1zZ3N0ciAiVmlzb2thIgorCisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICJWcmxvIHZpc29rYSIKKworI34gbXNnaWQgIlByb2R1Y3Rpb24iCisjfiBtc2dzdHIgIlByb2R1a2NpanNrYSIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCisjfiBtc2dzdHIgIk1pa3JvZm9uIG5hIHByZWRuam9qIHBsb8SNaSIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgSW4iCisjfiBtc2dzdHIgIkxpbmlqc2tpIHVsYXogbmEgcHJlZG5qb2ogcGxvxI1pIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiU2x1xaFhbGljZSBuYSBwcmVkbmpvaiBwbG/EjWkiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIE91dCIKKyN+IG1zZ3N0ciAiTGluaWpza2kgaXpsYXogbmEgcHJlZG5qb2ogcGxvxI1pIgorCisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICJaZWxlbmEgcHJpa2xqdcSNbmljYSIKKworI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICJSdcW+acSNYXN0YSBwcmlrbGp1xI1uaWNhIgorCisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlBsYXZhIHByaWtsanXEjW5pY2EiCisKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkJpamVsYSBwcmlrbGp1xI1uaWNhIgorCisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDcm5hIHByaWtsanXEjW5pY2EiCisKKyN+IG1zZ2lkICJHcmF5IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiU2l2YSBwcmlrbGp1xI1uaWNhIgorCisjfiBtc2dpZCAiT3JhbmdlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiTmFyYW7EjWFzdGEgcHJpa2xqdcSNbmljYSIKKworI34gbXNnaWQgIlJlZCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNydmVuYSBwcmlrbGp1xI1uaWNhIgorCisjfiBtc2dpZCAiWWVsbG93IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAixb11dGEgcHJpa2xqdcSNbmljYSIKKworI34gbXNnaWQgIkdyZWVuIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiWmVsZW5hIHByaWtsanXEjW5pY2EgbmEgcHJlZG5qb2ogcGxvxI1pIgorCisjfiBtc2dpZCAiUGluayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlJ1xb5pxI1hc3RhIHByaWtsanXEjW5pY2EgbmEgcHJlZG5qb2ogcGxvxI1pIgorCisjfiBtc2dpZCAiQmx1ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlBsYXZhIHByaWtsanXEjW5pY2EgbmEgcHJlZG5qb2ogcGxvxI1pIgorCisjfiBtc2dpZCAiV2hpdGUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJCaWplbGEgcHJpa2xqdcSNbmljYSBuYSBwcmVkbmpvaiBwbG/EjWkiCisKKyN+IG1zZ2lkICJCbGFjayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNybmEgcHJpa2xqdcSNbmljYSBuYSBwcmVkbmpvaiBwbG/EjWkiCisKKyN+IG1zZ2lkICJHcmF5IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiU2l2YSBwcmlrbGp1xI1uaWNhIG5hIHByZWRuam9qIHBsb8SNaSIKKworI34gbXNnaWQgIk9yYW5nZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk5hcmFuxI1hc3RhIHByaWtsanXEjW5pY2EgbmEgcHJlZG5qb2ogcGxvxI1pIgorCisjfiBtc2dpZCAiUmVkIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ3J2ZW5hIHByaWtsanXEjW5pY2EgbmEgcHJlZG5qb2ogcGxvxI1pIgorCisjfiBtc2dpZCAiWWVsbG93IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAixb11dGEgcHJpa2xqdcSNbmljYSBuYSBwcmVkbmpvaiBwbG/EjWkiCisKKyN+IG1zZ2lkICJTcHJlYWQgT3V0cHV0IgorI34gbXNnc3RyICJSYcWhaXJlbmkgaXpsYXoiCisKKyN+IG1zZ2lkICJEb3dubWl4IgorI34gbXNnc3RyICJTbWFuamVuamUgYnJvamEga2FuYWxhIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBJbnB1dCIKKyN+IG1zZ3N0ciAiVWxheiB2aXJ0dWFsbm9nIG1pa3NlcmEiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIE91dHB1dCIKKyN+IG1zZ3N0ciAiSXpsYXogdmlydHVhbG5vZyBtaWtzZXJhIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBDaGFubmVscyIKKyN+IG1zZ3N0ciAiS2FuYWxpIHZpcnR1YWxub2cgbWlrc2VyYSIKKworI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyAlZCBmdW5rY2lqYSIKKworI34gbXNnaWQgIiVzIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyBmdW5rY2lqYSIKKworI34gbXNnaWQgIkdvdCB1bmV4cGVjdGVkIGZyYW1lIHNpemUgb2YgJXUgaW5zdGVhZCBvZiAldS4iCisjfiBtc2dzdHIgIkRvYml2ZW5hIG5lb8SNZWtpdmFuYSB2ZWxpxI1pbmEgb2t2aXJhICV1IHVtamVzdG8gJXUuIgorCisjfiBtc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBvbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkdyZcWha2EgxI1pdGFuamEgJWQgYmFqdG92YSBuYSB1cmXEkWFqdSDigJ4lc+KAnS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZW5xdWV1ZSBidWZmZXJzIGluIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiTmlzYW0gdXNwaW8gZG9kYXRpIHUgcmVkIG1lxJF1c3ByZW1uaWtlIHUgdXJlxJFhaiDigJ4lc+KAnS4iCisKKyN+IG1zZ2lkICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIk5pc2FtIHVzcGlvIHBva3XFoWF2YWp1xIdpIGRvYml0aSB2aWRlbyBva3ZpcmUgaXogdXJlxJFhamEg4oCeJXPigJ0uIgorCisjfiBtc2dpZCAiRmFpbGVkIGFmdGVyICVkIHRyaWVzLiBkZXZpY2UgJXMuIHN5c3RlbSBlcnJvcjogJXMiCisjfiBtc2dzdHIgIk5pc2FtIHVzcGlvIG5ha29uICVkIHBva3XFoWFqYS4gdXJlxJFhaiAlcy4gZ3JlxaFrYSBzdXN0YXZhOiAlcyIKZGlmZiAtLWdpdCBhL3BvL2h1LnBvIGIvcG8vaHUucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI4OGUyNQotLS0gL2Rldi9udWxsCisrKyBiL3BvL2h1LnBvCkBAIC0wLDAgKzEsNzkwIEBACisjIEh1bmdhcmlhbiB0cmFuc2xhdGlvbiBmb3IgZ3N0LXBsdWdpbnMtZ29vZC4KKyMgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ3N0LXBsdWdpbnMtZ29vZCBwYWNrYWdlLgorIworIyBMYXN6bG8gRHZvcm5payA8ZHZvcm5pa0BpbnZpdGVsLmh1PiwgMjAwNC4KKyMgR2Fib3IgS2VsZW1lbiA8a2VsZW1lbmdAZ25vbWUuaHU+LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDEyLCAyMDE0LCAyMDE2LgorIyBCYWzDoXpzIMOaciA8dXJiYWxhenNAZ21haWwuY29tPiwgMjAxNCwgMjAxNS4KK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QgMS43LjJcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxNi0wMy0xNCAxODozNSswMTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBHYWJvciBLZWxlbWVuIDxrZWxlbWVuZ0Bnbm9tZS5odT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBIdW5nYXJpYW4gPHRyYW5zbGF0aW9uLXRlYW0taHVAbGlzdHMuc291cmNlZm9yZ2UubmV0PlxuIgorIkxhbmd1YWdlOiBodVxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlgtUm9zZXR0YS1FeHBvcnQtRGF0ZTogMjAwNy0wNy0yNyAxOToxODoxNSswMDAwXG4iCisiWC1HZW5lcmF0b3I6IExva2FsaXplIDEuNVxuIgorIlgtUm9zZXR0YS1FeHBvcnQtRGF0ZTogMjAwNy0wNy0yNyAxOToxODoxNSswMDAwXG4iCisiUGx1cmFsLUZvcm1zOiAgbnBsdXJhbHM9MjsgcGx1cmFsPShuICE9IDEpO1xuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICJKYWNrIGtpc3pvbGfDoWzDsyBuZW0gdGFsw6FsaGF0w7MiCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIkEgSlBFRyBrw6lwIHZpc3N6YWZlanTDqXNlIG1lZ2hpw7pzdWx0IgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICLigJ4lc+KAnSBldHTFkWw6IOKAniVz4oCdIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJOZW0gc2lrZXLDvGx0IGNzYXRsYWtvem5pIGEga2lzem9sZ8OhbMOzaG96IgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIk5pbmNzIGJlw6FsbMOtdHZhIFVSTC4iCisKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIk5lbSBzaWtlcsO8bHQgZmVsb2xkYW5pIGEga2lzem9sZ8OhbMOzIG5ldsOpdC4iCisKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiTmVtIGhvemhhdMOzIGzDqXRyZSBrYXBjc29sYXQgYSBraXN6b2xnw6Fsw7Nob3ouIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAiQSBiaXp0b25zw6Fnb3Mga2FwY3NvbGF0IGtpYWxha8OtdMOhc2EgbWVnaGnDunN1bHQuIgorCittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorIkjDoWzDs3phdGkgaGliYSB0w7ZydMOpbnQsIHZhZ3kgYSBraXN6b2xnw6Fsw7MgdsOhcmF0bGFudWwgbGV6w6FydGEgYSBrYXBjc29sYXRvdC4iCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIkEga2lzem9sZ8OhbMOzIGhpYsOhcyBhZGF0b2thdCBrw7xsZMO2dHQuIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIkEga2lzem9sZ8OhbMOzIG5lbSB0w6Ftb2dhdGphIGEgdGVrZXLDqXN0LiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAiTmluY3MgdmFneSDDqXJ2w6lueXRlbGVuIGJlbWVuZXRpIGhhbmcsIGF6IEFWSS1mb2x5YW0gc8OpcsO8bHQgbGVzei4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIkEgZsOhamwgbmVtIHRhcnRhbG1heiBsZWrDoXRzemhhdMOzIGFkYXRmb2x5YW1va2F0LiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiQSBmw6FqbCBuZW0gw6lydsOpbnllcyDDqXMgbmVtIGrDoXRzemhhdMOzIGxlLiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICIiCisiTmVtIGxlaGV0IGxlasOhdHN6YW5pIGEgZm9seWFtb3QsIG1lcnQgUGxheVJlYWR5IERSTSB0aXRrb3PDrXTDoXMgdmFuIHJhanRhLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiQSBmw6FqbCBzw6lyw7xsdCDDqXMgbmVtIGrDoXRzemhhdMOzIGxlLiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiw4lydsOpbnl0ZWxlbiBhdG9tIG3DqXJldC4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkEgZsOhamwgbmVtIHRlbGplcyDDqXMgbmVtIGrDoXRzemhhdMOzIGxlLiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiQSBmw6FqbGJhbiB0YWzDoWxoYXTDsyB2aWRlw7MgbGVoZXQsIGhvZ3kgbmVtIGrDoXRzemhhdMOzIGxlIG1lZ2ZlbGVsxZFlbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiIgorIkEgZsOhamwgdMO6bCBzb2sgYWRhdGZvbHlhbW90IHRhcnRhbG1hei4gQ3NhayBheiBlbHPFkSAlZCBrZXLDvGwgbGVqw6F0c3rDoXNyYS4iCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorIk5lbSB0YWzDoWxoYXTDsyB0w6Ftb2dhdG90dCBhZGF0Zm9seWFtLiBUZWxlcMOtdHNlIGEgR1N0cmVhbWVyIFJUU1AgYsWRdsOtdG3DqW55dCBhICIKKyJSZWFsIG1lZGlhIGFkYXRmb2x5YW1va2hvei4iCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKyJOZW0gdGFsw6FsaGF0w7MgdMOhbW9nYXRvdHQgYWRhdGZvbHlhbS4gTGVoZXQsIGhvZ3kgdMO2YmIgw6F0dml0ZWxpIHByb3Rva29sbHQgIgorImtlbGwgZW5nZWTDqWx5ZXpuaSwgdmFneSBoacOhbnl6aWsgYSBtZWdmZWxlbMWRIEdTdHJlYW1lciBSVFNQIGLFkXbDrXRtw6lueS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisiTmVtIG55aXRoYXTDsyBtZWcgaGFuZ2VzemvDtnogYSBsZWrDoXRzesOhc2hvei4gQXogZXN6a8O2enQgbcOhc2lrIGFsa2FsbWF6w6FzICIKKyJoYXN6bsOhbGphLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiTmVtIG55aXRoYXTDsyBtZWcgaGFuZ2VzemvDtnogYSBsZWrDoXRzesOhc2hvei4gTmluY3Mgam9nb3N1bHRzw6FnYSBheiBlc3prw7Z6ICIKKyJtZWdueWl0w6Fzw6FyYS4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiTmVtIG55aXRoYXTDsyBtZWcgaGFuZ2VzemvDtnogYSBsZWrDoXRzesOhc2hvei4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisiTmVtIG55aXRoYXTDsyBtZWcgaGFuZ2VzemvDtnogYSBsZWrDoXRzesOhc2hvei4gQXogT3BlbiBTb3VuZCBTeXN0ZW0gZXplbiAiCisidmVyemnDs2rDoXQgYXogZWxlbSBuZW0gdMOhbW9nYXRqYS4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiRXogYSBoYW5nZXN6a8O2eiBuZW0gdMOhbW9nYXRqYSBhIGxlasOhdHN6w6FzdC4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIkhhbmdsZWrDoXRzesOhc2kgaGliYS4iCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkV6IGEgaGFuZ2VzemvDtnogbmVtIHTDoW1vZ2F0amEgYSBmZWx2w6l0ZWx0LiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkhpYmEgYSBoYW5nZXN6a8O2enLFkWwgdmFsw7MgZmVsdsOpdGVsa29yLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIk5lbSBueWl0aGF0w7MgbWVnIGhhbmdlc3prw7Z6IGEgZmVsdsOpdGVsaGV6LiBOaW5jcyBqb2dvc3VsdHPDoWdhIGF6IGVzemvDtnogIgorIm1lZ255aXTDoXPDoXJhLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiTmVtIG55aXRoYXTDsyBtZWcgaGFuZ2VzemvDtnogYSBmZWx2w6l0ZWxoZXouIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgIkEgQ29yZUF1ZGlvIGVzemvDtnogbmVtIHRhbMOhbGhhdMOzIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICJBIENvcmVBdWRpbyBlc3prw7Z6IG5lbSBueWl0aGF0w7MgbWVnIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAiRmVsdsOpdGVsIGZvcnLDoXNhIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWlrcm9mb24iCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICJWb25hbGJlbWVuZXQiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiQmVsc8WRIENEIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIlNQRElGIGJlIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIjEuIEFVWCBiZSIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICIyLiBBVVggYmUiCisKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiS29kZWsgdmlzc3phY3NhdG9sw6FzIgorCittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICJTdW5WVFMgdmlzc3phY3NhdG9sw6FzIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJIYW5nZXLFkSIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIkVyxZFzw610w6lzIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiTW9uaXRvciIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIkJlw6lww610ZXR0IGhhbmdzesOzcsOzIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICJGZWpoYWxsZ2F0w7MiCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiVm9uYWxraW1lbmV0IgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICJTUERJRiBraSIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiMS4gQVVYIGtpIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICIyLiBBVVgga2kiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiSGliYSAlZCBiw6FqdCBvbHZhc8Ohc2Frb3IgYSBrw7Z2ZXRrZXrFkSBlc3prw7Z6csWRbDog4oCeJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisiQSh6KSDigJ4lc+KAnSBlc3prw7Z6IMOhbHRhbCBrZXplbGhldMWRIGxlaGV0c8OpZ2VzIHZpZGVvZm9ybcOhdHVtb2sgZmVsc29yb2zDoXNhICIKKyJzaWtlcnRlbGVuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICJOZW0ga8OpcGV6aGV0xZFrIGxlIGEoeikg4oCeJXPigJ0gZXN6a8O2eiBwdWZmZXJlaSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAiQSh6KSDigJ4lc+KAnSBlc3prw7Z6IGlsbGVzenTFkXByb2dyYW1qYSBuZW0gdMOhbW9nYXRqYSBhKHopICVkLiBJTyBtw7Nkb3QiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICIiCisiQSh6KSDigJ4lc+KAnSBlc3prw7Z6IGlsbGVzenTFkXByb2dyYW1qYSBuZW0gdMOhbW9nYXQgZWd5ZXRsZW4gaXNtZXJ0IElPIG3Ds2RvdCBzZW0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIkEoeikg4oCeJXPigJ0gZXN6a8O2eiBmb2dsYWx0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICJBKHopIOKAniVz4oCdIGVzemvDtnogbmVtIGvDqXBlcyBmZWx2ZW5uaSAlZHglZCBmZWxib250w6FzYmFuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICJBKHopIOKAniVz4oCdIGVzemvDtnogbmVtIGvDqXBlcyBmZWx2ZW5uaSBhIG1lZ2Fkb3R0IGZvcm3DoXR1bWJhbiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICJBKHopIOKAniVz4oCdIGVzemvDtnogbmVtIHTDoW1vZ2F0amEgYSBuZW0gc3pvbXN6w6lkb3Mgc8Ota29rYXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICJOZW0ga8OpcmhldMWRayBsZSBhKHopIOKAniVz4oCdIGVzemvDtnogcGFyYW3DqXRlcmVpIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICJBIHZpZGVvZXN6a8O2eiBuZW0gZm9nYWR0YSBlbCBheiDDumoga8OpcGtvY2thc2ViZXNzw6lnLWJlw6FsbMOtdMOhc3QuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiQSB2aWRlb2VzemvDtnogbmVtIHN6b2xnw6FsdGF0b3R0IGtpbWVuZXRpIGZvcm3DoXR1bW90LiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICJBIHZpZGVvZXN6a8O2eiDDqXJ2w6lueXRlbGVuIGRpbWVuemnDs2trYWwgdMOpcnQgdmlzc3phLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICJBIHZpZGVvZXN6a8O2esO2ayBuZW0gdMOhbW9nYXRvdHQgdsOhbHRvdHRzb3JvcyBtw7Nkb3QgaGFzem7DoWxuYWsuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIkEgdmlkZW9lc3prw7Z6w7ZrIG5lbSB0w6Ftb2dhdG90dCBrw6lwcG9udGZvcm3DoXR1bW90IGhhc3puw6FsbmFrLiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICJOZW0gc2lrZXLDvGx0IGJlw6FsbMOtdGFuaSBhIGJlbHPFkSBwdWZmZXJ0w6Fyb2zDs3QuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICJBIHZpZGVvZXN6a8O2eiBuZW0gamF2YXNvbHQgc2VtbWlseWVuIHB1ZmZlcm3DqXJldGV0LiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIk5pbmNzIGltcG9ydMOhbMOhc2kgZm9ycsOhc2vDqW50IGhhc3puw6FsaGF0w7MgYWzDoXJlbmRlbHQgdMOhcm9sw7MuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJBKHopICVkLiB0dW5lciBiZcOhbGzDrXTDoXPDoW5hayBsZWvDqXLDqXNlIGEoeikg4oCeJXPigJ0gZXN6a8O2esO2biBtZWdoacO6c3VsdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiSGliYSBhKHopIOKAniVz4oCdIGVzemvDtnoga8OpcGVzc8OpZ2VpbmVrIGxla8OpcsOpc2Vrb3IuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiQSh6KSDigJ4lc+KAnSBlc3prw7Z6IG5lbSB0dW5lci4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJBIHLDoWRpw7NiZW1lbmV0IGxla8OpcsOpc2UgbWVnaGnDunN1bHQgYSh6KSDigJ4lc+KAnSBlc3prw7Z6w7ZuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIkEoeikgJWQuIGJlbWVuZXQgYmXDoWxsw610w6FzYSBtZWdoacO6c3VsdCBhKHopIOKAniVz4oCdIGVzemvDtnrDtm4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJBIG7DqW3DrXTDoXNpIMOhbGxhcG90IG3Ds2Rvc8OtdMOhc2EgbWVnaGnDunN1bHQgYSh6KSDigJ4lc+KAnSBlc3prw7Z6w7ZuLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiTmVtIHNpa2Vyw7xsdCBsZWZvZ2xhbG5pIGEgc3rDvGtzw6lnZXMgbWVtw7NyacOhdC4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiTmVtIHNpa2Vyw7xsdCBsZWZvZ2xhbG5pIGEgc3rDvGtzw6lnZXMgbWVtw7NyacOhdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiQSh6KSAlcyBlc3prw7Z6w7ZuIGzDqXbFkSDDoXRhbGFrw610w7NuYWsgbmluY3MgdMOhbW9nYXRvdHQgYmVtZW5ldGkgZm9ybcOhdHVtYSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiQSh6KSAlcyBlc3prw7Z6w7ZuIGzDqXbFkSDDoXRhbGFrw610w7NuYWsgbmluY3MgdMOhbW9nYXRvdHQga2ltZW5ldGkgZm9ybcOhdHVtYSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiQSh6KSAlcyBlc3prw7Z6w7ZuIGzDqXbFkSBrw7Nkb2zDs25hayBuaW5jcyB0w6Ftb2dhdG90dCBiZW1lbmV0aSBmb3Jtw6F0dW1hIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiQSh6KSAlcyBlc3prw7Z6w7ZuIGzDqXbFkSBrw7Nkb2zDs25hayBuaW5jcyB0w6Ftb2dhdG90dCBraW1lbmV0aSBmb3Jtw6F0dW1hIgorCittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIk5lbSBzaWtlcsO8bHQgZWxpbmTDrXRhbmkgYSBkZWvDs2RvbMOhc2kgc3rDoWxhdC4iCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIk5lbSBzaWtlcsO8bHQgZmVsZG9sZ296bmkgYSBrZXJldGV0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyJIaWJhIGEoeikg4oCeJXPigJ0gZXN6a8O2eiBrw6lwZXNzw6lnZWluZWsgbGVrw6lyw6lzZWtvci4gRXogbmVtIGVneSB2NGwyIG1lZ2hhanTDsy4gIgorIkVsbGVuxZFyaXp6ZSwgaG9neSBuZW0gdjRsMSBtZWdoYWp0w7MtZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICJBKHopICVkIGJlbWVuZXQgYXR0cmliw7p0dW1haW5hayBsZWvDqXLDqXNlIG1lZ2hpw7pzdWx0IGEoeikgJXMgZXN6a8O2esO2biIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJBKHopICVkLiB0dW5lciBiZcOhbGzDrXTDoXPDoW5hayBsZWvDqXLDqXNlIGEoeikg4oCeJXPigJ0gZXN6a8O2esO2biBtZWdoacO6c3VsdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICJBIG5vcm1hIGxla8OpcmRlesOpc2UgbWVnaGnDunN1bHQgYSh6KSDigJ4lc+KAnSBlc3prw7Z6dMWRbC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkEgdmV6w6lybMWRYXR0cmliw7p0dW1vayBsZWvDqXLDqXNlIG1lZ2hpw7pzdWx0IGEoeikg4oCeJXPigJ0gZXN6a8O2esO2bi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmVtIGF6b25vc8OtdGhhdMOzIGEoeikg4oCeJXPigJ0gZXN6a8O2ei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRXogbmVtIGVneSBlc3prw7Z6OiDigJ4lc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJOZW0gc2lrZXLDvGx0IG9sdmFzw6FzcmEgw6lzIMOtcsOhc3JhIG1lZ255aXRuaSBhKHopIOKAniVz4oCdIGVzemvDtnp0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIkEoeikg4oCeJXPigJ0gZXN6a8O2eiBuZW0gcsO2Z3rDrXTFkWVzemvDtnouIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICJBKHopIOKAniVz4oCdIGVzemvDtnogbmVtIGtpbWVuZXRpIGVzemvDtnouIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICJBKHopIOKAniVz4oCdIGVzemvDtnogbmVtIE0yTSBlc3prw7Z6LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiTmVtIHNpa2Vyw7xsdCBkdXBsaWvDoWxuaSBhKHopIOKAniVz4oCdIGVzemvDtnp0IG9sdmFzw6FzcmEgw6lzIMOtcsOhc3JhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQSBub3JtYSBiZcOhbGzDrXTDoXNhIG1lZ2hpw7pzdWx0IGEoeikg4oCeJXPigJ0gZXN6a8O2esO2bi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiQSB0dW5lciBha3R1w6FsaXMgZnJla3ZlbmNpw6Fqw6FuYWsgbGVrw6lyZGV6w6lzZSBtZWdoacO6c3VsdCBhKHopIOKAniVz4oCdIGVzemvDtnp0xZFsLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisiQSB0dW5lciBha3R1w6FsaXMgZnJla3ZlbmNpw6Fqw6FuYWsgYmXDoWxsw610w6FzYSBtZWdoacO6c3VsdCBhKHopIOKAniVz4oCdIGVzemvDtnrDtm4gIgorIiVsdSBIei1yZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQSBqZWxlcsWRc3PDqWcgbGVrw6lyZGV6w6lzZSBtZWdoacO6c3VsdCBhKHopIOKAniVz4oCdIGVzemvDtnrDtm4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJBKHopICVkLiB2ZXrDqXJsxZFlbGVtIMOpcnTDqWvDqW5layBsZWvDqXLDqXNlIG1lZ2hpw7pzdWx0IGEoeikg4oCeJXPigJ0gZXN6a8O2esO2bi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJBKHopICQlMmQgw6lydMOpayBiZcOhbGzDrXTDoXNhICQlMWQgdmV6w6lybMWRZWxlbWhleiBtZWdoacO6c3VsdCBhKHopIOKAniVz4oCdIGVzemvDtnrDtm4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiQXogYWt0dcOhbGlzIGJlbWVuZXQgbGVrw6lyw6lzZSBtZWdoacO6c3VsdCBhKHopIOKAniVz4oCdIGVzemvDtnpyxZFsLiBMZWhldCwgaG9neSBleiAiCisiZWd5IHLDoWRpw7Nlc3prw7Z6LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiQXogYWt0dcOhbGlzIGtpbWVuZXQgbGVrw6lyw6lzZSBtZWdoacO6c3VsdCBhKHopIOKAniVz4oCdIGVzemvDtnpyxZFsLiBMZWhldCwgaG9neSBleiAiCisiZWd5IHLDoWRpw7Nlc3prw7Z6LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJBKHopICVkLiBraW1lbmV0IGJlw6FsbMOtdMOhc2EgbWVnaGnDunN1bHQgYSh6KSDigJ4lc+KAnSBlc3prw7Z6w7ZuLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIkEgZmVsYm9udMOhcyBtw7Nkb3PDrXTDoXNhIGZ1dMOhcyBrw7Z6YmVuIG3DqWcgbmVtIHTDoW1vZ2F0b3R0LiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAiw5NyYSBuw6lsa8O8bCBsZWhldGV0bGVuIGEgbcWxa8O2ZMOpcyIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAiQmVsc8WRIGFkYXRmb2x5YW0taGliYS4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICJCZWxzxZEgYWRhdGZvbHlhbS1oaWJhLiIKKworI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAiQSh6KSDigJ4lc+KAnSBlc3prw7Z6IG5lbSB0w6Ftb2dhdGphIGEgdmlkZW9mZWx2w6l0ZWx0IgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNvdW5kIHNlcnZlciIKKyN+IG1zZ3N0ciAiTmVtIGhvemhhdMOzIGzDqXRyZSBrYXBjc29sYXQgYSBoYW5na2lzem9sZ8OhbMOzaG96IgorCisjfiBtc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IHNvdW5kIHNlcnZlciBjYXBhYmlsaXRpZXMiCisjfiBtc2dzdHIgIkEgaGFuZ2tpc3pvbGfDoWzDsyBrw6lwZXNzw6lnZWluZWsgbGVrw6lyZGV6w6lzZSBtZWdoacO6c3VsdCIKKworI34gbXNnaWQgIkJhc3MiCisjfiBtc2dzdHIgIkJhc3N6dXMiCisKKyN+IG1zZ2lkICJUcmVibGUiCisjfiBtc2dzdHIgIk1hZ2FzIgorCisjfiBtc2dpZCAiU3ludGgiCisjfiBtc2dzdHIgIlN6aW50ZXQuIgorCisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICJQQ00iCisKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICJIYW5nZmFsIgorCisjfiBtc2dpZCAiTGluZS1pbiIKKyN+IG1zZ3N0ciAiVm9uYWxiZW1lbmV0IgorCisjfiBtc2dpZCAiQ0QiCisjfiBtc2dzdHIgIkNEIgorCisjfiBtc2dpZCAiTWl4ZXIiCisjfiBtc2dzdHIgIktldmVyxZEiCisKKyN+IG1zZ2lkICJQQ00tMiIKKyN+IG1zZ3N0ciAiMi4gUENNIgorCisjfiBtc2dpZCAiUmVjb3JkIgorI34gbXNnc3RyICJGZWx2w6l0ZWwiCisKKyN+IG1zZ2lkICJJbi1nYWluIgorI34gbXNnc3RyICJCZS1lcsWRc8OtdMOpcyIKKworI34gbXNnaWQgIk91dC1nYWluIgorI34gbXNnc3RyICJLaS1lcsWRc8OtdMOpcyIKKworI34gbXNnaWQgIkxpbmUtMSIKKyN+IG1zZ3N0ciAiMS4gdm9uYWwiCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgIjIuIHZvbmFsIgorCisjfiBtc2dpZCAiTGluZS0zIgorI34gbXNnc3RyICIzLiB2b25hbCIKKworI34gbXNnaWQgIkRpZ2l0YWwtMSIKKyN+IG1zZ3N0ciAiMS4gZGlnaXTDoWxpcyIKKworI34gbXNnaWQgIkRpZ2l0YWwtMiIKKyN+IG1zZ3N0ciAiMi4gZGlnaXTDoWxpcyIKKworI34gbXNnaWQgIkRpZ2l0YWwtMyIKKyN+IG1zZ3N0ciAiMy4gZGlnaXTDoWxpcyIKKworI34gbXNnaWQgIlBob25lLWluIgorI34gbXNnc3RyICJIYW5nLWJlIgorCisjfiBtc2dpZCAiUGhvbmUtb3V0IgorI34gbXNnc3RyICJIYW5nLWtpIgorCisjfiBtc2dpZCAiVmlkZW8iCisjfiBtc2dzdHIgIlZpZGVvIgorCisjfiBtc2dpZCAiUmFkaW8iCisjfiBtc2dzdHIgIlLDoWRpw7MiCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIgorI34gbXNnc3RyICJOZW0gbnlpdGhhdMOzIG1lZyBoYW5nZXN6a8O2eiBhIGtldmVyxZF2ZXrDqXJsxZEga2V6ZWzDqXPDqWhlei4iCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJOZW0gbnlpdGhhdMOzIG1lZyBoYW5nZXN6a8O2eiBhIGtldmVyxZF2ZXrDqXJsxZEga2V6ZWzDqXPDqWhlei4gQXogT3BlbiBTb3VuZCAiCisjfiAiU3lzdGVtIGV6ZW4gdmVyemnDs2rDoXQgYXogZWxlbSBuZW0gdMOhbW9nYXRqYS4iCisKKyN+IG1zZ2lkICJNYXN0ZXIiCisjfiBtc2dzdHIgIkbFkSBoYW5nZXLFkSIKKworI34gbXNnaWQgIkZyb250IgorI34gbXNnc3RyICJFbMO8bHPFkSIKKworI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIkjDoXRzw7MiCisKKyN+IG1zZ2lkICJIZWFkcGhvbmVzIgorI34gbXNnc3RyICJGw7xsaGFsbGdhdMOzIgorCisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICJLw7Z6w6lwc8WRIgorCisjfiBtc2dpZCAiTEZFIgorI34gbXNnc3RyICJMRkUiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCIKKyN+IG1zZ3N0ciAiVMOpcmhhdMOhc8O6IgorCisjfiBtc2dpZCAiU2lkZSIKKyN+IG1zZ3N0ciAiT2xkYWxzw7MiCisKKyN+IG1zZ2lkICJBVVggT3V0IgorI34gbXNnc3RyICJBVVgga2kiCisKKyN+IG1zZ2lkICIzRCBEZXB0aCIKKyN+IG1zZ3N0ciAiM0QgbcOpbHkiCisKKyN+IG1zZ2lkICIzRCBDZW50ZXIiCisjfiBtc2dzdHIgIjNEIGvDtnrDqXBzxZEiCisKKyN+IG1zZ2lkICIzRCBFbmhhbmNlIgorI34gbXNnc3RyICIzRCBqYXbDrXTDoXMiCisKKyN+IG1zZ2lkICJUZWxlcGhvbmUiCisjfiBtc2dzdHIgIlRlbGVmb24iCisKKyN+IG1zZ2lkICJWaWRlbyBJbiIKKyN+IG1zZ3N0ciAiVmlkZW8gYmUiCisKKyN+IG1zZ2lkICJBVVggSW4iCisjfiBtc2dzdHIgIkFVWCBiZSIKKworI34gbXNnaWQgIlJlY29yZCBHYWluIgorI34gbXNnc3RyICJGZWx2w6l0ZWxlcsWRc8OtdMOpcyIKKworI34gbXNnaWQgIk91dHB1dCBHYWluIgorI34gbXNnc3RyICJLaW1lbmV0ZXLFkXPDrXTDqXMiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEJvb3N0IgorI34gbXNnc3RyICJNaWtyb2ZvbmVyxZFzw610w6lzIgorCisjfiBtc2dpZCAiRGlhZ25vc3RpYyIKKyN+IG1zZ3N0ciAiRGlhZ25vc3p0aWthIgorCisjfiBtc2dpZCAiQmFzcyBCb29zdCIKKyN+IG1zZ3N0ciAiQmFzc3p1c2tpZW1lbMOpcyIKKworI34gbXNnaWQgIlBsYXliYWNrIFBvcnRzIgorI34gbXNnc3RyICJMZWrDoXRzesOhc2kgcG9ydG9rIgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIkJlbWVuZXQiCisKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTW9uaXRvciBmb3Jyw6FzYSIKKworI34gbXNnaWQgIktleWJvYXJkIEJlZXAiCisjfiBtc2dzdHIgIkJpbGxlbnR5xbF6ZXRjc2VuZ8WRIgorCisjfiBtc2dpZCAiU2ltdWxhdGUgU3RlcmVvIgorI34gbXNnc3RyICJTenRlcmXDsyBzemltdWzDoWzDoXNhIgorCisjfiBtc2dpZCAiU3RlcmVvIgorI34gbXNnc3RyICJTenRlcmXDsyIKKworI34gbXNnaWQgIlN1cnJvdW5kIFNvdW5kIgorI34gbXNnc3RyICJUw6lyaGF0w6Fzw7ogaGFuZyIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKKyN+IG1zZ3N0ciAiTWlrcm9mb25lcsWRc8OtdMOpcyIKKworI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICJIYW5nZmFsZm9ycsOhcyIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgU291cmNlIgorI34gbXNnc3RyICJNaWtyb2ZvbmZvcnLDoXMiCisKKyN+IG1zZ2lkICJKYWNrIgorI34gbXNnc3RyICJKYWNrIgorCisjfiBtc2dpZCAiQ2VudGVyIC8gTEZFIgorI34gbXNnc3RyICJLw7Z6w6lwc8WRIC8gTEZFIgorCisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAiU3p0ZXJlw7Mga2V2ZXLDqXMiCisKKyN+IG1zZ2lkICJNb25vIE1peCIKKyN+IG1zZ3N0ciAiTW9uw7Mga2V2ZXLDqXMiCisKKyN+IG1zZ2lkICJJbnB1dCBNaXgiCisjfiBtc2dzdHIgIkJlbWVuZXRpIGtldmVyw6lzIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAxIgorI34gbXNnc3RyICIxLiBtaWtyb2ZvbiIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAiMi4gbWlrcm9mb24iCisKKyN+IG1zZ2lkICJEaWdpdGFsIE91dCIKKyN+IG1zZ3N0ciAiRGlnaXTDoWxpcyBraSIKKworI34gbXNnaWQgIkRpZ2l0YWwgSW4iCisjfiBtc2dzdHIgIkRpZ2l0w6FsaXMgYmUiCisKKyN+IG1zZ2lkICJIRE1JIgorI34gbXNnc3RyICJIRE1JIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgIk1vZGVtIgorCisjfiBtc2dpZCAiSGFuZHNldCIKKyN+IG1zZ3N0ciAiTW9iaWx0ZWxlZm9uIgorCisjfiBtc2dpZCAiT3RoZXIiCisjfiBtc2dzdHIgIkVnecOpYiIKKworI34gbXNnaWQgIk5vbmUiCisjfiBtc2dzdHIgIk5pbmNzIgorCisjfiBtc2dpZCAiT24iCisjfiBtc2dzdHIgIkJlIgorCisjfiBtc2dpZCAiT2ZmIgorI34gbXNnc3RyICJLaSIKKworI34gbXNnaWQgIk11dGUiCisjfiBtc2dzdHIgIk7DqW3DrXTDoXMiCisKKyN+IG1zZ2lkICJGYXN0IgorI34gbXNnc3RyICJHeW9ycyIKKworI34gbXNnaWQgIlZlcnkgTG93IgorI34gbXNnc3RyICJOYWd5b24gYWxhY3NvbnkiCisKKyN+IG1zZ2lkICJMb3ciCisjfiBtc2dzdHIgIkFsYWNzb255IgorCisjfiBtc2dpZCAiTWVkaXVtIgorI34gbXNnc3RyICJLw7Z6ZXBlcyIKKworI34gbXNnaWQgIkhpZ2giCisjfiBtc2dzdHIgIk1hZ2FzIgorCisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICJOYWd5b24gbWFnYXMiCisKKyN+IG1zZ2lkICJQcm9kdWN0aW9uIgorI34gbXNnc3RyICLDiWxlcyIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCisjfiBtc2dzdHIgIkVsxZFsYXBpIG1pa3JvZm9uIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBJbiIKKyN+IG1zZ3N0ciAiRWzFkWxhcGkgdm9uYWxiZW1lbmV0IgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiRWzFkWxhcGkgZsO8bGhhbGxnYXTDsyIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgT3V0IgorI34gbXNnc3RyICJFbMWRbGFwaSB2b25hbGtpbWVuZXQiCisKKyN+IG1zZ2lkICJHcmVlbiBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlrDtmxkIGNzYXRsYWtvesOzIgorCisjfiBtc2dpZCAiUGluayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlLDs3pzYXN6w61uIGNzYXRsYWtvesOzIgorCisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkvDqWsgY3NhdGxha296w7MiCisKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkZlaMOpciBjc2F0bGFrb3rDsyIKKworI34gbXNnaWQgIkJsYWNrIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiRmVrZXRlIGNzYXRsYWtvesOzIgorCisjfiBtc2dpZCAiR3JheSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlN6w7xya2UgY3NhdGxha296w7MiCisKKyN+IG1zZ2lkICJPcmFuZ2UgQ29ubmVjdG9yIgorI34gbXNnc3RyICJOYXJhbmNzIGNzYXRsYWtvesOzIgorCisjfiBtc2dpZCAiUmVkIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiVsO2csO2cyBjc2F0bGFrb3rDsyIKKworI34gbXNnaWQgIlllbGxvdyBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlPDoXJnYSBjc2F0bGFrb3rDsyIKKworI34gbXNnaWQgIkdyZWVuIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiWsO2bGQgZWzFkW9sZGFsaSBjc2F0bGFrb3rDsyIKKworI34gbXNnaWQgIlBpbmsgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJSw7N6c2FzesOtbiBlbMWRb2xkYWxpIGNzYXRsYWtvesOzIgorCisjfiBtc2dpZCAiQmx1ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkvDqWsgZWzFkW9sZGFsaSBjc2F0bGFrb3rDsyIKKworI34gbXNnaWQgIldoaXRlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiRmVow6lyIGVsxZFvbGRhbGkgY3NhdGxha296w7MiCisKKyN+IG1zZ2lkICJCbGFjayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkZla2V0ZSBlbMWRb2xkYWxpIGNzYXRsYWtvesOzIgorCisjfiBtc2dpZCAiR3JheSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlN6w7xya2UgZWzFkW9sZGFsaSBjc2F0bGFrb3rDsyIKKworI34gbXNnaWQgIk9yYW5nZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk5hcmFuY3MgZWzFkW9sZGFsaSBjc2F0bGFrb3rDsyIKKworI34gbXNnaWQgIlJlZCBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlbDtnLDtnMgZWzFkW9sZGFsaSBjc2F0bGFrb3rDsyIKKworI34gbXNnaWQgIlllbGxvdyBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlPDoXJnYSBlbMWRb2xkYWxpIGNzYXRsYWtvesOzIgorCisjfiBtc2dpZCAiU3ByZWFkIE91dHB1dCIKKyN+IG1zZ3N0ciAiU3rDs3LDoXNraW1lbmV0IgorCisjfiBtc2dpZCAiRG93bm1peCIKKyN+IG1zZ3N0ciAiTGVrZXZlcsOpcyIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgSW5wdXQiCisjfiBtc2dzdHIgIlZpcnR1w6FsaXMga2V2ZXLFkWJlbWVuZXQiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIE91dHB1dCIKKyN+IG1zZ3N0ciAiVmlydHXDoWxpcyBrZXZlcsWRa2ltZW5ldCIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgQ2hhbm5lbHMiCisjfiBtc2dzdHIgIlZpcnR1w6FsaXMga2V2ZXLFkWNzYXRvcm7DoWsiCisKKyN+IG1zZ2lkICIlcyAlZCBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiJXMgJWQgZnVua2Npw7MiCisKKyN+IG1zZ2lkICIlcyBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiJXMgZnVua2Npw7MiCisKKyN+IG1zZ2lkICJHb3QgdW5leHBlY3RlZCBmcmFtZSBzaXplIG9mICV1IGluc3RlYWQgb2YgJXUuIgorI34gbXNnc3RyICJWw6FyYXRsYW4ga2VyZXRtw6lyZXQgKCV1KSDDqXJrZXpldHQgJXUgaGVseWV0dC4iCisKKyN+IG1zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIG9uIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiSGliYSAlZCBiw6FqdCBvbHZhc8Ohc2Frb3IgYSBrw7Z2ZXRrZXrFkSBlc3prw7Z6csWRbDog4oCeJXPigJ0uIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIk5lbSDDoWxsw610aGF0w7NrIHNvcmJhIGEgcHVmZmVyZWsgYSh6KSDigJ4lc+KAnSBlc3prw7Z6YmVuLiIKKworI34gbXNnaWQgIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiTmVtIHNpa2Vyw7xsdCB2aWRlb2tvY2vDoWthdCBsZWvDqXJuaSBhKHopIOKAniVz4oCdIGVzemvDtnp0xZFsLiIKKworI34gbXNnaWQgIkZhaWxlZCBhZnRlciAlZCB0cmllcy4gZGV2aWNlICVzLiBzeXN0ZW0gZXJyb3I6ICVzIgorI34gbXNnc3RyICJIaWJhICVkIHByw7Niw6Fsa296w6FzIHV0w6FuLiBFc3prw7Z6OiAlcy4gUmVuZHN6ZXJoaWJhOiAlcy4iCmRpZmYgLS1naXQgYS9wby9pZC5wbyBiL3BvL2lkLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNDBmODMKLS0tIC9kZXYvbnVsbAorKysgYi9wby9pZC5wbwpAQCAtMCwwICsxLDQzMyBAQAorIyBJbmRvbmVzaWFuIHRyYW5zbGF0aW9ucyBmb3IgZ3N0LXBsdWdpbnMtZ29vZCBwYWNrYWdlLgorIyBUaGlzIGZpbGUgaXMgcHV0IGluIHRoZSBwdWJsaWMgZG9tYWluLgorIworIyBBbmRoaWthIFBhZG1hd2FuIDxhbmRoaWthLnBhZG1hd2FuQGdtYWlsLmNvbT4sIDIwMTEtMjAxNi4KKyMgQW5kaWthIFRyaXdpZGFkYSA8YW5kaWthQGdtYWlsLmNvbT4sIDIwMTMuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kIDEuMTAuMFxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDE2LTExLTEwIDIyOjA2KzA3MDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEFuZGhpa2EgUGFkbWF3YW4gPGFuZGhpa2EucGFkbWF3YW5AZ21haWwuY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IEluZG9uZXNpYW4gPHRyYW5zbGF0aW9uLXRlYW0taWRAbGlzdHMuc291cmNlZm9yZ2UubmV0PlxuIgorIkxhbmd1YWdlOiBpZFxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlgtQnVnczogUmVwb3J0IHRyYW5zbGF0aW9uIGVycm9ycyB0byB0aGUgTGFuZ3VhZ2UtVGVhbSBhZGRyZXNzLlxuIgorIlBsdXJhbC1Gb3JtczogbnBsdXJhbHM9MTsgcGx1cmFsPTA7XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIlNlcnZlciBKYWNrIHRhayBkaXRlbXVrYW4iCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIkdhZ2FsIHVudHVrIG1lbmdhd2FzYW5kaSBjaXRyYSBKUEVHIgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICInJXMnIG9sZWggJyVzJyIKKworbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAiVGFrIGRhcGF0IG1lbmdodWJ1bmdpIHNlcnZlciIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJUYWsgYWRhIFVSTCB5YW5nIGRpdGVudHVrYW4uIgorCittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJUYWsgZGFwYXQgbWVuZW11a2FuIG5hbWEgc2VydmVyLiIKKworbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICJUYWsgZGFwYXQgbWVtYmFuZ3VuIGtvbmVrc2kga2Ugc2VydmVyLiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIlBlbmdhdHVyYW4ga29uZWtzaSBhbWFuIGdhZ2FsLiIKKworbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIiIKKyJUZXJqYWRpIHNlYnVhaCBnYWxhdCBqYXJpbmdhbiwgYXRhdSBzZXJ2ZXIgbWVudXR1cCBrb25la3NpIHNlY2FyYSB0aWJhLXRpYmEuIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICJTZXJ2ZXIgbWVuZ2lyaW0gZGF0YSBydXNhay4iCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiU2VydmVyIHRpZGFrIG1lbmR1a3VuZyBwZW5jYXJpYW4uIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICJNYXN1a2FuIGF1ZGlvIHRpZGFrIGFkYSBhdGF1IHRpZGFrIHNhaCwgYXJ1cyBBVkkgYWthbiBydXNhay4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIkJlcmthcyBpbmkgdGlkYWsgYmVyaXNpIGFydXMgeWFuZyBkYXBhdCBkaXB1dGFyLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiQmVya2FzIGluaSB0aWRhayBzYWggZGFuIHRhayBkYXBhdCBkaXB1dGFyLiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICJUYWsgYmlzYSBtZW1haW5rYW4gc3RyZWFtIGthcmVuYSBkaWVua3JpcHNpIG1lbWFrYWkgRFJNIFBsYXlSZWFkeS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkJlcmthcyBpbmkgcnVzYWsgZGFuIHRhayBkYXBhdCBkaXB1dGFyLiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiVWt1cmFuIGF0b20gdGlkYWsgc2FoLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiQmVya2FzIGluaSB0aWRhayBsZW5na2FwIGRhbiB0YWsgZGFwYXQgZGlwdXRhci4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIlZpZGVvIGRpIGJlcmthcyBpbmkgbXVuZ2tpbiB0YWsgZGFwYXQgZGlwdXRhciBkZW5nYW4gYmVuYXIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIkJlcmthcyBpbmkgYmVyaXNpIHRlcmxhbHUgYmFueWFrIGFydXMuIEhhbnlhIG1lbXV0YXIgJWQgcGVydGFtYSIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisiVGFrIGFkYSBhcnVzIGRpZHVrdW5nIHlhbmcgZGl0ZW11a2FuLiBBbmRhIG11bmdraW4gcGVybHUgbWVuZ2luc3RhbCBwbHVnaW4gIgorImVrc3RlbnNpIEdTdHJlYW1lciBSVFNQIHVudHVrIGFydXMgUmVhbCBtZWRpYS4iCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKyJUYWsgYWRhIGFydXMgZGlkdWt1bmcgeWFuZyBkaXRlbXVrYW4uIEFuZGEgbXVuZ2tpbiBpbmdpbiBtZW5naXppbmthbiBsZWJpaCAiCisiYmFueWFrIHRyYW5zcG9ydGFzaSBhdGF1IGtlaGlsYW5nYW4gcGx1Z2luIGVrc3RlbnNpIEdTdHJlYW1lciBSVFNQIHlhbmcgIgorImJlbmFyLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKyJUYWsgZGFwYXQgbWVtYnVrYSBkaXZhaXMgYXVkaW8gdW50dWsgcHV0YXIga2VtYmFsaS4gRGl2YWlzIHNlZGFuZyBkaWd1bmFrYW4gIgorIm9sZWggYXBsaWthc2kgbGFpbi4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIlRhayBkYXBhdCBtZW1idWthIGRpdmFpcyBhdWRpbyB1bnR1ayBwdXRhciBrZW1iYWxpLiBBbmRhIHRhayBtZW1pbGlraSBoYWsgIgorImFrc2VzIHVudHVrIG1lbWJ1a2EgZGl2YWlzLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICJUYWsgZGFwYXQgbWVtYnVrYSBkaXZhaXMgYXVkaW8gdW50dWsgcHV0YXIga2VtYmFsaS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisiVGFrIGRhcGF0IG1lbWJ1a2EgZGl2YWlzIGF1ZGlvIHVudHVrIHB1dGFyIGtlbWJhbGkuIFZlcnNpIE9wZW4gU291bmQgU3lzdGVtICIKKyJpbmkgdGlkYWsgZGlkdWt1bmcgb2xlaCBlbGVtZW4gaW5pLiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJQdXRhciBiYWxpayB0aWRhayBkaWR1a3VuZyBvbGVoIGRpdmFpcyBhdWRpbyBpbmkuIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICJHYWxhdCBwdXRhciBiYWxpayBhdWRpby4iCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIlBlcmVrYW1hbiB0aWRhayBkaWR1a3VuZyBvbGVoIGRpdmFpcyBhdWRpbyBpbmkuIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiR2FsYXQgbWVyZWthbSBkYXJpIGRpdmFpcyBhdWRpby4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJUYWsgZGFwYXQgbWVtYnVrYSBkaXZhaXMgYXVkaW8gdW50dWsgbWVyZWthbS4gQW5kYSB0YWsgbWVtaWxpa2kgaGFrIGFrc2VzICIKKyJ1bnR1ayBtZW1idWthIGRpdmFpcy4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIlRhayBkYXBhdCBtZW1idWthIGRpdmFpcyBhdWRpbyB1bnR1ayBtZXJla2FtLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICJEaXZhaXMgQ29yZUF1ZGlvIHRpZGFrIGRpdGVtdWthbiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiRGl2YWlzIENvcmVBdWRpbyB0aWRhayBkYXBhdCBidWthIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAiU3VtYmVyIFJla2FtYW4iCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICJNaWtyb2ZvbiIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIkphbHVyIE1hc3VrIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIkNEIEludGVybmFsIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIlNQRElGIE1hc3VrIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIkFVWCAxIE1hc3VrIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIkFVWCAyIE1hc3VrIgorCittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIkxvb3BiYWNrIEtvZGVrIgorCittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICJMb29wYmFjayBTdW5WVFMiCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIlZvbHVtZSIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIkdhaW4iCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJNb25pdG9yIgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiUGVuZ2VyYXMgU3VhcmEgVGVyYmluYSIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiSGVhZHBob25lIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIkphbHVyIEtlbHVhciIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiU1BESUYgS2VsdWFyIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICJBVVggMSBLZWx1YXIiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIkFVWCAyIEtlbHVhciIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIgorbXNnc3RyICJHYWxhdCBtZW1iYWNhICVkIGJpdGEgZGFyaSBkaXZhaXMgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIiIKKyJHYWdhbCBtZW55ZWJ1dGthbiBrZW11bmdraW5hbiBmb3JtYXQgdmlkZW8geWFuZyBkYXBhdCBiZWtlcmphIGRlbmdhbiBkaXZhaXMgIgorIiclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICJUYWsgZGFwYXQgbWVtZXRha2FuIHBlbnlhbmdnYSBkYXJpIGRpdmFpcyAnJXMnIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICJEcml2ZXIgZGFyaSBkaXZhaXMgJyVzJyB0YWsgbWVuZHVrdW5nIG1ldG9kZSBJTyAlZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIkRyaXZlciBkYXJpIGRpdmFpcyAnJXMnIHRhayBtZW5kdWt1bmcgbWV0b2RlIElPIGFwYXB1biB5YW5nIGRpa2VuYWwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIkRpdmFpcyAnJXMnIHNpYnVrIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICJEaXZhaXMgJyVzJyB0YWsgZGFwYXQgbWVuYW5na2FwIGRpICVkeCVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICJEaXZhaXMgJyVzJyB0YWsgZGFwYXQgbWVuYW5na2FwIGRhbGFtIGZvcm1hdCB5YW5nIGRpdGVudHVrYW4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiRGl2YWlzICclcycgdGFrIG1lbmR1a3VuZyBwZXNhd2F0IHRhayBiZXJzaW5nZ3VuZ2FuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiVGFrIGJpc2EgbWVuZGFwYXRrYW4gcGFyYW1ldGVyIGRpIGRpdmFpcyAnJXMnIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICJEaXZhaXMgdmlkZW8gdGFrIG1lbmVyaW1hIHBlbmdhdHVyYW4gbGFqdSBiaW5na2FpIGJhcnUuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiRGl2YWlzIHZpZGVvIHRhayBtZW55ZWRpYWthbiBmb3JtYXQga2VsdWFyYW4uIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIkRpdmFpcyB2aWRlbyBtZW5nZW1iYWxpa2FuIGRpbWVuc2kgdGlkYWsgc2FoLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICJEaXZhaXMgdmlkZW8gbWVuZ2d1bmFrYW4gbWV0b2RlIHBlbnlpbGFuZ2FuIHlhbmcgdGlkYWsgZGlkdWt1bmcuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIkRpdmFpcyB2aWRlbyBtZW5nZ3VuYWthbiBmb3JtYXQgcGl4ZWwgeWFuZyB0aWRhayBkaWR1a3VuZy4iCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiR2FnYWwgbWVuZ2F0dXIgcHVsIHNpbmdnYWhhbiBpbnRlcm5hbC4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIkRpdmFpcyB2aWRlbyB0YWsgbWVueWFyYW5rYW4gdWt1cmFuIHNpbmdnYWhhbiBhcGFwdW4uIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAiVGFrIGFkYSBwdWwgZG93bnN0cmVhbSB1bnR1ayBkaWltcG9yLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiR2FnYWwgbWVuZGFwYXRrYW4gcGVuZ2F0dXJhbiB0dW5lciAlZCBkaSBkaXZhaXMgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiR2FsYXQgc2FhdCBtZW5nYW1iaWwga2FwYWJpbGl0YXMgYmFnaSBkaXZhaXMgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICJEaXZhaXMgJyVzJyBidWthbiB0dW5lci4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJHYWdhbCBtZW5kYXBhdCBtYXN1a2FuIHJhZGlvIHBhZGEgZGl2YWlzICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiR2FnYWwgbWVuZ2F0dXIgbWFzdWthbiAlZCBkaSBkaXZhaXMgJXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJHYWdhbCBtZW5ndWJhaCBrZWFkYWFuIGJpc3UgdW50dWsgZGl2YWlzICclcycuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICJHYWdhbCBtZW5nYWxva2FzaWthbiBtZW1vcmkgeWFuZyBkaXBlcmx1a2FuLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICJHYWdhbCBtZW5nYWxva2FzaWthbiBtZW1vcmkgeWFuZyBkaXBlcmx1a2FuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJLb252ZXJ0ZXIgZGkgZGl2YWlzICVzIHRpZGFrIG1lbXB1bnlhaSBmb3JtYXQgbWFzdWthbiB5YW5nIGRpZHVrdW5nIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICJLb252ZXJ0ZXIgZGkgZGl2YWlzICVzIHRpZGFrIG1lbXB1bnlhaSBmb3JtYXQga2VsdWFyYW4geWFuZyBkaWR1a3VuZyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiUGVueWFuZGkgZGkgZGl2YWlzICVzIHRpZGFrIG1lbXB1bnlhaSBmb3JtYXQgbWFzdWthbiB5YW5nIGRpZHVrdW5nIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiUGVueWFuZGkgZGkgZGl2YWlzICVzIHRpZGFrIG1lbXB1bnlhaSBmb3JtYXQga2VsdWFyYW4geWFuZyBkaWR1a3VuZyIKKworbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICJHYWdhbCB1bnR1ayBtZW5qYWxhbmthbiB0YWxpIGF3YXNhbmRpLiIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiR2FnYWwgbWVtcHJvc2VzIGJpbmdrYWkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorIkdhbGF0IG1lbmRhcGF0a2FuIGtlbWFtcHVhbiB1bnR1ayBkaXZhaXMgJyVzJzogSXR1IGJ1a2FuIGRpdmVyIHY0bDIuIENlayAiCisiYXBha2FoIGl0dSBtZXJ1cGFrYW4gZHJpdmVyIHY0bDEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiR2FnYWwga3VlcmkgYXRyaWJ1dCBtYXN1a2FuICVkIGRpIGRpdmFpcyAlcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJHYWdhbCBtZW5kYXBhdGthbiBwZW5nYXR1cmFuIHR1bmVyICVkIGRpIGRpdmFpcyAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkdhZ2FsIGt1ZXJpIHN0YW5kYXIgZGkgZGl2YWlzICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJHYWdhbCBtZW5kYXBhdGthbiBrZW5kYWxpIGF0cmlidXQgZGkgZGl2YWlzICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlRhayBkYXBhdCBtZW5naWRlbnRpZmlrYXNpIGRpdmFpcyAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICJJbmkgYnVrYW4gZGl2YWlzICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiVGFrIGRhcGF0IG1lbWJ1a2EgZGl2YWlzICclcycgdW50dWsgZGliYWNhIGRhbiBkaXR1bGlzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIkRpdmFpcyAnJXMnIGJ1a2FuIGRpdmFpcyBwZW5hbmdrYXAuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICJEaXZhaXMgJyVzJyBidWthbiBkaXZhaXMga2VsdWFyYW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICJEaXZhaXMgJyVzJyBidWthbiBkaXZhaXMgTTJNLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiVGFrIGRhcGF0IG1lbWJ1a2EgZGl2YWlzICclcycgdW50dWsgZGliYWNhIGRhbiBkaXR1bGlzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiR2FnYWwgbWVuZ2F0dXIgc3RhbmRhciB1bnR1ayBkaXZhaXMgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJHYWdhbCB1bnR1ayBtZW5kYXBhdGthbiBmcmVrdWVuc2kgdHVuZXIgdGVya2luaSB1bnR1ayBkaXZhaXMgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiR2FnYWwgbWVuZ2F0dXIgZnJla3VlbnNpIHR1bmVyIHRlcmtpbmkgdW50dWsgZGl2YWlzICclcycga2UgJWx1IEh6LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJHYWdhbCBtZW5kYXBhdGthbiBrZWt1YXRhbiBzaW55YWwgdW50dWsgZGl2YWlzICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJHYWdhbCBtZW5kYXBhdGthbiBuaWxhaSB1bnR1ayBrZW5kYWxpICVkIGRpIGRpdmFpcyAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiR2FnYWwgbWVuZ2F0dXIgbmlsYWkgJWQgdW50dWsga2VuZGFsaSAlZCBkaSBkaXZhaXMgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJHYWdhbCBtZW5kYXBhdGthbiBtYXN1a2FuIHRlcmtpbmkgZGkgZGl2YWlzICclcycuIE11bmdraW4gaXR1IGRpdmFpcyByYWRpbyIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiR2FnYWwgbWVuZGFwYXRrYW4ga2VsdWFyYW4gdGVya2luaSBkaSBkaXZhaXMgJyVzJy4gTXVuZ2tpbiBpdHUgZGl2YWlzIHJhZGlvIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIkdhZ2FsIG1lbmdhdHVyIGtlbHVhcmFuICVkIGRpIGRpdmFpcyAlcy4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICJNZW5ndWJhaCByZXNvbHVzaSBzYWF0IHdha3R1IGJlcmphbGFuIGJlbHVtIGRpZHVrdW5nLiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAiVGFrIGRhcGF0IGJlcm9wZXJhc2kgdGFucGEgamFtIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBzdHJlYW0gZXJyb3IuIgorI34gbXNnc3RyICJHYWxhdCBhcnVzIGRhdGEgaW50ZXJuYWwuIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAiR2FsYXQgYWxpcmFuIGRhdGEgaW50ZXJuYWwuIgorCisjfiBtc2dpZCAiRGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBjYXB0dXJlIgorI34gbXNnc3RyICJEaXZhaXMgJyVzJyB0YWsgbWVuZHVrdW5nIHBlbmFuZ2thcGFuIHZpZGVvIgpkaWZmIC0tZ2l0IGEvcG8vaXQucG8gYi9wby9pdC5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDBiNTkyCi0tLSAvZGV2L251bGwKKysrIGIvcG8vaXQucG8KQEAgLTAsMCArMSw4MTcgQEAKKyMgSXRhbGlhbiB0cmFuc2xhdGlvbiBmb3IgZ3N0LXBsdWdpbnMtZ29vZCBwYWNrYWdlIG9mIEdTdHJlYW1lciBwcm9qZWN0LgorIyBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAgR1N0cmVhbWVyIGNvcmUgdGVhbQorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ3N0LXBsdWdpbnMtZ29vZCBwYWNrYWdlLgorIworIyBMdWNhIEZlcnJldHRpIDxlbGxlLnVjYUBpbmZpbml0by5pdD4sIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAuCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kIDAuMTAuMjUuM1xuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDEwLTEwLTI1IDEwOjExKzAyMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEx1Y2EgRmVycmV0dGkgPGVsbGUudWNhQGluZmluaXRvLml0PlxuIgorIkxhbmd1YWdlLVRlYW06IEl0YWxpYW4gPHRwQGxpc3RzLmxpbnV4Lml0PlxuIgorIkxhbmd1YWdlOiBpdFxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIkRlY29kaWZpY2EgZGVsbCdpbW1hZ2luZSBKUEVHIG5vbiByaXVzY2l0YSIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiwqslc8K7IGRpIMKrJXPCuyIKKworbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAiSW1wb3NzaWJpbGUgY29ubmV0dGVyc2kgYWwgc2VydmVyIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIk5lc3N1biBVUkwgaW1wb3N0YXRvLiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiSW1wb3NzaWJpbGUgcmlzb2x2ZXJlIGlsIG5vbWUgZGVsIHNlcnZlci4iCisKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiSW1wb3NzaWJpbGUgc3RhYmlsaXJlIGxhIGNvbm5lc3Npb25lIGFsIHNlcnZlci4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICJJbXBvc3RhemlvbmUgZGVsbGEgY29ubmVzc2lvbmUgc2ljdXJhIG5vbiByaXVzY2l0YS4iCisKKyMsIGZ1enp5Cittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorIlNpIMOoIHZlcmlmaWNhdG8gdW4gZXJyb3JlIGRpIHJldGUsIG9wcHVyZSBpbCBzZXJ2ZXIgaGEgY2hpdXNvIGxhIGNvbm5lc3Npb25lICIKKyJpbiBtb2RvIGluYXR0ZXNvLiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiSW4gc2VydmVyIGhhIGludmlhdG8gZGF0aSBlcnJhdGkuIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIklsIHNlcnZlciBub24gc3VwcG9ydGEgaWwgcG9zaXppb25hbWVudG8uIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICIiCisiSW5ncmVzc28gYXVkaW8gYXNzZW50ZSBvIG5vbiB2YWxpZG8uIExvIHN0cmVhbSBBVkkgcmlzdWx0ZXLDoCBkYW5uZWdnaWF0by4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIlF1ZXN0byBmaWxlIG5vbiBjb250aWVuZSBhbGN1bm8gc3RyZWFtIHJpcHJvZHVjaWJpbGUuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJRdWVzdG8gZmlsZSBub24gw6ggdmFsaWRvIGUgbm9uIHB1w7IgZXNzZXJlIHJpcHJvZG90dG8uIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiUXVlc3RvIGZpbGUgw6ggYWx0ZXJhdG8gZSBub24gcHXDsiBlc3NlcmUgcmlwcm9kb3R0by4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiUXVlc3RvIGZpbGUgw6ggaW5jb21wbGV0byBlIG5vbiBwdcOyIGVzc2VyZSByaXByb2RvdHRvLiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiSWwgdmlkZW8gaW4gcXVlc3RvIGZpbGUgcG90cmViYmUgbm9uIGVzc2VyZSByaXByb2RvdHRvIGNvcnJldHRhbWVudGUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIlF1ZXN0byBmaWxlIGNvbnRpZW5lIHRyb3BwaSBzdHJlYW0uIFJpcHJvZG90dGkgc29sbyBpIHByaW1pICVkIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyJOb24gw6ggc3RhdG8gdHJvdmF0byBhbGN1bm8gc3RyZWFtIHN1cHBvcnRhdG8uIFBvdHJlYmJlIGVzc2VyZSBuZWNlc3NhcmlvICIKKyJpbnN0YWxsYXJlIHVuIHBsdWdpbiBHU3RyZWFtZXIgZGkgdGlwbyBlc3RlbnNpb25lIFJUU1AgcGVyIGdsaSBzdHJlYW0gUmVhbCAiCisibWVkaWEuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisiTm9uIMOoIHN0YXRvIHRyb3ZhdG8gYWxjdW5vIHN0cmVhbSBzdXBwb3J0YXRvLiBQb3RyZWJiZSBlc3NlcmUgbmVjZXNzYXJpbyAiCisiYWJpbGl0YXJlIGFsdHJpIHByb3RvY29sbGkgZGkgdHJhc3BvcnRvIG9wcHVyZSBpbiBhbHRlcm5hdGl2YSBwb3RyZWJiZSAiCisibWFuY2FyZSBpbCBjb3JyZXR0byBwbHVnaW4gR1N0cmVhbWVyIGRpIHRpcG8gZXN0ZW5zaW9uZSBSVFNQLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKyJJbXBvc3NpYmlsZSBhcHJpcmUgaWwgZGlzcG9zaXRpdm8gYXVkaW8gcGVyIGxhIHJpcHJvZHV6aW9uZS4gSWwgZGlzcG9zaXRpdm8gIgorIsOoIGF0dHVhbG1lbnRlIHVzYXRvIGRhIHVuJ2FsdHJhIGFwcGxpY2F6aW9uZS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIkltcG9zc2liaWxlIGFwcmlyZSBpbCBkaXNwb3NpdGl2byBhdWRpbyBwZXIgbGEgcmlwcm9kdXppb25lLiBQZXJtZXNzaSBub24gIgorInN1ZmZpY2llbnRpIHBlciBhcHJpcmUgaWwgZGlzcG9zaXRpdm8uIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIkltcG9zc2liaWxlIGFwcmlyZSBpbCBkaXNwb3NpdGl2byBhdWRpbyBwZXIgbGEgcmlwcm9kdXppb25lLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKyJJbXBvc3NpYmlsZSBhcHJpcmUgaWwgZGV2aWNlIGF1ZGlvIHBlciBsYSByaXByb2R1emlvbmUuIFF1ZXN0YSB2ZXJzaW9uZSBkaSAiCisiT3BlbiBTb3VuZCBTeXN0ZW0gbm9uIMOoIHN1cHBvcnRhdGEgZGEgcXVlc3RvIGVsZW1lbnRvLiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJRdWVzdG8gZGV2aWNlIGF1ZGlvIG5vbiBzdXBwb3J0YSBsYSByaXByb2R1emlvbmUuIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICJFcnJvcmUgbmVsIHJpcHJvZHVycmUgbCdhdWRpby4iCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIlF1ZXN0byBkaXNwb3NpdGl2byBhdWRpbyBub24gc3VwcG9ydGEgbGEgcmVnaXN0cmF6aW9uZS4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJFcnJvcmUgbmVsIHJlZ2lzdHJhcmUgZGFsIGRpc3Bvc2l0aXZvIGF1ZGlvLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIkltcG9zc2liaWxlIGFwcmlyZSBpbCBkaXNwb3NpdGl2byBhdWRpbyBwZXIgbGEgcmVnaXN0cmF6aW9uZS4gUGVybWVzc2kgbm9uICIKKyJzdWZmaWNpZW50aSBwZXIgYXByaXJlIGlsIGRpc3Bvc2l0aXZvLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiSW1wb3NzaWJpbGUgYXByaXJlIGlsIGRpc3Bvc2l0aXZvIGF1ZGlvIHBlciBsYSByZWdpc3RyYXppb25lLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIiIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIlNvcmdlbnRlIHJlZ2lzdHJhemlvbmUiCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICJNaWNyb2Zvbm8iCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICJMaW5lYSBpbiIKKworbXNnaWQgIkludGVybmFsIENEIgorbXNnc3RyICJDRCBpbnRlcm5vIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIlNQRElGIGluIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIkFVWCAxIGluIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIkFVWCAyIGluIgorCisjLCBmdXp6eQorbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICJMb29wYmFjayIKKworIywgZnV6enkKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgIkxvb3BiYWNrIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJWb2x1bWUiCisKK21zZ2lkICJHYWluIgorbXNnc3RyICJHdWFkYWdubyIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIk1vbml0b3IiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJBbHRvcC4gaW5jb3Jwb3JhdG8iCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIkN1ZmZpYSIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICJMaW5lYSBvdXQiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIlNQRElGIG91dCIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiQVVYIDEgb3V0IgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICJBVVggMiBvdXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRXJyb3JlIG5lbCBsZWdnZXJlICVkIGJ5dGUgZGFsIGRldmljZSDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIkltcG9zc2liaWxlIG1hcHBhcmUgZGVpIGJ1ZmZlciBkYWwgZGV2aWNlIMKrJXPCuy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICJJbCBkcml2ZXIgZGVsIGRldmljZSDCqyVzwrsgbm9uIHN1cHBvcnRhIGFsY3VuIG1ldG9kbyBkaSBjYXR0dXJhIG5vdG8uIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIklsIGRyaXZlciBkZWwgZGV2aWNlIMKrJXPCuyBub24gc3VwcG9ydGEgYWxjdW4gbWV0b2RvIGRpIGNhdHR1cmEgbm90by4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIklsIGRldmljZSDCqyVzwrsgbm9uIMOoIHVuIGRpc3Bvc2l0aXZvIGRpIHVzY2l0YS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICJJbCBkZXZpY2Ugwqslc8K7IG5vbiDDqCB1biBkaXNwb3NpdGl2byBkaSBjYXR0dXJhLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIklsIGRldmljZSDCqyVzwrsgbm9uIMOoIHVuIGRpc3Bvc2l0aXZvIGRpIGNhdHR1cmEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICJJbCBkZXZpY2Ugwqslc8K7IG5vbiDDqCB1biBkaXNwb3NpdGl2byBkaSB1c2NpdGEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiSW1wb3NzaWJpbGUgb3R0ZW5lcmUgaSBwYXJhbWV0cmkgc3VsIGRldmljZSDCqyVzwrsiCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICIiCisiSWwgZGV2aWNlIGRpIGluZ3Jlc3NvIHZpZGVvIG5vbiBhY2NldHRhIGxhIG51b3ZhIGltcG9zdGF6aW9uZSBzdWwgZnJhbWUgcmF0ZS4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiIgorIklsIGRldmljZSBkaSBpbmdyZXNzbyB2aWRlbyBub24gYWNjZXR0YSBsYSBudW92YSBpbXBvc3RhemlvbmUgc3VsIGZyYW1lIHJhdGUuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICJJbCBkcml2ZXIgZGVsIGRldmljZSDCqyVzwrsgbm9uIHN1cHBvcnRhIGFsY3VuIG1ldG9kbyBkaSBjYXR0dXJhIG5vdG8uIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIklsIGRyaXZlciBkZWwgZGV2aWNlIMKrJXPCuyBub24gc3VwcG9ydGEgYWxjdW4gbWV0b2RvIGRpIGNhdHR1cmEgbm90by4iCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiIgorIklsIGRldmljZSBkaSBpbmdyZXNzbyB2aWRlbyBub24gYWNjZXR0YSBsYSBudW92YSBpbXBvc3RhemlvbmUgc3VsIGZyYW1lIHJhdGUuIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIlJlY3VwZXJvIGRlbGxlIGltcG9zdGF6aW9uaSBkZWwgc2ludG9uaXp6YXRvcmUgJWQgc3VsIGRldmljZSDCqyVzwrsgbm9uICIKKyJyaXVzY2l0by4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkVycm9yZSBuZWwgbGVnZ2VyZSAlZCBieXRlIGRhbCBkZXZpY2Ugwqslc8K7LiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICJJbCBkZXZpY2Ugwqslc8K7IG5vbiDDqCB1biBkaXNwb3NpdGl2byBkaSB1c2NpdGEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIkltcG9zdGF6aW9uZSBkZWxsJ2luZ3Jlc3NvICVkIHN1bCBkZXZpY2Ugwqslc8K7IG5vbiByaXVzY2l0YS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJJbXBvc3RhemlvbmUgZGVsbCdpbmdyZXNzbyAlZCBzdWwgZGV2aWNlIMKrJXPCuyBub24gcml1c2NpdGEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiUmVjdXBlcm8gZGVsbCdpbnRlbnNpdMOgIGRlbCBzZWduYWxlIHBlciBpbCBkZXZpY2Ugwqslc8K7IG5vbiByaXVzY2l0by4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIklsIGRyaXZlciBkZWwgZGV2aWNlIMKrJXPCuyBub24gc3VwcG9ydGEgYWxjdW4gbWV0b2RvIGRpIGNhdHR1cmEgbm90by4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICIiCisiSWwgZGV2aWNlIGRpIGluZ3Jlc3NvIHZpZGVvIG5vbiBhY2NldHRhIGxhIG51b3ZhIGltcG9zdGF6aW9uZSBzdWwgZnJhbWUgcmF0ZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisiSWwgZGV2aWNlIGRpIGluZ3Jlc3NvIHZpZGVvIG5vbiBhY2NldHRhIGxhIG51b3ZhIGltcG9zdGF6aW9uZSBzdWwgZnJhbWUgcmF0ZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIklsIGRldmljZSBkaSBpbmdyZXNzbyB2aWRlbyBub24gYWNjZXR0YSBsYSBudW92YSBpbXBvc3RhemlvbmUgc3VsIGZyYW1lIHJhdGUuIgorCisjLCBmdXp6eQorbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICJEZWNvZGlmaWNhIGRlbGwnaW1tYWdpbmUgSlBFRyBub24gcml1c2NpdGEiCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyJFcnJvcmUgbmVsbCdvdHRlbmVyZSBsZSBmdW56aW9uYWxpdMOgIHBlciBpbCBkZXZpY2Ugwqslc8K7OiBub24gw6ggdW4gZHJpdmVyICIKKyJ2NGwyLiBDb250cm9sbGFyZSBzZSBzaSB0cmF0dGEgZGkgdW4gZHJpdmVyIHY0bDEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiIgorIkludGVycm9nYXppb25lIGRlZ2xpIGF0dHJpYnV0aSBkZWxsJ2lucHV0ICVkIG5lbCBkZXZpY2UgJXMgbm9uIHJpdXNjaXRhIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJSZWN1cGVybyBkZWxsZSBpbXBvc3RhemlvbmkgZGVsIHNpbnRvbml6emF0b3JlICVkIHN1bCBkZXZpY2Ugwqslc8K7IG5vbiAiCisicml1c2NpdG8uIgorCisjICBub3JtIMOoIHVuIHBhcmFtZW50cm8gcGFyaSBhIG50c2MgbyBwYWwgKGUgZm9yc2UgYWx0cm8uIFNpIGV2aW5jZSBhZCBlc2VtcGlvCisjICBkYWwgY29tYW5kbyBkaSBWaWRlbyBMYW4gQ2xpZW4KKyMKKyMgICAgIHZsYyAtLWNvbG9yICAjICAgIHY0bDovZGV2L3ZpZGVvMjpub3JtPW50c2M6ZnJlcXVlbmN5PTc3MjUwOnNpemU9NjQweDQ4MDojICAgIGFkZXY9L2Rldi9kc3AyOmF1ZGlvPTAgKC4uLikKKyMKKyMgIFF1YWxjaGUgaWRlYSBkaXZlcnNhIGRhIG5vcm1hPyAgLUx1Y2EKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICJJbnRlcnJvZ2F6aW9uZSBkaSBub3JtIHN1bCBkZXZpY2Ugwqslc8K7IG5vbiByaXVzY2l0YS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlJlY3VwZXJvIGRlZ2xpIGF0dHJpYnV0aSBkZWkgY29udHJvbGxpIHN1bCBkZXZpY2Ugwqslc8K7IG5vbiByaXVzY2l0by4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiSW1wb3NzaWJpbGUgaWRlbnRpZmljYXJlIGlsIGRldmljZSDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlF1ZXN0byBub24gw6ggdW4gZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIkltcG9zc2liaWxlIGFwcmlyZSBpbCBkZXZpY2Ugwqslc8K7IGluIGxldHR1cmEgZSBzY3JpdHR1cmEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiSWwgZGV2aWNlIMKrJXPCuyBub24gw6ggdW4gZGlzcG9zaXRpdm8gZGkgY2F0dHVyYS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIklsIGRldmljZSDCqyVzwrsgbm9uIMOoIHVuIGRpc3Bvc2l0aXZvIGRpIHVzY2l0YS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICJJbCBkZXZpY2Ugwqslc8K7IG5vbiDDqCB1biBkaXNwb3NpdGl2byBkaSB1c2NpdGEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiSW1wb3NzaWJpbGUgYXByaXJlIGlsIGRldmljZSDCqyVzwrsgaW4gbGV0dHVyYSBlIHNjcml0dHVyYS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkltcG9zdGF6aW9uZSBkaSBub3JtIHBlciBpbCBkZXZpY2Ugwqslc8K7IG5vbiByaXVzY2l0YS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiUmVjdXBlcm8gZGVsbCdhdHR1YWxlIGZyZXF1ZW56YSBkaSBzaW50b25penphemlvbmUgcGVyIGlsIGRldmljZSDCqyVzwrsgbm9uICIKKyJyaXVzY2l0YS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorIkltcG9zdGF6aW9uZSBkZWxsJ2F0dHVhbGUgZnJlcXVlbnphIGRpIHNpbnRvbml6emF6aW9uZSBwZXIgaWwgZGV2aWNlIMKrJXPCuyBhICIKKyIlbHUgSHogbm9uIHJpdXNjaXRhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJSZWN1cGVybyBkZWxsJ2ludGVuc2l0w6AgZGVsIHNlZ25hbGUgcGVyIGlsIGRldmljZSDCqyVzwrsgbm9uIHJpdXNjaXRvLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiUmVjdXBlcm8gZGVsIHZhbG9yZSBwZXIgaWwgY29udHJvbGxvICVkIHN1bCBkZXZpY2Ugwqslc8K7IG5vbiByaXVzY2l0by4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJJbXBvc3RhemlvbmUgYWwgdmFsb3JlICVkIHBlciBpbCBjb250cm9sbG8gJWQgc3VsIGRldmljZSDCqyVzwrsgbm9uIHJpdXNjaXRvLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIlJlY3VwZXJvIGRlbGwnYXR0dWFsZSBpbmdyZXNzbyBzdWwgZGV2aWNlIMKrJXPCuyBub24gcml1c2NpdG8uIEZvcnNlIMOoIHVuICIKKyJkaXNwb3NpdGl2byByYWRpbyIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIlJlY3VwZXJvIGRlbGwnYXR0dWFsZSBpbmdyZXNzbyBzdWwgZGV2aWNlIMKrJXPCuyBub24gcml1c2NpdG8uIEZvcnNlIMOoIHVuICIKKyJkaXNwb3NpdGl2byByYWRpbyIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiSW1wb3N0YXppb25lIGRlbGwnaW5ncmVzc28gJWQgc3VsIGRldmljZSDCqyVzwrsgbm9uIHJpdXNjaXRhLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIiIKKyJJbCBjYW1iaW8gZGVsbGEgcmlzb2x1emlvbmUgZHVyYW50ZSBsJ2VzZWN1emlvbmUgbm9uIMOoIGFuY29yYSBzdXBwb3J0YXRvLiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAiSW1wb3NzaWJpbGUgb3BlcmFyZSBzZW56YSB1biBjbG9jayIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAiRXJyb3JlIGludGVybm8gbmVsbG8gc3RyZWFtIGRlaSBkYXRpLiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgZmxvdyBlcnJvci4iCisjfiBtc2dzdHIgIkVycm9yZSBpbnRlcm5vIG5lbCBmbHVzc28gZGkgZGF0aS4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBjYXB0dXJlIgorI34gbXNnc3RyICJJbCBkZXZpY2Ugwqslc8K7IG5vbiDDqCB1biBkaXNwb3NpdGl2byBkaSB1c2NpdGEuIgorCisjfiBtc2dpZCAiR290IHVuZXhwZWN0ZWQgZnJhbWUgc2l6ZSBvZiAldSBpbnN0ZWFkIG9mICV1LiIKKyN+IG1zZ3N0ciAiT3R0ZW51dGEgZGltZW5zaW9uZSBpbmF0dGVzYSBkZWwgZm90b2dyYW1tYTogJXUgaW52ZWNlIGRpICV1LiIKKworI34gbXNnaWQgIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiIgorI34gIlRlbnRhdGl2byBkaSBvdHRlbmVyZSBmb3RvZ3JhbW1pIHZpZGVvIGRhbCBkZXZpY2Ugwqslc8K7IG5vbiByaXVzY2l0by4iCisKKyN+IG1zZ2lkICJGYWlsZWQgYWZ0ZXIgJWQgdHJpZXMuIGRldmljZSAlcy4gc3lzdGVtIGVycm9yOiAlcyIKKyN+IG1zZ3N0ciAiRmFsbGl0byBkb3BvICVkIHRlbnRhdGl2aS4gRGV2aWNlICVzLiBFcnJvcmUgZGkgc2lzdGVtYTogJXMiCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICJCYXNzaSIKKworI34gbXNnaWQgIlRyZWJsZSIKKyN+IG1zZ3N0ciAiQWN1dGkiCisKKyN+IG1zZ2lkICJTeW50aCIKKyN+IG1zZ3N0ciAiU2ludGV0aXoiCisKKyN+IG1zZ2lkICJQQ00iCisjfiBtc2dzdHIgIlBDTSIKKworI34gbXNnaWQgIlNwZWFrZXIiCisjfiBtc2dzdHIgIkFsdG9wYXJsIgorCisjfiBtc2dpZCAiTGluZS1pbiIKKyN+IG1zZ3N0ciAiTGluZWEgaW4iCisKKyN+IG1zZ2lkICJDRCIKKyN+IG1zZ3N0ciAiQ0QiCisKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAiTWl4ZXIiCisKKyN+IG1zZ2lkICJQQ00tMiIKKyN+IG1zZ3N0ciAiUENNLTIiCisKKyN+IG1zZ2lkICJSZWNvcmQiCisjfiBtc2dzdHIgIlJlZ2lzdHIiCisKKyN+IG1zZ2lkICJJbi1nYWluIgorI34gbXNnc3RyICJHdWFkIGluIgorCisjfiBtc2dpZCAiT3V0LWdhaW4iCisjfiBtc2dzdHIgIkd1YWQgb3V0IgorCisjfiBtc2dpZCAiTGluZS0xIgorI34gbXNnc3RyICJDYW5hbGUgMSIKKworI34gbXNnaWQgIkxpbmUtMiIKKyN+IG1zZ3N0ciAiQ2FuYWxlIDIiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIkNhbmFsZSAzIgorCisjfiBtc2dpZCAiRGlnaXRhbC0xIgorI34gbXNnc3RyICJEaWdpdGFsIDEiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTIiCisjfiBtc2dzdHIgIkRpZ2l0YWwgMiIKKworI34gbXNnaWQgIkRpZ2l0YWwtMyIKKyN+IG1zZ3N0ciAiRGlnaXRhbCAzIgorCisjfiBtc2dpZCAiUGhvbmUtaW4iCisjfiBtc2dzdHIgIlRlbGVmb25vIGluIgorCisjfiBtc2dpZCAiUGhvbmUtb3V0IgorI34gbXNnc3RyICJUZWxlZm9ubyBvdXQiCisKKyN+IG1zZ2lkICJWaWRlbyIKKyN+IG1zZ3N0ciAiVmlkZW8iCisKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAiUmFkaW8iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIgorI34gbXNnc3RyICIiCisjfiAiSW1wb3NzaWJpbGUgYXByaXJlIGlsIGRldmljZSBhdWRpbyBwZXIgbGEgZ2VzdGlvbmUgZGVsbGEgcmVnb2xhemlvbmUgZGVsICIKKyN+ICJtaXhlci4iCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJJbXBvc3NpYmlsZSBhcHJpcmUgaWwgZGV2aWNlIGF1ZGlvIHBlciBsYSBnZXN0aW9uZSBkZWxsYSByZWdvbGF6aW9uZSBkZWwgIgorI34gIm1peGVyLiBRdWVzdGEgdmVyc2lvbmUgZGkgT3BlbiBTb3VuZCBTeXN0ZW0gbm9uIMOoIHN1cHBvcnRhdGEgZGEgcXVlc3RvICIKKyN+ICJlbGVtZW50by4iCisKKyN+IG1zZ2lkICJNYXN0ZXIiCisjfiBtc2dzdHIgIlByaW5jaXBhbGUiCisKKyN+IG1zZ2lkICJGcm9udCIKKyN+IG1zZ3N0ciAiRnJvbnRlIgorCisjfiBtc2dpZCAiUmVhciIKKyN+IG1zZ3N0ciAiRGlldHJvIgorCisjfiBtc2dpZCAiSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiQ3VmZmllIgorCisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICJDZW50cmFsZSIKKworIyBOZFQ6IGxmZSBhbmRyZWJiZSB0cmFkb3R0byBjb21lIGVmZmV0dGkgYSBiYXNzYSBmcmVxdWVuemEgZSBhbmRyZWJiZSBhcGVydG8gdW4gYnVnIHBlciBsb3cgZnJlcXVlbmN5IGVtaXR0ZXIgY2hlIGFsIGxpbWl0ZSDDqCBsYSBjYXNzYSBtYSBub24gaWwgY2FuYWxlCisjfiBtc2dpZCAiTEZFIgorI34gbXNnc3RyICJMRkUiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCIKKyN+IG1zZ3N0ciAiU3Vycm91bmQiCisKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICJMYXRlcmFsZSIKKworI34gbXNnaWQgIkFVWCBPdXQiCisjfiBtc2dzdHIgIkFVWCBvdXQiCisKKyN+IG1zZ2lkICIzRCBEZXB0aCIKKyN+IG1zZ3N0ciAiUHJvZm9uZGl0w6AgM0QiCisKKyN+IG1zZ2lkICIzRCBDZW50ZXIiCisjfiBtc2dzdHIgIkNlbnRybyAzRCIKKworI34gbXNnaWQgIjNEIEVuaGFuY2UiCisjfiBtc2dzdHIgIlByb2ZvbmRpdMOgIDNEIgorCisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICJUZWxlZm9ubyIKKworI34gbXNnaWQgIlZpZGVvIEluIgorI34gbXNnc3RyICJWaWRlbyBpbiIKKworI34gbXNnaWQgIkFVWCBJbiIKKyN+IG1zZ3N0ciAiQVVYIGluIgorCisjfiBtc2dpZCAiUmVjb3JkIEdhaW4iCisjfiBtc2dzdHIgIkd1YWRhZ25vIHJlZ2lzdHJhemlvbmUiCisKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAiR3VhZGFnbm8gdXNjaXRhIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAiSW5jcmVtZW50byBtaWNyb2Zvbm8iCisKKyN+IG1zZ2lkICJEaWFnbm9zdGljIgorI34gbXNnc3RyICJEaWFnbm9zdGljYSIKKworI34gbXNnaWQgIkJhc3MgQm9vc3QiCisjfiBtc2dzdHIgIkluY3JlbWVudG8gYmFzc2kiCisKKyN+IG1zZ2lkICJQbGF5YmFjayBQb3J0cyIKKyN+IG1zZ3N0ciAiUG9ydGUgcmlwcm9kdXppb25lIgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIklucHV0IgorCisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgIlNvcmdlbnRlIG1vbml0b3IiCisKKyN+IG1zZ2lkICJLZXlib2FyZCBCZWVwIgorI34gbXNnc3RyICJCZWVwIHRhc3RpZXJhIgorCisjfiBtc2dpZCAiU2ltdWxhdGUgU3RlcmVvIgorI34gbXNnc3RyICJTaW11bGEgc3RlcmVvIgorCisjfiBtc2dpZCAiU3RlcmVvIgorI34gbXNnc3RyICJTdGVyZW8iCisKKyN+IG1zZ2lkICJTdXJyb3VuZCBTb3VuZCIKKyN+IG1zZ3N0ciAiU3Vvbm8gc3Vycm91bmQiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIkd1YWRhZ25vIG1pY3JvZm9ubyIKKworI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICJTb3JnZW50ZSBhbHRvcGFybGFudGUiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAiU29yZ2VudGUgbWljcm9mb25vIgorCisjfiBtc2dpZCAiSmFjayIKKyN+IG1zZ3N0ciAiSmFjayIKKworIyB2ZWRpIHByaW1hIHBlciBMRkUKKyN+IG1zZ2lkICJDZW50ZXIgLyBMRkUiCisjfiBtc2dzdHIgIkNlbnRyYWxlIC8gTEZFIgorCisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAiTWl4IHN0ZXJlbyIKKworI34gbXNnaWQgIk1vbm8gTWl4IgorI34gbXNnc3RyICJNaXggbW9ubyIKKworI34gbXNnaWQgIklucHV0IE1peCIKKyN+IG1zZ3N0ciAiTWl4IGluZ3Jlc3NvIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAxIgorI34gbXNnc3RyICJNaWNyb2Zvbm8gMSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAiTWljcm9mb25vIDIiCisKKyN+IG1zZ2lkICJEaWdpdGFsIE91dCIKKyN+IG1zZ3N0ciAiVXNjaXRhIGRpZ2l0YWxlIgorCisjfiBtc2dpZCAiRGlnaXRhbCBJbiIKKyN+IG1zZ3N0ciAiSW5ncmVzc28gZGlnaXRhbGUiCisKKyN+IG1zZ2lkICJIRE1JIgorI34gbXNnc3RyICJIRE1JIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgIk1vZGVtIgorCisjfiBtc2dpZCAiSGFuZHNldCIKKyN+IG1zZ3N0ciAiQXVyaWNvbGFyZSIKKworI34gbXNnaWQgIk90aGVyIgorI34gbXNnc3RyICJBbHRybyIKKworI34gbXNnaWQgIk5vbmUiCisjfiBtc2dzdHIgIk5lc3N1bm8iCisKKyN+IG1zZ2lkICJPbiIKKyN+IG1zZ3N0ciAiQWNjZXNvIgorCisjfiBtc2dpZCAiT2ZmIgorI34gbXNnc3RyICJTcGVudG8iCisKKyN+IG1zZ2lkICJNdXRlIgorI34gbXNnc3RyICJFc2NsdXNvIgorCisjfiBtc2dpZCAiRmFzdCIKKyN+IG1zZ3N0ciAiVmVsb2NlIgorCisjfiBtc2dpZCAiVmVyeSBMb3ciCisjfiBtc2dzdHIgIk1vbHRvIGxlbnRvIgorCisjfiBtc2dpZCAiTG93IgorI34gbXNnc3RyICJMZW50byIKKworI34gbXNnaWQgIk1lZGl1bSIKKyN+IG1zZ3N0ciAiTWVkaW8iCisKKyN+IG1zZ2lkICJIaWdoIgorI34gbXNnc3RyICJBbHRvIgorCisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICJNb2x0byBhbHRvIgorCisjfiBtc2dpZCAiUHJvZHVjdGlvbiIKKyN+IG1zZ3N0ciAiUHJvZHV6aW9uZSIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCisjfiBtc2dzdHIgIk1pY3JvZm9ubyBwYW5uZWxsbyBmcm9udGFsZSIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgSW4iCisjfiBtc2dzdHIgIkxpbmVhIGluIHBhbm5lbGxvIGZyb250YWxlIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiQ3VmZmllIHBhbm5lbGxvIGZyb250YWxlIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBPdXQiCisjfiBtc2dzdHIgIkxpbmVhIG91dCBwYW5uZWxsbyBmcm9udGFsZSIKKworI34gbXNnaWQgIkdyZWVuIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmV0dG9yZSB2ZXJkZSIKKworI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZXR0b3JlIHJvc2EiCisKKyN+IG1zZ2lkICJCbHVlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmV0dG9yZSBibHUiCisKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5ldHRvcmUgYmlhbmNvIgorCisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZXR0b3JlIG5lcm8iCisKKyN+IG1zZ2lkICJHcmF5IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmV0dG9yZSBncmlnaW8iCisKKyN+IG1zZ2lkICJPcmFuZ2UgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZXR0b3JlIGFyYW5jaW9uZSIKKworI34gbXNnaWQgIlJlZCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5ldHRvcmUgcm9zc28iCisKKyN+IG1zZ2lkICJZZWxsb3cgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZXR0b3JlIGdpYWxsbyIKKworI34gbXNnaWQgIkdyZWVuIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmV0dG9yZSB2ZXJkZSBwYW5uZWxsbyBmcm9udGFsZSIKKworI34gbXNnaWQgIlBpbmsgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZXR0b3JlIHJvc2EgcGFubmVsbG8gZnJvbnRhbGUiCisKKyN+IG1zZ2lkICJCbHVlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmV0dG9yZSBibHUgcGFubmVsbG8gZnJvbnRhbGUiCisKKyN+IG1zZ2lkICJXaGl0ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5ldHRvcmUgYmlhbmNvIHBhbm5lbGxvIGZyb250YWxlIgorCisjfiBtc2dpZCAiQmxhY2sgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZXR0b3JlIG5lcm8gcGFubmVsbG8gZnJvbnRhbGUiCisKKyN+IG1zZ2lkICJHcmF5IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmV0dG9yZSBncmlnaW8gcGFubmVsbG8gZnJvbnRhbGUiCisKKyN+IG1zZ2lkICJPcmFuZ2UgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZXR0b3JlIGFyYW5jaW9uZSBwYW5uZWxsbyBmcm9udGFsZSIKKworI34gbXNnaWQgIlJlZCBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5ldHRvcmUgcm9zc28gcGFubmVsbG8gZnJvbnRhbGUiCisKKyN+IG1zZ2lkICJZZWxsb3cgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZXR0b3JlIGdpYWxsbyBwYW5uZWxsbyBmcm9udGFsZSIKKworIyAgaW50IHNwcmVhZDsgICAgICAgICAvKiBjb3B5IGZyb250IHRvIHN1cnIvY2VudGVyIGNoYW5uZWxzICovIAorI34gbXNnaWQgIlNwcmVhZCBPdXRwdXQiCisjfiBtc2dzdHIgIlVzY2l0YSBkaWZmdXNhIgorCisjfiBtc2dpZCAiRG93bm1peCIKKyN+IG1zZ3N0ciAiRG93bm1peCIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgSW5wdXQiCisjfiBtc2dzdHIgIkluZ3Jlc3NvIG1peGVyIHZpcnR1YWxlIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBPdXRwdXQiCisjfiBtc2dzdHIgIlVzY2l0YSBtaXhlciB2aXJ0dWFsZSIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgQ2hhbm5lbHMiCisjfiBtc2dzdHIgIkNhbmFsaSBtaXhlciB2aXJ0dWFsZSIKKworI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICJGdW56aW9uZSAlcyAlZCIKKworI34gbXNnaWQgIiVzIEZ1bmN0aW9uIgorI34gbXNnc3RyICJGdW56aW9uZSAlcyIKKworI34gbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgb24gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJFcnJvcmUgbmVsIGxlZ2dlcmUgJWQgYnl0ZSBzdWwgZGV2aWNlIMKrJXPCuy4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZW5xdWV1ZSBidWZmZXJzIGluIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiSW1wb3NzaWJpbGUgYWNjb2RhcmUgaSBidWZmZXIgbmVsIGRldmljZSDCqyVzwrsuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNvdW5kIHNlcnZlciIKKyN+IG1zZ3N0ciAiSW1wb3NzaWJpbGUgc3RhYmlsaXJlIGxhIGNvbm5lc3Npb25lIGFsIHNlcnZlciBhdWRpbyIKKworI34gbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBzb3VuZCBzZXJ2ZXIgY2FwYWJpbGl0aWVzIgorI34gbXNnc3RyICJJbnRlcnJvZ2F6aW9uZSBkZWxsZSBmdW56aW9uYWxpdMOgIGRlbCBzZXJ2ZXIgYXVkaW8gbm9uIHJpdXNjaXRhIgpkaWZmIC0tZ2l0IGEvcG8vamEucG8gYi9wby9qYS5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODg3MTI0Ci0tLSAvZGV2L251bGwKKysrIGIvcG8vamEucG8KQEAgLTAsMCArMSw5MzAgQEAKKyMgSmFwYW5lc2UgdHJhbnNsYXRpb24gZm9yIGdzdC1wbHVnaW5zLWdvb2QuCisjIFRoaXMgZmlsZSBpcyBwdXQgaW4gdGhlIHB1YmxpYyBkb21haW4uCisjCisjIFRha2FvIEZ1aml3YXJhIDx0YWthby5mdWppd2FyYUBzdW4uY29tPiwgMjAwNi4KKyMgTWFrb3RvIEthdG8gPG1ha290by5rdEBnbWFpbC5jb20+LCAyMDA5LTIwMTEuCisjIFRha2VzaGkgSGFtYXNha2kgPGhtYXRyanBAdXNlcnMuc291cmNlZm9yZ2UuanA+LCAyMDExLTIwMTIKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QgMS4wLjNcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxMi0xMi0yMiAyMDoxMyswOTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBUYWtlc2hpIEhhbWFzYWtpIDxobWF0cmpwQHVzZXJzLnNvdXJjZWZvcmdlLmpwPlxuIgorIkxhbmd1YWdlLVRlYW06IEphcGFuZXNlIDx0cmFuc2xhdGlvbi10ZWFtLWphQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD5cbiIKKyJMYW5ndWFnZTogamFcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJYLUdlbmVyYXRvcjogUG9lZGl0IDEuNS40XG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0xOyBwbHVyYWw9MDtcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICJKUEVH55S75YOP44Gu44OH44Kz44O844OJ44Gr5aSx5pWX44GX44G+44GX44GfIgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICInJXMnICwgJyVzJyIKKworbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAi44K144O844OQ44O844G45o6l57aa44Gn44GN44G+44Gb44KTIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIlVSTOOBjOaMh+WumuOBleOCjOOBpuOBhOOBvuOBm+OCk+OAgiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAi44K144O844OQ44O85ZCN44KS6Kej5rG644Gn44GN44G+44Gb44KT44CCIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIuOCteODvOODkOODvOOBuOOBruaOpee2muOCkueiuueri+OBp+OBjeOBvuOBm+OCk+OAgiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIuOCu+OCreODpeOCouaOpee2muOBruOCu+ODg+ODiOOCouODg+ODl+OBq+WkseaVl+OBl+OBvuOBl+OBn+OAgiIKKworIywgZnV6enkKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICLjg43jg4Pjg4jjg6/jg7zjgq/jgqjjg6njg7zjgYznmbrnlJ/jgZfjgZ/jgYvjgIHjgrXjg7zjg5Djg7zjgYzkuojmnJ/jgZvjgZrmjqXntprjgpLplonjgZjjgb7jgZfjgZ/jgIIiCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIuOCteODvOODkOOBjOS4jeato+OBquODh+ODvOOCv+OCkumAgeS/oeOBl+OBvuOBl+OBn+OAgiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICLjgrXjg7zjg5Djg7zjga/jgrfjg7zjgq/jgpLjgrXjg53jg7zjg4jjgZfjgabjgYTjgb7jgZvjgpPjgIIiCisKKyMgU1VOIFJFVklFV0VECittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICLlhaXlipvjgqrjg7zjg4fjgqPjgqrjgYzlrZjlnKjjgZfjgarjgYTjgYvnhKHlirnjgafjgYLjgovjgZ/jgoHjgIFBVkkg44K544OI44Oq44O844Og44Gv5aOK44KM44G+44GZ44CCIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICLjgZPjga7jg5XjgqHjgqTjg6vjgavjga/lho3nlJ/kuI3lj6/og73jgarjgrnjg4jjg6rjg7zjg6DjgYzlkKvjgb7jgozjgabjgYTjgb7jgZkiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIuOBk+OBruODleOCoeOCpOODq+OBr+S4jeato+OBquOBn+OCgeWGjeeUn+OBmeOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBm+OCkyIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIuOBk+OBruODleOCoeOCpOODq+OBr+WjiuOCjOOBpuOBhOOCi+OBn+OCgeWGjeeUn+OBmeOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBm+OCkyIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAi5LiN5q2j44Gq44Ki44OI44Og44K144Kk44K6IgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICLjgZPjga7jg5XjgqHjgqTjg6vjga/mraPluLjjgafjga/jgarjgYTjgZ/jgoHjgIHlho3nlJ/jgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZvjgpMiCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIuOBk+OBruODleOCoeOCpOODq+OBruS4reOBruWLleeUu+OBr+ato+OBl+OBj+WGjeeUn+OBp+OBjeOBquOBhOOBi+OCguOBl+OCjOOBvuOBm+OCkyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICIiCisi44GT44Gu44OV44Kh44Kk44Or44Gr44Gv5aSa44GP44Gu44K544OI44Oq44O844Og44GM5qC857SN44GV44KM44Gm44GE44KL44Gf44KB44CB5pyA5Yid44GuICVkIOWAi+OBruOBv+WGjeeUn+OBlyIKKyLjgb7jgZkiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorIuOCteODneODvOODiOOBl+OBpuOBhOOCi+OCueODiOODquODvOODoOOBjOimi+OBpOOBi+OCiuOBvuOBm+OCk+OAglJlYWwg44Oh44OH44Kj44Ki44K544OI44Oq44O844Og44Gu44Gf44KB44GuIgorIkdTdHJlYW1lciBSVFNQIOaLoeW8teODl+ODqeOCsOOCpOODs+OCkuOCpOODs+OCueODiOODvOODq+OBmeOCi+W/heimgeOBjOOBguOCi+OBi+OCguOBl+OCjOOBvuOBm+OCk+OAgiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorIuOCteODneODvOODiOOBl+OBpuOBhOOCi+OCueODiOODquODvOODoOOBjOimi+OBpOOBi+OCiuOBvuOBm+OCk+OAguWIpeOBrui7oumAgeODl+ODreODiOOCs+ODq+OCkuOCpOODs+OCueODiOODvOODqyIKKyLjgZnjgovlv4XopoHjgYzjgYLjgovjgYvjgoLjgZfjgozjgb7jgZvjgpPjgILjgb7jgZ/jga/jgIHmraPjgZfjgYQgR1N0cmVhbWVyIFJUU1Ag5ouh5by144OX44Op44Kw44Kk44Oz44GMIgorIuOBquOBhOOBruOBi+OCguOBl+OCjOOBvuOBm+OCk+OAgiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKyLlho3nlJ/nlKjjgavjgqrjg7zjg4fjgqPjgqrjg4fjg5DjgqTjgrnjgpLplovjgY/jgZPjgajjgYzjgafjgY3jgb7jgZvjgpPjgafjgZfjgZ/jgILjg4fjg5DjgqTjgrnjgYzku5bjga7jgqLjg5fjg6oiCisi44Kx44O844K344On44Oz44Gn5Yip55So44GV44KM44Gm44GE44G+44GZIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyLlho3nlJ/nlKjjgavjgqrjg7zjg4fjgqPjgqrjg4fjg5DjgqTjgrnjgpLplovjgY/jgZPjgajjgYzjgafjgY3jgb7jgZvjgpPjgafjgZfjgZ/jgILjg4fjg5DjgqTjgrnjgpLplovjgY/jgZ/jgoHjga4iCisi5qip6ZmQ44GM44GC44KK44G+44Gb44KT44CCIgorCisjIFNVTiBSRVZJRVdFRAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICLpn7Plo7Djg4fjg5DjgqTjgrnjgpLoqq3jgb/lj5bjgornlKjjgavplovjgY/jgZPjgajjgYzjgafjgY3jgb7jgZvjgpPjgIIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisi5YaN55Sf55So44Gr44Kq44O844OH44Kj44Kq44OH44OQ44Kk44K544KS6ZaL44GP44GT44Go44GM44Gn44GN44G+44Gb44KT44Gn44GX44Gf44CC44GT44Gu44OQ44O844K444On44Oz44GuICIKKyJPcGVuIFNvdW5kIFN5c3RlbSDjga/jgIHjgZPjga7jgqjjg6zjg6Hjg7Pjg4jjgavjgojjgaPjgabjgrXjg53jg7zjg4jjgZXjgozjgabjgYTjgb7jgZvjgpPjgIIiCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAi5YaN55Sf44Gv44GT44Gu44Kq44O844OH44Kj44Kq44OH44OQ44Kk44K544Gn44Gv44K144Od44O844OI44GV44KM44Gm44GE44G+44Gb44KT44CCIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICLjgqrjg7zjg4fjgqPjgqrlho3nlJ/jgqjjg6njg7zjgafjgZnjgIIiCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIuOBk+OBruOCquODvOODh+OCo+OCquODh+ODkOOCpOOCueOBq+OCiOOBo+OBpumMsumfs+OBr+OCteODneODvOODiOOBleOCjOOBpuOBhOOBvuOBm+OCk+OAgiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIuOCquODvOODh+OCo+OCquODh+ODkOOCpOOCueOBi+OCieOBrumMsumfs+aZguOBq+OCqOODqeODvOOBjOeZuueUn+OBl+OBvuOBl+OBn+OAgiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIumMsumfs+eUqOOBq+OCquODvOODh+OCo+OCquODh+ODkOOCpOOCueOCkumWi+OBj+OBk+OBqOOBjOOBp+OBjeOBvuOBm+OCk+OBp+OBl+OBn+OAguODh+ODkOOCpOOCueOCkumWi+OBj+OBn+OCgeOBriIKKyLmqKnpmZDjgYzjgYLjgorjgb7jgZvjgpPjgIIiCisKKyMgU1VOIFJFVklFV0VECittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICLpn7Plo7Djg4fjg5DjgqTjgrnjgpLpjLLpn7PnlKjjgavplovjgY/jgZPjgajjgYzjgafjgY3jgb7jgZvjgpPjgIIiCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICIiCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICLpjLLpn7Pjgr3jg7zjgrkiCisKKyMgU1VOIFJFVklFV0VECittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAi44Oe44Kk44Kv44Ot44OV44Kp44OzIgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAi44Op44Kk44Oz5YWl5YqbIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIuWGheiUtUNEIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIlNQRElG5YWl5YqbIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIkFVWCAx5YWl5YqbIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIkFVWCAy5YWl5YqbIgorCisjLCBmdXp6eQorbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICLjg6vjg7zjg5fjg5Djg4Pjgq8iCisKKyMsIGZ1enp5Cittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICLjg6vjg7zjg5fjg5Djg4Pjgq8iCisKKyMgU1VOIFJFVklFV0VECittc2dpZCAiVm9sdW1lIgorbXNnc3RyICLpn7Pph48iCisKKyMgU1VOIFJFVklFV0VECittc2dpZCAiR2FpbiIKK21zZ3N0ciAi44Ky44Kk44OzIgorCisjIFNVTiBSRVZJRVdFRAorbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIuODouODi+OCv+ODvCIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIuODk+ODq+ODiOOCpOODs+OCueODlOODvOOCqyIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAi44OY44OD44OJ44OV44Kp44OzIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIuODqeOCpOODs+WHuuWKmyIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiU1BESUblh7rlipsiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIkFVWCAx5Ye65YqbIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICJBVVggMuWHuuWKmyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIgorbXNnc3RyICLjg4fjg5DjgqTjgrkgJTIkcyDjgYvjgonjgIAlMSRkIOODkOOCpOODiOiqreOBv+i+vOOBv+aZguOBq+OCqOODqeODvOOBjOeZuueUn+OBl+OBvuOBl+OBn+OAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAi44OH44OQ44Kk44K5JyVzJ+OBjOS9nOalreOBp+OBjeOCi+ODk+ODh+OCquW9ouW8j+OBruaVsOOBiOS4iuOBkuOBq+WkseaVl+OBl+OBvuOBl+OBnyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICclcycg44GL44KJ44OQ44OD44OV44Kh44KS44Oe44OD44OX44Gn44GN44G+44Gb44KT44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICLjg4fjg5DjgqTjgrkgJyVzJyDjga7jg4njg6njgqTjg5Djga9JT+ODoeOCveODg+ODiSVk44KS44K144Od44O844OI44GX44Gm44GE44G+44Gb44KTIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAiIgorIuODh+ODkOOCpOOCuSAnJXMnIOOBruODieODqeOCpOODkOOBr+efpeOCieOCjOOBpuOBhOOCi+OBhOOBi+OBquOCi0lP44Oh44K944OD44OJ44KC44K144Od44O844OI44GX44Gm44GE44G+44GbIgorIuOCk+OAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICLjg4fjg5DjgqTjgrlgJXMn44Gv44OT44K444O854q25oWL44Gn44GZIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICLjg4fjg5DjgqTjgrkgJyVzJyDjga8gJWR4JWQg44Gn44Kt44Oj44OX44OB44Oj44Gn44GN44G+44Gb44KTIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICLjg4fjg5DjgqTjgrkgJyVzJyDjga/mjIflrprjgZXjgozjgZ/jg5Xjgqnjg7zjg57jg4Pjg4jjgafjgq3jg6Pjg5fjg4Hjg6PjgafjgY3jgb7jgZvjgpMiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIuODh+ODkOOCpOOCuSAnJXMnIOOBr+ODk+ODh+OCquOCreODo+ODl+ODgeODo+OCkuOCteODneODvOODiOOBl+OBpuOBhOOBvuOBm+OCkyIKKworIyBTVU4gUkVWSUVXRUQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICLjg4fjg5DjgqTjgrkgJyVzJyDkuIrjga7jg5Hjg6njg6Hjg7zjgr/jgpLlj5blvpfjgafjgY3jgb7jgZvjgpPjgIIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIuODk+ODh+OCquODh+ODkOOCpOOCueOBjOaWsOOBl+OBhOODleODrOODvOODoOODrOODvOODiOioreWumuOCkuWPl+OBkeS7mOOBkeOBvuOBm+OCk+OAgiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICLjg5Pjg4fjgqrjg4fjg5DjgqTjgrnjgYzmlrDjgZfjgYTjg5Xjg6zjg7zjg6Djg6zjg7zjg4joqK3lrprjgpLlj5fjgZHku5jjgZHjgb7jgZvjgpPjgIIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIuODh+ODkOOCpOOCuSAnJXMnIOOBruODieODqeOCpOODkOOBr0lP44Oh44K944OD44OJJWTjgpLjgrXjg53jg7zjg4jjgZfjgabjgYTjgb7jgZvjgpMiCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICclcycg44Gu44OJ44Op44Kk44OQ44GvSU/jg6Hjgr3jg4Pjg4klZOOCkuOCteODneODvOODiOOBl+OBpuOBhOOBvuOBm+OCkyIKKworIywgZnV6enkKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAi44OT44OH44Kq44OH44OQ44Kk44K544Gv44OQ44OD44OV44Kh44OX44O844Or44KS5L2c5oiQ44Gn44GN44G+44Gb44KT44Gn44GX44Gf44CCIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAi44OT44OH44Kq44OH44OQ44Kk44K544Gv44OQ44OD44OV44Kh44OX44O844Or44KS5L2c5oiQ44Gn44GN44G+44Gb44KT44Gn44GX44Gf44CCIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICLjg4fjg5DjgqTjgrkgJyUyJHMnIOS4iuOBruODgeODpeODvOODiuODvCAlMSRkIOOBruioreWumuOBruWPluW+l+OBq+WkseaVl+OBl+OBvuOBl+OBn+OAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLjg4fjg5DjgqTjgrknJXMnIOOBruiDveWKm+OCkuWPluW+l+OBmeOCi+aZguOBq+OCqOODqeODvOOBjOeZuueUn+OBl+OBvuOBl+OBn+OAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIuODh+ODkOOCpOOCuSAnJXMnIOOBr+ODgeODpeODvOODiuOBp+OBr+OBguOCiuOBvuOBm+OCk+OAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIuODh+ODkOOCpOOCuSAnJXMnIOS4iuOBruODqeOCuOOCquWFpeWKm+OBruWPluW+l+OBq+WkseaVl+OBl+OBvuOBl+OBn+OAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIuODh+ODkOOCpOOCuSAnJTIkcycg5LiK44Gu5YWl5YqbJTEkZCDjga7oqK3lrprjgavlpLHmlZfjgZfjgb7jgZfjgZ/jgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIuODh+ODkOOCpOOCuSAnJXMnIOOBruODn+ODpeODvOODiOeKtuaFi+OBruWkieabtOOBq+WkseaVl+OBl+OBvuOBl+OBnyIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICclcycg44Gu44OJ44Op44Kk44OQ44GvSU/jg6Hjgr3jg4Pjg4klZOOCkuOCteODneODvOODiOOBl+OBpuOBhOOBvuOBm+OCkyIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIuODk+ODh+OCquODh+ODkOOCpOOCueOBjOaWsOOBl+OBhOODleODrOODvOODoOODrOODvOODiOioreWumuOCkuWPl+OBkeS7mOOBkeOBvuOBm+OCk+OAgiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIuODk+ODh+OCquODh+ODkOOCpOOCueOBjOaWsOOBl+OBhOODleODrOODvOODoOODrOODvOODiOioreWumuOCkuWPl+OBkeS7mOOBkeOBvuOBm+OCk+OAgiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICLjg5Pjg4fjgqrjg4fjg5DjgqTjgrnjgYzmlrDjgZfjgYTjg5Xjg6zjg7zjg6Djg6zjg7zjg4joqK3lrprjgpLlj5fjgZHku5jjgZHjgb7jgZvjgpPjgIIiCisKKyMsIGZ1enp5Cittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIkpQRUfnlLvlg4/jga7jg4fjgrPjg7zjg4njgavlpLHmlZfjgZfjgb7jgZfjgZ8iCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyLjg4fjg5DjgqTjgrkgJyVzJyDjga7og73lipvjgpLlj5blvpfjgZnjgovmmYLjgavjgqjjg6njg7zjgYznmbrnlJ/jgZfjgb7jgZfjgZ86IHY0bDIg44OJ44Op44Kk44OQ44Gn44Gv44GC44KKIgorIuOBvuOBm+OCk+OAgnY0bDEg44OJ44Op44Kk44OQ44Gn44Gq44GE44GL44CB44OB44Kn44OD44Kv44GX44Gm44GP44Gg44GV44GE44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICUyJHMg5YaF44Gu5YWl5YqbICUxJGQg44Gu5bGe5oCn44Gu44Kv44Ko44Oq44O844Gr5aSx5pWX44GX44G+44GX44GfIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIuODh+ODkOOCpOOCuSAnJTIkcycg5LiK44Gu44OB44Ol44O844OK44O8ICUxJGQg44Gu6Kit5a6a44Gu5Y+W5b6X44Gr5aSx5pWX44GX44G+44GX44Gf44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICclcycg5LiK44Gu44OO44Or44Og44Gu5Y+W5b6X44Gr5aSx5pWX44GX44G+44GX44Gf44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICLjg4fjg5DjgqTjgrkgJyVzJyDjga7jgrPjg7Pjg4jjg63jg7zjg6vlsZ7mgKfjga7lj5blvpfjgavlpLHmlZfjgZfjgb7jgZfjgZ8iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAi44OH44OQ44Kk44K5JyVzJ+OCkueJueWumuOBp+OBjeOBvuOBm+OCk+OAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICLjgZPjgozjga/jg4fjg5DjgqTjgrkgJyVzJyDjgafjga/jgYLjgorjgb7jgZvjgpMiCisKKyMgU1VOIFJFVklFV0VECisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICclcycg44KS6Kqt44G/5Y+W44KK55So44Go5pu444GN6L6844G/55So44Gr6ZaL44GP44GT44Go44GM44Gn44GN44G+44Gb44KTIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICclcycg44Gv44Kt44Oj44OX44OB44Oj44OH44OQ44Kk44K544Gn44Gv44GC44KK44G+44Gb44KTIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICLjg4fjg5DjgqTjgrkgJyVzJyDjga/lh7rlipvjg4fjg5DjgqTjgrnjgafjga/jgYLjgorjgb7jgZvjgpMiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICLjg4fjg5DjgqTjgrkgJyVzJyDjga/lh7rlipvjg4fjg5DjgqTjgrnjgafjga/jgYLjgorjgb7jgZvjgpMiCisKKyMgU1VOIFJFVklFV0VECisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICclcycg44KS6Kqt44G/5Y+W44KK55So44Go5pu444GN6L6844G/55So44Gr6ZaL44GP44GT44Go44GM44Gn44GN44G+44Gb44KTIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLjg4fjg5DjgqTjgrkgJyVzJyDkuIrjga7jg47jg6vjg6Djga7oqK3lrprjgavlpLHmlZfjgZfjgb7jgZfjgZ/jgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLjg4fjg5DjgqTjgrkgJyVzJyDjga7nj77lnKjjga7jg4Hjg6Xjg7zjg4rjg7zjga7lkajms6LmlbDjga7lj5blvpfjgavlpLHmlZfjgZfjgb7jgZfjgZ8iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICclcycg44Gu44OB44Ol44O844OK44O844Gu5ZGo5rOi5pWw44GuICVsdSBIeiDjgbjjga7oqK3lrprjgavlpLHmlZfjgZfjgb7jgZfjgZ8iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICclcycg44Gu5L+h5Y+344Gu5by344GV44Gu5Y+W5b6X44Gr5aSx5pWX44GX44G+44GX44Gf44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICLjg4fjg5DjgqTjgrkgJyUyJHMnIOS4iuOBruOCs+ODs+ODiOODreODvOODqyAlMSRkIOOBruWApOOBruWPluW+l+OBq+WkseaVl+OBl+OBvuOBl+OBn+OAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIuODh+ODkOOCpOOCuSAnJTMkcycg5LiK44Gu44Kz44Oz44OI44Ot44O844OrICUyJGQg44Gu5YCk44KSICUxJGQg44G46Kit5a6a44GZ44KL44GT44Go44Gr5aSx5pWX44GX44G+44GXIgorIuOBn+OAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIuODh+ODkOOCpOOCuSAnJXMnIOS4iuOBruePvuWcqOOBruWFpeWKm+OBruWPluW+l+OBq+WkseaVl+OBl+OBvuOBl+OBn+OAguODqeOCuOOCquODh+ODkOOCpOOCueOBi+OCguOBl+OCjOOBvuOBmyIKKyLjgpMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIuODh+ODkOOCpOOCuSAnJXMnIOS4iuOBruePvuWcqOOBruWHuuWKm+OBruWPluW+l+OBq+WkseaVl+OBl+OBvuOBl+OBn+OAguODqeOCuOOCquODh+ODkOOCpOOCueOBi+OCguOBl+OCjOOBvuOBmyIKKyLjgpMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAi5Ye65YqbJWTjgpLjg4fjg5DjgqTjgrkgJXMg44Gr6Kit5a6a44Gn44GN44G+44Gb44KT44Gn44GX44Gf44CCIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAi5a6f6KGM5pmC44Gu6Kej5YOP5bqm5aSJ5pu044Gv44K144Od44O844OI44GV44KM44Gm44GE44G+44Gb44KT44CCIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICLjgq/jg63jg4Pjgq/jgarjgZfjgafjga/li5XkvZzjgafjgY3jgb7jgZvjgpPjgIIiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIuWGhemDqOODh+ODvOOCv+OCueODiOODquODvOODoOOCqOODqeODvCIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgZmxvdyBlcnJvci4iCisjfiBtc2dzdHIgIuWGhemDqOODh+ODvOOCv+ODleODreODvOOCqOODqeODvOOAgiIKKworI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAi44OH44OQ44Kk44K5ICclcycg44Gv44OT44OH44Kq44Kt44Oj44OX44OB44Oj44KS44K144Od44O844OI44GX44Gm44GE44G+44Gb44KTIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNvdW5kIHNlcnZlciIKKyN+IG1zZ3N0ciAi44K144Km44Oz44OJ44K144O844OQ44O844G444Gu5o6l57aa44Gr5aSx5pWX44GX44G+44GX44GfIgorCisjfiBtc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IHNvdW5kIHNlcnZlciBjYXBhYmlsaXRpZXMiCisjfiBtc2dzdHIgIuOCteOCpuODs+ODieOCteODvOODkOODvOOBruOCseOCpOODkeODk+ODquODhuOCo+OBruOCr+OCqOODquODvOOBq+WkseaVl+OBl+OBvuOBl+OBnyIKKworIyBTVU4gUkVWSUVXRUQKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICLkvY7pn7MiCisKKyMgU1VOIFJFVklFV0VECisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICLpq5jpn7MiCisKKyMgU1VOIFJFVklFV0VECisjfiBtc2dpZCAiU3ludGgiCisjfiBtc2dzdHIgIuOCt+ODs+OCuyIKKworIyBTVU4gUkVWSUVXRUQKKyN+IG1zZ2lkICJQQ00iCisjfiBtc2dzdHIgIlBDTSIKKworIyBTVU4gUkVWSUVXRUQKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICLjgrnjg5Tjg7zjgqsiCisKKyN+IG1zZ2lkICJMaW5lLWluIgorI34gbXNnc3RyICLjg6njgqTjg7PlhaXlipsiCisKKyMgU1VOIFJFVklFV0VECisjfiBtc2dpZCAiQ0QiCisjfiBtc2dzdHIgIkNEIgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgIk1peGVyIgorI34gbXNnc3RyICLjg5/jgq3jgrXjg7wiCisKKyMgU1VOIFJFVklFV0VECisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIlBDTS0yIgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgIlJlY29yZCIKKyN+IG1zZ3N0ciAi6Yyy6Z+zIgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgIkluLWdhaW4iCisjfiBtc2dzdHIgIuWFpeWKm+OCsuOCpOODsyIKKworIyBTVU4gUkVWSUVXRUQKKyN+IG1zZ2lkICJPdXQtZ2FpbiIKKyN+IG1zZ3N0ciAi5Ye65Yqb44Ky44Kk44OzIgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgIkxpbmUtMSIKKyN+IG1zZ3N0ciAi44Op44Kk44OzIDEiCisKKyMgU1VOIFJFVklFV0VECisjfiBtc2dpZCAiTGluZS0yIgorI34gbXNnc3RyICLjg6njgqTjg7MgMiIKKworIyBTVU4gUkVWSUVXRUQKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIuODqeOCpOODsyAzIgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgIkRpZ2l0YWwtMSIKKyN+IG1zZ3N0ciAi44OH44K444K/44OrIDEiCisKKyMgU1VOIFJFVklFV0VECisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICLjg4fjgrjjgr/jg6sgMiIKKworIyBTVU4gUkVWSUVXRUQKKyN+IG1zZ2lkICJEaWdpdGFsLTMiCisjfiBtc2dzdHIgIuODh+OCuOOCv+ODqyAzIgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgIlBob25lLWluIgorI34gbXNnc3RyICLjg5Xjgqnjg7PlhaXlipsiCisKKyMgU1VOIFJFVklFV0VECisjfiBtc2dpZCAiUGhvbmUtb3V0IgorI34gbXNnc3RyICLjg5Xjgqnjg7Plh7rlipsiCisKKyMgU1VOIFJFVklFV0VECisjfiBtc2dpZCAiVmlkZW8iCisjfiBtc2dzdHIgIuODk+ODh+OCqiIKKworIyBTVU4gUkVWSUVXRUQKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAi44Op44K444KqIgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCisjfiBtc2dzdHIgIumfs+WjsOODh+ODkOOCpOOCueOCkuODn+OCreOCteODvOOCs+ODs+ODiOODreODvOODq+eUqOOBq+mWi+OBj+OBk+OBqOOBjOOBp+OBjeOBvuOBm+OCk+OAgiIKKworI34gbXNnaWQgIiIKKyN+ICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIFRoaXMgdmVyc2lvbiBvZiAiCisjfiAidGhlIE9wZW4gU291bmQgU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIuODn+OCreOCteODvOOCs+ODs+ODiOODreODvOODq+eUqOOBq+OCquODvOODh+OCo+OCquODh+ODkOOCpOOCueOCkumWi+OBj+OBk+OBqOOBjOOBp+OBjeOBvuOBm+OCk+OBp+OBl+OBn+OAgiIKKyN+ICJPcGVuIFNvdW5kIFN5c3RlbeOBruOBk+OBruODkOODvOOCuOODp+ODs+OBp+OBr+OBk+OBruimgee0oOOBq+OCiOOBo+OBpuOCteODneODvOODiOOBleOCjOOBpuOBhOOBvuOBmyIKKyN+ICLjgpPjgIIiCisKKyN+IG1zZ2lkICJNYXN0ZXIiCisjfiBtc2dzdHIgIuODnuOCueOCvyIKKworI34gbXNnaWQgIkZyb250IgorI34gbXNnc3RyICLjg5Xjg63jg7Pjg4giCisKKyN+IG1zZ2lkICJSZWFyIgorI34gbXNnc3RyICLjg6rjgqIiCisKKyN+IG1zZ2lkICJIZWFkcGhvbmVzIgorI34gbXNnc3RyICLjg5jjg4Pjg4njg5Xjgqnjg7MiCisKKyN+IG1zZ2lkICJDZW50ZXIiCisjfiBtc2dzdHIgIuOCu+ODs+OCv+ODvCIKKworI34gbXNnaWQgIkxGRSIKKyN+IG1zZ3N0ciAiTEZFIgorCisjfiBtc2dpZCAiU3Vycm91bmQiCisjfiBtc2dzdHIgIuOCteODqeOCpuODs+ODiSIKKworI34gbXNnaWQgIlNpZGUiCisjfiBtc2dzdHIgIuOCteOCpOODiSIKKworI34gbXNnaWQgIkFVWCBPdXQiCisjfiBtc2dzdHIgIkFVWOWHuuWKmyIKKworIywgZnV6enkKKyN+IG1zZ2lkICIzRCBEZXB0aCIKKyN+IG1zZ3N0ciAi5pyA5aSn5rex5bqmOiAiCisKKyN+IG1zZ2lkICIzRCBDZW50ZXIiCisjfiBtc2dzdHIgIjNE44K744Oz44K/44O8IgorCisjLCBmdXp6eQorI34gbXNnaWQgIjNEIEVuaGFuY2UiCisjfiBtc2dzdHIgIuiJsuOCkuW8t+iqv+OBl+OBpuOBhOOBvuOBmSIKKworI34gbXNnaWQgIlRlbGVwaG9uZSIKKyN+IG1zZ3N0ciAi6Zu76KmxIgorCisjfiBtc2dpZCAiVmlkZW8gSW4iCisjfiBtc2dzdHIgIuODk+ODh+OCquWFpeWKmyIKKworI34gbXNnaWQgIkFVWCBJbiIKKyN+IG1zZ3N0ciAiQVVY5YWl5YqbIgorCisjfiBtc2dpZCAiUmVjb3JkIEdhaW4iCisjfiBtc2dzdHIgIumMsumfs+OCsuOCpOODsyIKKworI34gbXNnaWQgIk91dHB1dCBHYWluIgorI34gbXNnc3RyICLlh7rlipvjgrLjgqTjg7MiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEJvb3N0IgorI34gbXNnc3RyICLjg57jgqTjgq/jg63jg5Xjgqnjg7Pjg5bjg7zjgrnjg4giCisKKyN+IG1zZ2lkICJEaWFnbm9zdGljIgorI34gbXNnc3RyICLoqLrmlq0iCisKKyN+IG1zZ2lkICJCYXNzIEJvb3N0IgorI34gbXNnc3RyICLkvY7pn7Pjg5bjg7zjgrnjg4giCisKKyN+IG1zZ2lkICJQbGF5YmFjayBQb3J0cyIKKyN+IG1zZ3N0ciAi44OX44Os44Kk44OQ44OD44Kv44Od44O844OIIgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIuWFpeWKmyIKKworI34gbXNnaWQgIk1vbml0b3IgU291cmNlIgorI34gbXNnc3RyICLjg6Ljg4vjgr/jg7zjgr3jg7zjgrkiCisKKyN+IG1zZ2lkICJLZXlib2FyZCBCZWVwIgorI34gbXNnc3RyICLjgq3jg7zjg5zjg7zjg4njg5Pjg7zjg5fpn7MiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiU2ltdWxhdGUgU3RlcmVvIgorI34gbXNnc3RyICLlvavph5HjgpLooajnj77jgZfjgb7jgZkiCisKKyN+IG1zZ2lkICJTdGVyZW8iCisjfiBtc2dzdHIgIuOCueODhuODrOOCqiIKKworI34gbXNnaWQgIlN1cnJvdW5kIFNvdW5kIgorI34gbXNnc3RyICLjgrXjg6njgqbjg7Pjg4njgrXjgqbjg7Pjg4kiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIuODnuOCpOOCr+ODreODleOCqeODs+OCsuOCpOODsyIKKworI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICLjgrnjg5Tjg7zjgqvjgr3jg7zjgrkiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAi44Oe44Kk44Kv44Ot44OV44Kp44Oz44K944O844K5IgorCisjfiBtc2dpZCAiSmFjayIKKyN+IG1zZ3N0ciAi44K444Oj44OD44KvIgorCisjfiBtc2dpZCAiQ2VudGVyIC8gTEZFIgorI34gbXNnc3RyICLjgrvjg7Pjgr/jg7wgLyBMRkUiCisKKyN+IG1zZ2lkICJTdGVyZW8gTWl4IgorI34gbXNnc3RyICLjgrnjg4bjg6zjgqrjg5/jg4Pjgq/jgrkiCisKKyN+IG1zZ2lkICJNb25vIE1peCIKKyN+IG1zZ3N0ciAi44Oi44OO44Op44Or44Of44OD44Kv44K5IgorCisjfiBtc2dpZCAiSW5wdXQgTWl4IgorI34gbXNnc3RyICLlhaXlipvjg5/jg4Pjgq/jgrkiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDEiCisjfiBtc2dzdHIgIuODnuOCpOOCr+ODreODleOCqeODszEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDIiCisjfiBtc2dzdHIgIuODnuOCpOOCr+ODreODleOCqeODszIiCisKKyN+IG1zZ2lkICJEaWdpdGFsIE91dCIKKyN+IG1zZ3N0ciAi44OH44K444K/44Or5Ye65YqbIgorCisjfiBtc2dpZCAiRGlnaXRhbCBJbiIKKyN+IG1zZ3N0ciAi44OH44K444K/44Or5YWl5YqbIgorCisjfiBtc2dpZCAiSERNSSIKKyN+IG1zZ3N0ciAiSERNSSIKKworI34gbXNnaWQgIk1vZGVtIgorI34gbXNnc3RyICLjg6Ljg4fjg6AiCisKKyN+IG1zZ2lkICJIYW5kc2V0IgorI34gbXNnc3RyICLjg5jjg4Pjg4njgrvjg4Pjg4giCisKKyN+IG1zZ2lkICJPdGhlciIKKyN+IG1zZ3N0ciAi44Gd44Gu5LuWIgorCisjfiBtc2dpZCAiTm9uZSIKKyN+IG1zZ3N0ciAi44Gq44GXIgorCisjfiBtc2dpZCAiT24iCisjfiBtc2dzdHIgIuOCquODsyIKKworI34gbXNnaWQgIk9mZiIKKyN+IG1zZ3N0ciAi44Kq44OVIgorCisjfiBtc2dpZCAiTXV0ZSIKKyN+IG1zZ3N0ciAi44Of44Ol44O844OIIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkZhc3QiCisjfiBtc2dzdHIgIumAn+OBhCIKKworIywgZnV6enkKKyN+IG1zZ2lkICJWZXJ5IExvdyIKKyN+IG1zZ3N0ciAi5L2O5ZOB5L2NIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkxvdyIKKyN+IG1zZ3N0ciAi5L2O6Z+zIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1lZGl1bSIKKyN+IG1zZ3N0ciAi5Lit6Z+zIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkhpZ2giCisjfiBtc2dzdHIgIumrmOmfsyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJWZXJ5IEhpZ2giCisjfiBtc2dzdHIgIumrmOWTgeS9jSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJQcm9kdWN0aW9uIgorI34gbXNnc3RyICLjg5fjg63jg4Djgq/jgrfjg6fjg7MiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICLjg5Xjg63jg7Pjg4jjg5Hjg43jg6vjga7jg57jgqTjgq/jg63jg5Xjgqnjg7MiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIEluIgorI34gbXNnc3RyICLjg5Xjg63jg7Pjg4jjg5Hjg43jg6vjga7jg6njgqTjg7PlhaXlipsiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBIZWFkcGhvbmVzIgorI34gbXNnc3RyICLjg5Xjg63jg7Pjg4jjg5Hjg43jg6vjga7jg5jjg4Pjg4njg5Xjgqnjg7MiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIE91dCIKKyN+IG1zZ3N0ciAi44OV44Ot44Oz44OI44OR44ON44Or44Gu44Op44Kk44Oz5Ye65YqbIgorCisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICLnt5HoibLjgrPjg43jgq/jgr8iCisKKyN+IG1zZ2lkICJQaW5rIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi44OU44Oz44Kv6Imy44Kz44ON44Kv44K/IgorCisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIumdkuiJsuOCs+ODjeOCr+OCvyIKKworI34gbXNnaWQgIldoaXRlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi55m96Imy44Kz44ON44Kv44K/IgorCisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICLpu5LoibLjgrPjg43jgq/jgr8iCisKKyN+IG1zZ2lkICJHcmF5IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi44Kw44Os44O86Imy44Kz44ON44Kv44K/IgorCisjfiBtc2dpZCAiT3JhbmdlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi44Kq44Os44Oz44K46Imy44Kz44ON44Kv44K/IgorCisjfiBtc2dpZCAiUmVkIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi6LWk6Imy44Kz44ON44Kv44K/IgorCisjfiBtc2dpZCAiWWVsbG93IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi6buE6Imy44Kz44ON44Kv44K/IgorCisjLCBmdXp6eQorI34gbXNnaWQgIlNwcmVhZCBPdXRwdXQiCisjfiBtc2dzdHIgIuaDheWgseWHuuWKmzpcbiIKKworI34gbXNnaWQgIkRvd25taXgiCisjfiBtc2dzdHIgIuODgOOCpuODs+ODn+ODg+OCr+OCuSIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgSW5wdXQiCisjfiBtc2dzdHIgIuS7ruaDs+ODn+OCreOCteODvOWFpeWKmyIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgT3V0cHV0IgorI34gbXNnc3RyICLku67mg7Pjg5/jgq3jgrXjg7zlh7rlipsiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIENoYW5uZWxzIgorI34gbXNnc3RyICLku67mg7Pjg5/jgq3jgrXjg7zjg4Hjg6Pjg7Pjg43jg6siCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiJXMgJWQgRnVuY3Rpb24iCisjfiBtc2dzdHIgIuapn+iDvSIKKworIywgZnV6enkKKyN+IG1zZ2lkICIlcyBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAi5qmf6IO9IgorCisjfiBtc2dpZCAiR290IHVuZXhwZWN0ZWQgZnJhbWUgc2l6ZSBvZiAldSBpbnN0ZWFkIG9mICV1LiIKKyN+IG1zZ3N0ciAi5LqI5pyf44GX44Gq44GE44OV44Os44O844Og44K144Kk44K6ICglMiR1IOOBp+OBr+OBquOBjyAlMSR1KSDjgpLlj5blvpfjgZfjgb7jgZfjgZ/jgIIiCisKKyN+IG1zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIG9uIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiIgorI34gIuODh+ODkOOCpOOCuSAnJTIkcycg5LiK44GnICUxJGQg44OQ44Kk44OI44Gu6Kqt44G/6L6844G/5pmC44Gr44Ko44Op44O844GM55m655Sf44GX44G+44GX44Gf44CCIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkNvdWxkIG5vdCBlbnF1ZXVlIGJ1ZmZlcnMgaW4gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLjg4fjg5DjgqTjgrkgJyVzJyDjgYvjgonjg5Djg4Pjg5XjgqHjgpLjg57jg4Pjg5fjgafjgY3jgb7jgZvjgpPjgIIiCisKKyN+IG1zZ2lkICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIuODh+ODkOOCpOOCuSAnJXMnIOOBi+OCieODk+ODh+OCquODleODrOODvOODoOOBruWPluW+l+OBq+WkseaVl+OBl+OBvuOBl+OBn+OAgiIKKworI34gbXNnaWQgIkZhaWxlZCBhZnRlciAlZCB0cmllcy4gZGV2aWNlICVzLiBzeXN0ZW0gZXJyb3I6ICVzIgorI34gbXNnc3RyICIiCisjfiAiJWQg5Zue44Oq44OI44Op44Kk44GX44G+44GX44Gf44GM5aSx5pWX44GX44G+44GX44Gf44CC44OH44OQ44Kk44K5ICVz44CC44K344K544OG44Og44Ko44Op44O8OiAlcyIKKworI34gbXNnaWQgIiIKKyN+ICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4gTm90IGVub3VnaCBtZW1vcnkuIgorI34gbXNnc3RyICIiCisjfiAi44OH44OQ44Kk44K5ICclcycg44GL44KJ44OT44OH44Kq44OV44Os44O844Og44KS5Y+W5b6X44GX44KI44GG44Go44GX44G+44GX44Gf44GM5aSx5pWX44GX44G+44GX44Gf44CC44Oh44OiIgorI34gIuODquOBjOWNgeWIhuOBq+OBguOCiuOBvuOBm+OCk+OAgiIKKworI34gbXNnaWQgIk5vIGZyZWUgYnVmZmVycyBmb3VuZCBpbiB0aGUgcG9vbCBhdCBpbmRleCAlZC4iCisjfiBtc2dzdHIgIuOCpOODs+ODh+ODg+OCr+OCuSAlZCDjgafjg5fjg7zjg6vlhoXjgavnqbrjgY3jg5Djg4Pjg5XjgqHjgYzjgYLjgorjgb7jgZvjgpPjgIIiCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZ2V0IGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIuODh+ODkOOCpOOCuSAnJXMnIOOBi+OCieODkOODg+ODleOCoeOCkuWPluW+l+OBp+OBjeOBvuOBm+OCk+OBp+OBl+OBn+OAgiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBnZXQgZW5vdWdoIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIiIKKyN+ICLjg4fjg5DjgqTjgrkgJyVzJyDjgYvjgonljYHliIbjgarjg5Djg4Pjg5XjgqHjg7zpoJjln5/jgpLlj5blvpfjgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZvjgpPjgafjgZfjgZ8iCisKKyMgU1VOIFJFVklFV0VECisjLCBmdXp6eQorI34gbXNnaWQgIkNvdWxkIG5vdCByZWFkIGZyb20gQ0QuIgorI34gbXNnc3RyICLjg5XjgqHjgqTjg6sgXCIlc1wiIOOBq+abuOOBjei+vOOCgOOBk+OBqOOBjOOBp+OBjeOBvuOBm+OCk+OAgiIKKworIyBTVU4gUkVWSUVXRUQKKyMsIGZ1enp5CisjfiBtc2dpZCAiRGlzYyBpcyBub3QgYW4gQXVkaW8gQ0QuIgorI34gbXNnc3RyICLjg4fjg5DjgqTjgrnjgYzplovjgYTjgabjgYTjgb7jgZvjgpPjgIIiCisKKyMgU1VOIFJFVklFV0VECisjLCBmdXp6eQorI34gbXNnaWQgIkNvdWxkIG5vdCBzZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKKyN+IG1zZ3N0ciAiQ0Qg44OH44OQ44Kk44K544KS6Kqt44G/5Y+W44KK55So44Gr6ZaL44GP44GT44Go44GM44Gn44GN44G+44Gb44KT44CCIgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHBsYXkgYXVkaW8gdXNpbmcgYW55IG51bWJlciBvZiBvdXRwdXQgZWxlbWVudHMuIFNvbWUgIgorI34gInBvc3NpYmxlIGNob2ljZXMgYXJlIG9zc3NpbmssIGVzZHNpbmsgYW5kIGFsc2FzaW5rLiBUaGUgYXVkaW9zaW5rIGNhbiBiZSAiCisjfiAiYSBwYXJ0aWFsIHBpcGVsaW5lIGluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICLjgqrjg7zjg4fjgqPjgqrjgpLlho3nlJ/jgZnjgovjgajjgY3jgIFHU3RyZWFtZXIg44Gv5Lu75oSP44Gu5pWw44Gu5Ye65Yqb6KaB57Sg44KS5L2/55So44Gn44GN44G+44GZ44CC5L2/IgorI34gIueUqOOBp+OBjeOCi+WHuuWKm+imgee0oOOBr+OAgW9zc3NpbmvjgIFlc2RzaW5r44CB44GK44KI44GzIGFsc2FzaW5rIOOBp+OBmeOAgmF1ZGlvc2luayDjga/ljZgiCisjfiAi44Gq44KLIDEg44Gk44Gu6KaB57Sg44Gn44Gv44Gq44GP44CB44OR44Kk44OX44Op44Kk44Oz44Gu5LiA6YOo44Gr44Gq44KL44GT44Go44GM44Gn44GN44G+44GZ44CCIgorCisjIFNVTiBSRVZJRVdFRAorIywgZnV6enkKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiBwbGF5IHZpZGVvIHVzaW5nIGFueSBudW1iZXIgb2Ygb3V0cHV0IGVsZW1lbnRzLiBTb21lICIKKyN+ICJwb3NzaWJsZSBjaG9pY2VzIGFyZSB4dmltYWdlc2luaywgeGltYWdlc2luaywgc2RsdmlkZW9zaW5rIGFuZCBhYXNpbmsuICIKKyN+ICJUaGUgdmlkZW9zaW5rIGNhbiBiZSBhIHBhcnRpYWwgcGlwZWxpbmUgaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIuODk+ODh+OCquOCkuWGjeeUn+OBmeOCi+OBqOOBjeOAgUdTdHJlYW1lciDjga/ku7vmhI/jga7mlbDjga7lh7rlipvopoHntKDjgpLkvb/nlKjjgafjgY3jgb7jgZnjgILkvb/nlKjjgaciCisjfiAi44GN44KL5Ye65Yqb6KaB57Sg44Gv44CBeHZpZGVvc2lua+OAgXNkbHZpZGVvc2lua+OAgeOBiuOCiOOBsyBhYXNpbmsg44Gn44GZ44CCdmlkZW9zaW5rIOOBryIKKyN+ICLljZjjgarjgosgMSDjgaTjga7opoHntKDjgafjga/jgarjgY/jgIHjg5HjgqTjg5fjg6njgqTjg7Pjga7kuIDpg6jjgavjgarjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIIiCisKKyMgU1VOIFJFVklFV0VECisjfiBtc2dpZCAiIgorI34gIkdTdHJlYW1lciBjYW4gcHV0IHZpc3VhbGl6YXRpb24gcGx1Z2lucyBpbiBhIHBpcGVsaW5lIHRvIHRyYW5zZm9ybSBhdWRpbyAiCisjfiAic3RyZWFtIGluIHZpZGVvIGZyYW1lcy4gRGVmYXVsdCBpcyBnb29tIGJ1dCBtb3JlIHZpc3VhbGl6YXRpb24gcGx1Z2lucyAiCisjfiAid2lsbCBiZSBwb3J0ZWQgc29vbi4gVGhlIHZpc3VhbGl6YXRpb24gcGx1Z2luIGNhbiBiZSBhIHBhcnRpYWwgcGlwZWxpbmUgIgorI34gImluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJHU3RyZWFtZXIg44Gv6KaW6Kaa5YyW44OX44Op44Kw44Kk44Oz44KS44OR44Kk44OX44Op44Kk44Oz44Gr6Kit5a6a44GX44Gm44CB44Kq44O844OH44Kj44Kq44K544OI44Oq44O844OgIgorI34gIuOCkuODk+ODh+OCquODleODrOODvOODoOOBq+WkieaPm+OBp+OBjeOBvuOBmeOAguODh+ODleOCqeODq+ODiOOBryBnb29tIOOBp+OBmeOBjOOAgeOCiOOCiuWkmuOBj+OBruimluimmuWMliIKKyN+ICLjg5fjg6njgrDjgqTjg7PjgYzjgZnjgZDjgavnp7vmpI3jgZXjgozjgovkuojlrprjgafjgZnjgILoppbopprljJbjg5fjg6njgrDjgqTjg7Pjga/ljZjjgarjgosgMSDjgaTjga7opoHntKAiCisjfiAi44Gn44Gv44Gq44GP44CB44OR44Kk44OX44Op44Kk44Oz44Gu5LiA6YOo44Gr44Gq44KL44GT44Go44GM44Gn44GN44G+44GZ44CCIgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHJlY29yZCBhdWRpbyB1c2luZyBhbnkgbnVtYmVyIG9mIGlucHV0IGVsZW1lbnRzLiBTb21lICIKKyN+ICJwb3NzaWJsZSBjaG9pY2VzIGFyZSBvc3NzcmMsIGVzZHNyYyBhbmQgYWxzYXNyYy4gVGhlIGF1ZGlvIHNvdXJjZSBjYW4gYmUgIgorI34gImEgcGFydGlhbCBwaXBlbGluZSBpbnN0ZWFkIG9mIGp1c3Qgb25lIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAi44Kq44O844OH44Kj44Kq44KS6KiY6Yyy44GZ44KL44Go44GN44CBR1N0cmVhbWVyIOOBr+S7u+aEj+OBruaVsOOBruWFpeWKm+imgee0oOOCkuS9v+eUqOOBp+OBjeOBvuOBmeOAguS9vyIKKyN+ICLnlKjjgafjgY3jgovlhaXlipvopoHntKDjga/jgIFvc3NzcmPjgIFlc2RzcmPjgIHjgYrjgojjgbMgYWxzYXNyYyDjgafjgZnjgILjgqrjg7zjg4fjgqPjgqrjgr3jg7zjgrkiCisjfiAi44Gv5Y2Y44Gq44KLIDEg44Gk44Gu6KaB57Sg44Gn44Gv44Gq44GP44CB44OR44Kk44OX44Op44Kk44Oz44Gu5LiA6YOo44Gr44Gq44KL44GT44Go44GM44Gn44GN44G+44GZ44CCIgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHJlY29yZCB2aWRlbyBmcm9tIGFueSBudW1iZXIgb2YgaW5wdXQgZWxlbWVudHMuIFNvbWUgIgorI34gInBvc3NpYmxlIGNob2ljZXMgYXJlIHY0bHNyYyBhbmQgdmlkZW90ZXN0c3JjLiBUaGUgdmlkZW8gc291cmNlIGNhbiBiZSBhICIKKyN+ICJwYXJ0aWFsIHBpcGVsaW5lIGluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICLjg5Pjg4fjgqrjgpLoqJjpjLLjgZnjgovjgajjgY3jgIFHU3RyZWFtZXIg44Gv5Lu75oSP44Gu5pWw44Gu5YWl5Yqb6KaB57Sg44KS5L2/55So44Gn44GN44G+44GZ44CC5L2/55So44GnIgorI34gIuOBjeOCi+WFpeWKm+imgee0oOOBr+OAgXY0bHNyYyDjgYrjgojjgbMgdmlkZW90ZXN0c3JjIOOBp+OBmeOAguODk+ODh+OCquOCveODvOOCueOBr+WNmOOBquOCiyAxIOOBpCIKKyN+ICLjga7opoHntKDjgafjga/jgarjgY/jgIHjg5HjgqTjg5fjg6njgqTjg7Pjga7kuIDpg6jjgavjgarjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIIiCisKKyMgU1VOIFJFVklFV0VECisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgYXVkaW8gc291cmNlIgorI34gbXNnc3RyICLjg4fjg5Xjgqnjg6vjg4jjga4gR1N0cmVhbWVyIOOCquODvOODh+OCo+OCquOCveODvOOCuSIKKworIyBTVU4gUkVWSUVXRUQKKyN+IG1zZ2lkICJkZWZhdWx0IEdTdHJlYW1lciBhdWRpb3NpbmsiCisjfiBtc2dzdHIgIuODh+ODleOCqeODq+ODiOOBriBHU3RyZWFtZXIgYXVkaW9zaW5rIgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIHZpZGVvIHNvdXJjZSIKKyN+IG1zZ3N0ciAi44OH44OV44Kp44Or44OI44GuIEdTdHJlYW1lciDjg5Pjg4fjgqrjgr3jg7zjgrkiCisKKyMgU1VOIFJFVklFV0VECisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgdmlkZW9zaW5rIgorI34gbXNnc3RyICLjg4fjg5Xjgqnjg6vjg4jjga4gR1N0cmVhbWVyIHZpZGVvc2luayIKKworIyBTVU4gUkVWSUVXRUQKKyN+IG1zZ2lkICJkZWZhdWx0IEdTdHJlYW1lciB2aXN1YWxpemF0aW9uIHBsdWdpbiIKKyN+IG1zZ3N0ciAi44OH44OV44Kp44Or44OI44GuIEdTdHJlYW1lciDoppbopprljJbjg5fjg6njgrDjgqTjg7MiCisKKyMgU1VOIFJFVklFV0VECisjLCBmdXp6eQorI34gbXNnaWQgImRlc2NyaXB0aW9uIGZvciBkZWZhdWx0IEdTdHJlYW1lciBhdWRpb3NpbmsiCisjfiBtc2dzdHIgIuODh+ODleOCqeODq+ODiOOBriBHU3RyZWFtZXIgYXVkaW9zaW5rIgorCisjIFNVTiBSRVZJRVdFRAorIywgZnV6enkKKyN+IG1zZ2lkICJkZXNjcmlwdGlvbiBmb3IgZGVmYXVsdCBHU3RyZWFtZXIgYXVkaW9zcmMiCisjfiBtc2dzdHIgIuODh+ODleOCqeODq+ODiOOBriBHU3RyZWFtZXIg44Kq44O844OH44Kj44Kq44K944O844K5IgorCisjfiBtc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzLiciCisjfiBtc2dzdHIgIuODh+ODkOOCpOOCuSAnJXMnIOOBruOCs+ODs+ODiOODreODvOODq+WxnuaAp+OBruWPluW+l+OBq+WkseaVl+OBl+OBvuOBl+OBnyIKZGlmZiAtLWdpdCBhL3BvL2t5LnBvIGIvcG8va3kucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzYWZlNwotLS0gL2Rldi9udWxsCisrKyBiL3BvL2t5LnBvCkBAIC0wLDAgKzEsNDc1IEBACisjIFRyYW5zbGF0aW9uIG9mICdnc3QtcGx1Z2lucy1nb29kJyBtZXNzYWdlcyB0byBLaXJnaGl6LgorIyBDb3B5cmlnaHQgKEMpIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIElseWFzIEJha2lyb3YgPGp1c3RfaWx5YXNAeWFob28uY29tPiwgMjAwNy4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QgMC4xMC4yM1xuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDEwLTA1LTExIDE1OjM1KzAxMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA3LTExLTEzIDE3OjE2KzA2MDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IElseWFzIEJha2lyb3YgPGp1c3RfaWx5YXNAeWFob28uY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IEtpcmdoaXogPGkxOG4tdGVhbS1reS1reXJneXpAbGlzdHMuc291cmNlZm9yZ2UubmV0PlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlgtUG9lZGl0LUxhbmd1YWdlOiBLeXJneXpcbiIKKyJYLVBvZWRpdC1Db3VudHJ5OiBLWVJHWVpTVEFOXG4iCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzozMDIKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKK21zZ3N0ciAiXCIlc1wiICDRhNCw0LnQu9GLINC+0LrRg9GD0LPQsCDQsNGH0YvQu9Cz0LDQvSDQttC+0LouIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6MzE2Cittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4gVGhpcyB2ZXJzaW9uIG9mIHRoZSAiCisiT3BlbiBTb3VuZCBTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3MjIKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjcyMworbXNnaWQgIk1hc3RlciIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzI0Cittc2dpZCAiRnJvbnQiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjcyNQorbXNnaWQgIlJlYXIiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjcyNgorbXNnaWQgIkhlYWRwaG9uZXMiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjcyNworbXNnaWQgIkNlbnRlciIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzI4Cittc2dpZCAiTEZFIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3MjkKK21zZ2lkICJTdXJyb3VuZCIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzMwCittc2dpZCAiU2lkZSIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzMxCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzMyCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3MzMKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjczNAorbXNnaWQgIkFVWCBPdXQiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjczNQorbXNnaWQgIkJhc3MiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjczNgorbXNnaWQgIlRyZWJsZSIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzM3Cittc2dpZCAiM0QgRGVwdGgiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjczOAorbXNnaWQgIjNEIENlbnRlciIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzM5Cittc2dpZCAiM0QgRW5oYW5jZSIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzQwCittc2dpZCAiVGVsZXBob25lIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NDEKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NDIKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzQzIHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NDQKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NDUKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzQ2Cittc2dpZCAiVmlkZW8gSW4iCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc0NworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NDgKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzQ5Cittc2dpZCAiQVVYIEluIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NTAKK21zZ2lkICJQQ00iCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc1MSBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzUyCittc2dpZCAiUmVjb3JkIEdhaW4iCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc1MworbXNnaWQgIk91dHB1dCBHYWluIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NTQKK21zZ2lkICJNaWNyb3Bob25lIEJvb3N0IgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NTUKK21zZ2lkICJMb29wYmFjayIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzU2Cittc2dpZCAiRGlhZ25vc3RpYyIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzU3Cittc2dpZCAiQmFzcyBCb29zdCIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzU4Cittc2dpZCAiUGxheWJhY2sgUG9ydHMiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc1OQorbXNnaWQgIklucHV0IgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NjAgc3lzL29zczQvb3NzNC1taXhlci5jOjc2MQorbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc2MgorbXNnaWQgIk1vbml0b3IgU291cmNlIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NjMKK21zZ2lkICJLZXlib2FyZCBCZWVwIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NjQKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NjUKK21zZ2lkICJTaW11bGF0ZSBTdGVyZW8iCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc2NiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6Nzg2Cittc2dpZCAiU3RlcmVvIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NjcKK21zZ2lkICJTdXJyb3VuZCBTb3VuZCIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzY4Cittc2dpZCAiTWljcm9waG9uZSBHYWluIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NjkKK21zZ2lkICJTcGVha2VyIFNvdXJjZSIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzcwCittc2dpZCAiTWljcm9waG9uZSBTb3VyY2UiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc3MQorbXNnaWQgIkphY2siCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc3MgorbXNnaWQgIkNlbnRlciAvIExGRSIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzczCittc2dpZCAiU3RlcmVvIE1peCIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6Nzc0Cittc2dpZCAiTW9ubyBNaXgiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc3NQorbXNnaWQgIklucHV0IE1peCIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6Nzc2Cittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc3NworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6Nzc4Cittc2dpZCAiTWljcm9waG9uZSAxIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NzkKK21zZ2lkICJNaWNyb3Bob25lIDIiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc4MAorbXNnaWQgIkRpZ2l0YWwgT3V0IgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3ODEKK21zZ2lkICJEaWdpdGFsIEluIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3ODIKK21zZ2lkICJIRE1JIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3ODMKK21zZ2lkICJNb2RlbSIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6Nzg0Cittc2dpZCAiSGFuZHNldCIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6Nzg1Cittc2dpZCAiT3RoZXIiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc4NworbXNnaWQgIk5vbmUiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc4OAorbXNnaWQgIk9uIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3ODkKK21zZ2lkICJPZmYiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc5MAorbXNnaWQgIk11dGUiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc5MQorbXNnaWQgIkZhc3QiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc5MgorbXNnaWQgIlZlcnkgTG93IgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3OTMKK21zZ2lkICJMb3ciCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc5NAorbXNnaWQgIk1lZGl1bSIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6Nzk1Cittc2dpZCAiSGlnaCIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6Nzk2IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3OTcKK21zZ2lkICJWZXJ5IEhpZ2giCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc5OAorbXNnaWQgIlByb2R1Y3Rpb24iCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc5OQorbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjgwMAorbXNnaWQgIkZyb250IFBhbmVsIExpbmUgSW4iCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjgwMQorbXNnaWQgIkZyb250IFBhbmVsIEhlYWRwaG9uZXMiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjgwMgorbXNnaWQgIkZyb250IFBhbmVsIExpbmUgT3V0IgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4MDMKK21zZ2lkICJHcmVlbiBDb25uZWN0b3IiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjgwNAorbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4MDUKK21zZ2lkICJCbHVlIENvbm5lY3RvciIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6ODA2Cittc2dpZCAiV2hpdGUgQ29ubmVjdG9yIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4MDcKK21zZ2lkICJCbGFjayBDb25uZWN0b3IiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjgwOAorbXNnaWQgIkdyYXkgQ29ubmVjdG9yIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4MDkKK21zZ2lkICJPcmFuZ2UgQ29ubmVjdG9yIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4MTAKK21zZ2lkICJSZWQgQ29ubmVjdG9yIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4MTEKK21zZ2lkICJZZWxsb3cgQ29ubmVjdG9yIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4MTIKK21zZ2lkICJHcmVlbiBGcm9udCBQYW5lbCBDb25uZWN0b3IiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjgxMworbXNnaWQgIlBpbmsgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4MTQKK21zZ2lkICJCbHVlIEZyb250IFBhbmVsIENvbm5lY3RvciIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6ODE1Cittc2dpZCAiV2hpdGUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4MTYKK21zZ2lkICJCbGFjayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjgxNworbXNnaWQgIkdyYXkgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4MTgKK21zZ2lkICJPcmFuZ2UgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4MTkKK21zZ2lkICJSZWQgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4MjAKK21zZ2lkICJZZWxsb3cgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4MjEKK21zZ2lkICJTcHJlYWQgT3V0cHV0IgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4MjIKK21zZ2lkICJEb3dubWl4IgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4NjYKK21zZ2lkICJWaXJ0dWFsIE1peGVyIElucHV0IgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4NjgKK21zZ2lkICJWaXJ0dWFsIE1peGVyIE91dHB1dCIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6ODcwCittc2dpZCAiVmlydHVhbCBNaXhlciBDaGFubmVscyIKK21zZ3N0ciAiIgorCisjLiBUUkFOU0xBVE9SUzogbmFtZSArIG51bWJlciBvZiBhIHZvbHVtZSBtaXhlciBjb250cm9sCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6OTIxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorbXNnc3RyICIiCisKKyMuIFRSQU5TTEFUT1JTOiBuYW1lIG9mIGEgdm9sdW1lIG1peGVyIGNvbnRyb2wKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo5MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgRnVuY3Rpb24iCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1zaW5rLmM6NDk4IHN5cy9vc3M0L29zczQtc291cmNlLmM6MzY3Cittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LXNpbmsuYzo1MDggc3lzL29zczQvb3NzNC1zb3VyY2UuYzozNzcKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LXNpbmsuYzo1MTkgc3lzL29zczQvb3NzNC1zb3VyY2UuYzozODgKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgItCQ0LvQtNGL0L0gXCIlc1wiINC20LDQsdC00YvQutGC0Ysg0LDRh9Cw0LvQs9Cw0L0g0LbQvtC6LiIKKworIzogc3lzL29zczQvb3NzNC1zaW5rLmM6NTI4IHN5cy9vc3M0L29zczQtc291cmNlLmM6Mzk4Cittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LXNpbmsuYzo2NDQKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LXNpbmsuYzo2NTEKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1zb3VyY2UuYzo1MjAKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1zb3VyY2UuYzo1MjcKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICIiCmRpZmYgLS1naXQgYS9wby9sdC5wbyBiL3BvL2x0LnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYmQ5ODAKLS0tIC9kZXYvbnVsbAorKysgYi9wby9sdC5wbwpAQCAtMCwwICsxLDg4OSBAQAorIyBMaXRodWFuaWFuIHRyYW5zbGF0aW9uIGZvciBnc3QtcGx1Z2lucy1nb29kLgorIyBUaGlzIGZpbGUgaXMgcHV0IGluIHRoZSBwdWJsaWMgZG9tYWluLgorIyBHaW50YXV0YXMgTWlsaWF1c2thcyA8Z2ludGFzQGFrbC5sdD4sIDIwMDguCisjIEF1cmltYXMgxIxlcm5pdXMgPGF1cmlzYzRAZ21haWwuY29tPiwgMjAxMC4KKyMgxb15Z2ltYW50YXMgQmVydcSNa2EgPHVpZDBAYWtsLmx0PiwgMjAxMC4KK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QgMC4xMC4yMy4yXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTAtMDctMTYgMTk6MzQrMDMwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogxb15Z2ltYW50YXMgQmVydcSNa2EgPHVpZDBAYWtsLmx0PlxuIgorIkxhbmd1YWdlLVRlYW06IExpdGh1YW5pYW4gPGtvbXBfbHRAa29uZmVyZW5jaWpvcy5sdD5cbiIKKyJMYW5ndWFnZTogbHRcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTM7IHBsdXJhbD0obiUxMD09MSAmJiBuJTEwMCE9MTEgPyAwIDogbiUxMD49MiAmJiAobiIKKyIlMTAwPDEwIHx8IG4lMTAwPj0yMCkgPyAxIDogMik7XG4iCisiWC1HZW5lcmF0b3I6IFZpcnRhYWwgMC42LjFcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICJOZXBhdnlrbyBkZWtvZHVvdGkgSlBFRyBwYXZlaWtzbMSXbGlvIgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICLigJ4lc+KAnCBhdGxpZWthIOKAniVz4oCcIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJOZXBhdnlrbyBwcmlzaWp1bmd0aSBwcmllIHNlcnZlcmlvIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIk5lcGF2eWtvIHByaXNpanVuZ3RpIHByaWUgc2VydmVyaW8iCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIk5lcGF2eWtvIHByaXNpanVuZ3RpIHByaWUgZ2Fyc28gc2VydmVyaW8iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICIiCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICIiCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIk7El3JhIMSvdmVzdGllcyBnYXJzbyBhcmJhIGppcyBuZXRpbmthbWFzLCBBVkkgc3JhdXRhcyBidXMgc3VnYWRpbnRhcy4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIsWgaWFtZSBmYWlsZSBuxJdyYSBhdGt1cnRpbsWzIHNyYXV0xbMuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJGYWlsYXMgbmV0aW5rYW1hcyBpciBuZWdhbGkgYsWrdGkgYXRrdXJ0YXMuIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRmFpbGFzIHN1Z2FkaW50YXMgaXIgbmVnYWxpIGLFq3RpIGF0a3VydGFzLiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJGYWlsYXMgbmViYWlndGFzIGlyIG5lZ2FsaSBixat0aSBhdGt1cnRhcy4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIsWgaWFtZSBmYWlsZSBlc2FudGlzIHZhaXpkbyDEr3JhxaFhcyBnYWxpIGLFq3RpIGF0a3VydGFzIG5la29yZWt0acWha2FpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICLFoGlhbWUgZmFpbGUgcGVyIGRhdWcgc3JhdXTFsy4gR3JvamFtaSB0aWsgcGlybWllamkgJWQiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorIk5lcmFzdGEgcGFsYWlrb23FsyBzcmF1dMWzLiBKdW1zIGdhbGkgcmVpa8SXdGkgxK9kaWVndGkgR1N0cmVhbWVyIFJUU1AgIgorInBhcGlsZGluaW8gxK9za2llcMSvIFJlYWwgbWVkaWEgc3JhdXRhbXMuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisiTmVyYXN0YSBwYWxhaWtvbcWzIHNyYXV0xbMuIEp1bXMgZ2FsaSByZWlrxJd0aSBsZWlzdGkgZGF1Z2lhdSB0cmFuc3BvcnRvICIKKyJwcm90b2tvbMWzLCBhcmJhIGrFq3MgbmV0dXJpdGUgdGlua2FtbyBHU3RyZWFtZXIgUlRTUCBwYXBpbGRpbmlvIMSvc2tpZXBpby4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisiTmVwYXZ5a28gYXR2ZXJ0aSBnYXJzbyDEr3JlbmdpbmlvIGdyb2ppbXVpLiDErnJlbmdpbsSvIG5hdWRvamEga2l0YSBwcm9ncmFtYS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIk5lcGF2eWtvIGF0dmVydGkgZ2Fyc28gxK9yZW5naW5pbyBncm9qaW11aS4gSsWrcyBuZXR1cml0ZSBsZWlkaW1vIGF0dmVydGkgIgorIsSvcmVuZ2luxK8uIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIk5lcGF2eWtvIGF0dmVydGkgZ2Fyc28gxK9yZW5naW5pbyBncm9qaW11aS4gIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIk5lcGF2eWtvIGF0dmVydGkgZ2Fyc28gxK9yZW5naW5pbyBncm9qaW11aS4gxaBpcyBlbGVtZW50YXMgbmVwYWxhaWtvIMWhaW9zIE9wZW4gIgorIlNvdW5kIFN5c3RlbSB2ZXJzaWpvcy4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAixaBpcyBnYXJzbyDEr3JlbmdpbnlzIG5lcGFsYWlrbyBncm9qaW1vLiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAiR2Fyc28gZ3JvamltbyBrbGFpZGEuIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLFoGlzIGdhcnNvIMSvcmVuZ2lueXMgbmVwYWxhaWtvIGdyb2ppbW8uIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiS2xhaWRhIMSvcmHFoWFudCBpxaEgZ2Fyc28gxK9yZW5naW5pby4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJOZXBhdnlrbyBhdHZlcnRpIGdhcnNvIMSvcmVuZ2luaW8gxK9yYcWheW11aS4gSsWrcyBuZXR1cml0ZSBsZWlkaW1vIGF0dmVydGkgIgorIsSvcmVuZ2luxK8uIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICJOZXBhdnlrbyBhdHZlcnRpIGdhcnNvIMSvcmVuZ2luaW8gxK9yYcWheW11aS4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICIiCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICLErnJhxaF5bW8gxaFhbHRpbmlzIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWlrcm9mb25hcyIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIsSuZWluYW50aSBsaW5pamEiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiVmlkaW5pcyBDRCIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJTUERJRiDEr3Zlc3RpcyIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICJBVVggMSDEr3Zlc3RpcyIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJBVVggMiDEr3Zlc3RpcyIKKworIywgZnV6enkKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiUGVyZHVvdGkgcmF0dSIKKworIywgZnV6enkKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgIlBlcmR1b3RpIHJhdHUiCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIkdhcnN1bWFzIgorCittc2dpZCAiR2FpbiIKK21zZ3N0ciAiR2Fyc2luaW1hcyIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIk1vbml0b3JpdXMiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJJbnRlZ3J1b3RhcyBnYXJzaWFrYWxiaXMiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIkF1c2luxJdzIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIknFoWVpbmFudGkgbGluaWphIgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICJTUERJRiBpxaF2ZXN0aXMiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIkFVWCAxIGnFoXZlc3RpcyIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiQVVYIDIgacWhdmVzdGlzIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIktsYWlkYSBza2FpdGFudCAlZCBiYWl0dXMgKC3FsykgacWhIMSvcmVuZ2luaW8g4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIk5lcGF2eWtvIGnFoWTEl3N0eXRpIGJ1ZmVyacWzIGnFoSDEr3JlbmdpbmlvIOKAniVz4oCcIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAixK5yZW5naW5pbyDigJ4lc+KAnCB0dmFya3lrbMSXIG5lcGFsYWlrbyBqb2tpxbMgxb5pbm9txbMgxK9yYcWheW1vIGLFq2TFsy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAixK5yZW5naW5pbyDigJ4lc+KAnCB0dmFya3lrbMSXIG5lcGFsYWlrbyBqb2tpxbMgxb5pbm9txbMgxK9yYcWheW1vIGLFq2TFsy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIsSucmVuZ2lueXMg4oCeJXPigJwgbsSXcmEgacWhdmVzdGllcyDEr3JlbmdpbnlzLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIsSucmVuZ2lueXMg4oCeJXPigJwgbsSXcmEgxK9yYcWheW1vIMSvcmVuZ2lueXMuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAixK5yZW5naW55cyDigJ4lc+KAnCBuxJdyYSDEr3JhxaF5bW8gxK9yZW5naW55cy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIsSucmVuZ2lueXMg4oCeJXPigJwgbsSXcmEgacWhdmVzdGllcyDEr3JlbmdpbnlzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIk5lcGF2eWtvIMSvcmVuZ2luaW8g4oCeJXPigJwgcGFyYW1ldHLFsyIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIlZhaXpkbyDEr3Zlc3RpZXMgxK9yZW5naW55cyBuZXByacSXbcSXIG5hdWrFsyBrYWRyxbMgZGHFvm5pbyBudXN0YXR5bcWzLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICJWYWl6ZG8gxK92ZXN0aWVzIMSvcmVuZ2lueXMgbmVwcmnEl23ElyBuYXVqxbMga2FkcsWzIGRhxb5uaW8gbnVzdGF0eW3Fsy4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIsSucmVuZ2luaW8g4oCeJXPigJwgdHZhcmt5a2zElyBuZXBhbGFpa28gam9racWzIMW+aW5vbcWzIMSvcmHFoXltbyBixatkxbMuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIsSucmVuZ2luaW8g4oCeJXPigJwgdHZhcmt5a2zElyBuZXBhbGFpa28gam9racWzIMW+aW5vbcWzIMSvcmHFoXltbyBixatkxbMuIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIlZhaXpkbyDEr3Zlc3RpZXMgxK9yZW5naW55cyBuZXByacSXbcSXIG5hdWrFsyBrYWRyxbMgZGHFvm5pbyBudXN0YXR5bcWzLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5lcGF2eWtvIGdhdXRpIGRlcmludHV2byAlZCDEr3JlbmdpbnlqZSDigJ4lc+KAnCBwYXJhbWV0csWzLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS2xhaWRhIHNrYWl0YW50ICVkIGJhaXR1cyAoLcWzKSBpxaEgxK9yZW5naW5pbyDigJ4lc+KAnC4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAixK5yZW5naW55cyDigJ4lc+KAnCBuxJdyYSBpxaF2ZXN0aWVzIMSvcmVuZ2lueXMuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIk5lcGF2eWtvIG51c3RhdHl0aSDEr3Zlc3RpZXMgJWQgxK9yZW5naW55amUgJXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiTmVwYXZ5a28gbnVzdGF0eXRpIMSvdmVzdGllcyAlZCDEr3JlbmdpbnlqZSAlcy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJOZXBhdnlrbyBnYXV0aSDEr3JlbmdpbmlvIOKAniVz4oCcIHNpZ25hbG8gc3RpcHJ1bW8uIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICLErnJlbmdpbmlvIOKAniVz4oCcIHR2YXJreWtsxJcgbmVwYWxhaWtvIGpva2nFsyDFvmlub23FsyDEr3JhxaF5bW8gYsWrZMWzLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIlZhaXpkbyDEr3Zlc3RpZXMgxK9yZW5naW55cyBuZXByacSXbcSXIG5hdWrFsyBrYWRyxbMgZGHFvm5pbyBudXN0YXR5bcWzLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIlZhaXpkbyDEr3Zlc3RpZXMgxK9yZW5naW55cyBuZXByacSXbcSXIG5hdWrFsyBrYWRyxbMgZGHFvm5pbyBudXN0YXR5bcWzLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICJWYWl6ZG8gxK92ZXN0aWVzIMSvcmVuZ2lueXMgbmVwcmnEl23ElyBuYXVqxbMga2FkcsWzIGRhxb5uaW8gbnVzdGF0eW3Fsy4iCisKKyMsIGZ1enp5Cittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIk5lcGF2eWtvIGRla29kdW90aSBKUEVHIHBhdmVpa3NsxJdsaW8iCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyJLbGFpZGEgZ2F1bmFudCDEr3JlbmdpbmlvIOKAniVz4oCcIGZ1bmtjaWphczogdGFpIG7El3JhIHY0bDIgdHZhcmt5a2zEly4gIgorIlBhdGlrcmlua2l0ZSwgYXIgdGFpIHY0bDEgdHZhcmt5a2zEly4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICJOZXBhdnlrbyB1xb5rbGF1c3RpIMSvdmVzdGllcyAlZCDEr3JlbmdpbnlqZSAlcyBhdHJpYnV0xbMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmVwYXZ5a28gZ2F1dGkgZGVyaW50dXZvICVkIMSvcmVuZ2lueWplIOKAniVz4oCcIHBhcmFtZXRyxbMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmVwYXZ5a28gdcW+a2xhdXN0aSBub3JtYWzEl3MgxK9yZW5naW55amUg4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOZXBhdnlrbyBnYXV0aSB2YWxkeW1vIGF0cmlidXTFsyDEr3JlbmdpbnlqZSDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmVwYXZ5a28gbnVzdGF0eXRpIMSvcmVuZ2luaW8g4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlRhaSBuxJdyYSDEr3JlbmdpbnlzIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIk5lcGF2eWtvIGF0dmVydGkgxK9yZW5naW5pbyDigJ4lc+KAnCBza2FpdHltdWkgaXIgcmHFoXltdWkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAixK5yZW5naW55cyDigJ4lc+KAnCBuxJdyYSDEr3JhxaF5bW8gxK9yZW5naW55cy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIsSucmVuZ2lueXMg4oCeJXPigJwgbsSXcmEgacWhdmVzdGllcyDEr3JlbmdpbnlzLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgTTJNIGRldmljZS4iCittc2dzdHIgIsSucmVuZ2lueXMg4oCeJXPigJwgbsSXcmEgacWhdmVzdGllcyDEr3JlbmdpbnlzLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIk5lcGF2eWtvIGF0dmVydGkgxK9yZW5naW5pbyDigJ4lc+KAnCBza2FpdHltdWkgaXIgcmHFoXltdWkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJOZXBhdnlrbyBudXN0YXR5dGkgbm9ybWFsxJdzIMSvcmVuZ2luaXVpIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5lcGF2eWtvIGdhdXRpIMSvcmVuZ2luaW8g4oCeJXPigJwgZGFiYXJ0aW5pbyBkZXJpbnR1dm8gZGHFvm5pby4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiTmVwYXZ5a28gbnVzdGF0eXRpIMSvcmVuZ2luaW8g4oCeJXPigJwgZGVyaW50dXZvIGRhxb5uaW8gxK8gJWx1IEh6LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJOZXBhdnlrbyBnYXV0aSDEr3JlbmdpbmlvIOKAniVz4oCcIHNpZ25hbG8gc3RpcHJ1bW8uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOZXBhdnlrbyBnYXV0aSB2YWxkaWtsaW8gJWQgcmVpa8WhbcSXcyDEr3JlbmdpbnlqZSDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5lcGF2eWtvIG51c3RhdHl0aSB2YWxkaWtsaW8gJTIkZCDEr3JlbmdpbnlqZSDigJ4lMyRz4oCcIHJlaWvFoW3El3MgJTEkZC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJOZXBhdnlrbyBnYXV0aSBkYWJhcnRpbsSXcyDEr3Zlc3RpZXMgxK9yZW5naW55amUg4oCeJXPigJwuIEdhbGLFq3QgdGFpIHJhZGlqbyAiCisixK9yZW5naW55cyIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIk5lcGF2eWtvIGdhdXRpIGRhYmFydGluxJdzIMSvdmVzdGllcyDEr3JlbmdpbnlqZSDigJ4lc+KAnC4gR2FsYsWrdCB0YWkgcmFkaWpvICIKKyLEr3JlbmdpbnlzIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJOZXBhdnlrbyBudXN0YXR5dGkgxK92ZXN0aWVzICVkIMSvcmVuZ2lueWplICVzLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIkdhbGlteWLEl3Mga2Vpc3RpIHNraXJpYW3EhWrEhSBnZWLEhSBvcGVyYWNpam9zIHZ5a2R5bW8gbWV0dSBkYXIgbsSXcmEuIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICJOZWdhbGkgdmVpa3RpIGJlIGxhaWtyb2TFvmlvIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBzdHJlYW0gZXJyb3IuIgorI34gbXNnc3RyICJWaWRpbsSXIGR1b21lbsWzIHNyYXV0byBrbGFpZGEuIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAiVmlkaW7ElyBkdW9tZW7FsyBzcmF1dG8ga2xhaWRhLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIsSucmVuZ2lueXMg4oCeJXPigJwgbsSXcmEgacWhdmVzdGllcyDEr3JlbmdpbnlzLiIKKworI34gbXNnaWQgIkdvdCB1bmV4cGVjdGVkIGZyYW1lIHNpemUgb2YgJXUgaW5zdGVhZCBvZiAldS4iCisjfiBtc2dzdHIgIkdhdXRhcyBuZXRpa8SXdGFzIGthZHJvIGR5ZGlzICV1IHZpZXRvamUgJXUuIgorCisjfiBtc2dpZCAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJOZXBhdnlrbyBnYXV0aSB2YWl6ZG8ga2FkcsWzIGnFoSDEr3JlbmdpbmlvIOKAniVz4oCcLiIKKworI34gbXNnaWQgIkZhaWxlZCBhZnRlciAlZCB0cmllcy4gZGV2aWNlICVzLiBzeXN0ZW0gZXJyb3I6ICVzIgorI34gbXNnc3RyICJOZXBhdnlrbyBwbyAlZCBiYW5keW3Fsy4gxK5yZW5naW55cyAlcy4gU2lzdGVtb3Mga2xhaWRhOiAlcyIKKworI34gbXNnaWQgIkJhc3MiCisjfiBtc2dzdHIgIsW9ZW1pIGRhxb5uaWFpIgorCisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICJBdWvFoXRpIGRhxb5uaWFpIgorCisjfiBtc2dpZCAiU3ludGgiCisjfiBtc2dzdHIgIlNpbnRlemF0b3JpdXMiCisKKyN+IG1zZ2lkICJQQ00iCisjfiBtc2dzdHIgIlBDTSIKKworI34gbXNnaWQgIlNwZWFrZXIiCisjfiBtc2dzdHIgIkdhcnNpYWthbGJpYWkiCisKKyN+IG1zZ2lkICJMaW5lLWluIgorI34gbXNnc3RyICLErnZlZGltYXMiCisKKyN+IG1zZ2lkICJDRCIKKyN+IG1zZ3N0ciAiQ0QiCisKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAiTWFpxaFpa2xpcyIKKworI34gbXNnaWQgIlBDTS0yIgorI34gbXNnc3RyICJQQ00tMiIKKworI34gbXNnaWQgIlJlY29yZCIKKyN+IG1zZ3N0ciAixK5yYcWheW1hcyIKKworI34gbXNnaWQgIkluLWdhaW4iCisjfiBtc2dzdHIgIkdhcnNpbmltbyByaWJvc2UiCisKKyN+IG1zZ2lkICJPdXQtZ2FpbiIKKyN+IG1zZ3N0ciAiVcW+IGdhcnNpbmltbyByaWLFsyIKKworI34gbXNnaWQgIkxpbmUtMSIKKyN+IG1zZ3N0ciAiTGluaWphLTEiCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgIkxpbmlqYS0yIgorCisjfiBtc2dpZCAiTGluZS0zIgorI34gbXNnc3RyICJMaW5pamEtMyIKKworI34gbXNnaWQgIkRpZ2l0YWwtMSIKKyN+IG1zZ3N0ciAiU2thaXRtZW5pbmlzLTEiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTIiCisjfiBtc2dzdHIgIlNrYWl0bWVuaW5pcy0yIgorCisjfiBtc2dpZCAiRGlnaXRhbC0zIgorI34gbXNnc3RyICJTa2FpdG1lbmluaXMtMyIKKworI34gbXNnaWQgIlBob25lLWluIgorI34gbXNnc3RyICJUZWxlZm9uYXMtxK92IgorCisjfiBtc2dpZCAiUGhvbmUtb3V0IgorI34gbXNnc3RyICJUZWxlZm9uYXMtacWhdiIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICJWaWRlbyIKKworI34gbXNnaWQgIlJhZGlvIgorI34gbXNnc3RyICJSYWRpamFzIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKKyN+IG1zZ3N0ciAiTmVwYXZ5a28gYXR2ZXJ0aSBnYXJzbyDEr3JlbmdpbmlvIG1hacWhaWtsaW8gdmFsZHltbyBhcGRvcm9qaW11aS4iCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJOZXBhdnlrbyBhdHZlcnRpIGdhcnNvIMSvcmVuZ2luaW8gbWFpxaFpa2xpbyB2YWxkeW1vIGFwZG9yb2ppbXVpLiDFoGlzICIKKyN+ICJlbGVtZW50YXMgbmVwYWxhaWtvIMWhaW9zIE9wZW4gU291bmQgU3lzdGVtIHZlcnNpam9zLiIKKworI34gbXNnaWQgIk1hc3RlciIKKyN+IG1zZ3N0ciAiUGFncmluZGluaXMiCisKKyN+IG1zZ2lkICJGcm9udCIKKyN+IG1zZ3N0ciAiUHJpZWtpbmlzIgorCisjfiBtc2dpZCAiUmVhciIKKyN+IG1zZ3N0ciAiR2FsaW5pcyIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIkF1c2luxJdzIgorCisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICJWaWR1cmluaXMiCisKKyN+IG1zZ2lkICJMRkUiCisjfiBtc2dzdHIgIkxGRSIKKworI34gbXNnaWQgIlN1cnJvdW5kIgorI34gbXNnc3RyICJTdXBhbnRpcyIKKworI34gbXNnaWQgIlNpZGUiCisjfiBtc2dzdHIgIsWgb25pbmlzIgorCisjfiBtc2dpZCAiQVVYIE91dCIKKyN+IG1zZ3N0ciAiQVVYIGnFoXZlc3RpcyIKKworI34gbXNnaWQgIjNEIERlcHRoIgorI34gbXNnc3RyICIzRCBnaWx1bWluaXMiCisKKyN+IG1zZ2lkICIzRCBDZW50ZXIiCisjfiBtc2dzdHIgIjNEIHZpZHVyaW5pcyIKKworI34gbXNnaWQgIjNEIEVuaGFuY2UiCisjfiBtc2dzdHIgIjNEIHBha2VsdGFzIgorCisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICJUZWxlZm9uYXMiCisKKyN+IG1zZ2lkICJWaWRlbyBJbiIKKyN+IG1zZ3N0ciAiVmFpemRvIMSvdmVzdGlzIgorCisjfiBtc2dpZCAiQVVYIEluIgorI34gbXNnc3RyICJBVVggxK92ZXN0aXMiCisKKyN+IG1zZ2lkICJSZWNvcmQgR2FpbiIKKyN+IG1zZ3N0ciAixK5yYcWheW1vIGdhcnNpbmltYXMiCisKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAiScWhdmVzdGllcyBnYXJzaW5pbWFzIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAiTWlrcm9mb25vIHBhZ2Fyc2luaW1hcyIKKworI34gbXNnaWQgIkRpYWdub3N0aWMiCisjfiBtc2dzdHIgIkRpYWdub3N0aWthIgorCisjfiBtc2dpZCAiQmFzcyBCb29zdCIKKyN+IG1zZ3N0ciAixb1lbcWzasWzIGRhxb5uacWzIHN1c3RpcHJpbmltYXMiCisKKyN+IG1zZ2lkICJQbGF5YmFjayBQb3J0cyIKKyN+IG1zZ3N0ciAiR3JvamltbyBwcmlldmFkYWkiCisKKyN+IG1zZ2lkICJJbnB1dCIKKyN+IG1zZ3N0ciAixK52ZXN0aXMiCisKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTW9uaXRvcmlhdXMgxaFhbHRpbmlzIgorCisjfiBtc2dpZCAiS2V5Ym9hcmQgQmVlcCIKKyN+IG1zZ3N0ciAiS2xhdmlhdMWrcm9zIHB5cHPEl2ppbWFzIgorCisjfiBtc2dpZCAiU2ltdWxhdGUgU3RlcmVvIgorI34gbXNnc3RyICJJbWl0dW90aSBzdGVyZW8iCisKKyN+IG1zZ2lkICJTdGVyZW8iCisjfiBtc2dzdHIgIlN0ZXJlbyIKKworI34gbXNnaWQgIlN1cnJvdW5kIFNvdW5kIgorI34gbXNnc3RyICJFcmR2aW5pcyBnYXJzYXMiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIk1pa3JvZm9ubyBnYXJzaW5pbWFzIgorCisjfiBtc2dpZCAiU3BlYWtlciBTb3VyY2UiCisjfiBtc2dzdHIgIkdhcnNpYWthbGJpbyDFoWFsdGluaXMiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTWlrcm9mb25vIMWhYWx0aW5pcyIKKworI34gbXNnaWQgIkphY2siCisjfiBtc2dzdHIgIkphY2siCisKKyN+IG1zZ2lkICJDZW50ZXIgLyBMRkUiCisjfiBtc2dzdHIgIkNlbnRyYXMgLyBMRkUiCisKKyN+IG1zZ2lkICJTdGVyZW8gTWl4IgorI34gbXNnc3RyICJTdGVyZW8gbWFpxaFhIgorCisjfiBtc2dpZCAiTW9ubyBNaXgiCisjfiBtc2dzdHIgIk1vbm8gbWFpxaFhIgorCisjfiBtc2dpZCAiSW5wdXQgTWl4IgorI34gbXNnc3RyICLErnZlc3RpZXMgbWFpxaFhIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAxIgorI34gbXNnc3RyICJNaWtyb2ZvbmFzIDEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDIiCisjfiBtc2dzdHIgIk1pa3JvZm9uYXMgMiIKKworI34gbXNnaWQgIkRpZ2l0YWwgT3V0IgorI34gbXNnc3RyICJTa2FpdG1lbmluxJcgacWhdmVzdGlzIgorCisjfiBtc2dpZCAiRGlnaXRhbCBJbiIKKyN+IG1zZ3N0ciAiU2thaXRtZW5pbsSXIMSvdmVzdGlzIgorCisjfiBtc2dpZCAiSERNSSIKKyN+IG1zZ3N0ciAiSERNSSIKKworI34gbXNnaWQgIk1vZGVtIgorI34gbXNnc3RyICJNb2RlbWFzIgorCisjfiBtc2dpZCAiSGFuZHNldCIKKyN+IG1zZ3N0ciAiUmFnZWxpcyIKKworI34gbXNnaWQgIk90aGVyIgorI34gbXNnc3RyICJLaXRhIgorCisjfiBtc2dpZCAiTm9uZSIKKyN+IG1zZ3N0ciAiTsSXcmEiCisKKyN+IG1zZ2lkICJPbiIKKyN+IG1zZ3N0ciAixK5qdW5ndGEiCisKKyN+IG1zZ2lkICJPZmYiCisjfiBtc2dzdHIgIknFoWp1bmd0YSIKKworI34gbXNnaWQgIk11dGUiCisjfiBtc2dzdHIgIk51dGlsZHl0YSIKKworI34gbXNnaWQgIkZhc3QiCisjfiBtc2dzdHIgIkdyZWl0YXMiCisKKyN+IG1zZ2lkICJWZXJ5IExvdyIKKyN+IG1zZ3N0ciAiTGFiYWkgxb5lbWEiCisKKyN+IG1zZ2lkICJMb3ciCisjfiBtc2dzdHIgIsW9ZW1hIgorCisjfiBtc2dpZCAiTWVkaXVtIgorI34gbXNnc3RyICJWaWR1dGluxJciCisKKyN+IG1zZ2lkICJIaWdoIgorI34gbXNnc3RyICJBdWvFoXRhIgorCisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICJMYWJhaSBhdWvFoXRhIgorCisjfiBtc2dpZCAiUHJvZHVjdGlvbiIKKyN+IG1zZ3N0ciAiU3VrxatyaW1vIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTWljcm9waG9uZSIKKyN+IG1zZ3N0ciAiUHJpZWtpbmlvIHNreWRlbGlvIG1pa3JvZm9uYXMiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIEluIgorI34gbXNnc3RyICJQcmlla2luaW8gc2t5ZGVsaW8gxK9laW5hbnRpIGxpbmlqYSIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIEhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIlByaWVraW5pbyBza3lkZWxpbyBhdXNpbsSXcyIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgT3V0IgorI34gbXNnc3RyICJQcmlla2luaW8gc2t5ZGVsaW8gacWhZWluYW50aSBsaW5pamEiCisKKyN+IG1zZ2lkICJHcmVlbiBDb25uZWN0b3IiCisjfiBtc2dzdHIgIsW9YWxpYXMga2nFoXR1a2FzIgorCisjfiBtc2dpZCAiUGluayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlJvxb5pbmlzIGtpxaF0dWthcyIKKworI34gbXNnaWQgIkJsdWUgQ29ubmVjdG9yIgorI34gbXNnc3RyICJNxJdseW5hcyBracWhdHVrYXMiCisKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkJhbHRhcyBracWhdHVrYXMiCisKKyN+IG1zZ2lkICJCbGFjayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkp1b2RhcyBracWhdHVrYXMiCisKKyN+IG1zZ2lkICJHcmF5IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUGlsa2FzIGtpxaF0dWthcyIKKworI34gbXNnaWQgIk9yYW5nZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk9yYW7FvmluaXMga2nFoXR1a2FzIgorCisjfiBtc2dpZCAiUmVkIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUmF1ZG9uYXMga2nFoXR1a2FzIgorCisjfiBtc2dpZCAiWWVsbG93IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiR2VsdG9uYXMga2nFoXR1a2FzIgorCisjfiBtc2dpZCAiR3JlZW4gRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLFvWFsaWFzIHByaWVraW5pbyBza3lkZWxpbyBracWhdHVrYXMiCisKKyN+IG1zZ2lkICJQaW5rIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUm/FvmluaXMgcHJpZWtpbmlvIHNreWRlbGlvIGtpxaF0dWthcyIKKworI34gbXNnaWQgIkJsdWUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJNxJdseW5hcyBwcmlla2luaW8gc2t5ZGVsaW8ga2nFoXR1a2FzIgorCisjfiBtc2dpZCAiV2hpdGUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJCYWx0YXMgcHJpZWtpbmlvIHNreWRlbGlvIGtpxaF0dWthcyIKKworI34gbXNnaWQgIkJsYWNrIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiSnVvZGFzIHByaWVraW5pbyBza3lkZWxpbyBracWhdHVrYXMiCisKKyN+IG1zZ2lkICJHcmF5IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUGlsa2FzIHByaWVraW5pbyBza3lkZWxpbyBracWhdHVrYXMiCisKKyN+IG1zZ2lkICJPcmFuZ2UgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJPcmFuxb5pbmlzIHByaWVraW5pbyBza3lkZWxpbyBracWhdHVrYXMiCisKKyN+IG1zZ2lkICJSZWQgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJSYXVkb25hcyBwcmlla2luaW8gc2t5ZGVsaW8ga2nFoXR1a2FzIgorCisjfiBtc2dpZCAiWWVsbG93IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiR2VsdG9uYXMgcHJpZWtpbmlvIHNreWRlbGlvIGtpxaF0dWthcyIKKworI34gbXNnaWQgIlNwcmVhZCBPdXRwdXQiCisjfiBtc2dzdHIgIlNrbGVpc3RpIGnFoXZlc3TEryIKKworI34gbXNnaWQgIkRvd25taXgiCisjfiBtc2dzdHIgIlN1bWFpxaF5dGkiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIElucHV0IgorI34gbXNnc3RyICJWaXJ0dWFsYXVzIG1hacWhaWtsaW8gxK92ZXN0aXMiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIE91dHB1dCIKKyN+IG1zZ3N0ciAiVmlydHVhbGF1cyBtYWnFoWlrbGlvIGnFoXZlc3RpcyIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgQ2hhbm5lbHMiCisjfiBtc2dzdHIgIlZpcnR1YWxhdXMgbWFpxaFpa2xpbyBrYW5hbGFpIgorCisjfiBtc2dpZCAiJXMgJWQgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzICVkIGZ1bmtjaWphIgorCisjfiBtc2dpZCAiJXMgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzIGZ1bmtjaWphIgorCisjfiBtc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBvbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIktsYWlkYSBza2FpdGFudCAlZCBiYWl0dXMgKC3FsykgxK9yZW5naW55amUg4oCeJXPigJwuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIk5lcGF2eWtvIHN1c3RhdHl0aSDEryBlaWzElyBidWZlcmnFsyDEr3JlbmdpbnlqZSDigJ4lc+KAnC4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc291bmQgc2VydmVyIgorI34gbXNnc3RyICJOZXBhdnlrbyBwcmlzaWp1bmd0aSBwcmllIGdhcnNvIHNlcnZlcmlvIgorCisjfiBtc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IHNvdW5kIHNlcnZlciBjYXBhYmlsaXRpZXMiCisjfiBtc2dzdHIgIk5lcGF2eWtvIHXFvmtsYXVzdGkgZ2Fyc28gc2VydmVyaW8gZ2FsaW15YmnFsyIKKworI34gbXNnaWQgIkRlc2NyaWJlcyB0aGUgc2VsZWN0ZWQgaW5wdXQgZWxlbWVudC4iCisjfiBtc2dzdHIgIkFwcmHFoW8gcGFzaXJpbmt0xIUgxK92ZXN0aWVzIGVsZW1lbnTEhS4iCisKKyN+IG1zZ2lkICJEZXNjcmliZXMgdGhlIHNlbGVjdGVkIG91dHB1dCBlbGVtZW50IGZvciBBdWRpby9WaWRlbyBDb25mZXJlbmNpbmcuIgorI34gbXNnc3RyICJBcHJhxaFvIHBhc2lyaW5rdMSFIGnFoXZlc3RpZXMgZWxlbWVudMSFIGdhcnNvL3ZhaXpkbyBrb25mZXJlbmNpam9tcy4iCisKKyN+IG1zZ2lkICJEZXNjcmliZXMgdGhlIHNlbGVjdGVkIG91dHB1dCBlbGVtZW50IGZvciBNdXNpYyBhbmQgTW92aWVzLiIKKyN+IG1zZ3N0ciAiQXByYcWhbyBwYXNpcmlua3TEhSBpxaF2ZXN0aWVzIGVsZW1lbnTEhSBtdXppa2FpIGlyIGZpbG1hbXMuIgorCisjfiBtc2dpZCAiRGVzY3JpYmVzIHRoZSBzZWxlY3RlZCBvdXRwdXQgZWxlbWVudC4iCisjfiBtc2dzdHIgIkFwcmHFoW8gcGFzaXJpbmt0xIUgacWhdmVzdGllcyBlbGVtZW50xIUuIgorCisjfiBtc2dpZCAiR1N0cmVhbWVyIGF1ZGlvc2luayBmb3IgQXVkaW8vVmlkZW8gQ29uZmVyZW5jaW5nIgorI34gbXNnc3RyICJHU3RyZWFtZXIgZ2Fyc28gacWhdmVzdGllcyBlbGVtZW50YXMgZ2Fyc28vdmFpemRvIGtvbmZlcmVuY2lqb21zIgorCisjfiBtc2dpZCAiR1N0cmVhbWVyIGF1ZGlvc2luayBmb3IgTXVzaWMgYW5kIE1vdmllcyIKKyN+IG1zZ3N0ciAiR1N0cmVhbWVyIGdhcnNvIGnFoXZlc3RpZXMgZWxlbWVudGFzIG11emlrYWkgaXIgZmlsbWFtcyIKKworI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHBsYXkgYXVkaW8gdXNpbmcgYW55IG51bWJlciBvZiBvdXRwdXQgZWxlbWVudHMuIFNvbWUgIgorI34gInBvc3NpYmxlIGNob2ljZXMgYXJlIG9zc3NpbmssIGVzZHNpbmsgYW5kIGFsc2FzaW5rLiBUaGUgYXVkaW9zaW5rIGNhbiBiZSAiCisjfiAiYSBwYXJ0aWFsIHBpcGVsaW5lIGluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJHU3RyZWFtZXIgZ2FsaSBncm90aSBnYXJzxIUgbmF1ZG9kYW1hcyBiZXQga29rxK8gacWhdmVzdGllcyBlbGVtZW50xbMga2lla8SvLiAiCisjfiAiS2VsZXRhcyBnYWxpbcWzIHBhc2lyaW5raW3Fszogb3Nzc2luaywgZXNkc2luayBpciBhbHNhc2luay4gR2Fyc28gacWhdmVzdGllcyAiCisjfiAiZWxlbWVudMSFIGdhbGkgc3VkYXJ5dGkgZGFsaW5pcyBrb252ZWplcmlzLCBuZSB0aWsgdmllbmFzIGVsZW1lbnRhcy4iCisKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiBwbGF5IHZpZGVvIHVzaW5nIGFueSBudW1iZXIgb2Ygb3V0cHV0IGVsZW1lbnRzLiBTb21lICIKKyN+ICJwb3NzaWJsZSBjaG9pY2VzIGFyZSB4dmltYWdlc2luaywgeGltYWdlc2luaywgc2RsdmlkZW9zaW5rIGFuZCBhYXNpbmsuICIKKyN+ICJUaGUgdmlkZW9zaW5rIGNhbiBiZSBhIHBhcnRpYWwgcGlwZWxpbmUgaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkdTdHJlYW1lciBnYWxpIGdyb3RpIHZhaXpkbyDEr3JhxaF1cyBuYXVkb2RhbWFzIGJldCBrb2vEryBpxaF2ZXN0aWVzIGVsZW1lbnTFsyAiCisjfiAia2lla8SvLiBLZWxldGFzIGdhbGltxbMgcGFzaXJpbmtpbcWzOiB4dmltYWdlc2luaywgeGltYWdlc2luaywgc2RsdmlkZW9zaW5rICIKKyN+ICJpciBhYXNpbmsuIFZhaXpkbyBpxaF2ZXN0aWVzIGVsZW1lbnTEhSBnYWxpIHN1ZGFyeXRpIGRhbGluaXMga29udmVqZXJpcywgbmUgIgorI34gInRpayB2aWVuYXMgZWxlbWVudGFzLiIKKworI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHB1dCB2aXN1YWxpemF0aW9uIHBsdWdpbnMgaW4gYSBwaXBlbGluZSB0byB0cmFuc2Zvcm0gYXVkaW8gIgorI34gInN0cmVhbSBpbiB2aWRlbyBmcmFtZXMuIERlZmF1bHQgaXMgZ29vbSBidXQgbW9yZSB2aXN1YWxpemF0aW9uIHBsdWdpbnMgIgorI34gIndpbGwgYmUgcG9ydGVkIHNvb24uIFRoZSB2aXN1YWxpemF0aW9uIHBsdWdpbiBjYW4gYmUgYSBwYXJ0aWFsIHBpcGVsaW5lICIKKyN+ICJpbnN0ZWFkIG9mIGp1c3Qgb25lIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiR1N0cmVhbWVyIGdhbGkgxK9kxJd0aSB2YWl6ZG8gZWZla3TFsyDEr3NraWVwaXVzIMSvIGtvbnZlamVyxK8sIGthZCAiCisjfiAidHJhbnNmb3JtdW90xbMgZ2Fyc28gc3JhdXTEhSB2YWl6ZG8ga2FkcnVvc2UuIE51bWF0eXRhc2lzIMSvc2tpZXBpcyB5cmEgIgorI34gImdvb20sIHRhxI1pYXUgZ3JlaXR1IG1ldHUgYnVzIHJlYWxpenVvdGEgZGF1Z2lhdSB2YWl6ZG8gZWZla3TFsyDEr3NraWVwacWzLiAiCisjfiAiVmFpemRvIGVmZWt0byDEr3NraWVwxK8gZ2FsaSBzdWRhcnl0aSBkYWxpbmlzIGtvbnZlamVyaXMsIG5lIHRpayB2aWVuYXMgIgorI34gImVsZW1lbnRhcy4iCisKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiByZWNvcmQgYXVkaW8gdXNpbmcgYW55IG51bWJlciBvZiBpbnB1dCBlbGVtZW50cy4gU29tZSAiCisjfiAicG9zc2libGUgY2hvaWNlcyBhcmUgb3Nzc3JjLCBlc2RzcmMgYW5kIGFsc2FzcmMuIFRoZSBhdWRpbyBzb3VyY2UgY2FuIGJlICIKKyN+ICJhIHBhcnRpYWwgcGlwZWxpbmUgaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkdTdHJlYW1lciBnYWxpIMSvcmHFoXl0aSBnYXJzxIUgbmF1ZG9kYW1hcyBiZXQga29rxK8gxK92ZXN0aWVzIGVsZW1lbnTFsyAiCisjfiAic2thacSNacWzLiBLZWxldGFzIGdhbGltxbMgcGFzaXJpbmtpbcWzOiBvc3NzcmMsIGVzZHNyYyBpciBhbHNhc3JjLiBHYXJzbyAiCisjfiAixaFhbHRpbsSvIGdhbGkgc3VkYXJ5dGkgZGFsaW5pcyBrb252ZWplcmlzLCBuZSB0aWsgdmllbmFzIGVsZW1lbnRhcy4iCisKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiByZWNvcmQgdmlkZW8gZnJvbSBhbnkgbnVtYmVyIG9mIGlucHV0IGVsZW1lbnRzLiBTb21lICIKKyN+ICJwb3NzaWJsZSBjaG9pY2VzIGFyZSB2NGxzcmMgYW5kIHZpZGVvdGVzdHNyYy4gVGhlIHZpZGVvIHNvdXJjZSBjYW4gYmUgYSAiCisjfiAicGFydGlhbCBwaXBlbGluZSBpbnN0ZWFkIG9mIGp1c3Qgb25lIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiR1N0cmVhbWVyIGdhbGkgxK9yYcWheXRpIHZhaXpkxIUgacWhIGJldCBrb2tpbyBza2FpxI1pYXVzIMSvdmVzdGllcyBlbGVtZW50xbMuICIKKyN+ICJLZWxldGFzIGdhbGltxbMgcGFzaXJpbmtpbcWzOiB2NGxzcmMgaXIgdmlkZW90ZXN0c3JjLiBWYWl6ZG8gxaFhbHRpbsSvIGdhbGkgIgorI34gInN1ZGFyeXRpIGRhbGluaXMga29udmVqZXJpcywgbmUgdGlrIHZpZW5hcyBlbGVtZW50YXMuIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgYXVkaW8gc291cmNlIgorI34gbXNnc3RyICJudW1hdHl0YXNpcyBHU3RyZWFtZXIgZ2Fyc28gxaFhbHRpbmlzIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgYXVkaW9zaW5rIgorI34gbXNnc3RyICJudW1hdHl0YXNpcyBHU3RyZWFtZXIgZ2Fyc28gacWhdmVzdGllcyBlbGVtZW50YXMiCisKKyN+IG1zZ2lkICJkZWZhdWx0IEdTdHJlYW1lciB2aWRlbyBzb3VyY2UiCisjfiBtc2dzdHIgIm51bWF0eXRhc2lzIEdTdHJlYW1lciB2YWl6ZG8gxaFhbHRpbmlzIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgdmlkZW9zaW5rIgorI34gbXNnc3RyICJudW1hdHl0YXNpcyBHU3RyZWFtZXIgdmFpemRvIGnFoXZlc3RpZXMgZWxlbWVudGFzIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgdmlzdWFsaXphdGlvbiBwbHVnaW4iCisjfiBtc2dzdHIgIm51bWF0eXRhc2lzIEdTdHJlYW1lciB2YWl6ZG8gZWZla3RvIMSvc2tpZXBpcyIKKworI34gbXNnaWQgImRlc2NyaXB0aW9uIGZvciBHU3RyZWFtZXIgYXVkaW9zaW5rIGZvciBBdWRpby9WaWRlbyBDb25mZXJlbmNpbmciCisjfiBtc2dzdHIgIiIKKyN+ICJHU3RyZWFtZXIgZ2Fyc28gacWhdmVzdGllcyBlbGVtZW50byBnYXJzby92YWl6ZG8ga29uZmVyZW5jaWpvbXMgYXByYcWheW1hcyIKKworI34gbXNnaWQgImRlc2NyaXB0aW9uIGZvciBHU3RyZWFtZXIgYXVkaW9zaW5rIGZvciBNdXNpYyBhbmQgTW92aWVzIgorI34gbXNnc3RyICJHU3RyZWFtZXIgZ2Fyc28gacWhdmVzdGllcyBlbGVtZW50byBtdXppa2FpIGlyIGZpbG1hbXMgYXByYcWheW1hcyIKKworI34gbXNnaWQgImRlc2NyaXB0aW9uIGZvciBkZWZhdWx0IEdTdHJlYW1lciBhdWRpb3NpbmsiCisjfiBtc2dzdHIgIm51bWF0eXRvam8gR1N0cmVhbWVyIGdhcnNvIGnFoXZlc3RpZXMgZWxlbWVudG8gYXByYcWheW1hcyIKKworI34gbXNnaWQgImRlc2NyaXB0aW9uIGZvciBkZWZhdWx0IEdTdHJlYW1lciBhdWRpb3NyYyIKKyN+IG1zZ3N0ciAibnVtYXR5dG9qbyBHU3RyZWFtZXIgZ2Fyc28gxaFhbHRpbmlvIGFwcmHFoXltYXMiCisKKyN+IG1zZ2lkICJUaGlzIGZpbGUgaXMgZW5jcnlwdGVkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKKyN+IG1zZ3N0ciAixaBpcyBmYWlsYXMgdcW+xaFpZnJ1b3RhcyBpciBuZWdhbGkgYsWrdGkgcGFncm90YXMuIgorCisjfiBtc2dpZCAiRGlzYyBpcyBub3QgYW4gQXVkaW8gQ0QuIgorI34gbXNnc3RyICJEaXNrYXMgbsSXcmEgQXVkaW8gQ0QiCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgcmVhZCBmcm9tIENELiIKKyN+IG1zZ3N0ciAiTmVwYXZ5a28gc2thaXR5dGkgacWhIENELiIKZGlmZiAtLWdpdCBhL3BvL2x2LnBvIGIvcG8vbHYucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkYWM0MgotLS0gL2Rldi9udWxsCisrKyBiL3BvL2x2LnBvCkBAIC0wLDAgKzEsNzg1IEBACisjIExhdHZpYW4gdHJhbnNsYXRpb24gb2YgZ3N0LXBsdWdpbnMuCisjIFRoaXMgZmlsZSBpcyBwdXQgaW4gdGhlIHB1YmxpYyBkb21haW4uCisjCisjIEFydmlzIEzEgWNpcyA8YXJ2aXMubGFjaXNAaW5ib3gubHY+LCAyMDA5LgorIyBSaWhhcmRzIFByaWVkaXRpcyA8cnByaWVkaXRpc0BnbWFpbC5jb20+LCAyMDEwLgorIyBSaWhhcmRzIFByaWVkaXRpcyA8cnByaWVkaXRpc0BnbWFpbC5jb20+LCAyMDExLgorIyBSxatkb2xmcyBNYXp1cnMgPHJ1ZG9sZnMubWF6dXJzQGdtYWlsLmNvbT4sIDIwMTQuCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kIDEuMi4xXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTQtMDQtMjAgMTY6MzgrMDMwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogUmloYXJkcyBQcmllZGl0aXMgPHJwcmllZGl0aXNAZ21haWwuY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IExhdHZpYW4gPHRyYW5zbGF0aW9uLXRlYW0tbHZAbGlzdHMuc291cmNlZm9yZ2UubmV0PlxuIgorIkxhbmd1YWdlOiBsdlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlBsdXJhbC1Gb3JtczogbnBsdXJhbHM9MzsgcGx1cmFsPShuJTEwPT0xICYmIG4lMTAwIT0xMSA/IDAgOiBuICE9IDAgPyAxIDogIgorIjIpO1xuIgorIlgtR2VuZXJhdG9yOiBMb2thbGl6ZSAxLjVcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiTmF2IGF0cmFzdHMgSmFjayBzZXJ2ZXJpcyIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiTmVpemRldsSBcyBhdGtvZMSTdCBKUEVHIGF0dMSTbHUiCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIuKAnCVz4oCdIGl6cGlsZGEg4oCcJXPigJ0iCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIk5ldmFyxJNqYSBzYXZpZW5vdGllcyBhciBzZXJ2ZXJpIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIlVSTCBuYXYgaWVzdGF0xKt0cy4iCisKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIk5ldmFyIGF0cmFzdCBzZXJ2ZXJhIG5vc2F1a3VtdS4iCisKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiTmV2YXIgaXp2ZWlkb3Qgc2F2aWVub2p1bXUgYXIgc2VydmVyaS4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICJOZWl6ZGV2xIFzIGl6dmVpZG90IGRyb8WhbyBzYXZpZW5vanVtdS4iCisKKyMsIGZ1enp5Cittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiTm90aWthIHTEq2tsYSBrxLzFq2RhLCB2YWkgc2VydmVyaXMgbmVnYWlkxKt0aSBhaXp2xJNyYSBzYXZpZW5vanVtdS4iCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIlNlcnZlcmlzIG5vc8WrdMSramEgc2xpa3R1cyBkYXR1cy4iCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiU2VydmVyaXMgbmVhdGJhbHN0YSBtZWtsxJPFoWFudS4iCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIk5hdiB2YWkgbmVkZXLEq2dzIGlldmFkZXMgYXVkaW8sIEFWSSBzdHJhdW1lIHRpa3MgYm9qxIF0YS4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIsWgxKsgZGF0bmUgbmVzYXR1ciBuZXZpZW51IGF0c2thxYZvamFtdSBzdHJhdW1pLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAixaDEqyBkYXRuZSBpciBuZWRlcsSrZ2EgdW4gdG8gbmV2YXIgYXRza2HFhm90LiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICJOZXZhciBhdHNrYcWGb3Qgc3RyYXVtaSwgam8gdMSBIGlyIMWhaWZyxJN0YSBhciBQbGF5UmVhZHkgRFJNLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAixaDEqyBkYXRuZSBpciBib2rEgXRhIHVuIHRvIG5ldmFyIGF0c2thxYZvdC4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIk5lZGVyxKtncyBhdG9tYSBpem3Ek3JzLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAixaDEqyBkYXRuZSBpciBuZXBhYmVpZ3RhIHVuIHRvIG5ldmFyIGF0c2thxYZvdC4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIlZpZGVvIMWhYWrEgSBkYXRuxJMgdmFyxJN0dSB0aWt0IGF0c2thxYZvdHMgbmVwYXJlaXppLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICLFoMSrIGRhdG5lIHNhdHVyIHDEgXLEgWsgZGF1ZHogc3RyYXVtanUuIFRpZWsgYXRza2HFhm90YSB0aWthaSBwaXJtxIEgJWQiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorIk5ldGlrYSBhdHJhc3RhIGF0YmFsc3TEq3RhIHN0cmF1bWUuIEllc3DEk2phbXMsIGp1bXMgasSBaW5zdGFsxJMgR1N0cmVhbWVyIFJUU1AgIgorInBhcGxhxaFpbsSBanVtYSBzcHJhdWRuaSBSZWFsIG1lZGlhIHN0cmF1bcSTbS4iCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKyJOZXRpa2EgYXRyYXN0YSBhdGJhbHN0xKt0YSBzdHJhdW1lLiBJZXNwxJNqYW1zLCBqdW1zIGrEgWF0xLxhdWogdmFpcsSBayAiCisidHJhbnNwb3J0YSBwcm90b2tvbGkgdmFpIGFyxKsgdHLFq2tzdCBHU3RyZWFtZXIgUlRTUCBwYXBsYcWhaW7EgWp1bWEgc3ByYXVkbmlzLiAiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisiTmV2YXLEk2phIGF0dsSTcnQgYXVkaW8gaWVyxKtjaSBhdHNrYcWGb8WhYW5haS4gSWVyxKtjaSBwYcWhbGFpayBpem1hbnRvIGNpdGEgIgorImxpZXRvdG5lLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiTmV2YXIgYXR2xJNydCBhdWRpbyBpZXLEq2NpIGF0c2thxYZvxaFhbmFpLiBKdW1zIG5hdiBuZXBpZWNpZcWhYW3EgXMgYXTEvGF1amFzLCBsYWkgIgorImF0dsSTcnR1IGllcsSrY2kuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIk5ldmFyxJNqYSBhdHbEk3J0IGF1ZGlvIGllcsSrY2kgYXRza2HFhm/FoWFuYWkuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIk5ldmFyIGF0dsSTcnQgYXVkaW8gaWVyxKtjaSBhdHNrYcWGb8WhYW5haS4gxaDEqyBBdHbEk3J0xIFzIFNrYcWGYXMgU2lzdMSTbWFzIHZlcnNpamEgIgorIm5lYXRiYWxzdGEgxaFvIGVsZW1lbnR1LiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLFoMSrIGF1ZGlvIGllcsSrY2UgbmVhdGJhbHN0YSBhdHNrYcWGb8WhYW51LiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAiQXVkaW8gYXRza2HFhm/FoWFuYXMga8S8xatkYS4iCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIsWgxKsgYXVkaW8gaWVyxKtjZSBuZWF0YmFsc3RhIGllcmFrc3TEq8WhYW51LiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkvEvMWrZGEsIGllcmFrc3RvdCBubyBhdWRpbyBpZXLEq2Nlcy4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJOZXZhciBhdHbEk3J0IGF1ZGlvIGllcsSrY2kgaWVyYWtzdMSrxaFhbmFpLiBKdW1zIG5hdiBuZXBpZWNpZcWhYW1vIHBpZWvEvHV2ZXMgIgorInRpZXPEq2J1LCBsYWkgYXR2xJNydHUgaWVyxKtjaS4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIk5ldmFyxJNqYSBhdHbEk3J0IGF1ZGlvIGllcsSrY2kgaWVyYWtzdMSrxaFhbmFpLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIiIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIkllcmFrc3TEq8WhYW5hcyBhdm90cyIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIk1pa3JvZm9ucyIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIlNrYcWGYXMgaWVlamEiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiSWVrxaHEk2phaXMgQ0QiCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAiU1BESUYgaWVlamEiCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiQVVYIDEgaWVlamEiCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAiQVVYIDIgaWVlamEiCisKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiS29kZWthIGF0Z3JpZXplbmlza2FpcyBjaWtscyIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiU3VuVlRTIGF0Z3JpZXplbmlza2FpcyBjaWtscyIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiU2thxLx1bXMiCisKK21zZ2lkICJHYWluIgorbXNnc3RyICJQaWVhdWd1bXMiCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJNb25pdG9ycyIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIkllYsWrdsSTdGFpcyBza2HEvHJ1bmlzIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICJBdXN0acWGYXMiCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiU2thxYZhcyBpemVqYSIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiU1BESUYgaXplamEiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIkFVWCAxIGl6ZWphIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICJBVVggMiBpemVqYSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIgorbXNnc3RyICJSYWTEgXMga8S8xatkYSwgbm9sYXNvdCAlZCBiYWl0dXMgbm8gaWVyxKtjZXMg4oCcJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICJOZWl6ZGV2xIFzIHV6c2thaXTEq3QgaWVzcMSTamFtb3MgdmlkZW8gZm9ybcSBdHVzLCBhciBrbyB2YXIgc3RyxIFkxIF0IOKAnCVz4oCdIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICJOZXZhciBpenZpZXRvdCBidWZlcnVzIG5vIGllcsSrY2VzIOKAnCVz4oCdIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICJJZXLEq2NlcyBcIiVzXCIgZHJhaXZlcmlzIG5lYXRiYWxzdGEgSU8gbWV0b2RpICVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAiSWVyxKtjZXMg4oCcJXPigJ0gZHJhaXZlcmlzIG5lYXRiYWxzdGEgbmV2aWVudSB6aW7EgW1vIGllcmFrc3TEq8WhYW5hcyBtZXRvZGkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIkllcsSrY2Ug4oCcJXPigJ0gaXIgYWl6xYZlbXRhIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICJJZXLEq2NlIOKAnCVz4oCdIG5ldmFyIHR2ZXJ0IGFyICVkeCVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICJJZXLEq2NlIOKAnCVz4oCdIG5ldmFyIHR2ZXJ0IG5vcsSBZMSrdGFqxIEgZm9ybcSBdMSBIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICJJZXLEq2NlIOKAnCVz4oCdIG5lYXRiYWxzdGEgdmlkZW8gdHZlcsWhYW51IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiTmV2YXIgbm9sYXPEq3QgcGFyYW1ldHJ1cyBubyBpZXLEq2NlcyDigJwlc+KAnSIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiVmlkZW8gaWVyxKtjZSBuZXBpZcWGxJNtYSBqYXVub3Mga2FkcnUgxIF0cnVtYSBpZXN0YXTEq2p1bXVzLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICJWaWRlbyBpZXLEq2NlIG5lcGllxYbEk21hIGphdW5vcyBrYWRydSDEgXRydW1hIGllc3RhdMSranVtdXMuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICJJZXLEq2NlcyBcIiVzXCIgZHJhaXZlcmlzIG5lYXRiYWxzdGEgSU8gbWV0b2RpICVkIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIkllcsSrY2VzIFwiJXNcIiBkcmFpdmVyaXMgbmVhdGJhbHN0YSBJTyBtZXRvZGkgJWQiCisKKyMsIGZ1enp5Cittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIlZpZGVvIGllcsSrY2UgbmV2YXLEk2phIGl6dmVpZG90IGJ1ZmVyYSBwxatsdS4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICJWaWRlbyBpZXLEq2NlIG5ldmFyxJNqYSBpenZlaWRvdCBidWZlcmEgcMWrbHUuIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOZWl6ZGV2xIFzIHNhxYZlbXQgc2thxYZvdMSBamEgJWQgaWVzdGF0xKtqdW11cyBubyBpZXLEq2NlcyDigJwlc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS8S8xatkYSwgc2HFhmVtb3QgaWVzcMSTamFzIG5vIGllcsSrY2VzIOKAnCVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIkllcsSrY2Ug4oCcJXPigJ0gbmF2IHNrYcWGb3TEgWpzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIk5laXpkZXbEgXMgc2HFhmVtdCByYWRpbyBpZXZhZGkgdXogaWVyxKtjZXMg4oCcJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiTmVpemRldsSBcyBpZXN0YXTEq3QgaWV2YWRpICVkIHV6IGllcsSrY2VzICVzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmVpemRldsSBcyBtYWluxKt0IGFwa2x1c2luxIHFoWFuYXMgc3TEgXZva2xpIGllcsSrY2VpIOKAnCVz4oCdLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiSWVyxKtjZXMgXCIlc1wiIGRyYWl2ZXJpcyBuZWF0YmFsc3RhIElPIG1ldG9kaSAlZCIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIlZpZGVvIGllcsSrY2UgbmVwaWXFhsSTbWEgamF1bm9zIGthZHJ1IMSBdHJ1bWEgaWVzdGF0xKtqdW11cy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJWaWRlbyBpZXLEq2NlIG5lcGllxYbEk21hIGphdW5vcyBrYWRydSDEgXRydW1hIGllc3RhdMSranVtdXMuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIlZpZGVvIGllcsSrY2UgbmVwaWXFhsSTbWEgamF1bm9zIGthZHJ1IMSBdHJ1bWEgaWVzdGF0xKtqdW11cy4iCisKKyMsIGZ1enp5Cittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIk5laXpkZXbEgXMgYXRrb2TEk3QgSlBFRyBhdHTEk2x1IgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisiUmFkxIFzIGvEvMWrZGEsIHNhxYZlbW90IGllcsSrY2VzIOKAnCVz4oCdIGllc3DEk2phczogaWVzcMSTamFtcyB0YXMgbmF2IHY0STIgIgorImRyYWl2ZXJpcy4gUMSBcmJhdWRpZXQgdmFpIHRhcyBpciB2NEkxIGRyYWl2ZXJpcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICJOZWl6ZGV2xIFzIG5vdGVpa3QgYXRyaWLFq3R1cyBpZXZhZGVpICVkIG5vIGllcsSrY2VzICVzIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5laXpkZXbEgXMgc2HFhmVtdCBza2HFhm90xIFqYSAlZCBpZXN0YXTEq2p1bXVzIG5vIGllcsSrY2VzIOKAnCVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5laXpkZXbEgXMgbm9za2FpZHJvdCBub3JtdSBpZXLEq2NlaSDigJwlc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5laXpkZXbEgXMgaWVnxat0IGtvbnRyb2xlcyBhdHJpYsWrdHVzIGllcsSrY2VpIOKAnCVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJOZXZhciBhdHBhesSrdCBpZXLEq2NpIOKAnCVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICLFoMSrIG5hdiBpZXLEq2NlIOKAnCVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIk5ldmFyxJNqYSBhdHbEk3J0IGllcsSrY2kg4oCcJXPigJ0gbGFzxKvFoWFuYWkgdmFpIHJha3N0xKvFoWFuYWkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiSWVyxKtjZSDigJwlc+KAnSBuYXYgaWVyYWtzdMSrxaFhbmFzIGllcsSrY2UuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICJJZXLEq2NlIOKAnCVz4oCdIG5hdiBpenZhZGVzIGllcsSrY2UuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiSWVyxKtjZSDigJwlc+KAnSBuYXYgaXp2YWRlcyBpZXLEq2NlLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIk5ldmFyxJNqYSBhdHbEk3J0IGllcsSrY2kg4oCcJXPigJ0gbGFzxKvFoWFuYWkgdmFpIHJha3N0xKvFoWFuYWkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJOZWl6ZGV2xIFzIGllc3RhdMSrdCBub3JtdSBpZXLEq2NlaSDigJwlc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJOZWl6ZGV2xIFzIHNhxYZlbXQgcGHFoXJlaXrEk2pvIGF0c2thxYZvxaFhbmFzIGZyZWt2ZW5jaSBubyBpZXLEq2NlcyDigJwlc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorIk5laXpkZXbEgXMgaWVzdGF0xKt0IGllcsSrY2VzIOKAnCVz4oCdIHBhxaFyZWl6xJNqbyBza2HFhm90xIFqYSBmcmVrdmVuY2kgdXogJWx1IEh6LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJOZWl6ZGV2xIFzIHNhxYZlbXQgc2lnbsSBbGEgc3RpcHJ1bXUgbm8gaWVyxKtjZXMg4oCcJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOZWl6ZGV2xIFzIHNhxYZlbXQgdmFkxKtrbGFzIHbEk3J0xKtidSAlZCBpZXLEq2NlaSDigJwlc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5laXpkZXbEgXMgaWVzdGF0xKt0IHbEk3J0xKtidSAlZCB2YWTEq2tsYWkgJWQgbm8gaWVyxKtjZXMg4oCcJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiTmVpemRldsSBcyBzYcWGZW10IHBhxaFyZWl6xJNqbyBpZXZhZGkgbm8gaWVyxKtjZXMg4oCcJXPigJ0uIEllc3DEk2phbXMgdMSBIGlyIHJhZGlvICIKKyJpZXLEq2NlIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJOZWl6ZGV2xIFzIHNhxYZlbXQgcGHFoXJlaXrEk2pvIGl6dmFkdSBubyBpZXLEq2NlcyDigJwlc+KAnS4gSWVzcMSTamFtcyB0xIEgaXIgcmFkaW8gIgorImllcsSrY2UiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiTmVpemRldsSBcyBpZXN0YXTEq3QgaXp2YWRpICVkIHV6IGllcsSrY2VzICVzLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIkl6xaHEt2lydHNwxJNqYXMgbWFpbsSrxaFhbmEgaXpwaWxkbGFpa8SBIHBhxaFsYWlrIG5ldGllayBhdGJhbHN0xKt0YS4iCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIk5ldmFyIHZlaWt0IGRhcmLEq2JhcyBiZXogcHVsa3N0ZcWGYSIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAiSWVrxaHEk2phIGRhdHUgcGzFq3NtYXMga8S8xatkYS4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICJJZWvFocSTamEgZGF0dSBwbMWrc21hcyBrxLzFq2RhLiIKKworI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAiSWVyxKtjZSDigJwlc+KAnSBuZWF0YmFsc3RhIHZpZGVvIHR2ZXLFoWFudSIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzb3VuZCBzZXJ2ZXIiCisjfiBtc2dzdHIgIk5ldmFyIGl6dmVpZG90IHNhdmllbm9qdW11IGFyIHNrYcWGYXMgc2VydmVyaSIKKworI34gbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBzb3VuZCBzZXJ2ZXIgY2FwYWJpbGl0aWVzIgorI34gbXNnc3RyICJOZWl6ZGV2xIFzIG5vc2thaWRyb3Qgc2thxYZhcyBzZXJ2ZXJhIGllc3DEk2phcyIKKworI34gbXNnaWQgIkJhc3MiCisjfiBtc2dzdHIgIkJhc2kiCisKKyN+IG1zZ2lkICJUcmVibGUiCisjfiBtc2dzdHIgIkRpc2thbnRzIgorCisjfiBtc2dpZCAiU3ludGgiCisjfiBtc2dzdHIgIlNpbnTEk3plIgorCisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICJQQ00iCisKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICJTa2HEvHJ1bmlzIgorCisjfiBtc2dpZCAiTGluZS1pbiIKKyN+IG1zZ3N0ciAiU2thxYZhcyBpZWVqYSIKKworI34gbXNnaWQgIkNEIgorI34gbXNnc3RyICJDRCIKKworI34gbXNnaWQgIk1peGVyIgorI34gbXNnc3RyICJKYXVjxJNqcyIKKworI34gbXNnaWQgIlBDTS0yIgorI34gbXNnc3RyICJQQ00tMiIKKworI34gbXNnaWQgIlJlY29yZCIKKyN+IG1zZ3N0ciAiSWVyYWtzdMSrdCIKKworI34gbXNnaWQgIkluLWdhaW4iCisjfiBtc2dzdHIgIklldmFkZXMgcGllYXVndW1zIgorCisjfiBtc2dpZCAiT3V0LWdhaW4iCisjfiBtc2dzdHIgIkl6dmFkZXMgcGllYXVndW1zIgorCisjfiBtc2dpZCAiTGluZS0xIgorI34gbXNnc3RyICJMxKtuaWphLTEiCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgIkzEq25pamEtMiIKKworI34gbXNnaWQgIkxpbmUtMyIKKyN+IG1zZ3N0ciAiTMSrbmlqYS0zIgorCisjfiBtc2dpZCAiRGlnaXRhbC0xIgorI34gbXNnc3RyICJEaWdpdMSBbGFpcy0xIgorCisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICJEaWdpdMSBbGFpcy0yIgorCisjfiBtc2dpZCAiRGlnaXRhbC0zIgorI34gbXNnc3RyICJEaWdpdMSBbGFpcy0zIgorCisjfiBtc2dpZCAiUGhvbmUtaW4iCisjfiBtc2dzdHIgIlRlbGVmb25hIGlldmFkZSIKKworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAiVGVsZWZvbmEgaXp2YWRlIgorCisjfiBtc2dpZCAiVmlkZW8iCisjfiBtc2dzdHIgIlZpZGVvIgorCisjfiBtc2dpZCAiUmFkaW8iCisjfiBtc2dzdHIgIlJhZGlvIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKKyN+IG1zZ3N0ciAiTmV2YXLEk2phIGF0dsSTcnQgYXVkaW8gaWVyxKtjaSBtaWtzZXJhIGtvbnRyb2xlcyB2YWTEq8WhYW5haS4iCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJOZXZhciBhdHbEk3J0IGF1ZGlvIGllcsSrY2kgbWlrc2VyYSBrb250cm9sYXMgdmFkxKvFoWFuYWkuIMWgxKsgQXR2ZXJ0xIFzIFNrYcWGYXMgIgorI34gIlNpc3RlbWFzIHZlcnNpamEgbmVhdGJhbHN0YSDFoW8gZWxlbWVudHUuIgorCisjfiBtc2dpZCAiTWFzdGVyIgorI34gbXNnc3RyICJHYWx2ZW5haXMiCisKKyN+IG1zZ2lkICJGcm9udCIKKyN+IG1zZ3N0ciAiUHJpZWvFocSTamFpcyIKKworI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIlPEgW5pIgorCisjfiBtc2dpZCAiSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiQXVzdGnFhmFzIgorCisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICJDZW50cnMiCisKKyN+IG1zZ2lkICJMRkUiCisjfiBtc2dzdHIgIkxGRSIKKworI34gbXNnaWQgIlN1cnJvdW5kIgorI34gbXNnc3RyICJJZXNrYXVqb8WhxIEiCisKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICJQdXNlIgorCisjfiBtc2dpZCAiQVVYIE91dCIKKyN+IG1zZ3N0ciAiQVVYIGl6ZWphIgorCisjfiBtc2dpZCAiM0QgRGVwdGgiCisjfiBtc2dzdHIgIjNEIGR6acS8dW1zIgorCisjfiBtc2dpZCAiM0QgQ2VudGVyIgorI34gbXNnc3RyICIzRCBjZW50cnMiCisKKyN+IG1zZ2lkICIzRCBFbmhhbmNlIgorI34gbXNnc3RyICIzRCB1emxhYm9qdW1zIgorCisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICJUZWxlZm9ucyIKKworI34gbXNnaWQgIlZpZGVvIEluIgorI34gbXNnc3RyICJWaWRlbyBpZWVqYSIKKworI34gbXNnaWQgIkFVWCBJbiIKKyN+IG1zZ3N0ciAiQVVDIGllZWphIgorCisjfiBtc2dpZCAiUmVjb3JkIEdhaW4iCisjfiBtc2dzdHIgIkllcmFrc3TEq3RhIHBpZWF1Z3VtcyIKKworI34gbXNnaWQgIk91dHB1dCBHYWluIgorI34gbXNnc3RyICJJenZhZGEgcGllYXVndW1zIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAiTWlrcm9mb25hIHBhc3RpcHJpbsSBanVtcyIKKworI34gbXNnaWQgIkRpYWdub3N0aWMiCisjfiBtc2dzdHIgIkRpYWdub3N0aWthIgorCisjfiBtc2dpZCAiQmFzcyBCb29zdCIKKyN+IG1zZ3N0ciAiQmFzc2EgcGFzdGlwcmluxIFqdW1zIgorCisjfiBtc2dpZCAiUGxheWJhY2sgUG9ydHMiCisjfiBtc2dzdHIgIkF0c2thxYZvxaFhbmFzIHBvcnRpIgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIklldmFkcyIKKworI34gbXNnaWQgIk1vbml0b3IgU291cmNlIgorI34gbXNnc3RyICJNb25pdG9yYSBhdm90cyIKKworI34gbXNnaWQgIktleWJvYXJkIEJlZXAiCisjfiBtc2dzdHIgIktsYXZpYXTFq3JhcyBwxKtrc3RpZW5pIgorCisjfiBtc2dpZCAiU2ltdWxhdGUgU3RlcmVvIgorI34gbXNnc3RyICJTaW11bMSTdCBzdGVyZW8iCisKKyN+IG1zZ2lkICJTdGVyZW8iCisjfiBtc2dzdHIgIlN0ZXJlbyIKKworI34gbXNnaWQgIlN1cnJvdW5kIFNvdW5kIgorI34gbXNnc3RyICJJZXNrYXVqb8WhxIEgc2thxYZhIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBHYWluIgorI34gbXNnc3RyICJNaWtyb2ZvbmEgcGllYXVndW1zIgorCisjfiBtc2dpZCAiU3BlYWtlciBTb3VyY2UiCisjfiBtc2dzdHIgIlNrYcS8cnXFhmEgYXZvdHMiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTWlrcm9mb25hIGF2b3RzIgorCisjfiBtc2dpZCAiSmFjayIKKyN+IG1zZ3N0ciAiTGlnemRhIgorCisjfiBtc2dpZCAiQ2VudGVyIC8gTEZFIgorI34gbXNnc3RyICJDZW50cnMgLyBMRkUiCisKKyN+IG1zZ2lkICJTdGVyZW8gTWl4IgorI34gbXNnc3RyICJTdGVyZW8gbWlrc2VyaXMiCisKKyN+IG1zZ2lkICJNb25vIE1peCIKKyN+IG1zZ3N0ciAiTW9ubyBtaXNrZXJpcyIKKworI34gbXNnaWQgIklucHV0IE1peCIKKyN+IG1zZ3N0ciAiSWVlamFzIG1pa3NlcmlzIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAxIgorI34gbXNnc3RyICJNaWtyb2ZvbnMgMSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAiTWlrcm9mb25zIDIiCisKKyN+IG1zZ2lkICJEaWdpdGFsIE91dCIKKyN+IG1zZ3N0ciAiRGlnaXTEgWzEgSBpemVqYSIKKworI34gbXNnaWQgIkRpZ2l0YWwgSW4iCisjfiBtc2dzdHIgIkRpZ2l0xIFsxIEgaWVlamEiCisKKyN+IG1zZ2lkICJIRE1JIgorI34gbXNnc3RyICJIRE1JIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgIk1vZMSTbXMiCisKKyN+IG1zZ2lkICJIYW5kc2V0IgorI34gbXNnc3RyICJLbGF1c3VsZSIKKworI34gbXNnaWQgIk90aGVyIgorI34gbXNnc3RyICJDaXRzIgorCisjfiBtc2dpZCAiTm9uZSIKKyN+IG1zZ3N0ciAiTmVrYXMiCisKKyN+IG1zZ2lkICJPbiIKKyN+IG1zZ3N0ciAiSWVzbMSTZ3RzIgorCisjfiBtc2dpZCAiT2ZmIgorI34gbXNnc3RyICJJenNsxJNndHMiCisKKyN+IG1zZ2lkICJNdXRlIgorI34gbXNnc3RyICJLbHVzdW1zIgorCisjfiBtc2dpZCAiRmFzdCIKKyN+IG1zZ3N0ciAixIB0cnMiCisKKyN+IG1zZ2lkICJWZXJ5IExvdyIKKyN+IG1zZ3N0ciAixLtvdGkgemVtcyIKKworI34gbXNnaWQgIkxvdyIKKyN+IG1zZ3N0ciAiWmVtcyIKKworI34gbXNnaWQgIk1lZGl1bSIKKyN+IG1zZ3N0ciAiVmlkxJNqcyIKKworI34gbXNnaWQgIkhpZ2giCisjfiBtc2dzdHIgIkF1Z3N0cyIKKworI34gbXNnaWQgIlZlcnkgSGlnaCIKKyN+IG1zZ3N0ciAixLtvdGkgYXVnc3RzIgorCisjfiBtc2dpZCAiUHJvZHVjdGlvbiIKKyN+IG1zZ3N0ciAiUHJvZHVrY2lqYSIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCisjfiBtc2dzdHIgIlByaWVrxaHEk2rEgSBwYW5lxLxhIG1pa3JvZm9ucyIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgSW4iCisjfiBtc2dzdHIgIlByaWVrxaHEk2rEgSBwYW5lxLxhIGllZWphcyBsxKtuaWphIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiUHJpZWvFocSTasSBIHBhbmXEvGEgYXVzdGnFhmFzIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBPdXQiCisjfiBtc2dzdHIgIlByaWVrxaHEk2rEgSBwYW5lxLxhIGzEq25pamFzIGl6ZWphIgorCisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICJaYcS8YWlzIHNhdmllbm90xIFqcyIKKworI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICJSb3rEgSBzYXZpZW5vdMSBanMiCisKKyN+IG1zZ2lkICJCbHVlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiWmlsYWlzIHNhdmllbm90xIFqcyIKKworI34gbXNnaWQgIldoaXRlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQmFsdGFpcyBzYXZpZW5vdMSBanMiCisKKyN+IG1zZ2lkICJCbGFjayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk1lbG5haXMgc2F2aWVub3TEgWpzIgorCisjfiBtc2dpZCAiR3JheSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlBlbMSBa2FpcyBzYXZpZW5vdMSBanMiCisKKyN+IG1zZ2lkICJPcmFuZ2UgQ29ubmVjdG9yIgorI34gbXNnc3RyICJPcmFuxb5haXMgc2F2aWVub3TEgWpzIgorCisjfiBtc2dpZCAiUmVkIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiU2Fya2FuYWlzIHNhdmllbm90xIFqcyIKKworI34gbXNnaWQgIlllbGxvdyBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkR6ZWx0YWlucyBzYXZpZW5vdMSBanMiCisKKyN+IG1zZ2lkICJHcmVlbiBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlphxLxhaXMgcHJpZWvFocSTasSBIHBhbmXEvGEgc2F2aWVub3TEgWpzIgorCisjfiBtc2dpZCAiUGluayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlJvesSBIHByaWVrxaHEk2rEgSBwYW5lxLxhIHNhdmllbm90xIFqcyIKKworI34gbXNnaWQgIkJsdWUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJaaWxhaXMgcHJpZWvFocSTasSBIHBhbmXEvGEgc2F2aWVub3TEgWpzIgorCisjfiBtc2dpZCAiV2hpdGUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJCYWx0YWlzIHByaWVrxaHEk2rEgSBwYW5lxLxhIHNhdmllbm90xIFqcyIKKworI34gbXNnaWQgIkJsYWNrIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiTWVsbmFpcyBwcmlla8WhxJNqxIEgcGFuZcS8YSBzYXZpZW5vdMSBanMiCisKKyN+IG1zZ2lkICJHcmF5IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUGVsxJNrYWlzIHByaWVrxaHEk2rEgSBwYW5lxLxhIHNhdmllbm90xIFqcyIKKworI34gbXNnaWQgIk9yYW5nZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk9yYW7FvmFpcyBwcmlla8WhxJNqxIEgcGFuZcS8YSBzYXZpZW5vdMSBanMiCisKKyN+IG1zZ2lkICJSZWQgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJTYXJrYW5haXMgcHJpZWvFocSTasSBIHBhbmXEvGEgc2F2aWVub3TEgWpzIgorCisjfiBtc2dpZCAiWWVsbG93IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiRHplbHRlbmFpcyBwcmlla8WhxJNqxIEgcGFuZcS8YSBzYXZpZW5vdMSBanMiCisKKyN+IG1zZ2lkICJTcHJlYWQgT3V0cHV0IgorI34gbXNnc3RyICJJenBsZXN0IGl6dmFkdSIKKworI34gbXNnaWQgIkRvd25taXgiCisjfiBtc2dzdHIgIkxlanVwbWlrc8STxaFhbmEiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIElucHV0IgorI34gbXNnc3RyICJWaXJ0dcSBbMSBIG1pa3NlcmEgaWV2YWRzIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBPdXRwdXQiCisjfiBtc2dzdHIgIlZpcnR1xIFsxIEgbWlrc2VyYSBpenZhZHMiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIENoYW5uZWxzIgorI34gbXNnc3RyICJWaXJ0dcSBbMSBIG1pa3NlcmEga2FuxIFsaSIKKworI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyAlZCBmdW5rY2lqYSIKKworI34gbXNnaWQgIiVzIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyBmdW5rY2lqYSIKKworI34gbXNnaWQgIkdvdCB1bmV4cGVjdGVkIGZyYW1lIHNpemUgb2YgJXUgaW5zdGVhZCBvZiAldS4iCisjfiBtc2dzdHIgIlNhxYbEk211IG5lZ2FpZMSrdHUga2FkcmEgaXptxJNydSAldSwgbmV2aXMgJXUuIgorCisjfiBtc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBvbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIlJhZMSBcyBrxLzFq2RhIG5vbGFzb3QgJWQgYmFpdHVzIG5vIGllcsSrY2VzIFwiJXNcIi4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZW5xdWV1ZSBidWZmZXJzIGluIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiTmV2YXIgaWVyaW5kb2QgYnVmZXJ1cyBpZXLEq2PEkyBcIiVzXCIuIgorCisjfiBtc2dpZCAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJOZWl6ZGV2xIFzIHNhxYZlbXQgdmlkZW8ga2FkcnVzIG5vIGllcsSrY2VzIFwiJXNcIi4iCisKKyN+IG1zZ2lkICJGYWlsZWQgYWZ0ZXIgJWQgdHJpZXMuIGRldmljZSAlcy4gc3lzdGVtIGVycm9yOiAlcyIKKyN+IG1zZ3N0ciAiTmV2ZWlrc21lIHDEk2MgJWQgbcSTxKNpbsSBanVtaWVtLiBpZXLEq2NlICVzLiBzaXN0xJNtYXMga8S8xatkYTogJXMiCmRpZmYgLS1naXQgYS9wby9tZXNvbi5idWlsZCBiL3BvL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMTFhNzIKLS0tIC9kZXYvbnVsbAorKysgYi9wby9tZXNvbi5idWlsZApAQCAtMCwwICsxLDMgQEAKK2kxOG4gPSBpbXBvcnQoJ2kxOG4nKQorCitpMThuLmdldHRleHQoJ2dzdC1wbHVnaW5zLWdvb2QtMS4wJywgcHJlc2V0OiAnZ2xpYicpCmRpZmYgLS1naXQgYS9wby9tdC5wbyBiL3BvL210LnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNDA3YjkKLS0tIC9kZXYvbnVsbAorKysgYi9wby9tdC5wbwpAQCAtMCwwICsxLDc3MSBAQAorIyBNYWx0ZXNlIHRyYW5zbGF0aW9uIGZvciBnc3QtcGx1Z2lucy1nb29kLgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ3N0LXBsdWdpbnMtZ29vZCBwYWNrYWdlLgorIyBOQU1FIE9GIEFVVEhPUiA8bWljaGVsYnVnZWphQHJhYmF0bWFsdGEuY29tPiwgMjAwOC4KK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QtMC4xMC4xMC4zXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMDgtMTAtMjYgMTk6MDkrMDEwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogTWljaGVsIEJ1Z2VqYSA8bWljaGVsYnVnZWphQHJhYmF0bWFsdGEuY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IE1hbHRlc2UgPHRyYW5zbGF0aW9uLXRlYW0tbXRAbGlzdHMuc291cmNlZm9yZ2UubmV0PlxuIgorIkxhbmd1YWdlOiBtdFxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlgtUG9lZGl0LUxhbmd1YWdlOiBNYWx0ZXNlXG4iCisiWC1Qb2VkaXQtQ291bnRyeTogTUFMVEFcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICJQcm9ibGVtIGZpZC1kZWNvZGluZyB0YWwtaXN0YW1wYSBKUEVHIgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIk1odXggcG9zc2libGkgbmFxYmFkIG1hcy1zZXJ2ZXIiCisKK21zZ2lkICJObyBVUkwgc2V0LiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiTWh1eCBwb3NzaWJsaSBuYXFiYWQgbWFzLXNlcnZlciIKKworIywgZnV6enkKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiS3VudGF0dCBtYXMtc291bmQgc2VydmVyIG1hIMShaWV4IHN0YWJiaWxpdCIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICJBcHBhcnQgJyVzJyBtYSBqYWfEp21pbHggdmlkZW8gY2FwdHVyZSIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAiSW5wdXQgYXVkaW8gbWEgbnN0YWJ4IGpldyBtaHV4IHZhbGlkdS4gQVZJIHN0cmVhbSBqaXN0YSBqa3VuIGtvcnJvdHQuIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJJbC1mYWpsIG1hIGZpxKcgbC1lYmRhIHN0cmVhbSBsaSB0aXN0YSB0aW5kYXFxLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiSWwtZmFqbCBtaHV4IHZhbGlkdSB1IG1hIGppc3RheCBqaW5kYXFxIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiSWwtZmFqbCBodXdhIGtvcnJvdHQgdSBtYSBqaXN0YXggamluZmV0YcSnLiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJJbC1mYWpsIG1odXgga29tcGx1dCB1IG1hIGppc3RheCBqaW5kYXFxLCIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiSmlzdGEgamt1biBpbGxpIGwtdmlkam8gxKFvIGRhbiBpbC1mYWpsIG1hIGppZGhpcnggc2V3d2EuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIklsLWZhamwgZmnEpyBha3RhciBzdHJlYW1zIG1pbGxpIHN1cHBvc3QuIFNlciBpbmRvcXEgbC1ld3dlbCAlZCIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIkF1ZGlvIGRldmljZSBtYSBqaXN0YXggamludHXFvGEuIFFlZCBqaW50dcW8YSBtaW5uIHByb2dyYW1tIGllxKdvci4iCisKKyMsIGZ1enp5Cittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIkF1ZGlvIGRldmljZSBtYSBqaXN0YXggamludHXFvGEuIE0nZ8SnYW5kZXggYcSLxItlc3MgZ8SnYWxpaC4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiQXVkaW8gZGV2aWNlIG1hIGppc3RheCBqaW50dcW8YS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisiTWEgbmlzdGF4IG5pZnRhxKcgYXBwYXJhdCB0YWwtYXdkam8gYmlleCBpbmRvcXEuIERpbCBpbC12ZXLFvGpvbmkgdGEnIE9wZW4gIgorIlNvdW5kIFN5c3RlbSBtaHV4IGlzc2FwcG9ydGphdGhhIG1pbm4gZGFuIGwtZWxlbWVudC4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiSWQtZGFxcSBtaHV4IGlzc2FwcGFydGphdCBtaW5uIGRhbiBsLWFwcGFyYXQgdGFsLWF3ZGpvLiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAixbtiYWxsIGZpaWQtZGFxcSB0YWwtYXdkam8uIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJJcnJla29yZGphciBtaHV4IGlzc2FwcG9ydGphdCBtaW5uIGRhbiBsLWFwcGFyYXQgdGFsLWF3ZGpvLiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIsW7YmFsbCBmbC1pcnJla29yZGphciBtaWxsLWFwcGFyYXQgdGFsLWF3ZGpvLiIKKworIywgZnV6enkKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJBdWRpbyBkZXZpY2UgbWEgamlzdGF4IGppbnR1xbxhIGJpZXggdGlycmVrb3JkamEuIE0nZ8SnYW5kZXggYcSLxItlc3MgZ8SnYWxpaC4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIkF1ZGlvIGRldmljZSBtYSBqaXN0YXggamludHXFvGEgYmlleCB0aXJyZWtvcmRqYS4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAiUmVjb3JkIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWlrcm9mb251IgorCisjLCBmdXp6eQorbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIkxpbmUtaW4iCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIiIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICIiCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIiIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJWb2x1bSIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIkdhaW4iCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJNb25pdG9yIgorCisjLCBmdXp6eQorbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIlNwZWFrZXIiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIiIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICIiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIiIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlByb2JsZW1hIGZpbC1xYXIoKWkgJWQgYnl0ZXMgZmlkLWRldmljZSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIk1hIG5pc3RheCBucWFiYmVsIGJ1ZmZlcnMgbWlsbC1hcHBhcmF0ICclcycuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAiIgorIklkLWRyaXZlciB0YWwtYXBwYXJhdCAnJXMnIG1hIGppc3NhcHBvcnRqYSBsLWViZGEgY2FwdHVyZSBtZXRob2QgbWlmaHVtLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICIiCisiSWQtZHJpdmVyIHRhbC1hcHBhcmF0ICclcycgbWEgamlzc2FwcG9ydGphIGwtZWJkYSBjYXB0dXJlIG1ldGhvZCBtaWZodW0uIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICJEZXZpY2UgJyVzJyBtaHV4IGNhcHR1cmUgZGV2aWNlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiQXBwYXJ0ICclcycgbWEgamlzdGF4IGphZ8SnbWVsIGNhcHR1cmUgYmkgJWR4JWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIkFwcGFydCAnJXMnIG1hIGppc3RheCBqYWfEp21lbCBjYXB0dXJlIGYnZGFuIGlsLWZvcm1hdCIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiRGV2aWNlICclcycgbWh1eCBjYXB0dXJlIGRldmljZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICJNaHV4IHBvc3NpYmxpIG7EoWliIHBhcmFtZXRyaSB0YWwtYXBwYXJhdCAnJXMnIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiIgorIkFwcGFyYXQgbGkgamFxcmEgdmlkZW8gaW5wdXQgbWEgYcSLxItldHRheCBpcy1zZXR0aW5ncyDEoW9kZGEgdGFsLWZyYW1lIHJhdGUuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIiIKKyJBcHBhcmF0IGxpIGphcXJhIHZpZGVvIGlucHV0IG1hIGHEi8SLZXR0YXggaXMtc2V0dGluZ3MgxKFvZGRhIHRhbC1mcmFtZSByYXRlLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiIgorIklkLWRyaXZlciB0YWwtYXBwYXJhdCAnJXMnIG1hIGppc3NhcHBvcnRqYSBsLWViZGEgY2FwdHVyZSBtZXRob2QgbWlmaHVtLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICIiCisiSWQtZHJpdmVyIHRhbC1hcHBhcmF0ICclcycgbWEgamlzc2FwcG9ydGphIGwtZWJkYSBjYXB0dXJlIG1ldGhvZCBtaWZodW0uIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIiIKKyJBcHBhcmF0IGxpIGphcXJhIHZpZGVvIGlucHV0IG1hIGHEi8SLZXR0YXggaXMtc2V0dGluZ3MgxKFvZGRhIHRhbC1mcmFtZSByYXRlLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlByb2JsZW1hIGJpZXggaW7EoWliIHNldHRpbmdzIHRhdC10dW5lciAlZCBmdXEgbC1hcHBhcnQgJyVzJyIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiUHJvYmxlbWEgZmlsLXFhcigpaSAlZCBieXRlcyBmaWQtZGV2aWNlICclcycuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIkRldmljZSAnJXMnIG1odXggY2FwdHVyZSBkZXZpY2UuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIlByb2JsZW1hIGJpZXggbmlzc2V0dGphIGlucHV0ICVkIGZ1cSBhcHBhcmF0ICVzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIlByb2JsZW1hIGJpZXggbmlzc2V0dGphIGlucHV0ICVkIGZ1cSBhcHBhcmF0ICVzLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlByb2JsZW1hIGJpZXggaW7EoWliIHNpZ25hbCBzdHJlbmd0aCBmdXEgbC1hcHBhcmF0ICclcycuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisiSWQtZHJpdmVyIHRhbC1hcHBhcmF0ICclcycgbWEgamlzc2FwcG9ydGphIGwtZWJkYSBjYXB0dXJlIG1ldGhvZCBtaWZodW0uIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIkFwcGFyYXQgbGkgamFxcmEgdmlkZW8gaW5wdXQgbWEgYcSLxItldHRheCBpcy1zZXR0aW5ncyDEoW9kZGEgdGFsLWZyYW1lIHJhdGUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIkFwcGFyYXQgbGkgamFxcmEgdmlkZW8gaW5wdXQgbWEgYcSLxItldHRheCBpcy1zZXR0aW5ncyDEoW9kZGEgdGFsLWZyYW1lIHJhdGUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJBcHBhcmF0IGxpIGphcXJhIHZpZGVvIGlucHV0IG1hIGHEi8SLZXR0YXggaXMtc2V0dGluZ3MgxKFvZGRhIHRhbC1mcmFtZSByYXRlLiIKKworIywgZnV6enkKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiUHJvYmxlbSBmaWQtZGVjb2RpbmcgdGFsLWlzdGFtcGEgSlBFRyIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorIlByb2JsZW1hIGJpZXggbsShaWIgaWwta2FwYcSLaXRhamlldCB0YWwtYXBwYXJhdCAnJXMnOiBNaHV4IHY0bDIgZHJpdmVyLiAiCisiScSLxItla2tqYSBqZWtrIGh1eCB2NGwxIGRyaXZlci4gIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiTWh1eCBwb3NzaWJsaSB0Zml0dHhqYSBnxKdhbCBhdHRyaWJ1dGkgdGEnIGlucHV0ICVkIMShb2wtYXBwYXJhdCAlcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJQcm9ibGVtYSBiaWV4IGluxKFpYiBzZXR0aW5ncyB0YXQtdHVuZXIgJWQgZnVxIGwtYXBwYXJ0ICclcyciCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICJNYSBzdGFqeCBuZml0dGV4IG5vcm0gZnVxIGFwcGFyYXQgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkwtYXR0cmlidXRpIHRhJyBrb250cm9sbCB0YScgZGV2aWNlICclcycgbWEgbnFyYXd4LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJEZXZpY2UgJyVzJyBtaHV4IGlkZW50aWZpa2F0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICJEYW4gbWh1eCBkZXZpY2UgJXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiRGV2aWNlICclcycgbWEgbmlzdGF4IG5pZnRhxKd1IGJpZXggbmFxcmEgamV3IG5pa3RlYi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICJEZXZpY2UgJyVzJyBtaHV4IGNhcHR1cmUgZGV2aWNlLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIkRldmljZSAnJXMnIG1odXggY2FwdHVyZSBkZXZpY2UuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiRGV2aWNlICclcycgbWh1eCBjYXB0dXJlIGRldmljZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJEZXZpY2UgJyVzJyBtYSBuaXN0YXggbmlmdGHEp3UgYmlleCBuYXFyYSBqZXcgbmlrdGViLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTWEgc3RhanR4IG5pc3NldGphIG5vcm0gZnVxIGFwcGFyYXQgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJQcm9ibGVtYSBiaWV4IGluxKFpYiBpbC1mcmVrd2VuemEgbGkgaml0cmHFvG1ldHRpIGZ1cWhhIGFwcGFyYXQgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorIlByb2JsZW1hIGJpZXggbmlzc2V0dGphIGwtZnJla3dlbnphIGxpIGppdHJhxbxtZXR0aSBmdXFoYSBhcHBhcmF0ICclcycgZ8SnYWwgIgorIiVsdSBIei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiUHJvYmxlbWEgYmlleCBpbsShaWIgc2lnbmFsIHN0cmVuZ3RoIGZ1cSBsLWFwcGFyYXQgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlByb2JsZW1hIGJpZXggaW7EoWliIHZhbHVyIHRhJyBjb250cm9sICVkIGZ1cSBsLWFwcGFyYXQgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlByb2JsZW1hIGJpZXggbmlzc2V0amEgdmFsdXIgJWQgbGlsIGNvbnRyb2wgJWQgZnVxIGwtYXBwYXJhdCAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIlByb2JsZW1hIGJpZXggaW7EoWliIGN1cnJlbnQgaW5wdXQgZnVxIGFwcGFyYXQgJyVzJy4gSmlzdGEgamt1biBsaSBodXdhICIKKyJhcHBhcmF0IHRhci1yYWRqdS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJQcm9ibGVtYSBiaWV4IGluxKFpYiBjdXJyZW50IGlucHV0IGZ1cSBhcHBhcmF0ICclcycuIEppc3RhIGprdW4gbGkgaHV3YSAiCisiYXBwYXJhdCB0YXItcmFkanUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJQcm9ibGVtYSBiaWV4IG5pc3NldHRqYSBpbnB1dCAlZCBmdXEgYXBwYXJhdCAlcy4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICJNYSB0aXN0YXggdGliZGVsIGlyLXJlc29sdXRpb24gd2FxdCBydW50aW1lLiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAiTWEgbmlzdGF4IG7Ep2FkZGVtIG1pbmfEp2FqciBhcmxvxKHEoSIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAiUHJvYmxlbWEgaW50ZXJuYSBmaWQtZGF0YSBzdHJlYW0iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICJQcm9ibGVtYSBpbnRlcm5hIHRhJyBkYXRhIGZsb3ciCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBjYXB0dXJlIgorI34gbXNnc3RyICJEZXZpY2UgJyVzJyBtaHV4IGNhcHR1cmUgZGV2aWNlLiIKKworI34gbXNnaWQgIkdvdCB1bmV4cGVjdGVkIGZyYW1lIHNpemUgb2YgJXUgaW5zdGVhZCBvZiAldS4iCisjfiBtc2dzdHIgIklyxItpdmVqdCBmcmFtZSBzaXplIHRhJyAldSBtaW5mbG9rIGtpZiBraWVuIG1pc3Rlbm5pIHRhJyAldS4iCisKKyN+IG1zZ2lkICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIlByb2JsZW1hIGJpZXggaW7EoWliIHZpZGVvIGZyYW1lcyBtaWxsLWFwcGFyYXQgJyVzJy4iCisKKyN+IG1zZ2lkICJGYWlsZWQgYWZ0ZXIgJWQgdHJpZXMuIGRldmljZSAlcy4gc3lzdGVtIGVycm9yOiAlcyIKKyN+IG1zZ3N0ciAiIgorI34gIlByb2JsZW1hIHdhcmEgbGkgcHJ1dmFqdCAlZCBkcmFiaS4gYXBwYXJhdCAlcy4gxbxiYWxsIGZpcy1zaXN0ZW1hOiAlcyIKKworI34gbXNnaWQgIkJhc3MiCisjfiBtc2dzdHIgIkJhc3MiCisKKyN+IG1zZ2lkICJUcmVibGUiCisjfiBtc2dzdHIgIlRyZWJsZSIKKworI34gbXNnaWQgIlN5bnRoIgorI34gbXNnc3RyICJTeW50aCIKKworI34gbXNnaWQgIlBDTSIKKyN+IG1zZ3N0ciAiUENNIgorCisjfiBtc2dpZCAiU3BlYWtlciIKKyN+IG1zZ3N0ciAiU3BlYWtlciIKKworI34gbXNnaWQgIkxpbmUtaW4iCisjfiBtc2dzdHIgIkxpbmUtaW4iCisKKyN+IG1zZ2lkICJDRCIKKyN+IG1zZ3N0ciAiQ0QiCisKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAiTWl4ZXIiCisKKyN+IG1zZ2lkICJQQ00tMiIKKyN+IG1zZ3N0ciAiUENNLTIiCisKKyN+IG1zZ2lkICJJbi1nYWluIgorI34gbXNnc3RyICJJbi1nYWluIgorCisjfiBtc2dpZCAiT3V0LWdhaW4iCisjfiBtc2dzdHIgIk91dC1nYWluIgorCisjfiBtc2dpZCAiTGluZS0xIgorI34gbXNnc3RyICJMaW5lLTEiCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgIkxpbmUtMiIKKworI34gbXNnaWQgIkxpbmUtMyIKKyN+IG1zZ3N0ciAiTGluZS0zIgorCisjfiBtc2dpZCAiRGlnaXRhbC0xIgorI34gbXNnc3RyICJEaWdpdGFsLTEiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTIiCisjfiBtc2dzdHIgIkRpZ2l0YWwtMiIKKworI34gbXNnaWQgIkRpZ2l0YWwtMyIKKyN+IG1zZ3N0ciAiRGlnaXRhbC0zIgorCisjfiBtc2dpZCAiUGhvbmUtaW4iCisjfiBtc2dzdHIgIlBob25lLWluIgorCisjfiBtc2dpZCAiUGhvbmUtb3V0IgorI34gbXNnc3RyICJQaG9uZS1vdXQiCisKKyN+IG1zZ2lkICJWaWRlbyIKKyN+IG1zZ3N0ciAiVmlkam8iCisKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAiUmFkanUiCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIgorI34gbXNnc3RyICJNYSBuaXN0YXggbmlmdGHEpyBhcHBhcmF0IHRhbC1hd2RqbyBnxKdhbCBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKKworI34gbXNnaWQgIiIKKyN+ICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIFRoaXMgdmVyc2lvbiBvZiAiCisjfiAidGhlIE9wZW4gU291bmQgU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIk1hIG5pc3RheCBuaWZ0YcSnIGFwcGFyYXQgdGFsLWF3ZGpvIGfEp2FsIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIERpbiBpbC0iCisjfiAidmVyempvbmkgdGEnIE9wZW4gU291bmQgU3lzdGVtIG1odXggaXNzYXBwb3J0amF0YSBtaW5uIGRpbiBsLWVsZW1lbnQuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1hc3RlciIKKyN+IG1zZ3N0ciAiRmFzdCIKKworI34gbXNnaWQgIkZyb250IgorI34gbXNnc3RyICJRdWRkaWVtIgorCisjfiBtc2dpZCAiUmVhciIKKyN+IG1zZ3N0ciAiV2FyYSIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIkhlYWRwaG9uZXMiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICJDZW50ZXIgLyBMRkUiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiU3Vycm91bmQiCisjfiBtc2dzdHIgIlN1cnJvdW5kIHNvdW5kIgorCisjfiBtc2dpZCAiU2lkZSIKKyN+IG1zZ3N0ciAixKBlbmIiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICJIZWFkcGhvbmVzIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgQm9vc3QiCisjfiBtc2dzdHIgIk1pa3JvZm9udSIKKworI34gbXNnaWQgIklucHV0IgorI34gbXNnc3RyICJJbnB1dCIKKworI34gbXNnaWQgIlN0ZXJlbyIKKyN+IG1zZ3N0ciAiU3RlcmVvIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlN1cnJvdW5kIFNvdW5kIgorI34gbXNnc3RyICJTdXJyb3VuZCBzb3VuZCIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIk1pa3JvZm9udSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTWlrcm9mb251IgorCisjfiBtc2dpZCAiQ2VudGVyIC8gTEZFIgorI34gbXNnc3RyICJDZW50ZXIgLyBMRkUiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAiU3RlcmVvIgorCisjLCBmdXp6eQorI34gbXNnaWQgIklucHV0IE1peCIKKyN+IG1zZ3N0ciAiSW5wdXQgbWl4IgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAiTWlrcm9mb251IgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAiTWlrcm9mb251IgorCisjfiBtc2dpZCAiT24iCisjfiBtc2dzdHIgIk9uIgorCisjfiBtc2dpZCAiT2ZmIgorI34gbXNnc3RyICJPZmYiCisKKyN+IG1zZ2lkICJGYXN0IgorI34gbXNnc3RyICJGYXN0IgorCisjfiBtc2dpZCAiTG93IgorI34gbXNnc3RyICJMb3ciCisKKyN+IG1zZ2lkICJNZWRpdW0iCisjfiBtc2dzdHIgIk1lZGl1bSIKKworI34gbXNnaWQgIkhpZ2giCisjfiBtc2dzdHIgIkhpZ2giCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICJWZXJ5IGhpZ2giCisKKyN+IG1zZ2lkICJQcm9kdWN0aW9uIgorI34gbXNnc3RyICJQcm9kdWN0aW9uIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCisjfiBtc2dzdHIgIk1pa3JvZm9udSB0YWwtcGFuZWxsYSB0YScgcXVkZGllbSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIEluIgorI34gbXNnc3RyICJGcm9udCBwYW5lbCBsaW5lLWluIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkZyb250IFBhbmVsIEhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIkZyb250IHBhbmVsIGhlYWRwaG9uZXMiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBPdXQiCisjfiBtc2dzdHIgIkZyb250IHBhbmVsIGxpbmUtaW4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3IgYcSnZGFyIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3Igcm/FvGEiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5lY3RvciBCbHUiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiV2hpdGUgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3IgYWJqYWQiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3IgaXN3ZWQiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiR3JheSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5lY3RvciBHcmnFvCIKKworIywgZnV6enkKKyN+IG1zZ2lkICJPcmFuZ2UgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3Igb3JhbsSham8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiUmVkIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmVjdG9yIGHEp21hciIKKworIywgZnV6enkKKyN+IG1zZ2lkICJZZWxsb3cgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3IgaXNmYXIiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiR3JlZW4gRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJGcm9udCBwYW5lbCBjb25uZWN0b3IgYcSnZGFyIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlBpbmsgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJGcm9udCBwYW5lbCBjb25uZWN0b3Igcm/FvGEiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQmx1ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkZyb250IHBhbmVsIGNvbm5lY3RvciBibHUiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiV2hpdGUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJGcm9udCBwYW5lbCBjb25uZWN0b3IgYWJqYWQiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQmxhY2sgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJGcm9udCBwYW5lbCBjb25uZWN0b3IgaXN3ZWQiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiR3JheSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkZyb250IHBhbmVsIGNvbm5lY3RvciBHcmnFvCIKKworIywgZnV6enkKKyN+IG1zZ2lkICJPcmFuZ2UgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJGcm9udCBQYW5lbCBjb25uZWN0b3Igb3JhbsSham8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiUmVkIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiRnJvbnQgcGFuZWwgY29ubmVjdG9yIGHEp21hciIKKworIywgZnV6enkKKyN+IG1zZ2lkICJZZWxsb3cgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJGcm9udCBwYW5lbCBjb25uZWN0b3IgaXNmYXIiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBJbnB1dCIKKyN+IG1zZ3N0ciAiVmlydHVhbCBtaXhlciBpbnB1dCIKKworIywgZnV6enkKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIE91dHB1dCIKKyN+IG1zZ3N0ciAiVmlydHVhbCBtaXhlciBvdXRwdXQiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBDaGFubmVscyIKKyN+IG1zZ3N0ciAiVmlydHVhbCBtaXhlciBpbnB1dCIKKworIywgZnV6enkKKyN+IG1zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIG9uIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiUHJvYmxlbWEgZmlsLXFhcigpaSAlZCBieXRlcyBmaWQtZGV2aWNlICclcycuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkNvdWxkIG5vdCBlbnF1ZXVlIGJ1ZmZlcnMgaW4gZGV2aWNlICclcycuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNvdW5kIHNlcnZlciIKKyN+IG1zZ3N0ciAiS3VudGF0dCBtYXMtc291bmQgc2VydmVyIG1hIMShaWV4IHN0YWJiaWxpdCIKKworI34gbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBzb3VuZCBzZXJ2ZXIgY2FwYWJpbGl0aWVzIgorI34gbXNnc3RyICJNaHV4IHBvc3NpYmxpIHQtdGZpdHR4aWphIGfEp2FsbC1rYXBhxItpdGEgdGFzLXNvdW5kIHNlcnZlciIKKworI34gbXNnaWQgIkVycm9yIHN0b3BwaW5nIHN0cmVhbWluZyBjYXB0dXJlIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJQcm9ibGVtIGJpZXggaW53YXFxYWYgc3RyZWFtaW5nIGNhcHR1cmUgbWlsbC1hcHBhcmF0ICclcycuIgorCisjfiBtc2dpZCAiRXJyb3Igc3RhcnRpbmcgc3RyZWFtaW5nIGNhcHR1cmUgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIlByb2JsZW0gYmlleCBuaWJkYSBzdHJlYW1pbmcgY2FwdHVyZSBtaWxsLWFwcGFyYXQgJyVzJy4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZ2V0IGVub3VnaCBidWZmZXJzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJNYSBuaXN0YXggbmlyxItpZXZpIGJpxbzFvGVqamVkIGJ1ZmZlcnMgbWlsbC1hcHBhcmF0ICclcycuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGdldCBidWZmZXJzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJNYSBuaXN0YXggbmlyxItpZXZpIGJ1ZmZlcnMgbWlsbC1hcHBhcmF0ICclcycuIgorCisjfiBtc2dpZCAiTm8gZnJlZSBidWZmZXJzIGZvdW5kIGluIHRoZSBwb29sIGF0IGluZGV4ICVkLiIKKyN+IG1zZ3N0ciAiTWEgbnN0YWIgbC1lYmRhIGJ1ZmZlciBmcmVlIGZsLWluZGnEi2kgJWQgdGFsLXBvb2wuIgorCisjfiBtc2dpZCAiaW5zdWZmaWNpZW50IG1lbW9yeSB0byBlbnF1ZXVlIGEgdXNlciBwb2ludGVyIGJ1ZmZlci4gZGV2aWNlICVzLiIKKyN+IG1zZ3N0ciAiaW5zdWZmaWNpZW50IG1lbW9yeSB0byBlbnF1ZXVlIGEgdXNlciBwb2ludGVyIGJ1ZmZlci4gZGV2aWNlICVzLiIKKworI34gbXNnaWQgIiIKKyN+ICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4gTm90IGVub3VnaCBtZW1vcnkuIgorI34gbXNnc3RyICIiCisjfiAiUHJvYmxlbWEgYmlleCBpbsShaWIgdmlkZW8gZnJhbWVzIG1pbGwtYXBwYXJhdCAnJXMnLiBJbC1tZW1vcmphIGFsbG9rYXRhICIKKyN+ICJtaGlqaWV4IGJpxbzFvGVqamVkLiIKKworI34gbXNnaWQgIiIKKyN+ICJUaGUgYnVmZmVyIHR5cGUgaXMgbm90IHN1cHBvcnRlZCwgb3IgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMsIG9yIG5vICIKKyN+ICJidWZmZXJzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgeWV0LCBvciB0aGUgdXNlcnB0ciBvciBsZW5ndGggYXJlIGludmFsaWQuICIKKyN+ICJkZXZpY2UgJXMiCisjfiBtc2dzdHIgIiIKKyN+ICJUaGUgYnVmZmVyIHR5cGUgaXMgbm90IHN1cHBvcnRlZCwgb3IgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMsIG9yIG5vICIKKyN+ICJidWZmZXJzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgeWV0LCBvciB0aGUgdXNlcnB0ciBvciBsZW5ndGggYXJlIGludmFsaWQuICIKKyN+ICJkZXZpY2UgJXMiCisKKyN+IG1zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMuJyIKKyN+IG1zZ3N0ciAiTC1hdHRyaWJ1dGkgdGEnIGtvbnRyb2xsIHRhJyBkZXZpY2UgJyVzJyBtYSBucXJhd3guIgpkaWZmIC0tZ2l0IGEvcG8vbmIucG8gYi9wby9uYi5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Zjc4NDRlCi0tLSAvZGV2L251bGwKKysrIGIvcG8vbmIucG8KQEAgLTAsMCArMSw3NzkgQEAKKyMgTm9yd2VnaWFuIGJva21hYWwgdHJhbnNsYXRpb24gb2YgZ3N0LXV0aWxzLgorIyBUaGlzIGZpbGUgaXMgcHV0IGluIHRoZSBwdWJsaWMgZG9tYWluLgorIworIyBLamFydGFuIE1hcmFhcyA8a21hcmFhc0Bnbm9tZS5vcmc+LCAyMDA0LTIwMTAuCisjIEpvaG5ueSBBLiBTb2xidSA8am9obm55QHNvbGJ1Lm5ldD4sIDIwMTItMjAxNgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZCAxLjcuMlxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDE2LTA4LTA1IDIzOjQ3KzAyMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEpvaG5ueSBBLiBTb2xidSA8am9obm55QHNvbGJ1Lm5ldD5cbiIKKyJMYW5ndWFnZS1UZWFtOiBOb3J3ZWdpYW4gQm9rbWFhbCA8aTE4bi1uYkBsaXN0ZXIucGluZy51aW8ubm8+XG4iCisiTGFuZ3VhZ2U6IG5iX05PXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiWC1HZW5lcmF0b3I6IFBvZWRpdCAxLjguNy4xXG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIkphY2stc2VydmVyIGlra2UgZnVubmV0IgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICJLbGFydGUgaWtrZSDDpSBkZWtvZGUgSlBFRy1iaWxkZSIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiwqslc8K7IGF2IMKrJXPCuyIKKworbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAiS3VubmUgaWtrZSBrb2JsZSB0aWwgdGplbmVyLiIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJJbmdlbiBVUkwgc2F0dC4iCisKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIkt1bm5lIGlra2Ugc2zDpSBvcHAgbmF2biBww6UgdGplbmVyLiIKKworbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICJLdW5uZSBpa2tlIGV0YWJsZXJlIHRpbGtvYmxpbmcgdGlsIHRqZW5lci4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICJPcHBzZXR0IGF2IHNpa2tlciB0aWxrb2JsaW5nIGZlaWxldC4iCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICJFbiBuZXR0dmVya3NmZWlsIG9wcHN0b2QsIGVsbGVyIHRqZW5lcmVuIGx1a2tldCB1dmVudGV0IHRpbGtvYmxpbmdlbi4iCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIlRqZW5lciBzZW5kdGUgdWd5bGRpZ2UgZGF0YS4iCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiVGplbmVyIHN0w7h0dGVyIGlra2Ugc8O4a2luZy4iCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIkluZ2VuIGVsbGVyIHVneWxkaWcgaW5uZGF0YWx5ZCwgQVZJLXN0csO4bW1lbiB2aWwgYmxpIHNrYWRldC4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIkZpbGVuIGlubmVob2xkZXIgaW5nZW4gc3BpbGxiYXJlIHN0csO4bW1lci4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkZpbGVuIGVyIHVneWxkaWcgb2cga2FuIGlra2Ugc3BpbGxlcy4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiS2FuIGlra2Ugc3BpbGxlIGF2IHN0csO4bW1lbiBmb3JkaSBkZW4gZXIga3J5cHRlcnQgbWVkIFBsYXlSZWFkeSBEUk0uIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJGaWxlbiBlciBza2FkZXQgb2cga2FuIGlra2Ugc3BpbGxlcy4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIlVneWxkaWcgYXRvbXN0w7hycmVsc2UuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJGaWxlbiBlciB1ZnVsbHN0ZW5kaWcgb2cga2FuIGlra2Ugc3BpbGxlcy4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIlZpZGVvZW4gaSBkZW5uZSBmaWxlbiBzcGlsbGVzIGthbnNramUgaWtrZSBhdiBrb3JyZWt0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICJGaWxlbiBpbm5laG9sZGVyIGZvciBtYW5nZSBzdHLDuG1tZXIuIFNwaWxsZXIgYmFyZSBmw7hyc3RlICVkIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyJJbmdlbiBzdMO4dHRldCBzdHLDuG0gYmxlIGZ1bm5ldC4gRHUgbcOlIGthbnNramUgaW5zdGFsbGVyZSBlbiBHU3RyZWFtZXIgUlRTUCAiCisidXR2aWRlbHNlc3Byb2dyYW10aWxsZWdnIGZvciBSZWFsIG1lZGllc3Ryw7htbWVyLiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorIkluZ2VuIHN0w7h0dGV0IHN0csO4bSBibGUgZnVubmV0LiBEdSBtw6Uga2Fuc2tqZSB0aWxsYXRlIGZsZXJlICIKKyJ0cmFuc3BvcnRwcm90b2tvbGxlciBlbGxlciBkZW4ga2FuIG1hbmdsZSBkZW4gcmV0dGUgR1N0cmVhbWVyIFJUU1AtIgorInV0dmlkZWxzZXN0aWxsZWdnZXQuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIkt1bm5lIGlra2Ugw6VwbmUgbHlkZW5oZXRlbiBmb3IgYXZzcGlsbGluZy4gRW5oZXRlbiBicnVrZXMgYXYgZXQgYW5uZXQgIgorInByb2dyYW0uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJLdW5uZSBpa2tlIMOlcG5lIGx5ZGVuaGV0ZW4gZm9yIGF2c3BpbGxpbmcuIER1IGhhciBpa2tlIHRpbGxhdGVsc2UgdGlsIMOlIMOlcG5lICIKKyJlbmhldGVuLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICJLdW5uZSBpa2tlIMOlcG5lIGx5ZGVuaGV0IGZvciBhdnNwaWxsaW5nLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKyJLdW5uZSBpa2tlIMOlcG5lIGx5ZGVuaGV0ZW4gZm9yIGF2c3BpbGxpbmcuIERlbm5lIHZlcnNqb25lbiBhdiDCq09wZW4gU291bmQgIgorIlN5c3RlbcK7IHN0w7h0dGVzIGlra2UgYXYgZGV0dGUgZWxlbWVudGV0LiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJBdnNwaWxsaW5nIHN0w7h0dGVzIGlra2UgYXYgZGVubmUgbHlkZW5oZXRlbi4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIkx5ZGF2c3BpbGxpbmdzZmVpbCIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiT3BwdGFrIHN0w7h0dGVzIGlra2UgYXYgZGVubmUgbHlkZW5oZXRlbi4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJGZWlsIHZlZCBvcHB0YWsgZnJhIGx5ZGVuaGV0ZW4uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiS3VubmUgaWtrZSDDpXBuZSBseWRlbmhldGVuIGZvciBvcHB0YWsuIER1IGhhciBpa2tlIHRpbGxhdGVsc2UgdGlsIMOlIMOlcG5lICIKKyJlbmhldGVuLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiS3VubmUgaWtrZSDDpXBuZSBseWRlbmhldCBmb3Igb3BwdGFrLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICJDb3JlQXVkaW8tZW5oZXQgaWtrZSBmdW5uZXQiCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIkNvcmVBdWRpby1lbmhldCBrdW5lIGlra2Ugw6VwbmVzIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAiT3BwdGFrc2tpbGRlIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWlrcm9mb24iCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICJMaW5qZSBpbm4iCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiSW50ZXJuIENEIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIlNQRElGIElubiIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICJBVVggMSBpbm4iCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAiQVVYIDIgaW5uIgorCittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIktvZGVrLUxvb3BiYWNrIgorCittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICJTdW5WVFMtTG9vcGJhY2siCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIlZvbHVtIgorCittc2dpZCAiR2FpbiIKK21zZ3N0ciAiU3R5cmtlIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiTW9uaXRvciIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIklubmVieWdnZXQgaMO4eXR0YWxlciIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiSG9kZXRlbGVmb24iCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiTGluamUgdXQiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIlNQRElGIHV0IgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICJBVVggMSB1dCIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiQVVYIDIgdXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRmVpbCB2ZWQgbGVzaW5nIGF2JSBkIGJ5dGVzIGZyYSBlbmhldGVuICclIHPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIkt1bm5lIGlra2Ugc3Blc2lmaXNlcmUgbXVsaWdlIHZpZGVvZm9ybWF0ZXIgZW5oZXQgwqslc8K7IGthbiBhcmJlaWRlIG1lZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiS3VubmUgaWtrZSB0aWxvcmRuZSBidWZmZXJlIGZyYSBlbmhldGVuIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIkRyaXZlcmVuIGF2IGVuaGV0ZW4gwqslc8K7IHN0w7h0dGVyIGlra2UgSU8gbWV0b2RlbiAlZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIkRyaXZlcmVuIGF2IGVuaGV0ZW4gwqslc8K7IHN0w7h0dGVyIGlra2Ugbm9lbiBramVudGUgSU8tbWV0b2Rlci4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAiRW5oZXRlbiDCqyVzwrsgZXIgb3BwdGF0dCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiRW5oZXQgwqslc8K7IGthbiBpa2tlIGZhbmdlIHZlZCAlZHglZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiRW5oZXQgwqslc8K7IGthbiBpa2tlIGZhbmdlIGkgZGV0IGFuZ2l0dGUgZm9ybWF0ZXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiRW5oZXQgwqslc8K7IHN0w7h0dGVyIGlra2UgaWtrZS1zYW1tZW5oZW5nZW5kZSBwbGFuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiS3VubmUgaWtrZSBmw6UgcGFyYW1ldGVyZSBww6UgZW5oZXRlbiDCqyVzwrsuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICJWaWRlb2VuaGV0ZW4gYWtzZXB0ZXJ0ZSBpa2tlIG55IGJpbGRlZnJla3ZlbnNpbm5zdGlsbGluZy4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICJWaWRlb2VuaGV0IHRpbGLDuGQgaWtrZSB1dGRhdGFmb3JtYXQuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIlZpZGVvZW5oZXQgcmV0dXJuZXJ0ZSB1Z3lsZGlnZSBkaW1lbnNqb25lci4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiVmlkZW8tZW5oZXRlciBicnVrZXIgZW4gdXN0w7h0dGV0IGxpbmplZmxldHRpbmdzbWV0b2RlLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICJWaWRlb2VuaGV0IGJydWtlciBldCB1c3TDuHR0ZXQgcGlrc2VsZm9ybWF0LiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICJLbGFydGUgaWtrZSDDpSBrb25maWd1cmVyZSBpbnRlcm50IGJ1ZmZlcm9tcsOlZGUiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIlZpZGVvZW5oZXQgZm9yZXNsbyBpa2tlIG5vZW4gYnVmZmVyc3TDuHJyZWxzZS4iCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICJJbmdlbiBuZWRzdHLDuG1zb21yw6VkZSDDpSBpbXBvcnRlcmUgZnJhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS3VubmUgaWtrZSBoZW50ZSBpbm5zdGlsbGluZ2VuZSBmcmEgbW90dGFrZXJlbiAlZCBww6UgZW5oZXRlbiDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkZlaWwgdmVkIGhlbnRpbmcgYXYgZnVua3Nqb25lciBmb3IgZW5oZXRlbiDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiRW5oZXRlbiDCqyVzwrsgZXIgaWtrZSBlbiB0dW5lci4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJNaXNseWt0ZXMgaSDDpSBmw6UgcmFkaW8taW5uZGF0YSBww6UgZW5oZXRlbiDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiS2xhcnRlIGlra2Ugw6Ugc2V0dGUgaW5uZ2FuZyAlZCBww6UgZW5oZXQgJXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJLbGFydGUgaWtrZSDDpSBlbmRyZSBkZW1wZS1tb2R1cyBmb3IgZW5oZXRlbiDCqyVzwrsuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICJLdW5uZSBpa2tlIHRpbGRlbGUgbsO4ZHZlbmRpZ2UgbWlubmUuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIkt1bm5lIGlra2UgdGlsZGVsZSBuw7hkdmVuZGlnZSBtaW5uZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiS29udmVydGVyIHDDpSBlbmhldCDCqyVzwrsgaGFyIGluZ2VuIHN0w7h0dGVkZSBpbm5kYXRhZm9ybWF0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICJLb252ZXJ0ZXIgcMOlIGVuaGV0IMKrJXPCuyBoYXIgaW5nZW4gc3TDuHR0ZWRlIHV0ZGF0YWZvcm1hdCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiRW5rb2RlciBww6UgZW5oZXQgwqslc8K7IGhhciBpbmdlbiBzdMO4dHRlZGUgaW5uZGF0YWZvcm1hdCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIkVua29kZXIgcMOlIGVuaGV0IMKrJXPCuyBoYXIgaW5nZW4gc3TDuHR0ZWRlIHV0ZGF0YWZvcm1hdCIKKworbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICJLbGFydGUgaWtrZSDDpSBzdGFydGUgZGVrb2RpbmcgYXYgdHLDpWRlbi4iCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIkt1bm5lIGlra2UgYmVoYW5kbGUgcmFtbWUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorIkZlaWwgdmVkIGhlbnRpbmcgYXYgZXZuZXIgZm9yIGVuaGV0ZW4gwqslc8K7OiBEZXQgZXIgaWtrZSBlbiB2NGwyIGRyaXZlci4gIgorIlNqZWtrIG9tIGRldCBlciBlbiB2NGwxIGRyaXZlci4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICJGZWlsIHZlZCBhdHRyaWJ1dHRzcMO4cnJpbmcgYXYgaW5uZGF0YSAlZCBww6UgZW5oZXQgJXMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS3VubmUgaWtrZSBoZW50ZSBpbm5zdGlsbGluZ2VuIGF2IG1vdHRha2VyZW4gJWQgcMOlIGVuaGV0ZW4gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkZlaWwgdmVkIG5vcm0tc3DDuHJyaW5nIHDDpSBlbmhldCAlcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkt1bm5lIGlra2Ugw6UgZsOlIGlubiBrb250cm9sbGF0dHJpYnV0dGVyIHDDpSBlbmhldCDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkthbiBpa2tlIGlkZW50aWZpc2VyZSBlbmhldCDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkRldHRlIGVyIGlra2UgZW4gZW5oZXQgwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIkt1bm5lIGlra2Ugw6VwbmUgZW5oZXQgwqslc8K7IGZvciBsZXNpbmcgb2cgc2tyaXZpbmcuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiRW5oZXQgwqslc8K7IGthbiBpa2tlIGZhbmdlIGRhdGEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICJFbmhldCDCqyVzwrsgZXIgaWtrZSBlbiB1dGdhbmdzZW5oZXQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICJFbmhldGVuIMKrJXPCuyBlciBpa2tlIGVuIE0yTS1lbmhldC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIkt1bm5lIGlra2Ugw6VwbmUgZW5oZXQgwqslc8K7IGZvciBsZXNpbmcgb2cgc2tyaXZpbmcuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJLdW5uZSBpa2tlIHNldHRlIG5vcm1lbiBmb3IgZW5oZXQgwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIktsYXJ0ZSBpa2tlIMOlIGbDpSBnamVsZGVuZGUgbW90dGFrZXJmcmVrdmVucyBmb3IgZW5oZXRlbiDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIiIKKyJLbGFydGUgaWtrZSDDpSBzZXR0ZSBnamVsZGVuZGUgbW90dGFrZXJmcmVrdmVucyBmb3IgZW5oZXRlbiDCqyVzwrsgdGlsICVsdSBIei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS2xhcnRlIGlra2Ugw6UgaW5uaGVudGUgc2lnbmFsc3R5cmtlbiBmb3IgZW5oZXRlbiDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJLdW5uZSBpa2tlIGhlbnRlIHZlcmRpIGZvciBrb250cm9sbCAlZCBww6UgZW5oZXRlbiDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJLbGFydGUgaWtrZSDDpSBzZXR0ZSB2ZXJkaSAlZCBmb3Iga29udHJvbGwgJWQgcMOlIGVuaGV0ZW4gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIkt1bm5lIGlra2UgaGVudGUgZ2plbGRlbmRlIGlubmRhdGEgcMOlIGVuaGV0ZW4gwqslc8K7LiBLYW5za2plIGRldCBlciBlbiAiCisicmFkaW9lbmhldCIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICJLdW5uZSBpa2tlIGhlbnRlIHV0ZGF0YSBmcmEgZW5oZXRlbiDCqyVzwrsuIEthbnNramUgZGV0IGVyIGVuIHJhZGlvZW5oZXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiS2xhcnRlIGlra2Ugw6Ugc2V0dGUgdXRnYW5nICVkIHDDpSBlbmhldCAlcy4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICJFbmRyaW5nIGF2IG9wcGzDuHNuaW5nIHVuZGVyIGtqw7hyaW5nIHN0w7h0dGVzIGlra2UgZW5kYS4iCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIkthbiBpa2tlIG9wZXJlcmUgdXRlbiBlbiBrbG9ra2UiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIkludGVybiBmZWlsIGkgZGF0YXN0csO4bS4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICJJbnRlcm4gZGF0YWZseXRmZWlsLiIKKworI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAiRW5oZXQgwqslc8K7IHN0w7h0dGVyIGlra2UgdmlkZW9vcHB0YWsiCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc291bmQgc2VydmVyIgorI34gbXNnc3RyICJLdW5uZSBpa2tlIGV0YWJsZXJlIHRpbGtvYmxpbmcgdGlsIGx5ZHRqZW5lciIKKworI34gbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBzb3VuZCBzZXJ2ZXIgY2FwYWJpbGl0aWVzIgorI34gbXNnc3RyICJLbGFydGUgaWtrZSDDpSBldHRlcnNww7hycmUgbHlkdGplbmVyZW5zIGV2bmVyIgorCisjfiBtc2dpZCAiQmFzcyIKKyN+IG1zZ3N0ciAiQmFzcyIKKworI34gbXNnaWQgIlRyZWJsZSIKKyN+IG1zZ3N0ciAiRGlza2FudCIKKworI34gbXNnaWQgIlN5bnRoIgorI34gbXNnc3RyICJTeW50aCIKKworI34gbXNnaWQgIlBDTSIKKyN+IG1zZ3N0ciAiUENNIgorCisjfiBtc2dpZCAiU3BlYWtlciIKKyN+IG1zZ3N0ciAiSMO4eXR0YWxlciIKKworI34gbXNnaWQgIkxpbmUtaW4iCisjfiBtc2dzdHIgIkxpbmplIGlubiIKKworI34gbXNnaWQgIkNEIgorI34gbXNnc3RyICJDRCIKKworI34gbXNnaWQgIk1peGVyIgorI34gbXNnc3RyICJNaWtzZXIiCisKKyN+IG1zZ2lkICJQQ00tMiIKKyN+IG1zZ3N0ciAiUENNLTIiCisKKyN+IG1zZ2lkICJSZWNvcmQiCisjfiBtc2dzdHIgIk9wcHRhayIKKworI34gbXNnaWQgIkluLWdhaW4iCisjfiBtc2dzdHIgIklubnN0eXJrZSIKKworI34gbXNnaWQgIk91dC1nYWluIgorI34gbXNnc3RyICJVdHN0eXJrZSIKKworI34gbXNnaWQgIkxpbmUtMSIKKyN+IG1zZ3N0ciAiTGluamUgMSIKKworI34gbXNnaWQgIkxpbmUtMiIKKyN+IG1zZ3N0ciAiTGluamUgMiIKKworI34gbXNnaWQgIkxpbmUtMyIKKyN+IG1zZ3N0ciAiTGluamUgMyIKKworI34gbXNnaWQgIkRpZ2l0YWwtMSIKKyN+IG1zZ3N0ciAiRGlnaXRhbCAxIgorCisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICJEaWdpdGFsIDIiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTMiCisjfiBtc2dzdHIgIkRpZ2l0YWwgMyIKKworI34gbXNnaWQgIlBob25lLWluIgorI34gbXNnc3RyICJUZWxlZm9uIGlubiIKKworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAiVGVsZWZvbiB1dCIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICJWaWRlbyIKKworI34gbXNnaWQgIlJhZGlvIgorI34gbXNnc3RyICJSYWRpbyIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCisjfiBtc2dzdHIgIkt1bm5lIGlra2Ugw6VwbmUgbHlkZW5oZXRlbiBmb3IgbWlrc2Vya29udHJvbGxow6VuZHRlcmluZy4iCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJLdW5uZSBpa2tlIMOlcG5lIGx5ZGVuaGV0ZW4gZm9yIG1pa3NlcmtvbnRyb2xsaMOlbmR0ZXJpbmcuIERlbm5lIHZlcnNqb25lbiAiCisjfiAiYXYgwqtPcGVuIFNvdW5kIFN5c3RlbcK7IHN0w7h0dGVzIGlra2UgYXYgZGV0dGUgZWxlbWVudGV0LiIKKworI34gbXNnaWQgIk1hc3RlciIKKyN+IG1zZ3N0ciAiSG92ZWR2b2x1bSIKKworI34gbXNnaWQgIkZyb250IgorI34gbXNnc3RyICJGcm9udCIKKworI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIkJhayIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIkhvZGV0ZWxlZm9uZXIiCisKKyN+IG1zZ2lkICJDZW50ZXIiCisjfiBtc2dzdHIgIlNlbnRlciIKKworI34gbXNnaWQgIkxGRSIKKyN+IG1zZ3N0ciAiTEZFIgorCisjfiBtc2dpZCAiU3Vycm91bmQiCisjfiBtc2dzdHIgIlN1cnJvdW5kIgorCisjfiBtc2dpZCAiU2lkZSIKKyN+IG1zZ3N0ciAiU2lkZSIKKworI34gbXNnaWQgIkFVWCBPdXQiCisjfiBtc2dzdHIgIkFVWCB1dCIKKworI34gbXNnaWQgIjNEIERlcHRoIgorI34gbXNnc3RyICIzRCBkeWJkZSIKKworI34gbXNnaWQgIjNEIENlbnRlciIKKyN+IG1zZ3N0ciAiM0Qgc2VudGVyIgorCisjfiBtc2dpZCAiM0QgRW5oYW5jZSIKKyN+IG1zZ3N0ciAiM0QtZm9yYmVkcmluZyIKKworI34gbXNnaWQgIlRlbGVwaG9uZSIKKyN+IG1zZ3N0ciAiVGVsZWZvbiIKKworI34gbXNnaWQgIlZpZGVvIEluIgorI34gbXNnc3RyICJWaWRlbyBpbm4iCisKKyN+IG1zZ2lkICJBVVggSW4iCisjfiBtc2dzdHIgIkFVWCBpbm4iCisKKyN+IG1zZ2lkICJSZWNvcmQgR2FpbiIKKyN+IG1zZ3N0ciAiSW5uc3BpbGxpbmdzc3R5cmtlIgorCisjfiBtc2dpZCAiT3V0cHV0IEdhaW4iCisjfiBtc2dzdHIgIlV0ZGF0YXN0eXJrZSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgQm9vc3QiCisjfiBtc2dzdHIgIk1pa3JvZm9uZm9yc3RlcmtuaW5nIgorCisjfiBtc2dpZCAiRGlhZ25vc3RpYyIKKyN+IG1zZ3N0ciAiRGlhZ25vc2UiCisKKyN+IG1zZ2lkICJCYXNzIEJvb3N0IgorI34gbXNnc3RyICJCYXNzQm9vc3QiCisKKyN+IG1zZ2lkICJQbGF5YmFjayBQb3J0cyIKKyN+IG1zZ3N0ciAiQXZzcGlsbGluZ3Nwb3J0ZXI6IgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIklubmdhbmciCisKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTW9uaXRvcmtpbGRlIgorCisjfiBtc2dpZCAiS2V5Ym9hcmQgQmVlcCIKKyN+IG1zZ3N0ciAiVGFzdGF0dXJwaXAiCisKKyN+IG1zZ2lkICJTaW11bGF0ZSBTdGVyZW8iCisjfiBtc2dzdHIgIlNpbXVsZXJ0IHN0ZXJlbyIKKworI34gbXNnaWQgIlN0ZXJlbyIKKyN+IG1zZ3N0ciAiU3RlcmVvIgorCisjfiBtc2dpZCAiU3Vycm91bmQgU291bmQiCisjfiBtc2dzdHIgIlN1cnJvdW5kbHlkIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBHYWluIgorI34gbXNnc3RyICJNaWtyb2ZvbnN0eXJrZSIKKworI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICJIw7h5dHRhbGVya2lsZGUiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTWlrcm9mb25raWxkZSIKKworI34gbXNnaWQgIkphY2siCisjfiBtc2dzdHIgIkphY2siCisKKyN+IG1zZ2lkICJDZW50ZXIgLyBMRkUiCisjfiBtc2dzdHIgIlNlbnRlciAvIExGRSIKKworI34gbXNnaWQgIlN0ZXJlbyBNaXgiCisjfiBtc2dzdHIgIlN0ZXJlb21pa3MiCisKKyN+IG1zZ2lkICJNb25vIE1peCIKKyN+IG1zZ3N0ciAiTW9ub21pa3MiCisKKyN+IG1zZ2lkICJJbnB1dCBNaXgiCisjfiBtc2dzdHIgIklubmRhdGFtaWtzIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAxIgorI34gbXNnc3RyICJNaWtyb2ZvbiAxIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICJNaWtyb2ZvbiAyIgorCisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgIkRpZ2l0YWwgdXQiCisKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICJEaWdpdGFsIGlubiIKKworI34gbXNnaWQgIkhETUkiCisjfiBtc2dzdHIgIkhETUkiCisKKyN+IG1zZ2lkICJNb2RlbSIKKyN+IG1zZ3N0ciAiTW9kZW0iCisKKyN+IG1zZ2lkICJIYW5kc2V0IgorI34gbXNnc3RyICJIw6VuZHNldHQiCisKKyN+IG1zZ2lkICJPdGhlciIKKyN+IG1zZ3N0ciAiQW5uZXQiCisKKyN+IG1zZ2lkICJOb25lIgorI34gbXNnc3RyICJJbmdlbiIKKworI34gbXNnaWQgIk9uIgorI34gbXNnc3RyICJQw6UiCisKKyN+IG1zZ2lkICJPZmYiCisjfiBtc2dzdHIgIkF2IgorCisjfiBtc2dpZCAiTXV0ZSIKKyN+IG1zZ3N0ciAiRGVtcCIKKworI34gbXNnaWQgIkZhc3QiCisjfiBtc2dzdHIgIlJhc2siCisKKyN+IG1zZ2lkICJWZXJ5IExvdyIKKyN+IG1zZ3N0ciAiTWVnZXQgbGF2IgorCisjfiBtc2dpZCAiTG93IgorI34gbXNnc3RyICJMYXYiCisKKyN+IG1zZ2lkICJNZWRpdW0iCisjfiBtc2dzdHIgIk1pZGRlbHMiCisKKyN+IG1zZ2lkICJIaWdoIgorI34gbXNnc3RyICJIw7h5IgorCisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICJNZWdldCBow7h5IgorCisjfiBtc2dpZCAiUHJvZHVjdGlvbiIKKyN+IG1zZ3N0ciAiUHJvZHVrc2pvbiIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCisjfiBtc2dzdHIgIkZyb25wYW5lbG1pa3JvZm9uIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBJbiIKKyN+IG1zZ3N0ciAiRnJvbnRwYW5lbCBpbm5saW5qZSIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIEhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIkZyb250cGFuZWxob2RldGVsZWZvbmVyIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBPdXQiCisjfiBtc2dzdHIgIkZyb250cGFuZWwgdXRsaW5qZSIKKworI34gbXNnaWQgIkdyZWVuIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiR3LDuG5uIGtvbnRha3QiCisKKyN+IG1zZ2lkICJQaW5rIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUm9zYSBrb250YWt0IgorCisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkJsw6Uga29udGFrdCIKKworI34gbXNnaWQgIldoaXRlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiSHZpdCBrb250YWt0IgorCisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICJTb3J0IGtvbnRha3QiCisKKyN+IG1zZ2lkICJHcmF5IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiR3LDpSBrb250YWt0IgorCisjfiBtc2dpZCAiT3JhbmdlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiT3JhbnNqZSBrb250YWt0IgorCisjfiBtc2dpZCAiUmVkIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUsO4ZCBrb250YWt0IgorCisjfiBtc2dpZCAiWWVsbG93IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiR3VsIGtvbnRha3QiCisKKyN+IG1zZ2lkICJHcmVlbiBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkdyw7hubiBmcm9udHBhbmVsa29udGFrdCIKKworI34gbXNnaWQgIlBpbmsgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJSb3NhIGZyb250cGFuZWxrb250YWt0IgorCisjfiBtc2dpZCAiQmx1ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkJsw6UgZnJvbnRwYW5lbGtvbnRha3QiCisKKyN+IG1zZ2lkICJXaGl0ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkh2aXQgZnJvbnRwYW5lbGtvbnRha3QiCisKKyN+IG1zZ2lkICJCbGFjayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlNvcnQgZnJvbnRwYW5lbGtvbnRha3QiCisKKyN+IG1zZ2lkICJHcmF5IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiR3LDpSBmcm9udHBhbmVsa29udGFrdCIKKworI34gbXNnaWQgIk9yYW5nZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk9yYW5zamUgZnJvbnRwYW5lbGtvbnRha3QiCisKKyN+IG1zZ2lkICJSZWQgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJSw7hkIGZyb250cGFuZWxrb250YWt0IgorCisjfiBtc2dpZCAiWWVsbG93IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiR3VsIGZyb250cGFuZWxrb250YWt0IgorCisjfiBtc2dpZCAiU3ByZWFkIE91dHB1dCIKKyN+IG1zZ3N0ciAiU3ByZWRuaW5nc3V0Z2FuZyIKKworI34gbXNnaWQgIkRvd25taXgiCisjfiBtc2dzdHIgIk5lZG1pa3MiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIElucHV0IgorI34gbXNnc3RyICJWaXJ0dWVsbCBtaWtzZXJpbm5nYW5nIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBPdXRwdXQiCisjfiBtc2dzdHIgIlZpcnR1ZWxsIG1pa3NlcnV0Z2FuZyIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgQ2hhbm5lbHMiCisjfiBtc2dzdHIgIlZpcnR1ZWxsZSBtaWtzZXJrYW5hbGVyIgorCisjfiBtc2dpZCAiJXMgJWQgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzICVkIEZ1bmtzam9uIgorCisjfiBtc2dpZCAiJXMgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzIEZ1bmtzam9uIgorCisjfiBtc2dpZCAiR290IHVuZXhwZWN0ZWQgZnJhbWUgc2l6ZSBvZiAldSBpbnN0ZWFkIG9mICV1LiIKKyN+IG1zZ3N0ciAiRmlrayB1dmVudGV0IHJhbW1lc3TDuHJyZWxzZW4gJXUgaXN0ZWRlbmZvciAldS4iCisKKyN+IG1zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIG9uIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiRmVpbCB2ZWQgbGVzaW5nIGF2ICVkIGJ5dGUgcMOlIGVuaGV0ZW4gwqslc8K7LiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlbnF1ZXVlIGJ1ZmZlcnMgaW4gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJLdW5uZSBpa2tlIGxlZ2dlIGkga8O4IGJ1ZmZlcmUgaSBlbmhldGVuIMKrJXPCuy4iCisKKyN+IG1zZ2lkICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIk1pc2x5a3RlcyBpIMOlIGbDpSB2aWRlb2JpbGRlciBmcmEgZW5oZXQgwqslc8K7LiIKKworI34gbXNnaWQgIkZhaWxlZCBhZnRlciAlZCB0cmllcy4gZGV2aWNlICVzLiBzeXN0ZW0gZXJyb3I6ICVzIgorI34gbXNnc3RyICJNaXNseWt0ZXMgZXR0ZXIgJWQgZm9yc8O4ay4gRW5oZXQgJXMuIFN5c3RlbWZlaWw6ICVzIgorCisjfiBtc2dpZCAiRGVzY3JpYmVzIHRoZSBzZWxlY3RlZCBpbnB1dCBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiQmVza3JpdmVyIHZhbGd0IGlubmRhdGFlbGVtZW50LiIKZGlmZiAtLWdpdCBhL3BvL25sLnBvIGIvcG8vbmwucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFhYWMxYwotLS0gL2Rldi9udWxsCisrKyBiL3BvL25sLnBvCkBAIC0wLDAgKzEsNzgyIEBACisjIHRyYW5zbGF0aW9uIG9mIGdzdC1wbHVnaW5zLWdvb2QubmwucG8gdG8gRHV0Y2gKKyMgVGhpcyBmaWxlIGlzIHB1dCBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMKKyMgRnJlZWsgZGUgS3J1aWpmIDxmLmRlLmtydWlqZkBnbWFpbC5jb20+LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLCAyMDEyLCAyMDEzLCAyMDE0LCAyMDE1LCAyMDE2LgorbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZCAxLjcuMlxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDE2LTAyLTIwIDE2OjQwKzAxMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEZyZWVrIGRlIEtydWlqZiA8Zi5kZS5rcnVpamZAZ21haWwuY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IER1dGNoIDx2ZXJ0YWxpbmdAdnJpanNjaHJpZnQub3JnPlxuIgorIkxhbmd1YWdlOiBubFxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlgtR2VuZXJhdG9yOiBMb2thbGl6ZSAxLjVcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD1uICE9IDE7XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIkphY2stc2VydmVyIG5pZXQgZ2V2b25kZW4iCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIkthbiBkZSBKUEVHLWFmYmVlbGRpbmcgbmlldCBkZWNvZGVyZW4iCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIiclcycgZG9vciAnJXMnIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJLYW4gZ2VlbiB2ZXJiaW5kaW5nIG1ha2VuIG1ldCBzZXJ2ZXIiCisKK21zZ2lkICJObyBVUkwgc2V0LiIKK21zZ3N0ciAiR2VlbiBVUkwgaW5nZXN0ZWxkLiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiS2FuIGRlIHNlcnZlcm5hYW0gbmlldCBvcHpvZWtlbi4iCisKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiS2FuIGdlZW4gdmVyYmluZGluZyBtYWtlbiBtZXQgZGUgc2VydmVyIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAiQmV2ZWlsaWdkZSB2ZXJiaW5kaW5nIG9wemV0dGVuIGlzIG1pc2x1a3QuIgorCittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorIkVyIHRyYWQgZWVuIG5ldHdlcmtmb3V0IG9wIG9mIGRlIHNlcnZlciBoZWVmdCBkZSB2ZXJiaW5kaW5nIG9udmVyd2FjaHQgIgorImFmZ2Vicm9rZW4uIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICJEZSBzZXJ2ZXIgc3R1dXJkZSBvbmp1aXN0ZSBnZWdldmVucy4iCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiWm9la2VuIHdvcmR0IGRvb3IgZGUgc2VydmVyIG5pZXQgb25kZXJzdGV1bmQuIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICJHZWVuIG9mIG9uZ2VsZGlnIGludm9lcmdlbHVpZCwgQVZJLXN0cm9vbSB6YWwgc2xlY2h0IHppam4uIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJEaXQgYmVzdGFuZCBiZXZhdCBnZWVuIGFmc3BlZWxiYXJlIHN0cm9tZW4uIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJEaXQgYmVzdGFuZCBpcyBvbmdlbGRpZyBlbiBrYW4gbmlldCBhZmdlc3BlZWxkIHdvcmRlbi4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiS2FuIHN0cmVhbSBuaWV0IGFmc3BlbGVuIG9tZGF0IGhldCB2ZXJzbGV1dGVsZCBpcyBtZXQgUGxheVJlYWR5IERSTS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkRpdCBiZXN0YW5kIGlzIGJlc2NoYWRpZ2QgZW4ga2FuIG5pZXQgYWZnZXNwZWVsZCB3b3JkZW4uIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICJPbmdlbGRpZ2UgXCJhdG9tXCItZ3Jvb3R0ZS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkRpdCBiZXN0YW5kIGlzIGluY29tcGxlZXQgZW4ga2FuIG5pZXQgYWZnZXNwZWVsZCB3b3JkZW4uIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICJEZSB2aWRlbyBpbiBkaXQgYmVzdGFuZCB6YWwgbW9nZWxpamsgbmlldCBjb3JyZWN0IGFmZ2VzcGVlbGQgd29yZGVuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICIiCisiRGl0IGJlc3RhbmQgYmV2YXQgdGUgdmVlbCBzdHJvbWVuLiBBbGxlZW4gZGUgZWVyc3RlICVkIHdvcmRlbiBhZmdlc3BlZWxkLiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisiRXIgaXMgZ2VlbiBvbmRlcnN0ZXVuZGUgc3Ryb29tIGdldm9uZGVuLiBNaXNzY2hpZW4gbW9ldCBlciBlZW4gR1N0cmVhbWVyICIKKyJSVFNQIGV4dGVuc2llLXBsdWdpbiB2b29yIFJlYWwtbWVkaWEtc3RyZWFtcyBnZcOvbnN0YWxsZWVyZCB3b3JkZW4uIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisiRXIgaXMgZ2VlbiBvbmRlcnN0ZXVuZGUgc3Ryb29tIGdldm9uZGVuLiBNaXNzY2hpZW4gbW9ldCB1IG1lZXIgIgorIm92ZXJkcmFjaHRzcHJvdG9jb2xsZW4gdG9lc3RhYW4gb2YgYW5kZXJzIG9udGJyZWVrdCBkZSBqdWlzdGUgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2llLXBsdWdpbi4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisiS2FuIGhldCBhdWRpby1hcHBhcmFhdCBuaWV0IG9wZW5lbiB2b29yIGFmc3BlbGVuLiBBcHBhcmFhdCBpcyBpbiBnZWJydWlrIGJpaiAiCisiZWVuIGFuZGVyZSBhcHBsaWNhdGllLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiS2FuIGhldCBhdWRpby1hcHBhcmFhdCBuaWV0IG9wZW5lbiB2b29yIGFmc3BlbGVuLiBVIGhlYnQgZ2VlbiB0b2VzdGVtbWluZyBvbSAiCisiaGV0IGFwcGFyYWF0IHRlIG9wZW5lbi4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiS2FuIGhldCBhdWRpby1hcHBhcmFhdCBuaWV0IG9wZW5lbiB2b29yIGFmc3BlbGVuLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKyJLYW4gaGV0IGF1ZGlvLWFwcGFyYWF0IG5pZXQgb3BlbmVuIHZvb3IgYWZzcGVsZW4uIERlemUgdmVyc2llIHZhbiBoZXQgT3BlbiAiCisiU291bmQgU3lzdGVtIHdvcmR0IG5pZXQgb25kZXJzdGV1bnQgZG9vciBkaXQgZWxlbWVudC4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiQWZzcGVsZW4gd29yZHQgbmlldCBvbmRlcnN0ZXVuZCBkb29yIGRpdCBhdWRpby1hcHBhcmFhdCIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAiRm91dCBpbiBnZWx1aWQgYWZzcGVsZW4uIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJPcG5lbWVuIHdvcmR0IG5pZXQgb25kZXJzdGV1bmQgZG9vciBkaXQgYXVkaW8tYXBwYXJhYXQiCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJGb3V0IGJpaiBvcG5lbWVuIHZhbmFmIGF1ZGlvLWFwcGFyYWF0LiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIkthbiBoZXQgYXVkaW8tYXBwYXJhYXQgbmlldCBvcGVuZW4gdm9vciBvcG5lbWVuLiBVIGhlYnQgZ2VlbiB0b2VzdGVtbWluZyBvbSAiCisiaGV0IGFwcGFyYWF0IHRlIG9wZW5lbi4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIkthbiBoZXQgYXVkaW8tYXBwYXJhYXQgbmlldCBvcGVuZW4gdm9vciBvcG5lbWVuLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICJDb3JlQXVkaW8gYXBwYXJhYXQgbmlldCBnZXZvbmRlbiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiQ29yZUF1ZGlvIGFwcGFyYWF0IGtvbiBuaWV0IGdlb3BlbmQgd29yZGVuIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAiT3BuYW1lYnJvbiIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIk1pY3JvZm9vbiIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIkxpam4taW4iCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiSW50ZXJuZSBjZCIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJTUERJRi1pbiIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICJBVVggMS1pbiIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJBVVggMi1pbiIKKworbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICJDb2RlYy1sb29wYmFjayIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiU3VuVlRTLWxvb3BiYWNrIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJWb2x1bWUiCisKK21zZ2lkICJHYWluIgorbXNnc3RyICJWZXJzdGVya2luZyIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIk1vbml0b3IiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJJbmdlYm91d2RlIGx1aWRzcHJla2VyIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICJIb29mZHRlbGVmb29uIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIkxpbmUtb3V0IgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICJTUERJRi1vdXQiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIkFVWCAxLW91dCIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiQVVYIDItb3V0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkZvdXQgYmlqIGhldCBsZXplbiB2YW4gJWQgYnl0ZXMgdmFuIGFwcGFyYWF0ICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICJPcG5vZW1lbiB2YW4gdmlkZW9mb3JtYXRlbiB3YWFybWVlIGFwcGFyYWF0ICclcycga2FuIHdlcmtlbiBpcyBtaXNsdWt0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICJLYW4gZGUgYnVmZmVycyB2YW4gYXBwYXJhYXQgJyVzJyBuaWV0IHZpbmRlbiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAiSGV0IHN0dXVycHJvZ3JhbW1hIHZhbiBhcHBhcmFhdCAnJXMnIG9uZGVyc3RldW50IGRlIElPLW1ldGhvZGUgJWQgbmlldCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIiIKKyJIZXQgc3R1dXJwcm9ncmFtbWEgdmFuIGFwcGFyYWF0ICclcycgb25kZXJzdGV1bnQgZ2VlbiBiZWtlbmRlIElPLW1ldGhvZGUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIkFwcGFyYWF0ICclcycgaXMgYmV6ZXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIkFwcGFyYWF0ICclcycga2FuIGdlZW4gb3BuYW1lIG1ha2VuIG1ldCAlZHglZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiQXBwYXJhYXQgJyVzJyBrYW4gZ2VlbiBvcG5hbWUgbWFrZW4gaW4gaGV0IGdlc3BlY2lmaWNlZXJkZSBmb3JtYWF0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIkFwcGFyYWF0ICclcycgb25kZXJzdGV1bnQgbmlldC1jb250aW51ZSB2bGFra2VuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiS2FuIGRlIHBhcmFtZXRlcnMgb3AgYXBwYXJhYXQgJyVzJyBuaWV0IHZlcmtyaWpnZW4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIlZpZGVvYXBwYXJhYXQgaGVlZnQgZGUgbmlldXdlIGZyYW1lLXNuZWxoZWlkIG5pZXQgZ2VhY2NlcHRlZXJkLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIlZpZGVvYXBwYXJhYXQgbGV2ZXJkZSBnZWVuIHVpdHZvZXJmb3JtYWF0LiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICJWaWRlby1hcHBhcmFhdCBnYWYgb25nZWxkaWdlIGFmbWV0aW5nZW4gdGVydWcuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIiIKKyJWaWRlby1hcHBhcmFhdCBnZWJydWlrdCBlZW4gbmlldCBvbmRlcnN0ZXVuZGUgbWV0aG9kZSB2b29yIGludGVybGFjaW5nLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICJWaWRlby1hcHBhcmFhdCBnZWJydWlrdCBlZW4gbmlldCBvbmRlcnN0ZXVuZCBwaXhlbGZvcm1hYXQuIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIkluc3RlbGxlbiB2YW4gaW50ZXJuZSBidWZmZXJwb29sIGlzIG1pc2x1a3QuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICJWaWRlb2FwcGFyYWF0IGdhZiBnZWVuIHN1Z2dlc3RpZSB2b29yIGVlbiBidWZmZXJncm9vdHRlLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIkdlZW4gZG93bnN0cmVhbSBwb29sIG9tIHZhbiB0ZSBpbXBvcnRlcmVuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiSW5zdGVsbGluZ2VuIHZhbiB0dW5lciAlZCBvcCBhcHBhcmFhdCAnJXMnIG9waGFsZW4gaXMgbWlzbHVrdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRm91dCBiaWogaGV0IG9waGFsZW4gZGUgbW9nZWxpamtoZWRlbiB2YW4gYXBwYXJhYXQgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICJBcHBhcmFhdCAnJXMnIGlzIGdlZW4gdHVuZXIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiUmFkaW8taW52b2VyIHZhbiBhcHBhcmFhdCAnJXMnIG9waGFsZW4gaXMgbWlzbHVrdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJLYW4gaW52b2VyICVkIG9wIGFwcGFyYWF0ICclcycgbmlldCBpbnN0ZWxsZW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJEZSBnZWRlbXB0ZSBzdGF0dXMgdmFuIGFwcGFyYWF0ICclcycgd2lqemlnZW4gaXMgbWlzbHVrdC4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIlZlcmVpc3QgZ2VoZXVnZW4gdG9la2VubmVuIGlzIG1pc2x1a3QuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIlZlcmVpc3QgZ2VoZXVnZW4gdG9la2VubmVuIGlzIG1pc2x1a3QuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIkNvbnZlcnRlciBvcCBhcHBhcmFhdCAlcyBoZWVmdCBnZWVuIG9uZGVyc3RldW5kIGludm9lcmZvcm1hYXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIkNvbnZlcnRlciBvcCBhcHBhcmFhdCAlcyBoZWVmdCBnZWVuIG9uZGVyc3RldW5kIHVpdHZvZXJmb3JtYWF0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJDb2RlZXJkZXIgb3AgYXBwYXJhYXQgJXMgaGVlZnQgZ2VlbiBvbmRlcnN0ZXVuZCBpbnZvZXJmb3JtYWF0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiQ29kZWVyZGVyIG9wIGFwcGFyYWF0ICVzIGhlZWZ0IGdlZW4gb25kZXJzdGV1bmQgdWl0dm9lcmZvcm1hYXQiCisKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiQmVnaW5uZW4gbWV0IGRlY29kZXJlbiB2YW4gdGhyZWFkIGlzIG1pc2x1a3QuIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICJCZXdlcmtlbiB2YW4gZnJhbWUgaXMgbWlzbHVrdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisiRm91dCBiaWogaGV0IHZlcmtyaWpnZW4gdmFuIGRlIGVpZ2Vuc2NoYXBwZW4gdmFuIGFwcGFyYWF0ICclcyc6IGhldCBpcyBnZWVuICIKKyJ2NGwyLXN0dXVycHJvZ3JhbW1hLiBDb250cm9sZWVyIG9mIGhldCBlZW4gdjRsMS1zdHV1cnByb2dyYW1tYSBpcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICJLYW4gZWlnZW5zY2hhcHBlbiB2YW4gaW52b2VyICVkIG9wIGFwcGFyYWF0ICVzIG5pZXQgb3B2cmFnZW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkthbiBkZSBpbnN0ZWxsaW5nIHZhbiB0dW5lciAlZCBvcCBhcHBhcmFhdCAnJXMnIG5pZXQgdmVya3Jpamdlbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICJLYW4gZGUgbm9ybSBvcCBhcHBhcmFhdCAnJXMnIG5pZXQgb3B2cmFnZW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJLYW4gZGUga25vcGVpZ2Vuc2NoYXBwZW4gb3AgYXBwYXJhYXQgJyVzJyBuaWV0IHZlcmtyaWpnZW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkthbiBhcHBhcmFhdCAnJXMnIG5pZXQgaWRlbnRpZmljZXJlbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRGl0IGlzIGdlZW4gYXBwYXJhYXQgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJLYW4gYXBwYXJhYXQgJyVzJyBuaWV0IG9wZW5lbiB2b29yIGxlemVuIGVuIHNjaHJpanZlbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICJBcHBhcmFhdCAnJXMnIGlzIGdlZW4gb3BuYW1lYXBwYXJhYXQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICJBcHBhcmFhdCAnJXMnIGlzIGdlZW4gdWl0dm9lcmFwcGFyYWF0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiQXBwYXJhYXQgJyVzJyBpcyBnZWVuIE0yTS1hcHBhcmFhdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIkthbiBnZWVuIGR1cCBkb2VuIG9wIGFwcGFyYWF0ICclcycgdm9vciBsZXplbiBlbiBzY2hyaWp2ZW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJLYW4gbm9ybSBuaWV0IGluc3RlbGxlbiB2b29yIGFwcGFyYWF0ICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS2FuIGRlIHR1bmVyZnJlcXVlbnRpZSB2YW4gYXBwYXJhYXQgJyVzJyBuaWV0IHZlcmtyaWpnZW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIiIKKyJLYW4gZGUgaHVpZGlnZSB0dW5lcmZyZXF1ZW50aWUgdm9vciBhcHBhcmFhdCAnJXMnIG5pZXQgaW5zdGVsbGVuIG9wICVsdSBIei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS2FuIGRlIHNpZ25hYWxzdGVya3RlIHZhbiBhcHBhcmFhdCAnJXMnIG5pZXQgdmVya3Jpamdlbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkthbiBkZSB3YWFyZGUgdm9vciBrbm9wICVkIG9wIGFwcGFyYWF0ICclcycgbmlldCB2ZXJrcmlqZ2VuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS2FuIGRlIHdhYXJkZSAlZCB2b29yIGtub3AgJWQgb3AgYXBwYXJhYXQgJyVzJyBuaWV0IGluc3RlbGxlbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJLYW4gZGUgaHVpZGlnZSBpbnN0ZWxsaW5nZW4gdmFuIGFwcGFyYWF0ICclcycgbmlldCB2ZXJrcmlqZ2VuLiBIZXQgaXMgIgorIm1vZ2VsaWprIGVlbiByYWRpbyIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiS2FuIGRlIGh1aWRpZ2UgdWl0dm9lciBuaWV0IG9wIGFwcGFyYWF0ICclcycga3Jpamdlbi4gSGV0IGlzIG1vZ2VsaWprIGVlbiAiCisicmFkaW8iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiS2FuIHVpdHZvZXIgJWQgb3AgYXBwYXJhYXQgJXMgbmlldCBpbnN0ZWxsZW4uIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiVGlqZGVucyBoZXQgZHJhYWllbiBrYW4gZGUgcmVzb2x1dGllIG5vZyBuaWV0IGdld2lqemlnZCB3b3JkZW4uIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICJLYW4gbmlldCB3ZXJrZW4gem9uZGVyIGVlbiBrbG9rLiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAiSW50ZXJuZSBmb3V0IGluIGdlZ2V2ZW5zc3Ryb29tLiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgZmxvdyBlcnJvci4iCisjfiBtc2dzdHIgIkludGVybmUgZm91dCBpbiBkZSBnZWdldmVuc2Rvb3J2b2VyLiIKKworI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAiQXBwYXJhYXQgJyVzJyBvbmRlcnN0ZXVudCBoZXQgb3BuZW1lbiB2YW4gdmlkZW8gbmlldCIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzb3VuZCBzZXJ2ZXIiCisjfiBtc2dzdHIgIkthbiBnZWVuIHZlcmJpbmRpbmcgbWFrZW4gbWV0IGRlIGdlbHVpZHNzZXJ2ZXIiCisKKyN+IG1zZ2lkICJGYWlsZWQgdG8gcXVlcnkgc291bmQgc2VydmVyIGNhcGFiaWxpdGllcyIKKyN+IG1zZ3N0ciAiS2FuIGRlIGVpZ2Vuc2NoYXBwZW4gdmFuIGRlIGdlbHVpZHNzZXJ2ZXIgbmlldCBvcHZyYWdlbiIKKworI34gbXNnaWQgIkJhc3MiCisjfiBtc2dzdHIgIkxhZ2UgdG9uZW4iCisKKyN+IG1zZ2lkICJUcmVibGUiCisjfiBtc2dzdHIgIkhvZ2UgdG9uZW4iCisKKyN+IG1zZ2lkICJTeW50aCIKKyN+IG1zZ3N0ciAiU3ludGgiCisKKyN+IG1zZ2lkICJQQ00iCisjfiBtc2dzdHIgIlBDTSIKKworI34gbXNnaWQgIlNwZWFrZXIiCisjfiBtc2dzdHIgIkx1aWRzcHJla2VyIgorCisjfiBtc2dpZCAiTGluZS1pbiIKKyN+IG1zZ3N0ciAiTGlqbi1pbiIKKworI34gbXNnaWQgIkNEIgorI34gbXNnc3RyICJDRCIKKworI34gbXNnaWQgIk1peGVyIgorI34gbXNnc3RyICJNaXhlciIKKworI34gbXNnaWQgIlBDTS0yIgorI34gbXNnc3RyICJQQ00tMiIKKworI34gbXNnaWQgIlJlY29yZCIKKyN+IG1zZ3N0ciAiT3BuYW1lIgorCisjfiBtc2dpZCAiSW4tZ2FpbiIKKyN+IG1zZ3N0ciAiSW5nYW5nc3ZlcnN0ZXJraW5nIgorCisjfiBtc2dpZCAiT3V0LWdhaW4iCisjfiBtc2dzdHIgIlVpdGdhbmdzdmVyc3RlcmtpbmciCisKKyN+IG1zZ2lkICJMaW5lLTEiCisjfiBtc2dzdHIgIkxpam4tMSIKKworI34gbXNnaWQgIkxpbmUtMiIKKyN+IG1zZ3N0ciAiTGlqbi0yIgorCisjfiBtc2dpZCAiTGluZS0zIgorI34gbXNnc3RyICJMaWpuLTMiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTEiCisjfiBtc2dzdHIgIkRpZ2l0YWFsLTEiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTIiCisjfiBtc2dzdHIgIkRpZ2l0YWFsLTIiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTMiCisjfiBtc2dzdHIgIkRpZ2l0YWFsLTMiCisKKyN+IG1zZ2lkICJQaG9uZS1pbiIKKyN+IG1zZ3N0ciAiVGVsZWZvb25pbmdhbmciCisKKyN+IG1zZ2lkICJQaG9uZS1vdXQiCisjfiBtc2dzdHIgIlRlbGVmb29udWl0Z2FuZyIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICJWaWRlbyIKKworI34gbXNnaWQgIlJhZGlvIgorI34gbXNnc3RyICJSYWRpbyIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCisjfiBtc2dzdHIgIkthbiBoZXQgYXVkaW8tYXBwYXJhYXQgbmlldCBvcGVuZW4gdm9vciBoZXQgYmVzdHVyZW4gdmFuIGRlIG1peGVyLiIKKworI34gbXNnaWQgIiIKKyN+ICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIFRoaXMgdmVyc2lvbiBvZiAiCisjfiAidGhlIE9wZW4gU291bmQgU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkthbiBoZXQgYXVkaW8tYXBwYXJhYXQgbmlldCBvcGVuZW4gdm9vciBiZXN0dXJlbiB2YW4gZGUgbWl4ZXIuIERlemUgIgorI34gInZlcnNpZSB2YW4gaGV0IE9wZW4gU291bmQgU3lzdGVtIHdvcmR0IG5pZXQgb25kZXJzdGV1bnQgZG9vciBkaXQgZWxlbWVudC4iCisKKyN+IG1zZ2lkICJNYXN0ZXIiCisjfiBtc2dzdHIgIk1hc3RlciIKKworI34gbXNnaWQgIkZyb250IgorI34gbXNnc3RyICJWb29ya2FudCIKKworI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIkFjaHRlcnppamRlIgorCisjfiBtc2dpZCAiSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiSG9vZmR0ZWxlZm9vbnMiCisKKyN+IG1zZ2lkICJDZW50ZXIiCisjfiBtc2dzdHIgIk1pZGRlbiIKKworI34gbXNnaWQgIkxGRSIKKyN+IG1zZ3N0ciAiTEZFIgorCisjfiBtc2dpZCAiU3Vycm91bmQiCisjfiBtc2dzdHIgIlN1cnJvdW5kIgorCisjfiBtc2dpZCAiU2lkZSIKKyN+IG1zZ3N0ciAiWmlqa2FudCIKKworI34gbXNnaWQgIkFVWCBPdXQiCisjfiBtc2dzdHIgIkFVWC11aXQiCisKKyN+IG1zZ2lkICIzRCBEZXB0aCIKKyN+IG1zZ3N0ciAiM0QtZGllcHRlIgorCisjfiBtc2dpZCAiM0QgQ2VudGVyIgorI34gbXNnc3RyICIzRC1jZW50cnVtIgorCisjfiBtc2dpZCAiM0QgRW5oYW5jZSIKKyN+IG1zZ3N0ciAiM0QtdmVyYmV0ZXJlbiIKKworI34gbXNnaWQgIlRlbGVwaG9uZSIKKyN+IG1zZ3N0ciAiVGVsZWZvb24iCisKKyN+IG1zZ2lkICJWaWRlbyBJbiIKKyN+IG1zZ3N0ciAiVmlkZW8taW4iCisKKyN+IG1zZ2lkICJBVVggSW4iCisjfiBtc2dzdHIgIkFVWC1pbiIKKworI34gbXNnaWQgIlJlY29yZCBHYWluIgorI34gbXNnc3RyICJPcG5hbWV2ZXJzdGVya2luZyIKKworI34gbXNnaWQgIk91dHB1dCBHYWluIgorI34gbXNnc3RyICJVaXRnYW5nc3ZlcnN0ZXJraW5nIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAiTWljcm9mb29uLWJvb3N0IgorCisjfiBtc2dpZCAiRGlhZ25vc3RpYyIKKyN+IG1zZ3N0ciAiRGlhZ25vc2UiCisKKyN+IG1zZ2lkICJCYXNzIEJvb3N0IgorI34gbXNnc3RyICJCYXMtYm9vc3QiCisKKyN+IG1zZ2lkICJQbGF5YmFjayBQb3J0cyIKKyN+IG1zZ3N0ciAiQWZzcGVlbHBvb3J0ZW4iCisKKyN+IG1zZ2lkICJJbnB1dCIKKyN+IG1zZ3N0ciAiSW52b2VyIgorCisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgIk1vbml0b3Jicm9uIgorCisjfiBtc2dpZCAiS2V5Ym9hcmQgQmVlcCIKKyN+IG1zZ3N0ciAiVG9ldHNlbmJvcmRwaWVwIgorCisjfiBtc2dpZCAiU2ltdWxhdGUgU3RlcmVvIgorI34gbXNnc3RyICJTdGVyZW8gc2ltdWxlcmVuIgorCisjfiBtc2dpZCAiU3RlcmVvIgorI34gbXNnc3RyICJTdGVyZW8iCisKKyN+IG1zZ2lkICJTdXJyb3VuZCBTb3VuZCIKKyN+IG1zZ3N0ciAiU3Vycm91bmQtZ2VsdWlkIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBHYWluIgorI34gbXNnc3RyICJNaWNyb2Zvb252ZXJzdGVya2luZyIKKworI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICJMdWlkc3ByZWtlcmJyb24iCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTWljcm9mb29uYnJvbiIKKworI34gbXNnaWQgIkphY2siCisjfiBtc2dzdHIgIlBsdWciCisKKyN+IG1zZ2lkICJDZW50ZXIgLyBMRkUiCisjfiBtc2dzdHIgIk1pZGRlbiAvIExGRSIKKworI34gbXNnaWQgIlN0ZXJlbyBNaXgiCisjfiBtc2dzdHIgIlN0ZXJlby1taXgiCisKKyN+IG1zZ2lkICJNb25vIE1peCIKKyN+IG1zZ3N0ciAiTW9uby1taXgiCisKKyN+IG1zZ2lkICJJbnB1dCBNaXgiCisjfiBtc2dzdHIgIkludm9lci1taXgiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDEiCisjfiBtc2dzdHIgIk1pY3JvZm9vbi0xIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICJNaWNyb2Zvb24tMiIKKworI34gbXNnaWQgIkRpZ2l0YWwgT3V0IgorI34gbXNnc3RyICJEaWdpdGFhbC11aXQiCisKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICJEaWdpdGFhbC1pbiIKKworI34gbXNnaWQgIkhETUkiCisjfiBtc2dzdHIgIkhETUkiCisKKyN+IG1zZ2lkICJNb2RlbSIKKyN+IG1zZ3N0ciAiTW9kZW0iCisKKyN+IG1zZ2lkICJIYW5kc2V0IgorI34gbXNnc3RyICJIYW5kc2V0IgorCisjfiBtc2dpZCAiT3RoZXIiCisjfiBtc2dzdHIgIk92ZXJpZyIKKworI34gbXNnaWQgIk5vbmUiCisjfiBtc2dzdHIgIkdlZW4iCisKKyN+IG1zZ2lkICJPbiIKKyN+IG1zZ3N0ciAiQWFuIgorCisjfiBtc2dpZCAiT2ZmIgorI34gbXNnc3RyICJVaXQiCisKKyN+IG1zZ2lkICJNdXRlIgorI34gbXNnc3RyICJEZW1wZW4iCisKKyN+IG1zZ2lkICJGYXN0IgorI34gbXNnc3RyICJTbmVsIgorCisjfiBtc2dpZCAiVmVyeSBMb3ciCisjfiBtc2dzdHIgIlplZXIgbGFhZyIKKworI34gbXNnaWQgIkxvdyIKKyN+IG1zZ3N0ciAiTGFhZyIKKworI34gbXNnaWQgIk1lZGl1bSIKKyN+IG1zZ3N0ciAiTWlkZGVsIgorCisjfiBtc2dpZCAiSGlnaCIKKyN+IG1zZ3N0ciAiSG9vZyIKKworI34gbXNnaWQgIlZlcnkgSGlnaCIKKyN+IG1zZ3N0ciAiWmVlciBob29nIgorCisjfiBtc2dpZCAiUHJvZHVjdGlvbiIKKyN+IG1zZ3N0ciAiUHJvZHVjdGllIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTWljcm9waG9uZSIKKyN+IG1zZ3N0ciAiTWljcm9mb29uIGluIGZyb250cGFuZWVsIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBJbiIKKyN+IG1zZ3N0ciAiTGlqbi1pbiBpbiBmcm9udHBhbmVlbCIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIEhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIkhvb2ZkdGVsZWZvb25zIGluIGZyb250cGFuZWVsIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBPdXQiCisjfiBtc2dzdHIgIkxpam4tdWl0IGluIGZyb250cGFuZWVsIgorCisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICJHcm9lbmUgY29ubmVjdG9yIgorCisjfiBtc2dpZCAiUGluayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlJvemUgY29ubmVjdG9yIgorCisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkJsYXV3ZSBjb25uZWN0b3IiCisKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIldpdHRlIGNvbm5lY3RvciIKKworI34gbXNnaWQgIkJsYWNrIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiWndhcnRlIGNvbm5lY3RvciIKKworI34gbXNnaWQgIkdyYXkgQ29ubmVjdG9yIgorI34gbXNnc3RyICJHcmlqemUgY29ubmVjdG9yIgorCisjfiBtc2dpZCAiT3JhbmdlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiT3JhbmplIGNvbm5lY3RvciIKKworI34gbXNnaWQgIlJlZCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlJvZGUgY29ubmVjdG9yIgorCisjfiBtc2dpZCAiWWVsbG93IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiR2VsZSBjb25uZWN0b3IiCisKKyN+IG1zZ2lkICJHcmVlbiBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkdyb2VuZSBjb25uZWN0b3IgaW4gZnJvbnRwYW5lZWwiCisKKyN+IG1zZ2lkICJQaW5rIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUm96ZSBjb25uZWN0b3IgaW4gZnJvbnRwYW5lZWwiCisKKyN+IG1zZ2lkICJCbHVlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQmxhdXdlIGNvbm5lY3RvciBpbiBmcm9udHBhbmVlbCIKKworI34gbXNnaWQgIldoaXRlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiV2l0dGUgY29ubmVjdG9yIGluIGZyb250cGFuZWVsIgorCisjfiBtc2dpZCAiQmxhY2sgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJad2FydGUgY29ubmVjdG9yIGluIGZyb250cGFuZWVsIgorCisjfiBtc2dpZCAiR3JheSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkdyaWp6ZSBjb25uZWN0b3IgaW4gZnJvbnRwYW5lZWwiCisKKyN+IG1zZ2lkICJPcmFuZ2UgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJPcmFuamUgY29ubmVjdG9yIGluIGZyb250cGFuZWVsIgorCisjfiBtc2dpZCAiUmVkIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUm9kZSBjb25uZWN0b3IgaW4gZnJvbnRwYW5lZWwiCisKKyN+IG1zZ2lkICJZZWxsb3cgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJHZWxlIGNvbm5lY3RvciBpbiBmcm9udHBhbmVlbCIKKworI34gbXNnaWQgIlNwcmVhZCBPdXRwdXQiCisjfiBtc2dzdHIgIlVpdHZvZXIgc3ByZWlkZW4iCisKKyN+IG1zZ2lkICJEb3dubWl4IgorI34gbXNnc3RyICJEb3dubWl4IgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBJbnB1dCIKKyN+IG1zZ3N0ciAiVmlydHVlbGUgbWl4ZXItaW52b2VyIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBPdXRwdXQiCisjfiBtc2dzdHIgIlZpcnR1ZWxlIG1peGVyLXVpdHZvZXIiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIENoYW5uZWxzIgorI34gbXNnc3RyICJWaXJ0dWVsZSBtaXhlci1rYW5hbGVuIgorCisjfiBtc2dpZCAiJXMgJWQgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzICVkIGZ1bmN0aWUiCisKKyN+IG1zZ2lkICIlcyBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiJXMtZnVuY3Rpb24iCisKKyN+IG1zZ2lkICJHb3QgdW5leHBlY3RlZCBmcmFtZSBzaXplIG9mICV1IGluc3RlYWQgb2YgJXUuIgorI34gbXNnc3RyICJPbnZlcndhY2h0ZSBmcmFtZWdyb290dGUsICV1IGluIHBsYWF0cyB2YW4gJXUuIgorCisjfiBtc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBvbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkZvdXQgYmlqIGhldCBsZXplbiB2YW4gJWQgYnl0ZXMgdmFuIGFwcGFyYWF0ICclcycuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkthbiBnZWVuIGJ1ZmZlcnMgdG9la2VubmVuIGluIGFwcGFyYWF0ICclcycuIgorCisjfiBtc2dpZCAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJLYW4gZ2VlbiB2aWRlb2ZyYW1lcyB2ZXJrcmlqZ2VuIHZhbiBhcHBhcmFhdCAnJXMnLiIKKworI34gbXNnaWQgIkZhaWxlZCBhZnRlciAlZCB0cmllcy4gZGV2aWNlICVzLiBzeXN0ZW0gZXJyb3I6ICVzIgorI34gbXNnc3RyICJGb3V0IG5hICVkIHBvZ2luZ2VuLiBBcHBhcmFhdCAlcy4gU3lzdGVlbWZvdXQ6ICVzIgpkaWZmIC0tZ2l0IGEvcG8vb3IucG8gYi9wby9vci5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTUzNmZkCi0tLSAvZGV2L251bGwKKysrIGIvcG8vb3IucG8KQEAgLTAsMCArMSw2NTEgQEAKKyMgT3JpeWEgdHJhbnNsYXRpb24gb2YgZ3N0LXBsdWdpbnMtMC44LjMucG90LgorIyBDb3B5cmlnaHQgKEMpIDIwMDQsIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ3N0LXBsdWdpbnMtMC44LjMgcGFja2FnZS4KKyMgR29yYSBNb2hhbnR5IDxnb3JhX21vaGFudHlAeWFob28uY28uaW4+LCAyMDA0LgorIyAkSWQ6IG9yLnBvLHYgMS4zMCAyMDA4LTA0LTIzIDIzOjE4OjQzIHRoYXl0YW4gRXhwICQKKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLTAuOC4zXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMDQtMDktMjcgMTM6MzIrMDUzMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogR29yYSBNb2hhbnR5IDxnb3JhX21vaGFudHlAeWFob28uY28uaW4+XG4iCisiTGFuZ3VhZ2UtVGVhbTogT3JpeWEgPGdvcmFfbW9oYW50eUB5YWhvby5jby5pbj5cbiIKKyJMYW5ndWFnZTogb3JcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICIiCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIlwiJXNcIiDgrKjgrL/grZ/grKjgrY3grKTgrY3grLDgrKMg4Kyv4Kyo4K2N4Kyk4K2N4KywIOCsrOCsqOCtjeCspiDgrJXgrLDgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJcIiVzXCIg4Kyo4Ky/4K2f4Kyo4K2N4Kyk4K2N4Kyw4KyjIOCsr+CsqOCtjeCspOCtjeCssCDgrKzgrKjgrY3grKYg4KyV4Kyw4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIlwiJXNcIiDgrKjgrL/grZ/grKjgrY3grKTgrY3grLDgrKMg4Kyv4Kyo4K2N4Kyk4K2N4KywIOCsrOCsqOCtjeCspiDgrJXgrLDgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4KywIOCsl+Cti+Csn+Csv+CsjyDgrIXgrKjgrYHgrLLgrL/grKrgrL/grJXgrL7grLAg4Kyo4K2B4Ky54K2H4KyBLiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAi4Kyo4Ky/4Kys4K2H4Ky2IOCsp+CtjeCsrOCsqOCsvyDgrKjgrL7grLngrL/grIEg4Kys4Ky+IOCsheCsrOCtiOCspyDgrIXgrJvgrL8uIOCsjy7grK3grL8u4KyG4KyHLiDgrKfgrL7grLDgrL4g4Kyt4K2N4Kyw4Ky34K2N4KyfIOCsueCti+Csh+Csr+Csv+CsrC4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiXCIlc1wiIOCsp+CtjeCsrOCsqOCsvyDgrK/grKjgrY3grKTgrY3grLAg4Kyy4K2H4KyW4Ky/4Kys4Ky+IOCsquCsvuCsh+CsgSDgrJbgrYvgrLLgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworIywgZnV6enkKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiXCIlc1wiIOCsp+CtjeCsrOCsqOCsvyDgrK/grKjgrY3grKTgrY3grLAg4Kyy4K2H4KyW4Ky/4Kys4Ky+IOCsquCsvuCsh+CsgSDgrJbgrYvgrLLgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICIiCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAi4Ky44Ky/LuCsoeCsvy4g4Kyv4Kyo4K2N4Kyk4K2N4KywIOCsquCsouCsvOCsv+CsrOCsviDgrKrgrL7grIfgrIEg4KyW4K2L4Kyy4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICLgrLjgrL8u4Kyh4Ky/LiDgrK/grKjgrY3grKTgrY3grLAg4Kyq4Kyi4Ky84Ky/4Kys4Ky+IOCsquCsvuCsh+CsgSDgrJbgrYvgrLLgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICLgrIbgrKrgrKPgrJngrY3grJXgrLAg4KyTLuCsj+CsuC7grI/grLguIOCsr+CsqOCtjeCspOCtjeCssOCssCDgrKDgrL/grJUg4Kyt4Ky+4Kys4Kyw4K2HIOCsheCsqOCtgeCsuOCsqOCtjeCsp+CsvuCsqCDgrJXgrLDgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworIywgZnV6enkKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICLgrKrgrY3grLDgrKbgrLDgrY3grLbgrL/grJXgrL4iCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICLgrK7grL7grIfgrJXgrY3grLDgrYvgrKvgrYvgrKjgrY0iCisKKyMsIGZ1enp5Cittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAi4Kyy4Ky+4KyH4KyoLeCsh+CsqCIKKworbXNnaWQgIkludGVybmFsIENEIgorbXNnc3RyICIiCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIiIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICIiCisKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiIgorCittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICIiCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIuCsquCtjeCssOCsrOCss+CspOCsviIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIiIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIuCsquCtjeCssOCspuCssOCtjeCstuCsv+CsleCsviIKKworIywgZnV6enkKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICLgrLjgrY3grKzgrLDgrKzgrLDgrY3grKbgrY3grKfgrJUg4K2f4Kyo4K2N4Kyk4K2N4KywIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICIiCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiIgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICIiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIiIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIgorbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4Kyw4Kyw4K2BIOCsheCsuOCtjeCspeCsvuCtn+CtgCDgrLjgrJ7grY3grJrgrZ8g4Ky44K2N4Kyl4Ky+4KyoIOCshuCso+Csv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4Kyw4Kyw4K2BIOCsheCsuOCtjeCspeCsvuCtn+CtgCDgrLjgrJ7grY3grJrgrZ8g4Ky44K2N4Kyl4Ky+4KyoIOCshuCso+Csv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLAg4KyX4K2L4Kyf4Ky/4KyPIOCsheCsqOCtgeCssuCsv+CsquCsv+CsleCsvuCssCDgrKjgrYHgrLngrYfgrIEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiXCIlc1wiIOCsr+CsqOCtjeCspOCtjeCssCDgrJfgrYvgrJ/grL/grI8g4KyF4Kyo4K2B4Kyy4Ky/4Kyq4Ky/4KyV4Ky+4KywIOCsqOCtgeCsueCth+CsgS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4KywIOCsl+Cti+Csn+Csv+CsjyDgrIXgrKjgrYHgrLLgrL/grKrgrL/grJXgrL7grLAg4Kyo4K2B4Ky54K2H4KyBLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiXCIlc1wiIOCsr+CsqOCtjeCspOCtjeCssCDgrJfgrYvgrJ/grL/grI8g4KyF4Kyo4K2B4Kyy4Ky/4Kyq4Ky/4KyV4Ky+4KywIOCsqOCtgeCsueCth+CsgS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiXCIlc1wiIOCsr+CsqOCtjeCspOCtjeCssOCssOCtgSDgrIXgrLjgrY3grKXgrL7grZ/grYAg4Ky44Kye4K2N4Kya4K2fIOCsuOCtjeCspeCsvuCsqCDgrIbgrKPgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLDgrLDgrYEg4Kyq4Kyw4K2N4Kyv4K2N4Kyv4Ky+4Kyq4K2N4KykIOCsheCsuOCtjeCspeCsvuCtn+CtgCDgrLjgrJ7grY3grJrgrZ8g4Ky44K2N4Kyl4Ky+4KyoIOCshuCso+Csv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4Kyw4Kyw4K2BIOCsheCsuOCtjeCspeCsvuCtn+CtgCDgrLjgrJ7grY3grJrgrZ8g4Ky44K2N4Kyl4Ky+4KyoIOCshuCso+Csv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLAg4KyX4K2L4Kyf4Ky/4KyPIOCsheCsqOCtgeCssuCsv+CsquCsv+CsleCsvuCssCDgrKjgrYHgrLngrYfgrIEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIlwiJXNcIiDgrKfgrY3grKzgrKjgrL8g4Kyv4Kyo4K2N4Kyk4K2N4KywIOCsrOCsqOCtjeCspiDgrJXgrLDgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJcIiVzXCIg4Kyn4K2N4Kys4Kyo4Ky/IOCsr+CsqOCtjeCspOCtjeCssCDgrKzgrKjgrY3grKYg4KyV4Kyw4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4Kyw4Kyw4K2BIOCsheCsuOCtjeCspeCsvuCtn+CtgCDgrLjgrJ7grY3grJrgrZ8g4Ky44K2N4Kyl4Ky+4KyoIOCshuCso+Csv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLDgrLDgrYEg4Kyq4Kyw4K2N4Kyv4K2N4Kyv4Ky+4Kyq4K2N4KykIOCsheCsuOCtjeCspeCsvuCtn+CtgCDgrLjgrJ7grY3grJrgrZ8g4Ky44K2N4Kyl4Ky+4KyoIOCshuCso+Csv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLDgrLDgrYcg4Kyy4K2H4KyW4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLAg4Kyq4Kyi4Ky84Ky/4Kys4Ky+IOCskyDgrLLgrYfgrJbgrL/grKzgrL4g4Kyq4Ky+4KyH4KyBIOCsluCti+CssuCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLAg4KyX4K2L4Kyf4Ky/4KyPIOCsheCsqOCtgeCssuCsv+CsquCsv+CsleCsvuCssCDgrKjgrYHgrLngrYfgrIEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiXCIlc1wiIOCsr+CsqOCtjeCspOCtjeCssCDgrJfgrYvgrJ/grL/grI8g4KyF4Kyo4K2B4Kyy4Ky/4Kyq4Ky/4KyV4Ky+4KywIOCsqOCtgeCsueCth+CsgS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4KywIOCsl+Cti+Csn+Csv+CsjyDgrIXgrKjgrYHgrLLgrL/grKrgrL/grJXgrL7grLAg4Kyo4K2B4Ky54K2H4KyBLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLAg4Kyq4Kyi4Ky84Ky/4Kys4Ky+IOCskyDgrLLgrYfgrJbgrL/grKzgrL4g4Kyq4Ky+4KyH4KyBIOCsluCti+CssuCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiXCIlc1wiIOCsr+CsqOCtjeCspOCtjeCssOCssOCtgSDgrIXgrLjgrY3grKXgrL7grZ/grYAg4Ky44Kye4K2N4Kya4K2fIOCsuOCtjeCspeCsvuCsqCDgrIbgrKPgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4Kyw4Kyw4K2BIOCsquCssOCtjeCsr+CtjeCsr+CsvuCsquCtjeCspCDgrIXgrLjgrY3grKXgrL7grZ/grYAg4Ky44Kye4K2N4Kya4K2fIOCsuOCtjeCspeCsvuCsqCDgrIbgrKPgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiXCIlc1wiIOCsqOCsv+Ctn+CsqOCtjeCspOCtjeCssOCsoyDgrK/grKjgrY3grKTgrY3grLAg4Kys4Kyo4K2N4KymIOCsleCssOCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiXCIlc1wiIOCsqOCsv+Ctn+CsqOCtjeCspOCtjeCssOCsoyDgrK/grKjgrY3grKTgrY3grLAg4Kys4Kyo4K2N4KymIOCsleCssOCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLDgrLDgrYEg4Kyq4Kyw4K2N4Kyv4K2N4Kyv4Ky+4Kyq4K2N4KykIOCsheCsuOCtjeCspeCsvuCtn+CtgCDgrLjgrJ7grY3grJrgrZ8g4Ky44K2N4Kyl4Ky+4KyoIOCshuCso+Csv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJcIiVzXCIg4Kyn4K2N4Kys4Kyo4Ky/IOCsr+CsqOCtjeCspOCtjeCssCDgrKzgrKjgrY3grKYg4KyV4Kyw4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLAg4KyX4K2L4Kyf4Ky/4KyPIOCsheCsqOCtgeCssuCsv+CsquCsv+CsleCsvuCssCDgrKjgrYHgrLngrYfgrIEuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiXCIlc1wiIOCsr+CsqOCtjeCspOCtjeCssOCssOCtgSDgrKrgrLDgrY3grK/grY3grK/grL7grKrgrY3grKQg4KyF4Ky44K2N4Kyl4Ky+4K2f4K2AIOCsuOCsnuCtjeCsmuCtnyDgrLjgrY3grKXgrL7grKgg4KyG4Kyj4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICLgrIXgrKjgrYHgrJrgrY3grJog4Ky44K2N4Kys4KywIgorCisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICLgrIngrJrgrY3grJog4Ky44K2N4Kys4KywIgorCisjfiBtc2dpZCAiU3ludGgiCisjfiBtc2dzdHIgIuCsuOCsv+CsqOCtjeCspeCth+CsuOCsvuCsh+CsnOCssCIKKworI34gbXNnaWQgIlBDTSIKKyN+IG1zZ3N0ciAi4Kyq4Ky/LuCsuOCsvy7grI/grK4uIgorCisjfiBtc2dpZCAiU3BlYWtlciIKKyN+IG1zZ3N0ciAi4Ky44K2N4Kys4Kyw4Kys4Kyw4K2N4Kym4K2N4Kyn4KyVIOCtn+CsqOCtjeCspOCtjeCssCIKKworI34gbXNnaWQgIkxpbmUtaW4iCisjfiBtc2dzdHIgIuCssuCsvuCsh+CsqC3grIfgrKgiCisKKyN+IG1zZ2lkICJDRCIKKyN+IG1zZ3N0ciAi4Ky44Ky/LuCsoeCsvy4iCisKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAi4Kyu4Ky/4Ky24K2N4Kyw4KyjIOCsr+CsqOCtjeCspOCtjeCssCIKKworI34gbXNnaWQgIlBDTS0yIgorI34gbXNnc3RyICLgrKrgrL8u4Ky44Ky/LuCsj+Csri4t4K2oIgorCisjfiBtc2dpZCAiUmVjb3JkIgorI34gbXNnc3RyICLgrIXgrKjgrYHgrLLgrL/grKrgrL/grJXgrLDgrKMiCisKKyN+IG1zZ2lkICJJbi1nYWluIgorI34gbXNnc3RyICLgrKjgrL/grKzgrYfgrLYt4Kys4K2D4Kym4K2N4Kyn4Ky/IgorCisjfiBtc2dpZCAiT3V0LWdhaW4iCisjfiBtc2dzdHIgIuCsqOCsv+CssOCtjeCsl+Csri3grKzgrYPgrKbgrY3grKfgrL8iCisKKyN+IG1zZ2lkICJMaW5lLTEiCisjfiBtc2dzdHIgIuCssuCsvuCsh+CsqC3graciCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgIuCssuCsvuCsh+CsqC3gragiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIuCssuCsvuCsh+CsqC3grakiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTEiCisjfiBtc2dzdHIgIuCsuOCsvuCsguCsluCtjeCsr+Csv+CslS3graciCisKKyN+IG1zZ2lkICJEaWdpdGFsLTIiCisjfiBtc2dzdHIgIuCsuOCsvuCsguCsluCtjeCsr+Csv+CslS3gragiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTMiCisjfiBtc2dzdHIgIuCsuOCsvuCsguCsluCtjeCsr+Csv+CslS3grakiCisKKyN+IG1zZ2lkICJQaG9uZS1pbiIKKyN+IG1zZ3N0ciAi4Kyr4K2L4KyoLeCsqOCsv+CsrOCth+CstiIKKworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAi4Kyr4K2L4KyoLeCsqOCsv+CssOCtjeCsl+CsriIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICLgrK3grL/grKHgrL/grJMiCisKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAi4Kyw4K2H4Kyh4Ky/4KyTIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCisjfiBtc2dzdHIgIlwiJXNcIiDgrKfgrY3grKzgrKjgrL8g4Kyv4Kyo4K2N4Kyk4K2N4KywIOCssuCth+CsluCsv+CsrOCsviDgrKrgrL7grIfgrIEg4KyW4K2L4Kyy4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiIgorI34gIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4gVGhpcyB2ZXJzaW9uIG9mICIKKyN+ICJ0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorI34gbXNnc3RyICJcIiVzXCIg4Kyn4K2N4Kys4Kyo4Ky/IOCsr+CsqOCtjeCspOCtjeCssCDgrLLgrYfgrJbgrL/grKzgrL4g4Kyq4Ky+4KyH4KyBIOCsluCti+CssuCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIuCsheCsqOCtgeCssuCsv+CsquCsv+CsleCssOCsoyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICLgrK3grL/grKHgrL/grJMiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiT3V0cHV0IEdhaW4iCisjfiBtc2dzdHIgIuCsqOCsv+CssOCtjeCsl+Csri3grKzgrYPgrKbgrY3grKfgrL8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAi4Kyu4Ky+4KyH4KyV4K2N4Kyw4K2L4Kyr4K2L4Kyo4K2NIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKKyN+IG1zZ3N0ciAi4Kyu4Ky+4KyH4KyV4K2N4Kyw4K2L4Kyr4K2L4Kyo4K2NIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICLgrLjgrY3grKzgrLDgrKzgrLDgrY3grKbgrY3grKfgrJUg4K2f4Kyo4K2N4Kyk4K2N4KywIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgU291cmNlIgorI34gbXNnc3RyICLgrK7grL7grIfgrJXgrY3grLDgrYvgrKvgrYvgrKjgrY0iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTWljcm9waG9uZSAxIgorI34gbXNnc3RyICLgrK7grL7grIfgrJXgrY3grLDgrYvgrKvgrYvgrKjgrY0iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICLgrK7grL7grIfgrJXgrY3grLDgrYvgrKvgrYvgrKjgrY0iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgIuCsuOCsvuCsguCsluCtjeCsr+Csv+CslS3graciCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRGlnaXRhbCBJbiIKKyN+IG1zZ3N0ciAi4Ky44Ky+4KyC4KyW4K2N4Kyv4Ky/4KyVLeCtpyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICLgrK7grL7grIfgrJXgrY3grLDgrYvgrKvgrYvgrKjgrY0iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLDgrLDgrYEg4KyF4Ky44K2N4Kyl4Ky+4K2f4K2AIOCsuOCsnuCtjeCsmuCtnyDgrLjgrY3grKXgrL7grKgg4KyG4Kyj4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQ291bGQgbm90IGdldCBidWZmZXJzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4Kyw4Kyw4K2BIOCsheCsuOCtjeCspeCsvuCtn+CtgCDgrLjgrJ7grY3grJrgrZ8g4Ky44K2N4Kyl4Ky+4KyoIOCshuCso+Csv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkNvdWxkIG5vdCBnZXQgZW5vdWdoIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLDgrLDgrYEg4Kyq4Kyw4K2N4Kyv4K2N4Kyv4Ky+4Kyq4K2N4KykIOCsheCsuOCtjeCspeCsvuCtn+CtgCDgrLjgrJ7grY3grJrgrZ8g4Ky44K2N4Kyl4Ky+4KyoIOCshuCso+Csv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkNvdWxkIG5vdCByZWFkIGZyb20gQ0QuIgorI34gbXNnc3RyICJcIiVzXCIg4Kyr4Ky+4KyH4KyyIOCssuCth+CsluCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkRpc2MgaXMgbm90IGFuIEF1ZGlvIENELiIKKyN+IG1zZ3N0ciAi4Kyv4Kyo4K2N4Kyk4K2N4KywIOCsluCti+CssuCsvuCsr+CsvuCshyDgrKjgrL7grLngrL/grIEuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkNvdWxkIG5vdCBzZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKKyN+IG1zZ3N0ciAiXCIlc1wiIOCsr+CsqOCtjeCspOCtjeCssOCssOCtgSDgrIXgrLjgrY3grKXgrL7grZ/grYAg4Ky44Kye4K2N4Kya4K2fIOCsuOCtjeCspeCsvuCsqCDgrIbgrKPgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGZpbGUgXCIlc1wiIGZvciB3cml0aW5nLiIKKyN+IG1zZ3N0ciAiXCIlc1wiIOCsq+CsvuCsh+CssiDgrLLgrYfgrJbgrL/grKzgrL4g4Kyq4Ky+4KyH4KyBIOCsluCti+CssuCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjfiBtc2dpZCAiRXJyb3IgY2xvc2luZyBmaWxlIFwiJXNcIi4iCisjfiBtc2dzdHIgIlwiJXNcIiDgrKvgrL7grIfgrLIg4Kys4Kyo4K2N4KymIOCsleCssOCsv+CsrOCsvuCssOCthyDgrKTgrY3grLDgrYHgrJ/grL8uIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gZmlsZSBcIiVzXCIgZm9yIHJlYWRpbmcuIgorI34gbXNnc3RyICJcIiVzXCIg4Kyr4Ky+4KyH4KyyIOCsquCsouCsvOCsv+CsrOCsviDgrKrgrL7grIfgrIEg4KyW4K2L4Kyy4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyN+IG1zZ2lkICJObyBmaWxlbmFtZSBzcGVjaWZpZWQuIgorI34gbXNnc3RyICLgrJXgrYzgrKPgrLjgrL8g4Kyr4Ky+4KyH4Kyy4Kyo4Ky+4KyuIOCsieCssuCtjeCssuCth+CsluCsv+CspCDgrLngrYvgrIcg4Kyo4Ky+4Ky54Ky/4KyBLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGNvbnRyb2wgZGV2aWNlIFwiJXNcIiBmb3Igd3JpdGluZy4iCisjfiBtc2dzdHIgIlwiJXNcIiDgrKjgrL/grZ/grKjgrY3grKTgrY3grLDgrKMg4Kyv4Kyo4K2N4Kyk4K2N4KywIOCssuCth+CsluCsv+CsrOCsviDgrKrgrL7grIfgrIEg4KyW4K2L4Kyy4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgY29uZmlndXJlIGF1ZGlvIGRldmljZSBcIiVzXCIuIgorI34gbXNnc3RyICJcIiVzXCIg4Kyn4K2N4Kys4Kyo4Ky/IOCsr+CsqOCtjeCspOCtjeCssCDgrKzgrL/grKjgrY3grK/grL7grLgg4KyV4Kyw4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgc2V0IGF1ZGlvIGRldmljZSBcIiVzXCIgdG8gJWQgSHouIgorI34gbXNnc3RyICJcIiVzXCIg4Kyn4K2N4Kys4Kyo4Ky/IOCsr+CsqOCtjeCspOCtjeCssOCsleCtgSAlZCDgrLngrLDgrY3grJzgrLDgrYcg4Kys4Ky/4Kyo4K2N4Kyv4Ky+4Ky4IOCsleCssOCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gdmlkZW8gZGV2aWNlIFwiJXNcIiBmb3Igd3JpdGluZy4iCisjfiBtc2dzdHIgIlwiJXNcIiDgrK3grL/grKHgrL/grJMg4Kyv4Kyo4K2N4Kyk4K2N4KywIOCssuCth+CsluCsv+CsrOCsviDgrKrgrL7grIfgrIEg4KyW4K2L4Kyy4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgY2xvc2UgdmlkZW8gZGV2aWNlIFwiJXNcIi4iCisjfiBtc2dzdHIgIlwiJXNcIiDgrK3grL/grKHgrL/grJMg4Kyv4Kyo4K2N4Kyk4K2N4KywIOCsrOCsqOCtjeCspiDgrJXgrLDgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworI34gbXNnaWQgIk9TUyBkZXZpY2UgXCIlc1wiIGlzIGFscmVhZHkgaW4gdXNlIGJ5IGFub3RoZXIgcHJvZ3JhbS4iCisjfiBtc2dzdHIgIlwiJXNcIiDgrJMu4KyP4Ky4LuCsj+CsuC4g4Kyv4Kyo4K2N4Kyk4K2N4KywIOCsquCtguCssOCtjeCsrOCssOCtgSDgrIXgrKjgrY3grK8g4KyV4Ky+4Kyw4Ky/4KyV4Ky+IOCspuCtjeCsrOCsvuCssOCsviDgrKzgrY3grK/grKzgrLngrL7grLAg4KyV4Kyw4Ky+4Kyv4Ky+4KyJ4Kyb4Ky/LiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBhY2Nlc3MgZGV2aWNlIFwiJXNcIiwgY2hlY2sgaXRzIHBlcm1pc3Npb25zLiIKKyN+IG1zZ3N0ciAiXCIlc1wiIOCsr+CsqOCtjeCspOCtjeCssCDgrKzgrY3grK/grKzgrLngrL7grLAg4KyV4Kyw4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgSwg4Kyk4Ky+4Ky54Ky+4KywIOCsheCsqOCtgeCsruCspOCsvyDgrKbgrYfgrJbgrKjgrY3grKTgrYEuIgorCisjfiBtc2dpZCAiRGV2aWNlIFwiJXNcIiBkb2VzIG5vdCBleGlzdC4iCisjfiBtc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLAg4KyF4Kys4Ky44K2N4Kyl4Ky/4KykIOCsqOCsvuCsueCsv+CsgS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgXCIlc1wiIGZvciB3cml0aW5nLiIKKyN+IG1zZ3N0ciAiXCIlc1wiIOCsr+CsqOCtjeCspOCtjeCssCDgrLLgrYfgrJbgrL/grKzgrL4g4Kyq4Ky+4KyH4KyBIOCsluCti+CssuCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlIFwiJXNcIiBmb3IgcmVhZGluZy4iCisjfiBtc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLAg4Kyq4Kyi4Ky84Ky/4Kys4Ky+IOCsquCsvuCsh+CsgSDgrJbgrYvgrLLgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIHZmcyBmaWxlIFwiJXNcIiBmb3IgcmVhZGluZy4iCisjfiBtc2dzdHIgIuCsreCsvy7grI/grKsu4KyP4Ky4LiDgrKvgrL7grIfgrLIgXCIlc1wiIOCsquCsouCsvOCsv+CsrOCsviDgrKrgrL7grIfgrIEg4KyW4K2L4Kyy4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTm8gZmlsZW5hbWUgZ2l2ZW4uIgorI34gbXNnc3RyICLgrJXgrYzgrKPgrLjgrL8g4Kyr4Ky+4KyH4Kyy4Kyo4Ky+4KyuIOCspuCsv+CshuCsr+CsvuCshyDgrKjgrL7grLngrL/grIEiCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiB2ZnMgZmlsZSBcIiVzXCIgZm9yIHdyaXRpbmc6ICVzLiIKKyN+IG1zZ3N0ciAi4Kyt4Ky/LuCsj+Csqy7grI/grLguIOCsq+CsvuCsh+CssiBcIiVzXCIg4Kyy4K2H4KyW4Ky/4Kys4Ky+IOCsquCsvuCsh+CsgSDgrJbgrYvgrLLgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBOiAlcy4iCisKKyN+IG1zZ2lkICJObyBmaWxlbmFtZSBnaXZlbiIKKyN+IG1zZ3N0ciAi4KyV4K2M4Kyj4Ky44Ky/IOCsq+CsvuCsh+CssuCsqOCsvuCsriDgrKbgrL/grIbgrK/grL7grIcg4Kyo4Ky+4Ky54Ky/4KyBIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGNsb3NlIHZmcyBmaWxlIFwiJXNcIi4iCisjfiBtc2dzdHIgIuCsreCsvy7grI/grKsu4KyP4Ky4LiDgrKvgrL7grIfgrLIgXCIlc1wiIOCsrOCsqOCtjeCspiDgrJXgrLDgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJZb3VyIE9TUyBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IG1vbm8gb3Igc3RlcmVvLiIKKyN+IG1zZ3N0ciAi4KyG4Kyq4Kyj4KyZ4K2N4KyV4KywIOCsky7grI/grLgu4KyP4Ky4LiDgrK/grKjgrY3grKTgrY3grLDgrLAg4Kyg4Ky/4KyVIOCsreCsvuCsrOCssOCthyDgrIXgrKjgrYHgrLjgrKjgrY3grKfgrL7grKgg4KyV4Kyw4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyN+IG1zZ2lkICJObyBkZXZpY2Ugc3BlY2lmaWVkLiIKKyN+IG1zZ3N0ciAi4KyV4K2M4Kyj4Ky44Ky/IOCsr+CsqOCtjeCspOCtjeCssCDgrIngrLLgrY3grLLgrYfgrJbgrL/grKQg4KyV4Kyw4Ky+4Kyv4Ky+4KyHIOCsqOCsvuCsueCsv+CsgS4iCisKKyN+IG1zZ2lkICJEZXZpY2UgaXMgb3Blbi4iCisjfiBtc2dzdHIgIuCsr+CsqOCtjeCspOCtjeCssCDgrJbgrYvgrLLgrL7grK/grL7grIfgrJrgrY3grJvgrL8uIgorCisjfiBtc2dpZCAiIgorI34gIlRoZSAlcyBlbGVtZW50IGNvdWxkIG5vdCBiZSBmb3VuZC4gVGhpcyBlbGVtZW50IGlzIGVzc2VudGlhbCBmb3IgIgorI34gInBsYXliYWNrLiBQbGVhc2UgaW5zdGFsbCB0aGUgcmlnaHQgcGx1Zy1pbiBhbmQgdmVyaWZ5IHRoYXQgaXQgd29ya3MgYnkgIgorI34gInJ1bm5pbmcgJ2dzdC1pbnNwZWN0ICVzJyIKKyN+IG1zZ3N0ciAiIgorI34gIiVzIOCsieCsquCsvuCspuCsvuCsqCDgrK7grL/grLPgrL/grLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiDgrKrgrYHgrKjgrIPgrKrgrY3grLDgrKbgrLDgrY3grLbgrKgg4Kyq4Ky+4KyH4KyBIOCsj+CsueCsvyDgrIngrKrgrL7grKbgrL7grKjgrJ/grL8g4KyG4Kys4Ky24K2N4Kyv4KyVLiDgrKbgrZ/grL4g4KyV4Kyw4Ky/IOCsuOCsoOCsv+CslSDgrKrgrY3grLLgrJfgrY3grIfgrKjgrY0gIgorI34gIuCsuOCtjeCspeCsvuCsquCsv+CspCDgrJXgrLDgrKjgrY3grKTgrYEsIOCskyAnZ3N0LWluc3BlY3QgJXMnIOCsmuCss+CsvuCshyDgrK/grL7grJ7grY3grJog4KyV4Kyw4Kyo4K2N4Kyk4K2BIOCsleCsvyDgrI/grLngrL4g4KyV4Ky+4Kyw4K2N4Kyv4K2N4Kyv4KyV4Ky+4Kyw4K2AIOCsheCsm+CsvyIKKworI34gbXNnaWQgIiIKKyN+ICJObyB1c2FibGUgY29sb3JzcGFjZSBlbGVtZW50IGNvdWxkIGJlIGZvdW5kLlxuIgorI34gIlBsZWFzZSBpbnN0YWxsIG9uZSBhbmQgcmVzdGFydC4iCisjfiBtc2dzdHIgIiIKKyN+ICLgrJXgrYzgrKPgrLjgrL8g4Kys4K2N4Kyv4Kys4Ky54Ky+4Kyw4Kyv4K2L4KyX4K2N4KyvIOCssOCsmeCtjeCsl+CsleCtjeCst+Cth+CspOCtjeCssCDgrIngrKrgrL7grKbgrL7grKgg4Kyu4Ky/4Kyz4Ky/4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS5cbiIKKyN+ICLgrKbgrZ/grL4g4KyV4Kyw4Ky/IOCsl+Cti+Csn+Csv+CsjyDgrIngrKrgrL7grKbgrL7grKgg4Ky44K2N4Kyl4Ky+4Kyq4Ky/4KykIOCsleCssOCsvyDgrKrgrYHgrKjgrIPgrKrgrY3grLDgrL7grLDgrK7grY3grK0g4KyV4Kyw4Kyo4K2N4Kyk4K2BLiIKZGlmZiAtLWdpdCBhL3BvL3BsLnBvIGIvcG8vcGwucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1MmQ4MQotLS0gL2Rldi9udWxsCisrKyBiL3BvL3BsLnBvCkBAIC0wLDAgKzEsNDMwIEBACisjIFBvbGlzaCB0cmFuc2xhdGlvbiBmb3IgZ3N0LXBsdWdpbnMtZ29vZC4KKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGdzdC1wbHVnaW5zLWdvb2QgcGFja2FnZS4KKyMgSmFrdWIgQm9ndXN6IDxxYm9vc2hAcGxkLWxpbnV4Lm9yZz4sIDIwMDctMjAxNi4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QgMS43LjJcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxNi0wMi0yMCAyMTo0MyswMTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBKYWt1YiBCb2d1c3ogPHFib29zaEBwbGQtbGludXgub3JnPlxuIgorIkxhbmd1YWdlLVRlYW06IFBvbGlzaCA8dHJhbnNsYXRpb24tdGVhbS1wbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+XG4iCisiTGFuZ3VhZ2U6IHBsXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIk5pZSB6bmFsZXppb25vIHNlcndlcmEgSmFjayIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiTmllIHVkYcWCbyBzacSZIHpkZWtvZG93YcSHIG9icmF6dSBKUEVHIgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICInJXMnIGF1dG9yc3R3YSAnJXMnIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJOaWUgdWRhxYJvIHNpxJkgcG/FgsSFY3p5xIcgeiBzZXJ3ZXJlbSIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJOaWUgdXN0YXdpb25vIFVSTC1hLiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiTmllIHVkYcWCbyBzacSZIHJvendpxIV6YcSHIG5hend5IHNlcndlcmEuIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSBuYXdpxIV6YcSHIHBvxYLEhWN6ZW5pYSB6IHNlcndlcmVtLiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIlVzdGFub3dpZW5pZSBiZXpwaWVjem5lZ28gcG/FgsSFY3plbmlhIG5pZSBwb3dpb2TFgm8gc2nEmS4iCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICJXeXN0xIVwacWCIGLFgsSFZCBzaWVjaW93eSBsdWIgc2Vyd2VyIG5pZW9jemVraXdhbmllIHphbWtuxIXFgiBwb8WCxIVjemVuaWUuIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICJTZXJ3ZXIgcHJ6eXPFgmHFgiBixYLEmWRuZSBkYW5lLiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICJTZXJ3ZXIgbmllIG9ic8WCdWd1amUgcHJ6ZXdpamFuaWEuIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICJCcmFrIGx1YiBuaWVwb3ByYXduZSB3ZWrFm2NpZSBkxbp3acSZa3UsIHN0cnVtaWXFhCBBVkkgYsSZZHppZSB1c3prb2R6b255LiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAiVGVuIHBsaWsgbmllIHphd2llcmEgc3RydW1pZW5pIG5hZGFqxIVjeWNoIHNpxJkgZG8gb2R0d29yemVuaWEuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJUZW4gcGxpayBqZXN0IGLFgsSZZG55IGkgbmllIG1vxbxlIGJ5xIcgb2R0d29yem9ueS4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiIgorIk5pZSBtb8W8bmEgb2R0d2FyemHEhyBzdHJ1bWllbmlhLCBwb25pZXdhxbwgamVzdCB6YXN6eWZyb3dhbnkgRFJNLWVtIFBsYXlSZWFkeS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIlRlbiBwbGlrIGplc3QgdXN6a29kem9ueSBpIG5pZSBtb8W8ZSBiecSHIG9kdHdvcnpvbnkuIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICJCxYLEmWRueSByb3ptaWFyIGF0b211LiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiVGVuIHBsaWsgamVzdCBuaWVrb21wbGV0bnkgaSBuaWUgbW/FvGUgYnnEhyBvZHR3b3J6b255LiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiT2JyYXogdyB0eW0gcGxpa3UgbW/FvGUgbmllIGJ5xIcgb2R0d2FyemFueSBwcmF3aWTFgm93by4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiVGVuIHBsaWsgemF3aWVyYSB6Ynl0IGR1xbxvIHN0cnVtaWVuaS4gT2R0d2FyemFuaWUgdHlsa28gJWQgcGllcndzenljaCIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisiTmllIHpuYWxlemlvbm8gb2JzxYJ1Z2l3YW5lZ28gc3RydW1pZW5pYS4gQnnEhyBtb8W8ZSB0cnplYmEgemFpbnN0YWxvd2HEhyAiCisid3R5Y3prxJkgcm96c3plcnplbmlhIEdTdHJlYW1lcmEgUlRTUCBkbGEgc3RydW1pZW5pIFJlYWwgbWVkaWEuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisiTmllIHpuYWxlemlvbm8gb2JzxYJ1Z2l3YW5lZ28gc3RydW1pZW5pYS4gQnnEhyBtb8W8ZSB0cnplYmEgemV6d29sacSHIG5hIHdpxJljZWogIgorInByb3Rva2/FgsOzdyB0cmFuc3BvcnR1LCBhbGJvIG1vxbxlIGJyYWtvd2HEhyB3xYJhxZtjaXdlaiB3dHljemtpIHJvenN6ZXJ6ZW5pYSAiCisiUlRTUCBHU3RyZWFtZXJhLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKyJOaWUgdWRhxYJvIHNpxJkgb3R3b3J6ecSHIHVyesSFZHplbmlhIGTFundpxJlrb3dlZ28gZG8gb2R0d2FyemFuaWEuIFVyesSFZHplbmllICIKKyJqZXN0IHXFvHl3YW5lIHByemV6IGlubsSFIGFwbGlrYWNqxJkuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJOaWUgdWRhxYJvIHNpxJkgb3R3b3J6ecSHIHVyesSFZHplbmlhIGTFundpxJlrb3dlZ28gZG8gb2R0d2FyemFuaWEuIEJyYWsgdXByYXduaWXFhCAiCisiZG8gb3R3YXJjaWEgdXJ6xIVkemVuaWEuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSBvdHdvcnp5xIcgdXJ6xIVkemVuaWEgZMW6d2nEmWtvd2VnbyBkbyBvZHR3YXJ6YW5pYS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisiTmllIHVkYcWCbyBzacSZIG90d29yennEhyB1cnrEhWR6ZW5pYSBkxbp3acSZa293ZWdvIGRvIG9kdHdhcnphbmlhLiBUYSB3ZXJzamEgT3BlbiAiCisiU291bmQgU3lzdGVtIG5pZSBqZXN0IG9ic8WCdWdpd2FuYSBwcnpleiB0ZW4gZWxlbWVudC4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiT2R0d2FyemFuaWUgbmllIGplc3Qgb2JzxYJ1Z2l3YW5lIHByemV6IHRvIHVyesSFZHplbmllIGTFundpxJlrb3dlLiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAiQsWCxIVkIG9kdHdhcnphbmlhIGTFundpxJlrdS4iCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIk5hZ3J5d2FuaWUgbmllIGplc3Qgb2JzxYJ1Z2l3YW5lIHByemV6IHRvIHVyesSFZHplbmllIGTFundpxJlrb3dlLiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkLFgsSFZCBuYWdyeXdhbmlhIHogdXJ6xIVkemVuaWEgZMW6d2nEmWtvd2Vnby4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJOaWUgdWRhxYJvIHNpxJkgb3R3b3J6ecSHIHVyesSFZHplbmlhIGTFundpxJlrb3dlZ28gZG8gbmFncnl3YW5pYS4gQnJhayB1cHJhd25pZcWEICIKKyJkbyBvdHdhcmNpYSB1cnrEhWR6ZW5pYS4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSBvdHdvcnp5xIcgdXJ6xIVkemVuaWEgZMW6d2nEmWtvd2VnbyBkbyBuYWdyeXdhbmlhLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICJOaWUgem5hbGV6aW9ubyB1cnrEhWR6ZW5pYSBDb3JlQXVkaW8iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSBvdHdvcnp5xIcgdXJ6xIVkemVuaWEgQ29yZUF1ZGlvIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAixblyw7NkxYJvIG5hZ3J5d2FuaWEiCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICJNaWtyb2ZvbiIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIldlasWbY2llIGxpbmlpIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIldld27EmXRyem55IENEIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIldlasWbY2llIFNQRElGIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIldlasWbY2llIEFVWCAxIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIldlasWbY2llIEFVWCAyIgorCittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIlDEmXRsYSB6d3JvdG5hIGtvZGVrYSIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiUMSZdGxhIHp3cm90bmEgU3VuVlRTIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJHxYJvxZtub8WbxIciCisKK21zZ2lkICJHYWluIgorbXNnc3RyICJXem1vY25pZW5pZSIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIk1vbml0b3IiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJXYnVkb3dhbnkgZ8WCb8WbbmljemVrIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICJTxYJ1Y2hhd2tpIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIld5asWbY2llIGxpbmlpIgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICJXeWrFm2NpZSBTUERJRiIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiV3lqxZtjaWUgQVVYIDEiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIld5asWbY2llIEFVWCAyIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkLFgsSFZCBvZGN6eXR1ICVkIGJhanTDs3cgeiB1cnrEhWR6ZW5pYSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorIk5pZSB1ZGHFgm8gc2nEmSB3eWxpY3p5xIcgZG9zdMSZcG55Y2ggZm9ybWF0w7N3IG9icmF6dSwgeiBrdMOzcnltaSBtb8W8ZSBkemlhxYJhxIcgIgorInVyesSFZHplbmllICclcyciCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSBvZHd6b3Jvd2HEhyBidWZvcsOzdyB6IHVyesSFZHplbmlhICclcyciCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIlN0ZXJvd25payB1cnrEhWR6ZW5pYSAnJXMnIG5pZSBvYnPFgnVndWplIG1ldG9keSB3ZS93eSAlZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIlN0ZXJvd25payB1cnrEhWR6ZW5pYSAnJXMnIG5pZSBvYnPFgnVndWplIMW8YWRuZWogem5hbmVqIG1ldG9keSB3ZS93eS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAiVXJ6xIVkemVuaWUgJyVzJyBqZXN0IHphasSZdGUiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIlVyesSFZHplbmllICclcycgbmllIHBvdHJhZmkgcHJ6ZWNod3l0eXdhxIcgb2JyYXp1ICVkeCVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICJVcnrEhWR6ZW5pZSAnJXMnIG5pZSBwb3RyYWZpIHByemVjaHd5dHl3YcSHIG9icmF6dSB3IHBvZGFueW0gZm9ybWFjaWUiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiVXJ6xIVkemVuaWUgJyVzJyBvYnPFgnVndWplIG5pZWNpxIVnxYJlIHBvd2llcnpjaG5pZSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSB1enlza2HEhyBwYXJhbWV0csOzdyB1cnrEhWR6ZW5pYSAnJXMnIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICIiCisiVXJ6xIVkemVuaWUgb2JyYXp1IG5pZSBwcnp5asSZxYJvIG5vd2VnbyB1c3Rhd2llbmlhIGN6xJlzdG90bGl3b8WbY2kga2xhdGVrLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIlVyesSFZHplbmllIG9icmF6dSBuaWUgcHJ6ZWthemHFgm8gZm9ybWF0dSB3eWrFm2Npb3dlZ28uIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIlVyesSFZHplbmllIG9icmF6dSB6d3LDs2NpxYJvIGLFgsSZZG5lIHd5bWlhcnkuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIlVyesSZZHplbmllIG9icmF6dSB3eWtvcnp5c3R1amUgbmllIG9ic8WCdWdpd2FueSBzcG9zw7NiIHByemVwbG90dS4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiVXJ6xIVkemVuaWUgb2JyYXp1IHd5a29yenlzdHVqZSBuaWUgb2JzxYJ1Z2l3YW55IGZvcm1hdCBwaWtzZWxhLiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICJOaWUgdWRhxYJvIHNpxJkgc2tvbmZpZ3Vyb3dhxIcgd2V3bsSZdHJ6bmVqIHB1bGkgYnVmb3LDs3cuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICJVcnrEmWR6ZW5pZSBvYnJhenUgbmllIHphc3VnZXJvd2HFgm8gxbxhZG5lZ28gcm96bWlhcnUgYnVmb3JhLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIkJyYWsgb2Rkb2xuZWogcHVsaSBkbyB6YWltcG9ydG93YW5pYS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSB1enlza2HEhyB1c3Rhd2llxYQgdHVuZXJhICVkIHVyesSFZHplbmlhICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkLFgsSFZCBwb2RjemFzIHBvYmllcmFuaWEgbW/FvGxpd2/Fm2NpIHV6xIVkemVuaWEgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICJVcnrEhWR6ZW5pZSAnJXMnIG5pZSBqZXN0IHR1bmVyZW0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiTmllIHVkYcWCbyBzacSZIHV6eXNrYcSHIHdlasWbY2lhIHJhZGlvd2VnbyB6IHVyesSFZHplbmlhICclcycuICIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSB1c3Rhd2nEhyB3ZWrFm2NpYSAlZCB1cnrEhWR6ZW5pYSAlcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSB6bWllbmnEhyBzdGFudSB3eWNpc3plbmlhIGRsYSB1cnrEhWR6ZW5pYSAnJXMnLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiTmllIHVkYcWCbyBzacSZIHByenlkemllbGnEhyB3eW1hZ2FuZWogcGFtacSZY2kuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSBwcnp5ZHppZWxpxIcgd3ltYWdhbmVqIHBhbWnEmWNpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJLb253ZXJ0ZXIgdXJ6xIVkemVuaWEgJXMgbmllIG1hIG9ic8WCdWdpd2FuZWdvIGZvcm1hdHUgd2VqxZtjaW93ZWdvIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICJLb253ZXJ0ZXIgdXJ6xIVkemVuaWEgJXMgbmllIG1hIG9ic8WCdWdpd2FuZWdvIGZvcm1hdHUgd3lqxZtjaW93ZWdvIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJLb2RlciB1cnrEhWR6ZW5pYSAlcyBuaWUgbWEgb2JzxYJ1Z2l3YW5lZ28gZm9ybWF0dSB3ZWrFm2Npb3dlZ28iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICJLb2RlciB1cnrEhWR6ZW5pYSAlcyBuaWUgbWEgb2JzxYJ1Z2l3YW5lZ28gZm9ybWF0dSB3eWrFm2Npb3dlZ28iCisKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiTmllIHVkYcWCbyBzacSZIHVydWNob21pxIcgd8SFdGt1IGRla29kdWrEhWNlZ28uIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICJOaWUgdWRhxYJvIHNpxJkgcHJ6ZXR3b3J6ecSHIHJhbWtpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyJCxYLEhWQgcG9iaWVyYW5pYSBtb8W8bGl3b8WbY2kgdXJ6xIVkemVuaWEgJyVzJzogdG8gbmllIGplc3Qgc3Rlcm93bmlrIHY0bDIuICIKKyJQcm9zesSZIHNwcmF3ZHppxIcgY3p5IHRvIHN0ZXJvd25payB2NGwxLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSBvZHB5dGHEhyBvIGF0cnlidXR5IHdlasWbY2lhICVkIHVyesSFZHplbmlhICVzIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSB1enlza2HEhyB1c3Rhd2llxYQgdHVuZXJhICVkIHVyesSFZHplbmlhICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmllIHVkYcWCbyBzacSZIG9kcHl0YcSHIG5vcm1hbGl6YWNqaSB1cnrEhWR6ZW5pYSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmllIHVkYcWCbyBzacSZIHV6eXNrYcSHIGF0cnlidXTDs3cgc3RlcnVqxIVjeWNoIHVyesSFZHplbmlhICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5pZSBtb8W8bmEgemlkZW50eWZpa293YcSHIHVyesSFZHplbmlhICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlRvIG5pZSBqZXN0IHVyesSFZHplbmllICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiTmllIHVkYcWCbyBzacSZIG90d29yennEhyB1cnrEhWR6ZW5pYSAnJXMnIGRvIG9kY3p5dHUgaSB6YXBpc3UuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiVXJ6xIVkemVuaWUgJyVzJyBuaWUgamVzdCB1cnrEhWR6ZW5pZW0gcHJ6ZWNod3l0dWrEhWN5bS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIlVyesSFZHplbmllICclcycgbmllIGplc3QgdXJ6xIVkemVuaWVtIHd5asWbY2lvd3ltLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiVXJ6xIVkemVuaWUgJyVzJyBuaWUgamVzdCB1cnrEhWR6ZW5pZW0gTTJNLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiTmllIHVkYcWCbyBzacSZIHd5a29uYcSHIGR1cCB1cnrEhWR6ZW5pYSAnJXMnIGRvIG9kY3p5dHUgaSB6YXBpc3UuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJOaWUgdWRhxYJvIHNpxJkgdXN0YXdpxIcgbm9ybWFsaXphY2ppIGRsYSB1cnrEhWR6ZW5pYSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJOaWUgdWRhxYJvIHNpxJkgdXp5c2thxIcgYWt0dWFsbmVqIGN6xJlzdG90bGl3b8WbY2kgdHVuZXJhIGRsYSB1cnrEhWR6ZW5pYSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisiTmllIHVkYcWCbyBzacSZIHVzdGF3acSHIGFrdHVhbG5laiBjesSZc3RvdGxpd2/Fm2NpIHR1bmVyYSBkbGEgdXJ6xIVkemVuaWEgJyVzJyBuYSAiCisiJWx1IEh6LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJOaWUgdWRhxYJvIHNpxJkgdXp5c2thxIcgc2nFgnkgc3lnbmHFgnUgZGxhIHVyesSFZHplbmlhICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOaWUgdWRhxYJvIHNpxJkgdXp5c2thxIcgd2FydG/Fm2NpIHN0ZXJ1asSFY2VqICVkIHVyesSFZHplbmlhICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOaWUgdWRhxYJvIHNpxJkgdXN0YXdpxIcgJWQgamFrbyB3YXJ0b8WbY2kgc3RlcnVqxIVjZWogJWQgdXJ6xIVkemVuaWEgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJOaWUgdWRhxYJvIHNpxJkgdXp5c2thxIcgYWt0dWFsbmVnbyB3ZWrFm2NpYSB1cnrEhWR6ZW5pYSAnJXMnLiBNb8W8ZSB0byByYWRpbyIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiTmllIHVkYcWCbyBzacSZIHV6eXNrYcSHIGFrdHVhbG5lZ28gd3lqxZtjaWEgdXJ6xIVkemVuaWEgJyVzJy4gTW/FvGUgdG8gcmFkaW8iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiTmllIHVkYcWCbyBzacSZIHVzdGF3acSHIHd5asWbY2lhICVkIHVyesSFZHplbmlhICVzLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIlptaWFuYSByb3pkemllbGN6b8WbY2kgdyBjemFzaWUgZHppYcWCYW5pYSBuaWUgamVzdCBqZXN6Y3plIG9ic8WCdWdpd2FuYS4iCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIk5pZSBtb8W8bmEgcHJhY293YcSHIGJleiB6ZWdhcmEiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIkLFgsSFZCB3ZXduxJl0cnpueSBzdHJ1bWllbmlhIGRhbnljaC4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICJCxYLEhWQgd2V3bsSZdHJ6bnkgcHJ6ZXDFgnl3dSBkYW55Y2guIgpkaWZmIC0tZ2l0IGEvcG8vcHRfQlIucG8gYi9wby9wdF9CUi5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGE1Y2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvcG8vcHRfQlIucG8KQEAgLTAsMCArMSw4MDEgQEAKKyMgQnJhemlsaWFuIFBvcnR1Z3Vlc2UgdHJhbnNsYXRpb24gb2YgZ3N0LXBsdWdpbnMtZ29vZC4KKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGdzdC1wbHVnaW5zLWdvb2QgcGFja2FnZS4KKyMgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIEZhYnLDrWNpbyBHb2RveSA8c2thcmxsb3RAZ21haWwuY29tPiwgMjAwOC0yMDE2LgorIworIyBkYXRhIGZsb3cgLT4gZmx1eG8gZGUgZGFkb3MKKyMgc3RyZWFtaW5nIC0+IGZsdXhvIGNvbnTDrW51bworIyBjbG9jayAtPiB0ZW1wb3JpemFkb3IKKyMgcGxhbmUgKG92ZXJsYXkgcGxhbmUpIC0+IHBsYW5vIGRlIHNvYnJlcG9zacOnw6NvCisjIHBvb2wgLT4gY29sZcOnw6NvLCBjb25qdW50bywgYWdydXBhbWVudG8KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QtMS43LjJcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxNi0wNS0wNiAxNzo0OS0wMzAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBGYWJyw61jaW8gR29kb3kgPHNrYXJsbG90QGdtYWlsLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBCcmF6aWxpYW4gUG9ydHVndWVzZSA8bGRwYnItdHJhbnNsYXRpb25AbGlzdHMuc291cmNlZm9yZ2UuIgorIm5ldD5cbiIKKyJMYW5ndWFnZTogcHRfQlJcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD0obiA+IDEpO1xuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICJTZXJ2aWRvciBKYWNrIG7Do28gZW5jb250cmFkbyIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiRmFsaGEgYW8gZGVjb2RpZmljYXIgYSBpbWFnZW0gSlBFRyIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiXCIlc1wiIHBvciBcIiVzXCIiCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIk7Do28gZm9pIHBvc3PDrXZlbCBjb25lY3RhciBhbyBzZXJ2aWRvciIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJOZW5odW0gVVJMIGRlZmluaWRvLiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiTsOjbyBmb2kgcG9zc8OtdmVsIHJlc29sdmVyIG8gbm9tZSBkbyBzZXJ2aWRvci4iCisKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiTsOjbyBmb2kgcG9zc8OtdmVsIGVzdGFiZWxlY2VyIHVtYSBjb25leMOjbyBjb20gc2Vydmlkb3IuIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAiQ29uZmlndXJhw6fDo28gZGUgY29uZXjDo28gc2VndXJhIGZhbGhvdS4iCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICIiCisiVW0gZXJybyBkZSByZWRlIG9jb3JyZXUsIG91IG8gc2Vydmlkb3IgZmVjaG91IGEgY29uZXjDo28gaW5lc3BlcmFkYW1lbnRlLiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiTyBzZXJ2aWRvciBlbnZpb3UgZGFkb3MgcnVpbnMuIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIk7Dom8gaMOhIHN1cG9ydGUgYSBidXNjYSBwZWxvIHNlcnZpZG9yLiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAiRW50cmFkYSBkZSDDoXVkaW8gbnVsYSBvdSBpbnbDoWxpZGEsIG8gZmx1eG8gQVZJIHBvZGUgZXN0YXIgY29ycm9tcGlkby4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIkVzdGUgYXJxdWl2byBuw6NvIGNvbnTDqm0gZmx1eG9zIHJlcHJvZHV6w612ZWlzLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRXN0ZSBhcnF1aXZvIMOpIGludsOhbGlkbyBlIG7Do28gcMO0ZGUgc2VyIHJlcHJvZHV6aWRvLiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICIiCisiTsOjbyBmb2kgcG9zc8OtdmVsIHJlcHJvZHV6aXIgbyBmbHV4byBwb3IgZXN0YXIgY3JpcHRvZ3JhZmFkbyBjb20gUGxheVJlYWR5ICIKKyJEUk0uIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJFc3RlIGFycXVpdm8gZXN0w6EgY29ycm9tcGlkbyBlIG7Do28gcMO0ZGUgc2VyIHJlcHJvZHV6aWRvLiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiVGFtYW5obyBkZSBBdG9tIGludsOhbGlkby4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkVzdGUgYXJxdWl2byBlc3TDoSBpbmNvbXBsZXRvIGUgbsOjbyBww7RkZSBzZXIgcmVwcm9kdXppZG8uIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICJPIHbDrWRlbyBuZXN0ZSBhcnF1aXZvIHBvZGUgbsOjbyBzZXIgcmVwcm9kdXppZG8gY29ycmV0YW1lbnRlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICJFc3RlIGFycXVpdm8gY29udMOqbSBtdWl0b3MgZmx1eG9zLiBBcGVuYXMgcmVwcm9kdXppbmRvIG8gcHJpbWVpcm8gJWQiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorIk5lbmh1bSBmbHV4byBjb20gc3Vwb3J0ZSBmb2kgbG9jYWxpemFkby4gVm9jw6ogcG9kZSBwcmVjaXNhciBpbnN0YWxhciB1bSBwbHVnLSIKKyJpbiBkZSBleHRlbnPDo28gR1N0cmVhbWVyIFJUU1AgcGFyYSBmbHV4b3MgUmVhbCBtZWRpYS4iCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKyJOZW5odW0gZmx1eG8gY29tIHN1cG9ydGUgZm9pIGxvY2FsaXphZG8uIFRhbHZleiBoYWphIG5lY2Vzc2lkYWRlIGRlIHF1ZSBtYWlzICIKKyJwcm90b2NvbG9zIGRlIHRyYW5zcG9ydGUgc2VqYW0gcGVybWl0aWRvcyBvdSBzZW7Do28gbyBwbHVnLWluIGRlIGV4dGVuc8OjbyAiCisiR1N0cmVhbWVyIFJUU1AgcG9kZSBlc3RhciBpbmNvcnJldG8uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIk7Do28gZm9pIHBvc3PDrXZlbCBhYnJpciBvIGRpc3Bvc2l0aXZvIGRlIMOhdWRpbyBwYXJhIHJlcHJvZHXDp8Ojby4gTyBkaXNwb3NpdGl2byAiCisiZXN0w6Egc2VuZG8gdXNhZG8gcG9yIG91dHJvIGFwbGljYXRpdm8uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJOw6NvIGZvaSBwb3Nzw612ZWwgYWJyaXIgbyBkaXNwb3NpdGl2byBkZSDDoXVkaW8gcGFyYSByZXByb2R1w6fDo28uIFZvY8OqIG7Do28gdGVtICIKKyJwZXJtaXNzw6NvIHBhcmEgYWJyaXIgbyBkaXNwb3NpdGl2by4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiTsOjbyBmb2kgcG9zc8OtdmVsIGFicmlyIG8gZGlzcG9zaXRpdm8gZGUgw6F1ZGlvIHBhcmEgcmVwcm9kdcOnw6NvLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKyJOw6NvIGZvaSBwb3Nzw612ZWwgYWJyaXIgbyBkaXNwb3NpdGl2byBkZSDDoXVkaW8gcGFyYSByZXByb2R1w6fDo28uIE7Do28gaMOhICIKKyJzdXBvcnRlIGEgZXN0ZSBlbGVtZW50byBuZXN0YSB2ZXJzw6NvIGRvIFNpc3RlbWEgQWJlcnRvIGRlIFNvbSAoT1NTKS4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiTsOjbyBow6Egc3Vwb3J0ZSBhIHJlcHJvZHXDp8OjbyBwb3IgZXN0ZSBkaXNwb3NpdGl2byBkZSDDoXVkaW8uIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICJFcnJvIGRlIHJlcHJvZHXDp8OjbyBkZSDDoXVkaW8uIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJOw6NvIGjDoSBzdXBvcnRlIGEgZ3JhdmHDp8OjbyBwb3IgZXN0ZSBkaXNwb3NpdGl2byBkZSDDoXVkaW8uIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiRXJybyBhbyBncmF2YXIgZG8gZGlzcG9zaXRpdm8gZGUgw6F1ZGlvLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIk7Do28gZm9pIHBvc3PDrXZlbCBhYnJpciBvIGRpc3Bvc2l0aXZvIGRlIMOhdWRpbyBwYXJhIGdyYXZhw6fDo28uIFZvY8OqIG7Do28gdGVtICIKKyJwZXJtaXNzw6NvIHBhcmEgYWJyaXIgbyBkaXNwb3NpdGl2by4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIk7Do28gZm9pIHBvc3PDrXZlbCBhYnJpciBvIGRpc3Bvc2l0aXZvIGRlIMOhdWRpbyBwYXJhIGdyYXZhw6fDo28uIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgIkRpc3Bvc2l0aXZvIENvcmVBdWRpbyBuw6NvIGVuY29udHJhZG8iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIkRpc3Bvc2l0aXZvIENvcmVBdWRpbyBuw6NvIHDDtGRlIHNlciBhYmVydG8iCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICJPcmlnZW0gZGUgZ3JhdmHDp8OjbyIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIk1pY3JvZm9uZSIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIkVudHJhZGEgZGUgbGluaGEiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiQ0QgaW50ZXJubyIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJFbnRyYWRhIFNQRElGIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIkVudHJhZGEgYXV4LiAxIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIkVudHJhZGEgYXV4LiAyIgorCittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIkNPREVDIExvb3BiYWNrIgorCittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICJTdW5WVFMgTG9vcGJhY2siCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIlZvbHVtZSIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIkdhbmhvIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiTW9uaXRvcmFkb3IiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJBbHRvLWZhbGFudGUgaW50ZXJubyIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiRm9uZSBkZSBvdXZpZG8iCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiU2HDrWRhIGRlIGxpbmhhIgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICJTYcOtZGEgU1BESUYiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIlNhw61kYSBhdXguIDEiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIlNhw61kYSBhdXguIDIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRXJybyBhbyBsZXIgJWQgYnl0ZXMgZG8gZGlzcG9zaXRpdm8gXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorIkZhbGhhIGFvIHJlbGFjaW9uYXIgb3MgZm9ybWF0b3MgZGUgdsOtZGVvIHF1ZSBvIGRpc3Bvc2l0aXZvIFwiJXNcIiBvZmVyZWNlICIKKyJzdXBvcnRlIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICJOw6NvIGZvaSBwb3Nzw612ZWwgbWFwZWFyIGJ1ZmZlcnMgZG8gZGlzcG9zaXRpdm8gXCIlc1wiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICJPIGRyaXZlciBkbyBkaXNwb3NpdGl2byBcIiVzXCIgbsOjbyB0ZW0gc3Vwb3J0ZSBhbyBtw6l0b2RvICVkIGRlIEUvUyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIiIKKyJPIGRyaXZlciBkbyBkaXNwb3NpdGl2byBcIiVzXCIgbsOjbyB0ZW0gc3Vwb3J0ZSBhIG5lbmh1bSBtw6l0b2RvIGNvbmhlY2lkbyBkZSAiCisiRS9TLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICJPIGRpc3Bvc2l0aXZvIFwiJXNcIiBlc3TDoSBvY3VwYWRvIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICJPIGRpc3Bvc2l0aXZvIFwiJXNcIiBuw6NvIHJlYWxpemEgY2FwdHVyYSBhICVkeCVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICJPIGRpc3Bvc2l0aXZvIFwiJXNcIiBuw6NvIHJlYWxpemEgY2FwdHVyYSBubyBmb3JtYXRvIGVzcGVjaWZpY2FkbyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICIiCisiTyBkaXNwb3NpdGl2byBcIiVzXCIgbsOjbyB0ZW0gc3Vwb3J0ZSBhIHBsYW5vcyBkZSBzb2JyZXBvc2nDp8OjbyBuw6NvLWNvbnTDrW51b3MiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICJOw6NvIGZvaSBwb3Nzw612ZWwgb2J0ZXIgb3MgcGFyw6JtZXRyb3Mgbm8gZGlzcG9zaXRpdm8gXCIlc1wiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICJPIGRpc3Bvc2l0aXZvIGRlIHbDrWRlbyBuw6NvIGFjZWl0YSBkZWZpbmlyIHVtYSBub3ZhIHRheGEgZGUgcXVhZHJvcy4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICJPIGRpc3Bvc2l0aXZvIGRlIHbDrWRlbyBuw6NvIGZvcm5lY2V1IHVtIGZvcm1hdG8gZGUgc2HDrWRhLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICJPIGRpc3Bvc2l0aXZvIGRlIHbDrWRlbyByZXRvcm5vdSBkaW1lbnPDtWVzIGludsOhbGlkYXMuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIiIKKyJPcyBkaXNwb3NpdGl2b3MgZGUgdsOtZGVvIHV0aWxpemFtIHVtIG3DqXRvZG8gZGUgZW50cmVsYcOnYW1lbnRvIG7Do28gc3Vwb3J0YWRvLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICJPcyBkaXNwb3NpdGl2b3MgZGUgdsOtZGVvIHV0aWxpemFtIHVtIGZvcm1hdG8gcGFyYSBwaXhlbCBuw6NvIHN1cG9ydGFkby4iCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiRmFsaGEgYW8gY29uZmlndXJhciB1bWEgY29sZcOnw6NvIGRlIGJ1ZmZlciBpbnRlcm5vLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiTyBkaXNwb3NpdGl2byBkZSB2w61kZW8gbsOjbyBzdWdlcml1IG5lbmh1bSB0YW1hbmhvIGRlIGJ1ZmZlci4iCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICJOZW5odW1hIGNvbGXDp8OjbyBkZSBmbHV4byBkZSByZWNlYmltZW50byBwYXJhIGltcG9ydGFyLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRmFsaGEgYW8gb2J0ZXIgY29uZmlndXJhw6fDtWVzIGRvIHNpbnRvbml6YWRvciAlZCBubyBkaXNwb3NpdGl2byBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkVycm8gYW8gb2J0ZXIgZnVuY2lvbmFsaWRhZGVzIGRvIGRpc3Bvc2l0aXZvIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICJPIGRpc3Bvc2l0aXZvIFwiJXNcIiBuw6NvIMOpIHVtIHNpbnRvbml6YWRvci4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJGYWxoYSBhbyBvYnRlciBhIGVudHJhZGEgZGUgcsOhZGlvIGRvIGRpc3Bvc2l0aXZvIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJGYWxoYSBhbyBkZWZpbmlyIGEgZW50cmFkYSAlZCBubyBkaXNwb3NpdGl2byAlcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkZhbGhhIGFvIGFsdGVybmFyIGVudHJlIGNvbSBlIHNlbSDDoXVkaW8gcGFyYSBvIGRpc3Bvc2l0aXZvIFwiJXNcIi4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIkZhbGhhIGFvIGFsb2NhciBhIG1lbcOzcmlhIG5lY2Vzc8OhcmlhLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICJGYWxoYSBhbyBhbG9jYXIgYSBtZW3Ds3JpYSBuZWNlc3PDoXJpYS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIk8gY29udmVyc29yIG5vIGRpc3Bvc2l0aXZvICVzIG7Do28gdGVtIHVtIGZvcm1hdG8gZGUgZW50cmFkYSBjb20gc3Vwb3J0ZSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiTyBjb252ZXJzb3Igbm8gZGlzcG9zaXRpdm8gJXMgbsOjbyB0ZW0gdW0gZm9ybWF0byBkZSBzYcOtZGEgY29tIHN1cG9ydGUiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJPIGNvZGlmaWNhZG9yIG5vIGRpc3Bvc2l0aXZvICVzIG7Do28gdGVtIHVtIGZvcm1hdG8gZGUgZW50cmFkYSBjb20gc3Vwb3J0ZSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJPIGNvZGlmaWNhZG9yIG5vIGRpc3Bvc2l0aXZvICVzIG7Do28gdGVtIHVtIGZvcm1hdG8gZGUgc2HDrWRhIGNvbSBzdXBvcnRlIgorCittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIkZhbGhhIGFvIGluaWNpYXIgbyBzZWdtZW50byBkZSBkZWNvZGlmaWNhw6fDo28uIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICJGYWxoYSBhbyBwcm9jZXNzYXIgcXVhZHJvLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyJFcnJvIGFvIG9idGVyIHJlY3Vyc29zIGRvIGRpc3Bvc2l0aXZvIFwiJXNcIjogRWxlIG7Do28gw6kgdW0gZHJpdmVyIHY0bDIuICIKKyJWZXJpZmlxdWUgc2UgZWxlIMOpIHVtIGRyaXZlciB2NGwxLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIkZhbGhhIGFvIGV4YW1pbmFyIG9zIGF0cmlidXRvcyBkYSBlbnRyYWRhICVkIG5vIGRpc3Bvc2l0aXZvICVzIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkZhbGhhIGFvIG9idGVyIGNvbmZpZ3VyYcOnw7VlcyBkbyBzaW50b25pemFkb3IgJWQgbm8gZGlzcG9zaXRpdm8gXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkZhbGhhIGFvIGV4YW1pbmFyIGFzIG5vcm1hcyBubyBkaXNwb3NpdGl2byBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJGYWxoYSBhbyBvYnRlciBhdHJpYnV0b3MgZGUgY29udHJvbGUgbm8gZGlzcG9zaXRpdm8gXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJPIGRpc3Bvc2l0aXZvIFwiJXNcIiBuw6NvIHDDtGRlIHNlciBpZGVudGlmaWNhZG8uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlwiJXNcIiBuw6NvIMOpIHVtIGRpc3Bvc2l0aXZvLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIk7Do28gZm9pIHBvc3PDrXZlbCBhYnJpciBvIGRpc3Bvc2l0aXZvIFwiJXNcIiBwYXJhIGxlaXR1cmEgZSBncmF2YcOnw6NvLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIk8gZGlzcG9zaXRpdm8gXCIlc1wiIG7Do28gw6kgdW0gZGlzcG9zaXRpdm8gZGUgY2FwdHVyYS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIk8gZGlzcG9zaXRpdm8gXCIlc1wiIG7Do28gw6kgdW0gZGlzcG9zaXRpdm8gZGUgc2HDrWRhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiTyBkaXNwb3NpdGl2byBcIiVzXCIgbsOjbyDDqSB1bSBkaXNwb3NpdGl2byBNMk0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICIiCisiTsOjbyBmb2kgcG9zc8OtdmVsIGR1cGxpY2FyIG8gZGlzcG9zaXRpdm8gXCIlc1wiIHBhcmEgbGVpdHVyYSBlIGdyYXZhw6fDo28uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJGYWxoYSBhbyBkZWZpbmlyIGFzIG5vcm1hcyBwYXJhIG8gZGlzcG9zaXRpdm8gXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkZhbGhhIGFvIG9idGVyIGEgZnJlccO8w6puY2lhIGRvIHNpbnRvbml6YWRvciBwYXJhIG8gZGlzcG9zaXRpdm8gXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisiRmFsaGEgYW8gZGVmaW5pciBhIGZyZXHDvMOqbmNpYSBkbyBzaW50b25pemFkb3IgcGFyYSBvIGRpc3Bvc2l0aXZvIFwiJXNcIiDDoCAiCisiJWx1IEh6LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJGYWxoYSBhbyBvYnRlciBhIGZvcsOnYSBkbyBzaW5hbCBwYXJhIG8gZGlzcG9zaXRpdm8gXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRmFsaGEgYW8gb2J0ZXIgbyB2YWxvciBwYXJhIG8gY29udHJvbGUgJWQgbm8gZGlzcG9zaXRpdm8gXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRmFsaGEgYW8gZGVmaW5pciBvIHZhbG9yICVkIHBhcmEgbyBjb250cm9sZSAlZCBubyBkaXNwb3NpdGl2byBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiRmFsaGEgYW8gb2J0ZXIgYSBlbnRyYWRhIGF0dWFsIG5vIGRpc3Bvc2l0aXZvIFwiJXNcIi4gVGFsdmV6IHNlamEgdW0gIgorImRpc3Bvc2l0aXZvIGRlIHLDoWRpbyIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiRmFsaGEgYW8gb2J0ZXIgYSBzYcOtZGEgYXR1YWwgbm8gZGlzcG9zaXRpdm8gXCIlc1wiLiBUYWx2ZXogc2VqYSB1bSAiCisiZGlzcG9zaXRpdm8gZGUgcsOhZGlvIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIkZhbGhhIGFvIGRlZmluaXIgYSBzYcOtZGEgJWQgbm8gZGlzcG9zaXRpdm8gJXMuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiQWluZGEgbsOjbyBow6Egc3Vwb3J0ZSBhIG11ZGFuw6dhIGRlIHJlc29sdcOnw6NvIGVucXVhbnRvIGVzdMOhIGV4ZWN1dGFuZG8uIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICJOw6NvIMOpIHBvc3PDrXZlbCBvcGVyYXIgc2VtIHVtIHRlbXBvcml6YWRvciIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAiRXJybyBpbnRlcm5vIG5vIGZsdXhvIGRlIGRhZG9zLiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgZmxvdyBlcnJvci4iCisjfiBtc2dzdHIgIkVycm8gaW50ZXJubyBubyBmbHV4byBkZSBkYWRvcy4iCisKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIk8gZGlzcG9zaXRpdm8gXCIlc1wiIG7Do28gdGVtIHN1cG9ydGUgYSBjYXB0dXJhIGRlIHbDrWRlbyIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzb3VuZCBzZXJ2ZXIiCisjfiBtc2dzdHIgIk7Do28gZm9pIHBvc3PDrXZlbCBlc3RhYmVsZWNlciB1bWEgY29uZXjDo28gY29tIHNlcnZpZG9yIGRlIHNvbSIKKworI34gbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBzb3VuZCBzZXJ2ZXIgY2FwYWJpbGl0aWVzIgorI34gbXNnc3RyICJGYWxoYSBhbyBleGFtaW5hciBvcyByZWN1cnNvcyBkbyBzZXJ2aWRvciBkZSBzb20iCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICJHcmF2ZSIKKworI34gbXNnaWQgIlRyZWJsZSIKKyN+IG1zZ3N0ciAiQWd1ZG8iCisKKyN+IG1zZ2lkICJTeW50aCIKKyN+IG1zZ3N0ciAiU2ludGV0aXphZG9yIgorCisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICJQQ00iCisKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICJBbHRvLWZhbGFudGUiCisKKyN+IG1zZ2lkICJMaW5lLWluIgorI34gbXNnc3RyICJFbnRyYWRhIGRlIGxpbmhhIgorCisjfiBtc2dpZCAiQ0QiCisjfiBtc2dzdHIgIkNEIgorCisjfiBtc2dpZCAiTWl4ZXIiCisjfiBtc2dzdHIgIk1peGVyIgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIlBDTS0yIgorCisjfiBtc2dpZCAiUmVjb3JkIgorI34gbXNnc3RyICJHcmF2YcOnw6NvIgorCisjfiBtc2dpZCAiSW4tZ2FpbiIKKyN+IG1zZ3N0ciAiR2FuaG8gZGUgZW50cmFkYSIKKworI34gbXNnaWQgIk91dC1nYWluIgorI34gbXNnc3RyICJHYW5obyBkZSBzYcOtZGEiCisKKyN+IG1zZ2lkICJMaW5lLTEiCisjfiBtc2dzdHIgIkxpbmhhIDEiCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgIkxpbmhhIDIiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIkxpbmhhIDMiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTEiCisjfiBtc2dzdHIgIkRpZ2l0YWwgMSIKKworI34gbXNnaWQgIkRpZ2l0YWwtMiIKKyN+IG1zZ3N0ciAiRGlnaXRhbCAyIgorCisjfiBtc2dpZCAiRGlnaXRhbC0zIgorI34gbXNnc3RyICJEaWdpdGFsIDMiCisKKyN+IG1zZ2lkICJQaG9uZS1pbiIKKyN+IG1zZ3N0ciAiRW50cmFkYSBkZSBmb25lIgorCisjfiBtc2dpZCAiUGhvbmUtb3V0IgorI34gbXNnc3RyICJTYcOtZGEgZGUgZm9uZSIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICJWw61kZW8iCisKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAiUsOhZGlvIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKKyN+IG1zZ3N0ciAiIgorI34gIk7Do28gZm9pIHBvc3PDrXZlbCBhYnJpciBvIGRpc3Bvc2l0aXZvIGRlIMOhdWRpbyBwYXJhIG1hbmlwdWxhw6fDo28gZG8gIgorI34gImNvbnRyb2xhZG9yIGRvIG1peGVyLiIKKworI34gbXNnaWQgIiIKKyN+ICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIFRoaXMgdmVyc2lvbiBvZiAiCisjfiAidGhlIE9wZW4gU291bmQgU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIk7Do28gZm9pIHBvc3PDrXZlbCBhYnJpciBvIGRpc3Bvc2l0aXZvIGRlIMOhdWRpbyBwYXJhIG1hbmlwdWxhw6fDo28gZG8gIgorI34gImNvbnRyb2xhZG9yIGRvIG1peGVyLiBOw6NvIGjDoSBzdXBvcnRlIGEgZXN0ZSBlbGVtZW50byBjb20gZXN0YSB2ZXJzw6NvIGRvICIKKyN+ICJTaXN0ZW1hIEFiZXJ0byBkZSBTb20gKE9TUykuIgorCisjfiBtc2dpZCAiTWFzdGVyIgorI34gbXNnc3RyICJQcmluY2lwYWwiCisKKyN+IG1zZ2lkICJGcm9udCIKKyN+IG1zZ3N0ciAiRnJvbnRhbCIKKworI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIlRyYXNlaXJhIgorCisjfiBtc2dpZCAiSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiRm9uZXMgZGUgb3V2aWRvIgorCisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICJDZW50cmFsIgorCisjfiBtc2dpZCAiTEZFIgorI34gbXNnc3RyICJMRkUiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCIKKyN+IG1zZ3N0ciAiU3Vycm91bmQiCisKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICJMYXRlcmFsIgorCisjfiBtc2dpZCAiQVVYIE91dCIKKyN+IG1zZ3N0ciAiU2HDrWRhIGF1eC4iCisKKyN+IG1zZ2lkICIzRCBEZXB0aCIKKyN+IG1zZ3N0ciAiUHJvZnVuZGlkYWRlIDNEIgorCisjfiBtc2dpZCAiM0QgQ2VudGVyIgorI34gbXNnc3RyICIzRCBjZW50cmFsIgorCisjfiBtc2dpZCAiM0QgRW5oYW5jZSIKKyN+IG1zZ3N0ciAiUmVhbGNlIDNEIgorCisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICJUZWxlZm9uZSIKKworI34gbXNnaWQgIlZpZGVvIEluIgorI34gbXNnc3RyICJFbnRyYWRhIGRlIHbDrWRlbyIKKworI34gbXNnaWQgIkFVWCBJbiIKKyN+IG1zZ3N0ciAiRW50cmFkYSBhdXguIgorCisjfiBtc2dpZCAiUmVjb3JkIEdhaW4iCisjfiBtc2dzdHIgIkdhbmhvIGRlIGdyYXZhw6fDo28iCisKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAiR2FuaG8gZGUgc2HDrWRhIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAiQXVtZW50byBkbyBtaWNyb2ZvbmUiCisKKyN+IG1zZ2lkICJEaWFnbm9zdGljIgorI34gbXNnc3RyICJEaWFnbsOzc3RpY28iCisKKyN+IG1zZ2lkICJCYXNzIEJvb3N0IgorI34gbXNnc3RyICJBdW1lbnRvIGRlIGdyYXZlcyIKKworI34gbXNnaWQgIlBsYXliYWNrIFBvcnRzIgorI34gbXNnc3RyICJQb3J0YXMgZGUgcmVwcm9kdcOnw6NvIgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIkVudHJhZGEiCisKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAiT3JpZ2VtIGRlIG1vbml0b3Jhw6fDo28iCisKKyN+IG1zZ2lkICJLZXlib2FyZCBCZWVwIgorI34gbXNnc3RyICJCaXAgZG8gdGVjbGFkbyIKKworI34gbXNnaWQgIlNpbXVsYXRlIFN0ZXJlbyIKKyN+IG1zZ3N0ciAiU2ltdWxhciBlc3TDqXJlbyIKKworI34gbXNnaWQgIlN0ZXJlbyIKKyN+IG1zZ3N0ciAiRXN0w6lyZW8iCisKKyN+IG1zZ2lkICJTdXJyb3VuZCBTb3VuZCIKKyN+IG1zZ3N0ciAiU29tIHN1cnJvdW5kIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBHYWluIgorI34gbXNnc3RyICJHYW5obyBkbyBtaWNyb2ZvbmUiCisKKyN+IG1zZ2lkICJTcGVha2VyIFNvdXJjZSIKKyN+IG1zZ3N0ciAiT3JpZ2VtIGRvIGFsdG8tZmFsYW50ZSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgU291cmNlIgorI34gbXNnc3RyICJPcmlnZW0gZG8gbWljcm9mb25lIgorCisjfiBtc2dpZCAiSmFjayIKKyN+IG1zZ3N0ciAiSmFjayIKKworI34gbXNnaWQgIkNlbnRlciAvIExGRSIKKyN+IG1zZ3N0ciAiQ2VudHJhbC9MRkUiCisKKyN+IG1zZ2lkICJTdGVyZW8gTWl4IgorI34gbXNnc3RyICJNaXhhZ2VtIGVzdMOpcmVvIgorCisjfiBtc2dpZCAiTW9ubyBNaXgiCisjfiBtc2dzdHIgIk1peGFnZW0gbW9ubyIKKworI34gbXNnaWQgIklucHV0IE1peCIKKyN+IG1zZ3N0ciAiTWl4YWdlbSBkZSBlbnRyYWRhIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAxIgorI34gbXNnc3RyICJNaWNyb2ZvbmUgMSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAiTWljcm9mb25lIDIiCisKKyN+IG1zZ2lkICJEaWdpdGFsIE91dCIKKyN+IG1zZ3N0ciAiU2HDrWRhIGRpZ2l0YWwiCisKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICJFbnRyYWRhIGRpZ2l0YWwiCisKKyN+IG1zZ2lkICJIRE1JIgorI34gbXNnc3RyICJIRE1JIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgIk1vZGVtIgorCisjfiBtc2dpZCAiSGFuZHNldCIKKyN+IG1zZ3N0ciAiTW9ub2ZvbmUiCisKKyN+IG1zZ2lkICJPdGhlciIKKyN+IG1zZ3N0ciAiT3V0cm8iCisKKyN+IG1zZ2lkICJOb25lIgorI34gbXNnc3RyICJOZW5odW0iCisKKyN+IG1zZ2lkICJPbiIKKyN+IG1zZ3N0ciAiTGlnYWRvIgorCisjfiBtc2dpZCAiT2ZmIgorI34gbXNnc3RyICJEZXNsaWdhZG8iCisKKyN+IG1zZ2lkICJNdXRlIgorI34gbXNnc3RyICJNdWRvIgorCisjfiBtc2dpZCAiRmFzdCIKKyN+IG1zZ3N0ciAiUsOhcGlkbyIKKworI34gbXNnaWQgIlZlcnkgTG93IgorI34gbXNnc3RyICJNdWl0byBiYWl4YSIKKworI34gbXNnaWQgIkxvdyIKKyN+IG1zZ3N0ciAiQmFpeGEiCisKKyN+IG1zZ2lkICJNZWRpdW0iCisjfiBtc2dzdHIgIk3DqWRpYSIKKworI34gbXNnaWQgIkhpZ2giCisjfiBtc2dzdHIgIkFsdGEiCisKKyN+IG1zZ2lkICJWZXJ5IEhpZ2giCisjfiBtc2dzdHIgIk11aXRvIGFsdGEiCisKKyN+IG1zZ2lkICJQcm9kdWN0aW9uIgorI34gbXNnc3RyICJQcm9kdcOnw6NvIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTWljcm9waG9uZSIKKyN+IG1zZ3N0ciAiTWljcm9mb25lIGRvIHBhaW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBJbiIKKyN+IG1zZ3N0ciAiRW50cmFkYSBkZSBsaW5oYSBkbyBwYWluZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIEhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIkZvbmVzIGRlIG91dmlkbyBkbyBwYWluZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgT3V0IgorI34gbXNnc3RyICJTYcOtZGEgZGUgbGluaGEgZG8gcGFpbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJHcmVlbiBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIHZlcmRlIgorCisjfiBtc2dpZCAiUGluayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIHJvc2EiCisKKyN+IG1zZ2lkICJCbHVlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgYXp1bCIKKworI34gbXNnaWQgIldoaXRlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgYnJhbmNvIgorCisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBwcmV0byIKKworI34gbXNnaWQgIkdyYXkgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBjaW56YSIKKworI34gbXNnaWQgIk9yYW5nZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIGxhcmFuamEiCisKKyN+IG1zZ2lkICJSZWQgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciB2ZXJtZWxobyIKKworI34gbXNnaWQgIlllbGxvdyBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIGFtYXJlbG8iCisKKyN+IG1zZ2lkICJHcmVlbiBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIHZlcmRlIGRvIHBhaW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiUGluayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIHJvc2EgZG8gcGFpbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJCbHVlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgYXp1bCBkbyBwYWluZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIldoaXRlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgYnJhbmNvIGRvIHBhaW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiQmxhY2sgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBwcmV0byBkbyBwYWluZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIkdyYXkgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBjaW56YSBkbyBwYWluZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIk9yYW5nZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIGxhcmFuamEgZG8gcGFpbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJSZWQgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciB2ZXJtZWxobyBkbyBwYWluZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIlllbGxvdyBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIGFtYXJlbG8gZG8gcGFpbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJTcHJlYWQgT3V0cHV0IgorI34gbXNnc3RyICJTYcOtZGEgY29tdW0iCisKKyN+IG1zZ2lkICJEb3dubWl4IgorI34gbXNnc3RyICJNZXNjbGFyIGNhbmFpcyIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgSW5wdXQiCisjfiBtc2dzdHIgIkVudHJhZGEgZG8gbWl4ZXIgdmlydHVhbCIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgT3V0cHV0IgorI34gbXNnc3RyICJTYcOtZGEgZG8gbWl4ZXIgdmlydHVhbCIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgQ2hhbm5lbHMiCisjfiBtc2dzdHIgIkNhbmFpcyBkbyBtaXhlciB2aXJ0dWFsIgorCisjfiBtc2dpZCAiJXMgJWQgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzICVkIgorCisjfiBtc2dpZCAiJXMgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzIgorCisjfiBtc2dpZCAiR290IHVuZXhwZWN0ZWQgZnJhbWUgc2l6ZSBvZiAldSBpbnN0ZWFkIG9mICV1LiIKKyN+IG1zZ3N0ciAiRm9pIG9idGlkbyB1bSB0YW1hbmhvIGRlIHF1YWRybyBpbmVzcGVyYWRvIGRlICV1LCBhbyBpbnbDqXMgZGUgJXUuIgorCisjfiBtc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBvbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkVycm8gYW8gbGVyICVkIGJ5dGVzIG5vIGRpc3Bvc2l0aXZvIFwiJXNcIi4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZW5xdWV1ZSBidWZmZXJzIGluIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiTsOjbyBwb3Nzw612ZWwgYWRpY2lvbmFyIGJ1ZmZlcnMgw6AgZmlsYSBubyBkaXNwb3NpdGl2byBcIiVzXCIuIgorCisjfiBtc2dpZCAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJGYWxoYSBhbyB0ZW50YXIgb2J0ZXIgb3MgcXVhZHJvcyBkZSB2w61kZW8gZG8gZGlzcG9zaXRpdm8gXCIlc1wiLiIKKworI34gbXNnaWQgIkZhaWxlZCBhZnRlciAlZCB0cmllcy4gZGV2aWNlICVzLiBzeXN0ZW0gZXJyb3I6ICVzIgorI34gbXNnc3RyICJGYWxoYSBhcMOzcyAlZCB0ZW50YXRpdmFzLiBEaXNwb3NpdGl2byAlcy4gRXJybyBkbyBzaXN0ZW1hOiAlcyIKZGlmZiAtLWdpdCBhL3BvL3JvLnBvIGIvcG8vcm8ucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRjZjdkMgotLS0gL2Rldi9udWxsCisrKyBiL3BvL3JvLnBvCkBAIC0wLDAgKzEsODExIEBACisjIFJvbWFuaWFuIHRyYW5zbGF0aW9uIGZvciBnc3QtcGx1Z2lucy1nb29kCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSBnc3QtcGx1Z2lucy1nb29kIHBhY2thZ2UuCisjIEx1Y2lhbiBBZHJpYW4gR3JpamluY3UgPGx1Y2lhbi5ncmlqaW5jdUBnbWFpbC5jb20+LCAyMDEwLgorbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZCAwLjEwLjIzLjJcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxMC0wOC0xNiAwMzoyMiswMzAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBMdWNpYW4gQWRyaWFuIEdyaWppbmN1IDxsdWNpYW4uZ3JpamluY3VAZ21haWwuY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IFJvbWFuaWFuIDx0cmFuc2xhdGlvbi10ZWFtLXJvQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD5cbiIKKyJMYW5ndWFnZTogcm9cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTM7IHBsdXJhbD0obj09MSA/IDAgOiAobj09MCB8fCAobiUxMDAgPiAwICYmIG4lMTAwIDwgIgorIjIwKSkgPyAxIDogMik7O1xuIgorIlgtR2VuZXJhdG9yOiBWaXJ0YWFsIDAuNi4xXG4iCisiWC1MYXVuY2hwYWQtRXhwb3J0LURhdGU6IDIwMTAtMDgtMTYgMDA6MDgrMDAwMFxuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIk51IHMtYSBwdXR1dCBkZWNvZGEgaW1hZ2luZWEgSlBFRyIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAi4oCeJXPigJ0gZGUg4oCeJXPigJ0iCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIk51IHNlIHBvYXRlIHN0YWJpbGkgbyBjb25leGl1bmUgbGEgc2VydmVyIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIk51IHNlIHBvYXRlIHN0YWJpbGkgbyBjb25leGl1bmUgbGEgc2VydmVyIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICJOdSBzZSBwb2F0ZSBzdGFiaWxpIG8gY29uZXhpdW5lIGxhIHNlcnZlcnVsIGRlIHN1bmV0IgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICIiCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICIiCisiSW50cmFyZWEgYXVkaW8gbnUgZXhpc3TEgyBzYXUgZXN0ZSBuZXZhbGlkxIMsIGZsdXh1bCBkZSBkYXRlIEFWSSB2YSBmaSBjb3J1cHQuIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJBY2VzdCBmaciZaWVyIG51IGNvbsibaW5lIGZsdXh1cmkgY2UgcG90IGZpIHJlZGF0ZS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkZpyJlpZXJ1bCBudSBlc3RlIHZhbGlkIMiZaSBudSBwb2F0ZSBmaSByZWRhdC4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJBY2VzdCBmaciZaWVyIGVzdGUgY29ydXB0IMiZaSBudSBwb2F0ZSBmaSByZWRhdC4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiQWNlc3QgZmnImWllciBudSBlc3RlIGNvbXBsZXQgyJlpIG51IHBvYXRlIGZpIHJlZGF0LiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiRXN0ZSBwb3NpYmlsIGNhIGZpyJlpZXJ1bCB2aWRlbyBzxIMgbnUgZmllIHJlZGF0IGNvcmVjdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiRmnImWllcnVsIGNvbsibaW5lIHByZWEgbXVsdGUgZmx1eHVyaS4gU2UgcmVkYXUgZG9hciBwcmltZWxlICVkIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyJOdSBzLWEgZ8SDc2l0IG5pY2kgdW4gZmx1eCBzdXBvcnRhdC4gUGVudHJ1IGZsdXh1cmkgUmVhbCBtZWRpYSBzLWFyIHB1dGVhIHPEgyAiCisiZmllIG5ldm9pZSBzxIMgaW5zdGFsYcibaSBleHRlbnNpYSBHU3RyZWFtZXIgUlRTUC4iCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKyJOdSBhIGZvc3QgZ8SDc2l0IG5pY2l1biBmbHV4IHN1cG9ydGF0LiBTLWFyIHB1dGVhIHPEgyBuZWNlc2l0ZSBwZXJtaXRlcmVhIG1haSAiCisibXVsdG9yIHByb3RvY29hbGUgZGUgdHJhbnNwb3J0IHNhdSBkZSBhbHRmZWwgcy1hciBwdXRlYSBzxIMgbGlwc2Vhc2PEgyBtb2R1bHVsICIKKyJjb3JlY3QgZGUgZXh0ZW5zaWUgR1N0cmVhbWVyIFJUU1AuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIk51IHMtYSBwdXR1dCBkZXNjaGlkZSBkaXNwb3ppdGl2dWwgYXVkaW8gcGVudHJ1IHJlZGFyZS4gRGlzcG96aXRpdnVsIGVzdGUgIgorImZvbG9zaXQgZGUgbyBhbHTEgyBhcGxpY2HIm2llLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiTnUgcy1hIHB1dHV0IGRlc2NoaWRlIGRpc3Bveml0aXZ1bCBhdWRpbyBwZW50cnUgcmVkYXJlLiBOdSBhdmXIm2kgcGVybWlzaXVuZWEgIgorImRlIGEgZGVzY2hpZGUgZGlzcG96aXRpdnVsLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICJOdSBzLWEgcHV0dXQgZGVzY2hpZGUgZGlzcG96aXRpdnVsIGF1ZGlvIHBlbnRydSByZWRhcmUuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIk51IHMtYSBwdXR1dCBkZXNjaGlkZSBkaXNwb3ppdGl2dWwgYXVkaW8gcGVudHJ1IHJlZGFyZS4gVmVyc2l1bmVhIGFjZWFzdGEgYSAiCisiT1NTIChPcGVuIFNvdW5kIFN5c3RlbSkgbnUgZXN0ZSBzdXBvcnRhdMSDIGRlIGFjZXN0IGVsZW1lbnQuIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIlJlZGFyZWEgbnUgZXN0ZSBzdXBvcnRhdMSDIGRlIGFjZXN0IGRpc3Bveml0aXYgYXVkaW8uIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICJFcm9hcmUgcmVkYXJlIGF1ZGlvLiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiw45ucmVnaXN0cmFyZWEgbnUgZXN0ZSBzdXBvcnRhdMSDIGRlIGFjZXN0IGRpc3Bveml0aXYgYXVkaW8uIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiRXJvYXJlIGxhIMOubnJlZ2lzdHJhcmVhIGRlIGxhIGRpc3Bveml0aXZ1bCBhdWRpby4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJOdSBzLWEgcHV0dXQgZGVzY2hpZGUgZGlzcG96aXRpdnVsIGF1ZGlvIHBlbnRydSDDrm5yZWdpc3RyYXJlIE51IGF2ZcibaSAiCisicGVybWlzaXVuZWEgZGUgYSBkZXNjaGlkZSBkaXNwb3ppdGl2dWwuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICJOdSBzLWEgcHV0dXQgZGVzY2hpZGUgZGlzcG96aXRpdnVsIGF1ZGlvIHBlbnRydSDDrm5yZWdpc3RyYXJlLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIiIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIlN1cnPEgyDDrm5yZWdpc3RyYXJlIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWljcm9mb24iCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICJMaW5pZSBpbnRyYXJlIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIkNEIGludGVybiIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJJbnRyYXJlIFNQRElGIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIkludHJhcmUgQVVYIDEiCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAiSW50cmFyZSBBVVggMiIKKworIywgZnV6enkKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiQnVjbMSDIgorCisjLCBmdXp6eQorbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiQnVjbMSDIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJWb2x1bSIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIkFtcGxpZmljYXJlIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiTW9uaXRvciIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIkJveGUgaW50ZWdyYXRlIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICJDxIPImXRpIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIkxpbmllIGllyJlpcmUiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIkllyJlpcmUgU1BESUYiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIkllyJlpcmUgQVVYIDEiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIkllyJlpcmUgQVVYIDIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRXJvYXJlIGNpdGlyZSAlZCBvY3RlyJtpIGRlIGxhIGRpc3Bveml0aXZ1bCDigJ4lc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiTnUgcy1hIHB1dHV0IG1hcGEgbWVtb3JpYSB0YW1wb24gZGluIGRpc3Bveml0aXZ1bCDigJ4lc+KAnSIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIiIKKyJEcml2ZXJ1bCBwZW50cnUgZGlzcG96aXRpdnVsIOKAniVz4oCdIG51IHN1cG9ydCBuaWNpIG8gbWV0b2TEgyBkZSBjYXB0dXLEgyAiCisiY3Vub3NjdXTEgy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAiIgorIkRyaXZlcnVsIHBlbnRydSBkaXNwb3ppdGl2dWwg4oCeJXPigJ0gbnUgc3Vwb3J0IG5pY2kgbyBtZXRvZMSDIGRlIGNhcHR1csSDICIKKyJjdW5vc2N1dMSDLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAiRGlzcG96aXRpdnVsIOKAniVz4oCdIG51IGVzdGUgdW4gZGlzcG96aXRpdiBkZSBpZciZaXJlLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIkRpc3Bveml0aXZ1bCDigJ4lc+KAnSBudSBlc3RlIHVuIGRpc3Bveml0aXYgZGUgY2FwdHVyxIMuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiRGlzcG96aXRpdnVsIOKAniVz4oCdIG51IGVzdGUgdW4gZGlzcG96aXRpdiBkZSBjYXB0dXLEgy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIkRpc3Bveml0aXZ1bCDigJ4lc+KAnSBudSBlc3RlIHVuIGRpc3Bveml0aXYgZGUgaWXImWlyZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICJOdSBzLWF1IHB1dHV0IG9iyJtpbmUgcGFyYW1ldHJpaSBwZW50cnUgZGlzcG96aXRpdnVsIOKAniVz4oCdIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiIgorIkRpc3Bveml0aXZ1bCBkZSBpbnRyYXJlIHZpZGVvIG51IGEgYWNjZXB0YXQgbm91YSBjb25maWd1cmFyZSBkZSByYXRlIGNhZHJlLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICIiCisiRGlzcG96aXRpdnVsIGRlIGludHJhcmUgdmlkZW8gbnUgYSBhY2NlcHRhdCBub3VhIGNvbmZpZ3VyYXJlIGRlIHJhdGUgY2FkcmUuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICIiCisiRHJpdmVydWwgcGVudHJ1IGRpc3Bveml0aXZ1bCDigJ4lc+KAnSBudSBzdXBvcnQgbmljaSBvIG1ldG9kxIMgZGUgY2FwdHVyxIMgIgorImN1bm9zY3V0xIMuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIiIKKyJEcml2ZXJ1bCBwZW50cnUgZGlzcG96aXRpdnVsIOKAniVz4oCdIG51IHN1cG9ydCBuaWNpIG8gbWV0b2TEgyBkZSBjYXB0dXLEgyAiCisiY3Vub3NjdXTEgy4iCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiIgorIkRpc3Bveml0aXZ1bCBkZSBpbnRyYXJlIHZpZGVvIG51IGEgYWNjZXB0YXQgbm91YSBjb25maWd1cmFyZSBkZSByYXRlIGNhZHJlLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJBIGXImXVhdCBvYsibaW5lcmVhIGNvbmZpZ3VyxINyaWkgcmVjZXB0b3J1bHVpICVkIHBlbnRydSBkaXNwb3ppdGl2dWwg4oCeJXPigJ0uIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJFcm9hcmUgY2l0aXJlICVkIG9jdGXIm2kgZGUgbGEgZGlzcG96aXRpdnVsIOKAniVz4oCdLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICJEaXNwb3ppdGl2dWwg4oCeJXPigJ0gbnUgZXN0ZSB1biBkaXNwb3ppdGl2IGRlIGllyJlpcmUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIkRlZmluaXJlYSB2YWxvcmlpICVkIHBlbnRydSBkaXNwb3ppdGl2dWwg4oCeJXPigJ0gYSBlyJl1YXQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiRGVmaW5pcmVhIHZhbG9yaWkgJWQgcGVudHJ1IGRpc3Bveml0aXZ1bCDigJ4lc+KAnSBhIGXImXVhdC4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJPYsibaW5lcmVhIG5pdmVsdWx1aSBzZW1uYWx1bHVpIHBlbnRydSBkaXNwb3ppdGl2dWwg4oCeJXPigJ0gYSBlyJl1YXQuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisiRHJpdmVydWwgcGVudHJ1IGRpc3Bveml0aXZ1bCDigJ4lc+KAnSBudSBzdXBvcnQgbmljaSBvIG1ldG9kxIMgZGUgY2FwdHVyxIMgIgorImN1bm9zY3V0xIMuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIkRpc3Bveml0aXZ1bCBkZSBpbnRyYXJlIHZpZGVvIG51IGEgYWNjZXB0YXQgbm91YSBjb25maWd1cmFyZSBkZSByYXRlIGNhZHJlLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJEaXNwb3ppdGl2dWwgZGUgaW50cmFyZSB2aWRlbyBudSBhIGFjY2VwdGF0IG5vdWEgY29uZmlndXJhcmUgZGUgcmF0ZSBjYWRyZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIkRpc3Bveml0aXZ1bCBkZSBpbnRyYXJlIHZpZGVvIG51IGEgYWNjZXB0YXQgbm91YSBjb25maWd1cmFyZSBkZSByYXRlIGNhZHJlLiIKKworIywgZnV6enkKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiTnUgcy1hIHB1dHV0IGRlY29kYSBpbWFnaW5lYSBKUEVHIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisiRXJvYXJlIGxhIG9iyJtpbmVyZWEgY2FwYWJpbGl0xIPIm2lsb3IgcGVudHJ1IGRpc3Bveml0aXZ1bCDigJ4lc+KAnTogTnUgZXN0ZSB1biAiCisiZHJpdmVyIHY0bDIuIFZlcmlmaWNhyJtpIGRhY8SDIGVzdGUgdW4gZHJpdmVyIHY0bDEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiSW50ZXJvZ2FyZWEgYXRyaWJ1dGVsb3IgZGUgaW50cmFyZSAlZCBwZW50cnUgZGlzcG96aXRpdnVsICVzIGEgZciZdWF0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJBIGXImXVhdCBvYsibaW5lcmVhIGNvbmZpZ3VyxINyaWkgcmVjZXB0b3J1bHVpICVkIHBlbnRydSBkaXNwb3ppdGl2dWwg4oCeJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiSW50ZXJvZ2FyZWEgbm9ybWVpIHBlbnRydSBkaXNwb3ppdGl2dWwg4oCeJXPigJ0gYSBlyJl1YXQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJPYsibaW5lcmVhIGF0cmlidXRlbG9yIGRlIGNvbnRyb2wgcGVudHJ1IGRpc3Bveml0aXZ1bCDigJ4lc+KAnSBhIGXImXVhdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRGlzcG96aXRpdnVsIOKAniVz4oCdIG51IHBvYXRlIGZpIGlkZW50aWZpY2F0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICJBY2VzdGEgbnUgZXN0ZSB1biBkaXNwb3ppdGl2IOKAniVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIk51IHNlIHBvYXRlIGRlc2NoaWRlIGRpc3Bveml0aXZ1bCDigJ4lc+KAnSBwZW50cnUgY2l0aXJlIMiZaSBzY3JpZXJlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIkRpc3Bveml0aXZ1bCDigJ4lc+KAnSBudSBlc3RlIHVuIGRpc3Bveml0aXYgZGUgY2FwdHVyxIMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICJEaXNwb3ppdGl2dWwg4oCeJXPigJ0gbnUgZXN0ZSB1biBkaXNwb3ppdGl2IGRlIGllyJlpcmUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiRGlzcG96aXRpdnVsIOKAniVz4oCdIG51IGVzdGUgdW4gZGlzcG96aXRpdiBkZSBpZciZaXJlLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIk51IHNlIHBvYXRlIGRlc2NoaWRlIGRpc3Bveml0aXZ1bCDigJ4lc+KAnSBwZW50cnUgY2l0aXJlIMiZaSBzY3JpZXJlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRGVmaW5pcmVhIG5vcm1laSBwZW50cnUgZGlzcG96aXRpdnVsIOKAniVz4oCdIGEgZciZdWF0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJPYsibaW5lcmVhIGZyZWN2ZW7Im2VpIGN1cmVudCBhIHJlY2VwdG9ydWx1aSBwZW50cnUgZGlzcG96aXRpdnVsIOKAniVz4oCdIGEgZciZdWF0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisiRGVmaW5pcmVhIGZyZWN2ZW7Im2VpIGN1cmVudCBhIHJlY2VwdG9ydWx1aSBwZW50cnUgZGlzcG96aXRpdnVsIOKAniVz4oCdIGxhICVsdSAiCisiSHogYSBlyJl1YXQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk9iyJtpbmVyZWEgbml2ZWx1bHVpIHNlbW5hbHVsdWkgcGVudHJ1IGRpc3Bveml0aXZ1bCDigJ4lc+KAnSBhIGXImXVhdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk9iyJtpbmVyZWEgdmFsb3JpaSAlZCBwZW50cnUgZGlzcG96aXRpdnVsIOKAniVz4oCdIGEgZciZdWF0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRGVmaW5pcmlpIHZhbG9yaWkgJWQgcGVudHJ1IGNvbnRyb2x1bCAlZCBhbCBkaXNwb3ppdGl2dWwg4oCeJXPigJ0gYSBlyJl1YXQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiT2LIm2luZXJlYSBpbnRyxINyaSBjdXJlbnRlIHBlbnRydSBkaXNwb3ppdGl2dWwg4oCeJXPigJ0gYSBlyJl1YXQuIFBvc2liaWwgc8SDIGZpZSAiCisidW4gZGlzcG96aXRpdiByYWRpby4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJPYsibaW5lcmVhIGludHLEg3JpIGN1cmVudGUgcGVudHJ1IGRpc3Bveml0aXZ1bCDigJ4lc+KAnSBhIGXImXVhdC4gUG9zaWJpbCBzxIMgZmllICIKKyJ1biBkaXNwb3ppdGl2IHJhZGlvLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiRGVmaW5pcmVhIHZhbG9yaWkgJWQgcGVudHJ1IGRpc3Bveml0aXZ1bCDigJ4lc+KAnSBhIGXImXVhdC4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICJTY2hpbWJhcmVhIHJlem9sdcibaWVpIHBlIGR1cmF0YSBydWzEg3JpaSBudSBlc3RlIGluY8SDIHN1cG9ydGF0xIMuIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICJOdSBzZSBwb2F0ZSBvcGVyYSBmxINyxIMgdW4gY2VhcyIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAiRXJvYXJlIGludGVybsSDIGEgZmx1eHVsdWkgZGUgZGF0ZS4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICJFcm9hcmUgaW50ZXJuxIMgYSBmbHV4dWx1aSBkZSBkYXRlLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIkRpc3Bveml0aXZ1bCDigJ4lc+KAnSBudSBlc3RlIHVuIGRpc3Bveml0aXYgZGUgaWXImWlyZS4iCisKKyN+IG1zZ2lkICJHb3QgdW5leHBlY3RlZCBmcmFtZSBzaXplIG9mICV1IGluc3RlYWQgb2YgJXUuIgorI34gbXNnc3RyICJTLWEgb2LIm2ludXQgbyBkaW1lbnNpdW5lIG5lYciZdGVwdGF0xIMgcGVudHJ1IGNhZHJ1LCAldSDDrm4gbG9jIGRlICV1LiIKKworI34gbXNnaWQgIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiT2LIm2luZXJlYSBjYWRyZWxvciB2aWRlbyBwZW50cnUgZGlzcG96aXRpdnVsIOKAniVz4oCdIGEgZciZdWF0LiIKKworI34gbXNnaWQgIkZhaWxlZCBhZnRlciAlZCB0cmllcy4gZGV2aWNlICVzLiBzeXN0ZW0gZXJyb3I6ICVzIgorI34gbXNnc3RyICJBIGXImXVhdCBkdXDEgyAlZCDDrm5jZXJjxINyaS4gZGlzcG96aXRpdiAlcy4gZXJvYXJlIHNpc3RlbTogJXMiCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICJCYXMiCisKKyN+IG1zZ2lkICJUcmVibGUiCisjfiBtc2dzdHIgIsOObmFsdGUiCisKKyN+IG1zZ2lkICJTeW50aCIKKyN+IG1zZ3N0ciAiU3ludGgiCisKKyN+IG1zZ2lkICJQQ00iCisjfiBtc2dzdHIgIlBDTSIKKworI34gbXNnaWQgIlNwZWFrZXIiCisjfiBtc2dzdHIgIkRpZnV6b3IiCisKKyN+IG1zZ2lkICJMaW5lLWluIgorI34gbXNnc3RyICJMaW5pZSBpbnRyYXJlIgorCisjfiBtc2dpZCAiQ0QiCisjfiBtc2dzdHIgIkNEIgorCisjfiBtc2dpZCAiTWl4ZXIiCisjfiBtc2dzdHIgIk1peGVyIgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIlBDTS0yIgorCisjfiBtc2dpZCAiUmVjb3JkIgorI34gbXNnc3RyICLDjm5yZWdpc3RyYXJlIgorCisjfiBtc2dpZCAiSW4tZ2FpbiIKKyN+IG1zZ3N0ciAiQ8OiyJl0aWcgaW50cmFyZSIKKworI34gbXNnaWQgIk91dC1nYWluIgorI34gbXNnc3RyICJDw6LImXRpZyBpZciZaXJlIgorCisjfiBtc2dpZCAiTGluZS0xIgorI34gbXNnc3RyICJMaW5pYS0xIgorCisjfiBtc2dpZCAiTGluZS0yIgorI34gbXNnc3RyICJMaW5pYS0yIgorCisjfiBtc2dpZCAiTGluZS0zIgorI34gbXNnc3RyICJMaW5pYS0zIgorCisjfiBtc2dpZCAiRGlnaXRhbC0xIgorI34gbXNnc3RyICJEaWdpdGFsLTEiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTIiCisjfiBtc2dzdHIgIkRpZ2l0YWwtMiIKKworI34gbXNnaWQgIkRpZ2l0YWwtMyIKKyN+IG1zZ3N0ciAiRGlnaXRhbC0zIgorCisjfiBtc2dpZCAiUGhvbmUtaW4iCisjfiBtc2dzdHIgIkludHJhcmUgdGVsZWZvbiIKKworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAiSWXImWlyZSB0ZWxlZm9uIgorCisjfiBtc2dpZCAiVmlkZW8iCisjfiBtc2dzdHIgIlZpZGVvIgorCisjfiBtc2dpZCAiUmFkaW8iCisjfiBtc2dzdHIgIlJhZGlvIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKKyN+IG1zZ3N0ciAiIgorI34gIk51IHMtYSBwdXR1dCBkZXNjaGlkZSBkaXNwb3ppdGl2dWwgYXVkaW8gcGVudHJ1IGdlc3Rpb25hcmVhIGNvbnRyb2x1bHVpICIKKyN+ICJkZSBtaXhhai4iCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJOdSBzLWEgcHV0dXQgZGVzY2hpZGUgZGlzcG96aXRpdnVsIGF1ZGlvIHBlbnRydSBnZXN0aW9uYXJlYSBjb250cm9sdWx1aSAiCisjfiAiZGUgbWl4YWouIEFjZWFzdMSDIHZlcnNpdW5lIGEgT1NTIChPcGVuIFNvdW5kIFN5c3RlbSkgbnUgZXN0ZSBzdXBvcnRhdMSDIGRlICIKKyN+ICJhY2VzdCBlbGVtZW50IgorCisjfiBtc2dpZCAiTWFzdGVyIgorI34gbXNnc3RyICJQcmluY2lwYWwiCisKKyN+IG1zZ2lkICJGcm9udCIKKyN+IG1zZ3N0ciAiRmHIm8SDIgorCisjfiBtc2dpZCAiUmVhciIKKyN+IG1zZ3N0ciAiU3BhdGUiCisKKyN+IG1zZ2lkICJIZWFkcGhvbmVzIgorI34gbXNnc3RyICJDxIPImXRpIgorCisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICJDZW50cnUiCisKKyN+IG1zZ2lkICJMRkUiCisjfiBtc2dzdHIgIkxGRSIKKworI34gbXNnaWQgIlN1cnJvdW5kIgorI34gbXNnc3RyICJTdXJyb3VuZCIKKworI34gbXNnaWQgIlNpZGUiCisjfiBtc2dzdHIgIkxhdGVyYWwiCisKKyN+IG1zZ2lkICJBVVggT3V0IgorI34gbXNnc3RyICJJZciZaXJlIEFVWCIKKworI34gbXNnaWQgIjNEIERlcHRoIgorI34gbXNnc3RyICJBZMOibmNpbWUgM0QiCisKKyN+IG1zZ2lkICIzRCBDZW50ZXIiCisjfiBtc2dzdHIgIkNlbnRydSAzRCIKKworI34gbXNnaWQgIjNEIEVuaGFuY2UiCisjfiBtc2dzdHIgIsOObWJ1bsSDdMSDyJtpcmUgM0QiCisKKyN+IG1zZ2lkICJUZWxlcGhvbmUiCisjfiBtc2dzdHIgIlRlbGVmb24iCisKKyN+IG1zZ2lkICJWaWRlbyBJbiIKKyN+IG1zZ3N0ciAiSW50cmFyZSB2aWRlbyIKKworI34gbXNnaWQgIkFVWCBJbiIKKyN+IG1zZ3N0ciAiSW50cmFyZSBBVVgiCisKKyN+IG1zZ2lkICJSZWNvcmQgR2FpbiIKKyN+IG1zZ3N0ciAiQ8OiyJl0aWcgw65ucmVnaXN0cmFyZSIKKworI34gbXNnaWQgIk91dHB1dCBHYWluIgorI34gbXNnc3RyICJDw6LImXRpZyBpZciZaXJlIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAiQW1wbGlmaWNhcmUgbWljcm9mb24iCisKKyN+IG1zZ2lkICJEaWFnbm9zdGljIgorI34gbXNnc3RyICJEaWFnbm9zdGljIgorCisjfiBtc2dpZCAiQmFzcyBCb29zdCIKKyN+IG1zZ3N0ciAiQW1wbGlmaWNhcmUgYmFzIgorCisjfiBtc2dpZCAiUGxheWJhY2sgUG9ydHMiCisjfiBtc2dzdHIgIlBvcnR1cmkgcmVkYXJlIgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIkludHJhcmUiCisKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAiU3Vyc8SDIG1vbml0b3IiCisKKyN+IG1zZ2lkICJLZXlib2FyZCBCZWVwIgorI34gbXNnc3RyICJCaXAgdGFzdGF0dXLEgyIKKworI34gbXNnaWQgIlNpbXVsYXRlIFN0ZXJlbyIKKyN+IG1zZ3N0ciAiU2ltdWxlYXrEgyBzdGVyZW8iCisKKyN+IG1zZ2lkICJTdGVyZW8iCisjfiBtc2dzdHIgIlN0ZXJlbyIKKworI34gbXNnaWQgIlN1cnJvdW5kIFNvdW5kIgorI34gbXNnc3RyICJTdW5ldCBzdXJyb3VuZCIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKKyN+IG1zZ3N0ciAiQ8OiyJl0aWcgbWljcm9mb24iCisKKyN+IG1zZ2lkICJTcGVha2VyIFNvdXJjZSIKKyN+IG1zZ3N0ciAiU3Vyc8SDIGRpZnV6b3IiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAiU3Vyc8SDIG1pY3JvZm9uIgorCisjfiBtc2dpZCAiSmFjayIKKyN+IG1zZ3N0ciAiSmFjayIKKworI34gbXNnaWQgIkNlbnRlciAvIExGRSIKKyN+IG1zZ3N0ciAiQ2VudHJ1IC8gTEZFIgorCisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAiU3RlcmVvIE1peCIKKworI34gbXNnaWQgIk1vbm8gTWl4IgorI34gbXNnc3RyICJNb25vIE1peCIKKworI34gbXNnaWQgIklucHV0IE1peCIKKyN+IG1zZ3N0ciAiTWl4IGludHJhcmUiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDEiCisjfiBtc2dzdHIgIk1pY3JvZm9uIDEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDIiCisjfiBtc2dzdHIgIk1pY3JvZm9uIDIiCisKKyN+IG1zZ2lkICJEaWdpdGFsIE91dCIKKyN+IG1zZ3N0ciAiSWXImWlyZSBkaWdpdGFsxIMiCisKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICJJbnRyYXJlIGRpZ2l0YWzEgyIKKworI34gbXNnaWQgIkhETUkiCisjfiBtc2dzdHIgIkhETUkiCisKKyN+IG1zZ2lkICJNb2RlbSIKKyN+IG1zZ3N0ciAiTW9kZW0iCisKKyN+IG1zZ2lkICJIYW5kc2V0IgorI34gbXNnc3RyICJDxIPImXRpIgorCisjfiBtc2dpZCAiT3RoZXIiCisjfiBtc2dzdHIgIkFsdHVsIgorCisjfiBtc2dpZCAiTm9uZSIKKyN+IG1zZ3N0ciAiTmljaXVudWwiCisKKyN+IG1zZ2lkICJPbiIKKyN+IG1zZ3N0ciAiQWN0aXZhdCIKKworI34gbXNnaWQgIk9mZiIKKyN+IG1zZ3N0ciAiRGV6YWN0aXZhdCIKKworI34gbXNnaWQgIk11dGUiCisjfiBtc2dzdHIgIk11dCIKKworI34gbXNnaWQgIkZhc3QiCisjfiBtc2dzdHIgIlJhcGlkIgorCisjfiBtc2dpZCAiVmVyeSBMb3ciCisjfiBtc2dzdHIgIkZvYXJ0ZSBzY8SDenV0xIMiCisKKyN+IG1zZ2lkICJMb3ciCisjfiBtc2dzdHIgIlNjxIN6dXTEgyIKKworI34gbXNnaWQgIk1lZGl1bSIKKyN+IG1zZ3N0ciAiTWVkaWUiCisKKyN+IG1zZ2lkICJIaWdoIgorI34gbXNnc3RyICJSaWRpY2F0xIMiCisKKyN+IG1zZ2lkICJWZXJ5IEhpZ2giCisjfiBtc2dzdHIgIkZvYXJ0ZSByaWRpY2F0xIMiCisKKyN+IG1zZ2lkICJQcm9kdWN0aW9uIgorI34gbXNnc3RyICJQcm9kdWPIm2llIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTWljcm9waG9uZSIKKyN+IG1zZ3N0ciAiTWljcm9mb24gcGFub3UgZnJvbnRhbCIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgSW4iCisjfiBtc2dzdHIgIkxpbmllIGludHJhcmUgcGFub3UgZnJvbnRhbCIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIEhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIkPEg8iZdGkgcGFub3UgZnJvbnRhbCIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgT3V0IgorI34gbXNnc3RyICJMaW5pZSBpZciZaXJlIHBhbm91IGZyb250YWwiCisKKyN+IG1zZ2lkICJHcmVlbiBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIHZlcmRlIgorCisjfiBtc2dpZCAiUGluayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIHJveiIKKworI34gbXNnaWQgIkJsdWUgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBhbGJhc3RydSIKKworI34gbXNnaWQgIldoaXRlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgYWxiIgorCisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBuZWdydSIKKworI34gbXNnaWQgIkdyYXkgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBncmkiCisKKyN+IG1zZ2lkICJPcmFuZ2UgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBwb3J0b2NhbGl1IgorCisjfiBtc2dpZCAiUmVkIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3Igcm/ImXUiCisKKyN+IG1zZ2lkICJZZWxsb3cgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBnYWxiZW4iCisKKyN+IG1zZ2lkICJHcmVlbiBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIHZlcmRlIHBhbm91IGZyb250YWwiCisKKyN+IG1zZ2lkICJQaW5rIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3Igcm96IHBhbm91IGZyb250YWwiCisKKyN+IG1zZ2lkICJCbHVlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgYWxiYXN0cnUgcGFub3UgZnJvbnRhbCIKKworI34gbXNnaWQgIldoaXRlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgYWxiIHBhbm91IGZyb250YWwiCisKKyN+IG1zZ2lkICJCbGFjayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIG5lZ3J1IHBhbm91IGZyb250YWwiCisKKyN+IG1zZ2lkICJHcmF5IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgZ3JpIHBhbm91IGZyb250YWwiCisKKyN+IG1zZ2lkICJPcmFuZ2UgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBwb3J0b2NhbGl1IHBhbm91IGZyb250YWwiCisKKyN+IG1zZ2lkICJSZWQgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciByb8iZdSBwYW5vdSBmcm9udGFsIgorCisjfiBtc2dpZCAiWWVsbG93IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgZ2FsYmVuIHBhbm91IGZyb250YWwiCisKKyN+IG1zZ2lkICJTcHJlYWQgT3V0cHV0IgorI34gbXNnc3RyICLDjm1wYXJ0ZSBpZciZaXJlYSIKKworI34gbXNnaWQgIkRvd25taXgiCisjfiBtc2dzdHIgIk1peGFqIHJlZHVzIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBJbnB1dCIKKyN+IG1zZ3N0ciAiSW50cmFyZSBtaXhlciB2aWRlbyIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgT3V0cHV0IgorI34gbXNnc3RyICJJZciZaXJlIG1peGVyIHZpZGVvIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBDaGFubmVscyIKKyN+IG1zZ3N0ciAiQ2FuYWxlIG1peGVyIHZpZGVvIgorCisjfiBtc2dpZCAiJXMgJWQgRnVuY3Rpb24iCisjfiBtc2dzdHIgIkZ1bmPIm2llICVzICVkIgorCisjfiBtc2dpZCAiJXMgRnVuY3Rpb24iCisjfiBtc2dzdHIgIkZ1bmPIm2llICVzIgorCisjfiBtc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBvbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkVyb2FyZSBjaXRpcmUgJWQgb2N0ZcibaSBwZSBkaXNwb3ppdGl2dWwg4oCeJXPigJ0uIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIk51IHMtYSBwdXR1dCBwcm9ncmFtYSBtZW1vcmlhIHRhbXBvbiDDrm4gZGlzcG96aXRpdnVsIOKAniVz4oCdLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzb3VuZCBzZXJ2ZXIiCisjfiBtc2dzdHIgIk51IHNlIHBvYXRlIHN0YWJpbGkgbyBjb25leGl1bmUgbGEgc2VydmVydWwgZGUgc3VuZXQiCisKKyN+IG1zZ2lkICJGYWlsZWQgdG8gcXVlcnkgc291bmQgc2VydmVyIGNhcGFiaWxpdGllcyIKKyN+IG1zZ3N0ciAiSW50ZXJvZ2FyZWEgY2FwYWJpbGl0xIPIm2lsb3Igc2VydmVydWx1aSBkZSBzdW5ldCBhIGXImXVhdCIKZGlmZiAtLWdpdCBhL3BvL3J1LnBvIGIvcG8vcnUucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNlODY2OQotLS0gL2Rldi9udWxsCisrKyBiL3BvL3J1LnBvCkBAIC0wLDAgKzEsODQ3IEBACisjIFRyYW5zbGF0aW9uIGZvciBnc3QtcGx1Z2lucy1nb29kIG1lc3NhZ2VzIHRvIFJ1c3NpYW4KKyMgVGhpcyBmaWxlIGlzIHB1dCBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMKKyMg0JDRgNGC0ZHQvCDQn9C+0L/QvtCyIDxhcnRmd29AZ21haWwuY29tPiwgMjAwOS4KKyMgUGF2ZWwgTWFyeWFub3YgPGFjaWRfamFja0B1a3IubmV0PiwgMjAwOS4KKyMgWXVyaSBLb3psb3YgPHl1cmF5QGtvbXlha2luby5ydT4sIDIwMTEsIDIwMTIsIDIwMTMsIDIwMTQsIDIwMTUsIDIwMTYuCisjIFBhdmVsIE1hcnlhbm92IDxhY2lkQGphY2sua2lldi51YT4sIDIwMTMuCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kIDEuNy4yXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTYtMDItMjEgMDk6NTUrMDMwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogWXVyaSBLb3psb3YgPHl1cmF5QGtvbXlha2luby5ydT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBSdXNzaWFuIDxnbnVAZDA3LnJ1PlxuIgorIkxhbmd1YWdlOiBydVxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlgtR2VuZXJhdG9yOiBMb2thbGl6ZSAxLjVcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTM7IHBsdXJhbD0obiUxMD09MSAmJiBuJTEwMCE9MTEgPyAwIDogbiUxMD49MiAmJiBuIgorIiUxMDw9NCAmJiAobiUxMDA8MTAgfHwgbiUxMDA+PTIwKSA/IDEgOiAyKTtcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAi0KHQtdGA0LLQtdGAIEphY2sg0L3QtSDQvdCw0LnQtNC10L0iCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0LTQtdC60L7QtNC40YDQvtCy0LDRgtGMIEpQRUct0LjQt9C+0LHRgNCw0LbQtdC90LjQtSIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiwqslc8K7LCDCqyVzwrsiCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0YHQvtC10LTQuNC90LjRgtGM0YHRjyDRgSDRgdC10YDQstC10YDQvtC8IgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIlVSTCDQvdC1INC30LDQtNCw0L0uIgorCittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINC+0L/RgNC10LTQtdC70LjRgtGMINC40LzRjyDRgdC10YDQstC10YDQsC4iCisKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAi0J3QtSDRg9C00LDQu9C+0YHRjCDRg9GB0YLQsNC90L7QstC40YLRjCDRgdC+0LXQtNC40L3QtdC90LjQtSDRgSDRgdC10YDQstC10YDQvtC8LiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0L3QsNGB0YLRgNC+0LjRgtGMINC30LDRidC40YnRkdC90L3QvtC1INGB0L7QtdC00LjQvdC10L3QuNC1LiIKKworbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgItCf0YDQvtC40LfQvtGI0LvQsCDRgdC10YLQtdCy0LDRjyDQvtGI0LjQsdC60LAg0LjQu9C4INGB0LXRgNCy0LXRgCDQvdC10L7QttC40LTQsNC90L3QviDQt9Cw0LrRgNGL0Lsg0YHQvtC10LTQuNC90LXQvdC40LUuIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICLQodC10YDQstC10YAg0L/RgNC40YHQu9Cw0Lsg0L3QtdC60L7RgNGA0LXQutGC0L3Ri9C1INC00LDQvdC90YvQtS4iCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAi0KHQtdGA0LLQtdGAINC90LUg0L/QvtC00LTQtdGA0LbQuNCy0LDQtdGCINC/0L7QuNGB0LouIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICIiCisi0JLRhdC+0LTRj9GJ0LjQtSDQsNGD0LTQuNC+LdC00LDQvdC90YvQtSDQvtGC0YHRg9GC0YHRgtCy0YPRjtGCINC40LvQuCDQvdC10LTQtdC50YHRgtCy0LjRgtC10LvRjNC90YssINC/0L7RgtC+0LogQVZJINCx0YPQtNC10YIgIgorItC/0L7QstGA0LXQttC00ZHQvS4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgItCk0LDQudC7INC90LUg0YHQvtC00LXRgNC20LjRgiDQstC+0YHQv9GA0L7QuNC30LLQvtC00LjQvNGL0YUg0L/QvtGC0L7QutC+0LIuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICLQpNCw0LnQuyDQvdC10LrQvtGA0YDQtdC60YLQtdC9INC4INC90LUg0LzQvtC20LXRgiDQsdGL0YLRjCDQstC+0YHQv9GA0L7QuNC30LLQtdC00ZHQvS4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiIgorItCd0LXQstC+0LfQvNC+0LbQvdC+INCy0L7RgdC/0YDQvtC40LfQstC10YHRgtC4INC/0L7RgtC+0LosINGC0LDQuiDQutCw0Log0L7QvSDQt9Cw0YjQuNGE0YDQvtCy0LDQvSDRgSDQv9C+0LzQvtGJ0YzRjiBQbGF5UmVhZHkgIgorIkRSTS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgItCk0LDQudC7INC/0L7QstGA0LXQttC00ZHQvSDQuCDQvdC1INC80L7QttC10YIg0LHRi9GC0Ywg0LLQvtGB0L/RgNC+0LjQt9Cy0LXQtNGR0L0uIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICLQndC10LLQtdGA0L3Ri9C5INCw0YLQvtC80LDRgNC90YvQuSDRgNCw0LfQvNC10YAuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICLQpNCw0LnQuyDQvdC1INC/0L7Qu9C+0L0g0Lgg0L3QtSDQvNC+0LbQtdGCINCx0YvRgtGMINCy0L7RgdC/0YDQvtC40LfQstC10LTRkdC9LiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAi0JLQuNC00LXQviDQuNC3INGN0YLQvtCz0L4g0YTQsNC50LvQsCDQvNC+0LbQtdGCINCx0YvRgtGMINCy0L7RgdC/0YDQvtC40LfQstC10LTQtdC90L4g0L3QtdC60L7RgNGA0LXQutGC0L3Qvi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiIgorItCk0LDQudC7INGB0L7QtNC10YDQttC40YIg0YHQu9C40YjQutC+0Lwg0LzQvdC+0LPQviDQv9C+0YLQvtC60L7Qsi4g0JHRg9C00LXRgiDQstC+0YHQv9GA0L7QuNC30LLQtdC00ZHQvdC+INGC0L7Qu9GM0LrQviDQv9C10YDQstGL0YUgJWQiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorItCd0Lgg0L7QtNC40L0g0L/QvtGC0L7QuiDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgtGB0Y8uINCS0L7Qt9C80L7QttC90L4g0YLRgNC10LHRg9C10YLRgdGPINGD0YHRgtCw0L3QvtCy0LrQsCAiCisi0LTQvtC/0L7Qu9C90LjRgtC10LvRjNC90L7Qs9C+INC80L7QtNGD0LvRjyBHU3RyZWFtZXIgUlRTUCDQtNC70Y8g0L/QvtGC0L7QutC+0LIgUmVhbCBtZWRpYS4iCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKyLQndC4INC+0LTQuNC9INC/0L7RgtC+0Log0L3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YLRgdGPLiDQktC+0LfQvNC+0LbQvdC+INGC0YDQtdCx0YPQtdGC0YHRjyDRgNCw0LfRgNC10YjQuNGC0Ywg0LTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSAiCisi0L/RgNC+0YLQvtC60L7Qu9GLINC/0LXRgNC10LTQsNGH0Lgg0LjQu9C4INC20LUg0L7RgtGB0YPRgtGB0YLQstGD0LXRgiDQv9GA0LDQstC40LvRjNC90YvQuSDQvNC+0LTRg9C70YwgR1N0cmVhbWVyIFJUU1AuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorItCd0LUg0YPQtNCw0LvQvtGB0Ywg0L7RgtC60YDRi9GC0Ywg0LDRg9C00LjQvi3Rg9GB0YLRgNC+0LnRgdGC0LLQviDQtNC70Y8g0LLQvtGB0L/RgNC+0LjQt9Cy0LXQtNC10L3QuNGPLiDQo9GB0YLRgNC+0LnRgdGC0LLQviAiCisi0LjRgdC/0L7Qu9GM0LfRg9C10YLRgdGPINC00YDRg9Cz0LjQvCDQv9GA0LjQu9C+0LbQtdC90LjQtdC8LiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisi0J3QtSDRg9C00LDQu9C+0YHRjCDQvtGC0LrRgNGL0YLRjCDQsNGD0LTQuNC+LdGD0YHRgtGA0L7QudGB0YLQstC+INC00LvRjyDQstC+0YHQv9GA0L7QuNC30LLQtdC00LXQvdC40Y8uINCe0YLRgdGD0YLRgdGC0LLRg9GO0YIg0L/RgNCw0LLQsCAiCisi0LTQvtGB0YLRg9C/0LAg0Log0YPRgdGC0YDQvtC50YHRgtCy0YMuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0L7RgtC60YDRi9GC0Ywg0LDRg9C00LjQvi3Rg9GB0YLRgNC+0LnRgdGC0LLQviDQtNC70Y8g0LLQvtGB0L/RgNC+0LjQt9Cy0LXQtNC10L3QuNGPLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKyLQndC1INGD0LTQsNC70L7RgdGMINC+0YLQutGA0YvRgtGMINCw0YPQtNC40L4t0YPRgdGC0YDQvtC50YHRgtCy0L4g0LTQu9GPINCy0L7RgdC/0YDQvtC40LfQstC10LTQtdC90LjRjy4g0JTQsNC90L3QsNGPINCy0LXRgNGB0LjRjyBPcGVuICIKKyJTb3VuZCBTeXN0ZW0g0L3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YLRgdGPINGN0YLQuNC8INGN0LvQtdC80LXQvdGC0L7QvC4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAi0JLQvtGB0L/RgNC+0LjQt9Cy0LXQtNC10L3QuNC1INC90LUg0L/QvtC00LTQtdGA0LbQuNCy0LDQtdGC0YHRjyDQtNCw0L3QvdGL0Lwg0LDRg9C00LjQvi3Rg9GB0YLRgNC+0LnRgdGC0LLQvtC8LiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAi0J7RiNC40LHQutCwINCy0L7RgdC/0YDQvtC40LfQstC10LTQtdC90LjRjyDQsNGD0LTQuNC+LiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAi0JfQsNC/0LjRgdGMINC90LUg0L/QvtC00LTQtdGA0LbQuNCy0LDQtdGC0YHRjyDQtNCw0L3QvdGL0Lwg0LDRg9C00LjQvi3Rg9GB0YLRgNC+0LnRgdGC0LLQvtC8LiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgItCe0YjQuNCx0LrQsCDQt9Cw0L/QuNGB0Lgg0YEg0LDRg9C00LjQvi3Rg9GB0YLRgNC+0LnRgdGC0LLQsC4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyLQndC1INGD0LTQsNC70L7RgdGMINC+0YLQutGA0YvRgtGMINCw0YPQtNC40L4t0YPRgdGC0YDQvtC50YHRgtCy0L4g0LTQu9GPINC30LDQv9C40YHQuC4g0J7RgtGB0YPRgtGB0YLQstGD0Y7RgiDQv9GA0LDQstCwINC00L7RgdGC0YPQv9CwINC6ICIKKyLRg9GB0YLRgNC+0LnRgdGC0LLRgy4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0L7RgtC60YDRi9GC0Ywg0LDRg9C00LjQvi3Rg9GB0YLRgNC+0LnRgdGC0LLQviDQtNC70Y8g0LfQsNC/0LjRgdC4LiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICLQo9GB0YLRgNC+0LnRgdGC0LLQviBDb3JlQXVkaW8g0L3QtSDQvdCw0LnQtNC10L3QviIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAi0J3QtdCy0L7Qt9C80L7QttC90L4g0L7RgtC60YDRi9GC0Ywg0YPRgdGC0YDQvtC50YHRgtCy0L4gQ29yZUF1ZGlvIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAi0KPRgdGC0YDQvtC50YHRgtCy0L4g0LfQsNC/0LjRgdC4IgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAi0JzQuNC60YDQvtGE0L7QvSIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgItCb0LjQvdC10LnQvdGL0Lkg0LLRhdC+0LQiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAi0JLQvdGD0YLRgNC10L3QvdC40LkgQ0QiCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAi0JLRhdC+0LQgU1BESUYiCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAi0JLRhdC+0LQgQVVYIDEiCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAi0JLRhdC+0LQgQVVYIDIiCisKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAi0J/QtdGC0LvRjyBDb2RlYyIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAi0J/QtdGC0LvRjyBTdW5WVFMiCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgItCj0YDQvtCy0LXQvdGMIgorCittc2dpZCAiR2FpbiIKK21zZ3N0ciAi0KPRgNC+0LLQtdC90YwiCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICLQnNC+0L3QuNGC0L7RgNC40L3QsyIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgItCS0L3Rg9GC0YDQtdC90L3QuNC5INC00LjQvdCw0LzQuNC6IgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICLQndCw0YPRiNC90LjQuiIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICLQm9C40L3QtdC50L3Ri9C5INCy0YvRhdC+0LQiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgItCS0YvRhdC+0LQgU1BESUYiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgItCS0YvRhdC+0LQgQVVYIDEiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgItCS0YvRhdC+0LQgQVVYIDIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J7RiNC40LHQutCwINGH0YLQtdC90LjRjyAlZCDQsdCw0LnRgiDQuNC3INGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIiIKKyLQndC1INGD0LTQsNC70L7RgdGMINGB0L7Qt9C00LDRgtGMINGB0L/QuNGB0L7QuiDQstC40LTQtdC+LdGE0L7RgNC80LDRgtC+0LIsINGBINC60L7RgtC+0YDRi9C80Lgg0LzQvtC20LXRgiDRgNCw0LHQvtGC0LDRgtGMICIKKyLRg9GB0YLRgNC+0LnRgdGC0LLQviDCqyVzwrsiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0YDQsNGB0L/RgNC10LTQtdC70LjRgtGMINCx0YPRhNC10YDRiyDRg9GB0YLRgNC+0LnRgdGC0LLQsCDCqyVzwrsiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgItCU0YDQsNC50LLQtdGAINGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuyDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgiDQvNC10YLQvtC0INCy0LLQvtC00LAt0LLRi9Cy0L7QtNCwICVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAiIgorItCU0YDQsNC50LLQtdGAINGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuyDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgiDQvdC4INC+0LTQuNC9INC40Lcg0LjQt9Cy0LXRgdGC0L3Ri9GFINC80LXRgtC+0LTQvtCyINCy0LLQvtC00LAtIgorItCy0YvQstC+0LTQsC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAi0KPRgdGC0YDQvtC50YHRgtCy0L4gwqslc8K7INC30LDQvdGP0YLQviIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAi0KPRgdGC0YDQvtC50YHRgtCy0L4gwqslc8K7INC90LUg0LzQvtC20LXRgiDQvtGB0YPRidC10YHRgtCy0LvRj9GC0Ywg0LfQsNGF0LLQsNGCINCyINGA0LDQt9GA0LXRiNC10L3QuNC4ICVkeCVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICLQo9GB0YLRgNC+0LnRgdGC0LLQviDCqyVzwrsg0L3QtSDQvNC+0LbQtdGCINC+0YHRg9GJ0LXRgdGC0LLQu9GP0YLRjCDQt9Cw0YXQstCw0YIg0LIg0YPQutCw0LfQsNC90L3QvtC8INGE0L7RgNC80LDRgtC1IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIiIKKyLQo9GB0YLRgNC+0LnRgdGC0LLQviDCqyVzwrsg0L/QvtC00LTQtdGA0LbQuNCy0LDQtdGCINC/0YDQtdGA0YvQstC40YHRgtGL0LUg0LzQsNGC0YDQuNGG0YsgKG5vbi1jb250aWd1b3VzIHBsYW5lcykiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINC/0L7Qu9GD0YfQuNGC0Ywg0L/QsNGA0LDQvNC10YLRgNGLINGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuyIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAi0JLQuNC00LXQvi3Rg9GB0YLRgNC+0LnRgdGC0LLQviDQvdC1INC/0YDQuNC90Y/Qu9C+INC90L7QstC+0LUg0LfQvdCw0YfQtdC90LjQtSDQvdCw0YHRgtGA0L7QudC60Lgg0LrQsNC00YDQvtCy0L7QuSDRh9Cw0YHRgtC+0YLRiy4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICLQktC40LTQtdC+LdGD0YHRgtGA0L7QudGB0YLQstC+INC90LUg0L/RgNC10LTQvtGB0YLQsNCy0LjQu9C+INCy0YvRhdC+0LTQvdC+0Lkg0YTQvtGA0LzQsNGCLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICLQktC40LTQtdC+LdGD0YHRgtGA0L7QudGB0YLQstC+INCy0LXRgNC90YPQu9C+INC90LXQutC+0YDRgNC10LrRgtC90YvQtSDRgNCw0LfQvNC10YDRiy4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAi0JLQuNC00LXQvi3Rg9GB0YLRgNC+0LnRgdGC0LLQsCDQuNGB0L/QvtC70YzQt9GD0Y7RgiDQvdC10L/QvtC00LTQtdGA0LbQuNCy0LDQtdC80YvQuSDQvNC10YLQvtC0INGH0LXRgNC10LfRgdGC0YDQvtGH0L3QvtGB0YLQuC4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAi0JLQuNC00LXQvi3Rg9GB0YLRgNC+0LnRgdGC0LLQsCDQuNGB0L/QvtC70YzQt9GD0Y7RgiDQvdC10L/QvtC00LTQtdGA0LbQuNCy0LDQtdC80YvQuSDRhNC+0YDQvNCw0YIg0L/QuNC60YHQtdC70LXQuS4iCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAi0J7RiNC40LHQutCwINC/0YDQuCDQvdCw0YHRgtGA0L7QudC60LUg0LLQvdGD0YLRgNC10L3QvdC10LPQviDQsdGD0YTQtdGA0L3QvtCz0L4g0L/Rg9C70LAuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICLQktC40LTQtdC+LdGD0YHRgtGA0L7QudGB0YLQstC+INC90LUg0L/RgNC10LTQu9C+0LbQuNC70L4g0LrQsNC60L7QuS3Qu9C40LHQviDRgNCw0LfQvNC10YAg0LHRg9GE0LXRgNCwLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgItCd0LXQvtGC0LrRg9C00LAg0LjQvNC/0L7RgNGC0LjRgNC+0LLQsNGC0Ywg0L/Rg9C7INC90LjRgdGF0L7QtNGP0YnQtdCz0L4g0L/QvtGC0L7QutCwLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J3QtSDRg9C00LDQu9C+0YHRjCDQv9C+0LvRg9GH0LjRgtGMINC90LDRgdGC0YDQvtC50LrQuCDRgtGO0L3QtdGA0LAgJWQg0YPRgdGC0YDQvtC50YHRgtCy0LAgwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLQntGI0LjQsdC60LAg0L/RgNC4INC/0L7Qu9GD0YfQtdC90LjQuCDRgdC/0LjRgdC60LAg0LLQvtC30LzQvtC20L3QvtGB0YLQtdC5INGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICLQo9GB0YLRgNC+0LnRgdGC0LLQviDCqyVzwrsg0L3QtSDRj9Cy0LvRj9C10YLRgdGPINGC0Y7QvdC10YDQvtC8LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0LLRi9Cx0YDQsNGC0Ywg0YDQsNC00LjQvi3QstGF0L7QtCDQvdCwINGD0YHRgtGA0L7QudGB0YLQstC1IMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINCy0YvQsdGA0LDRgtGMINCy0YXQvtC0ICVkINC00LvRjyDRg9GB0YLRgNC+0LnRgdGC0LLQsCAlcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0LjQt9C80LXQvdC40YLRjCDRgdC+0YHRgtC+0Y/QvdC40LUg0L/RgNC40LPQu9GD0YjQtdC90LjRjyDQtNC70Y8g0YPRgdGC0YDQvtC50YHRgtCy0LAgwqslc8K7LiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAi0J3QtSDRg9C00LDQu9C+0YHRjCDQstGL0LTQtdC70LjRgtGMINC00L7RgdGC0LDRgtC+0YfQvdC+INC/0LDQvNGP0YLQuC4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAi0J3QtSDRg9C00LDQu9C+0YHRjCDQstGL0LTQtdC70LjRgtGMINC00L7RgdGC0LDRgtC+0YfQvdC+INC/0LDQvNGP0YLQuC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAi0J/RgNC10L7QsdGA0LDQt9C+0LLQsNGC0LXQu9GMINC90LAg0YPRgdGC0YDQvtC50YHRgtCy0LUgJXMg0L3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YIg0LLRhdC+0LTQvdC+0Lkg0YTQvtGA0LzQsNGCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICLQn9GA0LXQvtCx0YDQsNC30L7QstCw0YLQtdC70Ywg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQtSAlcyDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgiDQstGL0YXQvtC00L3QvtC5INGE0L7RgNC80LDRgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAi0JrQvtC00LjRgNC+0LLRidC40Log0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQtSAlcyDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgiDQstGF0L7QtNC90L7QuSDRhNC+0YDQvNCw0YIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICLQmtC+0LTQuNGA0L7QstGJ0LjQuiDQvdCwINGD0YHRgtGA0L7QudGB0YLQstC1ICVzINC90LUg0L/QvtC00LTQtdGA0LbQuNCy0LDQtdGCINCy0YvRhdC+0LTQvdC+0Lkg0YTQvtGA0LzQsNGCIgorCittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0LfQsNC/0YPRgdGC0LjRgtGMINC90LjRgtGMINC00LXQutC+0LTQuNGA0L7QstCw0L3QuNGPLiIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAi0J3QtSDRg9C00LDQu9C+0YHRjCDQvtCx0YDQsNCx0L7RgtCw0YLRjCDQutCw0LTRgC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisi0J7RiNC40LHQutCwINC/0L7Qu9GD0YfQtdC90LjRjyDQstC+0LfQvNC+0LbQvdC+0YHRgtC10Lkg0YPRgdGC0YDQvtC50YHRgtCy0LAgwqslc8K7OiDQtNGA0LDQudCy0LXRgCDRg9GB0YLRgNC+0LnRgdGC0LLQsCAiCisi0L3QtdGB0L7QstC80LXRgdGC0LjQvCDRgSB2NGwyLiDQn9GA0L7QstC10YDRjNGC0LUsINC90LUg0LjRgdC/0L7Qu9GM0LfRg9C10YIg0LvQuCDRg9GB0YLRgNC+0LnRgdGC0LLQviDQtNGA0LDQudCy0LXRgCB2NGwxLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgItCe0YjQuNCx0LrQsCDQt9Cw0L/RgNC+0YHQsCDQsNGC0YDQuNCx0YPRgtC+0LIg0LLRhdC+0LTQsCAlZCDRg9GB0YLRgNC+0LnRgdGC0LLQsCAlcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICLQntGI0LjQsdC60LAg0L/QvtC70YPRh9C10L3QuNGPINGD0YHRgtCw0L3QvtCy0L7QuiDRgtGO0L3QtdGA0LAgJWQg0YPRgdGC0YDQvtC50YHRgtCy0LAgwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCe0YjQuNCx0LrQsCDQt9Cw0L/RgNC+0YHQsCDRgdGC0LDQvdC00LDRgNGC0LAg0YPRgdGC0YDQvtC50YHRgtCy0LAgwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J7RiNC40LHQutCwINC/0L7Qu9GD0YfQtdC90LjRjyDQsNGC0YDQuNCx0YPRgtC+0LIg0YPQv9GA0LDQstC70LXQvdC40Y8g0YPRgdGC0YDQvtC50YHRgtCy0LAgwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICLQndC1INGD0LTQsNGR0YLRgdGPINGA0LDRgdC/0L7Qt9C90LDRgtGMINGD0YHRgtGA0L7QudGB0YLQstC+IMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiwqslc8K7INC90LUg0Y/QstC70Y/QtdGC0YHRjyDRg9GB0YLRgNC+0LnRgdGC0LLQvtC8LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0L7RgtC60YDRi9GC0Ywg0YPRgdGC0YDQvtC50YHRgtCy0L4gwqslc8K7INC00LvRjyDRh9GC0LXQvdC40Y8g0Lgg0LfQsNC/0LjRgdC4LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgItCj0YHRgtGA0L7QudGB0YLQstC+IMKrJXPCuyDQvdC1INGP0LLQu9GP0LXRgtGB0Y8g0YPRgdGC0YDQvtC50YHRgtCy0L7QvCDQt9Cw0YXQstCw0YLQsC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgItCj0YHRgtGA0L7QudGB0YLQstC+IMKrJXPCuyDQvdC1INGP0LLQu9GP0LXRgtGB0Y8g0YPRgdGC0YDQvtC50YHRgtCy0L7QvCDQstGL0LLQvtC00LAuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICLQo9GB0YLRgNC+0LnRgdGC0LLQviDCqyVzwrsg0L3QtSDRj9Cy0LvRj9C10YLRgdGPINGD0YHRgtGA0L7QudGB0YLQstC+0LwgTTJNLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAi0J3QtSDRg9C00LDQu9C+0YHRjCDRgdC00LXQu9Cw0YLRjCDQtNGD0LHQu9C40LrQsNGCINGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuyDQtNC70Y8g0YfRgtC10L3QuNGPINC4INC30LDQv9C40YHQuC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCe0YjQuNCx0LrQsCDRg9GB0YLQsNC90L7QstC60Lgg0YHRgtCw0L3QtNCw0YDRgtCwINGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLQntGI0LjQsdC60LAg0L/QvtC70YPRh9C10L3QuNGPINGC0LXQutGD0YnQtdC5INGH0LDRgdGC0L7RgtGLINGC0Y7QvdC10YDQsCDRg9GB0YLRgNC+0LnRgdGC0LLQsCDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgItCe0YjQuNCx0LrQsCDRg9GB0YLQsNC90L7QstC60Lgg0YLQtdC60YPRidC10Lkg0YfQsNGB0YLQvtGC0Ysg0YLRjtC90LXRgNCwINGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuyDQsiAlbHUg0JPRhi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J7RiNC40LHQutCwINC/0L7Qu9GD0YfQtdC90LjRjyDQvNC+0YnQvdC+0YHRgtC4INGB0LjQs9C90LDQu9CwINC00LvRjyDRg9GB0YLRgNC+0LnRgdGC0LLQsCDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICLQntGI0LjQsdC60LAg0L/QvtC70YPRh9C10L3QuNGPINC30L3QsNGH0LXQvdC40Y8g0YPQv9GA0LDQstC70Y/RjtGJ0LXQs9C+INC/0LDRgNCw0LzQtdGC0YDQsCAlZCDRg9GB0YLRgNC+0LnRgdGC0LLQsCDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisi0J7RiNC40LHQutCwINGD0YHRgtCw0L3QvtCy0LrQuCDQt9C90LDRh9C10L3QuNGPICVkINC00LvRjyDRg9C/0YDQsNCy0LvRj9GO0YnQtdCz0L4g0L/QsNGA0LDQvNC10YLRgNCwICVkINGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyLQndC1INGD0LTQsNC70L7RgdGMINC+0L/RgNC10LTQtdC70LjRgtGMINCw0LrRgtC40LLQvdGL0Lkg0LLRhdC+0LQg0YPRgdGC0YDQvtC50YHRgtCy0LAgwqslc8K7LiDQktC+0LfQvNC+0LbQvdC+LCDRjdGC0L4g0YDQsNC00LjQvi0iCisi0YPRgdGC0YDQvtC50YHRgtCy0L4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorItCd0LUg0YPQtNCw0LvQvtGB0Ywg0L7Qv9GA0LXQtNC10LvQuNGC0Ywg0LDQutGC0LjQstC90YvQuSDQstGL0YXQvtC0INGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuy4g0JLQvtC30LzQvtC20L3Qviwg0Y3RgtC+INGA0LDQtNC40L4tIgorItGD0YHRgtGA0L7QudGB0YLQstC+IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0LLRi9Cx0YDQsNGC0Ywg0LLRi9GF0L7QtCAlZCDQtNC70Y8g0YPRgdGC0YDQvtC50YHRgtCy0LAgJXMuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiIgorItCY0LfQvNC10L3QtdC90LjQtSDRgNCw0LfRgNC10YjQtdC90LjRjyDQstC40LTQtdC+INCy0L4g0LLRgNC10LzRjyDQstGL0L/QvtC70L3QtdC90LjRjyDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgtGB0Y8g0LIg0L3QsNGB0YLQvtGP0YnQuNC5ICIKKyLQvNC+0LzQtdC90YIuIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICLQntC/0LXRgNCw0YbQuNGPINC90LXQstC+0LfQvNC+0LbQvdCwINCx0LXQtyDRh9Cw0YHQvtCyIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBzdHJlYW0gZXJyb3IuIgorI34gbXNnc3RyICLQktC90YPRgtGA0LXQvdC90Y/RjyDQvtGI0LjQsdC60LAg0L/QvtGC0L7QutCwINC00LDQvdC90YvRhS4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICLQktC90YPRgtGA0LXQvdC90Y/RjyDQvtGI0LjQsdC60LAg0L/QvtGC0L7QutCwINC00LDQvdC90YvRhS4iCisKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgItCj0YHRgtGA0L7QudGB0YLQstC+IMKrJXPCuyDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgiDQt9Cw0YXQstCw0YIg0LLQuNC00LXQviIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzb3VuZCBzZXJ2ZXIiCisjfiBtc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0YPRgdGC0LDQvdC+0LLQuNGC0Ywg0YHQvtC10LTQuNC90LXQvdC40LUg0YEg0YHQtdGA0LLQtdGA0L7QvCDQt9Cy0YPQutCwIgorCisjfiBtc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IHNvdW5kIHNlcnZlciBjYXBhYmlsaXRpZXMiCisjfiBtc2dzdHIgItCe0YjQuNCx0LrQsCDQv9GA0Lgg0LfQsNC/0YDQvtGB0LUg0LLQvtC30LzQvtC20L3QvtGB0YLQtdC5INGB0LXRgNCy0LXRgNCwINC30LLRg9C60LAiCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICLQndC40LfQutC40LUiCisKKyN+IG1zZ2lkICJUcmVibGUiCisjfiBtc2dzdHIgItCS0YvRgdC+0LrQuNC1IgorCisjfiBtc2dpZCAiU3ludGgiCisjfiBtc2dzdHIgItCh0LjQvdGC0LXQt9Cw0YLQvtGAIgorCisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICJQQ00iCisKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICLQktC90YPRgtGA0LXQvdC90LjQuSDQtNC40L3QsNC80LjQuiIKKworI34gbXNnaWQgIkxpbmUtaW4iCisjfiBtc2dzdHIgItCb0LjQvdC10LnQvdGL0Lkg0LLRhdC+0LQiCisKKyN+IG1zZ2lkICJDRCIKKyN+IG1zZ3N0ciAiQ0QiCisKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAi0JzQuNC60YjQtdGAIgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIlBDTS0yIgorCisjfiBtc2dpZCAiUmVjb3JkIgorI34gbXNnc3RyICLQl9Cw0L/QuNGB0YwiCisKKyN+IG1zZ2lkICJJbi1nYWluIgorI34gbXNnc3RyICLQo9GB0LjQu9C10L3QuNC1INC90LAg0LLRhdC+0LTQtSIKKworI34gbXNnaWQgIk91dC1nYWluIgorI34gbXNnc3RyICLQo9GB0LjQu9C10L3QuNC1INC90LAg0LLRi9GF0L7QtNC1IgorCisjfiBtc2dpZCAiTGluZS0xIgorI34gbXNnc3RyICLQm9C40L3QtdC50L3Ri9C5LTEiCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgItCb0LjQvdC10LnQvdGL0LktMiIKKworI34gbXNnaWQgIkxpbmUtMyIKKyN+IG1zZ3N0ciAi0JvQuNC90LXQudC90YvQuS0zIgorCisjfiBtc2dpZCAiRGlnaXRhbC0xIgorI34gbXNnc3RyICLQptC40YTRgNC+0LLQvtC5LTEiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTIiCisjfiBtc2dzdHIgItCm0LjRhNGA0L7QstC+0LktMiIKKworI34gbXNnaWQgIkRpZ2l0YWwtMyIKKyN+IG1zZ3N0ciAi0KbQuNGE0YDQvtCy0L7QuS0zIgorCisjfiBtc2dpZCAiUGhvbmUtaW4iCisjfiBtc2dzdHIgItCi0LXQuy4g0LLRhdC+0LQiCisKKyN+IG1zZ2lkICJQaG9uZS1vdXQiCisjfiBtc2dzdHIgItCi0LXQuy4g0LLRi9GF0L7QtCIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICLQktC40LTQtdC+IgorCisjfiBtc2dpZCAiUmFkaW8iCisjfiBtc2dzdHIgItCg0LDQtNC40L4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIgorI34gbXNnc3RyICIiCisjfiAi0J3QtSDRg9C00LDQu9C+0YHRjCDQvtGC0LrRgNGL0YLRjCDQsNGD0LTQuNC+LdGD0YHRgtGA0L7QudGB0YLQstC+INC00LvRjyDQvtCx0YDQsNCx0L7RgtC60Lgg0L/QsNGA0LDQvNC10YLRgNC+0LIg0LzQuNC60YjQtdGA0LAuIgorCisjfiBtc2dpZCAiIgorI34gIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4gVGhpcyB2ZXJzaW9uIG9mICIKKyN+ICJ0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAi0J3QtSDRg9C00LDQu9C+0YHRjCDQvtGC0LrRgNGL0YLRjCDQsNGD0LTQuNC+LdGD0YHRgtGA0L7QudGB0YLQstC+INC00LvRjyDQvtCx0YDQsNCx0L7RgtC60Lgg0L/QsNGA0LDQvNC10YLRgNC+0LIg0LzQuNC60YjQtdGA0LAuICIKKyN+ICLQlNCw0L3QvdCw0Y8g0LLQtdGA0YHQuNGPIE9wZW4gU291bmQgU3lzdGVtINC90LUg0L/QvtC00LTQtdGA0LbQuNCy0LDQtdGC0YHRjyDRjdGC0LjQvCDRjdC70LXQvNC10L3RgtC+0LwuIgorCisjfiBtc2dpZCAiTWFzdGVyIgorI34gbXNnc3RyICLQntCx0YnQuNC5IgorCisjfiBtc2dpZCAiRnJvbnQiCisjfiBtc2dzdHIgItCk0YDQvtC90YLQsNC70YzQvdGL0LUiCisKKyN+IG1zZ2lkICJSZWFyIgorI34gbXNnc3RyICLQotGL0LvQvtCy0YvQtSIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgItCd0LDRg9GI0L3QuNC60LgiCisKKyN+IG1zZ2lkICJDZW50ZXIiCisjfiBtc2dzdHIgItCm0LXQvdGC0YAiCisKKyN+IG1zZ2lkICJMRkUiCisjfiBtc2dzdHIgItCh0LDQsdCy0YPRhNC10YAiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCIKKyN+IG1zZ3N0ciAi0J7QsdGK0ZHQvNC90YvQuSDQt9Cy0YPQuiIKKworI34gbXNnaWQgIlNpZGUiCisjfiBtc2dzdHIgItCR0L7QutC+0LLRi9C1IgorCisjfiBtc2dpZCAiQVVYIE91dCIKKyN+IG1zZ3N0ciAi0JLRi9GF0L7QtCBBVVgiCisKKyN+IG1zZ2lkICIzRCBEZXB0aCIKKyN+IG1zZ3N0ciAiM0Qg0LPQu9GD0LHQuNC90LAiCisKKyN+IG1zZ2lkICIzRCBDZW50ZXIiCisjfiBtc2dzdHIgIjNEINGG0LXQvdGC0YAiCisKKyN+IG1zZ2lkICIzRCBFbmhhbmNlIgorI34gbXNnc3RyICIzRCDRg9C70YPRh9GI0LXQvdC40LUiCisKKyN+IG1zZ2lkICJUZWxlcGhvbmUiCisjfiBtc2dzdHIgItCi0LXQu9C10YTQvtC9IgorCisjfiBtc2dpZCAiVmlkZW8gSW4iCisjfiBtc2dzdHIgItCS0LjQtNC10L4g0LLRhdC+0LQiCisKKyN+IG1zZ2lkICJBVVggSW4iCisjfiBtc2dzdHIgItCS0YXQvtC0IEFVWCIKKworI34gbXNnaWQgIlJlY29yZCBHYWluIgorI34gbXNnc3RyICLQo9GA0L7QstC10L3RjCDQt9Cw0L/QuNGB0LgiCisKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAi0JLRi9GF0L7QtNC90L7QuSDRg9GA0L7QstC10L3RjCIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgQm9vc3QiCisjfiBtc2dzdHIgItCc0LjQutGA0L7RhNC+0L3QvdGL0Lkg0YPRgdC40LvQuNGC0LXQu9GMIgorCisjfiBtc2dpZCAiRGlhZ25vc3RpYyIKKyN+IG1zZ3N0ciAi0JTQuNCw0LPQvdC+0YHRgtC40LrQsCIKKworI34gbXNnaWQgIkJhc3MgQm9vc3QiCisjfiBtc2dzdHIgItCj0YHQuNC70LXQvdC40LUg0LHQsNGB0LAiCisKKyN+IG1zZ2lkICJQbGF5YmFjayBQb3J0cyIKKyN+IG1zZ3N0ciAi0J/QvtGA0YLRiyDQstC+0YHQv9GA0L7QuNC30LLQtdC00LXQvdC40Y8iCisKKyN+IG1zZ2lkICJJbnB1dCIKKyN+IG1zZ3N0ciAi0JLRhdC+0LQiCisKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAi0KPRgdGC0YDQvtC50YHRgtCy0L4g0LLRi9Cy0L7QtNCwIgorCisjfiBtc2dpZCAiS2V5Ym9hcmQgQmVlcCIKKyN+IG1zZ3N0ciAi0J7Qt9Cy0YPRh9C60LAg0LrQu9Cw0LLQuNCw0YLRg9GA0YsiCisKKyN+IG1zZ2lkICJTaW11bGF0ZSBTdGVyZW8iCisjfiBtc2dzdHIgItCY0LzQuNGC0LDRhtC40Y8g0YHRgtC10YDQtdC+IgorCisjfiBtc2dpZCAiU3RlcmVvIgorI34gbXNnc3RyICLQodGC0LXRgNC10L4iCisKKyN+IG1zZ2lkICJTdXJyb3VuZCBTb3VuZCIKKyN+IG1zZ3N0ciAi0J7QsdGK0ZHQvNC90YvQuSDQt9Cy0YPQuiIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKKyN+IG1zZ3N0ciAi0KPRgNC+0LLQtdC90Ywg0LzQuNC60YDQvtGE0L7QvdCwIgorCisjfiBtc2dpZCAiU3BlYWtlciBTb3VyY2UiCisjfiBtc2dzdHIgItCj0YHRgtGA0L7QudGB0YLQstC+INC00LjQvdCw0LzQuNC60LAiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAi0KPRgdGC0YDQvtC50YHRgtCy0L4g0LzQuNC60YDQvtGE0L7QvdCwIgorCisjfiBtc2dpZCAiSmFjayIKKyN+IG1zZ3N0ciAiSmFjayIKKworI34gbXNnaWQgIkNlbnRlciAvIExGRSIKKyN+IG1zZ3N0ciAi0KbQtdC90YLRgCAvINCh0LDQsdCy0YPRhNC10YAiCisKKyN+IG1zZ2lkICJTdGVyZW8gTWl4IgorI34gbXNnc3RyICLQodGC0LXRgNC10L4g0LzQuNC60YjQuNGA0L7QstCw0L3QuNC1IgorCisjfiBtc2dpZCAiTW9ubyBNaXgiCisjfiBtc2dzdHIgItCc0L7QvdC+INC80LjQutGI0LjRgNC+0LLQsNC90LjQtSIKKworI34gbXNnaWQgIklucHV0IE1peCIKKyN+IG1zZ3N0ciAi0JzQuNC60YjQuNGA0L7QstCw0L3QuNC1INCy0YXQvtC00LAiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDEiCisjfiBtc2dzdHIgItCc0LjQutGA0L7RhNC+0L0gMSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAi0JzQuNC60YDQvtGE0L7QvSAyIgorCisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgItCm0LjRhNGA0L7QstC+0Lkg0LLRi9GF0L7QtCIKKworI34gbXNnaWQgIkRpZ2l0YWwgSW4iCisjfiBtc2dzdHIgItCm0LjRhNGA0L7QstC+0Lkg0LLRhdC+0LQiCisKKyN+IG1zZ2lkICJIRE1JIgorI34gbXNnc3RyICJIRE1JIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgItCc0L7QtNC10LwiCisKKyN+IG1zZ2lkICJIYW5kc2V0IgorI34gbXNnc3RyICLQk9Cw0YDQvdC40YLRg9GA0LAiCisKKyN+IG1zZ2lkICJPdGhlciIKKyN+IG1zZ3N0ciAi0JTRgNGD0LPQvtC5IgorCisjfiBtc2dpZCAiTm9uZSIKKyN+IG1zZ3N0ciAi0J3QuNGH0LXQs9C+IgorCisjfiBtc2dpZCAiT24iCisjfiBtc2dzdHIgItCS0LrQuyIKKworI34gbXNnaWQgIk9mZiIKKyN+IG1zZ3N0ciAi0JLRi9C60LsiCisKKyN+IG1zZ2lkICJNdXRlIgorI34gbXNnc3RyICLQl9Cw0LPQu9GD0YjQuNGC0YwiCisKKyN+IG1zZ2lkICJGYXN0IgorI34gbXNnc3RyICLQodC60L7RgNC+0YHRgtGMIgorCisjfiBtc2dpZCAiVmVyeSBMb3ciCisjfiBtc2dzdHIgItCe0YfQtdC90Ywg0L3QuNC30LrQvtC1IgorCisjfiBtc2dpZCAiTG93IgorI34gbXNnc3RyICLQndC40LfQutC+0LUiCisKKyN+IG1zZ2lkICJNZWRpdW0iCisjfiBtc2dzdHIgItCh0YDQtdC00L3QtdC1IgorCisjfiBtc2dpZCAiSGlnaCIKKyN+IG1zZ3N0ciAi0JLRi9GB0L7QutC+0LUiCisKKyN+IG1zZ2lkICJWZXJ5IEhpZ2giCisjfiBtc2dzdHIgItCe0YfQtdC90Ywg0LLRi9GB0L7QutC+0LUiCisKKyN+IG1zZ2lkICJQcm9kdWN0aW9uIgorI34gbXNnc3RyICLQktGL0LTQsNGH0LAiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICLQnNC40LrRgNC+0YTQvtC9INC90LAg0L/QtdGA0LXQtNC90LXQuSDQv9Cw0L3QtdC70LgiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIEluIgorI34gbXNnc3RyICLQm9C40L3QtdC50L3Ri9C5INCy0YXQvtC0INC90LAg0L/QtdGA0LXQtNC90LXQuSDQv9Cw0L3QtdC70LgiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBIZWFkcGhvbmVzIgorI34gbXNnc3RyICLQndCw0YPRiNC90LjQutC4INC90LAg0L/QtdGA0LXQtNC90LXQuSDQv9Cw0L3QtdC70LgiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIE91dCIKKyN+IG1zZ3N0ciAi0JvQuNC90LXQudC90YvQuSDQstGL0YXQvtC0INC90LAg0L/QtdGA0LXQtNC90LXQuSDQv9Cw0L3QtdC70LgiCisKKyN+IG1zZ2lkICJHcmVlbiBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCX0LXQu9GR0L3Ri9C5INGA0LDQt9GK0ZHQvCIKKworI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICLQoNC+0LfQvtCy0YvQuSDRgNCw0LfRitGR0LwiCisKKyN+IG1zZ2lkICJCbHVlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi0KHQuNC90LjQuSDRgNCw0LfRitGR0LwiCisKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCR0LXQu9GL0Lkg0YDQsNC30YrRkdC8IgorCisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICLQp9GR0YDQvdGL0Lkg0YDQsNC30YrRkdC8IgorCisjfiBtc2dpZCAiR3JheSBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCh0LXRgNGL0Lkg0YDQsNC30YrRkdC8IgorCisjfiBtc2dpZCAiT3JhbmdlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi0J7RgNCw0L3QttC10LLRi9C5INGA0LDQt9GK0ZHQvCIKKworI34gbXNnaWQgIlJlZCBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCa0YDQsNGB0L3Ri9C5INGA0LDQt9GK0ZHQvCIKKworI34gbXNnaWQgIlllbGxvdyBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCW0ZHQu9GC0YvQuSDRgNCw0LfRitGR0LwiCisKKyN+IG1zZ2lkICJHcmVlbiBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCX0LXQu9GR0L3Ri9C5INGA0LDQt9GK0ZHQvCDQvdCwINC/0LXRgNC10LTQvdC10Lkg0L/QsNC90LXQu9C4IgorCisjfiBtc2dpZCAiUGluayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCg0L7Qt9C+0LLRi9C5INGA0LDQt9GK0ZHQvCDQvdCwINC/0LXRgNC10LTQvdC10Lkg0L/QsNC90LXQu9C4IgorCisjfiBtc2dpZCAiQmx1ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCh0LjQvdC40Lkg0YDQsNC30YrRkdC8INC90LAg0L/QtdGA0LXQtNC90LXQuSDQv9Cw0L3QtdC70LgiCisKKyN+IG1zZ2lkICJXaGl0ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCR0LXQu9GL0Lkg0YDQsNC30YrRkdC8INC90LAg0L/QtdGA0LXQtNC90LXQuSDQv9Cw0L3QtdC70LgiCisKKyN+IG1zZ2lkICJCbGFjayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCn0ZHRgNC90YvQuSDRgNCw0LfRitGR0Lwg0L3QsCDQv9C10YDQtdC00L3QtdC5INC/0LDQvdC10LvQuCIKKworI34gbXNnaWQgIkdyYXkgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLQodC10YDRi9C5INGA0LDQt9GK0ZHQvCDQvdCwINC/0LXRgNC10LTQvdC10Lkg0L/QsNC90LXQu9C4IgorCisjfiBtc2dpZCAiT3JhbmdlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi0J7RgNCw0L3QttC10LLRi9C5INGA0LDQt9GK0ZHQvCDQvdCwINC/0LXRgNC10LTQvdC10Lkg0L/QsNC90LXQu9C4IgorCisjfiBtc2dpZCAiUmVkIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi0JrRgNCw0YHQvdGL0Lkg0YDQsNC30YrRkdC8INC90LAg0L/QtdGA0LXQtNC90LXQuSDQv9Cw0L3QtdC70LgiCisKKyN+IG1zZ2lkICJZZWxsb3cgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLQltGR0LvRgtGL0Lkg0YDQsNC30YrRkdC8INC90LAg0L/QtdGA0LXQtNC90LXQuSDQv9Cw0L3QtdC70LgiCisKKyN+IG1zZ2lkICJTcHJlYWQgT3V0cHV0IgorI34gbXNnc3RyICLQoNCw0LfQstGR0YDQvdGD0YLRi9C5INCy0YvQstC+0LQiCisKKyN+IG1zZ2lkICJEb3dubWl4IgorI34gbXNnc3RyICLQndC40LfQstC10LTQtdC90LjQtSIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgSW5wdXQiCisjfiBtc2dzdHIgItCS0YXQvtC0INCy0LjRgNGC0YPQsNC70YzQvdC+0LPQviDQvNC40LrRiNC10YDQsCIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgT3V0cHV0IgorI34gbXNnc3RyICLQktGL0YXQvtC0INCy0LjRgNGC0YPQsNC70YzQvdC+0LPQviDQvNC40LrRiNC10YDQsCIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgQ2hhbm5lbHMiCisjfiBtc2dzdHIgItCa0LDQvdCw0LvRiyDQstC40YDRgtGD0LDQu9GM0L3QvtCz0L4g0LzQuNC60YjQtdGA0LAiCisKKyN+IG1zZ2lkICIlcyAlZCBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAi0KTRg9C90LrRhtC40Y8gJXMgJWQiCisKKyN+IG1zZ2lkICIlcyBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAi0KTRg9C90LrRhtC40Y8gJXMiCisKKyN+IG1zZ2lkICJHb3QgdW5leHBlY3RlZCBmcmFtZSBzaXplIG9mICV1IGluc3RlYWQgb2YgJXUuIgorI34gbXNnc3RyICLQn9C+0LvRg9GH0LXQvSDQvdC10L7QttC40LTQsNC90L3Ri9C5INGA0LDQt9C80LXRgCDQutCw0LTRgNCwOiAldSDQstC80LXRgdGC0L4gJXUuIgorCisjfiBtc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBvbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgItCe0YjQuNCx0LrQsCDRh9GC0LXQvdC40Y8gJWQg0LHQsNC50YIg0LjQtyDRg9GB0YLRgNC+0LnRgdGC0LLQsCDCqyVzwrsuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0LTQvtCx0LDQstC40YLRjCDQsiDQvtGH0LXRgNC10LTRjCDQsdGD0YTQtdGA0Ysg0YPRgdGC0YDQvtC50YHRgtCy0LAgwqslc8K7IgorCisjfiBtc2dpZCAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLQntGI0LjQsdC60LAg0L/RgNC4INC/0L7Qv9GL0YLQutC1INC/0L7Qu9GD0YfQtdC90LjRjyDQutCw0LTRgNC+0LIg0LLQuNC00LXQviDRgSDRg9GB0YLRgNC+0LnRgdGC0LLQsCDCqyVzwrsuIgorCisjfiBtc2dpZCAiRmFpbGVkIGFmdGVyICVkIHRyaWVzLiBkZXZpY2UgJXMuIHN5c3RlbSBlcnJvcjogJXMiCisjfiBtc2dzdHIgItCe0YjQuNCx0LrQsCDQv9C+0YHQu9C1ICVkINC/0L7Qv9GL0YLQvtC6LiDQo9GB0YLRgNC+0LnRgdGC0LLQvjogJXMuINCh0LjRgdGC0LXQvNC90LDRjyDQvtGI0LjQsdC60LA6ICVzIgorCisjfiBtc2dpZCAiIgorI34gIlRoZSBidWZmZXIgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLCBvciB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcywgb3Igbm8gIgorI34gImJ1ZmZlcnMgaGF2ZSBiZWVuIGFsbG9jYXRlZCB5ZXQsIG9yIHRoZSB1c2VycHRyIG9yIGxlbmd0aCBhcmUgaW52YWxpZC4gIgorI34gImRldmljZSAlcyIKKyN+IG1zZ3N0ciAiIgorI34gItCd0LXQv9C+0LTQtNC10YDQttC40LLQsNC10LzRi9C5INGC0LjQvyDQsdGD0YTQtdGA0LAsINC70LjQsdC+INC40L3QtNC10LrRgSDQstC90LUg0LTQuNCw0L/QsNC30L7QvdCwLCDQu9C40LHQviDQsdGD0YTQtdGA0Ysg0L3QtSAiCisjfiAi0LHRi9C70Lgg0YDQsNGB0L/RgNC10LTQtdC70LXQvdGLLCDQu9C40LHQviDQvdC10LLQtdGA0L3Ri9C1INC30L3QsNGH0LXQvdC40Y8g0LTQu9C40L3RiyDQuNC70LggdXNlcnB0ciAo0YPRgdGC0YDQvtC50YHRgtCy0L4gIgorI34gIiVzKSIKKworI34gbXNnaWQgIiIKKyN+ICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4gTm90IGVub3VnaCBtZW1vcnkuIgorI34gbXNnc3RyICIiCisjfiAi0J7RiNC40LHQutCwINC/0YDQuCDQv9C+0L/Ri9GC0LrQtSDQv9C+0LvRg9GH0LXQvdC40Y8g0LrQsNC00YDQvtCyINCy0LjQtNC10L4g0YEg0YPRgdGC0YDQvtC50YHRgtCy0LAgwqslc8K7LiDQndC1INGF0LLQsNGC0LDQtdGCICIKKyN+ICLQv9Cw0LzRj9GC0LguIgorCisjfiBtc2dpZCAiaW5zdWZmaWNpZW50IG1lbW9yeSB0byBlbnF1ZXVlIGEgdXNlciBwb2ludGVyIGJ1ZmZlci4gZGV2aWNlICVzLiIKKyN+IG1zZ3N0ciAiIgorI34gItC90LUg0YXQstCw0YLQsNC10YIg0L/QsNC80Y/RgtC4INC00LvRjyDQv9C+0YHRgtCw0L3QvtCy0LrQuCDQsiDQvtGH0LXRgNC10LTRjCDQsdGD0YTQtdGA0LAg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC+0LPQviAiCisjfiAi0YPQutCw0LfQsNGC0LXQu9GPICjRg9GB0YLRgNC+0LnRgdGC0LLQviAlcykiCisKKyN+IG1zZ2lkICJObyBmcmVlIGJ1ZmZlcnMgZm91bmQgaW4gdGhlIHBvb2wgYXQgaW5kZXggJWQuIgorI34gbXNnc3RyICLQkiDQv9GD0LvQtSDQvdC1INC90LDQudC00LXQvdC+INGB0LLQvtCx0L7QtNC90YvRhSDQsdGD0YTQtdGA0L7QsiDQtNC70Y8g0LjQvdC00LXQutGB0LAgJWQuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGdldCBidWZmZXJzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINC/0L7Qu9GD0YfQuNGC0Ywg0LHRg9GE0LXRgNGLINGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuyIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBnZXQgZW5vdWdoIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0L/QvtC70YPRh9C40YLRjCDQvdC10L7QsdGF0L7QtNC40LzQvtC1INC60L7Qu9C40YfQtdGB0YLQstC+INCx0YPRhNC10YDQvtCyINGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuyIKKworI34gbXNnaWQgIkVycm9yIHN0YXJ0aW5nIHN0cmVhbWluZyBjYXB0dXJlIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLQntGI0LjQsdC60LAg0L/RgNC4INC30LDQv9GD0YHQutC1INC/0L7RgtC+0LrQvtCy0L7Qs9C+INC30LDRhdCy0LDRgtCwINGBINGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuy4iCisKKyN+IG1zZ2lkICJFcnJvciBzdG9wcGluZyBzdHJlYW1pbmcgY2FwdHVyZSBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAi0J7RiNC40LHQutCwINC/0YDQuCDQvtGB0YLQsNC90L7QstC60LUg0L/QvtGC0L7QutC+0LLQvtCz0L4g0LfQsNGF0LLQsNGC0LAg0YEg0YPRgdGC0YDQvtC50YHRgtCy0LAgwqslc8K7LiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCByZWFkIGZyb20gQ0QuIgorI34gbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINC/0YDQvtGH0LjRgtCw0YLRjCBDRC4iCisKKyN+IG1zZ2lkICJEaXNjIGlzIG5vdCBhbiBBdWRpbyBDRC4iCisjfiBtc2dzdHIgItCU0LjRgdC6INC90LUg0Y/QstC70Y/QtdGC0YHRjyDQsNGD0LTQuNC+LUNELiIKKworI34gbXNnaWQgIlRoaXMgZmlsZSBpcyBlbmNyeXB0ZWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorI34gbXNnc3RyICLQpNCw0LnQuyDQt9Cw0YjQuNGE0YDQvtCy0LDQvSDQuCDQvdC1INC80L7QttC10YIg0LHRi9GC0Ywg0LLQvtGB0L/RgNC+0LjQt9Cy0LXQtNGR0L0uIgorCisjfiBtc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzLiciCisjfiBtc2dzdHIgItCe0YjQuNCx0LrQsCDQv9C+0LvRg9GH0LXQvdC40Y8g0LDRgtGA0LjQsdGD0YLQvtCyINGD0L/RgNCw0LLQu9C10L3QuNGPINGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuy4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgc2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCisjfiBtc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0YPRgdGC0LDQvdC+0LLQuNGC0Ywg0L/QsNGA0LDQvNC10YLRgNGLINGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuyIKKworI34gbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkLyVkIGZyYW1lcyBwZXIgc2Vjb25kIgorI34gbXNnc3RyICIiCisjfiAi0KPRgdGC0YDQvtC50YHRgtCy0L4gwqslc8K7INC90LUg0LzQvtC20LXRgiDQvtGB0YPRidC10YHRgtCy0LjRgtGMINC30LDRhdCy0LDRgiDQv9GA0LggJWQvJWQg0LrQsNC00YDQsNGFINCyINGB0LXQutGD0L3QtNGDIgpkaWZmIC0tZ2l0IGEvcG8vc2sucG8gYi9wby9zay5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGY3ZGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcG8vc2sucG8KQEAgLTAsMCArMSw5MjUgQEAKKyMgU2xvdmFrIHRyYW5zbGF0aW9ucyBmb3IgZ3N0LXBsdWdpbnMtZ29vZC4KKyMgVGhpcyBmaWxlIGlzIHB1dCBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMKKyMgUGV0ZXIgVHVow6Fyc2t5IDx0dWhhcnNreUBtaXNiYi5zaz4sIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTQsIDIwMTYuCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kIDEuNy4yXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTYtMDUtMjAgMTI6MzErMDEwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogUGV0ZXIgVHVow6Fyc2t5IDx0dWhhcnNreUBtaXNiYi5zaz5cbiIKKyJMYW5ndWFnZS1UZWFtOiBTbG92YWsgPHNrLWkxOG5AbGlzdHMubGludXguc2s+XG4iCisiTGFuZ3VhZ2U6IHNrXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0zOyBwbHVyYWw9KG49PTEpID8gMCA6IChuPj0yICYmIG48PTQpID8gMSA6IDI7XFxuO1xuIgorIlgtR2VuZXJhdG9yOiBQb2VkaXQgMS42LjEwXG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIkphY2sgc2VydmVyIHNhIG5lbmHFoWllbCIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiTmVwb2RhcmlsbyBzYSBkZWvDs2RvdmHFpSBvYnLDoXpvayBKUEVHIgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICInJXMnIG9kICclcyciCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIk5lcG9kYXJpbG8gc2EgcHJpcG9qacWlIGsgc2VydmVydSIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJOZWJvbG8gbmFzdGF2ZW7DqSBVUkwuIgorCittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJOZXBvZGFyaWxvIHNhIHByZWxvxb5pxaUgbsOhem92IHNlcnZlcmEuIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIk5lcG9kYXJpbG8gc2EgbmFkdmlhemHFpSBzcG9qZW5pZSBzbyBzZXJ2ZXJvbS4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICJOYXN0YXZlbmllIGJlenBlxI1uw6lobyBwcmlwb2plbmlhIHpseWhhbG8uIgorCittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiVnlza3l0bGEgc2Egc2llxaVvdsOhIGNoeWJhLCBhbGVibyBzZXJ2ZXIgbmXEjWFrYW5lIHV6YXZyZWwgc3BvamVuaWUuIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICJTZXJ2ZXIgb2Rvc2xhbCBjaHlibsOpIMO6ZGFqZS4iCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiU2VydmVyIG5lcG9kcG9ydWplIHptZW51IHBvesOtY2llIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICLFvWlhZG55IGFsZWJvIGNoeWJuw70gdnN0dXAgenZ1a3UsIHByw7pkIMO6ZGFqb3YgQVZJIGJ1ZGUgcG/FoWtvZGVuw70uIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJUZW50byBzw7pib3IgbmVvYnNhaHVqZSDFvmlhZG5lIHByZWhyYXRlxL5uw6kgcHLDumR5IMO6ZGFqb3YuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJUZW50byBzw7pib3IgamUgY2h5Ym7DvSBhIG5lZMOhIHNhIHByZWhyYcWlLiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICIiCisiUHLDumQgw7pkYWpvdiBzYSBuZWTDoSBwcmVocmHFpSBwcmV0b8W+ZSBqZSDFoWlmcm92YW7DvSBwb21vY291IFBsYXlSZWFkeSBEUk0uIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJUZW50byBzw7pib3IgamUgcG/FoWtvZGVuw70gYSBuZWTDoSBzYSBwcmVocmHFpS4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIk5lc3Byw6F2bmEgYXRvbWlja8OhIHZlxL5rb3PFpS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIlRlbnRvIHPDumJvciBqZSBuZcO6cGxuw70gYSBuZWTDoSBzYSBwcmVocmHFpS4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIlZpZGVvIHYgdG9tdG8gc8O6Ym9yZSBtb8W+bm8gbmVidWRlIGhyYcWlIGtvcmVrdG5lLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICJUZW50byBzw7pib3Igb2JzYWh1amUgcHLDrWxpxaEgbW5vaG8gcHLDumRvdiDDumRham92LiBQcmVocsOhdmFtIGliYSBwcnbDvSAlZCIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisiTmVuYcWhaWVsIHNhIMW+aWFkZW4gcG9kcG9yb3ZhbsO9IHByw7pkIMO6ZGFqb3YuIE1vxb5ubyBqZSBwb3RyZWJuw6kgbmFpbsWhdGFsb3ZhxaUgIgorInrDoXN1dm7DvSBtb2R1bCBHU3RyZWFtZXIgUlRTUCBwcmUgcHLDumR5IFJlYWwgbWVkaWEuLiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorIk5lbmHFoWllbCBzYSDFvmlhZGVuIHBvZHBvcm92YW7DvSBwcsO6ZCDDumRham92LiBNb8W+bm8gYnkgc3RlIG1hbGkgcG92b2xpxaUgIgorInZpYWNlcm8gcHJlbm9zb3bDvWNoIHByb3Rva29sb3YsIGFsZWJvIHbDoW0gbW/Fvm5vIGNow71iYSBzcHLDoXZueSB6w6FzdXZuw70gbW9kdWwgIgorIkdTdHJlYW1lciBSVFNQLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKyJOZXBvZGFyaWxvIHNhIG90dm9yacWlIHp2dWtvdsOpIHphcmlhZGVuaWUgdiByZcW+aW1lIHByZWhyw6F2YW5pYS4gWmFyaWFkZW5pZSB1xb4gIgorInBvdcW+w612YSBpbsOhIGFwbGlrw6FjaWEuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJOZXBvZGFyaWxvIHNhIG90dm9yacWlIHp2dWtvdsOpIHphcmlhZGVuaWUgdiByZcW+aW1lIHByZWhyw6F2YW5pYS4gTmVtw6F0ZSAiCisib3Byw6F2bmVuaWUgbmEgb3R2b3JlbmllIHRvaHRvIHphcmlhZGVuaWEuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIk5lcG9kYXJpbG8gc2Egb3R2b3JpxaUgenZ1a292w6kgemFyaWFkZW5pZSB2cmXFvmltZSBwcmVocsOhdmFuaWEuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIk5lcG9kYXJpbG8gc2Egb3R2b3JpxaUgenZ1a292w6kgemFyaWFkZW5pZSB2IHJlxb5pbWUgcHJlaHLDoXZhbmlhLiBUZW50byBwcnZvayAiCisibmVwb2Rwb3J1amUgdMO6dG8gdmVyeml1IE9wZW4gU291bmQgU3lzdGVtLiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJUb3RvIHp2dWtvdsOpIHphcmlhZGVuaWUgbmVwb2Rwb3J1amUgcHJlaHLDoXZhbmllLiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAiQ2h5YmEgcHJlaHLDoXZhbmlhIHp2dWt1LiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiVG90byB6dnVrb3bDqSB6YXJpYWRlbmllIG5lcG9kcG9ydWplIG5haHLDoXZhbmllLiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkNoeWJhIHByaSBuYWhyw6F2YW7DrSB6byB6dnVrb3bDqWhvIHphcmlhZGVuaWEuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiTmVwb2RhcmlsbyBzYSBvdHZvcmnFpSB6dnVrb3bDqSB6YXJpYWRlbmllIHYgcmXFvmltZSBuYWhyw6F2YW5pYS4gTmVtw6F0ZSAiCisib3Byw6F2bmVuaWUgbmEgb3R2b3JlbmllIHRvaHRvIHphcmlhZGVuaWEuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICJOZXBvZGFyaWxvIHNhIG90dm9yacWlIHp2dWtvdsOpIHphcmlhZGVuaWUgdiByZcW+aW1lIG5haHLDoXZhbmlhLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIiIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIlpkcm9qIHrDoXpuYW11IgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWlrcm9mw7NuIgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAiTGlua292w70gdnN0dXAiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiVm7DunRvcm5lIENEIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIlNQRElGIHZzdHVwIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIkFVWCAxIHZzdHVwIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIkFVWCAyIHZzdHVwIgorCittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIlNww6R0bsOhIHNsdcSNa2Ega29kZWt1IgorCittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICJTcMOkdG7DoSBzbHXEjWthIFN1blZUUyIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiSGxhc2l0b3PFpSIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIlppc2siCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJNb25pdG9yIgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiUEMgcmVwcm9kdWt0b3IiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIlNsw7pjaGFkbMOhIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIkxpbmtvdsO9IHbDvXN0dXAiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIlNQRElGIHbDvXN0dXAiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIkFVWCAxIHbDvXN0dXAiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIkFVWCAyIHbDvXN0dXAiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQ2h5YmEgcHJpIMSNw610YW7DrSAlZCBiYWp0b3Ygem8gemFyaWFkZW5pYSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorIk5lcG9kYXJpbG8gc2EgemlzdGnFpSBtb8W+bsOpIHZpZGVvIGZvcm3DoXR5IHMga3RvcsO9bWkgYnkgdmVkZWxvIHByYWNvdmHFpSAiCisiemFyaWFkZW5pZSAnJXMnIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICJOZXBvZGFyaWxvIHNhIG5hbWFwb3ZhxaUgdnlyb3Zuw6F2YWNpdSBwYW3DpMWlIHphcmlhZGVuaWEgJyVzJyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAiVGVudG8gb3Zsw6FkYcSNIHphcmlhZGVuaWEgJyVzJyBuZXBvZHBvcnVqZSBJTyBtZXTDs2R1ICVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAiVGVudG8gb3Zsw6FkYcSNIHphcmlhZGVuaWEgJyVzJyBuZXBvZHBvcnVqZSDFvmlhZG51IHpuw6FtdSBJTyBtZXTDs2R1LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICJaYXJpYWRlbmllICclcycgamUgemFuZXByw6F6ZG5lbsOpIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICJaYXJpYWRlbmllICclcycgbmV2aWUgbmFocsOhdmHFpSBuYSAlZHglZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiWmFyaWFkZW5pZSAnJXMnIG5lZG9rw6HFvmUgbmFocsOhdmHFpSB2IHV2ZWRlbm9tIGZvcm3DoXRlIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIlphcmlhZGVuaWUgJyVzJyBwb2Rwb3J1amUgbmVzcG9qaXTDqSByb3ZpbnkiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICJOZXBvZGFyaWxvIHNhIHrDrXNrYcWlIHBhcmFtZXRyZSB6YXJpYWRlbmlhICclcyciCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIlZpZGVvIHphcmlhZGVuaWUgb2RtaWV0bG8gbm92w6kgbmFzdGF2ZW5pZSBmcmVrdmVuY2llIHNuw61tb2suIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiaWRlbyB6YXJpYWRlbmllIG5lcG9za3l0bG8gdsO9c3R1cG7DvSBmb3Jtw6F0LiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICJWaWRlbyB6YXJpYWRlbmllIHVkw6F2YSBuZXNwcsOhdm5lIHJvem1lcnkuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIlZpZGVvIHphcmlhZGVuaWUgcG91xb7DrXZhIG5lcG9kcG9yb3ZhbsO6IG1ldMOzZHUgcHJla2xhZGFuaWEgc27DrW1vay4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiVmlkZW8gemFyaWFkZW5pZSBwb3XFvsOtdmEgbmVwb2Rwb3JvdmFuw70gZm9ybcOhdCBwaXhlbG92LiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICJOZXBvZGFyaWxvIHNhIG5hc3RhdmnFpSB2bsO6dG9ybsO6IG9ibGFzxaUgdnlyb3Zuw6F2YWNlaiBwYW3DpHRlLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiVmlkZW8gemFyaWFkZW5pZSBuZW9kcG9ydcSNaWxvIMW+aWFkbnUgdmXEvmtvc8WlIHZ5cm92bsOhdmFjZWogcGFtw6R0ZS4iCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5lcG9kYXJpbG8gc2EgesOtc2thxaUgbmFzdGF2ZW5pZSBwcmlqw61tYcSNYSAlZCBvZCB6YXJpYWRlbmlhICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkNoeWJhIHByaSBuYcSNw610YW7DrSBtb8W+bm9zdMOtIHphcmlhZGVuYSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIlphcmlhZGVuaWUgJyVzJyBuaWUgamUgcHJpasOtbWHEjS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJOZXBvZGFyaWxvIHNhIHrDrXNrYcWlIHJvemhsYXNvdsO9IHZzdHVwIG5hIHphcmlhZGVuw60gJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJOZXBvZGFyaWxvIHNhIG5hc3RhdmnFpSB2c3R1cCAlZCBuYSB6YXJpYWRlbsOtICVzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmVwb2RhcmlsbyBzYSB6bWVuacWlIHN0YXYgc3RsbWVuaWEgcHJlIHphcmlhZGVuaWUgJyVzJy4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIk5lcG9kYXJpbG8gc2EgdXZvxL5uacWlIGRvc3RhdG9rIHBhbcOkdGUuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIk5lcG9kYXJpbG8gc2EgdXZvxL5uacWlIGRvc3RhdG9rIHBhbcOkdGUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIktvbnZlcnRvciBuYSB6YXJpYWRlbsOtICVzIG5lcG9kcG9ydWplIMW+aWFkbnkgdnN0dXBuw70gZm9ybcOhdCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiS29udmVydG9yIG5hIHphcmlhZGVuw60gJXMgbmVwb2Rwb3J1amUgxb5pYWRueSB2w71zdHVwbsO9IGZvcm3DoXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIkVua29kw6lyIG5hIHphcmlhZGVuw60gJXMgbmVwb2Rwb3J1amUgxb5pYWRueSB2c3R1cG7DvSBmb3Jtw6F0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiRW5rb2TDqXIgbmEgemFyaWFkZW7DrSAlcyBuZXBvZHBvcnVqZSDFvmlhZG55IHbDvXN0dXBuw70gZm9ybcOhdCIKKworbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICJOZXBvZGFyaWxvIHNhIHNwdXN0acWlIGRla8OzZG92YWNpZSB2bMOha25vLiIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiTmVwb2RhcmlsbyBzYSBzcHJhY292YcWlIHNuw61tb2suIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorIkNoeWJhIHByaSB6aXPFpW92YW7DrSBzY2hvcG5vc3TDrSB6YXJpYWRlbmlhICclcyc6IFRvdG8gbmllIGplIG92bMOhZGHEjSB2NGwyLiAiCisiU2tvbnRyb2x1anRlLCDEjWkgamUgdG8gb3Zsw6FkYcSNIHY0bDEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiTmVwb2RhcmlsbyBzYSB6w61za2HFpSBhdHJpYsO6dHkgdnN0dXB1ICVkIHphcmlhZGVuaWEgJXMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmVwb2RhcmlsbyBzYSB6w61za2HFpSBuYXN0YXZlbmllIHByaWrDrW1hxI1hICVkIG9kIHphcmlhZGVuaWEgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICJabHloYWxhIHBvxb5pYWRhdmthIG5vcm0gbmEgemFyaWFkZW7DrSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmVwb2RhcmlsbyBzYSB6w61za2HFpSBhdHJpYsO6dHkgb3Zsw6FkYWPDrWNoIHBydmtvdiBuYSB6YXJpYWRlbsOtICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5ldmllbSBpZGVudGlmaWtvdmHFpSB6YXJpYWRlbmllICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlRvdG8gbmllIGplIHphcmlhZGVuaWUgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJOZXBvZGFyaWxvIHNhIG90dm9yacWlIHphcmlhZGVuaWUgJyVzJyBwcmUgxI3DrXRhbmllIGEgesOhcGlzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIlphcmlhZGVuaWUgJyVzJyBuaWUgamUgdXLEjWVuw6kgcHJlIG5haHLDoXZhbmllLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiWmFyaWFkZW5pZSAnJXMnIG5pZSBqZSB1csSNZW7DqSBwcmUgdsO9c3R1cC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgTTJNIGRldmljZS4iCittc2dzdHIgIlphcmlhZGVuaWUgJyVzJyBuaWUgamUgdHlwdSBNMk0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJOZXBvZGFyaWxvIHNhIG90dm9yacWlIHphcmlhZGVuaWUgJyVzJyBwcmUgxI3DrXRhbmllIGEgesOhcGlzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiWmx5aGFsbyBuYXN0YXZlbmllIG5vcm0gbmEgemFyaWFkZW7DrSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5lcG9kYXJpbG8gc2EgemlzdGnFpSBzw7rEjWFzbsO6IGZyZWt2ZW5jaXUgcHJpasOtbWHEjWEgcHJlIHphcmlhZGVuaWUgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorIk5lcG9kYXJpbG8gc2EgbmFzdGF2acWlIHPDusSNYXNuw7ogZnJla3ZlbmNpdSBwcmlqw61tYcSNYSBwcmUgemFyaWFkZW5pZSAnJXMnIG5hICIKKyIlbHUgSHouIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5lcG9kYXJpbG8gc2EgemlzdGnFpSBzaWx1IHNpZ27DoWx1IHByZSB6YXJpYWRlbmllICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiTmVwb2RhcmlsbyBzYSB6aXN0acWlIGhvZG5vdHUgcHJlIG92bMOhZGFjw60gcHJ2b2sgJWQgcHJlIHphcmlhZGVuaWUgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJOZXBvZGFyaWxvIHNhIG5hc3RhdmnFpSBob2Rub3R1ICVkIHByZSBvdmzDoWRhY8OtIHBydm9rICVkIG5hIHphcmlhZGVuw60gJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJOZXBvZGFyaWxvIHNhIHppc3RpxaUgc8O6xI1hc27DvSB2c3R1cCBuYSB6YXJpYWRlbsOtICclcycuIE1vxb5ubyBqZSB0byByw6FkaW8uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJOZXBvZGFyaWxvIHNhIHppc3RpxaUgc8O6xI1hc27DvSB2w71zdHVwIG5hIHphcmlhZGVuw60gJyVzJy4gTW/Fvm5vIGplIHRvIHLDoWRpby4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiTmVwb2RhcmlsbyBzYSBuYXN0YXZpxaUgdsO9c3R1cCAlZCBuYSB6YXJpYWRlbsOtICVzLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIlptZW5hIHJvemzDrcWhZW5pYSB6YSBjaG9kdSBuaWUgamUgemF0aWHEviBwb2Rwb3JvdmFuw6EuIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICJOZW3DtMW+ZW0gZnVuZ292YcWlIGJleiBob2TDrW4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIlZuw7p0b3Juw6EgY2h5YmEgcHLDumR1IMO6ZGFqb3YuIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAiVm7DunRvcm7DoSBjaHliYSB0b2t1IMO6ZGFqb3YuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNvdW5kIHNlcnZlciIKKyN+IG1zZ3N0ciAiTmVwb2RhcmlsbyBzYSBuYWR2aWF6YcWlIHNwb2plbmllIHNvIHp2dWtvdsO9bSBzZXJ2ZXJvbSIKKworI34gbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBzb3VuZCBzZXJ2ZXIgY2FwYWJpbGl0aWVzIgorI34gbXNnc3RyICJOZXBvZGFyaWxvIHNhIHppc3RpxaUgc2Nob3Bub3N0aSB6dnVrb3bDqWhvIHNlcnZlcmEiCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICJCYXN5IgorCisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICJWw73FoWt5IgorCisjfiBtc2dpZCAiU3ludGgiCisjfiBtc2dzdHIgIlN5bnRldGl6w6lyIgorCisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICJQQ00iCisKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICJSZXByb2R1a3RvciIKKworI34gbXNnaWQgIkxpbmUtaW4iCisjfiBtc2dzdHIgIkxpbmtvdsO9IHZzdHVwIgorCisjfiBtc2dpZCAiQ0QiCisjfiBtc2dzdHIgIkNEIgorCisjfiBtc2dpZCAiTWl4ZXIiCisjfiBtc2dzdHIgIk1peMOpciIKKworI34gbXNnaWQgIlBDTS0yIgorI34gbXNnc3RyICJQQ00tMiIKKworI34gbXNnaWQgIlJlY29yZCIKKyN+IG1zZ3N0ciAiTmFocsOhdmFuaWUiCisKKyN+IG1zZ2lkICJJbi1nYWluIgorI34gbXNnc3RyICJWc3R1cG7DvSB6aXNrIgorCisjfiBtc2dpZCAiT3V0LWdhaW4iCisjfiBtc2dzdHIgIlbDvXN0dXBuw70gemlzayIKKworI34gbXNnaWQgIkxpbmUtMSIKKyN+IG1zZ3N0ciAiTGlua2EtMSIKKworI34gbXNnaWQgIkxpbmUtMiIKKyN+IG1zZ3N0ciAiTGlua2EtMiIKKworI34gbXNnaWQgIkxpbmUtMyIKKyN+IG1zZ3N0ciAiTGlua2EtMyIKKworI34gbXNnaWQgIkRpZ2l0YWwtMSIKKyN+IG1zZ3N0ciAiRGlnaXTDoWwtMSIKKworI34gbXNnaWQgIkRpZ2l0YWwtMiIKKyN+IG1zZ3N0ciAiRGlnaXTDoWwtMiIKKworI34gbXNnaWQgIkRpZ2l0YWwtMyIKKyN+IG1zZ3N0ciAiRGlnaXTDoWwtMyIKKworI34gbXNnaWQgIlBob25lLWluIgorI34gbXNnc3RyICJUZWxlZsOzbi12c3R1cCIKKworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAiVGVsZWbDs24tdsO9c3R1cCIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICJWaWRlbyIKKworI34gbXNnaWQgIlJhZGlvIgorI34gbXNnc3RyICJSw6FkaW8iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIgorI34gbXNnc3RyICJOZXBvZGFyaWxvIHNhIG90dm9yacWlIHp2dWtvdsOpIHphcmlhZGVuaWUgdiByZcW+aW1lIG9ic2x1aHkgbWl4w6lydS4iCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJOZXBvZGFyaWxvIHNhIG90dm9yacWlIHp2dWtvdsOpIHphcmlhZGVuaWUgdiByZcW+aW1lIG9ic2x1aHkgbWl4w6lydS4gVMOhdG8gIgorI34gInZlcnppYSBPcGVuIFNvdW5kIFN5c3RlbSBuaWUgamUgcG9kcG9yb3ZhbsOhIHTDvW10byBwcnZrb20uIgorCisjfiBtc2dpZCAiTWFzdGVyIgorI34gbXNnc3RyICJIbGF2bsO9IgorCisjfiBtc2dpZCAiRnJvbnQiCisjfiBtc2dzdHIgIlByZWRuw70iCisKKyN+IG1zZ2lkICJSZWFyIgorI34gbXNnc3RyICJaYWRuw6kiCisKKyN+IG1zZ2lkICJIZWFkcGhvbmVzIgorI34gbXNnc3RyICJTbMO6Y2hhZGzDoSIKKworI34gbXNnaWQgIkNlbnRlciIKKyN+IG1zZ3N0ciAiU3RyZWRuw70iCisKKyN+IG1zZ2lkICJMRkUiCisjfiBtc2dzdHIgIkxGRSIKKworI34gbXNnaWQgIlN1cnJvdW5kIgorI34gbXNnc3RyICJQcmllc3Rvcm92w70iCisKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICJTdHJhbmEiCisKKyN+IG1zZ2lkICJBVVggT3V0IgorI34gbXNnc3RyICJBVVggdsO9c3R1cCIKKworI34gbXNnaWQgIjNEIERlcHRoIgorI34gbXNnc3RyICIzRCBoxLpia2EiCisKKyN+IG1zZ2lkICIzRCBDZW50ZXIiCisjfiBtc2dzdHIgIjNEIHN0cmVkIgorCisjfiBtc2dpZCAiM0QgRW5oYW5jZSIKKyN+IG1zZ3N0ciAiM0QgdnlsZXDFoWVuaWUiCisKKyN+IG1zZ2lkICJUZWxlcGhvbmUiCisjfiBtc2dzdHIgIlRlbGVmw7NuIgorCisjfiBtc2dpZCAiVmlkZW8gSW4iCisjfiBtc2dzdHIgIlZpZGVvIHZzdHVwIgorCisjfiBtc2dpZCAiQVVYIEluIgorI34gbXNnc3RyICJBVVggdnN0dXAiCisKKyN+IG1zZ2lkICJSZWNvcmQgR2FpbiIKKyN+IG1zZ3N0ciAiWmlzayB6w6F6bmFtdSIKKworI34gbXNnaWQgIk91dHB1dCBHYWluIgorI34gbXNnc3RyICJWw71zdHVwbsO9IHppc2siCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEJvb3N0IgorI34gbXNnc3RyICJab3NpbG5lbmllIG1pa3JvZsOzbnUiCisKKyN+IG1zZ2lkICJEaWFnbm9zdGljIgorI34gbXNnc3RyICJEaWFnbm9zdGlrYSIKKworI34gbXNnaWQgIkJhc3MgQm9vc3QiCisjfiBtc2dzdHIgIlp2w71yYXpuZW5pZSBiYXNvdiIKKworI34gbXNnaWQgIlBsYXliYWNrIFBvcnRzIgorI34gbXNnc3RyICJQcmVocsOhdmFjaWUgcG9ydHkiCisKKyN+IG1zZ2lkICJJbnB1dCIKKyN+IG1zZ3N0ciAiVnN0dXAiCisKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTW9uaXRvciB6ZHJvamEiCisKKyN+IG1zZ2lkICJLZXlib2FyZCBCZWVwIgorI34gbXNnc3RyICJQw61wbnV0aWUga2zDoXZlc25pY2UiCisKKyN+IG1zZ2lkICJTaW11bGF0ZSBTdGVyZW8iCisjfiBtc2dzdHIgIlNpbXVsb3ZhxaUgc3RlcmVvIgorCisjfiBtc2dpZCAiU3RlcmVvIgorI34gbXNnc3RyICJTdGVyZW8iCisKKyN+IG1zZ2lkICJTdXJyb3VuZCBTb3VuZCIKKyN+IG1zZ3N0ciAiUHJpZXN0b3JvdsO9IHp2dWsiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIlppc2sgbWlrcm9mw7NudSIKKworI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICJaZHJvaiByZXByb2R1a3RvcmEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAiWmRyb2ogbWlrcm9mw7NudSIKKworI34gbXNnaWQgIkphY2siCisjfiBtc2dzdHIgIkphY2siCisKKyN+IG1zZ2lkICJDZW50ZXIgLyBMRkUiCisjfiBtc2dzdHIgIlN0cmVkIC8gTEZFIgorCisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAiU3RlcmVvIE1peCIKKworI34gbXNnaWQgIk1vbm8gTWl4IgorI34gbXNnc3RyICJNb25vIE1peCIKKworI34gbXNnaWQgIklucHV0IE1peCIKKyN+IG1zZ3N0ciAiVnN0dXAgTWl4IgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAxIgorI34gbXNnc3RyICJNaWtyb2bDs24gMSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAiTWlrcm9mw7NuIDIiCisKKyN+IG1zZ2lkICJEaWdpdGFsIE91dCIKKyN+IG1zZ3N0ciAiRGlnaXTDoWxueSB2w71zdHVwIgorCisjfiBtc2dpZCAiRGlnaXRhbCBJbiIKKyN+IG1zZ3N0ciAiRGlnaXTDoWxueSB2c3R1cCIKKworI34gbXNnaWQgIkhETUkiCisjfiBtc2dzdHIgIkhETUkiCisKKyN+IG1zZ2lkICJNb2RlbSIKKyN+IG1zZ3N0ciAiTW9kZW0iCisKKyN+IG1zZ2lkICJPdGhlciIKKyN+IG1zZ3N0ciAiSW7DqSIKKworI34gbXNnaWQgIk5vbmUiCisjfiBtc2dzdHIgIk5pxI0iCisKKyN+IG1zZ2lkICJPbiIKKyN+IG1zZ3N0ciAiWmFwbnV0w6kiCisKKyN+IG1zZ2lkICJPZmYiCisjfiBtc2dzdHIgIlZ5cG51dMOpIgorCisjfiBtc2dpZCAiTXV0ZSIKKyN+IG1zZ3N0ciAiU3RsbWnFpSIKKworI34gbXNnaWQgIkZhc3QiCisjfiBtc2dzdHIgIlLDvWNobG8iCisKKyN+IG1zZ2lkICJWZXJ5IExvdyIKKyN+IG1zZ3N0ciAiVmXEvm1pIG7DrXprZSIKKworI34gbXNnaWQgIkxvdyIKKyN+IG1zZ3N0ciAiTsOtemtlIgorCisjfiBtc2dpZCAiTWVkaXVtIgorI34gbXNnc3RyICJTdHJlZG7DqSIKKworI34gbXNnaWQgIkhpZ2giCisjfiBtc2dzdHIgIlZ5c29rw6kiCisKKyN+IG1zZ2lkICJWZXJ5IEhpZ2giCisjfiBtc2dzdHIgIlZlxL5taSB2eXNva8OpIgorCisjfiBtc2dpZCAiUHJvZHVjdGlvbiIKKyN+IG1zZ3N0ciAiUHJvZHVrY2lhIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTWljcm9waG9uZSIKKyN+IG1zZ3N0ciAiTWlrcm9mw7NuIG5hIHByZWRub20gcGFuZWxpIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBJbiIKKyN+IG1zZ3N0ciAiTGlua292w70gdnN0dXAgbmEgcHJlZG5vbSBwYW5lbGkiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBIZWFkcGhvbmVzIgorI34gbXNnc3RyICJTbMO6Y2hhZGzDoSBuYSBwcmVkbm9tIHBhbmVsaSIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgT3V0IgorI34gbXNnc3RyICJMaW5rb3bDvSB2w71zdHVwIG5hIHByZWRub20gcGFuZWxpIgorCisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICJaZWxlbsO9IGtvbmVrdG9yIgorCisjfiBtc2dpZCAiUGluayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlJ1xb5vdsO9IGtvbmVrdG9yIgorCisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk1vZHLDvSBrb25la3RvciIKKworI34gbXNnaWQgIldoaXRlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQmllbHkga29uZWt0b3IiCisKKyN+IG1zZ2lkICJCbGFjayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIsSMaWVybnkga29uZWt0b3IiCisKKyN+IG1zZ2lkICJHcmF5IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAixaBlZMO9IGtvbmVrdG9yIgorCisjfiBtc2dpZCAiT3JhbmdlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiT3JhbsW+b3bDvSBrb25la3RvciIKKworI34gbXNnaWQgIlJlZCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIsSMZXJ2ZW7DvSBrb25la3RvciIKKworI34gbXNnaWQgIlllbGxvdyBDb25uZWN0b3IiCisjfiBtc2dzdHIgIsW9bHTDvSBrb25la3RvciIKKworI34gbXNnaWQgIkdyZWVuIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiWmVsZW7DvSBrb25la3RvciBuYSBwcmVkbm9tIHBhbmVsaSIKKworI34gbXNnaWQgIlBpbmsgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJSdcW+b3bDvSBrb25la3RvciBuYSBwcmVkbm9tIHBhbmVsaSIKKworI34gbXNnaWQgIkJsdWUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJNb2Ryw70ga29uZWt0b3IgbmEgcHJlZG5vbSBwYW5lbGkiCisKKyN+IG1zZ2lkICJXaGl0ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkJpZWx5IGtvbmVrdG9yIG5hIHByZWRub20gcGFuZWxpIgorCisjfiBtc2dpZCAiQmxhY2sgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLEjGllcm55IGtvbmVrdG9yIG5hIHByZWRub20gcGFuZWxpIgorCisjfiBtc2dpZCAiR3JheSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIsWgZWTDvSBrb25la3RvciBuYSBwcmVkbm9tIHBhbmVsaSIKKworI34gbXNnaWQgIk9yYW5nZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk9yYW7Fvm92w70ga29uZWt0b3IgbmEgcHJlZG5vbSBwYW5lbGkiCisKKyN+IG1zZ2lkICJSZWQgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLEjGVydmVuw70ga29uZWt0b3IgbmEgcHJlZG5vbSBwYW5lbGkiCisKKyN+IG1zZ2lkICJZZWxsb3cgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLFvWx0w70ga29uZWt0b3IgbmEgcHJlZG5vbSBwYW5lbGkiCisKKyN+IG1zZ2lkICJTcHJlYWQgT3V0cHV0IgorI34gbXNnc3RyICJSb3pkZWxpxaUgdsO9c3R1cCIKKworI34gbXNnaWQgIkRvd25taXgiCisjfiBtc2dzdHIgIlptaWXFoWFuaWUiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIElucHV0IgorI34gbXNnc3RyICJWc3R1cCB2aXJ0dcOhbG5laG8gbWl4w6lyYSIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgT3V0cHV0IgorI34gbXNnc3RyICJWw71zdHVwIHZpcnR1w6FsbmVobyBtaXjDqXJhIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBDaGFubmVscyIKKyN+IG1zZ3N0ciAiS2Fuw6FseSB2aXJ0dcOhbG5laG8gbWl4w6lyYSIKKworI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyAlZCBmdW5rY2lhIgorCisjfiBtc2dpZCAiJXMgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzIGZ1bmtjaWEiCisKKyN+IG1zZ2lkICJHb3QgdW5leHBlY3RlZCBmcmFtZSBzaXplIG9mICV1IGluc3RlYWQgb2YgJXUuIgorI34gbXNnc3RyICJOYXN0YWxhIG5lb8SNYWvDoXZhbsOhIHZlxL5rb3PFpSBzbsOtbWt5ICV1IG5hbWllc3RvICV1LiIKKworI34gbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgb24gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJDaHliYSBwcmkgxI3DrXRhbsOtICVkIGJhanRvdiBuYSB6YXJpYWRlbsOtICclcycuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIk5lcG9kYXJpbG8gc2EgemFyYWRpxaUgdnlyb3Zuw6F2YWNpdSBwYW3DpMWlIG5hIHphcmlhZGVuw60gJyVzJy4iCisKKyN+IG1zZ2lkICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIk5lcG9kYXJpbG8gc2EgesOtc2thxaUgdmlkZW9zbsOtbWt5IHpvIHphcmlhZGVuaWEgJyVzJy4iCisKKyN+IG1zZ2lkICJGYWlsZWQgYWZ0ZXIgJWQgdHJpZXMuIGRldmljZSAlcy4gc3lzdGVtIGVycm9yOiAlcyIKKyN+IG1zZ3N0ciAiTmVwb2RhcmlsbyBzYSBwbyAlZCBwb2t1c29jaC4gWmFyaWFkZW5pZSAlcy4gU3lzdMOpbW92w6EgY2h5YmE6ICVzIgorCisjfiBtc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzLiciCisjfiBtc2dzdHIgIk5lcG9kYXJpbG8gc2EgesOtc2thxaUgYXRyaWLDunR5IG92bMOhZGFjw61jaCBwcnZrb3YgbmEgemFyaWFkZW7DrSAnJXMuJyIKKworI34gbXNnaWQgIiIKKyN+ICJUaGUgYnVmZmVyIHR5cGUgaXMgbm90IHN1cHBvcnRlZCwgb3IgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMsIG9yIG5vICIKKyN+ICJidWZmZXJzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgeWV0LCBvciB0aGUgdXNlcnB0ciBvciBsZW5ndGggYXJlIGludmFsaWQuICIKKyN+ICJkZXZpY2UgJXMiCisjfiBtc2dzdHIgIiIKKyN+ICJUZW50byB0eXAgdnlyb3Zuw6F2YWNlaiBwYW3DpHRlIG5pZSBqZSBwb2Rwb3JvdmFuw70sIGFsZWJvIGplIHRlbnRvIGluZGV4ICIKKyN+ICJtaW1vIG1lZHrDrSwgYWxlYm8gemF0aWHEviBuZWJvbGEgYWxva292YW7DoSDFvmlhZG5hIHZ5cm92bsOhdmFjaWEgcGFtw6TFpSwgIgorI34gImFsZWJvIHVzZXJwdHIgYWxlYm8gZMS6xb5rYSBzw7ogY2h5Ym7DqS4gWmFyaWFkZW5pZSAlcyIKKworI34gbXNnaWQgIiIKKyN+ICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4gTm90IGVub3VnaCBtZW1vcnkuIgorI34gbXNnc3RyICIiCisjfiAiTmVwb2RhcmlsbyBzYSB6w61za2HFpSB2aWRlb3Nuw61ta3kgem8gemFyaWFkZW5pYSAnJXMnLiBOZWRvc3RhdG9rIHBhbcOkdGUuIgorCisjfiBtc2dpZCAiaW5zdWZmaWNpZW50IG1lbW9yeSB0byBlbnF1ZXVlIGEgdXNlciBwb2ludGVyIGJ1ZmZlci4gZGV2aWNlICVzLiIKKyN+IG1zZ3N0ciAiIgorI34gIm5lZG9zdGF0b2sgcGFtw6R0ZSBwcmUgemFyYWRlbmllIHBvxb5pYWRhdmt5IG5hIHBvdcW+w612YXRlxL5za8O6IHZ5cm92bsOhdmFjaXUgIgorI34gInBhbcOkxaUgdWthem92YXRlxL5hLiB6YXJpYWRlbmllICVzLiIKKworI34gbXNnaWQgIk5vIGZyZWUgYnVmZmVycyBmb3VuZCBpbiB0aGUgcG9vbCBhdCBpbmRleCAlZC4iCisjfiBtc2dzdHIgIiIKKyN+ICJOZW5hxaFsaSBzYSDFvmlhZG5lIHZvxL5uw6kgb2JsYXN0aSB2eXJvdm7DoXZhY2VpIHBhbcOkdGUgdiBibG9rdSBuYSBpbmRleGUgJWQuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGdldCBidWZmZXJzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJOZXBvZGFyaWxvIHNhIHrDrXNrYcWlIHZ5cm92bsOhdmFjaXUgcGFtw6TFpSBvZCB6YXJpYWRlbmlhICclcycuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGdldCBlbm91Z2ggYnVmZmVycyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiIgorI34gIk5lcG9kYXJpbG8gc2EgesOtc2thxaUgZG9zdGF0b2sgdnlyb3Zuw6F2YWNlaiBwYW3DpHRlIG9kIHphcmlhZGVuaWEgJyVzJy4iCisKKyN+IG1zZ2lkICJFcnJvciBzdGFydGluZyBzdHJlYW1pbmcgY2FwdHVyZSBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiQ2h5YmEgcHJpIMWhdGFydG92YW7DrSB6YWNoeXTDoXZhbmlhIHByw7pkdSDDumRham92IHpvIHphcmlhZGVuaWEgJyVzJy4iCisKKyN+IG1zZ2lkICJFcnJvciBzdG9wcGluZyBzdHJlYW1pbmcgY2FwdHVyZSBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiQ2h5YmEgcHJpIHphc3Rhdm92YW7DrSB6YWNoeXTDoXZhbmlhIHByw7pkdSDDumRham92IHpvIHphcmlhZGVuaWEgJyVzJy4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgcmVhZCBmcm9tIENELiIKKyN+IG1zZ3N0ciAiTmVwb2RhcmlsbyBzYSDEjcOtdGHFpSB6IENELiIKKworI34gbXNnaWQgIkRpc2MgaXMgbm90IGFuIEF1ZGlvIENELiIKKyN+IG1zZ3N0ciAiVGVudG8gZGlzayBuaWUgamUgenZ1a292w6kgQ0QuIgorCisjfiBtc2dpZCAiVGhpcyBmaWxlIGlzIGVuY3J5cHRlZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCisjfiBtc2dzdHIgIlRlbnRvIHPDumJvciBqZSB6YcWhaWZyb3ZhbsO9IGEgbmVkw6Egc2EgcHJlaHJhxaUuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IHNldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorI34gbXNnc3RyICJOZXBvZGFyaWxvIHNhIG5hc3RhdmnFpSBwYXJhbWV0cmUgemFyaWFkZW5pdSAnJXMnIgorCisjfiBtc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWQvJWQgZnJhbWVzIHBlciBzZWNvbmQiCisjfiBtc2dzdHIgIlphcmlhZGVuaWUgJyVzJyBuZWRva8Ohxb5lIHphY2h5dMOhdmHFpSBwcmkgJWQvJWQgc27DrW1rYWNoIHphIHNla3VuZHUiCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZXhjaGFuZ2UgZGF0YSB3aXRoIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiTmVwb2RhcmlsYSBzYSB2w71tZW5hIMO6ZGFqb3Ygc28gemFyaWFkZW7DrW0gJyVzJy4iCisKKyN+IG1zZ2lkICJEZXNjcmliZXMgdGhlIHNlbGVjdGVkIGlucHV0IGVsZW1lbnQuIgorI34gbXNnc3RyICJPcGlzdWplIHZ5YnJhbsO9IHZzdHVwbsO9IHBydm9rLiIKKworI34gbXNnaWQgIkRlc2NyaWJlcyB0aGUgc2VsZWN0ZWQgb3V0cHV0IGVsZW1lbnQgZm9yIEF1ZGlvL1ZpZGVvIENvbmZlcmVuY2luZy4iCisjfiBtc2dzdHIgIk9waXN1amUgdnlicmFuw70gdsO9c3R1cG7DvSBwcnZvayBwcmUgaGxhc292w6kvdmlkZW8ga29uZmVyZW5jaWUuIgorCisjfiBtc2dpZCAiRGVzY3JpYmVzIHRoZSBzZWxlY3RlZCBvdXRwdXQgZWxlbWVudCBmb3IgTXVzaWMgYW5kIE1vdmllcy4iCisjfiBtc2dzdHIgIk9waXN1amUgdnlicmFuw70gdsO9c3R1cG7DvSBwcnZvayBwcmUgaHVkYnUgYSBmaWxteS4iCisKKyN+IG1zZ2lkICJEZXNjcmliZXMgdGhlIHNlbGVjdGVkIG91dHB1dCBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiT3Bpc3VqZSB2eWJyYW7DvSB2w71zdHVwbsO9IHBydm9rLiIKKworI34gbXNnaWQgIkdTdHJlYW1lciBhdWRpb3NpbmsgZm9yIEF1ZGlvL1ZpZGVvIENvbmZlcmVuY2luZyIKKyN+IG1zZ3N0ciAiR1N0cmVhbWVyIGF1ZGlvc2luayBwcmUgaGxhc292w6kvdmlkZW8ga29uZmVyZW5jaWUiCisKKyN+IG1zZ2lkICJHU3RyZWFtZXIgYXVkaW9zaW5rIGZvciBNdXNpYyBhbmQgTW92aWVzIgorI34gbXNnc3RyICJHU3RyZWFtZXIgYXVkaW9zaW5rIHByZSBodWRidSBhIGZpbG15IgorCisjfiBtc2dpZCAiIgorI34gIkdTdHJlYW1lciBjYW4gcGxheSBhdWRpbyB1c2luZyBhbnkgbnVtYmVyIG9mIG91dHB1dCBlbGVtZW50cy4gU29tZSAiCisjfiAicG9zc2libGUgY2hvaWNlcyBhcmUgb3Nzc2luaywgZXNkc2luayBhbmQgYWxzYXNpbmsuIFRoZSBhdWRpb3NpbmsgY2FuIGJlICIKKyN+ICJhIHBhcnRpYWwgcGlwZWxpbmUgaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkdTdHJlYW1lciBkb2vDocW+ZSBwcmVocsOhdmHFpSB6dnVrIHBvbW9jb3UgxL51Ym92b8S+bsOpaG8gcG/EjXR1IHbDvXN0dXBuw71jaCAiCisjfiAicHJ2a292LiBNb8W+bm9zxaVhbWkgc8O6IG5hcHLDrWtsYWQgb3Nzc2luaywgZXNkc2luayBhIGFsc2FzaW5rLiBBdWRpb3NpbmsgIgorI34gIm3DtMW+ZSBiecWlIMSNaWFzdG/EjW5lIHLDunJvdSwgbmllbGVuIGplZGluw71tIHBydmtvbS4iCisKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiBwbGF5IHZpZGVvIHVzaW5nIGFueSBudW1iZXIgb2Ygb3V0cHV0IGVsZW1lbnRzLiBTb21lICIKKyN+ICJwb3NzaWJsZSBjaG9pY2VzIGFyZSB4dmltYWdlc2luaywgeGltYWdlc2luaywgc2RsdmlkZW9zaW5rIGFuZCBhYXNpbmsuICIKKyN+ICJUaGUgdmlkZW9zaW5rIGNhbiBiZSBhIHBhcnRpYWwgcGlwZWxpbmUgaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkdTdHJlYW1lciBkb2vDocW+ZSBwcmVocsOhdmHFpSB2aWRlbyBwb21vY291IMS+dWJvdm/Evm7DqWhvIHBvxI10dSB2w71zdHVwbsO9Y2ggIgorI34gInBydmtvdi4gTW/Fvm5vc8WlYW1pIHPDuiBuYXByw61rbGFkIHh2aW1hZ2VzaW5rLCB4aW1hZ2VzaW5rLCBzZGx2aWRlb3NpbmsgYSAiCisjfiAiYWFzaW5rLiBWaWRlb3NpbmsgbcO0xb5lIGJ5xaUgxI1pYXN0b8SNbmUgcsO6cm91LCBuaWVsZW4gamVkaW7DvW0gcHJ2a29tLiIKKworI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHB1dCB2aXN1YWxpemF0aW9uIHBsdWdpbnMgaW4gYSBwaXBlbGluZSB0byB0cmFuc2Zvcm0gYXVkaW8gIgorI34gInN0cmVhbSBpbiB2aWRlbyBmcmFtZXMuIERlZmF1bHQgaXMgZ29vbSBidXQgbW9yZSB2aXN1YWxpemF0aW9uIHBsdWdpbnMgIgorI34gIndpbGwgYmUgcG9ydGVkIHNvb24uIFRoZSB2aXN1YWxpemF0aW9uIHBsdWdpbiBjYW4gYmUgYSBwYXJ0aWFsIHBpcGVsaW5lICIKKyN+ICJpbnN0ZWFkIG9mIGp1c3Qgb25lIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiR1N0cmVhbWVyIGRva8Ohxb5lIHZzdW7DusWlIHZpenVhbGl6YcSNbsOpIHrDoXN1dm7DqSBtb2R1bHkgZG8gcsO6cnkgYSAiCisjfiAidHJhbnNmb3Jtb3ZhxaUgenZ1a292w70gcHLDumQgw7pkYWpvdiBuYSB2aWRlb3Nuw61ta3kuIFByZWR2b2xlbsO9IGplIGdvb20sIGFsZSAiCisjfiAixI1vc2tvcm8gYnVkZSBkb3N0dXBuw71jaCB2aWFjZXJvIHZpenVhbGl6YcSNbsO9Y2ggesOhc3V2bsO9Y2ggbW9kdWxvdi4gIgorI34gIlZpenVhbGl6YcSNbsO9IHrDoXN1dm7DvSBtb2R1bCBtw7TFvmUgYnnFpSDEjWlhc3RvxI1uZSByw7pyb3UsIG5pZWxlbiBqZWRpbsO9bSAiCisjfiAicHJ2a29tLiIKKworI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHJlY29yZCBhdWRpbyB1c2luZyBhbnkgbnVtYmVyIG9mIGlucHV0IGVsZW1lbnRzLiBTb21lICIKKyN+ICJwb3NzaWJsZSBjaG9pY2VzIGFyZSBvc3NzcmMsIGVzZHNyYyBhbmQgYWxzYXNyYy4gVGhlIGF1ZGlvIHNvdXJjZSBjYW4gYmUgIgorI34gImEgcGFydGlhbCBwaXBlbGluZSBpbnN0ZWFkIG9mIGp1c3Qgb25lIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiR1N0cmVhbWVyIGRva8Ohxb5lIG5haHLDoXZhxaUgenZ1ayBwb21vY291IMS+dWJvdm/Evm7DqWhvIHBvxI10dSB2c3R1cG7DvWNoICIKKyN+ICJwcnZrb3YuIE1vxb5ub3PFpWFtaSBzw7ogbmFwcsOta2xhZCBvc3NzcmMsIGVzZHNyYywgYWxzYXNyYy4gWnZ1a292w70gemRyb2ogIgorI34gIm3DtMW+ZSBiecWlIMSNaWFzdG/EjW5lIHLDunJvdSwgbmllbGVuIGplZGluw71tIHBydmtvbS4iCisKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiByZWNvcmQgdmlkZW8gZnJvbSBhbnkgbnVtYmVyIG9mIGlucHV0IGVsZW1lbnRzLiBTb21lICIKKyN+ICJwb3NzaWJsZSBjaG9pY2VzIGFyZSB2NGxzcmMgYW5kIHZpZGVvdGVzdHNyYy4gVGhlIHZpZGVvIHNvdXJjZSBjYW4gYmUgYSAiCisjfiAicGFydGlhbCBwaXBlbGluZSBpbnN0ZWFkIG9mIGp1c3Qgb25lIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiR1N0cmVhbWVyIGRva8Ohxb5lIG5haHJhxaUgdmlkZW8gcG9tb2NvdSDEvnVib3ZvxL5uw6lobyBwb8SNdHUgdnN0dXBuw71jaCBwcnZrb3YuICIKKyN+ICJNb8W+bm9zxaVhbWkgc8O6IG5hcHLDrWtsYWQgdjRsc3JjIGEgdmlkZW90ZXN0c3JjLiBWaWRlbyB6ZHJvaiBtw7TFvmUgYnnFpSAiCisjfiAixI1pYXN0b8SNbmUgcsO6cm91LCBuaWVsZW4gamVkaW7DvW0gcHJ2a29tLiIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIGF1ZGlvIHNvdXJjZSIKKyN+IG1zZ3N0ciAicHJlZHZvbGVuw70gemRyb2ogenZ1a3UgcHJlIEdTdHJlYW1lciIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIGF1ZGlvc2luayIKKyN+IG1zZ3N0ciAicHJlZHZvbGVuw70gYXVkaW9zaW5rIHByZSBHU3RyZWFtZXIiCisKKyN+IG1zZ2lkICJkZWZhdWx0IEdTdHJlYW1lciB2aWRlbyBzb3VyY2UiCisjfiBtc2dzdHIgInByZWR2b2xlbsO9IHpkcm9qIHZpZGVhIHByZSBHU3RyZWFtZXIiCisKKyN+IG1zZ2lkICJkZWZhdWx0IEdTdHJlYW1lciB2aWRlb3NpbmsiCisjfiBtc2dzdHIgInByZWR2b2xlbsO9IHZpZGVvc2luayBwcmUgR1N0cmVhbWVyIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgdmlzdWFsaXphdGlvbiBwbHVnaW4iCisjfiBtc2dzdHIgInByZWR2b2xlbsO9IHZpenVhbGl6YcSNbsO9IHrDoXN1dm7DvSBtb2R1bCBwcmUgR1N0cmVhbWVyIgorCisjfiBtc2dpZCAiZGVzY3JpcHRpb24gZm9yIEdTdHJlYW1lciBhdWRpb3NpbmsgZm9yIEF1ZGlvL1ZpZGVvIENvbmZlcmVuY2luZyIKKyN+IG1zZ3N0ciAicG9waXMgcHJlIGF1ZGlvc2luayBwcmUgR1N0cmVhbWVyIHByZSBobGFzb3bDqS92aWRlbyBrb25mZXJlbmNpZSIKKworI34gbXNnaWQgImRlc2NyaXB0aW9uIGZvciBHU3RyZWFtZXIgYXVkaW9zaW5rIGZvciBNdXNpYyBhbmQgTW92aWVzIgorI34gbXNnc3RyICJwb3BpcyBwcmUgYXVkaW9zaW5rIHByZSBHU3RyZWFtZXIgcHJlIGh1ZGJ1IGEgZmlsbXkiCisKKyN+IG1zZ2lkICJkZXNjcmlwdGlvbiBmb3IgZGVmYXVsdCBHU3RyZWFtZXIgYXVkaW9zaW5rIgorI34gbXNnc3RyICJwb3BpcyBwcmUgcHJlZHZvbGVuw70gYXVkaW9zaW5rIHByZSBHU3RyZWFtZXIiCisKKyN+IG1zZ2lkICJkZXNjcmlwdGlvbiBmb3IgZGVmYXVsdCBHU3RyZWFtZXIgYXVkaW9zcmMiCisjfiBtc2dzdHIgInBvcGlzIHByZSBwcmVkdm9sZW7DvSBhdWRpb3NyYyBwcmUgR1N0cmVhbWVyIgpkaWZmIC0tZ2l0IGEvcG8vc2wucG8gYi9wby9zbC5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTYxNWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcG8vc2wucG8KQEAgLTAsMCArMSw0NDUgQEAKKyMgU2xvdmVuaWFuIHRyYW5zbGF0aW9uIGZvciBnc3QtcGx1Z2lucy1nb29kLgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ3N0LXBsdWdpbnMtZ29vZCBwYWNrYWdlLgorIyBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBSb2JlcnQgSG9ydmF0IDxyb2JpQGhpcG5vcy5uZXQ+LCAyMDEwLgorIyBNYXRlaiBVcmJhbsSNacSNIDxtYXRlai51cmJhbkBnbWFpbC5jb20+LCAyMDEwIC0gMjAxMS4KKyMgS2xlbWVuIEtvxaFpciA8a2xlbWVuOTEzQGdtYWlsLmNvbT4sIDIwMTIgLSAyMDE0LgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZC0xLjIuMVxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDE0LTA0LTA5IDIyOjUyKzAxMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEtsZW1lbiBLb8WhaXIgPGtsZW1lbjkxM0BnbWFpbC5jb20+XG4iCisiTGFuZ3VhZ2UtVGVhbTogU2xvdmVuaWFuIDx0cmFuc2xhdGlvbi10ZWFtLXNsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD5cbiIKKyJMYW5ndWFnZTogc2xcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTQ7IHBsdXJhbD0obiUxMDA9PTEgPyAxIDogbiUxMDA9PTIgPyAyIDogbiUxMDA9PTMgfHwgbiIKKyIlMTAwPT00ID8gMyA6IDApO1xuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICJTdHJlxb5uaWthIEpBQ0sgbmkgbW9nb8SNZSBuYWp0aSIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiTmFwYWthIG1lZCBkZWtvZGlyYW5qZW0gSlBFRyBzbGlrZSIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiJyVzJyBpenZhamFsY2EgJyVzJyIKKworbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAiTmkgc2UgbW9nb8SNZSBwb3ZlemF0aSBzIHN0cmXFvm5pa29tIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIk5pIG5hc3RhdmxqZW5lZ2EgbmFzbG92YSBVUkwuIgorCittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJOaSBtb2dvxI1lIHJhenJlxaFpdGkgaW1lbmEgc3RyZcW+bmlrYS4iCisKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiTmkgbW9nb8SNZSB2enBvc3Rhdml0aSBwb3ZlemF2ZSBzIHN0cmXFvm5pa29tLiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIk5hc3Rhdml0ZXYgdmFybmUgcG92ZXphdmUgamUgc3BvZGxldGVsYS4iCisKKyMsIGZ1enp5Cittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorIlByacWhbG8gamUgZG8gb21yZcW+bmUgbmFwYWtlIGFsaSBwYSBqZSBwb3ZlemF2YSBuZXByacSNYWtvdmFubyBwcmVraW5qZW5hLiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiU3RyZcW+bmlrIGplIHBvc2xhbCBzbGFiZSBwb2RhdGtlLiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICJTdHJlxb5uaWsgbmUgcG9kcGlyYSBpc2thbmphLiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAiTmFwYWthIHZob2RuZWdhIHp2b2thLCBBVkkgcHJldG9rIGJvIHBva3Zhcmplbi4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIkRhdG90ZWthIG5lIHZzZWJ1amUgcHJldG9rb3YgemEgcHJlZHZhamFuamUuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJEYXRvdGVrYSBqZSBuYXBhxI1uYSwgemF0byBqZSBuaSBtb2dvxI1lIHByZWR2YWphdGkuIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIlByZXRva2EgbmkgbW9nb8SNZSBwcmVkdmFqYXRpLCBrZXIgamUgxaFpZnJpcmFuIHMgUGxheVJlYWR5IERSTS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkRhdG90ZWthIGplIHBva3ZhcmplbmEsIHphdG8gamUgbmkgbW9nb8SNZSBwcmVkdmFqYXRpLiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiTmV2ZWxqYXZuYSB2ZWxpa29zdCBhdG9tYS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkRhdG90ZWthIG5pIHBvcG9sbmEsIHphdG8gamUgbmkgbW9nb8SNZSBwcmVkdmFqYXRpLiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiVmlkZW8gemFwaXMgdiB0ZWogZGF0b3Rla2kgbW9yZGEgbmUgYm8gcHJlZHZhamFuIHByYXZpbG5vLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICJEYXRvdGVrYSB2c2VidWplIHZlxI0gcHJldG9rb3YuIFByZWR2YWphbm8gYm8gbGUgemHEjWV0bmloICVkIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyJOaSBtb2dvxI1lIG5hanRpIHBvZHBydGVnYSBwcmV0b2thLiBOYWp2ZXJqZXRuZWplIGplIHRyZWJhIG5hbWVzdGl0aSB2c3RhdmVrICIKKyJHU3RyZWFtZXIgUlRTUCByYXrFoWlyaXR2ZSB6YSBSZWFsTWVkaWEgcHJldG9rZS4iCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKyJOaSBtb2dvxI1lIG5hanRpIHBvZHBydGVnYSBwcmV0b2thLiBOYWp2ZXJqZXRuZWplIGplIHRyZWJhIG9tb2dvxI1pdGkgdmXEjSAiCisicHJvdG9rb2xvdiBwcmVub3NhLCBvemlyb21hIG1hbmprYSB1c3RyZXplbiB2c3RhdmVrIEdTdHJlYW1lciBSVFNQICIKKyJyYXrFoWlyaXR2ZS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisiTmkgbW9nb8SNZSBvZHByZXRpIHp2b8SNbmUgbmFwcmF2ZSB6YSBwcmVkdmFqYW5qZS4gTmFwcmF2byB1cG9yYWJsamEgZHJ1ZyAiCisicHJvZ3JhbS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIk5pIG1vZ2/EjWUgb2RwcmV0aSB6dm/EjW5lIG5hcHJhdmUgemEgcHJlZHZhamFuamUuIE5pIHVzdHJlem5paCBkb3ZvbGplbmogemEgIgorIm9kcGlyYW5qZSBuYXByYXZlLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICJOaSBtb2dvxI1lIG9kcHJldGkgenZvxI1uZSBuYXByYXZlIHphIHByZWR2YWphbmplLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKyJOaSBtb2dvxI1lIG9kcHJldGkgenZvxI1uZSBuYXByYXZlIHphIHByZWR2YWphbmplLiBPcGVuIFNvdW5kIFN5c3RlbSBuaSBwb2RwcnQuIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIlByZWR2YWphbmUgcyB0byB6dm/EjW5vIG5hcHJhdm8gbmkgcG9kcHJ0by4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIk1lZCBwcmVkdmFqYW5qZW0genZva2EgamUgcHJpxaFsbyBkbyBuYXBha2UuIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJTbmVtYW5qZSBzIHRvIHp2b8SNbm8gbmFwcmF2byBuaSBwb2RwcnRvLiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIk5hcGFrYSBtZWQgc2hyYW5qZXZhbmplbSBwcmVrbyB6dm/EjW5lIG5hcHJhdmUiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJadm/EjW5lIG5hcHJhdmUgbmkgbW9nb8SNZSBvZHByZXRpIHphIHNuZW1hbmplLiBOaSB1c3RyZXpuaWggZG92b2xqZW5qIHphICIKKyJvZHBpcmFuamUgbmFwcmF2ZS4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIlp2b8SNbmUgbmFwcmF2ZSBuaSBtb2dvxI1lIG9kcHJldGkgemEgc25lbWFuamUuIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAiVmlyIHNuZW1hbmphIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWlrcm9mb24iCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICJBbmFsb2duaSB2aG9kIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIk5vdHJhbmppIENEIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIlZob2QgU1BESUYiCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiVmhvZCBBVVggMSIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJWaG9kIEFVWCAyIgorCittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIlBvdnJhdG5hIHphbmthIGtvZGVrYSIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiUG92cmF0bmEgemFua2EgU3VuVlRTIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJHbGFzbm9zdCIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIk9qYcSNaXRldiIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIlphc2xvbiIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIlZncmFqZW5pIHp2b8SNbmlrIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICJTbHXFoWFsa2UiCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiQW5hbG9nbmkgaXpob2QiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIkl6aG9kIFNQRElGIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICJJemhvZCBBVVggMSIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiSXpob2QgQVVYIDIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmFwYWthIG1lZCBicmFuamVtICVkIGJhanRvdiBpeiBuYXByYXZlICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisiTWVkIMWhdGV2aWzEjWVuamVtIG9ibGlrIHZpZGVhLCBraSBqaWggcG9kcGlyYSBuYXByYXZhIFwiJXNcIiwgamUgcHJpxaFsbyBkbyAiCisibmFwYWtlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiTmkgbW9nb8SNZSBwcmVzbGlrYXRpIG1lZHBvbW5pbG5pa2EgbmFwcmF2ZSAnJXMnIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICJHb25pbG5payBuYXByYXZlIFwiJXNcIiBuZSBwb2RwaXJhIG5vYmVuZWdhIG5hxI1pbmEgSS9PICVkLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIkdvbmlsbmlrIG5hcHJhdmUgXCIlc1wiIG5lIHBvZHBpcmEgbm9iZW5lZ2Egem5hbmVnYSBuYcSNaW5hIEkvTy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAiTmFwcmF2YSBcIiVzXCIgamUgemFwb3NsZW5hLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiTmFwcmF2YSBcIiVzXCIgbmUgcG9kcGlyYSB6YWplbWFuamEgdiBsb8SNbGppdm9zdGkgJWR4JWQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICJOYXByYXZhIFwiJXNcIiBuZSBwb2RwaXJhIHphamVtYW5qYSB2IGl6YnJhbmkgb2JsaWtpLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiTmFwcmF2YSBcIiVzXCIgbmUgcG9kcGlyYSB6YWplbWFuamEgdmlkZWEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiTmkgbW9nb8SNZSBwcmlkb2JpdGkgcGFyYW1ldHJvdiBuYSBuYXByYXZpICclcycuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICJOYXByYXZpIG5pIG1vZ2/EjWUgZG9sb8SNaXRpIG5vdmloIG5hc3Rhdml0ZXYgaGl0cm9zdGkgc2xpxI1pYy4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiTmFwcmF2aSBuaSBtb2dvxI1lIGRvbG/EjWl0aSBub3ZpaCBuYXN0YXZpdGV2IGhpdHJvc3RpIHNsacSNaWMuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICJHb25pbG5payBuYXByYXZlIFwiJXNcIiBuZSBwb2RwaXJhIG5vYmVuZWdhIG5hxI1pbmEgSS9PICVkLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICJHb25pbG5payBuYXByYXZlIFwiJXNcIiBuZSBwb2RwaXJhIG5vYmVuZWdhIG5hxI1pbmEgSS9PICVkLiIKKworIywgZnV6enkKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiTmFwcmF2YSBuZSBtb3JlIHVzdHZhcml0aSB6YWxvZ2UgbWVkcG9tbmlsbmlrYS4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICJOYXByYXZhIG5lIG1vcmUgdXN0dmFyaXRpIHphbG9nZSBtZWRwb21uaWxuaWthLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIk1lZCBwcmlkb2JpdmFuamVtIG5hc3Rhdml0ZXYgdWdsYcWhZXZhbG5pa2EgJWQgbmEgbmFwcmF2aSBcIiVzXCIgamUgcHJpxaFsbyBkbyAiCisibmFwYWtlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJNZWQgcHJpZG9iaXZhbmplbSBsYXN0bm9zdGkgbmFwcmF2ZSBcIiVzXCIgamUgcHJpxaFsbyBkbyBuYXBha2UuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiTmFwcmF2YSBcIiVzXCIgbmkgdWdsYcWhZXZhbG5pay4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJNZWQgcHJpZG9iaXZhbmplbSB2aG9kYSBuYSBuYXByYXZpIFwiJXNcIiBqZSBwcmnFoWxvIGRvIG5hcGFrZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJOYXBha2EgbWVkIGRvbG/EjWFuamVtIHZob2RhICVkIG5hcHJhdmUgJXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiTWVkIG5hc3RhdmxqYW5qZW0gc3RhbmphIGdsYXNub3N0aSBuYSBuYXByYXZpIFwiJXNcIiBqZSBwcmnFoWxvIGRvIG5hcGFrZS4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIkdvbmlsbmlrIG5hcHJhdmUgXCIlc1wiIG5lIHBvZHBpcmEgbm9iZW5lZ2EgbmHEjWluYSBJL08gJWQuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiTmFwcmF2aSBuaSBtb2dvxI1lIGRvbG/EjWl0aSBub3ZpaCBuYXN0YXZpdGV2IGhpdHJvc3RpIHNsacSNaWMuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiTmFwcmF2aSBuaSBtb2dvxI1lIGRvbG/EjWl0aSBub3ZpaCBuYXN0YXZpdGV2IGhpdHJvc3RpIHNsacSNaWMuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIk5hcHJhdmkgbmkgbW9nb8SNZSBkb2xvxI1pdGkgbm92aWggbmFzdGF2aXRldiBoaXRyb3N0aSBzbGnEjWljLiIKKworIywgZnV6enkKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiTmFwYWthIG1lZCBkZWtvZGlyYW5qZW0gSlBFRyBzbGlrZSIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorIk5hcGFrYSBtZWQgcHJpZG9iaXZhbmplbSB6bW/Fvm5vc3RpIG5hcHJhdmUgJyVzJzogbmkgcHJhdmVnYSBnb25pbG5pa2EgdjRsMi4gIgorIlByZXZlcml0ZSBuYW1lc3RpdGV2LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIk5hcGFrYSBtZWQgcHJlZ2xlZG92YW5qZW0gYXRyaWJ1dG92IHBvaXp2ZWRiZSB2aG9kYSAlZCBuYXByYXZlICVzIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5hcGFrYSBtZWQgcHJpZG9iaXZhbmplbSBuYXN0YXZpdGV2IHVnbGHFoWV2YWxuaWthICVkIG5hIG5hcHJhdmkgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOYXBha2EgbWVkIHBvaXp2ZWRvdmFuamVtIHVyYXZuYW5vc3RpIG5hcHJhdmUgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5hcGFrYSBtZWQgcHJpZG9iaXZhbmplbSBhdHJpYnV0b3YgbmFkem9yYSBuYXByYXZlICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5hcHJhdmUgXCIlc1wiIG5pIG1vZ2/EjWUgZG9sb8SNaXRpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICJUbyBuaSBuYXByYXZhIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJOaSBtb2dvxI1lIG9kcHJldGkgbmFwcmF2ZSAnJXMnIHphIGJyYW5qZSBpbiBwaXNhbmplLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIk5hcHJhdmEgJyVzJyBuaSBuYXByYXZhIHphIHphamVtYW5qZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIk5hcHJhdmEgJyVzJyBuaSBpemhvZG5hIG5hcHJhdmEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiTmFwcmF2YSAnJXMnIG5pIGl6aG9kbmEgbmFwcmF2YS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJOaSBtb2dvxI1lIG9kcHJldGkgbmFwcmF2ZSAnJXMnIHphIGJyYW5qZSBpbiBwaXNhbmplLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTWVkIG5hc3RhdmxqYW5qZW0gbmFwcmF2ZSBcIiVzXCIgamUgcHJpxaFsbyBkbyBuYXBha2UuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmFwYWthIG1lZCBwcmlkb2JpdmFuamVtIGZyZWt2ZW5jZSB1Z2xhxaFldmFsbmlrYSBuYXByYXZlICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIiIKKyJOYXBha2EgbWVkIG5hc3RhdmxqYW5qZW0gZnJla3ZlbmNlIHVnbGHFoWV2YWxuaWthIG5hcHJhdmUgJyVzJyBuYSAlbHUgSHouLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJOYXBha2EgbWVkIHByaWRvYml2YW5qZW0gbW/EjWkgc2lnbmFsYSB6YSBuYXByYXZvICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOYXBha2EgbWVkIHByaWRvYml2YW5qZW0gdnJlZG5vc3RpICVkIG5hIG5hcHJhdmkgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5hcGFrYSBtZWQgZG9sb8SNYW5qZW0gdnJlZG5vc3RpICVkIHphICVkIG5hIG5hcHJhdmkgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJOYXBha2EgbWVkIHByaWRvYml2YW5qZW0gdmhvZG5lZ2Egc2lnbmFsYSBuYXByYXZlICclcycuIE1vcmRhIGplIHJhZGlqc2thICIKKyJuYXByYXZhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiTmFwYWthIG1lZCBwcmlkb2JpdmFuamVtIG9kdm9kbmVnYSBzaWduYWxhIG5hcHJhdmUgJyVzJy4gTW9yZGEgamUgcmFkaWpza2EgIgorIm5hcHJhdmEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIk5hcGFrYSBtZWQgZG9sb8SNYW5qZW0gb2R2b2RhICVkIG5hcHJhdmUgJXMuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiU3ByZW1pbmphbmplIGxvxI1saml2b3N0aSBtZWQgZGVsb3ZhbmplbSDFoWUgbmkgcG9kcHJ0by4iCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIkl6dmFqYW5qZSBvcHJhdmlsIGJyZXogdXJlIG5pIG1vZ2/EjWUiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIk5vdHJhbmphIG5hcGFrYSBwcmV0b2thIHBvZGF0a292LiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgZmxvdyBlcnJvci4iCisjfiBtc2dzdHIgIk5vdHJhbmphIG5hcGFrYSBwcmV0b2thIHBvZGF0a292LiIKKworI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAiTmFwcmF2YSBcIiVzXCIgbmUgcG9kcGlyYSB6YWplbWFuamEgdmlkZWEuIgpkaWZmIC0tZ2l0IGEvcG8vc3EucG8gYi9wby9zcS5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTQ0N2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvcG8vc3EucG8KQEAgLTAsMCArMSw2MzggQEAKKyMgUMOrcmt0aGltaSBpIG1lc2F6aGV2ZSB0w6sgZ3N0LXBsdWdpbnMgbsOrIHNocWlwLgorIyBDb3B5cmlnaHQgKEMpIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIExhdXJlbnQgRGhpbWEgPGxhdXJlbnRpQGFsYmxpbnV4Lm5ldD4sIDIwMDQuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucyAwLjguM1xuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA0LTA4LTA3IDIwOjI5KzAyMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IExhdXJlbnQgRGhpbWEgPGxhdXJlbnRpQGFsYmxpbnV4Lm5ldD5cbiIKKyJMYW5ndWFnZS1UZWFtOiBBbGJhbmlhbiA8YmVncmFqQGhvdG1haWwuY29tPlxuIgorIkxhbmd1YWdlOiBzcVxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIiIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAiRSBwYW11bmR1ciBtYnlsbGphIGUgZGlzcG96aXRpdml0IHTDqyBrb250cm9sbGl0IFwiJXNcIi4iCisKK21zZ2lkICJObyBVUkwgc2V0LiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiRSBwYW11bmR1ciBtYnlsbGphIGUgZGlzcG96aXRpdml0IHTDqyBrb250cm9sbGl0IFwiJXNcIi4iCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIkUgcGFtdW5kdXIgbWJ5bGxqYSBlIGRpc3Bveml0aXZpdCB0w6sga29udHJvbGxpdCBcIiVzXCIuIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIkRpc3Bveml0aXZpIGp1YWogT1NTIG11bmQgdMOrIG1vcyBwcm92b2hldCBrb3JyZWt0w6tzaXNodCIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAiSW5wdXQgYXVkaW8gaSBnYWJ1YXIgb3NlIG11bmdvbiwgc3RyZWFtIEFWSSBtdW5kIHTDqyBqZXTDqyBpIGTDq210dWFyLiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiRSBwYW11bmR1ciBoYXBqYSBlIGRpc3Bveml0aXZpdCB0w6sgesOrcml0IFwiJXNcIiBww6tyIHNoa3JpbS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICIiCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiSSBwYW11bmR1ciBoYXBqYSBlIGRpc3Bveml0aXZpdCBDRCBww6tyIGxleGltLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICJEaXNwb3ppdGl2aSBqdWFqIE9TUyBtdW5kIHTDqyBtb3MgcHJvdm9oZXQga29ycmVrdMOrc2lzaHQiCisKKyMsIGZ1enp5Cittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAiUmVnamlzdHJpbWkiCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICJNaWtyb2ZvbmkiCisKKyMsIGZ1enp5Cittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAiTGluamEtaHlyamUiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIiIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICIiCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIiIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJWb2x1bWkiCisKK21zZ2lkICJHYWluIgorbXNnc3RyICIiCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJFa3JhbmkiCisKKyMsIGZ1enp5Cittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiWsOrIGZvbMOrcyIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIiIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICIiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRSBwYW11bmR1ciBtYXJyamEgZSBidWZmZXJzIG5nYSBkaXNwb3ppdGl2aSBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICJFIHBhbXVuZHVyIG1hcnJqYSBlIGJ1ZmZlcnMgbmdhIGRpc3Bveml0aXZpIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAiRGlzcG96aXRpdmkgXCIlc1wiIG51ayDDq3NodMOrIG5qw6sgZGlzcG96aXRpdiBtYXJyamUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiRGlzcG96aXRpdmkgXCIlc1wiIG51ayDDq3NodMOrIG5qw6sgZGlzcG96aXRpdiBtYXJyamUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiRGlzcG96aXRpdmkgXCIlc1wiIG51ayDDq3NodMOrIG5qw6sgZGlzcG96aXRpdiBtYXJyamUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICJEaXNwb3ppdGl2aSBcIiVzXCIgbnVrIMOrc2h0w6sgbmrDqyBkaXNwb3ppdGl2IG1hcnJqZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiRSBwYW11bmR1ciBtYXJyamEgZSBidWZmZXJzIG5nYSBkaXNwb3ppdGl2aSBcIiVzXCIuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRSBwYW11bmR1ciBtYXJyamEgZSBidWZmZXJzIHTDqyBtamFmdHVlc2jDq20gbmdhIGRpc3Bveml0aXZpIFwiJXNcIi4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkUgcGFtdW5kdXIgbWFycmphIGUgYnVmZmVycyBuZ2EgZGlzcG96aXRpdmkgXCIlc1wiLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICJEaXNwb3ppdGl2aSBcIiVzXCIgbnVrIMOrc2h0w6sgbmrDqyBkaXNwb3ppdGl2IG1hcnJqZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiRSBwYW11bmR1ciBtYnlsbGphIGUgZGlzcG96aXRpdml0IGF1ZGlvIFwiJXNcIi4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiRSBwYW11bmR1ciBtYnlsbGphIGUgZGlzcG96aXRpdml0IGF1ZGlvIFwiJXNcIi4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJFIHBhbXVuZHVyIG1hcnJqYSBlIGJ1ZmZlcnMgbmdhIGRpc3Bveml0aXZpIFwiJXNcIi4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRSBwYW11bmR1ciBtYXJyamEgZSBidWZmZXJzIHTDqyBtamFmdHVlc2jDq20gbmdhIGRpc3Bveml0aXZpIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiSSBwYW11bmR1ciBzaGtyaW1pIG7DqyBkaXNwb3ppdGl2aW4gXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiRSBwYW11bmR1ciBoYXBqYSBlIGRpc3Bveml0aXZpdCBcIiVzXCIgcMOrciBsZXhpbSBkaGUgc2hrcmltLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICJEaXNwb3ppdGl2aSBcIiVzXCIgbnVrIMOrc2h0w6sgbmrDqyBkaXNwb3ppdGl2IG1hcnJqZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICJEaXNwb3ppdGl2aSBcIiVzXCIgbnVrIMOrc2h0w6sgbmrDqyBkaXNwb3ppdGl2IG1hcnJqZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICJEaXNwb3ppdGl2aSBcIiVzXCIgbnVrIMOrc2h0w6sgbmrDqyBkaXNwb3ppdGl2IG1hcnJqZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJFIHBhbXVuZHVyIGhhcGphIGUgZGlzcG96aXRpdml0IFwiJXNcIiBww6tyIGxleGltIGRoZSBzaGtyaW0uIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRSBwYW11bmR1ciBtYXJyamEgZSBidWZmZXJzIG5nYSBkaXNwb3ppdGl2aSBcIiVzXCIuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkUgcGFtdW5kdXIgbWFycmphIGUgYnVmZmVycyB0w6sgbWphZnR1ZXNow6ttIG5nYSBkaXNwb3ppdGl2aSBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJFIHBhbXVuZHVyIG1ieWxsamEgZSBkaXNwb3ppdGl2aXQgdMOrIGtvbnRyb2xsaXQgXCIlc1wiLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkUgcGFtdW5kdXIgbWJ5bGxqYSBlIGRpc3Bveml0aXZpdCB0w6sga29udHJvbGxpdCBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIkUgcGFtdW5kdXIgbWFycmphIGUgYnVmZmVycyB0w6sgbWphZnR1ZXNow6ttIG5nYSBkaXNwb3ppdGl2aSBcIiVzXCIuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJFIHBhbXVuZHVyIG1ieWxsamEgZSBkaXNwb3ppdGl2aXQgYXVkaW8gXCIlc1wiLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAiRGlzcG96aXRpdmkgXCIlc1wiIG51ayDDq3NodMOrIG5qw6sgZGlzcG96aXRpdiBtYXJyamUuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiRSBwYW11bmR1ciBtYXJyamEgZSBidWZmZXJzIHTDqyBtamFmdHVlc2jDq20gbmdhIGRpc3Bveml0aXZpIFwiJXNcIi4iCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICJCYXMiCisKKyN+IG1zZ2lkICJUcmVibGUiCisjfiBtc2dzdHIgIlRyZWJsZSIKKworI34gbXNnaWQgIlN5bnRoIgorI34gbXNnc3RyICJTaW50ZXRpenVlc2kiCisKKyN+IG1zZ2lkICJQQ00iCisjfiBtc2dzdHIgIlBDTSIKKworI34gbXNnaWQgIlNwZWFrZXIiCisjfiBtc2dzdHIgIlrDqyBmb2zDq3MiCisKKyN+IG1zZ2lkICJMaW5lLWluIgorI34gbXNnc3RyICJMaW5qYS1oeXJqZSIKKworI34gbXNnaWQgIkNEIgorI34gbXNnc3RyICJDRCIKKworI34gbXNnaWQgIk1peGVyIgorI34gbXNnc3RyICJLb250cm9sbGkgaSB2b2x1bWl0IgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIlBDTS0yIgorCisjfiBtc2dpZCAiUmVjb3JkIgorI34gbXNnc3RyICJSZWdqaXN0cmltaSIKKworI34gbXNnaWQgIkluLWdhaW4iCisjfiBtc2dzdHIgIkluLWdhaW4iCisKKyN+IG1zZ2lkICJPdXQtZ2FpbiIKKyN+IG1zZ3N0ciAiT3V0LWdhaW4iCisKKyN+IG1zZ2lkICJMaW5lLTEiCisjfiBtc2dzdHIgIkxpbmphLTEiCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgIkxpbmphLTIiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIkxpbmphLTMiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTEiCisjfiBtc2dzdHIgIkRpeGhpdGFsZS0xIgorCisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICJEaXhoaXRhbGUtMiIKKworI34gbXNnaWQgIkRpZ2l0YWwtMyIKKyN+IG1zZ3N0ciAiRGl4aGl0YWxlLTMiCisKKyN+IG1zZ2lkICJQaG9uZS1pbiIKKyN+IG1zZ3N0ciAiUGhvbmUtaHlyamEiCisKKyN+IG1zZ2lkICJQaG9uZS1vdXQiCisjfiBtc2dzdHIgIlBob25lLWRhbGphIgorCisjfiBtc2dpZCAiVmlkZW8iCisjfiBtc2dzdHIgIlZpZGVvIgorCisjfiBtc2dpZCAiUmFkaW8iCisjfiBtc2dzdHIgIlJhZGlvIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCisjfiBtc2dzdHIgIkUgcGFtdW5kdXIgaGFwamEgZSBkaXNwb3ppdGl2aXQgdMOrIHrDq3JpdCBcIiVzXCIgcMOrciBzaGtyaW0uIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIlJlZ2ppc3RyaW1pIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlNpZGUiCisjfiBtc2dzdHIgIlZpZGVvIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlZpZGVvIEluIgorI34gbXNnc3RyICJWaWRlbyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJSZWNvcmQgR2FpbiIKKyN+IG1zZ3N0ciAiUmVnamlzdHJpbWkiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiT3V0cHV0IEdhaW4iCisjfiBtc2dzdHIgIk91dC1nYWluIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgQm9vc3QiCisjfiBtc2dzdHIgIk1pa3JvZm9uaSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAiRWtyYW5pIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKKyN+IG1zZ3N0ciAiTWlrcm9mb25pIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICJaw6sgZm9sw6tzIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgU291cmNlIgorI34gbXNnc3RyICJNaWtyb2ZvbmkiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTWljcm9waG9uZSAxIgorI34gbXNnc3RyICJNaWtyb2ZvbmkiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICJNaWtyb2ZvbmkiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgIkRpeGhpdGFsZS0xIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkRpZ2l0YWwgSW4iCisjfiBtc2dzdHIgIkRpeGhpdGFsZS0xIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCisjfiBtc2dzdHIgIk1pa3JvZm9uaSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJDb3VsZCBub3QgZW5xdWV1ZSBidWZmZXJzIGluIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiRSBwYW11bmR1ciBtYXJyamEgZSBidWZmZXJzIG5nYSBkaXNwb3ppdGl2aSBcIiVzXCIuIgorCisjfiBtc2dpZCAiIgorI34gIk5vIHVzYWJsZSBjb2xvcnNwYWNlIGVsZW1lbnQgY291bGQgYmUgZm91bmQuXG4iCisjfiAiUGxlYXNlIGluc3RhbGwgb25lIGFuZCByZXN0YXJ0LiIKKyN+IG1zZ3N0ciAiIgorI34gIk51ayBhcnJpbiB0w6sgZ2plaGV0IGFzbmrDqyBlbGVtZW50IG5nanlyYSBlIGhhcMOrc2lyw6tzLlxuIgorI34gIkp1IGx1dGVtIGluc3RhbG9uaSBuasOrIGRoZSByaW5pc25pLiIKKworI34gbXNnaWQgIiIKKyN+ICJUaGUgJXMgZWxlbWVudCBjb3VsZCBub3QgYmUgZm91bmQuIFRoaXMgZWxlbWVudCBpcyBlc3NlbnRpYWwgZm9yICIKKyN+ICJwbGF5YmFjay4gUGxlYXNlIGluc3RhbGwgdGhlIHJpZ2h0IHBsdWctaW4gYW5kIHZlcmlmeSB0aGF0IGl0IHdvcmtzIGJ5ICIKKyN+ICJydW5uaW5nICdnc3QtaW5zcGVjdCAlcyciCisjfiBtc2dzdHIgIiIKKyN+ICJFIHBhbXVuZHVyIGdqZXRqYSBlIGVsZW1lbnRpdCAlcy4gS3kgZWxlbWVudCDDq3NodMOrIHRoZWxiw6tzb3IgcMOrciAiCisjfiAicGxheWJhY2suIEp1IGx1dGVtIGluc3RhbG9uaSBwbHVnLWluIGUgZHVodXIgZGhlIGtvbnRyb2xsbyBmdW5rc2lvbmltaW4gIgorI34gImR1a2UgZWt6ZWt1dHVhciAnZ3N0LWluc3BlY3QgJXMnIgorCisjfiBtc2dpZCAiRGV2aWNlIGlzIG9wZW4uIgorI34gbXNnc3RyICJEaXNwb3ppdGl2aSDDq3NodMOrIGkgaGFwdXIuIgorCisjfiBtc2dpZCAiRGV2aWNlIGlzIG5vdCBvcGVuLiIKKyN+IG1zZ3N0ciAiRGlzcG96aXRpdmkgbnVrIMOrc2h0w6sgaGFwdXIuIgorCisjfiBtc2dpZCAiTm8gZGV2aWNlIHNwZWNpZmllZC4iCisjfiBtc2dzdHIgIk51ayDDq3NodMOrIHDDq3JjYWt0dWFyIGFzbmrDqyBkaXNwb3ppdGl2LiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBjbG9zZSB2ZnMgZmlsZSBcIiVzXCIuIgorI34gbXNnc3RyICJFIHBhbXVuZHVyIG1ieWxsamEgZSBmaWxlIHZmcyBcIiVzXCIuIgorCisjfiBtc2dpZCAiTm8gZmlsZW5hbWUgZ2l2ZW4iCisjfiBtc2dzdHIgIk51ayDDq3NodMOrIGRow6tuw6sgYXNuasOrIGVtw6tyIGZpbGUiCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiB2ZnMgZmlsZSBcIiVzXCIgZm9yIHdyaXRpbmc6ICVzLiIKKyN+IG1zZ3N0ciAiRSBwYW11bmR1ciBoYXBqYSBlIGZpbGUgdmZzIFwiJXNcIiBww6tyIHNoa3JpbTogJXMuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk5vIGZpbGVuYW1lIGdpdmVuLiIKKyN+IG1zZ3N0ciAiTnVrIMOrc2h0w6sgZGjDq27DqyBhc25qw6sgZW3Dq3IgZmlsZSIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIHZmcyBmaWxlIFwiJXNcIiBmb3IgcmVhZGluZy4iCisjfiBtc2dzdHIgIkUgcGFtdW5kdXIgaGFwamEgZSBmaWxlIHZmcyBcIiVzXCIgcMOrciBsZXhpbS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgXCIlc1wiIGZvciByZWFkaW5nLiIKKyN+IG1zZ3N0ciAiRSBwYW11bmR1ciBoYXBqYSBlIGRpc3Bveml0aXZpdCBcIiVzXCIgcMOrciBsZXhpbS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgXCIlc1wiIGZvciB3cml0aW5nLiIKKyN+IG1zZ3N0ciAiRSBwYW11bmR1ciBoYXBqYSBlIGRpc3Bveml0aXZpdCBcIiVzXCIgcMOrciBzaGtyaW0uIgorCisjfiBtc2dpZCAiRGV2aWNlIFwiJXNcIiBkb2VzIG5vdCBleGlzdC4iCisjfiBtc2dzdHIgIkRpc3Bveml0aXZpIFwiJXNcIiBudWsgZWt6aXN0b24uIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGFjY2VzcyBkZXZpY2UgXCIlc1wiLCBjaGVjayBpdHMgcGVybWlzc2lvbnMuIgorI34gbXNnc3RyICIiCisjfiAiRSBwYW11bmR1ciBmdXRqYSBuw6sgZGlzcG96aXRpdmluIFwiJXNcIiwga29udHJvbGxvIHTDqyBkcmVqdGF0IGUgdGlqLiIKKworI34gbXNnaWQgIk9TUyBkZXZpY2UgXCIlc1wiIGlzIGFscmVhZHkgaW4gdXNlIGJ5IGFub3RoZXIgcHJvZ3JhbS4iCisjfiBtc2dzdHIgIiIKKyN+ICJEaXNwb3ppdGl2aSBPU1MgXCIlc1wiIMOrc2h0w6sgZHVrZSB1IHDDq3Jkb3J1ciBuZ2EgbmrDqyB0amV0w6tyIHByb2dyYW0uIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGNsb3NlIHZpZGVvIGRldmljZSBcIiVzXCIuIgorI34gbXNnc3RyICJFIHBhbXVuZHVyIG1ieWxsamEgZSBkaXNwb3ppdGl2aXQgdmlkZW8gXCIlc1wiLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIHZpZGVvIGRldmljZSBcIiVzXCIgZm9yIHdyaXRpbmcuIgorI34gbXNnc3RyICJFIHBhbXVuZHVyIGhhcGphIGUgZGlzcG96aXRpdml0IHZpZGVvIFwiJXNcIiBww6tyIHNoa3JpbS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgc2V0IGF1ZGlvIGRldmljZSBcIiVzXCIgdG8gJWQgSHouIgorI34gbXNnc3RyICJJIHBhbXVuZHVyIHJyZWd1bGxpbWkgaSBkaXNwb3ppdGl2aXQgYXVkaW8gXCIlc1wiIG7DqyAlZCBIei4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgY29uZmlndXJlIGF1ZGlvIGRldmljZSBcIiVzXCIuIgorI34gbXNnc3RyICJJIHBhbXVuZHVyIGtvbmZpZ3VyaW1pIGkgZGlzcG96aXRpdml0IHTDqyB6w6tyaXQgXCIlc1wiLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGNvbnRyb2wgZGV2aWNlIFwiJXNcIiBmb3Igd3JpdGluZy4iCisjfiBtc2dzdHIgIkUgcGFtdW5kdXIgaGFwamEgZSBkaXNwb3ppdGl2aXQgdMOrIGtvbnRyb2xsaXQgXCIlc1wiIHDDq3Igc2hrcmltLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlIFwiJXNcIi4iCisjfiBtc2dzdHIgIkkgcGFtdW5kdXIgc2hrcmltaSB0ZWsgZmlsZSBcIiVzXCIuIgorCisjfiBtc2dpZCAiTm8gZmlsZW5hbWUgc3BlY2lmaWVkLiIKKyN+IG1zZ3N0ciAiTnVrIMOrc2h0w6sgcMOrcmNha3R1YXIgZW1yaSBpIGZpbGUuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gZmlsZSBcIiVzXCIgZm9yIHJlYWRpbmcuIgorI34gbXNnc3RyICJFIHBhbXVuZHVyIGhhcGphIGUgZmlsZSBcIiVzXCIgcMOrciBsZXhpbS4iCisKKyN+IG1zZ2lkICJFcnJvciBjbG9zaW5nIGZpbGUgXCIlc1wiLiIKKyN+IG1zZ3N0ciAiR2FiaW0gZ2phdMOrIG1ieWxsamVzIHPDqyBmaWxlIFwiJXNcIi4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBmaWxlIFwiJXNcIiBmb3Igd3JpdGluZy4iCisjfiBtc2dzdHIgIkUgcGFtdW5kdXIgaGFwamEgZSBmaWxlIFwiJXNcIiBuw6sgc2hrcmltLiIKZGlmZiAtLWdpdCBhL3BvL3NyLnBvIGIvcG8vc3IucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkMjQ5YgotLS0gL2Rldi9udWxsCisrKyBiL3BvL3NyLnBvCkBAIC0wLDAgKzEsNDM0IEBACisjIFNlcmJpYW4gdHJhbnNsYXRpb24gb2YgZ3N0LXBsdWdpbnMKKyMgQ29weXJpZ2h0IChDKSAyMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ3N0LXBsdWdpbnMtZ29vZCBwYWNrYWdlLgorIyBEYW5pbG8gU2VnYW4gPGRzZWdhbkBnbXgubmV0PiwgMjAwNC4KKyMg0JzQuNGA0L7RgdC70LDQsiDQndC40LrQvtC70LjRmyA8bWlyb3NsYXZuaWtvbGljQHJvY2tldG1haWwuY29tPiwgMjAxMeKAlDIwMTYuCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kLTEuNy4yXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTYtMDMtMDUgMDk6NTIrMDIwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjog0JzQuNGA0L7RgdC70LDQsiDQndC40LrQvtC70LjRmyA8bWlyb3NsYXZuaWtvbGljQHJvY2tldG1haWwuY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IFNlcmJpYW4gPChub3RoaW5nKT5cbiIKKyJMYW5ndWFnZTogc3JcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTM7IHBsdXJhbD0obiUxMD09MSAmJiBuJTEwMCE9MTEgPyAwIDogbiUxMD49MiAmJiBuIgorIiUxMDw9NCAmJiAobiUxMDA8MTAgfHwgbiUxMDA+PTIwKSA/IDEgOiAyKTtcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAi0J3QuNGB0LDQvCDQv9GA0L7QvdCw0YjQsNC+INGB0LXRgNCy0LXRgCDRg9GC0LjRh9C90LjRhtC1IgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICLQndC40YHQsNC8INGD0YHQv9C10L4g0LTQsCDQtNC10LrQvtC00LjRgNCw0Lwg0IjQn9CV0JMg0YHQu9C40LrRgyIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAi4oCeJXPigJwg0LjQt9Cy0L7QtNC4IOKAniVz4oCcIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICLQndC1INC80L7Qs9GDINC00LAg0YHQtSDQv9C+0LLQtdC20LXQvCDRgdCwINGB0LXRgNCy0LXRgNC+0LwiCisKK21zZ2lkICJObyBVUkwgc2V0LiIKK21zZ3N0ciAi0J3QuNGY0LUg0L/QvtC00LXRiNC10L3QsCDQsNC00YDQtdGB0LAuIgorCittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICLQndC1INC80L7Qs9GDINC00LAg0YDQtdGI0LjQvCDQvdCw0LfQuNCyINGB0LXRgNCy0LXRgNCwLiIKKworbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICLQndC1INC80L7Qs9GDINC00LAg0YPRgdC/0L7RgdGC0LDQstC40Lwg0LLQtdC30YMg0YHQsCDRgdC10YDQstC10YDQvtC8LiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgItCf0L7QtNC10YjQsNCy0LDRmtC1INCx0LXQt9Cx0LXQtNC90LUg0LLQtdC30LUg0L3QuNGY0LUg0YPRgdC/0LXQu9C+LiIKKworbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgItCU0L7RiNC70L4g0ZjQtSDQtNC+INCz0YDQtdGI0LrQtSDQvdCwINC80YDQtdC20LgsINC40LvQuCDRmNC1INGB0LXRgNCy0LXRgCDQvdC10L7Rh9C10LrQuNCy0LDQvdC+INC30LDRgtCy0L7RgNC40L4g0LLQtdC30YMuIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICLQodC10YDQstC10YAg0ZjQtSDQv9C+0YHQu9Cw0L4g0LvQvtGI0LUg0L/QvtC00LDRgtC60LUuIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgItCh0LXRgNCy0LXRgCDQvdC1INC/0L7QtNGA0LbQsNCy0LAg0L/QvtC30LjRhtC40L7QvdC40YDQsNGa0LUuIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICLQo9C70LDQt9C90L7QsyDQt9Cy0YPQutCwINC90LXQvNCwINC40LvQuCDRmNC1INC90LXQuNGB0L/RgNCw0LLQsNC9LCDQkNCS0Jgg0YLQvtC6INGb0LUg0LHQuNGC0Lgg0L7RiNGC0LXRm9C10L0uIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICLQntCy0LAg0LTQsNGC0L7RgtC10LrQsCDQvdC1INGB0LDQtNGA0LbQuCDRgtC+0LrQvtCy0LUg0LfQsCDQv9GD0YjRgtCw0ZrQtS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgItCe0LLQsCDQtNCw0YLQvtGC0LXQutCwINGY0LUg0L3QtdC40YHQv9GA0LDQstC90LAg0Lgg0L3QtSDQvNC+0LbQtSDQsdC40YLQuCDQv9GD0YjRgtC10L3QsC4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiIgorItCd0LUg0LzQvtCz0YMg0LTQsCDQv9GD0YHRgtC40Lwg0YLQvtC6INC30LDRgtC+INGI0YLQviDRmNC1INGI0LjRhNGA0L7QstCw0L0g0KPQlNCfLdC+0Lwg4oCe0KHQv9GA0LXQvNCw0L0g0LfQsCDQv9GD0YjRgtCw0ZrQteKAnC4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgItCe0LLQsCDQtNCw0YLQvtGC0LXQutCwINGY0LUg0L7RiNGC0LXRm9C10L3QsCDQuCDQvdC1INC80L7QttC1INCx0LjRgtC4INC/0YPRiNGC0LXQvdCwLiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAi0J3QtdC40YHQv9GA0LDQstC90LAg0LLQtdC70LjRh9C40L3QsCDQsNGC0L7QvNCwLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAi0J7QstCwINC00LDRgtC+0YLQtdC60LAg0ZjQtSDQvdC10L/QvtGC0L/Rg9C90LAg0Lgg0L3QtSDQvNC+0LbQtSDQsdC40YLQuCDQv9GD0YjRgtC10L3QsC4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgItCS0LjQtNC10L4g0YMg0L7QstC+0Zgg0LTQsNGC0L7RgtC10YbQuCDQvNC+0LbQtNCwINC90LXRm9C1INCx0LjRgtC4INC/0YPRiNGC0LXQvSDQuNGB0L/RgNCw0LLQvdC+LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICLQntCy0LAg0LTQsNGC0L7RgtC10LrQsCDRgdCw0LTRgNC20Lgg0L/RgNC10LLQuNGI0LUg0YLQvtC60L7QstCwLiDQn9GD0YjRgtCw0Lwg0YHQsNC80L4g0L/RgNCy0LggJWQiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorItCd0LjRmNC1INC/0YDQvtC90LDRktC10L0g0L3QuNGY0LXQtNCw0L0g0L/QvtC00YDQttCw0L3QuCDRgtC+0LouINCc0L7QttC00LAg0ZvQtdGC0LUg0LzQvtGA0LDRgtC4INC00LAg0LjQvdGB0YLQsNC70LjRgNCw0YLQtSAiCisi0L/RgNC40LrRmdGD0YfQsNC6INCg0KLQodCfINC/0YDQvtGI0LjRgNC10ZrQsCDQk9GB0YLRgNC40LzQtdGA0LAg0LfQsCDRgtC+0LrQvtCy0LUg0KHRgtCy0LDRgNC90L7QsyDQvNC10LTQuNGY0LAuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisi0J3QuNGY0LUg0L/RgNC+0L3QsNGS0LXQvSDQvdC40ZjQtdC00LDQvSDQv9C+0LTRgNC20LDQvdC4INGC0L7Qui4g0JzQvtC20LTQsCDRm9C10YLQtSDQvNC+0YDQsNGC0Lgg0LTQsCDQvtC80L7Qs9GD0ZvQuNGC0LUg0LLQuNGI0LUgIgorItC/0YDQvtGC0L7QutC+0LvQsCDQv9GA0LXQvdC+0YHQsCDQuNC70Lgg0LzQvtC20LTQsCDQvdCwINC90LXQutC4INC00YDRg9Cz0Lgg0L3QsNGH0LjQvSDQvdC10LTQvtGB0YLQsNGY0LUg0L/RgNCw0LLQuCDQv9GA0LjQutGZ0YPRh9Cw0LogIgorItCg0KLQodCfINC/0YDQvtGI0LjRgNC10ZrQsCDQk9Ch0YLRgNC40LzQtdGA0LAuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorItCd0LUg0LzQvtCz0YMg0LTQsCDQv9C+0LrRgNC10L3QtdC8INC30LLRg9GH0L3QuCDRg9GA0LXRktCw0Zgg0YDQsNC00Lgg0L/Rg9GI0YLQsNGa0LAuINCj0YDQtdGS0LDRmCDQutC+0YDQuNGB0YLQuCDQvdC10LrQsCDQtNGA0YPQs9CwICIKKyLQsNC/0LvQuNC60LDRhtC40ZjQsC4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorItCd0LUg0LzQvtCz0YMg0LTQsCDQv9C+0LrRgNC10L3QtdC8INCw0YPQtNC40L4g0YPRgNC10ZLQsNGYINGA0LDQtNC4INC/0YPRiNGC0LDRmtCwLiDQndC10LzQsNGC0LUg0L7QstC70LDRiNGb0LXRmtC1INC30LAg0L/QvtC60YDQtdGC0LDRmtC1ICIKKyLRg9GA0LXRktCw0ZjQsC4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAi0J3QtSDQvNC+0LPRgyDQtNCwINC/0L7QutGA0LXQvdC10Lwg0LfQstGD0YfQvdC4INGD0YDQtdGS0LDRmCDRgNCw0LTQuCDQv9GD0YjRgtCw0ZrQsC4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisi0J3QtSDQvNC+0LPRgyDQtNCwINC/0L7QutGA0LXQvdC10Lwg0LfQstGD0YfQvdC4INGD0YDQtdGS0LDRmCDRgNCw0LTQuCDQv9GD0YjRgtCw0ZrQsC4g0J7QstC+INC40LfQtNCw0ZrQtSDRgdC40YHRgtC10LzQsCDQvtGC0LLQvtGA0LXQvdC+0LMgIgorItC30LLRg9C60LAg0L3QuNGY0LUg0L/QvtC00YDQttCw0L3QviDQvtCy0LjQvCDQtdC70LXQvNC10L3RgtC+0LwuIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgItCf0YPRiNGC0LDRmtC1INC90LjRmNC1INC/0L7QtNGA0LbQsNC90L4g0L7QtCDRgdGC0YDQsNC90LUg0L7QstC+0LMg0LfQstGD0YfQvdC+0LMg0YPRgNC10ZLQsNGY0LAuIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICLQk9GA0LXRiNC60LAg0L/RgNC40LvQuNC60L7QvCDQv9GD0YjRgtCw0ZrQsCDQt9Cy0YPQutCwLiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAi0KHQvdC40LzQsNGa0LUg0L3QuNGY0LUg0L/QvtC00YDQttCw0L3QviDQvtC0INGB0YLRgNCw0L3QtSDQvtCy0L7QsyDQt9Cy0YPRh9C90L7QsyDRg9GA0LXRktCw0ZjQsC4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLQk9GA0LXRiNC60LAg0L/RgNC40LvQuNC60L7QvCDRgdC90LjQvNCw0ZrQsCDRgdCwINC30LLRg9GH0L3QvtCzINGD0YDQtdGS0LDRmNCwLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorItCd0LUg0LzQvtCz0YMg0LTQsCDQv9C+0LrRgNC10L3QtdC8INCw0YPQtNC40L4g0YPRgNC10ZLQsNGYINGA0LDQtNC4INGB0L3QuNC80LDRmtCwLiDQndC10LzQsNGC0LUg0L7QstC70LDRiNGb0LXRmtC1INC30LAg0L/QvtC60YDQtdGC0LDRmtC1ICIKKyLRg9GA0LXRktCw0ZjQsC4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgItCd0LUg0LzQvtCz0YMg0LTQsCDQv9C+0LrRgNC10L3QtdC8INC30LLRg9GH0L3QuCDRg9GA0LXRktCw0Zgg0YDQsNC00Lgg0YHQvdC40LzQsNGa0LAuIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgItCd0LjRgdCw0Lwg0L3QsNGI0LDQviDQutGZ0YPRh9C90Lgg0YPRgNC10ZLQsNGYINC30LLRg9C60LAiCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgItCd0LUg0LzQvtCz0YMg0LTQsCDQvtGC0LLQvtGA0LjQvCDQutGZ0YPRh9C90Lgg0YPRgNC10ZLQsNGYINC30LLRg9C60LAiCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICLQmNC30LLQvtGAINGB0L3QuNC80LDRmtCwIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAi0JzQuNC60YDQvtGE0L7QvSIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgItCb0LjQvdC40ZjRgdC60Lgg0YPQu9Cw0LciCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAi0KPQvdGD0YLRgNCw0YjRmtC4INCm0JQiCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAi0KHQn9CU0JjQpCDRg9C70LDQtyIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICLQkNCj0KUgMSDRg9C70LDQtyIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICLQkNCj0KUgMiDRg9C70LDQtyIKKworbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICLQn9C+0LLRgNCw0YLQvdCwINC/0LXRgtGZ0LAg0LrQvtC00LXQutCwIgorCittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICLQn9C+0LLRgNCw0YLQvdCwINC/0LXRgtGZ0LAg0KHQsNC90JLQotChLdCwIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICLQiNCw0YfQuNC90LAg0LfQstGD0LrQsCIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgItCf0L7RmNCw0YfQsNGa0LUiCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICLQn9GA0LDRm9C10ZrQtSIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgItCj0LPRgNCw0ZLQtdC90Lgg0LfQstGD0YfQvdC40LoiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgItCh0LvRg9GI0LDQu9C40YbQtSIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICLQm9C40L3QuNGY0YHQutC4INC40LfQu9Cw0LciCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgItCh0J/QlNCY0KQg0LjQt9C70LDQtyIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAi0JDQo9ClIDEg0LjQt9C70LDQtyIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAi0JDQo9ClIDIg0LjQt9C70LDQtyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIgorbXNnc3RyICLQk9GA0LXRiNC60LAg0L/RgNC40LvQuNC60L7QvCDRh9C40YLQsNGa0LAgJWQg0LHQsNGY0YLQvtCy0LAg0YHQsCDRg9GA0LXRktCw0ZjQsCDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIiIKKyLQndC40YHQsNC8INGD0YHQv9C10L4g0LTQsCDQvdGD0LzQtdGA0LjRiNC10Lwg0LzQvtCz0YPRm9C4INGD0YDQtdGS0LDRmCDQt9Cw0L/QuNGB0LAg0YHQvdC40LzQutCwIOKAniVz4oCcINGB0LAg0LrQvtGY0LjQvCDQvNC+0LbQtSDQtNCwICIKKyLRgNCw0LTQuCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAi0J3QtSDQvNC+0LPRgyDQtNCwINC80LDQv9C40YDQsNC8INC/0L7QvNC+0ZvQvdC1INC80LXQvNC+0YDQuNGY0LUg0YHQsCDRg9GA0LXRktCw0ZjQsCDigJ4lc+KAnCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAi0KPQv9GA0LDQstGZ0LDRh9C60Lgg0L/RgNC+0LPRgNCw0Lwg0YPRgNC10ZLQsNGY0LAg4oCeJXPigJwg0L3QtSDQv9C+0LTRgNC20LDQstCwINCj0Jgg0L3QsNGH0LjQvSAlZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgItCj0L/RgNCw0LLRmdCw0YfQutC4INC/0YDQvtCz0YDQsNC8INGD0YDQtdGS0LDRmNCwIOKAniVz4oCcINC90LUg0L/QvtC00YDQttCw0LLQsCDQvdC40ZjQtdC00LDQvSDQv9C+0LfQvdCw0YLQuCDQo9CYINC90LDRh9C40L0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgItCj0YDQtdGS0LDRmCDigJ4lc+KAnCDRmNC1INC30LDRg9C30LXRgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAi0KPRgNC10ZLQsNGYIOKAniVz4oCcINC90LUg0LzQvtC20LUg0LTQsCDRgdC90LjQvNCwINC90LAgJWR4JWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgItCj0YDQtdGS0LDRmCDigJ4lc+KAnCDQvdC1INC80L7QttC1INC00LAg0YHQvdC40LzQsCDRgyDQvdCw0LLQtdC00LXQvdC+0Lwg0LfQsNC/0LjRgdGDIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgItCj0YDQtdGS0LDRmCDigJ4lc+KAnCDQvdC1INC/0L7QtNGA0LbQsNCy0LAg0L3QtS3QvdC10L/RgNC10LrQuNC00L3QtSDRgNCw0LLQvdC4IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAi0J3QtSDQvNC+0LPRgyDQtNCwINC00L7QsdCw0LLQuNC8INC/0LDRgNCw0LzQtdGC0YDQtSDQvdCwINGD0YDQtdGS0LDRmNGDIOKAniVz4oCcIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICLQktC40LTQtdC+INGD0YDQtdGS0LDRmCDQvdC1INC/0YDQuNGF0LLQsNGC0LAg0L3QvtCy0LUg0L/QvtGB0YLQsNCy0LrQtSDQv9GA0L7RgtC+0LrQsCDQutCw0LTRgNC+0LLQsC4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICLQktC40LTQtdC+INGD0YDQtdGS0LDRmCDQvdC1INC+0LHQtdC30LHQtdGS0YPRmNC1INC40LfQu9Cw0LfQvdC4INC30LDQv9C40YEuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgItCS0LjQtNC10L4g0YPRgNC10ZLQsNGYINGY0LUg0LLRgNCw0YLQuNC+INC90LXQuNGB0L/RgNCw0LLQvdC1INC00LjQvNC10L3Qt9C40ZjQtS4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAi0JLQuNC00LXQviDRg9GA0LXRktCw0ZjQuCDQutC+0YDQuNGB0YLQtSDQvdC10L/QvtC00YDQttCw0L3QuCDQvNC10YLQvtC0INC/0YDQtdC/0LvQuNGC0LDRmtCwLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICLQktC40LTQtdC+INGD0YDQtdGS0LDRmNC4INC60L7RgNC40YHRgtC1INC90LXQv9C+0LTRgNC20LDQvdC4INC30LDQv9C40YEg0YHQu9C40YfQuNGG0LUuIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgItCd0LjRgdCw0Lwg0YPRgdC/0LXQviDQtNCwINC/0L7QtNC10YHQuNC8INGD0L3Rg9GC0YDQsNGI0ZrQuCDRgdC80LXRiNGC0LDRmCDQvNC10ZLRg9C80LXQvNC+0YDQuNGY0LUuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICLQktC40LTQtdC+INGD0YDQtdGS0LDRmCDQvdC1INC/0YDQtdC00LvQsNC20LUg0LLQtdC70LjRh9C40L3RgyDQvNC10ZLRg9C80LXQvNC+0YDQuNGY0LUuIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAi0J3QtdC80LAg0YHQvNC10YjRgtCw0ZjQsCDQtNC+0ZrQtdCzINGC0L7QutCwINC40Lcg0LrQvtCz0LAg0YPQstC10YHRgtC4LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J3QuNGB0LDQvCDRg9GB0L/QtdC+INC00LAg0LTQvtCx0LDQstC40Lwg0L/QvtC00LXRiNCw0LLQsNGa0LAg0YLRmNGD0L3QtdGA0LAgJWQg0L3QsCDRg9GA0LXRktCw0ZjRgyDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0JPRgNC10YjQutCwINC00L7QsdCw0LLRmdCw0ZrQsCDQvNC+0LPRg9Gb0L3QvtGB0YLQuCDQt9CwINGD0YDQtdGS0LDRmCDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICLQo9GA0LXRktCw0Zgg4oCeJXPigJwg0L3QuNGY0LUg0YLRmNGD0L3QtdGALiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgItCd0LjRgdCw0Lwg0YPRgdC/0LXQviDQtNCwINC00L7QsdCw0LLQuNC8INGA0LDQtNC40L4g0YPQu9Cw0Lcg0L3QsCDRg9GA0LXRktCw0ZjRgyDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICLQndC40YHQsNC8INGD0YHQv9C10L4g0LTQsCDQv9C+0LTQtdGB0LjQvCDRg9C70LDQtyAlZCDQvdCwINGD0YDQtdGS0LDRmNGDICVzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J3QuNGB0LDQvCDRg9GB0L/QtdC+INC00LAg0LjQt9C80LXQvdC40Lwg0YHRgtCw0ZrQtSDRg9GC0LjRiNCw0L3QvtGB0YLQuCDQt9CwINGD0YDQtdGS0LDRmCDigJ4lc+KAnC4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgItCd0LjRgdCw0Lwg0YPRgdC/0LXQviDQtNCwINC00L7QtNC10LvQuNC8INC30LDRgtGA0LDQttC10L3RgyDQvNC10LzQvtGA0LjRmNGDLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICLQndC40YHQsNC8INGD0YHQv9C10L4g0LTQsCDQtNC+0LTQtdC70LjQvCDQt9Cw0YLRgNCw0LbQtdC90YMg0LzQtdC80L7RgNC40ZjRgy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAi0J/RgNC10YLQstCw0YDQsNGHINC90LAg0YPRgNC10ZLQsNGY0YMg4oCeJXPigJwg0L3QtdC80LAg0L/QvtC00YDQttCw0L3QuCDRg9C70LDQt9C90Lgg0LfQsNC/0LjRgSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAi0J/RgNC10YLQstCw0YDQsNGHINC90LAg0YPRgNC10ZLQsNGY0YMg4oCeJXPigJwg0L3QtdC80LAg0L/QvtC00YDQttCw0L3QuCDQuNC30LvQsNC30L3QuCDQt9Cw0L/QuNGBIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICLQmtC+0LTQtdGAINC90LAg0YPRgNC10ZLQsNGY0YMg4oCeJXPigJwg0L3QtdC80LAg0L/QvtC00YDQttCw0L3QuCDRg9C70LDQt9C90Lgg0LfQsNC/0LjRgSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgItCa0L7QtNC10YAg0L3QsCDRg9GA0LXRktCw0ZjRgyDigJ4lc+KAnCDQvdC10LzQsCDQv9C+0LTRgNC20LDQvdC4INC40LfQu9Cw0LfQvdC4INC30LDQv9C40YEiCisKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAi0J3QuNGB0LDQvCDRg9GB0L/QtdC+INC00LAg0L/QvtC60YDQtdC90LXQvCDQvdC40YIg0LTQtdC60L7QtNC40YDQsNGa0LAuIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICLQndC40YHQsNC8INGD0YHQv9C10L4g0LTQsCDQvtCx0YDQsNC00LjQvCDQutCw0LTQsNGALiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyLQk9GA0LXRiNC60LAg0L/RgNC40LvQuNC60L7QvCDQtNC+0LHQsNCy0ZnQsNGa0LAg0LzQvtCz0YPRm9C90L7RgdGC0Lgg0LfQsCDRg9GA0LXRktCw0Zgg4oCeJXPigJw6INCd0LjRmNC1INCyNNC7MiDRg9C/0YDQsNCy0ZnQsNGH0LrQuCAiCisi0L/RgNC+0LPRgNCw0LwuINCf0YDQvtCy0LXRgNC40YLQtSDQtNCwINC70Lgg0ZjQtSDRgtC+INCyNNC7MSDRg9C/0YDQsNCy0ZnQsNGH0LrQuCDQv9GA0L7Qs9GA0LDQvC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICLQndC40YHQsNC8INGD0YHQv9C10L4g0LTQsCDQv9GA0L7Qv9C40YLQsNC8INGB0LLQvtGY0YHRgtCy0LAg0YPQvdC+0YHQsCAlZCDRgyDRg9GA0LXRktCw0ZjRgyAlcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICLQndC40YHQsNC8INGD0YHQv9C10L4g0LTQsCDQtNC+0LHQsNCy0LjQvCDQv9C+0LTQtdGI0LDQstCw0ZrQsCDRgtGY0YPQvdC10YDQsCAlZCDQvdCwINGD0YDQtdGS0LDRmNGDIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LjRgdCw0Lwg0YPRgdC/0LXQviDQtNCwINC/0YDQvtC/0LjRgtCw0Lwg0L3QvtGA0LzRgyDQvdCwINGD0YDQtdGS0LDRmNGDIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J3QuNGB0LDQvCDRg9GB0L/QtdC+INC00LAg0LTQvtCx0LDQstC40Lwg0YHQstC+0ZjRgdGC0LLQsCDQutC+0L3RgtGA0L7Qu9CwINC90LAg0YPRgNC10ZLQsNGY0YMg4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LUg0LzQvtCz0YMg0LTQsCDRgNCw0YHQv9C+0LfQvdCw0Lwg0YPRgNC10ZLQsNGYIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICLQntCy0L4g0L3QuNGY0LUg0YPRgNC10ZLQsNGYIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgItCd0LUg0LzQvtCz0YMg0LTQsCDQv9C+0LrRgNC10L3QtdC8INGD0YDQtdGS0LDRmCDigJ4lc+KAnCDRgNCw0LTQuCDRh9C40YLQsNGa0LAg0Lgg0YPQv9C40YHQsC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICLQo9GA0LXRktCw0Zgg4oCeJXPigJwg0L3QuNGY0LUg0YPRgNC10ZLQsNGYINC30LAg0YHQvdC40LzQsNGa0LUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICLQo9GA0LXRktCw0Zgg4oCeJXPigJwg0L3QuNGY0LUg0LjQt9C70LDQt9C90Lgg0YPRgNC10ZLQsNGYLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAi0KPRgNC10ZLQsNGYIOKAniVz4oCcINC90LjRmNC1INCcMtCcINGD0YDQtdGS0LDRmC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgItCd0LUg0LzQvtCz0YMg0LTQsCDRg9C00LLQvtGB0YLRgNGD0YfQuNC8INGD0YDQtdGS0LDRmCDigJ4lc+KAnCDRgNCw0LTQuCDRh9C40YLQsNGa0LAg0Lgg0YPQv9C40YHQsC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LjRgdCw0Lwg0YPRgdC/0LXQviDQtNCwINC/0L7QtNC10YHQuNC8INC90L7RgNC80YMg0LfQsCDRg9GA0LXRktCw0Zgg4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J3QuNGB0LDQvCDRg9GB0L/QtdC+INC00LAg0LTQvtCx0LDQstC40Lwg0YLQtdC60YPRm9GDINGD0YfQtdGB0YLQsNC90L7RgdGCINGC0ZjRg9C90LXRgNCwINC30LAg0YPRgNC10ZLQsNGYIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisi0J3QuNGB0LDQvCDRg9GB0L/QtdC+INC00LAg0L/QvtC00LXRgdC40Lwg0YLQtdC60YPRm9GDINGD0YfQtdGB0YLQsNC90L7RgdGCINGC0ZjRg9C90LXRgNCwINC30LAg0YPRgNC10ZLQsNGYIOKAniVz4oCcINC90LAgJWx1IEh6LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLQndC40YHQsNC8INGD0YHQv9C10L4g0LTQsCDQtNC+0LHQsNCy0LjQvCDRmNCw0YfQuNC90YMg0YHQuNCz0L3QsNC70LAg0LfQsCDRg9GA0LXRktCw0Zgg4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICLQndC40YHQsNC8INGD0YHQv9C10L4g0LTQsCDQtNC+0LHQsNCy0LjQvCDQstGA0LXQtNC90L7RgdGCINC30LAg0LrQvtC90YLRgNC+0LvRgyAlZCDQvdCwINGD0YDQtdGS0LDRmNGDIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J3QuNGB0LDQvCDRg9GB0L/QtdC+INC00LAg0L/QvtC00LXRgdC40Lwg0LLRgNC10LTQvdC+0YHRgiAlZCDQt9CwINC60L7QvdGC0YDQvtC70YMgJWQg0L3QsCDRg9GA0LXRktCw0ZjRgyDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyLQndC40YHQsNC8INGD0YHQv9C10L4g0LTQsCDQtNC+0LHQsNCy0LjQvCDRgtC10LrRg9Gb0Lgg0YPQu9Cw0Lcg0L3QsCDRg9GA0LXRktCw0ZjRgyDigJ4lc+KAnC4g0JzQvtC20LTQsCDRmNC1INGC0L4g0YDQsNC00LjQviDRg9GA0LXRktCw0ZguIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyLQndC40YHQsNC8INGD0YHQv9C10L4g0LTQsCDQtNC+0LHQsNCy0LjQvCDRgtC10LrRg9Gb0Lgg0LjQt9C70LDQtyDQvdCwINGD0YDQtdGS0LDRmNGDIOKAniVz4oCcLiDQnNC+0LbQtNCwINGY0LUg0YLQviDRgNCw0LTQuNC+ICIKKyLRg9GA0LXRktCw0ZguIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgItCd0LjRgdCw0Lwg0YPRgdC/0LXQviDQtNCwINC/0L7QtNC10YHQuNC8INC40LfQu9Cw0LcgJWQg0L3QsCDRg9GA0LXRktCw0ZjRgyAlcy4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICLQn9GA0L7QvNC10L3QsCDRgNC10LfQvtC70YPRhtC40ZjQtSDQv9GA0LjQu9C40LrQvtC8INC40LfQstGA0YjQsNCy0LDRmtCwINGY0L7RiCDRg9Cy0LXQuiDQvdC40ZjQtSDQv9C+0LTRgNC20LDQvdCwLiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAi0J3QtSDQvNC+0LPRgyDQtNCwINGA0LDQtNC40Lwg0LHQtdC3INGB0LDRgtCwIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBzdHJlYW0gZXJyb3IuIgorI34gbXNnc3RyICLQo9C90YPRgtGA0LDRiNGa0LAg0LPRgNC10YjQutCwINGC0L7QutCwINC/0L7QtNCw0YLQsNC60LAuIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAi0KPQvdGD0YLRgGHRiNGa0LAg0LPRgNC10YjQutCwINC/0YDQvtGC0L7QutCwINC/0L7QtNCw0YLQsNC60LAuIgorCisjfiBtc2dpZCAiRGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBjYXB0dXJlIgorI34gbXNnc3RyICLQo9GA0LXRktCw0Zgg4oCeJXPigJwg0L3QtSDQv9C+0LTRgNC20LDQstCwINCy0LjQtNC10L4g0YHQvdC40LzQsNGa0LUiCmRpZmYgLS1naXQgYS9wby9zdi5wbyBiL3BvL3N2LnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNzI2MjcKLS0tIC9kZXYvbnVsbAorKysgYi9wby9zdi5wbwpAQCAtMCwwICsxLDQ0MyBAQAorIyBTd2VkaXNoIG1lc3NhZ2VzIGZvciBnc3QtcGx1Z2lucy1nb29kLgorIyBDb3B5cmlnaHQgwqkgMjAwNy0yMDE2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ3N0LXBsdWdpbnMtZ29vZCBwYWNrYWdlLgorIyBDaHJpc3RpYW4gUm9zZSA8bWVudGhvc0BtZW50aG9zLmNvbT4sIDIwMDQuCisjIERhbmllbCBOeWxhbmRlciA8cG9AZGFuaWVsbnlsYW5kZXIuc2U+LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLgorIyBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJyYXNAZ21haWwuY29tPiwgMjAxNCwgMjAxNSwgMjAxNi4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QgMS43LjJcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxNi0wMi0yMCAxNjoxMyswMTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJyYXNAZ21haWwuY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IFN3ZWRpc2ggPHRwLXN2QGxpc3Rvci50cC1zdi5zZT5cbiIKKyJMYW5ndWFnZTogc3ZcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJYLUdlbmVyYXRvcjogUG9lZGl0IDEuOC43XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIkphY2stc2VydmVyIGhpdHRhZGVzIGVqIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICJNaXNzbHlja2FkZXMgbWVkIGF0dCBhdmtvZGEgSlBFRy1iaWxkIgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICJcIiVzXCIgYXYgXCIlc1wiIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJLdW5kZSBpbnRlIGFuc2x1dGEgdGlsbCBzZXJ2ZXJuIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIkluZ2VuIFVSTCBpbnN0w6RsbGQuIgorCittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJLdW5kZSBpbnRlIHNsw6UgdXBwIHNlcnZlcm5hbW5ldC4iCisKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiS3VuZGUgaW50ZSBldGFibGVyYSBhbnNsdXRuaW5nIHRpbGwgc2VydmVybi4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICJTw6RrZXIgYW5zbHV0bmluZyBtaXNzbHlja2FkZXMuIgorCittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiRXR0IG7DpHR2ZXJrc2ZlbCBpbnRyw6RmZmFkZSBlbGxlciBzZXJ2ZXJuIHN0w6RuZ2RlIGFuc2x1dG5pbmdlbiBvdsOkbnRhdC4iCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIlNlcnZlcm4gc2tpY2thZGUgZmVsYWt0aWd0IGRhdGEuIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIlNlcnZlcm4gc3TDtmRlciBpbnRlIHPDtmtuaW5nL3Nwb2xuaW5nLiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAiSW5nZXQgZWxsZXIgb2dpbHRpZ3QgaW5nw6VuZ3NsanVkLiBBVkktc3Ryw7ZtbWVuIGtvbW1lciBhdHQgc2thZGFzLiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAiRGVuIGjDpHIgZmlsZW4gaW5uZWjDpWxsZXIgaW5nYSB1cHBzcGVsbmluZ3NiYXJhIHN0csO2bW1hci4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkRlbiBow6RyIGZpbGVuIMOkciBvZ2lsdGlnIG9jaCBrYW4gaW50ZSBzcGVsYXMgdXBwLiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICJLYW4gZWogc3BlbGEgc3Ryw7ZtIGTDpSBkZW4gw6RyIGtyeXB0ZXJhZCBtZWQgUGxheVJlYWR5IERSTS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkRlbiBow6RyIGZpbGVuIMOkciBza2FkYWQgb2NoIGthbiBpbnRlIHNwZWxhcyB1cHAuIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICJPZ2lsdGlnIGF0b21zdG9ybGVrLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRGVuIGjDpHIgZmlsZW4gw6RyIGludGUgZnVsbHN0w6RuZGlnIG9jaCBrYW4gaW50ZSBzcGVsYXMgdXBwLiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiVmlkZW9uIGkgZGVuIGjDpHIgZmlsZW4ga2Fuc2tlIGludGUga2FuIHNwZWxhcyB1cHAga29ycmVrdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiIgorIkRlbiBow6RyIGZpbGVuIGlubmVow6VsbGVyIGbDtnIgbcOlbmdhIHN0csO2bW1hci4gU3BlbGFyIGVuZGFzdCB1cHAgZGUgZsO2cnN0YSAlZCIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisiSW5nZW4gc3Ryw7ZtIHNvbSBzdMO2ZHMgaGl0dGFkZXMuIER1IGthbnNrZSBiZWjDtnZlciBpbnN0YWxsZXJhIGVuIEdTdHJlYW1lci0iCisiaW5zdGlja3Ntb2R1bCBmw7ZyIFJUU1AgZsO2ciBSZWFsIE1lZGlhLXN0csO2bW1hci4iCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKyJJbmdlbiBzdHLDtm0gc29tIHN0w7ZkcyBoaXR0YWRlcy4gRHUga2Fuc2tlIGJlaMO2dmVyIHRpbGzDpXRhIGZsZXIgIgorInRyYW5zcG9ydHByb3Rva29sbCBlbGxlciBzw6Ugc2FrbmFyIGR1IGthbnNrZSBkZXQgcsOkdHRhIEdTdHJlYW1lci10aWxsw6RnZ2V0ICIKKyJmw7ZyIFJUU1AuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIkt1bmRlIGludGUgw7ZwcG5hIGxqdWRlbmhldGVuIGbDtnIgdXBwc3BlbG5pbmcuIEVuaGV0ZW4gYW52w6RuZHMgYXYgZXR0IGFubmF0ICIKKyJwcm9ncmFtLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiS3VuZGUgaW50ZSDDtnBwbmEgbGp1ZGVuaGV0ZW4gZsO2ciB1cHBzcGVsbmluZy4gRHUgaGFyIGludGUgYmVow7ZyaWdoZXQgYXR0ICIKKyLDtnBwbmEgZW5oZXRlbi4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiS3VuZGUgaW50ZSDDtnBwbmEgbGp1ZGVuaGV0ZW4gZsO2ciB1cHBzcGVsbmluZy4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisiS3VuZGUgaW50ZSDDtnBwbmEgbGp1ZGVuaGV0ZW4gZsO2ciB1cHBzcGVsbmluZy4gRGVubmEgdmVyc2lvbiBhdiBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gc3TDtmRzIGludGUgYXYgZGV0dGEgZWxlbWVudC4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiVXBwc3BlbG5pbmcgc3TDtmRzIGludGUgYXYgZGVubmEgbGp1ZGVuaGV0LiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAiRmVsIHZpZCBsanVkdXBwc3BlbG5pbmcuIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJJbnNwZWxuaW5nIHN0w7ZkcyBpbnRlIGF2IGRlbm5hIGxqdWRlbmhldC4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJGZWwgdmlkIGluc3BlbG5pbmcgZnLDpW4gbGp1ZGVuaGV0ZW4uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiS3VuZGUgaW50ZSDDtnBwbmEgbGp1ZGVuaGV0ZW4gZsO2ciBpbnNwZWxuaW5nLiBEdSBoYXIgaW50ZSBiZWjDtnJpZ2hldCBhdHQgIgorIsO2cHBuYSBlbmhldGVuLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiS3VuZGUgaW50ZSDDtnBwbmEgbGp1ZGVuaGV0ZW4gZsO2ciBpbnNwZWxuaW5nLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICJDb3JlQXVkaW8tZW5oZXQgaGl0dGFkZXMgaW50ZSIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiQ29yZUF1ZGlvLWVuaGV0IGt1bmRlIGludGUgw7ZwcG5hcyIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIkluc3BlbG5pbmdza8OkbGxhIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWlrcm9mb24iCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICJMaW5qZS1JbiIKKworbXNnaWQgIkludGVybmFsIENEIgorbXNnc3RyICJJbnRlcm4gY2Qtc3BlbGFyZSIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJTUERJRiBJbiIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICJBVVggMSBJbiIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJBVVggMiBJbiIKKworbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICJPbWtvZGFyLcOldGVya29wcGxpbmdzc2xpbmdhIgorCittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICJTdW5WVFMtw6V0ZXJrb3BwbGluZ3NzbGluZ2EiCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIlZvbHltIgorCittc2dpZCAiR2FpbiIKK21zZ3N0ciAiRsO2cnN0w6RyayIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIk1vbml0b3IiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJJbmJ5Z2dkIGjDtmd0YWxhcmUiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIkjDtnJsdXIiCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiTGluamUgdXQiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIlNQRElGIHV0IgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICJBVVggMSB1dCIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiQVVYIDIgdXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRmVsIHZpZCBsw6RzbmluZyBhdiAlZCBieXRlIGZyw6VuIGVuaGV0ZW4gXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorIk1pc3NseWNrYWRlcyBtZWQgYXR0IHLDpGtuYSB1cHAgbcO2amxpZ2EgdmlkZW9mb3JtYXQgc29tIGVuaGV0ZW4gXCIlc1wiIGthbiAiCisiYXJiZXRhIG1lZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiS3VuZGUgaW50ZSBtYXBwYSBidWZmZXJ0YXIgZnLDpW4gZW5oZXRlbiBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICJEcml2cnV0aW5lbiBmw7ZyIGVuaGV0ZW4gXCIlc1wiIHN0w7ZkZXIgaW50ZSBJTy1tZXRvZCAlZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIkRyaXZydXRpbmVuIGbDtnIgZW5oZXRlbiBcIiVzXCIgc3TDtmRlciBpbnRlIG7DpWdvbiBrw6RuZCBJTy1tZXRvZC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAiRW5oZXRlbiBcIiVzXCIgw6RyIHVwcHRhZ2VuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICJFbmhldGVuIFwiJXNcIiBrYW4gaW50ZSBmw6VuZ2EgaSAlZHglZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiRW5oZXRlbiBcIiVzXCIga2FuIGludGUgZsOlbmdhIGkgZGV0IGFuZ2l2bmEgZm9ybWF0ZXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiRW5oZXRlbiBcIiVzXCIgc3TDtmRlciBpbnRlIGlja2Uta29udGludWVybGlnYSBwbGFuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiS3VuZGUgaW50ZSBmw6UgdGFnIGkgcGFyYW1ldHJhciBww6UgZW5oZXRlbiBcIiVzXCIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIlZpZGVvZW5oZXRlbiBhY2NlcHRlcmFkZSBpbnRlIG55IGluc3TDpGxsbmluZyBmw7ZyIGJpbGRmcmVrdmVucy4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICJWaWRlb2VuaGV0ZW4gdGlsbGhhbmRhaMO2bGwgaW5nZXQgdXRnw6VuZ3Nmb3JtYXQuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIlZpZGVvZW5oZXRlbiByZXR1cm5lcmFkZSBvZ2lsdGlnYSBkaW1lbnNpb25lci4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiVmlkZW9lbmhldGVyIGFudsOkbmRlciBlbiBzYW1tYW5mbMOkdG5pbmdzbWV0b2Qgc29tIGVqIHN0w7Zkcy4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiVmlkZW9lbmhldGVyIGFudsOkbmRlciBldHQgcGl4ZWwtZm9ybWF0IHNvbSBlaiBzdMO2ZHMuIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIk1pc3NseWNrYWRlcyBtZWQgYXR0IGtvbmZpZ3VyZXJhIGludGVybiBidWZmZXJ0LXBvb2wuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICJWaWRlb2VuaGV0ZW4gZsO2cmVzbG9nIGludGUgbnkgYnVmZmVydHN0b3JsZWsuIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAiSW5nZW4gbmVkc3Ryw7Ztcy1wb29sIGF0dCBpbXBvcnRlcmEgZnLDpW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiTWlzc2x5Y2thZGVzIG1lZCBhdHQgZsOlIHRhZyBpIGluc3TDpGxsbmluZ2FybmEgZsO2ciBtb3R0YWdhcmUgJWQgcMOlIGVuaGV0ZW4gIgorIlwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRmVsIHZpZCBsw6RzbmluZyBhdiBmw7ZybcOlZ29yIGbDtnIgZW5oZXRlbiBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiRW5oZXRlbiBcIiVzXCIgw6RyIGluZ2VuIG1vdHRhZ2FyZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJLdW5kZSBpbnRlIHN0w6RsbGEgaW4gcmFkaW9pbmfDpW5nIHDDpSBlbmhldGVuIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJLdW5kZSBpbnRlIHN0w6RsbGEgaW4gaW5nw6VuZyAlZCBww6UgZW5oZXRlbiAlcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk1pc3NseWNrYWRlcyBtZWQgYXR0IMOkbmRyYSBww6UgbGp1ZGzDtnMtbMOkZ2UgZsO2ciBlbmhldGVuIFwiJXNcIi4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIk1pc3NseWNrYWRlcyBhdHQgYWxsb2tlcmEgYmVnw6RydCBtaW5uZS4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiTWlzc2x5Y2thZGVzIG1lZCBhdHQgYWxsb2tlcmEgYmVnw6RydCBtaW5uZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiS29udmVydG9ybiBww6UgZW5oZXRlbiAlcyBoYXIgaW5nZXQgaW5nw6VuZ3Nmb3JtYXQgc29tIHN0w7ZkcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiS29udmVydG9ybiBww6UgZW5oZXRlbiAlcyBoYXIgaW5nZXQgdXRnw6VuZ3Nmb3JtYXQgc29tIHN0w7ZkcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiS29kYXJlbiBww6UgZW5oZXRlbiAlcyBoYXIgaW5nZXQgaW5nw6VuZ3Nmb3JtYXQgc29tIHN0w7ZkcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIktvZGFyZW4gcMOlIGVuaGV0ZW4gJXMgaGFyIGluZ2V0IHV0Z8OlbmdzZm9ybWF0IHNvbSBzdMO2ZHMiCisKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiTWlzc2x5Y2thZGVzIG1lZCBhdHQgc3RhcnRhIGF2a29kbmluZ3N0csOlZC4iCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIk1pc3NseWNrYWRlcyBhdHQgYmVoYW5kbGEgcmFtLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyJGZWwgdmlkIGzDpHNuaW5nIGF2IGbDtnJtw6Vnb3IgZsO2ciBlbmhldGVuIFwiJXNcIjogRGV0IMOkciBpbnRlIGVuIHY0bDItIgorImRyaXZydXRpbi4gS29udHJvbGxlcmEgb20gZGV0IMOkciBlbiB2NGwxLWRyaXZydXRpbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICJNaXNzbHlja2FkZXMgbWVkIGF0dCBmcsOlZ2EgZWZ0ZXIgYXR0cmlidXQgZsO2ciBpbmfDpW5nICVkIGkgZW5oZXRlbiAlcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiTWlzc2x5Y2thZGVzIG1lZCBhdHQgZsOlIHRhZyBpIGluc3TDpGxsbmluZ2VuIGbDtnIgbW90dGFnYXJlICVkIHDDpSBlbmhldGVuIFwiJXMiCisiXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTWlzc2x5Y2thZGVzIG1lZCBhdHQgZnLDpWdhIGVmdGVyIG5vcm0gcMOlIGVuaGV0ZW4gXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTWlzc2x5Y2thZGVzIG1lZCBhdHQgZsOlIHRhZyBww6Uga29udHJvbGxhdHRyaWJ1dGVuIHDDpSBlbmhldGVuIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS3VuZGUgaW50ZSBpZGVudGlmaWVyYSBlbmhldGVuIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRGV0IGjDpHIgw6RyIGludGUgZW4gZW5oZXQgXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIkt1bmRlIGludGUgw7ZwcG5hIGVuaGV0ZW4gXCIlc1wiIGbDtnIgbMOkc25pbmcgb2NoIHNrcml2bmluZy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICJFbmhldGVuIFwiJXNcIiDDpHIgaW5nZW4gZsOlbmdzdGVuaGV0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiRW5oZXRlbiBcIiVzXCIgw6RyIGluZ2VuIHV0Z8OlbmdzZW5oZXQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICJFbmhldGVuIFwiJXNcIiDDpHIgaW5nZW4gTTJNLWVuaGV0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiS3VuZGUgaW50ZSBkdXBsaWNlcmEgZW5oZXRlbiBcIiVzXCIgZsO2ciBsw6RzbmluZyBvY2ggc2tyaXZuaW5nLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTWlzc2x5Y2thZGVzIG1lZCBhdHQgc3TDpGxsYSBpbiBub3JtIGbDtnIgZW5oZXRlbiBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIk1pc3NseWNrYWRlcyBtZWQgYXR0IGfDpSB0YWcgcMOlIGFrdHVlbGwgbW90dGFnYXJmcmVrdmVucyBmw7ZyIGVuaGV0ZW4gXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisiTWlzc2x5Y2thZGVzIG1lZCBhdHQgc3TDpGxsYSBpbiBha3R1ZWxsIG1vdHRhZ2FyZnJla3ZlbnMgZsO2ciBlbmhldGVuIFwiJXNcIiAiCisidGlsbCAlbHUgSHouIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk1pc3NseWNrYWRlcyBtZWQgYXR0IGbDpSB0YWcgcMOlIHNpZ25hbHN0eXJrYSBmw7ZyIGVuaGV0ZW4gXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIk1pc3NseWNrYWRlcyBtZWQgYXR0IGbDpSB0YWcgcMOlIHbDpHJkZXQgZsO2ciBrb250cm9sbGVuICVkIHDDpSBlbmhldGVuIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkt1bmRlIGludGUgc3TDpGxsYSBpbiB2w6RyZGV0ICVkIGbDtnIga29udHJvbGxlbiAlZCBww6UgZW5oZXRlbiBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiTWlzc2x5Y2thZGVzIG1lZCBhdHQgZsOlIHRhZyBww6UgYWt0dWVsbCBpbmfDpW5nIHDDpSBlbmhldGVuIFwiJXNcIi4gS2FuIHZhcmEgZW4gIgorInJhZGlvZW5oZXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIk1pc3NseWNrYWRlcyBtZWQgYXR0IGbDpSB0YWcgcMOlIGFrdHVlbGwgdXRnw6VuZyBww6UgZW5oZXRlbiBcIiVzXCIuIEthbiB2YXJhIGVuICIKKyJyYWRpb2VuaGV0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIk1pc3NseWNrYWRlcyBtZWQgYXR0IHN0w6RsbGEgaW4gdXRnw6VuZyAlZCBww6UgZW5oZXRlbiAlcy4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICLDhG5kcmluZyBhdiB1cHBsw7ZzbmluZyB2aWQga8O2cnRpZCBzdMO2ZHMgaW50ZSDDpG4uIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICJLYW4gaW50ZSBmdW5nZXJhIHV0YW4gZW4ga2xvY2thIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBzdHJlYW0gZXJyb3IuIgorI34gbXNnc3RyICJJbnRlcm50IGZlbCBpIGRhdGFzdHLDtm0uIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAiSW50ZXJudCBmZWwgaSBkYXRhZmzDtmRlLiIKKworI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAiRW5oZXRlbiBcIiVzXCIgc3TDtmRlciBpbnRlIHZpZGVvaW5mw6VuZ25pbmcuIgpkaWZmIC0tZ2l0IGEvcG8vdHIucG8gYi9wby90ci5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGJiYTYyCi0tLSAvZGV2L251bGwKKysrIGIvcG8vdHIucG8KQEAgLTAsMCArMSw4MDggQEAKKyMgdHJhbnNsYXRpb24gb2YgZ3N0LXBsdWdpbnMtZ29vZC0xLjAuMy5wbyB0byBUdXJraXNoCisjIFRoaXMgZmlsZSBpcyBwdXQgaW4gdGhlIHB1YmxpYyBkb21haW4uCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSBnc3QtcGx1Z2lucy1nb29kIHBhY2thZ2UuCisjIFNlcnZlciBBY2ltIDxzZXJ2ZXJhY2ltQGdtYWlsLmNvbT4sIDIwMTAuCisjIFNlcnZlciBBY2ltIDxzZXJ2ZXJhY2ltQGdtYWlsLmNvbT4sIDIwMTEuCisjIFNlcnZlciBBY2ltIDxzZXJ2ZXJhY2ltQGdtYWlsLmNvbT4sIDIwMTMsIDIwMTUuCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kIDEuNC4xXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTUtMDEtMTAgMjE6MDcrMDEwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogVm9sa2FuIEdlemVyIDx2b2xrYW5nZXplckBnbWFpbC5jb20+XG4iCisiTGFuZ3VhZ2UtVGVhbTogVHVya2lzaCA8Z251LXRyLXUxMmFAbGlzdHMuc291cmNlZm9yZ2UubmV0PlxuIgorIkxhbmd1YWdlOiB0clxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlBsdXJhbC1Gb3JtczogbnBsdXJhbHM9MjsgcGx1cmFsPShuID4gMSk7XG4iCisiWC1HZW5lcmF0b3I6IExva2FsaXplIDEuNVxuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICJKYWNrIHN1bnVjdXN1IGJ1bHVuYW1hZMSxIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICJKUEVHIGfDtnLDvG50w7xzw7xuw7wgw6fDtnrDvG1sZW5lbWVkaSIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiJyVzJyB0YXJhZsSxbmRhbiAnJXMnIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJTdW51Y3V5YSBiYcSfbGFuYW3EsXlvciIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJIacOnIGJpciBVUkwgYXlhcmxhbm1hbcSxxZ8uIgorCittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJTdW51Y3UgYWTEsSDDp8O2esO8bWxlbmVtaXlvci4iCisKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiU3VudWN1eWxhIGJhxJ9sYW50xLEga3VydWx1bWF5b3IuIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAiR8O8dmVubGkgYmHEn2xhbnTEsSBheWFyxLEgeWFwxLFsYW1hZMSxLiIKKworIywgZnV6enkKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICIiCisiQmlyIGHEnyBoYXRhc8SxIG1leWRhbmEgZ2VsZGksIHZleWEgc3VudWN1IGJhxJ9sYW50xLF5xLEgYmVrbGVubWV5ZW4gYmlyIMWfZWtpbGRlICIKKyJrZXN0aS4iCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIlN1bnVjdSB5ZXRlcnNpeiB2ZXJpIGfDtm5kZXJkaS4iCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiU3VudWN1IGFyYW1hecSxIGRlc3Rla2xlbWl5b3IuIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICJHZcOnZXJsaSBiaXIgc2VzIGdpcmnFn2kgYnVsdW5hbWFkxLEuIEFWSSBha8SxxZ/EsSBrZXNpbGVjZWsuIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJEb3N5YSDDp2FsxLFuYWJpbGlyIGFrxLHFn2xhciBpw6dlcm1peW9yLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiQnUgZG9zeWEgZ2XDp2Vyc2l6IHZlIG95bmF0xLFsYW1hei4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiQWvEscWfIMOnYWzEsW5hbWFkxLEgw6fDvG5rw7wgUGxheVJlYWR5IERSTSBpbGUgxZ9pZnJlbGVubWnFny4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkJ1IGRvc3lhIGJvenVrIHZlIG95bmF0xLFsYW1hei4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIkdlw6dlcnNpeiBhdG9tIGJveXV0dSIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRG9zeWEgZWtzaWsgdmUgb3luYXTEsWxhbWF6LiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiQnUgZG9zeWFkYWtpIHZpZHlvIGRvxJ9ydSBveW5hdMSxbGFtxLF5YWJpbGlyLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICJCdSBkb3N5YSDDp29rIGZhemxhIGFrxLHFnyBpw6dlcml5b3IuIFNhZGVjZSBpbGtpIG95bmF0xLFsxLF5b3IgJWQiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorIkRlc3Rla2xlbmVuIGJpciBha8SxxZ8gYnVsdW5hbWFkxLEuIFJlYWwgTWVkaWEgYWvEscWfbGFyxLEgacOnaW4gYmlyIEdTdHJlYW1lciBSVFNQICIKKyJ1emFudMSxIGVrbGVudGlzaSBrdXJtYWzEsXPEsW7EsXouIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisiRGVzdGVrbGVuZW4gYWvEscWfIGJ1bHVuYW1hZMSxLiBEYWhhIGZhemxhIGFrdGFyxLFtIHByb3Rva29sw7xuZSBpemluIHZlcm1lbml6ICIKKyJ2ZXlhIGRvxJ9ydSBHU3RyZWFtZXIgUlRTUCB1emFudMSxIGVrbGVudGlzaW5lIG9uYXkgdmVybWVuaXogZ2VyZWtlYmlsaXIuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIsOHYWxtYWsgacOnaW4gc2VzIGF5Z8SxdMSxIGHDp8SxbGFtxLF5b3IuIEF5Z8SxdCBiYcWfa2EgYmlyIHV5Z3VsYW1hIHRhcmFmxLFuZGFuICIKKyJrdWxsYW7EsWzEsXlvci4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiw4dhbG1hayBpw6dpbiBzZXMgYXlnxLF0xLEgYcOnxLFsYW3EsXlvci4gQXlnxLF0xLEgYcOnbWEgaXpuaW5peiBidWx1bm11eW9yLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICLDh2FsbWFrIGnDp2luIHNlcyBheWfEsXTEsSBhw6fEsWxhbcSxeW9yLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKyLDh2FsbWEgacOnaW4gc2VzIGF5Z8SxdMSxIGHDp8SxbGFtxLF5b3IuIEHDp8SxayBTZXMgU2lzdGVtaSduaW4gYnUgc8O8csO8bcO8LCBidSDDtsSfZXlpICIKKyJkZXN0ZWtsZW1peW9yLiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJCdSBzZXMgYXlnxLF0xLEgw6dhbG1hecSxIGRlc3Rla2xlbWl5b3IuIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICJTZXMgw6dhbG1hIGhhdGFzxLEuIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJCdSBzZXMgYXlnxLF0xLEga2F5ZGV0bWV5aSBkZXN0ZWtsZW1peW9yLiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIlNlcyBheWfEsXTEsW5kYW4ga2F5ZGV0bWVrdGUgaGF0YS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIkthecSxdCBpw6dpbiBheWfEsXTEsSBhw6dhbcSxeW9yLiBBeWfEsXTEsSBhw6dtYWsgacOnaW4geWV0a2luaXogeW9rLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiQXlnxLF0xLEga2F5xLF0IGnDp2luIGHDp2FtxLF5b3IuIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAiS2F5xLF0IEtheW5hxJ/EsSIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIk1pa3JvZm9uIgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAiSGF0IEdpcmnFn2kiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiRGFoaWxpIENEIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIlNQRElGIEdpcmnFn2kiCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiQVVYIDEgR2lyacWfIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIkFVWCAyIEdpcmnFnyIKKworbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICJLb2RlayBHZXJpZMO2bsO8xZ/DvCIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiU3VuVlRTIEdlcmlkw7Zuw7zFn8O8IgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJTZXMgR2lyacWfaSIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIkthemFuw6ciCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJIb3BhcmzDtnIiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJWYXJzYXnEsWxhbiBIb3BhcmzDtnIiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIkt1bGFrbMSxayIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICJIYXQgw4fEsWvEscWfxLEiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIlNQRElGIMOHxLFrxLHFnyIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiQVVYIDEgw4fEsWvEscWfIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICJBVVggMiDDh8Sxa8SxxZ8iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiJWQgYmF5dCBiaWxnaWxpICclcycgYXlnxLF0xLFuZGFuIG9rdW1hZGEgaGF0YS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIkF5Z8SxdMSxbiAnJXMnIGJpcmxpa3RlIMOnYWzEscWfYWJpbGVjZcSfaSB2aWR5byBraXBsZXJpbmkgc8SxcmFsYW1hZGEgaGF0YSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiQXlnxLF0dGFuICclcycgYmVsbGVrbGVyIGXFn2xlbmVtaXlvciIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAiQnUgYXlnxLF0xLFuIHPDvHLDvGPDvHPDvCAnJXMnIElPIHnDtm50ZW1pbmkgZGVzdGVrbGVtaXlvciAlZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIiIKKyJCdSBheWfEsXTEsW4gc8O8csO8Y8O8c8O8ICclcycgYmlsaW5lbiBJTyB5w7ZudGVtbGVyaW5kZW4gaGVyaGFuZ2kgYmlyaXNpbmkgIgorImRlc3Rla2xlbWl5b3IuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIkF5Z8SxdCAnJXMnIG1lxZ9ndWwiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIkF5Z8SxdCAnJXMnIGfDtnLDvG50w7wgeWFrYWxheWFtYWTEsSVkeCVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICJBeWfEsXQgJyVzJyBiZWxpcnRpbGVuIGtpcHRlIGfDtnLDvG50w7wgeWFrYWxheWFtYWTEsSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICJBeWfEsXQgJyVzJyBiaXRpxZ9payBvbG1heWFuIGTDvHpsZW1sZXJpIGRlc3Rla2xlbWl5b3IiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICJEZcSfacWfdGlyZ2VsZXIgYXlnxLF0dGFuICclcycgYWzEsW5hbcSxeW9yIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICJWaWR5byBheWfEsXTEsSB5ZW5pIMOnZXLDp2V2ZSBvcmFuxLEgYXlhcmxhcsSxbsSxIGthYnVsIGV0bWVkaS4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICJWaWRlbyBheWfEsXTEsSDDp8Sxa3TEsSBiacOnaW1pbmkgc2HEn2xhbWFkxLEuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIlZpZGVvIGF5Z8SxdMSxIGdlw6dlcnNpeiBib3l1dGxhciBkw7ZuZMO8LiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICJWaWRlbyBheWfEsXRsYXLEsSBkZXN0ZWtsZW5tZXllbiBiaXIgYmlyYmlyaW5lIGdlw6dtZSB5w7ZudGVtaSBrdWxsYW7EsXlvci4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiVmlkZW8gYXlnxLF0bGFyxLEgZGVzdGVrbGVubWV5ZW4gYmlyIHBpa3NlbCBiacOnaW1pbmkga3VsbGFuxLF5b3IuIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIsSww6cgdGFtcG9uIGJlbGxlayBoYXZ1enUgeWFwxLFsYW5kxLFyxLFsYW3EsXlvci4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIlZpZGVvIGF5Z8SxdMSxIGhlcmhhbmdpIGJpciB0YW1wb24gYmVsbGVrIGJveXV0dSDDtm5lcm1lZGkuIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAixLDDp2VyaSBha3RhcsSxbGFjYWsgYWvEsW50xLEgaGF2dXp1IHlvay4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIsSwc3Rhc3lvbiBheWFybGFyxLFuxLEgYnVsbWEgacWfbGVtaSAlZCDFn3UgYXlnxLF0dGEgJyVzJyBiYcWfYXLEsWxhbWFkxLEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkJ1IGF5Z8SxdCBpw6dpbiBrYXBhc2l0ZSBiaWxnaXNpIGFsxLFuYW1hZMSxICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiQXlnxLF0ICclcycgYmlyIHJhZHlvIGRlxJ9pbC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJSYWR5byBnaXJpxZ8gZGXEn2VyaSDFn3UgYXlnxLF0dGEgJyVzJyBheWFybGFuYW1hZMSxLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIkdpcmnFnyBkZcSfZXJpIG9sYXJhayBidSAlZCDFn3UgYXlnxLF0dGEgJXMgYXlhcmxhbmFtYWTEsS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkF5Z8SxdCAnJXMnIHN1c3R1cnVsbWF5YSBheWFybGFuYW1hZMSxLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiR2VyZWtsaSBiZWxsZWsgYXlyxLFsYW1hZMSxLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICJHZXJla2xpIGJlbGxlayBheXLEsWxhbcSxeW9yLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJBeWfEsXQgJXMgw7x6ZXJpbmRla2kgZMO2bsO8xZ90w7xyw7xjw7wgZ2lyZGkgYmnDp2ltaW5pIGRlc3Rla2xlbWl5b3IiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIkF5Z8SxdCAlcyDDvHplcmluZGVraSBkw7Zuw7zFn3TDvHLDvGPDvCDDp8Sxa3TEsSBiacOnaW1pbmkgZGVzdGVrbGVtaXlvciIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiQXlnxLF0ICVzIMO8emVyaW5kZWtpIGtvZGxhecSxY8SxIGdpcmRpIGJpw6dpbWluaSBkZXNrdGVrbGVtaXlvciIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIkF5Z8SxdCAlcyDDvHplcmluZGVraSBrb2RsYXnEsWPEsSDDp8Sxa3TEsSBiacOnaW1pbmkgZGVza3Rla2xlbWl5b3IiCisKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiw4fDtnptZSBpxZ9pIGJhxZ9sYW1hc8SxIGJhxZ9hcsSxc8Sxei4iCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIsSwxZ9sZW0gw6dlcsOnZXZlc2kgYmHFn2FyxLFzxLF6LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyLFnnUgYXlnxLF0xLFuICclcycgw7Z6ZWxsaWtsZXJpbmkgYWxtYWRhIGhhdGE6IE8gYmlyIHY0bDIgc8O8csO8Y8O8c8O8IGRlxJ9pbC4gT251biAiCisiYmlyIHY0bDEgc8O8csO8Y8O8c8O8IG9sdXAgb2xtYWTEscSfxLFuxLEgZGVuZXRsZXlpbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICJHaXJpxZ8gZGF2cmFuxLHFn2xhcsSxIHNvcmd1c3UgJWQgxZ91IGF5Z8SxdHRhICVzIGJhxZ9hcsSxbGFtYWTEsSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJSYWR5byBpc3Rhc3lvbnUgYXlhcmxhcsSxbsSxIGJ1bG1hICVkIMWfdSBheWfEsXR0YSAnJXMnIGJhxZ9hcsSxbGFtYWTEsS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICLFnnUgYXlnxLF0dGEgJyVzJyBzb3JndSBub3JtdW5hIGVyacWfaWxlbWVkaS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkRlbmV0aW0gZGF2cmFuxLHFn2xhcsSxIMWfdSBheWfEsXR0YSAnJXMnIGJ1bHVuYW1hZMSxLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJBeWfEsXQgdGFuxLFtbGFuYW3EsXlvciAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICJCdSBiaXIgYXlnxLF0IGRlxJ9pbCclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAixZ51IGF5Z8SxdMSxICclcycgb2t1bWEgdmUgeWF6bWEgacOnaW4gYcOnYW3EsXlvci4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICJBeWfEsXQgJyVzJyBiaXIgeWFrYWxhbWEgYXlnxLF0xLEgZGXEn2lsLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiQXlnxLF0ICclcycgYmlyIMOnxLFrxLHFnyBheWfEsXTEsSBkZcSfaWwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICJBeWfEsXQgJyVzJyBiaXIgTTJNIGF5Z8SxdMSxIGRlxJ9pbC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIk9rdW1hIHZlIHlhem1hIGnDp2luICclcycgYXlnxLF0xLEga29weWFsYW5hbWFkxLEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJBeWfEsXQgacOnaW4gJyVzJyBub3JtIGRlxJ9lcmxlcmkgYXlhcmxhbmFtYWTEsS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJBeWfEsXQgacOnaW4gJyVzJyByYWR5byBmcmVrYW5zbGFyxLEgYXlhcmxhbmFtYWTEsS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiQXlnxLF0IGnDp2luICclcycgcmFkeW8gZnJla2Fuc8SxICVsdSBIeiBpw6dpbiB5YXDEsWxhbWFkxLEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkF5Z8SxdCBpw6dpbiAnJXMnIGfDvMOnbMO8IHNpbnlhbCBhbMSxbcSxIGdlcsOnZWtsZcWfZW1lZGkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJEZW5ldGltIGRlxJ9lcmkgxZ91bmEgJWQgYnUgYXlnxLF0dGEgJyVzJyBheWFybGFuYW1hZMSxLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRGXEn2VyICVkIGRlbmV0aW0gacOnaW4gJWQgxZ91IGF5Z8SxdHRhICclcycgYXlhcmxhbmFtYWTEsS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyLFnnUgYXlnxLF0dGEgJyVzJyBnZcOnZXJsaSBnaXJpxZ8gZWxkZSBlZGlsZW1lZGkuIE8gYmlyIHJhZHlvIGF5Z8SxdMSxIG9sYWJpbGlyLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisixZ51IGF5Z8SxdHRhICclcycgZ2XDp2VybGkgZ2lyacWfIGVsZGUgZWRpbGVtZWRpLiBPIGJpciByYWR5byBheWfEsXTEsSBvbGFiaWxpci4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiw4fEsWvEscWfIGRlxJ9lcmkgb2xhcmFrICVkIMWfdSBheWfEsXR0YSAlcyBlbGRlIGVkaWxlbWVkaS4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICLDh2FsxLHFn8SxcmtlbiDDp8O2esO8bsO8cmzDvMSfw7wgZGXEn2nFn3Rpcm1layBoZW7DvHogZGVzdGVrbGVubWl5b3IuIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICJTYWF0IG9sbWFkYW4gw6dhbMSxxZ9hbWF6IgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBzdHJlYW0gZXJyb3IuIgorI34gbXNnc3RyICLEsMOnIHZlcmkgYWvEsW0gaGF0YXPEsS4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICLEsMOnIHZlcmkgYWvEscWfIGhhdGFzxLEuIgorCisjfiBtc2dpZCAiRGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBjYXB0dXJlIgorI34gbXNnc3RyICJBeWfEsXQgJyVzJyB2aWRlbyB5YWthbGFtYXnEsSBkZXN0ZWtsZW1peW9yIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNvdW5kIHNlcnZlciIKKyN+IG1zZ3N0ciAiU2VzIHN1bnVjdXN1eWxhIGJhxJ9sYW50xLEga3VydWx1bWF5b3IiCisKKyN+IG1zZ2lkICJGYWlsZWQgdG8gcXVlcnkgc291bmQgc2VydmVyIGNhcGFiaWxpdGllcyIKKyN+IG1zZ3N0ciAiU2VzIHN1bnVjdXN1IG9sYW5ha2xhcsSxIHNvcmd1bGFuYW1hZMSxIgorCisjfiBtc2dpZCAiQmFzcyIKKyN+IG1zZ3N0ciAiQmFzIgorCisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICJUaXoiCisKKyN+IG1zZ2lkICJTeW50aCIKKyN+IG1zZ3N0ciAiU3ludGhpc2l6ZXIiCisKKyN+IG1zZ2lkICJQQ00iCisjfiBtc2dzdHIgIlBDTSIKKworI34gbXNnaWQgIlNwZWFrZXIiCisjfiBtc2dzdHIgIkhvcGFybMO2ciIKKworI34gbXNnaWQgIkxpbmUtaW4iCisjfiBtc2dzdHIgIkhhdCBnaXJpxZ9pIgorCisjfiBtc2dpZCAiQ0QiCisjfiBtc2dzdHIgIkNEIgorCisjfiBtc2dpZCAiTWl4ZXIiCisjfiBtc2dzdHIgIkthcsSxxZ90xLFyxLFjxLEiCisKKyN+IG1zZ2lkICJQQ00tMiIKKyN+IG1zZ3N0ciAiUENNLTIiCisKKyN+IG1zZ2lkICJSZWNvcmQiCisjfiBtc2dzdHIgIkthecSxdCIKKworI34gbXNnaWQgIkluLWdhaW4iCisjfiBtc2dzdHIgIkthemFuw6ctZ2lyacWfaSIKKworI34gbXNnaWQgIk91dC1nYWluIgorI34gbXNnc3RyICJLYXphbsOnLcOnxLFrxLHFn8SxIgorCisjfiBtc2dpZCAiTGluZS0xIgorI34gbXNnc3RyICJIYXQtMSIKKworI34gbXNnaWQgIkxpbmUtMiIKKyN+IG1zZ3N0ciAiSGF0LTIiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIkhhdC0zIgorCisjfiBtc2dpZCAiRGlnaXRhbC0xIgorI34gbXNnc3RyICJTYXnEsXNhbC0xIgorCisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICJTYXnEsXNhbC0yIgorCisjfiBtc2dpZCAiRGlnaXRhbC0zIgorI34gbXNnc3RyICJTYXnEsXNhbC0zIgorCisjfiBtc2dpZCAiUGhvbmUtaW4iCisjfiBtc2dzdHIgIkZvbm8tZ2lyacWfIgorCisjfiBtc2dpZCAiUGhvbmUtb3V0IgorI34gbXNnc3RyICJGb25vLcOnxLFrxLHFnyIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICJWaWR5byIKKworI34gbXNnaWQgIlJhZGlvIgorI34gbXNnc3RyICJSYWR5byIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCisjfiBtc2dzdHIgIk1pa3NlciBkZW5ldGltaSBpw6dpbiBzZXMgYXlnxLF0xLEgYcOnxLFsYW3EsXlvci4iCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJNaWtzZXIgZGVuZXRpbWkgacOnaW4gc2VzIGF5Z8SxdMSxIGHDp8SxbGFtxLF5b3IuIEHDp8SxayBTZXMgU2lzdGVtaW5pbiBidSAiCisjfiAic8O8csO8bcO8LCBidSDDtsSfZXlpIGRlc3Rla2xlbWl5b3IuIgorCisjfiBtc2dpZCAiTWFzdGVyIgorI34gbXNnc3RyICJNYXN0ZXIiCisKKyN+IG1zZ2lkICJGcm9udCIKKyN+IG1zZ3N0ciAiw5ZuIgorCisjfiBtc2dpZCAiUmVhciIKKyN+IG1zZ3N0ciAiQXJrYSIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIkt1bGFrbMSxa2xhciIKKworI34gbXNnaWQgIkNlbnRlciIKKyN+IG1zZ3N0ciAiTWVya2V6IgorCisjfiBtc2dpZCAiTEZFIgorI34gbXNnc3RyICJMRkUiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCIKKyN+IG1zZ3N0ciAiU3Vycm91bmQiCisKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICJZYW4iCisKKyN+IG1zZ2lkICJBVVggT3V0IgorI34gbXNnc3RyICJBVVggw4fEsWvEscWfIgorCisjfiBtc2dpZCAiM0QgRGVwdGgiCisjfiBtc2dzdHIgIjNEIERlcmlubGlrIgorCisjfiBtc2dpZCAiM0QgQ2VudGVyIgorI34gbXNnc3RyICIzRCBNZXJrZXoiCisKKyN+IG1zZ2lkICIzRCBFbmhhbmNlIgorI34gbXNnc3RyICIzRCBHZW5pxZ9saWsiCisKKyN+IG1zZ2lkICJUZWxlcGhvbmUiCisjfiBtc2dzdHIgIlRlbGVmb24iCisKKyN+IG1zZ2lkICJWaWRlbyBJbiIKKyN+IG1zZ3N0ciAiVmlkeW8gR2lyacWfaSIKKworI34gbXNnaWQgIkFVWCBJbiIKKyN+IG1zZ3N0ciAiQVVYIEdpcmnFnyIKKworI34gbXNnaWQgIlJlY29yZCBHYWluIgorI34gbXNnc3RyICJLYXnEsXQgS2F6YW5jxLEiCisKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAiw4fEsWvEscWfIEthemFuY8SxIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAiTWlrcm9mb24gU2V2aXllIFnDvGtzZWx0bWUiCisKKyN+IG1zZ2lkICJEaWFnbm9zdGljIgorI34gbXNnc3RyICJBeWFybGFyIgorCisjfiBtc2dpZCAiQmFzcyBCb29zdCIKKyN+IG1zZ3N0ciAiQmFzcyBBcnR0xLFyxLFtIgorCisjfiBtc2dpZCAiUGxheWJhY2sgUG9ydHMiCisjfiBtc2dzdHIgIsOHYWxtYSBQb3J0bGFyxLEiCisKKyN+IG1zZ2lkICJJbnB1dCIKKyN+IG1zZ3N0ciAiR2lyacWfIgorCisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgIkhvcGFybMO2ciBLYXluYcSfxLEiCisKKyN+IG1zZ2lkICJLZXlib2FyZCBCZWVwIgorI34gbXNnc3RyICJLbGF2eWUgQmlwbGVtZXNpIgorCisjfiBtc2dpZCAiU2ltdWxhdGUgU3RlcmVvIgorI34gbXNnc3RyICJTdGVyZW8gU2ltw7xsYXN5b251IgorCisjfiBtc2dpZCAiU3RlcmVvIgorI34gbXNnc3RyICJTdGVyZW8iCisKKyN+IG1zZ2lkICJTdXJyb3VuZCBTb3VuZCIKKyN+IG1zZ3N0ciAiU3Vycm91bmQgU2VzaSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKKyN+IG1zZ3N0ciAiTWlrcm9mb24gS2F6YW5jxLEiCisKKyN+IG1zZ2lkICJTcGVha2VyIFNvdXJjZSIKKyN+IG1zZ3N0ciAiSG9wYXJsw7ZyIEtheW5hxJ/EsSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgU291cmNlIgorI34gbXNnc3RyICJNaWtyb2ZvbiBLYXluYcSfxLEiCisKKyN+IG1zZ2lkICJKYWNrIgorI34gbXNnc3RyICJKYWNrIgorCisjfiBtc2dpZCAiQ2VudGVyIC8gTEZFIgorI34gbXNnc3RyICJNZXJrZXogLyBMRkUiCisKKyN+IG1zZ2lkICJTdGVyZW8gTWl4IgorI34gbXNnc3RyICJTdGVyZW8gTWl4IgorCisjfiBtc2dpZCAiTW9ubyBNaXgiCisjfiBtc2dzdHIgIk1vbm8gTWl4IgorCisjfiBtc2dpZCAiSW5wdXQgTWl4IgorI34gbXNnc3RyICJHaXJpxZ8gTWl4IgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAxIgorI34gbXNnc3RyICJNaWtyb2ZvbiAxIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICJNaWtyb2ZvbiAyIgorCisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgIlNhecSxc2FsIMOHxLFrxLHFnyIKKworI34gbXNnaWQgIkRpZ2l0YWwgSW4iCisjfiBtc2dzdHIgIlNhecSxc2FsIEdpcmnFnyIKKworI34gbXNnaWQgIkhETUkiCisjfiBtc2dzdHIgIkhETUkiCisKKyN+IG1zZ2lkICJNb2RlbSIKKyN+IG1zZ3N0ciAiTW9kZW0iCisKKyN+IG1zZ2lkICJIYW5kc2V0IgorI34gbXNnc3RyICJBaGl6ZSIKKworI34gbXNnaWQgIk90aGVyIgorI34gbXNnc3RyICJEacSfZXIiCisKKyN+IG1zZ2lkICJOb25lIgorI34gbXNnc3RyICJIacOnYmlyaSIKKworI34gbXNnaWQgIk9uIgorI34gbXNnc3RyICJBw6fEsWsiCisKKyN+IG1zZ2lkICJPZmYiCisjfiBtc2dzdHIgIkthcGFsxLEiCisKKyN+IG1zZ2lkICJNdXRlIgorI34gbXNnc3RyICJTdXN0dWx1cm11xZ8iCisKKyN+IG1zZ2lkICJGYXN0IgorI34gbXNnc3RyICJIxLF6bMSxIgorCisjfiBtc2dpZCAiVmVyeSBMb3ciCisjfiBtc2dzdHIgIsOHb2sgS2FsxLFuIgorCisjfiBtc2dpZCAiTG93IgorI34gbXNnc3RyICJEIgorCisjfiBtc2dpZCAiTWVkaXVtIgorI34gbXNnc3RyICJPcnRhIgorCisjfiBtc2dpZCAiSGlnaCIKKyN+IG1zZ3N0ciAiVGl6IgorCisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICLDh29rIFRpeiIKKworI34gbXNnaWQgIlByb2R1Y3Rpb24iCisjfiBtc2dzdHIgIllhcMSxbSIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCisjfiBtc2dzdHIgIsOWbiBQYW5lbCBNaWtyb2ZvbnUiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIEluIgorI34gbXNnc3RyICLDlm4gUGFuZWwgSGF0IEdpcmnFn2kiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBIZWFkcGhvbmVzIgorI34gbXNnc3RyICLDlm4gUGFuZWwgS3VsYWtsxLFrbGFyIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBPdXQiCisjfiBtc2dzdHIgIsOWbiBQYW5lbCBIYXQgw4fEsWvEscWfxLEiCisKKyN+IG1zZ2lkICJHcmVlbiBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlllxZ9pbCBLb25uZWt0w7ZyIgorCisjfiBtc2dpZCAiUGluayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlBlbWJlIEtvbm5la3TDtnIiCisKKyN+IG1zZ2lkICJCbHVlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiTWF2aSBLb25uZWt0w7ZyIgorCisjfiBtc2dpZCAiV2hpdGUgQ29ubmVjdG9yIgorI34gbXNnc3RyICJCZXlheiBLb25uZWt0w7ZyIgorCisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICJTaXlhaCBLb25uZWt0w7ZyIgorCisjfiBtc2dpZCAiR3JheSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkdyaSBLb25uZWt0w7ZyIgorCisjfiBtc2dpZCAiT3JhbmdlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUG9ydGFrYWwgS29ubmVrdMO2ciIKKworI34gbXNnaWQgIlJlZCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkvEsXJtxLF6xLEgS29ubmVrdMO2ciIKKworI34gbXNnaWQgIlllbGxvdyBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlNhcsSxIEtvbm5la3TDtnIiCisKKyN+IG1zZ2lkICJHcmVlbiBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlllxZ9pbCDDlm4gUGFuZWwgS29ubmVrdMO2ciIKKworI34gbXNnaWQgIlBpbmsgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJQZW1iZSDDlm4gUGFuZWwgS29ubmVrdMO2ciIKKworI34gbXNnaWQgIkJsdWUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJNYXZpIMOWbiBQYW5lbCBLb25uZWt0w7ZyIgorCisjfiBtc2dpZCAiV2hpdGUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJCZXlheiDDlm4gUGFuZWwgS29ubmVrdMO2ciIKKworI34gbXNnaWQgIkJsYWNrIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiU2l5YWggw5ZuIFBhbmVsIEtvbm5la3TDtnIiCisKKyN+IG1zZ2lkICJHcmF5IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiR3JpIMOWbiBQYW5lbCBLb25uZWt0w7ZyIgorCisjfiBtc2dpZCAiT3JhbmdlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUG9ydGFrYWwgw5ZuIFBhbmVsIEtvbm5la3TDtnIiCisKKyN+IG1zZ2lkICJSZWQgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJLxLFybcSxesSxIMOWbiBQYW5lbCBLb25uZWt0w7ZyIgorCisjfiBtc2dpZCAiWWVsbG93IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiU2FyxLEgw5ZuIFBhbmVsIEtvbm5la3TDtnIiCisKKyN+IG1zZ2lkICJTcHJlYWQgT3V0cHV0IgorI34gbXNnc3RyICLDh8Sxa8SxxZ/EsSBEYcSfxLF0IgorCisjfiBtc2dpZCAiRG93bm1peCIKKyN+IG1zZ3N0ciAiTWlrcyBFZGlsbWnFnyIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgSW5wdXQiCisjfiBtc2dzdHIgIlNhbmFsIE1pa3NlciBHaXJpxZ9pIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBPdXRwdXQiCisjfiBtc2dzdHIgIlNhbmFsIE1pa3NlciDDh8Sxa8SxxZ/EsSIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgQ2hhbm5lbHMiCisjfiBtc2dzdHIgIlNhbmFsIE1pa3NlciBLYW5hbGxhcsSxIgorCisjfiBtc2dpZCAiJXMgJWQgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzICVkIMSwxZ9sZXYiCisKKyN+IG1zZ2lkICIlcyBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiJXMgxLDFn2xldiIKKworI34gbXNnaWQgIkdvdCB1bmV4cGVjdGVkIGZyYW1lIHNpemUgb2YgJXUgaW5zdGVhZCBvZiAldS4iCisjfiBtc2dzdHIgIkJla2xlbm1leWVuIGJpciDDp2Vyw6dldmVjZSBib3l1dHUgJXUgYnVudW4geWVyaW5lICV1IGfDtnLDvG50w7xsZW5kaS4iCisKKyN+IG1zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIG9uIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiJWQgYmF5dMSxIMWfdSBheWfEsXR0YSAnJXMnIG9rdW1hZGEgaGF0YS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZW5xdWV1ZSBidWZmZXJzIGluIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiQXlnxLF0dGEgJyVzJyBhcmFiZWxsZWsga3V5cnXEn2Egc29rdWxhbcSxeW9yLiIKKworI34gbXNnaWQgIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiQXlnxLF0dGFuIGRldmljZSAnJXMnIHZpZHlvIMOnZXLDp2V2ZWxlcmkgYWzEsW5hbWFkxLEuIgorCisjfiBtc2dpZCAiRmFpbGVkIGFmdGVyICVkIHRyaWVzLiBkZXZpY2UgJXMuIHN5c3RlbSBlcnJvcjogJXMiCisjfiBtc2dzdHIgIsWedSBkZW5lbWVkZW4gc29ucmEgJWQgYmHFn2FyxLFsYW1hZMSxLiBheWfEsXQgJXMuIHNpc3RlbSBoYXRhc8SxOiAlcyIKKworI34gbXNnaWQgIiIKKyN+ICJUaGUgYnVmZmVyIHR5cGUgaXMgbm90IHN1cHBvcnRlZCwgb3IgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMsIG9yIG5vICIKKyN+ICJidWZmZXJzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgeWV0LCBvciB0aGUgdXNlcnB0ciBvciBsZW5ndGggYXJlIGludmFsaWQuICIKKyN+ICJkZXZpY2UgJXMiCisjfiBtc2dzdHIgIiIKKyN+ICJBcmFiZWxsZWsgdMO8csO8IGRlc3Rla2xlbm1peW9yLCB2ZXlhIGnDp2VyaWsgYmlyIHllcmUgYWl0IGRlxJ9pbCwgdmV5YSAiCisjfiAiYXJhYmVsbGVrbGVyIGhlbsO8eiBheXLEsWxtYW3EscWfLCB2ZXlhIHVzZXJwdHIgdmV5YSB1enVubHVrIGdlw6dlcnNpei4gYXlnxLF0LiAiCisjfiAiJXMiCisKKyN+IG1zZ2lkICIiCisjfiAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIE5vdCBlbm91Z2ggbWVtb3J5LiIKKyN+IG1zZ3N0ciAiVmlkeW8gw6dlcnZldmVzaSBheWfEsXR0YW4gJyVzJyBhbMSxbmFtYWTEsS4gWWV0ZXJzaXogYmVsbGVrLiIKKworI34gbXNnaWQgImluc3VmZmljaWVudCBtZW1vcnkgdG8gZW5xdWV1ZSBhIHVzZXIgcG9pbnRlciBidWZmZXIuIGRldmljZSAlcy4iCisjfiBtc2dzdHIgIiIKKyN+ICJrdWxsYW7EsWPEsSBhcmFiZWxsZcSfaW5pIGt1eXJ1xJ9hIHNva21hayBpw6dpbiB5ZXRlcnNpeiBiZWxsZWsuIGF5Z8SxdCAlcy4iCisKKyN+IG1zZ2lkICJObyBmcmVlIGJ1ZmZlcnMgZm91bmQgaW4gdGhlIHBvb2wgYXQgaW5kZXggJWQuIgorI34gbXNnc3RyICJEaXppbmRla2kgJWQgaGF2dXpkYSBib8WfIGJlbGxlayBidWx1bmFtYWTEsS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZ2V0IGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkFyYWJlbGxlayBheWfEsXR0YW4gJyVzJyBhbMSxbmFtxLF5b3IuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGdldCBlbm91Z2ggYnVmZmVycyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiWWV0ZXJsaSBiZWxsZWsgYXlnxLF0dGFuICclcycgYWzEsW5hbcSxeW9yLiIKKworI34gbXNnaWQgIkVycm9yIHN0YXJ0aW5nIHN0cmVhbWluZyBjYXB0dXJlIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJBeWfEsXR0YW4gJyVzJyBha2FuIGfDtnLDvG50w7wgYmHFn2xhdMSxbGFtYWTEsS4iCisKKyN+IG1zZ2lkICJFcnJvciBzdG9wcGluZyBzdHJlYW1pbmcgY2FwdHVyZSBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiQXlnxLF0dGFuICclcycgYWthbiBnw7Zyw7xudMO8IGR1cmR1cnVsYW1hZMSxLiIKZGlmZiAtLWdpdCBhL3BvL3VrLnBvIGIvcG8vdWsucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxY2Y3OQotLS0gL2Rldi9udWxsCisrKyBiL3BvL3VrLnBvCkBAIC0wLDAgKzEsODUwIEBACisjIFVrcmFpbmlhbiB0cmFuc2xhdGlvbiB0byBnc3QtcGx1Z2lucy4KKyMgQ29weXJpZ2h0IChDKSAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ3N0LXBsdWdpbnMtZ29vZCBwYWNrYWdlLgorIworIyBNYXhpbSBWLiBEeml1bWFuZW5rbyA8ZHppdW1hbmVua29AZ21haWwuY29tPiwgMjAwNC0yMDA3LgorIyBZdXJpIENob3Jub2l2YW4gPHl1cmNob3JAdWtyLm5ldD4sIDIwMTEsIDIwMTIsIDIwMTMsIDIwMTQsIDIwMTUsIDIwMTYuCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kIDEuNy4yXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTYtMDItMjAgMTc6MjcrMDIwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogWXVyaSBDaG9ybm9pdmFuIDx5dXJjaG9yQHVrci5uZXQ+XG4iCisiTGFuZ3VhZ2UtVGVhbTogVWtyYWluaWFuIDx0cmFuc2xhdGlvbi10ZWFtLXVrQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD5cbiIKKyJMYW5ndWFnZTogdWtcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJYLUdlbmVyYXRvcjogTG9rYWxpemUgMS41XG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0xOyBwbHVyYWw9MDtcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAi0J3QtSDQt9C90LDQudC00LXQvdC+INGB0LXRgNCy0LXRgNCwIEphY2siCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgItCf0L7QvNC40LvQutCwINC/0YDQuCDQtNC10LrQvtC00YPQstCw0L3QvdGWINC30L7QsdGA0LDQttC10L3QvdGPIEpQRUciCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIsKrJXPCuywgJXMiCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgItCd0LUg0LLQtNCw0LvQvtGB0Y8g0Lcn0ZTQtNC90LDRgtC40YHRjCDQtyDRgdC10YDQstC10YDQvtC8IgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgItCd0LUg0LLQutCw0LfQsNC90L4g0LDQtNGA0LXRgdGDIgorCittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINCy0LjQt9C90LDRh9C40YLQuCDQsNC00YDQtdGB0YMg0YHQtdGA0LLQtdGA0LAg0LfQsCDQvdCw0LfQstC+0Y4uIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgItCd0LUg0LLQtNCw0LvQvtGB0Y8g0LLRgdGC0LDQvdC+0LLQuNGC0Lgg0Lcn0ZTQtNC90LDQvdC90Y8g0Lcg0YHQtdGA0LLQtdGA0L7QvC4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICLQn9C+0LzQuNC70LrQsCDQv9GW0LQg0YfQsNGBINGB0L/RgNC+0LHQuCDQvdCw0LvQsNGI0YLRg9Cy0LDQvdC90Y8g0LHQtdC30L/QtdGH0L3QvtCz0L4g0LfigJnRlNC00L3QsNC90L3Rjy4iCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICIiCisi0KHRgtCw0LvQsNGB0Y8g0L/QvtC80LjQu9C60LAg0YDQvtCx0L7RgtC4INC3INC80LXRgNC10LbQtdGOINCw0LHQviDQt+KAmdGU0LTQvdCw0L3QvdGPINCx0YPQu9C+INC90LXRgdC/0L7QtNGW0LLQsNC90L4g0YDQvtC30ZbRgNCy0LDQvdC+INC3ICIKKyLQsdC+0LrRgyDRgdC10YDQstC10YDQsC4iCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgItCh0LXRgNCy0LXRgNC+0Lwg0L3QsNC00ZbRgdC70LDQvdC+INC/0L7QvNC40LvQutC+0LLRliDQtNCw0L3Rli4iCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAi0KHQtdGA0LLQtdGA0L7QvCDQvdC1INC/0ZbQtNGC0YDQuNC80YPRlNGC0YzRgdGPINC/0L7Qt9C40YbRltGO0LLQsNC90L3Rjy4iCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIiIKKyLQndC1INCy0LrQsNC30LDQvdC+INCw0LHQviDQstC60LDQt9Cw0L3QviDQvdC10LrQvtGA0LXQutGC0L3QuNC5INCy0YXRltC0INC30LLRg9C60L7QstC40YUg0LTQsNC90LjRhSwgQVZJLdC/0L7RgtGW0Log0LHRg9C00LUgIgorItC/0L7RiNC60L7QtNC20LXQvdC+LiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAi0KTQsNC50Lsg0L3QtSDQvNGW0YHRgtC40YLRjCDQv9C+0YLQvtC60ZbQsiwg0Y/QutGWINC80L7QttC90LAg0LLRltC00YLQstC+0YDQuNGC0LguIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICLQpNCw0LnQuyDRlCDQvdC10LrQvtGA0LXQutGC0L3QuNC8LCDQudC+0LPQviDQvdC1INC80L7QttC90LAg0LLRltC00YLQstC+0YDQuNGC0LguIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIiIKKyLQktGW0LTRgtCy0L7RgNC10L3QvdGPINC/0L7RgtC+0LrRgyDQtNCw0L3QuNGFINC90LXQvNC+0LbQu9C40LLQtSwg0L7RgdC60ZbQu9GM0LrQuCDQtNCw0L3RliDQt9Cw0YjQuNGE0YDQvtCy0LDQvdC+INC30LAg0LTQvtC/0L7QvNC+0LPQvtGOICIKKyJQbGF5UmVhZHkgRFJNLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAi0KTQsNC50Lsg0L/QvtGI0LrQvtC00LbQtdC90L4sINC50L7Qs9C+INC90LUg0LzQvtC20L3QsCDQstGW0LTRgtCy0L7RgNC40YLQuC4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgItCd0LXQutC+0YDQtdC60YLQvdC40Lkg0YDQvtC30LzRltGAINC10LvQtdC80LXQvdGC0LDRgNC90L7Qs9C+INGE0YDQsNCz0LzQtdC90YLQsC4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgItCk0LDQudC7INC90LXQv9C+0LLQvdC40LksINC50L7Qs9C+INC90LUg0LzQvtC20L3QsCDQstGW0LTRgtCy0L7RgNC40YLQuC4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIiIKKyLQmdC80L7QstGW0YDQvdC+LCDQstGW0LTQtdC+0LTQsNC90ZYg0YbRjNC+0LPQviDRhNCw0LnQu9CwINC90LUg0LzQvtC20L3QsCDQsdGD0LTQtSDQstGW0LTRgtCy0L7RgNC40YLQuCDQvdCw0LvQtdC20L3QuNC8INGH0LjQvdC+0LwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgItCk0LDQudC7INC80ZbRgdGC0LjRgtGMINC90LDQtNGC0L4g0LHQsNCz0LDRgtC+INC/0L7RgtC+0LrRltCyLiDQktGW0LTRgtCy0L7RgNGO0Y7RgtGM0YHRjyDQu9C40YjQtSDQv9C10YDRiNGWICVkIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyLQndC1INC30L3QsNC50LTQtdC90L4g0L/RltC00YLRgNC40LzRg9Cy0LDQvdC40YUg0L/QvtGC0L7QutGW0LIuINCZ0LzQvtCy0ZbRgNC90L4sINCy0LDQvCDRgdC70ZbQtCDQstGB0YLQsNC90L7QstC40YLQuCDQvNC+0LTRg9C70YwgUlRTUCAiCisiR1N0cmVhbWVyINC00LvRjyDQstGW0LTRgtCy0L7RgNC10L3QvdGPINC/0L7RgtC+0LrRltCyIFJlYWwgbWVkaWEuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisi0J3QtSDQt9C90LDQudC00LXQvdC+INC/0ZbQtNGC0YDQuNC80YPQstCw0L3QuNGFINC/0L7RgtC+0LrRltCyLiDQmdC80L7QstGW0YDQvdC+LCDQstCw0Lwg0YHQu9GW0LQg0YPQstGW0LzQutC90YPRgtC4INC00L7QtNCw0YLQutC+0LLRliAiCisi0L/RgNC+0YLQvtC60L7Qu9C4INC/0LXRgNC10LTQsNCy0LDQvdC90Y8g0LTQsNC90LjRhSDQsNCx0L4g0LLRgdGC0LDQvdC+0LLQuNGC0Lgg0LTQvtC00LDRgtC60L7QstC40Lkg0LzQvtC00YPQu9GMIFJUU1AgR1N0cmVhbWVyLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKyLQndC1INCy0LTQsNC70L7RgdGPINCy0ZbQtNC60YDQuNGC0Lgg0L/RgNC40YHRgtGA0ZbQuSDQtNC70Y8g0LLRltC00YLQstC+0YDQtdC90L3Rjy4g0J/RgNC40YHRgtGA0ZbQuSDQstC40LrQvtGA0LjRgdGC0L7QstGD0ZTRgtGM0YHRjyAiCisi0YHRgtC+0YDQvtC90L3RjNC+0Y4g0L/RgNC+0LPRgNCw0LzQvtGOLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisi0J3QtSDQstC00LDQu9C+0YHRjyDQstGW0LTQutGA0LjRgtC4INC/0YDQuNGB0YLRgNGW0Lkg0LTQu9GPINCy0ZbQtNGC0LLQvtGA0LXQvdC90Y8uINCjINCy0LDRgSDQvdC10LTQvtGB0YLQsNGC0L3RjNC+INC/0YDQsNCyINC00LvRjyAiCisi0LLRltC00LrRgNC40YLRgtGPINC/0YDQuNGB0YLRgNC+0Y4uIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgItCd0LUg0LLQtNCw0LvQvtGB0Y8g0LLRltC00LrRgNC40YLQuCDQv9GA0LjRgdGC0YDRltC5INC00LvRjyDQstGW0LTRgtCy0L7RgNC10L3QvdGPLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKyLQndC1INCy0LTQsNC70L7RgdGPINCy0ZbQtNC60YDQuNGC0Lgg0L/RgNC40YHRgtGA0ZbQuSDQtNC70Y8g0LLRltC00YLQstC+0YDQtdC90L3Rjy4g0KbRjyDQstC10YDRgdGW0Y8gT3BlbiBTb3VuZCBTeXN0ZW0g0L3QtSAiCisi0L/RltC00YLRgNC40LzRg9GU0YLRjNGB0Y8g0YbQuNC8INC10LvQtdC80LXQvdGC0L7QvC4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAi0JLRltC00YLQstC+0YDQtdC90L3RjyDQvdC1INC/0ZbQtNGC0YDQuNC80YPRlNGC0YzRgdGPINGG0LjQvCDQt9Cy0YPQutC+0LLQuNC8INC/0YDQuNGB0YLRgNC+0ZTQvC4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgItCf0L7QvNC40LvQutCwINCy0ZbQtNGC0LLQvtGA0LXQvdC90Y8g0LfQstGD0LrRgy4iCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgItCX0LDQv9C40YEg0L3QtSDQv9GW0LTRgtGA0LjQvNGD0ZTRgtGM0YHRjyDRhtC40Lwg0LfQstGD0LrQvtCy0LjQvCDQv9GA0LjRgdGC0YDQvtGU0LwuIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAi0J/QvtC80LjQu9C60LAg0LfQsNC/0LjRgdGD0LLQsNC90L3RjyDQt9GWINC30LLRg9C60L7QstC+0LPQviDQv9GA0LjRgdGC0YDQvtGOLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorItCd0LUg0LLQtNCw0LvQvtGB0Y8g0LLRltC00LrRgNC40YLQuCDQv9GA0LjRgdGC0YDRltC5INC00LvRjyDQt9Cw0L/QuNGB0YMuINCjINCy0LDRgSDQvdC10LTQvtGB0YLQsNGC0L3RjNC+INC/0YDQsNCyINC00LvRjyAiCisi0LLRltC00LrRgNC40YLRgtGPINC/0YDQuNGB0YLRgNC+0Y4uIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINCy0ZbQtNC60YDQuNGC0Lgg0L/RgNC40YHRgtGA0ZbQuSDQtNC70Y8g0LfQsNC/0LjRgdGDLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICLQn9GA0LjRgdGC0YDRltC5IENvcmVBdWRpbyDQvdC1INC30L3QsNC50LTQtdC90L4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgItCd0LUg0LLQtNCw0LvQvtGB0Y8g0LLRltC00LrRgNC40YLQuCDQv9GA0LjRgdGC0YDRltC5IENvcmVBdWRpbyIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgItCX0LDQv9C40YEg0LTQttC10YDQtdC70LAiCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICLQnNGW0LrRgNC+0YTQvtC9IgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAi0JvRltC90ZbQudC90LjQuSDQstGF0ZbQtCIKKworbXNnaWQgIkludGVybmFsIENEIgorbXNnc3RyICLQktCx0YPQtNC+0LLQsNC90LjQuSDQmtCUIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgItCS0YXRltC0IFNQRElGIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgItCS0YXRltC0IEFVWCAxIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgItCS0YXRltC0IEFVWCAyIgorCittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgItCf0LXRgtC70Y8g0LrQvtC00LXQutCwIgorCittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICLQn9C10YLQu9GPIFN1blZUUyIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAi0JPRg9GH0L3RltGB0YLRjCIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgItCf0ZbQtNGB0LjQu9C10L3QvdGPIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAi0JzQvtC90ZbRgtC+0YAiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICLQktCx0YPQtNC+0LLQsNC90LjQuSDQtNC40L3QsNC80ZbQuiIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAi0J3QsNCy0YPRiNC90LjQutC4IgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgItCb0ZbQvdGW0LnQvdC40Lkg0LLQuNGF0ZbQtCIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAi0JLQuNGF0ZbQtCBTUERJRiIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAi0JLQuNGF0ZbQtCBBVVggMSIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAi0JLQuNGF0ZbQtCBBVVggMiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIgorbXNnc3RyICLQn9C+0LzQuNC70LrQsCDQv9GW0LQg0YfQsNGBINGB0L/RgNC+0LHQuCDRh9C40YLQsNC90L3RjyAlZCDQsdCw0LnRgtGW0LIg0Lcg0L/RgNC40YHRgtGA0L7RjiDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisi0J3QtSDQstC00LDRlNGC0YzRgdGPINC+0YLRgNC40LzQsNGC0Lgg0YHQv9C40YHQvtC6INGD0YHRltGFINC80L7QttC70LjQstC40YUg0LLRltC00LXQvtGE0L7RgNC80LDRgtGW0LIsINGP0LrRliDQv9GW0LTRgtGA0LjQvNGD0ZQgIgorItC/0YDQuNGB0YLRgNGW0LkgXCIlc1wiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINC/0L7QsuKAmdGP0LfQsNGC0Lgg0LHRg9GE0LXRgNC4INC3INC/0YDQuNGB0YLRgNC+0Y4gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAi0JTRgNCw0LnQstC10YAg0L/RgNC40YHRgtGA0L7RjiDCqyVzwrsg0L3QtSDQv9GW0LTRgtGA0LjQvNGD0ZQg0LzQtdGC0L7QtCDQstCy0LXQtNC10L3QvdGPLdCy0LjQstC10LTQtdC90L3RjyDQtNCw0L3QuNGFICVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAiIgorItCU0YDQsNC50LLQtdGAINC/0YDQuNGB0YLRgNC+0Y4gwqslc8K7INC90LUg0L/RltC00YLRgNC40LzRg9GUINC20L7QtNC10L0g0LLRltC00L7QvNC40Lkg0LzQtdGC0L7QtCDQstCy0LXQtNC10L3QvdGPLdCy0LjQstC10LTQtdC90L3RjyAiCisi0LTQsNC90LjRhS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAi0J/RgNC40YHRgtGA0ZbQuSDCqyVzwrsg0LfQsNC50L3Rj9GC0L4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgItCf0YDQuNGB0YLRgNGW0LkgXCIlc1wiINC90LUg0LfQtNCw0YLQvdC40Lkg0LfQsNGF0L7Qv9C70Y7QstCw0YLQuCDQstGW0LTQtdC+INGDINGE0L7RgNC80LDRgtGWICVkeCVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICLQn9GA0LjRgdGC0YDRltC5IFwiJXNcIiDQvdC1INC30LTQsNGC0L3QuNC5INC30LDRhdC+0L/Qu9GO0LLQsNGC0Lgg0LLRltC00LXQviDRgyDQstC60LDQt9Cw0L3QvtC80YMg0YTQvtGA0LzQsNGC0ZYiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiIgorItCjINC/0YDQuNGB0YLRgNC+0Zcgwqslc8K7INC90LUg0L/QtdGA0LXQtNCx0LDRh9C10L3QviDQvNC+0LbQu9C40LLQvtGB0YLRliDQstC40LrQvtGA0LjRgdGC0LDQvdC90Y8g0YDQvtC30YDQuNCy0L3QuNGFINC/0LvQvtGJ0LjQvSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgItCd0LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQv9Cw0YDQsNC80LXRgtGA0Lgg0L/RgNC40YHRgtGA0L7RjiDCqyVzwrsuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICIiCisi0JLRltC00LXQvtC/0YDQuNGB0YLRgNC+0ZTQvCDQvdC1INC/0ZbQtNGC0YDQuNC80YPRlNGC0YzRgdGPINC90L7QstC1INC30L3QsNGH0LXQvdC90Y8g0L/QsNGA0LDQvNC10YLRgNCwINGH0LDRgdGC0L7RgtC4INC60LDQtNGA0ZbQsi4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICLQktGW0LTQtdC+0L/RgNC40YHRgtGA0L7RlNC8INC90LUg0L3QsNC00LDQvdC+INC00LDQvdC40YUg0YnQvtC00L4g0YTQvtGA0LzQsNGC0YMg0LLQuNCy0LXQtNC10L3QvdGPLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICLQktGW0LTQtdC+0L/RgNC40YHRgtGA0L7RlNC8INC/0L7QstC10YDQvdGD0YLQviDQvdC10LrQvtGA0LXQutGC0L3RliDRgNC+0LfQvNGW0YDQvdC+0YHRgtGWLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICLQlNGA0LDQudCy0LXRgCDQv9GA0LjRgdGC0YDQvtGOIMKrJXPCuyDQvdC1INC/0ZbQtNGC0YDQuNC80YPRlCDQvNC10YLQvtC0INGH0LXRgNC10LfRgNGP0LTQutC+0LLQvtCz0L4g0LLQuNCy0LXQtNC10L3QvdGPLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICLQktGW0LTQtdC+0L/RgNC40YHRgtGA0ZbQuSDQstC40LrQvtGA0LjRgdGC0L7QstGD0ZQg0L3QtdC/0ZbQtNGC0YDQuNC80YPQstCw0L3QuNC5INGE0L7RgNC80LDRgiDQv9GW0LrRgdC10LvRltCyLiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINC90LDQu9Cw0YjRgtGD0LLQsNGC0Lgg0LLQsdGD0LTQvtCy0LDQvdC40Lkg0LHRg9GE0LXRgC4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgItCS0ZbQtNC10L7Qv9GA0LjRgdGC0YDQvtGU0Lwg0L3QtSDQt9Cw0L/RgNC+0L/QvtC90L7QstCw0L3QviDQttC+0LTQvdC+0LPQviDRgNC+0LfQvNGW0YDRgyDQsdGD0YTQtdGA0LAuIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAi0J3QtdC80LDRlCDQv9GW0LTQu9C10LPQu9C+0LPQviDQsdGD0YTQtdGA0LAg0LTQu9GPINGW0LzQv9C+0YDRgtGD0LLQsNC90L3RjyDQtNCw0L3QuNGFLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J/QvtC80LjQu9C60LAg0L/RltC0INGH0LDRgSDRgdC/0YDQvtCx0Lgg0L7RgtGA0LjQvNCw0L3QvdGPINC00LDQvdC40YUg0YnQvtC00L4g0L/RgNC40LnQvNCw0YfQsCAlZCDQv9GA0LjRgdGC0YDQvtGOIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J/QvtC80LjQu9C60LAg0L/RltC0INGH0LDRgSDRgdC/0YDQvtCx0Lgg0L7RgtGA0LjQvNCw0L3QvdGPINC00LDQvdC40YUg0YnQvtC00L4g0LzQvtC20LvQuNCy0L7RgdGC0LXQuSDQv9GA0LjRgdGC0YDQvtGOIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICLQn9GA0LjRgdGC0YDRltC5IMKrJXPCuyDQvdC1INGUINC/0YDQuNC50LzQsNGH0LXQvC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0L/RgNC40LnQvdGP0YLRliDRgNCw0LTRltC+0LTQsNC90ZYg0Lcg0L/RgNC40YHRgtGA0L7RjiDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAi0J3QtSDQstC00LDQu9C+0YHRjyDQstGB0YLQsNC90L7QstC40YLQuCDQstCy0ZbQtCAlZCDQv9GA0LjRgdGC0YDQvtGOIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LUg0LLQtNCw0LvQvtGB0Y8g0LfQvNGW0L3QuNGC0Lgg0YHRgtCw0L0g0LLQuNC80LjQutCw0L3QvdGPINC30LLRg9C60YMg0L3QsCDQv9GA0LjRgdGC0YDQvtGXIMKrJXPCuy4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgItCd0LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQv9C+0YLRgNGW0LHQvdC40Lkg0L7QsdGB0Y/QsyDQv9Cw0LzigJnRj9GC0ZYuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgItCd0LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQv9C+0YLRgNGW0LHQvdC40Lkg0L7QsdGB0Y/QsyDQv9Cw0LzigJnRj9GC0ZYuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyLQl9Cw0YHRltCxINC/0LXRgNC10YLQstC+0YDQtdC90L3RjyDQvdCwINC/0YDQuNGB0YLRgNC+0ZcgJXMg0L3QtSDQvNC+0LbQtSDQvtGC0YDQuNC80YPQstCw0YLQuCDQtNCw0L3RliDRgyDQv9GW0LTRgtGA0LjQvNGD0LLQsNC90L7QvNGDICIKKyLRhNC+0YDQvNCw0YLRliIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorItCX0LDRgdGW0LEg0L/QtdGA0LXRgtCy0L7RgNC10L3QvdGPINC90LAg0L/RgNC40YHRgtGA0L7RlyAlcyDQvdC1INC80L7QttC1INCy0LjQstC+0LTQuNGC0Lgg0LTQsNC90ZYg0YMg0L/RltC00YLRgNC40LzRg9Cy0LDQvdC+0LzRgyAiCisi0YTQvtGA0LzQsNGC0ZYiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyLQl9Cw0YHRltCxINC60L7QtNGD0LLQsNC90L3RjyDQvdCwINC/0YDQuNGB0YLRgNC+0ZcgJXMg0L3QtSDQvNC+0LbQtSDQvtGC0YDQuNC80YPQstCw0YLQuCDQtNCw0L3RliDRgyDQv9GW0LTRgtGA0LjQvNGD0LLQsNC90L7QvNGDICIKKyLRhNC+0YDQvNCw0YLRliIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyLQl9Cw0YHRltCxINC60L7QtNGD0LLQsNC90L3RjyDQvdCwINC/0YDQuNGB0YLRgNC+0ZcgJXMg0L3QtSDQvNC+0LbQtSDQstC40LLQvtC00LjRgtC4INC00LDQvdGWINGDINC/0ZbQtNGC0YDQuNC80YPQstCw0L3QvtC80YMg0YTQvtGA0LzQsNGC0ZYiCisKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAi0J3QtSDQstC00LDQu9C+0YHRjyDQt9Cw0L/QvtGH0LDRgtC60YPQstCw0YLQuCDQv9C+0YLRltC6INC00LXQutC+0LTRg9Cy0LDQvdC90Y8uIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINC+0LHRgNC+0LHQuNGC0Lgg0LrQsNC00YAuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorItCf0L7QvNC40LvQutCwINC/0YDQuCDQvtGC0YDQuNC80LDQvdC90ZYg0LzQvtC20LvQuNCy0L7RgdGC0LXQuSDQv9GA0LjRgdGC0YDQvtGOIMKrJXPCuzog0LTRgNCw0LnQstC10YAg0L3QtSDRlCDQtNGA0LDQudCy0LXRgNC+0Lwg0LTQu9GPICIKKyJ2NGwyLiDQn9C10YDQtdCy0ZbRgNGC0LUsINC80L7QttC1INGG0LUg0LTRgNCw0LnQstC10YAg0YLQuNC/0YMgdjRsMS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICLQn9C+0LzQuNC70LrQsCDQv9GA0Lgg0LfQsNC/0LjRgtGWINCw0YLRgNC40LHRg9GC0ZbQsiDQstCy0L7QtNGDICVkINC/0YDQuNGB0YLRgNC+0Y4gJXMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J/QvtC80LjQu9C60LAg0L/RgNC4INCy0YHRgtCw0L3QvtCy0LvQtdC90L3RliDQv9GA0LjQudC80LDRh9CwICVkINC/0YDQuNGB0YLRgNC+0Y4gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCf0L7QvNC40LvQutCwINC/0YDQuCDQt9Cw0L/QuNGC0ZYg0L3QvtGA0LzQuCDQv9GA0LjRgdGC0YDQvtGOIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQsNGC0YDQuNCx0YPRgtC4INGA0LXQs9GD0LvRj9GC0L7RgNGW0LIg0LrQtdGA0YPQstCw0L3QvdGPINC/0YDQuNGB0YLRgNC+0Y4gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINGW0LTQtdC90YLQuNGE0ZbQutGD0LLQsNGC0Lgg0L/RgNC40YHRgtGA0ZbQuSDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCm0LUg0L3QtSDQv9GA0LjRgdGC0YDRltC5IMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINCy0ZbQtNC60YDQuNGC0Lgg0L/RgNC40YHRgtGA0ZbQuSDCqyVzwrsg0LTQu9GPINGH0LjRgtCw0L3QvdGPINGC0LAg0LfQsNC/0LjRgdGDLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgItCf0YDQuNGB0YLRgNGW0Lkgwqslc8K7INC90LUg0ZQg0L/RgNC40YHRgtGA0L7RlNC8INC30LDRhdC+0L/Qu9C10L3QvdGPLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAi0J/RgNC40YHRgtGA0ZbQuSDCqyVzwrsg0L3QtSDRlCDQv9GA0LjRgdGC0YDQvtGU0Lwg0LLQuNCy0LXQtNC10L3QvdGPINC00LDQvdC40YUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICLQn9GA0LjRgdGC0YDRltC5IMKrJXPCuyDQvdC1INGUINC/0YDQuNGB0YLRgNC+0ZTQvCBNMk0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINC30LTRg9Cx0LvRjtCy0LDRgtC4INC/0YDQuNGB0YLRgNGW0Lkgwqslc8K7INC00LvRjyDRh9C40YLQsNC90L3RjyDRgtCwINC30LDQv9C40YHRgy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LUg0LLQtNCw0LvQvtGB0Y8g0LLRgdGC0LDQvdC+0LLQuNGC0Lgg0L3QvtGA0LzRgyDQv9GA0LjRgdGC0YDQvtGOIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0L/QvtGC0L7Rh9C90YMg0YfQsNGB0YLQvtGC0YMg0L/RgNC40LnQvNCw0YfQsCDQv9GA0LjRgdGC0YDQvtGOIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAi0J3QtSDQstC00LDQu9C+0YHRjyDQstGB0YLQsNC90L7QstC40YLQuCDQv9C+0YLQvtGH0L3RgyDRh9Cw0YHRgtC+0YLRgyDQv9GA0LjQudC80LDRh9CwINC/0YDQuNGB0YLRgNC+0Y4gwqslc8K7INGDICVsdSDQk9GGLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLQn9C+0LzQuNC70LrQsCDQv9GA0Lgg0L7RgtGA0LjQvNCw0L3QvdGWINGB0LjQu9C4INGB0LjQs9C90LDQu9GDINC/0YDQuNGB0YLRgNC+0Y4gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC30L3QsNGH0LXQvdC90Y8g0LLRltC0INC+0YDQs9Cw0L3RgyDQutC10YDRg9Cy0LDQvdC90Y8gJWQg0L/RgNC40YHRgtGA0L7RjiDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisi0J3QtSDQstC00LDQu9C+0YHRjyDQstGB0YLQsNC90L7QstC40YLQuCDQt9C90LDRh9C10L3QvdGPICVkINC00LvRjyDQvtGA0LPQsNC90YMg0LrQtdGA0YPQstCw0L3QvdGPICVkINC/0YDQuNGB0YLRgNC+0Y4gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorItCd0LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQv9C+0YLQvtGH0L3QuNC5INCy0LLRltC0INC/0YDQuNGB0YLRgNC+0Y4gwqslc8K7LiDQnNC+0LbQu9C40LLQviDRhtC10Lkg0L/RgNC40YHRgtGA0ZbQuSDigJQgIgorItGA0LDQtNGW0L4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyLQndC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0L/QvtGC0L7Rh9C90LjQuSDQstC40YXRltC0INC/0YDQuNGB0YLRgNC+0Y4gwqslc8K7LiDQnNC+0LbQu9C40LLQviDRhtC10Lkg0L/RgNC40YHRgtGA0ZbQuSDigJQgIgorItGA0LDQtNGW0L4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgItCd0LUg0LLQtNCw0LvQvtGB0Y8g0LLRgdGC0LDQvdC+0LLQuNGC0Lgg0LLQuNGF0ZbQtCAlZCDQv9GA0LjRgdGC0YDQvtGOIMKrJXPCuy4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICLQl9C80ZbQvdCwINGA0L7Qt9C00ZbQu9GM0L3QvtGXINC30LTQsNGC0L3QvtGB0YLRliDQv9GA0Lgg0LLRltC00YLQstC+0YDQtdC90L3RliDRidC1INC90LUg0L/RltC00YLRgNC40LzRg9GU0YLRjNGB0Y8uIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICLQoNC+0LHQvtGC0LAg0LHQtdC3INCz0L7QtNC40L3QvdC40LrQsCDQvdC10LzQvtC20LvQuNCy0LAiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgItCS0L3Rg9GC0YDRltGI0L3RjyDQv9C+0LzQuNC70LrQsCDQv9C+0YLQvtC60YMg0LTQsNC90LjRhS4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICLQn9C+0LzQuNC70LrQsCDQstC90YPRgtGA0ZbRiNC90YzQvtCz0L4g0L/QtdGA0LXQvdC10YHQtdC90L3RjyDQtNCw0L3QuNGFLiIKKworI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAi0J/RgNC40YHRgtGA0ZbQuSDCqyVzwrsg0L3QtSDQvNC+0LbQtSDQt9Cw0YXQvtC/0LvRjtCy0LDRgtC4INCy0ZbQtNC10L7QtNCw0L3RliIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzb3VuZCBzZXJ2ZXIiCisjfiBtc2dzdHIgItCd0LUg0LLQtNCw0LvQvtGB0Y8g0LLRgdGC0LDQvdC+0LLQuNGC0Lgg0Lcn0ZTQtNC90LDQvdC90Y8g0ZbQtyDQt9Cy0YPQutC+0LLQuNC8INGB0LXRgNCy0LXRgNC+0LwuIgorCisjfiBtc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IHNvdW5kIHNlcnZlciBjYXBhYmlsaXRpZXMiCisjfiBtc2dzdHIgItCf0L7QvNC40LvQutCwINC/0YDQuCDQt9Cw0L/QuNGC0ZYg0LzQvtC20LvQuNCy0L7RgdGC0LXQuSDQt9Cy0YPQutC+0LLQvtCz0L4g0YHQtdGA0LLQtdGA0LAiCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICLQndC40LfRjNC60ZYiCisKKyN+IG1zZ2lkICJUcmVibGUiCisjfiBtc2dzdHIgItCS0LjRgdC+0LrRliIKKworI34gbXNnaWQgIlN5bnRoIgorI34gbXNnc3RyICLQodC40L3RgtC10LfQsNGC0L7RgCIKKworI34gbXNnaWQgIlBDTSIKKyN+IG1zZ3N0ciAi0JrQhtCcIgorCisjfiBtc2dpZCAiU3BlYWtlciIKKyN+IG1zZ3N0ciAi0JTQuNC90LDQvNGW0LoiCisKKyN+IG1zZ2lkICJMaW5lLWluIgorI34gbXNnc3RyICLQm9GW0L3RltC50L3QuNC5INCy0YXRltC0IgorCisjfiBtc2dpZCAiQ0QiCisjfiBtc2dzdHIgItCa0JQiCisKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAi0JzRltC60YjQtdGAIgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgItCa0IbQnC0yIgorCisjfiBtc2dpZCAiUmVjb3JkIgorI34gbXNnc3RyICLQl9Cw0L/QuNGBIgorCisjfiBtc2dpZCAiSW4tZ2FpbiIKKyN+IG1zZ3N0ciAi0JLRhS7Qv9GW0LTRgdC40LvQtdC90L3RjyIKKworI34gbXNnaWQgIk91dC1nYWluIgorI34gbXNnc3RyICLQktC40YUu0L/RltC00YHQuNC70LXQvdC90Y8iCisKKyN+IG1zZ2lkICJMaW5lLTEiCisjfiBtc2dzdHIgItCb0ZbQvdGW0LnQvdC40LktMSIKKworI34gbXNnaWQgIkxpbmUtMiIKKyN+IG1zZ3N0ciAi0JvRltC90ZbQudC90LjQuS0yIgorCisjfiBtc2dpZCAiTGluZS0zIgorI34gbXNnc3RyICLQm9GW0L3RltC50L3QuNC5LTMiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTEiCisjfiBtc2dzdHIgItCm0LjRhNGA0L7QstC40LktMSIKKworI34gbXNnaWQgIkRpZ2l0YWwtMiIKKyN+IG1zZ3N0ciAi0KbQuNGE0YDQvtCy0LjQuS0yIgorCisjfiBtc2dpZCAiRGlnaXRhbC0zIgorI34gbXNnc3RyICLQptC40YTRgNC+0LLQuNC5LTMiCisKKyN+IG1zZ2lkICJQaG9uZS1pbiIKKyN+IG1zZ3N0ciAi0JLRhS7RgtC10LvQtdGE0L7QvSIKKworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAi0JLQuNGFLtGC0LXQu9C10YTQvtC9IgorCisjfiBtc2dpZCAiVmlkZW8iCisjfiBtc2dzdHIgItCS0ZbQtNC10L4iCisKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAi0KDQsNC00ZbQviIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCisjfiBtc2dzdHIgItCd0LUg0LLQtNCw0LvQvtGB0Y8g0LLRltC00LrRgNC40YLQuCDQv9GA0LjRgdGC0YDRltC5INC00LvRjyDQutC10YDRg9Cy0LDQvdC90Y8g0YDQtdCz0YPQu9GP0YLQvtGA0LDQvNC4INC80ZbQutGI0LXRgNCwLiIKKworI34gbXNnaWQgIiIKKyN+ICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIFRoaXMgdmVyc2lvbiBvZiAiCisjfiAidGhlIE9wZW4gU291bmQgU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gItCd0LUg0LLQtNCw0LvQvtGB0Y8g0LLRltC00LrRgNC40YLQuCDQv9GA0LjRgdGC0YDRltC5INC00LvRjyDQutC10YDRg9Cy0LDQvdC90Y8g0YDQtdCz0YPQu9GP0YLQvtGA0LDQvNC4INC80ZbQutGI0LXRgNCwLiDQptGPICIKKyN+ICLQstC10YDRgdGW0Y8gT3BlbiBTb3VuZCBTeXN0ZW0g0L3QtSDQv9GW0LTRgtGA0LjQvNGD0ZTRgtGM0YHRjyDRhtC40Lwg0LXQu9C10LzQtdC90YLQvtC8LiIKKworI34gbXNnaWQgIk1hc3RlciIKKyN+IG1zZ3N0ciAi0J7RgdC90L7QstC90LjQuSIKKworI34gbXNnaWQgIkZyb250IgorI34gbXNnc3RyICLQn9C10YDQtdC00L3RltC5IgorCisjfiBtc2dpZCAiUmVhciIKKyN+IG1zZ3N0ciAi0JfQsNC00L3RltC5IgorCisjfiBtc2dpZCAiSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAi0J3QsNCy0YPRiNC90LjQutC4IgorCisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICLQptC10L3RgtGA0LDQu9GM0L3QuNC5IgorCisjfiBtc2dpZCAiTEZFIgorI34gbXNnc3RyICJMRkUiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCIKKyN+IG1zZ3N0ciAi0J7QsSfRlNC80L3QuNC5IgorCisjfiBtc2dpZCAiU2lkZSIKKyN+IG1zZ3N0ciAi0JHQvtC60L7QstC40LkiCisKKyN+IG1zZ2lkICJBVVggT3V0IgorI34gbXNnc3RyICLQktC40YXRltC0IEFVWCIKKworI34gbXNnaWQgIjNEIERlcHRoIgorI34gbXNnc3RyICLQn9GA0L7RgdGC0L7RgNC+0LLQsCDQs9C70LjQsdC40L3QsCIKKworI34gbXNnaWQgIjNEIENlbnRlciIKKyN+IG1zZ3N0ciAi0J/RgNC+0YHRgtC+0YDQvtCy0LjQuSDRhtC10L3RgtGAIgorCisjfiBtc2dpZCAiM0QgRW5oYW5jZSIKKyN+IG1zZ3N0ciAi0J/RgNC+0YHRgtC+0YDQvtCy0LUg0L/QvtC60YDQsNGJ0LXQvdC90Y8iCisKKyN+IG1zZ2lkICJUZWxlcGhvbmUiCisjfiBtc2dzdHIgItCi0LXQu9C10YTQvtC9IgorCisjfiBtc2dpZCAiVmlkZW8gSW4iCisjfiBtc2dzdHIgItCS0ZbQtNC10L7QstGF0ZbQtCIKKworI34gbXNnaWQgIkFVWCBJbiIKKyN+IG1zZ3N0ciAi0JLRhdGW0LQgQVVYIgorCisjfiBtc2dpZCAiUmVjb3JkIEdhaW4iCisjfiBtc2dzdHIgItCf0ZbQtNGB0LjQu9C10L3QvdGPINC30LDQv9C40YHRgyIKKworI34gbXNnaWQgIk91dHB1dCBHYWluIgorI34gbXNnc3RyICLQn9GW0LTRgdC40LvQtdC90L3RjyDQstC40YXQvtC00YMiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEJvb3N0IgorI34gbXNnc3RyICLQn9GW0LTRgdC40LvQtdC90L3RjyDQvNGW0LrRgNC+0YTQvtC90LAiCisKKyN+IG1zZ2lkICJEaWFnbm9zdGljIgorI34gbXNnc3RyICLQlNGW0LDQs9C90L7RgdGC0LjQutCwIgorCisjfiBtc2dpZCAiQmFzcyBCb29zdCIKKyN+IG1zZ3N0ciAi0J/RltC00YHQuNC70LXQvdC90Y8g0LHQsNGB0ZbQsiIKKworI34gbXNnaWQgIlBsYXliYWNrIFBvcnRzIgorI34gbXNnc3RyICLQn9C+0YDRgtC4INCy0ZbQtNGC0LLQvtGA0LXQvdC90Y8iCisKKyN+IG1zZ2lkICJJbnB1dCIKKyN+IG1zZ3N0ciAi0JLRhdGW0LQiCisKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAi0KHQv9C+0YHRgtC10YDQtdC20LXQvdC90Y8g0LfQsCDQtNC20LXRgNC10LvQvtC8IgorCisjfiBtc2dpZCAiS2V5Ym9hcmQgQmVlcCIKKyN+IG1zZ3N0ciAi0JPRg9C00L7QuiDQutC70LDQstGW0LDRgtGD0YDQuCIKKworI34gbXNnaWQgIlNpbXVsYXRlIFN0ZXJlbyIKKyN+IG1zZ3N0ciAi0IbQvNGW0YLQsNGG0ZbRjyDRgdGC0LXRgNC10L4iCisKKyN+IG1zZ2lkICJTdGVyZW8iCisjfiBtc2dzdHIgItCh0YLQtdGA0LXQviIKKworI34gbXNnaWQgIlN1cnJvdW5kIFNvdW5kIgorI34gbXNnc3RyICLQntCxJ9GU0LzQvdC40Lkg0LfQstGD0LoiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgItCf0ZbQtNGB0LjQu9C10L3QvdGPINC80ZbQutGA0L7RhNC+0L3QsCIKKworI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICLQntGB0L3QvtCy0L3QuNC5INC00LjQvdCw0LzRltC6IgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBTb3VyY2UiCisjfiBtc2dzdHIgItCe0YHQvdC+0LLQvdC40Lkg0LzRltC60YDQvtGE0L7QvSIKKworI34gbXNnaWQgIkphY2siCisjfiBtc2dzdHIgIkphY2siCisKKyN+IG1zZ2lkICJDZW50ZXIgLyBMRkUiCisjfiBtc2dzdHIgItCm0LXQvdGC0YDQsNC70YzQvdC40LkvTEZFIgorCisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAi0KHRgtC10YDQtdC+0LzRltC60YjQtdGAIgorCisjfiBtc2dpZCAiTW9ubyBNaXgiCisjfiBtc2dzdHIgItCc0L7QvdC+0LzRltC60YjQtdGAIgorCisjfiBtc2dpZCAiSW5wdXQgTWl4IgorI34gbXNnc3RyICLQnNGW0LrRiNC10YAg0LLRhS4g0LTQsNC90LjRhSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAi0JzRltC60YDQvtGE0L7QvSAxIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICLQnNGW0LrRgNC+0YTQvtC9IDIiCisKKyN+IG1zZ2lkICJEaWdpdGFsIE91dCIKKyN+IG1zZ3N0ciAi0KbQuNGE0YDQvtCy0LjQuSDQstC40YXRltC0IgorCisjfiBtc2dpZCAiRGlnaXRhbCBJbiIKKyN+IG1zZ3N0ciAi0KbQuNGE0YDQvtCy0LjQuSDQstGF0ZbQtCIKKworI34gbXNnaWQgIkhETUkiCisjfiBtc2dzdHIgIkhETUkiCisKKyN+IG1zZ2lkICJNb2RlbSIKKyN+IG1zZ3N0ciAi0JzQvtC00LXQvCIKKworI34gbXNnaWQgIkhhbmRzZXQiCisjfiBtc2dzdHIgItCT0LDRgNC90ZbRgtGD0YDQsCIKKworI34gbXNnaWQgIk90aGVyIgorI34gbXNnc3RyICLQhtC90YjQtSIKKworI34gbXNnaWQgIk5vbmUiCisjfiBtc2dzdHIgItCd0LXQvNCw0ZQiCisKKyN+IG1zZ2lkICJPbiIKKyN+IG1zZ3N0ciAi0KPQstGW0LzQutC9LiIKKworI34gbXNnaWQgIk9mZiIKKyN+IG1zZ3N0ciAi0JLQuNC80LrQvS4iCisKKyN+IG1zZ2lkICJNdXRlIgorI34gbXNnc3RyICLQktC40LzQutC90YPRgtC4INC30LLRg9C6IgorCisjfiBtc2dpZCAiRmFzdCIKKyN+IG1zZ3N0ciAi0KjQstC40LTQutC+IgorCisjfiBtc2dpZCAiVmVyeSBMb3ciCisjfiBtc2dzdHIgItCU0YPQttC1INC90LjQt9GM0LrQsCIKKworI34gbXNnaWQgIkxvdyIKKyN+IG1zZ3N0ciAi0J3QuNC30YzQutCwIgorCisjfiBtc2dpZCAiTWVkaXVtIgorI34gbXNnc3RyICLQodC10YDQtdC00L3RjyIKKworI34gbXNnaWQgIkhpZ2giCisjfiBtc2dzdHIgItCS0LjRgdC+0LrQsCIKKworI34gbXNnaWQgIlZlcnkgSGlnaCIKKyN+IG1zZ3N0ciAi0JTRg9C20LUg0LLQuNGB0L7QutCwIgorCisjfiBtc2dpZCAiUHJvZHVjdGlvbiIKKyN+IG1zZ3N0ciAi0J/RgNC+0LzQuNGB0LvQvtCy0LAiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICLQnNGW0LrRgNC+0YTQvtC9INC/0LXRgNC10LTQvdGM0L7RlyDQv9Cw0L3QtdC70ZYiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIEluIgorI34gbXNnc3RyICLQm9GW0L3RltC50L3QuNC5INCy0YXRltC0INC/0LXRgNC10LTQvdGM0L7RlyDQv9Cw0L3QtdC70ZYiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBIZWFkcGhvbmVzIgorI34gbXNnc3RyICLQktC40YXRltC0INC90LDQstGD0YjQvdC40LrRltCyINC/0LXRgNC10LTQvdGM0L7RlyDQv9Cw0L3QtdC70ZYiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIE91dCIKKyN+IG1zZ3N0ciAi0JvRltC90ZbQudC90LjQuSDQstC40YXRltC0INC/0LXRgNC10LTQvdGM0L7RlyDQv9Cw0L3QtdC70ZYiCisKKyN+IG1zZ2lkICJHcmVlbiBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCX0LXQu9C10L3QuNC5INGA0L7Qt9C90ZbQvCIKKworI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICLQoNC+0LbQtdCy0LjQuSDRgNC+0LfQvdGW0LwiCisKKyN+IG1zZ2lkICJCbHVlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi0KHQuNC90ZbQuSDRgNC+0LfQvdGW0LwiCisKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCR0ZbQu9C40Lkg0YDQvtC30L3RltC8IgorCisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICLQp9C+0YDQvdC40Lkg0YDQvtC30L3RltC8IgorCisjfiBtc2dpZCAiR3JheSBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCh0ZbRgNC40Lkg0YDQvtC30L3RltC8IgorCisjfiBtc2dpZCAiT3JhbmdlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi0J/QvtC80LDRgNCw0L3Rh9C10LLQuNC5INGA0L7Qt9C90ZbQvCIKKworI34gbXNnaWQgIlJlZCBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCn0LXRgNCy0L7QvdC40Lkg0YDQvtC30L3RltC8IgorCisjfiBtc2dpZCAiWWVsbG93IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi0JbQvtCy0YLQuNC5INGA0L7Qt9C90ZbQvCIKKworI34gbXNnaWQgIkdyZWVuIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi0JfQtdC70LXQvdC40Lkg0YDQvtC30L3RltC8INC/0LXRgNC10LTQvdGM0L7RlyDQv9Cw0L3QtdC70ZYiCisKKyN+IG1zZ2lkICJQaW5rIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi0KDQvtC20LXQstC40Lkg0YDQvtC30L3RltC8INC/0LXRgNC10LTQvdGM0L7RlyDQv9Cw0L3QtdC70ZYiCisKKyN+IG1zZ2lkICJCbHVlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi0KHQuNC90ZbQuSDRgNC+0LfQvdGW0Lwg0L/QtdGA0LXQtNC90YzQvtGXINC/0LDQvdC10LvRliIKKworI34gbXNnaWQgIldoaXRlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi0JHRltC70LjQuSDRgNC+0LfQvdGW0Lwg0L/QtdGA0LXQtNC90YzQvtGXINC/0LDQvdC10LvRliIKKworI34gbXNnaWQgIkJsYWNrIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi0KfQvtGA0L3QuNC5INGA0L7Qt9C90ZbQvCDQv9C10YDQtdC00L3RjNC+0Zcg0L/QsNC90LXQu9GWIgorCisjfiBtc2dpZCAiR3JheSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCh0ZbRgNC40Lkg0YDQvtC30L3RltC8INC/0LXRgNC10LTQvdGM0L7RlyDQv9Cw0L3QtdC70ZYiCisKKyN+IG1zZ2lkICJPcmFuZ2UgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLQn9C+0LzQsNGA0LDQvdGH0LXQstC40Lkg0YDQvtC30L3RltC8INC/0LXRgNC10LTQvdGM0L7RlyDQv9Cw0L3QtdC70ZYiCisKKyN+IG1zZ2lkICJSZWQgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLQp9C10YDQstC+0L3QuNC5INGA0L7Qt9C90ZbQvCDQv9C10YDQtdC00L3RjNC+0Zcg0L/QsNC90LXQu9GWIgorCisjfiBtc2dpZCAiWWVsbG93IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi0JbQvtCy0YLQuNC5INGA0L7Qt9C90ZbQvCDQv9C10YDQtdC00L3RjNC+0Zcg0L/QsNC90LXQu9GWIgorCisjfiBtc2dpZCAiU3ByZWFkIE91dHB1dCIKKyN+IG1zZ3N0ciAi0KDQvtC30LPQvtGA0L3Rg9GC0Lgg0LLQuNGF0ZbQtCIKKworI34gbXNnaWQgIkRvd25taXgiCisjfiBtc2dzdHIgItCe0LHigJnRlNC00L3QsNC90L3RjyDQutCw0L3QsNC70ZbQsiIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgSW5wdXQiCisjfiBtc2dzdHIgItCS0YXRltC0INCy0ZbRgNGC0YPQsNC70YzQvdC+0LPQviDQvNGW0LrRiNC10YDQsCIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgT3V0cHV0IgorI34gbXNnc3RyICLQktC40YXRltC0INCy0ZbRgNGC0YPQsNC70YzQvdC+0LPQviDQvNGW0LrRiNC10YDQsCIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgQ2hhbm5lbHMiCisjfiBtc2dzdHIgItCa0LDQvdCw0LvQuCDQstGW0YDRgtGD0LDQu9GM0L3QvtCz0L4g0LzRltC60YjQtdGA0LAiCisKKyN+IG1zZ2lkICIlcyAlZCBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiJXMsINGE0YPQvdC60YbRltGPICVkIgorCisjfiBtc2dpZCAiJXMgRnVuY3Rpb24iCisjfiBtc2dzdHIgItCk0YPQvdC60YbRltGPICVzIgorCisjfiBtc2dpZCAiR290IHVuZXhwZWN0ZWQgZnJhbWUgc2l6ZSBvZiAldSBpbnN0ZWFkIG9mICV1LiIKKyN+IG1zZ3N0ciAi0J7RgtGA0LjQvNCw0L3QviDQvdC10L7Rh9GW0LrRg9Cy0LDQvdC40Lkg0YDQvtC30LzRltGAINCx0LvQvtC60YMgJXUg0LfQsNC80ZbRgdGC0YwgJXUuIgorCisjfiBtc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBvbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgItCf0L7QvNC40LvQutCwINC/0ZbQtCDRh9Cw0YEg0YHQv9GA0L7QsdC4INGH0LjRgtCw0L3QvdGPICVkINCx0LDQudGC0ZbQsiDQvdCwINC/0YDQuNGB0YLRgNC+0Zcgwqslc8K7LiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlbnF1ZXVlIGJ1ZmZlcnMgaW4gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINC+0L/QuNGC0LDRgtC4INCx0YPRhNC10YDQuCDQstGW0LQg0L/RgNC40YHRgtGA0L7RjiDCqyVzwrsuIgorCisjfiBtc2dpZCAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LLRltC00LXQvtC60LDQtNGA0Lgg0Lcg0L/RgNC40YHRgtGA0L7RjiDCqyVzwrsuIgorCisjfiBtc2dpZCAiRmFpbGVkIGFmdGVyICVkIHRyaWVzLiBkZXZpY2UgJXMuIHN5c3RlbSBlcnJvcjogJXMiCisjfiBtc2dzdHIgItCf0L7QvNC40LvQutCwINC/0ZbRgdC70Y8gJWQg0YHQv9GA0L7QsS4g0J/RgNC40YHRgtGA0ZbQuSAlcy4g0KHQuNGB0YLQtdC80L3QsCDQv9C+0LzQuNC70LrQsDogJXMiCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgcmVhZCBmcm9tIENELiIKKyN+IG1zZ3N0ciAi0J3QtSDQstC00LDRlNGC0YzRgdGPINC/0YDQvtGH0LjRgtCw0YLQuCDQtyDQutC+0LzQv9Cw0LrRgi3QtNC40YHQutGDLiIKKworI34gbXNnaWQgIkRpc2MgaXMgbm90IGFuIEF1ZGlvIENELiIKKyN+IG1zZ3N0ciAi0JTQuNGB0Log0L3QtSDRlCDQsNGD0LTRltC+INC60L7QvNC/0LDQutGCLdC00LjRgdC60L7QvC4iCisKKyN+IG1zZ2lkICJUaGlzIGZpbGUgaXMgZW5jcnlwdGVkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKKyN+IG1zZ3N0ciAi0KTQsNC50Lsg0LfQsNGI0LjRhNGA0L7QstCw0L3QuNC5INGC0LAg0L3QtSDQvNC+0LbQtSDQsdGD0YLQuCDQstGW0LTRgtCy0L7RgNC10L3QuNC5LiIKKworI34gbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcy4nIgorI34gbXNnc3RyICLQndC1INCy0LTQsNGU0YLRjNGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQsNGC0YDQuNCx0YPRgtC4INC+0YDQs9Cw0L3RltCyINC60LXRgNGD0LLQsNC90L3RjyDQv9GA0LjRgdGC0YDQvtGOIFwiJXNcIi4iCisKKyN+IG1zZ2lkICIiCisjfiAiVGhlIGJ1ZmZlciB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzLCBvciBubyAiCisjfiAiYnVmZmVycyBoYXZlIGJlZW4gYWxsb2NhdGVkIHlldCwgb3IgdGhlIHVzZXJwdHIgb3IgbGVuZ3RoIGFyZSBpbnZhbGlkLiAiCisjfiAiZGV2aWNlICVzIgorI34gbXNnc3RyICIiCisjfiAi0JHRg9GE0LXRgCDRhtGM0L7Qs9C+INGC0LjQv9GDINC90LUg0L/RltC00YLRgNC40LzRg9GU0YLRjNGB0Y8sINCw0LHQviDRltC90LTQtdC60YEg0L/QvtC30LAg0LzQtdC20LDQvNC4INC00ZbQsNC/0LDQt9C+0L3Rgywg0LDQsdC+ICIKKyN+ICLQsdGD0YTQtdGA0Lgg0YnQtSDQvdC1INCx0YPQu9C4INCy0LjQtNGW0LvQtdC90ZYsINCw0LHQviDQvdC10L/RgNCw0LLQuNC70YzQvdGWINC/0LDRgNCw0LzQtdGC0YDQuCB1c2VycHRyINGH0Lgg0LTQvtCy0LbQuNC90LAuICIKKyN+ICLQn9GA0LjRgdGC0YDRltC5ICVzIgorCisjfiBtc2dpZCAiIgorI34gIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiBOb3QgZW5vdWdoIG1lbW9yeS4iCisjfiBtc2dzdHIgIiIKKyN+ICLQndC1INCy0LTQsNGU0YLRjNGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQstGW0LTQtdC+0LrQsNC00YDQuCDQtyDQv9GA0LjRgdGC0YDQvtGOIFwiJXNcIi4g0J3QtdC00L7RgdGC0LDRgtC90YzQviDQv9Cw0Lwn0Y/RgtGWLiIKKworI34gbXNnaWQgImluc3VmZmljaWVudCBtZW1vcnkgdG8gZW5xdWV1ZSBhIHVzZXIgcG9pbnRlciBidWZmZXIuIGRldmljZSAlcy4iCisjfiBtc2dzdHIgIiIKKyN+ICLQndC10LTQvtGB0YLQsNGC0L3RjNC+INC/0LDQvCfRj9GC0ZYg0LTQu9GPINCy0YHRgtCw0LLQu9GP0L3QvdGPINGDINGH0LXRgNCz0YMg0LLQutCw0LfRltCy0L3QuNC60LAg0L3QsCDQsdGD0YTQtdGAICIKKyN+ICLQutC+0YDQuNGB0YLRg9Cy0LDRh9CwLiDQn9GA0LjRgdGC0YDRltC5ICVzLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBleGNoYW5nZSBkYXRhIHdpdGggZGV2aWNlICclcycuIgorI34gbXNnc3RyICLQn9C+0LzQuNC70LrQsCDQv9GA0Lgg0L7QsdC80ZbQvdGWINC00LDQvdC40LzQuCDQtyDQv9GA0LjRgdGC0YDQvtGU0LwgXCIlc1wiLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBzZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKKyN+IG1zZ3N0ciAi0J3QtSDQstC00LDRlNGC0YzRgdGPINCy0YHRgtCw0L3QvtCy0LjRgtC4INC/0LDRgNCw0LzQtdGC0YDQuCDQv9GA0LjRgdGC0YDQvtGOIFwiJXNcIi4iCisKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZC8lZCBmcmFtZXMgcGVyIHNlY29uZCIKKyN+IG1zZ3N0ciAi0J/RgNC40YHRgtGA0ZbQuSBcIiVzXCIg0L3QtSDQt9C00LDRgtC90LjQuSDQt9Cw0YXQvtC/0LvRjtCy0LDRgtC4ICVkLyVkINC60LDQtNGA0ZbQsiDQt9CwINGB0LXQutGD0L3QtNGDIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGdldCBidWZmZXJzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLQndC1INCy0LTQsNGU0YLRjNGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQsdGD0YTQtdGA0Lgg0LLRltC0INC/0YDQuNGB0YLRgNC+0Y4gXCIlc1wiLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBnZXQgZW5vdWdoIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgItCd0LUg0LLQtNCw0ZTRgtGM0YHRjyDQvtGC0YDQuNC80LDRgtC4INC00L7RgdGC0LDRgtC90YzQviDQsdGD0YTQtdGA0ZbQsiDQstGW0LQg0L/RgNC40YHRgtGA0L7RjiBcIiVzXCIuIgorCisjfiBtc2dpZCAiRXJyb3Igc3RhcnRpbmcgc3RyZWFtaW5nIGNhcHR1cmUgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgItCd0LUg0LLQtNCw0ZTRgtGM0YHRjyDRgNC+0LfQv9C+0YfQsNGC0Lgg0LfQsNGF0L7Qv9C70LXQvdC90Y8g0LrQsNC00YDRltCyINC3INC/0YDQuNGB0YLRgNC+0Y4gXCIlc1wiLiIKKworI34gbXNnaWQgIkVycm9yIHN0b3BwaW5nIHN0cmVhbWluZyBjYXB0dXJlIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLQn9C+0LzQuNC70LrQsCDQv9GA0Lgg0LfRg9C/0LjQvdC10L3QvdGWINC30LDRhdC+0L/Qu9C10L3QvdGPINC60LDQtNGA0ZbQsiDQtyDQv9GA0LjRgdGC0YDQvtGOIFwiJXNcIi4iCmRpZmYgLS1naXQgYS9wby92aS5wbyBiL3BvL3ZpLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMmRmN2YKLS0tIC9kZXYvbnVsbAorKysgYi9wby92aS5wbwpAQCAtMCwwICsxLDc5MSBAQAorIyBWaWV0bmFtZXNlIFRyYW5zbGF0aW9uIGZvciBHU1QgUGx1Z2lucyBHb29kLgorIyBC4bqjbiBk4buLY2ggdGnhur9uZyBWaeG7h3QgZMOgbmggY2hvIEdTVCBQbHVnaW5zIEdvb2QuCisjIENvcHlyaWdodCDCqSAyMDE2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ3N0LXBsdWdpbnMtZ29vZCBwYWNrYWdlLgorIyBDbHl0aWUgU2lkZGFsbCA8Y2x5dGllQHJpdmVybGFuZC5uZXQuYXU+LCAyMDA1LTIwMTAuCisjIFRy4bqnbiBOZ+G7jWMgUXXDom4gPHZud2lsZG1hbkBnbWFpbC5jb20+LCAyMDEyLTIwMTQsIDIwMTUsIDIwMTYuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kIDEuNy4yXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTYtMDItMjEgMDc6MjUrMDcwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogVHLhuqduIE5n4buNYyBRdcOibiA8dm53aWxkbWFuQGdtYWlsLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBWaWV0bmFtZXNlIDx0cmFuc2xhdGlvbi10ZWFtLXZpQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD5cbiIKKyJMYW5ndWFnZTogdmlcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTE7IHBsdXJhbD0wO1xuIgorIlgtTGFuZ3VhZ2UtVGVhbS1XZWJzaXRlOiA8aHR0cDovL3RyYW5zbGF0aW9ucHJvamVjdC5vcmcvdGVhbS92aS5odG1sPlxuIgorIlgtR2VuZXJhdG9yOiBHdHJhbnNsYXRvciAyLjkxLjdcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiS2jDtG5nIHTDrG0gdGjhuqV5IG3DoXkgcGjhu6VjIHbhu6UgSmFjayIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiR+G6t3AgbOG7l2kga2hpIGdp4bqjaSBtw6Mg4bqjbmggSlBFRyIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAi4oCcJXPigJ0gYuG7n2kg4oCcJXPigJ0iCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIktow7RuZyB0aOG7gyBr4bq/dCBu4buRaSB04bubaSBtw6F5IHBo4bulYyB24bulIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIktow7RuZyBjw7MgVVJMIG7DoG8gxJHGsOG7o2MgxJHhurd0LiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiS2jDtG5nIHRo4buDIHBow6JuIGdp4bqjaSB0w6puIG3DoXkgcGjhu6VjIHbhu6UuIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIktow7RuZyB0aOG7gyB0aGnhur90IGzhuq1wIGvhur90IG7hu5FpIHThu5tpIG3DoXkgY2jhu6cuIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAiR+G6t3AgbOG7l2kga2hpIGPDoGkgxJHhurd0IGvhur90IG7hu5FpIGFuIHRvw6BuLiIKKworbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIkPDsyBs4buXaSBt4bqhbmcgxJHDoyB44bqjeSByYSwgaG/hurdjIG3DoXkgY2jhu6cgxJHDs25nIGvhur90IG7hu5FpIGLhuqV0IG5n4budLiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiTcOheSBjaOG7pyBn4butaSBk4buvIGxp4buHdSBzYWkuIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIk3DoXkgcGjhu6VjIHbhu6Uga2jDtG5nIGjhu5cgdHLhu6MgZGkgY2h1eeG7g24gduG7iyB0csOtIMSR4buNYy4iCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIiIKKyJDaMawYSBjw7MgZOG7ryBsaeG7h3Ugw6JtIHRoYW5oIG5o4bqtcCwgaG/hurdjIGThu68gbGnhu4d1IMOibSB0aGFuaCBuaOG6rXAga2jDtG5nIGjhu6NwIGzhu4cuIFbDrCAiCisidGjhur8gbHXhu5NuZyBBVkkgc+G6vSBo4buPbmcuIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJU4bqtcCB0aW4gbsOgeSBraMO0bmcgY2jhu6lhIGx14buTbmcgY8OzIHRo4buDIHBow6F0LiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiVOG6rXAgdGluIG7DoHkga2jDtG5nIGjhu6NwIGzhu4cgbsOqbiBraMO0bmcgdGjhu4MgcGjDoXQgxJHGsOG7o2MuIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIktow7RuZyB0aOG7gyBwaMOhdCBsdeG7k25nIGThu68gbGnhu4d1IGLhu59pIHbDrCBuw7MgxJHGsOG7o2MgbcOjIGjDs2EgYuG6sW5nIFBsYXlSZWFkeSBEUk0uIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJU4bqtcCB0aW4gbsOgeSBi4buLIGjhu49uZyBuw6puIGtow7RuZyB0aOG7gyBwaMOhdC4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIkvDrWNoIHRoxrDhu5tjIG5ndXnDqm4gdOG7rSAoYXRvbSkga2jDtG5nIGjhu6NwIGzhu4cuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJU4bqtcCB0aW4gbsOgeSBjaMawYSBob8OgbiB0aMOgbmggbsOqbiBraMO0bmcgdGjhu4MgxJHGsOG7o2MgcGjDoXQuIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICLhuqJuaCDEkeG7mW5nIHRyb25nIHThuq1wIHRpbiBuw6B5IGPDsyB0aOG7gyBraMO0bmcgcGjDoXQgxJHDum5nLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICJU4bqtcCB0aW4gbsOgeSBjaOG7qWEgcXXDoSBuaGnhu4F1IGx14buTbmcgbsOqbiBjaOG7iSBwaMOhdCAlZCDEkeG6p3UgdGnDqm4iCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorIktow7RuZyB0w6xtIHRo4bqleSBsdeG7k25nIMSRxrDhu6NjIGjhu5cgdHLhu6MuIE5nxrDhu51pIGTDuW5nIGPDsyB0aOG7gyBj4bqnbiBwaOG6o2kgY8OgaSDEkeG6t3QgbeG7mXQgIgorInBo4bqnbiBi4buVIHN1bmcgUlRTUCBHc3RyZWFtZXIgxJHhu4MgeOG7rSBsw70gbHXhu5NuZyBuaOG6oWMvcGhpbSBsb+G6oWkgUmVhbC4iCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKyJLaMO0bmcgdMOsbSB0aOG6pXkgbHXhu5NuZyBk4buvIGxp4buHdSDEkcaw4bujYyBo4buXIHRy4bujLiBOZ8aw4budaSBkw7luZyBjw7MgdGjhu4MgY+G6p24gY2hvIHBow6lwICIKKyJ0aMOqbSBnaWFvIHRo4bupYyB0cnV54buBbiwgaG/hurdjIGNoxrBhIGPDoGkgxJHhurd0IHBo4bqnbiBi4buVIHN1bmcgUlRTUCBHc3RyZWFtZXIgxJHDum5nLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKyJLaMO0bmcgdGjhu4MgbeG7nyB0aGnhur90IGLhu4sgw6JtIHRoYW5oIMSR4buDIHBow6F0IGzhuqFpLiBUaGnhur90IGLhu4sgbsOgeSDEkWFuZyDEkcaw4bujYyBt4buZdCDhu6luZyAiCisiZOG7pW5nIGtow6FjIHPhu60gZOG7pW5nLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiS2jDtG5nIHRo4buDIG3hu58gdGhp4bq/dCBi4buLIMOibSB0aGFuaCDEkeG7gyBwaMOhdCBs4bqhaS4gQuG6oW4ga2jDtG5nIGPDsyDEkeG7pyB0aOG6qW0gcXV54buBbiDEkeG7gyBt4bufICIKKyJ0aGnhur90IGLhu4sgbsOgeS4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiS2jDtG5nIHRo4buDIG3hu58gdGhp4bq/dCBi4buLIMOibSB0aGFuaCDEkeG7gyBwaMOhdCBs4bqhaS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisiS2jDtG5nIHRo4buDIG3hu58gdGhp4bq/dCBi4buLIMOibSB0aGFuaCDEkeG7gyBwaMOhdCBs4bqhaS4gUGhpw6puIGLhuqNuIEjhu4cgdGjhu5FuZyDDgm0gdGhhbmggTeG7nyAiCisibsOgeSBraMO0bmcgxJHGsOG7o2MgeeG6v3UgdOG7kSBuw6B5IGjhu5cgdHLhu6MuIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkNo4bupYyBuxINuZyBwaMOhdCBs4bqhaSBraMO0bmcgcGjhuqNpIMSRxrDhu6NjIHRoaeG6v3QgYuG7iyDDom0gdGhhbmggbsOgeSBo4buXIHRy4bujLiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAiTOG7l2kgcGjDoXQgbOG6oWkgw6JtIHRoYW5oLiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiQ2jhu6ljIG7Eg25nIHRodSBraMO0bmcgcGjhuqNpIMSRxrDhu6NjIHRoaeG6v3QgYuG7iyDDom0gdGhhbmggbsOgeSBo4buXIHRy4bujLiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkfhurdwIGzhu5dpIGtoaSB0aHUgdOG7qyB0aGnhur90IGLhu4sgw6JtIHRoYW5oLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIktow7RuZyB0aOG7gyBt4bufIHRoaeG6v3QgYuG7iyDDom0gdGhhbmggxJHhu4MgdGh1LiBC4bqhbiBraMO0bmcgY8OzIHF1eeG7gW4gbeG7nyB0aGnhur90IGLhu4sgbsOgeS4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIktow7RuZyB0aOG7gyBt4bufIHRoaeG6v3QgYuG7iyDDom0gdGhhbmggxJHhu4MgdGh1LiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICJLaMO0bmcgdMOsbSB0aOG6pXkgdGhp4bq/dCBi4buLIENvcmVBdWRpbyIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiS2jDtG5nIHRo4buDIG3hu58gdGhp4bq/dCBi4buLIENvcmVBdWRpbyIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIkdoaSBsxrB1IG5ndeG7k24iCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICJNaWNyw7QiCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICLEkOG6p3UgdsOgbyIKKworbXNnaWQgIkludGVybmFsIENEIgorbXNnc3RyICJDRCDhu58gdHJvbmciCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAiU1BESUYgVsOgbyIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICJBVVggMSBWw6BvIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIkFVWCAyIFbDoG8iCisKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiVsOybmcgbmfGsOG7o2MgQ29kZWMiCisKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgIlbDsm5nIG5nxrDhu6NjIFN1blZUUyIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiw4JtIGzGsOG7o25nIgorCittc2dpZCAiR2FpbiIKK21zZ3N0ciAiS2h14bq/Y2ggxJHhuqFpIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiTcOgbiBow6xuaCIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIkxvYSB0w61jaCBo4bujcCIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiVGFpIG5naGUiCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAixJDhuqd1IHJhIgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICJTUERJRiBSYSIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiQVVYIDEgUmEiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIkFVWCAyIFJhIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkfhurdwIGzhu5dpIGtoaSDEkeG7jWMgJWQgYnl0ZSB04burIHRoaeG6v3QgYuG7iyDigJwlc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIiIKKyJH4bq3cCBs4buXaSBraGkgxJHDoW5oIHPhu5EgY8OhYyDEkeG7i25oIGThuqFuZyB2aWRlbyBjw7MgdGjhu4MsIG3DoCB0aGnhur90IGLhu4sg4oCcJXPigJ0gY8OzIHRo4buDIGzDoG0gIgorInZp4buHYyBjw7luZyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiS2jDtG5nIHRo4buDIMOhbmggeOG6oSBjw6FjIGLhu5kgxJHhu4dtIHThu6sgdGhp4bq/dCBi4buLIOKAnCVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAiVHLDrG5oIMSRaeG7gXUga2hp4buDbiBj4bunYSB0aGnhur90IGLhu4sg4oCcJXPigJ0ga2jDtG5nIGjhu5cgdHLhu6MgcGjGsMahbmcgcGjDoXAgVlIgJWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICIiCisiVHLDrG5oIMSRaeG7gXUga2hp4buDbiBj4bunYSB0aGnhur90IGLhu4sg4oCcJXPigJ0ga2jDtG5nIGjhu5cgdHLhu6MgcGjGsMahbmcgcGjDoXAgVlIgxJHDoyBiaeG6v3QgbsOgby4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAiVGhp4bq/dCBi4buLIOKAnCVz4oCdIMSRYW5nIGLhuq1uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICJUaGnhur90IGLhu4sg4oCcJXPigJ0ga2jDtG5nIHRo4buDIGNo4bulcCB04bqhaSAlZHglZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiVGhp4bq/dCBi4buLIOKAnCVz4oCdIGtow7RuZyB0aOG7gyBjaOG7pXAg4bufIMSR4buLbmggZOG6oW5nIMSRw6MgY2hvIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIlRoaeG6v3QgYuG7iyDigJwlc+KAnSBraMO0bmcgaOG7lyB0cuG7oyBjaOG7qWMgbsSDbmcg4oCcbm9uLWNvbnRpZ3VvdXMgcGxhbmVz4oCdIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiS2jDtG5nIHRo4buDIGzhuqV5IGPDoWMgdGhhbSBz4buRIHbhu4EgdGhp4bq/dCBi4buLIOKAnCVz4oCdLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiVGhp4bq/dCBi4buLIHZpZGVvIGtow7RuZyBjaOG6pXAgbmjhuq1uIGPDoGkgxJHhurd0IHbhu4EgdOG7kWMgxJHhu5kga2h1bmcgaMOsbmggbeG7m2kuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiVGhp4bq/dCBi4buLIHZpZGVvIGtow7RuZyBjdW5nIGPhuqVwIMSR4buLbmggZOG6oW5nIHh14bqldC4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAiVGhp4bq/dCBi4buLIHZpZGVvIHRy4bqjIHbDoCBrw61jaCB0aMaw4bubYyBraMO0bmcgaOG7o3AgbOG7hy4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiVGhp4bq/dCBi4buLIGTDuW5nIHBoxrDGoW5nIHBow6FwIHhlbiBr4bq9IGtow7RuZyDEkcaw4bujYyBo4buXIHRy4bujLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICJUaGnhur90IGLhu4sgdmlkZW8gZMO5bmcgxJHhu4tuaCBk4bqhbmcgxJFp4buDbSDhuqNuaCBraMO0bmcgxJHGsOG7o2MgaOG7lyB0cuG7oy4iCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiR+G6t3AgbOG7l2kga2hpIGPhuqV1IGjDrG5oIGtobyDEkeG7h20gbuG7mWkgdOG6oWkuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICJUaGnhur90IGLhu4sgdmlkZW8ga2jDtG5nIMSRxrBhIHJhIGfhu6NpIMO9IG7DoG8gduG7gSBi4buZIMSR4buHbS4iCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICJLaMO0bmcgY8OzIGLhu4MgZMOybmcgZOG7ryBsaeG7h3UgdOG6o2kgduG7gSDEkeG7gyBtw6Agbmjhuq1wIHbDoG8uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiR+G6t3AgbOG7l2kga2hpIGzhuqV5IGPDoWMgY8OgaSDEkeG6t3QgdOG7qyB0aGnhur90IGLhu4sgxJFp4buBdSBjaOG7iW5oIGPhu5luZyBoxrDhu59uZyAlZCB0csOqbiB0aGnhur90ICIKKyJi4buLIOKAnCVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJH4bq3cCBs4buXaSBraGkgxJHhu41jIGR1bmcgbMaw4bujbmcgdOG7qyB0aGnhur90IGLhu4sg4oCcJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiVGhp4bq/dCBi4buLICVzIGtow7RuZyBwaOG6o2kgdGhp4bq/dCBi4buLIMSRaeG7gXUgY2jhu4luaCBj4buZbmcgaMaw4bufbmcuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiR+G6t3AgbOG7l2kga2hpIGzhuqV5IMSR4bqndSB2w6BvIHJhZGlvIHRyw6puIHRoaeG6v3QgYuG7iyDigJwlc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJH4bq3cCBs4buXaSBraGkgxJHhurd0IGThu68gbGnhu4d1IG5o4bqtcCAlZCB2w6BvIHRoaeG6v3QgYuG7iyDigJwlc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkfhurdwIGzhu5dpIGtoaSB0aGF5IMSR4buVaSB0cuG6oW5nIHRow6FpIG5n4bqvdCB0aeG6v25nIGNobyB0aGnhur90IGLhu4sg4oCcJXPigJ0uIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICJH4bq3cCBs4buXaSBraGkgY+G6pXAgcGjDoXQgYuG7mSBuaOG7myB0aGVvIHnDqnUgY+G6p3UuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIkfhurdwIGzhu5dpIGtoaSBj4bqlcCBwaMOhdCBi4buZIG5o4bubIHRoZW8gecOqdSBj4bqndS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiQuG7mSBjaHV54buDbiDEkeG7lWkgdHLDqm4gdGhp4bq/dCBi4buLICVzIGtow7RuZyBjw7MgxJHhu4tuaCBk4bqhbmcgxJHhuqd1IHbDoG8gxJHGsOG7o2MgaOG7lyB0cuG7oyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiQuG7mSBjaHV54buDbiDEkeG7lWkgdHLDqm4gdGhp4bq/dCBi4buLICVzIGtow7RuZyBjw7MgxJHhu4tuaCBk4bqhbmcgeHXhuqV0IMSRxrDhu6NjIGjhu5cgdHLhu6MiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIkLhu5kgbcOjIGjDs2EgdHLDqm4gdGhp4bq/dCBi4buLIOKAnCVz4oCdIGtow7RuZyBo4buXIHRy4bujIMSR4buLbmggZOG6oW5nIMSR4bqndSB2w6BvIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiQuG7mSBnaeG6o2kgbcOjIHRyw6puIHRoaeG6v3QgYuG7iyDigJwlc+KAnSBraMO0bmcgaOG7lyB0cuG7oyDEkeG7i25oIGThuqFuZyDEkeG6p3UgcmEiCisKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiR+G6t3AgbOG7l2kga2hpIGLhuq90IMSR4bqndSB0aeG6v24gdHLDrG5oIGdp4bqjaSBtw6MuIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICJH4bq3cCBs4buXaSBraGkgeOG7rSBsw70ga2h1bmcuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorIkfhurdwIGzhu5dpIGtoaSBs4bqleSBraOG6oyBuxINuZyBj4bunYSB0aGnhur90IGLhu4sg4oCcJXPigJ0uIE7DsyBraMO0bmcgcGjhuqNpIGzDoCB0csOsbmggxJFp4buBdSAiCisia2hp4buDbiBwaGnDqm4gYuG6o24gNGwyLiBLaeG7g20gdHJhIHhlbSBuw7MgY8OzIHBo4bqjaSBsw6AgdHLDrG5oIMSRaeG7gXUga2hp4buDbiBwaGnDqm4gYuG6o24gIgorIjRsMSBraMO0bmcuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiR+G6t3AgbOG7l2kga2hpIHRydXkgduG6pW4gY8OhYyB0aHXhu5ljIHTDrW5oIGPhu6dhIMSR4bqndSB2w6BvICVkIHRyb25nIHRoaeG6v3QgYuG7iyAlcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiR+G6t3AgbOG7l2kga2hpIGzhuqV5IGPDoWMgY8OgaSDEkeG6t3QgY+G7p2EgYuG7mSBjaOG7iW5oIGPhu5luZyBoxrDhu59uZyAlZCB0csOqbiB0aGnhur90IGLhu4sg4oCcJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiR+G6t3AgbOG7l2kga2hpIHRydXkgduG6pW4gY2jhu4kgdGnDqnUgdHLDqm4gdGhp4bq/dCBi4buLIOKAnCVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiR+G6t3AgbOG7l2kga2hpIGzhuqV5IGPDoWMgdGh14buZYyB0w61uaCBj4bunYSBi4buZIMSRaeG7gXUga2hp4buDbiB0csOqbiB0aGnhur90IGLhu4sg4oCcJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIktow7RuZyB0aOG7gyBuaOG6rW4gZGnhu4duIHRoaeG6v3QgYuG7iyDigJwlc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS2jDtG5nIHBo4bqjaSBsw6AgdGhp4bq/dCBi4buLIOKAnCVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIktow7RuZyB0aOG7gyBt4bufIHRoaeG6v3QgYuG7iyDigJwlc+KAnSDEkeG7gyDEkeG7jWMgdsOgIGdoaS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICJUaGnhur90IGLhu4sg4oCcJXPigJ0ga2jDtG5nIHBo4bqjaSBsw6AgdGhp4bq/dCBi4buLIGdoaSBow6xuaC90aeG6v25nLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiVGhp4bq/dCBi4buLIOKAnCVz4oCdIGtow7RuZyBwaOG6o2kgbMOgIHRoaeG6v3QgYuG7iyB4deG6pXQgcmEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICJUaGnhur90IGLhu4sg4oCcJXPigJ0ga2jDtG5nIHBo4bqjaSBsw6AgdGhp4bq/dCBi4buLIE0yTS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIktow7RuZyB0aOG7gyBuaMOibiBi4bqjbiB0aGnhur90IGLhu4sg4oCcJXPigJ0gxJHhu4MgxJHhu41jIHbDoCBnaGkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJH4bq3cCBs4buXaSBraGkgxJHhurd0IGNo4buJIHRpw6p1IGNobyB0aGnhur90IGLhu4sg4oCcJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIkfhurdwIGzhu5dpIGtoaSBs4bqleSB04bqnbiBz4buRIGhp4buHbiB0aOG7nWkgY+G7p2EgdGhp4bq/dCBi4buLIMSRaeG7gXUgY2jhu4luaCBj4buZbmcgaMaw4bufbmcgY2hvICIKKyJ0aGnhur90IGLhu4sg4oCcJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIiIKKyJH4bq3cCBs4buXaSBraGkgxJHhurd0IHThuqduIHPhu5EgaGnhu4duIHRo4budaSBj4bunYSB0aGnhur90IGLhu4sgxJFp4buBdSBjaOG7iW5oIGPhu5luZyBoxrDhu59uZyBjaG8gIgorInRoaeG6v3QgYuG7iyDigJwlc+KAnSBsw6AgJWx1IEh6LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJH4bq3cCBs4buXaSBraGkgbOG6pXkgYmnDqm4gxJHhu5kgdMOtbiBoaeG7h3UgY2hvIHRoaeG6v3QgYuG7iyDigJwlc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkfhurdwIGzhu5dpIGtoaSBs4bqleSBnacOhIHRy4buLIGPhu6dhIGLhu5kgxJFp4buBdSBraGnhu4NuICVkIHRyw6puIHRoaeG6v3QgYuG7iyDigJwlc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkfhurdwIGzhu5dpIGtoaSDEkeG6t3QgZ2nDoSB0cuG7iyAlZCBj4bunYSBi4buZIMSRaeG7gXUga2hp4buDbiAlZCB0csOqbiB0aGnhur90IGLhu4sg4oCcJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiR+G6t3AgbOG7l2kga2hpIGzhuqV5IMSR4bqndSB2w6BvIGhp4buHbiB0aOG7nWkgdsOgbyB0aGnhur90IGLhu4sg4oCcJXPigJ0uIEPDsyB0aOG7gyBsw6AgdGhp4bq/dCBi4buLIHRodSAiCisidGhhbmguIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJH4bq3cCBs4buXaSBraGkgbOG6pXkgxJHhuqd1IHbDoG8gaGnhu4duIGjDoG5oIHRyw6puIHRoaeG6v3QgYuG7iyDigJwlc+KAnS4gQ8OzIHRo4buDIG7DsyBsw6AgdGhp4bq/dCBi4buLICIKKyJ2w7QgdHV54bq/bi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiR+G6t3AgbOG7l2kga2hpIMSR4bq3dCBk4buvIGxp4buHdSBuaOG6rXAgJWQgdHLDqm4gdGhp4bq/dCBi4buLICVzLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIkNoxrBhIGjhu5cgdHLhu6Mga2jhuqMgbsSDbmcgdGhheSDEkeG7lWkgxJHhu5kgcGjDom4gZ2nhuqNpIHRyb25nIGtoaSBjaOG6oXkuIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICJLaMO0bmcgdGjhu4MgdGhhbyB0w6FjIGtoaSBraMO0bmcgY8OzIMSR4buTbmcgaOG7kyIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAiTOG7l2kgbHXhu5NuZyBk4buvIGxp4buHdSBu4buZaSBi4buZLiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgZmxvdyBlcnJvci4iCisjfiBtc2dzdHIgIkzhu5dpIGx14buTbmcgZOG7ryBsaeG7h3UgbuG7mWkgYuG7mS4iCisKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIlRoaeG6v3QgYuG7iyDigJwlc+KAnSBraMO0bmcgaOG7lyB0cuG7oyBjaOG7qWMgbsSDbmcgcXVheSB2aWRlbyIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzb3VuZCBzZXJ2ZXIiCisjfiBtc2dzdHIgIktow7RuZyB0aOG7gyB0aGnhur90IGzhuq1wIHPhu7Ega+G6v3QgbuG7kWkgdOG7m2kgbcOheSBwaOG7pWMgduG7pSDDom0gdGhhbmgiCisKKyN+IG1zZ2lkICJGYWlsZWQgdG8gcXVlcnkgc291bmQgc2VydmVyIGNhcGFiaWxpdGllcyIKKyN+IG1zZ3N0ciAiTOG7l2kgdHJ1eSB24bqlbiBraGHMiSBuxINuZyBj4bunYSBtw6F5IHBo4bulYyB24bulIMOibSB0aGFuaCIKKworI34gbXNnaWQgIkJhc3MiCisjfiBtc2dzdHIgIlRy4bqnbSIKKworI34gbXNnaWQgIlRyZWJsZSIKKyN+IG1zZ3N0ciAiQ2FvIgorCisjfiBtc2dpZCAiU3ludGgiCisjfiBtc2dzdHIgIlThu5VuZyBo4bujcCIKKworI34gbXNnaWQgIlBDTSIKKyN+IG1zZ3N0ciAiUENNIgorCisjfiBtc2dpZCAiU3BlYWtlciIKKyN+IG1zZ3N0ciAiTG9hIgorCisjfiBtc2dpZCAiTGluZS1pbiIKKyN+IG1zZ3N0ciAiRMOieS12w6BvIgorCisjfiBtc2dpZCAiQ0QiCisjfiBtc2dzdHIgIkNEIgorCisjfiBtc2dpZCAiTWl4ZXIiCisjfiBtc2dzdHIgIlRy4buZbiIKKworI34gbXNnaWQgIlBDTS0yIgorI34gbXNnc3RyICJQQ00tMiIKKworI34gbXNnaWQgIlJlY29yZCIKKyN+IG1zZ3N0ciAiR2hpIgorCisjfiBtc2dpZCAiSW4tZ2FpbiIKKyN+IG1zZ3N0ciAiVsOgby1naWEgbMaw4bujbmciCisKKyN+IG1zZ2lkICJPdXQtZ2FpbiIKKyN+IG1zZ3N0ciAiUmEtZ2lhIGzGsOG7o25nIgorCisjfiBtc2dpZCAiTGluZS0xIgorI34gbXNnc3RyICJEw6J5LTEiCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgIkTDonktMiIKKworI34gbXNnaWQgIkxpbmUtMyIKKyN+IG1zZ3N0ciAiRMOieS0zIgorCisjfiBtc2dpZCAiRGlnaXRhbC0xIgorI34gbXNnc3RyICLEkG/huqFuIGJp4bq/bi0xIgorCisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICLEkG/huqFuIGJp4bq/bi0yIgorCisjfiBtc2dpZCAiRGlnaXRhbC0zIgorI34gbXNnc3RyICLEkG/huqFuIGJp4bq/bi0zIgorCisjfiBtc2dpZCAiUGhvbmUtaW4iCisjfiBtc2dzdHIgIsSQaeG7h24gdGhv4bqhaS12w6BvIgorCisjfiBtc2dpZCAiUGhvbmUtb3V0IgorI34gbXNnc3RyICLEkGnhuqFuIHRob+G6oWktcmEiCisKKyN+IG1zZ2lkICJWaWRlbyIKKyN+IG1zZ3N0ciAi4bqibmggxJHhu5luZyIKKworI34gbXNnaWQgIlJhZGlvIgorI34gbXNnc3RyICJUaHUgdGhhbmgiCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIgorI34gbXNnc3RyICJLaMO0bmcgdGjhu4MgbeG7nyB0aGnhur90IGLhu4sgw6JtIHRoYW5oIMSR4buDIHF14bqjbiBsw70gxJFp4buBdSBraGnhu4NuIG3DoXkgaMOyYSB0aeG6v25nLiIKKworI34gbXNnaWQgIiIKKyN+ICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIFRoaXMgdmVyc2lvbiBvZiAiCisjfiAidGhlIE9wZW4gU291bmQgU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIktow7RuZyB0aOG7gyBt4bufIHRoaeG6v3QgYuG7iyDDom0gdGhhbmggxJHhu4MgcXXhuqNuIGzDvSDEkWnhu4F1IGtoaeG7g24gbcOheSBow7JhIHRp4bq/bmcuIFBoacOqbiAiCisjfiAiYuG6o24gSOG7hyB0aOG7kW5nIMOCbSB0aGFuaCBN4bufIGtow7RuZyBwaOG6o2kgxJHGsOG7o2MgeeG6v3UgdOG7kSBuw6B5IGjhu5cgdHLhu6MuIgorCisjfiBtc2dpZCAiTWFzdGVyIgorI34gbXNnc3RyICJDaOG7pyIKKworI34gbXNnaWQgIkZyb250IgorI34gbXNnc3RyICJUcsaw4bubYyIKKworI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIlNhdSIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIlRhaSBuZ2hlIgorCisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICJUw6JtIgorCisjfiBtc2dpZCAiTEZFIgorI34gbXNnc3RyICJMRkUiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCIKKyN+IG1zZ3N0ciAiVsOybSIKKworI34gbXNnaWQgIlNpZGUiCisjfiBtc2dzdHIgIkLDqm4iCisKKyN+IG1zZ2lkICJBVVggT3V0IgorI34gbXNnc3RyICJBVVggUmEiCisKKyN+IG1zZ2lkICIzRCBEZXB0aCIKKyN+IG1zZ3N0ciAiU8OidSBiYSBjaGnhu4F1IgorCisjfiBtc2dpZCAiM0QgQ2VudGVyIgorI34gbXNnc3RyICJUw6JtIGJhIGNoaeG7gXUiCisKKyN+IG1zZ2lkICIzRCBFbmhhbmNlIgorI34gbXNnc3RyICJUxINuZyBjxrDhu51uZyBiYSBjaGnhu4F1IgorCisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICLEkGnhu4duIHRob+G6oWkiCisKKyN+IG1zZ2lkICJWaWRlbyBJbiIKKyN+IG1zZ3N0ciAi4bqibmggxJHhu5luZyBWw6BvIgorCisjfiBtc2dpZCAiQVVYIEluIgorI34gbXNnc3RyICJBVVggVsOgbyIKKworI34gbXNnaWQgIlJlY29yZCBHYWluIgorI34gbXNnc3RyICJHaGkgbMawdSBraHXhur9jaCDEkeG6oWkiCisKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAiS2h14bq/Y2ggxJHhuqFpIFJhIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAiVMSDbmcgbcOheSB2aSDDom0iCisKKyN+IG1zZ2lkICJEaWFnbm9zdGljIgorI34gbXNnc3RyICJDaOG6qW4gxJFvw6FuIgorCisjfiBtc2dpZCAiQmFzcyBCb29zdCIKKyN+IG1zZ3N0ciAiVMSDbmcgdHLhuqdtIgorCisjfiBtc2dpZCAiUGxheWJhY2sgUG9ydHMiCisjfiBtc2dzdHIgIkPhu5VuZyBwaMOhdCBs4bqhaSIKKworI34gbXNnaWQgIklucHV0IgorI34gbXNnc3RyICJWw6BvIgorCisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgIlRoZW8gZMO1aSBuZ3Xhu5NuIgorCisjfiBtc2dpZCAiS2V5Ym9hcmQgQmVlcCIKKyN+IG1zZ3N0ciAiQsOtcCBiw6BuIHBow61tIgorCisjfiBtc2dpZCAiU2ltdWxhdGUgU3RlcmVvIgorI34gbXNnc3RyICJNw7QgcGjhu49uZyDDom0gbOG6rXAgdGjhu4MiCisKKyN+IG1zZ2lkICJTdGVyZW8iCisjfiBtc2dzdHIgIsOCbSBs4bqtcCB0aOG7gyIKKworI34gbXNnaWQgIlN1cnJvdW5kIFNvdW5kIgorI34gbXNnc3RyICLDgm0gdGhhbmggdsOybSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKKyN+IG1zZ3N0ciAiS2h14bq/Y2ggxJHhuqFpIG3DoXkgdmkgw6JtIgorCisjfiBtc2dpZCAiU3BlYWtlciBTb3VyY2UiCisjfiBtc2dzdHIgIk5ndeG7k24gbG9hIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBTb3VyY2UiCisjfiBtc2dzdHIgIk5ndeG7k24gbcOheSB2aSDDom0iCisKKyN+IG1zZ2lkICJKYWNrIgorI34gbXNnc3RyICLhu5QgY+G6r20iCisKKyN+IG1zZ2lkICJDZW50ZXIgLyBMRkUiCisjfiBtc2dzdHIgIlTDom0gLyBMRkUiCisKKyN+IG1zZ2lkICJTdGVyZW8gTWl4IgorI34gbXNnc3RyICJI4buPYSB0aeG6v25nIMOibSBs4bqtcCB0aOG7gyIKKworI34gbXNnaWQgIk1vbm8gTWl4IgorI34gbXNnc3RyICJIw7JhIHRp4bq/bmcgxJHGoW4gbmd14buTbiIKKworI34gbXNnaWQgIklucHV0IE1peCIKKyN+IG1zZ3N0ciAiSMOyYSB0aeG6v25nIMSR4bqndSB2w6BvIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAxIgorI34gbXNnc3RyICJNw6F5IHZpIMOibSAxIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICJNw6F5IHZpIMOibSAyIgorCisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgIsSQaeG7h24gc+G7kSBSYSIKKworI34gbXNnaWQgIkRpZ2l0YWwgSW4iCisjfiBtc2dzdHIgIsSQaeG7h24gc+G7kSBWw6BvIgorCisjfiBtc2dpZCAiSERNSSIKKyN+IG1zZ3N0ciAiSERNSSIKKworI34gbXNnaWQgIk1vZGVtIgorI34gbXNnc3RyICJC4buZIMSRaeG7gXUgZ2nhuqNpIgorCisjfiBtc2dpZCAiSGFuZHNldCIKKyN+IG1zZ3N0ciAiQ+G6p20gdGF5IgorCisjfiBtc2dpZCAiT3RoZXIiCisjfiBtc2dzdHIgIktow6FjIgorCisjfiBtc2dpZCAiTm9uZSIKKyN+IG1zZ3N0ciAiS2jDtG5nIGPDsyIKKworI34gbXNnaWQgIk9uIgorI34gbXNnc3RyICJC4bqtdCIKKworI34gbXNnaWQgIk9mZiIKKyN+IG1zZ3N0ciAiVOG6r3QiCisKKyN+IG1zZ2lkICJNdXRlIgorI34gbXNnc3RyICJDw6JtIgorCisjfiBtc2dpZCAiRmFzdCIKKyN+IG1zZ3N0ciAiTmhhbmgiCisKKyN+IG1zZ2lkICJWZXJ5IExvdyIKKyN+IG1zZ3N0ciAiUuG6pXQgdGjhuqVwIgorCisjfiBtc2dpZCAiTG93IgorI34gbXNnc3RyICJUaOG6pXAiCisKKyN+IG1zZ2lkICJNZWRpdW0iCisjfiBtc2dzdHIgIlbhu6thIgorCisjfiBtc2dpZCAiSGlnaCIKKyN+IG1zZ3N0ciAiQ2FvIgorCisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICJS4bqldCBjYW8iCisKKyN+IG1zZ2lkICJQcm9kdWN0aW9uIgorI34gbXNnc3RyICJT4bqjbiB4deG6pXQiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICJN4bq3dCB0csaw4bubYzogTcOheSB2aSDDom0iCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIEluIgorI34gbXNnc3RyICJN4bq3dCB0csaw4bubYzogRMOieSBWw6BvIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiTeG6t3QgdHLGsOG7m2M6IFRhaSBuZ2hlIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBPdXQiCisjfiBtc2dzdHIgIk3hurd0IHRyxrDhu5tjOiBEw6J5IFJhIgorCisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICLEkOG6p3UgbuG7kWkgbcOgdSBs4bulYyIKKworI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICLEkOG6p3UgbuG7kWkgbcOgdSBo4buTbmciCisKKyN+IG1zZ2lkICJCbHVlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAixJDhuqd1IG7hu5FpIG3DoHUgeGFuaCIKKworI34gbXNnaWQgIldoaXRlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAixJDhuqd1IG7hu5FpIG3DoHUgdHLhuq9uZyIKKworI34gbXNnaWQgIkJsYWNrIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAixJDhuqd1IG7hu5FpIG3DoHUgxJFlbiIKKworI34gbXNnaWQgIkdyYXkgQ29ubmVjdG9yIgorI34gbXNnc3RyICLEkOG6p3UgbuG7kWkgbcOgdSB4w6FtIgorCisjfiBtc2dpZCAiT3JhbmdlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAixJDhuqd1IG7hu5FpIG3DoHUgY2FtIgorCisjfiBtc2dpZCAiUmVkIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAixJDhuqd1IG7hu5FpIG3DoHUgxJHhu48iCisKKyN+IG1zZ2lkICJZZWxsb3cgQ29ubmVjdG9yIgorI34gbXNnc3RyICLEkOG6p3UgbuG7kWkgbcOgdSB2w6BuZyIKKworI34gbXNnaWQgIkdyZWVuIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiTeG6t3QgdHLGsOG7m2M6IMSR4bqndSBu4buRaSBtw6B1IGzhu6VjIgorCisjfiBtc2dpZCAiUGluayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk3hurd0IHRyxrDhu5tjOiDEkeG6p3UgbuG7kWkgbcOgdSBo4buTbmciCisKKyN+IG1zZ2lkICJCbHVlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiTeG6t3QgdHLGsOG7m2M6IMSR4bqndSBu4buRaSBtw6B1IHhhbmgiCisKKyN+IG1zZ2lkICJXaGl0ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk3hurd0IHRyxrDhu5tjOiDEkeG6p3UgbuG7kWkgbcOgdSB0cuG6r25nIgorCisjfiBtc2dpZCAiQmxhY2sgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJN4bq3dCB0csaw4bubYzogxJHhuqd1IG7hu5FpIG3DoHUgxJFlbiIKKworI34gbXNnaWQgIkdyYXkgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJN4bq3dCB0csaw4bubYzogxJHhuqd1IG7hu5FpIG3DoHUgeMOhbSIKKworI34gbXNnaWQgIk9yYW5nZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk3hurd0IHRyxrDhu5tjOiDEkeG6p3UgbuG7kWkgbcOgdSBjYW0iCisKKyN+IG1zZ2lkICJSZWQgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJN4bq3dCB0csaw4bubYzogxJHhuqd1IG7hu5FpIG3DoHUgxJHhu48iCisKKyN+IG1zZ2lkICJZZWxsb3cgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJN4bq3dCB0csaw4bubYzogxJHhuqd1IG7hu5FpIG3DoHUgdsOgbmciCisKKyN+IG1zZ2lkICJTcHJlYWQgT3V0cHV0IgorI34gbXNnc3RyICJN4bufIHLhu5luZyBr4bq/dCB4deG6pXQiCisKKyN+IG1zZ2lkICJEb3dubWl4IgorI34gbXNnc3RyICJI4bqhIGjDsmEgdGnhur9uZyIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgSW5wdXQiCisjfiBtc2dzdHIgIkjDsmEgdGnhur9uZyDhuqNvIDogVsOgbyIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgT3V0cHV0IgorI34gbXNnc3RyICJIw7JhIHRp4bq/bmcg4bqjbyA6IFJhIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBDaGFubmVscyIKKyN+IG1zZ3N0ciAiSMOyYSB0aeG6v25nIOG6o28gOiBLw6puaCIKKworI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICJDaOG7qWMgbsSDbmcgJXMgJWQiCisKKyN+IG1zZ2lkICIlcyBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiQ2jhu6ljIG7Eg25nICVzIgorCisjfiBtc2dpZCAiR290IHVuZXhwZWN0ZWQgZnJhbWUgc2l6ZSBvZiAldSBpbnN0ZWFkIG9mICV1LiIKKyN+IG1zZ3N0ciAiTmjhuq1uIMSRxrDhu6NjIGvDrWNoIGPhu6Ega2h1bmcgYuG6pXQgdGjGsOG7nW5nICV1LCB0aGF5IGNobyAldS4iCisKKyN+IG1zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIG9uIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiR+G6t3AgbOG7l2kga2hpIMSR4buNYyAlZCBieXRlIHRyw6puIHRoaeG6v3QgYuG7iyDigJwlc+KAnS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZW5xdWV1ZSBidWZmZXJzIGluIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiS2jDtG5nIHRo4buDIHBo4bulIHRow6ptIGPDoWMgYuG7mSDEkeG7h20gdsOgbyBow6BuZyDEkeG7o2kgdHLDqm4gdGhp4bq/dCBi4buLIOKAnCVz4oCdLiIKKworI34gbXNnaWQgIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiTOG7l2kga2hpIHRo4butIGzhuqV5IGPDoWMga2h1bmcg4bqjbmggxJHhu5luZyB04burIHRoaeG6v3QgYuG7iyDigJwlc+KAnS4iCisKKyN+IG1zZ2lkICJGYWlsZWQgYWZ0ZXIgJWQgdHJpZXMuIGRldmljZSAlcy4gc3lzdGVtIGVycm9yOiAlcyIKKyN+IG1zZ3N0ciAiTOG7l2kgc2F1ICVkIGzhuqduIHRo4butLiBUaGnhur90IGLhu4sgJXMuIEzhu5dpIGjhu4cgdGjhu5FuZzogJXMiCmRpZmYgLS1naXQgYS9wby96aF9DTi5wbyBiL3BvL3poX0NOLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MTg1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9wby96aF9DTi5wbwpAQCAtMCwwICsxLDgwNCBAQAorIyBDaGluZXNlIChzaW1wbGlmaWVkKSB0cmFuc2xhdGlvbiBhYm91dCBnc3QtcGx1Z2lucy1nb29kLgorIyBUaGlzIGZpbGUgaXMgcHV0IGluIHRoZSBwdWJsaWMgZG9tYWluLgorIyBGdW5kYSBXYW5nIDxmdW5kYXdhbmdAbGludXgubmV0LmNuPiwgMjAwNS4KKyMgSmkgWmhlbmdZdSA8emhlbmd5dWppQGdtYWlsLmNvbT4sIDIwMDgsIDIwMDkuCisjIHp3cHdqd3R6IDx6d3B3and0ekAxMjYuY29tPiwgMjAxNS4KK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QgMS4xMC4wXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTYtMTEtMDIgMTM6MzkrMDgwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogVGlhbnplIFdhbmcgPHp3cHdqd3R6QDEyNi5jb20+XG4iCisiTGFuZ3VhZ2UtVGVhbTogQ2hpbmVzZSAoc2ltcGxpZmllZCkgPGkxOG4temhAZ29vZ2xlZ3JvdXBzLmNvbT5cbiIKKyJMYW5ndWFnZTogemhfQ05cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJYLUJ1Z3M6IFJlcG9ydCB0cmFuc2xhdGlvbiBlcnJvcnMgdG8gdGhlIExhbmd1YWdlLVRlYW0gYWRkcmVzcy5cbiIKKyJYLUdlbmVyYXRvcjogUG9lZGl0IDEuOC45XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIuacquaJvuWIsOaPkuWPo+iuvuWkhyIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAi6Kej56CBIEpQRUcg5Zu+5YOP5Ye66ZSZIgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICLigJwlMiRz4oCd55qE4oCcJTEkc+KAnSIKKworbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAi5peg5rOV6L+e5o6l6Iez5pyN5Yqh5ZmoIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIuacquiuvue9rlVSTOOAgiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAi5peg5rOV6Kej5p6Q5pyN5Yqh5Zmo5ZCN44CCIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIuaXoOazleW7uueri+S4jumfs+mikeacjeWKoeWZqOeahOi/nuaOpSIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIuWuieWFqOi/nuaOpeWksei0peOAgiIKKworbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIuWPkeeUn+S6hue9kee7nOmUmeivr++8jOaIluacjeWKoeWZqOaEj+WkluWcsOWFs+mXreS6hui/nuaOpeOAgiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAi5pyN5Yqh5Zmo5Y+R6YCB5LqG6ZSZ6K+v55qE5pWw5o2u44CCIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIuiuvuWkh+S4jeaUr+aMgeWumuS9jeOAgiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAi5rKh5pyJ5oiW5peg5pWI55qE6L6T5YWl6Z+z6aKR77yMQVZJIOa1geWwhuaNn+Wdj+OAgiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAi5q2k5paH5Lu25LiN5YyF5ZCr5Y+v5pKt5pS+55qE5rWB44CCIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICLmraTmlofku7bml6DmlYjvvIzml6Dms5Xmkq3mlL7jgIIiCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAi5peg5rOV5pKt5pS+5rWB77yM5Zug5Li65a6D5bey6KKrUGxheVJlYWR5IERSTeWKoOWvhuOAgiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAi5q2k5paH5Lu25bey5o2f5Z2P77yM5peg5rOV5pKt5pS+44CCIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICLml6DmlYjnmoTljp/lrZDlsLrlr7jjgIIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIuatpOaWh+S7tuS4jeWujOaVtOS4lOaXoOazleaSreaUvuOAgiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAi5q2k5paH5Lu25Lit55qE6KeG6aKR5Y+v6IO95peg5rOV5q2j56Gu5pKt5pS+44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIuatpOaWh+S7tuWMheWQq+S6huWkquWkmueahOa1geOAguWPquaSreaUvuWJjemdoiAlZCDkuKoiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorIuacquaJvuWIsOaUr+aMgeeahOa1geWqkuS9k+OAguaCqOWPr+iDvemcgOimgeWuieijheS4gOS4qiBHU3RyZWFtZXIgUlRTUCDmianlsZXmj5Lku7bmnaXmkq3mlL4gUmVhbCDlqpIiCisi5L2T5rWB44CCIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisi5pyq5om+5Yiw5pSv5oyB55qE5rWB5aqS5L2T44CC5oKo5Y+v6IO96ZyA6KaB5ZCv55So5pu05aSa55qE5Lyg6YCB5Y2P6K6u77yM5oiW6ICF5Lmf5pyJ5Y+v6IO95piv57y65bCR5q2j56Gu55qEICIKKyJHU3RyZWFtZXIgUlRTUCDmianlsZXmj5Lku7bjgIIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICLml6Dms5XmiZPlvIDpn7PpopHorr7lpIfmkq3mlL7pn7PpopHjgILorr7lpIflvZPliY3nlLHlj6bkuIDkuKrnqIvluo/kvb/nlKjjgIIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAi5peg5rOV5omT5byA6Z+z6aKR6K6+5aSH5pKt5pS+6Z+z6aKR44CC5oKo5peg5p2D5L2/55So6L+Z5LiA6K6+5aSH44CCIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIuaXoOazleaJk+W8gOmfs+mikeiuvuWkh+aSreaUvumfs+mikeOAgiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIuaXoOazleaJk+W8gOmfs+mikeiuvuWkh+i/m+ihjOWbnuaUvuOAgui/meS4gOeJiOacrOeahE9wZW4gU291bmQgU3lzdGVt5LiN5pSv5oyB5q2k57uE5Lu244CCIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIuatpOmfs+mikeiuvuWkh+S4jeaUr+aMgeWbnuaUvuOAgiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAi6Z+z6aKR5Zue5pS+6ZSZ6K+v44CCIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLmraTpn7PpopHorr7lpIfkuI3mlK/mjIHlvZXpn7PjgIIiCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLpn7PpopHorr7lpIflvZXpn7PplJnor6/jgIIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIuaXoOazleaJk+W8gOmfs+mikeiuvuWkh+W9lemfs+OAguaCqOaXoOadg+S9v+eUqOi/meS4gOiuvuWkh+OAgiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAi5peg5rOV5omT5byA6Z+z6aKR6K6+5aSH5b2V6Z+z44CCIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgIuacquaJvuWIsCBDb3JlQXVkaW8g6K6+5aSHIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICLml6Dms5XmiZPlvIAgQ29yZUF1ZGlvIOiuvuWkhyIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIuW9lemfs+a6kCIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIuivneetkiIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIue6v+i3r+i+k+WFpSIKKworbXNnaWQgIkludGVybmFsIENEIgorbXNnc3RyICLlhoXpg6ggQ0QiCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAiU1BESUbovpPlhaUiCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAi6L6F5Yqp6L6T5YWlIDEiCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAi6L6F5Yqp6L6T5Ye6IDIiCisKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAi57yW56CB5Zmo5Zue546vIgorCittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICJTdW5WVFPlm57njq8iCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIumfs+mHjyIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIuWinuebiiIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIuebkeaOp+WZqCIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIuWGheW7uuaJrOWjsOWZqCIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAi5aS05oi05byP6ICz5py6IgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIue6v+i3r+i+k+WHuiIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiU1BESUbovpPlh7oiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIui+heWKqei+k+WHuiAxIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICLovoXliqnovpPlh7ogMiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIgorbXNnc3RyICLku47orr7lpIfigJwlMiRz4oCd5Lit6K+75Y+WICUxJGQg5Liq5a2X6IqC5pe25Ye66ZSZ44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICLmnprkuL7orr7lpIfigJwlc+KAneWPr+iDveaUr+aMgeeahOinhumikeagvOW8j+aXtuWHuumUmSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAi5peg5rOV5LuO6K6+5aSH4oCcJXPigJ3kuK3mmKDlsITlh7rnvJPlhrLljLoiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIuiuvuWkh+KAnCVz4oCd55qE6amx5Yqo5LiN5pSv5oyBSS9P5pa55byPICVk44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAi6K6+5aSH4oCcJXPigJ3nmoTpqbHliqjkuI3mlK/mjIHku7vkvZXlt7Lnn6XnmoRJL0/mlrnlvI/jgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAi6K6+5aSH4oCcJXPigJ3mraPlv5kiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIuiuvuWkh+KAnCVz4oCd5LiN6IO95ZyoICVkeCVkIOWkhOaNleiOtyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAi6K6+5aSH4oCcJXPigJ3ml6Dms5Xku6XmjIflrprmoLzlvI/mjZXojrciCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAi6K6+5aSH4oCcJXPigJ3kuI3mlK/mjIHpnZ7ov57nu63lubPpnaIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICLml6Dms5Xojrflj5borr7lpIfigJwlc+KAneeahOWPguaVsCIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAi6KeG6aKR6K6+5aSH5LiN5o6l5Y+X5paw55qE5bin546H6K6+572u44CCIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAi6KeG6aKR6K6+5aSH5pyq5o+Q5L6b6L6T5Ye65qC85byP44CCIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIuinhumikeiuvuWkh+i/lOWbnuS6huaXoOaViOeahOe7tOW6puOAgiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICLop4bpopHorr7lpIfkvb/nlKjkuobkuI3mlK/mjIHnmoTpmpTooYzmiavmj4/mlrnlvI/jgIIiCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAi6KeG6aKR6K6+5aSH5L2/55So5LqG5LiN5pSv5oyB55qE5YOP57Sg5qC85byP44CCIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIuaXoOazlemFjee9ruWGhemDqOe8k+WGsuaxoOOAgiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAi6KeG6aKR6K6+5aSH5pyq5o+Q5L6b5Lu75L2V57yT5Yay5aSn5bCP44CCIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAi5rKh5pyJ5Y+v5Lul55So5LqO5a+85YWl55qE5LiL5ri45rGg44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICLojrflj5borr7lpIfigJwlMiRz4oCd5LiK5b6u6LCD6ZKu4oCcJTEkZOKAneeahOiuvue9ruaXtuWHuumUmeOAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLojrflj5borr7lpIfigJwlc+KAneacieWFs+S/oeaBr+aXtuWHuumUmeOAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIuiuvuWkh+KAnCVz4oCd5LiN5piv5b6u6LCD6ZKu44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAi6K6+572u6K6+5aSH4oCcJXPigJ3kuIrnmoTlub/mkq3ovpPlh7rml7blh7rplJnjgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICLorr7nva7orr7lpIcgJTIkcyDkuIrnmoTovpPlhaUgJTEkZCDml7blh7rplJnjgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIuaUueWPmOiuvuWkh+KAnCVz4oCd55qE6Z2Z6Z+z54q25oCB5pe25Ye66ZSZ44CCIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICLliIbphY3or7fmsYLnmoTlhoXlrZjlpLHotKXjgIIiCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAi5YiG6YWN6K+35rGC55qE5YaF5a2Y5aSx6LSl44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIuiuvuWkhyAlcyDkuIrnmoTovazmjaLlmajmsqHmnInmlK/mjIHnmoTovpPlhaXmoLzlvI8iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIuiuvuWkhyAlcyDkuIrnmoTovazmjaLlmajmsqHmnInmlK/mjIHnmoTovpPlh7rmoLzlvI8iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIuiuvuWkhyAlcyDkuIrnmoTnvJbnoIHlmajmsqHmnInmlK/mjIHnmoTovpPlhaXmoLzlvI8iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICLorr7lpIcgJXMg5LiK55qE57yW56CB5Zmo5rKh5pyJ5pSv5oyB55qE6L6T5Ye65qC85byPIgorCittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIuWQr+WKqOino+eggee6v+eoi+Wksei0peOAgiIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAi5aSE55CG5bin5aSx6LSl44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAi6I635Y+W6K6+5aSH4oCcJXPigJ3nmoTkv6Hmga/ml7blh7rplJk65a6D5LiN5piv5LiA5LiqIHY0bDIg6amx5Yqo5Zmo77yM6K+35qOA5p+l5piv5ZCm5Li6IHY0bDHjgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICLmn6Xlr7vorr7lpIcgJTIkcyDkuK3nmoTovpPlhaUgJTEkZCDnmoTlsZ7mgKfml7blh7rplJkiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi6I635Y+W6K6+5aSHICUyJHMg5LiK55qE5b6u6LCD6ZKuICUxJGQg55qE6K6+572u5pe25Ye66ZSZIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi6I635Y+W6K6+5aSH4oCcJXPigJ3nmoTln7rlh4bml7blh7rplJnjgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIuiOt+WPluiuvuWkh+KAnCVz4oCd5LiK55qE5o6n5Yi25bGe5oCn5pe25Ye66ZSZ44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIuaXoOazleehruiupOiuvuWkh+KAnCVz4oCd44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIuS4jeaYr+iuvuWkh+KAnCVz4oCd44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAi5peg5rOV5omT5byA6K6+5aSH4oCcJXPigJ3or7vlhpnjgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICLigJwlc+KAneS4jeaYr+S4gOS4quaNleiOt+iuvuWkh+OAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAi4oCcJXPigJ3kuI3mmK/ovpPlh7rorr7lpIfjgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgTTJNIGRldmljZS4iCittc2dzdHIgIuiuvuWkh+KAnCVz4oCd5LiN5pivTTJN6K6+5aSH44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICLml6Dms5XlpI3liLborr7lpIfigJwlc+KAneadpeivu+WPluWSjOWGmeWFpeOAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi6K6+572u6K6+5aSH4oCcJXPigJ3nmoTln7rlh4bml7blh7rplJnjgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLojrflj5borr7lpIfigJwlc+KAneeahOW9k+WJjeW+ruiwg+mSrumikeeOh+aXtuWHuumUmeOAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICLorr7nva7orr7lpIfigJwlc+KAneeahOW9k+WJjeW+ruiwg+mSrumikeeOh+S4uiAlbHUgSHog5pe25Ye66ZSZ44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIuiOt+WPluiuvuWkh+KAnCVz4oCd55qE5L+h5Y+36ZW/5bqm5pe25Ye66ZSZ44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICLojrflj5borr7lpIfigJwlMiRz4oCd55qE5o6n5Yi25ZmoICUxJGQg55qE5YC85Ye66ZSZ44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICLorr7nva7orr7lpIfigJwlMyRz4oCd55qE5o6n5Yi25ZmoICUyJGQg55qE5YC85Li6ICUxJGQg5pe25Ye66ZSZ44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICLojrflj5borr7lpIfigJwlc+KAneS4iueahOW9k+WJjei+k+WFpeWHuumUmeOAguS5n+iuuOWug+aYr+S4gOS4quW5v+aSreiuvuWkhyIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICLojrflj5borr7lpIfigJwlc+KAneS4iueahOW9k+WJjei+k+WFpeWHuumUmeOAguWug+WPr+iDveaYr+S4gOS4quW5v+aSreiuvuWkhyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICLlsIbovpPlh7ogJWQg6K6+572u5Yiw6K6+5aSHICVzIOS4iuWksei0peOAgiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIuWwmuS4jeaUr+aMgeWcqOi/kOihjOaXtuabtOaUueWIhui+qOeOh+OAgiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAi5rKh5pyJ5pe26ZKf55qE6K+d5peg5rOV5pON5L2cIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBzdHJlYW0gZXJyb3IuIgorI34gbXNnc3RyICLlhoXpg6jmlbDmja7mtYHplJnor6/jgIIiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICLlhoXpg6jmlbDmja7mtYHplJnor6/jgIIiCisKKyN+IG1zZ2lkICJGYWlsZWQgdG8gcXVlcnkgc291bmQgc2VydmVyIGNhcGFiaWxpdGllcyIKKyN+IG1zZ3N0ciAi5p+l5a+76Z+z6aKR5pyN5Yqh5Zmo55qE5pyN5Yqh5aSx6LSlIgorCisjfiBtc2dpZCAiQmFzcyIKKyN+IG1zZ3N0ciAi5L2O6Z+zKEJhc3MpIgorCisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICLpq5jpn7MoVHJlYmxlKSIKKworI34gbXNnaWQgIlN5bnRoIgorI34gbXNnc3RyICLlkIjmiJDlmagiCisKKyN+IG1zZ2lkICJQQ00iCisjfiBtc2dzdHIgIuazouW9oihQQ00pIgorCisjfiBtc2dpZCAiU3BlYWtlciIKKyN+IG1zZ3N0ciAi5oms5aOw5ZmoIgorCisjfiBtc2dpZCAiQ0QiCisjfiBtc2dzdHIgIkNEIOmfs+mikSIKKworI34gbXNnaWQgIk1peGVyIgorI34gbXNnc3RyICLmt7fpn7PlmagiCisKKyN+IG1zZ2lkICJQQ00tMiIKKyN+IG1zZ3N0ciAiUENNLTIiCisKKyN+IG1zZ2lkICJJbi1nYWluIgorI34gbXNnc3RyICLovpPlhaXlop7nm4oiCisKKyN+IG1zZ2lkICJPdXQtZ2FpbiIKKyN+IG1zZ3N0ciAi6L6T5Ye65aKe55uKIgorCisjfiBtc2dpZCAiTGluZS0xIgorI34gbXNnc3RyICLnur/ot68xIgorCisjfiBtc2dpZCAiTGluZS0yIgorI34gbXNnc3RyICLnur/ot68yIgorCisjfiBtc2dpZCAiTGluZS0zIgorI34gbXNnc3RyICLnur/ot68zIgorCisjfiBtc2dpZCAiRGlnaXRhbC0xIgorI34gbXNnc3RyICLmlbDlrZfnur/ot68xIgorCisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICLmlbDlrZfnur/ot68yIgorCisjfiBtc2dpZCAiRGlnaXRhbC0zIgorI34gbXNnc3RyICLmlbDlrZfnur/ot68zIgorCisjfiBtc2dpZCAiUGhvbmUtaW4iCisjfiBtc2dzdHIgIuivneetkui+k+WFpSIKKworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAi6K+d562S6L6T5Ye6IgorCisjfiBtc2dpZCAiVmlkZW8iCisjfiBtc2dzdHIgIuinhumikSIKKworI34gbXNnaWQgIlJhZGlvIgorI34gbXNnc3RyICLlub/mkq0iCisKKyN+IG1zZ2lkICJHb3QgdW5leHBlY3RlZCBmcmFtZSBzaXplIG9mICV1IGluc3RlYWQgb2YgJXUuIgorI34gbXNnc3RyICLlj5blvpfkuoYgJXUg55qE5LiN6ZyA6KaB55qE5bin5aSn5bCP77yM6ICM5LiN5pivICV144CCIgorCisjfiBtc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBvbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIuivu+WPluiuvuWkh+KAmCUyJHPigJnkuK3nmoQgJTEkZCDlrZfoioLml7blh7rplJnjgIIiCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZW5xdWV1ZSBidWZmZXJzIGluIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAi5peg5rOV5a+56K6+5aSH4oCYJXPigJnkuK3nmoTnvJPlhrLljLrov5vooYzmjpLluo/jgIIiCisKKyN+IG1zZ2lkICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIuS7juiuvuWkh+KAmCVz4oCZ5LiK6I635Y+W6KeG6aKR55qE5bCd6K+V5aSx6LSl5LqG44CCIgorCisjfiBtc2dpZCAiRmFpbGVkIGFmdGVyICVkIHRyaWVzLiBkZXZpY2UgJXMuIHN5c3RlbSBlcnJvcjogJXMiCisjfiBtc2dzdHIgIuWcqCAlZCDmrKHlsJ3or5XlkI7lpLHotKXjgILorr7lpIcgJXPjgILns7vnu5/plJnor686ICVzIgorCisjfiBtc2dpZCAiIgorI34gIlRoZSBidWZmZXIgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLCBvciB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcywgb3Igbm8gIgorI34gImJ1ZmZlcnMgaGF2ZSBiZWVuIGFsbG9jYXRlZCB5ZXQsIG9yIHRoZSB1c2VycHRyIG9yIGxlbmd0aCBhcmUgaW52YWxpZC4gIgorI34gImRldmljZSAlcyIKKyN+IG1zZ3N0ciAiIgorI34gIuS4jeaUr+aMgeeahOe8k+WGsuWMuuexu+Wei++8jOaIluiAhee0ouW8lei2heWHuuiMg+WbtOS6hu+8jOaIluaYr+i/mOacquWIhumFjee8k+WGsuWMuu+8jOaIlumdnuazleeahOeUqOaIt+aMhyIKKyN+ICLpkojmiJbplb/luqbjgILorr7lpIcgJXMiCisKKyN+IG1zZ2lkICIiCisjfiAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIE5vdCBlbm91Z2ggbWVtb3J5LiIKKyN+IG1zZ3N0ciAi5LuO6K6+5aSH4oCYJXPigJnkuIrojrflj5bop4bpopHnmoTlsJ3or5XlpLHotKXkuobjgILmsqHmnInotrPlpJ/nmoTlhoXlrZjjgIIiCisKKyN+IG1zZ2lkICJpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGVucXVldWUgYSB1c2VyIHBvaW50ZXIgYnVmZmVyLiBkZXZpY2UgJXMuIgorI34gbXNnc3RyICLlhoXlrZjkuI3otrPml6Dms5Xlr7nnlKjmiLfmjIfpkojnvJPlhrLljLrov5vooYzmjpLluo/jgILorr7lpIcgJXPjgIIiCisKKyN+IG1zZ2lkICJObyBmcmVlIGJ1ZmZlcnMgZm91bmQgaW4gdGhlIHBvb2wgYXQgaW5kZXggJWQuIgorI34gbXNnc3RyICLlnKjlhoXlrZjmsaDkuK0gJWQg5aSE5rKh5pyJ5Y+v5YiG6YWN55qE57yT5Yay5Yy644CCIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGdldCBidWZmZXJzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLml6Dms5Xku47orr7lpIfigJglc+KAmeS4reiOt+WPlue8k+WGsuWMuuOAgiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBnZXQgZW5vdWdoIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIuaXoOazleS7juiuvuWkh+KAmCVz4oCZ5Lit6I635Y+W6Laz5aSf55qE57yT5Yay5Yy644CCIgorCisjfiBtc2dpZCAiRXJyb3Igc3RhcnRpbmcgc3RyZWFtaW5nIGNhcHR1cmUgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIuS7juiuvuWkh+KAmCVz4oCZ5Lit5ZCv55So5rWB5o2V6I635pe25Ye66ZSZ44CCIgorCisjfiBtc2dpZCAiRXJyb3Igc3RvcHBpbmcgc3RyZWFtaW5nIGNhcHR1cmUgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIuS7juiuvuWkh+KAmCVz4oCZ5Lit5YGc5q2i5rWB5o2V6I635pe25Ye66ZSZ44CCIgorCisjfiBtc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzLiciCisjfiBtc2dzdHIgIuiOt+WPluiuvuWkh+KAmCVz4oCZ5LiK55qE5o6n5Yi25bGe5oCn5pe25Ye66ZSZ44CCIgorCisjfiBtc2dpZCAiQ291bGQgbm90IHJlYWQgZnJvbSBDRC4iCisjfiBtc2dzdHIgIuaXoOazleS7jiBDRCDkuK3or7vlj5bjgIIiCisKKyN+IG1zZ2lkICJEaXNjIGlzIG5vdCBhbiBBdWRpbyBDRC4iCisjfiBtc2dzdHIgIumdnumfs+mikSBDRCDnm5jjgIIiCisKKyN+IG1zZ2lkICJUaGlzIGZpbGUgaXMgZW5jcnlwdGVkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKKyN+IG1zZ3N0ciAi5q2k5paH5Lu25bey5Yqg5a+G77yM5peg5rOV5pKt5pS+44CCIgorCisjfiBtc2dpZCAiRGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBjYXB0dXJlIgorI34gbXNnc3RyICLorr7lpIfigJwlc+KAneS4jeaUr+aMgeinhumikeaNleaNiSIKKworI34gbXNnaWQgIkxpbmUtaW4iCisjfiBtc2dzdHIgIue6v+i3r+i+k+WFpSIKKworI34gbXNnaWQgIlJlY29yZCIKKyN+IG1zZ3N0ciAi5b2V6Z+zIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNvdW5kIHNlcnZlciIKKyN+IG1zZ3N0ciAi5peg5rOV5bu656uL5LiO6Z+z6aKR5pyN5Yqh5Zmo55qE6L+e5o6lIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKKyN+IG1zZ3N0ciAi5peg5rOV5omT5byA6Z+z6aKR6K6+5aSH5p2l6L+b6KGM5re36Z+z5Zmo5o6n5Yi244CCIgorCisjfiBtc2dpZCAiIgorI34gIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4gVGhpcyB2ZXJzaW9uIG9mICIKKyN+ICJ0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAi5peg5rOV5omT5byA6Z+z6aKR6K6+5aSH5p2l6L+b6KGM5re36Z+z5Zmo5o6n5Yi244CC6L+Z5LiA54mI5pys55qET3BlbiBTb3VuZCBTeXN0ZW3kuI3mlK/mjIHmraTnu4QiCisjfiAi5Lu244CCIgorCisjfiBtc2dpZCAiTWFzdGVyIgorI34gbXNnc3RyICLkuLsiCisKKyN+IG1zZ2lkICJGcm9udCIKKyN+IG1zZ3N0ciAi5YmNIgorCisjfiBtc2dpZCAiUmVhciIKKyN+IG1zZ3N0ciAi5ZCOIgorCisjfiBtc2dpZCAiSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAi5aS05oi05byP6ICz5py6IgorCisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICLkuK0iCisKKyN+IG1zZ2lkICJMRkUiCisjfiBtc2dzdHIgIumHjeS9jumfsyIKKworI34gbXNnaWQgIlN1cnJvdW5kIgorI34gbXNnc3RyICLnjq/nu5UiCisKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICLkvqciCisKKyN+IG1zZ2lkICJBVVggT3V0IgorI34gbXNnc3RyICLovoXliqnovpPlh7oiCisKKyN+IG1zZ2lkICIzRCBEZXB0aCIKKyN+IG1zZ3N0ciAiM0Qg5rex5bqmIgorCisjfiBtc2dpZCAiM0QgQ2VudGVyIgorI34gbXNnc3RyICIzRCDkuK3lpK4iCisKKyN+IG1zZ2lkICIzRCBFbmhhbmNlIgorI34gbXNnc3RyICIzRCDlop7lvLoiCisKKyN+IG1zZ2lkICJUZWxlcGhvbmUiCisjfiBtc2dzdHIgIueUteivnSIKKworI34gbXNnaWQgIlZpZGVvIEluIgorI34gbXNnc3RyICLop4bpopHovpPlhaUiCisKKyN+IG1zZ2lkICJBVVggSW4iCisjfiBtc2dzdHIgIui+heWKqei+k+WHuiIKKworI34gbXNnaWQgIlJlY29yZCBHYWluIgorI34gbXNnc3RyICLlvZXpn7Plop7nm4oiCisKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAi6L6T5Ye65aKe55uKIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAi6bqm5YWL6aOO5aKe5by6IgorCisjfiBtc2dpZCAiRGlhZ25vc3RpYyIKKyN+IG1zZ3N0ciAi6K+K5patIgorCisjfiBtc2dpZCAiQmFzcyBCb29zdCIKKyN+IG1zZ3N0ciAi6LSd5Y+45aKe5by6IgorCisjfiBtc2dpZCAiUGxheWJhY2sgUG9ydHMiCisjfiBtc2dzdHIgIuWbnuaUvuerr+WPoyIKKworI34gbXNnaWQgIklucHV0IgorI34gbXNnc3RyICLovpPlhaUiCisKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAi55uR5o6n5rqQIgorCisjfiBtc2dpZCAiS2V5Ym9hcmQgQmVlcCIKKyN+IG1zZ3N0ciAi6ZSu55uY6JyC6bijIgorCisjfiBtc2dpZCAiU2ltdWxhdGUgU3RlcmVvIgorI34gbXNnc3RyICLmqKHmi5/nq4vkvZPlo7AiCisKKyN+IG1zZ2lkICJTdGVyZW8iCisjfiBtc2dzdHIgIueri+S9k+WjsCIKKworI34gbXNnaWQgIlN1cnJvdW5kIFNvdW5kIgorI34gbXNnc3RyICLnjq/nu5Xlo7AiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIuivneetkuWinuebiiIKKworI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICLmiazlo7DlmajmupAiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAi6K+d562S5rqQIgorCisjfiBtc2dpZCAiSmFjayIKKyN+IG1zZ3N0ciAi5o+S5Y+jIgorCisjfiBtc2dpZCAiQ2VudGVyIC8gTEZFIgorI34gbXNnc3RyICLkuK0v6YeN5L2O6Z+zIgorCisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAi56uL5L2T5aOw5re36Z+zIgorCisjfiBtc2dpZCAiTW9ubyBNaXgiCisjfiBtc2dzdHIgIuWNleWjsOmBk+a3t+mfsyIKKworI34gbXNnaWQgIklucHV0IE1peCIKKyN+IG1zZ3N0ciAi6L6T5YWl5re36Z+zIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAxIgorI34gbXNnc3RyICLor53nrZIxIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICLor53nrZIyIgorCisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgIuaVsOWtl+i+k+WHuiIKKworI34gbXNnaWQgIkRpZ2l0YWwgSW4iCisjfiBtc2dzdHIgIuaVsOWtl+i+k+WFpSIKKworI34gbXNnaWQgIkhETUkiCisjfiBtc2dzdHIgIkhETUkiCisKKyN+IG1zZ2lkICJNb2RlbSIKKyN+IG1zZ3N0ciAiTW9kZW0iCisKKyN+IG1zZ2lkICJIYW5kc2V0IgorI34gbXNnc3RyICJIYW5kc2V0IgorCisjfiBtc2dpZCAiT3RoZXIiCisjfiBtc2dzdHIgIuWFtuS7liIKKworI34gbXNnaWQgIk5vbmUiCisjfiBtc2dzdHIgIuaXoCIKKworI34gbXNnaWQgIk9uIgorI34gbXNnc3RyICLlvIAiCisKKyN+IG1zZ2lkICJPZmYiCisjfiBtc2dzdHIgIuWFsyIKKworI34gbXNnaWQgIk11dGUiCisjfiBtc2dzdHIgIumdmemfsyIKKworI34gbXNnaWQgIkZhc3QiCisjfiBtc2dzdHIgIuW/qyIKKworI34gbXNnaWQgIlZlcnkgTG93IgorI34gbXNnc3RyICLpnZ7luLjkvY4iCisKKyN+IG1zZ2lkICJMb3ciCisjfiBtc2dzdHIgIuS9jiIKKworI34gbXNnaWQgIk1lZGl1bSIKKyN+IG1zZ3N0ciAi5LitIgorCisjfiBtc2dpZCAiSGlnaCIKKyN+IG1zZ3N0ciAi6auYIgorCisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICLpnZ7luLjpq5giCisKKyN+IG1zZ2lkICJQcm9kdWN0aW9uIgorI34gbXNnc3RyICLkuqflk4EiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICLliY3pnaLmnb/or53nrZIiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIEluIgorI34gbXNnc3RyICLliY3pnaLmnb/nur/ot6/ovpPlhaUiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBIZWFkcGhvbmVzIgorI34gbXNnc3RyICLliY3pnaLmnb/lpLTmiLTlvI/ogLPmnLoiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIE91dCIKKyN+IG1zZ3N0ciAi5YmN6Z2i5p2/57q/6Lev6L6T5Ye6IgorCisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICLnu7/oibLmj5Llj6MiCisKKyN+IG1zZ2lkICJQaW5rIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi57KJ6Imy5o+S5Y+jIgorCisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuiTneiJsuaPkuWPoyIKKworI34gbXNnaWQgIldoaXRlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi55m96Imy5o+S5Y+jIgorCisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICLpu5HoibLmj5Llj6MiCisKKyN+IG1zZ2lkICJHcmF5IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi54Gw6Imy5o+S5Y+jIgorCisjfiBtc2dpZCAiT3JhbmdlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi5qmZ6Imy5o+S5Y+jIgorCisjfiBtc2dpZCAiUmVkIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi57qi6Imy5o+S5Y+jIgorCisjfiBtc2dpZCAiWWVsbG93IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi6buE6Imy5o+S5Y+jIgorCisjfiBtc2dpZCAiR3JlZW4gRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLliY3pnaLmnb/nu7/oibLmj5Llj6MiCisKKyN+IG1zZ2lkICJQaW5rIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi5YmN6Z2i5p2/57KJ6Imy5o+S5Y+jIgorCisjfiBtc2dpZCAiQmx1ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuWJjemdouadv+iTneiJsuaPkuWPoyIKKworI34gbXNnaWQgIldoaXRlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi5YmN6Z2i5p2/55m96Imy5o+S5Y+jIgorCisjfiBtc2dpZCAiQmxhY2sgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLliY3pnaLmnb/pu5HoibLmj5Llj6MiCisKKyN+IG1zZ2lkICJHcmF5IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi5YmN6Z2i5p2/54Gw6Imy5o+S5Y+jIgorCisjfiBtc2dpZCAiT3JhbmdlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi5YmN6Z2i5p2/5qmZ6Imy5o+S5Y+jIgorCisjfiBtc2dpZCAiUmVkIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi5YmN6Z2i5p2/57qi6Imy5o+S5Y+jIgorCisjfiBtc2dpZCAiWWVsbG93IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi5YmN6Z2i5p2/6buE6Imy5o+S5Y+jIgorCisjfiBtc2dpZCAiU3ByZWFkIE91dHB1dCIKKyN+IG1zZ3N0ciAi5YiG5pWj5byP6L6T5Ye6IgorCisjfiBtc2dpZCAiRG93bm1peCIKKyN+IG1zZ3N0ciAi5re357ypIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBJbnB1dCIKKyN+IG1zZ3N0ciAi6Jma5ouf5re36Z+z6L6T5YWlIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBPdXRwdXQiCisjfiBtc2dzdHIgIuiZmuaLn+a3t+mfs+i+k+WHuiIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgQ2hhbm5lbHMiCisjfiBtc2dzdHIgIuiZmuaLn+a3t+mfs+mAmumBkyIKKworI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyAlZCDlip/og70iCisKKyN+IG1zZ2lkICIlcyBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiJXMg5Yqf6IO9IgpkaWZmIC0tZ2l0IGEvcG8vemhfSEsucG8gYi9wby96aF9ISy5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTA0YzdlCi0tLSAvZGV2L251bGwKKysrIGIvcG8vemhfSEsucG8KQEAgLTAsMCArMSw2ODEgQEAKKyMgQ2hpbmVzZSAoSG9uZyBLb25nKSB0cmFuc2xhdGlvbiBvZiBnc3QtcGx1Z2lucy1nb29kLTAuMTAuMi4KKyMgVGhpcyBmaWxlIGlzIHB1dCBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMgQWJlbCBDaGV1bmcgPGFiZWxjaGV1bmdAZ21haWwuY29tPiwgMjAwNi4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QtMC4xMC4yIDAuMTAuMlxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA2LTA4LTI5IDAxOjA4KzA4MDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEFiZWwgQ2hldW5nIDxhYmVsY2hldW5nQGdtYWlsLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBDaGluZXNlIChIb25nIEtvbmcpIDxjb21tdW5pdHlAbGludXhoYWxsLm9yZz5cbiIKKyJMYW5ndWFnZTogemhfSEtcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICIiCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIiIKKworbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAiIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAi5rKS5pyJ5Lu75L2V6Ly45YWl55qE6Z+z5pWI6LOH5paZ5oiW6ICF6LOH5paZ54Sh5pWI77yM6KGo56S6IEFWSSDkuLLmtYHlh7rnj77pjK/oqqTjgIIiCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAi5peg5rOV5omT5byA6Z+z6aKR6K6+5aSH5pKt5pS+6Z+z6aKR44CC5q2k57uE5Lu25LiN5pSv5oyB5byA5pS+5aOw6Z+z57O757ufKE9TUynniYjmnKzjgIIiCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAi5q2k6Z+z6aKR6K6+5aSH5LiN5pSv5oyB6Z+z6aKR5pKt5pS+44CCIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICLpn7PpopHmkq3mlL7plJnor6/jgIIiCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIuatpOmfs+mikeiuvuWkh+S4jeaUr+aMgeW9lemfs+OAgiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIuS7jumfs+mikeiuvuWkh+W9lemfs+aXtuWPkeeUn+mUmeivr+OAgiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICIiCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICLlvZXpn7PmnaXmupAiCisKKyMsIGZ1enp5Cittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAi6bqm5YWL6aOOIDEiCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICLnur/ot6/ovpPlhaUiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAi5YaF6YOoIENEIOmfs+mikSIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJTUERJRiDovpPlhaUiCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiQVVYIDEg6L6T5YWlIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIkFVWCAyIOi+k+WFpSIKKworIywgZnV6enkKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiTG9vcGJhY2siCisKKyMsIGZ1enp5Cittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICJMb29wYmFjayIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiIgorCittc2dpZCAiR2FpbiIKK21zZ3N0ciAiIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiIgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICIiCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiIgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICIiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIiIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICLml6Dms5XmiZPlvIDpn7PpopHmlofku7bov5vooYzmt7fpn7PmjqfliLbmk43kvZzjgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICIiCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAi5YWn6YOo6LOH5paZ5Liy5rWB55m855Sf6Yyv6Kqk44CCIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkludGVybmFsIGRhdGEgZmxvdyBlcnJvci4iCisjfiBtc2dzdHIgIuWFp+mDqOizh+aWmeS4sua1geeZvOeUn+mMr+iqpOOAgiIKKworI34gbXNnaWQgIiIKKyN+ICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIFRoaXMgdmVyc2lvbiBvZiAiCisjfiAidGhlIE9wZW4gU291bmQgU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIuaXoOazleaJk+W8gOmfs+mikeiuvuWkh+i/m+ihjOmfs+mHj+aOp+WItuaTjeS9nOOAguatpOmDqOS7tuS4jeaUr+aMgeW8gOaUvuWjsOmfs+ezu+e7nyhPU1Mp55qE54mI5pys44CCIgorCisjfiBtc2dpZCAiTWFzdGVyIgorI34gbXNnc3RyICLkuLvlo7DpgZMiCisKKyN+IG1zZ2lkICJGcm9udCIKKyN+IG1zZ3N0ciAi5YmN572u5aOw6YGTIgorCisjfiBtc2dpZCAiUmVhciIKKyN+IG1zZ3N0ciAi5ZCO572u5aOw6YGTIgorCisjfiBtc2dpZCAiSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAi5aS05oi05byP6ICz5py6IgorCisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICLkuK3nva4iCisKKyN+IG1zZ2lkICJMRkUiCisjfiBtc2dzdHIgIuS9jumfs+eCriIKKworI34gbXNnaWQgIlN1cnJvdW5kIgorI34gbXNnc3RyICLnq4vkvZPlo7Dnjq/nu5UiCisKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICLlt6blj7Plo7DpgZMiCisKKyN+IG1zZ2lkICJBVVggT3V0IgorI34gbXNnc3RyICJBVVgg6L6T5Ye6IgorCisjfiBtc2dpZCAiM0QgRGVwdGgiCisjfiBtc2dzdHIgIjNEIERlcHRoIgorCisjfiBtc2dpZCAiM0QgQ2VudGVyIgorI34gbXNnc3RyICIzRCBDZW50ZXIiCisKKyN+IG1zZ2lkICIzRCBFbmhhbmNlIgorI34gbXNnc3RyICIzRCBFbmhhbmNlIgorCisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICLor53nrZIiCisKKyN+IG1zZ2lkICJWaWRlbyBJbiIKKyN+IG1zZ3N0ciAi6KeG6aKR6L6T5YWlIgorCisjfiBtc2dpZCAiQVVYIEluIgorI34gbXNnc3RyICJBVVgg6L6T5YWlIgorCisjfiBtc2dpZCAiUmVjb3JkIEdhaW4iCisjfiBtc2dzdHIgIuW9lemfs+WinuebiiIKKworI34gbXNnaWQgIk91dHB1dCBHYWluIgorI34gbXNnc3RyICLovpPlh7rlop7nm4oiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEJvb3N0IgorI34gbXNnc3RyICLpuqblhYvpo47lop7nm4oiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRGlhZ25vc3RpYyIKKyN+IG1zZ3N0ciAi6YeH5qC35YiG5p6QIgorCisjfiBtc2dpZCAiQmFzcyBCb29zdCIKKyN+IG1zZ3N0ciAiQmFzcyDlop7nm4oiCisKKyN+IG1zZ2lkICJQbGF5YmFjayBQb3J0cyIKKyN+IG1zZ3N0ciAi5Zue5pS+56uv5Y+jIgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIui+k+WFpSIKKworI34gbXNnaWQgIk1vbml0b3IgU291cmNlIgorI34gbXNnc3RyICLnm5Hop4blmajmnaXmupAiCisKKyN+IG1zZ2lkICJLZXlib2FyZCBCZWVwIgorI34gbXNnc3RyICLmjInplK7lo7Dpn7MiCisKKyN+IG1zZ2lkICJTaW11bGF0ZSBTdGVyZW8iCisjfiBtc2dzdHIgIuaooeaLn+eri+S9k+WjsCIKKworI34gbXNnaWQgIlN0ZXJlbyIKKyN+IG1zZ3N0ciAi56uL5L2T5aOwIgorCisjfiBtc2dpZCAiU3Vycm91bmQgU291bmQiCisjfiBtc2dzdHIgIueri+S9k+WjsOeOr+e7lSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKKyN+IG1zZ3N0ciAi6bqm5YWL6aOO5aKe55uKIgorCisjfiBtc2dpZCAiU3BlYWtlciBTb3VyY2UiCisjfiBtc2dzdHIgIuaJrOWjsOWZqOmfs+a6kCIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgU291cmNlIgorI34gbXNnc3RyICLpuqblhYvpo47pn7PmupAiCisKKyN+IG1zZ2lkICJKYWNrIgorI34gbXNnc3RyICJKYWNrIgorCisjfiBtc2dpZCAiQ2VudGVyIC8gTEZFIgorI34gbXNnc3RyICLkuK3nva4v5L2O6Z+z54KuIgorCisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAi56uL5L2T5aOwIgorCisjfiBtc2dpZCAiTW9ubyBNaXgiCisjfiBtc2dzdHIgIuWNleWjsOmBkyIKKworI34gbXNnaWQgIklucHV0IE1peCIKKyN+IG1zZ3N0ciAi5re36Z+z6L6T5YWlIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICLpuqblhYvpo44gMiIKKworI34gbXNnaWQgIkRpZ2l0YWwgT3V0IgorI34gbXNnc3RyICLmlbDlrZfovpPlh7oiCisKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICLmlbDlrZfovpPlhaUiCisKKyN+IG1zZ2lkICJIRE1JIgorI34gbXNnc3RyICJIRE1JKOmrmOa4hSkiCisKKyN+IG1zZ2lkICJNb2RlbSIKKyN+IG1zZ3N0ciAiTW9kZW0iCisKKyN+IG1zZ2lkICJIYW5kc2V0IgorI34gbXNnc3RyICLmiYvmjIHorr7lpIciCisKKyN+IG1zZ2lkICJPdGhlciIKKyN+IG1zZ3N0ciAi5YW25a6D6K6+5aSHIgorCisjfiBtc2dpZCAiTm9uZSIKKyN+IG1zZ3N0ciAi5pegIgorCisjfiBtc2dpZCAiT24iCisjfiBtc2dzdHIgIuW8gCIKKworI34gbXNnaWQgIk9mZiIKKyN+IG1zZ3N0ciAi5YWzIgorCisjfiBtc2dpZCAiTXV0ZSIKKyN+IG1zZ3N0ciAi6Z2Z6Z+zIgorCisjfiBtc2dpZCAiRmFzdCIKKyN+IG1zZ3N0ciAi5b+rIgorCisjfiBtc2dpZCAiVmVyeSBMb3ciCisjfiBtc2dzdHIgIuW+iOaFoiIKKworI34gbXNnaWQgIkxvdyIKKyN+IG1zZ3N0ciAi5oWiIgorCisjfiBtc2dpZCAiTWVkaXVtIgorI34gbXNnc3RyICLkuK3nrYkiCisKKyN+IG1zZ2lkICJIaWdoIgorI34gbXNnc3RyICLpq5giCisKKyN+IG1zZ2lkICJWZXJ5IEhpZ2giCisjfiBtc2dzdHIgIuW+iOmrmCIKKworI34gbXNnaWQgIlByb2R1Y3Rpb24iCisjfiBtc2dzdHIgIueUn+S6p+WVhiIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCisjfiBtc2dzdHIgIum6puWFi+mjjumdouadvyIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgSW4iCisjfiBtc2dzdHIgIue6v+i3r+i+k+WFpemdouadvyIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIEhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIuWktOaItOW8j+iAs+acuumdouadvyIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgT3V0IgorI34gbXNnc3RyICLnur/ot6/ovpPlh7rpnaLmnb8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICLnur/ot6/ovpPlh7oiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiUGluayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuivneetkui+k+WHuiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJCbHVlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi56uL5L2T5aOw6L6T5YWlIgorCisjLCBmdXp6eQorI34gbXNnaWQgIldoaXRlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi5bemL+WNleWjsOmBkyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJCbGFjayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuWQjue9ruWjsOmBk+i+k+WHuiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJHcmF5IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi5Lit572u5aOw6YGT6L6T5Ye6IgorCisjLCBmdXp6eQorI34gbXNnaWQgIk9yYW5nZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuS9jumfs+eCrui+k+WHuiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJSZWQgQ29ubmVjdG9yIgorI34gbXNnc3RyICLlj7Plo7DpgZMiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiWWVsbG93IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiTWlkaSDovpPlh7ov5ri45oiP5pGH5p2GIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkdyZWVuIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi57q/6Lev6L6T5Ye66Z2i5p2/IgorCisjLCBmdXp6eQorI34gbXNnaWQgIlBpbmsgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLor53nrZLovpPlh7rpnaLmnb8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQmx1ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIueri+S9k+WjsOi+k+WFpemdouadvyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJXaGl0ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuW3pi/ljZXlo7DpgZPpnaLmnb8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQmxhY2sgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLlkI7nva7lo7DpgZPovpPlh7rpnaLmnb8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiR3JheSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuS4ree9ruWjsOmBk+i+k+WHuumdouadvyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJPcmFuZ2UgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLkvY7pn7Pngq7ovpPlh7rpnaLmnb8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiUmVkIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi5Y+z5aOw6YGT6Z2i5p2/IgorCisjLCBmdXp6eQorI34gbXNnaWQgIlllbGxvdyBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk1pZGkg6L6T5Ye6L+a4uOaIj+aRh+adhumdouadvyIKKworI34gbXNnaWQgIlNwcmVhZCBPdXRwdXQiCisjfiBtc2dzdHIgIlNwcmVhZCDovpPlh7oiCisKKyN+IG1zZ2lkICJEb3dubWl4IgorI34gbXNnc3RyICJEb3dubWl4IgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBJbnB1dCIKKyN+IG1zZ3N0ciAi5qih5ouf5re36Z+z6L6T5YWlIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgT3V0cHV0IgorI34gbXNnc3RyICLmqKHmi5/mt7fpn7PovpPlh7oiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIENoYW5uZWxzIgorI34gbXNnc3RyICLmqKHmi5/mt7fpn7PovpPlhaUiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiJXMgJWQgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzIOWKn+iDvSIKKworI34gbXNnaWQgIiVzIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyDlip/og70iCmRpZmYgLS1naXQgYS9wby96aF9UVy5wbyBiL3BvL3poX1RXLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YWUxZWUKLS0tIC9kZXYvbnVsbAorKysgYi9wby96aF9UVy5wbwpAQCAtMCwwICsxLDY4MSBAQAorIyBDaGluZXNlICh0cmFkaXRpb25hbCkgdHJhbnNsYXRpb24gb2YgZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjIuCisjIFRoaXMgZmlsZSBpcyBwdXQgaW4gdGhlIHB1YmxpYyBkb21haW4uCisjIEFiZWwgQ2hldW5nIDxhYmVsY2hldW5nQGdtYWlsLmNvbT4sIDIwMDYuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kLTAuMTAuMiAwLjEwLjJcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwNi0wOC0yOSAwMTowOCswODAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBBYmVsIENoZXVuZyA8YWJlbGNoZXVuZ0BnbWFpbC5jb20+XG4iCisiTGFuZ3VhZ2UtVGVhbTogQ2hpbmVzZSAodHJhZGl0aW9uYWwpIDx6aC1sMTBuQGxpbnV4Lm9yZy50dz5cbiIKKyJMYW5ndWFnZTogemhfVFdcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICIiCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIiIKKworbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAiIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAi5rKS5pyJ5Lu75L2V6Ly45YWl55qE6Z+z5pWI6LOH5paZ5oiW6ICF6LOH5paZ54Sh5pWI77yM6KGo56S6IEFWSSDkuLLmtYHlh7rnj77pjK/oqqTjgIIiCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAi5peg5rOV5omT5byA6Z+z6aKR6K6+5aSH5pKt5pS+6Z+z6aKR44CC5q2k57uE5Lu25LiN5pSv5oyB5byA5pS+5aOw6Z+z57O757ufKE9TUynniYjmnKzjgIIiCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAi5q2k6Z+z6aKR6K6+5aSH5LiN5pSv5oyB6Z+z6aKR5pKt5pS+44CCIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICLpn7PpopHmkq3mlL7plJnor6/jgIIiCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIuatpOmfs+mikeiuvuWkh+S4jeaUr+aMgeW9lemfs+OAgiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIuS7jumfs+mikeiuvuWkh+W9lemfs+aXtuWPkeeUn+mUmeivr+OAgiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICIiCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICLlvZXpn7PmnaXmupAiCisKKyMsIGZ1enp5Cittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAi6bqm5YWL6aOOIDEiCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICLnur/ot6/ovpPlhaUiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAi5YaF6YOoIENEIOmfs+mikSIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJTUERJRiDovpPlhaUiCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiQVVYIDEg6L6T5YWlIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIkFVWCAyIOi+k+WFpSIKKworIywgZnV6enkKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiTG9vcGJhY2siCisKKyMsIGZ1enp5Cittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICJMb29wYmFjayIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiIgorCittc2dpZCAiR2FpbiIKK21zZ3N0ciAiIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiIgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICIiCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiIgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICIiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIiIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICLml6Dms5XmiZPlvIDpn7PpopHmlofku7bov5vooYzmt7fpn7PmjqfliLbmk43kvZzjgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICIiCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAi5YWn6YOo6LOH5paZ5Liy5rWB55m855Sf6Yyv6Kqk44CCIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkludGVybmFsIGRhdGEgZmxvdyBlcnJvci4iCisjfiBtc2dzdHIgIuWFp+mDqOizh+aWmeS4sua1geeZvOeUn+mMr+iqpOOAgiIKKworI34gbXNnaWQgIiIKKyN+ICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIFRoaXMgdmVyc2lvbiBvZiAiCisjfiAidGhlIE9wZW4gU291bmQgU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIuaXoOazleaJk+W8gOmfs+mikeiuvuWkh+i/m+ihjOmfs+mHj+aOp+WItuaTjeS9nOOAguatpOmDqOS7tuS4jeaUr+aMgeW8gOaUvuWjsOmfs+ezu+e7nyhPU1Mp55qE54mI5pys44CCIgorCisjfiBtc2dpZCAiTWFzdGVyIgorI34gbXNnc3RyICLkuLvlo7DpgZMiCisKKyN+IG1zZ2lkICJGcm9udCIKKyN+IG1zZ3N0ciAi5YmN572u5aOw6YGTIgorCisjfiBtc2dpZCAiUmVhciIKKyN+IG1zZ3N0ciAi5ZCO572u5aOw6YGTIgorCisjfiBtc2dpZCAiSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAi5aS05oi05byP6ICz5py6IgorCisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICLkuK3nva4iCisKKyN+IG1zZ2lkICJMRkUiCisjfiBtc2dzdHIgIuS9jumfs+eCriIKKworI34gbXNnaWQgIlN1cnJvdW5kIgorI34gbXNnc3RyICLnq4vkvZPlo7Dnjq/nu5UiCisKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICLlt6blj7Plo7DpgZMiCisKKyN+IG1zZ2lkICJBVVggT3V0IgorI34gbXNnc3RyICJBVVgg6L6T5Ye6IgorCisjfiBtc2dpZCAiM0QgRGVwdGgiCisjfiBtc2dzdHIgIjNEIERlcHRoIgorCisjfiBtc2dpZCAiM0QgQ2VudGVyIgorI34gbXNnc3RyICIzRCBDZW50ZXIiCisKKyN+IG1zZ2lkICIzRCBFbmhhbmNlIgorI34gbXNnc3RyICIzRCBFbmhhbmNlIgorCisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICLor53nrZIiCisKKyN+IG1zZ2lkICJWaWRlbyBJbiIKKyN+IG1zZ3N0ciAi6KeG6aKR6L6T5YWlIgorCisjfiBtc2dpZCAiQVVYIEluIgorI34gbXNnc3RyICJBVVgg6L6T5YWlIgorCisjfiBtc2dpZCAiUmVjb3JkIEdhaW4iCisjfiBtc2dzdHIgIuW9lemfs+WinuebiiIKKworI34gbXNnaWQgIk91dHB1dCBHYWluIgorI34gbXNnc3RyICLovpPlh7rlop7nm4oiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEJvb3N0IgorI34gbXNnc3RyICLpuqblhYvpo47lop7nm4oiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRGlhZ25vc3RpYyIKKyN+IG1zZ3N0ciAi6YeH5qC35YiG5p6QIgorCisjfiBtc2dpZCAiQmFzcyBCb29zdCIKKyN+IG1zZ3N0ciAiQmFzcyDlop7nm4oiCisKKyN+IG1zZ2lkICJQbGF5YmFjayBQb3J0cyIKKyN+IG1zZ3N0ciAi5Zue5pS+56uv5Y+jIgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIui+k+WFpSIKKworI34gbXNnaWQgIk1vbml0b3IgU291cmNlIgorI34gbXNnc3RyICLnm5Hop4blmajmnaXmupAiCisKKyN+IG1zZ2lkICJLZXlib2FyZCBCZWVwIgorI34gbXNnc3RyICLmjInplK7lo7Dpn7MiCisKKyN+IG1zZ2lkICJTaW11bGF0ZSBTdGVyZW8iCisjfiBtc2dzdHIgIuaooeaLn+eri+S9k+WjsCIKKworI34gbXNnaWQgIlN0ZXJlbyIKKyN+IG1zZ3N0ciAi56uL5L2T5aOwIgorCisjfiBtc2dpZCAiU3Vycm91bmQgU291bmQiCisjfiBtc2dzdHIgIueri+S9k+WjsOeOr+e7lSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKKyN+IG1zZ3N0ciAi6bqm5YWL6aOO5aKe55uKIgorCisjfiBtc2dpZCAiU3BlYWtlciBTb3VyY2UiCisjfiBtc2dzdHIgIuaJrOWjsOWZqOmfs+a6kCIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgU291cmNlIgorI34gbXNnc3RyICLpuqblhYvpo47pn7PmupAiCisKKyN+IG1zZ2lkICJKYWNrIgorI34gbXNnc3RyICJKYWNrIgorCisjfiBtc2dpZCAiQ2VudGVyIC8gTEZFIgorI34gbXNnc3RyICLkuK3nva4v5L2O6Z+z54KuIgorCisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAi56uL5L2T5aOwIgorCisjfiBtc2dpZCAiTW9ubyBNaXgiCisjfiBtc2dzdHIgIuWNleWjsOmBkyIKKworI34gbXNnaWQgIklucHV0IE1peCIKKyN+IG1zZ3N0ciAi5re36Z+z6L6T5YWlIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICLpuqblhYvpo44gMiIKKworI34gbXNnaWQgIkRpZ2l0YWwgT3V0IgorI34gbXNnc3RyICLmlbDlrZfovpPlh7oiCisKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICLmlbDlrZfovpPlhaUiCisKKyN+IG1zZ2lkICJIRE1JIgorI34gbXNnc3RyICJIRE1JKOmrmOa4hSkiCisKKyN+IG1zZ2lkICJNb2RlbSIKKyN+IG1zZ3N0ciAiTW9kZW0iCisKKyN+IG1zZ2lkICJIYW5kc2V0IgorI34gbXNnc3RyICLmiYvmjIHorr7lpIciCisKKyN+IG1zZ2lkICJPdGhlciIKKyN+IG1zZ3N0ciAi5YW25a6D6K6+5aSHIgorCisjfiBtc2dpZCAiTm9uZSIKKyN+IG1zZ3N0ciAi5pegIgorCisjfiBtc2dpZCAiT24iCisjfiBtc2dzdHIgIuW8gCIKKworI34gbXNnaWQgIk9mZiIKKyN+IG1zZ3N0ciAi5YWzIgorCisjfiBtc2dpZCAiTXV0ZSIKKyN+IG1zZ3N0ciAi6Z2Z6Z+zIgorCisjfiBtc2dpZCAiRmFzdCIKKyN+IG1zZ3N0ciAi5b+rIgorCisjfiBtc2dpZCAiVmVyeSBMb3ciCisjfiBtc2dzdHIgIuW+iOaFoiIKKworI34gbXNnaWQgIkxvdyIKKyN+IG1zZ3N0ciAi5oWiIgorCisjfiBtc2dpZCAiTWVkaXVtIgorI34gbXNnc3RyICLkuK3nrYkiCisKKyN+IG1zZ2lkICJIaWdoIgorI34gbXNnc3RyICLpq5giCisKKyN+IG1zZ2lkICJWZXJ5IEhpZ2giCisjfiBtc2dzdHIgIuW+iOmrmCIKKworI34gbXNnaWQgIlByb2R1Y3Rpb24iCisjfiBtc2dzdHIgIueUn+S6p+WVhiIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCisjfiBtc2dzdHIgIum6puWFi+mjjumdouadvyIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgSW4iCisjfiBtc2dzdHIgIue6v+i3r+i+k+WFpemdouadvyIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIEhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIuWktOaItOW8j+iAs+acuumdouadvyIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgT3V0IgorI34gbXNnc3RyICLnur/ot6/ovpPlh7rpnaLmnb8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICLnur/ot6/ovpPlh7oiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiUGluayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuivneetkui+k+WHuiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJCbHVlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi56uL5L2T5aOw6L6T5YWlIgorCisjLCBmdXp6eQorI34gbXNnaWQgIldoaXRlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi5bemL+WNleWjsOmBkyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJCbGFjayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuWQjue9ruWjsOmBk+i+k+WHuiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJHcmF5IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi5Lit572u5aOw6YGT6L6T5Ye6IgorCisjLCBmdXp6eQorI34gbXNnaWQgIk9yYW5nZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuS9jumfs+eCrui+k+WHuiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJSZWQgQ29ubmVjdG9yIgorI34gbXNnc3RyICLlj7Plo7DpgZMiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiWWVsbG93IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiTWlkaSDovpPlh7ov5ri45oiP5pGH5p2GIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkdyZWVuIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi57q/6Lev6L6T5Ye66Z2i5p2/IgorCisjLCBmdXp6eQorI34gbXNnaWQgIlBpbmsgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLor53nrZLovpPlh7rpnaLmnb8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQmx1ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIueri+S9k+WjsOi+k+WFpemdouadvyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJXaGl0ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuW3pi/ljZXlo7DpgZPpnaLmnb8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQmxhY2sgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLlkI7nva7lo7DpgZPovpPlh7rpnaLmnb8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiR3JheSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuS4ree9ruWjsOmBk+i+k+WHuumdouadvyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJPcmFuZ2UgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLkvY7pn7Pngq7ovpPlh7rpnaLmnb8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiUmVkIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi5Y+z5aOw6YGT6Z2i5p2/IgorCisjLCBmdXp6eQorI34gbXNnaWQgIlllbGxvdyBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk1pZGkg6L6T5Ye6L+a4uOaIj+aRh+adhumdouadvyIKKworI34gbXNnaWQgIlNwcmVhZCBPdXRwdXQiCisjfiBtc2dzdHIgIlNwcmVhZCDovpPlh7oiCisKKyN+IG1zZ2lkICJEb3dubWl4IgorI34gbXNnc3RyICJEb3dubWl4IgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBJbnB1dCIKKyN+IG1zZ3N0ciAi5qih5ouf5re36Z+z6L6T5YWlIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgT3V0cHV0IgorI34gbXNnc3RyICLmqKHmi5/mt7fpn7PovpPlh7oiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIENoYW5uZWxzIgorI34gbXNnc3RyICLmqKHmi5/mt7fpn7PovpPlhaUiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiJXMgJWQgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzIOWKn+iDvSIKKworI34gbXNnaWQgIiVzIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyDlip/og70iCmRpZmYgLS1naXQgYS9zeXMvTWFrZWZpbGUuYW0gYi9zeXMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4YjkwNgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDUzIEBACitpZiBVU0VfT1NTCitPU1NfRElSPW9zcworZWxzZQorT1NTX0RJUj0KK2VuZGlmCisKK2lmIFVTRV9PU1M0CitPU1M0X0RJUj1vc3M0CitlbHNlCitPU1M0X0RJUj0KK2VuZGlmCisKK2lmIFVTRV9ESVJFQ1RTT1VORAorRElSRUNUU09VTkRfRElSPWRpcmVjdHNvdW5kCitlbHNlCitESVJFQ1RTT1VORF9ESVI9CitlbmRpZgorCitpZiBVU0VfV0FWRUZPUk0KK1dBVkVGT1JNX0RJUj13YXZlZm9ybQorZWxzZQorV0FWRUZPUk1fRElSPQorZW5kaWYKKworaWYgVVNFX09TWF9BVURJTworT1NYX0FVRElPX0RJUj1vc3hhdWRpbworZWxzZQorT1NYX0FVRElPX0RJUj0KK2VuZGlmCisKK2lmIFVTRV9PU1hfVklERU8KK09TWF9WSURFT19ESVI9b3N4dmlkZW8KK2Vsc2UKK09TWF9WSURFT19ESVI9CitlbmRpZgorCitpZiBVU0VfR1NUX1Y0TDIKK1Y0TDJfRElSPXY0bDIKK2Vsc2UKK1Y0TDJfRElSPQorZW5kaWYKKworaWYgVVNFX1gKK1hJTUFHRV9ESVI9eGltYWdlCitlbHNlCitYSU1BR0VfRElSPQorZW5kaWYKKworU1VCRElSUz0kKERJUkVDVFNPVU5EX0RJUikgJChXQVZFRk9STV9ESVIpICQoT1NTX0RJUikgJChPU1M0X0RJUikgJChPU1hfQVVESU9fRElSKSAkKE9TWF9WSURFT19ESVIpICQoVjRMMl9ESVIpICQoWElNQUdFX0RJUikKKworRElTVF9TVUJESVJTPWRpcmVjdHNvdW5kIG9zcyBvc3M0IG9zeGF1ZGlvIG9zeHZpZGVvIHY0bDIgd2F2ZWZvcm0geGltYWdlCisKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9jb21tb24vcGFyYWxsZWwtc3ViZGlycy5tYWsKZGlmZiAtLWdpdCBhL3N5cy9kaXJlY3Rzb3VuZC9NYWtlZmlsZS5hbSBiL3N5cy9kaXJlY3Rzb3VuZC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjNhOWFhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL2RpcmVjdHNvdW5kL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjEgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdGRpcmVjdHNvdW5kLmxhCisKK2xpYmdzdGRpcmVjdHNvdW5kX2xhX1NPVVJDRVMgPSAgZ3N0ZGlyZWN0c291bmRzaW5rLmMgZ3N0ZGlyZWN0c291bmRkZXZpY2UuYyBnc3RkaXJlY3Rzb3VuZHBsdWdpbi5jCitsaWJnc3RkaXJlY3Rzb3VuZF9sYV9DRkxBR1MgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgXAorCSQoR1NUX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQ0ZMQUdTKSBcCisJJChESVJFQ1RTT1VORF9DRkxBR1MpIFwKKwktREdzdERpcmVjdFNvdW5kRGV2aWNlUHJvdmlkZXI9R3N0RGlyZWN0U291bmRTaW5rRGV2aWNlUHJvdmlkZXIgXAorCS1ER3N0RGlyZWN0U291bmREZXZpY2VQcm92aWRlckNsYXNzPUdzdERpcmVjdFNvdW5kU2lua0RldmljZVByb3ZpZGVyQ2xhc3MgXAorCS1ER3N0RGlyZWN0U291bmREZXZpY2U9R3N0RGlyZWN0U291bmRTaW5rRGV2aWNlIFwKKwktREdzdERpcmVjdFNvdW5kRGV2aWNlQ2xhc3M9R3N0RGlyZWN0U291bmRTaW5rRGV2aWNlQ2xhc3MKK2xpYmdzdGRpcmVjdHNvdW5kX2xhX0xJQkFERCA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgXAorCS1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkkKEdTVF9CQVNFX0xJQlMpIFwKKwkkKEdTVF9MSUJTKSBcCisJJChESVJFQ1RTT1VORF9MSUJTKQorbGliZ3N0ZGlyZWN0c291bmRfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKSAkKERJUkVDVFNPVU5EX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gZ3N0ZGlyZWN0c291bmRzaW5rLmggZ3N0ZGlyZWN0c291bmRkZXZpY2UuaApkaWZmIC0tZ2l0IGEvc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kZGV2aWNlLmMgYi9zeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRkZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGIwMjFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kZGV2aWNlLmMKQEAgLTAsMCArMSwyNjYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDE4IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0ZGlyZWN0c291bmRkZXZpY2UuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxkc291bmQuaD4KKyNpbmNsdWRlIDxtbXN5c3RlbS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBHU1RfRElSRUNUU09VTkRfU1JDX0RFVklDRV9QUk9WSURFUgorI2luY2x1ZGUgImdzdGRpcmVjdHNvdW5kc3JjLmgiCisjZWxzZQorI2luY2x1ZGUgImdzdGRpcmVjdHNvdW5kc2luay5oIgorI2VuZGlmCisKK0dfREVGSU5FX1RZUEUgKEdzdERpcmVjdFNvdW5kRGV2aWNlUHJvdmlkZXIsIGdzdF9kaXJlY3Rzb3VuZF9kZXZpY2VfcHJvdmlkZXIsCisgICAgR1NUX1RZUEVfREVWSUNFX1BST1ZJREVSKTsKKworc3RhdGljIEdMaXN0ICpnc3RfZGlyZWN0c291bmRfZGV2aWNlX3Byb3ZpZGVyX3Byb2JlIChHc3REZXZpY2VQcm92aWRlciAqCisgICAgcHJvdmlkZXIpOworCitzdGF0aWMgdm9pZAorZ3N0X2RpcmVjdHNvdW5kX2RldmljZV9wcm92aWRlcl9jbGFzc19pbml0IChHc3REaXJlY3RTb3VuZERldmljZVByb3ZpZGVyQ2xhc3MgKgorICAgIGtsYXNzKQoreworICBHc3REZXZpY2VQcm92aWRlckNsYXNzICpkbV9jbGFzcyA9IEdTVF9ERVZJQ0VfUFJPVklERVJfQ0xBU1MgKGtsYXNzKTsKKworICBnc3RfZGV2aWNlX3Byb3ZpZGVyX2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGRtX2NsYXNzLAorI2lmZGVmIEdTVF9ESVJFQ1RTT1VORF9TUkNfREVWSUNFX1BST1ZJREVSCisgICAgICAiRGlyZWN0U291bmQgU291cmNlIERldmljZSBQcm92aWRlciIsICJTb3VyY2UvQXVkaW8iLAorICAgICAgIkxpc3QgRGlyZWN0U291bmQgc291cmNlIGRldmljZXMiLAorI2Vsc2UKKyAgICAgICJEaXJlY3RTb3VuZCBTaW5rIERldmljZSBQcm92aWRlciIsICJTaW5rL0F1ZGlvIiwKKyAgICAgICJMaXN0IERpcmVjdFNvdW5kIHNpbmsgZGV2aWNlcyIsCisjZW5kaWYKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPiIpOworCisgIGRtX2NsYXNzLT5wcm9iZSA9IGdzdF9kaXJlY3Rzb3VuZF9kZXZpY2VfcHJvdmlkZXJfcHJvYmU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGlyZWN0c291bmRfZGV2aWNlX3Byb3ZpZGVyX2luaXQgKEdzdERpcmVjdFNvdW5kRGV2aWNlUHJvdmlkZXIgKiBwcm92aWRlcikKK3sKK30KKworc3RhdGljIGdjaGFyICoKK2d1aWRfdG9fc3RyaW5nIChMUEdVSUQgZ3VpZCkKK3sKKyAgZ3VuaWNoYXIyICp3c3RyID0gTlVMTDsKKyAgZ2NoYXIgKnN0ciA9IE5VTEw7CisKKyAgaWYgKFN0cmluZ0Zyb21DTFNJRCAoZ3VpZCwgJndzdHIpID09IFNfT0spIHsKKyAgICBzdHIgPSBnX3V0ZjE2X3RvX3V0ZjggKHdzdHIsIC0xLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBDb1Rhc2tNZW1GcmVlICh3c3RyKTsKKyAgfQorCisgIHJldHVybiBzdHI7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEdzdERpcmVjdFNvdW5kRGV2aWNlUHJvdmlkZXIgKnNlbGY7CisgIEdMaXN0ICoqZGV2aWNlczsKK30gUHJvYmVEYXRhOworCitzdGF0aWMgQk9PTCBDQUxMQkFDSworZ3N0X2RpcmVjdHNvdW5kX2VudW1fY2FsbGJhY2sgKEdVSUQgKiBwR1VJRCwgVENIQVIgKiBzdHJEZXNjLAorICAgIFRDSEFSICogc3RyRHJ2TmFtZSwgVk9JRCAqIHBDb250ZXh0KQoreworICBQcm9iZURhdGEgKnByb2JlX2RhdGEgPSAoUHJvYmVEYXRhICopIChwQ29udGV4dCk7CisgIGdjaGFyICpkcml2ZXIsICpkZXNjcmlwdGlvbiwgKmd1aWRfc3RyOworICBHc3RTdHJ1Y3R1cmUgKnByb3BzOworICBHc3REZXZpY2UgKmRldmljZTsKKyNpZmRlZiBHU1RfRElSRUNUU09VTkRfU1JDX0RFVklDRV9QUk9WSURFUgorICBzdGF0aWMgR3N0U3RhdGljQ2FwcyBjYXBzID0gR1NUX1NUQVRJQ19DQVBTIChHU1RfRElSRUNUU09VTkRfU1JDX0NBUFMpOworI2Vsc2UKKyAgc3RhdGljIEdzdFN0YXRpY0NhcHMgY2FwcyA9IEdTVF9TVEFUSUNfQ0FQUyAoR1NUX0RJUkVDVFNPVU5EX1NJTktfQ0FQUyk7CisjZW5kaWYKKworICBkZXNjcmlwdGlvbiA9IGdfbG9jYWxlX3RvX3V0ZjggKHN0ckRlc2MsIC0xLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCFkZXNjcmlwdGlvbikgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHByb2JlX2RhdGEtPnNlbGYsCisgICAgICAgICJGYWlsZWQgdG8gY29udmVydCBkZXNjcmlwdGlvbiBmcm9tIGxvY2FsZSBlbmNvZGluZyB0byBVVEY4Iik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBkcml2ZXIgPSBnX2xvY2FsZV90b191dGY4IChzdHJEcnZOYW1lLCAtMSwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICghZHJpdmVyKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocHJvYmVfZGF0YS0+c2VsZiwKKyAgICAgICAgIkZhaWxlZCB0byBjb252ZXJ0IGRyaXZlciBuYW1lIGZyb20gbG9jYWxlIGVuY29kaW5nIHRvIFVURjgiKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIC8qIE5VTEwgZm9yIHRoZSBwcmltYXJ5IHNvdW5kIGNhcmQgKi8KKyAgZ3VpZF9zdHIgPSBwR1VJRCA/IGd1aWRfdG9fc3RyaW5nIChwR1VJRCkgOiBOVUxMOworCisgIEdTVF9JTkZPX09CSkVDVCAocHJvYmVfZGF0YS0+c2VsZiwgInNvdW5kIGRldmljZSBuYW1lOiAlcywgJXMgKEdVSUQgJXMpIiwKKyAgICAgIGRlc2NyaXB0aW9uLCBkcml2ZXIsIEdTVF9TVFJfTlVMTCAoZ3VpZF9zdHIpKTsKKworICBwcm9wcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgiZGlyZWN0c291bmQtcHJvcGxpc3QiLAorICAgICAgImRldmljZS5hcGkiLCBHX1RZUEVfU1RSSU5HLCAiZGlyZWN0c291bmQiLAorICAgICAgImRldmljZS5ndWlkIiwgR19UWVBFX1NUUklORywgR1NUX1NUUl9OVUxMIChndWlkX3N0ciksCisgICAgICAiZGlyZWN0c291bmQuZGV2aWNlLmRyaXZlciIsIEdfVFlQRV9TVFJJTkcsIGRyaXZlciwKKyAgICAgICJkaXJlY3Rzb3VuZC5kZXZpY2UuZGVzY3JpcHRpb24iLCBHX1RZUEVfU1RSSU5HLCBkZXNjcmlwdGlvbiwgTlVMTCk7CisKKyNpZmRlZiBHU1RfRElSRUNUU09VTkRfU1JDX0RFVklDRV9QUk9WSURFUgorICBkZXZpY2UgPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX0RJUkVDVFNPVU5EX0RFVklDRSwgImRldmljZS1ndWlkIiwgZ3VpZF9zdHIsCisgICAgICAiZGlzcGxheS1uYW1lIiwgZGVzY3JpcHRpb24sICJjYXBzIiwgZ3N0X3N0YXRpY19jYXBzX2dldCAoJmNhcHMpLAorICAgICAgImRldmljZS1jbGFzcyIsICJBdWRpby9Tb3VyY2UiLCAicHJvcGVydGllcyIsIHByb3BzLCBOVUxMKTsKKyNlbHNlCisgIGRldmljZSA9IGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfRElSRUNUU09VTkRfREVWSUNFLCAiZGV2aWNlLWd1aWQiLCBndWlkX3N0ciwKKyAgICAgICJkaXNwbGF5LW5hbWUiLCBkZXNjcmlwdGlvbiwgImNhcHMiLCBnc3Rfc3RhdGljX2NhcHNfZ2V0ICgmY2FwcyksCisgICAgICAiZGV2aWNlLWNsYXNzIiwgIkF1ZGlvL1NpbmsiLCAicHJvcGVydGllcyIsIHByb3BzLCBOVUxMKTsKKyNlbmRpZgorCisgICpwcm9iZV9kYXRhLT5kZXZpY2VzID0gZ19saXN0X3ByZXBlbmQgKCpwcm9iZV9kYXRhLT5kZXZpY2VzLCBkZXZpY2UpOworCisgIGdfZnJlZSAoZGVzY3JpcHRpb24pOworICBnX2ZyZWUgKGRyaXZlcik7CisgIGdfZnJlZSAoZ3VpZF9zdHIpOworCisgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocHJvcHMpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR0xpc3QgKgorZ3N0X2RpcmVjdHNvdW5kX2RldmljZV9wcm92aWRlcl9wcm9iZSAoR3N0RGV2aWNlUHJvdmlkZXIgKiBwcm92aWRlcikKK3sKKyAgR3N0RGlyZWN0U291bmREZXZpY2VQcm92aWRlciAqc2VsZiA9CisgICAgICBHU1RfRElSRUNUU09VTkRfREVWSUNFX1BST1ZJREVSIChwcm92aWRlcik7CisgIEdMaXN0ICpkZXZpY2VzID0gTlVMTDsKKyAgUHJvYmVEYXRhIHByb2JlX2RhdGEgPSB7IHNlbGYsICZkZXZpY2VzIH07CisgIEhSRVNVTFQgaFJlczsKKworI2lmZGVmIEdTVF9ESVJFQ1RTT1VORF9TUkNfREVWSUNFX1BST1ZJREVSCisgIGhSZXMgPSBEaXJlY3RTb3VuZENhcHR1cmVFbnVtZXJhdGUgKChMUERTRU5VTUNBTExCQUNLKQorICAgICAgZ3N0X2RpcmVjdHNvdW5kX2VudW1fY2FsbGJhY2ssIChWT0lEICopICYgcHJvYmVfZGF0YSk7CisjZWxzZQorICBoUmVzID0gRGlyZWN0U291bmRFbnVtZXJhdGUgKChMUERTRU5VTUNBTExCQUNLKQorICAgICAgZ3N0X2RpcmVjdHNvdW5kX2VudW1fY2FsbGJhY2ssIChWT0lEICopICYgcHJvYmVfZGF0YSk7CisjZW5kaWYKKworICBpZiAoRkFJTEVEIChoUmVzKSkKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBkZXZpY2VzIik7CisKKyAgcmV0dXJuIGRldmljZXM7Cit9CisKK2VudW0KK3sKKyAgUFJPUF9ERVZJQ0VfR1VJRCA9IDEsCit9OworCitHX0RFRklORV9UWVBFIChHc3REaXJlY3RTb3VuZERldmljZSwgZ3N0X2RpcmVjdHNvdW5kX2RldmljZSwgR1NUX1RZUEVfREVWSUNFKTsKKworc3RhdGljIHZvaWQgZ3N0X2RpcmVjdHNvdW5kX2RldmljZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfZGlyZWN0c291bmRfZGV2aWNlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9kaXJlY3Rzb3VuZF9kZXZpY2VfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIEdzdEVsZW1lbnQgKmdzdF9kaXJlY3Rzb3VuZF9kZXZpY2VfY3JlYXRlX2VsZW1lbnQgKEdzdERldmljZSAqIGRldmljZSwKKyAgICBjb25zdCBnY2hhciAqIG5hbWUpOworCitzdGF0aWMgdm9pZAorZ3N0X2RpcmVjdHNvdW5kX2RldmljZV9jbGFzc19pbml0IChHc3REaXJlY3RTb3VuZERldmljZUNsYXNzICoga2xhc3MpCit7CisgIEdzdERldmljZUNsYXNzICpkZXZfY2xhc3MgPSBHU1RfREVWSUNFX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBkZXZfY2xhc3MtPmNyZWF0ZV9lbGVtZW50ID0gZ3N0X2RpcmVjdHNvdW5kX2RldmljZV9jcmVhdGVfZWxlbWVudDsKKworICBvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9kaXJlY3Rzb3VuZF9kZXZpY2VfZ2V0X3Byb3BlcnR5OworICBvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9kaXJlY3Rzb3VuZF9kZXZpY2Vfc2V0X3Byb3BlcnR5OworICBvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2RpcmVjdHNvdW5kX2RldmljZV9maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChvYmplY3RfY2xhc3MsIFBST1BfREVWSUNFX0dVSUQsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZGV2aWNlLWd1aWQiLCAiRGV2aWNlIEdVSUQiLAorICAgICAgICAgICJEZXZpY2UgR1VJRCIsIE5VTEwsCisgICAgICAgICAgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RpcmVjdHNvdW5kX2RldmljZV9pbml0IChHc3REaXJlY3RTb3VuZERldmljZSAqIGRldmljZSkKK3sKK30KKworc3RhdGljIHZvaWQKK2dzdF9kaXJlY3Rzb3VuZF9kZXZpY2VfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdERpcmVjdFNvdW5kRGV2aWNlICpkZXZpY2UgPSBHU1RfRElSRUNUU09VTkRfREVWSUNFIChvYmplY3QpOworCisgIGdfZnJlZSAoZGV2aWNlLT5ndWlkKTsKKworICBHX09CSkVDVF9DTEFTUyAoZ3N0X2RpcmVjdHNvdW5kX2RldmljZV9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorZ3N0X2RpcmVjdHNvdW5kX2RldmljZV9jcmVhdGVfZWxlbWVudCAoR3N0RGV2aWNlICogZGV2aWNlLCBjb25zdCBnY2hhciAqIG5hbWUpCit7CisgIEdzdERpcmVjdFNvdW5kRGV2aWNlICpkaXJlY3Rzb3VuZF9kZXYgPSBHU1RfRElSRUNUU09VTkRfREVWSUNFIChkZXZpY2UpOworICBHc3RFbGVtZW50ICplbGVtOworCisjaWZkZWYgR1NUX0RJUkVDVFNPVU5EX1NSQ19ERVZJQ0VfUFJPVklERVIKKyAgZWxlbSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImRpcmVjdHNvdW5kc3JjIiwgbmFtZSk7CisjZWxzZQorICBlbGVtID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZGlyZWN0c291bmRzaW5rIiwgbmFtZSk7CisjZW5kaWYKKworICBnX29iamVjdF9zZXQgKGVsZW0sICJkZXZpY2UiLCBkaXJlY3Rzb3VuZF9kZXYtPmd1aWQsIE5VTEwpOworCisgIHJldHVybiBlbGVtOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RpcmVjdHNvdW5kX2RldmljZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0RGlyZWN0U291bmREZXZpY2UgKmRldmljZSA9IEdTVF9ESVJFQ1RTT1VORF9ERVZJQ0VfQ0FTVCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfREVWSUNFX0dVSUQ6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBkZXZpY2UtPmd1aWQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2RpcmVjdHNvdW5kX2RldmljZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0RGlyZWN0U291bmREZXZpY2UgKmRldmljZSA9IEdTVF9ESVJFQ1RTT1VORF9ERVZJQ0VfQ0FTVCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfREVWSUNFX0dVSUQ6CisgICAgICBkZXZpY2UtPmd1aWQgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL3N5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZGRldmljZS5oIGIvc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUwMjg5MwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZGRldmljZS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDE4IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9ESVJFQ1RTT1VORF9ERVZJQ0VfSF9fCisjZGVmaW5lIF9fR1NUX0RJUkVDVFNPVU5EX0RFVklDRV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0RGlyZWN0U291bmREZXZpY2VQcm92aWRlciBHc3REaXJlY3RTb3VuZERldmljZVByb3ZpZGVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdERpcmVjdFNvdW5kRGV2aWNlUHJvdmlkZXJDbGFzcyBHc3REaXJlY3RTb3VuZERldmljZVByb3ZpZGVyQ2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfRElSRUNUU09VTkRfREVWSUNFX1BST1ZJREVSICAgICAgICAgICAgICAgICAoZ3N0X2RpcmVjdHNvdW5kX2RldmljZV9wcm92aWRlcl9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfSVNfRElSRUNUU09VTkRfREVWSUNFX1BST1ZJREVSKG9iaikgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX0RJUkVDVFNPVU5EX0RFVklDRV9QUk9WSURFUikpCisjZGVmaW5lIEdTVF9JU19ESVJFQ1RTT1VORF9ERVZJQ0VfUFJPVklERVJfQ0xBU1Moa2xhc3MpICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9ESVJFQ1RTT1VORF9ERVZJQ0VfUFJPVklERVIpKQorI2RlZmluZSBHU1RfRElSRUNUU09VTkRfREVWSUNFX1BST1ZJREVSX0dFVF9DTEFTUyhvYmopICAgICAgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfRElSRUNUU09VTkRfREVWSUNFX1BST1ZJREVSLCBHc3REaXJlY3RTb3VuZERldmljZVByb3ZpZGVyQ2xhc3MpKQorI2RlZmluZSBHU1RfRElSRUNUU09VTkRfREVWSUNFX1BST1ZJREVSKG9iaikgICAgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0RJUkVDVFNPVU5EX0RFVklDRV9QUk9WSURFUiwgR3N0RGlyZWN0U291bmREZXZpY2VQcm92aWRlcikpCisjZGVmaW5lIEdTVF9ESVJFQ1RTT1VORF9ERVZJQ0VfUFJPVklERVJfQ0xBU1Moa2xhc3MpICAgICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9ERVZJQ0VfUFJPVklERVIsIEdzdERpcmVjdFNvdW5kRGV2aWNlUHJvdmlkZXJDbGFzcykpCisjZGVmaW5lIEdTVF9ESVJFQ1RTT1VORF9ERVZJQ0VfUFJPVklERVJfQ0FTVChvYmopICAgICAgICAgICAgKChHc3REaXJlY3RTb3VuZERldmljZVByb3ZpZGVyICopKG9iaikpCisKK3N0cnVjdCBfR3N0RGlyZWN0U291bmREZXZpY2VQcm92aWRlciB7CisgIEdzdERldmljZVByb3ZpZGVyIHBhcmVudDsKK307CisKK3N0cnVjdCBfR3N0RGlyZWN0U291bmREZXZpY2VQcm92aWRlckNsYXNzIHsKKyAgR3N0RGV2aWNlUHJvdmlkZXJDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfZGlyZWN0c291bmRfZGV2aWNlX3Byb3ZpZGVyX2dldF90eXBlICh2b2lkKTsKKworCit0eXBlZGVmIHN0cnVjdCBfR3N0RGlyZWN0U291bmREZXZpY2UgR3N0RGlyZWN0U291bmREZXZpY2U7Cit0eXBlZGVmIHN0cnVjdCBfR3N0RGlyZWN0U291bmREZXZpY2VDbGFzcyBHc3REaXJlY3RTb3VuZERldmljZUNsYXNzOworCisjZGVmaW5lIEdTVF9UWVBFX0RJUkVDVFNPVU5EX0RFVklDRSAgICAgICAgICAgICAgICAgKGdzdF9kaXJlY3Rzb3VuZF9kZXZpY2VfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0lTX0RJUkVDVFNPVU5EX0RFVklDRShvYmopICAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9ESVJFQ1RTT1VORF9ERVZJQ0UpKQorI2RlZmluZSBHU1RfSVNfRElSRUNUU09VTkRfREVWSUNFX0NMQVNTKGtsYXNzKSAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgR1NUX1RZUEVfRElSRUNUU09VTkRfREVWSUNFKSkKKyNkZWZpbmUgR1NUX0RJUkVDVFNPVU5EX0RFVklDRV9HRVRfQ0xBU1Mob2JqKSAgICAgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIEdTVF9UWVBFX0RJUkVDVFNPVU5EX0RFVklDRSwgR3N0RGlyZWN0U291bmREZXZpY2VDbGFzcykpCisjZGVmaW5lIEdTVF9ESVJFQ1RTT1VORF9ERVZJQ0Uob2JqKSAgICAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfRElSRUNUU09VTkRfREVWSUNFLCBHc3REaXJlY3RTb3VuZERldmljZSkpCisjZGVmaW5lIEdTVF9ESVJFQ1RTT1VORF9ERVZJQ0VfQ0xBU1Moa2xhc3MpICAgICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9ERVZJQ0UsIEdzdERpcmVjdFNvdW5kRGV2aWNlQ2xhc3MpKQorI2RlZmluZSBHU1RfRElSRUNUU09VTkRfREVWSUNFX0NBU1Qob2JqKSAgICAgICAgICAgICgoR3N0RGlyZWN0U291bmREZXZpY2UgKikob2JqKSkKKworc3RydWN0IF9Hc3REaXJlY3RTb3VuZERldmljZSB7CisgIEdzdERldmljZSBwYXJlbnQ7CisKKyAgZ2NoYXIgKmd1aWQ7Cit9OworCitzdHJ1Y3QgX0dzdERpcmVjdFNvdW5kRGV2aWNlQ2xhc3MgeworICBHc3REZXZpY2VDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfZGlyZWN0c291bmRfZGV2aWNlX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0RJUkVDVFNPVU5EX0RFVklDRV9IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHBsdWdpbi5jIGIvc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kcGx1Z2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNhN2YxYwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHBsdWdpbi5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qIEdTdHJlYW1lcgorKiBDb3B5cmlnaHQgKEMpIDIwMDUgU2ViYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisqIENvcHlyaWdodCAoQykgMjAwNyBQaW9uZWVycyBvZiB0aGUgSW5ldml0YWJsZSA8c29uZ2JpcmRAc29uZ2JpcmRuZXN0LmNvbT4KKyoKKyogZ3N0ZGlyZWN0c291bmRwbHVnaW4uYzoKKyoKKyogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyogCisqCisqIFRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUgd2FzIG1hZGUgcG9zc2libGUgZHVlIHRvIHRoZSBpbnZvbHZlbWVudAorKiBvZiBQaW9uZWVycyBvZiB0aGUgSW5ldml0YWJsZSwgdGhlIGNyZWF0b3JzIG9mIHRoZSBTb25nYmlyZCBNdXNpYyBwbGF5ZXIKKyoKKyovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdGRpcmVjdHNvdW5kc2luay5oIgorI2luY2x1ZGUgImdzdGRpcmVjdHNvdW5kZGV2aWNlLmgiCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiZGlyZWN0c291bmRzaW5rIiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgICAgICBHU1RfVFlQRV9ESVJFQ1RTT1VORF9TSU5LKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfZGV2aWNlX3Byb3ZpZGVyX3JlZ2lzdGVyIChwbHVnaW4sICJkaXJlY3Rzb3VuZHNpbmtkZXZpY2Vwcm92aWRlciIsCisgICAgICAgICAgR1NUX1JBTktfUFJJTUFSWSwgR1NUX1RZUEVfRElSRUNUU09VTkRfREVWSUNFX1BST1ZJREVSKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBkaXJlY3Rzb3VuZCwKKyAgICAiRGlyZWN0IFNvdW5kIHBsdWdpbiBsaWJyYXJ5IiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgIkxHUEwiLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9zeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmMgYi9zeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkYTE4NgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYwpAQCAtMCwwICsxLDEwNTAgQEAKKy8qIEdTdHJlYW1lcgorKiBDb3B5cmlnaHQgKEMpIDIwMDUgU2ViYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisqIENvcHlyaWdodCAoQykgMjAwNyBQaW9uZWVycyBvZiB0aGUgSW5ldml0YWJsZSA8c29uZ2JpcmRAc29uZ2JpcmRuZXN0LmNvbT4KKyogQ29weXJpZ2h0IChDKSAyMDEwIEZsdWVuZG8gUy5BLiA8c3VwcG9ydEBmbHVlbmRvLmNvbT4KKyoKKyogZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisqCisqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisqCisqCisqIFRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUgd2FzIG1hZGUgcG9zc2libGUgZHVlIHRvIHRoZSBpbnZvbHZlbWVudAorKiBvZiBQaW9uZWVycyBvZiB0aGUgSW5ldml0YWJsZSwgdGhlIGNyZWF0b3JzIG9mIHRoZSBTb25nYmlyZCBNdXNpYyBwbGF5ZXIKKyoKKyovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWRpcmVjdHNvdW5kc2luaworICoKKyAqIFRoaXMgZWxlbWVudCBsZXRzIHlvdSBvdXRwdXQgc291bmQgdXNpbmcgdGhlIERpcmVjdFNvdW5kIEFQSS4KKyAqCisgKiBOb3RlIHRoYXQgeW91IHNob3VsZCBhbG1vc3QgYWx3YXlzIHVzZSBnZW5lcmljIGF1ZGlvIGNvbnZlcnNpb24gZWxlbWVudHMKKyAqIGxpa2UgYXVkaW9jb252ZXJ0IGFuZCBhdWRpb3Jlc2FtcGxlIGluIGZyb250IG9mIGFuIGF1ZGlvc2luayB0byBtYWtlIHN1cmUKKyAqIHlvdXIgcGlwZWxpbmUgd29ya3MgdW5kZXIgYWxsIGNpcmN1bXN0YW5jZXMgKHRob3NlIGNvbnZlcnNpb24gZWxlbWVudHMgd2lsbAorICogYWN0IGluIHBhc3N0aHJvdWdoLW1vZGUgaWYgbm8gY29udmVyc2lvbiBpcyBuZWNlc3NhcnkpLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgYXVkaW90ZXN0c3JjICEgYXVkaW9jb252ZXJ0ICEgdm9sdW1lIHZvbHVtZT0wLjEgISBkaXJlY3Rzb3VuZHNpbmsKKyAqIF18IHdpbGwgb3V0cHV0IGEgc2luZSB3YXZlIChjb250aW51b3VzIGJlZXAgc291bmQpIHRvIHlvdXIgc291bmQgY2FyZCAod2l0aAorICogYSB2ZXJ5IGxvdyB2b2x1bWUgYXMgcHJlY2F1dGlvbikuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgZmlsZXNyYyBsb2NhdGlvbj1tdXNpYy5vZ2cgISBkZWNvZGViaW4gISBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgZGlyZWN0c291bmRzaW5rCisgKiBdfCB3aWxsIHBsYXkgYW4gT2dnL1ZvcmJpcyBhdWRpbyBmaWxlIGFuZCBvdXRwdXQgaXQuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2VzaW5rLmg+CisjaW5jbHVkZSAiZ3N0ZGlyZWN0c291bmRzaW5rLmgiCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvaWVjNjE5MzcuaD4KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2lmZGVmIF9fQ1lHV0lOX18KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZm5kZWYgX3N3YWIKKyNkZWZpbmUgX3N3YWIgc3dhYgorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBERUZBVUxUX01VVEUgRkFMU0UKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZGlyZWN0c291bmRzaW5rX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGRpcmVjdHNvdW5kc2lua19kZWJ1ZworCitzdGF0aWMgdm9pZCBnc3RfZGlyZWN0c291bmRfc2lua19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyB2b2lkIGdzdF9kaXJlY3Rzb3VuZF9zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9kaXJlY3Rzb3VuZF9zaW5rX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIEdzdENhcHMgKmdzdF9kaXJlY3Rzb3VuZF9zaW5rX2dldGNhcHMgKEdzdEJhc2VTaW5rICogYnNpbmssCisgICAgR3N0Q2FwcyAqIGZpbHRlcik7CitzdGF0aWMgR3N0QnVmZmVyICpnc3RfZGlyZWN0c291bmRfc2lua19wYXlsb2FkIChHc3RBdWRpb0Jhc2VTaW5rICogc2luaywKKyAgICBHc3RCdWZmZXIgKiBidWYpOworc3RhdGljIGdib29sZWFuIGdzdF9kaXJlY3Rzb3VuZF9zaW5rX3ByZXBhcmUgKEdzdEF1ZGlvU2luayAqIGFzaW5rLAorICAgIEdzdEF1ZGlvUmluZ0J1ZmZlclNwZWMgKiBzcGVjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZGlyZWN0c291bmRfc2lua191bnByZXBhcmUgKEdzdEF1ZGlvU2luayAqIGFzaW5rKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZGlyZWN0c291bmRfc2lua19vcGVuIChHc3RBdWRpb1NpbmsgKiBhc2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2RpcmVjdHNvdW5kX3NpbmtfY2xvc2UgKEdzdEF1ZGlvU2luayAqIGFzaW5rKTsKK3N0YXRpYyBnaW50IGdzdF9kaXJlY3Rzb3VuZF9zaW5rX3dyaXRlIChHc3RBdWRpb1NpbmsgKiBhc2luaywKKyAgICBncG9pbnRlciBkYXRhLCBndWludCBsZW5ndGgpOworc3RhdGljIGd1aW50IGdzdF9kaXJlY3Rzb3VuZF9zaW5rX2RlbGF5IChHc3RBdWRpb1NpbmsgKiBhc2luayk7CitzdGF0aWMgdm9pZCBnc3RfZGlyZWN0c291bmRfc2lua19yZXNldCAoR3N0QXVkaW9TaW5rICogYXNpbmspOworc3RhdGljIEdzdENhcHMgKmdzdF9kaXJlY3Rzb3VuZF9wcm9iZV9zdXBwb3J0ZWRfZm9ybWF0cyAoR3N0RGlyZWN0U291bmRTaW5rICoKKyAgICBkc291bmRzaW5rLCBjb25zdCBHc3RDYXBzICogdGVtcGxhdGVfY2Fwcyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2RpcmVjdHNvdW5kX3NpbmtfcXVlcnkgKEdzdEJhc2VTaW5rICogcGFkLAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworCitzdGF0aWMgdm9pZCBnc3RfZGlyZWN0c291bmRfc2lua19zZXRfdm9sdW1lIChHc3REaXJlY3RTb3VuZFNpbmsgKiBzaW5rLAorICAgIGdkb3VibGUgdm9sdW1lLCBnYm9vbGVhbiBzdG9yZSk7CitzdGF0aWMgZ2RvdWJsZSBnc3RfZGlyZWN0c291bmRfc2lua19nZXRfdm9sdW1lIChHc3REaXJlY3RTb3VuZFNpbmsgKiBzaW5rKTsKK3N0YXRpYyB2b2lkIGdzdF9kaXJlY3Rzb3VuZF9zaW5rX3NldF9tdXRlIChHc3REaXJlY3RTb3VuZFNpbmsgKiBzaW5rLAorICAgIGdib29sZWFuIG11dGUpOworc3RhdGljIGdib29sZWFuIGdzdF9kaXJlY3Rzb3VuZF9zaW5rX2dldF9tdXRlIChHc3REaXJlY3RTb3VuZFNpbmsgKiBzaW5rKTsKK3N0YXRpYyBjb25zdCBnY2hhciAqZ3N0X2RpcmVjdHNvdW5kX3NpbmtfZ2V0X2RldmljZSAoR3N0RGlyZWN0U291bmRTaW5rICoKKyAgICBkc291bmRzaW5rKTsKK3N0YXRpYyB2b2lkIGdzdF9kaXJlY3Rzb3VuZF9zaW5rX3NldF9kZXZpY2UgKEdzdERpcmVjdFNvdW5kU2luayAqIGRzb3VuZHNpbmssCisgICAgY29uc3QgZ2NoYXIgKiBkZXZpY2VfaWQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2RpcmVjdHNvdW5kX3NpbmtfaXNfc3BkaWZfZm9ybWF0IChHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICoKKyAgICBzcGVjKTsKKworc3RhdGljIGdjaGFyICpnc3RfaHJlc190b19zdHJpbmcgKEhSRVNVTFQgaFJlcyk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBkaXJlY3Rzb3VuZHNpbmtfc2lua19mYWN0b3J5ID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX0RJUkVDVFNPVU5EX1NJTktfQ0FQUykpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9WT0xVTUUsCisgIFBST1BfTVVURSwKKyAgUFJPUF9ERVZJQ0UKK307CisKKyNkZWZpbmUgZ3N0X2RpcmVjdHNvdW5kX3NpbmtfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdERpcmVjdFNvdW5kU2luaywgZ3N0X2RpcmVjdHNvdW5kX3NpbmssCisgICAgR1NUX1RZUEVfQVVESU9fU0lOSywgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9TVFJFQU1fVk9MVU1FLCBOVUxMKQorICAgICk7CisKK3N0YXRpYyB2b2lkCitnc3RfZGlyZWN0c291bmRfc2lua19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0RGlyZWN0U291bmRTaW5rICpkc291bmRzaW5rID0gR1NUX0RJUkVDVFNPVU5EX1NJTksgKG9iamVjdCk7CisKKyAgZ19mcmVlIChkc291bmRzaW5rLT5kZXZpY2VfaWQpOworICBkc291bmRzaW5rLT5kZXZpY2VfaWQgPSBOVUxMOworCisgIGdfbXV0ZXhfY2xlYXIgKCZkc291bmRzaW5rLT5kc291bmRfbG9jayk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGRzb3VuZHNpbmstPnN5c3RlbV9jbG9jayk7CisgIGlmIChkc291bmRzaW5rLT53cml0ZV93YWl0X2Nsb2NrX2lkICE9IE5VTEwpIHsKKyAgICBnc3RfY2xvY2tfaWRfdW5yZWYgKGRzb3VuZHNpbmstPndyaXRlX3dhaXRfY2xvY2tfaWQpOworICB9CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RpcmVjdHNvdW5kX3NpbmtfY2xhc3NfaW5pdCAoR3N0RGlyZWN0U291bmRTaW5rQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0QmFzZVNpbmtDbGFzcyAqZ3N0YmFzZXNpbmtfY2xhc3MgPSBHU1RfQkFTRV9TSU5LX0NMQVNTIChrbGFzcyk7CisgIEdzdEF1ZGlvU2lua0NsYXNzICpnc3RhdWRpb3NpbmtfY2xhc3MgPSBHU1RfQVVESU9fU0lOS19DTEFTUyAoa2xhc3MpOworICBHc3RBdWRpb0Jhc2VTaW5rQ2xhc3MgKmdzdGF1ZGlvYmFzZXNpbmtfY2xhc3MgPQorICAgICAgR1NUX0FVRElPX0JBU0VfU0lOS19DTEFTUyAoa2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChkaXJlY3Rzb3VuZHNpbmtfZGVidWcsICJkaXJlY3Rzb3VuZHNpbmsiLCAwLAorICAgICAgIkRpcmVjdFNvdW5kIHNpbmsiKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9kaXJlY3Rzb3VuZF9zaW5rX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfZGlyZWN0c291bmRfc2lua19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9kaXJlY3Rzb3VuZF9zaW5rX2dldF9wcm9wZXJ0eTsKKworICBnc3RiYXNlc2lua19jbGFzcy0+Z2V0X2NhcHMgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kaXJlY3Rzb3VuZF9zaW5rX2dldGNhcHMpOworCisgIGdzdGJhc2VzaW5rX2NsYXNzLT5xdWVyeSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGlyZWN0c291bmRfc2lua19xdWVyeSk7CisKKyAgZ3N0YXVkaW9iYXNlc2lua19jbGFzcy0+cGF5bG9hZCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2RpcmVjdHNvdW5kX3NpbmtfcGF5bG9hZCk7CisKKyAgZ3N0YXVkaW9zaW5rX2NsYXNzLT5wcmVwYXJlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGlyZWN0c291bmRfc2lua19wcmVwYXJlKTsKKyAgZ3N0YXVkaW9zaW5rX2NsYXNzLT51bnByZXBhcmUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kaXJlY3Rzb3VuZF9zaW5rX3VucHJlcGFyZSk7CisgIGdzdGF1ZGlvc2lua19jbGFzcy0+b3BlbiA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGlyZWN0c291bmRfc2lua19vcGVuKTsKKyAgZ3N0YXVkaW9zaW5rX2NsYXNzLT5jbG9zZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGlyZWN0c291bmRfc2lua19jbG9zZSk7CisgIGdzdGF1ZGlvc2lua19jbGFzcy0+d3JpdGUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2RpcmVjdHNvdW5kX3Npbmtfd3JpdGUpOworICBnc3RhdWRpb3NpbmtfY2xhc3MtPmRlbGF5ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kaXJlY3Rzb3VuZF9zaW5rX2RlbGF5KTsKKyAgZ3N0YXVkaW9zaW5rX2NsYXNzLT5yZXNldCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGlyZWN0c291bmRfc2lua19yZXNldCk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfVk9MVU1FLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoInZvbHVtZSIsICJWb2x1bWUiLAorICAgICAgICAgICJWb2x1bWUgb2YgdGhpcyBzdHJlYW0iLCAwLjAsIDEuMCwgMS4wLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX01VVEUsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoIm11dGUiLCAiTXV0ZSIsCisgICAgICAgICAgIk11dGUgc3RhdGUgb2YgdGhpcyBzdHJlYW0iLCBERUZBVUxUX01VVEUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfREVWSUNFLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImRldmljZSIsICJEZXZpY2UiLAorICAgICAgICAgICJEaXJlY3RTb3VuZCBwbGF5YmFjayBkZXZpY2UgYXMgYSBHVUlEIHN0cmluZyIsCisgICAgICAgICAgTlVMTCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywKKyAgICAgICJEaXJlY3QgU291bmQgQXVkaW8gU2luayIsICJTaW5rL0F1ZGlvIiwKKyAgICAgICJPdXRwdXQgdG8gYSBzb3VuZCBjYXJkIHZpYSBEaXJlY3QgU291bmQiLAorICAgICAgIlNlYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmRpcmVjdHNvdW5kc2lua19zaW5rX2ZhY3RvcnkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RpcmVjdHNvdW5kX3NpbmtfaW5pdCAoR3N0RGlyZWN0U291bmRTaW5rICogZHNvdW5kc2luaykKK3sKKyAgZHNvdW5kc2luay0+dm9sdW1lID0gMTAwOworICBkc291bmRzaW5rLT5tdXRlID0gRkFMU0U7CisgIGRzb3VuZHNpbmstPmRldmljZV9pZCA9IE5VTEw7CisgIGRzb3VuZHNpbmstPnBEUyA9IE5VTEw7CisgIGRzb3VuZHNpbmstPmNhY2hlZF9jYXBzID0gTlVMTDsKKyAgZHNvdW5kc2luay0+cERTQlNlY29uZGFyeSA9IE5VTEw7CisgIGRzb3VuZHNpbmstPmN1cnJlbnRfY2lyY3VsYXJfb2Zmc2V0ID0gMDsKKyAgZHNvdW5kc2luay0+YnVmZmVyX3NpemUgPSBEU0JTSVpFX01JTjsKKyAgZ19tdXRleF9pbml0ICgmZHNvdW5kc2luay0+ZHNvdW5kX2xvY2spOworICBkc291bmRzaW5rLT5zeXN0ZW1fY2xvY2sgPSBnc3Rfc3lzdGVtX2Nsb2NrX29idGFpbiAoKTsKKyAgZHNvdW5kc2luay0+d3JpdGVfd2FpdF9jbG9ja19pZCA9IE5VTEw7CisgIGRzb3VuZHNpbmstPmZpcnN0X2J1ZmZlcl9hZnRlcl9yZXNldCA9IEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RpcmVjdHNvdW5kX3Npbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdERpcmVjdFNvdW5kU2luayAqc2luayA9IEdTVF9ESVJFQ1RTT1VORF9TSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9WT0xVTUU6CisgICAgICBnc3RfZGlyZWN0c291bmRfc2lua19zZXRfdm9sdW1lIChzaW5rLCBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKSwgVFJVRSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTVVURToKKyAgICAgIGdzdF9kaXJlY3Rzb3VuZF9zaW5rX3NldF9tdXRlIChzaW5rLCBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RFVklDRToKKyAgICAgIGdzdF9kaXJlY3Rzb3VuZF9zaW5rX3NldF9kZXZpY2UgKHNpbmssIGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9kaXJlY3Rzb3VuZF9zaW5rX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3REaXJlY3RTb3VuZFNpbmsgKnNpbmsgPSBHU1RfRElSRUNUU09VTkRfU0lOSyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfVk9MVU1FOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgZ3N0X2RpcmVjdHNvdW5kX3NpbmtfZ2V0X3ZvbHVtZSAoc2luaykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01VVEU6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZ3N0X2RpcmVjdHNvdW5kX3NpbmtfZ2V0X211dGUgKHNpbmspKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ERVZJQ0U6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBnc3RfZGlyZWN0c291bmRfc2lua19nZXRfZGV2aWNlIChzaW5rKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9kaXJlY3Rzb3VuZF9zaW5rX2dldGNhcHMgKEdzdEJhc2VTaW5rICogYnNpbmssIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKyAgR3N0UGFkVGVtcGxhdGUgKnBhZF90ZW1wbGF0ZTsKKyAgR3N0RGlyZWN0U291bmRTaW5rICpkc291bmRzaW5rID0gR1NUX0RJUkVDVFNPVU5EX1NJTksgKGJzaW5rKTsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBpZiAoZHNvdW5kc2luay0+cERTID09IE5VTEwpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkc291bmRzaW5rLCAiZGV2aWNlIG5vdCBvcGVuLCB1c2luZyB0ZW1wbGF0ZSBjYXBzIik7CisgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIGJhc2UgY2xhc3Mgd2lsbCBnZXQgdGVtcGxhdGUgY2FwcyBmb3IgdXMgKi8KKyAgfQorCisgIGlmIChkc291bmRzaW5rLT5jYWNoZWRfY2FwcykgeworICAgIGNhcHMgPSBnc3RfY2Fwc19yZWYgKGRzb3VuZHNpbmstPmNhY2hlZF9jYXBzKTsKKyAgfSBlbHNlIHsKKyAgICBlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChkc291bmRzaW5rKTsKKyAgICBwYWRfdGVtcGxhdGUgPSBnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAic2luayIpOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYWRfdGVtcGxhdGUgIT0gTlVMTCwgTlVMTCk7CisKKyAgICBjYXBzID0gZ3N0X2RpcmVjdHNvdW5kX3Byb2JlX3N1cHBvcnRlZF9mb3JtYXRzIChkc291bmRzaW5rLAorICAgICAgICBnc3RfcGFkX3RlbXBsYXRlX2dldF9jYXBzIChwYWRfdGVtcGxhdGUpKTsKKyAgICBpZiAoY2FwcykKKyAgICAgIGRzb3VuZHNpbmstPmNhY2hlZF9jYXBzID0gZ3N0X2NhcHNfcmVmIChjYXBzKTsKKyAgfQorCisgIGlmIChjYXBzICYmIGZpbHRlcikgeworICAgIEdzdENhcHMgKnRtcCA9CisgICAgICAgIGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIGNhcHMsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIGNhcHMgPSB0bXA7CisgIH0KKworICBpZiAoY2FwcykgeworICAgIGdjaGFyICpjYXBzX3N0cmluZyA9IGdzdF9jYXBzX3RvX3N0cmluZyAoY2Fwcyk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZHNvdW5kc2luaywgInJldHVybmluZyBjYXBzICVzIiwgY2Fwc19zdHJpbmcpOworICAgIGdfZnJlZSAoY2Fwc19zdHJpbmcpOworICB9CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RpcmVjdHNvdW5kX3NpbmtfYWNjZXB0Y2FwcyAoR3N0QmFzZVNpbmsgKiBzaW5rLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3REaXJlY3RTb3VuZFNpbmsgKmRzaW5rID0gR1NUX0RJUkVDVFNPVU5EX1NJTksgKHNpbmspOworICBHc3RQYWQgKnBhZDsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0Q2FwcyAqcGFkX2NhcHM7CisgIEdzdFN0cnVjdHVyZSAqc3Q7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjIHNwZWMgPSB7IDAgfTsKKworICBpZiAoR19VTkxJS0VMWSAoZHNpbmsgPT0gTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHBhZCA9IHNpbmstPnNpbmtwYWQ7CisKKyAgZ3N0X3F1ZXJ5X3BhcnNlX2FjY2VwdF9jYXBzIChxdWVyeSwgJmNhcHMpOworICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJjYXBzICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICBwYWRfY2FwcyA9IGdzdF9wYWRfcXVlcnlfY2FwcyAocGFkLCBOVUxMKTsKKyAgaWYgKHBhZF9jYXBzKSB7CisgICAgZ2Jvb2xlYW4gY3JldCA9IGdzdF9jYXBzX2lzX3N1YnNldCAoY2FwcywgcGFkX2NhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChwYWRfY2Fwcyk7CisgICAgaWYgKCFjcmV0KSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkc2luaywKKyAgICAgICAgICAiQ2FwcyBhcmUgbm90IGEgc3Vic2V0IG9mIHRoZSBwYWQgY2Fwcywgbm90IGFjY2VwdGluZyBjYXBzIik7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICB9CisKKyAgLyogSWYgd2UndmUgbm90IGdvdCBmaXhlZCBjYXBzLCBjcmVhdGluZyBhIHN0cmVhbSBtaWdodCBmYWlsLCBzbyBsZXQncyBqdXN0CisgICAqIHJldHVybiBmcm9tIGhlcmUgd2l0aCBkZWZhdWx0IGFjY2VwdGNhcHMgYmVoYXZpb3VyICovCisgIGlmICghZ3N0X2NhcHNfaXNfZml4ZWQgKGNhcHMpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZHNpbmssICJDYXBzIGFyZSBub3QgZml4ZWQsIG5vdCBhY2NlcHRpbmcgY2FwcyIpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIHNwZWMubGF0ZW5jeV90aW1lID0gR1NUX1NFQ09ORDsKKyAgaWYgKCFnc3RfYXVkaW9fcmluZ19idWZmZXJfcGFyc2VfY2FwcyAoJnNwZWMsIGNhcHMpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZHNpbmssICJGYWlsZWQgdG8gcGFyc2UgY2Fwcywgbm90IGFjY2VwdGluZyIpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIC8qIE1ha2Ugc3VyZSBpbnB1dCBpcyBmcmFtZWQgKG9uZSBmcmFtZSBwZXIgYnVmZmVyKSBhbmQgY2FuIGJlIHBheWxvYWRlZCAqLworICBzd2l0Y2ggKHNwZWMudHlwZSkgeworICAgIGNhc2UgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX0FDMzoKKyAgICBjYXNlIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9EVFM6CisgICAgeworICAgICAgZ2Jvb2xlYW4gZnJhbWVkID0gRkFMU0UsIHBhcnNlZCA9IEZBTFNFOworICAgICAgc3QgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfYm9vbGVhbiAoc3QsICJmcmFtZWQiLCAmZnJhbWVkKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2Jvb2xlYW4gKHN0LCAicGFyc2VkIiwgJnBhcnNlZCk7CisgICAgICBpZiAoKCFmcmFtZWQgJiYgIXBhcnNlZCkgfHwgZ3N0X2F1ZGlvX2llYzYxOTM3X2ZyYW1lX3NpemUgKCZzcGVjKSA8PSAwKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRzaW5rLCAiV3JvbmcgQUMzL0RUUyBjYXBzLCBub3QgYWNjZXB0aW5nIik7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldCA9IFRSVUU7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGRzaW5rLCAiQWNjZXB0aW5nIGNhcHMiKTsKKworZG9uZToKKyAgZ3N0X3F1ZXJ5X3NldF9hY2NlcHRfY2Fwc19yZXN1bHQgKHF1ZXJ5LCByZXQpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZGlyZWN0c291bmRfc2lua19xdWVyeSAoR3N0QmFzZVNpbmsgKiBzaW5rLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnYm9vbGVhbiByZXMgPSBUUlVFOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0FDQ0VQVF9DQVBTOgorICAgICAgcmVzID0gZ3N0X2RpcmVjdHNvdW5kX3NpbmtfYWNjZXB0Y2FwcyAoc2luaywgcXVlcnkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IEdTVF9CQVNFX1NJTktfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnF1ZXJ5IChzaW5rLCBxdWVyeSk7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgTFBHVUlECitzdHJpbmdfdG9fZ3VpZCAoY29uc3QgZ2NoYXIgKiBzdHIpCit7CisgIEhSRVNVTFQgcmV0OworICBndW5pY2hhcjIgKndzdHI7CisgIExQR1VJRCBvdXQ7CisKKyAgd3N0ciA9IGdfdXRmOF90b191dGYxNiAoc3RyLCAtMSwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICghd3N0cikKKyAgICByZXR1cm4gTlVMTDsKKworICBvdXQgPSBnX25ldyAoR1VJRCwgMSk7CisgIHJldCA9IENMU0lERnJvbVN0cmluZyAoKExQT0xFU1RSKSB3c3RyLCBvdXQpOworICBnX2ZyZWUgKHdzdHIpOworICBpZiAocmV0ICE9IE5PRVJST1IpIHsKKyAgICBnX2ZyZWUgKG91dCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gb3V0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kaXJlY3Rzb3VuZF9zaW5rX29wZW4gKEdzdEF1ZGlvU2luayAqIGFzaW5rKQoreworICBHc3REaXJlY3RTb3VuZFNpbmsgKmRzb3VuZHNpbms7CisgIEhSRVNVTFQgaFJlczsKKyAgTFBHVUlEIGxwR3VpZCA9IE5VTEw7CisKKyAgZHNvdW5kc2luayA9IEdTVF9ESVJFQ1RTT1VORF9TSU5LIChhc2luayk7CisKKyAgaWYgKGRzb3VuZHNpbmstPmRldmljZV9pZCkgeworICAgIGxwR3VpZCA9IHN0cmluZ190b19ndWlkIChkc291bmRzaW5rLT5kZXZpY2VfaWQpOworICAgIGlmIChscEd1aWQgPT0gTlVMTCkgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRzb3VuZHNpbmssIFJFU09VUkNFLCBPUEVOX1JFQUQsCisgICAgICAgICAgKCJkZXZpY2Ugc2V0IGJ1dCBndWlkIG5vdCBmb3VuZDogJXMiLCBkc291bmRzaW5rLT5kZXZpY2VfaWQpLCAoTlVMTCkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorCisgIC8qIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIERpcmVjdFNvdW5kIG9iamVjdCAqLworICBpZiAoRkFJTEVEIChoUmVzID0gRGlyZWN0U291bmRDcmVhdGUgKGxwR3VpZCwgJmRzb3VuZHNpbmstPnBEUywgTlVMTCkpKSB7CisgICAgZ2NoYXIgKmVycm9yX3RleHQgPSBnc3RfaHJlc190b19zdHJpbmcgKGhSZXMpOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkc291bmRzaW5rLCBSRVNPVVJDRSwgT1BFTl9SRUFELAorICAgICAgICAoIkRpcmVjdFNvdW5kQ3JlYXRlOiAlcyIsIGVycm9yX3RleHQpLCAoTlVMTCkpOworICAgIGdfZnJlZSAobHBHdWlkKTsKKyAgICBnX2ZyZWUgKGVycm9yX3RleHQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGdfZnJlZSAobHBHdWlkKTsKKworICBpZiAoRkFJTEVEIChoUmVzID0gSURpcmVjdFNvdW5kX1NldENvb3BlcmF0aXZlTGV2ZWwgKGRzb3VuZHNpbmstPnBEUywKKyAgICAgICAgICAgICAgR2V0RGVza3RvcFdpbmRvdyAoKSwgRFNTQ0xfUFJJT1JJVFkpKSkgeworICAgIGdjaGFyICplcnJvcl90ZXh0ID0gZ3N0X2hyZXNfdG9fc3RyaW5nIChoUmVzKTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZHNvdW5kc2luaywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwKKyAgICAgICAgKCJJRGlyZWN0U291bmRfU2V0Q29vcGVyYXRpdmVMZXZlbDogJXMiLCBlcnJvcl90ZXh0KSwgKE5VTEwpKTsKKyAgICBnX2ZyZWUgKGVycm9yX3RleHQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kaXJlY3Rzb3VuZF9zaW5rX2lzX3NwZGlmX2Zvcm1hdCAoR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpCit7CisgIHJldHVybiBzcGVjLT50eXBlID09IEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9BQzMgfHwKKyAgICAgIHNwZWMtPnR5cGUgPT0gR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX0RUUzsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZGlyZWN0c291bmRfc2lua19wcmVwYXJlIChHc3RBdWRpb1NpbmsgKiBhc2luaywKKyAgICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYykKK3sKKyAgR3N0RGlyZWN0U291bmRTaW5rICpkc291bmRzaW5rOworICBIUkVTVUxUIGhSZXM7CisgIERTQlVGRkVSREVTQyBkZXNjU2Vjb25kYXJ5OworICBXQVZFRk9STUFURVggd2Z4OworCisgIGRzb3VuZHNpbmsgPSBHU1RfRElSRUNUU09VTkRfU0lOSyAoYXNpbmspOworCisgIC8qc2F2ZSBudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSBhbmQgYnVmZmVyIGZvcm1hdCAqLworICBkc291bmRzaW5rLT5ieXRlc19wZXJfc2FtcGxlID0gc3BlYy0+aW5mby5icGY7CisgIGRzb3VuZHNpbmstPnR5cGUgPSBzcGVjLT50eXBlOworCisgIC8qIGZpbGwgdGhlIFdBVkVGT1JNQVRFWCBzdHJ1Y3R1cmUgd2l0aCBzcGVjIHBhcmFtcyAqLworICBtZW1zZXQgKCZ3ZngsIDAsIHNpemVvZiAod2Z4KSk7CisgIGlmICghZ3N0X2RpcmVjdHNvdW5kX3NpbmtfaXNfc3BkaWZfZm9ybWF0IChzcGVjKSkgeworICAgIHdmeC5jYlNpemUgPSBzaXplb2YgKHdmeCk7CisgICAgd2Z4LndGb3JtYXRUYWcgPSBXQVZFX0ZPUk1BVF9QQ007CisgICAgd2Z4Lm5DaGFubmVscyA9IHNwZWMtPmluZm8uY2hhbm5lbHM7CisgICAgd2Z4Lm5TYW1wbGVzUGVyU2VjID0gc3BlYy0+aW5mby5yYXRlOworICAgIHdmeC53Qml0c1BlclNhbXBsZSA9IChzcGVjLT5pbmZvLmJwZiAqIDgpIC8gd2Z4Lm5DaGFubmVsczsKKyAgICB3ZngubkJsb2NrQWxpZ24gPSBzcGVjLT5pbmZvLmJwZjsKKyAgICB3ZngubkF2Z0J5dGVzUGVyU2VjID0gd2Z4Lm5TYW1wbGVzUGVyU2VjICogd2Z4Lm5CbG9ja0FsaWduOworCisgICAgLyogQ3JlYXRlIGRpcmVjdHNvdW5kIGJ1ZmZlciB3aXRoIHNpemUgYmFzZWQgb24gb3VyIGNvbmZpZ3VyZWQKKyAgICAgKiBidWZmZXJfc2l6ZSAod2hpY2ggaXMgMjAwIG1zIGJ5IGRlZmF1bHQpICovCisgICAgZHNvdW5kc2luay0+YnVmZmVyX3NpemUgPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50ICh3ZngubkF2Z0J5dGVzUGVyU2VjLCBzcGVjLT5idWZmZXJfdGltZSwKKyAgICAgICAgR1NUX01TRUNPTkQpOworICAgIC8qIE1ha2Ugc3VyZSB3ZSBtYWtlIHRob3NlIG51bWJlcnMgbXVsdGlwbGUgb2Ygb3VyIHNhbXBsZSBzaXplIGluIGJ5dGVzICovCisgICAgZHNvdW5kc2luay0+YnVmZmVyX3NpemUgLT0gZHNvdW5kc2luay0+YnVmZmVyX3NpemUgJSBzcGVjLT5pbmZvLmJwZjsKKworICAgIHNwZWMtPnNlZ3NpemUgPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50ICh3ZngubkF2Z0J5dGVzUGVyU2VjLCBzcGVjLT5sYXRlbmN5X3RpbWUsCisgICAgICAgIEdTVF9NU0VDT05EKTsKKyAgICBzcGVjLT5zZWdzaXplIC09IHNwZWMtPnNlZ3NpemUgJSBzcGVjLT5pbmZvLmJwZjsKKyAgICBzcGVjLT5zZWd0b3RhbCA9IGRzb3VuZHNpbmstPmJ1ZmZlcl9zaXplIC8gc3BlYy0+c2Vnc2l6ZTsKKyAgfSBlbHNlIHsKKyNpZmRlZiBXQVZFX0ZPUk1BVF9ET0xCWV9BQzNfU1BESUYKKyAgICB3ZnguY2JTaXplID0gMDsKKyAgICB3Zngud0Zvcm1hdFRhZyA9IFdBVkVfRk9STUFUX0RPTEJZX0FDM19TUERJRjsKKyAgICB3ZngubkNoYW5uZWxzID0gMjsKKyAgICB3ZngublNhbXBsZXNQZXJTZWMgPSA0ODAwMDsKKyAgICB3Zngud0JpdHNQZXJTYW1wbGUgPSAxNjsKKyAgICB3ZngubkJsb2NrQWxpZ24gPSB3Zngud0JpdHNQZXJTYW1wbGUgLyA4ICogd2Z4Lm5DaGFubmVsczsKKyAgICB3ZngubkF2Z0J5dGVzUGVyU2VjID0gd2Z4Lm5TYW1wbGVzUGVyU2VjICogd2Z4Lm5CbG9ja0FsaWduOworCisgICAgc3BlYy0+c2Vnc2l6ZSA9IDYxNDQ7CisgICAgc3BlYy0+c2VndG90YWwgPSAxMDsKKyNlbHNlCisgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisjZW5kaWYKKyAgfQorCisgIC8vIE1ha2UgdGhlIGZpbmFsIGJ1ZmZlciBzaXplIGJlIGFuIGludGVnZXIgbnVtYmVyIG9mIHNlZ21lbnRzCisgIGRzb3VuZHNpbmstPmJ1ZmZlcl9zaXplID0gc3BlYy0+c2Vnc2l6ZSAqIHNwZWMtPnNlZ3RvdGFsOworCisgIEdTVF9JTkZPX09CSkVDVCAoZHNvdW5kc2luaywgImNoYW5uZWxzOiAlZCwgcmF0ZTogJWQsIGJ5dGVzX3Blcl9zYW1wbGU6ICVkIgorICAgICAgIiBXQVZFRk9STUFURVgublNhbXBsZXNQZXJTZWM6ICVsZCwgV0FWRUZPUk1BVEVYLndCaXRzUGVyU2FtcGxlOiAlZCwiCisgICAgICAiIFdBVkVGT1JNQVRFWC5uQmxvY2tBbGlnbjogJWQsIFdBVkVGT1JNQVRFWC5uQXZnQnl0ZXNQZXJTZWM6ICVsZFxuIgorICAgICAgIlNpemUgb2YgZHNvdW5kIGNpcmN1bGFyIGJ1ZmZlcj0+JWRcbiIsCisgICAgICBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJnNwZWMtPmluZm8pLCBHU1RfQVVESU9fSU5GT19SQVRFICgmc3BlYy0+aW5mbyksCisgICAgICBHU1RfQVVESU9fSU5GT19CUEYgKCZzcGVjLT5pbmZvKSwgd2Z4Lm5TYW1wbGVzUGVyU2VjLCB3Zngud0JpdHNQZXJTYW1wbGUsCisgICAgICB3ZngubkJsb2NrQWxpZ24sIHdmeC5uQXZnQnl0ZXNQZXJTZWMsIGRzb3VuZHNpbmstPmJ1ZmZlcl9zaXplKTsKKworICAvKiBjcmVhdGUgYSBzZWNvbmRhcnkgZGlyZWN0c291bmQgYnVmZmVyICovCisgIG1lbXNldCAoJmRlc2NTZWNvbmRhcnksIDAsIHNpemVvZiAoRFNCVUZGRVJERVNDKSk7CisgIGRlc2NTZWNvbmRhcnkuZHdTaXplID0gc2l6ZW9mIChEU0JVRkZFUkRFU0MpOworICBkZXNjU2Vjb25kYXJ5LmR3RmxhZ3MgPSBEU0JDQVBTX0dFVENVUlJFTlRQT1NJVElPTjIgfCBEU0JDQVBTX0dMT0JBTEZPQ1VTOworICBpZiAoIWdzdF9kaXJlY3Rzb3VuZF9zaW5rX2lzX3NwZGlmX2Zvcm1hdCAoc3BlYykpCisgICAgZGVzY1NlY29uZGFyeS5kd0ZsYWdzIHw9IERTQkNBUFNfQ1RSTFZPTFVNRTsKKworICBkZXNjU2Vjb25kYXJ5LmR3QnVmZmVyQnl0ZXMgPSBkc291bmRzaW5rLT5idWZmZXJfc2l6ZTsKKyAgZGVzY1NlY29uZGFyeS5scHdmeEZvcm1hdCA9IChXQVZFRk9STUFURVggKikgJiB3Zng7CisKKyAgaFJlcyA9IElEaXJlY3RTb3VuZF9DcmVhdGVTb3VuZEJ1ZmZlciAoZHNvdW5kc2luay0+cERTLCAmZGVzY1NlY29uZGFyeSwKKyAgICAgICZkc291bmRzaW5rLT5wRFNCU2Vjb25kYXJ5LCBOVUxMKTsKKyAgaWYgKEZBSUxFRCAoaFJlcykpIHsKKyAgICBnY2hhciAqZXJyb3JfdGV4dCA9IGdzdF9ocmVzX3RvX3N0cmluZyAoaFJlcyk7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRzb3VuZHNpbmssIFJFU09VUkNFLCBPUEVOX1JFQUQsCisgICAgICAgICgiSURpcmVjdFNvdW5kX0NyZWF0ZVNvdW5kQnVmZmVyOiAlcyIsIGVycm9yX3RleHQpLCAoTlVMTCkpOworICAgIGdfZnJlZSAoZXJyb3JfdGV4dCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgZ3N0X2RpcmVjdHNvdW5kX3Npbmtfc2V0X3ZvbHVtZSAoZHNvdW5kc2luaywKKyAgICAgIGdzdF9kaXJlY3Rzb3VuZF9zaW5rX2dldF92b2x1bWUgKGRzb3VuZHNpbmspLCBGQUxTRSk7CisgIGdzdF9kaXJlY3Rzb3VuZF9zaW5rX3NldF9tdXRlIChkc291bmRzaW5rLCBkc291bmRzaW5rLT5tdXRlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZGlyZWN0c291bmRfc2lua191bnByZXBhcmUgKEdzdEF1ZGlvU2luayAqIGFzaW5rKQoreworICBHc3REaXJlY3RTb3VuZFNpbmsgKmRzb3VuZHNpbms7CisKKyAgZHNvdW5kc2luayA9IEdTVF9ESVJFQ1RTT1VORF9TSU5LIChhc2luayk7CisKKyAgLyogcmVsZWFzZSBzZWNvbmRhcnkgRGlyZWN0U291bmQgYnVmZmVyICovCisgIGlmIChkc291bmRzaW5rLT5wRFNCU2Vjb25kYXJ5KSB7CisgICAgSURpcmVjdFNvdW5kQnVmZmVyX1JlbGVhc2UgKGRzb3VuZHNpbmstPnBEU0JTZWNvbmRhcnkpOworICAgIGRzb3VuZHNpbmstPnBEU0JTZWNvbmRhcnkgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RpcmVjdHNvdW5kX3NpbmtfY2xvc2UgKEdzdEF1ZGlvU2luayAqIGFzaW5rKQoreworICBHc3REaXJlY3RTb3VuZFNpbmsgKmRzb3VuZHNpbmsgPSBOVUxMOworCisgIGRzb3VuZHNpbmsgPSBHU1RfRElSRUNUU09VTkRfU0lOSyAoYXNpbmspOworCisgIC8qIHJlbGVhc2UgRGlyZWN0U291bmQgb2JqZWN0ICovCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChkc291bmRzaW5rLT5wRFMgIT0gTlVMTCwgRkFMU0UpOworICBJRGlyZWN0U291bmRfUmVsZWFzZSAoZHNvdW5kc2luay0+cERTKTsKKyAgZHNvdW5kc2luay0+cERTID0gTlVMTDsKKworICBnc3RfY2Fwc19yZXBsYWNlICgmZHNvdW5kc2luay0+Y2FjaGVkX2NhcHMsIE5VTEwpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2ludAorZ3N0X2RpcmVjdHNvdW5kX3Npbmtfd3JpdGUgKEdzdEF1ZGlvU2luayAqIGFzaW5rLCBncG9pbnRlciBkYXRhLCBndWludCBsZW5ndGgpCit7CisgIEdzdERpcmVjdFNvdW5kU2luayAqZHNvdW5kc2luazsKKyAgRFdPUkQgZHdTdGF0dXMgPSAwOworICBIUkVTVUxUIGhSZXMsIGhSZXMyOworICBMUFZPSUQgcExvY2tlZEJ1ZmZlcjEgPSBOVUxMLCBwTG9ja2VkQnVmZmVyMiA9IE5VTEw7CisgIERXT1JEIGR3U2l6ZUJ1ZmZlcjEsIGR3U2l6ZUJ1ZmZlcjI7CisgIERXT1JEIGR3Q3VycmVudFBsYXlDdXJzb3I7CisKKyAgZHNvdW5kc2luayA9IEdTVF9ESVJFQ1RTT1VORF9TSU5LIChhc2luayk7CisKKyAgR1NUX0RTT1VORF9MT0NLIChkc291bmRzaW5rKTsKKworICAvKiBnZXQgY3VycmVudCBidWZmZXIgc3RhdHVzICovCisgIGhSZXMgPSBJRGlyZWN0U291bmRCdWZmZXJfR2V0U3RhdHVzIChkc291bmRzaW5rLT5wRFNCU2Vjb25kYXJ5LCAmZHdTdGF0dXMpOworCisgIC8qIGdldCBjdXJyZW50IHBsYXkgY3Vyc29yIHBvc2l0aW9uICovCisgIGhSZXMyID0gSURpcmVjdFNvdW5kQnVmZmVyX0dldEN1cnJlbnRQb3NpdGlvbiAoZHNvdW5kc2luay0+cERTQlNlY29uZGFyeSwKKyAgICAgICZkd0N1cnJlbnRQbGF5Q3Vyc29yLCBOVUxMKTsKKworICBpZiAoU1VDQ0VFREVEIChoUmVzKSAmJiBTVUNDRUVERUQgKGhSZXMyKSAmJiAoZHdTdGF0dXMgJiBEU0JTVEFUVVNfUExBWUlORykpIHsKKyAgICBEV09SRCBkd0ZyZWVCdWZmZXJTaXplID0gMDsKKyAgICBHc3RDbG9ja1RpbWUgc2xlZXBfdGltZV9tcyA9IDAsIHNsZWVwX3VudGlsOworICAgIEdzdENsb2NrSUQgY2xvY2tfaWQ7CisKKyAgY2FsY3VsYXRlX2ZyZWVzaXplOgorICAgIC8qIENhbGN1bGF0ZSB0aGUgZnJlZSBzcGFjZSBpbiB0aGUgY2lyY3VsYXIgYnVmZmVyICovCisgICAgaWYgKGR3Q3VycmVudFBsYXlDdXJzb3IgPCBkc291bmRzaW5rLT5jdXJyZW50X2NpcmN1bGFyX29mZnNldCkKKyAgICAgIGR3RnJlZUJ1ZmZlclNpemUgPQorICAgICAgICAgIGRzb3VuZHNpbmstPmJ1ZmZlcl9zaXplIC0gKGRzb3VuZHNpbmstPmN1cnJlbnRfY2lyY3VsYXJfb2Zmc2V0IC0KKyAgICAgICAgICBkd0N1cnJlbnRQbGF5Q3Vyc29yKTsKKyAgICBlbHNlCisgICAgICBkd0ZyZWVCdWZmZXJTaXplID0KKyAgICAgICAgICBkd0N1cnJlbnRQbGF5Q3Vyc29yIC0gZHNvdW5kc2luay0+Y3VycmVudF9jaXJjdWxhcl9vZmZzZXQ7CisKKyAgICAvKiBOb3QgZW5vdWdoIGZyZWUgc3BhY2UsIHdhaXQgZm9yIHNvbWUgc2FtcGxlcyB0byBiZSBwbGF5ZWQgb3V0LiBXZSBjb3VsZAorICAgICAqIHdyaXRlIG91dCBwYXJ0aWFsIGRhdGEsIGJ1dCB0aGF0IHdpbGwgcmVzdWx0IGluIGEgdGlnaHQgbG9vcCBpbiB0aGUKKyAgICAgKiBhdWRpb3JpbmdidWZmZXIgd3JpdGUgdGhyZWFkLCBhbmQgbGVhZCB0byBoaWdoIENQVSB1c2FnZS4gKi8KKyAgICBpZiAobGVuZ3RoID4gZHdGcmVlQnVmZmVyU2l6ZSkgeworICAgICAgZ2ludCByYXRlID0gR1NUX0FVRElPX0JBU0VfU0lOSyAoYXNpbmspLT5yaW5nYnVmZmVyLT5zcGVjLmluZm8ucmF0ZTsKKyAgICAgIC8qIFdhaXQgZm9yIGEgdGltZSBwcm9wb3J0aW9uYWwgdG8gdGhlIHNwYWNlIG5lZWRlZC4gSW4gcmVhbGl0eSwgdGhlCisgICAgICAgKiBkaXJlY3Rzb3VuZCBzaW5rJ3MgcG9zaXRpb24gZG9lcyBub3QgdXBkYXRlIGZyZXF1ZW50bHkgZW5vdWdoLCBzbyB3ZQorICAgICAgICogd2lsbCBlbmQgdXAgd2FpdGluZyBmb3IgbXVjaCBsb25nZXIuIE5vdGUgdGhhdCBTbGVlcCgpIGhhcyBtaWxsaXNlY29uZAorICAgICAgICogcmVzb2x1dGlvbiBhdCBiZXN0LiAqLworICAgICAgc2xlZXBfdGltZV9tcyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKChsZW5ndGggLSBkd0ZyZWVCdWZmZXJTaXplKSwKKyAgICAgICAgICAxMDAwLCBkc291bmRzaW5rLT5ieXRlc19wZXJfc2FtcGxlICogcmF0ZSk7CisgICAgICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgcnVuIGluIGEgdGlnaHQgbG9vcCB1bm5lY2Vzc2FyaWx5ICovCisgICAgICBzbGVlcF90aW1lX21zID0gTUFYIChzbGVlcF90aW1lX21zLCAxMCk7CisgICAgICBzbGVlcF91bnRpbCA9IGdzdF9jbG9ja19nZXRfdGltZSAoZHNvdW5kc2luay0+c3lzdGVtX2Nsb2NrKSArCisgICAgICAgICAgc2xlZXBfdGltZV9tcyAqIEdTVF9NU0VDT05EOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkc291bmRzaW5rLAorICAgICAgICAgICJsZW5ndGg6ICV1LCBGcmVlQnVmU2l6OiAlbGQsIHNsZWVwX3RpbWVfbXM6ICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICAgICAiLCBicHM6ICVpLCByYXRlOiAlaSIsIGxlbmd0aCwgZHdGcmVlQnVmZmVyU2l6ZSwgc2xlZXBfdGltZV9tcywKKyAgICAgICAgICBkc291bmRzaW5rLT5ieXRlc19wZXJfc2FtcGxlLCByYXRlKTsKKworICAgICAgaWYgKEdfVU5MSUtFTFkgKGRzb3VuZHNpbmstPndyaXRlX3dhaXRfY2xvY2tfaWQgPT0gTlVMTCB8fAorICAgICAgICAgICAgICBnc3RfY2xvY2tfc2luZ2xlX3Nob3RfaWRfcmVpbml0IChkc291bmRzaW5rLT5zeXN0ZW1fY2xvY2ssCisgICAgICAgICAgICAgICAgICBkc291bmRzaW5rLT53cml0ZV93YWl0X2Nsb2NrX2lkLCBzbGVlcF91bnRpbCkgPT0gRkFMU0UpKSB7CisKKyAgICAgICAgaWYgKGRzb3VuZHNpbmstPndyaXRlX3dhaXRfY2xvY2tfaWQgIT0gTlVMTCkgeworICAgICAgICAgIGdzdF9jbG9ja19pZF91bnJlZiAoZHNvdW5kc2luay0+d3JpdGVfd2FpdF9jbG9ja19pZCk7CisgICAgICAgIH0KKworICAgICAgICBkc291bmRzaW5rLT53cml0ZV93YWl0X2Nsb2NrX2lkID0KKyAgICAgICAgICAgIGdzdF9jbG9ja19uZXdfc2luZ2xlX3Nob3RfaWQgKGRzb3VuZHNpbmstPnN5c3RlbV9jbG9jaywKKyAgICAgICAgICAgIHNsZWVwX3VudGlsKTsKKyAgICAgIH0KKworICAgICAgY2xvY2tfaWQgPSBkc291bmRzaW5rLT53cml0ZV93YWl0X2Nsb2NrX2lkOworICAgICAgZHNvdW5kc2luay0+cmVzZXRfd2hpbGVfc2xlZXBpbmcgPSBGQUxTRTsKKworICAgICAgR1NUX0RTT1VORF9VTkxPQ0sgKGRzb3VuZHNpbmspOworCisgICAgICAvKiBkb24ndCBib3RoZXIgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIGFzIHdlJ2xsIGRldGVjdCByZXNldCBzZXBhcmF0ZWx5LAorICAgICAgICAgYXMgcmVzZXQgY291bGQgaGFwcGVuIGJldHdlZW4gd2hlbiB0aGlzIHJldHVybnMgYW5kIHdlIG9idGFpbiB0aGUgbG9jaworICAgICAgICAgYWdhaW4gLS0gc28gd2UgY2FuJ3QgdXNlIFVOU0NIRURVTEVEIGhlcmUgKi8KKyAgICAgIGdzdF9jbG9ja19pZF93YWl0IChjbG9ja19pZCwgTlVMTCk7CisKKyAgICAgIEdTVF9EU09VTkRfTE9DSyAoZHNvdW5kc2luayk7CisKKyAgICAgIC8qIGlmIGEgcmVzZXQgb2NjdXJzLCBleGl0IG5vdyAqLworICAgICAgaWYgKGRzb3VuZHNpbmstPnJlc2V0X3doaWxlX3NsZWVwaW5nID09IFRSVUUpIHsKKyAgICAgICAgR1NUX0RTT1VORF9VTkxPQ0sgKGRzb3VuZHNpbmspOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisKKyAgICAgIC8qIE1heSB3ZSBzZW5kIG91dD8gKi8KKyAgICAgIGhSZXMgPSBJRGlyZWN0U291bmRCdWZmZXJfR2V0Q3VycmVudFBvc2l0aW9uIChkc291bmRzaW5rLT5wRFNCU2Vjb25kYXJ5LAorICAgICAgICAgICZkd0N1cnJlbnRQbGF5Q3Vyc29yLCBOVUxMKTsKKyAgICAgIGhSZXMyID0KKyAgICAgICAgICBJRGlyZWN0U291bmRCdWZmZXJfR2V0U3RhdHVzIChkc291bmRzaW5rLT5wRFNCU2Vjb25kYXJ5LCAmZHdTdGF0dXMpOworICAgICAgaWYgKFNVQ0NFRURFRCAoaFJlcykgJiYgU1VDQ0VFREVEIChoUmVzMikKKyAgICAgICAgICAmJiAoZHdTdGF0dXMgJiBEU0JTVEFUVVNfUExBWUlORykpCisgICAgICAgIGdvdG8gY2FsY3VsYXRlX2ZyZWVzaXplOworICAgICAgZWxzZSB7CisgICAgICAgIGdjaGFyICplcnIxLCAqZXJyMjsKKworICAgICAgICBkc291bmRzaW5rLT5maXJzdF9idWZmZXJfYWZ0ZXJfcmVzZXQgPSBGQUxTRTsKKyAgICAgICAgR1NUX0RTT1VORF9VTkxPQ0sgKGRzb3VuZHNpbmspOworCisgICAgICAgIGVycjEgPSBnc3RfaHJlc190b19zdHJpbmcgKGhSZXMpOworICAgICAgICBlcnIyID0gZ3N0X2hyZXNfdG9fc3RyaW5nIChoUmVzMik7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkc291bmRzaW5rLCBSRVNPVVJDRSwgT1BFTl9XUklURSwKKyAgICAgICAgICAgICgiSURpcmVjdFNvdW5kQnVmZmVyX0dldFN0YXR1cyAlcywgIgorICAgICAgICAgICAgICAgICJJRGlyZWN0U291bmRCdWZmZXJfR2V0Q3VycmVudFBvc2l0aW9uOiAlcywgZHdTdGF0dXM6ICVsdSIsCisgICAgICAgICAgICAgICAgZXJyMiwgZXJyMSwgZHdTdGF0dXMpLCAoTlVMTCkpOworICAgICAgICBnX2ZyZWUgKGVycjEpOworICAgICAgICBnX2ZyZWUgKGVycjIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGR3U3RhdHVzICYgRFNCU1RBVFVTX0JVRkZFUkxPU1QpIHsKKyAgICBoUmVzID0gSURpcmVjdFNvdW5kQnVmZmVyX1Jlc3RvcmUgKGRzb3VuZHNpbmstPnBEU0JTZWNvbmRhcnkpOyAgICAgIC8qbmVlZCBhIGxvb3Agd2FpdGluZyB0aGUgYnVmZmVyIGlzIHJlc3RvcmVkPz8gKi8KKyAgICBkc291bmRzaW5rLT5jdXJyZW50X2NpcmN1bGFyX29mZnNldCA9IDA7CisgIH0KKworICAvKiBMb2NrIGEgYnVmZmVyIG9mIGxlbmd0aCBAbGVuZ3RoIGZvciB3cml0aW5nICovCisgIGhSZXMgPSBJRGlyZWN0U291bmRCdWZmZXJfTG9jayAoZHNvdW5kc2luay0+cERTQlNlY29uZGFyeSwKKyAgICAgIGRzb3VuZHNpbmstPmN1cnJlbnRfY2lyY3VsYXJfb2Zmc2V0LCBsZW5ndGgsICZwTG9ja2VkQnVmZmVyMSwKKyAgICAgICZkd1NpemVCdWZmZXIxLCAmcExvY2tlZEJ1ZmZlcjIsICZkd1NpemVCdWZmZXIyLCAwTCk7CisKKyAgaWYgKFNVQ0NFRURFRCAoaFJlcykpIHsKKyAgICAvLyBXcml0ZSB0byBwb2ludGVycyB3aXRob3V0IHJlb3JkZXJpbmcuCisgICAgbWVtY3B5IChwTG9ja2VkQnVmZmVyMSwgZGF0YSwgZHdTaXplQnVmZmVyMSk7CisgICAgaWYgKHBMb2NrZWRCdWZmZXIyICE9IE5VTEwpCisgICAgICBtZW1jcHkgKHBMb2NrZWRCdWZmZXIyLCAoTFBCWVRFKSBkYXRhICsgZHdTaXplQnVmZmVyMSwgZHdTaXplQnVmZmVyMik7CisKKyAgICBoUmVzID0gSURpcmVjdFNvdW5kQnVmZmVyX1VubG9jayAoZHNvdW5kc2luay0+cERTQlNlY29uZGFyeSwgcExvY2tlZEJ1ZmZlcjEsCisgICAgICAgIGR3U2l6ZUJ1ZmZlcjEsIHBMb2NrZWRCdWZmZXIyLCBkd1NpemVCdWZmZXIyKTsKKworICAgIC8vIFVwZGF0ZSB3aGVyZSB0aGUgYnVmZmVyIHdpbGwgbG9jayAoZm9yIG5leHQgdGltZSkKKyAgICBkc291bmRzaW5rLT5jdXJyZW50X2NpcmN1bGFyX29mZnNldCArPSBkd1NpemVCdWZmZXIxICsgZHdTaXplQnVmZmVyMjsKKyAgICBkc291bmRzaW5rLT5jdXJyZW50X2NpcmN1bGFyX29mZnNldCAlPSBkc291bmRzaW5rLT5idWZmZXJfc2l6ZTsgICAgIC8qIENpcmN1bGFyIGJ1ZmZlciAqLworICB9CisKKyAgLyogaWYgdGhlIGJ1ZmZlciB3YXMgbm90IGluIHBsYXlpbmcgc3RhdGUgeWV0LCBjYWxsIHBsYXkgb24gdGhlIGJ1ZmZlciAKKyAgICAgZXhjZXB0IGlmIHRoaXMgYnVmZmVyIGlzIHRoZSBmaXN0IGFmdGVyIGEgcmVzZXQgKGJhc2UgY2xhc3MgY2FsbCByZXNldCBhbmQgd3JpdGUgYSBidWZmZXIgd2hlbiBzZXR0aW5nIHRoZSBzaW5rIHRvIHBhdXNlKSAqLworICBpZiAoIShkd1N0YXR1cyAmIERTQlNUQVRVU19QTEFZSU5HKSAmJgorICAgICAgZHNvdW5kc2luay0+Zmlyc3RfYnVmZmVyX2FmdGVyX3Jlc2V0ID09IEZBTFNFKSB7CisgICAgaFJlcyA9IElEaXJlY3RTb3VuZEJ1ZmZlcl9QbGF5IChkc291bmRzaW5rLT5wRFNCU2Vjb25kYXJ5LCAwLCAwLAorICAgICAgICBEU0JQTEFZX0xPT1BJTkcpOworICB9CisKKyAgZHNvdW5kc2luay0+Zmlyc3RfYnVmZmVyX2FmdGVyX3Jlc2V0ID0gRkFMU0U7CisKKyAgR1NUX0RTT1VORF9VTkxPQ0sgKGRzb3VuZHNpbmspOworCisgIHJldHVybiBsZW5ndGg7Cit9CisKK3N0YXRpYyBndWludAorZ3N0X2RpcmVjdHNvdW5kX3NpbmtfZGVsYXkgKEdzdEF1ZGlvU2luayAqIGFzaW5rKQoreworICBHc3REaXJlY3RTb3VuZFNpbmsgKmRzb3VuZHNpbms7CisgIEhSRVNVTFQgaFJlczsKKyAgRFdPUkQgZHdDdXJyZW50UGxheUN1cnNvcjsKKyAgRFdPUkQgZHdCeXRlc0luUXVldWUgPSAwOworICBnaW50IG5OYlNhbXBsZXNJblF1ZXVlID0gMDsKKyAgRFdPUkQgZHdTdGF0dXM7CisKKyAgZHNvdW5kc2luayA9IEdTVF9ESVJFQ1RTT1VORF9TSU5LIChhc2luayk7CisKKyAgLyogZ2V0IGN1cnJlbnQgYnVmZmVyIHN0YXR1cyAqLworICBoUmVzID0gSURpcmVjdFNvdW5kQnVmZmVyX0dldFN0YXR1cyAoZHNvdW5kc2luay0+cERTQlNlY29uZGFyeSwgJmR3U3RhdHVzKTsKKworICBpZiAoU1VDQ0VFREVEIChoUmVzKSAmJiAoZHdTdGF0dXMgJiBEU0JTVEFUVVNfUExBWUlORykpIHsKKyAgICAvKmV2YWx1YXRlIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpbiBxdWV1ZSBpbiB0aGUgY2lyY3VsYXIgYnVmZmVyICovCisgICAgaFJlcyA9IElEaXJlY3RTb3VuZEJ1ZmZlcl9HZXRDdXJyZW50UG9zaXRpb24gKGRzb3VuZHNpbmstPnBEU0JTZWNvbmRhcnksCisgICAgICAgICZkd0N1cnJlbnRQbGF5Q3Vyc29yLCBOVUxMKTsKKworICAgIGlmIChoUmVzID09IFNfT0spIHsKKyAgICAgIGlmIChkd0N1cnJlbnRQbGF5Q3Vyc29yIDwgZHNvdW5kc2luay0+Y3VycmVudF9jaXJjdWxhcl9vZmZzZXQpCisgICAgICAgIGR3Qnl0ZXNJblF1ZXVlID0KKyAgICAgICAgICAgIGRzb3VuZHNpbmstPmN1cnJlbnRfY2lyY3VsYXJfb2Zmc2V0IC0gZHdDdXJyZW50UGxheUN1cnNvcjsKKyAgICAgIGVsc2UKKyAgICAgICAgZHdCeXRlc0luUXVldWUgPQorICAgICAgICAgICAgZHNvdW5kc2luay0+Y3VycmVudF9jaXJjdWxhcl9vZmZzZXQgKyAoZHNvdW5kc2luay0+YnVmZmVyX3NpemUgLQorICAgICAgICAgICAgZHdDdXJyZW50UGxheUN1cnNvcik7CisKKyAgICAgIG5OYlNhbXBsZXNJblF1ZXVlID0gZHdCeXRlc0luUXVldWUgLyBkc291bmRzaW5rLT5ieXRlc19wZXJfc2FtcGxlOworICAgIH0KKyAgfQorCisgIHJldHVybiBuTmJTYW1wbGVzSW5RdWV1ZTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kaXJlY3Rzb3VuZF9zaW5rX3Jlc2V0IChHc3RBdWRpb1NpbmsgKiBhc2luaykKK3sKKyAgR3N0RGlyZWN0U291bmRTaW5rICpkc291bmRzaW5rOworICBMUFZPSUQgcExvY2tlZEJ1ZmZlciA9IE5VTEw7CisgIERXT1JEIGR3U2l6ZUJ1ZmZlciA9IDA7CisKKyAgZHNvdW5kc2luayA9IEdTVF9ESVJFQ1RTT1VORF9TSU5LIChhc2luayk7CisKKyAgR1NUX0RTT1VORF9MT0NLIChkc291bmRzaW5rKTsKKworICBpZiAoZHNvdW5kc2luay0+cERTQlNlY29uZGFyeSkgeworICAgIC8qc3RvcCBwbGF5aW5nICovCisgICAgSFJFU1VMVCBoUmVzID0gSURpcmVjdFNvdW5kQnVmZmVyX1N0b3AgKGRzb3VuZHNpbmstPnBEU0JTZWNvbmRhcnkpOworCisgICAgLypyZXNldCBwb3NpdGlvbiAqLworICAgIGhSZXMgPSBJRGlyZWN0U291bmRCdWZmZXJfU2V0Q3VycmVudFBvc2l0aW9uIChkc291bmRzaW5rLT5wRFNCU2Vjb25kYXJ5LCAwKTsKKyAgICBkc291bmRzaW5rLT5jdXJyZW50X2NpcmN1bGFyX29mZnNldCA9IDA7CisKKyAgICAvKnJlc2V0IHRoZSBidWZmZXIgKi8KKyAgICBoUmVzID0gSURpcmVjdFNvdW5kQnVmZmVyX0xvY2sgKGRzb3VuZHNpbmstPnBEU0JTZWNvbmRhcnksCisgICAgICAgIDAsIGRzb3VuZHNpbmstPmJ1ZmZlcl9zaXplLAorICAgICAgICAmcExvY2tlZEJ1ZmZlciwgJmR3U2l6ZUJ1ZmZlciwgTlVMTCwgTlVMTCwgMEwpOworCisgICAgaWYgKFNVQ0NFRURFRCAoaFJlcykpIHsKKyAgICAgIG1lbXNldCAocExvY2tlZEJ1ZmZlciwgMCwgZHdTaXplQnVmZmVyKTsKKworICAgICAgaFJlcyA9CisgICAgICAgICAgSURpcmVjdFNvdW5kQnVmZmVyX1VubG9jayAoZHNvdW5kc2luay0+cERTQlNlY29uZGFyeSwgcExvY2tlZEJ1ZmZlciwKKyAgICAgICAgICBkd1NpemVCdWZmZXIsIE5VTEwsIDApOworICAgIH0KKyAgfQorCisgIGRzb3VuZHNpbmstPnJlc2V0X3doaWxlX3NsZWVwaW5nID0gVFJVRTsKKyAgZHNvdW5kc2luay0+Zmlyc3RfYnVmZmVyX2FmdGVyX3Jlc2V0ID0gVFJVRTsKKyAgaWYgKGRzb3VuZHNpbmstPndyaXRlX3dhaXRfY2xvY2tfaWQgIT0gTlVMTCkgeworICAgIGdzdF9jbG9ja19pZF91bnNjaGVkdWxlIChkc291bmRzaW5rLT53cml0ZV93YWl0X2Nsb2NrX2lkKTsKKyAgfQorCisgIEdTVF9EU09VTkRfVU5MT0NLIChkc291bmRzaW5rKTsKK30KKworLyoKKyAqIGdzdF9kaXJlY3Rzb3VuZF9wcm9iZV9zdXBwb3J0ZWRfZm9ybWF0czoKKyAqCisgKiBUYWtlcyB0aGUgdGVtcGxhdGUgY2FwcyBhbmQgcmV0dXJucyB0aGUgc3Vic2V0IHdoaWNoIGlzIGFjdHVhbGx5CisgKiBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UuCisgKgorICovCisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9kaXJlY3Rzb3VuZF9wcm9iZV9zdXBwb3J0ZWRfZm9ybWF0cyAoR3N0RGlyZWN0U291bmRTaW5rICogZHNvdW5kc2luaywKKyAgICBjb25zdCBHc3RDYXBzICogdGVtcGxhdGVfY2FwcykKK3sKKyAgSFJFU1VMVCBoUmVzOworICBEU0JVRkZFUkRFU0MgZGVzY1NlY29uZGFyeTsKKyAgV0FWRUZPUk1BVEVYIHdmeDsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0Q2FwcyAqdG1wLCAqdG1wMjsKKyAgTFBESVJFQ1RTT1VOREJVRkZFUiB0bXBCdWZmZXI7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2NvcHkgKHRlbXBsYXRlX2NhcHMpOworCisgIC8qCisgICAqIENoZWNrIGF2YWlsYWJpbGl0eSBvZiBkaWdpdGFsIG91dHB1dCBieSB0cnlpbmcgdG8gY3JlYXRlIGFuIFNQRElGIGJ1ZmZlcgorICAgKi8KKworI2lmZGVmIFdBVkVfRk9STUFUX0RPTEJZX0FDM19TUERJRgorICAvKiBmaWxsIHRoZSBXQVZFRk9STUFURVggc3RydWN0dXJlIHdpdGggc29tZSBzdGFuZGFyZCBBQzMgb3ZlciBTUERJRiBwYXJhbXMgKi8KKyAgbWVtc2V0ICgmd2Z4LCAwLCBzaXplb2YgKHdmeCkpOworICB3ZnguY2JTaXplID0gMDsKKyAgd2Z4LndGb3JtYXRUYWcgPSBXQVZFX0ZPUk1BVF9ET0xCWV9BQzNfU1BESUY7CisgIHdmeC5uQ2hhbm5lbHMgPSAyOworICB3ZngublNhbXBsZXNQZXJTZWMgPSA0ODAwMDsKKyAgd2Z4LndCaXRzUGVyU2FtcGxlID0gMTY7CisgIHdmeC5uQmxvY2tBbGlnbiA9IDQ7CisgIHdmeC5uQXZnQnl0ZXNQZXJTZWMgPSB3ZngublNhbXBsZXNQZXJTZWMgKiB3ZngubkJsb2NrQWxpZ247CisKKyAgLy8gY3JlYXRlIGEgc2Vjb25kYXJ5IGRpcmVjdHNvdW5kIGJ1ZmZlcgorICBtZW1zZXQgKCZkZXNjU2Vjb25kYXJ5LCAwLCBzaXplb2YgKERTQlVGRkVSREVTQykpOworICBkZXNjU2Vjb25kYXJ5LmR3U2l6ZSA9IHNpemVvZiAoRFNCVUZGRVJERVNDKTsKKyAgZGVzY1NlY29uZGFyeS5kd0ZsYWdzID0gRFNCQ0FQU19HRVRDVVJSRU5UUE9TSVRJT04yIHwgRFNCQ0FQU19HTE9CQUxGT0NVUzsKKyAgZGVzY1NlY29uZGFyeS5kd0J1ZmZlckJ5dGVzID0gNjE0NDsKKyAgZGVzY1NlY29uZGFyeS5scHdmeEZvcm1hdCA9ICZ3Zng7CisKKyAgaFJlcyA9IElEaXJlY3RTb3VuZF9DcmVhdGVTb3VuZEJ1ZmZlciAoZHNvdW5kc2luay0+cERTLCAmZGVzY1NlY29uZGFyeSwKKyAgICAgICZ0bXBCdWZmZXIsIE5VTEwpOworICBpZiAoRkFJTEVEIChoUmVzKSkgeworICAgIGdjaGFyICplcnJvcl90ZXh0ID0gZ3N0X2hyZXNfdG9fc3RyaW5nIChoUmVzKTsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGRzb3VuZHNpbmssICJBQzMgcGFzc3Rocm91Z2ggbm90IHN1cHBvcnRlZCAiCisgICAgICAgICIoSURpcmVjdFNvdW5kX0NyZWF0ZVNvdW5kQnVmZmVyIHJldHVybmVkOiAlcylcbiIsIGVycm9yX3RleHQpOworICAgIGdfZnJlZSAoZXJyb3JfdGV4dCk7CisgICAgdG1wID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtYWMzIik7CisgICAgdG1wMiA9IGdzdF9jYXBzX3N1YnRyYWN0IChjYXBzLCB0bXApOworICAgIGdzdF9jYXBzX3VucmVmICh0bXApOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICBjYXBzID0gdG1wMjsKKyAgICB0bXAgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8veC1kdHMiKTsKKyAgICB0bXAyID0gZ3N0X2NhcHNfc3VidHJhY3QgKGNhcHMsIHRtcCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHRtcCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIGNhcHMgPSB0bXAyOworICB9IGVsc2UgeworICAgIEdTVF9JTkZPX09CSkVDVCAoZHNvdW5kc2luaywgIkFDMyBwYXNzdGhyb3VnaCBzdXBwb3J0ZWQiKTsKKyAgICBoUmVzID0gSURpcmVjdFNvdW5kQnVmZmVyX1JlbGVhc2UgKHRtcEJ1ZmZlcik7CisgICAgaWYgKEZBSUxFRCAoaFJlcykpIHsKKyAgICAgIGdjaGFyICplcnJvcl90ZXh0ID0gZ3N0X2hyZXNfdG9fc3RyaW5nIChoUmVzKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRzb3VuZHNpbmssCisgICAgICAgICAgIihJRGlyZWN0U291bmRCdWZmZXJfUmVsZWFzZSByZXR1cm5lZDogJXMpXG4iLCBlcnJvcl90ZXh0KTsKKyAgICAgIGdfZnJlZSAoZXJyb3JfdGV4dCk7CisgICAgfQorICB9CisjZWxzZQorICB0bXAgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8veC1hYzMiKTsKKyAgdG1wMiA9IGdzdF9jYXBzX3N1YnRyYWN0IChjYXBzLCB0bXApOworICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBjYXBzID0gdG1wMjsKKyAgdG1wID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtZHRzIik7CisgIHRtcDIgPSBnc3RfY2Fwc19zdWJ0cmFjdCAoY2FwcywgdG1wKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHRtcCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgY2FwcyA9IHRtcDI7CisjZW5kaWYKKworICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfZGlyZWN0c291bmRfc2lua19wYXlsb2FkIChHc3RBdWRpb0Jhc2VTaW5rICogc2luaywgR3N0QnVmZmVyICogYnVmKQoreworICBpZiAoZ3N0X2RpcmVjdHNvdW5kX3NpbmtfaXNfc3BkaWZfZm9ybWF0ICgmc2luay0+cmluZ2J1ZmZlci0+c3BlYykpIHsKKyAgICBnaW50IGZyYW1lc2l6ZSA9IGdzdF9hdWRpb19pZWM2MTkzN19mcmFtZV9zaXplICgmc2luay0+cmluZ2J1ZmZlci0+c3BlYyk7CisgICAgR3N0QnVmZmVyICpvdXQ7CisgICAgR3N0TWFwSW5mbyBpbmZvYnVmLCBpbmZvb3V0OworICAgIGdib29sZWFuIHN1Y2Nlc3M7CisKKyAgICBpZiAoZnJhbWVzaXplIDw9IDApCisgICAgICByZXR1cm4gTlVMTDsKKworICAgIG91dCA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoZnJhbWVzaXplKTsKKworICAgIGlmICghZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJmluZm9idWYsIEdTVF9NQVBfUkVBRFdSSVRFKSkgeworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIWdzdF9idWZmZXJfbWFwIChvdXQsICZpbmZvb3V0LCBHU1RfTUFQX1JFQURXUklURSkpIHsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJmluZm9idWYpOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdWNjZXNzID0gZ3N0X2F1ZGlvX2llYzYxOTM3X3BheWxvYWQgKGluZm9idWYuZGF0YSwgaW5mb2J1Zi5zaXplLAorICAgICAgICBpbmZvb3V0LmRhdGEsIGluZm9vdXQuc2l6ZSwgJnNpbmstPnJpbmdidWZmZXItPnNwZWMsIEdfQllURV9PUkRFUik7CisgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChvdXQsICZpbmZvb3V0KTsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJmluZm9idWYpOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGdzdF9idWZmZXJfY29weV9pbnRvIChvdXQsIGJ1ZiwgR1NUX0JVRkZFUl9DT1BZX0FMTCwgMCwgLTEpOworICAgIC8qIEZpeCBlbmRpYW5uZXNzICovCisgICAgX3N3YWIgKChnY2hhciAqKSBpbmZvb3V0LmRhdGEsIChnY2hhciAqKSBpbmZvb3V0LmRhdGEsIGluZm9idWYuc2l6ZSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0LCAmaW5mb291dCk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmaW5mb2J1Zik7CisgICAgcmV0dXJuIG91dDsKKyAgfSBlbHNlCisgICAgcmV0dXJuIGdzdF9idWZmZXJfcmVmIChidWYpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RpcmVjdHNvdW5kX3Npbmtfc2V0X3ZvbHVtZSAoR3N0RGlyZWN0U291bmRTaW5rICogZHNvdW5kc2luaywKKyAgICBnZG91YmxlIGR2b2x1bWUsIGdib29sZWFuIHN0b3JlKQoreworICBnbG9uZyB2b2x1bWU7CisKKyAgdm9sdW1lID0gZHZvbHVtZSAqIDEwMDsKKyAgaWYgKHN0b3JlKQorICAgIGRzb3VuZHNpbmstPnZvbHVtZSA9IHZvbHVtZTsKKworICBpZiAoZHNvdW5kc2luay0+cERTQlNlY29uZGFyeSkgeworICAgIC8qIERpcmVjdFNvdW5kIGNvbnRyb2xzIHZvbHVtZSB1c2luZyB1bml0cyBvZiAxMDB0aCBvZiBhIGRlY2liZWwsCisgICAgICogcmFuZ2luZyBmcm9tIC0xMDAwMCB0byAwLiBXZSB1c2UgYSBsaW5lYXIgc2NhbGUgb2YgMCAtIDEwMAorICAgICAqIGhlcmUsIHNvIHJlbWFwLgorICAgICAqLworICAgIGxvbmcgZHNWb2x1bWU7CisgICAgaWYgKHZvbHVtZSA9PSAwIHx8IGRzb3VuZHNpbmstPm11dGUpCisgICAgICBkc1ZvbHVtZSA9IC0xMDAwMDsKKyAgICBlbHNlCisgICAgICBkc1ZvbHVtZSA9IDEwMCAqIChsb25nKSAoMjAgKiBsb2cxMCAoKGRvdWJsZSkgdm9sdW1lIC8gMTAwLikpOworICAgIGRzVm9sdW1lID0gQ0xBTVAgKGRzVm9sdW1lLCAtMTAwMDAsIDApOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZHNvdW5kc2luaywKKyAgICAgICAgIlNldHRpbmcgdm9sdW1lIG9uIHNlY29uZGFyeSBidWZmZXIgdG8gJWQgZnJvbSAlZCIsIChpbnQpIGRzVm9sdW1lLAorICAgICAgICAoaW50KSB2b2x1bWUpOworICAgIElEaXJlY3RTb3VuZEJ1ZmZlcl9TZXRWb2x1bWUgKGRzb3VuZHNpbmstPnBEU0JTZWNvbmRhcnksIGRzVm9sdW1lKTsKKyAgfQorfQorCitnZG91YmxlCitnc3RfZGlyZWN0c291bmRfc2lua19nZXRfdm9sdW1lIChHc3REaXJlY3RTb3VuZFNpbmsgKiBkc291bmRzaW5rKQoreworICByZXR1cm4gKGdkb3VibGUpIGRzb3VuZHNpbmstPnZvbHVtZSAvIDEwMDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kaXJlY3Rzb3VuZF9zaW5rX3NldF9tdXRlIChHc3REaXJlY3RTb3VuZFNpbmsgKiBkc291bmRzaW5rLCBnYm9vbGVhbiBtdXRlKQoreworICBpZiAobXV0ZSkgeworICAgIGdzdF9kaXJlY3Rzb3VuZF9zaW5rX3NldF92b2x1bWUgKGRzb3VuZHNpbmssIDAsIEZBTFNFKTsKKyAgICBkc291bmRzaW5rLT5tdXRlID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfZGlyZWN0c291bmRfc2lua19zZXRfdm9sdW1lIChkc291bmRzaW5rLAorICAgICAgICBnc3RfZGlyZWN0c291bmRfc2lua19nZXRfdm9sdW1lIChkc291bmRzaW5rKSwgRkFMU0UpOworICAgIGRzb3VuZHNpbmstPm11dGUgPSBGQUxTRTsKKyAgfQorCit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RpcmVjdHNvdW5kX3NpbmtfZ2V0X211dGUgKEdzdERpcmVjdFNvdW5kU2luayAqIGRzb3VuZHNpbmspCit7CisgIHJldHVybiBkc291bmRzaW5rLT5tdXRlOworfQorCitzdGF0aWMgY29uc3QgZ2NoYXIgKgorZ3N0X2RpcmVjdHNvdW5kX3NpbmtfZ2V0X2RldmljZSAoR3N0RGlyZWN0U291bmRTaW5rICogZHNvdW5kc2luaykKK3sKKyAgcmV0dXJuIGRzb3VuZHNpbmstPmRldmljZV9pZDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kaXJlY3Rzb3VuZF9zaW5rX3NldF9kZXZpY2UgKEdzdERpcmVjdFNvdW5kU2luayAqIGRzb3VuZHNpbmssCisgICAgY29uc3QgZ2NoYXIgKiBkZXZpY2VfaWQpCit7CisgIGdfZnJlZSAoZHNvdW5kc2luay0+ZGV2aWNlX2lkKTsKKyAgZHNvdW5kc2luay0+ZGV2aWNlX2lkID0gZ19zdHJkdXAgKGRldmljZV9pZCk7Cit9CisKKy8qIENvbnZlcnRzIGEgSFJFU1VMVCBlcnJvciB0byBhIHRleHQgc3RyaW5nCisgKiBMUFRTVFIgaXMgZWl0aGVyIGEgKi8KK3N0YXRpYyBnY2hhciAqCitnc3RfaHJlc190b19zdHJpbmcgKEhSRVNVTFQgaFJlcykKK3sKKyAgRFdPUkQgZmxhZ3M7CisgIGdjaGFyICpyZXRfdGV4dDsKKyAgTFBUU1RSIGVycm9yX3RleHQgPSBOVUxMOworCisgIGZsYWdzID0gRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfCBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIKKyAgICAgIHwgRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFM7CisgIEZvcm1hdE1lc3NhZ2UgKGZsYWdzLCBOVUxMLCBoUmVzLCBNQUtFTEFOR0lEIChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksCisgICAgICAoTFBUU1RSKSAmIGVycm9yX3RleHQsIDAsIE5VTEwpOworCisjaWZkZWYgVU5JQ09ERQorICAvKiBJZiBVTklDT0RFIGlzIGRlZmluZWQsIExQVFNUUiBpcyBMUFdTVFIgd2hpY2ggaXMgVVRGLTE2ICovCisgIHJldF90ZXh0ID0gZ191dGYxNl90b191dGY4IChlcnJvcl90ZXh0LCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyNlbHNlCisgIHJldF90ZXh0ID0gZ19zdHJkdXAgKGVycm9yX3RleHQpOworI2VuZGlmCisKKyAgTG9jYWxGcmVlIChlcnJvcl90ZXh0KTsKKyAgcmV0dXJuIHJldF90ZXh0OworfQpkaWZmIC0tZ2l0IGEvc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5oIGIvc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NGRmYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAgMjAwNSBTZWJhc3RpZW4gTW91dHRlIDxzZWJhc3RpZW5AbW91dHRlLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBQaW9uZWVycyBvZiB0aGUgSW5ldml0YWJsZSA8c29uZ2JpcmRAc29uZ2JpcmRuZXN0LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBGbHVlbmRvIFMuQS4gPHN1cHBvcnRAZmx1ZW5kby5jb20+CisgKgorICogZ3N0ZGlyZWN0c291bmRzaW5rLmg6IAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqIFRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUgd2FzIG1hZGUgcG9zc2libGUgZHVlIHRvIHRoZSBpbnZvbHZlbWVudAorICogb2YgUGlvbmVlcnMgb2YgdGhlIEluZXZpdGFibGUsIHRoZSBjcmVhdG9ycyBvZiB0aGUgU29uZ2JpcmQgTXVzaWMgcGxheWVyCisgKgorICogCisgKi8KKworI2lmbmRlZiBfX0dTVF9ESVJFQ1RTT1VORFNJTktfSF9fCisjZGVmaW5lIF9fR1NUX0RJUkVDVFNPVU5EU0lOS19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9zaW5rLmg+CisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8ZHNvdW5kLmg+CisjaW5jbHVkZSA8bW1yZWcuaD4gCisjaW5jbHVkZSA8a3MuaD4gCisjaW5jbHVkZSA8a3NtZWRpYS5oPiAKKworR19CRUdJTl9ERUNMUworI2RlZmluZSBHU1RfVFlQRV9ESVJFQ1RTT1VORF9TSU5LICAgICAgICAgICAgKGdzdF9kaXJlY3Rzb3VuZF9zaW5rX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9ESVJFQ1RTT1VORF9TSU5LKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfRElSRUNUU09VTkRfU0lOSyxHc3REaXJlY3RTb3VuZFNpbmspKQorI2RlZmluZSBHU1RfRElSRUNUU09VTkRfU0lOS19DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfRElSRUNUU09VTkRfU0lOSyxHc3REaXJlY3RTb3VuZFNpbmtDbGFzcykpCisjZGVmaW5lIEdTVF9JU19ESVJFQ1RTT1VORF9TSU5LKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfRElSRUNUU09VTkRfU0lOSykpCisjZGVmaW5lIEdTVF9JU19ESVJFQ1RTT1VORF9TSU5LX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9ESVJFQ1RTT1VORF9TSU5LKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3REaXJlY3RTb3VuZFNpbmsgR3N0RGlyZWN0U291bmRTaW5rOwordHlwZWRlZiBzdHJ1Y3QgX0dzdERpcmVjdFNvdW5kU2lua0NsYXNzIEdzdERpcmVjdFNvdW5kU2lua0NsYXNzOworCisjZGVmaW5lIEdTVF9EU09VTkRfTE9DSyhvYmopCShnX211dGV4X2xvY2sgKCZvYmotPmRzb3VuZF9sb2NrKSkKKyNkZWZpbmUgR1NUX0RTT1VORF9VTkxPQ0sob2JqKQkoZ19tdXRleF91bmxvY2sgKCZvYmotPmRzb3VuZF9sb2NrKSkKKworc3RydWN0IF9Hc3REaXJlY3RTb3VuZFNpbmsKK3sKKyAgR3N0QXVkaW9TaW5rIHNpbms7CisKKworICAvKiBkaXJlY3Rzb3VuZCBvYmplY3QgaW50ZXJmYWNlIHBvaW50ZXIgKi8KKyAgTFBESVJFQ1RTT1VORCBwRFM7CisKKyAgLyogZGlyZWN0c291bmQgc291bmQgb2JqZWN0IGludGVyZmFjZSBwb2ludGVyICovCisgIExQRElSRUNUU09VTkRCVUZGRVIgcERTQlNlY29uZGFyeTsKKworICAvKiBkaXJlY3RTb3VuZCBidWZmZXIgc2l6ZSAqLworICBndWludCBidWZmZXJfc2l6ZTsKKworICAvKiBvZmZzZXQgb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlciB3aGVyZSB3ZSBtdXN0IHdyaXRlIG5leHQgKi8KKyAgZ3VpbnQgY3VycmVudF9jaXJjdWxhcl9vZmZzZXQ7CisKKyAgZ3VpbnQgYnl0ZXNfcGVyX3NhbXBsZTsKKworICAvKiBjdXJyZW50IHZvbHVtZSBzZXR1cCBieSBtaXhlciBpbnRlcmZhY2UgKi8KKyAgZ2xvbmcgdm9sdW1lOworICBnYm9vbGVhbiBtdXRlOworICAKKyAgLyogY3VycmVudCBkaXJlY3Rzb3VuZCBkZXZpY2UgSUQgKi8KKyAgZ2NoYXIgKiBkZXZpY2VfaWQ7CisKKyAgR3N0Q2FwcyAqY2FjaGVkX2NhcHM7CisgIC8qIGxvY2sgdXNlZCB0byBwcm90ZWN0IHdyaXRlcyBhbmQgcmVzZXRzICovCisgIEdNdXRleCBkc291bmRfbG9jazsKKworICBHc3RDbG9jayAqc3lzdGVtX2Nsb2NrOworICBHc3RDbG9ja0lEIHdyaXRlX3dhaXRfY2xvY2tfaWQ7CisgIGdib29sZWFuIHJlc2V0X3doaWxlX3NsZWVwaW5nOworCisgIGdib29sZWFuIGZpcnN0X2J1ZmZlcl9hZnRlcl9yZXNldDsKKworICBHc3RBdWRpb1JpbmdCdWZmZXJGb3JtYXRUeXBlIHR5cGU7Cit9OworCitzdHJ1Y3QgX0dzdERpcmVjdFNvdW5kU2lua0NsYXNzCit7CisgIEdzdEF1ZGlvU2lua0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9kaXJlY3Rzb3VuZF9zaW5rX2dldF90eXBlICh2b2lkKTsKKworI2RlZmluZSBHU1RfRElSRUNUU09VTkRfU0lOS19DQVBTICJhdWRpby94LXJhdywgIiBcCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSBTMTZMRSwgIiBcCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiBcCisgICAgICAgICJyYXRlID0gKGludCkgWyAxLCBNQVggXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDIgXTsgIiBcCisgICAgICAgICJhdWRpby94LXJhdywgIiBcCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSBVOCwgIiBcCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiBcCisgICAgICAgICJyYXRlID0gKGludCkgWyAxLCBNQVggXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDIgXTsiIFwKKyAgICAgICAgImF1ZGlvL3gtYWMzLCBmcmFtZWQgPSAoYm9vbGVhbikgdHJ1ZTsiIFwKKyAgICAgICAgImF1ZGlvL3gtZHRzLCBmcmFtZWQgPSAoYm9vbGVhbikgdHJ1ZTsiCisKK0dfRU5EX0RFQ0xTCisjZW5kaWYgLyogX19HU1RfRElSRUNUU09VTkRTSU5LX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL2RpcmVjdHNvdW5kL21lc29uLmJ1aWxkIGIvc3lzL2RpcmVjdHNvdW5kL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZDNmZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvZGlyZWN0c291bmQvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxNiBAQAorZGlyZWN0c291bmRzaW5rX3NvdXJjZXMgPSBbCisgICdnc3RkaXJlY3Rzb3VuZHNpbmsuYycsCisgICdnc3RkaXJlY3Rzb3VuZHBsdWdpbi5jJywKK10KKworaWYgaG9zdF9tYWNoaW5lLnN5c3RlbSgpID09ICd3aW5kb3dzJyBhbmQgY2MuaGFzX2hlYWRlcignZHNvdW5kLmgnKQorICBkaXJlY3Rzb3VuZHNpbmtfZGVwID0gW2NjLmZpbmRfbGlicmFyeSgnZHNvdW5kJyksIGNjLmZpbmRfbGlicmFyeSgnd2lubW0nKSwgY2MuZmluZF9saWJyYXJ5KCdvbGUzMicpXQorCisgIGdzdGRpcmVjdHNvdW5kc2luayA9IGxpYnJhcnkoJ2dzdGRpcmVjdHNvdW5kJywKKyAgICBkaXJlY3Rzb3VuZHNpbmtfc291cmNlcywKKyAgICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICAgIGRlcGVuZGVuY2llcyA6IFtnc3RhdWRpb19kZXBdICsgZGlyZWN0c291bmRzaW5rX2RlcCwKKyAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIpCitlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL21lc29uLmJ1aWxkIGIvc3lzL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMWVlNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxMCBAQAorc3ViZGlyKCdkaXJlY3Rzb3VuZCcpCitzdWJkaXIoJ29zcycpCitzdWJkaXIoJ29zczQnKQorc3ViZGlyKCd2NGwyJykKK3N1YmRpcigneGltYWdlJykKKworIyBGSVhNRTogSW1wbGVtZW50IHRoZXNlCisjc3ViZGlyKCdvc3hhdWRpbycpCisjc3ViZGlyKCdvc3h2aWRlbycpCisjc3ViZGlyKCd3YXZlZm9ybScpCmRpZmYgLS1naXQgYS9zeXMvb3NzLy5naXRpZ25vcmUgYi9zeXMvb3NzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q5ODhmYgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3MvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACitvc3NfcHJvYmUKZGlmZiAtLWdpdCBhL3N5cy9vc3MvTWFrZWZpbGUuYW0gYi9zeXMvb3NzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MDc5YTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3NzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjAgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdG9zc2F1ZGlvLmxhCisKK2xpYmdzdG9zc2F1ZGlvX2xhX1NPVVJDRVMgPSBnc3Rvc3NhdWRpby5jCSBcCisJCSAgICAgICAgICAgIGdzdG9zc2hlbHBlci5jCSBcCisJCQkgICAgZ3N0b3Nzc2luay5jCSBcCisJCQkgICAgZ3N0b3Nzc3JjLmMKKworbGliZ3N0b3NzYXVkaW9fbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdG9zc2F1ZGlvX2xhX0xJQkFERCA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgXAorCS1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkkKEdTVF9CQVNFX0xJQlMpIFwKKwkkKEdTVF9MSUJTKQorbGliZ3N0b3NzYXVkaW9fbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKSAKKworbm9pbnN0X0hFQURFUlMgPSBjb21tb24uaCAgICAgICAgICAgIFwKKwkJZ3N0b3Nzc2luay5oCSAgICAgXAorCQlnc3Rvc3NzcmMuaAkgICAgIFwKKyAgICAgICAgICAgICAgICBnc3Rvc3NoZWxwZXIuaAkgICAgIFwKKyAgICAgICAgICAgICAgICBnc3Rvc3NkbWFidWZmZXIuaApkaWZmIC0tZ2l0IGEvc3lzL29zcy9jb21tb24uaCBiL3N5cy9vc3MvY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzNjMyZgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3MvY29tbW9uLmgKQEAgLTAsMCArMSw0NSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICAyMDAwLDIwMDUgV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNkZWZpbmUgU0VUX1BBUkFNKF9vc3MsIF9uYW1lLCBfdmFsLCBfZGV0YWlsKSAgIFwKK0dfU1RNVF9TVEFSVCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IF90bXAgPSBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGlvY3RsKF9vc3MtPmZkLCBfbmFtZSwgJl90bXApID09IC0xKSB7ICAgIFwKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoX29zcywgUkVTT1VSQ0UsIFNFVFRJTkdTLFwKKyAgICAgICAgKE5VTEwpLAkJCQkJXAorICAgICAgICAoIlVuYWJsZSB0byBzZXQgcGFyYW0gIiBfZGV0YWlsICI6ICVzIiwgXAorICAgICAgICAgICAgICAgICAgIGdfc3RyZXJyb3IgKGVycm5vKSkpOyAgICAgICAgXAorICAgIHJldHVybiBGQUxTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHU1RfREVCVUdfT0JKRUNUKF9vc3MsIF9kZXRhaWwgIiAlZCIsIF90bXApOyAgXAorfSBHX1NUTVRfRU5ECisKKyNkZWZpbmUgR0VUX1BBUkFNKF9vc3MsIF9uYW1lLCBfdmFsLCBfZGV0YWlsKSAgIFwKK0dfU1RNVF9TVEFSVCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGlvY3RsKG9zcy0+ZmQsIF9uYW1lLCBfdmFsKSA9PSAtMSkgeyAgICAgIFwKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAob3NzLCBSRVNPVVJDRSwgU0VUVElOR1MsIFwKKyAgICAgICAgKE5VTEwpLAkJCQkJXAorICAgICAgICAoIlVuYWJsZSB0byBnZXQgcGFyYW0gIiBfZGV0YWlsICI6ICVzIiwgXAorICAgICAgICAgICAgICAgICAgIGdfc3RyZXJyb3IgKGVycm5vKSkpOyAgICAgICAgXAorICAgIHJldHVybiBGQUxTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSBHX1NUTVRfRU5ECmRpZmYgLS1naXQgYS9zeXMvb3NzL2dzdG9zc2F1ZGlvLmMgYi9zeXMvb3NzL2dzdG9zc2F1ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE5NGUyZQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3MvZ3N0b3NzYXVkaW8uYwpAQCAtMCwwICsxLDU5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0L2dzdC1pMThuLXBsdWdpbi5oIgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiZ3N0b3Nzc2luay5oIgorI2luY2x1ZGUgImdzdG9zc3NyYy5oIgorCitHU1RfREVCVUdfQ0FURUdPUlkgKG9zc19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBvc3NfZGVidWcKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJvc3NzcmMiLCBHU1RfUkFOS19TRUNPTkRBUlksCisgICAgICAgICAgR1NUX1RZUEVfT1NTX1NSQykgfHwKKyAgICAgICFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAib3Nzc2luayIsIEdTVF9SQU5LX1NFQ09OREFSWSwKKyAgICAgICAgICBHU1RfVFlQRV9PU1NTSU5LKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChvc3NfZGVidWcsICJvc3MiLCAwLCAiT1NTIGVsZW1lbnRzIik7CisKKyNpZmRlZiBFTkFCTEVfTkxTCisgIEdTVF9ERUJVRyAoImJpbmRpbmcgdGV4dCBkb21haW4gJXMgdG8gbG9jYWxlIGRpciAlcyIsIEdFVFRFWFRfUEFDS0FHRSwKKyAgICAgIExPQ0FMRURJUik7CisgIGJpbmR0ZXh0ZG9tYWluIChHRVRURVhUX1BBQ0tBR0UsIExPQ0FMRURJUik7CisgIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChHRVRURVhUX1BBQ0tBR0UsICJVVEYtOCIpOworI2VuZGlmIC8qIEVOQUJMRV9OTFMgKi8KKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIG9zc2F1ZGlvLAorICAgICJPU1MgKE9wZW4gU291bmQgU3lzdGVtKSBzdXBwb3J0IGZvciBHU3RyZWFtZXIiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvc3lzL29zcy9nc3Rvc3NkbWFidWZmZXIuYyBiL3N5cy9vc3MvZ3N0b3NzZG1hYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhlZTYxZAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3MvZ3N0b3NzZG1hYnVmZmVyLmMKQEAgLTAsMCArMSwzMzMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgICAgICAyMDA1IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogZ3N0b3NzZG1hYnVmZmVyLmM6IAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2lmZGVmIEhBVkVfT1NTX0lOQ0xVREVfSU5fU1lTCisjIGluY2x1ZGUgPHN5cy9zb3VuZGNhcmQuaD4KKyNlbHNlCisjIGlmZGVmIEhBVkVfT1NTX0lOQ0xVREVfSU5fUk9PVAorIyAgaW5jbHVkZSA8c291bmRjYXJkLmg+CisjIGVsc2UKKyMgIGlmZGVmIEhBVkVfT1NTX0lOQ0xVREVfSU5fTUFDSElORQorIyAgIGluY2x1ZGUgPG1hY2hpbmUvc291bmRjYXJkLmg+CisjICBlbHNlCisjICAgZXJyb3IgIldoYXQgdG8gaW5jbHVkZT8iCisjICBlbmRpZiAvKiBIQVZFX09TU19JTkNMVURFX0lOX01BQ0hJTkUgKi8KKyMgZW5kaWYgLyogSEFWRV9PU1NfSU5DTFVERV9JTl9ST09UICovCisjZW5kaWYgLyogSEFWRV9PU1NfSU5DTFVERV9JTl9TWVMgKi8KKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSAiZ3N0b3NzZG1hYnVmZmVyLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKG9zc19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBvc3NfZGVidWcKKworc3RhdGljIHZvaWQgZ3N0X29zc2RtYWJ1ZmZlcl9jbGFzc19pbml0IChHc3RPc3NETUFCdWZmZXJDbGFzcyAqIGtsYXNzKTsKK3N0YXRpYyB2b2lkIGdzdF9vc3NkbWFidWZmZXJfaW5pdCAoR3N0T3NzRE1BQnVmZmVyICogb3NzZG1hYnVmZmVyKTsKK3N0YXRpYyB2b2lkIGdzdF9vc3NkbWFidWZmZXJfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgdm9pZCBnc3Rfb3NzZG1hYnVmZmVyX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9vc3NkbWFidWZmZXJfYWNxdWlyZSAoR3N0UmluZ0J1ZmZlciAqIGJ1ZiwKKyAgICBHc3RSaW5nQnVmZmVyU3BlYyAqIHNwZWMpOworc3RhdGljIGdib29sZWFuIGdzdF9vc3NkbWFidWZmZXJfcmVsZWFzZSAoR3N0UmluZ0J1ZmZlciAqIGJ1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zc2RtYWJ1ZmZlcl9wbGF5IChHc3RSaW5nQnVmZmVyICogYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3NzZG1hYnVmZmVyX3N0b3AgKEdzdFJpbmdCdWZmZXIgKiBidWYpOworCitzdGF0aWMgR3N0UmluZ0J1ZmZlckNsYXNzICpwYXJlbnRfY2xhc3MgPSBOVUxMOworCitHVHlwZQorZ3N0X29zc2RtYWJ1ZmZlcl9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIG9zc2RtYWJ1ZmZlcl90eXBlID0gMDsKKworICBpZiAoIW9zc2RtYWJ1ZmZlcl90eXBlKSB7CisgICAgc3RhdGljIGNvbnN0IEdUeXBlSW5mbyBvc3NkbWFidWZmZXJfaW5mbyA9IHsKKyAgICAgIHNpemVvZiAoR3N0T3NzRE1BQnVmZmVyQ2xhc3MpLAorICAgICAgTlVMTCwKKyAgICAgIE5VTEwsCisgICAgICAoR0NsYXNzSW5pdEZ1bmMpIGdzdF9vc3NkbWFidWZmZXJfY2xhc3NfaW5pdCwKKyAgICAgIE5VTEwsCisgICAgICBOVUxMLAorICAgICAgc2l6ZW9mIChHc3RPc3NETUFCdWZmZXIpLAorICAgICAgMCwKKyAgICAgIChHSW5zdGFuY2VJbml0RnVuYykgZ3N0X29zc2RtYWJ1ZmZlcl9pbml0LAorICAgICAgTlVMTAorICAgIH07CisKKyAgICBvc3NkbWFidWZmZXJfdHlwZSA9CisgICAgICAgIGdfdHlwZV9yZWdpc3Rlcl9zdGF0aWMgKEdTVF9UWVBFX1JJTkdCVUZGRVIsICJHc3RPc3NETUFCdWZmZXIiLAorICAgICAgICAmb3NzZG1hYnVmZmVyX2luZm8sIDApOworICB9CisgIHJldHVybiBvc3NkbWFidWZmZXJfdHlwZTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3NkbWFidWZmZXJfY2xhc3NfaW5pdCAoR3N0T3NzRE1BQnVmZmVyQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RPYmplY3RDbGFzcyAqZ3N0b2JqZWN0X2NsYXNzOworICBHc3RSaW5nQnVmZmVyQ2xhc3MgKmdzdHJpbmdidWZmZXJfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdG9iamVjdF9jbGFzcyA9IChHc3RPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcyA9IChHc3RSaW5nQnVmZmVyQ2xhc3MgKikga2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF9vc3NkbWFidWZmZXJfZGlzcG9zZTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3Rfb3NzZG1hYnVmZmVyX2ZpbmFsaXplOworCisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPmFjcXVpcmUgPSBnc3Rfb3NzZG1hYnVmZmVyX2FjcXVpcmU7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPnJlbGVhc2UgPSBnc3Rfb3NzZG1hYnVmZmVyX3JlbGVhc2U7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPnBsYXkgPSBnc3Rfb3NzZG1hYnVmZmVyX3BsYXk7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPnN0b3AgPSBnc3Rfb3NzZG1hYnVmZmVyX3N0b3A7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzZG1hYnVmZmVyX2luaXQgKEdzdE9zc0RNQUJ1ZmZlciAqIG9zc2RtYWJ1ZmZlcikKK3sKKyAgb3NzZG1hYnVmZmVyLT5jb25kID0gZ19jb25kX25ldyAoKTsKKyAgb3NzZG1hYnVmZmVyLT5lbGVtZW50ID0gZ19vYmplY3RfbmV3IChHU1RfVFlQRV9PU1NFTEVNRU5ULCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3NkbWFidWZmZXJfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzZG1hYnVmZmVyX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RPc3NETUFCdWZmZXIgKm9idWYgPSAoR3N0T3NzRE1BQnVmZmVyICopIG9iamVjdDsKKworICBnX2NvbmRfZnJlZSAob2J1Zi0+Y29uZCk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zc2RtYWJ1ZmZlcl9mdW5jIChHc3RSaW5nQnVmZmVyICogYnVmKQoreworICBmZF9zZXQgd3JpdGVzZXQ7CisgIHN0cnVjdCBjb3VudF9pbmZvIGNvdW50OworICBHc3RPc3NETUFCdWZmZXIgKm9idWYgPSAoR3N0T3NzRE1BQnVmZmVyICopIGJ1ZjsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGJ1Zik7CisgIHdoaWxlIChvYnVmLT5ydW5uaW5nKSB7CisgICAgaWYgKGJ1Zi0+c3RhdGUgPT0gR1NUX1JJTkdCVUZGRVJfU1RBVEVfUExBWUlORykgeworICAgICAgaW50IHNlZ3NpemU7CisKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChidWYpOworCisgICAgICBzZWdzaXplID0gYnVmLT5zcGVjLnNlZ3NpemU7CisKKyAgICAgIEZEX1pFUk8gKCZ3cml0ZXNldCk7CisgICAgICBGRF9TRVQgKG9idWYtPmZkLCAmd3JpdGVzZXQpOworCisgICAgICBzZWxlY3QgKG9idWYtPmZkICsgMSwgTlVMTCwgJndyaXRlc2V0LCBOVUxMLCBOVUxMKTsKKworICAgICAgaWYgKGlvY3RsIChvYnVmLT5mZCwgU05EQ1RMX0RTUF9HRVRPUFRSLCAmY291bnQpID09IC0xKSB7CisgICAgICAgIHBlcnJvciAoIkdFVE9QVFIiKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChjb3VudC5ibG9ja3MgPiBidWYtPnNwZWMuc2VndG90YWwpCisgICAgICAgIGNvdW50LmJsb2NrcyA9IGJ1Zi0+c3BlYy5zZWd0b3RhbDsKKworICAgICAgZ3N0X3JpbmdidWZmZXJfY2FsbGJhY2sgKGJ1ZiwgY291bnQuYmxvY2tzKTsKKworICAgICAgR1NUX09CSkVDVF9MT0NLIChidWYpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfT1NTRE1BQlVGRkVSX1NJR05BTCAob2J1Zik7CisgICAgICBHU1RfT1NTRE1BQlVGRkVSX1dBSVQgKG9idWYpOworICAgIH0KKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoYnVmKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3NzZG1hYnVmZmVyX2FjcXVpcmUgKEdzdFJpbmdCdWZmZXIgKiBidWYsIEdzdFJpbmdCdWZmZXJTcGVjICogc3BlYykKK3sKKyAgaW50IHRtcDsKKyAgc3RydWN0IGF1ZGlvX2J1Zl9pbmZvIGluZm87CisgIEdzdE9zc0RNQUJ1ZmZlciAqb2J1ZiA9IChHc3RPc3NETUFCdWZmZXIgKikgYnVmOworICBjYWRkcl90IG1tYXBfYnVmOworICBpbnQgbW9kZTsKKyAgZ2ludCBzaXplOworICBnYm9vbGVhbiBwYXJzZWQ7CisKKyAgcGFyc2VkID0gZ3N0X29zc2VsZW1lbnRfcGFyc2VfY2FwcyAob2J1Zi0+ZWxlbWVudCwgc3BlYy0+Y2Fwcyk7CisgIGlmICghcGFyc2VkKQorICAgIHJldHVybiBGQUxTRTsKKworICBtb2RlID0gT19SRFdSOworICBtb2RlIHw9IE9fTk9OQkxPQ0s7CisKKyAgb2J1Zi0+ZmQgPSBvcGVuICgiL2Rldi9kc3AiLCBtb2RlLCAwKTsKKyAgaWYgKG9idWYtPmZkID09IC0xKSB7CisgICAgcGVycm9yICgiT1BFTiIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICAvL29idWYtPmZyYWcgPSAweDAwMDQwMDA4OworICBvYnVmLT5mcmFnID0gMHhmZmZmMDAwYTsKKworICB0bXAgPSBvYnVmLT5lbGVtZW50LT5mb3JtYXQ7CisgIGlmIChpb2N0bCAob2J1Zi0+ZmQsIFNORENUTF9EU1BfU0VURk1ULCAmdG1wKSA9PSAtMSkgeworICAgIHBlcnJvciAoIlNFVEZNVCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHRtcCA9IG9idWYtPmVsZW1lbnQtPmNoYW5uZWxzOworICBpZiAoaW9jdGwgKG9idWYtPmZkLCBTTkRDVExfRFNQX1NURVJFTywgJnRtcCkgPT0gLTEpIHsKKyAgICBwZXJyb3IgKCJTVEVSRU8iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICB0bXAgPSBvYnVmLT5lbGVtZW50LT5jaGFubmVsczsKKyAgaWYgKGlvY3RsIChvYnVmLT5mZCwgU05EQ1RMX0RTUF9DSEFOTkVMUywgJnRtcCkgPT0gLTEpIHsKKyAgICBwZXJyb3IgKCJDSEFOTkVMUyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHRtcCA9IG9idWYtPmVsZW1lbnQtPnJhdGU7CisgIGlmIChpb2N0bCAob2J1Zi0+ZmQsIFNORENUTF9EU1BfU1BFRUQsICZ0bXApID09IC0xKSB7CisgICAgcGVycm9yICgiU1BFRUQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoaW9jdGwgKG9idWYtPmZkLCBTTkRDVExfRFNQX0dFVENBUFMsICZvYnVmLT5jYXBzKSA9PSAtMSkgeworICAgIHBlcnJvciAoIi9kZXYvZHNwIik7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiU29ycnkgYnV0IHlvdXIgc291bmQgZHJpdmVyIGlzIHRvbyBvbGRcbiIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmICghKG9idWYtPmNhcHMgJiBEU1BfQ0FQX1RSSUdHRVIpIHx8ICEob2J1Zi0+Y2FwcyAmIERTUF9DQVBfTU1BUCkpIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJTb3JyeSBidXQgeW91ciBzb3VuZGNhcmQgY2FuJ3QgZG8gdGhpc1xuIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKGlvY3RsIChvYnVmLT5mZCwgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVCwgJm9idWYtPmZyYWcpID09IC0xKSB7CisgICAgcGVycm9yICgiU0VURlJBR01FTlQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoaW9jdGwgKG9idWYtPmZkLCBTTkRDVExfRFNQX0dFVE9TUEFDRSwgJmluZm8pID09IC0xKSB7CisgICAgcGVycm9yICgiR0VUT1NQQUNFIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgYnVmLT5zcGVjLnNlZ3NpemUgPSBpbmZvLmZyYWdzaXplOworICBidWYtPnNwZWMuc2VndG90YWwgPSBpbmZvLmZyYWdzdG90YWw7CisgIHNpemUgPSBpbmZvLmZyYWdzaXplICogaW5mby5mcmFnc3RvdGFsOworICBnX3ByaW50ICgic2Vnc2l6ZSAlZCwgc2VndG90YWwgJWRcbiIsIGluZm8uZnJhZ3NpemUsIGluZm8uZnJhZ3N0b3RhbCk7CisKKyAgbW1hcF9idWYgPSAoY2FkZHJfdCkgbW1hcCAoTlVMTCwgc2l6ZSwgUFJPVF9XUklURSwKKyAgICAgIE1BUF9GSUxFIHwgTUFQX1NIQVJFRCwgb2J1Zi0+ZmQsIDApOworCisgIGlmICgoY2FkZHJfdCkgbW1hcF9idWYgPT0gKGNhZGRyX3QpIC0gMSkgeworICAgIHBlcnJvciAoIm1tYXAgKHdyaXRlKSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGJ1Zi0+ZGF0YSA9IGdzdF9idWZmZXJfbmV3ICgpOworICBHU1RfQlVGRkVSX0RBVEEgKGJ1Zi0+ZGF0YSkgPSBtbWFwX2J1ZjsKKyAgR1NUX0JVRkZFUl9TSVpFIChidWYtPmRhdGEpID0gc2l6ZTsKKyAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLT5kYXRhLCBHU1RfQlVGRkVSX0RPTlRGUkVFKTsKKworICB0bXAgPSAwOworICBpZiAoaW9jdGwgKG9idWYtPmZkLCBTTkRDVExfRFNQX1NFVFRSSUdHRVIsICZ0bXApID09IC0xKSB7CisgICAgcGVycm9yICgiU0VUVFJJR0dFUiIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIEdTVF9PQkpFQ1RfTE9DSyAob2J1Zik7CisgIG9idWYtPnJ1bm5pbmcgPSBUUlVFOworICBvYnVmLT50aHJlYWQgPSBnX3RocmVhZF9jcmVhdGUgKChHVGhyZWFkRnVuYykgZ3N0X29zc2RtYWJ1ZmZlcl9mdW5jLAorICAgICAgYnVmLCBUUlVFLCBOVUxMKTsKKyAgR1NUX09TU0RNQUJVRkZFUl9XQUlUIChvYnVmKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKG9idWYpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3NkbWFidWZmZXJfcmVsZWFzZSAoR3N0UmluZ0J1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0T3NzRE1BQnVmZmVyICpvYnVmID0gKEdzdE9zc0RNQUJ1ZmZlciAqKSBidWY7CisKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmLT5kYXRhKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKG9idWYpOworICBvYnVmLT5ydW5uaW5nID0gRkFMU0U7CisgIEdTVF9PU1NETUFCVUZGRVJfU0lHTkFMIChvYnVmKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKG9idWYpOworCisgIGdfdGhyZWFkX2pvaW4gKG9idWYtPnRocmVhZCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zc2RtYWJ1ZmZlcl9wbGF5IChHc3RSaW5nQnVmZmVyICogYnVmKQoreworICBpbnQgdG1wOworICBHc3RPc3NETUFCdWZmZXIgKm9idWY7CisKKyAgb2J1ZiA9IChHc3RPc3NETUFCdWZmZXIgKikgYnVmOworCisgIHRtcCA9IFBDTV9FTkFCTEVfT1VUUFVUOworICBpZiAoaW9jdGwgKG9idWYtPmZkLCBTTkRDVExfRFNQX1NFVFRSSUdHRVIsICZ0bXApID09IC0xKSB7CisgICAgcGVycm9yICgiU0VUVFJJR0dFUiIpOworICB9CisgIEdTVF9PU1NETUFCVUZGRVJfU0lHTkFMIChvYnVmKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3NzZG1hYnVmZmVyX3N0b3AgKEdzdFJpbmdCdWZmZXIgKiBidWYpCit7CisgIGludCB0bXA7CisgIEdzdE9zc0RNQUJ1ZmZlciAqb2J1ZjsKKworICBvYnVmID0gKEdzdE9zc0RNQUJ1ZmZlciAqKSBidWY7CisKKyAgdG1wID0gMDsKKyAgaWYgKGlvY3RsIChvYnVmLT5mZCwgU05EQ1RMX0RTUF9TRVRUUklHR0VSLCAmdG1wKSA9PSAtMSkgeworICAgIHBlcnJvciAoIlNFVFRSSUdHRVIiKTsKKyAgfQorICBHU1RfT1NTRE1BQlVGRkVSX1dBSVQgKG9idWYpOworICBidWYtPnBsYXlzZWcgPSAwOworCisgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvc3lzL29zcy9nc3Rvc3NkbWFidWZmZXIuaCBiL3N5cy9vc3MvZ3N0b3NzZG1hYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0M2IwMwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3MvZ3N0b3NzZG1hYnVmZmVyLmgKQEAgLTAsMCArMSw3NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICAgICAgIDIwMDUgV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBnc3Rvc3NkbWFidWZmZXIuaDogCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9PU1NETUFCVUZGRVJfSF9fCisjZGVmaW5lIF9fR1NUX09TU0RNQUJVRkZFUl9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImdzdG9zc2hlbHBlci5oIgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RyaW5nYnVmZmVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9PU1NETUFCVUZGRVIgICAgICAgICAgICAoZ3N0X29zc2RtYWJ1ZmZlcl9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfT1NTRE1BQlVGRkVSKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfT1NTRE1BQlVGRkVSLEdzdE9zc0RNQUJ1ZmZlcikpCisjZGVmaW5lIEdTVF9PU1NETUFCVUZGRVJfQ0xBU1Moa2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX09TU0RNQUJVRkZFUixHc3RPc3NETUFCdWZmZXJDbGFzcykpCisjZGVmaW5lIEdTVF9JU19PU1NETUFCVUZGRVIob2JqKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9PU1NETUFCVUZGRVIpKQorI2RlZmluZSBHU1RfSVNfT1NTRE1BQlVGRkVSX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9PU1NETUFCVUZGRVIpKQorCisjZGVmaW5lIEdTVF9PU1NFTEVNRU5UX0dFVChvYmopICBHU1RfT1NTRUxFTUVOVCAob2JqLT5lbGVtZW50KQorCit0eXBlZGVmIGVudW0geworICBHU1RfT1NTRE1BQlVGRkVSX09QRU4gICAgICAgICA9ICgxIDw8IDApLAorfSBHc3RPc3NETUFCdWZmZXJGbGFnczsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9zc0RNQUJ1ZmZlciBHc3RPc3NETUFCdWZmZXI7Cit0eXBlZGVmIHN0cnVjdCBfR3N0T3NzRE1BQnVmZmVyQ2xhc3MgR3N0T3NzRE1BQnVmZmVyQ2xhc3M7CisKKyNkZWZpbmUgR1NUX09TU0RNQUJVRkZFUl9USFJFQUQoYnVmKSAgIChHU1RfT1NTRE1BQlVGRkVSKGJ1ZiktPnRocmVhZCkKKyNkZWZpbmUgR1NUX09TU0RNQUJVRkZFUl9MT0NLICAgICAgICAgIEdTVF9PQkpFQ1RfTE9DSworI2RlZmluZSBHU1RfT1NTRE1BQlVGRkVSX1VOTE9DSyAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sKKyNkZWZpbmUgR1NUX09TU0RNQUJVRkZFUl9DT05EKGJ1ZikgICAgIChHU1RfT1NTRE1BQlVGRkVSKGJ1ZiktPmNvbmQpCisjZGVmaW5lIEdTVF9PU1NETUFCVUZGRVJfU0lHTkFMKGJ1ZikgICAoZ19jb25kX3NpZ25hbCAoR1NUX09TU0RNQUJVRkZFUl9DT05EIChidWYpKSkKKyNkZWZpbmUgR1NUX09TU0RNQUJVRkZFUl9XQUlUKGJ1ZikgICAgIChnX2NvbmRfd2FpdCAoR1NUX09TU0RNQUJVRkZFUl9DT05EIChidWYpLCBHU1RfT0JKRUNUX0dFVF9MT0NLIChidWYpKSkKKworc3RydWN0IF9Hc3RPc3NETUFCdWZmZXIgeworICBHc3RSaW5nQnVmZmVyICBidWZmZXI7CisKKyAgR3N0T3NzRWxlbWVudCAqZWxlbWVudDsKKworICBpbnQgICAgICAgICAgICBmZDsKKyAgaW50ICAgICAgICAgICAgY2FwczsKKyAgaW50ICAgICAgICAgICAgZnJhZzsKKworICBHVGhyZWFkICAgICAgICp0aHJlYWQ7CisgIEdDb25kICAgICAgICAgKmNvbmQ7CisgIGdib29sZWFuICAgICAgIHJ1bm5pbmc7Cit9OworCitzdHJ1Y3QgX0dzdE9zc0RNQUJ1ZmZlckNsYXNzIHsKKyAgR3N0UmluZ0J1ZmZlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9vc3NkbWFidWZmZXJfZ2V0X3R5cGUodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9PU1NETUFCVUZGRVJfSF9fICovCmRpZmYgLS1naXQgYS9zeXMvb3NzL2dzdG9zc2hlbHBlci5jIGIvc3lzL29zcy9nc3Rvc3NoZWxwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjQ5ZTAwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zcy9nc3Rvc3NoZWxwZXIuYwpAQCAtMCwwICsxLDQyMSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICAgICAgIDIwMDAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNoZWxsby5iZT4KKyAqCisgKiBnc3Rvc3NoZWxwZXIuYzogT1NTIGhlbHBlciByb3V0aW5lcworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdC9nc3QtaTE4bi1wbHVnaW4uaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIEhBVkVfT1NTX0lOQ0xVREVfSU5fU1lTCisjIGluY2x1ZGUgPHN5cy9zb3VuZGNhcmQuaD4KKyNlbHNlCisjIGlmZGVmIEhBVkVfT1NTX0lOQ0xVREVfSU5fUk9PVAorIyAgaW5jbHVkZSA8c291bmRjYXJkLmg+CisjIGVsc2UKKyMgIGlmZGVmIEhBVkVfT1NTX0lOQ0xVREVfSU5fTUFDSElORQorIyAgIGluY2x1ZGUgPG1hY2hpbmUvc291bmRjYXJkLmg+CisjICBlbHNlCisjICAgZXJyb3IgIldoYXQgdG8gaW5jbHVkZT8iCisjICBlbmRpZiAvKiBIQVZFX09TU19JTkNMVURFX0lOX01BQ0hJTkUgKi8KKyMgZW5kaWYgLyogSEFWRV9PU1NfSU5DTFVERV9JTl9ST09UICovCisjZW5kaWYgLyogSEFWRV9PU1NfSU5DTFVERV9JTl9TWVMgKi8KKworI2luY2x1ZGUgImdzdG9zc2hlbHBlci5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfRVhURVJOIChvc3NfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgb3NzX2RlYnVnCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RPc3NQcm9iZSBHc3RPc3NQcm9iZTsKK3N0cnVjdCBfR3N0T3NzUHJvYmUKK3sKKyAgaW50IGZkOworICBpbnQgZm9ybWF0OworICBpbnQgbl9jaGFubmVsczsKKyAgR0FycmF5ICpyYXRlczsKKyAgaW50IG1pbjsKKyAgaW50IG1heDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RPc3NSYW5nZSBHc3RPc3NSYW5nZTsKK3N0cnVjdCBfR3N0T3NzUmFuZ2UKK3sKKyAgaW50IG1pbjsKKyAgaW50IG1heDsKK307CisKK3N0YXRpYyBHc3RTdHJ1Y3R1cmUgKmdzdF9vc3NfaGVscGVyX2dldF9mb3JtYXRfc3RydWN0dXJlICh1bnNpZ25lZCBpbnQKKyAgICBmb3JtYXRfYml0KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3NzX2hlbHBlcl9yYXRlX3Byb2JlX2NoZWNrIChHc3RPc3NQcm9iZSAqIHByb2JlKTsKK3N0YXRpYyBpbnQgZ3N0X29zc19oZWxwZXJfcmF0ZV9jaGVja19yYXRlIChHc3RPc3NQcm9iZSAqIHByb2JlLCBpbnQgaXJhdGUpOworc3RhdGljIHZvaWQgZ3N0X29zc19oZWxwZXJfcmF0ZV9hZGRfcmFuZ2UgKEdRdWV1ZSAqIHF1ZXVlLCBpbnQgbWluLCBpbnQgbWF4KTsKK3N0YXRpYyB2b2lkIGdzdF9vc3NfaGVscGVyX3JhdGVfYWRkX3JhdGUgKEdBcnJheSAqIGFycmF5LCBpbnQgcmF0ZSk7CitzdGF0aWMgaW50IGdzdF9vc3NfaGVscGVyX3JhdGVfaW50X2NvbXBhcmUgKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKTsKKworR3N0Q2FwcyAqCitnc3Rfb3NzX2hlbHBlcl9wcm9iZV9jYXBzIChnaW50IGZkKQoreworI2lmIEdfQllURV9PUkRFUiA9PSBHX0xJVFRMRV9FTkRJQU4KKyAgY29uc3QgZ3VpbnQgcHJvYmVfZm9ybWF0c1tdID0geyBBRk1UX1MxNl9MRSwgQUZNVF9VMTZfTEUsIEFGTVRfVTgsIEFGTVRfUzggfTsKKyNlbHNlCisgIGNvbnN0IGd1aW50IHByb2JlX2Zvcm1hdHNbXSA9IHsgQUZNVF9TMTZfQkUsIEFGTVRfVTE2X0JFLCBBRk1UX1U4LCBBRk1UX1M4IH07CisjZW5kaWYKKyAgR3N0T3NzUHJvYmUgKnByb2JlOworICBpbnQgaSwgZjsKKyAgZ2Jvb2xlYW4gcmV0OworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgR3N0Q2FwcyAqY2FwczsKKworICAvKiBGSVhNRSB0ZXN0IG1ha2Ugc3VyZSB3ZSdyZSBub3QgY3VycmVudGx5IHBsYXlpbmcgKi8KKyAgLyogRklYTUUgdGVzdCBib3RoIG1vbm8gYW5kIHN0ZXJlbyAqLworCisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHkgKCk7CisKKyAgLyogYXNzdW1lIHRoYXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIGZvcm1hdF9tYXNrIGlzIDAgKi8KKyAgZm9yIChmID0gMDsgZiA8IEdfTl9FTEVNRU5UUyAocHJvYmVfZm9ybWF0cyk7ICsrZikgeworICAgIEdWYWx1ZSByYXRlX3ZhbHVlID0geyAwIH07CisKKyAgICBwcm9iZSA9IGdfbmV3MCAoR3N0T3NzUHJvYmUsIDEpOworICAgIHByb2JlLT5mZCA9IGZkOworICAgIHByb2JlLT5mb3JtYXQgPSBwcm9iZV9mb3JtYXRzW2ZdOworICAgIC8qIEZJWE1FOiB0aGlzIGlzIG5vdCB3b3JraW5nIGZvciBhbGwgY2FyZHMsIHNlZSBidWcgIzUxODQ3NCAqLworICAgIHByb2JlLT5uX2NoYW5uZWxzID0gMjsKKworICAgIHJldCA9IGdzdF9vc3NfaGVscGVyX3JhdGVfcHJvYmVfY2hlY2sgKHByb2JlKTsKKyAgICBpZiAocHJvYmUtPm1pbiA9PSAtMSB8fCBwcm9iZS0+bWF4ID09IC0xKSB7CisgICAgICBnX2FycmF5X2ZyZWUgKHByb2JlLT5yYXRlcywgVFJVRSk7CisgICAgICBnX2ZyZWUgKHByb2JlKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChyZXQpIHsKKyAgICAgIEdWYWx1ZSB2YWx1ZSA9IHsgMCB9OworCisgICAgICBnX2FycmF5X3NvcnQgKHByb2JlLT5yYXRlcywgZ3N0X29zc19oZWxwZXJfcmF0ZV9pbnRfY29tcGFyZSk7CisKKyAgICAgIGdfdmFsdWVfaW5pdCAoJnJhdGVfdmFsdWUsIEdTVF9UWVBFX0xJU1QpOworICAgICAgZ192YWx1ZV9pbml0ICgmdmFsdWUsIEdfVFlQRV9JTlQpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJvYmUtPnJhdGVzLT5sZW47IGkrKykgeworICAgICAgICBnX3ZhbHVlX3NldF9pbnQgKCZ2YWx1ZSwgZ19hcnJheV9pbmRleCAocHJvYmUtPnJhdGVzLCBpbnQsIGkpKTsKKworICAgICAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfdmFsdWUgKCZyYXRlX3ZhbHVlLCAmdmFsdWUpOworICAgICAgfQorCisgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBvbmUgYmlnIHJhbmdlICovCisgICAgICBnX3ZhbHVlX2luaXQgKCZyYXRlX3ZhbHVlLCBHU1RfVFlQRV9JTlRfUkFOR0UpOworICAgICAgZ3N0X3ZhbHVlX3NldF9pbnRfcmFuZ2UgKCZyYXRlX3ZhbHVlLCBwcm9iZS0+bWluLCBwcm9iZS0+bWF4KTsKKyAgICB9CisKKyAgICBnX2FycmF5X2ZyZWUgKHByb2JlLT5yYXRlcywgVFJVRSk7CisgICAgZ19mcmVlIChwcm9iZSk7CisKKyAgICBzdHJ1Y3R1cmUgPSBnc3Rfb3NzX2hlbHBlcl9nZXRfZm9ybWF0X3N0cnVjdHVyZSAocHJvYmVfZm9ybWF0c1tmXSk7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHN0cnVjdHVyZSwgImNoYW5uZWxzIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCAyLCBOVUxMKTsKKyAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAoc3RydWN0dXJlLCAicmF0ZSIsICZyYXRlX3ZhbHVlKTsKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmcmF0ZV92YWx1ZSk7CisKKyAgICBnc3RfY2Fwc19hcHBlbmRfc3RydWN0dXJlIChjYXBzLCBzdHJ1Y3R1cmUpOworICB9CisKKyAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChjYXBzKSkgeworICAgIC8qIGZpeG1lOiBtYWtlIHVzZXItdmlzaWJsZSAqLworICAgIEdTVF9XQVJOSU5HICgiWW91ciBPU1MgZGV2aWNlIGNvdWxkIG5vdCBiZSBwcm9iZWQgY29ycmVjdGx5Iik7CisgIH0gZWxzZSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX3NpbXBsaWZ5IChjYXBzKTsKKyAgfQorCisgIEdTVF9ERUJVRyAoInByb2JlZCBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKK3N0YXRpYyBHc3RTdHJ1Y3R1cmUgKgorZ3N0X29zc19oZWxwZXJfZ2V0X2Zvcm1hdF9zdHJ1Y3R1cmUgKHVuc2lnbmVkIGludCBmb3JtYXRfYml0KQoreworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgY29uc3QgZ2NoYXIgKmZvcm1hdDsKKworICBzd2l0Y2ggKGZvcm1hdF9iaXQpIHsKKyAgICBjYXNlIEFGTVRfVTg6CisgICAgICBmb3JtYXQgPSAiVTgiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBRk1UX1MxNl9MRToKKyAgICAgIGZvcm1hdCA9ICJTMTZMRSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFGTVRfUzE2X0JFOgorICAgICAgZm9ybWF0ID0gIlMxNkJFIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUZNVF9TODoKKyAgICAgIGZvcm1hdCA9ICJTOCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFGTVRfVTE2X0xFOgorICAgICAgZm9ybWF0ID0gIlUxNkxFIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUZNVF9VMTZfQkU6CisgICAgICBmb3JtYXQgPSAiVTE2QkUiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBzdHJ1Y3R1cmUgPSBnc3Rfc3RydWN0dXJlX25ldyAoImF1ZGlvL3gtcmF3IiwKKyAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCBmb3JtYXQsCisgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImludGVybGVhdmVkIiwgTlVMTCk7CisKKyAgcmV0dXJuIHN0cnVjdHVyZTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3NzX2hlbHBlcl9yYXRlX3Byb2JlX2NoZWNrIChHc3RPc3NQcm9iZSAqIHByb2JlKQoreworICBHc3RPc3NSYW5nZSAqcmFuZ2U7CisgIEdRdWV1ZSAqcmFuZ2VzOworICBpbnQgZXhhY3RfcmF0ZXMgPSAwOworICBnYm9vbGVhbiBjaGVja2luZ19leGFjdF9yYXRlcyA9IFRSVUU7CisgIGludCBuX2NoZWNrcyA9IDA7CisgIGdib29sZWFuIHJlc3VsdCA9IFRSVUU7CisKKyAgcmFuZ2VzID0gZ19xdWV1ZV9uZXcgKCk7CisKKyAgcHJvYmUtPnJhdGVzID0gZ19hcnJheV9uZXcgKEZBTFNFLCBGQUxTRSwgc2l6ZW9mIChpbnQpKTsKKworICBwcm9iZS0+bWluID0gZ3N0X29zc19oZWxwZXJfcmF0ZV9jaGVja19yYXRlIChwcm9iZSwgMTAwMCk7CisgIG5fY2hlY2tzKys7CisgIHByb2JlLT5tYXggPSBnc3Rfb3NzX2hlbHBlcl9yYXRlX2NoZWNrX3JhdGUgKHByb2JlLCAxMDAwMDApOworICAvKiBhIGxpdHRsZSBidWcgd29ya2Fyb3VuZCAqLworICB7CisgICAgaW50IG1heDsKKworICAgIG1heCA9IGdzdF9vc3NfaGVscGVyX3JhdGVfY2hlY2tfcmF0ZSAocHJvYmUsIDQ4MDAwKTsKKyAgICBpZiAobWF4ID4gcHJvYmUtPm1heCkgeworICAgICAgR1NUX0VSUk9SCisgICAgICAgICAgKCJEcml2ZXIgYnVnIHJlY29nbml6ZWQgKGRyaXZlciBkb2VzIG5vdCByb3VuZCByYXRlcyBjb3JyZWN0bHkpLiAgUGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0LiIpOworICAgICAgcHJvYmUtPm1heCA9IG1heDsKKyAgICB9CisgIH0KKyAgbl9jaGVja3MrKzsKKyAgaWYgKHByb2JlLT5taW4gPT0gLTEgfHwgcHJvYmUtPm1heCA9PSAtMSkgeworICAgIC8qIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBkcml2ZXJzIHRoYXQgcmV0dXJuIC1FSU5WQUwgKG9yIGFub3RoZXIKKyAgICAgKiBlcnJvcikgZm9yIHJhdGVzIG91dHNpZGUgb2YgWzgwMDAsNDgwMDBdLiAgSWYgdGhpcyBmYWlscywgdGhlCisgICAgICogZHJpdmVyIGlzIHNlcmlvdXNseSBidWdneSwgYW5kIHByb2JhYmx5IGRvZXNuJ3Qgd29yayB3aXRoIG90aGVyCisgICAgICogbWVkaWEgbGlicmFyaWVzL2FwcHMuICAqLworICAgIHByb2JlLT5taW4gPSBnc3Rfb3NzX2hlbHBlcl9yYXRlX2NoZWNrX3JhdGUgKHByb2JlLCA4MDAwKTsKKyAgICBwcm9iZS0+bWF4ID0gZ3N0X29zc19oZWxwZXJfcmF0ZV9jaGVja19yYXRlIChwcm9iZSwgNDgwMDApOworICB9CisgIGlmIChwcm9iZS0+bWluID09IC0xIHx8IHByb2JlLT5tYXggPT0gLTEpIHsKKyAgICBHU1RfREVCVUcgKCJ1bmV4cGVjdGVkIGNoZWNrX3JhdGUgZXJyb3IiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZ3N0X29zc19oZWxwZXJfcmF0ZV9hZGRfcmFuZ2UgKHJhbmdlcywgcHJvYmUtPm1pbiArIDEsIHByb2JlLT5tYXggLSAxKTsKKworICB3aGlsZSAoKHJhbmdlID0gZ19xdWV1ZV9wb3BfaGVhZCAocmFuZ2VzKSkpIHsKKyAgICBpbnQgbWluMTsKKyAgICBpbnQgbWF4MTsKKyAgICBpbnQgbWlkOworICAgIGludCBtaWRfcmV0OworCisgICAgR1NUX0RFQlVHICgiY2hlY2tpbmcgWyVkLCVkXSIsIHJhbmdlLT5taW4sIHJhbmdlLT5tYXgpOworCisgICAgbWlkID0gKHJhbmdlLT5taW4gKyByYW5nZS0+bWF4KSAvIDI7CisgICAgbWlkX3JldCA9IGdzdF9vc3NfaGVscGVyX3JhdGVfY2hlY2tfcmF0ZSAocHJvYmUsIG1pZCk7CisgICAgaWYgKG1pZF9yZXQgPT0gLTEpIHsKKyAgICAgIC8qIEZJWE1FIGlvY3RsIHJldHVybmVkIGFuIGVycm9yLiAgZG8gc29tZXRoaW5nICovCisgICAgICBHU1RfREVCVUcgKCJ1bmV4cGVjdGVkIGNoZWNrX3JhdGUgZXJyb3IiKTsKKyAgICB9CisgICAgbl9jaGVja3MrKzsKKworICAgIGlmIChtaWQgPT0gbWlkX3JldCAmJiBjaGVja2luZ19leGFjdF9yYXRlcykgeworICAgICAgaW50IG1heF9leGFjdF9tYXRjaGVzID0gMjA7CisKKyAgICAgIGV4YWN0X3JhdGVzKys7CisgICAgICBpZiAoZXhhY3RfcmF0ZXMgPiBtYXhfZXhhY3RfbWF0Y2hlcykgeworICAgICAgICBHU1RfREVCVUcgKCJnb3QgJWQgZXhhY3QgcmF0ZXMsIGFzc3VtaW5nIGFsbCBhcmUgZXhhY3QiLAorICAgICAgICAgICAgbWF4X2V4YWN0X21hdGNoZXMpOworICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgICAgZ19mcmVlIChyYW5nZSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBjaGVja2luZ19leGFjdF9yYXRlcyA9IEZBTFNFOworICAgIH0KKworICAgIC8qIEFzc3VtZSB0aGF0IHRoZSByYXRlIGlzIGFyaXRobWV0aWNhbGx5IHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QKKyAgICAgKiBzdXBwb3J0ZWQgcmF0ZS4gKi8KKyAgICBpZiAobWlkID09IG1pZF9yZXQpIHsKKyAgICAgIG1pbjEgPSBtaWQgLSAxOworICAgICAgbWF4MSA9IG1pZCArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtaWQgPCBtaWRfcmV0KSB7CisgICAgICAgIG1pbjEgPSBtaWQgLSAobWlkX3JldCAtIG1pZCk7CisgICAgICAgIG1heDEgPSBtaWRfcmV0ICsgMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1pbjEgPSBtaWRfcmV0IC0gMTsKKyAgICAgICAgbWF4MSA9IG1pZCArIChtaWQgLSBtaWRfcmV0KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnc3Rfb3NzX2hlbHBlcl9yYXRlX2FkZF9yYW5nZSAocmFuZ2VzLCByYW5nZS0+bWluLCBtaW4xKTsKKyAgICBnc3Rfb3NzX2hlbHBlcl9yYXRlX2FkZF9yYW5nZSAocmFuZ2VzLCBtYXgxLCByYW5nZS0+bWF4KTsKKworICAgIGdfZnJlZSAocmFuZ2UpOworICB9CisKKyAgd2hpbGUgKChyYW5nZSA9IGdfcXVldWVfcG9wX2hlYWQgKHJhbmdlcykpKSB7CisgICAgZ19mcmVlIChyYW5nZSk7CisgIH0KKyAgZ19xdWV1ZV9mcmVlIChyYW5nZXMpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzX2hlbHBlcl9yYXRlX2FkZF9yYW5nZSAoR1F1ZXVlICogcXVldWUsIGludCBtaW4sIGludCBtYXgpCit7CisgIGlmIChtaW4gPD0gbWF4KSB7CisgICAgR3N0T3NzUmFuZ2UgKnJhbmdlID0gZ19uZXcwIChHc3RPc3NSYW5nZSwgMSk7CisKKyAgICByYW5nZS0+bWluID0gbWluOworICAgIHJhbmdlLT5tYXggPSBtYXg7CisKKyAgICBnX3F1ZXVlX3B1c2hfdGFpbCAocXVldWUsIHJhbmdlKTsKKyAgICAvKiBwdXNoX2hlYWQgYWxzbyB3b3JrcywgYnV0IGhhcyBkaWZmZXJlbnQgcHJvYmluZyBiZWhhdmlvciAqLworICAgIC8qZ19xdWV1ZV9wdXNoX2hlYWQgKHF1ZXVlLCByYW5nZSk7ICovCisgIH0KK30KKworc3RhdGljIGludAorZ3N0X29zc19oZWxwZXJfcmF0ZV9jaGVja19yYXRlIChHc3RPc3NQcm9iZSAqIHByb2JlLCBpbnQgaXJhdGUpCit7CisgIGludCByYXRlOworICBpbnQgZm9ybWF0OworICBpbnQgbl9jaGFubmVsczsKKyAgaW50IHJldDsKKworICByYXRlID0gaXJhdGU7CisgIGZvcm1hdCA9IHByb2JlLT5mb3JtYXQ7CisgIG5fY2hhbm5lbHMgPSBwcm9iZS0+bl9jaGFubmVsczsKKworICBHU1RfTE9HICgiY2hlY2tpbmcgZm9ybWF0ICVkLCBjaGFubmVscyAlZCwgcmF0ZSAlZCIsCisgICAgICBmb3JtYXQsIG5fY2hhbm5lbHMsIHJhdGUpOworICByZXQgPSBpb2N0bCAocHJvYmUtPmZkLCBTTkRDVExfRFNQX1NFVEZNVCwgJmZvcm1hdCk7CisgIGlmIChyZXQgPCAwIHx8IGZvcm1hdCAhPSBwcm9iZS0+Zm9ybWF0KSB7CisgICAgR1NUX0RFQlVHICgidW5zdXBwb3J0ZWQgZm9ybWF0OiAlZCAoJWQpIiwgcHJvYmUtPmZvcm1hdCwgZm9ybWF0KTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0ID0gaW9jdGwgKHByb2JlLT5mZCwgU05EQ1RMX0RTUF9DSEFOTkVMUywgJm5fY2hhbm5lbHMpOworICBpZiAocmV0IDwgMCB8fCBuX2NoYW5uZWxzICE9IHByb2JlLT5uX2NoYW5uZWxzKSB7CisgICAgR1NUX0RFQlVHICgidW5zdXBwb3J0ZWQgY2hhbm5lbHM6ICVkICglZCkiLCBwcm9iZS0+bl9jaGFubmVscywgbl9jaGFubmVscyk7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldCA9IGlvY3RsIChwcm9iZS0+ZmQsIFNORENUTF9EU1BfU1BFRUQsICZyYXRlKTsKKyAgaWYgKHJldCA8IDApIHsKKyAgICBHU1RfREVCVUcgKCJ1bnN1cHBvcnRlZCByYXRlOiAlZCAoJWQpIiwgaXJhdGUsIHJhdGUpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIEdTVF9ERUJVRyAoInJhdGUgJWQgLT4gJWQiLCBpcmF0ZSwgcmF0ZSk7CisKKyAgaWYgKHJhdGUgPT0gaXJhdGUgLSAxIHx8IHJhdGUgPT0gaXJhdGUgKyAxKSB7CisgICAgcmF0ZSA9IGlyYXRlOworICB9CisgIGdzdF9vc3NfaGVscGVyX3JhdGVfYWRkX3JhdGUgKHByb2JlLT5yYXRlcywgcmF0ZSk7CisgIHJldHVybiByYXRlOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zc19oZWxwZXJfcmF0ZV9hZGRfcmF0ZSAoR0FycmF5ICogYXJyYXksIGludCByYXRlKQoreworICBpbnQgaTsKKyAgaW50IHZhbDsKKworICBmb3IgKGkgPSAwOyBpIDwgYXJyYXktPmxlbjsgaSsrKSB7CisgICAgdmFsID0gZ19hcnJheV9pbmRleCAoYXJyYXksIGludCwgaSk7CisKKyAgICBpZiAodmFsID09IHJhdGUpCisgICAgICByZXR1cm47CisgIH0KKyAgR1NUX0RFQlVHICgic3VwcG9ydGVkIHJhdGU6ICVkIiwgcmF0ZSk7CisgIGdfYXJyYXlfYXBwZW5kX3ZhbCAoYXJyYXksIHJhdGUpOworfQorCitzdGF0aWMgaW50Citnc3Rfb3NzX2hlbHBlcl9yYXRlX2ludF9jb21wYXJlIChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYikKK3sKKyAgY29uc3QgaW50ICp2YSA9IChjb25zdCBpbnQgKikgYTsKKyAgY29uc3QgaW50ICp2YiA9IChjb25zdCBpbnQgKikgYjsKKworICBpZiAoKnZhIDwgKnZiKQorICAgIHJldHVybiAtMTsKKyAgaWYgKCp2YSA+ICp2YikKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK2djaGFyICoKK2dzdF9vc3NfaGVscGVyX2dldF9jYXJkX25hbWUgKGNvbnN0IGdjaGFyICogbWl4ZXJfbmFtZSkKK3sKKyNpZmRlZiBTT1VORF9NSVhFUl9JTkZPCisgIHN0cnVjdCBtaXhlcl9pbmZvIG1pbmZvOworI2VuZGlmCisgIGdpbnQgZmQ7CisgIGdjaGFyICpuYW1lID0gTlVMTDsKKworICBHU1RfSU5GTyAoIk9wZW5pbmcgbWl4ZXIgZm9yIGRldmljZSAlcyIsIG1peGVyX25hbWUpOworICBmZCA9IG9wZW4gKG1peGVyX25hbWUsIE9fUkRXUik7CisgIGlmIChmZCA9PSAtMSkKKyAgICBnb3RvIG9wZW5fZmFpbGVkOworCisgIC8qIGdldCBuYW1lLCBub3QgZmF0YWwgKi8KKyNpZmRlZiBTT1VORF9NSVhFUl9JTkZPCisgIGlmIChpb2N0bCAoZmQsIFNPVU5EX01JWEVSX0lORk8sICZtaW5mbykgPT0gMCkgeworICAgIG5hbWUgPSBnX3N0cmR1cCAobWluZm8ubmFtZSk7CisgICAgR1NUX0lORk8gKCJDYXJkIG5hbWUgPSAlcyIsIEdTVF9TVFJfTlVMTCAobmFtZSkpOworICB9IGVsc2UKKyNlbmRpZgorICB7CisgICAgbmFtZSA9IGdfc3RyZHVwICgiVW5rbm93biIpOworICAgIEdTVF9JTkZPICgiVW5rbm93biBjYXJkIG5hbWUiKTsKKyAgfQorCisgIGNsb3NlIChmZCk7CisgIHJldHVybiBuYW1lOworCisgIC8qIEVSUk9SUyAqLworb3Blbl9mYWlsZWQ6CisgIHsKKyAgICAvKiB0aGlzIGlzIHZhbGlkLiBPU1MgZGV2aWNlcyBkb24ndCBuZWVkIHRvIGV4cG9zZSBhIG1peGVyICovCisgICAgR1NUX0RFQlVHICgiRmFpbGVkIHRvIG9wZW4gbWl4ZXIgZGV2aWNlICVzLCBtaXhpbmcgZGlzYWJsZWQ6ICVzIiwKKyAgICAgICAgbWl4ZXJfbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KZGlmZiAtLWdpdCBhL3N5cy9vc3MvZ3N0b3NzaGVscGVyLmggYi9zeXMvb3NzL2dzdG9zc2hlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5Zjk5MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3NzL2dzdG9zc2hlbHBlci5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgICAgICAyMDAwIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BjaGVsbG8uYmU+CisgKgorICogZ3N0b3NzaGVscGVyLmg6IE9TUyBoZWxwZXIgcm91dGluZXMuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX09TU19IRUxQRVJfSF9fCisjZGVmaW5lIF9fR1NUX09TU19IRUxQRVJfSF9fCisKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgImdzdG9zc2hlbHBlci5oIgorCisKK0dfQkVHSU5fREVDTFMKKworCitHc3RDYXBzKiBnc3Rfb3NzX2hlbHBlcl9wcm9iZV9jYXBzIChnaW50IGZkKTsKKworZ2NoYXIgKmdzdF9vc3NfaGVscGVyX2dldF9jYXJkX25hbWUgKGNvbnN0IGdjaGFyICogbWl4ZXJfbmFtZSk7CisKKworCitHX0VORF9ERUNMUworCisKKyNlbmRpZiAvKiBfX0dTVF9PU1NfSEVMUEVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL29zcy9nc3Rvc3NzaW5rLmMgYi9zeXMvb3NzL2dzdG9zc3NpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTZiOGM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zcy9nc3Rvc3NzaW5rLmMKQEAgLTAsMCArMSw1NTYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgMjAwMCwyMDA1IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogZ3N0b3Nzc2luay5jOiAKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1vc3NzaW5rCisgKgorICogVGhpcyBlbGVtZW50IGxldHMgeW91IG91dHB1dCBzb3VuZCB1c2luZyB0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gKE9TUykuCisgKgorICogTm90ZSB0aGF0IHlvdSBzaG91bGQgYWxtb3N0IGFsd2F5cyB1c2UgZ2VuZXJpYyBhdWRpbyBjb252ZXJzaW9uIGVsZW1lbnRzCisgKiBsaWtlIGF1ZGlvY29udmVydCBhbmQgYXVkaW9yZXNhbXBsZSBpbiBmcm9udCBvZiBhbiBhdWRpb3NpbmsgdG8gbWFrZSBzdXJlCisgKiB5b3VyIHBpcGVsaW5lIHdvcmtzIHVuZGVyIGFsbCBjaXJjdW1zdGFuY2VzICh0aG9zZSBjb252ZXJzaW9uIGVsZW1lbnRzIHdpbGwKKyAqIGFjdCBpbiBwYXNzdGhyb3VnaC1tb2RlIGlmIG5vIGNvbnZlcnNpb24gaXMgbmVjZXNzYXJ5KS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyAhIGF1ZGlvY29udmVydCAhIHZvbHVtZSB2b2x1bWU9MC4xICEgb3Nzc2luaworICogXXwgd2lsbCBvdXRwdXQgYSBzaW5lIHdhdmUgKGNvbnRpbnVvdXMgYmVlcCBzb3VuZCkgdG8geW91ciBzb3VuZCBjYXJkICh3aXRoCisgKiBhIHZlcnkgbG93IHZvbHVtZSBhcyBwcmVjYXV0aW9uKS4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBmaWxlc3JjIGxvY2F0aW9uPW11c2ljLm9nZyAhIGRlY29kZWJpbiAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBvc3NzaW5rCisgKiBdfCB3aWxsIHBsYXkgYW4gT2dnL1ZvcmJpcyBhdWRpbyBmaWxlIGFuZCBvdXRwdXQgaXQgdXNpbmcgdGhlIE9wZW4gU291bmQgU3lzdGVtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgSEFWRV9PU1NfSU5DTFVERV9JTl9TWVMKKyMgaW5jbHVkZSA8c3lzL3NvdW5kY2FyZC5oPgorI2Vsc2UKKyMgaWZkZWYgSEFWRV9PU1NfSU5DTFVERV9JTl9ST09UCisjICBpbmNsdWRlIDxzb3VuZGNhcmQuaD4KKyMgZWxzZQorIyAgaWZkZWYgSEFWRV9PU1NfSU5DTFVERV9JTl9NQUNISU5FCisjICAgaW5jbHVkZSA8bWFjaGluZS9zb3VuZGNhcmQuaD4KKyMgIGVsc2UKKyMgICBlcnJvciAiV2hhdCB0byBpbmNsdWRlPyIKKyMgIGVuZGlmIC8qIEhBVkVfT1NTX0lOQ0xVREVfSU5fTUFDSElORSAqLworIyBlbmRpZiAvKiBIQVZFX09TU19JTkNMVURFX0lOX1JPT1QgKi8KKyNlbmRpZiAvKiBIQVZFX09TU19JTkNMVURFX0lOX1NZUyAqLworCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiZ3N0b3Nzc2luay5oIgorCisjaW5jbHVkZSA8Z3N0L2dzdC1pMThuLXBsdWdpbi5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfRVhURVJOIChvc3NfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgb3NzX2RlYnVnCisKK3N0YXRpYyB2b2lkIGdzdF9vc3Nfc2lua19kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyB2b2lkIGdzdF9vc3Nfc2lua19maW5hbGlzZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyB2b2lkIGdzdF9vc3Nfc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3Rfb3NzX3Npbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0Q2FwcyAqZ3N0X29zc19zaW5rX2dldGNhcHMgKEdzdEJhc2VTaW5rICogYnNpbmssIEdzdENhcHMgKiBmaWx0ZXIpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zc19zaW5rX29wZW4gKEdzdEF1ZGlvU2luayAqIGFzaW5rKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3NzX3NpbmtfY2xvc2UgKEdzdEF1ZGlvU2luayAqIGFzaW5rKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3NzX3NpbmtfcHJlcGFyZSAoR3N0QXVkaW9TaW5rICogYXNpbmssCisgICAgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpOworc3RhdGljIGdib29sZWFuIGdzdF9vc3Nfc2lua191bnByZXBhcmUgKEdzdEF1ZGlvU2luayAqIGFzaW5rKTsKK3N0YXRpYyBnaW50IGdzdF9vc3Nfc2lua193cml0ZSAoR3N0QXVkaW9TaW5rICogYXNpbmssIGdwb2ludGVyIGRhdGEsCisgICAgZ3VpbnQgbGVuZ3RoKTsKK3N0YXRpYyBndWludCBnc3Rfb3NzX3NpbmtfZGVsYXkgKEdzdEF1ZGlvU2luayAqIGFzaW5rKTsKK3N0YXRpYyB2b2lkIGdzdF9vc3Nfc2lua19yZXNldCAoR3N0QXVkaW9TaW5rICogYXNpbmspOworCisvKiBPc3NTaW5rIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgTEFTVF9TSUdOQUwKK307CisKKyNkZWZpbmUgREVGQVVMVF9ERVZJQ0UgICIvZGV2L2RzcCIKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0RFVklDRSwKK307CisKKyNkZWZpbmUgRk9STUFUUyAieyIgR1NUX0FVRElPX05FKFMxNikiLCJHU1RfQVVESU9fTkUoVTE2KSIsIFM4LCBVOCB9IgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgb3Nzc2lua19zaW5rX2ZhY3RvcnkgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEZPUk1BVFMgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDE7ICIKKyAgICAgICAgImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEZPUk1BVFMgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDIsICIgImNoYW5uZWwtbWFzayA9IChiaXRtYXNrKSAweDMiKQorICAgICk7CisKKy8qIHN0YXRpYyBndWludCBnc3Rfb3NzX3Npbmtfc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAgfTsgKi8KKworI2RlZmluZSBnc3Rfb3NzX3NpbmtfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0T3NzU2luaywgZ3N0X29zc19zaW5rLCBHU1RfVFlQRV9BVURJT19TSU5LKTsKKworc3RhdGljIHZvaWQKK2dzdF9vc3Nfc2lua19kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RPc3NTaW5rICpvc3NzaW5rID0gR1NUX09TU1NJTksgKG9iamVjdCk7CisKKyAgaWYgKG9zc3NpbmstPnByb2JlZF9jYXBzKSB7CisgICAgZ3N0X2NhcHNfdW5yZWYgKG9zc3NpbmstPnByb2JlZF9jYXBzKTsKKyAgICBvc3NzaW5rLT5wcm9iZWRfY2FwcyA9IE5VTEw7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3Nfc2lua19jbGFzc19pbml0IChHc3RPc3NTaW5rQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEJhc2VTaW5rQ2xhc3MgKmdzdGJhc2VzaW5rX2NsYXNzOworICBHc3RBdWRpb1NpbmtDbGFzcyAqZ3N0YXVkaW9zaW5rX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MgPSAoR3N0QmFzZVNpbmtDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YXVkaW9zaW5rX2NsYXNzID0gKEdzdEF1ZGlvU2lua0NsYXNzICopIGtsYXNzOworCisgIHBhcmVudF9jbGFzcyA9IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3Rfb3NzX3NpbmtfZGlzcG9zZTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3Rfb3NzX3NpbmtfZmluYWxpc2U7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9vc3Nfc2lua19nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9vc3Nfc2lua19zZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ERVZJQ0UsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZGV2aWNlIiwgIkRldmljZSIsCisgICAgICAgICAgIk9TUyBkZXZpY2UgKHVzdWFsbHkgL2Rldi9kc3BOKSIsIERFRkFVTFRfREVWSUNFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdGJhc2VzaW5rX2NsYXNzLT5nZXRfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzX3NpbmtfZ2V0Y2Fwcyk7CisKKyAgZ3N0YXVkaW9zaW5rX2NsYXNzLT5vcGVuID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3Nfc2lua19vcGVuKTsKKyAgZ3N0YXVkaW9zaW5rX2NsYXNzLT5jbG9zZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzX3NpbmtfY2xvc2UpOworICBnc3RhdWRpb3NpbmtfY2xhc3MtPnByZXBhcmUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zc19zaW5rX3ByZXBhcmUpOworICBnc3RhdWRpb3NpbmtfY2xhc3MtPnVucHJlcGFyZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzX3NpbmtfdW5wcmVwYXJlKTsKKyAgZ3N0YXVkaW9zaW5rX2NsYXNzLT53cml0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzX3Npbmtfd3JpdGUpOworICBnc3RhdWRpb3NpbmtfY2xhc3MtPmRlbGF5ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3Nfc2lua19kZWxheSk7CisgIGdzdGF1ZGlvc2lua19jbGFzcy0+cmVzZXQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zc19zaW5rX3Jlc2V0KTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiQXVkaW8gU2luayAoT1NTKSIsCisgICAgICAiU2luay9BdWRpbyIsCisgICAgICAiT3V0cHV0IHRvIGEgc291bmQgY2FyZCB2aWEgT1NTIiwKKyAgICAgICJFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PiwgIgorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BjaGVsbG8uYmU+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmb3Nzc2lua19zaW5rX2ZhY3RvcnkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zc19zaW5rX2luaXQgKEdzdE9zc1NpbmsgKiBvc3NzaW5rKQoreworICBjb25zdCBnY2hhciAqZGV2aWNlOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG9zc3NpbmssICJpbml0aWFsaXppbmcgb3Nzc2luayIpOworCisgIGRldmljZSA9IGdfZ2V0ZW52ICgiQVVESU9ERVYiKTsKKyAgaWYgKGRldmljZSA9PSBOVUxMKQorICAgIGRldmljZSA9IERFRkFVTFRfREVWSUNFOworICBvc3NzaW5rLT5kZXZpY2UgPSBnX3N0cmR1cCAoZGV2aWNlKTsKKyAgb3Nzc2luay0+ZmQgPSAtMTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3Nfc2lua19maW5hbGlzZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0T3NzU2luayAqb3Nzc2luayA9IEdTVF9PU1NTSU5LIChvYmplY3QpOworCisgIGdfZnJlZSAob3Nzc2luay0+ZGV2aWNlKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKChHT2JqZWN0ICopIChvYmplY3QpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3Nfc2lua19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0T3NzU2luayAqc2luazsKKworICBzaW5rID0gR1NUX09TU1NJTksgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RFVklDRToKKyAgICAgIGdfZnJlZSAoc2luay0+ZGV2aWNlKTsKKyAgICAgIHNpbmstPmRldmljZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgaWYgKHNpbmstPnByb2JlZF9jYXBzKSB7CisgICAgICAgIGdzdF9jYXBzX3VucmVmIChzaW5rLT5wcm9iZWRfY2Fwcyk7CisgICAgICAgIHNpbmstPnByb2JlZF9jYXBzID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3Nfc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0T3NzU2luayAqc2luazsKKworICBzaW5rID0gR1NUX09TU1NJTksgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RFVklDRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNpbmstPmRldmljZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9vc3Nfc2lua19nZXRjYXBzIChHc3RCYXNlU2luayAqIGJzaW5rLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RPc3NTaW5rICpvc3NzaW5rOworICBHc3RDYXBzICpjYXBzOworCisgIG9zc3NpbmsgPSBHU1RfT1NTU0lOSyAoYnNpbmspOworCisgIGlmIChvc3NzaW5rLT5mZCA9PSAtMSkgeworICAgIGNhcHMgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX0JBU0VfU0lOS19QQUQgKGJzaW5rKSk7CisgIH0gZWxzZSBpZiAob3Nzc2luay0+cHJvYmVkX2NhcHMpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfcmVmIChvc3NzaW5rLT5wcm9iZWRfY2Fwcyk7CisgIH0gZWxzZSB7CisgICAgY2FwcyA9IGdzdF9vc3NfaGVscGVyX3Byb2JlX2NhcHMgKG9zc3NpbmstPmZkKTsKKyAgICBpZiAoY2FwcyAmJiAhZ3N0X2NhcHNfaXNfZW1wdHkgKGNhcHMpKSB7CisgICAgICBvc3NzaW5rLT5wcm9iZWRfY2FwcyA9IGdzdF9jYXBzX3JlZiAoY2Fwcyk7CisgICAgfQorICB9CisKKyAgaWYgKGZpbHRlciAmJiBjYXBzKSB7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uOworCisgICAgaW50ZXJzZWN0aW9uID0KKyAgICAgICAgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgY2FwcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgcmV0dXJuIGludGVyc2VjdGlvbjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gY2FwczsKKyAgfQorfQorCitzdGF0aWMgZ2ludAoraWxvZzIgKGdpbnQgeCkKK3sKKyAgLyogd2VsbC4uLiBoYWNrZXIncyBkZWxpZ2h0IGV4cGxhaW5zLi4uICovCisgIHggPSB4IHwgKHggPj4gMSk7CisgIHggPSB4IHwgKHggPj4gMik7CisgIHggPSB4IHwgKHggPj4gNCk7CisgIHggPSB4IHwgKHggPj4gOCk7CisgIHggPSB4IHwgKHggPj4gMTYpOworICB4ID0geCAtICgoeCA+PiAxKSAmIDB4NTU1NTU1NTUpOworICB4ID0gKHggJiAweDMzMzMzMzMzKSArICgoeCA+PiAyKSAmIDB4MzMzMzMzMzMpOworICB4ID0gKHggKyAoeCA+PiA0KSkgJiAweDBmMGYwZjBmOworICB4ID0geCArICh4ID4+IDgpOworICB4ID0geCArICh4ID4+IDE2KTsKKyAgcmV0dXJuICh4ICYgMHgwMDAwMDAzZikgLSAxOworfQorCitzdGF0aWMgZ2ludAorZ3N0X29zc19zaW5rX2dldF9mb3JtYXQgKEdzdEF1ZGlvUmluZ0J1ZmZlckZvcm1hdFR5cGUgZm10LCBHc3RBdWRpb0Zvcm1hdCByZm10KQoreworICBnaW50IHJlc3VsdDsKKworICBzd2l0Y2ggKGZtdCkgeworICAgIGNhc2UgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX01VX0xBVzoKKyAgICAgIHJlc3VsdCA9IEFGTVRfTVVfTEFXOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfQV9MQVc6CisgICAgICByZXN1bHQgPSBBRk1UX0FfTEFXOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfSU1BX0FEUENNOgorICAgICAgcmVzdWx0ID0gQUZNVF9JTUFfQURQQ007CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9NUEVHOgorICAgICAgcmVzdWx0ID0gQUZNVF9NUEVHOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfUkFXOgorICAgIHsKKyAgICAgIHN3aXRjaCAocmZtdCkgeworICAgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfVTg6CisgICAgICAgICAgcmVzdWx0ID0gQUZNVF9VODsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MxNkxFOgorICAgICAgICAgIHJlc3VsdCA9IEFGTVRfUzE2X0xFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzE2QkU6CisgICAgICAgICAgcmVzdWx0ID0gQUZNVF9TMTZfQkU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TODoKKyAgICAgICAgICByZXN1bHQgPSBBRk1UX1M4OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfVTE2TEU6CisgICAgICAgICAgcmVzdWx0ID0gQUZNVF9VMTZfTEU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9VMTZCRToKKyAgICAgICAgICByZXN1bHQgPSBBRk1UX1UxNl9CRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXN1bHQgPSAwOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3NzX3Npbmtfb3BlbiAoR3N0QXVkaW9TaW5rICogYXNpbmspCit7CisgIEdzdE9zc1NpbmsgKm9zczsKKyAgaW50IG1vZGU7CisKKyAgb3NzID0gR1NUX09TU1NJTksgKGFzaW5rKTsKKworICBtb2RlID0gT19XUk9OTFk7CisgIG1vZGUgfD0gT19OT05CTE9DSzsKKworICBvc3MtPmZkID0gb3BlbiAob3NzLT5kZXZpY2UsIG1vZGUsIDApOworICBpZiAob3NzLT5mZCA9PSAtMSkgeworICAgIHN3aXRjaCAoZXJybm8pIHsKKyAgICAgIGNhc2UgRUJVU1k6CisgICAgICAgIGdvdG8gYnVzeTsKKyAgICAgIGNhc2UgRUFDQ0VTOgorICAgICAgICBnb3RvIG5vX3Blcm1pc3Npb247CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIG9wZW5fZmFpbGVkOworICAgIH0KKyAgfQorCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworYnVzeToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChvc3MsIFJFU09VUkNFLCBCVVNZLAorICAgICAgICAoXygiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gIgorICAgICAgICAgICAgICAgICJEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyIGFwcGxpY2F0aW9uLiIpKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX3Blcm1pc3Npb246CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAob3NzLCBSRVNPVVJDRSwgT1BFTl9XUklURSwKKyAgICAgICAgKF8oIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suICIKKyAgICAgICAgICAgICAgICAiWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuIHRoZSBkZXZpY2UuIikpLAorICAgICAgICBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK29wZW5fZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9zcywgUkVTT1VSQ0UsIE9QRU5fV1JJVEUsCisgICAgICAgIChfKCJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIpKSwgR1NUX0VSUk9SX1NZU1RFTSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zc19zaW5rX2Nsb3NlIChHc3RBdWRpb1NpbmsgKiBhc2luaykKK3sKKyAgY2xvc2UgKEdTVF9PU1NTSU5LIChhc2luayktPmZkKTsKKyAgR1NUX09TU1NJTksgKGFzaW5rKS0+ZmQgPSAtMTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zc19zaW5rX3ByZXBhcmUgKEdzdEF1ZGlvU2luayAqIGFzaW5rLCBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYykKK3sKKyAgR3N0T3NzU2luayAqb3NzOworICBzdHJ1Y3QgYXVkaW9fYnVmX2luZm8gaW5mbzsKKyAgaW50IG1vZGU7CisgIGludCB0bXA7CisgIGd1aW50IHdpZHRoLCByYXRlLCBjaGFubmVsczsKKworICBvc3MgPSBHU1RfT1NTU0lOSyAoYXNpbmspOworCisgIC8qIHdlIG9wZW5lZCBub24tYmxvY2tpbmcgc28gdGhhdCB3ZSBjYW4gZGV0ZWN0IGlmIHRoZSBkZXZpY2UgaXMgYXZhaWxhYmxlCisgICAqIHdpdGhvdXQgaGFuZ2luZyBmb3JldmVyLiBXZSBub3cgd2FudCB0byByZW1vdmUgdGhlIG5vbi1ibG9ja2luZyBmbGFnLiAqLworICBtb2RlID0gZmNudGwgKG9zcy0+ZmQsIEZfR0VURkwpOworICBtb2RlICY9IH5PX05PTkJMT0NLOworICBpZiAoZmNudGwgKG9zcy0+ZmQsIEZfU0VURkwsIG1vZGUpID09IC0xKSB7CisgICAgLyogc29tZSBkcml2ZXJzIGRvIG5vIHN1cHBvcnQgdW5zZXR0aW5nIHRoZSBub24tYmxvY2tpbmcgZmxhZywgdHJ5IHRvCisgICAgICogY2xvc2Uvb3BlbiB0aGUgZGV2aWNlIHRoZW4uIFRoaXMgaXMgcmFjeSBidXQgd2UgZXJyb3Igb3V0IHByb3Blcmx5LiAqLworICAgIGdzdF9vc3Nfc2lua19jbG9zZSAoYXNpbmspOworICAgIGlmICgob3NzLT5mZCA9IG9wZW4gKG9zcy0+ZGV2aWNlLCBPX1dST05MWSwgMCkpID09IC0xKQorICAgICAgZ290byBub25fYmxvY2s7CisgIH0KKworICB0bXAgPSBnc3Rfb3NzX3NpbmtfZ2V0X2Zvcm1hdCAoc3BlYy0+dHlwZSwKKyAgICAgIEdTVF9BVURJT19JTkZPX0ZPUk1BVCAoJnNwZWMtPmluZm8pKTsKKyAgaWYgKHRtcCA9PSAwKQorICAgIGdvdG8gd3JvbmdfZm9ybWF0OworCisgIHdpZHRoID0gR1NUX0FVRElPX0lORk9fV0lEVEggKCZzcGVjLT5pbmZvKTsKKyAgcmF0ZSA9IEdTVF9BVURJT19JTkZPX1JBVEUgKCZzcGVjLT5pbmZvKTsKKyAgY2hhbm5lbHMgPSBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJnNwZWMtPmluZm8pOworCisgIGlmICh3aWR0aCAhPSAxNiAmJiB3aWR0aCAhPSA4KQorICAgIGdvdG8gZG9kZ3lfd2lkdGg7CisKKyAgU0VUX1BBUkFNIChvc3MsIFNORENUTF9EU1BfU0VURk1ULCB0bXAsICJTRVRGTVQiKTsKKyAgaWYgKGNoYW5uZWxzID09IDIpCisgICAgU0VUX1BBUkFNIChvc3MsIFNORENUTF9EU1BfU1RFUkVPLCAxLCAiU1RFUkVPIik7CisgIFNFVF9QQVJBTSAob3NzLCBTTkRDVExfRFNQX0NIQU5ORUxTLCBjaGFubmVscywgIkNIQU5ORUxTIik7CisgIFNFVF9QQVJBTSAob3NzLCBTTkRDVExfRFNQX1NQRUVELCByYXRlLCAiU1BFRUQiKTsKKworICB0bXAgPSBpbG9nMiAoc3BlYy0+c2Vnc2l6ZSk7CisgIHRtcCA9ICgoc3BlYy0+c2VndG90YWwgJiAweDdmZmYpIDw8IDE2KSB8IHRtcDsKKyAgR1NUX0RFQlVHX09CSkVDVCAob3NzLCAic2V0IHNlZ3NpemU6ICVkLCBzZWd0b3RhbDogJWQsIHZhbHVlOiAlMDh4IiwKKyAgICAgIHNwZWMtPnNlZ3NpemUsIHNwZWMtPnNlZ3RvdGFsLCB0bXApOworCisgIFNFVF9QQVJBTSAob3NzLCBTTkRDVExfRFNQX1NFVEZSQUdNRU5ULCB0bXAsICJTRVRGUkFHTUVOVCIpOworICBHRVRfUEFSQU0gKG9zcywgU05EQ1RMX0RTUF9HRVRPU1BBQ0UsICZpbmZvLCAiR0VUT1NQQUNFIik7CisKKyAgc3BlYy0+c2Vnc2l6ZSA9IGluZm8uZnJhZ3NpemU7CisgIHNwZWMtPnNlZ3RvdGFsID0gaW5mby5mcmFnc3RvdGFsOworCisgIG9zcy0+Ynl0ZXNfcGVyX3NhbXBsZSA9IEdTVF9BVURJT19JTkZPX0JQRiAoJnNwZWMtPmluZm8pOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG9zcywgImdvdCBzZWdzaXplOiAlZCwgc2VndG90YWw6ICVkLCB2YWx1ZTogJTA4eCIsCisgICAgICBzcGVjLT5zZWdzaXplLCBzcGVjLT5zZWd0b3RhbCwgdG1wKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK25vbl9ibG9jazoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChvc3MsIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAoIlVuYWJsZSB0byBzZXQgZGV2aWNlICVzIGluIG5vbiBibG9ja2luZyBtb2RlOiAlcyIsCisgICAgICAgICAgICBvc3MtPmRldmljZSwgZ19zdHJlcnJvciAoZXJybm8pKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit3cm9uZ19mb3JtYXQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAob3NzLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJVbmFibGUgdG8gZ2V0IGZvcm1hdCAoJWQsICVkKSIsIHNwZWMtPnR5cGUsCisgICAgICAgICAgICBHU1RfQVVESU9fSU5GT19GT1JNQVQgKCZzcGVjLT5pbmZvKSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorZG9kZ3lfd2lkdGg6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAob3NzLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJ1bmV4cGVjdGVkIHdpZHRoICVkIiwgd2lkdGgpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3NzX3NpbmtfdW5wcmVwYXJlIChHc3RBdWRpb1NpbmsgKiBhc2luaykKK3sKKyAgLyogY291bGQgZG8gYSBTTkRDVExfRFNQX1JFU0VULCBidXQgdGhlIE9TUyBtYW51YWwgcmVjb21tZW5kcyBhIGNsb3NlL29wZW4gKi8KKworICBpZiAoIWdzdF9vc3Nfc2lua19jbG9zZSAoYXNpbmspKQorICAgIGdvdG8gY291bGRudF9jbG9zZTsKKworICBpZiAoIWdzdF9vc3Nfc2lua19vcGVuIChhc2luaykpCisgICAgZ290byBjb3VsZG50X3Jlb3BlbjsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2NvdWxkbnRfY2xvc2U6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhc2luaywgIkNvdWxkIG5vdCBjbG9zZSB0aGUgYXVkaW8gZGV2aWNlIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citjb3VsZG50X3Jlb3BlbjoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFzaW5rLCAiQ291bGQgbm90IHJlb3BlbiB0aGUgYXVkaW8gZGV2aWNlIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnaW50Citnc3Rfb3NzX3Npbmtfd3JpdGUgKEdzdEF1ZGlvU2luayAqIGFzaW5rLCBncG9pbnRlciBkYXRhLCBndWludCBsZW5ndGgpCit7CisgIHJldHVybiB3cml0ZSAoR1NUX09TU1NJTksgKGFzaW5rKS0+ZmQsIGRhdGEsIGxlbmd0aCk7Cit9CisKK3N0YXRpYyBndWludAorZ3N0X29zc19zaW5rX2RlbGF5IChHc3RBdWRpb1NpbmsgKiBhc2luaykKK3sKKyAgR3N0T3NzU2luayAqb3NzOworICBnaW50IGRlbGF5ID0gMDsKKyAgZ2ludCByZXQ7CisKKyAgb3NzID0gR1NUX09TU1NJTksgKGFzaW5rKTsKKworI2lmZGVmIFNORENUTF9EU1BfR0VUT0RFTEFZCisgIHJldCA9IGlvY3RsIChvc3MtPmZkLCBTTkRDVExfRFNQX0dFVE9ERUxBWSwgJmRlbGF5KTsKKyNlbHNlCisgIHJldCA9IC0xOworI2VuZGlmCisgIGlmIChyZXQgPCAwKSB7CisgICAgYXVkaW9fYnVmX2luZm8gaW5mbzsKKworICAgIHJldCA9IGlvY3RsIChvc3MtPmZkLCBTTkRDVExfRFNQX0dFVE9TUEFDRSwgJmluZm8pOworCisgICAgZGVsYXkgPSAocmV0IDwgMCA/IDAgOiAoaW5mby5mcmFnc3RvdGFsICogaW5mby5mcmFnc2l6ZSkgLSBpbmZvLmJ5dGVzKTsKKyAgfQorICByZXR1cm4gZGVsYXkgLyBvc3MtPmJ5dGVzX3Blcl9zYW1wbGU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzX3NpbmtfcmVzZXQgKEdzdEF1ZGlvU2luayAqIGFzaW5rKQoreworICAvKiBUaGVyZSdzIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUgcmVhbGx5OiBPU1MgY2FuJ3QgaGFuZGxlIGFjY2VzcyB0byB0aGUKKyAgICogc2FtZSBkZXZpY2UvZmQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIGFuZCBtaWdodCBkZWFkbG9jayBvciBibG93IHVwIGluCisgICAqIG90aGVyIHdheXMgaWYgd2UgdHJ5IGFuIGlvY3RsIFNORENUTF9EU1BfUkVTRVQgb3Igc2ltaWxhciAqLworfQpkaWZmIC0tZ2l0IGEvc3lzL29zcy9nc3Rvc3NzaW5rLmggYi9zeXMvb3NzL2dzdG9zc3NpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTc0ZGYxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zcy9nc3Rvc3NzaW5rLmgKQEAgLTAsMCArMSw2MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICAgICAgIDIwMDAgV2ltIFRheW1hbnMgPHd0YXlAY2hlbGxvLmJlPgorICoKKyAqIGdzdG9zc3NpbmsuaDogCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX09TU1NJTktfSF9fCisjZGVmaW5lIF9fR1NUX09TU1NJTktfSF9fCisKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9zaW5rLmg+CisKKyNpbmNsdWRlICJnc3Rvc3NoZWxwZXIuaCIKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX09TU1NJTksgICAgICAgICAgICAoZ3N0X29zc19zaW5rX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9PU1NTSU5LKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfT1NTU0lOSyxHc3RPc3NTaW5rKSkKKyNkZWZpbmUgR1NUX09TU1NJTktfQ0xBU1Moa2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX09TU1NJTkssR3N0T3NzU2lua0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX09TU1NJTksob2JqKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9PU1NTSU5LKSkKKyNkZWZpbmUgR1NUX0lTX09TU1NJTktfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX09TU1NJTkspKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0T3NzU2luayBHc3RPc3NTaW5rOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9zc1NpbmtDbGFzcyBHc3RPc3NTaW5rQ2xhc3M7CisKK3N0cnVjdCBfR3N0T3NzU2luayB7CisgIEdzdEF1ZGlvU2luayAgICBzaW5rOworCisgIGdjaGFyICpkZXZpY2U7CisgIGdpbnQgICBmZDsKKyAgZ2ludCAgIGJ5dGVzX3Blcl9zYW1wbGU7CisKKyAgR3N0Q2FwcyAqcHJvYmVkX2NhcHM7Cit9OworCitzdHJ1Y3QgX0dzdE9zc1NpbmtDbGFzcyB7CisgIEdzdEF1ZGlvU2lua0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9vc3Nfc2lua19nZXRfdHlwZSh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX09TU1NJTktfSF9fICovCmRpZmYgLS1naXQgYS9zeXMvb3NzL2dzdG9zc3NyYy5jIGIvc3lzL29zcy9nc3Rvc3NzcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTIzYWQyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zcy9nc3Rvc3NzcmMuYwpAQCAtMCwwICsxLDU0NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICAyMDAwLDIwMDUgV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBnc3Rvc3NzcmMuYzogCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtb3Nzc3JjCisgKgorICogVGhpcyBlbGVtZW50IGxldHMgeW91IHJlY29yZCBzb3VuZCB1c2luZyB0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gKE9TUykuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBvc3NzcmMgISBhdWRpb2NvbnZlcnQgISB2b3JiaXNlbmMgISBvZ2dtdXggISBmaWxlc2luayBsb2NhdGlvbj1teW11c2ljLm9nZworICogXXwgd2lsbCByZWNvcmQgc291bmQgZnJvbSB5b3VyIHNvdW5kIGNhcmQgdXNpbmcgT1NTIGFuZCBlbmNvZGUgaXQgdG8gYW4KKyAqIE9nZy9Wb3JiaXMgZmlsZSAodGhpcyB3aWxsIG9ubHkgd29yayBpZiB5b3VyIG1peGVyIHNldHRpbmdzIGFyZSByaWdodAorICogYW5kIHRoZSByaWdodCBpbnB1dHMgZW5hYmxlZCBldGMuKQorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBIQVZFX09TU19JTkNMVURFX0lOX1NZUworIyBpbmNsdWRlIDxzeXMvc291bmRjYXJkLmg+CisjZWxzZQorIyBpZmRlZiBIQVZFX09TU19JTkNMVURFX0lOX1JPT1QKKyMgIGluY2x1ZGUgPHNvdW5kY2FyZC5oPgorIyBlbHNlCisjICBpZmRlZiBIQVZFX09TU19JTkNMVURFX0lOX01BQ0hJTkUKKyMgICBpbmNsdWRlIDxtYWNoaW5lL3NvdW5kY2FyZC5oPgorIyAgZWxzZQorIyAgIGVycm9yICJXaGF0IHRvIGluY2x1ZGU/IgorIyAgZW5kaWYgLyogSEFWRV9PU1NfSU5DTFVERV9JTl9NQUNISU5FICovCisjIGVuZGlmIC8qIEhBVkVfT1NTX0lOQ0xVREVfSU5fUk9PVCAqLworI2VuZGlmIC8qIEhBVkVfT1NTX0lOQ0xVREVfSU5fU1lTICovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJnc3Rvc3NzcmMuaCIKKworI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX0VYVEVSTiAob3NzX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIG9zc19kZWJ1ZworCisjZGVmaW5lIERFRkFVTFRfREVWSUNFICAgICAgICAgICIvZGV2L2RzcCIKKyNkZWZpbmUgREVGQVVMVF9ERVZJQ0VfTkFNRSAgICAgIiIKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfREVWSUNFLAorICBQUk9QX0RFVklDRV9OQU1FLAorfTsKKworI2RlZmluZSBnc3Rfb3NzX3NyY19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RPc3NTcmMsIGdzdF9vc3Nfc3JjLCBHU1RfVFlQRV9BVURJT19TUkMpOworCitzdGF0aWMgdm9pZCBnc3Rfb3NzX3NyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3Rfb3NzX3NyY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyB2b2lkIGdzdF9vc3Nfc3JjX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X29zc19zcmNfZmluYWxpemUgKEdzdE9zc1NyYyAqIG9zc3NyYyk7CisKK3N0YXRpYyBHc3RDYXBzICpnc3Rfb3NzX3NyY19nZXRjYXBzIChHc3RCYXNlU3JjICogYnNyYywgR3N0Q2FwcyAqIGZpbHRlcik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3NzX3NyY19vcGVuIChHc3RBdWRpb1NyYyAqIGFzcmMpOworc3RhdGljIGdib29sZWFuIGdzdF9vc3Nfc3JjX2Nsb3NlIChHc3RBdWRpb1NyYyAqIGFzcmMpOworc3RhdGljIGdib29sZWFuIGdzdF9vc3Nfc3JjX3ByZXBhcmUgKEdzdEF1ZGlvU3JjICogYXNyYywKKyAgICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zc19zcmNfdW5wcmVwYXJlIChHc3RBdWRpb1NyYyAqIGFzcmMpOworc3RhdGljIGd1aW50IGdzdF9vc3Nfc3JjX3JlYWQgKEdzdEF1ZGlvU3JjICogYXNyYywgZ3BvaW50ZXIgZGF0YSwgZ3VpbnQgbGVuZ3RoLAorICAgIEdzdENsb2NrVGltZSAqIHRpbWVzdGFtcCk7CitzdGF0aWMgZ3VpbnQgZ3N0X29zc19zcmNfZGVsYXkgKEdzdEF1ZGlvU3JjICogYXNyYyk7CitzdGF0aWMgdm9pZCBnc3Rfb3NzX3NyY19yZXNldCAoR3N0QXVkaW9TcmMgKiBhc3JjKTsKKworI2RlZmluZSBGT1JNQVRTICJ7IiBHU1RfQVVESU9fTkUoUzE2KSIsIkdTVF9BVURJT19ORShVMTYpIiwgUzgsIFU4IH0iCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBvc3NzcmNfc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgRk9STUFUUyAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMTsgIgorICAgICAgICAiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgRk9STUFUUyAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMiwgIiAiY2hhbm5lbC1tYXNrID0gKGJpdG1hc2spIDB4MyIpCisgICAgKTsKKworc3RhdGljIHZvaWQKK2dzdF9vc3Nfc3JjX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zc19zcmNfY2xhc3NfaW5pdCAoR3N0T3NzU3JjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEJhc2VTcmNDbGFzcyAqZ3N0YmFzZXNyY19jbGFzczsKKyAgR3N0QXVkaW9TcmNDbGFzcyAqZ3N0YXVkaW9zcmNfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RiYXNlc3JjX2NsYXNzID0gKEdzdEJhc2VTcmNDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YXVkaW9zcmNfY2xhc3MgPSAoR3N0QXVkaW9TcmNDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X29zc19zcmNfZGlzcG9zZTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSAoR09iamVjdEZpbmFsaXplRnVuYykgZ3N0X29zc19zcmNfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9vc3Nfc3JjX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X29zc19zcmNfc2V0X3Byb3BlcnR5OworCisgIGdzdGJhc2VzcmNfY2xhc3MtPmdldF9jYXBzID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3Nfc3JjX2dldGNhcHMpOworCisgIGdzdGF1ZGlvc3JjX2NsYXNzLT5vcGVuID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3Nfc3JjX29wZW4pOworICBnc3RhdWRpb3NyY19jbGFzcy0+cHJlcGFyZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzX3NyY19wcmVwYXJlKTsKKyAgZ3N0YXVkaW9zcmNfY2xhc3MtPnVucHJlcGFyZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzX3NyY191bnByZXBhcmUpOworICBnc3RhdWRpb3NyY19jbGFzcy0+Y2xvc2UgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zc19zcmNfY2xvc2UpOworICBnc3RhdWRpb3NyY19jbGFzcy0+cmVhZCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzX3NyY19yZWFkKTsKKyAgZ3N0YXVkaW9zcmNfY2xhc3MtPmRlbGF5ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3Nfc3JjX2RlbGF5KTsKKyAgZ3N0YXVkaW9zcmNfY2xhc3MtPnJlc2V0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3Nfc3JjX3Jlc2V0KTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RFVklDRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJkZXZpY2UiLCAiRGV2aWNlIiwKKyAgICAgICAgICAiT1NTIGRldmljZSAodXN1YWxseSAvZGV2L2RzcE4pIiwgREVGQVVMVF9ERVZJQ0UsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ERVZJQ0VfTkFNRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJkZXZpY2UtbmFtZSIsICJEZXZpY2UgbmFtZSIsCisgICAgICAgICAgIkh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHNvdW5kIGRldmljZSIsIERFRkFVTFRfREVWSUNFX05BTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJBdWRpbyBTb3VyY2UgKE9TUykiLAorICAgICAgIlNvdXJjZS9BdWRpbyIsCisgICAgICAiQ2FwdHVyZSBmcm9tIGEgc291bmQgY2FyZCB2aWEgT1NTIiwKKyAgICAgICJFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PiwgIiAiV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZvc3NzcmNfc3JjX2ZhY3RvcnkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zc19zcmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE9zc1NyYyAqc3JjOworCisgIHNyYyA9IEdTVF9PU1NfU1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9ERVZJQ0U6CisgICAgICBnX2ZyZWUgKHNyYy0+ZGV2aWNlKTsKKyAgICAgIHNyYy0+ZGV2aWNlID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzX3NyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0T3NzU3JjICpzcmM7CisKKyAgc3JjID0gR1NUX09TU19TUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RFVklDRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNyYy0+ZGV2aWNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ERVZJQ0VfTkFNRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNyYy0+ZGV2aWNlX25hbWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X29zc19zcmNfaW5pdCAoR3N0T3NzU3JjICogb3Nzc3JjKQoreworICBjb25zdCBnY2hhciAqZGV2aWNlOworCisgIEdTVF9ERUJVRyAoImluaXRpYWxpemluZyBvc3NzcmMiKTsKKworICBkZXZpY2UgPSBnX2dldGVudiAoIkFVRElPREVWIik7CisgIGlmIChkZXZpY2UgPT0gTlVMTCkKKyAgICBkZXZpY2UgPSBERUZBVUxUX0RFVklDRTsKKworICBvc3NzcmMtPmZkID0gLTE7CisgIG9zc3NyYy0+ZGV2aWNlID0gZ19zdHJkdXAgKGRldmljZSk7CisgIG9zc3NyYy0+ZGV2aWNlX25hbWUgPSBnX3N0cmR1cCAoREVGQVVMVF9ERVZJQ0VfTkFNRSk7CisgIG9zc3NyYy0+cHJvYmVkX2NhcHMgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zc19zcmNfZmluYWxpemUgKEdzdE9zc1NyYyAqIG9zc3NyYykKK3sKKyAgZ19mcmVlIChvc3NzcmMtPmRldmljZSk7CisgIGdfZnJlZSAob3Nzc3JjLT5kZXZpY2VfbmFtZSk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplICgoR09iamVjdCAqKSAob3Nzc3JjKSk7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9vc3Nfc3JjX2dldGNhcHMgKEdzdEJhc2VTcmMgKiBic3JjLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RPc3NTcmMgKm9zc3NyYzsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBvc3NzcmMgPSBHU1RfT1NTX1NSQyAoYnNyYyk7CisKKyAgaWYgKG9zc3NyYy0+ZmQgPT0gLTEpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChvc3NzcmMsICJkZXZpY2Ugbm90IG9wZW4sIHVzaW5nIHRlbXBsYXRlIGNhcHMiKTsKKyAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgLyogYmFzZSBjbGFzcyB3aWxsIGdldCB0ZW1wbGF0ZSBjYXBzIGZvciB1cyAqLworICB9CisKKyAgaWYgKG9zc3NyYy0+cHJvYmVkX2NhcHMpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAob3Nzc3JjLCAiUmV0dXJuaW5nIGNhY2hlZCBjYXBzIik7CisgICAgcmV0dXJuIGdzdF9jYXBzX3JlZiAob3Nzc3JjLT5wcm9iZWRfY2Fwcyk7CisgIH0KKworICBjYXBzID0gZ3N0X29zc19oZWxwZXJfcHJvYmVfY2FwcyAob3Nzc3JjLT5mZCk7CisKKyAgaWYgKGNhcHMpIHsKKyAgICBvc3NzcmMtPnByb2JlZF9jYXBzID0gZ3N0X2NhcHNfcmVmIChjYXBzKTsKKyAgfQorCisgIEdTVF9JTkZPX09CSkVDVCAob3Nzc3JjLCAicmV0dXJuaW5nIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIGlmIChmaWx0ZXIgJiYgY2FwcykgeworICAgIEdzdENhcHMgKmludGVyc2VjdGlvbjsKKworICAgIGludGVyc2VjdGlvbiA9CisgICAgICAgIGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIGNhcHMsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIHJldHVybiBpbnRlcnNlY3Rpb247CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGNhcHM7CisgIH0KK30KKworc3RhdGljIGdpbnQKK2lsb2cyIChnaW50IHgpCit7CisgIC8qIHdlbGwuLi4gaGFja2VyJ3MgZGVsaWdodCBleHBsYWlucy4uLiAqLworICB4ID0geCB8ICh4ID4+IDEpOworICB4ID0geCB8ICh4ID4+IDIpOworICB4ID0geCB8ICh4ID4+IDQpOworICB4ID0geCB8ICh4ID4+IDgpOworICB4ID0geCB8ICh4ID4+IDE2KTsKKyAgeCA9IHggLSAoKHggPj4gMSkgJiAweDU1NTU1NTU1KTsKKyAgeCA9ICh4ICYgMHgzMzMzMzMzMykgKyAoKHggPj4gMikgJiAweDMzMzMzMzMzKTsKKyAgeCA9ICh4ICsgKHggPj4gNCkpICYgMHgwZjBmMGYwZjsKKyAgeCA9IHggKyAoeCA+PiA4KTsKKyAgeCA9IHggKyAoeCA+PiAxNik7CisgIHJldHVybiAoeCAmIDB4MDAwMDAwM2YpIC0gMTsKK30KKworc3RhdGljIGdpbnQKK2dzdF9vc3Nfc3JjX2dldF9mb3JtYXQgKEdzdEF1ZGlvUmluZ0J1ZmZlckZvcm1hdFR5cGUgZm10LCBHc3RBdWRpb0Zvcm1hdCByZm10KQoreworICBnaW50IHJlc3VsdDsKKworICBzd2l0Y2ggKGZtdCkgeworICAgIGNhc2UgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX01VX0xBVzoKKyAgICAgIHJlc3VsdCA9IEFGTVRfTVVfTEFXOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfQV9MQVc6CisgICAgICByZXN1bHQgPSBBRk1UX0FfTEFXOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfSU1BX0FEUENNOgorICAgICAgcmVzdWx0ID0gQUZNVF9JTUFfQURQQ007CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9NUEVHOgorICAgICAgcmVzdWx0ID0gQUZNVF9NUEVHOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfUkFXOgorICAgIHsKKyAgICAgIHN3aXRjaCAocmZtdCkgeworICAgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfVTg6CisgICAgICAgICAgcmVzdWx0ID0gQUZNVF9VODsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MxNkxFOgorICAgICAgICAgIHJlc3VsdCA9IEFGTVRfUzE2X0xFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzE2QkU6CisgICAgICAgICAgcmVzdWx0ID0gQUZNVF9TMTZfQkU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TODoKKyAgICAgICAgICByZXN1bHQgPSBBRk1UX1M4OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfVTE2TEU6CisgICAgICAgICAgcmVzdWx0ID0gQUZNVF9VMTZfTEU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9VMTZCRToKKyAgICAgICAgICByZXN1bHQgPSBBRk1UX1UxNl9CRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXN1bHQgPSAwOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3NzX3NyY19vcGVuIChHc3RBdWRpb1NyYyAqIGFzcmMpCit7CisgIEdzdE9zc1NyYyAqb3NzOworICBpbnQgbW9kZTsKKworICBvc3MgPSBHU1RfT1NTX1NSQyAoYXNyYyk7CisKKyAgbW9kZSA9IE9fUkRPTkxZOworICBtb2RlIHw9IE9fTk9OQkxPQ0s7CisKKyAgb3NzLT5mZCA9IG9wZW4gKG9zcy0+ZGV2aWNlLCBtb2RlLCAwKTsKKyAgaWYgKG9zcy0+ZmQgPT0gLTEpIHsKKyAgICBzd2l0Y2ggKGVycm5vKSB7CisgICAgICBjYXNlIEVBQ0NFUzoKKyAgICAgICAgZ290byBub19wZXJtaXNzaW9uOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBvcGVuX2ZhaWxlZDsKKyAgICB9CisgIH0KKworICBnX2ZyZWUgKG9zcy0+ZGV2aWNlX25hbWUpOworICBvc3MtPmRldmljZV9uYW1lID0gZ3N0X29zc19oZWxwZXJfZ2V0X2NhcmRfbmFtZSAoIi9kZXYvbWl4ZXIiKTsKKworICByZXR1cm4gVFJVRTsKKworbm9fcGVybWlzc2lvbjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChvc3MsIFJFU09VUkNFLCBPUEVOX1JFQUQsCisgICAgICAgIChfKCJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gIgorICAgICAgICAgICAgICAgICJZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gdGhlIGRldmljZS4iKSksCisgICAgICAgIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorb3Blbl9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAob3NzLCBSRVNPVVJDRSwgT1BFTl9SRUFELAorICAgICAgICAoXygiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIikpLAorICAgICAgICAoIlVuYWJsZSB0byBvcGVuIGRldmljZSAlcyBmb3IgcmVjb3JkaW5nOiAlcyIsCisgICAgICAgICAgICBvc3MtPmRldmljZSwgZ19zdHJlcnJvciAoZXJybm8pKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zc19zcmNfY2xvc2UgKEdzdEF1ZGlvU3JjICogYXNyYykKK3sKKyAgR3N0T3NzU3JjICpvc3M7CisKKyAgb3NzID0gR1NUX09TU19TUkMgKGFzcmMpOworCisgIGNsb3NlIChvc3MtPmZkKTsKKworICBnc3RfY2Fwc19yZXBsYWNlICgmb3NzLT5wcm9iZWRfY2FwcywgTlVMTCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zc19zcmNfcHJlcGFyZSAoR3N0QXVkaW9TcmMgKiBhc3JjLCBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYykKK3sKKyAgR3N0T3NzU3JjICpvc3M7CisgIHN0cnVjdCBhdWRpb19idWZfaW5mbyBpbmZvOworICBpbnQgbW9kZTsKKyAgaW50IGZtdCwgdG1wOworICBndWludCB3aWR0aCwgcmF0ZSwgY2hhbm5lbHM7CisKKyAgb3NzID0gR1NUX09TU19TUkMgKGFzcmMpOworCisgIG1vZGUgPSBmY250bCAob3NzLT5mZCwgRl9HRVRGTCk7CisgIG1vZGUgJj0gfk9fTk9OQkxPQ0s7CisgIGlmIChmY250bCAob3NzLT5mZCwgRl9TRVRGTCwgbW9kZSkgPT0gLTEpCisgICAgZ290byBub25fYmxvY2s7CisKKyAgZm10ID0gZ3N0X29zc19zcmNfZ2V0X2Zvcm1hdCAoc3BlYy0+dHlwZSwKKyAgICAgIEdTVF9BVURJT19JTkZPX0ZPUk1BVCAoJnNwZWMtPmluZm8pKTsKKyAgaWYgKGZtdCA9PSAwKQorICAgIGdvdG8gd3JvbmdfZm9ybWF0OworCisgIHdpZHRoID0gR1NUX0FVRElPX0lORk9fV0lEVEggKCZzcGVjLT5pbmZvKTsKKyAgcmF0ZSA9IEdTVF9BVURJT19JTkZPX1JBVEUgKCZzcGVjLT5pbmZvKTsKKyAgY2hhbm5lbHMgPSBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJnNwZWMtPmluZm8pOworCisgIGlmICh3aWR0aCAhPSAxNiAmJiB3aWR0aCAhPSA4KQorICAgIGdvdG8gZG9kZ3lfd2lkdGg7CisKKyAgdG1wID0gaWxvZzIgKHNwZWMtPnNlZ3NpemUpOworICB0bXAgPSAoKHNwZWMtPnNlZ3RvdGFsICYgMHg3ZmZmKSA8PCAxNikgfCB0bXA7CisgIEdTVF9ERUJVR19PQkpFQ1QgKG9zcywgInNldCBzZWdzaXplOiAlZCwgc2VndG90YWw6ICVkLCB2YWx1ZTogJTA4eCIsCisgICAgICBzcGVjLT5zZWdzaXplLCBzcGVjLT5zZWd0b3RhbCwgdG1wKTsKKworICBTRVRfUEFSQU0gKG9zcywgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVCwgdG1wLCAiU0VURlJBR01FTlQiKTsKKworICBTRVRfUEFSQU0gKG9zcywgU05EQ1RMX0RTUF9SRVNFVCwgMCwgIlJFU0VUIik7CisKKyAgU0VUX1BBUkFNIChvc3MsIFNORENUTF9EU1BfU0VURk1ULCBmbXQsICJTRVRGTVQiKTsKKyAgaWYgKGNoYW5uZWxzID09IDIpCisgICAgU0VUX1BBUkFNIChvc3MsIFNORENUTF9EU1BfU1RFUkVPLCAxLCAiU1RFUkVPIik7CisgIFNFVF9QQVJBTSAob3NzLCBTTkRDVExfRFNQX0NIQU5ORUxTLCBjaGFubmVscywgIkNIQU5ORUxTIik7CisgIFNFVF9QQVJBTSAob3NzLCBTTkRDVExfRFNQX1NQRUVELCByYXRlLCAiU1BFRUQiKTsKKworICBHRVRfUEFSQU0gKG9zcywgU05EQ1RMX0RTUF9HRVRJU1BBQ0UsICZpbmZvLCAiR0VUSVNQQUNFIik7CisKKyAgc3BlYy0+c2Vnc2l6ZSA9IGluZm8uZnJhZ3NpemU7CisgIHNwZWMtPnNlZ3RvdGFsID0gaW5mby5mcmFnc3RvdGFsOworCisgIG9zcy0+Ynl0ZXNfcGVyX3NhbXBsZSA9IEdTVF9BVURJT19JTkZPX0JQRiAoJnNwZWMtPmluZm8pOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG9zcywgImdvdCBzZWdzaXplOiAlZCwgc2VndG90YWw6ICVkLCB2YWx1ZTogJTA4eCIsCisgICAgICBzcGVjLT5zZWdzaXplLCBzcGVjLT5zZWd0b3RhbCwgdG1wKTsKKworICByZXR1cm4gVFJVRTsKKworbm9uX2Jsb2NrOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9zcywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwKKyAgICAgICAgKCJVbmFibGUgdG8gc2V0IGRldmljZSAlcyBpbiBub24gYmxvY2tpbmcgbW9kZTogJXMiLAorICAgICAgICAgICAgb3NzLT5kZXZpY2UsIGdfc3RyZXJyb3IgKGVycm5vKSksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit3cm9uZ19mb3JtYXQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAob3NzLCBSRVNPVVJDRSwgT1BFTl9SRUFELAorICAgICAgICAoIlVuYWJsZSB0byBnZXQgZm9ybWF0ICglZCwgJWQpIiwgc3BlYy0+dHlwZSwKKyAgICAgICAgICAgIEdTVF9BVURJT19JTkZPX0ZPUk1BVCAoJnNwZWMtPmluZm8pKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2RvZGd5X3dpZHRoOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9zcywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwKKyAgICAgICAgKCJVbmV4cGVjdGVkIHdpZHRoICVkIiwgd2lkdGgpLCAoTlVMTCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3Nfc3JjX3VucHJlcGFyZSAoR3N0QXVkaW9TcmMgKiBhc3JjKQoreworICAvKiBjb3VsZCBkbyBhIFNORENUTF9EU1BfUkVTRVQsIGJ1dCB0aGUgT1NTIG1hbnVhbCByZWNvbW1lbmRzIGEgY2xvc2Uvb3BlbiAqLworCisgIGlmICghZ3N0X29zc19zcmNfY2xvc2UgKGFzcmMpKQorICAgIGdvdG8gY291bGRudF9jbG9zZTsKKworICBpZiAoIWdzdF9vc3Nfc3JjX29wZW4gKGFzcmMpKQorICAgIGdvdG8gY291bGRudF9yZW9wZW47CisKKyAgcmV0dXJuIFRSVUU7CisKK2NvdWxkbnRfY2xvc2U6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhc3JjLCAiQ291bGQgbm90IGNsb3NlIHRoZSBhdWRpbyBkZXZpY2UiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2NvdWxkbnRfcmVvcGVuOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXNyYywgIkNvdWxkIG5vdCByZW9wZW4gdGhlIGF1ZGlvIGRldmljZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ3VpbnQKK2dzdF9vc3Nfc3JjX3JlYWQgKEdzdEF1ZGlvU3JjICogYXNyYywgZ3BvaW50ZXIgZGF0YSwgZ3VpbnQgbGVuZ3RoLAorICAgIEdzdENsb2NrVGltZSAqIHRpbWVzdGFtcCkKK3sKKyAgcmV0dXJuIHJlYWQgKEdTVF9PU1NfU1JDIChhc3JjKS0+ZmQsIGRhdGEsIGxlbmd0aCk7Cit9CisKK3N0YXRpYyBndWludAorZ3N0X29zc19zcmNfZGVsYXkgKEdzdEF1ZGlvU3JjICogYXNyYykKK3sKKyAgR3N0T3NzU3JjICpvc3M7CisgIGdpbnQgZGVsYXkgPSAwOworICBnaW50IHJldDsKKworICBvc3MgPSBHU1RfT1NTX1NSQyAoYXNyYyk7CisKKyNpZmRlZiBTTkRDVExfRFNQX0dFVE9ERUxBWQorICByZXQgPSBpb2N0bCAob3NzLT5mZCwgU05EQ1RMX0RTUF9HRVRPREVMQVksICZkZWxheSk7CisjZWxzZQorICByZXQgPSAtMTsKKyNlbmRpZgorICBpZiAocmV0IDwgMCkgeworICAgIGF1ZGlvX2J1Zl9pbmZvIGluZm87CisKKyAgICByZXQgPSBpb2N0bCAob3NzLT5mZCwgU05EQ1RMX0RTUF9HRVRPU1BBQ0UsICZpbmZvKTsKKworICAgIGRlbGF5ID0gKHJldCA8IDAgPyAwIDogKGluZm8uZnJhZ3N0b3RhbCAqIGluZm8uZnJhZ3NpemUpIC0gaW5mby5ieXRlcyk7CisgIH0KKyAgcmV0dXJuIGRlbGF5IC8gb3NzLT5ieXRlc19wZXJfc2FtcGxlOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zc19zcmNfcmVzZXQgKEdzdEF1ZGlvU3JjICogYXNyYykKK3sKKyAgLyogVGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyBoZXJlIHJlYWxseTogT1NTIGNhbid0IGhhbmRsZSBhY2Nlc3MgdG8gdGhlCisgICAqIHNhbWUgZGV2aWNlL2ZkIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBhbmQgbWlnaHQgZGVhZGxvY2sgb3IgYmxvdyB1cCBpbgorICAgKiBvdGhlciB3YXlzIGlmIHdlIHRyeSBhbiBpb2N0bCBTTkRDVExfRFNQX1JFU0VUIG9yIHNpbWlsYXIgKi8KK30KZGlmZiAtLWdpdCBhL3N5cy9vc3MvZ3N0b3Nzc3JjLmggYi9zeXMvb3NzL2dzdG9zc3NyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4OTk1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3NzL2dzdG9zc3NyYy5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgICAgICAyMDAwIFdpbSBUYXltYW5zIDx3dGF5QGNoZWxsby5iZT4KKyAqCisgKiBnc3Rvc3NzcmMuaDogCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX09TU19TUkNfSF9fCisjZGVmaW5lIF9fR1NUX09TU19TUkNfSF9fCisKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9zcmMuaD4KKworI2luY2x1ZGUgImdzdG9zc2hlbHBlci5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfT1NTX1NSQyAgICAgICAgICAgKGdzdF9vc3Nfc3JjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9PU1NfU1JDKG9iaikgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9PU1NfU1JDLEdzdE9zc1NyYykpCisjZGVmaW5lIEdTVF9PU1NfU1JDX0NMQVNTKGtsYXNzKSAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX09TU19TUkMsR3N0T3NzU3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfT1NTX1NSQyhvYmopICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfT1NTX1NSQykpCisjZGVmaW5lIEdTVF9JU19PU1NfU1JDX0NMQVNTKGtsYXMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX09TU19TUkMpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0T3NzU3JjIEdzdE9zc1NyYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RPc3NTcmNDbGFzcyBHc3RPc3NTcmNDbGFzczsKKworc3RydWN0IF9Hc3RPc3NTcmMgeworICBHc3RBdWRpb1NyYyAgICBzcmM7CisKKyAgZ2ludCBmZDsKKyAgZ2ludCAgICAgICAgICAgYnl0ZXNfcGVyX3NhbXBsZTsKKworICBnY2hhciAqZGV2aWNlOworICBnY2hhciAqZGV2aWNlX25hbWU7CisKKyAgR3N0Q2FwcyAgICAgICAqcHJvYmVkX2NhcHM7Cit9OworCitzdHJ1Y3QgX0dzdE9zc1NyY0NsYXNzIHsKKyAgR3N0QXVkaW9TcmNDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3Rfb3NzX3NyY19nZXRfdHlwZSh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX09TU19TUkNfSF9fICovCmRpZmYgLS1naXQgYS9zeXMvb3NzL21lc29uLmJ1aWxkIGIvc3lzL29zcy9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTc2ZTc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zcy9tZXNvbi5idWlsZApAQCAtMCwwICsxLDI4IEBACitvc3NfaGVhZGVyX2xvY2F0aW9ucyA9IFsKKyAgIyBMaW51eCBhbmQgbmV3ZXIgQlNEIHZlcnNpb25zCisgIFsnc3lzL3NvdW5kY2FyZC5oJywgJ0hBVkVfT1NTX0lOQ0xVREVfSU5fU1lTJywgJ09TUyBpbmNsdWRlcyBhcmUgaW4gc3lzLyddLAorICAjIFNvbWUgb2xkIEJTRCB2ZXJzaW9ucyBhbmQgYWxzbyBuZXdlciBPcGVuQlNEIHZlcnNpb25zCisgIFsnc291bmRjYXJkLmgnLCAnSEFWRV9PU1NfSU5DTFVERV9JTl9ST09UJywgJ09TUyBpbmNsdWRlcyBhcmUgaW4gcm9vdCddLAorICAjIFNvbWUgb2xkIEJTRCB2ZXJzaW9ucworICBbJ21hY2hpbmUvc291bmRjYXJkLmgnLCAnSEFWRV9PU1NfSU5DTFVERV9JTl9NQUNISU5FJywgJ09TUyBpbmNsdWRlcyBhcmUgaW4gbWFjaGluZS8nXSwKK10KKworaGF2ZV9vc3MgPSBmYWxzZQorZm9yZWFjaCBoZHIgOiBvc3NfaGVhZGVyX2xvY2F0aW9ucworICBpZiBub3QgaGF2ZV9vc3MKKyAgICBpZiBjYy5oYXNfaGVhZGVyKGhkclswXSkKKyAgICAgIGNkYXRhLnNldChoZHJbMV0sIDEsIGRlc2NyaXB0aW9uOiBoZHJbMl0pCisgICAgICBoYXZlX29zcyA9IHRydWUKKyAgICBlbmRpZgorICBlbmRpZgorZW5kZm9yZWFjaAorCitpZiBoYXZlX29zcworICBsaWJyYXJ5KCdnc3Rvc3NhdWRpbycsCisgICAgJ2dzdG9zc2F1ZGlvLmMnLCAnZ3N0b3NzaGVscGVyLmMnLCAnZ3N0b3Nzc2luay5jJywgJ2dzdG9zc3NyYy5jJywKKyAgICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICAgIGRlcGVuZGVuY2llcyA6IFtnc3RhdWRpb19kZXAsIGdzdGJhc2VfZGVwXSwKKyAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIpCitlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL29zcy9vc3NfcHJvYmUuYyBiL3N5cy9vc3Mvb3NzX3Byb2JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY2MjRmYQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3Mvb3NzX3Byb2JlLmMKQEAgLTAsMCArMSwyNTYgQEAKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaWZkZWYgSEFWRV9PU1NfSU5DTFVERV9JTl9TWVMKKyMgaW5jbHVkZSA8c3lzL3NvdW5kY2FyZC5oPgorI2Vsc2UKKyMgaWZkZWYgSEFWRV9PU1NfSU5DTFVERV9JTl9ST09UCisjICBpbmNsdWRlIDxzb3VuZGNhcmQuaD4KKyMgZWxzZQorIyAgaWZkZWYgSEFWRV9PU1NfSU5DTFVERV9JTl9NQUNISU5FCisjICAgaW5jbHVkZSA8bWFjaGluZS9zb3VuZGNhcmQuaD4KKyMgIGVsc2UKKyMgICBlcnJvciAiV2hhdCB0byBpbmNsdWRlPyIKKyMgIGVuZGlmIC8qIEhBVkVfT1NTX0lOQ0xVREVfSU5fTUFDSElORSAqLworIyBlbmRpZiAvKiBIQVZFX09TU19JTkNMVURFX0lOX1JPT1QgKi8KKyNlbmRpZiAvKiBIQVZFX09TU19JTkNMVURFX0lOX1NZUyAqLworCit0eXBlZGVmIHN0cnVjdCBfUHJvYmUgUHJvYmU7CitzdHJ1Y3QgX1Byb2JlCit7CisgIGludCBmZDsKKyAgaW50IGZvcm1hdDsKKyAgaW50IG5fY2hhbm5lbHM7CisgIEdBcnJheSAqcmF0ZXM7CisgIGludCBtaW47CisgIGludCBtYXg7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfUmFuZ2UgUmFuZ2U7CitzdHJ1Y3QgX1JhbmdlCit7CisgIGludCBtaW47CisgIGludCBtYXg7Cit9OworCitzdGF0aWMgZ2Jvb2xlYW4gcHJvYmVfY2hlY2sgKFByb2JlICogcHJvYmUpOworc3RhdGljIGludCBjaGVja19yYXRlIChQcm9iZSAqIHByb2JlLCBpbnQgaXJhdGUpOworc3RhdGljIHZvaWQgYWRkX3JhbmdlIChHUXVldWUgKiBxdWV1ZSwgaW50IG1pbiwgaW50IG1heCk7CitzdGF0aWMgdm9pZCBhZGRfcmF0ZSAoR0FycmF5ICogYXJyYXksIGludCByYXRlKTsKK3N0YXRpYyBpbnQgaW50X2NvbXBhcmUgKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKTsKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgZmQ7CisgIGludCBpOworICBQcm9iZSAqcHJvYmU7CisKKyAgZmQgPSBvcGVuICgiL2Rldi9kc3AiLCBPX1JEV1IpOworICBpZiAoZmQgPCAwKSB7CisgICAgcGVycm9yICgiL2Rldi9kc3AiKTsKKyAgICBleGl0ICgxKTsKKyAgfQorCisgIHByb2JlID0gZ19uZXcwIChQcm9iZSwgMSk7CisgIHByb2JlLT5mZCA9IGZkOworICBwcm9iZS0+Zm9ybWF0ID0gQUZNVF9TMTZfTEU7CisgIHByb2JlLT5uX2NoYW5uZWxzID0gMjsKKworICBwcm9iZV9jaGVjayAocHJvYmUpOworICBnX2FycmF5X3NvcnQgKHByb2JlLT5yYXRlcywgaW50X2NvbXBhcmUpOworICBmb3IgKGkgPSAwOyBpIDwgcHJvYmUtPnJhdGVzLT5sZW47IGkrKykgeworICAgIGdfcHJpbnQgKCIlZFxuIiwgZ19hcnJheV9pbmRleCAocHJvYmUtPnJhdGVzLCBpbnQsIGkpKTsKKyAgfQorCisgIGdfYXJyYXlfZnJlZSAocHJvYmUtPnJhdGVzLCBUUlVFKTsKKyAgZ19mcmVlIChwcm9iZSk7CisKKyNpZiAwCisgIHByb2JlID0gZ19uZXcwIChQcm9iZSwgMSk7CisgIHByb2JlLT5mZCA9IGZkOworICBwcm9iZS0+Zm9ybWF0ID0gQUZNVF9TMTZfTEU7CisgIHByb2JlLT5uX2NoYW5uZWxzID0gMTsKKworICBwcm9iZV9jaGVjayAocHJvYmUpOworICBmb3IgKGkgPSAwOyBpIDwgcHJvYmUtPnJhdGVzLT5sZW47IGkrKykgeworICAgIGdfcHJpbnQgKCIlZFxuIiwgZ19hcnJheV9pbmRleCAocHJvYmUtPnJhdGVzLCBpbnQsIGkpKTsKKyAgfQorCisgIHByb2JlID0gZ19uZXcwIChQcm9iZSwgMSk7CisgIHByb2JlLT5mZCA9IGZkOworICBwcm9iZS0+Zm9ybWF0ID0gQUZNVF9VODsKKyAgcHJvYmUtPm5fY2hhbm5lbHMgPSAyOworCisgIHByb2JlX2NoZWNrIChwcm9iZSk7CisgIGZvciAoaSA9IDA7IGkgPCBwcm9iZS0+cmF0ZXMtPmxlbjsgaSsrKSB7CisgICAgZ19wcmludCAoIiVkXG4iLCBnX2FycmF5X2luZGV4IChwcm9iZS0+cmF0ZXMsIGludCwgaSkpOworICB9CisKKyAgcHJvYmUgPSBnX25ldzAgKFByb2JlLCAxKTsKKyAgcHJvYmUtPmZkID0gZmQ7CisgIHByb2JlLT5mb3JtYXQgPSBBRk1UX1U4OworICBwcm9iZS0+bl9jaGFubmVscyA9IDE7CisKKyAgcHJvYmVfY2hlY2sgKHByb2JlKTsKKyAgZm9yIChpID0gMDsgaSA8IHByb2JlLT5yYXRlcy0+bGVuOyBpKyspIHsKKyAgICBnX3ByaW50ICgiJWRcbiIsIGdfYXJyYXlfaW5kZXggKHByb2JlLT5yYXRlcywgaW50LCBpKSk7CisgIH0KKyNlbmRpZgorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3Byb2JlX2NoZWNrIChQcm9iZSAqIHByb2JlKQoreworICBSYW5nZSAqcmFuZ2U7CisgIEdRdWV1ZSAqcmFuZ2VzOworICBpbnQgZXhhY3RfcmF0ZXMgPSAwOworICBnYm9vbGVhbiBjaGVja2luZ19leGFjdF9yYXRlcyA9IFRSVUU7CisgIGludCBuX2NoZWNrcyA9IDA7CisgIGdib29sZWFuIHJlc3VsdCA9IFRSVUU7CisKKyAgcmFuZ2VzID0gZ19xdWV1ZV9uZXcgKCk7CisKKyAgcHJvYmUtPnJhdGVzID0gZ19hcnJheV9uZXcgKEZBTFNFLCBGQUxTRSwgc2l6ZW9mIChpbnQpKTsKKworICBwcm9iZS0+bWluID0gY2hlY2tfcmF0ZSAocHJvYmUsIDEwMDApOworICBuX2NoZWNrcysrOworICBwcm9iZS0+bWF4ID0gY2hlY2tfcmF0ZSAocHJvYmUsIDEwMDAwMCk7CisgIG5fY2hlY2tzKys7CisgIGFkZF9yYW5nZSAocmFuZ2VzLCBwcm9iZS0+bWluICsgMSwgcHJvYmUtPm1heCAtIDEpOworCisgIHdoaWxlICgocmFuZ2UgPSBnX3F1ZXVlX3BvcF9oZWFkIChyYW5nZXMpKSkgeworICAgIGludCBtaW4xOworICAgIGludCBtYXgxOworICAgIGludCBtaWQ7CisgICAgaW50IG1pZF9yZXQ7CisKKyAgICBnX3ByaW50ICgiY2hlY2tpbmcgWyVkLCVkXVxuIiwgcmFuZ2UtPm1pbiwgcmFuZ2UtPm1heCk7CisKKyAgICBtaWQgPSAocmFuZ2UtPm1pbiArIHJhbmdlLT5tYXgpIC8gMjsKKyAgICBtaWRfcmV0ID0gY2hlY2tfcmF0ZSAocHJvYmUsIG1pZCk7CisgICAgbl9jaGVja3MrKzsKKworICAgIGlmIChtaWQgPT0gbWlkX3JldCAmJiBjaGVja2luZ19leGFjdF9yYXRlcykgeworICAgICAgaW50IG1heF9leGFjdF9tYXRjaGVzID0gMTAwOworCisgICAgICBleGFjdF9yYXRlcysrOworICAgICAgaWYgKGV4YWN0X3JhdGVzID4gbWF4X2V4YWN0X21hdGNoZXMpIHsKKyAgICAgICAgZ19wcmludCAoImdvdCAlZCBleGFjdCByYXRlcywgYXNzdW1pbmcgYWxsIGFyZSBleGFjdFxuIiwKKyAgICAgICAgICAgIG1heF9leGFjdF9tYXRjaGVzKTsKKyAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICAgIGdfZnJlZSAocmFuZ2UpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgY2hlY2tpbmdfZXhhY3RfcmF0ZXMgPSBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBBc3N1bWUgdGhhdCB0aGUgcmF0ZSBpcyBhcml0aG1ldGljYWxseSByb3VuZGVkIHRvIHRoZSBuZWFyZXN0CisgICAgICogc3VwcG9ydGVkIHJhdGUuICovCisgICAgaWYgKG1pZCA9PSBtaWRfcmV0KSB7CisgICAgICBtaW4xID0gbWlkIC0gMTsKKyAgICAgIG1heDEgPSBtaWQgKyAxOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobWlkIDwgbWlkX3JldCkgeworICAgICAgICBtaW4xID0gbWlkIC0gKG1pZF9yZXQgLSBtaWQpOworICAgICAgICBtYXgxID0gbWlkX3JldCArIDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBtaW4xID0gbWlkX3JldCAtIDE7CisgICAgICAgIG1heDEgPSBtaWQgKyAobWlkIC0gbWlkX3JldCk7CisgICAgICB9CisgICAgfQorCisgICAgYWRkX3JhbmdlIChyYW5nZXMsIHJhbmdlLT5taW4sIG1pbjEpOworICAgIGFkZF9yYW5nZSAocmFuZ2VzLCBtYXgxLCByYW5nZS0+bWF4KTsKKworICAgIGdfZnJlZSAocmFuZ2UpOworICB9CisKKyAgd2hpbGUgKChyYW5nZSA9IGdfcXVldWVfcG9wX2hlYWQgKHJhbmdlcykpKSB7CisgICAgZ19mcmVlIChyYW5nZSk7CisgIH0KKyAgZ19xdWV1ZV9mcmVlIChyYW5nZXMpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCithZGRfcmFuZ2UgKEdRdWV1ZSAqIHF1ZXVlLCBpbnQgbWluLCBpbnQgbWF4KQoreworICBnX3ByaW50ICgidHJ5aW5nIHRvIGFkZCBbJWQsJWRdXG4iLCBtaW4sIG1heCk7CisgIGlmIChtaW4gPD0gbWF4KSB7CisgICAgUmFuZ2UgKnJhbmdlID0gZ19uZXcwIChSYW5nZSwgMSk7CisKKyAgICByYW5nZS0+bWluID0gbWluOworICAgIHJhbmdlLT5tYXggPSBtYXg7CisKKyAgICBnX3F1ZXVlX3B1c2hfdGFpbCAocXVldWUsIHJhbmdlKTsKKyAgICAvL2dfcXVldWVfcHVzaF9oZWFkIChxdWV1ZSwgcmFuZ2UpOworICB9Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrX3JhdGUgKFByb2JlICogcHJvYmUsIGludCBpcmF0ZSkKK3sKKyAgaW50IHJhdGU7CisgIGludCBmb3JtYXQ7CisgIGludCBuX2NoYW5uZWxzOworCisgIHJhdGUgPSBpcmF0ZTsKKyAgZm9ybWF0ID0gcHJvYmUtPmZvcm1hdDsKKyAgbl9jaGFubmVscyA9IHByb2JlLT5uX2NoYW5uZWxzOworCisgIGlvY3RsIChwcm9iZS0+ZmQsIFNORENUTF9EU1BfU0VURk1ULCAmZm9ybWF0KTsKKyAgaW9jdGwgKHByb2JlLT5mZCwgU05EQ1RMX0RTUF9DSEFOTkVMUywgJm5fY2hhbm5lbHMpOworICBpb2N0bCAocHJvYmUtPmZkLCBTTkRDVExfRFNQX1NQRUVELCAmcmF0ZSk7CisKKyAgZ19wcmludCAoInJhdGUgJWQgLT4gJWRcbiIsIGlyYXRlLCByYXRlKTsKKworICBpZiAocmF0ZSA9PSBpcmF0ZSAtIDEgfHwgcmF0ZSA9PSBpcmF0ZSArIDEpIHsKKyAgICByYXRlID0gaXJhdGU7CisgIH0KKyAgYWRkX3JhdGUgKHByb2JlLT5yYXRlcywgcmF0ZSk7CisgIHJldHVybiByYXRlOworfQorCitzdGF0aWMgdm9pZAorYWRkX3JhdGUgKEdBcnJheSAqIGFycmF5LCBpbnQgcmF0ZSkKK3sKKyAgaW50IGk7CisgIGludCB2YWw7CisKKyAgZm9yIChpID0gMDsgaSA8IGFycmF5LT5sZW47IGkrKykgeworICAgIHZhbCA9IGdfYXJyYXlfaW5kZXggKGFycmF5LCBpbnQsIGkpOworCisgICAgaWYgKHZhbCA9PSByYXRlKQorICAgICAgcmV0dXJuOworICB9CisgIGdfcHJpbnQgKCJzdXBwb3J0ZWQgcmF0ZTogJWRcbiIsIHJhdGUpOworICBnX2FycmF5X2FwcGVuZF92YWwgKGFycmF5LCByYXRlKTsKK30KKworc3RhdGljIGludAoraW50X2NvbXBhcmUgKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKQoreworICBjb25zdCBpbnQgKnZhID0gKGNvbnN0IGludCAqKSBhOworICBjb25zdCBpbnQgKnZiID0gKGNvbnN0IGludCAqKSBiOworCisgIGlmICgqdmEgPCAqdmIpCisgICAgcmV0dXJuIC0xOworICBpZiAoKnZhID4gKnZiKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3N5cy9vc3M0L01ha2VmaWxlLmFtIGIvc3lzL29zczQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmMDU4YQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3M0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjIgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdG9zczQubGEKKworbGliZ3N0b3NzNF9sYV9TT1VSQ0VTID0gXAorCW9zczQtYXVkaW8uYyAgICAgICAgICBcCisJb3NzNC1wcm9wZXJ0eS1wcm9iZS5jIFwKKwlvc3M0LXNpbmsuYyAgICAgICAgICAgXAorCW9zczQtc291cmNlLmMKKworbGliZ3N0b3NzNF9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpCitsaWJnc3Rvc3M0X2xhX0xJQkFERCA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgXAorCS1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkkKEdTVF9MSUJTKQorbGliZ3N0b3NzNF9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpIAorCitub2luc3RfSEVBREVSUyA9IFwKKwlvc3M0LWF1ZGlvLmggICAgICAgICAgXAorCW9zczQtcHJvcGVydHktcHJvYmUuaCBcCisJb3NzNC1zaW5rLmggICAgICAgICAgIFwKKwlvc3M0LXNvdW5kY2FyZC5oICAgICAgXAorCW9zczQtc291cmNlLmgKKwpkaWZmIC0tZ2l0IGEvc3lzL29zczQvbWVzb24uYnVpbGQgYi9zeXMvb3NzNC9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTEyNjZlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zczQvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwyMyBAQAoraGF2ZV9vc3M0ID0gdHJ1ZQorbWVzc2FnZSgnQ2hlY2tpbmcgaGVhZGVycyBuZWVkZWQgZm9yIE9wZW4gU291bmQgU3lzdGVtIDQgcGx1Z2luLi4uJykKK2ZvcmVhY2ggaGRyIDogWydmY250bC5oJywgJ3N5cy9pb2N0bC5oJywgJ3N5cy9zdGF0LmgnLCAnc3lzL3R5cGVzLmgnXQorICBpZiBoYXZlX29zczQKKyAgICBpZiBub3QgY2MuaGFzX2hlYWRlcihoZHIpCisgICAgICBoYXZlX29zczQgPSBmYWxzZQorICAgIGVuZGlmCisgIGVuZGlmCitlbmRmb3JlYWNoCisKK2lmIGhhdmVfb3NzNAorICBtZXNzYWdlKCdSZXF1aXJlZCBoZWFkZXJzIGZvdW5kLCBidWlsZGluZyBPcGVuIFNvdW5kIFN5c3RlbSA0IHBsdWdpbi4nKQorCisgIGxpYnJhcnkoJ2dzdG9zczQnLAorICAgICdvc3M0LWF1ZGlvLmMnLCAnb3NzNC1wcm9wZXJ0eS1wcm9iZS5jJywgJ29zczQtc2luay5jJywgJ29zczQtc291cmNlLmMnLAorICAgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luYywgbGlic2luY10sCisgICAgZGVwZW5kZW5jaWVzIDogW2dzdGF1ZGlvX2RlcCwgZ3N0YmFzZV9kZXBdLAorICAgIGluc3RhbGwgOiB0cnVlLAorICAgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpcikKK2Vsc2UKKyAgbWVzc2FnZSgnTm90IGJ1aWxkaW5nIE9wZW4gU291bmQgU3lzdGVtIDQgcGx1Z2luLCByZXF1aXJlZCBoZWFkZXJzIG5vdCBmb3VuZC4nKQorZW5kaWYKZGlmZiAtLWdpdCBhL3N5cy9vc3M0L29zczQtYXVkaW8uYyBiL3N5cy9vc3M0L29zczQtYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODk2MDgxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zczQvb3NzNC1hdWRpby5jCkBAIC0wLDAgKzEsNzgxIEBACisvKiBHU3RyZWFtZXIgT1NTNCBhdWRpbyBwbHVnaW4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyogRklYTUUgMC4xMTogc3VwcHJlc3Mgd2FybmluZ3MgZm9yIGRlcHJlY2F0ZWQgQVBJIHN1Y2ggYXMgR1ZhbHVlQXJyYXkKKyAqIHdpdGggbmV3ZXIgR0xpYiB2ZXJzaW9ucyAoPj0gMi4zMS4wKSAqLworI2RlZmluZSBHTElCX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0L2dzdC1pMThuLXBsdWdpbi5oIgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSAib3NzNC1hdWRpby5oIgorI2luY2x1ZGUgIm9zczQtcHJvcGVydHktcHJvYmUuaCIKKyNpbmNsdWRlICJvc3M0LXNpbmsuaCIKKyNpbmNsdWRlICJvc3M0LXNvdXJjZS5oIgorI2luY2x1ZGUgIm9zczQtc291bmRjYXJkLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWSAob3NzNG1peGVyX2RlYnVnKTsKK0dTVF9ERUJVR19DQVRFR09SWSAob3NzNHNpbmtfZGVidWcpOworR1NUX0RFQlVHX0NBVEVHT1JZIChvc3M0c3JjX2RlYnVnKTsKK0dTVF9ERUJVR19DQVRFR09SWSAob3NzNF9kZWJ1Zyk7CisKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIG9zczRfZGVidWcKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgR3N0QXVkaW9SaW5nQnVmZmVyRm9ybWF0VHlwZSBnc3RfcmJmbXQ7CisgIGNvbnN0IEdzdEF1ZGlvRm9ybWF0IGdzdF9yZm10OworICBjb25zdCBnaW50IG9zc19mbXQ7CisgIGNvbnN0IGdjaGFyIG5hbWVbMTZdOworfSBHc3RPc3M0QXVkaW9Gb3JtYXQ7CisKKy8qICpJTkRFTlQtT0ZGKiAqLworc3RhdGljIGNvbnN0IEdzdE9zczRBdWRpb0Zvcm1hdCBmbXRfbWFwW10gPSB7CisgIC8qIG5vdGU6IGtlZXAgc29ydGVkIGJ5IHByZWZlcmVuY2UsIHByZWZlcmVkIGZvcm1hdHMgZmlyc3QgKi8KKyAgeworICBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfTVVfTEFXLCAwLAorICAgICAgQUZNVF9NVV9MQVcsICJhdWRpby94LW11bGF3In0sIHsKKyAgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX0FfTEFXLCAwLAorICAgICAgQUZNVF9BX0xBVywgImF1ZGlvL3gtYWxhdyJ9LCB7CisgIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9SQVcsIEdTVF9BVURJT19GT1JNQVRfUzMyTEUsCisgICAgICBBRk1UX1MzMl9MRSwgImF1ZGlvL3gtcmF3In0sIHsKKyAgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX1JBVywgR1NUX0FVRElPX0ZPUk1BVF9TMzJCRSwKKyAgICAgIEFGTVRfUzMyX0JFLCAiYXVkaW8veC1yYXcifSwgeworICBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfUkFXLCBHU1RfQVVESU9fRk9STUFUX1MyNF8zMkxFLAorICAgICAgQUZNVF9TMjRfTEUsICJhdWRpby94LXJhdyJ9LCB7CisgIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9SQVcsIEdTVF9BVURJT19GT1JNQVRfUzI0XzMyQkUsCisgICAgICBBRk1UX1MyNF9CRSwgImF1ZGlvL3gtcmF3In0sIHsKKyAgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX1JBVywgR1NUX0FVRElPX0ZPUk1BVF9TMjRMRSwKKyAgICAgIEFGTVRfUzI0X1BBQ0tFRCwgImF1ZGlvL3gtcmF3In0sIHsKKyAgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX1JBVywgR1NUX0FVRElPX0ZPUk1BVF9TMTZMRSwKKyAgICAgIEFGTVRfUzE2X0xFLCAiYXVkaW8veC1yYXcifSwgeworICBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfUkFXLCBHU1RfQVVESU9fRk9STUFUX1MxNkJFLAorICAgICAgQUZNVF9TMTZfQkUsICJhdWRpby94LXJhdyJ9LCB7CisgIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9SQVcsIEdTVF9BVURJT19GT1JNQVRfVTE2TEUsCisgICAgICBBRk1UX1UxNl9MRSwgImF1ZGlvL3gtcmF3In0sIHsKKyAgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX1JBVywgR1NUX0FVRElPX0ZPUk1BVF9VMTZCRSwKKyAgICAgIEFGTVRfVTE2X0JFLCAiYXVkaW8veC1yYXcifSwgeworICBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfUkFXLCBHU1RfQVVESU9fRk9STUFUX1M4LAorICAgICAgQUZNVF9TOCwgImF1ZGlvL3gtcmF3In0sIHsKKyAgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX1JBVywgR1NUX0FVRElPX0ZPUk1BVF9VOCwKKyAgICAgIEFGTVRfVTgsICJhdWRpby94LXJhdyJ9Cit9OworLyogKklOREVOVC1PTiogKi8KKworLyogZm9ybWF0cyB3ZSBhc3N1bWUgdGhlIE9TUzQgbGF5ZXIgY2FuIGFsd2F5cyBoYW5kbGUgYW5kIGNvbnZlcnQgaW50ZXJuYWxseSAqLworI2RlZmluZSBDT05WRVJUSUJMRV9GT1JNQVRTICggICBcCisgICAgQUZNVF9NVV9MQVcgfCBBRk1UX0FfTEFXIHwgIFwKKyAgICBBRk1UX1MzMl9MRSB8IEFGTVRfUzMyX0JFIHwgXAorICAgIEFGTVRfUzI0X0xFIHwgQUZNVF9TMjRfQkUgfCBcCisgICAgQUZNVF9TMjRfUEFDS0VEIHwgICAgICAgICAgIFwKKyAgICBBRk1UX1MxNl9MRSB8IEFGTVRfUzE2X0JFIHwgXAorICAgIEFGTVRfVTE2X0xFIHwgQUZNVF9VMTZfQkUgfCBcCisgICAgQUZNVF9TOCB8IEFGTVRfVTggKQorCitzdGF0aWMgdm9pZAorZ3N0X29zczRfYXBwZW5kX2Zvcm1hdF90b19jYXBzIChjb25zdCBHc3RPc3M0QXVkaW9Gb3JtYXQgKiBmbXQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5IChmbXQtPm5hbWUpOworICBpZiAoZm10LT5nc3RfcmJmbXQgPT0gR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX1JBVykgeworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiZm9ybWF0IiwgR19UWVBFX1NUUklORywKKyAgICAgICAgZ3N0X2F1ZGlvX2Zvcm1hdF90b19zdHJpbmcgKGZtdC0+Z3N0X3JmbXQpLAorICAgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImludGVybGVhdmVkIiwgTlVMTCk7CisgIH0KKyAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoY2Fwcywgcyk7Cit9CisKK3N0YXRpYyBnaW50Citnc3Rfb3NzNF9hdWRpb19nZXRfb3NzX2Zvcm1hdCAoR3N0QXVkaW9SaW5nQnVmZmVyRm9ybWF0VHlwZSBmbXQsCisgICAgR3N0QXVkaW9Gb3JtYXQgcmZtdCkKK3sKKyAgZ3VpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTIChmbXRfbWFwKTsgKytpKSB7CisgICAgaWYgKGZtdF9tYXBbaV0uZ3N0X3JiZm10ID09IGZtdCAmJiBmbXRfbWFwW2ldLmdzdF9yZm10ID09IHJmbXQpCisgICAgICByZXR1cm4gZm10X21hcFtpXS5vc3NfZm10OworICB9CisgIHJldHVybiAwOworfQorCisvKiBUaGVzZSBhcmUgcHJldHR5IHJhbmRvbSAqLworI2RlZmluZSBHU1RfT1NTNF9NSU5fU0FNUExFX1JBVEUgMQorI2RlZmluZSBHU1RfT1NTNF9NQVhfU0FNUExFX1JBVEUgMTkyMDAwCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zczRfYXVkaW9fZGV0ZWN0X3JhdGVzIChHc3RPYmplY3QgKiBvYmosIG9zc19hdWRpb2luZm8gKiBhaSwKKyAgICBHc3RDYXBzICogY2FwcykKK3sKKyAgR1ZhbHVlIHZhbCA9IHsgMCwgfTsKKyAgaW50IG1pbnJhdGUsIG1heHJhdGUsIGk7CisKKyAgbWlucmF0ZSA9IGFpLT5taW5fcmF0ZTsKKyAgbWF4cmF0ZSA9IGFpLT5tYXhfcmF0ZTsKKworICAvKiBzYW5pdHkgY2hlY2sgKi8KKyAgaWYgKG1pbnJhdGUgPiBtYXhyYXRlKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChvYmosICJtaW5fcmF0ZSAlZCA+IG1heF9yYXRlICVkIChidWdneSBkcml2ZXI/KSIsCisgICAgICAgIG1pbnJhdGUsIG1heHJhdGUpOworICAgIG1heHJhdGUgPSBhaS0+bWluX3JhdGU7ICAgICAvKiBzd2FwICovCisgICAgbWlucmF0ZSA9IGFpLT5tYXhfcmF0ZTsKKyAgfQorCisgIC8qIGxpbWl0IHRvIHNvbWV0aGluZyBzZW5zaWJsZSAqLworICBpZiAobWlucmF0ZSA8IEdTVF9PU1M0X01JTl9TQU1QTEVfUkFURSkKKyAgICBtaW5yYXRlID0gR1NUX09TUzRfTUlOX1NBTVBMRV9SQVRFOworICBpZiAobWF4cmF0ZSA+IEdTVF9PU1M0X01BWF9TQU1QTEVfUkFURSkKKyAgICBtYXhyYXRlID0gR1NUX09TUzRfTUFYX1NBTVBMRV9SQVRFOworCisgIGlmIChtYXhyYXRlIDwgR1NUX09TUzRfTUlOX1NBTVBMRV9SQVRFKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChvYmosICJtYXhfcmF0ZSA8ICVkLCB3aGljaCBtYWtlcyBubyBzZW5zZSIsCisgICAgICAgIEdTVF9PU1M0X01JTl9TQU1QTEVfUkFURSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKG9iaiwgIm1pbl9yYXRlICVkLCBtYXhfcmF0ZSAlZCAob3JpZ2luYWxseTogJWQsICVkKSIsCisgICAgICBtaW5yYXRlLCBtYXhyYXRlLCBhaS0+bWluX3JhdGUsIGFpLT5tYXhfcmF0ZSk7CisKKyAgaWYgKChhaS0+Y2FwcyAmIFBDTV9DQVBfRlJFRVJBVEUpKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKG9iaiwgImRldmljZSBzdXBwb3J0cyBhbnkgc2FtcGxlIHJhdGUgYmV0d2VlbiBtaW4gYW5kIG1heCIpOworICAgIGlmIChtaW5yYXRlID09IG1heHJhdGUpIHsKKyAgICAgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR19UWVBFX0lOVCk7CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKCZ2YWwsIG1heHJhdGUpOworICAgIH0gZWxzZSB7CisgICAgICBnX3ZhbHVlX2luaXQgKCZ2YWwsIEdTVF9UWVBFX0lOVF9SQU5HRSk7CisgICAgICBnc3RfdmFsdWVfc2V0X2ludF9yYW5nZSAoJnZhbCwgbWlucmF0ZSwgbWF4cmF0ZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9MT0dfT0JKRUNUIChvYmosICIlZCBzYW1wbGUgcmF0ZXM6IiwgYWktPm5yYXRlcyk7CisgICAgZ192YWx1ZV9pbml0ICgmdmFsLCBHU1RfVFlQRV9MSVNUKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYWktPm5yYXRlczsgKytpKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAob2JqLCAiIHJhdGU6ICVkIiwgYWktPnJhdGVzW2ldKTsKKworICAgICAgaWYgKGFpLT5yYXRlc1tpXSA+PSBtaW5yYXRlICYmIGFpLT5yYXRlc1tpXSA8PSBtYXhyYXRlKSB7CisgICAgICAgIEdWYWx1ZSByYXRlX3ZhbCA9IHsgMCwgfTsKKworICAgICAgICBnX3ZhbHVlX2luaXQgKCZyYXRlX3ZhbCwgR19UWVBFX0lOVCk7CisgICAgICAgIGdfdmFsdWVfc2V0X2ludCAoJnJhdGVfdmFsLCBhaS0+cmF0ZXNbaV0pOworICAgICAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfdmFsdWUgKCZ2YWwsICZyYXRlX3ZhbCk7CisgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZyYXRlX3ZhbCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGdzdF92YWx1ZV9saXN0X2dldF9zaXplICgmdmFsKSA9PSAwKSB7CisgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdmFsKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpOyArK2kpIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSk7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKHMsICJyYXRlIiwgJnZhbCk7CisgIH0KKworICBnX3ZhbHVlX3Vuc2V0ICgmdmFsKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3M0X2F1ZGlvX2dldF9jaGFubmVsX2xheW91dCAoR3N0T2JqZWN0ICogb2JqLCBndWludDY0IGxheW91dCwKKyAgICBndWludCBudW1fY2hhbm5lbHMsIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uICogY2hfbGF5b3V0KQoreworICBjb25zdCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBwb3NfbWFwWzE2XSA9IHsKKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FLCAgICAvKiAwID0gZHVubm8gICAgICAgICAgKi8KKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULCAgICAgIC8qIDEgPSBsZWZ0ICAgICAgICAgICAqLworICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULCAgICAgLyogMiA9IHJpZ2h0ICAgICAgICAgICovCisgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSLCAgICAvKiAzID0gY2VudGVyICAgICAgICAgKi8KKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxLCAgICAvKiA0ID0gbGZlICAgICAgICAgICAgKi8KKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQsICAgICAgIC8qIDUgPSBsZWZ0IHN1cnJvdW5kICAqLworICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1NJREVfUklHSFQsICAgICAgLyogNiA9IHJpZ2h0IHN1cnJvdW5kICovCisgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZULCAgICAgICAvKiA3ID0gbGVmdCByZWFyICAgICAgKi8KKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX1JJR0hULCAgICAgIC8qIDggPSByaWdodCByZWFyICAgICAqLworICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX05PTkUsCisgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTk9ORSwKKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FLAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX05PTkUsCisgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTk9ORSwKKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FLAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX05PTkUKKyAgfTsKKyAgZ3VpbnQgc3BlYWtlcl9wb3M7ICAgICAgICAgICAgLyogc3BlYWtlciBwb3NpdGlvbiBhcyBkZWZpbmVkIGJ5IE9TUyAqLworICBndWludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fY2hhbm5lbHM7ICsraSkgeworICAgIC8qIGxheW91dCBjb250YWlucyB1cCB0byAxNiBzcGVha2VyIHBvc2l0aW9ucywgd2l0aCBlYWNoIHRha2luZyB1cCA0IGJpdHMgKi8KKyAgICBzcGVha2VyX3BvcyA9IChndWludCkgKChsYXlvdXQgPj4gKGkgKiA0KSkgJiAweDBmKTsKKworICAgIC8qIGlmIGl0J3MgYSBjaGFubmVsIHBvc2l0aW9uIHRoYXQncyB1bmtub3duIHRvIHVzLCBzZXQgYWxsIHRvIE5PTkUgYW5kCisgICAgICogYmFpbCBvdXQgKi8KKyAgICBpZiAoR19VTkxJS0VMWSAocG9zX21hcFtzcGVha2VyX3Bvc10gPT0gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTk9ORSkpCisgICAgICBnb3RvIG5vX2xheW91dDsKKworICAgIGNoX2xheW91dFtpXSA9IHBvc19tYXBbc3BlYWtlcl9wb3NdOworICB9CisKKyAgcmV0dXJuOworCitub19sYXlvdXQ6CisgIHsKKyAgICAvKiBvbmx5IHdhcm4gaWYgaXQncyByZWFsbHkgdW5rbm93biwgcG9zaXRpb24gMCBpcyBvayBhbmQgcmVwcmVzZW50cyBOT05FCisgICAgICogKGluIHdoaWNoIGNhc2Ugd2UgYWxzbyBqdXN0IHNldCBhbGwgb3RoZXJzIHRvIE5PTkUgaWdub3JpbmcgdGhlIG90aGVyCisgICAgICogcG9zaXRpb25zIGluIHRoZSBPU1MtZ2l2ZW4gbGF5b3V0LCBiZWNhdXNlIHRoYXQncyB3aGF0IHdlIGN1cnJlbnRseQorICAgICAqIHJlcXVpcmUgaW4gR1N0cmVhbWVyKSAqLworICAgIGlmIChzcGVha2VyX3BvcyAhPSAwKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG9iaiwgInVua25vd24gT1NTIGNoYW5uZWwgcG9zaXRpb24gJXgiLCBjaF9sYXlvdXRbaV0pOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NoYW5uZWxzOyArK2kpIHsKKyAgICAgIGNoX2xheW91dFtpXSA9IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX05PTkU7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X29zczRfYXVkaW9fc2V0X3JpbmdidWZmZXJfY2hhbm5lbF9sYXlvdXQgKEdzdE9iamVjdCAqIG9iaiwgZ2ludCBmZCwKKyAgICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYykKK3sKKyAgZ3VpbnQgbnVtX2NoYW5uZWxzOworICBndWludDY0IGxheW91dCA9IDA7CisgIEdzdEF1ZGlvUmluZ0J1ZmZlciAqcmI7CisgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIGNoX2xheW91dFs4XSA9IHsgMCwgfTsKKworICBudW1fY2hhbm5lbHMgPSBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJnNwZWMtPmluZm8pOworICBpZiAobnVtX2NoYW5uZWxzIDwgMyB8fCBudW1fY2hhbm5lbHMgPiA4KQorICAgIHJldHVybjsKKworICBpZiAoc3BlYy0+dHlwZSAhPSBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfUkFXKQorICAgIHJldHVybjsKKworICBpZiAoR1NUX0lTX09TUzRfU0lOSyAob2JqKSkgeworICAgIHJiID0gR1NUX0FVRElPX0JBU0VfU0lOSyAob2JqKS0+cmluZ2J1ZmZlcjsKKyAgfSBlbHNlIGlmIChHU1RfSVNfT1NTNF9TT1VSQ0UgKG9iaikpIHsKKyAgICByYiA9IEdTVF9BVURJT19CQVNFX1NSQyAob2JqKS0+cmluZ2J1ZmZlcjsKKyAgfSBlbHNlCisgICAgZ19yZXR1cm5faWZfcmVhY2hlZCAoKTsKKworICAvKiAtMSA9IGdldCBpbmZvIGZvciBjdXJyZW50bHkgb3BlbiBkZXZpY2UgKGZkKS4gVGhpcyB3aWxsIGZhaWwgd2l0aAorICAgKiBPU1MgYnVpbGQgPD0gMTAxMyBiZWNhdXNlIG9mIGEgYnVnIGluIE9TUyAqLworICBpZiAoaW9jdGwgKGZkLCBTTkRDVExfRFNQX0dFVF9DSE5PUkRFUiwgJmxheW91dCkgPT0gLTEpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG9iaiwgImNvdWxkbid0IHF1ZXJ5IGNoYW5uZWwgbGF5b3V0LCBhc3N1bWluZyBkZWZhdWx0Iik7CisgICAgbGF5b3V0ID0gQ0hOT1JERVJfTk9STUFMOworICB9CisgIEdTVF9ERUJVR19PQkpFQ1QgKG9iaiwgImNoYW5uZWwgbGF5b3V0OiAlMDgiIEdfR0lOVDY0X01PRElGSUVSICJ4IiwgbGF5b3V0KTsKKworCisgIGdzdF9vc3M0X2F1ZGlvX2dldF9jaGFubmVsX2xheW91dCAob2JqLCBsYXlvdXQsIG51bV9jaGFubmVscywgY2hfbGF5b3V0KTsKKyAgZ3N0X2F1ZGlvX3JpbmdfYnVmZmVyX3NldF9jaGFubmVsX3Bvc2l0aW9ucyAocmIsIGNoX2xheW91dCk7CisKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zczRfYXVkaW9fYWRkX2NoYW5uZWxfbGF5b3V0IChHc3RPYmplY3QgKiBvYmosIGd1aW50NjQgbGF5b3V0LAorICAgIGd1aW50IG51bV9jaGFubmVscywgR3N0U3RydWN0dXJlICogcykKK3sKKyAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gY2hfbGF5b3V0WzhdID0geyAwLCB9OworICBndWludDY0IG1hc2s7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAobnVtX2NoYW5uZWxzIDw9IEdfTl9FTEVNRU5UUyAoY2hfbGF5b3V0KSk7CisKKyAgZ3N0X29zczRfYXVkaW9fZ2V0X2NoYW5uZWxfbGF5b3V0IChvYmosIGxheW91dCwgbnVtX2NoYW5uZWxzLCBjaF9sYXlvdXQpOworICBpZiAoZ3N0X2F1ZGlvX2NoYW5uZWxfcG9zaXRpb25zX3RvX21hc2sgKGNoX2xheW91dCwgbnVtX2NoYW5uZWxzLCBGQUxTRSwKKyAgICAgICAgICAmbWFzaykpCisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJjaGFubmVsLW1hc2siLCBHU1RfVFlQRV9CSVRNQVNLLCBtYXNrLCBOVUxMKTsKKworICByZXR1cm47Cit9CisKKy8qIGFyYml0cmFyeSBtYXguIGxpbWl0ICovCisjZGVmaW5lIEdTVF9PU1M0X01JTl9DSEFOTkVMUyAxCisjZGVmaW5lIEdTVF9PU1M0X01BWF9DSEFOTkVMUyA0MDk2CisKKy8qIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgaW5wdXQgY2FwcyAqLworc3RhdGljIEdzdENhcHMgKgorZ3N0X29zczRfYXVkaW9fZGV0ZWN0X2NoYW5uZWxzIChHc3RPYmplY3QgKiBvYmosIGludCBmZCwgb3NzX2F1ZGlvaW5mbyAqIGFpLAorICAgIEdzdENhcHMgKiBpbl9jYXBzKQoreworICBjb25zdCBnY2hhciAqZm9yY2VkX2xheW91dDsKKyAgR3N0U3RydWN0dXJlICpzID0gTlVMTDsKKyAgZ3VpbnQ2NCBsYXlvdXQgPSAwOworICBHc3RDYXBzICpjaGFuX2NhcHMgPSBOVUxMOworICBHc3RDYXBzICpvdXRfY2FwcyA9IE5VTEw7CisgIGludCBtaW5jaGFucywgbWF4Y2hhbnM7CisgIGludCBjLCBpLCBqOworCisgIC8qIEdTVF9PU1M0X0NIQU5ORUxfTEFZT1VUIGVudmlyb25tZW50IHZhcmlhYmxlOiBtYXkgYmUgdXNlZCB0byBmb3JjZSBhCisgICAqIHBhcnRpY3VsYXIgY2hhbm5lbCBsYXlvdXQgKGlmIGl0IGNvbnRhaW5zIGFuIG9kZCBudW1iZXIgb2YgY2hhbm5lbAorICAgKiBwb3NpdGlvbnMgaXQgd2lsbCBhbHNvIG1ha2UgdXMgYWR2ZXJ0aXNlIGEgY2hhbm5lbCBsYXlvdXQgZm9yIHRoYXQKKyAgICogY2hhbm5lbCBjb3VudCwgZXZlbiBpZiB3ZSdkIHVzdWFsbHkgc2tpcCBpdDsgdGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bAorICAgKiBmb3IgZm9sa3Mgd2l0aCAyLjEgc3BlYWtlcnMsIEkgZ3Vlc3MpICovCisgIGZvcmNlZF9sYXlvdXQgPSBnX2dldGVudiAoIkdTVF9PU1M0X0NIQU5ORUxfTEFZT1VUIik7CisKKyAgbWluY2hhbnMgPSBhaS0+bWluX2NoYW5uZWxzOworICBtYXhjaGFucyA9IGFpLT5tYXhfY2hhbm5lbHM7CisKKyAgLyogc2FuaXR5IGNoZWNrICovCisgIGlmIChtaW5jaGFucyA+IG1heGNoYW5zKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChvYmosICJtaW5fY2hhbnMgJWQgPiBtYXhfY2hhbnMgJWQgKGJ1Z2d5IGRyaXZlcj8pIiwKKyAgICAgICAgbWluY2hhbnMsIG1heGNoYW5zKTsKKyAgICBtYXhjaGFucyA9IGFpLT5taW5fY2hhbm5lbHM7ICAgICAgICAvKiBzd2FwICovCisgICAgbWluY2hhbnMgPSBhaS0+bWF4X2NoYW5uZWxzOworICB9CisKKyAgLyogbGltaXQgdG8gc29tZXRoaW5nIHNlbnNpYmxlICovCisgIGlmIChtaW5jaGFucyA8IEdTVF9PU1M0X01JTl9DSEFOTkVMUykKKyAgICBtaW5jaGFucyA9IEdTVF9PU1M0X01JTl9DSEFOTkVMUzsKKyAgaWYgKG1heGNoYW5zID4gR1NUX09TUzRfTUFYX0NIQU5ORUxTKQorICAgIG1heGNoYW5zID0gR1NUX09TUzRfTUFYX0NIQU5ORUxTOworCisgIGlmIChtYXhjaGFucyA8IEdTVF9PU1M0X01JTl9DSEFOTkVMUykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAob2JqLCAibWF4X2NoYW5zIDwgJWQsIHdoaWNoIG1ha2VzIG5vIHNlbnNlIiwKKyAgICAgICAgR1NUX09TUzRfTUlOX0NIQU5ORUxTKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoaW5fY2Fwcyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAob2JqLCAibWluX2NoYW5uZWxzICVkLCBtYXhfY2hhbm5lbHMgJWQgKG9yaWdpbmFsbHk6ICVkLCAlZCkiLAorICAgICAgbWluY2hhbnMsIG1heGNoYW5zLCBhaS0+bWluX2NoYW5uZWxzLCBhaS0+bWF4X2NoYW5uZWxzKTsKKworICBjaGFuX2NhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHkgKCk7CisKKyAgLyogZmlyc3QgZG8gdGhlIHNpbXBsZSBjYXNlczogbW9ubyArIHN0ZXJlbyAoY2hhbm5lbCBsYXlvdXQgaW1wbGllZCkgKi8KKyAgaWYgKG1pbmNoYW5zID09IDEgJiYgbWF4Y2hhbnMgPT0gMSkKKyAgICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJ4IiwgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMSwgTlVMTCk7CisgIGVsc2UgaWYgKG1pbmNoYW5zID09IDIgJiYgbWF4Y2hhbnMgPj0gMikKKyAgICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJ4IiwgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMiwgTlVMTCk7CisgIGVsc2UgaWYgKG1pbmNoYW5zID09IDEgJiYgbWF4Y2hhbnMgPj0gMikKKyAgICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJ4IiwgImNoYW5uZWxzIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCAyLCBOVUxMKTsKKyAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoY2hhbl9jYXBzLCBzKTsKKyAgcyA9IE5VTEw7CisKKyAgLyogVE9ETzogd2UgYXNzdW1lIGFsbCBkcml2ZXJzIHVzZSBhIGxlZnQvcmlnaHQgbGF5b3V0IGZvciBzdGVyZW8gaGVyZSAqLworICBpZiAobWF4Y2hhbnMgPD0gMikKKyAgICBnb3RvIGRvbmU7CisKKyAgaWYgKGlvY3RsIChmZCwgU05EQ1RMX0RTUF9HRVRfQ0hOT1JERVIsICZsYXlvdXQpID09IC0xKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChvYmosICJjb3VsZG4ndCBxdWVyeSBjaGFubmVsIGxheW91dCwgYXNzdW1pbmcgZGVmYXVsdCIpOworICAgIGxheW91dCA9IENITk9SREVSX05PUk1BTDsKKyAgfQorICBHU1RfREVCVUdfT0JKRUNUIChvYmosICJjaGFubmVsIGxheW91dDogJTA4IiBHX0dJTlQ2NF9NT0RJRklFUiAieCIsIGxheW91dCk7CisKKyAgLyogZS5nLiBmb3JjZWQgMi4xIGxheW91dCB3b3VsZCBiZSBHU1RfT1NTNF9DSEFOTkVMX0xBWU9VVD00MjEgKi8KKyAgaWYgKGZvcmNlZF9sYXlvdXQgIT0gTlVMTCAmJiAqZm9yY2VkX2xheW91dCAhPSAnXDAnKSB7CisgICAgZ3VpbnQgbGF5b3V0X2xlbjsKKworICAgIGxheW91dF9sZW4gPSBzdHJsZW4gKGZvcmNlZF9sYXlvdXQpOworICAgIGlmIChsYXlvdXRfbGVuID49IG1pbmNoYW5zICYmIGxheW91dF9sZW4gPD0gbWF4Y2hhbnMpIHsKKyAgICAgIGxheW91dCA9IGdfYXNjaWlfc3RydG91bGwgKGZvcmNlZF9sYXlvdXQsIE5VTEwsIDE2KTsKKyAgICAgIG1heGNoYW5zID0gbGF5b3V0X2xlbjsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG9iaiwgImZvcmNlZCBjaGFubmVsIGxheW91dDogJTA4IiBHX0dJTlQ2NF9NT0RJRklFUiAieCIKKyAgICAgICAgICAiICgnJXMnKSwgbWF4Y2hhbnMgbm93ICVkIiwgbGF5b3V0LCBmb3JjZWRfbGF5b3V0LCBtYXhjaGFucyk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAob2JqLCAiaWdub3JpbmcgZm9yY2VkIGNoYW5uZWwgbGF5b3V0OiBsYXlvdXQgaGFzICVkICIKKyAgICAgICAgICAiY2hhbm5lbCBwb3NpdGlvbnMgYnV0IG1heGNoYW5zIGlzICVkIiwgbGF5b3V0X2xlbiwgbWF4Y2hhbnMpOworICAgIH0KKyAgfQorCisgIC8qIG5lZWQgdG8gYWR2ZXJ0aXNlIGNoYW5uZWwgbGF5b3V0cyBmb3IgYW55dGhpbmcgPjIgYW5kIDw9OCBjaGFubmVscyAqLworICBmb3IgKGMgPSBNQVggKDMsIG1pbmNoYW5zKTsgYyA8PSBNSU4gKG1heGNoYW5zLCA4KTsgYysrKSB7CisgICAgLyogIlRoZSBtaW5fY2hhbm5lbHMgYW5kIG1heF9jaGFubmVscyBmaWVsZHMgZGVmaW5lIHRoZSBsaW1pdHMgZm9yIHRoZQorICAgICAqIG51bWJlciBvZiBjaGFubmVscy4gSG93ZXZlciBzb21lIGRldmljZXMgZG9uJ3Qgc3VwcG9ydCBhbGwgY2hhbm5lbHMKKyAgICAgKiB3aXRoaW4gdGhpcyByYW5nZS4gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBvZGQgdmFsdWVzICgzLCA1LCA3LCA5LCBldGMpLgorICAgICAqIGFyZSBub3Qgc3VwcG9ydGVkLiBUaGVyZSBpcyBjdXJyZW50bHkgbm8gd2F5IHRvIGNoZWNrIGZvciB0aGlzIG90aGVyCisgICAgICogdGhhbiBjaGVja2luZyBpZiBTTkRDVExfRFNQX0NIQU5ORUxTIGFjY2VwdHMgdGhlIHJlcXVlc3RlZCB2YWx1ZS4KKyAgICAgKiBBbm90aGVyIGFwcHJvYWNoIGlzIHRyeWluZyB0byBhdm9pZCB1c2luZyBvZGQgbnVtYmVyIG9mIGNoYW5uZWxzLiIKKyAgICAgKgorICAgICAqIFNvLCB3ZSBkb24ndCBrbm93IGZvciBzdXJlIGlmIHRoZXNlIG9kZCB2YWx1ZXMgYXJlIHN1cHBvcnRlZDoKKyAgICAgKi8KKyAgICBpZiAoKGMgPT0gMyB8fCBjID09IDUgfHwgYyA9PSA3KSAmJiAoYyAhPSBtYXhjaGFucykpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChvYmosICJub3QgYWRkaW5nIGxheW91dCB3aXRoICVkIGNoYW5uZWxzIiwgYyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJ4IiwgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgYywgTlVMTCk7CisgICAgZ3N0X29zczRfYXVkaW9fYWRkX2NoYW5uZWxfbGF5b3V0IChvYmosIGxheW91dCwgYywgcyk7CisgICAgR1NUX0xPR19PQkpFQ1QgKG9iaiwgImM9JXUsIGFwcGVuZGluZyBzdHJ1Y3QgJSIgR1NUX1BUUl9GT1JNQVQsIGMsIHMpOworICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKGNoYW5fY2Fwcywgcyk7CisgICAgcyA9IE5VTEw7CisgIH0KKworICBpZiAobWF4Y2hhbnMgPD0gOCkKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogZm9yIGV2ZXJ5dGhpbmcgPjggY2hhbm5lbHMsIENIQU5ORUxfUE9TSVRJT05fTk9ORSBpcyBpbXBsaWVkLiAqLworICBpZiAobWluY2hhbnMgPT0gbWF4Y2hhbnMgfHwgbWF4Y2hhbnMgPT0gOSkgeworICAgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAoIngiLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBtYXhjaGFucywgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgieCIsICJjaGFubmVscyIsIEdTVF9UWVBFX0lOVF9SQU5HRSwKKyAgICAgICAgTUFYICg5LCBtaW5jaGFucyksIG1heGNoYW5zLCBOVUxMKTsKKyAgfQorICBnc3RfY2Fwc19hcHBlbmRfc3RydWN0dXJlIChjaGFuX2NhcHMsIHMpOworICBzID0gTlVMTDsKKworZG9uZToKKworICBHU1RfTE9HX09CSkVDVCAob2JqLCAiY2hhbm5lbCBzdHJ1Y3R1cmVzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2hhbl9jYXBzKTsKKworICBvdXRfY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKworICAvKiBjb21iaW5lIGVhY2ggc3RydWN0dXJlIGluIHRoZSBpbnB1dCBjYXBzIHdpdGggZWFjaCBjaGFubmVsIGNhcHMgc3RydWN0ICovCisgIGZvciAoaSA9IDA7IGkgPCBnc3RfY2Fwc19nZXRfc2l6ZSAoaW5fY2Fwcyk7ICsraSkgeworICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqaW5fczsKKworICAgIGluX3MgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChpbl9jYXBzLCBpKTsKKworICAgIGZvciAoaiA9IDA7IGogPCBnc3RfY2Fwc19nZXRfc2l6ZSAoY2hhbl9jYXBzKTsgKytqKSB7CisgICAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKmNoYW5fczsKKyAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsOworCisgICAgICBzID0gZ3N0X3N0cnVjdHVyZV9jb3B5IChpbl9zKTsKKyAgICAgIGNoYW5fcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNoYW5fY2Fwcywgaik7CisgICAgICBpZiAoKHZhbCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChjaGFuX3MsICJjaGFubmVscyIpKSkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKHMsICJjaGFubmVscyIsIHZhbCk7CisgICAgICBpZiAoKHZhbCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChjaGFuX3MsICJjaGFubmVsLW1hc2siKSkpCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChzLCAiY2hhbm5lbC1tYXNrIiwgdmFsKTsKKworICAgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAob3V0X2NhcHMsIHMpOworICAgICAgcyA9IE5VTEw7CisgICAgfQorICB9CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGluX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2hhbl9jYXBzKTsKKyAgcmV0dXJuIG91dF9jYXBzOworfQorCitHc3RDYXBzICoKK2dzdF9vc3M0X2F1ZGlvX3Byb2JlX2NhcHMgKEdzdE9iamVjdCAqIG9iaiwgaW50IGZkKQoreworICBvc3NfYXVkaW9pbmZvIGFpID0geyAwLCB9OworICBnYm9vbGVhbiBvdXRwdXQ7CisgIEdzdENhcHMgKmNhcHM7CisgIGludCBub25uYXRpdmVfZm9ybWF0cyA9IDA7CisgIGludCBmb3JtYXRzLCBpOworCisgIG91dHB1dCA9IEdTVF9JU19PU1M0X1NJTksgKG9iaik7CisKKyAgLyogLTEgPSBnZXQgaW5mbyBmb3IgY3VycmVudGx5IG9wZW4gZGV2aWNlIChmZCkuIFRoaXMgd2lsbCBmYWlsIHdpdGgKKyAgICogT1NTIGJ1aWxkIDw9IDEwMTMgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBPU1MgKi8KKyAgYWkuZGV2ID0gLTE7CisgIGlmIChpb2N0bCAoZmQsIFNORENUTF9FTkdJTkVJTkZPLCAmYWkpID09IC0xKQorICAgIGdvdG8gZW5naW5laW5mb19mYWlsZWQ7CisKKyAgZm9ybWF0cyA9IChvdXRwdXQpID8gYWkub2Zvcm1hdHMgOiBhaS5pZm9ybWF0czsKKworICBHU1RfTE9HX09CSkVDVCAob2JqLCAiJXMgZm9ybWF0cyA6IDB4JTA4eCIsIChvdXRwdXQpID8gIm91dCIgOiAiaW4iLCBmb3JtYXRzKTsKKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIC8qIGZpcnN0IGxpc3QgYWxsIHRoZSBmb3JtYXRzIG5hdGl2ZWx5IHN1cHBvcnRlZCAqLworICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTIChmbXRfbWFwKTsgKytpKSB7CisgICAgaWYgKChmb3JtYXRzICYgZm10X21hcFtpXS5vc3NfZm10KSkgeworICAgICAgZ3N0X29zczRfYXBwZW5kX2Zvcm1hdF90b19jYXBzICgmZm10X21hcFtpXSwgY2Fwcyk7CisgICAgfSBlbHNlIGlmICgoZm10X21hcFtpXS5vc3NfZm10ICYgQ09OVkVSVElCTEVfRk9STUFUUykpIHsKKyAgICAgIG5vbm5hdGl2ZV9mb3JtYXRzIHw9IGZtdF9tYXBbaV0ub3NzX2ZtdDsKKyAgICB9CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAob2JqLCAiYWRkaW5nIG5vbi1uYXRpdmUgJXMgZm9ybWF0cyA6IDB4JTA4eCIsCisgICAgICAob3V0cHV0KSA/ICJvdXQiIDogImluIiwgbm9ubmF0aXZlX2Zvcm1hdHMpOworCisgIC8qIG5vdyBhcHBlbmQgbm9uLW5hdGl2ZSBmb3JtYXRzIGZvciB3aGljaCBjb252ZXJzaW9uIHdvdWxkIGJlIG5lZWRlZCAqLworICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTIChmbXRfbWFwKTsgKytpKSB7CisgICAgaWYgKChub25uYXRpdmVfZm9ybWF0cyAmIGZtdF9tYXBbaV0ub3NzX2ZtdCkpIHsKKyAgICAgIGdzdF9vc3M0X2FwcGVuZF9mb3JtYXRfdG9fY2FwcyAoJmZtdF9tYXBbaV0sIGNhcHMpOworICAgIH0KKyAgfQorCisgIGNhcHMgPSBnc3RfY2Fwc19zaW1wbGlmeSAoY2Fwcyk7CisgIEdTVF9MT0dfT0JKRUNUIChvYmosICJmb3JtYXRzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgaWYgKCFnc3Rfb3NzNF9hdWRpb19kZXRlY3RfcmF0ZXMgKG9iaiwgJmFpLCBjYXBzKSkKKyAgICBnb3RvIGRldGVjdF9yYXRlc19mYWlsZWQ7CisKKyAgY2FwcyA9IGdzdF9vc3M0X2F1ZGlvX2RldGVjdF9jaGFubmVscyAob2JqLCBmZCwgJmFpLCBjYXBzKTsKKyAgaWYgKGNhcHMgPT0gTlVMTCkKKyAgICBnb3RvIGRldGVjdF9jaGFubmVsc19mYWlsZWQ7CisKKyAgR1NUX0xPR19PQkpFQ1QgKG9iaiwgInByb2JlZCBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgcmV0dXJuIGNhcHM7CisKKy8qIEVSUk9SUyAqLworZW5naW5laW5mb19mYWlsZWQ6CisgIHsKKyAgICBHU1RfV0FSTklORyAoIkVOR0lORUlORk8gc3VwcG9ydGVkIGZvcm1hdHMgcHJvYmUgZmFpbGVkOiAlcyIsCisgICAgICAgIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2RldGVjdF9yYXRlc19mYWlsZWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG9iaiwgImZhaWxlZCB0byBkZXRlY3Qgc3VwcG9ydGVkIHNhbXBsZSByYXRlcyIpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorZGV0ZWN0X2NoYW5uZWxzX2ZhaWxlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAob2JqLCAiZmFpbGVkIHRvIGRldGVjdCBzdXBwb3J0ZWQgY2hhbm5lbHMiKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworR3N0Q2FwcyAqCitnc3Rfb3NzNF9hdWRpb19nZXRfdGVtcGxhdGVfY2FwcyAodm9pZCkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2ludCBpOworCisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHkgKCk7CisKKyAgZm9yIChpID0gMDsgaSA8IEdfTl9FTEVNRU5UUyAoZm10X21hcCk7ICsraSkgeworICAgIGdzdF9vc3M0X2FwcGVuZF9mb3JtYXRfdG9fY2FwcyAoJmZtdF9tYXBbaV0sIGNhcHMpOworICB9CisKKyAgY2FwcyA9IGdzdF9jYXBzX3NpbXBsaWZ5IChjYXBzKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpOyArK2kpIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSk7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJyYXRlIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCBHU1RfT1NTNF9NSU5fU0FNUExFX1JBVEUsCisgICAgICAgIEdTVF9PU1M0X01BWF9TQU1QTEVfUkFURSwgImNoYW5uZWxzIiwgR1NUX1RZUEVfSU5UX1JBTkdFLAorICAgICAgICBHU1RfT1NTNF9NSU5fQ0hBTk5FTFMsIEdTVF9PU1M0X01BWF9DSEFOTkVMUywgTlVMTCk7CisgIH0KKworICByZXR1cm4gY2FwczsKK30KKworLyogY2FsbGVkIGJ5IGdzdF9vc3M0X3NpbmtfcHJlcGFyZSgpIGFuZCBnc3Rfb3NzNF9zb3VyY2VfcHJlcGFyZSgpICovCitnYm9vbGVhbgorZ3N0X29zczRfYXVkaW9fc2V0X2Zvcm1hdCAoR3N0T2JqZWN0ICogb2JqLCBpbnQgZmQsCisgICAgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpCit7CisgIHN0cnVjdCBhdWRpb19idWZfaW5mbyBpbmZvID0geyAwLCB9OworICBpbnQgb2ZtdCwgZm10LCBjaGFucywgcmF0ZSwgd2lkdGg7CisKKyAgZm10ID0gZ3N0X29zczRfYXVkaW9fZ2V0X29zc19mb3JtYXQgKHNwZWMtPnR5cGUsCisgICAgICBHU1RfQVVESU9fSU5GT19GT1JNQVQgKCZzcGVjLT5pbmZvKSk7CisKKyAgaWYgKGZtdCA9PSAwKQorICAgIGdvdG8gd3JvbmdfZm9ybWF0OworCisgIG9mbXQgPSBmbXQ7CisgIGNoYW5zID0gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKCZzcGVjLT5pbmZvKTsKKyAgcmF0ZSA9IEdTVF9BVURJT19JTkZPX1JBVEUgKCZzcGVjLT5pbmZvKTsKKyAgd2lkdGggPSBHU1RfQVVESU9fSU5GT19XSURUSCAoJnNwZWMtPmluZm8pOworCisgIGlmIChzcGVjLT50eXBlID09IEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9SQVcgJiYKKyAgICAgIHdpZHRoICE9IDMyICYmIHdpZHRoICE9IDI0ICYmIHdpZHRoICE9IDE2ICYmIHdpZHRoICE9IDgpIHsKKyAgICBnb3RvIGRvZGd5X3dpZHRoOworICB9CisKKyAgLyogZm9ybWF0ICovCisgIEdTVF9MT0dfT0JKRUNUIChvYmosICJzZXR0aW5nIGZvcm1hdDogJWQiLCBmbXQpOworICBpZiAoaW9jdGwgKGZkLCBTTkRDVExfRFNQX1NFVEZNVCwgJmZtdCkgPT0gLTEpCisgICAgZ290byBzZXRfZm9ybWF0X2ZhaWxlZDsKKworICAvKiBjaGFubmVscyAqLworICBHU1RfTE9HX09CSkVDVCAob2JqLCAic2V0dGluZyBjaGFubmVsczogJWQiLCBjaGFucyk7CisgIGlmIChpb2N0bCAoZmQsIFNORENUTF9EU1BfQ0hBTk5FTFMsICZjaGFucykgPT0gLTEpCisgICAgZ290byBzZXRfY2hhbm5lbHNfZmFpbGVkOworCisgIC8qIHJhdGUgKi8KKyAgR1NUX0xPR19PQkpFQ1QgKG9iaiwgInNldHRpbmcgcmF0ZTogJWQiLCByYXRlKTsKKyAgaWYgKGlvY3RsIChmZCwgU05EQ1RMX0RTUF9TUEVFRCwgJnJhdGUpID09IC0xKQorICAgIGdvdG8gc2V0X3JhdGVfZmFpbGVkOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG9iaiwgImVmZmVjdGl2ZSBmb3JtYXQgICA6ICVkIiwgZm10KTsKKyAgR1NUX0RFQlVHX09CSkVDVCAob2JqLCAiZWZmZWN0aXZlIGNoYW5uZWxzIDogJWQiLCBjaGFucyk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKG9iaiwgImVmZmVjdGl2ZSByYXRlICAgICA6ICVkIiwgcmF0ZSk7CisKKyAgLyogbWFrZSBzdXJlIGZvcm1hdCwgY2hhbm5lbHMsIGFuZCByYXRlIGFyZSB0aGUgb25lcyB3ZSByZXF1ZXN0ZWQgKi8KKyAgaWYgKGZtdCAhPSBvZm10IHx8IGNoYW5zICE9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTICgmc3BlYy0+aW5mbykgfHwKKyAgICAgIHJhdGUgIT0gR1NUX0FVRElPX0lORk9fUkFURSAoJnNwZWMtPmluZm8pKSB7CisgICAgLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBidXQgaGV5ICovCisgICAgZ290byBmb3JtYXRfbm90X3doYXRfd2FzX3JlcXVlc3RlZDsKKyAgfQorCisgIGlmIChHU1RfSVNfT1NTNF9TT1VSQ0UgKG9iaikpIHsKKyAgICBpZiAoaW9jdGwgKGZkLCBTTkRDVExfRFNQX0dFVElTUEFDRSwgJmluZm8pID09IC0xKQorICAgICAgZ290byBnZXRfaXNwYWNlX2ZhaWxlZDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoaW9jdGwgKGZkLCBTTkRDVExfRFNQX0dFVE9TUEFDRSwgJmluZm8pID09IC0xKQorICAgICAgZ290byBnZXRfb3NwYWNlX2ZhaWxlZDsKKyAgfQorCisgIHNwZWMtPnNlZ3NpemUgPSBpbmZvLmZyYWdzaXplOworCisgIC8qIHdlIGFkZCBzb21lIGV4dHJhIGZyYWdtZW50cyAtLSB0aGlzIGhlbHBzIHVzIGFjY291bnQgZm9yIGRlbGF5cyBkdWUgdG8KKyAgICogY29udmVyc2lvbiBidWZmZXIsIHN0cmVhbXMgcXVldWVpbmcsIGV0Yy4gIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZXNlCisgICAqIGJlIHRha2VuIGludG8gYWNjb3VudCBiZWNhdXNlIG90aGVyd2lzZSB0aGUgZGVsYXkgY291bnRlciBjYW4gd2luZCB1cAorICAgKiBiZWluZyB0b28gbGFyZ2UsIGFuZCB0aGUgYnVmZmVyIHdpbGwgd3JhcC4gICovCisgIHNwZWMtPnNlZ3RvdGFsID0gaW5mby5mcmFnc3RvdGFsICsgNDsKKworICBHU1RfREVCVUdfT0JKRUNUIChvYmosICJnb3Qgc2Vnc2l6ZTogJWQsIHNlZ3RvdGFsOiAlZCwgdmFsdWU6ICUwOHgiLAorICAgICAgc3BlYy0+c2Vnc2l6ZSwgc3BlYy0+c2VndG90YWwsIGluZm8uZnJhZ3NpemUpOworCisgIGdzdF9vc3M0X2F1ZGlvX3NldF9yaW5nYnVmZmVyX2NoYW5uZWxfbGF5b3V0IChvYmosIGZkLCBzcGVjKTsKKworICByZXR1cm4gVFJVRTsKKworLyogRVJST1JTICovCit3cm9uZ19mb3JtYXQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAob2JqLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJVbmFibGUgdG8gZ2V0IGZvcm1hdCAoJWQsICVkKSIsIHNwZWMtPnR5cGUsCisgICAgICAgICAgICBHU1RfQVVESU9fSU5GT19GT1JNQVQgKCZzcGVjLT5pbmZvKSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorZG9kZ3lfd2lkdGg6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAob2JqLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJ1bmV4cGVjdGVkIHdpZHRoICVkIiwgd2lkdGgpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3NldF9mb3JtYXRfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9iaiwgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgiRFNQX1NFVEZNVCglZCkgZmFpbGVkOiAlcyIsIGZtdCwgZ19zdHJlcnJvciAoZXJybm8pKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitzZXRfY2hhbm5lbHNfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9iaiwgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgiRFNQX0NIQU5ORUxTKCVkKSBmYWlsZWQ6ICVzIiwgY2hhbnMsIGdfc3RyZXJyb3IgKGVycm5vKSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorc2V0X3JhdGVfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9iaiwgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgiRFNQX1NQRUVEKCVkKSBmYWlsZWQ6ICVzIiwgcmF0ZSwgZ19zdHJlcnJvciAoZXJybm8pKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitnZXRfb3NwYWNlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChvYmosIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAoIkRTUF9HRVRPU1BBQ0UgZmFpbGVkOiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorZ2V0X2lzcGFjZV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAob2JqLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJEU1BfR0VUSVNQQUNFIGZhaWxlZDogJXMiLCBnX3N0cmVycm9yIChlcnJubykpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2Zvcm1hdF9ub3Rfd2hhdF93YXNfcmVxdWVzdGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9iaiwgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgiRm9ybWF0IGFjdHVhbGx5IGNvbmZpZ3VyZWQgd2Fzbid0IHRoZSBvbmUgd2UgcmVxdWVzdGVkLiBUaGlzIGlzICIKKyAgICAgICAgICAgICJwcm9iYWJseSBlaXRoZXIgYSBidWcgaW4gdGhlIGRyaXZlciBvciBpbiB0aGUgZm9ybWF0IHByb2JpbmcgY29kZS4iKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK2ludAorZ3N0X29zczRfYXVkaW9fZ2V0X3ZlcnNpb24gKEdzdE9iamVjdCAqIG9iaiwgaW50IGZkKQoreworICBnaW50IHZlciA9IDA7CisKKyAgLyogd2UgdXNlIHRoZSBvbGQgaW9jdGwgaGVyZSBvbiBwdXJwb3NlIGluc3RlYWQgb2YgU05EQ1RMX1NZU0lORk8gKi8KKyAgaWYgKGlvY3RsIChmZCwgT1NTX0dFVFZFUlNJT04sICZ2ZXIpIDwgMCkgeworICAgIEdTVF9MT0dfT0JKRUNUIChvYmosICJPU1NfR0VUVkVSU0lPTiBmYWlsZWQ6ICVzIiwgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgR1NUX0xPR19PQkpFQ1QgKG9iaiwgIk9TUyB2ZXJzaW9uOiAweCUwOHgiLCB2ZXIpOworICByZXR1cm4gdmVyOworfQorCitnYm9vbGVhbgorZ3N0X29zczRfYXVkaW9fY2hlY2tfdmVyc2lvbiAoR3N0T2JqZWN0ICogb2JqLCBpbnQgZmQpCit7CisgIHJldHVybiAoZ3N0X29zczRfYXVkaW9fZ2V0X3ZlcnNpb24gKG9iaiwgZmQpID49IEdTVF9NSU5fT1NTNF9WRVJTSU9OKTsKK30KKworZ2NoYXIgKgorZ3N0X29zczRfYXVkaW9fZmluZF9kZXZpY2UgKEdzdE9iamVjdCAqIG9zcykKK3sKKyAgR1ZhbHVlQXJyYXkgKmFycjsKKyAgZ2NoYXIgKnJldCA9IE5VTEw7CisKKyAgYXJyID0gZ3N0X29zczRfcHJvcGVydHlfcHJvYmVfZ2V0X3ZhbHVlcyAoR1NUX09CSkVDVCAob3NzKSwgImRldmljZSIpOworCisgIGlmIChhcnIgIT0gTlVMTCkgeworICAgIGlmIChhcnItPm5fdmFsdWVzID4gMCkgeworICAgICAgY29uc3QgR1ZhbHVlICp2YWw7CisKKyAgICAgIHZhbCA9IGdfdmFsdWVfYXJyYXlfZ2V0X250aCAoYXJyLCAwKTsKKyAgICAgIHJldCA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsKTsKKyAgICB9CisgICAgZ192YWx1ZV9hcnJheV9mcmVlIChhcnIpOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKG9zcywgImZpcnN0IGRldmljZSBmb3VuZDogJXMiLCBHU1RfU1RSX05VTEwgKHJldCkpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgZ2ludCByYW5rOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChvc3M0c2lua19kZWJ1ZywgIm9zczRzaW5rIiwgMCwgIk9TUzQgYXVkaW8gc2luayIpOworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAob3NzNHNyY19kZWJ1ZywgIm9zczRzcmMiLCAwLCAiT1NTNCBhdWRpbyBzcmMiKTsKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKG9zczRtaXhlcl9kZWJ1ZywgIm9zczRtaXhlciIsIDAsICJPU1M0IG1peGVyIik7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChvc3M0X2RlYnVnLCAib3NzNCIsIDAsICJPU1M0IHBsdWdpbiIpOworCisjaWZkZWYgRU5BQkxFX05MUworICBHU1RfREVCVUcgKCJiaW5kaW5nIHRleHQgZG9tYWluICVzIHRvIGxvY2FsZSBkaXIgJXMiLCBHRVRURVhUX1BBQ0tBR0UsCisgICAgICBMT0NBTEVESVIpOworICBiaW5kdGV4dGRvbWFpbiAoR0VUVEVYVF9QQUNLQUdFLCBMT0NBTEVESVIpOworICBiaW5kX3RleHRkb21haW5fY29kZXNldCAoR0VUVEVYVF9QQUNLQUdFLCAiVVRGLTgiKTsKKyNlbmRpZgorCisgIC8qIHdlIHdhbnQgYSBoaWdoZXIgcmFuayB0aGFuIHRoZSBsZWdhY3kgT1NTIGVsZW1lbnRzIGhhdmUgbm93ICovCisgIHJhbmsgPSBHU1RfUkFOS19TRUNPTkRBUlkgKyAxOworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIm9zczRzaW5rIiwgcmFuaywgR1NUX1RZUEVfT1NTNF9TSU5LKSB8fAorICAgICAgIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJvc3M0c3JjIiwgcmFuaywgR1NUX1RZUEVfT1NTNF9TT1VSQ0UpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBvc3M0LAorICAgICJPcGVuIFNvdW5kIFN5c3RlbSAoT1NTKSB2ZXJzaW9uIDQgc3VwcG9ydCBmb3IgR1N0cmVhbWVyIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL3N5cy9vc3M0L29zczQtYXVkaW8uaCBiL3N5cy9vc3M0L29zczQtYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDEyOGMwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zczQvb3NzNC1hdWRpby5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qIEdTdHJlYW1lciBPU1M0IGF1ZGlvIHBsdWdpbgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIEdTVF9PU1M0X0FVRElPX0gKKyNkZWZpbmUgR1NUX09TUzRfQVVESU9fSAorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisvKiBUaGlzIGlzIHRoZSBtaW5pbXVtIHZlcnNpb24gd2UgcmVxdWlyZSAqLworI2RlZmluZSBHU1RfTUlOX09TUzRfVkVSU0lPTiAgMHgwNDAwMDMKKworaW50ICAgICAgIGdzdF9vc3M0X2F1ZGlvX2dldF92ZXJzaW9uIChHc3RPYmplY3QgKiBvYmosIGludCBmZCk7CisKK2dib29sZWFuICBnc3Rfb3NzNF9hdWRpb19jaGVja192ZXJzaW9uIChHc3RPYmplY3QgKiBvYmosIGludCBmZCk7CisKK0dzdENhcHMgKiBnc3Rfb3NzNF9hdWRpb19wcm9iZV9jYXBzICAoR3N0T2JqZWN0ICogb2JqLCBpbnQgZmQpOworCitnYm9vbGVhbiAgZ3N0X29zczRfYXVkaW9fc2V0X2Zvcm1hdCAgKEdzdE9iamVjdCAqIG9iaiwgaW50IGZkLCBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYyk7CisKK0dzdENhcHMgKiBnc3Rfb3NzNF9hdWRpb19nZXRfdGVtcGxhdGVfY2FwcyAodm9pZCk7CisKK2djaGFyICAgKiBnc3Rfb3NzNF9hdWRpb19maW5kX2RldmljZSAoR3N0T2JqZWN0ICogb3NzKTsKKworI2VuZGlmIC8qIEdTVF9PU1M0X0FVRElPX0ggKi8KKworCmRpZmYgLS1naXQgYS9zeXMvb3NzNC9vc3M0LXByb3BlcnR5LXByb2JlLmMgYi9zeXMvb3NzNC9vc3M0LXByb3BlcnR5LXByb2JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY0NGVhMQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3M0L29zczQtcHJvcGVydHktcHJvYmUuYwpAQCAtMCwwICsxLDM0NSBAQAorLyogR1N0cmVhbWVyIE9TUzQgYXVkaW8gcHJvcGVydHkgcHJvYmUgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qIEZJWE1FIDAuMTE6IHN1cHByZXNzIHdhcm5pbmdzIGZvciBkZXByZWNhdGVkIEFQSSBzdWNoIGFzIEdWYWx1ZUFycmF5CisgKiB3aXRoIG5ld2VyIEdMaWIgdmVyc2lvbnMgKD49IDIuMzEuMCkgKi8KKyNkZWZpbmUgR0xJQl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworCisjZGVmaW5lIE5PX0xFR0FDWV9NSVhFUgorI2luY2x1ZGUgIm9zczQtYXVkaW8uaCIKKyNpbmNsdWRlICJvc3M0LXNpbmsuaCIKKyNpbmNsdWRlICJvc3M0LXNvdXJjZS5oIgorI2luY2x1ZGUgIm9zczQtc291bmRjYXJkLmgiCisjaW5jbHVkZSAib3NzNC1wcm9wZXJ0eS1wcm9iZS5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiAwCisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKG9zczRfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgb3NzNF9kZWJ1ZworCitzdGF0aWMgY29uc3QgR0xpc3QgKgorZ3N0X29zczRfcHJvcGVydHlfcHJvYmVfZ2V0X3Byb3BlcnRpZXMgKEdzdFByb3BlcnR5UHJvYmUgKiBwcm9iZSkKK3sKKyAgR09iamVjdENsYXNzICprbGFzcyA9IEdfT0JKRUNUX0dFVF9DTEFTUyAocHJvYmUpOworICBHTGlzdCAqbGlzdDsKKworICBHU1RfT0JKRUNUX0xPQ0sgKEdTVF9PQkpFQ1QgKHByb2JlKSk7CisKKyAgLyogd2UgY3JlYXRlIGEgbmV3IGxpc3QgYW5kIHN0b3JlIGl0IGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3QsIHNpbmNlIGFwcGFyZW50bHkKKyAgICogd2UgZm9yZ290IHRvIHVwZGF0ZSB0aGUgQVBJIGZvciAwLjEwIChhbmQgd2h5IGRvbid0IHdlIG1hcmsgcHJvYmFibGUKKyAgICogcHJvcGVydGllcyB3aXRoIGEgZmxhZyBpbnN0ZWFkIGFueXdheT8pLiBBIGJpdCBoYWNraXNoLCBidXQgd2hhdCBjYW4geW91CisgICAqIGRvIChjYW4ndCByZWFsbHkgdXNlIGEgc3RhdGljIHZhcmlhYmxlIHNpbmNlIHRoZSBwc3BlYyB3aWxsIGJlIGRpZmZlcmVudAorICAgKiBmb3Igc3JjIGFuZCBzaW5rIGNsYXNzKTsgdGhpcyBpc24ndCBwYXJ0aWN1bGFybHkgcHJldHR5LCBidXQgdGhlIGJlc3QKKyAgICogd2UgY2FuIGRvIGdpdmVuIHRoYXQgd2UgY2FuJ3QgY3JlYXRlIGEgY29tbW9uIGJhc2UgY2xhc3MgKHdlIGNvdWxkIGRvCisgICAqIGZhbmN5IHRoaW5ncyB3aXRoIHRoZSBpbnRlcmZhY2UsIG9yIHVzZSBnX29iamVjdF9zZXRfZGF0YSBpbnN0ZWFkLCBidXQKKyAgICogaXQncyBub3QgcmVhbGx5IGdvaW5nIHRvIG1ha2UgaXQgbXVjaCBiZXR0ZXIpICovCisgIGlmIChHU1RfSVNfQVVESU9fU0lOS19DTEFTUyAoa2xhc3MpKSB7CisgICAgbGlzdCA9IEdTVF9PU1M0X1NJTksgKHByb2JlKS0+cHJvcGVydHlfcHJvYmVfbGlzdDsKKyAgfSBlbHNlIGlmIChHU1RfSVNfQVVESU9fU1JDX0NMQVNTIChrbGFzcykpIHsKKyAgICBsaXN0ID0gR1NUX09TUzRfU09VUkNFIChwcm9iZSktPnByb3BlcnR5X3Byb2JlX2xpc3Q7CisgIH0gZWxzZSBpZiAoR1NUX0lTX09TUzRfTUlYRVJfQ0xBU1MgKGtsYXNzKSkgeworICAgIGxpc3QgPSBHU1RfT1NTNF9NSVhFUiAocHJvYmUpLT5wcm9wZXJ0eV9wcm9iZV9saXN0OworICB9IGVsc2UgeworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChHU1RfT0JKRUNUIChwcm9iZSkpOworICAgIGdfcmV0dXJuX3ZhbF9pZl9yZWFjaGVkIChOVUxMKTsKKyAgfQorCisgIGlmIChsaXN0ID09IE5VTEwpIHsKKyAgICBHUGFyYW1TcGVjICpwc3BlYzsKKworICAgIHBzcGVjID0gZ19vYmplY3RfY2xhc3NfZmluZF9wcm9wZXJ0eSAoa2xhc3MsICJkZXZpY2UiKTsKKyAgICBsaXN0ID0gZ19saXN0X3ByZXBlbmQgKE5VTEwsIHBzcGVjKTsKKworICAgIGlmIChHU1RfSVNfQVVESU9fU0lOS19DTEFTUyAoa2xhc3MpKSB7CisgICAgICBHU1RfT1NTNF9TSU5LIChwcm9iZSktPnByb3BlcnR5X3Byb2JlX2xpc3QgPSBsaXN0OworICAgIH0gZWxzZSBpZiAoR1NUX0lTX0FVRElPX1NSQ19DTEFTUyAoa2xhc3MpKSB7CisgICAgICBHU1RfT1NTNF9TT1VSQ0UgKHByb2JlKS0+cHJvcGVydHlfcHJvYmVfbGlzdCA9IGxpc3Q7CisgICAgfSBlbHNlIGlmIChHU1RfSVNfT1NTNF9NSVhFUl9DTEFTUyAoa2xhc3MpKSB7CisgICAgICBHU1RfT1NTNF9NSVhFUiAocHJvYmUpLT5wcm9wZXJ0eV9wcm9iZV9saXN0ID0gbGlzdDsKKyAgICB9CisgIH0KKworICBHU1RfT0JKRUNUX1VOTE9DSyAoR1NUX09CSkVDVCAocHJvYmUpKTsKKworICByZXR1cm4gbGlzdDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3M0X3Byb3BlcnR5X3Byb2JlX3Byb2JlX3Byb3BlcnR5IChHc3RQcm9wZXJ0eVByb2JlICogcHJvYmUsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBpZiAoIWdfc3RyX2VxdWFsIChwc3BlYy0+bmFtZSwgImRldmljZSIpKSB7CisgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChwcm9iZSwgcHJvcF9pZCwgcHNwZWMpOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zczRfcHJvcGVydHlfcHJvYmVfbmVlZHNfcHJvYmUgKEdzdFByb3BlcnR5UHJvYmUgKiBwcm9iZSwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIC8qIGRvbid0IGNhY2hlIHByb2JlZCBkYXRhICovCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYKKworLyogY2FsbGVyIG11c3QgZW5zdXJlIExPQ0sgaXMgdGFrZW4gKGUuZy4gaWYgaW9jdGxzIG5lZWQgdG8gYmUgc2VyaWFsaXNlZCkgKi8KK2dib29sZWFuCitnc3Rfb3NzNF9wcm9wZXJ0eV9wcm9iZV9maW5kX2RldmljZV9uYW1lIChHc3RPYmplY3QgKiBvYmosIGludCBmZCwKKyAgICBjb25zdCBnY2hhciAqIGRldmljZV9oYW5kbGUsIGdjaGFyICoqIGRldmljZV9uYW1lKQoreworICBzdHJ1Y3Qgb3NzX3N5c2luZm8gc2kgPSB7IHswLH0sIH07CisgIGdjaGFyICpuYW1lID0gTlVMTDsKKworICBpZiAoaW9jdGwgKGZkLCBTTkRDVExfU1lTSU5GTywgJnNpKSA9PSAwKSB7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2kubnVtYXVkaW9zOyArK2kpIHsKKyAgICAgIHN0cnVjdCBvc3NfYXVkaW9pbmZvIGFpID0geyAwLCB9OworCisgICAgICBhaS5kZXYgPSBpOworICAgICAgaWYgKGlvY3RsIChmZCwgU05EQ1RMX0FVRElPSU5GTywgJmFpKSA9PSAtMSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChvYmosICJBVURJT0lORk8gaW9jdGwgZm9yIGRldmljZSAlZCBmYWlsZWQiLCBpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc3RyY21wIChhaS5kZXZub2RlLCBkZXZpY2VfaGFuZGxlKSA9PSAwKSB7CisgICAgICAgIG5hbWUgPSBnX3N0cmR1cCAoYWkubmFtZSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG9iaiwgIlNZU0lORk8gaW9jdGwgZmFpbGVkOiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgIH0KKworICAvKiB0cnkgRU5HSU5FSU5GTyBhcyBmYWxsYmFjayAod2hpY2ggaXMgYmV0dGVyIHRoYW4gbm90aGluZykgKi8KKyAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgIHN0cnVjdCBvc3NfYXVkaW9pbmZvIGFpID0geyAwLCB9OworCisgICAgR1NUX0xPR19PQkpFQ1QgKG9iaiwgImRldmljZSAlcyBub3QgbGlzdGVkIGluIEFVRElPSU5GTyIsIGRldmljZV9oYW5kbGUpOworICAgIGFpLmRldiA9IC0xOworICAgIGlmIChpb2N0bCAoZmQsIFNORENUTF9FTkdJTkVJTkZPLCAmYWkpID09IDApCisgICAgICBuYW1lID0gZ19zdHJkdXAgKGFpLm5hbWUpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAob2JqLCAiRGV2aWNlIG5hbWU6ICVzIiwgR1NUX1NUUl9OVUxMIChuYW1lKSk7CisKKyAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAqZGV2aWNlX25hbWUgPSBuYW1lOworCisgIHJldHVybiAobmFtZSAhPSBOVUxMKTsKK30KKworZ2Jvb2xlYW4KK2dzdF9vc3M0X3Byb3BlcnR5X3Byb2JlX2ZpbmRfZGV2aWNlX25hbWVfbm9mZCAoR3N0T2JqZWN0ICogb2JqLAorICAgIGNvbnN0IGdjaGFyICogZGV2aWNlX2hhbmRsZSwgZ2NoYXIgKiogZGV2aWNlX25hbWUpCit7CisgIGdib29sZWFuIHJlczsKKyAgaW50IGZkOworCisgIGZkID0gb3BlbiAoIi9kZXYvbWl4ZXIiLCBPX1JET05MWSk7CisgIGlmIChmZCA8IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJlcyA9IGdzdF9vc3M0X3Byb3BlcnR5X3Byb2JlX2ZpbmRfZGV2aWNlX25hbWUgKG9iaiwgZmQsIGRldmljZV9oYW5kbGUsCisgICAgICBkZXZpY2VfbmFtZSk7CisKKyAgY2xvc2UgKGZkKTsKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdMaXN0ICoKK2dzdF9vc3M0X3Byb3BlcnR5X3Byb2JlX2dldF9hdWRpb19kZXZpY2VzIChHc3RPYmplY3QgKiBvYmosIGludCBmZCwKKyAgICBzdHJ1Y3Qgb3NzX3N5c2luZm8gKnNpLCBpbnQgY2FwX21hc2spCit7CisgIEdMaXN0ICpkZXZpY2VzID0gTlVMTDsKKyAgaW50IGk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKG9iaiwgIiVkIGF1ZGlvL2RzcCBkZXZpY2VzIiwgc2ktPm51bWF1ZGlvcyk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpLT5udW1hdWRpb3M7ICsraSkgeworICAgIHN0cnVjdCBvc3NfYXVkaW9pbmZvIGFpID0geyAwLCB9OworCisgICAgYWkuZGV2ID0gaTsKKyAgICBpZiAoaW9jdGwgKGZkLCBTTkRDVExfQVVESU9JTkZPLCAmYWkpID09IC0xKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChvYmosICJBVURJT0lORk8gaW9jdGwgZm9yIGRldmljZSAlZCBmYWlsZWQiLCBpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmICgoYWkuY2FwcyAmIGNhcF9tYXNrKSA9PSAwKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChvYmosICJhdWRpbyBkZXZpY2UgJWQgaXMgbm90IGFuICVzIGRldmljZSIsIGksCisgICAgICAgICAgKGNhcF9tYXNrID09IFBDTV9DQVBfT1VUUFVUKSA/ICJvdXRwdXQiIDogImlucHV0Iik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAoIWFpLmVuYWJsZWQpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG9iaiwgImF1ZGlvIGRldmljZSAlZCBpcyBub3QgdXNhYmxlL2VuYWJsZWQiLCBpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG9iaiwgImF1ZGlvIGRldmljZSAlZCBsb29rcyBvazogJXMgKFwiJXNcIikiLCBpLAorICAgICAgICBhaS5kZXZub2RlLCBhaS5uYW1lKTsKKworICAgIGRldmljZXMgPSBnX2xpc3RfcHJlcGVuZCAoZGV2aWNlcywgZ19zdHJkdXAgKGFpLmRldm5vZGUpKTsKKyAgfQorCisgIHJldHVybiBnX2xpc3RfcmV2ZXJzZSAoZGV2aWNlcyk7Cit9CisKK0dWYWx1ZUFycmF5ICoKK2dzdF9vc3M0X3Byb3BlcnR5X3Byb2JlX2dldF92YWx1ZXMgKEdzdE9iamVjdCAqIHByb2JlLCBjb25zdCBnY2hhciAqIHBuYW1lKQoreworICBzdHJ1Y3Qgb3NzX3N5c2luZm8gc2kgPSB7IHswLH0sIH07CisgIEdWYWx1ZUFycmF5ICphcnJheSA9IE5VTEw7CisgIEdzdE9iamVjdCAqb2JqOworICBHTGlzdCAqZGV2aWNlcywgKmw7CisgIGludCBjYXBfbWFzaywgZmQgPSAtMTsKKworICBpZiAoIWdfc3RyX2VxdWFsIChwbmFtZSwgImRldmljZSIpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwcm9iZSwgImludmFsaWQgcHJvcGVydHkiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIG9iaiA9IEdTVF9PQkpFQ1QgKHByb2JlKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKG9iaik7CisKKyAgLyogZmlndXJlIG91dCB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIGEgc291cmNlIG9yIHNpbmsgKi8KKyAgaWYgKEdTVF9JU19PU1M0X1NJTksgKHByb2JlKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHByb2JlLCAicHJvYmluZyBhdmFpbGFibGUgb3V0cHV0IGRldmljZXMiKTsKKyAgICBjYXBfbWFzayA9IFBDTV9DQVBfT1VUUFVUOworICAgIGZkID0gR1NUX09TUzRfU0lOSyAocHJvYmUpLT5mZDsKKyAgfSBlbHNlIGlmIChHU1RfSVNfT1NTNF9TT1VSQ0UgKHByb2JlKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHByb2JlLCAicHJvYmluZyBhdmFpbGFibGUgaW5wdXQgZGV2aWNlcyIpOworICAgIGNhcF9tYXNrID0gUENNX0NBUF9JTlBVVDsKKyAgICBmZCA9IEdTVF9PU1M0X1NPVVJDRSAocHJvYmUpLT5mZDsKKyAgfSBlbHNlIHsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAob2JqKTsKKyAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8qIGNvcHkgZmQgaWYgaXQncyBvcGVuLCBzbyB3ZSBjYW4ganVzdCB1bmNvbmRpdGlvbmFsbHkgY2xvc2UoKSBsYXRlciAqLworICBpZiAoZmQgIT0gLTEpCisgICAgZmQgPSBkdXAgKGZkKTsKKworICAvKiB0aGlzIHdpbGwgYWxzbyBjYXRjaCB0aGUgdW5saWtlbHkgY2FzZSB3aGVyZSB0aGUgYWJvdmUgZHVwKCkgZmFpbGVkICovCisgIGlmIChmZCA9PSAtMSkgeworICAgIGZkID0gb3BlbiAoIi9kZXYvbWl4ZXIiLCBPX1JET05MWSB8IE9fTk9OQkxPQ0ssIDApOworICAgIGlmIChmZCA8IDApCisgICAgICBnb3RvIG9wZW5fZmFpbGVkOworICAgIGVsc2UgaWYgKCFnc3Rfb3NzNF9hdWRpb19jaGVja192ZXJzaW9uIChHU1RfT0JKRUNUIChwcm9iZSksIGZkKSkKKyAgICAgIGdvdG8gbGVnYWN5X29zczsKKyAgfQorCisgIGlmIChpb2N0bCAoZmQsIFNORENUTF9TWVNJTkZPLCAmc2kpID09IC0xKQorICAgIGdvdG8gbm9fc3lzaW5mbzsKKworICBkZXZpY2VzID0gZ3N0X29zczRfcHJvcGVydHlfcHJvYmVfZ2V0X2F1ZGlvX2RldmljZXMgKG9iaiwgZmQsICZzaSwgY2FwX21hc2spOworCisgIGlmIChkZXZpY2VzID09IE5VTEwpIHsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAob2JqKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChvYmosICJObyBkZXZpY2VzIGZvdW5kIik7CisgICAgZ290byBkb25lOworICB9CisKKyAgYXJyYXkgPSBnX3ZhbHVlX2FycmF5X25ldyAoMSk7CisKKyAgZm9yIChsID0gZGV2aWNlczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgeworICAgIEdWYWx1ZSB2YWwgPSB7IDAsIH07CisKKyAgICBnX3ZhbHVlX2luaXQgKCZ2YWwsIEdfVFlQRV9TVFJJTkcpOworICAgIGdfdmFsdWVfdGFrZV9zdHJpbmcgKCZ2YWwsIChnY2hhciAqKSBsLT5kYXRhKTsKKyAgICBsLT5kYXRhID0gTlVMTDsKKyAgICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAoYXJyYXksICZ2YWwpOworICAgIGdfdmFsdWVfdW5zZXQgKCZ2YWwpOworICB9CisKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKG9iaik7CisKKyAgZ19saXN0X2ZyZWUgKGRldmljZXMpOworCitkb25lOgorCisgIGNsb3NlIChmZCk7CisKKyAgcmV0dXJuIGFycmF5OworCisvKiBFUlJPUlMgKi8KK29wZW5fZmFpbGVkOgorICB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKEdTVF9PQkpFQ1QgKHByb2JlKSk7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwcm9iZSwgIkNhbid0IG9wZW4gZmlsZSBkZXNjcmlwdG9yIHRvIHByb2JlICIKKyAgICAgICAgImF2YWlsYWJsZSBkZXZpY2VzOiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2xlZ2FjeV9vc3M6CisgIHsKKyAgICBjbG9zZSAoZmQpOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChHU1RfT0JKRUNUIChwcm9iZSkpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHByb2JlLCAiTGVnYWN5IE9TUyAoaWUuIG5vdCBPU1N2NCksIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorbm9fc3lzaW5mbzoKKyAgeworICAgIGNsb3NlIChmZCk7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKEdTVF9PQkpFQ1QgKHByb2JlKSk7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwcm9iZSwgIkNhbid0IG9wZW4gZmlsZSBkZXNjcmlwdG9yIHRvIHByb2JlICIKKyAgICAgICAgImF2YWlsYWJsZSBkZXZpY2VzOiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworI2lmIDAKK3N0YXRpYyB2b2lkCitnc3Rfb3NzNF9wcm9wZXJ0eV9wcm9iZV9pbnRlcmZhY2VfaW5pdCAoR3N0UHJvcGVydHlQcm9iZUludGVyZmFjZSAqIGlmYWNlKQoreworICBpZmFjZS0+Z2V0X3Byb3BlcnRpZXMgPSBnc3Rfb3NzNF9wcm9wZXJ0eV9wcm9iZV9nZXRfcHJvcGVydGllczsKKyAgaWZhY2UtPnByb2JlX3Byb3BlcnR5ID0gZ3N0X29zczRfcHJvcGVydHlfcHJvYmVfcHJvYmVfcHJvcGVydHk7CisgIGlmYWNlLT5uZWVkc19wcm9iZSA9IGdzdF9vc3M0X3Byb3BlcnR5X3Byb2JlX25lZWRzX3Byb2JlOworICBpZmFjZS0+Z2V0X3ZhbHVlcyA9IGdzdF9vc3M0X3Byb3BlcnR5X3Byb2JlX2dldF92YWx1ZXM7Cit9CisKK3ZvaWQKK2dzdF9vc3M0X2FkZF9wcm9wZXJ0eV9wcm9iZV9pbnRlcmZhY2UgKEdUeXBlIHR5cGUpCit7CisgIHN0YXRpYyBjb25zdCBHSW50ZXJmYWNlSW5mbyBwcm9iZV9pZmFjZV9pbmZvID0geworICAgIChHSW50ZXJmYWNlSW5pdEZ1bmMpIGdzdF9vc3M0X3Byb3BlcnR5X3Byb2JlX2ludGVyZmFjZV9pbml0LAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgfTsKKworICBnX3R5cGVfYWRkX2ludGVyZmFjZV9zdGF0aWMgKHR5cGUsIEdTVF9UWVBFX1BST1BFUlRZX1BST0JFLAorICAgICAgJnByb2JlX2lmYWNlX2luZm8pOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXMvb3NzNC9vc3M0LXByb3BlcnR5LXByb2JlLmggYi9zeXMvb3NzNC9vc3M0LXByb3BlcnR5LXByb2JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY0NmY5YQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3M0L29zczQtcHJvcGVydHktcHJvYmUuaApAQCAtMCwwICsxLDQ1IEBACisvKiBHU3RyZWFtZXIgT1NTNCBhdWRpbyBwcm9wZXJ0eSBwcm9iZSBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBHU1RfT1NTNF9QUk9QRVJUWV9QUk9CRV9ICisjZGVmaW5lIEdTVF9PU1M0X1BST1BFUlRZX1BST0JFX0gKKworI2lmIDAKKworI2luY2x1ZGUgPGdzdC9pbnRlcmZhY2VzL3Byb3BlcnR5cHJvYmUuaD4KKwordm9pZCAgICAgIGdzdF9vc3M0X2FkZF9wcm9wZXJ0eV9wcm9iZV9pbnRlcmZhY2UgKEdUeXBlIHR5cGUpOworCisjZW5kaWYKKworZ2Jvb2xlYW4gIGdzdF9vc3M0X3Byb3BlcnR5X3Byb2JlX2ZpbmRfZGV2aWNlX25hbWUgKEdzdE9iamVjdCAgICogb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKiBkZXZpY2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICAgICAgKiogZGV2aWNlX25hbWUpOworCitnYm9vbGVhbiAgZ3N0X29zczRfcHJvcGVydHlfcHJvYmVfZmluZF9kZXZpY2VfbmFtZV9ub2ZkIChHc3RPYmplY3QgICAqIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICogZGV2aWNlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICAgICAgKiogZGV2aWNlX25hbWUpOworCitHVmFsdWVBcnJheSAqZ3N0X29zczRfcHJvcGVydHlfcHJvYmVfZ2V0X3ZhbHVlcyAoR3N0T2JqZWN0ICogb2JqLCBjb25zdCBnY2hhciAqIHBuYW1lKTsKKworCisjZW5kaWYgLyogR1NUX09TUzRfUFJPUEVSVFlfUFJPQkVfSCAqLworCisKZGlmZiAtLWdpdCBhL3N5cy9vc3M0L29zczQtc2luay5jIGIvc3lzL29zczQvb3NzNC1zaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQwMjhlNwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3M0L29zczQtc2luay5jCkBAIC0wLDAgKzEsNjg5IEBACisvKiBHU3RyZWFtZXIgT1NTNCBhdWRpbyBzaW5rCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1vc3M0c2luaworICoKKyAqIFRoaXMgZWxlbWVudCBsZXRzIHlvdSBvdXRwdXQgc291bmQgdXNpbmcgdGhlIE9wZW4gU291bmQgU3lzdGVtIChPU1MpCisgKiB2ZXJzaW9uIDQuCisgKiAKKyAqIE5vdGUgdGhhdCB5b3Ugc2hvdWxkIGFsbW9zdCBhbHdheXMgdXNlIGdlbmVyaWMgYXVkaW8gY29udmVyc2lvbiBlbGVtZW50cworICogbGlrZSBhdWRpb2NvbnZlcnQgYW5kIGF1ZGlvcmVzYW1wbGUgaW4gZnJvbnQgb2YgYW4gYXVkaW9zaW5rIHRvIG1ha2Ugc3VyZQorICogeW91ciBwaXBlbGluZSB3b3JrcyB1bmRlciBhbGwgY2lyY3Vtc3RhbmNlcyAodGhvc2UgY29udmVyc2lvbiBlbGVtZW50cyB3aWxsCisgKiBhY3QgaW4gcGFzc3Rocm91Z2gtbW9kZSBpZiBubyBjb252ZXJzaW9uIGlzIG5lY2Vzc2FyeSkuCisgKiAKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgYXVkaW90ZXN0c3JjICEgYXVkaW9jb252ZXJ0ICEgdm9sdW1lIHZvbHVtZT0wLjEgISBvc3M0c2luaworICogXXwgd2lsbCBvdXRwdXQgYSBzaW5lIHdhdmUgKGNvbnRpbnVvdXMgYmVlcCBzb3VuZCkgdG8geW91ciBzb3VuZCBjYXJkICh3aXRoCisgKiBhIHZlcnkgbG93IHZvbHVtZSBhcyBwcmVjYXV0aW9uKS4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBmaWxlc3JjIGxvY2F0aW9uPW11c2ljLm9nZyAhIGRlY29kZWJpbiAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBvc3M0c2luaworICogXXwgd2lsbCBwbGF5IGFuIE9nZy9Wb3JiaXMgYXVkaW8gZmlsZSBhbmQgb3V0cHV0IGl0IHVzaW5nIHRoZSBPcGVuIFNvdW5kIFN5c3RlbQorICogdmVyc2lvbiA0LgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vc3RyZWFtdm9sdW1lLmg+CisKKyNkZWZpbmUgTk9fTEVHQUNZX01JWEVSCisjaW5jbHVkZSAib3NzNC1hdWRpby5oIgorI2luY2x1ZGUgIm9zczQtc2luay5oIgorI2luY2x1ZGUgIm9zczQtcHJvcGVydHktcHJvYmUuaCIKKyNpbmNsdWRlICJvc3M0LXNvdW5kY2FyZC5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfRVhURVJOIChvc3M0c2lua19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBvc3M0c2lua19kZWJ1ZworCitzdGF0aWMgdm9pZCBnc3Rfb3NzNF9zaW5rX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X29zczRfc2lua19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyB2b2lkIGdzdF9vc3M0X3NpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X29zczRfc2lua19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBHc3RDYXBzICpnc3Rfb3NzNF9zaW5rX2dldGNhcHMgKEdzdEJhc2VTaW5rICogYnNpbmssIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9vc3M0X3Npbmtfb3BlbiAoR3N0QXVkaW9TaW5rICogYXNpbmssCisgICAgZ2Jvb2xlYW4gc2lsZW50X2Vycm9ycyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zczRfc2lua19vcGVuX2Z1bmMgKEdzdEF1ZGlvU2luayAqIGFzaW5rKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3NzNF9zaW5rX2Nsb3NlIChHc3RBdWRpb1NpbmsgKiBhc2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zczRfc2lua19wcmVwYXJlIChHc3RBdWRpb1NpbmsgKiBhc2luaywKKyAgICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zczRfc2lua191bnByZXBhcmUgKEdzdEF1ZGlvU2luayAqIGFzaW5rKTsKK3N0YXRpYyBnaW50IGdzdF9vc3M0X3Npbmtfd3JpdGUgKEdzdEF1ZGlvU2luayAqIGFzaW5rLCBncG9pbnRlciBkYXRhLAorICAgIGd1aW50IGxlbmd0aCk7CitzdGF0aWMgZ3VpbnQgZ3N0X29zczRfc2lua19kZWxheSAoR3N0QXVkaW9TaW5rICogYXNpbmspOworc3RhdGljIHZvaWQgZ3N0X29zczRfc2lua19yZXNldCAoR3N0QXVkaW9TaW5rICogYXNpbmspOworCisjZGVmaW5lIERFRkFVTFRfREVWSUNFICAgICAgTlVMTAorI2RlZmluZSBERUZBVUxUX0RFVklDRV9OQU1FIE5VTEwKKyNkZWZpbmUgREVGQVVMVF9NVVRFICAgICAgICBGQUxTRQorI2RlZmluZSBERUZBVUxUX1ZPTFVNRSAgICAgIDEuMAorI2RlZmluZSBNQVhfVk9MVU1FICAgICAgICAgIDEwLjAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfREVWSUNFLAorICBQUk9QX0RFVklDRV9OQU1FLAorICBQUk9QX1ZPTFVNRSwKKyAgUFJPUF9NVVRFLAorICBQUk9QX0xBU1QKK307CisKKyNkZWZpbmUgZ3N0X29zczRfc2lua19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoR3N0T3NzNFNpbmssIGdzdF9vc3M0X3NpbmssCisgICAgR1NUX1RZUEVfQVVESU9fU0lOSywgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9TVFJFQU1fVk9MVU1FLCBOVUxMKSk7CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzNF9zaW5rX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdE9zczRTaW5rICpvc3NzaW5rID0gR1NUX09TUzRfU0lOSyAob2JqZWN0KTsKKworICBpZiAob3Nzc2luay0+cHJvYmVkX2NhcHMpIHsKKyAgICBnc3RfY2Fwc191bnJlZiAob3Nzc2luay0+cHJvYmVkX2NhcHMpOworICAgIG9zc3NpbmstPnByb2JlZF9jYXBzID0gTlVMTDsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zczRfc2lua19jbGFzc19pbml0IChHc3RPc3M0U2lua0NsYXNzICoga2xhc3MpCit7CisgIEdzdEF1ZGlvU2lua0NsYXNzICphdWRpb3NpbmtfY2xhc3MgPSAoR3N0QXVkaW9TaW5rQ2xhc3MgKikga2xhc3M7CisgIEdzdEJhc2VTaW5rQ2xhc3MgKmJhc2VzaW5rX2NsYXNzID0gKEdzdEJhc2VTaW5rQ2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdFBhZFRlbXBsYXRlICp0ZW1wbDsKKworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X29zczRfc2lua19kaXNwb3NlOworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9vc3M0X3NpbmtfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9vc3M0X3NpbmtfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3Rfb3NzNF9zaW5rX3NldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RFVklDRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJkZXZpY2UiLCAiRGV2aWNlIiwKKyAgICAgICAgICAiT1NTNCBkZXZpY2UgKGUuZy4gL2Rldi9vc3MvaGRhdWRpbzAvcGNtMCBvciAvZGV2L2RzcE4pICIKKyAgICAgICAgICAiKE5VTEwgPSB1c2UgZmlyc3QgYXZhaWxhYmxlIHBsYXliYWNrIGRldmljZSkiLAorICAgICAgICAgIERFRkFVTFRfREVWSUNFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RFVklDRV9OQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImRldmljZS1uYW1lIiwgIkRldmljZSBuYW1lIiwKKyAgICAgICAgICAiSHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgc291bmQgZGV2aWNlIiwgREVGQVVMVF9ERVZJQ0VfTkFNRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1ZPTFVNRSwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJ2b2x1bWUiLCAiVm9sdW1lIiwKKyAgICAgICAgICAiTGluZWFyIHZvbHVtZSBvZiB0aGlzIHN0cmVhbSwgMS4wPTEwMCUiLCAwLjAsIE1BWF9WT0xVTUUsCisgICAgICAgICAgREVGQVVMVF9WT0xVTUUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX01VVEUsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoIm11dGUiLCAiTXV0ZSIsCisgICAgICAgICAgIk11dGUgc3RhdGUgb2YgdGhpcyBzdHJlYW0iLCBERUZBVUxUX01VVEUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgYmFzZXNpbmtfY2xhc3MtPmdldF9jYXBzID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3M0X3NpbmtfZ2V0Y2Fwcyk7CisKKyAgYXVkaW9zaW5rX2NsYXNzLT5vcGVuID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3M0X3Npbmtfb3Blbl9mdW5jKTsKKyAgYXVkaW9zaW5rX2NsYXNzLT5jbG9zZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzNF9zaW5rX2Nsb3NlKTsKKyAgYXVkaW9zaW5rX2NsYXNzLT5wcmVwYXJlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3M0X3NpbmtfcHJlcGFyZSk7CisgIGF1ZGlvc2lua19jbGFzcy0+dW5wcmVwYXJlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3M0X3NpbmtfdW5wcmVwYXJlKTsKKyAgYXVkaW9zaW5rX2NsYXNzLT53cml0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzNF9zaW5rX3dyaXRlKTsKKyAgYXVkaW9zaW5rX2NsYXNzLT5kZWxheSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzNF9zaW5rX2RlbGF5KTsKKyAgYXVkaW9zaW5rX2NsYXNzLT5yZXNldCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzNF9zaW5rX3Jlc2V0KTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIk9TUyB2NCBBdWRpbyBTaW5rIiwgIlNpbmsvQXVkaW8iLAorICAgICAgIk91dHB1dCB0byBhIHNvdW5kIGNhcmQgdmlhIE9TUyB2ZXJzaW9uIDQiLAorICAgICAgIlRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+Iik7CisKKyAgdGVtcGwgPSBnc3RfcGFkX3RlbXBsYXRlX25ldyAoInNpbmsiLCBHU1RfUEFEX1NJTkssIEdTVF9QQURfQUxXQVlTLAorICAgICAgZ3N0X29zczRfYXVkaW9fZ2V0X3RlbXBsYXRlX2NhcHMgKCkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCB0ZW1wbCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzNF9zaW5rX2luaXQgKEdzdE9zczRTaW5rICogb3Nzc2luaykKK3sKKyAgY29uc3QgZ2NoYXIgKmRldmljZTsKKworICBkZXZpY2UgPSBnX2dldGVudiAoIkFVRElPREVWIik7CisgIGlmIChkZXZpY2UgPT0gTlVMTCkKKyAgICBkZXZpY2UgPSBERUZBVUxUX0RFVklDRTsKKyAgb3Nzc2luay0+ZGV2aWNlID0gZ19zdHJkdXAgKGRldmljZSk7CisgIG9zc3NpbmstPmZkID0gLTE7CisgIG9zc3NpbmstPmJ5dGVzX3Blcl9zYW1wbGUgPSAwOworICBvc3NzaW5rLT5wcm9iZWRfY2FwcyA9IE5VTEw7CisgIG9zc3NpbmstPmRldmljZV9uYW1lID0gTlVMTDsKKyAgb3Nzc2luay0+bXV0ZV92b2x1bWUgPSAxMDAgfCAoMTAwIDw8IDgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zczRfc2lua19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0T3NzNFNpbmsgKm9zc3NpbmsgPSBHU1RfT1NTNF9TSU5LIChvYmplY3QpOworCisgIGdfZnJlZSAob3Nzc2luay0+ZGV2aWNlKTsKKyAgb3Nzc2luay0+ZGV2aWNlID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzNF9zaW5rX3NldF92b2x1bWUgKEdzdE9zczRTaW5rICogb3NzLCBnZG91YmxlIHZvbHVtZSkKK3sKKyAgaW50IGl2b2w7CisKKyAgdm9sdW1lID0gdm9sdW1lICogMTAwLjA7CisgIGl2b2wgPSAoaW50KSB2b2x1bWUgfCAoKGludCkgdm9sdW1lIDw8IDgpOworICBHU1RfT0JKRUNUX0xPQ0sgKG9zcyk7CisgIGlmIChpb2N0bCAob3NzLT5mZCwgU05EQ1RMX0RTUF9TRVRQTEFZVk9MLCAmaXZvbCkgPCAwKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKG9zcywgIlNFVFBMQVlWT0wgZmFpbGVkIik7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKG9zcyk7Cit9CisKK3N0YXRpYyBnZG91YmxlCitnc3Rfb3NzNF9zaW5rX2dldF92b2x1bWUgKEdzdE9zczRTaW5rICogb3NzKQoreworICBpbnQgaXZvbCwgbHZvbCwgcnZvbDsKKyAgZ2RvdWJsZSBkdm9sID0gREVGQVVMVF9WT0xVTUU7CisKKyAgR1NUX09CSkVDVF9MT0NLIChvc3MpOworICBpZiAoaW9jdGwgKG9zcy0+ZmQsIFNORENUTF9EU1BfR0VUUExBWVZPTCwgJml2b2wpIDwgMCkgeworICAgIEdTVF9MT0dfT0JKRUNUIChvc3MsICJHRVRQTEFZVk9MIGZhaWxlZCIpOworICB9IGVsc2UgeworICAgIC8qIFJldHVybiB0aGUgaGlnaGVyIG9mIHRoZSB0d28gdm9sdW1lIGNoYW5uZWxzLCBpZiBkaWZmZXJlbnQgKi8KKyAgICBsdm9sID0gaXZvbCAmIDB4ZmY7CisgICAgcnZvbCA9IChpdm9sID4+IDgpICYgMHhmZjsKKyAgICBkdm9sID0gTUFYIChsdm9sLCBydm9sKSAvIDEwMC4wOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChvc3MpOworCisgIHJldHVybiBkdm9sOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zczRfc2lua19zZXRfbXV0ZSAoR3N0T3NzNFNpbmsgKiBvc3MsIGdib29sZWFuIG11dGUpCit7CisgIGludCBpdm9sOworCisgIGlmIChtdXRlKSB7CisgICAgLyoKKyAgICAgKiBPU1N2NCBkb2VzIG5vdCBoYXZlIGEgcGVyLWNoYW5uZWwgbXV0ZSwgc28gc2ltdWxhdGUgYnkgc2V0dGluZworICAgICAqIHRoZSB2YWx1ZSB0byAwLiAgU2F2ZSB0aGUgdm9sdW1lIGJlZm9yZSBkb2luZyBhIG11dGUgc28gd2UgY2FuCisgICAgICogcmVzZXQgdGhlIHZhbHVlIHdoZW4gdGhlIHVzZXIgdW4tbXV0ZXMuCisgICAgICovCisgICAgaXZvbCA9IDA7CisKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKG9zcyk7CisgICAgaWYgKGlvY3RsIChvc3MtPmZkLCBTTkRDVExfRFNQX0dFVFBMQVlWT0wsICZvc3MtPm11dGVfdm9sdW1lKSA8IDApIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChvc3MsICJHRVRQTEFZVk9MIGZhaWxlZCIpOworICAgIH0KKyAgICBpZiAoaW9jdGwgKG9zcy0+ZmQsIFNORENUTF9EU1BfU0VUUExBWVZPTCwgJml2b2wpIDwgMCkgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKG9zcywgIlNFVFBMQVlWT0wgZmFpbGVkIik7CisgICAgfQorICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChvc3MpOworICB9IGVsc2UgeworICAgIC8qCisgICAgICogSWYgdGhlIHNhdmVkIHZvbHVtZSBpcyAwLCB0aGVuIHJlc2V0IGl0IHRvIDEwMC4gIE90aGVyd2lzZSB0aGUgbXV0ZQorICAgICAqIGNhbiBnZXQgc3R1Y2suICBUaGlzIGNhbiBoYXBwZW4sIGZvciBleGFtcGxlLCBkdWUgdG8gcm91bmRpbmcKKyAgICAgKiBlcnJvcnMgaW4gY29udmVydGluZyBmcm9tIHRoZSBmbG9hdCB0byBhbiBpbnRlZ2VyLgorICAgICAqLworICAgIGlmIChvc3MtPm11dGVfdm9sdW1lID09IDApIHsKKyAgICAgIG9zcy0+bXV0ZV92b2x1bWUgPSAxMDAgfCAoMTAwIDw8IDgpOworICAgIH0KKyAgICBHU1RfT0JKRUNUX0xPQ0sgKG9zcyk7CisgICAgaWYgKGlvY3RsIChvc3MtPmZkLCBTTkRDVExfRFNQX1NFVFBMQVlWT0wsICZvc3MtPm11dGVfdm9sdW1lKSA8IDApIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChvc3MsICJTRVRQTEFZVk9MIGZhaWxlZCIpOworICAgIH0KKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAob3NzKTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3M0X3NpbmtfZ2V0X211dGUgKEdzdE9zczRTaW5rICogb3NzKQoreworICBpbnQgaXZvbCwgbHZvbCwgcnZvbDsKKworICBHU1RfT0JKRUNUX0xPQ0sgKG9zcyk7CisgIGlmIChpb2N0bCAob3NzLT5mZCwgU05EQ1RMX0RTUF9HRVRQTEFZVk9MLCAmaXZvbCkgPCAwKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKG9zcywgIkdFVFBMQVlWT0wgZmFpbGVkIik7CisgICAgbHZvbCA9IHJ2b2wgPSAxMDA7CisgIH0gZWxzZSB7CisgICAgbHZvbCA9IGl2b2wgJiAweGZmOworICAgIHJ2b2wgPSAoaXZvbCA+PiA4KSAmIDB4ZmY7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKG9zcyk7CisKKyAgcmV0dXJuIChsdm9sID09IDAgJiYgcnZvbCA9PSAwKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3M0X3Npbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE9zczRTaW5rICpvc3MgPSBHU1RfT1NTNF9TSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9ERVZJQ0U6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKG9zcyk7CisgICAgICBpZiAob3NzLT5mZCA9PSAtMSkgeworICAgICAgICBnX2ZyZWUgKG9zcy0+ZGV2aWNlKTsKKyAgICAgICAgb3NzLT5kZXZpY2UgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgICAgaWYgKG9zcy0+cHJvYmVkX2NhcHMpIHsKKyAgICAgICAgICBnc3RfY2Fwc191bnJlZiAob3NzLT5wcm9iZWRfY2Fwcyk7CisgICAgICAgICAgb3NzLT5wcm9iZWRfY2FwcyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZ19mcmVlIChvc3MtPmRldmljZV9uYW1lKTsKKyAgICAgICAgb3NzLT5kZXZpY2VfbmFtZSA9IE5VTEw7CisgICAgICB9IGVsc2UgeworICAgICAgICBnX3dhcm5pbmcgKCIlczogY2FuJ3QgY2hhbmdlIFwiZGV2aWNlXCIgcHJvcGVydHkgd2hpbGUgYXVkaW8gc2luayAiCisgICAgICAgICAgICAiaXMgb3BlbiIsIEdTVF9PQkpFQ1RfTkFNRSAob3NzKSk7CisgICAgICB9CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAob3NzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9WT0xVTUU6CisgICAgICBnc3Rfb3NzNF9zaW5rX3NldF92b2x1bWUgKG9zcywgZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01VVEU6CisgICAgICBnc3Rfb3NzNF9zaW5rX3NldF9tdXRlIChvc3MsIGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzNF9zaW5rX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RPc3M0U2luayAqb3NzID0gR1NUX09TUzRfU0lOSyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfREVWSUNFOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChvc3MpOworICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgb3NzLT5kZXZpY2UpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKG9zcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfREVWSUNFX05BTUU6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKG9zcyk7CisgICAgICBpZiAob3NzLT5mZCA9PSAtMSAmJiBvc3MtPmRldmljZSAhPSBOVUxMKSB7CisgICAgICAgIC8qIElmIGRldmljZSBpcyBzZXQsIHRyeSB0byByZXRyaWV2ZSB0aGUgbmFtZSBldmVuIGlmIHdlJ3JlIG5vdCBvcGVuICovCisgICAgICAgIGlmIChnc3Rfb3NzNF9zaW5rX29wZW4gKEdTVF9BVURJT19TSU5LIChvc3MpLCBUUlVFKSkgeworICAgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIG9zcy0+ZGV2aWNlX25hbWUpOworICAgICAgICAgIGdzdF9vc3M0X3NpbmtfY2xvc2UgKEdTVF9BVURJT19TSU5LIChvc3MpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnY2hhciAqbmFtZSA9IE5VTEw7CisKKyAgICAgICAgICBnc3Rfb3NzNF9wcm9wZXJ0eV9wcm9iZV9maW5kX2RldmljZV9uYW1lX25vZmQgKEdTVF9PQkpFQ1QgKG9zcyksCisgICAgICAgICAgICAgIG9zcy0+ZGV2aWNlLCAmbmFtZSk7CisgICAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgbmFtZSk7CisgICAgICAgICAgZ19mcmVlIChuYW1lKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgb3NzLT5kZXZpY2VfbmFtZSk7CisgICAgICB9CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAob3NzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9WT0xVTUU6CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCBnc3Rfb3NzNF9zaW5rX2dldF92b2x1bWUgKG9zcykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01VVEU6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZ3N0X29zczRfc2lua19nZXRfbXV0ZSAob3NzKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9vc3M0X3NpbmtfZ2V0Y2FwcyAoR3N0QmFzZVNpbmsgKiBic2luaywgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0T3NzNFNpbmsgKm9zczsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBvc3MgPSBHU1RfT1NTNF9TSU5LIChic2luayk7CisKKyAgaWYgKG9zcy0+ZmQgPT0gLTEpIHsKKyAgICBjYXBzID0gZ3N0X29zczRfYXVkaW9fZ2V0X3RlbXBsYXRlX2NhcHMgKCk7CisgIH0gZWxzZSBpZiAob3NzLT5wcm9iZWRfY2FwcykgeworICAgIGNhcHMgPSBnc3RfY2Fwc19jb3B5IChvc3MtPnByb2JlZF9jYXBzKTsKKyAgfSBlbHNlIHsKKyAgICBjYXBzID0gZ3N0X29zczRfYXVkaW9fcHJvYmVfY2FwcyAoR1NUX09CSkVDVCAob3NzKSwgb3NzLT5mZCk7CisgICAgaWYgKGNhcHMgIT0gTlVMTCAmJiAhZ3N0X2NhcHNfaXNfZW1wdHkgKGNhcHMpKSB7CisgICAgICBvc3MtPnByb2JlZF9jYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgICAgfQorICB9CisKKyAgaWYgKGZpbHRlciAmJiBjYXBzKSB7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uOworCisgICAgaW50ZXJzZWN0aW9uID0KKyAgICAgICAgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgY2FwcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgcmV0dXJuIGludGVyc2VjdGlvbjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gY2FwczsKKyAgfQorfQorCisvKiBub3RlOiB3ZSBtdXN0IG5vdCB0YWtlIHRoZSBvYmplY3QgbG9jayBoZXJlIHVubGVzcyB3ZSBmaXggdXAgZ2V0X3Byb3BlcnR5ICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3M0X3Npbmtfb3BlbiAoR3N0QXVkaW9TaW5rICogYXNpbmssIGdib29sZWFuIHNpbGVudF9lcnJvcnMpCit7CisgIEdzdE9zczRTaW5rICpvc3M7CisgIGdjaGFyICpkZXZpY2U7CisgIGludCBtb2RlOworCisgIG9zcyA9IEdTVF9PU1M0X1NJTksgKGFzaW5rKTsKKworICBpZiAob3NzLT5kZXZpY2UpCisgICAgZGV2aWNlID0gZ19zdHJkdXAgKG9zcy0+ZGV2aWNlKTsKKyAgZWxzZQorICAgIGRldmljZSA9IGdzdF9vc3M0X2F1ZGlvX2ZpbmRfZGV2aWNlIChHU1RfT0JKRUNUX0NBU1QgKG9zcykpOworCisgIC8qIGRlc3BlcmF0ZSB0aW1lcywgZGVzcGVyYXRlIG1lYXN1cmVzICovCisgIGlmIChkZXZpY2UgPT0gTlVMTCkKKyAgICBkZXZpY2UgPSBnX3N0cmR1cCAoIi9kZXYvZHNwMCIpOworCisgIEdTVF9JTkZPX09CSkVDVCAob3NzLCAiVHJ5aW5nIHRvIG9wZW4gT1NTNCBkZXZpY2UgJyVzJyIsIGRldmljZSk7CisKKyAgLyogd2Ugb3BlbiBpbiBub24tYmxvY2tpbmcgbW9kZSBldmVuIGlmIHdlIGRvbid0IHJlYWxseSB3YW50IHRvIGRvIHdyaXRlcworICAgKiBub24tYmxvY2tpbmcgYmVjYXVzZSB3ZSBjYW4ndCBiZSBzdXJlIHRoYXQgdGhpcyBpcyByZWFsbHkgYSBnZW51aW5lCisgICAqIE9TUzQgZGV2aWNlIHdpdGggd2VsbC1iZWhhdmVkIGRyaXZlcnMgZXRjLiBXZSByZWFsbHkgZG9uJ3Qgd2FudCB0bworICAgKiBoYW5nIGZvcmV2ZXIgdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMuICovCisgIG9zcy0+ZmQgPSBvcGVuIChkZXZpY2UsIE9fV1JPTkxZIHwgT19OT05CTE9DSywgMCk7CisgIGlmIChvc3MtPmZkID09IC0xKSB7CisgICAgc3dpdGNoIChlcnJubykgeworICAgICAgY2FzZSBFQlVTWToKKyAgICAgICAgZ290byBidXN5OworICAgICAgY2FzZSBFQUNDRVM6CisgICAgICAgIGdvdG8gbm9fcGVybWlzc2lvbjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gb3Blbl9mYWlsZWQ7CisgICAgfQorICB9CisKKyAgR1NUX0lORk9fT0JKRUNUIChvc3MsICJPcGVuZWQgZGV2aWNlICclcyciLCBkZXZpY2UpOworCisgIC8qIE1ha2Ugc3VyZSBpdCdzIE9TUzQuIElmIGl0J3Mgb2xkIE9TUywgbGV0IG9zc3NpbmsgaGFuZGxlIGl0ICovCisgIGlmICghZ3N0X29zczRfYXVkaW9fY2hlY2tfdmVyc2lvbiAoR1NUX09CSkVDVF9DQVNUIChvc3MpLCBvc3MtPmZkKSkKKyAgICBnb3RvIGxlZ2FjeV9vc3M7CisKKyAgLyogbm93IHJlbW92ZSB0aGUgbm9uLWJsb2NraW5nIGZsYWcuICovCisgIG1vZGUgPSBmY250bCAob3NzLT5mZCwgRl9HRVRGTCk7CisgIG1vZGUgJj0gfk9fTk9OQkxPQ0s7CisgIGlmIChmY250bCAob3NzLT5mZCwgRl9TRVRGTCwgbW9kZSkgPCAwKSB7CisgICAgLyogc29tZSBkcml2ZXJzIGRvIG5vIHN1cHBvcnQgdW5zZXR0aW5nIHRoZSBub24tYmxvY2tpbmcgZmxhZywgdHJ5IHRvCisgICAgICogY2xvc2Uvb3BlbiB0aGUgZGV2aWNlIHRoZW4uIFRoaXMgaXMgcmFjeSBidXQgd2UgZXJyb3Igb3V0IHByb3Blcmx5LiAqLworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAob3NzLCAiZmFpbGVkIHRvIHVuc2V0IE9fTk9OQkxPQ0sgKGJ1Z2d5IGRyaXZlcj8pLCAiCisgICAgICAgICJ3aWxsIHRyeSB0byByZS1vcGVuIGRldmljZSBub3ciKTsKKyAgICBnc3Rfb3NzNF9zaW5rX2Nsb3NlIChhc2luayk7CisgICAgaWYgKChvc3MtPmZkID0gb3BlbiAoZGV2aWNlLCBPX1dST05MWSwgMCkpID09IC0xKQorICAgICAgZ290byBub25fYmxvY2s7CisgIH0KKworICBvc3MtPm9wZW5fZGV2aWNlID0gZGV2aWNlOworCisgIC8qIG5vdCB1c2luZyBFTkdJTkVJTkZPIGhlcmUgYmVjYXVzZSBpdCBzb21ldGltZXMgcmV0dXJucyBhIGRpZmZlcmVudCBhbmQKKyAgICogbGVzcyB1c2VmdWwgbmFtZSB0aGFuIEFVRElPSU5GTyBmb3IgdGhlIHNhbWUgZGV2aWNlICovCisgIGlmICghZ3N0X29zczRfcHJvcGVydHlfcHJvYmVfZmluZF9kZXZpY2VfbmFtZSAoR1NUX09CSkVDVCAob3NzKSwgb3NzLT5mZCwKKyAgICAgICAgICBvc3MtPm9wZW5fZGV2aWNlLCAmb3NzLT5kZXZpY2VfbmFtZSkpIHsKKyAgICBvc3MtPmRldmljZV9uYW1lID0gTlVMTDsKKyAgfQorCisgIC8qIGxpc3Qgb3V0cHV0IHJvdXRpbmdzLCBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IHNvIGZhciAqLworICB7CisgICAgb3NzX21peGVyX2VudW1pbmZvIHJvdXRpbmdzID0geyAwLCB9OworICAgIGd1aW50IGk7CisKKyAgICBpZiAoaW9jdGwgKG9zcy0+ZmQsIFNORENUTF9EU1BfR0VUX1BMQVlUR1RfTkFNRVMsICZyb3V0aW5ncykgIT0gLTEpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChvc3MsICIldSBvdXRwdXQgcm91dGluZ3MgKHN0YXRpYyBsaXN0OiAlZCkiLAorICAgICAgICAgIHJvdXRpbmdzLm52YWx1ZXMsICEgIShyb3V0aW5ncy52ZXJzaW9uID09IDApKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCByb3V0aW5ncy5udmFsdWVzOyArK2kpIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKG9zcywgIiAgb3V0cHV0IHJvdXRpbmcgJWQ6ICVzIiwgaSwKKyAgICAgICAgICAgICZyb3V0aW5ncy5zdHJpbmdzW3JvdXRpbmdzLnN0cmluZGV4W2ldXSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitidXN5OgorICB7CisgICAgaWYgKCFzaWxlbnRfZXJyb3JzKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAob3NzLCBSRVNPVVJDRSwgQlVTWSwKKyAgICAgICAgICAoXygiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gIgorICAgICAgICAgICAgICAgICAgIkRldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgYXBwbGljYXRpb24uIikpLCAoTlVMTCkpOworICAgIH0KKyAgICBnX2ZyZWUgKGRldmljZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19wZXJtaXNzaW9uOgorICB7CisgICAgaWYgKCFzaWxlbnRfZXJyb3JzKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAob3NzLCBSRVNPVVJDRSwgT1BFTl9XUklURSwKKyAgICAgICAgICAoXygiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gIgorICAgICAgICAgICAgICAgICAgIllvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiB0aGUgZGV2aWNlLiIpKSwKKyAgICAgICAgICBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICB9CisgICAgZ19mcmVlIChkZXZpY2UpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorb3Blbl9mYWlsZWQ6CisgIHsKKyAgICBpZiAoIXNpbGVudF9lcnJvcnMpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChvc3MsIFJFU09VUkNFLCBPUEVOX1dSSVRFLAorICAgICAgICAgIChfKCJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIpKSwgR1NUX0VSUk9SX1NZU1RFTSk7CisgICAgfQorICAgIGdfZnJlZSAoZGV2aWNlKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2xlZ2FjeV9vc3M6CisgIHsKKyAgICBpZiAoIXNpbGVudF9lcnJvcnMpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChvc3MsIFJFU09VUkNFLCBPUEVOX1dSSVRFLAorICAgICAgICAgIChfKCJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiAiCisgICAgICAgICAgICAgICAgICAiVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgIgorICAgICAgICAgICAgICAgICAgImVsZW1lbnQuIikpLCAoIlRyeSB0aGUgJ29zc3NpbmsnIGVsZW1lbnQgaW5zdGVhZCIpKTsKKyAgICB9CisgICAgZ3N0X29zczRfc2lua19jbG9zZSAoYXNpbmspOworICAgIGdfZnJlZSAoZGV2aWNlKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vbl9ibG9jazoKKyAgeworICAgIGlmICghc2lsZW50X2Vycm9ycykgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9zcywgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICAgKCJVbmFibGUgdG8gc2V0IGRldmljZSAlcyBpbnRvIG5vbi1ibG9ja2luZyBtb2RlOiAlcyIsCisgICAgICAgICAgICAgIG9zcy0+ZGV2aWNlLCBnX3N0cmVycm9yIChlcnJubykpKTsKKyAgICB9CisgICAgZ19mcmVlIChkZXZpY2UpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3M0X3Npbmtfb3Blbl9mdW5jIChHc3RBdWRpb1NpbmsgKiBhc2luaykKK3sKKyAgaWYgKCFnc3Rfb3NzNF9zaW5rX29wZW4gKGFzaW5rLCBGQUxTRSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIHRoZSBpbml0aWFsIHZvbHVtZSBtaWdodCBub3QgYmUgdGhlIHByb3BlcnR5IGRlZmF1bHQsIHNvIG5vdGlmeQorICAgKiBhcHBsaWNhdGlvbiB0byBtYWtlIGl0IGdldCBhIHJlYWRpbmcgb2YgdGhlIGN1cnJlbnQgdm9sdW1lICovCisgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKGFzaW5rKSwgInZvbHVtZSIpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3NzNF9zaW5rX2Nsb3NlIChHc3RBdWRpb1NpbmsgKiBhc2luaykKK3sKKyAgR3N0T3NzNFNpbmsgKm9zcyA9IEdTVF9PU1M0X1NJTksgKGFzaW5rKTsKKworICBpZiAob3NzLT5mZCAhPSAtMSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG9zcywgImNsb3NpbmcgZGV2aWNlIik7CisgICAgY2xvc2UgKG9zcy0+ZmQpOworICAgIG9zcy0+ZmQgPSAtMTsKKyAgfQorCisgIG9zcy0+Ynl0ZXNfcGVyX3NhbXBsZSA9IDA7CisgIC8qIHdlIGtlZXAgdGhlIHByb2JlZCBjYXBzIGNhY2hlZCwgYXQgbGVhc3QgdW50aWwgdGhlIGRldmljZSBjaGFuZ2VzICovCisKKyAgZ19mcmVlIChvc3MtPm9wZW5fZGV2aWNlKTsKKyAgb3NzLT5vcGVuX2RldmljZSA9IE5VTEw7CisKKyAgZ19mcmVlIChvc3MtPmRldmljZV9uYW1lKTsKKyAgb3NzLT5kZXZpY2VfbmFtZSA9IE5VTEw7CisKKyAgaWYgKG9zcy0+cHJvYmVkX2NhcHMpIHsKKyAgICBnc3RfY2Fwc191bnJlZiAob3NzLT5wcm9iZWRfY2Fwcyk7CisgICAgb3NzLT5wcm9iZWRfY2FwcyA9IE5VTEw7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3NzNF9zaW5rX3ByZXBhcmUgKEdzdEF1ZGlvU2luayAqIGFzaW5rLCBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYykKK3sKKyAgR3N0T3NzNFNpbmsgKm9zczsKKworICBvc3MgPSBHU1RfT1NTNF9TSU5LIChhc2luayk7CisKKyAgaWYgKCFnc3Rfb3NzNF9hdWRpb19zZXRfZm9ybWF0IChHU1RfT0JKRUNUX0NBU1QgKG9zcyksIG9zcy0+ZmQsIHNwZWMpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChvc3MsICJDb3VsZG4ndCBzZXQgcmVxdWVzdGVkIGZvcm1hdCAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgICAgc3BlYy0+Y2Fwcyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgb3NzLT5ieXRlc19wZXJfc2FtcGxlID0gR1NUX0FVRElPX0lORk9fQlBGICgmc3BlYy0+aW5mbyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zczRfc2lua191bnByZXBhcmUgKEdzdEF1ZGlvU2luayAqIGFzaW5rKQoreworICAvKiBjb3VsZCBkbyBhIFNORENUTF9EU1BfSEFMVCwgYnV0IHRoZSBPU1MgbWFudWFsIHJlY29tbWVuZHMgYSBjbG9zZS9vcGVuLAorICAgKiBzaW5jZSBIQUxUIHdvbid0IHByb3Blcmx5IHJlc2V0IHNvbWUgZGV2aWNlcywgYXBwYXJlbnRseSAqLworCisgIGlmICghZ3N0X29zczRfc2lua19jbG9zZSAoYXNpbmspKQorICAgIGdvdG8gY291bGRudF9jbG9zZTsKKworICBpZiAoIWdzdF9vc3M0X3Npbmtfb3Blbl9mdW5jIChhc2luaykpCisgICAgZ290byBjb3VsZG50X3Jlb3BlbjsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2NvdWxkbnRfY2xvc2U6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhc2luaywgIkNvdWxkbid0IGNsb3NlIHRoZSBhdWRpbyBkZXZpY2UiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2NvdWxkbnRfcmVvcGVuOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXNpbmssICJDb3VsZG4ndCByZW9wZW4gdGhlIGF1ZGlvIGRldmljZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2ludAorZ3N0X29zczRfc2lua193cml0ZSAoR3N0QXVkaW9TaW5rICogYXNpbmssIGdwb2ludGVyIGRhdGEsIGd1aW50IGxlbmd0aCkKK3sKKyAgR3N0T3NzNFNpbmsgKm9zczsKKyAgaW50IG47CisKKyAgb3NzID0gR1NUX09TUzRfU0lOS19DQVNUIChhc2luayk7CisKKyAgbiA9IHdyaXRlIChvc3MtPmZkLCBkYXRhLCBsZW5ndGgpOworICBHU1RfTE9HX09CSkVDVCAoYXNpbmssICJ3cm90ZSAlZC8lZCBzYW1wbGVzLCAlZCBieXRlcyIsCisgICAgICBuIC8gb3NzLT5ieXRlc19wZXJfc2FtcGxlLCBsZW5ndGggLyBvc3MtPmJ5dGVzX3Blcl9zYW1wbGUsIG4pOworCisgIGlmIChHX1VOTElLRUxZIChuIDwgMCkpIHsKKyAgICBzd2l0Y2ggKGVycm5vKSB7CisgICAgICBjYXNlIEVOT1RTVVA6CisgICAgICBjYXNlIEVBQ0NFUzp7CisgICAgICAgIC8qIFRoaXMgaXMgdGhlIG1vc3QgbGlrZWx5IGNhdXNlLCBJIHRoaW5rICovCisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChhc2luaywgUkVTT1VSQ0UsIFdSSVRFLAorICAgICAgICAgICAgKF8oIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIikpLAorICAgICAgICAgICAgKCJ3cml0ZTogJXMgKGRldmljZTogJXMpIChtYXliZSB0aGlzIGlzIGFuIGlucHV0LW9ubHkgZGV2aWNlPykiLAorICAgICAgICAgICAgICAgIGdfc3RyZXJyb3IgKGVycm5vKSwgb3NzLT5vcGVuX2RldmljZSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6eworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXNpbmssIFJFU09VUkNFLCBXUklURSwKKyAgICAgICAgICAgIChfKCJBdWRpbyBwbGF5YmFjayBlcnJvci4iKSksCisgICAgICAgICAgICAoIndyaXRlOiAlcyAoZGV2aWNlOiAlcykiLCBnX3N0cmVycm9yIChlcnJubyksIG9zcy0+b3Blbl9kZXZpY2UpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIG47Cit9CisKK3N0YXRpYyBndWludAorZ3N0X29zczRfc2lua19kZWxheSAoR3N0QXVkaW9TaW5rICogYXNpbmspCit7CisgIEdzdE9zczRTaW5rICpvc3M7CisgIGdpbnQgZGVsYXkgPSAtMTsKKworICBvc3MgPSBHU1RfT1NTNF9TSU5LX0NBU1QgKGFzaW5rKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKG9zcyk7CisgIGlmIChpb2N0bCAob3NzLT5mZCwgU05EQ1RMX0RTUF9HRVRPREVMQVksICZkZWxheSkgPCAwIHx8IGRlbGF5IDwgMCkgeworICAgIEdTVF9MT0dfT0JKRUNUIChvc3MsICJHRVRPREVMQVkgZmFpbGVkIik7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKG9zcyk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGRlbGF5IDwgMCkpICAgLyogZXJyb3IgY2FzZSAqLworICAgIHJldHVybiAwOworCisgIHJldHVybiBkZWxheSAvIG9zcy0+Ynl0ZXNfcGVyX3NhbXBsZTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3M0X3NpbmtfcmVzZXQgKEdzdEF1ZGlvU2luayAqIGFzaW5rKQoreworICAvKiBUaGVyZSdzIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUgcmVhbGx5OiBPU1MgY2FuJ3QgaGFuZGxlIGFjY2VzcyB0byB0aGUKKyAgICogc2FtZSBkZXZpY2UvZmQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIGFuZCBtaWdodCBkZWFkbG9jayBvciBibG93IHVwIGluCisgICAqIG90aGVyIHdheXMgaWYgd2UgdHJ5IGFuIGlvY3RsIFNORENUTF9EU1BfSEFMVCBvciBzaW1pbGFyICovCit9CmRpZmYgLS1naXQgYS9zeXMvb3NzNC9vc3M0LXNpbmsuaCBiL3N5cy9vc3M0L29zczQtc2luay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NjQ1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3NzNC9vc3M0LXNpbmsuaApAQCAtMCwwICsxLDYyIEBACisvKiBHU3RyZWFtZXIgT1NTNCBhdWRpbyBzaW5rCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgR1NUX09TUzRfU0lOS19ICisjZGVmaW5lIEdTVF9PU1M0X1NJTktfSAorCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvc2luay5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfT1NTNF9TSU5LICAgICAgICAgICAgKGdzdF9vc3M0X3NpbmtfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX09TUzRfU0lOSyhvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX09TUzRfU0lOSyxHc3RPc3M0U2luaykpCisjZGVmaW5lIEdTVF9PU1M0X1NJTktfQ0FTVChvYmopICAgICAgICgoR3N0T3NzNFNpbmsgKikob2JqKSkKKyNkZWZpbmUgR1NUX09TUzRfU0lOS19DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfT1NTNF9TSU5LLEdzdE9zczRTaW5rQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfT1NTNF9TSU5LKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfT1NTNF9TSU5LKSkKKyNkZWZpbmUgR1NUX0lTX09TUzRfU0lOS19DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfT1NTNF9TSU5LKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9zczRTaW5rIEdzdE9zczRTaW5rOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9zczRTaW5rQ2xhc3MgR3N0T3NzNFNpbmtDbGFzczsKKworc3RydWN0IF9Hc3RPc3M0U2luayB7CisgIEdzdEF1ZGlvU2luayAgYXVkaW9fc2luazsKKworICBnY2hhciAgICAgICAqIGRldmljZTsgICAgICAgICAgICAgLyogTlVMTCBpZiBub25lIHdhcyBzZXQgICAgICAqLworICBnY2hhciAgICAgICAqIG9wZW5fZGV2aWNlOyAgICAgICAgLyogdGhlIGRldmljZSB3ZSBvcGVuZWQgICAgICAqLworICBnY2hhciAgICAgICAqIGRldmljZV9uYW1lOyAgICAgICAgLyogc2V0IGlmIHRoZSBkZXZpY2UgaXMgb3BlbiAqLworICBnaW50ICAgICAgICAgIGZkOyAgICAgICAgICAgICAgICAgLyogLTEgaWYgbm90IG9wZW4gICAgICAgICAgICAqLworICBnaW50ICAgICAgICAgIGJ5dGVzX3Blcl9zYW1wbGU7CisgIGdpbnQgICAgICAgICAgbXV0ZV92b2x1bWU7CisKKyAgR3N0Q2FwcyAgICAgKiBwcm9iZWRfY2FwczsKK307CisKK3N0cnVjdCBfR3N0T3NzNFNpbmtDbGFzcyB7CisgIEdzdEF1ZGlvU2lua0NsYXNzIGF1ZGlvX3NpbmtfY2xhc3M7Cit9OworCitHVHlwZSAgZ3N0X29zczRfc2lua19nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBHU1RfT1NTNF9TSU5LX0ggKi8KKworCmRpZmYgLS1naXQgYS9zeXMvb3NzNC9vc3M0LXNvdW5kY2FyZC5oIGIvc3lzL29zczQvb3NzNC1zb3VuZGNhcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjEyNDg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zczQvb3NzNC1zb3VuZGNhcmQuaApAQCAtMCwwICsxLDIwNjcgQEAKKy8qCisgKiBQdXJwb3NlOiBUaGUgQy9DKysgaGVhZGVyIGZpbGUgdGhhdCBkZWZpbmVzIHRoZSBPU1MgQVBJLgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgZGVjbGFyYXRpb25zIHJlcXVpcmVkIHRvIGNvbXBpbGUgT1NTCisgKiBwcm9ncmFtcy4gVGhlIGxhdGVzdCB2ZXJzaW9uIGlzIGFsd2F5cyBpbnN0YWxsZWQgdG9nZXRoZXIgd2l0aCBPU1MKKyAqIHVzZSBvZiB0aGUgbGF0ZXN0IHZlcnNpb24gaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQuCisgKgorICogeyFub3RpY2UgVGhpcyBoZWFkZXIgZmlsZSBjb250YWlucyBtYW55IG9ic29sZXRlIGRlZmluaXRpb25zCisgKiAoZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBhcHBsaWNhdGlvbnMgdGhhdCBzdGlsbCBuZWQgdGhlbSkuCisgKiBEbyBub3QgdXNlIHRoaXMgZmlsZSBhcyBhIHJlZmVyZW5jZSBtYW51YWwgb2YgT1NTLgorICogUGxlYXNlIGNoZWNrIHRoZSBPU1MgUHJvZ3JhbW1lcidzIGd1aWRlIGZvciBkZXNjcmlwdGlvbnMKKyAqIG9mIHRoZSBzdXBwb3J0ZWQgQVBJIGRldGFpbHMgKGh0dHA6Ly9tYW51YWxzLm9wZW5zb3VuZC5jb20vZGV2ZWxvcGVyKS59CisgKi8KKworI2lmbmRlZiBTT1VORENBUkRfSAorI2RlZmluZSBTT1VORENBUkRfSAorCisjZGVmaW5lIENPUFlJTkc0MCBDb3B5cmlnaHQgKEMpIDRGcm9udCBUZWNobm9sb2dpZXMgMjAwMC0yMDA2LiBSZWxlYXNlZCB1bmRlciB0aGUgQlNEIGxpY2Vuc2UuCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2RlZmluZSBFWFRFUk5DIGV4dGVybiAiQyIKKyNlbHNlCisjZGVmaW5lIEVYVEVSTkMgZXh0ZXJuCisjZW5kaWYgLyogRVhURVJOX0NfV1JBUFBFUlMgKi8KKworI2RlZmluZSBPU1NfVkVSU0lPTgkweDA0MDA5MCAvLyBQcmUgNC4xCisKKyNkZWZpbmUgU09VTkRfVkVSU0lPTglPU1NfVkVSU0lPTgorI2RlZmluZSBPUEVOX1NPVU5EX1NZU1RFTQorCisjaWYgZGVmaW5lZChfX2hwdXgpICYmICFkZWZpbmVkKF9IUFVYX1NPVVJDRSkKKyMJZXJyb3IgIi1EX0hQVVhfU09VUkNFIG11c3QgYmUgdXNlZCB3aGVuIGNvbXBpbGluZyBPU1MgYXBwbGljYXRpb25zIgorI2VuZGlmCisKKyNpZmRlZiBfX2hwdXgKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNlbmRpZgorCisjaWZkZWYgbGludXgKKy8qIEluIExpbnV4IHdlIG5lZWQgdG8gYmUgcHJlcGFyZWQgZm9yIGNyb3NzIGNvbXBpbGluZyAqLworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjZWxzZQorIyBpZmRlZiBfX0ZyZWVCU0RfXworIyAgICBpbmNsdWRlIDxzeXMvaW9jY29tLmg+CisjIGVsc2UKKyMgICAgaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfX1NJT1dSCisjaWYgZGVmaW5lZChfX2hwdXgpIHx8IChkZWZpbmVkKF9JT1dSKSAmJiAoZGVmaW5lZChfQUlYKSB8fCAoIWRlZmluZWQoc3VuKSAmJiAhZGVmaW5lZChzcGFyYykgJiYgIWRlZmluZWQoX19JTkNpb2N0bGgpICYmICFkZWZpbmVkKF9fTHlueF9fKSkpKQorCisvKiAKKyAqIE1ha2Ugc3VyZSB0aGUgaW9jdGwgbWFjcm9zIGFyZSBjb21wYXRpYmxlIHdpdGggdGhlIG9uZXMgYWxyZWFkeSB1c2VkCisgKiBieSB0aGlzIG9wZXJhdGluZyBzeXN0ZW0uCisgKi8KKyNkZWZpbmUJU0lPQ1BBUk1fTUFTSwlJT0NQQVJNX01BU0sKKyNkZWZpbmUJU0lPQ19WT0lECUlPQ19WT0lECisjZGVmaW5lCVNJT0NfT1VUCUlPQ19PVVQKKyNkZWZpbmUJU0lPQ19JTgkJSU9DX0lOCisjZGVmaW5lCVNJT0NfSU5PVVQJSU9DX0lOT1VUCisjZGVmaW5lIF9fU0lPQ19TSVpFCV9JT0NfU0laRQorI2RlZmluZSBfX1NJT0NfRElSCV9JT0NfRElSCisjZGVmaW5lIF9fU0lPQ19OT05FCV9JT0NfTk9ORQorI2RlZmluZSBfX1NJT0NfUkVBRAlfSU9DX1JFQUQKKyNkZWZpbmUgX19TSU9DX1dSSVRFCV9JT0NfV1JJVEUKKyNkZWZpbmUJX19TSU8JCV9JTworI2RlZmluZQlfX1NJT1IJCV9JT1IKKyNkZWZpbmUJX19TSU9XCQlfSU9XCisjZGVmaW5lCV9fU0lPV1IJCV9JT1dSCisjZWxzZQorCisvKiAjZGVmaW5lCVNJT0NUWVBFCQkoMHhmZjw8OCkgKi8KKyNkZWZpbmUJU0lPQ1BBUk1fTUFTSwkweDFmZmYJLyogcGFyYW1ldGVycyBtdXN0IGJlIDwgODE5MiBieXRlcyAqLworI2RlZmluZQlTSU9DX1ZPSUQJMHgwMDAwMDAwMAkvKiBubyBwYXJhbWV0ZXJzICovCisjZGVmaW5lCVNJT0NfT1VUCTB4MjAwMDAwMDAJLyogY29weSBvdXQgcGFyYW1ldGVycyAqLworI2RlZmluZQlTSU9DX0lOCQkweDQwMDAwMDAwCS8qIGNvcHkgaW4gcGFyYW1ldGVycyAqLworI2RlZmluZQlTSU9DX0lOT1VUCShTSU9DX0lOfFNJT0NfT1VUKQorCisjZGVmaW5lCV9fU0lPKHgseSkJKChpbnQpKFNJT0NfVk9JRHwoeDw8OCl8eSkpCisjZGVmaW5lCV9fU0lPUih4LHksdCkJKChpbnQpKFNJT0NfT1VUfCgoc2l6ZW9mKHQpJlNJT0NQQVJNX01BU0spPDwxNil8KHg8PDgpfHkpKQorI2RlZmluZQlfX1NJT1coeCx5LHQpCSgoaW50KShTSU9DX0lOfCgoc2l6ZW9mKHQpJlNJT0NQQVJNX01BU0spPDwxNil8KHg8PDgpfHkpKQorI2RlZmluZQlfX1NJT1dSKHgseSx0KQkoKGludCkoU0lPQ19JTk9VVHwoKHNpemVvZih0KSZTSU9DUEFSTV9NQVNLKTw8MTYpfCh4PDw4KXx5KSkKKyNkZWZpbmUgX19TSU9DX1NJWkUoeCkJKCh4Pj4xNikmU0lPQ1BBUk1fTUFTSykKKyNkZWZpbmUgX19TSU9DX0RJUih4KQkoeCAmIDB4ZjAwMDAwMDApCisjZGVmaW5lIF9fU0lPQ19OT05FCVNJT0NfVk9JRAorI2RlZmluZSBfX1NJT0NfUkVBRAlTSU9DX09VVAorI2RlZmluZSBfX1NJT0NfV1JJVEUJU0lPQ19JTgorIyAgZW5kaWYgLyogX0lPV1IgKi8KKyNlbmRpZiAvKiAhX19TSU9XUiAqLworCisjZGVmaW5lIE9TU19MT05HTkFNRV9TSVpFCTY0CisjZGVmaW5lIE9TU19MQUJFTF9TSVpFCQkxNgorI2RlZmluZSBPU1NfREVWTk9ERV9TSVpFCTMyCit0eXBlZGVmIGNoYXIgb3NzX2xvbmduYW1lX3RbT1NTX0xPTkdOQU1FX1NJWkVdOwordHlwZWRlZiBjaGFyIG9zc19sYWJlbF90W09TU19MQUJFTF9TSVpFXTsKK3R5cGVkZWYgY2hhciBvc3NfZGV2bm9kZV90W09TU19ERVZOT0RFX1NJWkVdOworCisjaWZuZGVmIERJU0FCTEVfU0VRVUVOQ0VSCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElPQ1RMIENvbW1hbmRzIGZvciAvZGV2L3NlcXVlbmNlciBhbmQgL2Rldi9tdXNpYyAoQUtBIC9kZXYvc2VxdWVuY2VyMikKKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBpbnRlcmZhY2UgaXMgb2Jzb2xldGUgYW5kIG5vIGxvbmdlciBkZXZlbG9wZWQuIE5ldworICogYXBwbGljYXRpb25zIHNob3VsZCB1c2UgL2Rldi9taWRpIGluc3RlYWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgU05EQ1RMX1NFUV9SRVNFVAkJX19TSU8gICgnUScsIDApCisjZGVmaW5lIFNORENUTF9TRVFfU1lOQwkJCV9fU0lPICAoJ1EnLCAxKQorI2RlZmluZSBTTkRDVExfU1lOVEhfSU5GTwkJX19TSU9XUignUScsIDIsIHN0cnVjdCBzeW50aF9pbmZvKQorI2RlZmluZSBTTkRDVExfU0VRX0NUUkxSQVRFCQlfX1NJT1dSKCdRJywgMywgaW50KQkvKiBTZXQvZ2V0IHRpbWVyIHJlc29sdXRpb24gKEhaKSAqLworI2RlZmluZSBTTkRDVExfU0VRX0dFVE9VVENPVU5UCQlfX1NJT1IgKCdRJywgNCwgaW50KQorI2RlZmluZSBTTkRDVExfU0VRX0dFVElOQ09VTlQJCV9fU0lPUiAoJ1EnLCA1LCBpbnQpCisjZGVmaW5lIFNORENUTF9TRVFfUEVSQ01PREUJCV9fU0lPVyAoJ1EnLCA2LCBpbnQpCisjZGVmaW5lIFNORENUTF9GTV9MT0FEX0lOU1RSCQlfX1NJT1cgKCdRJywgNywgc3RydWN0IHNiaV9pbnN0cnVtZW50KQkvKiBPYnNvbGV0ZS4gRG9uJ3QgdXNlISEhISEhICovCisjZGVmaW5lIFNORENUTF9TRVFfVEVTVE1JREkJCV9fU0lPVyAoJ1EnLCA4LCBpbnQpCisjZGVmaW5lIFNORENUTF9TRVFfUkVTRVRTQU1QTEVTCQlfX1NJT1cgKCdRJywgOSwgaW50KQorI2RlZmluZSBTTkRDVExfU0VRX05SU1lOVEhTCQlfX1NJT1IgKCdRJywxMCwgaW50KQorI2RlZmluZSBTTkRDVExfU0VRX05STUlESVMJCV9fU0lPUiAoJ1EnLDExLCBpbnQpCisjZGVmaW5lIFNORENUTF9NSURJX0lORk8JCV9fU0lPV1IoJ1EnLDEyLCBzdHJ1Y3QgbWlkaV9pbmZvKQkvKiBPQlNPTEVURSAtIHVzZSBTTkRDVExfTUlESUlORk8gaW5zdGVhZCAqLworI2RlZmluZSBTTkRDVExfU0VRX1RIUkVTSE9MRAkJX19TSU9XICgnUScsMTMsIGludCkKKyNkZWZpbmUgU05EQ1RMX1NZTlRIX01FTUFWTAkJX19TSU9XUignUScsMTQsIGludCkJLyogaW49ZGV2Iywgb3V0PW1lbXNpemUgKi8KKyNkZWZpbmUgU05EQ1RMX0ZNXzRPUF9FTkFCTEUJCV9fU0lPVyAoJ1EnLDE1LCBpbnQpCS8qIGluPWRldiMgKi8KKyNkZWZpbmUgU05EQ1RMX1NFUV9QQU5JQwkJX19TSU8gICgnUScsMTcpCisjZGVmaW5lIFNORENUTF9TRVFfT1VUT0ZCQU5ECQlfX1NJT1cgKCdRJywxOCwgc3RydWN0IHNlcV9ldmVudF9yZWMpCisjZGVmaW5lIFNORENUTF9TRVFfR0VUVElNRQkJX19TSU9SICgnUScsMTksIGludCkKKyNkZWZpbmUgU05EQ1RMX1NZTlRIX0lECQkJX19TSU9XUignUScsMjAsIHN0cnVjdCBzeW50aF9pbmZvKQorI2RlZmluZSBTTkRDVExfU1lOVEhfQ09OVFJPTAkJX19TSU9XUignUScsMjEsIHN0cnVjdCBzeW50aF9jb250cm9sKQorI2RlZmluZSBTTkRDVExfU1lOVEhfUkVNT1ZFU0FNUExFCV9fU0lPV1IoJ1EnLDIyLCBzdHJ1Y3QgcmVtb3ZlX3NhbXBsZSkJLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKyNkZWZpbmUgU05EQ1RMX1NFUV9USU1JTkdfRU5BQkxFCV9fU0lPICAoJ1EnLCAyMykJLyogRW5hYmxlIGluY29taW5nIE1JREkgdGltaW5nIG1lc3NhZ2VzICovCisjZGVmaW5lIFNORENUTF9TRVFfQUNUU0VOU0VfRU5BQkxFCV9fU0lPICAoJ1EnLCAyNCkJLyogRW5hYmxlIGluY29taW5nIGFjdGl2ZSBzZW5zaW5nIG1lc3NhZ2VzICovCisjZGVmaW5lIFNORENUTF9TRVFfUlRfRU5BQkxFCQlfX1NJTyAgKCdRJywgMjUpCS8qIEVuYWJsZSBvdGhlciBpbmNvbWluZyByZWFsdGltZSBtZXNzYWdlcyAqLworCit0eXBlZGVmIHN0cnVjdCBzeW50aF9jb250cm9sCit7CisgIGludCBkZXZubzsJCQkvKiBTeW50aGVzaXplciAjICovCisgIGNoYXIgZGF0YVs0MDAwXTsJCS8qIERldmljZSBzcGVzaWZpYyBjb21tYW5kL2RhdGEgcmVjb3JkICovCit9IHN5bnRoX2NvbnRyb2w7CisKK3R5cGVkZWYgc3RydWN0IHJlbW92ZV9zYW1wbGUKK3sKKyAgaW50IGRldm5vOwkJCS8qIFN5bnRoZXNpemVyICMgKi8KKyAgaW50IGJhbmtubzsJCQkvKiBNSURJIGJhbmsgIyAoMD1HZW5lcmFsIE1JREkpICovCisgIGludCBpbnN0cm5vOwkJCS8qIE1JREkgaW5zdHJ1bWVudCBudW1iZXIgKi8KK30gcmVtb3ZlX3NhbXBsZTsKKwordHlwZWRlZiBzdHJ1Y3Qgc2VxX2V2ZW50X3JlYworeworICB1bnNpZ25lZCBjaGFyIGFycls4XTsKK30gc2VxX2V2ZW50X3JlYzsKKworI2RlZmluZSBTTkRDVExfVE1SX1RJTUVCQVNFCQlfX1NJT1dSKCdUJywgMSwgaW50KQorI2RlZmluZSBTTkRDVExfVE1SX1NUQVJUCQlfX1NJTyAgKCdUJywgMikKKyNkZWZpbmUgU05EQ1RMX1RNUl9TVE9QCQkJX19TSU8gICgnVCcsIDMpCisjZGVmaW5lIFNORENUTF9UTVJfQ09OVElOVUUJCV9fU0lPICAoJ1QnLCA0KQorI2RlZmluZSBTTkRDVExfVE1SX1RFTVBPCQlfX1NJT1dSKCdUJywgNSwgaW50KQorI2RlZmluZSBTTkRDVExfVE1SX1NPVVJDRQkJX19TSU9XUignVCcsIDYsIGludCkKKyMJZGVmaW5lIFRNUl9JTlRFUk5BTAkJMHgwMDAwMDAwMQorIwlkZWZpbmUgVE1SX0VYVEVSTkFMCQkweDAwMDAwMDAyCisjCQlkZWZpbmUgVE1SX01PREVfTUlESQkweDAwMDAwMDEwCisjCQlkZWZpbmUgVE1SX01PREVfRlNLCTB4MDAwMDAwMjAKKyMJCWRlZmluZSBUTVJfTU9ERV9DTFMJMHgwMDAwMDA0MAorIwkJZGVmaW5lIFRNUl9NT0RFX1NNUFRFCTB4MDAwMDAwODAKKyNkZWZpbmUgU05EQ1RMX1RNUl9NRVRST05PTUUJCV9fU0lPVyAoJ1QnLCA3LCBpbnQpCisjZGVmaW5lIFNORENUTF9UTVJfU0VMRUNUCQlfX1NJT1cgKCdUJywgOCwgaW50KQorCisvKgorICogU2FtcGxlIGxvYWRpbmcgbWVjaGFuaXNtIGZvciBpbnRlcm5hbCBzeW50aGVzaXplcnMgKC9kZXYvc2VxdWVuY2VyKQorICogKGZvciB0aGUgLlBBVCBmb3JtYXQpLgorICovCisKK3N0cnVjdCBwYXRjaF9pbmZvCit7CisgIHVuc2lnbmVkIHNob3J0IGtleTsJCS8qIFVzZSBXQVZFX1BBVENIIGhlcmUgKi8KKyNkZWZpbmUgV0FWRV9QQVRDSAlfUEFUQ0hLRVkoMHgwNCkKKyNkZWZpbmUgR1VTX1BBVENICVdBVkVfUEFUQ0gKKyNkZWZpbmUgV0FWRUZST05UX1BBVENIIF9QQVRDSEtFWSgweDA2KQorCisgIHNob3J0IGRldmljZV9ubzsJCS8qIFN5bnRoZXNpemVyIG51bWJlciAqLworICBzaG9ydCBpbnN0cl9ubzsJCS8qIE1pZGkgcGdtIyAqLworCisgIHVuc2lnbmVkIGludCBtb2RlOworLyoKKyAqIFRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlIGhhcyB0aGUgc2FtZSBmb3JtYXQgdGhhbiB0aGUgR1VTIC5QQVQKKyAqIGZpbGVzCisgKi8KKyNkZWZpbmUgV0FWRV8xNl9CSVRTCTB4MDEJLyogYml0IDAgPSA4IG9yIDE2IGJpdCB3YXZlIGRhdGEuICovCisjZGVmaW5lIFdBVkVfVU5TSUdORUQJMHgwMgkvKiBiaXQgMSA9IFNpZ25lZCAtIFVuc2lnbmVkIGRhdGEuICovCisjZGVmaW5lIFdBVkVfTE9PUElORwkweDA0CS8qIGJpdCAyID0gbG9vcGluZyBlbmFibGVkLTEuICovCisjZGVmaW5lIFdBVkVfQklESVJfTE9PUAkweDA4CS8qIGJpdCAzID0gU2V0IGlzIGJpZGlyZWN0aW9uYWwgbG9vcGluZy4gKi8KKyNkZWZpbmUgV0FWRV9MT09QX0JBQ0sJMHgxMAkvKiBiaXQgNCA9IFNldCBpcyBsb29waW5nIGJhY2t3YXJkLiAqLworI2RlZmluZSBXQVZFX1NVU1RBSU5fT04JMHgyMAkvKiBiaXQgNSA9IFR1cm4gc3VzdGFpbmluZyBvbi4gKEVudi4gcHRzLiAzKSAqLworI2RlZmluZSBXQVZFX0VOVkVMT1BFUwkweDQwCS8qIGJpdCA2ID0gRW5hYmxlIGVudmVsb3BlcyAtIDEgKi8KKyNkZWZpbmUgV0FWRV9GQVNUX1JFTEVBU0UgMHg4MAkvKiBiaXQgNyA9IFNodXQgb2ZmIGltbWVkaWF0ZWx5IGFmdGVyIG5vdGUgb2ZmICovCisgIC8qICAodXNlIHRoZSBlbnZfcmF0ZS9lbnZfb2ZmcyBmaWVsZHMpLiAqLworLyogTGludXggc3BlY2lmaWMgYml0cyAqLworI2RlZmluZSBXQVZFX1ZJQlJBVE8JMHgwMDAxMDAwMAkvKiBUaGUgdmlicmF0byBpbmZvIGlzIHZhbGlkICovCisjZGVmaW5lIFdBVkVfVFJFTU9MTwkweDAwMDIwMDAwCS8qIFRoZSB0cmVtb2xvIGluZm8gaXMgdmFsaWQgKi8KKyNkZWZpbmUgV0FWRV9TQ0FMRQkweDAwMDQwMDAwCS8qIFRoZSBzY2FsaW5nIGluZm8gaXMgdmFsaWQgKi8KKyNkZWZpbmUgV0FWRV9GUkFDVElPTlMJMHgwMDA4MDAwMAkvKiBGcmFjdGlvbiBpbmZvcm1hdGlvbiBpcyB2YWxpZCAqLworLyogUmVzZXJ2ZWQgYml0cyAqLworI2RlZmluZSBXQVZFX1JPTQkweDQwMDAwMDAwCS8qIEZvciBmdXR1cmUgdXNlICovCisjZGVmaW5lIFdBVkVfTVVMQVcJMHgyMDAwMDAwMAkvKiBGb3IgZnV0dXJlIHVzZSAqLworLyogT3RoZXIgYml0cyBtdXN0IGJlIHplcm9lZCAqLworCisgIGludCBsZW47CQkJLyogU2l6ZSBvZiB0aGUgd2F2ZSBkYXRhIGluIGJ5dGVzICovCisgIGludCBsb29wX3N0YXJ0LCBsb29wX2VuZDsJLyogQnl0ZSBvZmZzZXRzIGZyb20gdGhlIGJlZ2lubmluZyAqLworCisvKiAKKyAqIFRoZSBiYXNlX2ZyZXEgYW5kIGJhc2Vfbm90ZSBmaWVsZHMgYXJlIHVzZWQgd2hlbiBjb21wdXRpbmcgdGhlCisgKiBwbGF5YmFjayBzcGVlZCBmb3IgYSBub3RlLiBUaGUgYmFzZV9ub3RlIGRlZmluZXMgdGhlIHRvbmUgZnJlcXVlbmN5CisgKiB3aGljaCBpcyBoZWFyZCBpZiB0aGUgc2FtcGxlIGlzIHBsYXllZCB1c2luZyB0aGUgYmFzZV9mcmVxIGFzIHRoZQorICogcGxheWJhY2sgc3BlZWQuCisgKgorICogVGhlIGxvd19ub3RlIGFuZCBoaWdoX25vdGUgZmllbGRzIGRlZmluZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBub3RlCisgKiBmcmVxdWVuY2llcyBmb3Igd2hpY2ggdGhpcyBzYW1wbGUgaXMgdmFsaWQuIEl0IGlzIHBvc3NpYmxlIHRvIGRlZmluZQorICogbW9yZSB0aGFuIG9uZSBzYW1wbGVzIGZvciBhbiBpbnN0cnVtZW50IG51bWJlciBhdCB0aGUgc2FtZSB0aW1lLiBUaGUKKyAqIGxvd19ub3RlIGFuZCBoaWdoX25vdGUgZmllbGRzIGFyZSB1c2VkIHRvIHNlbGVjdCB0aGUgbW9zdCBzdWl0YWJsZSBvbmUuCisgKgorICogVGhlIGZpZWxkcyBiYXNlX25vdGUsIGhpZ2hfbm90ZSBhbmQgbG93X25vdGUgc2hvdWxkIGNvbnRhaW4KKyAqIHRoZSBub3RlIGZyZXF1ZW5jeSBtdWx0aXBsaWVkIGJ5IDEwMDAuIEZvciBleGFtcGxlIHZhbHVlIGZvciB0aGUKKyAqIG1pZGRsZSBBIGlzIDQ0MCoxMDAwLgorICovCisKKyAgdW5zaWduZWQgaW50IGJhc2VfZnJlcTsKKyAgdW5zaWduZWQgaW50IGJhc2Vfbm90ZTsKKyAgdW5zaWduZWQgaW50IGhpZ2hfbm90ZTsKKyAgdW5zaWduZWQgaW50IGxvd19ub3RlOworICBpbnQgcGFubmluZzsJCQkvKiAtMTI4PWxlZnQsIDEyNz1yaWdodCAqLworICBpbnQgZGV0dW5pbmc7CisKKyAgLyogRW52ZWxvcGUuIEVuYWJsZWQgYnkgbW9kZSBiaXQgV0FWRV9FTlZFTE9QRVMgICovCisgIHVuc2lnbmVkIGNoYXIgZW52X3JhdGVbNl07CS8qIEdVUyBIVyByYW1waW5nIHJhdGUgKi8KKyAgdW5zaWduZWQgY2hhciBlbnZfb2Zmc2V0WzZdOwkvKiAyNTUgPT0gMTAwJSAqLworCisgIC8qIAorICAgKiBUaGUgdHJlbW9sbywgdmlicmF0byBhbmQgc2NhbGUgaW5mbyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuCisgICAqIEVuYWJsZSBieSBzZXR0aW5nIHRoZSBtb2RlIGJpdHMgV0FWRV9UUkVNT0xPLCBXQVZFX1ZJQlJBVE8gb3IKKyAgICogV0FWRV9TQ0FMRQorICAgKi8KKworICB1bnNpZ25lZCBjaGFyIHRyZW1vbG9fc3dlZXA7CisgIHVuc2lnbmVkIGNoYXIgdHJlbW9sb19yYXRlOworICB1bnNpZ25lZCBjaGFyIHRyZW1vbG9fZGVwdGg7CisKKyAgdW5zaWduZWQgY2hhciB2aWJyYXRvX3N3ZWVwOworICB1bnNpZ25lZCBjaGFyIHZpYnJhdG9fcmF0ZTsKKyAgdW5zaWduZWQgY2hhciB2aWJyYXRvX2RlcHRoOworCisgIGludCBzY2FsZV9mcmVxdWVuY3k7CisgIHVuc2lnbmVkIGludCBzY2FsZV9mYWN0b3I7CS8qIGZyb20gMCB0byAyMDQ4IG9yIDAgdG8gMiAqLworCisgIGludCB2b2x1bWU7CisgIGludCBmcmFjdGlvbnM7CisgIGludCByZXNlcnZlZDE7CisgIGludCBzcGFyZVsyXTsKKyAgY2hhciBkYXRhWzFdOwkJCS8qIFRoZSB3YXZlZm9ybSBkYXRhIHN0YXJ0cyBoZXJlICovCit9OworCitzdHJ1Y3Qgc3lzZXhfaW5mbworeworICBzaG9ydCBrZXk7CQkJLyogVXNlIFNZU0VYX1BBVENIIG9yIE1BVUlfUEFUQ0ggaGVyZSAqLworI2RlZmluZSBTWVNFWF9QQVRDSAlfUEFUQ0hLRVkoMHgwNSkKKyNkZWZpbmUgTUFVSV9QQVRDSAlfUEFUQ0hLRVkoMHgwNikKKyAgc2hvcnQgZGV2aWNlX25vOwkJLyogU3ludGhlc2l6ZXIgbnVtYmVyICovCisgIGludCBsZW47CQkJLyogU2l6ZSBvZiB0aGUgc3lzZXggZGF0YSBpbiBieXRlcyAqLworICB1bnNpZ25lZCBjaGFyIGRhdGFbMV07CS8qIFN5c2V4IGRhdGEgc3RhcnRzIGhlcmUgKi8KK307CisKKy8qCisgKiAvZGV2L3NlcXVlbmNlciBpbnB1dCBldmVudHMuCisgKgorICogVGhlIGRhdGEgd3JpdHRlbiB0byB0aGUgL2Rldi9zZXF1ZW5jZXIgaXMgYSBzdHJlYW0gb2YgZXZlbnRzLiBFdmVudHMKKyAqIGFyZSByZWNvcmRzIG9mIDQgb3IgOCBieXRlcy4gVGhlIGZpcnN0IGJ5dGUgZGVmaW5lcyB0aGUgc2l6ZS4gCisgKiBBbnkgbnVtYmVyIG9mIGV2ZW50cyBjYW4gYmUgd3JpdHRlbiB3aXRoIGEgd3JpdGUgY2FsbC4gVGhlcmUKKyAqIGlzIGEgc2V0IG9mIG1hY3JvcyBmb3Igc2VuZGluZyB0aGVzZSBldmVudHMuIFVzZSB0aGVzZSBtYWNyb3MgaWYgeW91CisgKiB3YW50IHRvIG1heGltaXplIHBvcnRhYmlsaXR5IG9mIHlvdXIgcHJvZ3JhbS4KKyAqCisgKiBFdmVudHMgU0VRX1dBSVQsIFNFUV9NSURJUFVUQyBhbmQgU0VRX0VDSE8uIEFyZSBhbHNvIGlucHV0IGV2ZW50cy4KKyAqIChBbGwgaW5wdXQgZXZlbnRzIGFyZSBjdXJyZW50bHkgNCBieXRlcyBsb25nLiBCZSBwcmVwYXJlZCB0byBzdXBwb3J0CisgKiA4IGJ5dGUgZXZlbnRzIGFsc28uIElmIHlvdSByZWNlaXZlIGFueSBldmVudCBoYXZpbmcgZmlyc3QgYnl0ZSA+PSAxMjgsCisgKiBpdCdzIGEgOCBieXRlIGV2ZW50LgorICoKKyAqIFRoZSBldmVudHMgYXJlIGRvY3VtZW50ZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCisgKgorICogTm9ybWFsIGV2ZW50cyAoNCBieXRlcykKKyAqIFRoZXJlIGlzIGFsc28gYSA4IGJ5dGUgdmVyc2lvbiBvZiBtb3N0IG9mIHRoZSA0IGJ5dGUgZXZlbnRzLiBUaGUKKyAqIDggYnl0ZSBvbmUgaXMgcmVjb21tZW5kZWQuCisgKgorICogTk9URSEgQWxsIDQgYnl0ZSBldmVudHMgYXJlIG5vdyBvYnNvbGV0ZS4gQXBwbGljYXRpb25zIHNob3VsZCBub3Qgd3JpdGUKKyAqICAgICAgIHRoZW0uIEhvd2V2ZXIgNCBieXRlIGV2ZW50cyBhcmUgc3RpbGwgdXNlZCBhcyBpbnB1dHMgZnJvbQorICogICAgICAgL2Rldi9zZXF1ZW5jZXIgKC9kZXYvbXVzaWMgdXNlcyBvbmx5IDggYnl0ZSBvbmVzKS4KKyAqLworI2RlZmluZSBTRVFfTk9URU9GRgkJMAorI2RlZmluZSBTRVFfRk1OT1RFT0ZGCQlTRVFfTk9URU9GRgkvKiBKdXN0IG9sZCBuYW1lICovCisjZGVmaW5lIFNFUV9OT1RFT04JCTEKKyNkZWZpbmUJU0VRX0ZNTk9URU9OCQlTRVFfTk9URU9OCisjZGVmaW5lIFNFUV9XQUlUCQlUTVJfV0FJVF9BQlMKKyNkZWZpbmUgU0VRX1BHTUNIQU5HRQkJMworI2RlZmluZSBTRVFfRk1QR01DSEFOR0UJCVNFUV9QR01DSEFOR0UKKyNkZWZpbmUgU0VRX1NZTkNUSU1FUgkJVE1SX1NUQVJUCisjZGVmaW5lIFNFUV9NSURJUFVUQwkJNQorI2RlZmluZSBTRVFfRFJVTU9OCQk2CQkvKioqIE9CU09MRVRFICoqKi8KKyNkZWZpbmUgU0VRX0RSVU1PRkYJCTcJCS8qKiogT0JTT0xFVEUgKioqLworI2RlZmluZSBTRVFfRUNITwkJVE1SX0VDSE8JLyogRm9yIHN5bmNoaW5nIHByb2dyYW1zIHdpdGggb3V0cHV0ICovCisjZGVmaW5lIFNFUV9BRlRFUlRPVUNICQk5CisjZGVmaW5lIFNFUV9DT05UUk9MTEVSCQkxMAorI2RlZmluZSBTRVFfQkFMQU5DRQkJMTEKKyNkZWZpbmUgU0VRX1ZPTE1PREUgICAgICAgICAgICAgMTIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTWlkaSBjb250cm9sbGVyIG51bWJlcnMJICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ29udHJvbGxlcnMgMCB0byAzMSAoMHgwMCB0byAweDFmKSBhbmQKKyAqIDMyIHRvIDYzICgweDIwIHRvIDB4M2YpIGFyZSBjb250aW51b3VzCisgKiBjb250cm9sbGVycy4KKyAqIEluIHRoZSBNSURJIDEuMCB0aGVzZSBjb250cm9sbGVycyBhcmUgc2VudCB1c2luZworICogdHdvIG1lc3NhZ2VzLiBDb250cm9sbGVyIG51bWJlcnMgMCB0byAzMSBhcmUgdXNlZAorICogdG8gc2VuZCB0aGUgTVNCIGFuZCB0aGUgY29udHJvbGxlciBudW1iZXJzIDMyIHRvIDYzCisgKiBhcmUgZm9yIHRoZSBMU0IuIE5vdGUgdGhhdCBqdXN0IDcgYml0cyBhcmUgdXNlZCBpbiBNSURJIGJ5dGVzLgorICovCisKKyNkZWZpbmUJICAgQ1RMX0JBTktfU0VMRUNUCQkweDAwCisjZGVmaW5lCSAgIENUTF9NT0RXSEVFTAkJCTB4MDEKKyNkZWZpbmUgICAgQ1RMX0JSRUFUSAkJCTB4MDIKKy8qCQl1bmRlZmluZWQJCTB4MDMgKi8KKyNkZWZpbmUgICAgQ1RMX0ZPT1QJCQkweDA0CisjZGVmaW5lICAgIENUTF9QT1JUQU1FTlRPX1RJTUUJCTB4MDUKKyNkZWZpbmUgICAgQ1RMX0RBVEFfRU5UUlkJCTB4MDYKKyNkZWZpbmUgICAgQ1RMX01BSU5fVk9MVU1FCQkweDA3CisjZGVmaW5lICAgIENUTF9CQUxBTkNFCQkJMHgwOAorLyoJCXVuZGVmaW5lZAkJMHgwOSAqLworI2RlZmluZSAgICBDVExfUEFOCQkJMHgwYQorI2RlZmluZSAgICBDVExfRVhQUkVTU0lPTgkJMHgwYgorLyoJCXVuZGVmaW5lZAkJMHgwYyAqLworLyoJCXVuZGVmaW5lZAkJMHgwZCAqLworLyoJCXVuZGVmaW5lZAkJMHgwZSAqLworLyoJCXVuZGVmaW5lZAkJMHgwZiAqLworI2RlZmluZSAgICBDVExfR0VORVJBTF9QVVJQT1NFMQkJMHgxMAorI2RlZmluZSAgICBDVExfR0VORVJBTF9QVVJQT1NFMgkJMHgxMQorI2RlZmluZSAgICBDVExfR0VORVJBTF9QVVJQT1NFMwkJMHgxMgorI2RlZmluZSAgICBDVExfR0VORVJBTF9QVVJQT1NFNAkJMHgxMworLyoJCXVuZGVmaW5lZAkJMHgxNCAtIDB4MWYgKi8KKworLyoJCXVuZGVmaW5lZAkJMHgyMCAqLworLyogVGhlIGNvbnRyb2xsZXIgbnVtYmVycyAweDIxIHRvIDB4M2YgYXJlIHJlc2VydmVkIGZvciB0aGUgKi8KKy8qIGxlYXN0IHNpZ25pZmljYW50IGJ5dGVzIG9mIHRoZSBjb250cm9sbGVycyAweDAwIHRvIDB4MWYuICovCisvKiBUaGVzZSBjb250cm9sbGVycyBhcmUgbm90IHJlY29nbmlzZWQgYnkgdGhlIGRyaXZlci4gKi8KKworLyogQ29udHJvbGxlcnMgNjQgdG8gNjkgKDB4NDAgdG8gMHg0NSkgYXJlIG9uL29mZiBzd2l0Y2hlcy4gKi8KKy8qIDA9T0ZGIGFuZCAxMjc9T04gKGludGVybWVkaWF0ZSB2YWx1ZXMgYXJlIHBvc3NpYmxlKSAqLworI2RlZmluZSAgICBDVExfREFNUEVSX1BFREFMCQkweDQwCisjZGVmaW5lICAgIENUTF9TVVNUQUlOCQkJMHg0MAkvKiBBbGlhcyAqLworI2RlZmluZSAgICBDVExfSE9MRAkJCTB4NDAJLyogQWxpYXMgKi8KKyNkZWZpbmUgICAgQ1RMX1BPUlRBTUVOVE8JCTB4NDEKKyNkZWZpbmUgICAgQ1RMX1NPU1RFTlVUTwkJMHg0MgorI2RlZmluZSAgICBDVExfU09GVF9QRURBTAkJMHg0MworLyoJCXVuZGVmaW5lZAkJMHg0NCAqLworI2RlZmluZSAgICBDVExfSE9MRDIJCQkweDQ1CisvKgkJdW5kZWZpbmVkCQkweDQ2IC0gMHg0ZiAqLworCisjZGVmaW5lICAgIENUTF9HRU5FUkFMX1BVUlBPU0U1CQkweDUwCisjZGVmaW5lICAgIENUTF9HRU5FUkFMX1BVUlBPU0U2CQkweDUxCisjZGVmaW5lICAgIENUTF9HRU5FUkFMX1BVUlBPU0U3CQkweDUyCisjZGVmaW5lICAgIENUTF9HRU5FUkFMX1BVUlBPU0U4CQkweDUzCisvKgkJdW5kZWZpbmVkCQkweDU0IC0gMHg1YSAqLworI2RlZmluZSAgICBDVExfRVhUX0VGRl9ERVBUSAkJMHg1YgorI2RlZmluZSAgICBDVExfVFJFTU9MT19ERVBUSAkJMHg1YworI2RlZmluZSAgICBDVExfQ0hPUlVTX0RFUFRICQkweDVkCisjZGVmaW5lICAgIENUTF9ERVRVTkVfREVQVEgJCTB4NWUKKyNkZWZpbmUgICAgQ1RMX0NFTEVTVEVfREVQVEgJCTB4NWUJLyogQWxpYXMgZm9yIHRoZSBhYm92ZSBvbmUgKi8KKyNkZWZpbmUgICAgQ1RMX1BIQVNFUl9ERVBUSAkJMHg1ZgorI2RlZmluZSAgICBDVExfREFUQV9JTkNSRU1FTlQJCTB4NjAKKyNkZWZpbmUgICAgQ1RMX0RBVEFfREVDUkVNRU5UCQkweDYxCisjZGVmaW5lICAgIENUTF9OT05SRUdfUEFSTV9OVU1fTFNCCTB4NjIKKyNkZWZpbmUgICAgQ1RMX05PTlJFR19QQVJNX05VTV9NU0IJMHg2MworI2RlZmluZSAgICBDVExfUkVHSVNUX1BBUk1fTlVNX0xTQgkweDY0CisjZGVmaW5lICAgIENUTF9SRUdJU1RfUEFSTV9OVU1fTVNCCTB4NjUKKy8qCQl1bmRlZmluZWQJCTB4NjYgLSAweDc4ICovCisvKgkJcmVzZXJ2ZWQJCTB4NzkgLSAweDdmICovCisKKy8qIFBzZXVkbyBjb250cm9sbGVycyAobm90IG1pZGkgY29tcGF0aWJsZSkgKi8KKyNkZWZpbmUgICAgQ1RSTF9QSVRDSF9CRU5ERVIJCTI1NQorI2RlZmluZSAgICBDVFJMX1BJVENIX0JFTkRFUl9SQU5HRQkyNTQKKyNkZWZpbmUgICAgQ1RSTF9FWFBSRVNTSU9OCQkyNTMJLyogT2Jzb2xldGUgKi8KKyNkZWZpbmUgICAgQ1RSTF9NQUlOX1ZPTFVNRQkJMjUyCS8qIE9ic29sZXRlICovCisKKy8qCisgKiBWb2x1bWUgbW9kZSBkZWZpbmVzIGhvdyB2b2x1bWVzIGFyZSB1c2VkCisgKi8KKworI2RlZmluZSBWT0xfTUVUSE9EX0FEQUdJTwkxCisjZGVmaW5lIFZPTF9NRVRIT0RfTElORUFSCTIKKworLyoKKyAqIE5vdGUhIFNFUV9XQUlULCBTRVFfTUlESVBVVEMgYW5kIFNFUV9FQ0hPIGFyZSB1c2VkIGFsc28gYXMKKyAqCSBpbnB1dCBldmVudHMuCisgKi8KKworLyoKKyAqIEV2ZW50IGNvZGVzIDB4ZjAgdG8gMHhmYyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHRlbnNpb25zLgorICovCisKKyNkZWZpbmUgU0VRX0ZVTExTSVpFCQkweGZkCS8qIExvbmcgZXZlbnRzICovCisvKgorICogU0VRX0ZVTExTSVpFIGV2ZW50cyBhcmUgdXNlZCBmb3IgbG9hZGluZyBwYXRjaGVzL3NhbXBsZXMgdG8gdGhlCisgKiBzeW50aGVzaXplciBkZXZpY2VzLiBUaGVzZSBldmVudHMgYXJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgZHJpdmVyCisgKiBvZiB0aGUgYXNzb2NpYXRlZCBzeW50aGVzaXplciBkZXZpY2UuIFRoZXJlIGlzIG5vIGxpbWl0IHRvIHRoZSBzaXplCisgKiBvZiB0aGUgZXh0ZW5kZWQgZXZlbnRzLiBUaGVzZSBldmVudHMgYXJlIG5vdCBxdWV1ZWQgYnV0IGV4ZWN1dGVkCisgKiBpbW1lZGlhdGVseSB3aGVuIHRoZSB3cml0ZSgpIGlzIGNhbGxlZCAoZXhlY3V0aW9uIGNhbiB0YWtlIHNldmVyYWwKKyAqIHNlY29uZHMgb2YgdGltZSkuIAorICoKKyAqIFdoZW4gYSBTRVFfRlVMTFNJWkUgbWVzc2FnZSBpcyB3cml0dGVuIHRvIHRoZSBkZXZpY2UsIGl0IG11c3QKKyAqIGJlIHdyaXR0ZW4gdXNpbmcgZXhhY3RseSBvbmUgd3JpdGUoKSBjYWxsLiBPdGhlciBldmVudHMgY2Fubm90CisgKiBiZSBtaXhlZCB0byB0aGUgc2FtZSB3cml0ZS4KKyAqCQorICogRm9yIEZNIHN5bnRocyAoWU0zODEyL09QTDMpIHVzZSBzdHJ1Y3Qgc2JpX2luc3RydW1lbnQgYW5kIHdyaXRlIGl0IHRvIHRoZSAKKyAqIC9kZXYvc2VxdWVuY2VyLiBEb24ndCB3cml0ZSBvdGhlciBkYXRhIHRvZ2V0aGVyIHdpdGggdGhlIGluc3RydW1lbnQgc3RydWN0dXJlCisgKiBTZXQgdGhlIGtleSBmaWVsZCBvZiB0aGUgc3RydWN0dXJlIHRvIEZNX1BBVENILiBUaGUgZGV2aWNlIGZpZWxkIGlzIHVzZWQgdG8KKyAqIHJvdXRlIHRoZSBwYXRjaCB0byB0aGUgY29ycmVzcG9uZGluZyBkZXZpY2UuCisgKgorICogRm9yIHdhdmUgdGFibGUgdXNlIHN0cnVjdCBwYXRjaF9pbmZvLiBJbml0aWFsaXplIHRoZSBrZXkgZmllbGQKKyAqIHRvIFdBVkVfUEFUQ0guCisgKi8KKyNkZWZpbmUgU0VRX1BSSVZBVEUJCTB4ZmUJLyogTG93IGxldmVsIEhXIGRlcGVuZGVudCBldmVudHMgKDggYnl0ZXMpICovCisjZGVmaW5lIFNFUV9FWFRFTkRFRAkJMHhmZgkvKiBFeHRlbmRlZCBldmVudHMgKDggYnl0ZXMpIE9CU09MRVRFICovCisKKy8qCisgKiBSZWNvcmQgZm9yIEZNIHBhdGNoZXMKKyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgc2JpX2luc3RyX2RhdGFbMzJdOworCitzdHJ1Y3Qgc2JpX2luc3RydW1lbnQKK3sKKyAgdW5zaWduZWQgc2hvcnQga2V5OwkJLyogRk1fUEFUQ0ggb3IgT1BMM19QQVRDSCAqLworI2RlZmluZSBGTV9QQVRDSAlfUEFUQ0hLRVkoMHgwMSkKKyNkZWZpbmUgT1BMM19QQVRDSAlfUEFUQ0hLRVkoMHgwMykKKyAgc2hvcnQgZGV2aWNlOwkJCS8qICBTeW50aCMgKDAtNCkgICAgKi8KKyAgaW50IGNoYW5uZWw7CQkJLyogIFByb2dyYW0jIHRvIGJlIGluaXRpYWxpemVkICAqLworICBzYmlfaW5zdHJfZGF0YSBvcGVyYXRvcnM7CS8qICBSZWdpc3RlciBzZXR0aW5ncyBmb3Igb3BlcmF0b3IgY2VsbHMgKC5TQkkgZm9ybWF0KSAgKi8KK307CisKK3N0cnVjdCBzeW50aF9pbmZvCit7CQkJCS8qIFJlYWQgb25seSAqLworICBjaGFyIG5hbWVbMzBdOworICBpbnQgZGV2aWNlOwkJCS8qIDAtTi4gSU5JVElBTElaRSBCRUZPUkUgQ0FMTElORyAqLworICBpbnQgc3ludGhfdHlwZTsKKyNkZWZpbmUgU1lOVEhfVFlQRV9GTQkJCTAKKyNkZWZpbmUgU1lOVEhfVFlQRV9TQU1QTEUJCTEKKyNkZWZpbmUgU1lOVEhfVFlQRV9NSURJCQkJMgkvKiBNaWRpIGludGVyZmFjZSAqLworCisgIGludCBzeW50aF9zdWJ0eXBlOworI2RlZmluZSBGTV9UWVBFX0FETElCCQkJMHgwMAorI2RlZmluZSBGTV9UWVBFX09QTDMJCQkweDAxCisjZGVmaW5lIE1JRElfVFlQRV9NUFU0MDEJCTB4NDAxCisKKyNkZWZpbmUgU0FNUExFX1RZUEVfQkFTSUMJCTB4MTAKKyNkZWZpbmUgU0FNUExFX1RZUEVfR1VTCQkJU0FNUExFX1RZUEVfQkFTSUMKKyNkZWZpbmUgU0FNUExFX1RZUEVfV0FWRUZST05UICAgCTB4MTEKKworICBpbnQgcGVyY19tb2RlOwkJLyogTm8gbG9uZ2VyIHN1cHBvcnRlZCAqLworICBpbnQgbnJfdm9pY2VzOworICBpbnQgbnJfZHJ1bXM7CQkJLyogT2Jzb2xldGUgZmllbGQgKi8KKyAgaW50IGluc3RyX2Jhbmtfc2l6ZTsKKyAgdW5zaWduZWQgaW50IGNhcGFiaWxpdGllczsKKyNkZWZpbmUgU1lOVEhfQ0FQX1BFUkNNT0RFCTB4MDAwMDAwMDEJLyogTm8gbG9uZ2VyIHVzZWQgKi8KKyNkZWZpbmUgU1lOVEhfQ0FQX09QTDMJCTB4MDAwMDAwMDIJLyogU2V0IGlmIE9QTDMgc3VwcG9ydGVkICovCisjZGVmaW5lIFNZTlRIX0NBUF9JTlBVVAkJMHgwMDAwMDAwNAkvKiBJbnB1dCAoTUlESSkgZGV2aWNlICovCisgIGludCBkdW1taWVzWzE5XTsJCS8qIFJlc2VydmUgc3BhY2UgKi8KK307CisKK3N0cnVjdCBzb3VuZF90aW1lcl9pbmZvCit7CisgIGNoYXIgbmFtZVszMl07CisgIGludCBjYXBzOworfTsKKworc3RydWN0IG1pZGlfaW5mbwkJLyogT0JTT0xFVEUgKi8KK3sKKyAgY2hhciBuYW1lWzMwXTsKKyAgaW50IGRldmljZTsJCQkvKiAwLU4uIElOSVRJQUxJWkUgQkVGT1JFIENBTExJTkcgKi8KKyAgdW5zaWduZWQgaW50IGNhcGFiaWxpdGllczsJLyogVG8gYmUgZGVmaW5lZCBsYXRlciAqLworICBpbnQgZGV2X3R5cGU7CisgIGludCBkdW1taWVzWzE4XTsJCS8qIFJlc2VydmUgc3BhY2UgKi8KK307CisKKy8qCisgKiBMZXZlbCAyIGV2ZW50IHR5cGVzIGZvciAvZGV2L3NlcXVlbmNlcgorICovCisKKy8qCisgKiBUaGUgNCBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgYnl0ZSAwIHNwZWNpZnkgdGhlIGNsYXNzIG9mCisgKiB0aGUgZXZlbnQ6IAorICoKKyAqCTB4OFggPSBzeXN0ZW0gbGV2ZWwgZXZlbnRzLAorICoJMHg5WCA9IGRldmljZS9wb3J0IHNwZWNpZmljIGV2ZW50cywgZXZlbnRbMV0gPSBkZXZpY2UvcG9ydCwKKyAqCQlUaGUgbGFzdCA0IGJpdHMgZ2l2ZSB0aGUgc3VidHlwZToKKyAqCQkJMHgwMgk9IENoYW5uZWwgZXZlbnQgKGV2ZW50WzNdID0gY2huKS4KKyAqCQkJMHgwMQk9IG5vdGUgZXZlbnQgKGV2ZW50WzRdID0gbm90ZSkuCisgKgkJCSgweDAxIGlzIG5vdCB1c2VkIGFsb25lIGJ1dCBhbHdheXMgd2l0aCBiaXQgMHgwMikuCisgKgkgICAgICAgZXZlbnRbMl0gPSBNSURJIG1lc3NhZ2UgY29kZSAoMHg4MD1ub3RlIG9mZiBldGMuKQorICoKKyAqLworCisjZGVmaW5lIEVWX1NFUV9MT0NBTAkJMHg4MAorI2RlZmluZSBFVl9USU1JTkcJCTB4ODEKKyNkZWZpbmUgRVZfQ0hOX0NPTU1PTgkJMHg5MgorI2RlZmluZSBFVl9DSE5fVk9JQ0UJCTB4OTMKKyNkZWZpbmUgRVZfU1lTRVgJCTB4OTQKKyNkZWZpbmUgRVZfU1lTVEVNCQkweDk1CS8qIE1JREkgc3lzdGVtIGFuZCByZWFsIHRpbWUgbWVzc2FnZXMgKGlucHV0IG9ubHkpICovCisvKgorICogRXZlbnQgdHlwZXMgMjAwIHRvIDIyMCBhcmUgcmVzZXJ2ZWQgZm9yIGFwcGxpY2F0aW9uIHVzZS4KKyAqIFRoZXNlIG51bWJlcnMgd2lsbCBub3QgYmUgdXNlZCBieSB0aGUgZHJpdmVyLgorICovCisKKy8qCisgKiBFdmVudHMgZm9yIGV2ZW50IHR5cGUgRVZfQ0hOX1ZPSUNFCisgKi8KKworI2RlZmluZSBNSURJX05PVEVPRkYJCTB4ODAKKyNkZWZpbmUgTUlESV9OT1RFT04JCTB4OTAKKyNkZWZpbmUgTUlESV9LRVlfUFJFU1NVUkUJMHhBMAorCisvKgorICogRXZlbnRzIGZvciBldmVudCB0eXBlIEVWX0NITl9DT01NT04KKyAqLworCisjZGVmaW5lIE1JRElfQ1RMX0NIQU5HRQkJMHhCMAorI2RlZmluZSBNSURJX1BHTV9DSEFOR0UJCTB4QzAKKyNkZWZpbmUgTUlESV9DSE5fUFJFU1NVUkUJMHhEMAorI2RlZmluZSBNSURJX1BJVENIX0JFTkQJCTB4RTAKKworI2RlZmluZSBNSURJX1NZU1RFTV9QUkVGSVgJMHhGMAorCisvKgorICogVGltZXIgZXZlbnQgdHlwZXMKKyAqLworI2RlZmluZSBUTVJfV0FJVF9SRUwJCTEJLyogVGltZSByZWxhdGl2ZSB0byB0aGUgcHJldiB0aW1lICovCisjZGVmaW5lIFRNUl9XQUlUX0FCUwkJMgkvKiBBYnNvbHV0ZSB0aW1lIHNpbmNlIFRNUl9TVEFSVCAqLworI2RlZmluZSBUTVJfU1RPUAkJMworI2RlZmluZSBUTVJfU1RBUlQJCTQKKyNkZWZpbmUgVE1SX0NPTlRJTlVFCQk1CisjZGVmaW5lIFRNUl9URU1QTwkJNgorI2RlZmluZSBUTVJfRUNITwkJOAorI2RlZmluZSBUTVJfQ0xPQ0sJCTkJLyogTUlESSBjbG9jayAqLworI2RlZmluZSBUTVJfU1BQCQkJMTAJLyogU29uZyBwb3NpdGlvbiBwb2ludGVyICovCisjZGVmaW5lIFRNUl9USU1FU0lHCQkxMQkvKiBUaW1lIHNpZ25hdHVyZSAqLworCisvKgorICoJTG9jYWwgZXZlbnQgdHlwZXMKKyAqLworI2RlZmluZSBMT0NMX1NUQVJUQVVESU8JCTEKKyNkZWZpbmUgTE9DTF9TVEFSVEFVRElPMgkyCisjZGVmaW5lIExPQ0xfU1RBUlRBVURJTzMJMworI2RlZmluZSBMT0NMX1NUQVJUQVVESU80CTQKKworI2lmICghZGVmaW5lZChfX0tFUk5FTF9fKSAmJiAhZGVmaW5lZChLRVJORUwpICYmICFkZWZpbmVkKElOS0VSTkVMKSAmJiAhZGVmaW5lZChfS0VSTkVMKSkgfHwgZGVmaW5lZChVU0VfU0VRX01BQ1JPUykKKy8qCisgKiBTb21lIGNvbnZlbmllbmNlIG1hY3JvcyB0byBzaW1wbGlmeSBwcm9ncmFtbWluZyBvZiB0aGUKKyAqIC9kZXYvc2VxdWVuY2VyIGludGVyZmFjZQorICoKKyAqIFRoZXNlIG1hY3JvcyBkZWZpbmUgdGhlIEFQSSB3aGljaCBzaG91bGQgYmUgdXNlZCB3aGVuIHBvc3NpYmxlLgorICovCisjZGVmaW5lIFNFUV9ERUNMQVJFQlVGKCkJCVNFUV9VU0VfRVhUQlVGKCkKKwordm9pZCBzZXFidWZfZHVtcCAodm9pZCk7CS8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBwcm92aWRlZCBieSBwcm9ncmFtcyAqLworCitFWFRFUk5DIGludCBPU1NfaW5pdCAoaW50IHNlcWZkLCBpbnQgYnVmbGVuKTsKK0VYVEVSTkMgdm9pZCBPU1Nfc2VxYnVmX2R1bXAgKGludCBmZCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKK0VYVEVSTkMgdm9pZCBPU1Nfc2VxX2FkdmJ1ZiAoaW50IGxlbiwgaW50IGZkLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBidWZsZW4pOworRVhURVJOQyB2b2lkIE9TU19zZXFfbmVlZGJ1ZiAoaW50IGxlbiwgaW50IGZkLCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkgICAgICBpbnQgYnVmbGVuKTsKK0VYVEVSTkMgdm9pZCBPU1NfcGF0Y2hfY2FjaGluZyAoaW50IGRldiwgaW50IGNobiwgaW50IHBhdGNoLCBpbnQgZmQsCisJCQkJdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKK0VYVEVSTkMgdm9pZCBPU1NfZHJ1bV9jYWNoaW5nIChpbnQgZGV2LCBpbnQgY2huLCBpbnQgcGF0Y2gsIGludCBmZCwKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpidWYsIGludCBidWZsZW4pOworRVhURVJOQyB2b2lkIE9TU193cml0ZV9wYXRjaCAoaW50IGZkLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pOworRVhURVJOQyBpbnQgT1NTX3dyaXRlX3BhdGNoMiAoaW50IGZkLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pOworCisjZGVmaW5lIFNFUV9QTV9ERUZJTkVTIGludCBfX2Zvb19iYXJfX18KKyNpZmRlZiBPU1NMSUIKKyMgIGRlZmluZSBTRVFfVVNFX0VYVEJVRigpIFwKKwkJRVhURVJOQyB1bnNpZ25lZCBjaGFyICpfc2VxYnVmOyBcCisJCUVYVEVSTkMgaW50IF9zZXFidWZsZW47RVhURVJOQyBpbnQgX3NlcWJ1ZnB0cgorIyAgZGVmaW5lIFNFUV9ERUZJTkVCVUYobGVuKSBTRVFfVVNFX0VYVEJVRigpO3N0YXRpYyBpbnQgX3JlcXVlc3RlZF9zZXFidWZsZW49bGVuCisjICBkZWZpbmUgX1NFUV9BRFZCVUYobGVuKSBPU1Nfc2VxX2FkdmJ1ZihsZW4sIHNlcWZkLCBfc2VxYnVmLCBfc2VxYnVmbGVuKQorIyAgZGVmaW5lIF9TRVFfTkVFREJVRihsZW4pIE9TU19zZXFfbmVlZGJ1ZihsZW4sIHNlcWZkLCBfc2VxYnVmLCBfc2VxYnVmbGVuKQorIyAgZGVmaW5lIFNFUV9EVU1QQlVGKCkgT1NTX3NlcWJ1Zl9kdW1wKHNlcWZkLCBfc2VxYnVmLCBfc2VxYnVmbGVuKQorCisjICBkZWZpbmUgU0VRX0xPQURfR01JTlNUUihkZXYsIGluc3RyKSBcCisJCU9TU19wYXRjaF9jYWNoaW5nKGRldiwgLTEsIGluc3RyLCBzZXFmZCwgX3NlcWJ1ZiwgX3NlcWJ1ZmxlbikKKyMgIGRlZmluZSBTRVFfTE9BRF9HTURSVU0oZGV2LCBkcnVtKSBcCisJCU9TU19kcnVtX2NhY2hpbmcoZGV2LCAtMSwgZHJ1bSwgc2VxZmQsIF9zZXFidWYsIF9zZXFidWZsZW4pCisjZWxzZSAvKiAhT1NTTElCICovCisKKyMgIGRlZmluZSBTRVFfTE9BRF9HTUlOU1RSKGRldiwgaW5zdHIpCisjICBkZWZpbmUgU0VRX0xPQURfR01EUlVNKGRldiwgZHJ1bSkKKworIyAgZGVmaW5lIFNFUV9VU0VfRVhUQlVGKCkgXAorCQlFWFRFUk5DIHVuc2lnbmVkIGNoYXIgX3NlcWJ1ZltdOyBcCisJCUVYVEVSTkMgaW50IF9zZXFidWZsZW47RVhURVJOQyBpbnQgX3NlcWJ1ZnB0cgorCisjaWZuZGVmIFVTRV9TSU1QTEVfTUFDUk9TCisvKiBTYW1wbGUgc2VxYnVmX2R1bXAoKSBpbXBsZW1lbnRhdGlvbjoKKyAqCisgKglTRVFfREVGSU5FQlVGICgyMDQ4KTsJLS0gRGVmaW5lcyBhIGJ1ZmZlciBmb3IgMjA0OCBieXRlcworICoKKyAqCWludCBzZXFmZDsJCS0tIFRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIC9kZXYvc2VxdWVuY2VyLgorICoKKyAqCXZvaWQKKyAqCXNlcWJ1Zl9kdW1wICgpCisgKgl7CisgKgkgIGlmIChfc2VxYnVmcHRyKQorICoJICAgIGlmICh3cml0ZSAoc2VxZmQsIF9zZXFidWYsIF9zZXFidWZwdHIpID09IC0xKQorICoJICAgICAgeworICoJCXBlcnJvciAoIndyaXRlIC9kZXYvc2VxdWVuY2VyIik7CisgKgkJZXhpdCAoLTEpOworICoJICAgICAgfQorICoJICBfc2VxYnVmcHRyID0gMDsKKyAqCX0KKyAqLworCisjZGVmaW5lIFNFUV9ERUZJTkVCVUYobGVuKSBcCisJdW5zaWduZWQgY2hhciBfc2VxYnVmW2xlbl07IGludCBfc2VxYnVmbGVuID0gbGVuO2ludCBfc2VxYnVmcHRyID0gMAorI2RlZmluZSBfU0VRX05FRURCVUYobGVuKSBcCisJaWYgKChfc2VxYnVmcHRyKyhsZW4pKSA+IF9zZXFidWZsZW4pIHNlcWJ1Zl9kdW1wKCkKKyNkZWZpbmUgX1NFUV9BRFZCVUYobGVuKSBfc2VxYnVmcHRyICs9IGxlbgorI2RlZmluZSBTRVFfRFVNUEJVRiBzZXFidWZfZHVtcAorI2Vsc2UKKy8qCisgKiBUaGlzIHZhcmlhdGlvbiBvZiB0aGUgc2VxdWVuY2VyIG1hY3JvcyBpcyB1c2VkIGp1c3QgdG8gZm9ybWF0IG9uZSBldmVudAorICogdXNpbmcgZml4ZWQgYnVmZmVyLgorICogCisgKiBUaGUgcHJvZ3JhbSB1c2luZyB0aGUgbWFjcm8gbGlicmFyeSBtdXN0IGRlZmluZSB0aGUgZm9sbG93aW5nIG1hY3JvcyBiZWZvcmUKKyAqIHVzaW5nIHRoaXMgbGlicmFyeS4KKyAqCisgKiAjZGVmaW5lIF9zZXFidWYgCQkgbmFtZSBvZiB0aGUgYnVmZmVyICh1bnNpZ25lZCBjaGFyW10pIAorICogI2RlZmluZSBfU0VRX0FEVkJVRihsZW4pCSBJZiB0aGUgYXBwbGljIG5lZWRzIHRvIGtub3cgdGhlIGV4YWN0CisgKgkJCQkgc2l6ZSBvZiB0aGUgZXZlbnQsIHRoaXMgbWFjcm8gY2FuIGJlIHVzZWQuCisgKgkJCQkgT3RoZXJ3aXNlIHRoaXMgbXVzdCBiZSBkZWZpbmVkIGFzIGVtcHR5LgorICogI2RlZmluZSBfc2VxYnVmcHRyCQkgRGVmaW5lIHRoZSBuYW1lIG9mIGluZGV4IHZhcmlhYmxlIG9yIDAgaWYKKyAqCQkJCSBub3QgcmVxdWlyZWQuIAorICovCisjZGVmaW5lIF9TRVFfTkVFREJVRihsZW4pCS8qIGVtcHR5ICovCisjZW5kaWYKKyNlbmRpZiAvKiAhT1NTTElCICovCisKKyNkZWZpbmUgU0VRX1ZPTFVNRV9NT0RFKGRldiwgbW9kZSkgXAorCQkJCXtfU0VRX05FRURCVUYoOCk7XAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cl0gPSBTRVFfRVhURU5ERUQ7XAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisxXSA9IFNFUV9WT0xNT0RFO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHIrMl0gPSAoZGV2KTtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzNdID0gKG1vZGUpO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHIrNF0gPSAwO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHIrNV0gPSAwO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHIrNl0gPSAwO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHIrN10gPSAwO1wKKwkJCQlfU0VRX0FEVkJVRig4KTt9CisKKy8qCisgKiBNaWRpIHZvaWNlIG1lc3NhZ2VzCisgKi8KKworI2RlZmluZSBfQ0hOX1ZPSUNFKGRldiwgZXZlbnQsIGNobiwgbm90ZSwgcGFybSkgXAorCQkJCXtfU0VRX05FRURCVUYoOCk7XAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cl0gPSBFVl9DSE5fVk9JQ0U7XAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisxXSA9IChkZXYpO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHIrMl0gPSAoZXZlbnQpO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHIrM10gPSAoY2huKTtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzRdID0gKG5vdGUpO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHIrNV0gPSAocGFybSk7XAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cis2XSA9ICgwKTtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzddID0gMDtcCisJCQkJX1NFUV9BRFZCVUYoOCk7fQorCisjZGVmaW5lIFNFUV9TVEFSVF9OT1RFKGRldiwgY2huLCBub3RlLCB2b2wpIFwKKwkJCV9DSE5fVk9JQ0UoZGV2LCBNSURJX05PVEVPTiwgY2huLCBub3RlLCB2b2wpCisKKyNkZWZpbmUgU0VRX1NUT1BfTk9URShkZXYsIGNobiwgbm90ZSwgdm9sKSBcCisJCQlfQ0hOX1ZPSUNFKGRldiwgTUlESV9OT1RFT0ZGLCBjaG4sIG5vdGUsIHZvbCkKKworI2RlZmluZSBTRVFfS0VZX1BSRVNTVVJFKGRldiwgY2huLCBub3RlLCBwcmVzc3VyZSkgXAorCQkJX0NITl9WT0lDRShkZXYsIE1JRElfS0VZX1BSRVNTVVJFLCBjaG4sIG5vdGUsIHByZXNzdXJlKQorCisvKgorICogTWlkaSBjaGFubmVsIG1lc3NhZ2VzCisgKi8KKworI2RlZmluZSBfQ0hOX0NPTU1PTihkZXYsIGV2ZW50LCBjaG4sIHAxLCBwMiwgdzE0KSBcCisJCQkJe19TRVFfTkVFREJVRig4KTtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyXSA9IEVWX0NITl9DT01NT047XAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisxXSA9IChkZXYpO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHIrMl0gPSAoZXZlbnQpO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHIrM10gPSAoY2huKTtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzRdID0gKHAxKTtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzVdID0gKHAyKTtcCisJCQkJKihzaG9ydCAqKSZfc2VxYnVmW19zZXFidWZwdHIrNl0gPSAodzE0KTtcCisJCQkJX1NFUV9BRFZCVUYoOCk7fQorLyoKKyAqIFNFUV9TWVNFWCBwZXJtaXRzIHNlbmRpbmcgb2Ygc3lzZXggbWVzc2FnZXMuIChJdCBtYXkgbG9vayB0aGF0IGl0IHBlcm1pdHMKKyAqIHNlbmRpbmcgYW55IE1JREkgYnl0ZXMgYnV0IGl0J3MgYWJzb2x1dGVseSBub3QgcG9zc2libGUuIFRyeWluZyB0byBkbworICogc28gX3dpbGxfIGNhdXNlIHByb2JsZW1zIHdpdGggTVBVNDAxIGludGVsbGlnZW50IG1vZGUpLgorICoKKyAqIFN5c2V4IG1lc3NhZ2VzIGFyZSBzZW50IGluIGJsb2NrcyBvZiAxIHRvIDYgYnl0ZXMuIExvbmdlciBtZXNzYWdlcyBtdXN0IGJlIAorICogc2VudCBieSBjYWxsaW5nIFNFUV9TWVNFWCgpIHNldmVyYWwgdGltZXMgKHRoZXJlIG11c3QgYmUgbm8gb3RoZXIgZXZlbnRzCisgKiBiZXR3ZWVuIHRoZW0pLiBGaXJzdCBzeXNleCBmcmFnbWVudCBtdXN0IGhhdmUgMHhmMCBpbiB0aGUgZmlyc3QgYnl0ZQorICogYW5kIHRoZSBsYXN0IGJ5dGUgKGJ1ZltsZW4tMV0gb2YgdGhlIGxhc3QgZnJhZ21lbnQgbXVzdCBiZSAweGY3LiBObyBieXRlCisgKiBiZXR3ZWVuIHRoZXNlIHN5c2V4IHN0YXJ0IGFuZCBlbmQgbWFya2VycyBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gMHg3Zi4gQWxzbworICogbGVuZ3RocyBvZiBlYWNoIGZyYWdtZW50cyAoZXhjZXB0IHRoZSBsYXN0IG9uZSkgbXVzdCBiZSA2LgorICoKKyAqIEJyZWFraW5nIHRoZSBhYm92ZSBydWxlcyBtYXkgd29yayB3aXRoIHNvbWUgTUlESSBwb3J0cyBidXQgaXMgbGlrZWx5IHRvCisgKiBjYXVzZSBmYXRhbCBwcm9ibGVtcyB3aXRoIHNvbWUgb3RoZXIgZGV2aWNlcyAoc3VjaCBhcyBNUFU0MDEpLgorICovCisjZGVmaW5lIFNFUV9TWVNFWChkZXYsIGJ1ZiwgbGVuKSBcCisJCQkJe2ludCBpaSwgbGw9KGxlbik7IFwKKwkJCQkgdW5zaWduZWQgY2hhciAqYnVmcD1idWY7XAorCQkJCSBpZiAobGw+NilsbD02O1wKKwkJCQlfU0VRX05FRURCVUYoOCk7XAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cl0gPSBFVl9TWVNFWDtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzFdID0gKGRldik7XAorCQkJCWZvcihpaT0wO2lpPGxsO2lpKyspXAorCQkJCSAgIF9zZXFidWZbX3NlcWJ1ZnB0citpaSsyXSA9IGJ1ZnBbaWldO1wKKwkJCQlmb3IoaWk9bGw7aWk8NjtpaSsrKVwKKwkJCQkgICBfc2VxYnVmW19zZXFidWZwdHIraWkrMl0gPSAweGZmO1wKKwkJCQlfU0VRX0FEVkJVRig4KTt9CisKKyNkZWZpbmUgU0VRX0NITl9QUkVTU1VSRShkZXYsIGNobiwgcHJlc3N1cmUpIFwKKwkJX0NITl9DT01NT04oZGV2LCBNSURJX0NITl9QUkVTU1VSRSwgY2huLCBwcmVzc3VyZSwgMCwgMCkKKworI2RlZmluZSBTRVFfU0VUX1BBVENIIFNFUV9QR01fQ0hBTkdFCisjaWZkZWYgT1NTTElCCisjICAgZGVmaW5lIFNFUV9QR01fQ0hBTkdFKGRldiwgY2huLCBwYXRjaCkgXAorCQl7T1NTX3BhdGNoX2NhY2hpbmcoZGV2LCBjaG4sIHBhdGNoLCBzZXFmZCwgX3NlcWJ1ZiwgX3NlcWJ1Zmxlbik7IFwKKwkJIF9DSE5fQ09NTU9OKGRldiwgTUlESV9QR01fQ0hBTkdFLCBjaG4sIHBhdGNoLCAwLCAwKTt9CisjZWxzZQorIyAgIGRlZmluZSBTRVFfUEdNX0NIQU5HRShkZXYsIGNobiwgcGF0Y2gpIFwKKwkJX0NITl9DT01NT04oZGV2LCBNSURJX1BHTV9DSEFOR0UsIGNobiwgcGF0Y2gsIDAsIDApCisjZW5kaWYKKworI2RlZmluZSBTRVFfQ09OVFJPTChkZXYsIGNobiwgY29udHJvbGxlciwgdmFsdWUpIFwKKwkJX0NITl9DT01NT04oZGV2LCBNSURJX0NUTF9DSEFOR0UsIGNobiwgY29udHJvbGxlciwgMCwgdmFsdWUpCisKKyNkZWZpbmUgU0VRX0JFTkRFUihkZXYsIGNobiwgdmFsdWUpIFwKKwkJX0NITl9DT01NT04oZGV2LCBNSURJX1BJVENIX0JFTkQsIGNobiwgMCwgMCwgdmFsdWUpCisKKyNkZWZpbmUgU0VRX1YyX1hfQ09OVFJPTChkZXYsIHZvaWNlLCBjb250cm9sbGVyLCB2YWx1ZSkJXAorCQkJCXtfU0VRX05FRURCVUYoOCk7XAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cl0gPSBTRVFfRVhURU5ERUQ7XAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisxXSA9IFNFUV9DT05UUk9MTEVSO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHIrMl0gPSAoZGV2KTtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzNdID0gKHZvaWNlKTtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzRdID0gKGNvbnRyb2xsZXIpO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHIrNV0gPSAoKHZhbHVlKSYweGZmKTtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzZdID0gKCh2YWx1ZT4+OCkmMHhmZik7XAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cis3XSA9IDA7XAorCQkJCV9TRVFfQURWQlVGKDgpO30KKy8qCisgKiBUaGUgZm9sbG93aW5nIDUgbWFjcm9zIGFyZSBpbmNvcnJlY3RseSBpbXBsZW1lbnRlZCBhbmQgb2Jzb2xldGUuCisgKiBVc2UgU0VRX0JFTkRFUiBhbmQgU0VRX0NPTlRST0wgKHdpdGggcHJvcGVyIGNvbnRyb2xsZXIpIGluc3RlYWQuCisgKi8KKyNkZWZpbmUgU0VRX1BJVENIQkVORChkZXYsIHZvaWNlLCB2YWx1ZSkgXAorCVNFUV9WMl9YX0NPTlRST0woZGV2LCB2b2ljZSwgQ1RSTF9QSVRDSF9CRU5ERVIsIHZhbHVlKQorI2RlZmluZSBTRVFfQkVOREVSX1JBTkdFKGRldiwgdm9pY2UsIHZhbHVlKSBcCisJU0VRX1YyX1hfQ09OVFJPTChkZXYsIHZvaWNlLCBDVFJMX1BJVENIX0JFTkRFUl9SQU5HRSwgdmFsdWUpCisjZGVmaW5lIFNFUV9FWFBSRVNTSU9OKGRldiwgdm9pY2UsIHZhbHVlKSBcCisJU0VRX0NPTlRST0woZGV2LCB2b2ljZSwgQ1RMX0VYUFJFU1NJT04sIHZhbHVlKjEyOCkKKyNkZWZpbmUgU0VRX01BSU5fVk9MVU1FKGRldiwgdm9pY2UsIHZhbHVlKSBcCisJU0VRX0NPTlRST0woZGV2LCB2b2ljZSwgQ1RMX01BSU5fVk9MVU1FLCAodmFsdWUqMTYzODMpLzEwMCkKKyNkZWZpbmUgU0VRX1BBTk5JTkcoZGV2LCB2b2ljZSwgcG9zKSBcCisJU0VRX0NPTlRST0woZGV2LCB2b2ljZSwgQ1RMX1BBTiwgKHBvcysxMjgpIC8gMikKKworLyoKKyAqIFRpbWluZyBhbmQgc3luY3Jvbml6YXRpb24gbWFjcm9zCisgKi8KKworI2RlZmluZSBfVElNRVJfRVZFTlQoZXYsIHBhcm0pCXtfU0VRX05FRURCVUYoOCk7XAorCQkJIAlfc2VxYnVmW19zZXFidWZwdHIrMF0gPSBFVl9USU1JTkc7IFwKKwkJCSAJX3NlcWJ1Zltfc2VxYnVmcHRyKzFdID0gKGV2KTsgXAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisyXSA9IDA7XAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0ciszXSA9IDA7XAorCQkJIAkqKHVuc2lnbmVkIGludCAqKSZfc2VxYnVmW19zZXFidWZwdHIrNF0gPSAocGFybSk7IFwKKwkJCQlfU0VRX0FEVkJVRig4KTt9CisKKyNkZWZpbmUgU0VRX1NUQVJUX1RJTUVSKCkJCV9USU1FUl9FVkVOVChUTVJfU1RBUlQsIDApCisjZGVmaW5lIFNFUV9TVE9QX1RJTUVSKCkJCV9USU1FUl9FVkVOVChUTVJfU1RPUCwgMCkKKyNkZWZpbmUgU0VRX0NPTlRJTlVFX1RJTUVSKCkJCV9USU1FUl9FVkVOVChUTVJfQ09OVElOVUUsIDApCisjZGVmaW5lIFNFUV9XQUlUX1RJTUUodGlja3MpCQlfVElNRVJfRVZFTlQoVE1SX1dBSVRfQUJTLCB0aWNrcykKKyNkZWZpbmUgU0VRX0RFTFRBX1RJTUUodGlja3MpCQlfVElNRVJfRVZFTlQoVE1SX1dBSVRfUkVMLCB0aWNrcykKKyNkZWZpbmUgU0VRX0VDSE9fQkFDSyhrZXkpCQlfVElNRVJfRVZFTlQoVE1SX0VDSE8sIGtleSkKKyNkZWZpbmUgU0VRX1NFVF9URU1QTyh2YWx1ZSkJCV9USU1FUl9FVkVOVChUTVJfVEVNUE8sIHZhbHVlKQorI2RlZmluZSBTRVFfU09OR1BPUyhwb3MpCQlfVElNRVJfRVZFTlQoVE1SX1NQUCwgcG9zKQorI2RlZmluZSBTRVFfVElNRV9TSUdOQVRVUkUoc2lnKQkJX1RJTUVSX0VWRU5UKFRNUl9USU1FU0lHLCBzaWcpCisKKy8qCisgKiBMb2NhbCBjb250cm9sIGV2ZW50cworICovCisKKyNkZWZpbmUgX0xPQ0FMX0VWRU5UKGV2LCBwYXJtKQkJe19TRVFfTkVFREJVRig4KTtcCisJCQkJIAlfc2VxYnVmW19zZXFidWZwdHIrMF0gPSBFVl9TRVFfTE9DQUw7IFwKKwkJCQkgCV9zZXFidWZbX3NlcWJ1ZnB0cisxXSA9IChldik7IFwKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzJdID0gMDtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0ciszXSA9IDA7XAorCQkJCSAJKih1bnNpZ25lZCBpbnQgKikmX3NlcWJ1Zltfc2VxYnVmcHRyKzRdID0gKHBhcm0pOyBcCisJCQkJCV9TRVFfQURWQlVGKDgpO30KKworI2RlZmluZSBTRVFfUExBWUFVRElPKGRldm1hc2spCQlfTE9DQUxfRVZFTlQoTE9DTF9TVEFSVEFVRElPLCBkZXZtYXNrKQorI2RlZmluZSBTRVFfUExBWUFVRElPMihkZXZtYXNrKQkJX0xPQ0FMX0VWRU5UKExPQ0xfU1RBUlRBVURJTzIsIGRldm1hc2spCisjZGVmaW5lIFNFUV9QTEFZQVVESU8zKGRldm1hc2spCQlfTE9DQUxfRVZFTlQoTE9DTF9TVEFSVEFVRElPMywgZGV2bWFzaykKKyNkZWZpbmUgU0VRX1BMQVlBVURJTzQoZGV2bWFzaykJCV9MT0NBTF9FVkVOVChMT0NMX1NUQVJUQVVESU80LCBkZXZtYXNrKQorLyoKKyAqIEV2ZW50cyBmb3IgdGhlIGxldmVsIDEgaW50ZXJmYWNlIG9ubHkgCisgKi8KKworI2RlZmluZSBTRVFfTUlESU9VVChkZXZpY2UsIGJ5dGUpCXtfU0VRX05FRURCVUYoNCk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHJdID0gU0VRX01JRElQVVRDO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzFdID0gKGJ5dGUpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzJdID0gKGRldmljZSk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrM10gPSAwO1wKKwkJCQkJX1NFUV9BRFZCVUYoNCk7fQorCisvKgorICogUGF0Y2ggbG9hZGluZy4KKyAqLworI2lmZGVmIE9TU0xJQgorIyAgIGRlZmluZSBTRVFfV1JQQVRDSChwYXRjaHgsIGxlbikgXAorCQlPU1Nfd3JpdGVfcGF0Y2goc2VxZmQsIChjaGFyKikocGF0Y2h4KSwgbGVuKQorIyAgIGRlZmluZSBTRVFfV1JQQVRDSDIocGF0Y2h4LCBsZW4pIFwKKwkJT1NTX3dyaXRlX3BhdGNoMihzZXFmZCwgKGNoYXIqKShwYXRjaHgpLCBsZW4pCisjZWxzZQorIyAgIGRlZmluZSBTRVFfV1JQQVRDSChwYXRjaHgsIGxlbikgXAorCQl7aWYgKF9zZXFidWZwdHIpIFNFUV9EVU1QQlVGKCk7XAorCQkgaWYgKHdyaXRlKHNlcWZkLCAoY2hhciopKHBhdGNoeCksIGxlbik9PS0xKSBcCisJCSAgICBwZXJyb3IoIldyaXRlIHBhdGNoOiAvZGV2L3NlcXVlbmNlciIpO30KKyMgICBkZWZpbmUgU0VRX1dSUEFUQ0gyKHBhdGNoeCwgbGVuKSBcCisJCShTRVFfRFVNUEJVRigpLCB3cml0ZShzZXFmZCwgKGNoYXIqKShwYXRjaHgpLCBsZW4pKQorI2VuZGlmCisKKyNlbmRpZgorI2VuZGlmIC8qIGlmbmRlZiBESVNBQkxFX1NFUVVFTkNFUiAqLworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGlvY3RsIGNvbW1hbmRzIGZvciB0aGUgL2Rldi9taWRpIyMgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgU05EQ1RMX01JRElfUFJFVElNRQlfX1NJT1dSKCdtJywgMCwgaW50KQorCisjaWYgMAorLyoKKyAqIFRoZSBTTkRDVExfTUlESV9NUFVNT0RFIGFuZCBTTkRDVExfTUlESV9NUFVDTUQgY2FsbHMKKyAqIGFyZSBjb21wbGV0ZWx5IG9ic29sZXRlLiBUaGUgaGFyZHdhcmUgZGV2aWNlIChNUFUtNDAxICJpbnRlbGxpZ2VudCBtb2RlIgorICogYW5kIGNvbXBhdGlibGVzKSBoYXMgZGlzYXBwZWFyZWQgZnJvbSB0aGUgbWFya2V0IDEwIHllYXJzIGFnbyBzbyB0aGVyZSAKKyAqIGlzIG5vIG5lZWQgZm9yIHRoaXMgc3R1ZmYuIFRoZSBNUFUtNDAxICJVQVJUIiBtb2RlIGRldmljZXMgZG9uJ3Qgc3VwcG9ydAorICogdGhpcyBzdHVmZi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhciBjbWQ7CisgIGNoYXIgbnJfYXJncywgbnJfcmV0dXJuczsKKyAgdW5zaWduZWQgY2hhciBkYXRhWzMwXTsKK30gbXB1X2NvbW1hbmRfcmVjOworCisjZGVmaW5lIFNORENUTF9NSURJX01QVU1PREUJX19TSU9XUignbScsIDEsIGludCkKKyNkZWZpbmUgU05EQ1RMX01JRElfTVBVQ01ECV9fU0lPV1IoJ20nLCAyLCBtcHVfY29tbWFuZF9yZWMpCisjZW5kaWYKKworLyoKKyAqIFNORENUTF9NSURJX01UQ0lOUFVUIHR1cm5zIG9uIGEgbW9kZSB3aGVyZSBPU1MgYXV0b21hdGljYWxseSBpbnNlcnRzCisgKiBNVEMgcXVhcnRlciBmcmFtZSBtZXNzYWdlcyAoRjEgeHgpIHRvIHRoZSBpbnB1dC4KKyAqIFRoZSBhcmd1bWVudCBpcyB0aGUgTVRDIG1vZGU6CisgKgorICogCS0xID0gVHVybiBNVEMgbWVzc2FnZXMgT0ZGIChkZWZhdWx0KQorICoJMjQgPSAyNCBGUFMgCisgKgkyNSA9IDI1IEZQUyAKKyAqCTI5ID0gMzAgRlBTIGRyb3AgZnJhbWUKKyAqCTMwID0gMzAgRlBTIAorICoKKyAqIE5vdGUgdGhhdCAyNSBGUFMgbW9kZSBpcyBwcm9iYWJseSB0aGUgb25seSBtb2RlIHRoYXQgaXMgc3VwcG9ydGVkLiBPdGhlcgorICogbW9kZXMgbWF5IGJlIHN1cHBvcnRlZCBpbiB0aGUgZnV0dXJlIHZlcnNpb25zIG9mIE9TUywgMjUgRlBTIGlzIGhhbmR5IAorICogYmVjYXVzZSBpdCBnZW5lcmF0ZXMgMjUqND0xMDAgcXVhcnRlciBmcmFtZSBtZXNzYWdlcyBwZXIgc2Vjb25kIHdoaWNoCisgKiBtYXRjaGVzIHRoZSB1c3VhbCAxMDAgSFogc3lzdGVtIHRpbWVyIHJhdGUpLgorICoKKyAqIFRoZSBxdWFydGVyIGZyYW1lIHRpbWVyIHdpbGwgYmUgcmVzZXQgdG8gMDowMDowMDowMC4wIGF0IHRoZSBtb21lbnQgdGhpcworICogaW9jdGwgaXMgbWFkZS4KKyAqLworI2RlZmluZSBTTkRDVExfTUlESV9NVENJTlBVVAlfX1NJT1dSKCdtJywgMywgaW50KQorCisvKgorICogTVRDL1NNUFRFIHRpbWUgY29kZSByZWNvcmQgKGZvciBmdXR1cmUgdXNlKQorICovCit0eXBlZGVmIHN0cnVjdAoreworICB1bnNpZ25lZCBjaGFyIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBmcmFtZXMsIHFmcmFtZXM7CisgIGNoYXIgZGlyZWN0aW9uOworI2RlZmluZSBNVENfRElSX1NUT1BQRUQJCSAwCisjZGVmaW5lIE1UQ19ESVJfRk9SV0FSRAkJIDEKKyNkZWZpbmUgTVRDX0RJUl9CQUNLV0FSRAktMQorICB1bnNpZ25lZCBjaGFyIHRpbWVfY29kZV90eXBlOworICB1bnNpZ25lZCBpbnQgZmxhZ3M7Cit9IG9zc19tdGNfZGF0YV90OworCisjZGVmaW5lIFNORENUTF9NSURJX1NFVE1PREUJX19TSU9XUignbScsIDYsIGludCkKKyMJZGVmaW5lIE1JRElfTU9ERV9UUkFESVRJT05BTAkwCisjCWRlZmluZSBNSURJX01PREVfVElNRUQJCTEJLyogSW5wdXQgdGltZXMgYXJlIGluIE1JREkgdGlja3MgKi8KKyMJZGVmaW5lIE1JRElfTU9ERV9USU1FRF9BQlMgIAkyCS8qIElucHV0IHRpbWVzIGFyZSBhYnNvbHV0ZSAodXNlY3MpICovCisKKy8qCisgKiBQYWNrZXQgaGVhZGVyIGZvciBNSURJX01PREVfVElNRUQgYW5kIE1JRElfTU9ERV9USU1FRF9BQlMKKyAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgb3NzX21pZGlfdGltZV90OwkvKiBWYXJpYWJsZSB0eXBlIGZvciBNSURJIHRpbWUgKGNsb2NrIHRpY2tzKSAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBpbnQgbWFnaWM7CQkJLyogSW5pdGlhbGl6ZSB0byBNSURJX0hEUl9NQUdJQyAqLworI2RlZmluZSBNSURJX0hEUl9NQUdJQwktMQorICB1bnNpZ25lZCBzaG9ydCBldmVudF90eXBlOworI2RlZmluZSBNSURJX0VWX1dSSVRFCQkJMAkvKiBXcml0ZSBvciByZWFkICh3aXRoIHBheWxvYWQpICovCisjZGVmaW5lIE1JRElfRVZfVEVNUE8JCQkxCisjZGVmaW5lIE1JRElfRVZfRUNITwkJCTIKKyNkZWZpbmUgTUlESV9FVl9TVEFSVAkJCTMKKyNkZWZpbmUgTUlESV9FVl9TVE9QCQkJNAorI2RlZmluZSBNSURJX0VWX0NPTlRJTlVFCQk1CisjZGVmaW5lIE1JRElfRVZfWFBSRVNTV1JJVEUJCTYKKyNkZWZpbmUgTUlESV9FVl9USU1FQkFTRQkJNworI2RlZmluZSBNSURJX0VWX0RFVkNUTAkJCTgJLyogRGV2aWNlIGNvbnRyb2wgcmVhZC93cml0ZSAqLworICB1bnNpZ25lZCBzaG9ydCBvcHRpb25zOworI2RlZmluZSBNSURJX09QVF9OT05FCQkJMHgwMDAwCisjZGVmaW5lIE1JRElfT1BUX1RJTUVECQkJMHgwMDAxCisjZGVmaW5lIE1JRElfT1BUX0NPTlRJTlVBVElPTgkJMHgwMDAyCisjZGVmaW5lIE1JRElfT1BUX1VTRUNUSU1FCQkweDAwMDQJLyogVGltZSBpcyBhYnNvbHV0ZSAoaW4gdXNlY3MpICovCisjZGVmaW5lIE1JRElfT1BUX0JVU1kJCQkweDAwMDgJLyogUmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZSAqLworICBvc3NfbWlkaV90aW1lX3QgdGltZTsKKyAgaW50IHBhcm07CisgIGludCBmaWxsZXJbM107CQkvKiBGdXIgZnV0dXJlIGV4cGFuc2lvbiAtIGluaXQgdG8gemVyb3MgKi8KK30gbWlkaV9wYWNrZXRfaGVhZGVyX3Q7CisvKiAKKyAqIE1JRElfUEFZTE9BRF9TSVpFIGlzIHRoZSBtYXhpbXVtIHNpemUgb2Ygb25lIE1JREkgaW5wdXQgY2h1bmsuIEl0IG11c3QgYmUKKyAqIGxlc3MgKG9yIGVxdWFsKSB0aGFuIDEwMjQgd2hpY2ggaXMgdGhlIHJlYWQgc2l6ZSByZWNvbW1lbmRlZCBpbiB0aGUgCisgKiBkb2N1bWVudGF0aW9uLiBUT0RPOiBFeHBsYWluIHRoaXMgYmV0dGVyLgorICovCisjZGVmaW5lIE1JRElfUEFZTE9BRF9TSVpFCQkxMDAwCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIG1pZGlfcGFja2V0X2hlYWRlcl90IGhkcjsKKyAgdW5zaWduZWQgY2hhciBwYXlsb2FkW01JRElfUEFZTE9BRF9TSVpFXTsKK30gbWlkaV9wYWNrZXRfdDsKKworI2RlZmluZSBTTkRDVExfTUlESV9USU1FQkFTRQkJX19TSU9XUignbScsIDcsIGludCkKKyNkZWZpbmUgU05EQ1RMX01JRElfVEVNUE8JCV9fU0lPV1IoJ20nLCA4LCBpbnQpCisvKgorICogVXNlciBsYW5kIE1JREkgc2VydmVycyAoc3ludGhzKSBjYW4gdXNlIFNORENUTF9NSURJX1NFVF9MQVRFTkNZCisgKiB0byByZXF1ZXN0IE1JREkgZXZlbnRzIHRvIGJlIHNlbnQgdG8gdGhlbSBpbiBhZHZhbmNlLiBUaGUgcGFyYW1ldGVyCisgKiAoaW4gbWljcm9zZWNvbmRzKSB0ZWxscyBob3cgbXVjaCBiZWZvcmUgdGhlIGV2ZW50cyBhcmUgc3VibWl0dGVkLgorICoKKyAqIFRoaXMgZmVhdHVyZSBpcyBvbmx5IHZhbGlkIGZvciBsb29wYmFjayBkZXZpY2VzIGFuZCBwb3NzaWJseSBzb21lIG90aGVyCisgKiB0eXBlcyBvZiB2aXJ0dWFsIGRldmljZXMuCisgKi8KKyNkZWZpbmUgU05EQ1RMX01JRElfU0VUX0xBVEVOQ1kJCV9fU0lPVyAoJ20nLCA5LCBpbnQpCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElPQ1RMIGNvbW1hbmRzIGZvciAvZGV2L2RzcAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU05EQ1RMX0RTUF9IQUxUCQkJX19TSU8gICgnUCcsIDApCisjZGVmaW5lIFNORENUTF9EU1BfUkVTRVQJCVNORENUTF9EU1BfSEFMVAkvKiBPbGQgbmFtZSAqLworI2RlZmluZSBTTkRDVExfRFNQX1NZTkMJCQlfX1NJTyAgKCdQJywgMSkKKyNkZWZpbmUgU05EQ1RMX0RTUF9TUEVFRAkJX19TSU9XUignUCcsIDIsIGludCkKKworLyogU05EQ1RMX0RTUF9TVEVSRU8gaXMgb2Jzb2xldGUgLSB1c2UgU05EQ1RMX0RTUF9DSEFOTkVMUyBpbnN0ZWFkICovCisjZGVmaW5lIFNORENUTF9EU1BfU1RFUkVPCQlfX1NJT1dSKCdQJywgMywgaW50KQorLyogU05EQ1RMX0RTUF9TVEVSRU8gaXMgb2Jzb2xldGUgLSB1c2UgU05EQ1RMX0RTUF9DSEFOTkVMUyBpbnN0ZWFkICovCisKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRCTEtTSVpFCQlfX1NJT1dSKCdQJywgNCwgaW50KQorI2RlZmluZSBTTkRDVExfRFNQX1NBTVBMRVNJWkUJCVNORENUTF9EU1BfU0VURk1UCisjZGVmaW5lIFNORENUTF9EU1BfQ0hBTk5FTFMJCV9fU0lPV1IoJ1AnLCA2LCBpbnQpCisjZGVmaW5lIFNORENUTF9EU1BfUE9TVAkJCV9fU0lPICAoJ1AnLCA4KQorI2RlZmluZSBTTkRDVExfRFNQX1NVQkRJVklERQkJX19TSU9XUignUCcsIDksIGludCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVAkJX19TSU9XUignUCcsMTAsIGludCkKKworLyogQXVkaW8gZGF0YSBmb3JtYXRzIChOb3RlISBVOD04IGFuZCBTMTZfTEU9MTYgZm9yIGNvbXBhdGliaWxpdHkpICovCisjZGVmaW5lIFNORENUTF9EU1BfR0VURk1UUwkJX19TSU9SICgnUCcsMTEsIGludCkJLyogUmV0dXJucyBhIG1hc2sgKi8KKyNkZWZpbmUgU05EQ1RMX0RTUF9TRVRGTVQJCV9fU0lPV1IoJ1AnLDUsIGludCkJLyogU2VsZWN0cyBPTkUgZm10ICovCisjCWRlZmluZSBBRk1UX1FVRVJZCTB4MDAwMDAwMDAJLyogUmV0dXJuIGN1cnJlbnQgZm10ICovCisjCWRlZmluZSBBRk1UX01VX0xBVwkweDAwMDAwMDAxCisjCWRlZmluZSBBRk1UX0FfTEFXCTB4MDAwMDAwMDIKKyMJZGVmaW5lIEFGTVRfSU1BX0FEUENNCTB4MDAwMDAwMDQKKyMJZGVmaW5lIEFGTVRfVTgJCTB4MDAwMDAwMDgKKyMJZGVmaW5lIEFGTVRfUzE2X0xFCTB4MDAwMDAwMTAJLyogTGl0dGxlIGVuZGlhbiBzaWduZWQgMTYgKi8KKyMJZGVmaW5lIEFGTVRfUzE2X0JFCTB4MDAwMDAwMjAJLyogQmlnIGVuZGlhbiBzaWduZWQgMTYgKi8KKyMJZGVmaW5lIEFGTVRfUzgJCTB4MDAwMDAwNDAKKyMJZGVmaW5lIEFGTVRfVTE2X0xFCTB4MDAwMDAwODAJLyogTGl0dGxlIGVuZGlhbiBVMTYgKi8KKyMJZGVmaW5lIEFGTVRfVTE2X0JFCTB4MDAwMDAxMDAJLyogQmlnIGVuZGlhbiBVMTYgKi8KKyMJZGVmaW5lIEFGTVRfTVBFRwkweDAwMDAwMjAwCS8qIE1QRUcgKDIpIGF1ZGlvICovCisKKy8qIEFDMyBfY29tcHJlc3NlZF8gYml0c3RyZWFtcyAoU2VlIFByb2dyYW1tZXIncyBHdWlkZSBmb3IgZGV0YWlscykuICovCisjCWRlZmluZSBBRk1UX0FDMwkJMHgwMDAwMDQwMAorLyogT2dnIFZvcmJpcyBfY29tcHJlc3NlZF8gYml0IHN0cmVhbXMgKi8KKyMJZGVmaW5lIEFGTVRfVk9SQklTCTB4MDAwMDA4MDAKKworLyogMzIgYml0IGZvcm1hdHMgKE1TQiBhbGlnbmVkKSBmb3JtYXRzICovCisjCWRlZmluZSBBRk1UX1MzMl9MRQkweDAwMDAxMDAwCisjCWRlZmluZSBBRk1UX1MzMl9CRQkweDAwMDAyMDAwCisKKy8qIFJlc2VydmVkIGZvciBfbmF0aXZlXyBlbmRpYW4gZG91YmxlIHByZWNpc2lvbiBJRUVFIGZsb2F0aW5nIHBvaW50ICovCisjCWRlZmluZSBBRk1UX0ZMT0FUCTB4MDAwMDQwMDAKKworLyogMjQgYml0IGZvcm1hdHMgKExTQiBhbGlnbmVkIGluIDMyIGJpdCB3b3JkKSBmb3JtYXRzICovCisjCWRlZmluZSBBRk1UX1MyNF9MRQkweDAwMDA4MDAwCisjCWRlZmluZSBBRk1UX1MyNF9CRQkweDAwMDEwMDAwCisKKy8qCisgKiBTL1BESUYgcmF3IGZvcm1hdC4gSW4gdGhpcyBmb3JtYXQgdGhlIFMvUERJRiBmcmFtZXMgKGluY2x1ZGluZyBhbGwKKyAqIGNvbnRyb2wgYW5kIHVzZXIgYml0cykgYXJlIGluY2x1ZGVkIGluIHRoZSBkYXRhIHN0cmVhbS4gRWFjaCBzYW1wbGUKKyAqIGlzIHN0b3JlZCBpbiBhIDMyIGJpdCBmcmFtZSAoc2VlIElFQy05NTggZm9yIG1vcmUgaW5mbykuIFRoaXMgZm9ybWF0CisgKiBpcyBzdXBwb3J0ZWQgYnkgdmVyeSBmZXcgZGV2aWNlcyBhbmQgaXQncyBvbmx5IHVzYWJsZSBmb3IgcHVycG9zZXMKKyAqIHdoZXJlIGZ1bGwgYWNjZXNzIHRvIHRoZSBjb250cm9sL3VzZXIgYml0cyBpcyByZXF1aXJlZCAocmVhbCB0aW1lIGNvbnRyb2wpLgorICovCisjCWRlZmluZSBBRk1UX1NQRElGX1JBVwkweDAwMDIwMDAwCisKKy8qIDI0IGJpdCBwYWNrZWQgKDMgYnl0ZSkgbGl0dGxlIGVuZGlhbiBmb3JtYXQgKFVTQiBjb21wYXRpYmlsaXR5KSAqLworIwlkZWZpbmUgQUZNVF9TMjRfUEFDS0VECTB4MDAwNDAwMDAKKworCisvKgorICogU29tZSBiaWcgZW5kaWFuL2xpdHRsZSBlbmRpYW4gaGFuZGxpbmcgbWFjcm9zIChuYXRpdmUgZW5kaWFuIGFuZCBvcHBvc2l0ZQorICogZW5kaWFuIGZvcm1hdHMpLiBUaGUgdXNhZ2Ugb2YgdGhlc2UgbWFjcm9zIGlzIGRlc2NyaWJlZCBpbiB0aGUgT1NTCisgKiBQcm9ncmFtbWVyJ3MgTWFudWFsLgorICovCisKKyNpZiBkZWZpbmVkKF9BSVgpIHx8IGRlZmluZWQoQUlYKSB8fCBkZWZpbmVkKHNwYXJjKSB8fCBkZWZpbmVkKF9faHBwYSkgfHwgZGVmaW5lZChQUEMpIHx8IGRlZmluZWQoX19wb3dlcnBjX18pICYmICFkZWZpbmVkKGkzODYpICYmICFkZWZpbmVkKF9faTM4NikgJiYgIWRlZmluZWQoX19pMzg2X18pCisKKy8qIEJpZyBlbmRpYW4gbWFjaGluZXMgKi8KKyMgIGRlZmluZSBfUEFUQ0hLRVkoaWQpICgweGZkMDB8aWQpCisjICBkZWZpbmUgQUZNVF9TMTZfTkUgQUZNVF9TMTZfQkUKKyMgIGRlZmluZSBBRk1UX1UxNl9ORSBBRk1UX1UxNl9CRQorIyAgZGVmaW5lIEFGTVRfUzMyX05FIEFGTVRfUzMyX0JFCisjICBkZWZpbmUgQUZNVF9TMjRfTkUgQUZNVF9TMjRfQkUKKyMgIGRlZmluZSBBRk1UX1MxNl9PRSBBRk1UX1MxNl9MRQorIyAgZGVmaW5lIEFGTVRfUzMyX09FIEFGTVRfUzMyX0xFCisjICBkZWZpbmUgQUZNVF9TMjRfT0UgQUZNVF9TMjRfTEUKKyNlbHNlCisjICBkZWZpbmUgX1BBVENIS0VZKGlkKSAoKGlkPDw4KXwweGZkKQorIyAgZGVmaW5lIEFGTVRfUzE2X05FIEFGTVRfUzE2X0xFCisjICBkZWZpbmUgQUZNVF9VMTZfTkUgQUZNVF9VMTZfTEUKKyMgIGRlZmluZSBBRk1UX1MzMl9ORSBBRk1UX1MzMl9MRQorIyAgZGVmaW5lIEFGTVRfUzI0X05FIEFGTVRfUzI0X0xFCisjICBkZWZpbmUgQUZNVF9TMTZfT0UgQUZNVF9TMTZfQkUKKyMgIGRlZmluZSBBRk1UX1MzMl9PRSBBRk1UX1MzMl9CRQorIyAgZGVmaW5lIEFGTVRfUzI0X09FIEFGTVRfUzI0X0JFCisjZW5kaWYKKy8qCisgKiBCdWZmZXIgc3RhdHVzIHF1ZXJpZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IGF1ZGlvX2J1Zl9pbmZvCit7CisgIGludCBmcmFnbWVudHM7CQkvKiAjIG9mIGF2YWlsYWJsZSBmcmFnbWVudHMgKHBhcnRpYWxseSB1c2VuZCBvbmVzIG5vdCBjb3VudGVkKSAqLworICBpbnQgZnJhZ3N0b3RhbDsJCS8qIFRvdGFsICMgb2YgZnJhZ21lbnRzIGFsbG9jYXRlZCAqLworICBpbnQgZnJhZ3NpemU7CQkJLyogU2l6ZSBvZiBhIGZyYWdtZW50IGluIGJ5dGVzICovCisgIGludCBieXRlczsJCQkvKiBBdmFpbGFibGUgc3BhY2UgaW4gYnl0ZXMgKGluY2x1ZGVzIHBhcnRpYWxseSB1c2VkIGZyYWdtZW50cykgKi8KKyAgLyogTm90ZSEgJ2J5dGVzJyBjb3VsZCBiZSBtb3JlIHRoYW4gZnJhZ21lbnRzKmZyYWdzaXplICovCit9IGF1ZGlvX2J1Zl9pbmZvOworCisjZGVmaW5lIFNORENUTF9EU1BfR0VUT1NQQUNFCQlfX1NJT1IgKCdQJywxMiwgYXVkaW9fYnVmX2luZm8pCisjZGVmaW5lIFNORENUTF9EU1BfR0VUSVNQQUNFCQlfX1NJT1IgKCdQJywxMywgYXVkaW9fYnVmX2luZm8pCisjZGVmaW5lIFNORENUTF9EU1BfR0VUQ0FQUwkJX19TSU9SICgnUCcsMTUsIGludCkKKyMJZGVmaW5lIFBDTV9DQVBfUkVWSVNJT04JCTB4MDAwMDAwZmYJLyogQml0cyBmb3IgcmV2aXNpb24gbGV2ZWwgKDAgdG8gMjU1KSAqLworIwlkZWZpbmUgUENNX0NBUF9EVVBMRVgJCTB4MDAwMDAxMDAJLyogRnVsbCBkdXBsZXggcmVjb3JkL3BsYXliYWNrICovCisjCWRlZmluZSBQQ01fQ0FQX1JFQUxUSU1FCQkweDAwMDAwMjAwCS8qIE5vdCBpbiB1c2UgKi8KKyMJZGVmaW5lIFBDTV9DQVBfQkFUQ0gJCTB4MDAwMDA0MDAJLyogRGV2aWNlIGhhcyBzb21lIGtpbmQgb2YgKi8KKwkJCQkJCQkvKiBpbnRlcm5hbCBidWZmZXJzIHdoaWNoIG1heSAqLworCQkJCQkJCS8qIGNhdXNlIHNvbWUgZGVsYXlzIGFuZCAqLworCQkJCQkJCS8qIGRlY3JlYXNlIHByZWNpc2lvbiBvZiB0aW1pbmcgKi8KKyMJZGVmaW5lIFBDTV9DQVBfQ09QUk9DCQkweDAwMDAwODAwCS8qIEhhcyBhIGNvcHJvY2Vzc29yICovCisJCQkJCQkJLyogU29tZXRpbWVzIGl0J3MgYSBEU1AgKi8KKwkJCQkJCQkvKiBidXQgdXN1YWxseSBub3QgKi8KKyMJZGVmaW5lIFBDTV9DQVBfVFJJR0dFUgkJMHgwMDAwMTAwMAkvKiBTdXBwb3J0cyBTRVRUUklHR0VSICovCisjCWRlZmluZSBQQ01fQ0FQX01NQVAJCTB4MDAwMDIwMDAJLyogU3VwcG9ydHMgbW1hcCgpICovCisjCWRlZmluZSBQQ01fQ0FQX01VTFRJCQkweDAwMDA0MDAwCS8qIFN1cHBvcnRzIG11bHRpcGxlIG9wZW4gKi8KKyMJZGVmaW5lIFBDTV9DQVBfQklORAkJMHgwMDAwODAwMAkvKiBTdXBwb3J0cyBiaW5kaW5nIHRvIGZyb250L3JlYXIvY2VudGVyL2xmZSAqLworIyAgIAlkZWZpbmUgUENNX0NBUF9JTlBVVAkJMHgwMDAxMDAwMAkvKiBTdXBwb3J0cyByZWNvcmRpbmcgKi8KKyMgICAJZGVmaW5lIFBDTV9DQVBfT1VUUFVUCQkweDAwMDIwMDAwCS8qIFN1cHBvcnRzIHBsYXliYWNrICovCisjCWRlZmluZSBQQ01fQ0FQX1ZJUlRVQUwJCTB4MDAwNDAwMDAJLyogVmlydHVhbCBkZXZpY2UgKi8KKy8qIDB4MDAwNDAwMDAgYW5kIDB4MDAwODAwMDAgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKworLyogQW5hbG9nL2RpZ2l0YWwgY29udHJvbCBjYXBhYmlsaXRpZXMgKi8KKyMJZGVmaW5lIFBDTV9DQVBfQU5BTE9HT1VUCTB4MDAxMDAwMDAKKyMJZGVmaW5lIFBDTV9DQVBfQU5BTE9HSU4JCTB4MDAyMDAwMDAKKyMJZGVmaW5lIFBDTV9DQVBfRElHSVRBTE9VVAkweDAwNDAwMDAwCisjCWRlZmluZSBQQ01fQ0FQX0RJR0lUQUxJTgkweDAwODAwMDAwCisjCWRlZmluZSBQQ01fQ0FQX0FETUFTSwkJMHgwMGYwMDAwMAorLyoKKyAqIE5PVEUhIChjYXBhYmlsaXRpZXMgJiBQQ01fQ0FQX0FETUFTSyk9PTAgbWVhbnMganVzdCB0aGF0IHRoZQorICogZGlnaXRhbC9hbmFsb2cgaW50ZXJmYWNlIGNvbnRyb2wgZmVhdHVyZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIAorICogZGV2aWNlL2RyaXZlci4gSG93ZXZlciB0aGUgZGV2aWNlIHN0aWxsIHN1cHBvcnRzIGFuYWxvZywgZGlnaXRhbCBvcgorICogYm90aCBpbnB1dHMvb3V0cHV0cyAoZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UpLiBTZWUgdGhlIE9TUyBQcm9ncmFtbWVyJ3MKKyAqIEd1aWRlIGZvciBmdWxsIGRldGFpbHMuCisgKi8KKyMJZGVmaW5lIFBDTV9DQVBfU0hBRE9XCQkweDAxMDAwMDAwCS8qICJTaGFkb3ciIGRldmljZSAqLworCisvKgorICogUHJlZmVycmVkIGNoYW5uZWwgdXNhZ2UuIFRoZXNlIGJpdHMgY2FuIGJlIHVzZWQgdG8KKyAqIGdpdmUgcmVjb21tZW5kYXRpb25zIHRvIHRoZSBhcHBsaWNhdGlvbi4gVXNlZCBieSBmZXcgZHJpdmVycy4KKyAqIEZvciBleGFtcGxlIGlmICgoY2FwcyAmIERTUF9DSF9NQVNLKSA9PSBEU1BfQ0hfTU9OTykgbWVhbnMgdGhhdAorICogdGhlIGRldmljZSB3b3JrcyBiZXN0IGluIG1vbm8gbW9kZS4gSG93ZXZlciBpdCBkb2Vzbid0IG5lY2Vzc2FyaWx5IG1lYW4KKyAqIHRoYXQgdGhlIGRldmljZSBjYW5ub3QgYmUgdXNlZCBpbiBzdGVyZW8uIFRoZXNlIGJpdHMgc2hvdWxkIG9ubHkgYmUgdXNlZAorICogYnkgc3BlY2lhbCBhcHBsaWNhdGlvbnMgc3VjaCBhcyBtdWx0aSB0cmFjayBoYXJkIGRpc2sgcmVjb3JkZXJzIHRvIGZpbmQKKyAqIG91dCB0aGUgaW5pdGlhbCBzZXR1cC4gSG93ZXZlciB0aGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBvdmVycmlkZSB0aGlzCisgKiBzZWxlY3Rpb24uCisgKgorICogVG8gZmluZCBvdXQgd2hpY2ggbW9kZXMgYXJlIGFjdHVhbGx5IHN1cHBvcnRlZCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIAorICogdHJ5IHRvIHNlbGVjdCB0aGVtIHVzaW5nIFNORENUTF9EU1BfQ0hBTk5FTFMuCisgKi8KKyMJZGVmaW5lIERTUF9DSF9NQVNLCQkweDA2MDAwMDAwCS8qIE1hc2sgKi8KKyMJZGVmaW5lIERTUF9DSF9BTlkJCTB4MDAwMDAwMDAJLyogTm8gcHJlZmVycmVkIG1vZGUgKi8KKyMJZGVmaW5lIERTUF9DSF9NT05PCQkweDAyMDAwMDAwCisjCWRlZmluZSBEU1BfQ0hfU1RFUkVPCQkweDA0MDAwMDAwCisjCWRlZmluZSBEU1BfQ0hfTVVMVEkJCTB4MDYwMDAwMDAJLyogTW9yZSB0aGFuIHR3byBjaGFubmVscyAqLworCisjCWRlZmluZSBQQ01fQ0FQX0hJRERFTgkJMHgwODAwMDAwMAkvKiBIaWRkZW4gZGV2aWNlICovCisjCWRlZmluZSBQQ01fQ0FQX0ZSRUVSQVRFCQkweDEwMDAwMDAwCisjCWRlZmluZSBQQ01fQ0FQX01PREVNCQkweDIwMDAwMDAwCS8qIE1vZGVtIGRldmljZSAqLworIwlkZWZpbmUgUENNX0NBUF9ERUZBVUxUCQkweDQwMDAwMDAwCS8qICJEZWZhdWx0IiBkZXZpY2UgKi8KKworLyoKKyAqIFRoZSBQQ01fQ0FQXyogY2FwYWJpbGl0eSBuYW1lcyB3ZXJlIGtub3duIGFzIERTUF9DQVBfKiBwcmlvciBPU1MgNC4wCisgKiBzbyBpdCdzIG5lY2Vzc2FyeSB0byBkZWZpbmUgdGhlIG9sZGVyIG5hbWVzIHRvby4KKyAqLworI2RlZmluZSBEU1BfQ0FQX0FETUFTSwkJUENNX0NBUF9BRE1BU0sKKyNkZWZpbmUgRFNQX0NBUF9BTkFMT0dJTglQQ01fQ0FQX0FOQUxPR0lOCisjZGVmaW5lIERTUF9DQVBfQU5BTE9HT1VUCVBDTV9DQVBfQU5BTE9HT1VUCisjZGVmaW5lIERTUF9DQVBfQkFUQ0gJCVBDTV9DQVBfQkFUQ0gKKyNkZWZpbmUgRFNQX0NBUF9CSU5ECQlQQ01fQ0FQX0JJTkQKKyNkZWZpbmUgRFNQX0NBUF9DT1BST0MJCVBDTV9DQVBfQ09QUk9DCisjZGVmaW5lIERTUF9DQVBfREVGQVVMVAkJUENNX0NBUF9ERUZBVUxUCisjZGVmaW5lIERTUF9DQVBfRElHSVRBTElOCVBDTV9DQVBfRElHSVRBTElOCisjZGVmaW5lIERTUF9DQVBfRElHSVRBTE9VVAlQQ01fQ0FQX0RJR0lUQUxPVVQKKyNkZWZpbmUgRFNQX0NBUF9EVVBMRVgJCVBDTV9DQVBfRFVQTEVYCisjZGVmaW5lIERTUF9DQVBfRlJFRVJBVEUJUENNX0NBUF9GUkVFUkFURQorI2RlZmluZSBEU1BfQ0FQX0hJRERFTgkJUENNX0NBUF9ISURERU4KKyNkZWZpbmUgRFNQX0NBUF9JTlBVVAkJUENNX0NBUF9JTlBVVAorI2RlZmluZSBEU1BfQ0FQX01NQVAJCVBDTV9DQVBfTU1BUAorI2RlZmluZSBEU1BfQ0FQX01PREVNCQlQQ01fQ0FQX01PREVNCisjZGVmaW5lIERTUF9DQVBfTVVMVEkJCVBDTV9DQVBfTVVMVEkKKyNkZWZpbmUgRFNQX0NBUF9PVVRQVVQJCVBDTV9DQVBfT1VUUFVUCisjZGVmaW5lIERTUF9DQVBfUkVBTFRJTUUJUENNX0NBUF9SRUFMVElNRQorI2RlZmluZSBEU1BfQ0FQX1JFVklTSU9OCVBDTV9DQVBfUkVWSVNJT04KKyNkZWZpbmUgRFNQX0NBUF9TSEFET1cJCVBDTV9DQVBfU0hBRE9XCisjZGVmaW5lIERTUF9DQVBfVFJJR0dFUgkJUENNX0NBUF9UUklHR0VSCisjZGVmaW5lIERTUF9DQVBfVklSVFVBTAkJUENNX0NBUF9WSVJUVUFMCisKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRUUklHR0VSCQlfX1NJT1IgKCdQJywxNiwgaW50KQorI2RlZmluZSBTTkRDVExfRFNQX1NFVFRSSUdHRVIJCV9fU0lPVyAoJ1AnLDE2LCBpbnQpCisjCWRlZmluZSBQQ01fRU5BQkxFX0lOUFVUCQkweDAwMDAwMDAxCisjCWRlZmluZSBQQ01fRU5BQkxFX09VVFBVVAkweDAwMDAwMDAyCisKK3R5cGVkZWYgc3RydWN0IGNvdW50X2luZm8KK3sKKyAgdW5zaWduZWQgaW50IGJ5dGVzOwkJLyogVG90YWwgIyBvZiBieXRlcyBwcm9jZXNzZWQgKi8KKyAgaW50IGJsb2NrczsJCQkvKiAjIG9mIGZyYWdtZW50IHRyYW5zaXRpb25zIHNpbmNlIGxhc3QgdGltZSAqLworICBpbnQgcHRyOwkJCS8qIEN1cnJlbnQgRE1BIHBvaW50ZXIgdmFsdWUgKi8KK30gY291bnRfaW5mbzsKKworI2RlZmluZSBTTkRDVExfRFNQX0dFVElQVFIJCV9fU0lPUiAoJ1AnLDE3LCBjb3VudF9pbmZvKQorI2RlZmluZSBTTkRDVExfRFNQX0dFVE9QVFIJCV9fU0lPUiAoJ1AnLDE4LCBjb3VudF9pbmZvKQorCit0eXBlZGVmIHN0cnVjdCBidWZmbWVtX2Rlc2MKK3sKKyAgdW5zaWduZWQgKmJ1ZmZlcjsKKyAgaW50IHNpemU7Cit9IGJ1ZmZtZW1fZGVzYzsKKyNkZWZpbmUgU05EQ1RMX0RTUF9TRVRTWU5DUk8JCV9fU0lPICAoJ1AnLCAyMSkKKyNkZWZpbmUgU05EQ1RMX0RTUF9TRVREVVBMRVgJCV9fU0lPICAoJ1AnLCAyMikKKworI2RlZmluZSBTTkRDVExfRFNQX1BST0ZJTEUJCV9fU0lPVyAoJ1AnLCAyMywgaW50KQkvKiBPQlNPTEVURSAqLworI2RlZmluZQkgIEFQRl9OT1JNQUwJMAkvKiBOb3JtYWwgYXBwbGljYXRpb25zICovCisjZGVmaW5lCSAgQVBGX05FVFdPUksJMQkvKiBVbmRlcnJ1bnMgcHJvYmFibHkgY2F1c2VkIGJ5IGFuICJleHRlcm5hbCIgZGVsYXkgKi8KKyNkZWZpbmUgICBBUEZfQ1BVSU5URU5TIDIJLyogVW5kZXJydW5zIHByb2JhYmx5IGNhdXNlZCBieSAib3ZlcmhlYXRpbmciIHRoZSBDUFUgKi8KKworI2RlZmluZSBTTkRDVExfRFNQX0dFVE9ERUxBWQkJX19TSU9SICgnUCcsIDIzLCBpbnQpCisKK3R5cGVkZWYgc3RydWN0IGF1ZGlvX2VycmluZm8KK3sKKyAgaW50IHBsYXlfdW5kZXJydW5zOworICBpbnQgcmVjX292ZXJydW5zOworICB1bnNpZ25lZCBpbnQgcGxheV9wdHJhZGp1c3Q7CisgIHVuc2lnbmVkIGludCByZWNfcHRyYWRqdXN0OworICBpbnQgcGxheV9lcnJvcmNvdW50OworICBpbnQgcmVjX2Vycm9yY291bnQ7CisgIGludCBwbGF5X2xhc3RlcnJvcjsKKyAgaW50IHJlY19sYXN0ZXJyb3I7CisgIGludCBwbGF5X2Vycm9ycGFybTsKKyAgaW50IHJlY19lcnJvcnBhcm07CisgIGludCBmaWxsZXJbMTZdOworfSBhdWRpb19lcnJpbmZvOworCisjZGVmaW5lIFNORENUTF9EU1BfR0VUUExBWVZPTAkJX19TSU9SICgnUCcsIDI0LCBpbnQpCisjZGVmaW5lIFNORENUTF9EU1BfU0VUUExBWVZPTAkJX19TSU9XUignUCcsIDI0LCBpbnQpCisjZGVmaW5lIFNORENUTF9EU1BfR0VURVJST1IJCV9fU0lPUiAoJ1AnLCAyNSwgYXVkaW9fZXJyaW5mbykKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGlnaXRhbCBpbnRlcmZhY2UgKFMvUERJRikgY29udHJvbCBpbnRlcmZhY2UKKyAqLworCit0eXBlZGVmIHN0cnVjdCBvc3NfZGlnaXRhbF9jb250cm9sCit7CisgIHVuc2lnbmVkIGludCBjYXBzOworI2RlZmluZSBESUdfQ0JJVElOX05PTkUJCQkweDAwMDAwMDAwCisjZGVmaW5lIERJR19DQklUSU5fTElNSVRFRAkJMHgwMDAwMDAwMQorI2RlZmluZSBESUdfQ0JJVElOX0RBVEEgCQkweDAwMDAwMDAyCisjZGVmaW5lIERJR19DQklUSU5fQllURTAJCTB4MDAwMDAwMDQKKyNkZWZpbmUgRElHX0NCSVRJTl9GVUxMIAkJMHgwMDAwMDAwOAorI2RlZmluZSBESUdfQ0JJVElOX01BU0sgCQkweDAwMDAwMDBmCisjZGVmaW5lIERJR19DQklUT1VUX05PTkUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRElHX0NCSVRPVVRfTElNSVRFRAkJMHgwMDAwMDAxMAorI2RlZmluZSBESUdfQ0JJVE9VVF9CWVRFMAkJMHgwMDAwMDAyMAorI2RlZmluZSBESUdfQ0JJVE9VVF9GVUxMIAkJMHgwMDAwMDA0MAorI2RlZmluZSBESUdfQ0JJVE9VVF9EQVRBIAkJMHgwMDAwMDA4MAorI2RlZmluZSBESUdfQ0JJVE9VVF9NQVNLIAkJMHgwMDAwMDBmMAorI2RlZmluZSBESUdfVUJJVElOCQkJMHgwMDAwMDEwMAorI2RlZmluZSBESUdfVUJJVE9VVAkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgRElHX1ZCSVRPVVQJCQkweDAwMDAwNDAwCisjZGVmaW5lIERJR19PVVRSQVRFCQkJMHgwMDAwMDgwMAorI2RlZmluZSBESUdfSU5SQVRFCQkJMHgwMDAwMTAwMAorI2RlZmluZSBESUdfSU5CSVRTCQkJMHgwMDAwMjAwMAorI2RlZmluZSBESUdfT1VUQklUUwkJCTB4MDAwMDQwMDAKKyNkZWZpbmUgRElHX0VYQUNUCQkJMHgwMDAxMDAwMAorI2RlZmluZSBESUdfUFJPCQkJCTB4MDAwMjAwMDAKKyNkZWZpbmUgRElHX0NPTlNVTUVSCQkJMHgwMDA0MDAwMAorI2RlZmluZSBESUdfUEFTU1RIUk9VR0gJCQkweDAwMDgwMDAwCisjZGVmaW5lIERJR19PVVRTRUwJCQkweDAwMTAwMDAwCisKKyAgdW5zaWduZWQgaW50IHZhbGlkOworI2RlZmluZSBWQUxfQ0JJVElOCQkJMHgwMDAwMDAwMQorI2RlZmluZSBWQUxfVUJJVElOCQkJMHgwMDAwMDAwMgorI2RlZmluZSBWQUxfQ0JJVE9VVAkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVkFMX1VCSVRPVVQJCQkweDAwMDAwMDA4CisjZGVmaW5lIFZBTF9JU1RBVFVTCQkJMHgwMDAwMDAxMAorI2RlZmluZSBWQUxfSVJBVEUJCQkweDAwMDAwMDIwCisjZGVmaW5lIFZBTF9PUkFURQkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgVkFMX0lOQklUUwkJCTB4MDAwMDAwODAKKyNkZWZpbmUgVkFMX09VVEJJVFMJCQkweDAwMDAwMTAwCisjZGVmaW5lIFZBTF9SRVFVRVNUCQkJMHgwMDAwMDIwMAorI2RlZmluZSBWQUxfT1VUU0VMCQkJMHgwMDAwMDQwMAorCisjZGVmaW5lIFZBTF9PVVRNQVNLIChWQUxfQ0JJVE9VVHxWQUxfVUJJVE9VVHxWQUxfT1JBVEV8VkFMX09VVEJJVFN8VkFMX09VVFNFTCkKKworICB1bnNpZ25lZCBpbnQgcmVxdWVzdCwgcGFyYW07CisjZGVmaW5lIFNQRF9SUV9QQVNTVEhST1VHSAkJCQkxCisKKyAgdW5zaWduZWQgY2hhciBjYml0aW5bMjRdOworICB1bnNpZ25lZCBjaGFyIHViaXRpblsyNF07CisgIHVuc2lnbmVkIGNoYXIgY2JpdG91dFsyNF07CisgIHVuc2lnbmVkIGNoYXIgdWJpdG91dFsyNF07CisKKyAgdW5zaWduZWQgaW50IG91dHNlbDsKKyNkZWZpbmUgT1VUU0VMX0RJR0lUQUwJCTEKKyNkZWZpbmUgT1VUU0VMX0FOQUxPRwkJMgorI2RlZmluZSBPVVRTRUxfQk9USAkJKE9VVFNFTF9ESUdJVEFMfE9VVFNFTF9BTkFMT0cpCisKKyAgaW50IGluX2RhdGE7CQkJLyogQXVkaW8vZGF0YSBpZiBhdXRvZGV0ZWN0YWJsZSBieSB0aGUgcmVjZWl2ZXIgKi8KKyNkZWZpbmUgSU5EX1VOS05PV04JCTAKKyNkZWZpbmUgSU5EX0FVRElPCQkxCisjZGVmaW5lIElORF9EQVRBCQkyCisKKyAgaW50IGluX2xvY2tlZDsJCS8qIFJlY2VpdmVyIGxvY2tlZCAqLworI2RlZmluZSBMT0NLX05PVF9JTkRJQ0FURUQJMAorI2RlZmluZSBMT0NLX1VOTE9DS0VECQkxCisjZGVmaW5lIExPQ0tfTE9DS0VECQkyCisKKyAgaW50IGluX3F1YWxpdHk7CQkvKiBJbnB1dCBzaWduYWwgcXVhbGl0eSAqLworI2RlZmluZSBJTl9RVUFMX05PVF9JTkRJQ0FURUQJMAorI2RlZmluZSBJTl9RVUFMX1BPT1IJCTEKKyNkZWZpbmUgSU5fUVVBTF9HT09ECQkyCisKKyAgaW50IGluX3ZiaXQsIG91dF92Yml0OwkvKiBWIGJpdHMgKi8KKyNkZWZpbmUgVkJJVF9OT1RfSU5ESUNBVEVECTAKKyNkZWZpbmUgVkJJVF9PRkYJCTEKKyNkZWZpbmUgVkJJVF9PTgkJCTIKKworICB1bnNpZ25lZCBpbnQgaW5fZXJyb3JzOwkvKiBWYXJpb3VzIGlucHV0IGVycm9yIGNvbmRpdGlvbnMgKi8KKyNkZWZpbmUgSU5FUlJfQ1JDCQkweDAwMDEKKyNkZWZpbmUgSU5FUlJfUUNPREVfQ1JDCQkweDAwMDIKKyNkZWZpbmUgSU5FUlJfUEFSSVRZCQkweDAwMDQKKyNkZWZpbmUgSU5FUlJfQklQSEFTRQkJMHgwMDA4CisKKyAgaW50IHNyYXRlX2luLCBzcmF0ZV9vdXQ7CisgIGludCBiaXRzX2luLCBiaXRzX291dDsKKworICBpbnQgZmlsbGVyWzMyXTsKK30gb3NzX2RpZ2l0YWxfY29udHJvbDsKKworI2RlZmluZSBTTkRDVExfRFNQX1JFQURDVEwJCV9fU0lPV1IoJ1AnLCAyNiwgb3NzX2RpZ2l0YWxfY29udHJvbCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9XUklURUNUTAkJX19TSU9XUignUCcsIDI3LCBvc3NfZGlnaXRhbF9jb250cm9sKQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFN5bmMgZ3JvdXBzIGZvciBhdWRpbyBkZXZpY2VzCisgKi8KK3R5cGVkZWYgc3RydWN0IG9zc19zeW5jZ3JvdXAKK3sKKyAgaW50IGlkOworICBpbnQgbW9kZTsKKyAgaW50IGZpbGxlclsxNl07Cit9IG9zc19zeW5jZ3JvdXA7CisKKyNkZWZpbmUgU05EQ1RMX0RTUF9TWU5DR1JPVVAJCV9fU0lPV1IoJ1AnLCAyOCwgb3NzX3N5bmNncm91cCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9TWU5DU1RBUlQJCV9fU0lPVyAoJ1AnLCAyOSwgaW50KQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAiY29va2VkIiBtb2RlIGVuYWJsZXMgc29mdHdhcmUgYmFzZWQgY29udmVyc2lvbnMgZm9yIHNhbXBsZSByYXRlLCBzYW1wbGUKKyAqIGZvcm1hdCAoYml0cykgYW5kIG51bWJlciBvZiBjaGFubmVscyAobW9uby9zdGVyZW8pLiBUaGVzZSBjb252ZXJzaW9ucyBhcmUKKyAqIHJlcXVpcmVkIHdpdGggc29tZSBkZXZpY2VzIHRoYXQgc3VwcG9ydCBvbmx5IG9uZSBzYW1wbGUgcmF0ZSBvciBqdXN0IHN0ZXJlbworICogdG8gbGV0IHRoZSBhcHBsaWNhdGlvbnMgdG8gdXNlIG90aGVyIGZvcm1hdHMuIFRoZSBjb29rZWQgbW9kZSBpcyBlbmFibGVkIGJ5CisgKiBkZWZhdWx0LiBIb3dldmVyIGl0J3MgbmVjZXNzYXJ5IHRvIGRpc2FibGUgdGhpcyBtb2RlIHdoZW4gbW1hcCgpIGlzIHVzZWQgb3IKKyAqIHdoZW4gdmVyeSBkZXRlcm1pbmlzdGljIHRpbWluZyBpcyByZXF1aXJlZC4gU05EQ1RMX0RTUF9DT09LRURNT0RFIGlzIGFuCisgKiBvcHRpb25hbCBjYWxsIGludHJvZHVjZWQgaW4gT1NTIDMuOS42Zi4gSXQncyBfZXJyb3IgcmV0dXJuIG11c3QgYmUgaWdub3JlZF8KKyAqIHNpbmNlIG5vcm1hbGx5IHRoaXMgY2FsbCB3aWxsIHJldHVybiBlcm5vPUVJTlZBTC4KKyAqCisgKiBTTkRDVExfRFNQX0NPT0tFRE1PREUgbXVzdCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgb3BlbiBiZWZvcmUgZG9pbmcKKyAqIGFueXRoaW5nIGVsc2UuIE90aGVyd2lzZSB0aGUgY2FsbCB3aWxsIG5vdCBoYXZlIGFueSBlZmZlY3QuCisgKi8KKyNkZWZpbmUgU05EQ1RMX0RTUF9DT09LRURNT0RFCQlfX1NJT1cgKCdQJywgMzAsIGludCkKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU05EQ1RMX0RTUF9TSUxFTkNFIGFuZCBTTkRDVExfRFNQX1NLSVAgYXJlIG5ldyBjYWxscyBpbiBPU1MgMy45OS4wCisgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBwYXVzZS9jb250aW51ZSBkdXJpbmcgcGxheWJhY2sgKG5vIGVmZmVjdAorICogb24gcmVjb3JkaW5nKS4KKyAqLworI2RlZmluZSBTTkRDVExfRFNQX1NJTEVOQ0UJCV9fU0lPICAoJ1AnLCAzMSkKKyNkZWZpbmUgU05EQ1RMX0RTUF9TS0lQCQkJX19TSU8gICgnUCcsIDMyKQorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBYm9ydCB0cmFuc2ZlciAocmVzZXQpIGZ1bmN0aW9ucyBmb3IgaW5wdXQgYW5kIG91dHB1dAorICovCisjZGVmaW5lIFNORENUTF9EU1BfSEFMVF9JTlBVVAkJX19TSU8gICgnUCcsIDMzKQorI2RlZmluZSBTTkRDVExfRFNQX1JFU0VUX0lOUFVUCVNORENUTF9EU1BfSEFMVF9JTlBVVAkvKiBPbGQgbmFtZSAqLworI2RlZmluZSBTTkRDVExfRFNQX0hBTFRfT1VUUFVUCQlfX1NJTyAgKCdQJywgMzQpCisjZGVmaW5lIFNORENUTF9EU1BfUkVTRVRfT1VUUFVUCVNORENUTF9EU1BfSEFMVF9PVVRQVVQJLyogT2xkIG5hbWUgKi8KKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTG93IHdhdGVyIGxldmVsIGNvbnRyb2wKKyAqLworI2RlZmluZSBTTkRDVExfRFNQX0xPV19XQVRFUgkJX19TSU9XICgnUCcsIDM0LCBpbnQpCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogNjQgYml0IHBvaW50ZXIgc3VwcG9ydC4gT25seSBhdmFpbGFibGUgaW4gZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydAorICogdGhlIDY0IGJpdCAobG9uZyBsb25nKSBpbnRlZ2VyIHR5cGUuCisgKi8KKyNpZm5kZWYgT1NTX05PX0xPTkdfTE9ORwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgbG9uZyBsb25nIHNhbXBsZXM7CisgIGludCBmaWZvX3NhbXBsZXM7CisgIGludCBmaWxsZXJbMzJdOwkJLyogRm9yIGZ1dHVyZSB1c2UgKi8KK30gb3NzX2NvdW50X3Q7CisKKyNkZWZpbmUgU05EQ1RMX0RTUF9DVVJSRU5UX0lQVFIJCV9fU0lPUiAoJ1AnLCAzNSwgb3NzX2NvdW50X3QpCisjZGVmaW5lIFNORENUTF9EU1BfQ1VSUkVOVF9PUFRSCQlfX1NJT1IgKCdQJywgMzYsIG9zc19jb3VudF90KQorI2VuZGlmCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW50ZXJmYWNlIGZvciBzZWxlY3RpbmcgcmVjb3JkaW5nIHNvdXJjZXMgYW5kIHBsYXliYWNrIG91dHB1dCByb3V0aW5ncy4KKyAqLworI2RlZmluZSBTTkRDVExfRFNQX0dFVF9SRUNTUkNfTkFNRVMJX19TSU9SICgnUCcsIDM3LCBvc3NfbWl4ZXJfZW51bWluZm8pCisjZGVmaW5lIFNORENUTF9EU1BfR0VUX1JFQ1NSQwkJX19TSU9SICgnUCcsIDM4LCBpbnQpCisjZGVmaW5lIFNORENUTF9EU1BfU0VUX1JFQ1NSQwkJX19TSU9XUignUCcsIDM4LCBpbnQpCisKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRfUExBWVRHVF9OQU1FUwlfX1NJT1IgKCdQJywgMzksIG9zc19taXhlcl9lbnVtaW5mbykKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRfUExBWVRHVAkJX19TSU9SICgnUCcsIDQwLCBpbnQpCisjZGVmaW5lIFNORENUTF9EU1BfU0VUX1BMQVlUR1QJCV9fU0lPV1IoJ1AnLCA0MCwgaW50KQorI2RlZmluZSBTTkRDVExfRFNQX0dFVFJFQ1ZPTAkJX19TSU9SICgnUCcsIDQxLCBpbnQpCisjZGVmaW5lIFNORENUTF9EU1BfU0VUUkVDVk9MCQlfX1NJT1dSKCdQJywgNDEsIGludCkKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNvbWUgY2FsbHMgZm9yIHNldHRpbmcgdGhlIGNoYW5uZWwgYXNzaWdubWVudCB3aXRoIG11bHRpIGNoYW5uZWwgZGV2aWNlcworICogKHNlZSB0aGUgbWFudWFsIGZvciBkZXRhaWxzKS4KKyAqLworI2lmbmRlZiBPU1NfTk9fTE9OR19MT05HCisjZGVmaW5lIFNORENUTF9EU1BfR0VUX0NITk9SREVSCQlfX1NJT1IgKCdQJywgNDIsIHVuc2lnbmVkIGxvbmcgbG9uZykKKyNkZWZpbmUgU05EQ1RMX0RTUF9TRVRfQ0hOT1JERVIJCV9fU0lPV1IoJ1AnLCA0MiwgdW5zaWduZWQgbG9uZyBsb25nKQorIwlkZWZpbmUgQ0hJRF9VTkRFRgkwCisjCWRlZmluZSBDSElEX0wJCTEKKyMJZGVmaW5lIENISURfUgkJMgorIwlkZWZpbmUgQ0hJRF9DCQkzCisjCWRlZmluZSBDSElEX0xGRQkJNAorIwlkZWZpbmUgQ0hJRF9MUwkJNQorIwlkZWZpbmUgQ0hJRF9SUwkJNgorIwlkZWZpbmUgQ0hJRF9MUgkJNworIwlkZWZpbmUgQ0hJRF9SUgkJOAorI2RlZmluZSBDSE5PUkRFUl9VTkRFRgkJMHgwMDAwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIENITk9SREVSX05PUk1BTAkJMHgwMDAwMDAwMDg3NjU0MzIxVUxMCisjZW5kaWYKKworI2RlZmluZSBNQVhfUEVBS19DSEFOTkVMUwkxMjgKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgb3NzX3BlYWtzX3RbTUFYX1BFQUtfQ0hBTk5FTFNdOworI2RlZmluZSBTTkRDVExfRFNQX0dFVElQRUFLUwkJX19TSU9SKCdQJywgNDMsIG9zc19wZWFrc190KQorI2RlZmluZSBTTkRDVExfRFNQX0dFVE9QRUFLUwkJX19TSU9SKCdQJywgNDQsIG9zc19wZWFrc190KQorCisjZGVmaW5lIFNORENUTF9EU1BfUE9MSUNZCQlfX1NJT1coJ1AnLCA0NSwgaW50KQkvKiBTZWUgdGhlIG1hbnVhbCAqLworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZldyBpb2N0bCBjYWxscyB0aGF0IGFyZSBub3Qgb2ZmaWNpYWwgcGFydHMgb2YgT1NTLiBUaGV5IGhhdmUgYmVlbiB1c2VkCisgKiBieSBmZXcgZnJlZXdhcmUgaW1wbGVtZW50YXRpb25zIG9mIE9TUy4KKyAqLworI2RlZmluZSBTTkRDVExfRFNQX0dFVENIQU5ORUxNQVNLCV9fU0lPV1IoJ1AnLCA2NCwgaW50KQorI2RlZmluZSBTTkRDVExfRFNQX0JJTkRfQ0hBTk5FTAkJX19TSU9XUignUCcsIDY1LCBpbnQpCisjICAgICBkZWZpbmUgRFNQX0JJTkRfUVVFUlkgICAgICAgICAgIDB4MDAwMDAwMDAKKyMgICAgIGRlZmluZSBEU1BfQklORF9GUk9OVCAgICAgICAgICAgMHgwMDAwMDAwMQorIyAgICAgZGVmaW5lIERTUF9CSU5EX1NVUlIgICAgICAgICAgICAweDAwMDAwMDAyCisjICAgICBkZWZpbmUgRFNQX0JJTkRfQ0VOVEVSX0xGRSAgICAgIDB4MDAwMDAwMDQKKyMgICAgIGRlZmluZSBEU1BfQklORF9IQU5EU0VUICAgICAgICAgMHgwMDAwMDAwOAorIyAgICAgZGVmaW5lIERTUF9CSU5EX01JQyAgICAgICAgICAgICAweDAwMDAwMDEwCisjICAgICBkZWZpbmUgRFNQX0JJTkRfTU9ERU0xICAgICAgICAgIDB4MDAwMDAwMjAKKyMgICAgIGRlZmluZSBEU1BfQklORF9NT0RFTTIgICAgICAgICAgMHgwMDAwMDA0MAorIyAgICAgZGVmaW5lIERTUF9CSU5EX0kyUyAgICAgICAgICAgICAweDAwMDAwMDgwCisjICAgICBkZWZpbmUgRFNQX0JJTkRfU1BESUYgICAgICAgICAgIDB4MDAwMDAxMDAKKyMgICAgIGRlZmluZSBEU1BfQklORF9SRUFSICAgICAgICAgICAgMHgwMDAwMDIwMAorCisjaWZkZWYgc3VuCisvKiBOb3QgcGFydCBvZiBPU1MuIFJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UgYnkgU29sYXJpcyAqLworI2RlZmluZSBYX1NBREFfR0VUX1BMQVlUR1RfTUFTSwlfX1NJT1IgKCdQJywgNjYsIGludCkKKyNkZWZpbmUgWF9TQURBX0dFVF9QTEFZVEdUCV9fU0lPUiAoJ1AnLCA2NywgaW50KQorI2RlZmluZSBYX1NBREFfU0VUX1BMQVlUR1QJX19TSU9XUignUCcsIDY4LCBpbnQpCisjZW5kaWYKKworI2lmbmRlZiBOT19MRUdBQ1lfTUlYRVIKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU9DVEwgY29tbWFuZHMgZm9yIHRoZSAibGVnYWN5ICIgL2Rldi9taXhlciBBUEkgKG9ic29sZXRlKQorICoKKyAqIE1peGVyIGNvbnRyb2xzCisgKgorICogVGhlcmUgY2FuIGJlIHVwIHRvIDIwIGRpZmZlcmVudCBhbmFsb2cgbWl4ZXIgY2hhbm5lbHMuIFRoZQorICogU09VTkRfTUlYRVJfTlJERVZJQ0VTIGdpdmVzIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIG1heGltdW0uIAorICogVGhlIFNPVU5EX01JWEVSX1JFQURfREVWTUFTSyByZXR1cm5zIGEgYml0bWFzayB3aGljaCB0ZWxscworICogdGhlIGRldmljZXMgc3VwcG9ydGVkIGJ5IHRoZSBwYXJ0aWN1bGFyIG1peGVyLgorICoKKyAqIHshbm90aWNlIFRoaXMgImxlZ2FjeSIgbWl4ZXIgQVBJIGlzIG9ic29sZXRlLiBJdCBoYXMgYmVlbiBzdXBlcmNlZGVkCisgKiBieSBhIG5ldyBvbmUgKHNlZSBiZWxvdykuCisgKi8KKworI2RlZmluZSBTT1VORF9NSVhFUl9OUkRFVklDRVMJMjgKKyNkZWZpbmUgU09VTkRfTUlYRVJfVk9MVU1FCTAKKyNkZWZpbmUgU09VTkRfTUlYRVJfQkFTUwkxCisjZGVmaW5lIFNPVU5EX01JWEVSX1RSRUJMRQkyCisjZGVmaW5lIFNPVU5EX01JWEVSX1NZTlRICTMKKyNkZWZpbmUgU09VTkRfTUlYRVJfUENNCQk0CisjZGVmaW5lIFNPVU5EX01JWEVSX1NQRUFLRVIJNQorI2RlZmluZSBTT1VORF9NSVhFUl9MSU5FCTYKKyNkZWZpbmUgU09VTkRfTUlYRVJfTUlDCQk3CisjZGVmaW5lIFNPVU5EX01JWEVSX0NECQk4CisjZGVmaW5lIFNPVU5EX01JWEVSX0lNSVgJOQkvKiAgUmVjb3JkaW5nIG1vbml0b3IgICovCisjZGVmaW5lIFNPVU5EX01JWEVSX0FMVFBDTQkxMAorI2RlZmluZSBTT1VORF9NSVhFUl9SRUNMRVYJMTEJLyogUmVjb3JkaW5nIGxldmVsICovCisjZGVmaW5lIFNPVU5EX01JWEVSX0lHQUlOCTEyCS8qIElucHV0IGdhaW4gKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfT0dBSU4JMTMJLyogT3V0cHV0IGdhaW4gKi8KKy8qIAorICogU29tZSBzb3VuZGNhcmRzIGhhdmUgdGhyZWUgbGluZSBsZXZlbCBpbnB1dHMgKGxpbmUsIGF1eDEgYW5kIGF1eDIpLiAKKyAqIFNpbmNlIGVhY2ggY2FyZCBtYW51ZmFjdHVyZXIgaGFzIGFzc2lnbmVkIGRpZmZlcmVudCBtZWFuaW5ncyB0byAKKyAqIHRoZXNlIGlucHV0cywgaXQncyBpbXByYWN0aWNhbCB0byBhc3NpZ24gc3BlY2lmaWMgbWVhbmluZ3MgCisgKiAoZWcgbGluZSwgY2QsIHN5bnRoIGV0Yy4pIHRvIHRoZW0uCisgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfTElORTEJMTQJLyogSW5wdXQgc291cmNlIDEgIChhdXgxKSAqLworI2RlZmluZSBTT1VORF9NSVhFUl9MSU5FMgkxNQkvKiBJbnB1dCBzb3VyY2UgMiAgKGF1eDIpICovCisjZGVmaW5lIFNPVU5EX01JWEVSX0xJTkUzCTE2CS8qIElucHV0IHNvdXJjZSAzICAobGluZSkgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfRElHSVRBTDEJMTcJLyogRGlnaXRhbCBJL08gMSAqLworI2RlZmluZSBTT1VORF9NSVhFUl9ESUdJVEFMMgkxOAkvKiBEaWdpdGFsIEkvTyAyICovCisjZGVmaW5lIFNPVU5EX01JWEVSX0RJR0lUQUwzCTE5CS8qIERpZ2l0YWwgSS9PIDMgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfUEhPTkUJMjAJLyogUGhvbmUgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfTU9OTwkyMQkvKiBNb25vIE91dHB1dCAqLworI2RlZmluZSBTT1VORF9NSVhFUl9WSURFTwkyMgkvKiBWaWRlby9UViAoYXVkaW8pIGluICovCisjZGVmaW5lIFNPVU5EX01JWEVSX1JBRElPCTIzCS8qIFJhZGlvIGluICovCisjZGVmaW5lIFNPVU5EX01JWEVSX0RFUFRICTI0CS8qIFN1cnJvdW5kIGRlcHRoICovCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQVJWT0wJMjUJLyogUmVhci9TdXJyb3VuZCBzcGVha2VyIHZvbCAqLworI2RlZmluZSBTT1VORF9NSVhFUl9DRU5URVJWT0wJMjYJLyogQ2VudGVyL0xGRSBzcGVha2VyIHZvbCAqLworI2RlZmluZSBTT1VORF9NSVhFUl9TSURFVk9MCTI3CS8qIFNpZGUtU3Vycm91bmQgKDhzcGVha2VyKSB2b2wgKi8KKworLyoKKyAqIFdhcm5pbmc6IFNPVU5EX01JWEVSX1NVUlJWT0wgaXMgYW4gb2xkIG5hbWUgb2YgU09VTkRfTUlYRVJfU0lERVZPTC4KKyAqICAgICAgICAgIFRoZXkgYXJlIGJvdGggYXNzaWduZWQgdG8gdGhlIHNhbWUgbWl4ZXIgY29udHJvbC4gRG9uJ3QKKyAqICAgICAgICAgIHVzZSBib3RoIGNvbnRyb2wgbmFtZXMgaW4gdGhlIHNhbWUgcHJvZ3JhbS9kcml2ZXIuCisgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfU1VSUlZPTAlTT1VORF9NSVhFUl9TSURFVk9MCisKKy8qIFNvbWUgb24vb2ZmIHNldHRpbmdzIChTT1VORF9TUEVDSUFMX01JTiAtIFNPVU5EX1NQRUNJQUxfTUFYKSAqLworLyogTm90IGNvdW50ZWQgdG8gU09VTkRfTUlYRVJfTlJERVZJQ0VTLCBidXQgdXNlIHRoZSBzYW1lIG51bWJlciBzcGFjZSAqLworI2RlZmluZSBTT1VORF9PTk9GRl9NSU4JCTI4CisjZGVmaW5lIFNPVU5EX09OT0ZGX01BWAkJMzAKKworLyogTm90ZSEJTnVtYmVyIDMxIGNhbm5vdCBiZSB1c2VkIHNpbmNlIHRoZSBzaWduIGJpdCBpcyByZXNlcnZlZCAqLworI2RlZmluZSBTT1VORF9NSVhFUl9OT05FCTMxCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHVuc3VwcG9ydGVkIG1hY3JvcyBhcmUgbm8gbG9uZ2VyIGZ1bmN0aW9uYWwuCisgKiBVc2UgU09VTkRfTUlYRVJfUFJJVkFURSMgbWFjcm9zIGluIGZ1dHVyZS4KKyAqLworI2RlZmluZSBTT1VORF9NSVhFUl9FTkhBTkNFCVNPVU5EX01JWEVSX05PTkUKKyNkZWZpbmUgU09VTkRfTUlYRVJfTVVURQlTT1VORF9NSVhFUl9OT05FCisjZGVmaW5lIFNPVU5EX01JWEVSX0xPVUQJU09VTkRfTUlYRVJfTk9ORQorCisjZGVmaW5lIFNPVU5EX0RFVklDRV9MQUJFTFMgXAorCXsiVm9sICAiLCAiQmFzcyAiLCAiVHJlYmxlIiwgIlN5bnRoIiwgIlBjbSAgIiwgIlNwZWFrZXIgIiwgIkxpbmUgIiwgXAorCSAiTWljICAiLCAiQ0QgICAiLCAiTWl4ICAiLCAiUGNtMiAiLCAiUmVjICAiLCAiSUdhaW4iLCAiT0dhaW4iLCBcCisJICJBdXgxIiwgIkF1eDIiLCAiQXV4MyIsICJEaWdpdGFsMSIsICJEaWdpdGFsMiIsICJEaWdpdGFsMyIsIFwKKwkgIlBob25lIiwgIk1vbm8iLCAiVmlkZW8iLCAiUmFkaW8iLCAiRGVwdGgiLCBcCisJICJSZWFyIiwgIkNlbnRlciIsICJTaWRlIn0KKworI2RlZmluZSBTT1VORF9ERVZJQ0VfTkFNRVMgXAorCXsidm9sIiwgImJhc3MiLCAidHJlYmxlIiwgInN5bnRoIiwgInBjbSIsICJzcGVha2VyIiwgImxpbmUiLCBcCisJICJtaWMiLCAiY2QiLCAibWl4IiwgInBjbTIiLCAicmVjIiwgImlnYWluIiwgIm9nYWluIiwgXAorCSAiYXV4MSIsICJhdXgyIiwgImF1eDMiLCAiZGlnMSIsICJkaWcyIiwgImRpZzMiLCBcCisJICJwaG9uZSIsICJtb25vIiwgInZpZGVvIiwgInJhZGlvIiwgImRlcHRoIiwgXAorCSAicmVhciIsICJjZW50ZXIiLCAic2lkZSJ9CisKKy8qCURldmljZSBiaXRtYXNrIGlkZW50aWZpZXJzCSovCisKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVDU1JDCTB4ZmYJLyogQXJnIGNvbnRhaW5zIGEgYml0IGZvciBlYWNoIHJlY29yZGluZyBzb3VyY2UgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfREVWTUFTSwkweGZlCS8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCBzdXBwb3J0ZWQgZGV2aWNlICovCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQ01BU0sJMHhmZAkvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggc3VwcG9ydGVkIHJlY29yZGluZyBzb3VyY2UgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfQ0FQUwkweGZjCisjCWRlZmluZSBTT1VORF9DQVBfRVhDTF9JTlBVVAkweDAwMDAwMDAxCS8qIE9ubHkgb25lIHJlY29yZGluZyBzb3VyY2UgYXQgYSB0aW1lICovCisjCWRlZmluZSBTT1VORF9DQVBfTk9MRUdBQ1kJMHgwMDAwMDAwNAkvKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkgKi8KKyMJZGVmaW5lIFNPVU5EX0NBUF9OT1JFQ1NSQwkweDAwMDAwMDA4CisjZGVmaW5lIFNPVU5EX01JWEVSX1NURVJFT0RFVlMJMHhmYgkvKiBNaXhlciBjaGFubmVscyBzdXBwb3J0aW5nIHN0ZXJlbyAqLworCisvKiBPU1MvRnJlZSBPTkxZICovCisjZGVmaW5lIFNPVU5EX01JWEVSX09VVFNSQyAgICAweGZhCS8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCBpbnB1dCBzb3VyY2UgdG8gb3V0cHV0ICovCisjZGVmaW5lIFNPVU5EX01JWEVSX09VVE1BU0sgICAweGY5CS8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCBzdXBwb3J0ZWQgaW5wdXQgc291cmNlIHRvIG91dHB1dCAqLworLyogT1NTL0ZyZWUgT05MWSAqLworCisvKglEZXZpY2UgbWFzayBiaXRzCSovCisKKyNkZWZpbmUgU09VTkRfTUFTS19WT0xVTUUJKDEgPDwgU09VTkRfTUlYRVJfVk9MVU1FKQorI2RlZmluZSBTT1VORF9NQVNLX0JBU1MJCSgxIDw8IFNPVU5EX01JWEVSX0JBU1MpCisjZGVmaW5lIFNPVU5EX01BU0tfVFJFQkxFCSgxIDw8IFNPVU5EX01JWEVSX1RSRUJMRSkKKyNkZWZpbmUgU09VTkRfTUFTS19TWU5USAkoMSA8PCBTT1VORF9NSVhFUl9TWU5USCkKKyNkZWZpbmUgU09VTkRfTUFTS19QQ00JCSgxIDw8IFNPVU5EX01JWEVSX1BDTSkKKyNkZWZpbmUgU09VTkRfTUFTS19TUEVBS0VSCSgxIDw8IFNPVU5EX01JWEVSX1NQRUFLRVIpCisjZGVmaW5lIFNPVU5EX01BU0tfTElORQkJKDEgPDwgU09VTkRfTUlYRVJfTElORSkKKyNkZWZpbmUgU09VTkRfTUFTS19NSUMJCSgxIDw8IFNPVU5EX01JWEVSX01JQykKKyNkZWZpbmUgU09VTkRfTUFTS19DRAkJKDEgPDwgU09VTkRfTUlYRVJfQ0QpCisjZGVmaW5lIFNPVU5EX01BU0tfSU1JWAkJKDEgPDwgU09VTkRfTUlYRVJfSU1JWCkKKyNkZWZpbmUgU09VTkRfTUFTS19BTFRQQ00JKDEgPDwgU09VTkRfTUlYRVJfQUxUUENNKQorI2RlZmluZSBTT1VORF9NQVNLX1JFQ0xFVgkoMSA8PCBTT1VORF9NSVhFUl9SRUNMRVYpCisjZGVmaW5lIFNPVU5EX01BU0tfSUdBSU4JKDEgPDwgU09VTkRfTUlYRVJfSUdBSU4pCisjZGVmaW5lIFNPVU5EX01BU0tfT0dBSU4JKDEgPDwgU09VTkRfTUlYRVJfT0dBSU4pCisjZGVmaW5lIFNPVU5EX01BU0tfTElORTEJKDEgPDwgU09VTkRfTUlYRVJfTElORTEpCisjZGVmaW5lIFNPVU5EX01BU0tfTElORTIJKDEgPDwgU09VTkRfTUlYRVJfTElORTIpCisjZGVmaW5lIFNPVU5EX01BU0tfTElORTMJKDEgPDwgU09VTkRfTUlYRVJfTElORTMpCisjZGVmaW5lIFNPVU5EX01BU0tfRElHSVRBTDEJKDEgPDwgU09VTkRfTUlYRVJfRElHSVRBTDEpCisjZGVmaW5lIFNPVU5EX01BU0tfRElHSVRBTDIJKDEgPDwgU09VTkRfTUlYRVJfRElHSVRBTDIpCisjZGVmaW5lIFNPVU5EX01BU0tfRElHSVRBTDMJKDEgPDwgU09VTkRfTUlYRVJfRElHSVRBTDMpCisjZGVmaW5lIFNPVU5EX01BU0tfTU9OTwkJKDEgPDwgU09VTkRfTUlYRVJfTU9OTykKKyNkZWZpbmUgU09VTkRfTUFTS19QSE9ORQkoMSA8PCBTT1VORF9NSVhFUl9QSE9ORSkKKyNkZWZpbmUgU09VTkRfTUFTS19SQURJTwkoMSA8PCBTT1VORF9NSVhFUl9SQURJTykKKyNkZWZpbmUgU09VTkRfTUFTS19WSURFTwkoMSA8PCBTT1VORF9NSVhFUl9WSURFTykKKyNkZWZpbmUgU09VTkRfTUFTS19ERVBUSAkoMSA8PCBTT1VORF9NSVhFUl9ERVBUSCkKKyNkZWZpbmUgU09VTkRfTUFTS19SRUFSVk9MCSgxIDw8IFNPVU5EX01JWEVSX1JFQVJWT0wpCisjZGVmaW5lIFNPVU5EX01BU0tfQ0VOVEVSVk9MCSgxIDw8IFNPVU5EX01JWEVSX0NFTlRFUlZPTCkKKyNkZWZpbmUgU09VTkRfTUFTS19TSURFVk9MCSgxIDw8IFNPVU5EX01JWEVSX1NJREVWT0wpCisKKy8qIE5vdGUhIFNPVU5EX01BU0tfU1VSUlZPTCBpcyBhbGlhcyBvZiBTT1VORF9NQVNLX1NJREVWT0wgKi8KKyNkZWZpbmUgU09VTkRfTUFTS19TVVJSVk9MCSgxIDw8IFNPVU5EX01JWEVSX1NJREVWT0wpCisKKy8qIE9ic29sZXRlIG1hY3JvcyAqLworI2RlZmluZSBTT1VORF9NQVNLX01VVEUJCSgxIDw8IFNPVU5EX01JWEVSX01VVEUpCisjZGVmaW5lIFNPVU5EX01BU0tfRU5IQU5DRQkoMSA8PCBTT1VORF9NSVhFUl9FTkhBTkNFKQorI2RlZmluZSBTT1VORF9NQVNLX0xPVUQJCSgxIDw8IFNPVU5EX01JWEVSX0xPVUQpCisKKyNkZWZpbmUgTUlYRVJfUkVBRChkZXYpCQkJX19TSU9SKCdNJywgZGV2LCBpbnQpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfVk9MVU1FCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1ZPTFVNRSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9CQVNTCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0JBU1MpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfVFJFQkxFCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1RSRUJMRSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9TWU5USAkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9TWU5USCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9QQ00JCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfUENNKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX1NQRUFLRVIJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9TUEVBS0VSKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX0xJTkUJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfTElORSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9NSUMJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfTUlDKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX0NECQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0NEKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX0lNSVgJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfSU1JWCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9BTFRQQ00JCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfQUxUUENNKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX1JFQ0xFVgkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9SRUNMRVYpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfSUdBSU4JCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfSUdBSU4pCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfT0dBSU4JCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfT0dBSU4pCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfTElORTEJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfTElORTEpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfTElORTIJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfTElORTIpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfTElORTMJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfTElORTMpCisKKy8qIE9ic29sZXRlIG1hY3JvcyAqLworI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX01VVEUJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfTVVURSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9FTkhBTkNFCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfRU5IQU5DRSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9MT1VECQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0xPVUQpCisKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9SRUNTUkMJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfUkVDU1JDKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX0RFVk1BU0sJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9ERVZNQVNLKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX1JFQ01BU0sJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9SRUNNQVNLKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX1NURVJFT0RFVlMJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9TVEVSRU9ERVZTKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX0NBUFMJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfQ0FQUykKKworI2RlZmluZSBNSVhFUl9XUklURShkZXYpCQlfX1NJT1dSKCdNJywgZGV2LCBpbnQpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX1ZPTFVNRQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9WT0xVTUUpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0JBU1MJCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0JBU1MpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX1RSRUJMRQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9UUkVCTEUpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX1NZTlRICQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9TWU5USCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfUENNCQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9QQ00pCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX1NQRUFLRVIJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfU1BFQUtFUikKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfTElORQkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfTElORSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfTUlDCQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9NSUMpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0NECQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9DRCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfSU1JWAkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfSU1JWCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfQUxUUENNCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0FMVFBDTSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfUkVDTEVWCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX1JFQ0xFVikKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfSUdBSU4JCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0lHQUlOKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9PR0FJTgkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfT0dBSU4pCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0xJTkUxCQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9MSU5FMSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfTElORTIJCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xJTkUyKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9MSU5FMwkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfTElORTMpCisKKy8qIE9ic29sZXRlIG1hY3JvcyAqLworI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9NVVRFCQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9NVVRFKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9FTkhBTkNFCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0VOSEFOQ0UpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0xPVUQJCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xPVUQpCisKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfUkVDU1JDCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX1JFQ1NSQykKKwordHlwZWRlZiBzdHJ1Y3QgbWl4ZXJfaW5mbwkvKiBPQlNPTEVURSAqLworeworICBjaGFyIGlkWzE2XTsKKyAgY2hhciBuYW1lWzMyXTsKKyAgaW50IG1vZGlmeV9jb3VudGVyOworICBpbnQgY2FyZF9udW1iZXI7CisgIGludCBwb3J0X251bWJlcjsKKyAgY2hhciBoYW5kbGVbMzJdOworfSBtaXhlcl9pbmZvOworCisvKiBTT1VORF9NSVhFUl9JTkZPIGlzIG9ic29sZXRlIC0gdXNlIFNORENUTF9NSVhFUklORk8gaW5zdGVhZCAqLworI2RlZmluZSBTT1VORF9NSVhFUl9JTkZPCQlfX1NJT1IgKCdNJywgMTAxLCBtaXhlcl9pbmZvKQorCisvKgorICogVHdvIGlvY3RscyBmb3Igc3BlY2lhbCBzb3VuY2FyZCBmdW5jdGlvbiAoT1NTL0ZyZWUgb25seSkKKyAqLworI2RlZmluZSBTT1VORF9NSVhFUl9BR0MgIF9TSU9XUignTScsIDEwMywgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl8zRFNFICBfU0lPV1IoJ00nLCAxMDQsIGludCkKKy8qCisgKiBUaGUgU09VTkRfTUlYRVJfUFJJVkFURSMgY29tbWFuZHMgY2FuIGJlIHJlZGVmaW5lZCBieSBsb3cgbGV2ZWwgZHJpdmVycy4KKyAqIFRoZXNlIGZlYXR1cmVzIGNhbiBiZSB1c2VkIHdoZW4gYWNjZXNzaW5nIGRldmljZSBzcGVjaWZpYyBmZWF0dXJlcy4KKyAqLworI2RlZmluZSBTT1VORF9NSVhFUl9QUklWQVRFMQkJX19TSU9XUignTScsIDExMSwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9QUklWQVRFMgkJX19TSU9XUignTScsIDExMiwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9QUklWQVRFMwkJX19TSU9XUignTScsIDExMywgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9QUklWQVRFNAkJX19TSU9XUignTScsIDExNCwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9QUklWQVRFNQkJX19TSU9XUignTScsIDExNSwgaW50KQorCisvKiBUaGUgZm9sbG93aW5nIHR3byBjb250cm9scyB3ZXJlIG5ldmVyIGltcGxlbWVudGVkIGFuZCB0aGV5IHNob3VsZCBub3QgYmUgdXNlZC4gKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9NQUlOVk9MCQlfX1NJT1IgKCdNJywgMTE2LCBpbnQpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX01BSU5WT0wJCV9fU0lPV1IoJ00nLCAxMTYsIGludCkKKworLyoKKyAqIFNPVU5EX01JWEVSX0dFVExFVkVMUyBhbmQgU09VTkRfTUlYRVJfU0VUTEVWRUxTIGNhbGxzIGNhbiBiZSB1c2VkCisgKiBmb3IgcXVlcnlpbmcgY3VycmVudCBtaXhlciBzZXR0aW5ncyBmcm9tIHRoZSBkcml2ZXIgYW5kIGZvciBsb2FkaW5nCisgKiBkZWZhdWx0IHZvbHVtZSBzZXR0aW5ncyBfcHJpb3JfIGFjdGl2YXRpbmcgdGhlIG1peGVyIChsb2FkaW5nCisgKiBkb2Vzbid0IGFmZmVjdCBjdXJyZW50IHN0YXRlIG9mIHRoZSBtaXhlciBoYXJkd2FyZSkuIFRoZXNlIGNhbGxzCisgKiBhcmUgZm9yIGludGVybmFsIHVzZSBieSB0aGUgZHJpdmVyIHNvZnR3YXJlIG9ubHkuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbWl4ZXJfdm9sX3RhYmxlCit7CisgIGludCBudW07CQkJLyogSW5kZXggdG8gdm9sdW1lIHRhYmxlICovCisgIGNoYXIgbmFtZVszMl07CisgIGludCBsZXZlbHNbMzJdOworfSBtaXhlcl92b2xfdGFibGU7CisKKyNkZWZpbmUgU09VTkRfTUlYRVJfR0VUTEVWRUxTCQlfX1NJT1dSKCdNJywgMTE2LCBtaXhlcl92b2xfdGFibGUpCisjZGVmaW5lIFNPVU5EX01JWEVSX1NFVExFVkVMUwkJX19TSU9XUignTScsIDExNywgbWl4ZXJfdm9sX3RhYmxlKQorCisjZGVmaW5lIE9TU19HRVRWRVJTSU9OCQkJX19TSU9SICgnTScsIDExOCwgaW50KQorCisvKgorICogQ2FsbHMgdG8gc2V0L2dldCB0aGUgcmVjb3JkaW5nIGdhaW4gZm9yIHRoZSBjdXJyZW50bHkgYWN0aXZlCisgKiByZWNvcmRpbmcgc291cmNlLiBUaGVzZSBjYWxscyBhdXRvbWF0aWNhbGx5IG1hcCB0byB0aGUgcmlnaHQgY29udHJvbC4KKyAqIE5vdGUgdGhhdCB0aGVzZSBjYWxscyBhcmUgbm90IHN1cHBvcnRlZCBieSBhbGwgZHJpdmVycy4gSW4gdGhpcyBjYXNlCisgKiB0aGUgY2FsbCB3aWxsIHJldHVybiAtMSB3aXRoIGVycm5vIHNldCB0byBFSU5WQUwKKyAqCisgKiBUaGUgX01PTkdBSU4gd29yayBpbiBzaW1pbGFyIHdheSBidXQgc2V0L2dldCB0aGUgbW9uaXRvcmluZyBnYWluIGZvcgorICogdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByZWNvcmRpbmcgc291cmNlLgorICovCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfUkVDR0FJTglfX1NJT1IgKCdNJywgMTE5LCBpbnQpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX1JFQ0dBSU4JX19TSU9XUignTScsIDExOSwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX01PTkdBSU4JX19TSU9SICgnTScsIDEyMCwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9NT05HQUlOCV9fU0lPV1IoJ00nLCAxMjAsIGludCkKKworLyogVGhlIGZvbGxvd2luZyBjYWxsIGlzIGZvciBkcml2ZXIgZGV2ZWxvcG1lbnQgdGltZSBwdXJwb3Nlcy4gSXQncyBub3QKKyAqIHByZXNlbnQgaW4gYW55IHJlbGVhc2VkIGRyaXZlcnMuCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBvc3NfcmVzZXJ2ZWRfdFs1MTJdOworI2RlZmluZSBTT1VORF9NSVhFUl9SRVNFUlZFRAkJX19TSU9XUignTScsIDEyMSwgb3NzX3Jlc2VydmVkX3QpCisjZW5kaWYgLyogaWZuZGVmIE5PX0xFR0FDWV9NSVhFUiAqLworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZSAibmV3IiBtaXhlciBBUEkgb2YgT1NTIDQuMCBhbmQgbGF0ZXIuCisgKgorICogVGhpcyBpbXByb3ZlZCBtaXhlciBBUEkgbWFrZXMgaXQgcG9zc2libGUgdG8gYWNjZXNzIGV2ZXJ5IHBvc3NpYmxlIGZlYXR1cmUKKyAqIG9mIGV2ZXJ5IHBvc3NpYmxlIGRldmljZS4gSG93ZXZlciB5b3Ugc2hvdWxkIHJlYWQgdGhlIG1peGVyIHByb2dyYW1taW5nCisgKiBzZWN0aW9uIG9mIHRoZSBPU1MgQVBJIERldmVsb3BlcidzIE1hbnVhbC4gVGhlcmUgaXMgbm8gY2hhbmNlIHRoYXQgeW91CisgKiBjb3VsZCB1c2UgdGhpcyBpbnRlcmZhY2UgY29ycmVjdGx5IGp1c3QgYnkgZXhhbWluaW5nIHRoaXMgaGVhZGVyLgorICovCisKK3R5cGVkZWYgc3RydWN0IG9zc19zeXNpbmZvCit7CisgIGNoYXIgcHJvZHVjdFszMl07CQkvKiBGb3IgZXhhbXBsZSBPU1MvRnJlZSwgT1NTL0xpbnV4IG9yIE9TUy9Tb2xhcmlzICovCisgIGNoYXIgdmVyc2lvblszMl07CQkvKiBGb3IgZXhhbXBsZSA0LjBhICovCisgIGludCB2ZXJzaW9ubnVtOwkJLyogU2VlIE9TU19HRVRWRVJTSU9OICovCisgIGNoYXIgb3B0aW9uc1sxMjhdOwkJLyogUmVzZXJ2ZWQgKi8KKworICBpbnQgbnVtYXVkaW9zOwkJLyogIyBvZiBhdWRpby9kc3AgZGV2aWNlcyAqLworICBpbnQgb3BlbmVkYXVkaW9bOF07CQkvKiBCaXQgbWFzayB0ZWxsaW5nIHdoaWNoIGF1ZGlvIGRldmljZXMgYXJlIGJ1c3kgKi8KKworICBpbnQgbnVtc3ludGhzOwkJLyogIyBvZiBhdmFpbGF2bGUgc3ludGggZGV2aWNlcyAqLworICBpbnQgbnVtbWlkaXM7CQkJLyogIyBvZiBhdmFpbGFibGUgTUlESSBwb3J0cyAqLworICBpbnQgbnVtdGltZXJzOwkJLyogIyBvZiBhdmFpbGFibGUgdGltZXIgZGV2aWNlcyAqLworICBpbnQgbnVtbWl4ZXJzOwkJLyogIyBvZiBtaXhlciBkZXZpY2VzICovCisKKyAgaW50IG9wZW5lZG1pZGlbOF07CQkvKiBCaXQgbWFzayB0ZWxsaW5nIHdoaWNoIG1pZGkgZGV2aWNlcyBhcmUgYnVzeSAqLworICBpbnQgbnVtY2FyZHM7CQkJLyogTnVtYmVyIG9mIHNvdW5kIGNhcmRzIGluIHRoZSBzeXN0ZW0gKi8KKyAgaW50IG51bWF1ZGlvZW5naW5lczsJCS8qIE51bWJlciBvZiBhdWRpbyBlbmdpbmVzIGluIHRoZSBzeXN0ZW0gKi8KKyAgY2hhciBsaWNlbnNlWzE2XTsJCS8qIEZvciBleGFtcGxlICJHUEwiIG9yICJDRERMIiAqLworICBpbnQgZmlsbGVyWzIzNl07CQkvKiBGb3IgZnV0dXJlIGV4cGFuc2lvbiAoc2V0IHRvIC0xKSAqLworfSBvc3Nfc3lzaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgb3NzX21peGV4dAoreworICBpbnQgZGV2OwkJCS8qIE1peGVyIGRldmljZSBudW1iZXIgKi8KKyAgaW50IGN0cmw7CQkJLyogQ29udHJvbGxlciBudW1iZXIgKi8KKyAgaW50IHR5cGU7CQkJLyogRW50cnkgdHlwZSAqLworIwlkZWZpbmUgTUlYVF9ERVZST09UCSAwCS8qIERldmljZSByb290IGVudHJ5ICovCisjCWRlZmluZSBNSVhUX0dST1VQCSAxCS8qIENvbnRyb2xsZXIgZ3JvdXAgKi8KKyMJZGVmaW5lIE1JWFRfT05PRkYJIDIJLyogT0ZGICgwKSBvciBPTiAoMSkgKi8KKyMJZGVmaW5lIE1JWFRfRU5VTQkgMwkvKiBFbnVtZXJhdGVkICgwIHRvIG1heHZhbHVlKSAqLworIwlkZWZpbmUgTUlYVF9NT05PU0xJREVSCSA0CS8qIE1vbm8gc2xpZGVyICgwIHRvIDI1NSkgKi8KKyMJZGVmaW5lIE1JWFRfU1RFUkVPU0xJREVSIDUJLyogU3RlcmVvIHNsaWRlciAoZHVhbCAwIHRvIDI1NSkgKi8KKyMJZGVmaW5lIE1JWFRfTUVTU0FHRQkgNgkvKiAoUmVhZGFibGUpIHRleHR1YWwgbWVzc2FnZSAqLworIwlkZWZpbmUgTUlYVF9NT05PVlUJIDcJLyogVlUgbWV0ZXIgdmFsdWUgKG1vbm8pICovCisjCWRlZmluZSBNSVhUX1NURVJFT1ZVCSA4CS8qIFZVIG1ldGVyIHZhbHVlIChzdGVyZW8pICovCisjCWRlZmluZSBNSVhUX01PTk9QRUFLCSA5CS8qIFZVIG1ldGVyIHBlYWsgdmFsdWUgKG1vbm8pICovCisjCWRlZmluZSBNSVhUX1NURVJFT1BFQUsJMTAJLyogVlUgbWV0ZXIgcGVhayB2YWx1ZSAoc3RlcmVvKSAqLworIwlkZWZpbmUgTUlYVF9SQURJT0dST1VQCTExCS8qIFJhZGlvIGJ1dHRvbiBncm91cCAqLworIwlkZWZpbmUgTUlYVF9NQVJLRVIJMTIJLyogU2VwYXJhdG9yIGJldHdlZW4gbm9ybWFsIGFuZCBleHRlbnNpb24gZW50cmllcyAqLworIwlkZWZpbmUgTUlYVF9WQUxVRQkxMwkvKiBEZWNpbWFsIHZhbHVlIGVudHJ5ICovCisjCWRlZmluZSBNSVhUX0hFWFZBTFVFCTE0CS8qIEhleGFkZWNpbWFsIHZhbHVlIGVudHJ5ICovCisjCWRlZmluZSBNSVhUX01PTk9EQgkxNQkvKiBPQlNPTEVURSAqLworIwlkZWZpbmUgTUlYVF9TVEVSRU9EQgkxNgkvKiBPQlNPTEVURSAqLworIwlkZWZpbmUgTUlYVF9TTElERVIJMTcJLyogU2xpZGVyIChtb25vKSB3aXRoIGZ1bGwgKDMxIGJpdCkgcG9zdGl0aXZlIGludGVnZXIgcmFuZ2UgKi8KKyMJZGVmaW5lIE1JWFRfM0QJCTE4CisKKy8qCisgKiBTbGlkZXJzIHdpdGggcmFuZ2UgZXhwYW5kZWQgdG8gMTUgYml0cyBwZXIgY2hhbm5lbCAoMC0zMjc2NykKKyAqLworIwlkZWZpbmUgTUlYVF9NT05PU0xJREVSMTYJMTkKKyMJZGVmaW5lIE1JWFRfU1RFUkVPU0xJREVSMTYJMjAKKyMJZGVmaW5lIE1JWFRfTVVURQkyMQkvKiBNdXRlPTEsIHVubXV0ZT0wICovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qIFBvc3NpYmxlIHZhbHVlIHJhbmdlIChtaW52YWx1ZSB0byBtYXh2YWx1ZSkgKi8KKyAgLyogTm90ZSB0aGF0IG1heHZhbHVlIG1heSBhbHNvIGJlIHNtYWxsZXIgdGhhbiBtaW52YWx1ZSAqLworICBpbnQgbWF4dmFsdWU7CisgIGludCBtaW52YWx1ZTsKKworICBpbnQgZmxhZ3M7CisjCWRlZmluZSBNSVhGX1JFQURBQkxFCTB4MDAwMDAwMDEJLyogSGFzIHJlYWRhYmxlIHZhbHVlICovCisjCWRlZmluZSBNSVhGX1dSSVRFQUJMRQkweDAwMDAwMDAyCS8qIEhhcyB3cml0ZWFibGUgdmFsdWUgKi8KKyMJZGVmaW5lIE1JWEZfUE9MTAkweDAwMDAwMDA0CS8qIE1heSBjaGFuZ2UgaXRzZWxmICovCisjCWRlZmluZSBNSVhGX0haCQkweDAwMDAwMDA4CS8qIEhlcnogc2NhbGUgKi8KKyMJZGVmaW5lIE1JWEZfU1RSSU5HCTB4MDAwMDAwMTAJLyogVXNlIGR5bmFtaWMgZXh0ZW5zaW9ucyBmb3IgdmFsdWUgKi8KKyMJZGVmaW5lIE1JWEZfRFlOQU1JQwkweDAwMDAwMDEwCS8qIFN1cHBvcnRzIGR5bmFtaWMgZXh0ZW5zaW9ucyAqLworIwlkZWZpbmUgTUlYRl9PS0ZBSUwJMHgwMDAwMDAyMAkvKiBJbnRlcnByZXQgdmFsdWUgYXMgMT1PSywgMD1GQUlMICovCisjCWRlZmluZSBNSVhGX0ZMQVQJMHgwMDAwMDA0MAkvKiBGbGF0IHZlcnRpY2FsIHNwYWNlIHJlcXVpcmVtZW50cyAqLworIwlkZWZpbmUgTUlYRl9MRUdBQ1kJMHgwMDAwMDA4MAkvKiBMZWdhY3kgbWl4ZXIgY29udHJvbCBncm91cCAqLworIwlkZWZpbmUgTUlYRl9DRU5USUJFTAkweDAwMDAwMTAwCS8qIENlbnRpYmVsICgwLjEgZEIpIHN0ZXAgc2l6ZSAqLworIwlkZWZpbmUgTUlYRl9ERUNJQkVMCTB4MDAwMDAyMDAJLyogU3RlcCBzaXplIG9mIDEgZEIgKi8KKyMJZGVmaW5lIE1JWEZfTUFJTlZPTAkweDAwMDAwNDAwCS8qIE1haW4gdm9sdW1lIGNvbnRyb2wgKi8KKyMJZGVmaW5lIE1JWEZfUENNVk9MCTB4MDAwMDA4MDAJLyogUENNIG91dHB1dCB2b2x1bWUgY29udHJvbCAqLworIwlkZWZpbmUgTUlYRl9SRUNWT0wJMHgwMDAwMTAwMAkvKiBQQ00gcmVjb3JkaW5nIHZvbHVtZSBjb250cm9sICovCisjCWRlZmluZSBNSVhGX01PTlZPTAkweDAwMDAyMDAwCS8qIElucHV0LT5vdXRwdXQgbW9uaXRvciB2b2x1bWUgKi8KKyMJZGVmaW5lIE1JWEZfV0lERQkweDAwMDA0MDAwCS8qIEVudW0gY29udHJvbCBoYXMgd2lkZSBsYWJlbHMgKi8KKyMJZGVmaW5lIE1JWEZfREVTQ1IJMHgwMDAwODAwMAkvKiBEZXNjcmlwdGlvbiAodG9vbHRpcCkgYXZhaWxhYmxlICovCisgIGNoYXIgaWRbMTZdOwkJCS8qIE1uZW1vbmljIElEIChtYWlubHkgZm9yIGludGVybmFsIHVzZSkgKi8KKyAgaW50IHBhcmVudDsJCQkvKiBFbnRyeSMgb2YgcGFyZW50IChncm91cCkgbm9kZSAoLTEgaWYgcm9vdCkgKi8KKworICBpbnQgZHVtbXk7CQkJLyogSW50ZXJuYWwgdXNlICovCisKKyAgaW50IHRpbWVzdGFtcDsKKworICBjaGFyIGRhdGFbNjRdOwkJLyogTWlzYyBkYXRhIChlbnRyeSB0eXBlIGRlcGVuZGVudCkgKi8KKyAgdW5zaWduZWQgY2hhciBlbnVtX3ByZXNlbnRbMzJdOwkvKiBNYXNrIG9mIGFsbG93ZWQgZW51bSB2YWx1ZXMgKi8KKyAgaW50IGNvbnRyb2xfbm87CQkvKiBTT1VORF9NSVhFUl9WT0xVTUUuLlNPVU5EX01JWEVSX01JREkgKi8KKyAgLyogKC0xIG1lYW5zIG5vdCBpbmRpY2F0ZWQpICovCisKKy8qCisgKiBUaGUgZGVzYyBmaWVsZCBpcyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgcHVycG9zZXMgb2YgT1NTLiBJdCBzaG91bGQgbm90IGJlIAorICogdXNlZCBieSBhcHBsaWNhdGlvbnMuCisgKi8KKyAgdW5zaWduZWQgaW50IGRlc2M7CisjZGVmaW5lIE1JWEVYVF9TQ09QRV9NQVNLCQkJMHgwMDAwMDAzZgorI2RlZmluZSBNSVhFWFRfU0NPUEVfT1RIRVIJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1JWEVYVF9TQ09QRV9JTlBVVAkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTUlYRVhUX1NDT1BFX09VVFBVVAkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUlYRVhUX1NDT1BFX01PTklUT1IJCQkweDAwMDAwMDAzCisjZGVmaW5lIE1JWEVYVF9TQ09QRV9SRUNTV0lUQ0gJCQkweDAwMDAwMDA0CisKKyAgY2hhciBleHRuYW1lWzMyXTsKKyAgaW50IHVwZGF0ZV9jb3VudGVyOworICBpbnQgcmdiY29sb3I7CQkvKiAwIG1lYW5zIGRlZmF1bHQgY29sb3IgKG5vdCBibGFjaykgLiBPdGhlcndpc2UgMjQgYml0IFJHQiBjb2xvciAqLworICBpbnQgZmlsbGVyWzZdOworfSBvc3NfbWl4ZXh0OworCisvKgorICogUmVjb21tZW5kZWQgY29sb3JzIHRvIGJlIHVzZWQgaW4gdGhlIHJnYmNvbG9yIGZpZWxkLiBUaGVzZSBtYXRjaCB0aGUKKyAqIGNvbG9ycyB1c2VkIGFzIHRoZSBhdWRpbyBqYWNrIGNvbG9ycyBpbiBIRCBhdWRpbyBtb3RoZXJib2FyZHMuCisgKi8KKyNkZWZpbmUgT1NTX1JHQl9CTFVFCTB4N2FhYmRlCQkvLyBMaWdodCBibHVlCisjZGVmaW5lIE9TU19SR0JfR1JFRU4JMHhiM2M5OGMJCS8vIExpbWUgZ3JlZW4KKyNkZWZpbmUgT1NTX1JHQl9QSU5LCTB4ZTg4Yzk5CisjZGVmaW5lIE9TU19SR0JfR1JBWQkweGQxY2NjNAorI2RlZmluZSBPU1NfUkdCX0JMQUNLCTB4MmIyOTI2CQkvLyBMaWdodCBibGFjaworI2RlZmluZSBPU1NfUkdCX09SQU5HRQkweGU4OWU0NworI2RlZmluZSBPU1NfUkdCX1JFRAkweGZmMDAwMAorI2RlZmluZSBPU1NfUkdCX1lFTExPVwkweGZmZmYwMAorI2RlZmluZSBPU1NfUkdCX1BVUlBMRQkweDgwMDA4MAorI2RlZmluZSBPU1NfUkdCX1dISVRFCTB4ZjhmOGZmCisKK3R5cGVkZWYgc3RydWN0IG9zc19taXhleHRfcm9vdAoreworICBjaGFyIGlkWzE2XTsKKyAgY2hhciBuYW1lWzQ4XTsKK30gb3NzX21peGV4dF9yb290OworCit0eXBlZGVmIHN0cnVjdCBvc3NfbWl4ZXJfdmFsdWUKK3sKKyAgaW50IGRldjsKKyAgaW50IGN0cmw7CisgIGludCB2YWx1ZTsKKyAgaW50IGZsYWdzOwkJCS8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBJbml0aWFsaXplIHRvIDAgKi8KKyAgaW50IHRpbWVzdGFtcDsJCS8qIE11c3QgYmUgc2V0IHRvIG9zc19taXhleHQudGltZXN0YW1wICovCisgIGludCBmaWxsZXJbOF07CQkvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gSW5pdGlhbGl6ZSB0byAwICovCit9IG9zc19taXhlcl92YWx1ZTsKKworI2RlZmluZSBPU1NfRU5VTV9NQVhWQUxVRQkyNTUKKyNkZWZpbmUgT1NTX0VOVU1fU1RSSU5HU0laRQkzMDAwCit0eXBlZGVmIHN0cnVjdCBvc3NfbWl4ZXJfZW51bWluZm8KK3sKKyAgaW50IGRldjsKKyAgaW50IGN0cmw7CisgIGludCBudmFsdWVzOworICBpbnQgdmVyc2lvbjsJCQkvKiBSZWFkIHRoZSBtYW51YWwgKi8KKyAgc2hvcnQgc3RyaW5kZXhbT1NTX0VOVU1fTUFYVkFMVUVdOworICBjaGFyIHN0cmluZ3NbT1NTX0VOVU1fU1RSSU5HU0laRV07Cit9IG9zc19taXhlcl9lbnVtaW5mbzsKKworI2RlZmluZSBPUEVOX1JFQUQJUENNX0VOQUJMRV9JTlBVVAorI2RlZmluZSBPUEVOX1dSSVRFCVBDTV9FTkFCTEVfT1VUUFVUCisjZGVmaW5lIE9QRU5fUkVBRFdSSVRFCShPUEVOX1JFQUR8T1BFTl9XUklURSkKKwordHlwZWRlZiBzdHJ1Y3Qgb3NzX2F1ZGlvaW5mbworeworICBpbnQgZGV2OwkJCS8qIEF1ZGlvIGRldmljZSBudW1iZXIgKi8KKyAgY2hhciBuYW1lWzY0XTsKKyAgaW50IGJ1c3k7CQkJLyogMCwgT1BFTl9SRUFELCBPUEVOX1dSSVRFIG9yIE9QRU5fUkVBRFdSSVRFICovCisgIGludCBwaWQ7CisgIGludCBjYXBzOwkJCS8qIFBDTV9DQVBfSU5QVVQsIFBDTV9DQVBfT1VUUFVUICovCisgIGludCBpZm9ybWF0cywgb2Zvcm1hdHM7CisgIGludCBtYWdpYzsJCQkvKiBSZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlICovCisgIGNoYXIgY21kWzY0XTsJCQkvKiBDb21tYW5kIHVzaW5nIHRoZSBkZXZpY2UgKGlmIGtub3duKSAqLworICBpbnQgY2FyZF9udW1iZXI7CisgIGludCBwb3J0X251bWJlcjsKKyAgaW50IG1peGVyX2RldjsKKyAgaW50IGxlZ2FjeV9kZXZpY2U7CQkvKiBPYnNvbGV0ZSBmaWVsZC4gUmVwbGFjZWQgYnkgZGV2bm9kZSAqLworICBpbnQgZW5hYmxlZDsJCQkvKiAxPWVuYWJsZWQsIDA9ZGV2aWNlIG5vdCByZWFkeSBhdCB0aGlzIG1vbWVudCAqLworICBpbnQgZmxhZ3M7CQkJLyogRm9yIGludGVybmFsIHVzZSBvbmx5IC0gbm8gcHJhY3RpY2FsIG1lYW5pbmcgKi8KKyAgaW50IG1pbl9yYXRlLCBtYXhfcmF0ZTsJLyogU2FtcGxlIHJhdGUgbGltaXRzICovCisgIGludCBtaW5fY2hhbm5lbHMsIG1heF9jaGFubmVsczsJLyogTnVtYmVyIG9mIGNoYW5uZWxzIHN1cHBvcnRlZCAqLworICBpbnQgYmluZGluZzsJCQkvKiBEU1BfQklORF9GUk9OVCwgZXRjLiAwIG1lYW5zIHVuZGVmaW5lZCAqLworICBpbnQgcmF0ZV9zb3VyY2U7CisgIGNoYXIgaGFuZGxlWzMyXTsKKyNkZWZpbmUgT1NTX01BWF9TQU1QTEVfUkFURVMJMjAJLyogQ2Fubm90IGJlIGNoYW5nZWQgICovCisgIHVuc2lnbmVkIGludCBucmF0ZXMsIHJhdGVzW09TU19NQVhfU0FNUExFX1JBVEVTXTsJLyogUGxlYXNlIHJlYWQgdGhlIG1hbnVhbCBiZWZvcmUgdXNpbmcgdGhlc2UgKi8KKyAgb3NzX2xvbmduYW1lX3Qgc29uZ19uYW1lOwkvKiBTb25nIG5hbWUgKGlmIGdpdmVuKSAqLworICBvc3NfbGFiZWxfdCBsYWJlbDsJCS8qIERldmljZSBsYWJlbCAoaWYgZ2l2ZW4pICovCisgIGludCBsYXRlbmN5OwkJCS8qIEluIHVzZWNzLCAtMT11bmtub3duICovCisgIG9zc19kZXZub2RlX3QgZGV2bm9kZTsJLyogRGV2aWNlIHNwZWNpYWwgZmlsZSBuYW1lIChhYnNvbHV0ZSBwYXRoKSAqLworICBpbnQgbmV4dF9wbGF5X2VuZ2luZTsJCS8qIFJlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mbyAqLworICBpbnQgbmV4dF9yZWNfZW5naW5lOwkJLyogUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvICovCisgIGludCBmaWxsZXJbMTg0XTsKK30gb3NzX2F1ZGlvaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgb3NzX21peGVyaW5mbworeworICBpbnQgZGV2OworICBjaGFyIGlkWzE2XTsKKyAgY2hhciBuYW1lWzMyXTsKKyAgaW50IG1vZGlmeV9jb3VudGVyOworICBpbnQgY2FyZF9udW1iZXI7CisgIGludCBwb3J0X251bWJlcjsKKyAgY2hhciBoYW5kbGVbMzJdOworICBpbnQgbWFnaWM7CQkJLyogUmVzZXJ2ZWQgKi8KKyAgaW50IGVuYWJsZWQ7CQkJLyogUmVzZXJ2ZWQgKi8KKyAgaW50IGNhcHM7CisjZGVmaW5lIE1JWEVSX0NBUF9WSVJUVUFMCTB4MDAwMDAwMDEKKyNkZWZpbmUgTUlYRVJfQ0FQX0xBWU9VVF9CCTB4MDAwMDAwMDIJLyogRm9yIGludGVybmFsIHVzZSBvbmx5ICovCisjZGVmaW5lIE1JWEVSX0NBUF9OQVJST1cJMHgwMDAwMDAwNAkvKiBDb25zZXJ2ZSBob3JpeiBzcGFjZSAqLworICBpbnQgZmxhZ3M7CQkJLyogUmVzZXJ2ZWQgKi8KKyAgaW50IG5yZXh0OworICAvKgorICAgKiBUaGUgcHJpb3JpdHkgZmllbGQgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHRoZSBkZWZhdWx0IChtb3RoZXJib2FyZCkKKyAgICogbWl4ZXIgZGV2aWNlLiBUaGUgbWl4ZXIgd2l0aCB0aGUgaGlnaGVzdCBwcmlvcml0eSBpcyB0aGUKKyAgICogbW9zdCBwcmVmZXJyZWQgb25lLiAtMiBvciBsZXNzIG1lYW5zIHRoYXQgdGhpcyBkZXZpY2UgY2Fubm90IGJlIHVzZWQKKyAgICogYXMgdGhlIGRlZmF1bHQgbWl4ZXIuCisgICAqLworICBpbnQgcHJpb3JpdHk7CisgIG9zc19kZXZub2RlX3QgZGV2bm9kZTsJLyogRGV2aWNlIHNwZWNpYWwgZmlsZSBuYW1lIChhYnNvbHV0ZSBwYXRoKSAqLworICBpbnQgbGVnYWN5X2RldmljZTsKKyAgaW50IGZpbGxlclsyNDVdOwkJLyogUmVzZXJ2ZWQgKi8KK30gb3NzX21peGVyaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgb3NzX21pZGlfaW5mbworeworICBpbnQgZGV2OwkJCS8qIE1pZGkgZGV2aWNlIG51bWJlciAqLworICBjaGFyIG5hbWVbNjRdOworICBpbnQgYnVzeTsJCQkvKiAwLCBPUEVOX1JFQUQsIE9QRU5fV1JJVEUgb3IgT1BFTl9SRUFEV1JJVEUgKi8KKyAgaW50IHBpZDsKKyAgY2hhciBjbWRbNjRdOwkJCS8qIENvbW1hbmQgdXNpbmcgdGhlIGRldmljZSAoaWYga25vd24pICovCisgIGludCBjYXBzOworI2RlZmluZSBNSURJX0NBUF9NUFU0MDEJCTB4MDAwMDAwMDEJLyoqKiogT0JTT0xFVEUgKioqKi8KKyNkZWZpbmUgTUlESV9DQVBfSU5QVVQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUlESV9DQVBfT1VUUFVUCQkweDAwMDAwMDA0CisjZGVmaW5lIE1JRElfQ0FQX0lOT1VUCQkoTUlESV9DQVBfSU5QVVR8TUlESV9DQVBfT1VUUFVUKQorI2RlZmluZSBNSURJX0NBUF9WSVJUVUFMCTB4MDAwMDAwMDgJLyogUHNldWRvIGRldmljZSAqLworI2RlZmluZSBNSURJX0NBUF9NVENJTlBVVAkweDAwMDAwMDEwCS8qIFN1cHBvcnRzIFNORENUTF9NSURJX01UQ0lOUFVUICovCisjZGVmaW5lIE1JRElfQ0FQX0NMSUVOVAkJMHgwMDAwMDAyMAkvKiBWaXJ0dWFsIGNsaWVudCBzaWRlIGRldmljZSAqLworI2RlZmluZSBNSURJX0NBUF9TRVJWRVIJCTB4MDAwMDAwNDAJLyogVmlydHVhbCBzZXJ2ZXIgc2lkZSBkZXZpY2UgKi8KKyNkZWZpbmUgTUlESV9DQVBfSU5URVJOQUwJMHgwMDAwMDA4MAkvKiBJbnRlcm5hbCAoc3ludGgpIGRldmljZSAqLworI2RlZmluZSBNSURJX0NBUF9FWFRFUk5BTAkweDAwMDAwMTAwCS8qIGV4dGVybmFsIChNSURJIHBvcnQpIGRldmljZSAqLworI2RlZmluZSBNSURJX0NBUF9QVE9QCQkweDAwMDAwMjAwCS8qIFBvaW50IHRvIHBvaW50IGxpbmsgdG8gb25lIGRldmljZSAqLworI2RlZmluZSBNSURJX0NBUF9NVEMJCTB4MDAwMDA0MDAJLyogTVRDL1NNUFRFIChjb250cm9sKSBkZXZpY2UgKi8KKyAgaW50IG1hZ2ljOwkJCS8qIFJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UgKi8KKyAgaW50IGNhcmRfbnVtYmVyOworICBpbnQgcG9ydF9udW1iZXI7CisgIGludCBlbmFibGVkOwkJCS8qIDE9ZW5hYmxlZCwgMD1kZXZpY2Ugbm90IHJlYWR5IGF0IHRoaXMgbW9tZW50ICovCisgIGludCBmbGFnczsJCQkvKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkgLSBubyBwcmFjdGljYWwgbWVhbmluZyAqLworICBjaGFyIGhhbmRsZVszMl07CisgIG9zc19sb25nbmFtZV90IHNvbmdfbmFtZTsJLyogU29uZyBuYW1lIChpZiBrbm93bikgKi8KKyAgb3NzX2xhYmVsX3QgbGFiZWw7CQkvKiBEZXZpY2UgbGFiZWwgKGlmIGdpdmVuKSAqLworICBpbnQgbGF0ZW5jeTsJCQkvKiBJbiB1c2VjcywgLTE9dW5rbm93biAqLworICBvc3NfZGV2bm9kZV90IGRldm5vZGU7CS8qIERldmljZSBzcGVjaWFsIGZpbGUgbmFtZSAoYWJzb2x1dGUgcGF0aCkgKi8KKyAgaW50IGxlZ2FjeV9kZXZpY2U7CQkvKiBMZWdhY3kgZGV2aWNlIG1hcHBpbmcgKi8KKyAgaW50IGZpbGxlclsyMzVdOworfSBvc3NfbWlkaV9pbmZvOworCit0eXBlZGVmIHN0cnVjdCBvc3NfY2FyZF9pbmZvCit7CisgIGludCBjYXJkOworICBjaGFyIHNob3J0bmFtZVsxNl07CisgIGNoYXIgbG9uZ25hbWVbMTI4XTsKKyAgaW50IGZsYWdzOworICBjaGFyIGh3X2luZm9bNDAwXTsKKyAgaW50IGludHJfY291bnQsIGFja19jb3VudDsKKyAgaW50IGZpbGxlclsxNTRdOworfSBvc3NfY2FyZF9pbmZvOworCisjZGVmaW5lIFNORENUTF9TWVNJTkZPCQlfX1NJT1IgKCdYJywgMSwgb3NzX3N5c2luZm8pCisjZGVmaW5lIE9TU19TWVNJTkZPCQlTTkRDVExfU1lTSU5GTwkvKiBPbGQgbmFtZSAqLworCisjZGVmaW5lIFNORENUTF9NSVhfTlJNSVgJX19TSU9SICgnWCcsIDIsIGludCkKKyNkZWZpbmUgU05EQ1RMX01JWF9OUkVYVAlfX1NJT1dSKCdYJywgMywgaW50KQorI2RlZmluZSBTTkRDVExfTUlYX0VYVElORk8JX19TSU9XUignWCcsIDQsIG9zc19taXhleHQpCisjZGVmaW5lIFNORENUTF9NSVhfUkVBRAkJX19TSU9XUignWCcsIDUsIG9zc19taXhlcl92YWx1ZSkKKyNkZWZpbmUgU05EQ1RMX01JWF9XUklURQlfX1NJT1dSKCdYJywgNiwgb3NzX21peGVyX3ZhbHVlKQorCisjZGVmaW5lIFNORENUTF9BVURJT0lORk8JX19TSU9XUignWCcsIDcsIG9zc19hdWRpb2luZm8pCisjZGVmaW5lIFNORENUTF9NSVhfRU5VTUlORk8JX19TSU9XUignWCcsIDgsIG9zc19taXhlcl9lbnVtaW5mbykKKyNkZWZpbmUgU05EQ1RMX01JRElJTkZPCQlfX1NJT1dSKCdYJywgOSwgb3NzX21pZGlfaW5mbykKKyNkZWZpbmUgU05EQ1RMX01JWEVSSU5GTwlfX1NJT1dSKCdYJywxMCwgb3NzX21peGVyaW5mbykKKyNkZWZpbmUgU05EQ1RMX0NBUkRJTkZPCQlfX1NJT1dSKCdYJywxMSwgb3NzX2NhcmRfaW5mbykKKyNkZWZpbmUgU05EQ1RMX0VOR0lORUlORk8JX19TSU9XUignWCcsMTIsIG9zc19hdWRpb2luZm8pCisjZGVmaW5lIFNORENUTF9BVURJT0lORk9fRVgJX19TSU9XUignWCcsMTMsIG9zc19hdWRpb2luZm8pCisKKyNkZWZpbmUgU05EQ1RMX01JWF9ERVNDUklQVElPTglfX1NJT1dSKCdYJywxNCwgb3NzX21peGVyX2VudW1pbmZvKQorCisvKiBpb2N0bCBjb2RlcyAnWCcsIDIwMC0yNTUgYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UgKi8KKworLyoKKyAqIEZldyBtb3JlICJnbG9iYWxseSIgYXZhaWxhYmxlIGlvY3RsIGNhbGxzLgorICovCisjZGVmaW5lIFNORENUTF9TRVRTT05HCQlfX1NJT1cgKCdZJywgMiwgb3NzX2xvbmduYW1lX3QpCisjZGVmaW5lIFNORENUTF9HRVRTT05HCQlfX1NJT1IgKCdZJywgMiwgb3NzX2xvbmduYW1lX3QpCisjZGVmaW5lIFNORENUTF9TRVROQU1FCQlfX1NJT1cgKCdZJywgMywgb3NzX2xvbmduYW1lX3QpCisjZGVmaW5lIFNORENUTF9TRVRMQUJFTAkJX19TSU9XICgnWScsIDQsIG9zc19sYWJlbF90KQorI2RlZmluZSBTTkRDVExfR0VUTEFCRUwJCV9fU0lPUiAoJ1knLCA0LCBvc3NfbGFiZWxfdCkKKy8qCisgKiBUaGUgIm5ldyIgbWl4ZXIgQVBJIGRlZmluaXRpb25zIGVuZCBoZXJlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGZXcgcm91dGluZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gLWxPU1NsaWIKKyAqCisgKiBBdCB0aGlzIG1vbWVudCB0aGlzIGludGVyZmFjZSBpcyBub3QgdXNlZC4gT1NTbGliIGNvbnRhaW5zIGp1c3QKKyAqIHN0dWJzIHRoYXQgY2FsbCB0aGUgcmVsYXRlZCBzeXN0ZW0gY2FsbHMgZGlyZWN0bHkuCisgKi8KKyNpZmRlZiBPU1NMSUIKK2V4dGVybiBpbnQgb3NzbGliX29wZW4gKGNvbnN0IGNoYXIgKnBhdGgsIGludCBmbGFncywgaW50IGR1bW15KTsKK2V4dGVybiB2b2lkIG9zc2xpYl9jbG9zZSAoaW50IGZkKTsKK2V4dGVybiBpbnQgb3NzbGliX3dyaXRlIChpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGNvdW50KTsKK2V4dGVybiBpbnQgb3NzbGliX3JlYWQgKGludCBmZCwgdm9pZCAqYnVmLCBpbnQgY291bnQpOworZXh0ZXJuIGludCBvc3NsaWJfaW9jdGwgKGludCBmZCwgdW5zaWduZWQgaW50IHJlcXVlc3QsIHZvaWQgKmFyZyk7CisjZWxzZQorIyAgZGVmaW5lIG9zc2xpYl9vcGVuCW9wZW4KKyMgIGRlZmluZSBvc3NsaWJfY2xvc2UJY2xvc2UKKyMgIGRlZmluZSBvc3NsaWJfd3JpdGUJd3JpdGUKKyMgIGRlZmluZSBvc3NsaWJfcmVhZAlyZWFkCisjICBkZWZpbmUgb3NzbGliX2lvY3RsCWlvY3RsCisjZW5kaWYKKworI2lmIDEKKyNkZWZpbmUgU05EQ1RMX0RTUF9OT05CTE9DSwkJX19TSU8gICgnUCcsMTQpCS8qIE9ic29sZXRlLiBOb3Qgc3VwcG9ydGVkIGFueSBtb3JlICovCisjZW5kaWYKKworI2lmIDEKKy8qCisgKiBTb21lIG9ic29sZXRlIG1hY3JvcyB0aGF0IGFyZSBub3QgcGFydCBvZiBPcGVuIFNvdW5kIFN5c3RlbSBBUEkuCisgKi8KKyNkZWZpbmUgU09VTkRfUENNX1JFQURfUkFURSAgICAgICAgICAgICBTT1VORF9QQ01fUkVBRF9SQVRFX2lzX29ic29sZXRlCisjZGVmaW5lIFNPVU5EX1BDTV9SRUFEX0JJVFMgICAgICAgICAgICAgU09VTkRfUENNX1JFQURfQklUU19pc19vYnNvbGV0ZQorI2RlZmluZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUyAgICAgICAgIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTX2lzX29ic29sZXRlCisjZGVmaW5lIFNPVU5EX1BDTV9XUklURV9SQVRFICAgICAgICAgICAgU09VTkRfUENNX1dSSVRFX1JBVEVfaXNfb2Jzb2xldF91c2VfU05EQ1RMX0RTUF9TUEVFRF9pbnN0ZWFkCisjZGVmaW5lIFNPVU5EX1BDTV9XUklURV9DSEFOTkVMUyAgICAgICAgU09VTkRfUENNX1dSSVRFX0NIQU5ORUxTX2lzX29ic29sZXRlX3VzZV9TTkRDVExfRFNQX0NIQU5ORUxTX2luc3RlYWQKKyNkZWZpbmUgU09VTkRfUENNX1dSSVRFX0JJVFMgICAgICAgICAgICBTT1VORF9QQ01fV1JJVEVfQklUU19pc19vYnNvbGV0ZV91c2VfU05EQ1RMX0RTUF9TRVRGTVRfaW5zdGVhZAorI2RlZmluZSBTT1VORF9QQ01fUE9TVCAgICAgICAgICAgICAgICAgIFNPVU5EX1BDTV9QT1NUX2lzX29ic29sZXRlX3VzZV9TTkRDVExfRFNQX1BPU1RfaW5zdGVhZAorI2RlZmluZSBTT1VORF9QQ01fUkVTRVQgICAgICAgICAgICAgICAgIFNPVU5EX1BDTV9SRVNFVF9pc19vYnNvbGV0ZV91c2VfU05EQ1RMX0RTUF9IQUxUX2luc3RlYWQKKyNkZWZpbmUgU09VTkRfUENNX1NZTkMgICAgICAgICAgICAgICAgICBTT1VORF9QQ01fU1lOQ19pc19vYnNvbGV0ZV91c2VfU05EQ1RMX0RTUF9TWU5DX2luc3RlYWQKKyNkZWZpbmUgU09VTkRfUENNX1NVQkRJVklERSAgICAgICAgICAgICBTT1VORF9QQ01fU1VCRElWSURFX2lzX29ic29sZXRlX3VzZV9TTkRDVExfRFNQX1NVQkRJVklERV9pbnN0ZWFkCisjZGVmaW5lIFNPVU5EX1BDTV9TRVRGUkFHTUVOVCAgICAgICAgICAgU09VTkRfUENNX1NFVEZSQUdNRU5UX2lzX29ic29sZXRlX3VzZV9TTkRDVExfRFNQX1NFVEZSQUdNRU5UX2luc3RlYWQKKyNkZWZpbmUgU09VTkRfUENNX0dFVEZNVFMgICAgICAgICAgICAgICBTT1VORF9QQ01fR0VURk1UU19pc19vYnNvbGV0ZV91c2VfU05EQ1RMX0RTUF9HRVRGTVRTX2luc3RlYWQKKyNkZWZpbmUgU09VTkRfUENNX1NFVEZNVCAgICAgICAgICAgICAgICBTT1VORF9QQ01fU0VURk1UX2lzX29ic29sZXRlX3VzZV9TTkRDVExfRFNQX1NFVEZNVF9pbnN0ZWFkCisjZGVmaW5lIFNPVU5EX1BDTV9HRVRPU1BBQ0UgICAgICAgICAgICAgU09VTkRfUENNX0dFVE9TUEFDRV9pc19vYnNvbGV0ZV91c2VfU05EQ1RMX0RTUF9HRVRPU1BBQ0VfaW5zdGVhZAorI2RlZmluZSBTT1VORF9QQ01fR0VUSVNQQUNFICAgICAgICAgICAgIFNPVU5EX1BDTV9HRVRJU1BBQ0VfaXNfb2Jzb2xldGVfdXNlX1NORENUTF9EU1BfR0VUSVNQQUNFX2luc3RlYWQKKyNkZWZpbmUgU09VTkRfUENNX05PTkJMT0NLICAgICAgICAgICAgICBTT1VORF9QQ01fTk9OQkxPQ0tfaXNfb2Jzb2xldGVfdXNlX1NORENUTF9EU1BfTk9OQkxPQ0tfaW5zdGVhZAorI2RlZmluZSBTT1VORF9QQ01fR0VUQ0FQUyAgICAgICAgICAgICAgIFNPVU5EX1BDTV9HRVRDQVBTX2lzX29ic29sZXRlX3VzZV9TTkRDVExfRFNQX0dFVENBUFNfaW5zdGVhZAorI2RlZmluZSBTT1VORF9QQ01fR0VUVFJJR0dFUiAgICAgICAgICAgIFNPVU5EX1BDTV9HRVRUUklHR0VSX2lzX29ic29sZXRlX3VzZV9TTkRDVExfRFNQX0dFVFRSSUdHRVJfaW5zdGVhZAorI2RlZmluZSBTT1VORF9QQ01fU0VUVFJJR0dFUiAgICAgICAgICAgIFNPVU5EX1BDTV9TRVRUUklHR0VSX2lzX29ic29sZXRlX3VzZV9TTkRDVExfRFNQX1NFVFRSSUdHRVJfaW5zdGVhZAorI2RlZmluZSBTT1VORF9QQ01fU0VUU1lOQ1JPICAgICAgICAgICAgIFNPVU5EX1BDTV9TRVRTWU5DUk9faXNfb2Jzb2xldGVfdXNlX1NORENUTF9EU1BfU0VUU1lOQ1JPX2luc3RlYWQKKyNkZWZpbmUgU09VTkRfUENNX0dFVElQVFIgICAgICAgICAgICAgICBTT1VORF9QQ01fR0VUSVBUUl9pc19vYnNvbGV0ZV91c2VfU05EQ1RMX0RTUF9HRVRJUFRSX2luc3RlYWQKKyNkZWZpbmUgU09VTkRfUENNX0dFVE9QVFIgICAgICAgICAgICAgICBTT1VORF9QQ01fR0VUT1BUUl9pc19vYnNvbGV0ZV91c2VfU05EQ1RMX0RTUF9HRVRPUFRSX2luc3RlYWQKKyNkZWZpbmUgU09VTkRfUENNX01BUElOQlVGICAgICAgICAgICAgICBTT1VORF9QQ01fTUFQSU5CVUZfaXNfb2Jzb2xldGVfdXNlX1NORENUTF9EU1BfTUFQSU5CVUZfaW5zdGVhZAorI2RlZmluZSBTT1VORF9QQ01fTUFQT1VUQlVGICAgICAgICAgICAgIFNPVU5EX1BDTV9NQVBPVVRCVUZfaXNfb2Jzb2xldGVfdXNlX1NORENUTF9EU1BfTUFQT1VUQlVGX2luc3RlYWQKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5cy9vc3M0L29zczQtc291cmNlLmMgYi9zeXMvb3NzNC9vc3M0LXNvdXJjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YjMxNWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3NzNC9vc3M0LXNvdXJjZS5jCkBAIC0wLDAgKzEsNTQ2IEBACisvKiBHU3RyZWFtZXIgT1NTNCBhdWRpbyBzb3VyY2UKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtb3NzNHNyYworICoKKyAqIFRoaXMgZWxlbWVudCBsZXRzIHlvdSByZWNvcmQgc291bmQgdXNpbmcgdGhlIE9wZW4gU291bmQgU3lzdGVtIChPU1MpCisgKiB2ZXJzaW9uIDQuCisgKiAKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgb3NzNHNyYyAhIHF1ZXVlICEgYXVkaW9jb252ZXJ0ICEgdm9yYmlzZW5jICEgb2dnbXV4ICEgZmlsZXNpbmsgbG9jYXRpb249bXltdXNpYy5vZ2cKKyAqIF18IHdpbGwgcmVjb3JkIHNvdW5kIGZyb20geW91ciBzb3VuZCBjYXJkIHVzaW5nIE9TUzQgYW5kIGVuY29kZSBpdCB0byBhbgorICogT2dnL1ZvcmJpcyBmaWxlICh0aGlzIHdpbGwgb25seSB3b3JrIGlmIHlvdXIgbWl4ZXIgc2V0dGluZ3MgYXJlIHJpZ2h0CisgKiBhbmQgdGhlIHJpZ2h0IGlucHV0cyBhcmVlbmFibGVkIGV0Yy4pCisgKiA8L3JlZnNlY3QyPgorICovCisKKy8qIEZJWE1FOiBtYWtlIHN1cmUgd2UncmUgbm90IGRvaW5nIGlvY3RscyBmcm9tIHRoZSBhcHAgdGhyZWFkIChlLmcuIHZpYSB0aGUKKyAqIG1peGVyIGludGVyZmFjZSkgd2hpbGUgcmVjb3JkaW5nICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC1pMThuLXBsdWdpbi5oPgorCisjZGVmaW5lIE5PX0xFR0FDWV9NSVhFUgorI2luY2x1ZGUgIm9zczQtYXVkaW8uaCIKKyNpbmNsdWRlICJvc3M0LXNvdXJjZS5oIgorI2luY2x1ZGUgIm9zczQtcHJvcGVydHktcHJvYmUuaCIKKyNpbmNsdWRlICJvc3M0LXNvdW5kY2FyZC5oIgorCisjZGVmaW5lIEdTVF9PU1M0X1NPVVJDRV9JU19PUEVOKHNyYykgIChHU1RfT1NTNF9TT1VSQ0Uoc3JjKS0+ZmQgIT0gLTEpCisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKG9zczRzcmNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgb3NzNHNyY19kZWJ1ZworCisjZGVmaW5lIERFRkFVTFRfREVWSUNFICAgICAgIE5VTEwKKyNkZWZpbmUgREVGQVVMVF9ERVZJQ0VfTkFNRSAgTlVMTAorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9ERVZJQ0UsCisgIFBST1BfREVWSUNFX05BTUUKK307CisKKyNkZWZpbmUgZ3N0X29zczRfc291cmNlX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdE9zczRTb3VyY2UsIGdzdF9vc3M0X3NvdXJjZSwgR1NUX1RZUEVfQVVESU9fU1JDKTsKKworc3RhdGljIHZvaWQgZ3N0X29zczRfc291cmNlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9vc3M0X3NvdXJjZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyB2b2lkIGdzdF9vc3M0X3NvdXJjZV9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyB2b2lkIGdzdF9vc3M0X3NvdXJjZV9maW5hbGl6ZSAoR3N0T3NzNFNvdXJjZSAqIG9zc3NyYyk7CisKK3N0YXRpYyBHc3RDYXBzICpnc3Rfb3NzNF9zb3VyY2VfZ2V0Y2FwcyAoR3N0QmFzZVNyYyAqIGJzcmMsIEdzdENhcHMgKiBmaWx0ZXIpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zczRfc291cmNlX29wZW4gKEdzdEF1ZGlvU3JjICogYXNyYywKKyAgICBnYm9vbGVhbiBzaWxlbnRfZXJyb3JzKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3NzNF9zb3VyY2Vfb3Blbl9mdW5jIChHc3RBdWRpb1NyYyAqIGFzcmMpOworc3RhdGljIGdib29sZWFuIGdzdF9vc3M0X3NvdXJjZV9jbG9zZSAoR3N0QXVkaW9TcmMgKiBhc3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3NzNF9zb3VyY2VfcHJlcGFyZSAoR3N0QXVkaW9TcmMgKiBhc3JjLAorICAgIEdzdEF1ZGlvUmluZ0J1ZmZlclNwZWMgKiBzcGVjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3NzNF9zb3VyY2VfdW5wcmVwYXJlIChHc3RBdWRpb1NyYyAqIGFzcmMpOworc3RhdGljIGd1aW50IGdzdF9vc3M0X3NvdXJjZV9yZWFkIChHc3RBdWRpb1NyYyAqIGFzcmMsIGdwb2ludGVyIGRhdGEsCisgICAgZ3VpbnQgbGVuZ3RoLCBHc3RDbG9ja1RpbWUgKiB0aW1lc3RhbXApOworc3RhdGljIGd1aW50IGdzdF9vc3M0X3NvdXJjZV9kZWxheSAoR3N0QXVkaW9TcmMgKiBhc3JjKTsKK3N0YXRpYyB2b2lkIGdzdF9vc3M0X3NvdXJjZV9yZXNldCAoR3N0QXVkaW9TcmMgKiBhc3JjKTsKKworc3RhdGljIHZvaWQKK2dzdF9vc3M0X3NvdXJjZV9jbGFzc19pbml0IChHc3RPc3M0U291cmNlQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEJhc2VTcmNDbGFzcyAqZ3N0YmFzZXNyY19jbGFzczsKKyAgR3N0QXVkaW9TcmNDbGFzcyAqZ3N0YXVkaW9zcmNfY2xhc3M7CisgIEdzdFBhZFRlbXBsYXRlICp0ZW1wbDsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdGJhc2VzcmNfY2xhc3MgPSAoR3N0QmFzZVNyY0NsYXNzICopIGtsYXNzOworICBnc3RhdWRpb3NyY19jbGFzcyA9IChHc3RBdWRpb1NyY0NsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3Rfb3NzNF9zb3VyY2VfZGlzcG9zZTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSAoR09iamVjdEZpbmFsaXplRnVuYykgZ3N0X29zczRfc291cmNlX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfb3NzNF9zb3VyY2VfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3Rfb3NzNF9zb3VyY2Vfc2V0X3Byb3BlcnR5OworCisgIGdzdGJhc2VzcmNfY2xhc3MtPmdldF9jYXBzID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3M0X3NvdXJjZV9nZXRjYXBzKTsKKworICBnc3RhdWRpb3NyY19jbGFzcy0+b3BlbiA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzNF9zb3VyY2Vfb3Blbl9mdW5jKTsKKyAgZ3N0YXVkaW9zcmNfY2xhc3MtPnByZXBhcmUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zczRfc291cmNlX3ByZXBhcmUpOworICBnc3RhdWRpb3NyY19jbGFzcy0+dW5wcmVwYXJlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3M0X3NvdXJjZV91bnByZXBhcmUpOworICBnc3RhdWRpb3NyY19jbGFzcy0+Y2xvc2UgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zczRfc291cmNlX2Nsb3NlKTsKKyAgZ3N0YXVkaW9zcmNfY2xhc3MtPnJlYWQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zczRfc291cmNlX3JlYWQpOworICBnc3RhdWRpb3NyY19jbGFzcy0+ZGVsYXkgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zczRfc291cmNlX2RlbGF5KTsKKyAgZ3N0YXVkaW9zcmNfY2xhc3MtPnJlc2V0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3M0X3NvdXJjZV9yZXNldCk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ERVZJQ0UsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZGV2aWNlIiwgIkRldmljZSIsCisgICAgICAgICAgIk9TUzQgZGV2aWNlIChlLmcuIC9kZXYvb3NzL2hkYXVkaW8wL3BjbTAgb3IgL2Rldi9kc3BOKSAiCisgICAgICAgICAgIihOVUxMID0gdXNlIGZpcnN0IGF2YWlsYWJsZSBkZXZpY2UpIiwKKyAgICAgICAgICBERUZBVUxUX0RFVklDRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ERVZJQ0VfTkFNRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJkZXZpY2UtbmFtZSIsICJEZXZpY2UgbmFtZSIsCisgICAgICAgICAgIkh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHNvdW5kIGRldmljZSIsIERFRkFVTFRfREVWSUNFX05BTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIk9TUyB2NCBBdWRpbyBTb3VyY2UiLCAiU291cmNlL0F1ZGlvIiwKKyAgICAgICJDYXB0dXJlIGZyb20gYSBzb3VuZCBjYXJkIHZpYSBPU1MgdmVyc2lvbiA0IiwKKyAgICAgICJUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PiIpOworCisgIHRlbXBsID0gZ3N0X3BhZF90ZW1wbGF0ZV9uZXcgKCJzcmMiLCBHU1RfUEFEX1NSQywgR1NUX1BBRF9BTFdBWVMsCisgICAgICBnc3Rfb3NzNF9hdWRpb19nZXRfdGVtcGxhdGVfY2FwcyAoKSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsIHRlbXBsKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3M0X3NvdXJjZV9pbml0IChHc3RPc3M0U291cmNlICogb3Nzc3JjKQoreworICBjb25zdCBnY2hhciAqZGV2aWNlOworCisgIGRldmljZSA9IGdfZ2V0ZW52ICgiQVVESU9ERVYiKTsKKyAgaWYgKGRldmljZSA9PSBOVUxMKQorICAgIGRldmljZSA9IERFRkFVTFRfREVWSUNFOworCisgIG9zc3NyYy0+ZmQgPSAtMTsKKyAgb3Nzc3JjLT5kZXZpY2UgPSBnX3N0cmR1cCAoZGV2aWNlKTsKKyAgb3Nzc3JjLT5kZXZpY2VfbmFtZSA9IGdfc3RyZHVwIChERUZBVUxUX0RFVklDRV9OQU1FKTsKKyAgb3Nzc3JjLT5kZXZpY2VfbmFtZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzNF9zb3VyY2VfZmluYWxpemUgKEdzdE9zczRTb3VyY2UgKiBvc3MpCit7CisgIGdfZnJlZSAob3NzLT5kZXZpY2UpOworICBvc3MtPmRldmljZSA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplICgoR09iamVjdCAqKSAob3NzKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzNF9zb3VyY2VfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0T3NzNFNvdXJjZSAqb3NzID0gR1NUX09TUzRfU09VUkNFIChvYmplY3QpOworCisgIGlmIChvc3MtPnByb2JlZF9jYXBzKSB7CisgICAgZ3N0X2NhcHNfdW5yZWYgKG9zcy0+cHJvYmVkX2NhcHMpOworICAgIG9zcy0+cHJvYmVkX2NhcHMgPSBOVUxMOworICB9CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzNF9zb3VyY2Vfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE9zczRTb3VyY2UgKm9zczsKKworICBvc3MgPSBHU1RfT1NTNF9TT1VSQ0UgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RFVklDRToKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAob3NzKTsKKyAgICAgIGlmIChvc3MtPmZkID09IC0xKSB7CisgICAgICAgIGdfZnJlZSAob3NzLT5kZXZpY2UpOworICAgICAgICBvc3MtPmRldmljZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgICBnX2ZyZWUgKG9zcy0+ZGV2aWNlX25hbWUpOworICAgICAgICBvc3MtPmRldmljZV9uYW1lID0gTlVMTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdfd2FybmluZyAoIiVzOiBjYW4ndCBjaGFuZ2UgXCJkZXZpY2VcIiBwcm9wZXJ0eSB3aGlsZSBhdWRpbyBzb3VyY2UgIgorICAgICAgICAgICAgImlzIG9wZW4iLCBHU1RfT0JKRUNUX05BTUUgKG9zcykpOworICAgICAgfQorICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKG9zcyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzNF9zb3VyY2VfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE9zczRTb3VyY2UgKm9zczsKKworICBvc3MgPSBHU1RfT1NTNF9TT1VSQ0UgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RFVklDRToKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAob3NzKTsKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIG9zcy0+ZGV2aWNlKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChvc3MpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RFVklDRV9OQU1FOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChvc3MpOworICAgICAgLyogSWYgZGV2aWNlIGlzIHNldCwgdHJ5IHRvIHJldHJpZXZlIHRoZSBuYW1lIGV2ZW4gaWYgd2UncmUgbm90IG9wZW4gKi8KKyAgICAgIGlmIChvc3MtPmZkID09IC0xICYmIG9zcy0+ZGV2aWNlICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGdzdF9vc3M0X3NvdXJjZV9vcGVuIChHU1RfQVVESU9fU1JDIChvc3MpLCBUUlVFKSkgeworICAgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIG9zcy0+ZGV2aWNlX25hbWUpOworICAgICAgICAgIGdzdF9vc3M0X3NvdXJjZV9jbG9zZSAoR1NUX0FVRElPX1NSQyAob3NzKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ2NoYXIgKm5hbWUgPSBOVUxMOworCisgICAgICAgICAgZ3N0X29zczRfcHJvcGVydHlfcHJvYmVfZmluZF9kZXZpY2VfbmFtZV9ub2ZkIChHU1RfT0JKRUNUIChvc3MpLAorICAgICAgICAgICAgICBvc3MtPmRldmljZSwgJm5hbWUpOworICAgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIG5hbWUpOworICAgICAgICAgIGdfZnJlZSAobmFtZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIG9zcy0+ZGV2aWNlX25hbWUpOworICAgICAgfQorCisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAob3NzKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X29zczRfc291cmNlX2dldGNhcHMgKEdzdEJhc2VTcmMgKiBic3JjLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RPc3M0U291cmNlICpvc3M7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgb3NzID0gR1NUX09TUzRfU09VUkNFIChic3JjKTsKKworICBpZiAob3NzLT5mZCA9PSAtMSkgeworICAgIGNhcHMgPSBnc3Rfb3NzNF9hdWRpb19nZXRfdGVtcGxhdGVfY2FwcyAoKTsKKyAgfSBlbHNlIGlmIChvc3MtPnByb2JlZF9jYXBzKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX2NvcHkgKG9zcy0+cHJvYmVkX2NhcHMpOworICB9IGVsc2UgeworICAgIGNhcHMgPSBnc3Rfb3NzNF9hdWRpb19wcm9iZV9jYXBzIChHU1RfT0JKRUNUIChvc3MpLCBvc3MtPmZkKTsKKyAgICBpZiAoY2FwcyAhPSBOVUxMICYmICFnc3RfY2Fwc19pc19lbXB0eSAoY2FwcykpIHsKKyAgICAgIG9zcy0+cHJvYmVkX2NhcHMgPSBnc3RfY2Fwc19jb3B5IChjYXBzKTsKKyAgICB9CisgIH0KKworICBpZiAoZmlsdGVyICYmIGNhcHMpIHsKKyAgICBHc3RDYXBzICppbnRlcnNlY3Rpb247CisKKyAgICBpbnRlcnNlY3Rpb24gPQorICAgICAgICBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCBjYXBzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICByZXR1cm4gaW50ZXJzZWN0aW9uOworICB9IGVsc2UgeworICAgIHJldHVybiBjYXBzOworICB9Cit9CisKKy8qIG5vdGU6IHdlIG11c3Qgbm90IHRha2UgdGhlIG9iamVjdCBsb2NrIGhlcmUgdW5sZXNzIHdlIGZpeCB1cCBnZXRfcHJvcGVydHkgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zczRfc291cmNlX29wZW4gKEdzdEF1ZGlvU3JjICogYXNyYywgZ2Jvb2xlYW4gc2lsZW50X2Vycm9ycykKK3sKKyAgR3N0T3NzNFNvdXJjZSAqb3NzOworICBnY2hhciAqZGV2aWNlOworICBpbnQgbW9kZTsKKworICBvc3MgPSBHU1RfT1NTNF9TT1VSQ0UgKGFzcmMpOworCisgIGlmIChvc3MtPmRldmljZSkKKyAgICBkZXZpY2UgPSBnX3N0cmR1cCAob3NzLT5kZXZpY2UpOworICBlbHNlCisgICAgZGV2aWNlID0gZ3N0X29zczRfYXVkaW9fZmluZF9kZXZpY2UgKEdTVF9PQkpFQ1RfQ0FTVCAob3NzKSk7CisKKyAgLyogZGVzcGVyYXRlIHRpbWVzLCBkZXNwZXJhdGUgbWVhc3VyZXMgKi8KKyAgaWYgKGRldmljZSA9PSBOVUxMKQorICAgIGRldmljZSA9IGdfc3RyZHVwICgiL2Rldi9kc3AwIik7CisKKyAgR1NUX0lORk9fT0JKRUNUIChvc3MsICJUcnlpbmcgdG8gb3BlbiBPU1M0IGRldmljZSAnJXMnIiwgZGV2aWNlKTsKKworICAvKiB3ZSBvcGVuIGluIG5vbi1ibG9ja2luZyBtb2RlIGV2ZW4gaWYgd2UgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gZG8gd3JpdGVzCisgICAqIG5vbi1ibG9ja2luZyBiZWNhdXNlIHdlIGNhbid0IGJlIHN1cmUgdGhhdCB0aGlzIGlzIHJlYWxseSBhIGdlbnVpbmUKKyAgICogT1NTNCBkZXZpY2Ugd2l0aCB3ZWxsLWJlaGF2ZWQgZHJpdmVycyBldGMuIFdlIHJlYWxseSBkb24ndCB3YW50IHRvCisgICAqIGhhbmcgZm9yZXZlciB1bmRlciBhbnkgY2lyY3Vtc3RhbmNlcy4gKi8KKyAgb3NzLT5mZCA9IG9wZW4gKGRldmljZSwgT19SRE9OTFkgfCBPX05PTkJMT0NLLCAwKTsKKyAgaWYgKG9zcy0+ZmQgPT0gLTEpIHsKKyAgICBzd2l0Y2ggKGVycm5vKSB7CisgICAgICBjYXNlIEVCVVNZOgorICAgICAgICBnb3RvIGJ1c3k7CisgICAgICBjYXNlIEVBQ0NFUzoKKyAgICAgICAgZ290byBub19wZXJtaXNzaW9uOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBvcGVuX2ZhaWxlZDsKKyAgICB9CisgIH0KKworICBHU1RfSU5GT19PQkpFQ1QgKG9zcywgIk9wZW5lZCBkZXZpY2UiKTsKKworICAvKiBNYWtlIHN1cmUgaXQncyBPU1M0LiBJZiBpdCdzIG9sZCBPU1MsIGxldCBvc3NzaW5rIGhhbmRsZSBpdCAqLworICBpZiAoIWdzdF9vc3M0X2F1ZGlvX2NoZWNrX3ZlcnNpb24gKEdTVF9PQkpFQ1RfQ0FTVCAob3NzKSwgb3NzLT5mZCkpCisgICAgZ290byBsZWdhY3lfb3NzOworCisgIC8qIG5vdyByZW1vdmUgdGhlIG5vbi1ibG9ja2luZyBmbGFnLiAqLworICBtb2RlID0gZmNudGwgKG9zcy0+ZmQsIEZfR0VURkwpOworICBtb2RlICY9IH5PX05PTkJMT0NLOworICBpZiAoZmNudGwgKG9zcy0+ZmQsIEZfU0VURkwsIG1vZGUpIDwgMCkgeworICAgIC8qIHNvbWUgZHJpdmVycyBkbyBubyBzdXBwb3J0IHVuc2V0dGluZyB0aGUgbm9uLWJsb2NraW5nIGZsYWcsIHRyeSB0bworICAgICAqIGNsb3NlL29wZW4gdGhlIGRldmljZSB0aGVuLiBUaGlzIGlzIHJhY3kgYnV0IHdlIGVycm9yIG91dCBwcm9wZXJseS4gKi8KKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG9zcywgImZhaWxlZCB0byB1bnNldCBPX05PTkJMT0NLIChidWdneSBkcml2ZXI/KSwgIgorICAgICAgICAid2lsbCB0cnkgdG8gcmUtb3BlbiBkZXZpY2Ugbm93Iik7CisgICAgZ3N0X29zczRfc291cmNlX2Nsb3NlIChhc3JjKTsKKyAgICBpZiAoKG9zcy0+ZmQgPSBvcGVuIChkZXZpY2UsIE9fUkRPTkxZLCAwKSkgPT0gLTEpCisgICAgICBnb3RvIG5vbl9ibG9jazsKKyAgfQorCisgIG9zcy0+b3Blbl9kZXZpY2UgPSBkZXZpY2U7CisKKyAgLyogbm90IHVzaW5nIEVOR0lORUlORk8gaGVyZSBiZWNhdXNlIGl0IHNvbWV0aW1lcyByZXR1cm5zIGEgZGlmZmVyZW50IGFuZAorICAgKiBsZXNzIHVzZWZ1bCBuYW1lIHRoYW4gQVVESU9JTkZPIGZvciB0aGUgc2FtZSBkZXZpY2UgKi8KKyAgaWYgKCFnc3Rfb3NzNF9wcm9wZXJ0eV9wcm9iZV9maW5kX2RldmljZV9uYW1lIChHU1RfT0JKRUNUIChvc3MpLCBvc3MtPmZkLAorICAgICAgICAgIG9zcy0+b3Blbl9kZXZpY2UsICZvc3MtPmRldmljZV9uYW1lKSkgeworICAgIG9zcy0+ZGV2aWNlX25hbWUgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitidXN5OgorICB7CisgICAgaWYgKCFzaWxlbnRfZXJyb3JzKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAob3NzLCBSRVNPVVJDRSwgQlVTWSwKKyAgICAgICAgICAoXygiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gIgorICAgICAgICAgICAgICAgICAgIkRldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgYXBwbGljYXRpb24uIikpLCAoTlVMTCkpOworICAgIH0KKyAgICBnX2ZyZWUgKGRldmljZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19wZXJtaXNzaW9uOgorICB7CisgICAgaWYgKCFzaWxlbnRfZXJyb3JzKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAob3NzLCBSRVNPVVJDRSwgT1BFTl9SRUFELAorICAgICAgICAgIChfKCJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiAiCisgICAgICAgICAgICAgICAgICAiWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuIHRoZSBkZXZpY2UuIikpLAorICAgICAgICAgIEdTVF9FUlJPUl9TWVNURU0pOworICAgIH0KKyAgICBnX2ZyZWUgKGRldmljZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitvcGVuX2ZhaWxlZDoKKyAgeworICAgIGlmICghc2lsZW50X2Vycm9ycykgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9zcywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwKKyAgICAgICAgICAoXygiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iKSksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIH0KKyAgICBnX2ZyZWUgKGRldmljZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitsZWdhY3lfb3NzOgorICB7CisgICAgZ3N0X29zczRfc291cmNlX2Nsb3NlIChhc3JjKTsKKyAgICBpZiAoIXNpbGVudF9lcnJvcnMpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChvc3MsIFJFU09VUkNFLCBPUEVOX1JFQUQsCisgICAgICAgICAgKF8oIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suICIKKyAgICAgICAgICAgICAgICAgICJUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyAiCisgICAgICAgICAgICAgICAgICAiZWxlbWVudC4iKSksICgiVHJ5IHRoZSAnb3Nzc2luaycgZWxlbWVudCBpbnN0ZWFkIikpOworICAgIH0KKyAgICBnX2ZyZWUgKGRldmljZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub25fYmxvY2s6CisgIHsKKyAgICBpZiAoIXNpbGVudF9lcnJvcnMpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChvc3MsIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAgICgiVW5hYmxlIHRvIHNldCBkZXZpY2UgJXMgaW50byBub24tYmxvY2tpbmcgbW9kZTogJXMiLAorICAgICAgICAgICAgICBvc3MtPmRldmljZSwgZ19zdHJlcnJvciAoZXJybm8pKSk7CisgICAgfQorICAgIGdfZnJlZSAoZGV2aWNlKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3NzNF9zb3VyY2Vfb3Blbl9mdW5jIChHc3RBdWRpb1NyYyAqIGFzcmMpCit7CisgIHJldHVybiBnc3Rfb3NzNF9zb3VyY2Vfb3BlbiAoYXNyYywgRkFMU0UpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3M0X3NvdXJjZV9jbG9zZSAoR3N0QXVkaW9TcmMgKiBhc3JjKQoreworICBHc3RPc3M0U291cmNlICpvc3M7CisKKyAgb3NzID0gR1NUX09TUzRfU09VUkNFIChhc3JjKTsKKworICBpZiAob3NzLT5mZCAhPSAtMSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG9zcywgImNsb3NpbmcgZGV2aWNlIik7CisgICAgY2xvc2UgKG9zcy0+ZmQpOworICAgIG9zcy0+ZmQgPSAtMTsKKyAgfQorCisgIG9zcy0+Ynl0ZXNfcGVyX3NhbXBsZSA9IDA7CisKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJm9zcy0+cHJvYmVkX2NhcHMsIE5VTEwpOworCisgIGdfZnJlZSAob3NzLT5vcGVuX2RldmljZSk7CisgIG9zcy0+b3Blbl9kZXZpY2UgPSBOVUxMOworCisgIGdfZnJlZSAob3NzLT5kZXZpY2VfbmFtZSk7CisgIG9zcy0+ZGV2aWNlX25hbWUgPSBOVUxMOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3M0X3NvdXJjZV9wcmVwYXJlIChHc3RBdWRpb1NyYyAqIGFzcmMsIEdzdEF1ZGlvUmluZ0J1ZmZlclNwZWMgKiBzcGVjKQoreworICBHc3RPc3M0U291cmNlICpvc3M7CisKKyAgb3NzID0gR1NUX09TUzRfU09VUkNFIChhc3JjKTsKKworICBpZiAoIWdzdF9vc3M0X2F1ZGlvX3NldF9mb3JtYXQgKEdTVF9PQkpFQ1RfQ0FTVCAob3NzKSwgb3NzLT5mZCwgc3BlYykpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG9zcywgIkNvdWxkbid0IHNldCByZXF1ZXN0ZWQgZm9ybWF0ICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICBzcGVjLT5jYXBzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBvc3MtPmJ5dGVzX3Blcl9zYW1wbGUgPSBHU1RfQVVESU9fSU5GT19CUEYgKCZzcGVjLT5pbmZvKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3NzNF9zb3VyY2VfdW5wcmVwYXJlIChHc3RBdWRpb1NyYyAqIGFzcmMpCit7CisgIC8qIGNvdWxkIGRvIGEgU05EQ1RMX0RTUF9IQUxULCBidXQgdGhlIE9TUyBtYW51YWwgcmVjb21tZW5kcyBhIGNsb3NlL29wZW4sCisgICAqIHNpbmNlIEhBTFQgd29uJ3QgcHJvcGVybHkgcmVzZXQgc29tZSBkZXZpY2VzLCBhcHBhcmVudGx5ICovCisKKyAgaWYgKCFnc3Rfb3NzNF9zb3VyY2VfY2xvc2UgKGFzcmMpKQorICAgIGdvdG8gY291bGRudF9jbG9zZTsKKworICBpZiAoIWdzdF9vc3M0X3NvdXJjZV9vcGVuX2Z1bmMgKGFzcmMpKQorICAgIGdvdG8gY291bGRudF9yZW9wZW47CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitjb3VsZG50X2Nsb3NlOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXNyYywgIkNvdWxkbid0IGNsb3NlIHRoZSBhdWRpbyBkZXZpY2UiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2NvdWxkbnRfcmVvcGVuOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXNyYywgIkNvdWxkbid0IHJlb3BlbiB0aGUgYXVkaW8gZGV2aWNlIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBndWludAorZ3N0X29zczRfc291cmNlX3JlYWQgKEdzdEF1ZGlvU3JjICogYXNyYywgZ3BvaW50ZXIgZGF0YSwgZ3VpbnQgbGVuZ3RoLAorICAgIEdzdENsb2NrVGltZSAqIHRpbWVzdGFtcCkKK3sKKyAgR3N0T3NzNFNvdXJjZSAqb3NzOworICBpbnQgbjsKKworICBvc3MgPSBHU1RfT1NTNF9TT1VSQ0VfQ0FTVCAoYXNyYyk7CisKKyAgbiA9IHJlYWQgKG9zcy0+ZmQsIGRhdGEsIGxlbmd0aCk7CisgIEdTVF9MT0dfT0JKRUNUIChhc3JjLCAiJXUgYnl0ZXMsICV1IHNhbXBsZXMiLCBuLCBuIC8gb3NzLT5ieXRlc19wZXJfc2FtcGxlKTsKKworICBpZiAoR19VTkxJS0VMWSAobiA8IDApKSB7CisgICAgc3dpdGNoIChlcnJubykgeworICAgICAgY2FzZSBFTk9UU1VQOgorICAgICAgY2FzZSBFQUNDRVM6eworICAgICAgICAvKiBUaGlzIGlzIHRoZSBtb3N0IGxpa2VseSBjYXVzZSwgSSB0aGluayAqLworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXNyYywgUkVTT1VSQ0UsIFJFQUQsCisgICAgICAgICAgICAoXygiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIikpLAorICAgICAgICAgICAgKCJyZWFkOiAlcyAoZGV2aWNlOiAlcykgKG1heWJlIHRoaXMgaXMgYW4gb3V0cHV0LW9ubHkgZGV2aWNlPykiLAorICAgICAgICAgICAgICAgIGdfc3RyZXJyb3IgKGVycm5vKSwgb3NzLT5vcGVuX2RldmljZSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6eworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXNyYywgUkVTT1VSQ0UsIFJFQUQsCisgICAgICAgICAgICAoXygiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIpKSwKKyAgICAgICAgICAgICgicmVhZDogJXMgKGRldmljZTogJXMpIiwgZ19zdHJlcnJvciAoZXJybm8pLCBvc3MtPm9wZW5fZGV2aWNlKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAoZ3VpbnQpIG47Cit9CisKK3N0YXRpYyBndWludAorZ3N0X29zczRfc291cmNlX2RlbGF5IChHc3RBdWRpb1NyYyAqIGFzcmMpCit7CisgIGF1ZGlvX2J1Zl9pbmZvIGluZm8gPSB7IDAsIH07CisgIEdzdE9zczRTb3VyY2UgKm9zczsKKyAgZ3VpbnQgZGVsYXk7CisKKyAgb3NzID0gR1NUX09TUzRfU09VUkNFX0NBU1QgKGFzcmMpOworCisgIGlmIChpb2N0bCAob3NzLT5mZCwgU05EQ1RMX0RTUF9HRVRJU1BBQ0UsICZpbmZvKSA9PSAtMSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChvc3MsICJHRVRJU1BBQ0UgZmFpbGVkOiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBkZWxheSA9IChpbmZvLmZyYWdzdG90YWwgKiBpbmZvLmZyYWdzaXplKSAtIGluZm8uYnl0ZXM7CisgIEdTVF9MT0dfT0JKRUNUIChvc3MsICJmcmFnc3RvdGFsOiVkLCBmcmFnc2l6ZTolZCwgYnl0ZXM6JWQsIGRlbGF5OiVkIiwKKyAgICAgIGluZm8uZnJhZ3N0b3RhbCwgaW5mby5mcmFnc2l6ZSwgaW5mby5ieXRlcywgZGVsYXkpOworICByZXR1cm4gZGVsYXk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzNF9zb3VyY2VfcmVzZXQgKEdzdEF1ZGlvU3JjICogYXNyYykKK3sKKyAgLyogVGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyBoZXJlIHJlYWxseTogT1NTIGNhbid0IGhhbmRsZSBhY2Nlc3MgdG8gdGhlCisgICAqIHNhbWUgZGV2aWNlL2ZkIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBhbmQgbWlnaHQgZGVhZGxvY2sgb3IgYmxvdyB1cCBpbgorICAgKiBvdGhlciB3YXlzIGlmIHdlIHRyeSBhbiBpb2N0bCBTTkRDVExfRFNQX0hBTFQgb3Igc2ltaWxhciAqLworfQpkaWZmIC0tZ2l0IGEvc3lzL29zczQvb3NzNC1zb3VyY2UuaCBiL3N5cy9vc3M0L29zczQtc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkOGYxMwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3M0L29zczQtc291cmNlLmgKQEAgLTAsMCArMSw1OSBAQAorLyogR1N0cmVhbWVyIE9TUzQgYXVkaW8gc291cmNlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgR1NUX09TUzRfU09VUkNFX0gKKyNkZWZpbmUgR1NUX09TUzRfU09VUkNFX0gKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9zcmMuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX09TUzRfU09VUkNFICAgICAgICAgICAgKGdzdF9vc3M0X3NvdXJjZV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfT1NTNF9TT1VSQ0Uob2JqKSAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9PU1M0X1NPVVJDRSxHc3RPc3M0U291cmNlKSkKKyNkZWZpbmUgR1NUX09TUzRfU09VUkNFX0NBU1Qob2JqKSAgICAgICAoKEdzdE9zczRTb3VyY2UgKikob2JqKSkKKyNkZWZpbmUgR1NUX09TUzRfU09VUkNFX0NMQVNTKGtsYXNzKSAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9PU1M0X1NPVVJDRSxHc3RPc3M0U291cmNlQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfT1NTNF9TT1VSQ0Uob2JqKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9PU1M0X1NPVVJDRSkpCisjZGVmaW5lIEdTVF9JU19PU1M0X1NPVVJDRV9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfT1NTNF9TT1VSQ0UpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0T3NzNFNvdXJjZSBHc3RPc3M0U291cmNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9zczRTb3VyY2VDbGFzcyBHc3RPc3M0U291cmNlQ2xhc3M7CisKK3N0cnVjdCBfR3N0T3NzNFNvdXJjZSB7CisgIEdzdEF1ZGlvU3JjICAgICBhdWRpb3NyYzsKKworICBnY2hhciAgICAgICAgICogZGV2aWNlOyAgICAgICAgICAgICAvKiBOVUxMIGlmIG5vbmUgd2FzIHNldCAgICAgICovCisgIGdjaGFyICAgICAgICAgKiBvcGVuX2RldmljZTsgICAgICAgIC8qIHRoZSBkZXZpY2Ugd2Ugb3BlbmVkICAgICAgKi8KKyAgZ2NoYXIgICAgICAgICAqIGRldmljZV9uYW1lOyAgICAgICAgLyogc2V0IGlmIHRoZSBkZXZpY2UgaXMgb3BlbiAqLworICBnaW50ICAgICAgICAgICAgZmQ7ICAgICAgICAgICAgICAgICAvKiAtMSBpZiBub3Qgb3BlbiAgICAgICAgICAgICovCisgIGdpbnQgICAgICAgICAgICBieXRlc19wZXJfc2FtcGxlOworCisgIEdzdENhcHMgICAgICAgKiBwcm9iZWRfY2FwczsKK307CisKK3N0cnVjdCBfR3N0T3NzNFNvdXJjZUNsYXNzIHsKKyAgR3N0QXVkaW9TcmNDbGFzcyBhdWRpb3NyY19jbGFzczsKK307CisKK0dUeXBlICBnc3Rfb3NzNF9zb3VyY2VfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogR1NUX09TUzRfU09VUkNFX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3lzL29zeGF1ZGlvL01ha2VmaWxlLmFtIGIvc3lzL29zeGF1ZGlvL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NTRhMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3N4YXVkaW8vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzNyBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0b3N4YXVkaW8ubGEKKworbGliZ3N0b3N4YXVkaW9fbGFfU09VUkNFUyA9IGdzdG9zeGF1ZGlvcmluZ2J1ZmZlci5jICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdG9zeGF1ZGlvZWxlbWVudC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3Rvc3hhdWRpb3NpbmsuYyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3N0b3N4YXVkaW9zcmMuYyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdG9zeGNvcmVhdWRpb2NvbW1vbi5jICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3N0b3N4Y29yZWF1ZGlvLmMgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3Rvc3hhdWRpby5jCisKK2xpYmdzdG9zeGF1ZGlvX2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykgXAorICAgIC1Xbm8tZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMKK2xpYmdzdG9zeGF1ZGlvX2xhX0xJQkFERCA9IAkJCSAgXAorICAgIC1sZ3N0YXVkaW8tQEdTVF9BUElfVkVSU0lPTkAgICAgICAgXAorICAgICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAgICAgICAgICBcCisgICAgJChHU1RfQkFTRV9MSUJTKSAgICAgICAgICAgICAgICAgIFwKKyAgICAkKEdTVF9MSUJTKQorCitsaWJnc3Rvc3hhdWRpb19sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpIC1XbCwtZnJhbWV3b3JrLENvcmVBdWRpbyAgLVdsLC1mcmFtZXdvcmssQXVkaW9Ub29sYm94CisKK25vaW5zdF9IRUFERVJTID0gZ3N0b3N4YXVkaW9zaW5rLmgJICBcCisgICAgICAgICAgICAgICAgIGdzdG9zeGF1ZGlvZGV2aWNlcHJvdmlkZXIuaCBcCisgICAgICAgICAgICAgICAgIGdzdG9zeGF1ZGlvZWxlbWVudC5oIFwKKyAgICAgICAgICAgICAgICAgZ3N0b3N4YXVkaW9yaW5nYnVmZmVyLmgJICBcCisgICAgICAgICAgICAgICAgIGdzdG9zeGF1ZGlvc3JjLmggICAgIFwKKyAgICAgICAgICAgICAgICAgZ3N0b3N4Y29yZWF1ZGlvY29tbW9uLmggICAgIFwKKyAgICAgICAgICAgICAgICAgZ3N0b3N4Y29yZWF1ZGlvLmgKKworRVhUUkFfRElTVCA9IGdzdG9zeGNvcmVhdWRpb2hhbC5jIFwKKyAgICAgICAgICAgICBnc3Rvc3hjb3JlYXVkaW9yZW1vdGVpby5jCisKK2lmICFIQVZFX0lPUworbGliZ3N0b3N4YXVkaW9fbGFfU09VUkNFUyArPSBnc3Rvc3hhdWRpb2RldmljZXByb3ZpZGVyLmMKK2xpYmdzdG9zeGF1ZGlvX2xhX0xERkxBR1MgKz0gLVdsLC1mcmFtZXdvcmssQXVkaW9Vbml0IC1XbCwtZnJhbWV3b3JrLENvcmVTZXJ2aWNlcworZWxzZQorRVhUUkFfRElTVCArPSBnc3Rvc3hhdWRpb2RldmljZXByb3ZpZGVyLmMKK2VuZGlmCmRpZmYgLS1naXQgYS9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW8uYyBiL3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZGZkYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW8uYwpAQCAtMCwwICsxLDYxIEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgMjAwNywyMDA4IFBpb25lZXJzIG9mIHRoZSBJbmV2aXRhYmxlIDxzb25nYmlyZEBzb25nYmlyZG5lc3QuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqIFRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUgd2FzIG1hZGUgcG9zc2libGUgZHVlIHRvIHRoZSBpbnZvbHZlbWVudCBvZgorICogUGlvbmVlcnMgb2YgdGhlIEluZXZpdGFibGUsIHRoZSBjcmVhdG9ycyBvZiB0aGUgU29uZ2JpcmQgTXVzaWMgcGxheWVyCisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdG9zeGF1ZGlvZWxlbWVudC5oIgorI2luY2x1ZGUgImdzdG9zeGF1ZGlvc2luay5oIgorI2luY2x1ZGUgImdzdG9zeGF1ZGlvc3JjLmgiCisjaWZuZGVmIEhBVkVfSU9TCisjaW5jbHVkZSAiZ3N0b3N4YXVkaW9kZXZpY2Vwcm92aWRlci5oIgorI2VuZGlmCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAib3N4YXVkaW9zaW5rIiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgICAgICBHU1RfVFlQRV9PU1hfQVVESU9fU0lOSykpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAib3N4YXVkaW9zcmMiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIEdTVF9UWVBFX09TWF9BVURJT19TUkMpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisjaWZuZGVmIEhBVkVfSU9TCisgIGlmICghZ3N0X2RldmljZV9wcm92aWRlcl9yZWdpc3RlciAocGx1Z2luLCAib3N4YXVkaW9kZXZpY2Vwcm92aWRlciIsCisgICAgICAgICAgR1NUX1JBTktfUFJJTUFSWSwgR1NUX1RZUEVfT1NYX0FVRElPX0RFVklDRV9QUk9WSURFUikpCisgICAgcmV0dXJuIEZBTFNFOworI2VuZGlmCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBvc3hhdWRpbywKKyAgICAiT1NYIChNYWMgT1MgWCkgYXVkaW8gc3VwcG9ydCBmb3IgR1N0cmVhbWVyIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2RldmljZXByb3ZpZGVyLmMgYi9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9kZXZpY2Vwcm92aWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYTIyMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9kZXZpY2Vwcm92aWRlci5jCkBAIC0wLDAgKzEsMzgwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxNiBIeXVuanVuIEtvIDx6em9vbkBpZ2FsaWEuY29tPgorICoKKyAqIGdzdG9zeGF1ZGlvZGV2aWNlcHJvdmlkZXIuYzogT1NYIGF1ZGlvIGRldmljZSBwcm9iaW5nIGFuZCBtb25pdG9yaW5nCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgImdzdG9zeGF1ZGlvc3JjLmgiCisjaW5jbHVkZSAiZ3N0b3N4YXVkaW9zaW5rLmgiCisjaW5jbHVkZSAiZ3N0b3N4YXVkaW9kZXZpY2Vwcm92aWRlci5oIgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfT1NYX0FVRElPX1NSQ19DQVBTKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9PU1hfQVVESU9fU0lOS19DQVBTKQorICAgICk7CisKK3N0YXRpYyBHc3RPc3hBdWRpb0RldmljZSAqZ3N0X29zeF9hdWRpb19kZXZpY2VfbmV3IChBdWRpb0RldmljZUlEIGRldmljZV9pZCwKKyAgICBjb25zdCBnY2hhciAqIGRldmljZV9uYW1lLCBHc3RPc3hBdWRpb0RldmljZVR5cGUgdHlwZSwKKyAgICBHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKTsKKworR19ERUZJTkVfVFlQRSAoR3N0T3N4QXVkaW9EZXZpY2VQcm92aWRlciwgZ3N0X29zeF9hdWRpb19kZXZpY2VfcHJvdmlkZXIsCisgICAgR1NUX1RZUEVfREVWSUNFX1BST1ZJREVSKTsKKworc3RhdGljIEdMaXN0ICpnc3Rfb3N4X2F1ZGlvX2RldmljZV9wcm92aWRlcl9wcm9iZSAoR3N0RGV2aWNlUHJvdmlkZXIgKgorICAgIHByb3ZpZGVyKTsKKworc3RhdGljIHZvaWQKK2dzdF9vc3hfYXVkaW9fZGV2aWNlX3Byb3ZpZGVyX2NsYXNzX2luaXQgKEdzdE9zeEF1ZGlvRGV2aWNlUHJvdmlkZXJDbGFzcyAqCisgICAga2xhc3MpCit7CisgIEdzdERldmljZVByb3ZpZGVyQ2xhc3MgKmRtX2NsYXNzID0gR1NUX0RFVklDRV9QUk9WSURFUl9DTEFTUyAoa2xhc3MpOworCisgIGRtX2NsYXNzLT5wcm9iZSA9IGdzdF9vc3hfYXVkaW9fZGV2aWNlX3Byb3ZpZGVyX3Byb2JlOworCisgIGdzdF9kZXZpY2VfcHJvdmlkZXJfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZG1fY2xhc3MsCisgICAgICAiT1NYIEF1ZGlvIERldmljZSBQcm92aWRlciIsICJTb3VyY2UvU2luay9BdWRpbyIsCisgICAgICAiTGlzdCBhbmQgbW9uaXRvciBPU1ggYXVkaW8gc291cmNlIGFuZCBzaW5rIGRldmljZXMiLAorICAgICAgIkh5dW5qdW4gS28gPHp6b29uQGlnYWxpYS5jb20+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X2F1ZGlvX2RldmljZV9wcm92aWRlcl9pbml0IChHc3RPc3hBdWRpb0RldmljZVByb3ZpZGVyICogcHJvdmlkZXIpCit7Cit9CisKK3N0YXRpYyBHc3RPc3hBdWRpb0RldmljZSAqCitnc3Rfb3N4X2F1ZGlvX2RldmljZV9wcm92aWRlcl9wcm9iZV9kZXZpY2UgKEdzdE9zeEF1ZGlvRGV2aWNlUHJvdmlkZXIgKgorICAgIHByb3ZpZGVyLCBBdWRpb0RldmljZUlEIGRldmljZV9pZCwgY29uc3QgZ2NoYXIgKiBkZXZpY2VfbmFtZSwKKyAgICBHc3RPc3hBdWRpb0RldmljZVR5cGUgdHlwZSkKK3sKKyAgR3N0T3N4QXVkaW9EZXZpY2UgKmRldmljZSA9IE5VTEw7CisgIEdzdENvcmVBdWRpbyAqY29yZV9hdWRpbzsKKworICBjb3JlX2F1ZGlvID0gZ3N0X2NvcmVfYXVkaW9fbmV3IChOVUxMKTsKKyAgY29yZV9hdWRpby0+aXNfc3JjID0gdHlwZSA9PSBHU1RfT1NYX0FVRElPX0RFVklDRV9UWVBFX1NPVVJDRSA/IFRSVUUgOiBGQUxTRTsKKyAgY29yZV9hdWRpby0+ZGV2aWNlX2lkID0gZGV2aWNlX2lkOworCisgIGlmICghZ3N0X2NvcmVfYXVkaW9fb3BlbiAoY29yZV9hdWRpbykpIHsKKyAgICBHU1RfRVJST1IgKCJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBkZXZpY2UgPSBnc3Rfb3N4X2F1ZGlvX2RldmljZV9uZXcgKGRldmljZV9pZCwgZGV2aWNlX25hbWUsIHR5cGUsIGNvcmVfYXVkaW8pOworCisgIGdzdF9jb3JlX2F1ZGlvX2Nsb3NlIChjb3JlX2F1ZGlvKTsKKworZG9uZToKKyAgZ19vYmplY3RfdW5yZWYgKGNvcmVfYXVkaW8pOworCisgIHJldHVybiBkZXZpY2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ2NoYXIgKgorX2F1ZGlvX2RldmljZV9nZXRfbmFtZSAoQXVkaW9EZXZpY2VJRCBkZXZpY2VfaWQsIGdib29sZWFuIG91dHB1dCkKK3sKKyAgT1NTdGF0dXMgc3RhdHVzID0gbm9FcnI7CisgIFVJbnQzMiBwcm9wZXJ0eVNpemUgPSAwOworICBnY2hhciAqZGV2aWNlX25hbWUgPSBOVUxMOworICBBdWRpb09iamVjdFByb3BlcnR5U2NvcGUgcHJvcF9zY29wZTsKKworICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBkZXZpY2VOYW1lQWRkcmVzcyA9IHsKKyAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eURldmljZU5hbWUsCisgICAga0F1ZGlvRGV2aWNlUHJvcGVydHlTY29wZU91dHB1dCwKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIKKyAgfTsKKworICBwcm9wX3Njb3BlID0gb3V0cHV0ID8ga0F1ZGlvRGV2aWNlUHJvcGVydHlTY29wZU91dHB1dCA6CisgICAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eVNjb3BlSW5wdXQ7CisKKyAgZGV2aWNlTmFtZUFkZHJlc3MubVNjb3BlID0gcHJvcF9zY29wZTsKKworICAvKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgZGV2aWNlIG5hbWUgKi8KKyAgc3RhdHVzID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGFTaXplIChkZXZpY2VfaWQsCisgICAgICAmZGV2aWNlTmFtZUFkZHJlc3MsIDAsIE5VTEwsICZwcm9wZXJ0eVNpemUpOworICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIC8qIEdldCB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlICovCisgIGRldmljZV9uYW1lID0gKGdjaGFyICopIGdfbWFsbG9jIChwcm9wZXJ0eVNpemUpOworICBzdGF0dXMgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YSAoZGV2aWNlX2lkLAorICAgICAgJmRldmljZU5hbWVBZGRyZXNzLCAwLCBOVUxMLCAmcHJvcGVydHlTaXplLCBkZXZpY2VfbmFtZSk7CisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICBnX2ZyZWUgKGRldmljZV9uYW1lKTsKKyAgICBkZXZpY2VfbmFtZSA9IE5VTEw7CisgIH0KKworYmVhY2g6CisgIHJldHVybiBkZXZpY2VfbmFtZTsKK30KKworc3RhdGljIGlubGluZSBnYm9vbGVhbgorX2F1ZGlvX2RldmljZV9oYXNfb3V0cHV0IChBdWRpb0RldmljZUlEIGRldmljZV9pZCkKK3sKKyAgT1NTdGF0dXMgc3RhdHVzID0gbm9FcnI7CisgIFVJbnQzMiBwcm9wZXJ0eVNpemU7CisKKyAgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3Mgc3RyZWFtc0FkZHJlc3MgPSB7CisgICAga0F1ZGlvRGV2aWNlUHJvcGVydHlTdHJlYW1zLAorICAgIGtBdWRpb0RldmljZVByb3BlcnR5U2NvcGVPdXRwdXQsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyCisgIH07CisKKyAgc3RhdHVzID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGFTaXplIChkZXZpY2VfaWQsCisgICAgICAmc3RyZWFtc0FkZHJlc3MsIDAsIE5VTEwsICZwcm9wZXJ0eVNpemUpOworICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChwcm9wZXJ0eVNpemUgPT0gMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW5saW5lIEF1ZGlvRGV2aWNlSUQgKgorX2F1ZGlvX3N5c3RlbV9nZXRfZGV2aWNlcyAoZ2ludCAqIG5kZXZpY2VzKQoreworICBPU1N0YXR1cyBzdGF0dXMgPSBub0VycjsKKyAgVUludDMyIHByb3BlcnR5U2l6ZSA9IDA7CisgIEF1ZGlvRGV2aWNlSUQgKmRldmljZXMgPSBOVUxMOworCisgIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIGF1ZGlvRGV2aWNlc0FkZHJlc3MgPSB7CisgICAga0F1ZGlvSGFyZHdhcmVQcm9wZXJ0eURldmljZXMsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlTY29wZUdsb2JhbCwKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIKKyAgfTsKKworICBzdGF0dXMgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YVNpemUgKGtBdWRpb09iamVjdFN5c3RlbU9iamVjdCwKKyAgICAgICZhdWRpb0RldmljZXNBZGRyZXNzLCAwLCBOVUxMLCAmcHJvcGVydHlTaXplKTsKKyAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgIEdTVF9XQVJOSU5HICgiZmFpbGVkIGdldHRpbmcgbnVtYmVyIG9mIGRldmljZXM6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgICpuZGV2aWNlcyA9IHByb3BlcnR5U2l6ZSAvIHNpemVvZiAoQXVkaW9EZXZpY2VJRCk7CisKKyAgZGV2aWNlcyA9IChBdWRpb0RldmljZUlEICopIGdfbWFsbG9jIChwcm9wZXJ0eVNpemUpOworICBpZiAoZGV2aWNlcykgeworICAgIHN0YXR1cyA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhIChrQXVkaW9PYmplY3RTeXN0ZW1PYmplY3QsCisgICAgICAgICZhdWRpb0RldmljZXNBZGRyZXNzLCAwLCBOVUxMLCAmcHJvcGVydHlTaXplLCBkZXZpY2VzKTsKKyAgICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgICBHU1RfV0FSTklORyAoImZhaWxlZCBnZXR0aW5nIHRoZSBsaXN0IG9mIGRldmljZXM6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgICAgIGdfZnJlZSAoZGV2aWNlcyk7CisgICAgICAqbmRldmljZXMgPSAwOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGRldmljZXM7Cit9CisKK3N0YXRpYyBHTGlzdCAqCitnc3Rfb3N4X2F1ZGlvX2RldmljZV9wcm92aWRlcl9wcm9iZSAoR3N0RGV2aWNlUHJvdmlkZXIgKiBwcm92aWRlcikKK3sKKyAgR3N0T3N4QXVkaW9EZXZpY2VQcm92aWRlciAqc2VsZiA9IEdTVF9PU1hfQVVESU9fREVWSUNFX1BST1ZJREVSIChwcm92aWRlcik7CisgIEdMaXN0ICpkZXZpY2VzID0gTlVMTDsKKyAgR3N0T3N4QXVkaW9EZXZpY2UgKmRldmljZSA9IE5VTEw7CisgIEF1ZGlvRGV2aWNlSUQgKm9zeF9kZXZpY2VzID0gTlVMTDsKKyAgZ2ludCBpLCBuZGV2aWNlcyA9IDA7CisKKyAgb3N4X2RldmljZXMgPSBfYXVkaW9fc3lzdGVtX2dldF9kZXZpY2VzICgmbmRldmljZXMpOworCisgIGlmIChuZGV2aWNlcyA8IDEpIHsKKyAgICBHU1RfV0FSTklORyAoIm5vIGF1ZGlvIG91dHB1dCBkZXZpY2VzIGZvdW5kIik7CisgICAgZ290byBkb25lOworICB9CisKKyAgR1NUX0lORk8gKCJmb3VuZCAlZCBhdWRpbyBkZXZpY2UocykiLCBuZGV2aWNlcyk7CisKKyAgZm9yIChpID0gMDsgaSA8IG5kZXZpY2VzOyBpKyspIHsKKyAgICBnY2hhciAqZGV2aWNlX25hbWU7CisgICAgR3N0T3N4QXVkaW9EZXZpY2VUeXBlIHR5cGUgPSBHU1RfT1NYX0FVRElPX0RFVklDRV9UWVBFX0lOVkFMSUQ7CisKKyAgICBpZiAoKGRldmljZV9uYW1lID0gX2F1ZGlvX2RldmljZV9nZXRfbmFtZSAob3N4X2RldmljZXNbaV0sIEZBTFNFKSkpIHsKKyAgICAgIGlmICghX2F1ZGlvX2RldmljZV9oYXNfb3V0cHV0IChvc3hfZGV2aWNlc1tpXSkpIHsKKyAgICAgICAgR1NUX0RFQlVHICgiSW5wdXQgRGV2aWNlIElEOiAldSBOYW1lOiAlcyIsCisgICAgICAgICAgICAodW5zaWduZWQpIG9zeF9kZXZpY2VzW2ldLCBkZXZpY2VfbmFtZSk7CisgICAgICAgIHR5cGUgPSBHU1RfT1NYX0FVRElPX0RFVklDRV9UWVBFX1NPVVJDRTsKKworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHICgiT3V0cHV0IERldmljZSBJRDogJXUgTmFtZTogJXMiLAorICAgICAgICAgICAgKHVuc2lnbmVkKSBvc3hfZGV2aWNlc1tpXSwgZGV2aWNlX25hbWUpOworICAgICAgICB0eXBlID0gR1NUX09TWF9BVURJT19ERVZJQ0VfVFlQRV9TSU5LOworICAgICAgfQorCisgICAgICBkZXZpY2UgPQorICAgICAgICAgIGdzdF9vc3hfYXVkaW9fZGV2aWNlX3Byb3ZpZGVyX3Byb2JlX2RldmljZSAoc2VsZiwgb3N4X2RldmljZXNbaV0sCisgICAgICAgICAgZGV2aWNlX25hbWUsIHR5cGUpOworICAgICAgaWYgKGRldmljZSkgeworICAgICAgICBnc3Rfb2JqZWN0X3JlZl9zaW5rIChkZXZpY2UpOworICAgICAgICBkZXZpY2VzID0gZ19saXN0X3ByZXBlbmQgKGRldmljZXMsIGRldmljZSk7CisgICAgICB9CisKKyAgICAgIGdfZnJlZSAoZGV2aWNlX25hbWUpOworICAgIH0KKyAgfQorCitkb25lOgorICBnX2ZyZWUgKG9zeF9kZXZpY2VzKTsKKworICByZXR1cm4gZGV2aWNlczsKK30KKworZW51bQoreworICBQUk9QX0RFVklDRV9JRCA9IDEsCit9OworCitHX0RFRklORV9UWVBFIChHc3RPc3hBdWRpb0RldmljZSwgZ3N0X29zeF9hdWRpb19kZXZpY2UsIEdTVF9UWVBFX0RFVklDRSk7CisKK3N0YXRpYyB2b2lkIGdzdF9vc3hfYXVkaW9fZGV2aWNlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9vc3hfYXVkaW9fZGV2aWNlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyBHc3RFbGVtZW50ICpnc3Rfb3N4X2F1ZGlvX2RldmljZV9jcmVhdGVfZWxlbWVudCAoR3N0RGV2aWNlICogZGV2aWNlLAorICAgIGNvbnN0IGdjaGFyICogbmFtZSk7CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X2F1ZGlvX2RldmljZV9jbGFzc19pbml0IChHc3RPc3hBdWRpb0RldmljZUNsYXNzICoga2xhc3MpCit7CisgIEdzdERldmljZUNsYXNzICpkZXZfY2xhc3MgPSBHU1RfREVWSUNFX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBkZXZfY2xhc3MtPmNyZWF0ZV9lbGVtZW50ID0gZ3N0X29zeF9hdWRpb19kZXZpY2VfY3JlYXRlX2VsZW1lbnQ7CisKKyAgb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfb3N4X2F1ZGlvX2RldmljZV9nZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X29zeF9hdWRpb19kZXZpY2Vfc2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKG9iamVjdF9jbGFzcywgUFJPUF9ERVZJQ0VfSUQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiZGV2aWNlLWlkIiwgIkRldmljZSBJRCIsICJEZXZpY2UgSUQgb2YgaW5wdXQgZGV2aWNlIiwKKyAgICAgICAgICAwLCBHX01BWElOVCwgMCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X2F1ZGlvX2RldmljZV9pbml0IChHc3RPc3hBdWRpb0RldmljZSAqIGRldmljZSkKK3sKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorZ3N0X29zeF9hdWRpb19kZXZpY2VfY3JlYXRlX2VsZW1lbnQgKEdzdERldmljZSAqIGRldmljZSwgY29uc3QgZ2NoYXIgKiBuYW1lKQoreworICBHc3RPc3hBdWRpb0RldmljZSAqb3N4ZGV2ID0gR1NUX09TWF9BVURJT19ERVZJQ0UgKGRldmljZSk7CisgIEdzdEVsZW1lbnQgKmVsZW07CisKKyAgZWxlbSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAob3N4ZGV2LT5lbGVtZW50LCBuYW1lKTsKKyAgZ19vYmplY3Rfc2V0IChlbGVtLCAiZGV2aWNlIiwgb3N4ZGV2LT5kZXZpY2VfaWQsIE5VTEwpOworCisgIHJldHVybiBlbGVtOworfQorCitzdGF0aWMgR3N0T3N4QXVkaW9EZXZpY2UgKgorZ3N0X29zeF9hdWRpb19kZXZpY2VfbmV3IChBdWRpb0RldmljZUlEIGRldmljZV9pZCwgY29uc3QgZ2NoYXIgKiBkZXZpY2VfbmFtZSwKKyAgICBHc3RPc3hBdWRpb0RldmljZVR5cGUgdHlwZSwgR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbykKK3sKKyAgR3N0T3N4QXVkaW9EZXZpY2UgKmdzdGRldjsKKyAgY29uc3QgZ2NoYXIgKmVsZW1lbnRfbmFtZSA9IE5VTEw7CisgIGNvbnN0IGdjaGFyICprbGFzcyA9IE5VTEw7CisgIEdzdENhcHMgKnRlbXBsYXRlX2NhcHMsICpjYXBzOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChkZXZpY2VfaWQgPiAwLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGRldmljZV9uYW1lLCBOVUxMKTsKKworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEdTVF9PU1hfQVVESU9fREVWSUNFX1RZUEVfU09VUkNFOgorICAgICAgZWxlbWVudF9uYW1lID0gIm9zeGF1ZGlvc3JjIjsKKyAgICAgIGtsYXNzID0gIkF1ZGlvL1NvdXJjZSI7CisKKyAgICAgIHRlbXBsYXRlX2NhcHMgPSBnc3Rfc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXRfY2FwcyAoJnNyY19mYWN0b3J5KTsKKyAgICAgIGNhcHMgPSBnc3RfY29yZV9hdWRpb19wcm9iZV9jYXBzIChjb3JlX2F1ZGlvLCB0ZW1wbGF0ZV9jYXBzKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmICh0ZW1wbGF0ZV9jYXBzKTsKKworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfT1NYX0FVRElPX0RFVklDRV9UWVBFX1NJTks6CisgICAgICBlbGVtZW50X25hbWUgPSAib3N4YXVkaW9zaW5rIjsKKyAgICAgIGtsYXNzID0gIkF1ZGlvL1NpbmsiOworCisgICAgICB0ZW1wbGF0ZV9jYXBzID0gZ3N0X3N0YXRpY19wYWRfdGVtcGxhdGVfZ2V0X2NhcHMgKCZzaW5rX2ZhY3RvcnkpOworICAgICAgY2FwcyA9IGdzdF9jb3JlX2F1ZGlvX3Byb2JlX2NhcHMgKGNvcmVfYXVkaW8sIHRlbXBsYXRlX2NhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKHRlbXBsYXRlX2NhcHMpOworCisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICBicmVhazsKKyAgfQorCisgIGdzdGRldiA9IGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfT1NYX0FVRElPX0RFVklDRSwgImRldmljZS1pZCIsCisgICAgICBkZXZpY2VfaWQsICJkaXNwbGF5LW5hbWUiLCBkZXZpY2VfbmFtZSwgImNhcHMiLCBjYXBzLCAiZGV2aWNlLWNsYXNzIiwKKyAgICAgIGtsYXNzLCBOVUxMKTsKKworICBnc3RkZXYtPmVsZW1lbnQgPSBlbGVtZW50X25hbWU7CisKKworICByZXR1cm4gZ3N0ZGV2OworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zeF9hdWRpb19kZXZpY2VfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE9zeEF1ZGlvRGV2aWNlICpkZXZpY2U7CisKKyAgZGV2aWNlID0gR1NUX09TWF9BVURJT19ERVZJQ0VfQ0FTVCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfREVWSUNFX0lEOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZGV2aWNlLT5kZXZpY2VfaWQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X2F1ZGlvX2RldmljZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0T3N4QXVkaW9EZXZpY2UgKmRldmljZTsKKworICBkZXZpY2UgPSBHU1RfT1NYX0FVRElPX0RFVklDRV9DQVNUIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9ERVZJQ0VfSUQ6CisgICAgICBkZXZpY2UtPmRldmljZV9pZCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvZGV2aWNlcHJvdmlkZXIuaCBiL3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2RldmljZXByb3ZpZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ1NDE3OAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2RldmljZXByb3ZpZGVyLmgKQEAgLTAsMCArMSw5MSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSHl1bmp1biBLbyA8enpvb25AaWdhbGlhLmNvbT4KKyAqCisgKiBnc3Rvc3hhdWRpb2RldmljZWVwcm92aWRlci5oOiBPU1ggYXVkaW8gcHJvYmluZyBhbmQgbW9uaXRvcmluZworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9PU1hfQVVESU9fREVJVkNFX1BST1ZJREVSX0hfXworI2RlZmluZSBfX0dTVF9PU1hfQVVESU9fREVJVkNFX1BST1ZJREVSX0hfXworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSAiZ3N0b3N4Y29yZWF1ZGlvY29tbW9uLmgiCisKK0dfQkVHSU5fREVDTFMKK3R5cGVkZWYgc3RydWN0IF9Hc3RPc3hBdWRpb0RldmljZVByb3ZpZGVyIEdzdE9zeEF1ZGlvRGV2aWNlUHJvdmlkZXI7Cit0eXBlZGVmIHN0cnVjdCBfR3N0T3N4QXVkaW9EZXZpY2VQcm92aWRlckNsYXNzIEdzdE9zeEF1ZGlvRGV2aWNlUHJvdmlkZXJDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9PU1hfQVVESU9fREVWSUNFX1BST1ZJREVSICAgICAgICAgICAgICAgICAoZ3N0X29zeF9hdWRpb19kZXZpY2VfcHJvdmlkZXJfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0lTX09TWF9BVURJT19ERVZJQ0VfUFJPVklERVIob2JqKSAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfT1NYX0FVRElPX0RFVklDRV9QUk9WSURFUikpCisjZGVmaW5lIEdTVF9JU19PU1hfQVVESU9fREVWSUNFX1BST1ZJREVSX0NMQVNTKGtsYXNzKSAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgR1NUX1RZUEVfT1NYX0FVRElPX0RFVklDRV9QUk9WSURFUikpCisjZGVmaW5lIEdTVF9PU1hfQVVESU9fREVWSUNFX1BST1ZJREVSX0dFVF9DTEFTUyhvYmopICAgICAgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfT1NYX0FVRElPX0RFVklDRV9QUk9WSURFUiwgR3N0T3N4QXVkaW9EZXZpY2VQcm92aWRlckNsYXNzKSkKKyNkZWZpbmUgR1NUX09TWF9BVURJT19ERVZJQ0VfUFJPVklERVIob2JqKSAgICAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfT1NYX0FVRElPX0RFVklDRV9QUk9WSURFUiwgR3N0T3N4QXVkaW9EZXZpY2VQcm92aWRlcikpCisjZGVmaW5lIEdTVF9PU1hfQVVESU9fREVWSUNFX1BST1ZJREVSX0NMQVNTKGtsYXNzKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfREVWSUNFX1BST1ZJREVSLCBHc3RPc3hBdWRpb0RldmljZVByb3ZpZGVyQ2xhc3MpKQorI2RlZmluZSBHU1RfT1NYX0FVRElPX0RFVklDRV9QUk9WSURFUl9DQVNUKG9iaikgICAgICAgICAgICAoKEdzdE9zeEF1ZGlvRGV2aWNlUHJvdmlkZXIgKikob2JqKSkKKworc3RydWN0IF9Hc3RPc3hBdWRpb0RldmljZVByb3ZpZGVyCit7CisgIEdzdERldmljZVByb3ZpZGVyIHBhcmVudDsKK307CisKK3N0cnVjdCBfR3N0T3N4QXVkaW9EZXZpY2VQcm92aWRlckNsYXNzCit7CisgIEdzdERldmljZVByb3ZpZGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X29zeF9hdWRpb19kZXZpY2VfcHJvdmlkZXJfZ2V0X3R5cGUgKHZvaWQpOworCit0eXBlZGVmIHN0cnVjdCBfR3N0T3N4QXVkaW9EZXZpY2UgR3N0T3N4QXVkaW9EZXZpY2U7Cit0eXBlZGVmIHN0cnVjdCBfR3N0T3N4QXVkaW9EZXZpY2VDbGFzcyBHc3RPc3hBdWRpb0RldmljZUNsYXNzOworCisjZGVmaW5lIEdTVF9UWVBFX09TWF9BVURJT19ERVZJQ0UgICAgICAgICAgICAgICAgIChnc3Rfb3N4X2F1ZGlvX2RldmljZV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfSVNfT1NYX0FVRElPX0RFVklDRShvYmopICAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9PU1hfQVVESU9fREVWSUNFKSkKKyNkZWZpbmUgR1NUX0lTX09TWF9BVURJT19ERVZJQ0VfQ0xBU1Moa2xhc3MpICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9PU1hfQVVESU9fREVWSUNFKSkKKyNkZWZpbmUgR1NUX09TWF9BVURJT19ERVZJQ0VfR0VUX0NMQVNTKG9iaikgICAgICAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9PU1hfQVVESU9fREVWSUNFLCBHc3RPc3hBdWRpb0NsYXNzKSkKKyNkZWZpbmUgR1NUX09TWF9BVURJT19ERVZJQ0Uob2JqKSAgICAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfT1NYX0FVRElPX0RFVklDRSwgR3N0T3N4QXVkaW9EZXZpY2UpKQorI2RlZmluZSBHU1RfT1NYX0FVRElPX0RFVklDRV9DTEFTUyhrbGFzcykgICAgICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIEdTVF9UWVBFX0RFVklDRSwgR3N0T3N4QXVkaW9EZXZpY2VDbGFzcykpCisjZGVmaW5lIEdTVF9PU1hfQVVESU9fREVWSUNFX0NBU1Qob2JqKSAgICAgICAgICAgICgoR3N0T3N4QXVkaW9EZXZpY2UgKikob2JqKSkKKwordHlwZWRlZiBlbnVtCit7CisgIEdTVF9PU1hfQVVESU9fREVWSUNFX1RZUEVfSU5WQUxJRCA9IDAsCisgIEdTVF9PU1hfQVVESU9fREVWSUNFX1RZUEVfU09VUkNFLAorICBHU1RfT1NYX0FVRElPX0RFVklDRV9UWVBFX1NJTksKK30gR3N0T3N4QXVkaW9EZXZpY2VUeXBlOworCitzdHJ1Y3QgX0dzdE9zeEF1ZGlvRGV2aWNlCit7CisgIEdzdERldmljZSBwYXJlbnQ7CisKKyAgY29uc3QgZ2NoYXIgKmVsZW1lbnQ7CisgIEF1ZGlvRGV2aWNlSUQgZGV2aWNlX2lkOworfTsKKworc3RydWN0IF9Hc3RPc3hBdWRpb0RldmljZUNsYXNzCit7CisgIEdzdERldmljZUNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9vc3hfYXVkaW9fZGV2aWNlX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9PU1hfQVVESU9fREVJVkNFX1BST1ZJREVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvZWxlbWVudC5jIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvZWxlbWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYzI0ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9lbGVtZW50LmMKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA2IFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA3IFBpb25lZXJzIG9mIHRoZSBJbmV2aXRhYmxlIDxzb25nYmlyZEBzb25nYmlyZG5lc3QuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xICh0aGUgIkxHUEwiKSwgaW4KKyAqIHdoaWNoIGNhc2UgdGhlIGZvbGxvd2luZyBwcm92aXNpb25zIGFwcGx5IGluc3RlYWQgb2YgdGhlIG9uZXMKKyAqIG1lbnRpb25lZCBhYm92ZToKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKiBUaGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIHdhcyBtYWRlIHBvc3NpYmxlIGR1ZSB0byB0aGUgaW52b2x2ZW1lbnQgb2YKKyAqIFBpb25lZXJzIG9mIHRoZSBJbmV2aXRhYmxlLCB0aGUgY3JlYXRvcnMgb2YgdGhlIFNvbmdiaXJkIE11c2ljIHBsYXllcgorICoKKyAqLworCisjaW5jbHVkZSAiZ3N0b3N4YXVkaW9lbGVtZW50LmgiCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitzdGF0aWMgdm9pZAorZ3N0X29zeF9hdWRpb19lbGVtZW50X2ludGVyZmFjZV9pbml0IChHc3RPc3hBdWRpb0VsZW1lbnRJbnRlcmZhY2UgKiBpZmFjZSk7CisKK0dUeXBlCitnc3Rfb3N4X2F1ZGlvX2VsZW1lbnRfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBnc3Rfb3N4YXVkaW9lbGVtZW50X3R5cGUgPSAwOworCisgIGlmICghZ3N0X29zeGF1ZGlvZWxlbWVudF90eXBlKSB7CisgICAgc3RhdGljIGNvbnN0IEdUeXBlSW5mbyBnc3Rfb3N4YXVkaW9lbGVtZW50X2luZm8gPSB7CisgICAgICBzaXplb2YgKEdzdE9zeEF1ZGlvRWxlbWVudEludGVyZmFjZSksCisgICAgICAoR0Jhc2VJbml0RnVuYykgZ3N0X29zeF9hdWRpb19lbGVtZW50X2ludGVyZmFjZV9pbml0LAorICAgICAgTlVMTCwKKyAgICAgIE5VTEwsCisgICAgICBOVUxMLAorICAgICAgTlVMTCwKKyAgICAgIDAsCisgICAgICAwLAorICAgICAgTlVMTCwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgZ3N0X29zeGF1ZGlvZWxlbWVudF90eXBlID0gZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyAoR19UWVBFX0lOVEVSRkFDRSwKKyAgICAgICAgIkdzdE9zeEF1ZGlvRWxlbWVudCIsICZnc3Rfb3N4YXVkaW9lbGVtZW50X2luZm8sIDApOworICB9CisKKyAgcmV0dXJuIGdzdF9vc3hhdWRpb2VsZW1lbnRfdHlwZTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfYXVkaW9fZWxlbWVudF9pbnRlcmZhY2VfaW5pdCAoR3N0T3N4QXVkaW9FbGVtZW50SW50ZXJmYWNlICogaWZhY2UpCit7CisgIHN0YXRpYyBnYm9vbGVhbiBpbml0aWFsaXplZCA9IEZBTFNFOworCisgIGlmICghaW5pdGlhbGl6ZWQpIHsKKyAgICBpbml0aWFsaXplZCA9IFRSVUU7CisgIH0KKworICAvKiBkZWZhdWx0IHZpcnR1YWwgZnVuY3Rpb25zICovCisgIGlmYWNlLT5pb19wcm9jID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2VsZW1lbnQuaCBiL3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2VsZW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTA5ZGMxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvZWxlbWVudC5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBQaW9uZWVycyBvZiB0aGUgSW5ldml0YWJsZSA8c29uZ2JpcmRAc29uZ2JpcmRuZXN0LmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSAodGhlICJMR1BMIiksIGluCisgKiB3aGljaCBjYXNlIHRoZSBmb2xsb3dpbmcgcHJvdmlzaW9ucyBhcHBseSBpbnN0ZWFkIG9mIHRoZSBvbmVzCisgKiBtZW50aW9uZWQgYWJvdmU6CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICogVGhlIGRldmVsb3BtZW50IG9mIHRoaXMgY29kZSB3YXMgbWFkZSBwb3NzaWJsZSBkdWUgdG8gdGhlIGludm9sdmVtZW50IG9mCisgKiBQaW9uZWVycyBvZiB0aGUgSW5ldml0YWJsZSwgdGhlIGNyZWF0b3JzIG9mIHRoZSBTb25nYmlyZCBNdXNpYyBwbGF5ZXIKKyAqCisgKi8KKworI2lmbmRlZiBfX0dTVF9PU1hfQVVESU9fRUxFTUVOVF9IX18KKyNkZWZpbmUgX19HU1RfT1NYX0FVRElPX0VMRU1FTlRfSF9fCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2lmZGVmIEhBVkVfSU9TCisjaW5jbHVkZSA8Q29yZUF1ZGlvL0NvcmVBdWRpb1R5cGVzLmg+CisjZWxzZQorI2luY2x1ZGUgPENvcmVBdWRpby9Db3JlQXVkaW8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPEF1ZGlvVW5pdC9BdWRpb1VuaXQuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9PU1hfQVVESU9fRUxFTUVOVF9UWVBFIFwKKyAgKGdzdF9vc3hfYXVkaW9fZWxlbWVudF9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfT1NYX0FVRElPX0VMRU1FTlQob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfT1NYX0FVRElPX0VMRU1FTlRfVFlQRSxHc3RPc3hBdWRpb0VsZW1lbnRJbnRlcmZhY2UpKQorI2RlZmluZSBHU1RfSVNfT1NYX0FVRElPX0VMRU1FTlQob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfT1NYX0FVRElPX0VMRU1FTlRfVFlQRSkpCisjZGVmaW5lIEdTVF9PU1hfQVVESU9fRUxFTUVOVF9HRVRfSU5URVJGQUNFKGluc3QpIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfSU5URVJGQUNFKChpbnN0KSxHU1RfT1NYX0FVRElPX0VMRU1FTlRfVFlQRSxHc3RPc3hBdWRpb0VsZW1lbnRJbnRlcmZhY2UpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0T3N4QXVkaW9FbGVtZW50SW50ZXJmYWNlIEdzdE9zeEF1ZGlvRWxlbWVudEludGVyZmFjZTsKKworc3RydWN0IF9Hc3RPc3hBdWRpb0VsZW1lbnRJbnRlcmZhY2UKK3sKKyAgR1R5cGVJbnRlcmZhY2UgcGFyZW50OworCisgIE9TU3RhdHVzICgqaW9fcHJvYykgKHZvaWQgKiB1c2VyZGF0YSwKKyAgICAgIEF1ZGlvVW5pdFJlbmRlckFjdGlvbkZsYWdzICogaW9BY3Rpb25GbGFncywKKyAgICAgIGNvbnN0IEF1ZGlvVGltZVN0YW1wICogaW5UaW1lU3RhbXAsCisgICAgICBVSW50MzIgaW5CdXNOdW1iZXIsIFVJbnQzMiBpbk51bWJlckZyYW1lcywKKyAgICAgIEF1ZGlvQnVmZmVyTGlzdCAqIGJ1ZmZlckxpc3QpOworfTsKKworR1R5cGUgZ3N0X29zeF9hdWRpb19lbGVtZW50X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX09TWF9BVURJT19FTEVNRU5UX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5jIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMDFlMDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9yaW5nYnVmZmVyLmMKQEAgLTAsMCArMSwzMTggQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBQaW9uZWVycyBvZiB0aGUgSW5ldml0YWJsZSA8c29uZ2JpcmRAc29uZ2JpcmRuZXN0LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBGbHVlbmRvIFMuQS4gPHN1cHBvcnRAZmx1ZW5kby5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgKHRoZSAiTEdQTCIpLCBpbgorICogd2hpY2ggY2FzZSB0aGUgZm9sbG93aW5nIHByb3Zpc2lvbnMgYXBwbHkgaW5zdGVhZCBvZiB0aGUgb25lcworICogbWVudGlvbmVkIGFib3ZlOgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8tY2hhbm5lbHMuaD4KKyNpbmNsdWRlICJnc3Rvc3hhdWRpb3JpbmdidWZmZXIuaCIKKyNpbmNsdWRlICJnc3Rvc3hhdWRpb3NpbmsuaCIKKyNpbmNsdWRlICJnc3Rvc3hhdWRpb3NyYy5oIgorCisjaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAgICAgICAgIC8qIGZvciBnZXRwaWQoKSAqLworCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChvc3hfYXVkaW9fZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgb3N4X2F1ZGlvX2RlYnVnCisKKyNpbmNsdWRlICJnc3Rvc3hjb3JlYXVkaW8uaCIKKworc3RhdGljIHZvaWQgZ3N0X29zeF9hdWRpb19yaW5nX2J1ZmZlcl9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX29wZW5fZGV2aWNlIChHc3RBdWRpb1JpbmdCdWZmZXIgKgorICAgIGJ1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zeF9hdWRpb19yaW5nX2J1ZmZlcl9jbG9zZV9kZXZpY2UgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqCisgICAgYnVmKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfYWNxdWlyZSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmLAorICAgIEdzdEF1ZGlvUmluZ0J1ZmZlclNwZWMgKiBzcGVjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX3JlbGVhc2UgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX3N0YXJ0IChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpOworc3RhdGljIGdib29sZWFuIGdzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfcGF1c2UgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zeF9hdWRpb19yaW5nX2J1ZmZlcl9zdG9wIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpOworc3RhdGljIGd1aW50IGdzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfZGVsYXkgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1Zik7CitzdGF0aWMgR3N0QXVkaW9SaW5nQnVmZmVyQ2xhc3MgKnJpbmdfcGFyZW50X2NsYXNzID0gTlVMTDsKKworI2RlZmluZSBnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX2RvX2luaXQgXAorICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAob3N4X2F1ZGlvX2RlYnVnLCAib3N4YXVkaW8iLCAwLCAiT1NYIEF1ZGlvIEVsZW1lbnRzIik7CisKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RPc3hBdWRpb1JpbmdCdWZmZXIsIGdzdF9vc3hfYXVkaW9fcmluZ19idWZmZXIsCisgICAgR1NUX1RZUEVfQVVESU9fUklOR19CVUZGRVIsIGdzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfZG9faW5pdCk7CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX2NsYXNzX2luaXQgKEdzdE9zeEF1ZGlvUmluZ0J1ZmZlckNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0QXVkaW9SaW5nQnVmZmVyQ2xhc3MgKmdzdHJpbmdidWZmZXJfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MgPSAoR3N0QXVkaW9SaW5nQnVmZmVyQ2xhc3MgKikga2xhc3M7CisKKyAgcmluZ19wYXJlbnRfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X29zeF9hdWRpb19yaW5nX2J1ZmZlcl9kaXNwb3NlOworCisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPm9wZW5fZGV2aWNlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX29wZW5fZGV2aWNlKTsKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcy0+Y2xvc2VfZGV2aWNlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX2Nsb3NlX2RldmljZSk7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPmFjcXVpcmUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfYWNxdWlyZSk7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPnJlbGVhc2UgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfcmVsZWFzZSk7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPnN0YXJ0ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX3N0YXJ0KTsKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcy0+cGF1c2UgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfcGF1c2UpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5yZXN1bWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfc3RhcnQpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5zdG9wID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX3N0b3ApOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5kZWxheSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zeF9hdWRpb19yaW5nX2J1ZmZlcl9kZWxheSk7CisKKyAgR1NUX0RFQlVHICgib3N4IGF1ZGlvIHJpbmcgYnVmZmVyIGNsYXNzIGluaXQiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfaW5pdCAoR3N0T3N4QXVkaW9SaW5nQnVmZmVyICogcmluZ2J1ZmZlcikKK3sKKyAgcmluZ2J1ZmZlci0+Y29yZV9hdWRpbyA9IGdzdF9jb3JlX2F1ZGlvX25ldyAoR1NUX09CSkVDVCAocmluZ2J1ZmZlcikpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zeF9hdWRpb19yaW5nX2J1ZmZlcl9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RPc3hBdWRpb1JpbmdCdWZmZXIgKm9zeGJ1ZjsKKworICBvc3hidWYgPSBHU1RfT1NYX0FVRElPX1JJTkdfQlVGRkVSIChvYmplY3QpOworCisgIGlmIChvc3hidWYtPmNvcmVfYXVkaW8pIHsKKyAgICBnX29iamVjdF91bnJlZiAob3N4YnVmLT5jb3JlX2F1ZGlvKTsKKyAgICBvc3hidWYtPmNvcmVfYXVkaW8gPSBOVUxMOworICB9CisgIEdfT0JKRUNUX0NMQVNTIChyaW5nX3BhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zeF9hdWRpb19yaW5nX2J1ZmZlcl9vcGVuX2RldmljZSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RPYmplY3QgKm9zeGVsID0gR1NUX09CSkVDVF9QQVJFTlQgKGJ1Zik7CisgIEdzdE9zeEF1ZGlvUmluZ0J1ZmZlciAqb3N4YnVmID0gR1NUX09TWF9BVURJT19SSU5HX0JVRkZFUiAoYnVmKTsKKworICBpZiAoIWdzdF9jb3JlX2F1ZGlvX3NlbGVjdF9kZXZpY2UgKG9zeGJ1Zi0+Y29yZV9hdWRpbykpIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAob3N4ZWwsIFJFU09VUkNFLCBOT1RfRk9VTkQsCisgICAgICAgIChfKCJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIpKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoIWdzdF9jb3JlX2F1ZGlvX29wZW4gKG9zeGJ1Zi0+Y29yZV9hdWRpbykpIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAob3N4ZWwsIFJFU09VUkNFLCBPUEVOX1JFQUQsCisgICAgICAgIChfKCJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiKSksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zeF9hdWRpb19yaW5nX2J1ZmZlcl9jbG9zZV9kZXZpY2UgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0T3N4QXVkaW9SaW5nQnVmZmVyICpvc3hidWY7CisgIG9zeGJ1ZiA9IEdTVF9PU1hfQVVESU9fUklOR19CVUZGRVIgKGJ1Zik7CisKKyAgcmV0dXJuIGdzdF9jb3JlX2F1ZGlvX2Nsb3NlIChvc3hidWYtPmNvcmVfYXVkaW8pOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfYWNxdWlyZSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmLAorICAgIEdzdEF1ZGlvUmluZ0J1ZmZlclNwZWMgKiBzcGVjKQoreworICBnYm9vbGVhbiByZXQgPSBGQUxTRSwgaXNfcGFzc3Rocm91Z2ggPSBGQUxTRTsKKyAgR3N0T3N4QXVkaW9SaW5nQnVmZmVyICpvc3hidWY7CisgIEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiBmb3JtYXQ7CisKKyAgb3N4YnVmID0gR1NUX09TWF9BVURJT19SSU5HX0JVRkZFUiAoYnVmKTsKKworICBpZiAoUklOR0JVRkZFUl9JU19TUERJRiAoc3BlYy0+dHlwZSkpIHsKKyAgICBmb3JtYXQubUZvcm1hdElEID0ga0F1ZGlvRm9ybWF0NjA5NThBQzM7CisgICAgZm9ybWF0Lm1TYW1wbGVSYXRlID0gKGRvdWJsZSkgR1NUX0FVRElPX0lORk9fUkFURSAoJnNwZWMtPmluZm8pOworICAgIGZvcm1hdC5tQ2hhbm5lbHNQZXJGcmFtZSA9IDI7CisgICAgZm9ybWF0Lm1Gb3JtYXRGbGFncyA9IGtBdWRpb0Zvcm1hdEZsYWdJc1NpZ25lZEludGVnZXIgfAorICAgICAgICBrQXVkaW9Gb3JtYXRGbGFnSXNQYWNrZWQgfCBrQXVkaW9Gb3JtYXRGbGFnSXNOb25NaXhhYmxlOworICAgIGZvcm1hdC5tQnl0ZXNQZXJGcmFtZSA9IDA7CisgICAgZm9ybWF0Lm1CaXRzUGVyQ2hhbm5lbCA9IDE2OworICAgIGZvcm1hdC5tQnl0ZXNQZXJQYWNrZXQgPSA2MTQ0OworICAgIGZvcm1hdC5tRnJhbWVzUGVyUGFja2V0ID0gMTUzNjsKKyAgICBmb3JtYXQubVJlc2VydmVkID0gMDsKKyAgICBzcGVjLT5zZWdzaXplID0gNjE0NDsKKyAgICBzcGVjLT5zZWd0b3RhbCA9IDEwOworICAgIGlzX3Bhc3N0aHJvdWdoID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgd2lkdGgsIGRlcHRoOworICAgIC8qIEZpbGwgb3V0IHRoZSBhdWRpbyBkZXNjcmlwdGlvbiB3ZSdyZSBnb2luZyB0byBiZSB1c2luZyAqLworICAgIGZvcm1hdC5tRm9ybWF0SUQgPSBrQXVkaW9Gb3JtYXRMaW5lYXJQQ007CisgICAgZm9ybWF0Lm1TYW1wbGVSYXRlID0gKGRvdWJsZSkgR1NUX0FVRElPX0lORk9fUkFURSAoJnNwZWMtPmluZm8pOworICAgIGZvcm1hdC5tQ2hhbm5lbHNQZXJGcmFtZSA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTICgmc3BlYy0+aW5mbyk7CisgICAgaWYgKEdTVF9BVURJT19JTkZPX0lTX0ZMT0FUICgmc3BlYy0+aW5mbykpIHsKKyAgICAgIGZvcm1hdC5tRm9ybWF0RmxhZ3MgPSBrQXVkaW9Gb3JtYXRGbGFnc05hdGl2ZUZsb2F0UGFja2VkOworICAgICAgd2lkdGggPSBkZXB0aCA9IEdTVF9BVURJT19JTkZPX1dJRFRIICgmc3BlYy0+aW5mbyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvcm1hdC5tRm9ybWF0RmxhZ3MgPSBrQXVkaW9Gb3JtYXRGbGFnSXNTaWduZWRJbnRlZ2VyOworICAgICAgd2lkdGggPSBHU1RfQVVESU9fSU5GT19XSURUSCAoJnNwZWMtPmluZm8pOworICAgICAgZGVwdGggPSBHU1RfQVVESU9fSU5GT19ERVBUSCAoJnNwZWMtPmluZm8pOworICAgICAgaWYgKHdpZHRoID09IGRlcHRoKSB7CisgICAgICAgIGZvcm1hdC5tRm9ybWF0RmxhZ3MgfD0ga0F1ZGlvRm9ybWF0RmxhZ0lzUGFja2VkOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9ybWF0Lm1Gb3JtYXRGbGFncyB8PSBrQXVkaW9Gb3JtYXRGbGFnSXNBbGlnbmVkSGlnaDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoR1NUX0FVRElPX0lORk9fSVNfQklHX0VORElBTiAoJnNwZWMtPmluZm8pKSB7CisgICAgICBmb3JtYXQubUZvcm1hdEZsYWdzIHw9IGtBdWRpb0Zvcm1hdEZsYWdJc0JpZ0VuZGlhbjsKKyAgICB9CisKKyAgICBmb3JtYXQubUJ5dGVzUGVyRnJhbWUgPSBHU1RfQVVESU9fSU5GT19CUEYgKCZzcGVjLT5pbmZvKTsKKyAgICBmb3JtYXQubUJpdHNQZXJDaGFubmVsID0gZGVwdGg7CisgICAgZm9ybWF0Lm1CeXRlc1BlclBhY2tldCA9IEdTVF9BVURJT19JTkZPX0JQRiAoJnNwZWMtPmluZm8pOworICAgIGZvcm1hdC5tRnJhbWVzUGVyUGFja2V0ID0gMTsKKyAgICBmb3JtYXQubVJlc2VydmVkID0gMDsKKyAgICBzcGVjLT5zZWdzaXplID0KKyAgICAgICAgKHNwZWMtPmxhdGVuY3lfdGltZSAqIEdTVF9BVURJT19JTkZPX1JBVEUgKCZzcGVjLT5pbmZvKSAvCisgICAgICAgIEdfVVNFQ19QRVJfU0VDKSAqIEdTVF9BVURJT19JTkZPX0JQRiAoJnNwZWMtPmluZm8pOworICAgIHNwZWMtPnNlZ3RvdGFsID0gc3BlYy0+YnVmZmVyX3RpbWUgLyBzcGVjLT5sYXRlbmN5X3RpbWU7CisgICAgaXNfcGFzc3Rocm91Z2ggPSBGQUxTRTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKG9zeGJ1ZiwgIkZvcm1hdDogIiBDT1JFX0FVRElPX0ZPUk1BVCwKKyAgICAgIENPUkVfQVVESU9fRk9STUFUX0FSR1MgKGZvcm1hdCkpOworCisgIC8qIGdzdF9hdWRpb19yaW5nX2J1ZmZlcl9zZXRfY2hhbm5lbF9wb3NpdGlvbnMgaXMgbm90IGNhbGxlZAorICAgKiBzaW5jZSB0aGUgQVVzIHBlcmZvcm0gY2hhbm5lbCByZW9yZGVyaW5nIHRoZW1zZWx2ZXMuCisgICAqIChzZWUgZ3N0X2NvcmVfYXVkaW9fc2V0X2NoYW5uZWxfbGF5b3V0KSAqLworCisgIGJ1Zi0+c2l6ZSA9IHNwZWMtPnNlZ3RvdGFsICogc3BlYy0+c2Vnc2l6ZTsKKyAgYnVmLT5tZW1vcnkgPSBnX21hbGxvYzAgKGJ1Zi0+c2l6ZSk7CisKKyAgcmV0ID0gZ3N0X2NvcmVfYXVkaW9faW5pdGlhbGl6ZSAob3N4YnVmLT5jb3JlX2F1ZGlvLCBmb3JtYXQsIHNwZWMtPmNhcHMsCisgICAgICBpc19wYXNzdGhyb3VnaCk7CisKKyAgaWYgKCFyZXQpIHsKKyAgICBnX2ZyZWUgKGJ1Zi0+bWVtb3J5KTsKKyAgICBidWYtPm1lbW9yeSA9IE5VTEw7CisgICAgYnVmLT5zaXplID0gMDsKKyAgfQorCisgIG9zeGJ1Zi0+c2Vnb2Zmc2V0ID0gMDsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfcmVsZWFzZSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RPc3hBdWRpb1JpbmdCdWZmZXIgKm9zeGJ1ZjsKKworICBvc3hidWYgPSBHU1RfT1NYX0FVRElPX1JJTkdfQlVGRkVSIChidWYpOworCisgIGdzdF9jb3JlX2F1ZGlvX3VuaW5pdGlhbGl6ZSAob3N4YnVmLT5jb3JlX2F1ZGlvKTsKKworICBnX2ZyZWUgKGJ1Zi0+bWVtb3J5KTsKKyAgYnVmLT5tZW1vcnkgPSBOVUxMOworICBidWYtPnNpemUgPSAwOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfc3RhcnQgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0T3N4QXVkaW9SaW5nQnVmZmVyICpvc3hidWY7CisKKyAgb3N4YnVmID0gR1NUX09TWF9BVURJT19SSU5HX0JVRkZFUiAoYnVmKTsKKworICByZXR1cm4gZ3N0X2NvcmVfYXVkaW9fc3RhcnRfcHJvY2Vzc2luZyAob3N4YnVmLT5jb3JlX2F1ZGlvKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX3BhdXNlIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpCit7CisgIEdzdE9zeEF1ZGlvUmluZ0J1ZmZlciAqb3N4YnVmID0gR1NUX09TWF9BVURJT19SSU5HX0JVRkZFUiAoYnVmKTsKKworICByZXR1cm4gZ3N0X2NvcmVfYXVkaW9fcGF1c2VfcHJvY2Vzc2luZyAob3N4YnVmLT5jb3JlX2F1ZGlvKTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfc3RvcCAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RPc3hBdWRpb1JpbmdCdWZmZXIgKm9zeGJ1ZjsKKworICBvc3hidWYgPSBHU1RfT1NYX0FVRElPX1JJTkdfQlVGRkVSIChidWYpOworCisgIGdzdF9jb3JlX2F1ZGlvX3N0b3BfcHJvY2Vzc2luZyAob3N4YnVmLT5jb3JlX2F1ZGlvKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGd1aW50Citnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX2RlbGF5IChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpCit7CisgIEdzdE9zeEF1ZGlvUmluZ0J1ZmZlciAqb3N4YnVmOworICBkb3VibGUgbGF0ZW5jeTsKKyAgZ3VpbnQgc2FtcGxlczsKKworICBvc3hidWYgPSBHU1RfT1NYX0FVRElPX1JJTkdfQlVGRkVSIChidWYpOworCisgIGlmICghZ3N0X2NvcmVfYXVkaW9fZ2V0X3NhbXBsZXNfYW5kX2xhdGVuY3kgKG9zeGJ1Zi0+Y29yZV9hdWRpbywKKyAgICAgICAgICBHU1RfQVVESU9fSU5GT19SQVRFICgmYnVmLT5zcGVjLmluZm8pLCAmc2FtcGxlcywgJmxhdGVuY3kpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgR1NUX0RFQlVHX09CSkVDVCAoYnVmLCAiR290IGxhdGVuY3k6ICVmIHNlY29uZHMgLT4gJWQgc2FtcGxlcyIsCisgICAgICBsYXRlbmN5LCBzYW1wbGVzKTsKKyAgcmV0dXJuIHNhbXBsZXM7Cit9CmRpZmYgLS1naXQgYS9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9yaW5nYnVmZmVyLmggYi9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9yaW5nYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA1NGZkMwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3JpbmdidWZmZXIuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgRmx1ZW5kbyBTLkEuIDxzdXBwb3J0QGZsdWVuZG8uY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xICh0aGUgIkxHUEwiKSwgaW4KKyAqIHdoaWNoIGNhc2UgdGhlIGZvbGxvd2luZyBwcm92aXNpb25zIGFwcGx5IGluc3RlYWQgb2YgdGhlIG9uZXMKKyAqIG1lbnRpb25lZCBhYm92ZToKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX09TWF9SSU5HX0JVRkZFUl9IX18KKyNkZWZpbmUgX19HU1RfT1NYX1JJTkdfQlVGRkVSX0hfXworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9yaW5nYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0b3N4Y29yZWF1ZGlvLmg+CisKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX09TWF9BVURJT19SSU5HX0JVRkZFUiBcCisgIChnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9PU1hfQVVESU9fUklOR19CVUZGRVIob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9PU1hfQVVESU9fUklOR19CVUZGRVIsR3N0T3N4QXVkaW9SaW5nQnVmZmVyKSkKKyNkZWZpbmUgR1NUX09TWF9BVURJT19SSU5HX0JVRkZFUl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9PU1hfQVVESU9fUklOR19CVUZGRVIsR3N0T3N4QXVkaW9SaW5nQnVmZmVyQ2xhc3MpKQorI2RlZmluZSBHU1RfT1NYX0FVRElPX1JJTkdfQlVGRkVSX0dFVF9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MoKG9iaiksR1NUX1RZUEVfT1NYX0FVRElPX1JJTkdfQlVGRkVSLEdzdE9zeEF1ZGlvUmluZ0J1ZmZlckNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX09TWF9BVURJT19SSU5HX0JVRkZFUihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX09TWF9BVURJT19SSU5HX0JVRkZFUikpCisjZGVmaW5lIEdTVF9JU19PU1hfQVVESU9fUklOR19CVUZGRVJfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfT1NYX0FVRElPX1JJTkdfQlVGRkVSKSkKKworI2RlZmluZSBSSU5HQlVGRkVSX0lTX1NQRElGKHQpICgodCkgPT0gR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX0FDMyB8fCAodCkgPT0gR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX0RUUykKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9zeEF1ZGlvUmluZ0J1ZmZlciBHc3RPc3hBdWRpb1JpbmdCdWZmZXI7Cit0eXBlZGVmIHN0cnVjdCBfR3N0T3N4QXVkaW9SaW5nQnVmZmVyQ2xhc3MgR3N0T3N4QXVkaW9SaW5nQnVmZmVyQ2xhc3M7CisKK3N0cnVjdCBfR3N0T3N4QXVkaW9SaW5nQnVmZmVyCit7CisgIEdzdEF1ZGlvUmluZ0J1ZmZlciBvYmplY3Q7CisKKyAgR3N0Q29yZUF1ZGlvICpjb3JlX2F1ZGlvOworCisgIGd1aW50IGJ1ZmZlcl9sZW47CisgIGd1aW50IHNlZ29mZnNldDsKK307CisKK3N0cnVjdCBfR3N0T3N4QXVkaW9SaW5nQnVmZmVyQ2xhc3MKK3sKKyAgR3N0QXVkaW9SaW5nQnVmZmVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X29zeF9hdWRpb19yaW5nX2J1ZmZlcl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9PU1hfQVVESU9fUklOR19CVUZGRVJfSF9fICovCisKZGlmZiAtLWdpdCBhL3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYyBiL3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWZkMTU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jCkBAIC0wLDAgKzEsNTczIEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsMjAwNiBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNywyMDA4IFBpb25lZXJzIG9mIHRoZSBJbmV2aXRhYmxlIDxzb25nYmlyZEBzb25nYmlyZG5lc3QuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEyIEZsdWVuZG8gUy5BLiA8c3VwcG9ydEBmbHVlbmRvLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSAodGhlICJMR1BMIiksIGluCisgKiB3aGljaCBjYXNlIHRoZSBmb2xsb3dpbmcgcHJvdmlzaW9ucyBhcHBseSBpbnN0ZWFkIG9mIHRoZSBvbmVzCisgKiBtZW50aW9uZWQgYWJvdmU6CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICogVGhlIGRldmVsb3BtZW50IG9mIHRoaXMgY29kZSB3YXMgbWFkZSBwb3NzaWJsZSBkdWUgdG8gdGhlIGludm9sdmVtZW50IG9mCisgKiBQaW9uZWVycyBvZiB0aGUgSW5ldml0YWJsZSwgdGhlIGNyZWF0b3JzIG9mIHRoZSBTb25nYmlyZCBNdXNpYyBwbGF5ZXIKKyAqCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtb3N4YXVkaW9zaW5rCisgKgorICogVGhpcyBlbGVtZW50IHJlbmRlcnMgcmF3IGF1ZGlvIHNhbXBsZXMgdXNpbmcgdGhlIENvcmVBdWRpbyBhcGkuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPXNpbmUub2dnICEgb2dnZGVtdXggISB2b3JiaXNkZWMgISBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgb3N4YXVkaW9zaW5rCisgKiBdfCBQbGF5IGFuIE9nZy9Wb3JiaXMgZmlsZS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLWNoYW5uZWxzLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvaWVjNjE5MzcuaD4KKworI2luY2x1ZGUgImdzdG9zeGF1ZGlvc2luay5oIgorI2luY2x1ZGUgImdzdG9zeGF1ZGlvZWxlbWVudC5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChvc3hfYXVkaW9zaW5rX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIG9zeF9hdWRpb3NpbmtfZGVidWcKKworI2luY2x1ZGUgImdzdG9zeGNvcmVhdWRpby5oIgorCisvKiBGaWx0ZXIgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCitlbnVtCit7CisgIEFSR18wLAorICBBUkdfREVWSUNFLAorICBBUkdfVk9MVU1FCit9OworCisjZGVmaW5lIERFRkFVTFRfVk9MVU1FIDEuMAorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfT1NYX0FVRElPX1NJTktfQ0FQUykKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3Rfb3N4X2F1ZGlvX3Npbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X29zeF9hdWRpb19zaW5rX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3Rfb3N4X2F1ZGlvX3NpbmtfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9vc3hfYXVkaW9fc2lua19xdWVyeSAoR3N0QmFzZVNpbmsgKiBiYXNlLCBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworc3RhdGljIEdzdENhcHMgKmdzdF9vc3hfYXVkaW9fc2lua19nZXRjYXBzIChHc3RCYXNlU2luayAqIGJhc2UsCisgICAgR3N0Q2FwcyAqIGZpbHRlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zeF9hdWRpb19zaW5rX2FjY2VwdGNhcHMgKEdzdE9zeEF1ZGlvU2luayAqIHNpbmssCisgICAgR3N0Q2FwcyAqIGNhcHMpOworCitzdGF0aWMgR3N0QnVmZmVyICpnc3Rfb3N4X2F1ZGlvX3Npbmtfc2lua19wYXlsb2FkIChHc3RBdWRpb0Jhc2VTaW5rICogc2luaywKKyAgICBHc3RCdWZmZXIgKiBidWYpOworc3RhdGljIEdzdEF1ZGlvUmluZ0J1ZmZlcgorICAgICogZ3N0X29zeF9hdWRpb19zaW5rX2NyZWF0ZV9yaW5nYnVmZmVyIChHc3RBdWRpb0Jhc2VTaW5rICogc2luayk7CitzdGF0aWMgdm9pZCBnc3Rfb3N4X2F1ZGlvX3Npbmtfb3N4ZWxlbWVudF9pbml0IChncG9pbnRlciBnX2lmYWNlLAorICAgIGdwb2ludGVyIGlmYWNlX2RhdGEpOworc3RhdGljIHZvaWQgZ3N0X29zeF9hdWRpb19zaW5rX3NldF92b2x1bWUgKEdzdE9zeEF1ZGlvU2luayAqIHNpbmspOworCitzdGF0aWMgT1NTdGF0dXMgZ3N0X29zeF9hdWRpb19zaW5rX2lvX3Byb2MgKEdzdE9zeEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZiwKKyAgICBBdWRpb1VuaXRSZW5kZXJBY3Rpb25GbGFncyAqIGlvQWN0aW9uRmxhZ3MsCisgICAgY29uc3QgQXVkaW9UaW1lU3RhbXAgKiBpblRpbWVTdGFtcCwKKyAgICBVSW50MzIgaW5CdXNOdW1iZXIsIFVJbnQzMiBpbk51bWJlckZyYW1lcywgQXVkaW9CdWZmZXJMaXN0ICogYnVmZmVyTGlzdCk7CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X2F1ZGlvX3NpbmtfZG9faW5pdCAoR1R5cGUgdHlwZSkKK3sKKyAgc3RhdGljIGNvbnN0IEdJbnRlcmZhY2VJbmZvIG9zeGVsZW1lbnRfaW5mbyA9IHsKKyAgICBnc3Rfb3N4X2F1ZGlvX3Npbmtfb3N4ZWxlbWVudF9pbml0LAorICAgIE5VTEwsCisgICAgTlVMTAorICB9OworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChvc3hfYXVkaW9zaW5rX2RlYnVnLCAib3N4YXVkaW9zaW5rIiwgMCwKKyAgICAgICJPU1ggQXVkaW8gU2luayIpOworICBnc3RfY29yZV9hdWRpb19pbml0X2RlYnVnICgpOworICBHU1RfREVCVUcgKCJBZGRpbmcgc3RhdGljIGludGVyZmFjZSIpOworICBnX3R5cGVfYWRkX2ludGVyZmFjZV9zdGF0aWMgKHR5cGUsIEdTVF9PU1hfQVVESU9fRUxFTUVOVF9UWVBFLAorICAgICAgJm9zeGVsZW1lbnRfaW5mbyk7Cit9CisKKyNkZWZpbmUgZ3N0X29zeF9hdWRpb19zaW5rX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RPc3hBdWRpb1NpbmssIGdzdF9vc3hfYXVkaW9fc2luaywKKyAgICBHU1RfVFlQRV9BVURJT19CQVNFX1NJTkssIGdzdF9vc3hfYXVkaW9fc2lua19kb19pbml0IChnX2RlZmluZV90eXBlX2lkKSk7CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X2F1ZGlvX3NpbmtfY2xhc3NfaW5pdCAoR3N0T3N4QXVkaW9TaW5rQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEJhc2VTaW5rQ2xhc3MgKmdzdGJhc2VzaW5rX2NsYXNzOworICBHc3RBdWRpb0Jhc2VTaW5rQ2xhc3MgKmdzdGF1ZGlvYmFzZXNpbmtfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RiYXNlc2lua19jbGFzcyA9IChHc3RCYXNlU2lua0NsYXNzICopIGtsYXNzOworICBnc3RhdWRpb2Jhc2VzaW5rX2NsYXNzID0gKEdzdEF1ZGlvQmFzZVNpbmtDbGFzcyAqKSBrbGFzczsKKworICBwYXJlbnRfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3Rfb3N4X2F1ZGlvX3Npbmtfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfb3N4X2F1ZGlvX3NpbmtfZ2V0X3Byb3BlcnR5OworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zeF9hdWRpb19zaW5rX2NoYW5nZV9zdGF0ZSk7CisKKyNpZm5kZWYgSEFWRV9JT1MKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgQVJHX0RFVklDRSwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJkZXZpY2UiLCAiRGV2aWNlIElEIiwgIkRldmljZSBJRCBvZiBvdXRwdXQgZGV2aWNlIiwKKyAgICAgICAgICAwLCBHX01BWElOVCwgMCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisjZW5kaWYKKworICBnc3RiYXNlc2lua19jbGFzcy0+cXVlcnkgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zeF9hdWRpb19zaW5rX3F1ZXJ5KTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBBUkdfVk9MVU1FLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoInZvbHVtZSIsICJWb2x1bWUiLCAiVm9sdW1lIG9mIHRoaXMgc3RyZWFtIiwKKyAgICAgICAgICAwLCAxLjAsIDEuMCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPmdldF9jYXBzID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3hfYXVkaW9fc2lua19nZXRjYXBzKTsKKworICBnc3RhdWRpb2Jhc2VzaW5rX2NsYXNzLT5jcmVhdGVfcmluZ2J1ZmZlciA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zeF9hdWRpb19zaW5rX2NyZWF0ZV9yaW5nYnVmZmVyKTsKKyAgZ3N0YXVkaW9iYXNlc2lua19jbGFzcy0+cGF5bG9hZCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zeF9hdWRpb19zaW5rX3NpbmtfcGF5bG9hZCk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX2ZhY3RvcnkpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJBdWRpbyBTaW5rIChPU1gpIiwKKyAgICAgICJTaW5rL0F1ZGlvIiwKKyAgICAgICJPdXRwdXQgdG8gYSBzb3VuZCBjYXJkIGluIE9TIFgiLAorICAgICAgIlphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zeF9hdWRpb19zaW5rX2luaXQgKEdzdE9zeEF1ZGlvU2luayAqIHNpbmspCit7CisgIEdTVF9ERUJVRyAoIkluaXRpYWxpc2luZyBvYmplY3QiKTsKKworICBzaW5rLT5kZXZpY2VfaWQgPSBrQXVkaW9EZXZpY2VVbmtub3duOworICBzaW5rLT52b2x1bWUgPSBERUZBVUxUX1ZPTFVNRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfYXVkaW9fc2lua19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0T3N4QXVkaW9TaW5rICpzaW5rID0gR1NUX09TWF9BVURJT19TSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworI2lmbmRlZiBIQVZFX0lPUworICAgIGNhc2UgQVJHX0RFVklDRToKKyAgICAgIHNpbmstPmRldmljZV9pZCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIEFSR19WT0xVTUU6CisgICAgICBzaW5rLT52b2x1bWUgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIGdzdF9vc3hfYXVkaW9fc2lua19zZXRfdm9sdW1lIChzaW5rKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3Rfb3N4X2F1ZGlvX3NpbmtfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RPc3hBdWRpb1NpbmsgKm9zeHNpbmsgPSBHU1RfT1NYX0FVRElPX1NJTksgKGVsZW1lbnQpOworICBHc3RPc3hBdWRpb1JpbmdCdWZmZXIgKnJpbmdidWZmZXI7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKyAgaWYgKHJldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpCisgICAgZ290byBvdXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICAvKiBEZXZpY2UgaGFzIGJlZW4gc2VsZWN0ZWQsIEF1ZGlvVW5pdCBzZXQgdXAsIHNvIGluaXRpYWxpemUgdm9sdW1lICovCisgICAgICBnc3Rfb3N4X2F1ZGlvX3Npbmtfc2V0X3ZvbHVtZSAob3N4c2luayk7CisKKyAgICAgIC8qIFRoZSBkZXZpY2UgaXMgb3BlbiBub3csIHNvIGZpeCBvdXIgZGV2aWNlX2lkIGlmIGl0IGNoYW5nZWQgKi8KKyAgICAgIHJpbmdidWZmZXIgPQorICAgICAgICAgIEdTVF9PU1hfQVVESU9fUklOR19CVUZGRVIgKEdTVF9BVURJT19CQVNFX1NJTksgKG9zeHNpbmspLT5yaW5nYnVmZmVyKTsKKyAgICAgIGlmIChyaW5nYnVmZmVyLT5jb3JlX2F1ZGlvLT5kZXZpY2VfaWQgIT0gb3N4c2luay0+ZGV2aWNlX2lkKSB7CisgICAgICAgIG9zeHNpbmstPmRldmljZV9pZCA9IHJpbmdidWZmZXItPmNvcmVfYXVkaW8tPmRldmljZV9pZDsKKyAgICAgICAgZ19vYmplY3Rfbm90aWZ5IChHX09CSkVDVCAob3N4c2luayksICJkZXZpY2UiKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKK291dDoKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfYXVkaW9fc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0T3N4QXVkaW9TaW5rICpzaW5rID0gR1NUX09TWF9BVURJT19TSU5LIChvYmplY3QpOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyNpZm5kZWYgSEFWRV9JT1MKKyAgICBjYXNlIEFSR19ERVZJQ0U6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBzaW5rLT5kZXZpY2VfaWQpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIEFSR19WT0xVTUU6CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCBzaW5rLT52b2x1bWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3hfYXVkaW9fc2lua19xdWVyeSAoR3N0QmFzZVNpbmsgKiBiYXNlLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RPc3hBdWRpb1NpbmsgKnNpbmsgPSBHU1RfT1NYX0FVRElPX1NJTksgKGJhc2UpOworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9BQ0NFUFRfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpjYXBzID0gTlVMTDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2FjY2VwdF9jYXBzIChxdWVyeSwgJmNhcHMpOworICAgICAgcmV0ID0gZ3N0X29zeF9hdWRpb19zaW5rX2FjY2VwdGNhcHMgKHNpbmssIGNhcHMpOworICAgICAgZ3N0X3F1ZXJ5X3NldF9hY2NlcHRfY2Fwc19yZXN1bHQgKHF1ZXJ5LCByZXQpOworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gR1NUX0JBU0VfU0lOS19DTEFTUyAocGFyZW50X2NsYXNzKS0+cXVlcnkgKGJhc2UsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9vc3hfYXVkaW9fc2lua19nZXRjYXBzIChHc3RCYXNlU2luayAqIHNpbmssIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdE9zeEF1ZGlvU2luayAqb3N4c2luazsKKyAgR3N0QXVkaW9SaW5nQnVmZmVyICpidWY7CisgIEdzdE9zeEF1ZGlvUmluZ0J1ZmZlciAqb3N4YnVmOworICBHc3RDYXBzICpjYXBzLCAqZmlsdGVyZWRfY2FwczsKKworICBvc3hzaW5rID0gR1NUX09TWF9BVURJT19TSU5LIChzaW5rKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKG9zeHNpbmspOworICBidWYgPSBHU1RfQVVESU9fQkFTRV9TSU5LIChzaW5rKS0+cmluZ2J1ZmZlcjsKKyAgaWYgKGJ1ZikKKyAgICBnc3Rfb2JqZWN0X3JlZiAoYnVmKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKG9zeHNpbmspOworCisgIGlmICghYnVmKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgIm5vIHJpbmcgYnVmZmVyLCByZXR1cm5pbmcgTlVMTCBjYXBzIik7CisgICAgcmV0dXJuIEdTVF9CQVNFX1NJTktfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmdldF9jYXBzIChzaW5rLCBmaWx0ZXIpOworICB9CisKKyAgb3N4YnVmID0gR1NUX09TWF9BVURJT19SSU5HX0JVRkZFUiAoYnVmKTsKKworICAvKiBwcm90ZWN0IGFnYWluc3QgY2FjaGVkX2NhcHMgZ29pbmcgYXdheSAqLworICBHU1RfT0JKRUNUX0xPQ0sgKGJ1Zik7CisKKyAgaWYgKG9zeGJ1Zi0+Y29yZV9hdWRpby0+Y2FjaGVkX2NhcHNfdmFsaWQpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoc2luaywgIlJldHVybmluZyBjYWNoZWQgY2FwcyIpOworICAgIGNhcHMgPSBnc3RfY2Fwc19yZWYgKG9zeGJ1Zi0+Y29yZV9hdWRpby0+Y2FjaGVkX2NhcHMpOworICB9IGVsc2UgaWYgKGJ1Zi0+b3BlbikgeworICAgIEdzdENhcHMgKnRlbXBsYXRlX2NhcHM7CisKKyAgICAvKiBHZXQgdGVtcGxhdGUgY2FwcyAqLworICAgIHRlbXBsYXRlX2NhcHMgPQorICAgICAgICBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX0FVRElPX0JBU0VfU0lOS19QQUQgKG9zeHNpbmspKTsKKworICAgIC8qIERldmljZSBpcyBvcGVuLCBsZXQncyBwcm9iZSBpdHMgY2FwcyAqLworICAgIGNhcHMgPSBnc3RfY29yZV9hdWRpb19wcm9iZV9jYXBzIChvc3hidWYtPmNvcmVfYXVkaW8sIHRlbXBsYXRlX2NhcHMpOworICAgIGdzdF9jYXBzX3JlcGxhY2UgKCZvc3hidWYtPmNvcmVfYXVkaW8tPmNhY2hlZF9jYXBzLCBjYXBzKTsKKworICAgIGdzdF9jYXBzX3VucmVmICh0ZW1wbGF0ZV9jYXBzKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAicmluZyBidWZmZXIgbm90IG9wZW4sIHJldHVybmluZyBOVUxMIGNhcHMiKTsKKyAgICBjYXBzID0gTlVMTDsKKyAgfQorCisgIEdTVF9PQkpFQ1RfVU5MT0NLIChidWYpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1Zik7CisKKyAgaWYgKCFjYXBzKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghZmlsdGVyKQorICAgIHJldHVybiBjYXBzOworCisgIC8qIFRha2UgY2FyZSBvZiBmaWx0ZXJlZCBjYXBzICovCisgIGZpbHRlcmVkX2NhcHMgPQorICAgICAgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgY2FwcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICByZXR1cm4gZmlsdGVyZWRfY2FwczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3N4X2F1ZGlvX3NpbmtfYWNjZXB0Y2FwcyAoR3N0T3N4QXVkaW9TaW5rICogc2luaywgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKnBhZF9jYXBzOworICBHc3RTdHJ1Y3R1cmUgKnN0OworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKyAgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyBzcGVjID0geyAwIH07CisgIGdjaGFyICpjYXBzX3N0cmluZyA9IE5VTEw7CisKKyAgY2Fwc19zdHJpbmcgPSBnc3RfY2Fwc190b19zdHJpbmcgKGNhcHMpOworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiYWNjZXB0Y2FwcyBjYWxsZWQgd2l0aCAlcyIsIGNhcHNfc3RyaW5nKTsKKyAgZ19mcmVlIChjYXBzX3N0cmluZyk7CisKKyAgcGFkX2NhcHMgPSBnc3RfcGFkX3F1ZXJ5X2NhcHMgKEdTVF9CQVNFX1NJTktfUEFEIChzaW5rKSwgY2Fwcyk7CisgIGlmIChwYWRfY2FwcykgeworICAgIGdib29sZWFuIGNyZXQgPSBnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChwYWRfY2FwcywgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHBhZF9jYXBzKTsKKyAgICBpZiAoIWNyZXQpCisgICAgICBnb3RvIGRvbmU7CisgIH0KKworICAvKiBJZiB3ZSd2ZSBub3QgZ290IGZpeGVkIGNhcHMsIGNyZWF0aW5nIGEgc3RyZWFtIG1pZ2h0IGZhaWwsCisgICAqIHNvIGxldCdzIGp1c3QgcmV0dXJuIGZyb20gaGVyZSB3aXRoIGRlZmF1bHQgYWNjZXB0Y2FwcworICAgKiBiZWhhdmlvdXIgKi8KKyAgaWYgKCFnc3RfY2Fwc19pc19maXhlZCAoY2FwcykpCisgICAgZ290byBkb25lOworCisgIC8qIHBhcnNlIGhlbHBlciBleHBlY3RzIHRoaXMgc2V0LCBzbyBhdm9pZCBuYXN0eSB3YXJuaW5nCisgICAqIHdpbGwgYmUgc2V0IHByb3Blcmx5IGxhdGVyIG9uIGFueXdheSAgKi8KKyAgc3BlYy5sYXRlbmN5X3RpbWUgPSBHU1RfU0VDT05EOworICBpZiAoIWdzdF9hdWRpb19yaW5nX2J1ZmZlcl9wYXJzZV9jYXBzICgmc3BlYywgY2FwcykpCisgICAgZ290byBkb25lOworCisgIC8qIE1ha2Ugc3VyZSBpbnB1dCBpcyBmcmFtZWQgYW5kIGNhbiBiZSBwYXlsb2FkZWQgKi8KKyAgc3dpdGNoIChzcGVjLnR5cGUpIHsKKyAgICBjYXNlIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9BQzM6CisgICAgeworICAgICAgZ2Jvb2xlYW4gZnJhbWVkID0gRkFMU0U7CisKKyAgICAgIHN0ID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2Jvb2xlYW4gKHN0LCAiZnJhbWVkIiwgJmZyYW1lZCk7CisgICAgICBpZiAoIWZyYW1lZCB8fCBnc3RfYXVkaW9faWVjNjE5MzdfZnJhbWVfc2l6ZSAoJnNwZWMpIDw9IDApCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9EVFM6CisgICAgeworICAgICAgZ2Jvb2xlYW4gcGFyc2VkID0gRkFMU0U7CisKKyAgICAgIHN0ID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2Jvb2xlYW4gKHN0LCAicGFyc2VkIiwgJnBhcnNlZCk7CisgICAgICBpZiAoIXBhcnNlZCB8fCBnc3RfYXVkaW9faWVjNjE5MzdfZnJhbWVfc2l6ZSAoJnNwZWMpIDw9IDApCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0ID0gVFJVRTsKKworZG9uZToKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3Rfb3N4X2F1ZGlvX3Npbmtfc2lua19wYXlsb2FkIChHc3RBdWRpb0Jhc2VTaW5rICogc2luaywgR3N0QnVmZmVyICogYnVmKQoreworICBpZiAoUklOR0JVRkZFUl9JU19TUERJRiAoc2luay0+cmluZ2J1ZmZlci0+c3BlYy50eXBlKSkgeworICAgIGdpbnQgZnJhbWVzaXplID0gZ3N0X2F1ZGlvX2llYzYxOTM3X2ZyYW1lX3NpemUgKCZzaW5rLT5yaW5nYnVmZmVyLT5zcGVjKTsKKyAgICBHc3RCdWZmZXIgKm91dDsKKyAgICBHc3RNYXBJbmZvIGlubWFwLCBvdXRtYXA7CisgICAgZ2Jvb2xlYW4gcmVzOworCisgICAgaWYgKGZyYW1lc2l6ZSA8PSAwKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBvdXQgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGZyYW1lc2l6ZSk7CisKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmaW5tYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKG91dCwgJm91dG1hcCwgR1NUX01BUF9XUklURSk7CisKKyAgICAvKiBGSVhNRTogdGhlIGVuZGlhbm5lc3MgbmVlZHMgdG8gYmUgcXVlcmllZCBhbmQgdGhlbiBzZXQgKi8KKyAgICByZXMgPSBnc3RfYXVkaW9faWVjNjE5MzdfcGF5bG9hZCAoaW5tYXAuZGF0YSwgaW5tYXAuc2l6ZSwKKyAgICAgICAgb3V0bWFwLmRhdGEsIG91dG1hcC5zaXplLCAmc2luay0+cmluZ2J1ZmZlci0+c3BlYywgR19CSUdfRU5ESUFOKTsKKworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJmlubWFwKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChvdXQsICZvdXRtYXApOworCisgICAgaWYgKCFyZXMpIHsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBnc3RfYnVmZmVyX2NvcHlfaW50byAob3V0LCBidWYsIEdTVF9CVUZGRVJfQ09QWV9NRVRBREFUQSwgMCwgLTEpOworICAgIHJldHVybiBvdXQ7CisKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZ3N0X2J1ZmZlcl9yZWYgKGJ1Zik7CisgIH0KK30KKworc3RhdGljIEdzdEF1ZGlvUmluZ0J1ZmZlciAqCitnc3Rfb3N4X2F1ZGlvX3NpbmtfY3JlYXRlX3JpbmdidWZmZXIgKEdzdEF1ZGlvQmFzZVNpbmsgKiBzaW5rKQoreworICBHc3RPc3hBdWRpb1NpbmsgKm9zeHNpbms7CisgIEdzdE9zeEF1ZGlvUmluZ0J1ZmZlciAqcmluZ2J1ZmZlcjsKKworICBvc3hzaW5rID0gR1NUX09TWF9BVURJT19TSU5LIChzaW5rKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiQ3JlYXRpbmcgcmluZ2J1ZmZlciIpOworICByaW5nYnVmZmVyID0gZ19vYmplY3RfbmV3IChHU1RfVFlQRV9PU1hfQVVESU9fUklOR19CVUZGRVIsIE5VTEwpOworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAib3N4IHNpbmsgJXAgZWxlbWVudCAlcCAgaW9wcm9jICVwIiwgb3N4c2luaywKKyAgICAgIEdTVF9PU1hfQVVESU9fRUxFTUVOVF9HRVRfSU5URVJGQUNFIChvc3hzaW5rKSwKKyAgICAgICh2b2lkICopIGdzdF9vc3hfYXVkaW9fc2lua19pb19wcm9jKTsKKworICByaW5nYnVmZmVyLT5jb3JlX2F1ZGlvLT5lbGVtZW50ID0KKyAgICAgIEdTVF9PU1hfQVVESU9fRUxFTUVOVF9HRVRfSU5URVJGQUNFIChvc3hzaW5rKTsKKyAgcmluZ2J1ZmZlci0+Y29yZV9hdWRpby0+aXNfc3JjID0gRkFMU0U7CisKKyAgLyogQnkgZGVmYXVsdCB0aGUgY29yZWF1ZGlvIGluc3RhbmNlIGNyZWF0ZWQgYnkgdGhlIHJpbmdidWZmZXIKKyAgICogaGFzIGRldmljZV9pZD09a0F1ZGlvRGV2aWNlVW5rbm93bi4gVGhlIHVzZXIgbWlnaHQgaGF2ZQorICAgKiBzZWxlY3RlZCBhIGRpZmZlcmVudCBvbmUgaGVyZQorICAgKi8KKyAgaWYgKHJpbmdidWZmZXItPmNvcmVfYXVkaW8tPmRldmljZV9pZCAhPSBvc3hzaW5rLT5kZXZpY2VfaWQpCisgICAgcmluZ2J1ZmZlci0+Y29yZV9hdWRpby0+ZGV2aWNlX2lkID0gb3N4c2luay0+ZGV2aWNlX2lkOworCisgIHJldHVybiBHU1RfQVVESU9fUklOR19CVUZGRVIgKHJpbmdidWZmZXIpOworfQorCisvKiBIQUxPdXRwdXQgQXVkaW9Vbml0IHdpbGwgcmVxdWVzdCBmYWlybHkgYXJiaXRyYXJpbHktc2l6ZWQgY2h1bmtzCisgKiBvZiBkYXRhLCBub3Qgb2YgYSBmaXhlZCBzaXplLiBTbywgd2Uga2VlcCB0cmFjayBvZiB3aGVyZSBpbgorICogdGhlIGN1cnJlbnQgcmluZ2J1ZmZlciBzZWdtZW50IHdlIGFyZSwgYW5kIG9ubHkgYWR2YW5jZSB0aGUgc2VnbWVudAorICogb25jZSB3ZSd2ZSByZWFkIHRoZSB3aG9sZSB0aGluZyAqLworc3RhdGljIE9TU3RhdHVzCitnc3Rfb3N4X2F1ZGlvX3NpbmtfaW9fcHJvYyAoR3N0T3N4QXVkaW9SaW5nQnVmZmVyICogYnVmLAorICAgIEF1ZGlvVW5pdFJlbmRlckFjdGlvbkZsYWdzICogaW9BY3Rpb25GbGFncywKKyAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCAqIGluVGltZVN0YW1wLAorICAgIFVJbnQzMiBpbkJ1c051bWJlciwgVUludDMyIGluTnVtYmVyRnJhbWVzLCBBdWRpb0J1ZmZlckxpc3QgKiBidWZmZXJMaXN0KQoreworICBndWludDggKnJlYWRwdHI7CisgIGdpbnQgcmVhZHNlZzsKKyAgZ2ludCBsZW47CisgIGdpbnQgc3RyZWFtX2lkeCA9IGJ1Zi0+Y29yZV9hdWRpby0+c3RyZWFtX2lkeDsKKyAgZ2ludCByZW1haW5pbmcgPSBidWZmZXJMaXN0LT5tQnVmZmVyc1tzdHJlYW1faWR4XS5tRGF0YUJ5dGVTaXplOworICBnaW50IG9mZnNldCA9IDA7CisKKyAgd2hpbGUgKHJlbWFpbmluZykgeworICAgIGlmICghZ3N0X2F1ZGlvX3JpbmdfYnVmZmVyX3ByZXBhcmVfcmVhZCAoR1NUX0FVRElPX1JJTkdfQlVGRkVSIChidWYpLAorICAgICAgICAgICAgJnJlYWRzZWcsICZyZWFkcHRyLCAmbGVuKSkKKyAgICAgIHJldHVybiAwOworCisgICAgbGVuIC09IGJ1Zi0+c2Vnb2Zmc2V0OworCisgICAgaWYgKGxlbiA+IHJlbWFpbmluZykKKyAgICAgIGxlbiA9IHJlbWFpbmluZzsKKworICAgIG1lbWNweSAoKGNoYXIgKikgYnVmZmVyTGlzdC0+bUJ1ZmZlcnNbc3RyZWFtX2lkeF0ubURhdGEgKyBvZmZzZXQsCisgICAgICAgIHJlYWRwdHIgKyBidWYtPnNlZ29mZnNldCwgbGVuKTsKKworICAgIGJ1Zi0+c2Vnb2Zmc2V0ICs9IGxlbjsKKyAgICBvZmZzZXQgKz0gbGVuOworICAgIHJlbWFpbmluZyAtPSBsZW47CisKKyAgICBpZiAoKGdpbnQpIGJ1Zi0+c2Vnb2Zmc2V0ID09IEdTVF9BVURJT19SSU5HX0JVRkZFUiAoYnVmKS0+c3BlYy5zZWdzaXplKSB7CisgICAgICAvKiBjbGVhciB3cml0dGVuIHNhbXBsZXMgKi8KKyAgICAgIGdzdF9hdWRpb19yaW5nX2J1ZmZlcl9jbGVhciAoR1NUX0FVRElPX1JJTkdfQlVGRkVSIChidWYpLCByZWFkc2VnKTsKKworICAgICAgLyogd2Ugd3JvdGUgb25lIHNlZ21lbnQgKi8KKyAgICAgIGdzdF9hdWRpb19yaW5nX2J1ZmZlcl9hZHZhbmNlIChHU1RfQVVESU9fUklOR19CVUZGRVIgKGJ1ZiksIDEpOworCisgICAgICBidWYtPnNlZ29mZnNldCA9IDA7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zeF9hdWRpb19zaW5rX29zeGVsZW1lbnRfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwgZ3BvaW50ZXIgaWZhY2VfZGF0YSkKK3sKKyAgR3N0T3N4QXVkaW9FbGVtZW50SW50ZXJmYWNlICppZmFjZSA9IChHc3RPc3hBdWRpb0VsZW1lbnRJbnRlcmZhY2UgKikgZ19pZmFjZTsKKworICBpZmFjZS0+aW9fcHJvYyA9IChBVVJlbmRlckNhbGxiYWNrKSBnc3Rfb3N4X2F1ZGlvX3NpbmtfaW9fcHJvYzsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfYXVkaW9fc2lua19zZXRfdm9sdW1lIChHc3RPc3hBdWRpb1NpbmsgKiBzaW5rKQoreworICBHc3RPc3hBdWRpb1JpbmdCdWZmZXIgKm9zeGJ1ZjsKKworICBvc3hidWYgPSBHU1RfT1NYX0FVRElPX1JJTkdfQlVGRkVSIChHU1RfQVVESU9fQkFTRV9TSU5LIChzaW5rKS0+cmluZ2J1ZmZlcik7CisgIGlmICghb3N4YnVmKQorICAgIHJldHVybjsKKworICBnc3RfY29yZV9hdWRpb19zZXRfdm9sdW1lIChvc3hidWYtPmNvcmVfYXVkaW8sIHNpbmstPnZvbHVtZSk7Cit9CmRpZmYgLS1naXQgYS9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmggYi9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY1NWM0ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUGlvbmVlcnMgb2YgdGhlIEluZXZpdGFibGUgPHNvbmdiaXJkQHNvbmdiaXJkbmVzdC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgRmx1ZW5kbyBTLkEuIDxzdXBwb3J0QGZsdWVuZG8uY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xICh0aGUgIkxHUEwiKSwgaW4KKyAqIHdoaWNoIGNhc2UgdGhlIGZvbGxvd2luZyBwcm92aXNpb25zIGFwcGx5IGluc3RlYWQgb2YgdGhlIG9uZXMKKyAqIG1lbnRpb25lZCBhYm92ZToKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKiBUaGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIHdhcyBtYWRlIHBvc3NpYmxlIGR1ZSB0byB0aGUgaW52b2x2ZW1lbnQgb2YKKyAqIFBpb25lZXJzIG9mIHRoZSBJbmV2aXRhYmxlLCB0aGUgY3JlYXRvcnMgb2YgdGhlIFNvbmdiaXJkIE11c2ljIHBsYXllcgorICoKKyAqLworCisjaWZuZGVmIF9fR1NUX09TWEFVRElPU0lOS19IX18KKyNkZWZpbmUgX19HU1RfT1NYQVVESU9TSU5LX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb2Jhc2VzaW5rLmg+CisjaW5jbHVkZSAiZ3N0b3N4YXVkaW9yaW5nYnVmZmVyLmgiCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfT1NYX0FVRElPX1NJTktfQ0FQUyAiYXVkaW8veC1yYXcsICIgXAorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fRk9STUFUU19BTEwgIiwgIiBcCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiBcCisgICAgICAgICJyYXRlID0gKGludCkgWzEsIE1BWF0sICIgXAorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbMSwgOV07IiBcCisgICAgICAgICJhdWRpby94LWFjMywgZnJhbWVkID0gKGJvb2xlYW4pIHRydWU7IiBcCisgICAgICAgICJhdWRpby94LWR0cywgZnJhbWVkID0gKGJvb2xlYW4pIHRydWUiCisKKyNkZWZpbmUgR1NUX1RZUEVfT1NYX0FVRElPX1NJTksgXAorICAoZ3N0X29zeF9hdWRpb19zaW5rX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9PU1hfQVVESU9fU0lOSyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX09TWF9BVURJT19TSU5LLEdzdE9zeEF1ZGlvU2luaykpCisjZGVmaW5lIEdTVF9PU1hfQVVESU9fU0lOS19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9PU1hfQVVESU9fU0lOSyxHc3RPc3hBdWRpb1NpbmtDbGFzcykpCisjZGVmaW5lIEdTVF9JU19PU1hfQVVESU9fU0lOSyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX09TWF9BVURJT19TSU5LKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9zeEF1ZGlvU2luayBHc3RPc3hBdWRpb1Npbms7Cit0eXBlZGVmIHN0cnVjdCBfR3N0T3N4QXVkaW9TaW5rQ2xhc3MgR3N0T3N4QXVkaW9TaW5rQ2xhc3M7CisKK3N0cnVjdCBfR3N0T3N4QXVkaW9TaW5rCit7CisgIEdzdEF1ZGlvQmFzZVNpbmsgc2luazsKKworICBBdWRpb0RldmljZUlEIGRldmljZV9pZDsKKworICBBdWRpb1VuaXQgYXVkaW91bml0OworICBkb3VibGUgdm9sdW1lOworCisgIGd1aW50IGNoYW5uZWxzOworfTsKKworc3RydWN0IF9Hc3RPc3hBdWRpb1NpbmtDbGFzcworeworICBHc3RBdWRpb0Jhc2VTaW5rQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X29zeF9hdWRpb19zaW5rX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX09TWEFVRElPU0lOS19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmMgYi9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTU2Nzc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmMKQEAgLTAsMCArMSwzOTcgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNSwyMDA2IFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4IFBpb25lZXJzIG9mIHRoZSBJbmV2aXRhYmxlIDxzb25nYmlyZEBzb25nYmlyZG5lc3QuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xICh0aGUgIkxHUEwiKSwgaW4KKyAqIHdoaWNoIGNhc2UgdGhlIGZvbGxvd2luZyBwcm92aXNpb25zIGFwcGx5IGluc3RlYWQgb2YgdGhlIG9uZXMKKyAqIG1lbnRpb25lZCBhYm92ZToKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1vc3hhdWRpb3NyYworICoKKyAqIFRoaXMgZWxlbWVudCBjYXB0dXJlcyByYXcgYXVkaW8gc2FtcGxlcyB1c2luZyB0aGUgQ29yZUF1ZGlvIGFwaS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgb3N4YXVkaW9zcmMgISB3YXZlbmMgISBmaWxlc2luayBsb2NhdGlvbj1hdWRpby53YXYKKyAqIF18CisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgImdzdG9zeGF1ZGlvc3JjLmgiCisjaW5jbHVkZSAiZ3N0b3N4YXVkaW9lbGVtZW50LmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKG9zeF9hdWRpb3NyY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBvc3hfYXVkaW9zcmNfZGVidWcKKworLyogRmlsdGVyIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBBUkdfMCwKKyAgQVJHX0RFVklDRQorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX09TWF9BVURJT19TUkNfQ0FQUykKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3Rfb3N4X2F1ZGlvX3NyY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3Rfb3N4X2F1ZGlvX3NyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X29zeF9hdWRpb19zcmNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIEdzdENhcHMgKmdzdF9vc3hfYXVkaW9fc3JjX2dldF9jYXBzIChHc3RCYXNlU3JjICogc3JjLCBHc3RDYXBzICogZmlsdGVyKTsKKworc3RhdGljIEdzdEF1ZGlvUmluZ0J1ZmZlciAqZ3N0X29zeF9hdWRpb19zcmNfY3JlYXRlX3JpbmdidWZmZXIgKEdzdEF1ZGlvQmFzZVNyYworICAgICogc3JjKTsKK3N0YXRpYyB2b2lkIGdzdF9vc3hfYXVkaW9fc3JjX29zeGVsZW1lbnRfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwKKyAgICBncG9pbnRlciBpZmFjZV9kYXRhKTsKK3N0YXRpYyBPU1N0YXR1cyBnc3Rfb3N4X2F1ZGlvX3NyY19pb19wcm9jIChHc3RPc3hBdWRpb1JpbmdCdWZmZXIgKiBidWYsCisgICAgQXVkaW9Vbml0UmVuZGVyQWN0aW9uRmxhZ3MgKiBpb0FjdGlvbkZsYWdzLAorICAgIGNvbnN0IEF1ZGlvVGltZVN0YW1wICogaW5UaW1lU3RhbXAsIFVJbnQzMiBpbkJ1c051bWJlciwKKyAgICBVSW50MzIgaW5OdW1iZXJGcmFtZXMsIEF1ZGlvQnVmZmVyTGlzdCAqIGJ1ZmZlckxpc3QpOworCitzdGF0aWMgdm9pZAorZ3N0X29zeF9hdWRpb19zcmNfZG9faW5pdCAoR1R5cGUgdHlwZSkKK3sKKyAgc3RhdGljIGNvbnN0IEdJbnRlcmZhY2VJbmZvIG9zeGVsZW1lbnRfaW5mbyA9IHsKKyAgICBnc3Rfb3N4X2F1ZGlvX3NyY19vc3hlbGVtZW50X2luaXQsCisgICAgTlVMTCwKKyAgICBOVUxMCisgIH07CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKG9zeF9hdWRpb3NyY19kZWJ1ZywgIm9zeGF1ZGlvc3JjIiwgMCwKKyAgICAgICJPU1ggQXVkaW8gU3JjIik7CisgIGdfdHlwZV9hZGRfaW50ZXJmYWNlX3N0YXRpYyAodHlwZSwgR1NUX09TWF9BVURJT19FTEVNRU5UX1RZUEUsCisgICAgICAmb3N4ZWxlbWVudF9pbmZvKTsKK30KKworI2RlZmluZSBnc3Rfb3N4X2F1ZGlvX3NyY19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoR3N0T3N4QXVkaW9TcmMsIGdzdF9vc3hfYXVkaW9fc3JjLAorICAgIEdTVF9UWVBFX0FVRElPX0JBU0VfU1JDLCBnc3Rfb3N4X2F1ZGlvX3NyY19kb19pbml0IChnX2RlZmluZV90eXBlX2lkKSk7CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X2F1ZGlvX3NyY19jbGFzc19pbml0IChHc3RPc3hBdWRpb1NyY0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RCYXNlU3JjQ2xhc3MgKmdzdGJhc2VzcmNfY2xhc3M7CisgIEdzdEF1ZGlvQmFzZVNyY0NsYXNzICpnc3RhdWRpb2Jhc2VzcmNfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RiYXNlc3JjX2NsYXNzID0gKEdzdEJhc2VTcmNDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YXVkaW9iYXNlc3JjX2NsYXNzID0gKEdzdEF1ZGlvQmFzZVNyY0NsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9vc3hfYXVkaW9fc3JjX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X29zeF9hdWRpb19zcmNfZ2V0X3Byb3BlcnR5OworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zeF9hdWRpb19zcmNfY2hhbmdlX3N0YXRlKTsKKworICBnc3RiYXNlc3JjX2NsYXNzLT5nZXRfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3N4X2F1ZGlvX3NyY19nZXRfY2Fwcyk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgQVJHX0RFVklDRSwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJkZXZpY2UiLCAiRGV2aWNlIElEIiwgIkRldmljZSBJRCBvZiBpbnB1dCBkZXZpY2UiLAorICAgICAgICAgIDAsIEdfTUFYSU5ULCAwLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RhdWRpb2Jhc2VzcmNfY2xhc3MtPmNyZWF0ZV9yaW5nYnVmZmVyID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3N4X2F1ZGlvX3NyY19jcmVhdGVfcmluZ2J1ZmZlcik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfZmFjdG9yeSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkF1ZGlvIFNvdXJjZSAoT1NYKSIsCisgICAgICAiU291cmNlL0F1ZGlvIiwKKyAgICAgICJJbnB1dCBmcm9tIGEgc291bmQgY2FyZCBpbiBPUyBYIiwKKyAgICAgICJaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfYXVkaW9fc3JjX2luaXQgKEdzdE9zeEF1ZGlvU3JjICogc3JjKQoreworICBnc3RfYmFzZV9zcmNfc2V0X2xpdmUgKEdTVF9CQVNFX1NSQyAoc3JjKSwgVFJVRSk7CisKKyAgc3JjLT5kZXZpY2VfaWQgPSBrQXVkaW9EZXZpY2VVbmtub3duOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zeF9hdWRpb19zcmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE9zeEF1ZGlvU3JjICpzcmMgPSBHU1RfT1NYX0FVRElPX1NSQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIEFSR19ERVZJQ0U6CisgICAgICBzcmMtPmRldmljZV9pZCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X29zeF9hdWRpb19zcmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE9zeEF1ZGlvU3JjICpzcmMgPSBHU1RfT1NYX0FVRElPX1NSQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIEFSR19ERVZJQ0U6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBzcmMtPmRldmljZV9pZCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X29zeF9hdWRpb19zcmNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0T3N4QXVkaW9TcmMgKm9zeHNyYyA9IEdTVF9PU1hfQVVESU9fU1JDIChlbGVtZW50KTsKKyAgR3N0T3N4QXVkaW9SaW5nQnVmZmVyICpyaW5nYnVmZmVyOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisgIGlmIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKQorICAgIGdvdG8gb3V0OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOgorICAgICAgLyogVGhlIGRldmljZSBpcyBvcGVuIG5vdywgc28gZml4IG91ciBkZXZpY2VfaWQgaWYgaXQgY2hhbmdlZCAqLworICAgICAgcmluZ2J1ZmZlciA9CisgICAgICAgICAgR1NUX09TWF9BVURJT19SSU5HX0JVRkZFUiAoR1NUX0FVRElPX0JBU0VfU1JDIChvc3hzcmMpLT5yaW5nYnVmZmVyKTsKKyAgICAgIGlmIChyaW5nYnVmZmVyLT5jb3JlX2F1ZGlvLT5kZXZpY2VfaWQgIT0gb3N4c3JjLT5kZXZpY2VfaWQpIHsKKyAgICAgICAgb3N4c3JjLT5kZXZpY2VfaWQgPSByaW5nYnVmZmVyLT5jb3JlX2F1ZGlvLT5kZXZpY2VfaWQ7CisgICAgICAgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKG9zeHNyYyksICJkZXZpY2UiKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKK291dDoKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X29zeF9hdWRpb19zcmNfZ2V0X2NhcHMgKEdzdEJhc2VTcmMgKiBzcmMsIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdE9zeEF1ZGlvU3JjICpvc3hzcmM7CisgIEdzdEF1ZGlvUmluZ0J1ZmZlciAqYnVmOworICBHc3RPc3hBdWRpb1JpbmdCdWZmZXIgKm9zeGJ1ZjsKKyAgR3N0Q2FwcyAqY2FwcywgKmZpbHRlcmVkX2NhcHM7CisKKyAgb3N4c3JjID0gR1NUX09TWF9BVURJT19TUkMgKHNyYyk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChvc3hzcmMpOworICBidWYgPSBHU1RfQVVESU9fQkFTRV9TUkMgKHNyYyktPnJpbmdidWZmZXI7CisgIGlmIChidWYpCisgICAgZ3N0X29iamVjdF9yZWYgKGJ1Zik7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChvc3hzcmMpOworCisgIGlmICghYnVmKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAibm8gcmluZyBidWZmZXIsIHVzaW5nIHRlbXBsYXRlIGNhcHMiKTsKKyAgICByZXR1cm4gR1NUX0JBU0VfU1JDX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5nZXRfY2FwcyAoc3JjLCBmaWx0ZXIpOworICB9CisKKyAgb3N4YnVmID0gR1NUX09TWF9BVURJT19SSU5HX0JVRkZFUiAoYnVmKTsKKworICAvKiBwcm90ZWN0IGFnYWluc3QgY2FjaGVkX2NhcHMgZ29pbmcgYXdheSAqLworICBHU1RfT0JKRUNUX0xPQ0sgKGJ1Zik7CisKKyAgaWYgKG9zeGJ1Zi0+Y29yZV9hdWRpby0+Y2FjaGVkX2NhcHNfdmFsaWQpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiUmV0dXJuaW5nIGNhY2hlZCBjYXBzIik7CisgICAgY2FwcyA9IGdzdF9jYXBzX3JlZiAob3N4YnVmLT5jb3JlX2F1ZGlvLT5jYWNoZWRfY2Fwcyk7CisgIH0gZWxzZSBpZiAoYnVmLT5vcGVuKSB7CisgICAgR3N0Q2FwcyAqdGVtcGxhdGVfY2FwczsKKworICAgIC8qIEdldCB0ZW1wbGF0ZSBjYXBzICovCisgICAgdGVtcGxhdGVfY2FwcyA9CisgICAgICAgIGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChHU1RfQVVESU9fQkFTRV9TUkNfUEFEIChvc3hzcmMpKTsKKworICAgIC8qIERldmljZSBpcyBvcGVuLCBsZXQncyBwcm9iZSBpdHMgY2FwcyAqLworICAgIGNhcHMgPSBnc3RfY29yZV9hdWRpb19wcm9iZV9jYXBzIChvc3hidWYtPmNvcmVfYXVkaW8sIHRlbXBsYXRlX2NhcHMpOworICAgIGdzdF9jYXBzX3JlcGxhY2UgKCZvc3hidWYtPmNvcmVfYXVkaW8tPmNhY2hlZF9jYXBzLCBjYXBzKTsKKworICAgIGdzdF9jYXBzX3VucmVmICh0ZW1wbGF0ZV9jYXBzKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJyaW5nIGJ1ZmZlciBub3Qgb3BlbiwgdXNpbmcgdGVtcGxhdGUgY2FwcyIpOworICAgIGNhcHMgPSBHU1RfQkFTRV9TUkNfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmdldF9jYXBzIChzcmMsIE5VTEwpOworICB9CisKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGJ1Zik7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVmKTsKKworICBpZiAoIWNhcHMpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCFmaWx0ZXIpCisgICAgcmV0dXJuIGNhcHM7CisKKyAgLyogVGFrZSBjYXJlIG9mIGZpbHRlcmVkIGNhcHMgKi8KKyAgZmlsdGVyZWRfY2FwcyA9CisgICAgICBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCBjYXBzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIHJldHVybiBmaWx0ZXJlZF9jYXBzOworfQorCitzdGF0aWMgR3N0QXVkaW9SaW5nQnVmZmVyICoKK2dzdF9vc3hfYXVkaW9fc3JjX2NyZWF0ZV9yaW5nYnVmZmVyIChHc3RBdWRpb0Jhc2VTcmMgKiBzcmMpCit7CisgIEdzdE9zeEF1ZGlvU3JjICpvc3hzcmM7CisgIEdzdE9zeEF1ZGlvUmluZ0J1ZmZlciAqcmluZ2J1ZmZlcjsKKworICBvc3hzcmMgPSBHU1RfT1NYX0FVRElPX1NSQyAoc3JjKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChvc3hzcmMsICJDcmVhdGluZyByaW5nYnVmZmVyIik7CisgIHJpbmdidWZmZXIgPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX09TWF9BVURJT19SSU5HX0JVRkZFUiwgTlVMTCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKG9zeHNyYywgIm9zeCBzcmMgMHglcCBlbGVtZW50IDB4JXAgIGlvcHJvYyAweCVwIiwgb3N4c3JjLAorICAgICAgR1NUX09TWF9BVURJT19FTEVNRU5UX0dFVF9JTlRFUkZBQ0UgKG9zeHNyYyksCisgICAgICAodm9pZCAqKSBnc3Rfb3N4X2F1ZGlvX3NyY19pb19wcm9jKTsKKworICByaW5nYnVmZmVyLT5jb3JlX2F1ZGlvLT5lbGVtZW50ID0KKyAgICAgIEdTVF9PU1hfQVVESU9fRUxFTUVOVF9HRVRfSU5URVJGQUNFIChvc3hzcmMpOworICByaW5nYnVmZmVyLT5jb3JlX2F1ZGlvLT5pc19zcmMgPSBUUlVFOworCisgIC8qIEJ5IGRlZmF1bHQgdGhlIGNvcmVhdWRpbyBpbnN0YW5jZSBjcmVhdGVkIGJ5IHRoZSByaW5nYnVmZmVyCisgICAqIGhhcyBkZXZpY2VfaWQ9PWtBdWRpb0RldmljZVVua25vd24uIFRoZSB1c2VyIG1pZ2h0IGhhdmUKKyAgICogc2VsZWN0ZWQgYSBkaWZmZXJlbnQgb25lIGhlcmUKKyAgICovCisgIGlmIChyaW5nYnVmZmVyLT5jb3JlX2F1ZGlvLT5kZXZpY2VfaWQgIT0gb3N4c3JjLT5kZXZpY2VfaWQpCisgICAgcmluZ2J1ZmZlci0+Y29yZV9hdWRpby0+ZGV2aWNlX2lkID0gb3N4c3JjLT5kZXZpY2VfaWQ7CisKKyAgcmV0dXJuIEdTVF9BVURJT19SSU5HX0JVRkZFUiAocmluZ2J1ZmZlcik7Cit9CisKK3N0YXRpYyBPU1N0YXR1cworZ3N0X29zeF9hdWRpb19zcmNfaW9fcHJvYyAoR3N0T3N4QXVkaW9SaW5nQnVmZmVyICogYnVmLAorICAgIEF1ZGlvVW5pdFJlbmRlckFjdGlvbkZsYWdzICogaW9BY3Rpb25GbGFncywKKyAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCAqIGluVGltZVN0YW1wLAorICAgIFVJbnQzMiBpbkJ1c051bWJlciwgVUludDMyIGluTnVtYmVyRnJhbWVzLCBBdWRpb0J1ZmZlckxpc3QgKiBidWZmZXJMaXN0KQoreworICBPU1N0YXR1cyBzdGF0dXM7CisgIGd1aW50OCAqd3JpdGVwdHI7CisgIGdpbnQgd3JpdGVzZWc7CisgIGdpbnQgbGVuOworICBnaW50IHJlbWFpbmluZzsKKyAgVUludDMyIG47CisgIGdpbnQgb2Zmc2V0ID0gMDsKKworICAvKiBQcmV2aW91cyBpbnZva2Ugb2YgQXVkaW9Vbml0UmVuZGVyIGNoYW5nZWQgbURhdGFCeXRlU2l6ZSBpbnRvCisgICAqIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLiBSZXNldCB0aGUgbWVtYmVycy4gKi8KKyAgZm9yIChuID0gMDsgbiA8IGJ1Zi0+Y29yZV9hdWRpby0+cmVjQnVmZmVyTGlzdC0+bU51bWJlckJ1ZmZlcnM7ICsrbikgeworICAgIGJ1Zi0+Y29yZV9hdWRpby0+cmVjQnVmZmVyTGlzdC0+bUJ1ZmZlcnNbbl0ubURhdGFCeXRlU2l6ZSA9CisgICAgICAgIGJ1Zi0+Y29yZV9hdWRpby0+cmVjQnVmZmVyU2l6ZTsKKyAgfQorCisgIHN0YXR1cyA9IEF1ZGlvVW5pdFJlbmRlciAoYnVmLT5jb3JlX2F1ZGlvLT5hdWRpb3VuaXQsIGlvQWN0aW9uRmxhZ3MsCisgICAgICBpblRpbWVTdGFtcCwgaW5CdXNOdW1iZXIsIGluTnVtYmVyRnJhbWVzLCBidWYtPmNvcmVfYXVkaW8tPnJlY0J1ZmZlckxpc3QpOworCisgIGlmIChzdGF0dXMpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGJ1ZiwgIkF1ZGlvVW5pdFJlbmRlciByZXR1cm5lZCAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgcmV0dXJuIHN0YXR1czsKKyAgfQorCisgIC8qIFRPRE86IFRvIHN1cHBvcnQgbm9uLWludGVybGVhdmVkIGF1ZGlvLCBnbyBvdmVyIGFsbCBtQnVmZmVycywKKyAgICogICAgICAgbm90IGp1c3QgdGhlIGZpcnN0IG9uZS4gKi8KKworICByZW1haW5pbmcgPSBidWYtPmNvcmVfYXVkaW8tPnJlY0J1ZmZlckxpc3QtPm1CdWZmZXJzWzBdLm1EYXRhQnl0ZVNpemU7CisKKyAgd2hpbGUgKHJlbWFpbmluZykgeworICAgIGlmICghZ3N0X2F1ZGlvX3JpbmdfYnVmZmVyX3ByZXBhcmVfcmVhZCAoR1NUX0FVRElPX1JJTkdfQlVGRkVSIChidWYpLAorICAgICAgICAgICAgJndyaXRlc2VnLCAmd3JpdGVwdHIsICZsZW4pKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBsZW4gLT0gYnVmLT5zZWdvZmZzZXQ7CisKKyAgICBpZiAobGVuID4gcmVtYWluaW5nKQorICAgICAgbGVuID0gcmVtYWluaW5nOworCisgICAgbWVtY3B5ICh3cml0ZXB0ciArIGJ1Zi0+c2Vnb2Zmc2V0LAorICAgICAgICAoY2hhciAqKSBidWYtPmNvcmVfYXVkaW8tPnJlY0J1ZmZlckxpc3QtPm1CdWZmZXJzWzBdLm1EYXRhICsgb2Zmc2V0LAorICAgICAgICBsZW4pOworCisgICAgYnVmLT5zZWdvZmZzZXQgKz0gbGVuOworICAgIG9mZnNldCArPSBsZW47CisgICAgcmVtYWluaW5nIC09IGxlbjsKKworICAgIGlmICgoZ2ludCkgYnVmLT5zZWdvZmZzZXQgPT0gR1NUX0FVRElPX1JJTkdfQlVGRkVSIChidWYpLT5zcGVjLnNlZ3NpemUpIHsKKyAgICAgIC8qIHdlIHdyb3RlIG9uZSBzZWdtZW50ICovCisgICAgICBnc3RfYXVkaW9fcmluZ19idWZmZXJfYWR2YW5jZSAoR1NUX0FVRElPX1JJTkdfQlVGRkVSIChidWYpLCAxKTsKKworICAgICAgYnVmLT5zZWdvZmZzZXQgPSAwOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfYXVkaW9fc3JjX29zeGVsZW1lbnRfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwgZ3BvaW50ZXIgaWZhY2VfZGF0YSkKK3sKKyAgR3N0T3N4QXVkaW9FbGVtZW50SW50ZXJmYWNlICppZmFjZSA9IChHc3RPc3hBdWRpb0VsZW1lbnRJbnRlcmZhY2UgKikgZ19pZmFjZTsKKworICBpZmFjZS0+aW9fcHJvYyA9IChBVVJlbmRlckNhbGxiYWNrKSBnc3Rfb3N4X2F1ZGlvX3NyY19pb19wcm9jOworfQpkaWZmIC0tZ2l0IGEvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmggYi9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDgyNWIwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgKHRoZSAiTEdQTCIpLCBpbgorICogd2hpY2ggY2FzZSB0aGUgZm9sbG93aW5nIHByb3Zpc2lvbnMgYXBwbHkgaW5zdGVhZCBvZiB0aGUgb25lcworICogbWVudGlvbmVkIGFib3ZlOgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfT1NYQVVESU9TUkNfSF9fCisjZGVmaW5lIF9fR1NUX09TWEFVRElPU1JDX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb2Jhc2VzcmMuaD4KKyNpbmNsdWRlICJnc3Rvc3hhdWRpb3JpbmdidWZmZXIuaCIKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9PU1hfQVVESU9fU1JDX0NBUFMgImF1ZGlvL3gtcmF3LCAiIFwKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX0ZPUk1BVFNfQUxMICIsICIgXAorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgXAorICAgICAgICAicmF0ZSA9IChpbnQpIFsxLCBNQVhdLCAiICJjaGFubmVscyA9IChpbnQpIFsxLCBNQVhdIgorCisjZGVmaW5lIEdTVF9UWVBFX09TWF9BVURJT19TUkMgXAorICAoZ3N0X29zeF9hdWRpb19zcmNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX09TWF9BVURJT19TUkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9PU1hfQVVESU9fU1JDLEdzdE9zeEF1ZGlvU3JjKSkKKyNkZWZpbmUgR1NUX09TWF9BVURJT19TUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfT1NYX0FVRElPX1NSQyxHc3RPc3hBdWRpb1NyY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX09TWF9BVURJT19TUkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9PU1hfQVVESU9fU1JDKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9zeEF1ZGlvU3JjIEdzdE9zeEF1ZGlvU3JjOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9zeEF1ZGlvU3JjQ2xhc3MgR3N0T3N4QXVkaW9TcmNDbGFzczsKKworc3RydWN0IF9Hc3RPc3hBdWRpb1NyYworeworICBHc3RBdWRpb0Jhc2VTcmMgc3JjOworCisgIEF1ZGlvRGV2aWNlSUQgZGV2aWNlX2lkOworfTsKKworc3RydWN0IF9Hc3RPc3hBdWRpb1NyY0NsYXNzCit7CisgIEdzdEF1ZGlvQmFzZVNyY0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9vc3hfYXVkaW9fc3JjX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX09TWEFVRElPU1JDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5jIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkM2I4ODIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvLmMKQEAgLTAsMCArMSw2NzYgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIEZsdWVuZG8gUy5BLiA8c3VwcG9ydEBmbHVlbmRvLmNvbT4KKyAqICAgQXV0aG9yczogSm9zZXAgVG9ycmEgVmFsbMOocyA8am9zZXBAZmx1ZW5kby5jb20+CisgKiAgICAgICAgICAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8YW1vcmFsZXNAZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJnc3Rvc3hjb3JlYXVkaW8uaCIKKyNpbmNsdWRlICJnc3Rvc3hjb3JlYXVkaW9jb21tb24uaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAob3N4X2F1ZGlvX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIG9zeF9hdWRpb19kZWJ1ZworCitHX0RFRklORV9UWVBFIChHc3RDb3JlQXVkaW8sIGdzdF9jb3JlX2F1ZGlvLCBHX1RZUEVfT0JKRUNUKTsKKworI2lmZGVmIEhBVkVfSU9TCisjaW5jbHVkZSAiZ3N0b3N4Y29yZWF1ZGlvcmVtb3RlaW8uYyIKKyNlbHNlCisjaW5jbHVkZSAiZ3N0b3N4Y29yZWF1ZGlvaGFsLmMiCisjZW5kaWYKKworCitzdGF0aWMgdm9pZAorZ3N0X2NvcmVfYXVkaW9fY2xhc3NfaW5pdCAoR3N0Q29yZUF1ZGlvQ2xhc3MgKiBrbGFzcykKK3sKK30KKworc3RhdGljIHZvaWQKK2dzdF9jb3JlX2F1ZGlvX2luaXQgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIGNvcmVfYXVkaW8tPmlzX3Bhc3N0aHJvdWdoID0gRkFMU0U7CisgIGNvcmVfYXVkaW8tPmRldmljZV9pZCA9IGtBdWRpb0RldmljZVVua25vd247CisgIGNvcmVfYXVkaW8tPmlzX3NyYyA9IEZBTFNFOworICBjb3JlX2F1ZGlvLT5hdWRpb3VuaXQgPSBOVUxMOworICBjb3JlX2F1ZGlvLT5jYWNoZWRfY2FwcyA9IE5VTEw7CisgIGNvcmVfYXVkaW8tPmNhY2hlZF9jYXBzX3ZhbGlkID0gRkFMU0U7CisjaWZuZGVmIEhBVkVfSU9TCisgIGNvcmVfYXVkaW8tPmhvZ19waWQgPSAtMTsKKyAgY29yZV9hdWRpby0+ZGlzYWJsZWRfbWl4aW5nID0gRkFMU0U7CisjZW5kaWYKK30KKworc3RhdGljIGdib29sZWFuCitfaXNfb3V0ZXJfc2NvcGUgKEF1ZGlvVW5pdFNjb3BlIHNjb3BlLCBBdWRpb1VuaXRFbGVtZW50IGVsZW1lbnQpCit7CisgIHJldHVybgorICAgICAgKHNjb3BlID09IGtBdWRpb1VuaXRTY29wZV9JbnB1dCAmJiBlbGVtZW50ID09IDEpIHx8CisgICAgICAoc2NvcGUgPT0ga0F1ZGlvVW5pdFNjb3BlX091dHB1dCAmJiBlbGVtZW50ID09IDApOworfQorCitzdGF0aWMgdm9pZAorX2F1ZGlvX3VuaXRfcHJvcGVydHlfbGlzdGVuZXIgKHZvaWQgKmluUmVmQ29uLCBBdWRpb1VuaXQgaW5Vbml0LAorICAgIEF1ZGlvVW5pdFByb3BlcnR5SUQgaW5JRCwgQXVkaW9Vbml0U2NvcGUgaW5TY29wZSwKKyAgICBBdWRpb1VuaXRFbGVtZW50IGluRWxlbWVudCkKK3sKKyAgR3N0Q29yZUF1ZGlvICpjb3JlX2F1ZGlvOworCisgIGNvcmVfYXVkaW8gPSBHU1RfQ09SRV9BVURJTyAoaW5SZWZDb24pOworICBnX2Fzc2VydCAoaW5Vbml0ID09IGNvcmVfYXVkaW8tPmF1ZGlvdW5pdCk7CisKKyAgc3dpdGNoIChpbklEKSB7CisgICAgY2FzZSBrQXVkaW9Vbml0UHJvcGVydHlfQXVkaW9DaGFubmVsTGF5b3V0OgorICAgIGNhc2Uga0F1ZGlvVW5pdFByb3BlcnR5X1N0cmVhbUZvcm1hdDoKKyAgICAgIGlmIChfaXNfb3V0ZXJfc2NvcGUgKGluU2NvcGUsIGluRWxlbWVudCkpIHsKKyAgICAgICAgLyogV2UgZG9uJ3QgcHVzaCBnc3RfZXZlbnRfbmV3X2NhcHMgaGVyZSAoZm9yIHNyYyksCisgICAgICAgICAqIG5vciBnc3RfZXZlbnRfbmV3X3JlY29uZmlndXJlIChmb3Igc2luayksIHNpbmNlIENvcmUgQXVkaW8gY29udGludWVzCisgICAgICAgICAqIHRvIGhhcHBpbHkgZnVuY3Rpb24gd2l0aCB0aGUgb2xkIGZvcm1hdCwgZG9pbmcgY29udmVyc2lvbi9yZXNhbXBsaW5nCisgICAgICAgICAqIGFzIG5lZWRlZC4KKyAgICAgICAgICogVGhpcyBtZXJlbHkgInJlZnJlc2hlcyIgb3VyIFBSRUZFUlJFRCBjYXBzLiAqLworCisgICAgICAgIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGVpdGhlciBmcm9tIGEgQ29yZSBBdWRpbyB0aHJlYWQKKyAgICAgICAgICogb3IgYXMgYSByZXN1bHQgb2YgYSBDb3JlIEF1ZGlvIEFQSSAoZS5nLiBBdWRpb1VuaXRJbml0aWFsaXplKQorICAgICAgICAgKiBmcm9tIG91ciBvd24gdGhyZWFkLiBJbiB0aGUgbGF0dGVyIGNhc2UsIG9zeGJ1ZiBjYW4gYmUKKyAgICAgICAgICogYWxyZWFkeSBsb2NrZWQgKEdTdHJlYW1lcidzIG11dGV4IGlzIG5vdCByZWN1cnNpdmUpLgorICAgICAgICAgKiBGb3IgdGhpcyByZWFzb24gd2UgdXNlIGEgYm9vbGVhbiBmbGFnIGluc3RlYWQgb2YgbnVsbGlmeWluZworICAgICAgICAgKiBjYWNoZWRfY2Fwcy4gKi8KKyAgICAgICAgY29yZV9hdWRpby0+Y2FjaGVkX2NhcHNfdmFsaWQgPSBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgUHVibGljIEFQSSAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworR3N0Q29yZUF1ZGlvICoKK2dzdF9jb3JlX2F1ZGlvX25ldyAoR3N0T2JqZWN0ICogb3N4YnVmKQoreworICBHc3RDb3JlQXVkaW8gKmNvcmVfYXVkaW87CisKKyAgY29yZV9hdWRpbyA9IGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfQ09SRV9BVURJTywgTlVMTCk7CisgIGNvcmVfYXVkaW8tPm9zeGJ1ZiA9IG9zeGJ1ZjsKKyAgY29yZV9hdWRpby0+Y2FjaGVkX2NhcHMgPSBOVUxMOworICByZXR1cm4gY29yZV9hdWRpbzsKK30KKworZ2Jvb2xlYW4KK2dzdF9jb3JlX2F1ZGlvX2Nsb3NlIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICBPU1N0YXR1cyBzdGF0dXM7CisKKyAgLyogVW5pbml0aWFsaXplIHRoZSBBdWRpb1VuaXQgKi8KKyAgc3RhdHVzID0gQXVkaW9Vbml0VW5pbml0aWFsaXplIChjb3JlX2F1ZGlvLT5hdWRpb3VuaXQpOworICBpZiAoc3RhdHVzKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoY29yZV9hdWRpbywgIkZhaWxlZCB0byB1bmluaXRpYWxpemUgQXVkaW9Vbml0OiAlZCIsCisgICAgICAgIChpbnQpIHN0YXR1cyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgQXVkaW9Vbml0UmVtb3ZlUHJvcGVydHlMaXN0ZW5lcldpdGhVc2VyRGF0YSAoY29yZV9hdWRpby0+YXVkaW91bml0LAorICAgICAga0F1ZGlvVW5pdFByb3BlcnR5X0F1ZGlvQ2hhbm5lbExheW91dCwgX2F1ZGlvX3VuaXRfcHJvcGVydHlfbGlzdGVuZXIsCisgICAgICBjb3JlX2F1ZGlvKTsKKyAgQXVkaW9Vbml0UmVtb3ZlUHJvcGVydHlMaXN0ZW5lcldpdGhVc2VyRGF0YSAoY29yZV9hdWRpby0+YXVkaW91bml0LAorICAgICAga0F1ZGlvVW5pdFByb3BlcnR5X1N0cmVhbUZvcm1hdCwgX2F1ZGlvX3VuaXRfcHJvcGVydHlfbGlzdGVuZXIsCisgICAgICBjb3JlX2F1ZGlvKTsKKworICAvKiBjb3JlX2F1ZGlvLT5vc3hidWYgaXMgYWxyZWFkeSBsb2NrZWQgYXQgdGhpcyBwb2ludCAqLworICBjb3JlX2F1ZGlvLT5jYWNoZWRfY2Fwc192YWxpZCA9IEZBTFNFOworICBnc3RfY2Fwc19yZXBsYWNlICgmY29yZV9hdWRpby0+Y2FjaGVkX2NhcHMsIE5VTEwpOworCisgIEF1ZGlvQ29tcG9uZW50SW5zdGFuY2VEaXNwb3NlIChjb3JlX2F1ZGlvLT5hdWRpb3VuaXQpOworICBjb3JlX2F1ZGlvLT5hdWRpb3VuaXQgPSBOVUxMOworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK2dzdF9jb3JlX2F1ZGlvX29wZW4gKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIE9TU3RhdHVzIHN0YXR1czsKKworICAvKiBjb3JlX2F1ZGlvLT5vc3hidWYgaXMgYWxyZWFkeSBsb2NrZWQgYXQgdGhpcyBwb2ludCAqLworICBjb3JlX2F1ZGlvLT5jYWNoZWRfY2Fwc192YWxpZCA9IEZBTFNFOworICBnc3RfY2Fwc19yZXBsYWNlICgmY29yZV9hdWRpby0+Y2FjaGVkX2NhcHMsIE5VTEwpOworCisgIGlmICghZ3N0X2NvcmVfYXVkaW9fb3Blbl9pbXBsIChjb3JlX2F1ZGlvKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogQWRkIHByb3BlcnR5IGxpc3RlbmVyICovCisgIHN0YXR1cyA9IEF1ZGlvVW5pdEFkZFByb3BlcnR5TGlzdGVuZXIgKGNvcmVfYXVkaW8tPmF1ZGlvdW5pdCwKKyAgICAgIGtBdWRpb1VuaXRQcm9wZXJ0eV9BdWRpb0NoYW5uZWxMYXlvdXQsIF9hdWRpb191bml0X3Byb3BlcnR5X2xpc3RlbmVyLAorICAgICAgY29yZV9hdWRpbyk7CisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChjb3JlX2F1ZGlvLCAiRmFpbGVkIHRvIGFkZCBhdWRpbyBjaGFubmVsIGxheW91dCBwcm9wZXJ0eSAiCisgICAgICAgICJsaXN0ZW5lciBmb3IgQXVkaW9Vbml0OiAlZCIsIChpbnQpIHN0YXR1cyk7CisgIH0KKyAgc3RhdHVzID0gQXVkaW9Vbml0QWRkUHJvcGVydHlMaXN0ZW5lciAoY29yZV9hdWRpby0+YXVkaW91bml0LAorICAgICAga0F1ZGlvVW5pdFByb3BlcnR5X1N0cmVhbUZvcm1hdCwgX2F1ZGlvX3VuaXRfcHJvcGVydHlfbGlzdGVuZXIsCisgICAgICBjb3JlX2F1ZGlvKTsKKyAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNvcmVfYXVkaW8sICJGYWlsZWQgdG8gYWRkIHN0cmVhbSBmb3JtYXQgcHJvcGVydHkgIgorICAgICAgICAibGlzdGVuZXIgZm9yIEF1ZGlvVW5pdDogJWQiLCAoaW50KSBzdGF0dXMpOworICB9CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgQXVkaW9Vbml0LiBXZSBrZWVwIHRoZSBhdWRpbyB1bml0IGluaXRpYWxpemVkIGVhcmx5IHNvIHRoYXQKKyAgICogd2UgY2FuIHByb2JlIHRoZSB1bmRlcmx5aW5nIGRldmljZS4gKi8KKyAgc3RhdHVzID0gQXVkaW9Vbml0SW5pdGlhbGl6ZSAoY29yZV9hdWRpby0+YXVkaW91bml0KTsKKyAgaWYgKHN0YXR1cykgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNvcmVfYXVkaW8sICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBBdWRpb1VuaXQ6ICVkIiwKKyAgICAgICAgKGludCkgc3RhdHVzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK2dzdF9jb3JlX2F1ZGlvX3N0YXJ0X3Byb2Nlc3NpbmcgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIHJldHVybiBnc3RfY29yZV9hdWRpb19zdGFydF9wcm9jZXNzaW5nX2ltcGwgKGNvcmVfYXVkaW8pOworfQorCitnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9fcGF1c2VfcHJvY2Vzc2luZyAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbykKK3sKKyAgcmV0dXJuIGdzdF9jb3JlX2F1ZGlvX3BhdXNlX3Byb2Nlc3NpbmdfaW1wbCAoY29yZV9hdWRpbyk7Cit9CisKK2dib29sZWFuCitnc3RfY29yZV9hdWRpb19zdG9wX3Byb2Nlc3NpbmcgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIHJldHVybiBnc3RfY29yZV9hdWRpb19zdG9wX3Byb2Nlc3NpbmdfaW1wbCAoY29yZV9hdWRpbyk7Cit9CisKK2dib29sZWFuCitnc3RfY29yZV9hdWRpb19nZXRfc2FtcGxlc19hbmRfbGF0ZW5jeSAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbywKKyAgICBnZG91YmxlIHJhdGUsIGd1aW50ICogc2FtcGxlcywgZ2RvdWJsZSAqIGxhdGVuY3kpCit7CisgIHJldHVybiBnc3RfY29yZV9hdWRpb19nZXRfc2FtcGxlc19hbmRfbGF0ZW5jeV9pbXBsIChjb3JlX2F1ZGlvLCByYXRlLAorICAgICAgc2FtcGxlcywgbGF0ZW5jeSk7Cit9CisKK2dib29sZWFuCitnc3RfY29yZV9hdWRpb19pbml0aWFsaXplIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvLAorICAgIEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiBmb3JtYXQsIEdzdENhcHMgKiBjYXBzLCBnYm9vbGVhbiBpc19wYXNzdGhyb3VnaCkKK3sKKyAgZ3VpbnQzMiBmcmFtZV9zaXplOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGNvcmVfYXVkaW8sCisgICAgICAiSW5pdGlhbGl6aW5nOiBwYXNzdGhyb3VnaDolZCBjYXBzOiUiIEdTVF9QVFJfRk9STUFULCBpc19wYXNzdGhyb3VnaCwKKyAgICAgIGNhcHMpOworCisgIGlmICghZ3N0X2NvcmVfYXVkaW9faW5pdGlhbGl6ZV9pbXBsIChjb3JlX2F1ZGlvLCBmb3JtYXQsIGNhcHMsCisgICAgICAgICAgaXNfcGFzc3Rocm91Z2gsICZmcmFtZV9zaXplKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmIChjb3JlX2F1ZGlvLT5pc19zcmMpIHsKKyAgICAvKiBjcmVhdGUgQXVkaW9CdWZmZXJMaXN0IG5lZWRlZCBmb3IgcmVjb3JkaW5nICovCisgICAgY29yZV9hdWRpby0+cmVjQnVmZmVyU2l6ZSA9IGZyYW1lX3NpemUgKiBmb3JtYXQubUJ5dGVzUGVyRnJhbWU7CisgICAgY29yZV9hdWRpby0+cmVjQnVmZmVyTGlzdCA9CisgICAgICAgIGJ1ZmZlcl9saXN0X2FsbG9jIChmb3JtYXQubUNoYW5uZWxzUGVyRnJhbWUsIGNvcmVfYXVkaW8tPnJlY0J1ZmZlclNpemUsCisgICAgICAgIC8qIEN1cnJlbnRseSBhbHdheXMgVFJVRSAoaS5lLiBpbnRlcmxlYXZlZCkgKi8KKyAgICAgICAgIShmb3JtYXQubUZvcm1hdEZsYWdzICYga0F1ZGlvRm9ybWF0RmxhZ0lzTm9uSW50ZXJsZWF2ZWQpKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCit2b2lkCitnc3RfY29yZV9hdWRpb191bmluaXRpYWxpemUgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIGJ1ZmZlcl9saXN0X2ZyZWUgKGNvcmVfYXVkaW8tPnJlY0J1ZmZlckxpc3QpOworICBjb3JlX2F1ZGlvLT5yZWNCdWZmZXJMaXN0ID0gTlVMTDsKK30KKwordm9pZAorZ3N0X2NvcmVfYXVkaW9fc2V0X3ZvbHVtZSAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbywgZ2Zsb2F0IHZvbHVtZSkKK3sKKyAgQXVkaW9Vbml0U2V0UGFyYW1ldGVyIChjb3JlX2F1ZGlvLT5hdWRpb3VuaXQsIGtIQUxPdXRwdXRQYXJhbV9Wb2x1bWUsCisgICAgICBrQXVkaW9Vbml0U2NvcGVfR2xvYmFsLCAwLCAoZmxvYXQpIHZvbHVtZSwgMCk7Cit9CisKK2dib29sZWFuCitnc3RfY29yZV9hdWRpb19zZWxlY3RfZGV2aWNlIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICByZXR1cm4gZ3N0X2NvcmVfYXVkaW9fc2VsZWN0X2RldmljZV9pbXBsIChjb3JlX2F1ZGlvKTsKK30KKwordm9pZAorZ3N0X2NvcmVfYXVkaW9faW5pdF9kZWJ1ZyAodm9pZCkKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKG9zeF9hdWRpb19kZWJ1ZywgIm9zeGF1ZGlvIiwgMCwKKyAgICAgICJPU1ggQXVkaW8gRWxlbWVudHMiKTsKK30KKworZ2Jvb2xlYW4KK2dzdF9jb3JlX2F1ZGlvX2F1ZGlvX2RldmljZV9pc19zcGRpZl9hdmFpbCAoQXVkaW9EZXZpY2VJRCBkZXZpY2VfaWQpCit7CisgIHJldHVybiBnc3RfY29yZV9hdWRpb19hdWRpb19kZXZpY2VfaXNfc3BkaWZfYXZhaWxfaW1wbCAoZGV2aWNlX2lkKTsKK30KKworLyogRG9lcyB0aGUgY2hhbm5lbCBoYXZlIGF0IGxlYXN0IG9uZSBwb3NpdGlvbmVkIGNoYW5uZWw/CisgKiAoR1N0cmVhbWVyIGlzIG1vcmUgc3RyaWN0IHRoYW4gQ29yZSBBdWRpbywgaW4gdGhhdCBpdCByZXF1aXJlcyBlaXRoZXIKKyAqIGFsbCBjaGFubmVscyB0byBiZSBwb3NpdGlvbmVkLCBvciBhbGwgdW5wb3NpdGlvbmVkLikgKi8KK3N0YXRpYyBnYm9vbGVhbgorX2lzX2NvcmVfYXVkaW9fbGF5b3V0X3Bvc2l0aW9uZWQgKEF1ZGlvQ2hhbm5lbExheW91dCAqIGxheW91dCkKK3sKKyAgZ3VpbnQgaTsKKworICBnX2Fzc2VydCAobGF5b3V0LT5tQ2hhbm5lbExheW91dFRhZyA9PQorICAgICAga0F1ZGlvQ2hhbm5lbExheW91dFRhZ19Vc2VDaGFubmVsRGVzY3JpcHRpb25zKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbGF5b3V0LT5tTnVtYmVyQ2hhbm5lbERlc2NyaXB0aW9uczsgKytpKSB7CisgICAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcCA9CisgICAgICAgIGdzdF9jb3JlX2F1ZGlvX2NoYW5uZWxfbGFiZWxfdG9fZ3N0CisgICAgICAgIChsYXlvdXQtPm1DaGFubmVsRGVzY3JpcHRpb25zW2ldLm1DaGFubmVsTGFiZWwsIGksIEZBTFNFKTsKKworICAgIGlmIChwID49IDApICAgICAgICAgICAgICAgICAvKiBub3Qgc3BlY2lhbCBwb3NpdGl0aW9uICovCisgICAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK19jb3JlX2F1ZGlvX3BhcnNlX2NoYW5uZWxfZGVzY3JpcHRpb25zIChBdWRpb0NoYW5uZWxMYXlvdXQgKiBsYXlvdXQsCisgICAgZ3VpbnQgKiBjaGFubmVscywgZ3VpbnQ2NCAqIGNoYW5uZWxfbWFzaywgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gKiBwb3MpCit7CisgIGdib29sZWFuIHBvc2l0aW9uZWQ7CisgIGd1aW50IGk7CisKKyAgZ19hc3NlcnQgKGxheW91dC0+bUNoYW5uZWxMYXlvdXRUYWcgPT0KKyAgICAgIGtBdWRpb0NoYW5uZWxMYXlvdXRUYWdfVXNlQ2hhbm5lbERlc2NyaXB0aW9ucyk7CisKKyAgcG9zaXRpb25lZCA9IF9pc19jb3JlX2F1ZGlvX2xheW91dF9wb3NpdGlvbmVkIChsYXlvdXQpOworICAqY2hhbm5lbF9tYXNrID0gMDsKKworICAvKiBHbyBvdmVyIGFsbCBsYWJlbHMsIGVpdGhlciB0YWtpbmcgb25seSBwb3NpdGlvbmVkIG9yIG9ubHkKKyAgICogdW5wb3NpdGlvbmVkIGNoYW5uZWxzLCB1cCB0byBHU1RfT1NYX0FVRElPX01BWF9DSEFOTkVMIGNoYW5uZWxzLgorICAgKgorICAgKiBUaGUgcmVzdWx0aW5nICdwb3MnIGFycmF5IHdpbGwgY29udGFpbiBlaXRoZXI6CisgICAqICAtIG9ubHkgcmVndWxhciAoPj0gMCkgcG9zaXRpb25zCisgICAqICAtIG9ubHkgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTk9ORSBwb3NpdGlvbnMKKyAgICogaW4gYSBjb21wYWN0IGZvcm0sIHNraXBwaW5nIG92ZXIgYWxsIHVuc3VwcG9ydGVkIHBvc2l0aW9ucy4KKyAgICovCisgICpjaGFubmVscyA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBsYXlvdXQtPm1OdW1iZXJDaGFubmVsRGVzY3JpcHRpb25zOyArK2kpIHsKKyAgICBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBwID0KKyAgICAgICAgZ3N0X2NvcmVfYXVkaW9fY2hhbm5lbF9sYWJlbF90b19nc3QKKyAgICAgICAgKGxheW91dC0+bUNoYW5uZWxEZXNjcmlwdGlvbnNbaV0ubUNoYW5uZWxMYWJlbCwgaSwgVFJVRSk7CisKKyAgICAvKiBJbiBwb3NpdGlvbmVkIGxheW91dHMsIHNraXAgYWxsIHVucG9zaXRpb25lZCBjaGFubmVscy4KKyAgICAgKiBJbiB1bnBvc2l0aW9uZWQgbGF5b3V0cywgc2tpcCBhbGwgaW52YWxpZCBjaGFubmVscy4gKi8KKyAgICBpZiAoKHBvc2l0aW9uZWQgJiYgcCA+PSAwKSB8fAorICAgICAgICAoIXBvc2l0aW9uZWQgJiYgcCA9PSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FKSkgeworCisgICAgICBpZiAocG9zKQorICAgICAgICBwb3NbKmNoYW5uZWxzXSA9IHA7CisgICAgICAqY2hhbm5lbF9tYXNrIHw9IEdfR1VJTlQ2NF9DT05TVEFOVCAoMSkgPDwgcDsKKyAgICAgICsrKCpjaGFubmVscyk7CisKKyAgICAgIGlmICgqY2hhbm5lbHMgPT0gR1NUX09TWF9BVURJT19NQVhfQ0hBTk5FTCkKKyAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogbm90IHRvIG92ZXJmbG93ICovCisgICAgfQorICB9Cit9CisKK2dib29sZWFuCitnc3RfY29yZV9hdWRpb19wYXJzZV9jaGFubmVsX2xheW91dCAoQXVkaW9DaGFubmVsTGF5b3V0ICogbGF5b3V0LAorICAgIGd1aW50ICogY2hhbm5lbHMsIGd1aW50NjQgKiBjaGFubmVsX21hc2ssIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uICogcG9zKQoreworICBnX2Fzc2VydCAoY2hhbm5lbHMgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChjaGFubmVsX21hc2sgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChsYXlvdXQgIT0gTlVMTCk7CisKKyAgaWYgKGxheW91dC0+bUNoYW5uZWxMYXlvdXRUYWcgIT0KKyAgICAgIGtBdWRpb0NoYW5uZWxMYXlvdXRUYWdfVXNlQ2hhbm5lbERlc2NyaXB0aW9ucykgeworICAgIEdTVF9FUlJPUgorICAgICAgICAoIk9ubHkga0F1ZGlvQ2hhbm5lbExheW91dFRhZ19Vc2VDaGFubmVsRGVzY3JpcHRpb25zIGlzIHN1cHBvcnRlZC4iKTsKKyAgICAqY2hhbm5lbHMgPSAwOworICAgICpjaGFubmVsX21hc2sgPSAwOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHN3aXRjaCAobGF5b3V0LT5tTnVtYmVyQ2hhbm5lbERlc2NyaXB0aW9ucykgeworICAgIGNhc2UgMDoKKyAgICAgIGlmIChwb3MpCisgICAgICAgIHBvc1swXSA9IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX05PTkU7CisgICAgICAqY2hhbm5lbHMgPSAwOworICAgICAgKmNoYW5uZWxfbWFzayA9IDA7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICBjYXNlIDE6CisgICAgICBpZiAocG9zKQorICAgICAgICBwb3NbMF0gPSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9NT05POworICAgICAgKmNoYW5uZWxzID0gMTsKKyAgICAgICpjaGFubmVsX21hc2sgPSAwOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgY2FzZSAyOgorICAgICAgaWYgKHBvcykgeworICAgICAgICBwb3NbMF0gPSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUOworICAgICAgICBwb3NbMV0gPSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVDsKKyAgICAgIH0KKyAgICAgICpjaGFubmVscyA9IDI7CisgICAgICAqY2hhbm5lbF9tYXNrID0KKyAgICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9NQVNLIChGUk9OVF9MRUZUKSB8CisgICAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTUFTSyAoRlJPTlRfUklHSFQpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgZGVmYXVsdDoKKyAgICAgIF9jb3JlX2F1ZGlvX3BhcnNlX2NoYW5uZWxfZGVzY3JpcHRpb25zIChsYXlvdXQsIGNoYW5uZWxzLCBjaGFubmVsX21hc2ssCisgICAgICAgICAgcG9zKTsKKyAgICAgIHJldHVybiBUUlVFOworICB9Cit9CisKKy8qIENvbnZlcnRzIGFuIEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiB0byBwcmVmZXJyZWQgY2Fwcy4KKyAqCisgKiBUaGVzZSBjYXBzIHdpbGwgaW5kaWNhdGUgdGhlIEFVIGVsZW1lbnQncyBjYW5vbmljYWwgZm9ybWF0LCB3aGljaCB3b24ndAorICogbWFrZSBDb3JlIEF1ZGlvIHJlc2FtcGxlIG5vciBjb252ZXJ0LgorICoKKyAqIE5PVEUgT04gTVVMVEktQ0hBTk5FTCBBVURJTzoKKyAqCisgKiBJZiBsYXlvdXQgaXMgbm90IE5VTEwsIHJlc3VsdGluZyBjYXBzIHdpbGwgb25seSBpbmNsdWRlIHRoZSBzdWJzZXQKKyAqIG9mIGNoYW5uZWxzIHN1cHBvcnRlZCBieSBHU3RyZWFtZXIuIElmIHRoZSBDb3JlIEF1ZGlvIGxheW91dCBjb250YWluZWQKKyAqIEFOWSBwb3NpdGlvbmVkIGNoYW5uZWxzLCB0aGVuIE9OTFkgcG9zaXRpb25lZCBjaGFubmVscyB3aWxsIGJlIGluY2x1ZGVkCisgKiBpbiB0aGUgcmVzdWx0aW5nIGNhcHMuIE90aGVyd2lzZSwgcmVzdWx0aW5nIGNhcHMgd2lsbCBiZSB1bnBvc2l0aW9uZWQsCisgKiBhbmQgaW5jbHVkZSBvbmx5IHVucG9zaXRpb25lZCBjaGFubmVscy4KKyAqIChDaGFubmVscyB3aXRoIHVuc3VwcG9ydGVkIEF1ZGlvQ2hhbm5lbExhYmVsIHdpbGwgYmUgc2tpcHBlZCBlaXRoZXIgd2F5LikKKyAqCisgKiBOYXR1cmFsbHksIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaW5kaWNhdGVkIGJ5ICdjaGFubmVscycgY2FuIGJlIGxvd2VyCisgKiB0aGFuIHRoZSBBVSBlbGVtZW50J3MgdG90YWwgbnVtYmVyIG9mIGNoYW5uZWxzLgorICovCitHc3RDYXBzICoKK2dzdF9jb3JlX2F1ZGlvX2FzYmRfdG9fY2FwcyAoQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uICogYXNiZCwKKyAgICBBdWRpb0NoYW5uZWxMYXlvdXQgKiBsYXlvdXQpCit7CisgIEdzdEF1ZGlvSW5mbyBpbmZvOworICBHc3RBdWRpb0Zvcm1hdCBmb3JtYXQgPSBHU1RfQVVESU9fRk9STUFUX1VOS05PV047CisgIGd1aW50IHJhdGUsIGNoYW5uZWxzLCBicHMsIGVuZGlhbm5lc3M7CisgIGd1aW50NjQgY2hhbm5lbF9tYXNrOworICBnYm9vbGVhbiBzaWduLCBpbnRlcmxlYXZlZDsKKworICBpZiAoYXNiZC0+bUZvcm1hdElEICE9IGtBdWRpb0Zvcm1hdExpbmVhclBDTSkgeworICAgIEdTVF9XQVJOSU5HICgiT25seSBsaW5lYXIgUENNIGlzIHN1cHBvcnRlZCIpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBpZiAoIShhc2JkLT5tRm9ybWF0RmxhZ3MgJiBrQXVkaW9Gb3JtYXRGbGFnSXNQYWNrZWQpKSB7CisgICAgR1NUX1dBUk5JTkcgKCJPbmx5IHBhY2tlZCBmb3JtYXRzIHN1cHBvcnRlZCIpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBpZiAoYXNiZC0+bUZvcm1hdEZsYWdzICYga0xpbmVhclBDTUZvcm1hdEZsYWdzU2FtcGxlRnJhY3Rpb25NYXNrKSB7CisgICAgR1NUX1dBUk5JTkcgKCJGaXhlZCBwb2ludCBhdWRpbyBpcyB1bnN1cHBvcnRlZCIpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICByYXRlID0gYXNiZC0+bVNhbXBsZVJhdGU7CisgIGlmIChyYXRlID09IGtBdWRpb1N0cmVhbUFueVJhdGUpIHsKKyAgICBHU1RfV0FSTklORyAoIk5vIHNhbXBsZSByYXRlIik7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIGJwcyA9IGFzYmQtPm1CaXRzUGVyQ2hhbm5lbDsKKyAgZW5kaWFubmVzcyA9IGFzYmQtPm1Gb3JtYXRGbGFncyAmIGtBdWRpb0Zvcm1hdEZsYWdJc0JpZ0VuZGlhbiA/CisgICAgICBHX0JJR19FTkRJQU4gOiBHX0xJVFRMRV9FTkRJQU47CisgIHNpZ24gPSBhc2JkLT5tRm9ybWF0SUQgJiBrQXVkaW9Gb3JtYXRGbGFnSXNTaWduZWRJbnRlZ2VyID8gVFJVRSA6IEZBTFNFOworICBpbnRlcmxlYXZlZCA9IGFzYmQtPm1Gb3JtYXRGbGFncyAmIGtBdWRpb0Zvcm1hdEZsYWdJc05vbkludGVybGVhdmVkID8KKyAgICAgIFRSVUUgOiBGQUxTRTsKKworICBpZiAoYXNiZC0+bUZvcm1hdEZsYWdzICYga0F1ZGlvRm9ybWF0RmxhZ0lzRmxvYXQpIHsKKyAgICBpZiAoYnBzID09IDMyKSB7CisgICAgICBpZiAoZW5kaWFubmVzcyA9PSBHX0xJVFRMRV9FTkRJQU4pCisgICAgICAgIGZvcm1hdCA9IEdTVF9BVURJT19GT1JNQVRfRjMyTEU7CisgICAgICBlbHNlCisgICAgICAgIGZvcm1hdCA9IEdTVF9BVURJT19GT1JNQVRfRjMyQkU7CisKKyAgICB9IGVsc2UgaWYgKGJwcyA9PSA2NCkgeworICAgICAgaWYgKGVuZGlhbm5lc3MgPT0gR19MSVRUTEVfRU5ESUFOKQorICAgICAgICBmb3JtYXQgPSBHU1RfQVVESU9fRk9STUFUX0Y2NExFOworICAgICAgZWxzZQorICAgICAgICBmb3JtYXQgPSBHU1RfQVVESU9fRk9STUFUX0Y2NEJFOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQgPSBnc3RfYXVkaW9fZm9ybWF0X2J1aWxkX2ludGVnZXIgKHNpZ24sIGVuZGlhbm5lc3MsIGJwcywgYnBzKTsKKyAgfQorCisgIGlmIChmb3JtYXQgPT0gR1NUX0FVRElPX0ZPUk1BVF9VTktOT1dOKSB7CisgICAgR1NUX1dBUk5JTkcgKCJVbnN1cHBvcnRlZCBzYW1wbGUgZm9ybWF0Iik7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIGlmIChsYXlvdXQpIHsKKyAgICBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBwb3NbR1NUX09TWF9BVURJT19NQVhfQ0hBTk5FTF07CisKKyAgICBpZiAoIWdzdF9jb3JlX2F1ZGlvX3BhcnNlX2NoYW5uZWxfbGF5b3V0IChsYXlvdXQsICZjaGFubmVscywgJmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgIHBvcykpIHsKKyAgICAgIEdTVF9XQVJOSU5HICgiRmFpbGVkIHRvIHBhcnNlIGNoYW5uZWwgbGF5b3V0Iik7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8qIFRoZSBBVSBjYW4gaGF2ZSBhcmJpdHJhcnkgY2hhbm5lbCBvcmRlciwgYnV0IHdlJ3JlIHVzaW5nIEdzdEF1ZGlvSW5mbworICAgICAqIHdoaWNoIHN1cHBvcnRzIG9ubHkgdGhlIEdTdHJlYW1lciBjaGFubmVsIG9yZGVyLgorICAgICAqIEFsc28sIHdlJ3JlIGV2ZW50dWFsbHkgcHJvZHVjaW5nIGNhcHMsIHdoaWNoIG9ubHkgaGF2ZSBjaGFubmVsLW1hc2sKKyAgICAgKiAod2hvc2UgaW1wbGllZCBvcmRlciBpcyB0aGUgR1N0cmVhbWVyIGNoYW5uZWwgb3JkZXIpLiAqLworICAgIGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uc190b192YWxpZF9vcmRlciAocG9zLCBjaGFubmVscyk7CisKKyAgICBnc3RfYXVkaW9faW5mb19zZXRfZm9ybWF0ICgmaW5mbywgZm9ybWF0LCByYXRlLCBjaGFubmVscywgcG9zKTsKKyAgfSBlbHNlIHsKKyAgICBjaGFubmVscyA9IE1JTiAoYXNiZC0+bUNoYW5uZWxzUGVyRnJhbWUsIEdTVF9PU1hfQVVESU9fTUFYX0NIQU5ORUwpOworICAgIGdzdF9hdWRpb19pbmZvX3NldF9mb3JtYXQgKCZpbmZvLCBmb3JtYXQsIHJhdGUsIGNoYW5uZWxzLCBOVUxMKTsKKyAgfQorCisgIHJldHVybiBnc3RfYXVkaW9faW5mb190b19jYXBzICgmaW5mbyk7CisKK2Vycm9yOgorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGdib29sZWFuCitfY29yZV9hdWRpb19nZXRfcHJvcGVydHkgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8sIGdib29sZWFuIG91dGVyLAorICAgIEF1ZGlvVW5pdFByb3BlcnR5SUQgaW5JRCwgdm9pZCAqaW5EYXRhLCBVSW50MzIgKiBpbkRhdGFTaXplKQoreworICBPU1N0YXR1cyBzdGF0dXM7CisgIEF1ZGlvVW5pdFNjb3BlIHNjb3BlOworICBBdWRpb1VuaXRFbGVtZW50IGVsZW1lbnQ7CisKKyAgc2NvcGUgPSBvdXRlciA/CisgICAgICBDT1JFX0FVRElPX09VVEVSX1NDT1BFIChjb3JlX2F1ZGlvKSA6IENPUkVfQVVESU9fSU5ORVJfU0NPUEUgKGNvcmVfYXVkaW8pOworICBlbGVtZW50ID0gQ09SRV9BVURJT19FTEVNRU5UIChjb3JlX2F1ZGlvKTsKKworICBzdGF0dXMgPQorICAgICAgQXVkaW9Vbml0R2V0UHJvcGVydHkgKGNvcmVfYXVkaW8tPmF1ZGlvdW5pdCwgaW5JRCwgc2NvcGUsIGVsZW1lbnQsIGluRGF0YSwKKyAgICAgIGluRGF0YVNpemUpOworCisgIHJldHVybiBzdGF0dXMgPT0gbm9FcnI7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorX2NvcmVfYXVkaW9fZ2V0X3N0cmVhbV9mb3JtYXQgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8sCisgICAgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uICogYXNiZCwgZ2Jvb2xlYW4gb3V0ZXIpCit7CisgIFVJbnQzMiBzaXplOworCisgIHNpemUgPSBzaXplb2YgKEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbik7CisgIHJldHVybiBfY29yZV9hdWRpb19nZXRfcHJvcGVydHkgKGNvcmVfYXVkaW8sIG91dGVyLAorICAgICAga0F1ZGlvVW5pdFByb3BlcnR5X1N0cmVhbUZvcm1hdCwgYXNiZCwgJnNpemUpOworfQorCitBdWRpb0NoYW5uZWxMYXlvdXQgKgorZ3N0X2NvcmVfYXVkaW9fZ2V0X2NoYW5uZWxfbGF5b3V0IChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvLCBnYm9vbGVhbiBvdXRlcikKK3sKKyAgVUludDMyIHNpemU7CisgIEF1ZGlvQ2hhbm5lbExheW91dCAqbGF5b3V0OworCisgIGlmIChjb3JlX2F1ZGlvLT5pc19zcmMpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvcmVfYXVkaW8sCisgICAgICAgICJnc3RfY29yZV9hdWRpb19nZXRfY2hhbm5lbF9sYXlvdXQgbm90IHN1cHBvcnRlZCBvbiBzb3VyY2UuIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAoIV9jb3JlX2F1ZGlvX2dldF9wcm9wZXJ0eSAoY29yZV9hdWRpbywgb3V0ZXIsCisgICAgICAgICAga0F1ZGlvVW5pdFByb3BlcnR5X0F1ZGlvQ2hhbm5lbExheW91dCwgTlVMTCwgJnNpemUpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb3JlX2F1ZGlvLCAidW5hYmxlIHRvIGdldCBjaGFubmVsIGxheW91dCIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgbGF5b3V0ID0gZ19tYWxsb2MgKHNpemUpOworICBpZiAoIV9jb3JlX2F1ZGlvX2dldF9wcm9wZXJ0eSAoY29yZV9hdWRpbywgb3V0ZXIsCisgICAgICAgICAga0F1ZGlvVW5pdFByb3BlcnR5X0F1ZGlvQ2hhbm5lbExheW91dCwgbGF5b3V0LCAmc2l6ZSkpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvcmVfYXVkaW8sICJ1bmFibGUgdG8gZ2V0IGNoYW5uZWwgbGF5b3V0Iik7CisgICAgZ19mcmVlIChsYXlvdXQpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIGxheW91dDsKK30KKworI2RlZmluZSBTVEVSRU9fQ0hBTk5FTF9NQVNLIFwKKyAgKEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX01BU0sgKEZST05UX0xFRlQpIHwgXAorICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTUFTSyAoRlJPTlRfUklHSFQpKQorCitHc3RDYXBzICoKK2dzdF9jb3JlX2F1ZGlvX3Byb2JlX2NhcHMgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8sIEdzdENhcHMgKiBpbl9jYXBzKQoreworICBndWludCBpLCBjaGFubmVsczsKKyAgZ2Jvb2xlYW4gc3BkaWZfYWxsb3dlZDsKKyAgQXVkaW9DaGFubmVsTGF5b3V0ICpsYXlvdXQ7CisgIEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiBvdXRlcl9hc2JkOworICBnYm9vbGVhbiBnb3Rfb3V0ZXJfYXNiZDsKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisgIGd1aW50NjQgY2hhbm5lbF9tYXNrOworCisgIC8qIEdldCB0aGUgQVNCRCBvZiB0aGUgb3V0ZXIgc2NvcGUgKGkuZS4gaW5wdXQgc2NvcGUgb2YgSW5wdXQsCisgICAqIG91dHB1dCBzY29wZSBvZiBPdXRwdXQpLgorICAgKiBUaGlzIEFTQkQgaW5kaWNhdGVzIHRoZSBoYXJkd2FyZSBmb3JtYXQuICovCisgIGdvdF9vdXRlcl9hc2JkID0KKyAgICAgIF9jb3JlX2F1ZGlvX2dldF9zdHJlYW1fZm9ybWF0IChjb3JlX2F1ZGlvLCAmb3V0ZXJfYXNiZCwgVFJVRSk7CisKKyAgLyogQ29sbGVjdCBpbmZvIGFib3V0IHRoZSBIVyBjYXBhYmlsaXRlcyBhbmQgcHJlZmVyZW5jZXMgKi8KKyAgc3BkaWZfYWxsb3dlZCA9CisgICAgICBnc3RfY29yZV9hdWRpb19hdWRpb19kZXZpY2VfaXNfc3BkaWZfYXZhaWwgKGNvcmVfYXVkaW8tPmRldmljZV9pZCk7CisgIGlmICghY29yZV9hdWRpby0+aXNfc3JjKQorICAgIGxheW91dCA9IGdzdF9jb3JlX2F1ZGlvX2dldF9jaGFubmVsX2xheW91dCAoY29yZV9hdWRpbywgVFJVRSk7CisgIGVsc2UKKyAgICBsYXlvdXQgPSBOVUxMOyAgICAgICAgICAgICAgLyogbm8gc3VwcG9ydGVkIGZvciBzb3VyY2VzICovCisKKyAgR1NUX0RFQlVHX09CSkVDVCAoY29yZV9hdWRpbywgIlNlbGVjdGVkIGRldmljZSBJRDogJXUgU1BESUYgYWxsb3dlZDogJWQiLAorICAgICAgKHVuc2lnbmVkKSBjb3JlX2F1ZGlvLT5kZXZpY2VfaWQsIHNwZGlmX2FsbG93ZWQpOworCisgIGlmIChsYXlvdXQpIHsKKyAgICBpZiAoIWdzdF9jb3JlX2F1ZGlvX3BhcnNlX2NoYW5uZWxfbGF5b3V0IChsYXlvdXQsICZjaGFubmVscywgJmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgIE5VTEwpKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvcmVfYXVkaW8sICJGYWlsZWQgdG8gcGFyc2UgY2hhbm5lbCBsYXlvdXQiKTsKKyAgICAgIGNoYW5uZWxfbWFzayA9IDA7CisgICAgfQorCisgICAgLyogSWYgYXZhaWxhYmxlLCBzdGFydCB3aXRoIHRoZSBwcmVmZXJyZWQgY2Fwcy4gKi8KKyAgICBpZiAoZ290X291dGVyX2FzYmQpCisgICAgICBjYXBzID0gZ3N0X2NvcmVfYXVkaW9fYXNiZF90b19jYXBzICgmb3V0ZXJfYXNiZCwgbGF5b3V0KTsKKworICAgIGdfZnJlZSAobGF5b3V0KTsKKyAgfSBlbHNlIGlmIChnb3Rfb3V0ZXJfYXNiZCkgeworICAgIGNoYW5uZWxzID0gb3V0ZXJfYXNiZC5tQ2hhbm5lbHNQZXJGcmFtZTsKKyAgICBjaGFubmVsX21hc2sgPSAwOworICAgIC8qIElmIGF2YWlsYWJsZSwgc3RhcnQgd2l0aCB0aGUgcHJlZmVycmVkIGNhcHMgKi8KKyAgICBjYXBzID0gZ3N0X2NvcmVfYXVkaW9fYXNiZF90b19jYXBzICgmb3V0ZXJfYXNiZCwgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoY29yZV9hdWRpbywKKyAgICAgICAgIlVuYWJsZSB0byBnZXQgYW55IGluZm9ybWF0aW9uIGFib3V0IGhhcmR3YXJlIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvKiBBcHBlbmQgdGhlIGFsbG93ZWQgc3Vic2V0IGJhc2VkIG9uIHRoZSB0ZW1wbGF0ZSBjYXBzICAqLworICBpZiAoIWNhcHMpCisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKyAgZm9yIChpID0gMDsgaSA8IGdzdF9jYXBzX2dldF9zaXplIChpbl9jYXBzKTsgaSsrKSB7CisgICAgR3N0U3RydWN0dXJlICppbl9zOworCisgICAgaW5fcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGluX2NhcHMsIGkpOworCisgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKGluX3MsICJhdWRpby94LWFjMyIpIHx8CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKGluX3MsICJhdWRpby94LWR0cyIpKSB7CisgICAgICBpZiAoc3BkaWZfYWxsb3dlZCkgeworICAgICAgICBnc3RfY2Fwc19hcHBlbmRfc3RydWN0dXJlIChjYXBzLCBnc3Rfc3RydWN0dXJlX2NvcHkgKGluX3MpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgR3N0U3RydWN0dXJlICpvdXRfczsKKworICAgICAgb3V0X3MgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKGluX3MpOworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG91dF9zLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBjaGFubmVscywgTlVMTCk7CisgICAgICBpZiAoY2hhbm5lbF9tYXNrICE9IDApIHsKKyAgICAgICAgLyogcG9zaXRpb25lZCBsYXlvdXQgKi8KKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG91dF9zLAorICAgICAgICAgICAgImNoYW5uZWwtbWFzayIsIEdTVF9UWVBFX0JJVE1BU0ssIGNoYW5uZWxfbWFzaywgTlVMTCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiB1bnBvc2l0aW9uZWQgbGF5b3V0ICovCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChvdXRfcywgImNoYW5uZWwtbWFzayIpOworICAgICAgfQorCisjaWZuZGVmIEhBVkVfSU9TCisgICAgICBpZiAoY29yZV9hdWRpby0+aXNfc3JjICYmIGdvdF9vdXRlcl9hc2JkCisgICAgICAgICAgJiYgb3V0ZXJfYXNiZC5tU2FtcGxlUmF0ZSAhPSBrQXVkaW9TdHJlYW1BbnlSYXRlKSB7CisgICAgICAgIC8qIEFjY29yZGluZyB0byBDb3JlIEF1ZGlvIGVuZ2luZWVyLCBBVUhBTCBkb2VzIG5vdCBzdXBwb3J0IHNhbXBsZSByYXRlIGNvbnZlcnNpb24uCisgICAgICAgICAqIG9uIHNvdXJjZXMuIFRoZXJlZm9yZSwgd2UgZml4YXRlIHRoZSBzYW1wbGUgcmF0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogIllvdSBkZWZpbml0ZWx5IGNhbm5vdCBkbyByYXRlIGNvbnZlcnNpb24gYXMgcGFydCBvZiBnZXR0aW5nIGlucHV0IGZyb20gQVVIQUwuCisgICAgICAgICAqICBUaGF0J3MgdGhlIG1vc3QgY29tbW9uIGNhdXNlIG9mIHRob3NlICJjYW5ub3QgZG8gaW4gY3VycmVudCBjb250ZXh0IiBlcnJvcnMuIgorICAgICAgICAgKiBodHRwOi8vbGlzdHMuYXBwbGUuY29tL2FyY2hpdmVzL2NvcmVhdWRpby1hcGkvMjAwNi9TZXAvbXNnMDAwODguaHRtbAorICAgICAgICAgKi8KKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG91dF9zLCAicmF0ZSIsIEdfVFlQRV9JTlQsCisgICAgICAgICAgICAoZ2ludCkgb3V0ZXJfYXNiZC5tU2FtcGxlUmF0ZSwgTlVMTCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLyogU3BlY2lhbCBjYXNlcyBmb3IgdXBtaXhpbmcgYW5kIGRvd25taXhpbmcuCisgICAgICAgKiBPdGhlciB0aGFuIHRoYXQsIHRoZSBBVXMgZG9uJ3QgdXBtaXggb3IgZG93bm1peCBtdWx0aS1jaGFubmVsIGF1ZGlvLAorICAgICAgICogZS5nLiBpZiB5b3UgcHVzaCA1LjEtc3Vycm91bmQgYXVkaW8gdG8gYSBzdGVyZW8gY29uZmlndXJhdGlvbiwKKyAgICAgICAqIHRoZSBsZWZ0IGFuZCByaWdodCBjaGFubmVscyB3aWxsIGJlIHBsYXllZCBhY2NvcmRpbmdseSwKKyAgICAgICAqIGFuZCB0aGUgcmVzdCB3aWxsIGJlIGRyb3BwZWQuICovCisgICAgICBpZiAoY2hhbm5lbHMgPT0gMSkgeworICAgICAgICAvKiBJZiBoYXZlIG1vbm8sIHRoZW4gYWxzbyBvZmZlciBzdGVyZW8gc2luY2UgQ29yZUF1ZGlvIGRvd25taXhlcyB0byBpdCAqLworICAgICAgICBHc3RTdHJ1Y3R1cmUgKnN0ZXJlbyA9IGdzdF9zdHJ1Y3R1cmVfY29weSAob3V0X3MpOworICAgICAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAob3V0X3MsICJjaGFubmVsLW1hc2siKTsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHN0ZXJlbywgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMiwKKyAgICAgICAgICAgICJjaGFubmVsLW1hc2siLCBHU1RfVFlQRV9CSVRNQVNLLCBTVEVSRU9fQ0hBTk5FTF9NQVNLLCBOVUxMKTsKKyAgICAgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoY2Fwcywgc3RlcmVvKTsKKyAgICAgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoY2Fwcywgb3V0X3MpOworICAgICAgfSBlbHNlIGlmIChjaGFubmVscyA9PSAyICYmIChjaGFubmVsX21hc2sgPT0gMAorICAgICAgICAgICAgICB8fCBjaGFubmVsX21hc2sgPT0gU1RFUkVPX0NIQU5ORUxfTUFTSykpIHsKKyAgICAgICAgLyogSWYgaGF2ZSBzdGVyZW8gY2hhbm5lbHMsIHRoZW4gYWxzbyBvZmZlciBtb25vIHNpbmNlIENvcmVBdWRpbworICAgICAgICAgKiB1cG1peGVzIGl0LiAqLworICAgICAgICBHc3RTdHJ1Y3R1cmUgKm1vbm8gPSBnc3Rfc3RydWN0dXJlX2NvcHkgKG91dF9zKTsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG1vbm8sICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDEsIE5VTEwpOworICAgICAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAobW9ubywgImNoYW5uZWwtbWFzayIpOworICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAob3V0X3MsICJjaGFubmVsLW1hc2siLCBHU1RfVFlQRV9CSVRNQVNLLAorICAgICAgICAgICAgU1RFUkVPX0NIQU5ORUxfTUFTSywgTlVMTCk7CisKKyAgICAgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoY2Fwcywgb3V0X3MpOworICAgICAgICBnc3RfY2Fwc19hcHBlbmRfc3RydWN0dXJlIChjYXBzLCBtb25vKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIE90aGVyd2hpc2UganVzdCBhZGQgdGhlIGNhcHMgKi8KKyAgICAgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoY2Fwcywgb3V0X3MpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGNvcmVfYXVkaW8sICJQcm9iZWQgY2FwczolIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisgIHJldHVybiBjYXBzOworfQpkaWZmIC0tZ2l0IGEvc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5oIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlODhlM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMiBGbHVlbmRvIFMuQS4gPHN1cHBvcnRAZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX19HU1RfQ09SRV9BVURJT19IX18KKyNkZWZpbmUgX19HU1RfQ09SRV9BVURJT19IX18KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLWNoYW5uZWxzLmg+CisjaWZkZWYgSEFWRV9JT1MKKyAgI2luY2x1ZGUgPENvcmVBdWRpby9Db3JlQXVkaW9UeXBlcy5oPgorICAjZGVmaW5lIEF1ZGlvRGV2aWNlSUQgZ2ludAorICAjZGVmaW5lIGtBdWRpb0RldmljZVVua25vd24gMAorI2Vsc2UKKyAgI2luY2x1ZGUgPENvcmVBdWRpby9Db3JlQXVkaW8uaD4KKyAgI2luY2x1ZGUgPEF1ZGlvVG9vbGJveC9BdWRpb1Rvb2xib3guaD4KKyAgI2lmIE1BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEIDwgMTA2MAorICAgICNpbmNsdWRlIDxDb3JlU2VydmljZXMvQ29yZVNlcnZpY2VzLmg+CisgICAgI2RlZmluZSBBdWRpb0NvbXBvbmVudEZpbmROZXh0IEZpbmROZXh0Q29tcG9uZW50CisgICAgI2RlZmluZSBBdWRpb0NvbXBvbmVudEluc3RhbmNlTmV3IE9wZW5BQ29tcG9uZW50CisgICAgI2RlZmluZSBBdWRpb0NvbXBvbmVudEluc3RhbmNlRGlzcG9zZSBDbG9zZUNvbXBvbmVudAorICAgICNkZWZpbmUgQXVkaW9Db21wb25lbnQgQ29tcG9uZW50CisgICAgI2RlZmluZSBBdWRpb0NvbXBvbmVudERlc2NyaXB0aW9uIENvbXBvbmVudERlc2NyaXB0aW9uCisgICNlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8QXVkaW9Vbml0L0F1ZGlvVW5pdC5oPgorI2luY2x1ZGUgImdzdG9zeGF1ZGlvZWxlbWVudC5oIgorCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9DT1JFX0FVRElPIFwKKyAgKGdzdF9jb3JlX2F1ZGlvX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9DT1JFX0FVRElPKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQ09SRV9BVURJTyxHc3RDb3JlQXVkaW8pKQorI2RlZmluZSBHU1RfQ09SRV9BVURJT19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9DT1JFX0FVRElPLEdzdENvcmVBdWRpb0NsYXNzKSkKKyNkZWZpbmUgR1NUX0NPUkVfQVVESU9fR0VUX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUygob2JqKSxHU1RfVFlQRV9DT1JFX0FVRElPLEdzdENvcmVBdWRpb0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0NPUkVfQVVESU8ob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9DT1JFX0FVRElPKSkKKyNkZWZpbmUgR1NUX0lTX0NPUkVfQVVESU9fQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfQ09SRV9BVURJTykpCisKKy8qIFRPRE86IENvbnNpZGVyIHJhaXNpbmcgdG8gNjQgKi8KKyNkZWZpbmUgR1NUX09TWF9BVURJT19NQVhfQ0hBTk5FTCAoOSkKKworI2RlZmluZSBDT1JFX0FVRElPX0ZPUk1BVF9JU19TUERJRihmKSAoKGYpLm1Gb3JtYXQubUZvcm1hdElEID09ICdJQUMzJyB8fCAoZikubUZvcm1hdC5tRm9ybWF0SUQgPT0gJ2lhYzMnIHx8IChmKS5tRm9ybWF0Lm1Gb3JtYXRJRCA9PSBrQXVkaW9Gb3JtYXQ2MDk1OEFDMyB8fCAoZikubUZvcm1hdC5tRm9ybWF0SUQgPT0ga0F1ZGlvRm9ybWF0QUMzKQorCisjZGVmaW5lIENPUkVfQVVESU9fRk9STUFUICJGb3JtYXRJRDogJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiByYXRlOiAlZiBmbGFnczogMHgleCBCeXRlc1BlclBhY2tldDogJXUgRnJhbWVzUGVyUGFja2V0OiAldSBCeXRlc1BlckZyYW1lOiAldSBDaGFubmVsc1BlckZyYW1lOiAldSBCaXRzUGVyQ2hhbm5lbDogJXUiCisjZGVmaW5lIENPUkVfQVVESU9fRk9STUFUX0FSR1MoZikgR1NUX0ZPVVJDQ19BUkdTKCh1bnNpZ25lZCBpbnQpKGYpLm1Gb3JtYXRJRCksKGYpLm1TYW1wbGVSYXRlLCh1bnNpZ25lZCBpbnQpKGYpLm1Gb3JtYXRGbGFncywodW5zaWduZWQgaW50KShmKS5tQnl0ZXNQZXJQYWNrZXQsKHVuc2lnbmVkIGludCkoZikubUZyYW1lc1BlclBhY2tldCwodW5zaWduZWQgaW50KShmKS5tQnl0ZXNQZXJGcmFtZSwodW5zaWduZWQgaW50KShmKS5tQ2hhbm5lbHNQZXJGcmFtZSwodW5zaWduZWQgaW50KShmKS5tQml0c1BlckNoYW5uZWwKKworI2RlZmluZSBDT1JFX0FVRElPX0lOTkVSX1NDT1BFKGNvcmVfYXVkaW8pICgoY29yZV9hdWRpbyktPmlzX3NyYyA/IGtBdWRpb1VuaXRTY29wZV9PdXRwdXQgOiBrQXVkaW9Vbml0U2NvcGVfSW5wdXQpCisjZGVmaW5lIENPUkVfQVVESU9fT1VURVJfU0NPUEUoY29yZV9hdWRpbykgKChjb3JlX2F1ZGlvKS0+aXNfc3JjID8ga0F1ZGlvVW5pdFNjb3BlX0lucHV0IDoga0F1ZGlvVW5pdFNjb3BlX091dHB1dCkKKyNkZWZpbmUgQ09SRV9BVURJT19FTEVNRU5UKGNvcmVfYXVkaW8pICgoY29yZV9hdWRpbyktPmlzX3NyYyA/IDEgOiAwKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0Q29yZUF1ZGlvIEdzdENvcmVBdWRpbzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RDb3JlQXVkaW9DbGFzcyBHc3RDb3JlQXVkaW9DbGFzczsKKworc3RydWN0IF9Hc3RDb3JlQXVkaW8KK3sKKyAgR09iamVjdCBvYmplY3Q7CisKKyAgR3N0T2JqZWN0ICpvc3hidWY7CisgIEdzdE9zeEF1ZGlvRWxlbWVudEludGVyZmFjZSAqZWxlbWVudDsKKworICBnYm9vbGVhbiBpc19zcmM7CisgIGdib29sZWFuIGlzX3Bhc3N0aHJvdWdoOworICBBdWRpb0RldmljZUlEIGRldmljZV9pZDsKKyAgZ2Jvb2xlYW4gY2FjaGVkX2NhcHNfdmFsaWQ7IC8qIHRocmVhZC1zYWZlIGZsYWcgKi8KKyAgR3N0Q2FwcyAqY2FjaGVkX2NhcHM7CisgIGdpbnQgc3RyZWFtX2lkeDsKKyAgZ2Jvb2xlYW4gaW9fcHJvY19hY3RpdmU7CisgIGdib29sZWFuIGlvX3Byb2NfbmVlZHNfZGVhY3RpdmF0aW9uOworCisgIC8qIEZvciBMUENNIGluL291dCAqLworICBBdWRpb1VuaXQgYXVkaW91bml0OworICBVSW50MzIgcmVjQnVmZmVyU2l6ZTsgLyogQXVkaW9Vbml0UmVuZGVyIGNsb2JiZXJzIG1EYXRhQnl0ZVNpemUgKi8KKyAgQXVkaW9CdWZmZXJMaXN0ICpyZWNCdWZmZXJMaXN0OworCisjaWZuZGVmIEhBVkVfSU9TCisgIC8qIEZvciBTUERJRiBvdXQgKi8KKyAgcGlkX3QgaG9nX3BpZDsKKyAgZ2Jvb2xlYW4gZGlzYWJsZWRfbWl4aW5nOworICBBdWRpb1N0cmVhbUlEIHN0cmVhbV9pZDsKKyAgZ2Jvb2xlYW4gcmV2ZXJ0X2Zvcm1hdDsKKyAgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uIG9yaWdpbmFsX2Zvcm1hdCwgc3RyZWFtX2Zvcm1hdDsKKyAgQXVkaW9EZXZpY2VJT1Byb2NJRCBwcm9jSUQ7CisjZW5kaWYKK307CisKK3N0cnVjdCBfR3N0Q29yZUF1ZGlvQ2xhc3MKK3sKKyAgR09iamVjdENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9jb3JlX2F1ZGlvX2dldF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCk7CisKK3ZvaWQgZ3N0X2NvcmVfYXVkaW9faW5pdF9kZWJ1ZyAodm9pZCk7CisKK0dzdENvcmVBdWRpbyAqIGdzdF9jb3JlX2F1ZGlvX25ldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR3N0T2JqZWN0ICpvc3hidWYpOworCitnYm9vbGVhbiBnc3RfY29yZV9hdWRpb19vcGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdzdENvcmVBdWRpbyAqY29yZV9hdWRpbyk7CisKK2dib29sZWFuIGdzdF9jb3JlX2F1ZGlvX2Nsb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR3N0Q29yZUF1ZGlvICpjb3JlX2F1ZGlvKTsKKworZ2Jvb2xlYW4gZ3N0X2NvcmVfYXVkaW9faW5pdGlhbGl6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIChHc3RDb3JlQXVkaW8gKmNvcmVfYXVkaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdENhcHMgKmNhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdib29sZWFuIGlzX3Bhc3N0aHJvdWdoKTsKKwordm9pZCBnc3RfY29yZV9hdWRpb191bmluaXRpYWxpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHc3RDb3JlQXVkaW8gKmNvcmVfYXVkaW8pOworCitnYm9vbGVhbiBnc3RfY29yZV9hdWRpb19zdGFydF9wcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgKEdzdENvcmVBdWRpbyAqY29yZV9hdWRpbyk7CisKK2dib29sZWFuIGdzdF9jb3JlX2F1ZGlvX3BhdXNlX3Byb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAoR3N0Q29yZUF1ZGlvICpjb3JlX2F1ZGlvKTsKKworZ2Jvb2xlYW4gZ3N0X2NvcmVfYXVkaW9fc3RvcF9wcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgIChHc3RDb3JlQXVkaW8gKmNvcmVfYXVkaW8pOworCitnYm9vbGVhbiBnc3RfY29yZV9hdWRpb19nZXRfc2FtcGxlc19hbmRfbGF0ZW5jeSAgICAgICAgICAgICAgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUgcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQgKnNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUgKmxhdGVuY3kpOworCit2b2lkICBnc3RfY29yZV9hdWRpb19zZXRfdm9sdW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdzdENvcmVBdWRpbyAqY29yZV9hdWRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Zsb2F0IHZvbHVtZSk7CisKK2dib29sZWFuIGdzdF9jb3JlX2F1ZGlvX2F1ZGlvX2RldmljZV9pc19zcGRpZl9hdmFpbCAgICAgICAgICAoQXVkaW9EZXZpY2VJRCBkZXZpY2VfaWQpOworCisKK2dib29sZWFuIGdzdF9jb3JlX2F1ZGlvX3NlbGVjdF9kZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbyk7CisKK0dzdENhcHMgKgorZ3N0X2NvcmVfYXVkaW9fcHJvYmVfY2FwcyAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbywgR3N0Q2FwcyAqIGluX2NhcHMpOworCitBdWRpb0NoYW5uZWxMYXlvdXQgKgorZ3N0X2NvcmVfYXVkaW9fZ2V0X2NoYW5uZWxfbGF5b3V0IChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvLCBnYm9vbGVhbiBvdXRlcik7CisKK2dib29sZWFuIGdzdF9jb3JlX2F1ZGlvX3BhcnNlX2NoYW5uZWxfbGF5b3V0IChBdWRpb0NoYW5uZWxMYXlvdXQgKiBsYXlvdXQsCisgICAgZ3VpbnQgKiBjaGFubmVscywgZ3VpbnQ2NCAqIGNoYW5uZWxfbWFzaywgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gKiBwb3MpOworR3N0Q2FwcyAqIGdzdF9jb3JlX2F1ZGlvX2FzYmRfdG9fY2FwcyAoQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uICogYXNiZCwKKyAgICBBdWRpb0NoYW5uZWxMYXlvdXQgKiBsYXlvdXQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfQ09SRV9BVURJT19IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uYyBiL3N5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWQwM2FjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2NvbW1vbi5jCkBAIC0wLDAgKzEsNTUyIEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBGbHVlbmRvIFMuQS4gPHN1cHBvcnRAZmx1ZW5kby5jb20+CisgKiAgIEF1dGhvcnM6IEpvc2VwIFRvcnJhIFZhbGzDqHMgPGpvc2VwQGZsdWVuZG8uY29tPgorICogICAgICAgICAgICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPGFtb3JhbGVzQGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiZ3N0b3N4Y29yZWF1ZGlvY29tbW9uLmgiCisKK3ZvaWQKK2dzdF9jb3JlX2F1ZGlvX3JlbW92ZV9yZW5kZXJfY2FsbGJhY2sgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIEFVUmVuZGVyQ2FsbGJhY2tTdHJ1Y3QgaW5wdXQ7CisgIE9TU3RhdHVzIHN0YXR1czsKKworICAvKiBEZWFjdGl2YXRlIHRoZSByZW5kZXIgY2FsbGJhY2sgYnkgY2FsbGluZyBTZXRSZW5kZXJDYWxsYmFjaworICAgKiB3aXRoIGEgTlVMTCBpbnB1dFByb2MuCisgICAqLworICBpbnB1dC5pbnB1dFByb2MgPSBOVUxMOworICBpbnB1dC5pbnB1dFByb2NSZWZDb24gPSBOVUxMOworCisgIHN0YXR1cyA9IEF1ZGlvVW5pdFNldFByb3BlcnR5IChjb3JlX2F1ZGlvLT5hdWRpb3VuaXQsIGtBdWRpb1VuaXRQcm9wZXJ0eV9TZXRSZW5kZXJDYWxsYmFjaywga0F1ZGlvVW5pdFNjb3BlX0dsb2JhbCwgMCwgICAgICAgIC8qIE4vQSBmb3IgZ2xvYmFsICovCisgICAgICAmaW5wdXQsIHNpemVvZiAoaW5wdXQpKTsKKworICBpZiAoc3RhdHVzKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb3JlX2F1ZGlvLT5vc3hidWYsCisgICAgICAgICJGYWlsZWQgdG8gcmVtb3ZlIHJlbmRlciBjYWxsYmFjayAlZCIsIChpbnQpIHN0YXR1cyk7CisgIH0KKworICAvKiBSZW1vdmUgdGhlIFJlbmRlck5vdGlmeSB0b28gKi8KKyAgc3RhdHVzID0gQXVkaW9Vbml0UmVtb3ZlUmVuZGVyTm90aWZ5IChjb3JlX2F1ZGlvLT5hdWRpb3VuaXQsCisgICAgICAoQVVSZW5kZXJDYWxsYmFjaykgZ3N0X2NvcmVfYXVkaW9fcmVuZGVyX25vdGlmeSwgY29yZV9hdWRpbyk7CisKKyAgaWYgKHN0YXR1cykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29yZV9hdWRpby0+b3N4YnVmLAorICAgICAgICAiRmFpbGVkIHRvIHJlbW92ZSByZW5kZXIgbm90aWZ5IGNhbGxiYWNrICVkIiwgKGludCkgc3RhdHVzKTsKKyAgfQorCisgIC8qIFdlJ3JlIGRlYWN0aXZhdGVkLi4gKi8KKyAgY29yZV9hdWRpby0+aW9fcHJvY19uZWVkc19kZWFjdGl2YXRpb24gPSBGQUxTRTsKKyAgY29yZV9hdWRpby0+aW9fcHJvY19hY3RpdmUgPSBGQUxTRTsKK30KKworT1NTdGF0dXMKK2dzdF9jb3JlX2F1ZGlvX3JlbmRlcl9ub3RpZnkgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8sCisgICAgQXVkaW9Vbml0UmVuZGVyQWN0aW9uRmxhZ3MgKiBpb0FjdGlvbkZsYWdzLAorICAgIGNvbnN0IEF1ZGlvVGltZVN0YW1wICogaW5UaW1lU3RhbXAsCisgICAgdW5zaWduZWQgaW50IGluQnVzTnVtYmVyLAorICAgIHVuc2lnbmVkIGludCBpbk51bWJlckZyYW1lcywgQXVkaW9CdWZmZXJMaXN0ICogaW9EYXRhKQoreworICAvKiBCZWZvcmUgcmVuZGVyaW5nIGEgZnJhbWUsIHdlIGdldCB0aGUgUHJlUmVuZGVyIG5vdGlmaWNhdGlvbi4KKyAgICogSGVyZSwgd2UgZGV0YWNoIHRoZSBSZW5kZXJDYWxsYmFjayBpZiB3ZSd2ZSBiZWVuIHBhdXNlZC4KKyAgICoKKyAgICogVGhpcyBpcyBuZWNlc3NhcnkgKHJhdGhlciB0aGFuIGp1c3QgZGlyZWN0bHkgZGV0YWNoaW5nIGl0KSB0bworICAgKiB3b3JrIGFyb3VuZCBzb21lIHRocmVhZC1zYWZldHkgaXNzdWVzIGluIENvcmVBdWRpbworICAgKi8KKyAgaWYgKCgqaW9BY3Rpb25GbGFncykgJiBrQXVkaW9Vbml0UmVuZGVyQWN0aW9uX1ByZVJlbmRlcikgeworICAgIGlmIChjb3JlX2F1ZGlvLT5pb19wcm9jX25lZWRzX2RlYWN0aXZhdGlvbikgeworICAgICAgZ3N0X2NvcmVfYXVkaW9fcmVtb3ZlX3JlbmRlcl9jYWxsYmFjayAoY29yZV9hdWRpbyk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIG5vRXJyOworfQorCitnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9faW9fcHJvY19zdGFydCAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbykKK3sKKyAgT1NTdGF0dXMgc3RhdHVzOworICBBVVJlbmRlckNhbGxiYWNrU3RydWN0IGlucHV0OworICBBdWRpb1VuaXRQcm9wZXJ0eUlEIGNhbGxiYWNrX3R5cGU7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoY29yZV9hdWRpby0+b3N4YnVmLAorICAgICAgIm9zeCByaW5nIGJ1ZmZlciBzdGFydCBpb3Byb2M6ICVwIGRldmljZV9pZCAlbHUiLAorICAgICAgY29yZV9hdWRpby0+ZWxlbWVudC0+aW9fcHJvYywgKGd1bG9uZykgY29yZV9hdWRpby0+ZGV2aWNlX2lkKTsKKyAgaWYgKCFjb3JlX2F1ZGlvLT5pb19wcm9jX2FjdGl2ZSkgeworICAgIGNhbGxiYWNrX3R5cGUgPSBjb3JlX2F1ZGlvLT5pc19zcmMgPworICAgICAgICBrQXVkaW9PdXRwdXRVbml0UHJvcGVydHlfU2V0SW5wdXRDYWxsYmFjayA6CisgICAgICAgIGtBdWRpb1VuaXRQcm9wZXJ0eV9TZXRSZW5kZXJDYWxsYmFjazsKKworICAgIGlucHV0LmlucHV0UHJvYyA9IChBVVJlbmRlckNhbGxiYWNrKSBjb3JlX2F1ZGlvLT5lbGVtZW50LT5pb19wcm9jOworICAgIGlucHV0LmlucHV0UHJvY1JlZkNvbiA9IGNvcmVfYXVkaW8tPm9zeGJ1ZjsKKworICAgIHN0YXR1cyA9IEF1ZGlvVW5pdFNldFByb3BlcnR5IChjb3JlX2F1ZGlvLT5hdWRpb3VuaXQsIGNhbGxiYWNrX3R5cGUsIGtBdWRpb1VuaXRTY29wZV9HbG9iYWwsIDAsICAgICAvKiBOL0EgZm9yIGdsb2JhbCAqLworICAgICAgICAmaW5wdXQsIHNpemVvZiAoaW5wdXQpKTsKKworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNvcmVfYXVkaW8tPm9zeGJ1ZiwKKyAgICAgICAgICAiQXVkaW9Vbml0U2V0UHJvcGVydHkgZmFpbGVkOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIC8vICMjIyBkb2VzIGl0IG1ha2Ugc2Vuc2UgdG8gZG8gdGhpcyBub3RpZnkgc3R1ZmYgZm9yIGlucHV0IG1vZGU/CisgICAgc3RhdHVzID0gQXVkaW9Vbml0QWRkUmVuZGVyTm90aWZ5IChjb3JlX2F1ZGlvLT5hdWRpb3VuaXQsCisgICAgICAgIChBVVJlbmRlckNhbGxiYWNrKSBnc3RfY29yZV9hdWRpb19yZW5kZXJfbm90aWZ5LCBjb3JlX2F1ZGlvKTsKKworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNvcmVfYXVkaW8tPm9zeGJ1ZiwKKyAgICAgICAgICAiQXVkaW9Vbml0QWRkUmVuZGVyTm90aWZ5IGZhaWxlZCAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGNvcmVfYXVkaW8tPmlvX3Byb2NfYWN0aXZlID0gVFJVRTsKKyAgfQorCisgIGNvcmVfYXVkaW8tPmlvX3Byb2NfbmVlZHNfZGVhY3RpdmF0aW9uID0gRkFMU0U7CisKKyAgc3RhdHVzID0gQXVkaW9PdXRwdXRVbml0U3RhcnQgKGNvcmVfYXVkaW8tPmF1ZGlvdW5pdCk7CisgIGlmIChzdGF0dXMpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChjb3JlX2F1ZGlvLT5vc3hidWYsICJBdWRpb091dHB1dFVuaXRTdGFydCBmYWlsZWQ6ICVkIiwKKyAgICAgICAgKGludCkgc3RhdHVzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitnc3RfY29yZV9hdWRpb19pb19wcm9jX3N0b3AgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIE9TRXJyIHN0YXR1czsKKworICBHU1RfREVCVUdfT0JKRUNUIChjb3JlX2F1ZGlvLT5vc3hidWYsCisgICAgICAib3N4IHJpbmcgYnVmZmVyIHN0b3AgaW9wcm9jOiAlcCBkZXZpY2VfaWQgJWx1IiwKKyAgICAgIGNvcmVfYXVkaW8tPmVsZW1lbnQtPmlvX3Byb2MsIChndWxvbmcpIGNvcmVfYXVkaW8tPmRldmljZV9pZCk7CisKKyAgc3RhdHVzID0gQXVkaW9PdXRwdXRVbml0U3RvcCAoY29yZV9hdWRpby0+YXVkaW91bml0KTsKKyAgaWYgKHN0YXR1cykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29yZV9hdWRpby0+b3N4YnVmLAorICAgICAgICAiQXVkaW9PdXRwdXRVbml0U3RvcCBmYWlsZWQ6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgfQorICAvLyAjIyM6IHdoeSBpcyBpdCBva2F5IHRvIGRpcmVjdGx5IHJlbW92ZSBmcm9tIGhlcmUgYnV0IG5vdCBmcm9tIHBhdXNlKCkgPworICBpZiAoY29yZV9hdWRpby0+aW9fcHJvY19hY3RpdmUpIHsKKyAgICBnc3RfY29yZV9hdWRpb19yZW1vdmVfcmVuZGVyX2NhbGxiYWNrIChjb3JlX2F1ZGlvKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworQXVkaW9CdWZmZXJMaXN0ICoKK2J1ZmZlcl9saXN0X2FsbG9jIChVSW50MzIgY2hhbm5lbHMsIFVJbnQzMiBzaXplLCBnYm9vbGVhbiBpbnRlcmxlYXZlZCkKK3sKKyAgQXVkaW9CdWZmZXJMaXN0ICpsaXN0OworICBnc2l6ZSBsaXN0X3NpemU7CisgIFVJbnQzMiBudW1fYnVmZmVycywgbjsKKworICBudW1fYnVmZmVycyA9IGludGVybGVhdmVkID8gMSA6IGNoYW5uZWxzOworICAvKiBBdWRpb0J1ZmZlckxpc3QgbWVtYmVyIG1CdWZmZXJzIGlzIHZhcmlhYmxlLWxlbmd0aCBhcnJheSAqLworICBsaXN0X3NpemUgPSBHX1NUUlVDVF9PRkZTRVQgKEF1ZGlvQnVmZmVyTGlzdCwgbUJ1ZmZlcnNbbnVtX2J1ZmZlcnNdKTsKKyAgbGlzdCA9IChBdWRpb0J1ZmZlckxpc3QgKikgZ19tYWxsb2MgKGxpc3Rfc2l6ZSk7CisKKyAgbGlzdC0+bU51bWJlckJ1ZmZlcnMgPSBudW1fYnVmZmVyczsKKyAgZm9yIChuID0gMDsgbiA8IG51bV9idWZmZXJzOyArK24pIHsKKyAgICAvKiBTZWUgaHR0cDovL2xpc3RzLmFwcGxlLmNvbS9hcmNoaXZlcy9jb3JlYXVkaW8tYXBpLzIwMTUvRmViL21zZzAwMDI3Lmh0bWwgKi8KKyAgICBsaXN0LT5tQnVmZmVyc1tuXS5tTnVtYmVyQ2hhbm5lbHMgPSBpbnRlcmxlYXZlZCA/IGNoYW5uZWxzIDogMTsKKyAgICAvKiBBdWRpb1VuaXRSZW5kZXIgd2lsbCBrZWVwIG92ZXJ3cml0aW5nIG1EYXRhQnl0ZVNpemUgKi8KKyAgICBsaXN0LT5tQnVmZmVyc1tuXS5tRGF0YUJ5dGVTaXplID0gc2l6ZTsKKyAgICBsaXN0LT5tQnVmZmVyc1tuXS5tRGF0YSA9IGdfbWFsbG9jIChzaXplKTsKKyAgfQorCisgIHJldHVybiBsaXN0OworfQorCit2b2lkCitidWZmZXJfbGlzdF9mcmVlIChBdWRpb0J1ZmZlckxpc3QgKiBsaXN0KQoreworICBVSW50MzIgbjsKKworICBpZiAobGlzdCA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBmb3IgKG4gPSAwOyBuIDwgbGlzdC0+bU51bWJlckJ1ZmZlcnM7ICsrbikgeworICAgIGdfZnJlZSAobGlzdC0+bUJ1ZmZlcnNbbl0ubURhdGEpOworICB9CisKKyAgZ19mcmVlIChsaXN0KTsKK30KKworZ2Jvb2xlYW4KK2dzdF9jb3JlX2F1ZGlvX2JpbmRfZGV2aWNlIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICBPU1N0YXR1cyBzdGF0dXM7CisKKyAgLyogU3BlY2lmeSB3aGljaCBkZXZpY2Ugd2UncmUgdXNpbmcuICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKGNvcmVfYXVkaW8tPm9zeGJ1ZiwgIkJpbmQgQXVkaW9Vbml0IHRvIGRldmljZSAlZCIsCisgICAgICAoaW50KSBjb3JlX2F1ZGlvLT5kZXZpY2VfaWQpOworICBzdGF0dXMgPSBBdWRpb1VuaXRTZXRQcm9wZXJ0eSAoY29yZV9hdWRpby0+YXVkaW91bml0LAorICAgICAga0F1ZGlvT3V0cHV0VW5pdFByb3BlcnR5X0N1cnJlbnREZXZpY2UsIGtBdWRpb1VuaXRTY29wZV9HbG9iYWwsIDAsCisgICAgICAmY29yZV9hdWRpby0+ZGV2aWNlX2lkLCBzaXplb2YgKEF1ZGlvRGV2aWNlSUQpKTsKKyAgaWYgKHN0YXR1cykgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNvcmVfYXVkaW8tPm9zeGJ1ZiwgIkZhaWxlZCBiaW5kaW5nIHRvIGRldmljZTogJWQiLAorICAgICAgICAoaW50KSBzdGF0dXMpOworICAgIGdvdG8gYXVkaW91bml0X2Vycm9yOworICB9CisgIHJldHVybiBUUlVFOworCithdWRpb3VuaXRfZXJyb3I6CisgIGlmIChjb3JlX2F1ZGlvLT5yZWNCdWZmZXJMaXN0KSB7CisgICAgYnVmZmVyX2xpc3RfZnJlZSAoY29yZV9hdWRpby0+cmVjQnVmZmVyTGlzdCk7CisgICAgY29yZV9hdWRpby0+cmVjQnVmZmVyTGlzdCA9IE5VTEw7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK19jb3JlX2F1ZGlvX3NldF9wcm9wZXJ0eSAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbywgQXVkaW9Vbml0UHJvcGVydHlJRCBpbklELAorICAgIHZvaWQgKmluRGF0YSwgVUludDMyIGluRGF0YVNpemUpCit7CisgIE9TU3RhdHVzIHN0YXR1czsKKyAgQXVkaW9Vbml0U2NvcGUgc2NvcGU7CisgIEF1ZGlvVW5pdEVsZW1lbnQgZWxlbWVudDsKKworICBzY29wZSA9IENPUkVfQVVESU9fSU5ORVJfU0NPUEUgKGNvcmVfYXVkaW8pOworICBlbGVtZW50ID0gQ09SRV9BVURJT19FTEVNRU5UIChjb3JlX2F1ZGlvKTsKKworICBzdGF0dXMgPQorICAgICAgQXVkaW9Vbml0U2V0UHJvcGVydHkgKGNvcmVfYXVkaW8tPmF1ZGlvdW5pdCwgaW5JRCwgc2NvcGUsIGVsZW1lbnQsIGluRGF0YSwKKyAgICAgIGluRGF0YVNpemUpOworCisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvcmVfYXVkaW8tPm9zeGJ1ZiwKKyAgICAgICAgIkZhaWxlZCB0byBzZXQgQXVkaW8gVW5pdCBwcm9wZXJ0eTogJWQiLCAoaW50KSBzdGF0dXMpOworICAgIHJldHVybiBGQUxTRTs7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyogVGhlIEF1ZGlvVW5pdCBtdXN0IGJlIHVuaW5pdGlhbGl6ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyAqLworZ2Jvb2xlYW4KK2dzdF9jb3JlX2F1ZGlvX3NldF9jaGFubmVsX2xheW91dCAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbywKKyAgICBnaW50IGNoYW5uZWxzLCBHc3RDYXBzICogY2FwcykKK3sKKyAgQXVkaW9DaGFubmVsTGF5b3V0ICpsYXlvdXQgPSBOVUxMOworICBnYm9vbGVhbiByZXQ7CisgIGdzaXplIGxheW91dFNpemU7CisgIGdpbnQgaTsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHBvc2l0aW9uc1tHU1RfT1NYX0FVRElPX01BWF9DSEFOTkVMXTsKKyAgZ3VpbnQ2NCBjaGFubmVsX21hc2s7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNoYW5uZWxzIDw9IEdTVF9PU1hfQVVESU9fTUFYX0NIQU5ORUwsIEZBTFNFKTsKKworICAvKiBEZXRlcm1pbmUgdGhlIGNoYW5uZWwgcG9zaXRpb25zICovCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBjaGFubmVsX21hc2sgPSAwOworICBnc3Rfc3RydWN0dXJlX2dldCAoc3RydWN0dXJlLCAiY2hhbm5lbC1tYXNrIiwgR1NUX1RZUEVfQklUTUFTSywgJmNoYW5uZWxfbWFzaywKKyAgICAgIE5VTEwpOworCisgIGlmIChjaGFubmVsX21hc2sgIT0gMCkKKyAgICBnc3RfYXVkaW9fY2hhbm5lbF9wb3NpdGlvbnNfZnJvbV9tYXNrIChjaGFubmVscywgY2hhbm5lbF9tYXNrLCBwb3NpdGlvbnMpOworCisgIC8qIEF1ZGlvQ2hhbm5lbExheW91dCBtZW1iZXIgbUNoYW5uZWxEZXNjcmlwdGlvbnMgaXMgdmFyaWFibGUtbGVuZ3RoIGFycmF5ICovCisgIGxheW91dFNpemUgPQorICAgICAgR19TVFJVQ1RfT0ZGU0VUIChBdWRpb0NoYW5uZWxMYXlvdXQsIG1DaGFubmVsRGVzY3JpcHRpb25zW2NoYW5uZWxzXSk7CisgIGxheW91dCA9IGdfbWFsbG9jIChsYXlvdXRTaXplKTsKKworICAvKiBGaWxsIG91dCB0aGUgQXVkaW9DaGFubmVsTGF5b3V0ICovCisgIGxheW91dC0+bUNoYW5uZWxMYXlvdXRUYWcgPSBrQXVkaW9DaGFubmVsTGF5b3V0VGFnX1VzZUNoYW5uZWxEZXNjcmlwdGlvbnM7CisgIGxheW91dC0+bUNoYW5uZWxCaXRtYXAgPSAwOyAgIC8qIE5vdCB1c2VkICovCisgIGxheW91dC0+bU51bWJlckNoYW5uZWxEZXNjcmlwdGlvbnMgPSBjaGFubmVsczsKKyAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKKyAgICBpZiAoY2hhbm5lbF9tYXNrICE9IDApIHsKKyAgICAgIGxheW91dC0+bUNoYW5uZWxEZXNjcmlwdGlvbnNbaV0ubUNoYW5uZWxMYWJlbCA9CisgICAgICAgICAgZ3N0X2F1ZGlvX2NoYW5uZWxfcG9zaXRpb25fdG9fY29yZV9hdWRpbyAocG9zaXRpb25zW2ldLCBpKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogRGlzY3JldGUgY2hhbm5lbCBudW1iZXJzIGFyZSBPUmVkIGludG8gdGhpcyAqLworICAgICAgbGF5b3V0LT5tQ2hhbm5lbERlc2NyaXB0aW9uc1tpXS5tQ2hhbm5lbExhYmVsID0KKyAgICAgICAgICBrQXVkaW9DaGFubmVsTGFiZWxfRGlzY3JldGVfMCB8IGk7CisgICAgfQorCisgICAgLyogT3RoZXJzIHVudXNlZCAqLworICAgIGxheW91dC0+bUNoYW5uZWxEZXNjcmlwdGlvbnNbaV0ubUNoYW5uZWxGbGFncyA9IGtBdWRpb0NoYW5uZWxGbGFnc19BbGxPZmY7CisgICAgbGF5b3V0LT5tQ2hhbm5lbERlc2NyaXB0aW9uc1tpXS5tQ29vcmRpbmF0ZXNbMF0gPSAwLmY7CisgICAgbGF5b3V0LT5tQ2hhbm5lbERlc2NyaXB0aW9uc1tpXS5tQ29vcmRpbmF0ZXNbMV0gPSAwLmY7CisgICAgbGF5b3V0LT5tQ2hhbm5lbERlc2NyaXB0aW9uc1tpXS5tQ29vcmRpbmF0ZXNbMl0gPSAwLmY7CisgIH0KKworICAvKiBTZXRzIEdTdHJlYW1lci1vcmRlcmVkIGNoYW5uZWwgbGF5b3V0IG9uIHRoZSBpbm5lciBzY29wZS4KKyAgICogUmVvcmRlcmluZyBiZXR3ZWVuIHRoZSBpbm5lciBzY29wZSBhbmQgb3V0ZXIgc2NvcGUgaXMgaGFuZGxlZAorICAgKiBieSB0aGUgQXVkaW8gVW5pdCBpdHNlbGYuICovCisgIHJldCA9IF9jb3JlX2F1ZGlvX3NldF9wcm9wZXJ0eSAoY29yZV9hdWRpbywKKyAgICAgIGtBdWRpb1VuaXRQcm9wZXJ0eV9BdWRpb0NoYW5uZWxMYXlvdXQsIGxheW91dCwgbGF5b3V0U2l6ZSk7CisKKyAgZ19mcmVlIChsYXlvdXQpOworICByZXR1cm4gcmV0OworfQorCisvKiBUaGUgQXVkaW9Vbml0IG11c3QgYmUgdW5pbml0aWFsaXplZCBiZWZvcmUgY2FsbGluZyB0aGlzICovCitnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9fc2V0X2Zvcm1hdCAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbywKKyAgICBBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24gZm9ybWF0KQoreworICBHU1RfREVCVUdfT0JKRUNUIChjb3JlX2F1ZGlvLT5vc3hidWYsICJTZXR0aW5nIGZvcm1hdCBmb3IgQXVkaW9Vbml0Iik7CisKKyAgcmV0dXJuIF9jb3JlX2F1ZGlvX3NldF9wcm9wZXJ0eSAoY29yZV9hdWRpbywga0F1ZGlvVW5pdFByb3BlcnR5X1N0cmVhbUZvcm1hdCwKKyAgICAgICZmb3JtYXQsIHNpemVvZiAoQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uKSk7Cit9CisKK2dib29sZWFuCitnc3RfY29yZV9hdWRpb19vcGVuX2RldmljZSAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbywgT1NUeXBlIHN1Yl90eXBlLAorICAgIGNvbnN0IGdjaGFyICogYWRlc2MpCit7CisgIEF1ZGlvQ29tcG9uZW50RGVzY3JpcHRpb24gZGVzYzsKKyAgQXVkaW9Db21wb25lbnQgY29tcDsKKyAgT1NTdGF0dXMgc3RhdHVzOworICBBdWRpb1VuaXQgdW5pdDsKKyAgVUludDMyIGVuYWJsZUlPOworCisgIGRlc2MuY29tcG9uZW50VHlwZSA9IGtBdWRpb1VuaXRUeXBlX091dHB1dDsKKyAgZGVzYy5jb21wb25lbnRTdWJUeXBlID0gc3ViX3R5cGU7CisgIGRlc2MuY29tcG9uZW50TWFudWZhY3R1cmVyID0ga0F1ZGlvVW5pdE1hbnVmYWN0dXJlcl9BcHBsZTsKKyAgZGVzYy5jb21wb25lbnRGbGFncyA9IDA7CisgIGRlc2MuY29tcG9uZW50RmxhZ3NNYXNrID0gMDsKKworICBjb21wID0gQXVkaW9Db21wb25lbnRGaW5kTmV4dCAoTlVMTCwgJmRlc2MpOworCisgIGlmIChjb21wID09IE5VTEwpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvcmVfYXVkaW8tPm9zeGJ1ZiwgIkNvdWxkbid0IGZpbmQgJXMgY29tcG9uZW50IiwKKyAgICAgICAgYWRlc2MpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHN0YXR1cyA9IEF1ZGlvQ29tcG9uZW50SW5zdGFuY2VOZXcgKGNvbXAsICZ1bml0KTsKKworICBpZiAoc3RhdHVzKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoY29yZV9hdWRpby0+b3N4YnVmLCAiQ291bGRuJ3Qgb3BlbiAlcyBjb21wb25lbnQgJWQiLAorICAgICAgICBhZGVzYywgKGludCkgc3RhdHVzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoY29yZV9hdWRpby0+aXNfc3JjKSB7CisgICAgLyogZW5hYmxlIGlucHV0ICovCisgICAgZW5hYmxlSU8gPSAxOworICAgIHN0YXR1cyA9IEF1ZGlvVW5pdFNldFByb3BlcnR5ICh1bml0LCBrQXVkaW9PdXRwdXRVbml0UHJvcGVydHlfRW5hYmxlSU8sIGtBdWRpb1VuaXRTY29wZV9JbnB1dCwgMSwgICAvKiAxID0gaW5wdXQgZWxlbWVudCAqLworICAgICAgICAmZW5hYmxlSU8sIHNpemVvZiAoZW5hYmxlSU8pKTsKKworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgIEF1ZGlvQ29tcG9uZW50SW5zdGFuY2VEaXNwb3NlICh1bml0KTsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29yZV9hdWRpby0+b3N4YnVmLCAiRmFpbGVkIHRvIGVuYWJsZSBpbnB1dDogJWQiLAorICAgICAgICAgIChpbnQpIHN0YXR1cyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLyogZGlzYWJsZSBvdXRwdXQgKi8KKyAgICBlbmFibGVJTyA9IDA7CisgICAgc3RhdHVzID0gQXVkaW9Vbml0U2V0UHJvcGVydHkgKHVuaXQsIGtBdWRpb091dHB1dFVuaXRQcm9wZXJ0eV9FbmFibGVJTywga0F1ZGlvVW5pdFNjb3BlX091dHB1dCwgMCwgIC8qIDAgPSBvdXRwdXQgZWxlbWVudCAqLworICAgICAgICAmZW5hYmxlSU8sIHNpemVvZiAoZW5hYmxlSU8pKTsKKworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgIEF1ZGlvQ29tcG9uZW50SW5zdGFuY2VEaXNwb3NlICh1bml0KTsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29yZV9hdWRpby0+b3N4YnVmLCAiRmFpbGVkIHRvIGRpc2FibGUgb3V0cHV0OiAlZCIsCisgICAgICAgICAgKGludCkgc3RhdHVzKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChjb3JlX2F1ZGlvLT5vc3hidWYsICJDcmVhdGVkICVzIEF1ZGlvVW5pdDogJXAiLCBhZGVzYywKKyAgICAgIHVuaXQpOworICBjb3JlX2F1ZGlvLT5hdWRpb3VuaXQgPSB1bml0OworICByZXR1cm4gVFJVRTsKK30KKworQXVkaW9DaGFubmVsTGFiZWwKK2dzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uX3RvX2NvcmVfYXVkaW8gKEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uCisgICAgcG9zaXRpb24sIGludCBjaGFubmVsKQoreworICBzd2l0Y2ggKHBvc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUOgorICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYWJlbF9MZWZ0OworICAgIGNhc2UgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQ6CisgICAgICByZXR1cm4ga0F1ZGlvQ2hhbm5lbExhYmVsX1JpZ2h0OworICAgIGNhc2UgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9DRU5URVI6CisgICAgICByZXR1cm4ga0F1ZGlvQ2hhbm5lbExhYmVsX0NlbnRlclN1cnJvdW5kOworICAgIGNhc2UgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZUOgorICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYWJlbF9MZWZ0U3Vycm91bmQ7CisgICAgY2FzZSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX1JJR0hUOgorICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYWJlbF9SaWdodFN1cnJvdW5kOworICAgIGNhc2UgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMToKKyAgICAgIHJldHVybiBrQXVkaW9DaGFubmVsTGFiZWxfTEZFU2NyZWVuOworICAgIGNhc2UgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSOgorICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYWJlbF9DZW50ZXI7CisgICAgY2FzZSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQ6CisgICAgICByZXR1cm4ga0F1ZGlvQ2hhbm5lbExhYmVsX0xlZnRTdXJyb3VuZERpcmVjdDsKKyAgICBjYXNlIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1NJREVfUklHSFQ6CisgICAgICByZXR1cm4ga0F1ZGlvQ2hhbm5lbExhYmVsX1JpZ2h0U3Vycm91bmREaXJlY3Q7CisgICAgY2FzZSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUX09GX0NFTlRFUjoKKyAgICAgIHJldHVybiBrQXVkaW9DaGFubmVsTGFiZWxfTGVmdENlbnRlcjsKKyAgICBjYXNlIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUX09GX0NFTlRFUjoKKyAgICAgIHJldHVybiBrQXVkaW9DaGFubmVsTGFiZWxfUmlnaHRDZW50ZXI7CisgICAgY2FzZSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9MRUZUOgorICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYWJlbF9Ub3BCYWNrTGVmdDsKKyAgICBjYXNlIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX0NFTlRFUjoKKyAgICAgIHJldHVybiBrQXVkaW9DaGFubmVsTGFiZWxfVG9wQmFja0NlbnRlcjsKKyAgICBjYXNlIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX1JJR0hUOgorICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYWJlbF9Ub3BCYWNrUmlnaHQ7CisgICAgY2FzZSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9XSURFX0xFRlQ6CisgICAgICByZXR1cm4ga0F1ZGlvQ2hhbm5lbExhYmVsX0xlZnRXaWRlOworICAgIGNhc2UgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fV0lERV9SSUdIVDoKKyAgICAgIHJldHVybiBrQXVkaW9DaGFubmVsTGFiZWxfUmlnaHRXaWRlOworICAgIGNhc2UgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMjoKKyAgICAgIHJldHVybiBrQXVkaW9DaGFubmVsTGFiZWxfTEZFMjsKKyAgICBjYXNlIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9MRUZUOgorICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYWJlbF9WZXJ0aWNhbEhlaWdodExlZnQ7CisgICAgY2FzZSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfRlJPTlRfUklHSFQ6CisgICAgICByZXR1cm4ga0F1ZGlvQ2hhbm5lbExhYmVsX1ZlcnRpY2FsSGVpZ2h0UmlnaHQ7CisgICAgY2FzZSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfRlJPTlRfQ0VOVEVSOgorICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYWJlbF9WZXJ0aWNhbEhlaWdodENlbnRlcjsKKworICAgICAgLyogU3BlY2lhbCBwb3NpdGlvbiB2YWx1ZXMgKi8KKyAgICBjYXNlIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX05PTkU6CisgICAgICByZXR1cm4ga0F1ZGlvQ2hhbm5lbExhYmVsX0Rpc2NyZXRlXzAgfCBjaGFubmVsOworICAgIGNhc2UgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTU9OTzoKKyAgICAgIHJldHVybiBrQXVkaW9DaGFubmVsTGFiZWxfTW9ubzsKKworICAgICAgLyogRm9sbG93aW5nIHBvc2l0aW9ucyBhcmUgdW5tYXBwZWQgLS0KKyAgICAgICAqIGkuZS4gbWFwcGVkIHRvIGtBdWRpb0NoYW5uZWxMYWJlbF9Vbmtub3duOiAqLworICAgIGNhc2UgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX0NFTlRFUjoKKyAgICBjYXNlIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9TSURFX0xFRlQ6CisgICAgY2FzZSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfU0lERV9SSUdIVDoKKyAgICBjYXNlIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0JPVFRPTV9GUk9OVF9DRU5URVI6CisgICAgY2FzZSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9CT1RUT01fRlJPTlRfTEVGVDoKKyAgICBjYXNlIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0JPVFRPTV9GUk9OVF9SSUdIVDoKKyAgICBjYXNlIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1NVUlJPVU5EX0xFRlQ6CisgICAgY2FzZSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TVVJST1VORF9SSUdIVDoKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYWJlbF9Vbmtub3duOworICB9Cit9CisKKy8qIFBlcmZvcm1zIGEgYmVzdC1lZmZvcnQgY29udmVyc2lvbi4gJ2NoYW5uZWwnIGlzIHVzZWQgZm9yIHdhcm5pbmdzIG9ubHkuICovCitHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbgorZ3N0X2NvcmVfYXVkaW9fY2hhbm5lbF9sYWJlbF90b19nc3QgKEF1ZGlvQ2hhbm5lbExhYmVsIGxhYmVsLAorICAgIGludCBjaGFubmVsLCBnYm9vbGVhbiB3YXJuKQoreworICBzd2l0Y2ggKGxhYmVsKSB7CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfTGVmdDoKKyAgICAgIHJldHVybiBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUOworICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX1JpZ2h0OgorICAgICAgcmV0dXJuIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUOworICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX0NlbnRlcjoKKyAgICAgIHJldHVybiBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVI7CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfTEZFU2NyZWVuOgorICAgICAgcmV0dXJuIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0xGRTE7CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfTGVmdFN1cnJvdW5kOgorICAgICAgcmV0dXJuIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVDsKKyAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9SaWdodFN1cnJvdW5kOgorICAgICAgcmV0dXJuIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfUklHSFQ7CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfTGVmdFN1cnJvdW5kRGlyZWN0OgorICAgICAgcmV0dXJuIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1NJREVfTEVGVDsKKyAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9SaWdodFN1cnJvdW5kRGlyZWN0OgorICAgICAgcmV0dXJuIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1NJREVfUklHSFQ7CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfQ2VudGVyU3Vycm91bmQ6CisgICAgICByZXR1cm4gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9DRU5URVI7CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfTGVmdENlbnRlcjoKKyAgICAgIHJldHVybiBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUX09GX0NFTlRFUjsKKyAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9SaWdodENlbnRlcjoKKyAgICAgIHJldHVybiBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVF9PRl9DRU5URVI7CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfVG9wQmFja0xlZnQ6CisgICAgICByZXR1cm4gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX1JFQVJfTEVGVDsKKyAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9Ub3BCYWNrQ2VudGVyOgorICAgICAgcmV0dXJuIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX0NFTlRFUjsKKyAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9Ub3BCYWNrUmlnaHQ6CisgICAgICByZXR1cm4gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX1JFQVJfUklHSFQ7CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfTGVmdFdpZGU6CisgICAgICByZXR1cm4gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fV0lERV9MRUZUOworICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX1JpZ2h0V2lkZToKKyAgICAgIHJldHVybiBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9XSURFX1JJR0hUOworICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX0xGRTI6CisgICAgICByZXR1cm4gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMjsKKyAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9WZXJ0aWNhbEhlaWdodExlZnQ6CisgICAgICByZXR1cm4gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX0xFRlQ7CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfVmVydGljYWxIZWlnaHRSaWdodDoKKyAgICAgIHJldHVybiBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfRlJPTlRfUklHSFQ7CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfVmVydGljYWxIZWlnaHRDZW50ZXI6CisgICAgICByZXR1cm4gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX0NFTlRFUjsKKworICAgICAgLyogU3BlY2lhbCBwb3NpdGlvbiB2YWx1ZXMgKi8KKworICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX01vbm86CisgICAgICAvKiBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9NT05PIGlzIG9ubHkgZm9yIDEtY2hhbm5lbCBsYXlvdXRzICovCisgICAgICByZXR1cm4gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fSU5WQUxJRDsKKyAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9EaXNjcmV0ZToKKyAgICAgIHJldHVybiBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FOworCisgICAgICAvKgorICAgICAgICAgRm9sbG93aW5nIGxhYmVscyBhcmUgdW5tYXBwZWQgLS0KKyAgICAgICAgIGkuZS4gbWFwcGVkIHRvIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0lOVkFMSUQ6CisgICAgICAgKi8KKyAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9SZWFyU3Vycm91bmRMZWZ0OgorICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX1JlYXJTdXJyb3VuZFJpZ2h0OgorICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX1RvcENlbnRlclN1cnJvdW5kOgorICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX0xlZnRUb3RhbDoKKyAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9SaWdodFRvdGFsOgorICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX0hlYXJpbmdJbXBhaXJlZDoKKyAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9OYXJyYXRpb246CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfRGlhbG9nQ2VudHJpY01peDoKKyAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9DZW50ZXJTdXJyb3VuZERpcmVjdDoKKyAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9IYXB0aWM6CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChsYWJlbCA+PiAxNiAhPSAwKSB7ICAgLyoga0F1ZGlvQ2hhbm5lbExhYmVsX0Rpc2NyZXRlX04gKi8KKyAgICAgICAgLyogbm8gd2F5IHRvIHN0b3JlIGRpc2NyZXRlIGNoYW5uZWwgb3JkZXIgKi8KKyAgICAgICAgaWYgKHdhcm4pCisgICAgICAgICAgR1NUX1dBUk5JTkcKKyAgICAgICAgICAgICAgKCJDb3JlIEF1ZGlvIGNoYW5uZWwgJXUgbGFiZWxlZCBrQXVkaW9DaGFubmVsTGFiZWxfRGlzY3JldGVfJXUgLS0gZGlzY3JldGUgb3JkZXIgd2lsbCBiZSBsb3N0IiwKKyAgICAgICAgICAgICAgY2hhbm5lbCwgKCh1bnNpZ25lZCBpbnQpIGxhYmVsKSAmIDB4RkZGRik7CisgICAgICAgIHJldHVybiBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHdhcm4pCisgICAgICAgICAgR1NUX1dBUk5JTkcKKyAgICAgICAgICAgICAgKCJDb3JlIEF1ZGlvIGNoYW5uZWwgJXUgaGFzIHVuc3VwcG9ydGVkIGxhYmVsICVkIGFuZCB3aWxsIGJlIHNraXBwZWQiLAorICAgICAgICAgICAgICBjaGFubmVsLCAoaW50KSBsYWJlbCk7CisgICAgICAgIHJldHVybiBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9JTlZBTElEOworICAgICAgfQorICB9Cit9CisKK3ZvaWQKK2dzdF9jb3JlX2F1ZGlvX2R1bXBfY2hhbm5lbF9sYXlvdXQgKEF1ZGlvQ2hhbm5lbExheW91dCAqIGNoYW5uZWxfbGF5b3V0KQoreworICBVSW50MzIgaTsKKworICBHU1RfREVCVUcgKCJtQ2hhbm5lbExheW91dFRhZzogMHglbHgiLAorICAgICAgKHVuc2lnbmVkIGxvbmcpIGNoYW5uZWxfbGF5b3V0LT5tQ2hhbm5lbExheW91dFRhZyk7CisgIEdTVF9ERUJVRyAoIm1DaGFubmVsQml0bWFwOiAweCVseCIsCisgICAgICAodW5zaWduZWQgbG9uZykgY2hhbm5lbF9sYXlvdXQtPm1DaGFubmVsQml0bWFwKTsKKyAgR1NUX0RFQlVHICgibU51bWJlckNoYW5uZWxEZXNjcmlwdGlvbnM6ICVsdSIsCisgICAgICAodW5zaWduZWQgbG9uZykgY2hhbm5lbF9sYXlvdXQtPm1OdW1iZXJDaGFubmVsRGVzY3JpcHRpb25zKTsKKyAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxfbGF5b3V0LT5tTnVtYmVyQ2hhbm5lbERlc2NyaXB0aW9uczsgaSsrKSB7CisgICAgQXVkaW9DaGFubmVsRGVzY3JpcHRpb24gKmNoYW5uZWxfZGVzYyA9CisgICAgICAgICZjaGFubmVsX2xheW91dC0+bUNoYW5uZWxEZXNjcmlwdGlvbnNbaV07CisgICAgR1NUX0RFQlVHICgiICBtQ2hhbm5lbExhYmVsOiAweCVseCBtQ2hhbm5lbEZsYWdzOiAweCVseCAiCisgICAgICAgICJtQ29vcmRpbmF0ZXNbMF06ICVmIG1Db29yZGluYXRlc1sxXTogJWYgIgorICAgICAgICAibUNvb3JkaW5hdGVzWzJdOiAlZiIsCisgICAgICAgICh1bnNpZ25lZCBsb25nKSBjaGFubmVsX2Rlc2MtPm1DaGFubmVsTGFiZWwsCisgICAgICAgICh1bnNpZ25lZCBsb25nKSBjaGFubmVsX2Rlc2MtPm1DaGFubmVsRmxhZ3MsCisgICAgICAgIGNoYW5uZWxfZGVzYy0+bUNvb3JkaW5hdGVzWzBdLCBjaGFubmVsX2Rlc2MtPm1Db29yZGluYXRlc1sxXSwKKyAgICAgICAgY2hhbm5lbF9kZXNjLT5tQ29vcmRpbmF0ZXNbMl0pOworICB9Cit9CmRpZmYgLS1naXQgYS9zeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvY29tbW9uLmggYi9zeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ2MDJhNgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uaApAQCAtMCwwICsxLDY2IEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBGbHVlbmRvIFMuQS4gPHN1cHBvcnRAZmx1ZW5kby5jb20+CisgKiAgIEF1dGhvcnM6IEpvc2VwIFRvcnJhIFZhbGzDqHMgPGpvc2VwQGZsdWVuZG8uY29tPgorICogICAgICAgICAgICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPGFtb3JhbGVzQGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiZ3N0b3N4Y29yZWF1ZGlvLmgiCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLWNoYW5uZWxzLmg+CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEdNdXRleCBsb2NrOworICBHQ29uZCBjb25kOworfSBQcm9wZXJ0eU11dGV4OworCitnYm9vbGVhbiBnc3RfY29yZV9hdWRpb19iaW5kX2RldmljZSAgICAgICAgICAgICAgICAgICAgICAgKEdzdENvcmVBdWRpbyAqY29yZV9hdWRpbyk7CisKK3ZvaWQgZ3N0X2NvcmVfYXVkaW9fZHVtcF9jaGFubmVsX2xheW91dCAgICAgICAgICAgICAgICAgICAoQXVkaW9DaGFubmVsTGF5b3V0ICogY2hhbm5lbF9sYXlvdXQpOworCit2b2lkIGdzdF9jb3JlX2F1ZGlvX3JlbW92ZV9yZW5kZXJfY2FsbGJhY2sgICAgICAgICAgICAgICAgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pOworCitnYm9vbGVhbiBnc3RfY29yZV9hdWRpb19pb19wcm9jX3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pOworCitnYm9vbGVhbiBnc3RfY29yZV9hdWRpb19pb19wcm9jX3N0b3AgICAgICAgICAgICAgICAgICAgICAgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pOworCitBdWRpb0J1ZmZlckxpc3QgKiBidWZmZXJfbGlzdF9hbGxvYyAgICAgICAgICAgICAgICAgICAgICAgKFVJbnQzMiBjaGFubmVscywgVUludDMyIHNpemUsIGdib29sZWFuIGludGVybGVhdmVkKTsKKwordm9pZCBidWZmZXJfbGlzdF9mcmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBdWRpb0J1ZmZlckxpc3QgKiBsaXN0KTsKKworZ2Jvb2xlYW4gZ3N0X2NvcmVfYXVkaW9fc2V0X2Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24gZm9ybWF0KTsKKworZ2Jvb2xlYW4gZ3N0X2NvcmVfYXVkaW9fc2V0X2NoYW5uZWxfbGF5b3V0ICAgICAgICAgICAgICAgIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50IGNoYW5uZWxzLCBHc3RDYXBzICogY2Fwcyk7CisKK2dib29sZWFuIGdzdF9jb3JlX2F1ZGlvX29wZW5fZGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAoR3N0Q29yZUF1ZGlvICpjb3JlX2F1ZGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPU1R5cGUgc3ViX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICphZGVzYyk7CisKK09TU3RhdHVzIGdzdF9jb3JlX2F1ZGlvX3JlbmRlcl9ub3RpZnkgICAgICAgICAgICAgICAgICAgICAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Vbml0UmVuZGVyQWN0aW9uRmxhZ3MgKiBpb0FjdGlvbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCAqIGluVGltZVN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaW5CdXNOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbk51bWJlckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJMaXN0ICogaW9EYXRhKTsKKworQXVkaW9DaGFubmVsTGFiZWwgZ3N0X2F1ZGlvX2NoYW5uZWxfcG9zaXRpb25fdG9fY29yZV9hdWRpbyAoR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zaXRpb24sIGludCBjaGFubmVsKTsKKworR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gZ3N0X2NvcmVfYXVkaW9fY2hhbm5lbF9sYWJlbF90b19nc3QgKEF1ZGlvQ2hhbm5lbExhYmVsIGxhYmVsLCBpbnQgY2hhbm5lbCwgZ2Jvb2xlYW4gd2Fybik7CmRpZmYgLS1naXQgYS9zeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvaGFsLmMgYi9zeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvaGFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUwNWMyOQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9oYWwuYwpAQCAtMCwwICsxLDEyODcgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIEZsdWVuZG8gUy5BLiA8c3VwcG9ydEBmbHVlbmRvLmNvbT4KKyAqICAgQXV0aG9yczogSm9zZXAgVG9ycmEgVmFsbMOocyA8am9zZXBAZmx1ZW5kby5jb20+CisgKiAgICAgICAgICAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8YW1vcmFsZXNAZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4gICAgICAgICAgICAgLyogZm9yIGdldHBpZCAqLworI2luY2x1ZGUgImdzdG9zeGF1ZGlvc2luay5oIgorCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitfYXVkaW9fc3lzdGVtX3NldF9ydW5sb29wIChDRlJ1bkxvb3BSZWYgcnVuTG9vcCkKK3sKKyAgT1NTdGF0dXMgc3RhdHVzID0gbm9FcnI7CisKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3MgcnVubG9vcEFkZHJlc3MgPSB7CisgICAga0F1ZGlvSGFyZHdhcmVQcm9wZXJ0eVJ1bkxvb3AsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlTY29wZUdsb2JhbCwKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIKKyAgfTsKKworICBzdGF0dXMgPSBBdWRpb09iamVjdFNldFByb3BlcnR5RGF0YSAoa0F1ZGlvT2JqZWN0U3lzdGVtT2JqZWN0LAorICAgICAgJnJ1bmxvb3BBZGRyZXNzLCAwLCBOVUxMLCBzaXplb2YgKENGUnVuTG9vcFJlZiksICZydW5Mb29wKTsKKyAgaWYgKHN0YXR1cyA9PSBub0VycikgeworICAgIHJlcyA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgR1NUX0VSUk9SICgiZmFpbGVkIHRvIHNldCBydW5sb29wIHRvICVwOiAlZCIsIHJ1bkxvb3AsIChpbnQpIHN0YXR1cyk7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW5saW5lIEF1ZGlvRGV2aWNlSUQKK19hdWRpb19zeXN0ZW1fZ2V0X2RlZmF1bHRfZGV2aWNlIChnYm9vbGVhbiBvdXRwdXQpCit7CisgIE9TU3RhdHVzIHN0YXR1cyA9IG5vRXJyOworICBVSW50MzIgcHJvcGVydHlTaXplID0gc2l6ZW9mIChBdWRpb0RldmljZUlEKTsKKyAgQXVkaW9EZXZpY2VJRCBkZXZpY2VfaWQgPSBrQXVkaW9EZXZpY2VVbmtub3duOworICBBdWRpb09iamVjdFByb3BlcnR5U2VsZWN0b3IgcHJvcF9zZWxlY3RvcjsKKworICBwcm9wX3NlbGVjdG9yID0gb3V0cHV0ID8ga0F1ZGlvSGFyZHdhcmVQcm9wZXJ0eURlZmF1bHRPdXRwdXREZXZpY2UgOgorICAgICAga0F1ZGlvSGFyZHdhcmVQcm9wZXJ0eURlZmF1bHRJbnB1dERldmljZTsKKworICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBkZWZhdWx0RGV2aWNlQWRkcmVzcyA9IHsKKyAgICBwcm9wX3NlbGVjdG9yLAorICAgIGtBdWRpb09iamVjdFByb3BlcnR5U2NvcGVHbG9iYWwsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyCisgIH07CisKKyAgc3RhdHVzID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGEgKGtBdWRpb09iamVjdFN5c3RlbU9iamVjdCwKKyAgICAgICZkZWZhdWx0RGV2aWNlQWRkcmVzcywgMCwgTlVMTCwgJnByb3BlcnR5U2l6ZSwgJmRldmljZV9pZCk7CisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICBHU1RfRVJST1IgKCJmYWlsZWQgZ2V0dGluZyBkZWZhdWx0IG91dHB1dCBkZXZpY2U6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgfQorCisgIEdTVF9ERUJVRyAoIkRlZmF1bHQgZGV2aWNlIGlkOiAldSIsICh1bnNpZ25lZCkgZGV2aWNlX2lkKTsKKworICByZXR1cm4gZGV2aWNlX2lkOworfQorCitzdGF0aWMgaW5saW5lIEF1ZGlvRGV2aWNlSUQgKgorX2F1ZGlvX3N5c3RlbV9nZXRfZGV2aWNlcyAoZ2ludCAqIG5kZXZpY2VzKQoreworICBPU1N0YXR1cyBzdGF0dXMgPSBub0VycjsKKyAgVUludDMyIHByb3BlcnR5U2l6ZSA9IDA7CisgIEF1ZGlvRGV2aWNlSUQgKmRldmljZXMgPSBOVUxMOworCisgIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIGF1ZGlvRGV2aWNlc0FkZHJlc3MgPSB7CisgICAga0F1ZGlvSGFyZHdhcmVQcm9wZXJ0eURldmljZXMsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlTY29wZUdsb2JhbCwKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIKKyAgfTsKKworICBzdGF0dXMgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YVNpemUgKGtBdWRpb09iamVjdFN5c3RlbU9iamVjdCwKKyAgICAgICZhdWRpb0RldmljZXNBZGRyZXNzLCAwLCBOVUxMLCAmcHJvcGVydHlTaXplKTsKKyAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgIEdTVF9XQVJOSU5HICgiZmFpbGVkIGdldHRpbmcgbnVtYmVyIG9mIGRldmljZXM6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgICpuZGV2aWNlcyA9IHByb3BlcnR5U2l6ZSAvIHNpemVvZiAoQXVkaW9EZXZpY2VJRCk7CisKKyAgZGV2aWNlcyA9IChBdWRpb0RldmljZUlEICopIGdfbWFsbG9jIChwcm9wZXJ0eVNpemUpOworICBpZiAoZGV2aWNlcykgeworICAgIHN0YXR1cyA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhIChrQXVkaW9PYmplY3RTeXN0ZW1PYmplY3QsCisgICAgICAgICZhdWRpb0RldmljZXNBZGRyZXNzLCAwLCBOVUxMLCAmcHJvcGVydHlTaXplLCBkZXZpY2VzKTsKKyAgICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgICBHU1RfV0FSTklORyAoImZhaWxlZCBnZXR0aW5nIHRoZSBsaXN0IG9mIGRldmljZXM6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgICAgIGdfZnJlZSAoZGV2aWNlcyk7CisgICAgICAqbmRldmljZXMgPSAwOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisgIHJldHVybiBkZXZpY2VzOworfQorCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitfYXVkaW9fZGV2aWNlX2lzX2FsaXZlIChBdWRpb0RldmljZUlEIGRldmljZV9pZCwgZ2Jvb2xlYW4gb3V0cHV0KQoreworICBPU1N0YXR1cyBzdGF0dXMgPSBub0VycjsKKyAgaW50IGFsaXZlID0gRkFMU0U7CisgIFVJbnQzMiBwcm9wZXJ0eVNpemUgPSBzaXplb2YgKGFsaXZlKTsKKyAgQXVkaW9PYmplY3RQcm9wZXJ0eVNjb3BlIHByb3Bfc2NvcGU7CisKKyAgcHJvcF9zY29wZSA9IG91dHB1dCA/IGtBdWRpb0RldmljZVByb3BlcnR5U2NvcGVPdXRwdXQgOgorICAgICAga0F1ZGlvRGV2aWNlUHJvcGVydHlTY29wZUlucHV0OworCisgIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIGF1ZGlvRGV2aWNlQWxpdmVBZGRyZXNzID0geworICAgIGtBdWRpb0RldmljZVByb3BlcnR5RGV2aWNlSXNBbGl2ZSwKKyAgICBwcm9wX3Njb3BlLAorICAgIGtBdWRpb09iamVjdFByb3BlcnR5RWxlbWVudE1hc3RlcgorICB9OworCisgIHN0YXR1cyA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhIChkZXZpY2VfaWQsCisgICAgICAmYXVkaW9EZXZpY2VBbGl2ZUFkZHJlc3MsIDAsIE5VTEwsICZwcm9wZXJ0eVNpemUsICZhbGl2ZSk7CisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICBhbGl2ZSA9IEZBTFNFOworICB9CisKKyAgcmV0dXJuIGFsaXZlOworfQorCitzdGF0aWMgaW5saW5lIGd1aW50CitfYXVkaW9fZGV2aWNlX2dldF9sYXRlbmN5IChBdWRpb0RldmljZUlEIGRldmljZV9pZCkKK3sKKyAgT1NTdGF0dXMgc3RhdHVzID0gbm9FcnI7CisgIFVJbnQzMiBsYXRlbmN5ID0gMDsKKyAgVUludDMyIHByb3BlcnR5U2l6ZSA9IHNpemVvZiAobGF0ZW5jeSk7CisKKyAgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3MgYXVkaW9EZXZpY2VMYXRlbmN5QWRkcmVzcyA9IHsKKyAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eUxhdGVuY3ksCisgICAga0F1ZGlvRGV2aWNlUHJvcGVydHlTY29wZU91dHB1dCwKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIKKyAgfTsKKworICBzdGF0dXMgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YSAoZGV2aWNlX2lkLAorICAgICAgJmF1ZGlvRGV2aWNlTGF0ZW5jeUFkZHJlc3MsIDAsIE5VTEwsICZwcm9wZXJ0eVNpemUsICZsYXRlbmN5KTsKKyAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBnZXQgbGF0ZW5jeTogJWQiLCAoaW50KSBzdGF0dXMpOworICAgIGxhdGVuY3kgPSAtMTsKKyAgfQorCisgIHJldHVybiBsYXRlbmN5OworfQorCitzdGF0aWMgaW5saW5lIHBpZF90CitfYXVkaW9fZGV2aWNlX2dldF9ob2cgKEF1ZGlvRGV2aWNlSUQgZGV2aWNlX2lkKQoreworICBPU1N0YXR1cyBzdGF0dXMgPSBub0VycjsKKyAgcGlkX3QgaG9nX3BpZDsKKyAgVUludDMyIHByb3BlcnR5U2l6ZSA9IHNpemVvZiAoaG9nX3BpZCk7CisKKyAgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3MgYXVkaW9EZXZpY2VIb2dNb2RlQWRkcmVzcyA9IHsKKyAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eUhvZ01vZGUsCisgICAga0F1ZGlvRGV2aWNlUHJvcGVydHlTY29wZU91dHB1dCwKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIKKyAgfTsKKworICBzdGF0dXMgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YSAoZGV2aWNlX2lkLAorICAgICAgJmF1ZGlvRGV2aWNlSG9nTW9kZUFkZHJlc3MsIDAsIE5VTEwsICZwcm9wZXJ0eVNpemUsICZob2dfcGlkKTsKKyAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBnZXQgaG9nOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgaG9nX3BpZCA9IC0xOworICB9CisKKyAgcmV0dXJuIGhvZ19waWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ2Jvb2xlYW4KK19hdWRpb19kZXZpY2Vfc2V0X2hvZyAoQXVkaW9EZXZpY2VJRCBkZXZpY2VfaWQsIHBpZF90IGhvZ19waWQpCit7CisgIE9TU3RhdHVzIHN0YXR1cyA9IG5vRXJyOworICBVSW50MzIgcHJvcGVydHlTaXplID0gc2l6ZW9mIChob2dfcGlkKTsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3MgYXVkaW9EZXZpY2VIb2dNb2RlQWRkcmVzcyA9IHsKKyAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eUhvZ01vZGUsCisgICAga0F1ZGlvRGV2aWNlUHJvcGVydHlTY29wZU91dHB1dCwKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIKKyAgfTsKKworICBzdGF0dXMgPSBBdWRpb09iamVjdFNldFByb3BlcnR5RGF0YSAoZGV2aWNlX2lkLAorICAgICAgJmF1ZGlvRGV2aWNlSG9nTW9kZUFkZHJlc3MsIDAsIE5VTEwsIHByb3BlcnR5U2l6ZSwgJmhvZ19waWQpOworCisgIGlmIChzdGF0dXMgPT0gbm9FcnIpIHsKKyAgICByZXMgPSBUUlVFOworICB9IGVsc2UgeworICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBzZXQgaG9nOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitfYXVkaW9fZGV2aWNlX3NldF9taXhpbmcgKEF1ZGlvRGV2aWNlSUQgZGV2aWNlX2lkLCBnYm9vbGVhbiBlbmFibGVfbWl4KQoreworICBPU1N0YXR1cyBzdGF0dXMgPSBub0VycjsKKyAgVUludDMyIHByb3BlcnR5U2l6ZSA9IDAsIGNhbl9taXggPSBlbmFibGVfbWl4OworICBCb29sZWFuIHdyaXRhYmxlID0gRkFMU0U7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIGF1ZGlvRGV2aWNlU3VwcG9ydHNNaXhpbmdBZGRyZXNzID0geworICAgIGtBdWRpb0RldmljZVByb3BlcnR5U3VwcG9ydHNNaXhpbmcsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlTY29wZUdsb2JhbCwKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIKKyAgfTsKKworICBpZiAoQXVkaW9PYmplY3RIYXNQcm9wZXJ0eSAoZGV2aWNlX2lkLCAmYXVkaW9EZXZpY2VTdXBwb3J0c01peGluZ0FkZHJlc3MpKSB7CisgICAgLyogU2V0IG1peGFibGUgdG8gZmFsc2UgaWYgd2UgYXJlIGFsbG93ZWQgdG8gKi8KKyAgICBzdGF0dXMgPSBBdWRpb09iamVjdElzUHJvcGVydHlTZXR0YWJsZSAoZGV2aWNlX2lkLAorICAgICAgICAmYXVkaW9EZXZpY2VTdXBwb3J0c01peGluZ0FkZHJlc3MsICZ3cml0YWJsZSk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgR1NUX0RFQlVHICgiQXVkaW9PYmplY3RJc1Byb3BlcnR5U2V0dGFibGU6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgICB9CisgICAgc3RhdHVzID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGFTaXplIChkZXZpY2VfaWQsCisgICAgICAgICZhdWRpb0RldmljZVN1cHBvcnRzTWl4aW5nQWRkcmVzcywgMCwgTlVMTCwgJnByb3BlcnR5U2l6ZSk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgR1NUX0RFQlVHICgiQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGFTaXplOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgfQorICAgIHN0YXR1cyA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhIChkZXZpY2VfaWQsCisgICAgICAgICZhdWRpb0RldmljZVN1cHBvcnRzTWl4aW5nQWRkcmVzcywgMCwgTlVMTCwgJnByb3BlcnR5U2l6ZSwgJmNhbl9taXgpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgIEdTVF9ERUJVRyAoIkF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgfQorCisgICAgaWYgKHN0YXR1cyA9PSBub0VyciAmJiB3cml0YWJsZSkgeworICAgICAgY2FuX21peCA9IGVuYWJsZV9taXg7CisgICAgICBzdGF0dXMgPSBBdWRpb09iamVjdFNldFByb3BlcnR5RGF0YSAoZGV2aWNlX2lkLAorICAgICAgICAgICZhdWRpb0RldmljZVN1cHBvcnRzTWl4aW5nQWRkcmVzcywgMCwgTlVMTCwgcHJvcGVydHlTaXplLCAmY2FuX21peCk7CisgICAgICByZXMgPSBUUlVFOworICAgIH0KKworICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBzZXQgbWl4bW9kZTogJWQiLCAoaW50KSBzdGF0dXMpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUcgKCJwcm9wZXJ0eSBub3QgZm91bmQsIG1peGluZyBjb3VkbG4ndCBiZSBjaGFuZ2VkIik7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW5saW5lIGdjaGFyICoKK19hdWRpb19kZXZpY2VfZ2V0X25hbWUgKEF1ZGlvRGV2aWNlSUQgZGV2aWNlX2lkLCBnYm9vbGVhbiBvdXRwdXQpCit7CisgIE9TU3RhdHVzIHN0YXR1cyA9IG5vRXJyOworICBVSW50MzIgcHJvcGVydHlTaXplID0gMDsKKyAgZ2NoYXIgKmRldmljZV9uYW1lID0gTlVMTDsKKyAgQXVkaW9PYmplY3RQcm9wZXJ0eVNjb3BlIHByb3Bfc2NvcGU7CisKKyAgcHJvcF9zY29wZSA9IG91dHB1dCA/IGtBdWRpb0RldmljZVByb3BlcnR5U2NvcGVPdXRwdXQgOgorICAgICAga0F1ZGlvRGV2aWNlUHJvcGVydHlTY29wZUlucHV0OworCisgIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIGRldmljZU5hbWVBZGRyZXNzID0geworICAgIGtBdWRpb0RldmljZVByb3BlcnR5RGV2aWNlTmFtZSwKKyAgICBwcm9wX3Njb3BlLAorICAgIGtBdWRpb09iamVjdFByb3BlcnR5RWxlbWVudE1hc3RlcgorICB9OworCisgIC8qIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBkZXZpY2UgbmFtZSAqLworICBzdGF0dXMgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YVNpemUgKGRldmljZV9pZCwKKyAgICAgICZkZXZpY2VOYW1lQWRkcmVzcywgMCwgTlVMTCwgJnByb3BlcnR5U2l6ZSk7CisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICBnb3RvIGJlYWNoOworICB9CisKKyAgLyogR2V0IHRoZSBuYW1lIG9mIHRoZSBkZXZpY2UgKi8KKyAgZGV2aWNlX25hbWUgPSAoZ2NoYXIgKikgZ19tYWxsb2MgKHByb3BlcnR5U2l6ZSk7CisgIHN0YXR1cyA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhIChkZXZpY2VfaWQsCisgICAgICAmZGV2aWNlTmFtZUFkZHJlc3MsIDAsIE5VTEwsICZwcm9wZXJ0eVNpemUsIGRldmljZV9uYW1lKTsKKyAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgIGdfZnJlZSAoZGV2aWNlX25hbWUpOworICAgIGRldmljZV9uYW1lID0gTlVMTDsKKyAgfQorCitiZWFjaDoKKyAgcmV0dXJuIGRldmljZV9uYW1lOworfQorCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitfYXVkaW9fZGV2aWNlX2hhc19vdXRwdXQgKEF1ZGlvRGV2aWNlSUQgZGV2aWNlX2lkKQoreworICBPU1N0YXR1cyBzdGF0dXMgPSBub0VycjsKKyAgVUludDMyIHByb3BlcnR5U2l6ZTsKKworICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBzdHJlYW1zQWRkcmVzcyA9IHsKKyAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eVN0cmVhbXMsCisgICAga0F1ZGlvRGV2aWNlUHJvcGVydHlTY29wZU91dHB1dCwKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIKKyAgfTsKKworICBzdGF0dXMgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YVNpemUgKGRldmljZV9pZCwKKyAgICAgICZzdHJlYW1zQWRkcmVzcywgMCwgTlVMTCwgJnByb3BlcnR5U2l6ZSk7CisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHByb3BlcnR5U2l6ZSA9PSAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBHU1RfQ09SRV9BVURJT19ERUJVRworc3RhdGljIEF1ZGlvQ2hhbm5lbExheW91dCAqCitnc3RfY29yZV9hdWRpb19hdWRpb19kZXZpY2VfZ2V0X2NoYW5uZWxfbGF5b3V0IChBdWRpb0RldmljZUlEIGRldmljZV9pZCwKKyAgICBnYm9vbGVhbiBvdXRwdXQpCit7CisgIE9TU3RhdHVzIHN0YXR1cyA9IG5vRXJyOworICBVSW50MzIgcHJvcGVydHlTaXplID0gMDsKKyAgQXVkaW9DaGFubmVsTGF5b3V0ICpsYXlvdXQgPSBOVUxMOworICBBdWRpb09iamVjdFByb3BlcnR5U2NvcGUgcHJvcF9zY29wZTsKKworICBwcm9wX3Njb3BlID0gb3V0cHV0ID8ga0F1ZGlvRGV2aWNlUHJvcGVydHlTY29wZU91dHB1dCA6CisgICAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eVNjb3BlSW5wdXQ7CisKKyAgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3MgY2hhbm5lbExheW91dEFkZHJlc3MgPSB7CisgICAga0F1ZGlvRGV2aWNlUHJvcGVydHlQcmVmZXJyZWRDaGFubmVsTGF5b3V0LAorICAgIHByb3Bfc2NvcGUsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyCisgIH07CisKKyAgLyogR2V0IHRoZSBsZW5ndGggb2YgdGhlIGRlZmF1bHQgY2hhbm5lbCBsYXlvdXQgc3RydWN0dXJlICovCisgIHN0YXR1cyA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhU2l6ZSAoZGV2aWNlX2lkLAorICAgICAgJmNoYW5uZWxMYXlvdXRBZGRyZXNzLCAwLCBOVUxMLCAmcHJvcGVydHlTaXplKTsKKyAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBnZXQgcHJlZmVycmVkIGxheW91dDogJWQiLCAoaW50KSBzdGF0dXMpOworICAgIGdvdG8gYmVhY2g7CisgIH0KKworICAvKiBHZXQgdGhlIGRlZmF1bHQgY2hhbm5lbCBsYXlvdXQgb2YgdGhlIGRldmljZSAqLworICBsYXlvdXQgPSAoQXVkaW9DaGFubmVsTGF5b3V0ICopIGdfbWFsbG9jIChwcm9wZXJ0eVNpemUpOworICBzdGF0dXMgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YSAoZGV2aWNlX2lkLAorICAgICAgJmNoYW5uZWxMYXlvdXRBZGRyZXNzLCAwLCBOVUxMLCAmcHJvcGVydHlTaXplLCBsYXlvdXQpOworICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgR1NUX0VSUk9SICgiZmFpbGVkIHRvIGdldCBwcmVmZXJyZWQgbGF5b3V0OiAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKworICBpZiAobGF5b3V0LT5tQ2hhbm5lbExheW91dFRhZyA9PSBrQXVkaW9DaGFubmVsTGF5b3V0VGFnX1VzZUNoYW5uZWxCaXRtYXApIHsKKyAgICAvKiBiaXRtYXAgZGVmaW5lZCBjaGFubmVsbGF5b3V0ICovCisgICAgc3RhdHVzID0KKyAgICAgICAgQXVkaW9Gb3JtYXRHZXRQcm9wZXJ0eSAoa0F1ZGlvRm9ybWF0UHJvcGVydHlfQ2hhbm5lbExheW91dEZvckJpdG1hcCwKKyAgICAgICAgc2l6ZW9mIChVSW50MzIpLCAmbGF5b3V0LT5tQ2hhbm5lbEJpdG1hcCwgJnByb3BlcnR5U2l6ZSwgbGF5b3V0KTsKKyAgICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgICBHU1RfRVJST1IgKCJmYWlsZWQgdG8gZ2V0IGxheW91dCBmb3IgYml0bWFwOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIH0gZWxzZSBpZiAobGF5b3V0LT5tQ2hhbm5lbExheW91dFRhZyAhPQorICAgICAga0F1ZGlvQ2hhbm5lbExheW91dFRhZ19Vc2VDaGFubmVsRGVzY3JpcHRpb25zKSB7CisgICAgLyogbGF5b3V0dGFncyBkZWZpbmVkIGNoYW5uZWxsYXlvdXQgKi8KKyAgICBzdGF0dXMgPSBBdWRpb0Zvcm1hdEdldFByb3BlcnR5IChrQXVkaW9Gb3JtYXRQcm9wZXJ0eV9DaGFubmVsTGF5b3V0Rm9yVGFnLAorICAgICAgICBzaXplb2YgKEF1ZGlvQ2hhbm5lbExheW91dFRhZyksICZsYXlvdXQtPm1DaGFubmVsTGF5b3V0VGFnLAorICAgICAgICAmcHJvcGVydHlTaXplLCBsYXlvdXQpOworICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBnZXQgbGF5b3V0IGZvciB0YWc6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgfQorCisgIGdzdF9jb3JlX2F1ZGlvX2R1bXBfY2hhbm5lbF9sYXlvdXQgKGxheW91dCk7CisKK2JlYWNoOgorICByZXR1cm4gbGF5b3V0OworCitmYWlsZWQ6CisgIGdfZnJlZSAobGF5b3V0KTsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBBdWRpb1N0cmVhbUlEICoKK19hdWRpb19kZXZpY2VfZ2V0X3N0cmVhbXMgKEF1ZGlvRGV2aWNlSUQgZGV2aWNlX2lkLCBnaW50ICogbnN0cmVhbXMpCit7CisgIE9TU3RhdHVzIHN0YXR1cyA9IG5vRXJyOworICBVSW50MzIgcHJvcGVydHlTaXplID0gMDsKKyAgQXVkaW9TdHJlYW1JRCAqc3RyZWFtcyA9IE5VTEw7CisKKyAgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3Mgc3RyZWFtc0FkZHJlc3MgPSB7CisgICAga0F1ZGlvRGV2aWNlUHJvcGVydHlTdHJlYW1zLAorICAgIGtBdWRpb0RldmljZVByb3BlcnR5U2NvcGVPdXRwdXQsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyCisgIH07CisKKyAgc3RhdHVzID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGFTaXplIChkZXZpY2VfaWQsCisgICAgICAmc3RyZWFtc0FkZHJlc3MsIDAsIE5VTEwsICZwcm9wZXJ0eVNpemUpOworICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgR1NUX1dBUk5JTkcgKCJmYWlsZWQgZ2V0dGluZyBudW1iZXIgb2Ygc3RyZWFtczogJWQiLCAoaW50KSBzdGF0dXMpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgKm5zdHJlYW1zID0gcHJvcGVydHlTaXplIC8gc2l6ZW9mIChBdWRpb1N0cmVhbUlEKTsKKyAgc3RyZWFtcyA9IChBdWRpb1N0cmVhbUlEICopIGdfbWFsbG9jIChwcm9wZXJ0eVNpemUpOworCisgIGlmIChzdHJlYW1zKSB7CisgICAgc3RhdHVzID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGEgKGRldmljZV9pZCwKKyAgICAgICAgJnN0cmVhbXNBZGRyZXNzLCAwLCBOVUxMLCAmcHJvcGVydHlTaXplLCBzdHJlYW1zKTsKKyAgICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgICBHU1RfV0FSTklORyAoImZhaWxlZCBnZXR0aW5nIHRoZSBsaXN0IG9mIHN0cmVhbXM6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgICAgIGdfZnJlZSAoc3RyZWFtcyk7CisgICAgICAqbnN0cmVhbXMgPSAwOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0cmVhbXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ3VpbnQKK19hdWRpb19zdHJlYW1fZ2V0X2xhdGVuY3kgKEF1ZGlvU3RyZWFtSUQgc3RyZWFtX2lkKQoreworICBPU1N0YXR1cyBzdGF0dXMgPSBub0VycjsKKyAgVUludDMyIGxhdGVuY3k7CisgIFVJbnQzMiBwcm9wZXJ0eVNpemUgPSBzaXplb2YgKGxhdGVuY3kpOworCisgIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIGxhdGVuY3lBZGRyZXNzID0geworICAgIGtBdWRpb1N0cmVhbVByb3BlcnR5TGF0ZW5jeSwKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eVNjb3BlR2xvYmFsLAorICAgIGtBdWRpb09iamVjdFByb3BlcnR5RWxlbWVudE1hc3RlcgorICB9OworCisgIHN0YXR1cyA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhIChzdHJlYW1faWQsCisgICAgICAmbGF0ZW5jeUFkZHJlc3MsIDAsIE5VTEwsICZwcm9wZXJ0eVNpemUsICZsYXRlbmN5KTsKKyAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBnZXQgbGF0ZW5jeTogJWQiLCAoaW50KSBzdGF0dXMpOworICAgIGxhdGVuY3kgPSAtMTsKKyAgfQorCisgIHJldHVybiBsYXRlbmN5OworfQorCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitfYXVkaW9fc3RyZWFtX2dldF9jdXJyZW50X2Zvcm1hdCAoQXVkaW9TdHJlYW1JRCBzdHJlYW1faWQsCisgICAgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uICogZm9ybWF0KQoreworICBPU1N0YXR1cyBzdGF0dXMgPSBub0VycjsKKyAgVUludDMyIHByb3BlcnR5U2l6ZSA9IHNpemVvZiAoQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uKTsKKworICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBmb3JtYXRBZGRyZXNzID0geworICAgIGtBdWRpb1N0cmVhbVByb3BlcnR5UGh5c2ljYWxGb3JtYXQsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlTY29wZUdsb2JhbCwKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIKKyAgfTsKKworICBzdGF0dXMgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YSAoc3RyZWFtX2lkLAorICAgICAgJmZvcm1hdEFkZHJlc3MsIDAsIE5VTEwsICZwcm9wZXJ0eVNpemUsIGZvcm1hdCk7CisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICBHU1RfRVJST1IgKCJmYWlsZWQgdG8gZ2V0IGN1cnJlbnQgZm9ybWF0OiAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ2Jvb2xlYW4KK19hdWRpb19zdHJlYW1fc2V0X2N1cnJlbnRfZm9ybWF0IChBdWRpb1N0cmVhbUlEIHN0cmVhbV9pZCwKKyAgICBBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24gZm9ybWF0KQoreworICBPU1N0YXR1cyBzdGF0dXMgPSBub0VycjsKKyAgVUludDMyIHByb3BlcnR5U2l6ZSA9IHNpemVvZiAoQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uKTsKKworICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBmb3JtYXRBZGRyZXNzID0geworICAgIGtBdWRpb1N0cmVhbVByb3BlcnR5UGh5c2ljYWxGb3JtYXQsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlTY29wZUdsb2JhbCwKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIKKyAgfTsKKworICBzdGF0dXMgPSBBdWRpb09iamVjdFNldFByb3BlcnR5RGF0YSAoc3RyZWFtX2lkLAorICAgICAgJmZvcm1hdEFkZHJlc3MsIDAsIE5VTEwsIHByb3BlcnR5U2l6ZSwgJmZvcm1hdCk7CisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICBHU1RfRVJST1IgKCJmYWlsZWQgdG8gc2V0IGN1cnJlbnQgZm9ybWF0OiAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbmxpbmUgQXVkaW9TdHJlYW1SYW5nZWREZXNjcmlwdGlvbiAqCitfYXVkaW9fc3RyZWFtX2dldF9mb3JtYXRzIChBdWRpb1N0cmVhbUlEIHN0cmVhbV9pZCwgZ2ludCAqIG5mb3JtYXRzKQoreworICBPU1N0YXR1cyBzdGF0dXMgPSBub0VycjsKKyAgVUludDMyIHByb3BlcnR5U2l6ZSA9IDA7CisgIEF1ZGlvU3RyZWFtUmFuZ2VkRGVzY3JpcHRpb24gKmZvcm1hdHMgPSBOVUxMOworCisgIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIGZvcm1hdHNBZGRyZXNzID0geworICAgIGtBdWRpb1N0cmVhbVByb3BlcnR5QXZhaWxhYmxlUGh5c2ljYWxGb3JtYXRzLAorICAgIGtBdWRpb09iamVjdFByb3BlcnR5U2NvcGVHbG9iYWwsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyCisgIH07CisKKyAgc3RhdHVzID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGFTaXplIChzdHJlYW1faWQsCisgICAgICAmZm9ybWF0c0FkZHJlc3MsIDAsIE5VTEwsICZwcm9wZXJ0eVNpemUpOworICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgR1NUX1dBUk5JTkcgKCJmYWlsZWQgZ2V0dGluZyBudW1iZXIgb2Ygc3RyZWFtIGZvcm1hdHM6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgICpuZm9ybWF0cyA9IHByb3BlcnR5U2l6ZSAvIHNpemVvZiAoQXVkaW9TdHJlYW1SYW5nZWREZXNjcmlwdGlvbik7CisKKyAgZm9ybWF0cyA9IChBdWRpb1N0cmVhbVJhbmdlZERlc2NyaXB0aW9uICopIGdfbWFsbG9jIChwcm9wZXJ0eVNpemUpOworICBpZiAoZm9ybWF0cykgeworICAgIHN0YXR1cyA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhIChzdHJlYW1faWQsCisgICAgICAgICZmb3JtYXRzQWRkcmVzcywgMCwgTlVMTCwgJnByb3BlcnR5U2l6ZSwgZm9ybWF0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgICAgR1NUX1dBUk5JTkcgKCJmYWlsZWQgZ2V0dGluZyB0aGUgbGlzdCBvZiBzdHJlYW0gZm9ybWF0czogJWQiLAorICAgICAgICAgIChpbnQpIHN0YXR1cyk7CisgICAgICBnX2ZyZWUgKGZvcm1hdHMpOworICAgICAgKm5mb3JtYXRzID0gMDsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorICByZXR1cm4gZm9ybWF0czsKK30KKworc3RhdGljIGlubGluZSBnYm9vbGVhbgorX2F1ZGlvX3N0cmVhbV9pc19zcGRpZl9hdmFpbCAoQXVkaW9TdHJlYW1JRCBzdHJlYW1faWQpCit7CisgIEF1ZGlvU3RyZWFtUmFuZ2VkRGVzY3JpcHRpb24gKmZvcm1hdHM7CisgIGdpbnQgaSwgbmZvcm1hdHMgPSAwOworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKworICBmb3JtYXRzID0gX2F1ZGlvX3N0cmVhbV9nZXRfZm9ybWF0cyAoc3RyZWFtX2lkLCAmbmZvcm1hdHMpOworICBHU1RfREVCVUcgKCJmb3VuZCAlZCBzdHJlYW0gZm9ybWF0cyIsIG5mb3JtYXRzKTsKKworICBpZiAoZm9ybWF0cykgeworICAgIEdTVF9ERUJVRyAoImZvcm1hdHMgc3VwcG9ydGVkIG9uIHN0cmVhbSBJRDogJXUiLCAodW5zaWduZWQpIHN0cmVhbV9pZCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmZvcm1hdHM7IGkrKykgeworICAgICAgR1NUX0RFQlVHICgiICAiIENPUkVfQVVESU9fRk9STUFULAorICAgICAgICAgIENPUkVfQVVESU9fRk9STUFUX0FSR1MgKGZvcm1hdHNbaV0ubUZvcm1hdCkpOworCisgICAgICBpZiAoQ09SRV9BVURJT19GT1JNQVRfSVNfU1BESUYgKGZvcm1hdHNbaV0pKSB7CisgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICB9CisgICAgfQorICAgIGdfZnJlZSAoZm9ybWF0cyk7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgT1NTdGF0dXMKK19hdWRpb19zdHJlYW1fZm9ybWF0X2xpc3RlbmVyIChBdWRpb09iamVjdElEIGluT2JqZWN0SUQsCisgICAgVUludDMyIGluTnVtYmVyQWRkcmVzc2VzLAorICAgIGNvbnN0IEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIGluQWRkcmVzc2VzW10sIHZvaWQgKmluQ2xpZW50RGF0YSkKK3sKKyAgT1NTdGF0dXMgc3RhdHVzID0gbm9FcnI7CisgIGd1aW50IGk7CisgIFByb3BlcnR5TXV0ZXggKnByb3BfbXV0ZXggPSBpbkNsaWVudERhdGE7CisKKyAgZm9yIChpID0gMDsgaSA8IGluTnVtYmVyQWRkcmVzc2VzOyBpKyspIHsKKyAgICBpZiAoaW5BZGRyZXNzZXNbaV0ubVNlbGVjdG9yID09IGtBdWRpb1N0cmVhbVByb3BlcnR5UGh5c2ljYWxGb3JtYXQpIHsKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnByb3BfbXV0ZXgtPmxvY2spOworICAgICAgZ19jb25kX3NpZ25hbCAoJnByb3BfbXV0ZXgtPmNvbmQpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZwcm9wX211dGV4LT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gKHN0YXR1cyk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorX2F1ZGlvX3N0cmVhbV9jaGFuZ2VfZm9ybWF0IChBdWRpb1N0cmVhbUlEIHN0cmVhbV9pZCwKKyAgICBBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24gZm9ybWF0KQoreworICBPU1N0YXR1cyBzdGF0dXMgPSBub0VycjsKKyAgZ2ludCBpOworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKyAgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uIGNmb3JtYXQ7CisgIFByb3BlcnR5TXV0ZXggcHJvcF9tdXRleDsKKworICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBmb3JtYXRBZGRyZXNzID0geworICAgIGtBdWRpb1N0cmVhbVByb3BlcnR5UGh5c2ljYWxGb3JtYXQsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlTY29wZUdsb2JhbCwKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIKKyAgfTsKKworICBHU1RfREVCVUcgKCJzZXR0aW5nIHN0cmVhbSBmb3JtYXQ6ICIgQ09SRV9BVURJT19GT1JNQVQsCisgICAgICBDT1JFX0FVRElPX0ZPUk1BVF9BUkdTIChmb3JtYXQpKTsKKworICAvKiBDb25kaXRpb24gYmVjYXVzZSBTZXRQcm9wZXJ0eSBpcyBhc3luY2hyb25vdXMgKi8KKyAgZ19tdXRleF9pbml0ICgmcHJvcF9tdXRleC5sb2NrKTsKKyAgZ19jb25kX2luaXQgKCZwcm9wX211dGV4LmNvbmQpOworCisgIGdfbXV0ZXhfbG9jayAoJnByb3BfbXV0ZXgubG9jayk7CisKKyAgLyogSW5zdGFsbCB0aGUgcHJvcGVydHkgbGlzdGVuZXIgdG8gc2VyaWFsaXplIHRoZSBvcGVyYXRpb25zICovCisgIHN0YXR1cyA9IEF1ZGlvT2JqZWN0QWRkUHJvcGVydHlMaXN0ZW5lciAoc3RyZWFtX2lkLCAmZm9ybWF0QWRkcmVzcywKKyAgICAgIF9hdWRpb19zdHJlYW1fZm9ybWF0X2xpc3RlbmVyLCAodm9pZCAqKSAmcHJvcF9tdXRleCk7CisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICBHU1RfRVJST1IgKCJBdWRpb09iamVjdEFkZFByb3BlcnR5TGlzdGVuZXIgZmFpbGVkOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgZ290byBkb25lOworICB9CisKKyAgLyogQ2hhbmdlIHRoZSBmb3JtYXQgKi8KKyAgaWYgKCFfYXVkaW9fc3RyZWFtX3NldF9jdXJyZW50X2Zvcm1hdCAoc3RyZWFtX2lkLCBmb3JtYXQpKSB7CisgICAgZ290byBkb25lOworICB9CisKKyAgLyogVGhlIEF1ZGlvT2JqZWN0U2V0UHJvcGVydHkgaXMgbm90IG9ubHkgYXN5bmNocm9ub3VzCisgICAqIGl0IGlzIGFsc28gbm90IGF0b21pYyBpbiBpdHMgYmVoYXZpb3VyLgorICAgKiBUaGVyZWZvcmUgd2UgY2hlY2sgNCB0aW1lcyBiZWZvcmUgd2UgcmVhbGx5IGdpdmUgdXAuICovCisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICBHVGltZVZhbCB0aW1lb3V0OworCisgICAgZ19nZXRfY3VycmVudF90aW1lICgmdGltZW91dCk7CisgICAgZ190aW1lX3ZhbF9hZGQgKCZ0aW1lb3V0LCAyNTAwMDApOworCisgICAgaWYgKCFnX2NvbmRfd2FpdF91bnRpbCAoJnByb3BfbXV0ZXguY29uZCwgJnByb3BfbXV0ZXgubG9jaywgdGltZW91dC50dl9zZWMpKSB7CisgICAgICBHU1RfTE9HICgidGltZW91dC4uLiIpOworICAgIH0KKworICAgIGlmIChfYXVkaW9fc3RyZWFtX2dldF9jdXJyZW50X2Zvcm1hdCAoc3RyZWFtX2lkLCAmY2Zvcm1hdCkpIHsKKyAgICAgIEdTVF9ERUJVRyAoImN1cnJlbnQgc3RyZWFtIGZvcm1hdDogIiBDT1JFX0FVRElPX0ZPUk1BVCwKKyAgICAgICAgICBDT1JFX0FVRElPX0ZPUk1BVF9BUkdTIChjZm9ybWF0KSk7CisKKyAgICAgIGlmIChjZm9ybWF0Lm1TYW1wbGVSYXRlID09IGZvcm1hdC5tU2FtcGxlUmF0ZSAmJgorICAgICAgICAgIGNmb3JtYXQubUZvcm1hdElEID09IGZvcm1hdC5tRm9ybWF0SUQgJiYKKyAgICAgICAgICBjZm9ybWF0Lm1GcmFtZXNQZXJQYWNrZXQgPT0gZm9ybWF0Lm1GcmFtZXNQZXJQYWNrZXQpIHsKKyAgICAgICAgLyogVGhlIHJpZ2h0IGZvcm1hdCBpcyBub3cgYWN0aXZlICovCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChjZm9ybWF0Lm1TYW1wbGVSYXRlICE9IGZvcm1hdC5tU2FtcGxlUmF0ZSB8fAorICAgICAgY2Zvcm1hdC5tRm9ybWF0SUQgIT0gZm9ybWF0Lm1Gb3JtYXRJRCB8fAorICAgICAgY2Zvcm1hdC5tRnJhbWVzUGVyUGFja2V0ICE9IGZvcm1hdC5tRnJhbWVzUGVyUGFja2V0KSB7CisgICAgZ290byBkb25lOworICB9CisKKyAgcmV0ID0gVFJVRTsKKworZG9uZToKKyAgLyogUmVtb3ZpbmcgdGhlIHByb3BlcnR5IGxpc3RlbmVyICovCisgIHN0YXR1cyA9IEF1ZGlvT2JqZWN0UmVtb3ZlUHJvcGVydHlMaXN0ZW5lciAoc3RyZWFtX2lkLAorICAgICAgJmZvcm1hdEFkZHJlc3MsIF9hdWRpb19zdHJlYW1fZm9ybWF0X2xpc3RlbmVyLCAodm9pZCAqKSAmcHJvcF9tdXRleCk7CisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICBHU1RfRVJST1IgKCJBdWRpb09iamVjdFJlbW92ZVByb3BlcnR5TGlzdGVuZXIgZmFpbGVkOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgIH0KKyAgLyogRGVzdHJveSB0aGUgbG9jayBhbmQgY29uZGl0aW9uICovCisgIGdfbXV0ZXhfdW5sb2NrICgmcHJvcF9tdXRleC5sb2NrKTsKKyAgZ19tdXRleF9jbGVhciAoJnByb3BfbXV0ZXgubG9jayk7CisgIGdfY29uZF9jbGVhciAoJnByb3BfbXV0ZXguY29uZCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIE9TU3RhdHVzCitfYXVkaW9fc3RyZWFtX2hhcmR3YXJlX2NoYW5nZWRfbGlzdGVuZXIgKEF1ZGlvT2JqZWN0SUQgaW5PYmplY3RJRCwKKyAgICBVSW50MzIgaW5OdW1iZXJBZGRyZXNzZXMsCisgICAgY29uc3QgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3MgaW5BZGRyZXNzZXNbXSwgdm9pZCAqaW5DbGllbnREYXRhKQoreworICBPU1N0YXR1cyBzdGF0dXMgPSBub0VycjsKKyAgZ3VpbnQgaTsKKyAgR3N0Q29yZUF1ZGlvICpjb3JlX2F1ZGlvID0gaW5DbGllbnREYXRhOworCisgIGZvciAoaSA9IDA7IGkgPCBpbk51bWJlckFkZHJlc3NlczsgaSsrKSB7CisgICAgaWYgKGluQWRkcmVzc2VzW2ldLm1TZWxlY3RvciA9PSBrQXVkaW9EZXZpY2VQcm9wZXJ0eURldmljZUhhc0NoYW5nZWQpIHsKKyAgICAgIGlmICghZ3N0X2NvcmVfYXVkaW9fYXVkaW9fZGV2aWNlX2lzX3NwZGlmX2F2YWlsIChjb3JlX2F1ZGlvLT5kZXZpY2VfaWQpKSB7CisgICAgICAgIEdzdE9zeEF1ZGlvU2luayAqc2luayA9CisgICAgICAgICAgICBHU1RfT1NYX0FVRElPX1NJTksgKEdTVF9PQkpFQ1RfUEFSRU5UIChjb3JlX2F1ZGlvLT5vc3hidWYpKTsKKyAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNpbmssIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICAgICAoIlNQRElGIG91dHB1dCBubyBsb25nZXIgYXZhaWxhYmxlIiksCisgICAgICAgICAgICAoIkF1ZGlvIGRldmljZSBpcyByZXBvcnRpbmcgdGhhdCBTUERJRiBvdXRwdXQgaXNuJ3QgYXZhaWxhYmxlIikpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAoc3RhdHVzKTsKK30KKworc3RhdGljIGlubGluZSBnYm9vbGVhbgorX21vbml0b3JpemVfc3BkaWYgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIE9TU3RhdHVzIHN0YXR1cyA9IG5vRXJyOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIHByb3BBZGRyZXNzID0geworICAgIGtBdWRpb0RldmljZVByb3BlcnR5RGV2aWNlSGFzQ2hhbmdlZCwKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eVNjb3BlR2xvYmFsLAorICAgIGtBdWRpb09iamVjdFByb3BlcnR5RWxlbWVudE1hc3RlcgorICB9OworCisgIC8qIEluc3RhbGwgdGhlIHByb3BlcnR5IGxpc3RlbmVyICovCisgIHN0YXR1cyA9IEF1ZGlvT2JqZWN0QWRkUHJvcGVydHlMaXN0ZW5lciAoY29yZV9hdWRpby0+ZGV2aWNlX2lkLAorICAgICAgJnByb3BBZGRyZXNzLCBfYXVkaW9fc3RyZWFtX2hhcmR3YXJlX2NoYW5nZWRfbGlzdGVuZXIsCisgICAgICAodm9pZCAqKSBjb3JlX2F1ZGlvKTsKKyAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNvcmVfYXVkaW8tPm9zeGJ1ZiwKKyAgICAgICAgIkF1ZGlvT2JqZWN0QWRkUHJvcGVydHlMaXN0ZW5lciBmYWlsZWQ6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgICByZXQgPSBGQUxTRTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ2Jvb2xlYW4KK191bm1vbml0b3JpemVfc3BkaWYgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIE9TU3RhdHVzIHN0YXR1cyA9IG5vRXJyOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIHByb3BBZGRyZXNzID0geworICAgIGtBdWRpb0RldmljZVByb3BlcnR5RGV2aWNlSGFzQ2hhbmdlZCwKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eVNjb3BlR2xvYmFsLAorICAgIGtBdWRpb09iamVjdFByb3BlcnR5RWxlbWVudE1hc3RlcgorICB9OworCisgIC8qIFJlbW92ZSB0aGUgcHJvcGVydHkgbGlzdGVuZXIgKi8KKyAgc3RhdHVzID0gQXVkaW9PYmplY3RSZW1vdmVQcm9wZXJ0eUxpc3RlbmVyIChjb3JlX2F1ZGlvLT5kZXZpY2VfaWQsCisgICAgICAmcHJvcEFkZHJlc3MsIF9hdWRpb19zdHJlYW1faGFyZHdhcmVfY2hhbmdlZF9saXN0ZW5lciwKKyAgICAgICh2b2lkICopIGNvcmVfYXVkaW8pOworICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoY29yZV9hdWRpby0+b3N4YnVmLAorICAgICAgICAiQXVkaW9PYmplY3RSZW1vdmVQcm9wZXJ0eUxpc3RlbmVyIGZhaWxlZDogJWQiLCAoaW50KSBzdGF0dXMpOworICAgIHJldCA9IEZBTFNFOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBnYm9vbGVhbgorX29wZW5fc3BkaWYgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworICBwaWRfdCBob2dfcGlkLCBvd25fcGlkID0gZ2V0cGlkICgpOworCisgIC8qIFdlIG5lZWQgdGhlIGRldmljZSBpbiBleGNsdXNpdmUgYW5kIGRpc2FibGUgdGhlIG1peGluZyAqLworICBob2dfcGlkID0gX2F1ZGlvX2RldmljZV9nZXRfaG9nIChjb3JlX2F1ZGlvLT5kZXZpY2VfaWQpOworCisgIGlmIChob2dfcGlkICE9IC0xICYmIGhvZ19waWQgIT0gb3duX3BpZCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvcmVfYXVkaW8sCisgICAgICAgICJkZXZpY2UgaXMgY3VycmVudGx5IGluIHVzZSBieSBhbm90aGVyIGFwcGxpY2F0aW9uIik7CisgICAgZ290byBkb25lOworICB9CisKKyAgaWYgKF9hdWRpb19kZXZpY2Vfc2V0X2hvZyAoY29yZV9hdWRpby0+ZGV2aWNlX2lkLCBvd25fcGlkKSkgeworICAgIGNvcmVfYXVkaW8tPmhvZ19waWQgPSBvd25fcGlkOworICB9CisKKyAgaWYgKF9hdWRpb19kZXZpY2Vfc2V0X21peGluZyAoY29yZV9hdWRpby0+ZGV2aWNlX2lkLCBGQUxTRSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChjb3JlX2F1ZGlvLCAiZGlzYWJsZWQgbWl4aW5nIG9uIHRoZSBkZXZpY2UiKTsKKyAgICBjb3JlX2F1ZGlvLT5kaXNhYmxlZF9taXhpbmcgPSBUUlVFOworICB9CisKKyAgcmVzID0gVFJVRTsKK2RvbmU6CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ2Jvb2xlYW4KK19jbG9zZV9zcGRpZiAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbykKK3sKKyAgcGlkX3QgaG9nX3BpZDsKKworICBfdW5tb25pdG9yaXplX3NwZGlmIChjb3JlX2F1ZGlvKTsKKworICBpZiAoY29yZV9hdWRpby0+cmV2ZXJ0X2Zvcm1hdCkgeworICAgIGlmICghX2F1ZGlvX3N0cmVhbV9jaGFuZ2VfZm9ybWF0IChjb3JlX2F1ZGlvLT5zdHJlYW1faWQsCisgICAgICAgICAgICBjb3JlX2F1ZGlvLT5vcmlnaW5hbF9mb3JtYXQpKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvcmVfYXVkaW8tPm9zeGJ1ZiwgIkZvcm1hdCByZXZlcnQgZmFpbGVkIik7CisgICAgfQorICAgIGNvcmVfYXVkaW8tPnJldmVydF9mb3JtYXQgPSBGQUxTRTsKKyAgfQorCisgIGlmIChjb3JlX2F1ZGlvLT5kaXNhYmxlZF9taXhpbmcpIHsKKyAgICBfYXVkaW9fZGV2aWNlX3NldF9taXhpbmcgKGNvcmVfYXVkaW8tPmRldmljZV9pZCwgVFJVRSk7CisgICAgY29yZV9hdWRpby0+ZGlzYWJsZWRfbWl4aW5nID0gRkFMU0U7CisgIH0KKworICBpZiAoY29yZV9hdWRpby0+aG9nX3BpZCAhPSAtMSkgeworICAgIGhvZ19waWQgPSBfYXVkaW9fZGV2aWNlX2dldF9ob2cgKGNvcmVfYXVkaW8tPmRldmljZV9pZCk7CisgICAgaWYgKGhvZ19waWQgPT0gZ2V0cGlkICgpKSB7CisgICAgICBpZiAoX2F1ZGlvX2RldmljZV9zZXRfaG9nIChjb3JlX2F1ZGlvLT5kZXZpY2VfaWQsIC0xKSkgeworICAgICAgICBjb3JlX2F1ZGlvLT5ob2dfcGlkID0gLTE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBPU1N0YXR1cworX2lvX3Byb2Nfc3BkaWYgKEF1ZGlvRGV2aWNlSUQgaW5EZXZpY2UsCisgICAgY29uc3QgQXVkaW9UaW1lU3RhbXAgKiBpbk5vdywKKyAgICBjb25zdCB2b2lkICppbklucHV0RGF0YSwKKyAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCAqIGluVGltZXN0YW1wLAorICAgIEF1ZGlvQnVmZmVyTGlzdCAqIGJ1ZmZlckxpc3QsCisgICAgY29uc3QgQXVkaW9UaW1lU3RhbXAgKiBpbk91dHB1dFRpbWUsIEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIE9TU3RhdHVzIHN0YXR1czsKKworICBzdGF0dXMgPSBjb3JlX2F1ZGlvLT5lbGVtZW50LT5pb19wcm9jIChjb3JlX2F1ZGlvLT5vc3hidWYsIE5VTEwsIGluVGltZXN0YW1wLAorICAgICAgMCwgMCwgYnVmZmVyTGlzdCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGlubGluZSBnYm9vbGVhbgorX2FjcXVpcmVfc3BkaWYgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8sIEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiBmb3JtYXQpCit7CisgIEF1ZGlvU3RyZWFtSUQgKnN0cmVhbXMgPSBOVUxMOworICBnaW50IGksIGosIG5zdHJlYW1zID0gMDsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgaWYgKCFfb3Blbl9zcGRpZiAoY29yZV9hdWRpbykpCisgICAgZ290byBkb25lOworCisgIHN0cmVhbXMgPSBfYXVkaW9fZGV2aWNlX2dldF9zdHJlYW1zIChjb3JlX2F1ZGlvLT5kZXZpY2VfaWQsICZuc3RyZWFtcyk7CisKKyAgZm9yIChpID0gMDsgaSA8IG5zdHJlYW1zOyBpKyspIHsKKyAgICBBdWRpb1N0cmVhbVJhbmdlZERlc2NyaXB0aW9uICpmb3JtYXRzID0gTlVMTDsKKyAgICBnaW50IG5mb3JtYXRzID0gMDsKKworICAgIGZvcm1hdHMgPSBfYXVkaW9fc3RyZWFtX2dldF9mb3JtYXRzIChzdHJlYW1zW2ldLCAmbmZvcm1hdHMpOworCisgICAgaWYgKGZvcm1hdHMpIHsKKyAgICAgIGdib29sZWFuIGlzX3NwZGlmID0gRkFMU0U7CisKKyAgICAgIC8qIENoZWNrIGlmIG9uZSBvZiB0aGUgc3VwcG9ydGVkIGZvcm1hdHMgaXMgYSBkaWdpdGFsIGZvcm1hdCAqLworICAgICAgZm9yIChqID0gMDsgaiA8IG5mb3JtYXRzOyBqKyspIHsKKyAgICAgICAgaWYgKENPUkVfQVVESU9fRk9STUFUX0lTX1NQRElGIChmb3JtYXRzW2pdKSkgeworICAgICAgICAgIGlzX3NwZGlmID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoaXNfc3BkaWYpIHsKKyAgICAgICAgLyogaWYgdGhpcyBzdHJlYW0gc3VwcG9ydHMgYSBkaWdpdGFsIChjYWMzKSBmb3JtYXQsCisgICAgICAgICAqIHRoZW4gZ28gc2V0IGl0LiAqLworICAgICAgICBnaW50IHJlcXVlc3RlZF9yYXRlX2Zvcm1hdCA9IC0xOworICAgICAgICBnaW50IGN1cnJlbnRfcmF0ZV9mb3JtYXQgPSAtMTsKKyAgICAgICAgZ2ludCBiYWNrdXBfcmF0ZV9mb3JtYXQgPSAtMTsKKworICAgICAgICBjb3JlX2F1ZGlvLT5zdHJlYW1faWQgPSBzdHJlYW1zW2ldOworICAgICAgICBjb3JlX2F1ZGlvLT5zdHJlYW1faWR4ID0gaTsKKworICAgICAgICBpZiAoIWNvcmVfYXVkaW8tPnJldmVydF9mb3JtYXQpIHsKKyAgICAgICAgICBpZiAoIV9hdWRpb19zdHJlYW1fZ2V0X2N1cnJlbnRfZm9ybWF0IChjb3JlX2F1ZGlvLT5zdHJlYW1faWQsCisgICAgICAgICAgICAgICAgICAmY29yZV9hdWRpby0+b3JpZ2luYWxfZm9ybWF0KSkgeworICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb3JlX2F1ZGlvLT5vc3hidWYsCisgICAgICAgICAgICAgICAgImZvcm1hdCBjb3VsZCBub3QgYmUgc2F2ZWQiKTsKKyAgICAgICAgICAgIGdfZnJlZSAoZm9ybWF0cyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgY29yZV9hdWRpby0+cmV2ZXJ0X2Zvcm1hdCA9IFRSVUU7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmZvcm1hdHM7IGorKykgeworICAgICAgICAgIGlmIChDT1JFX0FVRElPX0ZPUk1BVF9JU19TUERJRiAoZm9ybWF0c1tqXSkpIHsKKyAgICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChjb3JlX2F1ZGlvLT5vc3hidWYsCisgICAgICAgICAgICAgICAgImZvdW5kIHN0cmVhbSBmb3JtYXQ6ICIgQ09SRV9BVURJT19GT1JNQVQsCisgICAgICAgICAgICAgICAgQ09SRV9BVURJT19GT1JNQVRfQVJHUyAoZm9ybWF0c1tqXS5tRm9ybWF0KSk7CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRzW2pdLm1Gb3JtYXQubVNhbXBsZVJhdGUgPT0gZm9ybWF0Lm1TYW1wbGVSYXRlKSB7CisgICAgICAgICAgICAgIHJlcXVlc3RlZF9yYXRlX2Zvcm1hdCA9IGo7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXRzW2pdLm1Gb3JtYXQubVNhbXBsZVJhdGUgPT0KKyAgICAgICAgICAgICAgICBjb3JlX2F1ZGlvLT5vcmlnaW5hbF9mb3JtYXQubVNhbXBsZVJhdGUpIHsKKyAgICAgICAgICAgICAgY3VycmVudF9yYXRlX2Zvcm1hdCA9IGo7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpZiAoYmFja3VwX3JhdGVfZm9ybWF0IDwgMCB8fAorICAgICAgICAgICAgICAgICAgZm9ybWF0c1tqXS5tRm9ybWF0Lm1TYW1wbGVSYXRlID4KKyAgICAgICAgICAgICAgICAgIGZvcm1hdHNbYmFja3VwX3JhdGVfZm9ybWF0XS5tRm9ybWF0Lm1TYW1wbGVSYXRlKSB7CisgICAgICAgICAgICAgICAgYmFja3VwX3JhdGVfZm9ybWF0ID0gajsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXF1ZXN0ZWRfcmF0ZV9mb3JtYXQgPj0gMCkgeworICAgICAgICAgIC8qIFdlIHByZWZlciB0byBvdXRwdXQgYXQgdGhlIHJhdGUgb2YgdGhlIG9yaWdpbmFsIGF1ZGlvICovCisgICAgICAgICAgY29yZV9hdWRpby0+c3RyZWFtX2Zvcm1hdCA9IGZvcm1hdHNbcmVxdWVzdGVkX3JhdGVfZm9ybWF0XS5tRm9ybWF0OworICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRfcmF0ZV9mb3JtYXQgPj0gMCkgeworICAgICAgICAgIC8qIElmIG5vdCBwb3NzaWJsZSwgd2Ugd2lsbCB0cnkgdG8gdXNlIHRoZSBjdXJyZW50IHJhdGUgKi8KKyAgICAgICAgICBjb3JlX2F1ZGlvLT5zdHJlYW1fZm9ybWF0ID0gZm9ybWF0c1tjdXJyZW50X3JhdGVfZm9ybWF0XS5tRm9ybWF0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIEFuZCBpZiB3ZSBoYXZlIHRvLCBhbnkgZGlnaXRhbCBmb3JtYXQgd2lsbCBiZSBqdXN0CisgICAgICAgICAgICogZmluZSAoaGlnaGVzdCByYXRlIHBvc3NpYmxlKSAqLworICAgICAgICAgIGNvcmVfYXVkaW8tPnN0cmVhbV9mb3JtYXQgPSBmb3JtYXRzW2JhY2t1cF9yYXRlX2Zvcm1hdF0ubUZvcm1hdDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZ19mcmVlIChmb3JtYXRzKTsKKyAgICB9CisgIH0KKyAgZ19mcmVlIChzdHJlYW1zKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChjb3JlX2F1ZGlvLAorICAgICAgIm9yaWdpbmFsIHN0cmVhbSBmb3JtYXQ6ICIgQ09SRV9BVURJT19GT1JNQVQsCisgICAgICBDT1JFX0FVRElPX0ZPUk1BVF9BUkdTIChjb3JlX2F1ZGlvLT5vcmlnaW5hbF9mb3JtYXQpKTsKKworICBpZiAoIV9hdWRpb19zdHJlYW1fY2hhbmdlX2Zvcm1hdCAoY29yZV9hdWRpby0+c3RyZWFtX2lkLAorICAgICAgICAgIGNvcmVfYXVkaW8tPnN0cmVhbV9mb3JtYXQpKQorICAgIGdvdG8gZG9uZTsKKworICByZXQgPSBUUlVFOworCitkb25lOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19yZW1vdmVfcmVuZGVyX3NwZGlmX2NhbGxiYWNrIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICBPU1N0YXR1cyBzdGF0dXM7CisKKyAgLyogRGVhY3RpdmF0ZSB0aGUgcmVuZGVyIGNhbGxiYWNrIGJ5IGNhbGxpbmcKKyAgICogQXVkaW9EZXZpY2VEZXN0cm95SU9Qcm9jSUQgKi8KKyAgc3RhdHVzID0KKyAgICAgIEF1ZGlvRGV2aWNlRGVzdHJveUlPUHJvY0lEIChjb3JlX2F1ZGlvLT5kZXZpY2VfaWQsIGNvcmVfYXVkaW8tPnByb2NJRCk7CisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChjb3JlX2F1ZGlvLT5vc3hidWYsCisgICAgICAgICJBdWRpb0RldmljZURlc3Ryb3lJT1Byb2NJRCBmYWlsZWQ6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGNvcmVfYXVkaW8sCisgICAgICAib3N4IHJpbmcgYnVmZmVyIHJlbW92ZWQgaW9wcm9jIElEOiAlcCBkZXZpY2VfaWQgJWx1IiwKKyAgICAgIGNvcmVfYXVkaW8tPnByb2NJRCwgKGd1bG9uZykgY29yZV9hdWRpby0+ZGV2aWNlX2lkKTsKKworICAvKiBXZSdyZSBkZWFjdGl2YXRlZC4uICovCisgIGNvcmVfYXVkaW8tPnByb2NJRCA9IDA7CisgIGNvcmVfYXVkaW8tPmlvX3Byb2NfbmVlZHNfZGVhY3RpdmF0aW9uID0gRkFMU0U7CisgIGNvcmVfYXVkaW8tPmlvX3Byb2NfYWN0aXZlID0gRkFMU0U7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ2Jvb2xlYW4KK19pb19wcm9jX3NwZGlmX3N0YXJ0IChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICBPU0VyciBzdGF0dXM7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoY29yZV9hdWRpbywKKyAgICAgICJvc3ggcmluZyBidWZmZXIgc3RhcnQgaW9wcm9jIElEOiAlcCBkZXZpY2VfaWQgJWx1IiwKKyAgICAgIGNvcmVfYXVkaW8tPnByb2NJRCwgKGd1bG9uZykgY29yZV9hdWRpby0+ZGV2aWNlX2lkKTsKKworICBpZiAoIWNvcmVfYXVkaW8tPmlvX3Byb2NfYWN0aXZlKSB7CisgICAgLyogQWRkIElPUHJvYyBjYWxsYmFjayAqLworICAgIHN0YXR1cyA9IEF1ZGlvRGV2aWNlQ3JlYXRlSU9Qcm9jSUQgKGNvcmVfYXVkaW8tPmRldmljZV9pZCwKKyAgICAgICAgKEF1ZGlvRGV2aWNlSU9Qcm9jKSBfaW9fcHJvY19zcGRpZiwKKyAgICAgICAgKHZvaWQgKikgY29yZV9hdWRpbywgJmNvcmVfYXVkaW8tPnByb2NJRCk7CisgICAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAoY29yZV9hdWRpby0+b3N4YnVmLAorICAgICAgICAgICI6QXVkaW9EZXZpY2VDcmVhdGVJT1Byb2NJRCBmYWlsZWQ6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgY29yZV9hdWRpby0+aW9fcHJvY19hY3RpdmUgPSBUUlVFOworICB9CisKKyAgY29yZV9hdWRpby0+aW9fcHJvY19uZWVkc19kZWFjdGl2YXRpb24gPSBGQUxTRTsKKworICAvKiBTdGFydCBkZXZpY2UgKi8KKyAgc3RhdHVzID0gQXVkaW9EZXZpY2VTdGFydCAoY29yZV9hdWRpby0+ZGV2aWNlX2lkLCBjb3JlX2F1ZGlvLT5wcm9jSUQpOworICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoY29yZV9hdWRpby0+b3N4YnVmLAorICAgICAgICAiQXVkaW9EZXZpY2VTdGFydCBmYWlsZWQ6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ2Jvb2xlYW4KK19pb19wcm9jX3NwZGlmX3N0b3AgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIE9TRXJyIHN0YXR1czsKKworICAvKiBTdG9wIGRldmljZSAqLworICBzdGF0dXMgPSBBdWRpb0RldmljZVN0b3AgKGNvcmVfYXVkaW8tPmRldmljZV9pZCwgY29yZV9hdWRpby0+cHJvY0lEKTsKKyAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNvcmVfYXVkaW8tPm9zeGJ1ZiwKKyAgICAgICAgIkF1ZGlvRGV2aWNlU3RvcCBmYWlsZWQ6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGNvcmVfYXVkaW8sCisgICAgICAib3N4IHJpbmcgYnVmZmVyIHN0b3AgaW9wcm9jIElEOiAlcCBkZXZpY2VfaWQgJWx1IiwKKyAgICAgIGNvcmVfYXVkaW8tPnByb2NJRCwgKGd1bG9uZykgY29yZV9hdWRpby0+ZGV2aWNlX2lkKTsKKworICBpZiAoY29yZV9hdWRpby0+aW9fcHJvY19hY3RpdmUpIHsKKyAgICBfcmVtb3ZlX3JlbmRlcl9zcGRpZl9jYWxsYmFjayAoY29yZV9hdWRpbyk7CisgIH0KKworICBfY2xvc2Vfc3BkaWYgKGNvcmVfYXVkaW8pOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKgorICogICBJbXBsZW1lbnRhdGlvbiAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGdib29sZWFuCitnc3RfY29yZV9hdWRpb19vcGVuX2ltcGwgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIGdib29sZWFuIHJldDsKKworICAvKiBUaGUgZm9sbG93aW5nIGlzIG5lZWRlZCB0byBpbnN0cnVjdCBIQUwgdG8gY3JlYXRlIHRoZWlyIG93bgorICAgKiB0aHJlYWQgdG8gaGFuZGxlIHRoZSBub3RpZmljYXRpb25zLiAqLworICBfYXVkaW9fc3lzdGVtX3NldF9ydW5sb29wIChOVUxMKTsKKworICAvKiBDcmVhdGUgYSBIQUxPdXRwdXQgQXVkaW9Vbml0LgorICAgKiBUaGlzIGlzIHRoZSBsb3dlc3QtbGV2ZWwgb3V0cHV0IEFQSSB0aGF0IGlzIGFjdHVhbGx5IHNlbnNpYmx5CisgICAqIHVzYWJsZSAodGhlIGxvd2VyIGxldmVsIG9uZXMgcmVxdWlyZSB0aGF0IHlvdSBkbworICAgKiBjaGFubmVsLXJlbWFwcGluZyB5b3Vyc2VsZiwgYW5kIHRoZSBDb3JlQXVkaW8gY2hhbm5lbCBtYXBwaW5nCisgICAqIGlzIHN1ZmZpY2llbnRseSBjb21wbGV4IHRoYXQgZG9pbmcgc28gd291bGQgYmUgdmVyeSBkaWZmaWN1bHQpCisgICAqCisgICAqIE5vdGUgdGhhdCBmb3IgaW5wdXQgd2UgcmVxdWVzdCBhbiBvdXRwdXQgdW5pdCBldmVuIHRob3VnaAorICAgKiB3ZSB3aWxsIGRvIGlucHV0IHdpdGggaXQuCisgICAqIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3RlY2hub3Rlcy90bjIwMDIvdG4yMDkxLmh0bWwKKyAgICovCisgIHJldCA9IGdzdF9jb3JlX2F1ZGlvX29wZW5fZGV2aWNlIChjb3JlX2F1ZGlvLCBrQXVkaW9Vbml0U3ViVHlwZV9IQUxPdXRwdXQsCisgICAgICAiSEFMT3V0cHV0Iik7CisgIGlmICghcmV0KSB7CisgICAgR1NUX0RFQlVHICgiQ291bGQgbm90IG9wZW4gZGV2aWNlIik7CisgICAgZ290byBkb25lOworICB9CisKKyAgcmV0ID0gZ3N0X2NvcmVfYXVkaW9fYmluZF9kZXZpY2UgKGNvcmVfYXVkaW8pOworICBpZiAoIXJldCkgeworICAgIEdTVF9ERUJVRyAoIkNvdWxkIG5vdCBiaW5kIGRldmljZSIpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCitkb25lOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9jb3JlX2F1ZGlvX3N0YXJ0X3Byb2Nlc3NpbmdfaW1wbCAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbykKK3sKKyAgaWYgKGNvcmVfYXVkaW8tPmlzX3Bhc3N0aHJvdWdoKSB7CisgICAgcmV0dXJuIF9pb19wcm9jX3NwZGlmX3N0YXJ0IChjb3JlX2F1ZGlvKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZ3N0X2NvcmVfYXVkaW9faW9fcHJvY19zdGFydCAoY29yZV9hdWRpbyk7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfY29yZV9hdWRpb19wYXVzZV9wcm9jZXNzaW5nX2ltcGwgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIGlmIChjb3JlX2F1ZGlvLT5pc19wYXNzdGhyb3VnaCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvcmVfYXVkaW8sCisgICAgICAgICJvc3ggcmluZyBidWZmZXIgcGF1c2UgaW9wcm9jIElEOiAlcCBkZXZpY2VfaWQgJWx1IiwKKyAgICAgICAgY29yZV9hdWRpby0+cHJvY0lELCAoZ3Vsb25nKSBjb3JlX2F1ZGlvLT5kZXZpY2VfaWQpOworCisgICAgaWYgKGNvcmVfYXVkaW8tPmlvX3Byb2NfYWN0aXZlKSB7CisgICAgICBfcmVtb3ZlX3JlbmRlcl9zcGRpZl9jYWxsYmFjayAoY29yZV9hdWRpbyk7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvcmVfYXVkaW8sCisgICAgICAgICJvc3ggcmluZyBidWZmZXIgcGF1c2UgaW9wcm9jOiAlcCBkZXZpY2VfaWQgJWx1IiwKKyAgICAgICAgY29yZV9hdWRpby0+ZWxlbWVudC0+aW9fcHJvYywgKGd1bG9uZykgY29yZV9hdWRpby0+ZGV2aWNlX2lkKTsKKyAgICBpZiAoY29yZV9hdWRpby0+aW9fcHJvY19hY3RpdmUpIHsKKyAgICAgIC8qIENvcmVBdWRpbyBpc24ndCB0aHJlYWRzYWZlIGVub3VnaCB0byBkbyB0aGlzIGhlcmU7CisgICAgICAgKiB3ZSBtdXN0IGRlYWN0aXZhdGUgdGhlIHJlbmRlciBjYWxsYmFjayBlbHNld2hlcmUuIFNlZToKKyAgICAgICAqIGh0dHA6Ly9saXN0cy5hcHBsZS5jb20vYXJjaGl2ZXMvQ29yZWF1ZGlvLWFwaS8yMDA2L01hci9tc2cwMDAxMC5odG1sCisgICAgICAgKi8KKyAgICAgIGNvcmVfYXVkaW8tPmlvX3Byb2NfbmVlZHNfZGVhY3RpdmF0aW9uID0gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9fc3RvcF9wcm9jZXNzaW5nX2ltcGwgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIGlmIChjb3JlX2F1ZGlvLT5pc19wYXNzdGhyb3VnaCkgeworICAgIF9pb19wcm9jX3NwZGlmX3N0b3AgKGNvcmVfYXVkaW8pOworICB9IGVsc2UgeworICAgIGdzdF9jb3JlX2F1ZGlvX2lvX3Byb2Nfc3RvcCAoY29yZV9hdWRpbyk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfY29yZV9hdWRpb19nZXRfc2FtcGxlc19hbmRfbGF0ZW5jeV9pbXBsIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvLAorICAgIGdkb3VibGUgcmF0ZSwgZ3VpbnQgKiBzYW1wbGVzLCBnZG91YmxlICogbGF0ZW5jeSkKK3sKKyAgT1NTdGF0dXMgc3RhdHVzOworICBVSW50MzIgc2l6ZSA9IHNpemVvZiAoZG91YmxlKTsKKworICBpZiAoY29yZV9hdWRpby0+aXNfcGFzc3Rocm91Z2gpIHsKKyAgICAqc2FtcGxlcyA9IF9hdWRpb19kZXZpY2VfZ2V0X2xhdGVuY3kgKGNvcmVfYXVkaW8tPmRldmljZV9pZCk7CisgICAgKnNhbXBsZXMgKz0gX2F1ZGlvX3N0cmVhbV9nZXRfbGF0ZW5jeSAoY29yZV9hdWRpby0+c3RyZWFtX2lkKTsKKyAgICAqbGF0ZW5jeSA9IChkb3VibGUpICpzYW1wbGVzIC8gcmF0ZTsKKyAgfSBlbHNlIHsKKyAgICBzdGF0dXMgPSBBdWRpb1VuaXRHZXRQcm9wZXJ0eSAoY29yZV9hdWRpby0+YXVkaW91bml0LCBrQXVkaW9Vbml0UHJvcGVydHlfTGF0ZW5jeSwga0F1ZGlvVW5pdFNjb3BlX0dsb2JhbCwgMCwgICAgICAgIC8qIE4vQSBmb3IgZ2xvYmFsICovCisgICAgICAgIGxhdGVuY3ksICZzaXplKTsKKworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29yZV9hdWRpby0+b3N4YnVmLCAiRmFpbGVkIHRvIGdldCBsYXRlbmN5OiAlZCIsCisgICAgICAgICAgKGludCkgc3RhdHVzKTsKKyAgICAgICpzYW1wbGVzID0gMDsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAqc2FtcGxlcyA9ICpsYXRlbmN5ICogcmF0ZTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfY29yZV9hdWRpb19pbml0aWFsaXplX2ltcGwgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8sCisgICAgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uIGZvcm1hdCwgR3N0Q2FwcyAqIGNhcHMsCisgICAgZ2Jvb2xlYW4gaXNfcGFzc3Rocm91Z2gsIGd1aW50MzIgKiBmcmFtZV9zaXplKQoreworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKyAgT1NTdGF0dXMgc3RhdHVzOworCisgIC8qIFVuaW5pdGlhbGl6ZSB0aGUgQXVkaW9Vbml0IGJlZm9yZSBjaGFuZ2luZyBmb3JtYXRzICovCisgIHN0YXR1cyA9IEF1ZGlvVW5pdFVuaW5pdGlhbGl6ZSAoY29yZV9hdWRpby0+YXVkaW91bml0KTsKKyAgaWYgKHN0YXR1cykgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNvcmVfYXVkaW8sICJGYWlsZWQgdG8gdW5pbml0aWFsaXplIEF1ZGlvVW5pdDogJWQiLAorICAgICAgICAoaW50KSBzdGF0dXMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGNvcmVfYXVkaW8tPmlzX3Bhc3N0aHJvdWdoID0gaXNfcGFzc3Rocm91Z2g7CisgIGlmIChpc19wYXNzdGhyb3VnaCkgeworICAgIGlmICghX2FjcXVpcmVfc3BkaWYgKGNvcmVfYXVkaW8sIGZvcm1hdCkpCisgICAgICBnb3RvIGRvbmU7CisgICAgX21vbml0b3JpemVfc3BkaWYgKGNvcmVfYXVkaW8pOworICB9IGVsc2UgeworICAgIE9TU3RhdHVzIHN0YXR1czsKKyAgICBVSW50MzIgcHJvcGVydHlTaXplOworCisgICAgY29yZV9hdWRpby0+c3RyZWFtX2lkeCA9IDA7CisgICAgaWYgKCFnc3RfY29yZV9hdWRpb19zZXRfZm9ybWF0IChjb3JlX2F1ZGlvLCBmb3JtYXQpKQorICAgICAgZ290byBkb25lOworCisgICAgaWYgKCFnc3RfY29yZV9hdWRpb19zZXRfY2hhbm5lbF9sYXlvdXQgKGNvcmVfYXVkaW8sCisgICAgICAgICAgICBmb3JtYXQubUNoYW5uZWxzUGVyRnJhbWUsIGNhcHMpKQorICAgICAgZ290byBkb25lOworCisgICAgaWYgKGNvcmVfYXVkaW8tPmlzX3NyYykgeworICAgICAgcHJvcGVydHlTaXplID0gc2l6ZW9mICgqZnJhbWVfc2l6ZSk7CisgICAgICBzdGF0dXMgPSBBdWRpb1VuaXRHZXRQcm9wZXJ0eSAoY29yZV9hdWRpby0+YXVkaW91bml0LCBrQXVkaW9EZXZpY2VQcm9wZXJ0eUJ1ZmZlckZyYW1lU2l6ZSwga0F1ZGlvVW5pdFNjb3BlX0dsb2JhbCwgMCwgICAgIC8qIE4vQSBmb3IgZ2xvYmFsICovCisgICAgICAgICAgZnJhbWVfc2l6ZSwgJnByb3BlcnR5U2l6ZSk7CisKKyAgICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb3JlX2F1ZGlvLT5vc3hidWYsICJGYWlsZWQgdG8gZ2V0IGZyYW1lIHNpemU6ICVkIiwKKyAgICAgICAgICAgIChpbnQpIHN0YXR1cyk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXQgPSBUUlVFOworCitkb25lOgorICAvKiBGb3JtYXQgY2hhbmdlZCwgaW5pdGlhbGlzZSB0aGUgQXVkaW9Vbml0IGFnYWluICovCisgIHN0YXR1cyA9IEF1ZGlvVW5pdEluaXRpYWxpemUgKGNvcmVfYXVkaW8tPmF1ZGlvdW5pdCk7CisgIGlmIChzdGF0dXMpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChjb3JlX2F1ZGlvLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgQXVkaW9Vbml0OiAlZCIsCisgICAgICAgIChpbnQpIHN0YXR1cyk7CisgICAgcmV0ID0gRkFMU0U7CisgIH0KKworICBpZiAocmV0KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoY29yZV9hdWRpbywgIm9zeGJ1ZiByaW5nIGJ1ZmZlciBhY3F1aXJlZCIpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfY29yZV9hdWRpb19zZWxlY3RfZGV2aWNlX2ltcGwgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIEF1ZGlvRGV2aWNlSUQgKmRldmljZXMgPSBOVUxMOworICBBdWRpb0RldmljZUlEIGRldmljZV9pZCA9IGNvcmVfYXVkaW8tPmRldmljZV9pZDsKKyAgQXVkaW9EZXZpY2VJRCBkZWZhdWx0X2RldmljZV9pZCA9IDA7CisgIGdpbnQgaSwgbmRldmljZXMgPSAwOworICBnYm9vbGVhbiBvdXRwdXQgPSAhY29yZV9hdWRpby0+aXNfc3JjOworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKyNpZmRlZiBHU1RfQ09SRV9BVURJT19ERUJVRworICBBdWRpb0NoYW5uZWxMYXlvdXQgKmNoYW5uZWxfbGF5b3V0OworI2VuZGlmCisKKyAgZGV2aWNlcyA9IF9hdWRpb19zeXN0ZW1fZ2V0X2RldmljZXMgKCZuZGV2aWNlcyk7CisKKyAgaWYgKG5kZXZpY2VzIDwgMSkgeworICAgIEdTVF9FUlJPUiAoIm5vIGF1ZGlvIG91dHB1dCBkZXZpY2VzIGZvdW5kIik7CisgICAgZ290byBkb25lOworICB9CisKKyAgR1NUX0RFQlVHICgiZm91bmQgJWQgYXVkaW8gZGV2aWNlKHMpIiwgbmRldmljZXMpOworCisjaWZkZWYgR1NUX0NPUkVfQVVESU9fREVCVUcKKyAgZm9yIChpID0gMDsgaSA8IG5kZXZpY2VzOyBpKyspIHsKKyAgICBnY2hhciAqZGV2aWNlX25hbWU7CisKKyAgICBpZiAoKGRldmljZV9uYW1lID0gX2F1ZGlvX2RldmljZV9nZXRfbmFtZSAoZGV2aWNlc1tpXSwgb3V0cHV0KSkpIHsKKyAgICAgIGlmICghX2F1ZGlvX2RldmljZV9oYXNfb3V0cHV0IChkZXZpY2VzW2ldKSkgeworICAgICAgICBHU1RfREVCVUcgKCJJbnB1dCBEZXZpY2UgSUQ6ICV1IE5hbWU6ICVzIiwKKyAgICAgICAgICAgICh1bnNpZ25lZCkgZGV2aWNlc1tpXSwgZGV2aWNlX25hbWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHICgiT3V0cHV0IERldmljZSBJRDogJXUgTmFtZTogJXMiLAorICAgICAgICAgICAgKHVuc2lnbmVkKSBkZXZpY2VzW2ldLCBkZXZpY2VfbmFtZSk7CisKKyAgICAgICAgY2hhbm5lbF9sYXlvdXQgPQorICAgICAgICAgICAgZ3N0X2NvcmVfYXVkaW9fYXVkaW9fZGV2aWNlX2dldF9jaGFubmVsX2xheW91dCAoZGV2aWNlc1tpXSwgb3V0cHV0KTsKKyAgICAgICAgaWYgKGNoYW5uZWxfbGF5b3V0KSB7CisgICAgICAgICAgZ3N0X2NvcmVfYXVkaW9fZHVtcF9jaGFubmVsX2xheW91dCAoY2hhbm5lbF9sYXlvdXQpOworICAgICAgICAgIGdfZnJlZSAoY2hhbm5lbF9sYXlvdXQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGdfZnJlZSAoZGV2aWNlX25hbWUpOworICAgIH0KKyAgfQorI2VuZGlmCisKKyAgLyogRmluZCB0aGUgSUQgb2YgdGhlIGRlZmF1bHQgb3V0cHV0IGRldmljZSAqLworICBkZWZhdWx0X2RldmljZV9pZCA9IF9hdWRpb19zeXN0ZW1fZ2V0X2RlZmF1bHRfZGV2aWNlIChvdXRwdXQpOworCisgIC8qIEhlcmUgd2UgZGVjaWRlIGlmIHNlbGVjdGVkIGRldmljZSBpcyB2YWxpZCBvciBhdXRvc2VsZWN0CisgICAqIHRoZSBkZWZhdWx0IG9uZSB3aGVuIHJlcXVpcmVkICovCisgIGlmIChkZXZpY2VfaWQgPT0ga0F1ZGlvRGV2aWNlVW5rbm93bikgeworICAgIGlmIChkZWZhdWx0X2RldmljZV9pZCAhPSBrQXVkaW9EZXZpY2VVbmtub3duKSB7CisgICAgICBkZXZpY2VfaWQgPSBkZWZhdWx0X2RldmljZV9pZDsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9FUlJPUiAoIk5vIGRldmljZSBvZiByZXF1aXJlZCB0eXBlIGF2YWlsYWJsZSIpOworICAgICAgcmVzID0gRkFMU0U7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCBuZGV2aWNlczsgaSsrKSB7CisgICAgICBpZiAoZGV2aWNlX2lkID09IGRldmljZXNbaV0pIHsKKyAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHJlcyAmJiAhX2F1ZGlvX2RldmljZV9pc19hbGl2ZSAoZGV2aWNlX2lkLCBvdXRwdXQpKSB7CisgICAgICBHU1RfRVJST1IgKCJSZXF1ZXN0ZWQgZGV2aWNlIG5vdCB1c2FibGUiKTsKKyAgICAgIHJlcyA9IEZBTFNFOworICAgICAgZ290byBkb25lOworICAgIH0KKyAgfQorCisgIGlmIChyZXMpCisgICAgY29yZV9hdWRpby0+ZGV2aWNlX2lkID0gZGV2aWNlX2lkOworCitkb25lOgorICBnX2ZyZWUgKGRldmljZXMpOworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9jb3JlX2F1ZGlvX2F1ZGlvX2RldmljZV9pc19zcGRpZl9hdmFpbF9pbXBsIChBdWRpb0RldmljZUlEIGRldmljZV9pZCkKK3sKKyAgQXVkaW9TdHJlYW1JRCAqc3RyZWFtcyA9IE5VTEw7CisgIGdpbnQgaSwgbnN0cmVhbXMgPSAwOworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKworICBzdHJlYW1zID0gX2F1ZGlvX2RldmljZV9nZXRfc3RyZWFtcyAoZGV2aWNlX2lkLCAmbnN0cmVhbXMpOworICBHU1RfREVCVUcgKCJmb3VuZCAlZCBzdHJlYW1zIiwgbnN0cmVhbXMpOworICBpZiAoc3RyZWFtcykgeworICAgIGZvciAoaSA9IDA7IGkgPCBuc3RyZWFtczsgaSsrKSB7CisgICAgICBpZiAoX2F1ZGlvX3N0cmVhbV9pc19zcGRpZl9hdmFpbCAoc3RyZWFtc1tpXSkpIHsKKyAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnX2ZyZWUgKHN0cmVhbXMpOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KZGlmZiAtLWdpdCBhL3N5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9yZW1vdGVpby5jIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb3JlbW90ZWlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZiMGViYQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9yZW1vdGVpby5jCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgRmx1ZW5kbyBTLkEuIDxzdXBwb3J0QGZsdWVuZG8uY29tPgorICogICBBdXRob3JzOiBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPGFtb3JhbGVzQGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaW1wb3J0IDxBdWRpb1VuaXQvQVVDb21wb25lbnQuaD4KKworc3RhdGljIGdib29sZWFuCitnc3RfY29yZV9hdWRpb19vcGVuX2ltcGwgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIHJldHVybiBnc3RfY29yZV9hdWRpb19vcGVuX2RldmljZSAoY29yZV9hdWRpbywga0F1ZGlvVW5pdFN1YlR5cGVfUmVtb3RlSU8sCisgICAgICAiUmVtb3RlSU8iKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfY29yZV9hdWRpb19zdGFydF9wcm9jZXNzaW5nX2ltcGwgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIHJldHVybiBnc3RfY29yZV9hdWRpb19pb19wcm9jX3N0YXJ0IChjb3JlX2F1ZGlvKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfY29yZV9hdWRpb19wYXVzZV9wcm9jZXNzaW5nX2ltcGwgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGNvcmVfYXVkaW8sCisgICAgICAib3N4IHJpbmcgYnVmZmVyIHBhdXNlIGlvcHJvYzogJXAgZGV2aWNlX2lkICVsdSIsCisgICAgICBjb3JlX2F1ZGlvLT5lbGVtZW50LT5pb19wcm9jLCAoZ3Vsb25nKSBjb3JlX2F1ZGlvLT5kZXZpY2VfaWQpOworCisgIGlmIChjb3JlX2F1ZGlvLT5pb19wcm9jX2FjdGl2ZSkgeworICAgIC8qIENvcmVBdWRpbyBpc24ndCB0aHJlYWRzYWZlIGVub3VnaCB0byBkbyB0aGlzIGhlcmU7CisgICAgICogd2UgbXVzdCBkZWFjdGl2YXRlIHRoZSByZW5kZXIgY2FsbGJhY2sgZWxzZXdoZXJlLiBTZWU6CisgICAgICogaHR0cDovL2xpc3RzLmFwcGxlLmNvbS9hcmNoaXZlcy9Db3JlYXVkaW8tYXBpLzIwMDYvTWFyL21zZzAwMDEwLmh0bWwKKyAgICAgKi8KKyAgICBjb3JlX2F1ZGlvLT5pb19wcm9jX25lZWRzX2RlYWN0aXZhdGlvbiA9IFRSVUU7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9fc3RvcF9wcm9jZXNzaW5nX2ltcGwgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIGdzdF9jb3JlX2F1ZGlvX2lvX3Byb2Nfc3RvcCAoY29yZV9hdWRpbyk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9jb3JlX2F1ZGlvX2dldF9zYW1wbGVzX2FuZF9sYXRlbmN5X2ltcGwgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8sCisgICAgZ2RvdWJsZSByYXRlLCBndWludCAqIHNhbXBsZXMsIGdkb3VibGUgKiBsYXRlbmN5KQoreworICBPU1N0YXR1cyBzdGF0dXM7CisgIFVJbnQzMiBzaXplID0gc2l6ZW9mIChkb3VibGUpOworCisgIHN0YXR1cyA9IEF1ZGlvVW5pdEdldFByb3BlcnR5IChjb3JlX2F1ZGlvLT5hdWRpb3VuaXQsIGtBdWRpb1VuaXRQcm9wZXJ0eV9MYXRlbmN5LCBrQXVkaW9Vbml0U2NvcGVfR2xvYmFsLCAwLCAgLyogTi9BIGZvciBnbG9iYWwgKi8KKyAgICAgIGxhdGVuY3ksICZzaXplKTsKKworICBpZiAoc3RhdHVzKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb3JlX2F1ZGlvLCAiRmFpbGVkIHRvIGdldCBsYXRlbmN5OiAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgKnNhbXBsZXMgPSAwOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgICpzYW1wbGVzID0gKmxhdGVuY3kgKiByYXRlOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfY29yZV9hdWRpb19pbml0aWFsaXplX2ltcGwgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8sCisgICAgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uIGZvcm1hdCwgR3N0Q2FwcyAqIGNhcHMsCisgICAgZ2Jvb2xlYW4gaXNfcGFzc3Rocm91Z2gsIGd1aW50MzIgKiBmcmFtZV9zaXplKQoreworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKyAgT1NTdGF0dXMgc3RhdHVzOworCisgIC8qIFVuaW5pdGlhbGl6ZSB0aGUgQXVkaW9Vbml0IGJlZm9yZSBjaGFuZ2luZyBmb3JtYXRzICovCisgIHN0YXR1cyA9IEF1ZGlvVW5pdFVuaW5pdGlhbGl6ZSAoY29yZV9hdWRpby0+YXVkaW91bml0KTsKKyAgaWYgKHN0YXR1cykgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNvcmVfYXVkaW8sICJGYWlsZWQgdG8gdW5pbml0aWFsaXplIEF1ZGlvVW5pdDogJWQiLAorICAgICAgICAoaW50KSBzdGF0dXMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGNvcmVfYXVkaW8tPmlzX3Bhc3N0aHJvdWdoID0gaXNfcGFzc3Rocm91Z2g7CisgIGNvcmVfYXVkaW8tPnN0cmVhbV9pZHggPSAwOworCisgIGlmICghZ3N0X2NvcmVfYXVkaW9fc2V0X2Zvcm1hdCAoY29yZV9hdWRpbywgZm9ybWF0KSkKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogRklYTUU6IFVzZSBrQXVkaW9TZXNzaW9uUHJvcGVydHlfQ3VycmVudEhhcmR3YXJlU2FtcGxlUmF0ZSBhbmQKKyAgICoga0F1ZGlvU2Vzc2lvblByb3BlcnR5X0N1cnJlbnRIYXJkd2FyZUlPQnVmZmVyRHVyYXRpb24gd2l0aCBwcm9wZXJ0eQorICAgKiBsaXN0ZW5lcnMgdG8gZGV0ZWN0IGNoYW5nZXMgaW4gc2NyZWVuIGxvY2tzLgorICAgKiBGb3Igbm93IHVzZSB0aGUgbWF4aW11bSB2YWx1ZSAqLworICAqZnJhbWVfc2l6ZSA9IDQxOTY7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoY29yZV9hdWRpbywgIm9zeGJ1ZiByaW5nIGJ1ZmZlciBhY3F1aXJlZCIpOworICByZXQgPSBUUlVFOworCitkb25lOgorICAvKiBGb3JtYXQgY2hhbmdlZCwgaW5pdGlhbGlzZSB0aGUgQXVkaW9Vbml0IGFnYWluICovCisgIHN0YXR1cyA9IEF1ZGlvVW5pdEluaXRpYWxpemUgKGNvcmVfYXVkaW8tPmF1ZGlvdW5pdCk7CisgIGlmIChzdGF0dXMpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChjb3JlX2F1ZGlvLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgQXVkaW9Vbml0OiAlZCIsCisgICAgICAgIChpbnQpIHN0YXR1cyk7CisgICAgcmV0ID0gRkFMU0U7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9jb3JlX2F1ZGlvX3NlbGVjdF9kZXZpY2VfaW1wbCAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbykKK3sKKyAgLyogTm8gZGV2aWNlIHNlbGVjdGlvbiBpbiBpT1MgKi8KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9fYXVkaW9fZGV2aWNlX2lzX3NwZGlmX2F2YWlsX2ltcGwgKEF1ZGlvRGV2aWNlSUQgZGV2aWNlX2lkKQoreworICAvKiBObyBTUERJRiBpbiBpT1MgKi8KKyAgcmV0dXJuIEZBTFNFOworfQpkaWZmIC0tZ2l0IGEvc3lzL29zeHZpZGVvL01ha2VmaWxlLmFtIGIvc3lzL29zeHZpZGVvL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YTNkNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3N4dmlkZW8vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxNyBAQAorCitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3Rvc3h2aWRlby5sYQorCitsaWJnc3Rvc3h2aWRlb19sYV9TT1VSQ0VTID0gb3N4dmlkZW9zaW5rLm0gY29jb2F3aW5kb3cubSAKK2xpYmdzdG9zeHZpZGVvX2xhX0NGTEFHUyA9ICQoR1NUX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKQorbGliZ3N0b3N4dmlkZW9fbGFfT0JKQ0ZMQUdTID0gJChHU1RfT0JKQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpCitsaWJnc3Rvc3h2aWRlb19sYV9MSUJBREQgPSAgXAorCSQoR1NUX0xJQlMpIFwKKwkkKEdTVF9CQVNFX0xJQlMpIFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgXAorCS1sZ3N0dmlkZW8tJChHU1RfQVBJX1ZFUlNJT04pCisKK2xpYmdzdG9zeHZpZGVvX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykgLVdsLC1mcmFtZXdvcmsgLVdsLENvY29hIC1XbCwtZnJhbWV3b3JrIC1XbCxPcGVuR0wKKworbm9pbnN0X0hFQURFUlMgPSBvc3h2aWRlb3NpbmsuaCBjb2NvYXdpbmRvdy5oCmRpZmYgLS1naXQgYS9zeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cuaCBiL3N5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNmYxYmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cuaApAQCAtMCwwICsxLDg2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBQaW9uZWVycyBvZiB0aGUgSW5ldml0YWJsZSA8c29uZ2JpcmRAc29uZ2JpcmRuZXN0LmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKiBUaGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIHdhcyBtYWRlIHBvc3NpYmxlIGR1ZSB0byB0aGUgaW52b2x2ZW1lbnQgb2YgUGlvbmVlcnMgCisgKiBvZiB0aGUgSW5ldml0YWJsZSwgdGhlIGNyZWF0b3JzIG9mIHRoZSBTb25nYmlyZCBNdXNpYyBwbGF5ZXIKKyAqIAorICovCisKKy8qIGluc3BpcmF0aW9uIGdhaW5lZCBmcm9tIGxvb2tpbmcgYXQgc291cmNlIG9mIG9zeCB2aWRlbyBvdXQgb2YgeGluZSBhbmQgdmxjIAorICogYW5kIGlzIHJlZmxlY3RlZCBpbiB0aGUgY29kZQorICovCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0IDxnbGliLmg+CisjaW1wb3J0IDxnc3QvdmlkZW8vbmF2aWdhdGlvbi5oPgorCitzdHJ1Y3QgX0dzdE9TWEltYWdlOworCitAaW50ZXJmYWNlIEdzdEdMVmlldyA6IE5TT3BlbkdMVmlldworeworICAgIGludCBpX2VmZmVjdDsKKyAgICB1bnNpZ25lZCBpbnQgcGlfdGV4dHVyZTsKKyAgICBmbG9hdCBmX3g7CisgICAgZmxvYXQgZl95OworICAgIGludCBpbml0RG9uZTsKKyAgICBjaGFyKiBkYXRhOworICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgIEJPT0wgZnVsbHNjcmVlbjsKKyAgICBCT09MIGtlZXBBc3BlY3RSYXRpbzsKKyAgICBOU09wZW5HTENvbnRleHQqIGZ1bGxTY3JlZW5Db250ZXh0OyAKKyAgICBOU09wZW5HTENvbnRleHQqIGFjdHVhbENvbnRleHQ7CisgICAgTlNUcmFja2luZ0FyZWEgKnRyYWNraW5nQXJlYTsKKyAgICBHc3ROYXZpZ2F0aW9uICpuYXZpZ2F0aW9uOworICAgIE5TUmVjdCBkcmF3aW5nQm91bmRzOworICAgIE5TVGhyZWFkICptYWluVGhyZWFkOworICAgIE5TVUludGVnZXIgc2F2ZWRNb2RpZmllckZsYWdzOworfQorLSAodm9pZCkgZHJhd1F1YWQ7CistICh2b2lkKSBkcmF3UmVjdDogKE5TUmVjdCkgcmVjdDsKKy0gKGlkKSBpbml0V2l0aEZyYW1lOiAoTlNSZWN0KSBmcmFtZTsKKy0gKHZvaWQpIGluaXRUZXh0dXJlczsKKy0gKHZvaWQpIHJlbG9hZFRleHR1cmU7CistICh2b2lkKSBjbGVhblVwOworLSAodm9pZCkgZGlzcGxheVRleHR1cmU7CistIChjaGFyKikgZ2V0VGV4dHVyZUJ1ZmZlcjsKKy0gKHZvaWQpIHNldEZ1bGxTY3JlZW46IChCT09MKSBmbGFnOworLSAodm9pZCkgc2V0S2VlcEFzcGVjdFJhdGlvOiAoQk9PTCkgZmxhZzsKKy0gKHZvaWQpIHJlc2hhcGU7CistICh2b2lkKSBzZXRWaWRlb1NpemU6KGludCl3IDogKGludCloOworLSAoTlNSZWN0KSBnZXREcmF3aW5nQm91bmRzOworLSAoQk9PTCkgaGF2ZVN1cGVydmlldzsKKy0gKHZvaWQpIGhhdmVTdXBlcnZpZXdSZWFsOiAoTlNNdXRhYmxlQXJyYXkgKiljbG9zdXJlOworLSAodm9pZCkgYWRkVG9TdXBlcnZpZXc6IChOU1ZpZXcgKilzdXBlcnZpZXc7CistICh2b2lkKSByZW1vdmVGcm9tU3VwZXJ2aWV3OiAoaWQpdW51c2VkOworLSAodm9pZCkgc2V0TmF2aWdhdGlvbjogKEdzdE5hdmlnYXRpb24gKikgbmF2OworI2lmbmRlZiBHU1RSRUFNRVJfR0xJQl9DT0NPQV9OU0FQUExJQ0FUSU9OCistICh2b2lkKSBzZXRNYWluVGhyZWFkOiAoTlNUaHJlYWQgKikgdGhyZWFkOworI2VuZGlmCisKK0BlbmQKKworQGludGVyZmFjZSBHc3RPU1hWaWRlb1NpbmtXaW5kb3c6IE5TV2luZG93IHsKKyAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgR3N0R0xWaWV3ICpnc3R2aWV3OworfQorCistICh2b2lkKSBzZXRDb250ZW50U2l6ZTogKE5TU2l6ZSkgc2l6ZTsKKy0gKEdzdEdMVmlldyAqKSBnc3RWaWV3OworLSAoaWQpaW5pdFdpdGhDb250ZW50TlNSZWN0OihOU1JlY3QpY29udGVudFJlY3Qgc3R5bGVNYXNrOih1bnNpZ25lZCBpbnQpc3R5bGVNYXNrIGJhY2tpbmc6KE5TQmFja2luZ1N0b3JlVHlwZSlidWZmZXJpbmdUeXBlIGRlZmVyOihCT09MKWZsYWcgc2NyZWVuOihOU1NjcmVlbiAqKWFTY3JlZW47CitAZW5kCmRpZmYgLS1naXQgYS9zeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cubSBiL3N5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYjA0MjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cubQpAQCAtMCwwICsxLDgzNiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUGlvbmVlcnMgb2YgdGhlIEluZXZpdGFibGUgPHNvbmdiaXJkQHNvbmdiaXJkbmVzdC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICogVGhlIGRldmVsb3BtZW50IG9mIHRoaXMgY29kZSB3YXMgbWFkZSBwb3NzaWJsZSBkdWUgdG8gdGhlIGludm9sdmVtZW50IG9mIFBpb25lZXJzCisgKiBvZiB0aGUgSW5ldml0YWJsZSwgdGhlIGNyZWF0b3JzIG9mIHRoZSBTb25nYmlyZCBNdXNpYyBwbGF5ZXIKKyAqCisgKi8KKworLyogaW5zcGlyYXRpb24gZ2FpbmVkIGZyb20gbG9va2luZyBhdCBzb3VyY2Ugb2Ygb3N4IHZpZGVvIG91dCBvZiB4aW5lIGFuZCB2bGMKKyAqIGFuZCBpcyByZWZsZWN0ZWQgaW4gdGhlIGNvZGUKKyAqLworCisKKyNpbmNsdWRlIDxDb2NvYS9Db2NvYS5oPgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbXBvcnQgImNvY29hd2luZG93LmgiCisjaW1wb3J0ICJvc3h2aWRlb3NpbmsuaCIKKworI2luY2x1ZGUgPE9wZW5HTC9PcGVuR0wuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2xleHQuaD4KKworI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KKworLyogRGVidWdnaW5nIGNhdGVnb3J5ICovCisjaW5jbHVkZSA8Z3N0L2dzdGluZm8uaD4KKworI2lmIE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQgPCAxMDEyMDAKKyNkZWZpbmUgTlNFdmVudFR5cGVNb3VzZU1vdmVkICAgICAgICAgICAgICAgIE5TTW91c2VNb3ZlZAorI2RlZmluZSBOU0V2ZW50VHlwZUxlZnRNb3VzZURvd24gICAgICAgICAgICAgTlNMZWZ0TW91c2VEb3duCisjZGVmaW5lIE5TRXZlbnRUeXBlTGVmdE1vdXNlVXAgICAgICAgICAgICAgICBOU0xlZnRNb3VzZVVwCisjZGVmaW5lIE5TRXZlbnRUeXBlUmlnaHRNb3VzZURvd24gICAgICAgICAgICBOU1JpZ2h0TW91c2VEb3duCisjZGVmaW5lIE5TRXZlbnRUeXBlUmlnaHRNb3VzZVVwICAgICAgICAgICAgICBOU1JpZ2h0TW91c2VVcAorI2VuZGlmCisKK3N0YXRpYworY29uc3QgZ2NoYXIqIGdzdF9rZXljb2RlX3RvX2tleW5hbWUoZ2ludDE2IGtleWNvZGUpCit7CisgICAgc3dpdGNoIChrZXljb2RlKQorICAgIHsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfQToKKyAgICAgICAgcmV0dXJuICJhIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfUzoKKyAgICAgICAgcmV0dXJuICJzIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfRDoKKyAgICAgICAgcmV0dXJuICJkIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfRjoKKyAgICAgICAgcmV0dXJuICJmIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfSDoKKyAgICAgICAgcmV0dXJuICJoIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfRzoKKyAgICAgICAgcmV0dXJuICJnIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfWjoKKyAgICAgICAgcmV0dXJuICJ6IjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfWDoKKyAgICAgICAgcmV0dXJuICJ4IjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfQzoKKyAgICAgICAgcmV0dXJuICJjIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfVjoKKyAgICAgICAgcmV0dXJuICJ2IjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfQjoKKyAgICAgICAgcmV0dXJuICJiIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfUToKKyAgICAgICAgcmV0dXJuICJxIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfVzoKKyAgICAgICAgcmV0dXJuICJ3IjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfRToKKyAgICAgICAgcmV0dXJuICJlIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfUjoKKyAgICAgICAgcmV0dXJuICJyIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfWToKKyAgICAgICAgcmV0dXJuICJ5IjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfVDoKKyAgICAgICAgcmV0dXJuICJ0IjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfMToKKyAgICAgICAgcmV0dXJuICIxIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfMjoKKyAgICAgICAgcmV0dXJuICIyIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfMzoKKyAgICAgICAgcmV0dXJuICIzIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfNDoKKyAgICAgICAgcmV0dXJuICI0IjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfNjoKKyAgICAgICAgcmV0dXJuICI2IjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfNToKKyAgICAgICAgcmV0dXJuICI1IjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfRXF1YWw6CisgICAgICAgIHJldHVybiAiZXF1YWwiOworICAgICAgY2FzZSBrVktfQU5TSV85OgorICAgICAgICByZXR1cm4gIjkiOworICAgICAgY2FzZSBrVktfQU5TSV83OgorICAgICAgICByZXR1cm4gIjciOworICAgICAgY2FzZSBrVktfQU5TSV9NaW51czoKKyAgICAgICAgcmV0dXJuICJtaW51cyI7CisgICAgICBjYXNlIGtWS19BTlNJXzg6CisgICAgICAgIHJldHVybiAiOCI7CisgICAgICBjYXNlIGtWS19BTlNJXzA6CisgICAgICAgIHJldHVybiAiMCI7CisgICAgICBjYXNlIGtWS19BTlNJX1JpZ2h0QnJhY2tldDoKKyAgICAgICAgcmV0dXJuICJicmFja2V0cmlnaHQiOworICAgICAgY2FzZSBrVktfQU5TSV9POgorICAgICAgICByZXR1cm4gIjAiOworICAgICAgY2FzZSBrVktfQU5TSV9VOgorICAgICAgICByZXR1cm4gInUiOworICAgICAgY2FzZSBrVktfQU5TSV9MZWZ0QnJhY2tldDoKKyAgICAgICAgcmV0dXJuICJicmFja2V0bGVmdCI7CisgICAgICBjYXNlIGtWS19BTlNJX0k6CisgICAgICAgIHJldHVybiAiaSI7CisgICAgICBjYXNlIGtWS19BTlNJX1A6CisgICAgICAgIHJldHVybiAicCI7CisgICAgICBjYXNlIGtWS19BTlNJX0w6CisgICAgICAgIHJldHVybiAibCI7CisgICAgICBjYXNlIGtWS19BTlNJX0o6CisgICAgICAgIHJldHVybiAiaiI7CisgICAgICBjYXNlIGtWS19BTlNJX1F1b3RlOgorICAgICAgICByZXR1cm4gImFwb3N0cm9waGUiOworICAgICAgY2FzZSBrVktfQU5TSV9LOgorICAgICAgICByZXR1cm4gImsiOworICAgICAgY2FzZSBrVktfQU5TSV9TZW1pY29sb246CisgICAgICAgIHJldHVybiAic2VtaWNvbG9uIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfQmFja3NsYXNoOgorICAgICAgICByZXR1cm4gImJhY2tzbGFzaCI7CisgICAgICBjYXNlIGtWS19BTlNJX0NvbW1hOgorICAgICAgICByZXR1cm4gImNvbW1hIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfU2xhc2g6CisgICAgICAgIHJldHVybiAic2xhc2giOworICAgICAgY2FzZSBrVktfQU5TSV9OOgorICAgICAgICByZXR1cm4gIm4iOworICAgICAgY2FzZSBrVktfQU5TSV9NOgorICAgICAgICByZXR1cm4gIm0iOworICAgICAgY2FzZSBrVktfQU5TSV9QZXJpb2Q6CisgICAgICAgIHJldHVybiAicGVyaW9kIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfR3JhdmU6CisgICAgICAgIHJldHVybiAiZ3JhdmUiOworICAgICAgY2FzZSBrVktfQU5TSV9LZXlwYWREZWNpbWFsOgorICAgICAgICByZXR1cm4gIktQX0RlbGV0ZSI7CisgICAgICBjYXNlIGtWS19BTlNJX0tleXBhZE11bHRpcGx5OgorICAgICAgICByZXR1cm4gIktQX011bHRpcGx5IjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfS2V5cGFkUGx1czoKKyAgICAgICAgcmV0dXJuICJLUF9BZGQiOworICAgICAgY2FzZSBrVktfQU5TSV9LZXlwYWRDbGVhcjoKKyAgICAgICAgcmV0dXJuICJLUF9DbGVhciI7CisgICAgICBjYXNlIGtWS19BTlNJX0tleXBhZERpdmlkZToKKyAgICAgICAgcmV0dXJuICJLUF9EaXZpZGUiOworICAgICAgY2FzZSBrVktfQU5TSV9LZXlwYWRFbnRlcjoKKyAgICAgICAgcmV0dXJuICJLUF9FbnRlciI7CisgICAgICBjYXNlIGtWS19BTlNJX0tleXBhZE1pbnVzOgorICAgICAgICByZXR1cm4gIktQX1N1YnRyYWN0IjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfS2V5cGFkRXF1YWxzOgorICAgICAgICByZXR1cm4gIktQX0VxdWFscyI7CisgICAgICBjYXNlIGtWS19BTlNJX0tleXBhZDA6CisgICAgICAgIHJldHVybiAiS1BfSW5zZXJ0IjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfS2V5cGFkMToKKyAgICAgICAgcmV0dXJuICJLUF9FbmQiOworICAgICAgY2FzZSBrVktfQU5TSV9LZXlwYWQyOgorICAgICAgICByZXR1cm4gIktQX0Rvd24iOworICAgICAgY2FzZSBrVktfQU5TSV9LZXlwYWQzOgorICAgICAgICByZXR1cm4gIktQX05leHQiOworICAgICAgY2FzZSBrVktfQU5TSV9LZXlwYWQ0OgorICAgICAgICByZXR1cm4gIktQX0xlZnQiOworICAgICAgY2FzZSBrVktfQU5TSV9LZXlwYWQ1OgorICAgICAgICByZXR1cm4gIktQX0JlZ2luIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfS2V5cGFkNjoKKyAgICAgICAgcmV0dXJuICJLUF9SaWdodCI7CisgICAgICBjYXNlIGtWS19BTlNJX0tleXBhZDc6CisgICAgICAgIHJldHVybiAiS1BfSG9tZSI7CisgICAgICBjYXNlIGtWS19BTlNJX0tleXBhZDg6CisgICAgICAgIHJldHVybiAiS1BfVXAiOworICAgICAgY2FzZSBrVktfQU5TSV9LZXlwYWQ5OgorICAgICAgICByZXR1cm4gIktQX1ByaW9yIjsKKworICAgIC8qIGtleWNvZGVzIGZvciBrZXlzIHRoYXQgYXJlIGluZGVwZW5kZW50IG9mIGtleWJvYXJkIGxheW91dCovCisKKyAgICAgIGNhc2Uga1ZLX1JldHVybjoKKyAgICAgICAgcmV0dXJuICJSZXR1cm4iOworICAgICAgY2FzZSBrVktfVGFiOgorICAgICAgICByZXR1cm4gIlRhYiI7CisgICAgICBjYXNlIGtWS19TcGFjZToKKyAgICAgICAgcmV0dXJuICJzcGFjZSI7CisgICAgICBjYXNlIGtWS19EZWxldGU6CisgICAgICAgIHJldHVybiAiQmFja3NwYWNlIjsKKyAgICAgIGNhc2Uga1ZLX0VzY2FwZToKKyAgICAgICAgcmV0dXJuICJFc2NhcGUiOworICAgICAgY2FzZSBrVktfQ29tbWFuZDoKKyAgICAgICAgcmV0dXJuICJDb21tYW5kIjsKKyAgICAgIGNhc2Uga1ZLX1NoaWZ0OgorICAgICAgICByZXR1cm4gIlNoaWZ0X0wiOworICAgICAgY2FzZSBrVktfQ2Fwc0xvY2s6CisgICAgICAgIHJldHVybiAiQ2Fwc19Mb2NrIjsKKyAgICAgIGNhc2Uga1ZLX09wdGlvbjoKKyAgICAgICAgcmV0dXJuICJPcHRpb25fTCI7CisgICAgICBjYXNlIGtWS19Db250cm9sOgorICAgICAgICByZXR1cm4gIkNvbnRyb2xfTCI7CisgICAgICBjYXNlIGtWS19SaWdodFNoaWZ0OgorICAgICAgICByZXR1cm4gIlNoaWZ0X1IiOworICAgICAgY2FzZSBrVktfUmlnaHRPcHRpb246CisgICAgICAgIHJldHVybiAiT3B0aW9uX1IiOworICAgICAgY2FzZSBrVktfUmlnaHRDb250cm9sOgorICAgICAgICByZXR1cm4gIkNvbnRyb2xfUiI7CisgICAgICBjYXNlIGtWS19GdW5jdGlvbjoKKyAgICAgICAgcmV0dXJuICJGdW5jdGlvbiI7CisgICAgICBjYXNlIGtWS19GMTc6CisgICAgICAgIHJldHVybiAiRjE3IjsKKyAgICAgIGNhc2Uga1ZLX1ZvbHVtZVVwOgorICAgICAgICByZXR1cm4gIlZvbHVtZVVwIjsKKyAgICAgIGNhc2Uga1ZLX1ZvbHVtZURvd246CisgICAgICAgIHJldHVybiAiVm9sdW1lRG93biI7CisgICAgICBjYXNlIGtWS19NdXRlOgorICAgICAgICByZXR1cm4gIk11dGUiOworICAgICAgY2FzZSBrVktfRjE4OgorICAgICAgICByZXR1cm4gIkYxOCI7CisgICAgICBjYXNlIGtWS19GMTk6CisgICAgICAgIHJldHVybiAiRjE5IjsKKyAgICAgIGNhc2Uga1ZLX0YyMDoKKyAgICAgICAgcmV0dXJuICJGMjAiOworICAgICAgY2FzZSBrVktfRjU6CisgICAgICAgIHJldHVybiAiRjUiOworICAgICAgY2FzZSBrVktfRjY6CisgICAgICAgIHJldHVybiAiRjYiOworICAgICAgY2FzZSBrVktfRjc6CisgICAgICAgIHJldHVybiAiRjciOworICAgICAgY2FzZSBrVktfRjM6CisgICAgICAgIHJldHVybiAiRjMiOworICAgICAgY2FzZSBrVktfRjg6CisgICAgICAgIHJldHVybiAiRjgiOworICAgICAgY2FzZSBrVktfRjk6CisgICAgICAgIHJldHVybiAiRjkiOworICAgICAgY2FzZSBrVktfRjExOgorICAgICAgICByZXR1cm4gIkYxMSI7CisgICAgICBjYXNlIGtWS19GMTM6CisgICAgICAgIHJldHVybiAiRjEzIjsKKyAgICAgIGNhc2Uga1ZLX0YxNjoKKyAgICAgICAgcmV0dXJuICJGMTYiOworICAgICAgY2FzZSBrVktfRjE0OgorICAgICAgICByZXR1cm4gIkYxNCI7CisgICAgICBjYXNlIGtWS19GMTA6CisgICAgICAgIHJldHVybiAiRjEwIjsKKyAgICAgIGNhc2Uga1ZLX0YxMjoKKyAgICAgICAgcmV0dXJuICJGMTIiOworICAgICAgY2FzZSBrVktfRjE1OgorICAgICAgICByZXR1cm4gIkYxNSI7CisgICAgICBjYXNlIGtWS19IZWxwOgorICAgICAgICByZXR1cm4gIkhlbHAiOworICAgICAgY2FzZSBrVktfSG9tZToKKyAgICAgICAgcmV0dXJuICJIb21lIjsKKyAgICAgIGNhc2Uga1ZLX1BhZ2VVcDoKKyAgICAgICAgcmV0dXJuICJQcmlvciI7CisgICAgICBjYXNlIGtWS19Gb3J3YXJkRGVsZXRlOgorICAgICAgICByZXR1cm4gIkRlbGV0ZSI7CisgICAgICBjYXNlIGtWS19GNDoKKyAgICAgICAgcmV0dXJuICJGNCI7CisgICAgICBjYXNlIGtWS19FbmQ6CisgICAgICAgIHJldHVybiAiRW5kIjsKKyAgICAgIGNhc2Uga1ZLX0YyOgorICAgICAgICByZXR1cm4gIkYyIjsKKyAgICAgIGNhc2Uga1ZLX1BhZ2VEb3duOgorICAgICAgICByZXR1cm4gIk5leHQiOworICAgICAgY2FzZSBrVktfRjE6CisgICAgICAgIHJldHVybiAiRjEiOworICAgICAgY2FzZSBrVktfTGVmdEFycm93OgorICAgICAgICByZXR1cm4gIkxlZnQiOworICAgICAgY2FzZSBrVktfUmlnaHRBcnJvdzoKKyAgICAgICAgcmV0dXJuICJSaWdodCI7CisgICAgICBjYXNlIGtWS19Eb3duQXJyb3c6CisgICAgICAgIHJldHVybiAiRG93biI7CisgICAgICBjYXNlIGtWS19VcEFycm93OgorICAgICAgICByZXR1cm4gIlVwIjsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gIiI7CisgIH07Cit9CisKK0AgaW1wbGVtZW50YXRpb24gR3N0T1NYVmlkZW9TaW5rV2luZG93CisKKy8qIFRoZSBvYmplY3QgaGFzIHRvIGJlIHJlbGVhc2VkICovCistIChpZCkgaW5pdFdpdGhDb250ZW50TlNSZWN0OiAoTlNSZWN0KSByZWN0CisJCSBzdHlsZU1hc2s6ICh1bnNpZ25lZCBpbnQpIHN0eWxlTWFzaworCQkgICBiYWNraW5nOiAoTlNCYWNraW5nU3RvcmVUeXBlKSBidWZmZXJpbmdUeXBlCisJCSAgICAgZGVmZXI6IChCT09MKSBmbGFnCisJCSAgICBzY3JlZW46KE5TU2NyZWVuICopIGFTY3JlZW4KK3sKKyAgc2VsZiA9IFtzdXBlciBpbml0V2l0aENvbnRlbnRSZWN0OiByZWN0CisJCXN0eWxlTWFzazogc3R5bGVNYXNrCisJCWJhY2tpbmc6IGJ1ZmZlcmluZ1R5cGUKKwkJZGVmZXI6IGZsYWcKKwkJc2NyZWVuOmFTY3JlZW5dOworCisgIEdTVF9ERUJVRyAoIkluaXRpYWxpemluZyBHc3RPU1h2aWRlb1NpbmtXaW5kb3ciKTsKKworICBnc3R2aWV3ID0gW1tHc3RHTFZpZXcgYWxsb2NdIGluaXRXaXRoRnJhbWU6cmVjdF07CisKKyAgaWYgKGdzdHZpZXcpCisgICAgW3NlbGYgc2V0Q29udGVudFZpZXc6Z3N0dmlld107CisgIFtzZWxmIHNldFRpdGxlOkAiR1N0cmVhbWVyIFZpZGVvIE91dHB1dCJdOworCisgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBzZXRDb250ZW50U2l6ZTooTlNTaXplKSBzaXplIHsKKyAgd2lkdGggPSBzaXplLndpZHRoOworICBoZWlnaHQgPSBzaXplLmhlaWdodDsKKworICBbc3VwZXIgc2V0Q29udGVudFNpemU6c2l6ZV07Cit9CisKKy0gKEdzdEdMVmlldyAqKSBnc3RWaWV3IHsKKyAgcmV0dXJuIGdzdHZpZXc7Cit9CisKKy0gKHZvaWQpIGF3YWtlRnJvbU5pYiB7CisgIFtzZWxmIHNldEFjY2VwdHNNb3VzZU1vdmVkRXZlbnRzOllFU107Cit9CisKK0BlbmQKKworCisvLworLy8gT3BlbkdMIGltcGxlbWVudGF0aW9uCisvLworCitAIGltcGxlbWVudGF0aW9uIEdzdEdMVmlldworCistIChpZCkgaW5pdFdpdGhGcmFtZTooTlNSZWN0KSBmcmFtZSB7CisgIE5TT3BlbkdMUGl4ZWxGb3JtYXQgKmZtdDsKKyAgTlNPcGVuR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZSBhdHRyaWJzW10gPSB7CisgICAgTlNPcGVuR0xQRkFOb1JlY292ZXJ5LAorICAgIE5TT3BlbkdMUEZBRG91YmxlQnVmZmVyLAorICAgIE5TT3BlbkdMUEZBQ29sb3JTaXplLCAyNCwKKyAgICBOU09wZW5HTFBGQUFscGhhU2l6ZSwgOCwKKyAgICBOU09wZW5HTFBGQURlcHRoU2l6ZSwgMjQsCisjaWYgTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA8IDEwOTAKKyAgICBOU09wZW5HTFBGQVdpbmRvdywKKyNlbmRpZgorICAgIDAKKyAgfTsKKworICBmbXQgPSBbW05TT3BlbkdMUGl4ZWxGb3JtYXQgYWxsb2NdCisJICBpbml0V2l0aEF0dHJpYnV0ZXM6YXR0cmlic107CisKKyAgaWYgKCFmbXQpIHsKKyAgICBHU1RfV0FSTklORyAoIkNhbm5vdCBjcmVhdGUgTlNPcGVuR0xQaXhlbEZvcm1hdCIpOworICAgIHJldHVybiBuaWw7CisgIH0KKworICBzZWxmID0gW3N1cGVyIGluaXRXaXRoRnJhbWU6IGZyYW1lIHBpeGVsRm9ybWF0OmZtdF07CisgIFtmbXQgcmVsZWFzZV07CisKKyAgIGFjdHVhbENvbnRleHQgPSBbc2VsZiBvcGVuR0xDb250ZXh0XTsKKyAgIFthY3R1YWxDb250ZXh0IG1ha2VDdXJyZW50Q29udGV4dF07CisgICBbYWN0dWFsQ29udGV4dCB1cGRhdGVdOworCisgIC8qIEJsYWNrIGJhY2tncm91bmQgKi8KKyAgZ2xDbGVhckNvbG9yICgwLjAsIDAuMCwgMC4wLCAwLjApOworCisgIHBpX3RleHR1cmUgPSAwOworICBkYXRhID0gbmlsOworICB3aWR0aCA9IGZyYW1lLnNpemUud2lkdGg7CisgIGhlaWdodCA9IGZyYW1lLnNpemUuaGVpZ2h0OworICBkcmF3aW5nQm91bmRzID0gTlNNYWtlUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKworICBHU1RfTE9HICgiV2lkdGg6ICVkIEhlaWdodDogJWQiLCB3aWR0aCwgaGVpZ2h0KTsKKworICB0cmFja2luZ0FyZWEgPSBbW05TVHJhY2tpbmdBcmVhIGFsbG9jXSBpbml0V2l0aFJlY3Q6W3NlbGYgYm91bmRzXQorICAgICAgb3B0aW9uczogKE5TVHJhY2tpbmdNb3VzZUVudGVyZWRBbmRFeGl0ZWQgfCBOU1RyYWNraW5nTW91c2VNb3ZlZCB8IE5TVHJhY2tpbmdBY3RpdmVJbktleVdpbmRvdykKKyAgICAgIG93bmVyOnNlbGYKKyAgICAgIHVzZXJJbmZvOm5pbF07CisKKyAgW3NlbGYgYWRkVHJhY2tpbmdBcmVhOnRyYWNraW5nQXJlYV07CisgIG1haW5UaHJlYWQgPSBbTlNUaHJlYWQgbWFpblRocmVhZF07CisKKyAgW3NlbGYgaW5pdFRleHR1cmVzXTsKKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKE5TUmVjdCkgZ2V0RHJhd2luZ0JvdW5kcyB7CisgIHJldHVybiBkcmF3aW5nQm91bmRzOworfQorCistICh2b2lkKSByZXNoYXBlIHsKKyAgTlNSZWN0IGJvdW5kczsKKyAgZ2RvdWJsZSBmcmFtZV9wYXIsIHZpZXdfcGFyOworICBnaW50IHZpZXdfaGVpZ2h0LCB2aWV3X3dpZHRoLCBjX2hlaWdodCwgY193aWR0aCwgY194LCBjX3k7CisKKworICBHU1RfTE9HICgicmVzaGFwaW5nIik7CisKKyAgaWYgKCFpbml0RG9uZSkgeworICAgIHJldHVybjsKKyAgfQorCisgIFthY3R1YWxDb250ZXh0IG1ha2VDdXJyZW50Q29udGV4dF07CisKKyAgYm91bmRzID0gW3NlbGYgYm91bmRzXTsKKyAgdmlld193aWR0aCA9IGJvdW5kcy5zaXplLndpZHRoOworICB2aWV3X2hlaWdodCA9IGJvdW5kcy5zaXplLmhlaWdodDsKKworICBmcmFtZV9wYXIgPSAoZ2RvdWJsZSkgd2lkdGggLyBoZWlnaHQ7CisgIHZpZXdfcGFyID0gKGdkb3VibGUpIHZpZXdfd2lkdGggLyB2aWV3X2hlaWdodDsKKyAgaWYgKCFrZWVwQXNwZWN0UmF0aW8pCisgICAgdmlld19wYXIgPSBmcmFtZV9wYXI7CisKKyAgaWYgKGZyYW1lX3BhciA9PSB2aWV3X3BhcikgeworICAgIGNfaGVpZ2h0ID0gdmlld19oZWlnaHQ7CisgICAgY193aWR0aCA9IHZpZXdfd2lkdGg7CisgICAgY194ID0gMDsKKyAgICBjX3kgPSAwOworICB9IGVsc2UgaWYgKGZyYW1lX3BhciA8IHZpZXdfcGFyKSB7CisgICAgY19oZWlnaHQgPSB2aWV3X2hlaWdodDsKKyAgICBjX3dpZHRoID0gY19oZWlnaHQgKiBmcmFtZV9wYXI7CisgICAgY194ID0gKHZpZXdfd2lkdGggLSBjX3dpZHRoKSAvIDI7CisgICAgY195ID0gMDsKKyAgfSBlbHNlIHsKKyAgICBjX3dpZHRoID0gdmlld193aWR0aDsKKyAgICBjX2hlaWdodCA9IGNfd2lkdGggLyBmcmFtZV9wYXI7CisgICAgY194ID0gMDsKKyAgICBjX3kgPSAodmlld19oZWlnaHQgLSBjX2hlaWdodCkgLyAyOworICB9CisKKyAgZHJhd2luZ0JvdW5kcyA9IE5TTWFrZVJlY3QoY194LCBjX3ksIGNfd2lkdGgsIGNfaGVpZ2h0KTsKKyAgZ2xWaWV3cG9ydCAoY194LCBjX3ksIChHTGludCkgY193aWR0aCwgKEdMaW50KSBjX2hlaWdodCk7Cit9CisKKy0gKHZvaWQpIGluaXRUZXh0dXJlcyB7CisKKyAgW2FjdHVhbENvbnRleHQgbWFrZUN1cnJlbnRDb250ZXh0XTsKKworICAvKiBGcmVlIHByZXZpb3VzIHRleHR1cmUgaWYgYW55ICovCisgIGlmIChwaV90ZXh0dXJlKSB7CisgICAgZ2xEZWxldGVUZXh0dXJlcyAoMSwgKEdMdWludCAqKSZwaV90ZXh0dXJlKTsKKyAgfQorCisgIGlmIChkYXRhKSB7CisgICAgZGF0YSA9IGdfcmVhbGxvYyAoZGF0YSwgd2lkdGggKiBoZWlnaHQgKiBzaXplb2Yoc2hvcnQpKTsgLy8gc2hvcnQgb3IgM2J5dGU/CisgIH0gZWxzZSB7CisgICAgZGF0YSA9IGdfbWFsbG9jMCh3aWR0aCAqIGhlaWdodCAqIHNpemVvZihzaG9ydCkpOworICB9CisgIC8qIENyZWF0ZSB0ZXh0dXJlcyAqLworICBnbEdlblRleHR1cmVzICgxLCAoR0x1aW50ICopJnBpX3RleHR1cmUpOworCisgIGdsRW5hYmxlIChHTF9URVhUVVJFX1JFQ1RBTkdMRV9FWFQpOworICBnbEVuYWJsZSAoR0xfVU5QQUNLX0NMSUVOVF9TVE9SQUdFX0FQUExFKTsKKworICBnbFBpeGVsU3RvcmVpIChHTF9VTlBBQ0tfQUxJR05NRU5ULCAxKTsKKyAgZ2xQaXhlbFN0b3JlaSAoR0xfVU5QQUNLX1JPV19MRU5HVEgsIHdpZHRoKTsKKworICBnbEJpbmRUZXh0dXJlIChHTF9URVhUVVJFX1JFQ1RBTkdMRV9FWFQsIHBpX3RleHR1cmUpOworCisgIC8qIFVzZSBWUkFNIHRleHR1cmluZyAqLworICBnbFRleFBhcmFtZXRlcmkgKEdMX1RFWFRVUkVfUkVDVEFOR0xFX0VYVCwKKwkJICAgR0xfVEVYVFVSRV9TVE9SQUdFX0hJTlRfQVBQTEUsIEdMX1NUT1JBR0VfQ0FDSEVEX0FQUExFKTsKKworICAvKiBUZWxsIHRoZSBkcml2ZXIgbm90IHRvIG1ha2UgYSBjb3B5IG9mIHRoZSB0ZXh0dXJlIGJ1dCB0byB1c2UKKyAgICAgb3VyIGJ1ZmZlciAqLworICBnbFBpeGVsU3RvcmVpIChHTF9VTlBBQ0tfQ0xJRU5UX1NUT1JBR0VfQVBQTEUsIEdMX1RSVUUpOworCisgIC8qIExpbmVhciBpbnRlcnBvbGF0aW9uICovCisgIGdsVGV4UGFyYW1ldGVyaSAoR0xfVEVYVFVSRV9SRUNUQU5HTEVfRVhULCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgIGdsVGV4UGFyYW1ldGVyaSAoR0xfVEVYVFVSRV9SRUNUQU5HTEVfRVhULCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisKKyAgLyogSSBoYXZlIG5vIGlkZWEgd2hhdCB0aGlzIGV4YWN0bHkgZG9lcywgYnV0IGl0IHNlZW1zIHRvIGJlCisgICAgIG5lY2Vzc2FyeSBmb3Igc2NhbGluZyAqLworICBnbFRleFBhcmFtZXRlcmkgKEdMX1RFWFRVUkVfUkVDVEFOR0xFX0VYVCwKKwkJICAgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICBnbFRleFBhcmFtZXRlcmkgKEdMX1RFWFRVUkVfUkVDVEFOR0xFX0VYVCwKKwkJICAgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworICAvLyBnbFBpeGVsU3RvcmVpIChHTF9VTlBBQ0tfUk9XX0xFTkdUSCwgMCk7IFdIWSA/PworCisgIGdsVGV4SW1hZ2UyRCAoR0xfVEVYVFVSRV9SRUNUQU5HTEVfRVhULCAwLCBHTF9SR0JBLAorCQl3aWR0aCwgaGVpZ2h0LCAwLAorCQlHTF9ZQ0JDUl80MjJfQVBQTEUsIEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9BUFBMRSwgZGF0YSk7CisKKworICBpbml0RG9uZSA9IDE7Cit9CisKKy0gKHZvaWQpIHJlbG9hZFRleHR1cmUgeworICBpZiAoIWluaXREb25lKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgR1NUX0xPRyAoIlJlbG9hZGluZyBUZXh0dXJlIik7CisKKyAgW2FjdHVhbENvbnRleHQgbWFrZUN1cnJlbnRDb250ZXh0XTsKKworICBnbEJpbmRUZXh0dXJlIChHTF9URVhUVVJFX1JFQ1RBTkdMRV9FWFQsIHBpX3RleHR1cmUpOworICBnbFBpeGVsU3RvcmVpIChHTF9VTlBBQ0tfUk9XX0xFTkdUSCwgd2lkdGgpOworCisgIC8qIGdsVGV4U3ViSW1hZ2UyRCBpcyBmYXN0ZXIgdGhhbiBnbFRleEltYWdlMkQKKyAgICAgaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vc2FtcGxlY29kZS9TYW1wbGVfQ29kZS9HcmFwaGljc18zRC8KKyAgICAgVGV4dHVyZVJhbmdlL01haW5PcGVuR0xWaWV3Lm0uaHRtICovCisgIGdsVGV4U3ViSW1hZ2UyRCAoR0xfVEVYVFVSRV9SRUNUQU5HTEVfRVhULCAwLCAwLCAwLAorCQkgICB3aWR0aCwgaGVpZ2h0LAorCQkgICBHTF9ZQ0JDUl80MjJfQVBQTEUsIEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9BUFBMRSwgZGF0YSk7ICAgIC8vRklYTUUKK30KKworLSAodm9pZCkgY2xlYW5VcCB7CisgIGluaXREb25lID0gMDsKK30KKworLSAodm9pZCkgZHJhd1F1YWQgeworICBmX3ggPSAxLjA7CisgIGZfeSA9IDEuMDsKKworICBnbEJlZ2luIChHTF9RVUFEUyk7CisgIC8qIFRvcCBsZWZ0ICovCisgIGdsVGV4Q29vcmQyZiAoMC4wLCAwLjApOworICBnbFZlcnRleDJmICgtZl94LCBmX3kpOworICAvKiBCb3R0b20gbGVmdCAqLworICBnbFRleENvb3JkMmYgKDAuMCwgKGZsb2F0KSBoZWlnaHQpOworICBnbFZlcnRleDJmICgtZl94LCAtZl95KTsKKyAgLyogQm90dG9tIHJpZ2h0ICovCisgIGdsVGV4Q29vcmQyZiAoKGZsb2F0KSB3aWR0aCwgKGZsb2F0KSBoZWlnaHQpOworICBnbFZlcnRleDJmIChmX3gsIC1mX3kpOworICAvKiBUb3AgcmlnaHQgKi8KKyAgZ2xUZXhDb29yZDJmICgoZmxvYXQpIHdpZHRoLCAwLjApOworICBnbFZlcnRleDJmIChmX3gsIGZfeSk7CisgIGdsRW5kICgpOworfQorCistICh2b2lkKSBkcmF3UmVjdDooTlNSZWN0KSByZWN0IHsKKyAgR0xpbnQgcGFyYW1zW10gPSB7IDEgfTsKKworICBbYWN0dWFsQ29udGV4dCBtYWtlQ3VycmVudENvbnRleHRdOworCisgIENHTFNldFBhcmFtZXRlciAoQ0dMR2V0Q3VycmVudENvbnRleHQgKCksIGtDR0xDUFN3YXBJbnRlcnZhbCwgcGFyYW1zKTsKKworICAvKiBCbGFjayBiYWNrZ3JvdW5kICovCisgIGdsQ2xlYXIgKEdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTF9ERVBUSF9CVUZGRVJfQklUKTsKKworICBpZiAoIWluaXREb25lKSB7CisgICAgW2FjdHVhbENvbnRleHQgZmx1c2hCdWZmZXJdOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIERyYXcgKi8KKyAgZ2xCaW5kVGV4dHVyZSAoR0xfVEVYVFVSRV9SRUNUQU5HTEVfRVhULCBwaV90ZXh0dXJlKTsgLy8gRklYTUUKKyAgW3NlbGYgZHJhd1F1YWRdOworICAvKiBEcmF3ICovCisgIFthY3R1YWxDb250ZXh0IGZsdXNoQnVmZmVyXTsKK30KKworLSAodm9pZCkgZGlzcGxheVRleHR1cmUgeworICBpZiAoW3NlbGYgbG9ja0ZvY3VzSWZDYW5EcmF3XSkgeworCisgICAgW3NlbGYgZHJhd1JlY3Q6W3NlbGYgYm91bmRzXV07CisgICAgW3NlbGYgcmVsb2FkVGV4dHVyZV07CisKKyAgICBbc2VsZiB1bmxvY2tGb2N1c107CisKKyAgfQorCit9CisKKy0gKGNoYXIgKikgZ2V0VGV4dHVyZUJ1ZmZlciB7CisgIHJldHVybiBkYXRhOworfQorCistICh2b2lkKSBzZXRGdWxsU2NyZWVuOihCT09MKSBmbGFnIHsKKyAgaWYgKCFmdWxsc2NyZWVuICYmIGZsYWcpIHsKKyAgICAvLyBnbyB0byBmdWxsIHNjcmVlbgorICAgIC8qIENyZWF0ZSB0aGUgbmV3IHBpeGVsIGZvcm1hdCAqLworICAgIE5TT3BlbkdMUGl4ZWxGb3JtYXQgKmZtdDsKKyAgICBOU09wZW5HTFBpeGVsRm9ybWF0QXR0cmlidXRlIGF0dHJpYnNbXSA9IHsKKyAgICAgIE5TT3BlbkdMUEZBQWNjZWxlcmF0ZWQsCisgICAgICBOU09wZW5HTFBGQU5vUmVjb3ZlcnksCisgICAgICBOU09wZW5HTFBGQURvdWJsZUJ1ZmZlciwKKyAgICAgIE5TT3BlbkdMUEZBQ29sb3JTaXplLCAyNCwKKyAgICAgIE5TT3BlbkdMUEZBQWxwaGFTaXplLCA4LAorICAgICAgTlNPcGVuR0xQRkFEZXB0aFNpemUsIDI0LAorI2lmIE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQgPCAxMDYwCisgICAgICBOU09wZW5HTFBGQUZ1bGxTY3JlZW4sCisjZW5kaWYKKyAgICAgIE5TT3BlbkdMUEZBU2NyZWVuTWFzaywKKyAgICAgIENHRGlzcGxheUlEVG9PcGVuR0xEaXNwbGF5TWFzayAoa0NHRGlyZWN0TWFpbkRpc3BsYXkpLAorICAgICAgMAorICAgIH07CisKKyAgICBmbXQgPSBbW05TT3BlbkdMUGl4ZWxGb3JtYXQgYWxsb2NdCisJICAgIGluaXRXaXRoQXR0cmlidXRlczphdHRyaWJzXTsKKworICAgIGlmICghZm10KSB7CisgICAgICBHU1RfV0FSTklORyAoIkNhbm5vdCBjcmVhdGUgTlNPcGVuR0xQaXhlbEZvcm1hdCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIENyZWF0ZSB0aGUgbmV3IE9wZW5HTCBjb250ZXh0ICovCisgICAgZnVsbFNjcmVlbkNvbnRleHQgPSBbW05TT3BlbkdMQ29udGV4dCBhbGxvY10KKwkJCSAgaW5pdFdpdGhGb3JtYXQ6IGZtdCBzaGFyZUNvbnRleHQ6bmlsXTsKKyAgICBpZiAoIWZ1bGxTY3JlZW5Db250ZXh0KSB7CisgICAgICBHU1RfV0FSTklORyAoIkZhaWxlZCB0byBjcmVhdGUgbmV3IE5TT3BlbkdMQ29udGV4dCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFjdHVhbENvbnRleHQgPSBmdWxsU2NyZWVuQ29udGV4dDsKKworICAgIC8qIENhcHR1cmUgZGlzcGxheSwgc3dpdGNoIHRvIGZ1bGxzY3JlZW4gKi8KKyAgICBpZiAoQ0dDYXB0dXJlQWxsRGlzcGxheXMgKCkgIT0gQ0dEaXNwbGF5Tm9FcnIpIHsKKyAgICAgIEdTVF9XQVJOSU5HICgiQ0dDYXB0dXJlQWxsRGlzcGxheXMoKSBmYWlsZWQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisjaWYgTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA8IDEwNzAKKyAgICBbZnVsbFNjcmVlbkNvbnRleHQgc2V0RnVsbFNjcmVlbl07CisjZW5kaWYKKyAgICBbZnVsbFNjcmVlbkNvbnRleHQgbWFrZUN1cnJlbnRDb250ZXh0XTsKKworICAgIGZ1bGxzY3JlZW4gPSBZRVM7CisKKyAgICBbc2VsZiBpbml0VGV4dHVyZXNdOworICAgIFtzZWxmIHNldE5lZWRzRGlzcGxheTpZRVNdOworCisgIH0gZWxzZSBpZiAoZnVsbHNjcmVlbiAmJiAhZmxhZykgeworICAgIC8vIGZ1bGxzY3JlZW4gbm93IGFuZCBuZWVkcyB0byBnbyBiYWNrIHRvIG5vcm1hbAorICAgIGluaXREb25lID0gTk87CisKKyAgICBhY3R1YWxDb250ZXh0ID0gW3NlbGYgb3BlbkdMQ29udGV4dF07CisKKyAgICBbTlNPcGVuR0xDb250ZXh0IGNsZWFyQ3VycmVudENvbnRleHRdOworICAgIFtmdWxsU2NyZWVuQ29udGV4dCBjbGVhckRyYXdhYmxlXTsKKyAgICBbZnVsbFNjcmVlbkNvbnRleHQgcmVsZWFzZV07CisgICAgZnVsbFNjcmVlbkNvbnRleHQgPSBuaWw7CisKKyAgICBDR1JlbGVhc2VBbGxEaXNwbGF5cyAoKTsKKworICAgIFtzZWxmIHJlc2hhcGVdOworICAgIFtzZWxmIGluaXRUZXh0dXJlc107CisKKyAgICBbc2VsZiBzZXROZWVkc0Rpc3BsYXk6WUVTXTsKKworICAgIGZ1bGxzY3JlZW4gPSBOTzsKKyAgICBpbml0RG9uZSA9IFlFUzsKKyAgfQorfQorCistICh2b2lkKSBzZXRWaWRlb1NpemU6IChpbnQpdyA6IChpbnQpaCB7CisgIEdTVF9MT0cgKCJ3aWR0aDolZCwgaGVpZ2h0OiVkIiwgdywgaCk7CisKKyAgd2lkdGggPSB3OworICBoZWlnaHQgPSBoOworCisgIFtzZWxmIGluaXRUZXh0dXJlc107CisgIFtzZWxmIHJlc2hhcGVdOworfQorCistICh2b2lkKSBzZXRLZWVwQXNwZWN0UmF0aW86IChCT09MKSBmbGFnIHsKKyAga2VlcEFzcGVjdFJhdGlvID0gZmxhZzsKKyAgW3NlbGYgcmVzaGFwZV07Cit9CisKKyNpZm5kZWYgR1NUUkVBTUVSX0dMSUJfQ09DT0FfTlNBUFBMSUNBVElPTgorLSAodm9pZCkgc2V0TWFpblRocmVhZDogKE5TVGhyZWFkICopIHRocmVhZCB7CisgIG1haW5UaHJlYWQgPSB0aHJlYWQ7Cit9CisjZW5kaWYKKworLSAodm9pZCkgaGF2ZVN1cGVydmlld1JlYWw6KE5TTXV0YWJsZUFycmF5ICopY2xvc3VyZSB7CisJQk9PTCBoYXZlU3VwZXJ2aWV3ID0gW3NlbGYgc3VwZXJ2aWV3XSAhPSBuaWw7CisJW2Nsb3N1cmUgYWRkT2JqZWN0OltOU051bWJlciBudW1iZXJXaXRoQm9vbDpoYXZlU3VwZXJ2aWV3XV07Cit9CisKKy0gKEJPT0wpIGhhdmVTdXBlcnZpZXcgeworCU5TTXV0YWJsZUFycmF5ICpjbG9zdXJlID0gW05TTXV0YWJsZUFycmF5IGFycmF5V2l0aENhcGFjaXR5OjFdOworCVtzZWxmIHBlcmZvcm1TZWxlY3RvcjpAc2VsZWN0b3IoaGF2ZVN1cGVydmlld1JlYWw6KQorCQlvblRocmVhZDptYWluVGhyZWFkCisJCXdpdGhPYmplY3Q6KGlkKWNsb3N1cmUgd2FpdFVudGlsRG9uZTpZRVNdOworCisJcmV0dXJuIFtbY2xvc3VyZSBvYmplY3RBdEluZGV4OjBdIGJvb2xWYWx1ZV07Cit9CisKKy0gKHZvaWQpIGFkZFRvU3VwZXJ2aWV3UmVhbDooTlNWaWV3ICopc3VwZXJ2aWV3IHsKKwlOU1JlY3QgYm91bmRzOworCVtzdXBlcnZpZXcgYWRkU3VidmlldzpzZWxmXTsKKwlib3VuZHMgPSBbc3VwZXJ2aWV3IGJvdW5kc107CisJW3NlbGYgc2V0RnJhbWU6Ym91bmRzXTsKKwlbc2VsZiBzZXRBdXRvcmVzaXppbmdNYXNrOk5TVmlld1dpZHRoU2l6YWJsZXxOU1ZpZXdIZWlnaHRTaXphYmxlXTsKK30KKworLSAodm9pZCkgYWRkVG9TdXBlcnZpZXc6IChOU1ZpZXcgKilzdXBlcnZpZXcgeworCVtzZWxmIHBlcmZvcm1TZWxlY3RvcjpAc2VsZWN0b3IoYWRkVG9TdXBlcnZpZXdSZWFsOikKKwkJb25UaHJlYWQ6bWFpblRocmVhZAorCQl3aXRoT2JqZWN0OnN1cGVydmlldyB3YWl0VW50aWxEb25lOllFU107Cit9CisKKy0gKHZvaWQpIHJlbW92ZUZyb21TdXBlcnZpZXc6IChpZCl1bnVzZWQKK3sKKwlbc2VsZiByZW1vdmVGcm9tU3VwZXJ2aWV3XTsKK30KKworLSAodm9pZCkgZGVhbGxvYyB7CisgIEdTVF9MT0cgKCJkZWFsbG9jIGNhbGxlZCIpOworICBpZiAoZGF0YSkgZ19mcmVlKGRhdGEpOworCisgIGlmIChmdWxsU2NyZWVuQ29udGV4dCkgeworICAgIFtOU09wZW5HTENvbnRleHQgY2xlYXJDdXJyZW50Q29udGV4dF07CisgICAgW2Z1bGxTY3JlZW5Db250ZXh0IGNsZWFyRHJhd2FibGVdOworICAgIFtmdWxsU2NyZWVuQ29udGV4dCByZWxlYXNlXTsKKyAgICBpZiAoYWN0dWFsQ29udGV4dCA9PSBmdWxsU2NyZWVuQ29udGV4dCkgYWN0dWFsQ29udGV4dCA9IG5pbDsKKyAgICBmdWxsU2NyZWVuQ29udGV4dCA9IG5pbDsKKyAgfQorCisgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLSAodm9pZCl1cGRhdGVUcmFja2luZ0FyZWFzIHsKKyAgW3NlbGYgcmVtb3ZlVHJhY2tpbmdBcmVhOnRyYWNraW5nQXJlYV07CisgIFt0cmFja2luZ0FyZWEgcmVsZWFzZV07CisgIHRyYWNraW5nQXJlYSA9IFtbTlNUcmFja2luZ0FyZWEgYWxsb2NdIGluaXRXaXRoUmVjdDogW3NlbGYgYm91bmRzXQorICAgICAgb3B0aW9uczogKE5TVHJhY2tpbmdNb3VzZUVudGVyZWRBbmRFeGl0ZWQgfCBOU1RyYWNraW5nTW91c2VNb3ZlZCB8IE5TVHJhY2tpbmdBY3RpdmVJbktleVdpbmRvdykKKyAgICAgIG93bmVyOnNlbGYgdXNlckluZm86bmlsXTsKKyAgW3NlbGYgYWRkVHJhY2tpbmdBcmVhOnRyYWNraW5nQXJlYV07Cit9CisKKy0gKEJPT0wpYWNjZXB0c0ZpcnN0UmVzcG9uZGVyIHsKKyAgICByZXR1cm4gWUVTOworfQorCistICh2b2lkKSBzZXROYXZpZ2F0aW9uOihHc3ROYXZpZ2F0aW9uICopbmF2Cit7CisgIG5hdmlnYXRpb24gPSBuYXY7Cit9CisKKy0gKHZvaWQpc2VuZE1vdXNlRXZlbnQ6KE5TRXZlbnQgKilldmVudCA6IChjb25zdCBjaGFyICopZXZlbnRfbmFtZQoreworICBOU1BvaW50IGxvY2F0aW9uOworICBnaW50IGJ1dHRvbjsKKyAgZ2RvdWJsZSB4LCB5OworCisgIGlmICghbmF2aWdhdGlvbikKKyAgICByZXR1cm47CisKKyAgc3dpdGNoIChbZXZlbnQgdHlwZV0pIHsKKyAgICBjYXNlIE5TRXZlbnRUeXBlTW91c2VNb3ZlZDoKKyAgICAgIGJ1dHRvbiA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIE5TRXZlbnRUeXBlTGVmdE1vdXNlRG93bjoKKyAgICBjYXNlIE5TRXZlbnRUeXBlTGVmdE1vdXNlVXA6CisgICAgICBidXR0b24gPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBOU0V2ZW50VHlwZVJpZ2h0TW91c2VEb3duOgorICAgIGNhc2UgTlNFdmVudFR5cGVSaWdodE1vdXNlVXA6CisgICAgICBidXR0b24gPSAyOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJ1dHRvbiA9IDM7CisgICAgICBicmVhazsKKyAgfQorCisgIGxvY2F0aW9uID0gW3NlbGYgY29udmVydFBvaW50OltldmVudCBsb2NhdGlvbkluV2luZG93XSBmcm9tVmlldzpuaWxdOworCisgIHggPSBsb2NhdGlvbi54OworICB5ID0gbG9jYXRpb24ueTsKKyAgLyogaW52ZXJ0IFkgKi8KKworICB5ID0gKDEgLSAoKGdkb3VibGUpIHkpIC8gW3NlbGYgYm91bmRzXS5zaXplLmhlaWdodCkgKiBbc2VsZiBib3VuZHNdLnNpemUuaGVpZ2h0OworCisgIGdzdF9uYXZpZ2F0aW9uX3NlbmRfbW91c2VfZXZlbnQgKG5hdmlnYXRpb24sIGV2ZW50X25hbWUsIGJ1dHRvbiwgeCwgeSk7Cit9CisKKy0gKHZvaWQpc2VuZEtleUV2ZW50OihOU0V2ZW50ICopZXZlbnQgOiAoY29uc3QgY2hhciAqKWV2ZW50X25hbWUKK3sKKyAgaWYgKCFuYXZpZ2F0aW9uKQorICAgIHJldHVybjsKKworICBnc3RfbmF2aWdhdGlvbl9zZW5kX2tleV9ldmVudChuYXZpZ2F0aW9uLCBldmVudF9uYW1lLCBnc3Rfa2V5Y29kZV90b19rZXluYW1lKFtldmVudCBrZXlDb2RlXSkpOworfQorCistICh2b2lkKXNlbmRNb2RpZmllcktleUV2ZW50OihOU0V2ZW50ICopZXZlbnQKK3sKKyAgTlNVSW50ZWdlciBmbGFncyA9IFtldmVudCBtb2RpZmllckZsYWdzXTsKKyAgY29uc3QgZ2NoYXIqIGV2ZW50X25hbWUgPSBmbGFncyA+IHNhdmVkTW9kaWZpZXJGbGFncyA/ICJrZXktcHJlc3MiIDogImtleS1yZWxlYXNlIjsKKyAgc2F2ZWRNb2RpZmllckZsYWdzID0gZmxhZ3M7CisgIFtzZWxmIHNlbmRLZXlFdmVudDogZXZlbnQ6IGV2ZW50X25hbWVdOworfQorCistICh2b2lkKWtleURvd246KE5TRXZlbnQgKikgZXZlbnQ7Cit7CisgIFtzZWxmIHNlbmRLZXlFdmVudDogZXZlbnQ6ICJrZXktcHJlc3MiXTsKKyAgW3N1cGVyIGtleURvd246IGV2ZW50XTsKK30KKworLSAodm9pZClrZXlVcDooTlNFdmVudCAqKSBldmVudDsKK3sKKyAgW3NlbGYgc2VuZEtleUV2ZW50OiBldmVudDogImtleS1yZWxlYXNlIl07CisgIFtzdXBlciBrZXlVcDogZXZlbnRdOworfQorCistICh2b2lkKWZsYWdzQ2hhbmdlZDooTlNFdmVudCAqKSBldmVudDsKK3sKKyAgW3NlbGYgc2VuZE1vZGlmaWVyS2V5RXZlbnQ6IGV2ZW50XTsKKyAgW3N1cGVyIGZsYWdzQ2hhbmdlZDogZXZlbnRdOworfQorCistICh2b2lkKW1vdXNlRG93bjooTlNFdmVudCAqKSBldmVudDsKK3sKKyAgW3NlbGYgc2VuZE1vdXNlRXZlbnQ6ZXZlbnQ6ICJtb3VzZS1idXR0b24tcHJlc3MiXTsKKyAgW3N1cGVyIG1vdXNlRG93bjogZXZlbnRdOworfQorCistICh2b2lkKW1vdXNlVXA6KE5TRXZlbnQgKikgZXZlbnQ7Cit7CisgIFtzZWxmIHNlbmRNb3VzZUV2ZW50OmV2ZW50OiAibW91c2UtYnV0dG9uLXJlbGVhc2UiXTsKKyAgW3N1cGVyIG1vdXNlVXA6IGV2ZW50XTsKK30KKworLSAodm9pZCltb3VzZU1vdmVkOihOU0V2ZW50ICopZXZlbnQ7Cit7CisgIFtzZWxmIHNlbmRNb3VzZUV2ZW50OmV2ZW50OiAibW91c2UtbW92ZSJdOworICBbc3VwZXIgbW91c2VNb3ZlZDogZXZlbnRdOworfQorCistICh2b2lkKW1vdXNlRW50ZXJlZDooTlNFdmVudCAqKWV2ZW50OworeworICBbc3VwZXIgbW91c2VFbnRlcmVkOiBldmVudF07Cit9CisKKy0gKHZvaWQpbW91c2VFeGl0ZWQ6KE5TRXZlbnQgKilldmVudDsKK3sKKyAgW3N1cGVyIG1vdXNlRXhpdGVkOiBldmVudF07Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL3N5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaCBiL3N5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDY3YjBlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oCkBAIC0wLDAgKzEsMTQxIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNC02IFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA3IFBpb25lZXJzIG9mIHRoZSBJbmV2aXRhYmxlIDxzb25nYmlyZEBzb25nYmlyZG5lc3QuY29tPgorICoKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKgorICogVGhlIGRldmVsb3BtZW50IG9mIHRoaXMgY29kZSB3YXMgbWFkZSBwb3NzaWJsZSBkdWUgdG8gdGhlIGludm9sdmVtZW50IG9mIFBpb25lZXJzIAorICogb2YgdGhlIEluZXZpdGFibGUsIHRoZSBjcmVhdG9ycyBvZiB0aGUgU29uZ2JpcmQgTXVzaWMgcGxheWVyCisgKiAKKyAqLworIAorI2lmbmRlZiBfX0dTVF9PU1hfVklERU9fU0lOS19IX18KKyNkZWZpbmUgX19HU1RfT1NYX1ZJREVPX1NJTktfSF9fCisKKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9zaW5rLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8b2JqYy9ydW50aW1lLmg+CisjaW5jbHVkZSA8Q29jb2EvQ29jb2EuaD4KKworI2ltcG9ydCAiY29jb2F3aW5kb3cuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX0VYVEVSTiAoZ3N0X2RlYnVnX29zeF92aWRlb19zaW5rKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9kZWJ1Z19vc3hfdmlkZW9fc2luaworCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfT1NYX1ZJREVPX1NJTksgXAorICAoZ3N0X29zeF92aWRlb19zaW5rX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9PU1hfVklERU9fU0lOSyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLCBHU1RfVFlQRV9PU1hfVklERU9fU0lOSywgR3N0T1NYVmlkZW9TaW5rKSkKKyNkZWZpbmUgR1NUX09TWF9WSURFT19TSU5LX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLCBHU1RfVFlQRV9PU1hfVklERU9fU0lOSywgR3N0T1NYVmlkZW9TaW5rQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfT1NYX1ZJREVPX1NJTksob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSwgR1NUX1RZUEVfT1NYX1ZJREVPX1NJTkspKQorI2RlZmluZSBHU1RfSVNfT1NYX1ZJREVPX1NJTktfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksIEdTVF9UWVBFX09TWF9WSURFT19TSU5LKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9TWFdpbmRvdyBHc3RPU1hXaW5kb3c7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RPU1hWaWRlb1NpbmsgR3N0T1NYVmlkZW9TaW5rOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9TWFZpZGVvU2lua0NsYXNzIEdzdE9TWFZpZGVvU2lua0NsYXNzOworCisjZGVmaW5lIEdTVF9UWVBFX09TWFZJREVPQlVGRkVSIChnc3Rfb3N4dmlkZW9idWZmZXJfZ2V0X3R5cGUoKSkKKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX09TWF9WSURFT19TSU5LX1JVTl9MT09QX1NUQVRFX05PVF9SVU5OSU5HID0gMCwKKyAgR1NUX09TWF9WSURFT19TSU5LX1JVTl9MT09QX1NUQVRFX1JVTk5JTkcgPSAxLAorICBHU1RfT1NYX1ZJREVPX1NJTktfUlVOX0xPT1BfU1RBVEVfVU5LTk9XTiA9IDIsCit9IEdzdE9TWFZpZGVvU2lua1J1bkxvb3BTdGF0ZTsKKworLyogT1NYV2luZG93IHN0dWZmICovCitzdHJ1Y3QgX0dzdE9TWFdpbmRvdyB7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2Jvb2xlYW4gY2xvc2VkOworICBnYm9vbGVhbiBpbnRlcm5hbDsKKyAgR3N0R0xWaWV3KiBnc3R2aWV3OworICBHc3RPU1hWaWRlb1NpbmtXaW5kb3cqIHdpbjsKK307CisKK3N0cnVjdCBfR3N0T1NYVmlkZW9TaW5rIHsKKyAgLyogT3VyIGVsZW1lbnQgc3R1ZmYgKi8KKyAgR3N0VmlkZW9TaW5rIHZpZGVvc2luazsKKyAgR3N0T1NYV2luZG93ICpvc3h3aW5kb3c7CisgIHZvaWQgKm9zeHZpZGVvc2lua29iamVjdDsKKyAgTlNWaWV3ICpzdXBlcnZpZXc7CisgIGdib29sZWFuIGtlZXBfcGFyOworICBHc3RWaWRlb0luZm8gaW5mbzsKK307CisKK3N0cnVjdCBfR3N0T1NYVmlkZW9TaW5rQ2xhc3MgeworICBHc3RWaWRlb1NpbmtDbGFzcyBwYXJlbnRfY2xhc3M7CisKKyAgR3N0T1NYVmlkZW9TaW5rUnVuTG9vcFN0YXRlIHJ1bl9sb29wX3N0YXRlOworICBOU1RocmVhZCAqbnNfYXBwX3RocmVhZDsKK307CisKK0dUeXBlIGdzdF9vc3hfdmlkZW9fc2lua19nZXRfdHlwZSh2b2lkKTsKKworQGludGVyZmFjZSBOU0FwcGxpY2F0aW9uKEFwcGxlTWVudSkKKy0gKHZvaWQpc2V0QXBwbGVNZW51OihOU01lbnUgKiltZW51OworQGVuZAorCitAaW50ZXJmYWNlIEdzdEJ1ZmZlck9iamVjdCA6IE5TT2JqZWN0Cit7CisgIEBwdWJsaWMKKyAgR3N0QnVmZmVyICpidWY7Cit9CisKKy0oaWQpIGluaXRXaXRoQnVmZmVyOiAoR3N0QnVmZmVyICopIGJ1ZjsKK0BlbmQKKworCitAaW50ZXJmYWNlIEdzdFdpbmRvd0RlbGVnYXRlIDogTlNPYmplY3QgPE5TV2luZG93RGVsZWdhdGU+Cit7CisgIEBwdWJsaWMKKyAgR3N0T1NYVmlkZW9TaW5rICpvc3h2aWRlb3Npbms7Cit9CistKGlkKSBpbml0V2l0aFNpbms6IChHc3RPU1hWaWRlb1NpbmsgKikgc2luazsKK0BlbmQKKworQGludGVyZmFjZSBHc3RPU1hWaWRlb1NpbmtPYmplY3QgOiBOU09iamVjdAoreworICBAcHVibGljCisgIEdzdE9TWFZpZGVvU2luayAqb3N4dmlkZW9zaW5rOworfQorCistKGlkKSBpbml0V2l0aFNpbms6IChHc3RPU1hWaWRlb1NpbmsgKikgc2luazsKKy0odm9pZCkgY3JlYXRlSW50ZXJuYWxXaW5kb3c7CistKHZvaWQpIHJlc2l6ZTsKKy0odm9pZCkgZGVzdHJveTsKKy0odm9pZCkgc2hvd0ZyYW1lOiAoR3N0QnVmZmVyT2JqZWN0KikgYnVmOworLSh2b2lkKSBzZXRWaWV3OiAoTlNWaWV3KikgdmlldzsKKysgKEJPT0wpIGlzTWFpblRocmVhZDsKKyNpZm5kZWYgR1NUUkVBTUVSX0dMSUJfQ09DT0FfTlNBUFBMSUNBVElPTgorLSh2b2lkKSBuc0FwcFRocmVhZDsKKy0odm9pZCkgY2hlY2tNYWluUnVuTG9vcDsKKyNlbmRpZgorQGVuZAorCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfT1NYX1ZJREVPX1NJTktfSF9fICovCisKZGlmZiAtLWdpdCBhL3N5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubSBiL3N5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTQwZDUxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tCkBAIC0wLDAgKzEsMTAyNSBAQAorLyogR1N0cmVhbWVyCisgKiBPU1ggdmlkZW8gc2luaworICogQ29weXJpZ2h0IChDKSAyMDA0LTYgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsMjAwOCwyMDA5IFBpb25lZXJzIG9mIHRoZSBJbmV2aXRhYmxlIDxzb25nYmlyZEBzb25nYmlyZG5lc3QuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqIFRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUgd2FzIG1hZGUgcG9zc2libGUgZHVlIHRvIHRoZSBpbnZvbHZlbWVudCBvZgorICogUGlvbmVlcnMgb2YgdGhlIEluZXZpdGFibGUsIHRoZSBjcmVhdG9ycyBvZiB0aGUgU29uZ2JpcmQgTXVzaWMgcGxheWVyLgorICoKKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1vc3h2aWRlb3NpbmsKKyAqCisgKiBUaGUgT1NYVmlkZW9TaW5rIHJlbmRlcnMgdmlkZW8gZnJhbWVzIHRvIGEgTWFjT1NYIHdpbmRvdy4gVGhlIHZpZGVvIG91dHB1dAorICogbXVzdCBiZSBkaXJlY3RlZCB0byBhIHdpbmRvdyBlbWJlZGRlZCBpbiBhbiBleGlzdGluZyBOU0FwcC4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlb292ZXJsYXkuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vbmF2aWdhdGlvbi5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSAib3N4dmlkZW9zaW5rLmgiCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW1wb3J0ICJjb2NvYXdpbmRvdy5oIgorCitHU1RfREVCVUdfQ0FURUdPUlkgKGdzdF9kZWJ1Z19vc3hfdmlkZW9fc2luayk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfZGVidWdfb3N4X3ZpZGVvX3NpbmsKKworI2lmbmRlZiBHU1RSRUFNRVJfR0xJQl9DT0NPQV9OU0FQUExJQ0FUSU9OCisjaW5jbHVkZSA8cHRocmVhZC5oPgorZXh0ZXJuIHZvaWQgX0NGUnVuTG9vcFNldEN1cnJlbnQgKENGUnVuTG9vcFJlZiBybCk7CitleHRlcm4gcHRocmVhZF90IF9DRk1haW5QVGhyZWFkOworI2VuZGlmCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3Rfb3N4X3ZpZGVvX3Npbmtfc2lua190ZW1wbGF0ZV9mYWN0b3J5ID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtcmF3LCAiCisgICAgICAgICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMCwgTUFYIF0sICIKKyAgICAgICAgIndpZHRoID0gKGludCkgWyAxLCBNQVggXSwgIgorICAgICAgICAiaGVpZ2h0ID0gKGludCkgWyAxLCBNQVggXSwgIgorI2lmIEdfQllURV9PUkRFUiA9PSBHX0JJR19FTkRJQU4KKyAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgWVVZMiIpCisjZWxzZQorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgVVlWWSIpCisjZW5kaWYKKyAgICApOworCitlbnVtCit7CisgIEFSR18wLAorICBBUkdfRU1CRUQsCisgIEFSR19GT1JDRV9QQVIsCit9OworCitzdGF0aWMgdm9pZCBnc3Rfb3N4X3ZpZGVvX3Npbmtfb3N4d2luZG93X2Rlc3Ryb3kgKEdzdE9TWFZpZGVvU2luayAqIG9zeHZpZGVvc2luayk7CisKKyNpZm5kZWYgR1NUUkVBTUVSX0dMSUJfQ09DT0FfTlNBUFBMSUNBVElPTgorc3RhdGljIEdNdXRleCBfcnVuX2xvb3BfY2hlY2tfbXV0ZXg7CitzdGF0aWMgR011dGV4IF9ydW5fbG9vcF9tdXRleDsKK3N0YXRpYyBHQ29uZCBfcnVuX2xvb3BfY29uZDsKKyNlbmRpZgorCitzdGF0aWMgR3N0T1NYVmlkZW9TaW5rQ2xhc3MgKnNpbmtfY2xhc3MgPSBOVUxMOworc3RhdGljIEdzdFZpZGVvU2lua0NsYXNzICpwYXJlbnRfY2xhc3MgPSBOVUxMOworCisjaWYgTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA8IDEwMTIwMAorI2RlZmluZSBOU0V2ZW50TWFza0FueSAgICAgICAgICAgICAgICAgICAgICAgTlNBbnlFdmVudE1hc2sKKyNkZWZpbmUgTlNXaW5kb3dTdHlsZU1hc2tUaXRsZWQgICAgICAgICAgICAgIE5TVGl0bGVkV2luZG93TWFzaworI2RlZmluZSBOU1dpbmRvd1N0eWxlTWFza0Nsb3NhYmxlICAgICAgICAgICAgTlNDbG9zYWJsZVdpbmRvd01hc2sKKyNkZWZpbmUgTlNXaW5kb3dTdHlsZU1hc2tSZXNpemFibGUgICAgICAgICAgIE5TUmVzaXphYmxlV2luZG93TWFzaworI2RlZmluZSBOU1dpbmRvd1N0eWxlTWFza1RleHR1cmVkQmFja2dyb3VuZCAgTlNUZXh0dXJlZEJhY2tncm91bmRXaW5kb3dNYXNrCisjZGVmaW5lIE5TV2luZG93U3R5bGVNYXNrTWluaWF0dXJpemFibGUgICAgICBOU01pbmlhdHVyaXphYmxlV2luZG93TWFzaworI2VuZGlmCisKKy8qIEhlbHBlciB0byB0cmlnZ2VyIGNhbGxzIGZyb20gdGhlIG1haW4gdGhyZWFkICovCitzdGF0aWMgdm9pZAorZ3N0X29zeF92aWRlb19zaW5rX2NhbGxfZnJvbV9tYWluX3RocmVhZChHc3RPU1hWaWRlb1NpbmsgKm9zeHZpZGVvc2luaywKKyAgICBOU09iamVjdCAqIG9iamVjdCwgU0VMIGZ1bmN0aW9uLCBOU09iamVjdCAqZGF0YSwgQk9PTCB3YWl0VW50aWxEb25lKQoreworCisgIE5TVGhyZWFkICp0aHJlYWQ7CisgIE5TQXV0b3JlbGVhc2VQb29sICpwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07CisKKyAgaWYgKHNpbmtfY2xhc3MtPm5zX2FwcF90aHJlYWQgPT0gTlVMTCl7CisgICAgdGhyZWFkID0gW05TVGhyZWFkIG1haW5UaHJlYWRdOworICB9IGVsc2UgeworICAgIHRocmVhZCA9IHNpbmtfY2xhc3MtPm5zX2FwcF90aHJlYWQ7CisgIH0KKworICBbb2JqZWN0IHBlcmZvcm1TZWxlY3RvcjpmdW5jdGlvbiBvblRocmVhZDp0aHJlYWQKKyAgICAgICAgICB3aXRoT2JqZWN0OmRhdGEgd2FpdFVudGlsRG9uZTp3YWl0VW50aWxEb25lXTsKKyAgW3Bvb2wgcmVsZWFzZV07Cit9CisKKyNpZm5kZWYgR1NUUkVBTUVSX0dMSUJfQ09DT0FfTlNBUFBMSUNBVElPTgorLyogUG9sbCBmb3IgY29jb2EgZXZlbnRzICovCitzdGF0aWMgdm9pZAorcnVuX25zX2FwcF9sb29wICh2b2lkKSB7CisgIE5TRXZlbnQgKmV2ZW50OworICBOU0F1dG9yZWxlYXNlUG9vbCAqcG9vbCA9W1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07CisgIE5TRGF0ZSAqcG9sbFRpbWUgPSBuaWw7CisKKyAgLyogd2hlbiBydW5uaW5nIHRoZSBsb29wIGluIGEgdGhyZWFkIHdlIHdhbnQgdG8gc2xlZXAgYXMgbG9uZyBhcyBwb3NzaWJsZSAqLworICBwb2xsVGltZSA9IFtOU0RhdGUgZGlzdGFudEZ1dHVyZV07CisKKyAgZG8geworICAgICAgZXZlbnQgPSBbTlNBcHAgbmV4dEV2ZW50TWF0Y2hpbmdNYXNrOk5TRXZlbnRNYXNrQW55IHVudGlsRGF0ZTpwb2xsVGltZQorICAgICAgICAgIGluTW9kZTpOU0RlZmF1bHRSdW5Mb29wTW9kZSBkZXF1ZXVlOllFU107CisgICAgICBbTlNBcHAgc2VuZEV2ZW50OmV2ZW50XTsKKyAgICB9CisgIHdoaWxlIChldmVudCAhPSBuaWwpOworICBbcG9vbCByZWxlYXNlXTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfdmlkZW9zaW5rX2NoZWNrX21haW5fcnVuX2xvb3AgKEdzdE9TWFZpZGVvU2luayAqc2luaykKK3sKKyAgLyogY2hlY2sgaWYgdGhlIG1haW4gcnVuIGxvb3AgaXMgcnVubmluZyAqLworICBnYm9vbGVhbiBpc19ydW5uaW5nOworCisgIC8qIHRoZSBlYXN5IHdheSAqLworICBpc19ydW5uaW5nID0gW1tOU1J1bkxvb3AgbWFpblJ1bkxvb3BdIGN1cnJlbnRNb2RlXSAhPSBuaWw7CisgIGlmIChpc19ydW5uaW5nKSB7CisgICAgZ290byBleGl0OworICB9IGVsc2UgeworICAgIC8qIHRoZSBwcmV2aW91cyBjaGVjayBkb2Vzbid0IGFsd2F5cyB3b3JrIHdpdGggbWFpbiBsb29wcyB0aGF0IHJ1bgorICAgICAqIGNvY29hJ3MgbWFpbiBydW4gbG9vcCBtYW51YWxseSwgbGlrZSB0aGUgZ2RrIG9uZSwgZ2l2aW5nIGZhbHNlCisgICAgICogbmVnYXRpdmVzLiBUaGlzIGNoZWNrIGRlZmVycyBhIGNhbGwgdG8gdGhlIG1haW4gdGhyZWFkIGFuZCB3YWl0cyB0bworICAgICAqIGJlIGF3YWtlbiBieSB0aGlzIGZ1bmN0aW9uLiAqLworICAgIE5TQXV0b3JlbGVhc2VQb29sICpwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07CisgICAgR3N0T1NYVmlkZW9TaW5rT2JqZWN0ICogb2JqZWN0ID0gKEdzdE9TWFZpZGVvU2lua09iamVjdCAqKSBzaW5rLT5vc3h2aWRlb3NpbmtvYmplY3Q7CisgICAgZ2ludDY0IGFic3RpbWU7CisKKyAgICBnX211dGV4X2xvY2sgKCZfcnVuX2xvb3BfbXV0ZXgpOworICAgIFtvYmplY3QgcGVyZm9ybVNlbGVjdG9yT25NYWluVGhyZWFkOgorICAgICAgICAgIEBzZWxlY3RvcihjaGVja01haW5SdW5Mb29wKQorICAgICAgICAgIHdpdGhPYmplY3Q6bmlsIHdhaXRVbnRpbERvbmU6Tk9dOworICAgIC8qIFdhaXQgMTAwIG1zICovCisgICAgYWJzdGltZSA9IGdfZ2V0X21vbm90b25pY190aW1lICgpICsgMTAwICogMTAwMDsKKyAgICBpc19ydW5uaW5nID0gZ19jb25kX3dhaXRfdW50aWwgKCZfcnVuX2xvb3BfY29uZCwKKyAgICAgICAgJl9ydW5fbG9vcF9tdXRleCwgYWJzdGltZSk7CisgICAgZ19tdXRleF91bmxvY2sgKCZfcnVuX2xvb3BfbXV0ZXgpOworCisgICAgW3Bvb2wgcmVsZWFzZV07CisgIH0KKworZXhpdDoKKyAgeworICBHU1RfREVCVUdfT0JKRUNUKHNpbmssICJUaGUgbWFpbiBydW5sb29wICVzIGlzIHJ1bm5pbmciLAorICAgICAgaXNfcnVubmluZyA/ICIiIDogIiBub3QgIik7CisgIGlmIChpc19ydW5uaW5nKSB7CisgICAgc2lua19jbGFzcy0+cnVuX2xvb3Bfc3RhdGUgPSBHU1RfT1NYX1ZJREVPX1NJTktfUlVOX0xPT1BfU1RBVEVfUlVOTklORzsKKyAgICBzaW5rX2NsYXNzLT5uc19hcHBfdGhyZWFkID0gW05TVGhyZWFkIG1haW5UaHJlYWRdOworICB9IGVsc2UgeworICAgIHNpbmtfY2xhc3MtPnJ1bl9sb29wX3N0YXRlID0gR1NUX09TWF9WSURFT19TSU5LX1JVTl9MT09QX1NUQVRFX05PVF9SVU5OSU5HOworICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfdmlkZW9fc2lua19ydW5fY29jb2FfbG9vcCAoR3N0T1NYVmlkZW9TaW5rICogc2luayApCit7CisgIC8qIENvY29hIGFwcGxpY2F0aW9ucyByZXF1aXJlIGEgbWFpbiBydW5sb29wIHJ1bm5pbmcgdG8gZGlzcGF0Y2ggVUkKKyAgICogZXZlbnRzIGFuZCBwcm9jZXNzIGRlZmVycmVkIGNhbGxzIHRvIHRoZSBtYWluIHRocmVhZCB0aHJvdWdoCisgICAqIHBlcmZlcm1TZWxlY3Rvck9uTWFpblRocmVhZC4KKyAgICogU2luY2UgdGhlIHNpbmsgbmVlZHMgdG8gY3JlYXRlIGl0J3Mgb3duIENvY29hIHdpbmRvdyB3aGVuIG5vCisgICAqIGV4dGVybmFsIE5TVmlldyBpcyBwYXNzZWQgdG8gdGhlIHNpbmsgdGhyb3VnaCB0aGUgR3N0VmlkZW9PdmVybGF5IEFQSSwKKyAgICogd2UgbmVlZCB0byBydW4gdGhlIGNvY29hIG1haW5sb29wIHNvbWVob3cuCisgICAqIFRoaXMgcnVuIGxvb3AgY2FuIG9ubHkgYmUgc3RhcnRlZCBvbmNlLCBieSB0aGUgZmlyc3Qgc2luayBuZWVkaW5nIGl0CisgICAqLworCisgIGdfbXV0ZXhfbG9jayAoJl9ydW5fbG9vcF9jaGVja19tdXRleCk7CisKKyAgaWYgKHNpbmtfY2xhc3MtPnJ1bl9sb29wX3N0YXRlID09IEdTVF9PU1hfVklERU9fU0lOS19SVU5fTE9PUF9TVEFURV9VTktOT1dOKSB7CisgICAgZ3N0X29zeF92aWRlb3NpbmtfY2hlY2tfbWFpbl9ydW5fbG9vcCAoc2luayk7CisgIH0KKworICBpZiAoc2lua19jbGFzcy0+cnVuX2xvb3Bfc3RhdGUgPT0gR1NUX09TWF9WSURFT19TSU5LX1JVTl9MT09QX1NUQVRFX1JVTk5JTkcpIHsKKyAgICBnX211dGV4X3VubG9jayAoJl9ydW5fbG9vcF9jaGVja19tdXRleCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHNpbmtfY2xhc3MtPm5zX2FwcF90aHJlYWQgPT0gTlVMTCkgeworICAgIC8qIHJ1biB0aGUgbWFpbiBydW5sb29wIGluIGEgc2VwYXJhdGUgdGhyZWFkICovCisKKyAgICAvKiBvdmVycmlkZSBbTlNUaHJlYWQgaXNNYWluVGhyZWFkXSB3aXRoIG91ciBvd24gaW1wbGVtZW50YXRpb24gc28gdGhhdCB3ZSBjYW4KKyAgICAgKiBtYWtlIGl0IGJlbGlldmUgb3VyIGRlZGljYXRlZCB0aHJlYWQgaXMgdGhlIG1haW4gdGhyZWFkCisgICAgICovCisgICAgTWV0aG9kIG9yaWdJc01haW5UaHJlYWQgPSBjbGFzc19nZXRDbGFzc01ldGhvZChbTlNUaHJlYWQgY2xhc3NdLAorICAgICAgICBOU1NlbGVjdG9yRnJvbVN0cmluZyhAImlzTWFpblRocmVhZCIpKTsKKyAgICBNZXRob2Qgb3VySXNNYWluVGhyZWFkID0gY2xhc3NfZ2V0Q2xhc3NNZXRob2QoW0dzdE9TWFZpZGVvU2lua09iamVjdCBjbGFzc10sCisgICAgICAgIE5TU2VsZWN0b3JGcm9tU3RyaW5nKEAiaXNNYWluVGhyZWFkIikpOworCisgICAgbWV0aG9kX2V4Y2hhbmdlSW1wbGVtZW50YXRpb25zKG9yaWdJc01haW5UaHJlYWQsIG91cklzTWFpblRocmVhZCk7CisKKyAgICBzaW5rX2NsYXNzLT5uc19hcHBfdGhyZWFkID0gW1tOU1RocmVhZCBhbGxvY10KKyAgICAgICAgaW5pdFdpdGhUYXJnZXQ6c2luay0+b3N4dmlkZW9zaW5rb2JqZWN0CisgICAgICAgIHNlbGVjdG9yOkBzZWxlY3Rvcihuc0FwcFRocmVhZCkgb2JqZWN0Om5pbF07CisgICAgW3NpbmtfY2xhc3MtPm5zX2FwcF90aHJlYWQgc3RhcnRdOworCisgICAgZ19tdXRleF9sb2NrICgmX3J1bl9sb29wX211dGV4KTsKKyAgICBnX2NvbmRfd2FpdCAoJl9ydW5fbG9vcF9jb25kLCAmX3J1bl9sb29wX211dGV4KTsKKyAgICBnX211dGV4X3VubG9jayAoJl9ydW5fbG9vcF9tdXRleCk7CisgIH0KKworICBnX211dGV4X3VubG9jayAoJl9ydW5fbG9vcF9jaGVja19tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X3ZpZGVvX3Npbmtfc3RvcF9jb2NvYV9sb29wIChHc3RPU1hWaWRlb1NpbmsgKiBvc3h2aWRlb3NpbmspCit7Cit9CisjZW5kaWYKKworLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIG9zeCB3aW5kb3cgY3JlYXRpb24gKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zeF92aWRlb19zaW5rX29zeHdpbmRvd19jcmVhdGUgKEdzdE9TWFZpZGVvU2luayAqIG9zeHZpZGVvc2luaywgZ2ludCB3aWR0aCwKKyAgICBnaW50IGhlaWdodCkKK3sKKyAgTlNSZWN0IHJlY3Q7CisgIEdzdE9TWFdpbmRvdyAqb3N4d2luZG93ID0gTlVMTDsKKyAgZ2Jvb2xlYW4gcmVzID0gVFJVRTsKKyAgTlNBdXRvcmVsZWFzZVBvb2wgKnBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX09TWF9WSURFT19TSU5LIChvc3h2aWRlb3NpbmspLCBGQUxTRSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAob3N4dmlkZW9zaW5rLCAiQ3JlYXRpbmcgbmV3IE9TWCB3aW5kb3ciKTsKKworICBvc3h2aWRlb3NpbmstPm9zeHdpbmRvdyA9IG9zeHdpbmRvdyA9IGdfbmV3MCAoR3N0T1NYV2luZG93LCAxKTsKKworICBvc3h3aW5kb3ctPndpZHRoID0gd2lkdGg7CisgIG9zeHdpbmRvdy0+aGVpZ2h0ID0gaGVpZ2h0OworICBvc3h3aW5kb3ctPmNsb3NlZCA9IEZBTFNFOworICBvc3h3aW5kb3ctPmludGVybmFsID0gRkFMU0U7CisKKyAgLyogQWxsb2NhdGUgb3VyIEdzdEdMVmlldyBmb3IgdGhlIHdpbmRvdywgYW5kIHRoZW4gdGVsbCB0aGUgYXBwbGljYXRpb24KKyAgICogYWJvdXQgaXQgKGhvcGVmdWxseSBpdCdzIGxpc3RlbmluZy4uLikgKi8KKyAgcmVjdC5vcmlnaW4ueCA9IDAuMDsKKyAgcmVjdC5vcmlnaW4ueSA9IDAuMDsKKyAgcmVjdC5zaXplLndpZHRoID0gKGZsb2F0KSBvc3h3aW5kb3ctPndpZHRoOworICByZWN0LnNpemUuaGVpZ2h0ID0gKGZsb2F0KSBvc3h3aW5kb3ctPmhlaWdodDsKKyAgb3N4d2luZG93LT5nc3R2aWV3ID1bW0dzdEdMVmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpyZWN0XTsKKworI2lmbmRlZiBHU1RSRUFNRVJfR0xJQl9DT0NPQV9OU0FQUExJQ0FUSU9OCisgIGdzdF9vc3hfdmlkZW9fc2lua19ydW5fY29jb2FfbG9vcCAob3N4dmlkZW9zaW5rKTsKKyAgW29zeHdpbmRvdy0+Z3N0dmlldyBzZXRNYWluVGhyZWFkOnNpbmtfY2xhc3MtPm5zX2FwcF90aHJlYWRdOworI2VuZGlmCisKKyAgaWYgKG9zeHZpZGVvc2luay0+c3VwZXJ2aWV3ID09IE5VTEwpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKG9zeHZpZGVvc2luaywgImVtaXR0aW5nIHByZXBhcmUteHdpbmRvdy1pZCIpOworICAgIGdzdF92aWRlb19vdmVybGF5X3ByZXBhcmVfd2luZG93X2hhbmRsZSAoR1NUX1ZJREVPX09WRVJMQVkgKG9zeHZpZGVvc2luaykpOworICB9CisKKyAgaWYgKG9zeHZpZGVvc2luay0+c3VwZXJ2aWV3ICE9IE5VTEwpIHsKKyAgICAvKiBwcmVwYXJlLXh3aW5kb3ctaWQgd2FzIGhhbmRsZWQsIHdlIGhhdmUgdGhlIHN1cGVydmlldyBpbgorICAgICAqIG9zeHZpZGVvc2luay0+c3VwZXJ2aWV3LiBXZSBub3cgYWRkIG9zeHdpbmRvdy0+Z3N0dmlldyB0byB0aGUgc3VwZXJ2aWV3CisgICAgICogZnJvbSB0aGUgbWFpbiB0aHJlYWQKKyAgICAgKi8KKyAgICBHU1RfSU5GT19PQkpFQ1QgKG9zeHZpZGVvc2luaywgIndlIGhhdmUgYSBzdXBlcnZpZXcsIGFkZGluZyBvdXIgdmlldyB0byBpdCIpOworICAgIGdzdF9vc3hfdmlkZW9fc2lua19jYWxsX2Zyb21fbWFpbl90aHJlYWQob3N4dmlkZW9zaW5rLCBvc3h3aW5kb3ctPmdzdHZpZXcsCisgICAgICAgIEBzZWxlY3RvcihhZGRUb1N1cGVydmlldzopLCBvc3h2aWRlb3NpbmstPnN1cGVydmlldywgTk8pOworCisgIH0gZWxzZSB7CisgICAgZ3N0X29zeF92aWRlb19zaW5rX2NhbGxfZnJvbV9tYWluX3RocmVhZChvc3h2aWRlb3NpbmssCisgICAgICBvc3h2aWRlb3NpbmstPm9zeHZpZGVvc2lua29iamVjdCwKKyAgICAgIEBzZWxlY3RvcihjcmVhdGVJbnRlcm5hbFdpbmRvdyksIG5pbCwgWUVTKTsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKG9zeHZpZGVvc2luaywgIk5vIHN1cGVydmlldywgY3JlYXRpbmcgYW4gaW50ZXJuYWwgd2luZG93LiIpOworICB9CisgIFtvc3h3aW5kb3ctPmdzdHZpZXcgc2V0TmF2aWdhdGlvbjogR1NUX05BVklHQVRJT04ob3N4dmlkZW9zaW5rKV07CisgIFtvc3h2aWRlb3NpbmstPm9zeHdpbmRvdy0+Z3N0dmlldyBzZXRLZWVwQXNwZWN0UmF0aW86IG9zeHZpZGVvc2luay0+a2VlcF9wYXJdOworCisgIFtwb29sIHJlbGVhc2VdOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X3ZpZGVvX3Npbmtfb3N4d2luZG93X2Rlc3Ryb3kgKEdzdE9TWFZpZGVvU2luayAqIG9zeHZpZGVvc2luaykKK3sKKyAgTlNBdXRvcmVsZWFzZVBvb2wgKnBvb2w7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX09TWF9WSURFT19TSU5LIChvc3h2aWRlb3NpbmspKTsKKyAgcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworCisgIEdTVF9PQkpFQ1RfTE9DSyAob3N4dmlkZW9zaW5rKTsKKyAgZ3N0X29zeF92aWRlb19zaW5rX2NhbGxfZnJvbV9tYWluX3RocmVhZChvc3h2aWRlb3NpbmssCisgICAgICBvc3h2aWRlb3NpbmstPm9zeHZpZGVvc2lua29iamVjdCwKKyAgICAgIEBzZWxlY3RvcihkZXN0cm95KSwgKGlkKSBuaWwsIFlFUyk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChvc3h2aWRlb3NpbmspOworI2lmbmRlZiBHU1RSRUFNRVJfR0xJQl9DT0NPQV9OU0FQUExJQ0FUSU9OCisgIGdzdF9vc3hfdmlkZW9fc2lua19zdG9wX2NvY29hX2xvb3AgKG9zeHZpZGVvc2luayk7CisjZW5kaWYKKyAgW3Bvb2wgcmVsZWFzZV07Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcmVzaXplcyBhIEdzdFhXaW5kb3cgKi8KK3N0YXRpYyB2b2lkCitnc3Rfb3N4X3ZpZGVvX3Npbmtfb3N4d2luZG93X3Jlc2l6ZSAoR3N0T1NYVmlkZW9TaW5rICogb3N4dmlkZW9zaW5rLAorICAgIEdzdE9TWFdpbmRvdyAqIG9zeHdpbmRvdywgZ3VpbnQgd2lkdGgsIGd1aW50IGhlaWdodCkKK3sKKyAgR3N0T1NYVmlkZW9TaW5rT2JqZWN0ICpvYmplY3QgPSBvc3h2aWRlb3NpbmstPm9zeHZpZGVvc2lua29iamVjdDsKKworICBOU0F1dG9yZWxlYXNlUG9vbCAqcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworICBnX3JldHVybl9pZl9mYWlsIChvc3h3aW5kb3cgIT0gTlVMTCk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19PU1hfVklERU9fU0lOSyAob3N4dmlkZW9zaW5rKSk7CisKKyAgb3N4d2luZG93LT53aWR0aCA9IHdpZHRoOworICBvc3h3aW5kb3ctPmhlaWdodCA9IGhlaWdodDsKKworICBHU1RfREVCVUdfT0JKRUNUIChvc3h2aWRlb3NpbmssICJSZXNpemluZyB3aW5kb3cgdG8gKCVkLCVkKSIsIHdpZHRoLCBoZWlnaHQpOworCisgIC8qIERpcmVjdGx5IHJlc2l6ZSB0aGUgdW5kZXJseWluZyB2aWV3ICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKG9zeHZpZGVvc2luaywgIkNhbGxpbmcgc2V0VmlkZW9TaXplIG9uICVwIiwgb3N4d2luZG93LT5nc3R2aWV3KTsKKyAgZ3N0X29zeF92aWRlb19zaW5rX2NhbGxfZnJvbV9tYWluX3RocmVhZCAob3N4dmlkZW9zaW5rLCBvYmplY3QsCisgICAgICBAc2VsZWN0b3IocmVzaXplKSwgKGlkKW5pbCwgWUVTKTsKKworICBbcG9vbCByZWxlYXNlXTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3N4X3ZpZGVvX3Npbmtfc2V0Y2FwcyAoR3N0QmFzZVNpbmsgKiBic2luaywgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdE9TWFZpZGVvU2luayAqb3N4dmlkZW9zaW5rOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2Jvb2xlYW4gcmVzLCByZXN1bHQgPSBGQUxTRTsKKyAgZ2ludCB2aWRlb193aWR0aCwgdmlkZW9faGVpZ2h0OworCisgIG9zeHZpZGVvc2luayA9IEdTVF9PU1hfVklERU9fU0lOSyAoYnNpbmspOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG9zeHZpZGVvc2luaywgImNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgcmVzID0gZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJ3aWR0aCIsICZ2aWRlb193aWR0aCk7CisgIHJlcyAmPSBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImhlaWdodCIsICZ2aWRlb19oZWlnaHQpOworCisgIGlmICghcmVzKSB7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKG9zeHZpZGVvc2luaywgIm91ciBmb3JtYXQgaXM6ICVkeCVkIHZpZGVvIiwKKyAgICAgIHZpZGVvX3dpZHRoLCB2aWRlb19oZWlnaHQpOworCisgIEdTVF9WSURFT19TSU5LX1dJRFRIIChvc3h2aWRlb3NpbmspID0gdmlkZW9fd2lkdGg7CisgIEdTVF9WSURFT19TSU5LX0hFSUdIVCAob3N4dmlkZW9zaW5rKSA9IHZpZGVvX2hlaWdodDsKKworICBnc3Rfb3N4X3ZpZGVvX3Npbmtfb3N4d2luZG93X3Jlc2l6ZSAob3N4dmlkZW9zaW5rLCBvc3h2aWRlb3NpbmstPm9zeHdpbmRvdywKKyAgICAgIHZpZGVvX3dpZHRoLCB2aWRlb19oZWlnaHQpOworCisgIGdzdF92aWRlb19pbmZvX2Zyb21fY2FwcyAoJm9zeHZpZGVvc2luay0+aW5mbywgY2Fwcyk7CisKKyAgcmVzdWx0ID0gVFJVRTsKKworYmVhY2g6CisgIHJldHVybiByZXN1bHQ7CisKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3Rfb3N4X3ZpZGVvX3NpbmtfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RPU1hWaWRlb1NpbmsgKm9zeHZpZGVvc2luazsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIG9zeHZpZGVvc2luayA9IEdTVF9PU1hfVklERU9fU0lOSyAoZWxlbWVudCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAob3N4dmlkZW9zaW5rLCAiJXMgPT4gJXMiLAorICAgICAgICBnc3RfZWxlbWVudF9zdGF0ZV9nZXRfbmFtZShHU1RfU1RBVEVfVFJBTlNJVElPTl9DVVJSRU5UICh0cmFuc2l0aW9uKSksCisgICAgICAgIGdzdF9lbGVtZW50X3N0YXRlX2dldF9uYW1lKEdTVF9TVEFURV9UUkFOU0lUSU9OX05FWFQgKHRyYW5zaXRpb24pKSk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgLyogQ3JlYXRpbmcgb3VyIHdpbmRvdyBhbmQgb3VyIGltYWdlICovCisgICAgICBHU1RfVklERU9fU0lOS19XSURUSCAob3N4dmlkZW9zaW5rKSA9IDMyMDsKKyAgICAgIEdTVF9WSURFT19TSU5LX0hFSUdIVCAob3N4dmlkZW9zaW5rKSA9IDI0MDsKKyAgICAgIGlmICghZ3N0X29zeF92aWRlb19zaW5rX29zeHdpbmRvd19jcmVhdGUgKG9zeHZpZGVvc2luaywKKyAgICAgICAgICBHU1RfVklERU9fU0lOS19XSURUSCAob3N4dmlkZW9zaW5rKSwKKyAgICAgICAgICBHU1RfVklERU9fU0lOS19IRUlHSFQgKG9zeHZpZGVvc2luaykpKSB7CisgICAgICAgIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gKEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgR1NUX1ZJREVPX1NJTktfV0lEVEggKG9zeHZpZGVvc2luaykgPSAwOworICAgICAgR1NUX1ZJREVPX1NJTktfSEVJR0hUIChvc3h2aWRlb3NpbmspID0gMDsKKyAgICAgIGdzdF9vc3hfdmlkZW9fc2lua19vc3h3aW5kb3dfZGVzdHJveSAob3N4dmlkZW9zaW5rKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKK2RvbmU6CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfb3N4X3ZpZGVvX3Npbmtfc2hvd19mcmFtZSAoR3N0QmFzZVNpbmsgKiBic2luaywgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RPU1hWaWRlb1NpbmsgKm9zeHZpZGVvc2luazsKKyAgR3N0QnVmZmVyT2JqZWN0KiBidWZmZXJvYmplY3Q7CisgIE5TQXV0b3JlbGVhc2VQb29sICpwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07CisKKyAgb3N4dmlkZW9zaW5rID0gR1NUX09TWF9WSURFT19TSU5LIChic2luayk7CisKKyAgR1NUX0RFQlVHICgic2hvd19mcmFtZSIpOworICBidWZmZXJvYmplY3QgPSBbW0dzdEJ1ZmZlck9iamVjdCBhbGxvY10gaW5pdFdpdGhCdWZmZXI6YnVmXTsKKyAgZ3N0X29zeF92aWRlb19zaW5rX2NhbGxfZnJvbV9tYWluX3RocmVhZChvc3h2aWRlb3NpbmssCisgICAgICBvc3h2aWRlb3NpbmstPm9zeHZpZGVvc2lua29iamVjdCwKKyAgICAgIEBzZWxlY3RvcihzaG93RnJhbWU6KSwgYnVmZmVyb2JqZWN0LCBOTyk7CisgIFtwb29sIHJlbGVhc2VdOworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKKy8qIEJ1ZmZlciBtYW5hZ2VtZW50ICovCisKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgSW5pdCAmIENsYXNzIGluaXQgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X3ZpZGVvX3Npbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE9TWFZpZGVvU2luayAqb3N4dmlkZW9zaW5rOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19PU1hfVklERU9fU0lOSyAob2JqZWN0KSk7CisKKyAgb3N4dmlkZW9zaW5rID0gR1NUX09TWF9WSURFT19TSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgQVJHX0VNQkVEOgorICAgICAgZ193YXJuaW5nICgiVGhlIFwiZW1iZWRcIiBwcm9wZXJ0eSBvZiBvc3h2aWRlb3NpbmsgaXMgZGVwcmVjYXRlZCBhbmQgIgorICAgICAgICAgICJoYXMgbm8gZWZmZWN0IGFueW1vcmUuIFVzZSB0aGUgR3N0VmlkZW9PdmVybGF5ICIKKyAgICAgICAgICAiaW5zdGVhZC4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0ZPUkNFX1BBUjoKKyAgICAgIG9zeHZpZGVvc2luay0+a2VlcF9wYXIgPSBnX3ZhbHVlX2dldF9ib29sZWFuKHZhbHVlKTsKKyAgICAgIGlmIChvc3h2aWRlb3NpbmstPm9zeHdpbmRvdykKKyAgICAgICAgW29zeHZpZGVvc2luay0+b3N4d2luZG93LT5nc3R2aWV3CisgICAgICAgICAgICBzZXRLZWVwQXNwZWN0UmF0aW86IG9zeHZpZGVvc2luay0+a2VlcF9wYXJdOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X29zeF92aWRlb19zaW5rX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RPU1hWaWRlb1NpbmsgKm9zeHZpZGVvc2luazsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfT1NYX1ZJREVPX1NJTksgKG9iamVjdCkpOworCisgIG9zeHZpZGVvc2luayA9IEdTVF9PU1hfVklERU9fU0lOSyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIEFSR19FTUJFRDoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBGQUxTRSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19GT1JDRV9QQVI6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgb3N4dmlkZW9zaW5rLT5rZWVwX3Bhcik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zeF92aWRlb19zaW5rX3Byb3Bvc2VfYWxsb2NhdGlvbiAoR3N0QmFzZVNpbmsgKiBiYXNlX3NpbmssIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgICAgZ3N0X3F1ZXJ5X2FkZF9hbGxvY2F0aW9uX21ldGEgKHF1ZXJ5LAorICAgICAgICBHU1RfVklERU9fTUVUQV9BUElfVFlQRSwgTlVMTCk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfdmlkZW9fc2lua19pbml0IChHc3RPU1hWaWRlb1NpbmsgKiBzaW5rKQoreworICBzaW5rLT5vc3h3aW5kb3cgPSBOVUxMOworICBzaW5rLT5zdXBlcnZpZXcgPSBOVUxMOworICBzaW5rLT5vc3h2aWRlb3NpbmtvYmplY3QgPSBbW0dzdE9TWFZpZGVvU2lua09iamVjdCBhbGxvY10gaW5pdFdpdGhTaW5rOnNpbmtdOworICBzaW5rLT5rZWVwX3BhciA9IEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zeF92aWRlb19zaW5rX2Jhc2VfaW5pdCAoZ3BvaW50ZXIgZ19jbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGdfY2xhc3MpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJPU1ggVmlkZW8gc2luayIsCisgICAgICAiU2luay9WaWRlbyIsICJPU1ggbmF0aXZlIHZpZGVvc2luayIsCisgICAgICAiWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZnc3Rfb3N4X3ZpZGVvX3Npbmtfc2lua190ZW1wbGF0ZV9mYWN0b3J5KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfdmlkZW9fc2lua19maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBHc3RPU1hWaWRlb1NpbmsgKm9zeHZpZGVvc2luayA9IEdTVF9PU1hfVklERU9fU0lOSyAob2JqZWN0KTsKKworICBpZiAob3N4dmlkZW9zaW5rLT5zdXBlcnZpZXcpCisgICAgW29zeHZpZGVvc2luay0+c3VwZXJ2aWV3IHJlbGVhc2VdOworCisgIGlmIChvc3h2aWRlb3NpbmstPm9zeHZpZGVvc2lua29iamVjdCkKKyAgICBbKEdzdE9TWFZpZGVvU2lua09iamVjdCopKG9zeHZpZGVvc2luay0+b3N4dmlkZW9zaW5rb2JqZWN0KSByZWxlYXNlXTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X3ZpZGVvX3NpbmtfY2xhc3NfaW5pdCAoR3N0T1NYVmlkZW9TaW5rQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEJhc2VTaW5rQ2xhc3MgKmdzdGJhc2VzaW5rX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MgPSAoR3N0QmFzZVNpbmtDbGFzcyAqKSBrbGFzczsKKworICBwYXJlbnRfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcmVmIChHU1RfVFlQRV9WSURFT19TSU5LKTsKKyAgc2lua19jbGFzcyA9IGtsYXNzOworCisgIGtsYXNzLT5ydW5fbG9vcF9zdGF0ZSA9IEdTVF9PU1hfVklERU9fU0lOS19SVU5fTE9PUF9TVEFURV9VTktOT1dOOworICBrbGFzcy0+bnNfYXBwX3RocmVhZCA9IE5VTEw7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X29zeF92aWRlb19zaW5rX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X29zeF92aWRlb19zaW5rX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3Rfb3N4X3ZpZGVvX3NpbmtfZmluYWxpemU7CisKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnNldF9jYXBzID0gZ3N0X29zeF92aWRlb19zaW5rX3NldGNhcHM7CisgIGdzdGJhc2VzaW5rX2NsYXNzLT5wcmVyb2xsID0gZ3N0X29zeF92aWRlb19zaW5rX3Nob3dfZnJhbWU7CisgIGdzdGJhc2VzaW5rX2NsYXNzLT5yZW5kZXIgPSBnc3Rfb3N4X3ZpZGVvX3Npbmtfc2hvd19mcmFtZTsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnByb3Bvc2VfYWxsb2NhdGlvbiA9IGdzdF9vc3hfdmlkZW9fc2lua19wcm9wb3NlX2FsbG9jYXRpb247CisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9vc3hfdmlkZW9fc2lua19jaGFuZ2Vfc3RhdGU7CisKKyAgLyoqCisgICAqIEdzdE9TWFZpZGVvU2luazplbWJlZAorICAgKgorICAgKiBGb3IgQUJJIGNvbWF0aWJpbGl0eSBvbnlsLCBkbyBub3QgdXNlCisgICAqCisgICAqKi8KKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBBUkdfRU1CRUQsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImVtYmVkIiwgImVtYmVkIiwgIkZvciBBQkkgY29tcGF0aWJsaXR5IG9ubHksIGRvIG5vdCB1c2UiLAorICAgICAgICAgIEZBTFNFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0T1NYVmlkZW9TaW5rOmZvcmNlLWFzcGVjdC1yYXRpbworICAgKgorICAgKiBXaGVuIGVuYWJsZWQsIHNjYWxpbmcgd2lsbCByZXNwZWN0IG9yaWdpbmFsIGFzcGVjdCByYXRpby4KKyAgICoKKyAgICoqLworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIEFSR19GT1JDRV9QQVIsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImZvcmNlLWFzcGVjdC1yYXRpbyIsICJmb3JjZSBhc3BlY3QgcmF0aW9uIiwKKyAgICAgICAgICAiV2hlbiBlbmFibGVkLCBzY2FsaW5nIHdpbGwgcmVzcGVjdCBvcmlnaW5hbCBhc3BlY3QgcmF0aW9uIiwKKyAgICAgICAgICBUUlVFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfdmlkZW9fc2lua19uYXZpZ2F0aW9uX3NlbmRfZXZlbnQgKEdzdE5hdmlnYXRpb24gKiBuYXZpZ2F0aW9uLAorICAgIEdzdFN0cnVjdHVyZSAqIHN0cnVjdHVyZSkKK3sKKyAgR3N0T1NYVmlkZW9TaW5rICpvc3h2aWRlb3NpbmsgPSBHU1RfT1NYX1ZJREVPX1NJTksgKG5hdmlnYXRpb24pOworICBHc3RQYWQgKnBlZXI7CisgIEdzdEV2ZW50ICpldmVudDsKKyAgR3N0VmlkZW9SZWN0YW5nbGUgc3JjID0geyAwLCB9OworICBHc3RWaWRlb1JlY3RhbmdsZSBkc3QgPSB7IDAsIH07CisgIEdzdFZpZGVvUmVjdGFuZ2xlIHJlc3VsdDsKKyAgTlNSZWN0IGJvdW5kczsKKyAgZ2RvdWJsZSB4LCB5LCB4c2NhbGUgPSAxLjAsIHlzY2FsZSA9IDEuMDsKKworICBwZWVyID0gZ3N0X3BhZF9nZXRfcGVlciAoR1NUX1ZJREVPX1NJTktfUEFEIChvc3h2aWRlb3NpbmspKTsKKworICBpZiAoIXBlZXIgfHwgIW9zeHZpZGVvc2luay0+b3N4d2luZG93KQorICAgIHJldHVybjsKKworICBldmVudCA9IGdzdF9ldmVudF9uZXdfbmF2aWdhdGlvbiAoc3RydWN0dXJlKTsKKworICBib3VuZHMgPSBbb3N4dmlkZW9zaW5rLT5vc3h3aW5kb3ctPmdzdHZpZXcgZ2V0RHJhd2luZ0JvdW5kc107CisKKyAgaWYgKG9zeHZpZGVvc2luay0+a2VlcF9wYXIpIHsKKyAgICAvKiBXZSBnZXQgdGhlIGZyYW1lIHBvc2l0aW9uIHVzaW5nIHRoZSBjYWxjdWxhdGVkIGdlb21ldHJ5IGZyb20gX3NldGNhcHMKKyAgICAgICB0aGF0IHJlc3BlY3QgcGl4ZWwgYXNwZWN0IHJhdGlvcyAqLworICAgIHNyYy53ID0gR1NUX1ZJREVPX1NJTktfV0lEVEggKG9zeHZpZGVvc2luayk7CisgICAgc3JjLmggPSBHU1RfVklERU9fU0lOS19IRUlHSFQgKG9zeHZpZGVvc2luayk7CisgICAgZHN0LncgPSBib3VuZHMuc2l6ZS53aWR0aDsKKyAgICBkc3QuaCA9IGJvdW5kcy5zaXplLmhlaWdodDsKKworICAgIGdzdF92aWRlb19zaW5rX2NlbnRlcl9yZWN0IChzcmMsIGRzdCwgJnJlc3VsdCwgVFJVRSk7CisgICAgcmVzdWx0LnggKz0gYm91bmRzLm9yaWdpbi54OworICAgIHJlc3VsdC55ICs9IGJvdW5kcy5vcmlnaW4ueTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQueCA9IGJvdW5kcy5vcmlnaW4ueDsKKyAgICByZXN1bHQueSA9IGJvdW5kcy5vcmlnaW4ueTsKKyAgICByZXN1bHQudyA9IGJvdW5kcy5zaXplLndpZHRoOworICAgIHJlc3VsdC5oID0gYm91bmRzLnNpemUuaGVpZ2h0OworICB9CisKKyAgLyogV2UgY2FsY3VsYXRlIHNjYWxpbmcgdXNpbmcgdGhlIG9yaWdpbmFsIHZpZGVvIGZyYW1lcyBnZW9tZXRyeSB0byBpbmNsdWRlCisgICAgIHBpeGVsIGFzcGVjdCByYXRpbyBzY2FsaW5nLiAqLworICB4c2NhbGUgPSAoZ2RvdWJsZSkgb3N4dmlkZW9zaW5rLT5vc3h3aW5kb3ctPndpZHRoIC8gcmVzdWx0Lnc7CisgIHlzY2FsZSA9IChnZG91YmxlKSBvc3h2aWRlb3NpbmstPm9zeHdpbmRvdy0+aGVpZ2h0IC8gcmVzdWx0Lmg7CisKKyAgLyogQ29udmVydGluZyBwb2ludGVyIGNvb3JkaW5hdGVzIHRvIHRoZSBub24gc2NhbGVkIGdlb21ldHJ5ICovCisgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9kb3VibGUgKHN0cnVjdHVyZSwgInBvaW50ZXJfeCIsICZ4KSkgeworICAgIHggPSBNSU4gKHgsIHJlc3VsdC54ICsgcmVzdWx0LncpOworICAgIHggPSBNQVggKHggLSByZXN1bHQueCwgMCk7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHN0cnVjdHVyZSwgInBvaW50ZXJfeCIsIEdfVFlQRV9ET1VCTEUsCisgICAgICAgIChnZG91YmxlKSB4ICogeHNjYWxlLCBOVUxMKTsKKyAgfQorICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfZG91YmxlIChzdHJ1Y3R1cmUsICJwb2ludGVyX3kiLCAmeSkpIHsKKyAgICB5ID0gTUlOICh5LCByZXN1bHQueSArIHJlc3VsdC5oKTsKKyAgICB5ID0gTUFYICh5IC0gcmVzdWx0LnksIDApOworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzdHJ1Y3R1cmUsICJwb2ludGVyX3kiLCBHX1RZUEVfRE9VQkxFLAorICAgICAgICAoZ2RvdWJsZSkgeSAqIHlzY2FsZSwgTlVMTCk7CisgIH0KKworICBnc3RfcGFkX3NlbmRfZXZlbnQgKHBlZXIsIGV2ZW50KTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGVlcik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X3ZpZGVvX3NpbmtfbmF2aWdhdGlvbl9pbml0IChHc3ROYXZpZ2F0aW9uSW50ZXJmYWNlICogaWZhY2UpCit7CisgIGlmYWNlLT5zZW5kX2V2ZW50ID0gZ3N0X29zeF92aWRlb19zaW5rX25hdmlnYXRpb25fc2VuZF9ldmVudDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfdmlkZW9fc2lua19zZXRfd2luZG93X2hhbmRsZSAoR3N0VmlkZW9PdmVybGF5ICogb3ZlcmxheSwgZ3VpbnRwdHIgaGFuZGxlX2lkKQoreworICBHc3RPU1hWaWRlb1NpbmsgKm9zeHZpZGVvc2luayA9IEdTVF9PU1hfVklERU9fU0lOSyAob3ZlcmxheSk7CisgIE5TVmlldyAqdmlldyA9IChOU1ZpZXcgKikgaGFuZGxlX2lkOworCisgIGdzdF9vc3hfdmlkZW9fc2lua19jYWxsX2Zyb21fbWFpbl90aHJlYWQob3N4dmlkZW9zaW5rLAorICAgICAgb3N4dmlkZW9zaW5rLT5vc3h2aWRlb3NpbmtvYmplY3QsCisgICAgICBAc2VsZWN0b3Ioc2V0VmlldzopLCB2aWV3LCBZRVMpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zeF92aWRlb19zaW5rX3hvdmVybGF5X2luaXQgKEdzdFZpZGVvT3ZlcmxheUludGVyZmFjZSAqIGlmYWNlKQoreworICBpZmFjZS0+c2V0X3dpbmRvd19oYW5kbGUgPSBnc3Rfb3N4X3ZpZGVvX3Npbmtfc2V0X3dpbmRvd19oYW5kbGU7CisgIGlmYWNlLT5leHBvc2UgPSBOVUxMOworICBpZmFjZS0+aGFuZGxlX2V2ZW50cyA9IE5VTEw7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICBQdWJsaWMgTWV0aG9kcyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgT2JqZWN0IHR5cGluZyAmIENyZWF0aW9uICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitHVHlwZQorZ3N0X29zeF92aWRlb19zaW5rX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgb3N4dmlkZW9zaW5rX3R5cGUgPSAwOworCisgIGlmICghb3N4dmlkZW9zaW5rX3R5cGUpIHsKKyAgICBzdGF0aWMgY29uc3QgR1R5cGVJbmZvIG9zeHZpZGVvc2lua19pbmZvID0geworICAgICAgc2l6ZW9mIChHc3RPU1hWaWRlb1NpbmtDbGFzcyksCisgICAgICBnc3Rfb3N4X3ZpZGVvX3NpbmtfYmFzZV9pbml0LAorICAgICAgTlVMTCwKKyAgICAgIChHQ2xhc3NJbml0RnVuYykgZ3N0X29zeF92aWRlb19zaW5rX2NsYXNzX2luaXQsCisgICAgICBOVUxMLAorICAgICAgTlVMTCwKKyAgICAgIHNpemVvZiAoR3N0T1NYVmlkZW9TaW5rKSwKKyAgICAgIDAsCisgICAgICAoR0luc3RhbmNlSW5pdEZ1bmMpIGdzdF9vc3hfdmlkZW9fc2lua19pbml0LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgR0ludGVyZmFjZUluZm8gb3ZlcmxheV9pbmZvID0geworICAgICAgKEdJbnRlcmZhY2VJbml0RnVuYykgZ3N0X29zeF92aWRlb19zaW5rX3hvdmVybGF5X2luaXQsCisgICAgICBOVUxMLAorICAgICAgTlVMTCwKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IEdJbnRlcmZhY2VJbmZvIG5hdmlnYXRpb25faW5mbyA9IHsKKyAgICAgIChHSW50ZXJmYWNlSW5pdEZ1bmMpIGdzdF9vc3hfdmlkZW9fc2lua19uYXZpZ2F0aW9uX2luaXQsCisgICAgICBOVUxMLAorICAgICAgTlVMTCwKKyAgICB9OworICAgIG9zeHZpZGVvc2lua190eXBlID0gZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyAoR1NUX1RZUEVfVklERU9fU0lOSywKKyAgICAgICAgIkdzdE9TWFZpZGVvU2luayIsICZvc3h2aWRlb3NpbmtfaW5mbywgMCk7CisKKyAgICBnX3R5cGVfYWRkX2ludGVyZmFjZV9zdGF0aWMgKG9zeHZpZGVvc2lua190eXBlLCBHU1RfVFlQRV9WSURFT19PVkVSTEFZLAorICAgICAgICAmb3ZlcmxheV9pbmZvKTsKKyAgICBnX3R5cGVfYWRkX2ludGVyZmFjZV9zdGF0aWMgKG9zeHZpZGVvc2lua190eXBlLCBHU1RfVFlQRV9OQVZJR0FUSU9OLAorICAgICAgICAmbmF2aWdhdGlvbl9pbmZvKTsKKyAgfQorCisgIHJldHVybiBvc3h2aWRlb3NpbmtfdHlwZTsKK30KKworQGltcGxlbWVudGF0aW9uIEdzdFdpbmRvd0RlbGVnYXRlCistIChpZCkgaW5pdFdpdGhTaW5rOiAoR3N0T1NYVmlkZW9TaW5rICopIHNpbmsKK3sKKyAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgc2VsZi0+b3N4dmlkZW9zaW5rID0gc2luazsKKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpd2luZG93V2lsbENsb3NlOihOU05vdGlmaWNhdGlvbiAqKW5vdGlmaWNhdGlvbiB7CisgIC8qIE9ubHkgaGFuZGxlIGNsb3NlIGV2ZW50cyBpZiB0aGUgd2luZG93IHdhcyBjbG9zZWQgbWFudWFsbHkgYnkgdGhlIHVzZXIKKyAgICogYW5kIG5vdCBiZWN1YXNlIG9mIGEgc3RhdGUgY2hhbmdlIHN0YXRlIHRvIFJFQURZICovCisgIGlmIChvc3h2aWRlb3NpbmstPm9zeHdpbmRvdyA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmICghb3N4dmlkZW9zaW5rLT5vc3h3aW5kb3ctPmNsb3NlZCkgeworICAgIG9zeHZpZGVvc2luay0+b3N4d2luZG93LT5jbG9zZWQgPSBUUlVFOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChvc3h2aWRlb3NpbmssIFJFU09VUkNFLCBOT1RfRk9VTkQsICgiT3V0cHV0IHdpbmRvdyB3YXMgY2xvc2VkIiksIChOVUxMKSk7CisgICAgZ3N0X29zeF92aWRlb19zaW5rX29zeHdpbmRvd19kZXN0cm95KG9zeHZpZGVvc2luayk7CisgIH0KK30KKworQGVuZAorCitAIGltcGxlbWVudGF0aW9uIEdzdE9TWFZpZGVvU2lua09iamVjdAorCistKGlkKSBpbml0V2l0aFNpbms6IChHc3RPU1hWaWRlb1NpbmsqKSBzaW5rCit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIHNlbGYtPm9zeHZpZGVvc2luayA9IGdzdF9vYmplY3RfcmVmIChzaW5rKTsKKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0odm9pZCkgZGVhbGxvYyB7CisgIGdzdF9vYmplY3RfdW5yZWYgKG9zeHZpZGVvc2luayk7CisgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLSh2b2lkKSBjcmVhdGVJbnRlcm5hbFdpbmRvdworeworICBHc3RPU1hXaW5kb3cgKm9zeHdpbmRvdyA9IG9zeHZpZGVvc2luay0+b3N4d2luZG93OworICBOU1JlY3QgcmVjdDsKKyAgdW5zaWduZWQgaW50IG1hc2s7CisKKyAgW05TQXBwbGljYXRpb24gc2hhcmVkQXBwbGljYXRpb25dOworCisgIG9zeHdpbmRvdy0+aW50ZXJuYWwgPSBUUlVFOworCisgIG1hc2sgPSAgTlNXaW5kb3dTdHlsZU1hc2tUaXRsZWQgICAgICAgICAgICAgfAorICAgICAgICAgIE5TV2luZG93U3R5bGVNYXNrQ2xvc2FibGUgICAgICAgICAgIHwKKyAgICAgICAgICBOU1dpbmRvd1N0eWxlTWFza1Jlc2l6YWJsZSAgICAgICAgICB8CisgICAgICAgICAgTlNXaW5kb3dTdHlsZU1hc2tUZXh0dXJlZEJhY2tncm91bmQgfAorICAgICAgICAgIE5TV2luZG93U3R5bGVNYXNrTWluaWF0dXJpemFibGU7CisKKyAgcmVjdC5vcmlnaW4ueCA9IDEwMC4wOworICByZWN0Lm9yaWdpbi55ID0gMTAwLjA7CisgIHJlY3Quc2l6ZS53aWR0aCA9IChmbG9hdCkgb3N4d2luZG93LT53aWR0aDsKKyAgcmVjdC5zaXplLmhlaWdodCA9IChmbG9hdCkgb3N4d2luZG93LT5oZWlnaHQ7CisKKyAgb3N4d2luZG93LT53aW4gPVtbW0dzdE9TWFZpZGVvU2lua1dpbmRvdyBhbGxvY10KKyAgICAgICAgICAgICAgICAgICAgICAgaW5pdFdpdGhDb250ZW50TlNSZWN0OiByZWN0CisgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlTWFzazogbWFzaworICAgICAgICAgICAgICAgICAgICAgICBiYWNraW5nOiBOU0JhY2tpbmdTdG9yZUJ1ZmZlcmVkCisgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyOiBOTworICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW46IG5pbF0gcmV0YWluXTsKKyAgR1NUX0RFQlVHKCJWaWRlb1NpbmtXaW5kb3cgY3JlYXRlZCwgJXAiLCBvc3h3aW5kb3ctPndpbik7CisgIFtvc3h3aW5kb3ctPndpbiBvcmRlckZyb250UmVnYXJkbGVzc107CisgIG9zeHdpbmRvdy0+Z3N0dmlldyA9W29zeHdpbmRvdy0+d2luIGdzdFZpZXddOworICBbb3N4d2luZG93LT53aW4gc2V0RGVsZWdhdGU6W1tHc3RXaW5kb3dEZWxlZ2F0ZSBhbGxvY10KKyAgICAgIGluaXRXaXRoU2luazpvc3h2aWRlb3NpbmtdXTsKKworfQorCisrIChCT09MKSBpc01haW5UaHJlYWQKK3sKKyAgLyogRklYTUU6IGlkZWFsbHkgd2Ugc2hvdWxkIHJldHVybiBZRVMgb25seSBmb3IgLT5uc19hcHBfdGhyZWFkIGhlcmUgKi8KKyAgcmV0dXJuIFlFUzsKK30KKworLSAodm9pZCkgc2V0VmlldzogKE5TVmlldyopdmlldworeworICBOU0F1dG9yZWxlYXNlUG9vbCAqcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworCisgIGlmIChvc3h2aWRlb3NpbmstPnN1cGVydmlldykgeworICAgIEdTVF9JTkZPX09CSkVDVCAob3N4dmlkZW9zaW5rLCAib2xkIHh3aW5kb3cgaWQgJXAiLCBvc3h2aWRlb3NpbmstPnN1cGVydmlldyk7CisgICAgaWYgKG9zeHZpZGVvc2luay0+b3N4d2luZG93KSB7CisgICAgICBbb3N4dmlkZW9zaW5rLT5vc3h3aW5kb3ctPmdzdHZpZXcgcmVtb3ZlRnJvbVN1cGVydmlld107CisgICAgfQorICAgIFtvc3h2aWRlb3NpbmstPnN1cGVydmlldyByZWxlYXNlXTsKKyAgfQorICBpZiAob3N4dmlkZW9zaW5rLT5vc3h3aW5kb3cgIT0gTlVMTCAmJiB2aWV3ICE9IE5VTEwpIHsKKyAgICBpZiAob3N4dmlkZW9zaW5rLT5vc3h3aW5kb3ctPmludGVybmFsKSB7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKG9zeHZpZGVvc2luaywgImNsb3NpbmcgaW50ZXJuYWwgd2luZG93Iik7CisgICAgICBvc3h2aWRlb3NpbmstPm9zeHdpbmRvdy0+Y2xvc2VkID0gVFJVRTsKKyAgICAgIFtvc3h2aWRlb3NpbmstPm9zeHdpbmRvdy0+d2luIGNsb3NlXTsKKyAgICAgIFtvc3h2aWRlb3NpbmstPm9zeHdpbmRvdy0+d2luIHJlbGVhc2VdOworICAgIH0KKyAgfQorCisgIEdTVF9JTkZPX09CSkVDVCAob3N4dmlkZW9zaW5rLCAic2V0IHh3aW5kb3cgaWQgJXAiLCB2aWV3KTsKKyAgb3N4dmlkZW9zaW5rLT5zdXBlcnZpZXcgPSBbdmlldyByZXRhaW5dOworICBpZiAob3N4dmlkZW9zaW5rLT5vc3h3aW5kb3cpIHsKKyAgICBbb3N4dmlkZW9zaW5rLT5vc3h3aW5kb3ctPmdzdHZpZXcgYWRkVG9TdXBlcnZpZXc6IG9zeHZpZGVvc2luay0+c3VwZXJ2aWV3XTsKKyAgICBpZiAodmlldykgeworICAgICAgb3N4dmlkZW9zaW5rLT5vc3h3aW5kb3ctPmludGVybmFsID0gRkFMU0U7CisgICAgfQorICB9CisKKyAgW3Bvb2wgcmVsZWFzZV07Cit9CisKKy0gKHZvaWQpIHJlc2l6ZQoreworICBHc3RPU1hXaW5kb3cgKm9zeHdpbmRvdyA9IG9zeHZpZGVvc2luay0+b3N4d2luZG93OworCisgIE5TQXV0b3JlbGVhc2VQb29sICpwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07CisKKyAgR1NUX0lORk9fT0JKRUNUIChvc3h2aWRlb3NpbmssICJyZXNpemluZyIpOworICBOU1NpemUgc2l6ZSA9IHtvc3h3aW5kb3ctPndpZHRoLCBvc3h3aW5kb3ctPmhlaWdodH07CisgIGlmIChvc3h3aW5kb3ctPmludGVybmFsKSB7CisgICAgW29zeHdpbmRvdy0+d2luIHNldENvbnRlbnRTaXplOnNpemVdOworICB9CisgIGlmIChvc3h3aW5kb3ctPmdzdHZpZXcpIHsKKyAgICAgIFtvc3h3aW5kb3ctPmdzdHZpZXcgc2V0VmlkZW9TaXplIDooaW50KW9zeHdpbmRvdy0+d2lkdGggOihpbnQpb3N4d2luZG93LT5oZWlnaHRdOworICB9CisgIEdTVF9JTkZPX09CSkVDVCAob3N4dmlkZW9zaW5rLCAiZG9uZSIpOworCisgIFtwb29sIHJlbGVhc2VdOworfQorCistICh2b2lkKSBzaG93RnJhbWU6IChHc3RCdWZmZXJPYmplY3QgKikgb2JqZWN0Cit7CisgIEdzdFZpZGVvRnJhbWUgZnJhbWU7CisgIGd1aW50OCAqZGF0YSwgKnJlYWRwLCAqd3JpdGVwOworICBnaW50IGksIGFjdGl2ZV93aWR0aCwgc3RyaWRlOworICBndWludDggKnRleHR1cmVfYnVmZmVyOworICBOU0F1dG9yZWxlYXNlUG9vbCAqcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworICBHc3RCdWZmZXIgKmJ1ZiA9IG9iamVjdC0+YnVmOworCisgIEdTVF9PQkpFQ1RfTE9DSyAob3N4dmlkZW9zaW5rKTsKKyAgaWYgKG9zeHZpZGVvc2luay0+b3N4d2luZG93ID09IE5VTEwpCisgICAgICBnb3RvIG5vX3dpbmRvdzsKKworICB0ZXh0dXJlX2J1ZmZlciA9IChndWludDggKikgW29zeHZpZGVvc2luay0+b3N4d2luZG93LT5nc3R2aWV3IGdldFRleHR1cmVCdWZmZXJdOworICBpZiAoR19VTkxJS0VMWSAodGV4dHVyZV9idWZmZXIgPT0gTlVMTCkpCisgICAgICBnb3RvIG5vX3RleHR1cmVfYnVmZmVyOworCisgIGlmICghZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJmZyYW1lLCAmb3N4dmlkZW9zaW5rLT5pbmZvLCBidWYsIEdTVF9NQVBfUkVBRCkpCisgICAgICBnb3RvIG5vX21hcDsKKworICBkYXRhID0gcmVhZHAgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoJmZyYW1lLCAwKTsKKyAgc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoJmZyYW1lLCAwKTsKKyAgd3JpdGVwID0gdGV4dHVyZV9idWZmZXI7CisgIGFjdGl2ZV93aWR0aCA9IEdTVF9WSURFT19TSU5LX1dJRFRIIChvc3h2aWRlb3NpbmspICogc2l6ZW9mIChzaG9ydCk7CisgIGZvciAoaSA9IDA7IGkgPCBHU1RfVklERU9fU0lOS19IRUlHSFQgKG9zeHZpZGVvc2luayk7IGkrKykgeworICAgICAgbWVtY3B5ICh3cml0ZXAsIHJlYWRwLCBhY3RpdmVfd2lkdGgpOworICAgICAgd3JpdGVwICs9IGFjdGl2ZV93aWR0aDsKKyAgICAgIHJlYWRwICs9IHN0cmlkZTsKKyAgfQorICBbb3N4dmlkZW9zaW5rLT5vc3h3aW5kb3ctPmdzdHZpZXcgZGlzcGxheVRleHR1cmVdOworCisgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJmZyYW1lKTsKKworb3V0OgorICBHU1RfT0JKRUNUX1VOTE9DSyAob3N4dmlkZW9zaW5rKTsKKyAgW29iamVjdCByZWxlYXNlXTsKKworICBbcG9vbCByZWxlYXNlXTsKKyAgcmV0dXJuOworCitub19tYXA6CisgIEdTVF9XQVJOSU5HX09CSkVDVCAob3N4dmlkZW9zaW5rLCAiY291bGRuJ3QgbWFwIGZyYW1lIik7CisgIGdvdG8gb3V0OworCitub193aW5kb3c6CisgIEdTVF9XQVJOSU5HX09CSkVDVCAob3N4dmlkZW9zaW5rLCAibm90IHNob3dpbmcgZnJhbWUgc2luY2Ugd2UgaGF2ZSBubyB3aW5kb3cgKCE/KSIpOworICBnb3RvIG91dDsKKworbm9fdGV4dHVyZV9idWZmZXI6CisgIEdTVF9FTEVNRU5UX0VSUk9SIChvc3h2aWRlb3NpbmssIFJFU09VUkNFLCBXUklURSwgKE5VTEwpLAorICAgICAgICAgICgidGhlIHRleHR1cmUgYnVmZmVyIGlzIE5VTEwiKSk7CisgIGdvdG8gb3V0OworfQorCistKHZvaWQpIGRlc3Ryb3kKK3sKKyAgTlNBdXRvcmVsZWFzZVBvb2wgKnBvb2w7CisgIEdzdE9TWFdpbmRvdyAqb3N4d2luZG93OworCisgIHBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKKworICBvc3h3aW5kb3cgPSBvc3h2aWRlb3NpbmstPm9zeHdpbmRvdzsKKyAgb3N4dmlkZW9zaW5rLT5vc3h3aW5kb3cgPSBOVUxMOworCisgIGlmIChvc3h3aW5kb3cpIHsKKyAgICBpZiAob3N4dmlkZW9zaW5rLT5zdXBlcnZpZXcpIHsKKyAgICAgIFtvc3h3aW5kb3ctPmdzdHZpZXcgcmVtb3ZlRnJvbVN1cGVydmlld107CisgICAgfQorICAgIFtvc3h3aW5kb3ctPmdzdHZpZXcgcmVsZWFzZV07CisgICAgaWYgKG9zeHdpbmRvdy0+aW50ZXJuYWwpIHsKKyAgICAgIGlmICghb3N4d2luZG93LT5jbG9zZWQpIHsKKyAgICAgICAgb3N4d2luZG93LT5jbG9zZWQgPSBUUlVFOworICAgICAgICBbb3N4d2luZG93LT53aW4gY2xvc2VdOworICAgICAgICBbb3N4d2luZG93LT53aW4gcmVsZWFzZV07CisgICAgICB9CisgICAgfQorICAgIGdfZnJlZSAob3N4d2luZG93KTsKKyAgfQorICBbcG9vbCByZWxlYXNlXTsKK30KKworI2lmbmRlZiBHU1RSRUFNRVJfR0xJQl9DT0NPQV9OU0FQUExJQ0FUSU9OCistKHZvaWQpIG5zQXBwVGhyZWFkCit7CisgIE5TQXV0b3JlbGVhc2VQb29sICpwb29sOworCisgIC8qIHNldCB0aGUgbWFpbiBydW5sb29wIGFzIHRoZSBydW5sb29wIGZvciB0aGUgY3VycmVudCB0aHJlYWQuIFRoaXMgaGFzIHRoZQorICAgKiBlZmZlY3QgdGhhdCBjYWxsaW5nIE5TQXBwIG5leHRFdmVudE1hdGNoaW5nTWFzazp1bnRpbERhdGU6aW5Nb2RlOmRlcXVldWUKKyAgICogcnVucyB0aGUgbWFpbiBydW5sb29wLgorICAgKi8KKyAgX0NGUnVuTG9vcFNldEN1cnJlbnQoQ0ZSdW5Mb29wR2V0TWFpbigpKTsKKworICAvKiB0aGlzIGlzIG5lZWRlZCB0byBtYWtlIElzTWFpblRocmVhZCBjaGVja3MgaW4gY29yZSBmb3VuZGF0aW9uIHdvcmsgZnJvbSB0aGUKKyAgICogY3VycmVudCB0aHJlYWQKKyAgICovCisgIF9DRk1haW5QVGhyZWFkID0gcHRocmVhZF9zZWxmKCk7CisKKyAgcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworCisgIFtOU0FwcGxpY2F0aW9uIHNoYXJlZEFwcGxpY2F0aW9uXTsKKyAgW05TQXBwIGZpbmlzaExhdW5jaGluZ107CisKKyAgZ19tdXRleF9sb2NrICgmX3J1bl9sb29wX211dGV4KTsKKyAgZ19jb25kX3NpZ25hbCAoJl9ydW5fbG9vcF9jb25kKTsKKyAgZ19tdXRleF91bmxvY2sgKCZfcnVuX2xvb3BfbXV0ZXgpOworCisgIC8qIHJ1biB0aGUgbG9vcCAqLworICBydW5fbnNfYXBwX2xvb3AgKCk7CisKKyAgW3Bvb2wgcmVsZWFzZV07Cit9CisKKy0odm9pZCkgY2hlY2tNYWluUnVuTG9vcAoreworICBnX211dGV4X2xvY2sgKCZfcnVuX2xvb3BfbXV0ZXgpOworICBnX2NvbmRfc2lnbmFsICgmX3J1bl9sb29wX2NvbmQpOworICBnX211dGV4X3VubG9jayAoJl9ydW5fbG9vcF9tdXRleCk7Cit9CisjZW5kaWYKKworQGVuZAorCitAIGltcGxlbWVudGF0aW9uIEdzdEJ1ZmZlck9iamVjdAorLShpZCkgaW5pdFdpdGhCdWZmZXI6IChHc3RCdWZmZXIqKSBidWZmZXIKK3sKKyAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgZ3N0X2J1ZmZlcl9yZWYoYnVmZmVyKTsKKyAgc2VsZi0+YnVmID0gYnVmZmVyOworICByZXR1cm4gc2VsZjsKK30KKworLSh2b2lkKSBkZWFsbG9jeworICBnc3RfYnVmZmVyX3VucmVmKGJ1Zik7CisgIFtzdXBlciBkZWFsbG9jXTsKK30KK0BlbmQKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIm9zeHZpZGVvc2luayIsCisgICAgICAgICAgR1NUX1JBTktfTUFSR0lOQUwsIEdTVF9UWVBFX09TWF9WSURFT19TSU5LKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9kZWJ1Z19vc3hfdmlkZW9fc2luaywgIm9zeHZpZGVvc2luayIsIDAsCisgICAgICAib3N4dmlkZW9zaW5rIGVsZW1lbnQiKTsKKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIG9zeHZpZGVvLAorICAgICJPU1ggbmF0aXZlIHZpZGVvIG91dHB1dCBwbHVnaW4iLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvTWFrZWZpbGUuYW0gYi9zeXMvdjRsMi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTI2YzExCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw3NCBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0dmlkZW80bGludXgyLmxhCisKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9jb21tb24vZ3N0LWdsaWItZ2VuLm1haworCitsaWJnc3R2aWRlbzRsaW51eDJfbGFfU09VUkNFUyA9IGdzdHY0bDIuYyBcCisJCQkJZ3N0djRsMmFsbG9jYXRvci5jIFwKKwkJCQlnc3R2NGwyY29sb3JiYWxhbmNlLmMgXAorCQkJCWdzdHY0bDJkZXZpY2Vwcm92aWRlci5jIFwKKwkJCQlnc3R2NGwyb2JqZWN0LmMgXAorCQkJCWdzdHY0bDJidWZmZXJwb29sLmMgXAorCQkJCWdzdHY0bDJzaW5rLmMgXAorCQkJCWdzdHY0bDJzcmMuYyBcCisJCQkJZ3N0djRsMnJhZGlvLmMgXAorCQkJCWdzdHY0bDJ0dW5lci5jIFwKKwkJCQlnc3R2NGwydHJhbnNmb3JtLmMgXAorCQkJCWdzdHY0bDJ2aWRlb2RlYy5jIFwKKwkJCQlnc3R2NGwydmlkZW9lbmMuYyBcCisJCQkJZ3N0djRsMmgyNjNlbmMuYyBcCisJCQkJZ3N0djRsMmgyNjRlbmMuYyBcCisJCQkJZ3N0djRsMm1wZWc0ZW5jLmMgXAorCQkJCWdzdHY0bDJ2aWRvcmllbnQuYyBcCisJCQkJZ3N0djRsMnZwOGVuYy5jIFwKKwkJCQlnc3R2NGwydnA5ZW5jLmMgXAorCQkJCXY0bDJfY2FsbHMuYyBcCisJCQkJdjRsMi11dGlscy5jIFwKKwkJCQl0dW5lci5jIFwKKwkJCQl0dW5lcmNoYW5uZWwuYyBcCisJCQkJdHVuZXJub3JtLmMKKworbGliZ3N0dmlkZW80bGludXgyX2xhX0NGTEFHUyA9ICAgJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgXAorCQkJCSAkKEdTVF9CQVNFX0NGTEFHUykgXAorCQkJCSAkKEdTVF9DRkxBR1MpIFwKKwkJCQkgJChYX0NGTEFHUykgXAorCQkJCSAkKExJQlY0TDJfQ0ZMQUdTKSBcCisJCQkJICQoR1VERVZfQ0ZMQUdTKQorCitsaWJnc3R2aWRlbzRsaW51eDJfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorbGliZ3N0dmlkZW80bGludXgyX2xhX0xJQkFERCA9ICAgJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIFwKKwkJCQkgLWxnc3RhbGxvY2F0b3JzLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJCQkJIC1sZ3N0dmlkZW8tJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkJCQkgJChHU1RfQkFTRV9MSUJTKSBcCisJCQkJICQoR1NUX0xJQlMpIFwKKwkJCQkgJChMSUJWNEwyX0xJQlMpIFwKKwkJCQkgJChHVURFVl9MSUJTKSBcCisJCQkJICQoTElCUlQpCisKK25vaW5zdF9IRUFERVJTID0gXAorCWV4dC90eXBlcy1jb21wYXQuaCBcCisJZXh0L3Y0bDItY29tbW9uLmggXAorCWV4dC92NGwyLWNvbnRyb2xzLmggXAorCWV4dC92aWRlb2RldjIuaCBcCisJZ3N0djRsMmFsbG9jYXRvci5oIFwKKwlnc3R2NGwyYnVmZmVycG9vbC5oIFwKKwlnc3R2NGwyY29sb3JiYWxhbmNlLmggXAorCWdzdHY0bDJkZXZpY2Vwcm92aWRlci5oIFwKKwlnc3R2NGwyb2JqZWN0LmggXAorCWdzdHY0bDJzaW5rLmggXAorCWdzdHY0bDJzcmMuaCBcCisJZ3N0djRsMnJhZGlvLmggXAorCWdzdHY0bDJ0dW5lci5oIFwKKwlnc3R2NGwydHJhbnNmb3JtLmggXAorCWdzdHY0bDJ2aWRlb2RlYy5oIFwKKwlnc3R2NGwydmlkZW9lbmMuaCBcCisJZ3N0djRsMmgyNjNlbmMuaCBcCisJZ3N0djRsMmgyNjRlbmMuaCBcCisJZ3N0djRsMm1wZWc0ZW5jLmggXAorCWdzdHY0bDJ2aWRvcmllbnQuaCBcCisJZ3N0djRsMnZwOGVuYy5oIFwKKwlnc3R2NGwydnA5ZW5jLmggXAorCXY0bDItdXRpbHMuaCBcCisJdHVuZXIuaCBcCisJdHVuZXJjaGFubmVsLmggXAorCXR1bmVybm9ybS5oCisKZGlmZiAtLWdpdCBhL3N5cy92NGwyL1JFQURNRSBiL3N5cy92NGwyL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWM0YWI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvUkVBRE1FCkBAIC0wLDAgKzEsMzIgQEAKK3Y0bDIgcGx1Z2lucworPT09PT09PT09PT09CisKK1RoZSBpZGVhIGlzIGEgYml0IHRoZSBzYW1lIGFzIHRoZSBpZGVhIGZvciB0aGUgdjRsMSBwbHVnaW5zLiBXZSB3YW50CitvbmUgZ2VuZXJpYyB2NGwyZWxlbWVudCwgYW5kIGEgZmV3IGNoaWxkIG9iamVjdHMgKHByb2JhYmx5IG9ubHkgdHdvOgordjRsMnNyYyBhbmQgdjRsMnNpbmspOgorCisgICAgICAgICAgICAgICAgLy0tLS0tLS0tIHY0bDJzcmMKK3Y0bDJlbGVtZW50IC0tLT0KKyAgICAgICAgICAgICAgICBcLS0tLS0tLS0gdjRsMnNpbmsKKworQm90aCB2NGwyc3JjIGFuZCB2NGwyc2luayBoYXZlIGEgdW5jb21wcmVzc2VkIGFuZCBhIGNvbXByZXNzZWQKK3JlY29yZGluZy0vcGxheWJhY2stbW9kZS4gU2luY2UgdGhpcyBpcyBhbGwgcGFydCBvZiB2NGwyLCB0aGUgJ2NsaWVudCcKK29mIHRoZXNlIGVsZW1lbnRzLCBpLmUuIGFuIGFwcGxpY2F0aW9uIHVzaW5nIHY0bDJzcmMvdjRsMnNpbmssIHdpbGwKK2hhcmRseSBub3RpY2UgdGhpcy4gQWxsIGNhcHNuZWdvIHN0dWZmIGlzIGRvbmUgaW5zaWRlLCBhbmQgdGhlIHBsdWdpbgora25vd3Mgd2hpY2ggZm9ybWF0cyBhcmUgY29tcHJlc3NlZCBhbmQgd2hpY2ggYXJlIG5vdC4KKworUGxlYXNlIG5vdGUgdGhhdCB0aGUgdjRsMSBhbmQgdGhlIHY0bDIgcGx1Z2lucyBhcmUgKm5vdCogY29tcGF0aWJsZQorY29uY2VybmluZyBwcm9wZXJ0aWVzLiBOYW1pbmcgaGFzIGJlZW4ga2VwdCB0aGUgc2FtZSB3aGVyZSBwb3NzaWJsZSwKK2J1dCBpbiBzb21lIGNhc2VzLCBwcm9wZXJ0aWVzIGhhZCB0byBiZSByZW1vdmVkIG9yIGFkZGVkIHRvIG1ha2UKK2Z1bGwgdXNlIG9mIHY0bDIuCisKK1Y0TDIgQVBJOiBodHRwOi8vbGludXguYnl0ZXNleC5vcmcvdjRsMi8uCisgICAgICAgICAgaHR0cDovL3Y0bDJzcGVjLmJ5dGVzZXgub3JnLworICAgICAgICAgIC91c3IvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaCBvcgorCitLZXJuZWwgcGF0Y2hlcyBhdmFpbGFibGUgZnJvbQorICAgICAgICAgIGh0dHA6Ly9kbC5ieXRlc2V4Lm9yZy9wYXRjaGVzLy4KKworQXJ0aWNsZXM6CisgICAgICAgICAgaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvMjAzOTI0LworCmRpZmYgLS1naXQgYS9zeXMvdjRsMi9leHQvdHlwZXMtY29tcGF0LmggYi9zeXMvdjRsMi9leHQvdHlwZXMtY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEyNmQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2V4dC90eXBlcy1jb21wYXQuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IENvbGxhYm9yYSBMdGQuCisgKiAgICAgQXV0aG9yOiBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzQG5kdWZyZXNuZS5jYT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdsaWIuaD4KKworI2lmbmRlZiBfX1RZUEVTX0NPTVBBVF9IX18KKyNkZWZpbmUgX19UWVBFU19DT01QQVRfSF9fCisKKy8qIEZyb20gbGludXgvdHlwZXMuaCAqLworI2lmbmRlZiBfX2JpdHdpc2VfXworIyAgaWZkZWYgX19DSEVDS0VSX18KKyMgICAgZGVmaW5lIF9fYml0d2lzZV9fIF9fYXR0cmlidXRlX18oKGJpdHdpc2UpKQorIyAgZWxzZQorIyAgICBkZWZpbmUgX19iaXR3aXNlX18KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfX2JpdHdpc2UKKyMgIGlmZGVmIF9fQ0hFQ0tfRU5ESUFOX18KKyMgICAgZGVmaW5lIF9fYml0d2lzZSBfX2JpdHdpc2VfXworIyAgZWxzZQorIyAgICBkZWZpbmUgX19iaXR3aXNlCisjICBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgX191NjQgZ3VpbnQ2NAorI2RlZmluZSBfX3UzMiBndWludDMyCisjZGVmaW5lIF9fdTE2IGd1aW50MTYKKyNkZWZpbmUgX191OCBndWludDgKKyNkZWZpbmUgX19zNjQgZ2ludDY0CisjZGVmaW5lIF9fczMyIGdpbnQzMgorI2RlZmluZSBfX2xlMzIgZ3VpbnQzMiBfX2JpdHdpc2UKKworI2RlZmluZSBfX3VzZXIKKworI2VuZGlmIC8qIF9fVFlQRVNfQ09NUEFUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZXh0L3Y0bDItY29tbW9uLmggYi9zeXMvdjRsMi9leHQvdjRsMi1jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTJjODhhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZXh0L3Y0bDItY29tbW9uLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBpbmNsdWRlL2xpbnV4L3Y0bDItY29tbW9uLmgKKyAqCisgKiBDb21tb24gVjRMMiBhbmQgVjRMMiBzdWJkZXYgZGVmaW5pdGlvbnMuCisgKgorICogVXNlcnMgYXJlIGFkdmlzZWQgdG8gI2luY2x1ZGUgdGhpcyBmaWxlIGVpdGhlciB0aHJvdWdoIHZpZGVvZGV2Mi5oCisgKiAoVjRMMikgb3IgdGhyb3VnaCB2NGwyLXN1YmRldi5oIChWNEwyIHN1YmRldikgcmF0aGVyIHRoYW4gdG8gcmVmZXIKKyAqIHRvIHRoaXMgZmlsZSBkaXJlY3RseS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvbnRhY3Q6IFNha2FyaSBBaWx1cyA8c2FrYXJpLmFpbHVzQGlraS5maT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgQWx0ZXJuYXRpdmVseSB5b3UgY2FuIHJlZGlzdHJpYnV0ZSB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogIEJTRCBsaWNlbnNlIGFzIHN0YXRlZCBiZWxvdzoKKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICogICAgIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiAgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiAgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECisgKiAgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIF9fVjRMMl9DT01NT05fXworI2RlZmluZSBfX1Y0TDJfQ09NTU9OX18KKworI2luY2x1ZGUgImV4dC90eXBlcy1jb21wYXQuaCIKKworLyoKKyAqCisgKiBTZWxlY3Rpb24gaW50ZXJmYWNlIGRlZmluaXRpb25zCisgKgorICovCisKKy8qIEN1cnJlbnQgY3JvcHBpbmcgYXJlYSAqLworI2RlZmluZSBWNEwyX1NFTF9UR1RfQ1JPUAkJMHgwMDAwCisvKiBEZWZhdWx0IGNyb3BwaW5nIGFyZWEgKi8KKyNkZWZpbmUgVjRMMl9TRUxfVEdUX0NST1BfREVGQVVMVAkweDAwMDEKKy8qIENyb3BwaW5nIGJvdW5kcyAqLworI2RlZmluZSBWNEwyX1NFTF9UR1RfQ1JPUF9CT1VORFMJMHgwMDAyCisvKiBOYXRpdmUgZnJhbWUgc2l6ZSAqLworI2RlZmluZSBWNEwyX1NFTF9UR1RfTkFUSVZFX1NJWkUJMHgwMDAzCisvKiBDdXJyZW50IGNvbXBvc2luZyBhcmVhICovCisjZGVmaW5lIFY0TDJfU0VMX1RHVF9DT01QT1NFCQkweDAxMDAKKy8qIERlZmF1bHQgY29tcG9zaW5nIGFyZWEgKi8KKyNkZWZpbmUgVjRMMl9TRUxfVEdUX0NPTVBPU0VfREVGQVVMVAkweDAxMDEKKy8qIENvbXBvc2luZyBib3VuZHMgKi8KKyNkZWZpbmUgVjRMMl9TRUxfVEdUX0NPTVBPU0VfQk9VTkRTCTB4MDEwMgorLyogQ3VycmVudCBjb21wb3NpbmcgYXJlYSBwbHVzIGFsbCBwYWRkaW5nIHBpeGVscyAqLworI2RlZmluZSBWNEwyX1NFTF9UR1RfQ09NUE9TRV9QQURERUQJMHgwMTAzCisKKy8qIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgdGFyZ2V0IGRlZmluaXRpb25zIC0tLSB0byBiZSByZW1vdmVkLiAqLworI2RlZmluZSBWNEwyX1NFTF9UR1RfQ1JPUF9BQ1RJVkUJVjRMMl9TRUxfVEdUX0NST1AKKyNkZWZpbmUgVjRMMl9TRUxfVEdUX0NPTVBPU0VfQUNUSVZFCVY0TDJfU0VMX1RHVF9DT01QT1NFCisjZGVmaW5lIFY0TDJfU1VCREVWX1NFTF9UR1RfQ1JPUF9BQ1RVQUwJVjRMMl9TRUxfVEdUX0NST1AKKyNkZWZpbmUgVjRMMl9TVUJERVZfU0VMX1RHVF9DT01QT1NFX0FDVFVBTCBWNEwyX1NFTF9UR1RfQ09NUE9TRQorI2RlZmluZSBWNEwyX1NVQkRFVl9TRUxfVEdUX0NST1BfQk9VTkRTCVY0TDJfU0VMX1RHVF9DUk9QX0JPVU5EUworI2RlZmluZSBWNEwyX1NVQkRFVl9TRUxfVEdUX0NPTVBPU0VfQk9VTkRTIFY0TDJfU0VMX1RHVF9DT01QT1NFX0JPVU5EUworCisvKiBTZWxlY3Rpb24gZmxhZ3MgKi8KKyNkZWZpbmUgVjRMMl9TRUxfRkxBR19HRQkJKDEgPDwgMCkKKyNkZWZpbmUgVjRMMl9TRUxfRkxBR19MRQkJKDEgPDwgMSkKKyNkZWZpbmUgVjRMMl9TRUxfRkxBR19LRUVQX0NPTkZJRwkoMSA8PCAyKQorCisvKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZsYWcgZGVmaW5pdGlvbnMgLS0tIHRvIGJlIHJlbW92ZWQuICovCisjZGVmaW5lIFY0TDJfU1VCREVWX1NFTF9GTEFHX1NJWkVfR0UJVjRMMl9TRUxfRkxBR19HRQorI2RlZmluZSBWNEwyX1NVQkRFVl9TRUxfRkxBR19TSVpFX0xFCVY0TDJfU0VMX0ZMQUdfTEUKKyNkZWZpbmUgVjRMMl9TVUJERVZfU0VMX0ZMQUdfS0VFUF9DT05GSUcgVjRMMl9TRUxfRkxBR19LRUVQX0NPTkZJRworCitzdHJ1Y3QgdjRsMl9lZGlkIHsKKwlfX3UzMiBwYWQ7CisJX191MzIgc3RhcnRfYmxvY2s7CisJX191MzIgYmxvY2tzOworCV9fdTMyIHJlc2VydmVkWzVdOworCV9fdTggICplZGlkOworfTsKKworI2VuZGlmIC8qIF9fVjRMMl9DT01NT05fXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZXh0L3Y0bDItY29udHJvbHMuaCBiL3N5cy92NGwyL2V4dC92NGwyLWNvbnRyb2xzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFiZmM2OAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2V4dC92NGwyLWNvbnRyb2xzLmgKQEAgLTAsMCArMSw5ODcgQEAKKy8qCisgKiAgVmlkZW8gZm9yIExpbnV4IFR3byBjb250cm9scyBoZWFkZXIgZmlsZQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTktMjAxMiB0aGUgY29udHJpYnV0b3JzCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIEFsdGVybmF0aXZlbHkgeW91IGNhbiByZWRpc3RyaWJ1dGUgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqICBCU0QgbGljZW5zZSBhcyBzdGF0ZWQgYmVsb3c6CisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqICAgICBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorICogIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqICBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgaGVhZGVyIHdhcyBzcGxpdCBvZmYgZnJvbSB2aWRlb2RldjIuaC4gQWxsIGNvbnRyb2wKKyAqICBkZWZpbml0aW9ucyBzaG91bGQgYmUgYWRkZWQgdG8gdGhpcyBoZWFkZXIsIHdoaWNoIGlzIGluY2x1ZGVkIGJ5CisgKiAgdmlkZW9kZXYyLmguCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1Y0TDJfQ09OVFJPTFNfSAorI2RlZmluZSBfX0xJTlVYX1Y0TDJfQ09OVFJPTFNfSAorCisvKiBDb250cm9sIGNsYXNzZXMgKi8KKyNkZWZpbmUgVjRMMl9DVFJMX0NMQVNTX1VTRVIJCTB4MDA5ODAwMDAJLyogT2xkLXN0eWxlICd1c2VyJyBjb250cm9scyAqLworI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfTVBFRwkJMHgwMDk5MDAwMAkvKiBNUEVHLWNvbXByZXNzaW9uIGNvbnRyb2xzICovCisjZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19DQU1FUkEJCTB4MDA5YTAwMDAJLyogQ2FtZXJhIGNsYXNzIGNvbnRyb2xzICovCisjZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19GTV9UWAkJMHgwMDliMDAwMAkvKiBGTSBNb2R1bGF0b3IgY29udHJvbHMgKi8KKyNkZWZpbmUgVjRMMl9DVFJMX0NMQVNTX0ZMQVNICQkweDAwOWMwMDAwCS8qIENhbWVyYSBmbGFzaCBjb250cm9scyAqLworI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfSlBFRwkJMHgwMDlkMDAwMAkvKiBKUEVHLWNvbXByZXNzaW9uIGNvbnRyb2xzICovCisjZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19JTUFHRV9TT1VSQ0UJMHgwMDllMDAwMAkvKiBJbWFnZSBzb3VyY2UgY29udHJvbHMgKi8KKyNkZWZpbmUgVjRMMl9DVFJMX0NMQVNTX0lNQUdFX1BST0MJMHgwMDlmMDAwMAkvKiBJbWFnZSBwcm9jZXNzaW5nIGNvbnRyb2xzICovCisjZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19EVgkJMHgwMGEwMDAwMAkvKiBEaWdpdGFsIFZpZGVvIGNvbnRyb2xzICovCisjZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19GTV9SWAkJMHgwMGExMDAwMAkvKiBGTSBSZWNlaXZlciBjb250cm9scyAqLworI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfUkZfVFVORVIJMHgwMGEyMDAwMAkvKiBSRiB0dW5lciBjb250cm9scyAqLworI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfREVURUNUCQkweDAwYTMwMDAwCS8qIERldGVjdGlvbiBjb250cm9scyAqLworCisvKiBVc2VyLWNsYXNzIGNvbnRyb2wgSURzICovCisKKyNkZWZpbmUgVjRMMl9DSURfQkFTRQkJCShWNEwyX0NUUkxfQ0xBU1NfVVNFUiB8IDB4OTAwKQorI2RlZmluZSBWNEwyX0NJRF9VU0VSX0JBU0UgCQlWNEwyX0NJRF9CQVNFCisjZGVmaW5lIFY0TDJfQ0lEX1VTRVJfQ0xBU1MgCQkoVjRMMl9DVFJMX0NMQVNTX1VTRVIgfCAxKQorI2RlZmluZSBWNEwyX0NJRF9CUklHSFRORVNTCQkoVjRMMl9DSURfQkFTRSswKQorI2RlZmluZSBWNEwyX0NJRF9DT05UUkFTVAkJKFY0TDJfQ0lEX0JBU0UrMSkKKyNkZWZpbmUgVjRMMl9DSURfU0FUVVJBVElPTgkJKFY0TDJfQ0lEX0JBU0UrMikKKyNkZWZpbmUgVjRMMl9DSURfSFVFCQkJKFY0TDJfQ0lEX0JBU0UrMykKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fVk9MVU1FCQkoVjRMMl9DSURfQkFTRSs1KQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19CQUxBTkNFCQkoVjRMMl9DSURfQkFTRSs2KQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19CQVNTCQkoVjRMMl9DSURfQkFTRSs3KQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19UUkVCTEUJCShWNEwyX0NJRF9CQVNFKzgpCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX01VVEUJCShWNEwyX0NJRF9CQVNFKzkpCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0xPVURORVNTCQkoVjRMMl9DSURfQkFTRSsxMCkKKyNkZWZpbmUgVjRMMl9DSURfQkxBQ0tfTEVWRUwJCShWNEwyX0NJRF9CQVNFKzExKSAvKiBEZXByZWNhdGVkICovCisjZGVmaW5lIFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRQkoVjRMMl9DSURfQkFTRSsxMikKKyNkZWZpbmUgVjRMMl9DSURfRE9fV0hJVEVfQkFMQU5DRQkoVjRMMl9DSURfQkFTRSsxMykKKyNkZWZpbmUgVjRMMl9DSURfUkVEX0JBTEFOQ0UJCShWNEwyX0NJRF9CQVNFKzE0KQorI2RlZmluZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0UJCShWNEwyX0NJRF9CQVNFKzE1KQorI2RlZmluZSBWNEwyX0NJRF9HQU1NQQkJCShWNEwyX0NJRF9CQVNFKzE2KQorI2RlZmluZSBWNEwyX0NJRF9XSElURU5FU1MJCShWNEwyX0NJRF9HQU1NQSkgLyogRGVwcmVjYXRlZCAqLworI2RlZmluZSBWNEwyX0NJRF9FWFBPU1VSRQkJKFY0TDJfQ0lEX0JBU0UrMTcpCisjZGVmaW5lIFY0TDJfQ0lEX0FVVE9HQUlOCQkoVjRMMl9DSURfQkFTRSsxOCkKKyNkZWZpbmUgVjRMMl9DSURfR0FJTgkJCShWNEwyX0NJRF9CQVNFKzE5KQorI2RlZmluZSBWNEwyX0NJRF9IRkxJUAkJCShWNEwyX0NJRF9CQVNFKzIwKQorI2RlZmluZSBWNEwyX0NJRF9WRkxJUAkJCShWNEwyX0NJRF9CQVNFKzIxKQorCisjZGVmaW5lIFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZCShWNEwyX0NJRF9CQVNFKzI0KQorZW51bSB2NGwyX3Bvd2VyX2xpbmVfZnJlcXVlbmN5IHsKKwlWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV9ESVNBQkxFRAk9IDAsCisJVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfNTBIWgk9IDEsCisJVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfNjBIWgk9IDIsCisJVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfQVVUTwk9IDMsCit9OworI2RlZmluZSBWNEwyX0NJRF9IVUVfQVVUTwkJCShWNEwyX0NJRF9CQVNFKzI1KQorI2RlZmluZSBWNEwyX0NJRF9XSElURV9CQUxBTkNFX1RFTVBFUkFUVVJFCShWNEwyX0NJRF9CQVNFKzI2KQorI2RlZmluZSBWNEwyX0NJRF9TSEFSUE5FU1MJCQkoVjRMMl9DSURfQkFTRSsyNykKKyNkZWZpbmUgVjRMMl9DSURfQkFDS0xJR0hUX0NPTVBFTlNBVElPTiAJKFY0TDJfQ0lEX0JBU0UrMjgpCisjZGVmaW5lIFY0TDJfQ0lEX0NIUk9NQV9BR0MgICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSsyOSkKKyNkZWZpbmUgVjRMMl9DSURfQ09MT1JfS0lMTEVSICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzMwKQorI2RlZmluZSBWNEwyX0NJRF9DT0xPUkZYCQkJKFY0TDJfQ0lEX0JBU0UrMzEpCitlbnVtIHY0bDJfY29sb3JmeCB7CisJVjRMMl9DT0xPUkZYX05PTkUJCQk9IDAsCisJVjRMMl9DT0xPUkZYX0JXCQkJCT0gMSwKKwlWNEwyX0NPTE9SRlhfU0VQSUEJCQk9IDIsCisJVjRMMl9DT0xPUkZYX05FR0FUSVZFCQkJPSAzLAorCVY0TDJfQ09MT1JGWF9FTUJPU1MJCQk9IDQsCisJVjRMMl9DT0xPUkZYX1NLRVRDSAkJCT0gNSwKKwlWNEwyX0NPTE9SRlhfU0tZX0JMVUUJCQk9IDYsCisJVjRMMl9DT0xPUkZYX0dSQVNTX0dSRUVOCQk9IDcsCisJVjRMMl9DT0xPUkZYX1NLSU5fV0hJVEVOCQk9IDgsCisJVjRMMl9DT0xPUkZYX1ZJVklECQkJPSA5LAorCVY0TDJfQ09MT1JGWF9BUVVBCQkJPSAxMCwKKwlWNEwyX0NPTE9SRlhfQVJUX0ZSRUVaRQkJCT0gMTEsCisJVjRMMl9DT0xPUkZYX1NJTEhPVUVUVEUJCQk9IDEyLAorCVY0TDJfQ09MT1JGWF9TT0xBUklaQVRJT04JCT0gMTMsCisJVjRMMl9DT0xPUkZYX0FOVElRVUUJCQk9IDE0LAorCVY0TDJfQ09MT1JGWF9TRVRfQ0JDUgkJCT0gMTUsCit9OworI2RlZmluZSBWNEwyX0NJRF9BVVRPQlJJR0hUTkVTUwkJCShWNEwyX0NJRF9CQVNFKzMyKQorI2RlZmluZSBWNEwyX0NJRF9CQU5EX1NUT1BfRklMVEVSCQkoVjRMMl9DSURfQkFTRSszMykKKworI2RlZmluZSBWNEwyX0NJRF9ST1RBVEUJCQkJKFY0TDJfQ0lEX0JBU0UrMzQpCisjZGVmaW5lIFY0TDJfQ0lEX0JHX0NPTE9SCQkJKFY0TDJfQ0lEX0JBU0UrMzUpCisKKyNkZWZpbmUgVjRMMl9DSURfQ0hST01BX0dBSU4gICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzM2KQorCisjZGVmaW5lIFY0TDJfQ0lEX0lMTFVNSU5BVE9SU18xCQkJKFY0TDJfQ0lEX0JBU0UrMzcpCisjZGVmaW5lIFY0TDJfQ0lEX0lMTFVNSU5BVE9SU18yCQkJKFY0TDJfQ0lEX0JBU0UrMzgpCisKKyNkZWZpbmUgVjRMMl9DSURfTUlOX0JVRkZFUlNfRk9SX0NBUFRVUkUJKFY0TDJfQ0lEX0JBU0UrMzkpCisjZGVmaW5lIFY0TDJfQ0lEX01JTl9CVUZGRVJTX0ZPUl9PVVRQVVQJCShWNEwyX0NJRF9CQVNFKzQwKQorCisjZGVmaW5lIFY0TDJfQ0lEX0FMUEhBX0NPTVBPTkVOVAkJKFY0TDJfQ0lEX0JBU0UrNDEpCisjZGVmaW5lIFY0TDJfQ0lEX0NPTE9SRlhfQ0JDUgkJCShWNEwyX0NJRF9CQVNFKzQyKQorCisvKiBsYXN0IENJRCArIDEgKi8KKyNkZWZpbmUgVjRMMl9DSURfTEFTVFAxICAgICAgICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzQzKQorCisvKiBVU0VSLWNsYXNzIHByaXZhdGUgY29udHJvbCBJRHMgKi8KKworLyogVGhlIGJhc2UgZm9yIHRoZSBtZXllIGRyaXZlciBjb250cm9scy4gU2VlIGxpbnV4L21leWUuaCBmb3IgdGhlIGxpc3QKKyAqIG9mIGNvbnRyb2xzLiBXZSByZXNlcnZlIDE2IGNvbnRyb2xzIGZvciB0aGlzIGRyaXZlci4gKi8KKyNkZWZpbmUgVjRMMl9DSURfVVNFUl9NRVlFX0JBU0UJCQkoVjRMMl9DSURfVVNFUl9CQVNFICsgMHgxMDAwKQorCisvKiBUaGUgYmFzZSBmb3IgdGhlIGJ0dHYgZHJpdmVyIGNvbnRyb2xzLgorICogV2UgcmVzZXJ2ZSAzMiBjb250cm9scyBmb3IgdGhpcyBkcml2ZXIuICovCisjZGVmaW5lIFY0TDJfQ0lEX1VTRVJfQlRUVl9CQVNFCQkJKFY0TDJfQ0lEX1VTRVJfQkFTRSArIDB4MTAxMCkKKworCisvKiBUaGUgYmFzZSBmb3IgdGhlIHMyMjU1IGRyaXZlciBjb250cm9scy4KKyAqIFdlIHJlc2VydmUgMTYgY29udHJvbHMgZm9yIHRoaXMgZHJpdmVyLiAqLworI2RlZmluZSBWNEwyX0NJRF9VU0VSX1MyMjU1X0JBU0UJCShWNEwyX0NJRF9VU0VSX0JBU0UgKyAweDEwMzApCisKKy8qCisgKiBUaGUgYmFzZSBmb3IgdGhlIHNpNDc2eCBkcml2ZXIgY29udHJvbHMuIFNlZSBpbmNsdWRlL21lZGlhL2Rydi1pbnRmL3NpNDc2eC5oCisgKiBmb3IgdGhlIGxpc3Qgb2YgY29udHJvbHMuIFRvdGFsIG9mIDE2IGNvbnRyb2xzIGlzIHJlc2VydmVkIGZvciB0aGlzIGRyaXZlcgorICovCisjZGVmaW5lIFY0TDJfQ0lEX1VTRVJfU0k0NzZYX0JBU0UJCShWNEwyX0NJRF9VU0VSX0JBU0UgKyAweDEwNDApCisKKy8qIFRoZSBiYXNlIGZvciB0aGUgVEkgVlBFIGRyaXZlciBjb250cm9scy4gVG90YWwgb2YgMTYgY29udHJvbHMgaXMgcmVzZXJ2ZWQgZm9yCisgKiB0aGlzIGRyaXZlciAqLworI2RlZmluZSBWNEwyX0NJRF9VU0VSX1RJX1ZQRV9CQVNFCQkoVjRMMl9DSURfVVNFUl9CQVNFICsgMHgxMDUwKQorCisvKiBUaGUgYmFzZSBmb3IgdGhlIHNhYTcxMzQgZHJpdmVyIGNvbnRyb2xzLgorICogV2UgcmVzZXJ2ZSAxNiBjb250cm9scyBmb3IgdGhpcyBkcml2ZXIuICovCisjZGVmaW5lIFY0TDJfQ0lEX1VTRVJfU0FBNzEzNF9CQVNFCQkoVjRMMl9DSURfVVNFUl9CQVNFICsgMHgxMDYwKQorCisvKiBUaGUgYmFzZSBmb3IgdGhlIGFkdjcxODAgZHJpdmVyIGNvbnRyb2xzLgorICogV2UgcmVzZXJ2ZSAxNiBjb250cm9scyBmb3IgdGhpcyBkcml2ZXIuICovCisjZGVmaW5lIFY0TDJfQ0lEX1VTRVJfQURWNzE4MF9CQVNFCQkoVjRMMl9DSURfVVNFUl9CQVNFICsgMHgxMDcwKQorCisvKiBUaGUgYmFzZSBmb3IgdGhlIHRjMzU4NzQzIGRyaXZlciBjb250cm9scy4KKyAqIFdlIHJlc2VydmUgMTYgY29udHJvbHMgZm9yIHRoaXMgZHJpdmVyLiAqLworI2RlZmluZSBWNEwyX0NJRF9VU0VSX1RDMzU4NzQzX0JBU0UJCShWNEwyX0NJRF9VU0VSX0JBU0UgKyAweDEwODApCisKKy8qIFRoZSBiYXNlIGZvciB0aGUgbWF4MjE3eCBkcml2ZXIgY29udHJvbHMuCisgKiBXZSByZXNlcnZlIDMyIGNvbnRyb2xzIGZvciB0aGlzIGRyaXZlcgorICovCisjZGVmaW5lIFY0TDJfQ0lEX1VTRVJfTUFYMjE3WF9CQVNFCQkoVjRMMl9DSURfVVNFUl9CQVNFICsgMHgxMDkwKQorCisvKiBUaGUgYmFzZSBmb3IgdGhlIGlteCBkcml2ZXIgY29udHJvbHMuCisgKiBXZSByZXNlcnZlIDE2IGNvbnRyb2xzIGZvciB0aGlzIGRyaXZlci4gKi8KKyNkZWZpbmUgVjRMMl9DSURfVVNFUl9JTVhfQkFTRQkJCShWNEwyX0NJRF9VU0VSX0JBU0UgKyAweDEwOTApCisKKy8qIE1QRUctY2xhc3MgY29udHJvbCBJRHMgKi8KKy8qIFRoZSBNUEVHIGNvbnRyb2xzIGFyZSBhcHBsaWNhYmxlIHRvIGFsbCBjb2RlYyBjb250cm9scworICogYW5kIHRoZSAnTVBFRycgcGFydCBvZiB0aGUgZGVmaW5lIGlzIGhpc3RvcmljYWwgKi8KKworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0JBU0UgCQkJKFY0TDJfQ1RSTF9DTEFTU19NUEVHIHwgMHg5MDApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ0xBU1MgCQkJKFY0TDJfQ1RSTF9DTEFTU19NUEVHIHwgMSkKKworLyogIE1QRUcgc3RyZWFtcywgc3BlY2lmaWMgdG8gbXVsdGlwbGV4ZWQgc3RyZWFtcyAqLworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSswKQorZW51bSB2NGwyX21wZWdfc3RyZWFtX3R5cGUgeworCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9QUyAgID0gMCwgLyogTVBFRy0yIHByb2dyYW0gc3RyZWFtICovCisJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcyX1RTICAgPSAxLCAvKiBNUEVHLTIgdHJhbnNwb3J0IHN0cmVhbSAqLworCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMV9TUyAgID0gMiwgLyogTVBFRy0xIHN5c3RlbSBzdHJlYW0gKi8KKwlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfRFZEICA9IDMsIC8qIE1QRUctMiBEVkQtY29tcGF0aWJsZSBzdHJlYW0gKi8KKwlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzFfVkNEICA9IDQsIC8qIE1QRUctMSBWQ0QtY29tcGF0aWJsZSBzdHJlYW0gKi8KKwlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfU1ZDRCA9IDUsIC8qIE1QRUctMiBTVkNELWNvbXBhdGlibGUgc3RyZWFtICovCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfUE1UIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfQVVESU8gCQkoVjRMMl9DSURfTVBFR19CQVNFKzIpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9WSURFTyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1BDUiAJCShWNEwyX0NJRF9NUEVHX0JBU0UrNCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19TVFJFQU1fUEVTX0lEX0FVRElPIAkoVjRMMl9DSURfTVBFR19CQVNFKzUpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BFU19JRF9WSURFTyAJKFY0TDJfQ0lEX01QRUdfQkFTRSs2KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9WQklfRk1UIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSs3KQorZW51bSB2NGwyX21wZWdfc3RyZWFtX3ZiaV9mbXQgeworCVY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9OT05FID0gMCwgIC8qIE5vIFZCSSBpbiB0aGUgTVBFRyBzdHJlYW0gKi8KKwlWNEwyX01QRUdfU1RSRUFNX1ZCSV9GTVRfSVZUViA9IDEsICAvKiBWQkkgaW4gcHJpdmF0ZSBwYWNrZXRzLCBJVlRWIGZvcm1hdCAqLworfTsKKworLyogIE1QRUcgYXVkaW8gY29udHJvbHMgc3BlY2lmaWMgdG8gbXVsdGlwbGV4ZWQgc3RyZWFtcyAgKi8KKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19TQU1QTElOR19GUkVRIAkoVjRMMl9DSURfTVBFR19CQVNFKzEwMCkKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX3NhbXBsaW5nX2ZyZXEgeworCVY0TDJfTVBFR19BVURJT19TQU1QTElOR19GUkVRXzQ0MTAwID0gMCwKKwlWNEwyX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUV80ODAwMCA9IDEsCisJVjRMMl9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVFfMzIwMDAgPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTAxKQorZW51bSB2NGwyX21wZWdfYXVkaW9fZW5jb2RpbmcgeworCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8xID0gMCwKKwlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMiA9IDEsCisJVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0xBWUVSXzMgPSAyLAorCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19BQUMgICAgID0gMywKKwlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfQUMzICAgICA9IDQsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wxX0JJVFJBVEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwMikKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX2wxX2JpdHJhdGUgeworCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzMySyAgPSAwLAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzY0SyAgPSAxLAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzk2SyAgPSAyLAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzEyOEsgPSAzLAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzE2MEsgPSA0LAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzE5MksgPSA1LAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzIyNEsgPSA2LAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzI1NksgPSA3LAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzI4OEsgPSA4LAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzMyMEsgPSA5LAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzM1MksgPSAxMCwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8zODRLID0gMTEsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfNDE2SyA9IDEyLAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzQ0OEsgPSAxMywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTAzKQorZW51bSB2NGwyX21wZWdfYXVkaW9fbDJfYml0cmF0ZSB7CisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzJLICA9IDAsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfNDhLICA9IDEsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfNTZLICA9IDIsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfNjRLICA9IDMsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfODBLICA9IDQsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfOTZLICA9IDUsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMTEySyA9IDYsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMTI4SyA9IDcsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMTYwSyA9IDgsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMTkySyA9IDksCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMjI0SyA9IDEwLAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzI1NksgPSAxMSwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8zMjBLID0gMTIsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzg0SyA9IDEzLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19MM19CSVRSQVRFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDQpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19sM19iaXRyYXRlIHsKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8zMksgID0gMCwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV80MEsgID0gMSwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV80OEsgID0gMiwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV81NksgID0gMywKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV82NEsgID0gNCwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV84MEsgID0gNSwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV85NksgID0gNiwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8xMTJLID0gNywKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8xMjhLID0gOCwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8xNjBLID0gOSwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8xOTJLID0gMTAsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMjI0SyA9IDExLAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzI1NksgPSAxMiwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8zMjBLID0gMTMsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwNSkKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX21vZGUgeworCVY0TDJfTVBFR19BVURJT19NT0RFX1NURVJFTyAgICAgICA9IDAsCisJVjRMMl9NUEVHX0FVRElPX01PREVfSk9JTlRfU1RFUkVPID0gMSwKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9EVUFMICAgICAgICAgPSAyLAorCVY0TDJfTVBFR19BVURJT19NT0RFX01PTk8gICAgICAgICA9IDMsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OIAkoVjRMMl9DSURfTVBFR19CQVNFKzEwNikKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX21vZGVfZXh0ZW5zaW9uIHsKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT05fQk9VTkRfNCAgPSAwLAorCVY0TDJfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTl9CT1VORF84ICA9IDEsCisJVjRMMl9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OX0JPVU5EXzEyID0gMiwKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT05fQk9VTkRfMTYgPSAzLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19FTVBIQVNJUyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTA3KQorZW51bSB2NGwyX21wZWdfYXVkaW9fZW1waGFzaXMgeworCVY0TDJfTVBFR19BVURJT19FTVBIQVNJU19OT05FICAgICAgICAgPSAwLAorCVY0TDJfTVBFR19BVURJT19FTVBIQVNJU181MF9ESVZfMTVfdVMgPSAxLAorCVY0TDJfTVBFR19BVURJT19FTVBIQVNJU19DQ0lUVF9KMTcgICAgPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19DUkMgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwOCkKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX2NyYyB7CisJVjRMMl9NUEVHX0FVRElPX0NSQ19OT05FICA9IDAsCisJVjRMMl9NUEVHX0FVRElPX0NSQ19DUkMxNiA9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX01VVEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwOSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19BQUNfQklUUkFURQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMTApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fQUMzX0JJVFJBVEUJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTExKQorZW51bSB2NGwyX21wZWdfYXVkaW9fYWMzX2JpdHJhdGUgeworCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8zMksgID0gMCwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNDBLICA9IDEsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzQ4SyAgPSAyLAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV81NksgID0gMywKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNjRLICA9IDQsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzgwSyAgPSA1LAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV85NksgID0gNiwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMTEySyA9IDcsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzEyOEsgPSA4LAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8xNjBLID0gOSwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMTkySyA9IDEwLAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8yMjRLID0gMTEsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzI1NksgPSAxMiwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMzIwSyA9IDEzLAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8zODRLID0gMTQsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzQ0OEsgPSAxNSwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNTEySyA9IDE2LAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV81NzZLID0gMTcsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzY0MEsgPSAxOCwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fREVDX1BMQVlCQUNLCShWNEwyX0NJRF9NUEVHX0JBU0UrMTEyKQorZW51bSB2NGwyX21wZWdfYXVkaW9fZGVjX3BsYXliYWNrIHsKKwlWNEwyX01QRUdfQVVESU9fREVDX1BMQVlCQUNLX0FVVE8JICAgID0gMCwKKwlWNEwyX01QRUdfQVVESU9fREVDX1BMQVlCQUNLX1NURVJFTwkgICAgPSAxLAorCVY0TDJfTVBFR19BVURJT19ERUNfUExBWUJBQ0tfTEVGVAkgICAgPSAyLAorCVY0TDJfTVBFR19BVURJT19ERUNfUExBWUJBQ0tfUklHSFQJICAgID0gMywKKwlWNEwyX01QRUdfQVVESU9fREVDX1BMQVlCQUNLX01PTk8JICAgID0gNCwKKwlWNEwyX01QRUdfQVVESU9fREVDX1BMQVlCQUNLX1NXQVBQRURfU1RFUkVPID0gNSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fREVDX01VTFRJTElOR1VBTF9QTEFZQkFDSyAoVjRMMl9DSURfTVBFR19CQVNFKzExMykKKworLyogIE1QRUcgdmlkZW8gY29udHJvbHMgc3BlY2lmaWMgdG8gbXVsdGlwbGV4ZWQgc3RyZWFtcyAqLworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDApCitlbnVtIHY0bDJfbXBlZ192aWRlb19lbmNvZGluZyB7CisJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMSAgICAgPSAwLAorCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzIgICAgID0gMSwKKwlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR180X0FWQyA9IDIsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVCAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjAxKQorZW51bSB2NGwyX21wZWdfdmlkZW9fYXNwZWN0IHsKKwlWNEwyX01QRUdfVklERU9fQVNQRUNUXzF4MSAgICAgPSAwLAorCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfNHgzICAgICA9IDEsCisJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xNng5ICAgID0gMiwKKwlWNEwyX01QRUdfVklERU9fQVNQRUNUXzIyMXgxMDAgPSAzLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19CX0ZSQU1FUyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjAyKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9TSVpFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDMpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX0NMT1NVUkUgCShWNEwyX0NJRF9NUEVHX0JBU0UrMjA0KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1BVTExET1dOIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDUpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9NT0RFIAkoVjRMMl9DSURfTVBFR19CQVNFKzIwNikKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2JpdHJhdGVfbW9kZSB7CisJVjRMMl9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9WQlIgPSAwLAorCVY0TDJfTVBFR19WSURFT19CSVRSQVRFX01PREVfQ0JSID0gMSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjA3KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfUEVBSyAJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDgpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fVEVNUE9SQUxfREVDSU1BVElPTiAoVjRMMl9DSURfTVBFR19CQVNFKzIwOSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NVVRFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVVURV9ZVVYgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIxMSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19ERUNPREVSX1NMSUNFX0lOVEVSRkFDRQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTIpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fREVDT0RFUl9NUEVHNF9ERUJMT0NLX0ZJTFRFUgkoVjRMMl9DSURfTVBFR19CQVNFKzIxMykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19DWUNMSUNfSU5UUkFfUkVGUkVTSF9NQgkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTQpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fRlJBTUVfUkNfRU5BQkxFCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTUpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSEVBREVSX01PREUJCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTYpCitlbnVtIHY0bDJfbXBlZ192aWRlb19oZWFkZXJfbW9kZSB7CisJVjRMMl9NUEVHX1ZJREVPX0hFQURFUl9NT0RFX1NFUEFSQVRFCQkJPSAwLAorCVY0TDJfTVBFR19WSURFT19IRUFERVJfTU9ERV9KT0lORURfV0lUSF8xU1RfRlJBTUUJPSAxLAorCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01BWF9SRUZfUElDCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTcpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTUJfUkNfRU5BQkxFCQkoVjRMMl9DSURfTVBFR19CQVNFKzIxOCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NQVhfQllURVMJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTkpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTUFYX01CCQkoVjRMMl9DSURfTVBFR19CQVNFKzIyMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NT0RFCQkoVjRMMl9DSURfTVBFR19CQVNFKzIyMSkKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX211bHRpX3NsaWNlX21vZGUgeworCVY0TDJfTVBFR19WSURFT19NVUxUSV9TTElDRV9NT0RFX1NJTkdMRQkJPSAwLAorCVY0TDJfTVBFR19WSURFT19NVUxUSV9TSUNFX01PREVfTUFYX01CCQk9IDEsCisJVjRMMl9NUEVHX1ZJREVPX01VTFRJX1NJQ0VfTU9ERV9NQVhfQllURVMJPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19WQlZfU0laRQkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjIyKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0RFQ19QVFMJCQkoVjRMMl9DSURfTVBFR19CQVNFKzIyMykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19ERUNfRlJBTUUJCQkoVjRMMl9DSURfTVBFR19CQVNFKzIyNCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19WQlZfREVMQVkJCQkoVjRMMl9DSURfTVBFR19CQVNFKzIyNSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19SRVBFQVRfU0VRX0hFQURFUgkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMjYpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVZfSF9TRUFSQ0hfUkFOR0UJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjI3KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01WX1ZfU0VBUkNIX1JBTkdFCQkoVjRMMl9DSURfTVBFR19CQVNFKzIyOCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19GT1JDRV9LRVlfRlJBTUUJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjI5KQorCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19JX0ZSQU1FX1FQCQkoVjRMMl9DSURfTVBFR19CQVNFKzMwMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjYzX1BfRlJBTUVfUVAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzAxKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjNfQl9GUkFNRV9RUAkJKFY0TDJfQ0lEX01QRUdfQkFTRSszMDIpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19NSU5fUVAJCQkoVjRMMl9DSURfTVBFR19CQVNFKzMwMykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjYzX01BWF9RUAkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzA0KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfSV9GUkFNRV9RUAkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9QX0ZSQU1FX1FQCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1MSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0JfRlJBTUVfUVAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzUyKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTUlOX1FQCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTMpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9NQVhfUVAJCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1NCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0XzhYOF9UUkFOU0ZPUk0JCShWNEwyX0NJRF9NUEVHX0JBU0UrMzU1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfQ1BCX1NJWkUJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzU2KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfRU5UUk9QWV9NT0RFCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1NykKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2gyNjRfZW50cm9weV9tb2RlIHsKKwlWNEwyX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREVfQ0FWTEMJPSAwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0VOVFJPUFlfTU9ERV9DQUJBQwk9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfSV9QRVJJT0QJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzU4KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTEVWRUwJCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1OSkKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2gyNjRfbGV2ZWwgeworCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMAk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMUIJPSAxLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMQk9IDIsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8yCT0gMywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xXzMJPSA0LAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzJfMAk9IDUsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMl8xCT0gNiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8yXzIJPSA3LAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzNfMAk9IDgsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfM18xCT0gOSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8zXzIJPSAxMCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzAJPSAxMSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzEJPSAxMiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzIJPSAxMywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF81XzAJPSAxNCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF81XzEJPSAxNSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9BTFBIQQkoVjRMMl9DSURfTVBFR19CQVNFKzM2MCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX0JFVEEJKFY0TDJfQ0lEX01QRUdfQkFTRSszNjEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFCShWNEwyX0NJRF9NUEVHX0JBU0UrMzYyKQorZW51bSB2NGwyX21wZWdfdmlkZW9faDI2NF9sb29wX2ZpbHRlcl9tb2RlIHsKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFX0VOQUJMRUQJCQkJPSAwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX01PREVfRElTQUJMRUQJCQkJPSAxLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX01PREVfRElTQUJMRURfQVRfU0xJQ0VfQk9VTkRBUlkJPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1BST0ZJTEUJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzYzKQorZW51bSB2NGwyX21wZWdfdmlkZW9faDI2NF9wcm9maWxlIHsKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0JBU0VMSU5FCQkJPSAwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQ09OU1RSQUlORURfQkFTRUxJTkUJPSAxLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfTUFJTgkJCT0gMiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0VYVEVOREVECQkJPSAzLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSAkJCT0gNCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfMTAJCQk9IDUsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzQyMgkJCT0gNiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfNDQ0X1BSRURJQ1RJVkUJPSA3LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF8xMF9JTlRSQQkJPSA4LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF80MjJfSU5UUkEJCT0gOSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfNDQ0X0lOVFJBCQk9IDEwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQ0FWTENfNDQ0X0lOVFJBCQk9IDExLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfU0NBTEFCTEVfQkFTRUxJTkUJCT0gMTIsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9TQ0FMQUJMRV9ISUdICQk9IDEzLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfU0NBTEFCTEVfSElHSF9JTlRSQQk9IDE0LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfU1RFUkVPX0hJR0gJCT0gMTUsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9NVUxUSVZJRVdfSElHSAkJPSAxNiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfRVhUX1NBUl9IRUlHSFQJKFY0TDJfQ0lEX01QRUdfQkFTRSszNjQpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfRVhUX1NBUl9XSURUSAkoVjRMMl9DSURfTVBFR19CQVNFKzM2NSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfRU5BQkxFCQkoVjRMMl9DSURfTVBFR19CQVNFKzM2NikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDCQkoVjRMMl9DSURfTVBFR19CQVNFKzM2NykKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2gyNjRfdnVpX3Nhcl9pZGMgeworCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDX1VOU1BFQ0lGSUVECT0gMCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18xeDEJCT0gMSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18xMngxMQkJPSAyLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzEweDExCQk9IDMsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTZ4MTEJCT0gNCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ180MHgzMwkJPSA1LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzI0eDExCQk9IDYsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMjB4MTEJCT0gNywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18zMngxMQkJPSA4LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzgweDMzCQk9IDksCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTh4MTEJCT0gMTAsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTV4MTEJCT0gMTEsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfNjR4MzMJCT0gMTIsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTYweDk5CQk9IDEzLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzR4MwkJPSAxNCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18zeDIJCT0gMTUsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMngxCQk9IDE2LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDX0VYVEVOREVECT0gMTcsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfU0VJX0ZSQU1FX1BBQ0tJTkcJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzY4KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfU0VJX0ZQX0NVUlJFTlRfRlJBTUVfMAkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNjkpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9TRUlfRlBfQVJSQU5HRU1FTlRfVFlQRQkoVjRMMl9DSURfTVBFR19CQVNFKzM3MCkKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2gyNjRfc2VpX2ZwX2FycmFuZ2VtZW50X3R5cGUgeworCVY0TDJfTVBFR19WSURFT19IMjY0X1NFSV9GUF9BUlJBTkdFTUVOVF9UWVBFX0NIRUNLRVJCT0FSRAk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfU0VJX0ZQX0FSUkFOR0VNRU5UX1RZUEVfQ09MVU1OCQk9IDEsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfU0VJX0ZQX0FSUkFOR0VNRU5UX1RZUEVfUk9XCQk9IDIsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfU0VJX0ZQX0FSUkFOR0VNRU5UX1RZUEVfU0lERV9CWV9TSURFCT0gMywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9TRUlfRlBfQVJSQU5HRU1FTlRfVFlQRV9UT1BfQk9UVE9NCQk9IDQsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfU0VJX0ZQX0FSUkFOR0VNRU5UX1RZUEVfVEVNUE9SQUwJCT0gNSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9GTU8JCQkoVjRMMl9DSURfTVBFR19CQVNFKzM3MSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0ZNT19NQVBfVFlQRQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNzIpCitlbnVtIHY0bDJfbXBlZ192aWRlb19oMjY0X2Ztb19tYXBfdHlwZSB7CisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfRk1PX01BUF9UWVBFX0lOVEVSTEVBVkVEX1NMSUNFUwkJPSAwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0ZNT19NQVBfVFlQRV9TQ0FUVEVSRURfU0xJQ0VTCQk9IDEsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfRk1PX01BUF9UWVBFX0ZPUkVHUk9VTkRfV0lUSF9MRUZUX09WRVIJPSAyLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0ZNT19NQVBfVFlQRV9CT1hfT1VUCQkJPSAzLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0ZNT19NQVBfVFlQRV9SQVNURVJfU0NBTgkJCT0gNCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9GTU9fTUFQX1RZUEVfV0lQRV9TQ0FOCQkJPSA1LAorCVY0TDJfTVBFR19WSURFT19IMjY0X0ZNT19NQVBfVFlQRV9FWFBMSUNJVAkJCT0gNiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9GTU9fU0xJQ0VfR1JPVVAJKFY0TDJfQ0lEX01QRUdfQkFTRSszNzMpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9GTU9fQ0hBTkdFX0RJUkVDVElPTgkoVjRMMl9DSURfTVBFR19CQVNFKzM3NCkKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2gyNjRfZm1vX2NoYW5nZV9kaXIgeworCVY0TDJfTVBFR19WSURFT19IMjY0X0ZNT19DSEFOR0VfRElSX1JJR0hUCT0gMCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9GTU9fQ0hBTkdFX0RJUl9MRUZUCT0gMSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9GTU9fQ0hBTkdFX1JBVEUJKFY0TDJfQ0lEX01QRUdfQkFTRSszNzUpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9GTU9fUlVOX0xFTkdUSAkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNzYpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9BU08JCQkoVjRMMl9DSURfTVBFR19CQVNFKzM3NykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0FTT19TTElDRV9PUkRFUgkoVjRMMl9DSURfTVBFR19CQVNFKzM3OCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0hJRVJBUkNISUNBTF9DT0RJTkcJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzc5KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfSElFUkFSQ0hJQ0FMX0NPRElOR19UWVBFCShWNEwyX0NJRF9NUEVHX0JBU0UrMzgwKQorZW51bSB2NGwyX21wZWdfdmlkZW9faDI2NF9oaWVyYXJjaGljYWxfY29kaW5nX3R5cGUgeworCVY0TDJfTVBFR19WSURFT19IMjY0X0hJRVJBUkNISUNBTF9DT0RJTkdfQgk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfSElFUkFSQ0hJQ0FMX0NPRElOR19QCT0gMSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9ISUVSQVJDSElDQUxfQ09ESU5HX0xBWUVSCShWNEwyX0NJRF9NUEVHX0JBU0UrMzgxKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfSElFUkFSQ0hJQ0FMX0NPRElOR19MQVlFUl9RUAkoVjRMMl9DSURfTVBFR19CQVNFKzM4MikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9JX0ZSQU1FX1FQCShWNEwyX0NJRF9NUEVHX0JBU0UrNDAwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X1BfRlJBTUVfUVAJKFY0TDJfQ0lEX01QRUdfQkFTRSs0MDEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfQl9GUkFNRV9RUAkoVjRMMl9DSURfTVBFR19CQVNFKzQwMikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9NSU5fUVAJKFY0TDJfQ0lEX01QRUdfQkFTRSs0MDMpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfTUFYX1FQCShWNEwyX0NJRF9NUEVHX0JBU0UrNDA0KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X0xFVkVMCQkoVjRMMl9DSURfTVBFR19CQVNFKzQwNSkKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX21wZWc0X2xldmVsIHsKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfMAk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzBCCT0gMSwKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfMQk9IDIsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzIJPSAzLAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8zCT0gNCwKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfM0IJPSA1LAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF80CT0gNiwKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfNQk9IDcsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEUJKFY0TDJfQ0lEX01QRUdfQkFTRSs0MDYpCitlbnVtIHY0bDJfbXBlZ192aWRlb19tcGVnNF9wcm9maWxlIHsKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfUFJPRklMRV9TSU1QTEUJCQkJPSAwLAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFX0FEVkFOQ0VEX1NJTVBMRQkJCT0gMSwKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfUFJPRklMRV9DT1JFCQkJCT0gMiwKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfUFJPRklMRV9TSU1QTEVfU0NBTEFCTEUJCQk9IDMsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfQURWQU5DRURfQ09ESU5HX0VGRklDSUVOQ1kJPSA0LAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9RUEVMCQkoVjRMMl9DSURfTVBFR19CQVNFKzQwNykKKworLyogIENvbnRyb2wgSURzIGZvciBWUDggc3RyZWFtcworICogIEFsdGhvdWdoIFZQOCBpcyBub3QgcGFydCBvZiBNUEVHIHdlIGFkZCB0aGVzZSBjb250cm9scyB0byB0aGUgTVBFRyBjbGFzcworICogIGFzIHRoYXQgY2xhc3MgaXMgYWxyZWFkeSBoYW5kbGluZyBvdGhlciB2aWRlbyBjb21wcmVzc2lvbiBzdGFuZGFyZHMKKyAqLworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9OVU1fUEFSVElUSU9OUwkJKFY0TDJfQ0lEX01QRUdfQkFTRSs1MDApCitlbnVtIHY0bDJfdnA4X251bV9wYXJ0aXRpb25zIHsKKwlWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF8xX1BBUlRJVElPTgk9IDAsCisJVjRMMl9DSURfTVBFR19WSURFT19WUFhfMl9QQVJUSVRJT05TCT0gMSwKKwlWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF80X1BBUlRJVElPTlMJPSAyLAorCVY0TDJfQ0lEX01QRUdfVklERU9fVlBYXzhfUEFSVElUSU9OUwk9IDMsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9JTURfRElTQUJMRV80WDQJCShWNEwyX0NJRF9NUEVHX0JBU0UrNTAxKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9OVU1fUkVGX0ZSQU1FUwkJKFY0TDJfQ0lEX01QRUdfQkFTRSs1MDIpCitlbnVtIHY0bDJfdnA4X251bV9yZWZfZnJhbWVzIHsKKwlWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF8xX1JFRl9GUkFNRQk9IDAsCisJVjRMMl9DSURfTVBFR19WSURFT19WUFhfMl9SRUZfRlJBTUUJPSAxLAorCVY0TDJfQ0lEX01QRUdfVklERU9fVlBYXzNfUkVGX0ZSQU1FCT0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fVlBYX0ZJTFRFUl9MRVZFTAkJKFY0TDJfQ0lEX01QRUdfQkFTRSs1MDMpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fVlBYX0ZJTFRFUl9TSEFSUE5FU1MJKFY0TDJfQ0lEX01QRUdfQkFTRSs1MDQpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fVlBYX0dPTERFTl9GUkFNRV9SRUZfUEVSSU9ECShWNEwyX0NJRF9NUEVHX0JBU0UrNTA1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9HT0xERU5fRlJBTUVfU0VMCShWNEwyX0NJRF9NUEVHX0JBU0UrNTA2KQorZW51bSB2NGwyX3ZwOF9nb2xkZW5fZnJhbWVfc2VsIHsKKwlWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9HT0xERU5fRlJBTUVfVVNFX1BSRVYJCT0gMCwKKwlWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9HT0xERU5fRlJBTUVfVVNFX1JFRl9QRVJJT0QJPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19WUFhfTUlOX1FQCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSs1MDcpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fVlBYX01BWF9RUAkJCShWNEwyX0NJRF9NUEVHX0JBU0UrNTA4KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9JX0ZSQU1FX1FQCQkoVjRMMl9DSURfTVBFR19CQVNFKzUwOSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19WUFhfUF9GUkFNRV9RUAkJKFY0TDJfQ0lEX01QRUdfQkFTRSs1MTApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fVlBYX1BST0ZJTEUJCQkoVjRMMl9DSURfTVBFR19CQVNFKzUxMSkKKworLyogIE1QRUctY2xhc3MgY29udHJvbCBJRHMgc3BlY2lmaWMgdG8gdGhlIENYMjM0MXggZHJpdmVyIGFzIGRlZmluZWQgYnkgVjRMMiAqLworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSAJCQkJKFY0TDJfQ1RSTF9DTEFTU19NUEVHIHwgMHgxMDAwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERSAJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzApCitlbnVtIHY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX3NwYXRpYWxfZmlsdGVyX21vZGUgeworCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSX01PREVfTUFOVUFMID0gMCwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFX0FVVE8gICA9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVIgCQkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrMSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRSAJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzIpCitlbnVtIHY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX2x1bWFfc3BhdGlhbF9maWx0ZXJfdHlwZSB7CisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFX09GRiAgICAgICAgICAgICAgICAgID0gMCwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEVfMURfSE9SICAgICAgICAgICAgICAgPSAxLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRV8xRF9WRVJUICAgICAgICAgICAgICA9IDIsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzJEX0hWX1NFUEFSQUJMRSAgICAgID0gMywKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEVfMkRfU1lNX05PTl9TRVBBUkFCTEUgPSA0LAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9TUEFUSUFMX0ZJTFRFUl9UWVBFIAkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrMykKK2VudW0gdjRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fY2hyb21hX3NwYXRpYWxfZmlsdGVyX3R5cGUgeworCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9TUEFUSUFMX0ZJTFRFUl9UWVBFX09GRiAgICA9IDAsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX1NQQVRJQUxfRklMVEVSX1RZUEVfMURfSE9SID0gMSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVJfTU9ERSAJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzQpCitlbnVtIHY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX3RlbXBvcmFsX2ZpbHRlcl9tb2RlIHsKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVJfTU9ERV9NQU5VQUwgPSAwLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUl9NT0RFX0FVVE8gICA9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSIAkJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzUpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEUgCQkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrNikKK2VudW0gdjRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fbWVkaWFuX2ZpbHRlcl90eXBlIHsKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfT0ZGICAgICAgPSAwLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9IT1IgICAgICA9IDEsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFX1ZFUlQgICAgID0gMiwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfSE9SX1ZFUlQgPSAzLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9ESUFHICAgICA9IDQsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9NRURJQU5fRklMVEVSX0JPVFRPTSAJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzcpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX01FRElBTl9GSUxURVJfVE9QIAkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrOCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9NRURJQU5fRklMVEVSX0JPVFRPTQkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrOSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9NRURJQU5fRklMVEVSX1RPUCAJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzEwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfU1RSRUFNX0lOU0VSVF9OQVZfUEFDS0VUUyAJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzExKQorCisvKiAgTVBFRy1jbGFzcyBjb250cm9sIElEcyBzcGVjaWZpYyB0byB0aGUgU2Ftc3VuZyBNRkMgNS4xIGRyaXZlciBhcyBkZWZpbmVkIGJ5IFY0TDIgKi8KKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFCQkJCShWNEwyX0NUUkxfQ0xBU1NfTVBFRyB8IDB4MTEwMCkKKworI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0RFQ09ERVJfSDI2NF9ESVNQTEFZX0RFTEFZCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fREVDT0RFUl9IMjY0X0RJU1BMQVlfREVMQVlfRU5BQkxFCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrMSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19GUkFNRV9TS0lQX01PREUJCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzIpCitlbnVtIHY0bDJfbXBlZ19tZmM1MV92aWRlb19mcmFtZV9za2lwX21vZGUgeworCVY0TDJfTVBFR19NRkM1MV9WSURFT19GUkFNRV9TS0lQX01PREVfRElTQUJMRUQJCT0gMCwKKwlWNEwyX01QRUdfTUZDNTFfVklERU9fRlJBTUVfU0tJUF9NT0RFX0xFVkVMX0xJTUlUCT0gMSwKKwlWNEwyX01QRUdfTUZDNTFfVklERU9fRlJBTUVfU0tJUF9NT0RFX0JVRl9MSU1JVAkJPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19GT1JDRV9GUkFNRV9UWVBFCQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSszKQorZW51bSB2NGwyX21wZWdfbWZjNTFfdmlkZW9fZm9yY2VfZnJhbWVfdHlwZSB7CisJVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZPUkNFX0ZSQU1FX1RZUEVfRElTQUJMRUQJCT0gMCwKKwlWNEwyX01QRUdfTUZDNTFfVklERU9fRk9SQ0VfRlJBTUVfVFlQRV9JX0ZSQU1FCQk9IDEsCisJVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZPUkNFX0ZSQU1FX1RZUEVfTk9UX0NPREVECT0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fUEFERElORwkJCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzQpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fUEFERElOR19ZVVYJCQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX1JDX0ZJWEVEX1RBUkdFVF9CSVQJCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzYpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fUkNfUkVBQ1RJT05fQ09FRkYJCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzcpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fSDI2NF9BREFQVElWRV9SQ19BQ1RJVklUWQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs1MCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X0FEQVBUSVZFX1JDX0RBUksJCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzUxKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0gyNjRfQURBUFRJVkVfUkNfU01PT1RICQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzUyKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0gyNjRfQURBUFRJVkVfUkNfU1RBVElDCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzUzKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0gyNjRfTlVNX1JFRl9QSUNfRk9SX1AJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrNTQpCisKKworLyogIENhbWVyYSBjbGFzcyBjb250cm9sIElEcyAqLworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFIAkoVjRMMl9DVFJMX0NMQVNTX0NBTUVSQSB8IDB4OTAwKQorI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfQ0xBU1MgCQkoVjRMMl9DVFJMX0NMQVNTX0NBTUVSQSB8IDEpCisKKyNkZWZpbmUgVjRMMl9DSURfRVhQT1NVUkVfQVVUTwkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxKQorZW51bSAgdjRsMl9leHBvc3VyZV9hdXRvX3R5cGUgeworCVY0TDJfRVhQT1NVUkVfQVVUTyA9IDAsCisJVjRMMl9FWFBPU1VSRV9NQU5VQUwgPSAxLAorCVY0TDJfRVhQT1NVUkVfU0hVVFRFUl9QUklPUklUWSA9IDIsCisJVjRMMl9FWFBPU1VSRV9BUEVSVFVSRV9QUklPUklUWSA9IDMKK307CisjZGVmaW5lIFY0TDJfQ0lEX0VYUE9TVVJFX0FCU09MVVRFCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMikKKyNkZWZpbmUgVjRMMl9DSURfRVhQT1NVUkVfQVVUT19QUklPUklUWQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzMpCisKKyNkZWZpbmUgVjRMMl9DSURfUEFOX1JFTEFUSVZFCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzQpCisjZGVmaW5lIFY0TDJfQ0lEX1RJTFRfUkVMQVRJVkUJCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrNSkKKyNkZWZpbmUgVjRMMl9DSURfUEFOX1JFU0VUCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzYpCisjZGVmaW5lIFY0TDJfQ0lEX1RJTFRfUkVTRVQJCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrNykKKworI2RlZmluZSBWNEwyX0NJRF9QQU5fQUJTT0xVVEUJCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrOCkKKyNkZWZpbmUgVjRMMl9DSURfVElMVF9BQlNPTFVURQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSs5KQorCisjZGVmaW5lIFY0TDJfQ0lEX0ZPQ1VTX0FCU09MVVRFCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzEwKQorI2RlZmluZSBWNEwyX0NJRF9GT0NVU19SRUxBVElWRQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxMSkKKyNkZWZpbmUgVjRMMl9DSURfRk9DVVNfQVVUTwkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxMikKKworI2RlZmluZSBWNEwyX0NJRF9aT09NX0FCU09MVVRFCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzEzKQorI2RlZmluZSBWNEwyX0NJRF9aT09NX1JFTEFUSVZFCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzE0KQorI2RlZmluZSBWNEwyX0NJRF9aT09NX0NPTlRJTlVPVVMJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxNSkKKworI2RlZmluZSBWNEwyX0NJRF9QUklWQUNZCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzE2KQorCisjZGVmaW5lIFY0TDJfQ0lEX0lSSVNfQUJTT0xVVEUJCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTcpCisjZGVmaW5lIFY0TDJfQ0lEX0lSSVNfUkVMQVRJVkUJCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTgpCisKKyNkZWZpbmUgVjRMMl9DSURfQVVUT19FWFBPU1VSRV9CSUFTCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTkpCisKKyNkZWZpbmUgVjRMMl9DSURfQVVUT19OX1BSRVNFVF9XSElURV9CQUxBTkNFCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsyMCkKK2VudW0gdjRsMl9hdXRvX25fcHJlc2V0X3doaXRlX2JhbGFuY2UgeworCVY0TDJfV0hJVEVfQkFMQU5DRV9NQU5VQUwJCT0gMCwKKwlWNEwyX1dISVRFX0JBTEFOQ0VfQVVUTwkJCT0gMSwKKwlWNEwyX1dISVRFX0JBTEFOQ0VfSU5DQU5ERVNDRU5UCQk9IDIsCisJVjRMMl9XSElURV9CQUxBTkNFX0ZMVU9SRVNDRU5UCQk9IDMsCisJVjRMMl9XSElURV9CQUxBTkNFX0ZMVU9SRVNDRU5UX0gJPSA0LAorCVY0TDJfV0hJVEVfQkFMQU5DRV9IT1JJWk9OCQk9IDUsCisJVjRMMl9XSElURV9CQUxBTkNFX0RBWUxJR0hUCQk9IDYsCisJVjRMMl9XSElURV9CQUxBTkNFX0ZMQVNICQk9IDcsCisJVjRMMl9XSElURV9CQUxBTkNFX0NMT1VEWQkJPSA4LAorCVY0TDJfV0hJVEVfQkFMQU5DRV9TSEFERQkJPSA5LAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9XSURFX0RZTkFNSUNfUkFOR0UJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsyMSkKKyNkZWZpbmUgVjRMMl9DSURfSU1BR0VfU1RBQklMSVpBVElPTgkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzIyKQorCisjZGVmaW5lIFY0TDJfQ0lEX0lTT19TRU5TSVRJVklUWQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzIzKQorI2RlZmluZSBWNEwyX0NJRF9JU09fU0VOU0lUSVZJVFlfQVVUTwkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzI0KQorZW51bSB2NGwyX2lzb19zZW5zaXRpdml0eV9hdXRvX3R5cGUgeworCVY0TDJfSVNPX1NFTlNJVElWSVRZX01BTlVBTAkJPSAwLAorCVY0TDJfSVNPX1NFTlNJVElWSVRZX0FVVE8JCT0gMSwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfRVhQT1NVUkVfTUVURVJJTkcJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsyNSkKK2VudW0gdjRsMl9leHBvc3VyZV9tZXRlcmluZyB7CisJVjRMMl9FWFBPU1VSRV9NRVRFUklOR19BVkVSQUdFCQk9IDAsCisJVjRMMl9FWFBPU1VSRV9NRVRFUklOR19DRU5URVJfV0VJR0hURUQJPSAxLAorCVY0TDJfRVhQT1NVUkVfTUVURVJJTkdfU1BPVAkJPSAyLAorCVY0TDJfRVhQT1NVUkVfTUVURVJJTkdfTUFUUklYCQk9IDMsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX1NDRU5FX01PREUJCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMjYpCitlbnVtIHY0bDJfc2NlbmVfbW9kZSB7CisJVjRMMl9TQ0VORV9NT0RFX05PTkUJCQk9IDAsCisJVjRMMl9TQ0VORV9NT0RFX0JBQ0tMSUdIVAkJPSAxLAorCVY0TDJfU0NFTkVfTU9ERV9CRUFDSF9TTk9XCQk9IDIsCisJVjRMMl9TQ0VORV9NT0RFX0NBTkRMRV9MSUdIVAkJPSAzLAorCVY0TDJfU0NFTkVfTU9ERV9EQVdOX0RVU0sJCT0gNCwKKwlWNEwyX1NDRU5FX01PREVfRkFMTF9DT0xPUlMJCT0gNSwKKwlWNEwyX1NDRU5FX01PREVfRklSRVdPUktTCQk9IDYsCisJVjRMMl9TQ0VORV9NT0RFX0xBTkRTQ0FQRQkJPSA3LAorCVY0TDJfU0NFTkVfTU9ERV9OSUdIVAkJCT0gOCwKKwlWNEwyX1NDRU5FX01PREVfUEFSVFlfSU5ET09SCQk9IDksCisJVjRMMl9TQ0VORV9NT0RFX1BPUlRSQUlUCQk9IDEwLAorCVY0TDJfU0NFTkVfTU9ERV9TUE9SVFMJCQk9IDExLAorCVY0TDJfU0NFTkVfTU9ERV9TVU5TRVQJCQk9IDEyLAorCVY0TDJfU0NFTkVfTU9ERV9URVhUCQkJPSAxMywKK307CisKKyNkZWZpbmUgVjRMMl9DSURfM0FfTE9DSwkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsyNykKKyNkZWZpbmUgVjRMMl9MT0NLX0VYUE9TVVJFCQkJKDEgPDwgMCkKKyNkZWZpbmUgVjRMMl9MT0NLX1dISVRFX0JBTEFOQ0UJCQkoMSA8PCAxKQorI2RlZmluZSBWNEwyX0xPQ0tfRk9DVVMJCQkJKDEgPDwgMikKKworI2RlZmluZSBWNEwyX0NJRF9BVVRPX0ZPQ1VTX1NUQVJUCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMjgpCisjZGVmaW5lIFY0TDJfQ0lEX0FVVE9fRk9DVVNfU1RPUAkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzI5KQorI2RlZmluZSBWNEwyX0NJRF9BVVRPX0ZPQ1VTX1NUQVRVUwkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzMwKQorI2RlZmluZSBWNEwyX0FVVE9fRk9DVVNfU1RBVFVTX0lETEUJCSgwIDw8IDApCisjZGVmaW5lIFY0TDJfQVVUT19GT0NVU19TVEFUVVNfQlVTWQkJKDEgPDwgMCkKKyNkZWZpbmUgVjRMMl9BVVRPX0ZPQ1VTX1NUQVRVU19SRUFDSEVECQkoMSA8PCAxKQorI2RlZmluZSBWNEwyX0FVVE9fRk9DVVNfU1RBVFVTX0ZBSUxFRAkJKDEgPDwgMikKKworI2RlZmluZSBWNEwyX0NJRF9BVVRPX0ZPQ1VTX1JBTkdFCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMzEpCitlbnVtIHY0bDJfYXV0b19mb2N1c19yYW5nZSB7CisJVjRMMl9BVVRPX0ZPQ1VTX1JBTkdFX0FVVE8JCT0gMCwKKwlWNEwyX0FVVE9fRk9DVVNfUkFOR0VfTk9STUFMCQk9IDEsCisJVjRMMl9BVVRPX0ZPQ1VTX1JBTkdFX01BQ1JPCQk9IDIsCisJVjRMMl9BVVRPX0ZPQ1VTX1JBTkdFX0lORklOSVRZCQk9IDMsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX1BBTl9TUEVFRAkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSszMikKKyNkZWZpbmUgVjRMMl9DSURfVElMVF9TUEVFRAkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSszMykKKworLyogRk0gTW9kdWxhdG9yIGNsYXNzIGNvbnRyb2wgSURzICovCisKKyNkZWZpbmUgVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRQkJKFY0TDJfQ1RSTF9DTEFTU19GTV9UWCB8IDB4OTAwKQorI2RlZmluZSBWNEwyX0NJRF9GTV9UWF9DTEFTUwkJCShWNEwyX0NUUkxfQ0xBU1NfRk1fVFggfCAxKQorCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19UWF9ERVZJQVRJT04JCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgMSkKKyNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX1BJCQkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAyKQorI2RlZmluZSBWNEwyX0NJRF9SRFNfVFhfUFRZCQkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAzKQorI2RlZmluZSBWNEwyX0NJRF9SRFNfVFhfUFNfTkFNRQkJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgNSkKKyNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX1JBRElPX1RFWFQJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgNikKKyNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX01PTk9fU1RFUkVPCQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDcpCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19UWF9BUlRJRklDSUFMX0hFQUQJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgOCkKKyNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX0NPTVBSRVNTRUQJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgOSkKKyNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX0RZTkFNSUNfUFRZCQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDEwKQorI2RlZmluZSBWNEwyX0NJRF9SRFNfVFhfVFJBRkZJQ19BTk5PVU5DRU1FTlQJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAxMSkKKyNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX1RSQUZGSUNfUFJPR1JBTQkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAxMikKKyNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX01VU0lDX1NQRUVDSAkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAxMykKKyNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX0FMVF9GUkVRU19FTkFCTEUJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAxNCkKKyNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX0FMVF9GUkVRUwkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAxNSkKKworI2RlZmluZSBWNEwyX0NJRF9BVURJT19MSU1JVEVSX0VOQUJMRUQJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgNjQpCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0xJTUlURVJfUkVMRUFTRV9USU1FCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgNjUpCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0xJTUlURVJfREVWSUFUSU9OCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgNjYpCisKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fQ09NUFJFU1NJT05fRU5BQkxFRAkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDgwKQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19DT01QUkVTU0lPTl9HQUlOCQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDgxKQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19DT01QUkVTU0lPTl9USFJFU0hPTEQJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA4MikKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fQ09NUFJFU1NJT05fQVRUQUNLX1RJTUUJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA4MykKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fQ09NUFJFU1NJT05fUkVMRUFTRV9USU1FCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgODQpCisKKyNkZWZpbmUgVjRMMl9DSURfUElMT1RfVE9ORV9FTkFCTEVECQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDk2KQorI2RlZmluZSBWNEwyX0NJRF9QSUxPVF9UT05FX0RFVklBVElPTgkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA5NykKKyNkZWZpbmUgVjRMMl9DSURfUElMT1RfVE9ORV9GUkVRVUVOQ1kJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgOTgpCisKKyNkZWZpbmUgVjRMMl9DSURfVFVORV9QUkVFTVBIQVNJUwkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAxMTIpCitlbnVtIHY0bDJfcHJlZW1waGFzaXMgeworCVY0TDJfUFJFRU1QSEFTSVNfRElTQUJMRUQJPSAwLAorCVY0TDJfUFJFRU1QSEFTSVNfNTBfdVMJCT0gMSwKKwlWNEwyX1BSRUVNUEhBU0lTXzc1X3VTCQk9IDIsCit9OworI2RlZmluZSBWNEwyX0NJRF9UVU5FX1BPV0VSX0xFVkVMCQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDExMykKKyNkZWZpbmUgVjRMMl9DSURfVFVORV9BTlRFTk5BX0NBUEFDSVRPUgkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAxMTQpCisKKworLyogRmxhc2ggYW5kIHByaXZhY3kgKGluZGljYXRvcikgbGlnaHQgY29udHJvbHMgKi8KKworI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFCQkoVjRMMl9DVFJMX0NMQVNTX0ZMQVNIIHwgMHg5MDApCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX0NMQVNTCQkJKFY0TDJfQ1RSTF9DTEFTU19GTEFTSCB8IDEpCisKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfTEVEX01PREUJCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDEpCitlbnVtIHY0bDJfZmxhc2hfbGVkX21vZGUgeworCVY0TDJfRkxBU0hfTEVEX01PREVfTk9ORSwKKwlWNEwyX0ZMQVNIX0xFRF9NT0RFX0ZMQVNILAorCVY0TDJfRkxBU0hfTEVEX01PREVfVE9SQ0gsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX1NUUk9CRV9TT1VSQ0UJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgMikKK2VudW0gdjRsMl9mbGFzaF9zdHJvYmVfc291cmNlIHsKKwlWNEwyX0ZMQVNIX1NUUk9CRV9TT1VSQ0VfU09GVFdBUkUsCisJVjRMMl9GTEFTSF9TVFJPQkVfU09VUkNFX0VYVEVSTkFMLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkUJCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDMpCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX1NUUk9CRV9TVE9QCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDQpCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX1NUUk9CRV9TVEFUVVMJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgNSkKKworI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9USU1FT1VUCQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyA2KQorI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9JTlRFTlNJVFkJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgNykKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfVE9SQ0hfSU5URU5TSVRZCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDgpCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX0lORElDQVRPUl9JTlRFTlNJVFkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyA5KQorCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX0ZBVUxUCQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyAxMCkKKyNkZWZpbmUgVjRMMl9GTEFTSF9GQVVMVF9PVkVSX1ZPTFRBR0UJCSgxIDw8IDApCisjZGVmaW5lIFY0TDJfRkxBU0hfRkFVTFRfVElNRU9VVAkJKDEgPDwgMSkKKyNkZWZpbmUgVjRMMl9GTEFTSF9GQVVMVF9PVkVSX1RFTVBFUkFUVVJFCSgxIDw8IDIpCisjZGVmaW5lIFY0TDJfRkxBU0hfRkFVTFRfU0hPUlRfQ0lSQ1VJVAkJKDEgPDwgMykKKyNkZWZpbmUgVjRMMl9GTEFTSF9GQVVMVF9PVkVSX0NVUlJFTlQJCSgxIDw8IDQpCisjZGVmaW5lIFY0TDJfRkxBU0hfRkFVTFRfSU5ESUNBVE9SCQkoMSA8PCA1KQorI2RlZmluZSBWNEwyX0ZMQVNIX0ZBVUxUX1VOREVSX1ZPTFRBR0UJCSgxIDw8IDYpCisjZGVmaW5lIFY0TDJfRkxBU0hfRkFVTFRfSU5QVVRfVk9MVEFHRQkJKDEgPDwgNykKKyNkZWZpbmUgVjRMMl9GTEFTSF9GQVVMVF9MRURfT1ZFUl9URU1QRVJBVFVSRQkoMSA8PCA4KQorCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX0NIQVJHRQkJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgMTEpCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX1JFQURZCQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyAxMikKKworCisvKiBKUEVHLWNsYXNzIGNvbnRyb2wgSURzICovCisKKyNkZWZpbmUgVjRMMl9DSURfSlBFR19DTEFTU19CQVNFCQkoVjRMMl9DVFJMX0NMQVNTX0pQRUcgfCAweDkwMCkKKyNkZWZpbmUgVjRMMl9DSURfSlBFR19DTEFTUwkJCShWNEwyX0NUUkxfQ0xBU1NfSlBFRyB8IDEpCisKKyNkZWZpbmUJVjRMMl9DSURfSlBFR19DSFJPTUFfU1VCU0FNUExJTkcJKFY0TDJfQ0lEX0pQRUdfQ0xBU1NfQkFTRSArIDEpCitlbnVtIHY0bDJfanBlZ19jaHJvbWFfc3Vic2FtcGxpbmcgeworCVY0TDJfSlBFR19DSFJPTUFfU1VCU0FNUExJTkdfNDQ0CT0gMCwKKwlWNEwyX0pQRUdfQ0hST01BX1NVQlNBTVBMSU5HXzQyMgk9IDEsCisJVjRMMl9KUEVHX0NIUk9NQV9TVUJTQU1QTElOR180MjAJPSAyLAorCVY0TDJfSlBFR19DSFJPTUFfU1VCU0FNUExJTkdfNDExCT0gMywKKwlWNEwyX0pQRUdfQ0hST01BX1NVQlNBTVBMSU5HXzQxMAk9IDQsCisJVjRMMl9KUEVHX0NIUk9NQV9TVUJTQU1QTElOR19HUkFZCT0gNSwKK307CisjZGVmaW5lCVY0TDJfQ0lEX0pQRUdfUkVTVEFSVF9JTlRFUlZBTAkJKFY0TDJfQ0lEX0pQRUdfQ0xBU1NfQkFTRSArIDIpCisjZGVmaW5lCVY0TDJfQ0lEX0pQRUdfQ09NUFJFU1NJT05fUVVBTElUWQkoVjRMMl9DSURfSlBFR19DTEFTU19CQVNFICsgMykKKworI2RlZmluZQlWNEwyX0NJRF9KUEVHX0FDVElWRV9NQVJLRVIJCShWNEwyX0NJRF9KUEVHX0NMQVNTX0JBU0UgKyA0KQorI2RlZmluZQlWNEwyX0pQRUdfQUNUSVZFX01BUktFUl9BUFAwCQkoMSA8PCAwKQorI2RlZmluZQlWNEwyX0pQRUdfQUNUSVZFX01BUktFUl9BUFAxCQkoMSA8PCAxKQorI2RlZmluZQlWNEwyX0pQRUdfQUNUSVZFX01BUktFUl9DT00JCSgxIDw8IDE2KQorI2RlZmluZQlWNEwyX0pQRUdfQUNUSVZFX01BUktFUl9EUVQJCSgxIDw8IDE3KQorI2RlZmluZQlWNEwyX0pQRUdfQUNUSVZFX01BUktFUl9ESFQJCSgxIDw8IDE4KQorCisKKy8qIEltYWdlIHNvdXJjZSBjb250cm9scyAqLworI2RlZmluZSBWNEwyX0NJRF9JTUFHRV9TT1VSQ0VfQ0xBU1NfQkFTRQkoVjRMMl9DVFJMX0NMQVNTX0lNQUdFX1NPVVJDRSB8IDB4OTAwKQorI2RlZmluZSBWNEwyX0NJRF9JTUFHRV9TT1VSQ0VfQ0xBU1MJCShWNEwyX0NUUkxfQ0xBU1NfSU1BR0VfU09VUkNFIHwgMSkKKworI2RlZmluZSBWNEwyX0NJRF9WQkxBTksJCQkJKFY0TDJfQ0lEX0lNQUdFX1NPVVJDRV9DTEFTU19CQVNFICsgMSkKKyNkZWZpbmUgVjRMMl9DSURfSEJMQU5LCQkJCShWNEwyX0NJRF9JTUFHRV9TT1VSQ0VfQ0xBU1NfQkFTRSArIDIpCisjZGVmaW5lIFY0TDJfQ0lEX0FOQUxPR1VFX0dBSU4JCQkoVjRMMl9DSURfSU1BR0VfU09VUkNFX0NMQVNTX0JBU0UgKyAzKQorI2RlZmluZSBWNEwyX0NJRF9URVNUX1BBVFRFUk5fUkVECQkoVjRMMl9DSURfSU1BR0VfU09VUkNFX0NMQVNTX0JBU0UgKyA0KQorI2RlZmluZSBWNEwyX0NJRF9URVNUX1BBVFRFUk5fR1JFRU5SCQkoVjRMMl9DSURfSU1BR0VfU09VUkNFX0NMQVNTX0JBU0UgKyA1KQorI2RlZmluZSBWNEwyX0NJRF9URVNUX1BBVFRFUk5fQkxVRQkJKFY0TDJfQ0lEX0lNQUdFX1NPVVJDRV9DTEFTU19CQVNFICsgNikKKyNkZWZpbmUgVjRMMl9DSURfVEVTVF9QQVRURVJOX0dSRUVOQgkJKFY0TDJfQ0lEX0lNQUdFX1NPVVJDRV9DTEFTU19CQVNFICsgNykKKworCisvKiBJbWFnZSBwcm9jZXNzaW5nIGNvbnRyb2xzICovCisKKyNkZWZpbmUgVjRMMl9DSURfSU1BR0VfUFJPQ19DTEFTU19CQVNFCQkoVjRMMl9DVFJMX0NMQVNTX0lNQUdFX1BST0MgfCAweDkwMCkKKyNkZWZpbmUgVjRMMl9DSURfSU1BR0VfUFJPQ19DTEFTUwkJKFY0TDJfQ1RSTF9DTEFTU19JTUFHRV9QUk9DIHwgMSkKKworI2RlZmluZSBWNEwyX0NJRF9MSU5LX0ZSRVEJCQkoVjRMMl9DSURfSU1BR0VfUFJPQ19DTEFTU19CQVNFICsgMSkKKyNkZWZpbmUgVjRMMl9DSURfUElYRUxfUkFURQkJCShWNEwyX0NJRF9JTUFHRV9QUk9DX0NMQVNTX0JBU0UgKyAyKQorI2RlZmluZSBWNEwyX0NJRF9URVNUX1BBVFRFUk4JCQkoVjRMMl9DSURfSU1BR0VfUFJPQ19DTEFTU19CQVNFICsgMykKKyNkZWZpbmUgVjRMMl9DSURfREVJTlRFUkxBQ0lOR19NT0RFCQkoVjRMMl9DSURfSU1BR0VfUFJPQ19DTEFTU19CQVNFICsgNCkKKyNkZWZpbmUgVjRMMl9DSURfRElHSVRBTF9HQUlOCQkJKFY0TDJfQ0lEX0lNQUdFX1BST0NfQ0xBU1NfQkFTRSArIDUpCisKKy8qICBEVi1jbGFzcyBjb250cm9sIElEcyBkZWZpbmVkIGJ5IFY0TDIgKi8KKyNkZWZpbmUgVjRMMl9DSURfRFZfQ0xBU1NfQkFTRQkJCShWNEwyX0NUUkxfQ0xBU1NfRFYgfCAweDkwMCkKKyNkZWZpbmUgVjRMMl9DSURfRFZfQ0xBU1MJCQkoVjRMMl9DVFJMX0NMQVNTX0RWIHwgMSkKKworI2RlZmluZQlWNEwyX0NJRF9EVl9UWF9IT1RQTFVHCQkJKFY0TDJfQ0lEX0RWX0NMQVNTX0JBU0UgKyAxKQorI2RlZmluZQlWNEwyX0NJRF9EVl9UWF9SWFNFTlNFCQkJKFY0TDJfQ0lEX0RWX0NMQVNTX0JBU0UgKyAyKQorI2RlZmluZQlWNEwyX0NJRF9EVl9UWF9FRElEX1BSRVNFTlQJCShWNEwyX0NJRF9EVl9DTEFTU19CQVNFICsgMykKKyNkZWZpbmUJVjRMMl9DSURfRFZfVFhfTU9ERQkJCShWNEwyX0NJRF9EVl9DTEFTU19CQVNFICsgNCkKK2VudW0gdjRsMl9kdl90eF9tb2RlIHsKKwlWNEwyX0RWX1RYX01PREVfRFZJX0QJPSAwLAorCVY0TDJfRFZfVFhfTU9ERV9IRE1JCT0gMSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX0RWX1RYX1JHQl9SQU5HRQkJKFY0TDJfQ0lEX0RWX0NMQVNTX0JBU0UgKyA1KQorZW51bSB2NGwyX2R2X3JnYl9yYW5nZSB7CisJVjRMMl9EVl9SR0JfUkFOR0VfQVVUTwkgID0gMCwKKwlWNEwyX0RWX1JHQl9SQU5HRV9MSU1JVEVEID0gMSwKKwlWNEwyX0RWX1JHQl9SQU5HRV9GVUxMCSAgPSAyLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9EVl9UWF9JVF9DT05URU5UX1RZUEUJCShWNEwyX0NJRF9EVl9DTEFTU19CQVNFICsgNikKK2VudW0gdjRsMl9kdl9pdF9jb250ZW50X3R5cGUgeworCVY0TDJfRFZfSVRfQ09OVEVOVF9UWVBFX0dSQVBISUNTICA9IDAsCisJVjRMMl9EVl9JVF9DT05URU5UX1RZUEVfUEhPVE8JICA9IDEsCisJVjRMMl9EVl9JVF9DT05URU5UX1RZUEVfQ0lORU1BCSAgPSAyLAorCVY0TDJfRFZfSVRfQ09OVEVOVF9UWVBFX0dBTUUJICA9IDMsCisJVjRMMl9EVl9JVF9DT05URU5UX1RZUEVfTk9fSVRDCSAgPSA0LAorfTsKKworI2RlZmluZQlWNEwyX0NJRF9EVl9SWF9QT1dFUl9QUkVTRU5UCQkoVjRMMl9DSURfRFZfQ0xBU1NfQkFTRSArIDEwMCkKKyNkZWZpbmUgVjRMMl9DSURfRFZfUlhfUkdCX1JBTkdFCQkoVjRMMl9DSURfRFZfQ0xBU1NfQkFTRSArIDEwMSkKKyNkZWZpbmUgVjRMMl9DSURfRFZfUlhfSVRfQ09OVEVOVF9UWVBFCQkoVjRMMl9DSURfRFZfQ0xBU1NfQkFTRSArIDEwMikKKworI2RlZmluZSBWNEwyX0NJRF9GTV9SWF9DTEFTU19CQVNFCQkoVjRMMl9DVFJMX0NMQVNTX0ZNX1JYIHwgMHg5MDApCisjZGVmaW5lIFY0TDJfQ0lEX0ZNX1JYX0NMQVNTCQkJKFY0TDJfQ1RSTF9DTEFTU19GTV9SWCB8IDEpCisKKyNkZWZpbmUgVjRMMl9DSURfVFVORV9ERUVNUEhBU0lTCQkoVjRMMl9DSURfRk1fUlhfQ0xBU1NfQkFTRSArIDEpCitlbnVtIHY0bDJfZGVlbXBoYXNpcyB7CisJVjRMMl9ERUVNUEhBU0lTX0RJU0FCTEVECT0gVjRMMl9QUkVFTVBIQVNJU19ESVNBQkxFRCwKKwlWNEwyX0RFRU1QSEFTSVNfNTBfdVMJCT0gVjRMMl9QUkVFTVBIQVNJU181MF91UywKKwlWNEwyX0RFRU1QSEFTSVNfNzVfdVMJCT0gVjRMMl9QUkVFTVBIQVNJU183NV91UywKK307CisKKyNkZWZpbmUgVjRMMl9DSURfUkRTX1JFQ0VQVElPTgkJCShWNEwyX0NJRF9GTV9SWF9DTEFTU19CQVNFICsgMikKKyNkZWZpbmUgVjRMMl9DSURfUkRTX1JYX1BUWQkJCShWNEwyX0NJRF9GTV9SWF9DTEFTU19CQVNFICsgMykKKyNkZWZpbmUgVjRMMl9DSURfUkRTX1JYX1BTX05BTUUJCQkoVjRMMl9DSURfRk1fUlhfQ0xBU1NfQkFTRSArIDQpCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19SWF9SQURJT19URVhUCQkoVjRMMl9DSURfRk1fUlhfQ0xBU1NfQkFTRSArIDUpCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19SWF9UUkFGRklDX0FOTk9VTkNFTUVOVAkoVjRMMl9DSURfRk1fUlhfQ0xBU1NfQkFTRSArIDYpCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19SWF9UUkFGRklDX1BST0dSQU0JCShWNEwyX0NJRF9GTV9SWF9DTEFTU19CQVNFICsgNykKKyNkZWZpbmUgVjRMMl9DSURfUkRTX1JYX01VU0lDX1NQRUVDSAkJKFY0TDJfQ0lEX0ZNX1JYX0NMQVNTX0JBU0UgKyA4KQorCisjZGVmaW5lIFY0TDJfQ0lEX1JGX1RVTkVSX0NMQVNTX0JBU0UJCShWNEwyX0NUUkxfQ0xBU1NfUkZfVFVORVIgfCAweDkwMCkKKyNkZWZpbmUgVjRMMl9DSURfUkZfVFVORVJfQ0xBU1MJCQkoVjRMMl9DVFJMX0NMQVNTX1JGX1RVTkVSIHwgMSkKKworI2RlZmluZSBWNEwyX0NJRF9SRl9UVU5FUl9CQU5EV0lEVEhfQVVUTwkoVjRMMl9DSURfUkZfVFVORVJfQ0xBU1NfQkFTRSArIDExKQorI2RlZmluZSBWNEwyX0NJRF9SRl9UVU5FUl9CQU5EV0lEVEgJCShWNEwyX0NJRF9SRl9UVU5FUl9DTEFTU19CQVNFICsgMTIpCisjZGVmaW5lIFY0TDJfQ0lEX1JGX1RVTkVSX1JGX0dBSU4JCShWNEwyX0NJRF9SRl9UVU5FUl9DTEFTU19CQVNFICsgMzIpCisjZGVmaW5lIFY0TDJfQ0lEX1JGX1RVTkVSX0xOQV9HQUlOX0FVVE8JCShWNEwyX0NJRF9SRl9UVU5FUl9DTEFTU19CQVNFICsgNDEpCisjZGVmaW5lIFY0TDJfQ0lEX1JGX1RVTkVSX0xOQV9HQUlOCQkoVjRMMl9DSURfUkZfVFVORVJfQ0xBU1NfQkFTRSArIDQyKQorI2RlZmluZSBWNEwyX0NJRF9SRl9UVU5FUl9NSVhFUl9HQUlOX0FVVE8JKFY0TDJfQ0lEX1JGX1RVTkVSX0NMQVNTX0JBU0UgKyA1MSkKKyNkZWZpbmUgVjRMMl9DSURfUkZfVFVORVJfTUlYRVJfR0FJTgkJKFY0TDJfQ0lEX1JGX1RVTkVSX0NMQVNTX0JBU0UgKyA1MikKKyNkZWZpbmUgVjRMMl9DSURfUkZfVFVORVJfSUZfR0FJTl9BVVRPCQkoVjRMMl9DSURfUkZfVFVORVJfQ0xBU1NfQkFTRSArIDYxKQorI2RlZmluZSBWNEwyX0NJRF9SRl9UVU5FUl9JRl9HQUlOCQkoVjRMMl9DSURfUkZfVFVORVJfQ0xBU1NfQkFTRSArIDYyKQorI2RlZmluZSBWNEwyX0NJRF9SRl9UVU5FUl9QTExfTE9DSwkJCShWNEwyX0NJRF9SRl9UVU5FUl9DTEFTU19CQVNFICsgOTEpCisKKworLyogIERldGVjdGlvbi1jbGFzcyBjb250cm9sIElEcyBkZWZpbmVkIGJ5IFY0TDIgKi8KKyNkZWZpbmUgVjRMMl9DSURfREVURUNUX0NMQVNTX0JBU0UJCShWNEwyX0NUUkxfQ0xBU1NfREVURUNUIHwgMHg5MDApCisjZGVmaW5lIFY0TDJfQ0lEX0RFVEVDVF9DTEFTUwkJCShWNEwyX0NUUkxfQ0xBU1NfREVURUNUIHwgMSkKKworI2RlZmluZSBWNEwyX0NJRF9ERVRFQ1RfTURfTU9ERQkJCShWNEwyX0NJRF9ERVRFQ1RfQ0xBU1NfQkFTRSArIDEpCitlbnVtIHY0bDJfZGV0ZWN0X21kX21vZGUgeworCVY0TDJfREVURUNUX01EX01PREVfRElTQUJMRUQJCT0gMCwKKwlWNEwyX0RFVEVDVF9NRF9NT0RFX0dMT0JBTAkJPSAxLAorCVY0TDJfREVURUNUX01EX01PREVfVEhSRVNIT0xEX0dSSUQJPSAyLAorCVY0TDJfREVURUNUX01EX01PREVfUkVHSU9OX0dSSUQJCT0gMywKK307CisjZGVmaW5lIFY0TDJfQ0lEX0RFVEVDVF9NRF9HTE9CQUxfVEhSRVNIT0xECShWNEwyX0NJRF9ERVRFQ1RfQ0xBU1NfQkFTRSArIDIpCisjZGVmaW5lIFY0TDJfQ0lEX0RFVEVDVF9NRF9USFJFU0hPTERfR1JJRAkoVjRMMl9DSURfREVURUNUX0NMQVNTX0JBU0UgKyAzKQorI2RlZmluZSBWNEwyX0NJRF9ERVRFQ1RfTURfUkVHSU9OX0dSSUQJCShWNEwyX0NJRF9ERVRFQ1RfQ0xBU1NfQkFTRSArIDQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZXh0L3ZpZGVvZGV2Mi5oIGIvc3lzL3Y0bDIvZXh0L3ZpZGVvZGV2Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTFmM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9leHQvdmlkZW9kZXYyLmgKQEAgLTAsMCArMSwyMzk4IEBACisvKgorICogIFZpZGVvIGZvciBMaW51eCBUd28gaGVhZGVyIGZpbGUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMTIgdGhlIGNvbnRyaWJ1dG9ycworICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gcmVkaXN0cmlidXRlIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiAgQlNEIGxpY2Vuc2UgYXMgc3RhdGVkIGJlbG93OgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgKiAgICAgcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqICBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAqICBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiAgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoJSGVhZGVyIGZpbGUgZm9yIHY0bCBvciBWNEwyIGRyaXZlcnMgYW5kIGFwcGxpY2F0aW9ucworICogd2l0aCBwdWJsaWMgQVBJLgorICogQWxsIGtlcm5lbC1zcGVjaWZpYyBzdHVmZiB3ZXJlIG1vdmVkIHRvIG1lZGlhL3Y0bDItZGV2LmgsIHNvCisgKiBubyAjaWYgX19LRVJORUwgdGVzdHMgYXJlIGFsbG93ZWQgaGVyZQorICoKKyAqCVNlZSBodHRwczovL2xpbnV4dHYub3JnIGZvciBtb3JlIGluZm8KKyAqCisgKglBdXRob3I6IEJpbGwgRGlya3MgPGJpbGxAdGhlZGlya3Mub3JnPgorICoJCUp1c3RpbiBTY2hvZW1hbgorICogICAgICAgICAgICAgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorICoJCWV0IGFsLgorICovCisjaWZuZGVmIF9VQVBJX19MSU5VWF9WSURFT0RFVjJfSAorI2RlZmluZSBfVUFQSV9fTElOVVhfVklERU9ERVYyX0gKKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKyNpbmNsdWRlICJleHQvdHlwZXMtY29tcGF0LmgiCisjaW5jbHVkZSAiZXh0L3Y0bDItY29tbW9uLmgiCisjaW5jbHVkZSAiZXh0L3Y0bDItY29udHJvbHMuaCIKKworLyoKKyAqIENvbW1vbiBzdHVmZiBmb3IgYm90aCBWNEwxIGFuZCBWNEwyCisgKiBNb3ZlZCBmcm9tIHZpZGVvZGV2LmgKKyAqLworI2RlZmluZSBWSURFT19NQVhfRlJBTUUgICAgICAgICAgICAgICAzMgorI2RlZmluZSBWSURFT19NQVhfUExBTkVTICAgICAgICAgICAgICAgOAorCisvKgorICoJTSBJIFMgQyBFIEwgTCBBIE4gRSBPIFUgUworICovCisKKy8qICBGb3VyLWNoYXJhY3Rlci1jb2RlIChGT1VSQ0MpICovCisjZGVmaW5lIHY0bDJfZm91cmNjKGEsIGIsIGMsIGQpXAorCSgoX191MzIpKGEpIHwgKChfX3UzMikoYikgPDwgOCkgfCAoKF9fdTMyKShjKSA8PCAxNikgfCAoKF9fdTMyKShkKSA8PCAyNCkpCisjZGVmaW5lIHY0bDJfZm91cmNjX2JlKGEsIGIsIGMsIGQpCSh2NGwyX2ZvdXJjYyhhLCBiLCBjLCBkKSB8ICgxIDw8IDMxKSkKKworLyoKKyAqCUUgTiBVIE0gUworICovCitlbnVtIHY0bDJfZmllbGQgeworCVY0TDJfRklFTERfQU5ZICAgICAgICAgICA9IDAsIC8qIGRyaXZlciBjYW4gY2hvb3NlIGZyb20gbm9uZSwKKwkJCQkJIHRvcCwgYm90dG9tLCBpbnRlcmxhY2VkCisJCQkJCSBkZXBlbmRpbmcgb24gd2hhdGV2ZXIgaXQgdGhpbmtzCisJCQkJCSBpcyBhcHByb3hpbWF0ZSAuLi4gKi8KKwlWNEwyX0ZJRUxEX05PTkUgICAgICAgICAgPSAxLCAvKiB0aGlzIGRldmljZSBoYXMgbm8gZmllbGRzIC4uLiAqLworCVY0TDJfRklFTERfVE9QICAgICAgICAgICA9IDIsIC8qIHRvcCBmaWVsZCBvbmx5ICovCisJVjRMMl9GSUVMRF9CT1RUT00gICAgICAgID0gMywgLyogYm90dG9tIGZpZWxkIG9ubHkgKi8KKwlWNEwyX0ZJRUxEX0lOVEVSTEFDRUQgICAgPSA0LCAvKiBib3RoIGZpZWxkcyBpbnRlcmxhY2VkICovCisJVjRMMl9GSUVMRF9TRVFfVEIgICAgICAgID0gNSwgLyogYm90aCBmaWVsZHMgc2VxdWVudGlhbCBpbnRvIG9uZQorCQkJCQkgYnVmZmVyLCB0b3AtYm90dG9tIG9yZGVyICovCisJVjRMMl9GSUVMRF9TRVFfQlQgICAgICAgID0gNiwgLyogc2FtZSBhcyBhYm92ZSArIGJvdHRvbS10b3Agb3JkZXIgKi8KKwlWNEwyX0ZJRUxEX0FMVEVSTkFURSAgICAgPSA3LCAvKiBib3RoIGZpZWxkcyBhbHRlcm5hdGluZyBpbnRvCisJCQkJCSBzZXBhcmF0ZSBidWZmZXJzICovCisJVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX1RCID0gOCwgLyogYm90aCBmaWVsZHMgaW50ZXJsYWNlZCwgdG9wIGZpZWxkCisJCQkJCSBmaXJzdCBhbmQgdGhlIHRvcCBmaWVsZCBpcworCQkJCQkgdHJhbnNtaXR0ZWQgZmlyc3QgKi8KKwlWNEwyX0ZJRUxEX0lOVEVSTEFDRURfQlQgPSA5LCAvKiBib3RoIGZpZWxkcyBpbnRlcmxhY2VkLCB0b3AgZmllbGQKKwkJCQkJIGZpcnN0IGFuZCB0aGUgYm90dG9tIGZpZWxkIGlzCisJCQkJCSB0cmFuc21pdHRlZCBmaXJzdCAqLworfTsKKyNkZWZpbmUgVjRMMl9GSUVMRF9IQVNfVE9QKGZpZWxkKQlcCisJKChmaWVsZCkgPT0gVjRMMl9GSUVMRF9UT1AgCXx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRCB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfVEIgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX0JUIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfU0VRX1RCCXx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfU0VRX0JUKQorI2RlZmluZSBWNEwyX0ZJRUxEX0hBU19CT1RUT00oZmllbGQpCVwKKwkoKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0JPVFRPTSAJfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9UQiB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfQlQgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9TRVFfVEIJfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9TRVFfQlQpCisjZGVmaW5lIFY0TDJfRklFTERfSEFTX0JPVEgoZmllbGQpCVwKKwkoKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX1RCIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9CVCB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX1NFUV9UQiB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX1NFUV9CVCkKKyNkZWZpbmUgVjRMMl9GSUVMRF9IQVNfVF9PUl9CKGZpZWxkKQlcCisJKChmaWVsZCkgPT0gVjRMMl9GSUVMRF9CT1RUT00gfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9UT1AgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9BTFRFUk5BVEUpCisKK2VudW0gdjRsMl9idWZfdHlwZSB7CisJVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFICAgICAgICA9IDEsCisJVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgICAgICAgICA9IDIsCisJVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZICAgICAgICA9IDMsCisJVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSAgICAgICAgICA9IDQsCisJVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUICAgICAgICAgICA9IDUsCisJVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkUgICA9IDYsCisJVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX09VVFBVVCAgICA9IDcsCisJVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfT1ZFUkxBWSA9IDgsCisJVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSA9IDksCisJVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FICA9IDEwLAorCVY0TDJfQlVGX1RZUEVfU0RSX0NBUFRVUkUgICAgICAgICAgPSAxMSwKKwlWNEwyX0JVRl9UWVBFX1NEUl9PVVRQVVQgICAgICAgICAgID0gMTIsCisJVjRMMl9CVUZfVFlQRV9NRVRBX0NBUFRVUkUgICAgICAgICA9IDEzLAorCS8qIERlcHJlY2F0ZWQsIGRvIG5vdCB1c2UgKi8KKwlWNEwyX0JVRl9UWVBFX1BSSVZBVEUgICAgICAgICAgICAgID0gMHg4MCwKK307CisKKyNkZWZpbmUgVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSKHR5cGUpCQkJXAorCSgodHlwZSkgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORQlcCisJIHx8ICh0eXBlKSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpCisKKyNkZWZpbmUgVjRMMl9UWVBFX0lTX09VVFBVVCh0eXBlKQkJCQlcCisJKCh0eXBlKSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVAkJCVwKKwkgfHwgKHR5cGUpID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORQkJXAorCSB8fCAodHlwZSkgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZCQlcCisJIHx8ICh0eXBlKSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9PVkVSTEFZCVwKKwkgfHwgKHR5cGUpID09IFY0TDJfQlVGX1RZUEVfVkJJX09VVFBVVAkJCVwKKwkgfHwgKHR5cGUpID09IFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9PVVRQVVQJCVwKKwkgfHwgKHR5cGUpID09IFY0TDJfQlVGX1RZUEVfU0RSX09VVFBVVCkKKworZW51bSB2NGwyX3R1bmVyX3R5cGUgeworCVY0TDJfVFVORVJfUkFESU8JICAgICA9IDEsCisJVjRMMl9UVU5FUl9BTkFMT0dfVFYJICAgICA9IDIsCisJVjRMMl9UVU5FUl9ESUdJVEFMX1RWCSAgICAgPSAzLAorCVY0TDJfVFVORVJfU0RSICAgICAgICAgICAgICAgPSA0LAorCVY0TDJfVFVORVJfUkYgICAgICAgICAgICAgICAgPSA1LAorfTsKKworLyogRGVwcmVjYXRlZCwgZG8gbm90IHVzZSAqLworI2RlZmluZSBWNEwyX1RVTkVSX0FEQyAgVjRMMl9UVU5FUl9TRFIKKworZW51bSB2NGwyX21lbW9yeSB7CisJVjRMMl9NRU1PUllfTU1BUCAgICAgICAgICAgICA9IDEsCisJVjRMMl9NRU1PUllfVVNFUlBUUiAgICAgICAgICA9IDIsCisJVjRMMl9NRU1PUllfT1ZFUkxBWSAgICAgICAgICA9IDMsCisJVjRMMl9NRU1PUllfRE1BQlVGICAgICAgICAgICA9IDQsCit9OworCisvKiBzZWUgYWxzbyBodHRwOi8vdmVrdG9yLnRoZW9yZW0uY2EvZ3JhcGhpY3MveWNiY3IvICovCitlbnVtIHY0bDJfY29sb3JzcGFjZSB7CisJLyoKKwkgKiBEZWZhdWx0IGNvbG9yc3BhY2UsIGkuZS4gbGV0IHRoZSBkcml2ZXIgZmlndXJlIGl0IG91dC4KKwkgKiBDYW4gb25seSBiZSB1c2VkIHdpdGggdmlkZW8gY2FwdHVyZS4KKwkgKi8KKwlWNEwyX0NPTE9SU1BBQ0VfREVGQVVMVCAgICAgICA9IDAsCisKKwkvKiBTTVBURSAxNzBNOiB1c2VkIGZvciBicm9hZGNhc3QgTlRTQy9QQUwgU0RUViAqLworCVY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME0gICAgID0gMSwKKworCS8qIE9ic29sZXRlIHByZS0xOTk4IFNNUFRFIDI0ME0gSERUViBzdGFuZGFyZCwgc3VwZXJzZWRlZCBieSBSZWMgNzA5ICovCisJVjRMMl9DT0xPUlNQQUNFX1NNUFRFMjQwTSAgICAgPSAyLAorCisJLyogUmVjLjcwOTogdXNlZCBmb3IgSERUViAqLworCVY0TDJfQ09MT1JTUEFDRV9SRUM3MDkgICAgICAgID0gMywKKworCS8qCisJICogRGVwcmVjYXRlZCwgZG8gbm90IHVzZS4gTm8gZHJpdmVyIHdpbGwgZXZlciByZXR1cm4gdGhpcy4gVGhpcyB3YXMKKwkgKiBiYXNlZCBvbiBhIG1pc3VuZGVyc3RhbmRpbmcgb2YgdGhlIGJ0ODc4IGRhdGFzaGVldC4KKwkgKi8KKwlWNEwyX0NPTE9SU1BBQ0VfQlQ4NzggICAgICAgICA9IDQsCisKKwkvKgorCSAqIE5UU0MgMTk1MyBjb2xvcnNwYWNlLiBUaGlzIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiBkZWFsaW5nIHdpdGgKKwkgKiByZWFsbHksIHJlYWxseSBvbGQgTlRTQyByZWNvcmRpbmdzLiBTdXBlcnNlZGVkIGJ5IFNNUFRFIDE3ME0uCisJICovCisJVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fTSAgPSA1LAorCisJLyoKKwkgKiBFQlUgVGVjaCAzMjEzIFBBTC9TRUNBTSBjb2xvcnNwYWNlLiBUaGlzIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbgorCSAqIGRlYWxpbmcgd2l0aCByZWFsbHkgb2xkIFBBTC9TRUNBTSByZWNvcmRpbmdzLiBTdXBlcnNlZGVkIGJ5CisJICogU01QVEUgMTcwTS4KKwkgKi8KKwlWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRyA9IDYsCisKKwkvKgorCSAqIEVmZmVjdGl2ZWx5IHNob3J0aGFuZCBmb3IgVjRMMl9DT0xPUlNQQUNFX1NSR0IsIFY0TDJfWUNCQ1JfRU5DXzYwMQorCSAqIGFuZCBWNEwyX1FVQU5USVpBVElPTl9GVUxMX1JBTkdFLiBUbyBiZSB1c2VkIGZvciAoTW90aW9uLSlKUEVHLgorCSAqLworCVY0TDJfQ09MT1JTUEFDRV9KUEVHICAgICAgICAgID0gNywKKworCS8qIEZvciBSR0IgY29sb3JzcGFjZXMgc3VjaCBhcyBwcm9kdWNlcyBieSBtb3N0IHdlYmNhbXMuICovCisJVjRMMl9DT0xPUlNQQUNFX1NSR0IgICAgICAgICAgPSA4LAorCisJLyogQWRvYmVSR0IgY29sb3JzcGFjZSAqLworCVY0TDJfQ09MT1JTUEFDRV9BRE9CRVJHQiAgICAgID0gOSwKKworCS8qIEJULjIwMjAgY29sb3JzcGFjZSwgdXNlZCBmb3IgVUhEVFYuICovCisJVjRMMl9DT0xPUlNQQUNFX0JUMjAyMCAgICAgICAgPSAxMCwKKworCS8qIFJhdyBjb2xvcnNwYWNlOiBmb3IgUkFXIHVucHJvY2Vzc2VkIGltYWdlcyAqLworCVY0TDJfQ09MT1JTUEFDRV9SQVcgICAgICAgICAgID0gMTEsCisKKwkvKiBEQ0ktUDMgY29sb3JzcGFjZSwgdXNlZCBieSBjaW5lbWEgcHJvamVjdG9ycyAqLworCVY0TDJfQ09MT1JTUEFDRV9EQ0lfUDMgICAgICAgID0gMTIsCit9OworCisvKgorICogRGV0ZXJtaW5lIGhvdyBDT0xPUlNQQUNFX0RFRkFVTFQgc2hvdWxkIG1hcCB0byBhIHByb3BlciBjb2xvcnNwYWNlLgorICogVGhpcyBkZXBlbmRzIG9uIHdoZXRoZXIgdGhpcyBpcyBhIFNEVFYgaW1hZ2UgKHVzZSBTTVBURSAxNzBNKSwgYW4KKyAqIEhEVFYgaW1hZ2UgKHVzZSBSZWMuIDcwOSksIG9yIHNvbWV0aGluZyBlbHNlICh1c2Ugc1JHQikuCisgKi8KKyNkZWZpbmUgVjRMMl9NQVBfQ09MT1JTUEFDRV9ERUZBVUxUKGlzX3NkdHYsIGlzX2hkdHYpIFwKKwkoKGlzX3NkdHYpID8gVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTSA6IFwKKwkgKChpc19oZHR2KSA/IFY0TDJfQ09MT1JTUEFDRV9SRUM3MDkgOiBWNEwyX0NPTE9SU1BBQ0VfU1JHQikpCisKK2VudW0gdjRsMl94ZmVyX2Z1bmMgeworCS8qCisJICogTWFwcGluZyBvZiBWNEwyX1hGRVJfRlVOQ19ERUZBVUxUIHRvIGFjdHVhbCB0cmFuc2ZlciBmdW5jdGlvbnMKKwkgKiBmb3IgdGhlIHZhcmlvdXMgY29sb3JzcGFjZXM6CisJICoKKwkgKiBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNLCBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9NLAorCSAqIFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX0JHLCBWNEwyX0NPTE9SU1BBQ0VfUkVDNzA5IGFuZAorCSAqIFY0TDJfQ09MT1JTUEFDRV9CVDIwMjA6IFY0TDJfWEZFUl9GVU5DXzcwOQorCSAqCisJICogVjRMMl9DT0xPUlNQQUNFX1NSR0IsIFY0TDJfQ09MT1JTUEFDRV9KUEVHOiBWNEwyX1hGRVJfRlVOQ19TUkdCCisJICoKKwkgKiBWNEwyX0NPTE9SU1BBQ0VfQURPQkVSR0I6IFY0TDJfWEZFUl9GVU5DX0FET0JFUkdCCisJICoKKwkgKiBWNEwyX0NPTE9SU1BBQ0VfU01QVEUyNDBNOiBWNEwyX1hGRVJfRlVOQ19TTVBURTI0ME0KKwkgKgorCSAqIFY0TDJfQ09MT1JTUEFDRV9SQVc6IFY0TDJfWEZFUl9GVU5DX05PTkUKKwkgKgorCSAqIFY0TDJfQ09MT1JTUEFDRV9EQ0lfUDM6IFY0TDJfWEZFUl9GVU5DX0RDSV9QMworCSAqLworCVY0TDJfWEZFUl9GVU5DX0RFRkFVTFQgICAgID0gMCwKKwlWNEwyX1hGRVJfRlVOQ183MDkgICAgICAgICA9IDEsCisJVjRMMl9YRkVSX0ZVTkNfU1JHQiAgICAgICAgPSAyLAorCVY0TDJfWEZFUl9GVU5DX0FET0JFUkdCICAgID0gMywKKwlWNEwyX1hGRVJfRlVOQ19TTVBURTI0ME0gICA9IDQsCisJVjRMMl9YRkVSX0ZVTkNfTk9ORSAgICAgICAgPSA1LAorCVY0TDJfWEZFUl9GVU5DX0RDSV9QMyAgICAgID0gNiwKKwlWNEwyX1hGRVJfRlVOQ19TTVBURTIwODQgICA9IDcsCit9OworCisvKgorICogRGV0ZXJtaW5lIGhvdyBYRkVSX0ZVTkNfREVGQVVMVCBzaG91bGQgbWFwIHRvIGEgcHJvcGVyIHRyYW5zZmVyIGZ1bmN0aW9uLgorICogVGhpcyBkZXBlbmRzIG9uIHRoZSBjb2xvcnNwYWNlLgorICovCisjZGVmaW5lIFY0TDJfTUFQX1hGRVJfRlVOQ19ERUZBVUxUKGNvbHNwKSBcCisJKChjb2xzcCkgPT0gVjRMMl9DT0xPUlNQQUNFX0FET0JFUkdCID8gVjRMMl9YRkVSX0ZVTkNfQURPQkVSR0IgOiBcCisJICgoY29sc3ApID09IFY0TDJfQ09MT1JTUEFDRV9TTVBURTI0ME0gPyBWNEwyX1hGRVJfRlVOQ19TTVBURTI0ME0gOiBcCisJICAoKGNvbHNwKSA9PSBWNEwyX0NPTE9SU1BBQ0VfRENJX1AzID8gVjRMMl9YRkVSX0ZVTkNfRENJX1AzIDogXAorCSAgICgoY29sc3ApID09IFY0TDJfQ09MT1JTUEFDRV9SQVcgPyBWNEwyX1hGRVJfRlVOQ19OT05FIDogXAorCSAgICAoKGNvbHNwKSA9PSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiB8fCAoY29sc3ApID09IFY0TDJfQ09MT1JTUEFDRV9KUEVHID8gXAorCSAgICAgVjRMMl9YRkVSX0ZVTkNfU1JHQiA6IFY0TDJfWEZFUl9GVU5DXzcwOSkpKSkpCisKK2VudW0gdjRsMl95Y2Jjcl9lbmNvZGluZyB7CisJLyoKKwkgKiBNYXBwaW5nIG9mIFY0TDJfWUNCQ1JfRU5DX0RFRkFVTFQgdG8gYWN0dWFsIGVuY29kaW5ncyBmb3IgdGhlCisJICogdmFyaW91cyBjb2xvcnNwYWNlczoKKwkgKgorCSAqIFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME0sIFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX00sCisJICogVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkcsIFY0TDJfQ09MT1JTUEFDRV9TUkdCLAorCSAqIFY0TDJfQ09MT1JTUEFDRV9BRE9CRVJHQiBhbmQgVjRMMl9DT0xPUlNQQUNFX0pQRUc6IFY0TDJfWUNCQ1JfRU5DXzYwMQorCSAqCisJICogVjRMMl9DT0xPUlNQQUNFX1JFQzcwOSBhbmQgVjRMMl9DT0xPUlNQQUNFX0RDSV9QMzogVjRMMl9ZQ0JDUl9FTkNfNzA5CisJICoKKwkgKiBWNEwyX0NPTE9SU1BBQ0VfQlQyMDIwOiBWNEwyX1lDQkNSX0VOQ19CVDIwMjAKKwkgKgorCSAqIFY0TDJfQ09MT1JTUEFDRV9TTVBURTI0ME06IFY0TDJfWUNCQ1JfRU5DX1NNUFRFMjQwTQorCSAqLworCVY0TDJfWUNCQ1JfRU5DX0RFRkFVTFQgICAgICAgID0gMCwKKworCS8qIElUVS1SIDYwMSAtLSBTRFRWICovCisJVjRMMl9ZQ0JDUl9FTkNfNjAxICAgICAgICAgICAgPSAxLAorCisJLyogUmVjLiA3MDkgLS0gSERUViAqLworCVY0TDJfWUNCQ1JfRU5DXzcwOSAgICAgICAgICAgID0gMiwKKworCS8qIElUVS1SIDYwMS9FTiA2MTk2Ni0yLTQgRXh0ZW5kZWQgR2FtdXQgLS0gU0RUViAqLworCVY0TDJfWUNCQ1JfRU5DX1hWNjAxICAgICAgICAgID0gMywKKworCS8qIFJlYy4gNzA5L0VOIDYxOTY2LTItNCBFeHRlbmRlZCBHYW11dCAtLSBIRFRWICovCisJVjRMMl9ZQ0JDUl9FTkNfWFY3MDkgICAgICAgICAgPSA0LAorCisjaWZuZGVmIF9fS0VSTkVMX18KKwkvKgorCSAqIHNZQ0MgKFknQ2JDciBlbmNvZGluZyBvZiBzUkdCKSwgaWRlbnRpY2FsIHRvIEVOQ182MDEuIEl0IHdhcyBhZGRlZAorCSAqIG9yaWdpbmFsbHkgZHVlIHRvIGEgbWlzdW5kZXJzdGFuZGluZyBvZiB0aGUgc1lDQyBzdGFuZGFyZC4gSXQgc2hvdWxkCisJICogbm90IGJlIHVzZWQsIGluc3RlYWQgdXNlIFY0TDJfWUNCQ1JfRU5DXzYwMS4KKwkgKi8KKwlWNEwyX1lDQkNSX0VOQ19TWUNDICAgICAgICAgICA9IDUsCisjZW5kaWYKKworCS8qIEJULjIwMjAgTm9uLWNvbnN0YW50IEx1bWluYW5jZSBZJ0NiQ3IgKi8KKwlWNEwyX1lDQkNSX0VOQ19CVDIwMjAgICAgICAgICA9IDYsCisKKwkvKiBCVC4yMDIwIENvbnN0YW50IEx1bWluYW5jZSBZJ0NiY0NyYyAqLworCVY0TDJfWUNCQ1JfRU5DX0JUMjAyMF9DT05TVF9MVU0gPSA3LAorCisJLyogU01QVEUgMjQwTSAtLSBPYnNvbGV0ZSBIRFRWICovCisJVjRMMl9ZQ0JDUl9FTkNfU01QVEUyNDBNICAgICAgPSA4LAorfTsKKworLyoKKyAqIGVudW0gdjRsMl9oc3ZfZW5jb2RpbmcgdmFsdWVzIHNob3VsZCBub3QgY29sbGlkZSB3aXRoIHRoZSBvbmVzIGZyb20KKyAqIGVudW0gdjRsMl95Y2Jjcl9lbmNvZGluZy4KKyAqLworZW51bSB2NGwyX2hzdl9lbmNvZGluZyB7CisKKwkvKiBIdWUgbWFwcGVkIHRvIDAgLSAxNzkgKi8KKwlWNEwyX0hTVl9FTkNfMTgwCQk9IDEyOCwKKworCS8qIEh1ZSBtYXBwZWQgdG8gMC0yNTUgKi8KKwlWNEwyX0hTVl9FTkNfMjU2CQk9IDEyOSwKK307CisKKy8qCisgKiBEZXRlcm1pbmUgaG93IFlDQkNSX0VOQ19ERUZBVUxUIHNob3VsZCBtYXAgdG8gYSBwcm9wZXIgWSdDYkNyIGVuY29kaW5nLgorICogVGhpcyBkZXBlbmRzIG9uIHRoZSBjb2xvcnNwYWNlLgorICovCisjZGVmaW5lIFY0TDJfTUFQX1lDQkNSX0VOQ19ERUZBVUxUKGNvbHNwKSBcCisJKCgoY29sc3ApID09IFY0TDJfQ09MT1JTUEFDRV9SRUM3MDkgfHwgXAorCSAgKGNvbHNwKSA9PSBWNEwyX0NPTE9SU1BBQ0VfRENJX1AzKSA/IFY0TDJfWUNCQ1JfRU5DXzcwOSA6IFwKKwkgKChjb2xzcCkgPT0gVjRMMl9DT0xPUlNQQUNFX0JUMjAyMCA/IFY0TDJfWUNCQ1JfRU5DX0JUMjAyMCA6IFwKKwkgICgoY29sc3ApID09IFY0TDJfQ09MT1JTUEFDRV9TTVBURTI0ME0gPyBWNEwyX1lDQkNSX0VOQ19TTVBURTI0ME0gOiBcCisJICAgVjRMMl9ZQ0JDUl9FTkNfNjAxKSkpCisKK2VudW0gdjRsMl9xdWFudGl6YXRpb24geworCS8qCisJICogVGhlIGRlZmF1bHQgZm9yIFInRydCJyBxdWFudGl6YXRpb24gaXMgYWx3YXlzIGZ1bGwgcmFuZ2UsIGV4Y2VwdAorCSAqIGZvciB0aGUgQlQyMDIwIGNvbG9yc3BhY2UuIEZvciBZJ0NiQ3IgdGhlIHF1YW50aXphdGlvbiBpcyBhbHdheXMKKwkgKiBsaW1pdGVkIHJhbmdlLCBleGNlcHQgZm9yIENPTE9SU1BBQ0VfSlBFRzogdGhpcyBpcyBmdWxsIHJhbmdlLgorCSAqLworCVY0TDJfUVVBTlRJWkFUSU9OX0RFRkFVTFQgICAgID0gMCwKKwlWNEwyX1FVQU5USVpBVElPTl9GVUxMX1JBTkdFICA9IDEsCisJVjRMMl9RVUFOVElaQVRJT05fTElNX1JBTkdFICAgPSAyLAorfTsKKworLyoKKyAqIERldGVybWluZSBob3cgUVVBTlRJWkFUSU9OX0RFRkFVTFQgc2hvdWxkIG1hcCB0byBhIHByb3BlciBxdWFudGl6YXRpb24uCisgKiBUaGlzIGRlcGVuZHMgb24gd2hldGhlciB0aGUgaW1hZ2UgaXMgUkdCIG9yIG5vdCwgdGhlIGNvbG9yc3BhY2UgYW5kIHRoZQorICogWSdDYkNyIGVuY29kaW5nLgorICovCisjZGVmaW5lIFY0TDJfTUFQX1FVQU5USVpBVElPTl9ERUZBVUxUKGlzX3JnYl9vcl9oc3YsIGNvbHNwLCB5Y2Jjcl9lbmMpIFwKKwkoKChpc19yZ2Jfb3JfaHN2KSAmJiAoY29sc3ApID09IFY0TDJfQ09MT1JTUEFDRV9CVDIwMjApID8gXAorCSBWNEwyX1FVQU5USVpBVElPTl9MSU1fUkFOR0UgOiBcCisJICgoKGlzX3JnYl9vcl9oc3YpIHx8IChjb2xzcCkgPT0gVjRMMl9DT0xPUlNQQUNFX0pQRUcpID8gXAorCSBWNEwyX1FVQU5USVpBVElPTl9GVUxMX1JBTkdFIDogVjRMMl9RVUFOVElaQVRJT05fTElNX1JBTkdFKSkKKworZW51bSB2NGwyX3ByaW9yaXR5IHsKKwlWNEwyX1BSSU9SSVRZX1VOU0VUICAgICAgID0gMCwgIC8qIG5vdCBpbml0aWFsaXplZCAqLworCVY0TDJfUFJJT1JJVFlfQkFDS0dST1VORCAgPSAxLAorCVY0TDJfUFJJT1JJVFlfSU5URVJBQ1RJVkUgPSAyLAorCVY0TDJfUFJJT1JJVFlfUkVDT1JEICAgICAgPSAzLAorCVY0TDJfUFJJT1JJVFlfREVGQVVMVCAgICAgPSBWNEwyX1BSSU9SSVRZX0lOVEVSQUNUSVZFLAorfTsKKworc3RydWN0IHY0bDJfcmVjdCB7CisJX19zMzIgICBsZWZ0OworCV9fczMyICAgdG9wOworCV9fdTMyICAgd2lkdGg7CisJX191MzIgICBoZWlnaHQ7Cit9OworCitzdHJ1Y3QgdjRsMl9mcmFjdCB7CisJX191MzIgICBudW1lcmF0b3I7CisJX191MzIgICBkZW5vbWluYXRvcjsKK307CisKKy8qKgorICAqIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgLSBEZXNjcmliZXMgVjRMMiBkZXZpY2UgY2FwcyByZXR1cm5lZCBieSBWSURJT0NfUVVFUllDQVAKKyAgKgorICAqIEBkcml2ZXI6CSAgIG5hbWUgb2YgdGhlIGRyaXZlciBtb2R1bGUgKGUuZy4gImJ0dHYiKQorICAqIEBjYXJkOgkgICBuYW1lIG9mIHRoZSBjYXJkIChlLmcuICJIYXVwcGF1Z2UgV2luVFYiKQorICAqIEBidXNfaW5mbzoJICAgbmFtZSBvZiB0aGUgYnVzIChlLmcuICJQQ0k6IiArIHBjaV9uYW1lKHBjaV9kZXYpICkKKyAgKiBAdmVyc2lvbjoJICAgS0VSTkVMX1ZFUlNJT04KKyAgKiBAY2FwYWJpbGl0aWVzOiBjYXBhYmlsaXRpZXMgb2YgdGhlIHBoeXNpY2FsIGRldmljZSBhcyBhIHdob2xlCisgICogQGRldmljZV9jYXBzOiAgY2FwYWJpbGl0aWVzIGFjY2Vzc2VkIHZpYSB0aGlzIHBhcnRpY3VsYXIgZGV2aWNlIChub2RlKQorICAqIEByZXNlcnZlZDoJICAgcmVzZXJ2ZWQgZmllbGRzIGZvciBmdXR1cmUgZXh0ZW5zaW9ucworICAqLworc3RydWN0IHY0bDJfY2FwYWJpbGl0eSB7CisJX191OAlkcml2ZXJbMTZdOworCV9fdTgJY2FyZFszMl07CisJX191OAlidXNfaW5mb1szMl07CisJX191MzIgICB2ZXJzaW9uOworCV9fdTMyCWNhcGFiaWxpdGllczsKKwlfX3UzMglkZXZpY2VfY2FwczsKKwlfX3UzMglyZXNlcnZlZFszXTsKK307CisKKy8qIFZhbHVlcyBmb3IgJ2NhcGFiaWxpdGllcycgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9DQVBfVklERU9fQ0FQVFVSRQkJMHgwMDAwMDAwMSAgLyogSXMgYSB2aWRlbyBjYXB0dXJlIGRldmljZSAqLworI2RlZmluZSBWNEwyX0NBUF9WSURFT19PVVRQVVQJCTB4MDAwMDAwMDIgIC8qIElzIGEgdmlkZW8gb3V0cHV0IGRldmljZSAqLworI2RlZmluZSBWNEwyX0NBUF9WSURFT19PVkVSTEFZCQkweDAwMDAwMDA0ICAvKiBDYW4gZG8gdmlkZW8gb3ZlcmxheSAqLworI2RlZmluZSBWNEwyX0NBUF9WQklfQ0FQVFVSRQkJMHgwMDAwMDAxMCAgLyogSXMgYSByYXcgVkJJIGNhcHR1cmUgZGV2aWNlICovCisjZGVmaW5lIFY0TDJfQ0FQX1ZCSV9PVVRQVVQJCTB4MDAwMDAwMjAgIC8qIElzIGEgcmF3IFZCSSBvdXRwdXQgZGV2aWNlICovCisjZGVmaW5lIFY0TDJfQ0FQX1NMSUNFRF9WQklfQ0FQVFVSRQkweDAwMDAwMDQwICAvKiBJcyBhIHNsaWNlZCBWQkkgY2FwdHVyZSBkZXZpY2UgKi8KKyNkZWZpbmUgVjRMMl9DQVBfU0xJQ0VEX1ZCSV9PVVRQVVQJMHgwMDAwMDA4MCAgLyogSXMgYSBzbGljZWQgVkJJIG91dHB1dCBkZXZpY2UgKi8KKyNkZWZpbmUgVjRMMl9DQVBfUkRTX0NBUFRVUkUJCTB4MDAwMDAxMDAgIC8qIFJEUyBkYXRhIGNhcHR1cmUgKi8KKyNkZWZpbmUgVjRMMl9DQVBfVklERU9fT1VUUFVUX09WRVJMQVkJMHgwMDAwMDIwMCAgLyogQ2FuIGRvIHZpZGVvIG91dHB1dCBvdmVybGF5ICovCisjZGVmaW5lIFY0TDJfQ0FQX0hXX0ZSRVFfU0VFSwkJMHgwMDAwMDQwMCAgLyogQ2FuIGRvIGhhcmR3YXJlIGZyZXF1ZW5jeSBzZWVrICAqLworI2RlZmluZSBWNEwyX0NBUF9SRFNfT1VUUFVUCQkweDAwMDAwODAwICAvKiBJcyBhbiBSRFMgZW5jb2RlciAqLworCisvKiBJcyBhIHZpZGVvIGNhcHR1cmUgZGV2aWNlIHRoYXQgc3VwcG9ydHMgbXVsdGlwbGFuYXIgZm9ybWF0cyAqLworI2RlZmluZSBWNEwyX0NBUF9WSURFT19DQVBUVVJFX01QTEFORQkweDAwMDAxMDAwCisvKiBJcyBhIHZpZGVvIG91dHB1dCBkZXZpY2UgdGhhdCBzdXBwb3J0cyBtdWx0aXBsYW5hciBmb3JtYXRzICovCisjZGVmaW5lIFY0TDJfQ0FQX1ZJREVPX09VVFBVVF9NUExBTkUJMHgwMDAwMjAwMAorLyogSXMgYSB2aWRlbyBtZW0tdG8tbWVtIGRldmljZSB0aGF0IHN1cHBvcnRzIG11bHRpcGxhbmFyIGZvcm1hdHMgKi8KKyNkZWZpbmUgVjRMMl9DQVBfVklERU9fTTJNX01QTEFORQkweDAwMDA0MDAwCisvKiBJcyBhIHZpZGVvIG1lbS10by1tZW0gZGV2aWNlICovCisjZGVmaW5lIFY0TDJfQ0FQX1ZJREVPX00yTQkJMHgwMDAwODAwMAorCisjZGVmaW5lIFY0TDJfQ0FQX1RVTkVSCQkJMHgwMDAxMDAwMCAgLyogaGFzIGEgdHVuZXIgKi8KKyNkZWZpbmUgVjRMMl9DQVBfQVVESU8JCQkweDAwMDIwMDAwICAvKiBoYXMgYXVkaW8gc3VwcG9ydCAqLworI2RlZmluZSBWNEwyX0NBUF9SQURJTwkJCTB4MDAwNDAwMDAgIC8qIGlzIGEgcmFkaW8gZGV2aWNlICovCisjZGVmaW5lIFY0TDJfQ0FQX01PRFVMQVRPUgkJMHgwMDA4MDAwMCAgLyogaGFzIGEgbW9kdWxhdG9yICovCisKKyNkZWZpbmUgVjRMMl9DQVBfU0RSX0NBUFRVUkUJCTB4MDAxMDAwMDAgIC8qIElzIGEgU0RSIGNhcHR1cmUgZGV2aWNlICovCisjZGVmaW5lIFY0TDJfQ0FQX0VYVF9QSVhfRk9STUFUCQkweDAwMjAwMDAwICAvKiBTdXBwb3J0cyB0aGUgZXh0ZW5kZWQgcGl4ZWwgZm9ybWF0ICovCisjZGVmaW5lIFY0TDJfQ0FQX1NEUl9PVVRQVVQJCTB4MDA0MDAwMDAgIC8qIElzIGEgU0RSIG91dHB1dCBkZXZpY2UgKi8KKyNkZWZpbmUgVjRMMl9DQVBfTUVUQV9DQVBUVVJFCQkweDAwODAwMDAwICAvKiBJcyBhIG1ldGFkYXRhIGNhcHR1cmUgZGV2aWNlICovCisKKyNkZWZpbmUgVjRMMl9DQVBfUkVBRFdSSVRFICAgICAgICAgICAgICAweDAxMDAwMDAwICAvKiByZWFkL3dyaXRlIHN5c3RlbWNhbGxzICovCisjZGVmaW5lIFY0TDJfQ0FQX0FTWU5DSU8gICAgICAgICAgICAgICAgMHgwMjAwMDAwMCAgLyogYXN5bmMgSS9PICovCisjZGVmaW5lIFY0TDJfQ0FQX1NUUkVBTUlORyAgICAgICAgICAgICAgMHgwNDAwMDAwMCAgLyogc3RyZWFtaW5nIEkvTyBpb2N0bHMgKi8KKworI2RlZmluZSBWNEwyX0NBUF9UT1VDSCAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAgIC8qIElzIGEgdG91Y2ggZGV2aWNlICovCisKKyNkZWZpbmUgVjRMMl9DQVBfREVWSUNFX0NBUFMgICAgICAgICAgICAweDgwMDAwMDAwICAvKiBzZXRzIGRldmljZSBjYXBhYmlsaXRpZXMgZmllbGQgKi8KKworLyoKKyAqCVYgSSBEIEUgTyAgIEkgTSBBIEcgRSAgIEYgTyBSIE0gQSBUCisgKi8KK3N0cnVjdCB2NGwyX3BpeF9mb3JtYXQgeworCV9fdTMyICAgICAgICAgCQl3aWR0aDsKKwlfX3UzMgkJCWhlaWdodDsKKwlfX3UzMgkJCXBpeGVsZm9ybWF0OworCV9fdTMyCQkJZmllbGQ7CQkvKiBlbnVtIHY0bDJfZmllbGQgKi8KKwlfX3UzMiAgICAgICAgICAgIAlieXRlc3BlcmxpbmU7CS8qIGZvciBwYWRkaW5nLCB6ZXJvIGlmIHVudXNlZCAqLworCV9fdTMyICAgICAgICAgIAkJc2l6ZWltYWdlOworCV9fdTMyCQkJY29sb3JzcGFjZTsJLyogZW51bSB2NGwyX2NvbG9yc3BhY2UgKi8KKwlfX3UzMgkJCXByaXY7CQkvKiBwcml2YXRlIGRhdGEsIGRlcGVuZHMgb24gcGl4ZWxmb3JtYXQgKi8KKwlfX3UzMgkJCWZsYWdzOwkJLyogZm9ybWF0IGZsYWdzIChWNEwyX1BJWF9GTVRfRkxBR18qKSAqLworCXVuaW9uIHsKKwkJLyogZW51bSB2NGwyX3ljYmNyX2VuY29kaW5nICovCisJCV9fdTMyCQkJeWNiY3JfZW5jOworCQkvKiBlbnVtIHY0bDJfaHN2X2VuY29kaW5nICovCisJCV9fdTMyCQkJaHN2X2VuYzsKKwl9OworCV9fdTMyCQkJcXVhbnRpemF0aW9uOwkvKiBlbnVtIHY0bDJfcXVhbnRpemF0aW9uICovCisJX191MzIJCQl4ZmVyX2Z1bmM7CS8qIGVudW0gdjRsMl94ZmVyX2Z1bmMgKi8KK307CisKKy8qICAgICAgUGl4ZWwgZm9ybWF0ICAgICAgICAgRk9VUkNDICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCAgRGVzY3JpcHRpb24gICovCisKKy8qIFJHQiBmb3JtYXRzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0IzMzIgIHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnQicsICcxJykgLyogIDggIFJHQi0zLTMtMiAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1JHQjQ0NCAgdjRsMl9mb3VyY2MoJ1InLCAnNCcsICc0JywgJzQnKSAvKiAxNiAgeHh4eHJycnIgZ2dnZ2JiYmIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0FSR0I0NDQgdjRsMl9mb3VyY2MoJ0EnLCAnUicsICcxJywgJzInKSAvKiAxNiAgYWFhYXJycnIgZ2dnZ2JiYmIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1hSR0I0NDQgdjRsMl9mb3VyY2MoJ1gnLCAnUicsICcxJywgJzInKSAvKiAxNiAgeHh4eHJycnIgZ2dnZ2JiYmIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1JHQjU1NSAgdjRsMl9mb3VyY2MoJ1InLCAnRycsICdCJywgJ08nKSAvKiAxNiAgUkdCLTUtNS01ICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfQVJHQjU1NSB2NGwyX2ZvdXJjYygnQScsICdSJywgJzEnLCAnNScpIC8qIDE2ICBBUkdCLTEtNS01LTUgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9YUkdCNTU1IHY0bDJfZm91cmNjKCdYJywgJ1InLCAnMScsICc1JykgLyogMTYgIFhSR0ItMS01LTUtNSAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1JHQjU2NSAgdjRsMl9mb3VyY2MoJ1InLCAnRycsICdCJywgJ1AnKSAvKiAxNiAgUkdCLTUtNi01ICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUkdCNTU1WCB2NGwyX2ZvdXJjYygnUicsICdHJywgJ0InLCAnUScpIC8qIDE2ICBSR0ItNS01LTUgQkUgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9BUkdCNTU1WCB2NGwyX2ZvdXJjY19iZSgnQScsICdSJywgJzEnLCAnNScpIC8qIDE2ICBBUkdCLTUtNS01IEJFICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9YUkdCNTU1WCB2NGwyX2ZvdXJjY19iZSgnWCcsICdSJywgJzEnLCAnNScpIC8qIDE2ICBYUkdCLTUtNS01IEJFICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0I1NjVYIHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnQicsICdSJykgLyogMTYgIFJHQi01LTYtNSBCRSAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0JHUjY2NiAgdjRsMl9mb3VyY2MoJ0InLCAnRycsICdSJywgJ0gnKSAvKiAxOCAgQkdSLTYtNi02CSAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0JHUjI0ICAgdjRsMl9mb3VyY2MoJ0InLCAnRycsICdSJywgJzMnKSAvKiAyNCAgQkdSLTgtOC04ICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUkdCMjQgICB2NGwyX2ZvdXJjYygnUicsICdHJywgJ0InLCAnMycpIC8qIDI0ICBSR0ItOC04LTggICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9CR1IzMiAgIHY0bDJfZm91cmNjKCdCJywgJ0cnLCAnUicsICc0JykgLyogMzIgIEJHUi04LTgtOC04ICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0FCR1IzMiAgdjRsMl9mb3VyY2MoJ0EnLCAnUicsICcyJywgJzQnKSAvKiAzMiAgQkdSQS04LTgtOC04ICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWEJHUjMyICB2NGwyX2ZvdXJjYygnWCcsICdSJywgJzInLCAnNCcpIC8qIDMyICBCR1JYLTgtOC04LTggICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0IzMiAgIHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnQicsICc0JykgLyogMzIgIFJHQi04LTgtOC04ICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0FSR0IzMiAgdjRsMl9mb3VyY2MoJ0InLCAnQScsICcyJywgJzQnKSAvKiAzMiAgQVJHQi04LTgtOC04ICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWFJHQjMyICB2NGwyX2ZvdXJjYygnQicsICdYJywgJzInLCAnNCcpIC8qIDMyICBYUkdCLTgtOC04LTggICovCisKKy8qIEdyZXkgZm9ybWF0cyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfR1JFWSAgICB2NGwyX2ZvdXJjYygnRycsICdSJywgJ0UnLCAnWScpIC8qICA4ICBHcmV5c2NhbGUgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZNCAgICAgIHY0bDJfZm91cmNjKCdZJywgJzAnLCAnNCcsICcgJykgLyogIDQgIEdyZXlzY2FsZSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1k2ICAgICAgdjRsMl9mb3VyY2MoJ1knLCAnMCcsICc2JywgJyAnKSAvKiAgNiAgR3JleXNjYWxlICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWTEwICAgICB2NGwyX2ZvdXJjYygnWScsICcxJywgJzAnLCAnICcpIC8qIDEwICBHcmV5c2NhbGUgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZMTIgICAgIHY0bDJfZm91cmNjKCdZJywgJzEnLCAnMicsICcgJykgLyogMTIgIEdyZXlzY2FsZSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1kxNiAgICAgdjRsMl9mb3VyY2MoJ1knLCAnMScsICc2JywgJyAnKSAvKiAxNiAgR3JleXNjYWxlICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWTE2X0JFICB2NGwyX2ZvdXJjY19iZSgnWScsICcxJywgJzYnLCAnICcpIC8qIDE2ICBHcmV5c2NhbGUgQkUgICovCisKKy8qIEdyZXkgYml0LXBhY2tlZCBmb3JtYXRzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZMTBCUEFDSyAgICB2NGwyX2ZvdXJjYygnWScsICcxJywgJzAnLCAnQicpIC8qIDEwICBHcmV5c2NhbGUgYml0LXBhY2tlZCAqLworCisvKiBQYWxldHRlIGZvcm1hdHMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1BBTDggICAgdjRsMl9mb3VyY2MoJ1AnLCAnQScsICdMJywgJzgnKSAvKiAgOCAgOC1iaXQgcGFsZXR0ZSAqLworCisvKiBDaHJvbWluYW5jZSBmb3JtYXRzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9VVjggICAgIHY0bDJfZm91cmNjKCdVJywgJ1YnLCAnOCcsICcgJykgLyogIDggIFVWIDQ6NCAqLworCisvKiBMdW1pbmFuY2UrQ2hyb21pbmFuY2UgZm9ybWF0cyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVZViAgICB2NGwyX2ZvdXJjYygnWScsICdVJywgJ1knLCAnVicpIC8qIDE2ICBZVVYgNDoyOjIgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZWVVWICAgIHY0bDJfZm91cmNjKCdZJywgJ1knLCAnVScsICdWJykgLyogMTYgIFlVViA0OjI6MiAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lWWVUgICAgdjRsMl9mb3VyY2MoJ1knLCAnVicsICdZJywgJ1UnKSAvKiAxNiBZVlUgNDoyOjIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1VZVlkgICAgdjRsMl9mb3VyY2MoJ1UnLCAnWScsICdWJywgJ1knKSAvKiAxNiAgWVVWIDQ6MjoyICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfVllVWSAgICB2NGwyX2ZvdXJjYygnVicsICdZJywgJ1UnLCAnWScpIC8qIDE2ICBZVVYgNDoyOjIgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZNDFQICAgIHY0bDJfZm91cmNjKCdZJywgJzQnLCAnMScsICdQJykgLyogMTIgIFlVViA0OjE6MSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjQ0NCAgdjRsMl9mb3VyY2MoJ1knLCAnNCcsICc0JywgJzQnKSAvKiAxNiAgeHh4eHl5eXkgdXV1dXZ2dnYgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjU1NSAgdjRsMl9mb3VyY2MoJ1knLCAnVScsICdWJywgJ08nKSAvKiAxNiAgWVVWLTUtNS01ICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNTY1ICB2NGwyX2ZvdXJjYygnWScsICdVJywgJ1YnLCAnUCcpIC8qIDE2ICBZVVYtNS02LTUgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVYzMiAgIHY0bDJfZm91cmNjKCdZJywgJ1UnLCAnVicsICc0JykgLyogMzIgIFlVVi04LTgtOC04ICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0hJMjQwICAgdjRsMl9mb3VyY2MoJ0gnLCAnSScsICcyJywgJzQnKSAvKiAgOCAgOC1iaXQgY29sb3IgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfSE0xMiAgICB2NGwyX2ZvdXJjYygnSCcsICdNJywgJzEnLCAnMicpIC8qICA4ICBZVVYgNDoyOjAgMTZ4MTYgbWFjcm9ibG9ja3MgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX000MjAgICAgdjRsMl9mb3VyY2MoJ00nLCAnNCcsICcyJywgJzAnKSAvKiAxMiAgWVVWIDQ6MjowIDIgbGluZXMgeSwgMSBsaW5lIHV2IGludGVybGVhdmVkICovCisKKy8qIHR3byBwbGFuZXMgLS0gb25lIFksIG9uZSBDciArIENiIGludGVybGVhdmVkICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYxMiAgICB2NGwyX2ZvdXJjYygnTicsICdWJywgJzEnLCAnMicpIC8qIDEyICBZL0NiQ3IgNDoyOjAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjIxICAgIHY0bDJfZm91cmNjKCdOJywgJ1YnLCAnMicsICcxJykgLyogMTIgIFkvQ3JDYiA0OjI6MCAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WMTYgICAgdjRsMl9mb3VyY2MoJ04nLCAnVicsICcxJywgJzYnKSAvKiAxNiAgWS9DYkNyIDQ6MjoyICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlY2MSAgICB2NGwyX2ZvdXJjYygnTicsICdWJywgJzYnLCAnMScpIC8qIDE2ICBZL0NyQ2IgNDoyOjIgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjI0ICAgIHY0bDJfZm91cmNjKCdOJywgJ1YnLCAnMicsICc0JykgLyogMjQgIFkvQ2JDciA0OjQ6NCAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WNDIgICAgdjRsMl9mb3VyY2MoJ04nLCAnVicsICc0JywgJzInKSAvKiAyNCAgWS9DckNiIDQ6NDo0ICAqLworCisvKiB0d28gbm9uIGNvbnRpZ3VvdXMgcGxhbmVzIC0gb25lIFksIG9uZSBDciArIENiIGludGVybGVhdmVkICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYxMk0gICB2NGwyX2ZvdXJjYygnTicsICdNJywgJzEnLCAnMicpIC8qIDEyICBZL0NiQ3IgNDoyOjAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjIxTSAgIHY0bDJfZm91cmNjKCdOJywgJ00nLCAnMicsICcxJykgLyogMjEgIFkvQ3JDYiA0OjI6MCAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WMTZNICAgdjRsMl9mb3VyY2MoJ04nLCAnTScsICcxJywgJzYnKSAvKiAxNiAgWS9DYkNyIDQ6MjoyICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlY2MU0gICB2NGwyX2ZvdXJjYygnTicsICdNJywgJzYnLCAnMScpIC8qIDE2ICBZL0NyQ2IgNDoyOjIgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjEyTVQgIHY0bDJfZm91cmNjKCdUJywgJ00nLCAnMScsICcyJykgLyogMTIgIFkvQ2JDciA0OjI6MCA2NHgzMiBtYWNyb2Jsb2NrcyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYxMk1UXzE2WDE2IHY0bDJfZm91cmNjKCdWJywgJ00nLCAnMScsICcyJykgLyogMTIgIFkvQ2JDciA0OjI6MCAxNngxNiBtYWNyb2Jsb2NrcyAqLworCisvKiB0aHJlZSBwbGFuZXMgLSBZIENiLCBDciAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNDEwICB2NGwyX2ZvdXJjYygnWScsICdVJywgJ1YnLCAnOScpIC8qICA5ICBZVVYgNDoxOjAgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVlU0MTAgIHY0bDJfZm91cmNjKCdZJywgJ1YnLCAnVScsICc5JykgLyogIDkgIFlWVSA0OjE6MCAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjQxMVAgdjRsMl9mb3VyY2MoJzQnLCAnMScsICcxJywgJ1AnKSAvKiAxMiAgWVZVNDExIHBsYW5hciAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNDIwICB2NGwyX2ZvdXJjYygnWScsICdVJywgJzEnLCAnMicpIC8qIDEyICBZVVYgNDoyOjAgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVlU0MjAgIHY0bDJfZm91cmNjKCdZJywgJ1YnLCAnMScsICcyJykgLyogMTIgIFlWVSA0OjI6MCAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjQyMlAgdjRsMl9mb3VyY2MoJzQnLCAnMicsICcyJywgJ1AnKSAvKiAxNiAgWVZVNDIyIHBsYW5hciAqLworCisvKiB0aHJlZSBub24gY29udGlndW91cyBwbGFuZXMgLSBZLCBDYiwgQ3IgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjQyME0gdjRsMl9mb3VyY2MoJ1knLCAnTScsICcxJywgJzInKSAvKiAxMiAgWVVWNDIwIHBsYW5hciAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVZVNDIwTSB2NGwyX2ZvdXJjYygnWScsICdNJywgJzInLCAnMScpIC8qIDEyICBZVlU0MjAgcGxhbmFyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVY0MjJNIHY0bDJfZm91cmNjKCdZJywgJ00nLCAnMScsICc2JykgLyogMTYgIFlVVjQyMiBwbGFuYXIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lWVTQyMk0gdjRsMl9mb3VyY2MoJ1knLCAnTScsICc2JywgJzEnKSAvKiAxNiAgWVZVNDIyIHBsYW5hciAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNDQ0TSB2NGwyX2ZvdXJjYygnWScsICdNJywgJzInLCAnNCcpIC8qIDI0ICBZVVY0NDQgcGxhbmFyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVlU0NDRNIHY0bDJfZm91cmNjKCdZJywgJ00nLCAnNCcsICcyJykgLyogMjQgIFlWVTQ0NCBwbGFuYXIgKi8KKworLyogQmF5ZXIgZm9ybWF0cyAtIHNlZSBodHRwOi8vd3d3LnNpbGljb25pbWFnaW5nLmNvbS9SR0IlMjBCYXllci5odG0gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NCR0dSOCAgdjRsMl9mb3VyY2MoJ0InLCAnQScsICc4JywgJzEnKSAvKiAgOCAgQkdCRy4uIEdSR1IuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dCUkc4ICB2NGwyX2ZvdXJjYygnRycsICdCJywgJ1InLCAnRycpIC8qICA4ICBHQkdCLi4gUkdSRy4uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TR1JCRzggIHY0bDJfZm91cmNjKCdHJywgJ1InLCAnQicsICdHJykgLyogIDggIEdSR1IuLiBCR0JHLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NSR0dCOCAgdjRsMl9mb3VyY2MoJ1InLCAnRycsICdHJywgJ0InKSAvKiAgOCAgUkdSRy4uIEdCR0IuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0JHR1IxMCB2NGwyX2ZvdXJjYygnQicsICdHJywgJzEnLCAnMCcpIC8qIDEwICBCR0JHLi4gR1JHUi4uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TR0JSRzEwIHY0bDJfZm91cmNjKCdHJywgJ0InLCAnMScsICcwJykgLyogMTAgIEdCR0IuLiBSR1JHLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NHUkJHMTAgdjRsMl9mb3VyY2MoJ0InLCAnQScsICcxJywgJzAnKSAvKiAxMCAgR1JHUi4uIEJHQkcuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU1JHR0IxMCB2NGwyX2ZvdXJjYygnUicsICdHJywgJzEnLCAnMCcpIC8qIDEwICBSR1JHLi4gR0JHQi4uICovCisJLyogMTBiaXQgcmF3IGJheWVyIHBhY2tlZCwgNSBieXRlcyBmb3IgZXZlcnkgNCBwaXhlbHMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NCR0dSMTBQIHY0bDJfZm91cmNjKCdwJywgJ0InLCAnQScsICdBJykKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NHQlJHMTBQIHY0bDJfZm91cmNjKCdwJywgJ0cnLCAnQScsICdBJykKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NHUkJHMTBQIHY0bDJfZm91cmNjKCdwJywgJ2cnLCAnQScsICdBJykKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NSR0dCMTBQIHY0bDJfZm91cmNjKCdwJywgJ1InLCAnQScsICdBJykKKwkvKiAxMGJpdCByYXcgYmF5ZXIgYS1sYXcgY29tcHJlc3NlZCB0byA4IGJpdHMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NCR0dSMTBBTEFXOCB2NGwyX2ZvdXJjYygnYScsICdCJywgJ0EnLCAnOCcpCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TR0JSRzEwQUxBVzggdjRsMl9mb3VyY2MoJ2EnLCAnRycsICdBJywgJzgnKQorI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dSQkcxMEFMQVc4IHY0bDJfZm91cmNjKCdhJywgJ2cnLCAnQScsICc4JykKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NSR0dCMTBBTEFXOCB2NGwyX2ZvdXJjYygnYScsICdSJywgJ0EnLCAnOCcpCisJLyogMTBiaXQgcmF3IGJheWVyIERQQ00gY29tcHJlc3NlZCB0byA4IGJpdHMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NCR0dSMTBEUENNOCB2NGwyX2ZvdXJjYygnYicsICdCJywgJ0EnLCAnOCcpCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TR0JSRzEwRFBDTTggdjRsMl9mb3VyY2MoJ2InLCAnRycsICdBJywgJzgnKQorI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dSQkcxMERQQ004IHY0bDJfZm91cmNjKCdCJywgJ0QnLCAnMScsICcwJykKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NSR0dCMTBEUENNOCB2NGwyX2ZvdXJjYygnYicsICdSJywgJ0EnLCAnOCcpCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TQkdHUjEyIHY0bDJfZm91cmNjKCdCJywgJ0cnLCAnMScsICcyJykgLyogMTIgIEJHQkcuLiBHUkdSLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NHQlJHMTIgdjRsMl9mb3VyY2MoJ0cnLCAnQicsICcxJywgJzInKSAvKiAxMiAgR0JHQi4uIFJHUkcuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dSQkcxMiB2NGwyX2ZvdXJjYygnQicsICdBJywgJzEnLCAnMicpIC8qIDEyICBHUkdSLi4gQkdCRy4uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TUkdHQjEyIHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnMScsICcyJykgLyogMTIgIFJHUkcuLiBHQkdCLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NCR0dSMTYgdjRsMl9mb3VyY2MoJ0InLCAnWScsICdSJywgJzInKSAvKiAxNiAgQkdCRy4uIEdSR1IuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dCUkcxNiB2NGwyX2ZvdXJjYygnRycsICdCJywgJzEnLCAnNicpIC8qIDE2ICBHQkdCLi4gUkdSRy4uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TR1JCRzE2IHY0bDJfZm91cmNjKCdHJywgJ1InLCAnMScsICc2JykgLyogMTYgIEdSR1IuLiBCR0JHLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NSR0dCMTYgdjRsMl9mb3VyY2MoJ1InLCAnRycsICcxJywgJzYnKSAvKiAxNiAgUkdSRy4uIEdCR0IuLiAqLworCisvKiBIU1YgZm9ybWF0cyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfSFNWMjQgdjRsMl9mb3VyY2MoJ0gnLCAnUycsICdWJywgJzMnKQorI2RlZmluZSBWNEwyX1BJWF9GTVRfSFNWMzIgdjRsMl9mb3VyY2MoJ0gnLCAnUycsICdWJywgJzQnKQorCisvKiBjb21wcmVzc2VkIGZvcm1hdHMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX01KUEVHICAgIHY0bDJfZm91cmNjKCdNJywgJ0onLCAnUCcsICdHJykgLyogTW90aW9uLUpQRUcgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfSlBFRyAgICAgdjRsMl9mb3VyY2MoJ0onLCAnUCcsICdFJywgJ0cnKSAvKiBKRklGIEpQRUcgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9EViAgICAgICB2NGwyX2ZvdXJjYygnZCcsICd2JywgJ3MnLCAnZCcpIC8qIDEzOTQgICAgICAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX01QRUcgICAgIHY0bDJfZm91cmNjKCdNJywgJ1AnLCAnRScsICdHJykgLyogTVBFRy0xLzIvNCBNdWx0aXBsZXhlZCAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfSDI2NCAgICAgdjRsMl9mb3VyY2MoJ0gnLCAnMicsICc2JywgJzQnKSAvKiBIMjY0IHdpdGggc3RhcnQgY29kZXMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0gyNjRfTk9fU0MgdjRsMl9mb3VyY2MoJ0EnLCAnVicsICdDJywgJzEnKSAvKiBIMjY0IHdpdGhvdXQgc3RhcnQgY29kZXMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0gyNjRfTVZDIHY0bDJfZm91cmNjKCdNJywgJzInLCAnNicsICc0JykgLyogSDI2NCBNVkMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0gyNjMgICAgIHY0bDJfZm91cmNjKCdIJywgJzInLCAnNicsICczJykgLyogSDI2MyAgICAgICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTVBFRzEgICAgdjRsMl9mb3VyY2MoJ00nLCAnUCcsICdHJywgJzEnKSAvKiBNUEVHLTEgRVMgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9NUEVHMiAgICB2NGwyX2ZvdXJjYygnTScsICdQJywgJ0cnLCAnMicpIC8qIE1QRUctMiBFUyAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX01QRUc0ICAgIHY0bDJfZm91cmNjKCdNJywgJ1AnLCAnRycsICc0JykgLyogTVBFRy00IHBhcnQgMiBFUyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWFZJRCAgICAgdjRsMl9mb3VyY2MoJ1gnLCAnVicsICdJJywgJ0QnKSAvKiBYdmlkICAgICAgICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfVkMxX0FOTkVYX0cgdjRsMl9mb3VyY2MoJ1YnLCAnQycsICcxJywgJ0cnKSAvKiBTTVBURSA0MjFNIEFubmV4IEcgY29tcGxpYW50IHN0cmVhbSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfVkMxX0FOTkVYX0wgdjRsMl9mb3VyY2MoJ1YnLCAnQycsICcxJywgJ0wnKSAvKiBTTVBURSA0MjFNIEFubmV4IEwgY29tcGxpYW50IHN0cmVhbSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfVlA4ICAgICAgdjRsMl9mb3VyY2MoJ1YnLCAnUCcsICc4JywgJzAnKSAvKiBWUDggKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1ZQOSAgICAgIHY0bDJfZm91cmNjKCdWJywgJ1AnLCAnOScsICcwJykgLyogVlA5ICovCisKKy8qICBWZW5kb3Itc3BlY2lmaWMgZm9ybWF0cyAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9DUElBMSAgICB2NGwyX2ZvdXJjYygnQycsICdQJywgJ0knLCAnQScpIC8qIGNwaWExIFlVViAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfV05WQSAgICAgdjRsMl9mb3VyY2MoJ1cnLCAnTicsICdWJywgJ0EnKSAvKiBXaW5ub3YgaHcgY29tcHJlc3MgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NOOUMxMFggIHY0bDJfZm91cmNjKCdTJywgJzknLCAnMScsICcwJykgLyogU045QzEweCBjb21wcmVzc2lvbiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU045QzIwWF9JNDIwIHY0bDJfZm91cmNjKCdTJywgJzknLCAnMicsICcwJykgLyogU045QzIweCBZVVYgNDoyOjAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1BXQzEgICAgIHY0bDJfZm91cmNjKCdQJywgJ1cnLCAnQycsICcxJykgLyogcHdjIG9sZGVyIHdlYmNhbSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUFdDMiAgICAgdjRsMl9mb3VyY2MoJ1AnLCAnVycsICdDJywgJzInKSAvKiBwd2MgbmV3ZXIgd2ViY2FtICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9FVDYxWDI1MSB2NGwyX2ZvdXJjYygnRScsICc2JywgJzInLCAnNScpIC8qIEVUNjFYMjUxIGNvbXByZXNzaW9uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TUENBNTAxICB2NGwyX2ZvdXJjYygnUycsICc1JywgJzAnLCAnMScpIC8qIFlVWVYgcGVyIGxpbmUgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NQQ0E1MDUgIHY0bDJfZm91cmNjKCdTJywgJzUnLCAnMCcsICc1JykgLyogWVlVViBwZXIgbGluZSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU1BDQTUwOCAgdjRsMl9mb3VyY2MoJ1MnLCAnNScsICcwJywgJzgnKSAvKiBZVVZZIHBlciBsaW5lICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TUENBNTYxICB2NGwyX2ZvdXJjYygnUycsICc1JywgJzYnLCAnMScpIC8qIGNvbXByZXNzZWQgR0JSRyBiYXllciAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUEFDMjA3ICAgdjRsMl9mb3VyY2MoJ1AnLCAnMicsICcwJywgJzcnKSAvKiBjb21wcmVzc2VkIEJHR1IgYmF5ZXIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX01SOTczMTBBIHY0bDJfZm91cmNjKCdNJywgJzMnLCAnMScsICcwJykgLyogY29tcHJlc3NlZCBCR0dSIGJheWVyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9KTDIwMDVCQ0QgdjRsMl9mb3VyY2MoJ0onLCAnTCcsICcyJywgJzAnKSAvKiBjb21wcmVzc2VkIFJHR0IgYmF5ZXIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NOOUMyMDI4IHY0bDJfZm91cmNjKCdTJywgJ08nLCAnTicsICdYJykgLyogY29tcHJlc3NlZCBHQlJHIGJheWVyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TUTkwNUMgICB2NGwyX2ZvdXJjYygnOScsICcwJywgJzUnLCAnQycpIC8qIGNvbXByZXNzZWQgUkdHQiBiYXllciAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUEpQRyAgICAgdjRsMl9mb3VyY2MoJ1AnLCAnSicsICdQJywgJ0cnKSAvKiBQaXhhcnQgNzN4eCBKUEVHICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9PVjUxMSAgICB2NGwyX2ZvdXJjYygnTycsICc1JywgJzEnLCAnMScpIC8qIG92NTExIEpQRUcgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX09WNTE4ICAgIHY0bDJfZm91cmNjKCdPJywgJzUnLCAnMScsICc4JykgLyogb3Y1MTggSlBFRyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU1RWMDY4MCAgdjRsMl9mb3VyY2MoJ1MnLCAnNicsICc4JywgJzAnKSAvKiBzdHYwNjgwIGJheWVyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9UTTYwMDAgICB2NGwyX2ZvdXJjYygnVCcsICdNJywgJzYnLCAnMCcpIC8qIHRtNTYwMC90bTYweDAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0NJVF9ZWVZZVVkgdjRsMl9mb3VyY2MoJ0MnLCAnSScsICdUJywgJ1YnKSAvKiBvbmUgbGluZSBvZiBZIHRoZW4gMSBsaW5lIG9mIFZZVVkgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0tPTklDQTQyMCAgdjRsMl9mb3VyY2MoJ0snLCAnTycsICdOJywgJ0knKSAvKiBZVVY0MjAgcGxhbmFyIGluIGJsb2NrcyBvZiAyNTYgcGl4ZWxzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9KUEdMCXY0bDJfZm91cmNjKCdKJywgJ1AnLCAnRycsICdMJykgLyogSlBFRy1MaXRlICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TRTQwMSAgICAgIHY0bDJfZm91cmNjKCdTJywgJzQnLCAnMCcsICcxJykgLyogc2U0MDEgamFuZ2d1IGNvbXByZXNzZWQgcmdiICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TNUNfVVlWWV9KUEcgdjRsMl9mb3VyY2MoJ1MnLCAnNScsICdDJywgJ0knKSAvKiBTNUM3M00zIGludGVybGVhdmVkIFVZVlkvSlBFRyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWThJICAgICAgdjRsMl9mb3VyY2MoJ1knLCAnOCcsICdJJywgJyAnKSAvKiBHcmV5c2NhbGUgOC1iaXQgTC9SIGludGVybGVhdmVkICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZMTJJICAgICB2NGwyX2ZvdXJjYygnWScsICcxJywgJzInLCAnSScpIC8qIEdyZXlzY2FsZSAxMi1iaXQgTC9SIGludGVybGVhdmVkICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9aMTYgICAgICB2NGwyX2ZvdXJjYygnWicsICcxJywgJzYnLCAnICcpIC8qIERlcHRoIGRhdGEgMTYtYml0ICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9NVDIxQyAgICB2NGwyX2ZvdXJjYygnTScsICdUJywgJzInLCAnMScpIC8qIE1lZGlhdGVrIGNvbXByZXNzZWQgYmxvY2sgbW9kZSAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0lOWkkgICAgIHY0bDJfZm91cmNjKCdJJywgJ04nLCAnWicsICdJJykgLyogSW50ZWwgUGxhbmFyIEdyZXlzY2FsZSAxMC1iaXQgYW5kIERlcHRoIDE2LWJpdCAqLworCisvKiBTRFIgZm9ybWF0cyAtIHVzZWQgb25seSBmb3IgU29mdHdhcmUgRGVmaW5lZCBSYWRpbyBkZXZpY2VzICovCisjZGVmaW5lIFY0TDJfU0RSX0ZNVF9DVTggICAgICAgICAgdjRsMl9mb3VyY2MoJ0MnLCAnVScsICcwJywgJzgnKSAvKiBJUSB1OCAqLworI2RlZmluZSBWNEwyX1NEUl9GTVRfQ1UxNkxFICAgICAgIHY0bDJfZm91cmNjKCdDJywgJ1UnLCAnMScsICc2JykgLyogSVEgdTE2bGUgKi8KKyNkZWZpbmUgVjRMMl9TRFJfRk1UX0NTOCAgICAgICAgICB2NGwyX2ZvdXJjYygnQycsICdTJywgJzAnLCAnOCcpIC8qIGNvbXBsZXggczggKi8KKyNkZWZpbmUgVjRMMl9TRFJfRk1UX0NTMTRMRSAgICAgICB2NGwyX2ZvdXJjYygnQycsICdTJywgJzEnLCAnNCcpIC8qIGNvbXBsZXggczE0bGUgKi8KKyNkZWZpbmUgVjRMMl9TRFJfRk1UX1JVMTJMRSAgICAgICB2NGwyX2ZvdXJjYygnUicsICdVJywgJzEnLCAnMicpIC8qIHJlYWwgdTEybGUgKi8KKyNkZWZpbmUgVjRMMl9TRFJfRk1UX1BDVTE2QkUJICB2NGwyX2ZvdXJjYygnUCcsICdDJywgJzEnLCAnNicpIC8qIHBsYW5hciBjb21wbGV4IHUxNmJlICovCisjZGVmaW5lIFY0TDJfU0RSX0ZNVF9QQ1UxOEJFCSAgdjRsMl9mb3VyY2MoJ1AnLCAnQycsICcxJywgJzgnKSAvKiBwbGFuYXIgY29tcGxleCB1MThiZSAqLworI2RlZmluZSBWNEwyX1NEUl9GTVRfUENVMjBCRQkgIHY0bDJfZm91cmNjKCdQJywgJ0MnLCAnMicsICcwJykgLyogcGxhbmFyIGNvbXBsZXggdTIwYmUgKi8KKworLyogVG91Y2ggZm9ybWF0cyAtIHVzZWQgZm9yIFRvdWNoIGRldmljZXMgKi8KKyNkZWZpbmUgVjRMMl9UQ0hfRk1UX0RFTFRBX1REMTYJdjRsMl9mb3VyY2MoJ1QnLCAnRCcsICcxJywgJzYnKSAvKiAxNi1iaXQgc2lnbmVkIGRlbHRhcyAqLworI2RlZmluZSBWNEwyX1RDSF9GTVRfREVMVEFfVEQwOAl2NGwyX2ZvdXJjYygnVCcsICdEJywgJzAnLCAnOCcpIC8qIDgtYml0IHNpZ25lZCBkZWx0YXMgKi8KKyNkZWZpbmUgVjRMMl9UQ0hfRk1UX1RVMTYJdjRsMl9mb3VyY2MoJ1QnLCAnVScsICcxJywgJzYnKSAvKiAxNi1iaXQgdW5zaWduZWQgdG91Y2ggZGF0YSAqLworI2RlZmluZSBWNEwyX1RDSF9GTVRfVFUwOAl2NGwyX2ZvdXJjYygnVCcsICdVJywgJzAnLCAnOCcpIC8qIDgtYml0IHVuc2lnbmVkIHRvdWNoIGRhdGEgKi8KKworLyogTWV0YS1kYXRhIGZvcm1hdHMgKi8KKyNkZWZpbmUgVjRMMl9NRVRBX0ZNVF9WU1AxX0hHTyAgICB2NGwyX2ZvdXJjYygnVicsICdTJywgJ1AnLCAnSCcpIC8qIFItQ2FyIFZTUDEgMS1EIEhpc3RvZ3JhbSAqLworI2RlZmluZSBWNEwyX01FVEFfRk1UX1ZTUDFfSEdUICAgIHY0bDJfZm91cmNjKCdWJywgJ1MnLCAnUCcsICdUJykgLyogUi1DYXIgVlNQMSAyLUQgSGlzdG9ncmFtICovCisKKy8qIHByaXYgZmllbGQgdmFsdWUgdG8gaW5kaWNhdGVzIHRoYXQgc3Vic2VxdWVudCBmaWVsZHMgYXJlIHZhbGlkLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUFJJVl9NQUdJQwkJMHhmZWVkY2FmZQorCisvKiBGbGFncyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfRkxBR19QUkVNVUxfQUxQSEEJMHgwMDAwMDAwMQorCisvKgorICoJRiBPIFIgTSBBIFQgICBFIE4gVSBNIEUgUiBBIFQgSSBPIE4KKyAqLworc3RydWN0IHY0bDJfZm10ZGVzYyB7CisJX191MzIJCSAgICBpbmRleDsgICAgICAgICAgICAgLyogRm9ybWF0IG51bWJlciAgICAgICovCisJX191MzIJCSAgICB0eXBlOyAgICAgICAgICAgICAgLyogZW51bSB2NGwyX2J1Zl90eXBlICovCisJX191MzIgICAgICAgICAgICAgICBmbGFnczsKKwlfX3U4CQkgICAgZGVzY3JpcHRpb25bMzJdOyAgIC8qIERlc2NyaXB0aW9uIHN0cmluZyAqLworCV9fdTMyCQkgICAgcGl4ZWxmb3JtYXQ7ICAgICAgIC8qIEZvcm1hdCBmb3VyY2MgICAgICAqLworCV9fdTMyCQkgICAgcmVzZXJ2ZWRbNF07Cit9OworCisjZGVmaW5lIFY0TDJfRk1UX0ZMQUdfQ09NUFJFU1NFRCAweDAwMDEKKyNkZWZpbmUgVjRMMl9GTVRfRkxBR19FTVVMQVRFRCAgIDB4MDAwMgorCisJLyogRnJhbWUgU2l6ZSBhbmQgZnJhbWUgcmF0ZSBlbnVtZXJhdGlvbiAqLworLyoKKyAqCUYgUiBBIE0gRSAgIFMgSSBaIEUgICBFIE4gVSBNIEUgUiBBIFQgSSBPIE4KKyAqLworZW51bSB2NGwyX2ZybXNpemV0eXBlcyB7CisJVjRMMl9GUk1TSVpFX1RZUEVfRElTQ1JFVEUJPSAxLAorCVY0TDJfRlJNU0laRV9UWVBFX0NPTlRJTlVPVVMJPSAyLAorCVY0TDJfRlJNU0laRV9UWVBFX1NURVBXSVNFCT0gMywKK307CisKK3N0cnVjdCB2NGwyX2ZybXNpemVfZGlzY3JldGUgeworCV9fdTMyCQkJd2lkdGg7CQkvKiBGcmFtZSB3aWR0aCBbcGl4ZWxdICovCisJX191MzIJCQloZWlnaHQ7CQkvKiBGcmFtZSBoZWlnaHQgW3BpeGVsXSAqLworfTsKKworc3RydWN0IHY0bDJfZnJtc2l6ZV9zdGVwd2lzZSB7CisJX191MzIJCQltaW5fd2lkdGg7CS8qIE1pbmltdW0gZnJhbWUgd2lkdGggW3BpeGVsXSAqLworCV9fdTMyCQkJbWF4X3dpZHRoOwkvKiBNYXhpbXVtIGZyYW1lIHdpZHRoIFtwaXhlbF0gKi8KKwlfX3UzMgkJCXN0ZXBfd2lkdGg7CS8qIEZyYW1lIHdpZHRoIHN0ZXAgc2l6ZSBbcGl4ZWxdICovCisJX191MzIJCQltaW5faGVpZ2h0OwkvKiBNaW5pbXVtIGZyYW1lIGhlaWdodCBbcGl4ZWxdICovCisJX191MzIJCQltYXhfaGVpZ2h0OwkvKiBNYXhpbXVtIGZyYW1lIGhlaWdodCBbcGl4ZWxdICovCisJX191MzIJCQlzdGVwX2hlaWdodDsJLyogRnJhbWUgaGVpZ2h0IHN0ZXAgc2l6ZSBbcGl4ZWxdICovCit9OworCitzdHJ1Y3QgdjRsMl9mcm1zaXplZW51bSB7CisJX191MzIJCQlpbmRleDsJCS8qIEZyYW1lIHNpemUgbnVtYmVyICovCisJX191MzIJCQlwaXhlbF9mb3JtYXQ7CS8qIFBpeGVsIGZvcm1hdCAqLworCV9fdTMyCQkJdHlwZTsJCS8qIEZyYW1lIHNpemUgdHlwZSB0aGUgZGV2aWNlIHN1cHBvcnRzLiAqLworCisJdW5pb24gewkJCQkJLyogRnJhbWUgc2l6ZSAqLworCQlzdHJ1Y3QgdjRsMl9mcm1zaXplX2Rpc2NyZXRlCWRpc2NyZXRlOworCQlzdHJ1Y3QgdjRsMl9mcm1zaXplX3N0ZXB3aXNlCXN0ZXB3aXNlOworCX07CisKKwlfX3UzMiAgIHJlc2VydmVkWzJdOwkJCS8qIFJlc2VydmVkIHNwYWNlIGZvciBmdXR1cmUgdXNlICovCit9OworCisvKgorICoJRiBSIEEgTSBFICAgUiBBIFQgRSAgIEUgTiBVIE0gRSBSIEEgVCBJIE8gTgorICovCitlbnVtIHY0bDJfZnJtaXZhbHR5cGVzIHsKKwlWNEwyX0ZSTUlWQUxfVFlQRV9ESVNDUkVURQk9IDEsCisJVjRMMl9GUk1JVkFMX1RZUEVfQ09OVElOVU9VUwk9IDIsCisJVjRMMl9GUk1JVkFMX1RZUEVfU1RFUFdJU0UJPSAzLAorfTsKKworc3RydWN0IHY0bDJfZnJtaXZhbF9zdGVwd2lzZSB7CisJc3RydWN0IHY0bDJfZnJhY3QJbWluOwkJLyogTWluaW11bSBmcmFtZSBpbnRlcnZhbCBbc10gKi8KKwlzdHJ1Y3QgdjRsMl9mcmFjdAltYXg7CQkvKiBNYXhpbXVtIGZyYW1lIGludGVydmFsIFtzXSAqLworCXN0cnVjdCB2NGwyX2ZyYWN0CXN0ZXA7CQkvKiBGcmFtZSBpbnRlcnZhbCBzdGVwIHNpemUgW3NdICovCit9OworCitzdHJ1Y3QgdjRsMl9mcm1pdmFsZW51bSB7CisJX191MzIJCQlpbmRleDsJCS8qIEZyYW1lIGZvcm1hdCBpbmRleCAqLworCV9fdTMyCQkJcGl4ZWxfZm9ybWF0OwkvKiBQaXhlbCBmb3JtYXQgKi8KKwlfX3UzMgkJCXdpZHRoOwkJLyogRnJhbWUgd2lkdGggKi8KKwlfX3UzMgkJCWhlaWdodDsJCS8qIEZyYW1lIGhlaWdodCAqLworCV9fdTMyCQkJdHlwZTsJCS8qIEZyYW1lIGludGVydmFsIHR5cGUgdGhlIGRldmljZSBzdXBwb3J0cy4gKi8KKworCXVuaW9uIHsJCQkJCS8qIEZyYW1lIGludGVydmFsICovCisJCXN0cnVjdCB2NGwyX2ZyYWN0CQlkaXNjcmV0ZTsKKwkJc3RydWN0IHY0bDJfZnJtaXZhbF9zdGVwd2lzZQlzdGVwd2lzZTsKKwl9OworCisJX191MzIJcmVzZXJ2ZWRbMl07CQkJLyogUmVzZXJ2ZWQgc3BhY2UgZm9yIGZ1dHVyZSB1c2UgKi8KK307CisKKy8qCisgKglUIEkgTSBFIEMgTyBEIEUKKyAqLworc3RydWN0IHY0bDJfdGltZWNvZGUgeworCV9fdTMyCXR5cGU7CisJX191MzIJZmxhZ3M7CisJX191OAlmcmFtZXM7CisJX191OAlzZWNvbmRzOworCV9fdTgJbWludXRlczsKKwlfX3U4CWhvdXJzOworCV9fdTgJdXNlcmJpdHNbNF07Cit9OworCisvKiAgVHlwZSAgKi8KKyNkZWZpbmUgVjRMMl9UQ19UWVBFXzI0RlBTCQkxCisjZGVmaW5lIFY0TDJfVENfVFlQRV8yNUZQUwkJMgorI2RlZmluZSBWNEwyX1RDX1RZUEVfMzBGUFMJCTMKKyNkZWZpbmUgVjRMMl9UQ19UWVBFXzUwRlBTCQk0CisjZGVmaW5lIFY0TDJfVENfVFlQRV82MEZQUwkJNQorCisvKiAgRmxhZ3MgICovCisjZGVmaW5lIFY0TDJfVENfRkxBR19EUk9QRlJBTUUJCTB4MDAwMSAvKiAiZHJvcC1mcmFtZSIgbW9kZSAqLworI2RlZmluZSBWNEwyX1RDX0ZMQUdfQ09MT1JGUkFNRQkJMHgwMDAyCisjZGVmaW5lIFY0TDJfVENfVVNFUkJJVFNfZmllbGQJCTB4MDAwQworI2RlZmluZSBWNEwyX1RDX1VTRVJCSVRTX1VTRVJERUZJTkVECTB4MDAwMAorI2RlZmluZSBWNEwyX1RDX1VTRVJCSVRTXzhCSVRDSEFSUwkweDAwMDgKKy8qIFRoZSBhYm92ZSBpcyBiYXNlZCBvbiBTTVBURSB0aW1lY29kZXMgKi8KKworc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uIHsKKwlpbnQgcXVhbGl0eTsKKworCWludCAgQVBQbjsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBBUFAgc2VnbWVudCB0byBiZSB3cml0dGVuLAorCQkJCSAqIG11c3QgYmUgMC4uMTUgKi8KKwlpbnQgIEFQUF9sZW47ICAgICAgICAgICAvKiBMZW5ndGggb2YgZGF0YSBpbiBKUEVHIEFQUG4gc2VnbWVudCAqLworCWNoYXIgQVBQX2RhdGFbNjBdOyAgICAgIC8qIERhdGEgaW4gdGhlIEpQRUcgQVBQbiBzZWdtZW50LiAqLworCisJaW50ICBDT01fbGVuOyAgICAgICAgICAgLyogTGVuZ3RoIG9mIGRhdGEgaW4gSlBFRyBDT00gc2VnbWVudCAqLworCWNoYXIgQ09NX2RhdGFbNjBdOyAgICAgIC8qIERhdGEgaW4gSlBFRyBDT00gc2VnbWVudCAqLworCisJX191MzIganBlZ19tYXJrZXJzOyAgICAgLyogV2hpY2ggbWFya2VycyBzaG91bGQgZ28gaW50byB0aGUgSlBFRworCQkJCSAqIG91dHB1dC4gVW5sZXNzIHlvdSBleGFjdGx5IGtub3cgd2hhdAorCQkJCSAqIHlvdSBkbywgbGVhdmUgdGhlbSB1bnRvdWNoZWQuCisJCQkJICogSW5jbHVkaW5nIGxlc3MgbWFya2VycyB3aWxsIG1ha2UgdGhlCisJCQkJICogcmVzdWx0aW5nIGNvZGUgc21hbGxlciwgYnV0IHRoZXJlIHdpbGwKKwkJCQkgKiBiZSBmZXdlciBhcHBsaWNhdGlvbnMgd2hpY2ggY2FuIHJlYWQgaXQuCisJCQkJICogVGhlIHByZXNlbmNlIG9mIHRoZSBBUFAgYW5kIENPTSBtYXJrZXIKKwkJCQkgKiBpcyBpbmZsdWVuY2VkIGJ5IEFQUF9sZW4gYW5kIENPTV9sZW4KKwkJCQkgKiBPTkxZLCBub3QgYnkgdGhpcyBwcm9wZXJ0eSEgKi8KKworI2RlZmluZSBWNEwyX0pQRUdfTUFSS0VSX0RIVCAoMTw8MykgICAgLyogRGVmaW5lIEh1ZmZtYW4gVGFibGVzICovCisjZGVmaW5lIFY0TDJfSlBFR19NQVJLRVJfRFFUICgxPDw0KSAgICAvKiBEZWZpbmUgUXVhbnRpemF0aW9uIFRhYmxlcyAqLworI2RlZmluZSBWNEwyX0pQRUdfTUFSS0VSX0RSSSAoMTw8NSkgICAgLyogRGVmaW5lIFJlc3RhcnQgSW50ZXJ2YWwgKi8KKyNkZWZpbmUgVjRMMl9KUEVHX01BUktFUl9DT00gKDE8PDYpICAgIC8qIENvbW1lbnQgc2VnbWVudCAqLworI2RlZmluZSBWNEwyX0pQRUdfTUFSS0VSX0FQUCAoMTw8NykgICAgLyogQXBwIHNlZ21lbnQsIGRyaXZlciB3aWxsCisJCQkJCSogYWx3YXlzIHVzZSBBUFAwICovCit9OworCisvKgorICoJTSBFIE0gTyBSIFkgLSBNIEEgUCBQIEkgTiBHICAgQiBVIEYgRiBFIFIgUworICovCitzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyB7CisJX191MzIJCQljb3VudDsKKwlfX3UzMgkJCXR5cGU7CQkvKiBlbnVtIHY0bDJfYnVmX3R5cGUgKi8KKwlfX3UzMgkJCW1lbW9yeTsJCS8qIGVudW0gdjRsMl9tZW1vcnkgKi8KKwlfX3UzMgkJCXJlc2VydmVkWzJdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdjRsMl9wbGFuZSAtIHBsYW5lIGluZm8gZm9yIG11bHRpLXBsYW5hciBidWZmZXJzCisgKiBAYnl0ZXN1c2VkOgkJbnVtYmVyIG9mIGJ5dGVzIG9jY3VwaWVkIGJ5IGRhdGEgaW4gdGhlIHBsYW5lIChwYXlsb2FkKQorICogQGxlbmd0aDoJCXNpemUgb2YgdGhpcyBwbGFuZSAoTk9UIHRoZSBwYXlsb2FkKSBpbiBieXRlcworICogQG1lbV9vZmZzZXQ6CQl3aGVuIG1lbW9yeSBpbiB0aGUgYXNzb2NpYXRlZCBzdHJ1Y3QgdjRsMl9idWZmZXIgaXMKKyAqCQkJVjRMMl9NRU1PUllfTU1BUCwgZXF1YWxzIHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YKKyAqCQkJdGhlIGRldmljZSBtZW1vcnkgZm9yIHRoaXMgcGxhbmUgKG9yIGlzIGEgImNvb2tpZSIgdGhhdAorICoJCQlzaG91bGQgYmUgcGFzc2VkIHRvIG1tYXAoKSBjYWxsZWQgb24gdGhlIHZpZGVvIG5vZGUpCisgKiBAdXNlcnB0cjoJCXdoZW4gbWVtb3J5IGlzIFY0TDJfTUVNT1JZX1VTRVJQVFIsIGEgdXNlcnNwYWNlIHBvaW50ZXIKKyAqCQkJcG9pbnRpbmcgdG8gdGhpcyBwbGFuZQorICogQGZkOgkJCXdoZW4gbWVtb3J5IGlzIFY0TDJfTUVNT1JZX0RNQUJVRiwgYSB1c2Vyc3BhY2UgZmlsZQorICoJCQlkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBsYW5lCisgKiBAZGF0YV9vZmZzZXQ6CW9mZnNldCBpbiB0aGUgcGxhbmUgdG8gdGhlIHN0YXJ0IG9mIGRhdGE7IHVzdWFsbHkgMCwKKyAqCQkJdW5sZXNzIHRoZXJlIGlzIGEgaGVhZGVyIGluIGZyb250IG9mIHRoZSBkYXRhCisgKgorICogTXVsdGktcGxhbmFyIGJ1ZmZlcnMgY29uc2lzdCBvZiBvbmUgb3IgbW9yZSBwbGFuZXMsIGUuZy4gYW4gWUNiQ3IgYnVmZmVyCisgKiB3aXRoIHR3byBwbGFuZXMgY2FuIGhhdmUgb25lIHBsYW5lIGZvciBZLCBhbmQgYW5vdGhlciBmb3IgaW50ZXJsZWF2ZWQgQ2JDcgorICogY29tcG9uZW50cy4gRWFjaCBwbGFuZSBjYW4gcmVzaWRlIGluIGEgc2VwYXJhdGUgbWVtb3J5IGJ1ZmZlciwgb3IgZXZlbiBpbgorICogYSBjb21wbGV0ZWx5IHNlcGFyYXRlIG1lbW9yeSBub2RlIChlLmcuIGluIGVtYmVkZGVkIGRldmljZXMpLgorICovCitzdHJ1Y3QgdjRsMl9wbGFuZSB7CisJX191MzIJCQlieXRlc3VzZWQ7CisJX191MzIJCQlsZW5ndGg7CisJdW5pb24geworCQlfX3UzMgkJbWVtX29mZnNldDsKKwkJdW5zaWduZWQgbG9uZwl1c2VycHRyOworCQlfX3MzMgkJZmQ7CisJfSBtOworCV9fdTMyCQkJZGF0YV9vZmZzZXQ7CisJX191MzIJCQlyZXNlcnZlZFsxMV07Cit9OworCisvKioKKyAqIHN0cnVjdCB2NGwyX2J1ZmZlciAtIHZpZGVvIGJ1ZmZlciBpbmZvCisgKiBAaW5kZXg6CWlkIG51bWJlciBvZiB0aGUgYnVmZmVyCisgKiBAdHlwZToJZW51bSB2NGwyX2J1Zl90eXBlOyBidWZmZXIgdHlwZSAodHlwZSA9PSAqX01QTEFORSBmb3IKKyAqCQltdWx0aXBsYW5hciBidWZmZXJzKTsKKyAqIEBieXRlc3VzZWQ6CW51bWJlciBvZiBieXRlcyBvY2N1cGllZCBieSBkYXRhIGluIHRoZSBidWZmZXIgKHBheWxvYWQpOworICoJCXVudXNlZCAoc2V0IHRvIDApIGZvciBtdWx0aXBsYW5hciBidWZmZXJzCisgKiBAZmxhZ3M6CWJ1ZmZlciBpbmZvcm1hdGlvbmFsIGZsYWdzCisgKiBAZmllbGQ6CWVudW0gdjRsMl9maWVsZDsgZmllbGQgb3JkZXIgb2YgdGhlIGltYWdlIGluIHRoZSBidWZmZXIKKyAqIEB0aW1lc3RhbXA6CWZyYW1lIHRpbWVzdGFtcAorICogQHRpbWVjb2RlOglmcmFtZSB0aW1lY29kZQorICogQHNlcXVlbmNlOglzZXF1ZW5jZSBjb3VudCBvZiB0aGlzIGZyYW1lCisgKiBAbWVtb3J5OgllbnVtIHY0bDJfbWVtb3J5OyB0aGUgbWV0aG9kLCBpbiB3aGljaCB0aGUgYWN0dWFsIHZpZGVvIGRhdGEgaXMKKyAqCQlwYXNzZWQKKyAqIEBvZmZzZXQ6CWZvciBub24tbXVsdGlwbGFuYXIgYnVmZmVycyB3aXRoIG1lbW9yeSA9PSBWNEwyX01FTU9SWV9NTUFQOworICoJCW9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZGV2aWNlIG1lbW9yeSBmb3IgdGhpcyBwbGFuZSwKKyAqCQkob3IgYSAiY29va2llIiB0aGF0IHNob3VsZCBiZSBwYXNzZWQgdG8gbW1hcCgpIGFzIG9mZnNldCkKKyAqIEB1c2VycHRyOglmb3Igbm9uLW11bHRpcGxhbmFyIGJ1ZmZlcnMgd2l0aCBtZW1vcnkgPT0gVjRMMl9NRU1PUllfVVNFUlBUUjsKKyAqCQlhIHVzZXJzcGFjZSBwb2ludGVyIHBvaW50aW5nIHRvIHRoaXMgYnVmZmVyCisgKiBAZmQ6CQlmb3Igbm9uLW11bHRpcGxhbmFyIGJ1ZmZlcnMgd2l0aCBtZW1vcnkgPT0gVjRMMl9NRU1PUllfRE1BQlVGOworICoJCWEgdXNlcnNwYWNlIGZpbGUgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWZmZXIKKyAqIEBwbGFuZXM6CWZvciBtdWx0aXBsYW5hciBidWZmZXJzOyB1c2Vyc3BhY2UgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgcGxhbmUKKyAqCQlpbmZvIHN0cnVjdHMgZm9yIHRoaXMgYnVmZmVyCisgKiBAbGVuZ3RoOglzaXplIGluIGJ5dGVzIG9mIHRoZSBidWZmZXIgKE5PVCBpdHMgcGF5bG9hZCkgZm9yIHNpbmdsZS1wbGFuZQorICoJCWJ1ZmZlcnMgKHdoZW4gdHlwZSAhPSAqX01QTEFORSk7IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUKKyAqCQlwbGFuZXMgYXJyYXkgZm9yIG11bHRpLXBsYW5lIGJ1ZmZlcnMKKyAqCisgKiBDb250YWlucyBkYXRhIGV4Y2hhbmdlZCBieSBhcHBsaWNhdGlvbiBhbmQgZHJpdmVyIHVzaW5nIG9uZSBvZiB0aGUgU3RyZWFtaW5nCisgKiBJL08gbWV0aG9kcy4KKyAqLworc3RydWN0IHY0bDJfYnVmZmVyIHsKKwlfX3UzMgkJCWluZGV4OworCV9fdTMyCQkJdHlwZTsKKwlfX3UzMgkJCWJ5dGVzdXNlZDsKKwlfX3UzMgkJCWZsYWdzOworCV9fdTMyCQkJZmllbGQ7CisJc3RydWN0IHRpbWV2YWwJCXRpbWVzdGFtcDsKKwlzdHJ1Y3QgdjRsMl90aW1lY29kZQl0aW1lY29kZTsKKwlfX3UzMgkJCXNlcXVlbmNlOworCisJLyogbWVtb3J5IGxvY2F0aW9uICovCisJX191MzIJCQltZW1vcnk7CisJdW5pb24geworCQlfX3UzMiAgICAgICAgICAgb2Zmc2V0OworCQl1bnNpZ25lZCBsb25nICAgdXNlcnB0cjsKKwkJc3RydWN0IHY0bDJfcGxhbmUgKnBsYW5lczsKKwkJX19zMzIJCWZkOworCX0gbTsKKwlfX3UzMgkJCWxlbmd0aDsKKwlfX3UzMgkJCXJlc2VydmVkMjsKKwlfX3UzMgkJCXJlc2VydmVkOworfTsKKworLyogIEZsYWdzIGZvciAnZmxhZ3MnIGZpZWxkICovCisvKiBCdWZmZXIgaXMgbWFwcGVkIChmbGFnKSAqLworI2RlZmluZSBWNEwyX0JVRl9GTEFHX01BUFBFRAkJCTB4MDAwMDAwMDEKKy8qIEJ1ZmZlciBpcyBxdWV1ZWQgZm9yIHByb2Nlc3NpbmcgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19RVUVVRUQJCQkweDAwMDAwMDAyCisvKiBCdWZmZXIgaXMgcmVhZHkgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19ET05FCQkJMHgwMDAwMDAwNAorLyogSW1hZ2UgaXMgYSBrZXlmcmFtZSAoSS1mcmFtZSkgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19LRVlGUkFNRQkJCTB4MDAwMDAwMDgKKy8qIEltYWdlIGlzIGEgUC1mcmFtZSAqLworI2RlZmluZSBWNEwyX0JVRl9GTEFHX1BGUkFNRQkJCTB4MDAwMDAwMTAKKy8qIEltYWdlIGlzIGEgQi1mcmFtZSAqLworI2RlZmluZSBWNEwyX0JVRl9GTEFHX0JGUkFNRQkJCTB4MDAwMDAwMjAKKy8qIEJ1ZmZlciBpcyByZWFkeSwgYnV0IHRoZSBkYXRhIGNvbnRhaW5lZCB3aXRoaW4gaXMgY29ycnVwdGVkLiAqLworI2RlZmluZSBWNEwyX0JVRl9GTEFHX0VSUk9SCQkJMHgwMDAwMDA0MAorLyogdGltZWNvZGUgZmllbGQgaXMgdmFsaWQgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19USU1FQ09ERQkJCTB4MDAwMDAxMDAKKy8qIEJ1ZmZlciBpcyBwcmVwYXJlZCBmb3IgcXVldWluZyAqLworI2RlZmluZSBWNEwyX0JVRl9GTEFHX1BSRVBBUkVECQkJMHgwMDAwMDQwMAorLyogQ2FjaGUgaGFuZGxpbmcgZmxhZ3MgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19OT19DQUNIRV9JTlZBTElEQVRFCTB4MDAwMDA4MDAKKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19OT19DQUNIRV9DTEVBTgkJMHgwMDAwMTAwMAorLyogVGltZXN0YW1wIHR5cGUgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19USU1FU1RBTVBfTUFTSwkJMHgwMDAwZTAwMAorI2RlZmluZSBWNEwyX0JVRl9GTEFHX1RJTUVTVEFNUF9VTktOT1dOCQkweDAwMDAwMDAwCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfVElNRVNUQU1QX01PTk9UT05JQwkweDAwMDAyMDAwCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfVElNRVNUQU1QX0NPUFkJCTB4MDAwMDQwMDAKKy8qIFRpbWVzdGFtcCBzb3VyY2VzLiAqLworI2RlZmluZSBWNEwyX0JVRl9GTEFHX1RTVEFNUF9TUkNfTUFTSwkJMHgwMDA3MDAwMAorI2RlZmluZSBWNEwyX0JVRl9GTEFHX1RTVEFNUF9TUkNfRU9GCQkweDAwMDAwMDAwCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfVFNUQU1QX1NSQ19TT0UJCTB4MDAwMTAwMDAKKy8qIG1lbTJtZW0gZW5jb2Rlci9kZWNvZGVyICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfTEFTVAkJCTB4MDAxMDAwMDAKKworLyoqCisgKiBzdHJ1Y3QgdjRsMl9leHBvcnRidWZmZXIgLSBleHBvcnQgb2YgdmlkZW8gYnVmZmVyIGFzIERNQUJVRiBmaWxlIGRlc2NyaXB0b3IKKyAqCisgKiBAaW5kZXg6CWlkIG51bWJlciBvZiB0aGUgYnVmZmVyCisgKiBAdHlwZToJZW51bSB2NGwyX2J1Zl90eXBlOyBidWZmZXIgdHlwZSAodHlwZSA9PSAqX01QTEFORSBmb3IKKyAqCQltdWx0aXBsYW5hciBidWZmZXJzKTsKKyAqIEBwbGFuZToJaW5kZXggb2YgdGhlIHBsYW5lIHRvIGJlIGV4cG9ydGVkLCAwIGZvciBzaW5nbGUgcGxhbmUgcXVldWVzCisgKiBAZmxhZ3M6CWZsYWdzIGZvciBuZXdseSBjcmVhdGVkIGZpbGUsIGN1cnJlbnRseSBvbmx5IE9fQ0xPRVhFQyBpcworICoJCXN1cHBvcnRlZCwgcmVmZXIgdG8gbWFudWFsIG9mIG9wZW4gc3lzY2FsbCBmb3IgbW9yZSBkZXRhaWxzCisgKiBAZmQ6CQlmaWxlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIERNQUJVRiAoc2V0IGJ5IGRyaXZlcikKKyAqCisgKiBDb250YWlucyBkYXRhIHVzZWQgZm9yIGV4cG9ydGluZyBhIHZpZGVvIGJ1ZmZlciBhcyBETUFCVUYgZmlsZSBkZXNjcmlwdG9yLgorICogVGhlIGJ1ZmZlciBpcyBpZGVudGlmaWVkIGJ5IGEgJ2Nvb2tpZScgcmV0dXJuZWQgYnkgVklESU9DX1FVRVJZQlVGCisgKiAoaWRlbnRpY2FsIHRvIHRoZSBjb29raWUgdXNlZCB0byBtbWFwKCkgdGhlIGJ1ZmZlciB0byB1c2Vyc3BhY2UpLiBBbGwKKyAqIHJlc2VydmVkIGZpZWxkcyBtdXN0IGJlIHNldCB0byB6ZXJvLiBUaGUgZmllbGQgcmVzZXJ2ZWQwIGlzIGV4cGVjdGVkIHRvCisgKiBiZWNvbWUgYSBzdHJ1Y3R1cmUgJ3R5cGUnIGFsbG93aW5nIGFuIGFsdGVybmF0aXZlIGxheW91dCBvZiB0aGUgc3RydWN0dXJlCisgKiBjb250ZW50LiBUaGVyZWZvcmUgdGhpcyBmaWVsZCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGFueSBvdGhlciBleHRlbnNpb25zLgorICovCitzdHJ1Y3QgdjRsMl9leHBvcnRidWZmZXIgeworCV9fdTMyCQl0eXBlOyAvKiBlbnVtIHY0bDJfYnVmX3R5cGUgKi8KKwlfX3UzMgkJaW5kZXg7CisJX191MzIJCXBsYW5lOworCV9fdTMyCQlmbGFnczsKKwlfX3MzMgkJZmQ7CisJX191MzIJCXJlc2VydmVkWzExXTsKK307CisKKy8qCisgKglPIFYgRSBSIEwgQSBZICAgUCBSIEUgViBJIEUgVworICovCitzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciB7CisJX191MzIJCQljYXBhYmlsaXR5OworCV9fdTMyCQkJZmxhZ3M7CisvKiBGSVhNRTogaW4gdGhlb3J5IHdlIHNob3VsZCBwYXNzIHNvbWV0aGluZyBsaWtlIFBDSSBkZXZpY2UgKyBtZW1vcnkKKyAqIHJlZ2lvbiArIG9mZnNldCBpbnN0ZWFkIG9mIHNvbWUgcGh5c2ljYWwgYWRkcmVzcyAqLworCXZvaWQgICAgICAgICAgICAgICAgICAgICpiYXNlOworCXN0cnVjdCB7CisJCV9fdTMyCQl3aWR0aDsKKwkJX191MzIJCWhlaWdodDsKKwkJX191MzIJCXBpeGVsZm9ybWF0OworCQlfX3UzMgkJZmllbGQ7CQkvKiBlbnVtIHY0bDJfZmllbGQgKi8KKwkJX191MzIJCWJ5dGVzcGVybGluZTsJLyogZm9yIHBhZGRpbmcsIHplcm8gaWYgdW51c2VkICovCisJCV9fdTMyCQlzaXplaW1hZ2U7CisJCV9fdTMyCQljb2xvcnNwYWNlOwkvKiBlbnVtIHY0bDJfY29sb3JzcGFjZSAqLworCQlfX3UzMgkJcHJpdjsJCS8qIHJlc2VydmVkIGZpZWxkLCBzZXQgdG8gMCAqLworCX0gZm10OworfTsKKy8qICBGbGFncyBmb3IgdGhlICdjYXBhYmlsaXR5JyBmaWVsZC4gUmVhZCBvbmx5ICovCisjZGVmaW5lIFY0TDJfRkJVRl9DQVBfRVhURVJOT1ZFUkxBWQkweDAwMDEKKyNkZWZpbmUgVjRMMl9GQlVGX0NBUF9DSFJPTUFLRVkJCTB4MDAwMgorI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0xJU1RfQ0xJUFBJTkcgICAgIDB4MDAwNAorI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0JJVE1BUF9DTElQUElORwkweDAwMDgKKyNkZWZpbmUgVjRMMl9GQlVGX0NBUF9MT0NBTF9BTFBIQQkweDAwMTAKKyNkZWZpbmUgVjRMMl9GQlVGX0NBUF9HTE9CQUxfQUxQSEEJMHgwMDIwCisjZGVmaW5lIFY0TDJfRkJVRl9DQVBfTE9DQUxfSU5WX0FMUEhBCTB4MDA0MAorI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX1NSQ19DSFJPTUFLRVkJMHgwMDgwCisvKiAgRmxhZ3MgZm9yIHRoZSAnZmxhZ3MnIGZpZWxkLiAqLworI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19QUklNQVJZCQkweDAwMDEKKyNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfT1ZFUkxBWQkJMHgwMDAyCisjZGVmaW5lIFY0TDJfRkJVRl9GTEFHX0NIUk9NQUtFWQkweDAwMDQKKyNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfTE9DQUxfQUxQSEEJMHgwMDA4CisjZGVmaW5lIFY0TDJfRkJVRl9GTEFHX0dMT0JBTF9BTFBIQQkweDAwMTAKKyNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfTE9DQUxfSU5WX0FMUEhBCTB4MDAyMAorI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19TUkNfQ0hST01BS0VZCTB4MDA0MAorCitzdHJ1Y3QgdjRsMl9jbGlwIHsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICBjOworCXN0cnVjdCB2NGwyX2NsaXAJX191c2VyICpuZXh0OworfTsKKworc3RydWN0IHY0bDJfd2luZG93IHsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICB3OworCV9fdTMyCQkJZmllbGQ7CSAvKiBlbnVtIHY0bDJfZmllbGQgKi8KKwlfX3UzMgkJCWNocm9tYWtleTsKKwlzdHJ1Y3QgdjRsMl9jbGlwCV9fdXNlciAqY2xpcHM7CisJX191MzIJCQljbGlwY291bnQ7CisJdm9pZAkJCV9fdXNlciAqYml0bWFwOworCV9fdTggICAgICAgICAgICAgICAgICAgIGdsb2JhbF9hbHBoYTsKK307CisKKy8qCisgKglDIEEgUCBUIFUgUiBFICAgUCBBIFIgQSBNIEUgVCBFIFIgUworICovCitzdHJ1Y3QgdjRsMl9jYXB0dXJlcGFybSB7CisJX191MzIJCSAgIGNhcGFiaWxpdHk7CSAgLyogIFN1cHBvcnRlZCBtb2RlcyAqLworCV9fdTMyCQkgICBjYXB0dXJlbW9kZTsJICAvKiAgQ3VycmVudCBtb2RlICovCisJc3RydWN0IHY0bDJfZnJhY3QgIHRpbWVwZXJmcmFtZTsgIC8qICBUaW1lIHBlciBmcmFtZSBpbiBzZWNvbmRzICovCisJX191MzIJCSAgIGV4dGVuZGVkbW9kZTsgIC8qICBEcml2ZXItc3BlY2lmaWMgZXh0ZW5zaW9ucyAqLworCV9fdTMyICAgICAgICAgICAgICByZWFkYnVmZmVyczsgICAvKiAgIyBvZiBidWZmZXJzIGZvciByZWFkICovCisJX191MzIJCSAgIHJlc2VydmVkWzRdOworfTsKKworLyogIEZsYWdzIGZvciAnY2FwYWJpbGl0eScgYW5kICdjYXB0dXJlbW9kZScgZmllbGRzICovCisjZGVmaW5lIFY0TDJfTU9ERV9ISUdIUVVBTElUWQkweDAwMDEJLyogIEhpZ2ggcXVhbGl0eSBpbWFnaW5nIG1vZGUgKi8KKyNkZWZpbmUgVjRMMl9DQVBfVElNRVBFUkZSQU1FCTB4MTAwMAkvKiAgdGltZXBlcmZyYW1lIGZpZWxkIGlzIHN1cHBvcnRlZCAqLworCitzdHJ1Y3QgdjRsMl9vdXRwdXRwYXJtIHsKKwlfX3UzMgkJICAgY2FwYWJpbGl0eTsJIC8qICBTdXBwb3J0ZWQgbW9kZXMgKi8KKwlfX3UzMgkJICAgb3V0cHV0bW9kZTsJIC8qICBDdXJyZW50IG1vZGUgKi8KKwlzdHJ1Y3QgdjRsMl9mcmFjdCAgdGltZXBlcmZyYW1lOyAvKiAgVGltZSBwZXIgZnJhbWUgaW4gc2Vjb25kcyAqLworCV9fdTMyCQkgICBleHRlbmRlZG1vZGU7IC8qICBEcml2ZXItc3BlY2lmaWMgZXh0ZW5zaW9ucyAqLworCV9fdTMyICAgICAgICAgICAgICB3cml0ZWJ1ZmZlcnM7IC8qICAjIG9mIGJ1ZmZlcnMgZm9yIHdyaXRlICovCisJX191MzIJCSAgIHJlc2VydmVkWzRdOworfTsKKworLyoKKyAqCUkgTiBQIFUgVCAgIEkgTSBBIEcgRSAgIEMgUiBPIFAgUCBJIE4gRworICovCitzdHJ1Y3QgdjRsMl9jcm9wY2FwIHsKKwlfX3UzMgkJCXR5cGU7CS8qIGVudW0gdjRsMl9idWZfdHlwZSAqLworCXN0cnVjdCB2NGwyX3JlY3QgICAgICAgIGJvdW5kczsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICBkZWZyZWN0OworCXN0cnVjdCB2NGwyX2ZyYWN0ICAgICAgIHBpeGVsYXNwZWN0OworfTsKKworc3RydWN0IHY0bDJfY3JvcCB7CisJX191MzIJCQl0eXBlOwkvKiBlbnVtIHY0bDJfYnVmX3R5cGUgKi8KKwlzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICBjOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdjRsMl9zZWxlY3Rpb24gLSBzZWxlY3Rpb24gaW5mbworICogQHR5cGU6CWJ1ZmZlciB0eXBlIChkbyBub3QgdXNlICpfTVBMQU5FIHR5cGVzKQorICogQHRhcmdldDoJU2VsZWN0aW9uIHRhcmdldCwgdXNlZCB0byBjaG9vc2Ugb25lIG9mIHBvc3NpYmxlIHJlY3RhbmdsZXM7CisgKgkJZGVmaW5lZCBpbiB2NGwyLWNvbW1vbi5oOyBWNEwyX1NFTF9UR1RfKiAuCisgKiBAZmxhZ3M6CWNvbnN0cmFpbnRzIGZsYWdzLCBkZWZpbmVkIGluIHY0bDItY29tbW9uLmg7IFY0TDJfU0VMX0ZMQUdfKi4KKyAqIEByOgkJY29vcmRpbmF0ZXMgb2Ygc2VsZWN0aW9uIHdpbmRvdworICogQHJlc2VydmVkOglmb3IgZnV0dXJlIHVzZSwgcm91bmRzIHN0cnVjdHVyZSBzaXplIHRvIDY0IGJ5dGVzLCBzZXQgdG8gemVybworICoKKyAqIEhhcmR3YXJlIG1heSB1c2UgbXVsdGlwbGUgaGVscGVyIHdpbmRvd3MgdG8gcHJvY2VzcyBhIHZpZGVvIHN0cmVhbS4KKyAqIFRoZSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBleGNoYW5nZSB0aGlzIHNlbGVjdGlvbiBhcmVhcyBiZXR3ZWVuCisgKiBhbiBhcHBsaWNhdGlvbiBhbmQgYSBkcml2ZXIuCisgKi8KK3N0cnVjdCB2NGwyX3NlbGVjdGlvbiB7CisJX191MzIJCQl0eXBlOworCV9fdTMyCQkJdGFyZ2V0OworCV9fdTMyICAgICAgICAgICAgICAgICAgIGZsYWdzOworCXN0cnVjdCB2NGwyX3JlY3QgICAgICAgIHI7CisJX191MzIgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWRbOV07Cit9OworCisKKy8qCisgKiAgICAgIEEgTiBBIEwgTyBHICAgViBJIEQgRSBPICAgUyBUIEEgTiBEIEEgUiBECisgKi8KKwordHlwZWRlZiBfX3U2NCB2NGwyX3N0ZF9pZDsKKworLyogb25lIGJpdCBmb3IgZWFjaCAqLworI2RlZmluZSBWNEwyX1NURF9QQUxfQiAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwMDEpCisjZGVmaW5lIFY0TDJfU1REX1BBTF9CMSAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDAwMikKKyNkZWZpbmUgVjRMMl9TVERfUEFMX0cgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMDA0KQorI2RlZmluZSBWNEwyX1NURF9QQUxfSCAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwMDgpCisjZGVmaW5lIFY0TDJfU1REX1BBTF9JICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDAxMCkKKyNkZWZpbmUgVjRMMl9TVERfUEFMX0QgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMDIwKQorI2RlZmluZSBWNEwyX1NURF9QQUxfRDEgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwNDApCisjZGVmaW5lIFY0TDJfU1REX1BBTF9LICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDA4MCkKKworI2RlZmluZSBWNEwyX1NURF9QQUxfTSAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAxMDApCisjZGVmaW5lIFY0TDJfU1REX1BBTF9OICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDIwMCkKKyNkZWZpbmUgVjRMMl9TVERfUEFMX05jICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwNDAwKQorI2RlZmluZSBWNEwyX1NURF9QQUxfNjAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDA4MDApCisKKyNkZWZpbmUgVjRMMl9TVERfTlRTQ19NICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAxMDAwKQkvKiBCVFNDICovCisjZGVmaW5lIFY0TDJfU1REX05UU0NfTV9KUCAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMjAwMCkJLyogRUlBLUogKi8KKyNkZWZpbmUgVjRMMl9TVERfTlRTQ180NDMgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDA0MDAwKQorI2RlZmluZSBWNEwyX1NURF9OVFNDX01fS1IgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDgwMDApCS8qIEZNIEEyICovCisKKyNkZWZpbmUgVjRMMl9TVERfU0VDQU1fQiAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDEwMDAwKQorI2RlZmluZSBWNEwyX1NURF9TRUNBTV9EICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMjAwMDApCisjZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0cgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDA0MDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfU0VDQU1fSCAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDgwMDAwKQorI2RlZmluZSBWNEwyX1NURF9TRUNBTV9LICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAxMDAwMDApCisjZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0sxICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDIwMDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfU0VDQU1fTCAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwNDAwMDAwKQorI2RlZmluZSBWNEwyX1NURF9TRUNBTV9MQyAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDA4MDAwMDApCisKKy8qIEFUU0MvSERUViAqLworI2RlZmluZSBWNEwyX1NURF9BVFNDXzhfVlNCICAgICAoKHY0bDJfc3RkX2lkKTB4MDEwMDAwMDApCisjZGVmaW5lIFY0TDJfU1REX0FUU0NfMTZfVlNCICAgICgodjRsMl9zdGRfaWQpMHgwMjAwMDAwMCkKKworLyogRklYTUU6CisgICBBbHRob3VnaCBzdGRfaWQgaXMgNjQgYml0cywgdGhlcmUgaXMgYW4gaXNzdWUgb24gUFBDMzIgYXJjaGl0ZWN0dXJlIHRoYXQKKyAgIG1ha2VzIHN3aXRjaChfX3U2NCkgdG8gYnJlYWsuIFNvLCB0aGVyZSdzIGEgaGFjayBvbiB2NGwyLWNvbW1vbi5jIHJvdW5kaW5nCisgICB0aGlzIHZhbHVlIHRvIDMyIGJpdHMuCisgICBBcywgY3VycmVudGx5LCB0aGUgbWF4IHZhbHVlIGlzIGZvciBWNEwyX1NURF9BVFNDXzE2X1ZTQiAoMzAgYml0cyB3aWRlKSwKKyAgIGl0IHNob3VsZCB3b3JrIGZpbmUuIEhvd2V2ZXIsIGlmIG5lZWRlZCB0byBhZGQgbW9yZSB0aGFuIHR3byBzdGFuZGFyZHMsCisgICB2NGwyLWNvbW1vbi5jIHNob3VsZCBiZSBmaXhlZC4KKyAqLworCisvKgorICogU29tZSBtYWNyb3MgdG8gbWVyZ2UgdmlkZW8gc3RhbmRhcmRzIGluIG9yZGVyIHRvIG1ha2UgbGl2ZSBlYXNpZXIgZm9yIHRoZQorICogZHJpdmVycyBhbmQgVjRMMiBhcHBsaWNhdGlvbnMKKyAqLworCisvKgorICogIkNvbW1vbiIgTlRTQy9NIC0gSXQgc2hvdWxkIGJlIG5vdGljZWQgdGhhdCBWNEwyX1NURF9OVFNDXzQ0MyBpcworICogTWlzc2luZyBoZXJlLgorICovCisjZGVmaW5lIFY0TDJfU1REX05UU0MgICAgICAgICAgIChWNEwyX1NURF9OVFNDX00JfFwKKwkJCQkgVjRMMl9TVERfTlRTQ19NX0pQICAgICB8XAorCQkJCSBWNEwyX1NURF9OVFNDX01fS1IpCisvKiBTZWNhbSBtYWNyb3MgKi8KKyNkZWZpbmUgVjRMMl9TVERfU0VDQU1fREsgICAgICAJKFY0TDJfU1REX1NFQ0FNX0QJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fSwl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9LMSkKKy8qIEFsbCBTZWNhbSBTdGFuZGFyZHMgKi8KKyNkZWZpbmUgVjRMMl9TVERfU0VDQU0JCShWNEwyX1NURF9TRUNBTV9CCXxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0cJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fSAl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9ESwl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9MICAgICAgIHxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0xDKQorLyogUEFMIG1hY3JvcyAqLworI2RlZmluZSBWNEwyX1NURF9QQUxfQkcJCShWNEwyX1NURF9QQUxfQgkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0IxCXxcCisJCQkJIFY0TDJfU1REX1BBTF9HKQorI2RlZmluZSBWNEwyX1NURF9QQUxfREsJCShWNEwyX1NURF9QQUxfRAkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0QxCXxcCisJCQkJIFY0TDJfU1REX1BBTF9LKQorLyoKKyAqICJDb21tb24iIFBBTCAtIFRoaXMgbWFjcm8gaXMgdGhlcmUgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBvbGQKKyAqIFY0TDEgY29uY2VwdCBvZiAiUEFMIjogL0JHREtISS4KKyAqIFNldmVyYWwgUEFMIHN0YW5kYXJkcyBhcmUgbWlzc2luZyBoZXJlOiAvTSwgL04gYW5kIC9OYworICovCisjZGVmaW5lIFY0TDJfU1REX1BBTAkJKFY0TDJfU1REX1BBTF9CRwl8XAorCQkJCSBWNEwyX1NURF9QQUxfREsJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0gJCXxcCisJCQkJIFY0TDJfU1REX1BBTF9JKQorLyogQ2hyb21hICJhZ25vc3RpYyIgc3RhbmRhcmRzICovCisjZGVmaW5lIFY0TDJfU1REX0IJCShWNEwyX1NURF9QQUxfQgkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0IxCXxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0IpCisjZGVmaW5lIFY0TDJfU1REX0cJCShWNEwyX1NURF9QQUxfRwkJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fRykKKyNkZWZpbmUgVjRMMl9TVERfSAkJKFY0TDJfU1REX1BBTF9ICQl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9IKQorI2RlZmluZSBWNEwyX1NURF9MCQkoVjRMMl9TVERfU0VDQU1fTAl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9MQykKKyNkZWZpbmUgVjRMMl9TVERfR0gJCShWNEwyX1NURF9HCQl8XAorCQkJCSBWNEwyX1NURF9IKQorI2RlZmluZSBWNEwyX1NURF9ESwkJKFY0TDJfU1REX1BBTF9ESwl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9ESykKKyNkZWZpbmUgVjRMMl9TVERfQkcJCShWNEwyX1NURF9CCQl8XAorCQkJCSBWNEwyX1NURF9HKQorI2RlZmluZSBWNEwyX1NURF9NTgkJKFY0TDJfU1REX1BBTF9NCQl8XAorCQkJCSBWNEwyX1NURF9QQUxfTgkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX05jCXxcCisJCQkJIFY0TDJfU1REX05UU0MpCisKKy8qIFN0YW5kYXJkcyB3aGVyZSBNVFMvQlRTQyBzdGVyZW8gY291bGQgYmUgZm91bmQgKi8KKyNkZWZpbmUgVjRMMl9TVERfTVRTCQkoVjRMMl9TVERfTlRTQ19NCXxcCisJCQkJIFY0TDJfU1REX1BBTF9NCQl8XAorCQkJCSBWNEwyX1NURF9QQUxfTgkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX05jKQorCisvKiBTdGFuZGFyZHMgZm9yIENvdW50cmllcyB3aXRoIDYwSHogTGluZSBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgVjRMMl9TVERfNTI1XzYwCQkoVjRMMl9TVERfUEFMX00JCXxcCisJCQkJIFY0TDJfU1REX1BBTF82MAl8XAorCQkJCSBWNEwyX1NURF9OVFNDCQl8XAorCQkJCSBWNEwyX1NURF9OVFNDXzQ0MykKKy8qIFN0YW5kYXJkcyBmb3IgQ291bnRyaWVzIHdpdGggNTBIeiBMaW5lIGZyZXF1ZW5jeSAqLworI2RlZmluZSBWNEwyX1NURF82MjVfNTAJCShWNEwyX1NURF9QQUwJCXxcCisJCQkJIFY0TDJfU1REX1BBTF9OCQl8XAorCQkJCSBWNEwyX1NURF9QQUxfTmMJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU0pCisKKyNkZWZpbmUgVjRMMl9TVERfQVRTQyAgICAgICAgICAgKFY0TDJfU1REX0FUU0NfOF9WU0IgICAgfFwKKwkJCQkgVjRMMl9TVERfQVRTQ18xNl9WU0IpCisvKiBNYWNyb3Mgd2l0aCBub25lIGFuZCBhbGwgYW5hbG9nIHN0YW5kYXJkcyAqLworI2RlZmluZSBWNEwyX1NURF9VTktOT1dOICAgICAgICAwCisjZGVmaW5lIFY0TDJfU1REX0FMTCAgICAgICAgICAgIChWNEwyX1NURF81MjVfNjAJfFwKKwkJCQkgVjRMMl9TVERfNjI1XzUwKQorCitzdHJ1Y3QgdjRsMl9zdGFuZGFyZCB7CisJX191MzIJCSAgICAgaW5kZXg7CisJdjRsMl9zdGRfaWQgICAgICAgICAgaWQ7CisJX191OAkJICAgICBuYW1lWzI0XTsKKwlzdHJ1Y3QgdjRsMl9mcmFjdCAgICBmcmFtZXBlcmlvZDsgLyogRnJhbWVzLCBub3QgZmllbGRzICovCisJX191MzIJCSAgICAgZnJhbWVsaW5lczsKKwlfX3UzMgkJICAgICByZXNlcnZlZFs0XTsKK307CisKKy8qCisgKglEIFYgCUIgVAlUIEkgTSBJIE4gRyBTCisgKi8KKworLyoqIHN0cnVjdCB2NGwyX2J0X3RpbWluZ3MgLSBCVC42NTYvQlQuMTEyMCB0aW1pbmcgZGF0YQorICogQHdpZHRoOgl0b3RhbCB3aWR0aCBvZiB0aGUgYWN0aXZlIHZpZGVvIGluIHBpeGVscworICogQGhlaWdodDoJdG90YWwgaGVpZ2h0IG9mIHRoZSBhY3RpdmUgdmlkZW8gaW4gbGluZXMKKyAqIEBpbnRlcmxhY2VkOglJbnRlcmxhY2VkIG9yIHByb2dyZXNzaXZlCisgKiBAcG9sYXJpdGllczoJUG9zaXRpdmUgb3IgbmVnYXRpdmUgcG9sYXJpdGllcworICogQHBpeGVsY2xvY2s6CVBpeGVsIGNsb2NrIGluIEhaLiBFeC4gNzQuMjVNSHotPjc0MjUwMDAwCisgKiBAaGZyb250cG9yY2g6SG9yaXpvbnRhbCBmcm9udCBwb3JjaCBpbiBwaXhlbHMKKyAqIEBoc3luYzoJSG9yaXpvbnRhbCBTeW5jIGxlbmd0aCBpbiBwaXhlbHMKKyAqIEBoYmFja3BvcmNoOglIb3Jpem9udGFsIGJhY2sgcG9yY2ggaW4gcGl4ZWxzCisgKiBAdmZyb250cG9yY2g6VmVydGljYWwgZnJvbnQgcG9yY2ggaW4gbGluZXMKKyAqIEB2c3luYzoJVmVydGljYWwgU3luYyBsZW5ndGggaW4gbGluZXMKKyAqIEB2YmFja3BvcmNoOglWZXJ0aWNhbCBiYWNrIHBvcmNoIGluIGxpbmVzCisgKiBAaWxfdmZyb250cG9yY2g6VmVydGljYWwgZnJvbnQgcG9yY2ggZm9yIHRoZSBldmVuIGZpZWxkCisgKgkJKGFrYSBmaWVsZCAyKSBvZiBpbnRlcmxhY2VkIGZpZWxkIGZvcm1hdHMKKyAqIEBpbF92c3luYzoJVmVydGljYWwgU3luYyBsZW5ndGggZm9yIHRoZSBldmVuIGZpZWxkCisgKgkJKGFrYSBmaWVsZCAyKSBvZiBpbnRlcmxhY2VkIGZpZWxkIGZvcm1hdHMKKyAqIEBpbF92YmFja3BvcmNoOlZlcnRpY2FsIGJhY2sgcG9yY2ggZm9yIHRoZSBldmVuIGZpZWxkCisgKgkJKGFrYSBmaWVsZCAyKSBvZiBpbnRlcmxhY2VkIGZpZWxkIGZvcm1hdHMKKyAqIEBzdGFuZGFyZHM6CVN0YW5kYXJkcyB0aGUgdGltaW5nIGJlbG9uZ3MgdG8KKyAqIEBmbGFnczoJRmxhZ3MKKyAqIEBwaWN0dXJlX2FzcGVjdDogVGhlIHBpY3R1cmUgYXNwZWN0IHJhdGlvIChob3IvdmVydCkuCisgKiBAY2VhODYxX3ZpYzoJVklDIGNvZGUgYXMgcGVyIHRoZSBDRUEtODYxIHN0YW5kYXJkLgorICogQGhkbWlfdmljOglWSUMgY29kZSBhcyBwZXIgdGhlIEhETUkgc3RhbmRhcmQuCisgKiBAcmVzZXJ2ZWQ6CVJlc2VydmVkIGZpZWxkcywgbXVzdCBiZSB6ZXJvZWQuCisgKgorICogQSBub3RlIHJlZ2FyZGluZyB2ZXJ0aWNhbCBpbnRlcmxhY2VkIHRpbWluZ3M6IGhlaWdodCByZWZlcnMgdG8gdGhlIHRvdGFsCisgKiBoZWlnaHQgb2YgdGhlIGFjdGl2ZSB2aWRlbyBmcmFtZSAoPSB0d28gZmllbGRzKS4gVGhlIGJsYW5raW5nIHRpbWluZ3MgcmVmZXIKKyAqIHRvIHRoZSBibGFua2luZyBvZiBlYWNoIGZpZWxkLiBTbyB0aGUgaGVpZ2h0IG9mIHRoZSB0b3RhbCBmcmFtZSBpcworICogY2FsY3VsYXRlZCBhcyBmb2xsb3dzOgorICoKKyAqIHRvdF9oZWlnaHQgPSBoZWlnaHQgKyB2ZnJvbnRwb3JjaCArIHZzeW5jICsgdmJhY2twb3JjaCArCisgKiAgICAgICAgICAgICAgICAgICAgICAgaWxfdmZyb250cG9yY2ggKyBpbF92c3luYyArIGlsX3ZiYWNrcG9yY2gKKyAqCisgKiBUaGUgYWN0aXZlIGhlaWdodCBvZiBlYWNoIGZpZWxkIGlzIGhlaWdodCAvIDIuCisgKi8KK3N0cnVjdCB2NGwyX2J0X3RpbWluZ3MgeworCV9fdTMyCXdpZHRoOworCV9fdTMyCWhlaWdodDsKKwlfX3UzMglpbnRlcmxhY2VkOworCV9fdTMyCXBvbGFyaXRpZXM7CisJX191NjQJcGl4ZWxjbG9jazsKKwlfX3UzMgloZnJvbnRwb3JjaDsKKwlfX3UzMgloc3luYzsKKwlfX3UzMgloYmFja3BvcmNoOworCV9fdTMyCXZmcm9udHBvcmNoOworCV9fdTMyCXZzeW5jOworCV9fdTMyCXZiYWNrcG9yY2g7CisJX191MzIJaWxfdmZyb250cG9yY2g7CisJX191MzIJaWxfdnN5bmM7CisJX191MzIJaWxfdmJhY2twb3JjaDsKKwlfX3UzMglzdGFuZGFyZHM7CisJX191MzIJZmxhZ3M7CisJc3RydWN0IHY0bDJfZnJhY3QgcGljdHVyZV9hc3BlY3Q7CisJX191OAljZWE4NjFfdmljOworCV9fdTgJaGRtaV92aWM7CisJX191OAlyZXNlcnZlZFs0Nl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogSW50ZXJsYWNlZCBvciBwcm9ncmVzc2l2ZSBmb3JtYXQgKi8KKyNkZWZpbmUJVjRMMl9EVl9QUk9HUkVTU0lWRQkwCisjZGVmaW5lCVY0TDJfRFZfSU5URVJMQUNFRAkxCisKKy8qIFBvbGFyaXRpZXMuIElmIGJpdCBpcyBub3Qgc2V0LCBpdCBpcyBhc3N1bWVkIHRvIGJlIG5lZ2F0aXZlIHBvbGFyaXR5ICovCisjZGVmaW5lIFY0TDJfRFZfVlNZTkNfUE9TX1BPTAkweDAwMDAwMDAxCisjZGVmaW5lIFY0TDJfRFZfSFNZTkNfUE9TX1BPTAkweDAwMDAwMDAyCisKKy8qIFRpbWluZ3Mgc3RhbmRhcmRzICovCisjZGVmaW5lIFY0TDJfRFZfQlRfU1REX0NFQTg2MQkoMSA8PCAwKSAgLyogQ0VBLTg2MSBEaWdpdGFsIFRWIFByb2ZpbGUgKi8KKyNkZWZpbmUgVjRMMl9EVl9CVF9TVERfRE1UCSgxIDw8IDEpICAvKiBWRVNBIERpc2NyZXRlIE1vbml0b3IgVGltaW5ncyAqLworI2RlZmluZSBWNEwyX0RWX0JUX1NURF9DVlQJKDEgPDwgMikgIC8qIFZFU0EgQ29vcmRpbmF0ZWQgVmlkZW8gVGltaW5ncyAqLworI2RlZmluZSBWNEwyX0RWX0JUX1NURF9HVEYJKDEgPDwgMykgIC8qIFZFU0EgR2VuZXJhbGl6ZWQgVGltaW5ncyBGb3JtdWxhICovCisjZGVmaW5lIFY0TDJfRFZfQlRfU1REX1NESQkoMSA8PCA0KSAgLyogU0RJIFRpbWluZ3MgKi8KKworLyogRmxhZ3MgKi8KKworLyoKKyAqIENWVC9HVEYgc3BlY2lmaWM6IHRpbWluZyB1c2VzIHJlZHVjZWQgYmxhbmtpbmcgKENWVCkgb3IgdGhlICdTZWNvbmRhcnkKKyAqIEdURicgY3VydmUgKEdURikuIEluIGJvdGggY2FzZXMgdGhlIGhvcml6b250YWwgYW5kL29yIHZlcnRpY2FsIGJsYW5raW5nCisgKiBpbnRlcnZhbHMgYXJlIHJlZHVjZWQsIGFsbG93aW5nIGEgaGlnaGVyIHJlc29sdXRpb24gb3ZlciB0aGUgc2FtZQorICogYmFuZHdpZHRoLiBUaGlzIGlzIGEgcmVhZC1vbmx5IGZsYWcuCisgKi8KKyNkZWZpbmUgVjRMMl9EVl9GTF9SRURVQ0VEX0JMQU5LSU5HCQkoMSA8PCAwKQorLyoKKyAqIENFQS04NjEgc3BlY2lmaWM6IHNldCBmb3IgQ0VBLTg2MSBmb3JtYXRzIHdpdGggYSBmcmFtZXJhdGUgb2YgYSBtdWx0aXBsZQorICogb2Ygc2l4LiBUaGVzZSBmb3JtYXRzIGNhbiBiZSBvcHRpb25hbGx5IHBsYXllZCBhdCAxIC8gMS4wMDEgc3BlZWQuCisgKiBUaGlzIGlzIGEgcmVhZC1vbmx5IGZsYWcuCisgKi8KKyNkZWZpbmUgVjRMMl9EVl9GTF9DQU5fUkVEVUNFX0ZQUwkJKDEgPDwgMSkKKy8qCisgKiBDRUEtODYxIHNwZWNpZmljOiBvbmx5IHZhbGlkIGZvciB2aWRlbyB0cmFuc21pdHRlcnMsIHRoZSBmbGFnIGlzIGNsZWFyZWQKKyAqIGJ5IHJlY2VpdmVycy4KKyAqIElmIHRoZSBmcmFtZXJhdGUgb2YgdGhlIGZvcm1hdCBpcyBhIG11bHRpcGxlIG9mIHNpeCwgdGhlbiB0aGUgcGl4ZWxjbG9jaworICogdXNlZCB0byBzZXQgdXAgdGhlIHRyYW5zbWl0dGVyIGlzIGRpdmlkZWQgYnkgMS4wMDEgdG8gbWFrZSBpdCBjb21wYXRpYmxlCisgKiB3aXRoIDYwIEh6IGJhc2VkIHN0YW5kYXJkcyBzdWNoIGFzIE5UU0MgYW5kIFBBTC1NIHRoYXQgdXNlIGEgZnJhbWVyYXRlIG9mCisgKiAyOS45NyBIei4gT3RoZXJ3aXNlIHRoaXMgZmxhZyBpcyBjbGVhcmVkLiBJZiB0aGUgdHJhbnNtaXR0ZXIgY2FuJ3QgZ2VuZXJhdGUKKyAqIHN1Y2ggZnJlcXVlbmNpZXMsIHRoZW4gdGhlIGZsYWcgd2lsbCBhbHNvIGJlIGNsZWFyZWQuCisgKi8KKyNkZWZpbmUgVjRMMl9EVl9GTF9SRURVQ0VEX0ZQUwkJCSgxIDw8IDIpCisvKgorICogU3BlY2lmaWMgdG8gaW50ZXJsYWNlZCBmb3JtYXRzOiBpZiBzZXQsIHRoZW4gZmllbGQgMSBpcyByZWFsbHkgb25lIGhhbGYtbGluZQorICogbG9uZ2VyIGFuZCBmaWVsZCAyIGlzIHJlYWxseSBvbmUgaGFsZi1saW5lIHNob3J0ZXIsIHNvIGVhY2ggZmllbGQgaGFzCisgKiBleGFjdGx5IHRoZSBzYW1lIG51bWJlciBvZiBoYWxmLWxpbmVzLiBXaGV0aGVyIGhhbGYtbGluZXMgY2FuIGJlIGRldGVjdGVkCisgKiBvciB1c2VkIGRlcGVuZHMgb24gdGhlIGhhcmR3YXJlLgorICovCisjZGVmaW5lIFY0TDJfRFZfRkxfSEFMRl9MSU5FCQkJKDEgPDwgMykKKy8qCisgKiBJZiBzZXQsIHRoZW4gdGhpcyBpcyBhIENvbnN1bWVyIEVsZWN0cm9uaWNzIChDRSkgdmlkZW8gZm9ybWF0LiBTdWNoIGZvcm1hdHMKKyAqIGRpZmZlciBmcm9tIG90aGVyIGZvcm1hdHMgKGNvbW1vbmx5IGNhbGxlZCBJVCBmb3JtYXRzKSBpbiB0aGF0IGlmIFJHQgorICogZW5jb2RpbmcgaXMgdXNlZCB0aGVuIGJ5IGRlZmF1bHQgdGhlIFJHQiB2YWx1ZXMgdXNlIGxpbWl0ZWQgcmFuZ2UgKGkuZS4KKyAqIHVzZSB0aGUgcmFuZ2UgMTYtMjM1KSBhcyBvcHBvc2VkIHRvIDAtMjU1LiBBbGwgZm9ybWF0cyBkZWZpbmVkIGluIENFQS04NjEKKyAqIGV4Y2VwdCBmb3IgdGhlIDY0MHg0ODAgZm9ybWF0IGFyZSBDRSBmb3JtYXRzLgorICovCisjZGVmaW5lIFY0TDJfRFZfRkxfSVNfQ0VfVklERU8JCQkoMSA8PCA0KQorLyogU29tZSBmb3JtYXRzIGxpa2UgU01QVEUtMTI1TSBoYXZlIGFuIGludGVybGFjZWQgc2lnbmFsIHdpdGggYSBvZGQKKyAqIHRvdGFsIGhlaWdodC4gRm9yIHRoZXNlIGZvcm1hdHMsIGlmIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSBmaXJzdAorICogZmllbGQgaGFzIHRoZSBleHRyYSBsaW5lLiBJZiBub3QsIGl0IGlzIHRoZSBzZWNvbmQgZmllbGQuCisgKi8KKyNkZWZpbmUgVjRMMl9EVl9GTF9GSVJTVF9GSUVMRF9FWFRSQV9MSU5FCSgxIDw8IDUpCisvKgorICogSWYgc2V0LCB0aGVuIHRoZSBwaWN0dXJlX2FzcGVjdCBmaWVsZCBpcyB2YWxpZC4gT3RoZXJ3aXNlIGFzc3VtZSB0aGF0IHRoZQorICogcGl4ZWxzIGFyZSBzcXVhcmUsIHNvIHRoZSBwaWN0dXJlIGFzcGVjdCByYXRpbyBpcyB0aGUgc2FtZSBhcyB0aGUgd2lkdGggdG8KKyAqIGhlaWdodCByYXRpby4KKyAqLworI2RlZmluZSBWNEwyX0RWX0ZMX0hBU19QSUNUVVJFX0FTUEVDVAkJKDEgPDwgNikKKy8qCisgKiBJZiBzZXQsIHRoZW4gdGhlIGNlYTg2MV92aWMgZmllbGQgaXMgdmFsaWQgYW5kIGNvbnRhaW5zIHRoZSBWaWRlbworICogSWRlbnRpZmljYXRpb24gQ29kZSBhcyBwZXIgdGhlIENFQS04NjEgc3RhbmRhcmQuCisgKi8KKyNkZWZpbmUgVjRMMl9EVl9GTF9IQVNfQ0VBODYxX1ZJQwkJKDEgPDwgNykKKy8qCisgKiBJZiBzZXQsIHRoZW4gdGhlIGhkbWlfdmljIGZpZWxkIGlzIHZhbGlkIGFuZCBjb250YWlucyB0aGUgVmlkZW8KKyAqIElkZW50aWZpY2F0aW9uIENvZGUgYXMgcGVyIHRoZSBIRE1JIHN0YW5kYXJkIChIRE1JIFZlbmRvciBTcGVjaWZpYworICogSW5mb0ZyYW1lKS4KKyAqLworI2RlZmluZSBWNEwyX0RWX0ZMX0hBU19IRE1JX1ZJQwkJCSgxIDw8IDgpCisKKy8qIEEgZmV3IHVzZWZ1bCBkZWZpbmVzIHRvIGNhbGN1bGF0ZSB0aGUgdG90YWwgYmxhbmtpbmcgYW5kIGZyYW1lIHNpemVzICovCisjZGVmaW5lIFY0TDJfRFZfQlRfQkxBTktJTkdfV0lEVEgoYnQpIFwKKwkoKGJ0KS0+aGZyb250cG9yY2ggKyAoYnQpLT5oc3luYyArIChidCktPmhiYWNrcG9yY2gpCisjZGVmaW5lIFY0TDJfRFZfQlRfRlJBTUVfV0lEVEgoYnQpIFwKKwkoKGJ0KS0+d2lkdGggKyBWNEwyX0RWX0JUX0JMQU5LSU5HX1dJRFRIKGJ0KSkKKyNkZWZpbmUgVjRMMl9EVl9CVF9CTEFOS0lOR19IRUlHSFQoYnQpIFwKKwkoKGJ0KS0+dmZyb250cG9yY2ggKyAoYnQpLT52c3luYyArIChidCktPnZiYWNrcG9yY2ggKyBcCisJIChidCktPmlsX3Zmcm9udHBvcmNoICsgKGJ0KS0+aWxfdnN5bmMgKyAoYnQpLT5pbF92YmFja3BvcmNoKQorI2RlZmluZSBWNEwyX0RWX0JUX0ZSQU1FX0hFSUdIVChidCkgXAorCSgoYnQpLT5oZWlnaHQgKyBWNEwyX0RWX0JUX0JMQU5LSU5HX0hFSUdIVChidCkpCisKKy8qKiBzdHJ1Y3QgdjRsMl9kdl90aW1pbmdzIC0gRFYgdGltaW5ncworICogQHR5cGU6CXRoZSB0eXBlIG9mIHRoZSB0aW1pbmdzCisgKiBAYnQ6CUJUNjU2LzExMjAgdGltaW5ncworICovCitzdHJ1Y3QgdjRsMl9kdl90aW1pbmdzIHsKKwlfX3UzMiB0eXBlOworCXVuaW9uIHsKKwkJc3RydWN0IHY0bDJfYnRfdGltaW5ncwlidDsKKwkJX191MzIJcmVzZXJ2ZWRbMzJdOworCX07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVmFsdWVzIGZvciB0aGUgdHlwZSBmaWVsZCAqLworI2RlZmluZSBWNEwyX0RWX0JUXzY1Nl8xMTIwCTAJLyogQlQuNjU2LzExMjAgdGltaW5nIHR5cGUgKi8KKworCisvKiogc3RydWN0IHY0bDJfZW51bV9kdl90aW1pbmdzIC0gRFYgdGltaW5ncyBlbnVtZXJhdGlvbgorICogQGluZGV4OgllbnVtZXJhdGlvbiBpbmRleAorICogQHBhZDoJdGhlIHBhZCBudW1iZXIgZm9yIHdoaWNoIHRvIGVudW1lcmF0ZSB0aW1pbmdzICh1c2VkIHdpdGgKKyAqCQl2NGwtc3ViZGV2IG5vZGVzIG9ubHkpCisgKiBAcmVzZXJ2ZWQ6CW11c3QgYmUgemVyb2VkCisgKiBAdGltaW5nczoJdGhlIHRpbWluZ3MgZm9yIHRoZSBnaXZlbiBpbmRleAorICovCitzdHJ1Y3QgdjRsMl9lbnVtX2R2X3RpbWluZ3MgeworCV9fdTMyIGluZGV4OworCV9fdTMyIHBhZDsKKwlfX3UzMiByZXNlcnZlZFsyXTsKKwlzdHJ1Y3QgdjRsMl9kdl90aW1pbmdzIHRpbWluZ3M7Cit9OworCisvKiogc3RydWN0IHY0bDJfYnRfdGltaW5nc19jYXAgLSBCVC42NTYvQlQuMTEyMCB0aW1pbmcgY2FwYWJpbGl0aWVzCisgKiBAbWluX3dpZHRoOgkJd2lkdGggaW4gcGl4ZWxzCisgKiBAbWF4X3dpZHRoOgkJd2lkdGggaW4gcGl4ZWxzCisgKiBAbWluX2hlaWdodDoJCWhlaWdodCBpbiBsaW5lcworICogQG1heF9oZWlnaHQ6CQloZWlnaHQgaW4gbGluZXMKKyAqIEBtaW5fcGl4ZWxjbG9jazoJUGl4ZWwgY2xvY2sgaW4gSFouIEV4LiA3NC4yNU1Iei0+NzQyNTAwMDAKKyAqIEBtYXhfcGl4ZWxjbG9jazoJUGl4ZWwgY2xvY2sgaW4gSFouIEV4LiA3NC4yNU1Iei0+NzQyNTAwMDAKKyAqIEBzdGFuZGFyZHM6CQlTdXBwb3J0ZWQgc3RhbmRhcmRzCisgKiBAY2FwYWJpbGl0aWVzOglTdXBwb3J0ZWQgY2FwYWJpbGl0aWVzCisgKiBAcmVzZXJ2ZWQ6CQlNdXN0IGJlIHplcm9lZAorICovCitzdHJ1Y3QgdjRsMl9idF90aW1pbmdzX2NhcCB7CisJX191MzIJbWluX3dpZHRoOworCV9fdTMyCW1heF93aWR0aDsKKwlfX3UzMgltaW5faGVpZ2h0OworCV9fdTMyCW1heF9oZWlnaHQ7CisJX191NjQJbWluX3BpeGVsY2xvY2s7CisJX191NjQJbWF4X3BpeGVsY2xvY2s7CisJX191MzIJc3RhbmRhcmRzOworCV9fdTMyCWNhcGFiaWxpdGllczsKKwlfX3UzMglyZXNlcnZlZFsxNl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogU3VwcG9ydHMgaW50ZXJsYWNlZCBmb3JtYXRzICovCisjZGVmaW5lIFY0TDJfRFZfQlRfQ0FQX0lOVEVSTEFDRUQJKDEgPDwgMCkKKy8qIFN1cHBvcnRzIHByb2dyZXNzaXZlIGZvcm1hdHMgKi8KKyNkZWZpbmUgVjRMMl9EVl9CVF9DQVBfUFJPR1JFU1NJVkUJKDEgPDwgMSkKKy8qIFN1cHBvcnRzIENWVC9HVEYgcmVkdWNlZCBibGFua2luZyAqLworI2RlZmluZSBWNEwyX0RWX0JUX0NBUF9SRURVQ0VEX0JMQU5LSU5HCSgxIDw8IDIpCisvKiBTdXBwb3J0cyBjdXN0b20gZm9ybWF0cyAqLworI2RlZmluZSBWNEwyX0RWX0JUX0NBUF9DVVNUT00JCSgxIDw8IDMpCisKKy8qKiBzdHJ1Y3QgdjRsMl9kdl90aW1pbmdzX2NhcCAtIERWIHRpbWluZ3MgY2FwYWJpbGl0aWVzCisgKiBAdHlwZToJdGhlIHR5cGUgb2YgdGhlIHRpbWluZ3MgKHNhbWUgYXMgaW4gc3RydWN0IHY0bDJfZHZfdGltaW5ncykKKyAqIEBwYWQ6CXRoZSBwYWQgbnVtYmVyIGZvciB3aGljaCB0byBxdWVyeSBjYXBhYmlsaXRpZXMgKHVzZWQgd2l0aAorICoJCXY0bC1zdWJkZXYgbm9kZXMgb25seSkKKyAqIEBidDoJCXRoZSBCVDY1Ni8xMTIwIHRpbWluZ3MgY2FwYWJpbGl0aWVzCisgKi8KK3N0cnVjdCB2NGwyX2R2X3RpbWluZ3NfY2FwIHsKKwlfX3UzMiB0eXBlOworCV9fdTMyIHBhZDsKKwlfX3UzMiByZXNlcnZlZFsyXTsKKwl1bmlvbiB7CisJCXN0cnVjdCB2NGwyX2J0X3RpbWluZ3NfY2FwIGJ0OworCQlfX3UzMiByYXdfZGF0YVszMl07CisJfTsKK307CisKKworLyoKKyAqCVYgSSBEIEUgTyAgIEkgTiBQIFUgVCBTCisgKi8KK3N0cnVjdCB2NGwyX2lucHV0IHsKKwlfX3UzMgkgICAgIGluZGV4OwkJLyogIFdoaWNoIGlucHV0ICovCisJX191OAkgICAgIG5hbWVbMzJdOwkJLyogIExhYmVsICovCisJX191MzIJICAgICB0eXBlOwkJLyogIFR5cGUgb2YgaW5wdXQgKi8KKwlfX3UzMgkgICAgIGF1ZGlvc2V0OwkJLyogIEFzc29jaWF0ZWQgYXVkaW9zIChiaXRmaWVsZCkgKi8KKwlfX3UzMiAgICAgICAgdHVuZXI7ICAgICAgICAgICAgIC8qICBlbnVtIHY0bDJfdHVuZXJfdHlwZSAqLworCXY0bDJfc3RkX2lkICBzdGQ7CisJX191MzIJICAgICBzdGF0dXM7CisJX191MzIJICAgICBjYXBhYmlsaXRpZXM7CisJX191MzIJICAgICByZXNlcnZlZFszXTsKK307CisKKy8qICBWYWx1ZXMgZm9yIHRoZSAndHlwZScgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9JTlBVVF9UWVBFX1RVTkVSCQkxCisjZGVmaW5lIFY0TDJfSU5QVVRfVFlQRV9DQU1FUkEJCTIKKyNkZWZpbmUgVjRMMl9JTlBVVF9UWVBFX1RPVUNICQkzCisKKy8qIGZpZWxkICdzdGF0dXMnIC0gZ2VuZXJhbCAqLworI2RlZmluZSBWNEwyX0lOX1NUX05PX1BPV0VSICAgIDB4MDAwMDAwMDEgIC8qIEF0dGFjaGVkIGRldmljZSBpcyBvZmYgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9OT19TSUdOQUwgICAweDAwMDAwMDAyCisjZGVmaW5lIFY0TDJfSU5fU1RfTk9fQ09MT1IgICAgMHgwMDAwMDAwNAorCisvKiBmaWVsZCAnc3RhdHVzJyAtIHNlbnNvciBvcmllbnRhdGlvbiAqLworLyogSWYgc2Vuc29yIGlzIG1vdW50ZWQgdXBzaWRlIGRvd24gc2V0IGJvdGggYml0cyAqLworI2RlZmluZSBWNEwyX0lOX1NUX0hGTElQICAgICAgIDB4MDAwMDAwMTAgLyogRnJhbWVzIGFyZSBmbGlwcGVkIGhvcml6b250YWxseSAqLworI2RlZmluZSBWNEwyX0lOX1NUX1ZGTElQICAgICAgIDB4MDAwMDAwMjAgLyogRnJhbWVzIGFyZSBmbGlwcGVkIHZlcnRpY2FsbHkgKi8KKworLyogZmllbGQgJ3N0YXR1cycgLSBhbmFsb2cgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9OT19IX0xPQ0sgICAweDAwMDAwMTAwICAvKiBObyBob3Jpem9udGFsIHN5bmMgbG9jayAqLworI2RlZmluZSBWNEwyX0lOX1NUX0NPTE9SX0tJTEwgIDB4MDAwMDAyMDAgIC8qIENvbG9yIGtpbGxlciBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9OT19WX0xPQ0sgICAweDAwMDAwNDAwICAvKiBObyB2ZXJ0aWNhbCBzeW5jIGxvY2sgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9OT19TVERfTE9DSyAweDAwMDAwODAwICAvKiBObyBzdGFuZGFyZCBmb3JtYXQgbG9jayAqLworCisvKiBmaWVsZCAnc3RhdHVzJyAtIGRpZ2l0YWwgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9OT19TWU5DICAgICAweDAwMDEwMDAwICAvKiBObyBzeW5jaHJvbml6YXRpb24gbG9jayAqLworI2RlZmluZSBWNEwyX0lOX1NUX05PX0VRVSAgICAgIDB4MDAwMjAwMDAgIC8qIE5vIGVxdWFsaXplciBsb2NrICovCisjZGVmaW5lIFY0TDJfSU5fU1RfTk9fQ0FSUklFUiAgMHgwMDA0MDAwMCAgLyogQ2FycmllciByZWNvdmVyeSBmYWlsZWQgKi8KKworLyogZmllbGQgJ3N0YXR1cycgLSBWQ1IgYW5kIHNldC10b3AgYm94ICovCisjZGVmaW5lIFY0TDJfSU5fU1RfTUFDUk9WSVNJT04gMHgwMTAwMDAwMCAgLyogTWFjcm92aXNpb24gZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9OT19BQ0NFU1MgICAweDAyMDAwMDAwICAvKiBDb25kaXRpb25hbCBhY2Nlc3MgZGVuaWVkICovCisjZGVmaW5lIFY0TDJfSU5fU1RfVlRSICAgICAgICAgMHgwNDAwMDAwMCAgLyogVlRSIHRpbWUgY29uc3RhbnQgKi8KKworLyogY2FwYWJpbGl0aWVzIGZsYWdzICovCisjZGVmaW5lIFY0TDJfSU5fQ0FQX0RWX1RJTUlOR1MJCTB4MDAwMDAwMDIgLyogU3VwcG9ydHMgU19EVl9USU1JTkdTICovCisjZGVmaW5lIFY0TDJfSU5fQ0FQX0NVU1RPTV9USU1JTkdTCVY0TDJfSU5fQ0FQX0RWX1RJTUlOR1MgLyogRm9yIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgVjRMMl9JTl9DQVBfU1RECQkJMHgwMDAwMDAwNCAvKiBTdXBwb3J0cyBTX1NURCAqLworI2RlZmluZSBWNEwyX0lOX0NBUF9OQVRJVkVfU0laRQkJMHgwMDAwMDAwOCAvKiBTdXBwb3J0cyBzZXR0aW5nIG5hdGl2ZSBzaXplICovCisKKy8qCisgKglWIEkgRCBFIE8gICBPIFUgVCBQIFUgVCBTCisgKi8KK3N0cnVjdCB2NGwyX291dHB1dCB7CisJX191MzIJICAgICBpbmRleDsJCS8qICBXaGljaCBvdXRwdXQgKi8KKwlfX3U4CSAgICAgbmFtZVszMl07CQkvKiAgTGFiZWwgKi8KKwlfX3UzMgkgICAgIHR5cGU7CQkvKiAgVHlwZSBvZiBvdXRwdXQgKi8KKwlfX3UzMgkgICAgIGF1ZGlvc2V0OwkJLyogIEFzc29jaWF0ZWQgYXVkaW9zIChiaXRmaWVsZCkgKi8KKwlfX3UzMgkgICAgIG1vZHVsYXRvcjsgICAgICAgICAvKiAgQXNzb2NpYXRlZCBtb2R1bGF0b3IgKi8KKwl2NGwyX3N0ZF9pZCAgc3RkOworCV9fdTMyCSAgICAgY2FwYWJpbGl0aWVzOworCV9fdTMyCSAgICAgcmVzZXJ2ZWRbM107Cit9OworLyogIFZhbHVlcyBmb3IgdGhlICd0eXBlJyBmaWVsZCAqLworI2RlZmluZSBWNEwyX09VVFBVVF9UWVBFX01PRFVMQVRPUgkJMQorI2RlZmluZSBWNEwyX09VVFBVVF9UWVBFX0FOQUxPRwkJCTIKKyNkZWZpbmUgVjRMMl9PVVRQVVRfVFlQRV9BTkFMT0dWR0FPVkVSTEFZCTMKKworLyogY2FwYWJpbGl0aWVzIGZsYWdzICovCisjZGVmaW5lIFY0TDJfT1VUX0NBUF9EVl9USU1JTkdTCQkweDAwMDAwMDAyIC8qIFN1cHBvcnRzIFNfRFZfVElNSU5HUyAqLworI2RlZmluZSBWNEwyX09VVF9DQVBfQ1VTVE9NX1RJTUlOR1MJVjRMMl9PVVRfQ0FQX0RWX1RJTUlOR1MgLyogRm9yIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgVjRMMl9PVVRfQ0FQX1NURAkJMHgwMDAwMDAwNCAvKiBTdXBwb3J0cyBTX1NURCAqLworI2RlZmluZSBWNEwyX09VVF9DQVBfTkFUSVZFX1NJWkUJMHgwMDAwMDAwOCAvKiBTdXBwb3J0cyBzZXR0aW5nIG5hdGl2ZSBzaXplICovCisKKy8qCisgKglDIE8gTiBUIFIgTyBMIFMKKyAqLworc3RydWN0IHY0bDJfY29udHJvbCB7CisJX191MzIJCSAgICAgaWQ7CisJX19zMzIJCSAgICAgdmFsdWU7Cit9OworCitzdHJ1Y3QgdjRsMl9leHRfY29udHJvbCB7CisJX191MzIgaWQ7CisJX191MzIgc2l6ZTsKKwlfX3UzMiByZXNlcnZlZDJbMV07CisJdW5pb24geworCQlfX3MzMiB2YWx1ZTsKKwkJX19zNjQgdmFsdWU2NDsKKwkJY2hhciBfX3VzZXIgKnN0cmluZzsKKwkJX191OCBfX3VzZXIgKnBfdTg7CisJCV9fdTE2IF9fdXNlciAqcF91MTY7CisJCV9fdTMyIF9fdXNlciAqcF91MzI7CisJCXZvaWQgX191c2VyICpwdHI7CisJfTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgeworCXVuaW9uIHsKKyNpZm5kZWYgX19LRVJORUxfXworCQlfX3UzMiBjdHJsX2NsYXNzOworI2VuZGlmCisJCV9fdTMyIHdoaWNoOworCX07CisJX191MzIgY291bnQ7CisJX191MzIgZXJyb3JfaWR4OworCV9fdTMyIHJlc2VydmVkWzJdOworCXN0cnVjdCB2NGwyX2V4dF9jb250cm9sICpjb250cm9sczsKK307CisKKyNkZWZpbmUgVjRMMl9DVFJMX0lEX01BU0sgICAgICAJICAoMHgwZmZmZmZmZikKKyNpZm5kZWYgX19LRVJORUxfXworI2RlZmluZSBWNEwyX0NUUkxfSUQyQ0xBU1MoaWQpICAgICgoaWQpICYgMHgwZmZmMDAwMFVMKQorI2VuZGlmCisjZGVmaW5lIFY0TDJfQ1RSTF9JRDJXSElDSChpZCkgICAgKChpZCkgJiAweDBmZmYwMDAwVUwpCisjZGVmaW5lIFY0TDJfQ1RSTF9EUklWRVJfUFJJVihpZCkgKCgoaWQpICYgMHhmZmZmKSA+PSAweDEwMDApCisjZGVmaW5lIFY0TDJfQ1RSTF9NQVhfRElNUwkgICg0KQorI2RlZmluZSBWNEwyX0NUUkxfV0hJQ0hfQ1VSX1ZBTCAgIDAKKyNkZWZpbmUgVjRMMl9DVFJMX1dISUNIX0RFRl9WQUwgICAweDBmMDAwMDAwCisKK2VudW0gdjRsMl9jdHJsX3R5cGUgeworCVY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIJICAgICA9IDEsCisJVjRMMl9DVFJMX1RZUEVfQk9PTEVBTgkgICAgID0gMiwKKwlWNEwyX0NUUkxfVFlQRV9NRU5VCSAgICAgPSAzLAorCVY0TDJfQ1RSTF9UWVBFX0JVVFRPTgkgICAgID0gNCwKKwlWNEwyX0NUUkxfVFlQRV9JTlRFR0VSNjQgICAgID0gNSwKKwlWNEwyX0NUUkxfVFlQRV9DVFJMX0NMQVNTICAgID0gNiwKKwlWNEwyX0NUUkxfVFlQRV9TVFJJTkcgICAgICAgID0gNywKKwlWNEwyX0NUUkxfVFlQRV9CSVRNQVNLICAgICAgID0gOCwKKwlWNEwyX0NUUkxfVFlQRV9JTlRFR0VSX01FTlUgID0gOSwKKworCS8qIENvbXBvdW5kIHR5cGVzIGFyZSA+PSAweDAxMDAgKi8KKwlWNEwyX0NUUkxfQ09NUE9VTkRfVFlQRVMgICAgID0gMHgwMTAwLAorCVY0TDJfQ1RSTF9UWVBFX1U4CSAgICAgPSAweDAxMDAsCisJVjRMMl9DVFJMX1RZUEVfVTE2CSAgICAgPSAweDAxMDEsCisJVjRMMl9DVFJMX1RZUEVfVTMyCSAgICAgPSAweDAxMDIsCit9OworCisvKiAgVXNlZCBpbiB0aGUgVklESU9DX1FVRVJZQ1RSTCBpb2N0bCBmb3IgcXVlcnlpbmcgY29udHJvbHMgKi8KK3N0cnVjdCB2NGwyX3F1ZXJ5Y3RybCB7CisJX191MzIJCSAgICAgaWQ7CisJX191MzIJCSAgICAgdHlwZTsJLyogZW51bSB2NGwyX2N0cmxfdHlwZSAqLworCV9fdTgJCSAgICAgbmFtZVszMl07CS8qIFdoYXRldmVyICovCisJX19zMzIJCSAgICAgbWluaW11bTsJLyogTm90ZSBzaWduZWRuZXNzICovCisJX19zMzIJCSAgICAgbWF4aW11bTsKKwlfX3MzMgkJICAgICBzdGVwOworCV9fczMyCQkgICAgIGRlZmF1bHRfdmFsdWU7CisJX191MzIgICAgICAgICAgICAgICAgZmxhZ3M7CisJX191MzIJCSAgICAgcmVzZXJ2ZWRbMl07Cit9OworCisvKiAgVXNlZCBpbiB0aGUgVklESU9DX1FVRVJZX0VYVF9DVFJMIGlvY3RsIGZvciBxdWVyeWluZyBleHRlbmRlZCBjb250cm9scyAqLworc3RydWN0IHY0bDJfcXVlcnlfZXh0X2N0cmwgeworCV9fdTMyCQkgICAgIGlkOworCV9fdTMyCQkgICAgIHR5cGU7CisJY2hhcgkJICAgICBuYW1lWzMyXTsKKwlfX3M2NAkJICAgICBtaW5pbXVtOworCV9fczY0CQkgICAgIG1heGltdW07CisJX191NjQJCSAgICAgc3RlcDsKKwlfX3M2NAkJICAgICBkZWZhdWx0X3ZhbHVlOworCV9fdTMyICAgICAgICAgICAgICAgIGZsYWdzOworCV9fdTMyICAgICAgICAgICAgICAgIGVsZW1fc2l6ZTsKKwlfX3UzMiAgICAgICAgICAgICAgICBlbGVtczsKKwlfX3UzMiAgICAgICAgICAgICAgICBucl9vZl9kaW1zOworCV9fdTMyICAgICAgICAgICAgICAgIGRpbXNbVjRMMl9DVFJMX01BWF9ESU1TXTsKKwlfX3UzMgkJICAgICByZXNlcnZlZFszMl07Cit9OworCisvKiAgVXNlZCBpbiB0aGUgVklESU9DX1FVRVJZTUVOVSBpb2N0bCBmb3IgcXVlcnlpbmcgbWVudSBpdGVtcyAqLworc3RydWN0IHY0bDJfcXVlcnltZW51IHsKKwlfX3UzMgkJaWQ7CisJX191MzIJCWluZGV4OworCXVuaW9uIHsKKwkJX191OAluYW1lWzMyXTsJLyogV2hhdGV2ZXIgKi8KKwkJX19zNjQJdmFsdWU7CisJfTsKKwlfX3UzMgkJcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogIENvbnRyb2wgZmxhZ3MgICovCisjZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVECQkweDAwMDEKKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfR1JBQkJFRAkJMHgwMDAyCisjZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX1JFQURfT05MWSAJMHgwMDA0CisjZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX1VQREFURSAJCTB4MDAwOAorI2RlZmluZSBWNEwyX0NUUkxfRkxBR19JTkFDVElWRSAJMHgwMDEwCisjZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX1NMSURFUiAJCTB4MDAyMAorI2RlZmluZSBWNEwyX0NUUkxfRkxBR19XUklURV9PTkxZIAkweDAwNDAKKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfVk9MQVRJTEUJCTB4MDA4MAorI2RlZmluZSBWNEwyX0NUUkxfRkxBR19IQVNfUEFZTE9BRAkweDAxMDAKKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfRVhFQ1VURV9PTl9XUklURQkweDAyMDAKKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfTU9ESUZZX0xBWU9VVAkweDA0MDAKKworLyogIFF1ZXJ5IGZsYWdzLCB0byBiZSBPUmVkIHdpdGggdGhlIGNvbnRyb2wgSUQgKi8KKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfTkVYVF9DVFJMCTB4ODAwMDAwMDAKKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfTkVYVF9DT01QT1VORAkweDQwMDAwMDAwCisKKy8qICBVc2VyLWNsYXNzIGNvbnRyb2wgSURzIGRlZmluZWQgYnkgVjRMMiAqLworI2RlZmluZSBWNEwyX0NJRF9NQVhfQ1RSTFMJCTEwMjQKKy8qICBJRHMgcmVzZXJ2ZWQgZm9yIGRyaXZlciBzcGVjaWZpYyBjb250cm9scyAqLworI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX0JBU0UJCTB4MDgwMDAwMDAKKworCisvKgorICoJVCBVIE4gSSBOIEcKKyAqLworc3RydWN0IHY0bDJfdHVuZXIgeworCV9fdTMyICAgICAgICAgICAgICAgICAgIGluZGV4OworCV9fdTgJCQluYW1lWzMyXTsKKwlfX3UzMgkJCXR5cGU7CS8qIGVudW0gdjRsMl90dW5lcl90eXBlICovCisJX191MzIJCQljYXBhYmlsaXR5OworCV9fdTMyCQkJcmFuZ2Vsb3c7CisJX191MzIJCQlyYW5nZWhpZ2g7CisJX191MzIJCQlyeHN1YmNoYW5zOworCV9fdTMyCQkJYXVkbW9kZTsKKwlfX3MzMgkJCXNpZ25hbDsKKwlfX3MzMgkJCWFmYzsKKwlfX3UzMgkJCXJlc2VydmVkWzRdOworfTsKKworc3RydWN0IHY0bDJfbW9kdWxhdG9yIHsKKwlfX3UzMgkJCWluZGV4OworCV9fdTgJCQluYW1lWzMyXTsKKwlfX3UzMgkJCWNhcGFiaWxpdHk7CisJX191MzIJCQlyYW5nZWxvdzsKKwlfX3UzMgkJCXJhbmdlaGlnaDsKKwlfX3UzMgkJCXR4c3ViY2hhbnM7CisJX191MzIJCQl0eXBlOwkvKiBlbnVtIHY0bDJfdHVuZXJfdHlwZSAqLworCV9fdTMyCQkJcmVzZXJ2ZWRbM107Cit9OworCisvKiAgRmxhZ3MgZm9yIHRoZSAnY2FwYWJpbGl0eScgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfTE9XCQkweDAwMDEKKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfTk9STQkJMHgwMDAyCisjZGVmaW5lIFY0TDJfVFVORVJfQ0FQX0hXU0VFS19CT1VOREVECTB4MDAwNAorI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9IV1NFRUtfV1JBUAkweDAwMDgKKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfU1RFUkVPCQkweDAwMTAKKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfTEFORzIJCTB4MDAyMAorI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9TQVAJCTB4MDAyMAorI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9MQU5HMQkJMHgwMDQwCisjZGVmaW5lIFY0TDJfVFVORVJfQ0FQX1JEUwkJMHgwMDgwCisjZGVmaW5lIFY0TDJfVFVORVJfQ0FQX1JEU19CTE9DS19JTwkweDAxMDAKKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfUkRTX0NPTlRST0xTCTB4MDIwMAorI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9GUkVRX0JBTkRTCTB4MDQwMAorI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9IV1NFRUtfUFJPR19MSU0JMHgwODAwCisjZGVmaW5lIFY0TDJfVFVORVJfQ0FQXzFIWgkJMHgxMDAwCisKKy8qICBGbGFncyBmb3IgdGhlICdyeHN1YmNoYW5zJyBmaWVsZCAqLworI2RlZmluZSBWNEwyX1RVTkVSX1NVQl9NT05PCQkweDAwMDEKKyNkZWZpbmUgVjRMMl9UVU5FUl9TVUJfU1RFUkVPCQkweDAwMDIKKyNkZWZpbmUgVjRMMl9UVU5FUl9TVUJfTEFORzIJCTB4MDAwNAorI2RlZmluZSBWNEwyX1RVTkVSX1NVQl9TQVAJCTB4MDAwNAorI2RlZmluZSBWNEwyX1RVTkVSX1NVQl9MQU5HMQkJMHgwMDA4CisjZGVmaW5lIFY0TDJfVFVORVJfU1VCX1JEUwkJMHgwMDEwCisKKy8qICBWYWx1ZXMgZm9yIHRoZSAnYXVkbW9kZScgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9UVU5FUl9NT0RFX01PTk8JCTB4MDAwMAorI2RlZmluZSBWNEwyX1RVTkVSX01PREVfU1RFUkVPCQkweDAwMDEKKyNkZWZpbmUgVjRMMl9UVU5FUl9NT0RFX0xBTkcyCQkweDAwMDIKKyNkZWZpbmUgVjRMMl9UVU5FUl9NT0RFX1NBUAkJMHgwMDAyCisjZGVmaW5lIFY0TDJfVFVORVJfTU9ERV9MQU5HMQkJMHgwMDAzCisjZGVmaW5lIFY0TDJfVFVORVJfTU9ERV9MQU5HMV9MQU5HMgkweDAwMDQKKworc3RydWN0IHY0bDJfZnJlcXVlbmN5IHsKKwlfX3UzMgl0dW5lcjsKKwlfX3UzMgl0eXBlOwkvKiBlbnVtIHY0bDJfdHVuZXJfdHlwZSAqLworCV9fdTMyCWZyZXF1ZW5jeTsKKwlfX3UzMglyZXNlcnZlZFs4XTsKK307CisKKyNkZWZpbmUgVjRMMl9CQU5EX01PRFVMQVRJT05fVlNCCSgxIDw8IDEpCisjZGVmaW5lIFY0TDJfQkFORF9NT0RVTEFUSU9OX0ZNCQkoMSA8PCAyKQorI2RlZmluZSBWNEwyX0JBTkRfTU9EVUxBVElPTl9BTQkJKDEgPDwgMykKKworc3RydWN0IHY0bDJfZnJlcXVlbmN5X2JhbmQgeworCV9fdTMyCXR1bmVyOworCV9fdTMyCXR5cGU7CS8qIGVudW0gdjRsMl90dW5lcl90eXBlICovCisJX191MzIJaW5kZXg7CisJX191MzIJY2FwYWJpbGl0eTsKKwlfX3UzMglyYW5nZWxvdzsKKwlfX3UzMglyYW5nZWhpZ2g7CisJX191MzIJbW9kdWxhdGlvbjsKKwlfX3UzMglyZXNlcnZlZFs5XTsKK307CisKK3N0cnVjdCB2NGwyX2h3X2ZyZXFfc2VlayB7CisJX191MzIJdHVuZXI7CisJX191MzIJdHlwZTsJLyogZW51bSB2NGwyX3R1bmVyX3R5cGUgKi8KKwlfX3UzMglzZWVrX3Vwd2FyZDsKKwlfX3UzMgl3cmFwX2Fyb3VuZDsKKwlfX3UzMglzcGFjaW5nOworCV9fdTMyCXJhbmdlbG93OworCV9fdTMyCXJhbmdlaGlnaDsKKwlfX3UzMglyZXNlcnZlZFs1XTsKK307CisKKy8qCisgKglSIEQgUworICovCisKK3N0cnVjdCB2NGwyX3Jkc19kYXRhIHsKKwlfX3U4IAlsc2I7CisJX191OCAJbXNiOworCV9fdTggCWJsb2NrOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgVjRMMl9SRFNfQkxPQ0tfTVNLIAkgMHg3CisjZGVmaW5lIFY0TDJfUkRTX0JMT0NLX0EgCSAwCisjZGVmaW5lIFY0TDJfUkRTX0JMT0NLX0IgCSAxCisjZGVmaW5lIFY0TDJfUkRTX0JMT0NLX0MgCSAyCisjZGVmaW5lIFY0TDJfUkRTX0JMT0NLX0QgCSAzCisjZGVmaW5lIFY0TDJfUkRTX0JMT0NLX0NfQUxUIAkgNAorI2RlZmluZSBWNEwyX1JEU19CTE9DS19JTlZBTElEIAkgNworCisjZGVmaW5lIFY0TDJfUkRTX0JMT0NLX0NPUlJFQ1RFRCAweDQwCisjZGVmaW5lIFY0TDJfUkRTX0JMT0NLX0VSUk9SIAkgMHg4MAorCisvKgorICoJQSBVIEQgSSBPCisgKi8KK3N0cnVjdCB2NGwyX2F1ZGlvIHsKKwlfX3UzMglpbmRleDsKKwlfX3U4CW5hbWVbMzJdOworCV9fdTMyCWNhcGFiaWxpdHk7CisJX191MzIJbW9kZTsKKwlfX3UzMglyZXNlcnZlZFsyXTsKK307CisKKy8qICBGbGFncyBmb3IgdGhlICdjYXBhYmlsaXR5JyBmaWVsZCAqLworI2RlZmluZSBWNEwyX0FVRENBUF9TVEVSRU8JCTB4MDAwMDEKKyNkZWZpbmUgVjRMMl9BVURDQVBfQVZMCQkJMHgwMDAwMgorCisvKiAgRmxhZ3MgZm9yIHRoZSAnbW9kZScgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9BVURNT0RFX0FWTAkJMHgwMDAwMQorCitzdHJ1Y3QgdjRsMl9hdWRpb291dCB7CisJX191MzIJaW5kZXg7CisJX191OAluYW1lWzMyXTsKKwlfX3UzMgljYXBhYmlsaXR5OworCV9fdTMyCW1vZGU7CisJX191MzIJcmVzZXJ2ZWRbMl07Cit9OworCisvKgorICoJTSBQIEUgRyAgIFMgRSBSIFYgSSBDIEUgUworICovCisjaWYgMQorI2RlZmluZSBWNEwyX0VOQ19JRFhfRlJBTUVfSSAgICAoMCkKKyNkZWZpbmUgVjRMMl9FTkNfSURYX0ZSQU1FX1AgICAgKDEpCisjZGVmaW5lIFY0TDJfRU5DX0lEWF9GUkFNRV9CICAgICgyKQorI2RlZmluZSBWNEwyX0VOQ19JRFhfRlJBTUVfTUFTSyAoMHhmKQorCitzdHJ1Y3QgdjRsMl9lbmNfaWR4X2VudHJ5IHsKKwlfX3U2NCBvZmZzZXQ7CisJX191NjQgcHRzOworCV9fdTMyIGxlbmd0aDsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiByZXNlcnZlZFsyXTsKK307CisKKyNkZWZpbmUgVjRMMl9FTkNfSURYX0VOVFJJRVMgKDY0KQorc3RydWN0IHY0bDJfZW5jX2lkeCB7CisJX191MzIgZW50cmllczsKKwlfX3UzMiBlbnRyaWVzX2NhcDsKKwlfX3UzMiByZXNlcnZlZFs0XTsKKwlzdHJ1Y3QgdjRsMl9lbmNfaWR4X2VudHJ5IGVudHJ5W1Y0TDJfRU5DX0lEWF9FTlRSSUVTXTsKK307CisKKworI2RlZmluZSBWNEwyX0VOQ19DTURfU1RBUlQgICAgICAoMCkKKyNkZWZpbmUgVjRMMl9FTkNfQ01EX1NUT1AgICAgICAgKDEpCisjZGVmaW5lIFY0TDJfRU5DX0NNRF9QQVVTRSAgICAgICgyKQorI2RlZmluZSBWNEwyX0VOQ19DTURfUkVTVU1FICAgICAoMykKKworLyogRmxhZ3MgZm9yIFY0TDJfRU5DX0NNRF9TVE9QICovCisjZGVmaW5lIFY0TDJfRU5DX0NNRF9TVE9QX0FUX0dPUF9FTkQgICAgKDEgPDwgMCkKKworc3RydWN0IHY0bDJfZW5jb2Rlcl9jbWQgeworCV9fdTMyIGNtZDsKKwlfX3UzMiBmbGFnczsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3UzMiBkYXRhWzhdOworCQl9IHJhdzsKKwl9OworfTsKKworLyogRGVjb2RlciBjb21tYW5kcyAqLworI2RlZmluZSBWNEwyX0RFQ19DTURfU1RBUlQgICAgICAgKDApCisjZGVmaW5lIFY0TDJfREVDX0NNRF9TVE9QICAgICAgICAoMSkKKyNkZWZpbmUgVjRMMl9ERUNfQ01EX1BBVVNFICAgICAgICgyKQorI2RlZmluZSBWNEwyX0RFQ19DTURfUkVTVU1FICAgICAgKDMpCisKKy8qIEZsYWdzIGZvciBWNEwyX0RFQ19DTURfU1RBUlQgKi8KKyNkZWZpbmUgVjRMMl9ERUNfQ01EX1NUQVJUX01VVEVfQVVESU8JKDEgPDwgMCkKKworLyogRmxhZ3MgZm9yIFY0TDJfREVDX0NNRF9QQVVTRSAqLworI2RlZmluZSBWNEwyX0RFQ19DTURfUEFVU0VfVE9fQkxBQ0sJKDEgPDwgMCkKKworLyogRmxhZ3MgZm9yIFY0TDJfREVDX0NNRF9TVE9QICovCisjZGVmaW5lIFY0TDJfREVDX0NNRF9TVE9QX1RPX0JMQUNLCSgxIDw8IDApCisjZGVmaW5lIFY0TDJfREVDX0NNRF9TVE9QX0lNTUVESUFURUxZCSgxIDw8IDEpCisKKy8qIFBsYXkgZm9ybWF0IHJlcXVpcmVtZW50cyAocmV0dXJuZWQgYnkgdGhlIGRyaXZlcik6ICovCisKKy8qIFRoZSBkZWNvZGVyIGhhcyBubyBzcGVjaWFsIGZvcm1hdCByZXF1aXJlbWVudHMgKi8KKyNkZWZpbmUgVjRMMl9ERUNfU1RBUlRfRk1UX05PTkUJCSgwKQorLyogVGhlIGRlY29kZXIgcmVxdWlyZXMgZnVsbCBHT1BzICovCisjZGVmaW5lIFY0TDJfREVDX1NUQVJUX0ZNVF9HT1AJCSgxKQorCisvKiBUaGUgc3RydWN0dXJlIG11c3QgYmUgemVyb2VkIGJlZm9yZSB1c2UgYnkgdGhlIGFwcGxpY2F0aW9uCisgICBUaGlzIGVuc3VyZXMgaXQgY2FuIGJlIGV4dGVuZGVkIHNhZmVseSBpbiB0aGUgZnV0dXJlLiAqLworc3RydWN0IHY0bDJfZGVjb2Rlcl9jbWQgeworCV9fdTMyIGNtZDsKKwlfX3UzMiBmbGFnczsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3U2NCBwdHM7CisJCX0gc3RvcDsKKworCQlzdHJ1Y3QgeworCQkJLyogMCBvciAxMDAwIHNwZWNpZmllcyBub3JtYWwgc3BlZWQsCisJCQkgICAxIHNwZWNpZmllcyBmb3J3YXJkIHNpbmdsZSBzdGVwcGluZywKKwkJCSAgIC0xIHNwZWNpZmllcyBiYWNrd2FyZCBzaW5nbGUgc3RlcHBpbmcsCisJCQkgICA+MTogcGxheWJhY2sgYXQgc3BlZWQvMTAwMCBvZiB0aGUgbm9ybWFsIHNwZWVkLAorCQkJICAgPC0xOiByZXZlcnNlIHBsYXliYWNrIGF0ICgtc3BlZWQvMTAwMCkgb2YgdGhlIG5vcm1hbCBzcGVlZC4gKi8KKwkJCV9fczMyIHNwZWVkOworCQkJX191MzIgZm9ybWF0OworCQl9IHN0YXJ0OworCisJCXN0cnVjdCB7CisJCQlfX3UzMiBkYXRhWzE2XTsKKwkJfSByYXc7CisJfTsKK307CisjZW5kaWYKKworCisvKgorICoJRCBBIFQgQSAgIFMgRSBSIFYgSSBDIEUgUyAgICggViBCIEkgKQorICoKKyAqCURhdGEgc2VydmljZXMgQVBJIGJ5IE1pY2hhZWwgU2NoaW1laworICovCisKKy8qIFJhdyBWQkkgKi8KK3N0cnVjdCB2NGwyX3ZiaV9mb3JtYXQgeworCV9fdTMyCXNhbXBsaW5nX3JhdGU7CQkvKiBpbiAxIEh6ICovCisJX191MzIJb2Zmc2V0OworCV9fdTMyCXNhbXBsZXNfcGVyX2xpbmU7CisJX191MzIJc2FtcGxlX2Zvcm1hdDsJCS8qIFY0TDJfUElYX0ZNVF8qICovCisJX19zMzIJc3RhcnRbMl07CisJX191MzIJY291bnRbMl07CisJX191MzIJZmxhZ3M7CQkJLyogVjRMMl9WQklfKiAqLworCV9fdTMyCXJlc2VydmVkWzJdOwkJLyogbXVzdCBiZSB6ZXJvICovCit9OworCisvKiAgVkJJIGZsYWdzICAqLworI2RlZmluZSBWNEwyX1ZCSV9VTlNZTkMJCSgxIDw8IDApCisjZGVmaW5lIFY0TDJfVkJJX0lOVEVSTEFDRUQJKDEgPDwgMSkKKworLyogSVRVLVIgc3RhcnQgbGluZXMgZm9yIGVhY2ggZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9WQklfSVRVXzUyNV9GMV9TVEFSVCAoMSkKKyNkZWZpbmUgVjRMMl9WQklfSVRVXzUyNV9GMl9TVEFSVCAoMjY0KQorI2RlZmluZSBWNEwyX1ZCSV9JVFVfNjI1X0YxX1NUQVJUICgxKQorI2RlZmluZSBWNEwyX1ZCSV9JVFVfNjI1X0YyX1NUQVJUICgzMTQpCisKKy8qIFNsaWNlZCBWQkkKKyAqCisgKiAgICBUaGlzIGltcGxlbWVudHMgaXMgYSBwcm9wb3NhbCBWNEwyIEFQSSB0byBhbGxvdyBTTElDRUQgVkJJCisgKiByZXF1aXJlZCBmb3Igc29tZSBoYXJkd2FyZSBlbmNvZGVycy4gSXQgc2hvdWxkIGNoYW5nZSB3aXRob3V0CisgKiBub3RpY2UgaW4gdGhlIGRlZmluaXRpdmUgaW1wbGVtZW50YXRpb24uCisgKi8KKworc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9mb3JtYXQgeworCV9fdTE2ICAgc2VydmljZV9zZXQ7CisJLyogc2VydmljZV9saW5lc1swXVsuLi5dIHNwZWNpZmllcyBsaW5lcyAwLTIzICgxLTIzIHVzZWQpIG9mIHRoZSBmaXJzdCBmaWVsZAorCSAgIHNlcnZpY2VfbGluZXNbMV1bLi4uXSBzcGVjaWZpZXMgbGluZXMgMC0yMyAoMS0yMyB1c2VkKSBvZiB0aGUgc2Vjb25kIGZpZWxkCisJCQkJIChlcXVhbHMgZnJhbWUgbGluZXMgMzEzLTMzNiBmb3IgNjI1IGxpbmUgdmlkZW8KKwkJCQkgIHN0YW5kYXJkcywgMjYzLTI4NiBmb3IgNTI1IGxpbmUgc3RhbmRhcmRzKSAqLworCV9fdTE2ICAgc2VydmljZV9saW5lc1syXVsyNF07CisJX191MzIgICBpb19zaXplOworCV9fdTMyICAgcmVzZXJ2ZWRbMl07ICAgICAgICAgICAgLyogbXVzdCBiZSB6ZXJvICovCit9OworCisvKiBUZWxldGV4dCBXb3JsZCBTeXN0ZW0gVGVsZXRleHQKKyAgIChXU1QpLCBkZWZpbmVkIG9uIElUVS1SIEJULjY1My0yICovCisjZGVmaW5lIFY0TDJfU0xJQ0VEX1RFTEVURVhUX0IgICAgICAgICAgKDB4MDAwMSkKKy8qIFZpZGVvIFByb2dyYW0gU3lzdGVtLCBkZWZpbmVkIG9uIEVUUyAzMDAgMjMxKi8KKyNkZWZpbmUgVjRMMl9TTElDRURfVlBTICAgICAgICAgICAgICAgICAoMHgwNDAwKQorLyogQ2xvc2VkIENhcHRpb24sIGRlZmluZWQgb24gRUlBLTYwOCAqLworI2RlZmluZSBWNEwyX1NMSUNFRF9DQVBUSU9OXzUyNSAgICAgICAgICgweDEwMDApCisvKiBXaWRlIFNjcmVlbiBTeXN0ZW0sIGRlZmluZWQgb24gSVRVLVIgQlQxMTE5LjEgKi8KKyNkZWZpbmUgVjRMMl9TTElDRURfV1NTXzYyNSAgICAgICAgICAgICAoMHg0MDAwKQorCisjZGVmaW5lIFY0TDJfU0xJQ0VEX1ZCSV81MjUgICAgICAgICAgICAgKFY0TDJfU0xJQ0VEX0NBUFRJT05fNTI1KQorI2RlZmluZSBWNEwyX1NMSUNFRF9WQklfNjI1ICAgICAgICAgICAgIChWNEwyX1NMSUNFRF9URUxFVEVYVF9CIHwgVjRMMl9TTElDRURfVlBTIHwgVjRMMl9TTElDRURfV1NTXzYyNSkKKworc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9jYXAgeworCV9fdTE2ICAgc2VydmljZV9zZXQ7CisJLyogc2VydmljZV9saW5lc1swXVsuLi5dIHNwZWNpZmllcyBsaW5lcyAwLTIzICgxLTIzIHVzZWQpIG9mIHRoZSBmaXJzdCBmaWVsZAorCSAgIHNlcnZpY2VfbGluZXNbMV1bLi4uXSBzcGVjaWZpZXMgbGluZXMgMC0yMyAoMS0yMyB1c2VkKSBvZiB0aGUgc2Vjb25kIGZpZWxkCisJCQkJIChlcXVhbHMgZnJhbWUgbGluZXMgMzEzLTMzNiBmb3IgNjI1IGxpbmUgdmlkZW8KKwkJCQkgIHN0YW5kYXJkcywgMjYzLTI4NiBmb3IgNTI1IGxpbmUgc3RhbmRhcmRzKSAqLworCV9fdTE2ICAgc2VydmljZV9saW5lc1syXVsyNF07CisJX191MzIJdHlwZTsJCS8qIGVudW0gdjRsMl9idWZfdHlwZSAqLworCV9fdTMyICAgcmVzZXJ2ZWRbM107ICAgIC8qIG11c3QgYmUgMCAqLworfTsKKworc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9kYXRhIHsKKwlfX3UzMiAgIGlkOworCV9fdTMyICAgZmllbGQ7ICAgICAgICAgIC8qIDA6IGZpcnN0IGZpZWxkLCAxOiBzZWNvbmQgZmllbGQgKi8KKwlfX3UzMiAgIGxpbmU7ICAgICAgICAgICAvKiAxLTIzICovCisJX191MzIgICByZXNlcnZlZDsgICAgICAgLyogbXVzdCBiZSAwICovCisJX191OCAgICBkYXRhWzQ4XTsKK307CisKKy8qCisgKiBTbGljZWQgVkJJIGRhdGEgaW5zZXJ0ZWQgaW50byBNUEVHIFN0cmVhbXMKKyAqLworCisvKgorICogVjRMMl9NUEVHX1NUUkVBTV9WQklfRk1UX0lWVFY6CisgKgorICogU3RydWN0dXJlIG9mIHBheWxvYWQgY29udGFpbmVkIGluIGFuIE1QRUcgMiBQcml2YXRlIFN0cmVhbSAxIFBFUyBQYWNrZXQgaW4gYW4KKyAqIE1QRUctMiBQcm9ncmFtIFBhY2sgdGhhdCBjb250YWlucyBWNEwyX01QRUdfU1RSRUFNX1ZCSV9GTVRfSVZUViBTbGljZWQgVkJJCisgKiBkYXRhCisgKgorICogTm90ZSwgdGhlIE1QRUctMiBQcm9ncmFtIFBhY2sgYW5kIFByaXZhdGUgU3RyZWFtIDEgUEVTIHBhY2tldCBoZWFkZXIKKyAqIGRlZmluaXRpb25zIGFyZSBub3QgaW5jbHVkZWQgaGVyZS4gIFNlZSB0aGUgTVBFRy0yIHNwZWNpZmljYXRpb25zIGZvciBkZXRhaWxzCisgKiBvbiB0aGVzZSBoZWFkZXJzLgorICovCisKKy8qIExpbmUgdHlwZSBJRHMgKi8KKyNkZWZpbmUgVjRMMl9NUEVHX1ZCSV9JVlRWX1RFTEVURVhUX0IgICAgICgxKQorI2RlZmluZSBWNEwyX01QRUdfVkJJX0lWVFZfQ0FQVElPTl81MjUgICAgKDQpCisjZGVmaW5lIFY0TDJfTVBFR19WQklfSVZUVl9XU1NfNjI1ICAgICAgICAoNSkKKyNkZWZpbmUgVjRMMl9NUEVHX1ZCSV9JVlRWX1ZQUyAgICAgICAgICAgICg3KQorCitzdHJ1Y3QgdjRsMl9tcGVnX3ZiaV9pdHYwX2xpbmUgeworCV9fdTggaWQ7CS8qIE9uZSBvZiBWNEwyX01QRUdfVkJJX0lWVFZfKiBhYm92ZSAqLworCV9fdTggZGF0YVs0Ml07CS8qIFNsaWNlZCBWQkkgZGF0YSBmb3IgdGhlIGxpbmUgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgdjRsMl9tcGVnX3ZiaV9pdHYwIHsKKwlfX2xlMzIgbGluZW1hc2tbMl07IC8qIEJpdG1hc2tzIG9mIFZCSSBzZXJ2aWNlIGxpbmVzIHByZXNlbnQgKi8KKwlzdHJ1Y3QgdjRsMl9tcGVnX3ZiaV9pdHYwX2xpbmUgbGluZVszNV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHY0bDJfbXBlZ192YmlfSVRWMCB7CisJc3RydWN0IHY0bDJfbXBlZ192YmlfaXR2MF9saW5lIGxpbmVbMzZdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgVjRMMl9NUEVHX1ZCSV9JVlRWX01BR0lDMAkiaXR2MCIKKyNkZWZpbmUgVjRMMl9NUEVHX1ZCSV9JVlRWX01BR0lDMQkiSVRWMCIKKworc3RydWN0IHY0bDJfbXBlZ192YmlfZm10X2l2dHYgeworCV9fdTggbWFnaWNbNF07CisJdW5pb24geworCQlzdHJ1Y3QgdjRsMl9tcGVnX3ZiaV9pdHYwIGl0djA7CisJCXN0cnVjdCB2NGwyX21wZWdfdmJpX0lUVjAgSVRWMDsKKwl9OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKglBIEcgRyBSIEUgRyBBIFQgRSAgIFMgVCBSIFUgQyBUIFUgUiBFIFMKKyAqLworCisvKioKKyAqIHN0cnVjdCB2NGwyX3BsYW5lX3BpeF9mb3JtYXQgLSBhZGRpdGlvbmFsLCBwZXItcGxhbmUgZm9ybWF0IGRlZmluaXRpb24KKyAqIEBzaXplaW1hZ2U6CQltYXhpbXVtIHNpemUgaW4gYnl0ZXMgcmVxdWlyZWQgZm9yIGRhdGEsIGZvciB3aGljaAorICoJCQl0aGlzIHBsYW5lIHdpbGwgYmUgdXNlZAorICogQGJ5dGVzcGVybGluZToJZGlzdGFuY2UgaW4gYnl0ZXMgYmV0d2VlbiB0aGUgbGVmdG1vc3QgcGl4ZWxzIGluIHR3bworICoJCQlhZGphY2VudCBsaW5lcworICovCitzdHJ1Y3QgdjRsMl9wbGFuZV9waXhfZm9ybWF0IHsKKwlfX3UzMgkJc2l6ZWltYWdlOworCV9fdTMyCQlieXRlc3BlcmxpbmU7CisJX191MTYJCXJlc2VydmVkWzZdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qKgorICogc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgLSBtdWx0aXBsYW5hciBmb3JtYXQgZGVmaW5pdGlvbgorICogQHdpZHRoOgkJaW1hZ2Ugd2lkdGggaW4gcGl4ZWxzCisgKiBAaGVpZ2h0OgkJaW1hZ2UgaGVpZ2h0IGluIHBpeGVscworICogQHBpeGVsZm9ybWF0OglsaXR0bGUgZW5kaWFuIGZvdXIgY2hhcmFjdGVyIGNvZGUgKGZvdXJjYykKKyAqIEBmaWVsZDoJCWVudW0gdjRsMl9maWVsZDsgZmllbGQgb3JkZXIgKGZvciBpbnRlcmxhY2VkIHZpZGVvKQorICogQGNvbG9yc3BhY2U6CQllbnVtIHY0bDJfY29sb3JzcGFjZTsgc3VwcGxlbWVudGFsIHRvIHBpeGVsZm9ybWF0CisgKiBAcGxhbmVfZm10OgkJcGVyLXBsYW5lIGluZm9ybWF0aW9uCisgKiBAbnVtX3BsYW5lczoJCW51bWJlciBvZiBwbGFuZXMgZm9yIHRoaXMgZm9ybWF0CisgKiBAZmxhZ3M6CQlmb3JtYXQgZmxhZ3MgKFY0TDJfUElYX0ZNVF9GTEFHXyopCisgKiBAeWNiY3JfZW5jOgkJZW51bSB2NGwyX3ljYmNyX2VuY29kaW5nLCBZJ0NiQ3IgZW5jb2RpbmcKKyAqIEBxdWFudGl6YXRpb246CWVudW0gdjRsMl9xdWFudGl6YXRpb24sIGNvbG9yc3BhY2UgcXVhbnRpemF0aW9uCisgKiBAeGZlcl9mdW5jOgkJZW51bSB2NGwyX3hmZXJfZnVuYywgY29sb3JzcGFjZSB0cmFuc2ZlciBmdW5jdGlvbgorICovCitzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSB7CisJX191MzIJCQkJd2lkdGg7CisJX191MzIJCQkJaGVpZ2h0OworCV9fdTMyCQkJCXBpeGVsZm9ybWF0OworCV9fdTMyCQkJCWZpZWxkOworCV9fdTMyCQkJCWNvbG9yc3BhY2U7CisKKwlzdHJ1Y3QgdjRsMl9wbGFuZV9waXhfZm9ybWF0CXBsYW5lX2ZtdFtWSURFT19NQVhfUExBTkVTXTsKKwlfX3U4CQkJCW51bV9wbGFuZXM7CisJX191OAkJCQlmbGFnczsKKwkgdW5pb24geworCQlfX3U4CQkJCXljYmNyX2VuYzsKKwkJX191OAkJCQloc3ZfZW5jOworCX07CisJX191OAkJCQlxdWFudGl6YXRpb247CisJX191OAkJCQl4ZmVyX2Z1bmM7CisJX191OAkJCQlyZXNlcnZlZFs3XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKioKKyAqIHN0cnVjdCB2NGwyX3Nkcl9mb3JtYXQgLSBTRFIgZm9ybWF0IGRlZmluaXRpb24KKyAqIEBwaXhlbGZvcm1hdDoJbGl0dGxlIGVuZGlhbiBmb3VyIGNoYXJhY3RlciBjb2RlIChmb3VyY2MpCisgKiBAYnVmZmVyc2l6ZToJCW1heGltdW0gc2l6ZSBpbiBieXRlcyByZXF1aXJlZCBmb3IgZGF0YQorICovCitzdHJ1Y3QgdjRsMl9zZHJfZm9ybWF0IHsKKwlfX3UzMgkJCQlwaXhlbGZvcm1hdDsKKwlfX3UzMgkJCQlidWZmZXJzaXplOworCV9fdTgJCQkJcmVzZXJ2ZWRbMjRdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qKgorICogc3RydWN0IHY0bDJfbWV0YV9mb3JtYXQgLSBtZXRhZGF0YSBmb3JtYXQgZGVmaW5pdGlvbgorICogQGRhdGFmb3JtYXQ6CQlsaXR0bGUgZW5kaWFuIGZvdXIgY2hhcmFjdGVyIGNvZGUgKGZvdXJjYykKKyAqIEBidWZmZXJzaXplOgkJbWF4aW11bSBzaXplIGluIGJ5dGVzIHJlcXVpcmVkIGZvciBkYXRhCisgKi8KK3N0cnVjdCB2NGwyX21ldGFfZm9ybWF0IHsKKwlfX3UzMgkJCQlkYXRhZm9ybWF0OworCV9fdTMyCQkJCWJ1ZmZlcnNpemU7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoqCisgKiBzdHJ1Y3QgdjRsMl9mb3JtYXQgLSBzdHJlYW0gZGF0YSBmb3JtYXQKKyAqIEB0eXBlOgllbnVtIHY0bDJfYnVmX3R5cGU7IHR5cGUgb2YgdGhlIGRhdGEgc3RyZWFtCisgKiBAcGl4OglkZWZpbml0aW9uIG9mIGFuIGltYWdlIGZvcm1hdAorICogQHBpeF9tcDoJZGVmaW5pdGlvbiBvZiBhIG11bHRpcGxhbmFyIGltYWdlIGZvcm1hdAorICogQHdpbjoJZGVmaW5pdGlvbiBvZiBhbiBvdmVybGFpZCBpbWFnZQorICogQHZiaToJcmF3IFZCSSBjYXB0dXJlIG9yIG91dHB1dCBwYXJhbWV0ZXJzCisgKiBAc2xpY2VkOglzbGljZWQgVkJJIGNhcHR1cmUgb3Igb3V0cHV0IHBhcmFtZXRlcnMKKyAqIEByYXdfZGF0YToJcGxhY2Vob2xkZXIgZm9yIGZ1dHVyZSBleHRlbnNpb25zIGFuZCBjdXN0b20gZm9ybWF0cworICovCitzdHJ1Y3QgdjRsMl9mb3JtYXQgeworCV9fdTMyCSB0eXBlOworCXVuaW9uIHsKKwkJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdAkJcGl4OyAgICAgLyogVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFICovCisJCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lCXBpeF9tcDsgIC8qIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUgKi8KKwkJc3RydWN0IHY0bDJfd2luZG93CQl3aW47ICAgICAvKiBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVkgKi8KKwkJc3RydWN0IHY0bDJfdmJpX2Zvcm1hdAkJdmJpOyAgICAgLyogVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSAqLworCQlzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2Zvcm1hdAlzbGljZWQ7ICAvKiBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfQ0FQVFVSRSAqLworCQlzdHJ1Y3QgdjRsMl9zZHJfZm9ybWF0CQlzZHI7ICAgICAvKiBWNEwyX0JVRl9UWVBFX1NEUl9DQVBUVVJFICovCisJCXN0cnVjdCB2NGwyX21ldGFfZm9ybWF0CQltZXRhOyAgICAvKiBWNEwyX0JVRl9UWVBFX01FVEFfQ0FQVFVSRSAqLworCQlfX3U4CXJhd19kYXRhWzIwMF07ICAgICAgICAgICAgICAgICAgIC8qIHVzZXItZGVmaW5lZCAqLworCX0gZm10OworfTsKKworLyoJU3RyZWFtIHR5cGUtZGVwZW5kZW50IHBhcmFtZXRlcnMKKyAqLworc3RydWN0IHY0bDJfc3RyZWFtcGFybSB7CisJX191MzIJIHR5cGU7CQkJLyogZW51bSB2NGwyX2J1Zl90eXBlICovCisJdW5pb24geworCQlzdHJ1Y3QgdjRsMl9jYXB0dXJlcGFybQljYXB0dXJlOworCQlzdHJ1Y3QgdjRsMl9vdXRwdXRwYXJtCW91dHB1dDsKKwkJX191OAlyYXdfZGF0YVsyMDBdOyAgLyogdXNlci1kZWZpbmVkICovCisJfSBwYXJtOworfTsKKworLyoKKyAqCUUgViBFIE4gVCBTCisgKi8KKworI2RlZmluZSBWNEwyX0VWRU5UX0FMTAkJCQkwCisjZGVmaW5lIFY0TDJfRVZFTlRfVlNZTkMJCQkxCisjZGVmaW5lIFY0TDJfRVZFTlRfRU9TCQkJCTIKKyNkZWZpbmUgVjRMMl9FVkVOVF9DVFJMCQkJCTMKKyNkZWZpbmUgVjRMMl9FVkVOVF9GUkFNRV9TWU5DCQkJNAorI2RlZmluZSBWNEwyX0VWRU5UX1NPVVJDRV9DSEFOR0UJCTUKKyNkZWZpbmUgVjRMMl9FVkVOVF9NT1RJT05fREVUCQkJNgorI2RlZmluZSBWNEwyX0VWRU5UX1BSSVZBVEVfU1RBUlQJCTB4MDgwMDAwMDAKKworLyogUGF5bG9hZCBmb3IgVjRMMl9FVkVOVF9WU1lOQyAqLworc3RydWN0IHY0bDJfZXZlbnRfdnN5bmMgeworCS8qIENhbiBiZSBWNEwyX0ZJRUxEX0FOWSwgX05PTkUsIF9UT1Agb3IgX0JPVFRPTSAqLworCV9fdTggZmllbGQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogUGF5bG9hZCBmb3IgVjRMMl9FVkVOVF9DVFJMICovCisjZGVmaW5lIFY0TDJfRVZFTlRfQ1RSTF9DSF9WQUxVRQkJKDEgPDwgMCkKKyNkZWZpbmUgVjRMMl9FVkVOVF9DVFJMX0NIX0ZMQUdTCQkoMSA8PCAxKQorI2RlZmluZSBWNEwyX0VWRU5UX0NUUkxfQ0hfUkFOR0UJCSgxIDw8IDIpCisKK3N0cnVjdCB2NGwyX2V2ZW50X2N0cmwgeworCV9fdTMyIGNoYW5nZXM7CisJX191MzIgdHlwZTsKKwl1bmlvbiB7CisJCV9fczMyIHZhbHVlOworCQlfX3M2NCB2YWx1ZTY0OworCX07CisJX191MzIgZmxhZ3M7CisJX19zMzIgbWluaW11bTsKKwlfX3MzMiBtYXhpbXVtOworCV9fczMyIHN0ZXA7CisJX19zMzIgZGVmYXVsdF92YWx1ZTsKK307CisKK3N0cnVjdCB2NGwyX2V2ZW50X2ZyYW1lX3N5bmMgeworCV9fdTMyIGZyYW1lX3NlcXVlbmNlOworfTsKKworI2RlZmluZSBWNEwyX0VWRU5UX1NSQ19DSF9SRVNPTFVUSU9OCQkoMSA8PCAwKQorCitzdHJ1Y3QgdjRsMl9ldmVudF9zcmNfY2hhbmdlIHsKKwlfX3UzMiBjaGFuZ2VzOworfTsKKworI2RlZmluZSBWNEwyX0VWRU5UX01EX0ZMX0hBVkVfRlJBTUVfU0VRCSgxIDw8IDApCisKKy8qKgorICogc3RydWN0IHY0bDJfZXZlbnRfbW90aW9uX2RldCAtIG1vdGlvbiBkZXRlY3Rpb24gZXZlbnQKKyAqIEBmbGFnczogICAgICAgICAgICAgaWYgVjRMMl9FVkVOVF9NRF9GTF9IQVZFX0ZSQU1FX1NFUSBpcyBzZXQsIHRoZW4gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgIGZyYW1lX3NlcXVlbmNlIGZpZWxkIGlzIHZhbGlkLgorICogQGZyYW1lX3NlcXVlbmNlOiAgICB0aGUgZnJhbWUgc2VxdWVuY2UgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LgorICogQHJlZ2lvbl9tYXNrOiAgICAgICB3aGljaCByZWdpb25zIGRldGVjdGVkIG1vdGlvbi4KKyAqLworc3RydWN0IHY0bDJfZXZlbnRfbW90aW9uX2RldCB7CisJX191MzIgZmxhZ3M7CisJX191MzIgZnJhbWVfc2VxdWVuY2U7CisJX191MzIgcmVnaW9uX21hc2s7Cit9OworCitzdHJ1Y3QgdjRsMl9ldmVudCB7CisJX191MzIJCQkJdHlwZTsKKwl1bmlvbiB7CisJCXN0cnVjdCB2NGwyX2V2ZW50X3ZzeW5jCQl2c3luYzsKKwkJc3RydWN0IHY0bDJfZXZlbnRfY3RybAkJY3RybDsKKwkJc3RydWN0IHY0bDJfZXZlbnRfZnJhbWVfc3luYwlmcmFtZV9zeW5jOworCQlzdHJ1Y3QgdjRsMl9ldmVudF9zcmNfY2hhbmdlCXNyY19jaGFuZ2U7CisJCXN0cnVjdCB2NGwyX2V2ZW50X21vdGlvbl9kZXQJbW90aW9uX2RldDsKKwkJX191OAkJCQlkYXRhWzY0XTsKKwl9IHU7CisJX191MzIJCQkJcGVuZGluZzsKKwlfX3UzMgkJCQlzZXF1ZW5jZTsKKwlzdHJ1Y3QgdGltZXNwZWMJCQl0aW1lc3RhbXA7CisJX191MzIJCQkJaWQ7CisJX191MzIJCQkJcmVzZXJ2ZWRbOF07Cit9OworCisjZGVmaW5lIFY0TDJfRVZFTlRfU1VCX0ZMX1NFTkRfSU5JVElBTAkJKDEgPDwgMCkKKyNkZWZpbmUgVjRMMl9FVkVOVF9TVUJfRkxfQUxMT1dfRkVFREJBQ0sJKDEgPDwgMSkKKworc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uIHsKKwlfX3UzMgkJCQl0eXBlOworCV9fdTMyCQkJCWlkOworCV9fdTMyCQkJCWZsYWdzOworCV9fdTMyCQkJCXJlc2VydmVkWzVdOworfTsKKworLyoKKyAqCUEgRCBWIEEgTiBDIEUgRCAgIEQgRSBCIFUgRyBHIEkgTiBHCisgKgorICoJTk9URTogRVhQRVJJTUVOVEFMIEFQSSwgTkVWRVIgUkVMWSBPTiBUSElTIElOIEFQUExJQ0FUSU9OUyEKKyAqCUZPUiBERUJVR0dJTkcsIFRFU1RJTkcgQU5EIElOVEVSTkFMIFVTRSBPTkxZIQorICovCisKKy8qIFZJRElPQ19EQkdfR19SRUdJU1RFUiBhbmQgVklESU9DX0RCR19TX1JFR0lTVEVSICovCisKKyNkZWZpbmUgVjRMMl9DSElQX01BVENIX0JSSURHRSAgICAgIDAgIC8qIE1hdGNoIGFnYWluc3QgY2hpcCBJRCBvbiB0aGUgYnJpZGdlICgwIGZvciB0aGUgYnJpZGdlKSAqLworI2RlZmluZSBWNEwyX0NISVBfTUFUQ0hfU1VCREVWICAgICAgNCAgLyogTWF0Y2ggYWdhaW5zdCBzdWJkZXYgaW5kZXggKi8KKworLyogVGhlIGZvbGxvd2luZyBmb3VyIGRlZmluZXMgYXJlIG5vIGxvbmdlciBpbiB1c2UgKi8KKyNkZWZpbmUgVjRMMl9DSElQX01BVENIX0hPU1QgVjRMMl9DSElQX01BVENIX0JSSURHRQorI2RlZmluZSBWNEwyX0NISVBfTUFUQ0hfSTJDX0RSSVZFUiAgMSAgLyogTWF0Y2ggYWdhaW5zdCBJMkMgZHJpdmVyIG5hbWUgKi8KKyNkZWZpbmUgVjRMMl9DSElQX01BVENIX0kyQ19BRERSICAgIDIgIC8qIE1hdGNoIGFnYWluc3QgSTJDIDctYml0IGFkZHJlc3MgKi8KKyNkZWZpbmUgVjRMMl9DSElQX01BVENIX0FDOTcgICAgICAgIDMgIC8qIE1hdGNoIGFnYWluc3QgYW5jaWxsYXJ5IEFDOTcgY2hpcCAqLworCitzdHJ1Y3QgdjRsMl9kYmdfbWF0Y2ggeworCV9fdTMyIHR5cGU7IC8qIE1hdGNoIHR5cGUgKi8KKwl1bmlvbiB7ICAgICAvKiBNYXRjaCB0aGlzIGNoaXAsIG1lYW5pbmcgZGV0ZXJtaW5lZCBieSB0eXBlICovCisJCV9fdTMyIGFkZHI7CisJCWNoYXIgbmFtZVszMl07CisJfTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgeworCXN0cnVjdCB2NGwyX2RiZ19tYXRjaCBtYXRjaDsKKwlfX3UzMiBzaXplOwkvKiByZWdpc3RlciBzaXplIGluIGJ5dGVzICovCisJX191NjQgcmVnOworCV9fdTY0IHZhbDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFY0TDJfQ0hJUF9GTF9SRUFEQUJMRSAoMSA8PCAwKQorI2RlZmluZSBWNEwyX0NISVBfRkxfV1JJVEFCTEUgKDEgPDwgMSkKKworLyogVklESU9DX0RCR19HX0NISVBfSU5GTyAqLworc3RydWN0IHY0bDJfZGJnX2NoaXBfaW5mbyB7CisJc3RydWN0IHY0bDJfZGJnX21hdGNoIG1hdGNoOworCWNoYXIgbmFtZVszMl07CisJX191MzIgZmxhZ3M7CisJX191MzIgcmVzZXJ2ZWRbMzJdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qKgorICogc3RydWN0IHY0bDJfY3JlYXRlX2J1ZmZlcnMgLSBWSURJT0NfQ1JFQVRFX0JVRlMgYXJndW1lbnQKKyAqIEBpbmRleDoJb24gcmV0dXJuLCBpbmRleCBvZiB0aGUgZmlyc3QgY3JlYXRlZCBidWZmZXIKKyAqIEBjb3VudDoJZW50cnk6IG51bWJlciBvZiByZXF1ZXN0ZWQgYnVmZmVycywKKyAqCQlyZXR1cm46IG51bWJlciBvZiBjcmVhdGVkIGJ1ZmZlcnMKKyAqIEBtZW1vcnk6CWVudW0gdjRsMl9tZW1vcnk7IGJ1ZmZlciBtZW1vcnkgdHlwZQorICogQGZvcm1hdDoJZnJhbWUgZm9ybWF0LCBmb3Igd2hpY2ggYnVmZmVycyBhcmUgcmVxdWVzdGVkCisgKiBAcmVzZXJ2ZWQ6CWZ1dHVyZSBleHRlbnNpb25zCisgKi8KK3N0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzIHsKKwlfX3UzMgkJCWluZGV4OworCV9fdTMyCQkJY291bnQ7CisJX191MzIJCQltZW1vcnk7CisJc3RydWN0IHY0bDJfZm9ybWF0CWZvcm1hdDsKKwlfX3UzMgkJCXJlc2VydmVkWzhdOworfTsKKworLyoKKyAqCUkgTyBDIFQgTCAgIEMgTyBEIEUgUyAgIEYgTyBSICAgViBJIEQgRSBPICAgRCBFIFYgSSBDIEUgUworICoKKyAqLworI2RlZmluZSBWSURJT0NfUVVFUllDQVAJCSBfSU9SKCdWJywgIDAsIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkpCisjZGVmaW5lIFZJRElPQ19SRVNFUlZFRAkJICBfSU8oJ1YnLCAgMSkKKyNkZWZpbmUgVklESU9DX0VOVU1fRk1UICAgICAgICAgX0lPV1IoJ1YnLCAgMiwgc3RydWN0IHY0bDJfZm10ZGVzYykKKyNkZWZpbmUgVklESU9DX0dfRk1UCQlfSU9XUignVicsICA0LCBzdHJ1Y3QgdjRsMl9mb3JtYXQpCisjZGVmaW5lIFZJRElPQ19TX0ZNVAkJX0lPV1IoJ1YnLCAgNSwgc3RydWN0IHY0bDJfZm9ybWF0KQorI2RlZmluZSBWSURJT0NfUkVRQlVGUwkJX0lPV1IoJ1YnLCAgOCwgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMpCisjZGVmaW5lIFZJRElPQ19RVUVSWUJVRgkJX0lPV1IoJ1YnLCAgOSwgc3RydWN0IHY0bDJfYnVmZmVyKQorI2RlZmluZSBWSURJT0NfR19GQlVGCQkgX0lPUignVicsIDEwLCBzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlcikKKyNkZWZpbmUgVklESU9DX1NfRkJVRgkJIF9JT1coJ1YnLCAxMSwgc3RydWN0IHY0bDJfZnJhbWVidWZmZXIpCisjZGVmaW5lIFZJRElPQ19PVkVSTEFZCQkgX0lPVygnVicsIDE0LCBpbnQpCisjZGVmaW5lIFZJRElPQ19RQlVGCQlfSU9XUignVicsIDE1LCBzdHJ1Y3QgdjRsMl9idWZmZXIpCisjZGVmaW5lIFZJRElPQ19FWFBCVUYJCV9JT1dSKCdWJywgMTYsIHN0cnVjdCB2NGwyX2V4cG9ydGJ1ZmZlcikKKyNkZWZpbmUgVklESU9DX0RRQlVGCQlfSU9XUignVicsIDE3LCBzdHJ1Y3QgdjRsMl9idWZmZXIpCisjZGVmaW5lIFZJRElPQ19TVFJFQU1PTgkJIF9JT1coJ1YnLCAxOCwgaW50KQorI2RlZmluZSBWSURJT0NfU1RSRUFNT0ZGCSBfSU9XKCdWJywgMTksIGludCkKKyNkZWZpbmUgVklESU9DX0dfUEFSTQkJX0lPV1IoJ1YnLCAyMSwgc3RydWN0IHY0bDJfc3RyZWFtcGFybSkKKyNkZWZpbmUgVklESU9DX1NfUEFSTQkJX0lPV1IoJ1YnLCAyMiwgc3RydWN0IHY0bDJfc3RyZWFtcGFybSkKKyNkZWZpbmUgVklESU9DX0dfU1RECQkgX0lPUignVicsIDIzLCB2NGwyX3N0ZF9pZCkKKyNkZWZpbmUgVklESU9DX1NfU1RECQkgX0lPVygnVicsIDI0LCB2NGwyX3N0ZF9pZCkKKyNkZWZpbmUgVklESU9DX0VOVU1TVEQJCV9JT1dSKCdWJywgMjUsIHN0cnVjdCB2NGwyX3N0YW5kYXJkKQorI2RlZmluZSBWSURJT0NfRU5VTUlOUFVUCV9JT1dSKCdWJywgMjYsIHN0cnVjdCB2NGwyX2lucHV0KQorI2RlZmluZSBWSURJT0NfR19DVFJMCQlfSU9XUignVicsIDI3LCBzdHJ1Y3QgdjRsMl9jb250cm9sKQorI2RlZmluZSBWSURJT0NfU19DVFJMCQlfSU9XUignVicsIDI4LCBzdHJ1Y3QgdjRsMl9jb250cm9sKQorI2RlZmluZSBWSURJT0NfR19UVU5FUgkJX0lPV1IoJ1YnLCAyOSwgc3RydWN0IHY0bDJfdHVuZXIpCisjZGVmaW5lIFZJRElPQ19TX1RVTkVSCQkgX0lPVygnVicsIDMwLCBzdHJ1Y3QgdjRsMl90dW5lcikKKyNkZWZpbmUgVklESU9DX0dfQVVESU8JCSBfSU9SKCdWJywgMzMsIHN0cnVjdCB2NGwyX2F1ZGlvKQorI2RlZmluZSBWSURJT0NfU19BVURJTwkJIF9JT1coJ1YnLCAzNCwgc3RydWN0IHY0bDJfYXVkaW8pCisjZGVmaW5lIFZJRElPQ19RVUVSWUNUUkwJX0lPV1IoJ1YnLCAzNiwgc3RydWN0IHY0bDJfcXVlcnljdHJsKQorI2RlZmluZSBWSURJT0NfUVVFUllNRU5VCV9JT1dSKCdWJywgMzcsIHN0cnVjdCB2NGwyX3F1ZXJ5bWVudSkKKyNkZWZpbmUgVklESU9DX0dfSU5QVVQJCSBfSU9SKCdWJywgMzgsIGludCkKKyNkZWZpbmUgVklESU9DX1NfSU5QVVQJCV9JT1dSKCdWJywgMzksIGludCkKKyNkZWZpbmUgVklESU9DX0dfRURJRAkJX0lPV1IoJ1YnLCA0MCwgc3RydWN0IHY0bDJfZWRpZCkKKyNkZWZpbmUgVklESU9DX1NfRURJRAkJX0lPV1IoJ1YnLCA0MSwgc3RydWN0IHY0bDJfZWRpZCkKKyNkZWZpbmUgVklESU9DX0dfT1VUUFVUCQkgX0lPUignVicsIDQ2LCBpbnQpCisjZGVmaW5lIFZJRElPQ19TX09VVFBVVAkJX0lPV1IoJ1YnLCA0NywgaW50KQorI2RlZmluZSBWSURJT0NfRU5VTU9VVFBVVAlfSU9XUignVicsIDQ4LCBzdHJ1Y3QgdjRsMl9vdXRwdXQpCisjZGVmaW5lIFZJRElPQ19HX0FVRE9VVAkJIF9JT1IoJ1YnLCA0OSwgc3RydWN0IHY0bDJfYXVkaW9vdXQpCisjZGVmaW5lIFZJRElPQ19TX0FVRE9VVAkJIF9JT1coJ1YnLCA1MCwgc3RydWN0IHY0bDJfYXVkaW9vdXQpCisjZGVmaW5lIFZJRElPQ19HX01PRFVMQVRPUglfSU9XUignVicsIDU0LCBzdHJ1Y3QgdjRsMl9tb2R1bGF0b3IpCisjZGVmaW5lIFZJRElPQ19TX01PRFVMQVRPUgkgX0lPVygnVicsIDU1LCBzdHJ1Y3QgdjRsMl9tb2R1bGF0b3IpCisjZGVmaW5lIFZJRElPQ19HX0ZSRVFVRU5DWQlfSU9XUignVicsIDU2LCBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kpCisjZGVmaW5lIFZJRElPQ19TX0ZSRVFVRU5DWQkgX0lPVygnVicsIDU3LCBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kpCisjZGVmaW5lIFZJRElPQ19DUk9QQ0FQCQlfSU9XUignVicsIDU4LCBzdHJ1Y3QgdjRsMl9jcm9wY2FwKQorI2RlZmluZSBWSURJT0NfR19DUk9QCQlfSU9XUignVicsIDU5LCBzdHJ1Y3QgdjRsMl9jcm9wKQorI2RlZmluZSBWSURJT0NfU19DUk9QCQkgX0lPVygnVicsIDYwLCBzdHJ1Y3QgdjRsMl9jcm9wKQorI2RlZmluZSBWSURJT0NfR19KUEVHQ09NUAkgX0lPUignVicsIDYxLCBzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24pCisjZGVmaW5lIFZJRElPQ19TX0pQRUdDT01QCSBfSU9XKCdWJywgNjIsIHN0cnVjdCB2NGwyX2pwZWdjb21wcmVzc2lvbikKKyNkZWZpbmUgVklESU9DX1FVRVJZU1REICAgICAgCSBfSU9SKCdWJywgNjMsIHY0bDJfc3RkX2lkKQorI2RlZmluZSBWSURJT0NfVFJZX0ZNVCAgICAgIAlfSU9XUignVicsIDY0LCBzdHJ1Y3QgdjRsMl9mb3JtYXQpCisjZGVmaW5lIFZJRElPQ19FTlVNQVVESU8JX0lPV1IoJ1YnLCA2NSwgc3RydWN0IHY0bDJfYXVkaW8pCisjZGVmaW5lIFZJRElPQ19FTlVNQVVET1VUCV9JT1dSKCdWJywgNjYsIHN0cnVjdCB2NGwyX2F1ZGlvb3V0KQorI2RlZmluZSBWSURJT0NfR19QUklPUklUWQkgX0lPUignVicsIDY3LCBfX3UzMikgLyogZW51bSB2NGwyX3ByaW9yaXR5ICovCisjZGVmaW5lIFZJRElPQ19TX1BSSU9SSVRZCSBfSU9XKCdWJywgNjgsIF9fdTMyKSAvKiBlbnVtIHY0bDJfcHJpb3JpdHkgKi8KKyNkZWZpbmUgVklESU9DX0dfU0xJQ0VEX1ZCSV9DQVAgX0lPV1IoJ1YnLCA2OSwgc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9jYXApCisjZGVmaW5lIFZJRElPQ19MT0dfU1RBVFVTICAgICAgICAgX0lPKCdWJywgNzApCisjZGVmaW5lIFZJRElPQ19HX0VYVF9DVFJMUwlfSU9XUignVicsIDcxLCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMpCisjZGVmaW5lIFZJRElPQ19TX0VYVF9DVFJMUwlfSU9XUignVicsIDcyLCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMpCisjZGVmaW5lIFZJRElPQ19UUllfRVhUX0NUUkxTCV9JT1dSKCdWJywgNzMsIHN0cnVjdCB2NGwyX2V4dF9jb250cm9scykKKyNkZWZpbmUgVklESU9DX0VOVU1fRlJBTUVTSVpFUwlfSU9XUignVicsIDc0LCBzdHJ1Y3QgdjRsMl9mcm1zaXplZW51bSkKKyNkZWZpbmUgVklESU9DX0VOVU1fRlJBTUVJTlRFUlZBTFMgX0lPV1IoJ1YnLCA3NSwgc3RydWN0IHY0bDJfZnJtaXZhbGVudW0pCisjZGVmaW5lIFZJRElPQ19HX0VOQ19JTkRFWCAgICAgICBfSU9SKCdWJywgNzYsIHN0cnVjdCB2NGwyX2VuY19pZHgpCisjZGVmaW5lIFZJRElPQ19FTkNPREVSX0NNRCAgICAgIF9JT1dSKCdWJywgNzcsIHN0cnVjdCB2NGwyX2VuY29kZXJfY21kKQorI2RlZmluZSBWSURJT0NfVFJZX0VOQ09ERVJfQ01EICBfSU9XUignVicsIDc4LCBzdHJ1Y3QgdjRsMl9lbmNvZGVyX2NtZCkKKworLyoKKyAqIEV4cGVyaW1lbnRhbCwgbWVhbnQgZm9yIGRlYnVnZ2luZywgdGVzdGluZyBhbmQgaW50ZXJuYWwgdXNlLgorICogT25seSBpbXBsZW1lbnRlZCBpZiBDT05GSUdfVklERU9fQURWX0RFQlVHIGlzIGRlZmluZWQuCisgKiBZb3UgbXVzdCBiZSByb290IHRvIHVzZSB0aGVzZSBpb2N0bHMuIE5ldmVyIHVzZSB0aGVzZSBpbiBhcHBsaWNhdGlvbnMhCisgKi8KKyNkZWZpbmUJVklESU9DX0RCR19TX1JFR0lTVEVSIAkgX0lPVygnVicsIDc5LCBzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIpCisjZGVmaW5lCVZJRElPQ19EQkdfR19SRUdJU1RFUiAJX0lPV1IoJ1YnLCA4MCwgc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyKQorCisjZGVmaW5lIFZJRElPQ19TX0hXX0ZSRVFfU0VFSwkgX0lPVygnVicsIDgyLCBzdHJ1Y3QgdjRsMl9od19mcmVxX3NlZWspCisjZGVmaW5lCVZJRElPQ19TX0RWX1RJTUlOR1MJX0lPV1IoJ1YnLCA4Nywgc3RydWN0IHY0bDJfZHZfdGltaW5ncykKKyNkZWZpbmUJVklESU9DX0dfRFZfVElNSU5HUwlfSU9XUignVicsIDg4LCBzdHJ1Y3QgdjRsMl9kdl90aW1pbmdzKQorI2RlZmluZQlWSURJT0NfRFFFVkVOVAkJIF9JT1IoJ1YnLCA4OSwgc3RydWN0IHY0bDJfZXZlbnQpCisjZGVmaW5lCVZJRElPQ19TVUJTQ1JJQkVfRVZFTlQJIF9JT1coJ1YnLCA5MCwgc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uKQorI2RlZmluZQlWSURJT0NfVU5TVUJTQ1JJQkVfRVZFTlQgX0lPVygnVicsIDkxLCBzdHJ1Y3QgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24pCisjZGVmaW5lIFZJRElPQ19DUkVBVEVfQlVGUwlfSU9XUignVicsIDkyLCBzdHJ1Y3QgdjRsMl9jcmVhdGVfYnVmZmVycykKKyNkZWZpbmUgVklESU9DX1BSRVBBUkVfQlVGCV9JT1dSKCdWJywgOTMsIHN0cnVjdCB2NGwyX2J1ZmZlcikKKyNkZWZpbmUgVklESU9DX0dfU0VMRUNUSU9OCV9JT1dSKCdWJywgOTQsIHN0cnVjdCB2NGwyX3NlbGVjdGlvbikKKyNkZWZpbmUgVklESU9DX1NfU0VMRUNUSU9OCV9JT1dSKCdWJywgOTUsIHN0cnVjdCB2NGwyX3NlbGVjdGlvbikKKyNkZWZpbmUgVklESU9DX0RFQ09ERVJfQ01ECV9JT1dSKCdWJywgOTYsIHN0cnVjdCB2NGwyX2RlY29kZXJfY21kKQorI2RlZmluZSBWSURJT0NfVFJZX0RFQ09ERVJfQ01ECV9JT1dSKCdWJywgOTcsIHN0cnVjdCB2NGwyX2RlY29kZXJfY21kKQorI2RlZmluZSBWSURJT0NfRU5VTV9EVl9USU1JTkdTICBfSU9XUignVicsIDk4LCBzdHJ1Y3QgdjRsMl9lbnVtX2R2X3RpbWluZ3MpCisjZGVmaW5lIFZJRElPQ19RVUVSWV9EVl9USU1JTkdTICBfSU9SKCdWJywgOTksIHN0cnVjdCB2NGwyX2R2X3RpbWluZ3MpCisjZGVmaW5lIFZJRElPQ19EVl9USU1JTkdTX0NBUCAgIF9JT1dSKCdWJywgMTAwLCBzdHJ1Y3QgdjRsMl9kdl90aW1pbmdzX2NhcCkKKyNkZWZpbmUgVklESU9DX0VOVU1fRlJFUV9CQU5EUwlfSU9XUignVicsIDEwMSwgc3RydWN0IHY0bDJfZnJlcXVlbmN5X2JhbmQpCisKKy8qCisgKiBFeHBlcmltZW50YWwsIG1lYW50IGZvciBkZWJ1Z2dpbmcsIHRlc3RpbmcgYW5kIGludGVybmFsIHVzZS4KKyAqIE5ldmVyIHVzZSB0aGlzIGluIGFwcGxpY2F0aW9ucyEKKyAqLworI2RlZmluZSBWSURJT0NfREJHX0dfQ0hJUF9JTkZPICBfSU9XUignVicsIDEwMiwgc3RydWN0IHY0bDJfZGJnX2NoaXBfaW5mbykKKworI2RlZmluZSBWSURJT0NfUVVFUllfRVhUX0NUUkwJX0lPV1IoJ1YnLCAxMDMsIHN0cnVjdCB2NGwyX3F1ZXJ5X2V4dF9jdHJsKQorCisvKiBSZW1pbmRlcjogd2hlbiBhZGRpbmcgbmV3IGlvY3RscyBwbGVhc2UgYWRkIHN1cHBvcnQgZm9yIHRoZW0gdG8KKyAgIGRyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItY29tcGF0LWlvY3RsMzIuYyBhcyB3ZWxsISAqLworCisjZGVmaW5lIEJBU0VfVklESU9DX1BSSVZBVEUJMTkyCQkvKiAxOTItMjU1IGFyZSBwcml2YXRlICovCisKKyNlbmRpZiAvKiBfVUFQSV9fTElOVVhfVklERU9ERVYyX0ggKi8KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDIuYyBiL3N5cy92NGwyL2dzdHY0bDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2EyODczCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMi5jCkBAIC0wLDAgKzEsMjcyIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAgICAgICAgICAgICAgIDIwMDYgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4KKyAqCisgKiBnc3R2NGwyLmM6IHBsdWdpbiBmb3IgdjRsMiBlbGVtZW50cworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmbmRlZiBfR05VX1NPVVJDRQorIyBkZWZpbmUgX0dOVV9TT1VSQ0UgICAgICAgICAgICAvKiBPX0NMT0VYRUMgKi8KKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0L2dzdC1pMThuLXBsdWdpbi5oIgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiZXh0L3ZpZGVvZGV2Mi5oIgorI2luY2x1ZGUgInY0bDItdXRpbHMuaCIKKworI2luY2x1ZGUgImdzdHY0bDJvYmplY3QuaCIKKyNpbmNsdWRlICJnc3R2NGwyc3JjLmgiCisjaW5jbHVkZSAiZ3N0djRsMnNpbmsuaCIKKyNpbmNsdWRlICJnc3R2NGwycmFkaW8uaCIKKyNpbmNsdWRlICJnc3R2NGwydmlkZW9kZWMuaCIKKyNpbmNsdWRlICJnc3R2NGwyaDI2M2VuYy5oIgorI2luY2x1ZGUgImdzdHY0bDJoMjY0ZW5jLmgiCisjaW5jbHVkZSAiZ3N0djRsMm1wZWc0ZW5jLmgiCisjaW5jbHVkZSAiZ3N0djRsMnZwOGVuYy5oIgorI2luY2x1ZGUgImdzdHY0bDJ2cDllbmMuaCIKKyNpbmNsdWRlICJnc3R2NGwyZGV2aWNlcHJvdmlkZXIuaCIKKyNpbmNsdWRlICJnc3R2NGwydHJhbnNmb3JtLmgiCisKKy8qIHVzZWQgaW4gZ3N0djRsMm9iamVjdC5jIGFuZCB2NGwyX2NhbGxzLmMgKi8KK0dTVF9ERUJVR19DQVRFR09SWSAodjRsMl9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCB2NGwyX2RlYnVnCisKKyNpZmRlZiBHU1RfVjRMMl9FTkFCTEVfUFJPQkUKKy8qIFRoaXMgaXMgYSBtaW5pbWFsaXN0IHByb2JlLCBmb3Igc3BlZWQsIHdlIG9ubHkgZW51bWVyYXRlIGZvcm1hdHMgKi8KK3N0YXRpYyBHc3RDYXBzICoKK2dzdF92NGwyX3Byb2JlX3RlbXBsYXRlX2NhcHMgKGNvbnN0IGdjaGFyICogZGV2aWNlLCBnaW50IHZpZGVvX2ZkLAorICAgIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQoreworICBnaW50IG47CisgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgZm9ybWF0OworICBHc3RDYXBzICpjYXBzOworCisgIEdTVF9ERUJVRyAoIkdldHRpbmcgJXMgZm9ybWF0IGVudW1lcmF0aW9ucyIsIGRldmljZSk7CisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHkgKCk7CisKKyAgZm9yIChuID0gMDs7IG4rKykgeworICAgIEdzdFN0cnVjdHVyZSAqdGVtcGxhdGU7CisKKyAgICBtZW1zZXQgKCZmb3JtYXQsIDAsIHNpemVvZiAoZm9ybWF0KSk7CisKKyAgICBmb3JtYXQuaW5kZXggPSBuOworICAgIGZvcm1hdC50eXBlID0gdHlwZTsKKworICAgIGlmIChpb2N0bCAodmlkZW9fZmQsIFZJRElPQ19FTlVNX0ZNVCwgJmZvcm1hdCkgPCAwKQorICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgZW51bWVyYXRpb24gKi8KKworICAgIEdTVF9MT0cgKCJpbmRleDogICAgICAgJXUiLCBmb3JtYXQuaW5kZXgpOworICAgIEdTVF9MT0cgKCJ0eXBlOiAgICAgICAgJWQiLCBmb3JtYXQudHlwZSk7CisgICAgR1NUX0xPRyAoImZsYWdzOiAgICAgICAlMDh4IiwgZm9ybWF0LmZsYWdzKTsKKyAgICBHU1RfTE9HICgiZGVzY3JpcHRpb246ICclcyciLCBmb3JtYXQuZGVzY3JpcHRpb24pOworICAgIEdTVF9MT0cgKCJwaXhlbGZvcm1hdDogJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm9ybWF0LnBpeGVsZm9ybWF0KSk7CisKKyAgICB0ZW1wbGF0ZSA9IGdzdF92NGwyX29iamVjdF92NGwyZm91cmNjX3RvX3N0cnVjdHVyZSAoZm9ybWF0LnBpeGVsZm9ybWF0KTsKKworICAgIGlmICh0ZW1wbGF0ZSkgeworICAgICAgR3N0U3RydWN0dXJlICphbHRfdCA9IE5VTEw7CisKKyAgICAgIHN3aXRjaCAoZm9ybWF0LnBpeGVsZm9ybWF0KSB7CisgICAgICAgIGNhc2UgVjRMMl9QSVhfRk1UX1JHQjMyOgorICAgICAgICAgIGFsdF90ID0gZ3N0X3N0cnVjdHVyZV9jb3B5ICh0ZW1wbGF0ZSk7CisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKGFsdF90LCAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIkFSR0IiLCBOVUxMKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfQkdSMzI6CisgICAgICAgICAgYWx0X3QgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHRlbXBsYXRlKTsKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoYWx0X3QsICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiQkdSQSIsIE5VTEwpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBnc3RfY2Fwc19hcHBlbmRfc3RydWN0dXJlIChjYXBzLCB0ZW1wbGF0ZSk7CisKKyAgICAgIGlmIChhbHRfdCkKKyAgICAgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoY2FwcywgYWx0X3QpOworICAgIH0KKyAgfQorCisgIHJldHVybiBnc3RfY2Fwc19zaW1wbGlmeSAoY2Fwcyk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfcHJvYmVfYW5kX3JlZ2lzdGVyIChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdzdFY0bDJJdGVyYXRvciAqaXQ7CisgIGdpbnQgdmlkZW9fZmQgPSAtMTsKKyAgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSB2Y2FwOworICBndWludDMyIGRldmljZV9jYXBzOworCisgIGl0ID0gZ3N0X3Y0bDJfaXRlcmF0b3JfbmV3ICgpOworCisgIHdoaWxlIChnc3RfdjRsMl9pdGVyYXRvcl9uZXh0IChpdCkpIHsKKyAgICBHc3RDYXBzICpzcmNfY2FwcywgKnNpbmtfY2FwczsKKyAgICBnY2hhciAqYmFzZW5hbWU7CisKKyAgICBpZiAodmlkZW9fZmQgPj0gMCkKKyAgICAgIGNsb3NlICh2aWRlb19mZCk7CisKKyAgICB2aWRlb19mZCA9IG9wZW4gKGl0LT5kZXZpY2VfcGF0aCwgT19SRFdSIHwgT19DTE9FWEVDKTsKKworICAgIGlmICh2aWRlb19mZCA9PSAtMSkgeworICAgICAgR1NUX0RFQlVHICgiRmFpbGVkIHRvIG9wZW4gJXM6ICVzIiwgaXQtPmRldmljZV9wYXRoLCBnX3N0cmVycm9yIChlcnJubykpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgbWVtc2V0ICgmdmNhcCwgMCwgc2l6ZW9mICh2Y2FwKSk7CisKKyAgICBpZiAoaW9jdGwgKHZpZGVvX2ZkLCBWSURJT0NfUVVFUllDQVAsICZ2Y2FwKSA8IDApIHsKKyAgICAgIEdTVF9ERUJVRyAoIkZhaWxlZCB0byBnZXQgZGV2aWNlIGNhcGFiaWxpdGllczogJXMiLCBnX3N0cmVycm9yIChlcnJubykpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKHZjYXAuY2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfREVWSUNFX0NBUFMpCisgICAgICBkZXZpY2VfY2FwcyA9IHZjYXAuZGV2aWNlX2NhcHM7CisgICAgZWxzZQorICAgICAgZGV2aWNlX2NhcHMgPSB2Y2FwLmNhcGFiaWxpdGllczsKKworICAgIGlmICghKChkZXZpY2VfY2FwcyAmIChWNEwyX0NBUF9WSURFT19NMk0gfCBWNEwyX0NBUF9WSURFT19NMk1fTVBMQU5FKSkgfHwKKyAgICAgICAgICAgIC8qIEJ1dCBsZWdhY3kgZHJpdmVyIG1heSBleHBvc2UgYm90aCBDQVBUVVJFIGFuZCBPVVRQVVQgKi8KKyAgICAgICAgICAgICgoZGV2aWNlX2NhcHMgJgorICAgICAgICAgICAgICAgICAgICAoVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSkgJiYKKyAgICAgICAgICAgICAgICAoZGV2aWNlX2NhcHMgJgorICAgICAgICAgICAgICAgICAgICAoVjRMMl9DQVBfVklERU9fT1VUUFVUIHwgVjRMMl9DQVBfVklERU9fT1VUUFVUX01QTEFORSkpKSkpCisgICAgICBjb250aW51ZTsKKworICAgIEdTVF9ERUJVRyAoIlByb2JpbmcgJyVzJyBsb2NhdGVkIGF0ICclcyciLAorICAgICAgICBpdC0+ZGV2aWNlX25hbWUgPyBpdC0+ZGV2aWNlX25hbWUgOiAoY29uc3QgZ2NoYXIgKikgdmNhcC5kcml2ZXIsCisgICAgICAgIGl0LT5kZXZpY2VfcGF0aCk7CisKKyAgICAvKiBnZXQgc2luayBzdXBwb3J0ZWQgZm9ybWF0IChubyBNUExBTkUgZm9yIGNvZGVjKSAqLworICAgIHNpbmtfY2FwcyA9IGdzdF9jYXBzX21lcmdlIChnc3RfdjRsMl9wcm9iZV90ZW1wbGF0ZV9jYXBzIChpdC0+ZGV2aWNlX3BhdGgsCisgICAgICAgICAgICB2aWRlb19mZCwgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQpLAorICAgICAgICBnc3RfdjRsMl9wcm9iZV90ZW1wbGF0ZV9jYXBzIChpdC0+ZGV2aWNlX3BhdGgsIHZpZGVvX2ZkLAorICAgICAgICAgICAgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSk7CisKKyAgICAvKiBnZXQgc3JjIHN1cHBvcnRlZCBmb3JtYXQgKi8KKyAgICBzcmNfY2FwcyA9IGdzdF9jYXBzX21lcmdlIChnc3RfdjRsMl9wcm9iZV90ZW1wbGF0ZV9jYXBzIChpdC0+ZGV2aWNlX3BhdGgsCisgICAgICAgICAgICB2aWRlb19mZCwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSwKKyAgICAgICAgZ3N0X3Y0bDJfcHJvYmVfdGVtcGxhdGVfY2FwcyAoaXQtPmRldmljZV9wYXRoLCB2aWRlb19mZCwKKyAgICAgICAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpKTsKKworICAgIC8qIFNraXAgZGV2aWNlcyB3aXRob3V0IGFueSBzdXBwb3J0ZWQgZm9ybWF0cyAqLworICAgIGlmIChnc3RfY2Fwc19pc19lbXB0eSAoc2lua19jYXBzKSB8fCBnc3RfY2Fwc19pc19lbXB0eSAoc3JjX2NhcHMpKSB7CisgICAgICBnc3RfY2Fwc191bnJlZiAoc2lua19jYXBzKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChzcmNfY2Fwcyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBiYXNlbmFtZSA9IGdfcGF0aF9nZXRfYmFzZW5hbWUgKGl0LT5kZXZpY2VfcGF0aCk7CisKKyAgICBpZiAoZ3N0X3Y0bDJfaXNfdmlkZW9fZGVjIChzaW5rX2NhcHMsIHNyY19jYXBzKSkgeworICAgICAgZ3N0X3Y0bDJfdmlkZW9fZGVjX3JlZ2lzdGVyIChwbHVnaW4sIGJhc2VuYW1lLCBpdC0+ZGV2aWNlX3BhdGgsCisgICAgICAgICAgc2lua19jYXBzLCBzcmNfY2Fwcyk7CisgICAgfSBlbHNlIGlmIChnc3RfdjRsMl9pc192aWRlb19lbmMgKHNpbmtfY2Fwcywgc3JjX2NhcHMsIE5VTEwpKSB7CisgICAgICBpZiAoZ3N0X3Y0bDJfaXNfaDI2NF9lbmMgKHNpbmtfY2Fwcywgc3JjX2NhcHMpKQorICAgICAgICBnc3RfdjRsMl9oMjY0X2VuY19yZWdpc3RlciAocGx1Z2luLCBiYXNlbmFtZSwgaXQtPmRldmljZV9wYXRoLAorICAgICAgICAgICAgc2lua19jYXBzLCBzcmNfY2Fwcyk7CisKKyAgICAgIGlmIChnc3RfdjRsMl9pc19tcGVnNF9lbmMgKHNpbmtfY2Fwcywgc3JjX2NhcHMpKQorICAgICAgICBnc3RfdjRsMl9tcGVnNF9lbmNfcmVnaXN0ZXIgKHBsdWdpbiwgYmFzZW5hbWUsIGl0LT5kZXZpY2VfcGF0aCwKKyAgICAgICAgICAgIHNpbmtfY2Fwcywgc3JjX2NhcHMpOworCisgICAgICBpZiAoZ3N0X3Y0bDJfaXNfaDI2M19lbmMgKHNpbmtfY2Fwcywgc3JjX2NhcHMpKQorICAgICAgICBnc3RfdjRsMl9oMjYzX2VuY19yZWdpc3RlciAocGx1Z2luLCBiYXNlbmFtZSwgaXQtPmRldmljZV9wYXRoLAorICAgICAgICAgICAgc2lua19jYXBzLCBzcmNfY2Fwcyk7CisKKyAgICAgIGlmIChnc3RfdjRsMl9pc192cDhfZW5jIChzaW5rX2NhcHMsIHNyY19jYXBzKSkKKyAgICAgICAgZ3N0X3Y0bDJfdnA4X2VuY19yZWdpc3RlciAocGx1Z2luLCBiYXNlbmFtZSwgaXQtPmRldmljZV9wYXRoLAorICAgICAgICAgICAgc2lua19jYXBzLCBzcmNfY2Fwcyk7CisKKyAgICAgIGlmIChnc3RfdjRsMl9pc192cDlfZW5jIChzaW5rX2NhcHMsIHNyY19jYXBzKSkKKyAgICAgICAgZ3N0X3Y0bDJfdnA5X2VuY19yZWdpc3RlciAocGx1Z2luLCBiYXNlbmFtZSwgaXQtPmRldmljZV9wYXRoLAorICAgICAgICAgICAgc2lua19jYXBzLCBzcmNfY2Fwcyk7CisgICAgfSBlbHNlIGlmIChnc3RfdjRsMl9pc190cmFuc2Zvcm0gKHNpbmtfY2Fwcywgc3JjX2NhcHMpKSB7CisgICAgICBnc3RfdjRsMl90cmFuc2Zvcm1fcmVnaXN0ZXIgKHBsdWdpbiwgYmFzZW5hbWUsIGl0LT5kZXZpY2VfcGF0aCwKKyAgICAgICAgICBzaW5rX2NhcHMsIHNyY19jYXBzKTsKKyAgICB9CisgICAgLyogZWxzZSBpZiAoIC4uLiBldGMuICovCisKKyAgICBnc3RfY2Fwc191bnJlZiAoc2lua19jYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoc3JjX2NhcHMpOworICAgIGdfZnJlZSAoYmFzZW5hbWUpOworICB9CisKKyAgaWYgKHZpZGVvX2ZkID49IDApCisgICAgY2xvc2UgKHZpZGVvX2ZkKTsKKworICBnc3RfdjRsMl9pdGVyYXRvcl9mcmVlIChpdCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBjb25zdCBnY2hhciAqcGF0aHNbXSA9IHsgIi9kZXYiLCAiL2Rldi92NGwyIiwgTlVMTCB9OworICBjb25zdCBnY2hhciAqbmFtZXNbXSA9IHsgInZpZGVvIiwgTlVMTCB9OworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUICh2NGwyX2RlYnVnLCAidjRsMiIsIDAsICJWNEwyIEFQSSBjYWxscyIpOworCisgIC8qIEFkZCBzb21lIGRlcGVkZW5jeSwgc28gdGhlIGR5bmFtaWMgZmVhdHVyZXMgZ2V0IHVwZGF0ZWQgdXBvbiBjaGFuZ2VzIGluCisgICAqIC9kZXYvdmlkZW8qICovCisgIGdzdF9wbHVnaW5fYWRkX2RlcGVuZGVuY3kgKHBsdWdpbiwKKyAgICAgIE5VTEwsIHBhdGhzLCBuYW1lcywgR1NUX1BMVUdJTl9ERVBFTkRFTkNZX0ZMQUdfRklMRV9OQU1FX0lTX1BSRUZJWCk7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAidjRsMnNyYyIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICAgICAgR1NUX1RZUEVfVjRMMlNSQykgfHwKKyAgICAgICFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAidjRsMnNpbmsiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX1Y0TDJTSU5LKSB8fAorICAgICAgIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJ2NGwycmFkaW8iLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX1Y0TDJSQURJTykgfHwKKyAgICAgICFnc3RfZGV2aWNlX3Byb3ZpZGVyX3JlZ2lzdGVyIChwbHVnaW4sICJ2NGwyZGV2aWNlcHJvdmlkZXIiLAorICAgICAgICAgIEdTVF9SQU5LX1BSSU1BUlksIEdTVF9UWVBFX1Y0TDJfREVWSUNFX1BST1ZJREVSKQorICAgICAgLyogZXRjLiAqLworI2lmZGVmIEdTVF9WNEwyX0VOQUJMRV9QUk9CRQorICAgICAgfHwgIWdzdF92NGwyX3Byb2JlX2FuZF9yZWdpc3RlciAocGx1Z2luKQorI2VuZGlmCisgICAgICApCisgICAgcmV0dXJuIEZBTFNFOworCisjaWZkZWYgRU5BQkxFX05MUworICBiaW5kdGV4dGRvbWFpbiAoR0VUVEVYVF9QQUNLQUdFLCBMT0NBTEVESVIpOworICBiaW5kX3RleHRkb21haW5fY29kZXNldCAoR0VUVEVYVF9QQUNLQUdFLCAiVVRGLTgiKTsKKyNlbmRpZiAvKiBFTkFCTEVfTkxTICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICB2aWRlbzRsaW51eDIsCisgICAgImVsZW1lbnRzIGZvciBWaWRlbyA0IExpbnV4IiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuYyBiL3N5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGE1ODFiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jCkBAIC0wLDAgKzEsMTQ0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBDb2xsYWJvcmEgTHRkLgorICogICAgIEF1dGhvcjogTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyMgZGVmaW5lIF9HTlVfU09VUkNFICAgICAgICAgICAgLyogT19DTE9FWEVDICovCisjZW5kaWYKKworI2luY2x1ZGUgImV4dC92aWRlb2RldjIuaCIKKworI2luY2x1ZGUgImdzdHY0bDJvYmplY3QuaCIKKyNpbmNsdWRlICJnc3R2NGwyYWxsb2NhdG9yLmgiCisKKyNpbmNsdWRlIDxnc3QvYWxsb2NhdG9ycy9nc3RkbWFidWYuaD4KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZGVmaW5lIEdTVF9WNEwyX01FTU9SWV9UWVBFICJWNGwyTWVtb3J5IgorCisjZGVmaW5lIGdzdF92NGwyX2FsbG9jYXRvcl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RWNGwyQWxsb2NhdG9yLCBnc3RfdjRsMl9hbGxvY2F0b3IsIEdTVF9UWVBFX0FMTE9DQVRPUik7CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHY0bDJhbGxvY2F0b3JfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgdjRsMmFsbG9jYXRvcl9kZWJ1ZworCisjZGVmaW5lIFVOU0VUX1FVRVVFRChidWZmZXIpIFwKKyAgICAoKGJ1ZmZlcikuZmxhZ3MgJj0gfihWNEwyX0JVRl9GTEFHX1FVRVVFRCB8IFY0TDJfQlVGX0ZMQUdfRE9ORSkpCisKKyNkZWZpbmUgU0VUX1FVRVVFRChidWZmZXIpICgoYnVmZmVyKS5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX1FVRVVFRCkKKworI2RlZmluZSBJU19RVUVVRUQoYnVmZmVyKSBcCisgICAgKChidWZmZXIpLmZsYWdzICYgKFY0TDJfQlVGX0ZMQUdfUVVFVUVEIHwgVjRMMl9CVUZfRkxBR19ET05FKSkKKworZW51bQoreworICBHUk9VUF9SRUxFQVNFRCwKKyAgTEFTVF9TSUdOQUwKK307CisKK3N0YXRpYyBndWludCBnc3RfdjRsMl9hbGxvY2F0b3Jfc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAgfTsKKworc3RhdGljIHZvaWQgZ3N0X3Y0bDJfYWxsb2NhdG9yX3JlbGVhc2UgKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IsCisgICAgR3N0VjRsMk1lbW9yeSAqIG1lbSk7CisKK3N0YXRpYyBjb25zdCBnY2hhciAqCittZW1vcnlfdHlwZV90b19zdHIgKGd1aW50MzIgbWVtb3J5KQoreworICBzd2l0Y2ggKG1lbW9yeSkgeworICAgIGNhc2UgVjRMMl9NRU1PUllfTU1BUDoKKyAgICAgIHJldHVybiAibW1hcCI7CisgICAgY2FzZSBWNEwyX01FTU9SWV9VU0VSUFRSOgorICAgICAgcmV0dXJuICJ1c2VycHRyIjsKKyAgICBjYXNlIFY0TDJfTUVNT1JZX0RNQUJVRjoKKyAgICAgIHJldHVybiAiZG1hYnVmIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJ1bmtub3duIjsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEdzdFY0bE1lbW9yeSBpbXBsZW1lbnRhdGlvbiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBncG9pbnRlcgorX3Y0bDJtZW1fbWFwIChHc3RWNGwyTWVtb3J5ICogbWVtLCBnc2l6ZSBtYXhzaXplLCBHc3RNYXBGbGFncyBmbGFncykKK3sKKyAgZ3BvaW50ZXIgZGF0YSA9IE5VTEw7CisKKyAgc3dpdGNoIChtZW0tPmdyb3VwLT5idWZmZXIubWVtb3J5KSB7CisgICAgY2FzZSBWNEwyX01FTU9SWV9NTUFQOgorICAgIGNhc2UgVjRMMl9NRU1PUllfVVNFUlBUUjoKKyAgICAgIGRhdGEgPSBtZW0tPmRhdGE7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfTUVNT1JZX0RNQUJVRjoKKyAgICAgIC8qIHY0bDIgZG1hYnVmIG1lbW9yeSBhcmUgbm90IHNoYXJlZCB3aXRoIGRvd25zdHJlYW0gKi8KKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9XQVJOSU5HICgiVW5rbm93biBtZW1vcnkgdHlwZSAlaSIsIG1lbS0+Z3JvdXAtPmJ1ZmZlci5tZW1vcnkpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorX3Y0bDJtZW1fdW5tYXAgKEdzdFY0bDJNZW1vcnkgKiBtZW0pCit7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIHN3aXRjaCAobWVtLT5ncm91cC0+YnVmZmVyLm1lbW9yeSkgeworICAgIGNhc2UgVjRMMl9NRU1PUllfTU1BUDoKKyAgICBjYXNlIFY0TDJfTUVNT1JZX1VTRVJQVFI6CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX01FTU9SWV9ETUFCVUY6CisgICAgICAvKiB2NGwyIGRtYWJ1ZiBtZW1vcnkgYXJlIG5vdCBzaGFyZSB3aXRoIGRvd25zdHJlYW0gKi8KKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9XQVJOSU5HICgiVW5rbm93biBtZW1vcnkgdHlwZSAlaSIsIG1lbS0+Z3JvdXAtPmJ1ZmZlci5tZW1vcnkpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitfdjRsMm1lbV9kaXNwb3NlIChHc3RWNGwyTWVtb3J5ICogbWVtKQoreworICBHc3RWNGwyQWxsb2NhdG9yICphbGxvY2F0b3IgPSAoR3N0VjRsMkFsbG9jYXRvciAqKSBtZW0tPm1lbS5hbGxvY2F0b3I7CisgIEdzdFY0bDJNZW1vcnlHcm91cCAqZ3JvdXAgPSBtZW0tPmdyb3VwOworICBnYm9vbGVhbiByZXQ7CisKKyAgaWYgKGdyb3VwLT5tZW1bbWVtLT5wbGFuZV0pIHsKKyAgICAvKiBXZSBtYXkgaGF2ZSBhIGRtYWJ1ZiwgcmVwbGFjZSBpdCB3aXRoIHJldHVybmVkIG9yaWdpbmFsIG1lbW9yeSAqLworICAgIGdyb3VwLT5tZW1bbWVtLT5wbGFuZV0gPSBnc3RfbWVtb3J5X3JlZiAoKEdzdE1lbW9yeSAqKSBtZW0pOworICAgIGdzdF92NGwyX2FsbG9jYXRvcl9yZWxlYXNlIChhbGxvY2F0b3IsIG1lbSk7CisgICAgcmV0ID0gRkFMU0U7CisgIH0gZWxzZSB7CisgICAgZ3N0X29iamVjdF9yZWYgKGFsbG9jYXRvcik7CisgICAgcmV0ID0gVFJVRTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgR3N0VjRsMk1lbW9yeSAqCitfdjRsMm1lbV9uZXcgKEdzdE1lbW9yeUZsYWdzIGZsYWdzLCBHc3RBbGxvY2F0b3IgKiBhbGxvY2F0b3IsCisgICAgR3N0TWVtb3J5ICogcGFyZW50LCBnc2l6ZSBtYXhzaXplLCBnc2l6ZSBhbGlnbiwgZ3NpemUgb2Zmc2V0LCBnc2l6ZSBzaXplLAorICAgIGdpbnQgcGxhbmUsIGdwb2ludGVyIGRhdGEsIGludCBkbWFmZCwgR3N0VjRsMk1lbW9yeUdyb3VwICogZ3JvdXApCit7CisgIEdzdFY0bDJNZW1vcnkgKm1lbTsKKworICBtZW0gPSBnX3NsaWNlX25ldzAgKEdzdFY0bDJNZW1vcnkpOworICBnc3RfbWVtb3J5X2luaXQgKEdTVF9NRU1PUllfQ0FTVCAobWVtKSwKKyAgICAgIGZsYWdzLCBhbGxvY2F0b3IsIHBhcmVudCwgbWF4c2l6ZSwgYWxpZ24sIG9mZnNldCwgc2l6ZSk7CisKKyAgaWYgKHBhcmVudCA9PSBOVUxMKQorICAgIG1lbS0+bWVtLm1pbmlfb2JqZWN0LmRpc3Bvc2UgPQorICAgICAgICAoR3N0TWluaU9iamVjdERpc3Bvc2VGdW5jdGlvbikgX3Y0bDJtZW1fZGlzcG9zZTsKKworICBtZW0tPnBsYW5lID0gcGxhbmU7CisgIG1lbS0+ZGF0YSA9IGRhdGE7CisgIG1lbS0+ZG1hZmQgPSBkbWFmZDsKKyAgbWVtLT5ncm91cCA9IGdyb3VwOworCisgIHJldHVybiBtZW07Cit9CisKK3N0YXRpYyBHc3RWNGwyTWVtb3J5ICoKK192NGwybWVtX3NoYXJlIChHc3RWNGwyTWVtb3J5ICogbWVtLCBnc3NpemUgb2Zmc2V0LCBnc2l6ZSBzaXplKQoreworICBHc3RWNGwyTWVtb3J5ICpzdWI7CisgIEdzdE1lbW9yeSAqcGFyZW50OworCisgIC8qIGZpbmQgdGhlIHJlYWwgcGFyZW50ICovCisgIGlmICgocGFyZW50ID0gbWVtLT5tZW0ucGFyZW50KSA9PSBOVUxMKQorICAgIHBhcmVudCA9IChHc3RNZW1vcnkgKikgbWVtOworCisgIGlmIChzaXplID09IC0xKQorICAgIHNpemUgPSBtZW0tPm1lbS5zaXplIC0gb2Zmc2V0OworCisgIC8qIHRoZSBzaGFyZWQgbWVtb3J5IGlzIGFsd2F5cyByZWFkb25seSAqLworICBzdWIgPSBfdjRsMm1lbV9uZXcgKEdTVF9NSU5JX09CSkVDVF9GTEFHUyAocGFyZW50KSB8CisgICAgICBHU1RfTUlOSV9PQkpFQ1RfRkxBR19MT0NLX1JFQURPTkxZLCBtZW0tPm1lbS5hbGxvY2F0b3IsIHBhcmVudCwKKyAgICAgIG1lbS0+bWVtLm1heHNpemUsIG1lbS0+bWVtLmFsaWduLCBvZmZzZXQsIHNpemUsIG1lbS0+cGxhbmUsIG1lbS0+ZGF0YSwKKyAgICAgIC0xLCBtZW0tPmdyb3VwKTsKKworICByZXR1cm4gc3ViOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK192NGwybWVtX2lzX3NwYW4gKEdzdFY0bDJNZW1vcnkgKiBtZW0xLCBHc3RWNGwyTWVtb3J5ICogbWVtMiwgZ3NpemUgKiBvZmZzZXQpCit7CisgIGlmIChvZmZzZXQpCisgICAgKm9mZnNldCA9IG1lbTEtPm1lbS5vZmZzZXQgLSBtZW0xLT5tZW0ucGFyZW50LT5vZmZzZXQ7CisKKyAgLyogYW5kIG1lbW9yeSBpcyBjb250aWd1b3VzICovCisgIHJldHVybiBtZW0xLT5tZW0ub2Zmc2V0ICsgbWVtMS0+bWVtLnNpemUgPT0gbWVtMi0+bWVtLm9mZnNldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9pc192NGwyX21lbW9yeSAoR3N0TWVtb3J5ICogbWVtKQoreworICByZXR1cm4gZ3N0X21lbW9yeV9pc190eXBlIChtZW0sIEdTVF9WNEwyX01FTU9SWV9UWVBFKTsKK30KKworR1F1YXJrCitnc3RfdjRsMl9tZW1vcnlfcXVhcmsgKHZvaWQpCit7CisgIHN0YXRpYyBHUXVhcmsgcXVhcmsgPSAwOworCisgIGlmIChxdWFyayA9PSAwKQorICAgIHF1YXJrID0gZ19xdWFya19mcm9tX3N0cmluZyAoIkdzdFY0bDJNZW1vcnkiKTsKKworICByZXR1cm4gcXVhcms7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBHc3RWNGwyTWVtb3J5R3JvdXAgaW1wbGVtZW50YXRpb24gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfbWVtb3J5X2dyb3VwX2ZyZWUgKEdzdFY0bDJNZW1vcnlHcm91cCAqIGdyb3VwKQoreworICBnaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGdyb3VwLT5uX21lbTsgaSsrKSB7CisgICAgR3N0TWVtb3J5ICptZW0gPSBncm91cC0+bWVtW2ldOworICAgIGdyb3VwLT5tZW1baV0gPSBOVUxMOworICAgIGlmIChtZW0pCisgICAgICBnc3RfbWVtb3J5X3VucmVmIChtZW0pOworICB9CisKKyAgZ19zbGljZV9mcmVlIChHc3RWNGwyTWVtb3J5R3JvdXAsIGdyb3VwKTsKK30KKworc3RhdGljIEdzdFY0bDJNZW1vcnlHcm91cCAqCitnc3RfdjRsMl9tZW1vcnlfZ3JvdXBfbmV3IChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yLCBndWludDMyIGluZGV4KQoreworICBHc3RWNGwyT2JqZWN0ICpvYmogPSBhbGxvY2F0b3ItPm9iajsKKyAgZ3VpbnQzMiBtZW1vcnkgPSBhbGxvY2F0b3ItPm1lbW9yeTsKKyAgc3RydWN0IHY0bDJfZm9ybWF0ICpmb3JtYXQgPSAmb2JqLT5mb3JtYXQ7CisgIEdzdFY0bDJNZW1vcnlHcm91cCAqZ3JvdXA7CisgIGdzaXplIGltZ19zaXplLCBidWZfc2l6ZTsKKworICBncm91cCA9IGdfc2xpY2VfbmV3MCAoR3N0VjRsMk1lbW9yeUdyb3VwKTsKKworICBncm91cC0+YnVmZmVyLnR5cGUgPSBmb3JtYXQtPnR5cGU7CisgIGdyb3VwLT5idWZmZXIuaW5kZXggPSBpbmRleDsKKyAgZ3JvdXAtPmJ1ZmZlci5tZW1vcnkgPSBtZW1vcnk7CisKKyAgaWYgKFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUiAoZm9ybWF0LT50eXBlKSkgeworICAgIGdyb3VwLT5uX21lbSA9IGdyb3VwLT5idWZmZXIubGVuZ3RoID0gZm9ybWF0LT5mbXQucGl4X21wLm51bV9wbGFuZXM7CisgICAgZ3JvdXAtPmJ1ZmZlci5tLnBsYW5lcyA9IGdyb3VwLT5wbGFuZXM7CisgIH0gZWxzZSB7CisgICAgZ3JvdXAtPm5fbWVtID0gMTsKKyAgfQorCisgIGlmIChvYmotPmlvY3RsIChvYmotPnZpZGVvX2ZkLCBWSURJT0NfUVVFUllCVUYsICZncm91cC0+YnVmZmVyKSA8IDApCisgICAgZ290byBxdWVyeWJ1Zl9mYWlsZWQ7CisKKyAgaWYgKGdyb3VwLT5idWZmZXIuaW5kZXggIT0gaW5kZXgpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChhbGxvY2F0b3IsICJCdWZmZXIgaW5kZXggcmV0dXJuZWQgYnkgVklESU9DX1FVRVJZQlVGICIKKyAgICAgICAgImRpZG4ndCBtYXRjaCwgdGhpcyBpbmRpY2F0ZSB0aGUgcHJlc2VuY2Ugb2YgYSBidWcgaW4geW91ciBkcml2ZXIgb3IgIgorICAgICAgICAibGlidjRsMiIpOworICAgIGdfc2xpY2VfZnJlZSAoR3N0VjRsMk1lbW9yeUdyb3VwLCBncm91cCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvKiBDaGVjayB0aGF0IHByb3ZpZGVkIHNpemUgbWF0Y2hlcyB0aGUgZm9ybWF0IHdlIGhhdmUgbmVnb3RpYXRpb24uIEZhaWxpbmcKKyAgICogdGhlcmUgdXN1YWxseSBtZWFucyBhIGRyaXZlciBvZiBsaWJ2NGwgYnVnLiAqLworICBpZiAoVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSIChvYmotPnR5cGUpKSB7CisgICAgZ2ludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGdyb3VwLT5uX21lbTsgaSsrKSB7CisgICAgICBpbWdfc2l6ZSA9IG9iai0+Zm9ybWF0LmZtdC5waXhfbXAucGxhbmVfZm10W2ldLnNpemVpbWFnZTsKKyAgICAgIGJ1Zl9zaXplID0gZ3JvdXAtPnBsYW5lc1tpXS5sZW5ndGg7CisgICAgICBpZiAoYnVmX3NpemUgPCBpbWdfc2l6ZSkKKyAgICAgICAgZ290byBidWZmZXJfdG9vX3Nob3J0OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbWdfc2l6ZSA9IG9iai0+Zm9ybWF0LmZtdC5waXguc2l6ZWltYWdlOworICAgIGJ1Zl9zaXplID0gZ3JvdXAtPmJ1ZmZlci5sZW5ndGg7CisgICAgaWYgKGJ1Zl9zaXplIDwgaW1nX3NpemUpCisgICAgICBnb3RvIGJ1ZmZlcl90b29fc2hvcnQ7CisgIH0KKworICAvKiBXZSBzYXZlIG5vbiBwbGFuYXIgYnVmZmVyIGluZm9ybWF0aW9uIGludG8gdGhlIG11bHRpLXBsYW5hciBwbGFuZSBhcnJheQorICAgKiB0byBhdm9pZCBkdXBsaWNhdGluZyB0aGUgY29kZSBsYXRlciAqLworICBpZiAoIVY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUiAoZm9ybWF0LT50eXBlKSkgeworICAgIGdyb3VwLT5wbGFuZXNbMF0uYnl0ZXN1c2VkID0gZ3JvdXAtPmJ1ZmZlci5ieXRlc3VzZWQ7CisgICAgZ3JvdXAtPnBsYW5lc1swXS5sZW5ndGggPSBncm91cC0+YnVmZmVyLmxlbmd0aDsKKyAgICBncm91cC0+cGxhbmVzWzBdLmRhdGFfb2Zmc2V0ID0gMDsKKyAgICBnX2Fzc2VydCAoc2l6ZW9mIChncm91cC0+cGxhbmVzWzBdLm0pID09IHNpemVvZiAoZ3JvdXAtPmJ1ZmZlci5tKSk7CisgICAgbWVtY3B5ICgmZ3JvdXAtPnBsYW5lc1swXS5tLCAmZ3JvdXAtPmJ1ZmZlci5tLCBzaXplb2YgKGdyb3VwLT5idWZmZXIubSkpOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKGFsbG9jYXRvciwgIkdvdCAlcyBidWZmZXIiLCBtZW1vcnlfdHlwZV90b19zdHIgKG1lbW9yeSkpOworICBHU1RfTE9HX09CSkVDVCAoYWxsb2NhdG9yLCAiICBpbmRleDogICAgICV1IiwgZ3JvdXAtPmJ1ZmZlci5pbmRleCk7CisgIEdTVF9MT0dfT0JKRUNUIChhbGxvY2F0b3IsICIgIHR5cGU6ICAgICAgJWQiLCBncm91cC0+YnVmZmVyLnR5cGUpOworICBHU1RfTE9HX09CSkVDVCAoYWxsb2NhdG9yLCAiICBmbGFnczogICAgICUwOHgiLCBncm91cC0+YnVmZmVyLmZsYWdzKTsKKyAgR1NUX0xPR19PQkpFQ1QgKGFsbG9jYXRvciwgIiAgZmllbGQ6ICAgICAlZCIsIGdyb3VwLT5idWZmZXIuZmllbGQpOworICBHU1RfTE9HX09CSkVDVCAoYWxsb2NhdG9yLCAiICBtZW1vcnk6ICAgICVkIiwgZ3JvdXAtPmJ1ZmZlci5tZW1vcnkpOworICBHU1RfTE9HX09CSkVDVCAoYWxsb2NhdG9yLCAiICBwbGFuZXM6ICAgICVkIiwgZ3JvdXAtPm5fbWVtKTsKKworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgaWYgKG1lbW9yeSA9PSBWNEwyX01FTU9SWV9NTUFQKSB7CisgICAgZ2ludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBncm91cC0+bl9tZW07IGkrKykgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKGFsbG9jYXRvciwKKyAgICAgICAgICAiICBbJXVdIGJ5dGVzdXNlZDogJXUsIGxlbmd0aDogJXUsIG9mZnNldDogJXUiLCBpLAorICAgICAgICAgIGdyb3VwLT5wbGFuZXNbaV0uYnl0ZXN1c2VkLCBncm91cC0+cGxhbmVzW2ldLmxlbmd0aCwKKyAgICAgICAgICBncm91cC0+cGxhbmVzW2ldLmRhdGFfb2Zmc2V0KTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChhbGxvY2F0b3IsICIgIFsldV0gTU1BUCBvZmZzZXQ6ICAldSIsIGksCisgICAgICAgICAgZ3JvdXAtPnBsYW5lc1tpXS5tLm1lbV9vZmZzZXQpOworICAgIH0KKyAgfQorI2VuZGlmCisKKyAgcmV0dXJuIGdyb3VwOworCitxdWVyeWJ1Zl9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRVJST1IgKCJlcnJvciBxdWVyeWluZyBidWZmZXIgJWQ6ICVzIiwgaW5kZXgsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgZ290byBmYWlsZWQ7CisgIH0KK2J1ZmZlcl90b29fc2hvcnQ6CisgIHsKKyAgICBHU1RfRVJST1IgKCJidWZmZXIgc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVAorICAgICAgICAiIGlzIHNtYWxsZXIgdGhlbiBuZWdvdGlhdGVkIHNpemUgJSIgR19HU0laRV9GT1JNQVQKKyAgICAgICAgIiwgdGhpcyBpcyB1c3VhbGx5IHRoZSByZXN1bHQgb2YgYSBidWcgaW4gdGhlIHY0bDIgZHJpdmVyIG9yIGxpYnY0bC4iLAorICAgICAgICBidWZfc2l6ZSwgaW1nX3NpemUpOworICAgIGdvdG8gZmFpbGVkOworICB9CitmYWlsZWQ6CisgIGdzdF92NGwyX21lbW9yeV9ncm91cF9mcmVlIChncm91cCk7CisgIHJldHVybiBOVUxMOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogR3N0VjRsQWxsb2NhdG9yIGltcGxlbWVudGF0aW9uICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2FsbG9jYXRvcl9yZWxlYXNlIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yLCBHc3RWNGwyTWVtb3J5ICogbWVtKQoreworICBHc3RWNGwyTWVtb3J5R3JvdXAgKmdyb3VwID0gbWVtLT5ncm91cDsKKworICBHU1RfTE9HX09CSkVDVCAoYWxsb2NhdG9yLCAicGxhbmUgJWkgb2YgYnVmZmVyICV1IHJlbGVhc2VkIiwKKyAgICAgIG1lbS0+cGxhbmUsIGdyb3VwLT5idWZmZXIuaW5kZXgpOworCisgIHN3aXRjaCAoYWxsb2NhdG9yLT5tZW1vcnkpIHsKKyAgICBjYXNlIFY0TDJfTUVNT1JZX0RNQUJVRjoKKyAgICAgIGNsb3NlIChtZW0tPmRtYWZkKTsKKyAgICAgIG1lbS0+ZG1hZmQgPSAtMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9NRU1PUllfVVNFUlBUUjoKKyAgICAgIG1lbS0+ZGF0YSA9IE5VTEw7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBXaGVuIGFsbCBtZW1vcnkgYXJlIGJhY2ssIHB1dCB0aGUgZ3JvdXAgYmFjayBpbiB0aGUgZnJlZSBxdWV1ZSAqLworICBpZiAoZ19hdG9taWNfaW50X2RlY19hbmRfdGVzdCAoJmdyb3VwLT5tZW1zX2FsbG9jYXRlZCkpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoYWxsb2NhdG9yLCAiYnVmZmVyICV1IHJlbGVhc2VkIiwgZ3JvdXAtPmJ1ZmZlci5pbmRleCk7CisgICAgZ3N0X2F0b21pY19xdWV1ZV9wdXNoIChhbGxvY2F0b3ItPmZyZWVfcXVldWUsIGdyb3VwKTsKKyAgICBnX3NpZ25hbF9lbWl0IChhbGxvY2F0b3IsIGdzdF92NGwyX2FsbG9jYXRvcl9zaWduYWxzW0dST1VQX1JFTEVBU0VEXSwgMCk7CisgIH0KKworICAvKiBLZWVwIGxhc3QsIGFsbG9jYXRvciBtYXkgYmUgZnJlZWQgYWZ0ZXIgdGhpcyBjYWxsICovCisgIGdfb2JqZWN0X3VucmVmIChhbGxvY2F0b3IpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfYWxsb2NhdG9yX2ZyZWUgKEdzdEFsbG9jYXRvciAqIGdhbGxvY2F0b3IsIEdzdE1lbW9yeSAqIGdtZW0pCit7CisgIEdzdFY0bDJBbGxvY2F0b3IgKmFsbG9jYXRvciA9IChHc3RWNGwyQWxsb2NhdG9yICopIGdhbGxvY2F0b3I7CisgIEdzdFY0bDJPYmplY3QgKm9iaiA9IGFsbG9jYXRvci0+b2JqOworICBHc3RWNGwyTWVtb3J5ICptZW0gPSAoR3N0VjRsMk1lbW9yeSAqKSBnbWVtOworICBHc3RWNGwyTWVtb3J5R3JvdXAgKmdyb3VwID0gbWVtLT5ncm91cDsKKworICAvKiBPbmx5IGZyZWUgdW5wYXJlbnRlZCBtZW1vcnkgKi8KKyAgaWYgKG1lbS0+bWVtLnBhcmVudCA9PSBOVUxMKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGFsbG9jYXRvciwgImZyZWVpbmcgcGxhbmUgJWkgb2YgYnVmZmVyICV1IiwKKyAgICAgICAgbWVtLT5wbGFuZSwgZ3JvdXAtPmJ1ZmZlci5pbmRleCk7CisKKyAgICBpZiAoYWxsb2NhdG9yLT5tZW1vcnkgPT0gVjRMMl9NRU1PUllfTU1BUCkgeworICAgICAgaWYgKG1lbS0+ZGF0YSkKKyAgICAgICAgb2JqLT5tdW5tYXAgKG1lbS0+ZGF0YSwgZ3JvdXAtPnBsYW5lc1ttZW0tPnBsYW5lXS5sZW5ndGgpOworICAgIH0KKworICAgIC8qIFRoaXMgYXBwbHkgZm9yIGJvdGggbW1hcCB3aXRoIGV4cGJ1ZiwgYW5kIGRtYWJ1ZiBpbXBvcnRlZCBtZW1vcnkgKi8KKyAgICBpZiAobWVtLT5kbWFmZCA+PSAwKQorICAgICAgY2xvc2UgKG1lbS0+ZG1hZmQpOworICB9CisKKyAgZ19zbGljZV9mcmVlIChHc3RWNGwyTWVtb3J5LCBtZW0pOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfYWxsb2NhdG9yX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmopCit7CisgIEdzdFY0bDJBbGxvY2F0b3IgKmFsbG9jYXRvciA9IChHc3RWNGwyQWxsb2NhdG9yICopIG9iajsKKyAgZ2ludCBpOworCisgIEdTVF9MT0dfT0JKRUNUIChvYmosICJjYWxsZWQiKTsKKworICBmb3IgKGkgPSAwOyBpIDwgYWxsb2NhdG9yLT5jb3VudDsgaSsrKSB7CisgICAgR3N0VjRsMk1lbW9yeUdyb3VwICpncm91cCA9IGFsbG9jYXRvci0+Z3JvdXBzW2ldOworICAgIGFsbG9jYXRvci0+Z3JvdXBzW2ldID0gTlVMTDsKKyAgICBpZiAoZ3JvdXApCisgICAgICBnc3RfdjRsMl9tZW1vcnlfZ3JvdXBfZnJlZSAoZ3JvdXApOworICB9CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iaik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9hbGxvY2F0b3JfZmluYWxpemUgKEdPYmplY3QgKiBvYmopCit7CisgIEdzdFY0bDJBbGxvY2F0b3IgKmFsbG9jYXRvciA9IChHc3RWNGwyQWxsb2NhdG9yICopIG9iajsKKworICBHU1RfTE9HX09CSkVDVCAob2JqLCAiY2FsbGVkIik7CisKKyAgZ3N0X2F0b21pY19xdWV1ZV91bnJlZiAoYWxsb2NhdG9yLT5mcmVlX3F1ZXVlKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYWxsb2NhdG9yLT5vYmotPmVsZW1lbnQpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2FsbG9jYXRvcl9jbGFzc19pbml0IChHc3RWNGwyQWxsb2NhdG9yQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpvYmplY3RfY2xhc3M7CisgIEdzdEFsbG9jYXRvckNsYXNzICphbGxvY2F0b3JfY2xhc3M7CisKKyAgYWxsb2NhdG9yX2NsYXNzID0gKEdzdEFsbG9jYXRvckNsYXNzICopIGtsYXNzOworICBvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworCisgIGFsbG9jYXRvcl9jbGFzcy0+YWxsb2MgPSBOVUxMOworICBhbGxvY2F0b3JfY2xhc3MtPmZyZWUgPSBnc3RfdjRsMl9hbGxvY2F0b3JfZnJlZTsKKworICBvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3RfdjRsMl9hbGxvY2F0b3JfZGlzcG9zZTsKKyAgb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF92NGwyX2FsbG9jYXRvcl9maW5hbGl6ZTsKKworICBnc3RfdjRsMl9hbGxvY2F0b3Jfc2lnbmFsc1tHUk9VUF9SRUxFQVNFRF0gPSBnX3NpZ25hbF9uZXcgKCJncm91cC1yZWxlYXNlZCIsCisgICAgICBHX1RZUEVfRlJPTV9DTEFTUyAob2JqZWN0X2NsYXNzKSwgR19TSUdOQUxfUlVOX0xBU1QsIDAsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICBHX1RZUEVfTk9ORSwgMCk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHY0bDJhbGxvY2F0b3JfZGVidWcsICJ2NGwyYWxsb2NhdG9yIiwgMCwKKyAgICAgICJWNEwyIEFsbG9jYXRvciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfYWxsb2NhdG9yX2luaXQgKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IpCit7CisgIEdzdEFsbG9jYXRvciAqYWxsb2MgPSBHU1RfQUxMT0NBVE9SX0NBU1QgKGFsbG9jYXRvcik7CisKKyAgYWxsb2MtPm1lbV90eXBlID0gR1NUX1Y0TDJfTUVNT1JZX1RZUEU7CisgIGFsbG9jLT5tZW1fbWFwID0gKEdzdE1lbW9yeU1hcEZ1bmN0aW9uKSBfdjRsMm1lbV9tYXA7CisgIGFsbG9jLT5tZW1fdW5tYXAgPSAoR3N0TWVtb3J5VW5tYXBGdW5jdGlvbikgX3Y0bDJtZW1fdW5tYXA7CisgIGFsbG9jLT5tZW1fc2hhcmUgPSAoR3N0TWVtb3J5U2hhcmVGdW5jdGlvbikgX3Y0bDJtZW1fc2hhcmU7CisgIGFsbG9jLT5tZW1faXNfc3BhbiA9IChHc3RNZW1vcnlJc1NwYW5GdW5jdGlvbikgX3Y0bDJtZW1faXNfc3BhbjsKKyAgLyogVXNlIHRoZSBkZWZhdWx0LCBmYWxsYmFjayBjb3B5IGZ1bmN0aW9uICovCisKKyAgYWxsb2NhdG9yLT5mcmVlX3F1ZXVlID0gZ3N0X2F0b21pY19xdWV1ZV9uZXcgKFZJREVPX01BWF9GUkFNRSk7CisKKyAgR1NUX09CSkVDVF9GTEFHX1NFVCAoYWxsb2NhdG9yLCBHU1RfQUxMT0NBVE9SX0ZMQUdfQ1VTVE9NX0FMTE9DKTsKK30KKworI2RlZmluZSBHU1RfVjRMMl9BTExPQ0FUT1JfUFJPQkUob2JqLHR5cGUpIFwKKyAgICBnc3RfdjRsMl9hbGxvY2F0b3JfcHJvYmUgKChvYmopLCBWNEwyX01FTU9SWV8gIyMgdHlwZSwgXAorICAgICAgICBHU1RfVjRMMl9BTExPQ0FUT1JfRkxBR18gIyMgdHlwZSAjIyBfUkVRQlVGUywgXAorICAgICAgICBHU1RfVjRMMl9BTExPQ0FUT1JfRkxBR18gIyMgdHlwZSAjIyBfQ1JFQVRFX0JVRlMpCitzdGF0aWMgZ3VpbnQzMgorZ3N0X3Y0bDJfYWxsb2NhdG9yX3Byb2JlIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yLCBndWludDMyIG1lbW9yeSwKKyAgICBndWludDMyIGJyZXFfZmxhZywgZ3VpbnQzMiBiY3JlYXRlX2ZsYWcpCit7CisgIEdzdFY0bDJPYmplY3QgKm9iaiA9IGFsbG9jYXRvci0+b2JqOworICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyBicmVxID0geyAwIH07CisgIGd1aW50MzIgZmxhZ3MgPSAwOworCisgIGJyZXEudHlwZSA9IG9iai0+dHlwZTsKKyAgYnJlcS5jb3VudCA9IDA7CisgIGJyZXEubWVtb3J5ID0gbWVtb3J5OworCisgIGlmIChvYmotPmlvY3RsIChvYmotPnZpZGVvX2ZkLCBWSURJT0NfUkVRQlVGUywgJmJyZXEpID09IDApIHsKKyAgICBzdHJ1Y3QgdjRsMl9jcmVhdGVfYnVmZmVycyBiY3JlYXRlID0geyAwIH07CisKKyAgICBmbGFncyB8PSBicmVxX2ZsYWc7CisKKyAgICBiY3JlYXRlLm1lbW9yeSA9IG1lbW9yeTsKKyAgICBiY3JlYXRlLmZvcm1hdCA9IG9iai0+Zm9ybWF0OworCisgICAgaWYgKChvYmotPmlvY3RsIChvYmotPnZpZGVvX2ZkLCBWSURJT0NfQ1JFQVRFX0JVRlMsICZiY3JlYXRlKSA9PSAwKSkKKyAgICAgIGZsYWdzIHw9IGJjcmVhdGVfZmxhZzsKKyAgfQorCisgIHJldHVybiBmbGFnczsKK30KKworc3RhdGljIEdzdFY0bDJNZW1vcnlHcm91cCAqCitnc3RfdjRsMl9hbGxvY2F0b3JfY3JlYXRlX2J1ZiAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvcikKK3sKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gYWxsb2NhdG9yLT5vYmo7CisgIHN0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzIGJjcmVhdGUgPSB7IDAgfTsKKyAgR3N0VjRsMk1lbW9yeUdyb3VwICpncm91cCA9IE5VTEw7CisKKyAgR1NUX09CSkVDVF9MT0NLIChhbGxvY2F0b3IpOworCisgIGlmICghZ19hdG9taWNfaW50X2dldCAoJmFsbG9jYXRvci0+YWN0aXZlKSkKKyAgICBnb3RvIGRvbmU7CisKKyAgYmNyZWF0ZS5tZW1vcnkgPSBhbGxvY2F0b3ItPm1lbW9yeTsKKyAgYmNyZWF0ZS5mb3JtYXQgPSBvYmotPmZvcm1hdDsKKyAgYmNyZWF0ZS5jb3VudCA9IDE7CisKKyAgaWYgKCFhbGxvY2F0b3ItPmNhbl9hbGxvY2F0ZSkKKyAgICBnb3RvIGRvbmU7CisKKyAgaWYgKG9iai0+aW9jdGwgKG9iai0+dmlkZW9fZmQsIFZJRElPQ19DUkVBVEVfQlVGUywgJmJjcmVhdGUpIDwgMCkKKyAgICBnb3RvIGNyZWF0ZV9idWZzX2ZhaWxlZDsKKworICBpZiAoYWxsb2NhdG9yLT5ncm91cHNbYmNyZWF0ZS5pbmRleF0gIT0gTlVMTCkKKyAgICBnb3RvIGNyZWF0ZV9idWZzX2J1ZzsKKworICBncm91cCA9IGdzdF92NGwyX21lbW9yeV9ncm91cF9uZXcgKGFsbG9jYXRvciwgYmNyZWF0ZS5pbmRleCk7CisKKyAgaWYgKGdyb3VwKSB7CisgICAgYWxsb2NhdG9yLT5ncm91cHNbYmNyZWF0ZS5pbmRleF0gPSBncm91cDsKKyAgICBhbGxvY2F0b3ItPmNvdW50Kys7CisgIH0KKworZG9uZToKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGFsbG9jYXRvcik7CisgIHJldHVybiBncm91cDsKKworY3JlYXRlX2J1ZnNfZmFpbGVkOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhbGxvY2F0b3IsICJlcnJvciBjcmVhdGluZyBhIG5ldyBidWZmZXI6ICVzIiwKKyAgICAgICAgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK2NyZWF0ZV9idWZzX2J1ZzoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGFsbG9jYXRvciwgImNyZWF0ZWQgYnVmZmVyIGhhcyBhbHJlYWR5IHVzZWQgYnVmZmVyICIKKyAgICAgICAgImluZGV4ICVpLCB0aGlzIG1lYW5zIHRoZXJlIGlzIGFuIGJ1ZyBpbiB5b3VyIGRyaXZlciBvciBsaWJ2NGwyIiwKKyAgICAgICAgYmNyZWF0ZS5pbmRleCk7CisgICAgZ290byBkb25lOworICB9Cit9CisKK3N0YXRpYyBHc3RWNGwyTWVtb3J5R3JvdXAgKgorZ3N0X3Y0bDJfYWxsb2NhdG9yX2FsbG9jIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yKQoreworICBHc3RWNGwyTWVtb3J5R3JvdXAgKmdyb3VwOworCisgIGlmICghZ19hdG9taWNfaW50X2dldCAoJmFsbG9jYXRvci0+YWN0aXZlKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBncm91cCA9IGdzdF9hdG9taWNfcXVldWVfcG9wIChhbGxvY2F0b3ItPmZyZWVfcXVldWUpOworCisgIGlmIChncm91cCA9PSBOVUxMKSB7CisgICAgaWYgKGFsbG9jYXRvci0+Y2FuX2FsbG9jYXRlKSB7CisgICAgICBncm91cCA9IGdzdF92NGwyX2FsbG9jYXRvcl9jcmVhdGVfYnVmIChhbGxvY2F0b3IpOworCisgICAgICAvKiBEb24ndCBoYW1tZXIgb24gQ1JFQVRFX0JVRlMgKi8KKyAgICAgIGlmIChncm91cCA9PSBOVUxMKQorICAgICAgICBhbGxvY2F0b3ItPmNhbl9hbGxvY2F0ZSA9IEZBTFNFOworICAgIH0KKyAgfQorCisgIHJldHVybiBncm91cDsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2FsbG9jYXRvcl9yZXNldF9zaXplIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yLAorICAgIEdzdFY0bDJNZW1vcnlHcm91cCAqIGdyb3VwKQoreworICBnaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBncm91cC0+bl9tZW07IGkrKykgeworICAgIGdyb3VwLT5tZW1baV0tPm1heHNpemUgPSBncm91cC0+cGxhbmVzW2ldLmxlbmd0aDsKKyAgICBncm91cC0+bWVtW2ldLT5vZmZzZXQgPSAwOworICAgIGdyb3VwLT5tZW1baV0tPnNpemUgPSBncm91cC0+cGxhbmVzW2ldLmxlbmd0aDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorX2NsZWFudXBfZmFpbGVkX2FsbG9jIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yLCBHc3RWNGwyTWVtb3J5R3JvdXAgKiBncm91cCkKK3sKKyAgaWYgKGdyb3VwLT5tZW1zX2FsbG9jYXRlZCA+IDApIHsKKyAgICBnaW50IGk7CisgICAgLyogSWYgb25lIG9yIG1vcmUgbW1hcCB3b3JrZWQsIHdlIG5lZWQgdG8gdW5yZWYgdGhlIG1lbW9yeSwgb3RoZXJ3aXNlCisgICAgICogdGhleSB3aWxsIGtlZXAgYSByZWYgb24gdGhlIGFsbG9jYXRvciBhbmQgbGVhayBpdC4gVGhpcyB3aWxsIHB1dCBiYWNrCisgICAgICogdGhlIGdyb3VwIGludG8gdGhlIGZyZWVfcXVldWUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXAtPm5fbWVtOyBpKyspCisgICAgICBnc3RfbWVtb3J5X3VucmVmIChncm91cC0+bWVtW2ldKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBPdGhlcndpc2UsIGdyb3VwIGhhcyB0byBiZSBvbiBmcmVlIHF1ZXVlIGZvciBfc3RvcCgpIHRvIHdvcmsgKi8KKyAgICBnc3RfYXRvbWljX3F1ZXVlX3B1c2ggKGFsbG9jYXRvci0+ZnJlZV9xdWV1ZSwgZ3JvdXApOworICB9Cit9CisKKworCitHc3RWNGwyQWxsb2NhdG9yICoKK2dzdF92NGwyX2FsbG9jYXRvcl9uZXcgKEdzdE9iamVjdCAqIHBhcmVudCwgR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpCit7CisgIEdzdFY0bDJBbGxvY2F0b3IgKmFsbG9jYXRvcjsKKyAgZ3VpbnQzMiBmbGFncyA9IDA7CisgIGdjaGFyICpuYW1lLCAqcGFyZW50X25hbWU7CisKKyAgcGFyZW50X25hbWUgPSBnc3Rfb2JqZWN0X2dldF9uYW1lIChwYXJlbnQpOworICBuYW1lID0gZ19zdHJjb25jYXQgKHBhcmVudF9uYW1lLCAiOmFsbG9jYXRvciIsIE5VTEwpOworICBnX2ZyZWUgKHBhcmVudF9uYW1lKTsKKworICBhbGxvY2F0b3IgPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX1Y0TDJfQUxMT0NBVE9SLCAibmFtZSIsIG5hbWUsIE5VTEwpOworICBnc3Rfb2JqZWN0X3JlZl9zaW5rIChhbGxvY2F0b3IpOworICBnX2ZyZWUgKG5hbWUpOworCisgIC8qIFNhdmUgZXZlcnl0aGluZyAqLworICBhbGxvY2F0b3ItPm9iaiA9IHY0bDJvYmplY3Q7CisKKyAgLyogS2VlcCBhIHJlZiBvbiB0aGUgZWxlbW50IHNvIG9iaiBkb2VzIG5vdCBkaXNhcGVhciAqLworICBnc3Rfb2JqZWN0X3JlZiAoYWxsb2NhdG9yLT5vYmotPmVsZW1lbnQpOworCisgIGZsYWdzIHw9IEdTVF9WNEwyX0FMTE9DQVRPUl9QUk9CRSAoYWxsb2NhdG9yLCBNTUFQKTsKKyAgZmxhZ3MgfD0gR1NUX1Y0TDJfQUxMT0NBVE9SX1BST0JFIChhbGxvY2F0b3IsIFVTRVJQVFIpOworICBmbGFncyB8PSBHU1RfVjRMMl9BTExPQ0FUT1JfUFJPQkUgKGFsbG9jYXRvciwgRE1BQlVGKTsKKworCisgIGlmIChmbGFncyA9PSAwKSB7CisgICAgLyogRHJpdmVycyBub3QgcG9ydGVkIGZyb20gdmlkZW9idWYgdG8gdmlkZWJ1ZjIgZG9uJ3QgYWxsb3cgZnJlZWluZyBidWZmZXJzCisgICAgICogdXNpbmcgUkVRQlVGUygwKS4gVGhpcyBpcyBhIHdvcmthcm91bmQgdG8gc3RpbGwgc3VwcG9ydCB0aGVzZSBkcml2ZXJzLAorICAgICAqIHdoaWNoIGFyZSBrbm93biB0byBoYXZlIE1NQVAgc3VwcG9ydC4gKi8KKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGFsbG9jYXRvciwgIkNvdWxkIG5vdCBwcm9iZSBzdXBwb3J0ZWQgbWVtb3J5IHR5cGUsICIKKyAgICAgICAgImFzc3VtaW5nIE1NQVAgaXMgc3VwcG9ydGVkLCB0aGlzIGlzIGV4cGVjdGVkIGZvciBvbGRlciBkcml2ZXJzIG5vdCAiCisgICAgICAgICIgeWV0IHBvcnRlZCB0byB2aWRlb2J1ZjIgZnJhbWV3b3JrIik7CisgICAgZmxhZ3MgPSBHU1RfVjRMMl9BTExPQ0FUT1JfRkxBR19NTUFQX1JFUUJVRlM7CisgIH0KKworICBHU1RfT0JKRUNUX0ZMQUdfU0VUIChhbGxvY2F0b3IsIGZsYWdzKTsKKworICByZXR1cm4gYWxsb2NhdG9yOworfQorCitndWludAorZ3N0X3Y0bDJfYWxsb2NhdG9yX3N0YXJ0IChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yLCBndWludDMyIGNvdW50LAorICAgIGd1aW50MzIgbWVtb3J5KQoreworICBHc3RWNGwyT2JqZWN0ICpvYmogPSBhbGxvY2F0b3ItPm9iajsKKyAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgYnJlcSA9IHsgY291bnQsIG9iai0+dHlwZSwgbWVtb3J5IH07CisgIGdib29sZWFuIGNhbl9hbGxvY2F0ZTsKKyAgZ2ludCBpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb3VudCAhPSAwLCAwKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGFsbG9jYXRvcik7CisKKyAgaWYgKGdfYXRvbWljX2ludF9nZXQgKCZhbGxvY2F0b3ItPmFjdGl2ZSkpCisgICAgZ290byBhbHJlYWR5X2FjdGl2ZTsKKworICBpZiAob2JqLT5pb2N0bCAob2JqLT52aWRlb19mZCwgVklESU9DX1JFUUJVRlMsICZicmVxKSA8IDApCisgICAgZ290byByZXFidWZzX2ZhaWxlZDsKKworICBpZiAoYnJlcS5jb3VudCA8IDEpCisgICAgZ290byBvdXRfb2ZfbWVtb3J5OworCisgIHN3aXRjaCAobWVtb3J5KSB7CisgICAgY2FzZSBWNEwyX01FTU9SWV9NTUFQOgorICAgICAgY2FuX2FsbG9jYXRlID0gR1NUX1Y0TDJfQUxMT0NBVE9SX0NBTl9BTExPQ0FURSAoYWxsb2NhdG9yLCBNTUFQKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9NRU1PUllfVVNFUlBUUjoKKyAgICAgIGNhbl9hbGxvY2F0ZSA9IEdTVF9WNEwyX0FMTE9DQVRPUl9DQU5fQUxMT0NBVEUgKGFsbG9jYXRvciwgVVNFUlBUUik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfTUVNT1JZX0RNQUJVRjoKKyAgICAgIGNhbl9hbGxvY2F0ZSA9IEdTVF9WNEwyX0FMTE9DQVRPUl9DQU5fQUxMT0NBVEUgKGFsbG9jYXRvciwgRE1BQlVGKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBjYW5fYWxsb2NhdGUgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYWxsb2NhdG9yLCAiYWxsb2NhdGVkICV1ICVzIGJ1ZmZlcnMgb3V0IG9mICV1IHJlcXVlc3RlZCIsCisgICAgICBicmVxLmNvdW50LCBtZW1vcnlfdHlwZV90b19zdHIgKG1lbW9yeSksIGNvdW50KTsKKworICBhbGxvY2F0b3ItPmNhbl9hbGxvY2F0ZSA9IGNhbl9hbGxvY2F0ZTsKKyAgYWxsb2NhdG9yLT5jb3VudCA9IGJyZXEuY291bnQ7CisgIGFsbG9jYXRvci0+bWVtb3J5ID0gbWVtb3J5OworCisgIC8qIENyZWF0ZSBtZW1vcnkgZ3JvdXBzICovCisgIGZvciAoaSA9IDA7IGkgPCBhbGxvY2F0b3ItPmNvdW50OyBpKyspIHsKKyAgICBhbGxvY2F0b3ItPmdyb3Vwc1tpXSA9IGdzdF92NGwyX21lbW9yeV9ncm91cF9uZXcgKGFsbG9jYXRvciwgaSk7CisgICAgaWYgKGFsbG9jYXRvci0+Z3JvdXBzW2ldID09IE5VTEwpCisgICAgICBnb3RvIGVycm9yOworCisgICAgZ3N0X2F0b21pY19xdWV1ZV9wdXNoIChhbGxvY2F0b3ItPmZyZWVfcXVldWUsIGFsbG9jYXRvci0+Z3JvdXBzW2ldKTsKKyAgfQorCisgIGdfYXRvbWljX2ludF9zZXQgKCZhbGxvY2F0b3ItPmFjdGl2ZSwgVFJVRSk7CisKK2RvbmU6CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChhbGxvY2F0b3IpOworICByZXR1cm4gYnJlcS5jb3VudDsKKworYWxyZWFkeV9hY3RpdmU6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChhbGxvY2F0b3IsICJhbGxvY2F0b3IgYWxyZWFkeSBhY3RpdmUiKTsKKyAgICBnb3RvIGVycm9yOworICB9CityZXFidWZzX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGFsbG9jYXRvciwKKyAgICAgICAgImVycm9yIHJlcXVlc3RpbmcgJWQgYnVmZmVyczogJXMiLCBjb3VudCwgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICBnb3RvIGVycm9yOworICB9CitvdXRfb2ZfbWVtb3J5OgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoYWxsb2NhdG9yLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgYnVmZmVycyIpOworICAgIGdvdG8gZXJyb3I7CisgIH0KK2Vycm9yOgorICB7CisgICAgYnJlcS5jb3VudCA9IDA7CisgICAgZ290byBkb25lOworICB9Cit9CisKK0dzdFY0bDJSZXR1cm4KK2dzdF92NGwyX2FsbG9jYXRvcl9zdG9wIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yKQoreworICBHc3RWNGwyT2JqZWN0ICpvYmogPSBhbGxvY2F0b3ItPm9iajsKKyAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgYnJlcSA9IHsgMCwgb2JqLT50eXBlLCBhbGxvY2F0b3ItPm1lbW9yeSB9OworICBnaW50IGkgPSAwOworICBHc3RWNGwyUmV0dXJuIHJldCA9IEdTVF9WNEwyX09LOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGFsbG9jYXRvciwgInN0b3AgYWxsb2NhdG9yIik7CisKKyAgR1NUX09CSkVDVF9MT0NLIChhbGxvY2F0b3IpOworCisgIGlmICghZ19hdG9taWNfaW50X2dldCAoJmFsbG9jYXRvci0+YWN0aXZlKSkKKyAgICBnb3RvIGRvbmU7CisKKyAgaWYgKGdzdF9hdG9taWNfcXVldWVfbGVuZ3RoIChhbGxvY2F0b3ItPmZyZWVfcXVldWUpICE9IGFsbG9jYXRvci0+Y291bnQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhbGxvY2F0b3IsICJhbGxvY2F0b3IgaXMgc3RpbGwgaW4gdXNlIik7CisgICAgcmV0ID0gR1NUX1Y0TDJfQlVTWTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICB3aGlsZSAoZ3N0X2F0b21pY19xdWV1ZV9wb3AgKGFsbG9jYXRvci0+ZnJlZV9xdWV1ZSkpIHsKKyAgICAvKiBub3RoaW5nICovCisgIH07CisKKyAgZm9yIChpID0gMDsgaSA8IGFsbG9jYXRvci0+Y291bnQ7IGkrKykgeworICAgIEdzdFY0bDJNZW1vcnlHcm91cCAqZ3JvdXAgPSBhbGxvY2F0b3ItPmdyb3Vwc1tpXTsKKyAgICBhbGxvY2F0b3ItPmdyb3Vwc1tpXSA9IE5VTEw7CisgICAgaWYgKGdyb3VwKQorICAgICAgZ3N0X3Y0bDJfbWVtb3J5X2dyb3VwX2ZyZWUgKGdyb3VwKTsKKyAgfQorCisgIC8qIE5vdCBhbGwgZHJpdmVycyBzdXBwb3J0IHJlYnVmcygwKSwgc28gd2FybiBvbmx5ICovCisgIGlmIChvYmotPmlvY3RsIChvYmotPnZpZGVvX2ZkLCBWSURJT0NfUkVRQlVGUywgJmJyZXEpIDwgMCkKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGFsbG9jYXRvciwKKyAgICAgICAgImVycm9yIHJlbGVhc2luZyBidWZmZXJzIGJ1ZmZlcnM6ICVzIiwgZ19zdHJlcnJvciAoZXJybm8pKTsKKworICBhbGxvY2F0b3ItPmNvdW50ID0gMDsKKworICBnX2F0b21pY19pbnRfc2V0ICgmYWxsb2NhdG9yLT5hY3RpdmUsIEZBTFNFKTsKKworZG9uZToKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGFsbG9jYXRvcik7CisgIHJldHVybiByZXQ7Cit9CisKK0dzdFY0bDJNZW1vcnlHcm91cCAqCitnc3RfdjRsMl9hbGxvY2F0b3JfYWxsb2NfbW1hcCAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvcikKK3sKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gYWxsb2NhdG9yLT5vYmo7CisgIEdzdFY0bDJNZW1vcnlHcm91cCAqZ3JvdXA7CisgIGdpbnQgaTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoYWxsb2NhdG9yLT5tZW1vcnkgPT0gVjRMMl9NRU1PUllfTU1BUCwgTlVMTCk7CisKKyAgZ3JvdXAgPSBnc3RfdjRsMl9hbGxvY2F0b3JfYWxsb2MgKGFsbG9jYXRvcik7CisKKyAgaWYgKGdyb3VwID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IGdyb3VwLT5uX21lbTsgaSsrKSB7CisgICAgaWYgKGdyb3VwLT5tZW1baV0gPT0gTlVMTCkgeworICAgICAgZ3BvaW50ZXIgZGF0YTsKKyAgICAgIGRhdGEgPSBvYmotPm1tYXAgKE5VTEwsIGdyb3VwLT5wbGFuZXNbaV0ubGVuZ3RoLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorICAgICAgICAgIE1BUF9TSEFSRUQsIG9iai0+dmlkZW9fZmQsIGdyb3VwLT5wbGFuZXNbaV0ubS5tZW1fb2Zmc2V0KTsKKworICAgICAgaWYgKGRhdGEgPT0gTUFQX0ZBSUxFRCkKKyAgICAgICAgZ290byBtbWFwX2ZhaWxlZDsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKGFsbG9jYXRvciwKKyAgICAgICAgICAibW1hcCBidWZmZXIgbGVuZ3RoICVkLCBkYXRhIG9mZnNldCAlZCwgcGxhbmUgJWQiLAorICAgICAgICAgIGdyb3VwLT5wbGFuZXNbaV0ubGVuZ3RoLCBncm91cC0+cGxhbmVzW2ldLmRhdGFfb2Zmc2V0LCBpKTsKKworICAgICAgZ3JvdXAtPm1lbVtpXSA9IChHc3RNZW1vcnkgKikgX3Y0bDJtZW1fbmV3ICgwLCBHU1RfQUxMT0NBVE9SIChhbGxvY2F0b3IpLAorICAgICAgICAgIE5VTEwsIGdyb3VwLT5wbGFuZXNbaV0ubGVuZ3RoLCAwLCAwLCBncm91cC0+cGxhbmVzW2ldLmxlbmd0aCwgaSwgZGF0YSwKKyAgICAgICAgICAtMSwgZ3JvdXApOworICAgIH0gZWxzZSB7CisgICAgICAvKiBUYWtlIGJhY2sgdGhlIGFsbG9jYXRvciByZWZlcmVuY2UgKi8KKyAgICAgIGdzdF9vYmplY3RfcmVmIChhbGxvY2F0b3IpOworICAgIH0KKworICAgIGdyb3VwLT5tZW1zX2FsbG9jYXRlZCsrOworICB9CisKKyAgLyogRW5zdXJlIGdyb3VwIHNpemUuIFVubGlrZSBHU1QsIHY0bDIgaGF2ZSBzaXplIChieXRlc3VzZWQpIGluaXRpYWxseSBzZXQKKyAgICogdG8gMC4gQXMgbGVuZ3RoIG1pZ2h0IGJlIGJpZ2dlciB0aGVuIHRoZSBleHBlY3RlZCBzaXplIGV4cG9zZWQgaW4gdGhlCisgICAqIGZvcm1hdCwgd2Ugc2ltcGx5IHNldCBieXRlc3VzZWQgaW5pdGlhbGx5IGFuZCByZXNldCBpdCBoZXJlIGZvcgorICAgKiBzaW1wbGljaXR5ICovCisgIGdzdF92NGwyX2FsbG9jYXRvcl9yZXNldF9zaXplIChhbGxvY2F0b3IsIGdyb3VwKTsKKworICByZXR1cm4gZ3JvdXA7CisKK21tYXBfZmFpbGVkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoYWxsb2NhdG9yLCAiRmFpbGVkIHRvIG1tYXAgYnVmZmVyOiAlcyIsCisgICAgICAgIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgX2NsZWFudXBfZmFpbGVkX2FsbG9jIChhbGxvY2F0b3IsIGdyb3VwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitHc3RWNGwyTWVtb3J5R3JvdXAgKgorZ3N0X3Y0bDJfYWxsb2NhdG9yX2FsbG9jX2RtYWJ1ZiAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvciwKKyAgICBHc3RBbGxvY2F0b3IgKiBkbWFidWZfYWxsb2NhdG9yKQoreworICBHc3RWNGwyT2JqZWN0ICpvYmogPSBhbGxvY2F0b3ItPm9iajsKKyAgR3N0VjRsMk1lbW9yeUdyb3VwICpncm91cDsKKyAgZ2ludCBpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChhbGxvY2F0b3ItPm1lbW9yeSA9PSBWNEwyX01FTU9SWV9NTUFQLCBOVUxMKTsKKworICBncm91cCA9IGdzdF92NGwyX2FsbG9jYXRvcl9hbGxvYyAoYWxsb2NhdG9yKTsKKworICBpZiAoZ3JvdXAgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXAtPm5fbWVtOyBpKyspIHsKKyAgICBHc3RWNGwyTWVtb3J5ICptZW07CisgICAgR3N0TWVtb3J5ICpkbWFfbWVtOworICAgIGdpbnQgZG1hZmQ7CisKKyAgICBpZiAoZ3JvdXAtPm1lbVtpXSA9PSBOVUxMKSB7CisgICAgICBzdHJ1Y3QgdjRsMl9leHBvcnRidWZmZXIgZXhwYnVmID0geyAwIH07CisKKyAgICAgIGV4cGJ1Zi50eXBlID0gb2JqLT50eXBlOworICAgICAgZXhwYnVmLmluZGV4ID0gZ3JvdXAtPmJ1ZmZlci5pbmRleDsKKyAgICAgIGV4cGJ1Zi5wbGFuZSA9IGk7CisgICAgICBleHBidWYuZmxhZ3MgPSBPX0NMT0VYRUMgfCBPX1JEV1I7CisKKyAgICAgIGlmIChvYmotPmlvY3RsIChvYmotPnZpZGVvX2ZkLCBWSURJT0NfRVhQQlVGLCAmZXhwYnVmKSA8IDApCisgICAgICAgIGdvdG8gZXhwYnVmX2ZhaWxlZDsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKGFsbG9jYXRvciwgImV4cG9ydGVkIERNQUJVRiBhcyBmZCAlaSBwbGFuZSAlZCIsCisgICAgICAgICAgZXhwYnVmLmZkLCBpKTsKKworICAgICAgZ3JvdXAtPm1lbVtpXSA9IChHc3RNZW1vcnkgKikgX3Y0bDJtZW1fbmV3ICgwLCBHU1RfQUxMT0NBVE9SIChhbGxvY2F0b3IpLAorICAgICAgICAgIE5VTEwsIGdyb3VwLT5wbGFuZXNbaV0ubGVuZ3RoLCAwLCBncm91cC0+cGxhbmVzW2ldLmRhdGFfb2Zmc2V0LAorICAgICAgICAgIGdyb3VwLT5wbGFuZXNbaV0ubGVuZ3RoIC0gZ3JvdXAtPnBsYW5lc1tpXS5kYXRhX29mZnNldCwgaSwgTlVMTCwKKyAgICAgICAgICBleHBidWYuZmQsIGdyb3VwKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogVGFrZSBiYWNrIHRoZSBhbGxvY2F0b3IgcmVmZXJlbmNlICovCisgICAgICBnc3Rfb2JqZWN0X3JlZiAoYWxsb2NhdG9yKTsKKyAgICB9CisKKyAgICBncm91cC0+bWVtc19hbGxvY2F0ZWQrKzsKKworICAgIGdfYXNzZXJ0IChnc3RfaXNfdjRsMl9tZW1vcnkgKGdyb3VwLT5tZW1baV0pKTsKKyAgICBtZW0gPSAoR3N0VjRsMk1lbW9yeSAqKSBncm91cC0+bWVtW2ldOworCisgICAgaWYgKChkbWFmZCA9IGR1cCAobWVtLT5kbWFmZCkpIDwgMCkKKyAgICAgIGdvdG8gZHVwX2ZhaWxlZDsKKworICAgIGRtYV9tZW0gPSBnc3RfZG1hYnVmX2FsbG9jYXRvcl9hbGxvYyAoZG1hYnVmX2FsbG9jYXRvciwgZG1hZmQsCisgICAgICAgIGdyb3VwLT5wbGFuZXNbaV0ubGVuZ3RoKTsKKyAgICBnc3RfbWVtb3J5X3Jlc2l6ZSAoZG1hX21lbSwgZ3JvdXAtPnBsYW5lc1tpXS5kYXRhX29mZnNldCwKKyAgICAgICAgZ3JvdXAtPnBsYW5lc1tpXS5sZW5ndGggLSBncm91cC0+cGxhbmVzW2ldLmRhdGFfb2Zmc2V0KTsKKworICAgIGdzdF9taW5pX29iamVjdF9zZXRfcWRhdGEgKEdTVF9NSU5JX09CSkVDVCAoZG1hX21lbSksCisgICAgICAgIEdTVF9WNEwyX01FTU9SWV9RVUFSSywgbWVtLCAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9tZW1vcnlfdW5yZWYpOworCisgICAgZ3JvdXAtPm1lbVtpXSA9IGRtYV9tZW07CisgIH0KKworICBnc3RfdjRsMl9hbGxvY2F0b3JfcmVzZXRfc2l6ZSAoYWxsb2NhdG9yLCBncm91cCk7CisKKyAgcmV0dXJuIGdyb3VwOworCitleHBidWZfZmFpbGVkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoYWxsb2NhdG9yLCAiRmFpbGVkIHRvIGV4cG9ydCBETUFCVUY6ICVzIiwKKyAgICAgICAgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KK2R1cF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChhbGxvY2F0b3IsICJGYWlsZWQgdG8gZHVwIERNQUJVRiBkZXNjcmlwdG9yOiAlcyIsCisgICAgICAgIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgZ290byBjbGVhbnVwOworICB9CitjbGVhbnVwOgorICB7CisgICAgX2NsZWFudXBfZmFpbGVkX2FsbG9jIChhbGxvY2F0b3IsIGdyb3VwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfYWxsb2NhdG9yX2NsZWFyX2RtYWJ1ZmluIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yLAorICAgIEdzdFY0bDJNZW1vcnlHcm91cCAqIGdyb3VwKQoreworICBHc3RWNGwyT2JqZWN0ICpvYmogPSBhbGxvY2F0b3ItPm9iajsKKyAgR3N0VjRsMk1lbW9yeSAqbWVtOworICBnaW50IGk7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoYWxsb2NhdG9yLT5tZW1vcnkgPT0gVjRMMl9NRU1PUllfRE1BQlVGKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXAtPm5fbWVtOyBpKyspIHsKKworICAgIG1lbSA9IChHc3RWNGwyTWVtb3J5ICopIGdyb3VwLT5tZW1baV07CisKKyAgICBHU1RfTE9HX09CSkVDVCAoYWxsb2NhdG9yLCAiY2xlYXJpbmcgRE1BQlVGIGltcG9ydCwgZmQgJWkgcGxhbmUgJWQiLAorICAgICAgICBtZW0tPmRtYWZkLCBpKTsKKworICAgIGlmIChtZW0tPmRtYWZkID49IDApCisgICAgICBjbG9zZSAobWVtLT5kbWFmZCk7CisKKyAgICAvKiBVcGRhdGUgbWVtb3J5ICovCisgICAgbWVtLT5tZW0ubWF4c2l6ZSA9IDA7CisgICAgbWVtLT5tZW0ub2Zmc2V0ID0gMDsKKyAgICBtZW0tPm1lbS5zaXplID0gMDsKKyAgICBtZW0tPmRtYWZkID0gLTE7CisKKyAgICAvKiBVcGRhdGUgdjRsMiBzdHJ1Y3R1cmUgKi8KKyAgICBncm91cC0+cGxhbmVzW2ldLmxlbmd0aCA9IDA7CisgICAgZ3JvdXAtPnBsYW5lc1tpXS5ieXRlc3VzZWQgPSAwOworICAgIGdyb3VwLT5wbGFuZXNbaV0ubS5mZCA9IC0xOworICAgIGdyb3VwLT5wbGFuZXNbaV0uZGF0YV9vZmZzZXQgPSAwOworICB9CisKKyAgaWYgKCFWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIgKG9iai0+dHlwZSkpIHsKKyAgICBncm91cC0+YnVmZmVyLmJ5dGVzdXNlZCA9IDA7CisgICAgZ3JvdXAtPmJ1ZmZlci5sZW5ndGggPSAwOworICAgIGdyb3VwLT5idWZmZXIubS5mZCA9IC0xOworICB9Cit9CisKK0dzdFY0bDJNZW1vcnlHcm91cCAqCitnc3RfdjRsMl9hbGxvY2F0b3JfYWxsb2NfZG1hYnVmaW4gKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IpCit7CisgIEdzdFY0bDJNZW1vcnlHcm91cCAqZ3JvdXA7CisgIGdpbnQgaTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoYWxsb2NhdG9yLT5tZW1vcnkgPT0gVjRMMl9NRU1PUllfRE1BQlVGLCBOVUxMKTsKKworICBncm91cCA9IGdzdF92NGwyX2FsbG9jYXRvcl9hbGxvYyAoYWxsb2NhdG9yKTsKKworICBpZiAoZ3JvdXAgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBHU1RfTE9HX09CSkVDVCAoYWxsb2NhdG9yLCAiYWxsb2NhdGluZyBlbXB0eSBETUFCVUYgaW1wb3J0IGdyb3VwIik7CisKKyAgZm9yIChpID0gMDsgaSA8IGdyb3VwLT5uX21lbTsgaSsrKSB7CisgICAgaWYgKGdyb3VwLT5tZW1baV0gPT0gTlVMTCkgeworICAgICAgZ3JvdXAtPm1lbVtpXSA9IChHc3RNZW1vcnkgKikgX3Y0bDJtZW1fbmV3ICgwLCBHU1RfQUxMT0NBVE9SIChhbGxvY2F0b3IpLAorICAgICAgICAgIE5VTEwsIDAsIDAsIDAsIDAsIGksIE5VTEwsIC0xLCBncm91cCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFRha2UgYmFjayB0aGUgYWxsb2NhdG9yIHJlZmVyZW5jZSAqLworICAgICAgZ3N0X29iamVjdF9yZWYgKGFsbG9jYXRvcik7CisgICAgfQorCisgICAgZ3JvdXAtPm1lbXNfYWxsb2NhdGVkKys7CisgIH0KKworICBnc3RfdjRsMl9hbGxvY2F0b3JfY2xlYXJfZG1hYnVmaW4gKGFsbG9jYXRvciwgZ3JvdXApOworCisgIHJldHVybiBncm91cDsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2FsbG9jYXRvcl9jbGVhcl91c2VycHRyIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yLAorICAgIEdzdFY0bDJNZW1vcnlHcm91cCAqIGdyb3VwKQoreworICBHc3RWNGwyT2JqZWN0ICpvYmogPSBhbGxvY2F0b3ItPm9iajsKKyAgR3N0VjRsMk1lbW9yeSAqbWVtOworICBnaW50IGk7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoYWxsb2NhdG9yLT5tZW1vcnkgPT0gVjRMMl9NRU1PUllfVVNFUlBUUik7CisKKyAgZm9yIChpID0gMDsgaSA8IGdyb3VwLT5uX21lbTsgaSsrKSB7CisgICAgbWVtID0gKEdzdFY0bDJNZW1vcnkgKikgZ3JvdXAtPm1lbVtpXTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChhbGxvY2F0b3IsICJjbGVhcmluZyBVU0VSUFRSICVwIHBsYW5lICVkIHNpemUgJSIKKyAgICAgICAgR19HU0laRV9GT1JNQVQsIG1lbS0+ZGF0YSwgaSwgbWVtLT5tZW0uc2l6ZSk7CisKKyAgICBtZW0tPm1lbS5tYXhzaXplID0gMDsKKyAgICBtZW0tPm1lbS5zaXplID0gMDsKKyAgICBtZW0tPmRhdGEgPSBOVUxMOworCisgICAgZ3JvdXAtPnBsYW5lc1tpXS5sZW5ndGggPSAwOworICAgIGdyb3VwLT5wbGFuZXNbaV0uYnl0ZXN1c2VkID0gMDsKKyAgICBncm91cC0+cGxhbmVzW2ldLm0udXNlcnB0ciA9IDA7CisgIH0KKworICBpZiAoIVY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUiAob2JqLT50eXBlKSkgeworICAgIGdyb3VwLT5idWZmZXIuYnl0ZXN1c2VkID0gMDsKKyAgICBncm91cC0+YnVmZmVyLmxlbmd0aCA9IDA7CisgICAgZ3JvdXAtPmJ1ZmZlci5tLnVzZXJwdHIgPSAwOworICB9Cit9CisKK0dzdFY0bDJNZW1vcnlHcm91cCAqCitnc3RfdjRsMl9hbGxvY2F0b3JfYWxsb2NfdXNlcnB0ciAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvcikKK3sKKyAgR3N0VjRsMk1lbW9yeUdyb3VwICpncm91cDsKKyAgZ2ludCBpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChhbGxvY2F0b3ItPm1lbW9yeSA9PSBWNEwyX01FTU9SWV9VU0VSUFRSLCBOVUxMKTsKKworICBncm91cCA9IGdzdF92NGwyX2FsbG9jYXRvcl9hbGxvYyAoYWxsb2NhdG9yKTsKKworICBpZiAoZ3JvdXAgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBHU1RfTE9HX09CSkVDVCAoYWxsb2NhdG9yLCAiYWxsb2NhdGluZyBlbXB0eSBVU0VSUFRSIGdyb3VwIik7CisKKyAgZm9yIChpID0gMDsgaSA8IGdyb3VwLT5uX21lbTsgaSsrKSB7CisKKyAgICBpZiAoZ3JvdXAtPm1lbVtpXSA9PSBOVUxMKSB7CisgICAgICBncm91cC0+bWVtW2ldID0gKEdzdE1lbW9yeSAqKSBfdjRsMm1lbV9uZXcgKDAsIEdTVF9BTExPQ0FUT1IgKGFsbG9jYXRvciksCisgICAgICAgICAgTlVMTCwgMCwgMCwgMCwgMCwgaSwgTlVMTCwgLTEsIGdyb3VwKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogVGFrZSBiYWNrIHRoZSBhbGxvY2F0b3IgcmVmZXJlbmNlICovCisgICAgICBnc3Rfb2JqZWN0X3JlZiAoYWxsb2NhdG9yKTsKKyAgICB9CisKKyAgICBncm91cC0+bWVtc19hbGxvY2F0ZWQrKzsKKyAgfQorCisgIGdzdF92NGwyX2FsbG9jYXRvcl9jbGVhcl91c2VycHRyIChhbGxvY2F0b3IsIGdyb3VwKTsKKworICByZXR1cm4gZ3JvdXA7Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl9hbGxvY2F0b3JfaW1wb3J0X2RtYWJ1ZiAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvciwKKyAgICBHc3RWNGwyTWVtb3J5R3JvdXAgKiBncm91cCwgZ2ludCBuX21lbSwgR3N0TWVtb3J5ICoqIGRtYV9tZW0pCit7CisgIEdzdFY0bDJPYmplY3QgKm9iaiA9IGFsbG9jYXRvci0+b2JqOworICBHc3RWNGwyTWVtb3J5ICptZW07CisgIGdpbnQgaTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoYWxsb2NhdG9yLT5tZW1vcnkgPT0gVjRMMl9NRU1PUllfRE1BQlVGLCBGQUxTRSk7CisKKyAgaWYgKGdyb3VwLT5uX21lbSAhPSBuX21lbSkKKyAgICBnb3RvIG5fbWVtX21pc3NtYXRjaDsKKworICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXAtPm5fbWVtOyBpKyspIHsKKyAgICBnaW50IGRtYWZkOworICAgIGdzaXplIHNpemUsIG9mZnNldCwgbWF4c2l6ZTsKKworICAgIGlmICghZ3N0X2lzX2RtYWJ1Zl9tZW1vcnkgKGRtYV9tZW1baV0pKQorICAgICAgZ290byBub3RfZG1hYnVmOworCisgICAgc2l6ZSA9IGdzdF9tZW1vcnlfZ2V0X3NpemVzIChkbWFfbWVtW2ldLCAmb2Zmc2V0LCAmbWF4c2l6ZSk7CisKKyAgICBpZiAoKGRtYWZkID0gZHVwIChnc3RfZG1hYnVmX21lbW9yeV9nZXRfZmQgKGRtYV9tZW1baV0pKSkgPCAwKQorICAgICAgZ290byBkdXBfZmFpbGVkOworCisgICAgR1NUX0xPR19PQkpFQ1QgKGFsbG9jYXRvciwgImltcG9ydGVkIERNQUJVRiBhcyBmZCAlaSBwbGFuZSAlZCIsIGRtYWZkLCBpKTsKKworICAgIG1lbSA9IChHc3RWNGwyTWVtb3J5ICopIGdyb3VwLT5tZW1baV07CisKKyAgICAvKiBVcGRhdGUgbWVtb3J5ICovCisgICAgbWVtLT5tZW0ubWF4c2l6ZSA9IG1heHNpemU7CisgICAgbWVtLT5tZW0ub2Zmc2V0ID0gb2Zmc2V0OworICAgIG1lbS0+bWVtLnNpemUgPSBzaXplOworICAgIG1lbS0+ZG1hZmQgPSBkbWFmZDsKKworICAgIC8qIFVwZGF0ZSB2NGwyIHN0cnVjdHVyZSAqLworICAgIGdyb3VwLT5wbGFuZXNbaV0ubGVuZ3RoID0gbWF4c2l6ZTsKKyAgICBncm91cC0+cGxhbmVzW2ldLmJ5dGVzdXNlZCA9IHNpemUgKyBvZmZzZXQ7CisgICAgZ3JvdXAtPnBsYW5lc1tpXS5tLmZkID0gZG1hZmQ7CisgICAgZ3JvdXAtPnBsYW5lc1tpXS5kYXRhX29mZnNldCA9IG9mZnNldDsKKyAgfQorCisgIC8qIENvcHkgaW50byBidWZmZXIgc3RydWN0dXJlIGlmIG5vdCB1c2luZyBwbGFuZXMgKi8KKyAgaWYgKCFWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIgKG9iai0+dHlwZSkpIHsKKyAgICBncm91cC0+YnVmZmVyLmJ5dGVzdXNlZCA9IGdyb3VwLT5wbGFuZXNbMF0uYnl0ZXN1c2VkOworICAgIGdyb3VwLT5idWZmZXIubGVuZ3RoID0gZ3JvdXAtPnBsYW5lc1swXS5sZW5ndGg7CisgICAgZ3JvdXAtPmJ1ZmZlci5tLmZkID0gZ3JvdXAtPnBsYW5lc1swXS5tLnVzZXJwdHI7CisKKyAgICAvKiBGSVhNRSBDaGVjayBpZiBkYXRhX29mZnNldCA+IDAgYW5kIGZhaWwgZm9yIG5vbi1tdWx0aS1wbGFuYXIgKi8KKyAgICBnX2Fzc2VydCAoZ3JvdXAtPnBsYW5lc1swXS5kYXRhX29mZnNldCA9PSAwKTsKKyAgfSBlbHNlIHsKKyAgICBncm91cC0+YnVmZmVyLmxlbmd0aCA9IGdyb3VwLT5uX21lbTsKKyAgfQorCisgIHJldHVybiBUUlVFOworCituX21lbV9taXNzbWF0Y2g6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChhbGxvY2F0b3IsICJHb3QgJWkgZG1hYnVmIGJ1dCBuZWVkZWQgJWkiLCBuX21lbSwKKyAgICAgICAgZ3JvdXAtPm5fbWVtKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vdF9kbWFidWY6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChhbGxvY2F0b3IsICJNZW1vcnkgJWkgaXMgbm90IG9mIERNQUJVRiIsIGkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorZHVwX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGFsbG9jYXRvciwgIkZhaWxlZCB0byBkdXAgRE1BQlVGIGRlc2NyaXB0b3I6ICVzIiwKKyAgICAgICAgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF92NGwyX2FsbG9jYXRvcl9pbXBvcnRfdXNlcnB0ciAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvciwKKyAgICBHc3RWNGwyTWVtb3J5R3JvdXAgKiBncm91cCwgZ3NpemUgaW1nX3NpemUsIGludCBuX3BsYW5lcywKKyAgICBncG9pbnRlciAqIGRhdGEsIGdzaXplICogc2l6ZSkKK3sKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gYWxsb2NhdG9yLT5vYmo7CisgIEdzdFY0bDJNZW1vcnkgKm1lbTsKKyAgZ2ludCBpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChhbGxvY2F0b3ItPm1lbW9yeSA9PSBWNEwyX01FTU9SWV9VU0VSUFRSLCBGQUxTRSk7CisKKyAgLyogVE9ETyBTdXBwb3J0IHBhc3NpbmcgTiBwbGFuZSBmcm9tIDEgbWVtb3J5IHRvIE1QTEFORSB2NGwyIGZvcm1hdCAqLworICBpZiAoVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSIChvYmotPnR5cGUpICYmIG5fcGxhbmVzICE9IGdyb3VwLT5uX21lbSkKKyAgICBnb3RvIG5fbWVtX21pc3NtYXRjaDsKKworICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXAtPm5fbWVtOyBpKyspIHsKKyAgICBnc2l6ZSBtYXhzaXplLCBwc2l6ZTsKKworICAgIGlmIChWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIgKG9iai0+dHlwZSkpIHsKKyAgICAgIG1heHNpemUgPSBncm91cC0+cGxhbmVzW2ldLmxlbmd0aDsKKyAgICAgIHBzaXplID0gc2l6ZVtpXTsKKyAgICB9IGVsc2UgeworICAgICAgbWF4c2l6ZSA9IGdyb3VwLT5wbGFuZXNbaV0ubGVuZ3RoOworICAgICAgcHNpemUgPSBpbWdfc2l6ZTsKKyAgICB9CisKKyAgICBnX2Fzc2VydCAocHNpemUgPD0gaW1nX3NpemUpOworCisgICAgR1NUX0xPR19PQkpFQ1QgKGFsbG9jYXRvciwgImltcG9ydGVkIFVTRVJQVFIgJXAgcGxhbmUgJWQgc2l6ZSAlIgorICAgICAgICBHX0dTSVpFX0ZPUk1BVCwgZGF0YVtpXSwgaSwgcHNpemUpOworCisgICAgbWVtID0gKEdzdFY0bDJNZW1vcnkgKikgZ3JvdXAtPm1lbVtpXTsKKworICAgIG1lbS0+bWVtLm1heHNpemUgPSBtYXhzaXplOworICAgIG1lbS0+bWVtLnNpemUgPSBwc2l6ZTsKKyAgICBtZW0tPmRhdGEgPSBkYXRhW2ldOworCisgICAgZ3JvdXAtPnBsYW5lc1tpXS5sZW5ndGggPSBtYXhzaXplOworICAgIGdyb3VwLT5wbGFuZXNbaV0uYnl0ZXN1c2VkID0gcHNpemU7CisgICAgZ3JvdXAtPnBsYW5lc1tpXS5tLnVzZXJwdHIgPSAodW5zaWduZWQgbG9uZykgZGF0YVtpXTsKKyAgICBncm91cC0+cGxhbmVzW2ldLmRhdGFfb2Zmc2V0ID0gMDsKKyAgfQorCisgIC8qIENvcHkgaW50byBidWZmZXIgc3RydWN0dXJlIGlmIG5vdCB1c2luZyBwbGFuZXMgKi8KKyAgaWYgKCFWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIgKG9iai0+dHlwZSkpIHsKKyAgICBncm91cC0+YnVmZmVyLmJ5dGVzdXNlZCA9IGdyb3VwLT5wbGFuZXNbMF0uYnl0ZXN1c2VkOworICAgIGdyb3VwLT5idWZmZXIubGVuZ3RoID0gZ3JvdXAtPnBsYW5lc1swXS5sZW5ndGg7CisgICAgZ3JvdXAtPmJ1ZmZlci5tLnVzZXJwdHIgPSBncm91cC0+cGxhbmVzWzBdLm0udXNlcnB0cjsKKyAgfSBlbHNlIHsKKyAgICBncm91cC0+YnVmZmVyLmxlbmd0aCA9IGdyb3VwLT5uX21lbTsKKyAgfQorCisgIHJldHVybiBUUlVFOworCituX21lbV9taXNzbWF0Y2g6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChhbGxvY2F0b3IsICJHb3QgJWkgdXNlcnB0ciBwbGFuZSB3aGlsZSBkcml2ZXIgbmVlZCAlaSIsCisgICAgICAgIG5fcGxhbmVzLCBncm91cC0+bl9tZW0pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCit2b2lkCitnc3RfdjRsMl9hbGxvY2F0b3JfZmx1c2ggKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IpCit7CisgIGdpbnQgaTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGFsbG9jYXRvcik7CisKKyAgaWYgKCFnX2F0b21pY19pbnRfZ2V0ICgmYWxsb2NhdG9yLT5hY3RpdmUpKQorICAgIGdvdG8gZG9uZTsKKworICBmb3IgKGkgPSAwOyBpIDwgYWxsb2NhdG9yLT5jb3VudDsgaSsrKSB7CisgICAgR3N0VjRsMk1lbW9yeUdyb3VwICpncm91cCA9IGFsbG9jYXRvci0+Z3JvdXBzW2ldOworICAgIGdpbnQgbjsKKworICAgIGlmIChJU19RVUVVRUQgKGdyb3VwLT5idWZmZXIpKSB7CisgICAgICBVTlNFVF9RVUVVRUQgKGdyb3VwLT5idWZmZXIpOworCisgICAgICBnc3RfdjRsMl9hbGxvY2F0b3JfcmVzZXRfZ3JvdXAgKGFsbG9jYXRvciwgZ3JvdXApOworCisgICAgICBmb3IgKG4gPSAwOyBuIDwgZ3JvdXAtPm5fbWVtOyBuKyspCisgICAgICAgIGdzdF9tZW1vcnlfdW5yZWYgKGdyb3VwLT5tZW1bbl0pOworICAgIH0KKyAgfQorCitkb25lOgorICBHU1RfT0JKRUNUX1VOTE9DSyAoYWxsb2NhdG9yKTsKK30KKworZ2Jvb2xlYW4KK2dzdF92NGwyX2FsbG9jYXRvcl9xYnVmIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yLAorICAgIEdzdFY0bDJNZW1vcnlHcm91cCAqIGdyb3VwKQoreworICBHc3RWNGwyT2JqZWN0ICpvYmogPSBhbGxvY2F0b3ItPm9iajsKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKyAgZ2ludCBpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChnX2F0b21pY19pbnRfZ2V0ICgmYWxsb2NhdG9yLT5hY3RpdmUpLCBGQUxTRSk7CisKKyAgLyogdXBkYXRlIHNpemVzICovCisgIGlmIChWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIgKG9iai0+dHlwZSkpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXAtPm5fbWVtOyBpKyspCisgICAgICBncm91cC0+cGxhbmVzW2ldLmJ5dGVzdXNlZCA9CisgICAgICAgICAgZ3N0X21lbW9yeV9nZXRfc2l6ZXMgKGdyb3VwLT5tZW1baV0sIE5VTEwsIE5VTEwpOworICB9IGVsc2UgeworICAgIGdyb3VwLT5idWZmZXIuYnl0ZXN1c2VkID0gZ3N0X21lbW9yeV9nZXRfc2l6ZXMgKGdyb3VwLT5tZW1bMF0sIE5VTEwsIE5VTEwpOworICB9CisKKyAgLyogRW5zdXJlIHRoZSBtZW1vcnkgd2lsbCBzdGF5IGFyb3VuZCBhbmQgaXMgUk8gKi8KKyAgZm9yIChpID0gMDsgaSA8IGdyb3VwLT5uX21lbTsgaSsrKQorICAgIGdzdF9tZW1vcnlfcmVmIChncm91cC0+bWVtW2ldKTsKKworICBpZiAob2JqLT5pb2N0bCAob2JqLT52aWRlb19mZCwgVklESU9DX1FCVUYsICZncm91cC0+YnVmZmVyKSA8IDApIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChhbGxvY2F0b3IsICJmYWlsZWQgcXVldWVpbmcgYnVmZmVyICVpOiAlcyIsCisgICAgICAgIGdyb3VwLT5idWZmZXIuaW5kZXgsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAvKiBSZWxlYXNlIHRoZSBtZW1vcnksIHBvc3NpYmx5IG1ha2luZyBpdCBSVyBhZ2FpbiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBncm91cC0+bl9tZW07IGkrKykKKyAgICAgIGdzdF9tZW1vcnlfdW5yZWYgKGdyb3VwLT5tZW1baV0pOworCisgICAgcmV0ID0gRkFMU0U7CisgICAgaWYgKElTX1FVRVVFRCAoZ3JvdXAtPmJ1ZmZlcikpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFsbG9jYXRvciwKKyAgICAgICAgICAiZHJpdmVyIHByZXRlbmRzIGJ1ZmZlciBpcyBxdWV1ZWQgZXZlbiBpZiBxdWV1ZSBmYWlsZWQiKTsKKyAgICAgIFVOU0VUX1FVRVVFRCAoZ3JvdXAtPmJ1ZmZlcik7CisgICAgfQorICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChhbGxvY2F0b3IsICJxdWV1ZWQgYnVmZmVyICVpIChmbGFncyAweCVYKSIsCisgICAgICBncm91cC0+YnVmZmVyLmluZGV4LCBncm91cC0+YnVmZmVyLmZsYWdzKTsKKworICBpZiAoIUlTX1FVRVVFRCAoZ3JvdXAtPmJ1ZmZlcikpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhbGxvY2F0b3IsCisgICAgICAgICJkcml2ZXIgcHJldGVuZHMgYnVmZmVyIGlzIG5vdCBxdWV1ZWQgZXZlbiBpZiBxdWV1ZSBzdWNjZWVkZWQiKTsKKyAgICBTRVRfUVVFVUVEIChncm91cC0+YnVmZmVyKTsKKyAgfQorCitkb25lOgorICByZXR1cm4gcmV0OworfQorCitHc3RGbG93UmV0dXJuCitnc3RfdjRsMl9hbGxvY2F0b3JfZHFidWYgKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IsCisgICAgR3N0VjRsMk1lbW9yeUdyb3VwICoqIGdyb3VwX291dCkKK3sKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gYWxsb2NhdG9yLT5vYmo7CisgIHN0cnVjdCB2NGwyX2J1ZmZlciBidWZmZXIgPSB7IDAgfTsKKyAgc3RydWN0IHY0bDJfcGxhbmUgcGxhbmVzW1ZJREVPX01BWF9QTEFORVNdID0geyB7MH0gfTsKKyAgZ2ludCBpOworCisgIEdzdFY0bDJNZW1vcnlHcm91cCAqZ3JvdXAgPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChnX2F0b21pY19pbnRfZ2V0ICgmYWxsb2NhdG9yLT5hY3RpdmUpLCBHU1RfRkxPV19FUlJPUik7CisKKyAgYnVmZmVyLnR5cGUgPSBvYmotPnR5cGU7CisgIGJ1ZmZlci5tZW1vcnkgPSBhbGxvY2F0b3ItPm1lbW9yeTsKKworICBpZiAoVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSIChvYmotPnR5cGUpKSB7CisgICAgYnVmZmVyLmxlbmd0aCA9IG9iai0+Zm9ybWF0LmZtdC5waXhfbXAubnVtX3BsYW5lczsKKyAgICBidWZmZXIubS5wbGFuZXMgPSBwbGFuZXM7CisgIH0KKworICBpZiAob2JqLT5pb2N0bCAob2JqLT52aWRlb19mZCwgVklESU9DX0RRQlVGLCAmYnVmZmVyKSA8IDApCisgICAgZ290byBlcnJvcjsKKworICBncm91cCA9IGFsbG9jYXRvci0+Z3JvdXBzW2J1ZmZlci5pbmRleF07CisKKyAgaWYgKCFJU19RVUVVRUQgKGdyb3VwLT5idWZmZXIpKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoYWxsb2NhdG9yLAorICAgICAgICAiYnVmZmVyICVpIHdhcyBub3QgcXVldWVkLCB0aGlzIGluZGljYXRlIGEgZHJpdmVyIGJ1Zy4iLCBidWZmZXIuaW5kZXgpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIGdyb3VwLT5idWZmZXIgPSBidWZmZXI7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGFsbG9jYXRvciwgImRlcXVldWVkIGJ1ZmZlciAlaSAoZmxhZ3MgMHglWCkiLCBidWZmZXIuaW5kZXgsCisgICAgICBidWZmZXIuZmxhZ3MpOworCisgIGlmIChJU19RVUVVRUQgKGdyb3VwLT5idWZmZXIpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYWxsb2NhdG9yLAorICAgICAgICAiZHJpdmVyIHByZXRlbmRzIGJ1ZmZlciBpcyBxdWV1ZWQgZXZlbiBpZiBkZXF1ZXVlIHN1Y2NlZWRlZCIpOworICAgIFVOU0VUX1FVRVVFRCAoZ3JvdXAtPmJ1ZmZlcik7CisgIH0KKworICBpZiAoVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSIChvYmotPnR5cGUpKSB7CisgICAgZ3JvdXAtPmJ1ZmZlci5tLnBsYW5lcyA9IGdyb3VwLT5wbGFuZXM7CisgICAgbWVtY3B5IChncm91cC0+cGxhbmVzLCBidWZmZXIubS5wbGFuZXMsIHNpemVvZiAocGxhbmVzKSk7CisgIH0gZWxzZSB7CisgICAgZ3JvdXAtPnBsYW5lc1swXS5ieXRlc3VzZWQgPSBncm91cC0+YnVmZmVyLmJ5dGVzdXNlZDsKKyAgICBncm91cC0+cGxhbmVzWzBdLmxlbmd0aCA9IGdyb3VwLT5idWZmZXIubGVuZ3RoOworICAgIGdfYXNzZXJ0IChzaXplb2YgKGdyb3VwLT5wbGFuZXNbMF0ubSkgPT0gc2l6ZW9mIChncm91cC0+YnVmZmVyLm0pKTsKKyAgICBtZW1jcHkgKCZncm91cC0+cGxhbmVzWzBdLm0sICZncm91cC0+YnVmZmVyLm0sIHNpemVvZiAoZ3JvdXAtPmJ1ZmZlci5tKSk7CisgIH0KKworICAvKiBBbmQgdXBkYXRlIG1lbW9yeSBzaXplICovCisgIGlmIChWNEwyX1RZUEVfSVNfT1VUUFVUIChvYmotPnR5cGUpKSB7CisgICAgZ3N0X3Y0bDJfYWxsb2NhdG9yX3Jlc2V0X3NpemUgKGFsbG9jYXRvciwgZ3JvdXApOworICB9IGVsc2UgeworICAgIC8qIGZvciBjYXB0dXJlLCBzaW1wbHkgcmVhZCB0aGUgc2l6ZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBncm91cC0+bl9tZW07IGkrKykgeworICAgICAgZ3NpemUgc2l6ZSwgb2Zmc2V0OworCisgICAgICBHU1RfTE9HX09CSkVDVCAoYWxsb2NhdG9yLAorICAgICAgICAgICJEZXF1ZXVlZCBjYXB0dXJlIGJ1ZmZlciwgbGVuZ3RoOiAldSBieXRlc3VzZWQ6ICV1IGRhdGFfb2Zmc2V0OiAldSIsCisgICAgICAgICAgZ3JvdXAtPnBsYW5lc1tpXS5sZW5ndGgsIGdyb3VwLT5wbGFuZXNbaV0uYnl0ZXN1c2VkLAorICAgICAgICAgIGdyb3VwLT5wbGFuZXNbaV0uZGF0YV9vZmZzZXQpOworCisgICAgICBvZmZzZXQgPSBncm91cC0+cGxhbmVzW2ldLmRhdGFfb2Zmc2V0OworCisgICAgICBpZiAoZ3JvdXAtPnBsYW5lc1tpXS5ieXRlc3VzZWQgPiBncm91cC0+cGxhbmVzW2ldLmRhdGFfb2Zmc2V0KSB7CisgICAgICAgIHNpemUgPSBncm91cC0+cGxhbmVzW2ldLmJ5dGVzdXNlZCAtIGdyb3VwLT5wbGFuZXNbaV0uZGF0YV9vZmZzZXQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGFsbG9jYXRvciwgIlY0TDIgcHJvdmlkZWQgYnVmZmVyIGhhcyBieXRlc3VzZWQgJSIKKyAgICAgICAgICAgIEdfR1VJTlQzMl9GT1JNQVQgIiB3aGljaCBpcyB0b28gc21hbGwgdG8gaW5jbHVkZSBkYXRhX29mZnNldCAlIgorICAgICAgICAgICAgR19HVUlOVDMyX0ZPUk1BVCwgZ3JvdXAtPnBsYW5lc1tpXS5ieXRlc3VzZWQsCisgICAgICAgICAgICBncm91cC0+cGxhbmVzW2ldLmRhdGFfb2Zmc2V0KTsKKyAgICAgICAgc2l6ZSA9IGdyb3VwLT5wbGFuZXNbaV0uYnl0ZXN1c2VkOworICAgICAgfQorCisgICAgICBpZiAoR19MSUtFTFkgKHNpemUgKyBvZmZzZXQgPD0gZ3JvdXAtPm1lbVtpXS0+bWF4c2l6ZSkpCisgICAgICAgIGdzdF9tZW1vcnlfcmVzaXplIChncm91cC0+bWVtW2ldLCBvZmZzZXQsIHNpemUpOworICAgICAgZWxzZSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYWxsb2NhdG9yLAorICAgICAgICAgICAgInY0bDIgcHJvdmlkZWQgYnVmZmVyIHRoYXQgaXMgdG9vIGJpZyBmb3IgdGhlIG1lbW9yeSBpdCB3YXMgIgorICAgICAgICAgICAgIndyaXRpbmcgaW50by4gIHY0bDIgY2xhaW1zICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMgdXNlZCBidXQgIgorICAgICAgICAgICAgIm1lbW9yeSBpcyBvbmx5ICUiIEdfR1NJWkVfRk9STUFUICJCLiAgVGhpcyBpcyBwcm9iYWJseSBhIGRyaXZlciAiCisgICAgICAgICAgICAiYnVnLiIsIHNpemUsIGdyb3VwLT5tZW1baV0tPm1heHNpemUpOworICAgICAgICBnc3RfbWVtb3J5X3Jlc2l6ZSAoZ3JvdXAtPm1lbVtpXSwgMCwgZ3JvdXAtPm1lbVtpXS0+bWF4c2l6ZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogUmVsZWFzZSB0aGUgbWVtb3J5LCBwb3NzaWJseSBtYWtpbmcgaXQgUlcgYWdhaW4gKi8KKyAgZm9yIChpID0gMDsgaSA8IGdyb3VwLT5uX21lbTsgaSsrKQorICAgIGdzdF9tZW1vcnlfdW5yZWYgKGdyb3VwLT5tZW1baV0pOworCisgICpncm91cF9vdXQgPSBncm91cDsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCitlcnJvcjoKKyAgaWYgKGVycm5vID09IEVQSVBFKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYWxsb2NhdG9yLCAiYnJva2VuIHBpcGUgc2lnbmFscyBsYXN0IGJ1ZmZlciIpOworICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisgIH0KKworICBHU1RfRVJST1JfT0JKRUNUIChhbGxvY2F0b3IsICJmYWlsZWQgZGVxdWV1aW5nIGEgJXMgYnVmZmVyOiAlcyIsCisgICAgICBtZW1vcnlfdHlwZV90b19zdHIgKGFsbG9jYXRvci0+bWVtb3J5KSwgZ19zdHJlcnJvciAoZXJybm8pKTsKKworICBzd2l0Y2ggKGVycm5vKSB7CisgICAgY2FzZSBFQUdBSU46CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGFsbG9jYXRvciwKKyAgICAgICAgICAiTm9uLWJsb2NraW5nIEkvTyBoYXMgYmVlbiBzZWxlY3RlZCB1c2luZyBPX05PTkJMT0NLIGFuZCIKKyAgICAgICAgICAiIG5vIGJ1ZmZlciB3YXMgaW4gdGhlIG91dGdvaW5nIHF1ZXVlLiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFSU5WQUw6CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChhbGxvY2F0b3IsCisgICAgICAgICAgIlRoZSBidWZmZXIgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLCBvciB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcywgIgorICAgICAgICAgICJvciBubyBidWZmZXJzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgeWV0LCBvciB0aGUgdXNlcnB0ciAiCisgICAgICAgICAgIm9yIGxlbmd0aCBhcmUgaW52YWxpZC4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRU5PTUVNOgorICAgICAgR1NUX0VSUk9SX09CSkVDVCAoYWxsb2NhdG9yLAorICAgICAgICAgICJpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGVucXVldWUgYSB1c2VyIHBvaW50ZXIgYnVmZmVyIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVJTzoKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoYWxsb2NhdG9yLAorICAgICAgICAgICJWSURJT0NfRFFCVUYgZmFpbGVkIGR1ZSB0byBhbiBpbnRlcm5hbCBlcnJvci4iCisgICAgICAgICAgIiBDYW4gYWxzbyBpbmRpY2F0ZSB0ZW1wb3JhcnkgcHJvYmxlbXMgbGlrZSBzaWduYWwgbG9zcy4iCisgICAgICAgICAgIiBOb3RlIHRoZSBkcml2ZXIgbWlnaHQgZGVxdWV1ZSBhbiAoZW1wdHkpIGJ1ZmZlciBkZXNwaXRlIgorICAgICAgICAgICIgcmV0dXJuaW5nIGFuIGVycm9yLCBvciBldmVuIHN0b3AgY2FwdHVyaW5nLiIpOworICAgICAgLyogaGF2ZSB3ZSBkZS1xdWV1ZWQgYSBidWZmZXIgPyAqLworICAgICAgaWYgKCFJU19RVUVVRUQgKGJ1ZmZlcikpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYWxsb2NhdG9yLCAicmVlbnF1ZXVlaW5nIGJ1ZmZlciIpOworICAgICAgICAvKiBGSVhNRSAuLi4gc2hvdWxkIHdlIGRvIHNvbWV0aGluZyBoZXJlPyAqLworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBFSU5UUjoKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYWxsb2NhdG9yLCAiY291bGQgbm90IHN5bmMgb24gYSBidWZmZXIgb24gZGV2aWNlIik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhbGxvY2F0b3IsCisgICAgICAgICAgIkdyYWJiaW5nIGZyYW1lIGdvdCBpbnRlcnJ1cHRlZCB1bmV4cGVjdGVkbHkuICVkOiAlcy4iLCBlcnJubywKKyAgICAgICAgICBnX3N0cmVycm9yIChlcnJubykpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7Cit9CisKK3ZvaWQKK2dzdF92NGwyX2FsbG9jYXRvcl9yZXNldF9ncm91cCAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvciwKKyAgICBHc3RWNGwyTWVtb3J5R3JvdXAgKiBncm91cCkKK3sKKyAgc3dpdGNoIChhbGxvY2F0b3ItPm1lbW9yeSkgeworICAgIGNhc2UgVjRMMl9NRU1PUllfVVNFUlBUUjoKKyAgICAgIGdzdF92NGwyX2FsbG9jYXRvcl9jbGVhcl91c2VycHRyIChhbGxvY2F0b3IsIGdyb3VwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9NRU1PUllfRE1BQlVGOgorICAgICAgZ3N0X3Y0bDJfYWxsb2NhdG9yX2NsZWFyX2RtYWJ1ZmluIChhbGxvY2F0b3IsIGdyb3VwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9NRU1PUllfTU1BUDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgZ3N0X3Y0bDJfYWxsb2NhdG9yX3Jlc2V0X3NpemUgKGFsbG9jYXRvciwgZ3JvdXApOworfQpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5oIGIvc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MjY4MTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgQ29sbGFib3JhIEx0ZC4KKyAqICAgICBBdXRob3I6IE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1Y0TDJfQUxMT0NBVE9SX0hfXworI2RlZmluZSBfX0dTVF9WNEwyX0FMTE9DQVRPUl9IX18KKworI2luY2x1ZGUgImV4dC92aWRlb2RldjIuaCIKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2dzdGF0b21pY3F1ZXVlLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9WNEwyX0FMTE9DQVRPUiAgICAgICAgICAgICAgICAgKGdzdF92NGwyX2FsbG9jYXRvcl9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfSVNfVjRMMl9BTExPQ0FUT1Iob2JqKSAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfVjRMMl9BTExPQ0FUT1IpKQorI2RlZmluZSBHU1RfSVNfVjRMMl9BTExPQ0FUT1JfQ0xBU1Moa2xhc3MpICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9WNEwyX0FMTE9DQVRPUikpCisjZGVmaW5lIEdTVF9WNEwyX0FMTE9DQVRPUl9HRVRfQ0xBU1Mob2JqKSAgICAgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIEdTVF9UWVBFX1Y0TDJfQUxMT0NBVE9SLCBHc3RWNGwyQWxsb2NhdG9yQ2xhc3MpKQorI2RlZmluZSBHU1RfVjRMMl9BTExPQ0FUT1Iob2JqKSAgICAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfVjRMMl9BTExPQ0FUT1IsIEdzdFY0bDJBbGxvY2F0b3IpKQorI2RlZmluZSBHU1RfVjRMMl9BTExPQ0FUT1JfQ0xBU1Moa2xhc3MpICAgICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9WNEwyX0FMTE9DQVRPUiwgR3N0VjRsMkFsbG9jYXRvckNsYXNzKSkKKyNkZWZpbmUgR1NUX1Y0TDJfQUxMT0NBVE9SX0NBU1Qob2JqKSAgICAgICAgICAgICgoR3N0VjRsMkFsbG9jYXRvciAqKShvYmopKQorCisjZGVmaW5lIEdTVF9WNEwyX0FMTE9DQVRPUl9DQU5fUkVRVUVTVChvYmosdHlwZSkgXAorICAgICAgICAoR1NUX09CSkVDVF9GTEFHX0lTX1NFVCAob2JqLCBHU1RfVjRMMl9BTExPQ0FUT1JfRkxBR18gIyMgdHlwZSAjIyBfUkVRQlVGUykpCisjZGVmaW5lIEdTVF9WNEwyX0FMTE9DQVRPUl9DQU5fQUxMT0NBVEUob2JqLHR5cGUpIFwKKyAgICAgICAgKEdTVF9PQkpFQ1RfRkxBR19JU19TRVQgKG9iaiwgR1NUX1Y0TDJfQUxMT0NBVE9SX0ZMQUdfICMjIHR5cGUgIyMgX0NSRUFURV9CVUZTKSkKKworI2RlZmluZSBHU1RfVjRMMl9NRU1PUllfUVVBUksgZ3N0X3Y0bDJfbWVtb3J5X3F1YXJrICgpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyQWxsb2NhdG9yIEdzdFY0bDJBbGxvY2F0b3I7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMkFsbG9jYXRvckNsYXNzIEdzdFY0bDJBbGxvY2F0b3JDbGFzczsKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyTWVtb3J5R3JvdXAgR3N0VjRsMk1lbW9yeUdyb3VwOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJNZW1vcnkgR3N0VjRsMk1lbW9yeTsKK3R5cGVkZWYgZW51bSBfR3N0VjRsMkNhcGFiaWxpdGllcyBHc3RWNGwyQ2FwYWJpbGl0aWVzOwordHlwZWRlZiBlbnVtIF9Hc3RWNGwyUmV0dXJuIEdzdFY0bDJSZXR1cm47Cit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMk9iamVjdCBHc3RWNGwyT2JqZWN0OworCitlbnVtIF9Hc3RWNGwyQWxsb2NhdG9yRmxhZ3MKK3sKKyAgR1NUX1Y0TDJfQUxMT0NBVE9SX0ZMQUdfTU1BUF9SRVFCVUZTICAgICAgICA9IChHU1RfQUxMT0NBVE9SX0ZMQUdfTEFTVCA8PCAwKSwKKyAgR1NUX1Y0TDJfQUxMT0NBVE9SX0ZMQUdfTU1BUF9DUkVBVEVfQlVGUyAgICA9IChHU1RfQUxMT0NBVE9SX0ZMQUdfTEFTVCA8PCAxKSwKKyAgR1NUX1Y0TDJfQUxMT0NBVE9SX0ZMQUdfVVNFUlBUUl9SRVFCVUZTICAgICA9IChHU1RfQUxMT0NBVE9SX0ZMQUdfTEFTVCA8PCAyKSwKKyAgR1NUX1Y0TDJfQUxMT0NBVE9SX0ZMQUdfVVNFUlBUUl9DUkVBVEVfQlVGUyA9IChHU1RfQUxMT0NBVE9SX0ZMQUdfTEFTVCA8PCAzKSwKKyAgR1NUX1Y0TDJfQUxMT0NBVE9SX0ZMQUdfRE1BQlVGX1JFUUJVRlMgICAgICA9IChHU1RfQUxMT0NBVE9SX0ZMQUdfTEFTVCA8PCA0KSwKKyAgR1NUX1Y0TDJfQUxMT0NBVE9SX0ZMQUdfRE1BQlVGX0NSRUFURV9CVUZTICA9IChHU1RfQUxMT0NBVE9SX0ZMQUdfTEFTVCA8PCA1KSwKK307CisKK2VudW0gX0dzdFY0bDJSZXR1cm4KK3sKKyAgR1NUX1Y0TDJfT0sgPSAwLAorICBHU1RfVjRMMl9FUlJPUiA9IC0xLAorICBHU1RfVjRMMl9CVVNZID0gLTIKK307CisKK3N0cnVjdCBfR3N0VjRsMk1lbW9yeQoreworICBHc3RNZW1vcnkgbWVtOworICBnaW50IHBsYW5lOworICBHc3RWNGwyTWVtb3J5R3JvdXAgKmdyb3VwOworICBncG9pbnRlciBkYXRhOworICBnaW50IGRtYWZkOworfTsKKworc3RydWN0IF9Hc3RWNGwyTWVtb3J5R3JvdXAKK3sKKyAgZ2ludCBuX21lbTsKKyAgR3N0TWVtb3J5ICogbWVtW1ZJREVPX01BWF9QTEFORVNdOworICBnaW50IG1lbXNfYWxsb2NhdGVkOworICBzdHJ1Y3QgdjRsMl9idWZmZXIgYnVmZmVyOworICBzdHJ1Y3QgdjRsMl9wbGFuZSBwbGFuZXNbVklERU9fTUFYX1BMQU5FU107Cit9OworCitzdHJ1Y3QgX0dzdFY0bDJBbGxvY2F0b3IKK3sKKyAgR3N0QWxsb2NhdG9yIHBhcmVudDsKKyAgR3N0VjRsMk9iamVjdCAqb2JqOworICBndWludDMyIGNvdW50OworICBndWludDMyIG1lbW9yeTsKKyAgZ2Jvb2xlYW4gY2FuX2FsbG9jYXRlOworICBnYm9vbGVhbiBhY3RpdmU7CisKKyAgR3N0VjRsMk1lbW9yeUdyb3VwICogZ3JvdXBzW1ZJREVPX01BWF9GUkFNRV07CisgIEdzdEF0b21pY1F1ZXVlICpmcmVlX3F1ZXVlOworICBHc3RBdG9taWNRdWV1ZSAqcGVuZGluZ19xdWV1ZTsKKworfTsKKworc3RydWN0IF9Hc3RWNGwyQWxsb2NhdG9yQ2xhc3MgeworICBHc3RBbGxvY2F0b3JDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfdjRsMl9hbGxvY2F0b3JfZ2V0X3R5cGUodm9pZCk7CisKK2dib29sZWFuICAgICAgICAgICAgIGdzdF9pc192NGwyX21lbW9yeSAgICAgICAgICAgICAgICAoR3N0TWVtb3J5ICogbWVtKTsKKworR1F1YXJrICAgICAgICAgICAgICAgZ3N0X3Y0bDJfbWVtb3J5X3F1YXJrICAgICAgICAgICAgICh2b2lkKTsKKworZ2Jvb2xlYW4gICAgICAgICAgICAgZ3N0X3Y0bDJfYWxsb2NhdG9yX2lzX2FjdGl2ZSAgICAgIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yKTsKKworZ3VpbnQgICAgICAgICAgICAgICAgZ3N0X3Y0bDJfYWxsb2NhdG9yX2dldF9zaXplICAgICAgIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yKTsKKworR3N0VjRsMkFsbG9jYXRvciogICAgZ3N0X3Y0bDJfYWxsb2NhdG9yX25ldyAgICAgICAgICAgIChHc3RPYmplY3QgKnBhcmVudCwgR3N0VjRsMk9iamVjdCAqIG9iaik7CisKK2d1aW50ICAgICAgICAgICAgICAgIGdzdF92NGwyX2FsbG9jYXRvcl9zdGFydCAgICAgICAgICAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBjb3VudCwgZ3VpbnQzMiBtZW1vcnkpOworCitHc3RWNGwyUmV0dXJuICAgICAgICBnc3RfdjRsMl9hbGxvY2F0b3Jfc3RvcCAgICAgICAgICAgKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IpOworCitHc3RWNGwyTWVtb3J5R3JvdXAqICBnc3RfdjRsMl9hbGxvY2F0b3JfYWxsb2NfbW1hcCAgICAgKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IpOworCitHc3RWNGwyTWVtb3J5R3JvdXAqICBnc3RfdjRsMl9hbGxvY2F0b3JfYWxsb2NfZG1hYnVmICAgKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdEFsbG9jYXRvciAqIGRtYWJ1Zl9hbGxvY2F0b3IpOworCitHc3RWNGwyTWVtb3J5R3JvdXAgKiBnc3RfdjRsMl9hbGxvY2F0b3JfYWxsb2NfZG1hYnVmaW4gKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IpOworCitHc3RWNGwyTWVtb3J5R3JvdXAgKiBnc3RfdjRsMl9hbGxvY2F0b3JfYWxsb2NfdXNlcnB0ciAgKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IpOworCitnYm9vbGVhbiAgICAgICAgICAgICBnc3RfdjRsMl9hbGxvY2F0b3JfaW1wb3J0X2RtYWJ1ZiAgKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFY0bDJNZW1vcnlHcm91cCAqZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgbl9tZW0sIEdzdE1lbW9yeSAqKiBkbWFfbWVtKTsKKworZ2Jvb2xlYW4gICAgICAgICAgICAgZ3N0X3Y0bDJfYWxsb2NhdG9yX2ltcG9ydF91c2VycHRyIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RWNGwyTWVtb3J5R3JvdXAgKmdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc2l6ZSBpbWdfc2l6ZSwgaW50IG5fcGxhbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciAqIGRhdGEsIGdzaXplICogc2l6ZSk7CisKK3ZvaWQgICAgICAgICAgICAgICAgIGdzdF92NGwyX2FsbG9jYXRvcl9mbHVzaCAgICAgICAgICAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvcik7CisKK2dib29sZWFuICAgICAgICAgICAgIGdzdF92NGwyX2FsbG9jYXRvcl9xYnVmICAgICAgICAgICAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VjRsMk1lbW9yeUdyb3VwICogZ3JvdXApOworCitHc3RGbG93UmV0dXJuICAgICAgICBnc3RfdjRsMl9hbGxvY2F0b3JfZHFidWYgICAgICAgICAgKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFY0bDJNZW1vcnlHcm91cCAqKiBncm91cCk7CisKK3ZvaWQgICAgICAgICAgICAgICAgIGdzdF92NGwyX2FsbG9jYXRvcl9yZXNldF9ncm91cCAgICAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VjRsMk1lbW9yeUdyb3VwICogZ3JvdXApOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfVjRMMl9BTExPQ0FUT1JfSF9fICovCmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jIGIvc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmQ1YzhiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYwpAQCAtMCwwICsxLDIwMTUgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqICAgICAgICAgICAgICAgMjAwNiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICogICAgICAgICAgICAgICAyMDA5IFRleGFzIEluc3RydW1lbnRzLCBJbmMgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBnc3R2NGwyYnVmZmVycG9vbC5jIFY0TDIgYnVmZmVyIHBvb2wgY2xhc3MKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2lmbmRlZiBfR05VX1NPVVJDRQorIyBkZWZpbmUgX0dOVV9TT1VSQ0UgICAgICAgICAgICAvKiBPX0NMT0VYRUMgKi8KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiZ3N0L3ZpZGVvL3ZpZGVvLmgiCisjaW5jbHVkZSAiZ3N0L3ZpZGVvL2dzdHZpZGVvbWV0YS5oIgorI2luY2x1ZGUgImdzdC92aWRlby9nc3R2aWRlb3Bvb2wuaCIKKyNpbmNsdWRlICJnc3QvYWxsb2NhdG9ycy9nc3RkbWFidWYuaCIKKworI2luY2x1ZGUgPGdzdHY0bDJidWZmZXJwb29sLmg+CisKKyNpbmNsdWRlICJnc3R2NGwyb2JqZWN0LmgiCisjaW5jbHVkZSAiZ3N0L2dzdC1pMThuLXBsdWdpbi5oIgorI2luY2x1ZGUgPGdzdC9nbGliLWNvbXBhdC1wcml2YXRlLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHY0bDJidWZmZXJwb29sX2RlYnVnKTsKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKENBVF9QRVJGT1JNQU5DRSk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCB2NGwyYnVmZmVycG9vbF9kZWJ1ZworCisjZGVmaW5lIEdTVF9WNEwyX0lNUE9SVF9RVUFSSyBnc3RfdjRsMl9idWZmZXJfcG9vbF9pbXBvcnRfcXVhcmsgKCkKKworCisvKgorICogR3N0VjRsMkJ1ZmZlclBvb2w6CisgKi8KKyNkZWZpbmUgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0VjRsMkJ1ZmZlclBvb2wsIGdzdF92NGwyX2J1ZmZlcl9wb29sLCBHU1RfVFlQRV9CVUZGRVJfUE9PTCk7CisKK2VudW0gX0dzdFY0bDJCdWZmZXJQb29sQWNxdWlyZUZsYWdzCit7CisgIEdTVF9WNEwyX0JVRkZFUl9QT09MX0FDUVVJUkVfRkxBR19SRVNVUlJFQ1QgPQorICAgICAgR1NUX0JVRkZFUl9QT09MX0FDUVVJUkVfRkxBR19MQVNULAorICBHU1RfVjRMMl9CVUZGRVJfUE9PTF9BQ1FVSVJFX0ZMQUdfTEFTVAorfTsKKworc3RhdGljIHZvaWQgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcmVsZWFzZV9idWZmZXIgKEdzdEJ1ZmZlclBvb2wgKiBicG9vbCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX2lzX2J1ZmZlcl92YWxpZCAoR3N0QnVmZmVyICogYnVmZmVyLCBHc3RWNGwyTWVtb3J5R3JvdXAgKiogb3V0X2dyb3VwKQoreworICBHc3RNZW1vcnkgKm1lbSA9IGdzdF9idWZmZXJfcGVla19tZW1vcnkgKGJ1ZmZlciwgMCk7CisgIGdib29sZWFuIHZhbGlkID0gRkFMU0U7CisKKyAgaWYgKEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX1RBR19NRU1PUlkpKQorICAgIGdvdG8gZG9uZTsKKworICBpZiAoZ3N0X2lzX2RtYWJ1Zl9tZW1vcnkgKG1lbSkpCisgICAgbWVtID0gZ3N0X21pbmlfb2JqZWN0X2dldF9xZGF0YSAoR1NUX01JTklfT0JKRUNUIChtZW0pLAorICAgICAgICBHU1RfVjRMMl9NRU1PUllfUVVBUkspOworCisgIGlmIChtZW0gJiYgZ3N0X2lzX3Y0bDJfbWVtb3J5IChtZW0pKSB7CisgICAgR3N0VjRsMk1lbW9yeSAqdm1lbSA9IChHc3RWNGwyTWVtb3J5ICopIG1lbTsKKyAgICBHc3RWNGwyTWVtb3J5R3JvdXAgKmdyb3VwID0gdm1lbS0+Z3JvdXA7CisgICAgZ2ludCBpOworCisgICAgaWYgKGdyb3VwLT5uX21lbSAhPSBnc3RfYnVmZmVyX25fbWVtb3J5IChidWZmZXIpKQorICAgICAgZ290byBkb25lOworCisgICAgZm9yIChpID0gMDsgaSA8IGdyb3VwLT5uX21lbTsgaSsrKSB7CisgICAgICBpZiAoZ3JvdXAtPm1lbVtpXSAhPSBnc3RfYnVmZmVyX3BlZWtfbWVtb3J5IChidWZmZXIsIGkpKQorICAgICAgICBnb3RvIGRvbmU7CisKKyAgICAgIGlmICghZ3N0X21lbW9yeV9pc193cml0YWJsZSAoZ3JvdXAtPm1lbVtpXSkpCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICB2YWxpZCA9IFRSVUU7CisgICAgaWYgKG91dF9ncm91cCkKKyAgICAgICpvdXRfZ3JvdXAgPSBncm91cDsKKyAgfQorCitkb25lOgorICByZXR1cm4gdmFsaWQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdjRsMl9idWZmZXJfcG9vbF9jb3B5X2J1ZmZlciAoR3N0VjRsMkJ1ZmZlclBvb2wgKiBwb29sLCBHc3RCdWZmZXIgKiBkZXN0LAorICAgIEdzdEJ1ZmZlciAqIHNyYykKK3sKKyAgY29uc3QgR3N0VmlkZW9Gb3JtYXRJbmZvICpmaW5mbyA9IHBvb2wtPmNhcHNfaW5mby5maW5mbzsKKworICBHU1RfTE9HX09CSkVDVCAocG9vbCwgImNvcHlpbmcgYnVmZmVyIik7CisKKyAgaWYgKGZpbmZvICYmIChmaW5mby0+Zm9ybWF0ICE9IEdTVF9WSURFT19GT1JNQVRfVU5LTk9XTiAmJgorICAgICAgICAgIGZpbmZvLT5mb3JtYXQgIT0gR1NUX1ZJREVPX0ZPUk1BVF9FTkNPREVEKSkgeworICAgIEdzdFZpZGVvRnJhbWUgc3JjX2ZyYW1lLCBkZXN0X2ZyYW1lOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocG9vbCwgImNvcHkgdmlkZW8gZnJhbWUiKTsKKworICAgIC8qIHdlIGhhdmUgcmF3IHZpZGVvLCB1c2UgdmlkZW9mcmFtZSBjb3B5IHRvIGdldCBzdHJpZGVzIHJpZ2h0ICovCisgICAgaWYgKCFnc3RfdmlkZW9fZnJhbWVfbWFwICgmc3JjX2ZyYW1lLCAmcG9vbC0+Y2Fwc19pbmZvLCBzcmMsIEdTVF9NQVBfUkVBRCkpCisgICAgICBnb3RvIGludmFsaWRfYnVmZmVyOworCisgICAgaWYgKCFnc3RfdmlkZW9fZnJhbWVfbWFwICgmZGVzdF9mcmFtZSwgJnBvb2wtPmNhcHNfaW5mbywgZGVzdCwKKyAgICAgICAgICAgIEdTVF9NQVBfV1JJVEUpKSB7CisgICAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKCZzcmNfZnJhbWUpOworICAgICAgZ290byBpbnZhbGlkX2J1ZmZlcjsKKyAgICB9CisKKyAgICBnc3RfdmlkZW9fZnJhbWVfY29weSAoJmRlc3RfZnJhbWUsICZzcmNfZnJhbWUpOworCisgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmc3JjX2ZyYW1lKTsKKyAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKCZkZXN0X2ZyYW1lKTsKKyAgfSBlbHNlIHsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBvb2wsICJjb3B5IHJhdyBieXRlcyIpOworCisgICAgaWYgKCFnc3RfYnVmZmVyX21hcCAoc3JjLCAmbWFwLCBHU1RfTUFQX1JFQUQpKQorICAgICAgZ290byBpbnZhbGlkX2J1ZmZlcjsKKworICAgIGdzdF9idWZmZXJfZmlsbCAoZGVzdCwgMCwgbWFwLmRhdGEsIGdzdF9idWZmZXJfZ2V0X3NpemUgKHNyYykpOworCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoc3JjLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3Jlc2l6ZSAoZGVzdCwgMCwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoc3JjKSk7CisgIH0KKworICBnc3RfYnVmZmVyX2NvcHlfaW50byAoZGVzdCwgc3JjLAorICAgICAgR1NUX0JVRkZFUl9DT1BZX0ZMQUdTIHwgR1NUX0JVRkZFUl9DT1BZX1RJTUVTVEFNUFMsIDAsIC0xKTsKKworICBHU1RfQ0FUX0xPR19PQkpFQ1QgKENBVF9QRVJGT1JNQU5DRSwgcG9vbCwgInNsb3cgY29weSBpbnRvIGJ1ZmZlciAlcCIsIGRlc3QpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworaW52YWxpZF9idWZmZXI6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwb29sLCAiY291bGQgbm90IG1hcCBidWZmZXIiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RydWN0IFVzZXJQdHJEYXRhCit7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBnYm9vbGVhbiBpc19mcmFtZTsKKyAgR3N0VmlkZW9GcmFtZSBmcmFtZTsKKyAgR3N0TWFwSW5mbyBtYXA7Cit9OworCitzdGF0aWMgR1F1YXJrCitnc3RfdjRsMl9idWZmZXJfcG9vbF9pbXBvcnRfcXVhcmsgKHZvaWQpCit7CisgIHN0YXRpYyBHUXVhcmsgcXVhcmsgPSAwOworCisgIGlmIChxdWFyayA9PSAwKQorICAgIHF1YXJrID0gZ19xdWFya19mcm9tX3N0cmluZyAoIkdzdFY0bDJCdWZmZXJQb29sVXNlUHRyRGF0YSIpOworCisgIHJldHVybiBxdWFyazsKK30KKworc3RhdGljIHZvaWQKK191bm1hcF91c2VycHRyX2ZyYW1lIChzdHJ1Y3QgVXNlclB0ckRhdGEgKmRhdGEpCit7CisgIGlmIChkYXRhLT5pc19mcmFtZSkKKyAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKCZkYXRhLT5mcmFtZSk7CisgIGVsc2UKKyAgICBnc3RfYnVmZmVyX3VubWFwIChkYXRhLT5idWZmZXIsICZkYXRhLT5tYXApOworCisgIGlmIChkYXRhLT5idWZmZXIpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoZGF0YS0+YnVmZmVyKTsKKworICBnX3NsaWNlX2ZyZWUgKHN0cnVjdCBVc2VyUHRyRGF0YSwgZGF0YSk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdjRsMl9idWZmZXJfcG9vbF9pbXBvcnRfdXNlcnB0ciAoR3N0VjRsMkJ1ZmZlclBvb2wgKiBwb29sLAorICAgIEdzdEJ1ZmZlciAqIGRlc3QsIEdzdEJ1ZmZlciAqIHNyYykKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0VjRsMk1lbW9yeUdyb3VwICpncm91cCA9IE5VTEw7CisgIEdzdE1hcEZsYWdzIGZsYWdzOworICBjb25zdCBHc3RWaWRlb0Zvcm1hdEluZm8gKmZpbmZvID0gcG9vbC0+Y2Fwc19pbmZvLmZpbmZvOworICBzdHJ1Y3QgVXNlclB0ckRhdGEgKmRhdGEgPSBOVUxMOworCisgIEdTVF9MT0dfT0JKRUNUIChwb29sLCAiaW1wb3J0aW5nIHVzZXJwdHIiKTsKKworICAvKiBnZXQgdGhlIGdyb3VwICovCisgIGlmICghZ3N0X3Y0bDJfaXNfYnVmZmVyX3ZhbGlkIChkZXN0LCAmZ3JvdXApKQorICAgIGdvdG8gbm90X291cl9idWZmZXI7CisKKyAgaWYgKFY0TDJfVFlQRV9JU19PVVRQVVQgKHBvb2wtPm9iai0+dHlwZSkpCisgICAgZmxhZ3MgPSBHU1RfTUFQX1JFQUQ7CisgIGVsc2UKKyAgICBmbGFncyA9IEdTVF9NQVBfV1JJVEU7CisKKyAgZGF0YSA9IGdfc2xpY2VfbmV3MCAoc3RydWN0IFVzZXJQdHJEYXRhKTsKKworICBpZiAoZmluZm8gJiYgKGZpbmZvLT5mb3JtYXQgIT0gR1NUX1ZJREVPX0ZPUk1BVF9VTktOT1dOICYmCisgICAgICAgICAgZmluZm8tPmZvcm1hdCAhPSBHU1RfVklERU9fRk9STUFUX0VOQ09ERUQpKSB7CisgICAgZ3NpemUgc2l6ZVtHU1RfVklERU9fTUFYX1BMQU5FU10gPSB7IDAsIH07CisgICAgZ2ludCBpOworCisgICAgZGF0YS0+aXNfZnJhbWUgPSBUUlVFOworCisgICAgaWYgKCFnc3RfdmlkZW9fZnJhbWVfbWFwICgmZGF0YS0+ZnJhbWUsICZwb29sLT5jYXBzX2luZm8sIHNyYywgZmxhZ3MpKQorICAgICAgZ290byBpbnZhbGlkX2J1ZmZlcjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBHU1RfVklERU9fRk9STUFUX0lORk9fTl9QTEFORVMgKGZpbmZvKTsgaSsrKSB7CisgICAgICBpZiAoR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX0lTX1RJTEVEIChmaW5mbykpIHsKKyAgICAgICAgZ2ludCB0aW5mbyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKCZkYXRhLT5mcmFtZSwgaSk7CisgICAgICAgIGdpbnQgcHN0cmlkZTsKKyAgICAgICAgZ3VpbnQgcGhlaWdodDsKKworICAgICAgICBwc3RyaWRlID0gR1NUX1ZJREVPX1RJTEVfWF9USUxFUyAodGluZm8pIDw8CisgICAgICAgICAgICBHU1RfVklERU9fRk9STUFUX0lORk9fVElMRV9XUyAoZmluZm8pOworCisgICAgICAgIHBoZWlnaHQgPSBHU1RfVklERU9fVElMRV9ZX1RJTEVTICh0aW5mbykgPDwKKyAgICAgICAgICAgIEdTVF9WSURFT19GT1JNQVRfSU5GT19USUxFX0hTIChmaW5mbyk7CisKKyAgICAgICAgc2l6ZVtpXSA9IHBzdHJpZGUgKiBwaGVpZ2h0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2l6ZVtpXSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKCZkYXRhLT5mcmFtZSwgaSkgKgorICAgICAgICAgICAgR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUICgmZGF0YS0+ZnJhbWUsIGkpOworICAgICAgfQorICAgIH0KKworICAgIC8qIEluIHRoZSBzaW5nbGUgcGxhbmFyIEFQSSwgcGxhbmVzIG11c3QgYmUgY29udGlndW91cyBpbiBtZW1vcnkgYW5kCisgICAgICogdGhlcmVmb3JlIHRoZXkgbXVzdCBoYXZlIGV4cGVjdGVkIHNpemUuIGllOiBubyBwYWRkaW5nLgorICAgICAqIFRvIGNoZWNrIHRoZXNlIGNvbmRpdGlvbnMsIHdlIGNoZWNrIHRoYXQgcGxhbmUgJ2knIHN0YXJ0IGFkZHJlc3MKKyAgICAgKiArIHBsYW5lICdpJyBzaXplIGVxdWFscyB0byBwbGFuZSAnaSsxJyBzdGFydCBhZGRyZXNzICovCisgICAgaWYgKCFWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIgKHBvb2wtPm9iai0+dHlwZSkpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAoR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX05fUExBTkVTIChmaW5mbykgLSAxKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeF9mbXQgPSAmcG9vbC0+b2JqLT5mb3JtYXQuZm10LnBpeDsKKyAgICAgICAgZ3BvaW50ZXIgdG1wOworICAgICAgICBnaW50IGVzdHJpZGUgPSBnc3RfdjRsMl9vYmplY3RfZXh0cmFwb2xhdGVfc3RyaWRlIChmaW5mbywgaSwKKyAgICAgICAgICAgIHBpeF9mbXQtPmJ5dGVzcGVybGluZSk7CisgICAgICAgIGd1aW50IGVoZWlnaHQgPSBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfSEVJR0hUIChmaW5mbywgaSwKKyAgICAgICAgICAgIHBpeF9mbXQtPmhlaWdodCk7CisKKyAgICAgICAgdG1wID0gKChndWludDggKikgZGF0YS0+ZnJhbWUuZGF0YVtpXSkgKyBlc3RyaWRlICogZWhlaWdodDsKKyAgICAgICAgaWYgKHRtcCAhPSBkYXRhLT5mcmFtZS5kYXRhW2kgKyAxXSkKKyAgICAgICAgICBnb3RvIG5vbl9jb250aWd1b3VzX21lbTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWdzdF92NGwyX2FsbG9jYXRvcl9pbXBvcnRfdXNlcnB0ciAocG9vbC0+dmFsbG9jYXRvciwgZ3JvdXAsCisgICAgICAgICAgICBkYXRhLT5mcmFtZS5pbmZvLnNpemUsIGZpbmZvLT5uX3BsYW5lcywgZGF0YS0+ZnJhbWUuZGF0YSwgc2l6ZSkpCisgICAgICBnb3RvIGltcG9ydF9mYWlsZWQ7CisgIH0gZWxzZSB7CisgICAgZ3BvaW50ZXIgcHRyWzFdOworICAgIGdzaXplIHNpemVbMV07CisKKyAgICBkYXRhLT5pc19mcmFtZSA9IEZBTFNFOworCisgICAgaWYgKCFnc3RfYnVmZmVyX21hcCAoc3JjLCAmZGF0YS0+bWFwLCBmbGFncykpCisgICAgICBnb3RvIGludmFsaWRfYnVmZmVyOworCisgICAgcHRyWzBdID0gZGF0YS0+bWFwLmRhdGE7CisgICAgc2l6ZVswXSA9IGRhdGEtPm1hcC5zaXplOworCisgICAgaWYgKCFnc3RfdjRsMl9hbGxvY2F0b3JfaW1wb3J0X3VzZXJwdHIgKHBvb2wtPnZhbGxvY2F0b3IsIGdyb3VwLAorICAgICAgICAgICAgZGF0YS0+bWFwLnNpemUsIDEsIHB0ciwgc2l6ZSkpCisgICAgICBnb3RvIGltcG9ydF9mYWlsZWQ7CisgIH0KKworICBkYXRhLT5idWZmZXIgPSBnc3RfYnVmZmVyX3JlZiAoc3JjKTsKKworICBnc3RfbWluaV9vYmplY3Rfc2V0X3FkYXRhIChHU1RfTUlOSV9PQkpFQ1QgKGRlc3QpLCBHU1RfVjRMMl9JTVBPUlRfUVVBUkssCisgICAgICBkYXRhLCAoR0Rlc3Ryb3lOb3RpZnkpIF91bm1hcF91c2VycHRyX2ZyYW1lKTsKKworICBnc3RfYnVmZmVyX2NvcHlfaW50byAoZGVzdCwgc3JjLAorICAgICAgR1NUX0JVRkZFUl9DT1BZX0ZMQUdTIHwgR1NUX0JVRkZFUl9DT1BZX1RJTUVTVEFNUFMsIDAsIC0xKTsKKworICByZXR1cm4gcmV0OworCitub3Rfb3VyX2J1ZmZlcjoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBvb2wsICJkZXN0aW5hdGlvbiBidWZmZXIgaW52YWxpZCBvciBub3QgZnJvbSBvdXIgcG9vbCIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQoraW52YWxpZF9idWZmZXI6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwb29sLCAiY291bGQgbm90IG1hcCBidWZmZXIiKTsKKyAgICBnX3NsaWNlX2ZyZWUgKHN0cnVjdCBVc2VyUHRyRGF0YSwgZGF0YSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Citub25fY29udGlndW91c19tZW06CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwb29sLCAibWVtb3J5IGlzIG5vdCBjb250aWd1b3VzIG9yIHBsYW5lIHNpemUgbWlzbWF0Y2giKTsKKyAgICBfdW5tYXBfdXNlcnB0cl9mcmFtZSAoZGF0YSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CitpbXBvcnRfZmFpbGVkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocG9vbCwgImZhaWxlZCB0byBpbXBvcnQgZGF0YSIpOworICAgIF91bm1hcF91c2VycHRyX2ZyYW1lIChkYXRhKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92NGwyX2J1ZmZlcl9wb29sX2ltcG9ydF9kbWFidWYgKEdzdFY0bDJCdWZmZXJQb29sICogcG9vbCwKKyAgICBHc3RCdWZmZXIgKiBkZXN0LCBHc3RCdWZmZXIgKiBzcmMpCit7CisgIEdzdFY0bDJNZW1vcnlHcm91cCAqZ3JvdXAgPSBOVUxMOworICBHc3RNZW1vcnkgKmRtYV9tZW1bR1NUX1ZJREVPX01BWF9QTEFORVNdID0geyAwIH07CisgIGd1aW50IG5fbWVtID0gZ3N0X2J1ZmZlcl9uX21lbW9yeSAoc3JjKTsKKyAgZ2ludCBpOworCisgIEdTVF9MT0dfT0JKRUNUIChwb29sLCAiaW1wb3J0aW5nIGRtYWJ1ZiIpOworCisgIGlmICghZ3N0X3Y0bDJfaXNfYnVmZmVyX3ZhbGlkIChkZXN0LCAmZ3JvdXApKQorICAgIGdvdG8gbm90X291cl9idWZmZXI7CisKKyAgaWYgKG5fbWVtID4gR1NUX1ZJREVPX01BWF9QTEFORVMpCisgICAgZ290byB0b29fbWFueV9tZW1zOworCisgIGZvciAoaSA9IDA7IGkgPCBuX21lbTsgaSsrKQorICAgIGRtYV9tZW1baV0gPSBnc3RfYnVmZmVyX3BlZWtfbWVtb3J5IChzcmMsIGkpOworCisgIGlmICghZ3N0X3Y0bDJfYWxsb2NhdG9yX2ltcG9ydF9kbWFidWYgKHBvb2wtPnZhbGxvY2F0b3IsIGdyb3VwLCBuX21lbSwKKyAgICAgICAgICBkbWFfbWVtKSkKKyAgICBnb3RvIGltcG9ydF9mYWlsZWQ7CisKKyAgZ3N0X21pbmlfb2JqZWN0X3NldF9xZGF0YSAoR1NUX01JTklfT0JKRUNUIChkZXN0KSwgR1NUX1Y0TDJfSU1QT1JUX1FVQVJLLAorICAgICAgZ3N0X2J1ZmZlcl9yZWYgKHNyYyksIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisKKyAgZ3N0X2J1ZmZlcl9jb3B5X2ludG8gKGRlc3QsIHNyYywKKyAgICAgIEdTVF9CVUZGRVJfQ09QWV9GTEFHUyB8IEdTVF9CVUZGRVJfQ09QWV9USU1FU1RBTVBTLCAwLCAtMSk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCitub3Rfb3VyX2J1ZmZlcjoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBvb2wsICJkZXN0aW5hdGlvbiBidWZmZXIgaW52YWxpZCBvciBub3QgZnJvbSBvdXIgcG9vbCIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQordG9vX21hbnlfbWVtczoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBvb2wsICJjb3VsZCBub3QgbWFwIGJ1ZmZlciIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQoraW1wb3J0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBvb2wsICJmYWlsZWQgdG8gaW1wb3J0IGRtYWJ1ZiIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcHJlcGFyZV9idWZmZXIgKEdzdFY0bDJCdWZmZXJQb29sICogcG9vbCwKKyAgICBHc3RCdWZmZXIgKiBkZXN0LCBHc3RCdWZmZXIgKiBzcmMpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGdib29sZWFuIG93bl9zcmMgPSBGQUxTRTsKKworICBpZiAoc3JjID09IE5VTEwpIHsKKyAgICBpZiAocG9vbC0+b3RoZXJfcG9vbCA9PSBOVUxMKSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChwb29sLCAiY2FuJ3QgcHJlcGFyZSBidWZmZXIsIHNvdXJjZSBidWZmZXIgbWlzc2luZyIpOworICAgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICAgIH0KKworICAgIHJldCA9IGdzdF9idWZmZXJfcG9vbF9hY3F1aXJlX2J1ZmZlciAocG9vbC0+b3RoZXJfcG9vbCwgJnNyYywgTlVMTCk7CisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAocG9vbCwgImZhaWxlZCB0byBhY3F1aXJlIGJ1ZmZlciBmcm9tIGRvd25zdHJlYW0gcG9vbCIpOworICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIG93bl9zcmMgPSBUUlVFOworICB9CisKKyAgc3dpdGNoIChwb29sLT5vYmotPm1vZGUpIHsKKyAgICBjYXNlIEdTVF9WNEwyX0lPX01NQVA6CisgICAgY2FzZSBHU1RfVjRMMl9JT19ETUFCVUY6CisgICAgICByZXQgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9jb3B5X2J1ZmZlciAocG9vbCwgZGVzdCwgc3JjKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1Y0TDJfSU9fVVNFUlBUUjoKKyAgICAgIHJldCA9IGdzdF92NGwyX2J1ZmZlcl9wb29sX2ltcG9ydF91c2VycHRyIChwb29sLCBkZXN0LCBzcmMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVjRMMl9JT19ETUFCVUZfSU1QT1JUOgorICAgICAgcmV0ID0gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfaW1wb3J0X2RtYWJ1ZiAocG9vbCwgZGVzdCwgc3JjKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChvd25fc3JjKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKHNyYyk7CisKK2RvbmU6CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdjRsMl9idWZmZXJfcG9vbF9hbGxvY19idWZmZXIgKEdzdEJ1ZmZlclBvb2wgKiBicG9vbCwgR3N0QnVmZmVyICoqIGJ1ZmZlciwKKyAgICBHc3RCdWZmZXJQb29sQWNxdWlyZVBhcmFtcyAqIHBhcmFtcykKK3sKKyAgR3N0VjRsMkJ1ZmZlclBvb2wgKnBvb2wgPSBHU1RfVjRMMl9CVUZGRVJfUE9PTCAoYnBvb2wpOworICBHc3RWNGwyTWVtb3J5R3JvdXAgKmdyb3VwID0gTlVMTDsKKyAgR3N0QnVmZmVyICpuZXdidWYgPSBOVUxMOworICBHc3RWNGwyT2JqZWN0ICpvYmo7CisgIEdzdFZpZGVvSW5mbyAqaW5mbzsKKworICBvYmogPSBwb29sLT5vYmo7CisgIGluZm8gPSAmb2JqLT5pbmZvOworCisgIHN3aXRjaCAob2JqLT5tb2RlKSB7CisgICAgY2FzZSBHU1RfVjRMMl9JT19SVzoKKyAgICAgIG5ld2J1ZiA9CisgICAgICAgICAgZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKHBvb2wtPmFsbG9jYXRvciwgcG9vbC0+c2l6ZSwgJnBvb2wtPnBhcmFtcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WNEwyX0lPX01NQVA6CisgICAgICBncm91cCA9IGdzdF92NGwyX2FsbG9jYXRvcl9hbGxvY19tbWFwIChwb29sLT52YWxsb2NhdG9yKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1Y0TDJfSU9fRE1BQlVGOgorICAgICAgZ3JvdXAgPSBnc3RfdjRsMl9hbGxvY2F0b3JfYWxsb2NfZG1hYnVmIChwb29sLT52YWxsb2NhdG9yLAorICAgICAgICAgIHBvb2wtPmFsbG9jYXRvcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WNEwyX0lPX1VTRVJQVFI6CisgICAgICBncm91cCA9IGdzdF92NGwyX2FsbG9jYXRvcl9hbGxvY191c2VycHRyIChwb29sLT52YWxsb2NhdG9yKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1Y0TDJfSU9fRE1BQlVGX0lNUE9SVDoKKyAgICAgIGdyb3VwID0gZ3N0X3Y0bDJfYWxsb2NhdG9yX2FsbG9jX2RtYWJ1ZmluIChwb29sLT52YWxsb2NhdG9yKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBuZXdidWYgPSBOVUxMOworICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChncm91cCAhPSBOVUxMKSB7CisgICAgZ2ludCBpOworICAgIG5ld2J1ZiA9IGdzdF9idWZmZXJfbmV3ICgpOworCisgICAgZm9yIChpID0gMDsgaSA8IGdyb3VwLT5uX21lbTsgaSsrKQorICAgICAgZ3N0X2J1ZmZlcl9hcHBlbmRfbWVtb3J5IChuZXdidWYsIGdyb3VwLT5tZW1baV0pOworICB9IGVsc2UgaWYgKG5ld2J1ZiA9PSBOVUxMKSB7CisgICAgZ290byBhbGxvY2F0aW9uX2ZhaWxlZDsKKyAgfQorCisgIC8qIGFkZCBtZXRhZGF0YSB0byByYXcgdmlkZW8gYnVmZmVycyAqLworICBpZiAocG9vbC0+YWRkX3ZpZGVvbWV0YSkKKyAgICBnc3RfYnVmZmVyX2FkZF92aWRlb19tZXRhX2Z1bGwgKG5ld2J1ZiwgR1NUX1ZJREVPX0ZSQU1FX0ZMQUdfTk9ORSwKKyAgICAgICAgR1NUX1ZJREVPX0lORk9fRk9STUFUIChpbmZvKSwgR1NUX1ZJREVPX0lORk9fV0lEVEggKGluZm8pLAorICAgICAgICBHU1RfVklERU9fSU5GT19IRUlHSFQgKGluZm8pLCBHU1RfVklERU9fSU5GT19OX1BMQU5FUyAoaW5mbyksCisgICAgICAgIGluZm8tPm9mZnNldCwgaW5mby0+c3RyaWRlKTsKKworICAqYnVmZmVyID0gbmV3YnVmOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworICAvKiBFUlJPUlMgKi8KK2FsbG9jYXRpb25fZmFpbGVkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocG9vbCwgImZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl9idWZmZXJfcG9vbF9zZXRfY29uZmlnIChHc3RCdWZmZXJQb29sICogYnBvb2wsIEdzdFN0cnVjdHVyZSAqIGNvbmZpZykKK3sKKyAgR3N0VjRsMkJ1ZmZlclBvb2wgKnBvb2wgPSBHU1RfVjRMMl9CVUZGRVJfUE9PTCAoYnBvb2wpOworICBHc3RWNGwyT2JqZWN0ICpvYmogPSBwb29sLT5vYmo7CisgIEdzdENhcHMgKmNhcHM7CisgIGd1aW50IHNpemUsIG1pbl9idWZmZXJzLCBtYXhfYnVmZmVyczsKKyAgR3N0QWxsb2NhdG9yICphbGxvY2F0b3I7CisgIEdzdEFsbG9jYXRpb25QYXJhbXMgcGFyYW1zOworICBnYm9vbGVhbiBjYW5fYWxsb2NhdGUgPSBGQUxTRTsKKyAgZ2Jvb2xlYW4gdXBkYXRlZCA9IEZBTFNFOworICBnYm9vbGVhbiByZXQ7CisKKyAgcG9vbC0+YWRkX3ZpZGVvbWV0YSA9CisgICAgICBnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX2hhc19vcHRpb24gKGNvbmZpZywKKyAgICAgIEdTVF9CVUZGRVJfUE9PTF9PUFRJT05fVklERU9fTUVUQSk7CisKKyAgLyogcGFyc2UgdGhlIGNvbmZpZyBhbmQga2VlcCBhcm91bmQgKi8KKyAgaWYgKCFnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX2dldF9wYXJhbXMgKGNvbmZpZywgJmNhcHMsICZzaXplLCAmbWluX2J1ZmZlcnMsCisgICAgICAgICAgJm1heF9idWZmZXJzKSkKKyAgICBnb3RvIHdyb25nX2NvbmZpZzsKKworICBpZiAoIWdzdF9idWZmZXJfcG9vbF9jb25maWdfZ2V0X2FsbG9jYXRvciAoY29uZmlnLCAmYWxsb2NhdG9yLCAmcGFyYW1zKSkKKyAgICBnb3RvIHdyb25nX2NvbmZpZzsKKworICBHU1RfREVCVUdfT0JKRUNUIChwb29sLCAiY29uZmlnICUiIEdTVF9QVFJfRk9STUFULCBjb25maWcpOworCisgIGlmIChwb29sLT5hbGxvY2F0b3IpCisgICAgZ3N0X29iamVjdF91bnJlZiAocG9vbC0+YWxsb2NhdG9yKTsKKyAgcG9vbC0+YWxsb2NhdG9yID0gTlVMTDsKKworICBzd2l0Y2ggKG9iai0+bW9kZSkgeworICAgIGNhc2UgR1NUX1Y0TDJfSU9fRE1BQlVGOgorICAgICAgcG9vbC0+YWxsb2NhdG9yID0gZ3N0X2RtYWJ1Zl9hbGxvY2F0b3JfbmV3ICgpOworICAgICAgY2FuX2FsbG9jYXRlID0gR1NUX1Y0TDJfQUxMT0NBVE9SX0NBTl9BTExPQ0FURSAocG9vbC0+dmFsbG9jYXRvciwgTU1BUCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WNEwyX0lPX01NQVA6CisgICAgICBjYW5fYWxsb2NhdGUgPSBHU1RfVjRMMl9BTExPQ0FUT1JfQ0FOX0FMTE9DQVRFIChwb29sLT52YWxsb2NhdG9yLCBNTUFQKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1Y0TDJfSU9fVVNFUlBUUjoKKyAgICAgIGNhbl9hbGxvY2F0ZSA9CisgICAgICAgICAgR1NUX1Y0TDJfQUxMT0NBVE9SX0NBTl9BTExPQ0FURSAocG9vbC0+dmFsbG9jYXRvciwgVVNFUlBUUik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WNEwyX0lPX0RNQUJVRl9JTVBPUlQ6CisgICAgICBjYW5fYWxsb2NhdGUgPSBHU1RfVjRMMl9BTExPQ0FUT1JfQ0FOX0FMTE9DQVRFIChwb29sLT52YWxsb2NhdG9yLCBETUFCVUYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVjRMMl9JT19SVzoKKyAgICAgIGlmIChhbGxvY2F0b3IpCisgICAgICAgIHBvb2wtPmFsbG9jYXRvciA9IGdfb2JqZWN0X3JlZiAoYWxsb2NhdG9yKTsKKyAgICAgIHBvb2wtPnBhcmFtcyA9IHBhcmFtczsKKyAgICAgIC8qIE5vIG5lZWQgdG8gY2hhbmdlIHRoZSBjb25maWd1cmF0aW9uICovCisgICAgICBnb3RvIGRvbmU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIGxpYnY0bDIgY29udmVyc2lvbiBjb2RlIGRvZXMgbm90IGhhbmRsZSBDUkVBVEVfQlVGUywgYW5kIG1heSBsZWFkIHRvCisgICAqIGluc3RhYmlsaXR5IGFuZCBjcmFzaCwgZGlzYWJsZSBpdCBmb3Igbm93ICovCisgIGlmIChjYW5fYWxsb2NhdGUgJiYgb2JqLT5mbXRkZXNjLT5mbGFncyAmIFY0TDJfRk1UX0ZMQUdfRU1VTEFURUQpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBvb2wsCisgICAgICAgICJsaWJ2NGwyIGNvbnZlcnRlciBkZXRlY3RlZCwgZGlzYWJsaW5nIENSRUFURV9CVUZTIik7CisgICAgY2FuX2FsbG9jYXRlID0gRkFMU0U7CisgICAgR1NUX09CSkVDVF9GTEFHX1VOU0VUIChwb29sLT52YWxsb2NhdG9yLAorICAgICAgICBHU1RfVjRMMl9BTExPQ0FUT1JfRkxBR19NTUFQX0NSRUFURV9CVUZTCisgICAgICAgIHwgR1NUX1Y0TDJfQUxMT0NBVE9SX0ZMQUdfVVNFUlBUUl9DUkVBVEVfQlVGUworICAgICAgICB8IEdTVF9WNEwyX0FMTE9DQVRPUl9GTEFHX0RNQUJVRl9DUkVBVEVfQlVGUyk7CisgIH0KKworICBpZiAobWluX2J1ZmZlcnMgPCBHU1RfVjRMMl9NSU5fQlVGRkVSUykgeworICAgIHVwZGF0ZWQgPSBUUlVFOworICAgIG1pbl9idWZmZXJzID0gR1NUX1Y0TDJfTUlOX0JVRkZFUlM7CisgICAgR1NUX0lORk9fT0JKRUNUIChwb29sLCAiaW5jcmVhc2luZyBtaW5pbXVtIGJ1ZmZlcnMgdG8gJXUiLCBtaW5fYnVmZmVycyk7CisgIH0KKworICAvKiByZXNwZWN0IGRyaXZlciByZXF1aXJlbWVudHMgKi8KKyAgaWYgKG1pbl9idWZmZXJzIDwgb2JqLT5taW5fYnVmZmVycykgeworICAgIHVwZGF0ZWQgPSBUUlVFOworICAgIG1pbl9idWZmZXJzID0gb2JqLT5taW5fYnVmZmVyczsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHBvb2wsICJpbmNyZWFzaW5nIG1pbmltdW0gYnVmZmVycyB0byAldSIsIG1pbl9idWZmZXJzKTsKKyAgfQorCisgIGlmIChtYXhfYnVmZmVycyA+IFZJREVPX01BWF9GUkFNRSB8fCBtYXhfYnVmZmVycyA9PSAwKSB7CisgICAgdXBkYXRlZCA9IFRSVUU7CisgICAgbWF4X2J1ZmZlcnMgPSBWSURFT19NQVhfRlJBTUU7CisgICAgR1NUX0lORk9fT0JKRUNUIChwb29sLCAicmVkdWNpbmcgbWF4aW11bSBidWZmZXJzIHRvICV1IiwgbWF4X2J1ZmZlcnMpOworICB9CisKKyAgaWYgKG1pbl9idWZmZXJzID4gbWF4X2J1ZmZlcnMpIHsKKyAgICB1cGRhdGVkID0gVFJVRTsKKyAgICBtaW5fYnVmZmVycyA9IG1heF9idWZmZXJzOworICAgIEdTVF9JTkZPX09CSkVDVCAocG9vbCwgInJlZHVjaW5nIG1pbmltdW0gYnVmZmVycyB0byAldSIsIG1pbl9idWZmZXJzKTsKKyAgfSBlbHNlIGlmIChtaW5fYnVmZmVycyAhPSBtYXhfYnVmZmVycykgeworICAgIGlmICghY2FuX2FsbG9jYXRlKSB7CisgICAgICB1cGRhdGVkID0gVFJVRTsKKyAgICAgIG1heF9idWZmZXJzID0gbWluX2J1ZmZlcnM7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKHBvb2wsICJjYW4ndCBhbGxvY2F0ZSwgc2V0dGluZyBtYXhpbXVtIHRvIG1pbmltdW0iKTsKKyAgICB9CisgIH0KKworICBpZiAoIXBvb2wtPmFkZF92aWRlb21ldGEgJiYgb2JqLT5uZWVkX3ZpZGVvX21ldGEpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHBvb2wsICJhZGRpbmcgbmVlZGVkIHZpZGVvIG1ldGEiKTsKKyAgICB1cGRhdGVkID0gVFJVRTsKKyAgICBnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX2FkZF9vcHRpb24gKGNvbmZpZywKKyAgICAgICAgR1NUX0JVRkZFUl9QT09MX09QVElPTl9WSURFT19NRVRBKTsKKyAgfQorCisgIC8qIEFsd2F5cyB1cGRhdGUgdGhlIGNvbmZpZyB0byBlbnN1cmUgdGhlIGNvbmZpZ3VyZWQgc2l6ZSBtYXRjaGVzICovCisgIGdzdF9idWZmZXJfcG9vbF9jb25maWdfc2V0X3BhcmFtcyAoY29uZmlnLCBjYXBzLCBvYmotPmluZm8uc2l6ZSwgbWluX2J1ZmZlcnMsCisgICAgICBtYXhfYnVmZmVycyk7CisKKyAgLyoga2VlcCBhIEdzdFZpZGVvSW5mbyB3aXRoIGRlZmF1bHRzIGZvciB0aGUgd2hlbiB3ZSBuZWVkIHRvIGNvcHkgKi8KKyAgZ3N0X3ZpZGVvX2luZm9fZnJvbV9jYXBzICgmcG9vbC0+Y2Fwc19pbmZvLCBjYXBzKTsKKworZG9uZToKKyAgcmV0ID0gR1NUX0JVRkZFUl9QT09MX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zZXRfY29uZmlnIChicG9vbCwgY29uZmlnKTsKKworICAvKiBJZiBhbnl0aGluZyB3YXMgY2hhbmdlZCBkb2N1bWVudGF0aW9uIHJlY29tbWFuZCB0byByZXR1cm4gRkFMU0UgKi8KKyAgcmV0dXJuICF1cGRhdGVkICYmIHJldDsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX2NvbmZpZzoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBvb2wsICJpbnZhbGlkIGNvbmZpZyAlIiBHU1RfUFRSX0ZPUk1BVCwgY29uZmlnKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92NGwyX2J1ZmZlcl9wb29sX3Jlc3VyZWN0X2J1ZmZlciAoR3N0VjRsMkJ1ZmZlclBvb2wgKiBwb29sKQoreworICBHc3RCdWZmZXJQb29sQWNxdWlyZVBhcmFtcyBwYXJhbXMgPSB7IDAgfTsKKyAgR3N0QnVmZmVyICpidWZmZXIgPSBOVUxMOworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBHU1RfREVCVUdfT0JKRUNUIChwb29sLCAiQSBidWZmZXIgd2FzIGxvc3QsIHJlYWxsb2NhdGluZyBpdCIpOworCisgIC8qIGJsb2NrIHJlY3Vyc2l2ZSBjYWxscyB0byB0aGlzIGZ1bmN0aW9uICovCisgIGdfc2lnbmFsX2hhbmRsZXJfYmxvY2sgKHBvb2wtPnZhbGxvY2F0b3IsIHBvb2wtPmdyb3VwX3JlbGVhc2VkX2hhbmRsZXIpOworCisgIHBhcmFtcy5mbGFncyA9CisgICAgICAoR3N0QnVmZmVyUG9vbEFjcXVpcmVGbGFncykgR1NUX1Y0TDJfQlVGRkVSX1BPT0xfQUNRVUlSRV9GTEFHX1JFU1VSUkVDVCB8CisgICAgICBHU1RfQlVGRkVSX1BPT0xfQUNRVUlSRV9GTEFHX0RPTlRXQUlUOworICByZXQgPQorICAgICAgZ3N0X2J1ZmZlcl9wb29sX2FjcXVpcmVfYnVmZmVyIChHU1RfQlVGRkVSX1BPT0wgKHBvb2wpLCAmYnVmZmVyLCAmcGFyYW1zKTsKKworICBpZiAocmV0ID09IEdTVF9GTE9XX09LKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgZ19zaWduYWxfaGFuZGxlcl91bmJsb2NrIChwb29sLT52YWxsb2NhdG9yLCBwb29sLT5ncm91cF9yZWxlYXNlZF9oYW5kbGVyKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX2J1ZmZlcl9wb29sX3N0cmVhbW9uIChHc3RWNGwyQnVmZmVyUG9vbCAqIHBvb2wpCit7CisgIEdzdFY0bDJPYmplY3QgKm9iaiA9IHBvb2wtPm9iajsKKworICBpZiAocG9vbC0+c3RyZWFtaW5nKQorICAgIHJldHVybiBUUlVFOworCisgIHN3aXRjaCAob2JqLT5tb2RlKSB7CisgICAgY2FzZSBHU1RfVjRMMl9JT19NTUFQOgorICAgIGNhc2UgR1NUX1Y0TDJfSU9fVVNFUlBUUjoKKyAgICBjYXNlIEdTVF9WNEwyX0lPX0RNQUJVRjoKKyAgICBjYXNlIEdTVF9WNEwyX0lPX0RNQUJVRl9JTVBPUlQ6CisgICAgICBpZiAoIVY0TDJfVFlQRV9JU19PVVRQVVQgKHBvb2wtPm9iai0+dHlwZSkpIHsKKyAgICAgICAgLyogRm9yIGNhcHR1cmVzLCB3ZSBuZWVkIHRvIGVucXVldWUgYnVmZmVycyBiZWZvcmUgd2Ugc3RhcnQgc3RyZWFtaW5nLAorICAgICAgICAgKiBzbyB0aGUgZHJpdmVyIGRvbid0IHVuZGVyZmxvdyBpbW1lZGlhdGx5LiBBcyB3ZSBoYXZlIHB1dCB0aGVuIGJhY2sKKyAgICAgICAgICogaW50byB0aGUgYmFzZSBjbGFzcyBxdWV1ZSwgcmVzdXJlY3QgdGhlbSwgdGhlbiByZWxlYXNpbmcgd2lsbCBxdWV1ZQorICAgICAgICAgKiB0aGVtIGJhY2suICovCisgICAgICAgIHdoaWxlIChnc3RfdjRsMl9idWZmZXJfcG9vbF9yZXN1cmVjdF9idWZmZXIgKHBvb2wpID09IEdTVF9GTE9XX09LKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAob2JqLT5pb2N0bCAocG9vbC0+dmlkZW9fZmQsIFZJRElPQ19TVFJFQU1PTiwgJm9iai0+dHlwZSkgPCAwKQorICAgICAgICBnb3RvIHN0cmVhbW9uX2ZhaWxlZDsKKworICAgICAgcG9vbC0+c3RyZWFtaW5nID0gVFJVRTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocG9vbCwgIlN0YXJ0ZWQgc3RyZWFtaW5nIik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gVFJVRTsKKworc3RyZWFtb25fZmFpbGVkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocG9vbCwgImVycm9yIHdpdGggU1RSRUFNT04gJWQgKCVzKSIsIGVycm5vLAorICAgICAgICBnX3N0cmVycm9yIChlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKiBDYWxsIHdpdGggc3RyZWFtbG9jayBoZWxkLCBvciB3aGVuIHN0cmVhbWluZyB0aHJlYWRzIGFyZSBkb3duICovCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfc3RyZWFtb2ZmIChHc3RWNGwyQnVmZmVyUG9vbCAqIHBvb2wpCit7CisgIEdzdEJ1ZmZlclBvb2xDbGFzcyAqcGNsYXNzID0gR1NUX0JVRkZFUl9QT09MX0NMQVNTIChwYXJlbnRfY2xhc3MpOworICBHc3RWNGwyT2JqZWN0ICpvYmogPSBwb29sLT5vYmo7CisgIGdpbnQgaTsKKworICBpZiAoIXBvb2wtPnN0cmVhbWluZykKKyAgICByZXR1cm47CisKKyAgc3dpdGNoIChvYmotPm1vZGUpIHsKKyAgICBjYXNlIEdTVF9WNEwyX0lPX01NQVA6CisgICAgY2FzZSBHU1RfVjRMMl9JT19VU0VSUFRSOgorICAgIGNhc2UgR1NUX1Y0TDJfSU9fRE1BQlVGOgorICAgIGNhc2UgR1NUX1Y0TDJfSU9fRE1BQlVGX0lNUE9SVDoKKworICAgICAgaWYgKG9iai0+aW9jdGwgKHBvb2wtPnZpZGVvX2ZkLCBWSURJT0NfU1RSRUFNT0ZGLCAmb2JqLT50eXBlKSA8IDApCisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocG9vbCwgIlNUUkVBTU9GRiBmYWlsZWQgd2l0aCBlcnJubyAlZCAoJXMpIiwKKyAgICAgICAgICAgIGVycm5vLCBnX3N0cmVycm9yIChlcnJubykpOworCisgICAgICBwb29sLT5zdHJlYW1pbmcgPSBGQUxTRTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocG9vbCwgIlN0b3BwZWQgc3RyZWFtaW5nIik7CisKKyAgICAgIGlmIChwb29sLT52YWxsb2NhdG9yKQorICAgICAgICBnc3RfdjRsMl9hbGxvY2F0b3JfZmx1c2ggKHBvb2wtPnZhbGxvY2F0b3IpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IFZJREVPX01BWF9GUkFNRTsgaSsrKSB7CisgICAgaWYgKHBvb2wtPmJ1ZmZlcnNbaV0pIHsKKyAgICAgIEdzdEJ1ZmZlciAqYnVmZmVyID0gcG9vbC0+YnVmZmVyc1tpXTsKKyAgICAgIEdzdEJ1ZmZlclBvb2wgKmJwb29sID0gR1NUX0JVRkZFUl9QT09MIChwb29sKTsKKworICAgICAgcG9vbC0+YnVmZmVyc1tpXSA9IE5VTEw7CisKKyAgICAgIGlmIChWNEwyX1RZUEVfSVNfT1VUUFVUIChwb29sLT5vYmotPnR5cGUpKQorICAgICAgICBnc3RfdjRsMl9idWZmZXJfcG9vbF9yZWxlYXNlX2J1ZmZlciAoYnBvb2wsIGJ1ZmZlcik7CisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IHJlLWVucXVldWUgY2FwdHVyZSBidWZmZXIgb24gc3RvcCAqLworICAgICAgICBwY2xhc3MtPnJlbGVhc2VfYnVmZmVyIChicG9vbCwgYnVmZmVyKTsKKworICAgICAgZ19hdG9taWNfaW50X2FkZCAoJnBvb2wtPm51bV9xdWV1ZWQsIC0xKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl9idWZmZXJfcG9vbF9zdGFydCAoR3N0QnVmZmVyUG9vbCAqIGJwb29sKQoreworICBHc3RWNGwyQnVmZmVyUG9vbCAqcG9vbCA9IEdTVF9WNEwyX0JVRkZFUl9QT09MIChicG9vbCk7CisgIEdzdEJ1ZmZlclBvb2xDbGFzcyAqcGNsYXNzID0gR1NUX0JVRkZFUl9QT09MX0NMQVNTIChwYXJlbnRfY2xhc3MpOworICBHc3RWNGwyT2JqZWN0ICpvYmogPSBwb29sLT5vYmo7CisgIEdzdFN0cnVjdHVyZSAqY29uZmlnOworICBHc3RDYXBzICpjYXBzOworICBndWludCBzaXplLCBtaW5fYnVmZmVycywgbWF4X2J1ZmZlcnM7CisgIGd1aW50IG1heF9sYXRlbmN5LCBtaW5fbGF0ZW5jeSwgY29weV90aHJlc2hvbGQgPSAwOworICBnYm9vbGVhbiBjYW5fYWxsb2NhdGUgPSBGQUxTRSwgcmV0ID0gVFJVRTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwb29sLCAiYWN0aXZhdGluZyBwb29sIik7CisKKyAgY29uZmlnID0gZ3N0X2J1ZmZlcl9wb29sX2dldF9jb25maWcgKGJwb29sKTsKKyAgaWYgKCFnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX2dldF9wYXJhbXMgKGNvbmZpZywgJmNhcHMsICZzaXplLCAmbWluX2J1ZmZlcnMsCisgICAgICAgICAgJm1heF9idWZmZXJzKSkKKyAgICBnb3RvIHdyb25nX2NvbmZpZzsKKworICBtaW5fbGF0ZW5jeSA9IE1BWCAoR1NUX1Y0TDJfTUlOX0JVRkZFUlMsIG9iai0+bWluX2J1ZmZlcnMpOworCisgIHN3aXRjaCAob2JqLT5tb2RlKSB7CisgICAgY2FzZSBHU1RfVjRMMl9JT19SVzoKKyAgICAgIGNhbl9hbGxvY2F0ZSA9IFRSVUU7CisjaWZkZWYgSEFWRV9MSUJWNEwyCisgICAgICAvKiBUaGlzIHdvcmthcm91bmQgYSB1bmZpeGFibGUgYnVnIGluIGxpYnY0bDIgd2hlbiBSVyBpcyBlbXVsYXRlZCBvbiB0b3AKKyAgICAgICAqIG9mIE1NQVAuIEluIHRoaXMgY2FzZSwgdGhlIGZpcnN0IHJlYWQgaW5pdGlhbGl6ZSB0aGUgcXVldWVzLCBidXQgdGhlCisgICAgICAgKiBwb2xsIGJlZm9yZSB0aGF0IHdpbGwgYWx3YXlzIGZhaWwuIERvaW5nIGFuIGVtcHR5IHJlYWQsIGZvcmNlcyB0aGUKKyAgICAgICAqIHF1ZXVlIHRvIGJlIGluaXRpYWxpemVkIG5vdy4gV2Ugb25seSBkbyB0aGlzIGlmIHdlIGhhdmUgYSBzdHJlYW1pbmcKKyAgICAgICAqIGRyaXZlci4gKi8KKyAgICAgIGlmIChvYmotPmRldmljZV9jYXBzICYgVjRMMl9DQVBfU1RSRUFNSU5HKQorICAgICAgICBvYmotPnJlYWQgKG9iai0+dmlkZW9fZmQsIE5VTEwsIDApOworI2VuZGlmCisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WNEwyX0lPX0RNQUJVRjoKKyAgICBjYXNlIEdTVF9WNEwyX0lPX01NQVA6CisgICAgeworICAgICAgZ3VpbnQgY291bnQ7CisKKyAgICAgIGNhbl9hbGxvY2F0ZSA9IEdTVF9WNEwyX0FMTE9DQVRPUl9DQU5fQUxMT0NBVEUgKHBvb2wtPnZhbGxvY2F0b3IsIE1NQVApOworCisgICAgICAvKiBmaXJzdCwgbGV0cyByZXF1ZXN0IGJ1ZmZlcnMsIGFuZCBzZWUgaG93IG1hbnkgd2UgY2FuIGdldDogKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBvb2wsICJyZXF1ZXN0aW5nICVkIE1NQVAgYnVmZmVycyIsIG1pbl9idWZmZXJzKTsKKworICAgICAgY291bnQgPSBnc3RfdjRsMl9hbGxvY2F0b3Jfc3RhcnQgKHBvb2wtPnZhbGxvY2F0b3IsIG1pbl9idWZmZXJzLAorICAgICAgICAgIFY0TDJfTUVNT1JZX01NQVApOworCisgICAgICBpZiAoY291bnQgPCBHU1RfVjRMMl9NSU5fQlVGRkVSUykgeworICAgICAgICBtaW5fYnVmZmVycyA9IGNvdW50OworICAgICAgICBnb3RvIG5vX2J1ZmZlcnM7CisgICAgICB9CisKKyAgICAgIC8qIFY0TDIgYnVmZmVyIHBvb2wgYXJlIG9mdGVuIHZlcnkgbGltaXRlZCBpbiB0aGUgYW1vdW50IG9mIGJ1ZmZlcnMgaXQKKyAgICAgICAqIGNhbiBvZmZlci4gVGhlIGNvcHlfdGhyZXNob2xkIHdpbGwgd29ya2Fyb3VuZCB0aGlzIGxpbWl0YXRpb24gYnkKKyAgICAgICAqIGZhbGxpbmcgYmFjayB0byBjb3B5IGlmIHRoZSBwaXBlbGluZSBuZWVkZWQgbW9yZSBidWZmZXJzLiBUaGlzIGFsc28KKyAgICAgICAqIHByZXZlbnQgaGF2aW5nIHRvIGRvIFJFUUJVRlMoTikvUkVRQlVGUygwKSBldmVyeXRpbWUgY29uZmlndXJlIGlzCisgICAgICAgKiBjYWxsZWQuICovCisgICAgICBpZiAoY291bnQgIT0gbWluX2J1ZmZlcnMgfHwgcG9vbC0+ZW5hYmxlX2NvcHlfdGhyZXNob2xkKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocG9vbCwKKyAgICAgICAgICAgICJVbmNlcnRhaW4gb3Igbm90IGVub3VnaCBidWZmZXJzLCBlbmFibGluZyBjb3B5IHRocmVzaG9sZCIpOworICAgICAgICBtaW5fYnVmZmVycyA9IGNvdW50OworICAgICAgICBjb3B5X3RocmVzaG9sZCA9IG1pbl9sYXRlbmN5OworICAgICAgfQorCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfVjRMMl9JT19VU0VSUFRSOgorICAgIHsKKyAgICAgIGd1aW50IGNvdW50OworCisgICAgICBjYW5fYWxsb2NhdGUgPQorICAgICAgICAgIEdTVF9WNEwyX0FMTE9DQVRPUl9DQU5fQUxMT0NBVEUgKHBvb2wtPnZhbGxvY2F0b3IsIFVTRVJQVFIpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwb29sLCAicmVxdWVzdGluZyAlZCBVU0VSUFRSIGJ1ZmZlcnMiLCBtaW5fYnVmZmVycyk7CisKKyAgICAgIGNvdW50ID0gZ3N0X3Y0bDJfYWxsb2NhdG9yX3N0YXJ0IChwb29sLT52YWxsb2NhdG9yLCBtaW5fYnVmZmVycywKKyAgICAgICAgICBWNEwyX01FTU9SWV9VU0VSUFRSKTsKKworICAgICAgLyogVGhlcmUgaXMgbm8gcmF0aW9uYWwgdG8gbm90IGdldCB3aGF0IHdlIGFza2VkICovCisgICAgICBpZiAoY291bnQgPCBtaW5fYnVmZmVycykgeworICAgICAgICBtaW5fYnVmZmVycyA9IGNvdW50OworICAgICAgICBnb3RvIG5vX2J1ZmZlcnM7CisgICAgICB9CisKKyAgICAgIG1pbl9idWZmZXJzID0gY291bnQ7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfVjRMMl9JT19ETUFCVUZfSU1QT1JUOgorICAgIHsKKyAgICAgIGd1aW50IGNvdW50OworCisgICAgICBjYW5fYWxsb2NhdGUgPSBHU1RfVjRMMl9BTExPQ0FUT1JfQ0FOX0FMTE9DQVRFIChwb29sLT52YWxsb2NhdG9yLCBETUFCVUYpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwb29sLCAicmVxdWVzdGluZyAlZCBETUFCVUYgYnVmZmVycyIsIG1pbl9idWZmZXJzKTsKKworICAgICAgY291bnQgPSBnc3RfdjRsMl9hbGxvY2F0b3Jfc3RhcnQgKHBvb2wtPnZhbGxvY2F0b3IsIG1pbl9idWZmZXJzLAorICAgICAgICAgIFY0TDJfTUVNT1JZX0RNQUJVRik7CisKKyAgICAgIC8qIFRoZXJlIGlzIG5vIHJhdGlvbmFsIHRvIG5vdCBnZXQgd2hhdCB3ZSBhc2tlZCAqLworICAgICAgaWYgKGNvdW50IDwgbWluX2J1ZmZlcnMpIHsKKyAgICAgICAgbWluX2J1ZmZlcnMgPSBjb3VudDsKKyAgICAgICAgZ290byBub19idWZmZXJzOworICAgICAgfQorCisgICAgICBtaW5fYnVmZmVycyA9IGNvdW50OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBtaW5fYnVmZmVycyA9IDA7CisgICAgICBjb3B5X3RocmVzaG9sZCA9IDA7CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKGNhbl9hbGxvY2F0ZSkKKyAgICBtYXhfbGF0ZW5jeSA9IG1heF9idWZmZXJzOworICBlbHNlCisgICAgbWF4X2xhdGVuY3kgPSBtaW5fYnVmZmVyczsKKworICBwb29sLT5zaXplID0gc2l6ZTsKKyAgcG9vbC0+Y29weV90aHJlc2hvbGQgPSBjb3B5X3RocmVzaG9sZDsKKyAgcG9vbC0+bWF4X2xhdGVuY3kgPSBtYXhfbGF0ZW5jeTsKKyAgcG9vbC0+bWluX2xhdGVuY3kgPSBtaW5fbGF0ZW5jeTsKKyAgcG9vbC0+bnVtX3F1ZXVlZCA9IDA7CisKKyAgaWYgKG1heF9idWZmZXJzICE9IDAgJiYgbWF4X2J1ZmZlcnMgPCBtaW5fYnVmZmVycykKKyAgICBtYXhfYnVmZmVycyA9IG1pbl9idWZmZXJzOworCisgIGdzdF9idWZmZXJfcG9vbF9jb25maWdfc2V0X3BhcmFtcyAoY29uZmlnLCBjYXBzLCBzaXplLCBtaW5fYnVmZmVycywKKyAgICAgIG1heF9idWZmZXJzKTsKKyAgcGNsYXNzLT5zZXRfY29uZmlnIChicG9vbCwgY29uZmlnKTsKKyAgZ3N0X3N0cnVjdHVyZV9mcmVlIChjb25maWcpOworCisgIGlmIChwb29sLT5vdGhlcl9wb29sKQorICAgIGlmICghZ3N0X2J1ZmZlcl9wb29sX3NldF9hY3RpdmUgKHBvb2wtPm90aGVyX3Bvb2wsIFRSVUUpKQorICAgICAgZ290byBvdGhlcl9wb29sX2ZhaWxlZDsKKworICAvKiBub3csIGFsbG9jYXRlIHRoZSBidWZmZXJzOiAqLworICBpZiAoIXBjbGFzcy0+c3RhcnQgKGJwb29sKSkKKyAgICBnb3RvIHN0YXJ0X2ZhaWxlZDsKKworICBpZiAoIVY0TDJfVFlQRV9JU19PVVRQVVQgKG9iai0+dHlwZSkpIHsKKyAgICBwb29sLT5ncm91cF9yZWxlYXNlZF9oYW5kbGVyID0KKyAgICAgICAgZ19zaWduYWxfY29ubmVjdF9zd2FwcGVkIChwb29sLT52YWxsb2NhdG9yLCAiZ3JvdXAtcmVsZWFzZWQiLAorICAgICAgICBHX0NBTExCQUNLIChnc3RfdjRsMl9idWZmZXJfcG9vbF9yZXN1cmVjdF9idWZmZXIpLCBwb29sKTsKKyAgICByZXQgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9zdHJlYW1vbiAocG9vbCk7CisgIH0KKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLword3JvbmdfY29uZmlnOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocG9vbCwgImludmFsaWQgY29uZmlnICUiIEdTVF9QVFJfRk9STUFULCBjb25maWcpOworICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoY29uZmlnKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX2J1ZmZlcnM6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwb29sLAorICAgICAgICAid2UgcmVjZWl2ZWQgJWQgYnVmZmVyIGZyb20gZGV2aWNlICclcycsIHdlIHdhbnQgYXQgbGVhc3QgJWQiLAorICAgICAgICBtaW5fYnVmZmVycywgb2JqLT52aWRlb2RldiwgR1NUX1Y0TDJfTUlOX0JVRkZFUlMpOworICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoY29uZmlnKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3N0YXJ0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBvb2wsICJhbGxvY2F0ZSBmYWlsZWQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK290aGVyX3Bvb2xfZmFpbGVkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocG9vbCwgImZhaWxlZCB0byBhY3RpdmUgdGhlIG90aGVyIHBvb2wgJSIKKyAgICAgICAgR1NUX1BUUl9GT1JNQVQsIHBvb2wtPm90aGVyX3Bvb2wpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX2J1ZmZlcl9wb29sX3N0b3AgKEdzdEJ1ZmZlclBvb2wgKiBicG9vbCkKK3sKKyAgR3N0VjRsMkJ1ZmZlclBvb2wgKnBvb2wgPSBHU1RfVjRMMl9CVUZGRVJfUE9PTCAoYnBvb2wpOworICBnYm9vbGVhbiByZXQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocG9vbCwgInN0b3BwaW5nIHBvb2wiKTsKKworICBpZiAocG9vbC0+Z3JvdXBfcmVsZWFzZWRfaGFuZGxlciA+IDApIHsKKyAgICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QgKHBvb2wtPnZhbGxvY2F0b3IsCisgICAgICAgIHBvb2wtPmdyb3VwX3JlbGVhc2VkX2hhbmRsZXIpOworICAgIHBvb2wtPmdyb3VwX3JlbGVhc2VkX2hhbmRsZXIgPSAwOworICB9CisKKyAgaWYgKHBvb2wtPm90aGVyX3Bvb2wpIHsKKyAgICBnc3RfYnVmZmVyX3Bvb2xfc2V0X2FjdGl2ZSAocG9vbC0+b3RoZXJfcG9vbCwgRkFMU0UpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHBvb2wtPm90aGVyX3Bvb2wpOworICAgIHBvb2wtPm90aGVyX3Bvb2wgPSBOVUxMOworICB9CisKKyAgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfc3RyZWFtb2ZmIChwb29sKTsKKworICByZXQgPSBHU1RfQlVGRkVSX1BPT0xfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnN0b3AgKGJwb29sKTsKKworICBpZiAocmV0ICYmIHBvb2wtPnZhbGxvY2F0b3IpIHsKKyAgICBHc3RWNGwyUmV0dXJuIHZyZXQ7CisKKyAgICB2cmV0ID0gZ3N0X3Y0bDJfYWxsb2NhdG9yX3N0b3AgKHBvb2wtPnZhbGxvY2F0b3IpOworCisgICAgaWYgKHZyZXQgPT0gR1NUX1Y0TDJfQlVTWSkKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocG9vbCwgInNvbWUgYnVmZmVycyBhcmUgc3RpbGwgb3V0c3RhbmRpbmciKTsKKworICAgIHJldCA9ICh2cmV0ID09IEdTVF9WNEwyX09LKTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9idWZmZXJfcG9vbF9mbHVzaF9zdGFydCAoR3N0QnVmZmVyUG9vbCAqIGJwb29sKQoreworICBHc3RWNGwyQnVmZmVyUG9vbCAqcG9vbCA9IEdTVF9WNEwyX0JVRkZFUl9QT09MIChicG9vbCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocG9vbCwgInN0YXJ0IGZsdXNoaW5nIik7CisKKyAgZ3N0X3BvbGxfc2V0X2ZsdXNoaW5nIChwb29sLT5wb2xsLCBUUlVFKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHBvb2wpOworICBwb29sLT5lbXB0eSA9IEZBTFNFOworICBnX2NvbmRfYnJvYWRjYXN0ICgmcG9vbC0+ZW1wdHlfY29uZCk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChwb29sKTsKKworICBpZiAocG9vbC0+b3RoZXJfcG9vbCkKKyAgICBnc3RfYnVmZmVyX3Bvb2xfc2V0X2ZsdXNoaW5nIChwb29sLT5vdGhlcl9wb29sLCBUUlVFKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2J1ZmZlcl9wb29sX2ZsdXNoX3N0b3AgKEdzdEJ1ZmZlclBvb2wgKiBicG9vbCkKK3sKKyAgR3N0VjRsMkJ1ZmZlclBvb2wgKnBvb2wgPSBHU1RfVjRMMl9CVUZGRVJfUE9PTCAoYnBvb2wpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBvb2wsICJzdG9wIGZsdXNoaW5nIik7CisKKyAgaWYgKHBvb2wtPm90aGVyX3Bvb2wpCisgICAgZ3N0X2J1ZmZlcl9wb29sX3NldF9mbHVzaGluZyAocG9vbC0+b3RoZXJfcG9vbCwgRkFMU0UpOworCisgIGdzdF9wb2xsX3NldF9mbHVzaGluZyAocG9vbC0+cG9sbCwgRkFMU0UpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcG9sbCAoR3N0VjRsMkJ1ZmZlclBvb2wgKiBwb29sKQoreworICBnaW50IHJldDsKKworICAvKiBJbiBSVyBtb2RlIHRoZXJlIGlzIG5vIHF1ZXVlLCBoZW5jZSBubyBuZWVkIHRvIHdhaXQgd2hpbGUgdGhlIHF1ZXVlIGlzCisgICAqIGVtcHR5ICovCisgIGlmIChwb29sLT5vYmotPm1vZGUgIT0gR1NUX1Y0TDJfSU9fUlcpIHsKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKHBvb2wpOworICAgIHdoaWxlIChwb29sLT5lbXB0eSkKKyAgICAgIGdfY29uZF93YWl0ICgmcG9vbC0+ZW1wdHlfY29uZCwgR1NUX09CSkVDVF9HRVRfTE9DSyAocG9vbCkpOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChwb29sKTsKKyAgfQorCisgIGlmICghcG9vbC0+Y2FuX3BvbGxfZGV2aWNlKQorICAgIGdvdG8gZG9uZTsKKworICBHU1RfTE9HX09CSkVDVCAocG9vbCwgInBvbGxpbmcgZGV2aWNlIik7CisKK2FnYWluOgorICByZXQgPSBnc3RfcG9sbF93YWl0IChwb29sLT5wb2xsLCBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKyAgaWYgKEdfVU5MSUtFTFkgKHJldCA8IDApKSB7CisgICAgc3dpdGNoIChlcnJubykgeworICAgICAgY2FzZSBFQlVTWToKKyAgICAgICAgZ290byBzdG9wcGVkOworICAgICAgY2FzZSBFQUdBSU46CisgICAgICBjYXNlIEVJTlRSOgorICAgICAgICBnb3RvIGFnYWluOworICAgICAgY2FzZSBFTlhJTzoKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwb29sLAorICAgICAgICAgICAgInY0bDIgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBwb2xsaW5nLiBEaXNhYmxpbmciCisgICAgICAgICAgICAiIHVzaW5nIGxpYnY0bDIgaW4gdGhpcyBjYXNlIG1heSBjYXVzZSBkZWFkbG9ja3MiKTsKKyAgICAgICAgcG9vbC0+Y2FuX3BvbGxfZGV2aWNlID0gRkFMU0U7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gc2VsZWN0X2Vycm9yOworICAgIH0KKyAgfQorCisgIGlmIChnc3RfcG9sbF9mZF9oYXNfZXJyb3IgKHBvb2wtPnBvbGwsICZwb29sLT5wb2xsZmQpKQorICAgIGdvdG8gc2VsZWN0X2Vycm9yOworCitkb25lOgorICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVJST1JTICovCitzdG9wcGVkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocG9vbCwgInN0b3AgY2FsbGVkIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICB9CitzZWxlY3RfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocG9vbC0+b2JqLT5lbGVtZW50LCBSRVNPVVJDRSwgUkVBRCwgKE5VTEwpLAorICAgICAgICAoInBvbGwgZXJyb3IgJWQ6ICVzICglZCkiLCByZXQsIGdfc3RyZXJyb3IgKGVycm5vKSwgZXJybm8pKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92NGwyX2J1ZmZlcl9wb29sX3FidWYgKEdzdFY0bDJCdWZmZXJQb29sICogcG9vbCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RWNGwyTWVtb3J5R3JvdXAgKmdyb3VwID0gTlVMTDsKKyAgY29uc3QgR3N0VjRsMk9iamVjdCAqb2JqID0gcG9vbC0+b2JqOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworICBnaW50IGluZGV4OworCisgIGlmICghZ3N0X3Y0bDJfaXNfYnVmZmVyX3ZhbGlkIChidWYsICZncm91cCkpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwb29sLCAiaW52YWxpZCBidWZmZXIgJXAiLCBidWYpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIGluZGV4ID0gZ3JvdXAtPmJ1ZmZlci5pbmRleDsKKworICBpZiAocG9vbC0+YnVmZmVyc1tpbmRleF0gIT0gTlVMTCkKKyAgICBnb3RvIGFscmVhZHlfcXVldWVkOworCisgIEdTVF9MT0dfT0JKRUNUIChwb29sLCAicXVldWluZyBidWZmZXIgJWkiLCBpbmRleCk7CisKKyAgaWYgKFY0TDJfVFlQRV9JU19PVVRQVVQgKG9iai0+dHlwZSkpIHsKKyAgICBlbnVtIHY0bDJfZmllbGQgZmllbGQ7CisKKyAgICAvKiBFeGNlcHQgd2hlbiBmaWVsZCBpcyBzZXQgdG8gYWx0ZXJuYXRlLCBidWZmZXIgZmllbGQgaXMgdGhlIHNhbWUgYXMKKyAgICAgKiB0aGUgb25lIGRlZmluZWQgaW4gZm9ybWF0ICovCisgICAgaWYgKFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUiAob2JqLT50eXBlKSkKKyAgICAgIGZpZWxkID0gb2JqLT5mb3JtYXQuZm10LnBpeF9tcC5maWVsZDsKKyAgICBlbHNlCisgICAgICBmaWVsZCA9IG9iai0+Zm9ybWF0LmZtdC5waXguZmllbGQ7CisKKyAgICAvKiBOQjogQXQgdGhpcyBtb21lbnQsIHdlIGNhbid0IGhhdmUgYWx0ZXJuYXRlIG1vZGUgYmVjYXVzZSBpdCBub3QgaGFuZGxlZAorICAgICAqIHlldCAqLworICAgIGlmIChmaWVsZCA9PSBWNEwyX0ZJRUxEX0FMVEVSTkFURSkgeworICAgICAgaWYgKEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZiwgR1NUX1ZJREVPX0ZSQU1FX0ZMQUdfVEZGKSkKKyAgICAgICAgZmllbGQgPSBWNEwyX0ZJRUxEX1RPUDsKKyAgICAgIGVsc2UKKyAgICAgICAgZmllbGQgPSBWNEwyX0ZJRUxEX0JPVFRPTTsKKyAgICB9CisKKyAgICBncm91cC0+YnVmZmVyLmZpZWxkID0gZmllbGQ7CisgIH0KKworICBpZiAoR1NUX0JVRkZFUl9USU1FU1RBTVBfSVNfVkFMSUQgKGJ1ZikpIHsKKyAgICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKTsKKyAgICBHU1RfVElNRV9UT19USU1FVkFMICh0aW1lc3RhbXAsIGdyb3VwLT5idWZmZXIudGltZXN0YW1wKTsKKyAgfQorCisgIEdTVF9PQkpFQ1RfTE9DSyAocG9vbCk7CisgIGdfYXRvbWljX2ludF9pbmMgKCZwb29sLT5udW1fcXVldWVkKTsKKyAgcG9vbC0+YnVmZmVyc1tpbmRleF0gPSBidWY7CisKKyAgaWYgKCFnc3RfdjRsMl9hbGxvY2F0b3JfcWJ1ZiAocG9vbC0+dmFsbG9jYXRvciwgZ3JvdXApKQorICAgIGdvdG8gcXVldWVfZmFpbGVkOworCisgIHBvb2wtPmVtcHR5ID0gRkFMU0U7CisgIGdfY29uZF9zaWduYWwgKCZwb29sLT5lbXB0eV9jb25kKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHBvb2wpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworYWxyZWFkeV9xdWV1ZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwb29sLCAidGhlIGJ1ZmZlciAlaSB3YXMgYWxyZWFkeSBxdWV1ZWQiLCBpbmRleCk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CitxdWV1ZV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwb29sLCAiY291bGQgbm90IHF1ZXVlIGEgYnVmZmVyICVpIiwgaW5kZXgpOworICAgIC8qIE1hcmsgYnJva2VuIGJ1ZmZlciB0byB0aGUgYWxsb2NhdG9yICovCisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfVEFHX01FTU9SWSk7CisgICAgZ19hdG9taWNfaW50X2FkZCAoJnBvb2wtPm51bV9xdWV1ZWQsIC0xKTsKKyAgICBwb29sLT5idWZmZXJzW2luZGV4XSA9IE5VTEw7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHBvb2wpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfZHFidWYgKEdzdFY0bDJCdWZmZXJQb29sICogcG9vbCwgR3N0QnVmZmVyICoqIGJ1ZmZlcikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXM7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHc3RWNGwyT2JqZWN0ICpvYmogPSBwb29sLT5vYmo7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisgIEdzdFY0bDJNZW1vcnlHcm91cCAqZ3JvdXA7CisgIEdzdFZpZGVvTWV0YSAqdm1ldGE7CisgIGdzaXplIHNpemU7CisgIGdpbnQgaTsKKworICBpZiAoKHJlcyA9IGdzdF92NGwyX2J1ZmZlcl9wb29sX3BvbGwgKHBvb2wpKSAhPSBHU1RfRkxPV19PSykKKyAgICBnb3RvIHBvbGxfZmFpbGVkOworCisgIEdTVF9MT0dfT0JKRUNUIChwb29sLCAiZGVxdWV1ZWluZyBhIGJ1ZmZlciIpOworCisgIHJlcyA9IGdzdF92NGwyX2FsbG9jYXRvcl9kcWJ1ZiAocG9vbC0+dmFsbG9jYXRvciwgJmdyb3VwKTsKKyAgaWYgKHJlcyA9PSBHU1RfRkxPV19FT1MpCisgICAgZ290byBlb3M7CisgIGlmIChyZXMgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBkcWJ1Zl9mYWlsZWQ7CisKKyAgLyogZ2V0IG91ciBHc3RCdWZmZXIgd2l0aCB0aGF0IGluZGV4IGZyb20gdGhlIHBvb2wsIGlmIHRoZSBidWZmZXIgd2FzCisgICAqIG91dHN0YW5kaW5nIHdlIGhhdmUgYSBzZXJpb3VzIHByb2JsZW0uCisgICAqLworICBvdXRidWYgPSBwb29sLT5idWZmZXJzW2dyb3VwLT5idWZmZXIuaW5kZXhdOworICBpZiAob3V0YnVmID09IE5VTEwpCisgICAgZ290byBub19idWZmZXI7CisKKyAgLyogbWFyayB0aGUgYnVmZmVyIG91dHN0YW5kaW5nICovCisgIHBvb2wtPmJ1ZmZlcnNbZ3JvdXAtPmJ1ZmZlci5pbmRleF0gPSBOVUxMOworICBpZiAoZ19hdG9taWNfaW50X2RlY19hbmRfdGVzdCAoJnBvb2wtPm51bV9xdWV1ZWQpKSB7CisgICAgR1NUX09CSkVDVF9MT0NLIChwb29sKTsKKyAgICBwb29sLT5lbXB0eSA9IFRSVUU7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHBvb2wpOworICB9CisKKyAgdGltZXN0YW1wID0gR1NUX1RJTUVWQUxfVE9fVElNRSAoZ3JvdXAtPmJ1ZmZlci50aW1lc3RhbXApOworCisgIHNpemUgPSAwOworICB2bWV0YSA9IGdzdF9idWZmZXJfZ2V0X3ZpZGVvX21ldGEgKG91dGJ1Zik7CisgIGZvciAoaSA9IDA7IGkgPCBncm91cC0+bl9tZW07IGkrKykgeworICAgIEdTVF9MT0dfT0JKRUNUIChwb29sLAorICAgICAgICAiZGVxdWV1ZWQgYnVmZmVyICVwIHNlcTolZCAoaXg9JWQpLCBtZW0gJXAgdXNlZCAlZCwgcGxhbmU9JWQsIGZsYWdzICUwOHgsIHRzICUiCisgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiLCBwb29sLXF1ZXVlZD0lZCwgYnVmZmVyPSVwIiwgb3V0YnVmLAorICAgICAgICBncm91cC0+YnVmZmVyLnNlcXVlbmNlLCBncm91cC0+YnVmZmVyLmluZGV4LCBncm91cC0+bWVtW2ldLAorICAgICAgICBncm91cC0+cGxhbmVzW2ldLmJ5dGVzdXNlZCwgaSwgZ3JvdXAtPmJ1ZmZlci5mbGFncywKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSwgcG9vbC0+bnVtX3F1ZXVlZCwgb3V0YnVmKTsKKworICAgIGlmICh2bWV0YSkgeworICAgICAgdm1ldGEtPm9mZnNldFtpXSA9IHNpemU7CisgICAgICBzaXplICs9IGdzdF9tZW1vcnlfZ2V0X3NpemVzIChncm91cC0+bWVtW2ldLCBOVUxMLCBOVUxMKTsKKyAgICB9CisgIH0KKworICAvKiBJZ25vcmUgdGltZXN0YW1wIGFuZCBmaWVsZCBmb3IgT1VUUFVUIGRldmljZSAqLworICBpZiAoVjRMMl9UWVBFX0lTX09VVFBVVCAob2JqLT50eXBlKSkKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogQ2hlY2sgZm9yIGRyaXZlciBidWcgaW4gcmVwb3J0aW5nIGZlaWxkICovCisgIGlmIChncm91cC0+YnVmZmVyLmZpZWxkID09IFY0TDJfRklFTERfQU5ZKSB7CisgICAgLyogT25seSB3YXJuIG9uY2UgdG8gYXZvaWQgdGhlIHNwYW1taW5nICovCisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworICAgIGlmICghcG9vbC0+aGFzX3dhcm5lZF9vbl9idWdneV9maWVsZCkgeworICAgICAgcG9vbC0+aGFzX3dhcm5lZF9vbl9idWdneV9maWVsZCA9IFRSVUU7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBvb2wsCisgICAgICAgICAgIkRyaXZlciBzaG91bGQgbmV2ZXIgc2V0IHY0bDJfYnVmZmVyLmZpZWxkIHRvIEFOWSIpOworICAgIH0KKyNlbmRpZgorCisgICAgLyogVXNlIHRoZSB2YWx1ZSBmcm9tIHRoZSBmb3JtYXQgKHdvcmtzIGZvciBVVkMgYnVnKSAqLworICAgIGdyb3VwLT5idWZmZXIuZmllbGQgPSBvYmotPmZvcm1hdC5mbXQucGl4LmZpZWxkOworCisgICAgLyogSWYgZHJpdmVyIGFsc28gaGFzIGJ1Z2d5IFNfRk1ULCBhc3N1bWUgcHJvZ3Jlc3NpdmUgKi8KKyAgICBpZiAoZ3JvdXAtPmJ1ZmZlci5maWVsZCA9PSBWNEwyX0ZJRUxEX0FOWSkgeworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgICAgIGlmICghcG9vbC0+aGFzX3dhcm5lZF9vbl9idWdneV9maWVsZCkgeworICAgICAgICBwb29sLT5oYXNfd2FybmVkX29uX2J1Z2d5X2ZpZWxkID0gVFJVRTsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwb29sLAorICAgICAgICAgICAgIkRyaXZlciBzaG91bGQgbmV2ZXIgc2V0IHY0bDJfZm9ybWF0LnBpeC5maWVsZCB0byBBTlkiKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBncm91cC0+YnVmZmVyLmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworICAgIH0KKyAgfQorCisgIC8qIHNldCB0b3AvYm90dG9tIGZpZWxkIGZpcnN0IGlmIHY0bDJfYnVmZmVyIGhhcyB0aGUgaW5mb3JtYXRpb24gKi8KKyAgc3dpdGNoIChncm91cC0+YnVmZmVyLmZpZWxkKSB7CisgICAgY2FzZSBWNEwyX0ZJRUxEX05PTkU6CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfVU5TRVQgKG91dGJ1ZiwgR1NUX1ZJREVPX0JVRkZFUl9GTEFHX0lOVEVSTEFDRUQpOworICAgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChvdXRidWYsIEdTVF9WSURFT19CVUZGRVJfRkxBR19URkYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfVEI6CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9WSURFT19CVUZGRVJfRkxBR19JTlRFUkxBQ0VEKTsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX1ZJREVPX0JVRkZFUl9GTEFHX1RGRik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRF9CVDoKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX1ZJREVPX0JVRkZFUl9GTEFHX0lOVEVSTEFDRUQpOworICAgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChvdXRidWYsIEdTVF9WSURFT19CVUZGRVJfRkxBR19URkYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ6CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9WSURFT19CVUZGRVJfRkxBR19JTlRFUkxBQ0VEKTsKKyAgICAgIGlmIChvYmotPnR2X25vcm0gPT0gVjRMMl9TVERfTlRTQ19NIHx8CisgICAgICAgICAgb2JqLT50dl9ub3JtID09IFY0TDJfU1REX05UU0NfTV9KUCB8fAorICAgICAgICAgIG9iai0+dHZfbm9ybSA9PSBWNEwyX1NURF9OVFNDX01fS1IpIHsKKyAgICAgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChvdXRidWYsIEdTVF9WSURFT19CVUZGRVJfRkxBR19URkYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfVklERU9fQlVGRkVSX0ZMQUdfVEZGKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfVU5TRVQgKG91dGJ1ZiwgR1NUX1ZJREVPX0JVRkZFUl9GTEFHX0lOVEVSTEFDRUQpOworICAgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChvdXRidWYsIEdTVF9WSURFT19CVUZGRVJfRkxBR19URkYpOworICAgICAgR1NUX0ZJWE1FX09CSkVDVCAocG9vbCwKKyAgICAgICAgICAiVW5oYW5kbGVkIGVudW0gdjRsMl9maWVsZCAlZCAtIHRyZWF0aW5nIGFzIHByb2dyZXNzaXZlIiwKKyAgICAgICAgICBncm91cC0+YnVmZmVyLmZpZWxkKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoJm9iai0+aW5mbykgPT0gR1NUX1ZJREVPX0ZPUk1BVF9FTkNPREVEKSB7CisgICAgaWYgKChncm91cC0+YnVmZmVyLmZsYWdzICYgVjRMMl9CVUZfRkxBR19LRVlGUkFNRSkgfHwKKyAgICAgICAgR1NUX1Y0TDJfUElYRUxGT1JNQVQgKG9iaikgPT0gVjRMMl9QSVhfRk1UX01KUEVHIHx8CisgICAgICAgIEdTVF9WNEwyX1BJWEVMRk9STUFUIChvYmopID09IFY0TDJfUElYX0ZNVF9KUEVHIHx8CisgICAgICAgIEdTVF9WNEwyX1BJWEVMRk9STUFUIChvYmopID09IFY0TDJfUElYX0ZNVF9QSlBHKQorICAgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKTsKKyAgICBlbHNlCisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKTsKKyAgfQorCisgIGlmIChncm91cC0+YnVmZmVyLmZsYWdzICYgVjRMMl9CVUZfRkxBR19FUlJPUikKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19DT1JSVVBURUQpOworCisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpID0gdGltZXN0YW1wOworICBHU1RfQlVGRkVSX09GRlNFVCAob3V0YnVmKSA9IGdyb3VwLT5idWZmZXIuc2VxdWVuY2U7CisgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAob3V0YnVmKSA9IGdyb3VwLT5idWZmZXIuc2VxdWVuY2UgKyAxOworCitkb25lOgorICAqYnVmZmVyID0gb3V0YnVmOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworICAvKiBFUlJPUlMgKi8KK3BvbGxfZmFpbGVkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocG9vbCwgInBvbGwgZXJyb3IgJXMiLCBnc3RfZmxvd19nZXRfbmFtZSAocmVzKSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorZW9zOgorICB7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VPUzsKKyAgfQorZHFidWZfZmFpbGVkOgorICB7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Citub19idWZmZXI6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwb29sLCAiTm8gZnJlZSBidWZmZXIgZm91bmQgaW4gdGhlIHBvb2wgYXQgaW5kZXggJWQuIiwKKyAgICAgICAgZ3JvdXAtPmJ1ZmZlci5pbmRleCk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdjRsMl9idWZmZXJfcG9vbF9hY3F1aXJlX2J1ZmZlciAoR3N0QnVmZmVyUG9vbCAqIGJwb29sLCBHc3RCdWZmZXIgKiogYnVmZmVyLAorICAgIEdzdEJ1ZmZlclBvb2xBY3F1aXJlUGFyYW1zICogcGFyYW1zKQoreworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0VjRsMkJ1ZmZlclBvb2wgKnBvb2wgPSBHU1RfVjRMMl9CVUZGRVJfUE9PTCAoYnBvb2wpOworICBHc3RCdWZmZXJQb29sQ2xhc3MgKnBjbGFzcyA9IEdTVF9CVUZGRVJfUE9PTF9DTEFTUyAocGFyZW50X2NsYXNzKTsKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gcG9vbC0+b2JqOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBvb2wsICJhY3F1aXJlIik7CisKKyAgLyogSWYgdGhpcyBpcyBiZWluZyBjYWxsZWQgdG8gcmVzdXJlY3QgYSBsb3N0IGJ1ZmZlciAqLworICBpZiAocGFyYW1zICYmIHBhcmFtcy0+ZmxhZ3MgJiBHU1RfVjRMMl9CVUZGRVJfUE9PTF9BQ1FVSVJFX0ZMQUdfUkVTVVJSRUNUKSB7CisgICAgcmV0ID0gcGNsYXNzLT5hY3F1aXJlX2J1ZmZlciAoYnBvb2wsIGJ1ZmZlciwgcGFyYW1zKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBzd2l0Y2ggKG9iai0+dHlwZSkgeworICAgIGNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorICAgIGNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORToKKyAgICAgIC8qIGNhcHR1cmUsIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhIGJ1ZmZlciB3aXRoIG5ldyBjYXB0dXJlZCBkYXRhICovCisgICAgICBzd2l0Y2ggKG9iai0+bW9kZSkgeworICAgICAgICBjYXNlIEdTVF9WNEwyX0lPX1JXOgorICAgICAgICB7CisgICAgICAgICAgLyogdGFrZSBlbXB0eSBidWZmZXIgZnJvbSB0aGUgcG9vbCAqLworICAgICAgICAgIHJldCA9IHBjbGFzcy0+YWNxdWlyZV9idWZmZXIgKGJwb29sLCBidWZmZXIsIHBhcmFtcyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBHU1RfVjRMMl9JT19ETUFCVUY6CisgICAgICAgIGNhc2UgR1NUX1Y0TDJfSU9fTU1BUDoKKyAgICAgICAgY2FzZSBHU1RfVjRMMl9JT19VU0VSUFRSOgorICAgICAgICBjYXNlIEdTVF9WNEwyX0lPX0RNQUJVRl9JTVBPUlQ6CisgICAgICAgIHsKKyAgICAgICAgICAvKiBqdXN0IGRlcXVldWUgYSBidWZmZXIsIHdlIGJhc2ljYWxseSB1c2UgdGhlIHF1ZXVlIG9mIHY0bDIgYXMgdGhlCisgICAgICAgICAgICogc3RvcmFnZSBmb3Igb3VyIGJ1ZmZlcnMuIFRoaXMgZnVuY3Rpb24gZG9lcyBwb2xsIGZpcnN0IHNvIHdlIGNhbgorICAgICAgICAgICAqIGludGVycnVwdCBpdCBmaW5lLiAqLworICAgICAgICAgIHJldCA9IGdzdF92NGwyX2J1ZmZlcl9wb29sX2RxYnVmIChwb29sLCBidWZmZXIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKworCisgICAgY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDoKKyAgICBjYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORToKKyAgICAgIC8qIHBsYXliYWNrLCBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYW4gZW1wdHkgYnVmZmVyICovCisgICAgICBzd2l0Y2ggKG9iai0+bW9kZSkgeworICAgICAgICBjYXNlIEdTVF9WNEwyX0lPX1JXOgorICAgICAgICAgIC8qIGdldCBhbiBlbXB0eSBidWZmZXIgKi8KKyAgICAgICAgICByZXQgPSBwY2xhc3MtPmFjcXVpcmVfYnVmZmVyIChicG9vbCwgYnVmZmVyLCBwYXJhbXMpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgR1NUX1Y0TDJfSU9fTU1BUDoKKyAgICAgICAgY2FzZSBHU1RfVjRMMl9JT19ETUFCVUY6CisgICAgICAgIGNhc2UgR1NUX1Y0TDJfSU9fVVNFUlBUUjoKKyAgICAgICAgY2FzZSBHU1RfVjRMMl9JT19ETUFCVUZfSU1QT1JUOgorICAgICAgICAgIC8qIGdldCBhIGZyZWUgdW5xdWV1ZWQgYnVmZmVyICovCisgICAgICAgICAgcmV0ID0gcGNsYXNzLT5hY3F1aXJlX2J1ZmZlciAoYnBvb2wsIGJ1ZmZlciwgcGFyYW1zKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICB9Citkb25lOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcmVsZWFzZV9idWZmZXIgKEdzdEJ1ZmZlclBvb2wgKiBicG9vbCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RWNGwyQnVmZmVyUG9vbCAqcG9vbCA9IEdTVF9WNEwyX0JVRkZFUl9QT09MIChicG9vbCk7CisgIEdzdEJ1ZmZlclBvb2xDbGFzcyAqcGNsYXNzID0gR1NUX0JVRkZFUl9QT09MX0NMQVNTIChwYXJlbnRfY2xhc3MpOworICBHc3RWNGwyT2JqZWN0ICpvYmogPSBwb29sLT5vYmo7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocG9vbCwgInJlbGVhc2UgYnVmZmVyICVwIiwgYnVmZmVyKTsKKworICBzd2l0Y2ggKG9iai0+dHlwZSkgeworICAgIGNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorICAgIGNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORToKKyAgICAgIC8qIGNhcHR1cmUsIHB1dCB0aGUgYnVmZmVyIGJhY2sgaW4gdGhlIHF1ZXVlIHNvIHRoYXQgd2UgY2FuIHJlZmlsbCBpdAorICAgICAgICogbGF0ZXIuICovCisgICAgICBzd2l0Y2ggKG9iai0+bW9kZSkgeworICAgICAgICBjYXNlIEdTVF9WNEwyX0lPX1JXOgorICAgICAgICAgIC8qIHJlbGVhc2UgYmFjayBpbiB0aGUgcG9vbCAqLworICAgICAgICAgIHBjbGFzcy0+cmVsZWFzZV9idWZmZXIgKGJwb29sLCBidWZmZXIpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgR1NUX1Y0TDJfSU9fRE1BQlVGOgorICAgICAgICBjYXNlIEdTVF9WNEwyX0lPX01NQVA6CisgICAgICAgIGNhc2UgR1NUX1Y0TDJfSU9fVVNFUlBUUjoKKyAgICAgICAgY2FzZSBHU1RfVjRMMl9JT19ETUFCVUZfSU1QT1JUOgorICAgICAgICB7CisgICAgICAgICAgR3N0VjRsMk1lbW9yeUdyb3VwICpncm91cDsKKyAgICAgICAgICBpZiAoZ3N0X3Y0bDJfaXNfYnVmZmVyX3ZhbGlkIChidWZmZXIsICZncm91cCkpIHsKKyAgICAgICAgICAgIGdzdF92NGwyX2FsbG9jYXRvcl9yZXNldF9ncm91cCAocG9vbC0+dmFsbG9jYXRvciwgZ3JvdXApOworICAgICAgICAgICAgLyogcXVldWUgYmFjayBpbiB0aGUgZGV2aWNlICovCisgICAgICAgICAgICBpZiAocG9vbC0+b3RoZXJfcG9vbCkKKyAgICAgICAgICAgICAgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcHJlcGFyZV9idWZmZXIgKHBvb2wsIGJ1ZmZlciwgTlVMTCk7CisgICAgICAgICAgICBpZiAoZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcWJ1ZiAocG9vbCwgYnVmZmVyKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgICAgcGNsYXNzLT5yZWxlYXNlX2J1ZmZlciAoYnBvb2wsIGJ1ZmZlcik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFNpbXBseSByZWxlYXNlIGludmFsaWRlL21vZGlmaWVkIGJ1ZmZlciwgdGhlIGFsbG9jYXRvciB3aWxsCisgICAgICAgICAgICAgKiBnaXZlIGl0IGJhY2sgbGF0ZXIgKi8KKyAgICAgICAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX1RBR19NRU1PUlkpOworICAgICAgICAgICAgcGNsYXNzLT5yZWxlYXNlX2J1ZmZlciAoYnBvb2wsIGJ1ZmZlcik7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ6CisgICAgY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU6CisgICAgICBzd2l0Y2ggKG9iai0+bW9kZSkgeworICAgICAgICBjYXNlIEdTVF9WNEwyX0lPX1JXOgorICAgICAgICAgIC8qIHJlbGVhc2UgYmFjayBpbiB0aGUgcG9vbCAqLworICAgICAgICAgIHBjbGFzcy0+cmVsZWFzZV9idWZmZXIgKGJwb29sLCBidWZmZXIpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgR1NUX1Y0TDJfSU9fTU1BUDoKKyAgICAgICAgY2FzZSBHU1RfVjRMMl9JT19ETUFCVUY6CisgICAgICAgIGNhc2UgR1NUX1Y0TDJfSU9fVVNFUlBUUjoKKyAgICAgICAgY2FzZSBHU1RfVjRMMl9JT19ETUFCVUZfSU1QT1JUOgorICAgICAgICB7CisgICAgICAgICAgR3N0VjRsMk1lbW9yeUdyb3VwICpncm91cDsKKyAgICAgICAgICBndWludCBpbmRleDsKKworICAgICAgICAgIGlmICghZ3N0X3Y0bDJfaXNfYnVmZmVyX3ZhbGlkIChidWZmZXIsICZncm91cCkpIHsKKyAgICAgICAgICAgIC8qIFNpbXBseSByZWxlYXNlIGludmFsaWRlL21vZGlmaWVkIGJ1ZmZlciwgdGhlIGFsbG9jYXRvciB3aWxsCisgICAgICAgICAgICAgKiBnaXZlIGl0IGJhY2sgbGF0ZXIgKi8KKyAgICAgICAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX1RBR19NRU1PUlkpOworICAgICAgICAgICAgcGNsYXNzLT5yZWxlYXNlX2J1ZmZlciAoYnBvb2wsIGJ1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpbmRleCA9IGdyb3VwLT5idWZmZXIuaW5kZXg7CisKKyAgICAgICAgICBpZiAocG9vbC0+YnVmZmVyc1tpbmRleF0gPT0gTlVMTCkgeworICAgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBvb2wsICJidWZmZXIgJXUgbm90IHF1ZXVlZCwgcHV0dGluZyBvbiBmcmVlIGxpc3QiLAorICAgICAgICAgICAgICAgIGluZGV4KTsKKworICAgICAgICAgICAgLyogUmVtb3ZlIHFkYXRhLCB0aGlzIHdpbGwgdW5tYXAgYW55IG1hcCBkYXRhIGluIHVzZXJwdHIgKi8KKyAgICAgICAgICAgIGdzdF9taW5pX29iamVjdF9zZXRfcWRhdGEgKEdTVF9NSU5JX09CSkVDVCAoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICBHU1RfVjRMMl9JTVBPUlRfUVVBUkssIE5VTEwsIE5VTEwpOworCisgICAgICAgICAgICAvKiByZXNldCB0byBkZWZhdWx0IHNpemUgKi8KKyAgICAgICAgICAgIGdzdF92NGwyX2FsbG9jYXRvcl9yZXNldF9ncm91cCAocG9vbC0+dmFsbG9jYXRvciwgZ3JvdXApOworCisgICAgICAgICAgICAvKiBwbGF5YmFjaywgcHV0IHRoZSBidWZmZXIgYmFjayBpbiB0aGUgcXVldWUgdG8gcmVmaWxsIGxhdGVyLiAqLworICAgICAgICAgICAgcGNsYXNzLT5yZWxlYXNlX2J1ZmZlciAoYnBvb2wsIGJ1ZmZlcik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIHRoZSBidWZmZXIgaXMgcXVldWVkIGluIHRoZSBkZXZpY2UgYnV0IG1heWJlIG5vdCBwbGF5ZWQgeWV0LiBXZSBqdXN0CisgICAgICAgICAgICAgKiBsZWF2ZSBpdCB0aGVyZSBhbmQgbm90IG1ha2UgaXQgYXZhaWxhYmxlIGZvciBmdXR1cmUgY2FsbHMgdG8gYWNxdWlyZQorICAgICAgICAgICAgICogZm9yIG5vdy4gVGhlIGJ1ZmZlciB3aWxsIGJlIGRlcXVldWVkIGFuZCByZXVzZWQgbGF0ZXIuICovCisgICAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocG9vbCwgImJ1ZmZlciAldSBpcyBxdWV1ZWQiLCBpbmRleCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2J1ZmZlcl9wb29sX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFY0bDJCdWZmZXJQb29sICpwb29sID0gR1NUX1Y0TDJfQlVGRkVSX1BPT0wgKG9iamVjdCk7CisKKyAgaWYgKHBvb2wtPnZhbGxvY2F0b3IpCisgICAgZ3N0X29iamVjdF91bnJlZiAocG9vbC0+dmFsbG9jYXRvcik7CisgIHBvb2wtPnZhbGxvY2F0b3IgPSBOVUxMOworCisgIGlmIChwb29sLT5hbGxvY2F0b3IpCisgICAgZ3N0X29iamVjdF91bnJlZiAocG9vbC0+YWxsb2NhdG9yKTsKKyAgcG9vbC0+YWxsb2NhdG9yID0gTlVMTDsKKworICBpZiAocG9vbC0+b3RoZXJfcG9vbCkKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwb29sLT5vdGhlcl9wb29sKTsKKyAgcG9vbC0+b3RoZXJfcG9vbCA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9idWZmZXJfcG9vbF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0VjRsMkJ1ZmZlclBvb2wgKnBvb2wgPSBHU1RfVjRMMl9CVUZGRVJfUE9PTCAob2JqZWN0KTsKKworICBpZiAocG9vbC0+dmlkZW9fZmQgPj0gMCkKKyAgICBwb29sLT5vYmotPmNsb3NlIChwb29sLT52aWRlb19mZCk7CisKKyAgZ3N0X3BvbGxfZnJlZSAocG9vbC0+cG9sbCk7CisKKyAgLyogVGhpcyBjYW4ndCBiZSBkb25lIGluIGRpc3Bvc2UgbWV0aG9kIGJlY2F1c2Ugd2UgbXVzdCBub3Qgc2V0IHBvaW50ZXIKKyAgICogdG8gTlVMTCBhcyBpdCBpcyBwYXJ0IG9mIHRoZSB2NGwyb2JqZWN0IGFuZCBkaXNwb3NlIGNvdWxkIGJlIGNhbGxlZAorICAgKiBtdWx0aXBsZSB0aW1lcyAqLworICBnc3Rfb2JqZWN0X3VucmVmIChwb29sLT5vYmotPmVsZW1lbnQpOworCisgIGdfY29uZF9jbGVhciAoJnBvb2wtPmVtcHR5X2NvbmQpOworCisgIC8qIEZJWE1FIGhhdmUgd2UgZG9uZSBlbm91Z2ggaGVyZSA/ICovCisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfaW5pdCAoR3N0VjRsMkJ1ZmZlclBvb2wgKiBwb29sKQoreworICBwb29sLT5wb2xsID0gZ3N0X3BvbGxfbmV3IChUUlVFKTsKKyAgcG9vbC0+Y2FuX3BvbGxfZGV2aWNlID0gVFJVRTsKKyAgZ19jb25kX2luaXQgKCZwb29sLT5lbXB0eV9jb25kKTsKKyAgcG9vbC0+ZW1wdHkgPSBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfY2xhc3NfaW5pdCAoR3N0VjRsMkJ1ZmZlclBvb2xDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIEdzdEJ1ZmZlclBvb2xDbGFzcyAqYnVmZmVycG9vbF9jbGFzcyA9IEdTVF9CVUZGRVJfUE9PTF9DTEFTUyAoa2xhc3MpOworCisgIG9iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF92NGwyX2J1ZmZlcl9wb29sX2Rpc3Bvc2U7CisgIG9iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9maW5hbGl6ZTsKKworICBidWZmZXJwb29sX2NsYXNzLT5zdGFydCA9IGdzdF92NGwyX2J1ZmZlcl9wb29sX3N0YXJ0OworICBidWZmZXJwb29sX2NsYXNzLT5zdG9wID0gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfc3RvcDsKKyAgYnVmZmVycG9vbF9jbGFzcy0+c2V0X2NvbmZpZyA9IGdzdF92NGwyX2J1ZmZlcl9wb29sX3NldF9jb25maWc7CisgIGJ1ZmZlcnBvb2xfY2xhc3MtPmFsbG9jX2J1ZmZlciA9IGdzdF92NGwyX2J1ZmZlcl9wb29sX2FsbG9jX2J1ZmZlcjsKKyAgYnVmZmVycG9vbF9jbGFzcy0+YWNxdWlyZV9idWZmZXIgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9hY3F1aXJlX2J1ZmZlcjsKKyAgYnVmZmVycG9vbF9jbGFzcy0+cmVsZWFzZV9idWZmZXIgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9yZWxlYXNlX2J1ZmZlcjsKKyAgYnVmZmVycG9vbF9jbGFzcy0+Zmx1c2hfc3RhcnQgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9mbHVzaF9zdGFydDsKKyAgYnVmZmVycG9vbF9jbGFzcy0+Zmx1c2hfc3RvcCA9IGdzdF92NGwyX2J1ZmZlcl9wb29sX2ZsdXNoX3N0b3A7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHY0bDJidWZmZXJwb29sX2RlYnVnLCAidjRsMmJ1ZmZlcnBvb2wiLCAwLAorICAgICAgIlY0TDIgQnVmZmVyIFBvb2wiKTsKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0dFVCAoQ0FUX1BFUkZPUk1BTkNFLCAiR1NUX1BFUkZPUk1BTkNFIik7Cit9CisKKy8qKgorICogZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfbmV3OgorICogQG9iajogIHRoZSB2NGwyIG9iamVjdCBvd25pbmcgdGhlIHBvb2wKKyAqCisgKiBDb25zdHJ1Y3QgYSBuZXcgYnVmZmVyIHBvb2wuCisgKgorICogUmV0dXJuczogdGhlIG5ldyBwb29sLCB1c2UgZ3N0X29iamVjdF91bnJlZigpIHRvIGZyZWUgcmVzb3VyY2VzCisgKi8KK0dzdEJ1ZmZlclBvb2wgKgorZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfbmV3IChHc3RWNGwyT2JqZWN0ICogb2JqLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0VjRsMkJ1ZmZlclBvb2wgKnBvb2w7CisgIEdzdFN0cnVjdHVyZSAqY29uZmlnOworICBnY2hhciAqbmFtZSwgKnBhcmVudF9uYW1lOworICBnaW50IGZkOworCisgIGZkID0gb2JqLT5kdXAgKG9iai0+dmlkZW9fZmQpOworICBpZiAoZmQgPCAwKQorICAgIGdvdG8gZHVwX2ZhaWxlZDsKKworICAvKiBzZXR0aW5nIGEgc2lnbmlmaWNhbnQgdW5pcXVlIG5hbWUgKi8KKyAgcGFyZW50X25hbWUgPSBnc3Rfb2JqZWN0X2dldF9uYW1lIChHU1RfT0JKRUNUIChvYmotPmVsZW1lbnQpKTsKKyAgbmFtZSA9IGdfc3RyY29uY2F0IChwYXJlbnRfbmFtZSwgIjoiLCAicG9vbDoiLAorICAgICAgVjRMMl9UWVBFX0lTX09VVFBVVCAob2JqLT50eXBlKSA/ICJzaW5rIiA6ICJzcmMiLCBOVUxMKTsKKyAgZ19mcmVlIChwYXJlbnRfbmFtZSk7CisKKyAgcG9vbCA9IChHc3RWNGwyQnVmZmVyUG9vbCAqKSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX1Y0TDJfQlVGRkVSX1BPT0wsCisgICAgICAibmFtZSIsIG5hbWUsIE5VTEwpOworICBnX29iamVjdF9yZWZfc2luayAocG9vbCk7CisgIGdfZnJlZSAobmFtZSk7CisKKyAgZ3N0X3BvbGxfZmRfaW5pdCAoJnBvb2wtPnBvbGxmZCk7CisgIHBvb2wtPnBvbGxmZC5mZCA9IGZkOworICBnc3RfcG9sbF9hZGRfZmQgKHBvb2wtPnBvbGwsICZwb29sLT5wb2xsZmQpOworICBpZiAoVjRMMl9UWVBFX0lTX09VVFBVVCAob2JqLT50eXBlKSkKKyAgICBnc3RfcG9sbF9mZF9jdGxfd3JpdGUgKHBvb2wtPnBvbGwsICZwb29sLT5wb2xsZmQsIFRSVUUpOworICBlbHNlCisgICAgZ3N0X3BvbGxfZmRfY3RsX3JlYWQgKHBvb2wtPnBvbGwsICZwb29sLT5wb2xsZmQsIFRSVUUpOworCisgIHBvb2wtPnZpZGVvX2ZkID0gZmQ7CisgIHBvb2wtPm9iaiA9IG9iajsKKyAgcG9vbC0+Y2FuX3BvbGxfZGV2aWNlID0gVFJVRTsKKworICBwb29sLT52YWxsb2NhdG9yID0gZ3N0X3Y0bDJfYWxsb2NhdG9yX25ldyAoR1NUX09CSkVDVCAocG9vbCksIG9iaik7CisgIGlmIChwb29sLT52YWxsb2NhdG9yID09IE5VTEwpCisgICAgZ290byBhbGxvY2F0b3JfZmFpbGVkOworCisgIGdzdF9vYmplY3RfcmVmIChvYmotPmVsZW1lbnQpOworCisgIGNvbmZpZyA9IGdzdF9idWZmZXJfcG9vbF9nZXRfY29uZmlnIChHU1RfQlVGRkVSX1BPT0xfQ0FTVCAocG9vbCkpOworICBnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX3NldF9wYXJhbXMgKGNvbmZpZywgY2Fwcywgb2JqLT5pbmZvLnNpemUsIDAsIDApOworICAvKiBUaGlzIHdpbGwgc2ltcGx5IHNldCBhIGRlZmF1bHQgY29uZmlnLCBidXQgd2lsbCBub3QgY29uZmlndXJlIHRoZSBwb29sCisgICAqIGJlY2F1c2UgbWluIGFuZCBtYXggYXJlIG5vdCB2YWxpZCAqLworICBnc3RfYnVmZmVyX3Bvb2xfc2V0X2NvbmZpZyAoR1NUX0JVRkZFUl9QT09MX0NBU1QgKHBvb2wpLCBjb25maWcpOworCisgIHJldHVybiBHU1RfQlVGRkVSX1BPT0wgKHBvb2wpOworCisgIC8qIEVSUk9SUyAqLworZHVwX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBkdXAgZmQgJWQgKCVzKSIsIGVycm5vLCBnX3N0cmVycm9yIChlcnJubykpOworICAgIHJldHVybiBOVUxMOworICB9CithbGxvY2F0b3JfZmFpbGVkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocG9vbCwgIkZhaWxlZCB0byBjcmVhdGUgVjRMMiBhbGxvY2F0b3IiKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwb29sKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3Y0bDJfZG9fcmVhZCAoR3N0VjRsMkJ1ZmZlclBvb2wgKiBwb29sLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzOworICBHc3RWNGwyT2JqZWN0ICpvYmogPSBwb29sLT5vYmo7CisgIGdpbnQgYW1vdW50OworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2ludCB0b3JlYWQ7CisKKyAgdG9yZWFkID0gb2JqLT5pbmZvLnNpemU7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBvb2wsICJyZWFkaW5nICVkIGJ5dGVzIGludG8gYnVmZmVyICVwIiwgdG9yZWFkLCBidWYpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworCisgIGRvIHsKKyAgICBpZiAoKHJlcyA9IGdzdF92NGwyX2J1ZmZlcl9wb29sX3BvbGwgKHBvb2wpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgIGdvdG8gcG9sbF9lcnJvcjsKKworICAgIGFtb3VudCA9IG9iai0+cmVhZCAob2JqLT52aWRlb19mZCwgbWFwLmRhdGEsIHRvcmVhZCk7CisKKyAgICBpZiAoYW1vdW50ID09IHRvcmVhZCkgeworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIGlmIChhbW91bnQgPT0gLTEpIHsKKyAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRUlOVFIpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UKKyAgICAgICAgZ290byByZWFkX2Vycm9yOworICAgIH0gZWxzZSB7CisgICAgICAvKiBzaG9ydCByZWFkcyBjYW4gaGFwcGVuIGlmIGEgc2lnbmFsIGludGVycnVwdHMgdGhlIHJlYWQgKi8KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgfSB3aGlsZSAoVFJVRSk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBvb2wsICJyZWFkICVkIGJ5dGVzIiwgYW1vdW50KTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl9yZXNpemUgKGJ1ZiwgMCwgYW1vdW50KTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVJST1JTICovCitwb2xsX2Vycm9yOgorICB7CisgICAgR1NUX0RFQlVHICgicG9sbCBlcnJvciAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXMpKTsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KK3JlYWRfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAob2JqLT5lbGVtZW50LCBSRVNPVVJDRSwgUkVBRCwKKyAgICAgICAgKF8oIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iKSwKKyAgICAgICAgICAgIHRvcmVhZCwgb2JqLT52aWRlb2RldiksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJlcyA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorY2xlYW51cDoKKyAgeworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl9yZXNpemUgKGJ1ZiwgMCwgMCk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorfQorCisvKioKKyAqIGdzdF92NGwyX2J1ZmZlcl9wb29sX3Byb2Nlc3M6CisgKiBAYnBvb2w6IGEgI0dzdEJ1ZmZlclBvb2wKKyAqIEBidWY6IGEgI0dzdEJ1ZmZlciwgbWF5YmUgYmUgcmVwbGFjZWQKKyAqCisgKiBQcm9jZXNzIEBidWYgaW4gQGJwb29sLiBGb3IgY2FwdHVyZSBkZXZpY2VzLCB0aGlzIGZ1bmN0aW9ucyBmaWxscyBAYnVmIHdpdGgKKyAqIGRhdGEgZnJvbSB0aGUgZGV2aWNlLiBGb3Igb3V0cHV0IGRldmljZXMsIHRoaXMgZnVuY3Rpb25zIHNlbmQgdGhlIGNvbnRlbnRzIG9mCisgKiBAYnVmIHRvIHRoZSBkZXZpY2UgZm9yIHBsYXliYWNrLgorICoKKyAqIFJldHVybnM6ICVHU1RfRkxPV19PSyBvbiBzdWNjZXNzLgorICovCitHc3RGbG93UmV0dXJuCitnc3RfdjRsMl9idWZmZXJfcG9vbF9wcm9jZXNzIChHc3RWNGwyQnVmZmVyUG9vbCAqIHBvb2wsIEdzdEJ1ZmZlciAqKiBidWYpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdEJ1ZmZlclBvb2wgKmJwb29sID0gR1NUX0JVRkZFUl9QT09MX0NBU1QgKHBvb2wpOworICBHc3RWNGwyT2JqZWN0ICpvYmogPSBwb29sLT5vYmo7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocG9vbCwgInByb2Nlc3MgYnVmZmVyICVwIiwgYnVmKTsKKworICBpZiAoR1NUX0JVRkZFUl9QT09MX0lTX0ZMVVNISU5HIChwb29sKSkKKyAgICByZXR1cm4gR1NUX0ZMT1dfRkxVU0hJTkc7CisKKyAgc3dpdGNoIChvYmotPnR5cGUpIHsKKyAgICBjYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKyAgICBjYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU6CisgICAgICAvKiBjYXB0dXJlICovCisgICAgICBzd2l0Y2ggKG9iai0+bW9kZSkgeworICAgICAgICBjYXNlIEdTVF9WNEwyX0lPX1JXOgorICAgICAgICAgIC8qIGNhcHR1cmUgaW50byB0aGUgYnVmZmVyICovCisgICAgICAgICAgcmV0ID0gZ3N0X3Y0bDJfZG9fcmVhZCAocG9vbCwgKmJ1Zik7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBHU1RfVjRMMl9JT19NTUFQOgorICAgICAgICBjYXNlIEdTVF9WNEwyX0lPX0RNQUJVRjoKKyAgICAgICAgeworICAgICAgICAgIEdzdEJ1ZmZlciAqdG1wOworCisgICAgICAgICAgaWYgKCgqYnVmKS0+cG9vbCA9PSBicG9vbCkgeworICAgICAgICAgICAgZ3VpbnQgbnVtX3F1ZXVlZDsKKyAgICAgICAgICAgIGdzaXplIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplICgqYnVmKTsKKworICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgICBpZiAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoKmJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0NPUlJVUFRFRCkpCisgICAgICAgICAgICAgICAgZ290byBidWZmZXJfY29ycnVwdGVkOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ290byBlb3M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG51bV9xdWV1ZWQgPSBnX2F0b21pY19pbnRfZ2V0ICgmcG9vbC0+bnVtX3F1ZXVlZCk7CisgICAgICAgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChwb29sLCAiT25seSAlaSBidWZmZXIgbGVmdCBpbiB0aGUgY2FwdHVyZSBxdWV1ZS4iLAorICAgICAgICAgICAgICAgIG51bV9xdWV1ZWQpOworCisgICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIG5vIG1vcmUgYnVmZmVyLCBhbmQgY2FuIGFsbG9jYXRlIGl0IHRpbWUgdG8gZG8gc28gKi8KKyAgICAgICAgICAgIGlmIChudW1fcXVldWVkID09IDApIHsKKyAgICAgICAgICAgICAgaWYgKEdTVF9WNEwyX0FMTE9DQVRPUl9DQU5fQUxMT0NBVEUgKHBvb2wtPnZhbGxvY2F0b3IsIE1NQVApKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcmVzdXJlY3RfYnVmZmVyIChwb29sKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IEdTVF9GTE9XX09LKQorICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHN0YXJ0IGNvcHlpbmcgYnVmZmVycyB3aGVuIHdlIGFyZSBydW5uaW5nIGxvdyBvbiBidWZmZXJzICovCisgICAgICAgICAgICBpZiAobnVtX3F1ZXVlZCA8IHBvb2wtPmNvcHlfdGhyZXNob2xkKSB7CisgICAgICAgICAgICAgIEdzdEJ1ZmZlciAqY29weTsKKworICAgICAgICAgICAgICBpZiAoR1NUX1Y0TDJfQUxMT0NBVE9SX0NBTl9BTExPQ0FURSAocG9vbC0+dmFsbG9jYXRvciwgTU1BUCkpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9yZXN1cmVjdF9idWZmZXIgKHBvb2wpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiBjb3B5IHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgY29weSA9IGdzdF9idWZmZXJfY29weV9yZWdpb24gKCpidWYsCisgICAgICAgICAgICAgICAgICBHU1RfQlVGRkVSX0NPUFlfQUxMIHwgR1NUX0JVRkZFUl9DT1BZX0RFRVAsIDAsIC0xKTsKKyAgICAgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBvb2wsICJjb3B5IGJ1ZmZlciAlcC0+JXAiLCAqYnVmLCBjb3B5KTsKKworICAgICAgICAgICAgICAvKiBhbmQgcmVxdWV1ZSBzbyB0aGF0IHdlIGNhbiBjb250aW51ZSBjYXB0dXJpbmcgKi8KKyAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoKmJ1Zik7CisgICAgICAgICAgICAgICpidWYgPSBjb3B5OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICAgICAgICAgIC8qIG5vdGhpbmcsIGRhdGEgd2FzIGluc2lkZSB0aGUgYnVmZmVyIHdoZW4gd2UgZGlkIF9hY3F1aXJlKCkgKi8KKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBidWZmZXIgbm90IGZyb20gb3VyIHBvb2wsIGdyYWIgYSBmcmFtZSBhbmQgY29weSBpdCBpbnRvIHRoZSB0YXJnZXQgKi8KKyAgICAgICAgICBpZiAoKHJldCA9IGdzdF92NGwyX2J1ZmZlcl9wb29sX2RxYnVmIChwb29sLCAmdG1wKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICBnb3RvIGRvbmU7CisKKyAgICAgICAgICAvKiBBbiBlbXB0eSBidWZmZXIgb24gY2FwdHVyZSBpbmRpY2F0ZXMgdGhlIGVuZCBvZiBzdHJlYW0gKi8KKyAgICAgICAgICBpZiAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAodG1wKSA9PSAwKSB7CisgICAgICAgICAgICBnYm9vbGVhbiBjb3JydXB0ZWQgPSBHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUICh0bXAsCisgICAgICAgICAgICAgICAgR1NUX0JVRkZFUl9GTEFHX0NPUlJVUFRFRCk7CisKKyAgICAgICAgICAgIGdzdF92NGwyX2J1ZmZlcl9wb29sX3JlbGVhc2VfYnVmZmVyIChicG9vbCwgdG1wKTsKKworICAgICAgICAgICAgaWYgKGNvcnJ1cHRlZCkKKyAgICAgICAgICAgICAgZ290byBidWZmZXJfY29ycnVwdGVkOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBnb3RvIGVvczsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXQgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9jb3B5X2J1ZmZlciAocG9vbCwgKmJ1ZiwgdG1wKTsKKworICAgICAgICAgIC8qIGFuIHF1ZXVlIHRoZSBidWZmZXIgYWdhaW4gYWZ0ZXIgdGhlIGNvcHkgKi8KKyAgICAgICAgICBnc3RfdjRsMl9idWZmZXJfcG9vbF9yZWxlYXNlX2J1ZmZlciAoYnBvb2wsIHRtcCk7CisKKyAgICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgICAgZ290byBjb3B5X2ZhaWxlZDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgR1NUX1Y0TDJfSU9fVVNFUlBUUjoKKyAgICAgICAgeworICAgICAgICAgIHN0cnVjdCBVc2VyUHRyRGF0YSAqZGF0YTsKKyAgICAgICAgICBHc3RCdWZmZXIgKnRtcDsKKworICAgICAgICAgIC8qIFJlcGxhY2Ugb3VyIGJ1ZmZlciB3aXRoIGRvd25zdHJlYW0gYWxsb2NhdGVkIGJ1ZmZlciAqLworICAgICAgICAgIGRhdGEgPSBnc3RfbWluaV9vYmplY3Rfc3RlYWxfcWRhdGEgKEdTVF9NSU5JX09CSkVDVCAoKmJ1ZiksCisgICAgICAgICAgICAgIEdTVF9WNEwyX0lNUE9SVF9RVUFSSyk7CisgICAgICAgICAgdG1wID0gZ3N0X2J1ZmZlcl9yZWYgKGRhdGEtPmJ1ZmZlcik7CisgICAgICAgICAgX3VubWFwX3VzZXJwdHJfZnJhbWUgKGRhdGEpOworCisgICAgICAgICAgLyogTm93IHRtcCBpcyB3cml0YWJsZSwgY29weSB0aGUgZmxhZ3MgYW5kIHRpbWVzdGFtcCAqLworICAgICAgICAgIGdzdF9idWZmZXJfY29weV9pbnRvICh0bXAsICpidWYsCisgICAgICAgICAgICAgIEdTVF9CVUZGRVJfQ09QWV9GTEFHUyB8IEdTVF9CVUZGRVJfQ09QWV9USU1FU1RBTVBTLCAwLCAtMSk7CisKKyAgICAgICAgICBnc3RfYnVmZmVyX3JlcGxhY2UgKGJ1ZiwgdG1wKTsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmICh0bXApOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHU1RfVjRMMl9JT19ETUFCVUZfSU1QT1JUOgorICAgICAgICB7CisgICAgICAgICAgR3N0QnVmZmVyICp0bXA7CisKKyAgICAgICAgICAvKiBSZXBsYWNlIG91ciBidWZmZXIgd2l0aCBkb3duc3RyZWFtIGFsbG9jYXRlZCBidWZmZXIgKi8KKyAgICAgICAgICB0bXAgPSBnc3RfbWluaV9vYmplY3Rfc3RlYWxfcWRhdGEgKEdTVF9NSU5JX09CSkVDVCAoKmJ1ZiksCisgICAgICAgICAgICAgIEdTVF9WNEwyX0lNUE9SVF9RVUFSSyk7CisKKyAgICAgICAgICBnc3RfYnVmZmVyX2NvcHlfaW50byAodG1wLCAqYnVmLAorICAgICAgICAgICAgICBHU1RfQlVGRkVSX0NPUFlfRkxBR1MgfCBHU1RfQlVGRkVSX0NPUFlfVElNRVNUQU1QUywgMCwgLTEpOworCisgICAgICAgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlIChidWYsIHRtcCk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAodG1wKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ6CisgICAgY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU6CisgICAgICAvKiBwbGF5YmFjayAqLworICAgICAgc3dpdGNoIChvYmotPm1vZGUpIHsKKyAgICAgICAgY2FzZSBHU1RfVjRMMl9JT19SVzoKKyAgICAgICAgICAvKiBGSVhNRSwgZG8gd3JpdGUoKSAqLworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocG9vbCwgImltcGxlbWVudCB3cml0ZSgpIik7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBHU1RfVjRMMl9JT19VU0VSUFRSOgorICAgICAgICBjYXNlIEdTVF9WNEwyX0lPX0RNQUJVRl9JTVBPUlQ6CisgICAgICAgIGNhc2UgR1NUX1Y0TDJfSU9fRE1BQlVGOgorICAgICAgICBjYXNlIEdTVF9WNEwyX0lPX01NQVA6CisgICAgICAgIHsKKyAgICAgICAgICBHc3RCdWZmZXIgKnRvX3F1ZXVlID0gTlVMTDsKKyAgICAgICAgICBHc3RWNGwyTWVtb3J5R3JvdXAgKmdyb3VwOworICAgICAgICAgIGdpbnQgaW5kZXg7CisKKyAgICAgICAgICBpZiAoKCpidWYpLT5wb29sICE9IGJwb29sKQorICAgICAgICAgICAgZ290byBjb3B5aW5nOworCisgICAgICAgICAgaWYgKCFnc3RfdjRsMl9pc19idWZmZXJfdmFsaWQgKCpidWYsICZncm91cCkpCisgICAgICAgICAgICBnb3RvIGNvcHlpbmc7CisKKyAgICAgICAgICBpbmRleCA9IGdyb3VwLT5idWZmZXIuaW5kZXg7CisKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocG9vbCwgInByb2Nlc3NpbmcgYnVmZmVyICVpIGZyb20gb3VyIHBvb2wiLCBpbmRleCk7CisKKyAgICAgICAgICBpZiAocG9vbC0+YnVmZmVyc1tpbmRleF0gIT0gTlVMTCkgeworICAgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBvb2wsICJidWZmZXIgJWkgYWxyZWFkeSBxdWV1ZWQsIGNvcHlpbmciLCBpbmRleCk7CisgICAgICAgICAgICBnb3RvIGNvcHlpbmc7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogd2UgY2FuIHF1ZXVlIGRpcmVjdGx5ICovCisgICAgICAgICAgdG9fcXVldWUgPSBnc3RfYnVmZmVyX3JlZiAoKmJ1Zik7CisKKyAgICAgICAgY29weWluZzoKKyAgICAgICAgICBpZiAodG9fcXVldWUgPT0gTlVMTCkgeworICAgICAgICAgICAgR3N0QnVmZmVyUG9vbEFjcXVpcmVQYXJhbXMgcGFyYW1zID0geyAwIH07CisKKyAgICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwb29sLCAiYWxsb2MgYnVmZmVyIGZyb20gb3VyIHBvb2wiKTsKKworICAgICAgICAgICAgLyogdGhpcyBjYW4gcmV0dXJuIEVPUyBpZiBhbGwgYnVmZmVycyBhcmUgb3V0c3RhbmRpbmcgd2hpY2ggd291bGQKKyAgICAgICAgICAgICAqIGJlIHN0cmFuZ2UgYmVjYXVzZSB3ZSB3b3VsZCBleHBlY3QgdGhlIHVwc3RyZWFtIGVsZW1lbnQgdG8gaGF2ZQorICAgICAgICAgICAgICogYWxsb2NhdGVkIHRoZW0gYW5kIHJldHVybmVkIHRvIHVzLi4gKi8KKyAgICAgICAgICAgIHBhcmFtcy5mbGFncyA9IEdTVF9CVUZGRVJfUE9PTF9BQ1FVSVJFX0ZMQUdfRE9OVFdBSVQ7CisgICAgICAgICAgICByZXQgPSBnc3RfYnVmZmVyX3Bvb2xfYWNxdWlyZV9idWZmZXIgKGJwb29sLCAmdG9fcXVldWUsICZwYXJhbXMpOworICAgICAgICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgICAgZ290byBhY3F1aXJlX2ZhaWxlZDsKKworICAgICAgICAgICAgcmV0ID0gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcHJlcGFyZV9idWZmZXIgKHBvb2wsIHRvX3F1ZXVlLCAqYnVmKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAodG9fcXVldWUpOworICAgICAgICAgICAgICBnb3RvIHByZXBhcmVfZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmICgocmV0ID0gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcWJ1ZiAocG9vbCwgdG9fcXVldWUpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgIGdvdG8gcXVldWVfZmFpbGVkOworCisgICAgICAgICAgLyogaWYgd2UgYXJlIG5vdCBzdHJlYW1pbmcgeWV0ICh0aGlzIGlzIHRoZSBmaXJzdCBidWZmZXIsIHN0YXJ0CisgICAgICAgICAgICogc3RyZWFtaW5nIG5vdyAqLworICAgICAgICAgIGlmICghZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfc3RyZWFtb24gKHBvb2wpKSB7CisgICAgICAgICAgICAvKiBkb24ndCBjaGVjayByZXR1cm4gdmFsdWUgYmVjYXVzZSBxYnVmIHdvdWxkIGhhdmUgZmFpbGVkICovCisgICAgICAgICAgICBnc3RfdjRsMl9pc19idWZmZXJfdmFsaWQgKHRvX3F1ZXVlLCAmZ3JvdXApOworCisgICAgICAgICAgICAvKiBxYnVmIGhhcyBzdG9yZWQgdG9fcXVldWUgYnVmZmVyIGJ1dCB3ZSBhcmUgbm90IGluCisgICAgICAgICAgICAgKiBzdHJlYW1pbmcgc3RhdGUsIHNvIHRoZSBmbHVzaCBsb2dpYyB3b24ndCBiZSBwZXJmb3JtZWQuCisgICAgICAgICAgICAgKiBUbyBhdm9pZCBsZWFrcywgZmx1c2ggdGhlIGFsbG9jYXRvciBhbmQgcmVzdG9yZSB0aGUgcXVldWVkCisgICAgICAgICAgICAgKiBidWZmZXIgYXMgbm9uLXF1ZXVlZCAqLworICAgICAgICAgICAgZ3N0X3Y0bDJfYWxsb2NhdG9yX2ZsdXNoIChwb29sLT52YWxsb2NhdG9yKTsKKworICAgICAgICAgICAgcG9vbC0+YnVmZmVyc1tncm91cC0+YnVmZmVyLmluZGV4XSA9IE5VTEw7CisKKyAgICAgICAgICAgIGdzdF9taW5pX29iamVjdF9zZXRfcWRhdGEgKEdTVF9NSU5JX09CSkVDVCAodG9fcXVldWUpLAorICAgICAgICAgICAgICAgIEdTVF9WNEwyX0lNUE9SVF9RVUFSSywgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmICh0b19xdWV1ZSk7CisgICAgICAgICAgICBnX2F0b21pY19pbnRfYWRkICgmcG9vbC0+bnVtX3F1ZXVlZCwgLTEpOworICAgICAgICAgICAgZ290byBzdGFydF9mYWlsZWQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogUmVtb3ZlIG91ciByZWYsIHdlIHdpbGwgc3RpbGwgaG9sZCB0aGlzIGJ1ZmZlciBpbiBhY3F1aXJlIGFzIG5lZWRlZCwKKyAgICAgICAgICAgKiBvdGhlcndpc2UgdGhlIHBvb2wgd2lsbCB0aGluayBpdCBpcyBvdXRzdGFuZGluZyBhbmQgd2lsbCByZWZ1c2UgdG8gc3RvcC4gKi8KKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmICh0b19xdWV1ZSk7CisKKyAgICAgICAgICBpZiAoZ19hdG9taWNfaW50X2dldCAoJnBvb2wtPm51bV9xdWV1ZWQpID49IHBvb2wtPm1pbl9sYXRlbmN5KSB7CisgICAgICAgICAgICBHc3RCdWZmZXIgKm91dDsKKyAgICAgICAgICAgIC8qIGFsbCBidWZmZXJzIGFyZSBxdWV1ZWQsIHRyeSB0byBkZXF1ZXVlIG9uZSBhbmQgcmVsZWFzZSBpdCBiYWNrCisgICAgICAgICAgICAgKiBpbnRvIHRoZSBwb29sIHNvIHRoYXQgX2FjcXVpcmUgY2FuIGdldCB0byBpdCBhZ2Fpbi4gKi8KKyAgICAgICAgICAgIHJldCA9IGdzdF92NGwyX2J1ZmZlcl9wb29sX2RxYnVmIChwb29sLCAmb3V0KTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgb3V0LT5wb29sID09IE5VTEwpCisgICAgICAgICAgICAgIC8qIHJlbGVhc2UgdGhlIHJlbmRlcmVkIGJ1ZmZlciBiYWNrIGludG8gdGhlIHBvb2wuIFRoaXMgd2FrZXMgdXAgYW55CisgICAgICAgICAgICAgICAqIHRocmVhZCB3YWl0aW5nIGZvciBhIGJ1ZmZlciBpbiBfYWNxdWlyZSgpLiAqLworICAgICAgICAgICAgICBnc3RfdjRsMl9idWZmZXJfcG9vbF9yZWxlYXNlX2J1ZmZlciAoYnBvb2wsIG91dCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICBicmVhazsKKyAgfQorZG9uZToKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK2NvcHlfZmFpbGVkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocG9vbCwgImZhaWxlZCB0byBjb3B5IGJ1ZmZlciIpOworICAgIHJldHVybiByZXQ7CisgIH0KK2J1ZmZlcl9jb3JydXB0ZWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBvb2wsICJEcm9wcGluZyBjb3JydXB0ZWQgYnVmZmVyIHdpdGhvdXQgcGF5bG9hZCIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKCpidWYpOworICAgICpidWYgPSBOVUxMOworICAgIHJldHVybiBHU1RfVjRMMl9GTE9XX0NPUlJVUFRFRF9CVUZGRVI7CisgIH0KK2VvczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBvb2wsICJlbmQgb2Ygc3RyZWFtIHJlYWNoZWQiKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmICgqYnVmKTsKKyAgICAqYnVmID0gTlVMTDsKKyAgICByZXR1cm4gR1NUX1Y0TDJfRkxPV19MQVNUX0JVRkZFUjsKKyAgfQorYWNxdWlyZV9mYWlsZWQ6CisgIHsKKyAgICBpZiAocmV0ID09IEdTVF9GTE9XX0ZMVVNISU5HKQorICAgICAgR1NUX0RFQlVHX09CSkVDVCAocG9vbCwgImZsdXNoaW5nIik7CisgICAgZWxzZQorICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwb29sLCAiZmFpbGVkIHRvIGFjcXVpcmUgYSBidWZmZXI6ICVzIiwKKyAgICAgICAgICBnc3RfZmxvd19nZXRfbmFtZSAocmV0KSk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorcHJlcGFyZV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwb29sLCAiZmFpbGVkIHRvIHByZXBhcmUgZGF0YSIpOworICAgIHJldHVybiByZXQ7CisgIH0KK3F1ZXVlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBvb2wsICJmYWlsZWQgdG8gcXVldWUgYnVmZmVyIik7CisgICAgcmV0dXJuIHJldDsKKyAgfQorc3RhcnRfZmFpbGVkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocG9vbCwgImZhaWxlZCB0byBzdGFydCBzdHJlYW1pbmciKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKwordm9pZAorZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfc2V0X290aGVyX3Bvb2wgKEdzdFY0bDJCdWZmZXJQb29sICogcG9vbCwKKyAgICBHc3RCdWZmZXJQb29sICogb3RoZXJfcG9vbCkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoIWdzdF9idWZmZXJfcG9vbF9pc19hY3RpdmUgKEdTVF9CVUZGRVJfUE9PTCAocG9vbCkpKTsKKworICBpZiAocG9vbC0+b3RoZXJfcG9vbCkKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwb29sLT5vdGhlcl9wb29sKTsKKyAgcG9vbC0+b3RoZXJfcG9vbCA9IGdzdF9vYmplY3RfcmVmIChvdGhlcl9wb29sKTsKK30KKwordm9pZAorZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfY29weV9hdF90aHJlc2hvbGQgKEdzdFY0bDJCdWZmZXJQb29sICogcG9vbCwgZ2Jvb2xlYW4gY29weSkKK3sKKyAgR1NUX09CSkVDVF9MT0NLIChwb29sKTsKKyAgcG9vbC0+ZW5hYmxlX2NvcHlfdGhyZXNob2xkID0gY29weTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHBvb2wpOworfQorCitnYm9vbGVhbgorZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfZmx1c2ggKEdzdEJ1ZmZlclBvb2wgKiBicG9vbCkKK3sKKyAgR3N0VjRsMkJ1ZmZlclBvb2wgKnBvb2wgPSBHU1RfVjRMMl9CVUZGRVJfUE9PTCAoYnBvb2wpOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIGdzdF92NGwyX2J1ZmZlcl9wb29sX3N0cmVhbW9mZiAocG9vbCk7CisKKyAgaWYgKCFWNEwyX1RZUEVfSVNfT1VUUFVUIChwb29sLT5vYmotPnR5cGUpKQorICAgIHJldCA9IGdzdF92NGwyX2J1ZmZlcl9wb29sX3N0cmVhbW9uIChwb29sKTsKKworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaCBiL3N5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmZmM3MQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqICAgICAgICAgICAgICAgMjAwNiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICogICAgICAgICAgICAgICAyMDA5IFRleGFzIEluc3RydW1lbnRzLCBJbmMgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBnc3R2NGwyYnVmZmVycG9vbC5oIFY0TDIgYnVmZmVyIHBvb2wgY2xhc3MKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1Y0TDJfQlVGRkVSX1BPT0xfSF9fCisjZGVmaW5lIF9fR1NUX1Y0TDJfQlVGRkVSX1BPT0xfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyQnVmZmVyUG9vbCBHc3RWNGwyQnVmZmVyUG9vbDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyQnVmZmVyUG9vbENsYXNzIEdzdFY0bDJCdWZmZXJQb29sQ2xhc3M7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMk1ldGEgR3N0VjRsMk1ldGE7CisKKyNpbmNsdWRlICJnc3R2NGwyb2JqZWN0LmgiCisjaW5jbHVkZSAiZ3N0djRsMmFsbG9jYXRvci5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfVjRMMl9CVUZGRVJfUE9PTCAgICAgIChnc3RfdjRsMl9idWZmZXJfcG9vbF9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfSVNfVjRMMl9CVUZGRVJfUE9PTChvYmopICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfVjRMMl9CVUZGRVJfUE9PTCkpCisjZGVmaW5lIEdTVF9WNEwyX0JVRkZFUl9QT09MKG9iaikgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBHU1RfVFlQRV9WNEwyX0JVRkZFUl9QT09MLCBHc3RWNGwyQnVmZmVyUG9vbCkpCisjZGVmaW5lIEdTVF9WNEwyX0JVRkZFUl9QT09MX0NBU1Qob2JqKSAoKEdzdFY0bDJCdWZmZXJQb29sKikob2JqKSkKKworLyogVGhpcyBmbG93IHJldHVybiBpcyB1c2VkIHRvIGluZGljYXRlZCB0aGF0IHRoZSBsYXN0IGJ1ZmZlciBvZiBhCisgKiBkcmFpbiBvciBhIHJlc29sdHVpb24gY2hhbmdlIGhhcyBiZWVuIGZvdW5kLiBUaGlzIHNob3VsZCBub3JtYWxseQorICogb25seSBvY2N1cmUgZm9yIG1lbS0yLW1lbSBkZXZpY2VzLiAqLworI2RlZmluZSBHU1RfVjRMMl9GTE9XX0xBU1RfQlVGRkVSIEdTVF9GTE9XX0NVU1RPTV9TVUNDRVNTCisKKy8qIFRoaXMgZmxvdyByZXR1cm4gaXMgdXNlZCB0byBpbmRpY2F0ZWQgdGhhdCB0aGUgcmV0dXJuZWQgYnVmZmVyIHdhcyBtYXJrZWQKKyAqIHdpdGggdGhlIGVycm9yIGZsYWcgYW5kIGhhZCBubyBwYXlsb2FkLiBUaGlzIGVycm9yIHNob3VsZCBiZSByZWNvdmVyZWQgYnkKKyAqIHNpbXBseSB3YWl0aW5nIGZvciBuZXh0IGJ1ZmZlci4gKi8KKyNkZWZpbmUgR1NUX1Y0TDJfRkxPV19DT1JSVVBURURfQlVGRkVSIEdTVF9GTE9XX0NVU1RPTV9TVUNDRVNTXzEKKworc3RydWN0IF9Hc3RWNGwyQnVmZmVyUG9vbAoreworICBHc3RCdWZmZXJQb29sIHBhcmVudDsKKworICBHc3RWNGwyT2JqZWN0ICpvYmo7ICAgICAgICAvKiB0aGUgdjRsMiBvYmplY3QgKi8KKyAgZ2ludCB2aWRlb19mZDsgICAgICAgICAgICAgLyogYSBkdXAoMikgb2YgdGhlIHY0bDJvYmplY3QncyB2aWRlb19mZCAqLworICBHc3RQb2xsICpwb2xsOyAgICAgICAgICAgICAvKiBhIHBvbGwgZm9yIHZpZGVvX2ZkICovCisgIEdzdFBvbGxGRCBwb2xsZmQ7CisgIGdib29sZWFuIGNhbl9wb2xsX2RldmljZTsKKworICBnYm9vbGVhbiBlbXB0eTsKKyAgR0NvbmQgZW1wdHlfY29uZDsKKworICBHc3RWNGwyQWxsb2NhdG9yICp2YWxsb2NhdG9yOworICBHc3RBbGxvY2F0b3IgKmFsbG9jYXRvcjsKKyAgR3N0QWxsb2NhdGlvblBhcmFtcyBwYXJhbXM7CisgIEdzdEJ1ZmZlclBvb2wgKm90aGVyX3Bvb2w7CisgIGd1aW50IHNpemU7CisgIEdzdFZpZGVvSW5mbyBjYXBzX2luZm87ICAgLyogRGVmYXVsdCB2aWRlbyBpbmZvcm1hdGlvbiAqLworCisgIGdib29sZWFuIGFkZF92aWRlb21ldGE7ICAgIC8qIHNldCBpZiB2aWRlbyBtZXRhIHNob3VsZCBiZSBhZGRlZCAqLworICBnYm9vbGVhbiBlbmFibGVfY29weV90aHJlc2hvbGQ7IC8qIElmIGNvcHlfdGhyZXNob2xkIHNob3VsZCBiZSBzZXQgKi8KKworICBndWludCBtaW5fbGF0ZW5jeTsgICAgICAgICAvKiBudW1iZXIgb2YgYnVmZmVycyB3ZSB3aWxsIGhvbGQgKi8KKyAgZ3VpbnQgbWF4X2xhdGVuY3k7ICAgICAgICAgLyogbnVtYmVyIG9mIGJ1ZmZlcnMgd2UgY2FuIGhvbGQgKi8KKyAgZ3VpbnQgbnVtX3F1ZXVlZDsgICAgICAgICAgLyogbnVtYmVyIG9mIGJ1ZmZlcnMgcXVldWVkIGluIHRoZSBkcml2ZXIgKi8KKyAgZ3VpbnQgY29weV90aHJlc2hvbGQ7ICAgICAgLyogd2hlbiBvdXIgcG9vbCBydW5zIGxvd2VyLCBzdGFydCBoYW5kaW5nIG91dCBjb3BpZXMgKi8KKworICBnYm9vbGVhbiBzdHJlYW1pbmc7CisgIGdib29sZWFuIGZsdXNoaW5nOworCisgIEdzdEJ1ZmZlciAqYnVmZmVyc1tWSURFT19NQVhfRlJBTUVdOworCisgIC8qIHNpZ25hbCBoYW5kbGVycyAqLworICBndWxvbmcgZ3JvdXBfcmVsZWFzZWRfaGFuZGxlcjsKKworICAvKiBDb250cm9sIHRvIHdhcm4gb25seSBvbmNlIG9uIGJ1Z2d5IGZlaWxkIGRyaXZlciBidWcgKi8KKyAgZ2Jvb2xlYW4gaGFzX3dhcm5lZF9vbl9idWdneV9maWVsZDsKK307CisKK3N0cnVjdCBfR3N0VjRsMkJ1ZmZlclBvb2xDbGFzcworeworICBHc3RCdWZmZXJQb29sQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfZ2V0X3R5cGUgKHZvaWQpOworCitHc3RCdWZmZXJQb29sICogICAgIGdzdF92NGwyX2J1ZmZlcl9wb29sX25ldyAgICAgKEdzdFY0bDJPYmplY3QgKm9iaiwgR3N0Q2FwcyAqY2Fwcyk7CisKK0dzdEZsb3dSZXR1cm4gICAgICAgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcHJvY2VzcyAoR3N0VjRsMkJ1ZmZlclBvb2wgKiBicG9vbCwgR3N0QnVmZmVyICoqIGJ1Zik7CisKK3ZvaWQgICAgICAgICAgICAgICAgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfc2V0X290aGVyX3Bvb2wgKEdzdFY0bDJCdWZmZXJQb29sICogcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdEJ1ZmZlclBvb2wgKiBvdGhlcl9wb29sKTsKK3ZvaWQgICAgICAgICAgICAgICAgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfY29weV9hdF90aHJlc2hvbGQgKEdzdFY0bDJCdWZmZXJQb29sICogcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdib29sZWFuIGNvcHkpOworCitnYm9vbGVhbiAgICAgICAgICAgIGdzdF92NGwyX2J1ZmZlcl9wb29sX2ZsdXNoICAgKEdzdEJ1ZmZlclBvb2wgKnBvb2wpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLypfX0dTVF9WNEwyX0JVRkZFUl9QT09MX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMmNvbG9yYmFsYW5jZS5jIGIvc3lzL3Y0bDIvZ3N0djRsMmNvbG9yYmFsYW5jZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YzZiYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAgICAgICAgICAgICAgIDIwMDYgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4KKyAqCisgKiBnc3R2NGwyY29sb3JiYWxhbmNlLmM6IGNvbG9yIGJhbGFuY2UgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBWNEwyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgImdzdHY0bDJjb2xvcmJhbGFuY2UuaCIKKyNpbmNsdWRlICJnc3R2NGwyb2JqZWN0LmgiCisKKyNkZWZpbmUgZ3N0X3Y0bDJfY29sb3JfYmFsYW5jZV9jaGFubmVsX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFY0bDJDb2xvckJhbGFuY2VDaGFubmVsLAorICAgIGdzdF92NGwyX2NvbG9yX2JhbGFuY2VfY2hhbm5lbCwgR1NUX1RZUEVfQ09MT1JfQkFMQU5DRV9DSEFOTkVMKTsKKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2NvbG9yX2JhbGFuY2VfY2hhbm5lbF9jbGFzc19pbml0IChHc3RWNGwyQ29sb3JCYWxhbmNlQ2hhbm5lbENsYXNzICoKKyAgICBrbGFzcykKK3sKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2NvbG9yX2JhbGFuY2VfY2hhbm5lbF9pbml0IChHc3RWNGwyQ29sb3JCYWxhbmNlQ2hhbm5lbCAqIGNoYW5uZWwpCit7CisgIGNoYW5uZWwtPmlkID0gKGd1aW50MzIpIC0gMTsKK30KKworc3RhdGljIEdfR05VQ19VTlVTRUQgZ2Jvb2xlYW4KK2dzdF92NGwyX2NvbG9yX2JhbGFuY2VfY29udGFpbnNfY2hhbm5lbCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgR3N0VjRsMkNvbG9yQmFsYW5jZUNoYW5uZWwgKiB2NGwyY2hhbm5lbCkKK3sKKyAgY29uc3QgR0xpc3QgKml0ZW07CisKKyAgZm9yIChpdGVtID0gdjRsMm9iamVjdC0+Y29sb3JzOyBpdGVtICE9IE5VTEw7IGl0ZW0gPSBpdGVtLT5uZXh0KQorICAgIGlmIChpdGVtLT5kYXRhID09IHY0bDJjaGFubmVsKQorICAgICAgcmV0dXJuIFRSVUU7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitjb25zdCBHTGlzdCAqCitnc3RfdjRsMl9jb2xvcl9iYWxhbmNlX2xpc3RfY2hhbm5lbHMgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KQoreworICByZXR1cm4gdjRsMm9iamVjdC0+Y29sb3JzOworfQorCit2b2lkCitnc3RfdjRsMl9jb2xvcl9iYWxhbmNlX3NldF92YWx1ZSAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgR3N0Q29sb3JCYWxhbmNlQ2hhbm5lbCAqIGNoYW5uZWwsIGdpbnQgdmFsdWUpCit7CisKKyAgR3N0VjRsMkNvbG9yQmFsYW5jZUNoYW5uZWwgKnY0bDJjaGFubmVsID0KKyAgICAgIEdTVF9WNEwyX0NPTE9SX0JBTEFOQ0VfQ0hBTk5FTCAoY2hhbm5lbCk7CisKKyAgLyogYXNzZXJ0IHRoYXQgd2UncmUgb3BlbmVkIGFuZCB0aGF0IHdlJ3JlIHVzaW5nIGEga25vd24gaXRlbSAqLworICBnX3JldHVybl9pZl9mYWlsIChHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKGdzdF92NGwyX2NvbG9yX2JhbGFuY2VfY29udGFpbnNfY2hhbm5lbCAodjRsMm9iamVjdCwKKyAgICAgICAgICB2NGwyY2hhbm5lbCkpOworCisgIGdzdF92NGwyX3NldF9hdHRyaWJ1dGUgKHY0bDJvYmplY3QsIHY0bDJjaGFubmVsLT5pZCwgdmFsdWUpOworfQorCitnaW50Citnc3RfdjRsMl9jb2xvcl9iYWxhbmNlX2dldF92YWx1ZSAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgR3N0Q29sb3JCYWxhbmNlQ2hhbm5lbCAqIGNoYW5uZWwpCit7CisgIEdzdFY0bDJDb2xvckJhbGFuY2VDaGFubmVsICp2NGwyY2hhbm5lbCA9CisgICAgICBHU1RfVjRMMl9DT0xPUl9CQUxBTkNFX0NIQU5ORUwgKGNoYW5uZWwpOworICBnaW50IHZhbHVlOworCisgIC8qIGFzc2VydCB0aGF0IHdlJ3JlIG9wZW5lZCBhbmQgdGhhdCB3ZSdyZSB1c2luZyBhIGtub3duIGl0ZW0gKi8KKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpLCAwKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGdzdF92NGwyX2NvbG9yX2JhbGFuY2VfY29udGFpbnNfY2hhbm5lbCAodjRsMm9iamVjdCwKKyAgICAgICAgICB2NGwyY2hhbm5lbCksIDApOworCisgIGlmICghZ3N0X3Y0bDJfZ2V0X2F0dHJpYnV0ZSAodjRsMm9iamVjdCwgdjRsMmNoYW5uZWwtPmlkLCAmdmFsdWUpKQorICAgIHJldHVybiAwOworCisgIHJldHVybiB2YWx1ZTsKK30KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuaCBiL3N5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGJhN2FiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMmNvbG9yYmFsYW5jZS5oCkBAIC0wLDAgKzEsMTExIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogICAgICAgICAgICAgICAyMDA2IEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+CisgKgorICogZ3N0djRsMmNvbG9yYmFsYW5jZS5oOiBjb2xvciBiYWxhbmNlIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgVjRMMgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfVjRMMl9DT0xPUl9CQUxBTkNFX0hfXworI2RlZmluZSBfX0dTVF9WNEwyX0NPTE9SX0JBTEFOQ0VfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2NvbG9yYmFsYW5jZS5oPgorCisjaW5jbHVkZSAiZ3N0djRsMm9iamVjdC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfVjRMMl9DT0xPUl9CQUxBTkNFX0NIQU5ORUwgXAorICAoZ3N0X3Y0bDJfY29sb3JfYmFsYW5jZV9jaGFubmVsX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfVjRMMl9DT0xPUl9CQUxBTkNFX0NIQU5ORUwob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX1Y0TDJfQ09MT1JfQkFMQU5DRV9DSEFOTkVMLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VjRsMkNvbG9yQmFsYW5jZUNoYW5uZWwpKQorI2RlZmluZSBHU1RfVjRMMl9DT0xPUl9CQUxBTkNFX0NIQU5ORUxfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9WNEwyX0NPTE9SX0JBTEFOQ0VfQ0hBTk5FTCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFY0bDJDb2xvckJhbGFuY2VDaGFubmVsQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVjRMMl9DT0xPUl9CQUxBTkNFX0NIQU5ORUwob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX1Y0TDJfQ09MT1JfQkFMQU5DRV9DSEFOTkVMKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJfQ09MT1JfQkFMQU5DRV9DSEFOTkVMX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgR1NUX1RZUEVfVjRMMl9DT0xPUl9CQUxBTkNFX0NIQU5ORUwpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMkNvbG9yQmFsYW5jZUNoYW5uZWwgeworICBHc3RDb2xvckJhbGFuY2VDaGFubmVsIHBhcmVudDsKKworICBndWludDMyIGlkOworfSBHc3RWNGwyQ29sb3JCYWxhbmNlQ2hhbm5lbDsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJDb2xvckJhbGFuY2VDaGFubmVsQ2xhc3MgeworICBHc3RDb2xvckJhbGFuY2VDaGFubmVsQ2xhc3MgcGFyZW50OworfSBHc3RWNGwyQ29sb3JCYWxhbmNlQ2hhbm5lbENsYXNzOworCitHVHlwZSBnc3RfdjRsMl9jb2xvcl9iYWxhbmNlX2NoYW5uZWxfZ2V0X3R5cGUgICAodm9pZCk7CisKK2NvbnN0IEdMaXN0ICogICBnc3RfdjRsMl9jb2xvcl9iYWxhbmNlX2xpc3RfY2hhbm5lbHMgICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KTsKKwordm9pZCAgICAgICAgICAgIGdzdF92NGwyX2NvbG9yX2JhbGFuY2Vfc2V0X3ZhbHVlICAgICAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RDb2xvckJhbGFuY2VDaGFubmVsICogY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgdmFsdWUpOworCitnaW50ICAgICAgICAgICAgZ3N0X3Y0bDJfY29sb3JfYmFsYW5jZV9nZXRfdmFsdWUgICAgICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdENvbG9yQmFsYW5jZUNoYW5uZWwgKiBjaGFubmVsKTsKKworI2RlZmluZSBHU1RfSU1QTEVNRU5UX1Y0TDJfQ09MT1JfQkFMQU5DRV9NRVRIT0RTKFR5cGUsIGludGVyZmFjZV9hc19mdW5jdGlvbikgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBjb25zdCBHTGlzdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF9jb2xvcl9iYWxhbmNlX2xpc3RfY2hhbm5lbHMgKEdzdENvbG9yQmFsYW5jZSAqIGJhbGFuY2UpICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVHlwZSAqdGhpcyA9IChUeXBlKikgYmFsYW5jZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gZ3N0X3Y0bDJfY29sb3JfYmFsYW5jZV9saXN0X2NoYW5uZWxzKHRoaXMtPnY0bDJvYmplY3QpOyAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX2NvbG9yX2JhbGFuY2Vfc2V0X3ZhbHVlIChHc3RDb2xvckJhbGFuY2UgKiBiYWxhbmNlLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdENvbG9yQmFsYW5jZUNoYW5uZWwgKiBjaGFubmVsLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCB2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVHlwZSAqdGhpcyA9IChUeXBlKikgYmFsYW5jZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnc3RfdjRsMl9jb2xvcl9iYWxhbmNlX3NldF92YWx1ZSh0aGlzLT52NGwyb2JqZWN0LCBjaGFubmVsLCB2YWx1ZSk7ICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgZ2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfY29sb3JfYmFsYW5jZV9nZXRfdmFsdWUgKEdzdENvbG9yQmFsYW5jZSAqIGJhbGFuY2UsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0Q29sb3JCYWxhbmNlQ2hhbm5lbCAqIGNoYW5uZWwpICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVHlwZSAqdGhpcyA9IChUeXBlKikgYmFsYW5jZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gZ3N0X3Y0bDJfY29sb3JfYmFsYW5jZV9nZXRfdmFsdWUodGhpcy0+djRsMm9iamVjdCwgY2hhbm5lbCk7ICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIEdzdENvbG9yQmFsYW5jZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX2NvbG9yX2JhbGFuY2VfZ2V0X2JhbGFuY2VfdHlwZSAoR3N0Q29sb3JCYWxhbmNlICogYmFsYW5jZSkgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gR1NUX0NPTE9SX0JBTEFOQ0VfSEFSRFdBUkU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX2NvbG9yX2JhbGFuY2VfaW50ZXJmYWNlX2luaXQgKEdzdENvbG9yQmFsYW5jZUludGVyZmFjZSAqIGlmYWNlKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogZGVmYXVsdCB2aXJ0dWFsIGZ1bmN0aW9ucyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZmFjZS0+bGlzdF9jaGFubmVscyA9IGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfY29sb3JfYmFsYW5jZV9saXN0X2NoYW5uZWxzOyAgICAgICBcCisgIGlmYWNlLT5zZXRfdmFsdWUgPSBpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX2NvbG9yX2JhbGFuY2Vfc2V0X3ZhbHVlOyAgICAgICAgICAgICAgIFwKKyAgaWZhY2UtPmdldF92YWx1ZSA9IGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfY29sb3JfYmFsYW5jZV9nZXRfdmFsdWU7ICAgICAgICAgICAgICAgXAorICBpZmFjZS0+Z2V0X2JhbGFuY2VfdHlwZSA9IGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfY29sb3JfYmFsYW5jZV9nZXRfYmFsYW5jZV90eXBlOyBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9WNEwyX0NPTE9SX0JBTEFOQ0VfSF9fICovCmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwyZGV2aWNlcHJvdmlkZXIuYyBiL3N5cy92NGwyL2dzdHY0bDJkZXZpY2Vwcm92aWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNmU5ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwyZGV2aWNlcHJvdmlkZXIuYwpAQCAtMCwwICsxLDYwMSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorICoKKyAqIGdzdHY0bDJkZXZpY2Vwcm92aWRlci5jOiBWNGwyIGRldmljZSBwcm9iaW5nIGFuZCBtb25pdG9yaW5nCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0djRsMmRldmljZXByb3ZpZGVyLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisjaW5jbHVkZSAiZ3N0djRsMm9iamVjdC5oIgorI2luY2x1ZGUgInY0bDItdXRpbHMuaCIKKworI2lmZGVmIEhBVkVfR1VERVYKKyNpbmNsdWRlIDxndWRldi9ndWRldi5oPgorI2VuZGlmCisKK3N0YXRpYyBHc3RWNGwyRGV2aWNlICpnc3RfdjRsMl9kZXZpY2VfbmV3IChjb25zdCBnY2hhciAqIGRldmljZV9wYXRoLAorICAgIGNvbnN0IGdjaGFyICogZGV2aWNlX25hbWUsIEdzdENhcHMgKiBjYXBzLCBHc3RWNGwyRGV2aWNlVHlwZSB0eXBlLAorICAgIEdzdFN0cnVjdHVyZSAqIHByb3BzKTsKKworCitHX0RFRklORV9UWVBFIChHc3RWNGwyRGV2aWNlUHJvdmlkZXIsIGdzdF92NGwyX2RldmljZV9wcm92aWRlciwKKyAgICBHU1RfVFlQRV9ERVZJQ0VfUFJPVklERVIpOworCitzdGF0aWMgdm9pZCBnc3RfdjRsMl9kZXZpY2VfcHJvdmlkZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIEdMaXN0ICpnc3RfdjRsMl9kZXZpY2VfcHJvdmlkZXJfcHJvYmUgKEdzdERldmljZVByb3ZpZGVyICogcHJvdmlkZXIpOworCisjaWZkZWYgSEFWRV9HVURFVgorc3RhdGljIGdib29sZWFuIGdzdF92NGwyX2RldmljZV9wcm92aWRlcl9zdGFydCAoR3N0RGV2aWNlUHJvdmlkZXIgKiBwcm92aWRlcik7CitzdGF0aWMgdm9pZCBnc3RfdjRsMl9kZXZpY2VfcHJvdmlkZXJfc3RvcCAoR3N0RGV2aWNlUHJvdmlkZXIgKiBwcm92aWRlcik7CisjZW5kaWYKKworCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfZGV2aWNlX3Byb3ZpZGVyX2NsYXNzX2luaXQgKEdzdFY0bDJEZXZpY2VQcm92aWRlckNsYXNzICoga2xhc3MpCit7CisgIEdzdERldmljZVByb3ZpZGVyQ2xhc3MgKmRtX2NsYXNzID0gR1NUX0RFVklDRV9QUk9WSURFUl9DTEFTUyAoa2xhc3MpOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworCisgIGRtX2NsYXNzLT5wcm9iZSA9IGdzdF92NGwyX2RldmljZV9wcm92aWRlcl9wcm9iZTsKKworI2lmZGVmIEhBVkVfR1VERVYKKyAgZG1fY2xhc3MtPnN0YXJ0ID0gZ3N0X3Y0bDJfZGV2aWNlX3Byb3ZpZGVyX3N0YXJ0OworICBkbV9jbGFzcy0+c3RvcCA9IGdzdF92NGwyX2RldmljZV9wcm92aWRlcl9zdG9wOworI2VuZGlmCisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfdjRsMl9kZXZpY2VfcHJvdmlkZXJfZmluYWxpemU7CisKKyAgZ3N0X2RldmljZV9wcm92aWRlcl9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChkbV9jbGFzcywKKyAgICAgICJWaWRlbyAodmlkZW80bGludXgyKSBEZXZpY2UgUHJvdmlkZXIiLCAiU291cmNlL1NpbmsvVmlkZW8iLAorICAgICAgIkxpc3QgYW5kIG1vbml0b3IgdmlkZW80bGludXgyIHNvdXJjZSBhbmQgc2luayBkZXZpY2VzIiwKKyAgICAgICJPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9kZXZpY2VfcHJvdmlkZXJfaW5pdCAoR3N0VjRsMkRldmljZVByb3ZpZGVyICogcHJvdmlkZXIpCit7CisjaWZkZWYgSEFWRV9HVURFVgorICBnX2NvbmRfaW5pdCAoJnByb3ZpZGVyLT5zdGFydGVkX2NvbmQpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9kZXZpY2VfcHJvdmlkZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisjaWZkZWYgSEFWRV9HVURFVgorICBHc3RWNGwyRGV2aWNlUHJvdmlkZXIgKnByb3ZpZGVyID0gR1NUX1Y0TDJfREVWSUNFX1BST1ZJREVSIChvYmplY3QpOworCisgIGdfY29uZF9jbGVhciAoJnByb3ZpZGVyLT5zdGFydGVkX2NvbmQpOworI2VuZGlmCisKKyAgR19PQkpFQ1RfQ0xBU1MgKGdzdF92NGwyX2RldmljZV9wcm92aWRlcl9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIEdzdFY0bDJEZXZpY2UgKgorZ3N0X3Y0bDJfZGV2aWNlX3Byb3ZpZGVyX3Byb2JlX2RldmljZSAoR3N0VjRsMkRldmljZVByb3ZpZGVyICogcHJvdmlkZXIsCisgICAgY29uc3QgZ2NoYXIgKiBkZXZpY2VfcGF0aCwgY29uc3QgZ2NoYXIgKiBkZXZpY2VfbmFtZSwgR3N0U3RydWN0dXJlICogcHJvcHMpCit7CisgIEdzdFY0bDJPYmplY3QgKnY0bDJvYmogPSBOVUxMOworICBHc3RDYXBzICpjYXBzOworICBHc3RWNGwyRGV2aWNlICpkZXZpY2UgPSBOVUxMOworICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgR3N0VjRsMkRldmljZVR5cGUgdHlwZSA9IEdTVF9WNEwyX0RFVklDRV9UWVBFX0lOVkFMSUQ7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHByb3BzICE9IE5VTEwsIE5VTEwpOworCisgIGlmIChzdGF0IChkZXZpY2VfcGF0aCwgJnN0KSA9PSAtMSkKKyAgICBnb3RvIGRlc3Ryb3k7CisKKyAgaWYgKCFTX0lTQ0hSIChzdC5zdF9tb2RlKSkKKyAgICBnb3RvIGRlc3Ryb3k7CisKKyAgdjRsMm9iaiA9IGdzdF92NGwyX29iamVjdF9uZXcgKE5VTEwsIEdTVF9PQkpFQ1QgKHByb3ZpZGVyKSwKKyAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwgZGV2aWNlX3BhdGgsIE5VTEwsIE5VTEwsIE5VTEwpOworCisgIGlmICghZ3N0X3Y0bDJfb3BlbiAodjRsMm9iaikpCisgICAgZ290byBkZXN0cm95OworCisgIGdzdF9zdHJ1Y3R1cmVfc2V0IChwcm9wcywgImRldmljZS5hcGkiLCBHX1RZUEVfU1RSSU5HLCAidjRsMiIsIE5VTEwpOworICBnc3Rfc3RydWN0dXJlX3NldCAocHJvcHMsICJkZXZpY2UucGF0aCIsIEdfVFlQRV9TVFJJTkcsIGRldmljZV9wYXRoLCBOVUxMKTsKKworICBnc3Rfc3RydWN0dXJlX3NldCAocHJvcHMsICJ2NGwyLmRldmljZS5kcml2ZXIiLCBHX1RZUEVfU1RSSU5HLAorICAgICAgdjRsMm9iai0+dmNhcC5kcml2ZXIsIE5VTEwpOworICBnc3Rfc3RydWN0dXJlX3NldCAocHJvcHMsICJ2NGwyLmRldmljZS5jYXJkIiwgR19UWVBFX1NUUklORywKKyAgICAgIHY0bDJvYmotPnZjYXAuY2FyZCwgTlVMTCk7CisgIGdzdF9zdHJ1Y3R1cmVfc2V0IChwcm9wcywgInY0bDIuZGV2aWNlLmJ1c19pbmZvIiwgR19UWVBFX1NUUklORywKKyAgICAgIHY0bDJvYmotPnZjYXAuYnVzX2luZm8sIE5VTEwpOworICBnc3Rfc3RydWN0dXJlX3NldCAocHJvcHMsICJ2NGwyLmRldmljZS52ZXJzaW9uIiwgR19UWVBFX1VJTlQsCisgICAgICB2NGwyb2JqLT52Y2FwLnZlcnNpb24sIE5VTEwpOworICBnc3Rfc3RydWN0dXJlX3NldCAocHJvcHMsICJ2NGwyLmRldmljZS5jYXBhYmlsaXRpZXMiLCBHX1RZUEVfVUlOVCwKKyAgICAgIHY0bDJvYmotPnZjYXAuY2FwYWJpbGl0aWVzLCBOVUxMKTsKKyAgZ3N0X3N0cnVjdHVyZV9zZXQgKHByb3BzLCAidjRsMi5kZXZpY2UuZGV2aWNlX2NhcHMiLCBHX1RZUEVfVUlOVCwKKyAgICAgIHY0bDJvYmotPnZjYXAuZGV2aWNlX2NhcHMsIE5VTEwpOworCisgIGlmICh2NGwyb2JqLT5kZXZpY2VfY2FwcyAmCisgICAgICAoVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSkgeworICAgIC8qIFdlIGlnbm9yZSB0b3VjaCBzZW5zaW5nIGRldmljZXM7IHRob3NlIGFyZSd0IHJlYWxseSB2aWRlbyAqLworICAgIGlmICh2NGwyb2JqLT5kZXZpY2VfY2FwcyAmIFY0TDJfQ0FQX1RPVUNIKQorICAgICAgZ290byBjbG9zZTsKKworICAgIHR5cGUgPSBHU1RfVjRMMl9ERVZJQ0VfVFlQRV9TT1VSQ0U7CisgICAgdjRsMm9iai0+c2tpcF90cnlfZm10X3Byb2JlcyA9IFRSVUU7CisgIH0KKworICBpZiAodjRsMm9iai0+ZGV2aWNlX2NhcHMgJgorICAgICAgKFY0TDJfQ0FQX1ZJREVPX09VVFBVVCB8IFY0TDJfQ0FQX1ZJREVPX09VVFBVVF9NUExBTkUpKSB7CisgICAgLyogV2UgaWdub3JlIE0yTSBkZXZpY2VzIHRoYXQgYXJlIGJvdGggY2FwdHVyZSBhbmQgb3V0cHV0IGZvciBub3cKKyAgICAgKiBUaGUgcHJvdmlkZXIgaXMgbm90IGZvciB0aGVtICovCisgICAgaWYgKHR5cGUgIT0gR1NUX1Y0TDJfREVWSUNFX1RZUEVfSU5WQUxJRCkKKyAgICAgIGdvdG8gY2xvc2U7CisKKyAgICB0eXBlID0gR1NUX1Y0TDJfREVWSUNFX1RZUEVfU0lOSzsKKworICAgIC8qIFdlIGhhdmUgb3BlbmVkIGFzIGEgY2FwdHVyZSBhcyB3ZSBkaWRuJ3Qga25vdywgbm93IHRoYXQga25vdywKKyAgICAgKiBsZXQncyBmaXhlZCBpdCAqLworICAgIGlmICh2NGwyb2JqLT5kZXZpY2VfY2FwcyAmIFY0TDJfQ0FQX1ZJREVPX09VVFBVVF9NUExBTkUpCisgICAgICB2NGwyb2JqLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOworICAgIGVsc2UKKyAgICAgIHY0bDJvYmotPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDsKKyAgfQorCisgIGlmICh0eXBlID09IEdTVF9WNEwyX0RFVklDRV9UWVBFX0lOVkFMSUQpCisgICAgZ290byBjbG9zZTsKKworICBjYXBzID0gZ3N0X3Y0bDJfb2JqZWN0X2dldF9jYXBzICh2NGwyb2JqLCBOVUxMKTsKKworICBpZiAoY2FwcyA9PSBOVUxMKQorICAgIGdvdG8gY2xvc2U7CisgIGlmIChnc3RfY2Fwc19pc19lbXB0eSAoY2FwcykpIHsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgZ290byBjbG9zZTsKKyAgfQorCisgIGRldmljZSA9IGdzdF92NGwyX2RldmljZV9uZXcgKGRldmljZV9wYXRoLAorICAgICAgZGV2aWNlX25hbWUgPyBkZXZpY2VfbmFtZSA6IChnY2hhciAqKSB2NGwyb2JqLT52Y2FwLmNhcmQsIGNhcHMsIHR5cGUsCisgICAgICBwcm9wcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworY2xvc2U6CisKKyAgZ3N0X3Y0bDJfY2xvc2UgKHY0bDJvYmopOworCitkZXN0cm95OgorCisgIGlmICh2NGwyb2JqKQorICAgIGdzdF92NGwyX29iamVjdF9kZXN0cm95ICh2NGwyb2JqKTsKKworICBpZiAocHJvcHMpCisgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChwcm9wcyk7CisKKyAgcmV0dXJuIGRldmljZTsKK30KKworCitzdGF0aWMgR0xpc3QgKgorZ3N0X3Y0bDJfZGV2aWNlX3Byb3ZpZGVyX3Byb2JlIChHc3REZXZpY2VQcm92aWRlciAqIHByb3ZpZGVyKQoreworICBHc3RWNGwyRGV2aWNlUHJvdmlkZXIgKnNlbGYgPSBHU1RfVjRMMl9ERVZJQ0VfUFJPVklERVIgKHByb3ZpZGVyKTsKKyAgR3N0VjRsMkl0ZXJhdG9yICppdDsKKyAgR0xpc3QgKmRldmljZXMgPSBOVUxMOworCisgIGl0ID0gZ3N0X3Y0bDJfaXRlcmF0b3JfbmV3ICgpOworCisgIHdoaWxlIChnc3RfdjRsMl9pdGVyYXRvcl9uZXh0IChpdCkpIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnByb3BzOworICAgIEdzdFY0bDJEZXZpY2UgKmRldmljZTsKKworICAgIHByb3BzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJ2NGwyLXByb3BsaXN0IiwgImRldmljZS5wYXRoIiwgR19UWVBFX1NUUklORywKKyAgICAgICAgaXQtPmRldmljZV9wYXRoLCAidWRldi1wcm9iZWQiLCBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworICAgIGRldmljZSA9IGdzdF92NGwyX2RldmljZV9wcm92aWRlcl9wcm9iZV9kZXZpY2UgKHNlbGYsIGl0LT5kZXZpY2VfcGF0aCwgTlVMTCwKKyAgICAgICAgcHJvcHMpOworCisgICAgaWYgKGRldmljZSkgeworICAgICAgZ3N0X29iamVjdF9yZWZfc2luayAoZGV2aWNlKTsKKyAgICAgIGRldmljZXMgPSBnX2xpc3RfcHJlcGVuZCAoZGV2aWNlcywgZGV2aWNlKTsKKyAgICB9CisgIH0KKworICBnc3RfdjRsMl9pdGVyYXRvcl9mcmVlIChpdCk7CisKKyAgcmV0dXJuIGRldmljZXM7Cit9CisKKyNpZmRlZiBIQVZFX0dVREVWCisKK3N0YXRpYyBHc3REZXZpY2UgKgorZ3N0X3Y0bDJfZGV2aWNlX3Byb3ZpZGVyX2RldmljZV9mcm9tX3VkZXYgKEdzdFY0bDJEZXZpY2VQcm92aWRlciAqIHByb3ZpZGVyLAorICAgIEdVZGV2RGV2aWNlICogdWRldl9kZXZpY2UpCit7CisgIEdzdFY0bDJEZXZpY2UgKmdzdGRldjsKKyAgY29uc3QgZ2NoYXIgKmRldmljZV9wYXRoID0gZ191ZGV2X2RldmljZV9nZXRfZGV2aWNlX2ZpbGUgKHVkZXZfZGV2aWNlKTsKKyAgY29uc3QgZ2NoYXIgKmRldmljZV9uYW1lLCAqc3RyOworICBHc3RTdHJ1Y3R1cmUgKnByb3BzOworCisgIHByb3BzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJ2NGwyZGV2aWNlcHJvdmlkZXIiLCAidWRldi1wcm9iZWQiLAorICAgICAgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworCisgIHN0ciA9IGdfdWRldl9kZXZpY2VfZ2V0X3Byb3BlcnR5ICh1ZGV2X2RldmljZSwgIklEX1BBVEgiKTsKKyAgaWYgKCEoc3RyICYmICpzdHIpKSB7CisgICAgc3RyID0gZ191ZGV2X2RldmljZV9nZXRfc3lzZnNfcGF0aCAodWRldl9kZXZpY2UpOworICB9CisgIGlmIChzdHIgJiYgKnN0cikKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocHJvcHMsICJkZXZpY2UuYnVzX3BhdGgiLCBHX1RZUEVfU1RSSU5HLCBzdHIsIE5VTEwpOworCisgIGlmICgoc3RyID0gZ191ZGV2X2RldmljZV9nZXRfc3lzZnNfcGF0aCAodWRldl9kZXZpY2UpKSAmJiAqc3RyKQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChwcm9wcywgInN5c2ZzLnBhdGgiLCBHX1RZUEVfU1RSSU5HLCBzdHIsIE5VTEwpOworCisgIGlmICgoc3RyID0gZ191ZGV2X2RldmljZV9nZXRfcHJvcGVydHkgKHVkZXZfZGV2aWNlLCAiSURfSUQiKSkgJiYgKnN0cikKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocHJvcHMsICJ1ZGV2LmlkIiwgR19UWVBFX1NUUklORywgc3RyLCBOVUxMKTsKKworICBpZiAoKHN0ciA9IGdfdWRldl9kZXZpY2VfZ2V0X3Byb3BlcnR5ICh1ZGV2X2RldmljZSwgIklEX0JVUyIpKSAmJiAqc3RyKQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChwcm9wcywgImRldmljZS5idXMiLCBHX1RZUEVfU1RSSU5HLCBzdHIsIE5VTEwpOworCisgIGlmICgoc3RyID0gZ191ZGV2X2RldmljZV9nZXRfcHJvcGVydHkgKHVkZXZfZGV2aWNlLCAiU1VCU1lTVEVNIikpICYmICpzdHIpCisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHByb3BzLCAiZGV2aWNlLnN1YnN5c3RlbSIsIEdfVFlQRV9TVFJJTkcsIHN0ciwgTlVMTCk7CisKKyAgaWYgKChzdHIgPSBnX3VkZXZfZGV2aWNlX2dldF9wcm9wZXJ0eSAodWRldl9kZXZpY2UsICJJRF9WRU5ET1JfSUQiKSkgJiYgKnN0cikKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocHJvcHMsICJkZXZpY2UudmVuZG9yLmlkIiwgR19UWVBFX1NUUklORywgc3RyLCBOVUxMKTsKKworICBzdHIgPSBnX3VkZXZfZGV2aWNlX2dldF9wcm9wZXJ0eSAodWRldl9kZXZpY2UsICJJRF9WRU5ET1JfRlJPTV9EQVRBQkFTRSIpOworICBpZiAoIShzdHIgJiYgKnN0cikpIHsKKyAgICBzdHIgPSBnX3VkZXZfZGV2aWNlX2dldF9wcm9wZXJ0eSAodWRldl9kZXZpY2UsICJJRF9WRU5ET1JfRU5DIik7CisgICAgaWYgKCEoc3RyICYmICpzdHIpKSB7CisgICAgICBzdHIgPSBnX3VkZXZfZGV2aWNlX2dldF9wcm9wZXJ0eSAodWRldl9kZXZpY2UsICJJRF9WRU5ET1IiKTsKKyAgICB9CisgIH0KKyAgaWYgKHN0ciAmJiAqc3RyKQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChwcm9wcywgImRldmljZS52ZW5kb3IubmFtZSIsIEdfVFlQRV9TVFJJTkcsIHN0ciwgTlVMTCk7CisKKyAgaWYgKChzdHIgPSBnX3VkZXZfZGV2aWNlX2dldF9wcm9wZXJ0eSAodWRldl9kZXZpY2UsICJJRF9NT0RFTF9JRCIpKSAmJiAqc3RyKQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChwcm9wcywgImRldmljZS5wcm9kdWN0LmlkIiwgR19UWVBFX1NUUklORywgc3RyLCBOVUxMKTsKKworICBkZXZpY2VfbmFtZSA9IGdfdWRldl9kZXZpY2VfZ2V0X3Byb3BlcnR5ICh1ZGV2X2RldmljZSwgIklEX1Y0TF9QUk9EVUNUIik7CisgIGlmICghKGRldmljZV9uYW1lICYmICpkZXZpY2VfbmFtZSkpIHsKKyAgICBkZXZpY2VfbmFtZSA9CisgICAgICAgIGdfdWRldl9kZXZpY2VfZ2V0X3Byb3BlcnR5ICh1ZGV2X2RldmljZSwgIklEX01PREVMX0ZST01fREFUQUJBU0UiKTsKKyAgICBpZiAoIShkZXZpY2VfbmFtZSAmJiAqZGV2aWNlX25hbWUpKSB7CisgICAgICBkZXZpY2VfbmFtZSA9IGdfdWRldl9kZXZpY2VfZ2V0X3Byb3BlcnR5ICh1ZGV2X2RldmljZSwgIklEX01PREVMX0VOQyIpOworICAgICAgaWYgKCEoZGV2aWNlX25hbWUgJiYgKmRldmljZV9uYW1lKSkgeworICAgICAgICBkZXZpY2VfbmFtZSA9IGdfdWRldl9kZXZpY2VfZ2V0X3Byb3BlcnR5ICh1ZGV2X2RldmljZSwgIklEX01PREVMIik7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChkZXZpY2VfbmFtZSAmJiAqZGV2aWNlX25hbWUpCisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHByb3BzLCAiZGV2aWNlLnByb2R1Y3QubmFtZSIsIEdfVFlQRV9TVFJJTkcsIGRldmljZV9uYW1lLAorICAgICAgICBOVUxMKTsKKworICBpZiAoKHN0ciA9IGdfdWRldl9kZXZpY2VfZ2V0X3Byb3BlcnR5ICh1ZGV2X2RldmljZSwgIklEX1NFUklBTCIpKSAmJiAqc3RyKQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChwcm9wcywgImRldmljZS5zZXJpYWwiLCBHX1RZUEVfU1RSSU5HLCBzdHIsIE5VTEwpOworCisgIGlmICgoc3RyID0gZ191ZGV2X2RldmljZV9nZXRfcHJvcGVydHkgKHVkZXZfZGV2aWNlLCAiSURfVjRMX0NBUEFCSUxJVElFUyIpKQorICAgICAgJiYgKnN0cikKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocHJvcHMsICJkZXZpY2UuY2FwYWJpbGl0aWVzIiwgR19UWVBFX1NUUklORywgc3RyLCBOVUxMKTsKKworICBnc3RkZXYgPSBnc3RfdjRsMl9kZXZpY2VfcHJvdmlkZXJfcHJvYmVfZGV2aWNlIChwcm92aWRlciwgZGV2aWNlX3BhdGgsCisgICAgICBkZXZpY2VfbmFtZSwgcHJvcHMpOworCisgIGlmIChnc3RkZXYpCisgICAgZ3N0ZGV2LT5zeXNwYXRoID0gZ19zdHJkdXAgKGdfdWRldl9kZXZpY2VfZ2V0X3N5c2ZzX3BhdGggKHVkZXZfZGV2aWNlKSk7CisKKyAgcmV0dXJuIEdTVF9ERVZJQ0UgKGdzdGRldik7Cit9CisKK3N0YXRpYyB2b2lkCit1ZXZlbnRfY2IgKEdVZGV2Q2xpZW50ICogY2xpZW50LCBjb25zdCBnY2hhciAqIGFjdGlvbiwgR1VkZXZEZXZpY2UgKiBkZXZpY2UsCisgICAgR3N0VjRsMkRldmljZVByb3ZpZGVyICogc2VsZikKK3sKKyAgR3N0RGV2aWNlUHJvdmlkZXIgKnByb3ZpZGVyID0gR1NUX0RFVklDRV9QUk9WSURFUiAoc2VsZik7CisKKyAgLyogTm90IFY0TDIsIGlnbm9yaW5nICovCisgIGlmIChnX3VkZXZfZGV2aWNlX2dldF9wcm9wZXJ0eV9hc19pbnQgKGRldmljZSwgIklEX1Y0TF9WRVJTSU9OIikgIT0gMikKKyAgICByZXR1cm47CisKKyAgaWYgKCFzdHJjbXAgKGFjdGlvbiwgImFkZCIpKSB7CisgICAgR3N0RGV2aWNlICpnc3RkZXYgPSBOVUxMOworCisgICAgZ3N0ZGV2ID0gZ3N0X3Y0bDJfZGV2aWNlX3Byb3ZpZGVyX2RldmljZV9mcm9tX3VkZXYgKHNlbGYsIGRldmljZSk7CisKKyAgICBpZiAoZ3N0ZGV2KQorICAgICAgZ3N0X2RldmljZV9wcm92aWRlcl9kZXZpY2VfYWRkIChwcm92aWRlciwgZ3N0ZGV2KTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChhY3Rpb24sICJyZW1vdmUiKSkgeworICAgIEdzdFY0bDJEZXZpY2UgKmdzdGRldiA9IE5VTEw7CisgICAgR0xpc3QgKml0ZW07CisKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKHNlbGYpOworICAgIGZvciAoaXRlbSA9IHByb3ZpZGVyLT5kZXZpY2VzOyBpdGVtOyBpdGVtID0gaXRlbS0+bmV4dCkgeworICAgICAgZ3N0ZGV2ID0gaXRlbS0+ZGF0YTsKKworICAgICAgaWYgKCFzdHJjbXAgKGdzdGRldi0+c3lzcGF0aCwgZ191ZGV2X2RldmljZV9nZXRfc3lzZnNfcGF0aCAoZGV2aWNlKSkpIHsKKyAgICAgICAgZ3N0X29iamVjdF9yZWYgKGdzdGRldik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBnc3RkZXYgPSBOVUxMOworICAgIH0KKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAocHJvdmlkZXIpOworCisgICAgaWYgKGdzdGRldikgeworICAgICAgZ3N0X2RldmljZV9wcm92aWRlcl9kZXZpY2VfcmVtb3ZlIChwcm92aWRlciwgR1NUX0RFVklDRSAoZ3N0ZGV2KSk7CisgICAgICBnX29iamVjdF91bnJlZiAoZ3N0ZGV2KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkcgKCJVbmhhbmRsZWQgYWN0aW9uICVzIiwgYWN0aW9uKTsKKyAgfQorfQorCitzdGF0aWMgZ3BvaW50ZXIKK3Byb3ZpZGVyX3RocmVhZCAoZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR3N0VjRsMkRldmljZVByb3ZpZGVyICpwcm92aWRlciA9IGRhdGE7CisgIEdNYWluQ29udGV4dCAqY29udGV4dCA9IE5VTEw7CisgIEdNYWluTG9vcCAqbG9vcCA9IE5VTEw7CisgIEdVZGV2Q2xpZW50ICpjbGllbnQ7CisgIEdMaXN0ICpkZXZpY2VzOworICBzdGF0aWMgY29uc3QgZ2NoYXIgKnN1YnN5c3RlbXNbXSA9IHsgInZpZGVvNGxpbnV4IiwgTlVMTCB9OworCisgIEdTVF9PQkpFQ1RfTE9DSyAocHJvdmlkZXIpOworICBpZiAocHJvdmlkZXItPmNvbnRleHQpCisgICAgY29udGV4dCA9IGdfbWFpbl9jb250ZXh0X3JlZiAocHJvdmlkZXItPmNvbnRleHQpOworICBpZiAocHJvdmlkZXItPmxvb3ApCisgICAgbG9vcCA9IGdfbWFpbl9sb29wX3JlZiAocHJvdmlkZXItPmxvb3ApOworCisgIGlmIChjb250ZXh0ID09IE5VTEwgfHwgbG9vcCA9PSBOVUxMKSB7CisgICAgcHJvdmlkZXItPnN0YXJ0ZWQgPSBUUlVFOworICAgIGdfY29uZF9icm9hZGNhc3QgKCZwcm92aWRlci0+c3RhcnRlZF9jb25kKTsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAocHJvdmlkZXIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChwcm92aWRlcik7CisKKyAgZ19tYWluX2NvbnRleHRfcHVzaF90aHJlYWRfZGVmYXVsdCAoY29udGV4dCk7CisKKyAgY2xpZW50ID0gZ191ZGV2X2NsaWVudF9uZXcgKHN1YnN5c3RlbXMpOworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGNsaWVudCwgInVldmVudCIsIEdfQ0FMTEJBQ0sgKHVldmVudF9jYiksIHByb3ZpZGVyKTsKKworICBkZXZpY2VzID0gZ191ZGV2X2NsaWVudF9xdWVyeV9ieV9zdWJzeXN0ZW0gKGNsaWVudCwgInZpZGVvNGxpbnV4Iik7CisKKyAgd2hpbGUgKGRldmljZXMpIHsKKyAgICBHVWRldkRldmljZSAqdWRldl9kZXZpY2UgPSBkZXZpY2VzLT5kYXRhOworICAgIEdzdERldmljZSAqZ3N0ZGV2OworCisgICAgZGV2aWNlcyA9IGdfbGlzdF9yZW1vdmUgKGRldmljZXMsIHVkZXZfZGV2aWNlKTsKKworICAgIGlmIChnX3VkZXZfZGV2aWNlX2dldF9wcm9wZXJ0eV9hc19pbnQgKHVkZXZfZGV2aWNlLCAiSURfVjRMX1ZFUlNJT04iKSA9PSAyKSB7CisgICAgICBnc3RkZXYgPQorICAgICAgICAgIGdzdF92NGwyX2RldmljZV9wcm92aWRlcl9kZXZpY2VfZnJvbV91ZGV2IChwcm92aWRlciwgdWRldl9kZXZpY2UpOworICAgICAgaWYgKGdzdGRldikKKyAgICAgICAgZ3N0X2RldmljZV9wcm92aWRlcl9kZXZpY2VfYWRkIChHU1RfREVWSUNFX1BST1ZJREVSIChwcm92aWRlciksIGdzdGRldik7CisgICAgfQorCisgICAgZ19vYmplY3RfdW5yZWYgKHVkZXZfZGV2aWNlKTsKKyAgfQorCisgIEdTVF9PQkpFQ1RfTE9DSyAocHJvdmlkZXIpOworICBwcm92aWRlci0+c3RhcnRlZCA9IFRSVUU7CisgIGdfY29uZF9icm9hZGNhc3QgKCZwcm92aWRlci0+c3RhcnRlZF9jb25kKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHByb3ZpZGVyKTsKKworICBnX21haW5fbG9vcF9ydW4gKGxvb3ApOworICBnX21haW5fbG9vcF91bnJlZiAobG9vcCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgIGdfbWFpbl9jb250ZXh0X3VucmVmIChjb250ZXh0KTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChwcm92aWRlcik7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfZGV2aWNlX3Byb3ZpZGVyX3N0YXJ0IChHc3REZXZpY2VQcm92aWRlciAqIHByb3ZpZGVyKQoreworICBHc3RWNGwyRGV2aWNlUHJvdmlkZXIgKnNlbGYgPSBHU1RfVjRMMl9ERVZJQ0VfUFJPVklERVIgKHByb3ZpZGVyKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHNlbGYpOworICBnX2Fzc2VydCAoc2VsZi0+Y29udGV4dCA9PSBOVUxMKTsKKworICBzZWxmLT5jb250ZXh0ID0gZ19tYWluX2NvbnRleHRfbmV3ICgpOworICBzZWxmLT5sb29wID0gZ19tYWluX2xvb3BfbmV3IChzZWxmLT5jb250ZXh0LCBGQUxTRSk7CisKKyAgc2VsZi0+dGhyZWFkID0gZ190aHJlYWRfbmV3ICgidjRsMi1kZXZpY2UtcHJvdmlkZXIiLCBwcm92aWRlcl90aHJlYWQsCisgICAgICBnX29iamVjdF9yZWYgKHNlbGYpKTsKKworICB3aGlsZSAoc2VsZi0+c3RhcnRlZCA9PSBGQUxTRSkKKyAgICBnX2NvbmRfd2FpdCAoJnNlbGYtPnN0YXJ0ZWRfY29uZCwgR1NUX09CSkVDVF9HRVRfTE9DSyAoc2VsZikpOworCisgIEdTVF9PQkpFQ1RfVU5MT0NLIChzZWxmKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2RldmljZV9wcm92aWRlcl9zdG9wIChHc3REZXZpY2VQcm92aWRlciAqIHByb3ZpZGVyKQoreworICBHc3RWNGwyRGV2aWNlUHJvdmlkZXIgKnNlbGYgPSBHU1RfVjRMMl9ERVZJQ0VfUFJPVklERVIgKHByb3ZpZGVyKTsKKyAgR01haW5Db250ZXh0ICpjb250ZXh0OworICBHTWFpbkxvb3AgKmxvb3A7CisgIEdTb3VyY2UgKmlkbGVfc3RvcF9zb3VyY2U7CisKKyAgR1NUX09CSkVDVF9MT0NLIChzZWxmKTsKKyAgY29udGV4dCA9IHNlbGYtPmNvbnRleHQ7CisgIGxvb3AgPSBzZWxmLT5sb29wOworICBzZWxmLT5jb250ZXh0ID0gTlVMTDsKKyAgc2VsZi0+bG9vcCA9IE5VTEw7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChzZWxmKTsKKworICBpZiAoIWNvbnRleHQgfHwgIWxvb3ApCisgICAgcmV0dXJuOworCisgIGlkbGVfc3RvcF9zb3VyY2UgPSBnX2lkbGVfc291cmNlX25ldyAoKTsKKyAgZ19zb3VyY2Vfc2V0X2NhbGxiYWNrIChpZGxlX3N0b3Bfc291cmNlLCAoR1NvdXJjZUZ1bmMpIGdfbWFpbl9sb29wX3F1aXQsIGxvb3AsCisgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdfbWFpbl9sb29wX3VucmVmKTsKKyAgZ19zb3VyY2VfYXR0YWNoIChpZGxlX3N0b3Bfc291cmNlLCBjb250ZXh0KTsKKyAgZ19zb3VyY2VfdW5yZWYgKGlkbGVfc3RvcF9zb3VyY2UpOworICBnX21haW5fY29udGV4dF91bnJlZiAoY29udGV4dCk7CisKKyAgZ190aHJlYWRfam9pbiAoc2VsZi0+dGhyZWFkKTsKKyAgc2VsZi0+dGhyZWFkID0gTlVMTDsKKyAgc2VsZi0+c3RhcnRlZCA9IEZBTFNFOworfQorCisjZW5kaWYKKworZW51bQoreworICBQUk9QX0RFVklDRV9QQVRIID0gMSwKK307CisKK0dfREVGSU5FX1RZUEUgKEdzdFY0bDJEZXZpY2UsIGdzdF92NGwyX2RldmljZSwgR1NUX1RZUEVfREVWSUNFKTsKKworc3RhdGljIHZvaWQgZ3N0X3Y0bDJfZGV2aWNlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF92NGwyX2RldmljZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfdjRsMl9kZXZpY2VfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIEdzdEVsZW1lbnQgKmdzdF92NGwyX2RldmljZV9jcmVhdGVfZWxlbWVudCAoR3N0RGV2aWNlICogZGV2aWNlLAorICAgIGNvbnN0IGdjaGFyICogbmFtZSk7CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9kZXZpY2VfY2xhc3NfaW5pdCAoR3N0VjRsMkRldmljZUNsYXNzICoga2xhc3MpCit7CisgIEdzdERldmljZUNsYXNzICpkZXZfY2xhc3MgPSBHU1RfREVWSUNFX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBkZXZfY2xhc3MtPmNyZWF0ZV9lbGVtZW50ID0gZ3N0X3Y0bDJfZGV2aWNlX2NyZWF0ZV9lbGVtZW50OworCisgIG9iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3Y0bDJfZGV2aWNlX2dldF9wcm9wZXJ0eTsKKyAgb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdjRsMl9kZXZpY2Vfc2V0X3Byb3BlcnR5OworICBvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3Y0bDJfZGV2aWNlX2ZpbmFsaXplOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKG9iamVjdF9jbGFzcywgUFJPUF9ERVZJQ0VfUEFUSCwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJkZXZpY2UtcGF0aCIsICJEZXZpY2UgUGF0aCIsCisgICAgICAgICAgIlRoZSBQYXRoIG9mIHRoZSBkZXZpY2Ugbm9kZSIsICIiLAorICAgICAgICAgIEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2RldmljZV9pbml0IChHc3RWNGwyRGV2aWNlICogZGV2aWNlKQoreworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfZGV2aWNlX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RWNGwyRGV2aWNlICpkZXZpY2UgPSBHU1RfVjRMMl9ERVZJQ0UgKG9iamVjdCk7CisKKyAgZ19mcmVlIChkZXZpY2UtPmRldmljZV9wYXRoKTsKKyAgZ19mcmVlIChkZXZpY2UtPnN5c3BhdGgpOworCisgIEdfT0JKRUNUX0NMQVNTIChnc3RfdjRsMl9kZXZpY2VfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK2dzdF92NGwyX2RldmljZV9jcmVhdGVfZWxlbWVudCAoR3N0RGV2aWNlICogZGV2aWNlLCBjb25zdCBnY2hhciAqIG5hbWUpCit7CisgIEdzdFY0bDJEZXZpY2UgKnY0bDJfZGV2ID0gR1NUX1Y0TDJfREVWSUNFIChkZXZpY2UpOworICBHc3RFbGVtZW50ICplbGVtOworCisgIGVsZW0gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKHY0bDJfZGV2LT5lbGVtZW50LCBuYW1lKTsKKyAgZ19vYmplY3Rfc2V0IChlbGVtLCAiZGV2aWNlIiwgdjRsMl9kZXYtPmRldmljZV9wYXRoLCBOVUxMKTsKKworICByZXR1cm4gZWxlbTsKK30KKworc3RhdGljIEdzdFY0bDJEZXZpY2UgKgorZ3N0X3Y0bDJfZGV2aWNlX25ldyAoY29uc3QgZ2NoYXIgKiBkZXZpY2VfcGF0aCwgY29uc3QgZ2NoYXIgKiBkZXZpY2VfbmFtZSwKKyAgICBHc3RDYXBzICogY2FwcywgR3N0VjRsMkRldmljZVR5cGUgdHlwZSwgR3N0U3RydWN0dXJlICogcHJvcHMpCit7CisgIEdzdFY0bDJEZXZpY2UgKmdzdGRldjsKKyAgY29uc3QgZ2NoYXIgKmVsZW1lbnQgPSBOVUxMOworICBjb25zdCBnY2hhciAqa2xhc3MgPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChkZXZpY2VfcGF0aCwgTlVMTCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChkZXZpY2VfbmFtZSwgTlVMTCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChjYXBzLCBOVUxMKTsKKworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEdTVF9WNEwyX0RFVklDRV9UWVBFX1NPVVJDRToKKyAgICAgIGVsZW1lbnQgPSAidjRsMnNyYyI7CisgICAgICBrbGFzcyA9ICJWaWRlby9Tb3VyY2UiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVjRMMl9ERVZJQ0VfVFlQRV9TSU5LOgorICAgICAgZWxlbWVudCA9ICJ2NGwyc2luayI7CisgICAgICBrbGFzcyA9ICJWaWRlby9TaW5rIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgZ3N0ZGV2ID0gZ19vYmplY3RfbmV3IChHU1RfVFlQRV9WNEwyX0RFVklDRSwgImRldmljZS1wYXRoIiwgZGV2aWNlX3BhdGgsCisgICAgICAiZGlzcGxheS1uYW1lIiwgZGV2aWNlX25hbWUsICJjYXBzIiwgY2FwcywgImRldmljZS1jbGFzcyIsIGtsYXNzLAorICAgICAgInByb3BlcnRpZXMiLCBwcm9wcywgTlVMTCk7CisKKyAgZ3N0ZGV2LT5lbGVtZW50ID0gZWxlbWVudDsKKworCisgIHJldHVybiBnc3RkZXY7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2RldmljZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VjRsMkRldmljZSAqZGV2aWNlOworCisgIGRldmljZSA9IEdTVF9WNEwyX0RFVklDRV9DQVNUIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9ERVZJQ0VfUEFUSDoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIGRldmljZS0+ZGV2aWNlX3BhdGgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9kZXZpY2Vfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFY0bDJEZXZpY2UgKmRldmljZTsKKworICBkZXZpY2UgPSBHU1RfVjRMMl9ERVZJQ0VfQ0FTVCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfREVWSUNFX1BBVEg6CisgICAgICBkZXZpY2UtPmRldmljZV9wYXRoID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwyZGV2aWNlcHJvdmlkZXIuaCBiL3N5cy92NGwyL2dzdHY0bDJkZXZpY2Vwcm92aWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMDViMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwyZGV2aWNlcHJvdmlkZXIuaApAQCAtMCwwICsxLDEwMSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorICoKKyAqIGdzdHY0bDJkZXZpY2Vwcm92aWRlci5oOiBWNGwyIGRldmljZSBwcm9iaW5nIGFuZCBtb25pdG9yaW5nCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1Y0TDJfREVWSUNFX1BST1ZJREVSX0hfXworI2RlZmluZSBfX0dTVF9WNEwyX0RFVklDRV9QUk9WSURFUl9IX18KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisjaWZkZWYgSEFWRV9HVURFVgorI2luY2x1ZGUgPGd1ZGV2L2d1ZGV2Lmg+CisjZW5kaWYKKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMkRldmljZVByb3ZpZGVyIEdzdFY0bDJEZXZpY2VQcm92aWRlcjsKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyRGV2aWNlUHJvdmlkZXJDbGFzcyBHc3RWNGwyRGV2aWNlUHJvdmlkZXJDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9WNEwyX0RFVklDRV9QUk9WSURFUiAgICAgICAgICAgICAgICAgKGdzdF92NGwyX2RldmljZV9wcm92aWRlcl9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfSVNfVjRMMl9ERVZJQ0VfUFJPVklERVIob2JqKSAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfVjRMMl9ERVZJQ0VfUFJPVklERVIpKQorI2RlZmluZSBHU1RfSVNfVjRMMl9ERVZJQ0VfUFJPVklERVJfQ0xBU1Moa2xhc3MpICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9WNEwyX0RFVklDRV9QUk9WSURFUikpCisjZGVmaW5lIEdTVF9WNEwyX0RFVklDRV9QUk9WSURFUl9HRVRfQ0xBU1Mob2JqKSAgICAgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIEdTVF9UWVBFX1Y0TDJfREVWSUNFX1BST1ZJREVSLCBHc3RWNGwyRGV2aWNlUHJvdmlkZXJDbGFzcykpCisjZGVmaW5lIEdTVF9WNEwyX0RFVklDRV9QUk9WSURFUihvYmopICAgICAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBHU1RfVFlQRV9WNEwyX0RFVklDRV9QUk9WSURFUiwgR3N0VjRsMkRldmljZVByb3ZpZGVyKSkKKyNkZWZpbmUgR1NUX1Y0TDJfREVWSUNFX1BST1ZJREVSX0NMQVNTKGtsYXNzKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfREVWSUNFX1BST1ZJREVSLCBHc3RWNGwyRGV2aWNlUHJvdmlkZXJDbGFzcykpCisjZGVmaW5lIEdTVF9WNEwyX0RFVklDRV9QUk9WSURFUl9DQVNUKG9iaikgICAgICAgICAgICAoKEdzdFY0bDJEZXZpY2VQcm92aWRlciAqKShvYmopKQorCitzdHJ1Y3QgX0dzdFY0bDJEZXZpY2VQcm92aWRlciB7CisgIEdzdERldmljZVByb3ZpZGVyICAgICAgICAgcGFyZW50OworCisjaWZkZWYgSEFWRV9HVURFVgorICBHTWFpbkNvbnRleHQgKmNvbnRleHQ7CisgIEdNYWluTG9vcCAqbG9vcDsKKyAgR1RocmVhZCAqdGhyZWFkOworICBnYm9vbGVhbiBzdGFydGVkOworICBHQ29uZCBzdGFydGVkX2NvbmQ7CisjZW5kaWYKK307CisKK3R5cGVkZWYgZW51bSB7CisgIEdTVF9WNEwyX0RFVklDRV9UWVBFX0lOVkFMSUQgPSAwLAorICBHU1RfVjRMMl9ERVZJQ0VfVFlQRV9TT1VSQ0UsCisgIEdTVF9WNEwyX0RFVklDRV9UWVBFX1NJTksKK30gR3N0VjRsMkRldmljZVR5cGU7CisKK3N0cnVjdCBfR3N0VjRsMkRldmljZVByb3ZpZGVyQ2xhc3MgeworICBHc3REZXZpY2VQcm92aWRlckNsYXNzICAgIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlICAgICAgICBnc3RfdjRsMl9kZXZpY2VfcHJvdmlkZXJfZ2V0X3R5cGUgKHZvaWQpOworCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyRGV2aWNlIEdzdFY0bDJEZXZpY2U7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMkRldmljZUNsYXNzIEdzdFY0bDJEZXZpY2VDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9WNEwyX0RFVklDRSAgICAgICAgICAgICAgICAgKGdzdF92NGwyX2RldmljZV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfSVNfVjRMMl9ERVZJQ0Uob2JqKSAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfVjRMMl9ERVZJQ0UpKQorI2RlZmluZSBHU1RfSVNfVjRMMl9ERVZJQ0VfQ0xBU1Moa2xhc3MpICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9WNEwyX0RFVklDRSkpCisjZGVmaW5lIEdTVF9WNEwyX0RFVklDRV9HRVRfQ0xBU1Mob2JqKSAgICAgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIEdTVF9UWVBFX1Y0TDJfREVWSUNFLCBHc3RWNGwyRGV2aWNlQ2xhc3MpKQorI2RlZmluZSBHU1RfVjRMMl9ERVZJQ0Uob2JqKSAgICAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfVjRMMl9ERVZJQ0UsIEdzdFY0bDJEZXZpY2UpKQorI2RlZmluZSBHU1RfVjRMMl9ERVZJQ0VfQ0xBU1Moa2xhc3MpICAgICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9ERVZJQ0UsIEdzdFY0bDJEZXZpY2VDbGFzcykpCisjZGVmaW5lIEdTVF9WNEwyX0RFVklDRV9DQVNUKG9iaikgICAgICAgICAgICAoKEdzdFY0bDJEZXZpY2UgKikob2JqKSkKKworc3RydWN0IF9Hc3RWNGwyRGV2aWNlIHsKKyAgR3N0RGV2aWNlICAgICAgICAgcGFyZW50OworCisgIGdjaGFyICAgICAgICAgICAgKmRldmljZV9wYXRoOworICBnY2hhciAgICAgICAgICAgICpzeXNwYXRoOworICBjb25zdCBnY2hhciAgICAgICplbGVtZW50OworfTsKKworc3RydWN0IF9Hc3RWNGwyRGV2aWNlQ2xhc3MgeworICBHc3REZXZpY2VDbGFzcyAgICBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSAgICAgICAgZ3N0X3Y0bDJfZGV2aWNlX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1Y0TDJfREVWSUNFX1BST1ZJREVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMmgyNjNlbmMuYyBiL3N5cy92NGwyL2dzdHY0bDJoMjYzZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I2M2FmNQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2dzdHY0bDJoMjYzZW5jLmMKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQ29sbGFib3JhIEluYy4KKyAqICAgIEF1dGhvcjogTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdHY0bDJvYmplY3QuaCIKKyNpbmNsdWRlICJnc3R2NGwyaDI2M2VuYy5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC1pMThuLXBsdWdpbi5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfdjRsMl9oMjYzX2VuY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfdjRsMl9oMjYzX2VuY19kZWJ1ZworCisKK3N0YXRpYyBHc3RTdGF0aWNDYXBzIHNyY190ZW1wbGF0ZV9jYXBzID0KK0dTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtaDI2MywgdmFyaWFudD0oc3RyaW5nKSBpdHUiKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFY0TDJfU1REX09CSkVDVF9QUk9QUywKKy8qIFRPRE8gYWRkIEgyNjMgY29udHJvbHMgKi8KK307CisKKyNkZWZpbmUgZ3N0X3Y0bDJfaDI2M19lbmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0VjRsMkgyNjNFbmMsIGdzdF92NGwyX2gyNjNfZW5jLCBHU1RfVFlQRV9WNEwyX1ZJREVPX0VOQyk7CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9oMjYzX2VuY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgLyogVE9ETyAqLworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfaDI2M19lbmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIC8qIFRPRE8gKi8KK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2gyNjNfZW5jX2luaXQgKEdzdFY0bDJIMjYzRW5jICogc2VsZikKK3sKKworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfaDI2M19lbmNfY2xhc3NfaW5pdCAoR3N0VjRsMkgyNjNFbmNDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3M7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKworICBwYXJlbnRfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKGtsYXNzKTsKKworICBlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF92NGwyX2gyNjNfZW5jX2RlYnVnLCAidjRsMmgyNjNlbmMiLCAwLAorICAgICAgIlY0TDIgSC4yNjMgRW5jb2RlciIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiVjRMMiBILjI2MyBFbmNvZGVyIiwKKyAgICAgICJDb2RlYy9FbmNvZGVyL1ZpZGVvIiwKKyAgICAgICJFbmNvZGUgSC4yNjMgdmlkZW8gc3RyZWFtcyB2aWEgVjRMMiBBUEkiLAorICAgICAgIk5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4iKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX2gyNjNfZW5jX3NldF9wcm9wZXJ0eSk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfaDI2M19lbmNfZ2V0X3Byb3BlcnR5KTsKK30KKworLyogUHJvYmluZyBmdW5jdGlvbnMgKi8KK2dib29sZWFuCitnc3RfdjRsMl9pc19oMjYzX2VuYyAoR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKQoreworICByZXR1cm4gZ3N0X3Y0bDJfaXNfdmlkZW9fZW5jIChzaW5rX2NhcHMsIHNyY19jYXBzLAorICAgICAgZ3N0X3N0YXRpY19jYXBzX2dldCAoJnNyY190ZW1wbGF0ZV9jYXBzKSk7Cit9CisKK3ZvaWQKK2dzdF92NGwyX2gyNjNfZW5jX3JlZ2lzdGVyIChHc3RQbHVnaW4gKiBwbHVnaW4sIGNvbnN0IGdjaGFyICogYmFzZW5hbWUsCisgICAgY29uc3QgZ2NoYXIgKiBkZXZpY2VfcGF0aCwgR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKQoreworICBnc3RfdjRsMl92aWRlb19lbmNfcmVnaXN0ZXIgKHBsdWdpbiwgR1NUX1RZUEVfVjRMMl9IMjYzX0VOQywKKyAgICAgICJoMjYzIiwgYmFzZW5hbWUsIGRldmljZV9wYXRoLCBzaW5rX2NhcHMsCisgICAgICBnc3Rfc3RhdGljX2NhcHNfZ2V0ICgmc3JjX3RlbXBsYXRlX2NhcHMpLCBzcmNfY2Fwcyk7Cit9CmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwyaDI2M2VuYy5oIGIvc3lzL3Y0bDIvZ3N0djRsMmgyNjNlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTVhMzU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMmgyNjNlbmMuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IENvbGxhYm9yYSBJbmMuCisgKiAgICBBdXRob3I6IE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0dTVF9WNEwyX0gyNjNfRU5DX0hfXworI2RlZmluZSBfX0dTVF9WNEwyX0gyNjNfRU5DX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgImdzdHY0bDJ2aWRlb2VuYy5oIgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX1Y0TDJfSDI2M19FTkMgXAorICAoZ3N0X3Y0bDJfaDI2M19lbmNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1Y0TDJfSDI2M19FTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9WNEwyX0gyNjNfRU5DLEdzdFY0bDJIMjYzRW5jKSkKKyNkZWZpbmUgR1NUX1Y0TDJfSDI2M19FTkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfVjRMMl9IMjYzX0VOQyxHc3RWNGwySDI2M0VuY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJfSDI2M19FTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WNEwyX0gyNjNfRU5DKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJfSDI2M19FTkNfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1Y0TDJfSDI2M19FTkMpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJIMjYzRW5jIEdzdFY0bDJIMjYzRW5jOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJIMjYzRW5jQ2xhc3MgR3N0VjRsMkgyNjNFbmNDbGFzczsKKworc3RydWN0IF9Hc3RWNGwySDI2M0VuYworeworICBHc3RWNGwyVmlkZW9FbmMgcGFyZW50OworfTsKKworc3RydWN0IF9Hc3RWNGwySDI2M0VuY0NsYXNzCit7CisgIEdzdFY0bDJWaWRlb0VuY0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF92NGwyX2gyNjNfZW5jX2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3Y0bDJfaXNfaDI2M19lbmMgKEdzdENhcHMgKiBzaW5rX2NhcHMsIEdzdENhcHMgKiBzcmNfY2Fwcyk7CisKK3ZvaWQgZ3N0X3Y0bDJfaDI2M19lbmNfcmVnaXN0ZXIgKEdzdFBsdWdpbiAqIHBsdWdpbiwgY29uc3QgZ2NoYXIgKiBiYXNlbmFtZSwKKyAgICBjb25zdCBnY2hhciAqIGRldmljZV9wYXRoLCBHc3RDYXBzICogc2lua19jYXBzLCBHc3RDYXBzICogc3JjX2NhcHMpOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1Y0TDJfSDI2M19FTkNfSF9fICovCmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwyaDI2NGVuYy5jIGIvc3lzL3Y0bDIvZ3N0djRsMmgyNjRlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWM2MDM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMmgyNjRlbmMuYwpAQCAtMCwwICsxLDMyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBTVU1PTU8gQ29tcHV0ZXIgQXNzb2NpYXRpb24KKyAqICAgICBBdXRob3I6IGF5YWthIDxheWFrYUBzb3VsaWsuaW5mbz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3R2NGwyb2JqZWN0LmgiCisjaW5jbHVkZSAiZ3N0djRsMmgyNjRlbmMuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3Y0bDJfaDI2NF9lbmNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3Y0bDJfaDI2NF9lbmNfZGVidWcKKworCitzdGF0aWMgR3N0U3RhdGljQ2FwcyBzcmNfdGVtcGxhdGVfY2FwcyA9CitHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LWgyNjQsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZykgYnl0ZS1zdHJlYW0sICIKKyAgICAiYWxpZ25tZW50PShzdHJpbmcpIGF1Iik7CisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBWNEwyX1NURF9PQkpFQ1RfUFJPUFMsCisvKiBUT0RPIGFkZCBIMjY0IGNvbnRyb2xzCisgKiBQUk9QX0lfRlJBTUVfUVAsCisgKiBQUk9QX1BfRlJBTUVfUVAsCisgKiBQUk9QX0JfRlJBTUVfUVAsCisgKiBQUk9QX01JTl9RUCwKKyAqIFBST1BfTUFYX1FQLAorICogUFJPUF84eDhfVFJBTlNGT1JNLAorICogUFJPUF9DUEJfU0laRSwKKyAqIFBST1BfRU5UUk9QWV9NT0RFLAorICogUFJPUF9JX1BFUklPRCwKKyAqIFBST1BfTE9PUF9GSUxURVJfQUxQSEEsCisgKiBQUk9QX0xPT1BfRklMVEVSX0JFVEEsCisgKiBQUk9QX0xPT1BfRklMVEVSX01PREUsCisgKiBQUk9QX1ZVSV9FWFRfU0FSX0hFSUdIVCwKKyAqIFBST1BfVlVJX0VYVF9TQVJfV0lEVEgsCisgKiBQUk9QX1ZVSV9TQVJfRU5BQkxFRCwKKyAqIFBST1BfVlVJX1NBUl9JREMsCisgKiBQUk9QX1NFSV9GUkFNRV9QQUNLSU5HLAorICogUFJPUF9TRUlfRlBfQ1VSUkVOVF9GUkFNRV8wLAorICogUFJPUF9TRUlfRlBfQVJSQU5HRU1FTlRfVFlQLAorICogLi4uCisgKiAqLworfTsKKworI2RlZmluZSBnc3RfdjRsMl9oMjY0X2VuY19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RWNGwySDI2NEVuYywgZ3N0X3Y0bDJfaDI2NF9lbmMsIEdTVF9UWVBFX1Y0TDJfVklERU9fRU5DKTsKKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2gyNjRfZW5jX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICAvKiBUT0RPICovCit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9oMjY0X2VuY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgLyogVE9ETyAqLworfQorCitzdGF0aWMgZ2ludAordjRsMl9wcm9maWxlX2Zyb21fc3RyaW5nIChjb25zdCBnY2hhciAqIHByb2ZpbGUpCit7CisgIGdpbnQgdjRsMl9wcm9maWxlID0gLTE7CisKKyAgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAiYmFzZWxpbmUiKSkgeworICAgIHY0bDJfcHJvZmlsZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQkFTRUxJTkU7CisgIH0gZWxzZSBpZiAoZ19zdHJfZXF1YWwgKHByb2ZpbGUsICJjb25zdHJhaW5lZC1iYXNlbGluZSIpKSB7CisgICAgdjRsMl9wcm9maWxlID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9DT05TVFJBSU5FRF9CQVNFTElORTsKKyAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgIm1haW4iKSkgeworICAgIHY0bDJfcHJvZmlsZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfTUFJTjsKKyAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgImV4dGVuZGVkIikpIHsKKyAgICB2NGwyX3Byb2ZpbGUgPSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0VYVEVOREVEOworICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAiaGlnaCIpKSB7CisgICAgdjRsMl9wcm9maWxlID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIOworICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAiaGlnaC0xMCIpKSB7CisgICAgdjRsMl9wcm9maWxlID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzEwOworICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAiaGlnaC00OjI6MiIpKSB7CisgICAgdjRsMl9wcm9maWxlID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzQyMjsKKyAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgImhpZ2gtNDo0OjQiKSkgeworICAgIHY0bDJfcHJvZmlsZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF80NDRfUFJFRElDVElWRTsKKyAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgImhpZ2gtMTAtaW50cmEiKSkgeworICAgIHY0bDJfcHJvZmlsZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF8xMF9JTlRSQTsKKyAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgImhpZ2gtNDoyOjItaW50cmEiKSkgeworICAgIHY0bDJfcHJvZmlsZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF80MjJfSU5UUkE7CisgIH0gZWxzZSBpZiAoZ19zdHJfZXF1YWwgKHByb2ZpbGUsICJoaWdoLTQ6NDo0LWludHJhIikpIHsKKyAgICB2NGwyX3Byb2ZpbGUgPSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfNDQ0X0lOVFJBOworICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAiY2F2bGMtNDo0OjQtaW50cmEiKSkgeworICAgIHY0bDJfcHJvZmlsZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQ0FWTENfNDQ0X0lOVFJBOworICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAic2NhbGFibGUtYmFzZWxpbmUiKSkgeworICAgIHY0bDJfcHJvZmlsZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfU0NBTEFCTEVfQkFTRUxJTkU7CisgIH0gZWxzZSBpZiAoZ19zdHJfZXF1YWwgKHByb2ZpbGUsICJzY2FsYWJsZS1oaWdoIikpIHsKKyAgICB2NGwyX3Byb2ZpbGUgPSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX1NDQUxBQkxFX0hJR0g7CisgIH0gZWxzZSBpZiAoZ19zdHJfZXF1YWwgKHByb2ZpbGUsICJzY2FsYWJsZS1oaWdoLWludHJhIikpIHsKKyAgICB2NGwyX3Byb2ZpbGUgPSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX1NDQUxBQkxFX0hJR0hfSU5UUkE7CisgIH0gZWxzZSBpZiAoZ19zdHJfZXF1YWwgKHByb2ZpbGUsICJzdGVyZW8taGlnaCIpKSB7CisgICAgdjRsMl9wcm9maWxlID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9TVEVSRU9fSElHSDsKKyAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgIm11bHRpdmlldy1oaWdoIikpIHsKKyAgICB2NGwyX3Byb2ZpbGUgPSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX01VTFRJVklFV19ISUdIOworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HICgiVW5zdXBwb3J0ZWQgcHJvZmlsZSBzdHJpbmcgJyVzJyIsIHByb2ZpbGUpOworICB9CisKKyAgcmV0dXJuIHY0bDJfcHJvZmlsZTsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyICoKK3Y0bDJfcHJvZmlsZV90b19zdHJpbmcgKGdpbnQgdjRsMl9wcm9maWxlKQoreworICBzd2l0Y2ggKHY0bDJfcHJvZmlsZSkgeworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9CQVNFTElORToKKyAgICAgIHJldHVybiAiYmFzZWxpbmUiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9DT05TVFJBSU5FRF9CQVNFTElORToKKyAgICAgIHJldHVybiAiY29uc3RyYWluZWQtYmFzZWxpbmUiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9NQUlOOgorICAgICAgcmV0dXJuICJtYWluIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfRVhURU5ERUQ6CisgICAgICByZXR1cm4gImV4dGVuZGVkIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSDoKKyAgICAgIHJldHVybiAiaGlnaCI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfMTA6CisgICAgICByZXR1cm4gImhpZ2gtMTAiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzQyMjoKKyAgICAgIHJldHVybiAiaGlnaC00OjI6MiI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfNDQ0X1BSRURJQ1RJVkU6CisgICAgICByZXR1cm4gImhpZ2gtNDo0OjQiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzEwX0lOVFJBOgorICAgICAgcmV0dXJuICJoaWdoLTEwLWludHJhIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF80MjJfSU5UUkE6CisgICAgICByZXR1cm4gImhpZ2gtNDoyOjItaW50cmEiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzQ0NF9JTlRSQToKKyAgICAgIHJldHVybiAiaGlnaC00OjQ6NC1pbnRyYSI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0NBVkxDXzQ0NF9JTlRSQToKKyAgICAgIHJldHVybiAiY2F2bGMtNDo0OjQtaW50cmEiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9TQ0FMQUJMRV9CQVNFTElORToKKyAgICAgIHJldHVybiAic2NhbGFibGUtYmFzZWxpbmUiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9TQ0FMQUJMRV9ISUdIOgorICAgICAgcmV0dXJuICJzY2FsYWJsZS1oaWdoIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfU0NBTEFCTEVfSElHSF9JTlRSQToKKyAgICAgIHJldHVybiAic2NhbGFibGUtaGlnaC1pbnRyYSI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX1NURVJFT19ISUdIOgorICAgICAgcmV0dXJuICJzdGVyZW8taGlnaCI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX01VTFRJVklFV19ISUdIOgorICAgICAgcmV0dXJuICJtdWx0aXZpZXctaGlnaCI7CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9XQVJOSU5HICgiVW5zdXBwb3J0ZWQgVjRMMiBwcm9maWxlICVpIiwgdjRsMl9wcm9maWxlKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBnaW50Cit2NGwyX2xldmVsX2Zyb21fc3RyaW5nIChjb25zdCBnY2hhciAqIGxldmVsKQoreworICBnaW50IHY0bDJfbGV2ZWwgPSAtMTsKKworICBpZiAoZ19zdHJfZXF1YWwgKGxldmVsLCAiMSIpKQorICAgIHY0bDJfbGV2ZWwgPSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xXzA7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChsZXZlbCwgIjFiIikpCisgICAgdjRsMl9sZXZlbCA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFCOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAobGV2ZWwsICIxLjEiKSkKKyAgICB2NGwyX2xldmVsID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8xOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAobGV2ZWwsICIxLjIiKSkKKyAgICB2NGwyX2xldmVsID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8yOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAobGV2ZWwsICIxLjMiKSkKKyAgICB2NGwyX2xldmVsID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8zOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAobGV2ZWwsICIyIikpCisgICAgdjRsMl9sZXZlbCA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzJfMDsKKyAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKGxldmVsLCAiMi4xIikpCisgICAgdjRsMl9sZXZlbCA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzJfMTsKKyAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKGxldmVsLCAiMi4yIikpCisgICAgdjRsMl9sZXZlbCA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzJfMjsKKyAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKGxldmVsLCAiMyIpKQorICAgIHY0bDJfbGV2ZWwgPSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8zXzA7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChsZXZlbCwgIjMuMSIpKQorICAgIHY0bDJfbGV2ZWwgPSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8zXzE7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChsZXZlbCwgIjMuMiIpKQorICAgIHY0bDJfbGV2ZWwgPSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8zXzI7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChsZXZlbCwgIjQiKSkKKyAgICB2NGwyX2xldmVsID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNF8wOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAobGV2ZWwsICI0LjEiKSkKKyAgICB2NGwyX2xldmVsID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNF8xOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAobGV2ZWwsICI0LjIiKSkKKyAgICB2NGwyX2xldmVsID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNF8yOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAobGV2ZWwsICI1IikpCisgICAgdjRsMl9sZXZlbCA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzVfMDsKKyAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKGxldmVsLCAiNS4xIikpCisgICAgdjRsMl9sZXZlbCA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzVfMTsKKyAgZWxzZQorICAgIEdTVF9XQVJOSU5HICgiVW5zdXBwb3J0ZWQgbGV2ZWwgJyVzJyIsIGxldmVsKTsKKworICByZXR1cm4gdjRsMl9sZXZlbDsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyICoKK3Y0bDJfbGV2ZWxfdG9fc3RyaW5nIChnaW50IHY0bDJfbGV2ZWwpCit7CisgIHN3aXRjaCAodjRsMl9sZXZlbCkgeworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8wOgorICAgICAgcmV0dXJuICIxIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFCOgorICAgICAgcmV0dXJuICIxYiI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xXzE6CisgICAgICByZXR1cm4gIjEuMSI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xXzI6CisgICAgICByZXR1cm4gIjEuMiI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xXzM6CisgICAgICByZXR1cm4gIjEuMyI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8yXzA6CisgICAgICByZXR1cm4gIjIiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMl8xOgorICAgICAgcmV0dXJuICIyLjEiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMl8yOgorICAgICAgcmV0dXJuICIyLjIiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfM18wOgorICAgICAgcmV0dXJuICIzLjAiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfM18xOgorICAgICAgcmV0dXJuICIzLjEiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfM18yOgorICAgICAgcmV0dXJuICIzLjIiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNF8wOgorICAgICAgcmV0dXJuICI0IjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMToKKyAgICAgIHJldHVybiAiNC4xIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMjoKKyAgICAgIHJldHVybiAiNC4yIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzVfMDoKKyAgICAgIHJldHVybiAiNSI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF81XzE6CisgICAgICByZXR1cm4gIjUuMSI7CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9XQVJOSU5HICgiVW5zdXBwb3J0ZWQgVjRMMiBsZXZlbCAlaSIsIHY0bDJfbGV2ZWwpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2gyNjRfZW5jX2luaXQgKEdzdFY0bDJIMjY0RW5jICogc2VsZikKK3sKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2gyNjRfZW5jX2NsYXNzX2luaXQgKEdzdFY0bDJIMjY0RW5jQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdFY0bDJWaWRlb0VuY0NsYXNzICpiYXNlY2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBiYXNlY2xhc3MgPSAoR3N0VjRsMlZpZGVvRW5jQ2xhc3MgKikgKGtsYXNzKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3Y0bDJfaDI2NF9lbmNfZGVidWcsICJ2NGwyaDI2NGVuYyIsIDAsCisgICAgICAiVjRMMiBILjI2NCBFbmNvZGVyIik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywKKyAgICAgICJWNEwyIEguMjY0IEVuY29kZXIiLAorICAgICAgIkNvZGVjL0VuY29kZXIvVmlkZW8iLAorICAgICAgIkVuY29kZSBILjI2NCB2aWRlbyBzdHJlYW1zIHZpYSBWNEwyIEFQSSIsICJheWFrYSA8YXlha2FAc291bGlrLmluZm8+Iik7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl9oMjY0X2VuY19zZXRfcHJvcGVydHkpOworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX2gyNjRfZW5jX2dldF9wcm9wZXJ0eSk7CisKKyAgYmFzZWNsYXNzLT5jb2RlY19uYW1lID0gIkgyNjQiOworICBiYXNlY2xhc3MtPnByb2ZpbGVfY2lkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1BST0ZJTEU7CisgIGJhc2VjbGFzcy0+cHJvZmlsZV90b19zdHJpbmcgPSB2NGwyX3Byb2ZpbGVfdG9fc3RyaW5nOworICBiYXNlY2xhc3MtPnByb2ZpbGVfZnJvbV9zdHJpbmcgPSB2NGwyX3Byb2ZpbGVfZnJvbV9zdHJpbmc7CisgIGJhc2VjbGFzcy0+bGV2ZWxfY2lkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0xFVkVMOworICBiYXNlY2xhc3MtPmxldmVsX3RvX3N0cmluZyA9IHY0bDJfbGV2ZWxfdG9fc3RyaW5nOworICBiYXNlY2xhc3MtPmxldmVsX2Zyb21fc3RyaW5nID0gdjRsMl9sZXZlbF9mcm9tX3N0cmluZzsKK30KKworLyogUHJvYmluZyBmdW5jdGlvbnMgKi8KK2dib29sZWFuCitnc3RfdjRsMl9pc19oMjY0X2VuYyAoR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKQoreworICByZXR1cm4gZ3N0X3Y0bDJfaXNfdmlkZW9fZW5jIChzaW5rX2NhcHMsIHNyY19jYXBzLAorICAgICAgZ3N0X3N0YXRpY19jYXBzX2dldCAoJnNyY190ZW1wbGF0ZV9jYXBzKSk7Cit9CisKK3ZvaWQKK2dzdF92NGwyX2gyNjRfZW5jX3JlZ2lzdGVyIChHc3RQbHVnaW4gKiBwbHVnaW4sIGNvbnN0IGdjaGFyICogYmFzZW5hbWUsCisgICAgY29uc3QgZ2NoYXIgKiBkZXZpY2VfcGF0aCwgR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKQoreworICBnc3RfdjRsMl92aWRlb19lbmNfcmVnaXN0ZXIgKHBsdWdpbiwgR1NUX1RZUEVfVjRMMl9IMjY0X0VOQywKKyAgICAgICJoMjY0IiwgYmFzZW5hbWUsIGRldmljZV9wYXRoLCBzaW5rX2NhcHMsCisgICAgICBnc3Rfc3RhdGljX2NhcHNfZ2V0ICgmc3JjX3RlbXBsYXRlX2NhcHMpLCBzcmNfY2Fwcyk7Cit9CmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwyaDI2NGVuYy5oIGIvc3lzL3Y0bDIvZ3N0djRsMmgyNjRlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmZhMzQzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMmgyNjRlbmMuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFNVTU9NTyBDb21wdXRlciBBc3NvY2lhdGlvbi4KKyAqICAgICBBdXRob3I6IGF5YWthIDxheWFrYUBzb3VsaWsuaW5mbz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0dTVF9WNEwyX0gyNjRfRU5DX0hfXworI2RlZmluZSBfX0dTVF9WNEwyX0gyNjRfRU5DX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgImdzdHY0bDJ2aWRlb2VuYy5oIgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX1Y0TDJfSDI2NF9FTkMgXAorICAoZ3N0X3Y0bDJfaDI2NF9lbmNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1Y0TDJfSDI2NF9FTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9WNEwyX0gyNjRfRU5DLEdzdFY0bDJIMjY0RW5jKSkKKyNkZWZpbmUgR1NUX1Y0TDJfSDI2NF9FTkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfVjRMMl9IMjY0X0VOQyxHc3RWNGwySDI2NEVuY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJfSDI2NF9FTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WNEwyX0gyNjRfRU5DKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJfSDI2NF9FTkNfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1Y0TDJfSDI2NF9FTkMpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJIMjY0RW5jIEdzdFY0bDJIMjY0RW5jOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJIMjY0RW5jQ2xhc3MgR3N0VjRsMkgyNjRFbmNDbGFzczsKKworc3RydWN0IF9Hc3RWNGwySDI2NEVuYworeworICBHc3RWNGwyVmlkZW9FbmMgcGFyZW50OworfTsKKworc3RydWN0IF9Hc3RWNGwySDI2NEVuY0NsYXNzCit7CisgIEdzdFY0bDJWaWRlb0VuY0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF92NGwyX2gyNjRfZW5jX2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3Y0bDJfaXNfaDI2NF9lbmMgKEdzdENhcHMgKiBzaW5rX2NhcHMsIEdzdENhcHMgKiBzcmNfY2Fwcyk7CisKK3ZvaWQgZ3N0X3Y0bDJfaDI2NF9lbmNfcmVnaXN0ZXIgKEdzdFBsdWdpbiAqIHBsdWdpbiwgY29uc3QgZ2NoYXIgKiBiYXNlbmFtZSwKKyAgICBjb25zdCBnY2hhciAqIGRldmljZV9wYXRoLCBHc3RDYXBzICogc2lua19jYXBzLCBHc3RDYXBzICogc3JjX2NhcHMpOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1Y0TDJfSDI2NF9FTkNfSF9fICovCmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwybXBlZzRlbmMuYyBiL3N5cy92NGwyL2dzdHY0bDJtcGVnNGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMGJiNzcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwybXBlZzRlbmMuYwpAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBDb2xsYWJvcmEgSW5jLgorICogICAgQXV0aG9yOiBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0djRsMm9iamVjdC5oIgorI2luY2x1ZGUgImdzdHY0bDJtcGVnNGVuYy5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC1pMThuLXBsdWdpbi5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfdjRsMl9tcGVnNF9lbmNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3Y0bDJfbXBlZzRfZW5jX2RlYnVnCisKK3N0YXRpYyBHc3RTdGF0aWNDYXBzIHNyY190ZW1wbGF0ZV9jYXBzID0KK0dTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpNCwgc3lzdGVtc3RyZWFtPShib29sZWFuKUZBTFNFIik7CisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBWNEwyX1NURF9PQkpFQ1RfUFJPUFMsCisgIC8qIFRPRE8gKi8KK307CisKKyNkZWZpbmUgZ3N0X3Y0bDJfbXBlZzRfZW5jX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFY0bDJNcGVnNEVuYywgZ3N0X3Y0bDJfbXBlZzRfZW5jLCBHU1RfVFlQRV9WNEwyX1ZJREVPX0VOQyk7CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9tcGVnNF9lbmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIC8qIFRPRE8gKi8KK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX21wZWc0X2VuY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgLyogVE9ETyAqLworfQorCitzdGF0aWMgZ2ludAordjRsMl9wcm9maWxlX2Zyb21fc3RyaW5nIChjb25zdCBnY2hhciAqIHByb2ZpbGUpCit7CisgIGdpbnQgdjRsMl9wcm9maWxlID0gLTE7CisKKyAgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAic2ltcGxlIikpCisgICAgdjRsMl9wcm9maWxlID0gVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfU0lNUExFOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgImFkdmFuY2VkLXNpbXBsZSIpKQorICAgIHY0bDJfcHJvZmlsZSA9IFY0TDJfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFX0FEVkFOQ0VEX1NJTVBMRTsKKyAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKHByb2ZpbGUsICJjb3JlIikpCisgICAgdjRsMl9wcm9maWxlID0gVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfQ09SRTsKKyAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKHByb2ZpbGUsICJzaW1wbGUtc2NhbGFibGUiKSkKKyAgICB2NGwyX3Byb2ZpbGUgPSBWNEwyX01QRUdfVklERU9fTVBFRzRfUFJPRklMRV9TSU1QTEVfU0NBTEFCTEU7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAiYWR2YW5jZWQtY29kaW5nLWVmZmljaWVuY3kiKSkKKyAgICB2NGwyX3Byb2ZpbGUgPSBWNEwyX01QRUdfVklERU9fTVBFRzRfUFJPRklMRV9BRFZBTkNFRF9DT0RJTkdfRUZGSUNJRU5DWTsKKyAgZWxzZQorICAgIEdTVF9XQVJOSU5HICgiVW5zdXBwb3J0ZWQgcHJvZmlsZSBzdHJpbmcgJyVzJyIsIHByb2ZpbGUpOworCisgIHJldHVybiB2NGwyX3Byb2ZpbGU7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqCit2NGwyX3Byb2ZpbGVfdG9fc3RyaW5nIChnaW50IHY0bDJfcHJvZmlsZSkKK3sKKyAgc3dpdGNoICh2NGwyX3Byb2ZpbGUpIHsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFX1NJTVBMRToKKyAgICAgIHJldHVybiAic2ltcGxlIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFX0FEVkFOQ0VEX1NJTVBMRToKKyAgICAgIHJldHVybiAiYWR2YW5jZWQtc2ltcGxlIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFX0NPUkU6CisgICAgICByZXR1cm4gImNvcmUiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfU0lNUExFX1NDQUxBQkxFOgorICAgICAgcmV0dXJuICJzaW1wbGUtc2NhbGFibGUiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfQURWQU5DRURfQ09ESU5HX0VGRklDSUVOQ1k6CisgICAgICByZXR1cm4gImFkdmFuY2VkLWNvZGluZy1lZmZpY2llbmN5IjsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX1dBUk5JTkcgKCJVbnN1cHBvcnRlZCBWNEwyIHByb2ZpbGUgJWkiLCB2NGwyX3Byb2ZpbGUpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGdpbnQKK3Y0bDJfbGV2ZWxfZnJvbV9zdHJpbmcgKGNvbnN0IGdjaGFyICogbGV2ZWwpCit7CisgIGdpbnQgdjRsMl9sZXZlbCA9IC0xOworCisgIGlmIChnX3N0cl9lcXVhbCAobGV2ZWwsICIwIikpCisgICAgdjRsMl9sZXZlbCA9IFY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8wOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAobGV2ZWwsICIwYiIpKQorICAgIHY0bDJfbGV2ZWwgPSBWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfMEI7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChsZXZlbCwgIjEiKSkKKyAgICB2NGwyX2xldmVsID0gVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzE7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChsZXZlbCwgIjIiKSkKKyAgICB2NGwyX2xldmVsID0gVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzI7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChsZXZlbCwgIjMiKSkKKyAgICB2NGwyX2xldmVsID0gVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzM7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChsZXZlbCwgIjNiIikpCisgICAgdjRsMl9sZXZlbCA9IFY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8zQjsKKyAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKGxldmVsLCAiNCIpKQorICAgIHY0bDJfbGV2ZWwgPSBWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfNDsKKyAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKGxldmVsLCAiNSIpKQorICAgIHY0bDJfbGV2ZWwgPSBWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfNTsKKyAgZWxzZQorICAgIEdTVF9XQVJOSU5HICgiVW5zdXBwb3J0ZWQgbGV2ZWwgJyVzJyIsIGxldmVsKTsKKworICByZXR1cm4gdjRsMl9sZXZlbDsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyICoKK3Y0bDJfbGV2ZWxfdG9fc3RyaW5nIChnaW50IHY0bDJfbGV2ZWwpCit7CisgIHN3aXRjaCAodjRsMl9sZXZlbCkgeworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzA6CisgICAgICByZXR1cm4gIjAiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzBCOgorICAgICAgcmV0dXJuICIwYiI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfMToKKyAgICAgIHJldHVybiAiMSI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfMjoKKyAgICAgIHJldHVybiAiMiI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfMzoKKyAgICAgIHJldHVybiAiMyI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfM0I6CisgICAgICByZXR1cm4gIjNiIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF80OgorICAgICAgcmV0dXJuICI0IjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF81OgorICAgICAgcmV0dXJuICI1IjsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX1dBUk5JTkcgKCJVbnN1cHBvcnRlZCBWNEwyIGxldmVsICVpIiwgdjRsMl9sZXZlbCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfbXBlZzRfZW5jX2luaXQgKEdzdFY0bDJNcGVnNEVuYyAqIHNlbGYpCit7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9tcGVnNF9lbmNfY2xhc3NfaW5pdCAoR3N0VjRsMk1wZWc0RW5jQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdFY0bDJWaWRlb0VuY0NsYXNzICpiYXNlY2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBiYXNlY2xhc3MgPSAoR3N0VjRsMlZpZGVvRW5jQ2xhc3MgKikgKGtsYXNzKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3Y0bDJfbXBlZzRfZW5jX2RlYnVnLCAidjRsMm1wZWc0ZW5jIiwgMCwKKyAgICAgICJWNEwyIE1QRUc0IEVuY29kZXIiKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIlY0TDIgTVBFRzQgRW5jb2RlciIsCisgICAgICAiQ29kZWMvRW5jb2Rlci9WaWRlbyIsCisgICAgICAiRW5jb2RlIE1QRUc0IHZpZGVvIHN0cmVhbXMgdmlhIFY0TDIgQVBJIiwKKyAgICAgICJOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20iKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX21wZWc0X2VuY19zZXRfcHJvcGVydHkpOworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX21wZWc0X2VuY19nZXRfcHJvcGVydHkpOworCisgIGJhc2VjbGFzcy0+Y29kZWNfbmFtZSA9ICJNUEVHNCI7CisgIGJhc2VjbGFzcy0+cHJvZmlsZV9jaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEU7CisgIGJhc2VjbGFzcy0+cHJvZmlsZV90b19zdHJpbmcgPSB2NGwyX3Byb2ZpbGVfdG9fc3RyaW5nOworICBiYXNlY2xhc3MtPnByb2ZpbGVfZnJvbV9zdHJpbmcgPSB2NGwyX3Byb2ZpbGVfZnJvbV9zdHJpbmc7CisgIGJhc2VjbGFzcy0+bGV2ZWxfY2lkID0gVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9MRVZFTDsKKyAgYmFzZWNsYXNzLT5sZXZlbF90b19zdHJpbmcgPSB2NGwyX2xldmVsX3RvX3N0cmluZzsKKyAgYmFzZWNsYXNzLT5sZXZlbF9mcm9tX3N0cmluZyA9IHY0bDJfbGV2ZWxfZnJvbV9zdHJpbmc7Cit9CisKKy8qIFByb2JpbmcgZnVuY3Rpb25zICovCitnYm9vbGVhbgorZ3N0X3Y0bDJfaXNfbXBlZzRfZW5jIChHc3RDYXBzICogc2lua19jYXBzLCBHc3RDYXBzICogc3JjX2NhcHMpCit7CisgIHJldHVybiBnc3RfdjRsMl9pc192aWRlb19lbmMgKHNpbmtfY2Fwcywgc3JjX2NhcHMsCisgICAgICBnc3Rfc3RhdGljX2NhcHNfZ2V0ICgmc3JjX3RlbXBsYXRlX2NhcHMpKTsKK30KKwordm9pZAorZ3N0X3Y0bDJfbXBlZzRfZW5jX3JlZ2lzdGVyIChHc3RQbHVnaW4gKiBwbHVnaW4sIGNvbnN0IGdjaGFyICogYmFzZW5hbWUsCisgICAgY29uc3QgZ2NoYXIgKiBkZXZpY2VfcGF0aCwgR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKQoreworICBnc3RfdjRsMl92aWRlb19lbmNfcmVnaXN0ZXIgKHBsdWdpbiwgR1NUX1RZUEVfVjRMMl9NUEVHNF9FTkMsCisgICAgICAibXBlZzQiLCBiYXNlbmFtZSwgZGV2aWNlX3BhdGgsIHNpbmtfY2FwcywKKyAgICAgIGdzdF9zdGF0aWNfY2Fwc19nZXQgKCZzcmNfdGVtcGxhdGVfY2FwcyksIHNyY19jYXBzKTsKK30KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJtcGVnNGVuYy5oIGIvc3lzL3Y0bDIvZ3N0djRsMm1wZWc0ZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ5NDEwMwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2dzdHY0bDJtcGVnNGVuYy5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQ29sbGFib3JhIEluYy4KKyAqICAgIEF1dGhvcjogTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9fR1NUX1Y0TDJfTVBFRzRfRU5DX0hfXworI2RlZmluZSBfX0dTVF9WNEwyX01QRUc0X0VOQ19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlICJnc3R2NGwydmlkZW9lbmMuaCIKKworR19CRUdJTl9ERUNMUworI2RlZmluZSBHU1RfVFlQRV9WNEwyX01QRUc0X0VOQyBcCisgIChnc3RfdjRsMl9tcGVnNF9lbmNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1Y0TDJfTVBFRzRfRU5DKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVjRMMl9NUEVHNF9FTkMsR3N0VjRsMk1wZWc0RW5jKSkKKyNkZWZpbmUgR1NUX1Y0TDJfTVBFRzRfRU5DX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1Y0TDJfTVBFRzRfRU5DLEdzdFY0bDJNcGVnNEVuY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJfTVBFRzRfRU5DKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfVjRMMl9NUEVHNF9FTkMpKQorI2RlZmluZSBHU1RfSVNfVjRMMl9NUEVHNF9FTkNfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1Y0TDJfTVBFRzRfRU5DKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyTXBlZzRFbmMgR3N0VjRsMk1wZWc0RW5jOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJNcGVnNEVuY0NsYXNzIEdzdFY0bDJNcGVnNEVuY0NsYXNzOworCitzdHJ1Y3QgX0dzdFY0bDJNcGVnNEVuYworeworICBHc3RWNGwyVmlkZW9FbmMgcGFyZW50OworfTsKKworc3RydWN0IF9Hc3RWNGwyTXBlZzRFbmNDbGFzcworeworICBHc3RWNGwyVmlkZW9FbmNDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfdjRsMl9tcGVnNF9lbmNfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfdjRsMl9pc19tcGVnNF9lbmMgKEdzdENhcHMgKiBzaW5rX2NhcHMsIEdzdENhcHMgKiBzcmNfY2Fwcyk7CisKK3ZvaWQgZ3N0X3Y0bDJfbXBlZzRfZW5jX3JlZ2lzdGVyIChHc3RQbHVnaW4gKiBwbHVnaW4sIGNvbnN0IGdjaGFyICogYmFzZW5hbWUsCisgICAgY29uc3QgZ2NoYXIgKiBkZXZpY2VfcGF0aCwgR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9WNEwyX01QRUc0X0VOQ19IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJvYmplY3QuYyBiL3N5cy92NGwyL2dzdHY0bDJvYmplY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWU2NzA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jCkBAIC0wLDAgKzEsNDQ4NSBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogICAgICAgICAgICAgICAyMDA2IEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+CisgKgorICogZ3N0djRsMm9iamVjdC5jOiBiYXNlIGNsYXNzIGZvciBWNEwyIGVsZW1lbnRzCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUKKyAqIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZQorICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCisgKiBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworCisjaWZkZWYgSEFWRV9HVURFVgorI2luY2x1ZGUgPGd1ZGV2L2d1ZGV2Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dC92aWRlb2RldjIuaCIKKyNpbmNsdWRlICJnc3R2NGwyb2JqZWN0LmgiCisjaW5jbHVkZSAiZ3N0djRsMnR1bmVyLmgiCisjaW5jbHVkZSAiZ3N0djRsMmNvbG9yYmFsYW5jZS5oIgorCisjaW5jbHVkZSAiZ3N0L2dzdC1pMThuLXBsdWdpbi5oIgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKHY0bDJfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgdjRsMl9kZWJ1ZworCisjZGVmaW5lIERFRkFVTFRfUFJPUF9ERVZJQ0VfTkFNRSAgICAgICAgTlVMTAorI2RlZmluZSBERUZBVUxUX1BST1BfREVWSUNFX0ZEICAgICAgICAgIC0xCisjZGVmaW5lIERFRkFVTFRfUFJPUF9GTEFHUyAgICAgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1BST1BfVFZfTk9STSAgICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9QUk9QX0lPX01PREUgICAgICAgICAgICBHU1RfVjRMMl9JT19BVVRPCisKKyNkZWZpbmUgRU5DT0RFRF9CVUZGRVJfU0laRSAgICAgICAgICAgICAoMiAqIDEwMjQgKiAxMDI0KQorCisjaWYgU0laRU9GX09GRl9UID09IDggJiYgIWRlZmluZWQobW1hcDY0KQorI2RlZmluZSBtbWFwNjQgbW1hcAorI2VuZGlmCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBWNEwyX1NURF9PQkpFQ1RfUFJPUFMsCit9OworCisvKgorICogY29tbW9uIGZvcm1hdCAvIGNhcHMgdXRpbGl0aWVzOgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgR1NUX1Y0TDJfUkFXID0gMSA8PCAwLAorICBHU1RfVjRMMl9DT0RFQyA9IDEgPDwgMSwKKyAgR1NUX1Y0TDJfVFJBTlNQT1JUID0gMSA8PCAyLAorICBHU1RfVjRMMl9OT19QQVJTRSA9IDEgPDwgMywKKyAgR1NUX1Y0TDJfQUxMID0gMHhmZmZmCit9IEdzdFY0TDJGb3JtYXRGbGFnczsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ3VpbnQzMiBmb3JtYXQ7CisgIGdib29sZWFuIGRpbWVuc2lvbnM7CisgIEdzdFY0TDJGb3JtYXRGbGFncyBmbGFnczsKK30gR3N0VjRMMkZvcm1hdERlc2M7CisKK3N0YXRpYyBjb25zdCBHc3RWNEwyRm9ybWF0RGVzYyBnc3RfdjRsMl9mb3JtYXRzW10gPSB7CisgIC8qIFJHQiBmb3JtYXRzICovCisgIHtWNEwyX1BJWF9GTVRfUkdCMzMyLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX0FSR0I1NTUsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfWFJHQjU1NSwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9BUkdCNTU1WCwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9YUkdCNTU1WCwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9SR0I1NjUsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfUkdCNTY1WCwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9CR1I2NjYsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfQkdSMjQsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfUkdCMjQsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfQUJHUjMyLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1hCR1IzMiwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9BUkdCMzIsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfWFJHQjMyLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorCisgIC8qIERlcHJlY2F0ZWQgUGFja2VkIFJHQiBJbWFnZSBGb3JtYXRzIChhbHBoYSBhbWJpZ3VpdHkpICovCisgIHtWNEwyX1BJWF9GTVRfUkdCNDQ0LCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1JHQjU1NSwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9SR0I1NTVYLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX0JHUjMyLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1JHQjMyLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorCisgIC8qIEdyZXkgZm9ybWF0cyAqLworICB7VjRMMl9QSVhfRk1UX0dSRVksIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfWTQsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfWTYsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfWTEwLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1kxMiwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9ZMTYsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfWTE2X0JFLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1kxMEJQQUNLLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorCisgIC8qIFBhbGV0dGUgZm9ybWF0cyAqLworICB7VjRMMl9QSVhfRk1UX1BBTDgsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisKKyAgLyogQ2hyb21pbmFuY2UgZm9ybWF0cyAqLworICB7VjRMMl9QSVhfRk1UX1VWOCwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKworICAvKiBMdW1pbmFuY2UrQ2hyb21pbmFuY2UgZm9ybWF0cyAqLworICB7VjRMMl9QSVhfRk1UX1lWVTQxMCwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9ZVlU0MjAsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfWVZVNDIwTSwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9ZVVlWLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1lZVVYsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfWVZZVSwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9VWVZZLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1ZZVVksIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfWVVWNDIyUCwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9ZVVY0MTFQLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1k0MVAsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfWVVWNDQ0LCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1lVVjU1NSwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9ZVVY1NjUsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfWVVWMzIsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfWVVWNDEwLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1lVVjQyMCwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9ZVVY0MjBNLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX0hJMjQwLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX0hNMTIsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfTTQyMCwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKworICAvKiB0d28gcGxhbmVzIC0tIG9uZSBZLCBvbmUgQ3IgKyBDYiBpbnRlcmxlYXZlZCAgKi8KKyAge1Y0TDJfUElYX0ZNVF9OVjEyLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX05WMTJNLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX05WMTJNVCwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9OVjEyTVRfMTZYMTYsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfTlYyMSwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9OVjIxTSwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9OVjE2LCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX05WMTZNLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX05WNjEsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfTlY2MU0sIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfTlYyNCwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9OVjQyLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorCisgIC8qIEJheWVyIGZvcm1hdHMgLSBzZWUgaHR0cDovL3d3dy5zaWxpY29uaW1hZ2luZy5jb20vUkdCJTIwQmF5ZXIuaHRtICovCisgIHtWNEwyX1BJWF9GTVRfU0JHR1I4LCBUUlVFLCBHU1RfVjRMMl9DT0RFQ30sCisgIHtWNEwyX1BJWF9GTVRfU0dCUkc4LCBUUlVFLCBHU1RfVjRMMl9DT0RFQ30sCisgIHtWNEwyX1BJWF9GTVRfU0dSQkc4LCBUUlVFLCBHU1RfVjRMMl9DT0RFQ30sCisgIHtWNEwyX1BJWF9GTVRfU1JHR0I4LCBUUlVFLCBHU1RfVjRMMl9DT0RFQ30sCisKKyAgLyogY29tcHJlc3NlZCBmb3JtYXRzICovCisgIHtWNEwyX1BJWF9GTVRfTUpQRUcsIEZBTFNFLCBHU1RfVjRMMl9DT0RFQ30sCisgIHtWNEwyX1BJWF9GTVRfSlBFRywgRkFMU0UsIEdTVF9WNEwyX0NPREVDfSwKKyAge1Y0TDJfUElYX0ZNVF9QSlBHLCBGQUxTRSwgR1NUX1Y0TDJfQ09ERUN9LAorICB7VjRMMl9QSVhfRk1UX0RWLCBGQUxTRSwgR1NUX1Y0TDJfVFJBTlNQT1JUfSwKKyAge1Y0TDJfUElYX0ZNVF9NUEVHLCBGQUxTRSwgR1NUX1Y0TDJfVFJBTlNQT1JUfSwKKyAge1Y0TDJfUElYX0ZNVF9IMjY0LCBGQUxTRSwgR1NUX1Y0TDJfQ09ERUN9LAorICB7VjRMMl9QSVhfRk1UX0gyNjRfTk9fU0MsIEZBTFNFLCBHU1RfVjRMMl9DT0RFQ30sCisgIHtWNEwyX1BJWF9GTVRfSDI2NF9NVkMsIEZBTFNFLCBHU1RfVjRMMl9DT0RFQ30sCisgIHtWNEwyX1BJWF9GTVRfSDI2MywgRkFMU0UsIEdTVF9WNEwyX0NPREVDfSwKKyAge1Y0TDJfUElYX0ZNVF9NUEVHMSwgRkFMU0UsIEdTVF9WNEwyX0NPREVDfSwKKyAge1Y0TDJfUElYX0ZNVF9NUEVHMiwgRkFMU0UsIEdTVF9WNEwyX0NPREVDfSwKKyAge1Y0TDJfUElYX0ZNVF9NUEVHNCwgRkFMU0UsIEdTVF9WNEwyX0NPREVDfSwKKyAge1Y0TDJfUElYX0ZNVF9YVklELCBGQUxTRSwgR1NUX1Y0TDJfQ09ERUN9LAorICB7VjRMMl9QSVhfRk1UX1ZDMV9BTk5FWF9HLCBGQUxTRSwgR1NUX1Y0TDJfQ09ERUN9LAorICB7VjRMMl9QSVhfRk1UX1ZDMV9BTk5FWF9MLCBGQUxTRSwgR1NUX1Y0TDJfQ09ERUN9LAorICB7VjRMMl9QSVhfRk1UX1ZQOCwgRkFMU0UsIEdTVF9WNEwyX0NPREVDIHwgR1NUX1Y0TDJfTk9fUEFSU0V9LAorICB7VjRMMl9QSVhfRk1UX1ZQOSwgRkFMU0UsIEdTVF9WNEwyX0NPREVDIHwgR1NUX1Y0TDJfTk9fUEFSU0V9LAorCisgIC8qICBWZW5kb3Itc3BlY2lmaWMgZm9ybWF0cyAgICovCisgIHtWNEwyX1BJWF9GTVRfV05WQSwgVFJVRSwgR1NUX1Y0TDJfQ09ERUN9LAorICB7VjRMMl9QSVhfRk1UX1NOOUMxMFgsIFRSVUUsIEdTVF9WNEwyX0NPREVDfSwKKyAge1Y0TDJfUElYX0ZNVF9QV0MxLCBUUlVFLCBHU1RfVjRMMl9DT0RFQ30sCisgIHtWNEwyX1BJWF9GTVRfUFdDMiwgVFJVRSwgR1NUX1Y0TDJfQ09ERUN9LAorfTsKKworI2RlZmluZSBHU1RfVjRMMl9GT1JNQVRfQ09VTlQgKEdfTl9FTEVNRU5UUyAoZ3N0X3Y0bDJfZm9ybWF0cykpCisKK3N0YXRpYyBHU0xpc3QgKmdzdF92NGwyX29iamVjdF9nZXRfZm9ybWF0X2xpc3QgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KTsKKworCisjZGVmaW5lIEdTVF9UWVBFX1Y0TDJfREVWSUNFX0ZMQUdTIChnc3RfdjRsMl9kZXZpY2VfZ2V0X3R5cGUgKCkpCitzdGF0aWMgR1R5cGUKK2dzdF92NGwyX2RldmljZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIHY0bDJfZGV2aWNlX3R5cGUgPSAwOworCisgIGlmICh2NGwyX2RldmljZV90eXBlID09IDApIHsKKyAgICBzdGF0aWMgY29uc3QgR0ZsYWdzVmFsdWUgdmFsdWVzW10gPSB7CisgICAgICB7VjRMMl9DQVBfVklERU9fQ0FQVFVSRSwgIkRldmljZSBzdXBwb3J0cyB2aWRlbyBjYXB0dXJlIiwgImNhcHR1cmUifSwKKyAgICAgIHtWNEwyX0NBUF9WSURFT19PVVRQVVQsICJEZXZpY2Ugc3VwcG9ydHMgdmlkZW8gcGxheWJhY2siLCAib3V0cHV0In0sCisgICAgICB7VjRMMl9DQVBfVklERU9fT1ZFUkxBWSwgIkRldmljZSBzdXBwb3J0cyB2aWRlbyBvdmVybGF5IiwgIm92ZXJsYXkifSwKKworICAgICAge1Y0TDJfQ0FQX1ZCSV9DQVBUVVJFLCAiRGV2aWNlIHN1cHBvcnRzIHRoZSBWQkkgY2FwdHVyZSIsICJ2YmktY2FwdHVyZSJ9LAorICAgICAge1Y0TDJfQ0FQX1ZCSV9PVVRQVVQsICJEZXZpY2Ugc3VwcG9ydHMgdGhlIFZCSSBvdXRwdXQiLCAidmJpLW91dHB1dCJ9LAorCisgICAgICB7VjRMMl9DQVBfVFVORVIsICJEZXZpY2UgaGFzIGEgdHVuZXIgb3IgbW9kdWxhdG9yIiwgInR1bmVyIn0sCisgICAgICB7VjRMMl9DQVBfQVVESU8sICJEZXZpY2UgaGFzIGF1ZGlvIGlucHV0cyBvciBvdXRwdXRzIiwgImF1ZGlvIn0sCisKKyAgICAgIHswLCBOVUxMLCBOVUxMfQorICAgIH07CisKKyAgICB2NGwyX2RldmljZV90eXBlID0KKyAgICAgICAgZ19mbGFnc19yZWdpc3Rlcl9zdGF0aWMgKCJHc3RWNGwyRGV2aWNlVHlwZUZsYWdzIiwgdmFsdWVzKTsKKyAgfQorCisgIHJldHVybiB2NGwyX2RldmljZV90eXBlOworfQorCisjZGVmaW5lIEdTVF9UWVBFX1Y0TDJfVFZfTk9STSAoZ3N0X3Y0bDJfdHZfbm9ybV9nZXRfdHlwZSAoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X3Y0bDJfdHZfbm9ybV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIHY0bDJfdHZfbm9ybSA9IDA7CisKKyAgaWYgKCF2NGwyX3R2X25vcm0pIHsKKyAgICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSB0dl9ub3Jtc1tdID0geworICAgICAgezAsICJub25lIiwgIm5vbmUifSwKKworICAgICAge1Y0TDJfU1REX05UU0MsICJOVFNDIiwgIk5UU0MifSwKKyAgICAgIHtWNEwyX1NURF9OVFNDX00sICJOVFNDLU0iLCAiTlRTQy1NIn0sCisgICAgICB7VjRMMl9TVERfTlRTQ19NX0pQLCAiTlRTQy1NLUpQIiwgIk5UU0MtTS1KUCJ9LAorICAgICAge1Y0TDJfU1REX05UU0NfTV9LUiwgIk5UU0MtTS1LUiIsICJOVFNDLU0tS1IifSwKKyAgICAgIHtWNEwyX1NURF9OVFNDXzQ0MywgIk5UU0MtNDQzIiwgIk5UU0MtNDQzIn0sCisKKyAgICAgIHtWNEwyX1NURF9QQUwsICJQQUwiLCAiUEFMIn0sCisgICAgICB7VjRMMl9TVERfUEFMX0JHLCAiUEFMLUJHIiwgIlBBTC1CRyJ9LAorICAgICAge1Y0TDJfU1REX1BBTF9CLCAiUEFMLUIiLCAiUEFMLUIifSwKKyAgICAgIHtWNEwyX1NURF9QQUxfQjEsICJQQUwtQjEiLCAiUEFMLUIxIn0sCisgICAgICB7VjRMMl9TVERfUEFMX0csICJQQUwtRyIsICJQQUwtRyJ9LAorICAgICAge1Y0TDJfU1REX1BBTF9ILCAiUEFMLUgiLCAiUEFMLUgifSwKKyAgICAgIHtWNEwyX1NURF9QQUxfSSwgIlBBTC1JIiwgIlBBTC1JIn0sCisgICAgICB7VjRMMl9TVERfUEFMX0RLLCAiUEFMLURLIiwgIlBBTC1ESyJ9LAorICAgICAge1Y0TDJfU1REX1BBTF9ELCAiUEFMLUQiLCAiUEFMLUQifSwKKyAgICAgIHtWNEwyX1NURF9QQUxfRDEsICJQQUwtRDEiLCAiUEFMLUQxIn0sCisgICAgICB7VjRMMl9TVERfUEFMX0ssICJQQUwtSyIsICJQQUwtSyJ9LAorICAgICAge1Y0TDJfU1REX1BBTF9NLCAiUEFMLU0iLCAiUEFMLU0ifSwKKyAgICAgIHtWNEwyX1NURF9QQUxfTiwgIlBBTC1OIiwgIlBBTC1OIn0sCisgICAgICB7VjRMMl9TVERfUEFMX05jLCAiUEFMLU5jIiwgIlBBTC1OYyJ9LAorICAgICAge1Y0TDJfU1REX1BBTF82MCwgIlBBTC02MCIsICJQQUwtNjAifSwKKworICAgICAge1Y0TDJfU1REX1NFQ0FNLCAiU0VDQU0iLCAiU0VDQU0ifSwKKyAgICAgIHtWNEwyX1NURF9TRUNBTV9CLCAiU0VDQU0tQiIsICJTRUNBTS1CIn0sCisgICAgICB7VjRMMl9TVERfU0VDQU1fRywgIlNFQ0FNLUciLCAiU0VDQU0tRyJ9LAorICAgICAge1Y0TDJfU1REX1NFQ0FNX0gsICJTRUNBTS1IIiwgIlNFQ0FNLUgifSwKKyAgICAgIHtWNEwyX1NURF9TRUNBTV9ESywgIlNFQ0FNLURLIiwgIlNFQ0FNLURLIn0sCisgICAgICB7VjRMMl9TVERfU0VDQU1fRCwgIlNFQ0FNLUQiLCAiU0VDQU0tRCJ9LAorICAgICAge1Y0TDJfU1REX1NFQ0FNX0ssICJTRUNBTS1LIiwgIlNFQ0FNLUsifSwKKyAgICAgIHtWNEwyX1NURF9TRUNBTV9LMSwgIlNFQ0FNLUsxIiwgIlNFQ0FNLUsxIn0sCisgICAgICB7VjRMMl9TVERfU0VDQU1fTCwgIlNFQ0FNLUwiLCAiU0VDQU0tTCJ9LAorICAgICAge1Y0TDJfU1REX1NFQ0FNX0xDLCAiU0VDQU0tTGMiLCAiU0VDQU0tTGMifSwKKworICAgICAgezAsIE5VTEwsIE5VTEx9CisgICAgfTsKKworICAgIHY0bDJfdHZfbm9ybSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJWNEwyX1RWX25vcm1zIiwgdHZfbm9ybXMpOworICB9CisKKyAgcmV0dXJuIHY0bDJfdHZfbm9ybTsKK30KKworR1R5cGUKK2dzdF92NGwyX2lvX21vZGVfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSB2NGwyX2lvX21vZGUgPSAwOworCisgIGlmICghdjRsMl9pb19tb2RlKSB7CisgICAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgaW9fbW9kZXNbXSA9IHsKKyAgICAgIHtHU1RfVjRMMl9JT19BVVRPLCAiR1NUX1Y0TDJfSU9fQVVUTyIsICJhdXRvIn0sCisgICAgICB7R1NUX1Y0TDJfSU9fUlcsICJHU1RfVjRMMl9JT19SVyIsICJydyJ9LAorICAgICAge0dTVF9WNEwyX0lPX01NQVAsICJHU1RfVjRMMl9JT19NTUFQIiwgIm1tYXAifSwKKyAgICAgIHtHU1RfVjRMMl9JT19VU0VSUFRSLCAiR1NUX1Y0TDJfSU9fVVNFUlBUUiIsICJ1c2VycHRyIn0sCisgICAgICB7R1NUX1Y0TDJfSU9fRE1BQlVGLCAiR1NUX1Y0TDJfSU9fRE1BQlVGIiwgImRtYWJ1ZiJ9LAorICAgICAge0dTVF9WNEwyX0lPX0RNQUJVRl9JTVBPUlQsICJHU1RfVjRMMl9JT19ETUFCVUZfSU1QT1JUIiwKKyAgICAgICAgICAiZG1hYnVmLWltcG9ydCJ9LAorCisgICAgICB7MCwgTlVMTCwgTlVMTH0KKyAgICB9OworICAgIHY0bDJfaW9fbW9kZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RWNGwySU9Nb2RlIiwgaW9fbW9kZXMpOworICB9CisgIHJldHVybiB2NGwyX2lvX21vZGU7Cit9CisKK3ZvaWQKK2dzdF92NGwyX29iamVjdF9pbnN0YWxsX3Byb3BlcnRpZXNfaGVscGVyIChHT2JqZWN0Q2xhc3MgKiBnb2JqZWN0X2NsYXNzLAorICAgIGNvbnN0IGNoYXIgKmRlZmF1bHRfZGV2aWNlKQoreworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RFVklDRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJkZXZpY2UiLCAiRGV2aWNlIiwgIkRldmljZSBsb2NhdGlvbiIsCisgICAgICAgICAgZGVmYXVsdF9kZXZpY2UsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RFVklDRV9OQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImRldmljZS1uYW1lIiwgIkRldmljZSBuYW1lIiwKKyAgICAgICAgICAiTmFtZSBvZiB0aGUgZGV2aWNlIiwgREVGQVVMVF9QUk9QX0RFVklDRV9OQU1FLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfREVWSUNFX0ZELAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImRldmljZS1mZCIsICJGaWxlIGRlc2NyaXB0b3IiLAorICAgICAgICAgICJGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGRldmljZSIsIC0xLCBHX01BWElOVCwgREVGQVVMVF9QUk9QX0RFVklDRV9GRCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0ZMQUdTLAorICAgICAgZ19wYXJhbV9zcGVjX2ZsYWdzICgiZmxhZ3MiLCAiRmxhZ3MiLCAiRGV2aWNlIHR5cGUgZmxhZ3MiLAorICAgICAgICAgIEdTVF9UWVBFX1Y0TDJfREVWSUNFX0ZMQUdTLCBERUZBVUxUX1BST1BfRkxBR1MsCisgICAgICAgICAgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0VjRsMlNyYzpicmlnaHRuZXNzOgorICAgKgorICAgKiBQaWN0dXJlIGJyaWdodG5lc3MsIG9yIG1vcmUgcHJlY2lzZWx5LCB0aGUgYmxhY2sgbGV2ZWwKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQlJJR0hUTkVTUywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJicmlnaHRuZXNzIiwgIkJyaWdodG5lc3MiLAorICAgICAgICAgICJQaWN0dXJlIGJyaWdodG5lc3MsIG9yIG1vcmUgcHJlY2lzZWx5LCB0aGUgYmxhY2sgbGV2ZWwiLCBHX01JTklOVCwKKyAgICAgICAgICBHX01BWElOVCwgMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIC8qKgorICAgKiBHc3RWNGwyU3JjOmNvbnRyYXN0OgorICAgKgorICAgKiBQaWN0dXJlIGNvbnRyYXN0IG9yIGx1bWEgZ2FpbgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DT05UUkFTVCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJjb250cmFzdCIsICJDb250cmFzdCIsCisgICAgICAgICAgIlBpY3R1cmUgY29udHJhc3Qgb3IgbHVtYSBnYWluIiwgR19NSU5JTlQsCisgICAgICAgICAgR19NQVhJTlQsIDAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSkpOworICAvKioKKyAgICogR3N0VjRsMlNyYzpzYXR1cmF0aW9uOgorICAgKgorICAgKiBQaWN0dXJlIGNvbG9yIHNhdHVyYXRpb24gb3IgY2hyb21hIGdhaW4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU0FUVVJBVElPTiwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJzYXR1cmF0aW9uIiwgIlNhdHVyYXRpb24iLAorICAgICAgICAgICJQaWN0dXJlIGNvbG9yIHNhdHVyYXRpb24gb3IgY2hyb21hIGdhaW4iLCBHX01JTklOVCwKKyAgICAgICAgICBHX01BWElOVCwgMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIC8qKgorICAgKiBHc3RWNGwyU3JjOmh1ZToKKyAgICoKKyAgICogSHVlIG9yIGNvbG9yIGJhbGFuY2UKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSFVFLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImh1ZSIsICJIdWUiLAorICAgICAgICAgICJIdWUgb3IgY29sb3IgYmFsYW5jZSIsIEdfTUlOSU5ULAorICAgICAgICAgIEdfTUFYSU5ULCAwLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKworICAvKioKKyAgICogR3N0VjRsMlNyYzpub3JtOgorICAgKgorICAgKiBUViBub3JtCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RWX05PUk0sCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoIm5vcm0iLCAiVFYgbm9ybSIsCisgICAgICAgICAgInZpZGVvIHN0YW5kYXJkIiwKKyAgICAgICAgICBHU1RfVFlQRV9WNEwyX1RWX05PUk0sIERFRkFVTFRfUFJPUF9UVl9OT1JNLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RWNGwyU3JjOmlvLW1vZGU6CisgICAqCisgICAqIElPIE1vZGUKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSU9fTU9ERSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgiaW8tbW9kZSIsICJJTyBtb2RlIiwKKyAgICAgICAgICAiSS9PIG1vZGUiLAorICAgICAgICAgIEdTVF9UWVBFX1Y0TDJfSU9fTU9ERSwgREVGQVVMVF9QUk9QX0lPX01PREUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFY0bDJTcmM6ZXh0cmEtY29udHJvbHM6CisgICAqCisgICAqIEFkZGl0aW9uYWwgdjRsMiBjb250cm9scyBmb3IgdGhlIGRldmljZS4gVGhlIGNvbnRyb2xzIGFyZSBpZGVudGlmaWVkCisgICAqIGJ5IHRoZSBjb250cm9sIG5hbWUgKGxvd2VyY2FzZSB3aXRoICdfJyBmb3IgYW55IG5vbi1hbHBoYW51bWVyaWMKKyAgICogY2hhcmFjdGVycykuCisgICAqCisgICAqIFNpbmNlOiAxLjIKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRVhUUkFfQ09OVFJPTFMsCisgICAgICBnX3BhcmFtX3NwZWNfYm94ZWQgKCJleHRyYS1jb250cm9scyIsICJFeHRyYSBDb250cm9scyIsCisgICAgICAgICAgIkV4dHJhIHY0bDIgY29udHJvbHMgKENJRHMpIGZvciB0aGUgZGV2aWNlIiwKKyAgICAgICAgICBHU1RfVFlQRV9TVFJVQ1RVUkUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RWNGwyU3JjOnBpeGVsLWFzcGVjdC1yYXRpbzoKKyAgICoKKyAgICogVGhlIHBpeGVsIGFzcGVjdCByYXRpbyBvZiB0aGUgZGV2aWNlLiBUaGlzIG92ZXJ3cml0ZXMgdGhlIHBpeGVsIGFzcGVjdAorICAgKiByYXRpbyBxdWVyaWVkIGZyb20gdGhlIGRldmljZS4KKyAgICoKKyAgICogU2luY2U6IDEuMgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QSVhFTF9BU1BFQ1RfUkFUSU8sCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgicGl4ZWwtYXNwZWN0LXJhdGlvIiwgIlBpeGVsIEFzcGVjdCBSYXRpbyIsCisgICAgICAgICAgIk92ZXJ3cml0ZSB0aGUgcGl4ZWwgYXNwZWN0IHJhdGlvIG9mIHRoZSBkZXZpY2UiLCAiMS8xIiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0VjRsMlNyYzpmb3JjZS1hc3BlY3QtcmF0aW86CisgICAqCisgICAqIFdoZW4gZW5hYmxlZCwgdGhlIHBpeGVsIGFzcGVjdCByYXRpbyBxdWVyaWVkIGZyb20gdGhlIGRldmljZSBvciBzZXQKKyAgICogd2l0aCB0aGUgcGl4ZWwtYXNwZWN0LXJhdGlvIHByb3BlcnR5IHdpbGwgYmUgZW5mb3JjZWQuCisgICAqCisgICAqIFNpbmNlOiAxLjIKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRk9SQ0VfQVNQRUNUX1JBVElPLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJmb3JjZS1hc3BlY3QtcmF0aW8iLCAiRm9yY2UgYXNwZWN0IHJhdGlvIiwKKyAgICAgICAgICAiV2hlbiBlbmFibGVkLCB0aGUgcGl4ZWwgYXNwZWN0IHJhdGlvIHdpbGwgYmUgZW5mb3JjZWQiLCBUUlVFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCit9CisKK3ZvaWQKK2dzdF92NGwyX29iamVjdF9pbnN0YWxsX20ybV9wcm9wZXJ0aWVzX2hlbHBlciAoR09iamVjdENsYXNzICogZ29iamVjdF9jbGFzcykKK3sKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ERVZJQ0UsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZGV2aWNlIiwgIkRldmljZSIsICJEZXZpY2UgbG9jYXRpb24iLAorICAgICAgICAgIE5VTEwsIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ERVZJQ0VfTkFNRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJkZXZpY2UtbmFtZSIsICJEZXZpY2UgbmFtZSIsCisgICAgICAgICAgIk5hbWUgb2YgdGhlIGRldmljZSIsIERFRkFVTFRfUFJPUF9ERVZJQ0VfTkFNRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfREVWSUNFX0ZELAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImRldmljZS1mZCIsICJGaWxlIGRlc2NyaXB0b3IiLAorICAgICAgICAgICJGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGRldmljZSIsIC0xLCBHX01BWElOVCwgREVGQVVMVF9QUk9QX0RFVklDRV9GRCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfT1VUUFVUX0lPX01PREUsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoIm91dHB1dC1pby1tb2RlIiwgIk91dHB1dCBJTyBtb2RlIiwKKyAgICAgICAgICAiT3V0cHV0IHNpZGUgSS9PIG1vZGUgKG1hdGNoZXMgc2luayBwYWQpIiwKKyAgICAgICAgICBHU1RfVFlQRV9WNEwyX0lPX01PREUsIERFRkFVTFRfUFJPUF9JT19NT0RFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ0FQVFVSRV9JT19NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJjYXB0dXJlLWlvLW1vZGUiLCAiQ2FwdHVyZSBJTyBtb2RlIiwKKyAgICAgICAgICAiQ2FwdHVyZSBJL08gbW9kZSAobWF0Y2hlcyBzcmMgcGFkKSIsCisgICAgICAgICAgR1NUX1RZUEVfVjRMMl9JT19NT0RFLCBERUZBVUxUX1BST1BfSU9fTU9ERSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0VYVFJBX0NPTlRST0xTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgiZXh0cmEtY29udHJvbHMiLCAiRXh0cmEgQ29udHJvbHMiLAorICAgICAgICAgICJFeHRyYSB2NGwyIGNvbnRyb2xzIChDSURzKSBmb3IgdGhlIGRldmljZSIsCisgICAgICAgICAgR1NUX1RZUEVfU1RSVUNUVVJFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKK30KKworR3N0VjRsMk9iamVjdCAqCitnc3RfdjRsMl9vYmplY3RfbmV3IChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RPYmplY3QgKiBkZWJ1Z19vYmplY3QsCisgICAgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUsCisgICAgY29uc3QgY2hhciAqZGVmYXVsdF9kZXZpY2UsCisgICAgR3N0VjRsMkdldEluT3V0RnVuY3Rpb24gZ2V0X2luX291dF9mdW5jLAorICAgIEdzdFY0bDJTZXRJbk91dEZ1bmN0aW9uIHNldF9pbl9vdXRfZnVuYywKKyAgICBHc3RWNGwyVXBkYXRlRnBzRnVuY3Rpb24gdXBkYXRlX2Zwc19mdW5jKQoreworICBHc3RWNGwyT2JqZWN0ICp2NGwyb2JqZWN0OworCisgIC8qCisgICAqIHNvbWUgZGVmYXVsdCB2YWx1ZXMKKyAgICovCisgIHY0bDJvYmplY3QgPSBnX25ldzAgKEdzdFY0bDJPYmplY3QsIDEpOworCisgIHY0bDJvYmplY3QtPnR5cGUgPSB0eXBlOworICB2NGwyb2JqZWN0LT5mb3JtYXRzID0gTlVMTDsKKworICB2NGwyb2JqZWN0LT5lbGVtZW50ID0gZWxlbWVudDsKKyAgdjRsMm9iamVjdC0+ZGJnX29iaiA9IGRlYnVnX29iamVjdDsKKyAgdjRsMm9iamVjdC0+Z2V0X2luX291dF9mdW5jID0gZ2V0X2luX291dF9mdW5jOworICB2NGwyb2JqZWN0LT5zZXRfaW5fb3V0X2Z1bmMgPSBzZXRfaW5fb3V0X2Z1bmM7CisgIHY0bDJvYmplY3QtPnVwZGF0ZV9mcHNfZnVuYyA9IHVwZGF0ZV9mcHNfZnVuYzsKKworICB2NGwyb2JqZWN0LT52aWRlb19mZCA9IC0xOworICB2NGwyb2JqZWN0LT5hY3RpdmUgPSBGQUxTRTsKKyAgdjRsMm9iamVjdC0+dmlkZW9kZXYgPSBnX3N0cmR1cCAoZGVmYXVsdF9kZXZpY2UpOworCisgIHY0bDJvYmplY3QtPm5vcm1zID0gTlVMTDsKKyAgdjRsMm9iamVjdC0+Y2hhbm5lbHMgPSBOVUxMOworICB2NGwyb2JqZWN0LT5jb2xvcnMgPSBOVUxMOworCisgIHY0bDJvYmplY3QtPmtlZXBfYXNwZWN0ID0gVFJVRTsKKworICB2NGwyb2JqZWN0LT5uX3Y0bDJfcGxhbmVzID0gMDsKKworICB2NGwyb2JqZWN0LT5ub19pbml0aWFsX2Zvcm1hdCA9IEZBTFNFOworCisgIC8qIFdlIG5vdyBkaXNhYmxlIGxpYnY0bDIgYnkgZGVmYXVsdCwgYnV0IGhhdmUgYW4gZW52IHRvIGVuYWJsZSBpdC4gKi8KKyNpZmRlZiBIQVZFX0xJQlY0TDIKKyAgaWYgKGdfZ2V0ZW52ICgiR1NUX1Y0TDJfVVNFX0xJQlY0TDIiKSkgeworICAgIHY0bDJvYmplY3QtPmZkX29wZW4gPSB2NGwyX2ZkX29wZW47CisgICAgdjRsMm9iamVjdC0+Y2xvc2UgPSB2NGwyX2Nsb3NlOworICAgIHY0bDJvYmplY3QtPmR1cCA9IHY0bDJfZHVwOworICAgIHY0bDJvYmplY3QtPmlvY3RsID0gdjRsMl9pb2N0bDsKKyAgICB2NGwyb2JqZWN0LT5yZWFkID0gdjRsMl9yZWFkOworICAgIHY0bDJvYmplY3QtPm1tYXAgPSB2NGwyX21tYXA7CisgICAgdjRsMm9iamVjdC0+bXVubWFwID0gdjRsMl9tdW5tYXA7CisgIH0gZWxzZQorI2VuZGlmCisgIHsKKyAgICB2NGwyb2JqZWN0LT5mZF9vcGVuID0gTlVMTDsKKyAgICB2NGwyb2JqZWN0LT5jbG9zZSA9IGNsb3NlOworICAgIHY0bDJvYmplY3QtPmR1cCA9IGR1cDsKKyAgICB2NGwyb2JqZWN0LT5pb2N0bCA9IGlvY3RsOworICAgIHY0bDJvYmplY3QtPnJlYWQgPSByZWFkOworICAgIHY0bDJvYmplY3QtPm1tYXAgPSBtbWFwOworICAgIHY0bDJvYmplY3QtPm11bm1hcCA9IG11bm1hcDsKKyAgfQorCisgIHJldHVybiB2NGwyb2JqZWN0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3Y0bDJfb2JqZWN0X2NsZWFyX2Zvcm1hdF9saXN0IChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCk7CisKKwordm9pZAorZ3N0X3Y0bDJfb2JqZWN0X2Rlc3Ryb3kgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KQoreworICBnX3JldHVybl9pZl9mYWlsICh2NGwyb2JqZWN0ICE9IE5VTEwpOworCisgIGdfZnJlZSAodjRsMm9iamVjdC0+dmlkZW9kZXYpOworCisgIGdfZnJlZSAodjRsMm9iamVjdC0+Y2hhbm5lbCk7CisKKyAgaWYgKHY0bDJvYmplY3QtPmZvcm1hdHMpIHsKKyAgICBnc3RfdjRsMl9vYmplY3RfY2xlYXJfZm9ybWF0X2xpc3QgKHY0bDJvYmplY3QpOworICB9CisKKyAgaWYgKHY0bDJvYmplY3QtPnByb2JlZF9jYXBzKSB7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHY0bDJvYmplY3QtPnByb2JlZF9jYXBzKTsKKyAgfQorCisgIGlmICh2NGwyb2JqZWN0LT5leHRyYV9jb250cm9scykgeworICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAodjRsMm9iamVjdC0+ZXh0cmFfY29udHJvbHMpOworICB9CisKKyAgZ19mcmVlICh2NGwyb2JqZWN0KTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX29iamVjdF9jbGVhcl9mb3JtYXRfbGlzdCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpCit7CisgIGdfc2xpc3RfZm9yZWFjaCAodjRsMm9iamVjdC0+Zm9ybWF0cywgKEdGdW5jKSBnX2ZyZWUsIE5VTEwpOworICBnX3NsaXN0X2ZyZWUgKHY0bDJvYmplY3QtPmZvcm1hdHMpOworICB2NGwyb2JqZWN0LT5mb3JtYXRzID0gTlVMTDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdpbnQKK2dzdF92NGwyX29iamVjdF9wcm9wX3RvX2NpZCAoZ3VpbnQgcHJvcF9pZCkKK3sKKyAgZ2ludCBjaWQgPSAtMTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQlJJR0hUTkVTUzoKKyAgICAgIGNpZCA9IFY0TDJfQ0lEX0JSSUdIVE5FU1M7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ09OVFJBU1Q6CisgICAgICBjaWQgPSBWNEwyX0NJRF9DT05UUkFTVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TQVRVUkFUSU9OOgorICAgICAgY2lkID0gVjRMMl9DSURfU0FUVVJBVElPTjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9IVUU6CisgICAgICBjaWQgPSBWNEwyX0NJRF9IVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX1dBUk5JTkcgKCJ1bm1hcHBlZCBwcm9wZXJ0eSBpZDogJWQiLCBwcm9wX2lkKTsKKyAgfQorICByZXR1cm4gY2lkOworfQorCisKK2dib29sZWFuCitnc3RfdjRsMl9vYmplY3Rfc2V0X3Byb3BlcnR5X2hlbHBlciAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RFVklDRToKKyAgICAgIGdfZnJlZSAodjRsMm9iamVjdC0+dmlkZW9kZXYpOworICAgICAgdjRsMm9iamVjdC0+dmlkZW9kZXYgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CUklHSFRORVNTOgorICAgIGNhc2UgUFJPUF9DT05UUkFTVDoKKyAgICBjYXNlIFBST1BfU0FUVVJBVElPTjoKKyAgICBjYXNlIFBST1BfSFVFOgorICAgIHsKKyAgICAgIGdpbnQgY2lkID0gZ3N0X3Y0bDJfb2JqZWN0X3Byb3BfdG9fY2lkIChwcm9wX2lkKTsKKworICAgICAgaWYgKGNpZCAhPSAtMSkgeworICAgICAgICBpZiAoR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCkpIHsKKyAgICAgICAgICBnc3RfdjRsMl9zZXRfYXR0cmlidXRlICh2NGwyb2JqZWN0LCBjaWQsIGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RWX05PUk06CisgICAgICB2NGwyb2JqZWN0LT50dl9ub3JtID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisjaWYgMAorICAgIGNhc2UgUFJPUF9DSEFOTkVMOgorICAgICAgaWYgKEdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKSB7CisgICAgICAgIEdzdFR1bmVyICp0dW5lciA9IEdTVF9UVU5FUiAodjRsMm9iamVjdC0+ZWxlbWVudCk7CisgICAgICAgIEdzdFR1bmVyQ2hhbm5lbCAqY2hhbm5lbCA9IGdzdF90dW5lcl9maW5kX2NoYW5uZWxfYnlfbmFtZSAodHVuZXIsCisgICAgICAgICAgICAoZ2NoYXIgKikgZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSkpOworCisgICAgICAgIGlmIChjaGFubmVsKSB7CisgICAgICAgICAgLyogbGlrZSBnc3RfdHVuZXJfc2V0X2NoYW5uZWwgKHR1bmVyLCBjaGFubmVsKQorICAgICAgICAgICAgIHdpdGhvdXQgZ19vYmplY3Rfbm90aWZ5ICovCisgICAgICAgICAgZ3N0X3Y0bDJfdHVuZXJfc2V0X2NoYW5uZWwgKHY0bDJvYmplY3QsIGNoYW5uZWwpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBnX2ZyZWUgKHY0bDJvYmplY3QtPmNoYW5uZWwpOworICAgICAgICB2NGwyb2JqZWN0LT5jaGFubmVsID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRlJFUVVFTkNZOgorICAgICAgaWYgKEdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKSB7CisgICAgICAgIEdzdFR1bmVyICp0dW5lciA9IEdTVF9UVU5FUiAodjRsMm9iamVjdC0+ZWxlbWVudCk7CisgICAgICAgIEdzdFR1bmVyQ2hhbm5lbCAqY2hhbm5lbCA9IGdzdF90dW5lcl9nZXRfY2hhbm5lbCAodHVuZXIpOworCisgICAgICAgIGlmIChjaGFubmVsICYmCisgICAgICAgICAgICBHU1RfVFVORVJfQ0hBTk5FTF9IQVNfRkxBRyAoY2hhbm5lbCwgR1NUX1RVTkVSX0NIQU5ORUxfRlJFUVVFTkNZKSkgeworICAgICAgICAgIC8qIGxpa2UKKyAgICAgICAgICAgICBnc3RfdHVuZXJfc2V0X2ZyZXF1ZW5jeSAodHVuZXIsIGNoYW5uZWwsIGdfdmFsdWVfZ2V0X3Vsb25nICh2YWx1ZSkpCisgICAgICAgICAgICAgd2l0aG91dCBnX29iamVjdF9ub3RpZnkgKi8KKyAgICAgICAgICBnc3RfdjRsMl90dW5lcl9zZXRfZnJlcXVlbmN5ICh2NGwyb2JqZWN0LCBjaGFubmVsLAorICAgICAgICAgICAgICBnX3ZhbHVlX2dldF91bG9uZyAodmFsdWUpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdjRsMm9iamVjdC0+ZnJlcXVlbmN5ID0gZ192YWx1ZV9nZXRfdWxvbmcgKHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICBjYXNlIFBST1BfSU9fTU9ERToKKyAgICAgIHY0bDJvYmplY3QtPnJlcV9tb2RlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NBUFRVUkVfSU9fTU9ERToKKyAgICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsICghVjRMMl9UWVBFX0lTX09VVFBVVCAodjRsMm9iamVjdC0+dHlwZSksIEZBTFNFKTsKKyAgICAgIHY0bDJvYmplY3QtPnJlcV9tb2RlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX09VVFBVVF9JT19NT0RFOgorICAgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFY0TDJfVFlQRV9JU19PVVRQVVQgKHY0bDJvYmplY3QtPnR5cGUpLCBGQUxTRSk7CisgICAgICB2NGwyb2JqZWN0LT5yZXFfbW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9FWFRSQV9DT05UUk9MUzp7CisgICAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfdmFsdWVfZ2V0X3N0cnVjdHVyZSAodmFsdWUpOworCisgICAgICBpZiAodjRsMm9iamVjdC0+ZXh0cmFfY29udHJvbHMpCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAodjRsMm9iamVjdC0+ZXh0cmFfY29udHJvbHMpOworCisgICAgICB2NGwyb2JqZWN0LT5leHRyYV9jb250cm9scyA9IHMgPyBnc3Rfc3RydWN0dXJlX2NvcHkgKHMpIDogTlVMTDsKKyAgICAgIGlmIChHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSkKKyAgICAgICAgZ3N0X3Y0bDJfc2V0X2NvbnRyb2xzICh2NGwyb2JqZWN0LCB2NGwyb2JqZWN0LT5leHRyYV9jb250cm9scyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX1BJWEVMX0FTUEVDVF9SQVRJTzoKKyAgICAgIGlmICh2NGwyb2JqZWN0LT5wYXIpIHsKKyAgICAgICAgZ192YWx1ZV91bnNldCAodjRsMm9iamVjdC0+cGFyKTsKKyAgICAgICAgZ19mcmVlICh2NGwyb2JqZWN0LT5wYXIpOworICAgICAgfQorICAgICAgdjRsMm9iamVjdC0+cGFyID0gZ19uZXcwIChHVmFsdWUsIDEpOworICAgICAgZ192YWx1ZV9pbml0ICh2NGwyb2JqZWN0LT5wYXIsIEdTVF9UWVBFX0ZSQUNUSU9OKTsKKyAgICAgIGlmICghZ192YWx1ZV90cmFuc2Zvcm0gKHZhbHVlLCB2NGwyb2JqZWN0LT5wYXIpKSB7CisgICAgICAgIGdfd2FybmluZyAoIkNvdWxkIG5vdCB0cmFuc2Zvcm0gc3RyaW5nIHRvIGFzcGVjdCByYXRpbyIpOworICAgICAgICBnc3RfdmFsdWVfc2V0X2ZyYWN0aW9uICh2NGwyb2JqZWN0LT5wYXIsIDEsIDEpOworICAgICAgfQorCisgICAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAic2V0IFBBUiB0byAlZC8lZCIsCisgICAgICAgICAgZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9udW1lcmF0b3IgKHY0bDJvYmplY3QtPnBhciksCisgICAgICAgICAgZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9kZW5vbWluYXRvciAodjRsMm9iamVjdC0+cGFyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRk9SQ0VfQVNQRUNUX1JBVElPOgorICAgICAgdjRsMm9iamVjdC0+a2VlcF9hc3BlY3QgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKworZ2Jvb2xlYW4KK2dzdF92NGwyX29iamVjdF9nZXRfcHJvcGVydHlfaGVscGVyIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfREVWSUNFOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgdjRsMm9iamVjdC0+dmlkZW9kZXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RFVklDRV9OQU1FOgorICAgIHsKKyAgICAgIGNvbnN0IGd1Y2hhciAqbmV3ID0gTlVMTDsKKworICAgICAgaWYgKEdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKSB7CisgICAgICAgIG5ldyA9IHY0bDJvYmplY3QtPnZjYXAuY2FyZDsKKyAgICAgIH0gZWxzZSBpZiAoZ3N0X3Y0bDJfb3BlbiAodjRsMm9iamVjdCkpIHsKKyAgICAgICAgbmV3ID0gdjRsMm9iamVjdC0+dmNhcC5jYXJkOworICAgICAgICBnc3RfdjRsMl9jbG9zZSAodjRsMm9iamVjdCk7CisgICAgICB9CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCAoZ2NoYXIgKikgbmV3KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfREVWSUNFX0ZEOgorICAgIHsKKyAgICAgIGlmIChHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSkKKyAgICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdjRsMm9iamVjdC0+dmlkZW9fZmQpOworICAgICAgZWxzZQorICAgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBERUZBVUxUX1BST1BfREVWSUNFX0ZEKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfRkxBR1M6CisgICAgeworICAgICAgZ3VpbnQgZmxhZ3MgPSAwOworCisgICAgICBpZiAoR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCkpIHsKKyAgICAgICAgZmxhZ3MgfD0gdjRsMm9iamVjdC0+ZGV2aWNlX2NhcHMgJgorICAgICAgICAgICAgKFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAorICAgICAgICAgICAgVjRMMl9DQVBfVklERU9fT1VUUFVUIHwKKyAgICAgICAgICAgIFY0TDJfQ0FQX1ZJREVPX09WRVJMQVkgfAorICAgICAgICAgICAgVjRMMl9DQVBfVkJJX0NBUFRVUkUgfAorICAgICAgICAgICAgVjRMMl9DQVBfVkJJX09VVFBVVCB8IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfQVVESU8pOworCisgICAgICAgIGlmICh2NGwyb2JqZWN0LT5kZXZpY2VfY2FwcyAmIFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkVfTVBMQU5FKQorICAgICAgICAgIGZsYWdzIHw9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkU7CisKKyAgICAgICAgaWYgKHY0bDJvYmplY3QtPmRldmljZV9jYXBzICYgVjRMMl9DQVBfVklERU9fT1VUUFVUX01QTEFORSkKKyAgICAgICAgICBmbGFncyB8PSBWNEwyX0NBUF9WSURFT19PVVRQVVQ7CisgICAgICB9CisgICAgICBnX3ZhbHVlX3NldF9mbGFncyAodmFsdWUsIGZsYWdzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfQlJJR0hUTkVTUzoKKyAgICBjYXNlIFBST1BfQ09OVFJBU1Q6CisgICAgY2FzZSBQUk9QX1NBVFVSQVRJT046CisgICAgY2FzZSBQUk9QX0hVRToKKyAgICB7CisgICAgICBnaW50IGNpZCA9IGdzdF92NGwyX29iamVjdF9wcm9wX3RvX2NpZCAocHJvcF9pZCk7CisKKyAgICAgIGlmIChjaWQgIT0gLTEpIHsKKyAgICAgICAgaWYgKEdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKSB7CisgICAgICAgICAgZ2ludCB2OworICAgICAgICAgIGlmIChnc3RfdjRsMl9nZXRfYXR0cmlidXRlICh2NGwyb2JqZWN0LCBjaWQsICZ2KSkgeworICAgICAgICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVFZfTk9STToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCB2NGwyb2JqZWN0LT50dl9ub3JtKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JT19NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHY0bDJvYmplY3QtPnJlcV9tb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DQVBUVVJFX0lPX01PREU6CisgICAgICBnX3JldHVybl92YWxfaWZfZmFpbCAoIVY0TDJfVFlQRV9JU19PVVRQVVQgKHY0bDJvYmplY3QtPnR5cGUpLCBGQUxTRSk7CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgdjRsMm9iamVjdC0+cmVxX21vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX09VVFBVVF9JT19NT0RFOgorICAgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFY0TDJfVFlQRV9JU19PVVRQVVQgKHY0bDJvYmplY3QtPnR5cGUpLCBGQUxTRSk7CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgdjRsMm9iamVjdC0+cmVxX21vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0VYVFJBX0NPTlRST0xTOgorICAgICAgZ3N0X3ZhbHVlX3NldF9zdHJ1Y3R1cmUgKHZhbHVlLCB2NGwyb2JqZWN0LT5leHRyYV9jb250cm9scyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUElYRUxfQVNQRUNUX1JBVElPOgorICAgICAgaWYgKHY0bDJvYmplY3QtPnBhcikKKyAgICAgICAgZ192YWx1ZV90cmFuc2Zvcm0gKHY0bDJvYmplY3QtPnBhciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZPUkNFX0FTUEVDVF9SQVRJTzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCB2NGwyb2JqZWN0LT5rZWVwX2FzcGVjdCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9nZXRfZHJpdmVyX21pbl9idWZmZXJzIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCkKK3sKKyAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sID0geyAwLCB9OworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKTsKKworICBpZiAoVjRMMl9UWVBFX0lTX09VVFBVVCAodjRsMm9iamVjdC0+dHlwZSkpCisgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01JTl9CVUZGRVJTX0ZPUl9PVVRQVVQ7CisgIGVsc2UKKyAgICBjb250cm9sLmlkID0gVjRMMl9DSURfTUlOX0JVRkZFUlNfRk9SX0NBUFRVUkU7CisKKyAgaWYgKHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX0dfQ1RSTCwgJmNvbnRyb2wpID09IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLAorICAgICAgICAiZHJpdmVyIHJlcXVpcmVzIGEgbWluaW11bSBvZiAlZCBidWZmZXJzIiwgY29udHJvbC52YWx1ZSk7CisgICAgdjRsMm9iamVjdC0+bWluX2J1ZmZlcnMgPSBjb250cm9sLnZhbHVlOworICB9IGVsc2UgeworICAgIHY0bDJvYmplY3QtPm1pbl9idWZmZXJzID0gMDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfc2V0X2RlZmF1bHRzIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCkKK3sKKyAgR3N0VHVuZXJOb3JtICpub3JtID0gTlVMTDsKKyAgR3N0VHVuZXJDaGFubmVsICpjaGFubmVsID0gTlVMTDsKKyAgR3N0VHVuZXIgKnR1bmVyOworCisgIGlmICghR1NUX0lTX1RVTkVSICh2NGwyb2JqZWN0LT5lbGVtZW50KSkKKyAgICByZXR1cm47CisKKyAgdHVuZXIgPSBHU1RfVFVORVIgKHY0bDJvYmplY3QtPmVsZW1lbnQpOworCisgIGlmICh2NGwyb2JqZWN0LT50dl9ub3JtKQorICAgIG5vcm0gPSBnc3RfdjRsMl90dW5lcl9nZXRfbm9ybV9ieV9zdGRfaWQgKHY0bDJvYmplY3QsIHY0bDJvYmplY3QtPnR2X25vcm0pOworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAidHZfbm9ybT0weCUiIEdfR0lOVDY0X01PRElGSUVSICJ4LCAiCisgICAgICAibm9ybT0lcCIsIChndWludDY0KSB2NGwyb2JqZWN0LT50dl9ub3JtLCBub3JtKTsKKyAgaWYgKG5vcm0pIHsKKyAgICBnc3RfdHVuZXJfc2V0X25vcm0gKHR1bmVyLCBub3JtKTsKKyAgfSBlbHNlIHsKKyAgICBub3JtID0KKyAgICAgICAgR1NUX1RVTkVSX05PUk0gKGdzdF90dW5lcl9nZXRfbm9ybSAoR1NUX1RVTkVSICh2NGwyb2JqZWN0LT5lbGVtZW50KSkpOworICAgIGlmIChub3JtKSB7CisgICAgICB2NGwyb2JqZWN0LT50dl9ub3JtID0KKyAgICAgICAgICBnc3RfdjRsMl90dW5lcl9nZXRfc3RkX2lkX2J5X25vcm0gKHY0bDJvYmplY3QsIG5vcm0pOworICAgICAgZ3N0X3R1bmVyX25vcm1fY2hhbmdlZCAodHVuZXIsIG5vcm0pOworICAgIH0KKyAgfQorCisgIGlmICh2NGwyb2JqZWN0LT5jaGFubmVsKQorICAgIGNoYW5uZWwgPSBnc3RfdHVuZXJfZmluZF9jaGFubmVsX2J5X25hbWUgKHR1bmVyLCB2NGwyb2JqZWN0LT5jaGFubmVsKTsKKyAgaWYgKGNoYW5uZWwpIHsKKyAgICBnc3RfdHVuZXJfc2V0X2NoYW5uZWwgKHR1bmVyLCBjaGFubmVsKTsKKyAgfSBlbHNlIHsKKyAgICBjaGFubmVsID0KKyAgICAgICAgR1NUX1RVTkVSX0NIQU5ORUwgKGdzdF90dW5lcl9nZXRfY2hhbm5lbCAoR1NUX1RVTkVSCisgICAgICAgICAgICAodjRsMm9iamVjdC0+ZWxlbWVudCkpKTsKKyAgICBpZiAoY2hhbm5lbCkgeworICAgICAgZ19mcmVlICh2NGwyb2JqZWN0LT5jaGFubmVsKTsKKyAgICAgIHY0bDJvYmplY3QtPmNoYW5uZWwgPSBnX3N0cmR1cCAoY2hhbm5lbC0+bGFiZWwpOworICAgICAgZ3N0X3R1bmVyX2NoYW5uZWxfY2hhbmdlZCAodHVuZXIsIGNoYW5uZWwpOworICAgIH0KKyAgfQorCisgIGlmIChjaGFubmVsCisgICAgICAmJiBHU1RfVFVORVJfQ0hBTk5FTF9IQVNfRkxBRyAoY2hhbm5lbCwgR1NUX1RVTkVSX0NIQU5ORUxfRlJFUVVFTkNZKSkgeworICAgIGlmICh2NGwyb2JqZWN0LT5mcmVxdWVuY3kgIT0gMCkgeworICAgICAgZ3N0X3R1bmVyX3NldF9mcmVxdWVuY3kgKHR1bmVyLCBjaGFubmVsLCB2NGwyb2JqZWN0LT5mcmVxdWVuY3kpOworICAgIH0gZWxzZSB7CisgICAgICB2NGwyb2JqZWN0LT5mcmVxdWVuY3kgPSBnc3RfdHVuZXJfZ2V0X2ZyZXF1ZW5jeSAodHVuZXIsIGNoYW5uZWwpOworICAgICAgaWYgKHY0bDJvYmplY3QtPmZyZXF1ZW5jeSA9PSAwKSB7CisgICAgICAgIC8qIGd1ZXNzICovCisgICAgICAgIGdzdF90dW5lcl9zZXRfZnJlcXVlbmN5ICh0dW5lciwgY2hhbm5lbCwgMTAwMCk7CisgICAgICB9IGVsc2UgeworICAgICAgfQorICAgIH0KKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3Y0bDJfb2JqZWN0X29wZW4gKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KQoreworICBpZiAoZ3N0X3Y0bDJfb3BlbiAodjRsMm9iamVjdCkpCisgICAgZ3N0X3Y0bDJfc2V0X2RlZmF1bHRzICh2NGwyb2JqZWN0KTsKKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK2dzdF92NGwyX29iamVjdF9vcGVuX3NoYXJlZCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIEdzdFY0bDJPYmplY3QgKiBvdGhlcikKK3sKKyAgZ2Jvb2xlYW4gcmV0OworCisgIHJldCA9IGdzdF92NGwyX2R1cCAodjRsMm9iamVjdCwgb3RoZXIpOworCisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl9vYmplY3RfY2xvc2UgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KQoreworICBpZiAoIWdzdF92NGwyX2Nsb3NlICh2NGwyb2JqZWN0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnY0bDJvYmplY3QtPnByb2JlZF9jYXBzLCBOVUxMKTsKKworICAvKiByZXNldCBvdXIgY29weSBvZiB0aGUgZGV2aWNlIGNhcHMgKi8KKyAgdjRsMm9iamVjdC0+ZGV2aWNlX2NhcHMgPSAwOworCisgIGlmICh2NGwyb2JqZWN0LT5mb3JtYXRzKSB7CisgICAgZ3N0X3Y0bDJfb2JqZWN0X2NsZWFyX2Zvcm1hdF9saXN0ICh2NGwyb2JqZWN0KTsKKyAgfQorCisgIGlmICh2NGwyb2JqZWN0LT5wYXIpIHsKKyAgICBnX3ZhbHVlX3Vuc2V0ICh2NGwyb2JqZWN0LT5wYXIpOworICAgIGdfZnJlZSAodjRsMm9iamVjdC0+cGFyKTsKKyAgICB2NGwyb2JqZWN0LT5wYXIgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9mbXRkZXNjICoKK2dzdF92NGwyX29iamVjdF9nZXRfZm9ybWF0X2Zyb21fZm91cmNjIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBndWludDMyIGZvdXJjYykKK3sKKyAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZm10OworICBHU0xpc3QgKndhbGs7CisKKyAgaWYgKGZvdXJjYyA9PSAwKQorICAgIHJldHVybiBOVUxMOworCisgIHdhbGsgPSBnc3RfdjRsMl9vYmplY3RfZ2V0X2Zvcm1hdF9saXN0ICh2NGwyb2JqZWN0KTsKKyAgd2hpbGUgKHdhbGspIHsKKyAgICBmbXQgPSAoc3RydWN0IHY0bDJfZm10ZGVzYyAqKSB3YWxrLT5kYXRhOworICAgIGlmIChmbXQtPnBpeGVsZm9ybWF0ID09IGZvdXJjYykKKyAgICAgIHJldHVybiBmbXQ7CisgICAgLyogc3BlY2lhbCBjYXNlIGZvciBqcGVnICovCisgICAgaWYgKGZtdC0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX01KUEVHIHx8CisgICAgICAgIGZtdC0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX0pQRUcgfHwKKyAgICAgICAgZm10LT5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfUEpQRykgeworICAgICAgaWYgKGZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfSlBFRyB8fCBmb3VyY2MgPT0gVjRMMl9QSVhfRk1UX01KUEVHIHx8CisgICAgICAgICAgZm91cmNjID09IFY0TDJfUElYX0ZNVF9QSlBHKSB7CisgICAgICAgIHJldHVybiBmbXQ7CisgICAgICB9CisgICAgfQorICAgIHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspOworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworCisvKiBjb21wbGV0ZSBtYWRlIHVwIHJhbmtpbmcsIHRoZSB2YWx1ZXMgdGhlbXNlbHZlcyBhcmUgbWVhbmluZ2xlc3MgKi8KKy8qIFRoZXNlIHJhbmtzIE1VU1QgYmUgWCBzdWNoIHRoYXQgWDw8MTUgZml0cyBvbiBhIHNpZ25lZCBpbnQgLSBzZWUKKyAgIHRoZSBjb21tZW50IGF0IHRoZSBlbmQgb2YgZ3N0X3Y0bDJfb2JqZWN0X2Zvcm1hdF9nZXRfcmFuay4gKi8KKyNkZWZpbmUgWVVWX0JBU0VfUkFOSyAgICAgMTAwMAorI2RlZmluZSBKUEVHX0JBU0VfUkFOSyAgICAgNTAwCisjZGVmaW5lIERWX0JBU0VfUkFOSyAgICAgICAyMDAKKyNkZWZpbmUgUkdCX0JBU0VfUkFOSyAgICAgIDEwMAorI2RlZmluZSBZVVZfT0REX0JBU0VfUkFOSyAgIDUwCisjZGVmaW5lIFJHQl9PRERfQkFTRV9SQU5LICAgMjUKKyNkZWZpbmUgQkFZRVJfQkFTRV9SQU5LICAgICAxNQorI2RlZmluZSBTOTEwX0JBU0VfUkFOSyAgICAgIDEwCisjZGVmaW5lIEdSRVlfQkFTRV9SQU5LICAgICAgIDUKKyNkZWZpbmUgUFdDX0JBU0VfUkFOSyAgICAgICAgMQorCitzdGF0aWMgZ2ludAorZ3N0X3Y0bDJfb2JqZWN0X2Zvcm1hdF9nZXRfcmFuayAoY29uc3Qgc3RydWN0IHY0bDJfZm10ZGVzYyAqZm10KQoreworICBndWludDMyIGZvdXJjYyA9IGZtdC0+cGl4ZWxmb3JtYXQ7CisgIGdib29sZWFuIGVtdWxhdGVkID0gKChmbXQtPmZsYWdzICYgVjRMMl9GTVRfRkxBR19FTVVMQVRFRCkgIT0gMCk7CisgIGdpbnQgcmFuayA9IDA7CisKKyAgc3dpdGNoIChmb3VyY2MpIHsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9NSlBFRzoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9QSlBHOgorICAgICAgcmFuayA9IEpQRUdfQkFTRV9SQU5LOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfSlBFRzoKKyAgICAgIHJhbmsgPSBKUEVHX0JBU0VfUkFOSyArIDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9NUEVHOiAgICAvKiBNUEVHICAgICAgICAgICovCisgICAgICByYW5rID0gSlBFR19CQVNFX1JBTksgKyAyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0IzMzI6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfQVJHQjU1NToKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9YUkdCNTU1OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1JHQjU1NToKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9BUkdCNTU1WDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9YUkdCNTU1WDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0I1NTVYOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX0JHUjY2NjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0I1NjU6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTY1WDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0I0NDQ6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWTQ6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWTY6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWTEwOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1kxMjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZMTBCUEFDSzoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVY1NTU6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVVWNTY1OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjMyOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMTJNVF8xNlgxNjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjQyOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX0gyNjRfTVZDOgorICAgICAgcmFuayA9IFJHQl9PRERfQkFTRV9SQU5LOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0IyNDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9CR1IyNDoKKyAgICAgIHJhbmsgPSBSR0JfQkFTRV9SQU5LIC0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCMzI6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfQkdSMzI6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfQUJHUjMyOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1hCR1IzMjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9BUkdCMzI6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWFJHQjMyOgorICAgICAgcmFuayA9IFJHQl9CQVNFX1JBTks7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVjRMMl9QSVhfRk1UX0dSRVk6ICAgIC8qICA4ICBHcmV5c2NhbGUgICAgICovCisgICAgICByYW5rID0gR1JFWV9CQVNFX1JBTks7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMTI6ICAgIC8qIDEyICBZL0NiQ3IgNDoyOjAgICovCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxMk06ICAgLyogU2FtZSBhcyBOVjEyICAgICAgKi8KKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjEyTVQ6ICAvKiBOVjEyIDY0eDMyIHRpbGUgICAqLworICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMjE6ICAgIC8qIDEyICBZL0NyQ2IgNDoyOjAgICovCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYyMU06ICAgLyogU2FtZSBhcyBOVjIxICAgICAgKi8KKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZWVVWOiAgICAvKiAxNiAgWVVWIDQ6MjoyICAgICAqLworICAgIGNhc2UgVjRMMl9QSVhfRk1UX0hJMjQwOiAgIC8qICA4ICA4LWJpdCBjb2xvciAgICovCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxNjogICAgLyogMTYgIFkvQ2JDciA0OjI6MiAgKi8KKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjE2TTogICAvKiBTYW1lIGFzIE5WMTYgICAgICAqLworICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WNjE6ICAgIC8qIDE2ICBZL0NyQ2IgNDoyOjIgICovCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlY2MU06ICAgLyogU2FtZSBhcyBOVjYxICAgICAgKi8KKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjI0OiAgICAvKiAyNCAgWS9DckNiIDQ6NDo0ICAqLworICAgICAgcmFuayA9IFlVVl9PRERfQkFTRV9SQU5LOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVlU0MTA6ICAvKiBZVlU5LCAgOSBiaXRzIHBlciBwaXhlbCAqLworICAgICAgcmFuayA9IFlVVl9CQVNFX1JBTksgKyAzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDEwOiAgLyogWVVWOSwgIDkgYml0cyBwZXIgcGl4ZWwgKi8KKyAgICAgIHJhbmsgPSBZVVZfQkFTRV9SQU5LICsgMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMDogIC8qIEk0MjAsIDEyIGJpdHMgcGVyIHBpeGVsICovCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIwTToKKyAgICAgIHJhbmsgPSBZVVZfQkFTRV9SQU5LICsgNzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVWVY6ICAgIC8qIFlVWTIsIDE2IGJpdHMgcGVyIHBpeGVsICovCisgICAgICByYW5rID0gWVVWX0JBU0VfUkFOSyArIDEwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVZVNDIwOiAgLyogWVYxMiwgMTIgYml0cyBwZXIgcGl4ZWwgKi8KKyAgICAgIHJhbmsgPSBZVVZfQkFTRV9SQU5LICsgNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1VZVlk6ICAgIC8qIFVZVlksIDE2IGJpdHMgcGVyIHBpeGVsICovCisgICAgICByYW5rID0gWVVWX0JBU0VfUkFOSyArIDk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVY0NDQ6CisgICAgICByYW5rID0gWVVWX0JBU0VfUkFOSyArIDY7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZNDFQOiAgICAvKiBZNDFQLCAxMiBiaXRzIHBlciBwaXhlbCAqLworICAgICAgcmFuayA9IFlVVl9CQVNFX1JBTksgKyA1OworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDExUDogLyogWTQxQiwgMTIgYml0cyBwZXIgcGl4ZWwgKi8KKyAgICAgIHJhbmsgPSBZVVZfQkFTRV9SQU5LICsgNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMlA6IC8qIFk0MkIsIDE2IGJpdHMgcGVyIHBpeGVsICovCisgICAgICByYW5rID0gWVVWX0JBU0VfUkFOSyArIDg7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVjRMMl9QSVhfRk1UX0RWOgorICAgICAgcmFuayA9IERWX0JBU0VfUkFOSzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfV05WQTogICAgLyogV2lubm92IGh3IGNvbXByZXMgKi8KKyAgICAgIHJhbmsgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9TQkdHUjg6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfU0dCUkc4OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1NHUkJHODoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9TUkdHQjg6CisgICAgICByYW5rID0gQkFZRVJfQkFTRV9SQU5LOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9TTjlDMTBYOgorICAgICAgcmFuayA9IFM5MTBfQkFTRV9SQU5LOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9QV0MxOgorICAgICAgcmFuayA9IFBXQ19CQVNFX1JBTks7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9QV0MyOgorICAgICAgcmFuayA9IFBXQ19CQVNFX1JBTks7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByYW5rID0gMDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogQWxsIHJhbmtzIGFyZSBiZWxvdyAxPDwxNSBzbyBhIHNoaWZ0IGJ5IDE1CisgICAqIHdpbGwgYSkgbWFrZSBhbGwgbm9uLWVtdWxhdGVkIGZvcm1hdHMgbGFyZ2VyCisgICAqIHRoYW4gZW11bGF0ZWQgYW5kIGIpIHdpbGwgbm90IG92ZXJmbG93CisgICAqLworICBpZiAoIWVtdWxhdGVkKQorICAgIHJhbmsgPDw9IDE1OworCisgIHJldHVybiByYW5rOworfQorCisKKworc3RhdGljIGdpbnQKK2Zvcm1hdF9jbXBfZnVuYyAoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIpCit7CisgIGNvbnN0IHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmZhID0gYTsKKyAgY29uc3Qgc3RydWN0IHY0bDJfZm10ZGVzYyAqZmIgPSBiOworCisgIGlmIChmYS0+cGl4ZWxmb3JtYXQgPT0gZmItPnBpeGVsZm9ybWF0KQorICAgIHJldHVybiAwOworCisgIHJldHVybiBnc3RfdjRsMl9vYmplY3RfZm9ybWF0X2dldF9yYW5rIChmYikgLQorICAgICAgZ3N0X3Y0bDJfb2JqZWN0X2Zvcm1hdF9nZXRfcmFuayAoZmEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnc3RfdjRsMl9vYmplY3RfZmlsbF9mb3JtYXRfbGlzdCgpOgorICogICBjcmVhdGUgbGlzdCBvZiBzdXBwb3J0ZWQgY2FwdHVyZSBmb3JtYXRzCisgKiByZXR1cm4gdmFsdWU6IFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZXJyb3IKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX29iamVjdF9maWxsX2Zvcm1hdF9saXN0IChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKyAgZ2ludCBuOworICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmb3JtYXQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgImdldHRpbmcgc3JjIGZvcm1hdCBlbnVtZXJhdGlvbnMiKTsKKworICAvKiBmb3JtYXQgZW51bWVyYXRpb24gKi8KKyAgZm9yIChuID0gMDs7IG4rKykgeworICAgIGZvcm1hdCA9IGdfbmV3MCAoc3RydWN0IHY0bDJfZm10ZGVzYywgMSk7CisKKyAgICBmb3JtYXQtPmluZGV4ID0gbjsKKyAgICBmb3JtYXQtPnR5cGUgPSB0eXBlOworCisgICAgaWYgKHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX0VOVU1fRk1ULCBmb3JtYXQpIDwgMCkgeworICAgICAgaWYgKGVycm5vID09IEVJTlZBTCkgeworICAgICAgICBnX2ZyZWUgKGZvcm1hdCk7CisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBlbnVtZXJhdGlvbiAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICB9CisgICAgfQorCisgICAgR1NUX0xPR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJpbmRleDogICAgICAgJXUiLCBmb3JtYXQtPmluZGV4KTsKKyAgICBHU1RfTE9HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgInR5cGU6ICAgICAgICAlZCIsIGZvcm1hdC0+dHlwZSk7CisgICAgR1NUX0xPR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJmbGFnczogICAgICAgJTA4eCIsIGZvcm1hdC0+ZmxhZ3MpOworICAgIEdTVF9MT0dfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiZGVzY3JpcHRpb246ICclcyciLAorICAgICAgICBmb3JtYXQtPmRlc2NyaXB0aW9uKTsKKyAgICBHU1RfTE9HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgInBpeGVsZm9ybWF0OiAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3JtYXQtPnBpeGVsZm9ybWF0KSk7CisKKyAgICAvKiBzb3J0IGZvcm1hdHMgYWNjb3JkaW5nIHRvIG91ciBwcmVmZXJlbmNlOyAgd2UgZG8gdGhpcywgYmVjYXVzZSBjYXBzCisgICAgICogYXJlIHByb2JlZCBpbiB0aGUgb3JkZXIgdGhlIGZvcm1hdHMgYXJlIGluIHRoZSBsaXN0LCBhbmQgdGhlIG9yZGVyIG9mCisgICAgICogZm9ybWF0cyBpbiB0aGUgZmluYWwgcHJvYmVkIGNhcHMgbWF0dGVycyBmb3IgdGhpbmdzIGxpa2UgZml4YXRpb24gKi8KKyAgICB2NGwyb2JqZWN0LT5mb3JtYXRzID0gZ19zbGlzdF9pbnNlcnRfc29ydGVkICh2NGwyb2JqZWN0LT5mb3JtYXRzLCBmb3JtYXQsCisgICAgICAgIChHQ29tcGFyZUZ1bmMpIGZvcm1hdF9jbXBfZnVuYyk7CisgIH0KKworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgeworICAgIEdTTGlzdCAqbDsKKworICAgIEdTVF9JTkZPX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgImdvdCAlZCBmb3JtYXQocyk6Iiwgbik7CisgICAgZm9yIChsID0gdjRsMm9iamVjdC0+Zm9ybWF0czsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgeworICAgICAgZm9ybWF0ID0gbC0+ZGF0YTsKKworICAgICAgR1NUX0lORk9fT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLAorICAgICAgICAgICIgICUiIEdTVF9GT1VSQ0NfRk9STUFUICIlcyIsIEdTVF9GT1VSQ0NfQVJHUyAoZm9ybWF0LT5waXhlbGZvcm1hdCksCisgICAgICAgICAgKChmb3JtYXQtPmZsYWdzICYgVjRMMl9GTVRfRkxBR19FTVVMQVRFRCkpID8gIiAoZW11bGF0ZWQpIiA6ICIiKTsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworZmFpbGVkOgorICB7CisgICAgZ19mcmVlIChmb3JtYXQpOworCisgICAgaWYgKHY0bDJvYmplY3QtPmVsZW1lbnQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAodjRsMm9iamVjdC0+ZWxlbWVudCwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoXygiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrICIKKyAgICAgICAgICAgICAgICAid2l0aCIpLCB2NGwyb2JqZWN0LT52aWRlb2RldiksCisgICAgICAgICgiRmFpbGVkIHRvIGdldCBudW1iZXIgJWQgaW4gcGl4ZWxmb3JtYXQgZW51bWVyYXRpb24gZm9yICVzLiAoJWQgLSAlcykiLAorICAgICAgICAgICAgbiwgdjRsMm9iamVjdC0+dmlkZW9kZXYsIGVycm5vLCBnX3N0cmVycm9yIChlcnJubykpKTsKKworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKgorICAqIEdldCB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgY2FwdHVyZSBmb3JtYXRzLCBhIGxpc3Qgb2YKKyAgKiA8Y29kZT5zdHJ1Y3QgdjRsMl9mbXRkZXNjPC9jb2RlPi4KKyAgKi8KK3N0YXRpYyBHU0xpc3QgKgorZ3N0X3Y0bDJfb2JqZWN0X2dldF9mb3JtYXRfbGlzdCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpCit7CisgIGlmICghdjRsMm9iamVjdC0+Zm9ybWF0cykgeworCisgICAgLyogY2hlY2sgdXN1YWwgd2F5ICovCisgICAgZ3N0X3Y0bDJfb2JqZWN0X2ZpbGxfZm9ybWF0X2xpc3QgKHY0bDJvYmplY3QsIHY0bDJvYmplY3QtPnR5cGUpOworCisgICAgLyogaWYgb3VyIGRyaXZlciBzdXBwb3J0cyBtdWx0aS1wbGFuYXIKKyAgICAgKiBhbmQgaWYgZm9ybWF0cyBhcmUgc3RpbGwgZW1wdHkgdGhlbiB3ZSBjYW4gd29ya2Fyb3VuZCBkcml2ZXIgYnVnCisgICAgICogYnkgYWxzbyBsb29raW5nIHVwIGZvcm1hdHMgYXMgaWYgb3VyIGRldmljZSB3YXMgbm90IHN1cHBvcnRpbmcKKyAgICAgKiBtdWx0aXBsYW5hciAqLworICAgIGlmICghdjRsMm9iamVjdC0+Zm9ybWF0cykgeworICAgICAgc3dpdGNoICh2NGwyb2JqZWN0LT50eXBlKSB7CisgICAgICAgIGNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORToKKyAgICAgICAgICBnc3RfdjRsMl9vYmplY3RfZmlsbF9mb3JtYXRfbGlzdCAodjRsMm9iamVjdCwKKyAgICAgICAgICAgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORToKKyAgICAgICAgICBnc3RfdjRsMl9vYmplY3RfZmlsbF9mb3JtYXRfbGlzdCAodjRsMm9iamVjdCwKKyAgICAgICAgICAgICAgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB2NGwyb2JqZWN0LT5mb3JtYXRzOworfQorCitzdGF0aWMgR3N0VmlkZW9Gb3JtYXQKK2dzdF92NGwyX29iamVjdF92NGwyZm91cmNjX3RvX3ZpZGVvX2Zvcm1hdCAoZ3VpbnQzMiBmb3VyY2MpCit7CisgIEdzdFZpZGVvRm9ybWF0IGZvcm1hdDsKKworICBzd2l0Y2ggKGZvdXJjYykgeworICAgIGNhc2UgVjRMMl9QSVhfRk1UX0dSRVk6ICAgIC8qICA4ICBHcmV5c2NhbGUgICAgICovCisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX0dSQVk4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWTE2OgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9HUkFZMTZfTEU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZMTZfQkU6CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX0dSQVkxNl9CRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1hSR0I1NTU6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTU1OgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9SR0IxNTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1hSR0I1NTVYOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1JHQjU1NVg6CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX0JHUjE1OworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTY1OgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9SR0IxNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1JHQjI0OgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9SR0I7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9CR1IyNDoKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfQkdSOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWFJHQjMyOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1JHQjMyOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF94UkdCOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWEJHUjMyOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX0JHUjMyOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9CR1J4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfQUJHUjMyOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9CR1JBOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfQVJHQjMyOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9BUkdCOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxMjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjEyTToKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfTlYxMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMTJNVDoKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfTlYxMl82NFozMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMjE6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYyMU06CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX05WMjE7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVlU0MTA6CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX1lWVTk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MTA6CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX1lVVjk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjA6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIwTToKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfSTQyMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVWVY6CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX1lVWTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVlU0MjA6CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX1lWMTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9VWVZZOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9VWVZZOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDExUDoKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfWTQxQjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMlA6CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX1k0MkI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVllVOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9ZVllVOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxNjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjE2TToKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfTlYxNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WNjE6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlY2MU06CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX05WNjE7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjI0OgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9OVjI0OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfVU5LTk9XTjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGZvcm1hdDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl9vYmplY3RfdjRsMmZvdXJjY19pc19yZ2IgKGd1aW50MzIgZm91cmNjKQoreworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBzd2l0Y2ggKGZvdXJjYykgeworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1hSR0I1NTU6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTU1OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1hSR0I1NTVYOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1JHQjU1NVg6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTY1OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1JHQjI0OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX0JHUjI0OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1hSR0IzMjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0IzMjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9YQkdSMzI6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfQkdSMzI6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfQUJHUjMyOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX0FSR0IzMjoKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0U3RydWN0dXJlICoKK2dzdF92NGwyX29iamVjdF92NGwyZm91cmNjX3RvX2JhcmVfc3RydWN0IChndWludDMyIGZvdXJjYykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmUgPSBOVUxMOworCisgIHN3aXRjaCAoZm91cmNjKSB7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTUpQRUc6ICAgLyogTW90aW9uLUpQRUcgKi8KKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9QSlBHOiAgICAvKiBQcm9ncmVzc2l2ZS1KUEVHICovCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfSlBFRzogICAgLyogSkZJRiBKUEVHICovCisgICAgICBzdHJ1Y3R1cmUgPSBnc3Rfc3RydWN0dXJlX25ld19lbXB0eSAoImltYWdlL2pwZWciKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX01QRUcxOgorICAgICAgc3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJ2aWRlby9tcGVnIiwKKyAgICAgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAyLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX01QRUcyOgorICAgICAgc3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJ2aWRlby9tcGVnIiwKKyAgICAgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAyLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX01QRUc0OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1hWSUQ6CisgICAgICBzdHJ1Y3R1cmUgPSBnc3Rfc3RydWN0dXJlX25ldyAoInZpZGVvL21wZWciLAorICAgICAgICAgICJtcGVndmVyc2lvbiIsIEdfVFlQRV9JTlQsIDQsICJzeXN0ZW1zdHJlYW0iLAorICAgICAgICAgIEdfVFlQRV9CT09MRUFOLCBGQUxTRSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9IMjYzOgorICAgICAgc3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJ2aWRlby94LWgyNjMiLAorICAgICAgICAgICJ2YXJpYW50IiwgR19UWVBFX1NUUklORywgIml0dSIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfSDI2NDogICAgLyogSC4yNjQgKi8KKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgidmlkZW8veC1oMjY0IiwKKyAgICAgICAgICAic3RyZWFtLWZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJieXRlLXN0cmVhbSIsICJhbGlnbm1lbnQiLAorICAgICAgICAgIEdfVFlQRV9TVFJJTkcsICJhdSIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfSDI2NF9OT19TQzoKKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgidmlkZW8veC1oMjY0IiwKKyAgICAgICAgICAic3RyZWFtLWZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJhdmMiLCAiYWxpZ25tZW50IiwKKyAgICAgICAgICBHX1RZUEVfU1RSSU5HLCAiYXUiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1ZDMV9BTk5FWF9HOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1ZDMV9BTk5FWF9MOgorICAgICAgc3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJ2aWRlby94LXdtdiIsCisgICAgICAgICAgIndtdnZlcnNpb24iLCBHX1RZUEVfSU5ULCAzLCAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIldWQzEiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1ZQODoKKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5ICgidmlkZW8veC12cDgiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1ZQOToKKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5ICgidmlkZW8veC12cDkiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX0dSRVk6ICAgIC8qICA4ICBHcmV5c2NhbGUgICAgICovCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWTE2OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1kxNl9CRToKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9YUkdCNTU1OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1JHQjU1NToKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9YUkdCNTU1WDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0I1NTVYOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1JHQjU2NToKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0IyNDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9CR1IyNDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0IzMjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9YUkdCMzI6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfQVJHQjMyOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX0JHUjMyOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1hCR1IzMjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9BQkdSMzI6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxMjogICAgLyogMTIgIFkvQ2JDciA0OjI6MCAgKi8KKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjEyTToKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjEyTVQ6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYyMTogICAgLyogMTIgIFkvQ3JDYiA0OjI6MCAgKi8KKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjIxTToKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjE2OiAgICAvKiAxNiAgWS9DYkNyIDQ6MjoyICAqLworICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMTZNOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WNjE6ICAgIC8qIDE2ICBZL0NyQ2IgNDoyOjIgICovCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlY2MU06CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYyNDogICAgLyogMjQgIFkvQ3JDYiA0OjQ6NCAgKi8KKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVlU0MTA6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDEwOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMDogIC8qIEk0MjAvSVlVViAqLworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyME06CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVVZVjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVlU0MjA6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfVVlWWToKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjJQOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lWWVU6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDExUDp7CisgICAgICBHc3RWaWRlb0Zvcm1hdCBmb3JtYXQ7CisgICAgICBmb3JtYXQgPSBnc3RfdjRsMl9vYmplY3RfdjRsMmZvdXJjY190b192aWRlb19mb3JtYXQgKGZvdXJjYyk7CisgICAgICBpZiAoZm9ybWF0ICE9IEdTVF9WSURFT19GT1JNQVRfVU5LTk9XTikKKyAgICAgICAgc3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJ2aWRlby94LXJhdyIsCisgICAgICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgZ3N0X3ZpZGVvX2Zvcm1hdF90b19zdHJpbmcgKGZvcm1hdCksIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVjRMMl9QSVhfRk1UX0RWOgorICAgICAgc3RydWN0dXJlID0KKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoInZpZGVvL3gtZHYiLCAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsCisgICAgICAgICAgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9NUEVHOiAgICAvKiBNUEVHICAgICAgICAgICovCisgICAgICBzdHJ1Y3R1cmUgPSBnc3Rfc3RydWN0dXJlX25ldyAoInZpZGVvL21wZWd0cyIsCisgICAgICAgICAgInN5c3RlbXN0cmVhbSIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1dOVkE6ICAgIC8qIFdpbm5vdiBodyBjb21wcmVzICovCisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9TQkdHUjg6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfU0dCUkc4OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1NHUkJHODoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9TUkdHQjg6CisgICAgICBzdHJ1Y3R1cmUgPSBnc3Rfc3RydWN0dXJlX25ldyAoInZpZGVvL3gtYmF5ZXIiLCAiZm9ybWF0IiwgR19UWVBFX1NUUklORywKKyAgICAgICAgICBmb3VyY2MgPT0gVjRMMl9QSVhfRk1UX1NCR0dSOCA/ICJiZ2dyIiA6CisgICAgICAgICAgZm91cmNjID09IFY0TDJfUElYX0ZNVF9TR0JSRzggPyAiZ2JyZyIgOgorICAgICAgICAgIGZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfU0dSQkc4ID8gImdyYmciIDoKKyAgICAgICAgICAvKiBmb3VyY2MgPT0gVjRMMl9QSVhfRk1UX1NSR0dCOCA/ICovICJyZ2diIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9TTjlDMTBYOgorICAgICAgc3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9uZXdfZW1wdHkgKCJ2aWRlby94LXNvbml4Iik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9QV0MxOgorICAgICAgc3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9uZXdfZW1wdHkgKCJ2aWRlby94LXB3YzEiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1BXQzI6CisgICAgICBzdHJ1Y3R1cmUgPSBnc3Rfc3RydWN0dXJlX25ld19lbXB0eSAoInZpZGVvL3gtcHdjMiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCMzMyOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX0JHUjY2NjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9BUkdCNTU1WDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0I1NjVYOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1JHQjQ0NDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZWVVWOiAgICAvKiAxNiAgWVVWIDQ6MjoyICAgICAqLworICAgIGNhc2UgVjRMMl9QSVhfRk1UX0hJMjQwOiAgIC8qICA4ICA4LWJpdCBjb2xvciAgICovCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWTQ6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWTY6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWTEwOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1kxMjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZMTBCUEFDSzoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVY0NDQ6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVVWNTU1OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjU2NToKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZNDFQOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjMyOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMTJNVF8xNlgxNjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjQyOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX0gyNjRfTVZDOgorICAgIGRlZmF1bHQ6CisgICAgICBHU1RfREVCVUcgKCJVbnN1cHBvcnRlZCBmb3VyY2MgMHglMDh4ICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICAgIGZvdXJjYywgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHN0cnVjdHVyZTsKK30KKworR3N0U3RydWN0dXJlICoKK2dzdF92NGwyX29iamVjdF92NGwyZm91cmNjX3RvX3N0cnVjdHVyZSAoZ3VpbnQzMiBmb3VyY2MpCit7CisgIEdzdFN0cnVjdHVyZSAqdGVtcGxhdGU7CisgIGdpbnQgaTsKKworICB0ZW1wbGF0ZSA9IGdzdF92NGwyX29iamVjdF92NGwyZm91cmNjX3RvX2JhcmVfc3RydWN0IChmb3VyY2MpOworCisgIGlmICh0ZW1wbGF0ZSA9PSBOVUxMKQorICAgIGdvdG8gZG9uZTsKKworICBmb3IgKGkgPSAwOyBpIDwgR1NUX1Y0TDJfRk9STUFUX0NPVU5UOyBpKyspIHsKKyAgICBpZiAoZ3N0X3Y0bDJfZm9ybWF0c1tpXS5mb3JtYXQgIT0gZm91cmNjKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoZ3N0X3Y0bDJfZm9ybWF0c1tpXS5kaW1lbnNpb25zKSB7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAodGVtcGxhdGUsCisgICAgICAgICAgIndpZHRoIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCBHU1RfVjRMMl9NQVhfU0laRSwKKyAgICAgICAgICAiaGVpZ2h0IiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCBHU1RfVjRMMl9NQVhfU0laRSwKKyAgICAgICAgICAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT05fUkFOR0UsIDAsIDEsIEdfTUFYSU5ULCAxLCBOVUxMKTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKworZG9uZToKKyAgcmV0dXJuIHRlbXBsYXRlOworfQorCisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF92NGwyX29iamVjdF9nZXRfY2Fwc19oZWxwZXIgKEdzdFY0TDJGb3JtYXRGbGFncyBmbGFncykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdENhcHMgKmNhcHM7CisgIGd1aW50IGk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKyAgZm9yIChpID0gMDsgaSA8IEdTVF9WNEwyX0ZPUk1BVF9DT1VOVDsgaSsrKSB7CisKKyAgICBpZiAoKGdzdF92NGwyX2Zvcm1hdHNbaV0uZmxhZ3MgJiBmbGFncykgPT0gMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgc3RydWN0dXJlID0KKyAgICAgICAgZ3N0X3Y0bDJfb2JqZWN0X3Y0bDJmb3VyY2NfdG9fYmFyZV9zdHJ1Y3QgKGdzdF92NGwyX2Zvcm1hdHNbaV0uZm9ybWF0KTsKKworICAgIGlmIChzdHJ1Y3R1cmUpIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqYWx0X3MgPSBOVUxMOworCisgICAgICBpZiAoZ3N0X3Y0bDJfZm9ybWF0c1tpXS5kaW1lbnNpb25zKSB7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzdHJ1Y3R1cmUsCisgICAgICAgICAgICAid2lkdGgiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIEdTVF9WNEwyX01BWF9TSVpFLAorICAgICAgICAgICAgImhlaWdodCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgR1NUX1Y0TDJfTUFYX1NJWkUsCisgICAgICAgICAgICAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT05fUkFOR0UsIDAsIDEsIEdfTUFYSU5ULCAxLCBOVUxMKTsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChnc3RfdjRsMl9mb3JtYXRzW2ldLmZvcm1hdCkgeworICAgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0IzMjoKKyAgICAgICAgICBhbHRfcyA9IGdzdF9zdHJ1Y3R1cmVfY29weSAoc3RydWN0dXJlKTsKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoYWx0X3MsICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiQVJHQiIsIE5VTEwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9CR1IzMjoKKyAgICAgICAgICBhbHRfcyA9IGdzdF9zdHJ1Y3R1cmVfY29weSAoc3RydWN0dXJlKTsKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoYWx0X3MsICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiQkdSQSIsIE5VTEwpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBnc3RfY2Fwc19hcHBlbmRfc3RydWN0dXJlIChjYXBzLCBzdHJ1Y3R1cmUpOworCisgICAgICBpZiAoYWx0X3MpCisgICAgICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKGNhcHMsIGFsdF9zKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZ3N0X2NhcHNfc2ltcGxpZnkgKGNhcHMpOworfQorCitHc3RDYXBzICoKK2dzdF92NGwyX29iamVjdF9nZXRfYWxsX2NhcHMgKHZvaWQpCit7CisgIHN0YXRpYyBHc3RDYXBzICpjYXBzID0gTlVMTDsKKworICBpZiAoZ19vbmNlX2luaXRfZW50ZXIgKCZjYXBzKSkgeworICAgIEdzdENhcHMgKmFsbF9jYXBzID0gZ3N0X3Y0bDJfb2JqZWN0X2dldF9jYXBzX2hlbHBlciAoR1NUX1Y0TDJfQUxMKTsKKyAgICBHU1RfTUlOSV9PQkpFQ1RfRkxBR19TRVQgKGFsbF9jYXBzLCBHU1RfTUlOSV9PQkpFQ1RfRkxBR19NQVlfQkVfTEVBS0VEKTsKKyAgICBnX29uY2VfaW5pdF9sZWF2ZSAoJmNhcHMsIGFsbF9jYXBzKTsKKyAgfQorCisgIHJldHVybiBjYXBzOworfQorCitHc3RDYXBzICoKK2dzdF92NGwyX29iamVjdF9nZXRfcmF3X2NhcHMgKHZvaWQpCit7CisgIHN0YXRpYyBHc3RDYXBzICpjYXBzID0gTlVMTDsKKworICBpZiAoZ19vbmNlX2luaXRfZW50ZXIgKCZjYXBzKSkgeworICAgIEdzdENhcHMgKnJhd19jYXBzID0gZ3N0X3Y0bDJfb2JqZWN0X2dldF9jYXBzX2hlbHBlciAoR1NUX1Y0TDJfUkFXKTsKKyAgICBHU1RfTUlOSV9PQkpFQ1RfRkxBR19TRVQgKHJhd19jYXBzLCBHU1RfTUlOSV9PQkpFQ1RfRkxBR19NQVlfQkVfTEVBS0VEKTsKKyAgICBnX29uY2VfaW5pdF9sZWF2ZSAoJmNhcHMsIHJhd19jYXBzKTsKKyAgfQorCisgIHJldHVybiBjYXBzOworfQorCitHc3RDYXBzICoKK2dzdF92NGwyX29iamVjdF9nZXRfY29kZWNfY2FwcyAodm9pZCkKK3sKKyAgc3RhdGljIEdzdENhcHMgKmNhcHMgPSBOVUxMOworCisgIGlmIChnX29uY2VfaW5pdF9lbnRlciAoJmNhcHMpKSB7CisgICAgR3N0Q2FwcyAqY29kZWNfY2FwcyA9IGdzdF92NGwyX29iamVjdF9nZXRfY2Fwc19oZWxwZXIgKEdTVF9WNEwyX0NPREVDKTsKKyAgICBHU1RfTUlOSV9PQkpFQ1RfRkxBR19TRVQgKGNvZGVjX2NhcHMsIEdTVF9NSU5JX09CSkVDVF9GTEFHX01BWV9CRV9MRUFLRUQpOworICAgIGdfb25jZV9pbml0X2xlYXZlICgmY2FwcywgY29kZWNfY2Fwcyk7CisgIH0KKworICByZXR1cm4gY2FwczsKK30KKworLyogY29sbGVjdCBkYXRhIGZvciB0aGUgZ2l2ZW4gY2FwcworICogQGNhcHM6IGdpdmVuIGlucHV0IGNhcHMKKyAqIEBmb3JtYXQ6IGxvY2F0aW9uIGZvciB0aGUgdjRsIGZvcm1hdAorICogQHcvQGg6IGxvY2F0aW9uIGZvciB3aWR0aCBhbmQgaGVpZ2h0CisgKiBAZnBzX24vQGZwc19kOiBsb2NhdGlvbiBmb3IgZnJhbWVyYXRlCisgKiBAc2l6ZTogbG9jYXRpb24gZm9yIGV4cGVjdGVkIHNpemUgb2YgdGhlIGZyYW1lIG9yIDAgaWYgdW5rbm93bgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX29iamVjdF9nZXRfY2Fwc19pbmZvIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgR3N0Q2FwcyAqIGNhcHMsCisgICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqKmZvcm1hdCwgR3N0VmlkZW9JbmZvICogaW5mbykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGd1aW50MzIgZm91cmNjID0gMCwgZm91cmNjX25jID0gMDsKKyAgY29uc3QgZ2NoYXIgKm1pbWV0eXBlOworICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmbXQgPSBOVUxMOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIG1pbWV0eXBlID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAoc3RydWN0dXJlKTsKKworICBpZiAoIWdzdF92aWRlb19pbmZvX2Zyb21fY2FwcyAoaW5mbywgY2FwcykpCisgICAgZ290byBpbnZhbGlkX2Zvcm1hdDsKKworICBpZiAoZ19zdHJfZXF1YWwgKG1pbWV0eXBlLCAidmlkZW8veC1yYXciKSkgeworICAgIHN3aXRjaCAoR1NUX1ZJREVPX0lORk9fRk9STUFUIChpbmZvKSkgeworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9ZVVY0MjA7CisgICAgICAgIGZvdXJjY19uYyA9IFY0TDJfUElYX0ZNVF9ZVVY0MjBNOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVVkyOgorICAgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfWVVZVjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfVVlWWToKKyAgICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX1VZVlk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWMTI6CisgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9ZVlU0MjA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MUI6CisgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9ZVVY0MTFQOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOgorICAgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfWVVWNDIyUDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYxMjoKKyAgICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX05WMTI7CisgICAgICAgIGZvdXJjY19uYyA9IFY0TDJfUElYX0ZNVF9OVjEyTTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYxMl82NFozMjoKKyAgICAgICAgZm91cmNjX25jID0gVjRMMl9QSVhfRk1UX05WMTJNVDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYyMToKKyAgICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX05WMjE7CisgICAgICAgIGZvdXJjY19uYyA9IFY0TDJfUElYX0ZNVF9OVjIxTTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYxNjoKKyAgICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX05WMTY7CisgICAgICAgIGZvdXJjY19uYyA9IFY0TDJfUElYX0ZNVF9OVjE2TTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlY2MToKKyAgICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX05WNjE7CisgICAgICAgIGZvdXJjY19uYyA9IFY0TDJfUElYX0ZNVF9OVjYxTTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYyNDoKKyAgICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX05WMjQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWWVU6CisgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9ZVllVOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0IxNToKKyAgICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX1JHQjU1NTsKKyAgICAgICAgZm91cmNjX25jID0gVjRMMl9QSVhfRk1UX1hSR0I1NTU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQjE2OgorICAgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfUkdCNTY1OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9SR0IyNDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSOgorICAgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfQkdSMjQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX3hSR0I6CisgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9SR0IzMjsKKyAgICAgICAgZm91cmNjX25jID0gVjRMMl9QSVhfRk1UX1hSR0IzMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX1JHQjMyOworICAgICAgICBmb3VyY2NfbmMgPSBWNEwyX1BJWF9GTVRfQVJHQjMyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1J4OgorICAgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfQkdSMzI7CisgICAgICAgIGZvdXJjY19uYyA9IFY0TDJfUElYX0ZNVF9YQkdSMzI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9CR1IzMjsKKyAgICAgICAgZm91cmNjX25jID0gVjRMMl9QSVhfRk1UX0FCR1IzMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfR1JBWTg6CisgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9HUkVZOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9HUkFZMTZfTEU6CisgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9ZMTY7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0dSQVkxNl9CRToKKyAgICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX1kxNl9CRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGdfc3RyX2VxdWFsIChtaW1ldHlwZSwgInZpZGVvL21wZWd0cyIpKSB7CisgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfTVBFRzsKKyAgICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsIChtaW1ldHlwZSwgInZpZGVvL3gtZHYiKSkgeworICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX0RWOworICAgIH0gZWxzZSBpZiAoZ19zdHJfZXF1YWwgKG1pbWV0eXBlLCAiaW1hZ2UvanBlZyIpKSB7CisgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfSlBFRzsKKyAgICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsIChtaW1ldHlwZSwgInZpZGVvL21wZWciKSkgeworICAgICAgZ2ludCB2ZXJzaW9uOworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAibXBlZ3ZlcnNpb24iLCAmdmVyc2lvbikpIHsKKyAgICAgICAgc3dpdGNoICh2ZXJzaW9uKSB7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX01QRUcxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX01QRUcyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX01QRUc0OworICAgICAgICAgICAgZm91cmNjX25jID0gVjRMMl9QSVhfRk1UX1hWSUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsIChtaW1ldHlwZSwgInZpZGVvL3gtaDI2MyIpKSB7CisgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfSDI2MzsKKyAgICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsIChtaW1ldHlwZSwgInZpZGVvL3gtaDI2NCIpKSB7CisgICAgICBjb25zdCBnY2hhciAqc3RyZWFtX2Zvcm1hdCA9CisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJzdHJlYW0tZm9ybWF0Iik7CisgICAgICBpZiAoZ19zdHJfZXF1YWwgKHN0cmVhbV9mb3JtYXQsICJhdmMiKSkKKyAgICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX0gyNjRfTk9fU0M7CisgICAgICBlbHNlCisgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9IMjY0OworICAgIH0gZWxzZSBpZiAoZ19zdHJfZXF1YWwgKG1pbWV0eXBlLCAidmlkZW8veC12cDgiKSkgeworICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX1ZQODsKKyAgICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsIChtaW1ldHlwZSwgInZpZGVvL3gtdnA5IikpIHsKKyAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9WUDk7CisgICAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAobWltZXR5cGUsICJ2aWRlby94LWJheWVyIikpIHsKKyAgICAgIGNvbnN0IGdjaGFyICpmb3JtYXQgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImZvcm1hdCIpOworICAgICAgaWYgKGZvcm1hdCkgeworICAgICAgICBpZiAoIWdfYXNjaWlfc3RyY2FzZWNtcCAoZm9ybWF0LCAiYmdnciIpKQorICAgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9TQkdHUjg7CisgICAgICAgIGVsc2UgaWYgKCFnX2FzY2lpX3N0cmNhc2VjbXAgKGZvcm1hdCwgImdicmciKSkKKyAgICAgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfU0dCUkc4OworICAgICAgICBlbHNlIGlmICghZ19hc2NpaV9zdHJjYXNlY21wIChmb3JtYXQsICJncmJnIikpCisgICAgICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX1NHUkJHODsKKyAgICAgICAgZWxzZSBpZiAoIWdfYXNjaWlfc3RyY2FzZWNtcCAoZm9ybWF0LCAicmdnYiIpKQorICAgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9TUkdHQjg7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAobWltZXR5cGUsICJ2aWRlby94LXNvbml4IikpIHsKKyAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9TTjlDMTBYOworICAgIH0gZWxzZSBpZiAoZ19zdHJfZXF1YWwgKG1pbWV0eXBlLCAidmlkZW8veC1wd2MxIikpIHsKKyAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9QV0MxOworICAgIH0gZWxzZSBpZiAoZ19zdHJfZXF1YWwgKG1pbWV0eXBlLCAidmlkZW8veC1wd2MyIikpIHsKKyAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9QV0MyOworICAgIH0KKyAgfQorCisKKyAgLyogUHJlZmVyIHRoZSBub24tY29udGlndW91cyBpZiBzdXBwb3J0ZWQgKi8KKyAgdjRsMm9iamVjdC0+cHJlZmVyZWRfbm9uX2NvbnRpZ3VvdXMgPSBUUlVFOworCisgIGlmIChmb3VyY2NfbmMpCisgICAgZm10ID0gZ3N0X3Y0bDJfb2JqZWN0X2dldF9mb3JtYXRfZnJvbV9mb3VyY2MgKHY0bDJvYmplY3QsIGZvdXJjY19uYyk7CisgIGVsc2UgaWYgKGZvdXJjYyA9PSAwKQorICAgIGdvdG8gdW5oYW5kbGVkX2Zvcm1hdDsKKworICBpZiAoZm10ID09IE5VTEwpIHsKKyAgICBmbXQgPSBnc3RfdjRsMl9vYmplY3RfZ2V0X2Zvcm1hdF9mcm9tX2ZvdXJjYyAodjRsMm9iamVjdCwgZm91cmNjKTsKKyAgICB2NGwyb2JqZWN0LT5wcmVmZXJlZF9ub25fY29udGlndW91cyA9IEZBTFNFOworICB9CisKKyAgaWYgKGZtdCA9PSBOVUxMKQorICAgIGdvdG8gdW5zdXBwb3J0ZWRfZm9ybWF0OworCisgICpmb3JtYXQgPSBmbXQ7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX2Zvcm1hdDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QsICJpbnZhbGlkIGZvcm1hdCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQordW5oYW5kbGVkX2Zvcm1hdDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QsICJ1bmhhbmRsZWQgZm9ybWF0Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit1bnN1cHBvcnRlZF9mb3JtYXQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LCAidW5zdXBwb3J0ZWQgZm9ybWF0Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfb2JqZWN0X2dldF9uZWFyZXN0X3NpemUgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIGd1aW50MzIgcGl4ZWxmb3JtYXQsIGdpbnQgKiB3aWR0aCwgZ2ludCAqIGhlaWdodCk7CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9vYmplY3RfYWRkX2FzcGVjdF9yYXRpbyAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIEdzdFN0cnVjdHVyZSAqIHMpCit7CisgIGlmICh2NGwyb2JqZWN0LT5rZWVwX2FzcGVjdCAmJiB2NGwyb2JqZWN0LT5wYXIpCisgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iLCB2NGwyb2JqZWN0LT5wYXIpOworfQorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIHZhbHVlIHdhcyBjaGFuZ2VkIGluIHBsYWNlLCBvdGhlcndpc2UgRkFMU0UgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJzcmNfdmFsdWVfc2ltcGxpZnkgKEdWYWx1ZSAqIHZhbCkKK3sKKyAgLyogc2ltcGxpZnkgbGlzdCBvZiBvbmUgdmFsdWUgdG8gb25lIHZhbHVlICovCisgIGlmIChHU1RfVkFMVUVfSE9MRFNfTElTVCAodmFsKSAmJiBnc3RfdmFsdWVfbGlzdF9nZXRfc2l6ZSAodmFsKSA9PSAxKSB7CisgICAgY29uc3QgR1ZhbHVlICpsaXN0X3ZhbDsKKyAgICBHVmFsdWUgbmV3X3ZhbCA9IEdfVkFMVUVfSU5JVDsKKworICAgIGxpc3RfdmFsID0gZ3N0X3ZhbHVlX2xpc3RfZ2V0X3ZhbHVlICh2YWwsIDApOworICAgIGdfdmFsdWVfaW5pdCAoJm5ld192YWwsIEdfVkFMVUVfVFlQRSAobGlzdF92YWwpKTsKKyAgICBnX3ZhbHVlX2NvcHkgKGxpc3RfdmFsLCAmbmV3X3ZhbCk7CisgICAgZ192YWx1ZV91bnNldCAodmFsKTsKKyAgICAqdmFsID0gbmV3X3ZhbDsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl9vYmplY3RfZ2V0X2ludGVybGFjZV9tb2RlIChlbnVtIHY0bDJfZmllbGQgZmllbGQsCisgICAgR3N0VmlkZW9JbnRlcmxhY2VNb2RlICogaW50ZXJsYWNlX21vZGUpCit7CisgIC8qIE5COiBJZiB5b3UgYWRkIG5ldyByZXR1cm4gdmFsdWVzLCBwbGVhc2UgZml4IG1vZGVfc3RyaW5ncyBpbgorICAgKiBnc3RfdjRsMl9vYmplY3RfYWRkX2ludGVybGFjZV9tb2RlICovCisgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIFY0TDJfRklFTERfQU5ZOgorICAgICAgR1NUX0VSUk9SCisgICAgICAgICAgKCJEcml2ZXIgYnVnIGRldGVjdGVkIC0gY2hlY2sgZHJpdmVyIHdpdGggdjRsMi1jb21wbGlhbmNlIGZyb20gaHR0cDovL2dpdC5saW51eHR2Lm9yZy92NGwtdXRpbHMuZ2l0XG4iKTsKKyAgICAgIC8qIGZhbGx0aHJvdWdoICovCisgICAgY2FzZSBWNEwyX0ZJRUxEX05PTkU6CisgICAgICAqaW50ZXJsYWNlX21vZGUgPSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfUFJPR1JFU1NJVkU7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICBjYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRDoKKyAgICBjYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRF9UQjoKKyAgICBjYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRF9CVDoKKyAgICAgICppbnRlcmxhY2VfbW9kZSA9IEdTVF9WSURFT19JTlRFUkxBQ0VfTU9ERV9JTlRFUkxFQVZFRDsKKyAgICAgIHJldHVybiBUUlVFOworICAgIGRlZmF1bHQ6CisgICAgICBHU1RfRVJST1IgKCJVbmtub3duIGVudW0gdjRsMl9maWVsZCAlZCIsIGZpZWxkKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX29iamVjdF9nZXRfY29sb3JzcGFjZSAoc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQsCisgICAgR3N0VmlkZW9Db2xvcmltZXRyeSAqIGNpbmZvKQoreworICBnYm9vbGVhbiBpc19yZ2IgPQorICAgICAgZ3N0X3Y0bDJfb2JqZWN0X3Y0bDJmb3VyY2NfaXNfcmdiIChmbXQtPmZtdC5waXgucGl4ZWxmb3JtYXQpOworICBlbnVtIHY0bDJfY29sb3JzcGFjZSBjb2xvcnNwYWNlOworICBlbnVtIHY0bDJfcXVhbnRpemF0aW9uIHJhbmdlOworICBlbnVtIHY0bDJfeWNiY3JfZW5jb2RpbmcgbWF0cml4OworICBlbnVtIHY0bDJfeGZlcl9mdW5jIHRyYW5zZmVyOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIGlmIChWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIgKGZtdC0+dHlwZSkpIHsKKyAgICBjb2xvcnNwYWNlID0gZm10LT5mbXQucGl4X21wLmNvbG9yc3BhY2U7CisgICAgcmFuZ2UgPSBmbXQtPmZtdC5waXhfbXAucXVhbnRpemF0aW9uOworICAgIG1hdHJpeCA9IGZtdC0+Zm10LnBpeF9tcC55Y2Jjcl9lbmM7CisgICAgdHJhbnNmZXIgPSBmbXQtPmZtdC5waXhfbXAueGZlcl9mdW5jOworICB9IGVsc2UgeworICAgIGNvbG9yc3BhY2UgPSBmbXQtPmZtdC5waXguY29sb3JzcGFjZTsKKyAgICByYW5nZSA9IGZtdC0+Zm10LnBpeC5xdWFudGl6YXRpb247CisgICAgbWF0cml4ID0gZm10LT5mbXQucGl4LnljYmNyX2VuYzsKKyAgICB0cmFuc2ZlciA9IGZtdC0+Zm10LnBpeC54ZmVyX2Z1bmM7CisgIH0KKworICAvKiBGaXJzdCBzdGVwLCBzZXQgdGhlIGRlZmF1bHRzIGZvciBlYWNoIHByaW1hcmllcyAqLworICBzd2l0Y2ggKGNvbG9yc3BhY2UpIHsKKyAgICBjYXNlIFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME06CisgICAgICBjaW5mby0+cmFuZ2UgPSBHU1RfVklERU9fQ09MT1JfUkFOR0VfMTZfMjM1OworICAgICAgY2luZm8tPm1hdHJpeCA9IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQ2MDE7CisgICAgICBjaW5mby0+dHJhbnNmZXIgPSBHU1RfVklERU9fVFJBTlNGRVJfQlQ3MDk7CisgICAgICBjaW5mby0+cHJpbWFyaWVzID0gR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19TTVBURTE3ME07CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfQ09MT1JTUEFDRV9SRUM3MDk6CisgICAgICBjaW5mby0+cmFuZ2UgPSBHU1RfVklERU9fQ09MT1JfUkFOR0VfMTZfMjM1OworICAgICAgY2luZm8tPm1hdHJpeCA9IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQ3MDk7CisgICAgICBjaW5mby0+dHJhbnNmZXIgPSBHU1RfVklERU9fVFJBTlNGRVJfQlQ3MDk7CisgICAgICBjaW5mby0+cHJpbWFyaWVzID0gR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19CVDcwOTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9DT0xPUlNQQUNFX1NSR0I6CisgICAgY2FzZSBWNEwyX0NPTE9SU1BBQ0VfSlBFRzoKKyAgICAgIGNpbmZvLT5yYW5nZSA9IEdTVF9WSURFT19DT0xPUl9SQU5HRV8wXzI1NTsKKyAgICAgIGNpbmZvLT5tYXRyaXggPSBHU1RfVklERU9fQ09MT1JfTUFUUklYX0JUNjAxOworICAgICAgY2luZm8tPnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX1NSR0I7CisgICAgICBjaW5mby0+cHJpbWFyaWVzID0gR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19CVDcwOTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9DT0xPUlNQQUNFX0FET0JFUkdCOgorICAgICAgY2luZm8tPnJhbmdlID0gR1NUX1ZJREVPX0NPTE9SX1JBTkdFXzE2XzIzNTsKKyAgICAgIGNpbmZvLT5tYXRyaXggPSBHU1RfVklERU9fQ09MT1JfTUFUUklYX0JUNjAxOworICAgICAgY2luZm8tPnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX0FET0JFUkdCOworICAgICAgY2luZm8tPnByaW1hcmllcyA9IEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfQURPQkVSR0I7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfQ09MT1JTUEFDRV9CVDIwMjA6CisgICAgICBjaW5mby0+cmFuZ2UgPSBHU1RfVklERU9fQ09MT1JfUkFOR0VfMTZfMjM1OworICAgICAgY2luZm8tPm1hdHJpeCA9IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQyMDIwOworICAgICAgY2luZm8tPnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX0JUMjAyMF8xMjsKKyAgICAgIGNpbmZvLT5wcmltYXJpZXMgPSBHU1RfVklERU9fQ09MT1JfUFJJTUFSSUVTX0JUMjAyMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9DT0xPUlNQQUNFX1NNUFRFMjQwTToKKyAgICAgIGNpbmZvLT5yYW5nZSA9IEdTVF9WSURFT19DT0xPUl9SQU5HRV8xNl8yMzU7CisgICAgICBjaW5mby0+bWF0cml4ID0gR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9TTVBURTI0ME07CisgICAgICBjaW5mby0+dHJhbnNmZXIgPSBHU1RfVklERU9fVFJBTlNGRVJfU01QVEUyNDBNOworICAgICAgY2luZm8tPnByaW1hcmllcyA9IEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfU01QVEUyNDBNOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9NOgorICAgICAgY2luZm8tPnJhbmdlID0gR1NUX1ZJREVPX0NPTE9SX1JBTkdFXzE2XzIzNTsKKyAgICAgIGNpbmZvLT5tYXRyaXggPSBHU1RfVklERU9fQ09MT1JfTUFUUklYX0JUNjAxOworICAgICAgY2luZm8tPnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX0JUNzA5OworICAgICAgY2luZm8tPnByaW1hcmllcyA9IEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfQlQ0NzBNOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRzoKKyAgICAgIGNpbmZvLT5yYW5nZSA9IEdTVF9WSURFT19DT0xPUl9SQU5HRV8xNl8yMzU7CisgICAgICBjaW5mby0+bWF0cml4ID0gR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9CVDYwMTsKKyAgICAgIGNpbmZvLT50cmFuc2ZlciA9IEdTVF9WSURFT19UUkFOU0ZFUl9CVDcwOTsKKyAgICAgIGNpbmZvLT5wcmltYXJpZXMgPSBHU1RfVklERU9fQ09MT1JfUFJJTUFSSUVTX0JUNDcwQkc7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfQ09MT1JTUEFDRV9SQVc6CisgICAgICAvKiBFeHBsaWNpdGx5IHVua25vd24gKi8KKyAgICAgIGNpbmZvLT5yYW5nZSA9IEdTVF9WSURFT19DT0xPUl9SQU5HRV9VTktOT1dOOworICAgICAgY2luZm8tPm1hdHJpeCA9IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfVU5LTk9XTjsKKyAgICAgIGNpbmZvLT50cmFuc2ZlciA9IEdTVF9WSURFT19UUkFOU0ZFUl9VTktOT1dOOworICAgICAgY2luZm8tPnByaW1hcmllcyA9IEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfVU5LTk9XTjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHU1RfREVCVUcgKCJVbmtub3duIGVudW0gdjRsMl9jb2xvcnNwYWNlICVkIiwgY29sb3JzcGFjZSk7CisgICAgICByZXQgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKCFyZXQpCisgICAgZ290byBkb25lOworCisgIC8qIFNlY29uZCBzdGVwLCBhcHBseSBhbnkgY3VzdG9tIHZhcmlhdGlvbiAqLworICBzd2l0Y2ggKHJhbmdlKSB7CisgICAgY2FzZSBWNEwyX1FVQU5USVpBVElPTl9GVUxMX1JBTkdFOgorICAgICAgY2luZm8tPnJhbmdlID0gR1NUX1ZJREVPX0NPTE9SX1JBTkdFXzBfMjU1OworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1FVQU5USVpBVElPTl9MSU1fUkFOR0U6CisgICAgICBjaW5mby0+cmFuZ2UgPSBHU1RfVklERU9fQ09MT1JfUkFOR0VfMTZfMjM1OworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1FVQU5USVpBVElPTl9ERUZBVUxUOgorICAgICAgLyogcmVwbGljYXRlZCBWNEwyX01BUF9RVUFOVElaQVRJT05fREVGQVVMVCBtYWNybyBiZWhhdmlvciAqLworICAgICAgaWYgKGlzX3JnYiAmJiBjb2xvcnNwYWNlID09IFY0TDJfQ09MT1JTUEFDRV9CVDIwMjApCisgICAgICAgIGNpbmZvLT5yYW5nZSA9IEdTVF9WSURFT19DT0xPUl9SQU5HRV8xNl8yMzU7CisgICAgICBlbHNlIGlmIChpc19yZ2IgfHwgbWF0cml4ID09IFY0TDJfWUNCQ1JfRU5DX1hWNjAxCisgICAgICAgICAgfHwgbWF0cml4ID09IFY0TDJfWUNCQ1JfRU5DX1hWNzA5CisgICAgICAgICAgfHwgY29sb3JzcGFjZSA9PSBWNEwyX0NPTE9SU1BBQ0VfSlBFRykKKyAgICAgICAgY2luZm8tPnJhbmdlID0gR1NUX1ZJREVPX0NPTE9SX1JBTkdFXzBfMjU1OworICAgICAgZWxzZQorICAgICAgICBjaW5mby0+cmFuZ2UgPSBHU1RfVklERU9fQ09MT1JfUkFOR0VfMTZfMjM1OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9XQVJOSU5HICgiVW5rbm93biBlbnVtIHY0bDJfcXVhbnRpemF0aW9uIHZhbHVlICVkIiwgcmFuZ2UpOworICAgICAgY2luZm8tPnJhbmdlID0gR1NUX1ZJREVPX0NPTE9SX1JBTkdFX1VOS05PV047CisgICAgICBicmVhazsKKyAgfQorCisgIHN3aXRjaCAobWF0cml4KSB7CisgICAgY2FzZSBWNEwyX1lDQkNSX0VOQ19YVjYwMToKKyAgICBjYXNlIFY0TDJfWUNCQ1JfRU5DX1NZQ0M6CisgICAgICBHU1RfRklYTUUgKCJYVjYwMSBhbmQgU1lDQyBub3QgZGVmaW5lZCwgYXNzdW1pbmcgNjAxIik7CisgICAgICAvKiBmYWxsdGhyb3VnaCAqLworICAgIGNhc2UgVjRMMl9ZQ0JDUl9FTkNfNjAxOgorICAgICAgY2luZm8tPm1hdHJpeCA9IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQ2MDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfWUNCQ1JfRU5DX1hWNzA5OgorICAgICAgR1NUX0ZJWE1FICgiWFY3MDkgbm90IGRlZmluZWQsIGFzc3VtaW5nIDcwOSIpOworICAgICAgLyogZmFsbHRocm91Z2ggKi8KKyAgICBjYXNlIFY0TDJfWUNCQ1JfRU5DXzcwOToKKyAgICAgIGNpbmZvLT5tYXRyaXggPSBHU1RfVklERU9fQ09MT1JfTUFUUklYX0JUNzA5OworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1lDQkNSX0VOQ19CVDIwMjBfQ09OU1RfTFVNOgorICAgICAgR1NUX0ZJWE1FICgiQlQyMDIwIHdpdGggY29uc3RhbnQgbHVtYSBpcyBub3QgZGVmaW5lZCwgYXNzdW1pbmcgQlQyMDIwIik7CisgICAgICAvKiBmYWxsdGhyb3VnaCAqLworICAgIGNhc2UgVjRMMl9ZQ0JDUl9FTkNfQlQyMDIwOgorICAgICAgY2luZm8tPm1hdHJpeCA9IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQyMDIwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1lDQkNSX0VOQ19TTVBURTI0ME06CisgICAgICBjaW5mby0+bWF0cml4ID0gR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9TTVBURTI0ME07CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfWUNCQ1JfRU5DX0RFRkFVTFQ6CisgICAgICAvKiBub3RoaW5nLCBqdXN0IHVzZSBkZWZhdWx0cyBmb3IgY29sb3JzcGFjZSAqLworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9XQVJOSU5HICgiVW5rbm93biBlbnVtIHY0bDJfeWNiY3JfZW5jb2RpbmcgdmFsdWUgJWQiLCBtYXRyaXgpOworICAgICAgY2luZm8tPm1hdHJpeCA9IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfVU5LTk9XTjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogU2V0IGlkZW50aXR5IG1hdHJpeCBmb3IgUidHJ0InIGZvcm1hdHMgdG8gYXZvaWQgY3JlYXRpbmcKKyAgICogY29uZnVzaW9uLiBUaGlzIHRob3VnaCBpcyBjb3NtZXRpYyBhcyBpdCdzIG5vdyBwcm9wZXJseSBpZ25vcmVkIGJ5CisgICAqIHRoZSB2aWRlbyBpbmZvIEFQSSBhbmQgdmlkZW9jb252ZXJ0LiAqLworICBpZiAoaXNfcmdiKQorICAgIGNpbmZvLT5tYXRyaXggPSBHU1RfVklERU9fQ09MT1JfTUFUUklYX1JHQjsKKworICBzd2l0Y2ggKHRyYW5zZmVyKSB7CisgICAgY2FzZSBWNEwyX1hGRVJfRlVOQ183MDk6CisgICAgICBpZiAoZm10LT5mbXQucGl4LmhlaWdodCA+PSAyMTYwKQorICAgICAgICBjaW5mby0+dHJhbnNmZXIgPSBHU1RfVklERU9fVFJBTlNGRVJfQlQyMDIwXzEyOworICAgICAgZWxzZQorICAgICAgICBjaW5mby0+dHJhbnNmZXIgPSBHU1RfVklERU9fVFJBTlNGRVJfQlQ3MDk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfWEZFUl9GVU5DX1NSR0I6CisgICAgICBjaW5mby0+dHJhbnNmZXIgPSBHU1RfVklERU9fVFJBTlNGRVJfU1JHQjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9YRkVSX0ZVTkNfQURPQkVSR0I6CisgICAgICBjaW5mby0+dHJhbnNmZXIgPSBHU1RfVklERU9fVFJBTlNGRVJfQURPQkVSR0I7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfWEZFUl9GVU5DX1NNUFRFMjQwTToKKyAgICAgIGNpbmZvLT50cmFuc2ZlciA9IEdTVF9WSURFT19UUkFOU0ZFUl9TTVBURTI0ME07CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfWEZFUl9GVU5DX05PTkU6CisgICAgICBjaW5mby0+dHJhbnNmZXIgPSBHU1RfVklERU9fVFJBTlNGRVJfR0FNTUExMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9YRkVSX0ZVTkNfREVGQVVMVDoKKyAgICAgIC8qIG5vdGhpbmcsIGp1c3QgdXNlIGRlZmF1bHRzIGZvciBjb2xvcnNwYWNlICovCisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX1dBUk5JTkcgKCJVbmtub3duIGVudW0gdjRsMl94ZmVyX2Z1bmMgdmFsdWUgJWQiLCB0cmFuc2Zlcik7CisgICAgICBjaW5mby0+dHJhbnNmZXIgPSBHU1RfVklERU9fVFJBTlNGRVJfVU5LTk9XTjsKKyAgICAgIGJyZWFrOworICB9CisKK2RvbmU6CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2dzdF92NGwyX29iamVjdF90cnlfZm10IChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKnRyeV9mbXQpCit7CisgIGludCBmZCA9IHY0bDJvYmplY3QtPnZpZGVvX2ZkOworICBzdHJ1Y3QgdjRsMl9mb3JtYXQgZm10OworICBpbnQgcjsKKworICBtZW1jcHkgKCZmbXQsIHRyeV9mbXQsIHNpemVvZiAoZm10KSk7CisgIHIgPSB2NGwyb2JqZWN0LT5pb2N0bCAoZmQsIFZJRElPQ19UUllfRk1ULCAmZm10KTsKKworICBpZiAociA8IDAgJiYgZXJybm8gPT0gRU5PVFRZKSB7CisgICAgLyogVGhlIGRyaXZlciBtaWdodCBub3QgaW1wbGVtZW50IFRSWV9GTVQsIGluIHdoaWNoIGNhc2Ugd2Ugd2lsbCB0cnkKKyAgICAgICBTX0ZNVCB0byBwcm9iZSAqLworICAgIGlmIChHU1RfVjRMMl9JU19BQ1RJVkUgKHY0bDJvYmplY3QpKQorICAgICAgZ290byBlcnJvcjsKKworICAgIG1lbWNweSAoJmZtdCwgdHJ5X2ZtdCwgc2l6ZW9mIChmbXQpKTsKKyAgICByID0gdjRsMm9iamVjdC0+aW9jdGwgKGZkLCBWSURJT0NfU19GTVQsICZmbXQpOworICB9CisgIG1lbWNweSAodHJ5X2ZtdCwgJmZtdCwgc2l6ZW9mIChmbXQpKTsKKworICByZXR1cm4gcjsKKworZXJyb3I6CisgIG1lbWNweSAodHJ5X2ZtdCwgJmZtdCwgc2l6ZW9mIChmbXQpKTsKKyAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLAorICAgICAgIlVuYWJsZSB0byB0cnkgZm9ybWF0OiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgIHJldHVybiByOworfQorCisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9vYmplY3RfYWRkX2ludGVybGFjZV9tb2RlIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBHc3RTdHJ1Y3R1cmUgKiBzLCBndWludDMyIHdpZHRoLCBndWludDMyIGhlaWdodCwgZ3VpbnQzMiBwaXhlbGZvcm1hdCkKK3sKKyAgc3RydWN0IHY0bDJfZm9ybWF0IGZtdDsKKyAgR1ZhbHVlIGludGVybGFjZV9mb3JtYXRzID0geyAwLCB9OworICBHc3RWaWRlb0ludGVybGFjZU1vZGUgaW50ZXJsYWNlX21vZGUsIHByZXYgPSAtMTsKKworICBjb25zdCBnY2hhciAqbW9kZV9zdHJpbmdzW10gPSB7ICJwcm9ncmVzc2l2ZSIsCisgICAgImludGVybGVhdmVkIiwKKyAgICAibWl4ZWQiCisgIH07CisKKyAgaWYgKCFnX3N0cl9lcXVhbCAoZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyksICJ2aWRlby94LXJhdyIpKQorICAgIHJldHVybjsKKworICBpZiAodjRsMm9iamVjdC0+bmV2ZXJfaW50ZXJsYWNlZCkgeworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiaW50ZXJsYWNlLW1vZGUiLCBHX1RZUEVfU1RSSU5HLCAicHJvZ3Jlc3NpdmUiLCBOVUxMKTsKKyAgICByZXR1cm47CisgIH0KKworICBnX3ZhbHVlX2luaXQgKCZpbnRlcmxhY2VfZm9ybWF0cywgR1NUX1RZUEVfTElTVCk7CisKKyAgLyogVHJ5IHR3aWNlIC0gb25jZSBmb3IgTk9ORSwgb25jZSBmb3IgSU5URVJMQUNFRC4gKi8KKyAgbWVtc2V0ICgmZm10LCAwLCBzaXplb2YgKGZtdCkpOworICBmbXQudHlwZSA9IHY0bDJvYmplY3QtPnR5cGU7CisgIGZtdC5mbXQucGl4LndpZHRoID0gd2lkdGg7CisgIGZtdC5mbXQucGl4LmhlaWdodCA9IGhlaWdodDsKKyAgZm10LmZtdC5waXgucGl4ZWxmb3JtYXQgPSBwaXhlbGZvcm1hdDsKKyAgZm10LmZtdC5waXguZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisKKyAgaWYgKGdzdF92NGwyX29iamVjdF90cnlfZm10ICh2NGwyb2JqZWN0LCAmZm10KSA9PSAwICYmCisgICAgICBnc3RfdjRsMl9vYmplY3RfZ2V0X2ludGVybGFjZV9tb2RlIChmbXQuZm10LnBpeC5maWVsZCwgJmludGVybGFjZV9tb2RlKSkgeworICAgIEdWYWx1ZSBpbnRlcmxhY2VfZW51bSA9IHsgMCwgfTsKKyAgICBnX3ZhbHVlX2luaXQgKCZpbnRlcmxhY2VfZW51bSwgR19UWVBFX1NUUklORyk7CisgICAgZ192YWx1ZV9zZXRfc3RyaW5nICgmaW50ZXJsYWNlX2VudW0sIG1vZGVfc3RyaW5nc1tpbnRlcmxhY2VfbW9kZV0pOworICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF9hbmRfdGFrZV92YWx1ZSAoJmludGVybGFjZV9mb3JtYXRzLCAmaW50ZXJsYWNlX2VudW0pOworICAgIHByZXYgPSBpbnRlcmxhY2VfbW9kZTsKKyAgfQorCisgIG1lbXNldCAoJmZtdCwgMCwgc2l6ZW9mIChmbXQpKTsKKyAgZm10LnR5cGUgPSB2NGwyb2JqZWN0LT50eXBlOworICBmbXQuZm10LnBpeC53aWR0aCA9IHdpZHRoOworICBmbXQuZm10LnBpeC5oZWlnaHQgPSBoZWlnaHQ7CisgIGZtdC5mbXQucGl4LnBpeGVsZm9ybWF0ID0gcGl4ZWxmb3JtYXQ7CisgIGZtdC5mbXQucGl4LmZpZWxkID0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOworCisgIGlmIChnc3RfdjRsMl9vYmplY3RfdHJ5X2ZtdCAodjRsMm9iamVjdCwgJmZtdCkgPT0gMCAmJgorICAgICAgZ3N0X3Y0bDJfb2JqZWN0X2dldF9pbnRlcmxhY2VfbW9kZSAoZm10LmZtdC5waXguZmllbGQsICZpbnRlcmxhY2VfbW9kZSkgJiYKKyAgICAgIHByZXYgIT0gaW50ZXJsYWNlX21vZGUpIHsKKyAgICBHVmFsdWUgaW50ZXJsYWNlX2VudW0gPSB7IDAsIH07CisgICAgZ192YWx1ZV9pbml0ICgmaW50ZXJsYWNlX2VudW0sIEdfVFlQRV9TVFJJTkcpOworICAgIGdfdmFsdWVfc2V0X3N0cmluZyAoJmludGVybGFjZV9lbnVtLCBtb2RlX3N0cmluZ3NbaW50ZXJsYWNlX21vZGVdKTsKKyAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfYW5kX3Rha2VfdmFsdWUgKCZpbnRlcmxhY2VfZm9ybWF0cywgJmludGVybGFjZV9lbnVtKTsKKyAgfQorCisgIGlmIChnc3RfdjRsMnNyY192YWx1ZV9zaW1wbGlmeSAoJmludGVybGFjZV9mb3JtYXRzKQorICAgICAgfHwgZ3N0X3ZhbHVlX2xpc3RfZ2V0X3NpemUgKCZpbnRlcmxhY2VfZm9ybWF0cykgPiAwKQorICAgIGdzdF9zdHJ1Y3R1cmVfdGFrZV92YWx1ZSAocywgImludGVybGFjZS1tb2RlIiwgJmludGVybGFjZV9mb3JtYXRzKTsKKyAgZWxzZQorICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMm9iamVjdCwgIkZhaWxlZCB0byBkZXRlcm1pbmUgaW50ZXJsYWNlIG1vZGUiKTsKKworICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9vYmplY3RfZmlsbF9jb2xvcmltZXRyeV9saXN0IChHVmFsdWUgKiBsaXN0LAorICAgIEdzdFZpZGVvQ29sb3JpbWV0cnkgKiBjaW5mbykKK3sKKyAgR1ZhbHVlIGNvbG9yaW1ldHJ5ID0gR19WQUxVRV9JTklUOworICBndWludCBzaXplOworICBndWludCBpOworICBnYm9vbGVhbiBmb3VuZCA9IEZBTFNFOworCisgIGdfdmFsdWVfaW5pdCAoJmNvbG9yaW1ldHJ5LCBHX1RZUEVfU1RSSU5HKTsKKyAgZ192YWx1ZV90YWtlX3N0cmluZyAoJmNvbG9yaW1ldHJ5LCBnc3RfdmlkZW9fY29sb3JpbWV0cnlfdG9fc3RyaW5nIChjaW5mbykpOworCisgIC8qIG9ubHkgaW5zZXJ0IGlmIG5vIGR1cGxpY2F0ZSAqLworICBzaXplID0gZ3N0X3ZhbHVlX2xpc3RfZ2V0X3NpemUgKGxpc3QpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgY29uc3QgR1ZhbHVlICp0bXA7CisKKyAgICB0bXAgPSBnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUgKGxpc3QsIGkpOworICAgIGlmIChnc3RfdmFsdWVfY29tcGFyZSAoJmNvbG9yaW1ldHJ5LCB0bXApID09IEdTVF9WQUxVRV9FUVVBTCkgeworICAgICAgZm91bmQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKCFmb3VuZCkKKyAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfYW5kX3Rha2VfdmFsdWUgKGxpc3QsICZjb2xvcmltZXRyeSk7CisgIGVsc2UKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmY29sb3JpbWV0cnkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfb2JqZWN0X2FkZF9jb2xvcnNwYWNlIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgR3N0U3RydWN0dXJlICogcywKKyAgICBndWludDMyIHdpZHRoLCBndWludDMyIGhlaWdodCwgZ3VpbnQzMiBwaXhlbGZvcm1hdCkKK3sKKyAgc3RydWN0IHY0bDJfZm9ybWF0IGZtdDsKKyAgR1ZhbHVlIGxpc3QgPSBHX1ZBTFVFX0lOSVQ7CisgIEdzdFZpZGVvQ29sb3JpbWV0cnkgY2luZm87CisgIGVudW0gdjRsMl9jb2xvcnNwYWNlIHJlcV9jc3BhY2U7CisKKyAgbWVtc2V0ICgmZm10LCAwLCBzaXplb2YgKGZtdCkpOworICBmbXQudHlwZSA9IHY0bDJvYmplY3QtPnR5cGU7CisgIGZtdC5mbXQucGl4LndpZHRoID0gd2lkdGg7CisgIGZtdC5mbXQucGl4LmhlaWdodCA9IGhlaWdodDsKKyAgZm10LmZtdC5waXgucGl4ZWxmb3JtYXQgPSBwaXhlbGZvcm1hdDsKKworICBnX3ZhbHVlX2luaXQgKCZsaXN0LCBHU1RfVFlQRV9MSVNUKTsKKworICAvKiBzdGVwIDE6IGdldCBkZXZpY2UgZGVmYXVsdCBjb2xvcnNwYWNlIGFuZCBpbnNlcnQgaXQgZmlyc3QgYXMKKyAgICogaXQgc2hvdWxkIGJlIHRoZSBwcmVmZXJyZWQgb25lICovCisgIGlmIChnc3RfdjRsMl9vYmplY3RfdHJ5X2ZtdCAodjRsMm9iamVjdCwgJmZtdCkgPT0gMCkgeworICAgIGlmIChnc3RfdjRsMl9vYmplY3RfZ2V0X2NvbG9yc3BhY2UgKCZmbXQsICZjaW5mbykpCisgICAgICBnc3RfdjRsMl9vYmplY3RfZmlsbF9jb2xvcmltZXRyeV9saXN0ICgmbGlzdCwgJmNpbmZvKTsKKyAgfQorCisgIC8qIHN0ZXAgMjogcHJvYmUgYWxsIGNvbG9yc3BhY2Ugb3RoZXIgdGhhbiBkZWZhdWx0CisgICAqIFdlIGRvbid0IHByb2JlIGFsbCBjb2xvcnNwYWNlLCByYW5nZSwgbWF0cml4IGFuZCB0cmFuc2ZlciBjb21iaW5hdGlvbiB0bworICAgKiBhdm9pZCBpb2N0bCBmbG9vZGluZyB3aGljaCBjb3VsZCBncmVhdGx5IGluY3JlYXNlIGluaXRpYWxpemF0aW9uIHRpbWUKKyAgICogd2l0aCBsb3ctc3BlZWQgZGV2aWNlcyAoVVZDLi4uKSAqLworICBmb3IgKHJlcV9jc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNOworICAgICAgcmVxX2NzcGFjZSA8PSBWNEwyX0NPTE9SU1BBQ0VfUkFXOyByZXFfY3NwYWNlKyspIHsKKyAgICAvKiBWNEwyX0NPTE9SU1BBQ0VfQlQ4NzggaXMgZGVwcmVjYXRlZCBhbmQgc2hhbGwgbm90IGJlIHVzZWQsIHNvIHNraXAgKi8KKyAgICBpZiAocmVxX2NzcGFjZSA9PSBWNEwyX0NPTE9SU1BBQ0VfQlQ4NzgpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIgKHY0bDJvYmplY3QtPnR5cGUpKQorICAgICAgZm10LmZtdC5waXhfbXAuY29sb3JzcGFjZSA9IHJlcV9jc3BhY2U7CisgICAgZWxzZQorICAgICAgZm10LmZtdC5waXguY29sb3JzcGFjZSA9IHJlcV9jc3BhY2U7CisKKyAgICBpZiAoZ3N0X3Y0bDJfb2JqZWN0X3RyeV9mbXQgKHY0bDJvYmplY3QsICZmbXQpID09IDApIHsKKyAgICAgIGVudW0gdjRsMl9jb2xvcnNwYWNlIGNvbG9yc3BhY2U7CisKKyAgICAgIGlmIChWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIgKHY0bDJvYmplY3QtPnR5cGUpKQorICAgICAgICBjb2xvcnNwYWNlID0gZm10LmZtdC5waXhfbXAuY29sb3JzcGFjZTsKKyAgICAgIGVsc2UKKyAgICAgICAgY29sb3JzcGFjZSA9IGZtdC5mbXQucGl4LmNvbG9yc3BhY2U7CisKKyAgICAgIGlmIChjb2xvcnNwYWNlID09IHJlcV9jc3BhY2UpIHsKKyAgICAgICAgaWYgKGdzdF92NGwyX29iamVjdF9nZXRfY29sb3JzcGFjZSAoJmZtdCwgJmNpbmZvKSkKKyAgICAgICAgICBnc3RfdjRsMl9vYmplY3RfZmlsbF9jb2xvcmltZXRyeV9saXN0ICgmbGlzdCwgJmNpbmZvKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoZ3N0X3ZhbHVlX2xpc3RfZ2V0X3NpemUgKCZsaXN0KSA+IDApCisgICAgZ3N0X3N0cnVjdHVyZV90YWtlX3ZhbHVlIChzLCAiY29sb3JpbWV0cnkiLCAmbGlzdCk7CisgIGVsc2UKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmbGlzdCk7CisKKyAgcmV0dXJuOworfQorCisvKiBUaGUgZnJhbWUgaW50ZXJ2YWwgZW51bWVyYXRpb24gY29kZSBmaXJzdCBhcHBlYXJlZCBpbiBMaW51eCAyLjYuMTkuICovCitzdGF0aWMgR3N0U3RydWN0dXJlICoKK2dzdF92NGwyX29iamVjdF9wcm9iZV9jYXBzX2Zvcl9mb3JtYXRfYW5kX3NpemUgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIGd1aW50MzIgcGl4ZWxmb3JtYXQsCisgICAgZ3VpbnQzMiB3aWR0aCwgZ3VpbnQzMiBoZWlnaHQsIGNvbnN0IEdzdFN0cnVjdHVyZSAqIHRlbXBsYXRlKQoreworICBnaW50IGZkID0gdjRsMm9iamVjdC0+dmlkZW9fZmQ7CisgIHN0cnVjdCB2NGwyX2ZybWl2YWxlbnVtIGl2YWw7CisgIGd1aW50MzIgbnVtLCBkZW5vbTsKKyAgR3N0U3RydWN0dXJlICpzOworICBHVmFsdWUgcmF0ZXMgPSB7IDAsIH07CisKKyAgbWVtc2V0ICgmaXZhbCwgMCwgc2l6ZW9mIChzdHJ1Y3QgdjRsMl9mcm1pdmFsZW51bSkpOworICBpdmFsLmluZGV4ID0gMDsKKyAgaXZhbC5waXhlbF9mb3JtYXQgPSBwaXhlbGZvcm1hdDsKKyAgaXZhbC53aWR0aCA9IHdpZHRoOworICBpdmFsLmhlaWdodCA9IGhlaWdodDsKKworICBHU1RfTE9HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICJnZXQgZnJhbWUgaW50ZXJ2YWwgZm9yICV1eCV1LCAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwgd2lkdGgsIGhlaWdodCwKKyAgICAgIEdTVF9GT1VSQ0NfQVJHUyAocGl4ZWxmb3JtYXQpKTsKKworICAvKiBrZWVwIGluIG1pbmQgdGhhdCB2NGwyIGdpdmVzIHVzIGZyYW1lIGludGVydmFscyAoZHVyYXRpb25zKTsgd2UgaW52ZXJ0IHRoZQorICAgKiBmcmFjdGlvbiB0byBnZXQgZnJhbWVyYXRlICovCisgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAoZmQsIFZJRElPQ19FTlVNX0ZSQU1FSU5URVJWQUxTLCAmaXZhbCkgPCAwKQorICAgIGdvdG8gZW51bV9mcmFtZWludGVydmFsc19mYWlsZWQ7CisKKyAgaWYgKGl2YWwudHlwZSA9PSBWNEwyX0ZSTUlWQUxfVFlQRV9ESVNDUkVURSkgeworICAgIEdWYWx1ZSByYXRlID0geyAwLCB9OworCisgICAgZ192YWx1ZV9pbml0ICgmcmF0ZXMsIEdTVF9UWVBFX0xJU1QpOworICAgIGdfdmFsdWVfaW5pdCAoJnJhdGUsIEdTVF9UWVBFX0ZSQUNUSU9OKTsKKworICAgIGRvIHsKKyAgICAgIG51bSA9IGl2YWwuZGlzY3JldGUubnVtZXJhdG9yOworICAgICAgZGVub20gPSBpdmFsLmRpc2NyZXRlLmRlbm9taW5hdG9yOworCisgICAgICBpZiAobnVtID4gR19NQVhJTlQgfHwgZGVub20gPiBHX01BWElOVCkgeworICAgICAgICAvKiBsZXQgdXMgaG9wZSB3ZSBkb24ndCBnZXQgaGVyZS4uLiAqLworICAgICAgICBudW0gPj49IDE7CisgICAgICAgIGRlbm9tID4+PSAxOworICAgICAgfQorCisgICAgICBHU1RfTE9HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgImFkZGluZyBkaXNjcmV0ZSBmcmFtZXJhdGU6ICVkLyVkIiwKKyAgICAgICAgICBkZW5vbSwgbnVtKTsKKworICAgICAgLyogc3dhcCB0byBnZXQgdGhlIGZyYW1lcmF0ZSAqLworICAgICAgZ3N0X3ZhbHVlX3NldF9mcmFjdGlvbiAoJnJhdGUsIGRlbm9tLCBudW0pOworICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmcmF0ZXMsICZyYXRlKTsKKworICAgICAgaXZhbC5pbmRleCsrOworICAgIH0gd2hpbGUgKHY0bDJvYmplY3QtPmlvY3RsIChmZCwgVklESU9DX0VOVU1fRlJBTUVJTlRFUlZBTFMsICZpdmFsKSA+PSAwKTsKKyAgfSBlbHNlIGlmIChpdmFsLnR5cGUgPT0gVjRMMl9GUk1JVkFMX1RZUEVfU1RFUFdJU0UpIHsKKyAgICBHVmFsdWUgbWluID0geyAwLCB9OworICAgIEdWYWx1ZSBzdGVwID0geyAwLCB9OworICAgIEdWYWx1ZSBtYXggPSB7IDAsIH07CisgICAgZ2Jvb2xlYW4gYWRkZWQgPSBGQUxTRTsKKyAgICBndWludDMyIG1pbm51bSwgbWluZGVub207CisgICAgZ3VpbnQzMiBtYXhudW0sIG1heGRlbm9tOworCisgICAgZ192YWx1ZV9pbml0ICgmcmF0ZXMsIEdTVF9UWVBFX0xJU1QpOworCisgICAgZ192YWx1ZV9pbml0ICgmbWluLCBHU1RfVFlQRV9GUkFDVElPTik7CisgICAgZ192YWx1ZV9pbml0ICgmc3RlcCwgR1NUX1RZUEVfRlJBQ1RJT04pOworICAgIGdfdmFsdWVfaW5pdCAoJm1heCwgR1NUX1RZUEVfRlJBQ1RJT04pOworCisgICAgLyogZ2V0IHRoZSBtaW4gKi8KKyAgICBtaW5udW0gPSBpdmFsLnN0ZXB3aXNlLm1pbi5udW1lcmF0b3I7CisgICAgbWluZGVub20gPSBpdmFsLnN0ZXB3aXNlLm1pbi5kZW5vbWluYXRvcjsKKyAgICBpZiAobWlubnVtID4gR19NQVhJTlQgfHwgbWluZGVub20gPiBHX01BWElOVCkgeworICAgICAgbWlubnVtID4+PSAxOworICAgICAgbWluZGVub20gPj49IDE7CisgICAgfQorICAgIEdTVF9MT0dfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAic3RlcHdpc2UgbWluIGZyYW1lIGludGVydmFsOiAlZC8lZCIsCisgICAgICAgIG1pbm51bSwgbWluZGVub20pOworICAgIGdzdF92YWx1ZV9zZXRfZnJhY3Rpb24gKCZtaW4sIG1pbm51bSwgbWluZGVub20pOworCisgICAgLyogZ2V0IHRoZSBtYXggKi8KKyAgICBtYXhudW0gPSBpdmFsLnN0ZXB3aXNlLm1heC5udW1lcmF0b3I7CisgICAgbWF4ZGVub20gPSBpdmFsLnN0ZXB3aXNlLm1heC5kZW5vbWluYXRvcjsKKyAgICBpZiAobWF4bnVtID4gR19NQVhJTlQgfHwgbWF4ZGVub20gPiBHX01BWElOVCkgeworICAgICAgbWF4bnVtID4+PSAxOworICAgICAgbWF4ZGVub20gPj49IDE7CisgICAgfQorCisgICAgR1NUX0xPR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJzdGVwd2lzZSBtYXggZnJhbWUgaW50ZXJ2YWw6ICVkLyVkIiwKKyAgICAgICAgbWF4bnVtLCBtYXhkZW5vbSk7CisgICAgZ3N0X3ZhbHVlX3NldF9mcmFjdGlvbiAoJm1heCwgbWF4bnVtLCBtYXhkZW5vbSk7CisKKyAgICAvKiBnZXQgdGhlIHN0ZXAgKi8KKyAgICBudW0gPSBpdmFsLnN0ZXB3aXNlLnN0ZXAubnVtZXJhdG9yOworICAgIGRlbm9tID0gaXZhbC5zdGVwd2lzZS5zdGVwLmRlbm9taW5hdG9yOworICAgIGlmIChudW0gPiBHX01BWElOVCB8fCBkZW5vbSA+IEdfTUFYSU5UKSB7CisgICAgICBudW0gPj49IDE7CisgICAgICBkZW5vbSA+Pj0gMTsKKyAgICB9CisKKyAgICBpZiAobnVtID09IDAgfHwgZGVub20gPT0gMCkgeworICAgICAgLyogaW4gdGhpcyBjYXNlIHdlIGhhdmUgYSB3cm9uZyBmcmFjdGlvbiBvciBubyBzdGVwLCBzZXQgdGhlIHN0ZXAgdG8gbWF4CisgICAgICAgKiBzbyB0aGF0IHdlIG9ubHkgYWRkIHRoZSBtaW4gdmFsdWUgaW4gdGhlIGxvb3AgYmVsb3cgKi8KKyAgICAgIG51bSA9IG1heG51bTsKKyAgICAgIGRlbm9tID0gbWF4ZGVub207CisgICAgfQorCisgICAgLyogc2luY2Ugd2Ugb25seSBoYXZlIGdzdF92YWx1ZV9mcmFjdGlvbl9zdWJ0cmFjdCBhbmQgbm90IGFkZCwgbmVnYXRlIHRoZQorICAgICAqIG51bWVyYXRvciAqLworICAgIEdTVF9MT0dfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAic3RlcHdpc2Ugc3RlcCBmcmFtZSBpbnRlcnZhbDogJWQvJWQiLAorICAgICAgICBudW0sIGRlbm9tKTsKKyAgICBnc3RfdmFsdWVfc2V0X2ZyYWN0aW9uICgmc3RlcCwgLW51bSwgZGVub20pOworCisgICAgd2hpbGUgKGdzdF92YWx1ZV9jb21wYXJlICgmbWluLCAmbWF4KSAhPSBHU1RfVkFMVUVfR1JFQVRFUl9USEFOKSB7CisgICAgICBHVmFsdWUgcmF0ZSA9IHsgMCwgfTsKKworICAgICAgbnVtID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9udW1lcmF0b3IgKCZtaW4pOworICAgICAgZGVub20gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX2Rlbm9taW5hdG9yICgmbWluKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiYWRkaW5nIHN0ZXB3aXNlIGZyYW1lcmF0ZTogJWQvJWQiLAorICAgICAgICAgIGRlbm9tLCBudW0pOworCisgICAgICAvKiBpbnZlcnQgdG8gZ2V0IHRoZSBmcmFtZXJhdGUgKi8KKyAgICAgIGdfdmFsdWVfaW5pdCAoJnJhdGUsIEdTVF9UWVBFX0ZSQUNUSU9OKTsKKyAgICAgIGdzdF92YWx1ZV9zZXRfZnJhY3Rpb24gKCZyYXRlLCBkZW5vbSwgbnVtKTsKKyAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJnJhdGVzLCAmcmF0ZSk7CisgICAgICBhZGRlZCA9IFRSVUU7CisKKyAgICAgIC8qIHdlJ3JlIGFjdHVhbGx5IGFkZGluZyBiZWNhdXNlIHN0ZXAgd2FzIG5lZ2F0ZWQgYWJvdmUuIFRoaXMgaXMgYmVjYXVzZQorICAgICAgICogdGhlcmUgaXMgbm8gX2FkZCBmdW5jdGlvbi4uLiAqLworICAgICAgaWYgKCFnc3RfdmFsdWVfZnJhY3Rpb25fc3VidHJhY3QgKCZtaW4sICZtaW4sICZzdGVwKSkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJjb3VsZCBub3Qgc3RlcCBmcmFjdGlvbiEiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmICghYWRkZWQpIHsKKyAgICAgIC8qIG5vIHJhbmdlIHdhcyBhZGRlZCwgbGVhdmUgdGhlIGRlZmF1bHQgcmFuZ2UgZnJvbSB0aGUgdGVtcGxhdGUgKi8KKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgICAibm8gcmFuZ2UgYWRkZWQsIGxlYXZpbmcgZGVmYXVsdCIpOworICAgICAgZ192YWx1ZV91bnNldCAoJnJhdGVzKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoaXZhbC50eXBlID09IFY0TDJfRlJNSVZBTF9UWVBFX0NPTlRJTlVPVVMpIHsKKyAgICBndWludDMyIG1heG51bSwgbWF4ZGVub207CisKKyAgICBnX3ZhbHVlX2luaXQgKCZyYXRlcywgR1NUX1RZUEVfRlJBQ1RJT05fUkFOR0UpOworCisgICAgbnVtID0gaXZhbC5zdGVwd2lzZS5taW4ubnVtZXJhdG9yOworICAgIGRlbm9tID0gaXZhbC5zdGVwd2lzZS5taW4uZGVub21pbmF0b3I7CisgICAgaWYgKG51bSA+IEdfTUFYSU5UIHx8IGRlbm9tID4gR19NQVhJTlQpIHsKKyAgICAgIG51bSA+Pj0gMTsKKyAgICAgIGRlbm9tID4+PSAxOworICAgIH0KKworICAgIG1heG51bSA9IGl2YWwuc3RlcHdpc2UubWF4Lm51bWVyYXRvcjsKKyAgICBtYXhkZW5vbSA9IGl2YWwuc3RlcHdpc2UubWF4LmRlbm9taW5hdG9yOworICAgIGlmIChtYXhudW0gPiBHX01BWElOVCB8fCBtYXhkZW5vbSA+IEdfTUFYSU5UKSB7CisgICAgICBtYXhudW0gPj49IDE7CisgICAgICBtYXhkZW5vbSA+Pj0gMTsKKyAgICB9CisKKyAgICBHU1RfTE9HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgImNvbnRpbnVvdXMgZnJhbWUgaW50ZXJ2YWwgJWQvJWQgdG8gJWQvJWQiLCBtYXhkZW5vbSwgbWF4bnVtLCBkZW5vbSwKKyAgICAgICAgbnVtKTsKKworICAgIGdzdF92YWx1ZV9zZXRfZnJhY3Rpb25fcmFuZ2VfZnVsbCAoJnJhdGVzLCBtYXhkZW5vbSwgbWF4bnVtLCBkZW5vbSwgbnVtKTsKKyAgfSBlbHNlIHsKKyAgICBnb3RvIHVua25vd25fdHlwZTsKKyAgfQorCityZXR1cm5fZGF0YToKKyAgcyA9IGdzdF9zdHJ1Y3R1cmVfY29weSAodGVtcGxhdGUpOworICBnc3Rfc3RydWN0dXJlX3NldCAocywgIndpZHRoIiwgR19UWVBFX0lOVCwgKGdpbnQpIHdpZHRoLAorICAgICAgImhlaWdodCIsIEdfVFlQRV9JTlQsIChnaW50KSBoZWlnaHQsIE5VTEwpOworCisgIGdzdF92NGwyX29iamVjdF9hZGRfYXNwZWN0X3JhdGlvICh2NGwyb2JqZWN0LCBzKTsKKworICBpZiAoIXY0bDJvYmplY3QtPnNraXBfdHJ5X2ZtdF9wcm9iZXMpIHsKKyAgICBnc3RfdjRsMl9vYmplY3RfYWRkX2ludGVybGFjZV9tb2RlICh2NGwyb2JqZWN0LCBzLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICBwaXhlbGZvcm1hdCk7CisgICAgZ3N0X3Y0bDJfb2JqZWN0X2FkZF9jb2xvcnNwYWNlICh2NGwyb2JqZWN0LCBzLCB3aWR0aCwgaGVpZ2h0LCBwaXhlbGZvcm1hdCk7CisgIH0KKworICBpZiAoR19JU19WQUxVRSAoJnJhdGVzKSkgeworICAgIGdzdF92NGwyc3JjX3ZhbHVlX3NpbXBsaWZ5ICgmcmF0ZXMpOworICAgIC8qIG9ubHkgY2hhbmdlIHRoZSBmcmFtZXJhdGUgb24gdGhlIHRlbXBsYXRlIHdoZW4gd2UgaGF2ZSBhIHZhbGlkIHByb2JlZCBuZXcKKyAgICAgKiB2YWx1ZSAqLworICAgIGdzdF9zdHJ1Y3R1cmVfdGFrZV92YWx1ZSAocywgImZyYW1lcmF0ZSIsICZyYXRlcyk7CisgIH0gZWxzZSBpZiAodjRsMm9iamVjdC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwKKyAgICAgIHY0bDJvYmplY3QtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgeworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT05fUkFOR0UsIDAsIDEsIEdfTUFYSU5ULAorICAgICAgICAxLCBOVUxMKTsKKyAgfQorICByZXR1cm4gczsKKworICAvKiBFUlJPUlMgKi8KK2VudW1fZnJhbWVpbnRlcnZhbHNfZmFpbGVkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgIlVuYWJsZSB0byBlbnVtZXJhdGUgaW50ZXJ2YWxzIGZvciAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiQCV1eCV1IiwKKyAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChwaXhlbGZvcm1hdCksIHdpZHRoLCBoZWlnaHQpOworICAgIGdvdG8gcmV0dXJuX2RhdGE7CisgIH0KK3Vua25vd25fdHlwZToKKyAgeworICAgIC8qIEkgZG9uJ3Qgc2VlIGhvdyB0aGlzIGlzIGFjdHVhbGx5IGFuIGVycm9yLCB3ZSBpZ25vcmUgdGhlIGZvcm1hdCB0aGVuICovCisgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLAorICAgICAgICAiVW5rbm93biBmcmFtZSBpbnRlcnZhbCB0eXBlIGF0ICUiIEdTVF9GT1VSQ0NfRk9STUFUICJAJXV4JXU6ICV1IiwKKyAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChwaXhlbGZvcm1hdCksIHdpZHRoLCBoZWlnaHQsIGl2YWwudHlwZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIGdpbnQKK3NvcnRfYnlfZnJhbWVfc2l6ZSAoR3N0U3RydWN0dXJlICogczEsIEdzdFN0cnVjdHVyZSAqIHMyKQoreworICBpbnQgdzEsIGgxLCB3MiwgaDI7CisKKyAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzMSwgIndpZHRoIiwgJncxKTsKKyAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzMSwgImhlaWdodCIsICZoMSk7CisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoczIsICJ3aWR0aCIsICZ3Mik7CisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoczIsICJoZWlnaHQiLCAmaDIpOworCisgIC8qIEkgdGhpbmsgaXQncyBzYWZlIHRvIGFzc3VtZSB0aGF0IHRoaXMgd29uJ3Qgb3ZlcmZsb3cgZm9yIGEgd2hpbGUgKi8KKyAgcmV0dXJuICgodzIgKiBoMikgLSAodzEgKiBoMSkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfb2JqZWN0X3VwZGF0ZV9hbmRfYXBwZW5kIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBndWludDMyIGZvcm1hdCwgR3N0Q2FwcyAqIGNhcHMsIEdzdFN0cnVjdHVyZSAqIHMpCit7CisgIEdzdFN0cnVjdHVyZSAqYWx0X3MgPSBOVUxMOworCisgIC8qIEVuY29kZWQgc3RyZWFtIG9uIG91dHB1dCBidWZmZXIgbmVlZCB0byBiZSBwYXJzZWQgKi8KKyAgaWYgKHY0bDJvYmplY3QtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgfHwKKyAgICAgIHY0bDJvYmplY3QtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7CisgICAgZ2ludCBpID0gMDsKKworICAgIGZvciAoOyBpIDwgR1NUX1Y0TDJfRk9STUFUX0NPVU5UOyBpKyspIHsKKyAgICAgIGlmIChmb3JtYXQgPT0gZ3N0X3Y0bDJfZm9ybWF0c1tpXS5mb3JtYXQgJiYKKyAgICAgICAgICBnc3RfdjRsMl9mb3JtYXRzW2ldLmZsYWdzICYgR1NUX1Y0TDJfQ09ERUMgJiYKKyAgICAgICAgICAhKGdzdF92NGwyX2Zvcm1hdHNbaV0uZmxhZ3MgJiBHU1RfVjRMMl9OT19QQVJTRSkpIHsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJwYXJzZWQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmICh2NGwyb2JqZWN0LT5oYXNfYWxwaGFfY29tcG9uZW50ICYmCisgICAgICAodjRsMm9iamVjdC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwKKyAgICAgICAgICB2NGwyb2JqZWN0LT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpKSB7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgIGNhc2UgVjRMMl9QSVhfRk1UX1JHQjMyOgorICAgICAgICBhbHRfcyA9IGdzdF9zdHJ1Y3R1cmVfY29weSAocyk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChhbHRfcywgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJBUkdCIiwgTlVMTCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfQkdSMzI6CisgICAgICAgIGFsdF9zID0gZ3N0X3N0cnVjdHVyZV9jb3B5IChzKTsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKGFsdF9zLCAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIkJHUkEiLCBOVUxMKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBnc3RfY2Fwc19hcHBlbmRfc3RydWN0dXJlIChjYXBzLCBzKTsKKworICBpZiAoYWx0X3MpCisgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoY2FwcywgYWx0X3MpOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfdjRsMl9vYmplY3RfcHJvYmVfY2Fwc19mb3JfZm9ybWF0IChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBndWludDMyIHBpeGVsZm9ybWF0LCBjb25zdCBHc3RTdHJ1Y3R1cmUgKiB0ZW1wbGF0ZSkKK3sKKyAgR3N0Q2FwcyAqcmV0ID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworICBHc3RTdHJ1Y3R1cmUgKnRtcDsKKyAgZ2ludCBmZCA9IHY0bDJvYmplY3QtPnZpZGVvX2ZkOworICBzdHJ1Y3QgdjRsMl9mcm1zaXplZW51bSBzaXplOworICBHTGlzdCAqcmVzdWx0cyA9IE5VTEw7CisgIGd1aW50MzIgdywgaDsKKworICBpZiAocGl4ZWxmb3JtYXQgPT0gR1NUX01BS0VfRk9VUkNDICgnTScsICdQJywgJ0UnLCAnRycpKSB7CisgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAocmV0LCBnc3Rfc3RydWN0dXJlX2NvcHkgKHRlbXBsYXRlKSk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIG1lbXNldCAoJnNpemUsIDAsIHNpemVvZiAoc3RydWN0IHY0bDJfZnJtc2l6ZWVudW0pKTsKKyAgc2l6ZS5pbmRleCA9IDA7CisgIHNpemUucGl4ZWxfZm9ybWF0ID0gcGl4ZWxmb3JtYXQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICJFbnVtZXJhdGluZyBmcmFtZSBzaXplcyBmb3IgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICBHU1RfRk9VUkNDX0FSR1MgKHBpeGVsZm9ybWF0KSk7CisKKyAgaWYgKHY0bDJvYmplY3QtPmlvY3RsIChmZCwgVklESU9DX0VOVU1fRlJBTUVTSVpFUywgJnNpemUpIDwgMCkKKyAgICBnb3RvIGVudW1fZnJhbWVzaXplc19mYWlsZWQ7CisKKyAgaWYgKHNpemUudHlwZSA9PSBWNEwyX0ZSTVNJWkVfVFlQRV9ESVNDUkVURSkgeworICAgIGRvIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiZ290IGRpc2NyZXRlIGZyYW1lIHNpemUgJWR4JWQiLAorICAgICAgICAgIHNpemUuZGlzY3JldGUud2lkdGgsIHNpemUuZGlzY3JldGUuaGVpZ2h0KTsKKworICAgICAgdyA9IE1JTiAoc2l6ZS5kaXNjcmV0ZS53aWR0aCwgR19NQVhJTlQpOworICAgICAgaCA9IE1JTiAoc2l6ZS5kaXNjcmV0ZS5oZWlnaHQsIEdfTUFYSU5UKTsKKworICAgICAgaWYgKHcgJiYgaCkgeworICAgICAgICB0bXAgPQorICAgICAgICAgICAgZ3N0X3Y0bDJfb2JqZWN0X3Byb2JlX2NhcHNfZm9yX2Zvcm1hdF9hbmRfc2l6ZSAodjRsMm9iamVjdCwKKyAgICAgICAgICAgIHBpeGVsZm9ybWF0LCB3LCBoLCB0ZW1wbGF0ZSk7CisKKyAgICAgICAgaWYgKHRtcCkKKyAgICAgICAgICByZXN1bHRzID0gZ19saXN0X3ByZXBlbmQgKHJlc3VsdHMsIHRtcCk7CisgICAgICB9CisKKyAgICAgIHNpemUuaW5kZXgrKzsKKyAgICB9IHdoaWxlICh2NGwyb2JqZWN0LT5pb2N0bCAoZmQsIFZJRElPQ19FTlVNX0ZSQU1FU0laRVMsICZzaXplKSA+PSAwKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLAorICAgICAgICAiZG9uZSBpdGVyYXRpbmcgZGlzY3JldGUgZnJhbWUgc2l6ZXMiKTsKKyAgfSBlbHNlIGlmIChzaXplLnR5cGUgPT0gVjRMMl9GUk1TSVpFX1RZUEVfU1RFUFdJU0UpIHsKKyAgICBndWludDMyIG1heHcsIG1heGgsIHN0ZXBfdywgc3RlcF9oOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgIndlIGhhdmUgc3RlcHdpc2UgZnJhbWUgc2l6ZXM6Iik7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgIm1pbiB3aWR0aDogICAlZCIsCisgICAgICAgIHNpemUuc3RlcHdpc2UubWluX3dpZHRoKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAibWluIGhlaWdodDogICVkIiwKKyAgICAgICAgc2l6ZS5zdGVwd2lzZS5taW5faGVpZ2h0KTsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAibWF4IHdpZHRoOiAgICVkIiwKKyAgICAgICAgc2l6ZS5zdGVwd2lzZS5tYXhfd2lkdGgpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJtaW4gaGVpZ2h0OiAgJWQiLAorICAgICAgICBzaXplLnN0ZXB3aXNlLm1heF9oZWlnaHQpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJzdGVwIHdpZHRoOiAgJWQiLAorICAgICAgICBzaXplLnN0ZXB3aXNlLnN0ZXBfd2lkdGgpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJzdGVwIGhlaWdodDogJWQiLAorICAgICAgICBzaXplLnN0ZXB3aXNlLnN0ZXBfaGVpZ2h0KTsKKworICAgIHcgPSBNQVggKHNpemUuc3RlcHdpc2UubWluX3dpZHRoLCAxKTsKKyAgICBoID0gTUFYIChzaXplLnN0ZXB3aXNlLm1pbl9oZWlnaHQsIDEpOworICAgIG1heHcgPSBNSU4gKHNpemUuc3RlcHdpc2UubWF4X3dpZHRoLCBHX01BWElOVCk7CisgICAgbWF4aCA9IE1JTiAoc2l6ZS5zdGVwd2lzZS5tYXhfaGVpZ2h0LCBHX01BWElOVCk7CisKKyAgICBzdGVwX3cgPSBNQVggKHNpemUuc3RlcHdpc2Uuc3RlcF93aWR0aCwgMSk7CisgICAgc3RlcF9oID0gTUFYIChzaXplLnN0ZXB3aXNlLnN0ZXBfaGVpZ2h0LCAxKTsKKworICAgIC8qIEZJWE1FOiBjaGVjayBmb3Igc2FuaXR5IGFuZCB0aGF0IG1pbi9tYXggYXJlIG11bHRpcGxlcyBvZiB0aGUgc3RlcHMgKi8KKworICAgIC8qIHdlIG9ubHkgcXVlcnkgZGV0YWlscyBmb3IgdGhlIG1heCB3aWR0aC9oZWlnaHQgc2luY2UgaXQncyBsaWtlbHkgdGhlCisgICAgICogbW9zdCByZXN0cmljdGVkIGlmIHRoZXJlIGFyZSBhbnkgcmVzb2x1dGlvbi1kZXBlbmRlbnQgcmVzdHJpY3Rpb25zICovCisgICAgdG1wID0gZ3N0X3Y0bDJfb2JqZWN0X3Byb2JlX2NhcHNfZm9yX2Zvcm1hdF9hbmRfc2l6ZSAodjRsMm9iamVjdCwKKyAgICAgICAgcGl4ZWxmb3JtYXQsIG1heHcsIG1heGgsIHRlbXBsYXRlKTsKKworICAgIGlmICh0bXApIHsKKyAgICAgIEdWYWx1ZSBzdGVwX3JhbmdlID0gR19WQUxVRV9JTklUOworCisgICAgICBnX3ZhbHVlX2luaXQgKCZzdGVwX3JhbmdlLCBHU1RfVFlQRV9JTlRfUkFOR0UpOworICAgICAgZ3N0X3ZhbHVlX3NldF9pbnRfcmFuZ2Vfc3RlcCAoJnN0ZXBfcmFuZ2UsIHcsIG1heHcsIHN0ZXBfdyk7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAodG1wLCAid2lkdGgiLCAmc3RlcF9yYW5nZSk7CisKKyAgICAgIGdzdF92YWx1ZV9zZXRfaW50X3JhbmdlX3N0ZXAgKCZzdGVwX3JhbmdlLCBoLCBtYXhoLCBzdGVwX2gpOworICAgICAgZ3N0X3N0cnVjdHVyZV90YWtlX3ZhbHVlICh0bXAsICJoZWlnaHQiLCAmc3RlcF9yYW5nZSk7CisKKyAgICAgIC8qIG5vIHBvaW50IHVzaW5nIHRoZSByZXN1bHRzIGxpc3QgaGVyZSwgc2luY2UgdGhlcmUncyBvbmx5IG9uZSBzdHJ1Y3QgKi8KKyAgICAgIGdzdF92NGwyX29iamVjdF91cGRhdGVfYW5kX2FwcGVuZCAodjRsMm9iamVjdCwgcGl4ZWxmb3JtYXQsIHJldCwgdG1wKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc2l6ZS50eXBlID09IFY0TDJfRlJNU0laRV9UWVBFX0NPTlRJTlVPVVMpIHsKKyAgICBndWludDMyIG1heHcsIG1heGg7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAid2UgaGF2ZSBjb250aW51b3VzIGZyYW1lIHNpemVzOiIpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJtaW4gd2lkdGg6ICAgJWQiLAorICAgICAgICBzaXplLnN0ZXB3aXNlLm1pbl93aWR0aCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgIm1pbiBoZWlnaHQ6ICAlZCIsCisgICAgICAgIHNpemUuc3RlcHdpc2UubWluX2hlaWdodCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgIm1heCB3aWR0aDogICAlZCIsCisgICAgICAgIHNpemUuc3RlcHdpc2UubWF4X3dpZHRoKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAibWluIGhlaWdodDogICVkIiwKKyAgICAgICAgc2l6ZS5zdGVwd2lzZS5tYXhfaGVpZ2h0KTsKKworICAgIHcgPSBNQVggKHNpemUuc3RlcHdpc2UubWluX3dpZHRoLCAxKTsKKyAgICBoID0gTUFYIChzaXplLnN0ZXB3aXNlLm1pbl9oZWlnaHQsIDEpOworICAgIG1heHcgPSBNSU4gKHNpemUuc3RlcHdpc2UubWF4X3dpZHRoLCBHX01BWElOVCk7CisgICAgbWF4aCA9IE1JTiAoc2l6ZS5zdGVwd2lzZS5tYXhfaGVpZ2h0LCBHX01BWElOVCk7CisKKyAgICB0bXAgPQorICAgICAgICBnc3RfdjRsMl9vYmplY3RfcHJvYmVfY2Fwc19mb3JfZm9ybWF0X2FuZF9zaXplICh2NGwyb2JqZWN0LCBwaXhlbGZvcm1hdCwKKyAgICAgICAgdywgaCwgdGVtcGxhdGUpOworICAgIGlmICh0bXApIHsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0ICh0bXAsICJ3aWR0aCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgKGdpbnQpIHcsCisgICAgICAgICAgKGdpbnQpIG1heHcsICJoZWlnaHQiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIChnaW50KSBoLCAoZ2ludCkgbWF4aCwKKyAgICAgICAgICBOVUxMKTsKKworICAgICAgLyogbm8gcG9pbnQgdXNpbmcgdGhlIHJlc3VsdHMgbGlzdCBoZXJlLCBzaW5jZSB0aGVyZSdzIG9ubHkgb25lIHN0cnVjdCAqLworICAgICAgZ3N0X3Y0bDJfb2JqZWN0X3VwZGF0ZV9hbmRfYXBwZW5kICh2NGwyb2JqZWN0LCBwaXhlbGZvcm1hdCwgcmV0LCB0bXApOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBnb3RvIHVua25vd25fdHlwZTsKKyAgfQorCisgIC8qIHdlIHVzZSBhbiBpbnRlcm1lZGlhcnkgbGlzdCB0byBzdG9yZSBhbmQgdGhlbiBzb3J0IHRoZSByZXN1bHRzIG9mIHRoZQorICAgKiBwcm9iaW5nIGJlY2F1c2Ugd2UgY2FuJ3QgbWFrZSBhbnkgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIG9yZGVyIGluIHdoaWNoCisgICAqIHRoZSBkcml2ZXIgd2lsbCBnaXZlIHVzIHRoZSBzaXplcywgYnV0IHdlIHdhbnQgdGhlIGZpbmFsIGNhcHMgdG8gY29udGFpbgorICAgKiB0aGUgcmVzdWx0cyBzdGFydGluZyB3aXRoIHRoZSBoaWdoZXN0IHJlc29sdXRpb24gYW5kIGhhdmluZyB0aGUgbG93ZXN0CisgICAqIHJlc29sdXRpb24gbGFzdCwgc2luY2Ugb3JkZXIgaW4gY2FwcyBtYXR0ZXJzIGZvciB0aGluZ3MgbGlrZSBmaXhhdGlvbi4gKi8KKyAgcmVzdWx0cyA9IGdfbGlzdF9zb3J0IChyZXN1bHRzLCAoR0NvbXBhcmVGdW5jKSBzb3J0X2J5X2ZyYW1lX3NpemUpOworICB3aGlsZSAocmVzdWx0cyAhPSBOVUxMKSB7CisgICAgZ3N0X3Y0bDJfb2JqZWN0X3VwZGF0ZV9hbmRfYXBwZW5kICh2NGwyb2JqZWN0LCBwaXhlbGZvcm1hdCwgcmV0LAorICAgICAgICByZXN1bHRzLT5kYXRhKTsKKyAgICByZXN1bHRzID0gZ19saXN0X2RlbGV0ZV9saW5rIChyZXN1bHRzLCByZXN1bHRzKTsKKyAgfQorCisgIGlmIChnc3RfY2Fwc19pc19lbXB0eSAocmV0KSkKKyAgICBnb3RvIGVudW1fZnJhbWVzaXplc19ub19yZXN1bHRzOworCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCitlbnVtX2ZyYW1lc2l6ZXNfZmFpbGVkOgorICB7CisgICAgLyogSSBkb24ndCBzZWUgaG93IHRoaXMgaXMgYWN0dWFsbHkgYW4gZXJyb3IgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLAorICAgICAgICAiRmFpbGVkIHRvIGVudW1lcmF0ZSBmcmFtZSBzaXplcyBmb3IgcGl4ZWxmb3JtYXQgJSIgR1NUX0ZPVVJDQ19GT1JNQVQKKyAgICAgICAgIiAoJXMpIiwgR1NUX0ZPVVJDQ19BUkdTIChwaXhlbGZvcm1hdCksIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgZ290byBkZWZhdWx0X2ZyYW1lX3NpemVzOworICB9CitlbnVtX2ZyYW1lc2l6ZXNfbm9fcmVzdWx0czoKKyAgeworICAgIC8qIGl0J3MgcG9zc2libGUgdGhhdCBWSURJT0NfRU5VTV9GUkFNRVNJWkVTIGlzIGRlZmluZWQgYnV0IHRoZSBkcml2ZXIgaW4KKyAgICAgKiBxdWVzdGlvbiBkb2Vzbid0IGFjdHVhbGx5IHN1cHBvcnQgaXQgeWV0ICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgIk5vIHJlc3VsdHMgZm9yIHBpeGVsZm9ybWF0ICUiIEdTVF9GT1VSQ0NfRk9STUFUCisgICAgICAgICIgZW51bWVyYXRpbmcgZnJhbWUgc2l6ZXMsIHRyeWluZyBmYWxsYmFjayIsCisgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAocGl4ZWxmb3JtYXQpKTsKKyAgICBnb3RvIGRlZmF1bHRfZnJhbWVfc2l6ZXM7CisgIH0KK3Vua25vd25fdHlwZToKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgIlVua25vd24gZnJhbWUgc2l6ZWVudW0gdHlwZSBmb3IgcGl4ZWxmb3JtYXQgJSIgR1NUX0ZPVVJDQ19GT1JNQVQKKyAgICAgICAgIjogJXUiLCBHU1RfRk9VUkNDX0FSR1MgKHBpeGVsZm9ybWF0KSwgc2l6ZS50eXBlKTsKKyAgICBnb3RvIGRlZmF1bHRfZnJhbWVfc2l6ZXM7CisgIH0KKworZGVmYXVsdF9mcmFtZV9zaXplczoKKyAgeworICAgIGdpbnQgbWluX3csIG1heF93LCBtaW5faCwgbWF4X2gsIGZpeF9udW0gPSAwLCBmaXhfZGVub20gPSAwOworCisgICAgLyogVGhpcyBjb2RlIGlzIGZvciBMaW51eCA8IDIuNi4xOSAqLworICAgIG1pbl93ID0gbWluX2ggPSAxOworICAgIG1heF93ID0gbWF4X2ggPSBHU1RfVjRMMl9NQVhfU0laRTsKKyAgICBpZiAoIWdzdF92NGwyX29iamVjdF9nZXRfbmVhcmVzdF9zaXplICh2NGwyb2JqZWN0LCBwaXhlbGZvcm1hdCwgJm1pbl93LAorICAgICAgICAgICAgJm1pbl9oKSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLAorICAgICAgICAgICJDb3VsZCBub3QgcHJvYmUgbWluaW11bSBjYXB0dXJlIHNpemUgZm9yIHBpeGVsZm9ybWF0ICUiCisgICAgICAgICAgR1NUX0ZPVVJDQ19GT1JNQVQsIEdTVF9GT1VSQ0NfQVJHUyAocGl4ZWxmb3JtYXQpKTsKKyAgICB9CisgICAgaWYgKCFnc3RfdjRsMl9vYmplY3RfZ2V0X25lYXJlc3Rfc2l6ZSAodjRsMm9iamVjdCwgcGl4ZWxmb3JtYXQsICZtYXhfdywKKyAgICAgICAgICAgICZtYXhfaCkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgICAiQ291bGQgbm90IHByb2JlIG1heGltdW0gY2FwdHVyZSBzaXplIGZvciBwaXhlbGZvcm1hdCAlIgorICAgICAgICAgIEdTVF9GT1VSQ0NfRk9STUFULCBHU1RfRk9VUkNDX0FSR1MgKHBpeGVsZm9ybWF0KSk7CisgICAgfQorCisgICAgLyogU2luY2Ugd2UgY2FuJ3QgZ2V0IGZyYW1lcmF0ZSBkaXJlY3RseSwgdHJ5IHRvIHVzZSB0aGUgY3VycmVudCBub3JtICovCisgICAgaWYgKHY0bDJvYmplY3QtPnR2X25vcm0gJiYgdjRsMm9iamVjdC0+bm9ybXMpIHsKKyAgICAgIEdMaXN0ICpub3JtczsKKyAgICAgIEdzdFR1bmVyTm9ybSAqbm9ybSA9IE5VTEw7CisgICAgICBHc3RUdW5lck5vcm0gKmN1cnJlbnQgPQorICAgICAgICAgIGdzdF92NGwyX3R1bmVyX2dldF9ub3JtX2J5X3N0ZF9pZCAodjRsMm9iamVjdCwgdjRsMm9iamVjdC0+dHZfbm9ybSk7CisKKyAgICAgIGZvciAobm9ybXMgPSB2NGwyb2JqZWN0LT5ub3Jtczsgbm9ybXMgIT0gTlVMTDsgbm9ybXMgPSBub3Jtcy0+bmV4dCkgeworICAgICAgICBub3JtID0gKEdzdFR1bmVyTm9ybSAqKSBub3Jtcy0+ZGF0YTsKKyAgICAgICAgaWYgKCFzdHJjbXAgKG5vcm0tPmxhYmVsLCBjdXJyZW50LT5sYWJlbCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAvKiBJZiBpdCdzIHBvc3NpYmxlLCBzZXQgZnJhbWVyYXRlIHRvIHRoYXQgKGRpc2NyZXRlKSB2YWx1ZSAqLworICAgICAgaWYgKG5vcm0pIHsKKyAgICAgICAgZml4X251bSA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fbnVtZXJhdG9yICgmbm9ybS0+ZnJhbWVyYXRlKTsKKyAgICAgICAgZml4X2Rlbm9tID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9kZW5vbWluYXRvciAoJm5vcm0tPmZyYW1lcmF0ZSk7CisgICAgICB9CisgICAgfQorCisgICAgdG1wID0gZ3N0X3N0cnVjdHVyZV9jb3B5ICh0ZW1wbGF0ZSk7CisgICAgaWYgKGZpeF9udW0pIHsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0ICh0bXAsICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTiwgZml4X251bSwKKyAgICAgICAgICBmaXhfZGVub20sIE5VTEwpOworICAgIH0gZWxzZSBpZiAodjRsMm9iamVjdC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwKKyAgICAgICAgdjRsMm9iamVjdC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7CisgICAgICAvKiBpZiBub3JtIGNhbid0IGJlIHVzZWQsIGNvcHkgdGhlIHRlbXBsYXRlIGZyYW1lcmF0ZSAqLworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHRtcCwgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OX1JBTkdFLCAwLCAxLAorICAgICAgICAgIEdfTUFYSU5ULCAxLCBOVUxMKTsKKyAgICB9CisKKyAgICBpZiAobWluX3cgPT0gbWF4X3cpCisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAodG1wLCAid2lkdGgiLCBHX1RZUEVfSU5ULCBtYXhfdywgTlVMTCk7CisgICAgZWxzZQorICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHRtcCwgIndpZHRoIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCBtaW5fdywgbWF4X3csIE5VTEwpOworCisgICAgaWYgKG1pbl9oID09IG1heF9oKQorICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHRtcCwgImhlaWdodCIsIEdfVFlQRV9JTlQsIG1heF9oLCBOVUxMKTsKKyAgICBlbHNlCisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAodG1wLCAiaGVpZ2h0IiwgR1NUX1RZUEVfSU5UX1JBTkdFLCBtaW5faCwgbWF4X2gsIE5VTEwpOworCisgICAgZ3N0X3Y0bDJfb2JqZWN0X2FkZF9hc3BlY3RfcmF0aW8gKHY0bDJvYmplY3QsIHRtcCk7CisKKyAgICBpZiAoIXY0bDJvYmplY3QtPnNraXBfdHJ5X2ZtdF9wcm9iZXMpIHsKKyAgICAgIC8qIFdlIGNvdWxkIGNvbnNpZGVyIHNldHRpbmcgaW50ZXJsYWNlIG1vZGUgZnJvbSBtaW4gYW5kIG1heC4gKi8KKyAgICAgIGdzdF92NGwyX29iamVjdF9hZGRfaW50ZXJsYWNlX21vZGUgKHY0bDJvYmplY3QsIHRtcCwgbWF4X3csIG1heF9oLAorICAgICAgICAgIHBpeGVsZm9ybWF0KTsKKyAgICAgIC8qIFdlIGNvdWxkIGNvbnNpZGVyIHRvIGNoZWNrIGNvbG9yc3BhY2UgZm9yIG1pbiB0b28sIGluIGNhc2UgaXQgZGVwZW5kcyBvbgorICAgICAgICogdGhlIHNpemUuIEJ1dCBpbiB0aGlzIGNhc2UsIG1pbiBhbmQgbWF4IGNvdWxkIG5vdCBiZSBlbm91Z2ggKi8KKyAgICAgIGdzdF92NGwyX29iamVjdF9hZGRfY29sb3JzcGFjZSAodjRsMm9iamVjdCwgdG1wLCBtYXhfdywgbWF4X2gsCisgICAgICAgICAgcGl4ZWxmb3JtYXQpOworICAgIH0KKworICAgIGdzdF92NGwyX29iamVjdF91cGRhdGVfYW5kX2FwcGVuZCAodjRsMm9iamVjdCwgcGl4ZWxmb3JtYXQsIHJldCwgdG1wKTsKKyAgICByZXR1cm4gcmV0OworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfb2JqZWN0X2dldF9uZWFyZXN0X3NpemUgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIGd1aW50MzIgcGl4ZWxmb3JtYXQsIGdpbnQgKiB3aWR0aCwgZ2ludCAqIGhlaWdodCkKK3sKKyAgc3RydWN0IHY0bDJfZm9ybWF0IGZtdDsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisgIEdzdFZpZGVvSW50ZXJsYWNlTW9kZSBpbnRlcmxhY2VfbW9kZTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAod2lkdGggIT0gTlVMTCwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoaGVpZ2h0ICE9IE5VTEwsIEZBTFNFKTsKKworICBHU1RfTE9HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICJnZXR0aW5nIG5lYXJlc3Qgc2l6ZSB0byAlZHglZCB3aXRoIGZvcm1hdCAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICp3aWR0aCwgKmhlaWdodCwgR1NUX0ZPVVJDQ19BUkdTIChwaXhlbGZvcm1hdCkpOworCisgIG1lbXNldCAoJmZtdCwgMCwgc2l6ZW9mIChzdHJ1Y3QgdjRsMl9mb3JtYXQpKTsKKworICAvKiBnZXQgc2l6ZSBkZWxpbWl0ZXJzICovCisgIG1lbXNldCAoJmZtdCwgMCwgc2l6ZW9mIChmbXQpKTsKKyAgZm10LnR5cGUgPSB2NGwyb2JqZWN0LT50eXBlOworICBmbXQuZm10LnBpeC53aWR0aCA9ICp3aWR0aDsKKyAgZm10LmZtdC5waXguaGVpZ2h0ID0gKmhlaWdodDsKKyAgZm10LmZtdC5waXgucGl4ZWxmb3JtYXQgPSBwaXhlbGZvcm1hdDsKKyAgZm10LmZtdC5waXguZmllbGQgPSBWNEwyX0ZJRUxEX0FOWTsKKworICBpZiAoZ3N0X3Y0bDJfb2JqZWN0X3RyeV9mbXQgKHY0bDJvYmplY3QsICZmbXQpIDwgMCkKKyAgICBnb3RvIGVycm9yOworCisgIEdTVF9MT0dfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLAorICAgICAgImdvdCBuZWFyZXN0IHNpemUgJWR4JWQiLCBmbXQuZm10LnBpeC53aWR0aCwgZm10LmZtdC5waXguaGVpZ2h0KTsKKworICAqd2lkdGggPSBmbXQuZm10LnBpeC53aWR0aDsKKyAgKmhlaWdodCA9IGZtdC5mbXQucGl4LmhlaWdodDsKKworICBpZiAoIWdzdF92NGwyX29iamVjdF9nZXRfaW50ZXJsYWNlX21vZGUgKGZtdC5mbXQucGl4LmZpZWxkLCAmaW50ZXJsYWNlX21vZGUpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLAorICAgICAgICAiVW5zdXBwb3J0ZWQgZmllbGQgdHlwZSBmb3IgJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIkAldXgldTogJXUiLAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHBpeGVsZm9ybWF0KSwgKndpZHRoLCAqaGVpZ2h0LCBmbXQuZm10LnBpeC5maWVsZCk7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIHJldCA9IFRSVUU7CisKK2Vycm9yOgorICBpZiAoIXJldCkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgIlVuYWJsZSB0byB0cnkgZm9ybWF0OiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX29iamVjdF9pc19kbWFidWZfc3VwcG9ydGVkIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKyAgc3RydWN0IHY0bDJfZXhwb3J0YnVmZmVyIGV4cGJ1ZiA9IHsKKyAgICAudHlwZSA9IHY0bDJvYmplY3QtPnR5cGUsCisgICAgLmluZGV4ID0gLTEsCisgICAgLnBsYW5lID0gLTEsCisgICAgLmZsYWdzID0gT19DTE9FWEVDIHwgT19SRFdSLAorICB9OworCisgIC8qIEV4cGVjdGVkIHRvIGZhaWwsIGJ1dCBFTk9UVFkgdGVsbHMgdXMgdGhhdCBpdCBpcyBub3QgaW1wbGVtZW50ZWQuICovCisgIHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX0VYUEJVRiwgJmV4cGJ1Zik7CisgIGlmIChlcnJubyA9PSBFTk9UVFkpCisgICAgcmV0ID0gRkFMU0U7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl9vYmplY3Rfc2V0dXBfcG9vbCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RWNGwySU9Nb2RlIG1vZGU7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgImluaXRpYWxpemluZyB0aGUgJXMgc3lzdGVtIiwKKyAgICAgIFY0TDJfVFlQRV9JU19PVVRQVVQgKHY0bDJvYmplY3QtPnR5cGUpID8gIm91dHB1dCIgOiAiY2FwdHVyZSIpOworCisgIEdTVF9WNEwyX0NIRUNLX09QRU4gKHY0bDJvYmplY3QpOworICBHU1RfVjRMMl9DSEVDS19OT1RfQUNUSVZFICh2NGwyb2JqZWN0KTsKKworICAvKiBmaW5kIHRyYW5zcG9ydCAqLworICBtb2RlID0gdjRsMm9iamVjdC0+cmVxX21vZGU7CisKKyAgaWYgKHY0bDJvYmplY3QtPmRldmljZV9jYXBzICYgVjRMMl9DQVBfUkVBRFdSSVRFKSB7CisgICAgaWYgKHY0bDJvYmplY3QtPnJlcV9tb2RlID09IEdTVF9WNEwyX0lPX0FVVE8pCisgICAgICBtb2RlID0gR1NUX1Y0TDJfSU9fUlc7CisgIH0gZWxzZSBpZiAodjRsMm9iamVjdC0+cmVxX21vZGUgPT0gR1NUX1Y0TDJfSU9fUlcpCisgICAgZ290byBtZXRob2Rfbm90X3N1cHBvcnRlZDsKKworICBpZiAodjRsMm9iamVjdC0+ZGV2aWNlX2NhcHMgJiBWNEwyX0NBUF9TVFJFQU1JTkcpIHsKKyAgICBpZiAodjRsMm9iamVjdC0+cmVxX21vZGUgPT0gR1NUX1Y0TDJfSU9fQVVUTykgeworICAgICAgaWYgKCFWNEwyX1RZUEVfSVNfT1VUUFVUICh2NGwyb2JqZWN0LT50eXBlKSAmJgorICAgICAgICAgIGdzdF92NGwyX29iamVjdF9pc19kbWFidWZfc3VwcG9ydGVkICh2NGwyb2JqZWN0KSkgeworICAgICAgICBtb2RlID0gR1NUX1Y0TDJfSU9fRE1BQlVGOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbW9kZSA9IEdTVF9WNEwyX0lPX01NQVA7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKHY0bDJvYmplY3QtPnJlcV9tb2RlID09IEdTVF9WNEwyX0lPX01NQVApCisgICAgZ290byBtZXRob2Rfbm90X3N1cHBvcnRlZDsKKworICAvKiBpZiBzdGlsbCBubyB0cmFuc3BvcnQgc2VsZWN0ZWQsIGVycm9yIG91dCAqLworICBpZiAobW9kZSA9PSBHU1RfVjRMMl9JT19BVVRPKQorICAgIGdvdG8gbm9fc3VwcG9ydGVkX2NhcHR1cmVfbWV0aG9kOworCisgIEdTVF9JTkZPX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgImFjY2Vzc2luZyBidWZmZXJzIHZpYSBtb2RlICVkIiwgbW9kZSk7CisgIHY0bDJvYmplY3QtPm1vZGUgPSBtb2RlOworCisgIC8qIElmIG1pbl9idWZmZXJzIGlzIG5vdCBzZXQsIHRoZSBkcml2ZXIgZWl0aGVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNvbnRyb2wgb3IKKyAgICAgaXQgaGFzIG5vdCBiZWVuIGFza2VkIHlldCB2aWEgcHJvcG9zZV9hbGxvY2F0aW9uL2RlY2lkZV9hbGxvY2F0aW9uLiAqLworICBpZiAoIXY0bDJvYmplY3QtPm1pbl9idWZmZXJzKQorICAgIGdzdF92NGwyX2dldF9kcml2ZXJfbWluX2J1ZmZlcnMgKHY0bDJvYmplY3QpOworCisgIC8qIE1hcCB0aGUgYnVmZmVycyAqLworICBHU1RfTE9HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgImluaXRpYXRpbmcgYnVmZmVyIHBvb2wiKTsKKworICBpZiAoISh2NGwyb2JqZWN0LT5wb29sID0gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfbmV3ICh2NGwyb2JqZWN0LCBjYXBzKSkpCisgICAgZ290byBidWZmZXJfcG9vbF9uZXdfZmFpbGVkOworCisgIEdTVF9WNEwyX1NFVF9BQ1RJVkUgKHY0bDJvYmplY3QpOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworYnVmZmVyX3Bvb2xfbmV3X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh2NGwyb2JqZWN0LT5lbGVtZW50LCBSRVNPVVJDRSwgUkVBRCwKKyAgICAgICAgKF8oIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIiksCisgICAgICAgICAgICB2NGwyb2JqZWN0LT52aWRlb2RldiksCisgICAgICAgICgiRmFpbGVkIHRvIGNyZWF0ZSBidWZmZXIgcG9vbDogJXMiLCBnX3N0cmVycm9yIChlcnJubykpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK21ldGhvZF9ub3Rfc3VwcG9ydGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHY0bDJvYmplY3QtPmVsZW1lbnQsIFJFU09VUkNFLCBSRUFELAorICAgICAgICAoXygiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiKSwKKyAgICAgICAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2LCBtb2RlKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX3N1cHBvcnRlZF9jYXB0dXJlX21ldGhvZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh2NGwyb2JqZWN0LT5lbGVtZW50LCBSRVNPVVJDRSwgUkVBRCwKKyAgICAgICAgKF8oIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gIgorICAgICAgICAgICAgICAgICJtZXRob2QuIiksIHY0bDJvYmplY3QtPnZpZGVvZGV2KSwgKE5VTEwpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX29iamVjdF9zZXRfc3RyaWRlIChHc3RWaWRlb0luZm8gKiBpbmZvLCBHc3RWaWRlb0FsaWdubWVudCAqIGFsaWduLAorICAgIGdpbnQgcGxhbmUsIGdpbnQgc3RyaWRlKQoreworICBjb25zdCBHc3RWaWRlb0Zvcm1hdEluZm8gKmZpbmZvID0gaW5mby0+ZmluZm87CisKKyAgaWYgKEdTVF9WSURFT19GT1JNQVRfSU5GT19JU19USUxFRCAoZmluZm8pKSB7CisgICAgZ2ludCB4X3RpbGVzLCB5X3RpbGVzLCB3cywgaHMsIHRpbGVfaGVpZ2h0LCBwYWRkZWRfaGVpZ2h0OworCisKKyAgICB3cyA9IEdTVF9WSURFT19GT1JNQVRfSU5GT19USUxFX1dTIChmaW5mbyk7CisgICAgaHMgPSBHU1RfVklERU9fRk9STUFUX0lORk9fVElMRV9IUyAoZmluZm8pOworICAgIHRpbGVfaGVpZ2h0ID0gMSA8PCBoczsKKworICAgIHBhZGRlZF9oZWlnaHQgPSBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfSEVJR0hUIChmaW5mbywgcGxhbmUsCisgICAgICAgIGluZm8tPmhlaWdodCArIGFsaWduLT5wYWRkaW5nX3RvcCArIGFsaWduLT5wYWRkaW5nX2JvdHRvbSk7CisgICAgcGFkZGVkX2hlaWdodCA9IEdTVF9ST1VORF9VUF9OIChwYWRkZWRfaGVpZ2h0LCB0aWxlX2hlaWdodCk7CisKKyAgICB4X3RpbGVzID0gc3RyaWRlID4+IHdzOworICAgIHlfdGlsZXMgPSBwYWRkZWRfaGVpZ2h0ID4+IGhzOworICAgIGluZm8tPnN0cmlkZVtwbGFuZV0gPSBHU1RfVklERU9fVElMRV9NQUtFX1NUUklERSAoeF90aWxlcywgeV90aWxlcyk7CisgIH0gZWxzZSB7CisgICAgaW5mby0+c3RyaWRlW3BsYW5lXSA9IHN0cmlkZTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfb2JqZWN0X2V4dHJhcG9sYXRlX2luZm8gKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIEdzdFZpZGVvSW5mbyAqIGluZm8sIEdzdFZpZGVvQWxpZ25tZW50ICogYWxpZ24sIGdpbnQgc3RyaWRlKQoreworICBjb25zdCBHc3RWaWRlb0Zvcm1hdEluZm8gKmZpbmZvID0gaW5mby0+ZmluZm87CisgIGdpbnQgaSwgZXN0cmlkZSwgcGFkZGVkX2hlaWdodDsKKyAgZ3NpemUgb2ZmcyA9IDA7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAodjRsMm9iamVjdC0+bl92NGwyX3BsYW5lcyA9PSAxKTsKKworICBwYWRkZWRfaGVpZ2h0ID0gaW5mby0+aGVpZ2h0ICsgYWxpZ24tPnBhZGRpbmdfdG9wICsgYWxpZ24tPnBhZGRpbmdfYm90dG9tOworCisgIGZvciAoaSA9IDA7IGkgPCBmaW5mby0+bl9wbGFuZXM7IGkrKykgeworICAgIGVzdHJpZGUgPSBnc3RfdjRsMl9vYmplY3RfZXh0cmFwb2xhdGVfc3RyaWRlIChmaW5mbywgaSwgc3RyaWRlKTsKKworICAgIGdzdF92NGwyX29iamVjdF9zZXRfc3RyaWRlIChpbmZvLCBhbGlnbiwgaSwgZXN0cmlkZSk7CisKKyAgICBpbmZvLT5vZmZzZXRbaV0gPSBvZmZzOworICAgIG9mZnMgKz0gZXN0cmlkZSAqCisgICAgICAgIEdTVF9WSURFT19GT1JNQVRfSU5GT19TQ0FMRV9IRUlHSFQgKGZpbmZvLCBpLCBwYWRkZWRfaGVpZ2h0KTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAgICJFeHRyYXBvbGF0ZWQgZm9yIHBsYW5lICVkIHdpdGggYmFzZSBzdHJpZGUgJWQ6ICIKKyAgICAgICAgInN0cmlkZSAlZCwgb2Zmc2V0ICUiIEdfR1NJWkVfRk9STUFULCBpLCBzdHJpZGUsIGluZm8tPnN0cmlkZVtpXSwKKyAgICAgICAgaW5mby0+b2Zmc2V0W2ldKTsKKyAgfQorCisgIC8qIFVwZGF0ZSB0aGUgaW1hZ2Ugc2l6ZSBhY2NvcmRpbmcgdGhlIGFtb3VudCBvZiBkYXRhIHdlIGFyZSBnb2luZyB0bworICAgKiByZWFkL3dyaXRlLiBUaGlzIHdvcmthcm91bmQgYnVncyBpbiBkcml2ZXIgd2hlcmUgdGhlIHNpemVpbWFnZSBwcm92aWRlZAorICAgKiBieSBUUlkvU19GTVQgcmVwcmVzZW50IHRoZSBidWZmZXIgbGVuZ3RoIChtYXhpbXVtIHNpemUpIHJhdGhlciB0aGVuIHRoZSBleHBlY3RlZAorICAgKiBieXRlc3VzZWQgKGJ1ZmZlciBzaXplKS4gKi8KKyAgaWYgKG9mZnMgPCBpbmZvLT5zaXplKQorICAgIGluZm8tPnNpemUgPSBvZmZzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfb2JqZWN0X3NhdmVfZm9ybWF0IChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmbXRkZXNjLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZvcm1hdCwKKyAgICBHc3RWaWRlb0luZm8gKiBpbmZvLCBHc3RWaWRlb0FsaWdubWVudCAqIGFsaWduKQoreworICBjb25zdCBHc3RWaWRlb0Zvcm1hdEluZm8gKmZpbmZvID0gaW5mby0+ZmluZm87CisgIGdib29sZWFuIHN0YW5kYXJkX3N0cmlkZSA9IFRSVUU7CisgIGdpbnQgc3RyaWRlLCBwc3RyaWRlLCBwYWRkZWRfd2lkdGgsIHBhZGRlZF9oZWlnaHQsIGk7CisKKyAgaWYgKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoaW5mbykgPT0gR1NUX1ZJREVPX0ZPUk1BVF9FTkNPREVEKSB7CisgICAgdjRsMm9iamVjdC0+bl92NGwyX3BsYW5lcyA9IDE7CisgICAgaW5mby0+c2l6ZSA9IGZvcm1hdC0+Zm10LnBpeC5zaXplaW1hZ2U7CisgICAgZ290byBzdG9yZV9pbmZvOworICB9CisKKyAgLyogYWRqdXN0IHJpZ2h0IHBhZGRpbmcgKi8KKyAgaWYgKFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUiAodjRsMm9iamVjdC0+dHlwZSkpCisgICAgc3RyaWRlID0gZm9ybWF0LT5mbXQucGl4X21wLnBsYW5lX2ZtdFswXS5ieXRlc3BlcmxpbmU7CisgIGVsc2UKKyAgICBzdHJpZGUgPSBmb3JtYXQtPmZtdC5waXguYnl0ZXNwZXJsaW5lOworCisgIHBzdHJpZGUgPSBHU1RfVklERU9fRk9STUFUX0lORk9fUFNUUklERSAoZmluZm8sIDApOworICBpZiAocHN0cmlkZSkgeworICAgIHBhZGRlZF93aWR0aCA9IHN0cmlkZSAvIHBzdHJpZGU7CisgIH0gZWxzZSB7CisgICAgLyogcHN0cmlkZSBjYW4gYmUgMCBmb3IgY29tcGxleCBmb3JtYXRzICovCisgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyb2JqZWN0LT5lbGVtZW50LAorICAgICAgICAiZm9ybWF0ICVzIGhhcyBhIHBzdHJpZGUgb2YgMCwgY2Fubm90IGNvbXB1dGUgcGFkZGVkIHdpdGgiLAorICAgICAgICBnc3RfdmlkZW9fZm9ybWF0X3RvX3N0cmluZyAoR1NUX1ZJREVPX0lORk9fRk9STUFUIChpbmZvKSkpOworICAgIHBhZGRlZF93aWR0aCA9IHN0cmlkZTsKKyAgfQorCisgIGlmIChwYWRkZWRfd2lkdGggPCBmb3JtYXQtPmZtdC5waXgud2lkdGgpCisgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLAorICAgICAgICAiRHJpdmVyIGJ1ZyBkZXRlY3RlZCwgc3RyaWRlICglZCkgaXMgdG9vIHNtYWxsIGZvciB0aGUgd2lkdGggKCVkKSIsCisgICAgICAgIHBhZGRlZF93aWR0aCwgZm9ybWF0LT5mbXQucGl4LndpZHRoKTsKKworICBhbGlnbi0+cGFkZGluZ19yaWdodCA9IHBhZGRlZF93aWR0aCAtIGluZm8tPndpZHRoIC0gYWxpZ24tPnBhZGRpbmdfbGVmdDsKKworICAvKiBhZGp1c3QgYm90dG9tIHBhZGRpbmcgKi8KKyAgcGFkZGVkX2hlaWdodCA9IGZvcm1hdC0+Zm10LnBpeC5oZWlnaHQ7CisKKyAgaWYgKEdTVF9WSURFT19GT1JNQVRfSU5GT19JU19USUxFRCAoZmluZm8pKSB7CisgICAgZ3VpbnQgaHMsIHRpbGVfaGVpZ2h0OworCisgICAgaHMgPSBHU1RfVklERU9fRk9STUFUX0lORk9fVElMRV9IUyAoZmluZm8pOworICAgIHRpbGVfaGVpZ2h0ID0gMSA8PCBoczsKKworICAgIHBhZGRlZF9oZWlnaHQgPSBHU1RfUk9VTkRfVVBfTiAocGFkZGVkX2hlaWdodCwgdGlsZV9oZWlnaHQpOworICB9CisKKyAgYWxpZ24tPnBhZGRpbmdfYm90dG9tID0gcGFkZGVkX2hlaWdodCAtIGluZm8tPmhlaWdodCAtIGFsaWduLT5wYWRkaW5nX3RvcDsKKworICAvKiBzZXR1cCB0aGUgc3RyaWRlcyBhbmQgb2Zmc2V0ICovCisgIGlmIChWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIgKHY0bDJvYmplY3QtPnR5cGUpKSB7CisgICAgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgKnBpeF9tcCA9ICZmb3JtYXQtPmZtdC5waXhfbXA7CisKKyAgICAvKiBmaWd1cmUgb3V0IHRoZSBmcmFtZSBsYXlvdXQgKi8KKyAgICB2NGwyb2JqZWN0LT5uX3Y0bDJfcGxhbmVzID0gTUFYICgxLCBwaXhfbXAtPm51bV9wbGFuZXMpOworICAgIGluZm8tPnNpemUgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCB2NGwyb2JqZWN0LT5uX3Y0bDJfcGxhbmVzOyBpKyspIHsKKyAgICAgIHN0cmlkZSA9IHBpeF9tcC0+cGxhbmVfZm10W2ldLmJ5dGVzcGVybGluZTsKKworICAgICAgaWYgKGluZm8tPnN0cmlkZVtpXSAhPSBzdHJpZGUpCisgICAgICAgIHN0YW5kYXJkX3N0cmlkZSA9IEZBTFNFOworCisgICAgICBnc3RfdjRsMl9vYmplY3Rfc2V0X3N0cmlkZSAoaW5mbywgYWxpZ24sIGksIHN0cmlkZSk7CisgICAgICBpbmZvLT5vZmZzZXRbaV0gPSBpbmZvLT5zaXplOworICAgICAgaW5mby0+c2l6ZSArPSBwaXhfbXAtPnBsYW5lX2ZtdFtpXS5zaXplaW1hZ2U7CisgICAgfQorCisgICAgLyogRXh0cmFwb2xhdGUgc3RyaWRlIGlmIHBsYW5hciBmb3JtYXQgYXJlIGJlaW5nIHNldCBpbiAxIHY0bDIgcGxhbmUgKi8KKyAgICBpZiAodjRsMm9iamVjdC0+bl92NGwyX3BsYW5lcyA8IGZpbmZvLT5uX3BsYW5lcykgeworICAgICAgc3RyaWRlID0gZm9ybWF0LT5mbXQucGl4X21wLnBsYW5lX2ZtdFswXS5ieXRlc3BlcmxpbmU7CisgICAgICBnc3RfdjRsMl9vYmplY3RfZXh0cmFwb2xhdGVfaW5mbyAodjRsMm9iamVjdCwgaW5mbywgYWxpZ24sIHN0cmlkZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIG9ubHkgb25lIHBsYW5lIGluIG5vbi1NUExBTkUgbW9kZSAqLworICAgIHY0bDJvYmplY3QtPm5fdjRsMl9wbGFuZXMgPSAxOworICAgIGluZm8tPnNpemUgPSBmb3JtYXQtPmZtdC5waXguc2l6ZWltYWdlOworICAgIHN0cmlkZSA9IGZvcm1hdC0+Zm10LnBpeC5ieXRlc3BlcmxpbmU7CisKKyAgICBpZiAoaW5mby0+c3RyaWRlWzBdICE9IHN0cmlkZSkKKyAgICAgIHN0YW5kYXJkX3N0cmlkZSA9IEZBTFNFOworCisgICAgZ3N0X3Y0bDJfb2JqZWN0X2V4dHJhcG9sYXRlX2luZm8gKHY0bDJvYmplY3QsIGluZm8sIGFsaWduLCBzdHJpZGUpOworICB9CisKKyAgLyogYWRqdXN0IHRoZSBvZmZzZXQgdG8gdGFrZSBpbnRvIGFjY291bnQgbGVmdCBhbmQgdG9wICovCisgIGlmIChHU1RfVklERU9fRk9STUFUX0lORk9fSVNfVElMRUQgKGZpbmZvKSkgeworICAgIGlmICgoYWxpZ24tPnBhZGRpbmdfbGVmdCArIGFsaWduLT5wYWRkaW5nX3RvcCkgPiAwKQorICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLAorICAgICAgICAgICJMZWZ0IGFuZCB0b3AgcGFkZGluZyBpcyBub3QgcGVybWl0dGVkIGZvciB0aWxlZCBmb3JtYXRzIik7CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGZpbmZvLT5uX3BsYW5lczsgaSsrKSB7CisgICAgICBnaW50IHZlZGdlLCBoZWRnZTsKKworICAgICAgLyogRklYTUUgd2UgYXNzdW1lIHBsYW5lIGFzIGNvbXBvbmVudCBhcyB0aGlzIGlzIHRydWUgZm9yIGFsbCBzdXBwb3J0ZWQKKyAgICAgICAqIGZvcm1hdCB3ZSBzdXBwb3J0LiAqLworCisgICAgICBoZWRnZSA9IEdTVF9WSURFT19GT1JNQVRfSU5GT19TQ0FMRV9XSURUSCAoZmluZm8sIGksIGFsaWduLT5wYWRkaW5nX2xlZnQpOworICAgICAgdmVkZ2UgPSBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfSEVJR0hUIChmaW5mbywgaSwgYWxpZ24tPnBhZGRpbmdfdG9wKTsKKworICAgICAgaW5mby0+b2Zmc2V0W2ldICs9ICh2ZWRnZSAqIGluZm8tPnN0cmlkZVtpXSkgKworICAgICAgICAgIChoZWRnZSAqIEdTVF9WSURFT19JTkZPX0NPTVBfUFNUUklERSAoaW5mbywgaSkpOworICAgIH0KKyAgfQorCitzdG9yZV9pbmZvOgorICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiR290IHNpemVpbWFnZSAlIiBHX0dTSVpFX0ZPUk1BVCwKKyAgICAgIGluZm8tPnNpemUpOworCisgIC8qIHRvIGF2b2lkIGNvcGllcyB3ZSBuZWVkIHZpZGVvIG1ldGEgaWYgdGhlcmUgaXMgcGFkZGluZyAqLworICB2NGwyb2JqZWN0LT5uZWVkX3ZpZGVvX21ldGEgPQorICAgICAgKChhbGlnbi0+cGFkZGluZ190b3AgKyBhbGlnbi0+cGFkZGluZ19sZWZ0ICsgYWxpZ24tPnBhZGRpbmdfcmlnaHQgKworICAgICAgICAgIGFsaWduLT5wYWRkaW5nX2JvdHRvbSkgIT0gMCk7CisKKyAgLyogLi4uIG9yIGlmIHN0cmlkZSBpcyBub24gInN0YW5kYXJkIiAqLworICBpZiAoIXN0YW5kYXJkX3N0cmlkZSkKKyAgICB2NGwyb2JqZWN0LT5uZWVkX3ZpZGVvX21ldGEgPSBUUlVFOworCisgIC8qIC4uLiBvciBhbHNvIHZpZGVvIG1ldGEgaWYgd2UgdXNlIG11bHRpcGxlLCBub24tY29udGlndW91cywgcGxhbmVzICovCisgIGlmICh2NGwyb2JqZWN0LT5uX3Y0bDJfcGxhbmVzID4gMSkKKyAgICB2NGwyb2JqZWN0LT5uZWVkX3ZpZGVvX21ldGEgPSBUUlVFOworCisgIHY0bDJvYmplY3QtPmluZm8gPSAqaW5mbzsKKyAgdjRsMm9iamVjdC0+YWxpZ24gPSAqYWxpZ247CisgIHY0bDJvYmplY3QtPmZvcm1hdCA9ICpmb3JtYXQ7CisgIHY0bDJvYmplY3QtPmZtdGRlc2MgPSBmbXRkZXNjOworCisgIC8qIGlmIHdlIGhhdmUgYSBmcmFtZXJhdGUgcHJlLWNhbGN1bGF0ZSBkdXJhdGlvbiAqLworICBpZiAoaW5mby0+ZnBzX24gPiAwICYmIGluZm8tPmZwc19kID4gMCkgeworICAgIHY0bDJvYmplY3QtPmR1cmF0aW9uID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoR1NUX1NFQ09ORCwgaW5mby0+ZnBzX2QsCisgICAgICAgIGluZm8tPmZwc19uKTsKKyAgfSBlbHNlIHsKKyAgICB2NGwyb2JqZWN0LT5kdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIH0KK30KKworZ2ludAorZ3N0X3Y0bDJfb2JqZWN0X2V4dHJhcG9sYXRlX3N0cmlkZSAoY29uc3QgR3N0VmlkZW9Gb3JtYXRJbmZvICogZmluZm8sCisgICAgZ2ludCBwbGFuZSwgZ2ludCBzdHJpZGUpCit7CisgIGdpbnQgZXN0cmlkZTsKKworICBzd2l0Y2ggKGZpbmZvLT5mb3JtYXQpIHsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYxMjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYxMl82NFozMjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYyMToKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYxNjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlY2MToKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYyNDoKKyAgICAgIGVzdHJpZGUgPSAocGxhbmUgPT0gMCA/IDEgOiAyKSAqCisgICAgICAgICAgR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX1dJRFRIIChmaW5mbywgcGxhbmUsIHN0cmlkZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZXN0cmlkZSA9IEdTVF9WSURFT19GT1JNQVRfSU5GT19TQ0FMRV9XSURUSCAoZmluZm8sIHBsYW5lLCBzdHJpZGUpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gZXN0cmlkZTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl9vYmplY3Rfc2V0X2Zvcm1hdF9mdWxsIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgR3N0Q2FwcyAqIGNhcHMsCisgICAgZ2Jvb2xlYW4gdHJ5X29ubHksIEdzdFY0bDJFcnJvciAqIGVycm9yKQoreworICBnaW50IGZkID0gdjRsMm9iamVjdC0+dmlkZW9fZmQ7CisgIHN0cnVjdCB2NGwyX2Zvcm1hdCBmb3JtYXQ7CisgIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gc3RyZWFtcGFybTsKKyAgZW51bSB2NGwyX2ZpZWxkIGZpZWxkOworICBndWludDMyIHBpeGVsZm9ybWF0OworICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmbXRkZXNjOworICBHc3RWaWRlb0luZm8gaW5mbzsKKyAgR3N0VmlkZW9BbGlnbm1lbnQgYWxpZ247CisgIGdpbnQgd2lkdGgsIGhlaWdodCwgZnBzX24sIGZwc19kOworICBnaW50IG5fdjRsX3BsYW5lczsKKyAgZ2ludCBpID0gMDsKKyAgZ2Jvb2xlYW4gaXNfbXBsYW5lOworICBlbnVtIHY0bDJfY29sb3JzcGFjZSBjb2xvcnNwYWNlID0gMDsKKyAgZW51bSB2NGwyX3F1YW50aXphdGlvbiByYW5nZSA9IDA7CisgIGVudW0gdjRsMl95Y2Jjcl9lbmNvZGluZyBtYXRyaXggPSAwOworICBlbnVtIHY0bDJfeGZlcl9mdW5jIHRyYW5zZmVyID0gMDsKKyAgR3N0U3RydWN0dXJlICpzOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsICghdjRsMm9iamVjdC0+c2tpcF90cnlfZm10X3Byb2JlcyB8fAorICAgICAgZ3N0X2NhcHNfaXNfd3JpdGFibGUgKGNhcHMpLCBGQUxTRSk7CisKKyAgR1NUX1Y0TDJfQ0hFQ0tfT1BFTiAodjRsMm9iamVjdCk7CisgIGlmICghdHJ5X29ubHkpCisgICAgR1NUX1Y0TDJfQ0hFQ0tfTk9UX0FDVElWRSAodjRsMm9iamVjdCk7CisKKyAgaXNfbXBsYW5lID0gVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSICh2NGwyb2JqZWN0LT50eXBlKTsKKworICBnc3RfdmlkZW9faW5mb19pbml0ICgmaW5mbyk7CisgIGdzdF92aWRlb19hbGlnbm1lbnRfcmVzZXQgKCZhbGlnbik7CisKKyAgaWYgKCFnc3RfdjRsMl9vYmplY3RfZ2V0X2NhcHNfaW5mbyAodjRsMm9iamVjdCwgY2FwcywgJmZtdGRlc2MsICZpbmZvKSkKKyAgICBnb3RvIGludmFsaWRfY2FwczsKKworICBwaXhlbGZvcm1hdCA9IGZtdGRlc2MtPnBpeGVsZm9ybWF0OworICB3aWR0aCA9IEdTVF9WSURFT19JTkZPX1dJRFRIICgmaW5mbyk7CisgIGhlaWdodCA9IEdTVF9WSURFT19JTkZPX0hFSUdIVCAoJmluZm8pOworICBmcHNfbiA9IEdTVF9WSURFT19JTkZPX0ZQU19OICgmaW5mbyk7CisgIGZwc19kID0gR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZpbmZvKTsKKworICAvKiBpZiBlbmNvZGVkIGZvcm1hdCAoR1NUX1ZJREVPX0lORk9fTl9QTEFORVMgcmV0dXJuIDApCisgICAqIG9yIGlmIGNvbnRpZ3VvdXMgaXMgcHJlZmVyZWQgKi8KKyAgbl92NGxfcGxhbmVzID0gR1NUX1ZJREVPX0lORk9fTl9QTEFORVMgKCZpbmZvKTsKKyAgaWYgKCFuX3Y0bF9wbGFuZXMgfHwgIXY0bDJvYmplY3QtPnByZWZlcmVkX25vbl9jb250aWd1b3VzKQorICAgIG5fdjRsX3BsYW5lcyA9IDE7CisKKyAgaWYgKEdTVF9WSURFT19JTkZPX0lTX0lOVEVSTEFDRUQgKCZpbmZvKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJpbnRlcmxhY2VkIHZpZGVvIik7CisgICAgLyogaWRlYWxseSB3ZSB3b3VsZCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdHlwZXMgb2YgaW50ZXJsYWNlZCB2aWRlbworICAgICAqIGJ1dCB0aGVyZSBpcyBub3Qgc3VmZmljaWVudCBpbmZvcm1hdGlvbiBpbiB0aGUgY2Fwcy4uCisgICAgICovCisgICAgZmllbGQgPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgInByb2dyZXNzaXZlIHZpZGVvIik7CisgICAgZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisgIH0KKworICBpZiAoVjRMMl9UWVBFX0lTX09VVFBVVCAodjRsMm9iamVjdC0+dHlwZSkpIHsKKyAgICAvKiBXZSBmaXJzdCBwaWNrIHRoIG1haW4gY29sb3JzcGFjZSBmcm9tIHRoZSBwcmltYXJpZXMgKi8KKyAgICBzd2l0Y2ggKGluZm8uY29sb3JpbWV0cnkucHJpbWFyaWVzKSB7CisgICAgICBjYXNlIEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfQlQ3MDk6CisgICAgICAgIC8qIFRoZXJlIGlzIHR3byBjb2xvcnNwYWNlcyB1c2luZyB0aGVzZSBwcmltYXJpZXMsIHVzZSB0aGUgcmFuZ2UgdG8KKyAgICAgICAgICogZGlmZmVyZW50aWF0ZSAqLworICAgICAgICBpZiAoaW5mby5jb2xvcmltZXRyeS5yYW5nZSA9PSBHU1RfVklERU9fQ09MT1JfUkFOR0VfMTZfMjM1KQorICAgICAgICAgIGNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfUkVDNzA5OworICAgICAgICBlbHNlCisgICAgICAgICAgY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19CVDIwMjA6CisgICAgICAgIGNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfQlQyMDIwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19CVDQ3ME06CisgICAgICAgIGNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9NOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19CVDQ3MEJHOgorICAgICAgICBjb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fQ09MT1JfUFJJTUFSSUVTX1NNUFRFMTcwTToKKyAgICAgICAgY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME07CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fQ09MT1JfUFJJTUFSSUVTX1NNUFRFMjQwTToKKyAgICAgICAgY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTI0ME07CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfRklMTToKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19VTktOT1dOOgorICAgICAgICAvKiBXZSBkb24ndCBrbm93LCB3ZSB3aWxsIGd1ZXNzICovCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAgICAgICAiVW5rbm93biBjb2xvcmltZXRyeSBwcmltYXJpZXMgJWQiLCBpbmZvLmNvbG9yaW1ldHJ5LnByaW1hcmllcyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoaW5mby5jb2xvcmltZXRyeS5yYW5nZSkgeworICAgICAgY2FzZSBHU1RfVklERU9fQ09MT1JfUkFOR0VfMF8yNTU6CisgICAgICAgIHJhbmdlID0gVjRMMl9RVUFOVElaQVRJT05fRlVMTF9SQU5HRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19DT0xPUl9SQU5HRV8xNl8yMzU6CisgICAgICAgIHJhbmdlID0gVjRMMl9RVUFOVElaQVRJT05fTElNX1JBTkdFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0NPTE9SX1JBTkdFX1VOS05PV046CisgICAgICAgIC8qIFdlIGxldCB0aGUgZHJpdmVyIHBpY2sgYSBkZWZhdWx0IG9uZSAqLworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgICAgICJVbmtub3duIGNvbG9yaW1ldHJ5IHJhbmdlICVkIiwgaW5mby5jb2xvcmltZXRyeS5yYW5nZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoaW5mby5jb2xvcmltZXRyeS5tYXRyaXgpIHsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9SR0I6CisgICAgICAgIC8qIFVuc3BlY2lmaWVkLCBsZWF2ZSB0byBkZWZhdWx0ICovCisgICAgICAgIGJyZWFrOworICAgICAgICAvKiBGQ0MgaXMgYWJvdXQgdGhlIHNhbWUgYXMgQlQ2MDEgd2l0aCBsZXNzIGRpZ2l0ICovCisgICAgICBjYXNlIEdTVF9WSURFT19DT0xPUl9NQVRSSVhfRkNDOgorICAgICAgY2FzZSBHU1RfVklERU9fQ09MT1JfTUFUUklYX0JUNjAxOgorICAgICAgICBtYXRyaXggPSBWNEwyX1lDQkNSX0VOQ182MDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fQ09MT1JfTUFUUklYX0JUNzA5OgorICAgICAgICBtYXRyaXggPSBWNEwyX1lDQkNSX0VOQ183MDk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fQ09MT1JfTUFUUklYX1NNUFRFMjQwTToKKyAgICAgICAgbWF0cml4ID0gVjRMMl9ZQ0JDUl9FTkNfU01QVEUyNDBNOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9CVDIwMjA6CisgICAgICAgIG1hdHJpeCA9IFY0TDJfWUNCQ1JfRU5DX0JUMjAyMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19DT0xPUl9NQVRSSVhfVU5LTk9XTjoKKyAgICAgICAgLyogV2UgbGV0IHRoZSBkcml2ZXIgcGljayBhIGRlZmF1bHQgb25lICovCisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLAorICAgICAgICAgICAgIlVua25vd24gY29sb3JpbWV0cnkgbWF0cml4ICVkIiwgaW5mby5jb2xvcmltZXRyeS5tYXRyaXgpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGluZm8uY29sb3JpbWV0cnkudHJhbnNmZXIpIHsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX1RSQU5TRkVSX0dBTU1BMTg6CisgICAgICBjYXNlIEdTVF9WSURFT19UUkFOU0ZFUl9HQU1NQTIwOgorICAgICAgY2FzZSBHU1RfVklERU9fVFJBTlNGRVJfR0FNTUEyMjoKKyAgICAgIGNhc2UgR1NUX1ZJREVPX1RSQU5TRkVSX0dBTU1BMjg6CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgICAgICJHQU1NQSAxOCwgMjAsIDIyLCAyOCB0cmFuc2ZlciBmdW5jdGlvbnMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAvKiBmYWxsdGhyb3VnaCAqLworICAgICAgY2FzZSBHU1RfVklERU9fVFJBTlNGRVJfR0FNTUExMDoKKyAgICAgICAgdHJhbnNmZXIgPSBWNEwyX1hGRVJfRlVOQ19OT05FOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX1RSQU5TRkVSX0JUMjAyMF8xMjoKKyAgICAgIGNhc2UgR1NUX1ZJREVPX1RSQU5TRkVSX0JUNzA5OgorICAgICAgICB0cmFuc2ZlciA9IFY0TDJfWEZFUl9GVU5DXzcwOTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19UUkFOU0ZFUl9TTVBURTI0ME06CisgICAgICAgIHRyYW5zZmVyID0gVjRMMl9YRkVSX0ZVTkNfU01QVEUyNDBNOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX1RSQU5TRkVSX1NSR0I6CisgICAgICAgIHRyYW5zZmVyID0gVjRMMl9YRkVSX0ZVTkNfU1JHQjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19UUkFOU0ZFUl9MT0cxMDA6CisgICAgICBjYXNlIEdTVF9WSURFT19UUkFOU0ZFUl9MT0czMTY6CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgICAgICJMT0cgMTAwLCAzMTYgdHJhbnNmZXIgZnVuY3Rpb25zIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgLyogRklYTUUgTm8ga25vd24gc2Vuc2libGUgZGVmYXVsdCwgbWF5YmUgQWRvYmVSR0IgPyAqLworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX1RSQU5TRkVSX1VOS05PV046CisgICAgICAgIC8qIFdlIGxldCB0aGUgZHJpdmVyIHBpY2sgYSBkZWZhdWx0IG9uZSAqLworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgICAgICJVbmtub3duIGNvbG9yaW1ldHJ5IHRyYW5mZXIgJWQiLCBpbmZvLmNvbG9yaW1ldHJ5LnRyYW5zZmVyKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGNvbG9yc3BhY2UgPT0gMCkgeworICAgICAgLyogVHJ5IHRvIGd1ZXNzIGNvbG9yc3BhY2UgYWNjb3JkaW5nIHRvIHBpeGVsZm9ybWF0IGFuZCBzaXplICovCisgICAgICBpZiAoR1NUX1ZJREVPX0lORk9fSVNfWVVWICgmaW5mbykpIHsKKyAgICAgICAgLyogU0Qgc3RyZWFtcyBsaWtlbHkgdXNlIFNNUFRFMTcwTSBhbmQgSEQgc3RyZWFtcyBSRUM3MDkgKi8KKyAgICAgICAgaWYgKHdpZHRoIDw9IDcyMCAmJiBoZWlnaHQgPD0gNTc2KQorICAgICAgICAgIGNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNOworICAgICAgICBlbHNlCisgICAgICAgICAgY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9SRUM3MDk7CisgICAgICB9IGVsc2UgaWYgKEdTVF9WSURFT19JTkZPX0lTX1JHQiAoJmluZm8pKSB7CisgICAgICAgIGNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKKyAgICAgICAgdHJhbnNmZXIgPSBWNEwyX1hGRVJfRlVOQ19OT05FOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJEZXNpcmVkIGZvcm1hdCAlZHglZCwgZm9ybWF0ICIKKyAgICAgICIlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIHN0cmlkZTogJWQiLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgR1NUX0ZPVVJDQ19BUkdTIChwaXhlbGZvcm1hdCksIEdTVF9WSURFT19JTkZPX1BMQU5FX1NUUklERSAoJmluZm8sIDApKTsKKworICBtZW1zZXQgKCZmb3JtYXQsIDB4MDAsIHNpemVvZiAoc3RydWN0IHY0bDJfZm9ybWF0KSk7CisgIGZvcm1hdC50eXBlID0gdjRsMm9iamVjdC0+dHlwZTsKKworICBpZiAoaXNfbXBsYW5lKSB7CisgICAgZm9ybWF0LnR5cGUgPSB2NGwyb2JqZWN0LT50eXBlOworICAgIGZvcm1hdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gcGl4ZWxmb3JtYXQ7CisgICAgZm9ybWF0LmZtdC5waXhfbXAud2lkdGggPSB3aWR0aDsKKyAgICBmb3JtYXQuZm10LnBpeF9tcC5oZWlnaHQgPSBoZWlnaHQ7CisgICAgZm9ybWF0LmZtdC5waXhfbXAuZmllbGQgPSBmaWVsZDsKKyAgICBmb3JtYXQuZm10LnBpeF9tcC5udW1fcGxhbmVzID0gbl92NGxfcGxhbmVzOworCisgICAgLyogdHJ5IHRvIGFzayBvdXIgcHJlZmVyZWQgc3RyaWRlIGJ1dCBpdCdzIG5vdCBhIGZhaWx1cmUgaWYgbm90CisgICAgICogYWNjZXB0ZWQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbl92NGxfcGxhbmVzOyBpKyspIHsKKyAgICAgIGdpbnQgc3RyaWRlID0gR1NUX1ZJREVPX0lORk9fUExBTkVfU1RSSURFICgmaW5mbywgaSk7CisKKyAgICAgIGlmIChHU1RfVklERU9fRk9STUFUX0lORk9fSVNfVElMRUQgKGluZm8uZmluZm8pKQorICAgICAgICBzdHJpZGUgPSBHU1RfVklERU9fVElMRV9YX1RJTEVTIChzdHJpZGUpIDw8CisgICAgICAgICAgICBHU1RfVklERU9fRk9STUFUX0lORk9fVElMRV9XUyAoaW5mby5maW5mbyk7CisKKyAgICAgIGZvcm1hdC5mbXQucGl4X21wLnBsYW5lX2ZtdFtpXS5ieXRlc3BlcmxpbmUgPSBzdHJpZGU7CisgICAgfQorCisgICAgaWYgKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoJmluZm8pID09IEdTVF9WSURFT19GT1JNQVRfRU5DT0RFRCkKKyAgICAgIGZvcm1hdC5mbXQucGl4X21wLnBsYW5lX2ZtdFswXS5zaXplaW1hZ2UgPSBFTkNPREVEX0JVRkZFUl9TSVpFOworICB9IGVsc2UgeworICAgIGdpbnQgc3RyaWRlID0gR1NUX1ZJREVPX0lORk9fUExBTkVfU1RSSURFICgmaW5mbywgMCk7CisKKyAgICBmb3JtYXQudHlwZSA9IHY0bDJvYmplY3QtPnR5cGU7CisKKyAgICBmb3JtYXQuZm10LnBpeC53aWR0aCA9IHdpZHRoOworICAgIGZvcm1hdC5mbXQucGl4LmhlaWdodCA9IGhlaWdodDsKKyAgICBmb3JtYXQuZm10LnBpeC5waXhlbGZvcm1hdCA9IHBpeGVsZm9ybWF0OworICAgIGZvcm1hdC5mbXQucGl4LmZpZWxkID0gZmllbGQ7CisKKyAgICBpZiAoR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX0lTX1RJTEVEIChpbmZvLmZpbmZvKSkKKyAgICAgIHN0cmlkZSA9IEdTVF9WSURFT19USUxFX1hfVElMRVMgKHN0cmlkZSkgPDwKKyAgICAgICAgICBHU1RfVklERU9fRk9STUFUX0lORk9fVElMRV9XUyAoaW5mby5maW5mbyk7CisKKyAgICAvKiB0cnkgdG8gYXNrIG91ciBwcmVmZXJlZCBzdHJpZGUgKi8KKyAgICBmb3JtYXQuZm10LnBpeC5ieXRlc3BlcmxpbmUgPSBzdHJpZGU7CisKKyAgICBpZiAoR1NUX1ZJREVPX0lORk9fRk9STUFUICgmaW5mbykgPT0gR1NUX1ZJREVPX0ZPUk1BVF9FTkNPREVEKQorICAgICAgZm9ybWF0LmZtdC5waXguc2l6ZWltYWdlID0gRU5DT0RFRF9CVUZGRVJfU0laRTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJEZXNpcmVkIGZvcm1hdCBpcyAlZHglZCwgZm9ybWF0ICIKKyAgICAgICIlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiLCBuYiBwbGFuZXMgJWQiLCBmb3JtYXQuZm10LnBpeC53aWR0aCwKKyAgICAgIGZvcm1hdC5mbXQucGl4X21wLmhlaWdodCwKKyAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm9ybWF0LmZtdC5waXgucGl4ZWxmb3JtYXQpLAorICAgICAgaXNfbXBsYW5lID8gZm9ybWF0LmZtdC5waXhfbXAubnVtX3BsYW5lcyA6IDEpOworCisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworICBpZiAoaXNfbXBsYW5lKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGZvcm1hdC5mbXQucGl4X21wLm51bV9wbGFuZXM7IGkrKykKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICIgIHN0cmlkZSAlZCIsCisgICAgICAgICAgZm9ybWF0LmZtdC5waXhfbXAucGxhbmVfZm10W2ldLmJ5dGVzcGVybGluZSk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgIiAgc3RyaWRlICVkIiwKKyAgICAgICAgZm9ybWF0LmZtdC5waXguYnl0ZXNwZXJsaW5lKTsKKyAgfQorI2VuZGlmCisKKyAgaWYgKFY0TDJfVFlQRV9JU19PVVRQVVQgKHY0bDJvYmplY3QtPnR5cGUpKSB7CisgICAgaWYgKGlzX21wbGFuZSkgeworICAgICAgZm9ybWF0LmZtdC5waXhfbXAuY29sb3JzcGFjZSA9IGNvbG9yc3BhY2U7CisgICAgICBmb3JtYXQuZm10LnBpeF9tcC5xdWFudGl6YXRpb24gPSByYW5nZTsKKyAgICAgIGZvcm1hdC5mbXQucGl4X21wLnljYmNyX2VuYyA9IG1hdHJpeDsKKyAgICAgIGZvcm1hdC5mbXQucGl4X21wLnhmZXJfZnVuYyA9IHRyYW5zZmVyOworICAgIH0gZWxzZSB7CisgICAgICBmb3JtYXQuZm10LnBpeC5jb2xvcnNwYWNlID0gY29sb3JzcGFjZTsKKyAgICAgIGZvcm1hdC5mbXQucGl4LnF1YW50aXphdGlvbiA9IHJhbmdlOworICAgICAgZm9ybWF0LmZtdC5waXgueWNiY3JfZW5jID0gbWF0cml4OworICAgICAgZm9ybWF0LmZtdC5waXgueGZlcl9mdW5jID0gdHJhbnNmZXI7CisgICAgfQorCisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgIkRlc2lyZWQgY29sb3JzcGFjZSBpcyAlZDolZDolZDolZCIsCisgICAgICAgIGNvbG9yc3BhY2UsIHJhbmdlLCBtYXRyaXgsIHRyYW5zZmVyKTsKKyAgfQorCisgIGlmICh0cnlfb25seSkgeworICAgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAoZmQsIFZJRElPQ19UUllfRk1ULCAmZm9ybWF0KSA8IDApCisgICAgICBnb3RvIHRyeV9mbXRfZmFpbGVkOworICB9IGVsc2UgeworICAgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAoZmQsIFZJRElPQ19TX0ZNVCwgJmZvcm1hdCkgPCAwKQorICAgICAgZ290byBzZXRfZm10X2ZhaWxlZDsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJHb3QgZm9ybWF0IG9mICVkeCVkLCBmb3JtYXQgIgorICAgICAgIiUiIEdTVF9GT1VSQ0NfRk9STUFUICIsIG5iIHBsYW5lcyAlZCwgY29sb3JzcGFjZSAlZCIsCisgICAgICBmb3JtYXQuZm10LnBpeC53aWR0aCwgZm9ybWF0LmZtdC5waXhfbXAuaGVpZ2h0LAorICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3JtYXQuZm10LnBpeC5waXhlbGZvcm1hdCksCisgICAgICBpc19tcGxhbmUgPyBmb3JtYXQuZm10LnBpeF9tcC5udW1fcGxhbmVzIDogMSwKKyAgICAgIGlzX21wbGFuZSA/IGZvcm1hdC5mbXQucGl4X21wLmNvbG9yc3BhY2UgOiBmb3JtYXQuZm10LnBpeC5jb2xvcnNwYWNlKTsKKworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgaWYgKGlzX21wbGFuZSkgeworICAgIGZvciAoaSA9IDA7IGkgPCBmb3JtYXQuZm10LnBpeF9tcC5udW1fcGxhbmVzOyBpKyspCisgICAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiICBzdHJpZGUgJWQsIHNpemVpbWFnZSAlZCIsCisgICAgICAgICAgZm9ybWF0LmZtdC5waXhfbXAucGxhbmVfZm10W2ldLmJ5dGVzcGVybGluZSwKKyAgICAgICAgICBmb3JtYXQuZm10LnBpeF9tcC5wbGFuZV9mbXRbaV0uc2l6ZWltYWdlKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiICBzdHJpZGUgJWQsIHNpemVpbWFnZSAlZCIsCisgICAgICAgIGZvcm1hdC5mbXQucGl4LmJ5dGVzcGVybGluZSwgZm9ybWF0LmZtdC5waXguc2l6ZWltYWdlKTsKKyAgfQorI2VuZGlmCisKKyAgaWYgKGZvcm1hdC5mbXQucGl4LnBpeGVsZm9ybWF0ICE9IHBpeGVsZm9ybWF0KQorICAgIGdvdG8gaW52YWxpZF9waXhlbGZvcm1hdDsKKworICAvKiBPbmx5IG5lZ290aWF0ZSBzaXplIHdpdGggcmF3IGRhdGEuCisgICAqIEZvciBzb21lIGNvZGVjcyB0aGUgZGltZW5zaW9ucyBhcmUgKm5vdCogaW4gdGhlIGJpdHN0cmVhbSwgSUlSQyBWQzEKKyAgICogaW4gQVNGIG1vZGUgZm9yIGV4YW1wbGUsIHRoZXJlIGlzIGFsc28gbm90IHJlYXNvbiBmb3IgYSBkcml2ZXIgdG8KKyAgICogY2hhbmdlIHRoZSBzaXplLiAqLworICBpZiAoaW5mby5maW5mby0+Zm9ybWF0ICE9IEdTVF9WSURFT19GT1JNQVRfRU5DT0RFRCkgeworICAgIC8qIFdlIGNhbiBjcm9wIGxhcmdlciBpbWFnZXMgKi8KKyAgICBpZiAoZm9ybWF0LmZtdC5waXgud2lkdGggPCB3aWR0aCB8fCBmb3JtYXQuZm10LnBpeC5oZWlnaHQgPCBoZWlnaHQpCisgICAgICBnb3RvIGludmFsaWRfZGltZW5zaW9uczsKKworICAgIC8qIE5vdGUsIHRoaXMgd2lsbCBiZSBhZGp1c3RlZCBpZiB1cHN0cmVhbSBoYXMgbm9uLWNlbnRlcmVkIGNyb3BwaW5nLiAqLworICAgIGFsaWduLnBhZGRpbmdfdG9wID0gMDsKKyAgICBhbGlnbi5wYWRkaW5nX2JvdHRvbSA9IGZvcm1hdC5mbXQucGl4LmhlaWdodCAtIGhlaWdodDsKKyAgICBhbGlnbi5wYWRkaW5nX2xlZnQgPSAwOworICAgIGFsaWduLnBhZGRpbmdfcmlnaHQgPSBmb3JtYXQuZm10LnBpeC53aWR0aCAtIHdpZHRoOworICB9CisKKyAgaWYgKGlzX21wbGFuZSAmJiBmb3JtYXQuZm10LnBpeF9tcC5udW1fcGxhbmVzICE9IG5fdjRsX3BsYW5lcykKKyAgICBnb3RvIGludmFsaWRfcGxhbmVzOworCisgIGlmICgoaXNfbXBsYW5lICYmIGZvcm1hdC5mbXQucGl4X21wLmZpZWxkICE9IGZpZWxkKQorICAgICAgfHwgZm9ybWF0LmZtdC5waXguZmllbGQgIT0gZmllbGQpCisgICAgZ290byBpbnZhbGlkX2ZpZWxkOworCisgIGdzdF92NGwyX29iamVjdF9nZXRfY29sb3JzcGFjZSAoJmZvcm1hdCwgJmluZm8uY29sb3JpbWV0cnkpOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAiY29sb3JpbWV0cnkiKSkgeworICAgIEdzdFZpZGVvQ29sb3JpbWV0cnkgY2k7CisgICAgaWYgKCFnc3RfdmlkZW9fY29sb3JpbWV0cnlfZnJvbV9zdHJpbmcgKCZjaSwKKyAgICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgImNvbG9yaW1ldHJ5IikpCisgICAgICAgIHx8ICFnc3RfdmlkZW9fY29sb3JpbWV0cnlfaXNfZXF1YWwgKCZjaSwgJmluZm8uY29sb3JpbWV0cnkpKQorICAgICAgZ290byBpbnZhbGlkX2NvbG9yaW1ldHJ5OworICB9CisKKyAgLyogSW4gY2FzZSB3ZSBoYXZlIHNraXBwZWQgdGhlIHRyeV9mbXQgcHJvYmVzLCB3ZSdsbCBuZWVkIHRvIHNldCB0aGUKKyAgICogY29sb3JpbWV0cnkgYW5kIGludGVybGFjZS1tb2RlIGJhY2sgaW50byB0aGUgY2Fwcy4gKi8KKyAgaWYgKHY0bDJvYmplY3QtPnNraXBfdHJ5X2ZtdF9wcm9iZXMpIHsKKyAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAiY29sb3JpbWV0cnkiKSkgeworICAgICAgZ2NoYXIgKnN0ciA9IGdzdF92aWRlb19jb2xvcmltZXRyeV90b19zdHJpbmcgKCZpbmZvLmNvbG9yaW1ldHJ5KTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiY29sb3JpbWV0cnkiLCBHX1RZUEVfU1RSSU5HLCBzdHIsIE5VTEwpOworICAgICAgZ19mcmVlIChzdHIpOworICAgIH0KKworICAgIGlmICghZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHMsICJpbnRlcmxhY2UtbW9kZSIpKQorICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJpbnRlcmxhY2UtbW9kZSIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgICAgZ3N0X3ZpZGVvX2ludGVybGFjZV9tb2RlX3RvX3N0cmluZyAoaW5mby5pbnRlcmxhY2VfbW9kZSksIE5VTEwpOworICB9CisKKyAgaWYgKHRyeV9vbmx5KSAgICAgICAgICAgICAgICAgLyogZ29vZCBlbm91Z2ggZm9yIHRyeWluZyBvbmx5ICovCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKEdTVF9WSURFT19JTkZPX0hBU19BTFBIQSAoJmluZm8pKSB7CisgICAgc3RydWN0IHY0bDJfY29udHJvbCBjdGwgPSB7IDAsIH07CisgICAgY3RsLmlkID0gVjRMMl9DSURfQUxQSEFfQ09NUE9ORU5UOworICAgIGN0bC52YWx1ZSA9IDB4ZmY7CisKKyAgICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKGZkLCBWSURJT0NfU19DVFJMLCAmY3RsKSA8IDApCisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAgICAgIkZhaWxlZCB0byBzZXQgYWxwaGEgY29tcG9uZW50IHZhbHVlIik7CisgIH0KKworICAvKiBJcyB0aGVyZSBhIHJlYXNvbiB3ZSByZXF1aXJlIHRoZSBjYWxsZXIgdG8gYWx3YXlzIHNwZWNpZnkgYSBmcmFtZXJhdGU/ICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJEZXNpcmVkIGZyYW1lcmF0ZTogJXUvJXUiLCBmcHNfbiwKKyAgICAgIGZwc19kKTsKKworICBtZW1zZXQgKCZzdHJlYW1wYXJtLCAweDAwLCBzaXplb2YgKHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0pKTsKKyAgc3RyZWFtcGFybS50eXBlID0gdjRsMm9iamVjdC0+dHlwZTsKKworICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKGZkLCBWSURJT0NfR19QQVJNLCAmc3RyZWFtcGFybSkgPCAwKQorICAgIGdvdG8gZ2V0X3Bhcm1fZmFpbGVkOworCisgIGlmICh2NGwyb2JqZWN0LT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRQorICAgICAgfHwgdjRsMm9iamVjdC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7CisgICAgR1NUX1ZJREVPX0lORk9fRlBTX04gKCZpbmZvKSA9CisgICAgICAgIHN0cmVhbXBhcm0ucGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvcjsKKyAgICBHU1RfVklERU9fSU5GT19GUFNfRCAoJmluZm8pID0KKyAgICAgICAgc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLm51bWVyYXRvcjsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJHb3QgY2FwdHVyZSBmcmFtZXJhdGU6ICV1LyV1IiwKKyAgICAgICAgc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLmRlbm9taW5hdG9yLAorICAgICAgICBzdHJlYW1wYXJtLnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUubnVtZXJhdG9yKTsKKworICAgIC8qIFdlIHVzZWQgdG8gc2tpcCBmcmFtZSByYXRlIHNldHVwIGlmIHRoZSBjYW1lcmEgd2FzIGFscmVhZHkgc2V0dXAKKyAgICAgKiB3aXRoIHRoZSByZXF1ZXN0ZWQgZnJhbWUgcmF0ZS4gVGhpcyBicmVha3Mgc29tZSBjYW1lcmFzIHRob3VnaCwKKyAgICAgKiBjYXVzaW5nIHRoZW0gdG8gbm90IG91dHB1dCBkYXRhIChzZXZlcmFsIG1vZGVscyBvZiBUaGlua3BhZCBjYW1lcmFzCisgICAgICogaGF2ZSB0aGlzIHByb2JsZW0gYXQgbGVhc3QpLgorICAgICAqIFNvLCBkb24ndCBza2lwLiAqLworICAgIEdTVF9MT0dfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiU2V0dGluZyBjYXB0dXJlIGZyYW1lcmF0ZSB0byAldS8ldSIsCisgICAgICAgIGZwc19uLCBmcHNfZCk7CisgICAgLyogV2Ugd2FudCB0byBjaGFuZ2UgdGhlIGZyYW1lIHJhdGUsIHNvIGNoZWNrIHdoZXRoZXIgd2UgY2FuLiBTb21lIGNoZWFwIFVTQgorICAgICAqIGNhbWVyYXMgZG9uJ3QgaGF2ZSB0aGUgY2FwYWJpbGl0eSAqLworICAgIGlmICgoc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUuY2FwYWJpbGl0eSAmIFY0TDJfQ0FQX1RJTUVQRVJGUkFNRSkgPT0gMCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgICAiTm90IHNldHRpbmcgY2FwdHVyZSBmcmFtZXJhdGUgKG5vdCBzdXBwb3J0ZWQpIik7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgLyogTm90ZTogVjRMMiB3YW50cyB0aGUgZnJhbWUgaW50ZXJ2YWwsIHdlIGhhdmUgdGhlIGZyYW1lIHJhdGUgKi8KKyAgICBzdHJlYW1wYXJtLnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUubnVtZXJhdG9yID0gZnBzX2Q7CisgICAgc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLmRlbm9taW5hdG9yID0gZnBzX247CisKKyAgICAvKiBzb21lIGNoZWFwIFVTQiBjYW0ncyB3b24ndCBhY2NlcHQgYW55IGNoYW5nZSAqLworICAgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAoZmQsIFZJRElPQ19TX1BBUk0sICZzdHJlYW1wYXJtKSA8IDApCisgICAgICBnb3RvIHNldF9wYXJtX2ZhaWxlZDsKKworICAgIGlmIChzdHJlYW1wYXJtLnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUubnVtZXJhdG9yID4gMCAmJgorICAgICAgICBzdHJlYW1wYXJtLnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IgPiAwKSB7CisgICAgICAvKiBnZXQgbmV3IHZhbHVlcyAqLworICAgICAgZnBzX2QgPSBzdHJlYW1wYXJtLnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUubnVtZXJhdG9yOworICAgICAgZnBzX24gPSBzdHJlYW1wYXJtLnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuZGVub21pbmF0b3I7CisKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgIlNldCBjYXB0dXJlIGZyYW1lcmF0ZSB0byAldS8ldSIsCisgICAgICAgICAgZnBzX24sIGZwc19kKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogZml4IHY0bDIgY2FwdHVyZSBkcml2ZXIgdG8gcHJvdmlkZSBmcmFtZXJhdGUgdmFsdWVzICovCisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAgICAgIlJldXNlIGNhcHMgZnJhbWVyYXRlICV1LyV1IC0gZml4IHY0bDIgY2FwdHVyZSBkcml2ZXIiLCBmcHNfbiwgZnBzX2QpOworICAgIH0KKworICAgIEdTVF9WSURFT19JTkZPX0ZQU19OICgmaW5mbykgPSBmcHNfbjsKKyAgICBHU1RfVklERU9fSU5GT19GUFNfRCAoJmluZm8pID0gZnBzX2Q7CisgIH0gZWxzZSBpZiAodjRsMm9iamVjdC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVAorICAgICAgfHwgdjRsMm9iamVjdC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKKyAgICBHU1RfVklERU9fSU5GT19GUFNfTiAoJmluZm8pID0KKyAgICAgICAgc3RyZWFtcGFybS5wYXJtLm91dHB1dC50aW1lcGVyZnJhbWUuZGVub21pbmF0b3I7CisgICAgR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZpbmZvKSA9CisgICAgICAgIHN0cmVhbXBhcm0ucGFybS5vdXRwdXQudGltZXBlcmZyYW1lLm51bWVyYXRvcjsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJHb3Qgb3V0cHV0IGZyYW1lcmF0ZTogJXUvJXUiLAorICAgICAgICBzdHJlYW1wYXJtLnBhcm0ub3V0cHV0LnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciwKKyAgICAgICAgc3RyZWFtcGFybS5wYXJtLm91dHB1dC50aW1lcGVyZnJhbWUubnVtZXJhdG9yKTsKKworICAgIEdTVF9MT0dfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiU2V0dGluZyBvdXRwdXQgZnJhbWVyYXRlIHRvICV1LyV1IiwKKyAgICAgICAgZnBzX24sIGZwc19kKTsKKyAgICBpZiAoKHN0cmVhbXBhcm0ucGFybS5vdXRwdXQuY2FwYWJpbGl0eSAmIFY0TDJfQ0FQX1RJTUVQRVJGUkFNRSkgPT0gMCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgICAiTm90IHNldHRpbmcgb3V0cHV0IGZyYW1lcmF0ZSAobm90IHN1cHBvcnRlZCkiKTsKKyAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICAvKiBOb3RlOiBWNEwyIHdhbnRzIHRoZSBmcmFtZSBpbnRlcnZhbCwgd2UgaGF2ZSB0aGUgZnJhbWUgcmF0ZSAqLworICAgIHN0cmVhbXBhcm0ucGFybS5vdXRwdXQudGltZXBlcmZyYW1lLm51bWVyYXRvciA9IGZwc19kOworICAgIHN0cmVhbXBhcm0ucGFybS5vdXRwdXQudGltZXBlcmZyYW1lLmRlbm9taW5hdG9yID0gZnBzX247CisKKyAgICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKGZkLCBWSURJT0NfU19QQVJNLCAmc3RyZWFtcGFybSkgPCAwKQorICAgICAgZ290byBzZXRfcGFybV9mYWlsZWQ7CisKKyAgICBpZiAoc3RyZWFtcGFybS5wYXJtLm91dHB1dC50aW1lcGVyZnJhbWUubnVtZXJhdG9yID4gMCAmJgorICAgICAgICBzdHJlYW1wYXJtLnBhcm0ub3V0cHV0LnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciA+IDApIHsKKyAgICAgIC8qIGdldCBuZXcgdmFsdWVzICovCisgICAgICBmcHNfZCA9IHN0cmVhbXBhcm0ucGFybS5vdXRwdXQudGltZXBlcmZyYW1lLm51bWVyYXRvcjsKKyAgICAgIGZwc19uID0gc3RyZWFtcGFybS5wYXJtLm91dHB1dC50aW1lcGVyZnJhbWUuZGVub21pbmF0b3I7CisKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgIlNldCBvdXRwdXQgZnJhbWVyYXRlIHRvICV1LyV1IiwKKyAgICAgICAgICBmcHNfbiwgZnBzX2QpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBmaXggdjRsMiBvdXRwdXQgZHJpdmVyIHRvIHByb3ZpZGUgZnJhbWVyYXRlIHZhbHVlcyAqLworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLAorICAgICAgICAgICJSZXVzZSBjYXBzIGZyYW1lcmF0ZSAldS8ldSAtIGZpeCB2NGwyIG91dHB1dCBkcml2ZXIiLCBmcHNfbiwgZnBzX2QpOworICAgIH0KKworICAgIEdTVF9WSURFT19JTkZPX0ZQU19OICgmaW5mbykgPSBmcHNfbjsKKyAgICBHU1RfVklERU9fSU5GT19GUFNfRCAoJmluZm8pID0gZnBzX2Q7CisgIH0KKworZG9uZToKKyAgLyogYWRkIGJvb2xlYW4gcmV0dXJuLCBzbyB3ZSBjYW4gZmFpbCBvbiBkcml2ZXJzIGJ1Z3MgKi8KKyAgZ3N0X3Y0bDJfb2JqZWN0X3NhdmVfZm9ybWF0ICh2NGwyb2JqZWN0LCBmbXRkZXNjLCAmZm9ybWF0LCAmaW5mbywgJmFsaWduKTsKKworICAvKiBub3cgY29uZmlndXJlIHRoZSBwb29sICovCisgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X3NldHVwX3Bvb2wgKHY0bDJvYmplY3QsIGNhcHMpKQorICAgIGdvdG8gcG9vbF9mYWlsZWQ7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX2NhcHM6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiY2FuJ3QgcGFyc2UgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgICAgY2Fwcyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit0cnlfZm10X2ZhaWxlZDoKKyAgeworICAgIGlmIChlcnJubyA9PSBFSU5WQUwpIHsKKyAgICAgIEdTVF9WNEwyX0VSUk9SIChlcnJvciwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAgIChfKCJEZXZpY2UgJyVzJyBoYXMgbm8gc3VwcG9ydGVkIGZvcm1hdCIpLCB2NGwyb2JqZWN0LT52aWRlb2RldiksCisgICAgICAgICAgKCJDYWxsIHRvIFRSWV9GTVQgZmFpbGVkIGZvciAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIEAgJWR4JWQ6ICVzIiwKKyAgICAgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChwaXhlbGZvcm1hdCksIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgIGdfc3RyZXJyb3IgKGVycm5vKSkpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfVjRMMl9FUlJPUiAoZXJyb3IsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICAgKF8oIkRldmljZSAnJXMnIGZhaWxlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24iKSwKKyAgICAgICAgICAgICAgdjRsMm9iamVjdC0+dmlkZW9kZXYpLAorICAgICAgICAgICgiQ2FsbCB0byBUUllfRk1UIGZhaWxlZCBmb3IgJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiBAICVkeCVkOiAlcyIsCisgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAocGl4ZWxmb3JtYXQpLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICBnX3N0cmVycm9yIChlcnJubykpKTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworICB9CitzZXRfZm10X2ZhaWxlZDoKKyAgeworICAgIGlmIChlcnJubyA9PSBFQlVTWSkgeworICAgICAgR1NUX1Y0TDJfRVJST1IgKGVycm9yLCBSRVNPVVJDRSwgQlVTWSwKKyAgICAgICAgICAoXygiRGV2aWNlICclcycgaXMgYnVzeSIpLCB2NGwyb2JqZWN0LT52aWRlb2RldiksCisgICAgICAgICAgKCJDYWxsIHRvIFNfRk1UIGZhaWxlZCBmb3IgJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiBAICVkeCVkOiAlcyIsCisgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAocGl4ZWxmb3JtYXQpLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICBnX3N0cmVycm9yIChlcnJubykpKTsKKyAgICB9IGVsc2UgaWYgKGVycm5vID09IEVJTlZBTCkgeworICAgICAgR1NUX1Y0TDJfRVJST1IgKGVycm9yLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgICAgKF8oIkRldmljZSAnJXMnIGhhcyBubyBzdXBwb3J0ZWQgZm9ybWF0IiksIHY0bDJvYmplY3QtPnZpZGVvZGV2KSwKKyAgICAgICAgICAoIkNhbGwgdG8gU19GTVQgZmFpbGVkIGZvciAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIEAgJWR4JWQ6ICVzIiwKKyAgICAgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChwaXhlbGZvcm1hdCksIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgIGdfc3RyZXJyb3IgKGVycm5vKSkpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfVjRMMl9FUlJPUiAoZXJyb3IsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICAgKF8oIkRldmljZSAnJXMnIGZhaWxlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24iKSwKKyAgICAgICAgICAgICAgdjRsMm9iamVjdC0+dmlkZW9kZXYpLAorICAgICAgICAgICgiQ2FsbCB0byBTX0ZNVCBmYWlsZWQgZm9yICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgQCAlZHglZDogJXMiLAorICAgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHBpeGVsZm9ybWF0KSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgZ19zdHJlcnJvciAoZXJybm8pKSk7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKKyAgfQoraW52YWxpZF9kaW1lbnNpb25zOgorICB7CisgICAgR1NUX1Y0TDJfRVJST1IgKGVycm9yLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIpLAorICAgICAgICAgICAgdjRsMm9iamVjdC0+dmlkZW9kZXYsIHdpZHRoLCBoZWlnaHQpLAorICAgICAgICAoIlRyaWVkIHRvIGNhcHR1cmUgYXQgJWR4JWQsIGJ1dCBkZXZpY2UgcmV0dXJuZWQgc2l6ZSAlZHglZCIsCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQuZm10LnBpeC53aWR0aCwgZm9ybWF0LmZtdC5waXguaGVpZ2h0KSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbnZhbGlkX3BpeGVsZm9ybWF0OgorICB7CisgICAgR1NUX1Y0TDJfRVJST1IgKGVycm9yLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIpLAorICAgICAgICAgICAgdjRsMm9iamVjdC0+dmlkZW9kZXYpLAorICAgICAgICAoIlRyaWVkIHRvIGNhcHR1cmUgaW4gJSIgR1NUX0ZPVVJDQ19GT1JNQVQKKyAgICAgICAgICAgICIsIGJ1dCBkZXZpY2UgcmV0dXJuZWQgZm9ybWF0IiAiICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChwaXhlbGZvcm1hdCksCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvcm1hdC5mbXQucGl4LnBpeGVsZm9ybWF0KSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQoraW52YWxpZF9wbGFuZXM6CisgIHsKKyAgICBHU1RfVjRMMl9FUlJPUiAoZXJyb3IsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiKSwKKyAgICAgICAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2KSwKKyAgICAgICAgKCJEZXZpY2Ugd2FudHMgJWQgcGxhbmVzIiwgZm9ybWF0LmZtdC5waXhfbXAubnVtX3BsYW5lcykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQoraW52YWxpZF9maWVsZDoKKyAgeworICAgIGVudW0gdjRsMl9maWVsZCB3YW50ZWRfZmllbGQ7CisKKyAgICBpZiAoaXNfbXBsYW5lKQorICAgICAgd2FudGVkX2ZpZWxkID0gZm9ybWF0LmZtdC5waXhfbXAuZmllbGQ7CisgICAgZWxzZQorICAgICAgd2FudGVkX2ZpZWxkID0gZm9ybWF0LmZtdC5waXguZmllbGQ7CisKKyAgICBHU1RfVjRMMl9FUlJPUiAoZXJyb3IsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgJXMgaW50ZXJsYWNpbmciKSwKKyAgICAgICAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2LAorICAgICAgICAgICAgZmllbGQgPT0gVjRMMl9GSUVMRF9OT05FID8gInByb2dyZXNzaXZlIiA6ICJpbnRlcmxlYXZlZCIpLAorICAgICAgICAoIkRldmljZSB3YW50cyAlcyBpbnRlcmxhY2luZyIsCisgICAgICAgICAgICB3YW50ZWRfZmllbGQgPT0gVjRMMl9GSUVMRF9OT05FID8gInByb2dyZXNzaXZlIiA6ICJpbnRlcmxlYXZlZCIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfY29sb3JpbWV0cnk6CisgIHsKKyAgICBnY2hhciAqd2FudGVkX2NvbG9yaW1ldHJ5OworCisgICAgd2FudGVkX2NvbG9yaW1ldHJ5ID0gZ3N0X3ZpZGVvX2NvbG9yaW1ldHJ5X3RvX3N0cmluZyAoJmluZm8uY29sb3JpbWV0cnkpOworCisgICAgR1NUX1Y0TDJfRVJST1IgKGVycm9yLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0ICVzIGNvbG9yaW1ldHJ5IiksCisgICAgICAgICAgICB2NGwyb2JqZWN0LT52aWRlb2RldiwgZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAiY29sb3JpbWV0cnkiKSksCisgICAgICAgICgiRGV2aWNlIHdhbnRzICVzIGNvbG9yaW1ldHJ5Iiwgd2FudGVkX2NvbG9yaW1ldHJ5KSk7CisKKyAgICBnX2ZyZWUgKHdhbnRlZF9jb2xvcmltZXRyeSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitnZXRfcGFybV9mYWlsZWQ6CisgIHsKKyAgICAvKiBpdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBjYWxsIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICBpZiAoZXJybm8gIT0gRUlOVkFMICYmIGVycm5vICE9IEVOT1RUWSkgeworICAgICAgR1NUX1Y0TDJfRVJST1IgKGVycm9yLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgICAgKF8oIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIpLAorICAgICAgICAgICAgICB2NGwyb2JqZWN0LT52aWRlb2RldiksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIH0KKyAgICBnb3RvIGRvbmU7CisgIH0KK3NldF9wYXJtX2ZhaWxlZDoKKyAgeworICAgIEdTVF9WNEwyX0VSUk9SIChlcnJvciwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoXygiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIikpLAorICAgICAgICBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK3Bvb2xfZmFpbGVkOgorICB7CisgICAgLyogc2V0dXBfcG9vbCBhbHJlYWR5IHNlbmQgdGhlIGVycm9yICovCisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl9vYmplY3Rfc2V0X2Zvcm1hdCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIEdzdENhcHMgKiBjYXBzLAorICAgIEdzdFY0bDJFcnJvciAqIGVycm9yKQoreworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiU2V0dGluZyBmb3JtYXQgdG8gJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBjYXBzKTsKKyAgcmV0dXJuIGdzdF92NGwyX29iamVjdF9zZXRfZm9ybWF0X2Z1bGwgKHY0bDJvYmplY3QsIGNhcHMsIEZBTFNFLCBlcnJvcik7Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl9vYmplY3RfdHJ5X2Zvcm1hdCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIEdzdENhcHMgKiBjYXBzLAorICAgIEdzdFY0bDJFcnJvciAqIGVycm9yKQoreworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiVHJ5aW5nIGZvcm1hdCAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIGNhcHMpOworICByZXR1cm4gZ3N0X3Y0bDJfb2JqZWN0X3NldF9mb3JtYXRfZnVsbCAodjRsMm9iamVjdCwgY2FwcywgVFJVRSwgZXJyb3IpOworfQorCisvKioKKyAqIGdzdF92NGwyX29iamVjdF9hY3F1aXJlX2Zvcm1hdDoKKyAqIEB2NGwyb2JqZWN0IHRoZSBvYmplY3QKKyAqIEBpbmZvIGEgR3N0VmlkZW9JbmZvIHRvIGJlIGZpbGxlZAorICoKKyAqIEFjcXVpcmUgdGhlIGRyaXZlciBjaG9vc2VuIGZvcm1hdC4gVGhpcyBpcyB1c2VmdWwgaW4gZGVjb2RlciBvciBlbmNvZGVyIGVsZW1lbnRzIHdoZXJlCisgKiB0aGUgb3V0cHV0IGZvcm1hdCBpcyBjaG9vc2VuIGJ5IHRoZSBIVy4KKyAqCisgKiBSZXR1cm5zOiAlVFJVRSBvbiBzdWNjZXNzLCAlRkFMU0Ugb24gZmFpbHVyZS4KKyAqLworZ2Jvb2xlYW4KK2dzdF92NGwyX29iamVjdF9hY3F1aXJlX2Zvcm1hdCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIEdzdFZpZGVvSW5mbyAqIGluZm8pCit7CisgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmZtdGRlc2M7CisgIHN0cnVjdCB2NGwyX2Zvcm1hdCBmbXQ7CisgIHN0cnVjdCB2NGwyX2Nyb3AgY3JvcDsKKyAgc3RydWN0IHY0bDJfc2VsZWN0aW9uIHNlbDsKKyAgc3RydWN0IHY0bDJfcmVjdCAqciA9IE5VTEw7CisgIEdzdFZpZGVvRm9ybWF0IGZvcm1hdDsKKyAgZ3VpbnQgd2lkdGgsIGhlaWdodDsKKyAgR3N0VmlkZW9BbGlnbm1lbnQgYWxpZ247CisKKyAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoaW5mbyk7CisgIGdzdF92aWRlb19hbGlnbm1lbnRfcmVzZXQgKCZhbGlnbik7CisKKyAgbWVtc2V0ICgmZm10LCAweDAwLCBzaXplb2YgKHN0cnVjdCB2NGwyX2Zvcm1hdCkpOworICBmbXQudHlwZSA9IHY0bDJvYmplY3QtPnR5cGU7CisgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19HX0ZNVCwgJmZtdCkgPCAwKQorICAgIGdvdG8gZ2V0X2ZtdF9mYWlsZWQ7CisKKyAgZm10ZGVzYyA9IGdzdF92NGwyX29iamVjdF9nZXRfZm9ybWF0X2Zyb21fZm91cmNjICh2NGwyb2JqZWN0LAorICAgICAgZm10LmZtdC5waXgucGl4ZWxmb3JtYXQpOworICBpZiAoZm10ZGVzYyA9PSBOVUxMKQorICAgIGdvdG8gdW5zdXBwb3J0ZWRfZm9ybWF0OworCisgIC8qIE5vIG5lZWQgdG8gY2FyZSBhYm91dCBtcGxhbmUsIHRoZSBmb3VyIGZpcnN0IHBhcmFtcyBhcmUgdGhlIHNhbWUgKi8KKyAgZm9ybWF0ID0gZ3N0X3Y0bDJfb2JqZWN0X3Y0bDJmb3VyY2NfdG9fdmlkZW9fZm9ybWF0IChmbXQuZm10LnBpeC5waXhlbGZvcm1hdCk7CisKKyAgLyogZmFpbHMgaWYgd2UgZG8gbm8gdHJhbnNsYXRlIHRoZSBmbXQucGl4LnBpeGVsZm9ybWF0IHRvIEdzdFZpZGVvRm9ybWF0ICovCisgIGlmIChmb3JtYXQgPT0gR1NUX1ZJREVPX0ZPUk1BVF9VTktOT1dOKQorICAgIGdvdG8gdW5zdXBwb3J0ZWRfZm9ybWF0OworCisgIGlmIChmbXQuZm10LnBpeC53aWR0aCA9PSAwIHx8IGZtdC5mbXQucGl4LmhlaWdodCA9PSAwKQorICAgIGdvdG8gaW52YWxpZF9kaW1lbnNpb25zOworCisgIHdpZHRoID0gZm10LmZtdC5waXgud2lkdGg7CisgIGhlaWdodCA9IGZtdC5mbXQucGl4LmhlaWdodDsKKworICAvKiBVc2UgdGhlIGRlZmF1bHQgY29tcG9zZSByZWN0YW5nbGUgKi8KKyAgbWVtc2V0ICgmc2VsLCAwLCBzaXplb2YgKHN0cnVjdCB2NGwyX3NlbGVjdGlvbikpOworICBzZWwudHlwZSA9IHY0bDJvYmplY3QtPnR5cGU7CisgIHNlbC50YXJnZXQgPSBWNEwyX1NFTF9UR1RfQ09NUE9TRV9ERUZBVUxUOworICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfR19TRUxFQ1RJT04sICZzZWwpID49IDApIHsKKyAgICByID0gJnNlbC5yOworICB9IGVsc2UgeworICAgIC8qIEZvciBhbmNpZW50IGtlcm5lbHMsIGZhbGwgYmFjayB0byBHX0NST1AgKi8KKyAgICBtZW1zZXQgKCZjcm9wLCAwLCBzaXplb2YgKHN0cnVjdCB2NGwyX2Nyb3ApKTsKKyAgICBjcm9wLnR5cGUgPSB2NGwyb2JqZWN0LT50eXBlOworICAgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19HX0NST1AsICZjcm9wKSA+PSAwKQorICAgICAgciA9ICZjcm9wLmM7CisgIH0KKyAgaWYgKHIpIHsKKyAgICBhbGlnbi5wYWRkaW5nX2xlZnQgPSByLT5sZWZ0OworICAgIGFsaWduLnBhZGRpbmdfdG9wID0gci0+dG9wOworICAgIGFsaWduLnBhZGRpbmdfcmlnaHQgPSB3aWR0aCAtIHItPndpZHRoIC0gci0+bGVmdDsKKyAgICBhbGlnbi5wYWRkaW5nX2JvdHRvbSA9IGhlaWdodCAtIHItPmhlaWdodCAtIHItPnRvcDsKKyAgICB3aWR0aCA9IHItPndpZHRoOworICAgIGhlaWdodCA9IHItPmhlaWdodDsKKyAgfQorCisgIGdzdF92aWRlb19pbmZvX3NldF9mb3JtYXQgKGluZm8sIGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7CisKKyAgc3dpdGNoIChmbXQuZm10LnBpeC5maWVsZCkgeworICAgIGNhc2UgVjRMMl9GSUVMRF9BTlk6CisgICAgY2FzZSBWNEwyX0ZJRUxEX05PTkU6CisgICAgICBpbmZvLT5pbnRlcmxhY2VfbW9kZSA9IEdTVF9WSURFT19JTlRFUkxBQ0VfTU9ERV9QUk9HUkVTU0lWRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOgorICAgIGNhc2UgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX1RCOgorICAgIGNhc2UgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX0JUOgorICAgICAgaW5mby0+aW50ZXJsYWNlX21vZGUgPSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfSU5URVJMRUFWRUQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ290byB1bnN1cHBvcnRlZF9maWVsZDsKKyAgfQorCisgIGdzdF92NGwyX29iamVjdF9nZXRfY29sb3JzcGFjZSAoJmZtdCwgJmluZm8tPmNvbG9yaW1ldHJ5KTsKKworICBnc3RfdjRsMl9vYmplY3Rfc2F2ZV9mb3JtYXQgKHY0bDJvYmplY3QsIGZtdGRlc2MsICZmbXQsIGluZm8sICZhbGlnbik7CisKKyAgLyogU2hhbGwgd2Ugc2V0dXAgdGhlIHBvb2wgPyAqLworCisgIHJldHVybiBUUlVFOworCitnZXRfZm10X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHY0bDJvYmplY3QtPmVsZW1lbnQsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iKSksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQoraW52YWxpZF9kaW1lbnNpb25zOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAodjRsMm9iamVjdC0+ZWxlbWVudCwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoXygiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iKSksCisgICAgICAgICgiRXhwZWN0ZWQgbm9uIDAgZGltZW5zaW9ucywgZ290ICVkeCVkIiwgZm10LmZtdC5waXgud2lkdGgsCisgICAgICAgICAgICBmbXQuZm10LnBpeC5oZWlnaHQpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3Vuc3VwcG9ydGVkX2ZpZWxkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHY0bDJvYmplY3QtPmVsZW1lbnQsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iKSksCisgICAgICAgICgiVjRMMiBmaWVsZCB0eXBlICVkIG5vdCBzdXBwb3J0ZWQiLCBmbXQuZm10LnBpeC5maWVsZCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQordW5zdXBwb3J0ZWRfZm9ybWF0OgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHY0bDJvYmplY3QtPmVsZW1lbnQsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iKSksCisgICAgICAgICgiVjRMMiBmb3JtYXQgJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm10LmZtdC5waXgucGl4ZWxmb3JtYXQpKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl9vYmplY3Rfc2V0X2Nyb3AgKEdzdFY0bDJPYmplY3QgKiBvYmopCit7CisgIHN0cnVjdCB2NGwyX2Nyb3AgY3JvcCA9IHsgMCB9OworCisgIGNyb3AudHlwZSA9IG9iai0+dHlwZTsKKyAgY3JvcC5jLmxlZnQgPSBvYmotPmFsaWduLnBhZGRpbmdfbGVmdDsKKyAgY3JvcC5jLnRvcCA9IG9iai0+YWxpZ24ucGFkZGluZ190b3A7CisgIGNyb3AuYy53aWR0aCA9IG9iai0+aW5mby53aWR0aDsKKyAgY3JvcC5jLmhlaWdodCA9IG9iai0+aW5mby5oZWlnaHQ7CisKKyAgaWYgKG9iai0+YWxpZ24ucGFkZGluZ19sZWZ0ICsgb2JqLT5hbGlnbi5wYWRkaW5nX3RvcCArCisgICAgICBvYmotPmFsaWduLnBhZGRpbmdfcmlnaHQgKyBvYmotPmFsaWduLnBhZGRpbmdfYm90dG9tID09IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChvYmotPmRiZ19vYmosICJubyBjcm9wcGluZyBuZWVkZWQiKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKG9iai0+ZGJnX29iaiwKKyAgICAgICJEZXNpcmVkIGNyb3BwaW5nIGxlZnQgJXUsIHRvcCAldSwgc2l6ZSAldXgldSIsIGNyb3AuYy5sZWZ0LCBjcm9wLmMudG9wLAorICAgICAgY3JvcC5jLndpZHRoLCBjcm9wLmMuaGVpZ2h0KTsKKworICBpZiAob2JqLT5pb2N0bCAob2JqLT52aWRlb19mZCwgVklESU9DX1NfQ1JPUCwgJmNyb3ApIDwgMCkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAob2JqLT5kYmdfb2JqLCAiVklESU9DX1NfQ1JPUCBmYWlsZWQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAob2JqLT5pb2N0bCAob2JqLT52aWRlb19mZCwgVklESU9DX0dfQ1JPUCwgJmNyb3ApIDwgMCkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAob2JqLT5kYmdfb2JqLCAiVklESU9DX0dfQ1JPUCBmYWlsZWQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChvYmotPmRiZ19vYmosCisgICAgICAiR290IGNyb3BwaW5nIGxlZnQgJXUsIHRvcCAldSwgc2l6ZSAldXgldSIsIGNyb3AuYy5sZWZ0LCBjcm9wLmMudG9wLAorICAgICAgY3JvcC5jLndpZHRoLCBjcm9wLmMuaGVpZ2h0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK2dzdF92NGwyX29iamVjdF9jYXBzX2VxdWFsIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqY29uZmlnOworICBHc3RDYXBzICpvbGRjYXBzOworICBnYm9vbGVhbiByZXQ7CisKKyAgaWYgKCF2NGwyb2JqZWN0LT5wb29sKQorICAgIHJldHVybiBGQUxTRTsKKworICBjb25maWcgPSBnc3RfYnVmZmVyX3Bvb2xfZ2V0X2NvbmZpZyAodjRsMm9iamVjdC0+cG9vbCk7CisgIGdzdF9idWZmZXJfcG9vbF9jb25maWdfZ2V0X3BhcmFtcyAoY29uZmlnLCAmb2xkY2FwcywgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgcmV0ID0gb2xkY2FwcyAmJiBnc3RfY2Fwc19pc19lcXVhbCAoY2Fwcywgb2xkY2Fwcyk7CisKKyAgZ3N0X3N0cnVjdHVyZV9mcmVlIChjb25maWcpOworCisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl9vYmplY3RfdW5sb2NrIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKworICBHU1RfTE9HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgInN0YXJ0IGZsdXNoaW5nIik7CisKKyAgaWYgKHY0bDJvYmplY3QtPnBvb2wgJiYgZ3N0X2J1ZmZlcl9wb29sX2lzX2FjdGl2ZSAodjRsMm9iamVjdC0+cG9vbCkpCisgICAgZ3N0X2J1ZmZlcl9wb29sX3NldF9mbHVzaGluZyAodjRsMm9iamVjdC0+cG9vbCwgVFJVRSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF92NGwyX29iamVjdF91bmxvY2tfc3RvcCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpCit7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJzdG9wIGZsdXNoaW5nIik7CisKKyAgaWYgKHY0bDJvYmplY3QtPnBvb2wgJiYgZ3N0X2J1ZmZlcl9wb29sX2lzX2FjdGl2ZSAodjRsMm9iamVjdC0+cG9vbCkpCisgICAgZ3N0X2J1ZmZlcl9wb29sX3NldF9mbHVzaGluZyAodjRsMm9iamVjdC0+cG9vbCwgRkFMU0UpOworCisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl9vYmplY3Rfc3RvcCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJzdG9wcGluZyIpOworCisgIGlmICghR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCkpCisgICAgZ290byBkb25lOworICBpZiAoIUdTVF9WNEwyX0lTX0FDVElWRSAodjRsMm9iamVjdCkpCisgICAgZ290byBkb25lOworCisgIGlmICh2NGwyb2JqZWN0LT5wb29sKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgImRlYWN0aXZhdGluZyBwb29sIik7CisgICAgZ3N0X2J1ZmZlcl9wb29sX3NldF9hY3RpdmUgKHY0bDJvYmplY3QtPnBvb2wsIEZBTFNFKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmICh2NGwyb2JqZWN0LT5wb29sKTsKKyAgICB2NGwyb2JqZWN0LT5wb29sID0gTlVMTDsKKyAgfQorCisgIEdTVF9WNEwyX1NFVF9JTkFDVElWRSAodjRsMm9iamVjdCk7CisKK2RvbmU6CisgIHJldHVybiBUUlVFOworfQorCitHc3RDYXBzICoKK2dzdF92NGwyX29iamVjdF9wcm9iZV9jYXBzIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0Q2FwcyAqcmV0OworICBHU0xpc3QgKndhbGs7CisgIEdTTGlzdCAqZm9ybWF0czsKKworICBmb3JtYXRzID0gZ3N0X3Y0bDJfb2JqZWN0X2dldF9mb3JtYXRfbGlzdCAodjRsMm9iamVjdCk7CisKKyAgcmV0ID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIGlmICh2NGwyb2JqZWN0LT5rZWVwX2FzcGVjdCAmJiAhdjRsMm9iamVjdC0+cGFyKSB7CisgICAgc3RydWN0IHY0bDJfY3JvcGNhcCBjcm9wY2FwOworCisgICAgbWVtc2V0ICgmY3JvcGNhcCwgMCwgc2l6ZW9mIChjcm9wY2FwKSk7CisKKyAgICBjcm9wY2FwLnR5cGUgPSB2NGwyb2JqZWN0LT50eXBlOworICAgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19DUk9QQ0FQLCAmY3JvcGNhcCkgPCAwKSB7CisgICAgICBpZiAoZXJybm8gIT0gRU5PVFRZKQorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAgICAgICAiRmFpbGVkIHRvIHByb2JlIHBpeGVsIGFzcGVjdCByYXRpbyB3aXRoIFZJRElPQ19DUk9QQ0FQOiAlcyIsCisgICAgICAgICAgICBnX3N0cmVycm9yIChlcnJubykpOworICAgIH0gZWxzZSB7CisgICAgICB2NGwyb2JqZWN0LT5wYXIgPSBnX25ldzAgKEdWYWx1ZSwgMSk7CisgICAgICBnX3ZhbHVlX2luaXQgKHY0bDJvYmplY3QtPnBhciwgR1NUX1RZUEVfRlJBQ1RJT04pOworICAgICAgZ3N0X3ZhbHVlX3NldF9mcmFjdGlvbiAodjRsMm9iamVjdC0+cGFyLCBjcm9wY2FwLnBpeGVsYXNwZWN0Lm51bWVyYXRvciwKKyAgICAgICAgICBjcm9wY2FwLnBpeGVsYXNwZWN0LmRlbm9taW5hdG9yKTsKKyAgICB9CisgIH0KKworICBmb3IgKHdhbGsgPSBmb3JtYXRzOyB3YWxrOyB3YWxrID0gd2Fsay0+bmV4dCkgeworICAgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmZvcm1hdDsKKyAgICBHc3RTdHJ1Y3R1cmUgKnRlbXBsYXRlOworICAgIEdzdENhcHMgKnRtcDsKKworICAgIGZvcm1hdCA9IChzdHJ1Y3QgdjRsMl9mbXRkZXNjICopIHdhbGstPmRhdGE7CisKKyAgICB0ZW1wbGF0ZSA9IGdzdF92NGwyX29iamVjdF92NGwyZm91cmNjX3RvX2JhcmVfc3RydWN0IChmb3JtYXQtPnBpeGVsZm9ybWF0KTsKKworICAgIGlmICghdGVtcGxhdGUpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAgICAgInVua25vd24gZm9ybWF0ICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm9ybWF0LT5waXhlbGZvcm1hdCkpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLyogSWYgd2UgaGF2ZSBhIGZpbHRlciwgY2hlY2sgaWYgd2UgbmVlZCB0byBwcm9iZSB0aGlzIGZvcm1hdCBvciBub3QgKi8KKyAgICBpZiAoZmlsdGVyKSB7CisgICAgICBHc3RDYXBzICpmb3JtYXRfY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKworICAgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoZm9ybWF0X2NhcHMsIGdzdF9zdHJ1Y3R1cmVfY29weSAodGVtcGxhdGUpKTsKKworICAgICAgaWYgKCFnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChmb3JtYXRfY2FwcywgZmlsdGVyKSkgeworICAgICAgICBnc3RfY2Fwc191bnJlZiAoZm9ybWF0X2NhcHMpOworICAgICAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHRlbXBsYXRlKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGdzdF9jYXBzX3VucmVmIChmb3JtYXRfY2Fwcyk7CisgICAgfQorCisgICAgdG1wID0gZ3N0X3Y0bDJfb2JqZWN0X3Byb2JlX2NhcHNfZm9yX2Zvcm1hdCAodjRsMm9iamVjdCwKKyAgICAgICAgZm9ybWF0LT5waXhlbGZvcm1hdCwgdGVtcGxhdGUpOworICAgIGlmICh0bXApCisgICAgICBnc3RfY2Fwc19hcHBlbmQgKHJldCwgdG1wKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAodGVtcGxhdGUpOworICB9CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKnRtcDsKKworICAgIHRtcCA9IHJldDsKKyAgICByZXQgPSBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCByZXQsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHRtcCk7CisgIH0KKworICBHU1RfSU5GT19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJwcm9iZWQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIHJldCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworR3N0Q2FwcyAqCitnc3RfdjRsMl9vYmplY3RfZ2V0X2NhcHMgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RDYXBzICpyZXQ7CisKKyAgaWYgKHY0bDJvYmplY3QtPnByb2JlZF9jYXBzID09IE5VTEwpCisgICAgdjRsMm9iamVjdC0+cHJvYmVkX2NhcHMgPSBnc3RfdjRsMl9vYmplY3RfcHJvYmVfY2FwcyAodjRsMm9iamVjdCwgTlVMTCk7CisKKyAgaWYgKGZpbHRlcikgeworICAgIHJldCA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHY0bDJvYmplY3QtPnByb2JlZF9jYXBzLAorICAgICAgICBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICB9IGVsc2UgeworICAgIHJldCA9IGdzdF9jYXBzX3JlZiAodjRsMm9iamVjdC0+cHJvYmVkX2NhcHMpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF92NGwyX29iamVjdF9kZWNpZGVfYWxsb2NhdGlvbiAoR3N0VjRsMk9iamVjdCAqIG9iaiwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0QnVmZmVyUG9vbCAqcG9vbCA9IE5VTEwsICpvdGhlcl9wb29sID0gTlVMTDsKKyAgR3N0U3RydWN0dXJlICpjb25maWc7CisgIGd1aW50IHNpemUsIG1pbiwgbWF4LCBvd25fbWluID0gMDsKKyAgZ2Jvb2xlYW4gdXBkYXRlOworICBnYm9vbGVhbiBoYXNfdmlkZW9fbWV0YTsKKyAgZ2Jvb2xlYW4gY2FuX3NoYXJlX293bl9wb29sLCBwdXNoaW5nX2Zyb21fb3VyX3Bvb2wgPSBGQUxTRTsKKyAgR3N0QWxsb2NhdG9yICphbGxvY2F0b3IgPSBOVUxMOworICBHc3RBbGxvY2F0aW9uUGFyYW1zIHBhcmFtcyA9IHsgMCB9OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG9iai0+ZGJnX29iaiwgImRlY2lkZSBhbGxvY2F0aW9uIik7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKG9iai0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwKKyAgICAgIG9iai0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FLCBGQUxTRSk7CisKKyAgZ3N0X3F1ZXJ5X3BhcnNlX2FsbG9jYXRpb24gKHF1ZXJ5LCAmY2FwcywgTlVMTCk7CisKKyAgaWYgKG9iai0+cG9vbCA9PSBOVUxMKSB7CisgICAgaWYgKCFnc3RfdjRsMl9vYmplY3Rfc2V0dXBfcG9vbCAob2JqLCBjYXBzKSkKKyAgICAgIGdvdG8gcG9vbF9mYWlsZWQ7CisgIH0KKworICBpZiAoZ3N0X3F1ZXJ5X2dldF9uX2FsbG9jYXRpb25fcGFyYW1zIChxdWVyeSkgPiAwKQorICAgIGdzdF9xdWVyeV9wYXJzZV9udGhfYWxsb2NhdGlvbl9wYXJhbSAocXVlcnksIDAsICZhbGxvY2F0b3IsICZwYXJhbXMpOworCisgIGlmIChnc3RfcXVlcnlfZ2V0X25fYWxsb2NhdGlvbl9wb29scyAocXVlcnkpID4gMCkgeworICAgIGdzdF9xdWVyeV9wYXJzZV9udGhfYWxsb2NhdGlvbl9wb29sIChxdWVyeSwgMCwgJnBvb2wsICZzaXplLCAmbWluLCAmbWF4KTsKKyAgICB1cGRhdGUgPSBUUlVFOworICB9IGVsc2UgeworICAgIHBvb2wgPSBOVUxMOworICAgIG1pbiA9IG1heCA9IDA7CisgICAgc2l6ZSA9IDA7CisgICAgdXBkYXRlID0gRkFMU0U7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChvYmotPmRiZ19vYmosICJhbGxvY2F0aW9uOiBzaXplOiV1IG1pbjoldSBtYXg6JXUgcG9vbDolIgorICAgICAgR1NUX1BUUl9GT1JNQVQsIHNpemUsIG1pbiwgbWF4LCBwb29sKTsKKworICBoYXNfdmlkZW9fbWV0YSA9CisgICAgICBnc3RfcXVlcnlfZmluZF9hbGxvY2F0aW9uX21ldGEgKHF1ZXJ5LCBHU1RfVklERU9fTUVUQV9BUElfVFlQRSwgTlVMTCk7CisKKyAgY2FuX3NoYXJlX293bl9wb29sID0gKGhhc192aWRlb19tZXRhIHx8ICFvYmotPm5lZWRfdmlkZW9fbWV0YSk7CisKKyAgZ3N0X3Y0bDJfZ2V0X2RyaXZlcl9taW5fYnVmZmVycyAob2JqKTsKKyAgLyogV2UgY2FuJ3Qgc2hhcmUgb3VyIG93biBwb29sLCBpZiBpdCBleGNlZWQgVjRMMiBjYXBhY2l0eSAqLworICBpZiAobWluICsgb2JqLT5taW5fYnVmZmVycyArIDEgPiBWSURFT19NQVhfRlJBTUUpCisgICAgY2FuX3NoYXJlX293bl9wb29sID0gRkFMU0U7CisKKyAgLyogc2VsZWN0IGEgcG9vbCAqLworICBzd2l0Y2ggKG9iai0+bW9kZSkgeworICAgIGNhc2UgR1NUX1Y0TDJfSU9fUlc6CisgICAgICBpZiAocG9vbCkgeworICAgICAgICAvKiBpbiBSRUFEL1dSSVRFIG1vZGUsIHByZWZlciBhIGRvd25zdHJlYW0gcG9vbCBiZWNhdXNlIG91ciBvd24gcG9vbAorICAgICAgICAgKiBkb2Vzbid0IGhlbHAgbXVjaCwgd2UgaGF2ZSB0byB3cml0ZSB0byBpdCBhcyB3ZWxsICovCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG9iai0+ZGJnX29iaiwKKyAgICAgICAgICAgICJyZWFkL3dyaXRlIG1vZGU6IHVzaW5nIGRvd25zdHJlYW0gcG9vbCIpOworICAgICAgICAvKiB1c2UgdGhlIGJpZ2VzdCBzaXplLCB3aGVuIHdlIHVzZSBvdXIgb3duIHBvb2wgd2UgY2FuJ3QgcmVhbGx5IGRvIGFueQorICAgICAgICAgKiBvdGhlciBzaXplIHRoYW4gd2hhdCB0aGUgaGFyZHdhcmUgZ2l2ZXMgdXMgYnV0IGZvciBkb3duc3RyZWFtIHBvb2xzCisgICAgICAgICAqIHdlIGNhbiB0cnkgKi8KKyAgICAgICAgc2l6ZSA9IE1BWCAoc2l6ZSwgb2JqLT5pbmZvLnNpemUpOworICAgICAgfSBlbHNlIGlmIChjYW5fc2hhcmVfb3duX3Bvb2wpIHsKKyAgICAgICAgLyogbm8gZG93bnN0cmVhbSBwb29sLCB1c2Ugb3VyIG93biB0aGVuICovCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG9iai0+ZGJnX29iaiwKKyAgICAgICAgICAgICJyZWFkL3dyaXRlIG1vZGU6IG5vIGRvd25zdHJlYW0gcG9vbCwgdXNpbmcgb3VyIG93biIpOworICAgICAgICBwb29sID0gZ3N0X29iamVjdF9yZWYgKG9iai0+cG9vbCk7CisgICAgICAgIHNpemUgPSBvYmotPmluZm8uc2l6ZTsKKyAgICAgICAgcHVzaGluZ19mcm9tX291cl9wb29sID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBHU1RfVjRMMl9JT19VU0VSUFRSOgorICAgIGNhc2UgR1NUX1Y0TDJfSU9fRE1BQlVGX0lNUE9SVDoKKyAgICAgIC8qIGluIGltcG9ydGluZyBtb2RlLCBwcmVmZXIgb3VyIG93biBwb29sLCBhbmQgcGFzcyB0aGUgb3RoZXIgcG9vbCB0bworICAgICAgICogb3VyIG93biwgc28gaXQgY2FuIHNlcnZlIGl0c2VsZiAqLworICAgICAgaWYgKHBvb2wgPT0gTlVMTCkKKyAgICAgICAgZ290byBub19kb3duc3RyZWFtX3Bvb2w7CisgICAgICBnc3RfdjRsMl9idWZmZXJfcG9vbF9zZXRfb3RoZXJfcG9vbCAoR1NUX1Y0TDJfQlVGRkVSX1BPT0wgKG9iai0+cG9vbCksCisgICAgICAgICAgcG9vbCk7CisgICAgICBvdGhlcl9wb29sID0gcG9vbDsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHBvb2wpOworICAgICAgcG9vbCA9IGdzdF9vYmplY3RfcmVmIChvYmotPnBvb2wpOworICAgICAgc2l6ZSA9IG9iai0+aW5mby5zaXplOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdTVF9WNEwyX0lPX01NQVA6CisgICAgY2FzZSBHU1RfVjRMMl9JT19ETUFCVUY6CisgICAgICAvKiBpbiBzdHJlYW1pbmcgbW9kZSwgcHJlZmVyIG91ciBvd24gcG9vbCAqLworICAgICAgLyogQ2hlY2sgaWYgd2UgY2FuIHVzZSBpdCAuLi4gKi8KKyAgICAgIGlmIChjYW5fc2hhcmVfb3duX3Bvb2wpIHsKKyAgICAgICAgaWYgKHBvb2wpCisgICAgICAgICAgZ3N0X29iamVjdF91bnJlZiAocG9vbCk7CisgICAgICAgIHBvb2wgPSBnc3Rfb2JqZWN0X3JlZiAob2JqLT5wb29sKTsKKyAgICAgICAgc2l6ZSA9IG9iai0+aW5mby5zaXplOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChvYmotPmRiZ19vYmosCisgICAgICAgICAgICAic3RyZWFtaW5nIG1vZGU6IHVzaW5nIG91ciBvd24gcG9vbCAlIiBHU1RfUFRSX0ZPUk1BVCwgcG9vbCk7CisgICAgICAgIHB1c2hpbmdfZnJvbV9vdXJfcG9vbCA9IFRSVUU7CisgICAgICB9IGVsc2UgaWYgKHBvb2wpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAob2JqLT5kYmdfb2JqLAorICAgICAgICAgICAgInN0cmVhbWluZyBtb2RlOiBjb3B5aW5nIHRvIGRvd25zdHJlYW0gcG9vbCAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgICAgICAgIHBvb2wpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAob2JqLT5kYmdfb2JqLAorICAgICAgICAgICAgInN0cmVhbWluZyBtb2RlOiBubyB1c2FibGUgcG9vbCwgY29weWluZyB0byBnZW5lcmljIHBvb2wiKTsKKyAgICAgICAgc2l6ZSA9IE1BWCAoc2l6ZSwgb2JqLT5pbmZvLnNpemUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVjRMMl9JT19BVVRPOgorICAgIGRlZmF1bHQ6CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG9iai0+ZGJnX29iaiwgInVuaGFuZGxlZCBtb2RlIik7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChzaXplID09IDApCisgICAgZ290byBub19zaXplOworCisgIC8qIElmIHB1c2hpbmcgZnJvbSBvdXIgb3duIHBvb2wsIGNvbmZpZ3VyZSBpdCB3aXRoIHF1ZXJpZWQgbWluaW11bSwKKyAgICogb3RoZXJ3aXNlIHVzZSB0aGUgbWluaW11bSByZXF1aXJlZCAqLworICBpZiAocHVzaGluZ19mcm9tX291cl9wb29sKSB7CisgICAgLyogV2hlbiBwdXNoaW5nIGZyb20gb3VyIG93biBwb29sLCB3ZSBuZWVkIHdoYXQgZG93bnN0cmVhbSBvbmUsIHRvIGJlIGFibGUKKyAgICAgKiB0byBmaWxsIHRoZSBwaXBlbGluZSwgdGhlIG1pbmltdW0gcmVxdWlyZWQgdG8gZGVjb2RlciBhY2NvcmRpbmcgdG8gdGhlCisgICAgICogZHJpdmVyIGFuZCAyIG1vcmUsIHNvIHdlIGRvbid0IGVuZHVwIHVwIHdpdGggZXZlcnl0aGluZyBkb3duc3RyZWFtIG9yCisgICAgICogaGVsZCBieSB0aGUgZGVjb2Rlci4gV2UgYWNjb3VudCAyIGJ1ZmZlcnMgZm9yIHY0bDIgc28gd2hlbiBvbmUgaXMgYmVpbmcKKyAgICAgKiBwdXNoZWQgZG93bnN0cmVhbSB0aGUgb3RoZXIgb25lIGNhbiBhbHJlYWR5IGJlIHF1ZXVlZCBmb3IgdGhlIG5leHQKKyAgICAgKiBmcmFtZS4gKi8KKyAgICBvd25fbWluID0gbWluICsgb2JqLT5taW5fYnVmZmVycyArIDI7CisKKyAgICAvKiBJZiBubyBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgd2hlcmUgcHJvdmlkZWQsIGFsbG93IGZvciBhIGxpdHRsZSBtb3JlCisgICAgICogYnVmZmVycyBhbmQgZW5hYmxlIGNvcHkgdGhyZXNob2xkICovCisgICAgaWYgKCF1cGRhdGUpIHsKKyAgICAgIG93bl9taW4gKz0gMjsKKyAgICAgIGdzdF92NGwyX2J1ZmZlcl9wb29sX2NvcHlfYXRfdGhyZXNob2xkIChHU1RfVjRMMl9CVUZGRVJfUE9PTCAocG9vbCksCisgICAgICAgICAgVFJVRSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdzdF92NGwyX2J1ZmZlcl9wb29sX2NvcHlfYXRfdGhyZXNob2xkIChHU1RfVjRMMl9CVUZGRVJfUE9PTCAocG9vbCksCisgICAgICAgICAgRkFMU0UpOworICAgIH0KKworICB9IGVsc2UgeworICAgIC8qIEluIHRoaXMgY2FzZSB3ZSdsbCBoYXZlIHRvIGNvbmZpZ3VyZSB0d28gYnVmZmVyIHBvb2wuIEZvciBvdXIgYnVmZmVyCisgICAgICogcG9vbCwgd2UnbGwgbmVlZCB3aGF0IHRoZSBkcml2ZXIgb25lLCBhbmQgb25lIG1vcmUsIHNvIHdlIGNhbiBkZXF1ZXUgKi8KKyAgICBvd25fbWluID0gb2JqLT5taW5fYnVmZmVycyArIDE7CisgICAgb3duX21pbiA9IE1BWCAob3duX21pbiwgR1NUX1Y0TDJfTUlOX0JVRkZFUlMpOworCisgICAgLyogZm9yIHRoZSBkb3duc3RyZWFtIHBvb2wsIHdlIGtlZXAgd2hhdCBkb3duc3RyZWFtIHdhbnRzLCB0aG91Z2ggZW5zdXJlCisgICAgICogYXQgbGVhc3QgYSBtaW5pbXVtIGlmIGRvd25zdHJlYW0gZGlkbid0IHN1Z2dlc3QgYW55dGhpbmcgKHdlIGFyZQorICAgICAqIGV4cGVjdGluZyB0aGUgYmFzZSBjbGFzcyB0byBjcmVhdGUgYSBkZWZhdWx0IG9uZSBmb3IgdGhlIGNvbnRleHQpICovCisgICAgbWluID0gTUFYIChtaW4sIEdTVF9WNEwyX01JTl9CVUZGRVJTKTsKKworICAgIC8qIFRvIGltcG9ydCB3ZSBuZWVkIHRoZSBvdGhlciBwb29sIHRvIGhvbGQgYXQgbGVhc3Qgb3duX21pbiAqLworICAgIGlmIChvYmotPnBvb2wgPT0gcG9vbCkKKyAgICAgIG1pbiArPSBvd25fbWluOworICB9CisKKyAgLyogUmVxdWVzdCBhIGJpZ2dlciBtYXgsIGlmIG9uZSB3YXMgc3VnZ2VzdGVkIGJ1dCBpdCdzIHRvbyBzbWFsbCAqLworICBpZiAobWF4ICE9IDApCisgICAgbWF4ID0gTUFYIChtaW4sIG1heCk7CisKKyAgLyogRmlyc3Qgc3RlcCwgY29uZmlndXJlIG91ciBvd24gcG9vbCAqLworICBjb25maWcgPSBnc3RfYnVmZmVyX3Bvb2xfZ2V0X2NvbmZpZyAob2JqLT5wb29sKTsKKworICBpZiAob2JqLT5uZWVkX3ZpZGVvX21ldGEgfHwgaGFzX3ZpZGVvX21ldGEpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChvYmotPmRiZ19vYmosICJhY3RpdmF0ZSBWaWRlbyBNZXRhIik7CisgICAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19hZGRfb3B0aW9uIChjb25maWcsCisgICAgICAgIEdTVF9CVUZGRVJfUE9PTF9PUFRJT05fVklERU9fTUVUQSk7CisgIH0KKworICBnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX3NldF9hbGxvY2F0b3IgKGNvbmZpZywgYWxsb2NhdG9yLCAmcGFyYW1zKTsKKyAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19zZXRfcGFyYW1zIChjb25maWcsIGNhcHMsIHNpemUsIG93bl9taW4sIDApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG9iai0+ZGJnX29iaiwgInNldHRpbmcgb3duIHBvb2wgY29uZmlnIHRvICUiCisgICAgICBHU1RfUFRSX0ZPUk1BVCwgY29uZmlnKTsKKworICAvKiBPdXIgcG9vbCBvZnRlbiBuZWVkIHRvIGFkanVzdCB0aGUgdmFsdWUgKi8KKyAgaWYgKCFnc3RfYnVmZmVyX3Bvb2xfc2V0X2NvbmZpZyAob2JqLT5wb29sLCBjb25maWcpKSB7CisgICAgY29uZmlnID0gZ3N0X2J1ZmZlcl9wb29sX2dldF9jb25maWcgKG9iai0+cG9vbCk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChvYmotPmRiZ19vYmosICJvd24gcG9vbCBjb25maWcgY2hhbmdlZCB0byAlIgorICAgICAgICBHU1RfUFRSX0ZPUk1BVCwgY29uZmlnKTsKKworICAgIC8qIG91ciBwb29sIHdpbGwgYWRqdXN0IHRoZSBtYXhpbXVtIGJ1ZmZlciwgd2hpY2ggd2UgYXJlIGZpbmUgd2l0aCAqLworICAgIGlmICghZ3N0X2J1ZmZlcl9wb29sX3NldF9jb25maWcgKG9iai0+cG9vbCwgY29uZmlnKSkKKyAgICAgIGdvdG8gY29uZmlnX2ZhaWxlZDsKKyAgfQorCisgIC8qIE5vdyBjb25maWd1cmUgdGhlIG90aGVyIHBvb2wgaWYgZGlmZmVyZW50ICovCisgIGlmIChvYmotPnBvb2wgIT0gcG9vbCkKKyAgICBvdGhlcl9wb29sID0gcG9vbDsKKworICBpZiAob3RoZXJfcG9vbCkgeworICAgIGNvbmZpZyA9IGdzdF9idWZmZXJfcG9vbF9nZXRfY29uZmlnIChvdGhlcl9wb29sKTsKKyAgICBnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX3NldF9hbGxvY2F0b3IgKGNvbmZpZywgYWxsb2NhdG9yLCAmcGFyYW1zKTsKKyAgICBnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX3NldF9wYXJhbXMgKGNvbmZpZywgY2Fwcywgc2l6ZSwgbWluLCBtYXgpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAob2JqLT5kYmdfb2JqLCAic2V0dGluZyBvdGhlciBwb29sIGNvbmZpZyB0byAlIgorICAgICAgICBHU1RfUFRSX0ZPUk1BVCwgY29uZmlnKTsKKworICAgIC8qIGlmIGRvd25zdHJlYW0gc3VwcG9ydHMgdmlkZW8gbWV0YWRhdGEsIGFkZCB0aGlzIHRvIHRoZSBwb29sIGNvbmZpZyAqLworICAgIGlmIChoYXNfdmlkZW9fbWV0YSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAob2JqLT5kYmdfb2JqLCAiYWN0aXZhdGUgVmlkZW8gTWV0YSIpOworICAgICAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19hZGRfb3B0aW9uIChjb25maWcsCisgICAgICAgICAgR1NUX0JVRkZFUl9QT09MX09QVElPTl9WSURFT19NRVRBKTsKKyAgICB9CisKKyAgICBpZiAoIWdzdF9idWZmZXJfcG9vbF9zZXRfY29uZmlnIChvdGhlcl9wb29sLCBjb25maWcpKSB7CisgICAgICBjb25maWcgPSBnc3RfYnVmZmVyX3Bvb2xfZ2V0X2NvbmZpZyAob3RoZXJfcG9vbCk7CisKKyAgICAgIGlmICghZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ192YWxpZGF0ZV9wYXJhbXMgKGNvbmZpZywgY2Fwcywgc2l6ZSwgbWluLAorICAgICAgICAgICAgICBtYXgpKSB7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoY29uZmlnKTsKKyAgICAgICAgZ290byBjb25maWdfZmFpbGVkOworICAgICAgfQorCisgICAgICBpZiAoIWdzdF9idWZmZXJfcG9vbF9zZXRfY29uZmlnIChvdGhlcl9wb29sLCBjb25maWcpKQorICAgICAgICBnb3RvIGNvbmZpZ19mYWlsZWQ7CisgICAgfQorICB9CisKKyAgaWYgKHBvb2wpIHsKKyAgICAvKiBGb3Igc2ltcGxpY2l0eSwgc2ltcGx5IHJlYWQgYmFjayB0aGUgYWN0aXZlIGNvbmZpZ3VyYXRpb24sIHNvIG91ciBiYXNlCisgICAgICogY2xhc3MgZ2V0IHRoZSByaWdodCBpbmZvcm1hdGlvbiAqLworICAgIGNvbmZpZyA9IGdzdF9idWZmZXJfcG9vbF9nZXRfY29uZmlnIChwb29sKTsKKyAgICBnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX2dldF9wYXJhbXMgKGNvbmZpZywgTlVMTCwgJnNpemUsICZtaW4sICZtYXgpOworICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoY29uZmlnKTsKKyAgfQorCisgIGlmICh1cGRhdGUpCisgICAgZ3N0X3F1ZXJ5X3NldF9udGhfYWxsb2NhdGlvbl9wb29sIChxdWVyeSwgMCwgcG9vbCwgc2l6ZSwgbWluLCBtYXgpOworICBlbHNlCisgICAgZ3N0X3F1ZXJ5X2FkZF9hbGxvY2F0aW9uX3Bvb2wgKHF1ZXJ5LCBwb29sLCBzaXplLCBtaW4sIG1heCk7CisKKyAgaWYgKGFsbG9jYXRvcikKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChhbGxvY2F0b3IpOworCisgIGlmIChwb29sKQorICAgIGdzdF9vYmplY3RfdW5yZWYgKHBvb2wpOworCisgIHJldHVybiBUUlVFOworCitwb29sX2ZhaWxlZDoKKyAgeworICAgIC8qIHNldHVwX3Bvb2wgYWxyZWFkeSBzZW5kIHRoZSBlcnJvciAqLworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorY29uZmlnX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChvYmotPmVsZW1lbnQsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIikpLCAoTlVMTCkpOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorbm9fc2l6ZToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChvYmotPmVsZW1lbnQsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIpKSwgKE5VTEwpKTsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KK2NsZWFudXA6CisgIHsKKyAgICBpZiAoYWxsb2NhdG9yKQorICAgICAgZ3N0X29iamVjdF91bnJlZiAoYWxsb2NhdG9yKTsKKworICAgIGlmIChwb29sKQorICAgICAgZ3N0X29iamVjdF91bnJlZiAocG9vbCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19kb3duc3RyZWFtX3Bvb2w6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAob2JqLT5lbGVtZW50LCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIikpLAorICAgICAgICAoIldoZW4gaW1wb3J0aW5nIERNQUJVRiBvciBVU0VSUFRSLCB3ZSBuZWVkIGEgcG9vbCB0byBpbXBvcnQgZnJvbSIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF92NGwyX29iamVjdF9wcm9wb3NlX2FsbG9jYXRpb24gKEdzdFY0bDJPYmplY3QgKiBvYmosIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdEJ1ZmZlclBvb2wgKnBvb2w7CisgIC8qIHdlIG5lZWQgYXQgbGVhc3QgMiBidWZmZXJzIHRvIG9wZXJhdGUgKi8KKyAgZ3VpbnQgc2l6ZSwgbWluLCBtYXg7CisgIEdzdENhcHMgKmNhcHM7CisgIGdib29sZWFuIG5lZWRfcG9vbDsKKworICAvKiBTZXQgZGVmYXVsdHMgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzICovCisgIHNpemUgPSBvYmotPmluZm8uc2l6ZTsKKyAgbWluID0gR1NUX1Y0TDJfTUlOX0JVRkZFUlM7CisgIG1heCA9IFZJREVPX01BWF9GUkFNRTsKKworICBnc3RfcXVlcnlfcGFyc2VfYWxsb2NhdGlvbiAocXVlcnksICZjYXBzLCAmbmVlZF9wb29sKTsKKworICBpZiAoY2FwcyA9PSBOVUxMKQorICAgIGdvdG8gbm9fY2FwczsKKworICBpZiAoKHBvb2wgPSBvYmotPnBvb2wpKQorICAgIGdzdF9vYmplY3RfcmVmIChwb29sKTsKKworICBpZiAocG9vbCAhPSBOVUxMKSB7CisgICAgR3N0Q2FwcyAqcGNhcHM7CisgICAgR3N0U3RydWN0dXJlICpjb25maWc7CisKKyAgICAvKiB3ZSBoYWQgYSBwb29sLCBjaGVjayBjYXBzICovCisgICAgY29uZmlnID0gZ3N0X2J1ZmZlcl9wb29sX2dldF9jb25maWcgKHBvb2wpOworICAgIGdzdF9idWZmZXJfcG9vbF9jb25maWdfZ2V0X3BhcmFtcyAoY29uZmlnLCAmcGNhcHMsIE5VTEwsIE5VTEwsIE5VTEwpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAob2JqLT5kYmdfb2JqLAorICAgICAgICAid2UgaGFkIGEgcG9vbCB3aXRoIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIHBjYXBzKTsKKyAgICBpZiAoIWdzdF9jYXBzX2lzX2VxdWFsIChjYXBzLCBwY2FwcykpIHsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoY29uZmlnKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHBvb2wpOworICAgICAgZ290byBkaWZmZXJlbnRfY2FwczsKKyAgICB9CisgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChjb25maWcpOworICB9CisgIGdzdF92NGwyX2dldF9kcml2ZXJfbWluX2J1ZmZlcnMgKG9iaik7CisKKyAgbWluID0gTUFYIChvYmotPm1pbl9idWZmZXJzLCBHU1RfVjRMMl9NSU5fQlVGRkVSUyk7CisKKyAgZ3N0X3F1ZXJ5X2FkZF9hbGxvY2F0aW9uX3Bvb2wgKHF1ZXJ5LCBwb29sLCBzaXplLCBtaW4sIG1heCk7CisKKyAgLyogd2UgYWxzbyBzdXBwb3J0IHZhcmlvdXMgbWV0YWRhdGEgKi8KKyAgZ3N0X3F1ZXJ5X2FkZF9hbGxvY2F0aW9uX21ldGEgKHF1ZXJ5LCBHU1RfVklERU9fTUVUQV9BUElfVFlQRSwgTlVMTCk7CisKKyAgaWYgKHBvb2wpCisgICAgZ3N0X29iamVjdF91bnJlZiAocG9vbCk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub19jYXBzOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAob2JqLT5kYmdfb2JqLCAibm8gY2FwcyBzcGVjaWZpZWQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2RpZmZlcmVudF9jYXBzOgorICB7CisgICAgLyogZGlmZmVyZW50IGNhcHMsIHdlIGNhbid0IHVzZSB0aGlzIHBvb2wgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChvYmotPmRiZ19vYmosICJwb29sIGhhcyBkaWZmZXJlbnQgY2FwcyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oIGIvc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYmE2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmgKQEAgLTAsMCArMSwzMjYgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqICAgICAgICAgICAgICAgMjAwNiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICoKKyAqIGdzdHY0bDJvYmplY3QuaDogYmFzZSBjbGFzcyBmb3IgVjRMMiBlbGVtZW50cworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfVjRMMl9PQkpFQ1RfSF9fCisjZGVmaW5lIF9fR1NUX1Y0TDJfT0JKRUNUX0hfXworCisjaW5jbHVkZSAiZXh0L3ZpZGVvZGV2Mi5oIgorI2lmZGVmIEhBVkVfTElCVjRMMgorIyAgaW5jbHVkZSA8bGlidjRsMi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJ2NGwyLXV0aWxzLmgiCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0cHVzaHNyYy5oPgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyT2JqZWN0IEdzdFY0bDJPYmplY3Q7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMk9iamVjdENsYXNzSGVscGVyIEdzdFY0bDJPYmplY3RDbGFzc0hlbHBlcjsKKworI2luY2x1ZGUgPGdzdHY0bDJidWZmZXJwb29sLmg+CisKKy8qIHNpemUgb2YgdjRsMiBidWZmZXIgcG9vbCBpbiBzdHJlYW1pbmcgY2FzZSAqLworI2RlZmluZSBHU1RfVjRMMl9NSU5fQlVGRkVSUyAyCisKKy8qIG1heCBmcmFtZSB3aWR0aC9oZWlnaHQgKi8KKyNkZWZpbmUgR1NUX1Y0TDJfTUFYX1NJWkUgKDE8PDE1KSAvKiAyXjE1ID09IDMyNzY4ICovCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9WNEwyX0lPX01PREUgKGdzdF92NGwyX2lvX21vZGVfZ2V0X3R5cGUgKCkpCitHVHlwZSBnc3RfdjRsMl9pb19tb2RlX2dldF90eXBlICh2b2lkKTsKKworI2RlZmluZSBHU1RfVjRMMl9PQkpFQ1Qob2JqKSAoR3N0VjRsMk9iamVjdCAqKShvYmopCisKK3R5cGVkZWYgZW51bSB7CisgIEdTVF9WNEwyX0lPX0FVVE8gICAgICAgICAgPSAwLAorICBHU1RfVjRMMl9JT19SVyAgICAgICAgICAgID0gMSwKKyAgR1NUX1Y0TDJfSU9fTU1BUCAgICAgICAgICA9IDIsCisgIEdTVF9WNEwyX0lPX1VTRVJQVFIgICAgICAgPSAzLAorICBHU1RfVjRMMl9JT19ETUFCVUYgICAgICAgID0gNCwKKyAgR1NUX1Y0TDJfSU9fRE1BQlVGX0lNUE9SVCA9IDUKK30gR3N0VjRsMklPTW9kZTsKKwordHlwZWRlZiBnYm9vbGVhbiAgKCpHc3RWNGwyR2V0SW5PdXRGdW5jdGlvbikgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgZ2ludCAqIGlucHV0KTsKK3R5cGVkZWYgZ2Jvb2xlYW4gICgqR3N0VjRsMlNldEluT3V0RnVuY3Rpb24pICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIGdpbnQgaW5wdXQpOwordHlwZWRlZiBnYm9vbGVhbiAgKCpHc3RWNGwyVXBkYXRlRnBzRnVuY3Rpb24pIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCk7CisKKyNkZWZpbmUgR1NUX1Y0TDJfV0lEVEgobykgICAgICAgIChHU1RfVklERU9fSU5GT19XSURUSCAoJihvKS0+aW5mbykpCisjZGVmaW5lIEdTVF9WNEwyX0hFSUdIVChvKSAgICAgICAoR1NUX1ZJREVPX0lORk9fSEVJR0hUICgmKG8pLT5pbmZvKSkKKyNkZWZpbmUgR1NUX1Y0TDJfUElYRUxGT1JNQVQobykgICgobyktPmZtdGRlc2MtPnBpeGVsZm9ybWF0KQorI2RlZmluZSBHU1RfVjRMMl9GUFNfTihvKSAgICAgICAgKEdTVF9WSURFT19JTkZPX0ZQU19OICgmKG8pLT5pbmZvKSkKKyNkZWZpbmUgR1NUX1Y0TDJfRlBTX0QobykgICAgICAgIChHU1RfVklERU9fSU5GT19GUFNfRCAoJihvKS0+aW5mbykpCisKKy8qIHNpbXBsZSBjaGVjayB3aGV0aGVyIHRoZSBkZXZpY2UgaXMgb3BlbiAqLworI2RlZmluZSBHU1RfVjRMMl9JU19PUEVOKG8pICAgICAgKChvKS0+dmlkZW9fZmQgPiAwKQorCisvKiBjaGVjayB3aGV0aGVyIHRoZSBkZXZpY2UgaXMgJ2FjdGl2ZScgKi8KKyNkZWZpbmUgR1NUX1Y0TDJfSVNfQUNUSVZFKG8pICAgICgobyktPmFjdGl2ZSkKKyNkZWZpbmUgR1NUX1Y0TDJfU0VUX0FDVElWRShvKSAgICgobyktPmFjdGl2ZSA9IFRSVUUpCisjZGVmaW5lIEdTVF9WNEwyX1NFVF9JTkFDVElWRShvKSAoKG8pLT5hY3RpdmUgPSBGQUxTRSkKKworLyogY2hlY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdjRsdjRsMm9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIG9wZW4oKSdlZCBvciBub3QgKi8KKyNkZWZpbmUgR1NUX1Y0TDJfQ0hFQ0tfT1BFTih2NGwyb2JqZWN0KQkJCQlcCisgIGlmICghR1NUX1Y0TDJfSVNfT1BFTih2NGwyb2JqZWN0KSkJCQkJXAorICB7CQkJCQkJCQlcCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHY0bDJvYmplY3QtPmVsZW1lbnQsIFJFU09VUkNFLCBTRVRUSU5HUywJXAorICAgICAgKF8oIkRldmljZSBpcyBub3Qgb3Blbi4iKSksIChOVUxMKSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gRkFMU0U7CQkJCQkJXAorICB9CisKKy8qIGNoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHY0bHY0bDJvYmplY3QgaXMgY2xvc2UoKSdlZCBvciB3aGV0aGVyIGl0IGlzIHN0aWxsIG9wZW4gKi8KKyNkZWZpbmUgR1NUX1Y0TDJfQ0hFQ0tfTk9UX09QRU4odjRsMm9iamVjdCkJCQlcCisgIGlmIChHU1RfVjRMMl9JU19PUEVOKHY0bDJvYmplY3QpKQkJCQlcCisgIHsJCQkJCQkJCVwKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAodjRsMm9iamVjdC0+ZWxlbWVudCwgUkVTT1VSQ0UsIFNFVFRJTkdTLAlcCisgICAgICAoXygiRGV2aWNlIGlzIG9wZW4uIikpLCAoTlVMTCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBGQUxTRTsJCQkJCQlcCisgIH0KKworLyogY2hlY2tzIHdoZXRoZXIgd2UncmUgb3V0IG9mIGNhcHR1cmUgbW9kZSBvciBub3QgKi8KKyNkZWZpbmUgR1NUX1Y0TDJfQ0hFQ0tfTk9UX0FDVElWRSh2NGwyb2JqZWN0KQkJCVwKKyAgaWYgKEdTVF9WNEwyX0lTX0FDVElWRSh2NGwyb2JqZWN0KSkJCQkJXAorICB7CQkJCQkJCQlcCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHY0bDJvYmplY3QtPmVsZW1lbnQsIFJFU09VUkNFLCBTRVRUSU5HUywgXAorICAgICAgKE5VTEwpLCAoIkRldmljZSBpcyBpbiBzdHJlYW1pbmcgbW9kZSIpKTsgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gRkFMU0U7CQkJCQkJXAorICB9CisKKworc3RydWN0IF9Hc3RWNGwyT2JqZWN0IHsKKyAgR3N0RWxlbWVudCAqIGVsZW1lbnQ7CisgIEdzdE9iamVjdCAqIGRiZ19vYmo7CisKKyAgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7ICAgLyogVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCAqLworCisgIC8qIHRoZSB2aWRlbyBkZXZpY2UgKi8KKyAgY2hhciAqdmlkZW9kZXY7CisKKyAgLyogdGhlIHZpZGVvLWRldmljZSdzIGZpbGUgZGVzY3JpcHRvciAqLworICBnaW50IHZpZGVvX2ZkOworICBHc3RWNGwySU9Nb2RlIG1vZGU7CisKKyAgZ2Jvb2xlYW4gYWN0aXZlOworICBnYm9vbGVhbiBzdHJlYW1pbmc7CisKKyAgLyogdGhlIGN1cnJlbnQgZm9ybWF0ICovCisgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmZtdGRlc2M7CisgIHN0cnVjdCB2NGwyX2Zvcm1hdCBmb3JtYXQ7CisgIEdzdFZpZGVvSW5mbyBpbmZvOworICBHc3RWaWRlb0FsaWdubWVudCBhbGlnbjsKKworICAvKiBGZWF0dXJlcyAqLworICBnYm9vbGVhbiBuZWVkX3ZpZGVvX21ldGE7CisgIGdib29sZWFuIGhhc19hbHBoYV9jb21wb25lbnQ7CisKKyAgLyogb25seSB1c2VkIGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgTVBMQU5FCisgICAqIG5iIHBsYW5lcyBpcyBtZWFuaW5nIG9mIHY0bDIgcGxhbmVzCisgICAqIHRoZSBnc3RyZWFtZXIgZXF1aXZhbGVudCBpcyBnc3RfYnVmZmVyX25fbWVtb3J5CisgICAqLworICBnaW50IG5fdjRsMl9wbGFuZXM7CisKKyAgLyogV2UgY2FjaGUgdGhlIGZyYW1lIGR1cmF0aW9uIGlmIGtub3duICovCisgIEdzdENsb2NrVGltZSBkdXJhdGlvbjsKKworICAvKiBpZiB0aGUgTVBMQU5FIGRldmljZSBzdXBwb3J0IGJvdGggY29udGlndW91cyBhbmQgbm9uIGNvbnRpZ3VvdXMKKyAgICogaXQgYWxsb3dzIHRvIHNlbGVjdCB3aGljaCBvbmUgd2Ugd2FudC4gQnV0IHdlIHByZWZlcmVkX25vbl9jb250aWd1b3VzCisgICAqIG5vbiBjb250aWd1b3VzIG1vZGUuCisgICAqLworICBnYm9vbGVhbiBwcmVmZXJlZF9ub25fY29udGlndW91czsKKworICAvKiBUaGlzIHdpbGwgYmUgc2V0IGlmIHN1cHBvcnRlZCBpbiBkZWNpZGVfYWxsb2NhdGlvbi4gSXQgY2FuIGJlIHVzZWQgdG8KKyAgICogY2FsY3VsYXRlIHRoZSBtaW5pbXVtIGxhdGVuY3kuICovCisgIGd1aW50MzIgbWluX2J1ZmZlcnM7CisKKyAgLyogd2FudGVkIG1vZGUgKi8KKyAgR3N0VjRsMklPTW9kZSByZXFfbW9kZTsKKworICAvKiBvcHRpb25hbCBwb29sICovCisgIEdzdEJ1ZmZlclBvb2wgKnBvb2w7CisKKyAgLyogdGhlIHZpZGVvIGRldmljZSdzIGNhcGFiaWxpdGllcyAqLworICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5IHZjYXA7CisgIC8qIG9wZW5lZCBkZXZpY2Ugc3BlY2lmaWMgY2FwYWJpbGl0aWVzICovCisgIGd1aW50MzIgZGV2aWNlX2NhcHM7CisKKyAgLyogbGlzdHMuLi4gKi8KKyAgR1NMaXN0ICpmb3JtYXRzOyAgICAgICAgICAgICAgLyogbGlzdCBvZiBhdmFpbGFibGUgY2FwdHVyZSBmb3JtYXRzICovCisgIEdzdENhcHMgKnByb2JlZF9jYXBzOworCisgIEdMaXN0ICpjb2xvcnM7CisgIEdMaXN0ICpub3JtczsKKyAgR0xpc3QgKmNoYW5uZWxzOworICBHRGF0YSAqY29udHJvbHM7CisKKyAgLyogcHJvcGVydGllcyAqLworICB2NGwyX3N0ZF9pZCB0dl9ub3JtOworICBnY2hhciAqY2hhbm5lbDsKKyAgZ3Vsb25nIGZyZXF1ZW5jeTsKKyAgR3N0U3RydWN0dXJlICpleHRyYV9jb250cm9sczsKKyAgZ2Jvb2xlYW4ga2VlcF9hc3BlY3Q7CisgIEdWYWx1ZSAqcGFyOworCisgIC8qIGZ1bmNzICovCisgIEdzdFY0bDJHZXRJbk91dEZ1bmN0aW9uICBnZXRfaW5fb3V0X2Z1bmM7CisgIEdzdFY0bDJTZXRJbk91dEZ1bmN0aW9uICBzZXRfaW5fb3V0X2Z1bmM7CisgIEdzdFY0bDJVcGRhdGVGcHNGdW5jdGlvbiB1cGRhdGVfZnBzX2Z1bmM7CisKKyAgLyogc3lzY2FsbHMgKi8KKyAgZ2ludCAoKmZkX29wZW4pIChnaW50IGZkLCBnaW50IHY0bDJfZmxhZ3MpOworICBnaW50ICgqY2xvc2UpIChnaW50IGZkKTsKKyAgZ2ludCAoKmR1cCkgKGdpbnQgZmQpOworICBnaW50ICgqaW9jdGwpIChnaW50IGZkLCBndWxvbmcgcmVxdWVzdCwgLi4uKTsKKyAgZ3NzaXplICgqcmVhZCkgKGdpbnQgZmQsIGdwb2ludGVyIGJ1ZmZlciwgZ3NpemUgbik7CisgIGdwb2ludGVyICgqbW1hcCkgKGdwb2ludGVyIHN0YXJ0LCBnc2l6ZSBsZW5ndGgsIGdpbnQgcHJvdCwgZ2ludCBmbGFncywKKyAgICAgIGdpbnQgZmQsIGdpbnQ2NCBvZmZzZXQpOworICBnaW50ICgqbXVubWFwKSAoZ3BvaW50ZXIgX3N0YXJ0LCBnc2l6ZSBsZW5ndGgpOworCisgIC8qIFF1aXJrcyAqLworICAvKiBTa2lwcyBpbnRlcmxhY2luZyBwcm9iZXMgKi8KKyAgZ2Jvb2xlYW4gbmV2ZXJfaW50ZXJsYWNlZDsKKyAgLyogQWxsb3cgdG8gc2tpcCByZWFkaW5nIGluaXRpYWwgZm9ybWF0IHRocm91Z2ggR19GTVQuIFNvbWUgZGV2aWNlcworICAgKiBqdXN0IGZhaWxzIGlmIHlvdSBkb24ndCBjYWxsIFNfRk1UIGZpcnN0LiAoZXg6IE0yTSBkZWNvZGVycykgKi8KKyAgZ2Jvb2xlYW4gbm9faW5pdGlhbF9mb3JtYXQ7CisgIC8qIEF2b2lkIGFueSB0cnlfZm10IHByb2JlLiBUaGlzIGlzIHVzZWQgYnkgdjRsMnNyYyB0byBzcGVlZHVwIHN0YXJ0IHVwIHRpbWUKKyAgICogb24gc2xvdyBVU0IgZmlybXdhcmVzLiBXaGVuIHRoaXMgaXMgc2V0LCBnc3RfdjRsMl9zZXRfZm9ybWF0KCkgd2lsbCBtb2RpZnkKKyAgICogdGhlIGNhcHMgdG8gcmVmbGVjdCB3aGF0IHdhcyBuZWdvdGlhdGVkIGR1cmluZyBmaXhhdGlvbiAqLworICBnYm9vbGVhbiBza2lwX3RyeV9mbXRfcHJvYmVzOworfTsKKworc3RydWN0IF9Hc3RWNGwyT2JqZWN0Q2xhc3NIZWxwZXIgeworICAvKiBwcm9iZWQgZGV2aWNlcyAqLworICBHTGlzdCAqZGV2aWNlczsKK307CisKK0dUeXBlIGdzdF92NGwyX29iamVjdF9nZXRfdHlwZSAodm9pZCk7CisKKyNkZWZpbmUgVjRMMl9TVERfT0JKRUNUX1BST1BTIFwKKyAgICBQUk9QX0RFVklDRSwgICAgICAgICAgICAgIFwKKyAgICBQUk9QX0RFVklDRV9OQU1FLCAgICAgICAgIFwKKyAgICBQUk9QX0RFVklDRV9GRCwgICAgICAgICAgIFwKKyAgICBQUk9QX0ZMQUdTLCAgICAgICAgICAgICAgIFwKKyAgICBQUk9QX0JSSUdIVE5FU1MsICAgICAgICAgIFwKKyAgICBQUk9QX0NPTlRSQVNULCAgICAgICAgICAgIFwKKyAgICBQUk9QX1NBVFVSQVRJT04sICAgICAgICAgIFwKKyAgICBQUk9QX0hVRSwgICAgICAgICAgICAgICAgIFwKKyAgICBQUk9QX1RWX05PUk0sICAgICAgICAgICAgIFwKKyAgICBQUk9QX0lPX01PREUsICAgICAgICAgICAgIFwKKyAgICBQUk9QX09VVFBVVF9JT19NT0RFLCAgICAgIFwKKyAgICBQUk9QX0NBUFRVUkVfSU9fTU9ERSwgICAgIFwKKyAgICBQUk9QX0VYVFJBX0NPTlRST0xTLCAgICAgIFwKKyAgICBQUk9QX1BJWEVMX0FTUEVDVF9SQVRJTywgIFwKKyAgICBQUk9QX0ZPUkNFX0FTUEVDVF9SQVRJTworCisvKiBjcmVhdGUvZGVzdHJveSAqLworR3N0VjRsMk9iamVjdCogIGdzdF92NGwyX29iamVjdF9uZXcgICAgICAgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdE9iamVjdCAqIGRiZ19vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSB2NGwyX2J1Zl90eXBlICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBkZWZhdWx0X2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RWNGwyR2V0SW5PdXRGdW5jdGlvbiBnZXRfaW5fb3V0X2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VjRsMlNldEluT3V0RnVuY3Rpb24gc2V0X2luX291dF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFY0bDJVcGRhdGVGcHNGdW5jdGlvbiB1cGRhdGVfZnBzX2Z1bmMpOworCit2b2lkICAgICAgICAgZ3N0X3Y0bDJfb2JqZWN0X2Rlc3Ryb3kgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpOworCisvKiBwcm9wZXJ0aWVzICovCisKK3ZvaWQgICAgICAgICBnc3RfdjRsMl9vYmplY3RfaW5zdGFsbF9wcm9wZXJ0aWVzX2hlbHBlciAoR09iamVjdENsYXNzICogZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGRlZmF1bHRfZGV2aWNlKTsKKwordm9pZCAgICAgICAgIGdzdF92NGwyX29iamVjdF9pbnN0YWxsX20ybV9wcm9wZXJ0aWVzX2hlbHBlciAoR09iamVjdENsYXNzICogZ29iamVjdF9jbGFzcyk7CisKK2dib29sZWFuICAgICBnc3RfdjRsMl9vYmplY3Rfc2V0X3Byb3BlcnR5X2hlbHBlciAgICAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50IHByb3BfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUGFyYW1TcGVjICogcHNwZWMpOworZ2Jvb2xlYW4gICAgIGdzdF92NGwyX29iamVjdF9nZXRfcHJvcGVydHlfaGVscGVyICAgICAgIChHc3RWNGwyT2JqZWN0ICp2NGwyb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKy8qIG9wZW4vY2xvc2UgKi8KK2dib29sZWFuICAgICBnc3RfdjRsMl9vYmplY3Rfb3BlbiAgICAgICAgICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCk7CitnYm9vbGVhbiAgICAgZ3N0X3Y0bDJfb2JqZWN0X29wZW5fc2hhcmVkICAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIEdzdFY0bDJPYmplY3QgKiBvdGhlcik7CitnYm9vbGVhbiAgICAgZ3N0X3Y0bDJfb2JqZWN0X2Nsb3NlICAgICAgICAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpOworCisvKiBwcm9iaW5nICovCisKK0dzdENhcHMqICAgICBnc3RfdjRsMl9vYmplY3RfZ2V0X2FsbF9jYXBzICh2b2lkKTsKKworR3N0Q2FwcyogICAgIGdzdF92NGwyX29iamVjdF9nZXRfcmF3X2NhcHMgKHZvaWQpOworCitHc3RDYXBzKiAgICAgZ3N0X3Y0bDJfb2JqZWN0X2dldF9jb2RlY19jYXBzICh2b2lkKTsKKworZ2ludCAgICAgICAgIGdzdF92NGwyX29iamVjdF9leHRyYXBvbGF0ZV9zdHJpZGUgKGNvbnN0IEdzdFZpZGVvRm9ybWF0SW5mbyAqIGZpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50IHBsYW5lLCBnaW50IHN0cmlkZSk7CisKK2dib29sZWFuICAgICBnc3RfdjRsMl9vYmplY3Rfc2V0X2Zvcm1hdCAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBHc3RDYXBzICogY2FwcywgR3N0VjRsMkVycm9yICogZXJyb3IpOworZ2Jvb2xlYW4gICAgIGdzdF92NGwyX29iamVjdF90cnlfZm9ybWF0ICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIEdzdENhcHMgKiBjYXBzLCBHc3RWNGwyRXJyb3IgKiBlcnJvcik7CisKK2dib29sZWFuICAgICBnc3RfdjRsMl9vYmplY3RfY2Fwc19lcXVhbCAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBHc3RDYXBzICogY2Fwcyk7CisKK2dib29sZWFuICAgICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrICAgICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KTsKK2dib29sZWFuICAgICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrX3N0b3AgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KTsKKworZ2Jvb2xlYW4gICAgIGdzdF92NGwyX29iamVjdF9zdG9wICAgICAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpOworCitHc3RDYXBzICogICAgZ3N0X3Y0bDJfb2JqZWN0X3Byb2JlX2NhcHMgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgR3N0Q2FwcyAqIGZpbHRlcik7CitHc3RDYXBzICogICAgZ3N0X3Y0bDJfb2JqZWN0X2dldF9jYXBzICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgR3N0Q2FwcyAqIGZpbHRlcik7CisKK2dib29sZWFuICAgICBnc3RfdjRsMl9vYmplY3RfYWNxdWlyZV9mb3JtYXQgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBHc3RWaWRlb0luZm8gKiBpbmZvKTsKKworZ2Jvb2xlYW4gICAgIGdzdF92NGwyX29iamVjdF9zZXRfY3JvcCAgICAoR3N0VjRsMk9iamVjdCAqIG9iaik7CisKK2dib29sZWFuICAgICBnc3RfdjRsMl9vYmplY3RfZGVjaWRlX2FsbG9jYXRpb24gKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworZ2Jvb2xlYW4gICAgIGdzdF92NGwyX29iamVjdF9wcm9wb3NlX2FsbG9jYXRpb24gKEdzdFY0bDJPYmplY3QgKiBvYmosIEdzdFF1ZXJ5ICogcXVlcnkpOworCitHc3RTdHJ1Y3R1cmUgKiBnc3RfdjRsMl9vYmplY3RfdjRsMmZvdXJjY190b19zdHJ1Y3R1cmUgKGd1aW50MzIgZm91cmNjKTsKKworLyogVE9ETyBNb3ZlIHRvIHByb3BlciBuYW1lc3BhY2UgKi8KKy8qIG9wZW4vY2xvc2UgdGhlIGRldmljZSAqLworZ2Jvb2xlYW4gICAgIGdzdF92NGwyX29wZW4gICAgICAgICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCk7CitnYm9vbGVhbiAgICAgZ3N0X3Y0bDJfZHVwICAgICAgICAgICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBHc3RWNGwyT2JqZWN0ICogb3RoZXIpOworZ2Jvb2xlYW4gICAgIGdzdF92NGwyX2Nsb3NlICAgICAgICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCk7CisKKy8qIG5vcm0vaW5wdXQvb3V0cHV0ICovCitnYm9vbGVhbiAgICAgZ3N0X3Y0bDJfZ2V0X25vcm0gICAgICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCB2NGwyX3N0ZF9pZCAqIG5vcm0pOworZ2Jvb2xlYW4gICAgIGdzdF92NGwyX3NldF9ub3JtICAgICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgdjRsMl9zdGRfaWQgbm9ybSk7CitnYm9vbGVhbiAgICAgZ3N0X3Y0bDJfZ2V0X2lucHV0ICAgICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBnaW50ICogaW5wdXQpOworZ2Jvb2xlYW4gICAgIGdzdF92NGwyX3NldF9pbnB1dCAgICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgZ2ludCBpbnB1dCk7CitnYm9vbGVhbiAgICAgZ3N0X3Y0bDJfZ2V0X291dHB1dCAgICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBnaW50ICogb3V0cHV0KTsKK2dib29sZWFuICAgICBnc3RfdjRsMl9zZXRfb3V0cHV0ICAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIGdpbnQgb3V0cHV0KTsKKworLyogZnJlcXVlbmN5IGNvbnRyb2wgKi8KK2dib29sZWFuICAgICBnc3RfdjRsMl9nZXRfZnJlcXVlbmN5ICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBnaW50IHR1bmVybnVtLCBndWxvbmcgKiBmcmVxdWVuY3kpOworZ2Jvb2xlYW4gICAgIGdzdF92NGwyX3NldF9mcmVxdWVuY3kgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIGdpbnQgdHVuZXJudW0sIGd1bG9uZyBmcmVxdWVuY3kpOworZ2Jvb2xlYW4gICAgIGdzdF92NGwyX3NpZ25hbF9zdHJlbmd0aCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIGdpbnQgdHVuZXJudW0sIGd1bG9uZyAqIHNpZ25hbCk7CisKKy8qIGF0dHJpYnV0ZSBjb250cm9sICovCitnYm9vbGVhbiAgICAgZ3N0X3Y0bDJfZ2V0X2F0dHJpYnV0ZSAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgaW50IGF0dHJpYnV0ZSwgaW50ICogdmFsdWUpOworZ2Jvb2xlYW4gICAgIGdzdF92NGwyX3NldF9hdHRyaWJ1dGUgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIGludCBhdHRyaWJ1dGUsIGNvbnN0IGludCB2YWx1ZSk7CitnYm9vbGVhbiAgICAgZ3N0X3Y0bDJfc2V0X2NvbnRyb2xzICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgR3N0U3RydWN0dXJlICogY29udHJvbHMpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfVjRMMl9PQkpFQ1RfSF9fICovCmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwycmFkaW8uYyBiL3N5cy92NGwyL2dzdHY0bDJyYWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZmJlZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwycmFkaW8uYwpAQCAtMCwwICsxLDU4MiBAQAorLyogR1N0cmVhbWVyIHY0bDIgcmFkaW8gdHVuZXIgZWxlbWVudAorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExIEFsZXhleSBDaGVybm92IDw0ZXJub3ZAZ21haWwuY29tPgorICoKKyAqIGdzdHY0bDJyYWRpby5jIC0gVjRMMiByYWRpbyB0dW5lciBlbGVtZW50CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtdjRsMnJhZGlvCisgKgorICogdjRsMnJhZGlvIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgcmFkaW8gZGV2aWNlCisgKiBhbmQgdG8gdHVuZSBpdCB0byBkaWZmZXJlbnQgcmFkaW9zdGF0aW9ucy4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHY0bDJyYWRpbyBkZXZpY2U9L2Rldi9yYWRpbzAgZnJlcXVlbmN5PTEwMTIwMDAwMAorICogZ3N0LWxhdW5jaC0xLjAgYWxzYXNyYyBkZXZpY2U9aHc6MSAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhbHNhc2luaworICogXXwKKyAqIEZpcnN0IHBpcGVsaW5lIHR1bmVzIHRoZSByYWRpbyBkZXZpY2UgL2Rldi9yYWRpbzAgdG8gc3RhdGlvbiAxMDEuMiBNSHosCisgKiBzZWNvbmQgcGlwZWxpbmUgY29ubmVjdHMgZGlnaXRhbCBhdWRpbyBvdXQgKGh3OjEpIHRvIGRlZmF1bHQgc291bmQgY2FyZC4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3QvZ3N0LWkxOG4tcGx1Z2luLmgiCisKKyNpbmNsdWRlICJnc3R2NGwyb2JqZWN0LmgiCisjaW5jbHVkZSAiZ3N0djRsMnR1bmVyLmgiCisjaW5jbHVkZSAiZ3N0djRsMnJhZGlvLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHY0bDJyYWRpb19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCB2NGwycmFkaW9fZGVidWcKKworI2RlZmluZSBERUZBVUxUX1BST1BfREVWSUNFICIvZGV2L3JhZGlvMCIKKyNkZWZpbmUgTUlOX0ZSRVFVRU5DWQkJIDg3NTAwMDAwCisjZGVmaW5lIERFRkFVTFRfRlJFUVVFTkNZCTEwMDAwMDAwMAorI2RlZmluZSBNQVhfRlJFUVVFTkNZCQkxMDgwMDAwMDAKKworZW51bQoreworICBBUkdfMCwKKyAgQVJHX0RFVklDRSwKKyAgQVJHX0ZSRVFVRU5DWQorfTsKKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMnJhZGlvX2ZpbGxfY2hhbm5lbF9saXN0IChHc3RWNGwyUmFkaW8gKiByYWRpbykKK3sKKyAgaW50IHJlczsKKyAgc3RydWN0IHY0bDJfdHVuZXIgdnR1bjsKKyAgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSB2YzsKKyAgR3N0VjRsMlR1bmVyQ2hhbm5lbCAqdjRsMmNoYW5uZWw7CisgIEdzdFR1bmVyQ2hhbm5lbCAqY2hhbm5lbDsKKworICBHc3RFbGVtZW50ICplOworCisgIEdzdFY0bDJPYmplY3QgKnY0bDJvYmplY3Q7CisKKyAgZSA9IEdTVF9FTEVNRU5UIChyYWRpbyk7CisgIHY0bDJvYmplY3QgPSByYWRpby0+djRsMm9iamVjdDsKKworICBHU1RfREVCVUdfT0JKRUNUIChlLCAiZ2V0dGluZyBhdWRpbyBlbnVtZXJhdGlvbiIpOworICBHU1RfVjRMMl9DSEVDS19PUEVOICh2NGwyb2JqZWN0KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChlLCAiICBhdWRpbyBpbnB1dCIpOworCisgIG1lbXNldCAoJnZjLCAwLCBzaXplb2YgKHZjKSk7CisKKyAgcmVzID0gdjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfUVVFUllDQVAsICZ2Yyk7CisgIGlmIChyZXMgPCAwKQorICAgIGdvdG8gY2Fwc19mYWlsZWQ7CisKKyAgaWYgKHZjLmNhcGFiaWxpdGllcyAmIFY0TDJfQ0FQX0RFVklDRV9DQVBTKQorICAgIHY0bDJvYmplY3QtPmRldmljZV9jYXBzID0gdmMuZGV2aWNlX2NhcHM7CisgIGVsc2UKKyAgICB2NGwyb2JqZWN0LT5kZXZpY2VfY2FwcyA9IHZjLmNhcGFiaWxpdGllczsKKworICBpZiAoISh2NGwyb2JqZWN0LT5kZXZpY2VfY2FwcyAmIFY0TDJfQ0FQX1RVTkVSKSkKKyAgICBnb3RvIG5vdF9hX3R1bmVyOworCisgIC8qIGdldHRpbmcgYXVkaW8gaW5wdXQgKi8KKyAgbWVtc2V0ICgmdnR1biwgMCwgc2l6ZW9mICh2dHVuKSk7CisgIHZ0dW4uaW5kZXggPSAwOworCisgIHJlcyA9IHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX0dfVFVORVIsICZ2dHVuKTsKKyAgaWYgKHJlcyA8IDApCisgICAgZ290byB0dW5lcl9mYWlsZWQ7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGUsICIgICBpbmRleDogICAgICVkIiwgdnR1bi5pbmRleCk7CisgIEdTVF9MT0dfT0JKRUNUIChlLCAiICAgbmFtZTogICAgICAnJXMnIiwgdnR1bi5uYW1lKTsKKyAgR1NUX0xPR19PQkpFQ1QgKGUsICIgICB0eXBlOiAgICAgICUwMTZ4IiwgKGd1aW50KSB2dHVuLnR5cGUpOworICBHU1RfTE9HX09CSkVDVCAoZSwgIiAgIGNhcHM6ICAgICAgJTAxNngiLCAoZ3VpbnQpIHZ0dW4uY2FwYWJpbGl0eSk7CisgIEdTVF9MT0dfT0JKRUNUIChlLCAiICAgcmxvdzogICAgICAlMDE2eCIsIChndWludCkgdnR1bi5yYW5nZWxvdyk7CisgIEdTVF9MT0dfT0JKRUNUIChlLCAiICAgcmhpZ2g6ICAgICAlMDE2eCIsIChndWludCkgdnR1bi5yYW5nZWhpZ2gpOworICBHU1RfTE9HX09CSkVDVCAoZSwgIiAgIGF1ZG1vZGU6ICAgJTAxNngiLCAoZ3VpbnQpIHZ0dW4uYXVkbW9kZSk7CisKKyAgdjRsMmNoYW5uZWwgPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX1Y0TDJfVFVORVJfQ0hBTk5FTCwgTlVMTCk7CisgIGNoYW5uZWwgPSBHU1RfVFVORVJfQ0hBTk5FTCAodjRsMmNoYW5uZWwpOworICBjaGFubmVsLT5sYWJlbCA9IGdfc3RyZHVwICgoY29uc3QgZ2NoYXIgKikgdnR1bi5uYW1lKTsKKyAgY2hhbm5lbC0+ZmxhZ3MgPSBHU1RfVFVORVJfQ0hBTk5FTF9GUkVRVUVOQ1kgfCBHU1RfVFVORVJfQ0hBTk5FTF9BVURJTzsKKyAgdjRsMmNoYW5uZWwtPmluZGV4ID0gMDsKKyAgdjRsMmNoYW5uZWwtPnR1bmVyID0gMDsKKworICBjaGFubmVsLT5mcmVxX211bHRpcGxpY2F0b3IgPQorICAgICAgNjIuNSAqICgodnR1bi5jYXBhYmlsaXR5ICYgVjRMMl9UVU5FUl9DQVBfTE9XKSA/IDEgOiAxMDAwKTsKKyAgY2hhbm5lbC0+bWluX2ZyZXF1ZW5jeSA9IHZ0dW4ucmFuZ2Vsb3cgKiBjaGFubmVsLT5mcmVxX211bHRpcGxpY2F0b3I7CisgIGNoYW5uZWwtPm1heF9mcmVxdWVuY3kgPSB2dHVuLnJhbmdlaGlnaCAqIGNoYW5uZWwtPmZyZXFfbXVsdGlwbGljYXRvcjsKKyAgY2hhbm5lbC0+bWluX3NpZ25hbCA9IDA7CisgIGNoYW5uZWwtPm1heF9zaWduYWwgPSAweGZmZmY7CisKKyAgdjRsMm9iamVjdC0+Y2hhbm5lbHMgPQorICAgICAgZ19saXN0X3ByZXBlbmQgKHY0bDJvYmplY3QtPmNoYW5uZWxzLCAoZ3BvaW50ZXIpIGNoYW5uZWwpOworCisgIHY0bDJvYmplY3QtPmNoYW5uZWxzID0gZ19saXN0X3JldmVyc2UgKHY0bDJvYmplY3QtPmNoYW5uZWxzKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChlLCAiZG9uZSIpOworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK3R1bmVyX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChlLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIpLAorICAgICAgICAgICAgdnR1bi5pbmRleCwgdjRsMm9iamVjdC0+dmlkZW9kZXYpLCBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2NhcHNfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGUsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iKSwKKyAgICAgICAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2KSwgR1NUX0VSUk9SX1NZU1RFTSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub3RfYV90dW5lcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChlLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iKSwKKyAgICAgICAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2KSwgR1NUX0VSUk9SX1NZU1RFTSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJyYWRpb19nZXRfaW5wdXQgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBnaW50ICogaW5wdXQpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmVsZW1lbnQsICJ0cnlpbmcgdG8gZ2V0IHJhZGlvIGlucHV0Iik7CisKKyAgaWYgKCFHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCF2NGwyb2JqZWN0LT5jaGFubmVscykKKyAgICBnb3RvIGlucHV0X2ZhaWxlZDsKKworICAqaW5wdXQgPSAwOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmVsZW1lbnQsICJpbnB1dDogJWQiLCAwKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2lucHV0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHY0bDJvYmplY3QtPmVsZW1lbnQsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIpLAorICAgICAgICAgICAgdjRsMm9iamVjdC0+dmlkZW9kZXYpLCBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMnJhZGlvX3NldF9pbnB1dCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIGdpbnQgaW5wdXQpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmVsZW1lbnQsICJ0cnlpbmcgdG8gc2V0IGlucHV0IHRvICVkIiwgaW5wdXQpOworCisgIGlmICghR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghdjRsMm9iamVjdC0+Y2hhbm5lbHMpCisgICAgZ290byBpbnB1dF9mYWlsZWQ7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitpbnB1dF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HICh2NGwyb2JqZWN0LT5lbGVtZW50LCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iKSwKKyAgICAgICAgICAgIGlucHV0LCB2NGwyb2JqZWN0LT52aWRlb2RldiksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwycmFkaW9fc2V0X211dGVfb24gKEdzdFY0bDJSYWRpbyAqIHJhZGlvLCBnYm9vbGVhbiBvbikKK3sKKyAgZ2ludCByZXM7CisgIHN0cnVjdCB2NGwyX2NvbnRyb2wgdmN0cmw7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocmFkaW8sICJzZXR0aW5nIGN1cnJlbnQgdHVuZXIgbXV0ZSBzdGF0ZTogJWQiLCBvbik7CisKKyAgaWYgKCFHU1RfVjRMMl9JU19PUEVOIChyYWRpby0+djRsMm9iamVjdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIG1lbXNldCAoJnZjdHJsLCAwLCBzaXplb2YgKHZjdHJsKSk7CisgIHZjdHJsLmlkID0gVjRMMl9DSURfQVVESU9fTVVURTsKKyAgdmN0cmwudmFsdWUgPSBvbjsKKworICBHU1RfREVCVUdfT0JKRUNUIChyYWRpbywgInJhZGlvIGZkOiAlZCIsIHJhZGlvLT52NGwyb2JqZWN0LT52aWRlb19mZCk7CisKKyAgcmVzID0gaW9jdGwgKHJhZGlvLT52NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX1NfQ1RSTCwgJnZjdHJsKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocmFkaW8sICJtdXRlIHN0YXRlIGNoYW5nZSByZXN1bHQ6ICVkIiwgcmVzKTsKKyAgaWYgKHJlcyA8IDApCisgICAgZ290byBmcmVxX2ZhaWxlZDsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2ZyZXFfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocmFkaW8sIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIiksCisgICAgICAgICAgICByYWRpby0+djRsMm9iamVjdC0+dmlkZW9kZXYpLCBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMnJhZGlvX3NldF9tdXRlIChHc3RWNGwyUmFkaW8gKiByYWRpbykKK3sKKyAgcmV0dXJuIGdzdF92NGwycmFkaW9fc2V0X211dGVfb24gKHJhZGlvLCBUUlVFKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMnJhZGlvX3NldF91bm11dGUgKEdzdFY0bDJSYWRpbyAqIHJhZGlvKQoreworICByZXR1cm4gZ3N0X3Y0bDJyYWRpb19zZXRfbXV0ZV9vbiAocmFkaW8sIEZBTFNFKTsKK30KKworR1NUX0lNUExFTUVOVF9WNEwyX1RVTkVSX01FVEhPRFMgKEdzdFY0bDJSYWRpbywgZ3N0X3Y0bDJyYWRpbyk7CisKK3N0YXRpYyB2b2lkIGdzdF92NGwycmFkaW9fdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwKKyAgICBncG9pbnRlciBpZmFjZV9kYXRhKTsKKworc3RhdGljIHZvaWQKK2dzdF92NGwycmFkaW9fdHVuZXJfaW50ZXJmYWNlX3JlaW5pdCAoR3N0VHVuZXJJbnRlcmZhY2UgKiBpZmFjZSkKK3sKKyAgZ3N0X3Y0bDJyYWRpb190dW5lcl9pbnRlcmZhY2VfaW5pdCAoaWZhY2UpOworfQorCisjZGVmaW5lIGdzdF92NGwycmFkaW9fcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdFY0bDJSYWRpbywgZ3N0X3Y0bDJyYWRpbywgR1NUX1RZUEVfRUxFTUVOVCwKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1VSSV9IQU5ETEVSLAorICAgICAgICBnc3RfdjRsMnJhZGlvX3VyaV9oYW5kbGVyX2luaXQpOworICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfVFVORVIsCisgICAgICAgIGdzdF92NGwycmFkaW9fdHVuZXJfaW50ZXJmYWNlX3JlaW5pdCkpOworCitzdGF0aWMgdm9pZCBnc3RfdjRsMnJhZGlvX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF92NGwycmFkaW9fZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3Y0bDJyYWRpb19maW5hbGl6ZSAoR3N0VjRsMlJhZGlvICogcmFkaW8pOworc3RhdGljIHZvaWQgZ3N0X3Y0bDJyYWRpb19kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfdjRsMnJhZGlvX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMnJhZGlvX2NsYXNzX2luaXQgKEdzdFY0bDJSYWRpb0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X3Y0bDJyYWRpb19kaXNwb3NlOworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IChHT2JqZWN0RmluYWxpemVGdW5jKSBnc3RfdjRsMnJhZGlvX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdjRsMnJhZGlvX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3Y0bDJyYWRpb19nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgQVJHX0RFVklDRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJkZXZpY2UiLCAiUmFkaW8gZGV2aWNlIGxvY2F0aW9uIiwKKyAgICAgICAgICAiVmlkZW80TGludXgyIHJhZGlvIGRldmljZSBsb2NhdGlvbiIsCisgICAgICAgICAgREVGQVVMVF9QUk9QX0RFVklDRSwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBBUkdfRlJFUVVFTkNZLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImZyZXF1ZW5jeSIsICJTdGF0aW9uIGZyZXF1ZW5jeSIsCisgICAgICAgICAgIlN0YXRpb24gZnJlcXVlbmN5IGluIEh6IiwKKyAgICAgICAgICBNSU5fRlJFUVVFTkNZLCBNQVhfRlJFUVVFTkNZLCBERUZBVUxUX0ZSRVFVRU5DWSwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwycmFkaW9fY2hhbmdlX3N0YXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJhZGlvICh2aWRlbzRsaW51eDIpIFR1bmVyIiwKKyAgICAgICJUdW5lciIsCisgICAgICAiQ29udHJvbHMgYSBWaWRlbzRMaW51eDIgcmFkaW8gZGV2aWNlIiwKKyAgICAgICJBbGV4ZXkgQ2hlcm5vdiA8NGVybm92QGdtYWlsLmNvbT4iKTsKKworICBrbGFzcy0+djRsMl9jbGFzc19kZXZpY2VzID0gTlVMTDsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAodjRsMnJhZGlvX2RlYnVnLCAidjRsMnJhZGlvIiwgMCwKKyAgICAgICJWNGwyIHJhZGlvIGVsZW1lbnQiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwycmFkaW9faW5pdCAoR3N0VjRsMlJhZGlvICogZmlsdGVyKQoreworICBmaWx0ZXItPnY0bDJvYmplY3QgPSBnc3RfdjRsMl9vYmplY3RfbmV3IChHU1RfRUxFTUVOVCAoZmlsdGVyKSwKKyAgICAgIEdTVF9PQkpFQ1QgKGZpbHRlciksIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwgREVGQVVMVF9QUk9QX0RFVklDRSwKKyAgICAgIGdzdF92NGwycmFkaW9fZ2V0X2lucHV0LCBnc3RfdjRsMnJhZGlvX3NldF9pbnB1dCwgTlVMTCk7CisKKyAgZmlsdGVyLT52NGwyb2JqZWN0LT5mcmVxdWVuY3kgPSBERUZBVUxUX0ZSRVFVRU5DWTsKKyAgZ19mcmVlIChmaWx0ZXItPnY0bDJvYmplY3QtPnZpZGVvZGV2KTsKKyAgZmlsdGVyLT52NGwyb2JqZWN0LT52aWRlb2RldiA9IGdfc3RyZHVwIChERUZBVUxUX1BST1BfREVWSUNFKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwycmFkaW9fZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0VjRsMlJhZGlvICpyYWRpbyA9IEdTVF9WNEwyUkFESU8gKG9iamVjdCk7CisgIGdzdF92NGwyX2Nsb3NlIChyYWRpby0+djRsMm9iamVjdCk7CisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJyYWRpb19maW5hbGl6ZSAoR3N0VjRsMlJhZGlvICogcmFkaW8pCit7CisgIGdzdF92NGwyX29iamVjdF9kZXN0cm95IChyYWRpby0+djRsMm9iamVjdCk7CisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAoKEdPYmplY3QgKikgKHJhZGlvKSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJyYWRpb19vcGVuIChHc3RWNGwyUmFkaW8gKiByYWRpbykKK3sKKyAgR3N0VjRsMk9iamVjdCAqdjRsMm9iamVjdDsKKworICB2NGwyb2JqZWN0ID0gcmFkaW8tPnY0bDJvYmplY3Q7CisgIGlmIChnc3RfdjRsMl9vcGVuICh2NGwyb2JqZWN0KSkKKyAgICByZXR1cm4gZ3N0X3Y0bDJyYWRpb19maWxsX2NoYW5uZWxfbGlzdCAocmFkaW8pOworICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJyYWRpb19zZXRfZGVmYXVsdHMgKEdzdFY0bDJSYWRpbyAqIHJhZGlvKQoreworICBHc3RWNGwyT2JqZWN0ICp2NGwyb2JqZWN0OworICBHc3RUdW5lckNoYW5uZWwgKmNoYW5uZWwgPSBOVUxMOworICBHc3RUdW5lciAqdHVuZXI7CisKKyAgdjRsMm9iamVjdCA9IHJhZGlvLT52NGwyb2JqZWN0OworCisgIGlmICghR1NUX0lTX1RVTkVSICh2NGwyb2JqZWN0LT5lbGVtZW50KSkKKyAgICByZXR1cm47CisKKyAgdHVuZXIgPSBHU1RfVFVORVIgKHY0bDJvYmplY3QtPmVsZW1lbnQpOworCisgIGlmICh2NGwyb2JqZWN0LT5jaGFubmVsKQorICAgIGNoYW5uZWwgPSBnc3RfdHVuZXJfZmluZF9jaGFubmVsX2J5X25hbWUgKHR1bmVyLCB2NGwyb2JqZWN0LT5jaGFubmVsKTsKKyAgaWYgKGNoYW5uZWwpIHsKKyAgICBnc3RfdHVuZXJfc2V0X2NoYW5uZWwgKHR1bmVyLCBjaGFubmVsKTsKKyAgfSBlbHNlIHsKKyAgICBjaGFubmVsID0KKyAgICAgICAgR1NUX1RVTkVSX0NIQU5ORUwgKGdzdF90dW5lcl9nZXRfY2hhbm5lbCAoR1NUX1RVTkVSCisgICAgICAgICAgICAodjRsMm9iamVjdC0+ZWxlbWVudCkpKTsKKyAgICBpZiAoY2hhbm5lbCkgeworICAgICAgZ19mcmVlICh2NGwyb2JqZWN0LT5jaGFubmVsKTsKKyAgICAgIHY0bDJvYmplY3QtPmNoYW5uZWwgPSBnX3N0cmR1cCAoY2hhbm5lbC0+bGFiZWwpOworICAgICAgZ3N0X3R1bmVyX2NoYW5uZWxfY2hhbmdlZCAodHVuZXIsIGNoYW5uZWwpOworICAgIH0KKyAgfQorCisgIGlmIChjaGFubmVsCisgICAgICAmJiBHU1RfVFVORVJfQ0hBTk5FTF9IQVNfRkxBRyAoY2hhbm5lbCwgR1NUX1RVTkVSX0NIQU5ORUxfRlJFUVVFTkNZKSkgeworICAgIGlmICh2NGwyb2JqZWN0LT5mcmVxdWVuY3kgIT0gMCkgeworICAgICAgZ3N0X3R1bmVyX3NldF9mcmVxdWVuY3kgKHR1bmVyLCBjaGFubmVsLCB2NGwyb2JqZWN0LT5mcmVxdWVuY3kpOworICAgIH0gZWxzZSB7CisgICAgICB2NGwyb2JqZWN0LT5mcmVxdWVuY3kgPSBnc3RfdHVuZXJfZ2V0X2ZyZXF1ZW5jeSAodHVuZXIsIGNoYW5uZWwpOworICAgICAgaWYgKHY0bDJvYmplY3QtPmZyZXF1ZW5jeSA9PSAwKSB7CisgICAgICAgIC8qIGd1ZXNzICovCisgICAgICAgIGdzdF90dW5lcl9zZXRfZnJlcXVlbmN5ICh0dW5lciwgY2hhbm5lbCwgTUlOX0ZSRVFVRU5DWSk7CisgICAgICB9IGVsc2UgeworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwycmFkaW9fc3RhcnQgKEdzdFY0bDJSYWRpbyAqIHJhZGlvKQoreworICBpZiAoIWdzdF92NGwycmFkaW9fb3BlbiAocmFkaW8pKQorICAgIHJldHVybiBGQUxTRTsKKworICBnc3RfdjRsMnJhZGlvX3NldF9kZWZhdWx0cyAocmFkaW8pOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwycmFkaW9fc3RvcCAoR3N0VjRsMlJhZGlvICogcmFkaW8pCit7CisgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X2Nsb3NlIChyYWRpby0+djRsMm9iamVjdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF92NGwycmFkaW9fY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0VjRsMlJhZGlvICpyYWRpbzsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTOworCisgIHJhZGlvID0gR1NUX1Y0TDJSQURJTyAoZWxlbWVudCk7CisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOgorICAgICAgLypzdGFydCByYWRpbyAqLworICAgICAgaWYgKCFnc3RfdjRsMnJhZGlvX3N0YXJ0IChyYWRpbykpCisgICAgICAgIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUExBWUlORzoKKyAgICAgIC8qdW5tdXRlIHJhZGlvICovCisgICAgICBpZiAoIWdzdF92NGwycmFkaW9fc2V0X3VubXV0ZSAocmFkaW8pKQorICAgICAgICByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUExBWUlOR19UT19QQVVTRUQ6CisgICAgICAvKm11dGUgcmFkaW8gKi8KKyAgICAgIGlmICghZ3N0X3Y0bDJyYWRpb19zZXRfbXV0ZSAocmFkaW8pKQorICAgICAgICByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIC8qc3RvcCByYWRpbyAqLworICAgICAgaWYgKCFnc3RfdjRsMnJhZGlvX3N0b3AgKHJhZGlvKSkKKyAgICAgICAgcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwycmFkaW9fc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFY0bDJSYWRpbyAqcmFkaW8gPSBHU1RfVjRMMlJBRElPIChvYmplY3QpOworICBnaW50IGZyZXF1ZW5jeTsKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBBUkdfREVWSUNFOgorICAgICAgZ19mcmVlIChyYWRpby0+djRsMm9iamVjdC0+dmlkZW9kZXYpOworICAgICAgcmFkaW8tPnY0bDJvYmplY3QtPnZpZGVvZGV2ID0KKyAgICAgICAgICBnX3N0cmR1cCAoKGdjaGFyICopIGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0ZSRVFVRU5DWToKKyAgICAgIGZyZXF1ZW5jeSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgaWYgKGZyZXF1ZW5jeSA+PSBNSU5fRlJFUVVFTkNZICYmIGZyZXF1ZW5jeSA8PSBNQVhfRlJFUVVFTkNZKSB7CisgICAgICAgIHJhZGlvLT52NGwyb2JqZWN0LT5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7CisgICAgICAgIGdzdF92NGwyX3NldF9mcmVxdWVuY3kgKHJhZGlvLT52NGwyb2JqZWN0LCAwLAorICAgICAgICAgICAgcmFkaW8tPnY0bDJvYmplY3QtPmZyZXF1ZW5jeSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMnJhZGlvX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWNGwyUmFkaW8gKnJhZGlvID0gR1NUX1Y0TDJSQURJTyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIEFSR19ERVZJQ0U6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCByYWRpby0+djRsMm9iamVjdC0+dmlkZW9kZXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfRlJFUVVFTkNZOgorICAgICAgaWYgKGdzdF92NGwyX2dldF9mcmVxdWVuY3kgKHJhZGlvLT52NGwyb2JqZWN0LAorICAgICAgICAgICAgICAwLCAmKHJhZGlvLT52NGwyb2JqZWN0LT5mcmVxdWVuY3kpKSkKKyAgICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgcmFkaW8tPnY0bDJvYmplY3QtPmZyZXF1ZW5jeSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIEdzdFVSSUhhbmRsZXIgaW50ZXJmYWNlICovCitzdGF0aWMgR3N0VVJJVHlwZQorZ3N0X3Y0bDJyYWRpb191cmlfZ2V0X3R5cGUgKEdUeXBlIHR5cGUpCit7CisgIHJldHVybiBHU1RfVVJJX1NSQzsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyICpjb25zdCAqCitnc3RfdjRsMnJhZGlvX3VyaV9nZXRfcHJvdG9jb2xzIChHVHlwZSB0eXBlKQoreworICBzdGF0aWMgY29uc3QgZ2NoYXIgKnByb3RvY29sc1tdID0geyAicmFkaW8iLCBOVUxMIH07CisKKyAgcmV0dXJuIHByb3RvY29sczsKK30KKworc3RhdGljIGdjaGFyICoKK2dzdF92NGwycmFkaW9fdXJpX2dldF91cmkgKEdzdFVSSUhhbmRsZXIgKiBoYW5kbGVyKQoreworICBHc3RWNGwyUmFkaW8gKnJhZGlvID0gR1NUX1Y0TDJSQURJTyAoaGFuZGxlcik7CisKKyAgaWYgKHJhZGlvLT52NGwyb2JqZWN0LT52aWRlb2RldiAhPSBOVUxMKSB7CisgICAgaWYgKGdzdF92NGwyX2dldF9mcmVxdWVuY3kgKHJhZGlvLT52NGwyb2JqZWN0LAorICAgICAgICAgICAgMCwgJihyYWRpby0+djRsMm9iamVjdC0+ZnJlcXVlbmN5KSkpIHsKKyAgICAgIHJldHVybiBnX3N0cmR1cF9wcmludGYgKCJyYWRpbzovLyU0LjFmIiwKKyAgICAgICAgICByYWRpby0+djRsMm9iamVjdC0+ZnJlcXVlbmN5IC8gMWU2KTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZ19zdHJkdXAgKCJyYWRpbzovLyIpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwycmFkaW9fdXJpX3NldF91cmkgKEdzdFVSSUhhbmRsZXIgKiBoYW5kbGVyLCBjb25zdCBnY2hhciAqIHVyaSwKKyAgICBHRXJyb3IgKiogZXJyb3IpCit7CisgIEdzdFY0bDJSYWRpbyAqcmFkaW8gPSBHU1RfVjRMMlJBRElPIChoYW5kbGVyKTsKKyAgZ2RvdWJsZSBkZnJlcTsKKyAgZ2ludCBpZnJlcTsKKyAgY29uc3QgZ2NoYXIgKmZyZXE7CisgIGdjaGFyICplbmQ7CisKKyAgaWYgKHN0cmNtcCAodXJpLCAicmFkaW86Ly8iKSAhPSAwKSB7CisgICAgZnJlcSA9IHVyaSArIDg7CisKKyAgICBkZnJlcSA9IGdfYXNjaWlfc3RydG9kIChmcmVxLCAmZW5kKTsKKworICAgIGlmIChlcnJubyB8fCBzdHJsZW4gKGVuZCkpCisgICAgICBnb3RvIHVyaV9mYWlsZWQ7CisKKyAgICBpZnJlcSA9IGRmcmVxICogMWU2OworICAgIGdfb2JqZWN0X3NldCAocmFkaW8sICJmcmVxdWVuY3kiLCBpZnJlcSwgTlVMTCk7CisKKyAgfSBlbHNlCisgICAgZ290byB1cmlfZmFpbGVkOworCisgIHJldHVybiBUUlVFOworCit1cmlfZmFpbGVkOgorICBnX3NldF9lcnJvcl9saXRlcmFsIChlcnJvciwgR1NUX1VSSV9FUlJPUiwgR1NUX1VSSV9FUlJPUl9CQURfUkVGRVJFTkNFLAorICAgICAgIkJhZCByYWRpbyBVUkksIGNvdWxkIG5vdCBwYXJzZSBmcmVxdWVuY3kiKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJyYWRpb191cmlfaGFuZGxlcl9pbml0IChncG9pbnRlciBnX2lmYWNlLCBncG9pbnRlciBpZmFjZV9kYXRhKQoreworICBHc3RVUklIYW5kbGVySW50ZXJmYWNlICppZmFjZSA9IChHc3RVUklIYW5kbGVySW50ZXJmYWNlICopIGdfaWZhY2U7CisKKyAgaWZhY2UtPmdldF90eXBlID0gZ3N0X3Y0bDJyYWRpb191cmlfZ2V0X3R5cGU7CisgIGlmYWNlLT5nZXRfcHJvdG9jb2xzID0gZ3N0X3Y0bDJyYWRpb191cmlfZ2V0X3Byb3RvY29sczsKKyAgaWZhY2UtPmdldF91cmkgPSBnc3RfdjRsMnJhZGlvX3VyaV9nZXRfdXJpOworICBpZmFjZS0+c2V0X3VyaSA9IGdzdF92NGwycmFkaW9fdXJpX3NldF91cmk7Cit9CmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwycmFkaW8uaCBiL3N5cy92NGwyL2dzdHY0bDJyYWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZGE0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwycmFkaW8uaApAQCAtMCwwICsxLDY3IEBACisvKiBHU3RyZWFtZXIgdjRsMiByYWRpbyB0dW5lciBlbGVtZW50CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEgQWxleGV5IENoZXJub3YgPDRlcm5vdkBnbWFpbC5jb20+CisgKgorICogZ3N0djRsMnJhZGlvLmggLSBWNEwyIHJhZGlvIHR1bmVyIGVsZW1lbnQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1Y0TDJSQURJT19IX18KKyNkZWZpbmUgX19HU1RfVjRMMlJBRElPX0hfXworCisjaW5jbHVkZSAiZ3N0djRsMm9iamVjdC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfVjRMMlJBRElPIFwKKyAgKGdzdF92NGwycmFkaW9fZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1Y0TDJSQURJTyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1Y0TDJSQURJTyxHc3RWNGwyUmFkaW8pKQorI2RlZmluZSBHU1RfVjRMMlJBRElPX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1Y0TDJSQURJTyxHc3RWNGwyUmFkaW9DbGFzcykpCisjZGVmaW5lIEdTVF9JU19WNEwyUkFESU8ob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WNEwyUkFESU8pKQorI2RlZmluZSBHU1RfSVNfVjRMMlJBRElPX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1Y0TDJSQURJTykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyUmFkaW8gICAgICBHc3RWNGwyUmFkaW87Cit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMlJhZGlvQ2xhc3MgR3N0VjRsMlJhZGlvQ2xhc3M7CisKKy8qKgorICogR3N0VjRsMlJhZGlvOgorICoKKyAqIE9wYXF1ZSB2aWRlbzRsaW51eDIgcmFkaW8gdHVuZXIgZWxlbWVudAorICovCitzdHJ1Y3QgX0dzdFY0bDJSYWRpbworeworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgLyo8IHByaXZhdGUgPiovCisgIEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0OworfTsKKworc3RydWN0IF9Hc3RWNGwyUmFkaW9DbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworCisgIEdMaXN0ICp2NGwyX2NsYXNzX2RldmljZXM7Cit9OworCitHVHlwZSBnc3RfdjRsMnJhZGlvX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1Y0TDJSQURJT19IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJzaW5rLmMgYi9zeXMvdjRsMi9nc3R2NGwyc2luay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MzkyMTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwyc2luay5jCkBAIC0wLDAgKzEsNjQ2IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGV4YXMgSW5zdHJ1bWVudHMsIEluYyAtIGh0dHA6Ly93d3cudGkuY29tLworICoKKyAqIERlc2NyaXB0aW9uOiBWNEwyIHNpbmsgZWxlbWVudAorICogIENyZWF0ZWQgb246IEp1bCAyLCAyMDA5CisgKiAgICAgIEF1dGhvcjogUm9iIENsYXJrIDxyb2JAdGkuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXY0bDJzaW5rCisgKgorICogdjRsMnNpbmsgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSB2aWRlbyB0byB2NGwyIGRldmljZXMgKHNjcmVlbiBvdmVybGF5cworICogcHJvdmlkZWQgYnkgdGhlIGdyYXBoaWNzIGhhcmR3YXJlLCB0di1vdXQsIGV0YykKKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHZpZGVvdGVzdHNyYyAhIHY0bDJzaW5rIGRldmljZT0vZGV2L3ZpZGVvMQorICogXXwgVGhpcyBwaXBlbGluZSBkaXNwbGF5cyBhIHRlc3QgcGF0dGVybiBvbiAvZGV2L3ZpZGVvMQorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyAhIG5hdmlnYXRpb250ZXN0ICEgdjRsMnNpbmsKKyAqIF18IEEgcGlwZWxpbmUgdG8gdGVzdCBuYXZpZ2F0aW9uIGV2ZW50cy4KKyAqIFdoaWxlIG1vdmluZyB0aGUgbW91c2UgcG9pbnRlciBvdmVyIHRoZSB0ZXN0IHNpZ25hbCB5b3Ugd2lsbCBzZWUgYSBibGFjayBib3gKKyAqIGZvbGxvd2luZyB0aGUgbW91c2UgcG9pbnRlci4gSWYgeW91IHByZXNzIHRoZSBtb3VzZSBidXR0b24gc29tZXdoZXJlIG9uIHRoZQorICogdmlkZW8gYW5kIHJlbGVhc2UgaXQgc29tZXdoZXJlIGVsc2UgYSBncmVlbiBib3ggd2lsbCBhcHBlYXIgd2hlcmUgeW91IHByZXNzZWQKKyAqIHRoZSBidXR0b24gYW5kIGEgcmVkIG9uZSB3aGVyZSB5b3UgcmVsZWFzZWQgaXQuIChUaGUgbmF2aWdhdGlvbnRlc3QgZWxlbWVudAorICogaXMgcGFydCBvZiBnc3QtcGx1Z2lucy1nb29kLikgWW91IGNhbiBvYnNlcnZlIGhlcmUgdGhhdCBldmVuIGlmIHRoZSBpbWFnZXMKKyAqIGFyZSBzY2FsZWQgdGhyb3VnaCBoYXJkd2FyZSB0aGUgcG9pbnRlciBjb29yZGluYXRlcyBhcmUgY29udmVydGVkIGJhY2sgdG8gdGhlCisgKiBvcmlnaW5hbCB2aWRlbyBmcmFtZSBnZW9tZXRyeSBzbyB0aGF0IHRoZSBib3ggY2FuIGJlIGRyYXduIHRvIHRoZSBjb3JyZWN0CisgKiBwb3NpdGlvbi4gVGhpcyBhbHNvIGhhbmRsZXMgYm9yZGVycyBjb3JyZWN0bHksIGxpbWl0aW5nIGNvb3JkaW5hdGVzIHRvIHRoZQorICogaW1hZ2UgYXJlYQorICogPC9yZWZzZWN0Mj4KKyAqLworCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImdzdC92aWRlby9nc3R2aWRlb21ldGEuaCIKKworI2luY2x1ZGUgImdzdHY0bDJjb2xvcmJhbGFuY2UuaCIKKyNpbmNsdWRlICJnc3R2NGwydHVuZXIuaCIKKyNpbmNsdWRlICJnc3R2NGwydmlkb3JpZW50LmgiCisKKyNpbmNsdWRlICJnc3R2NGwyc2luay5oIgorI2luY2x1ZGUgImdzdC9nc3QtaTE4bi1wbHVnaW4uaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitHU1RfREVCVUdfQ0FURUdPUlkgKHY0bDJzaW5rX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHY0bDJzaW5rX2RlYnVnCisKKyNkZWZpbmUgREVGQVVMVF9QUk9QX0RFVklDRSAgICIvZGV2L3ZpZGVvMSIKKworZW51bQoreworICBQUk9QXzAsCisgIFY0TDJfU1REX09CSkVDVF9QUk9QUywKKyAgUFJPUF9PVkVSTEFZX1RPUCwKKyAgUFJPUF9PVkVSTEFZX0xFRlQsCisgIFBST1BfT1ZFUkxBWV9XSURUSCwKKyAgUFJPUF9PVkVSTEFZX0hFSUdIVCwKKyAgUFJPUF9DUk9QX1RPUCwKKyAgUFJPUF9DUk9QX0xFRlQsCisgIFBST1BfQ1JPUF9XSURUSCwKKyAgUFJPUF9DUk9QX0hFSUdIVCwKK307CisKKworR1NUX0lNUExFTUVOVF9WNEwyX0NPTE9SX0JBTEFOQ0VfTUVUSE9EUyAoR3N0VjRsMlNpbmssIGdzdF92NGwyc2luayk7CitHU1RfSU1QTEVNRU5UX1Y0TDJfVFVORVJfTUVUSE9EUyAoR3N0VjRsMlNpbmssIGdzdF92NGwyc2luayk7CitHU1RfSU1QTEVNRU5UX1Y0TDJfVklET1JJRU5UX01FVEhPRFMgKEdzdFY0bDJTaW5rLCBnc3RfdjRsMnNpbmspOworCisjZGVmaW5lIGdzdF92NGwyc2lua19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoR3N0VjRsMlNpbmssIGdzdF92NGwyc2luaywgR1NUX1RZUEVfVklERU9fU0lOSywKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1RVTkVSLCBnc3RfdjRsMnNpbmtfdHVuZXJfaW50ZXJmYWNlX2luaXQpOworICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfQ09MT1JfQkFMQU5DRSwKKyAgICAgICAgZ3N0X3Y0bDJzaW5rX2NvbG9yX2JhbGFuY2VfaW50ZXJmYWNlX2luaXQpOworICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfVklERU9fT1JJRU5UQVRJT04sCisgICAgICAgIGdzdF92NGwyc2lua192aWRlb19vcmllbnRhdGlvbl9pbnRlcmZhY2VfaW5pdCkpOworCisKK3N0YXRpYyB2b2lkIGdzdF92NGwyc2lua19maW5hbGl6ZSAoR3N0VjRsMlNpbmsgKiB2NGwyc2luayk7CisKKy8qIEdPYmplY3QgbWV0aG9kczogKi8KK3N0YXRpYyB2b2lkIGdzdF92NGwyc2lua19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfdjRsMnNpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCisvKiBHc3RFbGVtZW50IG1ldGhvZHM6ICovCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3Y0bDJzaW5rX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKKy8qIEdzdEJhc2VTaW5rIG1ldGhvZHM6ICovCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3Y0bDJzaW5rX3Byb3Bvc2VfYWxsb2NhdGlvbiAoR3N0QmFzZVNpbmsgKiBic2luaywKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfdjRsMnNpbmtfZ2V0X2NhcHMgKEdzdEJhc2VTaW5rICogYnNpbmssIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIGdib29sZWFuIGdzdF92NGwyc2lua19zZXRfY2FwcyAoR3N0QmFzZVNpbmsgKiBic2luaywgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3Y0bDJzaW5rX3Nob3dfZnJhbWUgKEdzdFZpZGVvU2luayAqIGJzaW5rLAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3Y0bDJzaW5rX3VubG9jayAoR3N0QmFzZVNpbmsgKiBzaW5rKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdjRsMnNpbmtfdW5sb2NrX3N0b3AgKEdzdEJhc2VTaW5rICogc2luayk7CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMnNpbmtfY2xhc3NfaW5pdCAoR3N0VjRsMlNpbmtDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKyAgR3N0QmFzZVNpbmtDbGFzcyAqYmFzZXNpbmtfY2xhc3M7CisgIEdzdFZpZGVvU2lua0NsYXNzICp2aWRlb3NpbmtfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBiYXNlc2lua19jbGFzcyA9IEdTVF9CQVNFX1NJTktfQ0xBU1MgKGtsYXNzKTsKKyAgdmlkZW9zaW5rX2NsYXNzID0gR1NUX1ZJREVPX1NJTktfQ0xBU1MgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IChHT2JqZWN0RmluYWxpemVGdW5jKSBnc3RfdjRsMnNpbmtfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF92NGwyc2lua19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF92NGwyc2lua19nZXRfcHJvcGVydHk7CisKKyAgZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3Y0bDJzaW5rX2NoYW5nZV9zdGF0ZTsKKworICBnc3RfdjRsMl9vYmplY3RfaW5zdGFsbF9wcm9wZXJ0aWVzX2hlbHBlciAoZ29iamVjdF9jbGFzcywKKyAgICAgIERFRkFVTFRfUFJPUF9ERVZJQ0UpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfT1ZFUkxBWV9UT1AsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgib3ZlcmxheS10b3AiLCAiT3ZlcmxheSB0b3AiLAorICAgICAgICAgICJUaGUgdG9wbW9zdCAoeSkgY29vcmRpbmF0ZSBvZiB0aGUgdmlkZW8gb3ZlcmxheTsgdG9wIGxlZnQgY29ybmVyIG9mIHNjcmVlbiBpcyAwLDAiLAorICAgICAgICAgIEdfTUlOSU5ULCBHX01BWElOVCwgMCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfT1ZFUkxBWV9MRUZULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoIm92ZXJsYXktbGVmdCIsICJPdmVybGF5IGxlZnQiLAorICAgICAgICAgICJUaGUgbGVmdG1vc3QgKHgpIGNvb3JkaW5hdGUgb2YgdGhlIHZpZGVvIG92ZXJsYXk7IHRvcCBsZWZ0IGNvcm5lciBvZiBzY3JlZW4gaXMgMCwwIiwKKyAgICAgICAgICBHX01JTklOVCwgR19NQVhJTlQsIDAsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX09WRVJMQVlfV0lEVEgsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm92ZXJsYXktd2lkdGgiLCAiT3ZlcmxheSB3aWR0aCIsCisgICAgICAgICAgIlRoZSB3aWR0aCBvZiB0aGUgdmlkZW8gb3ZlcmxheTsgZGVmYXVsdCBpcyBlcXVhbCB0byBuZWdvdGlhdGVkIGltYWdlIHdpZHRoIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIDAsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX09WRVJMQVlfSEVJR0hULAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJvdmVybGF5LWhlaWdodCIsICJPdmVybGF5IGhlaWdodCIsCisgICAgICAgICAgIlRoZSBoZWlnaHQgb2YgdGhlIHZpZGVvIG92ZXJsYXk7IGRlZmF1bHQgaXMgZXF1YWwgdG8gbmVnb3RpYXRlZCBpbWFnZSBoZWlnaHQiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVCwgMCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DUk9QX1RPUCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJjcm9wLXRvcCIsICJDcm9wIHRvcCIsCisgICAgICAgICAgIlRoZSB0b3Btb3N0ICh5KSBjb29yZGluYXRlIG9mIHRoZSB2aWRlbyBjcm9wOyB0b3AgbGVmdCBjb3JuZXIgb2YgaW1hZ2UgaXMgMCwwIiwKKyAgICAgICAgICAweDgwMDAwMDAwLCAweDdmZmZmZmZmLCAwLCBHX1BBUkFNX1JFQURXUklURSkpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NST1BfTEVGVCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJjcm9wLWxlZnQiLCAiQ3JvcCBsZWZ0IiwKKyAgICAgICAgICAiVGhlIGxlZnRtb3N0ICh4KSBjb29yZGluYXRlIG9mIHRoZSB2aWRlbyBjcm9wOyB0b3AgbGVmdCBjb3JuZXIgb2YgaW1hZ2UgaXMgMCwwIiwKKyAgICAgICAgICAweDgwMDAwMDAwLCAweDdmZmZmZmZmLCAwLCBHX1BBUkFNX1JFQURXUklURSkpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NST1BfV0lEVEgsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoImNyb3Atd2lkdGgiLCAiQ3JvcCB3aWR0aCIsCisgICAgICAgICAgIlRoZSB3aWR0aCBvZiB0aGUgdmlkZW8gY3JvcDsgZGVmYXVsdCBpcyBlcXVhbCB0byBuZWdvdGlhdGVkIGltYWdlIHdpZHRoIiwKKyAgICAgICAgICAwLCAweGZmZmZmZmZmLCAwLCBHX1BBUkFNX1JFQURXUklURSkpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NST1BfSEVJR0hULAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJjcm9wLWhlaWdodCIsICJDcm9wIGhlaWdodCIsCisgICAgICAgICAgIlRoZSBoZWlnaHQgb2YgdGhlIHZpZGVvIGNyb3A7IGRlZmF1bHQgaXMgZXF1YWwgdG8gbmVnb3RpYXRlZCBpbWFnZSBoZWlnaHQiLAorICAgICAgICAgIDAsIDB4ZmZmZmZmZmYsIDAsIEdfUEFSQU1fUkVBRFdSSVRFKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywKKyAgICAgICJWaWRlbyAodmlkZW80bGludXgyKSBTaW5rIiwgIlNpbmsvVmlkZW8iLAorICAgICAgIkRpc3BsYXlzIGZyYW1lcyBvbiBhIHZpZGVvNGxpbnV4MiBkZXZpY2UiLCAiUm9iIENsYXJrIDxyb2JAdGkuY29tPiwiKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgZ3N0X3BhZF90ZW1wbGF0ZV9uZXcgKCJzaW5rIiwgR1NUX1BBRF9TSU5LLCBHU1RfUEFEX0FMV0FZUywKKyAgICAgICAgICBnc3RfdjRsMl9vYmplY3RfZ2V0X2FsbF9jYXBzICgpKSk7CisKKyAgYmFzZXNpbmtfY2xhc3MtPmdldF9jYXBzID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyc2lua19nZXRfY2Fwcyk7CisgIGJhc2VzaW5rX2NsYXNzLT5zZXRfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMnNpbmtfc2V0X2NhcHMpOworICBiYXNlc2lua19jbGFzcy0+cHJvcG9zZV9hbGxvY2F0aW9uID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMnNpbmtfcHJvcG9zZV9hbGxvY2F0aW9uKTsKKyAgYmFzZXNpbmtfY2xhc3MtPnVubG9jayA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMnNpbmtfdW5sb2NrKTsKKyAgYmFzZXNpbmtfY2xhc3MtPnVubG9ja19zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyc2lua191bmxvY2tfc3RvcCk7CisKKyAgdmlkZW9zaW5rX2NsYXNzLT5zaG93X2ZyYW1lID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyc2lua19zaG93X2ZyYW1lKTsKKworICBrbGFzcy0+djRsMl9jbGFzc19kZXZpY2VzID0gTlVMTDsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAodjRsMnNpbmtfZGVidWcsICJ2NGwyc2luayIsIDAsICJWNEwyIHNpbmsgZWxlbWVudCIpOworCit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMnNpbmtfaW5pdCAoR3N0VjRsMlNpbmsgKiB2NGwyc2luaykKK3sKKyAgdjRsMnNpbmstPnY0bDJvYmplY3QgPSBnc3RfdjRsMl9vYmplY3RfbmV3IChHU1RfRUxFTUVOVCAodjRsMnNpbmspLAorICAgICAgR1NUX09CSkVDVCAoR1NUX0JBU0VfU0lOS19QQUQgKHY0bDJzaW5rKSksIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVULAorICAgICAgREVGQVVMVF9QUk9QX0RFVklDRSwgZ3N0X3Y0bDJfZ2V0X291dHB1dCwgZ3N0X3Y0bDJfc2V0X291dHB1dCwgTlVMTCk7CisKKyAgLyogc2FtZSBkZWZhdWx0IHZhbHVlIGZvciB2aWRlbyBvdXRwdXQgZGV2aWNlIGFzIGlzIHVzZWQgZm9yCisgICAqIHY0bDJzcmMvY2FwdHVyZSBpcyBubyBnb29kLi4gIHNvIGxldHMgc2V0IGEgc2FuZXIgZGVmYXVsdAorICAgKiAod2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIG9uZSBjcmVhdGluZyB0aGUgdjRsMnNpbmsKKyAgICogYWZ0ZXIgdGhlIGNvbnN0cnVjdG9yIHJldHVybnMpCisgICAqLworICBnX29iamVjdF9zZXQgKHY0bDJzaW5rLCAiZGV2aWNlIiwgIi9kZXYvdmlkZW8xIiwgTlVMTCk7CisKKyAgdjRsMnNpbmstPm92ZXJsYXlfZmllbGRzX3NldCA9IDA7CisgIHY0bDJzaW5rLT5jcm9wX2ZpZWxkc19zZXQgPSAwOworfQorCisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMnNpbmtfZmluYWxpemUgKEdzdFY0bDJTaW5rICogdjRsMnNpbmspCit7CisgIGdzdF92NGwyX29iamVjdF9kZXN0cm95ICh2NGwyc2luay0+djRsMm9iamVjdCk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplICgoR09iamVjdCAqKSAodjRsMnNpbmspKTsKK30KKworCisvKgorICogZmxhZ3MgdG8gaW5kaWNhdGUgd2hpY2ggb3ZlcmxheS9jcm9wIHByb3BlcnRpZXMgdGhlIHVzZXIgaGFzIHNldCAoYW5kCisgKiB0aGVyZWZvcmUgd2hpY2ggb25lcyBzaG91bGQgb3ZlcnJpZGUgdGhlIGRlZmF1bHRzIGZyb20gdGhlIGRyaXZlcikKKyAqLworZW51bQoreworICBSRUNUX1RPUF9TRVQgPSAweDAxLAorICBSRUNUX0xFRlRfU0VUID0gMHgwMiwKKyAgUkVDVF9XSURUSF9TRVQgPSAweDA0LAorICBSRUNUX0hFSUdIVF9TRVQgPSAweDA4Cit9OworCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJzaW5rX3N5bmNfb3ZlcmxheV9maWVsZHMgKEdzdFY0bDJTaW5rICogdjRsMnNpbmspCit7CisgIGlmICghdjRsMnNpbmstPm92ZXJsYXlfZmllbGRzX3NldCkKKyAgICByZXR1cm47CisKKyAgaWYgKEdTVF9WNEwyX0lTX09QRU4gKHY0bDJzaW5rLT52NGwyb2JqZWN0KSkgeworCisgICAgR3N0VjRsMk9iamVjdCAqb2JqID0gdjRsMnNpbmstPnY0bDJvYmplY3Q7CisgICAgc3RydWN0IHY0bDJfZm9ybWF0IGZvcm1hdDsKKworICAgIG1lbXNldCAoJmZvcm1hdCwgMHgwMCwgc2l6ZW9mIChzdHJ1Y3QgdjRsMl9mb3JtYXQpKTsKKyAgICBpZiAob2JqLT5kZXZpY2VfY2FwcyAmIFY0TDJfQ0FQX1ZJREVPX09VVFBVVF9PVkVSTEFZKQorICAgICAgZm9ybWF0LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9PVkVSTEFZOworICAgIGVsc2UKKyAgICAgIGZvcm1hdC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOworCisgICAgaWYgKG9iai0+aW9jdGwgKG9iai0+dmlkZW9fZmQsIFZJRElPQ19HX0ZNVCwgJmZvcm1hdCkgPCAwKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJzaW5rLCAiVklESU9DX0dfRk1UIGZhaWxlZCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJzaW5rLAorICAgICAgICAic2V0dGluZyBvdmVybGF5OiBvdmVybGF5X2ZpZWxkc19zZXQ9MHglMDJ4LCB0b3A9JWQsIGxlZnQ9JWQsIHdpZHRoPSVkLCBoZWlnaHQ9JWQiLAorICAgICAgICB2NGwyc2luay0+b3ZlcmxheV9maWVsZHNfc2V0LAorICAgICAgICB2NGwyc2luay0+b3ZlcmxheS50b3AsIHY0bDJzaW5rLT5vdmVybGF5LmxlZnQsCisgICAgICAgIHY0bDJzaW5rLT5vdmVybGF5LndpZHRoLCB2NGwyc2luay0+b3ZlcmxheS5oZWlnaHQpOworCisgICAgaWYgKHY0bDJzaW5rLT5vdmVybGF5X2ZpZWxkc19zZXQgJiBSRUNUX1RPUF9TRVQpCisgICAgICBmb3JtYXQuZm10Lndpbi53LnRvcCA9IHY0bDJzaW5rLT5vdmVybGF5LnRvcDsKKyAgICBpZiAodjRsMnNpbmstPm92ZXJsYXlfZmllbGRzX3NldCAmIFJFQ1RfTEVGVF9TRVQpCisgICAgICBmb3JtYXQuZm10Lndpbi53LmxlZnQgPSB2NGwyc2luay0+b3ZlcmxheS5sZWZ0OworICAgIGlmICh2NGwyc2luay0+b3ZlcmxheV9maWVsZHNfc2V0ICYgUkVDVF9XSURUSF9TRVQpCisgICAgICBmb3JtYXQuZm10Lndpbi53LndpZHRoID0gdjRsMnNpbmstPm92ZXJsYXkud2lkdGg7CisgICAgaWYgKHY0bDJzaW5rLT5vdmVybGF5X2ZpZWxkc19zZXQgJiBSRUNUX0hFSUdIVF9TRVQpCisgICAgICBmb3JtYXQuZm10Lndpbi53LmhlaWdodCA9IHY0bDJzaW5rLT5vdmVybGF5LmhlaWdodDsKKworICAgIGlmIChvYmotPmlvY3RsIChvYmotPnZpZGVvX2ZkLCBWSURJT0NfU19GTVQsICZmb3JtYXQpIDwgMCkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyc2luaywgIlZJRElPQ19TX0ZNVCBmYWlsZWQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2NGwyc2luay0+b3ZlcmxheV9maWVsZHNfc2V0ID0gMDsKKyAgICB2NGwyc2luay0+b3ZlcmxheSA9IGZvcm1hdC5mbXQud2luLnc7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyc2lua19zeW5jX2Nyb3BfZmllbGRzIChHc3RWNGwyU2luayAqIHY0bDJzaW5rKQoreworICBpZiAoIXY0bDJzaW5rLT5jcm9wX2ZpZWxkc19zZXQpCisgICAgcmV0dXJuOworCisgIGlmIChHU1RfVjRMMl9JU19PUEVOICh2NGwyc2luay0+djRsMm9iamVjdCkpIHsKKworICAgIEdzdFY0bDJPYmplY3QgKm9iaiA9IHY0bDJzaW5rLT52NGwyb2JqZWN0OworICAgIHN0cnVjdCB2NGwyX2Nyb3AgY3JvcDsKKworICAgIG1lbXNldCAoJmNyb3AsIDB4MDAsIHNpemVvZiAoc3RydWN0IHY0bDJfY3JvcCkpOworICAgIGNyb3AudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOworCisgICAgaWYgKG9iai0+aW9jdGwgKG9iai0+dmlkZW9fZmQsIFZJRElPQ19HX0NST1AsICZjcm9wKSA8IDApIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMnNpbmssICJWSURJT0NfR19DUk9QIGZhaWxlZCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJzaW5rLAorICAgICAgICAic2V0dGluZyBjcm9wOiBjcm9wX2ZpZWxkc19zZXQ9MHglMDJ4LCB0b3A9JWQsIGxlZnQ9JWQsIHdpZHRoPSVkLCBoZWlnaHQ9JWQiLAorICAgICAgICB2NGwyc2luay0+Y3JvcF9maWVsZHNfc2V0LAorICAgICAgICB2NGwyc2luay0+Y3JvcC50b3AsIHY0bDJzaW5rLT5jcm9wLmxlZnQsCisgICAgICAgIHY0bDJzaW5rLT5jcm9wLndpZHRoLCB2NGwyc2luay0+Y3JvcC5oZWlnaHQpOworCisgICAgaWYgKHY0bDJzaW5rLT5jcm9wX2ZpZWxkc19zZXQgJiBSRUNUX1RPUF9TRVQpCisgICAgICBjcm9wLmMudG9wID0gdjRsMnNpbmstPmNyb3AudG9wOworICAgIGlmICh2NGwyc2luay0+Y3JvcF9maWVsZHNfc2V0ICYgUkVDVF9MRUZUX1NFVCkKKyAgICAgIGNyb3AuYy5sZWZ0ID0gdjRsMnNpbmstPmNyb3AubGVmdDsKKyAgICBpZiAodjRsMnNpbmstPmNyb3BfZmllbGRzX3NldCAmIFJFQ1RfV0lEVEhfU0VUKQorICAgICAgY3JvcC5jLndpZHRoID0gdjRsMnNpbmstPmNyb3Aud2lkdGg7CisgICAgaWYgKHY0bDJzaW5rLT5jcm9wX2ZpZWxkc19zZXQgJiBSRUNUX0hFSUdIVF9TRVQpCisgICAgICBjcm9wLmMuaGVpZ2h0ID0gdjRsMnNpbmstPmNyb3AuaGVpZ2h0OworCisgICAgaWYgKG9iai0+aW9jdGwgKG9iai0+dmlkZW9fZmQsIFZJRElPQ19TX0NST1AsICZjcm9wKSA8IDApIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMnNpbmssICJWSURJT0NfU19DUk9QIGZhaWxlZCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChvYmotPmlvY3RsIChvYmotPnZpZGVvX2ZkLCBWSURJT0NfR19DUk9QLCAmY3JvcCkgPCAwKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJzaW5rLCAiVklESU9DX0dfQ1JPUCBmYWlsZWQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2NGwyc2luay0+Y3JvcF9maWVsZHNfc2V0ID0gMDsKKyAgICB2NGwyc2luay0+Y3JvcCA9IGNyb3AuYzsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMnNpbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFY0bDJTaW5rICp2NGwyc2luayA9IEdTVF9WNEwyU0lOSyAob2JqZWN0KTsKKworICBpZiAoIWdzdF92NGwyX29iamVjdF9zZXRfcHJvcGVydHlfaGVscGVyICh2NGwyc2luay0+djRsMm9iamVjdCwKKyAgICAgICAgICBwcm9wX2lkLCB2YWx1ZSwgcHNwZWMpKSB7CisgICAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgICBjYXNlIFBST1BfT1ZFUkxBWV9UT1A6CisgICAgICAgIHY0bDJzaW5rLT5vdmVybGF5LnRvcCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgICB2NGwyc2luay0+b3ZlcmxheV9maWVsZHNfc2V0IHw9IFJFQ1RfVE9QX1NFVDsKKyAgICAgICAgZ3N0X3Y0bDJzaW5rX3N5bmNfb3ZlcmxheV9maWVsZHMgKHY0bDJzaW5rKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBST1BfT1ZFUkxBWV9MRUZUOgorICAgICAgICB2NGwyc2luay0+b3ZlcmxheS5sZWZ0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICAgIHY0bDJzaW5rLT5vdmVybGF5X2ZpZWxkc19zZXQgfD0gUkVDVF9MRUZUX1NFVDsKKyAgICAgICAgZ3N0X3Y0bDJzaW5rX3N5bmNfb3ZlcmxheV9maWVsZHMgKHY0bDJzaW5rKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBST1BfT1ZFUkxBWV9XSURUSDoKKyAgICAgICAgdjRsMnNpbmstPm92ZXJsYXkud2lkdGggPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICAgIHY0bDJzaW5rLT5vdmVybGF5X2ZpZWxkc19zZXQgfD0gUkVDVF9XSURUSF9TRVQ7CisgICAgICAgIGdzdF92NGwyc2lua19zeW5jX292ZXJsYXlfZmllbGRzICh2NGwyc2luayk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQUk9QX09WRVJMQVlfSEVJR0hUOgorICAgICAgICB2NGwyc2luay0+b3ZlcmxheS5oZWlnaHQgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICAgIHY0bDJzaW5rLT5vdmVybGF5X2ZpZWxkc19zZXQgfD0gUkVDVF9IRUlHSFRfU0VUOworICAgICAgICBnc3RfdjRsMnNpbmtfc3luY19vdmVybGF5X2ZpZWxkcyAodjRsMnNpbmspOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUFJPUF9DUk9QX1RPUDoKKyAgICAgICAgdjRsMnNpbmstPmNyb3AudG9wID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICAgIHY0bDJzaW5rLT5jcm9wX2ZpZWxkc19zZXQgfD0gUkVDVF9UT1BfU0VUOworICAgICAgICBnc3RfdjRsMnNpbmtfc3luY19jcm9wX2ZpZWxkcyAodjRsMnNpbmspOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUFJPUF9DUk9QX0xFRlQ6CisgICAgICAgIHY0bDJzaW5rLT5jcm9wLmxlZnQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgICAgdjRsMnNpbmstPmNyb3BfZmllbGRzX3NldCB8PSBSRUNUX0xFRlRfU0VUOworICAgICAgICBnc3RfdjRsMnNpbmtfc3luY19jcm9wX2ZpZWxkcyAodjRsMnNpbmspOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUFJPUF9DUk9QX1dJRFRIOgorICAgICAgICB2NGwyc2luay0+Y3JvcC53aWR0aCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgICAgdjRsMnNpbmstPmNyb3BfZmllbGRzX3NldCB8PSBSRUNUX1dJRFRIX1NFVDsKKyAgICAgICAgZ3N0X3Y0bDJzaW5rX3N5bmNfY3JvcF9maWVsZHMgKHY0bDJzaW5rKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBST1BfQ1JPUF9IRUlHSFQ6CisgICAgICAgIHY0bDJzaW5rLT5jcm9wLmhlaWdodCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgICAgdjRsMnNpbmstPmNyb3BfZmllbGRzX3NldCB8PSBSRUNUX0hFSUdIVF9TRVQ7CisgICAgICAgIGdzdF92NGwyc2lua19zeW5jX2Nyb3BfZmllbGRzICh2NGwyc2luayk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF92NGwyc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VjRsMlNpbmsgKnY0bDJzaW5rID0gR1NUX1Y0TDJTSU5LIChvYmplY3QpOworCisgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X2dldF9wcm9wZXJ0eV9oZWxwZXIgKHY0bDJzaW5rLT52NGwyb2JqZWN0LAorICAgICAgICAgIHByb3BfaWQsIHZhbHVlLCBwc3BlYykpIHsKKyAgICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICAgIGNhc2UgUFJPUF9PVkVSTEFZX1RPUDoKKyAgICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdjRsMnNpbmstPm92ZXJsYXkudG9wKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBST1BfT1ZFUkxBWV9MRUZUOgorICAgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB2NGwyc2luay0+b3ZlcmxheS5sZWZ0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBST1BfT1ZFUkxBWV9XSURUSDoKKyAgICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHY0bDJzaW5rLT5vdmVybGF5LndpZHRoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBST1BfT1ZFUkxBWV9IRUlHSFQ6CisgICAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCB2NGwyc2luay0+b3ZlcmxheS5oZWlnaHQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUFJPUF9DUk9QX1RPUDoKKyAgICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdjRsMnNpbmstPmNyb3AudG9wKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBST1BfQ1JPUF9MRUZUOgorICAgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB2NGwyc2luay0+Y3JvcC5sZWZ0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBST1BfQ1JPUF9XSURUSDoKKyAgICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHY0bDJzaW5rLT5jcm9wLndpZHRoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBST1BfQ1JPUF9IRUlHSFQ6CisgICAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCB2NGwyc2luay0+Y3JvcC5oZWlnaHQpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF92NGwyc2lua19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1M7CisgIEdzdFY0bDJTaW5rICp2NGwyc2luayA9IEdTVF9WNEwyU0lOSyAoZWxlbWVudCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMnNpbmssICIlZCAtPiAlZCIsCisgICAgICBHU1RfU1RBVEVfVFJBTlNJVElPTl9DVVJSRU5UICh0cmFuc2l0aW9uKSwKKyAgICAgIEdTVF9TVEFURV9UUkFOU0lUSU9OX05FWFQgKHRyYW5zaXRpb24pKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIC8qIG9wZW4gdGhlIGRldmljZSAqLworICAgICAgaWYgKCFnc3RfdjRsMl9vYmplY3Rfb3BlbiAodjRsMnNpbmstPnY0bDJvYmplY3QpKQorICAgICAgICByZXR1cm4gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X3N0b3AgKHY0bDJzaW5rLT52NGwyb2JqZWN0KSkKKyAgICAgICAgcmV0dXJuIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgLyogd2UgbmVlZCB0byBjYWxsIHN0b3AgaGVyZSB0b28gKi8KKyAgICAgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X3N0b3AgKHY0bDJzaW5rLT52NGwyb2JqZWN0KSkKKyAgICAgICAgcmV0dXJuIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRTsKKyAgICAgIC8qIGNsb3NlIHRoZSBkZXZpY2UgKi8KKyAgICAgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X2Nsb3NlICh2NGwyc2luay0+djRsMm9iamVjdCkpCisgICAgICAgIHJldHVybiBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF92NGwyc2lua19nZXRfY2FwcyAoR3N0QmFzZVNpbmsgKiBic2luaywgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0VjRsMlNpbmsgKnY0bDJzaW5rID0gR1NUX1Y0TDJTSU5LIChic2luayk7CisKKyAgaWYgKCFHU1RfVjRMMl9JU19PUEVOICh2NGwyc2luay0+djRsMm9iamVjdCkpIHsKKyAgICAvKiBGSVhNRTogY29weT8gKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyc2luaywgImRldmljZSBpcyBub3Qgb3BlbiIpOworICAgIHJldHVybiBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX0JBU0VfU0lOS19QQUQgKHY0bDJzaW5rKSk7CisgIH0KKworCisgIHJldHVybiBnc3RfdjRsMl9vYmplY3RfZ2V0X2NhcHMgKHY0bDJzaW5rLT52NGwyb2JqZWN0LCBmaWx0ZXIpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyc2lua19zZXRfY2FwcyAoR3N0QmFzZVNpbmsgKiBic2luaywgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFY0bDJFcnJvciBlcnJvciA9IEdTVF9WNEwyX0VSUk9SX0lOSVQ7CisgIEdzdFY0bDJTaW5rICp2NGwyc2luayA9IEdTVF9WNEwyU0lOSyAoYnNpbmspOworICBHc3RWNGwyT2JqZWN0ICpvYmogPSB2NGwyc2luay0+djRsMm9iamVjdDsKKworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyc2luaywgImNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICBpZiAoIUdTVF9WNEwyX0lTX09QRU4gKG9iaikpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyc2luaywgImRldmljZSBpcyBub3Qgb3BlbiIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIG1ha2Ugc3VyZSB0aGUgY2FwcyBjaGFuZ2VkIGJlZm9yZSBkb2luZyBhbnl0aGluZyAqLworICBpZiAoZ3N0X3Y0bDJfb2JqZWN0X2NhcHNfZXF1YWwgKG9iaiwgY2FwcykpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFnc3RfdjRsMl9vYmplY3Rfc3RvcCAob2JqKSkKKyAgICBnb3RvIHN0b3BfZmFpbGVkOworCisgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X3NldF9mb3JtYXQgKG9iaiwgY2FwcywgJmVycm9yKSkKKyAgICBnb3RvIGludmFsaWRfZm9ybWF0OworCisgIGdzdF92NGwyc2lua19zeW5jX292ZXJsYXlfZmllbGRzICh2NGwyc2luayk7CisgIGdzdF92NGwyc2lua19zeW5jX2Nyb3BfZmllbGRzICh2NGwyc2luayk7CisKKyAgR1NUX0lORk9fT0JKRUNUICh2NGwyc2luaywgIm91dHB1dHRpbmcgYnVmZmVycyB2aWEgbW9kZSAldSIsIG9iai0+bW9kZSk7CisKKyAgdjRsMnNpbmstPnZpZGVvX3dpZHRoID0gR1NUX1Y0TDJfV0lEVEggKG9iaik7CisgIHY0bDJzaW5rLT52aWRlb19oZWlnaHQgPSBHU1RfVjRMMl9IRUlHSFQgKG9iaik7CisKKyAgLyogVE9ETzogdmlkZW9zaW5rIHdpZHRoL2hlaWdodCBzaG91bGQgYmUgc2NhbGVkIGFjY29yZGluZyB0bworICAgKiBwaXhlbC1hc3BlY3QtcmF0aW8KKyAgICovCisgIEdTVF9WSURFT19TSU5LX1dJRFRIICh2NGwyc2luaykgPSB2NGwyc2luay0+dmlkZW9fd2lkdGg7CisgIEdTVF9WSURFT19TSU5LX0hFSUdIVCAodjRsMnNpbmspID0gdjRsMnNpbmstPnZpZGVvX2hlaWdodDsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK3N0b3BfZmFpbGVkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMnNpbmssICJmYWlsZWQgdG8gc3RvcCBzdHJlYW1pbmciKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfZm9ybWF0OgorICB7CisgICAgLyogZXJyb3IgYWxyZWFkeSBwb3N0ZWQgKi8KKyAgICBnc3RfdjRsMl9lcnJvciAodjRsMnNpbmssICZlcnJvcik7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMnNpbmssICJjYW4ndCBzZXQgZm9ybWF0Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJzaW5rX3Byb3Bvc2VfYWxsb2NhdGlvbiAoR3N0QmFzZVNpbmsgKiBic2luaywgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0VjRsMlNpbmsgKnY0bDJzaW5rID0gR1NUX1Y0TDJTSU5LIChic2luayk7CisgIGdib29sZWFuIGxhc3Rfc2FtcGxlX2VuYWJsZWQ7CisKKyAgaWYgKCFnc3RfdjRsMl9vYmplY3RfcHJvcG9zZV9hbGxvY2F0aW9uICh2NGwyc2luay0+djRsMm9iamVjdCwgcXVlcnkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBnX29iamVjdF9nZXQgKGJzaW5rLCAiZW5hYmxlLWxhc3Qtc2FtcGxlIiwgJmxhc3Rfc2FtcGxlX2VuYWJsZWQsIE5VTEwpOworCisgIGlmIChsYXN0X3NhbXBsZV9lbmFibGVkKSB7CisgICAgR3N0QnVmZmVyUG9vbCAqcG9vbDsKKyAgICBndWludCBzaXplLCBtaW4sIG1heDsKKworICAgIGdzdF9xdWVyeV9wYXJzZV9udGhfYWxsb2NhdGlvbl9wb29sIChxdWVyeSwgMCwgJnBvb2wsICZzaXplLCAmbWluLCAmbWF4KTsKKworICAgIC8qIHdlIG5lZWQgMSBtb3JlLCBvdGhlcndpc2Ugd2UnbGwgcnVuIG91dCBvZiBidWZmZXJzIGF0IHByZXJvbGwgKi8KKyAgICBtaW4rKzsKKyAgICBpZiAobWF4IDwgbWluKQorICAgICAgbWF4ID0gbWluOworCisgICAgZ3N0X3F1ZXJ5X3NldF9udGhfYWxsb2NhdGlvbl9wb29sIChxdWVyeSwgMCwgcG9vbCwgc2l6ZSwgbWluLCBtYXgpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHBvb2wpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGNhbGxlZCBhZnRlciBBL1Ygc3luYyB0byByZW5kZXIgZnJhbWUgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdjRsMnNpbmtfc2hvd19mcmFtZSAoR3N0VmlkZW9TaW5rICogdnNpbmssIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdFY0bDJTaW5rICp2NGwyc2luayA9IEdTVF9WNEwyU0lOSyAodnNpbmspOworICBHc3RWNGwyT2JqZWN0ICpvYmogPSB2NGwyc2luay0+djRsMm9iamVjdDsKKyAgR3N0QnVmZmVyUG9vbCAqYnBvb2wgPSBHU1RfQlVGRkVSX1BPT0wgKG9iai0+cG9vbCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMnNpbmssICJyZW5kZXIgYnVmZmVyOiAlcCIsIGJ1Zik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKG9iai0+cG9vbCA9PSBOVUxMKSkKKyAgICBnb3RvIG5vdF9uZWdvdGlhdGVkOworCisgIGlmIChHX1VOTElLRUxZICghZ3N0X2J1ZmZlcl9wb29sX2lzX2FjdGl2ZSAoYnBvb2wpKSkgeworICAgIEdzdFN0cnVjdHVyZSAqY29uZmlnOworCisgICAgLyogdGhpcyBwb29sIHdhcyBub3QgYWN0aXZhdGVkLCBjb25maWd1cmUgYW5kIGFjdGl2YXRlICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMnNpbmssICJhY3RpdmF0aW5nIHBvb2wiKTsKKworICAgIGNvbmZpZyA9IGdzdF9idWZmZXJfcG9vbF9nZXRfY29uZmlnIChicG9vbCk7CisgICAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19hZGRfb3B0aW9uIChjb25maWcsCisgICAgICAgIEdTVF9CVUZGRVJfUE9PTF9PUFRJT05fVklERU9fTUVUQSk7CisgICAgZ3N0X2J1ZmZlcl9wb29sX3NldF9jb25maWcgKGJwb29sLCBjb25maWcpOworCisgICAgaWYgKCFnc3RfYnVmZmVyX3Bvb2xfc2V0X2FjdGl2ZSAoYnBvb2wsIFRSVUUpKQorICAgICAgZ290byBhY3RpdmF0ZV9mYWlsZWQ7CisgIH0KKworICBnc3RfYnVmZmVyX3JlZiAoYnVmKTsKK2FnYWluOgorICByZXQgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9wcm9jZXNzIChHU1RfVjRMMl9CVUZGRVJfUE9PTF9DQVNUIChvYmotPnBvb2wpLAorICAgICAgJmJ1Zik7CisgIGlmIChyZXQgPT0gR1NUX0ZMT1dfRkxVU0hJTkcpIHsKKyAgICByZXQgPSBnc3RfYmFzZV9zaW5rX3dhaXRfcHJlcm9sbCAoR1NUX0JBU0VfU0lOSyAodnNpbmspKTsKKyAgICBpZiAocmV0ID09IEdTVF9GTE9XX09LKQorICAgICAgZ290byBhZ2FpbjsKKyAgfQorICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCitub3RfbmVnb3RpYXRlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHY0bDJzaW5rLCAibm90IG5lZ290aWF0ZWQiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisgIH0KK2FjdGl2YXRlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh2NGwyc2luaywgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoXygiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIikpLAorICAgICAgICAoIkJ1ZmZlciBwb29sIGFjdGl2YXRpb24gZmFpbGVkIikpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyc2lua191bmxvY2sgKEdzdEJhc2VTaW5rICogc2luaykKK3sKKyAgR3N0VjRsMlNpbmsgKnY0bDJzaW5rID0gR1NUX1Y0TDJTSU5LIChzaW5rKTsKKyAgcmV0dXJuIGdzdF92NGwyX29iamVjdF91bmxvY2sgKHY0bDJzaW5rLT52NGwyb2JqZWN0KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMnNpbmtfdW5sb2NrX3N0b3AgKEdzdEJhc2VTaW5rICogc2luaykKK3sKKyAgR3N0VjRsMlNpbmsgKnY0bDJzaW5rID0gR1NUX1Y0TDJTSU5LIChzaW5rKTsKKyAgcmV0dXJuIGdzdF92NGwyX29iamVjdF91bmxvY2tfc3RvcCAodjRsMnNpbmstPnY0bDJvYmplY3QpOworfQpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMnNpbmsuaCBiL3N5cy92NGwyL2dzdHY0bDJzaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNlOTdmYgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2dzdHY0bDJzaW5rLmgKQEAgLTAsMCArMSw4MSBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRleGFzIEluc3RydW1lbnRzLCBJbmMgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBEZXNjcmlwdGlvbjogVjRMMiBzaW5rIGVsZW1lbnQKKyAqICBDcmVhdGVkIG9uOiBKdWwgMiwgMjAwOQorICogICAgICBBdXRob3I6IFJvYiBDbGFyayA8cm9iQHRpLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUVjRMMlNJTktfSF9fCisjZGVmaW5lIF9fR1NUVjRMMlNJTktfSF9fCisKKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9zaW5rLmg+CisjaW5jbHVkZSA8Z3N0djRsMm9iamVjdC5oPgorI2luY2x1ZGUgPGdzdHY0bDJidWZmZXJwb29sLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9WNEwyU0lOSyBcCisgIChnc3RfdjRsMnNpbmtfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1Y0TDJTSU5LKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksIEdTVF9UWVBFX1Y0TDJTSU5LLCBHc3RWNGwyU2luaykpCisjZGVmaW5lIEdTVF9WNEwyU0lOS19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSwgR1NUX1RZUEVfVjRMMlNJTkssIEdzdFY0bDJTaW5rQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVjRMMlNJTksob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSwgR1NUX1RZUEVfVjRMMlNJTkspKQorI2RlZmluZSBHU1RfSVNfVjRMMlNJTktfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksIEdTVF9UWVBFX1Y0TDJTSU5LKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJTaW5rIEdzdFY0bDJTaW5rOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJTaW5rQ2xhc3MgR3N0VjRsMlNpbmtDbGFzczsKKworCitzdHJ1Y3QgX0dzdFY0bDJTaW5rIHsKKyAgR3N0VmlkZW9TaW5rIHZpZGVvc2luazsKKworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3Q7CisKKyAgZ2ludCB2aWRlb193aWR0aCwgdmlkZW9faGVpZ2h0OyAgICAgIC8qIG9yaWdpbmFsICh1bnNjYWxlZCkgdmlkZW8gdy9oICovCisKKyAgLyoKKyAgICogZmllbGQgdG8gc3RvcmUgcmVxdWVzdGVkIG92ZXJsYXkgYW5kIGNyb3AgdG9wL2xlZnQvd2lkdGgvaGVpZ2h0IHByb3BzOgorICAgKiBub3RlLCBjb3VsZCBtYXliZSBiZSBjb21iaW5lZCB3aXRoICd2d2luJyBmaWVsZCBpbiBHc3RWNGwyT2JqZWN0PworICAgKi8KKyAgc3RydWN0IHY0bDJfcmVjdCBvdmVybGF5LCBjcm9wOworCisgIC8qCisgICAqIGJpdG1hc2sgdG8gdHJhY2sgd2hpY2ggb3ZlcmxheSBhbmQgY3JvcCBmaWVsZHMgdXNlciBoYXMgcmVxdWVzdGVkIGJ5CisgICAqIHNldHRpbmcgcHJvcGVydGllczoKKyAgICovCisgIGd1aW50OCBvdmVybGF5X2ZpZWxkc19zZXQsIGNyb3BfZmllbGRzX3NldDsKK307CisKK3N0cnVjdCBfR3N0VjRsMlNpbmtDbGFzcyB7CisgIEdzdFZpZGVvU2lua0NsYXNzIHBhcmVudF9jbGFzczsKKworICBHTGlzdCAqdjRsMl9jbGFzc19kZXZpY2VzOworfTsKKworR1R5cGUgZ3N0X3Y0bDJzaW5rX2dldF90eXBlKHZvaWQpOworCitHX0VORF9ERUNMUworCisKKyNlbmRpZiAvKiBfX0dTVFY0TDJTSU5LX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMnNyYy5jIGIvc3lzL3Y0bDIvZ3N0djRsMnNyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MmUwZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwyc3JjLmMKQEAgLTAsMCArMSwxMDY0IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAgICAgICAgICAgICAgIDIwMDYgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4KKyAqCisgKiBnc3R2NGwyc3JjLmM6IFZpZGVvNExpbnV4MiBzb3VyY2UgZWxlbWVudAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXY0bDJzcmMKKyAqCisgKiB2NGwyc3JjIGNhbiBiZSB1c2VkIHRvIGNhcHR1cmUgdmlkZW8gZnJvbSB2NGwyIGRldmljZXMsIGxpa2Ugd2ViY2FtcyBhbmQgdHYKKyAqIGNhcmRzLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdjRsMnNyYyAhIHh2aW1hZ2VzaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIHNob3dzIHRoZSB2aWRlbyBjYXB0dXJlZCBmcm9tIC9kZXYvdmlkZW8wIHR2IGNhcmQgYW5kIGZvcgorICogd2ViY2Ftcy4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB2NGwyc3JjICEganBlZ2RlYyAhIHh2aW1hZ2VzaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIHNob3dzIHRoZSB2aWRlbyBjYXB0dXJlZCBmcm9tIGEgd2ViY2FtIHRoYXQgZGVsaXZlcnMganBlZworICogaW1hZ2VzLgorICogPC9yZWZzZWN0Mj4KKyAqCisgKiBTaW5jZSAxLjE0LCB0aGUgdXNlIG9mIGxpYnY0bDIgaGFzIGJlZW4gZGlzYWJsZWQgZHVlIHRvIG1ham9yIGJ1Z3MgaW4gdGhlCisgKiBlbXVsYXRpb24gbGF5ZXIuIFRvIGVuYWJsZSB1c2FnZSBvZiB0aGlzIGxpYnJhcnksIHNldCB0aGUgZW52aXJvbm1lbnQKKyAqIHZhcmlhYmxlIEdTVF9WNEwyX1VTRV9MSUJWNEwyPTEuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb21ldGEuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9wb29sLmg+CisKKyNpbmNsdWRlICJnc3R2NGwyc3JjLmgiCisKKyNpbmNsdWRlICJnc3R2NGwyY29sb3JiYWxhbmNlLmgiCisjaW5jbHVkZSAiZ3N0djRsMnR1bmVyLmgiCisjaW5jbHVkZSAiZ3N0djRsMnZpZG9yaWVudC5oIgorCisjaW5jbHVkZSAiZ3N0L2dzdC1pMThuLXBsdWdpbi5oIgorCitHU1RfREVCVUdfQ0FURUdPUlkgKHY0bDJzcmNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgdjRsMnNyY19kZWJ1ZworCisjZGVmaW5lIERFRkFVTFRfUFJPUF9ERVZJQ0UgICAiL2Rldi92aWRlbzAiCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBWNEwyX1NURF9PQkpFQ1RfUFJPUFMsCisgIFBST1BfTEFTVAorfTsKKworLyogc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICBTSUdOQUxfUFJFX1NFVF9GT1JNQVQsCisgIExBU1RfU0lHTkFMCit9OworCitzdGF0aWMgZ3VpbnQgZ3N0X3Y0bDJfc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAgfTsKKworR1NUX0lNUExFTUVOVF9WNEwyX0NPTE9SX0JBTEFOQ0VfTUVUSE9EUyAoR3N0VjRsMlNyYywgZ3N0X3Y0bDJzcmMpOworR1NUX0lNUExFTUVOVF9WNEwyX1RVTkVSX01FVEhPRFMgKEdzdFY0bDJTcmMsIGdzdF92NGwyc3JjKTsKK0dTVF9JTVBMRU1FTlRfVjRMMl9WSURPUklFTlRfTUVUSE9EUyAoR3N0VjRsMlNyYywgZ3N0X3Y0bDJzcmMpOworCitzdGF0aWMgdm9pZCBnc3RfdjRsMnNyY191cmlfaGFuZGxlcl9pbml0IChncG9pbnRlciBnX2lmYWNlLAorICAgIGdwb2ludGVyIGlmYWNlX2RhdGEpOworCisjZGVmaW5lIGdzdF92NGwyc3JjX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RWNGwyU3JjLCBnc3RfdjRsMnNyYywgR1NUX1RZUEVfUFVTSF9TUkMsCisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9VUklfSEFORExFUiwgZ3N0X3Y0bDJzcmNfdXJpX2hhbmRsZXJfaW5pdCk7CisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9UVU5FUiwgZ3N0X3Y0bDJzcmNfdHVuZXJfaW50ZXJmYWNlX2luaXQpOworICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfQ09MT1JfQkFMQU5DRSwKKyAgICAgICAgZ3N0X3Y0bDJzcmNfY29sb3JfYmFsYW5jZV9pbnRlcmZhY2VfaW5pdCk7CisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9WSURFT19PUklFTlRBVElPTiwKKyAgICAgICAgZ3N0X3Y0bDJzcmNfdmlkZW9fb3JpZW50YXRpb25faW50ZXJmYWNlX2luaXQpKTsKKworc3RhdGljIHZvaWQgZ3N0X3Y0bDJzcmNfZmluYWxpemUgKEdzdFY0bDJTcmMgKiB2NGwyc3JjKTsKKworLyogZWxlbWVudCBtZXRob2RzICovCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3Y0bDJzcmNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworLyogYmFzZXNyYyBtZXRob2RzICovCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3Y0bDJzcmNfc3RhcnQgKEdzdEJhc2VTcmMgKiBzcmMpOworc3RhdGljIGdib29sZWFuIGdzdF92NGwyc3JjX3VubG9jayAoR3N0QmFzZVNyYyAqIHNyYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3Y0bDJzcmNfdW5sb2NrX3N0b3AgKEdzdEJhc2VTcmMgKiBzcmMpOworc3RhdGljIGdib29sZWFuIGdzdF92NGwyc3JjX3N0b3AgKEdzdEJhc2VTcmMgKiBzcmMpOworc3RhdGljIEdzdENhcHMgKmdzdF92NGwyc3JjX2dldF9jYXBzIChHc3RCYXNlU3JjICogc3JjLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdjRsMnNyY19xdWVyeSAoR3N0QmFzZVNyYyAqIGJzcmMsIEdzdFF1ZXJ5ICogcXVlcnkpOworc3RhdGljIGdib29sZWFuIGdzdF92NGwyc3JjX2RlY2lkZV9hbGxvY2F0aW9uIChHc3RCYXNlU3JjICogc3JjLAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3Y0bDJzcmNfY3JlYXRlIChHc3RQdXNoU3JjICogc3JjLCBHc3RCdWZmZXIgKiogb3V0KTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfdjRsMnNyY19maXhhdGUgKEdzdEJhc2VTcmMgKiBiYXNlc3JjLCBHc3RDYXBzICogY2FwcywKKyAgICBHc3RTdHJ1Y3R1cmUgKiBwcmVmX3MpOworc3RhdGljIGdib29sZWFuIGdzdF92NGwyc3JjX25lZ290aWF0ZSAoR3N0QmFzZVNyYyAqIGJhc2VzcmMpOworCitzdGF0aWMgdm9pZCBnc3RfdjRsMnNyY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfdjRsMnNyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMnNyY19jbGFzc19pbml0IChHc3RWNGwyU3JjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3M7CisgIEdzdEJhc2VTcmNDbGFzcyAqYmFzZXNyY19jbGFzczsKKyAgR3N0UHVzaFNyY0NsYXNzICpwdXNoc3JjX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgYmFzZXNyY19jbGFzcyA9IEdTVF9CQVNFX1NSQ19DTEFTUyAoa2xhc3MpOworICBwdXNoc3JjX2NsYXNzID0gR1NUX1BVU0hfU1JDX0NMQVNTIChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSAoR09iamVjdEZpbmFsaXplRnVuYykgZ3N0X3Y0bDJzcmNfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF92NGwyc3JjX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3Y0bDJzcmNfZ2V0X3Byb3BlcnR5OworCisgIGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF92NGwyc3JjX2NoYW5nZV9zdGF0ZTsKKworICBnc3RfdjRsMl9vYmplY3RfaW5zdGFsbF9wcm9wZXJ0aWVzX2hlbHBlciAoZ29iamVjdF9jbGFzcywKKyAgICAgIERFRkFVTFRfUFJPUF9ERVZJQ0UpOworCisgIC8qKgorICAgKiBHc3RWNGwyU3JjOjpwcmVwYXJlLWZvcm1hdDoKKyAgICogQHY0bDJzcmM6IHRoZSB2NGwyc3JjIGluc3RhbmNlCisgICAqIEBmZDogdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgY3VycmVudCBkZXZpY2UKKyAgICogQGNhcHM6IHRoZSBjYXBzIG9mIHRoZSBmb3JtYXQgYmVpbmcgc2V0CisgICAqCisgICAqIFRoaXMgc2lnbmFsIGdldHMgZW1pdHRlZCBiZWZvcmUgY2FsbGluZyB0aGUgdjRsMiBWSURJT0NfU19GTVQgaW9jdGwKKyAgICogKHNldCBmb3JtYXQpLiBUaGlzIGFsbG93cyBmb3IgYW55IGN1c3RvbSBjb25maWd1cmF0aW9uIG9mIHRoZSBkZXZpY2UgdG8KKyAgICogaGFwcGVuIHByaW9yIHRvIHRoZSBmb3JtYXQgYmVpbmcgc2V0LgorICAgKiBUaGlzIGlzIG1vc3RseSB1c2VmdWwgZm9yIFVWQyBIMjY0IGVuY29kaW5nIGNhbWVyYXMgd2hpY2ggbmVlZCB0aGUgSDI2NAorICAgKiBQcm9iZSAmIENvbW1pdCB0byBoYXBwZW4gcHJpb3IgdG8gdGhlIG5vcm1hbCBQcm9iZSAmIENvbW1pdC4KKyAgICoKKyAgICogU2luY2U6IDAuMTAuMzIKKyAgICovCisgIGdzdF92NGwyX3NpZ25hbHNbU0lHTkFMX1BSRV9TRVRfRk9STUFUXSA9IGdfc2lnbmFsX25ldyAoInByZXBhcmUtZm9ybWF0IiwKKyAgICAgIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwKKyAgICAgIDAsIE5VTEwsIE5VTEwsIE5VTEwsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfSU5ULCBHU1RfVFlQRV9DQVBTKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIlZpZGVvICh2aWRlbzRsaW51eDIpIFNvdXJjZSIsICJTb3VyY2UvVmlkZW8iLAorICAgICAgIlJlYWRzIGZyYW1lcyBmcm9tIGEgVmlkZW80TGludXgyIGRldmljZSIsCisgICAgICAiRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4sICIKKyAgICAgICJTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZQorICAgICAgKGVsZW1lbnRfY2xhc3MsCisgICAgICBnc3RfcGFkX3RlbXBsYXRlX25ldyAoInNyYyIsIEdTVF9QQURfU1JDLCBHU1RfUEFEX0FMV0FZUywKKyAgICAgICAgICBnc3RfdjRsMl9vYmplY3RfZ2V0X2FsbF9jYXBzICgpKSk7CisKKyAgYmFzZXNyY19jbGFzcy0+Z2V0X2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJzcmNfZ2V0X2NhcHMpOworICBiYXNlc3JjX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMnNyY19zdGFydCk7CisgIGJhc2VzcmNfY2xhc3MtPnVubG9jayA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMnNyY191bmxvY2spOworICBiYXNlc3JjX2NsYXNzLT51bmxvY2tfc3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMnNyY191bmxvY2tfc3RvcCk7CisgIGJhc2VzcmNfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJzcmNfc3RvcCk7CisgIGJhc2VzcmNfY2xhc3MtPnF1ZXJ5ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyc3JjX3F1ZXJ5KTsKKyAgYmFzZXNyY19jbGFzcy0+bmVnb3RpYXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyc3JjX25lZ290aWF0ZSk7CisgIGJhc2VzcmNfY2xhc3MtPmRlY2lkZV9hbGxvY2F0aW9uID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMnNyY19kZWNpZGVfYWxsb2NhdGlvbik7CisKKyAgcHVzaHNyY19jbGFzcy0+Y3JlYXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyc3JjX2NyZWF0ZSk7CisKKyAga2xhc3MtPnY0bDJfY2xhc3NfZGV2aWNlcyA9IE5VTEw7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHY0bDJzcmNfZGVidWcsICJ2NGwyc3JjIiwgMCwgIlY0TDIgc291cmNlIGVsZW1lbnQiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyc3JjX2luaXQgKEdzdFY0bDJTcmMgKiB2NGwyc3JjKQoreworICAvKiBmaXhtZTogZ2l2ZSBhbiB1cGRhdGVfZnBzX2Z1bmN0aW9uICovCisgIHY0bDJzcmMtPnY0bDJvYmplY3QgPSBnc3RfdjRsMl9vYmplY3RfbmV3IChHU1RfRUxFTUVOVCAodjRsMnNyYyksCisgICAgICBHU1RfT0JKRUNUIChHU1RfQkFTRV9TUkNfUEFEICh2NGwyc3JjKSksIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKKyAgICAgIERFRkFVTFRfUFJPUF9ERVZJQ0UsIGdzdF92NGwyX2dldF9pbnB1dCwgZ3N0X3Y0bDJfc2V0X2lucHV0LCBOVUxMKTsKKworICAvKiBBdm9pZCB0aGUgc2xvdyBwcm9iZXMgKi8KKyAgdjRsMnNyYy0+djRsMm9iamVjdC0+c2tpcF90cnlfZm10X3Byb2JlcyA9IFRSVUU7CisKKyAgZ3N0X2Jhc2Vfc3JjX3NldF9mb3JtYXQgKEdTVF9CQVNFX1NSQyAodjRsMnNyYyksIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9iYXNlX3NyY19zZXRfbGl2ZSAoR1NUX0JBU0VfU1JDICh2NGwyc3JjKSwgVFJVRSk7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF92NGwyc3JjX2ZpbmFsaXplIChHc3RWNGwyU3JjICogdjRsMnNyYykKK3sKKyAgZ3N0X3Y0bDJfb2JqZWN0X2Rlc3Ryb3kgKHY0bDJzcmMtPnY0bDJvYmplY3QpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAoKEdPYmplY3QgKikgKHY0bDJzcmMpKTsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJzcmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFY0bDJTcmMgKnY0bDJzcmMgPSBHU1RfVjRMMlNSQyAob2JqZWN0KTsKKworICBpZiAoIWdzdF92NGwyX29iamVjdF9zZXRfcHJvcGVydHlfaGVscGVyICh2NGwyc3JjLT52NGwyb2JqZWN0LAorICAgICAgICAgIHByb3BfaWQsIHZhbHVlLCBwc3BlYykpIHsKKyAgICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJzcmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFY0bDJTcmMgKnY0bDJzcmMgPSBHU1RfVjRMMlNSQyAob2JqZWN0KTsKKworICBpZiAoIWdzdF92NGwyX29iamVjdF9nZXRfcHJvcGVydHlfaGVscGVyICh2NGwyc3JjLT52NGwyb2JqZWN0LAorICAgICAgICAgIHByb3BfaWQsIHZhbHVlLCBwc3BlYykpIHsKKyAgICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitzdHJ1Y3QgUHJlZmVyZWRDYXBzSW5mbworeworICBnaW50IHdpZHRoOworICBnaW50IGhlaWdodDsKKyAgZ2ludCBmcHNfbjsKKyAgZ2ludCBmcHNfZDsKK307CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZsNDJfc3JjX2ZpeGF0ZV9maWVsZHMgKEdRdWFyayBmaWVsZF9pZCwgR1ZhbHVlICogdmFsdWUsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0U3RydWN0dXJlICpzID0gdXNlcl9kYXRhOworCisgIGlmIChmaWVsZF9pZCA9PSBnX3F1YXJrX2Zyb21fc3RyaW5nICgiaW50ZXJsYWNlLW1vZGUiKSkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoZmllbGRfaWQgPT0gZ19xdWFya19mcm9tX3N0cmluZyAoImNvbG9yaW1ldHJ5IikpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGQgKHMsIGdfcXVhcmtfdG9fc3RyaW5nIChmaWVsZF9pZCkpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfc3JjX2ZpeGF0ZV9zdHJ1Y3Rfd2l0aF9wcmVmZXJlbmNlIChHc3RTdHJ1Y3R1cmUgKiBzLAorICAgIHN0cnVjdCBQcmVmZXJlZENhcHNJbmZvICpwcmVmKQoreworICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHMsICJ3aWR0aCIpKQorICAgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfaW50IChzLCAid2lkdGgiLCBwcmVmLT53aWR0aCk7CisKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAiaGVpZ2h0IikpCisgICAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGRfbmVhcmVzdF9pbnQgKHMsICJoZWlnaHQiLCBwcmVmLT5oZWlnaHQpOworCisgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgImZyYW1lcmF0ZSIpKQorICAgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfZnJhY3Rpb24gKHMsICJmcmFtZXJhdGUiLCBwcmVmLT5mcHNfbiwKKyAgICAgICAgcHJlZi0+ZnBzX2QpOworCisgIC8qIEZpbmFsbHksIGZpeGF0ZSBldmVyeXRoaW5nIGVsc2UgZXhjZXB0IHRoZSBpbnRlcmxhY2UtbW9kZSBhbmQgY29sb3JpbWV0cnkKKyAgICogd2hpY2ggc3RpbGwgbmVlZCBmdXJ0aGVyIG5lZ290aWF0aW9uIGFzIGl0IHdhc24ndCBwcm9iZWQgKi8KKyAgZ3N0X3N0cnVjdHVyZV9tYXBfaW5fcGxhY2UgKHMsIGdzdF92bDQyX3NyY19maXhhdGVfZmllbGRzLCBzKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3NyY19wYXJzZV9maXhlZF9zdHJ1Y3QgKEdzdFN0cnVjdHVyZSAqIHMsCisgICAgZ2ludCAqIHdpZHRoLCBnaW50ICogaGVpZ2h0LCBnaW50ICogZnBzX24sIGdpbnQgKiBmcHNfZCkKK3sKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAid2lkdGgiKSAmJiB3aWR0aCkKKyAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJ3aWR0aCIsIHdpZHRoKTsKKworICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHMsICJoZWlnaHQiKSAmJiBoZWlnaHQpCisgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzLCAiaGVpZ2h0IiwgaGVpZ2h0KTsKKworICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHMsICJmcmFtZXJhdGUiKSAmJiBmcHNfbiAmJiBmcHNfZCkKKyAgICBnc3Rfc3RydWN0dXJlX2dldF9mcmFjdGlvbiAocywgImZyYW1lcmF0ZSIsIGZwc19uLCBmcHNfZCk7Cit9CisKKy8qIFRPRE8gQ29uc2lkZXIgZnJhbWVyYXRlICovCitzdGF0aWMgZ2ludAorZ3N0X3Y0bDJzcmNfZml4ZWRfY2Fwc19jb21wYXJlIChHc3RTdHJ1Y3R1cmUgKiBhLCBHc3RTdHJ1Y3R1cmUgKiBiLAorICAgIHN0cnVjdCBQcmVmZXJlZENhcHNJbmZvICpwcmVmKQoreworICBnaW50IGF3ID0gR19NQVhJTlQsIGFoID0gR19NQVhJTlQsIGFkID0gR19NQVhJTlQ7CisgIGdpbnQgYncgPSBHX01BWElOVCwgYmggPSBHX01BWElOVCwgYmQgPSBHX01BWElOVDsKKyAgZ2ludCByZXQ7CisKKyAgZ3N0X3Y0bDJfc3JjX3BhcnNlX2ZpeGVkX3N0cnVjdCAoYSwgJmF3LCAmYWgsIE5VTEwsIE5VTEwpOworICBnc3RfdjRsMl9zcmNfcGFyc2VfZml4ZWRfc3RydWN0IChiLCAmYncsICZiaCwgTlVMTCwgTlVMTCk7CisKKyAgLyogV2hlbiBib3RoIGFyZSBzbWFsbGVyIHRoZW4gcHJlZiwganVzdCBhcHBlbmQgdG8gdGhlIGVuZCAqLworICBpZiAoKGJ3IDwgcHJlZi0+d2lkdGggfHwgYmggPCBwcmVmLT5oZWlnaHQpCisgICAgICAmJiAoYXcgPCBwcmVmLT53aWR0aCB8fCBhaCA8IHByZWYtPmhlaWdodCkpIHsKKyAgICByZXQgPSAxOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIC8qIElmIGEgaXMgc21hbGxlciB0aGVuIHByZWYgYW5kIG5vdCBiLCB0aGVuIGEgZ29lcyBhZnRlciBiICovCisgIGlmIChhdyA8IHByZWYtPndpZHRoIHx8IGFoIDwgcHJlZi0+aGVpZ2h0KSB7CisgICAgcmV0ID0gMTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICAvKiBJZiBiIGlzIHNtYWxsZXIgdGhlbiBwcmVmIGFuZCBub3QgYSwgdGhlbiBhIGdvZXMgYmVmb3JlIGIgKi8KKyAgaWYgKGJ3IDwgcHJlZi0+d2lkdGggfHwgYmggPCBwcmVmLT5oZWlnaHQpIHsKKyAgICByZXQgPSAtMTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICAvKiBCb3RoIGFyZSBsYXJnZXIgb3IgZXF1YWwgdG8gdGhlIHByZWZlcmVuY2UsIHByZWZlciB0aGUgc21hbGxlc3QgKi8KKyAgYWQgPSBNQVggKDEsIGF3IC0gcHJlZi0+d2lkdGgpICogTUFYICgxLCBhaCAtIHByZWYtPmhlaWdodCk7CisgIGJkID0gTUFYICgxLCBidyAtIHByZWYtPndpZHRoKSAqIE1BWCAoMSwgYmggLSBwcmVmLT5oZWlnaHQpOworCisgIC8qIEFkanVzdCBzbGlnaHRseSBpbiBjYXNlIHdpZHRoL2hlaWdodCBtYXRjaGVkIHRoZSBwcmVmZXJlbmNlICovCisgIGlmIChhdyA9PSBwcmVmLT53aWR0aCkKKyAgICBhZCAtPSAxOworCisgIGlmIChhaCA9PSBwcmVmLT5oZWlnaHQpCisgICAgYWQgLT0gMTsKKworICBpZiAoYncgPT0gcHJlZi0+d2lkdGgpCisgICAgYmQgLT0gMTsKKworICBpZiAoYmggPT0gcHJlZi0+aGVpZ2h0KQorICAgIGJkIC09IDE7CisKKyAgLyogSWYgdGhlIGNob2ljZXMgYXJlIGVxdWl2YWxlbnQsIG1haW50YWluIHRoZSBvcmRlciAqLworICBpZiAoYWQgPT0gYmQpCisgICAgcmV0ID0gMTsKKyAgZWxzZQorICAgIHJldCA9IGFkIC0gYmQ7CisKK2RvbmU6CisgIEdTVF9UUkFDRSAoIlBsYWNpbmcgJWl4JWkgKCVzKSAlcyAlaXglaSAoJXMpIiwgYXcsIGFoLAorICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChhLCAiZm9ybWF0IiksIHJldCA+IDAgPyAiYWZ0ZXIiIDogImJlZm9yZSIsIGJ3LAorICAgICAgYmgsIGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoYiwgImZvcm1hdCIpKTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMnNyY19zZXRfZm9ybWF0IChHc3RWNGwyU3JjICogdjRsMnNyYywgR3N0Q2FwcyAqIGNhcHMsCisgICAgR3N0VjRsMkVycm9yICogZXJyb3IpCit7CisgIEdzdFY0bDJPYmplY3QgKm9iajsKKworICBvYmogPSB2NGwyc3JjLT52NGwyb2JqZWN0OworCisgIC8qIG1ha2Ugc3VyZSB3ZSBzdG9wIGNhcHR1cmluZyBhbmQgZGVhbGxvYyBidWZmZXJzICovCisgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X3N0b3AgKG9iaikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGdfc2lnbmFsX2VtaXQgKHY0bDJzcmMsIGdzdF92NGwyX3NpZ25hbHNbU0lHTkFMX1BSRV9TRVRfRk9STUFUXSwgMCwKKyAgICAgIHY0bDJzcmMtPnY0bDJvYmplY3QtPnZpZGVvX2ZkLCBjYXBzKTsKKworICByZXR1cm4gZ3N0X3Y0bDJfb2JqZWN0X3NldF9mb3JtYXQgKG9iaiwgY2FwcywgZXJyb3IpOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfdjRsMnNyY19maXhhdGUgKEdzdEJhc2VTcmMgKiBiYXNlc3JjLCBHc3RDYXBzICogY2FwcywgR3N0U3RydWN0dXJlICogcHJlZl9zKQoreworICAvKiBMZXQncyBwcmVmZXIgYSBnb29kIHJlc29sdXRpaW9uIGFzIG9mIHRvZGF5J3Mgc3RhbmRhcmQuICovCisgIHN0cnVjdCBQcmVmZXJlZENhcHNJbmZvIHByZWYgPSB7CisgICAgMzg0MCwgMjE2MCwgMTIwLCAxCisgIH07CisgIEdzdFY0bDJTcmMgKnY0bDJzcmMgPSBHU1RfVjRMMlNSQyAoYmFzZXNyYyk7CisgIEdzdFY0bDJPYmplY3QgKm9iaiA9IHY0bDJzcmMtPnY0bDJvYmplY3Q7CisgIEdMaXN0ICpjYXBzX2xpc3QgPSBOVUxMOworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIGdpbnQgaSA9IEdfTUFYSU5UOworICBHc3RWNGwyRXJyb3IgZXJyb3IgPSBHU1RfVjRMMl9FUlJPUl9JTklUOworICBHc3RDYXBzICpmY2FwcyA9IE5VTEw7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXNyYywgImZpeGF0aW5nIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChjYXBzKTsKKworICAvKiBXZSBjb25zaWRlciB0aGUgZmlyc3Qgc3RydWN0dXJlIGZyb20gcGVlcmNhcHMgdG8gYmUgYSBwcmVmZXJlbmNlLiBUaGlzIGlzCisgICAqIHVzZWZ1bCBmb3IgbWF0Y2hpbmcgYSByZXBvcnRlZCBuYXRpdmUgZGlzcGxheSwgb3Igc2ltcGx5IHRvIGF2b2lkCisgICAqIHRyYW5zZm9ybWF0aW9uIHRvIGhhcHBlbiBkb3duc3RyZWFtLiAqLworICBpZiAocHJlZl9zKSB7CisgICAgcHJlZl9zID0gZ3N0X3N0cnVjdHVyZV9jb3B5IChwcmVmX3MpOworICAgIGdzdF92NGwyX3NyY19maXhhdGVfc3RydWN0X3dpdGhfcHJlZmVyZW5jZSAocHJlZl9zLCAmcHJlZik7CisgICAgZ3N0X3Y0bDJfc3JjX3BhcnNlX2ZpeGVkX3N0cnVjdCAocHJlZl9zLCAmcHJlZi53aWR0aCwgJnByZWYuaGVpZ2h0LAorICAgICAgICAmcHJlZi5mcHNfbiwgJnByZWYuZnBzX2QpOworICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocHJlZl9zKTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VzcmMsICJQcmVmZXJlZCBzaXplICVpeCVpIiwgcHJlZi53aWR0aCwgcHJlZi5oZWlnaHQpOworCisgIC8qIFNvcnQgdGhlIHN0cnVjdHVyZXMgdG8gZ2V0IHRoZSBjYXBzIHRoYXQgaXMgbmVhcmVzdCB0byBvdXIgcHJlZmVyZW5jZXMsCisgICAqIGZpcnN0ICovCisgIHdoaWxlICgocyA9IGdzdF9jYXBzX3N0ZWFsX3N0cnVjdHVyZSAoY2FwcywgMCkpKSB7CisgICAgZ3N0X3Y0bDJfc3JjX2ZpeGF0ZV9zdHJ1Y3Rfd2l0aF9wcmVmZXJlbmNlIChzLCAmcHJlZik7CisgICAgY2Fwc19saXN0ID0gZ19saXN0X2luc2VydF9zb3J0ZWRfd2l0aF9kYXRhIChjYXBzX2xpc3QsIHMsCisgICAgICAgIChHQ29tcGFyZURhdGFGdW5jKSBnc3RfdjRsMnNyY19maXhlZF9jYXBzX2NvbXBhcmUsICZwcmVmKTsKKyAgfQorCisgIHdoaWxlIChjYXBzX2xpc3QpIHsKKyAgICBzID0gY2Fwc19saXN0LT5kYXRhOworICAgIGNhcHNfbGlzdCA9IGdfbGlzdF9kZWxldGVfbGluayAoY2Fwc19saXN0LCBjYXBzX2xpc3QpOworICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKGNhcHMsIHMpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXNyYywgInNvcnRlZCBhbmQgbm9ybWFsaXplZCBjYXBzICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgY2Fwcyk7CisKKyAgLyogRWFjaCBzdHJ1Y3R1cmUgaW4gdGhlIGNhcHMgaGFzIGJlZW4gZml4YXRlZCwgZXhjZXB0IGZvciB0aGUKKyAgICogaW50ZXJsYWNlLW1vZGUgYW5kIGNvbG9yaW1ldHJ5LiBOb3cgbm9ybWFsaXplIHRoZSBjYXBzIHNvIHdlIGNhbgorICAgKiBlbnVtZXJhdGUgdGhlIHBvc3NpYmlsaXRpZXMgKi8KKyAgY2FwcyA9IGdzdF9jYXBzX25vcm1hbGl6ZSAoY2Fwcyk7CisKKyAgZm9yIChpID0gMDsgaSA8IGdzdF9jYXBzX2dldF9zaXplIChjYXBzKTsgKytpKSB7CisgICAgZ3N0X3Y0bDJfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisgICAgaWYgKGZjYXBzKQorICAgICAgZ3N0X2NhcHNfdW5yZWYgKGZjYXBzKTsKKworICAgIGZjYXBzID0gZ3N0X2NhcHNfY29weV9udGggKGNhcHMsIGkpOworCisgICAgaWYgKEdTVF9WNEwyX0lTX0FDVElWRSAob2JqKSkgeworICAgICAgLyogSnVzdCBjaGVjayBpZiB0aGUgZm9ybWF0IGlzIGFjY2VwdGFibGUsIG9uY2Ugd2Uga25vdworICAgICAgICogbm8gYnVmZmVycyBzaG91bGQgYmUgb3V0c3RhbmRpbmcgd2UgdHJ5IFNfRk1ULgorICAgICAgICoKKyAgICAgICAqIEJhc2VzcmMgd2lsbCBkbyBhbiBhbGxvY2F0aW9uIHF1ZXJ5IHRoYXQKKyAgICAgICAqIHNob3VsZCBpbmRpcmVjdGx5IHJlY2xhaW0gYnVmZmVycywgYWZ0ZXIgdGhhdCB3ZSBjYW4KKyAgICAgICAqIHNldCB0aGUgZm9ybWF0IGFuZCB0aGVuIGNvbmZpZ3VyZSBvdXIgcG9vbCAqLworICAgICAgaWYgKGdzdF92NGwyX29iamVjdF90cnlfZm9ybWF0IChvYmosIGZjYXBzLCAmZXJyb3IpKSB7CisgICAgICAgIC8qIG1ha2Ugc3VyZSB0aGUgY2FwcyBjaGFuZ2VkIGJlZm9yZSBkb2luZyBhbnl0aGluZyAqLworICAgICAgICBpZiAoZ3N0X3Y0bDJfb2JqZWN0X2NhcHNfZXF1YWwgKG9iaiwgZmNhcHMpKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHY0bDJzcmMtPnJlbmVnb3RpYXRpb25fYWRqdXN0ID0gdjRsMnNyYy0+b2Zmc2V0ICsgMTsKKyAgICAgICAgdjRsMnNyYy0+cGVuZGluZ19zZXRfZm10ID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChnc3RfdjRsMnNyY19zZXRfZm9ybWF0ICh2NGwyc3JjLCBmY2FwcywgJmVycm9yKSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogT25seSBFSVZBTCBtYWtlIHNlbnNlLCByZXBvcnQgYW55IG90aGVyIGVycm9ycywgdGhpcyB3YXkgd2UgZG9uJ3Qga2VlcAorICAgICAqIHByb2JpbmcgaWYgdGhlIGRldmljZSBnb3QgZGlzY29ubmVjdGVkLCBvciBpZiBpdCdzIGZpcm13YXJlIHN0b3BwZWQKKyAgICAgKiByZXNwb25kaW5nICovCisgICAgaWYgKGVycm9yLmVycm9yLT5jb2RlICE9IEdTVF9SRVNPVVJDRV9FUlJPUl9TRVRUSU5HUykgeworICAgICAgaSA9IEdfTUFYSU5UOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGkgPj0gZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpKSB7CisgICAgZ3N0X3Y0bDJfZXJyb3IgKHY0bDJzcmMsICZlcnJvcik7CisgICAgaWYgKGZjYXBzKQorICAgICAgZ3N0X2NhcHNfdW5yZWYgKGZjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXNyYywgImZpeGF0ZWQgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgZmNhcHMpOworCisgIHJldHVybiBmY2FwczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMnNyY19uZWdvdGlhdGUgKEdzdEJhc2VTcmMgKiBiYXNlc3JjKQoreworICBHc3RDYXBzICp0aGlzY2FwczsKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisgIEdzdENhcHMgKnBlZXJjYXBzID0gTlVMTDsKKyAgZ2Jvb2xlYW4gcmVzdWx0ID0gRkFMU0U7CisKKyAgLyogZmlyc3Qgc2VlIHdoYXQgaXMgcG9zc2libGUgb24gb3VyIHNvdXJjZSBwYWQgKi8KKyAgdGhpc2NhcHMgPSBnc3RfcGFkX3F1ZXJ5X2NhcHMgKEdTVF9CQVNFX1NSQ19QQUQgKGJhc2VzcmMpLCBOVUxMKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXNyYywgImNhcHMgb2Ygc3JjOiAlIiBHU1RfUFRSX0ZPUk1BVCwgdGhpc2NhcHMpOworCisgIC8qIG5vdGhpbmcgb3IgYW55dGhpbmcgaXMgYWxsb3dlZCwgd2UncmUgZG9uZSAqLworICBpZiAodGhpc2NhcHMgPT0gTlVMTCB8fCBnc3RfY2Fwc19pc19hbnkgKHRoaXNjYXBzKSkKKyAgICBnb3RvIG5vX25lZ29fbmVlZGVkOworCisgIC8qIGdldCB0aGUgcGVlciBjYXBzIHdpdGhvdXQgYSBmaWx0ZXIgYXMgd2UnbGwgZmlsdGVyIG91cnNlbHZlcyBsYXRlciBvbiAqLworICBwZWVyY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChHU1RfQkFTRV9TUkNfUEFEIChiYXNlc3JjKSwgTlVMTCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VzcmMsICJjYXBzIG9mIHBlZXI6ICUiIEdTVF9QVFJfRk9STUFULCBwZWVyY2Fwcyk7CisgIGlmIChwZWVyY2FwcyAmJiAhZ3N0X2NhcHNfaXNfYW55IChwZWVyY2FwcykpIHsKKyAgICAvKiBQcmVmZXIgdGhlIGZpcnN0IGNhcHMgd2UgYXJlIGNvbXBhdGlibGUgd2l0aCB0aGF0IHRoZSBwZWVyIHByb3Bvc2VkICovCisgICAgY2FwcyA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChwZWVyY2FwcywgdGhpc2NhcHMsCisgICAgICAgIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChiYXNlc3JjLCAiaW50ZXJzZWN0OiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgICBnc3RfY2Fwc191bnJlZiAodGhpc2NhcHMpOworICB9IGVsc2UgeworICAgIC8qIG5vIHBlZXIgb3IgcGVlciBoYXZlIEFOWSBjYXBzLCB3b3JrIHdpdGggb3VyIG93biBjYXBzIHRoZW4gKi8KKyAgICBjYXBzID0gdGhpc2NhcHM7CisgIH0KKworICBpZiAoY2FwcykgeworICAgIC8qIG5vdyBmaXhhdGUgKi8KKyAgICBpZiAoIWdzdF9jYXBzX2lzX2VtcHR5IChjYXBzKSkgeworICAgICAgR3N0U3RydWN0dXJlICpwcmVmID0gTlVMTDsKKworICAgICAgaWYgKHBlZXJjYXBzICYmICFnc3RfY2Fwc19pc19hbnkgKHBlZXJjYXBzKSkKKyAgICAgICAgcHJlZiA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHBlZXJjYXBzLCAwKTsKKworICAgICAgY2FwcyA9IGdzdF92NGwyc3JjX2ZpeGF0ZSAoYmFzZXNyYywgY2FwcywgcHJlZik7CisKKyAgICAgIC8qIEZpeGF0aW5nIG1heSBmYWlsIGFzIHdlIG5vdyBzZXQgdGhlIHNlbGVjdGVkIGZvcm1hdCAqLworICAgICAgaWYgKCFjYXBzKSB7CisgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VzcmMsICJmaXhhdGVkIHRvOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgICAgIGlmIChnc3RfY2Fwc19pc19hbnkgKGNhcHMpKSB7CisgICAgICAgIC8qIGhtbSwgc3RpbGwgYW55dGhpbmcsIHNvIGVsZW1lbnQgY2FuIGRvIGFueXRoaW5nIGFuZAorICAgICAgICAgKiBuZWdvIGlzIG5vdCBuZWVkZWQgKi8KKyAgICAgICAgcmVzdWx0ID0gVFJVRTsKKyAgICAgIH0gZWxzZSBpZiAoZ3N0X2NhcHNfaXNfZml4ZWQgKGNhcHMpKSB7CisgICAgICAgIC8qIHlheSwgZml4ZWQgY2FwcywgdXNlIHRob3NlIHRoZW4gKi8KKyAgICAgICAgcmVzdWx0ID0gZ3N0X2Jhc2Vfc3JjX3NldF9jYXBzIChiYXNlc3JjLCBjYXBzKTsKKyAgICAgIH0KKyAgICB9CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICB9CisKK2RvbmU6CisgIGlmIChwZWVyY2FwcykKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcmNhcHMpOworCisgIHJldHVybiByZXN1bHQ7CisKK25vX25lZ29fbmVlZGVkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXNyYywgIm5vIG5lZ290aWF0aW9uIG5lZWRlZCIpOworICAgIGlmICh0aGlzY2FwcykKKyAgICAgIGdzdF9jYXBzX3VucmVmICh0aGlzY2Fwcyk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3Y0bDJzcmNfZ2V0X2NhcHMgKEdzdEJhc2VTcmMgKiBzcmMsIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdFY0bDJTcmMgKnY0bDJzcmM7CisgIEdzdFY0bDJPYmplY3QgKm9iajsKKworICB2NGwyc3JjID0gR1NUX1Y0TDJTUkMgKHNyYyk7CisgIG9iaiA9IHY0bDJzcmMtPnY0bDJvYmplY3Q7CisKKyAgaWYgKCFHU1RfVjRMMl9JU19PUEVOIChvYmopKSB7CisgICAgcmV0dXJuIGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChHU1RfQkFTRV9TUkNfUEFEICh2NGwyc3JjKSk7CisgIH0KKworICByZXR1cm4gZ3N0X3Y0bDJfb2JqZWN0X2dldF9jYXBzIChvYmosIGZpbHRlcik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJzcmNfZGVjaWRlX2FsbG9jYXRpb24gKEdzdEJhc2VTcmMgKiBic3JjLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RWNGwyU3JjICpzcmMgPSBHU1RfVjRMMlNSQyAoYnNyYyk7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgaWYgKHNyYy0+cGVuZGluZ19zZXRfZm10KSB7CisgICAgR3N0Q2FwcyAqY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX0JBU0VfU1JDX1BBRCAoYnNyYykpOworICAgIEdzdFY0bDJFcnJvciBlcnJvciA9IEdTVF9WNEwyX0VSUk9SX0lOSVQ7CisKKyAgICBjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoY2Fwcyk7CisgICAgaWYgKCEocmV0ID0gZ3N0X3Y0bDJzcmNfc2V0X2Zvcm1hdCAoc3JjLCBjYXBzLCAmZXJyb3IpKSkKKyAgICAgIGdzdF92NGwyX2Vycm9yIChzcmMsICZlcnJvcik7CisKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgc3JjLT5wZW5kaW5nX3NldF9mbXQgPSBGQUxTRTsKKyAgfSBlbHNlIGlmIChnc3RfYnVmZmVyX3Bvb2xfaXNfYWN0aXZlIChzcmMtPnY0bDJvYmplY3QtPnBvb2wpKSB7CisgICAgLyogVHJpY2sgYmFzZXNyYyBpbnRvIG5vdCBkZWFjdGl2YXRpbmcgdGhlIGFjdGl2ZSBwb29sLiBSZW5lZ290aWF0aW5nIGhlcmUKKyAgICAgKiB3b3VsZCBvdGhlcndpc2UgdHVybiBvZmYgYW5kIG9uIHRoZSBjYW1lcmEuICovCisgICAgR3N0QWxsb2NhdG9yICphbGxvY2F0b3I7CisgICAgR3N0QWxsb2NhdGlvblBhcmFtcyBwYXJhbXM7CisgICAgR3N0QnVmZmVyUG9vbCAqcG9vbDsKKworICAgIGdzdF9iYXNlX3NyY19nZXRfYWxsb2NhdG9yIChic3JjLCAmYWxsb2NhdG9yLCAmcGFyYW1zKTsKKyAgICBwb29sID0gZ3N0X2Jhc2Vfc3JjX2dldF9idWZmZXJfcG9vbCAoYnNyYyk7CisKKyAgICBpZiAoZ3N0X3F1ZXJ5X2dldF9uX2FsbG9jYXRpb25fcGFyYW1zIChxdWVyeSkpCisgICAgICBnc3RfcXVlcnlfc2V0X250aF9hbGxvY2F0aW9uX3BhcmFtIChxdWVyeSwgMCwgYWxsb2NhdG9yLCAmcGFyYW1zKTsKKyAgICBlbHNlCisgICAgICBnc3RfcXVlcnlfYWRkX2FsbG9jYXRpb25fcGFyYW0gKHF1ZXJ5LCBhbGxvY2F0b3IsICZwYXJhbXMpOworCisgICAgaWYgKGdzdF9xdWVyeV9nZXRfbl9hbGxvY2F0aW9uX3Bvb2xzIChxdWVyeSkpCisgICAgICBnc3RfcXVlcnlfc2V0X250aF9hbGxvY2F0aW9uX3Bvb2wgKHF1ZXJ5LCAwLCBwb29sLAorICAgICAgICAgIHNyYy0+djRsMm9iamVjdC0+aW5mby5zaXplLCAxLCAwKTsKKyAgICBlbHNlCisgICAgICBnc3RfcXVlcnlfYWRkX2FsbG9jYXRpb25fcG9vbCAocXVlcnksIHBvb2wsIHNyYy0+djRsMm9iamVjdC0+aW5mby5zaXplLCAxLAorICAgICAgICAgIDApOworCisgICAgaWYgKHBvb2wpCisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChwb29sKTsKKyAgICBpZiAoYWxsb2NhdG9yKQorICAgICAgZ3N0X29iamVjdF91bnJlZiAoYWxsb2NhdG9yKTsKKworICAgIHJldHVybiBHU1RfQkFTRV9TUkNfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRlY2lkZV9hbGxvY2F0aW9uIChic3JjLCBxdWVyeSk7CisgIH0KKworICBpZiAocmV0KSB7CisgICAgcmV0ID0gZ3N0X3Y0bDJfb2JqZWN0X2RlY2lkZV9hbGxvY2F0aW9uIChzcmMtPnY0bDJvYmplY3QsIHF1ZXJ5KTsKKyAgICBpZiAocmV0KQorICAgICAgcmV0ID0gR1NUX0JBU0VfU1JDX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kZWNpZGVfYWxsb2NhdGlvbiAoYnNyYywgcXVlcnkpOworICB9CisKKyAgaWYgKHJldCkgeworICAgIGlmICghZ3N0X2J1ZmZlcl9wb29sX3NldF9hY3RpdmUgKHNyYy0+djRsMm9iamVjdC0+cG9vbCwgVFJVRSkpCisgICAgICBnb3RvIGFjdGl2YXRlX2ZhaWxlZDsKKyAgfQorCisgIHJldHVybiByZXQ7CisKK2FjdGl2YXRlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIikpLAorICAgICAgICAoIkJ1ZmZlciBwb29sIGFjdGl2YXRpb24gZmFpbGVkIikpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyc3JjX3F1ZXJ5IChHc3RCYXNlU3JjICogYnNyYywgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0VjRsMlNyYyAqc3JjOworICBHc3RWNGwyT2JqZWN0ICpvYmo7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIHNyYyA9IEdTVF9WNEwyU1JDIChic3JjKTsKKyAgb2JqID0gc3JjLT52NGwyb2JqZWN0OworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0xBVEVOQ1k6eworICAgICAgR3N0Q2xvY2tUaW1lIG1pbl9sYXRlbmN5LCBtYXhfbGF0ZW5jeTsKKyAgICAgIGd1aW50MzIgZnBzX24sIGZwc19kOworICAgICAgZ3VpbnQgbnVtX2J1ZmZlcnMgPSAwOworCisgICAgICAvKiBkZXZpY2UgbXVzdCBiZSBvcGVuICovCisgICAgICBpZiAoIUdTVF9WNEwyX0lTX09QRU4gKG9iaikpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsCisgICAgICAgICAgICAiQ2FuJ3QgZ2l2ZSBsYXRlbmN5IHNpbmNlIGRldmljZSBpc24ndCBvcGVuICEiKTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorCisgICAgICBmcHNfbiA9IEdTVF9WNEwyX0ZQU19OIChvYmopOworICAgICAgZnBzX2QgPSBHU1RfVjRMMl9GUFNfRCAob2JqKTsKKworICAgICAgLyogd2UgbXVzdCBoYXZlIGEgZnJhbWVyYXRlICovCisgICAgICBpZiAoZnBzX24gPD0gMCB8fCBmcHNfZCA8PSAwKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLAorICAgICAgICAgICAgIkNhbid0IGdpdmUgbGF0ZW5jeSBzaW5jZSBmcmFtZXJhdGUgaXNuJ3QgZml4YXRlZCAhIik7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKworICAgICAgLyogbWluIGxhdGVuY3kgaXMgdGhlIHRpbWUgdG8gY2FwdHVyZSBvbmUgZnJhbWUgKi8KKyAgICAgIG1pbl9sYXRlbmN5ID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoR1NUX1NFQ09ORCwgZnBzX2QsIGZwc19uKTsKKworICAgICAgLyogbWF4IGxhdGVuY3kgaXMgdG90YWwgZHVyYXRpb24gb2YgdGhlIGZyYW1lIGJ1ZmZlciAqLworICAgICAgaWYgKG9iai0+cG9vbCAhPSBOVUxMKQorICAgICAgICBudW1fYnVmZmVycyA9IEdTVF9WNEwyX0JVRkZFUl9QT09MX0NBU1QgKG9iai0+cG9vbCktPm1heF9sYXRlbmN5OworCisgICAgICBpZiAobnVtX2J1ZmZlcnMgPT0gMCkKKyAgICAgICAgbWF4X2xhdGVuY3kgPSAtMTsKKyAgICAgIGVsc2UKKyAgICAgICAgbWF4X2xhdGVuY3kgPSBudW1fYnVmZmVycyAqIG1pbl9sYXRlbmN5OworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChic3JjLAorICAgICAgICAgICJyZXBvcnQgbGF0ZW5jeSBtaW4gJSIgR1NUX1RJTUVfRk9STUFUICIgbWF4ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChtaW5fbGF0ZW5jeSksIEdTVF9USU1FX0FSR1MgKG1heF9sYXRlbmN5KSk7CisKKyAgICAgIC8qIHdlIGFyZSBhbHdheXMgbGl2ZSwgdGhlIG1pbiBsYXRlbmN5IGlzIDEgZnJhbWUgYW5kIHRoZSBtYXggbGF0ZW5jeSBpcworICAgICAgICogdGhlIGNvbXBsZXRlIGJ1ZmZlciBvZiBmcmFtZXMuICovCisgICAgICBnc3RfcXVlcnlfc2V0X2xhdGVuY3kgKHF1ZXJ5LCBUUlVFLCBtaW5fbGF0ZW5jeSwgbWF4X2xhdGVuY3kpOworCisgICAgICByZXMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBHU1RfQkFTRV9TUkNfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnF1ZXJ5IChic3JjLCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgfQorCitkb25lOgorCisgIHJldHVybiByZXM7Cit9CisKKy8qIHN0YXJ0IGFuZCBzdG9wIGFyZSBub3Qgc3ltbWV0cmljIC0tIHN0YXJ0IHdpbGwgb3BlbiB0aGUgZGV2aWNlLCBidXQgbm90IHN0YXJ0CisgKiBjYXB0dXJlLiBpdCdzIHNldGNhcHMgdGhhdCB3aWxsIHN0YXJ0IGNhcHR1cmUsIHdoaWNoIGlzIGNhbGxlZCB2aWEgYmFzZXNyYydzCisgKiBuZWdvdGlhdGUgbWV0aG9kLiBzdG9wIHdpbGwgYm90aCBzdG9wIGNhcHR1cmUgYW5kIGNsb3NlIHRoZSBkZXZpY2UuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJzcmNfc3RhcnQgKEdzdEJhc2VTcmMgKiBzcmMpCit7CisgIEdzdFY0bDJTcmMgKnY0bDJzcmMgPSBHU1RfVjRMMlNSQyAoc3JjKTsKKworICB2NGwyc3JjLT5vZmZzZXQgPSAwOworICB2NGwyc3JjLT5yZW5lZ290aWF0aW9uX2FkanVzdCA9IDA7CisKKyAgLyogYWN0aXZhdGUgc2V0dGluZ3MgZm9yIGZpcnN0IGZyYW1lICovCisgIHY0bDJzcmMtPmN0cmxfdGltZSA9IDA7CisgIGdzdF9vYmplY3Rfc3luY192YWx1ZXMgKEdTVF9PQkpFQ1QgKHNyYyksIHY0bDJzcmMtPmN0cmxfdGltZSk7CisKKyAgdjRsMnNyYy0+aGFzX2JhZF90aW1lc3RhbXAgPSBGQUxTRTsKKyAgdjRsMnNyYy0+bGFzdF90aW1lc3RhbXAgPSAwOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyc3JjX3VubG9jayAoR3N0QmFzZVNyYyAqIHNyYykKK3sKKyAgR3N0VjRsMlNyYyAqdjRsMnNyYyA9IEdTVF9WNEwyU1JDIChzcmMpOworICByZXR1cm4gZ3N0X3Y0bDJfb2JqZWN0X3VubG9jayAodjRsMnNyYy0+djRsMm9iamVjdCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJzcmNfdW5sb2NrX3N0b3AgKEdzdEJhc2VTcmMgKiBzcmMpCit7CisgIEdzdFY0bDJTcmMgKnY0bDJzcmMgPSBHU1RfVjRMMlNSQyAoc3JjKTsKKworICB2NGwyc3JjLT5sYXN0X3RpbWVzdGFtcCA9IDA7CisKKyAgcmV0dXJuIGdzdF92NGwyX29iamVjdF91bmxvY2tfc3RvcCAodjRsMnNyYy0+djRsMm9iamVjdCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJzcmNfc3RvcCAoR3N0QmFzZVNyYyAqIHNyYykKK3sKKyAgR3N0VjRsMlNyYyAqdjRsMnNyYyA9IEdTVF9WNEwyU1JDIChzcmMpOworICBHc3RWNGwyT2JqZWN0ICpvYmogPSB2NGwyc3JjLT52NGwyb2JqZWN0OworCisgIGlmIChHU1RfVjRMMl9JU19BQ1RJVkUgKG9iaikpIHsKKyAgICBpZiAoIWdzdF92NGwyX29iamVjdF9zdG9wIChvYmopKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgdjRsMnNyYy0+cGVuZGluZ19zZXRfZm10ID0gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3Y0bDJzcmNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTOworICBHc3RWNGwyU3JjICp2NGwyc3JjID0gR1NUX1Y0TDJTUkMgKGVsZW1lbnQpOworICBHc3RWNGwyT2JqZWN0ICpvYmogPSB2NGwyc3JjLT52NGwyb2JqZWN0OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOgorICAgICAgLyogb3BlbiB0aGUgZGV2aWNlICovCisgICAgICBpZiAoIWdzdF92NGwyX29iamVjdF9vcGVuIChvYmopKQorICAgICAgICByZXR1cm4gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICAvKiBjbG9zZSB0aGUgZGV2aWNlICovCisgICAgICBpZiAoIWdzdF92NGwyX29iamVjdF9jbG9zZSAob2JqKSkKKyAgICAgICAgcmV0dXJuIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRTsKKworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92NGwyc3JjX2NyZWF0ZSAoR3N0UHVzaFNyYyAqIHNyYywgR3N0QnVmZmVyICoqIGJ1ZikKK3sKKyAgR3N0VjRsMlNyYyAqdjRsMnNyYyA9IEdTVF9WNEwyU1JDIChzcmMpOworICBHc3RWNGwyT2JqZWN0ICpvYmogPSB2NGwyc3JjLT52NGwyb2JqZWN0OworICBHc3RWNGwyQnVmZmVyUG9vbCAqcG9vbCA9IEdTVF9WNEwyX0JVRkZFUl9QT09MX0NBU1QgKG9iai0+cG9vbCk7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RDbG9jayAqY2xvY2s7CisgIEdzdENsb2NrVGltZSBhYnNfdGltZSwgYmFzZV90aW1lLCB0aW1lc3RhbXAsIGR1cmF0aW9uOworICBHc3RDbG9ja1RpbWUgZGVsYXk7CisgIEdzdE1lc3NhZ2UgKnFvc19tc2c7CisKKyAgZG8geworICAgIHJldCA9IEdTVF9CQVNFX1NSQ19DTEFTUyAocGFyZW50X2NsYXNzKS0+YWxsb2MgKEdTVF9CQVNFX1NSQyAoc3JjKSwgMCwKKyAgICAgICAgb2JqLT5pbmZvLnNpemUsIGJ1Zik7CisKKyAgICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LKSkKKyAgICAgIGdvdG8gYWxsb2NfZmFpbGVkOworCisgICAgcmV0ID0gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcHJvY2VzcyAocG9vbCwgYnVmKTsKKworICB9IHdoaWxlIChyZXQgPT0gR1NUX1Y0TDJfRkxPV19DT1JSVVBURURfQlVGRkVSKTsKKworICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LKSkKKyAgICBnb3RvIGVycm9yOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QICgqYnVmKTsKKyAgZHVyYXRpb24gPSBvYmotPmR1cmF0aW9uOworCisgIC8qIHRpbWVzdGFtcHMsIExPQ0sgdG8gZ2V0IGNsb2NrIGFuZCBiYXNlIHRpbWUuICovCisgIC8qIEZJWE1FOiBlbGVtZW50IGNsb2NrIGFuZCBiYXNlX3RpbWUgaXMgcmFyZWx5IGNoYW5naW5nICovCisgIEdTVF9PQkpFQ1RfTE9DSyAodjRsMnNyYyk7CisgIGlmICgoY2xvY2sgPSBHU1RfRUxFTUVOVF9DTE9DSyAodjRsMnNyYykpKSB7CisgICAgLyogd2UgaGF2ZSBhIGNsb2NrLCBnZXQgYmFzZSB0aW1lIGFuZCByZWYgY2xvY2sgKi8KKyAgICBiYXNlX3RpbWUgPSBHU1RfRUxFTUVOVCAodjRsMnNyYyktPmJhc2VfdGltZTsKKyAgICBnc3Rfb2JqZWN0X3JlZiAoY2xvY2spOworICB9IGVsc2UgeworICAgIC8qIG5vIGNsb2NrLCBjYW4ndCBzZXQgdGltZXN0YW1wcyAqLworICAgIGJhc2VfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHY0bDJzcmMpOworCisgIC8qIHNhbXBsZSBwaXBlbGluZSBjbG9jayAqLworICBpZiAoY2xvY2spIHsKKyAgICBhYnNfdGltZSA9IGdzdF9jbG9ja19nZXRfdGltZSAoY2xvY2spOworICAgIGdzdF9vYmplY3RfdW5yZWYgKGNsb2NrKTsKKyAgfSBlbHNlIHsKKyAgICBhYnNfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIH0KKworcmV0cnk6CisgIGlmICghdjRsMnNyYy0+aGFzX2JhZF90aW1lc3RhbXAgJiYgdGltZXN0YW1wICE9IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgbm93OworICAgIEdzdENsb2NrVGltZSBnc3Rub3c7CisKKyAgICAvKiB2NGwyIHNwZWNzIHNheSB0byB1c2UgdGhlIHN5c3RlbSB0aW1lIGFsdGhvdWdoIG1hbnkgZHJpdmVycyBzd2l0Y2hlZCB0bworICAgICAqIHRoZSBtb3JlIGRlc2lyYWJsZSBtb25vdG9uaWMgdGltZS4gV2UgZmlyc3QgdHJ5IHRvIHVzZSB0aGUgbW9ub3RvbmljIHRpbWUKKyAgICAgKiBhbmQgc2VlIGhvdyB0aGF0IGdvZXMgKi8KKyAgICBjbG9ja19nZXR0aW1lIChDTE9DS19NT05PVE9OSUMsICZub3cpOworICAgIGdzdG5vdyA9IEdTVF9USU1FU1BFQ19UT19USU1FIChub3cpOworCisgICAgaWYgKHRpbWVzdGFtcCA+IGdzdG5vdyB8fCAoZ3N0bm93IC0gdGltZXN0YW1wKSA+ICgxMCAqIEdTVF9TRUNPTkQpKSB7CisgICAgICBHVGltZVZhbCBub3c7CisKKyAgICAgIC8qIHZlcnkgbGFyZ2UgZGlmZiwgZmFsbCBiYWNrIHRvIHN5c3RlbSB0aW1lICovCisgICAgICBnX2dldF9jdXJyZW50X3RpbWUgKCZub3cpOworICAgICAgZ3N0bm93ID0gR1NUX1RJTUVWQUxfVE9fVElNRSAobm93KTsKKyAgICB9CisKKyAgICAvKiBEZXRlY3QgYnVnZ3kgZHJpdmVycyBoZXJlLCBhbmQgc3RvcCB1c2luZyB0aGVpciB0aW1lc3RhbXAuIEZhaWxpbmcgYW55CisgICAgICogb2YgdGhlc2UgY29uZGl0aW9uIHdvdWxkIGltcGx5IGEgdmVyeSBidWdneSBkcml2ZXI6CisgICAgICogICAtIFRpbWVzdGFtcCBpbiB0aGUgZnV0dXJlCisgICAgICogICAtIFRpbWVzdGFtcCBpcyBnb2luZyBiYWNrd2FyZCBjb21wYXJlIHRvIGxhc3Qgc2VlbiB0aW1lc3RhbXAKKyAgICAgKiAgIC0gVGltZXN0YW1wIGlzIGp1bXBpbmcgZm9yd2FyZCBmb3IgbGVzcyB0aGVuIGEgZnJhbWUgZHVyYXRpb24KKyAgICAgKiAgIC0gRGVsYXkgaXMgYmlnZ2VyIHRoZW4gdGhlIGFjdHVhbCB0aW1lc3RhbXAKKyAgICAgKiAqLworICAgIGlmICh0aW1lc3RhbXAgPiBnc3Rub3cpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMnNyYywKKyAgICAgICAgICAiVGltZXN0YW1wIGluIHRoZSBmdXR1cmUgZGV0ZWN0ZWQsIGlnbm9yaW5nIGRyaXZlciB0aW1lc3RhbXBzIik7CisgICAgICB2NGwyc3JjLT5oYXNfYmFkX3RpbWVzdGFtcCA9IFRSVUU7CisgICAgICBnb3RvIHJldHJ5OworICAgIH0KKworICAgIGlmICh2NGwyc3JjLT5sYXN0X3RpbWVzdGFtcCA+IHRpbWVzdGFtcCkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyc3JjLAorICAgICAgICAgICJUaW1lc3RhbXAgZ29pbmcgYmFja3dhcmQsIGlnbm9yaW5nIGRyaXZlciB0aW1lc3RhbXBzIik7CisgICAgICB2NGwyc3JjLT5oYXNfYmFkX3RpbWVzdGFtcCA9IFRSVUU7CisgICAgICBnb3RvIHJldHJ5OworICAgIH0KKworICAgIGRlbGF5ID0gZ3N0bm93IC0gdGltZXN0YW1wOworCisgICAgaWYgKGRlbGF5ID4gdGltZXN0YW1wKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJzcmMsCisgICAgICAgICAgIlRpbWVzdGFtcCBkb2VzIG5vdCBjb3JyZWxhdGUgd2l0aCBhbnkgY2xvY2ssIGlnbm9yaW5nIGRyaXZlciB0aW1lc3RhbXBzIik7CisgICAgICB2NGwyc3JjLT5oYXNfYmFkX3RpbWVzdGFtcCA9IFRSVUU7CisgICAgICBnb3RvIHJldHJ5OworICAgIH0KKworICAgIC8qIFNhdmUgbGFzdCB0aW1lc3RhbXAgZm9yIHNhbml0eSBjaGVja3MgKi8KKyAgICB2NGwyc3JjLT5sYXN0X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJzcmMsICJ0czogJSIgR1NUX1RJTUVfRk9STUFUICIgbm93ICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAiIGRlbGF5ICUiIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoZ3N0bm93KSwgR1NUX1RJTUVfQVJHUyAoZGVsYXkpKTsKKyAgfSBlbHNlIHsKKyAgICAvKiB3ZSBhc3N1bWUgMSBmcmFtZSBsYXRlbmN5IG90aGVyd2lzZSAqLworICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZHVyYXRpb24pKQorICAgICAgZGVsYXkgPSBkdXJhdGlvbjsKKyAgICBlbHNlCisgICAgICBkZWxheSA9IDA7CisgIH0KKworICAvKiBzZXQgYnVmZmVyIG1ldGFkYXRhICovCisKKyAgaWYgKEdfTElLRUxZIChhYnNfdGltZSAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKSkgeworICAgIC8qIHRoZSB0aW1lIG5vdyBpcyB0aGUgdGltZSBvZiB0aGUgY2xvY2sgbWludXMgdGhlIGJhc2UgdGltZSAqLworICAgIHRpbWVzdGFtcCA9IGFic190aW1lIC0gYmFzZV90aW1lOworCisgICAgLyogYWRqdXN0IGZvciBkZWxheSBpbiB0aGUgZGV2aWNlICovCisgICAgaWYgKHRpbWVzdGFtcCA+IGRlbGF5KQorICAgICAgdGltZXN0YW1wIC09IGRlbGF5OworICAgIGVsc2UKKyAgICAgIHRpbWVzdGFtcCA9IDA7CisgIH0gZWxzZSB7CisgICAgdGltZXN0YW1wID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgfQorCisgIC8qIGFjdGl2YXRlIHNldHRpbmdzIGZvciBuZXh0IGZyYW1lICovCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZHVyYXRpb24pKSB7CisgICAgdjRsMnNyYy0+Y3RybF90aW1lICs9IGR1cmF0aW9uOworICB9IGVsc2UgeworICAgIC8qIHRoaXMgaXMgbm90IHZlcnkgZ29vZCAoYXMgaXQgc2hvdWxkIGJlIHRoZSBuZXh0IHRpbWVzdGFtcCksCisgICAgICogc3RpbGwgZ29vZCBlbm91Z2ggZm9yIGxpbmVhciBmYWRlcyAoYXMgbG9uZyBhcyBpdCBpcyBub3QgLTEpCisgICAgICovCisgICAgdjRsMnNyYy0+Y3RybF90aW1lID0gdGltZXN0YW1wOworICB9CisgIGdzdF9vYmplY3Rfc3luY192YWx1ZXMgKEdTVF9PQkpFQ1QgKHNyYyksIHY0bDJzcmMtPmN0cmxfdGltZSk7CisKKyAgR1NUX0lORk9fT0JKRUNUIChzcmMsICJzeW5jIHRvICUiIEdTVF9USU1FX0ZPUk1BVCAiIG91dCB0cyAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTICh2NGwyc3JjLT5jdHJsX3RpbWUpLCBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApKTsKKworICAvKiB1c2UgZ2VuZXJhdGVkIG9mZnNldCB2YWx1ZXMgb25seSBpZiB0aGVyZSBhcmUgbm90IGFscmVhZHkgdmFsaWQgb25lcworICAgKiBzZXQgYnkgdGhlIHY0bDIgZGV2aWNlICovCisgIGlmICghR1NUX0JVRkZFUl9PRkZTRVRfSVNfVkFMSUQgKCpidWYpCisgICAgICB8fCAhR1NUX0JVRkZFUl9PRkZTRVRfRU5EX0lTX1ZBTElEICgqYnVmKSkgeworICAgIEdTVF9CVUZGRVJfT0ZGU0VUICgqYnVmKSA9IHY0bDJzcmMtPm9mZnNldCsrOworICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoKmJ1ZikgPSB2NGwyc3JjLT5vZmZzZXQ7CisgIH0gZWxzZSB7CisgICAgLyogYWRqdXN0IHJhdyB2NGwyIGRldmljZSBzZXF1ZW5jZSwgd2lsbCByZXN0YXJ0IGF0IG51bGwgaW4gY2FzZSBvZiByZW5lZ290aWF0aW9uCisgICAgICogKHN0cmVhbW9mZi9zdHJlYW1vbikgKi8KKyAgICBHU1RfQlVGRkVSX09GRlNFVCAoKmJ1ZikgKz0gdjRsMnNyYy0+cmVuZWdvdGlhdGlvbl9hZGp1c3Q7CisgICAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EICgqYnVmKSArPSB2NGwyc3JjLT5yZW5lZ290aWF0aW9uX2FkanVzdDsKKyAgICAvKiBjaGVjayBmb3IgZnJhbWUgbG9zcyB3aXRoIGdpdmVuIChmcm9tIHY0bDIgZGV2aWNlKSBidWZmZXIgb2Zmc2V0ICovCisgICAgaWYgKCh2NGwyc3JjLT5vZmZzZXQgIT0gMCkKKyAgICAgICAgJiYgKEdTVF9CVUZGRVJfT0ZGU0VUICgqYnVmKSAhPSAodjRsMnNyYy0+b2Zmc2V0ICsgMSkpKSB7CisgICAgICBndWludDY0IGxvc3RfZnJhbWVfY291bnQgPSBHU1RfQlVGRkVSX09GRlNFVCAoKmJ1ZikgLSB2NGwyc3JjLT5vZmZzZXQgLSAxOworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyc3JjLAorICAgICAgICAgICJsb3N0IGZyYW1lcyBkZXRlY3RlZDogY291bnQgPSAlIiBHX0dVSU5UNjRfRk9STUFUICIgLSB0czogJSIKKyAgICAgICAgICBHU1RfVElNRV9GT1JNQVQsIGxvc3RfZnJhbWVfY291bnQsIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgICAgICBxb3NfbXNnID0gZ3N0X21lc3NhZ2VfbmV3X3FvcyAoR1NUX09CSkVDVF9DQVNUICh2NGwyc3JjKSwgVFJVRSwKKyAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FLCBHU1RfQ0xPQ0tfVElNRV9OT05FLCB0aW1lc3RhbXAsCisgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGR1cmF0aW9uKSA/IGxvc3RfZnJhbWVfY291bnQgKgorICAgICAgICAgIGR1cmF0aW9uIDogR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHY0bDJzcmMpLCBxb3NfbXNnKTsKKworICAgIH0KKyAgICB2NGwyc3JjLT5vZmZzZXQgPSBHU1RfQlVGRkVSX09GRlNFVCAoKmJ1Zik7CisgIH0KKworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoKmJ1ZikgPSB0aW1lc3RhbXA7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKCpidWYpID0gZHVyYXRpb247CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUiAqLworYWxsb2NfZmFpbGVkOgorICB7CisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19GTFVTSElORykKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBOT19TUEFDRV9MRUZULAorICAgICAgICAgICgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYnVmZmVyIiksIChOVUxMKSk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorZXJyb3I6CisgIHsKKyAgICBnc3RfYnVmZmVyX3JlcGxhY2UgKGJ1ZiwgTlVMTCk7CisgICAgaWYgKHJldCA9PSBHU1RfVjRMMl9GTE9XX0xBU1RfQlVGRkVSKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAgICgiRHJpdmVyIHJldHVybmVkIGEgYnVmZmVyIHdpdGggbm8gcGF5bG9hZCwgdGhpcyBtb3N0IGxpa2VseSAiCisgICAgICAgICAgICAgICJpbmRpY2F0ZSBhIGJ1ZyBpbiB0aGUgZHJpdmVyLiIpLCAoTlVMTCkpOworICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImVycm9yIHByb2Nlc3NpbmcgYnVmZmVyICVkICglcykiLCByZXQsCisgICAgICAgICAgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworICB9Cit9CisKKworLyogR3N0VVJJSGFuZGxlciBpbnRlcmZhY2UgKi8KK3N0YXRpYyBHc3RVUklUeXBlCitnc3RfdjRsMnNyY191cmlfZ2V0X3R5cGUgKEdUeXBlIHR5cGUpCit7CisgIHJldHVybiBHU1RfVVJJX1NSQzsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyICpjb25zdCAqCitnc3RfdjRsMnNyY191cmlfZ2V0X3Byb3RvY29scyAoR1R5cGUgdHlwZSkKK3sKKyAgc3RhdGljIGNvbnN0IGdjaGFyICpwcm90b2NvbHNbXSA9IHsgInY0bDIiLCBOVUxMIH07CisKKyAgcmV0dXJuIHByb3RvY29sczsKK30KKworc3RhdGljIGdjaGFyICoKK2dzdF92NGwyc3JjX3VyaV9nZXRfdXJpIChHc3RVUklIYW5kbGVyICogaGFuZGxlcikKK3sKKyAgR3N0VjRsMlNyYyAqdjRsMnNyYyA9IEdTVF9WNEwyU1JDIChoYW5kbGVyKTsKKworICBpZiAodjRsMnNyYy0+djRsMm9iamVjdC0+dmlkZW9kZXYgIT0gTlVMTCkgeworICAgIHJldHVybiBnX3N0cmR1cF9wcmludGYgKCJ2NGwyOi8vJXMiLCB2NGwyc3JjLT52NGwyb2JqZWN0LT52aWRlb2Rldik7CisgIH0KKworICByZXR1cm4gZ19zdHJkdXAgKCJ2NGwyOi8vIik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJzcmNfdXJpX3NldF91cmkgKEdzdFVSSUhhbmRsZXIgKiBoYW5kbGVyLCBjb25zdCBnY2hhciAqIHVyaSwKKyAgICBHRXJyb3IgKiogZXJyb3IpCit7CisgIEdzdFY0bDJTcmMgKnY0bDJzcmMgPSBHU1RfVjRMMlNSQyAoaGFuZGxlcik7CisgIGNvbnN0IGdjaGFyICpkZXZpY2UgPSBERUZBVUxUX1BST1BfREVWSUNFOworCisgIGlmIChzdHJjbXAgKHVyaSwgInY0bDI6Ly8iKSAhPSAwKSB7CisgICAgZGV2aWNlID0gdXJpICsgNzsKKyAgfQorICBnX29iamVjdF9zZXQgKHY0bDJzcmMsICJkZXZpY2UiLCBkZXZpY2UsIE5VTEwpOworCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMnNyY191cmlfaGFuZGxlcl9pbml0IChncG9pbnRlciBnX2lmYWNlLCBncG9pbnRlciBpZmFjZV9kYXRhKQoreworICBHc3RVUklIYW5kbGVySW50ZXJmYWNlICppZmFjZSA9IChHc3RVUklIYW5kbGVySW50ZXJmYWNlICopIGdfaWZhY2U7CisKKyAgaWZhY2UtPmdldF90eXBlID0gZ3N0X3Y0bDJzcmNfdXJpX2dldF90eXBlOworICBpZmFjZS0+Z2V0X3Byb3RvY29scyA9IGdzdF92NGwyc3JjX3VyaV9nZXRfcHJvdG9jb2xzOworICBpZmFjZS0+Z2V0X3VyaSA9IGdzdF92NGwyc3JjX3VyaV9nZXRfdXJpOworICBpZmFjZS0+c2V0X3VyaSA9IGdzdF92NGwyc3JjX3VyaV9zZXRfdXJpOworfQpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMnNyYy5oIGIvc3lzL3Y0bDIvZ3N0djRsMnNyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiN2Y3NTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwyc3JjLmgKQEAgLTAsMCArMSw4MyBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogICAgICAgICAgICAgICAyMDA2IEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+CisgKgorICogZ3N0djRsMnNyYy5oOiBCVDh4OC9WNEwyIHNvdXJjZSBlbGVtZW50CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9WNEwyU1JDX0hfXworI2RlZmluZSBfX0dTVF9WNEwyU1JDX0hfXworCisjaW5jbHVkZSA8Z3N0djRsMm9iamVjdC5oPgorI2luY2x1ZGUgPGdzdHY0bDJidWZmZXJwb29sLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9WNEwyU1JDIFwKKyAgKGdzdF92NGwyc3JjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WNEwyU1JDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVjRMMlNSQyxHc3RWNGwyU3JjKSkKKyNkZWZpbmUgR1NUX1Y0TDJTUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfVjRMMlNSQyxHc3RWNGwyU3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVjRMMlNSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1Y0TDJTUkMpKQorI2RlZmluZSBHU1RfSVNfVjRMMlNSQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9WNEwyU1JDKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJTcmMgR3N0VjRsMlNyYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyU3JjQ2xhc3MgR3N0VjRsMlNyY0NsYXNzOworCisvKioKKyAqIEdzdFY0bDJTcmM6CisgKgorICogT3BhcXVlIG9iamVjdC4KKyAqLworc3RydWN0IF9Hc3RWNGwyU3JjCit7CisgIEdzdFB1c2hTcmMgcHVzaHNyYzsKKworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3Q7CisKKyAgZ3VpbnQ2NCBvZmZzZXQ7CisKKyAgLyogb2Zmc2V0IGFkanVzdCBhZnRlciByZW5lZ290aWF0aW9uICovCisgIGd1aW50NjQgcmVuZWdvdGlhdGlvbl9hZGp1c3Q7CisKKyAgR3N0Q2xvY2tUaW1lIGN0cmxfdGltZTsKKworICBnYm9vbGVhbiBwZW5kaW5nX3NldF9mbXQ7CisKKyAgLyogVGltZXN0YW1wIHNhbml0eSBjaGVjayAqLworICBHc3RDbG9ja1RpbWUgbGFzdF90aW1lc3RhbXA7CisgIGdib29sZWFuIGhhc19iYWRfdGltZXN0YW1wOworfTsKKworc3RydWN0IF9Hc3RWNGwyU3JjQ2xhc3MKK3sKKyAgR3N0UHVzaFNyY0NsYXNzIHBhcmVudF9jbGFzczsKKworICBHTGlzdCAqdjRsMl9jbGFzc19kZXZpY2VzOworfTsKKworR1R5cGUgZ3N0X3Y0bDJzcmNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfVjRMMlNSQ19IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYyBiL3N5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzA1MmE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5jCkBAIC0wLDAgKzEsMTIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBDb2xsYWJvcmEgTHRkLgorICogICAgIEF1dGhvcjogTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0djRsMm9iamVjdC5oIgorI2luY2x1ZGUgImdzdHY0bDJ0cmFuc2Zvcm0uaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKworI2RlZmluZSBERUZBVUxUX1BST1BfREVWSUNFICIvZGV2L3ZpZGVvMTAiCisKKyNkZWZpbmUgVjRMMl9UUkFOU0ZPUk1fUVVBUksgXAorCWdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nKCJnc3QtdjRsMi10cmFuc2Zvcm0taW5mbyIpCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF92NGwyX3RyYW5zZm9ybV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfdjRsMl90cmFuc2Zvcm1fZGVidWcKKworCitlbnVtCit7CisgIFBST1BfMCwKKyAgVjRMMl9TVERfT0JKRUNUX1BST1BTCit9OworCit0eXBlZGVmIHN0cnVjdAoreworICBnY2hhciAqZGV2aWNlOworICBHc3RDYXBzICpzaW5rX2NhcHM7CisgIEdzdENhcHMgKnNyY19jYXBzOworfSBHc3RWNGwyVHJhbnNmb3JtQ0RhdGE7CisKKyNkZWZpbmUgZ3N0X3Y0bDJfdHJhbnNmb3JtX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX0FCU1RSQUNUX1RZUEUgKEdzdFY0bDJUcmFuc2Zvcm0sIGdzdF92NGwyX3RyYW5zZm9ybSwKKyAgICBHU1RfVFlQRV9CQVNFX1RSQU5TRk9STSk7CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl90cmFuc2Zvcm1fc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFY0bDJUcmFuc2Zvcm0gKnNlbGYgPSBHU1RfVjRMMl9UUkFOU0ZPUk0gKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX09VVFBVVF9JT19NT0RFOgorICAgICAgZ3N0X3Y0bDJfb2JqZWN0X3NldF9wcm9wZXJ0eV9oZWxwZXIgKHNlbGYtPnY0bDJvdXRwdXQsIHByb3BfaWQsIHZhbHVlLAorICAgICAgICAgIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DQVBUVVJFX0lPX01PREU6CisgICAgICBnc3RfdjRsMl9vYmplY3Rfc2V0X3Byb3BlcnR5X2hlbHBlciAoc2VsZi0+djRsMmNhcHR1cmUsIHByb3BfaWQsIHZhbHVlLAorICAgICAgICAgIHBzcGVjKTsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBCeSBkZWZhdWx0LCBvbmx5IHNldCBvbiBvdXRwdXQgKi8KKyAgICBkZWZhdWx0OgorICAgICAgaWYgKCFnc3RfdjRsMl9vYmplY3Rfc2V0X3Byb3BlcnR5X2hlbHBlciAoc2VsZi0+djRsMm91dHB1dCwKKyAgICAgICAgICAgICAgcHJvcF9pZCwgdmFsdWUsIHBzcGVjKSkgeworICAgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3RyYW5zZm9ybV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VjRsMlRyYW5zZm9ybSAqc2VsZiA9IEdTVF9WNEwyX1RSQU5TRk9STSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfT1VUUFVUX0lPX01PREU6CisgICAgICBnc3RfdjRsMl9vYmplY3RfZ2V0X3Byb3BlcnR5X2hlbHBlciAoc2VsZi0+djRsMm91dHB1dCwgcHJvcF9pZCwgdmFsdWUsCisgICAgICAgICAgcHNwZWMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NBUFRVUkVfSU9fTU9ERToKKyAgICAgIGdzdF92NGwyX29iamVjdF9nZXRfcHJvcGVydHlfaGVscGVyIChzZWxmLT52NGwyY2FwdHVyZSwgcHJvcF9pZCwgdmFsdWUsCisgICAgICAgICAgcHNwZWMpOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEJ5IGRlZmF1bHQgcmVhZCBmcm9tIG91dHB1dCAqLworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoIWdzdF92NGwyX29iamVjdF9nZXRfcHJvcGVydHlfaGVscGVyIChzZWxmLT52NGwyb3V0cHV0LAorICAgICAgICAgICAgICBwcm9wX2lkLCB2YWx1ZSwgcHNwZWMpKSB7CisgICAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX3RyYW5zZm9ybV9vcGVuIChHc3RWNGwyVHJhbnNmb3JtICogc2VsZikKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIk9wZW5pbmciKTsKKworICBpZiAoIWdzdF92NGwyX29iamVjdF9vcGVuIChzZWxmLT52NGwyb3V0cHV0KSkKKyAgICBnb3RvIGZhaWx1cmU7CisKKyAgaWYgKCFnc3RfdjRsMl9vYmplY3Rfb3Blbl9zaGFyZWQgKHNlbGYtPnY0bDJjYXB0dXJlLCBzZWxmLT52NGwyb3V0cHV0KSkKKyAgICBnb3RvIGZhaWx1cmU7CisKKyAgc2VsZi0+cHJvYmVkX3NpbmtjYXBzID0gZ3N0X3Y0bDJfb2JqZWN0X2dldF9jYXBzIChzZWxmLT52NGwyb3V0cHV0LAorICAgICAgZ3N0X3Y0bDJfb2JqZWN0X2dldF9yYXdfY2FwcyAoKSk7CisKKyAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChzZWxmLT5wcm9iZWRfc2lua2NhcHMpKQorICAgIGdvdG8gbm9faW5wdXRfZm9ybWF0OworCisgIHNlbGYtPnByb2JlZF9zcmNjYXBzID0gZ3N0X3Y0bDJfb2JqZWN0X2dldF9jYXBzIChzZWxmLT52NGwyY2FwdHVyZSwKKyAgICAgIGdzdF92NGwyX29iamVjdF9nZXRfcmF3X2NhcHMgKCkpOworCisgIGlmIChnc3RfY2Fwc19pc19lbXB0eSAoc2VsZi0+cHJvYmVkX3NyY2NhcHMpKQorICAgIGdvdG8gbm9fb3V0cHV0X2Zvcm1hdDsKKworICByZXR1cm4gVFJVRTsKKworbm9faW5wdXRfZm9ybWF0OgorICBHU1RfRUxFTUVOVF9FUlJPUiAoc2VsZiwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgKF8oIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiKSwKKyAgICAgICAgICBzZWxmLT52NGwyb3V0cHV0LT52aWRlb2RldiksIChOVUxMKSk7CisgIGdvdG8gZmFpbHVyZTsKKworCitub19vdXRwdXRfZm9ybWF0OgorICBHU1RfRUxFTUVOVF9FUlJPUiAoc2VsZiwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgKF8oIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IiksCisgICAgICAgICAgc2VsZi0+djRsMm91dHB1dC0+dmlkZW9kZXYpLCAoTlVMTCkpOworICBnb3RvIGZhaWx1cmU7CisKK2ZhaWx1cmU6CisgIGlmIChHU1RfVjRMMl9JU19PUEVOIChzZWxmLT52NGwyb3V0cHV0KSkKKyAgICBnc3RfdjRsMl9vYmplY3RfY2xvc2UgKHNlbGYtPnY0bDJvdXRwdXQpOworCisgIGlmIChHU1RfVjRMMl9JU19PUEVOIChzZWxmLT52NGwyY2FwdHVyZSkpCisgICAgZ3N0X3Y0bDJfb2JqZWN0X2Nsb3NlIChzZWxmLT52NGwyY2FwdHVyZSk7CisKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNlbGYtPnByb2JlZF9zcmNjYXBzLCBOVUxMKTsKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNlbGYtPnByb2JlZF9zaW5rY2FwcywgTlVMTCk7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdHJhbnNmb3JtX2Nsb3NlIChHc3RWNGwyVHJhbnNmb3JtICogc2VsZikKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkNsb3NpbmciKTsKKworICBnc3RfdjRsMl9vYmplY3RfY2xvc2UgKHNlbGYtPnY0bDJvdXRwdXQpOworICBnc3RfdjRsMl9vYmplY3RfY2xvc2UgKHNlbGYtPnY0bDJjYXB0dXJlKTsKKworICBnc3RfY2Fwc19yZXBsYWNlICgmc2VsZi0+cHJvYmVkX3NyY2NhcHMsIE5VTEwpOworICBnc3RfY2Fwc19yZXBsYWNlICgmc2VsZi0+cHJvYmVkX3NpbmtjYXBzLCBOVUxMKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl90cmFuc2Zvcm1fc3RvcCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICBHc3RWNGwyVHJhbnNmb3JtICpzZWxmID0gR1NUX1Y0TDJfVFJBTlNGT1JNICh0cmFucyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlN0b3AiKTsKKworICBnc3RfdjRsMl9vYmplY3Rfc3RvcCAoc2VsZi0+djRsMm91dHB1dCk7CisgIGdzdF92NGwyX29iamVjdF9zdG9wIChzZWxmLT52NGwyY2FwdHVyZSk7CisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzZWxmLT5pbmNhcHMsIE5VTEwpOworICBnc3RfY2Fwc19yZXBsYWNlICgmc2VsZi0+b3V0Y2FwcywgTlVMTCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdHJhbnNmb3JtX3NldF9jYXBzIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdENhcHMgKiBpbmNhcHMsCisgICAgR3N0Q2FwcyAqIG91dGNhcHMpCit7CisgIEdzdFY0bDJFcnJvciBlcnJvciA9IEdTVF9WNEwyX0VSUk9SX0lOSVQ7CisgIEdzdFY0bDJUcmFuc2Zvcm0gKnNlbGYgPSBHU1RfVjRMMl9UUkFOU0ZPUk0gKHRyYW5zKTsKKworICBpZiAoc2VsZi0+aW5jYXBzICYmIHNlbGYtPm91dGNhcHMpIHsKKyAgICBpZiAoZ3N0X2NhcHNfaXNfZXF1YWwgKGluY2Fwcywgc2VsZi0+aW5jYXBzKSAmJgorICAgICAgICBnc3RfY2Fwc19pc19lcXVhbCAob3V0Y2Fwcywgc2VsZi0+b3V0Y2FwcykpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHRyYW5zLCAiQ2FwcyBkaWQgbm90IGNoYW5nZWQiKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorCisgIC8qIFRPRE8gQWRkIHJlbmVnb3RpYXRpb24gc3VwcG9ydCAqLworICBnX3JldHVybl92YWxfaWZfZmFpbCAoIUdTVF9WNEwyX0lTX0FDVElWRSAoc2VsZi0+djRsMm91dHB1dCksIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKCFHU1RfVjRMMl9JU19BQ1RJVkUgKHNlbGYtPnY0bDJjYXB0dXJlKSwgRkFMU0UpOworCisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzZWxmLT5pbmNhcHMsIGluY2Fwcyk7CisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzZWxmLT5vdXRjYXBzLCBvdXRjYXBzKTsKKworICBpZiAoIWdzdF92NGwyX29iamVjdF9zZXRfZm9ybWF0IChzZWxmLT52NGwyb3V0cHV0LCBpbmNhcHMsICZlcnJvcikpCisgICAgZ290byBpbmNhcHNfZmFpbGVkOworCisgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X3NldF9mb3JtYXQgKHNlbGYtPnY0bDJjYXB0dXJlLCBvdXRjYXBzLCAmZXJyb3IpKQorICAgIGdvdG8gb3V0Y2Fwc19mYWlsZWQ7CisKKyAgLyogRklYTUUgaW1wbGVtZW50IGZhbGxiYWNrIGlmIGNyb3Agbm90IHN1cHBvcnRlZCAqLworICBpZiAoIWdzdF92NGwyX29iamVjdF9zZXRfY3JvcCAoc2VsZi0+djRsMm91dHB1dCkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgaWYgKCFnc3RfdjRsMl9vYmplY3Rfc2V0X2Nyb3AgKHNlbGYtPnY0bDJjYXB0dXJlKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICByZXR1cm4gVFJVRTsKKworaW5jYXBzX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsICJmYWlsZWQgdG8gc2V0IGlucHV0IGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICBpbmNhcHMpOworICAgIGdzdF92NGwyX2Vycm9yIChzZWxmLCAmZXJyb3IpOworICAgIGdvdG8gZmFpbGVkOworICB9CitvdXRjYXBzX2ZhaWxlZDoKKyAgeworICAgIGdzdF92NGwyX29iamVjdF9zdG9wIChzZWxmLT52NGwyb3V0cHV0KTsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiZmFpbGVkIHRvIHNldCBvdXRwdXQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgIG91dGNhcHMpOworICAgIGdzdF92NGwyX2Vycm9yIChzZWxmLCAmZXJyb3IpOworICAgIGdvdG8gZmFpbGVkOworICB9CitmYWlsZWQ6CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl90cmFuc2Zvcm1fcXVlcnkgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywgR3N0UGFkRGlyZWN0aW9uIGRpcmVjdGlvbiwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RWNGwyVHJhbnNmb3JtICpzZWxmID0gR1NUX1Y0TDJfVFJBTlNGT1JNICh0cmFucyk7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQ0FQUzp7CisgICAgICBHc3RDYXBzICpmaWx0ZXIsICpjYXBzID0gTlVMTCwgKnJlc3VsdCA9IE5VTEw7CisgICAgICBHc3RQYWQgKnBhZCwgKm90aGVycGFkOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY2FwcyAocXVlcnksICZmaWx0ZXIpOworCisgICAgICBpZiAoZGlyZWN0aW9uID09IEdTVF9QQURfU1JDKSB7CisgICAgICAgIHBhZCA9IEdTVF9CQVNFX1RSQU5TRk9STV9TUkNfUEFEICh0cmFucyk7CisgICAgICAgIG90aGVycGFkID0gR1NUX0JBU0VfVFJBTlNGT1JNX1NJTktfUEFEICh0cmFucyk7CisgICAgICAgIGlmIChzZWxmLT5wcm9iZWRfc3JjY2FwcykKKyAgICAgICAgICBjYXBzID0gZ3N0X2NhcHNfcmVmIChzZWxmLT5wcm9iZWRfc3JjY2Fwcyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwYWQgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fU0lOS19QQUQgKHRyYW5zKTsKKyAgICAgICAgb3RoZXJwYWQgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fU1JDX1BBRCAodHJhbnMpOworICAgICAgICBpZiAoc2VsZi0+cHJvYmVkX3NpbmtjYXBzKQorICAgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19yZWYgKHNlbGYtPnByb2JlZF9zaW5rY2Fwcyk7CisgICAgICB9CisKKyAgICAgIGlmICghY2FwcykKKyAgICAgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChwYWQpOworCisgICAgICBpZiAoZmlsdGVyKSB7CisgICAgICAgIEdzdENhcHMgKnRtcCA9IGNhcHM7CisgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCB0bXAsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgICAgIGdzdF9jYXBzX3VucmVmICh0bXApOworICAgICAgfQorCisgICAgICByZXN1bHQgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAob3RoZXJwYWQsIGNhcHMpOworICAgICAgcmVzdWx0ID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAocmVzdWx0KTsKKyAgICAgIGdzdF9jYXBzX2FwcGVuZCAocmVzdWx0LCBjYXBzKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlJldHVybmluZyAlcyBjYXBzICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICAgIEdTVF9QQURfTkFNRSAocGFkKSwgcmVzdWx0KTsKKworICAgICAgZ3N0X3F1ZXJ5X3NldF9jYXBzX3Jlc3VsdCAocXVlcnksIHJlc3VsdCk7CisgICAgICBnc3RfY2Fwc191bnJlZiAocmVzdWx0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKHBhcmVudF9jbGFzcyktPnF1ZXJ5ICh0cmFucywgZGlyZWN0aW9uLAorICAgICAgICAgIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl90cmFuc2Zvcm1fZGVjaWRlX2FsbG9jYXRpb24gKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RWNGwyVHJhbnNmb3JtICpzZWxmID0gR1NUX1Y0TDJfVFJBTlNGT1JNICh0cmFucyk7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJjYWxsZWQiKTsKKworICBpZiAoZ3N0X3Y0bDJfb2JqZWN0X2RlY2lkZV9hbGxvY2F0aW9uIChzZWxmLT52NGwyY2FwdHVyZSwgcXVlcnkpKSB7CisgICAgR3N0QnVmZmVyUG9vbCAqcG9vbCA9IEdTVF9CVUZGRVJfUE9PTCAoc2VsZi0+djRsMmNhcHR1cmUtPnBvb2wpOworCisgICAgcmV0ID0gR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kZWNpZGVfYWxsb2NhdGlvbiAodHJhbnMsCisgICAgICAgIHF1ZXJ5KTsKKworICAgIGlmICghZ3N0X2J1ZmZlcl9wb29sX3NldF9hY3RpdmUgKHBvb2wsIFRSVUUpKQorICAgICAgZ290byBhY3RpdmF0ZV9mYWlsZWQ7CisgIH0KKworICByZXR1cm4gcmV0OworCithY3RpdmF0ZV9mYWlsZWQ6CisgIEdTVF9FTEVNRU5UX0VSUk9SIChzZWxmLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAoImZhaWxlZCB0byBhY3RpdmF0ZSBidWZmZXJwb29sIiksICgiZmFpbGVkIHRvIGFjdGl2YXRlIGJ1ZmZlcnBvb2wiKSk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX3RyYW5zZm9ybV9wcm9wb3NlX2FsbG9jYXRpb24gKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RRdWVyeSAqIGRlY2lkZV9xdWVyeSwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0VjRsMlRyYW5zZm9ybSAqc2VsZiA9IEdTVF9WNEwyX1RSQU5TRk9STSAodHJhbnMpOworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiY2FsbGVkIik7CisKKyAgaWYgKGRlY2lkZV9xdWVyeSA9PSBOVUxMKQorICAgIHJldCA9IFRSVUU7CisgIGVsc2UKKyAgICByZXQgPSBnc3RfdjRsMl9vYmplY3RfcHJvcG9zZV9hbGxvY2F0aW9uIChzZWxmLT52NGwyb3V0cHV0LCBxdWVyeSk7CisKKyAgaWYgKHJldCkKKyAgICByZXQgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKHBhcmVudF9jbGFzcyktPnByb3Bvc2VfYWxsb2NhdGlvbiAodHJhbnMsCisgICAgICAgIGRlY2lkZV9xdWVyeSwgcXVlcnkpOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qIGNvcGllcyB0aGUgZ2l2ZW4gY2FwcyAqLworc3RhdGljIEdzdENhcHMgKgorZ3N0X3Y0bDJfdHJhbnNmb3JtX2NhcHNfcmVtb3ZlX2Zvcm1hdF9pbmZvIChHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdDsKKyAgR3N0Q2Fwc0ZlYXR1cmVzICpmOworICBnaW50IGksIG47CisgIEdzdENhcHMgKnJlczsKKworICByZXMgPSBnc3RfY2Fwc19uZXdfZW1wdHkgKCk7CisKKyAgbiA9IGdzdF9jYXBzX2dldF9zaXplIChjYXBzKTsKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIHN0ID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSk7CisgICAgZiA9IGdzdF9jYXBzX2dldF9mZWF0dXJlcyAoY2FwcywgaSk7CisKKyAgICAvKiBJZiB0aGlzIGlzIGFscmVhZHkgZXhwcmVzc2VkIGJ5IHRoZSBleGlzdGluZyBjYXBzCisgICAgICogc2tpcCB0aGlzIHN0cnVjdHVyZSAqLworICAgIGlmIChpID4gMCAmJiBnc3RfY2Fwc19pc19zdWJzZXRfc3RydWN0dXJlX2Z1bGwgKHJlcywgc3QsIGYpKQorICAgICAgY29udGludWU7CisKKyAgICBzdCA9IGdzdF9zdHJ1Y3R1cmVfY29weSAoc3QpOworICAgIC8qIE9ubHkgcmVtb3ZlIGZvcm1hdCBpbmZvIGZvciB0aGUgY2FzZXMgd2hlbiB3ZSBjYW4gYWN0dWFsbHkgY29udmVydCAqLworICAgIGlmICghZ3N0X2NhcHNfZmVhdHVyZXNfaXNfYW55IChmKQorICAgICAgICAmJiBnc3RfY2Fwc19mZWF0dXJlc19pc19lcXVhbCAoZiwKKyAgICAgICAgICAgIEdTVF9DQVBTX0ZFQVRVUkVTX01FTU9SWV9TWVNURU1fTUVNT1JZKSkKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkcyAoc3QsICJmb3JtYXQiLCAiY29sb3JpbWV0cnkiLCAiY2hyb21hLXNpdGUiLAorICAgICAgICAgICJ3aWR0aCIsICJoZWlnaHQiLCAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgTlVMTCk7CisKKyAgICBnc3RfY2Fwc19hcHBlbmRfc3RydWN0dXJlX2Z1bGwgKHJlcywgc3QsIGdzdF9jYXBzX2ZlYXR1cmVzX2NvcHkgKGYpKTsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKKy8qIFRoZSBjYXBzIGNhbiBiZSB0cmFuc2Zvcm1lZCBpbnRvIGFueSBvdGhlciBjYXBzIHdpdGggZm9ybWF0IGluZm8gcmVtb3ZlZC4KKyAqIEhvd2V2ZXIsIHdlIHNob3VsZCBwcmVmZXIgcGFzc3Rocm91Z2gsIHNvIGlmIHBhc3N0aHJvdWdoIGlzIHBvc3NpYmxlLAorICogcHV0IGl0IGZpcnN0IGluIHRoZSBsaXN0LiAqLworc3RhdGljIEdzdENhcHMgKgorZ3N0X3Y0bDJfdHJhbnNmb3JtX3RyYW5zZm9ybV9jYXBzIChHc3RCYXNlVHJhbnNmb3JtICogYnRyYW5zLAorICAgIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdENhcHMgKiBjYXBzLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RDYXBzICp0bXAsICp0bXAyOworICBHc3RDYXBzICpyZXN1bHQ7CisKKyAgLyogR2V0IGFsbCBwb3NzaWJsZSBjYXBzIHRoYXQgd2UgY2FuIHRyYW5zZm9ybSB0byAqLworICB0bXAgPSBnc3RfdjRsMl90cmFuc2Zvcm1fY2Fwc19yZW1vdmVfZm9ybWF0X2luZm8gKGNhcHMpOworCisgIGlmIChmaWx0ZXIpIHsKKyAgICB0bXAyID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgdG1wLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmICh0bXApOworICAgIHRtcCA9IHRtcDI7CisgIH0KKworICByZXN1bHQgPSB0bXA7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYnRyYW5zLCAidHJhbnNmb3JtZWQgJSIgR1NUX1BUUl9GT1JNQVQgIiBpbnRvICUiCisgICAgICBHU1RfUFRSX0ZPUk1BVCwgY2FwcywgcmVzdWx0KTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfdjRsMl90cmFuc2Zvcm1fZml4YXRlX2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLCBHc3RDYXBzICogY2FwcywgR3N0Q2FwcyAqIG90aGVyY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICppbnMsICpvdXRzOworICBjb25zdCBHVmFsdWUgKmZyb21fcGFyLCAqdG9fcGFyOworICBHVmFsdWUgZnBhciA9IHsgMCwgfSwgdHBhciA9IHsKKyAgMCx9OworCisgIG90aGVyY2FwcyA9IGdzdF9jYXBzX3RydW5jYXRlIChvdGhlcmNhcHMpOworICBvdGhlcmNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChvdGhlcmNhcHMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHRyYW5zLCAidHJ5aW5nIHRvIGZpeGF0ZSBvdGhlcmNhcHMgJSIgR1NUX1BUUl9GT1JNQVQKKyAgICAgICIgYmFzZWQgb24gY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgb3RoZXJjYXBzLCBjYXBzKTsKKworICBpbnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgb3V0cyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKG90aGVyY2FwcywgMCk7CisKKyAgeworICAgIGNvbnN0IGdjaGFyICppbl9mb3JtYXQ7CisKKyAgICBpbl9mb3JtYXQgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKGlucywgImZvcm1hdCIpOworICAgIGlmIChpbl9mb3JtYXQpIHsKKyAgICAgIC8qIFRyeSB0byBzZXQgb3V0cHV0IGZvcm1hdCBmb3IgcGFzcyB0aHJvdWdoICovCisgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9zdHJpbmcgKG91dHMsICJmb3JtYXQiLCBpbl9mb3JtYXQpOworICAgIH0KKworICB9CisKKyAgZnJvbV9wYXIgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoaW5zLCAicGl4ZWwtYXNwZWN0LXJhdGlvIik7CisgIHRvX3BhciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChvdXRzLCAicGl4ZWwtYXNwZWN0LXJhdGlvIik7CisKKyAgLyogSWYgd2UncmUgZml4YXRpbmcgZnJvbSB0aGUgc2lua3BhZCB3ZSBhbHdheXMgc2V0IHRoZSBQQVIgYW5kCisgICAqIGFzc3VtZSB0aGF0IG1pc3NpbmcgUEFSIG9uIHRoZSBzaW5rcGFkIG1lYW5zIDEvMSBhbmQKKyAgICogbWlzc2luZyBQQVIgb24gdGhlIHNyY3BhZCBtZWFucyB1bmRlZmluZWQKKyAgICovCisgIGlmIChkaXJlY3Rpb24gPT0gR1NUX1BBRF9TSU5LKSB7CisgICAgaWYgKCFmcm9tX3BhcikgeworICAgICAgZ192YWx1ZV9pbml0ICgmZnBhciwgR1NUX1RZUEVfRlJBQ1RJT04pOworICAgICAgZ3N0X3ZhbHVlX3NldF9mcmFjdGlvbiAoJmZwYXIsIDEsIDEpOworICAgICAgZnJvbV9wYXIgPSAmZnBhcjsKKyAgICB9CisgICAgaWYgKCF0b19wYXIpIHsKKyAgICAgIGdfdmFsdWVfaW5pdCAoJnRwYXIsIEdTVF9UWVBFX0ZSQUNUSU9OX1JBTkdFKTsKKyAgICAgIGdzdF92YWx1ZV9zZXRfZnJhY3Rpb25fcmFuZ2VfZnVsbCAoJnRwYXIsIDEsIEdfTUFYSU5ULCBHX01BWElOVCwgMSk7CisgICAgICB0b19wYXIgPSAmdHBhcjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCF0b19wYXIpIHsKKyAgICAgIGdfdmFsdWVfaW5pdCAoJnRwYXIsIEdTVF9UWVBFX0ZSQUNUSU9OKTsKKyAgICAgIGdzdF92YWx1ZV9zZXRfZnJhY3Rpb24gKCZ0cGFyLCAxLCAxKTsKKyAgICAgIHRvX3BhciA9ICZ0cGFyOworCisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAob3V0cywgInBpeGVsLWFzcGVjdC1yYXRpbyIsIEdTVF9UWVBFX0ZSQUNUSU9OLCAxLCAxLAorICAgICAgICAgIE5VTEwpOworICAgIH0KKyAgICBpZiAoIWZyb21fcGFyKSB7CisgICAgICBnX3ZhbHVlX2luaXQgKCZmcGFyLCBHU1RfVFlQRV9GUkFDVElPTik7CisgICAgICBnc3RfdmFsdWVfc2V0X2ZyYWN0aW9uICgmZnBhciwgMSwgMSk7CisgICAgICBmcm9tX3BhciA9ICZmcGFyOworICAgIH0KKyAgfQorCisgIC8qIHdlIGhhdmUgYm90aCBQQVIgYnV0IHRoZXkgbWlnaHQgbm90IGJlIGZpeGF0ZWQgKi8KKyAgeworICAgIGdpbnQgZnJvbV93LCBmcm9tX2gsIGZyb21fcGFyX24sIGZyb21fcGFyX2QsIHRvX3Bhcl9uLCB0b19wYXJfZDsKKyAgICBnaW50IHcgPSAwLCBoID0gMDsKKyAgICBnaW50IGZyb21fZGFyX24sIGZyb21fZGFyX2Q7CisgICAgZ2ludCBudW0sIGRlbjsKKworICAgIC8qIGZyb21fcGFyIHNob3VsZCBiZSBmaXhlZCAqLworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChnc3RfdmFsdWVfaXNfZml4ZWQgKGZyb21fcGFyKSwgb3RoZXJjYXBzKTsKKworICAgIGZyb21fcGFyX24gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX251bWVyYXRvciAoZnJvbV9wYXIpOworICAgIGZyb21fcGFyX2QgPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX2Rlbm9taW5hdG9yIChmcm9tX3Bhcik7CisKKyAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKGlucywgIndpZHRoIiwgJmZyb21fdyk7CisgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChpbnMsICJoZWlnaHQiLCAmZnJvbV9oKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAob3V0cywgIndpZHRoIiwgJncpOworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAob3V0cywgImhlaWdodCIsICZoKTsKKworICAgIC8qIGlmIGJvdGggd2lkdGggYW5kIGhlaWdodCBhcmUgYWxyZWFkeSBmaXhlZCwgd2UgY2FuJ3QgZG8gYW55dGhpbmcKKyAgICAgKiBhYm91dCBpdCBhbnltb3JlICovCisgICAgaWYgKHcgJiYgaCkgeworICAgICAgZ3VpbnQgbiwgZDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAodHJhbnMsICJkaW1lbnNpb25zIGFscmVhZHkgc2V0IHRvICVkeCVkLCBub3QgZml4YXRpbmciLAorICAgICAgICAgIHcsIGgpOworICAgICAgaWYgKCFnc3RfdmFsdWVfaXNfZml4ZWQgKHRvX3BhcikpIHsKKyAgICAgICAgaWYgKGdzdF92aWRlb19jYWxjdWxhdGVfZGlzcGxheV9yYXRpbyAoJm4sICZkLCBmcm9tX3csIGZyb21faCwKKyAgICAgICAgICAgICAgICBmcm9tX3Bhcl9uLCBmcm9tX3Bhcl9kLCB3LCBoKSkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHRyYW5zLCAiZml4YXRpbmcgdG9fcGFyIHRvICVkeCVkIiwgbiwgZCk7CisgICAgICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChvdXRzLCAicGl4ZWwtYXNwZWN0LXJhdGlvIikpCisgICAgICAgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ZyYWN0aW9uIChvdXRzLAorICAgICAgICAgICAgICAgICJwaXhlbC1hc3BlY3QtcmF0aW8iLCBuLCBkKTsKKyAgICAgICAgICBlbHNlIGlmIChuICE9IGQpCisgICAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAob3V0cywgInBpeGVsLWFzcGVjdC1yYXRpbyIsIEdTVF9UWVBFX0ZSQUNUSU9OLAorICAgICAgICAgICAgICAgIG4sIGQsIE5VTEwpOworICAgICAgICB9CisgICAgICB9CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRlIGlucHV0IERBUiAqLworICAgIGlmICghZ3N0X3V0aWxfZnJhY3Rpb25fbXVsdGlwbHkgKGZyb21fdywgZnJvbV9oLCBmcm9tX3Bhcl9uLCBmcm9tX3Bhcl9kLAorICAgICAgICAgICAgJmZyb21fZGFyX24sICZmcm9tX2Rhcl9kKSkgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHRyYW5zLCBDT1JFLCBORUdPVElBVElPTiwgKE5VTEwpLAorICAgICAgICAgICgiRXJyb3IgY2FsY3VsYXRpbmcgdGhlIG91dHB1dCBzY2FsZWQgc2l6ZSAtIGludGVnZXIgb3ZlcmZsb3ciKSk7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgR1NUX0RFQlVHX09CSkVDVCAodHJhbnMsICJJbnB1dCBEQVIgaXMgJWQvJWQiLCBmcm9tX2Rhcl9uLCBmcm9tX2Rhcl9kKTsKKworICAgIC8qIElmIGVpdGhlciB3aWR0aCBvciBoZWlnaHQgYXJlIGZpeGVkIHRoZXJlJ3Mgbm90IG11Y2ggd2UKKyAgICAgKiBjYW4gZG8gZWl0aGVyIGV4Y2VwdCBjaG9vc2luZyBhIGhlaWdodCBvciB3aWR0aCBhbmQgUEFSCisgICAgICogdGhhdCBtYXRjaGVzIHRoZSBEQVIgYXMgZ29vZCBhcyBwb3NzaWJsZQorICAgICAqLworICAgIGlmIChoKSB7CisgICAgICBHc3RTdHJ1Y3R1cmUgKnRtcDsKKyAgICAgIGdpbnQgc2V0X3csIHNldF9wYXJfbiwgc2V0X3Bhcl9kOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUICh0cmFucywgImhlaWdodCBpcyBmaXhlZCAoJWQpIiwgaCk7CisKKyAgICAgIC8qIElmIHRoZSBQQVIgaXMgZml4ZWQgdG9vLCB0aGVyZSdzIG5vdCBtdWNoIHRvIGRvCisgICAgICAgKiBleGNlcHQgY2hvb3NpbmcgdGhlIHdpZHRoIHRoYXQgaXMgbmVhcmVzdCB0byB0aGUKKyAgICAgICAqIHdpZHRoIHdpdGggdGhlIHNhbWUgREFSICovCisgICAgICBpZiAoZ3N0X3ZhbHVlX2lzX2ZpeGVkICh0b19wYXIpKSB7CisgICAgICAgIHRvX3Bhcl9uID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9udW1lcmF0b3IgKHRvX3Bhcik7CisgICAgICAgIHRvX3Bhcl9kID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9kZW5vbWluYXRvciAodG9fcGFyKTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh0cmFucywgIlBBUiBpcyBmaXhlZCAlZC8lZCIsIHRvX3Bhcl9uLCB0b19wYXJfZCk7CisKKyAgICAgICAgaWYgKCFnc3RfdXRpbF9mcmFjdGlvbl9tdWx0aXBseSAoZnJvbV9kYXJfbiwgZnJvbV9kYXJfZCwgdG9fcGFyX2QsCisgICAgICAgICAgICAgICAgdG9fcGFyX24sICZudW0sICZkZW4pKSB7CisgICAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHRyYW5zLCBDT1JFLCBORUdPVElBVElPTiwgKE5VTEwpLAorICAgICAgICAgICAgICAoIkVycm9yIGNhbGN1bGF0aW5nIHRoZSBvdXRwdXQgc2NhbGVkIHNpemUgLSBpbnRlZ2VyIG92ZXJmbG93IikpOworICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorCisgICAgICAgIHcgPSAoZ3VpbnQpIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKGgsIG51bSwgZGVuKTsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGRfbmVhcmVzdF9pbnQgKG91dHMsICJ3aWR0aCIsIHcpOworCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKworICAgICAgLyogVGhlIFBBUiBpcyBub3QgZml4ZWQgYW5kIGl0J3MgcXVpdGUgbGlrZWx5IHRoYXQgd2UgY2FuIHNldAorICAgICAgICogYW4gYXJiaXRyYXJ5IFBBUi4gKi8KKworICAgICAgLyogQ2hlY2sgaWYgd2UgY2FuIGtlZXAgdGhlIGlucHV0IHdpZHRoICovCisgICAgICB0bXAgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKG91dHMpOworICAgICAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGRfbmVhcmVzdF9pbnQgKHRtcCwgIndpZHRoIiwgZnJvbV93KTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAodG1wLCAid2lkdGgiLCAmc2V0X3cpOworCisgICAgICAvKiBNaWdodCBoYXZlIGZhaWxlZCBidXQgdHJ5IHRvIGtlZXAgdGhlIERBUiBub25ldGhlbGVzcyBieQorICAgICAgICogYWRqdXN0aW5nIHRoZSBQQVIgKi8KKyAgICAgIGlmICghZ3N0X3V0aWxfZnJhY3Rpb25fbXVsdGlwbHkgKGZyb21fZGFyX24sIGZyb21fZGFyX2QsIGgsIHNldF93LAorICAgICAgICAgICAgICAmdG9fcGFyX24sICZ0b19wYXJfZCkpIHsKKyAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHRyYW5zLCBDT1JFLCBORUdPVElBVElPTiwgKE5VTEwpLAorICAgICAgICAgICAgKCJFcnJvciBjYWxjdWxhdGluZyB0aGUgb3V0cHV0IHNjYWxlZCBzaXplIC0gaW50ZWdlciBvdmVyZmxvdyIpKTsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlICh0bXApOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisKKyAgICAgIGlmICghZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHRtcCwgInBpeGVsLWFzcGVjdC1yYXRpbyIpKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAodG1wLCAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgdG9fcGFyKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfZnJhY3Rpb24gKHRtcCwgInBpeGVsLWFzcGVjdC1yYXRpbyIsCisgICAgICAgICAgdG9fcGFyX24sIHRvX3Bhcl9kKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ZyYWN0aW9uICh0bXAsICJwaXhlbC1hc3BlY3QtcmF0aW8iLCAmc2V0X3Bhcl9uLAorICAgICAgICAgICZzZXRfcGFyX2QpOworICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlICh0bXApOworCisgICAgICAvKiBDaGVjayBpZiB0aGUgYWRqdXN0ZWQgUEFSIGlzIGFjY2VwdGVkICovCisgICAgICBpZiAoc2V0X3Bhcl9uID09IHRvX3Bhcl9uICYmIHNldF9wYXJfZCA9PSB0b19wYXJfZCkgeworICAgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKG91dHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iKSB8fAorICAgICAgICAgICAgc2V0X3Bhcl9uICE9IHNldF9wYXJfZCkKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAob3V0cywgIndpZHRoIiwgR19UWVBFX0lOVCwgc2V0X3csCisgICAgICAgICAgICAgICJwaXhlbC1hc3BlY3QtcmF0aW8iLCBHU1RfVFlQRV9GUkFDVElPTiwgc2V0X3Bhcl9uLCBzZXRfcGFyX2QsCisgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisKKyAgICAgIC8qIE90aGVyd2lzZSBzY2FsZSB0aGUgd2lkdGggdG8gdGhlIG5ldyBQQVIgYW5kIGNoZWNrIGlmIHRoZQorICAgICAgICogYWRqdXN0ZWQgd2l0aCBpcyBhY2NlcHRlZC4gSWYgYWxsIHRoYXQgZmFpbHMgd2UgY2FuJ3Qga2VlcAorICAgICAgICogdGhlIERBUiAqLworICAgICAgaWYgKCFnc3RfdXRpbF9mcmFjdGlvbl9tdWx0aXBseSAoZnJvbV9kYXJfbiwgZnJvbV9kYXJfZCwgc2V0X3Bhcl9kLAorICAgICAgICAgICAgICBzZXRfcGFyX24sICZudW0sICZkZW4pKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SICh0cmFucywgQ09SRSwgTkVHT1RJQVRJT04sIChOVUxMKSwKKyAgICAgICAgICAgICgiRXJyb3IgY2FsY3VsYXRpbmcgdGhlIG91dHB1dCBzY2FsZWQgc2l6ZSAtIGludGVnZXIgb3ZlcmZsb3ciKSk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKworICAgICAgdyA9IChndWludCkgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoaCwgbnVtLCBkZW4pOworICAgICAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGRfbmVhcmVzdF9pbnQgKG91dHMsICJ3aWR0aCIsIHcpOworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChvdXRzLCAicGl4ZWwtYXNwZWN0LXJhdGlvIikgfHwKKyAgICAgICAgICBzZXRfcGFyX24gIT0gc2V0X3Bhcl9kKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAob3V0cywgInBpeGVsLWFzcGVjdC1yYXRpbyIsIEdTVF9UWVBFX0ZSQUNUSU9OLAorICAgICAgICAgICAgc2V0X3Bhcl9uLCBzZXRfcGFyX2QsIE5VTEwpOworCisgICAgICBnb3RvIGRvbmU7CisgICAgfSBlbHNlIGlmICh3KSB7CisgICAgICBHc3RTdHJ1Y3R1cmUgKnRtcDsKKyAgICAgIGdpbnQgc2V0X2gsIHNldF9wYXJfbiwgc2V0X3Bhcl9kOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUICh0cmFucywgIndpZHRoIGlzIGZpeGVkICglZCkiLCB3KTsKKworICAgICAgLyogSWYgdGhlIFBBUiBpcyBmaXhlZCB0b28sIHRoZXJlJ3Mgbm90IG11Y2ggdG8gZG8KKyAgICAgICAqIGV4Y2VwdCBjaG9vc2luZyB0aGUgaGVpZ2h0IHRoYXQgaXMgbmVhcmVzdCB0byB0aGUKKyAgICAgICAqIGhlaWdodCB3aXRoIHRoZSBzYW1lIERBUiAqLworICAgICAgaWYgKGdzdF92YWx1ZV9pc19maXhlZCAodG9fcGFyKSkgeworICAgICAgICB0b19wYXJfbiA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fbnVtZXJhdG9yICh0b19wYXIpOworICAgICAgICB0b19wYXJfZCA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fZGVub21pbmF0b3IgKHRvX3Bhcik7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAodHJhbnMsICJQQVIgaXMgZml4ZWQgJWQvJWQiLCB0b19wYXJfbiwgdG9fcGFyX2QpOworCisgICAgICAgIGlmICghZ3N0X3V0aWxfZnJhY3Rpb25fbXVsdGlwbHkgKGZyb21fZGFyX24sIGZyb21fZGFyX2QsIHRvX3Bhcl9kLAorICAgICAgICAgICAgICAgIHRvX3Bhcl9uLCAmbnVtLCAmZGVuKSkgeworICAgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SICh0cmFucywgQ09SRSwgTkVHT1RJQVRJT04sIChOVUxMKSwKKyAgICAgICAgICAgICAgKCJFcnJvciBjYWxjdWxhdGluZyB0aGUgb3V0cHV0IHNjYWxlZCBzaXplIC0gaW50ZWdlciBvdmVyZmxvdyIpKTsKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKworICAgICAgICBoID0gKGd1aW50KSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50ICh3LCBkZW4sIG51bSk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfaW50IChvdXRzLCAiaGVpZ2h0IiwgaCk7CisKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorCisgICAgICAvKiBUaGUgUEFSIGlzIG5vdCBmaXhlZCBhbmQgaXQncyBxdWl0ZSBsaWtlbHkgdGhhdCB3ZSBjYW4gc2V0CisgICAgICAgKiBhbiBhcmJpdHJhcnkgUEFSLiAqLworCisgICAgICAvKiBDaGVjayBpZiB3ZSBjYW4ga2VlcCB0aGUgaW5wdXQgaGVpZ2h0ICovCisgICAgICB0bXAgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKG91dHMpOworICAgICAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGRfbmVhcmVzdF9pbnQgKHRtcCwgImhlaWdodCIsIGZyb21faCk7CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHRtcCwgImhlaWdodCIsICZzZXRfaCk7CisKKyAgICAgIC8qIE1pZ2h0IGhhdmUgZmFpbGVkIGJ1dCB0cnkgdG8ga2VlcCB0aGUgREFSIG5vbmV0aGVsZXNzIGJ5CisgICAgICAgKiBhZGp1c3RpbmcgdGhlIFBBUiAqLworICAgICAgaWYgKCFnc3RfdXRpbF9mcmFjdGlvbl9tdWx0aXBseSAoZnJvbV9kYXJfbiwgZnJvbV9kYXJfZCwgc2V0X2gsIHcsCisgICAgICAgICAgICAgICZ0b19wYXJfbiwgJnRvX3Bhcl9kKSkgeworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAodHJhbnMsIENPUkUsIE5FR09USUFUSU9OLCAoTlVMTCksCisgICAgICAgICAgICAoIkVycm9yIGNhbGN1bGF0aW5nIHRoZSBvdXRwdXQgc2NhbGVkIHNpemUgLSBpbnRlZ2VyIG92ZXJmbG93IikpOworICAgICAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHRtcCk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICAgIGlmICghZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHRtcCwgInBpeGVsLWFzcGVjdC1yYXRpbyIpKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAodG1wLCAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgdG9fcGFyKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfZnJhY3Rpb24gKHRtcCwgInBpeGVsLWFzcGVjdC1yYXRpbyIsCisgICAgICAgICAgdG9fcGFyX24sIHRvX3Bhcl9kKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ZyYWN0aW9uICh0bXAsICJwaXhlbC1hc3BlY3QtcmF0aW8iLCAmc2V0X3Bhcl9uLAorICAgICAgICAgICZzZXRfcGFyX2QpOworICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlICh0bXApOworCisgICAgICAvKiBDaGVjayBpZiB0aGUgYWRqdXN0ZWQgUEFSIGlzIGFjY2VwdGVkICovCisgICAgICBpZiAoc2V0X3Bhcl9uID09IHRvX3Bhcl9uICYmIHNldF9wYXJfZCA9PSB0b19wYXJfZCkgeworICAgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKG91dHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iKSB8fAorICAgICAgICAgICAgc2V0X3Bhcl9uICE9IHNldF9wYXJfZCkKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAob3V0cywgImhlaWdodCIsIEdfVFlQRV9JTlQsIHNldF9oLAorICAgICAgICAgICAgICAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgR1NUX1RZUEVfRlJBQ1RJT04sIHNldF9wYXJfbiwgc2V0X3Bhcl9kLAorICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorCisgICAgICAvKiBPdGhlcndpc2Ugc2NhbGUgdGhlIGhlaWdodCB0byB0aGUgbmV3IFBBUiBhbmQgY2hlY2sgaWYgdGhlCisgICAgICAgKiBhZGp1c3RlZCB3aXRoIGlzIGFjY2VwdGVkLiBJZiBhbGwgdGhhdCBmYWlscyB3ZSBjYW4ndCBrZWVwCisgICAgICAgKiB0aGUgREFSICovCisgICAgICBpZiAoIWdzdF91dGlsX2ZyYWN0aW9uX211bHRpcGx5IChmcm9tX2Rhcl9uLCBmcm9tX2Rhcl9kLCBzZXRfcGFyX2QsCisgICAgICAgICAgICAgIHNldF9wYXJfbiwgJm51bSwgJmRlbikpIHsKKyAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHRyYW5zLCBDT1JFLCBORUdPVElBVElPTiwgKE5VTEwpLAorICAgICAgICAgICAgKCJFcnJvciBjYWxjdWxhdGluZyB0aGUgb3V0cHV0IHNjYWxlZCBzaXplIC0gaW50ZWdlciBvdmVyZmxvdyIpKTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorCisgICAgICBoID0gKGd1aW50KSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50ICh3LCBkZW4sIG51bSk7CisgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ludCAob3V0cywgImhlaWdodCIsIGgpOworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChvdXRzLCAicGl4ZWwtYXNwZWN0LXJhdGlvIikgfHwKKyAgICAgICAgICBzZXRfcGFyX24gIT0gc2V0X3Bhcl9kKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAob3V0cywgInBpeGVsLWFzcGVjdC1yYXRpbyIsIEdTVF9UWVBFX0ZSQUNUSU9OLAorICAgICAgICAgICAgc2V0X3Bhcl9uLCBzZXRfcGFyX2QsIE5VTEwpOworCisgICAgICBnb3RvIGRvbmU7CisgICAgfSBlbHNlIGlmIChnc3RfdmFsdWVfaXNfZml4ZWQgKHRvX3BhcikpIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqdG1wOworICAgICAgZ2ludCBzZXRfaCwgc2V0X3csIGZfaCwgZl93OworCisgICAgICB0b19wYXJfbiA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fbnVtZXJhdG9yICh0b19wYXIpOworICAgICAgdG9fcGFyX2QgPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX2Rlbm9taW5hdG9yICh0b19wYXIpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUICh0cmFucywgIlBBUiBpcyBmaXhlZCAlZC8lZCIsIHRvX3Bhcl9uLCB0b19wYXJfZCk7CisKKyAgICAgIC8qIENhbGN1bGF0ZSBzY2FsZSBmYWN0b3IgZm9yIHRoZSBQQVIgY2hhbmdlICovCisgICAgICBpZiAoIWdzdF91dGlsX2ZyYWN0aW9uX211bHRpcGx5IChmcm9tX2Rhcl9uLCBmcm9tX2Rhcl9kLCB0b19wYXJfZCwKKyAgICAgICAgICAgICAgdG9fcGFyX24sICZudW0sICZkZW4pKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SICh0cmFucywgQ09SRSwgTkVHT1RJQVRJT04sIChOVUxMKSwKKyAgICAgICAgICAgICgiRXJyb3IgY2FsY3VsYXRpbmcgdGhlIG91dHB1dCBzY2FsZWQgc2l6ZSAtIGludGVnZXIgb3ZlcmZsb3ciKSk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKworICAgICAgLyogVHJ5IHRvIGtlZXAgdGhlIGlucHV0IGhlaWdodCAoYmVjYXVzZSBvZiBpbnRlcmxhY2luZykgKi8KKyAgICAgIHRtcCA9IGdzdF9zdHJ1Y3R1cmVfY29weSAob3V0cyk7CisgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ludCAodG1wLCAiaGVpZ2h0IiwgZnJvbV9oKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAodG1wLCAiaGVpZ2h0IiwgJnNldF9oKTsKKworICAgICAgLyogVGhpcyBtaWdodCBoYXZlIGZhaWxlZCBidXQgdHJ5IHRvIHNjYWxlIHRoZSB3aWR0aAorICAgICAgICogdG8ga2VlcCB0aGUgREFSIG5vbmV0aGVsZXNzICovCisgICAgICB3ID0gKGd1aW50KSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChzZXRfaCwgbnVtLCBkZW4pOworICAgICAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGRfbmVhcmVzdF9pbnQgKHRtcCwgIndpZHRoIiwgdyk7CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHRtcCwgIndpZHRoIiwgJnNldF93KTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAodG1wKTsKKworICAgICAgLyogV2Uga2VwdCB0aGUgREFSIGFuZCB0aGUgaGVpZ2h0IGlzIG5lYXJlc3QgdG8gdGhlIG9yaWdpbmFsIGhlaWdodCAqLworICAgICAgaWYgKHNldF93ID09IHcpIHsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG91dHMsICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHNldF93LCAiaGVpZ2h0IiwKKyAgICAgICAgICAgIEdfVFlQRV9JTlQsIHNldF9oLCBOVUxMKTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorCisgICAgICBmX2ggPSBzZXRfaDsKKyAgICAgIGZfdyA9IHNldF93OworCisgICAgICAvKiBJZiB0aGUgZm9ybWVyIGZhaWxlZCwgdHJ5IHRvIGtlZXAgdGhlIGlucHV0IHdpZHRoIGF0IGxlYXN0ICovCisgICAgICB0bXAgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKG91dHMpOworICAgICAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGRfbmVhcmVzdF9pbnQgKHRtcCwgIndpZHRoIiwgZnJvbV93KTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAodG1wLCAid2lkdGgiLCAmc2V0X3cpOworCisgICAgICAvKiBUaGlzIG1pZ2h0IGhhdmUgZmFpbGVkIGJ1dCB0cnkgdG8gc2NhbGUgdGhlIHdpZHRoCisgICAgICAgKiB0byBrZWVwIHRoZSBEQVIgbm9uZXRoZWxlc3MgKi8KKyAgICAgIGggPSAoZ3VpbnQpIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHNldF93LCBkZW4sIG51bSk7CisgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ludCAodG1wLCAiaGVpZ2h0IiwgaCk7CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHRtcCwgImhlaWdodCIsICZzZXRfaCk7CisgICAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHRtcCk7CisKKyAgICAgIC8qIFdlIGtlcHQgdGhlIERBUiBhbmQgdGhlIHdpZHRoIGlzIG5lYXJlc3QgdG8gdGhlIG9yaWdpbmFsIHdpZHRoICovCisgICAgICBpZiAoc2V0X2ggPT0gaCkgeworICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAob3V0cywgIndpZHRoIiwgR19UWVBFX0lOVCwgc2V0X3csICJoZWlnaHQiLAorICAgICAgICAgICAgR19UWVBFX0lOVCwgc2V0X2gsIE5VTEwpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisKKyAgICAgIC8qIElmIGFsbCB0aGlzIGZhaWxlZCwga2VlcCB0aGUgaGVpZ2h0IHRoYXQgd2FzIG5lYXJlc3QgdG8gdGhlIG9yaWduYWwKKyAgICAgICAqIGhlaWdodCBhbmQgdGhlIG5lYXJlc3QgcG9zc2libGUgd2lkdGguIFRoaXMgY2hhbmdlcyB0aGUgREFSIGJ1dAorICAgICAgICogdGhlcmUncyBub3QgbXVjaCBlbHNlIHRvIGRvIGhlcmUuCisgICAgICAgKi8KKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChvdXRzLCAid2lkdGgiLCBHX1RZUEVfSU5ULCBmX3csICJoZWlnaHQiLCBHX1RZUEVfSU5ULAorICAgICAgICAgIGZfaCwgTlVMTCk7CisgICAgICBnb3RvIGRvbmU7CisgICAgfSBlbHNlIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqdG1wOworICAgICAgZ2ludCBzZXRfaCwgc2V0X3csIHNldF9wYXJfbiwgc2V0X3Bhcl9kLCB0bXAyOworCisgICAgICAvKiB3aWR0aCwgaGVpZ2h0IGFuZCBQQVIgYXJlIG5vdCBmaXhlZCBidXQgcGFzc3Rocm91Z2ggaXMgbm90IHBvc3NpYmxlICovCisKKyAgICAgIC8qIEZpcnN0IHRyeSB0byBrZWVwIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGFzIGdvb2QgYXMgcG9zc2libGUKKyAgICAgICAqIGFuZCBzY2FsZSBQQVIgKi8KKyAgICAgIHRtcCA9IGdzdF9zdHJ1Y3R1cmVfY29weSAob3V0cyk7CisgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ludCAodG1wLCAiaGVpZ2h0IiwgZnJvbV9oKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAodG1wLCAiaGVpZ2h0IiwgJnNldF9oKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfaW50ICh0bXAsICJ3aWR0aCIsIGZyb21fdyk7CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHRtcCwgIndpZHRoIiwgJnNldF93KTsKKworICAgICAgaWYgKCFnc3RfdXRpbF9mcmFjdGlvbl9tdWx0aXBseSAoZnJvbV9kYXJfbiwgZnJvbV9kYXJfZCwgc2V0X2gsIHNldF93LAorICAgICAgICAgICAgICAmdG9fcGFyX24sICZ0b19wYXJfZCkpIHsKKyAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHRyYW5zLCBDT1JFLCBORUdPVElBVElPTiwgKE5VTEwpLAorICAgICAgICAgICAgKCJFcnJvciBjYWxjdWxhdGluZyB0aGUgb3V0cHV0IHNjYWxlZCBzaXplIC0gaW50ZWdlciBvdmVyZmxvdyIpKTsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlICh0bXApOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisKKyAgICAgIGlmICghZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHRtcCwgInBpeGVsLWFzcGVjdC1yYXRpbyIpKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAodG1wLCAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgdG9fcGFyKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfZnJhY3Rpb24gKHRtcCwgInBpeGVsLWFzcGVjdC1yYXRpbyIsCisgICAgICAgICAgdG9fcGFyX24sIHRvX3Bhcl9kKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ZyYWN0aW9uICh0bXAsICJwaXhlbC1hc3BlY3QtcmF0aW8iLCAmc2V0X3Bhcl9uLAorICAgICAgICAgICZzZXRfcGFyX2QpOworICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlICh0bXApOworCisgICAgICBpZiAoc2V0X3Bhcl9uID09IHRvX3Bhcl9uICYmIHNldF9wYXJfZCA9PSB0b19wYXJfZCkgeworICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAob3V0cywgIndpZHRoIiwgR19UWVBFX0lOVCwgc2V0X3csICJoZWlnaHQiLAorICAgICAgICAgICAgR19UWVBFX0lOVCwgc2V0X2gsIE5VTEwpOworCisgICAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAob3V0cywgInBpeGVsLWFzcGVjdC1yYXRpbyIpIHx8CisgICAgICAgICAgICBzZXRfcGFyX24gIT0gc2V0X3Bhcl9kKQorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChvdXRzLCAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgR1NUX1RZUEVfRlJBQ1RJT04sCisgICAgICAgICAgICAgIHNldF9wYXJfbiwgc2V0X3Bhcl9kLCBOVUxMKTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorCisgICAgICAvKiBPdGhlcndpc2UgdHJ5IHRvIHNjYWxlIHdpZHRoIHRvIGtlZXAgdGhlIERBUiB3aXRoIHRoZSBzZXQKKyAgICAgICAqIFBBUiBhbmQgaGVpZ2h0ICovCisgICAgICBpZiAoIWdzdF91dGlsX2ZyYWN0aW9uX211bHRpcGx5IChmcm9tX2Rhcl9uLCBmcm9tX2Rhcl9kLCBzZXRfcGFyX2QsCisgICAgICAgICAgICAgIHNldF9wYXJfbiwgJm51bSwgJmRlbikpIHsKKyAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHRyYW5zLCBDT1JFLCBORUdPVElBVElPTiwgKE5VTEwpLAorICAgICAgICAgICAgKCJFcnJvciBjYWxjdWxhdGluZyB0aGUgb3V0cHV0IHNjYWxlZCBzaXplIC0gaW50ZWdlciBvdmVyZmxvdyIpKTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorCisgICAgICB3ID0gKGd1aW50KSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChzZXRfaCwgbnVtLCBkZW4pOworICAgICAgdG1wID0gZ3N0X3N0cnVjdHVyZV9jb3B5IChvdXRzKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfaW50ICh0bXAsICJ3aWR0aCIsIHcpOworICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50ICh0bXAsICJ3aWR0aCIsICZ0bXAyKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAodG1wKTsKKworICAgICAgaWYgKHRtcDIgPT0gdykgeworICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAob3V0cywgIndpZHRoIiwgR19UWVBFX0lOVCwgdG1wMiwgImhlaWdodCIsCisgICAgICAgICAgICBHX1RZUEVfSU5ULCBzZXRfaCwgTlVMTCk7CisgICAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAob3V0cywgInBpeGVsLWFzcGVjdC1yYXRpbyIpIHx8CisgICAgICAgICAgICBzZXRfcGFyX24gIT0gc2V0X3Bhcl9kKQorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChvdXRzLCAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgR1NUX1RZUEVfRlJBQ1RJT04sCisgICAgICAgICAgICAgIHNldF9wYXJfbiwgc2V0X3Bhcl9kLCBOVUxMKTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorCisgICAgICAvKiAuLi4gb3IgdHJ5IHRoZSBzYW1lIHdpdGggdGhlIGhlaWdodCAqLworICAgICAgaCA9IChndWludCkgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoc2V0X3csIGRlbiwgbnVtKTsKKyAgICAgIHRtcCA9IGdzdF9zdHJ1Y3R1cmVfY29weSAob3V0cyk7CisgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ludCAodG1wLCAiaGVpZ2h0IiwgaCk7CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHRtcCwgImhlaWdodCIsICZ0bXAyKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAodG1wKTsKKworICAgICAgaWYgKHRtcDIgPT0gaCkgeworICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAob3V0cywgIndpZHRoIiwgR19UWVBFX0lOVCwgc2V0X3csICJoZWlnaHQiLAorICAgICAgICAgICAgR19UWVBFX0lOVCwgdG1wMiwgTlVMTCk7CisgICAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAob3V0cywgInBpeGVsLWFzcGVjdC1yYXRpbyIpIHx8CisgICAgICAgICAgICBzZXRfcGFyX24gIT0gc2V0X3Bhcl9kKQorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChvdXRzLCAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgR1NUX1RZUEVfRlJBQ1RJT04sCisgICAgICAgICAgICAgIHNldF9wYXJfbiwgc2V0X3Bhcl9kLCBOVUxMKTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorCisgICAgICAvKiBJZiBhbGwgZmFpbHMgd2UgY2FuJ3Qga2VlcCB0aGUgREFSIGFuZCB0YWtlIHRoZSBuZWFyZXN0IHZhbHVlcworICAgICAgICogZm9yIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgZmlyc3QgdHJ5ICovCisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAob3V0cywgIndpZHRoIiwgR19UWVBFX0lOVCwgc2V0X3csICJoZWlnaHQiLAorICAgICAgICAgIEdfVFlQRV9JTlQsIHNldF9oLCBOVUxMKTsKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAob3V0cywgInBpeGVsLWFzcGVjdC1yYXRpbyIpIHx8CisgICAgICAgICAgc2V0X3Bhcl9uICE9IHNldF9wYXJfZCkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG91dHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iLCBHU1RfVFlQRV9GUkFDVElPTiwKKyAgICAgICAgICAgIHNldF9wYXJfbiwgc2V0X3Bhcl9kLCBOVUxMKTsKKyAgICB9CisgIH0KKworZG9uZToKKyAgR1NUX0RFQlVHX09CSkVDVCAodHJhbnMsICJmaXhhdGVkIG90aGVyY2FwcyB0byAlIiBHU1RfUFRSX0ZPUk1BVCwgb3RoZXJjYXBzKTsKKworICBpZiAoZnJvbV9wYXIgPT0gJmZwYXIpCisgICAgZ192YWx1ZV91bnNldCAoJmZwYXIpOworICBpZiAodG9fcGFyID09ICZ0cGFyKQorICAgIGdfdmFsdWVfdW5zZXQgKCZ0cGFyKTsKKworICAvKiBmaXhhdGUgcmVtYWluaW5nIGZpZWxkcyAqLworICBvdGhlcmNhcHMgPSBnc3RfY2Fwc19maXhhdGUgKG90aGVyY2Fwcyk7CisKKyAgaWYgKGRpcmVjdGlvbiA9PSBHU1RfUEFEX1NJTkspIHsKKyAgICBpZiAoZ3N0X2NhcHNfaXNfc3Vic2V0IChjYXBzLCBvdGhlcmNhcHMpKSB7CisgICAgICBnc3RfY2Fwc19yZXBsYWNlICgmb3RoZXJjYXBzLCBjYXBzKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gb3RoZXJjYXBzOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3Y0bDJfdHJhbnNmb3JtX3ByZXBhcmVfb3V0cHV0X2J1ZmZlciAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdEJ1ZmZlciAqIGluYnVmLCBHc3RCdWZmZXIgKiogb3V0YnVmKQoreworICBHc3RWNGwyVHJhbnNmb3JtICpzZWxmID0gR1NUX1Y0TDJfVFJBTlNGT1JNICh0cmFucyk7CisgIEdzdEJ1ZmZlclBvb2wgKnBvb2wgPSBHU1RfQlVGRkVSX1BPT0wgKHNlbGYtPnY0bDJvdXRwdXQtPnBvb2wpOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKmJjbGFzcyA9IEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAocGFyZW50X2NsYXNzKTsKKworICBpZiAoZ3N0X2Jhc2VfdHJhbnNmb3JtX2lzX3Bhc3N0aHJvdWdoICh0cmFucykpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiUGFzc3Rocm91Z2gsIG5vIG5lZWQgdG8gZG8gYW55dGhpbmciKTsKKyAgICAqb3V0YnVmID0gaW5idWY7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIC8qIEVuc3VyZSBpbnB1dCBpbnRlcm5hbCBwb29sIGlzIGFjdGl2ZSAqLworICBpZiAoIWdzdF9idWZmZXJfcG9vbF9pc19hY3RpdmUgKHBvb2wpKSB7CisgICAgR3N0U3RydWN0dXJlICpjb25maWcgPSBnc3RfYnVmZmVyX3Bvb2xfZ2V0X2NvbmZpZyAocG9vbCk7CisgICAgZ2ludCBtaW4gPSBzZWxmLT52NGwyb3V0cHV0LT5taW5fYnVmZmVycyA9PSAwID8gR1NUX1Y0TDJfTUlOX0JVRkZFUlMgOgorICAgICAgICBzZWxmLT52NGwyb3V0cHV0LT5taW5fYnVmZmVyczsKKyAgICBnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX3NldF9wYXJhbXMgKGNvbmZpZywgc2VsZi0+aW5jYXBzLAorICAgICAgICBzZWxmLT52NGwyb3V0cHV0LT5pbmZvLnNpemUsIG1pbiwgbWluKTsKKworICAgIC8qIFRoZXJlIGlzIG5vIHJlYXNvbiB0byByZWZ1c2UgdGhpcyBjb25maWcgKi8KKyAgICBpZiAoIWdzdF9idWZmZXJfcG9vbF9zZXRfY29uZmlnIChwb29sLCBjb25maWcpKQorICAgICAgZ290byBhY3RpdmF0ZV9mYWlsZWQ7CisKKyAgICBpZiAoIWdzdF9idWZmZXJfcG9vbF9zZXRfYWN0aXZlIChwb29sLCBUUlVFKSkKKyAgICAgIGdvdG8gYWN0aXZhdGVfZmFpbGVkOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlF1ZXVlIGlucHV0IGJ1ZmZlciIpOworICByZXQgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9wcm9jZXNzIChHU1RfVjRMMl9CVUZGRVJfUE9PTCAocG9vbCksICZpbmJ1Zik7CisgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spKQorICAgIGdvdG8gYmVhY2g7CisKKyAgZG8geworICAgIHBvb2wgPSBnc3RfYmFzZV90cmFuc2Zvcm1fZ2V0X2J1ZmZlcl9wb29sICh0cmFucyk7CisKKyAgICBpZiAoIWdzdF9idWZmZXJfcG9vbF9zZXRfYWN0aXZlIChwb29sLCBUUlVFKSkKKyAgICAgIGdvdG8gYWN0aXZhdGVfZmFpbGVkOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkRlcXVldWUgb3V0cHV0IGJ1ZmZlciIpOworICAgIHJldCA9IGdzdF9idWZmZXJfcG9vbF9hY3F1aXJlX2J1ZmZlciAocG9vbCwgb3V0YnVmLCBOVUxMKTsKKyAgICBnX29iamVjdF91bnJlZiAocG9vbCk7CisKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgZ290byBhbGxvY19mYWlsZWQ7CisKKyAgICBwb29sID0gc2VsZi0+djRsMmNhcHR1cmUtPnBvb2w7CisgICAgcmV0ID0gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcHJvY2VzcyAoR1NUX1Y0TDJfQlVGRkVSX1BPT0wgKHBvb2wpLCBvdXRidWYpOworCisgIH0gd2hpbGUgKHJldCA9PSBHU1RfVjRMMl9GTE9XX0NPUlJVUFRFRF9CVUZGRVIpOworCisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmICgqb3V0YnVmKTsKKyAgICAqb3V0YnVmID0gTlVMTDsKKyAgfQorCisgIGlmIChiY2xhc3MtPmNvcHlfbWV0YWRhdGEpCisgICAgaWYgKCFiY2xhc3MtPmNvcHlfbWV0YWRhdGEgKHRyYW5zLCBpbmJ1ZiwgKm91dGJ1ZikpIHsKKyAgICAgIC8qIHNvbWV0aGluZyBmYWlsZWQsIHBvc3QgYSB3YXJuaW5nICovCisgICAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChzZWxmLCBTVFJFQU0sIE5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAoImNvdWxkIG5vdCBjb3B5IG1ldGFkYXRhIiksIChOVUxMKSk7CisgICAgfQorCitiZWFjaDoKKyAgcmV0dXJuIHJldDsKKworYWN0aXZhdGVfZmFpbGVkOgorICBHU1RfRUxFTUVOVF9FUlJPUiAoc2VsZiwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgKCJmYWlsZWQgdG8gYWN0aXZhdGUgYnVmZmVycG9vbCIpLCAoImZhaWxlZCB0byBhY3RpdmF0ZSBidWZmZXJwb29sIikpOworICBnX29iamVjdF91bnJlZiAocG9vbCk7CisgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKworYWxsb2NfZmFpbGVkOgorICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiY291bGQgbm90IGFsbG9jYXRlIGJ1ZmZlciBmcm9tIHBvb2wiKTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92NGwyX3RyYW5zZm9ybV90cmFuc2Zvcm0gKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywgR3N0QnVmZmVyICogaW5idWYsCisgICAgR3N0QnVmZmVyICogb3V0YnVmKQoreworICAvKiBOb3RoaW5nIHRvIGRvICovCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl90cmFuc2Zvcm1fc2lua19ldmVudCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RWNGwyVHJhbnNmb3JtICpzZWxmID0gR1NUX1Y0TDJfVFJBTlNGT1JNICh0cmFucyk7CisgIGdib29sZWFuIHJldDsKKworICAvKiBOb3RoaW5nIHRvIGZsdXNoIGluIHBhc3N0aHJvdWdoICovCisgIGlmIChnc3RfYmFzZV90cmFuc2Zvcm1faXNfcGFzc3Rocm91Z2ggKHRyYW5zKSkKKyAgICByZXR1cm4gR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50ICh0cmFucywgZXZlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUQVJUOgorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImZsdXNoIHN0YXJ0Iik7CisgICAgICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrIChzZWxmLT52NGwyb3V0cHV0KTsKKyAgICAgIGdzdF92NGwyX29iamVjdF91bmxvY2sgKHNlbGYtPnY0bDJjYXB0dXJlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2lua19ldmVudCAodHJhbnMsIGV2ZW50KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgLyogQnVmZmVyIHNob3VsZCBiZSBiYWNrIG5vdyAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImZsdXNoIHN0b3AiKTsKKyAgICAgIGdzdF92NGwyX29iamVjdF91bmxvY2tfc3RvcCAoc2VsZi0+djRsMmNhcHR1cmUpOworICAgICAgZ3N0X3Y0bDJfb2JqZWN0X3VubG9ja19zdG9wIChzZWxmLT52NGwyb3V0cHV0KTsKKyAgICAgIGdzdF92NGwyX2J1ZmZlcl9wb29sX2ZsdXNoIChzZWxmLT52NGwyb3V0cHV0LT5wb29sKTsKKyAgICAgIGdzdF92NGwyX2J1ZmZlcl9wb29sX2ZsdXNoIChzZWxmLT52NGwyY2FwdHVyZS0+cG9vbCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF92NGwyX3RyYW5zZm9ybV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFY0bDJUcmFuc2Zvcm0gKnNlbGYgPSBHU1RfVjRMMl9UUkFOU0ZPUk0gKGVsZW1lbnQpOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBpZiAoIWdzdF92NGwyX3RyYW5zZm9ybV9vcGVuIChzZWxmKSkKKyAgICAgICAgcmV0dXJuIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrIChzZWxmLT52NGwyb3V0cHV0KTsKKyAgICAgIGdzdF92NGwyX29iamVjdF91bmxvY2sgKHNlbGYtPnY0bDJjYXB0dXJlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgZ3N0X3Y0bDJfdHJhbnNmb3JtX2Nsb3NlIChzZWxmKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl90cmFuc2Zvcm1fZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0VjRsMlRyYW5zZm9ybSAqc2VsZiA9IEdTVF9WNEwyX1RSQU5TRk9STSAob2JqZWN0KTsKKworICBnc3RfY2Fwc19yZXBsYWNlICgmc2VsZi0+cHJvYmVkX3NpbmtjYXBzLCBOVUxMKTsKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNlbGYtPnByb2JlZF9zcmNjYXBzLCBOVUxMKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3RyYW5zZm9ybV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0VjRsMlRyYW5zZm9ybSAqc2VsZiA9IEdTVF9WNEwyX1RSQU5TRk9STSAob2JqZWN0KTsKKworICBnc3RfdjRsMl9vYmplY3RfZGVzdHJveSAoc2VsZi0+djRsMmNhcHR1cmUpOworICBnc3RfdjRsMl9vYmplY3RfZGVzdHJveSAoc2VsZi0+djRsMm91dHB1dCk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdHJhbnNmb3JtX2luaXQgKEdzdFY0bDJUcmFuc2Zvcm0gKiBzZWxmKQoreworICAvKiBWNEwyIG9iamVjdCBhcmUgY3JlYXRlZCBpbiBzdWJpbnN0YW5jZV9pbml0ICovCisgIC8qIGVuYWJsZSBRb1MgKi8KKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9xb3NfZW5hYmxlZCAoR1NUX0JBU0VfVFJBTlNGT1JNIChzZWxmKSwgVFJVRSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl90cmFuc2Zvcm1fc3ViaW5zdGFuY2VfaW5pdCAoR1R5cGVJbnN0YW5jZSAqIGluc3RhbmNlLCBncG9pbnRlciBnX2NsYXNzKQoreworICBHc3RWNGwyVHJhbnNmb3JtQ2xhc3MgKmtsYXNzID0gR1NUX1Y0TDJfVFJBTlNGT1JNX0NMQVNTIChnX2NsYXNzKTsKKyAgR3N0VjRsMlRyYW5zZm9ybSAqc2VsZiA9IEdTVF9WNEwyX1RSQU5TRk9STSAoaW5zdGFuY2UpOworCisgIHNlbGYtPnY0bDJvdXRwdXQgPSBnc3RfdjRsMl9vYmplY3RfbmV3IChHU1RfRUxFTUVOVCAoc2VsZiksCisgICAgICBHU1RfT0JKRUNUIChHU1RfQkFTRV9UUkFOU0ZPUk1fU0lOS19QQUQgKHNlbGYpKSwKKyAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVULCBrbGFzcy0+ZGVmYXVsdF9kZXZpY2UsCisgICAgICBnc3RfdjRsMl9nZXRfb3V0cHV0LCBnc3RfdjRsMl9zZXRfb3V0cHV0LCBOVUxMKTsKKyAgc2VsZi0+djRsMm91dHB1dC0+bm9faW5pdGlhbF9mb3JtYXQgPSBUUlVFOworICBzZWxmLT52NGwyb3V0cHV0LT5rZWVwX2FzcGVjdCA9IEZBTFNFOworCisgIHNlbGYtPnY0bDJjYXB0dXJlID0gZ3N0X3Y0bDJfb2JqZWN0X25ldyAoR1NUX0VMRU1FTlQgKHNlbGYpLAorICAgICAgR1NUX09CSkVDVCAoR1NUX0JBU0VfVFJBTlNGT1JNX1NSQ19QQUQgKHNlbGYpKSwKKyAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwga2xhc3MtPmRlZmF1bHRfZGV2aWNlLAorICAgICAgZ3N0X3Y0bDJfZ2V0X2lucHV0LCBnc3RfdjRsMl9zZXRfaW5wdXQsIE5VTEwpOworICBzZWxmLT52NGwyY2FwdHVyZS0+bm9faW5pdGlhbF9mb3JtYXQgPSBUUlVFOworICBzZWxmLT52NGwyb3V0cHV0LT5rZWVwX2FzcGVjdCA9IEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdHJhbnNmb3JtX2NsYXNzX2luaXQgKEdzdFY0bDJUcmFuc2Zvcm1DbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3M7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzICpiYXNlX3RyYW5zZm9ybV9jbGFzczsKKworICBlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGJhc2VfdHJhbnNmb3JtX2NsYXNzID0gKEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqKSBrbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3Y0bDJfdHJhbnNmb3JtX2RlYnVnLCAidjRsMnRyYW5zZm9ybSIsIDAsCisgICAgICAiVjRMMiBDb252ZXJ0ZXIiKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIlY0TDIgVmlkZW8gQ29udmVydGVyIiwKKyAgICAgICJGaWx0ZXIvQ29udmVydGVyL1ZpZGVvL1NjYWxlciIsCisgICAgICAiVHJhbnNmb3JtIHN0cmVhbXMgdmlhIFY0TDIgQVBJIiwKKyAgICAgICJOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+Iik7CisKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl90cmFuc2Zvcm1fZGlzcG9zZSk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3RyYW5zZm9ybV9maW5hbGl6ZSk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdHJhbnNmb3JtX3NldF9wcm9wZXJ0eSk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdHJhbnNmb3JtX2dldF9wcm9wZXJ0eSk7CisKKyAgYmFzZV90cmFuc2Zvcm1fY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdHJhbnNmb3JtX3N0b3ApOworICBiYXNlX3RyYW5zZm9ybV9jbGFzcy0+c2V0X2NhcHMgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3RyYW5zZm9ybV9zZXRfY2Fwcyk7CisgIGJhc2VfdHJhbnNmb3JtX2NsYXNzLT5xdWVyeSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl90cmFuc2Zvcm1fcXVlcnkpOworICBiYXNlX3RyYW5zZm9ybV9jbGFzcy0+c2lua19ldmVudCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdHJhbnNmb3JtX3NpbmtfZXZlbnQpOworICBiYXNlX3RyYW5zZm9ybV9jbGFzcy0+ZGVjaWRlX2FsbG9jYXRpb24gPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3RyYW5zZm9ybV9kZWNpZGVfYWxsb2NhdGlvbik7CisgIGJhc2VfdHJhbnNmb3JtX2NsYXNzLT5wcm9wb3NlX2FsbG9jYXRpb24gPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3RyYW5zZm9ybV9wcm9wb3NlX2FsbG9jYXRpb24pOworICBiYXNlX3RyYW5zZm9ybV9jbGFzcy0+dHJhbnNmb3JtX2NhcHMgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3RyYW5zZm9ybV90cmFuc2Zvcm1fY2Fwcyk7CisgIGJhc2VfdHJhbnNmb3JtX2NsYXNzLT5maXhhdGVfY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdHJhbnNmb3JtX2ZpeGF0ZV9jYXBzKTsKKyAgYmFzZV90cmFuc2Zvcm1fY2xhc3MtPnByZXBhcmVfb3V0cHV0X2J1ZmZlciA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdHJhbnNmb3JtX3ByZXBhcmVfb3V0cHV0X2J1ZmZlcik7CisgIGJhc2VfdHJhbnNmb3JtX2NsYXNzLT50cmFuc2Zvcm0gPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3RyYW5zZm9ybV90cmFuc2Zvcm0pOworCisgIGJhc2VfdHJhbnNmb3JtX2NsYXNzLT5wYXNzdGhyb3VnaF9vbl9zYW1lX2NhcHMgPSBUUlVFOworCisgIGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdHJhbnNmb3JtX2NoYW5nZV9zdGF0ZSk7CisKKyAgZ3N0X3Y0bDJfb2JqZWN0X2luc3RhbGxfbTJtX3Byb3BlcnRpZXNfaGVscGVyIChnb2JqZWN0X2NsYXNzKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3RyYW5zZm9ybV9zdWJjbGFzc19pbml0IChncG9pbnRlciBnX2NsYXNzLCBncG9pbnRlciBkYXRhKQoreworICBHc3RWNGwyVHJhbnNmb3JtQ2xhc3MgKmtsYXNzID0gR1NUX1Y0TDJfVFJBTlNGT1JNX0NMQVNTIChnX2NsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGdfY2xhc3MpOworICBHc3RWNGwyVHJhbnNmb3JtQ0RhdGEgKmNkYXRhID0gZGF0YTsKKworICBrbGFzcy0+ZGVmYXVsdF9kZXZpY2UgPSBjZGF0YS0+ZGV2aWNlOworCisgIC8qIE5vdGU6IGdzdF9wYWRfdGVtcGxhdGVfbmV3KCkgdGFrZSB0aGUgZmxvYXRpbmcgcmVmIGZyb20gdGhlIGNhcHMgKi8KKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgIGdzdF9wYWRfdGVtcGxhdGVfbmV3ICgic2luayIsIEdTVF9QQURfU0lOSywgR1NUX1BBRF9BTFdBWVMsCisgICAgICAgICAgY2RhdGEtPnNpbmtfY2FwcykpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgZ3N0X3BhZF90ZW1wbGF0ZV9uZXcgKCJzcmMiLCBHU1RfUEFEX1NSQywgR1NUX1BBRF9BTFdBWVMsCisgICAgICAgICAgY2RhdGEtPnNyY19jYXBzKSk7CisKKyAgZ19mcmVlIChjZGF0YSk7Cit9CisKKy8qIFByb2JpbmcgZnVuY3Rpb25zICovCitnYm9vbGVhbgorZ3N0X3Y0bDJfaXNfdHJhbnNmb3JtIChHc3RDYXBzICogc2lua19jYXBzLCBHc3RDYXBzICogc3JjX2NhcHMpCit7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIGlmIChnc3RfY2Fwc19pc19zdWJzZXQgKHNpbmtfY2FwcywgZ3N0X3Y0bDJfb2JqZWN0X2dldF9yYXdfY2FwcyAoKSkKKyAgICAgICYmIGdzdF9jYXBzX2lzX3N1YnNldCAoc3JjX2NhcHMsIGdzdF92NGwyX29iamVjdF9nZXRfcmF3X2NhcHMgKCkpKQorICAgIHJldCA9IFRSVUU7CisKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZAorZ3N0X3Y0bDJfdHJhbnNmb3JtX3JlZ2lzdGVyIChHc3RQbHVnaW4gKiBwbHVnaW4sIGNvbnN0IGdjaGFyICogYmFzZW5hbWUsCisgICAgY29uc3QgZ2NoYXIgKiBkZXZpY2VfcGF0aCwgR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKQoreworICBHVHlwZVF1ZXJ5IHR5cGVfcXVlcnk7CisgIEdUeXBlSW5mbyB0eXBlX2luZm8gPSB7IDAsIH07CisgIEdUeXBlIHR5cGUsIHN1YnR5cGU7CisgIGdjaGFyICp0eXBlX25hbWU7CisgIEdzdFY0bDJUcmFuc2Zvcm1DRGF0YSAqY2RhdGE7CisKKyAgY2RhdGEgPSBnX25ldzAgKEdzdFY0bDJUcmFuc2Zvcm1DRGF0YSwgMSk7CisgIGNkYXRhLT5kZXZpY2UgPSBnX3N0cmR1cCAoZGV2aWNlX3BhdGgpOworICBjZGF0YS0+c2lua19jYXBzID0gZ3N0X2NhcHNfcmVmIChzaW5rX2NhcHMpOworICBjZGF0YS0+c3JjX2NhcHMgPSBnc3RfY2Fwc19yZWYgKHNyY19jYXBzKTsKKworICB0eXBlID0gZ3N0X3Y0bDJfdHJhbnNmb3JtX2dldF90eXBlICgpOworICBnX3R5cGVfcXVlcnkgKHR5cGUsICZ0eXBlX3F1ZXJ5KTsKKyAgbWVtc2V0ICgmdHlwZV9pbmZvLCAwLCBzaXplb2YgKHR5cGVfaW5mbykpOworICB0eXBlX2luZm8uY2xhc3Nfc2l6ZSA9IHR5cGVfcXVlcnkuY2xhc3Nfc2l6ZTsKKyAgdHlwZV9pbmZvLmluc3RhbmNlX3NpemUgPSB0eXBlX3F1ZXJ5Lmluc3RhbmNlX3NpemU7CisgIHR5cGVfaW5mby5jbGFzc19pbml0ID0gZ3N0X3Y0bDJfdHJhbnNmb3JtX3N1YmNsYXNzX2luaXQ7CisgIHR5cGVfaW5mby5jbGFzc19kYXRhID0gY2RhdGE7CisgIHR5cGVfaW5mby5pbnN0YW5jZV9pbml0ID0gZ3N0X3Y0bDJfdHJhbnNmb3JtX3N1Ymluc3RhbmNlX2luaXQ7CisKKyAgdHlwZV9uYW1lID0gZ19zdHJkdXBfcHJpbnRmICgidjRsMiVzY29udmVydCIsIGJhc2VuYW1lKTsKKyAgc3VidHlwZSA9IGdfdHlwZV9yZWdpc3Rlcl9zdGF0aWMgKHR5cGUsIHR5cGVfbmFtZSwgJnR5cGVfaW5mbywgMCk7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCB0eXBlX25hbWUsIEdTVF9SQU5LX05PTkUsIHN1YnR5cGUpKQorICAgIEdTVF9XQVJOSU5HICgiRmFpbGVkIHRvIHJlZ2lzdGVyIHBsdWdpbiAnJXMnIiwgdHlwZV9uYW1lKTsKKworICBnX2ZyZWUgKHR5cGVfbmFtZSk7Cit9CmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmggYi9zeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2YjlhNQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uaApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IENvbGxhYm9yYSBMdGQuCisgKiAgICAgQXV0aG9yOiBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0dTVF9WNEwyX1RSQU5TRk9STV9IX18KKyNkZWZpbmUgX19HU1RfVjRMMl9UUkFOU0ZPUk1fSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorCisjaW5jbHVkZSA8Z3N0djRsMm9iamVjdC5oPgorI2luY2x1ZGUgPGdzdHY0bDJidWZmZXJwb29sLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9WNEwyX1RSQU5TRk9STSBcCisgIChnc3RfdjRsMl90cmFuc2Zvcm1fZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1Y0TDJfVFJBTlNGT1JNKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVjRMMl9UUkFOU0ZPUk0sR3N0VjRsMlRyYW5zZm9ybSkpCisjZGVmaW5lIEdTVF9WNEwyX1RSQU5TRk9STV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WNEwyX1RSQU5TRk9STSxHc3RWNGwyVHJhbnNmb3JtQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVjRMMl9UUkFOU0ZPUk0ob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WNEwyX1RSQU5TRk9STSkpCisjZGVmaW5lIEdTVF9JU19WNEwyX1RSQU5TRk9STV9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVjRMMl9UUkFOU0ZPUk0pKQorI2RlZmluZSBHU1RfVjRMMl9UUkFOU0ZPUk1fR0VUX0NMQVNTKGluc3QpIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChpbnN0KSxHU1RfVFlQRV9WNEwyX1RSQU5TRk9STSxHc3RWNGwyVHJhbnNmb3JtQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMlRyYW5zZm9ybSBHc3RWNGwyVHJhbnNmb3JtOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJUcmFuc2Zvcm1DbGFzcyBHc3RWNGwyVHJhbnNmb3JtQ2xhc3M7CisKK3N0cnVjdCBfR3N0VjRsMlRyYW5zZm9ybQoreworICBHc3RCYXNlVHJhbnNmb3JtIHBhcmVudDsKKworICAvKiA8IHByaXZhdGUgPiAqLworICBHc3RWNGwyT2JqZWN0ICogdjRsMm91dHB1dDsKKyAgR3N0VjRsMk9iamVjdCAqIHY0bDJjYXB0dXJlOworCisgIC8qIHBhZHMgKi8KKyAgR3N0Q2FwcyAqcHJvYmVkX3NyY2NhcHM7CisgIEdzdENhcHMgKnByb2JlZF9zaW5rY2FwczsKKworICAvKiBTZWxlY3RlZCBjYXBzICovCisgIEdzdENhcHMgKmluY2FwczsKKyAgR3N0Q2FwcyAqb3V0Y2FwczsKK307CisKK3N0cnVjdCBfR3N0VjRsMlRyYW5zZm9ybUNsYXNzCit7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyBwYXJlbnRfY2xhc3M7CisgIGdjaGFyICpkZWZhdWx0X2RldmljZTsKK307CisKK0dUeXBlIGdzdF92NGwyX3RyYW5zZm9ybV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF92NGwyX2lzX3RyYW5zZm9ybSAgICAgICAoR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKTsKK3ZvaWQgICAgIGdzdF92NGwyX3RyYW5zZm9ybV9yZWdpc3RlciAoR3N0UGx1Z2luICogcGx1Z2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqYmFzZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpkZXZpY2VfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1Y0TDJfVFJBTlNGT1JNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmMgYi9zeXMvdjRsMi9nc3R2NGwydHVuZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmNjMmMxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmMKQEAgLTAsMCArMSwzMDMgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAgICAgICAgICAgICAgIDIwMDYgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4KKyAqCisgKiBnc3R2NGwydHVuZXIuYzogdHVuZXIgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBWNEwyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisjaW5jbHVkZSAiZ3N0djRsMm9iamVjdC5oIgorI2luY2x1ZGUgImdzdHY0bDJ0dW5lci5oIgorI2luY2x1ZGUgImdzdHY0bDJvYmplY3QuaCIKKworR19ERUZJTkVfVFlQRSAoR3N0VjRsMlR1bmVyQ2hhbm5lbCwgZ3N0X3Y0bDJfdHVuZXJfY2hhbm5lbCwKKyAgICBHU1RfVFlQRV9UVU5FUl9DSEFOTkVMKTsKKworR19ERUZJTkVfVFlQRSAoR3N0VjRsMlR1bmVyTm9ybSwgZ3N0X3Y0bDJfdHVuZXJfbm9ybSwgR1NUX1RZUEVfVFVORVJfTk9STSk7CisKKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3R1bmVyX2NoYW5uZWxfY2xhc3NfaW5pdCAoR3N0VjRsMlR1bmVyQ2hhbm5lbENsYXNzICoga2xhc3MpCit7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl90dW5lcl9jaGFubmVsX2luaXQgKEdzdFY0bDJUdW5lckNoYW5uZWwgKiBjaGFubmVsKQoreworICBjaGFubmVsLT5pbmRleCA9IChndWludDMyKSAtIDE7CisgIGNoYW5uZWwtPnR1bmVyID0gKGd1aW50MzIpIC0gMTsKKyAgY2hhbm5lbC0+YXVkaW8gPSAoZ3VpbnQzMikgLSAxOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdHVuZXJfbm9ybV9jbGFzc19pbml0IChHc3RWNGwyVHVuZXJOb3JtQ2xhc3MgKiBrbGFzcykKK3sKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3R1bmVyX25vcm1faW5pdCAoR3N0VjRsMlR1bmVyTm9ybSAqIG5vcm0pCit7CisgIG5vcm0tPmluZGV4ID0gMDsKK30KKworc3RhdGljIEdfR05VQ19VTlVTRUQgZ2Jvb2xlYW4KK2dzdF92NGwyX3R1bmVyX2NvbnRhaW5zX2NoYW5uZWwgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIEdzdFY0bDJUdW5lckNoYW5uZWwgKiB2NGwyY2hhbm5lbCkKK3sKKyAgY29uc3QgR0xpc3QgKml0ZW07CisKKyAgZm9yIChpdGVtID0gdjRsMm9iamVjdC0+Y2hhbm5lbHM7IGl0ZW0gIT0gTlVMTDsgaXRlbSA9IGl0ZW0tPm5leHQpCisgICAgaWYgKGl0ZW0tPmRhdGEgPT0gdjRsMmNoYW5uZWwpCisgICAgICByZXR1cm4gVFJVRTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKK2NvbnN0IEdMaXN0ICoKK2dzdF92NGwyX3R1bmVyX2xpc3RfY2hhbm5lbHMgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KQoreworICByZXR1cm4gdjRsMm9iamVjdC0+Y2hhbm5lbHM7Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl90dW5lcl9zZXRfY2hhbm5lbCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgR3N0VHVuZXJDaGFubmVsICogY2hhbm5lbCkKK3sKKyAgR3N0VjRsMlR1bmVyQ2hhbm5lbCAqdjRsMmNoYW5uZWwgPSBHU1RfVjRMMl9UVU5FUl9DSEFOTkVMIChjaGFubmVsKTsKKworICAvKiBhc3NlcnQgdGhhdCB3ZSdyZSBvcGVuZWQgYW5kIHRoYXQgd2UncmUgdXNpbmcgYSBrbm93biBpdGVtICovCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ3N0X3Y0bDJfdHVuZXJfY29udGFpbnNfY2hhbm5lbCAodjRsMm9iamVjdCwKKyAgICAgICAgICB2NGwyY2hhbm5lbCksIEZBTFNFKTsKKworICBpZiAodjRsMm9iamVjdC0+c2V0X2luX291dF9mdW5jICh2NGwyb2JqZWN0LCB2NGwyY2hhbm5lbC0+aW5kZXgpKSB7CisgICAgZ3N0X3R1bmVyX2NoYW5uZWxfY2hhbmdlZCAoR1NUX1RVTkVSICh2NGwyb2JqZWN0LT5lbGVtZW50KSwgY2hhbm5lbCk7CisgICAgLyogY2FuIEZQUyBjaGFuZ2UgaGVyZT8gKi8KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKKworfQorCitHc3RUdW5lckNoYW5uZWwgKgorZ3N0X3Y0bDJfdHVuZXJfZ2V0X2NoYW5uZWwgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KQoreworICBHTGlzdCAqaXRlbTsKKyAgZ2ludCBjaGFubmVsOworCisgIC8qIGFzc2VydCB0aGF0IHdlJ3JlIG9wZW5lZCBhbmQgdGhhdCB3ZSdyZSB1c2luZyBhIGtub3duIGl0ZW0gKi8KKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpLCBOVUxMKTsKKworICBpZiAodjRsMm9iamVjdC0+Z2V0X2luX291dF9mdW5jICh2NGwyb2JqZWN0LCAmY2hhbm5lbCkpIHsKKworICAgIGZvciAoaXRlbSA9IHY0bDJvYmplY3QtPmNoYW5uZWxzOyBpdGVtICE9IE5VTEw7IGl0ZW0gPSBpdGVtLT5uZXh0KSB7CisgICAgICBpZiAoY2hhbm5lbCA9PSBHU1RfVjRMMl9UVU5FUl9DSEFOTkVMIChpdGVtLT5kYXRhKS0+aW5kZXgpCisgICAgICAgIHJldHVybiAoR3N0VHVuZXJDaGFubmVsICopIGl0ZW0tPmRhdGE7CisgICAgfQorCisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEdfR05VQ19VTlVTRUQgZ2Jvb2xlYW4KK2dzdF92NGwyX3R1bmVyX2NvbnRhaW5zX25vcm0gKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIEdzdFY0bDJUdW5lck5vcm0gKiB2NGwybm9ybSkKK3sKKyAgY29uc3QgR0xpc3QgKml0ZW07CisKKyAgZm9yIChpdGVtID0gdjRsMm9iamVjdC0+bm9ybXM7IGl0ZW0gIT0gTlVMTDsgaXRlbSA9IGl0ZW0tPm5leHQpCisgICAgaWYgKGl0ZW0tPmRhdGEgPT0gdjRsMm5vcm0pCisgICAgICByZXR1cm4gVFJVRTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKK2NvbnN0IEdMaXN0ICoKK2dzdF92NGwyX3R1bmVyX2xpc3Rfbm9ybXMgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KQoreworICByZXR1cm4gdjRsMm9iamVjdC0+bm9ybXM7Cit9CisKK3ZvaWQKK2dzdF92NGwyX3R1bmVyX3NldF9ub3JtX2FuZF9ub3RpZnkgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIEdzdFR1bmVyTm9ybSAqIG5vcm0pCit7CisgIGlmIChnc3RfdjRsMl90dW5lcl9zZXRfbm9ybSAodjRsMm9iamVjdCwgbm9ybSkpIHsKKyNpZiAwCisgICAgZ19vYmplY3Rfbm90aWZ5IChHX09CSkVDVCAodjRsMm9iamVjdC0+ZWxlbWVudCksICJub3JtIik7CisjZW5kaWYKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3Y0bDJfdHVuZXJfc2V0X25vcm0gKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBHc3RUdW5lck5vcm0gKiBub3JtKQoreworICBHc3RWNGwyVHVuZXJOb3JtICp2NGwybm9ybSA9IEdTVF9WNEwyX1RVTkVSX05PUk0gKG5vcm0pOworCisgIC8qIGFzc2VydCB0aGF0IHdlJ3JlIG9wZW5lZCBhbmQgdGhhdCB3ZSdyZSB1c2luZyBhIGtub3duIGl0ZW0gKi8KKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChnc3RfdjRsMl90dW5lcl9jb250YWluc19ub3JtICh2NGwyb2JqZWN0LCB2NGwybm9ybSksCisgICAgICBGQUxTRSk7CisKKyAgaWYgKGdzdF92NGwyX3NldF9ub3JtICh2NGwyb2JqZWN0LCB2NGwybm9ybS0+aW5kZXgpKSB7CisgICAgZ3N0X3R1bmVyX25vcm1fY2hhbmdlZCAoR1NUX1RVTkVSICh2NGwyb2JqZWN0LT5lbGVtZW50KSwgbm9ybSk7CisgICAgaWYgKHY0bDJvYmplY3QtPnVwZGF0ZV9mcHNfZnVuYykKKyAgICAgIHY0bDJvYmplY3QtPnVwZGF0ZV9mcHNfZnVuYyAodjRsMm9iamVjdCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gRkFMU0U7CisKK30KKworR3N0VHVuZXJOb3JtICoKK2dzdF92NGwyX3R1bmVyX2dldF9ub3JtIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCkKK3sKKyAgdjRsMl9zdGRfaWQgbm9ybTsKKworICAvKiBhc3NlcnQgdGhhdCB3ZSdyZSBvcGVuZWQgYW5kIHRoYXQgd2UncmUgdXNpbmcgYSBrbm93biBpdGVtICovCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSwgTlVMTCk7CisKKyAgZ3N0X3Y0bDJfZ2V0X25vcm0gKHY0bDJvYmplY3QsICZub3JtKTsKKworICByZXR1cm4gZ3N0X3Y0bDJfdHVuZXJfZ2V0X25vcm1fYnlfc3RkX2lkICh2NGwyb2JqZWN0LCBub3JtKTsKK30KKworR3N0VHVuZXJOb3JtICoKK2dzdF92NGwyX3R1bmVyX2dldF9ub3JtX2J5X3N0ZF9pZCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIHY0bDJfc3RkX2lkIG5vcm0pCit7CisgIEdMaXN0ICppdGVtOworCisgIGZvciAoaXRlbSA9IHY0bDJvYmplY3QtPm5vcm1zOyBpdGVtICE9IE5VTEw7IGl0ZW0gPSBpdGVtLT5uZXh0KSB7CisgICAgaWYgKG5vcm0gJiBHU1RfVjRMMl9UVU5FUl9OT1JNIChpdGVtLT5kYXRhKS0+aW5kZXgpCisgICAgICByZXR1cm4gKEdzdFR1bmVyTm9ybSAqKSBpdGVtLT5kYXRhOworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3Y0bDJfc3RkX2lkCitnc3RfdjRsMl90dW5lcl9nZXRfc3RkX2lkX2J5X25vcm0gKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIEdzdFR1bmVyTm9ybSAqIG5vcm0pCit7CisgIEdMaXN0ICppdGVtOworCisgIGZvciAoaXRlbSA9IHY0bDJvYmplY3QtPm5vcm1zOyBpdGVtICE9IE5VTEw7IGl0ZW0gPSBpdGVtLT5uZXh0KSB7CisgICAgaWYgKG5vcm0gPT0gR1NUX1RVTkVSX05PUk0gKGl0ZW0tPmRhdGEpKQorICAgICAgcmV0dXJuIEdTVF9WNEwyX1RVTkVSX05PUk0gKGl0ZW0tPmRhdGEpLT5pbmRleDsKKyAgfQorCisgIHJldHVybiAwOworfQorCit2b2lkCitnc3RfdjRsMl90dW5lcl9zZXRfZnJlcXVlbmN5X2FuZF9ub3RpZnkgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIEdzdFR1bmVyQ2hhbm5lbCAqIGNoYW5uZWwsIGd1bG9uZyBmcmVxdWVuY3kpCit7CisgIGlmIChnc3RfdjRsMl90dW5lcl9zZXRfZnJlcXVlbmN5ICh2NGwyb2JqZWN0LCBjaGFubmVsLCBmcmVxdWVuY3kpKSB7CisjaWYgMAorICAgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKHY0bDJvYmplY3QtPmVsZW1lbnQpLCAiZnJlcXVlbmN5Iik7CisjZW5kaWYKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3Y0bDJfdHVuZXJfc2V0X2ZyZXF1ZW5jeSAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgR3N0VHVuZXJDaGFubmVsICogY2hhbm5lbCwgZ3Vsb25nIGZyZXF1ZW5jeSkKK3sKKyAgR3N0VjRsMlR1bmVyQ2hhbm5lbCAqdjRsMmNoYW5uZWwgPSBHU1RfVjRMMl9UVU5FUl9DSEFOTkVMIChjaGFubmVsKTsKKyAgZ2ludCBjaGFuOworCisgIC8qIGFzc2VydCB0aGF0IHdlJ3JlIG9wZW5lZCBhbmQgdGhhdCB3ZSdyZSB1c2luZyBhIGtub3duIGl0ZW0gKi8KKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfVFVORVJfQ0hBTk5FTF9IQVNfRkxBRyAoY2hhbm5lbCwKKyAgICAgICAgICBHU1RfVFVORVJfQ0hBTk5FTF9GUkVRVUVOQ1kpLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChnc3RfdjRsMl90dW5lcl9jb250YWluc19jaGFubmVsICh2NGwyb2JqZWN0LAorICAgICAgICAgIHY0bDJjaGFubmVsKSwgRkFMU0UpOworCisgIGlmICh2NGwyb2JqZWN0LT5nZXRfaW5fb3V0X2Z1bmMgKHY0bDJvYmplY3QsICZjaGFuKSkgeworICAgIGlmIChjaGFuID09IEdTVF9WNEwyX1RVTkVSX0NIQU5ORUwgKGNoYW5uZWwpLT5pbmRleCAmJgorICAgICAgICBHU1RfVFVORVJfQ0hBTk5FTF9IQVNfRkxBRyAoY2hhbm5lbCwgR1NUX1RVTkVSX0NIQU5ORUxfRlJFUVVFTkNZKSkgeworICAgICAgaWYgKGdzdF92NGwyX3NldF9mcmVxdWVuY3kgKHY0bDJvYmplY3QsIHY0bDJjaGFubmVsLT50dW5lciwgZnJlcXVlbmN5KSkgeworICAgICAgICBnc3RfdHVuZXJfZnJlcXVlbmN5X2NoYW5nZWQgKEdTVF9UVU5FUiAodjRsMm9iamVjdC0+ZWxlbWVudCksIGNoYW5uZWwsCisgICAgICAgICAgICBmcmVxdWVuY3kpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK2d1bG9uZworZ3N0X3Y0bDJfdHVuZXJfZ2V0X2ZyZXF1ZW5jeSAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgR3N0VHVuZXJDaGFubmVsICogY2hhbm5lbCkKK3sKKyAgR3N0VjRsMlR1bmVyQ2hhbm5lbCAqdjRsMmNoYW5uZWwgPSBHU1RfVjRMMl9UVU5FUl9DSEFOTkVMIChjaGFubmVsKTsKKyAgZ2ludCBjaGFuOworICBndWxvbmcgZnJlcXVlbmN5ID0gMDsKKworICAvKiBhc3NlcnQgdGhhdCB3ZSdyZSBvcGVuZWQgYW5kIHRoYXQgd2UncmUgdXNpbmcgYSBrbm93biBpdGVtICovCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSwgMCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfVFVORVJfQ0hBTk5FTF9IQVNfRkxBRyAoY2hhbm5lbCwKKyAgICAgICAgICBHU1RfVFVORVJfQ0hBTk5FTF9GUkVRVUVOQ1kpLCAwKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGdzdF92NGwyX3R1bmVyX2NvbnRhaW5zX2NoYW5uZWwgKHY0bDJvYmplY3QsCisgICAgICAgICAgdjRsMmNoYW5uZWwpLCAwKTsKKworICBpZiAodjRsMm9iamVjdC0+Z2V0X2luX291dF9mdW5jICh2NGwyb2JqZWN0LCAmY2hhbikpIHsKKyAgICBpZiAoY2hhbiA9PSBHU1RfVjRMMl9UVU5FUl9DSEFOTkVMIChjaGFubmVsKS0+aW5kZXggJiYKKyAgICAgICAgR1NUX1RVTkVSX0NIQU5ORUxfSEFTX0ZMQUcgKGNoYW5uZWwsIEdTVF9UVU5FUl9DSEFOTkVMX0ZSRVFVRU5DWSkpIHsKKyAgICAgIGdzdF92NGwyX2dldF9mcmVxdWVuY3kgKHY0bDJvYmplY3QsIHY0bDJjaGFubmVsLT50dW5lciwgJmZyZXF1ZW5jeSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZyZXF1ZW5jeTsKK30KKworZ2ludAorZ3N0X3Y0bDJfdHVuZXJfc2lnbmFsX3N0cmVuZ3RoIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBHc3RUdW5lckNoYW5uZWwgKiBjaGFubmVsKQoreworICBHc3RWNGwyVHVuZXJDaGFubmVsICp2NGwyY2hhbm5lbCA9IEdTVF9WNEwyX1RVTkVSX0NIQU5ORUwgKGNoYW5uZWwpOworICBnaW50IGNoYW47CisgIGd1bG9uZyBzaWduYWwgPSAwOworCisgIC8qIGFzc2VydCB0aGF0IHdlJ3JlIG9wZW5lZCBhbmQgdGhhdCB3ZSdyZSB1c2luZyBhIGtub3duIGl0ZW0gKi8KKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpLCAwKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9UVU5FUl9DSEFOTkVMX0hBU19GTEFHIChjaGFubmVsLAorICAgICAgICAgIEdTVF9UVU5FUl9DSEFOTkVMX0ZSRVFVRU5DWSksIDApOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ3N0X3Y0bDJfdHVuZXJfY29udGFpbnNfY2hhbm5lbCAodjRsMm9iamVjdCwKKyAgICAgICAgICB2NGwyY2hhbm5lbCksIDApOworCisgIGlmICh2NGwyb2JqZWN0LT5nZXRfaW5fb3V0X2Z1bmMgKHY0bDJvYmplY3QsICZjaGFuKSkgeworICAgIGlmIChjaGFuID09IEdTVF9WNEwyX1RVTkVSX0NIQU5ORUwgKGNoYW5uZWwpLT5pbmRleCAmJgorICAgICAgICBHU1RfVFVORVJfQ0hBTk5FTF9IQVNfRkxBRyAoY2hhbm5lbCwgR1NUX1RVTkVSX0NIQU5ORUxfRlJFUVVFTkNZKSkgeworICAgICAgZ3N0X3Y0bDJfc2lnbmFsX3N0cmVuZ3RoICh2NGwyb2JqZWN0LCB2NGwyY2hhbm5lbC0+dHVuZXIsICZzaWduYWwpOworICAgIH0KKyAgfQorCisgIHJldHVybiBzaWduYWw7Cit9CmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwydHVuZXIuaCBiL3N5cy92NGwyL2dzdHY0bDJ0dW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMDU2NTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwydHVuZXIuaApAQCAtMCwwICsxLDIwMCBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqICAgICAgICAgICAgICAgMjAwNiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICoKKyAqIGdzdHY0bDJ0dW5lci5oOiB0dW5lciBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIFY0TDIKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1Y0TDJfVFVORVJfSF9fCisjZGVmaW5lIF9fR1NUX1Y0TDJfVFVORVJfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJ0dW5lci5oIgorI2luY2x1ZGUgImdzdHY0bDJvYmplY3QuaCIKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1Y0TDJfVFVORVJfQ0hBTk5FTCBcCisgIChnc3RfdjRsMl90dW5lcl9jaGFubmVsX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfVjRMMl9UVU5FUl9DSEFOTkVMKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBHU1RfVFlQRV9WNEwyX1RVTkVSX0NIQU5ORUwsIFwKKyAgICAgICAgICBHc3RWNGwyVHVuZXJDaGFubmVsKSkKKyNkZWZpbmUgR1NUX1Y0TDJfVFVORVJfQ0hBTk5FTF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIEdTVF9UWVBFX1Y0TDJfVFVORVJfQ0hBTk5FTCwgXAorICAgICAgIEdzdFY0bDJUdW5lckNoYW5uZWxDbGFzcykpCisjZGVmaW5lIEdTVF9JU19WNEwyX1RVTkVSX0NIQU5ORUwob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX1Y0TDJfVFVORVJfQ0hBTk5FTCkpCisjZGVmaW5lIEdTVF9JU19WNEwyX1RVTkVSX0NIQU5ORUxfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9WNEwyX1RVTkVSX0NIQU5ORUwpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMlR1bmVyQ2hhbm5lbCB7CisgIEdzdFR1bmVyQ2hhbm5lbCBwYXJlbnQ7CisKKyAgZ3VpbnQzMiAgICAgICAgIGluZGV4OworICBndWludDMyICAgICAgICAgdHVuZXI7CisgIGd1aW50MzIgICAgICAgICBhdWRpbzsKK30gR3N0VjRsMlR1bmVyQ2hhbm5lbDsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJUdW5lckNoYW5uZWxDbGFzcyB7CisgIEdzdFR1bmVyQ2hhbm5lbENsYXNzIHBhcmVudDsKK30gR3N0VjRsMlR1bmVyQ2hhbm5lbENsYXNzOworCisjZGVmaW5lIEdTVF9UWVBFX1Y0TDJfVFVORVJfTk9STSBcCisgIChnc3RfdjRsMl90dW5lcl9ub3JtX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfVjRMMl9UVU5FUl9OT1JNKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBHU1RfVFlQRV9WNEwyX1RVTkVSX05PUk0sIFwKKyAgICAgICAgICBHc3RWNGwyVHVuZXJOb3JtKSkKKyNkZWZpbmUgR1NUX1Y0TDJfVFVORVJfTk9STV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIEdTVF9UWVBFX1Y0TDJfVFVORVJfTk9STSwgXAorICAgICAgIEdzdFY0bDJUdW5lck5vcm1DbGFzcykpCisjZGVmaW5lIEdTVF9JU19WNEwyX1RVTkVSX05PUk0ob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX1Y0TDJfVFVORVJfTk9STSkpCisjZGVmaW5lIEdTVF9JU19WNEwyX1RVTkVSX05PUk1fQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9WNEwyX1RVTkVSX05PUk0pKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMlR1bmVyTm9ybSB7CisgIEdzdFR1bmVyTm9ybSBwYXJlbnQ7CisKKyAgdjRsMl9zdGRfaWQgIGluZGV4OworfSBHc3RWNGwyVHVuZXJOb3JtOworCit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMlR1bmVyTm9ybUNsYXNzIHsKKyAgR3N0VHVuZXJOb3JtQ2xhc3MgcGFyZW50OworfSBHc3RWNGwyVHVuZXJOb3JtQ2xhc3M7CisKK0dUeXBlIGdzdF92NGwyX3R1bmVyX2NoYW5uZWxfZ2V0X3R5cGUgKHZvaWQpOworR1R5cGUgZ3N0X3Y0bDJfdHVuZXJfbm9ybV9nZXRfdHlwZSAodm9pZCk7CisKKy8qIGNoYW5uZWxzICovCitjb25zdCBHTGlzdCogICAgICBnc3RfdjRsMl90dW5lcl9saXN0X2NoYW5uZWxzICAgICAgICAgICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KTsKK0dzdFR1bmVyQ2hhbm5lbCogIGdzdF92NGwyX3R1bmVyX2dldF9jaGFubmVsICAgICAgICAgICAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpOworZ2Jvb2xlYW4gICAgICAgICAgZ3N0X3Y0bDJfdHVuZXJfc2V0X2NoYW5uZWwgICAgICAgICAgICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyQ2hhbm5lbCAqIGNoYW5uZWwpOworLyogbm9ybXMgKi8KK2NvbnN0IEdMaXN0KiAgICAgIGdzdF92NGwyX3R1bmVyX2xpc3Rfbm9ybXMgICAgICAgICAgICAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpOwordm9pZCAgICAgICAgICAgICAgZ3N0X3Y0bDJfdHVuZXJfc2V0X25vcm1fYW5kX25vdGlmeSAgICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyTm9ybSAqIG5vcm0pOworR3N0VHVuZXJOb3JtKiAgICAgZ3N0X3Y0bDJfdHVuZXJfZ2V0X25vcm0gICAgICAgICAgICAgICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCk7CitnYm9vbGVhbiAgICAgICAgICBnc3RfdjRsMl90dW5lcl9zZXRfbm9ybSAgICAgICAgICAgICAgICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VHVuZXJOb3JtICogbm9ybSk7CitHc3RUdW5lck5vcm0qICAgICBnc3RfdjRsMl90dW5lcl9nZXRfbm9ybV9ieV9zdGRfaWQgICAgICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2NGwyX3N0ZF9pZCBub3JtKTsKK3Y0bDJfc3RkX2lkICAgICAgIGdzdF92NGwyX3R1bmVyX2dldF9zdGRfaWRfYnlfbm9ybSAgICAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyTm9ybSAqIG5vcm0pOworCisvKiBmcmVxdWVuY3kgKi8KK3ZvaWQgICAgICAgICAgICAgIGdzdF92NGwyX3R1bmVyX3NldF9mcmVxdWVuY3lfYW5kX25vdGlmeSAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyQ2hhbm5lbCAqIGNoYW5uZWwsIAorCQkJCQkJCSAgIGd1bG9uZyBmcmVxdWVuY3kpOworZ2ludCAgICAgICAgICAgICAgZ3N0X3Y0bDJfdHVuZXJfc2lnbmFsX3N0cmVuZ3RoICAgICAgICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyQ2hhbm5lbCAqIGNoYW5uZWwpOworZ3Vsb25nICAgICAgICAgICAgZ3N0X3Y0bDJfdHVuZXJfZ2V0X2ZyZXF1ZW5jeSAgICAgICAgICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyQ2hhbm5lbCAqIGNoYW5uZWwpOworZ2Jvb2xlYW4gICAgICAgICAgZ3N0X3Y0bDJfdHVuZXJfc2V0X2ZyZXF1ZW5jeSAgICAgICAgICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VHVuZXJDaGFubmVsICogY2hhbm5lbCwgCisJCQkJCQkJICAgZ3Vsb25nIGZyZXF1ZW5jeSk7CisKKyNkZWZpbmUgR1NUX0lNUExFTUVOVF9WNEwyX1RVTkVSX01FVEhPRFMoVHlwZSwgaW50ZXJmYWNlX2FzX2Z1bmN0aW9uKSAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgY29uc3QgR0xpc3QgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdHVuZXJfbGlzdF9jaGFubmVscyAoR3N0VHVuZXIgKiBtaXhlcikgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFR5cGUgKnRoaXMgPSAoVHlwZSopIG1peGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIGdzdF92NGwyX3R1bmVyX2xpc3RfY2hhbm5lbHMgKHRoaXMtPnY0bDJvYmplY3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF90dW5lcl9zZXRfY2hhbm5lbCAoR3N0VHVuZXIgKiBtaXhlciwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lckNoYW5uZWwgKiBjaGFubmVsKSAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUeXBlICp0aGlzID0gKFR5cGUqKSBtaXhlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdzdF92NGwyX3R1bmVyX3NldF9jaGFubmVsICh0aGlzLT52NGwyb2JqZWN0LCBjaGFubmVsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIEdzdFR1bmVyQ2hhbm5lbCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3R1bmVyX2dldF9jaGFubmVsIChHc3RUdW5lciAqIG1peGVyKSAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUeXBlICp0aGlzID0gKFR5cGUqKSBtaXhlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHVybiBnc3RfdjRsMl90dW5lcl9nZXRfY2hhbm5lbCAodGhpcy0+djRsMm9iamVjdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGNvbnN0IEdMaXN0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3R1bmVyX2xpc3Rfbm9ybXMgKEdzdFR1bmVyICogbWl4ZXIpICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUeXBlICp0aGlzID0gKFR5cGUqKSBtaXhlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHVybiBnc3RfdjRsMl90dW5lcl9saXN0X25vcm1zICh0aGlzLT52NGwyb2JqZWN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3R1bmVyX3NldF9ub3JtX2FuZF9ub3RpZnkgKEdzdFR1bmVyICogbWl4ZXIsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VHVuZXJOb3JtICogbm9ybSkgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFR5cGUgKnRoaXMgPSAoVHlwZSopIG1peGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ3N0X3Y0bDJfdHVuZXJfc2V0X25vcm1fYW5kX25vdGlmeSAodGhpcy0+djRsMm9iamVjdCwgbm9ybSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgR3N0VHVuZXJOb3JtICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdHVuZXJfZ2V0X25vcm0gKEdzdFR1bmVyICogbWl4ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFR5cGUgKnRoaXMgPSAoVHlwZSopIG1peGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIGdzdF92NGwyX3R1bmVyX2dldF9ub3JtICh0aGlzLT52NGwyb2JqZWN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF90dW5lcl9zZXRfZnJlcXVlbmN5X2FuZF9ub3RpZnkgKEdzdFR1bmVyICogbWl4ZXIsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VHVuZXJDaGFubmVsICogY2hhbm5lbCwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWxvbmcgZnJlcXVlbmN5KSAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFR5cGUgKnRoaXMgPSAoVHlwZSopIG1peGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ3N0X3Y0bDJfdHVuZXJfc2V0X2ZyZXF1ZW5jeV9hbmRfbm90aWZ5ICh0aGlzLT52NGwyb2JqZWN0LCBjaGFubmVsLCBmcmVxdWVuY3kpOyAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBndWxvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF90dW5lcl9nZXRfZnJlcXVlbmN5IChHc3RUdW5lciAqIG1peGVyLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyQ2hhbm5lbCAqIGNoYW5uZWwpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUeXBlICp0aGlzID0gKFR5cGUqKSBtaXhlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHVybiBnc3RfdjRsMl90dW5lcl9nZXRfZnJlcXVlbmN5ICh0aGlzLT52NGwyb2JqZWN0LCBjaGFubmVsKTsgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgZ2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdHVuZXJfc2lnbmFsX3N0cmVuZ3RoIChHc3RUdW5lciAqIG1peGVyLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyQ2hhbm5lbCAqIGNoYW5uZWwpICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVHlwZSAqdGhpcyA9IChUeXBlKikgbWl4ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gZ3N0X3Y0bDJfdHVuZXJfc2lnbmFsX3N0cmVuZ3RoICh0aGlzLT52NGwyb2JqZWN0LCBjaGFubmVsKTsgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3R1bmVyX2ludGVyZmFjZV9pbml0IChHc3RUdW5lckludGVyZmFjZSAqIGlmYWNlKSAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogZGVmYXVsdCB2aXJ0dWFsIGZ1bmN0aW9ucyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZmFjZS0+bGlzdF9jaGFubmVscyA9IGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdHVuZXJfbGlzdF9jaGFubmVsczsgICAgICAgICAgICAgICBcCisgIGlmYWNlLT5zZXRfY2hhbm5lbCA9IGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdHVuZXJfc2V0X2NoYW5uZWw7ICAgICAgICAgICAgICAgICAgIFwKKyAgaWZhY2UtPmdldF9jaGFubmVsID0gaW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF90dW5lcl9nZXRfY2hhbm5lbDsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmYWNlLT5saXN0X25vcm1zID0gaW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF90dW5lcl9saXN0X25vcm1zOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWZhY2UtPnNldF9ub3JtID0gaW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF90dW5lcl9zZXRfbm9ybV9hbmRfbm90aWZ5OyAgICAgICAgICAgICAgXAorICBpZmFjZS0+Z2V0X25vcm0gPSBpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3R1bmVyX2dldF9ub3JtOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWZhY2UtPnNldF9mcmVxdWVuY3kgPSBpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3R1bmVyX3NldF9mcmVxdWVuY3lfYW5kX25vdGlmeTsgICAgXAorICBpZmFjZS0+Z2V0X2ZyZXF1ZW5jeSA9IGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdHVuZXJfZ2V0X2ZyZXF1ZW5jeTsgICAgICAgICAgICAgICBcCisgIGlmYWNlLT5zaWduYWxfc3RyZW5ndGggPSBpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3R1bmVyX3NpZ25hbF9zdHJlbmd0aDsgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfVjRMMl9UVU5FUl9IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jIGIvc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMwNjc3NAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jCkBAIC0wLDAgKzEsMTE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBDb2xsYWJvcmEgTHRkLgorICogICAgIEF1dGhvcjogTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdHY0bDJvYmplY3QuaCIKKyNpbmNsdWRlICJnc3R2NGwydmlkZW9kZWMuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3Y0bDJfdmlkZW9fZGVjX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF92NGwyX3ZpZGVvX2RlY19kZWJ1ZworCit0eXBlZGVmIHN0cnVjdAoreworICBnY2hhciAqZGV2aWNlOworICBHc3RDYXBzICpzaW5rX2NhcHM7CisgIEdzdENhcHMgKnNyY19jYXBzOworICBjb25zdCBnY2hhciAqbG9uZ25hbWU7CisgIGNvbnN0IGdjaGFyICpkZXNjcmlwdGlvbjsKK30gR3N0VjRsMlZpZGVvRGVjQ0RhdGE7CisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBWNEwyX1NURF9PQkpFQ1RfUFJPUFMKK307CisKKyNkZWZpbmUgZ3N0X3Y0bDJfdmlkZW9fZGVjX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX0FCU1RSQUNUX1RZUEUgKEdzdFY0bDJWaWRlb0RlYywgZ3N0X3Y0bDJfdmlkZW9fZGVjLAorICAgIEdTVF9UWVBFX1ZJREVPX0RFQ09ERVIpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfdjRsMl92aWRlb19kZWNfZmluaXNoIChHc3RWaWRlb0RlY29kZXIgKiBkZWNvZGVyKTsKKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3ZpZGVvX2RlY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VjRsMlZpZGVvRGVjICpzZWxmID0gR1NUX1Y0TDJfVklERU9fREVDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DQVBUVVJFX0lPX01PREU6CisgICAgICBpZiAoIWdzdF92NGwyX29iamVjdF9zZXRfcHJvcGVydHlfaGVscGVyIChzZWxmLT52NGwyY2FwdHVyZSwKKyAgICAgICAgICAgICAgcHJvcF9pZCwgdmFsdWUsIHBzcGVjKSkgeworICAgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEJ5IGRlZmF1bHQsIG9ubHkgc2V0IG9uIG91dHB1dCAqLworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoIWdzdF92NGwyX29iamVjdF9zZXRfcHJvcGVydHlfaGVscGVyIChzZWxmLT52NGwyb3V0cHV0LAorICAgICAgICAgICAgICBwcm9wX2lkLCB2YWx1ZSwgcHNwZWMpKSB7CisgICAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdmlkZW9fZGVjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWNGwyVmlkZW9EZWMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19ERUMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0NBUFRVUkVfSU9fTU9ERToKKyAgICAgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X2dldF9wcm9wZXJ0eV9oZWxwZXIgKHNlbGYtPnY0bDJjYXB0dXJlLAorICAgICAgICAgICAgICBwcm9wX2lkLCB2YWx1ZSwgcHNwZWMpKSB7CisgICAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgICAgLyogQnkgZGVmYXVsdCByZWFkIGZyb20gb3V0cHV0ICovCisgICAgZGVmYXVsdDoKKyAgICAgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X2dldF9wcm9wZXJ0eV9oZWxwZXIgKHNlbGYtPnY0bDJvdXRwdXQsCisgICAgICAgICAgICAgIHByb3BfaWQsIHZhbHVlLCBwc3BlYykpIHsKKyAgICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fZGVjX29wZW4gKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIpCit7CisgIEdzdFY0bDJWaWRlb0RlYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0RFQyAoZGVjb2Rlcik7CisgIEdzdENhcHMgKmNvZGVjX2NhcHM7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIk9wZW5pbmciKTsKKworICBpZiAoIWdzdF92NGwyX29iamVjdF9vcGVuIChzZWxmLT52NGwyb3V0cHV0KSkKKyAgICBnb3RvIGZhaWx1cmU7CisKKyAgaWYgKCFnc3RfdjRsMl9vYmplY3Rfb3Blbl9zaGFyZWQgKHNlbGYtPnY0bDJjYXB0dXJlLCBzZWxmLT52NGwyb3V0cHV0KSkKKyAgICBnb3RvIGZhaWx1cmU7CisKKyAgY29kZWNfY2FwcyA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChkZWNvZGVyLT5zaW5rcGFkKTsKKyAgc2VsZi0+cHJvYmVkX3NpbmtjYXBzID0gZ3N0X3Y0bDJfb2JqZWN0X3Byb2JlX2NhcHMgKHNlbGYtPnY0bDJvdXRwdXQsCisgICAgICBjb2RlY19jYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNvZGVjX2NhcHMpOworCisgIGlmIChnc3RfY2Fwc19pc19lbXB0eSAoc2VsZi0+cHJvYmVkX3NpbmtjYXBzKSkKKyAgICBnb3RvIG5vX2VuY29kZWRfZm9ybWF0OworCisgIHNlbGYtPnByb2JlZF9zcmNjYXBzID0gZ3N0X3Y0bDJfb2JqZWN0X3Byb2JlX2NhcHMgKHNlbGYtPnY0bDJjYXB0dXJlLAorICAgICAgZ3N0X3Y0bDJfb2JqZWN0X2dldF9yYXdfY2FwcyAoKSk7CisKKyAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChzZWxmLT5wcm9iZWRfc3JjY2FwcykpCisgICAgZ290byBub19yYXdfZm9ybWF0OworCisgIHJldHVybiBUUlVFOworCitub19lbmNvZGVkX2Zvcm1hdDoKKyAgR1NUX0VMRU1FTlRfRVJST1IgKHNlbGYsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgIChfKCJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIpLAorICAgICAgICAgIHNlbGYtPnY0bDJvdXRwdXQtPnZpZGVvZGV2KSwgKE5VTEwpKTsKKyAgZ290byBmYWlsdXJlOworCisKK25vX3Jhd19mb3JtYXQ6CisgIEdTVF9FTEVNRU5UX0VSUk9SIChzZWxmLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAoXygiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IiksCisgICAgICAgICAgc2VsZi0+djRsMm91dHB1dC0+dmlkZW9kZXYpLCAoTlVMTCkpOworICBnb3RvIGZhaWx1cmU7CisKK2ZhaWx1cmU6CisgIGlmIChHU1RfVjRMMl9JU19PUEVOIChzZWxmLT52NGwyb3V0cHV0KSkKKyAgICBnc3RfdjRsMl9vYmplY3RfY2xvc2UgKHNlbGYtPnY0bDJvdXRwdXQpOworCisgIGlmIChHU1RfVjRMMl9JU19PUEVOIChzZWxmLT52NGwyY2FwdHVyZSkpCisgICAgZ3N0X3Y0bDJfb2JqZWN0X2Nsb3NlIChzZWxmLT52NGwyY2FwdHVyZSk7CisKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNlbGYtPnByb2JlZF9zcmNjYXBzLCBOVUxMKTsKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNlbGYtPnByb2JlZF9zaW5rY2FwcywgTlVMTCk7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX3ZpZGVvX2RlY19jbG9zZSAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlcikKK3sKKyAgR3N0VjRsMlZpZGVvRGVjICpzZWxmID0gR1NUX1Y0TDJfVklERU9fREVDIChkZWNvZGVyKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiQ2xvc2luZyIpOworCisgIGdzdF92NGwyX29iamVjdF9jbG9zZSAoc2VsZi0+djRsMm91dHB1dCk7CisgIGdzdF92NGwyX29iamVjdF9jbG9zZSAoc2VsZi0+djRsMmNhcHR1cmUpOworICBnc3RfY2Fwc19yZXBsYWNlICgmc2VsZi0+cHJvYmVkX3NyY2NhcHMsIE5VTEwpOworICBnc3RfY2Fwc19yZXBsYWNlICgmc2VsZi0+cHJvYmVkX3NpbmtjYXBzLCBOVUxMKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl92aWRlb19kZWNfc3RhcnQgKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIpCit7CisgIEdzdFY0bDJWaWRlb0RlYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0RFQyAoZGVjb2Rlcik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlN0YXJ0aW5nIik7CisKKyAgZ3N0X3Y0bDJfb2JqZWN0X3VubG9jayAoc2VsZi0+djRsMm91dHB1dCk7CisgIGdfYXRvbWljX2ludF9zZXQgKCZzZWxmLT5hY3RpdmUsIFRSVUUpOworICBzZWxmLT5vdXRwdXRfZmxvdyA9IEdTVF9GTE9XX09LOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX3ZpZGVvX2RlY19zdG9wIChHc3RWaWRlb0RlY29kZXIgKiBkZWNvZGVyKQoreworICBHc3RWNGwyVmlkZW9EZWMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19ERUMgKGRlY29kZXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJTdG9wcGluZyIpOworCisgIGdzdF92NGwyX29iamVjdF91bmxvY2sgKHNlbGYtPnY0bDJvdXRwdXQpOworICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrIChzZWxmLT52NGwyY2FwdHVyZSk7CisKKyAgLyogV2FpdCBmb3IgY2FwdHVyZSB0aHJlYWQgdG8gc3RvcCAqLworICBnc3RfcGFkX3N0b3BfdGFzayAoZGVjb2Rlci0+c3JjcGFkKTsKKworICBHU1RfVklERU9fREVDT0RFUl9TVFJFQU1fTE9DSyAoZGVjb2Rlcik7CisgIHNlbGYtPm91dHB1dF9mbG93ID0gR1NUX0ZMT1dfT0s7CisgIEdTVF9WSURFT19ERUNPREVSX1NUUkVBTV9VTkxPQ0sgKGRlY29kZXIpOworCisgIC8qIFNob3VsZCBoYXZlIGJlZW4gZmx1c2hlZCBhbHJlYWR5ICovCisgIGdfYXNzZXJ0IChnX2F0b21pY19pbnRfZ2V0ICgmc2VsZi0+YWN0aXZlKSA9PSBGQUxTRSk7CisKKyAgZ3N0X3Y0bDJfb2JqZWN0X3N0b3AgKHNlbGYtPnY0bDJvdXRwdXQpOworICBnc3RfdjRsMl9vYmplY3Rfc3RvcCAoc2VsZi0+djRsMmNhcHR1cmUpOworCisgIGlmIChzZWxmLT5pbnB1dF9zdGF0ZSkgeworICAgIGdzdF92aWRlb19jb2RlY19zdGF0ZV91bnJlZiAoc2VsZi0+aW5wdXRfc3RhdGUpOworICAgIHNlbGYtPmlucHV0X3N0YXRlID0gTlVMTDsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJTdG9wcGVkIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fZGVjX3NldF9mb3JtYXQgKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIsCisgICAgR3N0VmlkZW9Db2RlY1N0YXRlICogc3RhdGUpCit7CisgIEdzdFY0bDJFcnJvciBlcnJvciA9IEdTVF9WNEwyX0VSUk9SX0lOSVQ7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIEdzdFY0bDJWaWRlb0RlYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0RFQyAoZGVjb2Rlcik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlNldHRpbmcgZm9ybWF0OiAlIiBHU1RfUFRSX0ZPUk1BVCwgc3RhdGUtPmNhcHMpOworCisgIGlmIChzZWxmLT5pbnB1dF9zdGF0ZSkgeworICAgIGlmIChnc3RfdjRsMl9vYmplY3RfY2Fwc19lcXVhbCAoc2VsZi0+djRsMm91dHB1dCwgc3RhdGUtPmNhcHMpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiQ29tcGF0aWJsZSBjYXBzIik7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIGdzdF92aWRlb19jb2RlY19zdGF0ZV91bnJlZiAoc2VsZi0+aW5wdXRfc3RhdGUpOworICAgIHNlbGYtPmlucHV0X3N0YXRlID0gTlVMTDsKKworICAgIGdzdF92NGwyX3ZpZGVvX2RlY19maW5pc2ggKGRlY29kZXIpOworICAgIGdzdF92NGwyX29iamVjdF9zdG9wIChzZWxmLT52NGwyb3V0cHV0KTsKKworICAgIC8qIFRoZSByZW5lZ290aWF0aW9uIGZsb3cgZG9uJ3QgYmxlbmQgd2l0aCB0aGUgYmFzZSBjbGFzcyBmbG93LiBUbworICAgICAqIHByb3Blcmx5IHN0b3AgdGhlIGNhcHR1cmUgcG9vbCB3ZSBuZWVkIHRvIHJlY2xhaW0gb3VyIGJ1ZmZlcnMsIHdoaWNoCisgICAgICogd2lsbCBoYXBwZW5kIHRocm91Z2ggdGhlIGFsbG9jYXRpb24gcXVlcnkuIFRoZSBhbGxvY2F0aW9uIHF1ZXJ5IGlzCisgICAgICogdHJpZ2dlcmVkIGJ5IGdzdF92aWRlb19kZWNvZGVyX25lZ290aWF0ZSgpIHdoaWNoIHJlcXVpcmVzIHRoZSBvdXRwdXQKKyAgICAgKiBjYXBzIHRvIGJlIHNldCwgYnV0IHdlIGNhbid0IGtub3cgdGhpcyBpbmZvcm1hdGlvbiBhcyB3ZSByZWx5IG9uIHRoZQorICAgICAqIGRlY29kZXIsIHdoaWNoIHJlcXVpcmVzIHRoZSBjYXB0dXJlIHF1ZXVlIHRvIGJlIHN0b3BwZWQuCisgICAgICoKKyAgICAgKiBUbyB3b3JrYXJvdW5kIHRoaXMgaXNzdWUsIHdlIHNpbXBseSBydW4gYW4gYWxsb2NhdGlvbiBxdWVyeSB3aXRoIHRoZQorICAgICAqIG9sZCBuZWdvdGlhdGVkIGNhcHMgaW4gb3JkZXIgdG8gZHJhaW4vcmVjbGFpbSBvdXIgYnVmZmVycy4gVGhhdCBicmVha3MKKyAgICAgKiB0aGUgY29tcGxleGl0eSBhbmQgc2hvdWxkIG5vdCBoYXZlIG11Y2ggaW1wYWN0IGluIHBlcmZvcm1hbmNlIHNpbmNlIHRoZQorICAgICAqIGZvbGxvd2luZyBhbGxvY2F0aW9uIHF1ZXJ5IHdpbGwgaGFwcGVuIG9uIGEgZHJhaW5lZCBwaXBlbGluZSBhbmQgd29uJ3QKKyAgICAgKiBibG9jay4gKi8KKyAgICB7CisgICAgICBHc3RDYXBzICpjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChkZWNvZGVyLT5zcmNwYWQpOworICAgICAgR3N0UXVlcnkgKnF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19hbGxvY2F0aW9uIChjYXBzLCBGQUxTRSk7CisgICAgICBnc3RfcGFkX3BlZXJfcXVlcnkgKGRlY29kZXItPnNyY3BhZCwgcXVlcnkpOworICAgICAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgfQorCisgICAgZ3N0X3Y0bDJfb2JqZWN0X3N0b3AgKHNlbGYtPnY0bDJjYXB0dXJlKTsKKyAgICBzZWxmLT5vdXRwdXRfZmxvdyA9IEdTVF9GTE9XX09LOworICB9CisKKyAgcmV0ID0gZ3N0X3Y0bDJfb2JqZWN0X3NldF9mb3JtYXQgKHNlbGYtPnY0bDJvdXRwdXQsIHN0YXRlLT5jYXBzLCAmZXJyb3IpOworCisgIGlmIChyZXQpCisgICAgc2VsZi0+aW5wdXRfc3RhdGUgPSBnc3RfdmlkZW9fY29kZWNfc3RhdGVfcmVmIChzdGF0ZSk7CisgIGVsc2UKKyAgICBnc3RfdjRsMl9lcnJvciAoc2VsZiwgJmVycm9yKTsKKworZG9uZToKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl92aWRlb19kZWNfZmx1c2ggKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIpCit7CisgIEdzdFY0bDJWaWRlb0RlYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0RFQyAoZGVjb2Rlcik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkZsdXNoZWQiKTsKKworICAvKiBFbnN1cmUgdGhlIHByb2Nlc3NpbmcgdGhyZWFkIGhhcyBzdG9wcGVkIGZvciB0aGUgcmV2ZXJzZSBwbGF5YmFjaworICAgKiBkaXNjb3VudCBjYXNlICovCisgIGlmIChnc3RfcGFkX2dldF90YXNrX3N0YXRlIChkZWNvZGVyLT5zcmNwYWQpID09IEdTVF9UQVNLX1NUQVJURUQpIHsKKyAgICBHU1RfVklERU9fREVDT0RFUl9TVFJFQU1fVU5MT0NLIChkZWNvZGVyKTsKKworICAgIGdzdF92NGwyX29iamVjdF91bmxvY2sgKHNlbGYtPnY0bDJvdXRwdXQpOworICAgIGdzdF92NGwyX29iamVjdF91bmxvY2sgKHNlbGYtPnY0bDJjYXB0dXJlKTsKKyAgICBnc3RfcGFkX3N0b3BfdGFzayAoZGVjb2Rlci0+c3JjcGFkKTsKKyAgICBHU1RfVklERU9fREVDT0RFUl9TVFJFQU1fTE9DSyAoZGVjb2Rlcik7CisgIH0KKworICBzZWxmLT5vdXRwdXRfZmxvdyA9IEdTVF9GTE9XX09LOworCisgIGlmIChzZWxmLT52NGwyb3V0cHV0LT5wb29sKQorICAgIGdzdF92NGwyX2J1ZmZlcl9wb29sX2ZsdXNoIChzZWxmLT52NGwyb3V0cHV0LT5wb29sKTsKKworICBpZiAoc2VsZi0+djRsMmNhcHR1cmUtPnBvb2wpCisgICAgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfZmx1c2ggKHNlbGYtPnY0bDJjYXB0dXJlLT5wb29sKTsKKworICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrX3N0b3AgKHNlbGYtPnY0bDJvdXRwdXQpOworICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrX3N0b3AgKHNlbGYtPnY0bDJjYXB0dXJlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl92aWRlb19kZWNfbmVnb3RpYXRlIChHc3RWaWRlb0RlY29kZXIgKiBkZWNvZGVyKQoreworICBHc3RWNGwyVmlkZW9EZWMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19ERUMgKGRlY29kZXIpOworCisgIC8qIFdlIGRvbid0IGFsbG93IHJlbmVnb3RpYXRpb24gd2l0aG91dCBjYXJlZnVsbCBkaXNhYmxpbmcgdGhlIHBvb2wgKi8KKyAgaWYgKHNlbGYtPnY0bDJjYXB0dXJlLT5wb29sICYmCisgICAgICBnc3RfYnVmZmVyX3Bvb2xfaXNfYWN0aXZlIChHU1RfQlVGRkVSX1BPT0wgKHNlbGYtPnY0bDJjYXB0dXJlLT5wb29sKSkpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgcmV0dXJuIEdTVF9WSURFT19ERUNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5uZWdvdGlhdGUgKGRlY29kZXIpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX2RlY29kZXJfY21kIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgZ3VpbnQgY21kLCBndWludCBmbGFncykKK3sKKyAgc3RydWN0IHY0bDJfZGVjb2Rlcl9jbWQgZGNtZCA9IHsgMCwgfTsKKworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5lbGVtZW50LAorICAgICAgInNlbmRpbmcgdjRsMiBkZWNvZGVyIGNvbW1hbmQgJXUgd2l0aCBmbGFncyAldSIsIGNtZCwgZmxhZ3MpOworCisgIGlmICghR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGRjbWQuY21kID0gY21kOworICBkY21kLmZsYWdzID0gZmxhZ3M7CisgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19ERUNPREVSX0NNRCwgJmRjbWQpIDwgMCkKKyAgICBnb3RvIGRjbWRfZmFpbGVkOworCisgIHJldHVybiBUUlVFOworCitkY21kX2ZhaWxlZDoKKyAgaWYgKGVycm5vID09IEVOT1RUWSkgeworICAgIEdTVF9JTkZPX09CSkVDVCAodjRsMm9iamVjdC0+ZWxlbWVudCwKKyAgICAgICAgIkZhaWxlZCB0byBzZW5kIGRlY29kZXIgY29tbWFuZCAldSB3aXRoIGZsYWdzICV1IGZvciAnJXMnLiAoJXMpIiwKKyAgICAgICAgY21kLCBmbGFncywgdjRsMm9iamVjdC0+dmlkZW9kZXYsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgIH0gZWxzZSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAodjRsMm9iamVjdC0+ZWxlbWVudCwKKyAgICAgICAgIkZhaWxlZCB0byBzZW5kIGRlY29kZXIgY29tbWFuZCAldSB3aXRoIGZsYWdzICV1IGZvciAnJXMnLiAoJXMpIiwKKyAgICAgICAgY21kLCBmbGFncywgdjRsMm9iamVjdC0+dmlkZW9kZXYsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3Y0bDJfdmlkZW9fZGVjX2ZpbmlzaCAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlcikKK3sKKyAgR3N0VjRsMlZpZGVvRGVjICpzZWxmID0gR1NUX1Y0TDJfVklERU9fREVDIChkZWNvZGVyKTsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgaWYgKGdzdF9wYWRfZ2V0X3Rhc2tfc3RhdGUgKGRlY29kZXItPnNyY3BhZCkgIT0gR1NUX1RBU0tfU1RBUlRFRCkKKyAgICBnb3RvIGRvbmU7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkZpbmlzaGluZyBkZWNvZGluZyIpOworCisgIEdTVF9WSURFT19ERUNPREVSX1NUUkVBTV9VTkxPQ0sgKGRlY29kZXIpOworCisgIGlmIChnc3RfdjRsMl9kZWNvZGVyX2NtZCAoc2VsZi0+djRsMm91dHB1dCwgVjRMMl9ERUNfQ01EX1NUT1AsIDApKSB7CisgICAgR3N0VGFzayAqdGFzayA9IGRlY29kZXItPnNyY3BhZC0+dGFzazsKKworICAgIC8qIElmIHRoZSBkZWNvZGVyIHN0b3AgY29tbWFuZCBzdWNjZWVkZWQsIGp1c3Qgd2FpdCB1bnRpbCBwcm9jZXNzaW5nIGlzCisgICAgICogZmluaXNoZWQgKi8KKyAgICBHU1RfT0JKRUNUX0xPQ0sgKHRhc2spOworICAgIHdoaWxlIChHU1RfVEFTS19TVEFURSAodGFzaykgPT0gR1NUX1RBU0tfU1RBUlRFRCkKKyAgICAgIEdTVF9UQVNLX1dBSVQgKHRhc2spOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLICh0YXNrKTsKKyAgICByZXQgPSBHU1RfRkxPV19GTFVTSElORzsKKyAgfSBlbHNlIHsKKyAgICAvKiBvdGhlcndpc2Uga2VlcCBxdWV1aW5nIGVtcHR5IGJ1ZmZlcnMgdW50aWwgdGhlIHByb2Nlc3NpbmcgdGhyZWFkIGhhcworICAgICAqIHN0b3BwZWQsIF9wb29sX3Byb2Nlc3MoKSB3aWxsIHJldHVybiBGTFVTSElORyB3aGVuIHRoYXQgaGFwcGVuZWQgKi8KKyAgICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LKSB7CisgICAgICBidWZmZXIgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgICAgIHJldCA9CisgICAgICAgICAgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcHJvY2VzcyAoR1NUX1Y0TDJfQlVGRkVSX1BPT0wgKHNlbGYtPgorICAgICAgICAgICAgICB2NGwyb3V0cHV0LT5wb29sKSwgJmJ1ZmZlcik7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIH0KKyAgfQorCisgIC8qIGFuZCBlbnN1cmUgdGhlIHByb2Nlc3NpbmcgdGhyZWFkIGhhcyBzdG9wcGVkIGluIGNhc2UgYW5vdGhlciBlcnJvcgorICAgKiBvY2N1cmVkLiAqLworICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrIChzZWxmLT52NGwyY2FwdHVyZSk7CisgIGdzdF9wYWRfc3RvcF90YXNrIChkZWNvZGVyLT5zcmNwYWQpOworICBHU1RfVklERU9fREVDT0RFUl9TVFJFQU1fTE9DSyAoZGVjb2Rlcik7CisKKyAgaWYgKHJldCA9PSBHU1RfRkxPV19GTFVTSElORykKKyAgICByZXQgPSBzZWxmLT5vdXRwdXRfZmxvdzsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZWNvZGVyLCAiRG9uZSBkcmFpbmluZyBidWZmZXJzIik7CisKKyAgLyogVE9ETyBTaGFsbCB3ZSBjbGVhbnVwIGFueSByZWZmZWQgZnJhbWUgdG8gd29ya2Fyb3VuZCBicm9rZW4gZGVjb2RlcnMgPyAqLworCitkb25lOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX3ZpZGVvX2RlY19kcmFpbiAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlcikKK3sKKyAgR3N0VjRsMlZpZGVvRGVjICpzZWxmID0gR1NUX1Y0TDJfVklERU9fREVDIChkZWNvZGVyKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiRHJhaW5pbmcuLi4iKTsKKyAgZ3N0X3Y0bDJfdmlkZW9fZGVjX2ZpbmlzaCAoZGVjb2Rlcik7CisgIGdzdF92NGwyX3ZpZGVvX2RlY19mbHVzaCAoZGVjb2Rlcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RWaWRlb0NvZGVjRnJhbWUgKgorZ3N0X3Y0bDJfdmlkZW9fZGVjX2dldF9vbGRlc3RfZnJhbWUgKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIpCit7CisgIEdzdFZpZGVvQ29kZWNGcmFtZSAqZnJhbWUgPSBOVUxMOworICBHTGlzdCAqZnJhbWVzLCAqbDsKKyAgZ2ludCBjb3VudCA9IDA7CisKKyAgZnJhbWVzID0gZ3N0X3ZpZGVvX2RlY29kZXJfZ2V0X2ZyYW1lcyAoZGVjb2Rlcik7CisKKyAgZm9yIChsID0gZnJhbWVzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KSB7CisgICAgR3N0VmlkZW9Db2RlY0ZyYW1lICpmID0gbC0+ZGF0YTsKKworICAgIGlmICghZnJhbWUgfHwgZnJhbWUtPnB0cyA+IGYtPnB0cykKKyAgICAgIGZyYW1lID0gZjsKKworICAgIGNvdW50Kys7CisgIH0KKworICBpZiAoZnJhbWUpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoZGVjb2RlciwKKyAgICAgICAgIk9sZGVzdCBmcmFtZSBpcyAlZCAlIiBHU1RfVElNRV9GT1JNQVQgIiBhbmQgJWQgZnJhbWVzIGxlZnQiLAorICAgICAgICBmcmFtZS0+c3lzdGVtX2ZyYW1lX251bWJlciwgR1NUX1RJTUVfQVJHUyAoZnJhbWUtPnB0cyksIGNvdW50IC0gMSk7CisgICAgZ3N0X3ZpZGVvX2NvZGVjX2ZyYW1lX3JlZiAoZnJhbWUpOworICB9CisKKyAgZ19saXN0X2ZyZWVfZnVsbCAoZnJhbWVzLCAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF92aWRlb19jb2RlY19mcmFtZV91bnJlZik7CisKKyAgcmV0dXJuIGZyYW1lOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdmlkZW9fZGVjX2xvb3AgKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIpCit7CisgIEdzdFY0bDJWaWRlb0RlYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0RFQyAoZGVjb2Rlcik7CisgIEdzdFY0bDJCdWZmZXJQb29sICp2NGwyX3Bvb2wgPSBHU1RfVjRMMl9CVUZGRVJfUE9PTCAoc2VsZi0+djRsMmNhcHR1cmUtPnBvb2wpOworICBHc3RCdWZmZXJQb29sICpwb29sOworICBHc3RWaWRlb0NvZGVjRnJhbWUgKmZyYW1lOworICBHc3RCdWZmZXIgKmJ1ZmZlciA9IE5VTEw7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIEdTVF9MT0dfT0JKRUNUIChkZWNvZGVyLCAiQWxsb2NhdGUgb3V0cHV0IGJ1ZmZlciIpOworCisgIHNlbGYtPm91dHB1dF9mbG93ID0gR1NUX0ZMT1dfT0s7CisgIGRvIHsKKyAgICAvKiBXZSBjYW5ub3QgdXNlIHRoZSBiYXNlIGNsYXNzIGFsbG90YXRlIGhlbHBlciBzaW5jZSBpdCB0YWtpbmcgdGhlIGludGVybmFsCisgICAgICogc3RyZWFtIGxvY2suIHdlIGtub3cgdGhhdCB0aGUgYWNxdWlyZSBtYXkgbmVlZCB0byBwb2xsIHVudGlsIG1vcmUgZnJhbWVzCisgICAgICogY29tZXMgaW4gYW5kIGhvbGRpbmcgdGhpcyBsb2NrIHdvdWxkIHByZXZlbnQgdGhhdC4KKyAgICAgKi8KKyAgICBwb29sID0gZ3N0X3ZpZGVvX2RlY29kZXJfZ2V0X2J1ZmZlcl9wb29sIChkZWNvZGVyKTsKKworICAgIC8qIFBvb2wgbWF5IGJlIE5VTEwgaWYgd2Ugc3RhcnRlZCBnb2luZyB0byBSRUFEWSBzdGF0ZSAqLworICAgIGlmIChwb29sID09IE5VTEwpIHsKKyAgICAgIHJldCA9IEdTVF9GTE9XX0ZMVVNISU5HOworICAgICAgZ290byBiZWFjaDsKKyAgICB9CisKKyAgICByZXQgPSBnc3RfYnVmZmVyX3Bvb2xfYWNxdWlyZV9idWZmZXIgKHBvb2wsICZidWZmZXIsIE5VTEwpOworICAgIGdfb2JqZWN0X3VucmVmIChwb29sKTsKKworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIGJlYWNoOworCisgICAgR1NUX0xPR19PQkpFQ1QgKGRlY29kZXIsICJQcm9jZXNzIG91dHB1dCBidWZmZXIiKTsKKyAgICByZXQgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9wcm9jZXNzICh2NGwyX3Bvb2wsICZidWZmZXIpOworCisgIH0gd2hpbGUgKHJldCA9PSBHU1RfVjRMMl9GTE9XX0NPUlJVUFRFRF9CVUZGRVIpOworCisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBiZWFjaDsKKworICBmcmFtZSA9IGdzdF92NGwyX3ZpZGVvX2RlY19nZXRfb2xkZXN0X2ZyYW1lIChkZWNvZGVyKTsKKworICBpZiAoZnJhbWUpIHsKKyAgICBmcmFtZS0+b3V0cHV0X2J1ZmZlciA9IGJ1ZmZlcjsKKyAgICBidWZmZXIgPSBOVUxMOworICAgIHJldCA9IGdzdF92aWRlb19kZWNvZGVyX2ZpbmlzaF9mcmFtZSAoZGVjb2RlciwgZnJhbWUpOworCisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgIGdvdG8gYmVhY2g7CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZWNvZGVyLCAiRGVjb2RlciBpcyBwcm9kdWNpbmcgdG9vIG1hbnkgYnVmZmVycyIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgIH0KKworICByZXR1cm47CisKK2JlYWNoOgorICBHU1RfREVCVUdfT0JKRUNUIChkZWNvZGVyLCAiTGVhdmluZyBvdXRwdXQgdGhyZWFkOiAlcyIsCisgICAgICBnc3RfZmxvd19nZXRfbmFtZSAocmV0KSk7CisKKyAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmYnVmZmVyLCBOVUxMKTsKKyAgc2VsZi0+b3V0cHV0X2Zsb3cgPSByZXQ7CisgIGdzdF92NGwyX29iamVjdF91bmxvY2sgKHNlbGYtPnY0bDJvdXRwdXQpOworICBnc3RfcGFkX3BhdXNlX3Rhc2sgKGRlY29kZXItPnNyY3BhZCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fcmVtb3ZlX3BhZGRpbmcgKEdzdENhcHNGZWF0dXJlcyAqIGZlYXR1cmVzLAorICAgIEdzdFN0cnVjdHVyZSAqIHN0cnVjdHVyZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RWNGwyVmlkZW9EZWMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19ERUMgKHVzZXJfZGF0YSk7CisgIEdzdFZpZGVvQWxpZ25tZW50ICphbGlnbiA9ICZzZWxmLT52NGwyY2FwdHVyZS0+YWxpZ247CisgIEdzdFZpZGVvSW5mbyAqaW5mbyA9ICZzZWxmLT52NGwyY2FwdHVyZS0+aW5mbzsKKyAgaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgIndpZHRoIiwgJndpZHRoKSkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiaGVpZ2h0IiwgJmhlaWdodCkpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKGFsaWduLT5wYWRkaW5nX2xlZnQgIT0gMCB8fCBhbGlnbi0+cGFkZGluZ190b3AgIT0gMCB8fAorICAgICAgaGVpZ2h0ICE9IGluZm8tPmhlaWdodCArIGFsaWduLT5wYWRkaW5nX2JvdHRvbSkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoaGVpZ2h0ID09IGluZm8tPmhlaWdodCArIGFsaWduLT5wYWRkaW5nX2JvdHRvbSkgeworICAgIC8qIFNvbWUgZHJpdmVycyBtYXkgcm91bmQgdXAgd2lkdGggdG8gdGhlIHBhZGRlZCB3aXRoICovCisgICAgaWYgKHdpZHRoID09IGluZm8tPndpZHRoICsgYWxpZ24tPnBhZGRpbmdfcmlnaHQpCisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoc3RydWN0dXJlLAorICAgICAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHdpZHRoIC0gYWxpZ24tPnBhZGRpbmdfcmlnaHQsCisgICAgICAgICAgImhlaWdodCIsIEdfVFlQRV9JTlQsIGhlaWdodCAtIGFsaWduLT5wYWRkaW5nX2JvdHRvbSwgTlVMTCk7CisgICAgLyogU29tZSBkcml2ZXJzIG1heSBrZWVwIHZpc2libGUgd2lkdGggYW5kIG9ubHkgcm91bmQgdXAgYnl0ZXNwZXJsaW5lICovCisgICAgZWxzZSBpZiAod2lkdGggPT0gaW5mby0+d2lkdGgpCisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoc3RydWN0dXJlLAorICAgICAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBoZWlnaHQgLSBhbGlnbi0+cGFkZGluZ19ib3R0b20sIE5VTEwpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdjRsMl92aWRlb19kZWNfaGFuZGxlX2ZyYW1lIChHc3RWaWRlb0RlY29kZXIgKiBkZWNvZGVyLAorICAgIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lKQoreworICBHc3RWNGwyRXJyb3IgZXJyb3IgPSBHU1RfVjRMMl9FUlJPUl9JTklUOworICBHc3RWNGwyVmlkZW9EZWMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19ERUMgKGRlY29kZXIpOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBnYm9vbGVhbiBwcm9jZXNzZWQgPSBGQUxTRTsKKyAgR3N0QnVmZmVyICp0bXA7CisgIEdzdFRhc2tTdGF0ZSB0YXNrX3N0YXRlOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJIYW5kbGluZyBmcmFtZSAlZCIsIGZyYW1lLT5zeXN0ZW1fZnJhbWVfbnVtYmVyKTsKKworICBpZiAoR19VTkxJS0VMWSAoIWdfYXRvbWljX2ludF9nZXQgKCZzZWxmLT5hY3RpdmUpKSkKKyAgICBnb3RvIGZsdXNoaW5nOworCisgIGlmIChHX1VOTElLRUxZICghR1NUX1Y0TDJfSVNfQUNUSVZFIChzZWxmLT52NGwyb3V0cHV0KSkpIHsKKyAgICBpZiAoIXNlbGYtPmlucHV0X3N0YXRlKQorICAgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKyAgICBpZiAoIWdzdF92NGwyX29iamVjdF9zZXRfZm9ybWF0IChzZWxmLT52NGwyb3V0cHV0LCBzZWxmLT5pbnB1dF9zdGF0ZS0+Y2FwcywKKyAgICAgICAgICAgICZlcnJvcikpCisgICAgICBnb3RvIG5vdF9uZWdvdGlhdGVkOworICB9CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFHU1RfVjRMMl9JU19BQ1RJVkUgKHNlbGYtPnY0bDJjYXB0dXJlKSkpIHsKKyAgICBHc3RCdWZmZXJQb29sICpwb29sID0gR1NUX0JVRkZFUl9QT09MIChzZWxmLT52NGwyb3V0cHV0LT5wb29sKTsKKyAgICBHc3RWaWRlb0luZm8gaW5mbzsKKyAgICBHc3RWaWRlb0NvZGVjU3RhdGUgKm91dHB1dF9zdGF0ZTsKKyAgICBHc3RCdWZmZXIgKmNvZGVjX2RhdGE7CisgICAgR3N0Q2FwcyAqYWNxdWlyZWRfY2FwcywgKmF2YWlsYWJsZV9jYXBzLCAqY2FwcywgKmZpbHRlcjsKKyAgICBHc3RTdHJ1Y3R1cmUgKnN0OworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlNlbmRpbmcgaGVhZGVyIik7CisKKyAgICBjb2RlY19kYXRhID0gc2VsZi0+aW5wdXRfc3RhdGUtPmNvZGVjX2RhdGE7CisKKyAgICAvKiBXZSBhcmUgcnVubmluZyBpbiBieXRlLXN0cmVhbSBtb2RlLCBzbyB3ZSBkb24ndCBrbm93IHRoZSBoZWFkZXJzLCBidXQKKyAgICAgKiB3ZSBuZWVkIHRvIHNlbmQgc29tZXRoaW5nLCBvdGhlcndpc2UgdGhlIGRlY29kZXIgd2lsbCByZWZ1c2UgdG8KKyAgICAgKiBpbnRpYWxpemUuCisgICAgICovCisgICAgaWYgKGNvZGVjX2RhdGEpIHsKKyAgICAgIGdzdF9idWZmZXJfcmVmIChjb2RlY19kYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgY29kZWNfZGF0YSA9IGdzdF9idWZmZXJfcmVmIChmcmFtZS0+aW5wdXRfYnVmZmVyKTsKKyAgICAgIHByb2Nlc3NlZCA9IFRSVUU7CisgICAgfQorCisgICAgLyogRW5zdXJlIGlucHV0IGludGVybmFsIHBvb2wgaXMgYWN0aXZlICovCisgICAgaWYgKCFnc3RfYnVmZmVyX3Bvb2xfaXNfYWN0aXZlIChwb29sKSkgeworICAgICAgR3N0U3RydWN0dXJlICpjb25maWcgPSBnc3RfYnVmZmVyX3Bvb2xfZ2V0X2NvbmZpZyAocG9vbCk7CisgICAgICBnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX3NldF9wYXJhbXMgKGNvbmZpZywgc2VsZi0+aW5wdXRfc3RhdGUtPmNhcHMsCisgICAgICAgICAgc2VsZi0+djRsMm91dHB1dC0+aW5mby5zaXplLCAyLCAyKTsKKworICAgICAgLyogVGhlcmUgaXMgbm8gcmVhc29uIHRvIHJlZnVzZSB0aGlzIGNvbmZpZyAqLworICAgICAgaWYgKCFnc3RfYnVmZmVyX3Bvb2xfc2V0X2NvbmZpZyAocG9vbCwgY29uZmlnKSkKKyAgICAgICAgZ290byBhY3RpdmF0ZV9mYWlsZWQ7CisKKyAgICAgIGlmICghZ3N0X2J1ZmZlcl9wb29sX3NldF9hY3RpdmUgKHBvb2wsIFRSVUUpKQorICAgICAgICBnb3RvIGFjdGl2YXRlX2ZhaWxlZDsKKyAgICB9CisKKyAgICBHU1RfVklERU9fREVDT0RFUl9TVFJFQU1fVU5MT0NLIChkZWNvZGVyKTsKKyAgICByZXQgPQorICAgICAgICBnc3RfdjRsMl9idWZmZXJfcG9vbF9wcm9jZXNzIChHU1RfVjRMMl9CVUZGRVJfUE9PTCAoc2VsZi0+CisgICAgICAgICAgICB2NGwyb3V0cHV0LT5wb29sKSwgJmNvZGVjX2RhdGEpOworICAgIEdTVF9WSURFT19ERUNPREVSX1NUUkVBTV9MT0NLIChkZWNvZGVyKTsKKworICAgIGdzdF9idWZmZXJfdW5yZWYgKGNvZGVjX2RhdGEpOworCisgICAgLyogRm9yIGRlY29kZXJzIEdfRk1UIHJldHVybnMgY29kZWQgc2l6ZSwgR19TRUxFQ1RJT04gcmV0dXJucyB2aXNpYmxlIHNpemUKKyAgICAgKiBpbiB0aGUgY29tcG9zZSByZWN0YW5nbGUuIGdzdF92NGwyX29iamVjdF9hY3F1aXJlX2Zvcm1hdCgpIGNoZWNrcyBib3RoCisgICAgICogYW5kIHJldHVybnMgdGhlIHZpc2libGUgc2l6ZSBhcyB3aXRoL2hlaWdodCBhbmQgdGhlIGNvZGVkIHNpemUgYXMKKyAgICAgKiBwYWRkaW5nLiAqLworICAgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X2FjcXVpcmVfZm9ybWF0IChzZWxmLT52NGwyY2FwdHVyZSwgJmluZm8pKQorICAgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKworICAgIC8qIENyZWF0ZSBjYXBzIGZyb20gdGhlIGFjcXVpcmVkIGZvcm1hdCwgcmVtb3ZlIHRoZSBmb3JtYXQgZmllbGQgKi8KKyAgICBhY3F1aXJlZF9jYXBzID0gZ3N0X3ZpZGVvX2luZm9fdG9fY2FwcyAoJmluZm8pOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJBY3F1aXJlZCBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgYWNxdWlyZWRfY2Fwcyk7CisgICAgc3QgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChhY3F1aXJlZF9jYXBzLCAwKTsKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAoc3QsICJmb3JtYXQiKTsKKworICAgIC8qIFByb2JlIGN1cnJlbnRseSBhdmFpbGFibGUgcGl4ZWwgZm9ybWF0cyAqLworICAgIGF2YWlsYWJsZV9jYXBzID0gZ3N0X3Y0bDJfb2JqZWN0X3Byb2JlX2NhcHMgKHNlbGYtPnY0bDJjYXB0dXJlLCBOVUxMKTsKKyAgICBhdmFpbGFibGVfY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGF2YWlsYWJsZV9jYXBzKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiQXZhaWxhYmxlIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBhdmFpbGFibGVfY2Fwcyk7CisKKyAgICAvKiBSZXBsYWNlIGNvZGVkIHNpemUgd2l0aCB2aXNpYmxlIHNpemUsIHdlIHdhbnQgdG8gbmVnb3RpYXRlIHZpc2libGUgc2l6ZQorICAgICAqIHdpdGggZG93bnN0cmVhbSwgbm90IGNvZGVkIHNpemUuICovCisgICAgZ3N0X2NhcHNfbWFwX2luX3BsYWNlIChhdmFpbGFibGVfY2FwcywgZ3N0X3Y0bDJfdmlkZW9fcmVtb3ZlX3BhZGRpbmcsIHNlbGYpOworCisgICAgZmlsdGVyID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGF2YWlsYWJsZV9jYXBzLCBhY3F1aXJlZF9jYXBzLAorICAgICAgICBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJGaWx0ZXJlZCBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgZmlsdGVyKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoYWNxdWlyZWRfY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGF2YWlsYWJsZV9jYXBzKTsKKyAgICBjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKGRlY29kZXItPnNyY3BhZCwgZmlsdGVyKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoZmlsdGVyKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJQb3NzaWJsZSBkZWNvZGVkIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKyAgICBpZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKGNhcHMpKSB7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICBnb3RvIG5vdF9uZWdvdGlhdGVkOworICAgIH0KKworICAgIC8qIEZpeGF0ZSBwaXhlbCBmb3JtYXQgKi8KKyAgICBjYXBzID0gZ3N0X2NhcHNfZml4YXRlIChjYXBzKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJDaG9zZW4gZGVjb2RlZCBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgICAvKiBUcnkgdG8gc2V0IG5lZ290aWF0ZWQgZm9ybWF0LCBvbiBzdWNjZXNzIHJlcGxhY2UgYWNxdWlyZWQgZm9ybWF0ICovCisgICAgaWYgKGdzdF92NGwyX29iamVjdF9zZXRfZm9ybWF0IChzZWxmLT52NGwyY2FwdHVyZSwgY2FwcywgJmVycm9yKSkKKyAgICAgIGdzdF92aWRlb19pbmZvX2Zyb21fY2FwcyAoJmluZm8sIGNhcHMpOworICAgIGVsc2UKKyAgICAgIGdzdF92NGwyX2NsZWFyX2Vycm9yICgmZXJyb3IpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAgIG91dHB1dF9zdGF0ZSA9IGdzdF92aWRlb19kZWNvZGVyX3NldF9vdXRwdXRfc3RhdGUgKGRlY29kZXIsCisgICAgICAgIGluZm8uZmluZm8tPmZvcm1hdCwgaW5mby53aWR0aCwgaW5mby5oZWlnaHQsIHNlbGYtPmlucHV0X3N0YXRlKTsKKworICAgIC8qIENvcHkgdGhlIHJlc3Qgb2YgdGhlIGluZm9ybWF0aW9uLCB0aGVyZSBtaWdodCBiZSBtb3JlIGluIHRoZSBmdXR1cmUgKi8KKyAgICBvdXRwdXRfc3RhdGUtPmluZm8uaW50ZXJsYWNlX21vZGUgPSBpbmZvLmludGVybGFjZV9tb2RlOworICAgIGdzdF92aWRlb19jb2RlY19zdGF0ZV91bnJlZiAob3V0cHV0X3N0YXRlKTsKKworICAgIGlmICghZ3N0X3ZpZGVvX2RlY29kZXJfbmVnb3RpYXRlIChkZWNvZGVyKSkgeworICAgICAgaWYgKEdTVF9QQURfSVNfRkxVU0hJTkcgKGRlY29kZXItPnNyY3BhZCkpCisgICAgICAgIGdvdG8gZmx1c2hpbmc7CisgICAgICBlbHNlCisgICAgICAgIGdvdG8gbm90X25lZ290aWF0ZWQ7CisgICAgfQorCisgICAgLyogRW5zdXJlIG91ciBpbnRlcm5hbCBwb29sIGlzIGFjdGl2YXRlZCAqLworICAgIGlmICghZ3N0X2J1ZmZlcl9wb29sX3NldF9hY3RpdmUgKEdTVF9CVUZGRVJfUE9PTCAoc2VsZi0+djRsMmNhcHR1cmUtPnBvb2wpLAorICAgICAgICAgICAgVFJVRSkpCisgICAgICBnb3RvIGFjdGl2YXRlX2ZhaWxlZDsKKyAgfQorCisgIHRhc2tfc3RhdGUgPSBnc3RfcGFkX2dldF90YXNrX3N0YXRlIChHU1RfVklERU9fREVDT0RFUl9TUkNfUEFEIChzZWxmKSk7CisgIGlmICh0YXNrX3N0YXRlID09IEdTVF9UQVNLX1NUT1BQRUQgfHwgdGFza19zdGF0ZSA9PSBHU1RfVEFTS19QQVVTRUQpIHsKKyAgICAvKiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHByb2Nlc3NpbmcgdGhyZWFkIHN0b3BwZWQgZHVlIHRvIGFuIGVycm9yICovCisgICAgaWYgKHNlbGYtPm91dHB1dF9mbG93ICE9IEdTVF9GTE9XX09LICYmCisgICAgICAgIHNlbGYtPm91dHB1dF9mbG93ICE9IEdTVF9GTE9XX0ZMVVNISU5HKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiUHJvY2Vzc2luZyBsb29wIHN0b3BwZWQgd2l0aCBlcnJvciwgbGVhdmluZyIpOworICAgICAgcmV0ID0gc2VsZi0+b3V0cHV0X2Zsb3c7CisgICAgICBnb3RvIGRyb3A7CisgICAgfQorCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlN0YXJ0aW5nIGRlY29kaW5nIHRocmVhZCIpOworCisgICAgLyogU3RhcnQgdGhlIHByb2Nlc3NpbmcgdGFzaywgd2hlbiBpdCBxdWl0cywgdGhlIHRhc2sgd2lsbCBkaXNhYmxlIGlucHV0CisgICAgICogcHJvY2Vzc2luZyB0byB1bmxvY2sgaW5wdXQgaWYgZHJhaW5pbmcsIG9yIHByZXZlbnQgcG90ZW50aWFsIGJsb2NrICovCisgICAgc2VsZi0+b3V0cHV0X2Zsb3cgPSBHU1RfRkxPV19GTFVTSElORzsKKyAgICBpZiAoIWdzdF9wYWRfc3RhcnRfdGFzayAoZGVjb2Rlci0+c3JjcGFkLAorICAgICAgICAgICAgKEdzdFRhc2tGdW5jdGlvbikgZ3N0X3Y0bDJfdmlkZW9fZGVjX2xvb3AsIHNlbGYsIE5VTEwpKQorICAgICAgZ290byBzdGFydF90YXNrX2ZhaWxlZDsKKyAgfQorCisgIGlmICghcHJvY2Vzc2VkKSB7CisgICAgR1NUX1ZJREVPX0RFQ09ERVJfU1RSRUFNX1VOTE9DSyAoZGVjb2Rlcik7CisgICAgcmV0ID0KKyAgICAgICAgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcHJvY2VzcyAoR1NUX1Y0TDJfQlVGRkVSX1BPT0wgKHNlbGYtPnY0bDJvdXRwdXQtPgorICAgICAgICAgICAgcG9vbCksICZmcmFtZS0+aW5wdXRfYnVmZmVyKTsKKyAgICBHU1RfVklERU9fREVDT0RFUl9TVFJFQU1fTE9DSyAoZGVjb2Rlcik7CisKKyAgICBpZiAocmV0ID09IEdTVF9GTE9XX0ZMVVNISU5HKSB7CisgICAgICBpZiAoZ3N0X3BhZF9nZXRfdGFza19zdGF0ZSAoR1NUX1ZJREVPX0RFQ09ERVJfU1JDX1BBRCAoc2VsZikpICE9CisgICAgICAgICAgR1NUX1RBU0tfU1RBUlRFRCkKKyAgICAgICAgcmV0ID0gc2VsZi0+b3V0cHV0X2Zsb3c7CisgICAgICBnb3RvIGRyb3A7CisgICAgfSBlbHNlIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgIGdvdG8gcHJvY2Vzc19mYWlsZWQ7CisgICAgfQorICB9CisKKyAgLyogTm8gbmVlZCB0byBrZWVwIGlucHV0IGFycm91bmQgKi8KKyAgdG1wID0gZnJhbWUtPmlucHV0X2J1ZmZlcjsKKyAgZnJhbWUtPmlucHV0X2J1ZmZlciA9IGdzdF9idWZmZXJfbmV3ICgpOworICBnc3RfYnVmZmVyX2NvcHlfaW50byAoZnJhbWUtPmlucHV0X2J1ZmZlciwgdG1wLAorICAgICAgR1NUX0JVRkZFUl9DT1BZX0ZMQUdTIHwgR1NUX0JVRkZFUl9DT1BZX1RJTUVTVEFNUFMgfAorICAgICAgR1NUX0JVRkZFUl9DT1BZX01FVEEsIDAsIDApOworICBnc3RfYnVmZmVyX3VucmVmICh0bXApOworCisgIGdzdF92aWRlb19jb2RlY19mcmFtZV91bnJlZiAoZnJhbWUpOworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworbm90X25lZ290aWF0ZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAibm90IG5lZ290aWF0ZWQiKTsKKyAgICByZXQgPSBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICBnc3RfdjRsMl9lcnJvciAoc2VsZiwgJmVycm9yKTsKKyAgICBnb3RvIGRyb3A7CisgIH0KK2FjdGl2YXRlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzZWxmLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIpKSwKKyAgICAgICAgKCJCdWZmZXIgcG9vbCBhY3RpdmF0aW9uIGZhaWxlZCIpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGRyb3A7CisgIH0KK2ZsdXNoaW5nOgorICB7CisgICAgcmV0ID0gR1NUX0ZMT1dfRkxVU0hJTkc7CisgICAgZ290byBkcm9wOworICB9CisKK3N0YXJ0X3Rhc2tfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNlbGYsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgIChfKCJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIpKSwgKE5VTEwpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGRyb3A7CisgIH0KK3Byb2Nlc3NfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNlbGYsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgIChfKCJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iKSksCisgICAgICAgICgiTWF5YmUgYmUgZHVlIHRvIG5vdCBlbm91Z2ggbWVtb3J5IG9yIGZhaWxpbmcgZHJpdmVyIikpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZHJvcDsKKyAgfQorZHJvcDoKKyAgeworICAgIGdzdF92aWRlb19kZWNvZGVyX2Ryb3BfZnJhbWUgKGRlY29kZXIsIGZyYW1lKTsKKyAgICByZXR1cm4gcmV0OworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fZGVjX2RlY2lkZV9hbGxvY2F0aW9uIChHc3RWaWRlb0RlY29kZXIgKiBkZWNvZGVyLAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdFY0bDJWaWRlb0RlYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0RFQyAoZGVjb2Rlcik7CisgIEdzdENsb2NrVGltZSBsYXRlbmN5OworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBpZiAoZ3N0X3Y0bDJfb2JqZWN0X2RlY2lkZV9hbGxvY2F0aW9uIChzZWxmLT52NGwyY2FwdHVyZSwgcXVlcnkpKQorICAgIHJldCA9IEdTVF9WSURFT19ERUNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kZWNpZGVfYWxsb2NhdGlvbiAoZGVjb2RlciwKKyAgICAgICAgcXVlcnkpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc2VsZi0+djRsMmNhcHR1cmUtPmR1cmF0aW9uKSkgeworICAgIGxhdGVuY3kgPSBzZWxmLT52NGwyY2FwdHVyZS0+bWluX2J1ZmZlcnMgKiBzZWxmLT52NGwyY2FwdHVyZS0+ZHVyYXRpb247CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlNldHRpbmcgbGF0ZW5jeTogJSIgR1NUX1RJTUVfRk9STUFUICIgKCUiCisgICAgICAgIEdfR1VJTlQzMl9GT1JNQVQgIiAqICUiIEdfR1VJTlQ2NF9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGxhdGVuY3kpLAorICAgICAgICBzZWxmLT52NGwyY2FwdHVyZS0+bWluX2J1ZmZlcnMsIHNlbGYtPnY0bDJjYXB0dXJlLT5kdXJhdGlvbik7CisgICAgZ3N0X3ZpZGVvX2RlY29kZXJfc2V0X2xhdGVuY3kgKGRlY29kZXIsIGxhdGVuY3ksIGxhdGVuY3kpOworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc2VsZiwgIkR1cmF0aW9uIGludmFsaWQsIG5vdCBzZXR0aW5nIGxhdGVuY3kiKTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fZGVjX3NyY19xdWVyeSAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlciwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKyAgR3N0VjRsMlZpZGVvRGVjICpzZWxmID0gR1NUX1Y0TDJfVklERU9fREVDIChkZWNvZGVyKTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9DQVBTOnsKKyAgICAgIEdzdENhcHMgKmZpbHRlciwgKnJlc3VsdCA9IE5VTEw7CisgICAgICBHc3RQYWQgKnBhZCA9IEdTVF9WSURFT19ERUNPREVSX1NSQ19QQUQgKGRlY29kZXIpOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY2FwcyAocXVlcnksICZmaWx0ZXIpOworCisgICAgICBpZiAoc2VsZi0+cHJvYmVkX3NyY2NhcHMpCisgICAgICAgIHJlc3VsdCA9IGdzdF9jYXBzX3JlZiAoc2VsZi0+cHJvYmVkX3NyY2NhcHMpOworICAgICAgZWxzZQorICAgICAgICByZXN1bHQgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAocGFkKTsKKworICAgICAgaWYgKGZpbHRlcikgeworICAgICAgICBHc3RDYXBzICp0bXAgPSByZXN1bHQ7CisgICAgICAgIHJlc3VsdCA9CisgICAgICAgICAgICBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCB0bXAsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgICAgIGdzdF9jYXBzX3VucmVmICh0bXApOworICAgICAgfQorCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiUmV0dXJuaW5nIHNyYyBjYXBzICUiIEdTVF9QVFJfRk9STUFULCByZXN1bHQpOworCisgICAgICBnc3RfcXVlcnlfc2V0X2NhcHNfcmVzdWx0IChxdWVyeSwgcmVzdWx0KTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChyZXN1bHQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IEdTVF9WSURFT19ERUNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zcmNfcXVlcnkgKGRlY29kZXIsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3Y0bDJfdmlkZW9fZGVjX3NpbmtfZ2V0Y2FwcyAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlciwgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0VjRsMlZpZGVvRGVjICpzZWxmID0gR1NUX1Y0TDJfVklERU9fREVDIChkZWNvZGVyKTsKKyAgR3N0Q2FwcyAqcmVzdWx0OworCisgIHJlc3VsdCA9IGdzdF92aWRlb19kZWNvZGVyX3Byb3h5X2dldGNhcHMgKGRlY29kZXIsIHNlbGYtPnByb2JlZF9zaW5rY2FwcywKKyAgICAgIGZpbHRlcik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlJldHVybmluZyBzaW5rIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIHJlc3VsdCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl92aWRlb19kZWNfc2lua19ldmVudCAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlciwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0VjRsMlZpZGVvRGVjICpzZWxmID0gR1NUX1Y0TDJfVklERU9fREVDIChkZWNvZGVyKTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUQVJUOgorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImZsdXNoIHN0YXJ0Iik7CisgICAgICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrIChzZWxmLT52NGwyb3V0cHV0KTsKKyAgICAgIGdzdF92NGwyX29iamVjdF91bmxvY2sgKHNlbGYtPnY0bDJjYXB0dXJlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9WSURFT19ERUNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChkZWNvZGVyLCBldmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RBUlQ6CisgICAgICAvKiBUaGUgcHJvY2Vzc2luZyB0aHJlYWQgc2hvdWxkIHN0b3Agbm93LCB3YWl0IGZvciBpdCAqLworICAgICAgZ3N0X3BhZF9zdG9wX3Rhc2sgKGRlY29kZXItPnNyY3BhZCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiZmx1c2ggc3RhcnQgZG9uZSIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfdjRsMl92aWRlb19kZWNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RWNGwyVmlkZW9EZWMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19ERUMgKGVsZW1lbnQpOworICBHc3RWaWRlb0RlY29kZXIgKmRlY29kZXIgPSBHU1RfVklERU9fREVDT0RFUiAoZWxlbWVudCk7CisKKyAgaWYgKHRyYW5zaXRpb24gPT0gR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFkpIHsKKyAgICBnX2F0b21pY19pbnRfc2V0ICgmc2VsZi0+YWN0aXZlLCBGQUxTRSk7CisgICAgZ3N0X3Y0bDJfb2JqZWN0X3VubG9jayAoc2VsZi0+djRsMm91dHB1dCk7CisgICAgZ3N0X3Y0bDJfb2JqZWN0X3VubG9jayAoc2VsZi0+djRsMmNhcHR1cmUpOworICAgIGdzdF9wYWRfc3RvcF90YXNrIChkZWNvZGVyLT5zcmNwYWQpOworICB9CisKKyAgcmV0dXJuIEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdmlkZW9fZGVjX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFY0bDJWaWRlb0RlYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0RFQyAob2JqZWN0KTsKKworICBnc3RfY2Fwc19yZXBsYWNlICgmc2VsZi0+cHJvYmVkX3NpbmtjYXBzLCBOVUxMKTsKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNlbGYtPnByb2JlZF9zcmNjYXBzLCBOVUxMKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3ZpZGVvX2RlY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0VjRsMlZpZGVvRGVjICpzZWxmID0gR1NUX1Y0TDJfVklERU9fREVDIChvYmplY3QpOworCisgIGdzdF92NGwyX29iamVjdF9kZXN0cm95IChzZWxmLT52NGwyY2FwdHVyZSk7CisgIGdzdF92NGwyX29iamVjdF9kZXN0cm95IChzZWxmLT52NGwyb3V0cHV0KTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl92aWRlb19kZWNfaW5pdCAoR3N0VjRsMlZpZGVvRGVjICogc2VsZikKK3sKKyAgLyogVjRMMiBvYmplY3QgYXJlIGNyZWF0ZWQgaW4gc3ViaW5zdGFuY2VfaW5pdCAqLworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdmlkZW9fZGVjX3N1Ymluc3RhbmNlX2luaXQgKEdUeXBlSW5zdGFuY2UgKiBpbnN0YW5jZSwgZ3BvaW50ZXIgZ19jbGFzcykKK3sKKyAgR3N0VjRsMlZpZGVvRGVjQ2xhc3MgKmtsYXNzID0gR1NUX1Y0TDJfVklERU9fREVDX0NMQVNTIChnX2NsYXNzKTsKKyAgR3N0VjRsMlZpZGVvRGVjICpzZWxmID0gR1NUX1Y0TDJfVklERU9fREVDIChpbnN0YW5jZSk7CisgIEdzdFZpZGVvRGVjb2RlciAqZGVjb2RlciA9IEdTVF9WSURFT19ERUNPREVSIChpbnN0YW5jZSk7CisKKyAgZ3N0X3ZpZGVvX2RlY29kZXJfc2V0X3BhY2tldGl6ZWQgKGRlY29kZXIsIFRSVUUpOworCisgIHNlbGYtPnY0bDJvdXRwdXQgPSBnc3RfdjRsMl9vYmplY3RfbmV3IChHU1RfRUxFTUVOVCAoc2VsZiksCisgICAgICBHU1RfT0JKRUNUIChHU1RfVklERU9fREVDT0RFUl9TSU5LX1BBRCAoc2VsZikpLAorICAgICAgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQsIGtsYXNzLT5kZWZhdWx0X2RldmljZSwKKyAgICAgIGdzdF92NGwyX2dldF9vdXRwdXQsIGdzdF92NGwyX3NldF9vdXRwdXQsIE5VTEwpOworICBzZWxmLT52NGwyb3V0cHV0LT5ub19pbml0aWFsX2Zvcm1hdCA9IFRSVUU7CisgIHNlbGYtPnY0bDJvdXRwdXQtPmtlZXBfYXNwZWN0ID0gRkFMU0U7CisKKyAgc2VsZi0+djRsMmNhcHR1cmUgPSBnc3RfdjRsMl9vYmplY3RfbmV3IChHU1RfRUxFTUVOVCAoc2VsZiksCisgICAgICBHU1RfT0JKRUNUIChHU1RfVklERU9fREVDT0RFUl9TUkNfUEFEIChzZWxmKSksCisgICAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsIGtsYXNzLT5kZWZhdWx0X2RldmljZSwKKyAgICAgIGdzdF92NGwyX2dldF9pbnB1dCwgZ3N0X3Y0bDJfc2V0X2lucHV0LCBOVUxMKTsKKyAgc2VsZi0+djRsMmNhcHR1cmUtPm5vX2luaXRpYWxfZm9ybWF0ID0gVFJVRTsKKyAgc2VsZi0+djRsMm91dHB1dC0+a2VlcF9hc3BlY3QgPSBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3ZpZGVvX2RlY19jbGFzc19pbml0IChHc3RWNGwyVmlkZW9EZWNDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3M7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0VmlkZW9EZWNvZGVyQ2xhc3MgKnZpZGVvX2RlY29kZXJfY2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICB2aWRlb19kZWNvZGVyX2NsYXNzID0gKEdzdFZpZGVvRGVjb2RlckNsYXNzICopIGtsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfdjRsMl92aWRlb19kZWNfZGVidWcsICJ2NGwydmlkZW9kZWMiLCAwLAorICAgICAgIlY0TDIgVmlkZW8gRGVjb2RlciIpOworCisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZGVjX2Rpc3Bvc2UpOworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19kZWNfZmluYWxpemUpOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2RlY19zZXRfcHJvcGVydHkpOworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2RlY19nZXRfcHJvcGVydHkpOworCisgIHZpZGVvX2RlY29kZXJfY2xhc3MtPm9wZW4gPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZGVjX29wZW4pOworICB2aWRlb19kZWNvZGVyX2NsYXNzLT5jbG9zZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19kZWNfY2xvc2UpOworICB2aWRlb19kZWNvZGVyX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19kZWNfc3RhcnQpOworICB2aWRlb19kZWNvZGVyX2NsYXNzLT5zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2RlY19zdG9wKTsKKyAgdmlkZW9fZGVjb2Rlcl9jbGFzcy0+ZmluaXNoID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2RlY19maW5pc2gpOworICB2aWRlb19kZWNvZGVyX2NsYXNzLT5mbHVzaCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19kZWNfZmx1c2gpOworICB2aWRlb19kZWNvZGVyX2NsYXNzLT5kcmFpbiA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19kZWNfZHJhaW4pOworICB2aWRlb19kZWNvZGVyX2NsYXNzLT5zZXRfZm9ybWF0ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19kZWNfc2V0X2Zvcm1hdCk7CisgIHZpZGVvX2RlY29kZXJfY2xhc3MtPm5lZ290aWF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZGVjX25lZ290aWF0ZSk7CisgIHZpZGVvX2RlY29kZXJfY2xhc3MtPmRlY2lkZV9hbGxvY2F0aW9uID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19kZWNfZGVjaWRlX2FsbG9jYXRpb24pOworICAvKiBGSVhNRSBwcm9wb3NlX2FsbG9jYXRpb24gb3Igbm90ID8gKi8KKyAgdmlkZW9fZGVjb2Rlcl9jbGFzcy0+aGFuZGxlX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19kZWNfaGFuZGxlX2ZyYW1lKTsKKyAgdmlkZW9fZGVjb2Rlcl9jbGFzcy0+Z2V0Y2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZGVjX3NpbmtfZ2V0Y2Fwcyk7CisgIHZpZGVvX2RlY29kZXJfY2xhc3MtPnNyY19xdWVyeSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZGVjX3NyY19xdWVyeSk7CisgIHZpZGVvX2RlY29kZXJfY2xhc3MtPnNpbmtfZXZlbnQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2RlY19zaW5rX2V2ZW50KTsKKworICBlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2RlY19jaGFuZ2Vfc3RhdGUpOworCisgIGdzdF92NGwyX29iamVjdF9pbnN0YWxsX20ybV9wcm9wZXJ0aWVzX2hlbHBlciAoZ29iamVjdF9jbGFzcyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl92aWRlb19kZWNfc3ViY2xhc3NfaW5pdCAoZ3BvaW50ZXIgZ19jbGFzcywgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR3N0VjRsMlZpZGVvRGVjQ2xhc3MgKmtsYXNzID0gR1NUX1Y0TDJfVklERU9fREVDX0NMQVNTIChnX2NsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGdfY2xhc3MpOworICBHc3RWNGwyVmlkZW9EZWNDRGF0YSAqY2RhdGEgPSBkYXRhOworCisgIGtsYXNzLT5kZWZhdWx0X2RldmljZSA9IGNkYXRhLT5kZXZpY2U7CisKKyAgLyogTm90ZTogZ3N0X3BhZF90ZW1wbGF0ZV9uZXcoKSB0YWtlIHRoZSBmbG9hdGluZyByZWYgZnJvbSB0aGUgY2FwcyAqLworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgZ3N0X3BhZF90ZW1wbGF0ZV9uZXcgKCJzaW5rIiwgR1NUX1BBRF9TSU5LLCBHU1RfUEFEX0FMV0FZUywKKyAgICAgICAgICBjZGF0YS0+c2lua19jYXBzKSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICBnc3RfcGFkX3RlbXBsYXRlX25ldyAoInNyYyIsIEdTVF9QQURfU1JDLCBHU1RfUEFEX0FMV0FZUywKKyAgICAgICAgICBjZGF0YS0+c3JjX2NhcHMpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCBjZGF0YS0+bG9uZ25hbWUsCisgICAgICAiQ29kZWMvRGVjb2Rlci9WaWRlbyIsIGNkYXRhLT5kZXNjcmlwdGlvbiwKKyAgICAgICJOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+Iik7CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGNkYXRhLT5zaW5rX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2RhdGEtPnNyY19jYXBzKTsKKyAgZ19mcmVlIChjZGF0YSk7Cit9CisKKy8qIFByb2JpbmcgZnVuY3Rpb25zICovCitnYm9vbGVhbgorZ3N0X3Y0bDJfaXNfdmlkZW9fZGVjIChHc3RDYXBzICogc2lua19jYXBzLCBHc3RDYXBzICogc3JjX2NhcHMpCit7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIGlmIChnc3RfY2Fwc19pc19zdWJzZXQgKHNpbmtfY2FwcywgZ3N0X3Y0bDJfb2JqZWN0X2dldF9jb2RlY19jYXBzICgpKQorICAgICAgJiYgZ3N0X2NhcHNfaXNfc3Vic2V0IChzcmNfY2FwcywgZ3N0X3Y0bDJfb2JqZWN0X2dldF9yYXdfY2FwcyAoKSkpCisgICAgcmV0ID0gVFJVRTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2NoYXIgKgorZ3N0X3Y0bDJfdmlkZW9fZGVjX3NldF9tZXRhZGF0YSAoR3N0U3RydWN0dXJlICogcywgR3N0VjRsMlZpZGVvRGVjQ0RhdGEgKiBjZGF0YSwKKyAgICBjb25zdCBnY2hhciAqIGJhc2VuYW1lKQoreworICBnY2hhciAqY29kZWNfbmFtZSA9IE5VTEw7CisgIGdjaGFyICp0eXBlX25hbWUgPSBOVUxMOworCisjZGVmaW5lIFNFVF9NRVRBKGNvZGVjKSBcCitHX1NUTVRfU1RBUlQgeyBcCisgIGNkYXRhLT5sb25nbmFtZSA9ICJWNEwyICIgY29kZWMgIiBEZWNvZGVyIjsgXAorICBjZGF0YS0+ZGVzY3JpcHRpb24gPSAiRGVjb2RlcyAiIGNvZGVjICIgc3RyZWFtcyB2aWEgVjRMMiBBUEkiOyBcCisgIGNvZGVjX25hbWUgPSBnX2FzY2lpX3N0cmRvd24gKGNvZGVjLCAtMSk7IFwKK30gR19TVE1UX0VORAorCisgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiaW1hZ2UvanBlZyIpKSB7CisgICAgU0VUX01FVEEgKCJKUEVHIik7CisgIH0gZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgInZpZGVvL21wZWciKSkgeworICAgIGdpbnQgbXBlZ3ZlcnNpb24gPSAwOworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgIm1wZWd2ZXJzaW9uIiwgJm1wZWd2ZXJzaW9uKTsKKworICAgIGlmIChtcGVndmVyc2lvbiA9PSAyKSB7CisgICAgICBTRVRfTUVUQSAoIk1QRUcyIik7CisgICAgfSBlbHNlIHsKKyAgICAgIFNFVF9NRVRBICgiTVBFRzQiKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgInZpZGVvL3gtaDI2MyIpKSB7CisgICAgU0VUX01FVEEgKCJIMjYzIik7CisgIH0gZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgInZpZGVvL3gtaDI2NCIpKSB7CisgICAgU0VUX01FVEEgKCJIMjY0Iik7CisgIH0gZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgInZpZGVvL3gtd212IikpIHsKKyAgICBTRVRfTUVUQSAoIlZDMSIpOworICB9IGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJ2aWRlby94LXZwOCIpKSB7CisgICAgU0VUX01FVEEgKCJWUDgiKTsKKyAgfSBlbHNlIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAidmlkZW8veC12cDkiKSkgeworICAgIFNFVF9NRVRBICgiVlA5Iik7CisgIH0gZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgInZpZGVvL3gtYmF5ZXIiKSkgeworICAgIFNFVF9NRVRBICgiQkFZRVIiKTsKKyAgfSBlbHNlIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAidmlkZW8veC1zb25peCIpKSB7CisgICAgU0VUX01FVEEgKCJTT05JWCIpOworICB9IGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJ2aWRlby94LXB3YzEiKSkgeworICAgIFNFVF9NRVRBICgiUFdDMSIpOworICB9IGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJ2aWRlby94LXB3YzIiKSkgeworICAgIFNFVF9NRVRBICgiUFdDMiIpOworICB9IGVsc2UgeworICAgIC8qIFRoaXMgY29kZSBzaG91bGQgYmUga2VwdCBvbiBzeW5jIHdpdGggdGhlIGV4cG9zZWQgQ09ERUMgdHlwZSBvZiBmb3JtYXQKKyAgICAgKiBmcm9tIGdzdHY0bDJvYmplY3QuYy4gVGhpcyB3YXJuaW5nIHdpbGwgb25seSBvY2N1cmUgaW4gY2FzZSB3ZSBmb3JnZXQKKyAgICAgKiB0byBhbHNvIGFkZCBhIGZvcm1hdCBoZXJlLiAqLworICAgIGdjaGFyICpzX3N0ciA9IGdzdF9zdHJ1Y3R1cmVfdG9fc3RyaW5nIChzKTsKKyAgICBnX3dhcm5pbmcgKCJNaXNzaW5nIGZpeGVkIG5hbWUgbWFwcGluZyBmb3IgY2FwcyAnJXMnLCB0aGlzIGlzIGEgR1N0cmVhbWVyICIKKyAgICAgICAgImJ1ZywgcGxlYXNlIHJlcG9ydCBhdCBodHRwczovL2J1Z3MuZ25vbWUub3JnIiwgc19zdHIpOworICAgIGdfZnJlZSAoc19zdHIpOworICB9CisKKyAgaWYgKGNvZGVjX25hbWUpIHsKKyAgICB0eXBlX25hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJ2NGwyJXNkZWMiLCBjb2RlY19uYW1lKTsKKyAgICBpZiAoZ190eXBlX2Zyb21fbmFtZSAodHlwZV9uYW1lKSAhPSAwKSB7CisgICAgICBnX2ZyZWUgKHR5cGVfbmFtZSk7CisgICAgICB0eXBlX25hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJ2NGwyJXMlc2RlYyIsIGJhc2VuYW1lLCBjb2RlY19uYW1lKTsKKyAgICB9CisKKyAgICBnX2ZyZWUgKGNvZGVjX25hbWUpOworICB9CisKKyAgcmV0dXJuIHR5cGVfbmFtZTsKKyN1bmRlZiBTRVRfTUVUQQorfQorCit2b2lkCitnc3RfdjRsMl92aWRlb19kZWNfcmVnaXN0ZXIgKEdzdFBsdWdpbiAqIHBsdWdpbiwgY29uc3QgZ2NoYXIgKiBiYXNlbmFtZSwKKyAgICBjb25zdCBnY2hhciAqIGRldmljZV9wYXRoLCBHc3RDYXBzICogc2lua19jYXBzLCBHc3RDYXBzICogc3JjX2NhcHMpCit7CisgIGdpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgZ3N0X2NhcHNfZ2V0X3NpemUgKHNpbmtfY2Fwcyk7IGkrKykgeworICAgIEdzdFY0bDJWaWRlb0RlY0NEYXRhICpjZGF0YTsKKyAgICBHc3RTdHJ1Y3R1cmUgKnM7CisgICAgR1R5cGVRdWVyeSB0eXBlX3F1ZXJ5OworICAgIEdUeXBlSW5mbyB0eXBlX2luZm8gPSB7IDAsIH07CisgICAgR1R5cGUgdHlwZSwgc3VidHlwZTsKKyAgICBnY2hhciAqdHlwZV9uYW1lOworCisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHNpbmtfY2FwcywgaSk7CisKKyAgICBjZGF0YSA9IGdfbmV3MCAoR3N0VjRsMlZpZGVvRGVjQ0RhdGEsIDEpOworICAgIGNkYXRhLT5kZXZpY2UgPSBnX3N0cmR1cCAoZGV2aWNlX3BhdGgpOworICAgIGNkYXRhLT5zaW5rX2NhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHkgKCk7CisgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoY2RhdGEtPnNpbmtfY2FwcywgZ3N0X3N0cnVjdHVyZV9jb3B5IChzKSk7CisgICAgY2RhdGEtPnNyY19jYXBzID0gZ3N0X2NhcHNfcmVmIChzcmNfY2Fwcyk7CisgICAgdHlwZV9uYW1lID0gZ3N0X3Y0bDJfdmlkZW9fZGVjX3NldF9tZXRhZGF0YSAocywgY2RhdGEsIGJhc2VuYW1lKTsKKworICAgIC8qIFNraXAgb3ZlciBpZiB3ZSBoaXQgYW4gdW5tYXBwZWQgdHlwZSAqLworICAgIGlmICghdHlwZV9uYW1lKSB7CisgICAgICBnX2ZyZWUgKGNkYXRhKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHR5cGUgPSBnc3RfdjRsMl92aWRlb19kZWNfZ2V0X3R5cGUgKCk7CisgICAgZ190eXBlX3F1ZXJ5ICh0eXBlLCAmdHlwZV9xdWVyeSk7CisgICAgbWVtc2V0ICgmdHlwZV9pbmZvLCAwLCBzaXplb2YgKHR5cGVfaW5mbykpOworICAgIHR5cGVfaW5mby5jbGFzc19zaXplID0gdHlwZV9xdWVyeS5jbGFzc19zaXplOworICAgIHR5cGVfaW5mby5pbnN0YW5jZV9zaXplID0gdHlwZV9xdWVyeS5pbnN0YW5jZV9zaXplOworICAgIHR5cGVfaW5mby5jbGFzc19pbml0ID0gZ3N0X3Y0bDJfdmlkZW9fZGVjX3N1YmNsYXNzX2luaXQ7CisgICAgdHlwZV9pbmZvLmNsYXNzX2RhdGEgPSBjZGF0YTsKKyAgICB0eXBlX2luZm8uaW5zdGFuY2VfaW5pdCA9IGdzdF92NGwyX3ZpZGVvX2RlY19zdWJpbnN0YW5jZV9pbml0OworCisgICAgc3VidHlwZSA9IGdfdHlwZV9yZWdpc3Rlcl9zdGF0aWMgKHR5cGUsIHR5cGVfbmFtZSwgJnR5cGVfaW5mbywgMCk7CisgICAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCB0eXBlX25hbWUsIEdTVF9SQU5LX1BSSU1BUlkgKyAxLAorICAgICAgICAgICAgc3VidHlwZSkpCisgICAgICBHU1RfV0FSTklORyAoIkZhaWxlZCB0byByZWdpc3RlciBwbHVnaW4gJyVzJyIsIHR5cGVfbmFtZSk7CisKKyAgICBnX2ZyZWUgKHR5cGVfbmFtZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5oIGIvc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU5N2QxMAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgQ29sbGFib3JhIEx0ZC4KKyAqICAgICBBdXRob3I6IE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9fR1NUX1Y0TDJfVklERU9fREVDX0hfXworI2RlZmluZSBfX0dTVF9WNEwyX1ZJREVPX0RFQ19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9kZWNvZGVyLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvbWV0YS5oPgorCisjaW5jbHVkZSA8Z3N0djRsMm9iamVjdC5oPgorI2luY2x1ZGUgPGdzdHY0bDJidWZmZXJwb29sLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9WNEwyX1ZJREVPX0RFQyBcCisgIChnc3RfdjRsMl92aWRlb19kZWNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1Y0TDJfVklERU9fREVDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVjRMMl9WSURFT19ERUMsR3N0VjRsMlZpZGVvRGVjKSkKKyNkZWZpbmUgR1NUX1Y0TDJfVklERU9fREVDX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1Y0TDJfVklERU9fREVDLEdzdFY0bDJWaWRlb0RlY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJfVklERU9fREVDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfVjRMMl9WSURFT19ERUMpKQorI2RlZmluZSBHU1RfSVNfVjRMMl9WSURFT19ERUNfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1Y0TDJfVklERU9fREVDKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJWaWRlb0RlYyBHc3RWNGwyVmlkZW9EZWM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMlZpZGVvRGVjQ2xhc3MgR3N0VjRsMlZpZGVvRGVjQ2xhc3M7CisKK3N0cnVjdCBfR3N0VjRsMlZpZGVvRGVjCit7CisgIEdzdFZpZGVvRGVjb2RlciBwYXJlbnQ7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKyAgR3N0VjRsMk9iamVjdCAqIHY0bDJvdXRwdXQ7CisgIEdzdFY0bDJPYmplY3QgKiB2NGwyY2FwdHVyZTsKKworICAvKiBwYWRzICovCisgIEdzdENhcHMgKnByb2JlZF9zcmNjYXBzOworICBHc3RDYXBzICpwcm9iZWRfc2lua2NhcHM7CisKKyAgLyogU3RhdGUgKi8KKyAgR3N0VmlkZW9Db2RlY1N0YXRlICppbnB1dF9zdGF0ZTsKKyAgZ2Jvb2xlYW4gYWN0aXZlOworICBHc3RGbG93UmV0dXJuIG91dHB1dF9mbG93OworfTsKKworc3RydWN0IF9Hc3RWNGwyVmlkZW9EZWNDbGFzcworeworICBHc3RWaWRlb0RlY29kZXJDbGFzcyBwYXJlbnRfY2xhc3M7CisKKyAgZ2NoYXIgKmRlZmF1bHRfZGV2aWNlOworfTsKKworR1R5cGUgZ3N0X3Y0bDJfdmlkZW9fZGVjX2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3Y0bDJfaXNfdmlkZW9fZGVjICAgICAgIChHc3RDYXBzICogc2lua19jYXBzLCBHc3RDYXBzICogc3JjX2NhcHMpOwordm9pZCAgICAgZ3N0X3Y0bDJfdmlkZW9fZGVjX3JlZ2lzdGVyIChHc3RQbHVnaW4gKiBwbHVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpiYXNlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKmRldmljZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RDYXBzICogc2lua19jYXBzLCBHc3RDYXBzICogc3JjX2NhcHMpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfVjRMMl9WSURFT19ERUNfSF9fICovCmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwydmlkZW9lbmMuYyBiL3N5cy92NGwyL2dzdHY0bDJ2aWRlb2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNjVhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwydmlkZW9lbmMuYwpAQCAtMCwwICsxLDExODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNyBTVU1PTU8gQ29tcHV0ZXIgQXNzb2NpYXRpb24KKyAqICAgICBBdXRob3JzIEF5YWthIDxheWFrYUBzb3VsaWsuaW5mbz4KKyAqIENvcHlyaWdodCAoQykgMjAxNyBDb2xsYWJvcmEgTHRkLgorICogICAgIEF1dGhvcjogTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdHY0bDJvYmplY3QuaCIKKyNpbmNsdWRlICJnc3R2NGwydmlkZW9lbmMuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3Y0bDJfdmlkZW9fZW5jX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF92NGwyX3ZpZGVvX2VuY19kZWJ1ZworCit0eXBlZGVmIHN0cnVjdAoreworICBnY2hhciAqZGV2aWNlOworICBHc3RDYXBzICpzaW5rX2NhcHM7CisgIEdzdENhcHMgKnNyY19jYXBzOworfSBHc3RWNGwyVmlkZW9FbmNDRGF0YTsKKworZW51bQoreworICBQUk9QXzAsCisgIFY0TDJfU1REX09CSkVDVF9QUk9QUywKK307CisKKyNkZWZpbmUgZ3N0X3Y0bDJfdmlkZW9fZW5jX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX0FCU1RSQUNUX1RZUEUgKEdzdFY0bDJWaWRlb0VuYywgZ3N0X3Y0bDJfdmlkZW9fZW5jLAorICAgIEdTVF9UWVBFX1ZJREVPX0VOQ09ERVIpOworCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdmlkZW9fZW5jX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWNGwyVmlkZW9FbmMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19FTkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0NBUFRVUkVfSU9fTU9ERToKKyAgICAgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X3NldF9wcm9wZXJ0eV9oZWxwZXIgKHNlbGYtPnY0bDJjYXB0dXJlLAorICAgICAgICAgICAgICBwcm9wX2lkLCB2YWx1ZSwgcHNwZWMpKSB7CisgICAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgICAgLyogQnkgZGVmYXVsdCwgb25seSBzZXQgb24gb3V0cHV0ICovCisgICAgZGVmYXVsdDoKKyAgICAgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X3NldF9wcm9wZXJ0eV9oZWxwZXIgKHNlbGYtPnY0bDJvdXRwdXQsCisgICAgICAgICAgICAgIHByb3BfaWQsIHZhbHVlLCBwc3BlYykpIHsKKyAgICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl92aWRlb19lbmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFY0bDJWaWRlb0VuYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0VOQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ0FQVFVSRV9JT19NT0RFOgorICAgICAgaWYgKCFnc3RfdjRsMl9vYmplY3RfZ2V0X3Byb3BlcnR5X2hlbHBlciAoc2VsZi0+djRsMmNhcHR1cmUsCisgICAgICAgICAgICAgIHByb3BfaWQsIHZhbHVlLCBwc3BlYykpIHsKKyAgICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgICAvKiBCeSBkZWZhdWx0IHJlYWQgZnJvbSBvdXRwdXQgKi8KKyAgICBkZWZhdWx0OgorICAgICAgaWYgKCFnc3RfdjRsMl9vYmplY3RfZ2V0X3Byb3BlcnR5X2hlbHBlciAoc2VsZi0+djRsMm91dHB1dCwKKyAgICAgICAgICAgICAgcHJvcF9pZCwgdmFsdWUsIHBzcGVjKSkgeworICAgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl92aWRlb19lbmNfb3BlbiAoR3N0VmlkZW9FbmNvZGVyICogZW5jb2RlcikKK3sKKyAgR3N0VjRsMlZpZGVvRW5jICpzZWxmID0gR1NUX1Y0TDJfVklERU9fRU5DIChlbmNvZGVyKTsKKyAgR3N0Q2FwcyAqY29kZWNfY2FwczsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiT3BlbmluZyIpOworCisgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X29wZW4gKHNlbGYtPnY0bDJvdXRwdXQpKQorICAgIGdvdG8gZmFpbHVyZTsKKworICBpZiAoIWdzdF92NGwyX29iamVjdF9vcGVuX3NoYXJlZCAoc2VsZi0+djRsMmNhcHR1cmUsIHNlbGYtPnY0bDJvdXRwdXQpKQorICAgIGdvdG8gZmFpbHVyZTsKKworICBzZWxmLT5wcm9iZWRfc2lua2NhcHMgPSBnc3RfdjRsMl9vYmplY3RfcHJvYmVfY2FwcyAoc2VsZi0+djRsMm91dHB1dCwKKyAgICAgIGdzdF92NGwyX29iamVjdF9nZXRfcmF3X2NhcHMgKCkpOworCisgIGlmIChnc3RfY2Fwc19pc19lbXB0eSAoc2VsZi0+cHJvYmVkX3NpbmtjYXBzKSkKKyAgICBnb3RvIG5vX3Jhd19mb3JtYXQ7CisKKyAgY29kZWNfY2FwcyA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChlbmNvZGVyLT5zcmNwYWQpOworICBzZWxmLT5wcm9iZWRfc3JjY2FwcyA9IGdzdF92NGwyX29iamVjdF9wcm9iZV9jYXBzIChzZWxmLT52NGwyY2FwdHVyZSwKKyAgICAgIGNvZGVjX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY29kZWNfY2Fwcyk7CisKKyAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChzZWxmLT5wcm9iZWRfc3JjY2FwcykpCisgICAgZ290byBub19lbmNvZGVkX2Zvcm1hdDsKKworICByZXR1cm4gVFJVRTsKKworbm9fZW5jb2RlZF9mb3JtYXQ6CisgIEdTVF9FTEVNRU5UX0VSUk9SIChzZWxmLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAoXygiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IiksCisgICAgICAgICAgc2VsZi0+djRsMm91dHB1dC0+dmlkZW9kZXYpLCAoTlVMTCkpOworICBnb3RvIGZhaWx1cmU7CisKKworbm9fcmF3X2Zvcm1hdDoKKyAgR1NUX0VMRU1FTlRfRVJST1IgKHNlbGYsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgIChfKCJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIpLAorICAgICAgICAgIHNlbGYtPnY0bDJvdXRwdXQtPnZpZGVvZGV2KSwgKE5VTEwpKTsKKyAgZ290byBmYWlsdXJlOworCitmYWlsdXJlOgorICBpZiAoR1NUX1Y0TDJfSVNfT1BFTiAoc2VsZi0+djRsMm91dHB1dCkpCisgICAgZ3N0X3Y0bDJfb2JqZWN0X2Nsb3NlIChzZWxmLT52NGwyb3V0cHV0KTsKKworICBpZiAoR1NUX1Y0TDJfSVNfT1BFTiAoc2VsZi0+djRsMmNhcHR1cmUpKQorICAgIGdzdF92NGwyX29iamVjdF9jbG9zZSAoc2VsZi0+djRsMmNhcHR1cmUpOworCisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzZWxmLT5wcm9iZWRfc3JjY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzZWxmLT5wcm9iZWRfc2lua2NhcHMsIE5VTEwpOworCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl92aWRlb19lbmNfY2xvc2UgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIpCit7CisgIEdzdFY0bDJWaWRlb0VuYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0VOQyAoZW5jb2Rlcik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkNsb3NpbmciKTsKKworICBnc3RfdjRsMl9vYmplY3RfY2xvc2UgKHNlbGYtPnY0bDJvdXRwdXQpOworICBnc3RfdjRsMl9vYmplY3RfY2xvc2UgKHNlbGYtPnY0bDJjYXB0dXJlKTsKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNlbGYtPnByb2JlZF9zcmNjYXBzLCBOVUxMKTsKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNlbGYtPnByb2JlZF9zaW5rY2FwcywgTlVMTCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fZW5jX3N0YXJ0IChHc3RWaWRlb0VuY29kZXIgKiBlbmNvZGVyKQoreworICBHc3RWNGwyVmlkZW9FbmMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19FTkMgKGVuY29kZXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJTdGFydGluZyIpOworCisgIGdzdF92NGwyX29iamVjdF91bmxvY2sgKHNlbGYtPnY0bDJvdXRwdXQpOworICBnX2F0b21pY19pbnRfc2V0ICgmc2VsZi0+YWN0aXZlLCBUUlVFKTsKKyAgc2VsZi0+b3V0cHV0X2Zsb3cgPSBHU1RfRkxPV19PSzsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl92aWRlb19lbmNfc3RvcCAoR3N0VmlkZW9FbmNvZGVyICogZW5jb2RlcikKK3sKKyAgR3N0VjRsMlZpZGVvRW5jICpzZWxmID0gR1NUX1Y0TDJfVklERU9fRU5DIChlbmNvZGVyKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiU3RvcHBpbmciKTsKKworICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrIChzZWxmLT52NGwyb3V0cHV0KTsKKyAgZ3N0X3Y0bDJfb2JqZWN0X3VubG9jayAoc2VsZi0+djRsMmNhcHR1cmUpOworCisgIC8qIFdhaXQgZm9yIGNhcHR1cmUgdGhyZWFkIHRvIHN0b3AgKi8KKyAgZ3N0X3BhZF9zdG9wX3Rhc2sgKGVuY29kZXItPnNyY3BhZCk7CisKKyAgR1NUX1ZJREVPX0VOQ09ERVJfU1RSRUFNX0xPQ0sgKGVuY29kZXIpOworICBzZWxmLT5vdXRwdXRfZmxvdyA9IEdTVF9GTE9XX09LOworICBHU1RfVklERU9fRU5DT0RFUl9TVFJFQU1fVU5MT0NLIChlbmNvZGVyKTsKKworICAvKiBTaG91bGQgaGF2ZSBiZWVuIGZsdXNoZWQgYWxyZWFkeSAqLworICBnX2Fzc2VydCAoZ19hdG9taWNfaW50X2dldCAoJnNlbGYtPmFjdGl2ZSkgPT0gRkFMU0UpOworICBnX2Fzc2VydCAoZ19hdG9taWNfaW50X2dldCAoJnNlbGYtPnByb2Nlc3NpbmcpID09IEZBTFNFKTsKKworICBnc3RfdjRsMl9vYmplY3Rfc3RvcCAoc2VsZi0+djRsMm91dHB1dCk7CisgIGdzdF92NGwyX29iamVjdF9zdG9wIChzZWxmLT52NGwyY2FwdHVyZSk7CisKKyAgaWYgKHNlbGYtPmlucHV0X3N0YXRlKSB7CisgICAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChzZWxmLT5pbnB1dF9zdGF0ZSk7CisgICAgc2VsZi0+aW5wdXRfc3RhdGUgPSBOVUxMOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlN0b3BwZWQiKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl9lbmNvZGVyX2NtZCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIGd1aW50IGNtZCwgZ3VpbnQgZmxhZ3MpCit7CisgIHN0cnVjdCB2NGwyX2VuY29kZXJfY21kIGVjbWQgPSB7IDAsIH07CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZWxlbWVudCwKKyAgICAgICJzZW5kaW5nIHY0bDIgZW5jb2RlciBjb21tYW5kICV1IHdpdGggZmxhZ3MgJXUiLCBjbWQsIGZsYWdzKTsKKworICBpZiAoIUdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICBlY21kLmNtZCA9IGNtZDsKKyAgZWNtZC5mbGFncyA9IGZsYWdzOworICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfRU5DT0RFUl9DTUQsICZlY21kKSA8IDApCisgICAgZ290byBlY21kX2ZhaWxlZDsKKworICByZXR1cm4gVFJVRTsKKworZWNtZF9mYWlsZWQ6CisgIGlmIChlcnJubyA9PSBFTk9UVFkpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHY0bDJvYmplY3QtPmVsZW1lbnQsCisgICAgICAgICJGYWlsZWQgdG8gc2VuZCBlbmNvZGVyIGNvbW1hbmQgJXUgd2l0aCBmbGFncyAldSBmb3IgJyVzJy4gKCVzKSIsCisgICAgICAgIGNtZCwgZmxhZ3MsIHY0bDJvYmplY3QtPnZpZGVvZGV2LCBnX3N0cmVycm9yIChlcnJubykpOworICB9IGVsc2UgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHY0bDJvYmplY3QtPmVsZW1lbnQsCisgICAgICAgICJGYWlsZWQgdG8gc2VuZCBlbmNvZGVyIGNvbW1hbmQgJXUgd2l0aCBmbGFncyAldSBmb3IgJyVzJy4gKCVzKSIsCisgICAgICAgIGNtZCwgZmxhZ3MsIHY0bDJvYmplY3QtPnZpZGVvZGV2LCBnX3N0cmVycm9yIChlcnJubykpOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92NGwyX3ZpZGVvX2VuY19maW5pc2ggKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIpCit7CisgIEdzdFY0bDJWaWRlb0VuYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0VOQyAoZW5jb2Rlcik7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgaWYgKGdzdF9wYWRfZ2V0X3Rhc2tfc3RhdGUgKGVuY29kZXItPnNyY3BhZCkgIT0gR1NUX1RBU0tfU1RBUlRFRCkKKyAgICBnb3RvIGRvbmU7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkZpbmlzaGluZyBlbmNvZGluZyIpOworCisgIC8qIGRyb3AgdGhlIHN0cmVhbSBsb2NrIHdoaWxlIGRyYWluaW5nLCBzbyByZW1haW5pbmcgYnVmZmVycyBjYW4gYmUKKyAgICogcHVzaGVkIGZyb20gdGhlIHNyYyBwYWQgdGFzayB0aHJlYWQgKi8KKyAgR1NUX1ZJREVPX0VOQ09ERVJfU1RSRUFNX1VOTE9DSyAoZW5jb2Rlcik7CisKKyAgaWYgKGdzdF92NGwyX2VuY29kZXJfY21kIChzZWxmLT52NGwyY2FwdHVyZSwgVjRMMl9FTkNfQ01EX1NUT1AsIDApKSB7CisgICAgR3N0VGFzayAqdGFzayA9IGVuY29kZXItPnNyY3BhZC0+dGFzazsKKworICAgIC8qIFdhaXQgZm9yIHRoZSB0YXNrIHRvIGJlIGRyYWluZWQgKi8KKyAgICBHU1RfT0JKRUNUX0xPQ0sgKHRhc2spOworICAgIHdoaWxlIChHU1RfVEFTS19TVEFURSAodGFzaykgPT0gR1NUX1RBU0tfU1RBUlRFRCkKKyAgICAgIEdTVF9UQVNLX1dBSVQgKHRhc2spOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLICh0YXNrKTsKKyAgICByZXQgPSBHU1RfRkxPV19GTFVTSElORzsKKyAgfQorCisgIC8qIGFuZCBlbnN1cmUgdGhlIHByb2Nlc3NpbmcgdGhyZWFkIGhhcyBzdG9wcGVkIGluIGNhc2UgYW5vdGhlciBlcnJvcgorICAgKiBvY2N1cmVkLiAqLworICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrIChzZWxmLT52NGwyY2FwdHVyZSk7CisgIGdzdF9wYWRfc3RvcF90YXNrIChlbmNvZGVyLT5zcmNwYWQpOworICBHU1RfVklERU9fRU5DT0RFUl9TVFJFQU1fTE9DSyAoZW5jb2Rlcik7CisKKyAgaWYgKHJldCA9PSBHU1RfRkxPV19GTFVTSElORykKKyAgICByZXQgPSBzZWxmLT5vdXRwdXRfZmxvdzsKKworICBHU1RfREVCVUdfT0JKRUNUIChlbmNvZGVyLCAiRG9uZSBkcmFpbmluZyBidWZmZXJzIik7CisKK2RvbmU6CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fZW5jX3NldF9mb3JtYXQgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIsCisgICAgR3N0VmlkZW9Db2RlY1N0YXRlICogc3RhdGUpCit7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIEdzdFY0bDJWaWRlb0VuYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0VOQyAoZW5jb2Rlcik7CisgIEdzdFY0bDJFcnJvciBlcnJvciA9IEdTVF9WNEwyX0VSUk9SX0lOSVQ7CisgIEdzdENhcHMgKm91dGNhcHM7CisgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqb3V0cHV0OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJTZXR0aW5nIGZvcm1hdDogJSIgR1NUX1BUUl9GT1JNQVQsIHN0YXRlLT5jYXBzKTsKKworICBpZiAoc2VsZi0+aW5wdXRfc3RhdGUpIHsKKyAgICBpZiAoZ3N0X3Y0bDJfb2JqZWN0X2NhcHNfZXF1YWwgKHNlbGYtPnY0bDJvdXRwdXQsIHN0YXRlLT5jYXBzKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkNvbXBhdGlibGUgY2FwcyIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgaWYgKGdzdF92NGwyX3ZpZGVvX2VuY19maW5pc2ggKGVuY29kZXIpICE9IEdTVF9GTE9XX09LKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgZ3N0X3Y0bDJfb2JqZWN0X3N0b3AgKHNlbGYtPnY0bDJvdXRwdXQpOworICAgIGdzdF92NGwyX29iamVjdF9zdG9wIChzZWxmLT52NGwyY2FwdHVyZSk7CisKKyAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKHNlbGYtPmlucHV0X3N0YXRlKTsKKyAgICBzZWxmLT5pbnB1dF9zdGF0ZSA9IE5VTEw7CisgIH0KKworICBvdXRjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKGVuY29kZXItPnNyY3BhZCk7CisgIG91dGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChvdXRjYXBzKTsKKyAgb3V0cHV0ID0gZ3N0X3ZpZGVvX2VuY29kZXJfc2V0X291dHB1dF9zdGF0ZSAoZW5jb2Rlciwgb3V0Y2Fwcywgc3RhdGUpOworICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKG91dHB1dCk7CisKKyAgaWYgKCFnc3RfdmlkZW9fZW5jb2Rlcl9uZWdvdGlhdGUgKGVuY29kZXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF92NGwyX29iamVjdF9zZXRfZm9ybWF0IChzZWxmLT52NGwyb3V0cHV0LCBzdGF0ZS0+Y2FwcywgJmVycm9yKSkgeworICAgIGdzdF92NGwyX2Vycm9yIChzZWxmLCAmZXJyb3IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIGFjdGl2YXRpbmcgYSBjYXB0dXJlIHBvb2wgd2lsbCBhbHNvIGNhbGwgU1RSRUFNT04uIENPREEgZHJpdmVyIHdpbGwKKyAgICogcmVmdXNlIHRvIGNvbmZpZ3VyZSB0aGUgb3V0cHV0IGlmIHRoZSBjYXB0dXJlIGlzIHN0cmVtYWluZy4gKi8KKyAgaWYgKCFnc3RfYnVmZmVyX3Bvb2xfc2V0X2FjdGl2ZSAoR1NUX0JVRkZFUl9QT09MIChzZWxmLT52NGwyY2FwdHVyZS0+cG9vbCksCisgICAgICAgICAgVFJVRSkpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNlbGYsICJDb3VsZCBub3QgYWN0aXZhdGUgY2FwdHVyZSBidWZmZXIgcG9vbC4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBzZWxmLT5pbnB1dF9zdGF0ZSA9IGdzdF92aWRlb19jb2RlY19zdGF0ZV9yZWYgKHN0YXRlKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAib3V0cHV0IGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBzdGF0ZS0+Y2Fwcyk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl92aWRlb19lbmNfZmx1c2ggKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIpCit7CisgIEdzdFY0bDJWaWRlb0VuYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0VOQyAoZW5jb2Rlcik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkZsdXNoaW5nIik7CisKKyAgLyogRW5zdXJlIHRoZSBwcm9jZXNzaW5nIHRocmVhZCBoYXMgc3RvcHBlZCBmb3IgdGhlIHJldmVyc2UgcGxheWJhY2sKKyAgICogaXNjb3VudCBjYXNlICovCisgIGlmIChnX2F0b21pY19pbnRfZ2V0ICgmc2VsZi0+cHJvY2Vzc2luZykpIHsKKyAgICBHU1RfVklERU9fRU5DT0RFUl9TVFJFQU1fVU5MT0NLIChlbmNvZGVyKTsKKworICAgIGdzdF92NGwyX29iamVjdF91bmxvY2tfc3RvcCAoc2VsZi0+djRsMm91dHB1dCk7CisgICAgZ3N0X3Y0bDJfb2JqZWN0X3VubG9ja19zdG9wIChzZWxmLT52NGwyY2FwdHVyZSk7CisgICAgZ3N0X3BhZF9zdG9wX3Rhc2sgKGVuY29kZXItPnNyY3BhZCk7CisKKyAgICBHU1RfVklERU9fRU5DT0RFUl9TVFJFQU1fVU5MT0NLIChlbmNvZGVyKTsKKworICB9CisKKyAgc2VsZi0+b3V0cHV0X2Zsb3cgPSBHU1RfRkxPV19PSzsKKworICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrX3N0b3AgKHNlbGYtPnY0bDJvdXRwdXQpOworICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrX3N0b3AgKHNlbGYtPnY0bDJjYXB0dXJlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RydWN0IFByb2ZpbGVMZXZlbEN0eAoreworICBHc3RWNGwyVmlkZW9FbmMgKnNlbGY7CisgIGNvbnN0IGdjaGFyICpwcm9maWxlOworICBjb25zdCBnY2hhciAqbGV2ZWw7Cit9OworCitzdGF0aWMgZ2Jvb2xlYW4KK2dldF9zdHJpbmdfbGlzdCAoR3N0U3RydWN0dXJlICogcywgY29uc3QgZ2NoYXIgKiBmaWVsZCwgR1F1ZXVlICogcXVldWUpCit7CisgIGNvbnN0IEdWYWx1ZSAqdmFsdWU7CisKKyAgdmFsdWUgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgZmllbGQpOworCisgIGlmICghdmFsdWUpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChHU1RfVkFMVUVfSE9MRFNfTElTVCAodmFsdWUpKSB7CisgICAgZ3VpbnQgaTsKKworICAgIGlmIChnc3RfdmFsdWVfbGlzdF9nZXRfc2l6ZSAodmFsdWUpID09IDApCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ3N0X3ZhbHVlX2xpc3RfZ2V0X3NpemUgKHZhbHVlKTsgaSsrKSB7CisgICAgICBjb25zdCBHVmFsdWUgKml0ZW0gPSBnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUgKHZhbHVlLCBpKTsKKworICAgICAgaWYgKEdfVkFMVUVfSE9MRFNfU1RSSU5HIChpdGVtKSkKKyAgICAgICAgZ19xdWV1ZV9wdXNoX3RhaWwgKHF1ZXVlLCBnX3ZhbHVlX2R1cF9zdHJpbmcgKGl0ZW0pKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoR19WQUxVRV9IT0xEU19TVFJJTkcgKHZhbHVlKSkgeworICAgIGdfcXVldWVfcHVzaF90YWlsIChxdWV1ZSwgZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSkpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorbmVnb3RpYXRlX3Byb2ZpbGVfYW5kX2xldmVsIChHc3RDYXBzRmVhdHVyZXMgKiBmZWF0dXJlcywgR3N0U3RydWN0dXJlICogcywKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIHN0cnVjdCBQcm9maWxlTGV2ZWxDdHggKmN0eCA9IHVzZXJfZGF0YTsKKyAgR3N0VjRsMlZpZGVvRW5jQ2xhc3MgKmtsYXNzID0gR1NUX1Y0TDJfVklERU9fRU5DX0dFVF9DTEFTUyAoY3R4LT5zZWxmKTsKKyAgR3N0VjRsMk9iamVjdCAqdjRsMm9iamVjdCA9IEdTVF9WNEwyX1ZJREVPX0VOQyAoY3R4LT5zZWxmKS0+djRsMm91dHB1dDsKKyAgR1F1ZXVlIHByb2ZpbGVzID0gR19RVUVVRV9JTklUOworICBHUXVldWUgbGV2ZWxzID0gR19RVUVVRV9JTklUOworICBnYm9vbGVhbiBmYWlsZWQgPSBGQUxTRTsKKworICBpZiAoa2xhc3MtPnByb2ZpbGVfY2lkICYmIGdldF9zdHJpbmdfbGlzdCAocywgInByb2ZpbGUiLCAmcHJvZmlsZXMpKSB7CisgICAgR0xpc3QgKmw7CisKKyAgICBmb3IgKGwgPSBwcm9maWxlcy5oZWFkOyBsOyBsID0gbC0+bmV4dCkgeworICAgICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sID0geyAwLCB9OworICAgICAgZ2ludCB2NGwyX3Byb2ZpbGU7CisgICAgICBjb25zdCBnY2hhciAqcHJvZmlsZSA9IGwtPmRhdGE7CisKKyAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKGN0eC0+c2VsZiwgIlRyeWluZyBwcm9maWxlICVzIiwgcHJvZmlsZSk7CisKKyAgICAgIGNvbnRyb2wuaWQgPSBrbGFzcy0+cHJvZmlsZV9jaWQ7CisgICAgICBjb250cm9sLnZhbHVlID0gdjRsMl9wcm9maWxlID0ga2xhc3MtPnByb2ZpbGVfZnJvbV9zdHJpbmcgKHByb2ZpbGUpOworCisgICAgICBpZiAoY29udHJvbC52YWx1ZSA8IDApCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkgPCAwKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY3R4LT5zZWxmLCAiRmFpbGVkIHRvIHNldCAlcyBwcm9maWxlOiAnJXMnIiwKKyAgICAgICAgICAgIGtsYXNzLT5jb2RlY19uYW1lLCBnX3N0cmVycm9yIChlcnJubykpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgcHJvZmlsZSA9IGtsYXNzLT5wcm9maWxlX3RvX3N0cmluZyAoY29udHJvbC52YWx1ZSk7CisKKyAgICAgIGlmIChjb250cm9sLnZhbHVlID09IHY0bDJfcHJvZmlsZSkgeworICAgICAgICBjdHgtPnByb2ZpbGUgPSBwcm9maWxlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKGdfbGlzdF9maW5kX2N1c3RvbSAobCwgcHJvZmlsZSwgZ19zdHJfZXF1YWwpKSB7CisgICAgICAgIGN0eC0+cHJvZmlsZSA9IHByb2ZpbGU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChwcm9maWxlcy5sZW5ndGggJiYgIWN0eC0+cHJvZmlsZSkKKyAgICAgIGZhaWxlZCA9IFRSVUU7CisKKyAgICBnX3F1ZXVlX2ZvcmVhY2ggKCZwcm9maWxlcywgKEdGdW5jKSBnX2ZyZWUsIE5VTEwpOworICAgIGdfcXVldWVfY2xlYXIgKCZwcm9maWxlcyk7CisgIH0KKworICBpZiAoIWZhaWxlZCAmJiBrbGFzcy0+bGV2ZWxfY2lkICYmIGdldF9zdHJpbmdfbGlzdCAocywgImxldmVsIiwgJmxldmVscykpIHsKKyAgICBHTGlzdCAqbDsKKworICAgIGZvciAobCA9IGxldmVscy5oZWFkOyBsOyBsID0gbC0+bmV4dCkgeworICAgICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sID0geyAwLCB9OworICAgICAgZ2ludCB2NGwyX2xldmVsOworICAgICAgY29uc3QgZ2NoYXIgKmxldmVsID0gbC0+ZGF0YTsKKworICAgICAgR1NUX1RSQUNFX09CSkVDVCAoY3R4LT5zZWxmLCAiVHJ5aW5nIGxldmVsICVzIiwgbGV2ZWwpOworCisgICAgICBjb250cm9sLmlkID0ga2xhc3MtPmxldmVsX2NpZDsKKyAgICAgIGNvbnRyb2wudmFsdWUgPSB2NGwyX2xldmVsID0ga2xhc3MtPmxldmVsX2Zyb21fc3RyaW5nIChsZXZlbCk7CisKKyAgICAgIGlmIChjb250cm9sLnZhbHVlIDwgMCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKSA8IDApIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjdHgtPnNlbGYsICJGYWlsZWQgdG8gc2V0ICVzIGxldmVsOiAnJXMnIiwKKyAgICAgICAgICAgIGtsYXNzLT5jb2RlY19uYW1lLCBnX3N0cmVycm9yIChlcnJubykpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgbGV2ZWwgPSBrbGFzcy0+bGV2ZWxfdG9fc3RyaW5nIChjb250cm9sLnZhbHVlKTsKKworICAgICAgaWYgKGNvbnRyb2wudmFsdWUgPT0gdjRsMl9sZXZlbCkgeworICAgICAgICBjdHgtPmxldmVsID0gbGV2ZWw7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoZ19saXN0X2ZpbmRfY3VzdG9tIChsLCBsZXZlbCwgZ19zdHJfZXF1YWwpKSB7CisgICAgICAgIGN0eC0+bGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGxldmVscy5sZW5ndGggJiYgIWN0eC0+bGV2ZWwpCisgICAgICBmYWlsZWQgPSBUUlVFOworCisgICAgZ19xdWV1ZV9mb3JlYWNoICgmbGV2ZWxzLCAoR0Z1bmMpIGdfZnJlZSwgTlVMTCk7CisgICAgZ19xdWV1ZV9jbGVhciAoJmxldmVscyk7CisgIH0KKworICAvKiBJZiBpdCBmYWlsZWQsIHdlIGNvbnRpbnVlICovCisgIHJldHVybiBmYWlsZWQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fZW5jX25lZ290aWF0ZSAoR3N0VmlkZW9FbmNvZGVyICogZW5jb2RlcikKK3sKKyAgR3N0VjRsMlZpZGVvRW5jQ2xhc3MgKmtsYXNzID0gR1NUX1Y0TDJfVklERU9fRU5DX0dFVF9DTEFTUyAoZW5jb2Rlcik7CisgIEdzdFY0bDJWaWRlb0VuYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0VOQyAoZW5jb2Rlcik7CisgIEdzdFY0bDJPYmplY3QgKnY0bDJvYmplY3QgPSBzZWxmLT52NGwyb3V0cHV0OworICBHc3RDYXBzICphbGxvd2VkX2NhcHM7CisgIHN0cnVjdCBQcm9maWxlTGV2ZWxDdHggY3R4ID0geyBzZWxmLCBOVUxMLCBOVUxMIH07CisgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqc3RhdGU7CisgIEdzdFN0cnVjdHVyZSAqczsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiTmVnb3RpYXRpbmcgJXMgcHJvZmlsZSBhbmQgbGV2ZWwuIiwKKyAgICAgIGtsYXNzLT5jb2RlY19uYW1lKTsKKworICBhbGxvd2VkX2NhcHMgPSBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgKEdTVF9WSURFT19FTkNPREVSX1NSQ19QQUQgKGVuY29kZXIpKTsKKworICBpZiAoYWxsb3dlZF9jYXBzKSB7CisKKyAgICBpZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKGFsbG93ZWRfY2FwcykpCisgICAgICBnb3RvIG5vdF9uZWdvdGlhdGVkOworCisgICAgYWxsb3dlZF9jYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoYWxsb3dlZF9jYXBzKTsKKworICAgIC8qIG5lZ290aWF0ZV9wcm9maWxlX2FuZF9sZXZlbCgpIHdpbGwgcmV0dXJuIFRSVUUgb24gZmFpbHVyZSB0byBrZWVwCisgICAgICogaXRlcmF0aW5nLCBpZiBnc3RfY2Fwc19mb3JlYWNoKCkgcmV0dXJucyBUUlVFIGl0IG1lYW5zIHRoZXJlIHdhcyBubworICAgICAqIGNvbXBhdGlibGUgcHJvZmlsZSBhbmQgbGV2ZWwgaW4gYW55IG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKyAgICBpZiAoZ3N0X2NhcHNfZm9yZWFjaCAoYWxsb3dlZF9jYXBzLCBuZWdvdGlhdGVfcHJvZmlsZV9hbmRfbGV2ZWwsICZjdHgpKSB7CisgICAgICBnb3RvIG5vX3Byb2ZpbGVfbGV2ZWw7CisgICAgfQorICB9CisKKyAgaWYgKGtsYXNzLT5wcm9maWxlX2NpZCAmJiAhY3R4LnByb2ZpbGUpIHsKKyAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2wgPSB7IDAsIH07CisKKyAgICBjb250cm9sLmlkID0ga2xhc3MtPnByb2ZpbGVfY2lkOworCisgICAgaWYgKHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX0dfQ1RSTCwgJmNvbnRyb2wpIDwgMCkKKyAgICAgIGdvdG8gZ19jdHJsX2ZhaWxlZDsKKworICAgIGN0eC5wcm9maWxlID0ga2xhc3MtPnByb2ZpbGVfdG9fc3RyaW5nIChjb250cm9sLnZhbHVlKTsKKyAgfQorCisgIGlmIChrbGFzcy0+bGV2ZWxfY2lkICYmICFjdHgubGV2ZWwpIHsKKyAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2wgPSB7IDAsIH07CisKKyAgICBjb250cm9sLmlkID0ga2xhc3MtPmxldmVsX2NpZDsKKworICAgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19HX0NUUkwsICZjb250cm9sKSA8IDApCisgICAgICBnb3RvIGdfY3RybF9mYWlsZWQ7CisKKyAgICBjdHgubGV2ZWwgPSBrbGFzcy0+bGV2ZWxfdG9fc3RyaW5nIChjb250cm9sLnZhbHVlKTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJTZWxlY3RlZCAlcyBwcm9maWxlICVzIGF0IGxldmVsICVzIiwKKyAgICAgIGtsYXNzLT5jb2RlY19uYW1lLCBjdHgucHJvZmlsZSwgY3R4LmxldmVsKTsKKworICBzdGF0ZSA9IGdzdF92aWRlb19lbmNvZGVyX2dldF9vdXRwdXRfc3RhdGUgKGVuY29kZXIpOworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoc3RhdGUtPmNhcHMsIDApOworCisgIGlmIChrbGFzcy0+cHJvZmlsZV9jaWQpCisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJwcm9maWxlIiwgR19UWVBFX1NUUklORywgY3R4LnByb2ZpbGUsIE5VTEwpOworCisgIGlmIChrbGFzcy0+bGV2ZWxfY2lkKQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAibGV2ZWwiLCBHX1RZUEVfU1RSSU5HLCBjdHgubGV2ZWwsIE5VTEwpOworCisgIGlmICghR1NUX1ZJREVPX0VOQ09ERVJfQ0xBU1MgKHBhcmVudF9jbGFzcyktPm5lZ290aWF0ZSAoZW5jb2RlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworCitnX2N0cmxfZmFpbGVkOgorICBHU1RfV0FSTklOR19PQkpFQ1QgKHNlbGYsICJGYWlsZWQgdG8gZ2V0ICVzIHByb2ZpbGUgYW5kIGxldmVsOiAnJXMnIiwKKyAgICAgIGtsYXNzLT5jb2RlY19uYW1lLCBnX3N0cmVycm9yIChlcnJubykpOworICBnb3RvIG5vdF9uZWdvdGlhdGVkOworCitub19wcm9maWxlX2xldmVsOgorICBHU1RfV0FSTklOR19PQkpFQ1QgKHNlbGYsICJObyBjb21wYXRpYmxlIGxldmVsIGFuZCBwcm9maWxlIGluIGNhcHM6ICUiCisgICAgICBHU1RfUFRSX0ZPUk1BVCwgYWxsb3dlZF9jYXBzKTsKKyAgZ290byBub3RfbmVnb3RpYXRlZDsKKworbm90X25lZ290aWF0ZWQ6CisgIGlmIChhbGxvd2VkX2NhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKGFsbG93ZWRfY2Fwcyk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIEdzdFZpZGVvQ29kZWNGcmFtZSAqCitnc3RfdjRsMl92aWRlb19lbmNfZ2V0X29sZGVzdF9mcmFtZSAoR3N0VmlkZW9FbmNvZGVyICogZW5jb2RlcikKK3sKKyAgR3N0VmlkZW9Db2RlY0ZyYW1lICpmcmFtZSA9IE5VTEw7CisgIEdMaXN0ICpmcmFtZXMsICpsOworICBnaW50IGNvdW50ID0gMDsKKworICBmcmFtZXMgPSBnc3RfdmlkZW9fZW5jb2Rlcl9nZXRfZnJhbWVzIChlbmNvZGVyKTsKKworICBmb3IgKGwgPSBmcmFtZXM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpIHsKKyAgICBHc3RWaWRlb0NvZGVjRnJhbWUgKmYgPSBsLT5kYXRhOworCisgICAgaWYgKCFmcmFtZSB8fCBmcmFtZS0+cHRzID4gZi0+cHRzKQorICAgICAgZnJhbWUgPSBmOworCisgICAgY291bnQrKzsKKyAgfQorCisgIGlmIChmcmFtZSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChlbmNvZGVyLAorICAgICAgICAiT2xkZXN0IGZyYW1lIGlzICVkICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAiIGFuZCAlZCBmcmFtZXMgbGVmdCIsCisgICAgICAgIGZyYW1lLT5zeXN0ZW1fZnJhbWVfbnVtYmVyLCBHU1RfVElNRV9BUkdTIChmcmFtZS0+cHRzKSwgY291bnQgLSAxKTsKKyAgICBnc3RfdmlkZW9fY29kZWNfZnJhbWVfcmVmIChmcmFtZSk7CisgIH0KKworICBnX2xpc3RfZnJlZV9mdWxsIChmcmFtZXMsIChHRGVzdHJveU5vdGlmeSkgZ3N0X3ZpZGVvX2NvZGVjX2ZyYW1lX3VucmVmKTsKKworICByZXR1cm4gZnJhbWU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl92aWRlb19lbmNfbG9vcCAoR3N0VmlkZW9FbmNvZGVyICogZW5jb2RlcikKK3sKKyAgR3N0VjRsMlZpZGVvRW5jICpzZWxmID0gR1NUX1Y0TDJfVklERU9fRU5DIChlbmNvZGVyKTsKKyAgR3N0VmlkZW9Db2RlY0ZyYW1lICpmcmFtZTsKKyAgR3N0QnVmZmVyICpidWZmZXIgPSBOVUxMOworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBHU1RfTE9HX09CSkVDVCAoZW5jb2RlciwgIkFsbG9jYXRlIG91dHB1dCBidWZmZXIiKTsKKworICBidWZmZXIgPSBnc3RfdmlkZW9fZW5jb2Rlcl9hbGxvY2F0ZV9vdXRwdXRfYnVmZmVyIChlbmNvZGVyLAorICAgICAgc2VsZi0+djRsMmNhcHR1cmUtPmluZm8uc2l6ZSk7CisKKyAgaWYgKE5VTEwgPT0gYnVmZmVyKSB7CisgICAgcmV0ID0gR1NUX0ZMT1dfRkxVU0hJTkc7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisKKyAgLyogRklYTUUgQ2hlY2sgaWYgYnVmZmVyIGlzbid0IHRoZSBsYXN0IG9uZSBoZXJlICovCisKKyAgR1NUX0xPR19PQkpFQ1QgKGVuY29kZXIsICJQcm9jZXNzIG91dHB1dCBidWZmZXIiKTsKKyAgcmV0ID0KKyAgICAgIGdzdF92NGwyX2J1ZmZlcl9wb29sX3Byb2Nlc3MgKEdTVF9WNEwyX0JVRkZFUl9QT09MCisgICAgICAoc2VsZi0+djRsMmNhcHR1cmUtPnBvb2wpLCAmYnVmZmVyKTsKKworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gYmVhY2g7CisKKyAgZnJhbWUgPSBnc3RfdjRsMl92aWRlb19lbmNfZ2V0X29sZGVzdF9mcmFtZSAoZW5jb2Rlcik7CisKKyAgaWYgKGZyYW1lKSB7CisgICAgZnJhbWUtPm91dHB1dF9idWZmZXIgPSBidWZmZXI7CisgICAgYnVmZmVyID0gTlVMTDsKKyAgICByZXQgPSBnc3RfdmlkZW9fZW5jb2Rlcl9maW5pc2hfZnJhbWUgKGVuY29kZXIsIGZyYW1lKTsKKworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIGJlYWNoOworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZW5jb2RlciwgIkVuY29kZXIgaXMgcHJvZHVjaW5nIHRvbyBtYW55IGJ1ZmZlcnMiKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICB9CisKKyAgcmV0dXJuOworCitiZWFjaDoKKyAgR1NUX0RFQlVHX09CSkVDVCAoZW5jb2RlciwgIkxlYXZpbmcgb3V0cHV0IHRocmVhZCIpOworCisgIGdzdF9idWZmZXJfcmVwbGFjZSAoJmJ1ZmZlciwgTlVMTCk7CisgIHNlbGYtPm91dHB1dF9mbG93ID0gcmV0OworICBnX2F0b21pY19pbnRfc2V0ICgmc2VsZi0+cHJvY2Vzc2luZywgRkFMU0UpOworICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrIChzZWxmLT52NGwyb3V0cHV0KTsKKyAgZ3N0X3BhZF9wYXVzZV90YXNrIChlbmNvZGVyLT5zcmNwYWQpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdmlkZW9fZW5jX2xvb3Bfc3RvcHBlZCAoR3N0VjRsMlZpZGVvRW5jICogc2VsZikKK3sKKyAgaWYgKGdfYXRvbWljX2ludF9nZXQgKCZzZWxmLT5wcm9jZXNzaW5nKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJFYXJseSBzdG9wIG9mIGVuY29kaW5nIHRocmVhZCIpOworICAgIHNlbGYtPm91dHB1dF9mbG93ID0gR1NUX0ZMT1dfRkxVU0hJTkc7CisgICAgZ19hdG9taWNfaW50X3NldCAoJnNlbGYtPnByb2Nlc3NpbmcsIEZBTFNFKTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJFbmNvZGluZyB0YXNrIGRlc3Ryb3llZDogJXMiLAorICAgICAgZ3N0X2Zsb3dfZ2V0X25hbWUgKHNlbGYtPm91dHB1dF9mbG93KSk7CisKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92NGwyX3ZpZGVvX2VuY19oYW5kbGVfZnJhbWUgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIsCisgICAgR3N0VmlkZW9Db2RlY0ZyYW1lICogZnJhbWUpCit7CisgIEdzdFY0bDJWaWRlb0VuYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0VOQyAoZW5jb2Rlcik7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdFRhc2tTdGF0ZSB0YXNrX3N0YXRlOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJIYW5kbGluZyBmcmFtZSAlZCIsIGZyYW1lLT5zeXN0ZW1fZnJhbWVfbnVtYmVyKTsKKworICBpZiAoR19VTkxJS0VMWSAoIWdfYXRvbWljX2ludF9nZXQgKCZzZWxmLT5hY3RpdmUpKSkKKyAgICBnb3RvIGZsdXNoaW5nOworCisgIHRhc2tfc3RhdGUgPSBnc3RfcGFkX2dldF90YXNrX3N0YXRlIChHU1RfVklERU9fREVDT0RFUl9TUkNfUEFEIChzZWxmKSk7CisgIGlmICh0YXNrX3N0YXRlID09IEdTVF9UQVNLX1NUT1BQRUQgfHwgdGFza19zdGF0ZSA9PSBHU1RfVEFTS19QQVVTRUQpIHsKKyAgICBHc3RCdWZmZXJQb29sICpwb29sID0gR1NUX0JVRkZFUl9QT09MIChzZWxmLT52NGwyb3V0cHV0LT5wb29sKTsKKworICAgIC8qIEl0IHBvc3NpYmxlIHRoYXQgdGhlIHByb2Nlc3NpbmcgdGhyZWFkIHN0b3BwZWQgZHVlIHRvIGFuIGVycm9yICovCisgICAgaWYgKHNlbGYtPm91dHB1dF9mbG93ICE9IEdTVF9GTE9XX09LICYmCisgICAgICAgIHNlbGYtPm91dHB1dF9mbG93ICE9IEdTVF9GTE9XX0ZMVVNISU5HKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiUHJvY2Vzc2luZyBsb29wIHN0b3BwZWQgd2l0aCBlcnJvciwgbGVhdmluZyIpOworICAgICAgcmV0ID0gc2VsZi0+b3V0cHV0X2Zsb3c7CisgICAgICBnb3RvIGRyb3A7CisgICAgfQorCisgICAgLyogRW5zdXJlIGlucHV0IGludGVybmFsIHBvb2wgaXMgYWN0aXZlICovCisgICAgaWYgKCFnc3RfYnVmZmVyX3Bvb2xfaXNfYWN0aXZlIChwb29sKSkgeworICAgICAgR3N0U3RydWN0dXJlICpjb25maWcgPSBnc3RfYnVmZmVyX3Bvb2xfZ2V0X2NvbmZpZyAocG9vbCk7CisgICAgICBndWludCBtaW4gPSBNQVggKHNlbGYtPnY0bDJvdXRwdXQtPm1pbl9idWZmZXJzLCBHU1RfVjRMMl9NSU5fQlVGRkVSUyk7CisKKyAgICAgIGdzdF9idWZmZXJfcG9vbF9jb25maWdfc2V0X3BhcmFtcyAoY29uZmlnLCBzZWxmLT5pbnB1dF9zdGF0ZS0+Y2FwcywKKyAgICAgICAgICBzZWxmLT52NGwyb3V0cHV0LT5pbmZvLnNpemUsIG1pbiwgbWluKTsKKworICAgICAgLyogVGhlcmUgaXMgbm8gcmVhc29uIHRvIHJlZnVzZSB0aGlzIGNvbmZpZyAqLworICAgICAgaWYgKCFnc3RfYnVmZmVyX3Bvb2xfc2V0X2NvbmZpZyAocG9vbCwgY29uZmlnKSkKKyAgICAgICAgZ290byBhY3RpdmF0ZV9mYWlsZWQ7CisKKyAgICAgIGlmICghZ3N0X2J1ZmZlcl9wb29sX3NldF9hY3RpdmUgKHBvb2wsIFRSVUUpKQorICAgICAgICBnb3RvIGFjdGl2YXRlX2ZhaWxlZDsKKyAgICB9CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiU3RhcnRpbmcgZW5jb2RpbmcgdGhyZWFkIik7CisKKyAgICAvKiBTdGFydCB0aGUgcHJvY2Vzc2luZyB0YXNrLCB3aGVuIGl0IHF1aXRzLCB0aGUgdGFzayB3aWxsIGRpc2FibGUgaW5wdXQKKyAgICAgKiBwcm9jZXNzaW5nIHRvIHVubG9jayBpbnB1dCBpZiBkcmFpbmluZywgb3IgcHJldmVudCBwb3RlbnRpYWwgYmxvY2sgKi8KKyAgICBpZiAoIWdzdF9wYWRfc3RhcnRfdGFzayAoZW5jb2Rlci0+c3JjcGFkLAorICAgICAgICAgICAgKEdzdFRhc2tGdW5jdGlvbikgZ3N0X3Y0bDJfdmlkZW9fZW5jX2xvb3AsIHNlbGYsCisgICAgICAgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF92NGwyX3ZpZGVvX2VuY19sb29wX3N0b3BwZWQpKQorICAgICAgZ290byBzdGFydF90YXNrX2ZhaWxlZDsKKyAgfQorCisgIGlmIChmcmFtZS0+aW5wdXRfYnVmZmVyKSB7CisgICAgR1NUX1ZJREVPX0VOQ09ERVJfU1RSRUFNX1VOTE9DSyAoZW5jb2Rlcik7CisgICAgcmV0ID0KKyAgICAgICAgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcHJvY2VzcyAoR1NUX1Y0TDJfQlVGRkVSX1BPT0wKKyAgICAgICAgKHNlbGYtPnY0bDJvdXRwdXQtPnBvb2wpLCAmZnJhbWUtPmlucHV0X2J1ZmZlcik7CisgICAgR1NUX1ZJREVPX0VOQ09ERVJfU1RSRUFNX0xPQ0sgKGVuY29kZXIpOworCisgICAgaWYgKHJldCA9PSBHU1RfRkxPV19GTFVTSElORykgeworICAgICAgaWYgKGdzdF9wYWRfZ2V0X3Rhc2tfc3RhdGUgKEdTVF9WSURFT19ERUNPREVSX1NSQ19QQUQgKHNlbGYpKSAhPQorICAgICAgICAgIEdTVF9UQVNLX1NUQVJURUQpCisgICAgICAgIHJldCA9IHNlbGYtPm91dHB1dF9mbG93OworICAgICAgZ290byBkcm9wOworICAgIH0gZWxzZSBpZiAocmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgICBnb3RvIHByb2Nlc3NfZmFpbGVkOworICAgIH0KKyAgfQorCisgIGdzdF92aWRlb19jb2RlY19mcmFtZV91bnJlZiAoZnJhbWUpOworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworYWN0aXZhdGVfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNlbGYsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIikpLAorICAgICAgICAoIkJ1ZmZlciBwb29sIGFjdGl2YXRpb24gZmFpbGVkIikpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKworICB9CitmbHVzaGluZzoKKyAgeworICAgIHJldCA9IEdTVF9GTE9XX0ZMVVNISU5HOworICAgIGdvdG8gZHJvcDsKKyAgfQorc3RhcnRfdGFza19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2VsZiwgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKF8oIkZhaWxlZCB0byBzdGFydCBlbmNvZGluZyB0aHJlYWQuIikpLCAoTlVMTCkpOworICAgIGdfYXRvbWljX2ludF9zZXQgKCZzZWxmLT5wcm9jZXNzaW5nLCBGQUxTRSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBkcm9wOworICB9Citwcm9jZXNzX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzZWxmLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoXygiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIikpLAorICAgICAgICAoIk1heWJlIGJlIGR1ZSB0byBub3QgZW5vdWdoIG1lbW9yeSBvciBmYWlsaW5nIGRyaXZlciIpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGRyb3A7CisgIH0KK2Ryb3A6CisgIHsKKyAgICBnc3RfdmlkZW9fZW5jb2Rlcl9maW5pc2hfZnJhbWUgKGVuY29kZXIsIGZyYW1lKTsKKyAgICByZXR1cm4gcmV0OworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fZW5jX2RlY2lkZV9hbGxvY2F0aW9uIChHc3RWaWRlb0VuY29kZXIgKgorICAgIGVuY29kZXIsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdFY0bDJWaWRlb0VuYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0VOQyAoZW5jb2Rlcik7CisgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqc3RhdGUgPSBnc3RfdmlkZW9fZW5jb2Rlcl9nZXRfb3V0cHV0X3N0YXRlIChlbmNvZGVyKTsKKyAgR3N0VjRsMkVycm9yIGVycm9yID0gR1NUX1Y0TDJfRVJST1JfSU5JVDsKKyAgR3N0Q2xvY2tUaW1lIGxhdGVuY3k7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIC8qIFdlIG5lZWQgdG8gc2V0IHRoZSBmb3JtYXQgaGVyZSwgc2luY2UgdGhpcyBpcyBjYWxsZWQgcmlnaHQgYWZ0ZXIKKyAgICogR3N0VmlkZW9FbmNvZGVyIGhhdmUgc2V0IHRoZSB3aWR0aCwgaGVpZ2h0IGFuZCBmcmFtZXJhdGUgaW50byB0aGUgc3RhdGUKKyAgICogY2Fwcy4gVGhlc2UgYXJlIG5lZWRlZCBieSB0aGUgZHJpdmVyIHRvIGNhbGN1bGF0ZSB0aGUgYnVmZmVyIHNpemUgYW5kIHRvCisgICAqIGltcGxlbWVudCBiaXRyYXRlIGFkYXB0YXRpb24uICovCisgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X3NldF9mb3JtYXQgKHNlbGYtPnY0bDJjYXB0dXJlLCBzdGF0ZS0+Y2FwcywgJmVycm9yKSkgeworICAgIGdzdF92NGwyX2Vycm9yIChzZWxmLCAmZXJyb3IpOworICAgIHJldCA9IEZBTFNFOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGlmIChnc3RfdjRsMl9vYmplY3RfZGVjaWRlX2FsbG9jYXRpb24gKHNlbGYtPnY0bDJjYXB0dXJlLCBxdWVyeSkpIHsKKyAgICBHc3RWaWRlb0VuY29kZXJDbGFzcyAqZW5jX2NsYXNzID0gR1NUX1ZJREVPX0VOQ09ERVJfQ0xBU1MgKHBhcmVudF9jbGFzcyk7CisgICAgcmV0ID0gZW5jX2NsYXNzLT5kZWNpZGVfYWxsb2NhdGlvbiAoZW5jb2RlciwgcXVlcnkpOworICB9CisKKyAgLyogRklYTUUgVGhpcyBtYXkgbm90IGJlIGVudGlyZWx5IGNvcnJlY3QsIGFzIGVuY29kZXIgbWF5IGtlZXAgc29tZQorICAgKiBvYnNlcnZhdGlvbiB3aXRob3V0aCBkZWxheWluZyB0aGUgZW5jb2RpbmcuIExpbnV4IE1lZGlhIEFQSSBuZWVkIHNvbWUKKyAgICogbW9yZSB3b3JrIHRvIGV4cGxpY2l0bHkgZXhwcmVzc2VkIHRoZSBkZWNvZGVyIC8gZW5jb2RlciBsYXRlbmN5LiBUaGlzCisgICAqIHZhbHVlIHdpbGwgdGhlbiBiZWNvbWUgbWF4IGxhdGVuY3ksIGFuZCB0aGUgcmVwb3J0ZWQgZHJpdmVyIGxhdGVuY3kgd291bGQKKyAgICogYmVjb21lIHRoZSBtaW4gbGF0ZW5jeS4gKi8KKyAgbGF0ZW5jeSA9IHNlbGYtPnY0bDJjYXB0dXJlLT5taW5fYnVmZmVycyAqIHNlbGYtPnY0bDJjYXB0dXJlLT5kdXJhdGlvbjsKKyAgZ3N0X3ZpZGVvX2VuY29kZXJfc2V0X2xhdGVuY3kgKGVuY29kZXIsIGxhdGVuY3ksIGxhdGVuY3kpOworCitkb25lOgorICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKHN0YXRlKTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl92aWRlb19lbmNfcHJvcG9zZV9hbGxvY2F0aW9uIChHc3RWaWRlb0VuY29kZXIgKgorICAgIGVuY29kZXIsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdFY0bDJWaWRlb0VuYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0VOQyAoZW5jb2Rlcik7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJjYWxsZWQiKTsKKworICBpZiAocXVlcnkgPT0gTlVMTCkKKyAgICByZXQgPSBUUlVFOworICBlbHNlCisgICAgcmV0ID0gZ3N0X3Y0bDJfb2JqZWN0X3Byb3Bvc2VfYWxsb2NhdGlvbiAoc2VsZi0+djRsMm91dHB1dCwgcXVlcnkpOworCisgIGlmIChyZXQpCisgICAgcmV0ID0gR1NUX1ZJREVPX0VOQ09ERVJfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnByb3Bvc2VfYWxsb2NhdGlvbiAoZW5jb2RlciwKKyAgICAgICAgcXVlcnkpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fZW5jX3NyY19xdWVyeSAoR3N0VmlkZW9FbmNvZGVyICogZW5jb2RlciwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKyAgR3N0VjRsMlZpZGVvRW5jICpzZWxmID0gR1NUX1Y0TDJfVklERU9fRU5DIChlbmNvZGVyKTsKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQ0FQUzp7CisgICAgICBHc3RDYXBzICpmaWx0ZXIsICpyZXN1bHQgPSBOVUxMOworICAgICAgR3N0UGFkICpwYWQgPSBHU1RfVklERU9fRU5DT0RFUl9TUkNfUEFEIChlbmNvZGVyKTsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2NhcHMgKHF1ZXJ5LCAmZmlsdGVyKTsKKworICAgICAgLyogRklYTUUgVHJ5IGFuZCBub3QgcHJvYmUgdGhlIGVudGlyZSBlbmNvZGVyLCBidXQgb25seSB0aGUgaW1wbGVtZW50CisgICAgICAgKiBzdWJjbGFzcyBmb3JtYXQgKi8KKyAgICAgIGlmIChzZWxmLT5wcm9iZWRfc3JjY2FwcykgeworICAgICAgICBHc3RDYXBzICp0bXBsID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHBhZCk7CisgICAgICAgIHJlc3VsdCA9IGdzdF9jYXBzX2ludGVyc2VjdCAodG1wbCwgc2VsZi0+cHJvYmVkX3NyY2NhcHMpOworICAgICAgICBnc3RfY2Fwc191bnJlZiAodG1wbCk7CisgICAgICB9IGVsc2UKKyAgICAgICAgcmVzdWx0ID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHBhZCk7CisKKyAgICAgIGlmIChmaWx0ZXIpIHsKKyAgICAgICAgR3N0Q2FwcyAqdG1wID0gcmVzdWx0OworICAgICAgICByZXN1bHQgPQorICAgICAgICAgICAgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgdG1wLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgICAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICAgIH0KKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlJldHVybmluZyBzcmMgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgcmVzdWx0KTsKKworICAgICAgZ3N0X3F1ZXJ5X3NldF9jYXBzX3Jlc3VsdCAocXVlcnksIHJlc3VsdCk7CisgICAgICBnc3RfY2Fwc191bnJlZiAocmVzdWx0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBHU1RfVklERU9fRU5DT0RFUl9DTEFTUyAocGFyZW50X2NsYXNzKS0+c3JjX3F1ZXJ5IChlbmNvZGVyLCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fZW5jX3NpbmtfcXVlcnkgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIEdzdFY0bDJWaWRlb0VuYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0VOQyAoZW5jb2Rlcik7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQ0FQUzp7CisgICAgICBHc3RDYXBzICpmaWx0ZXIsICpyZXN1bHQgPSBOVUxMOworICAgICAgR3N0UGFkICpwYWQgPSBHU1RfVklERU9fRU5DT0RFUl9TSU5LX1BBRCAoZW5jb2Rlcik7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9jYXBzIChxdWVyeSwgJmZpbHRlcik7CisKKyAgICAgIGlmIChzZWxmLT5wcm9iZWRfc2lua2NhcHMpCisgICAgICAgIHJlc3VsdCA9IGdzdF9jYXBzX3JlZiAoc2VsZi0+cHJvYmVkX3NpbmtjYXBzKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHBhZCk7CisKKyAgICAgIGlmIChmaWx0ZXIpIHsKKyAgICAgICAgR3N0Q2FwcyAqdG1wID0gcmVzdWx0OworICAgICAgICByZXN1bHQgPQorICAgICAgICAgICAgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgdG1wLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgICAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICAgIH0KKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlJldHVybmluZyBzaW5rIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIHJlc3VsdCk7CisKKyAgICAgIGdzdF9xdWVyeV9zZXRfY2Fwc19yZXN1bHQgKHF1ZXJ5LCByZXN1bHQpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKHJlc3VsdCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gR1NUX1ZJREVPX0VOQ09ERVJfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNpbmtfcXVlcnkgKGVuY29kZXIsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl92aWRlb19lbmNfc2lua19ldmVudCAoR3N0VmlkZW9FbmNvZGVyICogZW5jb2RlciwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0VjRsMlZpZGVvRW5jICpzZWxmID0gR1NUX1Y0TDJfVklERU9fRU5DIChlbmNvZGVyKTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUQVJUOgorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImZsdXNoIHN0YXJ0Iik7CisgICAgICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrIChzZWxmLT52NGwyb3V0cHV0KTsKKyAgICAgIGdzdF92NGwyX29iamVjdF91bmxvY2sgKHNlbGYtPnY0bDJjYXB0dXJlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9WSURFT19FTkNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChlbmNvZGVyLCBldmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RBUlQ6CisgICAgICBnc3RfcGFkX3N0b3BfdGFzayAoZW5jb2Rlci0+c3JjcGFkKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJmbHVzaCBzdGFydCBkb25lIik7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfdjRsMl92aWRlb19lbmNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RWNGwyVmlkZW9FbmMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19FTkMgKGVsZW1lbnQpOworCisgIGlmICh0cmFuc2l0aW9uID09IEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZKSB7CisgICAgZ19hdG9taWNfaW50X3NldCAoJnNlbGYtPmFjdGl2ZSwgRkFMU0UpOworICAgIGdzdF92NGwyX29iamVjdF91bmxvY2sgKHNlbGYtPnY0bDJvdXRwdXQpOworICAgIGdzdF92NGwyX29iamVjdF91bmxvY2sgKHNlbGYtPnY0bDJjYXB0dXJlKTsKKyAgfQorCisgIHJldHVybiBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdmlkZW9fZW5jX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFY0bDJWaWRlb0VuYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0VOQyAob2JqZWN0KTsKKworICBnc3RfY2Fwc19yZXBsYWNlICgmc2VsZi0+cHJvYmVkX3NpbmtjYXBzLCBOVUxMKTsKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNlbGYtPnByb2JlZF9zcmNjYXBzLCBOVUxMKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3ZpZGVvX2VuY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0VjRsMlZpZGVvRW5jICpzZWxmID0gR1NUX1Y0TDJfVklERU9fRU5DIChvYmplY3QpOworCisgIGdzdF92NGwyX29iamVjdF9kZXN0cm95IChzZWxmLT52NGwyY2FwdHVyZSk7CisgIGdzdF92NGwyX29iamVjdF9kZXN0cm95IChzZWxmLT52NGwyb3V0cHV0KTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3ZpZGVvX2VuY19pbml0IChHc3RWNGwyVmlkZW9FbmMgKiBzZWxmKQoreworICAvKiBWNEwyIG9iamVjdCBhcmUgY3JlYXRlZCBpbiBzdWJpbnN0YW5jZV9pbml0ICovCit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl92aWRlb19lbmNfc3ViaW5zdGFuY2VfaW5pdCAoR1R5cGVJbnN0YW5jZSAqIGluc3RhbmNlLCBncG9pbnRlciBnX2NsYXNzKQoreworICBHc3RWNGwyVmlkZW9FbmNDbGFzcyAqa2xhc3MgPSBHU1RfVjRMMl9WSURFT19FTkNfQ0xBU1MgKGdfY2xhc3MpOworICBHc3RWNGwyVmlkZW9FbmMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19FTkMgKGluc3RhbmNlKTsKKworICBzZWxmLT52NGwyb3V0cHV0ID0gZ3N0X3Y0bDJfb2JqZWN0X25ldyAoR1NUX0VMRU1FTlQgKHNlbGYpLAorICAgICAgR1NUX09CSkVDVCAoR1NUX1ZJREVPX0VOQ09ERVJfU0lOS19QQUQgKHNlbGYpKSwKKyAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVULCBrbGFzcy0+ZGVmYXVsdF9kZXZpY2UsCisgICAgICBnc3RfdjRsMl9nZXRfb3V0cHV0LCBnc3RfdjRsMl9zZXRfb3V0cHV0LCBOVUxMKTsKKyAgc2VsZi0+djRsMm91dHB1dC0+bm9faW5pdGlhbF9mb3JtYXQgPSBUUlVFOworICBzZWxmLT52NGwyb3V0cHV0LT5rZWVwX2FzcGVjdCA9IEZBTFNFOworCisgIHNlbGYtPnY0bDJjYXB0dXJlID0gZ3N0X3Y0bDJfb2JqZWN0X25ldyAoR1NUX0VMRU1FTlQgKHNlbGYpLAorICAgICAgR1NUX09CSkVDVCAoR1NUX1ZJREVPX0VOQ09ERVJfU1JDX1BBRCAoc2VsZikpLAorICAgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLCBrbGFzcy0+ZGVmYXVsdF9kZXZpY2UsCisgICAgICBnc3RfdjRsMl9nZXRfaW5wdXQsIGdzdF92NGwyX3NldF9pbnB1dCwgTlVMTCk7CisgIHNlbGYtPnY0bDJjYXB0dXJlLT5ub19pbml0aWFsX2Zvcm1hdCA9IFRSVUU7CisgIHNlbGYtPnY0bDJvdXRwdXQtPmtlZXBfYXNwZWN0ID0gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl92aWRlb19lbmNfY2xhc3NfaW5pdCAoR3N0VjRsMlZpZGVvRW5jQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdFZpZGVvRW5jb2RlckNsYXNzICp2aWRlb19lbmNvZGVyX2NsYXNzOworCisgIHBhcmVudF9jbGFzcyA9IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoa2xhc3MpOworCisgIGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcyA9IChHc3RWaWRlb0VuY29kZXJDbGFzcyAqKSBrbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3Y0bDJfdmlkZW9fZW5jX2RlYnVnLCAidjRsMnZpZGVvZW5jIiwgMCwKKyAgICAgICJWNEwyIFZpZGVvIEVuY29kZXIiKTsKKworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2VuY19kaXNwb3NlKTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZW5jX2ZpbmFsaXplKTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19lbmNfc2V0X3Byb3BlcnR5KTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19lbmNfZ2V0X3Byb3BlcnR5KTsKKworICB2aWRlb19lbmNvZGVyX2NsYXNzLT5vcGVuID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2VuY19vcGVuKTsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcy0+Y2xvc2UgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZW5jX2Nsb3NlKTsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZW5jX3N0YXJ0KTsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19lbmNfc3RvcCk7CisgIHZpZGVvX2VuY29kZXJfY2xhc3MtPmZpbmlzaCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19lbmNfZmluaXNoKTsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcy0+Zmx1c2ggPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZW5jX2ZsdXNoKTsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcy0+c2V0X2Zvcm1hdCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZW5jX3NldF9mb3JtYXQpOworICB2aWRlb19lbmNvZGVyX2NsYXNzLT5uZWdvdGlhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2VuY19uZWdvdGlhdGUpOworICB2aWRlb19lbmNvZGVyX2NsYXNzLT5kZWNpZGVfYWxsb2NhdGlvbiA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZW5jX2RlY2lkZV9hbGxvY2F0aW9uKTsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcy0+cHJvcG9zZV9hbGxvY2F0aW9uID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19lbmNfcHJvcG9zZV9hbGxvY2F0aW9uKTsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcy0+c2lua19xdWVyeSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZW5jX3NpbmtfcXVlcnkpOworICB2aWRlb19lbmNvZGVyX2NsYXNzLT5zcmNfcXVlcnkgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2VuY19zcmNfcXVlcnkpOworICB2aWRlb19lbmNvZGVyX2NsYXNzLT5zaW5rX2V2ZW50ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19lbmNfc2lua19ldmVudCk7CisgIHZpZGVvX2VuY29kZXJfY2xhc3MtPmhhbmRsZV9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZW5jX2hhbmRsZV9mcmFtZSk7CisKKyAgZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19lbmNfY2hhbmdlX3N0YXRlKTsKKworICBnc3RfdjRsMl9vYmplY3RfaW5zdGFsbF9tMm1fcHJvcGVydGllc19oZWxwZXIgKGdvYmplY3RfY2xhc3MpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdmlkZW9fZW5jX3N1YmNsYXNzX2luaXQgKGdwb2ludGVyIGdfY2xhc3MsIGdwb2ludGVyIGRhdGEpCit7CisgIEdzdFY0bDJWaWRlb0VuY0NsYXNzICprbGFzcyA9IEdTVF9WNEwyX1ZJREVPX0VOQ19DTEFTUyAoZ19jbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChnX2NsYXNzKTsKKyAgR3N0VjRsMlZpZGVvRW5jQ0RhdGEgKmNkYXRhID0gZGF0YTsKKworICBrbGFzcy0+ZGVmYXVsdF9kZXZpY2UgPSBjZGF0YS0+ZGV2aWNlOworCisgIC8qIE5vdGU6IGdzdF9wYWRfdGVtcGxhdGVfbmV3KCkgdGFrZSB0aGUgZmxvYXRpbmcgcmVmIGZyb20gdGhlIGNhcHMgKi8KKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgIGdzdF9wYWRfdGVtcGxhdGVfbmV3ICgic2luayIsIEdTVF9QQURfU0lOSywgR1NUX1BBRF9BTFdBWVMsCisgICAgICAgICAgY2RhdGEtPnNpbmtfY2FwcykpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgZ3N0X3BhZF90ZW1wbGF0ZV9uZXcgKCJzcmMiLCBHU1RfUEFEX1NSQywgR1NUX1BBRF9BTFdBWVMsCisgICAgICAgICAgY2RhdGEtPnNyY19jYXBzKSk7CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGNkYXRhLT5zaW5rX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2RhdGEtPnNyY19jYXBzKTsKKyAgZ19mcmVlIChjZGF0YSk7Cit9CisKKy8qIFByb2JpbmcgZnVuY3Rpb25zICovCitnYm9vbGVhbgorZ3N0X3Y0bDJfaXNfdmlkZW9fZW5jIChHc3RDYXBzICogc2lua19jYXBzLCBHc3RDYXBzICogc3JjX2NhcHMsCisgICAgR3N0Q2FwcyAqIGNvZGVjX2NhcHMpCit7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworICBnYm9vbGVhbiAoKmNoZWNrX2NhcHMpIChjb25zdCBHc3RDYXBzICosIGNvbnN0IEdzdENhcHMgKik7CisKKyAgaWYgKGNvZGVjX2NhcHMpIHsKKyAgICBjaGVja19jYXBzID0gZ3N0X2NhcHNfY2FuX2ludGVyc2VjdDsKKyAgfSBlbHNlIHsKKyAgICBjb2RlY19jYXBzID0gZ3N0X3Y0bDJfb2JqZWN0X2dldF9jb2RlY19jYXBzICgpOworICAgIGNoZWNrX2NhcHMgPSBnc3RfY2Fwc19pc19zdWJzZXQ7CisgIH0KKworICBpZiAoZ3N0X2NhcHNfaXNfc3Vic2V0IChzaW5rX2NhcHMsIGdzdF92NGwyX29iamVjdF9nZXRfcmF3X2NhcHMgKCkpCisgICAgICAmJiBjaGVja19jYXBzIChzcmNfY2FwcywgY29kZWNfY2FwcykpCisgICAgcmV0ID0gVFJVRTsKKworICByZXR1cm4gcmV0OworfQorCit2b2lkCitnc3RfdjRsMl92aWRlb19lbmNfcmVnaXN0ZXIgKEdzdFBsdWdpbiAqIHBsdWdpbiwgR1R5cGUgdHlwZSwKKyAgICBjb25zdCBjaGFyICpjb2RlYywgY29uc3QgZ2NoYXIgKiBiYXNlbmFtZSwgY29uc3QgZ2NoYXIgKiBkZXZpY2VfcGF0aCwKKyAgICBHc3RDYXBzICogc2lua19jYXBzLCBHc3RDYXBzICogY29kZWNfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKQoreworICBHc3RDYXBzICpmaWx0ZXJlZF9jYXBzOworICBHVHlwZVF1ZXJ5IHR5cGVfcXVlcnk7CisgIEdUeXBlSW5mbyB0eXBlX2luZm8gPSB7IDAsIH07CisgIEdUeXBlIHN1YnR5cGU7CisgIGdjaGFyICp0eXBlX25hbWU7CisgIEdzdFY0bDJWaWRlb0VuY0NEYXRhICpjZGF0YTsKKworICBmaWx0ZXJlZF9jYXBzID0gZ3N0X2NhcHNfaW50ZXJzZWN0IChzcmNfY2FwcywgY29kZWNfY2Fwcyk7CisKKyAgY2RhdGEgPSBnX25ldzAgKEdzdFY0bDJWaWRlb0VuY0NEYXRhLCAxKTsKKyAgY2RhdGEtPmRldmljZSA9IGdfc3RyZHVwIChkZXZpY2VfcGF0aCk7CisgIGNkYXRhLT5zaW5rX2NhcHMgPSBnc3RfY2Fwc19yZWYgKHNpbmtfY2Fwcyk7CisgIGNkYXRhLT5zcmNfY2FwcyA9IGdzdF9jYXBzX3JlZiAoZmlsdGVyZWRfY2Fwcyk7CisKKyAgZ190eXBlX3F1ZXJ5ICh0eXBlLCAmdHlwZV9xdWVyeSk7CisgIG1lbXNldCAoJnR5cGVfaW5mbywgMCwgc2l6ZW9mICh0eXBlX2luZm8pKTsKKyAgdHlwZV9pbmZvLmNsYXNzX3NpemUgPSB0eXBlX3F1ZXJ5LmNsYXNzX3NpemU7CisgIHR5cGVfaW5mby5pbnN0YW5jZV9zaXplID0gdHlwZV9xdWVyeS5pbnN0YW5jZV9zaXplOworICB0eXBlX2luZm8uY2xhc3NfaW5pdCA9IGdzdF92NGwyX3ZpZGVvX2VuY19zdWJjbGFzc19pbml0OworICB0eXBlX2luZm8uY2xhc3NfZGF0YSA9IGNkYXRhOworICB0eXBlX2luZm8uaW5zdGFuY2VfaW5pdCA9IGdzdF92NGwyX3ZpZGVvX2VuY19zdWJpbnN0YW5jZV9pbml0OworCisgIC8qIFRoZSBmaXJzdCBlbmNvZGVyIHRvIGJlIHJlZ2lzdGVyZWQgc2hvdWxkIHVzZSBhIGNvbnN0YW50IG5hbWUsIGxpa2UKKyAgICogdjRsMmgyNjRlbmMsIGZvciBhbnkgYWRkaXRpb25hbCBlbmNvZGVycywgd2UgY3JlYXRlIHVuaXF1ZSBuYW1lcy4gRW5jb2RlcgorICAgKiBuYW1lcyBtYXkgY2hhbmdlIGJldHdlZW4gYm9vdHMsIHNvIHRoaXMgc2hvdWxkIGhlbHAgZ2FpbiBzdGFibGUgbmFtZXMgZm9yCisgICAqIHRoZSBtb3N0IGNvbW1vbiB1c2UgY2FzZXMuICovCisgIHR5cGVfbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInY0bDIlc2VuYyIsIGNvZGVjKTsKKworICBpZiAoZ190eXBlX2Zyb21fbmFtZSAodHlwZV9uYW1lKSAhPSAwKSB7CisgICAgZ19mcmVlICh0eXBlX25hbWUpOworICAgIHR5cGVfbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInY0bDIlcyVzZW5jIiwgYmFzZW5hbWUsIGNvZGVjKTsKKyAgfQorCisgIHN1YnR5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljICh0eXBlLCB0eXBlX25hbWUsICZ0eXBlX2luZm8sIDApOworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgdHlwZV9uYW1lLCBHU1RfUkFOS19QUklNQVJZICsgMSwgc3VidHlwZSkpCisgICAgR1NUX1dBUk5JTkcgKCJGYWlsZWQgdG8gcmVnaXN0ZXIgcGx1Z2luICclcyciLCB0eXBlX25hbWUpOworCisgIGdfZnJlZSAodHlwZV9uYW1lKTsKK30KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJ2aWRlb2VuYy5oIGIvc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAzYWNkNQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2dzdHY0bDJ2aWRlb2VuYy5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgU1VNT01PIENvbXB1dGVyIEFzc29jaWF0aW9uLgorICogICAgIEF1dGhvcjogYXlha2EgPGF5YWthQHNvdWxpay5pbmZvPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9fR1NUX1Y0TDJfVklERU9fRU5DX0hfXworI2RlZmluZSBfX0dTVF9WNEwyX1ZJREVPX0VOQ19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9lbmNvZGVyLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvbWV0YS5oPgorCisjaW5jbHVkZSA8Z3N0djRsMm9iamVjdC5oPgorI2luY2x1ZGUgPGdzdHY0bDJidWZmZXJwb29sLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfVjRMMl9WSURFT19FTkMgXAorICAoZ3N0X3Y0bDJfdmlkZW9fZW5jX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WNEwyX1ZJREVPX0VOQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1Y0TDJfVklERU9fRU5DLEdzdFY0bDJWaWRlb0VuYykpCisjZGVmaW5lIEdTVF9WNEwyX1ZJREVPX0VOQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WNEwyX1ZJREVPX0VOQyxHc3RWNGwyVmlkZW9FbmNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19WNEwyX1ZJREVPX0VOQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1Y0TDJfVklERU9fRU5DKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJfVklERU9fRU5DX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9WNEwyX1ZJREVPX0VOQykpCisjZGVmaW5lIEdTVF9WNEwyX1ZJREVPX0VOQ19HRVRfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfVjRMMl9WSURFT19FTkMsIEdzdFY0bDJWaWRlb0VuY0NsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJWaWRlb0VuYyBHc3RWNGwyVmlkZW9FbmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMlZpZGVvRW5jQ2xhc3MgR3N0VjRsMlZpZGVvRW5jQ2xhc3M7CisKK3N0cnVjdCBfR3N0VjRsMlZpZGVvRW5jCit7CisgIEdzdFZpZGVvRW5jb2RlciBwYXJlbnQ7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKyAgR3N0VjRsMk9iamVjdCAqdjRsMm91dHB1dDsKKyAgR3N0VjRsMk9iamVjdCAqdjRsMmNhcHR1cmU7CisKKyAgLyogcGFkcyAqLworICBHc3RDYXBzICpwcm9iZWRfc3JjY2FwczsKKyAgR3N0Q2FwcyAqcHJvYmVkX3NpbmtjYXBzOworCisgIC8qIFN0YXRlICovCisgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqaW5wdXRfc3RhdGU7CisgIGdib29sZWFuIGFjdGl2ZTsKKyAgZ2Jvb2xlYW4gcHJvY2Vzc2luZzsKKyAgR3N0Rmxvd1JldHVybiBvdXRwdXRfZmxvdzsKKworfTsKKworc3RydWN0IF9Hc3RWNGwyVmlkZW9FbmNDbGFzcworeworICBHc3RWaWRlb0VuY29kZXJDbGFzcyBwYXJlbnRfY2xhc3M7CisKKyAgZ2NoYXIgKmRlZmF1bHRfZGV2aWNlOworICBjb25zdCBjaGFyICpjb2RlY19uYW1lOworCisgIGd1aW50MzIgcHJvZmlsZV9jaWQ7CisgIGNvbnN0IGdjaGFyICogKCpwcm9maWxlX3RvX3N0cmluZykgKGdpbnQgdjRsMl9wcm9maWxlKTsKKyAgZ2ludCAoKnByb2ZpbGVfZnJvbV9zdHJpbmcpIChjb25zdCBnY2hhciAqIHByb2ZpbGUpOworCisgIGd1aW50MzIgbGV2ZWxfY2lkOworICBjb25zdCBnY2hhciAqICgqbGV2ZWxfdG9fc3RyaW5nKSAoZ2ludCB2NGwyX2xldmVsKTsKKyAgZ2ludCAoKmxldmVsX2Zyb21fc3RyaW5nKSAoY29uc3QgZ2NoYXIgKiBsZXZlbCk7Cit9OworCitHVHlwZSBnc3RfdjRsMl92aWRlb19lbmNfZ2V0X3R5cGUgKHZvaWQpOworCisKK2dib29sZWFuIGdzdF92NGwyX2lzX3ZpZGVvX2VuYyAoR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzLAorICAgIEdzdENhcHMgKiBjb2RlY19jYXBzKTsKKwordm9pZCBnc3RfdjRsMl92aWRlb19lbmNfcmVnaXN0ZXIgKEdzdFBsdWdpbiAqIHBsdWdpbiwgR1R5cGUgdHlwZSwKKyAgICBjb25zdCBjaGFyICpjb2RlYywgY29uc3QgZ2NoYXIgKiBiYXNlbmFtZSwgY29uc3QgZ2NoYXIgKiBkZXZpY2VfcGF0aCwKKyAgICBHc3RDYXBzICogc2lua19jYXBzLCBHc3RDYXBzICpjb2RlY19jYXBzLCBHc3RDYXBzICogc3JjX2NhcHMpOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1Y0TDJfVklERU9fRU5DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMnZpZG9yaWVudC5jIGIvc3lzL3Y0bDIvZ3N0djRsMnZpZG9yaWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljY2I0NTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwydmlkb3JpZW50LmMKQEAgLTAsMCArMSw5NyBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+CisgKgorICogZ3N0djRsMnZpZG9yaWVudC5jOiB2aWRlbyBvcmllbnRhdGlvbiBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIFY0TDIKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJnc3R2NGwyb2JqZWN0LmgiCisjaW5jbHVkZSAiZ3N0djRsMnZpZG9yaWVudC5oIgorI2luY2x1ZGUgImdzdHY0bDJvYmplY3QuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAodjRsMnZvX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHY0bDJ2b19kZWJ1ZworCit2b2lkCitnc3RfdjRsMl92aWRlb19vcmllbnRhdGlvbl9pbnRlcmZhY2VfaW5pdCAoR3N0VmlkZW9PcmllbnRhdGlvbkludGVyZmFjZSAqIGlmYWNlKQoreworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAodjRsMnZvX2RlYnVnLCAidjRsMnZvIiwgMCwKKyAgICAgICJWNEwyIFZpZGVvT3JpZW50YXRpb24gaW50ZXJmYWNlIGRlYnVnZ2luZyIpOworfQorCisKK2dib29sZWFuCitnc3RfdjRsMl92aWRlb19vcmllbnRhdGlvbl9nZXRfaGZsaXAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIGdib29sZWFuICogZmxpcCkKK3sKKworICByZXR1cm4gZ3N0X3Y0bDJfZ2V0X2F0dHJpYnV0ZSAodjRsMm9iamVjdCwgVjRMMl9DSURfSEZMSVAsIGZsaXApOworfQorCitnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fb3JpZW50YXRpb25fZ2V0X3ZmbGlwIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBnYm9vbGVhbiAqIGZsaXApCit7CisgIHJldHVybiBnc3RfdjRsMl9nZXRfYXR0cmlidXRlICh2NGwyb2JqZWN0LCBWNEwyX0NJRF9WRkxJUCwgZmxpcCk7Cit9CisKKy8qIG5hbWVkIGhjZW50ZXIgYmVjYXVzZSBvZiBoaXN0b3JpY2FsIHY0bDIgbmFtaW5nICovCitnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fb3JpZW50YXRpb25fZ2V0X2hjZW50ZXIgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIGdpbnQgKiBjZW50ZXIpCit7CisgIHJldHVybiBnc3RfdjRsMl9nZXRfYXR0cmlidXRlICh2NGwyb2JqZWN0LCBWNEwyX0NJRF9QQU5fUkVTRVQsIGNlbnRlcik7Cit9CisKKy8qIG5hbWVkIHZjZW50ZXIgYmVjYXVzZSBvZiBoaXN0b3JpY2FsIHY0bDIgbmFtaW5nICovCitnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fb3JpZW50YXRpb25fZ2V0X3ZjZW50ZXIgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIGdpbnQgKiBjZW50ZXIpCit7CisgIHJldHVybiBnc3RfdjRsMl9nZXRfYXR0cmlidXRlICh2NGwyb2JqZWN0LCBWNEwyX0NJRF9USUxUX1JFU0VULCBjZW50ZXIpOworfQorCitnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fb3JpZW50YXRpb25fc2V0X2hmbGlwIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgZ2Jvb2xlYW4gZmxpcCkKK3sKKyAgcmV0dXJuIGdzdF92NGwyX3NldF9hdHRyaWJ1dGUgKHY0bDJvYmplY3QsIFY0TDJfQ0lEX0hGTElQLCBmbGlwKTsKK30KKworZ2Jvb2xlYW4KK2dzdF92NGwyX3ZpZGVvX29yaWVudGF0aW9uX3NldF92ZmxpcCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIGdib29sZWFuIGZsaXApCit7CisgIHJldHVybiBnc3RfdjRsMl9zZXRfYXR0cmlidXRlICh2NGwyb2JqZWN0LCBWNEwyX0NJRF9WRkxJUCwgZmxpcCk7Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl92aWRlb19vcmllbnRhdGlvbl9zZXRfaGNlbnRlciAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIGdpbnQgY2VudGVyKQoreworICByZXR1cm4gZ3N0X3Y0bDJfc2V0X2F0dHJpYnV0ZSAodjRsMm9iamVjdCwgVjRMMl9DSURfUEFOX1JFU0VULCBjZW50ZXIpOworfQorCitnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fb3JpZW50YXRpb25fc2V0X3ZjZW50ZXIgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBnaW50IGNlbnRlcikKK3sKKyAgcmV0dXJuIGdzdF92NGwyX3NldF9hdHRyaWJ1dGUgKHY0bDJvYmplY3QsIFY0TDJfQ0lEX1RJTFRfUkVTRVQsIGNlbnRlcik7Cit9CmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwydmlkb3JpZW50LmggYi9zeXMvdjRsMi9nc3R2NGwydmlkb3JpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAyYWU4YQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2dzdHY0bDJ2aWRvcmllbnQuaApAQCAtMCwwICsxLDExOCBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+CisgKgorICogZ3N0djRsMnZpZG9yaWVudC5oOiB2aWRlbyBvcmllbnRhdGlvbiBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIFY0TDIKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1Y0TDJfVklET1JJRU5UX0hfXworI2RlZmluZSBfX0dTVF9WNEwyX1ZJRE9SSUVOVF9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW9vcmllbnRhdGlvbi5oPgorCisjaW5jbHVkZSAiZ3N0djRsMm9iamVjdC5oIgorCitHX0JFR0lOX0RFQ0xTCisKK3ZvaWQgICAgIGdzdF92NGwyX3ZpZGVvX29yaWVudGF0aW9uX2ludGVyZmFjZV9pbml0IChHc3RWaWRlb09yaWVudGF0aW9uSW50ZXJmYWNlICogaWZhY2UpOworCitnYm9vbGVhbiBnc3RfdjRsMl92aWRlb19vcmllbnRhdGlvbl9nZXRfaGZsaXAgCShHc3RWNGwyT2JqZWN0ICp2NGwyb2JqZWN0LCBnYm9vbGVhbiAqZmxpcCk7CitnYm9vbGVhbiBnc3RfdjRsMl92aWRlb19vcmllbnRhdGlvbl9nZXRfdmZsaXAgCShHc3RWNGwyT2JqZWN0ICp2NGwyb2JqZWN0LCBnYm9vbGVhbiAqZmxpcCk7CitnYm9vbGVhbiBnc3RfdjRsMl92aWRlb19vcmllbnRhdGlvbl9nZXRfaGNlbnRlciAoR3N0VjRsMk9iamVjdCAqdjRsMm9iamVjdCwgZ2ludCAqY2VudGVyKTsKK2dib29sZWFuIGdzdF92NGwyX3ZpZGVvX29yaWVudGF0aW9uX2dldF92Y2VudGVyIChHc3RWNGwyT2JqZWN0ICp2NGwyb2JqZWN0LCBnaW50ICpjZW50ZXIpOworCitnYm9vbGVhbiBnc3RfdjRsMl92aWRlb19vcmllbnRhdGlvbl9zZXRfaGZsaXAgCShHc3RWNGwyT2JqZWN0ICp2NGwyb2JqZWN0LCBnYm9vbGVhbiBmbGlwKTsKK2dib29sZWFuIGdzdF92NGwyX3ZpZGVvX29yaWVudGF0aW9uX3NldF92ZmxpcCAJKEdzdFY0bDJPYmplY3QgKnY0bDJvYmplY3QsIGdib29sZWFuIGZsaXApOworZ2Jvb2xlYW4gZ3N0X3Y0bDJfdmlkZW9fb3JpZW50YXRpb25fc2V0X2hjZW50ZXIgKEdzdFY0bDJPYmplY3QgKnY0bDJvYmplY3QsIGdpbnQgY2VudGVyKTsKK2dib29sZWFuIGdzdF92NGwyX3ZpZGVvX29yaWVudGF0aW9uX3NldF92Y2VudGVyIChHc3RWNGwyT2JqZWN0ICp2NGwyb2JqZWN0LCBnaW50IGNlbnRlcik7CisKKyNkZWZpbmUgR1NUX0lNUExFTUVOVF9WNEwyX1ZJRE9SSUVOVF9NRVRIT0RTKFR5cGUsIGludGVyZmFjZV9hc19mdW5jdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBnYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF92aWRlb19vcmllbnRhdGlvbl9nZXRfaGZsaXAgKEdzdFZpZGVvT3JpZW50YXRpb24gKnZvLCBnYm9vbGVhbiAqZmxpcCkgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVHlwZSAqdGhpcyA9IChUeXBlKikgdm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gZ3N0X3Y0bDJfdmlkZW9fb3JpZW50YXRpb25fZ2V0X2hmbGlwICh0aGlzLT52NGwyb2JqZWN0LCBmbGlwKTsJCSAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdmlkZW9fb3JpZW50YXRpb25fZ2V0X3ZmbGlwIChHc3RWaWRlb09yaWVudGF0aW9uICp2bywgZ2Jvb2xlYW4gKmZsaXApICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFR5cGUgKnRoaXMgPSAoVHlwZSopIHZvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGdzdF92NGwyX3ZpZGVvX29yaWVudGF0aW9uX2dldF92ZmxpcCAodGhpcy0+djRsMm9iamVjdCwgZmxpcCk7CQkgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIGdib29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3ZpZGVvX29yaWVudGF0aW9uX2dldF9oY2VudGVyIChHc3RWaWRlb09yaWVudGF0aW9uICp2bywgZ2ludCAqY2VudGVyKSAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUeXBlICp0aGlzID0gKFR5cGUqKSB2bzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBnc3RfdjRsMl92aWRlb19vcmllbnRhdGlvbl9nZXRfaGNlbnRlciAodGhpcy0+djRsMm9iamVjdCwgY2VudGVyKTsJCSAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdmlkZW9fb3JpZW50YXRpb25fZ2V0X3ZjZW50ZXIgKEdzdFZpZGVvT3JpZW50YXRpb24gKnZvLCBnaW50ICpjZW50ZXIpICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFR5cGUgKnRoaXMgPSAoVHlwZSopIHZvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGdzdF92NGwyX3ZpZGVvX29yaWVudGF0aW9uX2dldF92Y2VudGVyICh0aGlzLT52NGwyb2JqZWN0LCBjZW50ZXIpOwkJICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBnYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF92aWRlb19vcmllbnRhdGlvbl9zZXRfaGZsaXAgKEdzdFZpZGVvT3JpZW50YXRpb24gKnZvLCBnYm9vbGVhbiBmbGlwKSAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVHlwZSAqdGhpcyA9IChUeXBlKikgdm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gZ3N0X3Y0bDJfdmlkZW9fb3JpZW50YXRpb25fc2V0X2hmbGlwICh0aGlzLT52NGwyb2JqZWN0LCBmbGlwKTsJCSAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdmlkZW9fb3JpZW50YXRpb25fc2V0X3ZmbGlwIChHc3RWaWRlb09yaWVudGF0aW9uICp2bywgZ2Jvb2xlYW4gZmxpcCkgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFR5cGUgKnRoaXMgPSAoVHlwZSopIHZvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGdzdF92NGwyX3ZpZGVvX29yaWVudGF0aW9uX3NldF92ZmxpcCAodGhpcy0+djRsMm9iamVjdCwgZmxpcCk7CQkgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIGdib29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3ZpZGVvX29yaWVudGF0aW9uX3NldF9oY2VudGVyIChHc3RWaWRlb09yaWVudGF0aW9uICp2bywgZ2ludCBjZW50ZXIpICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUeXBlICp0aGlzID0gKFR5cGUqKSB2bzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBnc3RfdjRsMl92aWRlb19vcmllbnRhdGlvbl9zZXRfaGNlbnRlciAodGhpcy0+djRsMm9iamVjdCwgY2VudGVyKTsJCSAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdmlkZW9fb3JpZW50YXRpb25fc2V0X3ZjZW50ZXIgKEdzdFZpZGVvT3JpZW50YXRpb24gKnZvLCBnaW50IGNlbnRlcikgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFR5cGUgKnRoaXMgPSAoVHlwZSopIHZvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGdzdF92NGwyX3ZpZGVvX29yaWVudGF0aW9uX3NldF92Y2VudGVyICh0aGlzLT52NGwyb2JqZWN0LCBjZW50ZXIpOwkJICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF92aWRlb19vcmllbnRhdGlvbl9pbnRlcmZhY2VfaW5pdCAoR3N0VmlkZW9PcmllbnRhdGlvbkludGVyZmFjZSAqIGlmYWNlKSAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBkZWZhdWx0IHZpcnR1YWwgZnVuY3Rpb25zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmYWNlLT5nZXRfaGZsaXAgICA9IGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdmlkZW9fb3JpZW50YXRpb25fZ2V0X2hmbGlwOyAgICAgICAgICAgICAgICAgICBcCisgICAgaWZhY2UtPmdldF92ZmxpcCAgID0gaW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF92aWRlb19vcmllbnRhdGlvbl9nZXRfdmZsaXA7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZmFjZS0+Z2V0X2hjZW50ZXIgPSBpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3ZpZGVvX29yaWVudGF0aW9uX2dldF9oY2VudGVyOyAgICAgICAgICAgICAgICAgXAorICAgIGlmYWNlLT5nZXRfdmNlbnRlciA9IGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdmlkZW9fb3JpZW50YXRpb25fZ2V0X3ZjZW50ZXI7ICAgICAgICAgICAgICAgICBcCisgICAgaWZhY2UtPnNldF9oZmxpcCAgID0gaW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF92aWRlb19vcmllbnRhdGlvbl9zZXRfaGZsaXA7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZmFjZS0+c2V0X3ZmbGlwICAgPSBpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3ZpZGVvX29yaWVudGF0aW9uX3NldF92ZmxpcDsgICAgICAgICAgICAgICAgICAgXAorICAgIGlmYWNlLT5zZXRfaGNlbnRlciA9IGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdmlkZW9fb3JpZW50YXRpb25fc2V0X2hjZW50ZXI7ICAgICAgICAgICAgICAgICBcCisgICAgaWZhY2UtPnNldF92Y2VudGVyID0gaW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF92aWRlb19vcmllbnRhdGlvbl9zZXRfdmNlbnRlcjsgICAgICAgICAgICAgICAgIFwKKyAgfQorCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1Y0TDJfVklET1JJRU5UX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMnZwOGVuYy5jIGIvc3lzL3Y0bDIvZ3N0djRsMnZwOGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmM2ViMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwydnA4ZW5jLmMKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQ29sbGFib3JhIEluYy4KKyAqICAgIEF1dGhvcjogTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdHY0bDJvYmplY3QuaCIKKyNpbmNsdWRlICJnc3R2NGwydnA4ZW5jLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0LWkxOG4tcGx1Z2luLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF92NGwyX3ZwOF9lbmNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3Y0bDJfdnA4X2VuY19kZWJ1ZworCitzdGF0aWMgR3N0U3RhdGljQ2FwcyBzcmNfdGVtcGxhdGVfY2FwcyA9CitHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXZwOCwgcHJvZmlsZT0oc3RyaW5nKSB7IDAsIDEsIDIsIDMgfSIpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgVjRMMl9TVERfT0JKRUNUX1BST1BTLAorICAvKiBUT0RPICovCit9OworCisjZGVmaW5lIGdzdF92NGwyX3ZwOF9lbmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0VjRsMlZwOEVuYywgZ3N0X3Y0bDJfdnA4X2VuYywgR1NUX1RZUEVfVjRMMl9WSURFT19FTkMpOworCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdnA4X2VuY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgLyogVE9ETyAqLworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdnA4X2VuY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgLyogVE9ETyAqLworfQorCitzdGF0aWMgZ2ludAordjRsMl9wcm9maWxlX2Zyb21fc3RyaW5nIChjb25zdCBnY2hhciAqIHByb2ZpbGUpCit7CisgIGdpbnQgdjRsMl9wcm9maWxlID0gLTE7CisKKyAgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAiMCIpKQorICAgIHY0bDJfcHJvZmlsZSA9IDA7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAiMSIpKQorICAgIHY0bDJfcHJvZmlsZSA9IDE7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAiMiIpKQorICAgIHY0bDJfcHJvZmlsZSA9IDI7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAiMyIpKQorICAgIHY0bDJfcHJvZmlsZSA9IDM7CisgIGVsc2UKKyAgICBHU1RfV0FSTklORyAoIlVuc3VwcG9ydGVkIHByb2ZpbGUgc3RyaW5nICclcyciLCBwcm9maWxlKTsKKworICByZXR1cm4gdjRsMl9wcm9maWxlOworfQorCitzdGF0aWMgY29uc3QgZ2NoYXIgKgordjRsMl9wcm9maWxlX3RvX3N0cmluZyAoZ2ludCB2NGwyX3Byb2ZpbGUpCit7CisgIHN3aXRjaCAodjRsMl9wcm9maWxlKSB7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuICIwIjsKKyAgICBjYXNlIDE6CisgICAgICByZXR1cm4gIjEiOworICAgIGNhc2UgMjoKKyAgICAgIHJldHVybiAiMiI7CisgICAgY2FzZSAzOgorICAgICAgcmV0dXJuICIzIjsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX1dBUk5JTkcgKCJVbnN1cHBvcnRlZCBWNEwyIHByb2ZpbGUgJWkiLCB2NGwyX3Byb2ZpbGUpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3ZwOF9lbmNfaW5pdCAoR3N0VjRsMlZwOEVuYyAqIHNlbGYpCit7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl92cDhfZW5jX2NsYXNzX2luaXQgKEdzdFY0bDJWcDhFbmNDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3M7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0VjRsMlZpZGVvRW5jQ2xhc3MgKmJhc2VjbGFzczsKKworICBwYXJlbnRfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKGtsYXNzKTsKKworICBlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGJhc2VjbGFzcyA9IChHc3RWNGwyVmlkZW9FbmNDbGFzcyAqKSAoa2xhc3MpOworCisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF92NGwyX3ZwOF9lbmNfZGVidWcsICJ2NGwydnA4ZW5jIiwgMCwKKyAgICAgICJWNEwyIFZQOCBFbmNvZGVyIik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywKKyAgICAgICJWNEwyIFZQOCBFbmNvZGVyIiwKKyAgICAgICJDb2RlYy9FbmNvZGVyL1ZpZGVvIiwKKyAgICAgICJFbmNvZGUgVlA4IHZpZGVvIHN0cmVhbXMgdmlhIFY0TDIgQVBJIiwKKyAgICAgICJOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20iKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZwOF9lbmNfc2V0X3Byb3BlcnR5KTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92cDhfZW5jX2dldF9wcm9wZXJ0eSk7CisKKyAgYmFzZWNsYXNzLT5jb2RlY19uYW1lID0gIlZQOCI7CisgIGJhc2VjbGFzcy0+cHJvZmlsZV9jaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9QUk9GSUxFOworICBiYXNlY2xhc3MtPnByb2ZpbGVfdG9fc3RyaW5nID0gdjRsMl9wcm9maWxlX3RvX3N0cmluZzsKKyAgYmFzZWNsYXNzLT5wcm9maWxlX2Zyb21fc3RyaW5nID0gdjRsMl9wcm9maWxlX2Zyb21fc3RyaW5nOworfQorCisvKiBQcm9iaW5nIGZ1bmN0aW9ucyAqLworZ2Jvb2xlYW4KK2dzdF92NGwyX2lzX3ZwOF9lbmMgKEdzdENhcHMgKiBzaW5rX2NhcHMsIEdzdENhcHMgKiBzcmNfY2FwcykKK3sKKyAgcmV0dXJuIGdzdF92NGwyX2lzX3ZpZGVvX2VuYyAoc2lua19jYXBzLCBzcmNfY2FwcywKKyAgICAgIGdzdF9zdGF0aWNfY2Fwc19nZXQgKCZzcmNfdGVtcGxhdGVfY2FwcykpOworfQorCit2b2lkCitnc3RfdjRsMl92cDhfZW5jX3JlZ2lzdGVyIChHc3RQbHVnaW4gKiBwbHVnaW4sIGNvbnN0IGdjaGFyICogYmFzZW5hbWUsCisgICAgY29uc3QgZ2NoYXIgKiBkZXZpY2VfcGF0aCwgR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKQoreworICBnc3RfdjRsMl92aWRlb19lbmNfcmVnaXN0ZXIgKHBsdWdpbiwgR1NUX1RZUEVfVjRMMl9WUDhfRU5DLAorICAgICAgInZwOCIsIGJhc2VuYW1lLCBkZXZpY2VfcGF0aCwgc2lua19jYXBzLAorICAgICAgZ3N0X3N0YXRpY19jYXBzX2dldCAoJnNyY190ZW1wbGF0ZV9jYXBzKSwgc3JjX2NhcHMpOworfQpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMnZwOGVuYy5oIGIvc3lzL3Y0bDIvZ3N0djRsMnZwOGVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlODJiNGIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwydnA4ZW5jLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBDb2xsYWJvcmEgSW5jLgorICogICAgQXV0aG9yOiBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX19HU1RfVjRMMl9WUDhfRU5DX0hfXworI2RlZmluZSBfX0dTVF9WNEwyX1ZQOF9FTkNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSAiZ3N0djRsMnZpZGVvZW5jLmgiCisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfVjRMMl9WUDhfRU5DIFwKKyAgKGdzdF92NGwyX3ZwOF9lbmNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1Y0TDJfVlA4X0VOQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1Y0TDJfVlA4X0VOQyxHc3RWNGwyVnA4RW5jKSkKKyNkZWZpbmUgR1NUX1Y0TDJfVlA4X0VOQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WNEwyX1ZQOF9FTkMsR3N0VjRsMlZwOEVuY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJfVlA4X0VOQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1Y0TDJfVlA4X0VOQykpCisjZGVmaW5lIEdTVF9JU19WNEwyX1ZQOF9FTkNfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1Y0TDJfVlA4X0VOQykpCit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMlZwOEVuYyBHc3RWNGwyVnA4RW5jOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJWcDhFbmNDbGFzcyBHc3RWNGwyVnA4RW5jQ2xhc3M7CisKK3N0cnVjdCBfR3N0VjRsMlZwOEVuYworeworICBHc3RWNGwyVmlkZW9FbmMgcGFyZW50OworfTsKKworc3RydWN0IF9Hc3RWNGwyVnA4RW5jQ2xhc3MKK3sKKyAgR3N0VjRsMlZpZGVvRW5jQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3Y0bDJfdnA4X2VuY19nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF92NGwyX2lzX3ZwOF9lbmMgKEdzdENhcHMgKiBzaW5rX2NhcHMsIEdzdENhcHMgKiBzcmNfY2Fwcyk7CisKK3ZvaWQgZ3N0X3Y0bDJfdnA4X2VuY19yZWdpc3RlciAoR3N0UGx1Z2luICogcGx1Z2luLCBjb25zdCBnY2hhciAqIGJhc2VuYW1lLAorICAgIGNvbnN0IGdjaGFyICogZGV2aWNlX3BhdGgsIEdzdENhcHMgKiBzaW5rX2NhcHMsIEdzdENhcHMgKiBzcmNfY2Fwcyk7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYgLyogX19HU1RfVjRMMl9WUDhfRU5DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMnZwOWVuYy5jIGIvc3lzL3Y0bDIvZ3N0djRsMnZwOWVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MzhkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwydnA5ZW5jLmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQ29sbGFib3JhIEluYy4KKyAqICAgIEF1dGhvcjogTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdHY0bDJvYmplY3QuaCIKKyNpbmNsdWRlICJnc3R2NGwydnA5ZW5jLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0LWkxOG4tcGx1Z2luLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF92NGwyX3ZwOV9lbmNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3Y0bDJfdnA5X2VuY19kZWJ1ZworCitzdGF0aWMgR3N0U3RhdGljQ2FwcyBzcmNfdGVtcGxhdGVfY2FwcyA9CitHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXZwOSwgcHJvZmlsZT0oc3RyaW5nKSB7IDAsIDEsIDIsIDMgfSIpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgVjRMMl9TVERfT0JKRUNUX1BST1BTLAorICAvKiBUT0RPICovCit9OworCisjZGVmaW5lIGdzdF92NGwyX3ZwOV9lbmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0VjRsMlZwOUVuYywgZ3N0X3Y0bDJfdnA5X2VuYywgR1NUX1RZUEVfVjRMMl9WSURFT19FTkMpOworCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdnA5X2VuY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgLyogVE9ETyAqLworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdnA5X2VuY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgLyogVE9ETyAqLworfQorCitzdGF0aWMgZ2ludAordjRsMl9wcm9maWxlX2Zyb21fc3RyaW5nIChjb25zdCBnY2hhciAqIHByb2ZpbGUpCit7CisgIGdpbnQgdjRsMl9wcm9maWxlID0gLTE7CisKKyAgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAiMCIpKQorICAgIHY0bDJfcHJvZmlsZSA9IDA7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAiMSIpKQorICAgIHY0bDJfcHJvZmlsZSA9IDE7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAiMiIpKQorICAgIHY0bDJfcHJvZmlsZSA9IDI7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAiMyIpKQorICAgIHY0bDJfcHJvZmlsZSA9IDM7CisgIGVsc2UKKyAgICBHU1RfV0FSTklORyAoIlVuc3VwcG9ydGVkIHByb2ZpbGUgc3RyaW5nICclcyciLCBwcm9maWxlKTsKKworICByZXR1cm4gdjRsMl9wcm9maWxlOworfQorCitzdGF0aWMgY29uc3QgZ2NoYXIgKgordjRsMl9wcm9maWxlX3RvX3N0cmluZyAoZ2ludCB2NGwyX3Byb2ZpbGUpCit7CisgIHN3aXRjaCAodjRsMl9wcm9maWxlKSB7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuICIwIjsKKyAgICBjYXNlIDE6CisgICAgICByZXR1cm4gIjEiOworICAgIGNhc2UgMjoKKyAgICAgIHJldHVybiAiMiI7CisgICAgY2FzZSAzOgorICAgICAgcmV0dXJuICIzIjsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX1dBUk5JTkcgKCJVbnN1cHBvcnRlZCBWNEwyIHByb2ZpbGUgJWkiLCB2NGwyX3Byb2ZpbGUpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3ZwOV9lbmNfaW5pdCAoR3N0VjRsMlZwOUVuYyAqIHNlbGYpCit7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl92cDlfZW5jX2NsYXNzX2luaXQgKEdzdFY0bDJWcDlFbmNDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3M7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0VjRsMlZpZGVvRW5jQ2xhc3MgKmJhc2VjbGFzczsKKworICBwYXJlbnRfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKGtsYXNzKTsKKworICBlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGJhc2VjbGFzcyA9IChHc3RWNGwyVmlkZW9FbmNDbGFzcyAqKSAoa2xhc3MpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfdjRsMl92cDlfZW5jX2RlYnVnLCAidjRsMnZwOWVuYyIsIDAsCisgICAgICAiVjRMMiBWUDkgRW5jb2RlciIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiVjRMMiBWUDkgRW5jb2RlciIsCisgICAgICAiQ29kZWMvRW5jb2Rlci9WaWRlbyIsCisgICAgICAiRW5jb2RlIFZQOSB2aWRlbyBzdHJlYW1zIHZpYSBWNEwyIEFQSSIsCisgICAgICAiTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tIik7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92cDlfZW5jX3NldF9wcm9wZXJ0eSk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdnA5X2VuY19nZXRfcHJvcGVydHkpOworCisgIGJhc2VjbGFzcy0+Y29kZWNfbmFtZSA9ICJWUDkiOworICBiYXNlY2xhc3MtPnByb2ZpbGVfY2lkID0gVjRMMl9DSURfTVBFR19WSURFT19WUFhfUFJPRklMRTsKKyAgYmFzZWNsYXNzLT5wcm9maWxlX3RvX3N0cmluZyA9IHY0bDJfcHJvZmlsZV90b19zdHJpbmc7CisgIGJhc2VjbGFzcy0+cHJvZmlsZV9mcm9tX3N0cmluZyA9IHY0bDJfcHJvZmlsZV9mcm9tX3N0cmluZzsKK30KKworLyogUHJvYmluZyBmdW5jdGlvbnMgKi8KK2dib29sZWFuCitnc3RfdjRsMl9pc192cDlfZW5jIChHc3RDYXBzICogc2lua19jYXBzLCBHc3RDYXBzICogc3JjX2NhcHMpCit7CisgIHJldHVybiBnc3RfdjRsMl9pc192aWRlb19lbmMgKHNpbmtfY2Fwcywgc3JjX2NhcHMsCisgICAgICBnc3Rfc3RhdGljX2NhcHNfZ2V0ICgmc3JjX3RlbXBsYXRlX2NhcHMpKTsKK30KKwordm9pZAorZ3N0X3Y0bDJfdnA5X2VuY19yZWdpc3RlciAoR3N0UGx1Z2luICogcGx1Z2luLCBjb25zdCBnY2hhciAqIGJhc2VuYW1lLAorICAgIGNvbnN0IGdjaGFyICogZGV2aWNlX3BhdGgsIEdzdENhcHMgKiBzaW5rX2NhcHMsIEdzdENhcHMgKiBzcmNfY2FwcykKK3sKKyAgZ3N0X3Y0bDJfdmlkZW9fZW5jX3JlZ2lzdGVyIChwbHVnaW4sIEdTVF9UWVBFX1Y0TDJfVlA5X0VOQywKKyAgICAgICJ2cDkiLCBiYXNlbmFtZSwgZGV2aWNlX3BhdGgsIHNpbmtfY2FwcywKKyAgICAgIGdzdF9zdGF0aWNfY2Fwc19nZXQgKCZzcmNfdGVtcGxhdGVfY2FwcyksIHNyY19jYXBzKTsKK30KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJ2cDllbmMuaCBiL3N5cy92NGwyL2dzdHY0bDJ2cDllbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzY4Y2NlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMnZwOWVuYy5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQ29sbGFib3JhIEluYy4KKyAqICAgIEF1dGhvcjogTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9fR1NUX1Y0TDJfVlA5X0VOQ19IX18KKyNkZWZpbmUgX19HU1RfVjRMMl9WUDlfRU5DX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgImdzdHY0bDJ2aWRlb2VuYy5oIgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX1Y0TDJfVlA5X0VOQyBcCisgIChnc3RfdjRsMl92cDlfZW5jX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WNEwyX1ZQOV9FTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9WNEwyX1ZQOV9FTkMsR3N0VjRsMlZwOUVuYykpCisjZGVmaW5lIEdTVF9WNEwyX1ZQOV9FTkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfVjRMMl9WUDlfRU5DLEdzdFY0bDJWcDlFbmNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19WNEwyX1ZQOV9FTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WNEwyX1ZQOV9FTkMpKQorI2RlZmluZSBHU1RfSVNfVjRMMl9WUDlfRU5DX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9WNEwyX1ZQOV9FTkMpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJWcDlFbmMgR3N0VjRsMlZwOUVuYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyVnA5RW5jQ2xhc3MgR3N0VjRsMlZwOUVuY0NsYXNzOworCitzdHJ1Y3QgX0dzdFY0bDJWcDlFbmMKK3sKKyAgR3N0VjRsMlZpZGVvRW5jIHBhcmVudDsKK307CisKK3N0cnVjdCBfR3N0VjRsMlZwOUVuY0NsYXNzCit7CisgIEdzdFY0bDJWaWRlb0VuY0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF92NGwyX3ZwOV9lbmNfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfdjRsMl9pc192cDlfZW5jIChHc3RDYXBzICogc2lua19jYXBzLCBHc3RDYXBzICogc3JjX2NhcHMpOworCit2b2lkIGdzdF92NGwyX3ZwOV9lbmNfcmVnaXN0ZXIgKEdzdFBsdWdpbiAqIHBsdWdpbiwgY29uc3QgZ2NoYXIgKiBiYXNlbmFtZSwKKyAgICBjb25zdCBnY2hhciAqIGRldmljZV9wYXRoLCBHc3RDYXBzICogc2lua19jYXBzLCBHc3RDYXBzICogc3JjX2NhcHMpOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1Y0TDJfVlA5X0VOQ19IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy92NGwyL21lc29uLmJ1aWxkIGIvc3lzL3Y0bDIvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNlY2MwMgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsNTQgQEAKK3Y0bDJfc291cmNlcyA9IFsKKyAgJ2dzdHY0bDIuYycsCisgICdnc3R2NGwyYWxsb2NhdG9yLmMnLAorICAnZ3N0djRsMmNvbG9yYmFsYW5jZS5jJywKKyAgJ2dzdHY0bDJkZXZpY2Vwcm92aWRlci5jJywKKyAgJ2dzdHY0bDJvYmplY3QuYycsCisgICdnc3R2NGwyYnVmZmVycG9vbC5jJywKKyAgJ2dzdHY0bDJzaW5rLmMnLAorICAnZ3N0djRsMnNyYy5jJywKKyAgJ2dzdHY0bDJyYWRpby5jJywKKyAgJ2dzdHY0bDJ0dW5lci5jJywKKyAgJ2dzdHY0bDJ0cmFuc2Zvcm0uYycsCisgICdnc3R2NGwydmlkZW9kZWMuYycsCisgICdnc3R2NGwydmlkZW9lbmMuYycsCisgICdnc3R2NGwyaDI2M2VuYy5jJywKKyAgJ2dzdHY0bDJoMjY0ZW5jLmMnLAorICAnZ3N0djRsMm1wZWc0ZW5jLmMnLAorICAnZ3N0djRsMnZpZG9yaWVudC5jJywKKyAgJ2dzdHY0bDJ2cDhlbmMuYycsCisgICdnc3R2NGwydnA5ZW5jLmMnLAorICAndjRsMl9jYWxscy5jJywKKyAgJ3Y0bDItdXRpbHMuYycsCisgICd0dW5lci5jJywKKyAgJ3R1bmVyY2hhbm5lbC5jJywKKyAgJ3R1bmVybm9ybS5jJworXQorCitjZGF0YS5zZXQoJ0dTVF9WNEwyX0VOQUJMRV9QUk9CRScsIGdldF9vcHRpb24oJ3Y0bDItcHJvYmUnKSkKKworaWYgY2MuaGFzX2hlYWRlcignbGludXgvdmlkZW9kZXYyLmgnKSBvciBjYy5oYXNfaGVhZGVyKCdzeXMvdmlkZW9kZXYyLmgnKSBvciBjYy5oYXNfaGVhZGVyKCdzeXMvdmlkZW9pby5oJykKKyAgbWVzc2FnZSgnYnVpbGRpbmcgdjRsMiBwbHVnaW4nKQorICBjZGF0YS5zZXQoJ0hBVkVfR1NUX1Y0TDInLCB0cnVlKQorICBndWRldl9kZXAgPSBkZXBlbmRlbmN5KCdndWRldi0xLjAnLCB2ZXJzaW9uIDogJz49MTQ3JywgcmVxdWlyZWQgOiBmYWxzZSkKKyAgY2RhdGEuc2V0KCdIQVZFX0dVREVWJywgZ3VkZXZfZGVwLmZvdW5kKCkpCisKKyAgIyBsaWJ2NGwyIGlzIG9ubHkgbmVlZGVkIGZvciBjb252ZXJ0aW5nIHNvbWUgb2JzY3VyZSBmb3JtYXRzCisgICMgRklYTUU6IEFkZCBhIGZ1bGwgbGlzdCBvZiB0aGUgZm9ybWF0cyBoZXJlCisgIGlmIGdldF9vcHRpb24oJ3dpdGgtbGlidjRsMicpCisgICAgbGlidjRsMl9kZXAgPSBkZXBlbmRlbmN5KCdsaWJ2NGwyJywgcmVxdWlyZWQgOiBmYWxzZSkKKyAgICBjZGF0YS5zZXQoJ0hBVkVfTElCVjRMMicsIGxpYnY0bDJfZGVwLmZvdW5kKCkpCisgICAgbGlidjRsMl9kZXBzID0gW2xpYnY0bDJfZGVwXQorICBlbHNlCisgICAgbGlidjRsMl9kZXBzID0gW10KKyAgZW5kaWYKKworICBnc3R2NGwyID0gbGlicmFyeSgnZ3N0dmlkZW80bGludXgyJywKKyAgICB2NGwyX3NvdXJjZXMsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgICBkZXBlbmRlbmNpZXMgOiBbZ3N0YmFzZV9kZXAsIGdzdHZpZGVvX2RlcCwgZ3N0YWxsb2NhdG9yc19kZXAsIGd1ZGV2X2RlcF0gKyBsaWJ2NGwyX2RlcHMsCisgICAgaW5zdGFsbCA6IHRydWUsCisgICAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorICApCitlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvdHVuZXIuYyBiL3N5cy92NGwyL3R1bmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiM2ZlOQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL3R1bmVyLmMKQEAgLTAsMCArMSw1NTEgQEAKKy8qIEdTdHJlYW1lciBUdW5lcgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqCisgKiB0dW5lci5jOiB0dW5lciBkZXNpZ24gdmlydHVhbCBjbGFzcyBmdW5jdGlvbiB3cmFwcGVycworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInR1bmVyLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoqCisgKiBTRUNUSU9OOmdzdHR1bmVyCisgKiBAc2hvcnRfZGVzY3JpcHRpb246IEludGVyZmFjZSBmb3IgZWxlbWVudHMgcHJvdmlkaW5nIHR1bmVyIG9wZXJhdGlvbnMKKyAqIAorICogPHJlZnNlY3QyPgorICogPHBhcmE+CisgKiBUaGUgR3N0VHVuZXIgaW50ZXJmYWNlIGlzIHByb3ZpZGVkIGJ5IGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgYWJpbGl0eSB0bworICogdHVuZSBpbnRvIG11bHRpcGxlIGlucHV0IHNpZ25hbHMsIGZvciBleGFtcGxlIFRWIG9yIHJhZGlvIGNhcHR1cmUgY2FyZHMuCisgKiA8L3BhcmE+PHBhcmE+CisgKiBUaGUgaW50ZXJwcmV0YXRpb24gb2YgJ3R1bmluZyBpbnRvJyBhbiBpbnB1dCBzdHJlYW0gZGVwZW5kcyBvbiB0aGUgZWxlbWVudAorICogaW1wbGVtZW50aW5nIHRoZSBpbnRlcmZhY2UuIEZvciB2NGxzcmMsIGl0IG1pZ2h0IGltcGx5IHNlbGVjdGlvbiBvZiBhbgorICogaW5wdXQgc291cmNlIGFuZC9vciBmcmVxdWVuY3kgdG8gYmUgY29uZmlndXJlZCBvbiBhIFRWIGNhcmQuIEFub3RoZXIgCisgKiBHc3RUdW5lciBpbXBsZW1lbnRhdGlvbiBtaWdodCBiZSB0byBhbGxvdyBzZWxlY3Rpb24gb2YgYW4gYWN0aXZlIGlucHV0IHBhZAorICogZnJvbSBtdWx0aXBsZSBpbnB1dCBwYWRzLgorICogPC9wYXJhPjxwYXJhPgorICogVGhhdCBzYWlkLCB0aGUgR3N0VHVuZXIgaW50ZXJmYWNlIGZ1bmN0aW9ucyBhcmUgYmlhc2VkIHRvd2FyZCB0aGUKKyAqIFRWIGNhcHR1cmUgc2NlbmFyaW8uCisgKiA8L3BhcmE+PHBhcmE+CisgKiBUaGUgZ2VuZXJhbCBwYXJhbWV0ZXJzIHByb3ZpZGVkIGFyZSBmb3IgY29uZmlndXJhdGlvbiBhcmU6CisgKiA8aXRlbWl6ZWRsaXN0PgorICogPGxpc3RpdGVtPlNlbGVjdGlvbiBvZiBhIGN1cnJlbnQgI0dzdFR1bmVyQ2hhbm5lbC4gVGhlIGN1cnJlbnQgY2hhbm5lbAorICogcmVwcmVzZW50cyB0aGUgaW5wdXQgc291cmNlIChlLmcuIENvbXBvc2l0ZSwgUy1WaWRlbyBldGMgZm9yIFRWIGNhcHR1cmUpLgorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT5UaGUgI0dzdFR1bmVyTm9ybSBmb3IgdGhlIGNoYW5uZWwuIFRoZSBub3JtIGNob29zZXMgdGhlCisgKiBpbnRlcnByZXRhdGlvbiBvZiB0aGUgaW5jb21pbmcgc2lnbmFsIGZvciB0aGUgY3VycmVudCBjaGFubmVsLiBGb3IgZXhhbXBsZSwKKyAqIFBBTCBvciBOVFNDLCBvciBtb3JlIHNwZWNpZmljIHZhcmlhbnRzIHRoZXJlLW9mLgorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT5DaGFubmVsIGZyZXF1ZW5jeS4gSWYgdGhlIGN1cnJlbnQgY2hhbm5lbCBoYXMgdGhlIGFiaWxpdHkgdG8gdHVuZQorICogYmV0d2VlbiBtdWx0aXBsZSBmcmVxdWVuY2llcyAoaWYgaXQgaGFzIHRoZSBHU1RfVFVORVJfQ0hBTk5FTF9GUkVRVUVOQ1kgZmxhZykKKyAqIHRoZW4gdGhlIGZyZXF1ZW5jeSBjYW4gYmUgY2hhbmdlZC9yZXRyaWV2ZWQgdmlhIHRoZQorICogZ3N0X3R1bmVyX3NldF9mcmVxdWVuY3koKSBhbmQgZ3N0X3R1bmVyX2dldF9mcmVxdWVuY3koKSBtZXRob2RzLgorICogPC9saXN0aXRlbT4KKyAqIDwvaXRlbWl6ZWRsaXN0PgorICogPC9wYXJhPgorICogPHBhcmE+CisgKiBXaGVyZSBhcHBsaWNhYmxlLCB0aGUgc2lnbmFsIHN0cmVuZ3RoIGNhbiBiZSByZXRyaWV2ZWQgYW5kL29yIG1vbml0b3JlZAorICogdmlhIGEgc2lnbmFsLgorICogPC9wYXJhPgorICogPC9yZWZzZWN0Mj4KKyAqLworCisvKiBGSVhNRSAwLjExOiBjaGVjayBpZiB3ZSBuZWVkIHRvIGFkZCBBUEkgZm9yIHNvbWV0aW1lcy1zdXBwb3J0ZWRuZXNzCisgKiAoYWthIG1ha2luZyB1cCBmb3IgR3N0SW1wbGVtZW50c0ludGVyZmFjZSByZW1vdmFsKSAqLworCisvKiBGSVhNRSAwLjExOiByZXBsYWNlIHNpZ25hbHMgd2l0aCBtZXNzYWdlcyAoKyBtYWtlIEFQSSB0aHJlYWQtc2FmZSkgKi8KKworZW51bQoreworICBOT1JNX0NIQU5HRUQsCisgIENIQU5ORUxfQ0hBTkdFRCwKKyAgRlJFUVVFTkNZX0NIQU5HRUQsCisgIFNJR05BTF9DSEFOR0VELAorICBMQVNUX1NJR05BTAorfTsKKworc3RhdGljIGd1aW50IGdzdF90dW5lcl9zaWduYWxzW0xBU1RfU0lHTkFMXSA9IHsgMCB9OworCitHX0RFRklORV9JTlRFUkZBQ0UgKEdzdFR1bmVyLCBnc3RfdHVuZXIsIEdfVFlQRV9JTlZBTElEKTsKKworc3RhdGljIHZvaWQKK2dzdF90dW5lcl9kZWZhdWx0X2luaXQgKEdzdFR1bmVySW50ZXJmYWNlICogaWZhY2UpCit7CisgIHN0YXRpYyBnYm9vbGVhbiBpbml0aWFsaXplZCA9IEZBTFNFOworCisgIGlmICghaW5pdGlhbGl6ZWQpIHsKKyAgICAvKioKKyAgICAgKiBHc3RUdW5lcjo6bm9ybS1jaGFuZ2VkOgorICAgICAqIEB0dW5lcjogVGhlIGVsZW1lbnQgcHJvdmlkaW5nIHRoZSBHc3RUdW5lciBpbnRlcmZhY2UKKyAgICAgKiBAbm9ybTogVGhlIG5ldyBjb25maWd1cmVkIG5vcm0uCisgICAgICoKKyAgICAgKiBSZXBvcnRzIHRoYXQgdGhlIGN1cnJlbnQgI0dzdFR1bmVyTm9ybSBoYXMgY2hhbmdlZC4KKyAgICAgKi8KKyAgICBnc3RfdHVuZXJfc2lnbmFsc1tOT1JNX0NIQU5HRURdID0KKyAgICAgICAgZ19zaWduYWxfbmV3ICgibm9ybS1jaGFuZ2VkIiwKKyAgICAgICAgR1NUX1RZUEVfVFVORVIsIEdfU0lHTkFMX1JVTl9MQVNULAorICAgICAgICBHX1NUUlVDVF9PRkZTRVQgKEdzdFR1bmVySW50ZXJmYWNlLCBub3JtX2NoYW5nZWQpLAorICAgICAgICBOVUxMLCBOVUxMLAorICAgICAgICBnX2NjbG9zdXJlX21hcnNoYWxfVk9JRF9fT0JKRUNULCBHX1RZUEVfTk9ORSwgMSwgR1NUX1RZUEVfVFVORVJfTk9STSk7CisgICAgLyoqCisgICAgICogR3N0VHVuZXI6OmNoYW5uZWwtY2hhbmdlZDoKKyAgICAgKiBAdHVuZXI6IFRoZSBlbGVtZW50IHByb3ZpZGluZyB0aGUgR3N0VHVuZXIgaW50ZXJmYWNlCisgICAgICogQGNoYW5uZWw6IFRoZSBuZXcgY29uZmlndXJlZCBjaGFubmVsLgorICAgICAqCisgICAgICogUmVwb3J0cyB0aGF0IHRoZSBjdXJyZW50ICNHc3RUdW5lckNoYW5uZWwgaGFzIGNoYW5nZWQuCisgICAgICovCisgICAgZ3N0X3R1bmVyX3NpZ25hbHNbQ0hBTk5FTF9DSEFOR0VEXSA9CisgICAgICAgIGdfc2lnbmFsX25ldyAoImNoYW5uZWwtY2hhbmdlZCIsCisgICAgICAgIEdTVF9UWVBFX1RVTkVSLCBHX1NJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgR19TVFJVQ1RfT0ZGU0VUIChHc3RUdW5lckludGVyZmFjZSwgY2hhbm5lbF9jaGFuZ2VkKSwKKyAgICAgICAgTlVMTCwgTlVMTCwKKyAgICAgICAgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX09CSkVDVCwgR19UWVBFX05PTkUsIDEsCisgICAgICAgIEdTVF9UWVBFX1RVTkVSX0NIQU5ORUwpOworICAgIC8qKgorICAgICAqIEdzdFR1bmVyOjpmcmVxdWVuY3ktY2hhbmdlZDoKKyAgICAgKiBAdHVuZXI6IFRoZSBlbGVtZW50IHByb3ZpZGluZyB0aGUgR3N0VHVuZXIgaW50ZXJmYWNlCisgICAgICogQGZyZXF1ZW5jeTogVGhlIG5ldyBmcmVxdWVuY3kgKGFuIHVuc2lnbmVkIGxvbmcpCisgICAgICoKKyAgICAgKiBSZXBvcnRzIHRoYXQgdGhlIGN1cnJlbnQgZnJlcXVlbmN5IGhhcyBjaGFuZ2VkLgorICAgICAqLworICAgIGdzdF90dW5lcl9zaWduYWxzW0ZSRVFVRU5DWV9DSEFOR0VEXSA9CisgICAgICAgIGdfc2lnbmFsX25ldyAoImZyZXF1ZW5jeS1jaGFuZ2VkIiwKKyAgICAgICAgR1NUX1RZUEVfVFVORVIsIEdfU0lHTkFMX1JVTl9MQVNULAorICAgICAgICBHX1NUUlVDVF9PRkZTRVQgKEdzdFR1bmVySW50ZXJmYWNlLCBmcmVxdWVuY3lfY2hhbmdlZCksCisgICAgICAgIE5VTEwsIE5VTEwsCisgICAgICAgIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMiwgR1NUX1RZUEVfVFVORVJfQ0hBTk5FTCwKKyAgICAgICAgR19UWVBFX1VMT05HKTsKKyAgICAvKioKKyAgICAgKiBHc3RUdW5lcjo6c2lnbmFsLWNoYW5nZWQ6CisgICAgICogQHR1bmVyOiBUaGUgZWxlbWVudCBwcm92aWRpbmcgdGhlIEdzdFR1bmVyIGludGVyZmFjZQorICAgICAqIEBjaGFubmVsOiBUaGUgY3VycmVudCAjR3N0VHVuZXJDaGFubmVsCisgICAgICogQHNpZ25hbDogVGhlIG5ldyBzaWduYWwgc3RyZW5ndGggKGFuIGludGVnZXIpCisgICAgICoKKyAgICAgKiBSZXBvcnRzIHRoYXQgdGhlIHNpZ25hbCBzdHJlbmd0aCBoYXMgY2hhbmdlZC4KKyAgICAgKgorICAgICAqIFNlZSBBbHNvOiBnc3RfdHVuZXJfc2lnbmFsX3N0cmVuZ3RoKCkKKyAgICAgKi8KKyAgICBnc3RfdHVuZXJfc2lnbmFsc1tTSUdOQUxfQ0hBTkdFRF0gPQorICAgICAgICBnX3NpZ25hbF9uZXcgKCJzaWduYWwtY2hhbmdlZCIsCisgICAgICAgIEdTVF9UWVBFX1RVTkVSLCBHX1NJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgR19TVFJVQ1RfT0ZGU0VUIChHc3RUdW5lckludGVyZmFjZSwgc2lnbmFsX2NoYW5nZWQpLAorICAgICAgICBOVUxMLCBOVUxMLAorICAgICAgICBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR19UWVBFX05PTkUsIDIsIEdTVF9UWVBFX1RVTkVSX0NIQU5ORUwsCisgICAgICAgIEdfVFlQRV9JTlQpOworCisgICAgaW5pdGlhbGl6ZWQgPSBUUlVFOworICB9CisKKyAgLyogZGVmYXVsdCB2aXJ0dWFsIGZ1bmN0aW9ucyAqLworICBpZmFjZS0+bGlzdF9jaGFubmVscyA9IE5VTEw7CisgIGlmYWNlLT5zZXRfY2hhbm5lbCA9IE5VTEw7CisgIGlmYWNlLT5nZXRfY2hhbm5lbCA9IE5VTEw7CisKKyAgaWZhY2UtPmxpc3Rfbm9ybXMgPSBOVUxMOworICBpZmFjZS0+c2V0X25vcm0gPSBOVUxMOworICBpZmFjZS0+Z2V0X25vcm0gPSBOVUxMOworCisgIGlmYWNlLT5zZXRfZnJlcXVlbmN5ID0gTlVMTDsKKyAgaWZhY2UtPmdldF9mcmVxdWVuY3kgPSBOVUxMOworICBpZmFjZS0+c2lnbmFsX3N0cmVuZ3RoID0gTlVMTDsKK30KKworLyoqCisgKiBnc3RfdHVuZXJfbGlzdF9jaGFubmVsczoKKyAqIEB0dW5lcjogdGhlICNHc3RUdW5lciAoYSAjR3N0RWxlbWVudCkgdG8gZ2V0IHRoZSBjaGFubmVscyBmcm9tLgorICoKKyAqIFJldHJpZXZlIGEgI0dMaXN0IG9mICNHc3RUdW5lckNoYW5uZWxzIGF2YWlsYWJsZQorICogKGUuZy4gJ2NvbXBvc2l0ZScsICdzLXZpZGVvJywgLi4uKSBmcm9tIHRoZSBnaXZlbiB0dW5lciBvYmplY3QuCisgKgorICogUmV0dXJuczogQSBsaXN0IG9mIGNoYW5uZWxzIGF2YWlsYWJsZSBvbiB0aGlzIHR1bmVyLiBUaGUgbGlzdCBpcworICogICAgICAgICAgb3duZWQgYnkgdGhlIEdzdFR1bmVyIGFuZCBtdXN0IG5vdCBiZSBmcmVlZC4KKyAqLworY29uc3QgR0xpc3QgKgorZ3N0X3R1bmVyX2xpc3RfY2hhbm5lbHMgKEdzdFR1bmVyICogdHVuZXIpCit7CisgIEdzdFR1bmVySW50ZXJmYWNlICppZmFjZTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX1RVTkVSICh0dW5lciksIE5VTEwpOworCisgIGlmYWNlID0gR1NUX1RVTkVSX0dFVF9JTlRFUkZBQ0UgKHR1bmVyKTsKKyAgaWYgKGlmYWNlLT5saXN0X2NoYW5uZWxzKSB7CisgICAgcmV0dXJuIGlmYWNlLT5saXN0X2NoYW5uZWxzICh0dW5lcik7CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBnc3RfdHVuZXJfc2V0X2NoYW5uZWw6CisgKiBAdHVuZXI6IHRoZSAjR3N0VHVuZXIgKGEgI0dzdEVsZW1lbnQpIHRoYXQgb3ducyB0aGUgY2hhbm5lbC4KKyAqIEBjaGFubmVsOiB0aGUgY2hhbm5lbCB0byB0dW5lIHRvLgorICoKKyAqIFR1bmVzIHRoZSBvYmplY3QgdG8gdGhlIGdpdmVuIGNoYW5uZWwsIHdoaWNoIHNob3VsZCBiZSBvbmUgb2YgdGhlCisgKiBjaGFubmVscyByZXR1cm5lZCBieSBnc3RfdHVuZXJfbGlzdF9jaGFubmVscygpLgorICovCisKK3ZvaWQKK2dzdF90dW5lcl9zZXRfY2hhbm5lbCAoR3N0VHVuZXIgKiB0dW5lciwgR3N0VHVuZXJDaGFubmVsICogY2hhbm5lbCkKK3sKKyAgR3N0VHVuZXJJbnRlcmZhY2UgKmlmYWNlOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19UVU5FUiAodHVuZXIpKTsKKworICBpZmFjZSA9IEdTVF9UVU5FUl9HRVRfSU5URVJGQUNFICh0dW5lcik7CisgIGlmIChpZmFjZS0+c2V0X2NoYW5uZWwpIHsKKyAgICBpZmFjZS0+c2V0X2NoYW5uZWwgKHR1bmVyLCBjaGFubmVsKTsKKyAgfQorfQorCisvKioKKyAqIGdzdF90dW5lcl9nZXRfY2hhbm5lbDoKKyAqIEB0dW5lcjogdGhlICNHc3RUdW5lciAoYSAjR3N0RWxlbWVudCkgdG8gZ2V0IHRoZSBjdXJyZW50IGNoYW5uZWwgZnJvbS4KKyAqCisgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBjaGFubmVsIGZyb20gdGhlIHR1bmVyLgorICoKKyAqIFJldHVybnM6IHRoZSBjdXJyZW50IGNoYW5uZWwgb2YgdGhlIHR1bmVyIG9iamVjdC4KKyAqLworCitHc3RUdW5lckNoYW5uZWwgKgorZ3N0X3R1bmVyX2dldF9jaGFubmVsIChHc3RUdW5lciAqIHR1bmVyKQoreworICBHc3RUdW5lckludGVyZmFjZSAqaWZhY2U7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9JU19UVU5FUiAodHVuZXIpLCBOVUxMKTsKKworICBpZmFjZSA9IEdTVF9UVU5FUl9HRVRfSU5URVJGQUNFICh0dW5lcik7CisgIGlmIChpZmFjZS0+Z2V0X2NoYW5uZWwpIHsKKyAgICByZXR1cm4gaWZhY2UtPmdldF9jaGFubmVsICh0dW5lcik7CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBnc3RfdHVuZXJfbGlzdF9ub3JtczoKKyAqIEB0dW5lcjogdGhlICNHc3RUdW5lciAoKmEgI0dzdEVsZW1lbnQpIHRvIGdldCB0aGUgbGlzdCBvZiBub3JtcyBmcm9tLgorICoKKyAqIFJldHJpZXZlIGEgR0xpc3Qgb2YgYXZhaWxhYmxlICNHc3RUdW5lck5vcm0gc2V0dGluZ3MgZm9yIHRoZSBjdXJyZW50bHkKKyAqIHR1bmVkIGNoYW5uZWwgb24gdGhlIGdpdmVuIHR1bmVyIG9iamVjdC4KKyAqCisgKiBSZXR1cm5zOiBBIGxpc3Qgb2Ygbm9ybXMgYXZhaWxhYmxlIG9uIHRoZSBjdXJyZW50IGNoYW5uZWwgZm9yIHRoaXMKKyAqICAgICAgICAgIHR1bmVyIG9iamVjdC4gVGhlIGxpc3QgaXMgb3duZWQgYnkgdGhlIEdzdFR1bmVyIGFuZCBtdXN0IG5vdAorICogICAgICAgICAgYmUgZnJlZWQuCisgKi8KKworY29uc3QgR0xpc3QgKgorZ3N0X3R1bmVyX2xpc3Rfbm9ybXMgKEdzdFR1bmVyICogdHVuZXIpCit7CisgIEdzdFR1bmVySW50ZXJmYWNlICppZmFjZTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX1RVTkVSICh0dW5lciksIE5VTEwpOworCisgIGlmYWNlID0gR1NUX1RVTkVSX0dFVF9JTlRFUkZBQ0UgKHR1bmVyKTsKKyAgaWYgKGlmYWNlLT5saXN0X25vcm1zKSB7CisgICAgcmV0dXJuIGlmYWNlLT5saXN0X25vcm1zICh0dW5lcik7CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBnc3RfdHVuZXJfc2V0X25vcm06CisgKiBAdHVuZXI6IHRoZSAjR3N0VHVuZXIgKGEgI0dzdEVsZW1lbnQpIHRvIHNldCB0aGUgbm9ybSBvbi4KKyAqIEBub3JtOiB0aGUgbm9ybSB0byB1c2UgZm9yIHRoZSBjdXJyZW50IGNoYW5uZWwuCisgKgorICogQ2hhbmdlcyB0aGUgdmlkZW8gbm9ybSBvbiB0aGlzIHR1bmVyIHRvIHRoZSBnaXZlbiBub3JtLCB3aGljaCBzaG91bGQgYmUKKyAqIG9uZSBvZiB0aGUgbm9ybXMgcmV0dXJuZWQgYnkgZ3N0X3R1bmVyX2xpc3Rfbm9ybXMoKS4KKyAqLworCit2b2lkCitnc3RfdHVuZXJfc2V0X25vcm0gKEdzdFR1bmVyICogdHVuZXIsIEdzdFR1bmVyTm9ybSAqIG5vcm0pCit7CisgIEdzdFR1bmVySW50ZXJmYWNlICppZmFjZTsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfVFVORVIgKHR1bmVyKSk7CisKKyAgaWZhY2UgPSBHU1RfVFVORVJfR0VUX0lOVEVSRkFDRSAodHVuZXIpOworICBpZiAoaWZhY2UtPnNldF9ub3JtKSB7CisgICAgaWZhY2UtPnNldF9ub3JtICh0dW5lciwgbm9ybSk7CisgIH0KK30KKworLyoqCisgKiBnc3RfdHVuZXJfZ2V0X25vcm06CisgKiBAdHVuZXI6IHRoZSAjR3N0VHVuZXIgKGEgI0dzdEVsZW1lbnQpIHRvIGdldCB0aGUgY3VycmVudCBub3JtIGZyb20uCisgKgorICogR2V0IHRoZSBjdXJyZW50IHZpZGVvIG5vcm0gZnJvbSB0aGUgZ2l2ZW4gdHVuZXIgb2JqZWN0IGZvciB0aGUKKyAqIGN1cnJlbnRseSBzZWxlY3RlZCBjaGFubmVsLgorICoKKyAqIFJldHVybnM6IHRoZSBjdXJyZW50IG5vcm0uCisgKi8KKworR3N0VHVuZXJOb3JtICoKK2dzdF90dW5lcl9nZXRfbm9ybSAoR3N0VHVuZXIgKiB0dW5lcikKK3sKKyAgR3N0VHVuZXJJbnRlcmZhY2UgKmlmYWNlOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfVFVORVIgKHR1bmVyKSwgTlVMTCk7CisKKyAgaWZhY2UgPSBHU1RfVFVORVJfR0VUX0lOVEVSRkFDRSAodHVuZXIpOworICBpZiAoaWZhY2UtPmdldF9ub3JtKSB7CisgICAgcmV0dXJuIGlmYWNlLT5nZXRfbm9ybSAodHVuZXIpOworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogZ3N0X3R1bmVyX3NldF9mcmVxdWVuY3k6CisgKiBAdHVuZXI6IFRoZSAjR3N0VHVuZXIgKGEgI0dzdEVsZW1lbnQpIHRoYXQgb3ducyB0aGUgZ2l2ZW4gY2hhbm5lbC4KKyAqIEBjaGFubmVsOiBUaGUgI0dzdFR1bmVyQ2hhbm5lbCB0byBzZXQgdGhlIGZyZXF1ZW5jeSBvbi4KKyAqIEBmcmVxdWVuY3k6IFRoZSBmcmVxdWVuY3kgdG8gdHVuZSBpbiB0by4KKyAqCisgKiBTZXRzIGEgdHVuaW5nIGZyZXF1ZW5jeSBvbiB0aGUgZ2l2ZW4gdHVuZXIvY2hhbm5lbC4gTm90ZSB0aGF0IHRoaXMKKyAqIHJlcXVpcmVzIHRoZSBnaXZlbiBjaGFubmVsIHRvIGJlIGEgInR1bmluZyIgY2hhbm5lbCwgd2hpY2ggY2FuIGJlCisgKiBjaGVja2VkIHVzaW5nIEdTVF9UVU5FUl9DSEFOTkVMX0hBU19GTEFHICgpLCB3aXRoIHRoZSBwcm9wZXIgZmxhZworICogYmVpbmcgR1NUX1RVTkVSX0NIQU5ORUxfRlJFUVVFTkNZLgorICoKKyAqIFRoZSBmcmVxdWVuY3kgaXMgaW4gSHosIHdpdGggbWluaW11bSBzdGVwcyBpbmRpY2F0ZWQgYnkgdGhlIAorICogZnJlcXVlbmN5X211bHRpcGxpY2F0b3IgcHJvdmlkZWQgaW4gdGhlICNHc3RUdW5lckNoYW5uZWwuIFRoZQorICogdmFsaWQgcmFuZ2UgaXMgcHJvdmlkZWQgaW4gdGhlIG1pbl9mcmVxdWVuY3kgYW5kIG1heF9mcmVxdWVuY3kgcHJvcGVydGllcworICogb2YgdGhlICNHc3RUdW5lckNoYW5uZWwuCisgKi8KKwordm9pZAorZ3N0X3R1bmVyX3NldF9mcmVxdWVuY3kgKEdzdFR1bmVyICogdHVuZXIsCisgICAgR3N0VHVuZXJDaGFubmVsICogY2hhbm5lbCwgZ3Vsb25nIGZyZXF1ZW5jeSkKK3sKKyAgR3N0VHVuZXJJbnRlcmZhY2UgKmlmYWNlOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19UVU5FUiAodHVuZXIpKTsKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1RVTkVSX0NIQU5ORUwgKGNoYW5uZWwpKTsKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX1RVTkVSX0NIQU5ORUxfSEFTX0ZMQUcgKGNoYW5uZWwsCisgICAgICAgICAgR1NUX1RVTkVSX0NIQU5ORUxfRlJFUVVFTkNZKSk7CisKKyAgaWZhY2UgPSBHU1RfVFVORVJfR0VUX0lOVEVSRkFDRSAodHVuZXIpOworICBpZiAoaWZhY2UtPnNldF9mcmVxdWVuY3kpIHsKKyAgICBpZmFjZS0+c2V0X2ZyZXF1ZW5jeSAodHVuZXIsIGNoYW5uZWwsIGZyZXF1ZW5jeSk7CisgIH0KK30KKworLyoqCisgKiBnc3RfdHVuZXJfZ2V0X2ZyZXF1ZW5jeToKKyAqIEB0dW5lcjogVGhlICNHc3RUdW5lciAoYSAjR3N0RWxlbWVudCkgdGhhdCBvd25zIHRoZSBnaXZlbiBjaGFubmVsLgorICogQGNoYW5uZWw6IFRoZSAjR3N0VHVuZXJDaGFubmVsIHRvIHJldHJpZXZlIHRoZSBmcmVxdWVuY3kgZnJvbS4KKyAqCisgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBmcmVxdWVuY3kgZnJvbSB0aGUgZ2l2ZW4gY2hhbm5lbC4gQXMgZm9yCisgKiBnc3RfdHVuZXJfc2V0X2ZyZXF1ZW5jeSgpLCB0aGUgI0dzdFR1bmVyQ2hhbm5lbCBtdXN0IHN1cHBvcnQgZnJlcXVlbmN5CisgKiBvcGVyYXRpb25zLCBhcyBpbmRpY2F0ZWQgYnkgdGhlIEdTVF9UVU5FUl9DSEFOTkVMX0ZSRVFVRU5DWSBmbGFnLgorICoKKyAqIFJldHVybnM6IFRoZSBjdXJyZW50IGZyZXF1ZW5jeSwgb3IgMCBvbiBlcnJvci4KKyAqLworCitndWxvbmcKK2dzdF90dW5lcl9nZXRfZnJlcXVlbmN5IChHc3RUdW5lciAqIHR1bmVyLCBHc3RUdW5lckNoYW5uZWwgKiBjaGFubmVsKQoreworICBHc3RUdW5lckludGVyZmFjZSAqaWZhY2U7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9JU19UVU5FUiAodHVuZXIpLCAwKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9JU19UVU5FUl9DSEFOTkVMIChjaGFubmVsKSwgMCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfVFVORVJfQ0hBTk5FTF9IQVNfRkxBRyAoY2hhbm5lbCwKKyAgICAgICAgICBHU1RfVFVORVJfQ0hBTk5FTF9GUkVRVUVOQ1kpLCAwKTsKKworICBpZmFjZSA9IEdTVF9UVU5FUl9HRVRfSU5URVJGQUNFICh0dW5lcik7CisKKyAgaWYgKGlmYWNlLT5nZXRfZnJlcXVlbmN5KSB7CisgICAgcmV0dXJuIGlmYWNlLT5nZXRfZnJlcXVlbmN5ICh0dW5lciwgY2hhbm5lbCk7CisgIH0KKworICByZXR1cm4gMDsKK30KKworLyoqCisgKiBnc3RfdHVuZXJfc2lnbmFsX3N0cmVuZ3RoOgorICogQHR1bmVyOiB0aGUgI0dzdFR1bmVyIChhICNHc3RFbGVtZW50KSB0aGF0IG93bnMgdGhlIGdpdmVuIGNoYW5uZWwuCisgKiBAY2hhbm5lbDogdGhlICNHc3RUdW5lckNoYW5uZWwgdG8gZ2V0IHRoZSBzaWduYWwgc3RyZW5ndGggZnJvbS4KKyAqCisgKiBHZXQgdGhlIHN0cmVuZ3RoIG9mIHRoZSBzaWduYWwgb24gdGhpcyBjaGFubmVsLiBOb3RlIHRoYXQgdGhpcworICogcmVxdWlyZXMgdGhlIGN1cnJlbnQgY2hhbm5lbCB0byBiZSBhICJ0dW5pbmciIGNoYW5uZWwsIGkuZS4gYQorICogY2hhbm5lbCBvbiB3aGljaCBmcmVxdWVuY3kgY2FuIGJlIHNldC4gVGhpcyBjYW4gYmUgY2hlY2tlZCB1c2luZworICogR1NUX1RVTkVSX0NIQU5ORUxfSEFTX0ZMQUcgKCksIGFuZCB0aGUgYXBwcm9wcmlhdGUgZmxhZyB0byBjaGVjaworICogZm9yIGlzIEdTVF9UVU5FUl9DSEFOTkVMX0ZSRVFVRU5DWS4KKyAqCisgKiBUaGUgdmFsaWQgcmFuZ2Ugb2YgdGhlIHNpZ25hbCBzdHJlbmd0aCBpcyBpbmRpY2F0ZWQgaW4gdGhlIAorICogbWluX3NpZ25hbCBhbmQgbWF4X3NpZ25hbCBwcm9wZXJ0aWVzIG9mIHRoZSAjR3N0VHVuZXJDaGFubmVsLgorICoKKyAqIFJldHVybnM6IFNpZ25hbCBzdHJlbmd0aCwgb3IgMCBvbiBlcnJvci4KKyAqLworZ2ludAorZ3N0X3R1bmVyX3NpZ25hbF9zdHJlbmd0aCAoR3N0VHVuZXIgKiB0dW5lciwgR3N0VHVuZXJDaGFubmVsICogY2hhbm5lbCkKK3sKKyAgR3N0VHVuZXJJbnRlcmZhY2UgKmlmYWNlOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfVFVORVIgKHR1bmVyKSwgMCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfVFVORVJfQ0hBTk5FTCAoY2hhbm5lbCksIDApOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX1RVTkVSX0NIQU5ORUxfSEFTX0ZMQUcgKGNoYW5uZWwsCisgICAgICAgICAgR1NUX1RVTkVSX0NIQU5ORUxfRlJFUVVFTkNZKSwgMCk7CisKKyAgaWZhY2UgPSBHU1RfVFVORVJfR0VUX0lOVEVSRkFDRSAodHVuZXIpOworICBpZiAoaWZhY2UtPnNpZ25hbF9zdHJlbmd0aCkgeworICAgIHJldHVybiBpZmFjZS0+c2lnbmFsX3N0cmVuZ3RoICh0dW5lciwgY2hhbm5lbCk7CisgIH0KKworICByZXR1cm4gMDsKK30KKworLyoqCisgKiBnc3RfdHVuZXJfZmluZF9ub3JtX2J5X25hbWU6CisgKiBAdHVuZXI6IEEgI0dzdFR1bmVyIGluc3RhbmNlCisgKiBAbm9ybTogQSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiBhICNHc3RUdW5lck5vcm0KKyAqIAorICogTG9vayB1cCBhICNHc3RUdW5lck5vcm0gYnkgbmFtZS4KKyAqCisgKiBSZXR1cm5zOiBBICNHc3RUdW5lck5vcm0sIG9yIE5VTEwgaWYgbm8gbm9ybSB3aXRoIHRoZSBwcm92aWRlZCBuYW1lCisgKiBpcyBhdmFpbGFibGUuCisgKi8KK0dzdFR1bmVyTm9ybSAqCitnc3RfdHVuZXJfZmluZF9ub3JtX2J5X25hbWUgKEdzdFR1bmVyICogdHVuZXIsIGdjaGFyICogbm9ybSkKK3sKKyAgR0xpc3QgKndhbGs7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9JU19UVU5FUiAodHVuZXIpLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKG5vcm0gIT0gTlVMTCwgTlVMTCk7CisKKyAgd2FsayA9IChHTGlzdCAqKSBnc3RfdHVuZXJfbGlzdF9ub3JtcyAodHVuZXIpOworICB3aGlsZSAod2FsaykgeworICAgIGlmIChzdHJjbXAgKEdTVF9UVU5FUl9OT1JNICh3YWxrLT5kYXRhKS0+bGFiZWwsIG5vcm0pID09IDApCisgICAgICByZXR1cm4gR1NUX1RVTkVSX05PUk0gKHdhbGstPmRhdGEpOworICAgIHdhbGsgPSBnX2xpc3RfbmV4dCAod2Fsayk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogZ3N0X3R1bmVyX2ZpbmRfY2hhbm5lbF9ieV9uYW1lOgorICogQHR1bmVyOiBBICNHc3RUdW5lciBpbnN0YW5jZQorICogQGNoYW5uZWw6IEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgYSAjR3N0VHVuZXJDaGFubmVsCisgKiAKKyAqIExvb2sgdXAgYSAjR3N0VHVuZXJDaGFubmVsIGJ5IG5hbWUuCisgKgorICogUmV0dXJuczogQSAjR3N0VHVuZXJDaGFubmVsLCBvciBOVUxMIGlmIG5vIGNoYW5uZWwgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZQorICogaXMgYXZhaWxhYmxlLgorICovCitHc3RUdW5lckNoYW5uZWwgKgorZ3N0X3R1bmVyX2ZpbmRfY2hhbm5lbF9ieV9uYW1lIChHc3RUdW5lciAqIHR1bmVyLCBnY2hhciAqIGNoYW5uZWwpCit7CisgIEdMaXN0ICp3YWxrOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfVFVORVIgKHR1bmVyKSwgTlVMTCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChjaGFubmVsICE9IE5VTEwsIE5VTEwpOworCisgIHdhbGsgPSAoR0xpc3QgKikgZ3N0X3R1bmVyX2xpc3RfY2hhbm5lbHMgKHR1bmVyKTsKKyAgd2hpbGUgKHdhbGspIHsKKyAgICBpZiAoc3RyY21wIChHU1RfVFVORVJfQ0hBTk5FTCAod2Fsay0+ZGF0YSktPmxhYmVsLCBjaGFubmVsKSA9PSAwKQorICAgICAgcmV0dXJuIEdTVF9UVU5FUl9DSEFOTkVMICh3YWxrLT5kYXRhKTsKKyAgICB3YWxrID0gZ19saXN0X25leHQgKHdhbGspOworICB9CisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIGdzdF90dW5lcl9jaGFubmVsX2NoYW5nZWQ6CisgKiBAdHVuZXI6IEEgI0dzdFR1bmVyIGluc3RhbmNlCisgKiBAY2hhbm5lbDogQSAjR3N0VHVuZXJDaGFubmVsIGluc3RhbmNlCisgKgorICogQ2FsbGVkIGJ5IGVsZW1lbnRzIGltcGxlbWVudGluZyB0aGUgI0dzdFR1bmVyIGludGVyZmFjZSB3aGVuIHRoZQorICogY3VycmVudCBjaGFubmVsIGNoYW5nZXMuIEZpcmVzIHRoZSAjR3N0VHVuZXI6OmNoYW5uZWwtY2hhbmdlZCBzaWduYWwuCisgKi8KK3ZvaWQKK2dzdF90dW5lcl9jaGFubmVsX2NoYW5nZWQgKEdzdFR1bmVyICogdHVuZXIsIEdzdFR1bmVyQ2hhbm5lbCAqIGNoYW5uZWwpCit7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19UVU5FUiAodHVuZXIpKTsKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1RVTkVSX0NIQU5ORUwgKGNoYW5uZWwpKTsKKworICBnX3NpZ25hbF9lbWl0IChHX09CSkVDVCAodHVuZXIpLAorICAgICAgZ3N0X3R1bmVyX3NpZ25hbHNbQ0hBTk5FTF9DSEFOR0VEXSwgMCwgY2hhbm5lbCk7Cit9CisKKy8qKgorICogZ3N0X3R1bmVyX25vcm1fY2hhbmdlZDoKKyAqIEB0dW5lcjogQSAjR3N0VHVuZXIgaW5zdGFuY2UKKyAqIEBub3JtOiBBICNHc3RUdW5lck5vcm0gaW5zdGFuY2UKKyAqCisgKiBDYWxsZWQgYnkgZWxlbWVudHMgaW1wbGVtZW50aW5nIHRoZSAjR3N0VHVuZXIgaW50ZXJmYWNlIHdoZW4gdGhlCisgKiBjdXJyZW50IG5vcm0gY2hhbmdlcy4gRmlyZXMgdGhlICNHc3RUdW5lcjo6bm9ybS1jaGFuZ2VkIHNpZ25hbC4KKyAqIAorICovCit2b2lkCitnc3RfdHVuZXJfbm9ybV9jaGFuZ2VkIChHc3RUdW5lciAqIHR1bmVyLCBHc3RUdW5lck5vcm0gKiBub3JtKQoreworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfVFVORVIgKHR1bmVyKSk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19UVU5FUl9OT1JNIChub3JtKSk7CisKKyAgZ19zaWduYWxfZW1pdCAoR19PQkpFQ1QgKHR1bmVyKSwgZ3N0X3R1bmVyX3NpZ25hbHNbTk9STV9DSEFOR0VEXSwgMCwgbm9ybSk7Cit9CisKKy8qKgorICogZ3N0X3R1bmVyX2ZyZXF1ZW5jeV9jaGFuZ2VkOgorICogQHR1bmVyOiBBICNHc3RUdW5lciBpbnN0YW5jZQorICogQGNoYW5uZWw6IFRoZSBjdXJyZW50ICNHc3RUdW5lckNoYW5uZWwKKyAqIEBmcmVxdWVuY3k6IFRoZSBuZXcgZnJlcXVlbmN5IHNldHRpbmcKKyAqCisgKiBDYWxsZWQgYnkgZWxlbWVudHMgaW1wbGVtZW50aW5nIHRoZSAjR3N0VHVuZXIgaW50ZXJmYWNlIHdoZW4gdGhlCisgKiBjb25maWd1cmVkIGZyZXF1ZW5jeSBjaGFuZ2VzLiBGaXJlcyB0aGUgI0dzdFR1bmVyOjpmcmVxdWVuY3ktY2hhbmdlZAorICogc2lnbmFsIG9uIHRoZSB0dW5lciwgYW5kIHRoZSAjR3N0VHVuZXJDaGFubmVsOjpmcmVxdWVuY3ktY2hhbmdlZCBzaWduYWwKKyAqIG9uIHRoZSBjaGFubmVsLgorICovCit2b2lkCitnc3RfdHVuZXJfZnJlcXVlbmN5X2NoYW5nZWQgKEdzdFR1bmVyICogdHVuZXIsCisgICAgR3N0VHVuZXJDaGFubmVsICogY2hhbm5lbCwgZ3Vsb25nIGZyZXF1ZW5jeSkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1RVTkVSICh0dW5lcikpOworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfVFVORVJfQ0hBTk5FTCAoY2hhbm5lbCkpOworCisgIGdfc2lnbmFsX2VtaXQgKEdfT0JKRUNUICh0dW5lciksCisgICAgICBnc3RfdHVuZXJfc2lnbmFsc1tGUkVRVUVOQ1lfQ0hBTkdFRF0sIDAsIGNoYW5uZWwsIGZyZXF1ZW5jeSk7CisKKyAgZ19zaWduYWxfZW1pdF9ieV9uYW1lIChHX09CSkVDVCAoY2hhbm5lbCksICJmcmVxdWVuY3lfY2hhbmdlZCIsIGZyZXF1ZW5jeSk7Cit9CisKKy8qKgorICogZ3N0X3R1bmVyX3NpZ25hbF9jaGFuZ2VkOgorICogQHR1bmVyOiBBICNHc3RUdW5lciBpbnN0YW5jZQorICogQGNoYW5uZWw6IFRoZSBjdXJyZW50ICNHc3RUdW5lckNoYW5uZWwKKyAqIEBzaWduYWw6IFRoZSBuZXcgc2lnbmFsIHN0cmVuZ3RoCisgKgorICogQ2FsbGVkIGJ5IGVsZW1lbnRzIGltcGxlbWVudGluZyB0aGUgI0dzdFR1bmVyIGludGVyZmFjZSB3aGVuIHRoZQorICogaW5jb21pbmcgc2lnbmFsIHN0cmVuZ3RoIGNoYW5nZXMuIEZpcmVzIHRoZSAjR3N0VHVuZXI6OnNpZ25hbC1jaGFuZ2VkCisgKiBzaWduYWwgb24gdGhlIHR1bmVyIGFuZCB0aGUgI0dzdFR1bmVyQ2hhbm5lbDo6c2lnbmFsLWNoYW5nZWQgc2lnbmFsIG9uIAorICogdGhlIGNoYW5uZWwuCisgKi8KK3ZvaWQKK2dzdF90dW5lcl9zaWduYWxfY2hhbmdlZCAoR3N0VHVuZXIgKiB0dW5lciwKKyAgICBHc3RUdW5lckNoYW5uZWwgKiBjaGFubmVsLCBnaW50IHNpZ25hbCkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1RVTkVSICh0dW5lcikpOworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfVFVORVJfQ0hBTk5FTCAoY2hhbm5lbCkpOworCisgIGdfc2lnbmFsX2VtaXQgKEdfT0JKRUNUICh0dW5lciksCisgICAgICBnc3RfdHVuZXJfc2lnbmFsc1tTSUdOQUxfQ0hBTkdFRF0sIDAsIGNoYW5uZWwsIHNpZ25hbCk7CisKKyAgZ19zaWduYWxfZW1pdF9ieV9uYW1lIChHX09CSkVDVCAoY2hhbm5lbCksICJzaWduYWxfY2hhbmdlZCIsIHNpZ25hbCk7Cit9CmRpZmYgLS1naXQgYS9zeXMvdjRsMi90dW5lci5oIGIvc3lzL3Y0bDIvdHVuZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjk3ZTRiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvdHVuZXIuaApAQCAtMCwwICsxLDE0MSBAQAorLyogR1N0cmVhbWVyIFR1bmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICoKKyAqIHR1bmVyLmg6IHR1bmVyIGludGVyZmFjZSBkZXNpZ24KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1RVTkVSX0hfXworI2RlZmluZSBfX0dTVF9UVU5FUl9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgInR1bmVybm9ybS5oIgorI2luY2x1ZGUgInR1bmVyY2hhbm5lbC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfVFVORVIgXAorICAoZ3N0X3R1bmVyX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfVFVORVIob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX1RVTkVSLCBHc3RUdW5lcikpCisjZGVmaW5lIEdTVF9JU19UVU5FUihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfVFVORVIpKQorI2RlZmluZSBHU1RfVFVORVJfR0VUX0lOVEVSRkFDRShpbnN0KSBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0lOVEVSRkFDRSAoKGluc3QpLCBHU1RfVFlQRV9UVU5FUiwgR3N0VHVuZXJJbnRlcmZhY2UpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0VHVuZXIgR3N0VHVuZXI7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VHVuZXJJbnRlcmZhY2UgR3N0VHVuZXJJbnRlcmZhY2U7CisKKy8qKgorICogR3N0VHVuZXJJbnRlcmZhY2U6CisgKiBAaWZhY2U6IHRoZSBwYXJlbnQgaW50ZXJmYWNlCisgKiBAbGlzdF9jaGFubmVsczogbGlzdCBhdmFpbGFibGUgY2hhbm5lbHMKKyAqIEBzZXRfY2hhbm5lbDogc2V0IHRvIGEgY2hhbm5lbAorICogQGdldF9jaGFubmVsOiByZXR1cm4gdGhlIGN1cnJlbnQgY2hhbm5lbAorICogQGxpc3Rfbm9ybXM6IGxpc3QgYXZhaWxhYmxlIG5vcm1zCisgKiBAc2V0X25vcm06IHNldCBhIG5vcm0KKyAqIEBnZXRfbm9ybTogcmV0dXJuIHRoZSBjdXJyZW50IG5vcm0KKyAqIEBzZXRfZnJlcXVlbmN5OiBzZXQgdGhlIGZyZXF1ZW5jeQorICogQGdldF9mcmVxdWVuY3k6IHJldHVybiB0aGUgY3VycmVudCBmcmVxdWVuY3kKKyAqIEBzaWduYWxfc3RyZW5ndGg6IGdldCB0aGUgc2lnbmFsIHN0cmVuZ3RoCisgKiBAY2hhbm5lbF9jaGFuZ2VkOiBkZWZhdWx0IGhhbmRsZXIgZm9yIGNoYW5uZWwgY2hhbmdlZCBub3RpZmljYXRpb24KKyAqIEBub3JtX2NoYW5nZWQ6IGRlZmF1bHQgaGFuZGxlciBmb3Igbm9ybSBjaGFuZ2VkIG5vdGlmaWNhdGlvbgorICogQGZyZXF1ZW5jeV9jaGFuZ2VkOiBkZWZhdWx0IGhhbmRsZXIgZm9yIGZyZXF1ZW5jeSBjaGFuZ2VkIG5vdGlmaWNhdGlvbgorICogQHNpZ25hbF9jaGFuZ2VkOiBkZWZhdWx0IGhhbmRsZXIgZm9yIHNpZ25hbC1zdHJlbmd0aCBjaGFuZ2VkIG5vdGlmaWNhdGlvbgorICoKKyAqIFR1bmVyIGludGVyZmFjZS4KKyAqLworc3RydWN0IF9Hc3RUdW5lckludGVyZmFjZSB7CisgIEdUeXBlSW50ZXJmYWNlIGlmYWNlOworCisgIC8qIHZpcnR1YWwgZnVuY3Rpb25zICovCisgIGNvbnN0IEdMaXN0ICogKCogbGlzdF9jaGFubmVscykgICAoR3N0VHVuZXIgICAgICAgICp0dW5lcik7CisgIHZvaWQgICAgICAgICAgKCogc2V0X2NoYW5uZWwpICAgICAoR3N0VHVuZXIgICAgICAgICp0dW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lckNoYW5uZWwgKmNoYW5uZWwpOworICBHc3RUdW5lckNoYW5uZWwgKgorICAgICAgICAgICAgICAgICgqIGdldF9jaGFubmVsKSAgICAgKEdzdFR1bmVyICAgICAgICAqdHVuZXIpOworCisgIGNvbnN0IEdMaXN0ICogKCogbGlzdF9ub3JtcykgICAgICAoR3N0VHVuZXIgICAgICAgICp0dW5lcik7CisgIHZvaWQgICAgICAgICAgKCogc2V0X25vcm0pICAgICAgICAoR3N0VHVuZXIgICAgICAgICp0dW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lck5vcm0gICAgKm5vcm0pOworICBHc3RUdW5lck5vcm0gKigqIGdldF9ub3JtKSAgICAgICAgKEdzdFR1bmVyICAgICAgICAqdHVuZXIpOworCisgIHZvaWQgICAgICAgICAgKCogc2V0X2ZyZXF1ZW5jeSkgICAoR3N0VHVuZXIgICAgICAgICp0dW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lckNoYW5uZWwgKmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Vsb25nICAgICAgICAgICBmcmVxdWVuY3kpOworICBndWxvbmcgICAgICAgICgqIGdldF9mcmVxdWVuY3kpICAgKEdzdFR1bmVyICAgICAgICAqdHVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VHVuZXJDaGFubmVsICpjaGFubmVsKTsKKyAgZ2ludCAgICAgICAgICAoKiBzaWduYWxfc3RyZW5ndGgpIChHc3RUdW5lciAgICAgICAgKnR1bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyQ2hhbm5lbCAqY2hhbm5lbCk7CisKKyAgLyogc2lnbmFscyAqLworICB2b2lkICgqY2hhbm5lbF9jaGFuZ2VkKSAgIChHc3RUdW5lciAgICAgICAgKnR1bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lckNoYW5uZWwgKmNoYW5uZWwpOworICB2b2lkICgqbm9ybV9jaGFuZ2VkKSAgICAgIChHc3RUdW5lciAgICAgICAgKnR1bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lck5vcm0gICAgKm5vcm0pOworICB2b2lkICgqZnJlcXVlbmN5X2NoYW5nZWQpIChHc3RUdW5lciAgICAgICAgKnR1bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lckNoYW5uZWwgKmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1bG9uZyAgICAgICAgICAgZnJlcXVlbmN5KTsKKyAgdm9pZCAoKnNpZ25hbF9jaGFuZ2VkKSAgICAoR3N0VHVuZXIgICAgICAgICp0dW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VHVuZXJDaGFubmVsICpjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50ICAgICAgICAgICAgIHNpZ25hbCk7Cit9OworCitHVHlwZSAgICAgICAgICAgZ3N0X3R1bmVyX2dldF90eXBlICAgICAgICAgICAgICAodm9pZCk7CisKKy8qIHZpcnR1YWwgY2xhc3MgZnVuY3Rpb24gd3JhcHBlcnMgKi8KK2NvbnN0IEdMaXN0ICogICBnc3RfdHVuZXJfbGlzdF9jaGFubmVscyAgICAgICAgIChHc3RUdW5lciAgICAgICAgKnR1bmVyKTsKK3ZvaWQgICAgICAgICAgICBnc3RfdHVuZXJfc2V0X2NoYW5uZWwgICAgICAgICAgIChHc3RUdW5lciAgICAgICAgKnR1bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyQ2hhbm5lbCAqY2hhbm5lbCk7CitHc3RUdW5lckNoYW5uZWwgKgorICAgICAgICAgICAgICAgIGdzdF90dW5lcl9nZXRfY2hhbm5lbCAgICAgICAgICAgKEdzdFR1bmVyICAgICAgICAqdHVuZXIpOworCitjb25zdCBHTGlzdCAqICAgZ3N0X3R1bmVyX2xpc3Rfbm9ybXMgICAgICAgICAgICAoR3N0VHVuZXIgICAgICAgICp0dW5lcik7Cit2b2lkICAgICAgICAgICAgZ3N0X3R1bmVyX3NldF9ub3JtICAgICAgICAgICAgICAoR3N0VHVuZXIgICAgICAgICp0dW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lck5vcm0gICAgKm5vcm0pOworR3N0VHVuZXJOb3JtICogIGdzdF90dW5lcl9nZXRfbm9ybSAgICAgICAgICAgICAgKEdzdFR1bmVyICAgICAgICAqdHVuZXIpOworCit2b2lkICAgICAgICAgICAgZ3N0X3R1bmVyX3NldF9mcmVxdWVuY3kgICAgICAgICAoR3N0VHVuZXIgICAgICAgICp0dW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lckNoYW5uZWwgKmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Vsb25nICAgICAgICAgICBmcmVxdWVuY3kpOworZ3Vsb25nICAgICAgICAgIGdzdF90dW5lcl9nZXRfZnJlcXVlbmN5ICAgICAgICAgKEdzdFR1bmVyICAgICAgICAqdHVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VHVuZXJDaGFubmVsICpjaGFubmVsKTsKK2dpbnQgICAgICAgICAgICBnc3RfdHVuZXJfc2lnbmFsX3N0cmVuZ3RoICAgICAgIChHc3RUdW5lciAgICAgICAgKnR1bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyQ2hhbm5lbCAqY2hhbm5lbCk7CisKKy8qIGhlbHBlciBmdW5jdGlvbnMgKi8KK0dzdFR1bmVyTm9ybSAqICBnc3RfdHVuZXJfZmluZF9ub3JtX2J5X25hbWUgICAgIChHc3RUdW5lciAgICAgICAgKnR1bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICAgICAgICAgICAqbm9ybSk7CitHc3RUdW5lckNoYW5uZWwgKmdzdF90dW5lcl9maW5kX2NoYW5uZWxfYnlfbmFtZSAoR3N0VHVuZXIgICAgICAgICp0dW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAgICAgICAgICAgKmNoYW5uZWwpOworCisvKiB0cmlnZ2VyIHNpZ25hbHMgKi8KK3ZvaWQgICAgICAgICAgICBnc3RfdHVuZXJfY2hhbm5lbF9jaGFuZ2VkICAgICAgIChHc3RUdW5lciAgICAgICAgKnR1bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyQ2hhbm5lbCAqY2hhbm5lbCk7Cit2b2lkICAgICAgICAgICAgZ3N0X3R1bmVyX25vcm1fY2hhbmdlZCAgICAgICAgICAoR3N0VHVuZXIgICAgICAgICp0dW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lck5vcm0gICAgKm5vcm0pOwordm9pZCAgICAgICAgICAgIGdzdF90dW5lcl9mcmVxdWVuY3lfY2hhbmdlZCAgICAgKEdzdFR1bmVyICAgICAgICAqdHVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VHVuZXJDaGFubmVsICpjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1bG9uZyAgICAgICAgICAgZnJlcXVlbmN5KTsKK3ZvaWQgICAgICAgICAgICBnc3RfdHVuZXJfc2lnbmFsX2NoYW5nZWQgICAgICAgIChHc3RUdW5lciAgICAgICAgKnR1bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyQ2hhbm5lbCAqY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50ICAgICAgICAgICAgIHNpZ25hbCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9UVU5FUl9IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy92NGwyL3R1bmVyY2hhbm5lbC5jIGIvc3lzL3Y0bDIvdHVuZXJjaGFubmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU0NTY5NgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL3R1bmVyY2hhbm5lbC5jCkBAIC0wLDAgKzEsMTE3IEBACisvKiBHU3RyZWFtZXIgVHVuZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKgorICogdHVuZXJjaGFubmVsLmM6IHR1bmVyIGNoYW5uZWwgb2JqZWN0IGRlc2lnbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInR1bmVyY2hhbm5lbC5oIgorCisvKioKKyAqIFNFQ1RJT046Z3N0dHVuZXJjaGFubmVsCisgKiBAc2hvcnRfZGVzY3JpcHRpb246IEEgY2hhbm5lbCBmcm9tIGFuIGVsZW1lbnQgaW1wbGVtZW50aW5nIHRoZSAjR3N0VHVuZXIKKyAqIGludGVyZmFjZS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8cGFyYT5UaGUgI0dzdFR1bmVyQ2hhbm5lbCBvYmplY3QgaXMgcHJvdmlkZWQgYnkgYW4gZWxlbWVudCBpbXBsZW1lbnRpbmcKKyAqIHRoZSAjR3N0VHVuZXIgaW50ZXJmYWNlLgorICogPC9wYXJhPgorICogPHBhcmE+CisgKiBHc3RUdW5lckNoYW5uZWwgcHJvdmlkZXMgYSBuYW1lIGFuZCBmbGFncyB0byBkZXRlcm1pbmUgdGhlIHR5cGUgYW5kCisgKiBjYXBhYmlsaXRpZXMgb2YgdGhlIGNoYW5uZWwuIElmIHRoZSBHU1RfVFVORVJfQ0hBTk5FTF9GUkVRVUVOQ1kgZmxhZyBpcworICogc2V0LCB0aGVuIHRoZSBjaGFubmVsIGFsc28gaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0KKyAqIGZyZXF1ZW5jeSwgYW5kIHJhbmdlIG9mIHRoZSByZXBvcnRlZCBzaWduYWwgc3RyZW5ndGguCisgKiA8L3BhcmE+CisgKiA8L3JlZnNlY3QyPgorICovCisKK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBTSUdOQUxfRlJFUVVFTkNZX0NIQU5HRUQsCisgIFNJR05BTF9TSUdOQUxfQ0hBTkdFRCwKKyAgTEFTVF9TSUdOQUwKK307CisKK0dfREVGSU5FX1RZUEUgKEdzdFR1bmVyQ2hhbm5lbCwgZ3N0X3R1bmVyX2NoYW5uZWwsIEdfVFlQRV9PQkpFQ1QpOworCitzdGF0aWMgdm9pZCBnc3RfdHVuZXJfY2hhbm5lbF9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGd1aW50IHNpZ25hbHNbTEFTVF9TSUdOQUxdID0geyAwIH07CisKK3N0YXRpYyB2b2lkCitnc3RfdHVuZXJfY2hhbm5lbF9jbGFzc19pbml0IChHc3RUdW5lckNoYW5uZWxDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9rbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisKKyAgLyoqCisgICAqIEdzdFR1bmVyQ2hhbm5lbDo6ZnJlcXVlbmN5LWNoYW5nZWQ6CisgICAqIEB0dW5lcmNoYW5uZWw6IFRoZSAjR3N0VHVuZXJDaGFubmVsCisgICAqIEBmcmVxdWVuY3k6IFRoZSBuZXcgZnJlcXVlbmN5IChhbiB1bnNpZ25lZCBsb25nKQorICAgKgorICAgKiBSZXBvcnRzIHRoYXQgdGhlIGN1cnJlbnQgZnJlcXVlbmN5IGhhcyBjaGFuZ2VkLgorICAgKi8KKyAgc2lnbmFsc1tTSUdOQUxfRlJFUVVFTkNZX0NIQU5HRURdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoImZyZXF1ZW5jeS1jaGFuZ2VkIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULAorICAgICAgR19TVFJVQ1RfT0ZGU0VUIChHc3RUdW5lckNoYW5uZWxDbGFzcywKKyAgICAgICAgICBmcmVxdWVuY3lfY2hhbmdlZCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfVk9JRF9fVUxPTkcsIEdfVFlQRV9OT05FLCAxLCBHX1RZUEVfVUxPTkcpOworICAvKioKKyAgICogR3N0VHVuZXJDaGFubmVsOjpzaWduYWwtY2hhbmdlZDoKKyAgICogQHR1bmVyY2hhbm5lbDogVGhlICNHc3RUdW5lckNoYW5uZWwKKyAgICogQHNpZ25hbDogVGhlIG5ldyBzaWduYWwgc3RyZW5ndGggKGFuIGludGVnZXIpCisgICAqCisgICAqIFJlcG9ydHMgdGhhdCB0aGUgc2lnbmFsIHN0cmVuZ3RoIGhhcyBjaGFuZ2VkLgorICAgKgorICAgKiBTZWUgQWxzbzogZ3N0X3R1bmVyX3NpZ25hbF9zdHJlbmd0aCgpCisgICAqLworICBzaWduYWxzW1NJR05BTF9TSUdOQUxfQ0hBTkdFRF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgic2lnbmFsLWNoYW5nZWQiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsCisgICAgICBHX1NUUlVDVF9PRkZTRVQgKEdzdFR1bmVyQ2hhbm5lbENsYXNzLAorICAgICAgICAgIHNpZ25hbF9jaGFuZ2VkKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19JTlQsIEdfVFlQRV9OT05FLCAxLCBHX1RZUEVfSU5UKTsKKworICBvYmplY3Rfa2xhc3MtPmRpc3Bvc2UgPSBnc3RfdHVuZXJfY2hhbm5lbF9kaXNwb3NlOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3R1bmVyX2NoYW5uZWxfaW5pdCAoR3N0VHVuZXJDaGFubmVsICogY2hhbm5lbCkKK3sKKyAgY2hhbm5lbC0+bGFiZWwgPSBOVUxMOworICBjaGFubmVsLT5mbGFncyA9IDA7CisgIGNoYW5uZWwtPm1pbl9mcmVxdWVuY3kgPSBjaGFubmVsLT5tYXhfZnJlcXVlbmN5ID0gMDsKKyAgY2hhbm5lbC0+bWluX3NpZ25hbCA9IGNoYW5uZWwtPm1heF9zaWduYWwgPSAwOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3R1bmVyX2NoYW5uZWxfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0VHVuZXJDaGFubmVsICpjaGFubmVsID0gR1NUX1RVTkVSX0NIQU5ORUwgKG9iamVjdCk7CisKKyAgaWYgKGNoYW5uZWwtPmxhYmVsKSB7CisgICAgZ19mcmVlIChjaGFubmVsLT5sYWJlbCk7CisgICAgY2hhbm5lbC0+bGFiZWwgPSBOVUxMOworICB9CisKKyAgR19PQkpFQ1RfQ0xBU1MgKGdzdF90dW5lcl9jaGFubmVsX3BhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CmRpZmYgLS1naXQgYS9zeXMvdjRsMi90dW5lcmNoYW5uZWwuaCBiL3N5cy92NGwyL3R1bmVyY2hhbm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwODBjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi90dW5lcmNoYW5uZWwuaApAQCAtMCwwICsxLDExNiBAQAorLyogR1N0cmVhbWVyIFR1bmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICoKKyAqIHR1bmVyY2hhbm5lbC5oOiB0dW5lciBjaGFubmVsIG9iamVjdCBkZXNpZ24KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1RVTkVSX0NIQU5ORUxfSF9fCisjZGVmaW5lIF9fR1NUX1RVTkVSX0NIQU5ORUxfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9UVU5FUl9DSEFOTkVMIFwKKyAgKGdzdF90dW5lcl9jaGFubmVsX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfVFVORVJfQ0hBTk5FTChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfVFVORVJfQ0hBTk5FTCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyQ2hhbm5lbCkpCisjZGVmaW5lIEdTVF9UVU5FUl9DSEFOTkVMX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfVFVORVJfQ0hBTk5FTCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyQ2hhbm5lbENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1RVTkVSX0NIQU5ORUwob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX1RVTkVSX0NIQU5ORUwpKQorI2RlZmluZSBHU1RfSVNfVFVORVJfQ0hBTk5FTF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX1RVTkVSX0NIQU5ORUwpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0VHVuZXJDaGFubmVsIEdzdFR1bmVyQ2hhbm5lbDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RUdW5lckNoYW5uZWxDbGFzcyBHc3RUdW5lckNoYW5uZWxDbGFzczsKKworLyoqCisgKiBHc3RUdW5lckNoYW5uZWxGbGFnczoKKyAqIEBHU1RfVFVORVJfQ0hBTk5FTF9JTlBVVDogVGhlIGNoYW5uZWwgaXMgZm9yIGlucHV0CisgKiBAR1NUX1RVTkVSX0NIQU5ORUxfT1VUUFVUOiBUaGUgY2hhbm5lbCBpcyBmb3Igb3V0cHV0CisgKiBAR1NUX1RVTkVSX0NIQU5ORUxfRlJFUVVFTkNZOiBUaGUgY2hhbm5lbCBoYXMgYSBmcmVxdWVuY3kgc2V0dGluZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNpZ25hbCBzdHJlbmd0aC4KKyAqIEBHU1RfVFVORVJfQ0hBTk5FTF9BVURJTzogVGhlIGNoYW5uZWwgY2FycmllcyBhdWRpby4KKyAqCisgKiBBbiBlbnVtZXJhdGlvbiBmb3IgZmxhZ3MgaW5kaWNhdGluZyB0aGUgYXZhaWxhYmxlIGNhcGFiaWxpdGllcworICogb2YgYSAjR3N0VHVuZXJDaGFubmVsLgorICovCit0eXBlZGVmIGVudW0geworICBHU1RfVFVORVJfQ0hBTk5FTF9JTlBVVCAgICAgPSAoMTw8MCksCisgIEdTVF9UVU5FUl9DSEFOTkVMX09VVFBVVCAgICA9ICgxPDwxKSwKKyAgR1NUX1RVTkVSX0NIQU5ORUxfRlJFUVVFTkNZID0gKDE8PDIpLAorICBHU1RfVFVORVJfQ0hBTk5FTF9BVURJTyAgICAgPSAoMTw8MykKK30gR3N0VHVuZXJDaGFubmVsRmxhZ3M7CisKKy8qKgorICogR1NUX1RVTkVSX0NIQU5ORUxfSEFTX0ZMQUc6CisgKiBAY2hhbm5lbDogQSAjR3N0VHVuZXJDaGFubmVsCisgKiBAZmxhZzogVGhlIGZsYWcgdG8gY2hlY2sgZm9yCisgKgorICogTWFjcm8gdG8gY2hlY2sgaWYgdGhlIGdpdmVuIGZsYWcgaXMgc2V0IG9uIGEgY2hhbm5lbAorICovCisjZGVmaW5lIEdTVF9UVU5FUl9DSEFOTkVMX0hBU19GTEFHKGNoYW5uZWwsIGZsYWcpIFwKKyAgKChjaGFubmVsKS0+ZmxhZ3MgJiBmbGFnKQorCisvKioKKyAqIEdzdFR1bmVyQ2hhbm5lbDoKKyAqIEBsYWJlbDogQSBzdHJpbmcgY29udGFpbmluZyBhIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoaXMgY2hhbm5lbAorICogQGZsYWdzOiBBIHNldCBvZiAjR3N0VHVuZXJDaGFubmVsRmxhZ3MgZm9yIHRoaXMgY2hhbm5lbAorICogQGZyZXFfbXVsdGlwbGljYXRvcjogVGhlIHN0ZXAgc2l6ZSAoaW4gSHopIGZvciB0aGUgZnJlcXVlbmN5IHNldHRpbmcuCisgKiBAbWluX2ZyZXF1ZW5jeTogTWluaW11bSB2YWxpZCBmcmVxdWVuY3kgc2V0dGluZyAoaW4gSHopLgorICogQG1heF9mcmVxdWVuY3k6IE1heGltdW0gdmFsaWQgZnJlcXVlbmN5IHNldHRpbmcgKGluIEh6KS4KKyAqIEBtaW5fc2lnbmFsOiBNaW5pbXVtIHJlcG9ydGVkIHNpZ25hbCBzdHJlbmd0aCB2YWx1ZS4KKyAqIEBtYXhfc2lnbmFsOiBNYXhpbXVtIHJlcG9ydGVkIHNpZ25hbCBzdHJlbmd0aCB2YWx1ZS4KKyAqLworc3RydWN0IF9Hc3RUdW5lckNoYW5uZWwgeworICBHT2JqZWN0ICAgICAgICAgICAgICBwYXJlbnQ7CisKKyAgLyo8IHB1YmxpYyA+Ki8KKyAgZ2NoYXIgICAgICAgICAgICAgICAqbGFiZWw7CisgIEdzdFR1bmVyQ2hhbm5lbEZsYWdzIGZsYWdzOworICBnZmxvYXQgICAgICAgICAgICAgICBmcmVxX211bHRpcGxpY2F0b3I7CisgIGd1bG9uZyAgICAgICAgICAgICAgIG1pbl9mcmVxdWVuY3k7CisgIGd1bG9uZyAgICAgICAgICAgICAgIG1heF9mcmVxdWVuY3k7CisgIGdpbnQgICAgICAgICAgICAgICAgIG1pbl9zaWduYWw7CisgIGdpbnQgICAgICAgICAgICAgICAgIG1heF9zaWduYWw7CisKKyAgLyo8IHByaXZhdGUgPiovCisgIGdwb2ludGVyIF9nc3RfcmVzZXJ2ZWRbR1NUX1BBRERJTkddOworfTsKKworc3RydWN0IF9Hc3RUdW5lckNoYW5uZWxDbGFzcyB7CisgIEdPYmplY3RDbGFzcyBwYXJlbnQ7CisKKyAgLyo8IHByaXZhdGUgPiovCisgIC8qIHNpZ25hbHMgKi8KKyAgdm9pZCAoKmZyZXF1ZW5jeV9jaGFuZ2VkKSAoR3N0VHVuZXJDaGFubmVsICpjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWxvbmcgICAgICAgICAgIGZyZXF1ZW5jeSk7CisgIHZvaWQgKCpzaWduYWxfY2hhbmdlZCkgICAgKEdzdFR1bmVyQ2hhbm5lbCAqY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICBzaWduYWwpOworCisgIGdwb2ludGVyIF9nc3RfcmVzZXJ2ZWRbR1NUX1BBRERJTkddOworfTsKKworR1R5cGUgICAgICAgICAgIGdzdF90dW5lcl9jaGFubmVsX2dldF90eXBlICAgICAgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfVFVORVJfQ0hBTk5FTF9IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy92NGwyL3R1bmVybm9ybS5jIGIvc3lzL3Y0bDIvdHVuZXJub3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1N2ZmYgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL3R1bmVybm9ybS5jCkBAIC0wLDAgKzEsODEgQEAKKy8qIEdTdHJlYW1lciBUdW5lcgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqCisgKiB0dW5lcm5vcm0uYzogdHVuZXIgbm9ybSBvYmplY3QgZGVzaWduCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAidHVuZXJub3JtLmgiCisKKy8qKgorICogU0VDVElPTjpnc3R0dW5lcm5vcm0KKyAqIEBzaG9ydF9kZXNjcmlwdGlvbjogRW5jYXBzdWxhdGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRhIGZvcm1hdChzKQorICogZm9yIGEgI0dzdFR1bmVyQ2hhbm5lbC4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8cGFyYT5UaGUgI0dzdFR1bmVyTm9ybSBvYmplY3QgaXMgY3JlYXRlZCBieSBhbiBlbGVtZW50IGltcGxlbWVudGluZyB0aGUKKyAqICNHc3RUdW5lciBpbnRlcmZhY2UgYW5kIGVuY2Fwc3VsYXRlcyB0aGUgc2VsZWN0aW9uIG9mIGEgY2FwdHVyZS9vdXRwdXQgZm9ybWF0CisgKiBmb3IgYSBzZWxlY3RlZCAjR3N0VHVuZXJDaGFubmVsLgorICogPC9wYXJhPgorICogPC9yZWZzZWN0Mj4KKyAqLworCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKK0dfREVGSU5FX1RZUEUgKEdzdFR1bmVyTm9ybSwgZ3N0X3R1bmVyX25vcm0sIEdfVFlQRV9PQkpFQ1QpOworCitzdGF0aWMgdm9pZCBnc3RfdHVuZXJfbm9ybV9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKKworCisvKnN0YXRpYyBndWludCBzaWduYWxzW0xBU1RfU0lHTkFMXSA9IHsgMCB9OyovCisKK3N0YXRpYyB2b2lkCitnc3RfdHVuZXJfbm9ybV9jbGFzc19pbml0IChHc3RUdW5lck5vcm1DbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9rbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisKKworICBvYmplY3Rfa2xhc3MtPmRpc3Bvc2UgPSBnc3RfdHVuZXJfbm9ybV9kaXNwb3NlOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3R1bmVyX25vcm1faW5pdCAoR3N0VHVuZXJOb3JtICogbm9ybSkKK3sKKyAgbm9ybS0+bGFiZWwgPSBOVUxMOworICBnX3ZhbHVlX2luaXQgKCZub3JtLT5mcmFtZXJhdGUsIEdTVF9UWVBFX0ZSQUNUSU9OKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF90dW5lcl9ub3JtX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFR1bmVyTm9ybSAqbm9ybSA9IEdTVF9UVU5FUl9OT1JNIChvYmplY3QpOworCisgIGlmIChub3JtLT5sYWJlbCkgeworICAgIGdfZnJlZSAobm9ybS0+bGFiZWwpOworICAgIG5vcm0tPmxhYmVsID0gTlVMTDsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChnc3RfdHVuZXJfbm9ybV9wYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvdHVuZXJub3JtLmggYi9zeXMvdjRsMi90dW5lcm5vcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGRhMjJjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvdHVuZXJub3JtLmgKQEAgLTAsMCArMSw3MCBAQAorLyogR1N0cmVhbWVyIFR1bmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICoKKyAqIHR1bmVybm9ybS5oOiB0dW5lciBub3JtIG9iamVjdCBkZXNpZ24KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1RVTkVSX05PUk1fSF9fCisjZGVmaW5lIF9fR1NUX1RVTkVSX05PUk1fSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9UVU5FUl9OT1JNIFwKKyAgKGdzdF90dW5lcl9ub3JtX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfVFVORVJfTk9STShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfVFVORVJfTk9STSwgR3N0VHVuZXJOb3JtKSkKKyNkZWZpbmUgR1NUX1RVTkVSX05PUk1fQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9UVU5FUl9OT1JNLCBHc3RUdW5lck5vcm1DbGFzcykpCisjZGVmaW5lIEdTVF9JU19UVU5FUl9OT1JNKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9UVU5FUl9OT1JNKSkKKyNkZWZpbmUgR1NUX0lTX1RVTkVSX05PUk1fQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9UVU5FUl9OT1JNKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFR1bmVyTm9ybSBHc3RUdW5lck5vcm07Cit0eXBlZGVmIHN0cnVjdCBfR3N0VHVuZXJOb3JtQ2xhc3MgR3N0VHVuZXJOb3JtQ2xhc3M7CisKKy8qKgorICogR3N0VHVuZXJOb3JtOgorICogQGxhYmVsOiBBIHN0cmluZyBjb250YWluaW5nIGEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIG5vcm0KKyAqIEBmcmFtZXJhdGU6IEEgR1ZhbHVlIGNvbnRhaW5pbmcgdGhlIGZyYW1lcmF0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBub3JtLAorICogICAgICAgICAgICAgaWYgYW55LiAoTWF5IGJlIHVuc2V0KS4KKyAqLworc3RydWN0IF9Hc3RUdW5lck5vcm0geworICBHT2JqZWN0IHBhcmVudDsKKworICAvKjwgcHVibGljID4qLworICBnY2hhciAgKmxhYmVsOworICBHVmFsdWUgIGZyYW1lcmF0ZTsKKworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgZ3BvaW50ZXIgX2dzdF9yZXNlcnZlZFtHU1RfUEFERElOR107Cit9OworCitzdHJ1Y3QgX0dzdFR1bmVyTm9ybUNsYXNzIHsKKyAgR09iamVjdENsYXNzIHBhcmVudDsKKworICBncG9pbnRlciBfZ3N0X3Jlc2VydmVkW0dTVF9QQURESU5HXTsKK307CisKK0dUeXBlICAgICAgICAgICBnc3RfdHVuZXJfbm9ybV9nZXRfdHlwZSAgICAgICAgICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1RVTkVSX05PUk1fSF9fICovCmRpZmYgLS1naXQgYS9zeXMvdjRsMi92NGwyLXV0aWxzLmMgYi9zeXMvdjRsMi92NGwyLXV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYwYzVkZgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL3Y0bDItdXRpbHMuYwpAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBDb2xsYWJvcmEgTHRkLgorICogICAgIEF1dGhvcjogTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInY0bDItdXRpbHMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ29tbW9uIGRldmljZSBpdGVyYXRvciAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgSEFWRV9HVURFVgorI2luY2x1ZGUgPGd1ZGV2L2d1ZGV2Lmg+CisKK3N0cnVjdCBfR3N0VjRsMkdVZGV2SXRlcmF0b3IKK3sKKyAgR3N0VjRsMkl0ZXJhdG9yIHBhcmVudDsKKyAgR0xpc3QgKmRldmljZXM7CisgIEdVZGV2RGV2aWNlICpkZXZpY2U7CisgIEdVZGV2Q2xpZW50ICpjbGllbnQ7Cit9OworCitHc3RWNGwySXRlcmF0b3IgKgorZ3N0X3Y0bDJfaXRlcmF0b3JfbmV3ICh2b2lkKQoreworICBzdGF0aWMgY29uc3QgZ2NoYXIgKnN1YnN5c3RlbXNbXSA9IHsgInZpZGVvNGxpbnV4IiwgTlVMTCB9OworICBzdHJ1Y3QgX0dzdFY0bDJHVWRldkl0ZXJhdG9yICppdDsKKworICBpdCA9IGdfc2xpY2VfbmV3MCAoc3RydWN0IF9Hc3RWNGwyR1VkZXZJdGVyYXRvcik7CisKKyAgaXQtPmNsaWVudCA9IGdfdWRldl9jbGllbnRfbmV3IChzdWJzeXN0ZW1zKTsKKyAgaXQtPmRldmljZXMgPSBnX3VkZXZfY2xpZW50X3F1ZXJ5X2J5X3N1YnN5c3RlbSAoaXQtPmNsaWVudCwgInZpZGVvNGxpbnV4Iik7CisKKyAgcmV0dXJuIChHc3RWNGwySXRlcmF0b3IgKikgaXQ7Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl9pdGVyYXRvcl9uZXh0IChHc3RWNGwySXRlcmF0b3IgKiBfaXQpCit7CisgIHN0cnVjdCBfR3N0VjRsMkdVZGV2SXRlcmF0b3IgKml0ID0gKHN0cnVjdCBfR3N0VjRsMkdVZGV2SXRlcmF0b3IgKikgX2l0OworICBjb25zdCBnY2hhciAqZGV2aWNlX25hbWU7CisKKyAgaWYgKGl0LT5kZXZpY2UpCisgICAgZ19vYmplY3RfdW5yZWYgKGl0LT5kZXZpY2UpOworCisgIGl0LT5kZXZpY2UgPSBOVUxMOworICBpdC0+cGFyZW50LmRldmljZV9wYXRoID0gTlVMTDsKKyAgaXQtPnBhcmVudC5kZXZpY2VfbmFtZSA9IE5VTEw7CisKKyAgaWYgKGl0LT5kZXZpY2VzID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGl0LT5kZXZpY2UgPSBpdC0+ZGV2aWNlcy0+ZGF0YTsKKyAgaXQtPmRldmljZXMgPSBnX2xpc3RfZGVsZXRlX2xpbmsgKGl0LT5kZXZpY2VzLCBpdC0+ZGV2aWNlcyk7CisKKyAgZGV2aWNlX25hbWUgPSBnX3VkZXZfZGV2aWNlX2dldF9wcm9wZXJ0eSAoaXQtPmRldmljZSwgIklEX1Y0TF9QUk9EVUNUIik7CisgIGlmICghZGV2aWNlX25hbWUpCisgICAgZGV2aWNlX25hbWUgPSBnX3VkZXZfZGV2aWNlX2dldF9wcm9wZXJ0eSAoaXQtPmRldmljZSwgIklEX01PREVMX0VOQyIpOworICBpZiAoIWRldmljZV9uYW1lKQorICAgIGRldmljZV9uYW1lID0gZ191ZGV2X2RldmljZV9nZXRfcHJvcGVydHkgKGl0LT5kZXZpY2UsICJJRF9NT0RFTCIpOworCisgIGl0LT5wYXJlbnQuZGV2aWNlX3BhdGggPSBnX3VkZXZfZGV2aWNlX2dldF9kZXZpY2VfZmlsZSAoaXQtPmRldmljZSk7CisgIGl0LT5wYXJlbnQuZGV2aWNlX25hbWUgPSBkZXZpY2VfbmFtZTsKKyAgaXQtPnBhcmVudC5zeXNfcGF0aCA9IGdfdWRldl9kZXZpY2VfZ2V0X3N5c2ZzX3BhdGggKGl0LT5kZXZpY2UpOworCisgIHJldHVybiBUUlVFOworfQorCit2b2lkCitnc3RfdjRsMl9pdGVyYXRvcl9mcmVlIChHc3RWNGwySXRlcmF0b3IgKiBfaXQpCit7CisgIHN0cnVjdCBfR3N0VjRsMkdVZGV2SXRlcmF0b3IgKml0ID0gKHN0cnVjdCBfR3N0VjRsMkdVZGV2SXRlcmF0b3IgKikgX2l0OworICBnX2xpc3RfZnJlZV9mdWxsIChpdC0+ZGV2aWNlcywgZ19vYmplY3RfdW5yZWYpOworICBnc3Rfb2JqZWN0X3VucmVmIChpdC0+Y2xpZW50KTsKKyAgZ19zbGljZV9mcmVlIChzdHJ1Y3QgX0dzdFY0bDJHVWRldkl0ZXJhdG9yLCBpdCk7Cit9CisKKyNlbHNlIC8qIE5vIEdVREVWICovCisKK3N0cnVjdCBfR3N0VjRsMkZzSXRlcmF0b3IKK3sKKyAgR3N0VjRsMkl0ZXJhdG9yIHBhcmVudDsKKyAgZ2ludCBiYXNlX2lkeDsKKyAgZ2ludCB2aWRlb19pZHg7CisgIGdjaGFyICpkZXZpY2U7Cit9OworCitHc3RWNGwySXRlcmF0b3IgKgorZ3N0X3Y0bDJfaXRlcmF0b3JfbmV3ICh2b2lkKQoreworICBzdHJ1Y3QgX0dzdFY0bDJGc0l0ZXJhdG9yICppdDsKKworICBpdCA9IGdfc2xpY2VfbmV3MCAoc3RydWN0IF9Hc3RWNGwyRnNJdGVyYXRvcik7CisgIGl0LT5iYXNlX2lkeCA9IDA7CisgIGl0LT52aWRlb19pZHggPSAtMTsKKyAgaXQtPmRldmljZSA9IE5VTEw7CisKKyAgcmV0dXJuIChHc3RWNGwySXRlcmF0b3IgKikgaXQ7Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl9pdGVyYXRvcl9uZXh0IChHc3RWNGwySXRlcmF0b3IgKiBfaXQpCit7CisgIHN0cnVjdCBfR3N0VjRsMkZzSXRlcmF0b3IgKml0ID0gKHN0cnVjdCBfR3N0VjRsMkZzSXRlcmF0b3IgKikgX2l0OworICBzdGF0aWMgY29uc3QgZ2NoYXIgKmRldl9iYXNlW10gPSB7ICIvZGV2L3ZpZGVvIiwgIi9kZXYvdjRsMi92aWRlbyIsIE5VTEwgfTsKKyAgZ2NoYXIgKmRldmljZSA9IE5VTEw7CisKKyAgZ19mcmVlICgoZ2NoYXIgKikgaXQtPnBhcmVudC5kZXZpY2VfcGF0aCk7CisgIGl0LT5wYXJlbnQuZGV2aWNlX3BhdGggPSBOVUxMOworCisgIHdoaWxlIChkZXZpY2UgPT0gTlVMTCkgeworICAgIGl0LT52aWRlb19pZHgrKzsKKworICAgIGlmIChpdC0+dmlkZW9faWR4ID49IDY0KSB7CisgICAgICBpdC0+dmlkZW9faWR4ID0gMDsKKyAgICAgIGl0LT5iYXNlX2lkeCsrOworICAgIH0KKworICAgIGlmIChkZXZfYmFzZVtpdC0+YmFzZV9pZHhdID09IE5VTEwpIHsKKyAgICAgIGl0LT52aWRlb19pZHggPSAwOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGV2aWNlID0gZ19zdHJkdXBfcHJpbnRmICgiJXMlZCIsIGRldl9iYXNlW2l0LT5iYXNlX2lkeF0sIGl0LT52aWRlb19pZHgpOworCisgICAgaWYgKGdfZmlsZV90ZXN0IChkZXZpY2UsIEdfRklMRV9URVNUX0VYSVNUUykpIHsKKyAgICAgIGl0LT5wYXJlbnQuZGV2aWNlX3BhdGggPSBkZXZpY2U7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBnX2ZyZWUgKGRldmljZSk7CisgICAgZGV2aWNlID0gTlVMTDsKKyAgfQorCisgIHJldHVybiBpdC0+cGFyZW50LmRldmljZV9wYXRoICE9IE5VTEw7Cit9CisKK3ZvaWQKK2dzdF92NGwyX2l0ZXJhdG9yX2ZyZWUgKEdzdFY0bDJJdGVyYXRvciAqIF9pdCkKK3sKKyAgc3RydWN0IF9Hc3RWNGwyRnNJdGVyYXRvciAqaXQgPSAoc3RydWN0IF9Hc3RWNGwyRnNJdGVyYXRvciAqKSBfaXQ7CisgIGdfZnJlZSAoKGdjaGFyICopIGl0LT5wYXJlbnQuZGV2aWNlX3BhdGgpOworICBnX3NsaWNlX2ZyZWUgKHN0cnVjdCBfR3N0VjRsMkZzSXRlcmF0b3IsIGl0KTsKK30KKworI2VuZGlmCisKK3ZvaWQKK2dzdF92NGwyX2NsZWFyX2Vycm9yIChHc3RWNGwyRXJyb3IgKiB2NGwyZXJyKQoreworICBpZiAodjRsMmVycikgeworICAgIGdfY2xlYXJfZXJyb3IgKCZ2NGwyZXJyLT5lcnJvcik7CisgICAgZ19mcmVlICh2NGwyZXJyLT5kYmdfbWVzc2FnZSk7CisgICAgdjRsMmVyci0+ZGJnX21lc3NhZ2UgPSBOVUxMOworICB9Cit9CisKK3ZvaWQKK2dzdF92NGwyX2Vycm9yIChncG9pbnRlciBlbGVtZW50LCBHc3RWNGwyRXJyb3IgKiB2NGwyZXJyKQoreworICBHRXJyb3IgKmVycm9yOworCisgIGlmICghdjRsMmVyciB8fCAhdjRsMmVyci0+ZXJyb3IpCisgICAgcmV0dXJuOworCisgIGVycm9yID0gdjRsMmVyci0+ZXJyb3I7CisKKyAgaWYgKGVycm9yLT5tZXNzYWdlKQorICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZWxlbWVudCwgImVycm9yOiAlcyIsIGVycm9yLT5tZXNzYWdlKTsKKworICBpZiAodjRsMmVyci0+ZGJnX21lc3NhZ2UpCisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbGVtZW50LCAiZXJyb3I6ICVzIiwgdjRsMmVyci0+ZGJnX21lc3NhZ2UpOworCisgIGdzdF9lbGVtZW50X21lc3NhZ2VfZnVsbCAoR1NUX0VMRU1FTlQgKGVsZW1lbnQpLCBHU1RfTUVTU0FHRV9FUlJPUiwKKyAgICAgIGVycm9yLT5kb21haW4sIGVycm9yLT5jb2RlLCBlcnJvci0+bWVzc2FnZSwgdjRsMmVyci0+ZGJnX21lc3NhZ2UsCisgICAgICB2NGwyZXJyLT5maWxlLCB2NGwyZXJyLT5mdW5jLCB2NGwyZXJyLT5saW5lKTsKKworICBlcnJvci0+bWVzc2FnZSA9IE5VTEw7CisgIHY0bDJlcnItPmRiZ19tZXNzYWdlID0gTlVMTDsKKworICBnc3RfdjRsMl9jbGVhcl9lcnJvciAodjRsMmVycik7Cit9CmRpZmYgLS1naXQgYS9zeXMvdjRsMi92NGwyLXV0aWxzLmggYi9zeXMvdjRsMi92NGwyLXV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjMDA2MgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL3Y0bDItdXRpbHMuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IENvbGxhYm9yYSBMdGQuCisgKiAgICAgQXV0aG9yOiBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfX1Y0TDJfVVRJTFNfSF9fCisjZGVmaW5lIF9fVjRMMl9VVElMU19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9WNEwyX0VSUk9SX0lOSVQgeyBOVUxMLCBOVUxMIH0KKyNkZWZpbmUgR1NUX1Y0TDJfRVJST1IodjRsMmVycixkb21haW4sY29kZSxtc2csZGJnKSBcCit7XAorICBpZiAodjRsMmVycikgeyBcCisgICAgZ2NoYXIgKl9tc2cgPSBfZ3N0X2VsZW1lbnRfZXJyb3JfcHJpbnRmIG1zZzsgXAorICAgIHY0bDJlcnItPmVycm9yID0gZ19lcnJvcl9uZXdfbGl0ZXJhbCAoR1NUXyMjZG9tYWluIyNfRVJST1IsIFwKKyAgICAgICAgR1NUXyMjZG9tYWluIyNfRVJST1JfIyNjb2RlLCBfbXNnKTsgXAorICAgIGdfZnJlZSAoX21zZyk7IFwKKyAgICB2NGwyZXJyLT5kYmdfbWVzc2FnZSA9IF9nc3RfZWxlbWVudF9lcnJvcl9wcmludGYgZGJnOyBcCisgICAgdjRsMmVyci0+ZmlsZSA9IF9fRklMRV9fOyBcCisgICAgdjRsMmVyci0+ZnVuYyA9IEdTVF9GVU5DVElPTjsgXAorICAgIHY0bDJlcnItPmxpbmUgPSBfX0xJTkVfXzsgXAorICB9IFwKK30KKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJJdGVyYXRvciBHc3RWNGwySXRlcmF0b3I7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMkVycm9yIEdzdFY0bDJFcnJvcjsKKworc3RydWN0IF9Hc3RWNGwySXRlcmF0b3IKK3sKKyAgICBjb25zdCBnY2hhciAqZGV2aWNlX3BhdGg7CisgICAgY29uc3QgZ2NoYXIgKmRldmljZV9uYW1lOworICAgIGNvbnN0IGdjaGFyICpzeXNfcGF0aDsKK307CisKK3N0cnVjdCBfR3N0VjRsMkVycm9yCit7CisgICAgR0Vycm9yICplcnJvcjsKKyAgICBnY2hhciAqZGJnX21lc3NhZ2U7CisgICAgY29uc3QgZ2NoYXIgKmZpbGU7CisgICAgY29uc3QgZ2NoYXIgKmZ1bmM7CisgICAgZ2ludCBsaW5lOworfTsKKworR3N0VjRsMkl0ZXJhdG9yICogIGdzdF92NGwyX2l0ZXJhdG9yX25ldyAodm9pZCk7CitnYm9vbGVhbiAgICAgICAgICAgZ3N0X3Y0bDJfaXRlcmF0b3JfbmV4dCAoR3N0VjRsMkl0ZXJhdG9yICppdCk7Cit2b2lkICAgICAgICAgICAgICAgZ3N0X3Y0bDJfaXRlcmF0b3JfZnJlZSAoR3N0VjRsMkl0ZXJhdG9yICppdCk7CisKK2NvbnN0IGdjaGFyICogICAgICBnc3RfdjRsMl9pdGVyYXRvcl9nZXRfZGV2aWNlX3BhdGggKEdzdFY0bDJJdGVyYXRvciAqaXQpOworY29uc3QgZ2NoYXIgKiAgICAgIGdzdF92NGwyX2l0ZXJhdG9yX2dldF9kZXZpY2VfbmFtZSAoR3N0VjRsMkl0ZXJhdG9yICppdCk7Citjb25zdCBnY2hhciAqICAgICAgZ3N0X3Y0bDJfaXRlcmF0b3JfZ2V0X3N5c19wYXRoIChHc3RWNGwySXRlcmF0b3IgKml0KTsKKwordm9pZCAgICAgICAgICAgICAgIGdzdF92NGwyX2NsZWFyX2Vycm9yIChHc3RWNGwyRXJyb3IgKmVycm9yKTsKK3ZvaWQgICAgICAgICAgICAgICBnc3RfdjRsMl9lcnJvciAoZ3BvaW50ZXIgZWxlbWVudCwgR3N0VjRsMkVycm9yICplcnJvcik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX1Y0TDJfVVRJTFNfSF9fICovCisKKwpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvdjRsMl9jYWxscy5jIGIvc3lzL3Y0bDIvdjRsMl9jYWxscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZmM4MjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi92NGwyX2NhbGxzLmMKQEAgLTAsMCArMSwxMTM5IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogICAgICAgICAgICAgICAyMDA2IEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+CisgKgorICogdjRsMl9jYWxscy5jIC0gZ2VuZXJpYyBWNEwyIGNhbGxzIGhhbmRsaW5nCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZmRlZiBfX3N1bgorLyogTmVlZGVkIG9uIG9sZGVyIFNvbGFyaXMgTmV2YWRhIGJ1aWxkcyAoNzIgYXQgbGVhc3QpICovCisjaW5jbHVkZSA8c3Ryb3B0cy5oPgorI2luY2x1ZGUgPHN5cy9pb2Njb20uaD4KKyNlbmRpZgorI2luY2x1ZGUgImdzdHY0bDJvYmplY3QuaCIKKyNpbmNsdWRlICJnc3R2NGwydHVuZXIuaCIKKyNpbmNsdWRlICJnc3R2NGwyY29sb3JiYWxhbmNlLmgiCisKKyNpbmNsdWRlICJnc3R2NGwyc3JjLmgiCisjaW5jbHVkZSAiZ3N0djRsMnNpbmsuaCIKKyNpbmNsdWRlICJnc3R2NGwydmlkZW9kZWMuaCIKKworI2luY2x1ZGUgImdzdC9nc3QtaTE4bi1wbHVnaW4uaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX0VYVEVSTiAodjRsMl9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCB2NGwyX2RlYnVnCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdzdF92NGwyX2dldF9jYXBhYmlsaXRpZXMoKToKKyAqICAgZ2V0IHRoZSBkZXZpY2UncyBjYXB0dXJpbmcgY2FwYWJpbGl0aWVzCisgKiByZXR1cm4gdmFsdWU6IFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZXJyb3IKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX2dldF9jYXBhYmlsaXRpZXMgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KQoreworICBHc3RFbGVtZW50ICplOworCisgIGUgPSB2NGwyb2JqZWN0LT5lbGVtZW50OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGUsICJnZXR0aW5nIGNhcGFiaWxpdGllcyIpOworCisgIGlmICghR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19RVUVSWUNBUCwKKyAgICAgICAgICAmdjRsMm9iamVjdC0+dmNhcCkgPCAwKQorICAgIGdvdG8gY2FwX2ZhaWxlZDsKKworICBpZiAodjRsMm9iamVjdC0+dmNhcC5jYXBhYmlsaXRpZXMgJiBWNEwyX0NBUF9ERVZJQ0VfQ0FQUykKKyAgICB2NGwyb2JqZWN0LT5kZXZpY2VfY2FwcyA9IHY0bDJvYmplY3QtPnZjYXAuZGV2aWNlX2NhcHM7CisgIGVsc2UKKyAgICB2NGwyb2JqZWN0LT5kZXZpY2VfY2FwcyA9IHY0bDJvYmplY3QtPnZjYXAuY2FwYWJpbGl0aWVzOworCisgIEdTVF9MT0dfT0JKRUNUIChlLCAiZHJpdmVyOiAgICAgICclcyciLCB2NGwyb2JqZWN0LT52Y2FwLmRyaXZlcik7CisgIEdTVF9MT0dfT0JKRUNUIChlLCAiY2FyZDogICAgICAgICclcyciLCB2NGwyb2JqZWN0LT52Y2FwLmNhcmQpOworICBHU1RfTE9HX09CSkVDVCAoZSwgImJ1c19pbmZvOiAgICAnJXMnIiwgdjRsMm9iamVjdC0+dmNhcC5idXNfaW5mbyk7CisgIEdTVF9MT0dfT0JKRUNUIChlLCAidmVyc2lvbjogICAgICUwOHgiLCB2NGwyb2JqZWN0LT52Y2FwLnZlcnNpb24pOworICBHU1RfTE9HX09CSkVDVCAoZSwgImNhcGFiaWxpdGVzOiAlMDh4IiwgdjRsMm9iamVjdC0+ZGV2aWNlX2NhcHMpOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworY2FwX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh2NGwyb2JqZWN0LT5lbGVtZW50LCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6ICIKKyAgICAgICAgICAgICAgICAiSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgaXQgaXMgYSB2NGwxIGRyaXZlci4iKSwKKyAgICAgICAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2KSwgR1NUX0VSUk9SX1NZU1RFTSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZSB2aWRlbzRsaW51eCBjb21tYW5kIGxpbmUgdG9vbCB2NGwyLWN0cmwKKyAqIG5vcm1hbGlzZXMgdGhlIG5hbWVzIG9mIHRoZSBjb250cm9scyByZWNlaXZlZCBmcm9tCisgKiB0aGUga2VybmVsIGxpa2U6CisgKgorICogICAgICJFeHBvc3VyZSAoYWJzb2x1dGUpIiAtPiAiZXhwb3N1cmVfYWJzb2x1dGUiCisgKgorICogV2UgZm9sbG93IHRoZWlyIGxlYWQgaGVyZS4gIEBuYW1lIGlzIG1vZGlmaWVkCisgKiBpbi1wbGFjZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfbm9ybWFsaXNlX2NvbnRyb2xfbmFtZSAoZ2NoYXIgKiBuYW1lKQoreworICBpbnQgaSwgajsKKyAgZm9yIChpID0gMCwgaiA9IDA7IG5hbWVbal07ICsraikgeworICAgIGlmIChnX2FzY2lpX2lzYWxudW0gKG5hbWVbal0pKSB7CisgICAgICBpZiAoaSA+IDAgJiYgIWdfYXNjaWlfaXNhbG51bSAobmFtZVtqIC0gMV0pKQorICAgICAgICBuYW1lW2krK10gPSAnXyc7CisgICAgICBuYW1lW2krK10gPSBnX2FzY2lpX3RvbG93ZXIgKG5hbWVbal0pOworICAgIH0KKyAgfQorICBuYW1lW2krK10gPSAnXDAnOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnc3RfdjRsMl9lbXB0eV9saXN0cygpIGFuZCBnc3RfdjRsMl9maWxsX2xpc3RzKCk6CisgKiAgIGZpbGwvZW1wdHkgdGhlIGxpc3RzIG9mIGVudW1lcmF0aW9ucworICogcmV0dXJuIHZhbHVlOiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGVycm9yCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl9maWxsX2xpc3RzIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCkKK3sKKyAgZ2ludCBuLCBuZXh0OworICBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgY29udHJvbCA9IHsgMCwgfTsKKworICBHc3RFbGVtZW50ICplOworCisgIGUgPSB2NGwyb2JqZWN0LT5lbGVtZW50OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGUsICJnZXR0aW5nIGVudW1lcmF0aW9ucyIpOworICBHU1RfVjRMMl9DSEVDS19PUEVOICh2NGwyb2JqZWN0KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChlLCAiICBjaGFubmVscyIpOworICAvKiBhbmQgbm93LCB0aGUgY2hhbm5lbHMgKi8KKyAgZm9yIChuID0gMDs7IG4rKykgeworICAgIHN0cnVjdCB2NGwyX2lucHV0IGlucHV0OworICAgIEdzdFY0bDJUdW5lckNoYW5uZWwgKnY0bDJjaGFubmVsOworICAgIEdzdFR1bmVyQ2hhbm5lbCAqY2hhbm5lbDsKKworICAgIG1lbXNldCAoJmlucHV0LCAwLCBzaXplb2YgKGlucHV0KSk7CisKKyAgICBpbnB1dC5pbmRleCA9IG47CisgICAgaWYgKHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX0VOVU1JTlBVVCwgJmlucHV0KSA8IDApIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5WQUwgfHwgZXJybm8gPT0gRU5PVFRZKQorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgZW51bWVyYXRpb24gKi8KKyAgICAgIGVsc2UgeworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZSwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAgICAgKF8oIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIpLAorICAgICAgICAgICAgICAgIG4sIHY0bDJvYmplY3QtPnZpZGVvZGV2KSwKKyAgICAgICAgICAgICgiRmFpbGVkIHRvIGdldCAlZCBpbiBpbnB1dCBlbnVtZXJhdGlvbiBmb3IgJXMuICglZCAtICVzKSIsCisgICAgICAgICAgICAgICAgbiwgdjRsMm9iamVjdC0+dmlkZW9kZXYsIGVycm5vLCBzdHJlcnJvciAoZXJybm8pKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBHU1RfTE9HX09CSkVDVCAoZSwgIiAgIGluZGV4OiAgICAgJWQiLCBpbnB1dC5pbmRleCk7CisgICAgR1NUX0xPR19PQkpFQ1QgKGUsICIgICBuYW1lOiAgICAgICclcyciLCBpbnB1dC5uYW1lKTsKKyAgICBHU1RfTE9HX09CSkVDVCAoZSwgIiAgIHR5cGU6ICAgICAgJTA4eCIsIGlucHV0LnR5cGUpOworICAgIEdTVF9MT0dfT0JKRUNUIChlLCAiICAgYXVkaW9zZXQ6ICAlMDh4IiwgaW5wdXQuYXVkaW9zZXQpOworICAgIEdTVF9MT0dfT0JKRUNUIChlLCAiICAgc3RkOiAgICAgICAlMDE2IiBHX0dJTlQ2NF9NT0RJRklFUiAieCIsCisgICAgICAgIChndWludDY0KSBpbnB1dC5zdGQpOworICAgIEdTVF9MT0dfT0JKRUNUIChlLCAiICAgc3RhdHVzOiAgICAlMDh4IiwgaW5wdXQuc3RhdHVzKTsKKworICAgIHY0bDJjaGFubmVsID0gZ19vYmplY3RfbmV3IChHU1RfVFlQRV9WNEwyX1RVTkVSX0NIQU5ORUwsIE5VTEwpOworICAgIGNoYW5uZWwgPSBHU1RfVFVORVJfQ0hBTk5FTCAodjRsMmNoYW5uZWwpOworICAgIGNoYW5uZWwtPmxhYmVsID0gZ19zdHJkdXAgKChjb25zdCBnY2hhciAqKSBpbnB1dC5uYW1lKTsKKyAgICBjaGFubmVsLT5mbGFncyA9IEdTVF9UVU5FUl9DSEFOTkVMX0lOUFVUOworICAgIHY0bDJjaGFubmVsLT5pbmRleCA9IG47CisKKyAgICBpZiAoaW5wdXQudHlwZSA9PSBWNEwyX0lOUFVUX1RZUEVfVFVORVIpIHsKKyAgICAgIHN0cnVjdCB2NGwyX3R1bmVyIHZ0dW47CisKKyAgICAgIHY0bDJjaGFubmVsLT50dW5lciA9IGlucHV0LnR1bmVyOworICAgICAgY2hhbm5lbC0+ZmxhZ3MgfD0gR1NUX1RVTkVSX0NIQU5ORUxfRlJFUVVFTkNZOworCisgICAgICB2dHVuLmluZGV4ID0gaW5wdXQudHVuZXI7CisgICAgICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfR19UVU5FUiwgJnZ0dW4pIDwgMCkgeworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZSwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAgICAgKF8oIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iKSwKKyAgICAgICAgICAgICAgICBpbnB1dC50dW5lciwgdjRsMm9iamVjdC0+dmlkZW9kZXYpLCBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICAgICAgZ19vYmplY3RfdW5yZWYgKEdfT0JKRUNUIChjaGFubmVsKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKworICAgICAgY2hhbm5lbC0+ZnJlcV9tdWx0aXBsaWNhdG9yID0KKyAgICAgICAgICA2Mi41ICogKCh2dHVuLmNhcGFiaWxpdHkgJiBWNEwyX1RVTkVSX0NBUF9MT1cpID8gMSA6IDEwMDApOworICAgICAgY2hhbm5lbC0+bWluX2ZyZXF1ZW5jeSA9IHZ0dW4ucmFuZ2Vsb3cgKiBjaGFubmVsLT5mcmVxX211bHRpcGxpY2F0b3I7CisgICAgICBjaGFubmVsLT5tYXhfZnJlcXVlbmN5ID0gdnR1bi5yYW5nZWhpZ2ggKiBjaGFubmVsLT5mcmVxX211bHRpcGxpY2F0b3I7CisgICAgICBjaGFubmVsLT5taW5fc2lnbmFsID0gMDsKKyAgICAgIGNoYW5uZWwtPm1heF9zaWduYWwgPSAweGZmZmY7CisgICAgfQorICAgIGlmIChpbnB1dC5hdWRpb3NldCkgeworICAgICAgLyogd2UgdGFrZSB0aGUgZmlyc3QuIFdlIGRvbid0IGNhcmUgZm9yCisgICAgICAgKiB0aGUgb3RoZXJzIGZvciBub3cgKi8KKyAgICAgIHdoaWxlICghKGlucHV0LmF1ZGlvc2V0ICYgKDEgPDwgdjRsMmNoYW5uZWwtPmF1ZGlvKSkpCisgICAgICAgIHY0bDJjaGFubmVsLT5hdWRpbysrOworICAgICAgY2hhbm5lbC0+ZmxhZ3MgfD0gR1NUX1RVTkVSX0NIQU5ORUxfQVVESU87CisgICAgfQorCisgICAgdjRsMm9iamVjdC0+Y2hhbm5lbHMgPQorICAgICAgICBnX2xpc3RfcHJlcGVuZCAodjRsMm9iamVjdC0+Y2hhbm5lbHMsIChncG9pbnRlcikgY2hhbm5lbCk7CisgIH0KKyAgdjRsMm9iamVjdC0+Y2hhbm5lbHMgPSBnX2xpc3RfcmV2ZXJzZSAodjRsMm9iamVjdC0+Y2hhbm5lbHMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGUsICIgIG5vcm1zIik7CisgIC8qIG5vcm1zLi4uICovCisgIGZvciAobiA9IDA7OyBuKyspIHsKKyAgICBzdHJ1Y3QgdjRsMl9zdGFuZGFyZCBzdGFuZGFyZCA9IHsgMCwgfTsKKyAgICBHc3RWNGwyVHVuZXJOb3JtICp2NGwybm9ybTsKKworICAgIEdzdFR1bmVyTm9ybSAqbm9ybTsKKworICAgIC8qIGZpbGwgaW4gZGVmYXVsdHMgKi8KKyAgICBzdGFuZGFyZC5mcmFtZXBlcmlvZC5udW1lcmF0b3IgPSAxOworICAgIHN0YW5kYXJkLmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yID0gMDsKKyAgICBzdGFuZGFyZC5pbmRleCA9IG47CisKKyAgICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfRU5VTVNURCwgJnN0YW5kYXJkKSA8IDApIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5WQUwgfHwgZXJybm8gPT0gRU5PVFRZKQorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgZW51bWVyYXRpb24gKi8KKyNpZmRlZiBFTk9EQVRBCisgICAgICBlbHNlIGlmIChlcnJubyA9PSBFTk9EQVRBKQorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgZW51bWVyYXRpb24sIGFzIG9mIExpbnV4IDMuNy1yYzEgKi8KKyNlbmRpZgorICAgICAgZWxzZSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChlLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgICAgICAoXygiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIiksCisgICAgICAgICAgICAgICAgdjRsMm9iamVjdC0+dmlkZW9kZXYpLAorICAgICAgICAgICAgKCJGYWlsZWQgdG8gZ2V0IGF0dHJpYnV0ZXMgZm9yIG5vcm0gJWQgb24gZGV2aWRlICclcycuICglZCAtICVzKSIsCisgICAgICAgICAgICAgICAgbiwgdjRsMm9iamVjdC0+dmlkZW9kZXYsIGVycm5vLCBzdHJlcnJvciAoZXJybm8pKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChlLCAiICAgICclcycsIGZwczogJWQgLyAlZCIsCisgICAgICAgIHN0YW5kYXJkLm5hbWUsIHN0YW5kYXJkLmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yLAorICAgICAgICBzdGFuZGFyZC5mcmFtZXBlcmlvZC5udW1lcmF0b3IpOworCisgICAgdjRsMm5vcm0gPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX1Y0TDJfVFVORVJfTk9STSwgTlVMTCk7CisgICAgbm9ybSA9IEdTVF9UVU5FUl9OT1JNICh2NGwybm9ybSk7CisgICAgbm9ybS0+bGFiZWwgPSBnX3N0cmR1cCAoKGNvbnN0IGdjaGFyICopIHN0YW5kYXJkLm5hbWUpOworICAgIGdzdF92YWx1ZV9zZXRfZnJhY3Rpb24gKCZub3JtLT5mcmFtZXJhdGUsCisgICAgICAgIHN0YW5kYXJkLmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yLCBzdGFuZGFyZC5mcmFtZXBlcmlvZC5udW1lcmF0b3IpOworICAgIHY0bDJub3JtLT5pbmRleCA9IHN0YW5kYXJkLmlkOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgImluZGV4PSUwOHgsIGxhYmVsPSVzIiwKKyAgICAgICAgKHVuc2lnbmVkIGludCkgdjRsMm5vcm0tPmluZGV4LCBub3JtLT5sYWJlbCk7CisKKyAgICB2NGwyb2JqZWN0LT5ub3JtcyA9IGdfbGlzdF9wcmVwZW5kICh2NGwyb2JqZWN0LT5ub3JtcywgKGdwb2ludGVyKSBub3JtKTsKKyAgfQorICB2NGwyb2JqZWN0LT5ub3JtcyA9IGdfbGlzdF9yZXZlcnNlICh2NGwyb2JqZWN0LT5ub3Jtcyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZSwgIiAgY29udHJvbHMrbWVudXMiKTsKKworICAvKiBhbmQgbGFzdGx5LCBjb250cm9scyttZW51cyAoaWYgYXBwcm9wcmlhdGUpICovCisgIG5leHQgPSBWNEwyX0NUUkxfRkxBR19ORVhUX0NUUkw7CisgIG4gPSAwOworICBjb250cm9sLmlkID0gbmV4dDsKKworICB3aGlsZSAoVFJVRSkgeworICAgIEdzdFY0bDJDb2xvckJhbGFuY2VDaGFubmVsICp2NGwyY2hhbm5lbDsKKyAgICBHc3RDb2xvckJhbGFuY2VDaGFubmVsICpjaGFubmVsOworCisgICAgaWYgKCFuZXh0KQorICAgICAgbisrOworCisgIHJldHJ5OgorICAgIC8qIHdoZW4gd2UgcmVhY2hlZCB0aGUgbGFzdCBvZmZpY2lhbCBDSUQsIGNvbnRpbnVlIHdpdGggcHJpdmF0ZSBDSURzICovCisgICAgaWYgKG4gPT0gVjRMMl9DSURfTEFTVFAxKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChlLCAiY2hlY2tpbmcgcHJpdmF0ZSBDSURzIik7CisgICAgICBuID0gVjRMMl9DSURfUFJJVkFURV9CQVNFOworICAgIH0KKyAgICBHU1RfREVCVUdfT0JKRUNUIChlLCAiY2hlY2tpbmcgY29udHJvbCAlMDh4Iiwgbik7CisKKyAgICBjb250cm9sLmlkID0gbiB8IG5leHQ7CisgICAgaWYgKHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX1FVRVJZQ1RSTCwKKyAgICAgICAgICAgICZjb250cm9sKSA8IDApIHsKKyAgICAgIGlmIChuZXh0KSB7CisgICAgICAgIGlmIChuID4gMCkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGUsICJjb250cm9scyBmaW5pc2hlZCIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGUsICJWNEwyX0NUUkxfRkxBR19ORVhUX0NUUkwgbm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgICBuZXh0ID0gMDsKKyAgICAgICAgICBuID0gVjRMMl9DSURfQkFTRTsKKyAgICAgICAgICBnb3RvIHJldHJ5OworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZXJybm8gPT0gRUlOVkFMIHx8IGVycm5vID09IEVOT1RUWSB8fCBlcnJubyA9PSBFSU8gfHwgZXJybm8gPT0gRU5PRU5UKSB7CisgICAgICAgIGlmIChuIDwgVjRMMl9DSURfUFJJVkFURV9CQVNFKSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZSwgInNraXBwaW5nIGNvbnRyb2wgJTA4eCIsIG4pOworICAgICAgICAgIC8qIGNvbnRpbnVlIHNvIHRoYXQgd2UgYWxzbyBjaGVjayBwcml2YXRlIGNvbnRyb2xzICovCisgICAgICAgICAgbiA9IFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSAtIDE7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZSwgImNvbnRyb2xzIGZpbmlzaGVkIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZSwgIkZhaWxlZCBxdWVyeWluZyBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiAiCisgICAgICAgICAgICAiKCVkIC0gJXMpIiwgbiwgdjRsMm9iamVjdC0+dmlkZW9kZXYsIGVycm5vLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorICAgIC8qIGJvZ3VzIGRyaXZlciBtaWdodCBtZXNzIHdpdGggaWQgaW4gdW5leHBlY3RlZCB3YXlzIChlLmcuIHNldCB0byAwKSwgc28KKyAgICAgKiBtYWtlIHN1cmUgdG8gc2ltcGx5IHRyeSBhbGwgaWYgVjRMMl9DVFJMX0ZMQUdfTkVYVF9DVFJMIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICBpZiAobmV4dCkKKyAgICAgIG4gPSBjb250cm9sLmlkOworICAgIGlmIChjb250cm9sLmZsYWdzICYgVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGUsICJza2lwcGluZyBkaXNhYmxlZCBjb250cm9sIik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAoY29udHJvbC50eXBlID09IFY0TDJfQ1RSTF9UWVBFX0NUUkxfQ0xBU1MpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGUsICJzdGFydGluZyBjb250cm9sIGNsYXNzICclcyciLCBjb250cm9sLm5hbWUpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgc3dpdGNoIChjb250cm9sLnR5cGUpIHsKKyAgICAgIGNhc2UgVjRMMl9DVFJMX1RZUEVfSU5URUdFUjoKKyAgICAgIGNhc2UgVjRMMl9DVFJMX1RZUEVfQk9PTEVBTjoKKyAgICAgIGNhc2UgVjRMMl9DVFJMX1RZUEVfTUVOVToKKyAgICAgIGNhc2UgVjRMMl9DVFJMX1RZUEVfSU5URUdFUl9NRU5VOgorICAgICAgY2FzZSBWNEwyX0NUUkxfVFlQRV9CSVRNQVNLOgorICAgICAgY2FzZSBWNEwyX0NUUkxfVFlQRV9CVVRUT046eworICAgICAgICBjb250cm9sLm5hbWVbMzFdID0gJ1wwJzsKKyAgICAgICAgZ3N0X3Y0bDJfbm9ybWFsaXNlX2NvbnRyb2xfbmFtZSAoKGdjaGFyICopIGNvbnRyb2wubmFtZSk7CisgICAgICAgIGdfZGF0YWxpc3RfaWRfc2V0X2RhdGEgKCZ2NGwyb2JqZWN0LT5jb250cm9scywKKyAgICAgICAgICAgIGdfcXVhcmtfZnJvbV9zdHJpbmcgKChjb25zdCBnY2hhciAqKSBjb250cm9sLm5hbWUpLAorICAgICAgICAgICAgR0lOVF9UT19QT0lOVEVSIChuKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZSwKKyAgICAgICAgICAgICJDb250cm9sIHR5cGUgZm9yICclcycgbm90IHN1cHBvcmVkIGZvciBleHRyYSBjb250cm9scy4iLAorICAgICAgICAgICAgY29udHJvbC5uYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoIChuKSB7CisgICAgICBjYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisgICAgICBjYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorICAgICAgY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorICAgICAgY2FzZSBWNEwyX0NJRF9IVUU6CisgICAgICBjYXNlIFY0TDJfQ0lEX0JMQUNLX0xFVkVMOgorICAgICAgY2FzZSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0U6CisgICAgICBjYXNlIFY0TDJfQ0lEX0RPX1dISVRFX0JBTEFOQ0U6CisgICAgICBjYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgorICAgICAgY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6CisgICAgICBjYXNlIFY0TDJfQ0lEX0dBTU1BOgorICAgICAgY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKKyAgICAgIGNhc2UgVjRMMl9DSURfQVVUT0dBSU46CisgICAgICBjYXNlIFY0TDJfQ0lEX0dBSU46CisgICAgICBjYXNlIFY0TDJfQ0lEX1NIQVJQTkVTUzoKKyAgICAgICAgLyogd2Ugb25seSBoYW5kbGUgdGhlc2UgZm9yIG5vdyAod2h5PykgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFY0TDJfQ0lEX0hGTElQOgorICAgICAgY2FzZSBWNEwyX0NJRF9WRkxJUDoKKyAgICAgIGNhc2UgVjRMMl9DSURfUEFOX1JFU0VUOgorICAgICAgY2FzZSBWNEwyX0NJRF9USUxUX1JFU0VUOgorICAgICAgICAvKiBub3QgaGFuZGxlZCBoZXJlLCBoYW5kbGVkIGJ5IFZpZGVvT3JpZW50YXRpb24gaW50ZXJmYWNlICovCisgICAgICAgIGNvbnRyb2wuaWQrKzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKKyAgICAgIGNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRToKKyAgICAgIGNhc2UgVjRMMl9DSURfQVVESU9fQkFTUzoKKyAgICAgIGNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgorICAgICAgY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorICAgICAgY2FzZSBWNEwyX0NJRF9BVURJT19MT1VETkVTUzoKKyAgICAgICAgLyogRklYTUU6IFdlIHNob3VsZCBpbXBsZW1lbnQgR3N0TWl4ZXIgaW50ZXJmYWNlIGluc3RlYWQgKi8KKyAgICAgICAgLyogYnV0IGxldCdzIG5vdCBiZSBwZWRhbnRpYyBhbmQgbWFrZSBlbGVtZW50IG1vcmUgdXNlZnVsIGZvciBub3cgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFY0TDJfQ0lEX0FMUEhBX0NPTVBPTkVOVDoKKyAgICAgICAgdjRsMm9iamVjdC0+aGFzX2FscGhhX2NvbXBvbmVudCA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZSwKKyAgICAgICAgICAgICJDb250cm9sSUQgJXMgKCV4KSB1bmhhbmRsZWQsIEZJWE1FIiwgY29udHJvbC5uYW1lLCBuKTsKKyAgICAgICAgY29udHJvbC5pZCsrOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKG4gIT0gY29udHJvbC5pZCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZSwgIkFkZGluZyBDb250cm9sSUQgJXMgKCV4KSIsIGNvbnRyb2wubmFtZSwgbik7CisgICAgdjRsMmNoYW5uZWwgPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX1Y0TDJfQ09MT1JfQkFMQU5DRV9DSEFOTkVMLCBOVUxMKTsKKyAgICBjaGFubmVsID0gR1NUX0NPTE9SX0JBTEFOQ0VfQ0hBTk5FTCAodjRsMmNoYW5uZWwpOworICAgIGNoYW5uZWwtPmxhYmVsID0gZ19zdHJkdXAgKChjb25zdCBnY2hhciAqKSBjb250cm9sLm5hbWUpOworICAgIHY0bDJjaGFubmVsLT5pZCA9IG47CisKKyNpZiAwCisgICAgLyogRklYTUU6IGl0IHdpbGwgYmUgbmVlZCBqdXN0IHdoZW4gaGFuZGxpbmcgcHJpdmF0ZSBjb250cm9scworICAgICAqKGN1cnJlbnRseSBub25lIG9mIGJhc2UgY29udHJvbHMgYXJlIG9mIHRoaXMgdHlwZSkgKi8KKyAgICBpZiAoY29udHJvbC50eXBlID09IFY0TDJfQ1RSTF9UWVBFX01FTlUpIHsKKyAgICAgIHN0cnVjdCB2NGwyX3F1ZXJ5bWVudSBtZW51LCAqbXB0cjsKKworICAgICAgaW50IGk7CisKKyAgICAgIG1lbnUuaWQgPSBuOworICAgICAgZm9yIChpID0gMDs7IGkrKykgeworICAgICAgICBtZW51LmluZGV4ID0gaTsKKyAgICAgICAgaWYgKHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX1FVRVJZTUVOVSwKKyAgICAgICAgICAgICAgICAmbWVudSkgPCAwKSB7CisgICAgICAgICAgaWYgKGVycm5vID09IEVJTlZBTCkKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgLyogZW5kIG9mIGVudW1lcmF0aW9uICovCisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZSwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAgICAgICAgIChfKCJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIpLAorICAgICAgICAgICAgICAgICAgICB2NGwyb2JqZWN0LT52aWRlb2RldiksCisgICAgICAgICAgICAgICAgKCJGYWlsZWQgdG8gZ2V0ICVkIGluIG1lbnUgZW51bWVyYXRpb24gZm9yICVzLiAoJWQgLSAlcykiLAorICAgICAgICAgICAgICAgICAgICBuLCB2NGwyb2JqZWN0LT52aWRlb2RldiwgZXJybm8sIHN0cmVycm9yIChlcnJubykpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbXB0ciA9IGdfbWFsbG9jIChzaXplb2YgKG1lbnUpKTsKKyAgICAgICAgbWVtY3B5IChtcHRyLCAmbWVudSwgc2l6ZW9mIChtZW51KSk7CisgICAgICAgIG1lbnVzID0gZ19saXN0X2FwcGVuZCAobWVudXMsIG1wdHIpOworICAgICAgfQorICAgIH0KKyAgICB2NGwyb2JqZWN0LT5tZW51cyA9IGdfbGlzdF9hcHBlbmQgKHY0bDJvYmplY3QtPm1lbnVzLCBtZW51cyk7CisjZW5kaWYKKworICAgIHN3aXRjaCAoY29udHJvbC50eXBlKSB7CisgICAgICBjYXNlIFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI6CisgICAgICAgIGNoYW5uZWwtPm1pbl92YWx1ZSA9IGNvbnRyb2wubWluaW11bTsKKyAgICAgICAgY2hhbm5lbC0+bWF4X3ZhbHVlID0gY29udHJvbC5tYXhpbXVtOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVjRMMl9DVFJMX1RZUEVfQk9PTEVBTjoKKyAgICAgICAgY2hhbm5lbC0+bWluX3ZhbHVlID0gRkFMU0U7CisgICAgICAgIGNoYW5uZWwtPm1heF92YWx1ZSA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgLyogRklYTUUgd2Ugc2hvdWxkIGZpbmQgb3V0IGhvdyB0byBoYW5kbGUgVjRMMl9DVFJMX1RZUEVfQlVUVE9OLgorICAgICAgICAgICBCVVRUT04gY29udHJvbHMgbGlrZSBWNEwyX0NJRF9ET19XSElURV9CQUxBTkNFIGNhbiBqdXN0IGJlIHNldCAoMSkgb3IKKyAgICAgICAgICAgdW5zZXQgKDApLCBidXQgY2FuJ3QgYmUgcXVlcmllZCAqLworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChlLAorICAgICAgICAgICAgIkNvbnRyb2wgd2l0aCBub24gc3VwcG9ydGVkIHR5cGUgJXMgKCV4KSwgdHlwZT0lZCIsCisgICAgICAgICAgICBjb250cm9sLm5hbWUsIG4sIGNvbnRyb2wudHlwZSk7CisgICAgICAgIGNoYW5uZWwtPm1pbl92YWx1ZSA9IGNoYW5uZWwtPm1heF92YWx1ZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHY0bDJvYmplY3QtPmNvbG9ycyA9CisgICAgICAgIGdfbGlzdF9wcmVwZW5kICh2NGwyb2JqZWN0LT5jb2xvcnMsIChncG9pbnRlcikgY2hhbm5lbCk7CisgIH0KKyAgdjRsMm9iamVjdC0+Y29sb3JzID0gZ19saXN0X3JldmVyc2UgKHY0bDJvYmplY3QtPmNvbG9ycyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZSwgImRvbmUiKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2VtcHR5X2xpc3RzIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCkKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgImRlbGV0aW5nIGVudW1lcmF0aW9ucyIpOworCisgIGdfbGlzdF9mb3JlYWNoICh2NGwyb2JqZWN0LT5jaGFubmVscywgKEdGdW5jKSBnX29iamVjdF91bnJlZiwgTlVMTCk7CisgIGdfbGlzdF9mcmVlICh2NGwyb2JqZWN0LT5jaGFubmVscyk7CisgIHY0bDJvYmplY3QtPmNoYW5uZWxzID0gTlVMTDsKKworICBnX2xpc3RfZm9yZWFjaCAodjRsMm9iamVjdC0+bm9ybXMsIChHRnVuYykgZ19vYmplY3RfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAodjRsMm9iamVjdC0+bm9ybXMpOworICB2NGwyb2JqZWN0LT5ub3JtcyA9IE5VTEw7CisKKyAgZ19saXN0X2ZvcmVhY2ggKHY0bDJvYmplY3QtPmNvbG9ycywgKEdGdW5jKSBnX29iamVjdF91bnJlZiwgTlVMTCk7CisgIGdfbGlzdF9mcmVlICh2NGwyb2JqZWN0LT5jb2xvcnMpOworICB2NGwyb2JqZWN0LT5jb2xvcnMgPSBOVUxMOworCisgIGdfZGF0YWxpc3RfY2xlYXIgKCZ2NGwyb2JqZWN0LT5jb250cm9scyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9hZGp1c3RfYnVmX3R5cGUgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KQoreworICAvKiB3aGVuIGNhbGxpbmcgZ3N0X3Y0bDJfb2JqZWN0X25ldyB0aGUgdXNlciBkZWNpZGVzIHRoZSBpbml0aWFsIHR5cGUKKyAgICogc28gYWRqdXN0IGl0IGlmIG11bHRpLXBsYW5hciBpcyBzdXBwb3J0ZWQKKyAgICogdGhlIGRyaXZlciBzaG91bGQgbWFrZSBpdCBleGNsdXNpdmUuIFNvIHRoZSBkcml2ZXIgc2hvdWxkCisgICAqIG5vdCBzdXBwb3J0IGJvdGggTVBMQU5FIGFuZCBub24tUExBTkUuCisgICAqIEJlY2F1c2UgZXZlbiB3aGVuIHVzaW5nIE1QTEFORSBpdCBzdGlsbCBwb3NzaWJsZXMgdG8gdXNlIGl0CisgICAqIGluIGEgY29udGlndW91cyBtYW5uZXIuIEluIHRoaXMgY2FzZSB0aGUgZmlyc3QgdjRsMiBwbGFuZQorICAgKiBjb250YWlucyBhbGwgdGhlIGdzdCBwbGFuZXMuCisgICAqLworICBzd2l0Y2ggKHY0bDJvYmplY3QtPnR5cGUpIHsKKyAgICBjYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOgorICAgICAgaWYgKHY0bDJvYmplY3QtPmRldmljZV9jYXBzICYKKyAgICAgICAgICAoVjRMMl9DQVBfVklERU9fT1VUUFVUX01QTEFORSB8IFY0TDJfQ0FQX1ZJREVPX00yTV9NUExBTkUpKSB7CisgICAgICAgIEdTVF9ERUJVRyAoImFkanVzdCB0eXBlIHRvIG11bHRpLXBsYW5hciBvdXRwdXQiKTsKKyAgICAgICAgdjRsMm9iamVjdC0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorICAgICAgaWYgKHY0bDJvYmplY3QtPmRldmljZV9jYXBzICYKKyAgICAgICAgICAoVjRMMl9DQVBfVklERU9fQ0FQVFVSRV9NUExBTkUgfCBWNEwyX0NBUF9WSURFT19NMk1fTVBMQU5FKSkgeworICAgICAgICBHU1RfREVCVUcgKCJhZGp1c3QgdHlwZSB0byBtdWx0aS1wbGFuYXIgY2FwdHVyZSIpOworICAgICAgICB2NGwyb2JqZWN0LT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnc3RfdjRsMl9vcGVuKCk6CisgKiAgIG9wZW4gdGhlIHZpZGVvIGRldmljZSAodjRsMm9iamVjdC0+dmlkZW9kZXYpCisgKiByZXR1cm4gdmFsdWU6IFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZXJyb3IKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitnYm9vbGVhbgorZ3N0X3Y0bDJfb3BlbiAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpCit7CisgIHN0cnVjdCBzdGF0IHN0OworICBpbnQgbGlidjRsMl9mZCA9IC0xOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJUcnlpbmcgdG8gb3BlbiBkZXZpY2UgJXMiLAorICAgICAgdjRsMm9iamVjdC0+dmlkZW9kZXYpOworCisgIEdTVF9WNEwyX0NIRUNLX05PVF9PUEVOICh2NGwyb2JqZWN0KTsKKyAgR1NUX1Y0TDJfQ0hFQ0tfTk9UX0FDVElWRSAodjRsMm9iamVjdCk7CisKKyAgLyogYmUgc3VyZSB3ZSBoYXZlIGEgZGV2aWNlICovCisgIGlmICghdjRsMm9iamVjdC0+dmlkZW9kZXYpCisgICAgdjRsMm9iamVjdC0+dmlkZW9kZXYgPSBnX3N0cmR1cCAoIi9kZXYvdmlkZW8iKTsKKworICAvKiBjaGVjayBpZiBpdCBpcyBhIGRldmljZSAqLworICBpZiAoc3RhdCAodjRsMm9iamVjdC0+dmlkZW9kZXYsICZzdCkgPT0gLTEpCisgICAgZ290byBzdGF0X2ZhaWxlZDsKKworICBpZiAoIVNfSVNDSFIgKHN0LnN0X21vZGUpKQorICAgIGdvdG8gbm9fZGV2aWNlOworCisgIC8qIG9wZW4gdGhlIGRldmljZSAqLworICB2NGwyb2JqZWN0LT52aWRlb19mZCA9CisgICAgICBvcGVuICh2NGwyb2JqZWN0LT52aWRlb2RldiwgT19SRFdSIC8qIHwgT19OT05CTE9DSyAqLyApOworCisgIGlmICghR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCkpCisgICAgZ290byBub3Rfb3BlbjsKKworI2lmZGVmIEhBVkVfTElCVjRMMgorICBpZiAodjRsMm9iamVjdC0+ZmRfb3BlbikKKyAgICBsaWJ2NGwyX2ZkID0gdjRsMm9iamVjdC0+ZmRfb3BlbiAodjRsMm9iamVjdC0+dmlkZW9fZmQsCisgICAgICAgIFY0TDJfRU5BQkxFX0VOVU1fRk1UX0VNVUxBVElPTik7CisjZW5kaWYKKworICAvKiBOb3RlIHRoZSB2NGwyX3h4eCBmdW5jdGlvbnMgYXJlIGRlc2lnbmVkIHNvIHRoYXQgaWYgdGhleSBnZXQgcGFzc2VkIGFuCisgICAgIHVua25vd24gZmQsIHRoZSB3aWxsIGJlaGF2ZSBleGFjdGx5IGFzIHRoZWlyIHJlZ3VsYXIgeHh4IGNvdW50ZXJwYXJ0cywgc28KKyAgICAgaWYgdjRsMl9mZF9vcGVuIGZhaWxzLCB3ZSBjb250aW51ZSBhcyBub3JtYWwgKG1pc3NpbmcgdGhlIGxpYnY0bDIgY3VzdG9tCisgICAgIGNhbSBmb3JtYXQgdG8gbm9ybWFsIGZvcm1hdHMgY29udmVyc2lvbikuIENoYW5jZXMgYXJlIGJpZyB3ZSB3aWxsIHN0aWxsCisgICAgIGZhaWwgdGhlbiB0aG91Z2gsIGFzIG5vcm1hbGx5IHY0bDJfZmRfb3BlbiBvbmx5IGZhaWxzIGlmIHRoZSBkZXZpY2UgaXMgbm90CisgICAgIGEgdjRsMiBkZXZpY2UuICovCisgIGlmIChsaWJ2NGwyX2ZkICE9IC0xKQorICAgIHY0bDJvYmplY3QtPnZpZGVvX2ZkID0gbGlidjRsMl9mZDsKKworICAvKiBnZXQgY2FwYWJpbGl0aWVzLCBlcnJvciB3aWxsIGJlIHBvc3RlZCAqLworICBpZiAoIWdzdF92NGwyX2dldF9jYXBhYmlsaXRpZXMgKHY0bDJvYmplY3QpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogZG8gd2UgbmVlZCB0byBiZSBhIGNhcHR1cmUgZGV2aWNlPyAqLworICBpZiAoR1NUX0lTX1Y0TDJTUkMgKHY0bDJvYmplY3QtPmVsZW1lbnQpICYmCisgICAgICAhKHY0bDJvYmplY3QtPmRldmljZV9jYXBzICYgKFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAorICAgICAgICAgICAgICBWNEwyX0NBUF9WSURFT19DQVBUVVJFX01QTEFORSkpKQorICAgIGdvdG8gbm90X2NhcHR1cmU7CisKKyAgaWYgKEdTVF9JU19WNEwyU0lOSyAodjRsMm9iamVjdC0+ZWxlbWVudCkgJiYKKyAgICAgICEodjRsMm9iamVjdC0+ZGV2aWNlX2NhcHMgJiAoVjRMMl9DQVBfVklERU9fT1VUUFVUIHwKKyAgICAgICAgICAgICAgVjRMMl9DQVBfVklERU9fT1VUUFVUX01QTEFORSkpKQorICAgIGdvdG8gbm90X291dHB1dDsKKworICBpZiAoR1NUX0lTX1Y0TDJfVklERU9fREVDICh2NGwyb2JqZWN0LT5lbGVtZW50KSAmJgorICAgICAgLyogVG9kYXkncyBNMk0gZGV2aWNlIG9ubHkgZXhwb3NlIE0yTSAqLworICAgICAgISgodjRsMm9iamVjdC0+ZGV2aWNlX2NhcHMgJiAoVjRMMl9DQVBfVklERU9fTTJNIHwKKyAgICAgICAgICAgICAgICAgIFY0TDJfQ0FQX1ZJREVPX00yTV9NUExBTkUpKSB8fAorICAgICAgICAgIC8qIEJ1dCBsZWdhY3kgZHJpdmVyIG1heSBleHBvc2UgYm90aCBDQVBUVVJFIGFuZCBPVVRQVVQgKi8KKyAgICAgICAgICAoKHY0bDJvYmplY3QtPmRldmljZV9jYXBzICYKKyAgICAgICAgICAgICAgICAgIChWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfVklERU9fQ0FQVFVSRV9NUExBTkUpKSAmJgorICAgICAgICAgICAgICAodjRsMm9iamVjdC0+ZGV2aWNlX2NhcHMgJgorICAgICAgICAgICAgICAgICAgKFY0TDJfQ0FQX1ZJREVPX09VVFBVVCB8IFY0TDJfQ0FQX1ZJREVPX09VVFBVVF9NUExBTkUpKSkpKQorICAgIGdvdG8gbm90X20ybTsKKworICBnc3RfdjRsMl9hZGp1c3RfYnVmX3R5cGUgKHY0bDJvYmplY3QpOworCisgIC8qIGNyZWF0ZSBlbnVtZXJhdGlvbnMsIHBvc3RzIGVycm9ycy4gKi8KKyAgaWYgKCFnc3RfdjRsMl9maWxsX2xpc3RzICh2NGwyb2JqZWN0KSkKKyAgICBnb3RvIGVycm9yOworCisgIEdTVF9JTkZPX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICJPcGVuZWQgZGV2aWNlICclcycgKCVzKSBzdWNjZXNzZnVsbHkiLAorICAgICAgdjRsMm9iamVjdC0+dmNhcC5jYXJkLCB2NGwyb2JqZWN0LT52aWRlb2Rldik7CisKKyAgaWYgKHY0bDJvYmplY3QtPmV4dHJhX2NvbnRyb2xzKQorICAgIGdzdF92NGwyX3NldF9jb250cm9scyAodjRsMm9iamVjdCwgdjRsMm9iamVjdC0+ZXh0cmFfY29udHJvbHMpOworCisgIC8qIFVWQyBkZXZpY2VzIGFyZSBuZXZlciBpbnRlcmxhY2VkLCBhbmQgZG9pbmcgVklESU9DX1RSWV9GTVQgb24gdGhlbQorICAgKiBjYXVzZXMgZXhwZW5zaXZlIGFuZCBzbG93IFVTQiBJTywgc28gZG9uJ3QgcHJvYmUgdGhlbSBmb3IgaW50ZXJsYWNlZAorICAgKi8KKyAgaWYgKCFzdHJjbXAgKChjaGFyICopIHY0bDJvYmplY3QtPnZjYXAuZHJpdmVyLCAidXZjdXNiIikgfHwKKyAgICAgICFzdHJjbXAgKChjaGFyICopIHY0bDJvYmplY3QtPnZjYXAuZHJpdmVyLCAidXZjdmlkZW8iKSkgeworICAgIHY0bDJvYmplY3QtPm5ldmVyX2ludGVybGFjZWQgPSBUUlVFOworICB9CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitzdGF0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh2NGwyb2JqZWN0LT5lbGVtZW50LCBSRVNPVVJDRSwgTk9UX0ZPVU5ELAorICAgICAgICAoXygiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIpLCB2NGwyb2JqZWN0LT52aWRlb2RldiksCisgICAgICAgIEdTVF9FUlJPUl9TWVNURU0pOworICAgIGdvdG8gZXJyb3I7CisgIH0KK25vX2RldmljZToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh2NGwyb2JqZWN0LT5lbGVtZW50LCBSRVNPVVJDRSwgTk9UX0ZPVU5ELAorICAgICAgICAoXygiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIpLCB2NGwyb2JqZWN0LT52aWRlb2RldiksCisgICAgICAgIEdTVF9FUlJPUl9TWVNURU0pOworICAgIGdvdG8gZXJyb3I7CisgIH0KK25vdF9vcGVuOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHY0bDJvYmplY3QtPmVsZW1lbnQsIFJFU09VUkNFLCBPUEVOX1JFQURfV1JJVEUsCisgICAgICAgIChfKCJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iKSwKKyAgICAgICAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2KSwgR1NUX0VSUk9SX1NZU1RFTSk7CisgICAgZ290byBlcnJvcjsKKyAgfQorbm90X2NhcHR1cmU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAodjRsMm9iamVjdC0+ZWxlbWVudCwgUkVTT1VSQ0UsIE5PVF9GT1VORCwKKyAgICAgICAgKF8oIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIpLAorICAgICAgICAgICAgdjRsMm9iamVjdC0+dmlkZW9kZXYpLAorICAgICAgICAoIkNhcGFiaWxpdGllczogMHgleCIsIHY0bDJvYmplY3QtPmRldmljZV9jYXBzKSk7CisgICAgZ290byBlcnJvcjsKKyAgfQorbm90X291dHB1dDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh2NGwyb2JqZWN0LT5lbGVtZW50LCBSRVNPVVJDRSwgTk9UX0ZPVU5ELAorICAgICAgICAoXygiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iKSwKKyAgICAgICAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2KSwKKyAgICAgICAgKCJDYXBhYmlsaXRpZXM6IDB4JXgiLCB2NGwyb2JqZWN0LT5kZXZpY2VfY2FwcykpOworICAgIGdvdG8gZXJyb3I7CisgIH0KK25vdF9tMm06CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAodjRsMm9iamVjdC0+ZWxlbWVudCwgUkVTT1VSQ0UsIE5PVF9GT1VORCwKKyAgICAgICAgKF8oIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIiksCisgICAgICAgICAgICB2NGwyb2JqZWN0LT52aWRlb2RldiksCisgICAgICAgICgiQ2FwYWJpbGl0aWVzOiAweCV4IiwgdjRsMm9iamVjdC0+ZGV2aWNlX2NhcHMpKTsKKyAgICBnb3RvIGVycm9yOworICB9CitlcnJvcjoKKyAgeworICAgIGlmIChHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSkgeworICAgICAgLyogY2xvc2UgZGV2aWNlICovCisgICAgICB2NGwyb2JqZWN0LT5jbG9zZSAodjRsMm9iamVjdC0+dmlkZW9fZmQpOworICAgICAgdjRsMm9iamVjdC0+dmlkZW9fZmQgPSAtMTsKKyAgICB9CisgICAgLyogZW1wdHkgbGlzdHMgKi8KKyAgICBnc3RfdjRsMl9lbXB0eV9saXN0cyAodjRsMm9iamVjdCk7CisKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF92NGwyX2R1cCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIEdzdFY0bDJPYmplY3QgKiBvdGhlcikKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgIlRyeWluZyB0byBkdXAgZGV2aWNlICVzIiwKKyAgICAgIG90aGVyLT52aWRlb2Rldik7CisKKyAgR1NUX1Y0TDJfQ0hFQ0tfT1BFTiAob3RoZXIpOworICBHU1RfVjRMMl9DSEVDS19OT1RfT1BFTiAodjRsMm9iamVjdCk7CisgIEdTVF9WNEwyX0NIRUNLX05PVF9BQ1RJVkUgKG90aGVyKTsKKyAgR1NUX1Y0TDJfQ0hFQ0tfTk9UX0FDVElWRSAodjRsMm9iamVjdCk7CisKKyAgdjRsMm9iamVjdC0+dmNhcCA9IG90aGVyLT52Y2FwOworICB2NGwyb2JqZWN0LT5kZXZpY2VfY2FwcyA9IG90aGVyLT5kZXZpY2VfY2FwczsKKyAgZ3N0X3Y0bDJfYWRqdXN0X2J1Zl90eXBlICh2NGwyb2JqZWN0KTsKKworICB2NGwyb2JqZWN0LT52aWRlb19mZCA9IHY0bDJvYmplY3QtPmR1cCAob3RoZXItPnZpZGVvX2ZkKTsKKyAgaWYgKCFHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSkKKyAgICBnb3RvIG5vdF9vcGVuOworCisgIGdfZnJlZSAodjRsMm9iamVjdC0+dmlkZW9kZXYpOworICB2NGwyb2JqZWN0LT52aWRlb2RldiA9IGdfc3RyZHVwIChvdGhlci0+dmlkZW9kZXYpOworCisgIEdTVF9JTkZPX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICJDbG9uZWQgZGV2aWNlICclcycgKCVzKSBzdWNjZXNzZnVsbHkiLAorICAgICAgdjRsMm9iamVjdC0+dmNhcC5jYXJkLCB2NGwyb2JqZWN0LT52aWRlb2Rldik7CisKKyAgdjRsMm9iamVjdC0+bmV2ZXJfaW50ZXJsYWNlZCA9IG90aGVyLT5uZXZlcl9pbnRlcmxhY2VkOworCisgIHJldHVybiBUUlVFOworCitub3Rfb3BlbjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh2NGwyb2JqZWN0LT5lbGVtZW50LCBSRVNPVVJDRSwgT1BFTl9SRUFEX1dSSVRFLAorICAgICAgICAoXygiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iKSwKKyAgICAgICAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2KSwgR1NUX0VSUk9SX1NZU1RFTSk7CisKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnc3RfdjRsMl9jbG9zZSgpOgorICogICBjbG9zZSB0aGUgdmlkZW8gZGV2aWNlICh2NGwyb2JqZWN0LT52aWRlb19mZCkKKyAqIHJldHVybiB2YWx1ZTogVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBlcnJvcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2dib29sZWFuCitnc3RfdjRsMl9jbG9zZSAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJUcnlpbmcgdG8gY2xvc2UgJXMiLAorICAgICAgdjRsMm9iamVjdC0+dmlkZW9kZXYpOworCisgIEdTVF9WNEwyX0NIRUNLX09QRU4gKHY0bDJvYmplY3QpOworICBHU1RfVjRMMl9DSEVDS19OT1RfQUNUSVZFICh2NGwyb2JqZWN0KTsKKworICAvKiBjbG9zZSBkZXZpY2UgKi8KKyAgdjRsMm9iamVjdC0+Y2xvc2UgKHY0bDJvYmplY3QtPnZpZGVvX2ZkKTsKKyAgdjRsMm9iamVjdC0+dmlkZW9fZmQgPSAtMTsKKworICAvKiBlbXB0eSBsaXN0cyAqLworICBnc3RfdjRsMl9lbXB0eV9saXN0cyAodjRsMm9iamVjdCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ3N0X3Y0bDJfZ2V0X25vcm0oKQorICogICBHZXQgdGhlIG5vcm0gb2YgdGhlIGN1cnJlbnQgZGV2aWNlCisgKiByZXR1cm4gdmFsdWU6IFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZXJyb3IKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitnYm9vbGVhbgorZ3N0X3Y0bDJfZ2V0X25vcm0gKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCB2NGwyX3N0ZF9pZCAqIG5vcm0pCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJnZXR0aW5nIG5vcm0iKTsKKworICBpZiAoIUdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfR19TVEQsIG5vcm0pIDwgMCkKKyAgICBnb3RvIHN0ZF9mYWlsZWQ7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitzdGRfZmFpbGVkOgorICB7CisgICAgR1NUX0RFQlVHICgiRmFpbGVkIHRvIGdldCB0aGUgY3VycmVudCBub3JtIGZvciBkZXZpY2UgJXMiLAorICAgICAgICB2NGwyb2JqZWN0LT52aWRlb2Rldik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ3N0X3Y0bDJfc2V0X25vcm0oKQorICogICBTZXQgdGhlIG5vcm0gb2YgdGhlIGN1cnJlbnQgZGV2aWNlCisgKiByZXR1cm4gdmFsdWU6IFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZXJyb3IKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitnYm9vbGVhbgorZ3N0X3Y0bDJfc2V0X25vcm0gKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCB2NGwyX3N0ZF9pZCBub3JtKQoreworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAidHJ5aW5nIHRvIHNldCBub3JtIHRvICIKKyAgICAgICIlIiBHX0dJTlQ2NF9NT0RJRklFUiAieCIsIChndWludDY0KSBub3JtKTsKKworICBpZiAoIUdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfU19TVEQsICZub3JtKSA8IDApCisgICAgZ290byBzdGRfZmFpbGVkOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworc3RkX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHY0bDJvYmplY3QtPmVsZW1lbnQsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIiksCisgICAgICAgICAgICB2NGwyb2JqZWN0LT52aWRlb2RldiksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnc3RfdjRsMl9nZXRfZnJlcXVlbmN5KCk6CisgKiAgIGdldCB0aGUgY3VycmVudCBmcmVxdWVuY3kKKyAqIHJldHVybiB2YWx1ZTogVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBlcnJvcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2dib29sZWFuCitnc3RfdjRsMl9nZXRfZnJlcXVlbmN5IChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBnaW50IHR1bmVybnVtLCBndWxvbmcgKiBmcmVxdWVuY3kpCit7CisgIHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSBmcmVxID0geyAwLCB9OworCisgIEdzdFR1bmVyQ2hhbm5lbCAqY2hhbm5lbDsKKworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiZ2V0dGluZyBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSIpOworCisgIGlmICghR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGNoYW5uZWwgPSBnc3RfdHVuZXJfZ2V0X2NoYW5uZWwgKEdTVF9UVU5FUiAodjRsMm9iamVjdC0+ZWxlbWVudCkpOworCisgIGZyZXEudHVuZXIgPSB0dW5lcm51bTsKKyAgaWYgKHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX0dfRlJFUVVFTkNZLCAmZnJlcSkgPCAwKQorICAgIGdvdG8gZnJlcV9mYWlsZWQ7CisKKyAgKmZyZXF1ZW5jeSA9IGZyZXEuZnJlcXVlbmN5ICogY2hhbm5lbC0+ZnJlcV9tdWx0aXBsaWNhdG9yOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworZnJlcV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HICh2NGwyb2JqZWN0LT5lbGVtZW50LCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iKSwKKyAgICAgICAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2KSwgR1NUX0VSUk9SX1NZU1RFTSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ3N0X3Y0bDJfc2V0X2ZyZXF1ZW5jeSgpOgorICogICBzZXQgZnJlcXVlbmN5CisgKiByZXR1cm4gdmFsdWU6IFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZXJyb3IKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitnYm9vbGVhbgorZ3N0X3Y0bDJfc2V0X2ZyZXF1ZW5jeSAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgZ2ludCB0dW5lcm51bSwgZ3Vsb25nIGZyZXF1ZW5jeSkKK3sKKyAgc3RydWN0IHY0bDJfZnJlcXVlbmN5IGZyZXEgPSB7IDAsIH07CisKKyAgR3N0VHVuZXJDaGFubmVsICpjaGFubmVsOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAic2V0dGluZyBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSB0byAlbHUiLCBmcmVxdWVuY3kpOworCisgIGlmICghR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGNoYW5uZWwgPSBnc3RfdHVuZXJfZ2V0X2NoYW5uZWwgKEdTVF9UVU5FUiAodjRsMm9iamVjdC0+ZWxlbWVudCkpOworCisgIGZyZXEudHVuZXIgPSB0dW5lcm51bTsKKyAgLyogZmlsbCBpbiB0eXBlIC0gaWdub3JlIGVycm9yICovCisgICh2b2lkKSB2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19HX0ZSRVFVRU5DWSwgJmZyZXEpOworICBmcmVxLmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeSAvIGNoYW5uZWwtPmZyZXFfbXVsdGlwbGljYXRvcjsKKworICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfU19GUkVRVUVOQ1ksICZmcmVxKSA8IDApCisgICAgZ290byBmcmVxX2ZhaWxlZDsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2ZyZXFfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAodjRsMm9iamVjdC0+ZWxlbWVudCwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoXygiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIpLAorICAgICAgICAgICAgdjRsMm9iamVjdC0+dmlkZW9kZXYsIGZyZXF1ZW5jeSksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnc3RfdjRsMl9zaWduYWxfc3RyZW5ndGgoKToKKyAqICAgZ2V0IHRoZSBzdHJlbmd0aCBvZiB0aGUgc2lnbmFsIG9uIHRoZSBjdXJyZW50IGlucHV0CisgKiByZXR1cm4gdmFsdWU6IFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZXJyb3IKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitnYm9vbGVhbgorZ3N0X3Y0bDJfc2lnbmFsX3N0cmVuZ3RoIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBnaW50IHR1bmVybnVtLCBndWxvbmcgKiBzaWduYWxfc3RyZW5ndGgpCit7CisgIHN0cnVjdCB2NGwyX3R1bmVyIHR1bmVyID0geyAwLCB9OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJ0cnlpbmcgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCIpOworCisgIGlmICghR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHR1bmVyLmluZGV4ID0gdHVuZXJudW07CisgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19HX1RVTkVSLCAmdHVuZXIpIDwgMCkKKyAgICBnb3RvIHR1bmVyX2ZhaWxlZDsKKworICAqc2lnbmFsX3N0cmVuZ3RoID0gdHVuZXIuc2lnbmFsOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLwordHVuZXJfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAodjRsMm9iamVjdC0+ZWxlbWVudCwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoXygiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIpLAorICAgICAgICAgICAgdjRsMm9iamVjdC0+dmlkZW9kZXYpLCBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ3N0X3Y0bDJfZ2V0X2F0dHJpYnV0ZSgpOgorICogICB0cnkgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBvbmUgc3BlY2lmaWMgYXR0cmlidXRlCisgKiByZXR1cm4gdmFsdWU6IFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZXJyb3IKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitnYm9vbGVhbgorZ3N0X3Y0bDJfZ2V0X2F0dHJpYnV0ZSAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgaW50IGF0dHJpYnV0ZV9udW0sIGludCAqdmFsdWUpCit7CisgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbCA9IHsgMCwgfTsKKworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiZ2V0dGluZyB2YWx1ZSBvZiBhdHRyaWJ1dGUgJWQiLAorICAgICAgYXR0cmlidXRlX251bSk7CisKKyAgaWYgKCFHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgY29udHJvbC5pZCA9IGF0dHJpYnV0ZV9udW07CisKKyAgaWYgKHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX0dfQ1RSTCwgJmNvbnRyb2wpIDwgMCkKKyAgICBnb3RvIGN0cmxfZmFpbGVkOworCisgICp2YWx1ZSA9IGNvbnRyb2wudmFsdWU7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitjdHJsX2ZhaWxlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMm9iamVjdCwKKyAgICAgICAgXygiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iKSwKKyAgICAgICAgYXR0cmlidXRlX251bSwgdjRsMm9iamVjdC0+dmlkZW9kZXYpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdzdF92NGwyX3NldF9hdHRyaWJ1dGUoKToKKyAqICAgdHJ5IHRvIHNldCB0aGUgdmFsdWUgb2Ygb25lIHNwZWNpZmljIGF0dHJpYnV0ZQorICogcmV0dXJuIHZhbHVlOiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGVycm9yCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZ2Jvb2xlYW4KK2dzdF92NGwyX3NldF9hdHRyaWJ1dGUgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIGludCBhdHRyaWJ1dGVfbnVtLCBjb25zdCBpbnQgdmFsdWUpCit7CisgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbCA9IHsgMCwgfTsKKworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAic2V0dGluZyB2YWx1ZSBvZiBhdHRyaWJ1dGUgJWQgdG8gJWQiLAorICAgICAgYXR0cmlidXRlX251bSwgdmFsdWUpOworCisgIGlmICghR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGNvbnRyb2wuaWQgPSBhdHRyaWJ1dGVfbnVtOworICBjb250cm9sLnZhbHVlID0gdmFsdWU7CisgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19TX0NUUkwsICZjb250cm9sKSA8IDApCisgICAgZ290byBjdHJsX2ZhaWxlZDsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2N0cmxfZmFpbGVkOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyb2JqZWN0LAorICAgICAgICBfKCJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIpLAorICAgICAgICB2YWx1ZSwgYXR0cmlidXRlX251bSwgdjRsMm9iamVjdC0+dmlkZW9kZXYpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3NldF9jb250cm9sIChHUXVhcmsgZmllbGRfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFY0bDJPYmplY3QgKnY0bDJvYmplY3QgPSB1c2VyX2RhdGE7CisgIEdRdWFyayBub3JtYWxpc2VkX2ZpZWxkX2lkOworICBncG9pbnRlciAqZDsKKworICAvKiAzMiBieXRlcyBpcyB0aGUgbWF4aW11bSBzaXplIGZvciBhIGNvbnRyb2wgbmFtZSBhY2NvcmRpbmcgdG8gdjRsMiAqLworICBnY2hhciBuYW1lWzMyXTsKKworICAvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eTogaW4gdGhlIHBhc3QgR1N0cmVhbWVyIHdvdWxkIG5vcm1hbGlzZSBzdHJpbmdzIGluCisgICAgIGEgc3VidGx5IGRpZmZlcmVudCB3YXkgdG8gdjRsMi1jdGwuICBlLmcuIHRoZSBrZXJuZWwncyAiRm9jdXMgKGFic29sdXRlKSIKKyAgICAgd291bGQgYmVjb21lICJmb2N1c19fYWJzb2x1dGVfIiB3aGVyZWFzIG5vdyBpdCBiZWNvbWVzICJmb2N1c19hYnNvbHV0ZSIuCisgICAgIFBsZWFzZSByZW1vdmUgdGhlIGZvbGxvd2luZyBpbiBHU3RyZWFtZXIgMS41IGZvciAxLjYgKi8KKyAgc3RybmNweSAobmFtZSwgZ19xdWFya190b19zdHJpbmcgKGZpZWxkX2lkKSwgc2l6ZW9mIChuYW1lKSk7CisgIG5hbWVbMzFdID0gJ1wwJzsKKyAgZ3N0X3Y0bDJfbm9ybWFsaXNlX2NvbnRyb2xfbmFtZSAobmFtZSk7CisgIG5vcm1hbGlzZWRfZmllbGRfaWQgPSBnX3F1YXJrX2Zyb21fc3RyaW5nIChuYW1lKTsKKyAgaWYgKG5vcm1hbGlzZWRfZmllbGRfaWQgIT0gZmllbGRfaWQpCisgICAgZ193YXJuaW5nICgiSW4gR1N0cmVhbWVyIDEuNCB0aGUgd2F5IFY0TDIgY29udHJvbCBuYW1lcyB3ZXJlIG5vcm1hbGlzZWQgIgorICAgICAgICAiY2hhbmdlZC4gIEluc3RlYWQgb2Ygc2V0dGluZyBcIiVzXCIgcGxlYXNlIHVzZSBcIiVzXCIuICBUaGUgZm9ybWVyIGlzICIKKyAgICAgICAgImRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIEdTdHJlYW1lciIsCisgICAgICAgIGdfcXVhcmtfdG9fc3RyaW5nIChmaWVsZF9pZCksIG5hbWUpOworICBmaWVsZF9pZCA9IG5vcm1hbGlzZWRfZmllbGRfaWQ7CisKKyAgZCA9IGdfZGF0YWxpc3RfaWRfZ2V0X2RhdGEgKCZ2NGwyb2JqZWN0LT5jb250cm9scywgZmllbGRfaWQpOworICBpZiAoIWQpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJvYmplY3QsCisgICAgICAgICJDb250cm9sICclcycgZG9lcyBub3QgZXhpc3Qgb3IgaGFzIGFuIHVuc3VwcG9ydGVkIHR5cGUuIiwKKyAgICAgICAgZ19xdWFya190b19zdHJpbmcgKGZpZWxkX2lkKSk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFHX1ZBTFVFX0hPTERTICh2YWx1ZSwgR19UWVBFX0lOVCkpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJvYmplY3QsCisgICAgICAgICInaW50JyB2YWx1ZSBleHBlY3RlZCBmb3IgY29udHJvbCAnJXMnLiIsIGdfcXVhcmtfdG9fc3RyaW5nIChmaWVsZF9pZCkpOworICAgIHJldHVybiBUUlVFOworICB9CisgIGdzdF92NGwyX3NldF9hdHRyaWJ1dGUgKHY0bDJvYmplY3QsIEdQT0lOVEVSX1RPX0lOVCAoZCksCisgICAgICBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKSk7CisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgorZ3N0X3Y0bDJfc2V0X2NvbnRyb2xzIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgR3N0U3RydWN0dXJlICogY29udHJvbHMpCit7CisgIHJldHVybiBnc3Rfc3RydWN0dXJlX2ZvcmVhY2ggKGNvbnRyb2xzLCBzZXRfY29udHJvbCwgdjRsMm9iamVjdCk7Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl9nZXRfaW5wdXQgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBnaW50ICogaW5wdXQpCit7CisgIGdpbnQgbjsKKworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAidHJ5aW5nIHRvIGdldCBpbnB1dCIpOworCisgIGlmICghR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19HX0lOUFVULCAmbikgPCAwKQorICAgIGdvdG8gaW5wdXRfZmFpbGVkOworCisgICppbnB1dCA9IG47CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgImlucHV0OiAlZCIsIG4pOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworaW5wdXRfZmFpbGVkOgorICBpZiAodjRsMm9iamVjdC0+ZGV2aWNlX2NhcHMgJiBWNEwyX0NBUF9UVU5FUikgeworICAgIC8qIG9ubHkgZ2l2ZSBhIHdhcm5pbmcgbWVzc2FnZSBpZiBkcml2ZXIgYWN0dWFsbHkgY2xhaW1zIHRvIGhhdmUgdHVuZXIKKyAgICAgKiBzdXBwb3J0CisgICAgICovCisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAodjRsMm9iamVjdC0+ZWxlbWVudCwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoXygiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiKSwgdjRsMm9iamVjdC0+dmlkZW9kZXYpLCBHU1RfRVJST1JfU1lTVEVNKTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl9zZXRfaW5wdXQgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBnaW50IGlucHV0KQoreworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAidHJ5aW5nIHRvIHNldCBpbnB1dCB0byAlZCIsIGlucHV0KTsKKworICBpZiAoIUdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfU19JTlBVVCwgJmlucHV0KSA8IDApCisgICAgZ290byBpbnB1dF9mYWlsZWQ7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitpbnB1dF9mYWlsZWQ6CisgIGlmICh2NGwyb2JqZWN0LT5kZXZpY2VfY2FwcyAmIFY0TDJfQ0FQX1RVTkVSKSB7CisgICAgLyogb25seSBnaXZlIGEgd2FybmluZyBtZXNzYWdlIGlmIGRyaXZlciBhY3R1YWxseSBjbGFpbXMgdG8gaGF2ZSB0dW5lcgorICAgICAqIHN1cHBvcnQKKyAgICAgKi8KKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HICh2NGwyb2JqZWN0LT5lbGVtZW50LCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iKSwKKyAgICAgICAgICAgIGlucHV0LCB2NGwyb2JqZWN0LT52aWRlb2RldiksIEdTVF9FUlJPUl9TWVNURU0pOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworZ2Jvb2xlYW4KK2dzdF92NGwyX2dldF9vdXRwdXQgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBnaW50ICogb3V0cHV0KQoreworICBnaW50IG47CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgInRyeWluZyB0byBnZXQgb3V0cHV0Iik7CisKKyAgaWYgKCFHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX0dfT1VUUFVULCAmbikgPCAwKQorICAgIGdvdG8gb3V0cHV0X2ZhaWxlZDsKKworICAqb3V0cHV0ID0gbjsKKworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAib3V0cHV0OiAlZCIsIG4pOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworb3V0cHV0X2ZhaWxlZDoKKyAgaWYgKHY0bDJvYmplY3QtPmRldmljZV9jYXBzICYgVjRMMl9DQVBfVFVORVIpIHsKKyAgICAvKiBvbmx5IGdpdmUgYSB3YXJuaW5nIG1lc3NhZ2UgaWYgZHJpdmVyIGFjdHVhbGx5IGNsYWltcyB0byBoYXZlIHR1bmVyCisgICAgICogc3VwcG9ydAorICAgICAqLworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHY0bDJvYmplY3QtPmVsZW1lbnQsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIpLCB2NGwyb2JqZWN0LT52aWRlb2RldiksIEdTVF9FUlJPUl9TWVNURU0pOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworZ2Jvb2xlYW4KK2dzdF92NGwyX3NldF9vdXRwdXQgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBnaW50IG91dHB1dCkKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgInRyeWluZyB0byBzZXQgb3V0cHV0IHRvICVkIiwgb3V0cHV0KTsKKworICBpZiAoIUdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfU19PVVRQVVQsICZvdXRwdXQpIDwgMCkKKyAgICBnb3RvIG91dHB1dF9mYWlsZWQ7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitvdXRwdXRfZmFpbGVkOgorICBpZiAodjRsMm9iamVjdC0+ZGV2aWNlX2NhcHMgJiBWNEwyX0NBUF9UVU5FUikgeworICAgIC8qIG9ubHkgZ2l2ZSBhIHdhcm5pbmcgbWVzc2FnZSBpZiBkcml2ZXIgYWN0dWFsbHkgY2xhaW1zIHRvIGhhdmUgdHVuZXIKKyAgICAgKiBzdXBwb3J0CisgICAgICovCisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAodjRsMm9iamVjdC0+ZWxlbWVudCwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoXygiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIpLAorICAgICAgICAgICAgb3V0cHV0LCB2NGwyb2JqZWN0LT52aWRlb2RldiksIEdTVF9FUlJPUl9TWVNURU0pOworICB9CisgIHJldHVybiBGQUxTRTsKK30KZGlmZiAtLWdpdCBhL3N5cy93YXZlZm9ybS9NYWtlZmlsZS5hbSBiL3N5cy93YXZlZm9ybS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWIxNjFjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3dhdmVmb3JtL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTUgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdHdhdmVmb3JtLmxhCisKK2xpYmdzdHdhdmVmb3JtX2xhX1NPVVJDRVMgPSAgZ3N0d2F2ZWZvcm1zaW5rLmMgZ3N0d2F2ZWZvcm1wbHVnaW4uYworbGliZ3N0d2F2ZWZvcm1fbGFfQ0ZMQUdTID0gJChHU1RfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgXAorICAgICAgICAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKQorbGliZ3N0d2F2ZWZvcm1fbGFfTElCQUREID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSBcCisgICAgICAgIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pIFwKKyAgICAgICAgJChHU1RfQkFTRV9MSUJTKSBcCisJJChHU1RfTElCUykgXAorCS1sd2lubW0KK2xpYmdzdHdhdmVmb3JtX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3R3YXZlZm9ybXNpbmsuaAorCmRpZmYgLS1naXQgYS9zeXMvd2F2ZWZvcm0vZ3N0d2F2ZWZvcm1wbHVnaW4uYyBiL3N5cy93YXZlZm9ybS9nc3R3YXZlZm9ybXBsdWdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMGM0YzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvd2F2ZWZvcm0vZ3N0d2F2ZWZvcm1wbHVnaW4uYwpAQCAtMCwwICsxLDQyIEBACisvKiBHU3RyZWFtZXIKKyogQ29weXJpZ2h0IChDKSAyMDA1IFNlYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorKgorKiBnc3R3YXZlZm9ybXBsdWdpbi5jOgorKgorKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0d2F2ZWZvcm1zaW5rLmgiCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAid2F2ZWZvcm1zaW5rIiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgICAgICBHU1RfVFlQRV9XQVZFRk9STV9TSU5LKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICB3YXZlZm9ybSwKKyAgICAiV2F2ZUZvcm0gd2luMzIgQVBJIHBsdWdpbiIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5jIGIvc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NzBhNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvd2F2ZWZvcm0vZ3N0d2F2ZWZvcm1zaW5rLmMKQEAgLTAsMCArMSw1NjYgQEAKKy8qIEdTdHJlYW1lcgorKiBDb3B5cmlnaHQgKEMpIDIwMDUgU2ViYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisqCisqIGdzdHdhdmVmb3Jtc2luay5jOgorKgorKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtd2F2ZWZvcm1zaW5rCisgKgorICogVGhpcyBlbGVtZW50IGxldHMgeW91IG91dHB1dCBzb3VuZCB1c2luZyB0aGUgV2luZG93cyBXYXZlRm9ybSBBUEkuCisgKgorICogTm90ZSB0aGF0IHlvdSBzaG91bGQgYWxtb3N0IGFsd2F5cyB1c2UgZ2VuZXJpYyBhdWRpbyBjb252ZXJzaW9uIGVsZW1lbnRzCisgKiBsaWtlIGF1ZGlvY29udmVydCBhbmQgYXVkaW9yZXNhbXBsZSBpbiBmcm9udCBvZiBhbiBhdWRpb3NpbmsgdG8gbWFrZSBzdXJlCisgKiB5b3VyIHBpcGVsaW5lIHdvcmtzIHVuZGVyIGFsbCBjaXJjdW1zdGFuY2VzICh0aG9zZSBjb252ZXJzaW9uIGVsZW1lbnRzIHdpbGwKKyAqIGFjdCBpbiBwYXNzdGhyb3VnaC1tb2RlIGlmIG5vIGNvbnZlcnNpb24gaXMgbmVjZXNzYXJ5KS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyAhIGF1ZGlvY29udmVydCAhIHZvbHVtZSB2b2x1bWU9MC4xICEgd2F2ZWZvcm1zaW5rCisgKiBdfCB3aWxsIG91dHB1dCBhIHNpbmUgd2F2ZSAoY29udGludW91cyBiZWVwIHNvdW5kKSB0byB5b3VyIHNvdW5kIGNhcmQgKHdpdGgKKyAqIGEgdmVyeSBsb3cgdm9sdW1lIGFzIHByZWNhdXRpb24pLgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGZpbGVzcmMgbG9jYXRpb249bXVzaWMub2dnICEgZGVjb2RlYmluICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIHdhdmVmb3Jtc2luaworICogXXwgd2lsbCBwbGF5IGFuIE9nZy9Wb3JiaXMgYXVkaW8gZmlsZSBhbmQgb3V0cHV0IGl0LgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3R3YXZlZm9ybXNpbmsuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAod2F2ZWZvcm1zaW5rX2RlYnVnKTsKKworc3RhdGljIHZvaWQgZ3N0X3dhdmVmb3JtX3NpbmtfZmluYWxpc2UgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X3dhdmVmb3JtX3Npbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3dhdmVmb3JtX3NpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIEdzdENhcHMgKmdzdF93YXZlZm9ybV9zaW5rX2dldGNhcHMgKEdzdEJhc2VTaW5rICogYnNpbmssCisgICAgR3N0Q2FwcyAqIGZpbHRlcik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBHc3RBdWRpb1NpbmsgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBnYm9vbGVhbiBnc3Rfd2F2ZWZvcm1fc2lua19wcmVwYXJlIChHc3RBdWRpb1NpbmsgKiBhc2luaywKKyAgICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3dhdmVmb3JtX3NpbmtfdW5wcmVwYXJlIChHc3RBdWRpb1NpbmsgKiBhc2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3dhdmVmb3JtX3Npbmtfb3BlbiAoR3N0QXVkaW9TaW5rICogYXNpbmspOworc3RhdGljIGdib29sZWFuIGdzdF93YXZlZm9ybV9zaW5rX2Nsb3NlIChHc3RBdWRpb1NpbmsgKiBhc2luayk7CitzdGF0aWMgZ2ludCBnc3Rfd2F2ZWZvcm1fc2lua193cml0ZSAoR3N0QXVkaW9TaW5rICogYXNpbmssIGdwb2ludGVyIGRhdGEsCisgICAgZ3VpbnQgbGVuZ3RoKTsKK3N0YXRpYyBndWludCBnc3Rfd2F2ZWZvcm1fc2lua19kZWxheSAoR3N0QXVkaW9TaW5rICogYXNpbmspOworc3RhdGljIHZvaWQgZ3N0X3dhdmVmb3JtX3NpbmtfcmVzZXQgKEdzdEF1ZGlvU2luayAqIGFzaW5rKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFV0aWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworR3N0Q2FwcyAqZ3N0X3dhdmVmb3JtX3NpbmtfY3JlYXRlX2NhcHMgKGdpbnQgcmF0ZSwgZ2ludCBjaGFubmVscywKKyAgICBjb25zdCBnY2hhciAqIGZvcm1hdCk7CitXQVZFSERSICpidWZmZXJwb29sX2dldF9idWZmZXIgKEdzdFdhdmVGb3JtU2luayAqIHdmc2luaywgZ3BvaW50ZXIgZGF0YSwKKyAgICBndWludCBsZW5ndGgpOwordm9pZCBDQUxMQkFDSyB3YXZlT3V0UHJvYyAoSFdBVkVPVVQgaHdvLCBVSU5UIHVNc2csIERXT1JEX1BUUiBkd0luc3RhbmNlLAorICAgIERXT1JEX1BUUiBkd1BhcmFtMSwgRFdPUkRfUFRSIGR3UGFyYW0yKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHdhdmVmb3Jtc2lua19zaW5rX2ZhY3RvcnkgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgIiBHU1RfQVVESU9fTkUgKFMxNikgIiwgUzggfSwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdIikpOworCisjZGVmaW5lIGdzdF93YXZlZm9ybV9zaW5rX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFdhdmVGb3JtU2luaywgZ3N0X3dhdmVmb3JtX3NpbmssIEdTVF9UWVBFX0FVRElPX1NJTkspOworCitzdGF0aWMgdm9pZAorZ3N0X3dhdmVmb3JtX3NpbmtfY2xhc3NfaW5pdCAoR3N0V2F2ZUZvcm1TaW5rQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RCYXNlU2lua0NsYXNzICpnc3RiYXNlc2lua19jbGFzczsKKyAgR3N0QXVkaW9TaW5rQ2xhc3MgKmdzdGF1ZGlvc2lua19jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RiYXNlc2lua19jbGFzcyA9IChHc3RCYXNlU2lua0NsYXNzICopIGtsYXNzOworICBnc3RhdWRpb3NpbmtfY2xhc3MgPSAoR3N0QXVkaW9TaW5rQ2xhc3MgKikga2xhc3M7CisgIGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworCisgIHBhcmVudF9jbGFzcyA9IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3dhdmVmb3JtX3NpbmtfZmluYWxpc2U7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF93YXZlZm9ybV9zaW5rX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3dhdmVmb3JtX3Npbmtfc2V0X3Byb3BlcnR5OworCisgIGdzdGJhc2VzaW5rX2NsYXNzLT5nZXRfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2ZWZvcm1fc2lua19nZXRjYXBzKTsKKworICBnc3RhdWRpb3NpbmtfY2xhc3MtPnByZXBhcmUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3dhdmVmb3JtX3NpbmtfcHJlcGFyZSk7CisgIGdzdGF1ZGlvc2lua19jbGFzcy0+dW5wcmVwYXJlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2ZWZvcm1fc2lua191bnByZXBhcmUpOworICBnc3RhdWRpb3NpbmtfY2xhc3MtPm9wZW4gPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3dhdmVmb3JtX3Npbmtfb3Blbik7CisgIGdzdGF1ZGlvc2lua19jbGFzcy0+Y2xvc2UgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3dhdmVmb3JtX3NpbmtfY2xvc2UpOworICBnc3RhdWRpb3NpbmtfY2xhc3MtPndyaXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXZlZm9ybV9zaW5rX3dyaXRlKTsKKyAgZ3N0YXVkaW9zaW5rX2NsYXNzLT5kZWxheSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2ZWZvcm1fc2lua19kZWxheSk7CisgIGdzdGF1ZGlvc2lua19jbGFzcy0+cmVzZXQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3dhdmVmb3JtX3NpbmtfcmVzZXQpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUICh3YXZlZm9ybXNpbmtfZGVidWcsICJ3YXZlZm9ybXNpbmsiLCAwLAorICAgICAgIldhdmVmb3JtIHNpbmsiKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiV2F2ZUZvcm0gQXVkaW8gU2luayIsCisgICAgICAiU2luay9BdWRpbyIsCisgICAgICAiT3V0cHV0IHRvIGEgc291bmQgY2FyZCB2aWEgV2F2ZUZvcm0gQVBJIiwKKyAgICAgICJTZWJhc3RpZW4gTW91dHRlIDxzZWJhc3RpZW5AbW91dHRlLm5ldD4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZ3YXZlZm9ybXNpbmtfc2lua19mYWN0b3J5KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZlZm9ybV9zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICAvKiBHc3RXYXZlRm9ybVNpbmsgKndmc2luayA9IEdTVF9XQVZFRk9STV9TSU5LIChvYmplY3QpOyAqLworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZlZm9ybV9zaW5rX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICAvKiBHc3RXYXZlRm9ybVNpbmsgKndmc2luayA9IEdTVF9XQVZFRk9STV9TSU5LIChvYmplY3QpOyAqLworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZlZm9ybV9zaW5rX2luaXQgKEdzdFdhdmVGb3JtU2luayAqIHdmc2luaykKK3sKKyAgLyogaW5pdGlhbGl6ZSBtZW1iZXJzICovCisgIHdmc2luay0+aHdhdmVvdXQgPSBOVUxMOworICB3ZnNpbmstPmNhY2hlZF9jYXBzID0gTlVMTDsKKyAgd2ZzaW5rLT53YXZlX2J1ZmZlcnMgPSBOVUxMOworICB3ZnNpbmstPndyaXRlX2J1ZmZlciA9IDA7CisgIHdmc2luay0+YnVmZmVyX2NvdW50ID0gQlVGRkVSX0NPVU5UOworICB3ZnNpbmstPmJ1ZmZlcl9zaXplID0gQlVGRkVSX1NJWkU7CisgIHdmc2luay0+ZnJlZV9idWZmZXJzX2NvdW50ID0gd2ZzaW5rLT5idWZmZXJfY291bnQ7CisgIHdmc2luay0+Ynl0ZXNfaW5fcXVldWUgPSAwOworCisgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24gKCZ3ZnNpbmstPmNyaXRpY193YXZlKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZlZm9ybV9zaW5rX2ZpbmFsaXNlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RXYXZlRm9ybVNpbmsgKndmc2luayA9IEdTVF9XQVZFRk9STV9TSU5LIChvYmplY3QpOworCisgIGlmICh3ZnNpbmstPmNhY2hlZF9jYXBzKSB7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHdmc2luay0+Y2FjaGVkX2NhcHMpOworICAgIHdmc2luay0+Y2FjaGVkX2NhcHMgPSBOVUxMOworICB9CisKKyAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uICgmd2ZzaW5rLT5jcml0aWNfd2F2ZSk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3Rfd2F2ZWZvcm1fc2lua19nZXRjYXBzIChHc3RCYXNlU2luayAqIGJzaW5rLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RXYXZlRm9ybVNpbmsgKndmc2luayA9IEdTVF9XQVZFRk9STV9TSU5LIChic2luayk7CisgIE1NUkVTVUxUIG1tcmVzdWx0OworICBXQVZFT1VUQ0FQUyB3b2NhcHM7CisgIEdzdENhcHMgKmNhcHMsICpjYXBzX3RlbXA7CisKKyAgLyogcmV0dXJuIHRoZSBjYWNoZWQgY2FwcyBpZiBhbHJlYWR5IGRlZmluZWQgKi8KKyAgaWYgKHdmc2luay0+Y2FjaGVkX2NhcHMpIHsKKyAgICByZXR1cm4gZ3N0X2NhcHNfcmVmICh3ZnNpbmstPmNhY2hlZF9jYXBzKTsKKyAgfQorCisgIC8qIGdldCB0aGUgZGVmYXVsdCBkZXZpY2UgY2FwcyAqLworICBtbXJlc3VsdCA9IHdhdmVPdXRHZXREZXZDYXBzIChXQVZFX01BUFBFUiwgJndvY2Fwcywgc2l6ZW9mICh3b2NhcHMpKTsKKyAgaWYgKG1tcmVzdWx0ICE9IE1NU1lTRVJSX05PRVJST1IpIHsKKyAgICB3YXZlT3V0R2V0RXJyb3JUZXh0IChtbXJlc3VsdCwgd2ZzaW5rLT5lcnJvcl9zdHJpbmcsIEVSUk9SX0xFTkdUSCAtIDEpOworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh3ZnNpbmssIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKCJnc3Rfd2F2ZWZvcm1fc2lua19nZXRjYXBzOiB3YXZlT3V0R2V0RGV2Q2FwcyBmYWlsZWQgZXJyb3I9PiVzIiwKKyAgICAgICAgICAgIHdmc2luay0+ZXJyb3Jfc3RyaW5nKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHkgKCk7CisKKyAgLyogY3JlYXRlIGEgY2FwcyBmb3IgYWxsIHdhdmUgZm9ybWF0cyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSAKKyAgICAgc3RhcnRpbmcgYnkgdGhlIGJlc3QgcXVhbGl0eSBmb3JtYXQgKi8KKyAgaWYgKHdvY2Fwcy5kd0Zvcm1hdHMgJiBXQVZFX0ZPUk1BVF85NlMxNikgeworICAgIGNhcHNfdGVtcCA9IGdzdF93YXZlZm9ybV9zaW5rX2NyZWF0ZV9jYXBzICg5NjAwMCwgMiwgR1NUX0FVRElPX05FIChTMTYpKTsKKyAgICBpZiAoY2Fwc190ZW1wKSB7CisgICAgICBnc3RfY2Fwc19hcHBlbmQgKGNhcHMsIGNhcHNfdGVtcCk7CisgICAgfQorICB9CisgIGlmICh3b2NhcHMuZHdGb3JtYXRzICYgV0FWRV9GT1JNQVRfOTZTMDgpIHsKKyAgICBjYXBzX3RlbXAgPSBnc3Rfd2F2ZWZvcm1fc2lua19jcmVhdGVfY2FwcyAoOTYwMDAsIDIsICJTOCIpOworICAgIGlmIChjYXBzX3RlbXApIHsKKyAgICAgIGdzdF9jYXBzX2FwcGVuZCAoY2FwcywgY2Fwc190ZW1wKTsKKyAgICB9CisgIH0KKyAgaWYgKHdvY2Fwcy5kd0Zvcm1hdHMgJiBXQVZFX0ZPUk1BVF85Nk0xNikgeworICAgIGNhcHNfdGVtcCA9IGdzdF93YXZlZm9ybV9zaW5rX2NyZWF0ZV9jYXBzICg5NjAwMCwgMSwgR1NUX0FVRElPX05FIChTMTYpKTsKKyAgICBpZiAoY2Fwc190ZW1wKSB7CisgICAgICBnc3RfY2Fwc19hcHBlbmQgKGNhcHMsIGNhcHNfdGVtcCk7CisgICAgfQorICB9CisgIGlmICh3b2NhcHMuZHdGb3JtYXRzICYgV0FWRV9GT1JNQVRfOTZNMDgpIHsKKyAgICBjYXBzX3RlbXAgPSBnc3Rfd2F2ZWZvcm1fc2lua19jcmVhdGVfY2FwcyAoOTYwMDAsIDEsICJTOCIpOworICAgIGlmIChjYXBzX3RlbXApIHsKKyAgICAgIGdzdF9jYXBzX2FwcGVuZCAoY2FwcywgY2Fwc190ZW1wKTsKKyAgICB9CisgIH0KKyAgaWYgKHdvY2Fwcy5kd0Zvcm1hdHMgJiBXQVZFX0ZPUk1BVF80UzE2KSB7CisgICAgY2Fwc190ZW1wID0gZ3N0X3dhdmVmb3JtX3NpbmtfY3JlYXRlX2NhcHMgKDQ0MTAwLCAyLCBHU1RfQVVESU9fTkUgKFMxNikpOworICAgIGlmIChjYXBzX3RlbXApIHsKKyAgICAgIGdzdF9jYXBzX2FwcGVuZCAoY2FwcywgY2Fwc190ZW1wKTsKKyAgICB9CisgIH0KKyAgaWYgKHdvY2Fwcy5kd0Zvcm1hdHMgJiBXQVZFX0ZPUk1BVF80UzA4KSB7CisgICAgY2Fwc190ZW1wID0gZ3N0X3dhdmVmb3JtX3NpbmtfY3JlYXRlX2NhcHMgKDQ0MTAwLCAyLCAiUzgiKTsKKyAgICBpZiAoY2Fwc190ZW1wKSB7CisgICAgICBnc3RfY2Fwc19hcHBlbmQgKGNhcHMsIGNhcHNfdGVtcCk7CisgICAgfQorICB9CisgIGlmICh3b2NhcHMuZHdGb3JtYXRzICYgV0FWRV9GT1JNQVRfNE0xNikgeworICAgIGNhcHNfdGVtcCA9IGdzdF93YXZlZm9ybV9zaW5rX2NyZWF0ZV9jYXBzICg0NDEwMCwgMSwgR1NUX0FVRElPX05FIChTMTYpKTsKKyAgICBpZiAoY2Fwc190ZW1wKSB7CisgICAgICBnc3RfY2Fwc19hcHBlbmQgKGNhcHMsIGNhcHNfdGVtcCk7CisgICAgfQorICB9CisgIGlmICh3b2NhcHMuZHdGb3JtYXRzICYgV0FWRV9GT1JNQVRfNE0wOCkgeworICAgIGNhcHNfdGVtcCA9IGdzdF93YXZlZm9ybV9zaW5rX2NyZWF0ZV9jYXBzICg0NDEwMCwgMSwgIlM4Iik7CisgICAgaWYgKGNhcHNfdGVtcCkgeworICAgICAgZ3N0X2NhcHNfYXBwZW5kIChjYXBzLCBjYXBzX3RlbXApOworICAgIH0KKyAgfQorICBpZiAod29jYXBzLmR3Rm9ybWF0cyAmIFdBVkVfRk9STUFUXzJTMTYpIHsKKyAgICBjYXBzX3RlbXAgPSBnc3Rfd2F2ZWZvcm1fc2lua19jcmVhdGVfY2FwcyAoMjIwNTAsIDIsIEdTVF9BVURJT19ORSAoUzE2KSk7CisgICAgaWYgKGNhcHNfdGVtcCkgeworICAgICAgZ3N0X2NhcHNfYXBwZW5kIChjYXBzLCBjYXBzX3RlbXApOworICAgIH0KKyAgfQorICBpZiAod29jYXBzLmR3Rm9ybWF0cyAmIFdBVkVfRk9STUFUXzJTMDgpIHsKKyAgICBjYXBzX3RlbXAgPSBnc3Rfd2F2ZWZvcm1fc2lua19jcmVhdGVfY2FwcyAoMjIwNTAsIDIsICJTOCIpOworICAgIGlmIChjYXBzX3RlbXApIHsKKyAgICAgIGdzdF9jYXBzX2FwcGVuZCAoY2FwcywgY2Fwc190ZW1wKTsKKyAgICB9CisgIH0KKyAgaWYgKHdvY2Fwcy5kd0Zvcm1hdHMgJiBXQVZFX0ZPUk1BVF8yTTE2KSB7CisgICAgY2Fwc190ZW1wID0gZ3N0X3dhdmVmb3JtX3NpbmtfY3JlYXRlX2NhcHMgKDIyMDUwLCAxLCBHU1RfQVVESU9fTkUgKFMxNikpOworICAgIGlmIChjYXBzX3RlbXApIHsKKyAgICAgIGdzdF9jYXBzX2FwcGVuZCAoY2FwcywgY2Fwc190ZW1wKTsKKyAgICB9CisgIH0KKyAgaWYgKHdvY2Fwcy5kd0Zvcm1hdHMgJiBXQVZFX0ZPUk1BVF8yTTA4KSB7CisgICAgY2Fwc190ZW1wID0gZ3N0X3dhdmVmb3JtX3NpbmtfY3JlYXRlX2NhcHMgKDIyMDUwLCAxLCAiUzgiKTsKKyAgICBpZiAoY2Fwc190ZW1wKSB7CisgICAgICBnc3RfY2Fwc19hcHBlbmQgKGNhcHMsIGNhcHNfdGVtcCk7CisgICAgfQorICB9CisgIGlmICh3b2NhcHMuZHdGb3JtYXRzICYgV0FWRV9GT1JNQVRfMVMxNikgeworICAgIGNhcHNfdGVtcCA9IGdzdF93YXZlZm9ybV9zaW5rX2NyZWF0ZV9jYXBzICgxMTAyNSwgMiwgR1NUX0FVRElPX05FIChTMTYpKTsKKyAgICBpZiAoY2Fwc190ZW1wKSB7CisgICAgICBnc3RfY2Fwc19hcHBlbmQgKGNhcHMsIGNhcHNfdGVtcCk7CisgICAgfQorICB9CisgIGlmICh3b2NhcHMuZHdGb3JtYXRzICYgV0FWRV9GT1JNQVRfMVMwOCkgeworICAgIGNhcHNfdGVtcCA9IGdzdF93YXZlZm9ybV9zaW5rX2NyZWF0ZV9jYXBzICgxMTAyNSwgMiwgIlM4Iik7CisgICAgaWYgKGNhcHNfdGVtcCkgeworICAgICAgZ3N0X2NhcHNfYXBwZW5kIChjYXBzLCBjYXBzX3RlbXApOworICAgIH0KKyAgfQorICBpZiAod29jYXBzLmR3Rm9ybWF0cyAmIFdBVkVfRk9STUFUXzFNMTYpIHsKKyAgICBjYXBzX3RlbXAgPSBnc3Rfd2F2ZWZvcm1fc2lua19jcmVhdGVfY2FwcyAoMTEwMjUsIDEsIEdTVF9BVURJT19ORSAoUzE2KSk7CisgICAgaWYgKGNhcHNfdGVtcCkgeworICAgICAgZ3N0X2NhcHNfYXBwZW5kIChjYXBzLCBjYXBzX3RlbXApOworICAgIH0KKyAgfQorICBpZiAod29jYXBzLmR3Rm9ybWF0cyAmIFdBVkVfRk9STUFUXzFNMDgpIHsKKyAgICBjYXBzX3RlbXAgPSBnc3Rfd2F2ZWZvcm1fc2lua19jcmVhdGVfY2FwcyAoMTEwMjUsIDEsICJTOCIpOworICAgIGlmIChjYXBzX3RlbXApIHsKKyAgICAgIGdzdF9jYXBzX2FwcGVuZCAoY2FwcywgY2Fwc190ZW1wKTsKKyAgICB9CisgIH0KKworICBpZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKGNhcHMpKSB7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIGNhcHMgPSBOVUxMOworICB9IGVsc2UgeworICAgIHdmc2luay0+Y2FjaGVkX2NhcHMgPSBnc3RfY2Fwc19yZWYgKGNhcHMpOworICB9CisKKyAgR1NUX0NBVF9MT0dfT0JKRUNUICh3YXZlZm9ybXNpbmtfZGVidWcsIHdmc2luaywKKyAgICAgICJSZXR1cm5pbmcgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdmVmb3JtX3Npbmtfb3BlbiAoR3N0QXVkaW9TaW5rICogYXNpbmspCit7CisgIC8qIEdzdFdhdmVGb3JtU2luayAqd2ZzaW5rID0gR1NUX1dBVkVGT1JNX1NJTksgKGFzaW5rKTsgKi8KKworICAvKiBub3RoaW5nIHRvIGRvIGhlcmUgYXMgdGhlIGRldmljZSBuZWVkcyB0byBiZSBvcGVuZWQgd2l0aCB0aGUgZm9ybWF0IHdlIHdpbGwgdXNlICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdmVmb3JtX3NpbmtfcHJlcGFyZSAoR3N0QXVkaW9TaW5rICogYXNpbmssIEdzdEF1ZGlvUmluZ0J1ZmZlclNwZWMgKiBzcGVjKQoreworICBHc3RXYXZlRm9ybVNpbmsgKndmc2luayA9IEdTVF9XQVZFRk9STV9TSU5LIChhc2luayk7CisgIFdBVkVGT1JNQVRFWCB3Zng7CisgIE1NUkVTVUxUIG1tcmVzdWx0OworICBndWludCBpbmRleDsKKworICAvKiBzZXR1cCB3YXZlZm9ybWV4IHN0cnV0dXJlIHdpdGggdGhlIGlucHV0IHJpbmdidWZmZXIgc3BlY3MgKi8KKyAgbWVtc2V0ICgmd2Z4LCAwLCBzaXplb2YgKHdmeCkpOworICB3ZnguY2JTaXplID0gMDsKKyAgd2Z4LndGb3JtYXRUYWcgPSBXQVZFX0ZPUk1BVF9QQ007CisgIHdmeC5uQ2hhbm5lbHMgPSBzcGVjLT5pbmZvLmNoYW5uZWxzOworICB3ZngublNhbXBsZXNQZXJTZWMgPSBzcGVjLT5pbmZvLnJhdGU7CisgIHdmeC53Qml0c1BlclNhbXBsZSA9IChzcGVjLT5pbmZvLmJwZiAqIDgpIC8gd2Z4Lm5DaGFubmVsczsKKyAgd2Z4Lm5CbG9ja0FsaWduID0gc3BlYy0+aW5mby5icGY7CisgIHdmeC5uQXZnQnl0ZXNQZXJTZWMgPSB3ZngublNhbXBsZXNQZXJTZWMgKiB3ZngubkJsb2NrQWxpZ247CisKKyAgLyogc2F2ZSBieXRlcyBwZXIgc2FtcGxlIHRvIHVzZSBpdCBpbiBkZWxheSAqLworICB3ZnNpbmstPmJ5dGVzX3Blcl9zYW1wbGUgPSBzcGVjLT5pbmZvLmJwZjsKKworICAvKiBvcGVuIHRoZSBkZWZhdWx0IGF1ZGlvIGRldmljZSB3aXRoIHRoZSBnaXZlbiBjYXBzICovCisgIG1tcmVzdWx0ID0gd2F2ZU91dE9wZW4gKCZ3ZnNpbmstPmh3YXZlb3V0LCBXQVZFX01BUFBFUiwKKyAgICAgICZ3ZngsIChEV09SRF9QVFIpIHdhdmVPdXRQcm9jLCAoRFdPUkRfUFRSKSB3ZnNpbmssIENBTExCQUNLX0ZVTkNUSU9OKTsKKyAgaWYgKG1tcmVzdWx0ICE9IE1NU1lTRVJSX05PRVJST1IpIHsKKyAgICB3YXZlT3V0R2V0RXJyb3JUZXh0IChtbXJlc3VsdCwgd2ZzaW5rLT5lcnJvcl9zdHJpbmcsIEVSUk9SX0xFTkdUSCAtIDEpOworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh3ZnNpbmssIFJFU09VUkNFLCBPUEVOX1dSSVRFLAorICAgICAgICAoImdzdF93YXZlZm9ybV9zaW5rX3ByZXBhcmU6IHdhdmVPdXRPcGVuIGZhaWxlZCBlcnJvcj0+JXMiLAorICAgICAgICAgICAgd2ZzaW5rLT5lcnJvcl9zdHJpbmcpLCAoTlVMTCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIGV2YWx1YXRlIHRoZSBidWZmZXIgc2l6ZSBhbmQgdGhlIG51bWJlciBvZiBidWZmZXJzIG5lZWRlZCAqLworICB3ZnNpbmstPmZyZWVfYnVmZmVyc19jb3VudCA9IHdmc2luay0+YnVmZmVyX2NvdW50OworCisgIC8qIGFsbG9jYXRlIHdhdmUgYnVmZmVycyAqLworICB3ZnNpbmstPndhdmVfYnVmZmVycyA9IChXQVZFSERSICopIGdfbmV3MCAoV0FWRUhEUiwgd2ZzaW5rLT5idWZmZXJfY291bnQpOworICBpZiAoIXdmc2luay0+d2F2ZV9idWZmZXJzKSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHdmc2luaywgUkVTT1VSQ0UsIE9QRU5fV1JJVEUsCisgICAgICAgICgiZ3N0X3dhdmVmb3JtX3NpbmtfcHJlcGFyZTogRmFpbGVkIHRvIGFsbG9jYXRlIHdhdmUgYnVmZmVyIGhlYWRlcnMgKGJ1ZmZlciBjb3VudD0lZCkiLAorICAgICAgICAgICAgd2ZzaW5rLT5idWZmZXJfY291bnQpLCAoTlVMTCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtZW1zZXQgKHdmc2luay0+d2F2ZV9idWZmZXJzLCAwLCBzaXplb2YgKFdBVkVIRFIpICogd2ZzaW5rLT5idWZmZXJfY291bnQpOworCisgIC8qIHNldHVwIGhlYWRlcnMgKi8KKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgd2ZzaW5rLT5idWZmZXJfY291bnQ7IGluZGV4KyspIHsKKyAgICB3ZnNpbmstPndhdmVfYnVmZmVyc1tpbmRleF0uZHdCdWZmZXJMZW5ndGggPSB3ZnNpbmstPmJ1ZmZlcl9zaXplOworICAgIHdmc2luay0+d2F2ZV9idWZmZXJzW2luZGV4XS5scERhdGEgPSBnX25ldzAgKGdjaGFyLCB3ZnNpbmstPmJ1ZmZlcl9zaXplKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZlZm9ybV9zaW5rX3VucHJlcGFyZSAoR3N0QXVkaW9TaW5rICogYXNpbmspCit7CisgIEdzdFdhdmVGb3JtU2luayAqd2ZzaW5rID0gR1NUX1dBVkVGT1JNX1NJTksgKGFzaW5rKTsKKworICAvKiBmcmVlIHdhdmUgYnVmZmVycyAqLworICBpZiAod2ZzaW5rLT53YXZlX2J1ZmZlcnMpIHsKKyAgICBndWludCBpbmRleDsKKworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHdmc2luay0+YnVmZmVyX2NvdW50OyBpbmRleCsrKSB7CisgICAgICBpZiAod2ZzaW5rLT53YXZlX2J1ZmZlcnNbaW5kZXhdLmR3RmxhZ3MgJiBXSERSX1BSRVBBUkVEKSB7CisgICAgICAgIE1NUkVTVUxUIG1tcmVzdWx0ID0gd2F2ZU91dFVucHJlcGFyZUhlYWRlciAod2ZzaW5rLT5od2F2ZW91dCwKKyAgICAgICAgICAgICZ3ZnNpbmstPndhdmVfYnVmZmVyc1tpbmRleF0sIHNpemVvZiAoV0FWRUhEUikpOworICAgICAgICBpZiAobW1yZXN1bHQgIT0gTU1TWVNFUlJfTk9FUlJPUikgeworICAgICAgICAgIHdhdmVPdXRHZXRFcnJvclRleHQgKG1tcmVzdWx0LCB3ZnNpbmstPmVycm9yX3N0cmluZywKKyAgICAgICAgICAgICAgRVJST1JfTEVOR1RIIC0gMSk7CisgICAgICAgICAgR1NUX0NBVF9XQVJOSU5HX09CSkVDVCAod2F2ZWZvcm1zaW5rX2RlYnVnLCB3ZnNpbmssCisgICAgICAgICAgICAgICJnc3Rfd2F2ZWZvcm1fc2lua191bnByZXBhcmU6IEVycm9yIHVucHJlcGFyaW5nIGJ1ZmZlciA9PiAlcyIsCisgICAgICAgICAgICAgIHdmc2luay0+ZXJyb3Jfc3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZ19mcmVlICh3ZnNpbmstPndhdmVfYnVmZmVyc1tpbmRleF0ubHBEYXRhKTsKKyAgICB9CisgICAgZ19mcmVlICh3ZnNpbmstPndhdmVfYnVmZmVycyk7CisgICAgd2ZzaW5rLT53YXZlX2J1ZmZlcnMgPSBOVUxMOworICB9CisKKyAgLyogY2xvc2Ugd2F2ZWZvcm0tYXVkaW8gb3V0cHV0IGRldmljZSAqLworICBpZiAod2ZzaW5rLT5od2F2ZW91dCkgeworICAgIHdhdmVPdXRDbG9zZSAod2ZzaW5rLT5od2F2ZW91dCk7CisgICAgd2ZzaW5rLT5od2F2ZW91dCA9IE5VTEw7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2ZWZvcm1fc2lua19jbG9zZSAoR3N0QXVkaW9TaW5rICogYXNpbmspCit7CisgIC8qIEdzdFdhdmVGb3JtU2luayAqd2ZzaW5rID0gR1NUX1dBVkVGT1JNX1NJTksgKGFzaW5rKTsgKi8KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdpbnQKK2dzdF93YXZlZm9ybV9zaW5rX3dyaXRlIChHc3RBdWRpb1NpbmsgKiBhc2luaywgZ3BvaW50ZXIgZGF0YSwgZ3VpbnQgbGVuZ3RoKQoreworICBHc3RXYXZlRm9ybVNpbmsgKndmc2luayA9IEdTVF9XQVZFRk9STV9TSU5LIChhc2luayk7CisgIFdBVkVIRFIgKndhdmVoZWFkZXI7CisgIE1NUkVTVUxUIG1tcmVzdWx0OworICBndWludCBieXRlc190b193cml0ZSA9IGxlbmd0aDsKKyAgZ3VpbnQgcmVtYWluaW5nX2xlbmd0aCA9IGxlbmd0aDsKKworICB3ZnNpbmstPmJ5dGVzX2luX3F1ZXVlICs9IGxlbmd0aDsKKworICB3aGlsZSAocmVtYWluaW5nX2xlbmd0aCA+IDApIHsKKyAgICBpZiAod2ZzaW5rLT5mcmVlX2J1ZmZlcnNfY291bnQgPT0gMCkgeworICAgICAgLyogbm8gZnJlZSBidWZmZXIgYXZhaWxhYmxlLCB3YWl0IGZvciBvbmUgKi8KKyAgICAgIFNsZWVwICgxMCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvKiBnZXQgdGhlIGN1cnJlbnQgd3JpdGUgYnVmZmVyIGhlYWRlciAqLworICAgIHdhdmVoZWFkZXIgPSAmd2ZzaW5rLT53YXZlX2J1ZmZlcnNbd2ZzaW5rLT53cml0ZV9idWZmZXJdOworCisgICAgLyogdW5wcmVwYXJlIHRoZSBoZWFkZXIgaWYgbmVlZGVkICovCisgICAgaWYgKHdhdmVoZWFkZXItPmR3RmxhZ3MgJiBXSERSX1BSRVBBUkVEKSB7CisgICAgICBtbXJlc3VsdCA9CisgICAgICAgICAgd2F2ZU91dFVucHJlcGFyZUhlYWRlciAod2ZzaW5rLT5od2F2ZW91dCwgd2F2ZWhlYWRlciwKKyAgICAgICAgICBzaXplb2YgKFdBVkVIRFIpKTsKKyAgICAgIGlmIChtbXJlc3VsdCAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7CisgICAgICAgIHdhdmVPdXRHZXRFcnJvclRleHQgKG1tcmVzdWx0LCB3ZnNpbmstPmVycm9yX3N0cmluZywgRVJST1JfTEVOR1RIIC0gMSk7CisgICAgICAgIEdTVF9DQVRfV0FSTklOR19PQkpFQ1QgKHdhdmVmb3Jtc2lua19kZWJ1Zywgd2ZzaW5rLAorICAgICAgICAgICAgIkVycm9yIHVucHJlcGFyaW5nIGJ1ZmZlciA9PiAlcyIsIHdmc2luay0+ZXJyb3Jfc3RyaW5nKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAod2ZzaW5rLT5idWZmZXJfc2l6ZSAtIHdhdmVoZWFkZXItPmR3VXNlciA+PSByZW1haW5pbmdfbGVuZ3RoKQorICAgICAgYnl0ZXNfdG9fd3JpdGUgPSByZW1haW5pbmdfbGVuZ3RoOworICAgIGVsc2UKKyAgICAgIGJ5dGVzX3RvX3dyaXRlID0gd2ZzaW5rLT5idWZmZXJfc2l6ZSAtIHdhdmVoZWFkZXItPmR3VXNlcjsKKworICAgIG1lbWNweSAod2F2ZWhlYWRlci0+bHBEYXRhICsgd2F2ZWhlYWRlci0+ZHdVc2VyLCBkYXRhLCBieXRlc190b193cml0ZSk7CisgICAgd2F2ZWhlYWRlci0+ZHdVc2VyICs9IGJ5dGVzX3RvX3dyaXRlOworICAgIHJlbWFpbmluZ19sZW5ndGggLT0gYnl0ZXNfdG9fd3JpdGU7CisgICAgZGF0YSA9IChndWludDggKikgZGF0YSArIGJ5dGVzX3RvX3dyaXRlOworCisgICAgaWYgKHdhdmVoZWFkZXItPmR3VXNlciA9PSB3ZnNpbmstPmJ1ZmZlcl9zaXplKSB7CisgICAgICAvKiB3ZSBoYXZlIGZpbGxlZCBhIGJ1ZmZlciwgbGV0J3MgcHJlcGFyZSBpdCBhbmQgbmV4dCB3cml0ZSBpdCB0byB0aGUgZGV2aWNlICovCisgICAgICBtbXJlc3VsdCA9CisgICAgICAgICAgd2F2ZU91dFByZXBhcmVIZWFkZXIgKHdmc2luay0+aHdhdmVvdXQsIHdhdmVoZWFkZXIsIHNpemVvZiAoV0FWRUhEUikpOworICAgICAgaWYgKG1tcmVzdWx0ICE9IE1NU1lTRVJSX05PRVJST1IpIHsKKyAgICAgICAgd2F2ZU91dEdldEVycm9yVGV4dCAobW1yZXN1bHQsIHdmc2luay0+ZXJyb3Jfc3RyaW5nLCBFUlJPUl9MRU5HVEggLSAxKTsKKyAgICAgICAgR1NUX0NBVF9XQVJOSU5HX09CSkVDVCAod2F2ZWZvcm1zaW5rX2RlYnVnLCB3ZnNpbmssCisgICAgICAgICAgICAiZ3N0X3dhdmVmb3JtX3Npbmtfd3JpdGU6IEVycm9yIHByZXBhcmluZyBoZWFkZXIgPT4gJXMiLAorICAgICAgICAgICAgd2ZzaW5rLT5lcnJvcl9zdHJpbmcpOworICAgICAgfQorICAgICAgbW1yZXN1bHQgPSB3YXZlT3V0V3JpdGUgKHdmc2luay0+aHdhdmVvdXQsIHdhdmVoZWFkZXIsIHNpemVvZiAoV0FWRUhEUikpOworICAgICAgaWYgKG1tcmVzdWx0ICE9IE1NU1lTRVJSX05PRVJST1IpIHsKKyAgICAgICAgd2F2ZU91dEdldEVycm9yVGV4dCAobW1yZXN1bHQsIHdmc2luay0+ZXJyb3Jfc3RyaW5nLCBFUlJPUl9MRU5HVEggLSAxKTsKKyAgICAgICAgR1NUX0NBVF9XQVJOSU5HX09CSkVDVCAod2F2ZWZvcm1zaW5rX2RlYnVnLCB3ZnNpbmssCisgICAgICAgICAgICAiZ3N0X3dhdmVmb3JtX3Npbmtfd3JpdGU6IEVycm9yIHdyaXR0aW5nIGJ1ZmZlciB0byB0aGUgZGV2aWNlID0+ICVzIiwKKyAgICAgICAgICAgIHdmc2luay0+ZXJyb3Jfc3RyaW5nKTsKKyAgICAgIH0KKworICAgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24gKCZ3ZnNpbmstPmNyaXRpY193YXZlKTsKKyAgICAgIHdmc2luay0+ZnJlZV9idWZmZXJzX2NvdW50LS07CisgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJndmc2luay0+Y3JpdGljX3dhdmUpOworCisgICAgICB3ZnNpbmstPndyaXRlX2J1ZmZlcisrOworICAgICAgd2ZzaW5rLT53cml0ZV9idWZmZXIgJT0gd2ZzaW5rLT5idWZmZXJfY291bnQ7CisgICAgICB3YXZlaGVhZGVyLT5kd1VzZXIgPSAwOworICAgICAgd2ZzaW5rLT5ieXRlc19pbl9xdWV1ZSA9IDA7CisgICAgICBHU1RfQ0FUX0xPR19PQkpFQ1QgKHdhdmVmb3Jtc2lua19kZWJ1Zywgd2ZzaW5rLAorICAgICAgICAgICJnc3Rfd2F2ZWZvcm1fc2lua193cml0ZTogV3JpdHRpbmcgYSBidWZmZXIgdG8gdGhlIGRldmljZSAoZnJlZSBidWZmZXJzIHJlbWFpbmluZz0lZCwgd3JpdGUgYnVmZmVyPSVkKSIsCisgICAgICAgICAgd2ZzaW5rLT5mcmVlX2J1ZmZlcnNfY291bnQsIHdmc2luay0+d3JpdGVfYnVmZmVyKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgZ3VpbnQKK2dzdF93YXZlZm9ybV9zaW5rX2RlbGF5IChHc3RBdWRpb1NpbmsgKiBhc2luaykKK3sKKyAgLyogcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpbiBxdWV1ZSAoZGV2aWNlK2ludGVybmFsIHF1ZXVlKSAqLworICBHc3RXYXZlRm9ybVNpbmsgKndmc2luayA9IEdTVF9XQVZFRk9STV9TSU5LIChhc2luayk7CisgIGd1aW50IGJ5dGVzX2luX2RldmljZSA9CisgICAgICAod2ZzaW5rLT5idWZmZXJfY291bnQgLSB3ZnNpbmstPmZyZWVfYnVmZmVyc19jb3VudCkgKiB3ZnNpbmstPmJ1ZmZlcl9zaXplOworICBndWludCBkZWxheSA9CisgICAgICAoYnl0ZXNfaW5fZGV2aWNlICsgd2ZzaW5rLT5ieXRlc19pbl9xdWV1ZSkgLyB3ZnNpbmstPmJ5dGVzX3Blcl9zYW1wbGU7CisgIHJldHVybiBkZWxheTsKK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZlZm9ybV9zaW5rX3Jlc2V0IChHc3RBdWRpb1NpbmsgKiBhc2luaykKK3sKKyAgR3N0V2F2ZUZvcm1TaW5rICp3ZnNpbmsgPSBHU1RfV0FWRUZPUk1fU0lOSyAoYXNpbmspOworICBNTVJFU1VMVCBtbXJlc3VsdCA9IHdhdmVPdXRSZXNldCAod2ZzaW5rLT5od2F2ZW91dCk7CisKKyAgaWYgKG1tcmVzdWx0ICE9IE1NU1lTRVJSX05PRVJST1IpIHsKKyAgICB3YXZlT3V0R2V0RXJyb3JUZXh0IChtbXJlc3VsdCwgd2ZzaW5rLT5lcnJvcl9zdHJpbmcsIEVSUk9SX0xFTkdUSCAtIDEpOworICAgIEdTVF9DQVRfV0FSTklOR19PQkpFQ1QgKHdhdmVmb3Jtc2lua19kZWJ1Zywgd2ZzaW5rLAorICAgICAgICAiZ3N0X3dhdmVmb3JtX3NpbmtfcmVzZXQ6IEVycm9yIHJlc2V0aW5nIHdhdmVmb3JtLWF1ZGlvIGRldmljZSA9PiAlcyIsCisgICAgICAgIHdmc2luay0+ZXJyb3Jfc3RyaW5nKTsKKyAgfQorfQorCitHc3RDYXBzICoKK2dzdF93YXZlZm9ybV9zaW5rX2NyZWF0ZV9jYXBzIChnaW50IHJhdGUsIGdpbnQgY2hhbm5lbHMsIGNvbnN0IGdjaGFyICogZm9ybWF0KQoreworICBHc3RDYXBzICpjYXBzID0gTlVMTDsKKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcmF3IiwKKyAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCBmb3JtYXQsCisgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImludGVybGVhdmVkIiwKKyAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIGNoYW5uZWxzLCAicmF0ZSIsIEdfVFlQRV9JTlQsIHJhdGUsIE5VTEwpOworICByZXR1cm4gY2FwczsKK30KKwordm9pZCBDQUxMQkFDSword2F2ZU91dFByb2MgKEhXQVZFT1VUIGh3bywKKyAgICBVSU5UIHVNc2csIERXT1JEX1BUUiBkd0luc3RhbmNlLCBEV09SRF9QVFIgZHdQYXJhbTEsIERXT1JEX1BUUiBkd1BhcmFtMikKK3sKKyAgR3N0V2F2ZUZvcm1TaW5rICp3ZnNpbmsgPSAoR3N0V2F2ZUZvcm1TaW5rICopIGR3SW5zdGFuY2U7CisKKyAgaWYgKHVNc2cgPT0gV09NX0RPTkUpIHsKKyAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiAoJndmc2luay0+Y3JpdGljX3dhdmUpOworICAgIHdmc2luay0+ZnJlZV9idWZmZXJzX2NvdW50Kys7CisgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24gKCZ3ZnNpbmstPmNyaXRpY193YXZlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5oIGIvc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MGRmYzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvd2F2ZWZvcm0vZ3N0d2F2ZWZvcm1zaW5rLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAgMjAwNSBTZWJhc3RpZW4gTW91dHRlIDxzZWJhc3RpZW5AbW91dHRlLm5ldD4KKyAqCisgKiBnc3R3YXZlZm9ybXNpbmsuaDogCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9XQVZFRk9STVNJTktfSF9fCisjZGVmaW5lIF9fR1NUX1dBVkVGT1JNU0lOS19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9zaW5rLmg+CisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8bW1zeXN0ZW0uaD4KKworI2lmbmRlZiBXQVZFX0ZPUk1BVF85Nk0wOAorI2RlZmluZSBXQVZFX0ZPUk1BVF85Nk0wOCAgICAgICAweDAwMDAxMDAwICAgICAgIC8qIDk2ICAga0h6LCBNb25vLCAgIDgtYml0ICAqLworI2VuZGlmCisKKyNpZm5kZWYgV0FWRV9GT1JNQVRfOTZTMDgKKyNkZWZpbmUgV0FWRV9GT1JNQVRfOTZTMDggICAgICAgMHgwMDAwMjAwMCAgICAgICAvKiA5NiAgIGtIeiwgU3RlcmVvLCA4LWJpdCAgKi8KKyNlbmRpZgorCisjaWZuZGVmIFdBVkVfRk9STUFUXzk2TTE2CisjZGVmaW5lIFdBVkVfRk9STUFUXzk2TTE2ICAgICAgIDB4MDAwMDQwMDAgICAgICAgLyogOTYgICBrSHosIE1vbm8sICAgMTYtYml0ICovCisjZW5kaWYKKworI2lmbmRlZiBXQVZFX0ZPUk1BVF85NlMxNgorI2RlZmluZSBXQVZFX0ZPUk1BVF85NlMxNiAgICAgICAweDAwMDA4MDAwICAgICAgIC8qIDk2ICAga0h6LCBTdGVyZW8sIDE2LWJpdCAqLworI2VuZGlmCisKKyNkZWZpbmUgRVJST1JfTEVOR1RIIE1BWEVSUk9STEVOR1RIKzUwCisjZGVmaW5lIEJVRkZFUl9DT1VOVCAyMAorI2RlZmluZSBCVUZGRVJfU0laRSA4MTkyCisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfV0FWRUZPUk1fU0lOSyAgICAgICAgICAgICAgICAoZ3N0X3dhdmVmb3JtX3NpbmtfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1dBVkVGT1JNX1NJTksob2JqKSAgICAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfV0FWRUZPUk1fU0lOSyxHc3RXYXZlRm9ybVNpbmspKQorI2RlZmluZSBHU1RfV0FWRUZPUk1fU0lOS19DTEFTUyhrbGFzcykgICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1dBVkVGT1JNX1NJTkssR3N0V2F2ZUZvcm1TaW5rQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfV0FWRUZPUk1fU0lOSyhvYmopICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9XQVZFRk9STV9TSU5LKSkKKyNkZWZpbmUgR1NUX0lTX1dBVkVGT1JNX1NJTktfQ0xBU1Moa2xhc3MpICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9XQVZFRk9STV9TSU5LKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RXYXZlRm9ybVNpbmsgR3N0V2F2ZUZvcm1TaW5rOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFdhdmVGb3JtU2lua0NsYXNzIEdzdFdhdmVGb3JtU2lua0NsYXNzOworCitzdHJ1Y3QgX0dzdFdhdmVGb3JtU2luaworeworICAvKiBwYXJlbnQgb2JqZWN0ICovCisgIEdzdEF1ZGlvU2luayBzaW5rOworCisgIC8qIHN1cHBvcnRlZCBjYXBzICovCisgIEdzdENhcHMgKmNhY2hlZF9jYXBzOworICAKKyAgLyogaGFuZGxlIHRvIHRoZSB3YXZlZm9ybS1hdWRpbyBvdXRwdXQgZGV2aWNlICovCisgIEhXQVZFT1VUIGh3YXZlb3V0OworICAKKyAgLyogdGFibGUgb2YgYnVmZmVyIGhlYWRlcnMgKi8KKyAgV0FWRUhEUiAqd2F2ZV9idWZmZXJzOworCisgIC8qIGNyaXRpY2FsIHNlY3Rpb24gcHJvdGVjdGluZyBhY2Nlc3MgdG8gdGhlIG51bWJlciBvZiBmcmVlIGJ1ZmZlcnMgKi8KKyAgQ1JJVElDQUxfU0VDVElPTiBjcml0aWNfd2F2ZTsKKworICAvKiBudW1iZXIgb2YgZnJlZSBidWZmZXJzIGF2YWlsYWJsZSAqLworICBndWludCBmcmVlX2J1ZmZlcnNfY291bnQ7CisgIAorICAvKiBjdXJyZW50IGZyZWUgYnVmZmVyIHdoZXJlIHlvdSBoYXZlIHRvIHdyaXRlIGluY29taW5nIGRhdGEgKi8KKyAgZ3VpbnQgd3JpdGVfYnVmZmVyOworICAKKyAgLyogc2l6ZSBvZiBidWZmZXJzIHN0cmVhbWVkIHRvIHRoZSBkZXZpY2UgKi8KKyAgZ3VpbnQgYnVmZmVyX3NpemU7CisKKyAgLyogbnVtYmVyIG9mIGJ1ZmZlcnMgc3RyZWFtZWQgdG8gdGhlIGRldmljZSAqLworICBndWludCBidWZmZXJfY291bnQ7CisKKyAgLyogdG90YWwgb2YgYnl0ZXMgaW4gcXVldWUgYmVmb3JlIHRoZXkgYXJlIHdyaXR0ZW4gdG8gdGhlIGRldmljZSAqLworICBndWludCBieXRlc19pbl9xdWV1ZTsKKworICAvKiBieXRlcyBwZXIgc2FtcGxlIGZyb20gc2V0Y2FwcyB1c2VkIHRvIGV2YWx1YXRlIHRoZSBudW1iZXIgc2FtcGxlcyByZXR1cm5lZCBieSBkZWxheSAqLworICBndWludCBieXRlc19wZXJfc2FtcGxlOworCisgIC8qIHdhdmUgZm9ybSBlcnJvciBzdHJpbmcgKi8KKyAgZ2NoYXIgZXJyb3Jfc3RyaW5nW0VSUk9SX0xFTkdUSF07Cit9OworCitzdHJ1Y3QgX0dzdFdhdmVGb3JtU2lua0NsYXNzCit7CisgIEdzdEF1ZGlvU2lua0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF93YXZlZm9ybV9zaW5rX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9XQVZFRk9STVNJTktfSF9fICovCmRpZmYgLS1naXQgYS9zeXMveGltYWdlL01ha2VmaWxlLmFtIGIvc3lzL3hpbWFnZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDZiMzVlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3hpbWFnZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE1IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3R4aW1hZ2VzcmMubGEKKworbGliZ3N0eGltYWdlc3JjX2xhX1NPVVJDRVMgPSBnc3R4aW1hZ2VzcmMuYyB4aW1hZ2V1dGlsLmMKK2xpYmdzdHhpbWFnZXNyY19sYV9DRkxBR1MgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgXAorCSQoR1NUX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQ0ZMQUdTKSBcCisJJChYX0NGTEFHUykgJChYRklYRVNfQ0ZMQUdTKSAkKFhEQU1BR0VfQ0ZMQUdTKQorbGliZ3N0eGltYWdlc3JjX2xhX0xJQkFERCA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R2aWRlby0kKEdTVF9BUElfVkVSU0lPTikgXAorCSQoR1NUX0JBU0VfTElCUykgXAorCSQoWF9MSUJTKSAkKFhTSE1fTElCUykgJChYRklYRVNfTElCUykgJChYREFNQUdFX0xJQlMpIAorbGliZ3N0eGltYWdlc3JjX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3R4aW1hZ2VzcmMuaCB4aW1hZ2V1dGlsLmgKZGlmZiAtLWdpdCBhL3N5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmMgYi9zeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYWQ0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jCkBAIC0wLDAgKzEsMTMzNiBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFphaGVlciBNZXJhbGkgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXhpbWFnZXNyYworICoKKyAqIFRoaXMgZWxlbWVudCBjYXB0dXJlcyB5b3VyIFggRGlzcGxheSBhbmQgY3JlYXRlcyByYXcgUkdCIHZpZGVvLiAgSXQgdXNlcworICogdGhlIFhEYW1hZ2UgZXh0ZW5zaW9uIGlmIGF2YWlsYWJsZSB0byBvbmx5IGNhcHR1cmUgYXJlYXMgb2YgdGhlIHNjcmVlbiB0aGF0CisgKiBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgZnJhbWUuICBJdCB1c2VzIHRoZSBYRml4ZXMgZXh0ZW5zaW9uIGlmCisgKiBhdmFpbGFibGUgdG8gYWxzbyBjYXB0dXJlIHlvdXIgbW91c2UgcG9pbnRlci4gIEJ5IGRlZmF1bHQgaXQgd2lsbCBmaXhhdGUgdG8KKyAqIDI1IGZyYW1lcyBwZXIgc2Vjb25kLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgeGltYWdlc3JjICEgdmlkZW8veC1yYXcsZnJhbWVyYXRlPTUvMSAhIHZpZGVvY29udmVydCAhIHRoZW9yYWVuYyAhIG9nZ211eCAhIGZpbGVzaW5rIGxvY2F0aW9uPWRlc2t0b3Aub2dnCisgKiBdfCBFbmNvZGVzIHlvdXIgWCBkaXNwbGF5IHRvIGFuIE9nZyB0aGVvcmEgdmlkZW8gYXQgNSBmcmFtZXMgcGVyIHNlY29uZC4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgImdzdHhpbWFnZXNyYy5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworI2luY2x1ZGUgImdzdC9nbGliLWNvbXBhdC1wcml2YXRlLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9kZWJ1Z194aW1hZ2Vfc3JjKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9kZWJ1Z194aW1hZ2Vfc3JjCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSB0ID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwgR1NUX1BBRF9TUkMsIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtcmF3LCAiCisgICAgICAgICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMCwgTUFYIF0sICIKKyAgICAgICAgIndpZHRoID0gKGludCkgWyAxLCBNQVggXSwgIiAiaGVpZ2h0ID0gKGludCkgWyAxLCBNQVggXSwgIgorICAgICAgICAicGl4ZWwtYXNwZWN0LXJhdGlvID0gKGZyYWN0aW9uKSBbIDAsIE1BWCBdIikpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9ESVNQTEFZX05BTUUsCisgIFBST1BfU0hPV19QT0lOVEVSLAorICBQUk9QX1VTRV9EQU1BR0UsCisgIFBST1BfU1RBUlRYLAorICBQUk9QX1NUQVJUWSwKKyAgUFJPUF9FTkRYLAorICBQUk9QX0VORFksCisgIFBST1BfUkVNT1RFLAorICBQUk9QX1hJRCwKKyAgUFJPUF9YTkFNRSwKK307CisKKyNkZWZpbmUgZ3N0X3hpbWFnZV9zcmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0WEltYWdlU3JjLCBnc3RfeGltYWdlX3NyYywgR1NUX1RZUEVfUFVTSF9TUkMpOworCitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3hpbWFnZV9zcmNfZml4YXRlIChHc3RCYXNlU3JjICogYnNyYywgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIHZvaWQgZ3N0X3hpbWFnZV9zcmNfY2xlYXJfYnVmcG9vbCAoR3N0WEltYWdlU3JjICogeGltYWdlc3JjKTsKKworLyogQ2FsbGVkIHdoZW4gYSBidWZmZXIgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcGlwZWxpbmUgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3hpbWFnZV9zcmNfcmV0dXJuX2J1ZiAoR3N0WEltYWdlU3JjICogeGltYWdlc3JjLCBHc3RCdWZmZXIgKiB4aW1hZ2UpCit7CisgIEdzdE1ldGFYSW1hZ2UgKm1ldGEgPSBHU1RfTUVUQV9YSU1BR0VfR0VUICh4aW1hZ2UpOworICAvKiBUcnVlIHdpbGwgbWFrZSBkaXNwb3NlIGZyZWUgdGhlIGJ1ZmZlciwgd2hpbGUgZmFsc2Ugd2lsbCBrZWVwIGl0ICovCisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgLyogSWYgb3VyIGdlb21ldHJ5IGNoYW5nZWQgd2UgY2FuJ3QgcmV1c2UgdGhhdCBpbWFnZS4gKi8KKyAgaWYgKChtZXRhLT53aWR0aCAhPSB4aW1hZ2VzcmMtPndpZHRoKSB8fCAobWV0YS0+aGVpZ2h0ICE9IHhpbWFnZXNyYy0+aGVpZ2h0KSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHhpbWFnZXNyYywKKyAgICAgICAgImRlc3Ryb3kgaW1hZ2UgJXAgYXMgaXRzIHNpemUgY2hhbmdlZCAlZHglZCB2cyBjdXJyZW50ICVkeCVkIiwKKyAgICAgICAgeGltYWdlLCBtZXRhLT53aWR0aCwgbWV0YS0+aGVpZ2h0LCB4aW1hZ2VzcmMtPndpZHRoLCB4aW1hZ2VzcmMtPmhlaWdodCk7CisgICAgZ19tdXRleF9sb2NrICgmeGltYWdlc3JjLT54X2xvY2spOworICAgIGdzdF94aW1hZ2V1dGlsX3hpbWFnZV9kZXN0cm95ICh4aW1hZ2VzcmMtPnhjb250ZXh0LCB4aW1hZ2UpOworICAgIGdfbXV0ZXhfdW5sb2NrICgmeGltYWdlc3JjLT54X2xvY2spOworICB9IGVsc2UgeworICAgIC8qIEluIHRoYXQgY2FzZSB3ZSBjYW4gcmV1c2UgdGhlIGltYWdlIGFuZCBhZGQgaXQgdG8gb3VyIGltYWdlIHBvb2wuICovCisgICAgR1NUX0xPR19PQkpFQ1QgKHhpbWFnZXNyYywgInJlY3ljbGluZyBpbWFnZSAlcCBpbiBwb29sIiwgeGltYWdlKTsKKyAgICAvKiBuZWVkIHRvIGluY3JlbWVudCB0aGUgcmVmY291bnQgYWdhaW4gdG8gcmVjeWNsZSAqLworICAgIGdzdF9idWZmZXJfcmVmICh4aW1hZ2UpOworICAgIGdfbXV0ZXhfbG9jayAoJnhpbWFnZXNyYy0+cG9vbF9sb2NrKTsKKyAgICBHU1RfQlVGRkVSX0ZMQUdTIChHU1RfQlVGRkVSICh4aW1hZ2UpKSA9IDA7IC8qIGNsZWFyIG91dCBhbnkgZmxhZ3MgZnJvbSB0aGUgcHJldmlvdXMgdXNlICovCisgICAgeGltYWdlc3JjLT5idWZmZXJfcG9vbCA9IGdfc2xpc3RfcHJlcGVuZCAoeGltYWdlc3JjLT5idWZmZXJfcG9vbCwgeGltYWdlKTsKKyAgICBnX211dGV4X3VubG9jayAoJnhpbWFnZXNyYy0+cG9vbF9sb2NrKTsKKyAgICByZXQgPSBGQUxTRTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBXaW5kb3cKK2dzdF94aW1hZ2Vfc3JjX2ZpbmRfd2luZG93IChHc3RYSW1hZ2VTcmMgKiBzcmMsIFdpbmRvdyByb290LCBjb25zdCBjaGFyICpuYW1lKQoreworICBXaW5kb3cgKmNoaWxkcmVuOworICBXaW5kb3cgd2luZG93ID0gMCwgcm9vdF9yZXR1cm4sIHBhcmVudF9yZXR1cm47CisgIHVuc2lnbmVkIGludCBuY2hpbGRyZW47CisgIGNoYXIgKnRtcG5hbWU7CisgIGludCBuLCBzdGF0dXM7CisKKyAgc3RhdHVzID0gWEZldGNoTmFtZSAoc3JjLT54Y29udGV4dC0+ZGlzcCwgcm9vdCwgJnRtcG5hbWUpOworICBpZiAoc3RhdHVzICYmICFzdHJjbXAgKG5hbWUsIHRtcG5hbWUpKQorICAgIHJldHVybiByb290OworCisgIHN0YXR1cyA9CisgICAgICBYUXVlcnlUcmVlIChzcmMtPnhjb250ZXh0LT5kaXNwLCByb290LCAmcm9vdF9yZXR1cm4sICZwYXJlbnRfcmV0dXJuLAorICAgICAgJmNoaWxkcmVuLCAmbmNoaWxkcmVuKTsKKyAgaWYgKCFzdGF0dXMgfHwgIWNoaWxkcmVuKQorICAgIHJldHVybiAoV2luZG93KSAwOworCisgIGZvciAobiA9IDA7IG4gPCBuY2hpbGRyZW47ICsrbikgeworICAgIHdpbmRvdyA9IGdzdF94aW1hZ2Vfc3JjX2ZpbmRfd2luZG93IChzcmMsIGNoaWxkcmVuW25dLCBuYW1lKTsKKyAgICBpZiAod2luZG93ICE9IDApCisgICAgICBicmVhazsKKyAgfQorCisgIFhGcmVlIChjaGlsZHJlbik7CisgIHJldHVybiB3aW5kb3c7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3hpbWFnZV9zcmNfb3Blbl9kaXNwbGF5IChHc3RYSW1hZ2VTcmMgKiBzLCBjb25zdCBnY2hhciAqIG5hbWUpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfWElNQUdFX1NSQyAocyksIEZBTFNFKTsKKworICBpZiAocy0+eGNvbnRleHQgIT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBnX211dGV4X2xvY2sgKCZzLT54X2xvY2spOworICBzLT54Y29udGV4dCA9IHhpbWFnZXV0aWxfeGNvbnRleHRfZ2V0IChHU1RfRUxFTUVOVCAocyksIG5hbWUpOworICBpZiAocy0+eGNvbnRleHQgPT0gTlVMTCkgeworICAgIGdfbXV0ZXhfdW5sb2NrICgmcy0+eF9sb2NrKTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwKKyAgICAgICAgKCJDb3VsZCBub3Qgb3BlbiBYIGRpc3BsYXkgZm9yIHJlYWRpbmciKSwKKyAgICAgICAgKCJOVUxMIHJldHVybmVkIGZyb20gZ2V0dGluZyB4Y29udGV4dCIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcy0+d2lkdGggPSBzLT54Y29udGV4dC0+d2lkdGg7CisgIHMtPmhlaWdodCA9IHMtPnhjb250ZXh0LT5oZWlnaHQ7CisKKyAgcy0+eHdpbmRvdyA9IHMtPnhjb250ZXh0LT5yb290OworICBpZiAocy0+eGlkICE9IDAgfHwgcy0+eG5hbWUpIHsKKyAgICBpbnQgc3RhdHVzOworICAgIFhXaW5kb3dBdHRyaWJ1dGVzIGF0dHJzOworICAgIFdpbmRvdyB3aW5kb3c7CisgICAgaW50IHgsIHk7CisgICAgV2luZG93IGNoaWxkOworICAgIEJvb2wgY29vcmRfdHJhbnNsYXRlZDsKKworICAgIGlmIChzLT54aWQgIT0gMCkgeworICAgICAgc3RhdHVzID0gWEdldFdpbmRvd0F0dHJpYnV0ZXMgKHMtPnhjb250ZXh0LT5kaXNwLCBzLT54aWQsICZhdHRycyk7CisgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHMsICJGb3VuZCB3aW5kb3cgWElEICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHMtPnhpZCk7CisgICAgICAgIHMtPnh3aW5kb3cgPSBzLT54aWQ7CisgICAgICAgIGdvdG8gd2luZG93X2ZvdW5kOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzLCAiRmFpbGVkIHRvIGdldCB3aW5kb3cgJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAgICAgIiBhdHRyaWJ1dGVzIiwgcy0+eGlkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+eG5hbWUpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHMsICJMb29raW5nIGZvciB3aW5kb3cgJXMiLCBzLT54bmFtZSk7CisgICAgICB3aW5kb3cgPSBnc3RfeGltYWdlX3NyY19maW5kX3dpbmRvdyAocywgcy0+eGNvbnRleHQtPnJvb3QsIHMtPnhuYW1lKTsKKyAgICAgIGlmICh3aW5kb3cgIT0gMCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzLCAiRm91bmQgd2luZG93IG5hbWVkICVzLCAiLCBzLT54bmFtZSk7CisgICAgICAgIHN0YXR1cyA9IFhHZXRXaW5kb3dBdHRyaWJ1dGVzIChzLT54Y29udGV4dC0+ZGlzcCwgd2luZG93LCAmYXR0cnMpOworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgcy0+eHdpbmRvdyA9IHdpbmRvdzsKKyAgICAgICAgICBnb3RvIHdpbmRvd19mb3VuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHMsICJGYWlsZWQgdG8gZ2V0IHdpbmRvdyBhdHRyaWJ1dGVzIGZvciAiCisgICAgICAgICAgICAgICJ3aW5kb3cgbmFtZWQgJXMiLCBzLT54bmFtZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHMsICJVc2luZyByb290IHdpbmRvdyIpOworICAgIGdvdG8gdXNlX3Jvb3Rfd2luZG93OworCisgIHdpbmRvd19mb3VuZDoKKyAgICBnX2Fzc2VydCAocy0+eHdpbmRvdyAhPSAwKTsKKyAgICBzLT53aWR0aCA9IGF0dHJzLndpZHRoOworICAgIHMtPmhlaWdodCA9IGF0dHJzLmhlaWdodDsKKworICAgIGNvb3JkX3RyYW5zbGF0ZWQgPSBYVHJhbnNsYXRlQ29vcmRpbmF0ZXMgKHMtPnhjb250ZXh0LT5kaXNwLCBzLT54d2luZG93LAorICAgICAgICBzLT54Y29udGV4dC0+cm9vdCwgMCwgMCwgJngsICZ5LCAmY2hpbGQpOworICAgIGlmIChjb29yZF90cmFuc2xhdGVkKSB7CisgICAgICBzLT54ID0geDsKKyAgICAgIHMtPnkgPSB5OworICAgIH0gZWxzZSB7CisgICAgICBzLT54ID0gMDsKKyAgICAgIHMtPnkgPSAwOworICAgIH0KKworICAgIEdTVF9JTkZPX09CSkVDVCAocywgIlVzaW5nIGRlZmF1bHQgd2luZG93IHNpemUgb2YgJWR4JWQgYXQgbG9jYXRpb24gJWQsJWQiLAorICAgICAgICBzLT53aWR0aCwgcy0+aGVpZ2h0LCBzLT54LCBzLT55KTsKKyAgfQordXNlX3Jvb3Rfd2luZG93OgorCisjaWZkZWYgSEFWRV9YRklYRVMKKyAgLyogY2hlY2sgaWYgeGZpeGVzIHN1cHBvcnRlZCAqLworICB7CisgICAgaW50IGVycm9yX2Jhc2U7CisKKyAgICBpZiAoWEZpeGVzUXVlcnlFeHRlbnNpb24gKHMtPnhjb250ZXh0LT5kaXNwLCAmcy0+Zml4ZXNfZXZlbnRfYmFzZSwKKyAgICAgICAgICAgICZlcnJvcl9iYXNlKSkgeworICAgICAgcy0+aGF2ZV94Zml4ZXMgPSBUUlVFOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocywgIlggU2VydmVyIHN1cHBvcnRzIFhGaXhlcyIpOworICAgIH0gZWxzZSB7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHMsICJYIFNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IFhGaXhlcyIpOworICAgIH0KKyAgfQorCisjaWZkZWYgSEFWRV9YREFNQUdFCisgIC8qIGNoZWNrIGlmIHhkYW1hZ2UgaXMgc3VwcG9ydGVkICovCisgIHsKKyAgICBpbnQgZXJyb3JfYmFzZTsKKyAgICBsb25nIGV2bWFzayA9IE5vRXZlbnRNYXNrOworCisgICAgcy0+aGF2ZV94ZGFtYWdlID0gRkFMU0U7CisgICAgcy0+ZGFtYWdlID0gTm9uZTsKKyAgICBzLT5kYW1hZ2VfY29weV9nYyA9IE5vbmU7CisgICAgcy0+ZGFtYWdlX3JlZ2lvbiA9IE5vbmU7CisKKyAgICBpZiAoWERhbWFnZVF1ZXJ5RXh0ZW5zaW9uIChzLT54Y29udGV4dC0+ZGlzcCwgJnMtPmRhbWFnZV9ldmVudF9iYXNlLAorICAgICAgICAgICAgJmVycm9yX2Jhc2UpKSB7CisgICAgICBzLT5kYW1hZ2UgPQorICAgICAgICAgIFhEYW1hZ2VDcmVhdGUgKHMtPnhjb250ZXh0LT5kaXNwLCBzLT54d2luZG93LCBYRGFtYWdlUmVwb3J0Tm9uRW1wdHkpOworICAgICAgaWYgKHMtPmRhbWFnZSAhPSBOb25lKSB7CisgICAgICAgIHMtPmRhbWFnZV9yZWdpb24gPSBYRml4ZXNDcmVhdGVSZWdpb24gKHMtPnhjb250ZXh0LT5kaXNwLCBOVUxMLCAwKTsKKyAgICAgICAgaWYgKHMtPmRhbWFnZV9yZWdpb24gIT0gTm9uZSkgeworICAgICAgICAgIFhHQ1ZhbHVlcyB2YWx1ZXM7CisKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzLCAiVXNpbmcgWERhbWFnZSBleHRlbnNpb24iKTsKKyAgICAgICAgICB2YWx1ZXMuc3Vid2luZG93X21vZGUgPSBJbmNsdWRlSW5mZXJpb3JzOworICAgICAgICAgIHMtPmRhbWFnZV9jb3B5X2djID0gWENyZWF0ZUdDIChzLT54Y29udGV4dC0+ZGlzcCwKKyAgICAgICAgICAgICAgcy0+eHdpbmRvdywgR0NTdWJ3aW5kb3dNb2RlLCAmdmFsdWVzKTsKKyAgICAgICAgICBYU2VsZWN0SW5wdXQgKHMtPnhjb250ZXh0LT5kaXNwLCBzLT54d2luZG93LCBldm1hc2spOworCisgICAgICAgICAgcy0+aGF2ZV94ZGFtYWdlID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBYRGFtYWdlRGVzdHJveSAocy0+eGNvbnRleHQtPmRpc3AsIHMtPmRhbWFnZSk7CisgICAgICAgICAgcy0+ZGFtYWdlID0gTm9uZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHMsICJDb3VsZCBub3QgYXR0YWNoIHRvIFhEYW1hZ2UiKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocywgIlggU2VydmVyIGRvZXMgbm90IGhhdmUgWERhbWFnZSBleHRlbnNpb24iKTsKKyAgICB9CisgIH0KKyNlbmRpZgorI2VuZGlmCisKKyAgZ19tdXRleF91bmxvY2sgKCZzLT54X2xvY2spOworCisgIGlmIChzLT54Y29udGV4dCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfeGltYWdlX3NyY19zdGFydCAoR3N0QmFzZVNyYyAqIGJhc2VzcmMpCit7CisgIEdzdFhJbWFnZVNyYyAqcyA9IEdTVF9YSU1BR0VfU1JDIChiYXNlc3JjKTsKKworICBzLT5sYXN0X2ZyYW1lX25vID0gLTE7CisjaWZkZWYgSEFWRV9YREFNQUdFCisgIGlmIChzLT5sYXN0X3hpbWFnZSkKKyAgICBnc3RfYnVmZmVyX3VucmVmIChHU1RfQlVGRkVSX0NBU1QgKHMtPmxhc3RfeGltYWdlKSk7CisgIHMtPmxhc3RfeGltYWdlID0gTlVMTDsKKyNlbmRpZgorICByZXR1cm4gZ3N0X3hpbWFnZV9zcmNfb3Blbl9kaXNwbGF5IChzLCBzLT5kaXNwbGF5X25hbWUpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF94aW1hZ2Vfc3JjX3N0b3AgKEdzdEJhc2VTcmMgKiBiYXNlc3JjKQoreworICBHc3RYSW1hZ2VTcmMgKnNyYyA9IEdTVF9YSU1BR0VfU1JDIChiYXNlc3JjKTsKKworI2lmZGVmIEhBVkVfWERBTUFHRQorICBpZiAoc3JjLT5sYXN0X3hpbWFnZSkKKyAgICBnc3RfYnVmZmVyX3VucmVmIChHU1RfQlVGRkVSX0NBU1QgKHNyYy0+bGFzdF94aW1hZ2UpKTsKKyAgc3JjLT5sYXN0X3hpbWFnZSA9IE5VTEw7CisjZW5kaWYKKworICBnc3RfeGltYWdlX3NyY19jbGVhcl9idWZwb29sIChzcmMpOworCisjaWZkZWYgSEFWRV9YRklYRVMKKyAgaWYgKHNyYy0+Y3Vyc29yX2ltYWdlKQorICAgIFhGcmVlIChzcmMtPmN1cnNvcl9pbWFnZSk7CisgIHNyYy0+Y3Vyc29yX2ltYWdlID0gTlVMTDsKKyNlbmRpZgorCisgIGlmIChzcmMtPnhjb250ZXh0KSB7CisgICAgZ19tdXRleF9sb2NrICgmc3JjLT54X2xvY2spOworCisjaWZkZWYgSEFWRV9YREFNQUdFCisgICAgaWYgKHNyYy0+ZGFtYWdlX2NvcHlfZ2MgIT0gTm9uZSkgeworICAgICAgWEZyZWVHQyAoc3JjLT54Y29udGV4dC0+ZGlzcCwgc3JjLT5kYW1hZ2VfY29weV9nYyk7CisgICAgICBzcmMtPmRhbWFnZV9jb3B5X2djID0gTm9uZTsKKyAgICB9CisgICAgaWYgKHNyYy0+ZGFtYWdlX3JlZ2lvbiAhPSBOb25lKSB7CisgICAgICBYRml4ZXNEZXN0cm95UmVnaW9uIChzcmMtPnhjb250ZXh0LT5kaXNwLCBzcmMtPmRhbWFnZV9yZWdpb24pOworICAgICAgc3JjLT5kYW1hZ2VfcmVnaW9uID0gTm9uZTsKKyAgICB9CisgICAgaWYgKHNyYy0+ZGFtYWdlICE9IE5vbmUpIHsKKyAgICAgIFhEYW1hZ2VEZXN0cm95IChzcmMtPnhjb250ZXh0LT5kaXNwLCBzcmMtPmRhbWFnZSk7CisgICAgICBzcmMtPmRhbWFnZSA9IE5vbmU7CisgICAgfQorI2VuZGlmCisKKyAgICB4aW1hZ2V1dGlsX3hjb250ZXh0X2NsZWFyIChzcmMtPnhjb250ZXh0KTsKKyAgICBzcmMtPnhjb250ZXh0ID0gTlVMTDsKKyAgICBnX211dGV4X3VubG9jayAoJnNyYy0+eF9sb2NrKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF94aW1hZ2Vfc3JjX3VubG9jayAoR3N0QmFzZVNyYyAqIGJhc2VzcmMpCit7CisgIEdzdFhJbWFnZVNyYyAqc3JjID0gR1NUX1hJTUFHRV9TUkMgKGJhc2VzcmMpOworCisgIC8qIEF3YWtlbiB0aGUgY3JlYXRlKCkgZnVuYyBpZiBpdCdzIHdhaXRpbmcgb24gdGhlIGNsb2NrICovCisgIEdTVF9PQkpFQ1RfTE9DSyAoc3JjKTsKKyAgaWYgKHNyYy0+Y2xvY2tfaWQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJXYWtpbmcgdXAgd2FpdGluZyBjbG9jayIpOworICAgIGdzdF9jbG9ja19pZF91bnNjaGVkdWxlIChzcmMtPmNsb2NrX2lkKTsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoc3JjKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfeGltYWdlX3NyY19yZWNhbGMgKEdzdFhJbWFnZVNyYyAqIHNyYykKK3sKKyAgaWYgKCFzcmMtPnhjb250ZXh0KQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBNYXliZSBsYXRlciB3ZSBjYW4gY2hlY2sgdGhlIGRpc3BsYXkgaGFzbid0IGNoYW5nZWQgc2l6ZSAqLworICAvKiBXZSBjb3VsZCB1c2UgWFF1ZXJ5UG9pbnRlciB0byBnZXQgb25seSB0aGUgY3VycmVudCB3aW5kb3cuICovCisgIHJldHVybiBUUlVFOworfQorCisjaWZkZWYgSEFWRV9YRklYRVMKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3hpbWFnZV9pc19wb2ludGVyX2luX3JlZ2lvbiAoR3N0WEltYWdlU3JjICogc3JjKQoreworICBXaW5kb3cgd2luZG93X3JldHVybmVkOworICBpbnQgcm9vdF94LCByb290X3k7CisgIGludCB3aW5feCwgd2luX3k7CisgIHVuc2lnbmVkIGludCBtYXNrX3JldHVybjsKKyAgQm9vbCBvbl93aW5kb3c7CisKKyAgb25fd2luZG93ID0gWFF1ZXJ5UG9pbnRlciAoc3JjLT54Y29udGV4dC0+ZGlzcCwgc3JjLT54d2luZG93LAorICAgICAgJndpbmRvd19yZXR1cm5lZCwgJndpbmRvd19yZXR1cm5lZCwgJnJvb3RfeCwgJnJvb3RfeSwgJndpbl94LCAmd2luX3ksCisgICAgICAmbWFza19yZXR1cm4pOworCisgIHJldHVybiAob25fd2luZG93ICYmICh3aW5feCA+PSBzcmMtPnN0YXJ0eCkgJiYgKHdpbl95ID49IHNyYy0+c3RhcnR5KSAmJgorICAgICAgKHdpbl94IDwgc3JjLT5lbmR4KSAmJiAod2luX3kgPCBzcmMtPmVuZHkpKTsKK30KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9YRklYRVMKK3N0YXRpYyB2b2lkCitjb21wb3NpdGVfcGl4ZWwgKEdzdFhDb250ZXh0ICogeGNvbnRleHQsIGd1Y2hhciAqIGRlc3QsIGd1Y2hhciAqIHNyYykKK3sKKyAgZ3VpbnQ4IHIgPSBzcmNbMl07CisgIGd1aW50OCBnID0gc3JjWzFdOworICBndWludDggYiA9IHNyY1swXTsKKyAgZ3VpbnQ4IGEgPSBzcmNbM107CisgIGd1aW50OCBkciwgZGcsIGRiOworICBndWludDMyIGNvbG9yOworICBnaW50IHJfc2hpZnQsIHJfbWF4LCByX3NoaWZ0X291dDsKKyAgZ2ludCBnX3NoaWZ0LCBnX21heCwgZ19zaGlmdF9vdXQ7CisgIGdpbnQgYl9zaGlmdCwgYl9tYXgsIGJfc2hpZnRfb3V0OworCisgIHN3aXRjaCAoeGNvbnRleHQtPmJwcCkgeworICAgIGNhc2UgODoKKyAgICAgIGNvbG9yID0gKmRlc3Q7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE2OgorICAgICAgY29sb3IgPSBHVUlOVDE2X0ZST01fTEUgKCooZ3VpbnQxNiAqKSAoZGVzdCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjoKKyAgICAgIGNvbG9yID0gR1VJTlQzMl9GUk9NX0xFICgqKGd1aW50MzIgKikgKGRlc3QpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiBTaG91bGQgbm90IHJlYWNoIGhlcmUgKi8KKyAgICAgIGdfcmV0dXJuX2lmX3JlYWNoZWQgKCk7CisgIH0KKworICAvKiBwb3NzaWJsZSBvcHRpbWlzYXRpb246CisgICAqIG1vdmUgdGhlIGNvZGUgdGhhdCBmaW5kcyBzaGlmdCBhbmQgbWF4IGluIHRoZSBfbGluayBmdW5jdGlvbiAqLworICBmb3IgKHJfc2hpZnQgPSAwOyAhKHhjb250ZXh0LT52aXN1YWwtPnJlZF9tYXNrICYgKDEgPDwgcl9zaGlmdCkpOyByX3NoaWZ0KyspOworICBmb3IgKGdfc2hpZnQgPSAwOyAhKHhjb250ZXh0LT52aXN1YWwtPmdyZWVuX21hc2sgJiAoMSA8PCBnX3NoaWZ0KSk7CisgICAgICBnX3NoaWZ0KyspOworICBmb3IgKGJfc2hpZnQgPSAwOyAhKHhjb250ZXh0LT52aXN1YWwtPmJsdWVfbWFzayAmICgxIDw8IGJfc2hpZnQpKTsgYl9zaGlmdCsrKTsKKworICBmb3IgKHJfc2hpZnRfb3V0ID0gMDsgISh4Y29udGV4dC0+dmlzdWFsLT5yZWRfbWFzayAmICgxIDw8IHJfc2hpZnRfb3V0KSk7CisgICAgICByX3NoaWZ0X291dCsrKTsKKyAgZm9yIChnX3NoaWZ0X291dCA9IDA7ICEoeGNvbnRleHQtPnZpc3VhbC0+Z3JlZW5fbWFzayAmICgxIDw8IGdfc2hpZnRfb3V0KSk7CisgICAgICBnX3NoaWZ0X291dCsrKTsKKyAgZm9yIChiX3NoaWZ0X291dCA9IDA7ICEoeGNvbnRleHQtPnZpc3VhbC0+Ymx1ZV9tYXNrICYgKDEgPDwgYl9zaGlmdF9vdXQpKTsKKyAgICAgIGJfc2hpZnRfb3V0KyspOworCisKKyAgcl9tYXggPSAoeGNvbnRleHQtPnZpc3VhbC0+cmVkX21hc2sgPj4gcl9zaGlmdCk7CisgIGJfbWF4ID0gKHhjb250ZXh0LT52aXN1YWwtPmJsdWVfbWFzayA+PiBiX3NoaWZ0KTsKKyAgZ19tYXggPSAoeGNvbnRleHQtPnZpc3VhbC0+Z3JlZW5fbWFzayA+PiBnX3NoaWZ0KTsKKworI2RlZmluZSBSR0JYWFhfUih4KSAgKCgoeCk+PnJfc2hpZnQpICYgKHJfbWF4KSkKKyNkZWZpbmUgUkdCWFhYX0coeCkgICgoKHgpPj5nX3NoaWZ0KSAmIChnX21heCkpCisjZGVmaW5lIFJHQlhYWF9CKHgpICAoKCh4KT4+Yl9zaGlmdCkgJiAoYl9tYXgpKQorCisgIGRyID0gKFJHQlhYWF9SIChjb2xvcikgKiAyNTUpIC8gcl9tYXg7CisgIGRnID0gKFJHQlhYWF9HIChjb2xvcikgKiAyNTUpIC8gZ19tYXg7CisgIGRiID0gKFJHQlhYWF9CIChjb2xvcikgKiAyNTUpIC8gYl9tYXg7CisKKyAgZHIgPSAociAqIGEgKyAoMHhmZiAtIGEpICogZHIpIC8gMHhmZjsKKyAgZGcgPSAoZyAqIGEgKyAoMHhmZiAtIGEpICogZGcpIC8gMHhmZjsKKyAgZGIgPSAoYiAqIGEgKyAoMHhmZiAtIGEpICogZGIpIC8gMHhmZjsKKworICBjb2xvciA9ICgoKGRyICogcl9tYXgpIC8gMjU1KSA8PCByX3NoaWZ0X291dCkgKworICAgICAgKCgoZGcgKiBnX21heCkgLyAyNTUpIDw8IGdfc2hpZnRfb3V0KSArCisgICAgICAoKChkYiAqIGJfbWF4KSAvIDI1NSkgPDwgYl9zaGlmdF9vdXQpOworCisgIHN3aXRjaCAoeGNvbnRleHQtPmJwcCkgeworICAgIGNhc2UgODoKKyAgICAgICpkZXN0ID0gY29sb3I7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE2OgorICAgICAgKihndWludDE2ICopIChkZXN0KSA9IGNvbG9yOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjoKKyAgICAgICooZ3VpbnQzMiAqKSAoZGVzdCkgPSBjb2xvcjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX3dhcm5pbmcgKCJicHAgJWQgbm90IHN1cHBvcnRlZFxuIiwgeGNvbnRleHQtPmJwcCk7CisgIH0KK30KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9YREFNQUdFCitzdGF0aWMgdm9pZAorY29weV9idWZmZXIgKEdzdEJ1ZmZlciAqIGRlc3QsIEdzdEJ1ZmZlciAqIHNyYykKK3sKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKHNyYywgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChkZXN0LCAwLCBtYXAuZGF0YSwgbWFwLnNpemUpOworICBnc3RfYnVmZmVyX3VubWFwIChzcmMsICZtYXApOworfQorI2VuZGlmCisKKy8qIFJldHJpZXZlIGFuIFhJbWFnZVNyY0J1ZmZlciwgcHJlZmVyYWJseSBmcm9tIG91cgorICogcG9vbCBvZiBleGlzdGluZyBpbWFnZXMgYW5kIHBvcHVsYXRlIGl0IGZyb20gdGhlIHdpbmRvdyAqLworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfeGltYWdlX3NyY194aW1hZ2VfZ2V0IChHc3RYSW1hZ2VTcmMgKiB4aW1hZ2VzcmMpCit7CisgIEdzdEJ1ZmZlciAqeGltYWdlID0gTlVMTDsKKyAgR3N0TWV0YVhJbWFnZSAqbWV0YTsKKworICBnX211dGV4X2xvY2sgKCZ4aW1hZ2VzcmMtPnBvb2xfbG9jayk7CisgIHdoaWxlICh4aW1hZ2VzcmMtPmJ1ZmZlcl9wb29sICE9IE5VTEwpIHsKKyAgICB4aW1hZ2UgPSB4aW1hZ2VzcmMtPmJ1ZmZlcl9wb29sLT5kYXRhOworCisgICAgbWV0YSA9IEdTVF9NRVRBX1hJTUFHRV9HRVQgKHhpbWFnZSk7CisKKyAgICB4aW1hZ2VzcmMtPmJ1ZmZlcl9wb29sID0gZ19zbGlzdF9kZWxldGVfbGluayAoeGltYWdlc3JjLT5idWZmZXJfcG9vbCwKKyAgICAgICAgeGltYWdlc3JjLT5idWZmZXJfcG9vbCk7CisKKyAgICBpZiAoKG1ldGEtPndpZHRoID09IHhpbWFnZXNyYy0+d2lkdGgpIHx8CisgICAgICAgIChtZXRhLT5oZWlnaHQgPT0geGltYWdlc3JjLT5oZWlnaHQpKQorICAgICAgYnJlYWs7CisKKyAgICBnc3RfeGltYWdlX2J1ZmZlcl9mcmVlICh4aW1hZ2UpOworICAgIHhpbWFnZSA9IE5VTEw7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZ4aW1hZ2VzcmMtPnBvb2xfbG9jayk7CisKKyAgaWYgKHhpbWFnZSA9PSBOVUxMKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoeGltYWdlc3JjLCAiY3JlYXRpbmcgaW1hZ2UgKCVkeCVkKSIsCisgICAgICAgIHhpbWFnZXNyYy0+d2lkdGgsIHhpbWFnZXNyYy0+aGVpZ2h0KTsKKworICAgIGdfbXV0ZXhfbG9jayAoJnhpbWFnZXNyYy0+eF9sb2NrKTsKKyAgICB4aW1hZ2UgPSBnc3RfeGltYWdldXRpbF94aW1hZ2VfbmV3ICh4aW1hZ2VzcmMtPnhjb250ZXh0LAorICAgICAgICBHU1RfRUxFTUVOVCAoeGltYWdlc3JjKSwgeGltYWdlc3JjLT53aWR0aCwgeGltYWdlc3JjLT5oZWlnaHQsCisgICAgICAgIChCdWZmZXJSZXR1cm5GdW5jKSAoZ3N0X3hpbWFnZV9zcmNfcmV0dXJuX2J1ZikpOworICAgIGlmICh4aW1hZ2UgPT0gTlVMTCkgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHhpbWFnZXNyYywgUkVTT1VSQ0UsIFdSSVRFLCAoTlVMTCksCisgICAgICAgICAgKCJjb3VsZCBub3QgY3JlYXRlIGEgJWR4JWQgeGltYWdlIiwgeGltYWdlc3JjLT53aWR0aCwKKyAgICAgICAgICAgICAgeGltYWdlc3JjLT5oZWlnaHQpKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmeGltYWdlc3JjLT54X2xvY2spOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZ19tdXRleF91bmxvY2sgKCZ4aW1hZ2VzcmMtPnhfbG9jayk7CisgIH0KKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX1hJTUFHRV9TUkMgKHhpbWFnZXNyYyksIE5VTEwpOworCisgIG1ldGEgPSBHU1RfTUVUQV9YSU1BR0VfR0VUICh4aW1hZ2UpOworCisjaWZkZWYgSEFWRV9YREFNQUdFCisgIGlmICh4aW1hZ2VzcmMtPmhhdmVfeGRhbWFnZSAmJiB4aW1hZ2VzcmMtPnVzZV9kYW1hZ2UgJiYKKyAgICAgIHhpbWFnZXNyYy0+bGFzdF94aW1hZ2UgIT0gTlVMTCkgeworICAgIFhFdmVudCBldjsKKyAgICBnYm9vbGVhbiBoYXZlX2RhbWFnZSA9IEZBTFNFOworCisgICAgLyogaGF2ZV9mcmFtZSBpcyBUUlVFIHdoZW4gZWl0aGVyIHRoZSBlbnRpcmUgc2NyZWVuIGhhcyBiZWVuCisgICAgICogZ3JhYmJlZCBvciB3aGVuIHRoZSBsYXN0IGltYWdlIGhhcyBiZWVuIGNvcGllZCAqLworICAgIGdib29sZWFuIGhhdmVfZnJhbWUgPSBGQUxTRTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHhpbWFnZXNyYywgIlJldHJpZXZpbmcgc2NyZWVuIHVzaW5nIFhEYW1hZ2UiKTsKKworICAgIGRvIHsKKyAgICAgIFhEYW1hZ2VOb3RpZnlFdmVudCAqZGFtYWdlX2V2ID0gKFhEYW1hZ2VOb3RpZnlFdmVudCAqKSAoJmV2KTsKKworICAgICAgWE5leHRFdmVudCAoeGltYWdlc3JjLT54Y29udGV4dC0+ZGlzcCwgJmV2KTsKKworICAgICAgaWYgKGV2LnR5cGUgPT0geGltYWdlc3JjLT5kYW1hZ2VfZXZlbnRfYmFzZSArIFhEYW1hZ2VOb3RpZnkgJiYKKyAgICAgICAgICBkYW1hZ2VfZXYtPmxldmVsID09IFhEYW1hZ2VSZXBvcnROb25FbXB0eSkgeworCisgICAgICAgIFhEYW1hZ2VTdWJ0cmFjdCAoeGltYWdlc3JjLT54Y29udGV4dC0+ZGlzcCwgeGltYWdlc3JjLT5kYW1hZ2UsIE5vbmUsCisgICAgICAgICAgICB4aW1hZ2VzcmMtPmRhbWFnZV9yZWdpb24pOworICAgICAgICBoYXZlX2RhbWFnZSA9IFRSVUU7CisgICAgICB9CisgICAgfSB3aGlsZSAoWFBlbmRpbmcgKHhpbWFnZXNyYy0+eGNvbnRleHQtPmRpc3ApKTsKKworICAgIGlmIChoYXZlX2RhbWFnZSkgeworICAgICAgWFJlY3RhbmdsZSAqcmVjdHM7CisgICAgICBpbnQgbnJlY3RzOworCisgICAgICAvKiBOb3cgY29weSBvdXQgYWxsIG9mIHRoZSBkYW1hZ2VkIHJlY3RhbmdsZXMuICovCisgICAgICByZWN0cyA9CisgICAgICAgICAgWEZpeGVzRmV0Y2hSZWdpb24gKHhpbWFnZXNyYy0+eGNvbnRleHQtPmRpc3AsCisgICAgICAgICAgeGltYWdlc3JjLT5kYW1hZ2VfcmVnaW9uLCAmbnJlY3RzKTsKKyAgICAgIGlmIChyZWN0cyAhPSBOVUxMKSB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGlmICghaGF2ZV9mcmFtZSkgeworICAgICAgICAgIEdTVF9MT0dfT0JKRUNUICh4aW1hZ2VzcmMsCisgICAgICAgICAgICAgICJDb3B5aW5nIGZyb20gbGFzdCBmcmFtZSB4aW1hZ2UtPnNpemU6ICUiIEdfR1NJWkVfRk9STUFULAorICAgICAgICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplICh4aW1hZ2UpKTsKKyAgICAgICAgICBjb3B5X2J1ZmZlciAoeGltYWdlLCB4aW1hZ2VzcmMtPmxhc3RfeGltYWdlKTsKKyAgICAgICAgICBoYXZlX2ZyYW1lID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnJlY3RzOyBpKyspIHsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAoeGltYWdlc3JjLAorICAgICAgICAgICAgICAiRGFtYWdlZCBzdWItcmVnaW9uIEAgJWQsJWQgc2l6ZSAlZHglZCByZXBvcnRlZCIsCisgICAgICAgICAgICAgIHJlY3RzW2ldLngsIHJlY3RzW2ldLnksIHJlY3RzW2ldLndpZHRoLCByZWN0c1tpXS5oZWlnaHQpOworCisgICAgICAgICAgLyogaWYgd2Ugb25seSB3YW50IGEgc21hbGwgYXJlYSwgY2xpcCB0aGlzIGRhbWFnZSByZWdpb24gdG8KKyAgICAgICAgICAgKiBhcmVhIHdlIHdhbnQgKi8KKyAgICAgICAgICBpZiAoeGltYWdlc3JjLT5lbmR4ID4geGltYWdlc3JjLT5zdGFydHggJiYKKyAgICAgICAgICAgICAgeGltYWdlc3JjLT5lbmR5ID4geGltYWdlc3JjLT5zdGFydHkpIHsKKyAgICAgICAgICAgIC8qIHNlZSBpZiBkYW1hZ2UgYXJlYSBpbnRlcnNlY3RzICovCisgICAgICAgICAgICBpZiAocmVjdHNbaV0ueCArIHJlY3RzW2ldLndpZHRoIC0gMSA8IHhpbWFnZXNyYy0+c3RhcnR4IHx8CisgICAgICAgICAgICAgICAgcmVjdHNbaV0ueCA+IHhpbWFnZXNyYy0+ZW5keCkgeworICAgICAgICAgICAgICAvKiB0cml2aWFsIHJlamVjdCAqLworICAgICAgICAgICAgfSBlbHNlIGlmIChyZWN0c1tpXS55ICsgcmVjdHNbaV0uaGVpZ2h0IC0gMSA8IHhpbWFnZXNyYy0+c3RhcnR5IHx8CisgICAgICAgICAgICAgICAgcmVjdHNbaV0ueSA+IHhpbWFnZXNyYy0+ZW5keSkgeworICAgICAgICAgICAgICAvKiB0cml2aWFsIHJlamVjdCAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLyogZmluZCBpbnRlcnNlY3QgcmVnaW9uICovCisgICAgICAgICAgICAgIGludCBzdGFydHgsIHN0YXJ0eSwgd2lkdGgsIGhlaWdodDsKKworICAgICAgICAgICAgICBzdGFydHggPSAocmVjdHNbaV0ueCA8IHhpbWFnZXNyYy0+c3RhcnR4KSA/IHhpbWFnZXNyYy0+c3RhcnR4IDoKKyAgICAgICAgICAgICAgICAgIHJlY3RzW2ldLng7CisgICAgICAgICAgICAgIHN0YXJ0eSA9IChyZWN0c1tpXS55IDwgeGltYWdlc3JjLT5zdGFydHkpID8geGltYWdlc3JjLT5zdGFydHkgOgorICAgICAgICAgICAgICAgICAgcmVjdHNbaV0ueTsKKyAgICAgICAgICAgICAgd2lkdGggPSAocmVjdHNbaV0ueCArIHJlY3RzW2ldLndpZHRoIC0gMSA8IHhpbWFnZXNyYy0+ZW5keCkgPworICAgICAgICAgICAgICAgICAgcmVjdHNbaV0ueCArIHJlY3RzW2ldLndpZHRoIC0gc3RhcnR4IDoKKyAgICAgICAgICAgICAgICAgIHhpbWFnZXNyYy0+ZW5keCAtIHN0YXJ0eCArIDE7CisgICAgICAgICAgICAgIGhlaWdodCA9IChyZWN0c1tpXS55ICsgcmVjdHNbaV0uaGVpZ2h0IC0gMSA8IHhpbWFnZXNyYy0+ZW5keSkgPworICAgICAgICAgICAgICAgICAgcmVjdHNbaV0ueSArIHJlY3RzW2ldLmhlaWdodCAtIHN0YXJ0eSA6IHhpbWFnZXNyYy0+ZW5keSAtCisgICAgICAgICAgICAgICAgICBzdGFydHkgKyAxOworCisgICAgICAgICAgICAgIEdTVF9MT0dfT0JKRUNUICh4aW1hZ2VzcmMsCisgICAgICAgICAgICAgICAgICAiUmV0cmlldmluZyBkYW1hZ2VkIHN1Yi1yZWdpb24gQCAlZCwlZCBzaXplICVkeCVkIGFzIGludGVyc2VjdCByZWdpb24iLAorICAgICAgICAgICAgICAgICAgc3RhcnR4LCBzdGFydHksIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICBYR2V0U3ViSW1hZ2UgKHhpbWFnZXNyYy0+eGNvbnRleHQtPmRpc3AsIHhpbWFnZXNyYy0+eHdpbmRvdywKKyAgICAgICAgICAgICAgICAgIHN0YXJ0eCwgc3RhcnR5LCB3aWR0aCwgaGVpZ2h0LCBBbGxQbGFuZXMsIFpQaXhtYXAsCisgICAgICAgICAgICAgICAgICBtZXRhLT54aW1hZ2UsIHN0YXJ0eCAtIHhpbWFnZXNyYy0+c3RhcnR4LAorICAgICAgICAgICAgICAgICAgc3RhcnR5IC0geGltYWdlc3JjLT5zdGFydHkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIEdTVF9MT0dfT0JKRUNUICh4aW1hZ2VzcmMsCisgICAgICAgICAgICAgICAgIlJldHJpZXZpbmcgZGFtYWdlZCBzdWItcmVnaW9uIEAgJWQsJWQgc2l6ZSAlZHglZCIsCisgICAgICAgICAgICAgICAgcmVjdHNbaV0ueCwgcmVjdHNbaV0ueSwgcmVjdHNbaV0ud2lkdGgsIHJlY3RzW2ldLmhlaWdodCk7CisKKyAgICAgICAgICAgIFhHZXRTdWJJbWFnZSAoeGltYWdlc3JjLT54Y29udGV4dC0+ZGlzcCwgeGltYWdlc3JjLT54d2luZG93LAorICAgICAgICAgICAgICAgIHJlY3RzW2ldLngsIHJlY3RzW2ldLnksCisgICAgICAgICAgICAgICAgcmVjdHNbaV0ud2lkdGgsIHJlY3RzW2ldLmhlaWdodCwKKyAgICAgICAgICAgICAgICBBbGxQbGFuZXMsIFpQaXhtYXAsIG1ldGEtPnhpbWFnZSwgcmVjdHNbaV0ueCwgcmVjdHNbaV0ueSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFhGcmVlIChyZWN0cyk7CisgICAgICB9CisgICAgfQorICAgIGlmICghaGF2ZV9mcmFtZSkgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKHhpbWFnZXNyYywKKyAgICAgICAgICAiQ29weWluZyBmcm9tIGxhc3QgZnJhbWUgeGltYWdlLT5zaXplOiAlIiBHX0dTSVpFX0ZPUk1BVCwKKyAgICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplICh4aW1hZ2UpKTsKKyAgICAgIGNvcHlfYnVmZmVyICh4aW1hZ2UsIHhpbWFnZXNyYy0+bGFzdF94aW1hZ2UpOworICAgIH0KKyNpZmRlZiBIQVZFX1hGSVhFUworICAgIC8qIHJlLWdldCBhcmVhIHdoZXJlIGxhc3QgbW91c2UgcG9pbnRlciB3YXMgIGJ1dCBvbmx5IGlmIGluIG91ciBjbGlwcGluZworICAgICAqIGJvdW5kcyAqLworICAgIGlmICh4aW1hZ2VzcmMtPmN1cnNvcl9pbWFnZSkgeworICAgICAgZ2ludCB4LCB5LCB3aWR0aCwgaGVpZ2h0OworCisgICAgICB4ID0geGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UtPnggLSB4aW1hZ2VzcmMtPmN1cnNvcl9pbWFnZS0+eGhvdCAtCisgICAgICAgICAgeGltYWdlc3JjLT54OworICAgICAgeSA9IHhpbWFnZXNyYy0+Y3Vyc29yX2ltYWdlLT55IC0geGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UtPnlob3QgLQorICAgICAgICAgIHhpbWFnZXNyYy0+eTsKKyAgICAgIHdpZHRoID0geGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UtPndpZHRoOworICAgICAgaGVpZ2h0ID0geGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UtPmhlaWdodDsKKworICAgICAgLyogYm91bmRzIGNoZWNraW5nICovCisgICAgICBpZiAoeCA8IDApCisgICAgICAgIHggPSAwOworICAgICAgaWYgKHkgPCAwKQorICAgICAgICB5ID0gMDsKKyAgICAgIGlmICh4ICsgd2lkdGggPiB4aW1hZ2VzcmMtPnhjb250ZXh0LT53aWR0aCkKKyAgICAgICAgd2lkdGggPSB4aW1hZ2VzcmMtPnhjb250ZXh0LT53aWR0aCAtIHg7CisgICAgICBpZiAoeSArIGhlaWdodCA+IHhpbWFnZXNyYy0+eGNvbnRleHQtPmhlaWdodCkKKyAgICAgICAgaGVpZ2h0ID0geGltYWdlc3JjLT54Y29udGV4dC0+aGVpZ2h0IC0geTsKKyAgICAgIGdfYXNzZXJ0ICh4ID49IDApOworICAgICAgZ19hc3NlcnQgKHkgPj0gMCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUICh4aW1hZ2VzcmMsCisgICAgICAgICAgIkN1cnNvciB3YXMgYXQgKCVkLCVkKSB3aWR0aDogJWQsIGhlaWdodDogJWQgYW5kIG91ciByYW5nZSBpczogKCVkLCVkKSAtICglZCwlZCkiLAorICAgICAgICAgIHgsIHksIHdpZHRoLCBoZWlnaHQsIHhpbWFnZXNyYy0+c3RhcnR4LCB4aW1hZ2VzcmMtPnN0YXJ0eSwKKyAgICAgICAgICB4aW1hZ2VzcmMtPmVuZHgsIHhpbWFnZXNyYy0+ZW5keSk7CisgICAgICAvKiBvbmx5IGdldCB3aGVyZSBjdXJzb3IgbGFzdCB3YXMsIGlmIGl0IGlzIGluIG91ciByYW5nZSAqLworICAgICAgaWYgKHhpbWFnZXNyYy0+ZW5keCA+IHhpbWFnZXNyYy0+c3RhcnR4ICYmCisgICAgICAgICAgeGltYWdlc3JjLT5lbmR5ID4geGltYWdlc3JjLT5zdGFydHkpIHsKKyAgICAgICAgLyogY2hlY2sgYm91bmRzICovCisgICAgICAgIGlmICh4ICsgd2lkdGggPCB4aW1hZ2VzcmMtPnN0YXJ0eCB8fCB4ID4geGltYWdlc3JjLT5lbmR4KSB7CisgICAgICAgICAgLyogdHJpdmlhbCByZWplY3QgKi8KKyAgICAgICAgfSBlbHNlIGlmICh5ICsgaGVpZ2h0IDwgeGltYWdlc3JjLT5zdGFydHkgfHwgeSA+IHhpbWFnZXNyYy0+ZW5keSkgeworICAgICAgICAgIC8qIHRyaXZpYWwgcmVqZWN0ICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogZmluZCBpbnRlcnNlY3QgcmVnaW9uICovCisgICAgICAgICAgaW50IHN0YXJ0eCwgc3RhcnR5LCBpd2lkdGgsIGloZWlnaHQ7CisKKyAgICAgICAgICBzdGFydHggPSAoeCA8IHhpbWFnZXNyYy0+c3RhcnR4KSA/IHhpbWFnZXNyYy0+c3RhcnR4IDogeDsKKyAgICAgICAgICBzdGFydHkgPSAoeSA8IHhpbWFnZXNyYy0+c3RhcnR5KSA/IHhpbWFnZXNyYy0+c3RhcnR5IDogeTsKKyAgICAgICAgICBpd2lkdGggPSAoeCArIHdpZHRoIDwgeGltYWdlc3JjLT5lbmR4KSA/CisgICAgICAgICAgICAgIHggKyB3aWR0aCAtIHN0YXJ0eCA6IHhpbWFnZXNyYy0+ZW5keCAtIHN0YXJ0eDsKKyAgICAgICAgICBpaGVpZ2h0ID0gKHkgKyBoZWlnaHQgPCB4aW1hZ2VzcmMtPmVuZHkpID8KKyAgICAgICAgICAgICAgeSArIGhlaWdodCAtIHN0YXJ0eSA6IHhpbWFnZXNyYy0+ZW5keSAtIHN0YXJ0eTsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh4aW1hZ2VzcmMsICJSZW1vdmluZyBjdXJzb3IgZnJvbSAlZCwlZCIsIHgsIHkpOworICAgICAgICAgIFhHZXRTdWJJbWFnZSAoeGltYWdlc3JjLT54Y29udGV4dC0+ZGlzcCwgeGltYWdlc3JjLT54d2luZG93LAorICAgICAgICAgICAgICBzdGFydHgsIHN0YXJ0eSwgaXdpZHRoLCBpaGVpZ2h0LCBBbGxQbGFuZXMsIFpQaXhtYXAsCisgICAgICAgICAgICAgIG1ldGEtPnhpbWFnZSwgc3RhcnR4IC0geGltYWdlc3JjLT5zdGFydHgsCisgICAgICAgICAgICAgIHN0YXJ0eSAtIHhpbWFnZXNyYy0+c3RhcnR5KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh4aW1hZ2VzcmMsICJSZW1vdmluZyBjdXJzb3IgZnJvbSAlZCwlZCIsIHgsIHkpOworICAgICAgICBYR2V0U3ViSW1hZ2UgKHhpbWFnZXNyYy0+eGNvbnRleHQtPmRpc3AsIHhpbWFnZXNyYy0+eHdpbmRvdywKKyAgICAgICAgICAgIHgsIHksIHdpZHRoLCBoZWlnaHQsIEFsbFBsYW5lcywgWlBpeG1hcCwgbWV0YS0+eGltYWdlLCB4LCB5KTsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYKKworCisgIH0gZWxzZSB7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfWFNITQorICAgIGlmICh4aW1hZ2VzcmMtPnhjb250ZXh0LT51c2VfeHNobSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoeGltYWdlc3JjLCAiUmV0cmlldmluZyBzY3JlZW4gdXNpbmcgWFNobSIpOworICAgICAgWFNobUdldEltYWdlICh4aW1hZ2VzcmMtPnhjb250ZXh0LT5kaXNwLCB4aW1hZ2VzcmMtPnh3aW5kb3csCisgICAgICAgICAgbWV0YS0+eGltYWdlLCB4aW1hZ2VzcmMtPnN0YXJ0eCwgeGltYWdlc3JjLT5zdGFydHksIEFsbFBsYW5lcyk7CisKKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBIQVZFX1hTSE0gKi8KKyAgICB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUICh4aW1hZ2VzcmMsICJSZXRyaWV2aW5nIHNjcmVlbiB1c2luZyBYR2V0SW1hZ2UiKTsKKyAgICAgIGlmICh4aW1hZ2VzcmMtPnJlbW90ZSkgeworICAgICAgICBYR2V0U3ViSW1hZ2UgKHhpbWFnZXNyYy0+eGNvbnRleHQtPmRpc3AsIHhpbWFnZXNyYy0+eHdpbmRvdywKKyAgICAgICAgICAgIHhpbWFnZXNyYy0+c3RhcnR4LCB4aW1hZ2VzcmMtPnN0YXJ0eSwgeGltYWdlc3JjLT53aWR0aCwKKyAgICAgICAgICAgIHhpbWFnZXNyYy0+aGVpZ2h0LCBBbGxQbGFuZXMsIFpQaXhtYXAsIG1ldGEtPnhpbWFnZSwgMCwgMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBtZXRhLT54aW1hZ2UgPQorICAgICAgICAgICAgWEdldEltYWdlICh4aW1hZ2VzcmMtPnhjb250ZXh0LT5kaXNwLCB4aW1hZ2VzcmMtPnh3aW5kb3csCisgICAgICAgICAgICB4aW1hZ2VzcmMtPnN0YXJ0eCwgeGltYWdlc3JjLT5zdGFydHksIHhpbWFnZXNyYy0+d2lkdGgsCisgICAgICAgICAgICB4aW1hZ2VzcmMtPmhlaWdodCwgQWxsUGxhbmVzLCBaUGl4bWFwKTsKKyAgICAgIH0KKyAgICB9CisjaWZkZWYgSEFWRV9YREFNQUdFCisgIH0KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9YRklYRVMKKyAgaWYgKHhpbWFnZXNyYy0+c2hvd19wb2ludGVyICYmIHhpbWFnZXNyYy0+aGF2ZV94Zml4ZXMKKyAgICAgICYmIGdzdF94aW1hZ2VfaXNfcG9pbnRlcl9pbl9yZWdpb24gKHhpbWFnZXNyYykpIHsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHhpbWFnZXNyYywgIlVzaW5nIFhGaXhlcyB0byBkcmF3IGN1cnNvciIpOworICAgIC8qIGdldCBjdXJzb3IgKi8KKyAgICBpZiAoeGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UpCisgICAgICBYRnJlZSAoeGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UpOworICAgIHhpbWFnZXNyYy0+Y3Vyc29yX2ltYWdlID0gWEZpeGVzR2V0Q3Vyc29ySW1hZ2UgKHhpbWFnZXNyYy0+eGNvbnRleHQtPmRpc3ApOworICAgIGlmICh4aW1hZ2VzcmMtPmN1cnNvcl9pbWFnZSAhPSBOVUxMKSB7CisgICAgICBpbnQgY3gsIGN5LCBpLCBqLCBjb3VudDsKKyAgICAgIGludCBzdGFydHgsIHN0YXJ0eSwgaXdpZHRoLCBpaGVpZ2h0OworICAgICAgZ2Jvb2xlYW4gY3Vyc29yX2luX2ltYWdlID0gVFJVRTsKKworICAgICAgY3ggPSB4aW1hZ2VzcmMtPmN1cnNvcl9pbWFnZS0+eCAtIHhpbWFnZXNyYy0+Y3Vyc29yX2ltYWdlLT54aG90IC0KKyAgICAgICAgICB4aW1hZ2VzcmMtPng7CisgICAgICBjeSA9IHhpbWFnZXNyYy0+Y3Vyc29yX2ltYWdlLT55IC0geGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UtPnlob3QgLQorICAgICAgICAgIHhpbWFnZXNyYy0+eTsKKyAgICAgIGNvdW50ID0geGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UtPndpZHRoICogeGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UtPmhlaWdodDsKKworICAgICAgLyogb25seSBnZXQgd2hlcmUgY3Vyc29yIGxhc3Qgd2FzLCBpZiBpdCBpcyBpbiBvdXIgcmFuZ2UgKi8KKyAgICAgIGlmICh4aW1hZ2VzcmMtPmVuZHggPiB4aW1hZ2VzcmMtPnN0YXJ0eCAmJgorICAgICAgICAgIHhpbWFnZXNyYy0+ZW5keSA+IHhpbWFnZXNyYy0+c3RhcnR5KSB7CisgICAgICAgIC8qIGNoZWNrIGJvdW5kcyAqLworICAgICAgICBpZiAoY3ggKyB4aW1hZ2VzcmMtPmN1cnNvcl9pbWFnZS0+d2lkdGggPCAoaW50KSB4aW1hZ2VzcmMtPnN0YXJ0eCB8fAorICAgICAgICAgICAgY3ggPiAoaW50KSB4aW1hZ2VzcmMtPmVuZHgpIHsKKyAgICAgICAgICAvKiB0cml2aWFsIHJlamVjdCAqLworICAgICAgICAgIGN1cnNvcl9pbl9pbWFnZSA9IEZBTFNFOworICAgICAgICB9IGVsc2UgaWYgKGN5ICsgeGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UtPmhlaWdodCA8CisgICAgICAgICAgICAoaW50KSB4aW1hZ2VzcmMtPnN0YXJ0eSB8fCBjeSA+IChpbnQpIHhpbWFnZXNyYy0+ZW5keSkgeworICAgICAgICAgIC8qIHRyaXZpYWwgcmVqZWN0ICovCisgICAgICAgICAgY3Vyc29yX2luX2ltYWdlID0gRkFMU0U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogZmluZCBpbnRlcnNlY3QgcmVnaW9uICovCisKKyAgICAgICAgICBzdGFydHggPSAoY3ggPCAoaW50KSB4aW1hZ2VzcmMtPnN0YXJ0eCkgPyB4aW1hZ2VzcmMtPnN0YXJ0eCA6IGN4OworICAgICAgICAgIHN0YXJ0eSA9IChjeSA8IChpbnQpIHhpbWFnZXNyYy0+c3RhcnR5KSA/IHhpbWFnZXNyYy0+c3RhcnR5IDogY3k7CisgICAgICAgICAgaXdpZHRoID0gKGN4ICsgeGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UtPndpZHRoIDwgeGltYWdlc3JjLT5lbmR4KSA/CisgICAgICAgICAgICAgIGN4ICsgeGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UtPndpZHRoIC0gc3RhcnR4IDoKKyAgICAgICAgICAgICAgeGltYWdlc3JjLT5lbmR4IC0gc3RhcnR4OworICAgICAgICAgIGloZWlnaHQgPQorICAgICAgICAgICAgICAoY3kgKyB4aW1hZ2VzcmMtPmN1cnNvcl9pbWFnZS0+aGVpZ2h0IDwKKyAgICAgICAgICAgICAgeGltYWdlc3JjLT5lbmR5KSA/IGN5ICsgeGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UtPmhlaWdodCAtCisgICAgICAgICAgICAgIHN0YXJ0eSA6IHhpbWFnZXNyYy0+ZW5keSAtIHN0YXJ0eTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhcnR4ID0gY3g7CisgICAgICAgIHN0YXJ0eSA9IGN5OworICAgICAgICBpd2lkdGggPSB4aW1hZ2VzcmMtPmN1cnNvcl9pbWFnZS0+d2lkdGg7CisgICAgICAgIGloZWlnaHQgPSB4aW1hZ2VzcmMtPmN1cnNvcl9pbWFnZS0+aGVpZ2h0OworICAgICAgfQorCisgICAgICBpZiAoY3Vyc29yX2luX2ltYWdlKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHhpbWFnZXNyYywgIkN1cnNvciBpcyBpbiBpbWFnZSBzbyB0cnlpbmcgdG8gZHJhdyBpdCIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgICB4aW1hZ2VzcmMtPmN1cnNvcl9pbWFnZS0+cGl4ZWxzW2ldID0KKyAgICAgICAgICAgICAgR1VJTlRfVE9fTEUgKHhpbWFnZXNyYy0+Y3Vyc29yX2ltYWdlLT5waXhlbHNbaV0pOworICAgICAgICAvKiBjb3B5IHRob3NlIHBpeGVscyBhY3Jvc3MgKi8KKyAgICAgICAgZm9yIChqID0gc3RhcnR5OworICAgICAgICAgICAgaiA8IHN0YXJ0eSArIGloZWlnaHQKKyAgICAgICAgICAgICYmIGogPCB4aW1hZ2VzcmMtPnN0YXJ0eSArIHhpbWFnZXNyYy0+aGVpZ2h0OyBqKyspIHsKKyAgICAgICAgICBmb3IgKGkgPSBzdGFydHg7CisgICAgICAgICAgICAgIGkgPCBzdGFydHggKyBpd2lkdGgKKyAgICAgICAgICAgICAgJiYgaSA8IHhpbWFnZXNyYy0+c3RhcnR4ICsgeGltYWdlc3JjLT53aWR0aDsgaSsrKSB7CisgICAgICAgICAgICBndWludDggKnNyYywgKmRlc3Q7CisKKyAgICAgICAgICAgIHNyYyA9CisgICAgICAgICAgICAgICAgKGd1aW50OCAqKSAmICh4aW1hZ2VzcmMtPmN1cnNvcl9pbWFnZS0+cGl4ZWxzWygoaiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3kpICogeGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UtPndpZHRoICsgKGkgLSBjeCkpXSk7CisgICAgICAgICAgICBkZXN0ID0KKyAgICAgICAgICAgICAgICAoZ3VpbnQ4ICopICYgKG1ldGEtPnhpbWFnZS0+ZGF0YVsoKGogLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhpbWFnZXNyYy0+c3RhcnR5KSAqIHhpbWFnZXNyYy0+d2lkdGggKyAoaSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGltYWdlc3JjLT5zdGFydHgpKSAqCisgICAgICAgICAgICAgICAgICAgICh4aW1hZ2VzcmMtPnhjb250ZXh0LT5icHAgLyA4KV0pOworCisgICAgICAgICAgICBjb21wb3NpdGVfcGl4ZWwgKHhpbWFnZXNyYy0+eGNvbnRleHQsIChndWludDggKikgZGVzdCwKKyAgICAgICAgICAgICAgICAoZ3VpbnQ4ICopIHNyYyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyNpZmRlZiBIQVZFX1hEQU1BR0UKKyAgaWYgKHhpbWFnZXNyYy0+aGF2ZV94ZGFtYWdlICYmIHhpbWFnZXNyYy0+dXNlX2RhbWFnZSkgeworICAgIC8qIG5lZWQgdG8gcmVmIHhpbWFnZSB0byBwdXQgaW4gbGFzdF94aW1hZ2UgKi8KKyAgICBnc3RfYnVmZmVyX3JlZiAoeGltYWdlKTsKKyAgICBpZiAoeGltYWdlc3JjLT5sYXN0X3hpbWFnZSkgeworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoeGltYWdlc3JjLT5sYXN0X3hpbWFnZSk7CisgICAgfQorICAgIHhpbWFnZXNyYy0+bGFzdF94aW1hZ2UgPSB4aW1hZ2U7CisgICAgR1NUX0xPR19PQkpFQ1QgKHhpbWFnZXNyYywgInJlZmZpbmcgY3VycmVudCBidWZmZXIgZm9yIGxhc3RfeGltYWdlIik7CisgIH0KKyNlbmRpZgorICByZXR1cm4geGltYWdlOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3hpbWFnZV9zcmNfY3JlYXRlIChHc3RQdXNoU3JjICogYnMsIEdzdEJ1ZmZlciAqKiBidWYpCit7CisgIEdzdFhJbWFnZVNyYyAqcyA9IEdTVF9YSU1BR0VfU1JDIChicyk7CisgIEdzdEJ1ZmZlciAqaW1hZ2U7CisgIEdzdENsb2NrVGltZSBiYXNlX3RpbWU7CisgIEdzdENsb2NrVGltZSBuZXh0X2NhcHR1cmVfdHM7CisgIEdzdENsb2NrVGltZSBkdXI7CisgIGdpbnQ2NCBuZXh0X2ZyYW1lX25vOworCisgIGlmICghZ3N0X3hpbWFnZV9zcmNfcmVjYWxjIChzKSkgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoXygiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIpKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KKworICBpZiAocy0+ZnBzX24gPD0gMCB8fCBzLT5mcHNfZCA8PSAwKQorICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsgICAgIC8qIEZQUyBtdXN0IGJlID4gMCAqLworCisgIC8qIE5vdywgd2UgbWlnaHQgbmVlZCB0byB3YWl0IGZvciB0aGUgbmV4dCBtdWx0aXBsZSBvZiB0aGUgZnBzCisgICAqIGJlZm9yZSBjYXB0dXJpbmcgKi8KKworICBHU1RfT0JKRUNUX0xPQ0sgKHMpOworICBpZiAoR1NUX0VMRU1FTlRfQ0xPQ0sgKHMpID09IE5VTEwpIHsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAocyk7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHMsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgIChfKCJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siKSksIChOVUxMKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgYmFzZV90aW1lID0gR1NUX0VMRU1FTlRfQ0FTVCAocyktPmJhc2VfdGltZTsKKyAgbmV4dF9jYXB0dXJlX3RzID0gZ3N0X2Nsb2NrX2dldF90aW1lIChHU1RfRUxFTUVOVF9DTE9DSyAocykpOworICBuZXh0X2NhcHR1cmVfdHMgLT0gYmFzZV90aW1lOworCisgIC8qIEZpZ3VyZSBvdXQgd2hpY2ggJ2ZyYW1lIG51bWJlcicgcG9zaXRpb24gd2UncmUgYXQsIGJhc2VkIG9uIHRoZSBjdXIgdGltZQorICAgKiBhbmQgZnJhbWUgcmF0ZSAqLworICBuZXh0X2ZyYW1lX25vID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChuZXh0X2NhcHR1cmVfdHMsCisgICAgICBzLT5mcHNfbiwgR1NUX1NFQ09ORCAqIHMtPmZwc19kKTsKKyAgaWYgKG5leHRfZnJhbWVfbm8gPT0gcy0+bGFzdF9mcmFtZV9ubykgeworICAgIEdzdENsb2NrSUQgaWQ7CisgICAgR3N0Q2xvY2tSZXR1cm4gcmV0OworCisgICAgLyogTmVlZCB0byB3YWl0IGZvciB0aGUgbmV4dCBmcmFtZSAqLworICAgIG5leHRfZnJhbWVfbm8gKz0gMTsKKworICAgIC8qIEZpZ3VyZSBvdXQgd2hhdCB0aGUgbmV4dCBmcmFtZSB0aW1lIGlzICovCisgICAgbmV4dF9jYXB0dXJlX3RzID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChuZXh0X2ZyYW1lX25vLAorICAgICAgICBzLT5mcHNfZCAqIEdTVF9TRUNPTkQsIHMtPmZwc19uKTsKKworICAgIGlkID0gZ3N0X2Nsb2NrX25ld19zaW5nbGVfc2hvdF9pZCAoR1NUX0VMRU1FTlRfQ0xPQ0sgKHMpLAorICAgICAgICBuZXh0X2NhcHR1cmVfdHMgKyBiYXNlX3RpbWUpOworICAgIHMtPmNsb2NrX2lkID0gaWQ7CisKKyAgICAvKiByZWxlYXNlIHRoZSBvYmplY3QgbG9jayB3aGlsZSB3YWl0aW5nICovCisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHMpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocywgIldhaXRpbmcgZm9yIG5leHQgZnJhbWUgdGltZSAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICBuZXh0X2NhcHR1cmVfdHMpOworICAgIHJldCA9IGdzdF9jbG9ja19pZF93YWl0IChpZCwgTlVMTCk7CisgICAgR1NUX09CSkVDVF9MT0NLIChzKTsKKworICAgIGdzdF9jbG9ja19pZF91bnJlZiAoaWQpOworICAgIHMtPmNsb2NrX2lkID0gTlVMTDsKKyAgICBpZiAocmV0ID09IEdTVF9DTE9DS19VTlNDSEVEVUxFRCkgeworICAgICAgLyogR290IHdva2VuIHVwIGJ5IHRoZSB1bmxvY2sgZnVuY3Rpb24gKi8KKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzKTsKKyAgICAgIHJldHVybiBHU1RfRkxPV19GTFVTSElORzsKKyAgICB9CisgICAgLyogRHVyYXRpb24gaXMgYSBjb21wbGV0ZSAxL2ZwcyBmcmFtZSBkdXJhdGlvbiAqLworICAgIGR1ciA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKEdTVF9TRUNPTkQsIHMtPmZwc19kLCBzLT5mcHNfbik7CisgIH0gZWxzZSB7CisgICAgR3N0Q2xvY2tUaW1lIG5leHRfZnJhbWVfdHM7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzLCAiTm8gbmVlZCB0byB3YWl0IGZvciBuZXh0IGZyYW1lIHRpbWUgJSIKKyAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCAiIG5leHQgZnJhbWUgPSAlIiBHX0dJTlQ2NF9GT1JNQVQgIiBwcmV2ID0gJSIKKyAgICAgICAgR19HSU5UNjRfRk9STUFULCBuZXh0X2NhcHR1cmVfdHMsIG5leHRfZnJhbWVfbm8sIHMtPmxhc3RfZnJhbWVfbm8pOworICAgIG5leHRfZnJhbWVfdHMgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKG5leHRfZnJhbWVfbm8gKyAxLAorICAgICAgICBzLT5mcHNfZCAqIEdTVF9TRUNPTkQsIHMtPmZwc19uKTsKKyAgICAvKiBGcmFtZSBkdXJhdGlvbiBpcyBmcm9tIG5vdyB1bnRpbCB0aGUgbmV4dCBleHBlY3RlZCBjYXB0dXJlIHRpbWUgKi8KKyAgICBkdXIgPSBuZXh0X2ZyYW1lX3RzIC0gbmV4dF9jYXB0dXJlX3RzOworICB9CisgIHMtPmxhc3RfZnJhbWVfbm8gPSBuZXh0X2ZyYW1lX25vOworICBHU1RfT0JKRUNUX1VOTE9DSyAocyk7CisKKyAgaW1hZ2UgPSBnc3RfeGltYWdlX3NyY194aW1hZ2VfZ2V0IChzKTsKKyAgaWYgKCFpbWFnZSkKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisKKyAgKmJ1ZiA9IGltYWdlOworICBHU1RfQlVGRkVSX0RUUyAoKmJ1ZikgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBHU1RfQlVGRkVSX1BUUyAoKmJ1ZikgPSBuZXh0X2NhcHR1cmVfdHM7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKCpidWYpID0gZHVyOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK2dzdF94aW1hZ2Vfc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RYSW1hZ2VTcmMgKnNyYyA9IEdTVF9YSU1BR0VfU1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9ESVNQTEFZX05BTUU6CisKKyAgICAgIGdfZnJlZSAoc3JjLT5kaXNwbGF5X25hbWUpOworICAgICAgc3JjLT5kaXNwbGF5X25hbWUgPSBnX3N0cmR1cCAoZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NIT1dfUE9JTlRFUjoKKyAgICAgIHNyYy0+c2hvd19wb2ludGVyID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VTRV9EQU1BR0U6CisgICAgICBzcmMtPnVzZV9kYW1hZ2UgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1RBUlRYOgorICAgICAgc3JjLT5zdGFydHggPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1RBUlRZOgorICAgICAgc3JjLT5zdGFydHkgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRU5EWDoKKyAgICAgIHNyYy0+ZW5keCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9FTkRZOgorICAgICAgc3JjLT5lbmR5ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JFTU9URToKKyAgICAgIHNyYy0+cmVtb3RlID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1hJRDoKKyAgICAgIGlmIChzcmMtPnhjb250ZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgZ193YXJuaW5nICgieGltYWdlc3JjIHdpbmRvdyBJRCBtdXN0IGJlIHNldCBiZWZvcmUgb3BlbmluZyBkaXNwbGF5Iik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgc3JjLT54aWQgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9YTkFNRToKKyAgICAgIGlmIChzcmMtPnhjb250ZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgZ193YXJuaW5nICgieGltYWdlc3JjIHdpbmRvdyBuYW1lIG11c3QgYmUgc2V0IGJlZm9yZSBvcGVuaW5nIGRpc3BsYXkiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBnX2ZyZWUgKHNyYy0+eG5hbWUpOworICAgICAgc3JjLT54bmFtZSA9IGdfc3RyZHVwIChnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF94aW1hZ2Vfc3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RYSW1hZ2VTcmMgKnNyYyA9IEdTVF9YSU1BR0VfU1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9ESVNQTEFZX05BTUU6CisgICAgICBpZiAoc3JjLT54Y29udGV4dCkKKyAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgRGlzcGxheVN0cmluZyAoc3JjLT54Y29udGV4dC0+ZGlzcCkpOworICAgICAgZWxzZQorICAgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzcmMtPmRpc3BsYXlfbmFtZSk7CisKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TSE9XX1BPSU5URVI6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgc3JjLT5zaG93X3BvaW50ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VTRV9EQU1BR0U6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgc3JjLT51c2VfZGFtYWdlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVEFSVFg6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc3JjLT5zdGFydHgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NUQVJUWToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzcmMtPnN0YXJ0eSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRU5EWDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzcmMtPmVuZHgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0VORFk6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc3JjLT5lbmR5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRU1PVEU6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgc3JjLT5yZW1vdGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1hJRDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHNyYy0+eGlkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9YTkFNRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNyYy0+eG5hbWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3hpbWFnZV9zcmNfY2xlYXJfYnVmcG9vbCAoR3N0WEltYWdlU3JjICogeGltYWdlc3JjKQoreworICBnX211dGV4X2xvY2sgKCZ4aW1hZ2VzcmMtPnBvb2xfbG9jayk7CisgIHdoaWxlICh4aW1hZ2VzcmMtPmJ1ZmZlcl9wb29sICE9IE5VTEwpIHsKKyAgICBHc3RCdWZmZXIgKnhpbWFnZSA9IHhpbWFnZXNyYy0+YnVmZmVyX3Bvb2wtPmRhdGE7CisKKyAgICBnc3RfeGltYWdlX2J1ZmZlcl9mcmVlICh4aW1hZ2UpOworCisgICAgeGltYWdlc3JjLT5idWZmZXJfcG9vbCA9IGdfc2xpc3RfZGVsZXRlX2xpbmsgKHhpbWFnZXNyYy0+YnVmZmVyX3Bvb2wsCisgICAgICAgIHhpbWFnZXNyYy0+YnVmZmVyX3Bvb2wpOworICB9CisgIGdfbXV0ZXhfdW5sb2NrICgmeGltYWdlc3JjLT5wb29sX2xvY2spOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3hpbWFnZV9zcmNfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgLyogRHJvcCByZWZlcmVuY2VzIGluIHRoZSBidWZmZXJfcG9vbCAqLworICBnc3RfeGltYWdlX3NyY19jbGVhcl9idWZwb29sIChHU1RfWElNQUdFX1NSQyAob2JqZWN0KSk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfeGltYWdlX3NyY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0WEltYWdlU3JjICpzcmMgPSBHU1RfWElNQUdFX1NSQyAob2JqZWN0KTsKKworICBpZiAoc3JjLT54Y29udGV4dCkKKyAgICB4aW1hZ2V1dGlsX3hjb250ZXh0X2NsZWFyIChzcmMtPnhjb250ZXh0KTsKKworICBnX2ZyZWUgKHNyYy0+eG5hbWUpOworICBnX211dGV4X2NsZWFyICgmc3JjLT5wb29sX2xvY2spOworICBnX211dGV4X2NsZWFyICgmc3JjLT54X2xvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3hpbWFnZV9zcmNfZ2V0X2NhcHMgKEdzdEJhc2VTcmMgKiBicywgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0WEltYWdlU3JjICpzID0gR1NUX1hJTUFHRV9TUkMgKGJzKTsKKyAgR3N0WENvbnRleHQgKnhjb250ZXh0OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIEdzdFZpZGVvRm9ybWF0IGZvcm1hdDsKKyAgZ3VpbnQzMiBhbHBoYV9tYXNrOworCisgIGlmICgoIXMtPnhjb250ZXh0KSAmJiAoIWdzdF94aW1hZ2Vfc3JjX29wZW5fZGlzcGxheSAocywgcy0+ZGlzcGxheV9uYW1lKSkpCisgICAgcmV0dXJuIGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChHU1RfQkFTRV9TUkMgKHMpLT5zcmNwYWQpOworCisgIGlmICghZ3N0X3hpbWFnZV9zcmNfcmVjYWxjIChzKSkKKyAgICByZXR1cm4gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9CQVNFX1NSQyAocyktPnNyY3BhZCk7CisKKyAgeGNvbnRleHQgPSBzLT54Y29udGV4dDsKKyAgd2lkdGggPSBzLT54Y29udGV4dC0+d2lkdGg7CisgIGhlaWdodCA9IHMtPnhjb250ZXh0LT5oZWlnaHQ7CisgIGlmIChzLT54d2luZG93ICE9IDApIHsKKyAgICBYV2luZG93QXR0cmlidXRlcyBhdHRyczsKKyAgICBpbnQgc3RhdHVzID0gWEdldFdpbmRvd0F0dHJpYnV0ZXMgKHMtPnhjb250ZXh0LT5kaXNwLCBzLT54d2luZG93LCAmYXR0cnMpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgIHdpZHRoID0gYXR0cnMud2lkdGg7CisgICAgICBoZWlnaHQgPSBhdHRycy5oZWlnaHQ7CisgICAgfQorICB9CisKKyAgLyogcHJvcGVydHkgY29tbWVudHMgc2F5IDAgbWVhbnMgcmlnaHQvYm90dG9tLCBtZWFucyB3ZSBjYW4ndCBjYXB0dXJlCisgICAgIHRoZSB0b3AgbGVmdCBwaXhlbCBhbG9uZSAqLworICBpZiAocy0+ZW5keCA9PSAwKQorICAgIHMtPmVuZHggPSB3aWR0aCAtIDE7CisgIGlmIChzLT5lbmR5ID09IDApCisgICAgcy0+ZW5keSA9IGhlaWdodCAtIDE7CisKKyAgaWYgKHMtPmVuZHggPj0gcy0+c3RhcnR4ICYmIHMtPmVuZHkgPj0gcy0+c3RhcnR5KSB7CisgICAgLyogdGhpcyBtZWFucyB1c2VyIGhhcyBwdXQgaW4gdmFsdWVzICovCisgICAgaWYgKHMtPnN0YXJ0eCA8IHhjb250ZXh0LT53aWR0aCAmJiBzLT5lbmR4IDwgeGNvbnRleHQtPndpZHRoICYmCisgICAgICAgIHMtPnN0YXJ0eSA8IHhjb250ZXh0LT5oZWlnaHQgJiYgcy0+ZW5keSA8IHhjb250ZXh0LT5oZWlnaHQpIHsKKyAgICAgIC8qIHZhbHVlcyBhcmUgZmluZSAqLworICAgICAgcy0+d2lkdGggPSB3aWR0aCA9IHMtPmVuZHggLSBzLT5zdGFydHggKyAxOworICAgICAgcy0+aGVpZ2h0ID0gaGVpZ2h0ID0gcy0+ZW5keSAtIHMtPnN0YXJ0eSArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9XQVJOSU5HCisgICAgICAgICAgKCJVc2VyIHB1dCBpbiBjby1vcmRpbmF0ZXMgb3ZlcnNob290aW5nIHRoZSBYIHJlc29sdXRpb24sIHNldHRpbmcgdG8gZnVsbCBzY3JlZW4iKTsKKyAgICAgIHMtPnN0YXJ0eCA9IDA7CisgICAgICBzLT5zdGFydHkgPSAwOworICAgICAgcy0+ZW5keCA9IHdpZHRoIC0gMTsKKyAgICAgIHMtPmVuZHkgPSBoZWlnaHQgLSAxOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklORyAoIlVzZXIgcHV0IGluIGJvZ3VzIGNvLW9yZGluYXRlcywgc2V0dGluZyB0byBmdWxsIHNjcmVlbiIpOworICAgIHMtPnN0YXJ0eCA9IDA7CisgICAgcy0+c3RhcnR5ID0gMDsKKyAgICBzLT5lbmR4ID0gd2lkdGggLSAxOworICAgIHMtPmVuZHkgPSBoZWlnaHQgLSAxOworICB9CisgIEdTVF9ERUJVRyAoIndpZHRoID0gJWQsIGhlaWdodD0lZCIsIHdpZHRoLCBoZWlnaHQpOworCisgIC8qIGV4dHJhcG9sYXRlIGFscGhhIG1hc2sgKi8KKyAgaWYgKHhjb250ZXh0LT5kZXB0aCA9PSAzMikgeworICAgIGFscGhhX21hc2sgPSB+KHhjb250ZXh0LT5yX21hc2tfb3V0cHV0CisgICAgICAgIHwgeGNvbnRleHQtPmdfbWFza19vdXRwdXQgfCB4Y29udGV4dC0+Yl9tYXNrX291dHB1dCk7CisgIH0gZWxzZSB7CisgICAgYWxwaGFfbWFzayA9IDA7CisgIH0KKworICBmb3JtYXQgPQorICAgICAgZ3N0X3ZpZGVvX2Zvcm1hdF9mcm9tX21hc2tzICh4Y29udGV4dC0+ZGVwdGgsIHhjb250ZXh0LT5icHAsCisgICAgICB4Y29udGV4dC0+ZW5kaWFubmVzcywgeGNvbnRleHQtPnJfbWFza19vdXRwdXQsCisgICAgICB4Y29udGV4dC0+Z19tYXNrX291dHB1dCwgeGNvbnRleHQtPmJfbWFza19vdXRwdXQsIGFscGhhX21hc2spOworCisgIHJldHVybiBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1yYXciLAorICAgICAgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsIGdzdF92aWRlb19mb3JtYXRfdG9fc3RyaW5nIChmb3JtYXQpLAorICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgd2lkdGgsCisgICAgICAiaGVpZ2h0IiwgR19UWVBFX0lOVCwgaGVpZ2h0LAorICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OX1JBTkdFLCAxLCBHX01BWElOVCwgR19NQVhJTlQsIDEsCisgICAgICAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgR1NUX1RZUEVfRlJBQ1RJT04sIHhjb250ZXh0LT5wYXJfbiwKKyAgICAgIHhjb250ZXh0LT5wYXJfZCwgTlVMTCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3hpbWFnZV9zcmNfc2V0X2NhcHMgKEdzdEJhc2VTcmMgKiBicywgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFhJbWFnZVNyYyAqcyA9IEdTVF9YSU1BR0VfU1JDIChicyk7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBjb25zdCBHVmFsdWUgKm5ld19mcHM7CisKKyAgLyogSWYgbm90IHlldCBvcGVuZWQsIGRpc2FsbG93IHNldGNhcHMgdW50aWwgbGF0ZXIgKi8KKyAgaWYgKCFzLT54Y29udGV4dCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogVGhlIG9ubHkgdGhpbmcgdGhhdCBjYW4gY2hhbmdlIGlzIHRoZSBmcmFtZXJhdGUgZG93bnN0cmVhbSB3YW50cyAqLworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgbmV3X2ZwcyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJmcmFtZXJhdGUiKTsKKyAgaWYgKCFuZXdfZnBzKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBTdG9yZSB0aGlzIEZQUyBmb3IgdXNlIHdoZW4gZ2VuZXJhdGluZyBidWZmZXJzICovCisgIHMtPmZwc19uID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9udW1lcmF0b3IgKG5ld19mcHMpOworICBzLT5mcHNfZCA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fZGVub21pbmF0b3IgKG5ld19mcHMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHMsICJwZWVyIHdhbnRzICVkLyVkIGZwcyIsIHMtPmZwc19uLCBzLT5mcHNfZCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF94aW1hZ2Vfc3JjX2ZpeGF0ZSAoR3N0QmFzZVNyYyAqIGJzcmMsIEdzdENhcHMgKiBjYXBzKQoreworICBnaW50IGk7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworCisgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChjYXBzKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpOyArK2kpIHsKKyAgICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCBpKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfZnJhY3Rpb24gKHN0cnVjdHVyZSwgImZyYW1lcmF0ZSIsIDI1LCAxKTsKKyAgfQorICBjYXBzID0gR1NUX0JBU0VfU1JDX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maXhhdGUgKGJzcmMsIGNhcHMpOworCisgIHJldHVybiBjYXBzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3hpbWFnZV9zcmNfY2xhc3NfaW5pdCAoR3N0WEltYWdlU3JjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnYyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWMgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBHc3RCYXNlU3JjQ2xhc3MgKmJjID0gR1NUX0JBU0VfU1JDX0NMQVNTIChrbGFzcyk7CisgIEdzdFB1c2hTcmNDbGFzcyAqcHVzaF9jbGFzcyA9IEdTVF9QVVNIX1NSQ19DTEFTUyAoa2xhc3MpOworCisgIGdjLT5zZXRfcHJvcGVydHkgPSBnc3RfeGltYWdlX3NyY19zZXRfcHJvcGVydHk7CisgIGdjLT5nZXRfcHJvcGVydHkgPSBnc3RfeGltYWdlX3NyY19nZXRfcHJvcGVydHk7CisgIGdjLT5kaXNwb3NlID0gZ3N0X3hpbWFnZV9zcmNfZGlzcG9zZTsKKyAgZ2MtPmZpbmFsaXplID0gZ3N0X3hpbWFnZV9zcmNfZmluYWxpemU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ2MsIFBST1BfRElTUExBWV9OQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImRpc3BsYXktbmFtZSIsICJEaXNwbGF5IiwgIlggRGlzcGxheSBOYW1lIiwKKyAgICAgICAgICBOVUxMLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ2MsIFBST1BfU0hPV19QT0lOVEVSLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJzaG93LXBvaW50ZXIiLCAiU2hvdyBNb3VzZSBQb2ludGVyIiwKKyAgICAgICAgICAiU2hvdyBtb3VzZSBwb2ludGVyIChpZiBYRml4ZXMgZXh0ZW5zaW9uIGVuYWJsZWQpIiwgVFJVRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgLyoqCisgICAqIEdzdFhJbWFnZVNyYzp1c2UtZGFtYWdlOgorICAgKgorICAgKiBVc2UgWERhbWFnZSAoaWYgdGhlIFhEYW1hZ2UgZXh0ZW5zaW9uIGlzIGVuYWJsZWQpCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnYywgUFJPUF9VU0VfREFNQUdFLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJ1c2UtZGFtYWdlIiwgIlVzZSBYRGFtYWdlIiwKKyAgICAgICAgICAiVXNlIFhEYW1hZ2UgKGlmIFhEYW1hZ2UgZXh0ZW5zaW9uIGVuYWJsZWQpIiwgVFJVRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgLyoqCisgICAqIEdzdFhJbWFnZVNyYzpzdGFydHg6CisgICAqCisgICAqIFggY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgYXJlYSB0byBiZSByZWNvcmRlZAorICAgKiAoMCBmb3IgdG9wIGxlZnQgb2Ygc2NyZWVuKQorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ2MsIFBST1BfU1RBUlRYLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJzdGFydHgiLCAiU3RhcnQgWCBjby1vcmRpbmF0ZSIsCisgICAgICAgICAgIlggY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgYXJlYSB0byBiZSByZWNvcmRlZCAoMCBmb3IgdG9wIGxlZnQgb2Ygc2NyZWVuKSIsCisgICAgICAgICAgMCwgR19NQVhJTlQsIDAsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0WEltYWdlU3JjOnN0YXJ0eToKKyAgICoKKyAgICogWSBjb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiBhcmVhIHRvIGJlIHJlY29yZGVkCisgICAqICgwIGZvciB0b3AgbGVmdCBvZiBzY3JlZW4pCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnYywgUFJPUF9TVEFSVFksCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInN0YXJ0eSIsICJTdGFydCBZIGNvLW9yZGluYXRlIiwKKyAgICAgICAgICAiWSBjb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiBhcmVhIHRvIGJlIHJlY29yZGVkICgwIGZvciB0b3AgbGVmdCBvZiBzY3JlZW4pIiwKKyAgICAgICAgICAwLCBHX01BWElOVCwgMCwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKyAgLyoqCisgICAqIEdzdFhJbWFnZVNyYzplbmR4OgorICAgKgorICAgKiBYIGNvb3JkaW5hdGUgb2YgYm90dG9tIHJpZ2h0IGNvcm5lciBvZiBhcmVhIHRvIGJlIHJlY29yZGVkCisgICAqICgwIGZvciBib3R0b20gcmlnaHQgb2Ygc2NyZWVuKQorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ2MsIFBST1BfRU5EWCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiZW5keCIsICJFbmQgWCIsCisgICAgICAgICAgIlggY29vcmRpbmF0ZSBvZiBib3R0b20gcmlnaHQgY29ybmVyIG9mIGFyZWEgdG8gYmUgcmVjb3JkZWQgKDAgZm9yIGJvdHRvbSByaWdodCBvZiBzY3JlZW4pIiwKKyAgICAgICAgICAwLCBHX01BWElOVCwgMCwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKyAgLyoqCisgICAqIEdzdFhJbWFnZVNyYzplbmR5OgorICAgKgorICAgKiBZIGNvb3JkaW5hdGUgb2YgYm90dG9tIHJpZ2h0IGNvcm5lciBvZiBhcmVhIHRvIGJlIHJlY29yZGVkCisgICAqICgwIGZvciBib3R0b20gcmlnaHQgb2Ygc2NyZWVuKQorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ2MsIFBST1BfRU5EWSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiZW5keSIsICJFbmQgWSIsCisgICAgICAgICAgIlkgY29vcmRpbmF0ZSBvZiBib3R0b20gcmlnaHQgY29ybmVyIG9mIGFyZWEgdG8gYmUgcmVjb3JkZWQgKDAgZm9yIGJvdHRvbSByaWdodCBvZiBzY3JlZW4pIiwKKyAgICAgICAgICAwLCBHX01BWElOVCwgMCwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICAvKioKKyAgICogR3N0WEltYWdlU3JjOnJlbW90ZToKKyAgICoKKyAgICogV2hldGhlciB0aGUgWCBkaXNwbGF5IGlzIHJlbW90ZS4gVGhlIGVsZW1lbnQgd2lsbCB0cnkgdG8gdXNlIGFsdGVybmF0ZSBjYWxscworICAgKiBrbm93biB0byB3b3JrIGJldHRlciB3aXRoIHJlbW90ZSBkaXNwbGF5cy4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdjLCBQUk9QX1JFTU9URSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgicmVtb3RlIiwgIlJlbW90ZSBkaXNwYXkiLAorICAgICAgICAgICJXaGV0aGVyIHRoZSBkaXNwbGF5IGlzIHJlbW90ZSIsIEZBTFNFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0WEltYWdlU3JjOnhpZDoKKyAgICoKKyAgICogVGhlIFhJRCBvZiB0aGUgd2luZG93IHRvIGNhcHR1cmUuIDAgZm9yIHRoZSByb290IHdpbmRvdyAoZGVmYXVsdCkuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnYywgUFJPUF9YSUQsCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgieGlkIiwgIldpbmRvdyBYSUQiLAorICAgICAgICAgICJXaW5kb3cgWElEIHRvIGNhcHR1cmUgZnJvbSIsIDAsIEdfTUFYVUlOVDY0LCAwLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0WEltYWdlU3JjOnhuYW1lOgorICAgKgorICAgKiBUaGUgbmFtZSBvZiB0aGUgd2luZG93IHRvIGNhcHR1cmUsIGlmIGFueS4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdjLCBQUk9QX1hOQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInhuYW1lIiwgIldpbmRvdyBuYW1lIiwKKyAgICAgICAgICAiV2luZG93IG5hbWUgdG8gY2FwdHVyZSBmcm9tIiwgTlVMTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlYywgIlhpbWFnZSB2aWRlbyBzb3VyY2UiLAorICAgICAgIlNvdXJjZS9WaWRlbyIsCisgICAgICAiQ3JlYXRlcyBhIHNjcmVlbnNob3QgdmlkZW8gc3RyZWFtIiwKKyAgICAgICJMdXR6IE11ZWxsZXIgPGx1dHpAdXNlcnMuc291cmNlZm9yZ2UubmV0PiwgIgorICAgICAgIkphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPiwgIgorICAgICAgIlphaGVlciBNZXJhbGkgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPiIpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWMsICZ0KTsKKworICBiYy0+Zml4YXRlID0gZ3N0X3hpbWFnZV9zcmNfZml4YXRlOworICBiYy0+Z2V0X2NhcHMgPSBnc3RfeGltYWdlX3NyY19nZXRfY2FwczsKKyAgYmMtPnNldF9jYXBzID0gZ3N0X3hpbWFnZV9zcmNfc2V0X2NhcHM7CisgIGJjLT5zdGFydCA9IGdzdF94aW1hZ2Vfc3JjX3N0YXJ0OworICBiYy0+c3RvcCA9IGdzdF94aW1hZ2Vfc3JjX3N0b3A7CisgIGJjLT51bmxvY2sgPSBnc3RfeGltYWdlX3NyY191bmxvY2s7CisgIHB1c2hfY2xhc3MtPmNyZWF0ZSA9IGdzdF94aW1hZ2Vfc3JjX2NyZWF0ZTsKK30KKworc3RhdGljIHZvaWQKK2dzdF94aW1hZ2Vfc3JjX2luaXQgKEdzdFhJbWFnZVNyYyAqIHhpbWFnZXNyYykKK3sKKyAgZ3N0X2Jhc2Vfc3JjX3NldF9mb3JtYXQgKEdTVF9CQVNFX1NSQyAoeGltYWdlc3JjKSwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2Jhc2Vfc3JjX3NldF9saXZlIChHU1RfQkFTRV9TUkMgKHhpbWFnZXNyYyksIFRSVUUpOworCisgIGdfbXV0ZXhfaW5pdCAoJnhpbWFnZXNyYy0+cG9vbF9sb2NrKTsKKyAgZ19tdXRleF9pbml0ICgmeGltYWdlc3JjLT54X2xvY2spOworICB4aW1hZ2VzcmMtPnNob3dfcG9pbnRlciA9IFRSVUU7CisgIHhpbWFnZXNyYy0+dXNlX2RhbWFnZSA9IFRSVUU7CisgIHhpbWFnZXNyYy0+c3RhcnR4ID0gMDsKKyAgeGltYWdlc3JjLT5zdGFydHkgPSAwOworICB4aW1hZ2VzcmMtPmVuZHggPSAwOworICB4aW1hZ2VzcmMtPmVuZHkgPSAwOworICB4aW1hZ2VzcmMtPnJlbW90ZSA9IEZBTFNFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIGdib29sZWFuIHJldDsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X2RlYnVnX3hpbWFnZV9zcmMsICJ4aW1hZ2VzcmMiLCAwLAorICAgICAgInhpbWFnZXNyYyBlbGVtZW50IGRlYnVnIik7CisKKyAgcmV0ID0gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInhpbWFnZXNyYyIsIEdTVF9SQU5LX05PTkUsCisgICAgICBHU1RfVFlQRV9YSU1BR0VfU1JDKTsKKworICByZXR1cm4gcmV0OworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgeGltYWdlc3JjLAorICAgICJYMTEgdmlkZW8gaW5wdXQgcGx1Z2luIHVzaW5nIHN0YW5kYXJkIFhsaWIgY2FsbHMiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKTsKZGlmZiAtLWdpdCBhL3N5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmggYi9zeXMveGltYWdlL2dzdHhpbWFnZXNyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MzQ0N2EKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMveGltYWdlL2dzdHhpbWFnZXNyYy5oCkBAIC0wLDAgKzEsMTE0IEBACisvKiBzY3JlZW5zaG90c3JjOiBTY3JlZW5zaG90IHBsdWdpbiBmb3IgR1N0cmVhbWVyCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfWElNQUdFX1NSQ19IX18KKyNkZWZpbmUgX19HU1RfWElNQUdFX1NSQ19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RwdXNoc3JjLmg+CisjaW5jbHVkZSAieGltYWdldXRpbC5oIgorCisjaWZkZWYgSEFWRV9YRklYRVMKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YZml4ZXMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfWERBTUFHRQorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hkYW1hZ2UuaD4KKyNlbmRpZgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfWElNQUdFX1NSQyAoZ3N0X3hpbWFnZV9zcmNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1hJTUFHRV9TUkMob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfWElNQUdFX1NSQyxHc3RYSW1hZ2VTcmMpKQorI2RlZmluZSBHU1RfWElNQUdFX1NSQ19DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfWElNQUdFX1NSQyxHc3RYSW1hZ2VTcmMpKQorI2RlZmluZSBHU1RfSVNfWElNQUdFX1NSQyhvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9YSU1BR0VfU1JDKSkKKyNkZWZpbmUgR1NUX0lTX1hJTUFHRV9TUkNfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1hJTUFHRV9TUkMpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0WEltYWdlU3JjIEdzdFhJbWFnZVNyYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RYSW1hZ2VTcmNDbGFzcyBHc3RYSW1hZ2VTcmNDbGFzczsKKworR1R5cGUgZ3N0X3hpbWFnZV9zcmNfZ2V0X3R5cGUgKHZvaWQpIEdfR05VQ19DT05TVDsKKworc3RydWN0IF9Hc3RYSW1hZ2VTcmMKK3sKKyAgR3N0UHVzaFNyYyBwYXJlbnQ7CisKKyAgLyogSW5mb3JtYXRpb24gb24gZGlzcGxheSAqLworICBHc3RYQ29udGV4dCAqeGNvbnRleHQ7CisgIGdpbnQgeDsKKyAgZ2ludCB5OworICBnaW50IHdpZHRoOworICBnaW50IGhlaWdodDsKKworICBXaW5kb3cgeHdpbmRvdzsKKyAgZ2NoYXIgKmRpc3BsYXlfbmFtZTsKKworICAvKiBXaW5kb3cgc2VsZWN0aW9uICovCisgIGd1aW50NjQgeGlkOworICBnY2hhciAqeG5hbWU7CisKKyAgLyogRGVzaXJlZCBvdXRwdXQgZnJhbWVyYXRlICovCisgIGdpbnQgZnBzX247CisgIGdpbnQgZnBzX2Q7CisKKyAgLyogZm9yIGZyYW1lcmF0ZSBzeW5jICovCisgIEdzdENsb2NrSUQgY2xvY2tfaWQ7CisgIGdpbnQ2NCBsYXN0X2ZyYW1lX25vOworCisgIC8qIFByb3RlY3QgWCBXaW5kb3dzIGNhbGxzICovCisgIEdNdXRleCAgeF9sb2NrOworCisgIC8qIEdhdGhlcmVkIHBvb2wgb2YgZW1pdHRlZCBidWZmZXJzICovCisgIEdNdXRleCAgcG9vbF9sb2NrOworICBHU0xpc3QgKmJ1ZmZlcl9wb29sOworCisgIC8qIFhGaXhlcyBhbmQgWERhbWFnZSBzdXBwb3J0ICovCisgIGdib29sZWFuIGhhdmVfeGZpeGVzOworICBnYm9vbGVhbiBoYXZlX3hkYW1hZ2U7CisgIGdib29sZWFuIHNob3dfcG9pbnRlcjsKKyAgZ2Jvb2xlYW4gdXNlX2RhbWFnZTsKKworICAvKiBjby1vcmRpbmF0ZXMgZm9yIHN0YXJ0IGFuZCBlbmQgKi8KKyAgZ3VpbnQgc3RhcnR4OworICBndWludCBzdGFydHk7CisgIGd1aW50IGVuZHg7CisgIGd1aW50IGVuZHk7CisKKyAgLyogd2hldGhlciB0byB1c2UgcmVtb3RlIGZyaWVuZGx5IGNhbGxzICovCisgIGdib29sZWFuIHJlbW90ZTsKKworI2lmZGVmIEhBVkVfWEZJWEVTCisgIGludCBmaXhlc19ldmVudF9iYXNlOworICBYRml4ZXNDdXJzb3JJbWFnZSAqY3Vyc29yX2ltYWdlOworI2VuZGlmCisjaWZkZWYgSEFWRV9YREFNQUdFCisgIERhbWFnZSBkYW1hZ2U7CisgIGludCBkYW1hZ2VfZXZlbnRfYmFzZTsKKyAgWHNlcnZlclJlZ2lvbiBkYW1hZ2VfcmVnaW9uOworICBHQyBkYW1hZ2VfY29weV9nYzsKKyAgR3N0QnVmZmVyICpsYXN0X3hpbWFnZTsKKyNlbmRpZgorfTsKKworc3RydWN0IF9Hc3RYSW1hZ2VTcmNDbGFzcworeworICBHc3RQdXNoU3JjQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1hJTUFHRV9TUkNfSF9fICovCmRpZmYgLS1naXQgYS9zeXMveGltYWdlL21lc29uLmJ1aWxkIGIvc3lzL3hpbWFnZS9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmVjMjFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3hpbWFnZS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDMwIEBACit4MTFfZGVwID0gZGVwZW5kZW5jeSgneDExJywgcmVxdWlyZWQgOiBmYWxzZSkKKworaWYgeDExX2RlcC5mb3VuZCgpCisgIHhfYXJncyA9IFtdCisgICMgRklYTUU6IE5lZWQgdG8gY2hlY2sgZm9yIFhTaG1BdHRhY2ggaW5zaWRlIGxpYlhleHQKKyAgeHNobV9kZXAgPSBkZXBlbmRlbmN5KCd4ZXh0JywgcmVxdWlyZWQgOiBmYWxzZSkKKyAgaWYgeHNobV9kZXAuZm91bmQoKQorICAgIHhfYXJncyArPSBbJy1ESEFWRV9YU0hNJ10KKyAgZW5kaWYKKworICB4Zml4ZXNfZGVwID0gZGVwZW5kZW5jeSgneGZpeGVzJywgcmVxdWlyZWQgOiBmYWxzZSkKKyAgaWYgeGZpeGVzX2RlcC5mb3VuZCgpCisgICAgeF9hcmdzICs9IFsnLURIQVZFX1hGSVhFUyddCisgIGVuZGlmCisKKyAgeGRhbWFnZV9kZXAgPSBkZXBlbmRlbmN5KCd4ZGFtYWdlJywgcmVxdWlyZWQgOiBmYWxzZSkKKyAgaWYgeGRhbWFnZV9kZXAuZm91bmQoKQorICAgIHhfYXJncyArPSBbJy1ESEFWRV9YREFNQUdFJ10KKyAgZW5kaWYKKworICBnc3R4aW1hZ2VzcmMgPSBsaWJyYXJ5KCdnc3R4aW1hZ2VzcmMnLAorICAgICdnc3R4aW1hZ2VzcmMuYycsICd4aW1hZ2V1dGlsLmMnLAorICAgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncyArIHhfYXJncywKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luYywgbGlic2luY10sCisgICAgZGVwZW5kZW5jaWVzIDogW2dzdGJhc2VfZGVwLCBnc3R2aWRlb19kZXAsIHgxMV9kZXAsCisgICAgICAgICAgICAgICAgICAgIHhzaG1fZGVwLCB4Zml4ZXNfZGVwLCB4ZGFtYWdlX2RlcF0sCisgICAgaW5zdGFsbCA6IHRydWUsCisgICAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorICApCitlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmMgYi9zeXMveGltYWdlL3hpbWFnZXV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2M5MzkyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmMKQEAgLTAsMCArMSw1MDAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gTHVjYSBPZ25pYmVuZSA8bHVvZ25pQHRpbi5pdD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJ4aW1hZ2V1dGlsLmgiCisKK0dUeXBlCitnc3RfbWV0YV94aW1hZ2VfYXBpX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgdm9sYXRpbGUgR1R5cGUgdHlwZTsKKyAgc3RhdGljIGNvbnN0IGdjaGFyICp0YWdzW10gPSB7ICJtZW1vcnkiLCBOVUxMIH07CisKKyAgaWYgKGdfb25jZV9pbml0X2VudGVyICgmdHlwZSkpIHsKKyAgICBHVHlwZSBfdHlwZSA9IGdzdF9tZXRhX2FwaV90eXBlX3JlZ2lzdGVyICgiR3N0TWV0YVhJbWFnZVNyY0FQSSIsIHRhZ3MpOworICAgIGdfb25jZV9pbml0X2xlYXZlICgmdHlwZSwgX3R5cGUpOworICB9CisgIHJldHVybiB0eXBlOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tZXRhX3hpbWFnZV9pbml0IChHc3RNZXRhICogbWV0YSwgZ3BvaW50ZXIgcGFyYW1zLCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdE1ldGFYSW1hZ2UgKmVtZXRhID0gKEdzdE1ldGFYSW1hZ2UgKikgbWV0YTsKKworICBlbWV0YS0+cGFyZW50ID0gTlVMTDsKKyAgZW1ldGEtPnhpbWFnZSA9IE5VTEw7CisjaWZkZWYgSEFWRV9YU0hNCisgIGVtZXRhLT5TSE1JbmZvLnNobWFkZHIgPSAoKHZvaWQgKikgLTEpOworICBlbWV0YS0+U0hNSW5mby5zaG1pZCA9IC0xOworICBlbWV0YS0+U0hNSW5mby5yZWFkT25seSA9IFRSVUU7CisjZW5kaWYKKyAgZW1ldGEtPndpZHRoID0gZW1ldGEtPmhlaWdodCA9IGVtZXRhLT5zaXplID0gMDsKKyAgZW1ldGEtPnJldHVybl9mdW5jID0gTlVMTDsKKworICByZXR1cm4gVFJVRTsKK30KKworY29uc3QgR3N0TWV0YUluZm8gKgorZ3N0X21ldGFfeGltYWdlX2dldF9pbmZvICh2b2lkKQoreworICBzdGF0aWMgY29uc3QgR3N0TWV0YUluZm8gKm1ldGFfeGltYWdlX2luZm8gPSBOVUxMOworCisgIGlmIChnX29uY2VfaW5pdF9lbnRlciAoJm1ldGFfeGltYWdlX2luZm8pKSB7CisgICAgY29uc3QgR3N0TWV0YUluZm8gKm1ldGEgPQorICAgICAgICBnc3RfbWV0YV9yZWdpc3RlciAoZ3N0X21ldGFfeGltYWdlX2FwaV9nZXRfdHlwZSAoKSwgIkdzdE1ldGFYSW1hZ2VTcmMiLAorICAgICAgICBzaXplb2YgKEdzdE1ldGFYSW1hZ2UpLCAoR3N0TWV0YUluaXRGdW5jdGlvbikgZ3N0X21ldGFfeGltYWdlX2luaXQsCisgICAgICAgIChHc3RNZXRhRnJlZUZ1bmN0aW9uKSBOVUxMLCAoR3N0TWV0YVRyYW5zZm9ybUZ1bmN0aW9uKSBOVUxMKTsKKyAgICBnX29uY2VfaW5pdF9sZWF2ZSAoJm1ldGFfeGltYWdlX2luZm8sIG1ldGEpOworICB9CisgIHJldHVybiBtZXRhX3hpbWFnZV9pbmZvOworfQorCisjaWZkZWYgSEFWRV9YU0hNCitzdGF0aWMgZ2Jvb2xlYW4gZXJyb3JfY2F1Z2h0ID0gRkFMU0U7CisKK3N0YXRpYyBpbnQKK3hpbWFnZXV0aWxfaGFuZGxlX3hlcnJvciAoRGlzcGxheSAqIGRpc3BsYXksIFhFcnJvckV2ZW50ICogeGV2ZW50KQoreworICBjaGFyIGVycm9yX21zZ1sxMDI0XTsKKworICBYR2V0RXJyb3JUZXh0IChkaXNwbGF5LCB4ZXZlbnQtPmVycm9yX2NvZGUsIGVycm9yX21zZywgMTAyNCk7CisgIEdTVF9ERUJVRyAoInhpbWFnZXV0aWwgZmFpbGVkIHRvIHVzZSBYU2htIGNhbGxzLiBlcnJvcjogJXMiLCBlcnJvcl9tc2cpOworICBlcnJvcl9jYXVnaHQgPSBUUlVFOworICByZXR1cm4gMDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBjaGVja3MgdGhhdCBpdCBpcyBhY3R1YWxseSByZWFsbHkgcG9zc2libGUgdG8gY3JlYXRlIGFuIGltYWdlCisgICB1c2luZyBYU2htICovCitnYm9vbGVhbgoreGltYWdldXRpbF9jaGVja194c2htX2NhbGxzIChHc3RYQ29udGV4dCAqIHhjb250ZXh0KQoreworICBYSW1hZ2UgKnhpbWFnZTsKKyAgWFNobVNlZ21lbnRJbmZvIFNITUluZm87CisgIHNpemVfdCBzaXplOworICBpbnQgKCpoYW5kbGVyKSAoRGlzcGxheSAqLCBYRXJyb3JFdmVudCAqKTsKKyAgZ2Jvb2xlYW4gcmVzdWx0ID0gRkFMU0U7CisgIGdib29sZWFuIGRpZF9hdHRhY2ggPSBGQUxTRTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoeGNvbnRleHQgIT0gTlVMTCwgRkFMU0UpOworCisgIC8qIFN5bmMgdG8gZW5zdXJlIGFueSBvbGRlciBlcnJvcnMgYXJlIGFscmVhZHkgcHJvY2Vzc2VkICovCisgIFhTeW5jICh4Y29udGV4dC0+ZGlzcCwgRkFMU0UpOworCisgIC8qIFNldCBkZWZhdWx0cyBzbyB3ZSBkb24ndCBmcmVlIHRoZXNlIGxhdGVyIHVubmVjZXNzYXJpbHkgKi8KKyAgU0hNSW5mby5zaG1hZGRyID0gKCh2b2lkICopIC0xKTsKKyAgU0hNSW5mby5zaG1pZCA9IC0xOworCisgIC8qIFNldHRpbmcgYW4gZXJyb3IgaGFuZGxlciB0byBjYXRjaCBmYWlsdXJlICovCisgIGVycm9yX2NhdWdodCA9IEZBTFNFOworICBoYW5kbGVyID0gWFNldEVycm9ySGFuZGxlciAoeGltYWdldXRpbF9oYW5kbGVfeGVycm9yKTsKKworICAvKiBUcnlpbmcgdG8gY3JlYXRlIGEgMXgxIHhpbWFnZSAqLworICBHU1RfREVCVUcgKCJYU2htQ3JlYXRlSW1hZ2Ugb2YgMXgxIik7CisKKyAgeGltYWdlID0gWFNobUNyZWF0ZUltYWdlICh4Y29udGV4dC0+ZGlzcCwgeGNvbnRleHQtPnZpc3VhbCwKKyAgICAgIHhjb250ZXh0LT5kZXB0aCwgWlBpeG1hcCwgTlVMTCwgJlNITUluZm8sIDEsIDEpOworCisgIC8qIE1pZ2h0IGNhdXNlIGFuIGVycm9yLCBzeW5jIHRvIGVuc3VyZSBpdCBpcyBub3RpY2VkICovCisgIFhTeW5jICh4Y29udGV4dC0+ZGlzcCwgRkFMU0UpOworICBpZiAoIXhpbWFnZSB8fCBlcnJvcl9jYXVnaHQpIHsKKyAgICBHU1RfV0FSTklORyAoImNvdWxkIG5vdCBYU2htQ3JlYXRlSW1hZ2UgYSAxeDEgaW1hZ2UiKTsKKyAgICBnb3RvIGJlYWNoOworICB9CisgIHNpemUgPSB4aW1hZ2UtPmhlaWdodCAqIHhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmU7CisKKyAgU0hNSW5mby5zaG1pZCA9IHNobWdldCAoSVBDX1BSSVZBVEUsIHNpemUsIElQQ19DUkVBVCB8IDA3NzcpOworICBpZiAoU0hNSW5mby5zaG1pZCA9PSAtMSkgeworICAgIEdTVF9XQVJOSU5HICgiY291bGQgbm90IGdldCBzaGFyZWQgbWVtb3J5IG9mICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMiLAorICAgICAgICBzaXplKTsKKyAgICBnb3RvIGJlYWNoOworICB9CisKKyAgU0hNSW5mby5zaG1hZGRyID0gc2htYXQgKFNITUluZm8uc2htaWQsIDAsIDApOworICBpZiAoU0hNSW5mby5zaG1hZGRyID09ICgodm9pZCAqKSAtMSkpIHsKKyAgICBHU1RfV0FSTklORyAoIkZhaWxlZCB0byBzaG1hdDogJXMiLCBnX3N0cmVycm9yIChlcnJubykpOworICAgIGdvdG8gYmVhY2g7CisgIH0KKworICAvKiBEZWxldGUgdGhlIFNITSBzZWdtZW50LiBJdCB3aWxsIGFjdHVhbGx5IGdvIGF3YXkgYXV0b21hdGljYWxseQorICAgKiB3aGVuIHdlIGRldGFjaCBub3cgKi8KKyAgc2htY3RsIChTSE1JbmZvLnNobWlkLCBJUENfUk1JRCwgMCk7CisKKyAgeGltYWdlLT5kYXRhID0gU0hNSW5mby5zaG1hZGRyOworICBTSE1JbmZvLnJlYWRPbmx5ID0gRkFMU0U7CisKKyAgaWYgKFhTaG1BdHRhY2ggKHhjb250ZXh0LT5kaXNwLCAmU0hNSW5mbykgPT0gMCkgeworICAgIEdTVF9XQVJOSU5HICgiRmFpbGVkIHRvIFhTaG1BdHRhY2giKTsKKyAgICBnb3RvIGJlYWNoOworICB9CisKKyAgLyogU3luYyB0byBlbnN1cmUgd2Ugc2VlIGFueSBlcnJvcnMgd2UgY2F1c2VkICovCisgIFhTeW5jICh4Y29udGV4dC0+ZGlzcCwgRkFMU0UpOworCisgIGlmICghZXJyb3JfY2F1Z2h0KSB7CisgICAgZGlkX2F0dGFjaCA9IFRSVUU7CisgICAgLyogc3RvcmUgd2hldGhlciB3ZSBzdWNjZWVkZWQgaW4gcmVzdWx0ICovCisgICAgcmVzdWx0ID0gVFJVRTsKKyAgfQorYmVhY2g6CisgIC8qIFN5bmMgdG8gZW5zdXJlIHdlIHN3YWxsb3cgYW55IGVycm9ycyB3ZSBjYXVzZWQgYW5kIHJlc2V0IGVycm9yX2NhdWdodCAqLworICBYU3luYyAoeGNvbnRleHQtPmRpc3AsIEZBTFNFKTsKKyAgZXJyb3JfY2F1Z2h0ID0gRkFMU0U7CisgIFhTZXRFcnJvckhhbmRsZXIgKGhhbmRsZXIpOworCisgIGlmIChkaWRfYXR0YWNoKSB7CisgICAgWFNobURldGFjaCAoeGNvbnRleHQtPmRpc3AsICZTSE1JbmZvKTsKKyAgICBYU3luYyAoeGNvbnRleHQtPmRpc3AsIEZBTFNFKTsKKyAgfQorICBpZiAoU0hNSW5mby5zaG1hZGRyICE9ICgodm9pZCAqKSAtMSkpCisgICAgc2htZHQgKFNITUluZm8uc2htYWRkcik7CisgIGlmICh4aW1hZ2UpCisgICAgWERlc3Ryb3lJbWFnZSAoeGltYWdlKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvKiBIQVZFX1hTSE0gKi8KKworLyogVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBYIERpc3BsYXkgYW5kIGdsb2JhbCBpbmZvIGFib3V0IGl0LiBFdmVyeXRoaW5nIGlzCisgICBzdG9yZWQgaW4gb3VyIG9iamVjdCBhbmQgd2lsbCBiZSBjbGVhbmVkIHdoZW4gdGhlIG9iamVjdCBpcyBkaXNwb3NlZC4gTm90ZQorICAgaGVyZSB0aGF0IGNhcHMgZm9yIHN1cHBvcnRlZCBmb3JtYXQgYXJlIGdlbmVyYXRlZCB3aXRob3V0IGFueSB3aW5kb3cgb3IKKyAgIGltYWdlIGNyZWF0aW9uICovCitHc3RYQ29udGV4dCAqCit4aW1hZ2V1dGlsX3hjb250ZXh0X2dldCAoR3N0RWxlbWVudCAqIHBhcmVudCwgY29uc3QgZ2NoYXIgKiBkaXNwbGF5X25hbWUpCit7CisgIEdzdFhDb250ZXh0ICp4Y29udGV4dCA9IE5VTEw7CisgIFhQaXhtYXBGb3JtYXRWYWx1ZXMgKnB4X2Zvcm1hdHMgPSBOVUxMOworICBnaW50IG5iX2Zvcm1hdHMgPSAwLCBpOworCisgIHhjb250ZXh0ID0gZ19uZXcwIChHc3RYQ29udGV4dCwgMSk7CisKKyAgeGNvbnRleHQtPmRpc3AgPSBYT3BlbkRpc3BsYXkgKGRpc3BsYXlfbmFtZSk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcmVudCwgIm9wZW5lZCBkaXNwbGF5ICVwIiwgeGNvbnRleHQtPmRpc3ApOworICBpZiAoIXhjb250ZXh0LT5kaXNwKSB7CisgICAgZ19mcmVlICh4Y29udGV4dCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgeGNvbnRleHQtPnNjcmVlbiA9IERlZmF1bHRTY3JlZW5PZkRpc3BsYXkgKHhjb250ZXh0LT5kaXNwKTsKKyAgeGNvbnRleHQtPnZpc3VhbCA9IERlZmF1bHRWaXN1YWxPZlNjcmVlbiAoeGNvbnRleHQtPnNjcmVlbik7CisgIHhjb250ZXh0LT5yb290ID0gUm9vdFdpbmRvd09mU2NyZWVuICh4Y29udGV4dC0+c2NyZWVuKTsKKyAgeGNvbnRleHQtPndoaXRlID0gV2hpdGVQaXhlbE9mU2NyZWVuICh4Y29udGV4dC0+c2NyZWVuKTsKKyAgeGNvbnRleHQtPmJsYWNrID0gQmxhY2tQaXhlbE9mU2NyZWVuICh4Y29udGV4dC0+c2NyZWVuKTsKKyAgeGNvbnRleHQtPmRlcHRoID0gRGVmYXVsdERlcHRoT2ZTY3JlZW4gKHhjb250ZXh0LT5zY3JlZW4pOworCisgIHhjb250ZXh0LT53aWR0aCA9IFdpZHRoT2ZTY3JlZW4gKHhjb250ZXh0LT5zY3JlZW4pOworICB4Y29udGV4dC0+aGVpZ2h0ID0gSGVpZ2h0T2ZTY3JlZW4gKHhjb250ZXh0LT5zY3JlZW4pOworCisgIHhjb250ZXh0LT53aWR0aG1tID0gV2lkdGhNTU9mU2NyZWVuICh4Y29udGV4dC0+c2NyZWVuKTsKKyAgeGNvbnRleHQtPmhlaWdodG1tID0gSGVpZ2h0TU1PZlNjcmVlbiAoeGNvbnRleHQtPnNjcmVlbik7CisKKyAgeGNvbnRleHQtPmNhcHMgPSBOVUxMOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcmVudCwgIlggcmVwb3J0cyAlZHglZCBwaXhlbHMgYW5kICVkIG1tIHggJWQgbW0iLAorICAgICAgeGNvbnRleHQtPndpZHRoLCB4Y29udGV4dC0+aGVpZ2h0LCB4Y29udGV4dC0+d2lkdGhtbSwgeGNvbnRleHQtPmhlaWdodG1tKTsKKyAgeGltYWdldXRpbF9jYWxjdWxhdGVfcGl4ZWxfYXNwZWN0X3JhdGlvICh4Y29udGV4dCk7CisKKyAgLyogV2UgZ2V0IHN1cHBvcnRlZCBwaXhtYXAgZm9ybWF0cyBhdCBzdXBwb3J0ZWQgZGVwdGggKi8KKyAgcHhfZm9ybWF0cyA9IFhMaXN0UGl4bWFwRm9ybWF0cyAoeGNvbnRleHQtPmRpc3AsICZuYl9mb3JtYXRzKTsKKworICBpZiAoIXB4X2Zvcm1hdHMpIHsKKyAgICBYQ2xvc2VEaXNwbGF5ICh4Y29udGV4dC0+ZGlzcCk7CisgICAgZ19mcmVlICh4Y29udGV4dCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvKiBXZSBnZXQgYnBwIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gb3VyIHJ1bm5pbmcgZGVwdGggKi8KKyAgZm9yIChpID0gMDsgaSA8IG5iX2Zvcm1hdHM7IGkrKykgeworICAgIGlmIChweF9mb3JtYXRzW2ldLmRlcHRoID09IHhjb250ZXh0LT5kZXB0aCkKKyAgICAgIHhjb250ZXh0LT5icHAgPSBweF9mb3JtYXRzW2ldLmJpdHNfcGVyX3BpeGVsOworICB9CisKKyAgWEZyZWUgKHB4X2Zvcm1hdHMpOworCisgIHhjb250ZXh0LT5lbmRpYW5uZXNzID0KKyAgICAgIChJbWFnZUJ5dGVPcmRlciAoeGNvbnRleHQtPmRpc3ApID09CisgICAgICBMU0JGaXJzdCkgPyBHX0xJVFRMRV9FTkRJQU4gOiBHX0JJR19FTkRJQU47CisKKyNpZmRlZiBIQVZFX1hTSE0KKyAgLyogU2VhcmNoIGZvciBYU2htIGV4dGVuc2lvbiBzdXBwb3J0ICovCisgIGlmIChYU2htUXVlcnlFeHRlbnNpb24gKHhjb250ZXh0LT5kaXNwKSAmJgorICAgICAgeGltYWdldXRpbF9jaGVja194c2htX2NhbGxzICh4Y29udGV4dCkpIHsKKyAgICB4Y29udGV4dC0+dXNlX3hzaG0gPSBUUlVFOworICAgIEdTVF9ERUJVRyAoInhpbWFnZXV0aWwgaXMgdXNpbmcgWFNobSBleHRlbnNpb24iKTsKKyAgfSBlbHNlIHsKKyAgICB4Y29udGV4dC0+dXNlX3hzaG0gPSBGQUxTRTsKKyAgICBHU1RfREVCVUcgKCJ4aW1hZ2V1dGlsIGlzIG5vdCB1c2luZyBYU2htIGV4dGVuc2lvbiIpOworICB9CisjZW5kaWYgLyogSEFWRV9YU0hNICovCisKKyAgLyogb3VyIGNhcHMgc3lzdGVtIGhhbmRsZXMgMjQvMzJicHAgUkdCIGFzIGJpZy1lbmRpYW4uICovCisgIGlmICgoeGNvbnRleHQtPmJwcCA9PSAyNCB8fCB4Y29udGV4dC0+YnBwID09IDMyKSAmJgorICAgICAgeGNvbnRleHQtPmVuZGlhbm5lc3MgPT0gR19MSVRUTEVfRU5ESUFOKSB7CisgICAgeGNvbnRleHQtPmVuZGlhbm5lc3MgPSBHX0JJR19FTkRJQU47CisgICAgeGNvbnRleHQtPnJfbWFza19vdXRwdXQgPSBHVUlOVDMyX1RPX0JFICh4Y29udGV4dC0+dmlzdWFsLT5yZWRfbWFzayk7CisgICAgeGNvbnRleHQtPmdfbWFza19vdXRwdXQgPSBHVUlOVDMyX1RPX0JFICh4Y29udGV4dC0+dmlzdWFsLT5ncmVlbl9tYXNrKTsKKyAgICB4Y29udGV4dC0+Yl9tYXNrX291dHB1dCA9IEdVSU5UMzJfVE9fQkUgKHhjb250ZXh0LT52aXN1YWwtPmJsdWVfbWFzayk7CisgICAgaWYgKHhjb250ZXh0LT5icHAgPT0gMjQpIHsKKyAgICAgIHhjb250ZXh0LT5yX21hc2tfb3V0cHV0ID4+PSA4OworICAgICAgeGNvbnRleHQtPmdfbWFza19vdXRwdXQgPj49IDg7CisgICAgICB4Y29udGV4dC0+Yl9tYXNrX291dHB1dCA+Pj0gODsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgeGNvbnRleHQtPnJfbWFza19vdXRwdXQgPSB4Y29udGV4dC0+dmlzdWFsLT5yZWRfbWFzazsKKyAgICB4Y29udGV4dC0+Z19tYXNrX291dHB1dCA9IHhjb250ZXh0LT52aXN1YWwtPmdyZWVuX21hc2s7CisgICAgeGNvbnRleHQtPmJfbWFza19vdXRwdXQgPSB4Y29udGV4dC0+dmlzdWFsLT5ibHVlX21hc2s7CisgIH0KKworICByZXR1cm4geGNvbnRleHQ7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gY2xlYW5zIHRoZSBYIGNvbnRleHQuIENsb3NpbmcgdGhlIERpc3BsYXkgYW5kIHVucmVmaW5nIHRoZQorICAgY2FwcyBmb3Igc3VwcG9ydGVkIGZvcm1hdHMuICovCit2b2lkCit4aW1hZ2V1dGlsX3hjb250ZXh0X2NsZWFyIChHc3RYQ29udGV4dCAqIHhjb250ZXh0KQoreworICBnX3JldHVybl9pZl9mYWlsICh4Y29udGV4dCAhPSBOVUxMKTsKKworICBpZiAoeGNvbnRleHQtPmNhcHMgIT0gTlVMTCkKKyAgICBnc3RfY2Fwc191bnJlZiAoeGNvbnRleHQtPmNhcHMpOworCisgIFhDbG9zZURpc3BsYXkgKHhjb250ZXh0LT5kaXNwKTsKKworICBnX2ZyZWUgKHhjb250ZXh0KTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBwaXhlbCBhc3BlY3QgcmF0aW8gYmFzZWQgb24gdGhlIHByb3BlcnRpZXMKKyAqIGluIHRoZSB4Y29udGV4dCBzdHJ1Y3R1cmUgYW5kIHN0b3JlcyBpdCB0aGVyZS4gKi8KK3ZvaWQKK3hpbWFnZXV0aWxfY2FsY3VsYXRlX3BpeGVsX2FzcGVjdF9yYXRpbyAoR3N0WENvbnRleHQgKiB4Y29udGV4dCkKK3sKKyAgZ2ludCBwYXJbXVsyXSA9IHsKKyAgICB7MSwgMX0sICAgICAgICAgICAgICAgICAgICAgLyogcmVndWxhciBzY3JlZW4gKi8KKyAgICB7MTYsIDE1fSwgICAgICAgICAgICAgICAgICAgLyogUEFMIFRWICovCisgICAgezExLCAxMH0sICAgICAgICAgICAgICAgICAgIC8qIDUyNSBsaW5lIFJlYy42MDEgdmlkZW8gKi8KKyAgICB7NTQsIDU5fSAgICAgICAgICAgICAgICAgICAgLyogNjI1IGxpbmUgUmVjLjYwMSB2aWRlbyAqLworICB9OworICBnaW50IGk7CisgIGdpbnQgaW5kZXg7CisgIGdkb3VibGUgcmF0aW87CisgIGdkb3VibGUgZGVsdGE7CisKKyNkZWZpbmUgREVMVEEoaWR4KSAoQUJTIChyYXRpbyAtICgoZ2RvdWJsZSkgcGFyW2lkeF1bMF0gLyBwYXJbaWR4XVsxXSkpKQorCisgIC8qIGZpcnN0IGNhbGN1bGF0ZSB0aGUgInJlYWwiIHJhdGlvIGJhc2VkIG9uIHRoZSBYIHZhbHVlczsKKyAgICogd2hpY2ggaXMgdGhlICJwaHlzaWNhbCIgdy9oIGRpdmlkZWQgYnkgdGhlIHcvaCBpbiBwaXhlbHMgb2YgdGhlIGRpc3BsYXkgKi8KKyAgcmF0aW8gPSAoZ2RvdWJsZSkgKHhjb250ZXh0LT53aWR0aG1tICogeGNvbnRleHQtPmhlaWdodCkKKyAgICAgIC8gKHhjb250ZXh0LT5oZWlnaHRtbSAqIHhjb250ZXh0LT53aWR0aCk7CisKKyAgLyogRGlyZWN0RkIncyBYIGluIDcyMHg1NzYgcmVwb3J0cyB0aGUgcGh5c2ljYWwgZGltZW5zaW9ucyB3cm9uZywgc28KKyAgICogb3ZlcnJpZGUgaGVyZSAqLworICBpZiAoeGNvbnRleHQtPndpZHRoID09IDcyMCAmJiB4Y29udGV4dC0+aGVpZ2h0ID09IDU3NikgeworICAgIHJhdGlvID0gNC4wICogNTc2IC8gKDMuMCAqIDcyMCk7CisgIH0KKyAgR1NUX0RFQlVHICgiY2FsY3VsYXRlZCBwaXhlbCBhc3BlY3QgcmF0aW86ICVmIiwgcmF0aW8pOworCisgIC8qIG5vdyBmaW5kIHRoZSBvbmUgZnJvbSBwYXJbXVsyXSB3aXRoIHRoZSBsb3dlc3QgZGVsdGEgdG8gdGhlIHJlYWwgb25lICovCisgIGRlbHRhID0gREVMVEEgKDApOworICBpbmRleCA9IDA7CisKKyAgZm9yIChpID0gMTsgaSA8IHNpemVvZiAocGFyKSAvIChzaXplb2YgKGdpbnQpICogMik7ICsraSkgeworICAgIGdkb3VibGUgdGhpc19kZWx0YSA9IERFTFRBIChpKTsKKworICAgIGlmICh0aGlzX2RlbHRhIDwgZGVsdGEpIHsKKyAgICAgIGluZGV4ID0gaTsKKyAgICAgIGRlbHRhID0gdGhpc19kZWx0YTsKKyAgICB9CisgIH0KKworICBHU1RfREVCVUcgKCJEZWNpZGVkIG9uIGluZGV4ICVkICglZC8lZCkiLCBpbmRleCwKKyAgICAgIHBhcltpbmRleF1bMF0sIHBhcltpbmRleF1bMV0pOworCisgIHhjb250ZXh0LT5wYXJfbiA9IHBhcltpbmRleF1bMF07CisgIHhjb250ZXh0LT5wYXJfZCA9IHBhcltpbmRleF1bMV07CisgIEdTVF9ERUJVRyAoInNldCB4Y29udGV4dCBQQVIgdG8gJWQvJWRcbiIsIHhjb250ZXh0LT5wYXJfbiwgeGNvbnRleHQtPnBhcl9kKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfeGltYWdlc3JjX2J1ZmZlcl9kaXNwb3NlIChHc3RCdWZmZXIgKiB4aW1hZ2UpCit7CisgIEdzdEVsZW1lbnQgKnBhcmVudDsKKyAgR3N0TWV0YVhJbWFnZSAqbWV0YTsKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKworICBtZXRhID0gR1NUX01FVEFfWElNQUdFX0dFVCAoeGltYWdlKTsKKworICBwYXJlbnQgPSBtZXRhLT5wYXJlbnQ7CisgIGlmIChwYXJlbnQgPT0gTlVMTCkgeworICAgIGdfd2FybmluZyAoIlhJbWFnZVNyY0J1ZmZlci0+eGltYWdlc3JjID09IE5VTEwiKTsKKyAgICBnb3RvIGJlYWNoOworICB9CisKKyAgaWYgKG1ldGEtPnJldHVybl9mdW5jKQorICAgIHJldCA9IG1ldGEtPnJldHVybl9mdW5jIChwYXJlbnQsIHhpbWFnZSk7CisKK2JlYWNoOgorICByZXR1cm4gcmV0OworfQorCit2b2lkCitnc3RfeGltYWdlX2J1ZmZlcl9mcmVlIChHc3RCdWZmZXIgKiB4aW1hZ2UpCit7CisgIEdzdE1ldGFYSW1hZ2UgKm1ldGE7CisKKyAgbWV0YSA9IEdTVF9NRVRBX1hJTUFHRV9HRVQgKHhpbWFnZSk7CisKKyAgLyogbWFrZSBzdXJlIGl0IGlzIG5vdCByZWN5Y2xlZCAqLworICBtZXRhLT53aWR0aCA9IC0xOworICBtZXRhLT5oZWlnaHQgPSAtMTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoeGltYWdlKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIEdzdFhJbWFnZVNyY0J1ZmZlciBjcmVhdGlvbiBkZXBlbmRpbmcgb24gWFNobSBhdmFpbGFiaWxpdHkgKi8KK0dzdEJ1ZmZlciAqCitnc3RfeGltYWdldXRpbF94aW1hZ2VfbmV3IChHc3RYQ29udGV4dCAqIHhjb250ZXh0LAorICAgIEdzdEVsZW1lbnQgKiBwYXJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgQnVmZmVyUmV0dXJuRnVuYyByZXR1cm5fZnVuYykKK3sKKyAgR3N0QnVmZmVyICp4aW1hZ2UgPSBOVUxMOworICBHc3RNZXRhWEltYWdlICptZXRhOworICBnYm9vbGVhbiBzdWNjZWVkZWQgPSBGQUxTRTsKKworICB4aW1hZ2UgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgR1NUX01JTklfT0JKRUNUX0NBU1QgKHhpbWFnZSktPmRpc3Bvc2UgPQorICAgICAgKEdzdE1pbmlPYmplY3REaXNwb3NlRnVuY3Rpb24pIGdzdF94aW1hZ2VzcmNfYnVmZmVyX2Rpc3Bvc2U7CisKKyAgbWV0YSA9IEdTVF9NRVRBX1hJTUFHRV9BREQgKHhpbWFnZSk7CisgIG1ldGEtPndpZHRoID0gd2lkdGg7CisgIG1ldGEtPmhlaWdodCA9IGhlaWdodDsKKworI2lmZGVmIEhBVkVfWFNITQorICBtZXRhLT5TSE1JbmZvLnNobWFkZHIgPSAoKHZvaWQgKikgLTEpOworICBtZXRhLT5TSE1JbmZvLnNobWlkID0gLTE7CisKKyAgaWYgKHhjb250ZXh0LT51c2VfeHNobSkgeworICAgIG1ldGEtPnhpbWFnZSA9IFhTaG1DcmVhdGVJbWFnZSAoeGNvbnRleHQtPmRpc3AsCisgICAgICAgIHhjb250ZXh0LT52aXN1YWwsIHhjb250ZXh0LT5kZXB0aCwKKyAgICAgICAgWlBpeG1hcCwgTlVMTCwgJm1ldGEtPlNITUluZm8sIG1ldGEtPndpZHRoLCBtZXRhLT5oZWlnaHQpOworICAgIGlmICghbWV0YS0+eGltYWdlKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcmVudCwKKyAgICAgICAgICAiY291bGQgbm90IFhTaG1DcmVhdGVJbWFnZSBhICVkeCVkIGltYWdlIiwgbWV0YS0+d2lkdGgsIG1ldGEtPmhlaWdodCk7CisKKyAgICAgIC8qIFJldHJ5IHdpdGhvdXQgWFNobSAqLworICAgICAgeGNvbnRleHQtPnVzZV94c2htID0gRkFMU0U7CisgICAgICBnb3RvIG5vX3hzaG07CisgICAgfQorCisgICAgLyogd2UgaGF2ZSB0byB1c2UgdGhlIHJldHVybmVkIGJ5dGVzX3Blcl9saW5lIGZvciBvdXIgc2htIHNpemUgKi8KKyAgICBtZXRhLT5zaXplID0gbWV0YS0+eGltYWdlLT5ieXRlc19wZXJfbGluZSAqIG1ldGEtPnhpbWFnZS0+aGVpZ2h0OworICAgIG1ldGEtPlNITUluZm8uc2htaWQgPSBzaG1nZXQgKElQQ19QUklWQVRFLCBtZXRhLT5zaXplLCBJUENfQ1JFQVQgfCAwNzc3KTsKKyAgICBpZiAobWV0YS0+U0hNSW5mby5zaG1pZCA9PSAtMSkKKyAgICAgIGdvdG8gYmVhY2g7CisKKyAgICBtZXRhLT5TSE1JbmZvLnNobWFkZHIgPSBzaG1hdCAobWV0YS0+U0hNSW5mby5zaG1pZCwgMCwgMCk7CisgICAgaWYgKG1ldGEtPlNITUluZm8uc2htYWRkciA9PSAoKHZvaWQgKikgLTEpKQorICAgICAgZ290byBiZWFjaDsKKworICAgIC8qIERlbGV0ZSB0aGUgU0hNIHNlZ21lbnQuIEl0IHdpbGwgYWN0dWFsbHkgZ28gYXdheSBhdXRvbWF0aWNhbGx5CisgICAgICogd2hlbiB3ZSBkZXRhY2ggbm93ICovCisgICAgc2htY3RsIChtZXRhLT5TSE1JbmZvLnNobWlkLCBJUENfUk1JRCwgMCk7CisKKyAgICBtZXRhLT54aW1hZ2UtPmRhdGEgPSBtZXRhLT5TSE1JbmZvLnNobWFkZHI7CisgICAgbWV0YS0+U0hNSW5mby5yZWFkT25seSA9IEZBTFNFOworCisgICAgaWYgKFhTaG1BdHRhY2ggKHhjb250ZXh0LT5kaXNwLCAmbWV0YS0+U0hNSW5mbykgPT0gMCkKKyAgICAgIGdvdG8gYmVhY2g7CisKKyAgICBYU3luYyAoeGNvbnRleHQtPmRpc3AsIEZBTFNFKTsKKyAgfSBlbHNlCisgIG5vX3hzaG06CisjZW5kaWYgLyogSEFWRV9YU0hNICovCisgIHsKKyAgICBtZXRhLT54aW1hZ2UgPSBYQ3JlYXRlSW1hZ2UgKHhjb250ZXh0LT5kaXNwLAorICAgICAgICB4Y29udGV4dC0+dmlzdWFsLAorICAgICAgICB4Y29udGV4dC0+ZGVwdGgsCisgICAgICAgIFpQaXhtYXAsIDAsIE5VTEwsIG1ldGEtPndpZHRoLCBtZXRhLT5oZWlnaHQsIHhjb250ZXh0LT5icHAsIDApOworICAgIGlmICghbWV0YS0+eGltYWdlKQorICAgICAgZ290byBiZWFjaDsKKworICAgIC8qIHdlIGhhdmUgdG8gdXNlIHRoZSByZXR1cm5lZCBieXRlc19wZXJfbGluZSBmb3Igb3VyIGltYWdlIHNpemUgKi8KKyAgICBtZXRhLT5zaXplID0gbWV0YS0+eGltYWdlLT5ieXRlc19wZXJfbGluZSAqIG1ldGEtPnhpbWFnZS0+aGVpZ2h0OworICAgIG1ldGEtPnhpbWFnZS0+ZGF0YSA9IGdfbWFsbG9jIChtZXRhLT5zaXplKTsKKworICAgIFhTeW5jICh4Y29udGV4dC0+ZGlzcCwgRkFMU0UpOworICB9CisgIHN1Y2NlZWRlZCA9IFRSVUU7CisKKyAgZ3N0X2J1ZmZlcl9hcHBlbmRfbWVtb3J5ICh4aW1hZ2UsCisgICAgICBnc3RfbWVtb3J5X25ld193cmFwcGVkIChHU1RfTUVNT1JZX0ZMQUdfTk9fU0hBUkUsIG1ldGEtPnhpbWFnZS0+ZGF0YSwKKyAgICAgICAgICBtZXRhLT5zaXplLCAwLCBtZXRhLT5zaXplLCBOVUxMLCBOVUxMKSk7CisKKyAgLyogS2VlcCBhIHJlZiB0byBvdXIgc3JjICovCisgIG1ldGEtPnBhcmVudCA9IGdzdF9vYmplY3RfcmVmIChwYXJlbnQpOworICBtZXRhLT5yZXR1cm5fZnVuYyA9IHJldHVybl9mdW5jOworYmVhY2g6CisgIGlmICghc3VjY2VlZGVkKSB7CisgICAgZ3N0X3hpbWFnZV9idWZmZXJfZnJlZSAoeGltYWdlKTsKKyAgICB4aW1hZ2UgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIHhpbWFnZTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBkZXN0cm95cyBhIEdzdFhJbWFnZUJ1ZmZlciBoYW5kbGluZyBYU2htIGF2YWlsYWJpbGl0eSAqLwordm9pZAorZ3N0X3hpbWFnZXV0aWxfeGltYWdlX2Rlc3Ryb3kgKEdzdFhDb250ZXh0ICogeGNvbnRleHQsIEdzdEJ1ZmZlciAqIHhpbWFnZSkKK3sKKyAgR3N0TWV0YVhJbWFnZSAqbWV0YTsKKworICBtZXRhID0gR1NUX01FVEFfWElNQUdFX0dFVCAoeGltYWdlKTsKKworICAvKiBXZSBtaWdodCBoYXZlIHNvbWUgYnVmZmVycyBkZXN0cm95ZWQgYWZ0ZXIgY2hhbmdpbmcgc3RhdGUgdG8gTlVMTCAqLworICBpZiAoIXhjb250ZXh0KQorICAgIGdvdG8gYmVhY2g7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoeGltYWdlICE9IE5VTEwpOworCisjaWZkZWYgSEFWRV9YU0hNCisgIGlmICh4Y29udGV4dC0+dXNlX3hzaG0pIHsKKyAgICBpZiAobWV0YS0+U0hNSW5mby5zaG1hZGRyICE9ICgodm9pZCAqKSAtMSkpIHsKKyAgICAgIFhTaG1EZXRhY2ggKHhjb250ZXh0LT5kaXNwLCAmbWV0YS0+U0hNSW5mbyk7CisgICAgICBYU3luYyAoeGNvbnRleHQtPmRpc3AsIDApOworICAgICAgc2htZHQgKG1ldGEtPlNITUluZm8uc2htYWRkcik7CisgICAgfQorICAgIGlmIChtZXRhLT54aW1hZ2UpCisgICAgICBYRGVzdHJveUltYWdlIChtZXRhLT54aW1hZ2UpOworCisgIH0gZWxzZQorI2VuZGlmIC8qIEhBVkVfWFNITSAqLworICB7CisgICAgaWYgKG1ldGEtPnhpbWFnZSkgeworICAgICAgWERlc3Ryb3lJbWFnZSAobWV0YS0+eGltYWdlKTsKKyAgICB9CisgIH0KKworICBYU3luYyAoeGNvbnRleHQtPmRpc3AsIEZBTFNFKTsKK2JlYWNoOgorICBpZiAobWV0YS0+cGFyZW50KSB7CisgICAgLyogUmVsZWFzZSB0aGUgcmVmIHRvIG91ciBwYXJlbnQgKi8KKyAgICBnc3Rfb2JqZWN0X3VucmVmIChtZXRhLT5wYXJlbnQpOworICAgIG1ldGEtPnBhcmVudCA9IE5VTEw7CisgIH0KKworICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9zeXMveGltYWdlL3hpbWFnZXV0aWwuaCBiL3N5cy94aW1hZ2UveGltYWdldXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NzY4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMveGltYWdlL3hpbWFnZXV0aWwuaApAQCAtMCwwICsxLDE4MSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBMdWNhIE9nbmliZW5lIDxsdW9nbmlAdGluLml0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfWElNQUdFVVRJTF9IX18KKyNkZWZpbmUgX19HU1RfWElNQUdFVVRJTF9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2lmZGVmIEhBVkVfWFNITQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pcGMuaD4KKyNpbmNsdWRlIDxzeXMvc2htLmg+CisjZW5kaWYgLyogSEFWRV9YU0hNICovCisKKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorCisjaWZkZWYgSEFWRV9YU0hNCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWFNobS5oPgorI2VuZGlmIC8qIEhBVkVfWFNITSAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCitHX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RYQ29udGV4dCBHc3RYQ29udGV4dDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RYV2luZG93IEdzdFhXaW5kb3c7Cit0eXBlZGVmIHN0cnVjdCBfR3N0WEltYWdlIEdzdFhJbWFnZTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RNZXRhWEltYWdlIEdzdE1ldGFYSW1hZ2U7CisKKy8qIEdsb2JhbCBYIENvbnRleHQgc3R1ZmYgKi8KKy8qKgorICogR3N0WENvbnRleHQ6CisgKiBAZGlzcDogdGhlIFgxMSBEaXNwbGF5IG9mIHRoaXMgY29udGV4dAorICogQHNjcmVlbjogdGhlIGRlZmF1bHQgU2NyZWVuIG9mIERpc3BsYXkgQGRpc3AKKyAqIEB2aXN1YWw6IHRoZSBkZWZhdWx0IFZpc3VhbCBvZiBTY3JlZW4gQHNjcmVlbgorICogQHJvb3Q6IHRoZSByb290IFdpbmRvdyBvZiBEaXNwbGF5IEBkaXNwCisgKiBAd2hpdGU6IHRoZSB2YWx1ZSBvZiBhIHdoaXRlIHBpeGVsIG9uIFNjcmVlbiBAc2NyZWVuCisgKiBAYmxhY2s6IHRoZSB2YWx1ZSBvZiBhIGJsYWNrIHBpeGVsIG9uIFNjcmVlbiBAc2NyZWVuCisgKiBAZGVwdGg6IHRoZSBjb2xvciBkZXB0aCBvZiBEaXNwbGF5IEBkaXNwCisgKiBAYnBwOiB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsIG9uIERpc3BsYXkgQGRpc3AKKyAqIEBlbmRpYW5uZXNzOiB0aGUgZW5kaWFubmVzcyBvZiBpbWFnZSBieXRlcyBvbiBEaXNwbGF5IEBkaXNwCisgKiBAd2lkdGg6IHRoZSB3aWR0aCBpbiBwaXhlbHMgb2YgRGlzcGxheSBAZGlzcAorICogQGhlaWdodDogdGhlIGhlaWdodCBpbiBwaXhlbHMgb2YgRGlzcGxheSBAZGlzcAorICogQHdpZHRobW06IHRoZSB3aWR0aCBpbiBtaWxsaW1ldGVycyBvZiBEaXNwbGF5IEBkaXNwCisgKiBAaGVpZ2h0bW06IHRoZSBoZWlnaHQgaW4gbWlsbGltZXRlcnMgb2YgRGlzcGxheSBAZGlzcAorICogQHBhcl9uOiB0aGUgcGl4ZWwgYXNwZWN0IHJhdGlvIG51bWVyYXRvciBjYWxjdWxhdGVkIGZyb20gQHdpZHRoLCBAd2lkdGhtbQorICogYW5kIEBoZWlnaHQsCisgKiBAcGFyX2Q6IHRoZSBwaXhlbCBhc3BlY3QgcmF0aW8gZGVudW1lcmF0b3IgY2FsY3VsYXRlZCBmcm9tIEB3aWR0aCwgQHdpZHRobW0KKyAqIGFuZCBAaGVpZ2h0LAorICogQGhlaWdodG1tIHJhdGlvCisgKiBAdXNlX3hzaG06IHVzZWQgdG8ga25vd24gd2V0aGVyIG9mIG5vdCBYU2htIGV4dGVuc2lvbiBpcyB1c2FibGUgb3Igbm90IGV2ZW4KKyAqIGlmIHRoZSBFeHRlbnNpb24gaXMgcHJlc2VudAorICogQGNhcHM6IHRoZSAjR3N0Q2FwcyB0aGF0IERpc3BsYXkgQGRpc3AgY2FuIGFjY2VwdAorICoKKyAqIFN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIHZhcmlvdXMgaW5mb3JtYXRpb25zIGNvbGxlY3RlZC9jYWxjdWxhdGVkIGZvciBhCisgKiBEaXNwbGF5LgorICovCitzdHJ1Y3QgX0dzdFhDb250ZXh0IHsKKyAgRGlzcGxheSAqZGlzcDsKKworICBTY3JlZW4gKnNjcmVlbjsKKworICBWaXN1YWwgKnZpc3VhbDsKKworICBXaW5kb3cgcm9vdDsKKworICBndWxvbmcgd2hpdGUsIGJsYWNrOworCisgIGdpbnQgZGVwdGg7CisgIGdpbnQgYnBwOworICBnaW50IGVuZGlhbm5lc3M7CisKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnaW50IHdpZHRobW0sIGhlaWdodG1tOworCisgIC8qIHRoZXNlIGFyZSB0aGUgb3V0cHV0IG1hc2tzCisgICAqIGZvciBidWZmZXJzIGZyb20geGltYWdlc3JjCisgICAqIGFuZCBhcmUgaW4gYmlnIGVuZGlhbiAqLworICBndWludDMyIHJfbWFza19vdXRwdXQsIGdfbWFza19vdXRwdXQsIGJfbWFza19vdXRwdXQ7CisKKyAgZ3VpbnQgcGFyX247ICAgICAgICAgICAgICAgICAgLyogY2FsY3VsYXRlZCBwaXhlbCBhc3BlY3QgcmF0aW8gbnVtZXJhdG9yICovCisgIGd1aW50IHBhcl9kOyAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZWQgcGl4ZWwgYXNwZWN0IHJhdGlvIGRlbnVtZXJhdG9yICovCisKKyAgZ2Jvb2xlYW4gdXNlX3hzaG07CisKKyAgR3N0Q2FwcyAqY2FwczsKK307CisKKy8qKgorICogR3N0WFdpbmRvdzoKKyAqIEB3aW46IHRoZSBXaW5kb3cgSUQgb2YgdGhpcyBYMTEgd2luZG93CisgKiBAd2lkdGg6IHRoZSB3aWR0aCBpbiBwaXhlbHMgb2YgV2luZG93IEB3aW4KKyAqIEBoZWlnaHQ6IHRoZSBoZWlnaHQgaW4gcGl4ZWxzIG9mIFdpbmRvdyBAd2luCisgKiBAaW50ZXJuYWw6IHVzZWQgdG8gcmVtZW1iZXIgaWYgV2luZG93IEB3aW4gd2FzIGNyZWF0ZWQgaW50ZXJuYWxseSBvciBwYXNzZWQKKyAqIHRocm91Z2ggdGhlICNHc3RYT3ZlcmxheSBpbnRlcmZhY2UKKyAqIEBnYzogdGhlIEdyYXBoaWNhbCBDb250ZXh0IG9mIFdpbmRvdyBAd2luCisgKgorICogU3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgaW5mb3JtYXRpb25zIGFib3V0IGEgV2luZG93LgorICovCitzdHJ1Y3QgX0dzdFhXaW5kb3cgeworICBXaW5kb3cgd2luOworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdib29sZWFuIGludGVybmFsOworICBHQyBnYzsKK307CisKK2dib29sZWFuIHhpbWFnZXV0aWxfY2hlY2tfeHNobV9jYWxscyAoR3N0WENvbnRleHQgKiB4Y29udGV4dCk7CisKK0dzdFhDb250ZXh0ICp4aW1hZ2V1dGlsX3hjb250ZXh0X2dldCAoR3N0RWxlbWVudCAqcGFyZW50LCAKKyAgICBjb25zdCBnY2hhciAqZGlzcGxheV9uYW1lKTsKK3ZvaWQgeGltYWdldXRpbF94Y29udGV4dF9jbGVhciAoR3N0WENvbnRleHQgKnhjb250ZXh0KTsKK3ZvaWQgeGltYWdldXRpbF9jYWxjdWxhdGVfcGl4ZWxfYXNwZWN0X3JhdGlvIChHc3RYQ29udGV4dCAqIHhjb250ZXh0KTsKKworLyogY3VzdG9tIHhpbWFnZXNyYyBidWZmZXIsIGNvcGllZCBmcm9tIHhpbWFnZXNpbmsgKi8KKworLyogQnVmZmVyUmV0dXJuRnVuYyBpcyBjYWxsZWQgd2hlbiBhIGJ1ZmZlciBpcyBmaW5hbGlzZWQgKi8KK3R5cGVkZWYgZ2Jvb2xlYW4gKCpCdWZmZXJSZXR1cm5GdW5jKSAoR3N0RWxlbWVudCAqcGFyZW50LCBHc3RCdWZmZXIgKmJ1Zik7CisKKy8qKgorICogR3N0TWV0YVhJbWFnZToKKyAqIEBwYXJlbnQ6IGEgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IHdlIGJlbG9uZyB0bworICogQHhpbWFnZTogdGhlIFhJbWFnZSBvZiB0aGlzIGJ1ZmZlcgorICogQHdpZHRoOiB0aGUgd2lkdGggaW4gcGl4ZWxzIG9mIFhJbWFnZSBAeGltYWdlCisgKiBAaGVpZ2h0OiB0aGUgaGVpZ2h0IGluIHBpeGVscyBvZiBYSW1hZ2UgQHhpbWFnZQorICogQHNpemU6IHRoZSBzaXplIGluIGJ5dGVzIG9mIFhJbWFnZSBAeGltYWdlCisgKgorICogRXh0cmEgZGF0YSBhdHRhY2hlZCB0byBidWZmZXJzIGNvbnRhaW5pbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhbiBYSW1hZ2UuCisgKi8KK3N0cnVjdCBfR3N0TWV0YVhJbWFnZSB7CisgIEdzdE1ldGEgbWV0YTsKKworICAvKiBSZWZlcmVuY2UgdG8gdGhlIHhpbWFnZXNyYyB3ZSBiZWxvbmcgdG8gKi8KKyAgR3N0RWxlbWVudCAqcGFyZW50OworCisgIFhJbWFnZSAqeGltYWdlOworCisjaWZkZWYgSEFWRV9YU0hNCisgIFhTaG1TZWdtZW50SW5mbyBTSE1JbmZvOworI2VuZGlmIC8qIEhBVkVfWFNITSAqLworCisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgc2l6ZV90IHNpemU7CisKKyAgQnVmZmVyUmV0dXJuRnVuYyByZXR1cm5fZnVuYzsKK307CisKK0dUeXBlIGdzdF9tZXRhX3hpbWFnZV9hcGlfZ2V0X3R5cGUgKHZvaWQpOworY29uc3QgR3N0TWV0YUluZm8gKiBnc3RfbWV0YV94aW1hZ2VfZ2V0X2luZm8gKHZvaWQpOworI2RlZmluZSBHU1RfTUVUQV9YSU1BR0VfR0VUKGJ1ZikgKChHc3RNZXRhWEltYWdlICopZ3N0X2J1ZmZlcl9nZXRfbWV0YShidWYsZ3N0X21ldGFfeGltYWdlX2FwaV9nZXRfdHlwZSgpKSkKKyNkZWZpbmUgR1NUX01FVEFfWElNQUdFX0FERChidWYpICgoR3N0TWV0YVhJbWFnZSAqKWdzdF9idWZmZXJfYWRkX21ldGEoYnVmLGdzdF9tZXRhX3hpbWFnZV9nZXRfaW5mbygpLE5VTEwpKQorCitHc3RCdWZmZXIgKmdzdF94aW1hZ2V1dGlsX3hpbWFnZV9uZXcgKEdzdFhDb250ZXh0ICp4Y29udGV4dCwKKyAgR3N0RWxlbWVudCAqcGFyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEJ1ZmZlclJldHVybkZ1bmMgcmV0dXJuX2Z1bmMpOworCit2b2lkIGdzdF94aW1hZ2V1dGlsX3hpbWFnZV9kZXN0cm95IChHc3RYQ29udGV4dCAqeGNvbnRleHQsIAorICBHc3RCdWZmZXIgKiB4aW1hZ2UpOworICAKKy8qIENhbGwgdG8gbWFudWFsbHkgcmVsZWFzZSBhIGJ1ZmZlciAqLwordm9pZCBnc3RfeGltYWdlX2J1ZmZlcl9mcmVlIChHc3RCdWZmZXIgKnhpbWFnZSk7CisKK0dfRU5EX0RFQ0xTIAorCisjZW5kaWYgLyogX19HU1RfWElNQUdFVVRJTF9IX18gKi8KZGlmZiAtLWdpdCBhL3Rlc3RzL01ha2VmaWxlLmFtIGIvdGVzdHMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYxMGU4ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjIgQEAKK2lmIEhBVkVfR1NUX0NIRUNLCitTVUJESVJTX0NIRUNLID0gY2hlY2sgZmlsZXMKK2Vsc2UKK1NVQkRJUlNfQ0hFQ0sgPQorZW5kaWYKKworaWYgVVNFX1gKK1NVQkRJUlNfSUNMRVMgPSBpY2xlcworZWxzZQorU1VCRElSU19JQ0xFUyA9CitlbmRpZgorCitpZiBCVUlMRF9FWEFNUExFUworU1VCRElSX0VYQU1QTEVTID0gZXhhbXBsZXMKK2Vsc2UKK1NVQkRJUl9FWEFNUExFUyA9CitlbmRpZgorCitTVUJESVJTID0gJChTVUJESVJTX0NIRUNLKSAkKFNVQkRJUlNfSUNMRVMpICQoU1VCRElSX0VYQU1QTEVTKQorCitESVNUX1NVQkRJUlMgPSBjaGVjayBpY2xlcyBleGFtcGxlcyBmaWxlcworCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay8uZ2l0aWdub3JlIGIvdGVzdHMvY2hlY2svLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODk1ODhiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIgQEAKK3Rlc3QtcmVnaXN0cnkuKgorb3JjCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9NYWtlZmlsZS5hbSBiL3Rlc3RzL2NoZWNrL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NTBiYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDY2MyBAQAoraW5jbHVkZSAkKHRvcF9zcmNkaXIpL2NvbW1vbi9jaGVjay5tYWsKKworQ0hFQ0tfUkVHSVNUUlkgPSAkKHRvcF9idWlsZGRpcikvdGVzdHMvY2hlY2svdGVzdC1yZWdpc3RyeS5yZWcKK1RFU1RfRklMRVNfRElSRUNUT1JZID0gJCh0b3Bfc3JjZGlyKS90ZXN0cy9maWxlcworCitSRUdJU1RSWV9FTlZJUk9OTUVOVCA9IFwKKwlHU1RfUkVHSVNUUllfMV8wPSQoQ0hFQ0tfUkVHSVNUUlkpCisKK0FNX1RFU1RTX0VOVklST05NRU5UICs9IFwKKwkkKFJFR0lTVFJZX0VOVklST05NRU5UKQkJCQkJXAorCUdTVF9QTFVHSU5fU1lTVEVNX1BBVEhfMV8wPQkJCQlcCisJR1NUX1BMVUdJTl9QQVRIXzFfMD0kKHRvcF9idWlsZGRpcikvZ3N0OiQodG9wX2J1aWxkZGlyKS9leHQ6JCh0b3BfYnVpbGRkaXIpL3N5czokKEdTVFBCX1BMVUdJTlNfRElSKTokKEdTVF9QTFVHSU5TX0RJUikJCQlcCisJR1NUX1BMVUdJTl9MT0FESU5HX1dISVRFTElTVD0iZ3N0cmVhbWVyQCQoR1NUX1BMVUdJTlNfRElSKTpnc3QtcGx1Z2lucy1iYXNlQCQoR1NUUEJfUExVR0lOU19ESVIpOmdzdC1wbHVnaW5zLWdvb2RAJCh0b3BfYnVpbGRkaXIpIglcCisJR1NUX1NUQVRFX0lHTk9SRV9FTEVNRU5UUz0iYWFzaW5rIGF1dG9hdWRpb3NyYyBhdXRvYXVkaW9zaW5rIGF1dG92aWRlb3NyYyBhdXRvdmlkZW9zaW5rIFwKKwkJY2FjYXNpbmsgY2Fpcm90ZXh0b3ZlcmxheSBcCisJCWhhbGF1ZGlvc3JjIGhhbGF1ZGlvc2luayBqYWNrYXVkaW9zcmMgamFja2F1ZGlvc2luayBcCisJCW9zc3NyYyBvc3NzaW5rIG9zeGF1ZGlvc2luayBvc3hhdWRpb3NyYyBvc3h2aWRlb3NyYyBvc3h2aWRlb3NpbmsgXAorCQlwdWxzZXNpbmsgcHVsc2VzcmMgcHVsc2VtaXhlciB2NGwyc3JjIiBcCisJR1NFVFRJTkdTX0JBQ0tFTkQ9Im1lbW9yeSIKKworIyBmYWtlIGRldmljZSBkcml2ZXJzOiB3ZSBjb3VsZCBydW4gaGFyZHdhcmUgZWxlbWVudCB0ZXN0cyBhZ2FpbnN0IGR1bW15IGRyaXZlcnMKKyMgdjRsMjogdml2byAocGFydCBvZiBub3JtYWwga2VybmVsKQorIyAgIG1vZHByb2JlIHZpdm87CisjICAgZ3N0LWxhdW5jaCB2NGwyc3JjIGRldmljZT0iL2Rldi92aWRlbzEiICEgeHZpbWFnZXNpbms7CisjICAgcm1tb2Qgdml2bworIworIyBhbHNhOiBzbmQtZHVtbXkgKHBhcnQgb2Ygbm9ybWFsIGFsc2EsIG5vdCByZW1vdmFibGUpCisjICAgbW9kcHJvYmUgc25kLWR1bW15OworIyAgIGdzdC1sYXVuY2ggYWxzYXNyYyBkZXZpY2U9Imh3OjIiICEgZmFrZXNpbmsKKyMgICBnc3QtbGF1bmNoIGZha2VzcmMgISBhbHNhc2luayBkZXZpY2U9Imh3OjIiCisjCisjIG5lZWQgYSB3YXkgdG8gZmlndXJlIG91dCB2YWx1ZSBmb3IgdGhlIGRldmljZSBwcm9wZXJ0eQorCisjIHRoZSBjb3JlIGR1bXBzIG9mIHNvbWUgbWFjaGluZXMgaGF2ZSBQSURzIGFwcGVuZGVkCitDTEVBTkZJTEVTID0gY29yZS4qIHRlc3QtcmVnaXN0cnkuKgorCitjbGVhbi1sb2NhbDogY2xlYW4tbG9jYWwtY2hlY2sKK2Rpc3RjbGVhbi1sb2NhbDogZGlzdGNsZWFuLWxvY2FsLW9yYworCitpZiBVU0VfUExVR0lOX0FMUEhBCitjaGVja19hbHBoYSA9IFwKKwllbGVtZW50cy9hbHBoYWNvbG9yIFwKKwllbGVtZW50cy9hbHBoYQorZWxzZQorY2hlY2tfYWxwaGEgPQorZW5kaWYKKworaWYgVVNFX1BMVUdJTl9BVURJT0ZYCitjaGVja19hdWRpb2Z4ID0gXAorCWVsZW1lbnRzL2F1ZGlvYW1wbGlmeSBcCisJZWxlbWVudHMvYXVkaW9jaGViYmFuZCBcCisJZWxlbWVudHMvYXVkaW9jaGVibGltaXQgXAorCWVsZW1lbnRzL2F1ZGlvZHluYW1pYyBcCisJZWxlbWVudHMvYXVkaW9lY2hvIFwKKwllbGVtZW50cy9hdWRpb2ZpcmZpbHRlciBcCisJZWxlbWVudHMvYXVkaW9paXJmaWx0ZXIgXAorCWVsZW1lbnRzL2F1ZGlvaW52ZXJ0IFwKKwllbGVtZW50cy9hdWRpb3Bhbm9yYW1hIFwKKwllbGVtZW50cy9hdWRpb3dzaW5jYmFuZCBcCisJZWxlbWVudHMvYXVkaW93c2luY2xpbWl0CitlbHNlCitjaGVja19hdWRpb2Z4ID0KK2VuZGlmCisKK2lmIFVTRV9QTFVHSU5fQVVESU9QQVJTRVJTCitjaGVja19hdWRpb3BhcnNlcnMgPSBcCisJZWxlbWVudHMvYWFjcGFyc2UgXAorCWVsZW1lbnRzL2FjM3BhcnNlIFwKKwllbGVtZW50cy9hbXJwYXJzZSBcCisJZWxlbWVudHMvZmxhY3BhcnNlIFwKKwllbGVtZW50cy9tcGVnYXVkaW9wYXJzZSBcCisJZWxlbWVudHMvd2F2cGFja3BhcnNlCitlbHNlCitjaGVja19hdWRpb3BhcnNlcnMgPQorZW5kaWYKKworaWYgVVNFX1BMVUdJTl9BVVRPREVURUNUCitjaGVja19hdXRvZGV0ZWN0ID0gZWxlbWVudHMvYXV0b2RldGVjdAorZWxzZQorY2hlY2tfYXV0b2RldGVjdCA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX0FWSQorY2hlY2tfYXZpID0gXAorICBlbGVtZW50cy9hdmltdXggXAorICBlbGVtZW50cy9hdmlzdWJ0aXRsZQorZWxzZQorY2hlY2tfYXZpID0KK2VuZGlmCisKK2lmIFVTRV9QTFVHSU5fREVCVUdVVElMUworY2hlY2tfZGVidWd1dGlscyA9IGVsZW1lbnRzL2NhcHNzZXR0ZXIKK2Vsc2UKK2NoZWNrX2RlYnVndXRpbHMgPQorZW5kaWYKKworaWYgVVNFX1BMVUdJTl9ERUlOVEVSTEFDRQorY2hlY2tfZGVpbnRlcmxhY2UgPSBlbGVtZW50cy9kZWludGVybGFjZQorZWxzZQorY2hlY2tfZGVpbnRlcmxhY2UgPQorZW5kaWYKKworaWYgVVNFX1BMVUdJTl9EVE1GCitjaGVja19kdG1mID0gZWxlbWVudHMvZHRtZgorZWxzZQorY2hlY2tfZHRtZiA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX0VGRkVDVFYKK2NoZWNrX2VmZmVjdHYgPSBwaXBlbGluZXMvZWZmZWN0dgorZWxzZQorY2hlY2tfZWZmZWN0diA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX0VRVUFMSVpFUgorY2hlY2tfZXF1YWxpemVyID0gZWxlbWVudHMvZXF1YWxpemVyCitlbHNlCitjaGVja19lcXVhbGl6ZXIgPQorZW5kaWYKKworaWYgVVNFX0ZMQUMKK2NoZWNrX2ZsYWMgPSBwaXBlbGluZXMvZmxhY2RlYworZWxzZQorY2hlY2tfZmxhYyA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX0ZMVgorY2hlY2tfZmx2ID0gXAorICAgICAgICBlbGVtZW50cy9mbHZkZW11eCBcCisgICAgICAgIGVsZW1lbnRzL2Zsdm11eAorZWxzZQorY2hlY2tfZmx2ID0KK2VuZGlmCisKK2lmIFVTRV9QTFVHSU5fSVNPTVA0CitjaGVja19pc29tcDQgPSBcCisJZWxlbWVudHMvcXRtdXggXAorCWVsZW1lbnRzL3F0ZGVtdXgKK2Vsc2UKK2NoZWNrX2lzb21wNCA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX0xBVworY2hlY2tfbGF3ID0gXAorCWVsZW1lbnRzL211bGF3ZGVjIFwKKwllbGVtZW50cy9tdWxhd2VuYworZWxzZQorY2hlY2tfbGF3ID0KK2VuZGlmCisKK2lmIFVTRV9HREtfUElYQlVGCitjaGVja19nZGtwaXhidWYgPSBlbGVtZW50cy9nZGtwaXhidWZzaW5rIGVsZW1lbnRzL2dka3BpeGJ1Zm92ZXJsYXkKK2Vsc2UKK2NoZWNrX2dka3BpeGJ1ZiA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX0lDWURFTVVYCitjaGVja19pY3lkZW11eCA9IGVsZW1lbnRzL2ljeWRlbXV4CitlbHNlCitjaGVja19pY3lkZW11eCA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX0lEM0RFTVVYCitjaGVja19pZDNkZW11eCA9IGVsZW1lbnRzL2lkM2RlbXV4CitlbHNlCitjaGVja19pZDNkZW11eCA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX0lNQUdFRlJFRVpFCitjaGVja19pbWFnZWZyZWV6ZSA9IGVsZW1lbnRzL2ltYWdlZnJlZXplCitlbHNlCitjaGVja19pbWFnZWZyZWV6ZSA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX0lOVEVSTEVBVkUKK2NoZWNrX2ludGVybGVhdmUgPSBcCisgICAgICAgIGVsZW1lbnRzL2RlaW50ZXJsZWF2ZSBcCisgICAgICAgIGVsZW1lbnRzL2ludGVybGVhdmUKK2Vsc2UKK2NoZWNrX2ludGVybGVhdmUgPQorZW5kaWYKKworaWYgVVNFX0pQRUcKK2NoZWNrX2pwZWcgPSBcCisgICAgICAgIGVsZW1lbnRzL2pwZWdkZWMgXAorICAgICAgICBlbGVtZW50cy9qcGVnZW5jCitlbHNlCitjaGVja19qcGVnID0KK2VuZGlmCisKK2lmIFVTRV9MQU1FCitjaGVja19sYW1lID0gcGlwZWxpbmVzL2xhbWUKK2Vsc2UKK2NoZWNrX2xhbWUgPQorZW5kaWYKKworaWYgVVNFX1BMVUdJTl9MRVZFTAorY2hlY2tfbGV2ZWwgPSBlbGVtZW50cy9sZXZlbAorZWxzZQorY2hlY2tfbGV2ZWwgPQorZW5kaWYKKworaWYgVVNFX1BMVUdJTl9NQVRST1NLQQorY2hlY2tfbWF0cm9za2EgPSBcCisJZWxlbWVudHMvbWF0cm9za2FkZW11eCBcCisJZWxlbWVudHMvbWF0cm9za2FtdXggXAorCWVsZW1lbnRzL21hdHJvc2thcGFyc2UKK2Vsc2UKK2NoZWNrX21hdHJvc2thID0KK2VuZGlmCisKK2lmIFVTRV9NUEcxMjMKK2NoZWNrX21wZzEyMyA9IGVsZW1lbnRzL21wZzEyM2F1ZGlvZGVjCitlbHNlCitjaGVja19tcGcxMjMgPQorZW5kaWYKKworaWYgVVNFX1BMVUdJTl9NVUxUSUZJTEUKK2NoZWNrX211bHRpZmlsZSA9IGVsZW1lbnRzL211bHRpZmlsZSBlbGVtZW50cy9zcGxpdG11eAorZWxzZQorY2hlY2tfbXVsdGlmaWxlID0KK2VuZGlmCisKK2lmIFVTRV9QTFVHSU5fUkVQTEFZR0FJTgorY2hlY2tfcmVwbGF5Z2FpbiA9IFwKKwllbGVtZW50cy9yZ2FuYWx5c2lzIFwKKwllbGVtZW50cy9yZ2xpbWl0ZXIgXAorCWVsZW1lbnRzL3Jndm9sdW1lCitlbHNlCitjaGVja19yZXBsYXlnYWluID0KK2VuZGlmCisKK2lmIFVTRV9QTFVHSU5fUlRQCitjaGVja19ydHAgPSBcCisJZWxlbWVudHMvcnRwLXBheWxvYWRpbmcgXAorCWVsZW1lbnRzL3J0cGgyNjEgXAorCWVsZW1lbnRzL3J0cGgyNjMgXAorCWVsZW1lbnRzL3J0cGgyNjQgXAorCWVsZW1lbnRzL3J0cHZwOQorZWxzZQorY2hlY2tfcnRwID0KK2VuZGlmCisKK2lmIFVTRV9QTFVHSU5fUlRQTUFOQUdFUgorY2hlY2tfcnRwbWFuYWdlciA9IFwKKwllbGVtZW50cy9ydHBhdXggXAorCWVsZW1lbnRzL3J0cGJpbiBcCisJZWxlbWVudHMvcnRwYmluX2J1ZmZlcl9saXN0IFwKKwllbGVtZW50cy9ydHBidW5kbGUgXAorCWVsZW1lbnRzL3J0cGNvbGxpc2lvbiBcCisJZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyIFwKKwllbGVtZW50cy9ydHBtdXggXAorCWVsZW1lbnRzL3J0cHJ0eCBcCisJZWxlbWVudHMvcnRwc2Vzc2lvbgorZWxzZQorY2hlY2tfcnRwbWFuYWdlciA9CitlbmRpZgorCitpZiBVU0VfU09VUAorY2hlY2tfc291cCA9IGVsZW1lbnRzL3NvdXBodHRwc3JjCitlbHNlCitjaGVja19zb3VwID0KK2VuZGlmCisKK2lmIFVTRV9QTFVHSU5fU1BFQ1RSVU0KK2NoZWNrX3NwZWN0cnVtID0gZWxlbWVudHMvc3BlY3RydW0KK2Vsc2UKK2NoZWNrX3NwZWN0cnVtID0KK2VuZGlmCisKK2lmIFVTRV9QTFVHSU5fU0hBUEVXSVBFCitjaGVja19zaGFwZXdpcGUgPSBlbGVtZW50cy9zaGFwZXdpcGUKK2Vsc2UKK2NoZWNrX3NoYXBld2lwZSA9CitlbmRpZgorCitpZiBVU0VfVEFHTElCCitjaGVja190YWdsaWIgPSBcCisJZWxlbWVudHMvaWQzdjJtdXggXAorCWVsZW1lbnRzL2FwZXYybXV4CitlbHNlCitjaGVja190YWdsaWIgPQorZW5kaWYKKworaWYgVVNFX1RXT0xBTUUKK2NoZWNrX3R3b2xhbWUgPSBwaXBlbGluZXMvdHdvbGFtZQorZWxzZQorY2hlY2tfdHdvbGFtZSA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX1VEUAorY2hlY2tfdWRwID0gXAorICAgICAgICBlbGVtZW50cy91ZHBzaW5rIFwKKyAgICAgICAgZWxlbWVudHMvdWRwc3JjCitlbHNlCitjaGVja191ZHAgPQorZW5kaWYKKworaWYgVVNFX1BMVUdJTl9WSURFT0JPWAorY2hlY2tfdmlkZW9ib3ggPSBlbGVtZW50cy92aWRlb2JveAorZWxzZQorY2hlY2tfdmlkZW9ib3ggPQorZW5kaWYKKworaWYgVVNFX1BMVUdJTl9WSURFT0NST1AKK2NoZWNrX3ZpZGVvY3JvcCA9IFwKKwllbGVtZW50cy9hc3BlY3RyYXRpb2Nyb3AgXAorCWVsZW1lbnRzL3ZpZGVvY3JvcAorZWxzZQorY2hlY2tfdmlkZW9jcm9wID0KK2VuZGlmCisKK2lmIFVTRV9QTFVHSU5fVklERU9GSUxURVIKK2NoZWNrX3ZpZGVvZmlsdGVyID0gZWxlbWVudHMvdmlkZW9maWx0ZXIKK2Vsc2UKK2NoZWNrX3ZpZGVvZmlsdGVyID0KK2VuZGlmCisKK2lmIFVTRV9QTFVHSU5fVklERU9NSVhFUgorY2hlY2tfdmlkZW9taXhlciA9IGVsZW1lbnRzL3ZpZGVvbWl4ZXIKK2Vsc2UKK2NoZWNrX3ZpZGVvbWl4ZXIgPQorZW5kaWYKKworaWYgVVNFX1ZQWAorY2hlY2tfdnB4PWVsZW1lbnRzL3ZwOGVuYyBlbGVtZW50cy92cDhkZWMgZWxlbWVudHMvdnA5ZW5jCitlbHNlCitjaGVja192cHg9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX1dBVkVOQworY2hlY2tfd2F2ZW5jID0gcGlwZWxpbmVzL3dhdmVuYworZWxzZQorY2hlY2tfd2F2ZW5jID0KK2VuZGlmCisKK2lmIFVTRV9XQVZQQUNLCitjaGVja193YXZwYWNrID0gXAorICAgICAgIGVsZW1lbnRzL3dhdnBhY2tkZWMgXAorICAgICAgIGVsZW1lbnRzL3dhdnBhY2tlbmMgXAorICAgICAgIHBpcGVsaW5lcy93YXZwYWNrCitlbHNlCitjaGVja193YXZwYWNrID0KK2VuZGlmCisKK2lmIFVTRV9QTFVHSU5fV0FWUEFSU0UKK2NoZWNrX3dhdnBhcnNlID0gZWxlbWVudHMvd2F2cGFyc2UKK2Vsc2UKK2NoZWNrX3dhdnBhcnNlID0KK2VuZGlmCisKK2lmIFVTRV9QTFVHSU5fWTRNCitjaGVja195NG0gPSBlbGVtZW50cy95NG1lbmMKK2Vsc2UKK2NoZWNrX3k0bSA9CitlbmRpZgorCitpZiBIQVZFX09SQworY2hlY2tfb3JjID0gb3JjL2RlaW50ZXJsYWNlIG9yYy92aWRlb21peGVyIG9yYy92aWRlb2JveAorZWxzZQorY2hlY2tfb3JjID0KK2VuZGlmCisKKworY2hlY2tfUFJPR1JBTVMgPSBcCisJZ2VuZXJpYy9zdGF0ZXMgXAorCXBpcGVsaW5lcy9zaW1wbGUtbGF1bmNoLWxpbmVzIFwKKwlwaXBlbGluZXMvdGFnc2NoZWNraW5nIFwKKwkkKGNoZWNrX2FscGhhKSBcCisJJChjaGVja19hdWRpb2Z4KSBcCisJJChjaGVja19hdWRpb3BhcnNlcnMpIFwKKwkkKGNoZWNrX2F1dG9kZXRlY3QpIFwKKwkkKGNoZWNrX2F2aSkgXAorCSQoY2hlY2tfZGVidWd1dGlscykgXAorCSQoY2hlY2tfZGVpbnRlcmxhY2UpIFwKKwkkKGNoZWNrX2R0bWYpIFwKKwkkKGNoZWNrX2VmZmVjdHYpIFwKKwkkKGNoZWNrX2VxdWFsaXplcikgXAorCSQoY2hlY2tfZmxhYykgXAorCSQoY2hlY2tfZmx2KSBcCisJJChjaGVja19nZGtwaXhidWYpIFwKKwkkKGNoZWNrX2lzb21wNCkgXAorCSQoY2hlY2tfaWN5ZGVtdXgpIFwKKwkkKGNoZWNrX2lkM2RlbXV4KSBcCisJJChjaGVja19pbWFnZWZyZWV6ZSkgXAorCSQoY2hlY2tfaW50ZXJsZWF2ZSkgXAorCSQoY2hlY2tfanBlZykgXAorCSQoY2hlY2tfbGFtZSkgXAorCSQoY2hlY2tfbGF3KSBcCisJJChjaGVja19sZXZlbCkgXAorCSQoY2hlY2tfbWF0cm9za2EpIFwKKwkkKGNoZWNrX21wZzEyMykgXAorCSQoY2hlY2tfbXVsdGlmaWxlKSBcCisJJChjaGVja19yZXBsYXlnYWluKSBcCisJJChjaGVja19ydHApIFwKKwkkKGNoZWNrX3J0cG1hbmFnZXIpIFwKKwkkKGNoZWNrX3NoYXBld2lwZSkgXAorCSQoY2hlY2tfc291cCkgXAorCSQoY2hlY2tfc3BlY3RydW0pIFwKKwkkKGNoZWNrX3RhZ2xpYikgXAorCSQoY2hlY2tfdHdvbGFtZSkgXAorCSQoY2hlY2tfdWRwKSBcCisJJChjaGVja192aWRlb2JveCkgXAorCSQoY2hlY2tfdmlkZW9jcm9wKSBcCisJJChjaGVja192aWRlb2ZpbHRlcikgXAorCSQoY2hlY2tfdmlkZW9taXhlcikgXAorCSQoY2hlY2tfdnB4KSBcCisJJChjaGVja193YXZlbmMpIFwKKwkkKGNoZWNrX3dhdnBhY2spIFwKKwkkKGNoZWNrX3dhdnBhcnNlKSBcCisJJChjaGVja195NG0pIFwKKwkkKGNoZWNrX29yYykKKworVkFMR1JJTkRfVE9fRklYID0gXAorCWVsZW1lbnRzL3J0cC1wYXlsb2FkaW5nCisKK1RFU1RTID0gJChjaGVja19QUk9HUkFNUykKKworQU1fQ0ZMQUdTID0gJChHU1RfT0JKX0NGTEFHUykgJChHU1RfQ0hFQ0tfQ0ZMQUdTKSAkKENIRUNLX0NGTEFHUykgXAorCSQoR1NUX09QVElPTl9DRkxBR1MpICQoR1NUX0NGTEFHUykgLURHU1RfVEVTVF9GSUxFU19QQVRIPSJcIiQoVEVTVF9GSUxFU19ESVJFQ1RPUlkpXCIiIFwKKwktREdTVF9DSEVDS19URVNUX0VOVklST05NRU5UX0JFQUNPTj0iXCJHU1RfUExVR0lOX0xPQURJTkdfV0hJVEVMSVNUXCIiIFwKKwktVUdfRElTQUJMRV9BU1NFUlQgLVVHX0RJU0FCTEVfQ0FTVF9DSEVDS1MgJChQVEhSRUFEX0NGTEFHUykKK0xEQUREID0gJChHU1RfT0JKX0xJQlMpICQoR1NUX0NIRUNLX0xJQlMpICQoQ0hFQ0tfTElCUykKKworIyB2YWxncmluZCB0ZXN0aW5nCisjIHZpZGVvY3JvcCBkaXNhYmxlZCBzaW5jZSBpdCB0YWtlcyB3YXkgdG9vIGxvbmcgaW4gdmFsZ3JpbmQKK1ZBTEdSSU5EX1RFU1RTX0RJU0FCTEUgPSBcCisJZWxlbWVudHMvdmlkZW9jcm9wIFwKKwkkKFZBTEdSSU5EX1RPX0ZJWCkKKworU1VQUFJFU1NJT05TID0gJCh0b3Bfc3JjZGlyKS9jb21tb24vZ3N0LnN1cHAgJChzcmNkaXIpL2dzdC1wbHVnaW5zLWdvb2Quc3VwcAorCisjIHBhcnNlciB1bml0IHRlc3QgY29udmVuaWVuY2UgbGliCitub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJwYXJzZXIubGEKK2xpYnBhcnNlcl9sYV9TT1VSQ0VTID0gZWxlbWVudHMvcGFyc2VyLmMgZWxlbWVudHMvcGFyc2VyLmgKK2xpYnBhcnNlcl9sYV9DRkxBR1MgPSBcCisJLUkkKHRvcF9zcmNkaXIpL3Rlc3RzL2NoZWNrIFwKKwkkKEFNX0NGTEFHUykgLURHU1RfVVNFX1VOU1RBQkxFX0FQSQorCitlbGVtZW50c19hYWNwYXJzZV9MREFERCA9IGxpYnBhcnNlci5sYSAkKExEQUREKQorCitlbGVtZW50c19hYzNwYXJzZV9MREFERCA9IGxpYnBhcnNlci5sYSAkKExEQUREKQorCitlbGVtZW50c19hbXJwYXJzZV9MREFERCA9IGxpYnBhcnNlci5sYSAkKExEQUREKQorCitlbGVtZW50c19mbGFjcGFyc2VfTERBREQgPSBsaWJwYXJzZXIubGEgJChMREFERCkKKworZWxlbWVudHNfZmx2ZGVtdXhfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfZmx2ZGVtdXhfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R0YWctJChHU1RfQVBJX1ZFUlNJT04pICQoTERBREQpCisKK2VsZW1lbnRzX21wZWdhdWRpb3BhcnNlX0xEQUREID0gbGlicGFyc2VyLmxhICQoTERBREQpCisKK2VsZW1lbnRzX2FzcGVjdHJhdGlvY3JvcF9MREFERCA9ICQoTERBREQpCitlbGVtZW50c19hc3BlY3RyYXRpb2Nyb3BfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorCitlbGVtZW50c19hdWRpb2FtcGxpZnlfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfYXVkaW9hbXBsaWZ5X0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pICQoTERBREQpCisKK2VsZW1lbnRzX2F1ZGlvY2hlYmJhbmRfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfYXVkaW9jaGViYmFuZF9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKSAkKExJQk0pCisKK2VsZW1lbnRzX2F1ZGlvY2hlYmxpbWl0X0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX2F1ZGlvY2hlYmxpbWl0X0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pICQoTERBREQpICQoTElCTSkKKworZWxlbWVudHNfYXVkaW9keW5hbWljX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX2F1ZGlvZHluYW1pY19MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKQorCitlbGVtZW50c19hdWRpb2VjaG9fQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfYXVkaW9lY2hvX0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pICQoTERBREQpCisKK2VsZW1lbnRzX2F1ZGlvaW52ZXJ0X0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX2F1ZGlvaW52ZXJ0X0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pICQoTERBREQpCisKK2VsZW1lbnRzX2F1ZGlvcGFub3JhbWFfTERBREQgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pICQoR1NUX0JBU0VfTElCUykgXAorCSQoR1NUX0NPTlRST0xMRVJfTElCUykgJChMREFERCkKKworZWxlbWVudHNfYXVkaW9wYW5vcmFtYV9DRkxBR1MgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NPTlRST0xMRVJfQ0ZMQUdTKSBcCisJJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorCitlbGVtZW50c19hdWRpb3dzaW5jYmFuZF9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19hdWRpb3dzaW5jYmFuZF9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKSAkKExJQk0pCisKK2VsZW1lbnRzX2F1ZGlvd3NpbmNsaW1pdF9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19hdWRpb3dzaW5jbGltaXRfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RhdWRpby0kKEdTVF9BUElfVkVSU0lPTikgJChMREFERCkgJChMSUJNKQorCitlbGVtZW50c19hdXRvZGV0ZWN0X0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19hdXRvZGV0ZWN0X0xEQUREID0gJChHU1RfQkFTRV9MSUJTKSAkKExEQUREKQorCitlbGVtZW50c19lcXVhbGl6ZXJfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfZXF1YWxpemVyX0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pICQoTERBREQpICQoTElCTSkKKworZWxlbWVudHNfcmdhbmFseXNpc19DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19yZ2FuYWx5c2lzX0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pICQoTERBREQpCitlbGVtZW50c19yZ2xpbWl0ZXJfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfcmdsaW1pdGVyX0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pICQoTERBREQpCitlbGVtZW50c19yZ3ZvbHVtZV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19yZ3ZvbHVtZV9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKSAkKExJQk0pCisKK2VsZW1lbnRzX3J0cF9wYXlsb2FkaW5nX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19ydHBfcGF5bG9hZGluZ19MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKEdTVF9CQVNFX0xJQlMpICQoTERBREQpCisKK2VsZW1lbnRzX3NwZWN0cnVtX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX3NwZWN0cnVtX0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pICQoTERBREQpCisKK2VsZW1lbnRzX2FscGhhY29sb3JfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfYWxwaGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorCitlbGVtZW50c19kZWludGVybGFjZV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19kZWludGVybGFjZV9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHZpZGVvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKQorCitlbGVtZW50c19kdG1mX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX2R0bWZfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RydHAtQEdTVF9BUElfVkVSU0lPTkAgXAorICAgICQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykgJChMREFERCkKKworZWxlbWVudHNfZGVpbnRlcmxlYXZlX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX2RlaW50ZXJsZWF2ZV9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKQorZWxlbWVudHNfaW50ZXJsZWF2ZV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19pbnRlcmxlYXZlX0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pICQoTERBREQpCisKK2VsZW1lbnRzX2xldmVsX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX2xldmVsX0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pICQoTERBREQpCisKK2VsZW1lbnRzX2ltYWdlZnJlZXplX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX2ltYWdlZnJlZXplX0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0dmlkZW8tJChHU1RfQVBJX1ZFUlNJT04pICQoR1NUX0JBU0VfTElCUykgJChMREFERCkKKworZWxlbWVudHNfanBlZ2RlY19DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChHSU9fQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX2pwZWdkZWNfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RhcHAtJChHU1RfQVBJX1ZFUlNJT04pIC1sZ3N0cGJ1dGlscy0kKEdTVF9BUElfVkVSU0lPTikgJChHU1RfQkFTRV9MSUJTKSAkKEdJT19MSUJTKSAkKExEQUREKQorCitlbGVtZW50c19qcGVnZW5jX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX2pwZWdlbmNfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RhcHAtJChHU1RfQVBJX1ZFUlNJT04pICQoR1NUX0JBU0VfTElCUykgJChMREFERCkKKworZWxlbWVudHNfbWF0cm9za2FtdXhfTERBREQgPSAkKEdTVF9CQVNFX0xJQlMpICQoTERBREQpICQoTElCTSkKKworZWxlbWVudHNfbXBnMTIzYXVkaW9kZWNfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfbXBnMTIzYXVkaW9kZWNfTERBREQgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tQEdTVF9BUElfVkVSU0lPTkAgLWxnc3RmZnQtQEdTVF9BUElfVkVSU0lPTkAgXAorCS1sZ3N0YXBwLUBHU1RfQVBJX1ZFUlNJT05AICQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykgJChMREFERCkKKworZWxlbWVudHNfbXVsYXdkZWNfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKEFNX0NGTEFHUykKKworZWxlbWVudHNfbXVsYXdlbmNfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKEFNX0NGTEFHUykKKworZWxlbWVudHNfbXVsdGlmaWxlX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19tdWx0aWZpbGVfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R2aWRlby0kKEdTVF9BUElfVkVSU0lPTikgJChHU1RfTElCUykgJChMREFERCkgJChMSUJNKQorCitlbGVtZW50c19zcGxpdG11eF9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19zcGxpdG11eF9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGFwcC0kKEdTVF9BUElfVkVSU0lPTikgJChHU1RfTElCUykgJChMREFERCkgJChMSUJNKQorCitlbGVtZW50c19xdG11eF9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfcXRtdXhfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RwYnV0aWxzLUBHU1RfQVBJX1ZFUlNJT05AIFwKKyAgICAgICAgICAgICAkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoR1NUX0NIRUNLX0xJQlMpCisKK2VsZW1lbnRzX3J0cGJpbl9idWZmZXJfbGlzdF9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpIFwKKwkkKFdBUk5JTkdfQ0ZMQUdTKSAkKEVSUk9SX0NGTEFHUykgJChHU1RfQ0hFQ0tfQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX3J0cGJpbl9idWZmZXJfbGlzdF9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSBcCisgICAgICAgICAgICAgLWxnc3RydHAtJChHU1RfQVBJX1ZFUlNJT04pIFwKKyAgICAgICAgICAgICAkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoR1NUX0NIRUNLX0xJQlMpICQoTERBREQpCitlbGVtZW50c19ydHBiaW5fYnVmZmVyX2xpc3RfU09VUkNFUyA9IGVsZW1lbnRzL3J0cGJpbl9idWZmZXJfbGlzdC5jCisKK2VsZW1lbnRzX3J0cGJpbl9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSBcCisJJChXQVJOSU5HX0NGTEFHUykgJChFUlJPUl9DRkxBR1MpICQoR1NUX0NIRUNLX0NGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19ydHBiaW5fTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgXAorICAgICAgICAgICAgIC1sZ3N0cnRwLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisgICAgICAgICAgICAgJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKEdTVF9DSEVDS19MSUJTKSAkKExEQUREKQorCitlbGVtZW50c19ydHBoMjYxX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX3J0cGgyNjFfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RydHAtJChHU1RfQVBJX1ZFUlNJT04pICQoR1NUX0JBU0VfTElCUykgJChMREFERCkKKworZWxlbWVudHNfcnRwaDI2M19DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19ydHBoMjYzX0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0cnRwLSQoR1NUX0FQSV9WRVJTSU9OKSAkKEdTVF9CQVNFX0xJQlMpICQoTERBREQpCisKK2VsZW1lbnRzX3J0cGgyNjRfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfcnRwaDI2NF9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGFwcC0kKEdTVF9BUElfVkVSU0lPTikgJChHU1RfQkFTRV9MSUJTKSAkKExEQUREKQorCitlbGVtZW50c19ydHBtdXhfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfcnRwbXV4X0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0cnRwLSQoR1NUX0FQSV9WRVJTSU9OKSAkKEdTVF9CQVNFX0xJQlMpICQoTERBREQpCisKK2VsZW1lbnRzX3NvdXBodHRwc3JjX0NGTEFHUyA9ICQoU09VUF9DRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfc291cGh0dHBzcmNfTERBREQgPSAkKFNPVVBfTElCUykgJChMREFERCkKKworZWxlbWVudHNfdWRwc2lua19DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChHSU9fQ0ZMQUdTKQorZWxlbWVudHNfdWRwc2lua19MREFERCA9ICQoTERBREQpICQoR0lPX0xJQlMpCisKK2VsZW1lbnRzX3VkcHNyY19DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChHSU9fQ0ZMQUdTKQorZWxlbWVudHNfdWRwc3JjX0xEQUREID0gJChMREFERCkgJChHSU9fTElCUykKKworZWxlbWVudHNfdmlkZW9jcm9wX0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpICQoR1NUX0JBU0VfTElCUykgLWxnc3R2aWRlby0kKEdTVF9BUElfVkVSU0lPTikgJChMREFERCkKK2VsZW1lbnRzX3ZpZGVvY3JvcF9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorCitlbGVtZW50c192aWRlb2ZpbHRlcl9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c192aWRlb2ZpbHRlcl9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHZpZGVvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKQorCitlbGVtZW50c19ydHBqaXR0ZXJidWZmZXJfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfcnRwaml0dGVyYnVmZmVyX0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0cnRwLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKQorCitlbGVtZW50c19ydHBydHhfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfcnRwcnR4X0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0cnRwLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKQorCitlbGVtZW50c19ydHBzZXNzaW9uX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX3J0cHNlc3Npb25fTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgJChHU1RfTkVUX0xJQlMpIC1sZ3N0cnRwLSQoR1NUX0FQSV9WRVJTSU9OKSAkKEdJT19MSUJTKSAkKExEQUREKQorCitlbGVtZW50c19ydHBjb2xsaXNpb25fQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfcnRwY29sbGlzaW9uX0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpICQoR1NUX05FVF9MSUJTKSAtbGdzdHJ0cC0kKEdTVF9BUElfVkVSU0lPTikgJChHSU9fTElCUykgJChMREFERCkKKworZWxlbWVudHNfcnRwYXV4X0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX3J0cGF1eF9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHJ0cC0kKEdTVF9BUElfVkVSU0lPTikgJChMREFERCkKKworZWxlbWVudHNfcnRwYnVuZGxlX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX3J0cGJ1bmRsZV9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHJ0cC0kKEdTVF9BUElfVkVSU0lPTikgJChMREFERCkKKworIyBGSVhNRTogY29uZmlndXJlIHNob3VsZCBjaGVjayBmb3IgZ2RrLXBpeGJ1ZiBub3QgZ3RrCisjIG9ubHkgbmVlZCB2aWRlby5oIGhlYWRlciwgbm90IHRoZSBsaWIKK2VsZW1lbnRzX2dka3BpeGJ1ZnNpbmtfQ0ZMQUdTID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykgJChHREtfUElYQlVGX0NGTEFHUykKK2VsZW1lbnRzX2dka3BpeGJ1ZnNpbmtfTERBREQgPSBcCisJJChMREFERCkgJChHREtfUElYQlVGX0xJQlMpCisKK2VsZW1lbnRzX3ZpZGVvbWl4ZXJfTERBREQgPSAkKExEQUREKSAgJChHU1RfQkFTRV9MSUJTKQorZWxlbWVudHNfdmlkZW9taXhlcl9DRkxBR1MgPSAkKEdTVF9CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorCitwaXBlbGluZXNfZmxhY2RlY19DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCitwaXBlbGluZXNfZmxhY2RlY19MREFERCAgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RhdWRpby0kKEdTVF9BUElfVkVSU0lPTikgJChMREFERCkKKworZWxlbWVudHNfdnA5ZW5jX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX3ZwOWVuY19MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHZpZGVvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKQorCitwaXBlbGluZXNfd2F2ZW5jX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK3BpcGVsaW5lc193YXZlbmNfTERBREQgID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pICQoTERBREQpCisKK3BpcGVsaW5lc193YXZwYWNrX0xEQUREID0gJChMREFERCkgJChHU1RfQkFTRV9MSUJTKQorcGlwZWxpbmVzX3dhdnBhY2tfQ0ZMQUdTID0gJChHU1RfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKKworb3JjX2RlaW50ZXJsYWNlX0NGTEFHUyA9ICQoT1JDX0NGTEFHUykKK29yY19kZWludGVybGFjZV9MREFERCA9ICQoT1JDX0xJQlMpIC1sb3JjLXRlc3QtMC40Citub2Rpc3Rfb3JjX2RlaW50ZXJsYWNlX1NPVVJDRVMgPSBvcmMvZGVpbnRlcmxhY2UuYworb3JjX3ZpZGVvbWl4ZXJfQ0ZMQUdTID0gJChPUkNfQ0ZMQUdTKQorb3JjX3ZpZGVvbWl4ZXJfTERBREQgPSAkKE9SQ19MSUJTKSAtbG9yYy10ZXN0LTAuNAorbm9kaXN0X29yY192aWRlb21peGVyX1NPVVJDRVMgPSBvcmMvdmlkZW9taXhlci5jCitvcmNfdmlkZW9ib3hfQ0ZMQUdTID0gJChPUkNfQ0ZMQUdTKQorb3JjX3ZpZGVvYm94X0xEQUREID0gJChPUkNfTElCUykgLWxvcmMtdGVzdC0wLjQKK25vZGlzdF9vcmNfdmlkZW9ib3hfU09VUkNFUyA9IG9yYy92aWRlb2JveC5jCisKK29yYy9kZWludGVybGFjZS5jOiAkKHRvcF9zcmNkaXIpL2dzdC9kZWludGVybGFjZS90dnRpbWUub3JjCisJJChNS0RJUl9QKSBvcmMvCisJJChPUkNDKSAtLXRlc3QgLW8gJEAgJDwKKworb3JjL3ZpZGVvbWl4ZXIuYzogJCh0b3Bfc3JjZGlyKS9nc3QvdmlkZW9taXhlci92aWRlb21peGVyb3JjLm9yYworCSQoTUtESVJfUCkgb3JjLworCSQoT1JDQykgLS10ZXN0IC1vICRAICQ8CisKK29yYy92aWRlb2JveC5jOiAkKHRvcF9zcmNkaXIpL2dzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy5vcmMKKwkkKE1LRElSX1ApIG9yYy8KKwkkKE9SQ0MpIC0tdGVzdCAtbyAkQCAkPAorCitkaXN0Y2xlYW4tbG9jYWwtb3JjOgorCXJtIC1yZiBvcmMKKworRVhUUkFfRElTVCA9IFwKKwlnc3QtcGx1Z2lucy1nb29kLnN1cHAJXAorCWVsZW1lbnRzL3F0ZGVtdXguaApkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZSBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYzMjQ3NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmUKQEAgLTAsMCArMSw4NSBAQAorLmRpcnN0YW1wCithYWNwYXJzZQorYWMzcGFyc2UKK2FscGhhCithbHBoYWNvbG9yCithbXJwYXJzZQorYXBldjJtdXgKK2FzcGVjdHJhdGlvY3JvcAorYXVkaW9hbXBsaWZ5CithdWRpb2NoZWJiYW5kCithdWRpb2NoZWJsaW1pdAorYXVkaW9lY2hvCithdWRpb3dzaW5jYmFuZAorYXVkaW93c2luY2xpbWl0CithdWRpb2R5bmFtaWMKK2F1ZGlvZmlyZmlsdGVyCithdWRpb2ludmVydAorYXVkaW9paXJmaWx0ZXIKK2F1ZGlvcGFub3JhbWEKK2F1dG9kZXRlY3QKK2F2aW11eAorYXZpc3VidGl0bGUKK2NhcHNzZXR0ZXIKK2RlaW50ZXJsYWNlCitkZWludGVybGVhdmUKK2R0bWYKK2VxdWFsaXplcgorZ2RrcGl4YnVmb3ZlcmxheQorZ2RrcGl4YnVmc2luaworZmxhY3BhcnNlCitmbHZkZW11eAorZmx2bXV4CitpY3lkZW11eAoraWQzZGVtdXgKK2lkM3YybXV4CitpbWFnZWZyZWV6ZQoraW50ZXJsZWF2ZQoranBlZ2RlYworanBlZ2VuYworbGV2ZWwKK21hdHJvc2thZGVtdXgKK21hdHJvc2thbXV4CittYXRyb3NrYXBhcnNlCittcGVnYXVkaW9wYXJzZQorbXBnMTIzYXVkaW9kZWMKK211bGF3ZGVjCittdWxhd2VuYworbXVsdGlmaWxlCitxdGRlbXV4CitxdG11eAorcmdhbmFseXNpcworcmdsaW1pdGVyCityZ3ZvbHVtZQorcnRwLXBheWxvYWRpbmcKK3J0cGF1eAorcnRwYmluCitydHBiaW5fYnVmZmVyX2xpc3QKK3J0cGJ1bmRsZQorcnRwY29sbGlzaW9uCitydHBoMjYxCitydHBoMjYzCitydHBoMjY0CitydHBqaXR0ZXJidWZmZXIKK3J0cHNlc3Npb24KK3J0cG11eAorcnRwcnR4CitydHB2cDkKK3NoYXBld2lwZQorc291cGh0dHBzcmMKK3NwZWN0cnVtCitzcGxpdG11eAordWRwc2luawordWRwc3JjCit2aWRlb2Nyb3AKK3ZpZGVvYm94Cit2aWRlb2ZpbHRlcgordmlkZW9taXhlcgordnA4ZGVjCit2cDhlbmMKK3ZwOWVuYword2F2cGFja2RlYword2F2cGFyc2UKK3dhdnBhY2tlbmMKK3dhdnBhY2twYXJzZQoreTRtZW5jCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9hYWNwYXJzZS5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYWFjcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTlmZDdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYWFjcGFyc2UuYwpAQCAtMCwwICsxLDMxOCBAQAorLyoKKyAqIEdTdHJlYW1lcgorICoKKyAqIHVuaXQgdGVzdCBmb3IgYWFjcGFyc2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdDogU3RlZmFuIEtvc3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2NoZWNrLmg+CisjaW5jbHVkZSAicGFyc2VyLmgiCisKKyNkZWZpbmUgU1JDX0NBUFNfQ0RBVEEgImF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpNCwgZnJhbWVkPShib29sZWFuKWZhbHNlLCBjb2RlY19kYXRhPShidWZmZXIpMTE5MCIKKyNkZWZpbmUgU1JDX0NBUFNfVE1QTCAgImF1ZGlvL21wZWcsIGZyYW1lZD0oYm9vbGVhbilmYWxzZSwgbXBlZ3ZlcnNpb249KGludCl7Miw0fSIKKyNkZWZpbmUgU1JDX0NBUFNfUkFXICAgImF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpNCwgZnJhbWVkPShib29sZWFuKXRydWUsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylyYXcsIHJhdGU9KGludCk0ODAwMCwgY2hhbm5lbHM9KGludCkyLCBjb2RlY19kYXRhPShidWZmZXIpMTE5MCIKKworI2RlZmluZSBTSU5LX0NBUFMgXAorICAgICJhdWRpby9tcGVnLCBmcmFtZWQ9KGJvb2xlYW4pdHJ1ZSIKKyNkZWZpbmUgU0lOS19DQVBTX01QRUcyIFwKKyAgICAiYXVkaW8vbXBlZywgZnJhbWVkPShib29sZWFuKXRydWUsIG1wZWd2ZXJzaW9uPTIsIHJhdGU9NDgwMDAsIGNoYW5uZWxzPTIiCisjZGVmaW5lIFNJTktfQ0FQU19NUEVHNCBcCisgICAgImF1ZGlvL21wZWcsIGZyYW1lZD0oYm9vbGVhbil0cnVlLCBtcGVndmVyc2lvbj00LCByYXRlPTk2MDAwLCBjaGFubmVscz0yIgorI2RlZmluZSBTSU5LX0NBUFNfVE1QTCAgImF1ZGlvL21wZWcsIGZyYW1lZD0oYm9vbGVhbil0cnVlLCBtcGVndmVyc2lvbj0oaW50KXsyLDR9IgorCitHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFNJTktfQ0FQU19UTVBMKQorICAgICk7CisKK0dzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoU1JDX0NBUFNfVE1QTCkKKyAgICApOworCisvKiBzb21lIGRhdGEgKi8KK3N0YXRpYyBndWludDggYWRpZl9oZWFkZXJbXSA9IHsKKyAgJ0EnLCAnRCcsICdJJywgJ0YnCit9OworCitzdGF0aWMgZ3VpbnQ4IGFkdHNfZnJhbWVfbXBlZzJbXSA9IHsKKyAgMHhmZiwgMHhmOSwgMHg0YywgMHg4MCwgMHgwMSwgMHhmZiwgMHhmYywgMHgyMSwgMHgxMCwgMHhkMywgMHgyMCwgMHgwYywKKyAgMHgzMiwgMHgwMCwgMHhjNworfTsKKworc3RhdGljIGd1aW50OCBhZHRzX2ZyYW1lX21wZWc0W10gPSB7CisgIDB4ZmYsIDB4ZjEsIDB4NGMsIDB4ODAsIDB4MDEsIDB4ZmYsIDB4ZmMsIDB4MjEsIDB4MTAsIDB4ZDMsIDB4MjAsIDB4MGMsCisgIDB4MzIsIDB4MDAsIDB4YzcKK307CisKK3N0YXRpYyBndWludDggZ2FyYmFnZV9mcmFtZVtdID0geworICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmCit9OworCitzdGF0aWMgZ3VpbnQ4IHJhd19mcmFtZV9zaG9ydFtdID0geworICAweDI3LCAweDAwLCAweDAzLCAweDIwLCAweDY0LCAweDFjCit9OworCisvKgorICogVGVzdCBpZiB0aGUgcGFyc2VyIHB1c2hlcyBkYXRhIHdpdGggQURJRiBoZWFkZXIgcHJvcGVybHkgYW5kIGRldGVjdHMgdGhlCisgKiBzdHJlYW0gdG8gTVBFRzQgcHJvcGVybHkuCisgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX2FkaWZfbm9ybWFsKQoreworICBHc3RQYXJzZXJUZXN0IHB0ZXN0OworCisgIC8qIEFESUYgaGVhZGVyICovCisgIGdzdF9wYXJzZXJfdGVzdF9pbml0ICgmcHRlc3QsIGFkaWZfaGVhZGVyLCBzaXplb2YgKGFkaWZfaGVhZGVyKSwgMSk7CisgIC8qIHdlbGwsIG5vIGdhcmJhZ2UsIGZvbGxvd2VkIGJ5IHJhbmRvbSBkYXRhICovCisgIHB0ZXN0LnNlcmllc1syXS5zaXplID0gMTAwOworICBwdGVzdC5zZXJpZXNbMl0ubnVtID0gMzsKKyAgLyogYW5kIHdlIGRvIG5vdCByZWFsbHkgZXhwZWN0IG91dHB1dCBmcmFtZXMgKi8KKyAgcHRlc3QuZnJhbWVkID0gRkFMU0U7CisgIC8qIENoZWNrIHRoYXQgdGhlIG5lZ290aWF0ZWQgY2FwcyBhcmUgYXMgZXhwZWN0ZWQgKi8KKyAgLyogRm9yIEFESUYgcGFyc2VyIGFzc3VtZXMgdGhhdCBkYXRhIGlzIGFsd2F5cyB2ZXJzaW9uIDQgKi8KKyAgcHRlc3Quc2lua19jYXBzID0KKyAgICAgIGdzdF9jYXBzX2Zyb21fc3RyaW5nIChTSU5LX0NBUFNfTVBFRzQgIiwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKWFkaWYiKTsKKworICBnc3RfcGFyc2VyX3Rlc3RfcnVuICgmcHRlc3QsIE5VTEwpOworCisgIGdzdF9jYXBzX3VucmVmIChwdGVzdC5zaW5rX2NhcHMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2VfYWR0c19ub3JtYWwpCit7CisgIGdzdF9wYXJzZXJfdGVzdF9ub3JtYWwgKGFkdHNfZnJhbWVfbXBlZzQsIHNpemVvZiAoYWR0c19mcmFtZV9tcGVnNCkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2VfYWR0c19kcmFpbl9zaW5nbGUpCit7CisgIGdzdF9wYXJzZXJfdGVzdF9kcmFpbl9zaW5nbGUgKGFkdHNfZnJhbWVfbXBlZzQsIHNpemVvZiAoYWR0c19mcmFtZV9tcGVnNCkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2VfYWR0c19kcmFpbl9nYXJiYWdlKQoreworICBnc3RfcGFyc2VyX3Rlc3RfZHJhaW5fZ2FyYmFnZSAoYWR0c19mcmFtZV9tcGVnNCwgc2l6ZW9mIChhZHRzX2ZyYW1lX21wZWc0KSwKKyAgICAgIGdhcmJhZ2VfZnJhbWUsIHNpemVvZiAoZ2FyYmFnZV9mcmFtZSkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2VfYWR0c19zcGxpdCkKK3sKKyAgZ3N0X3BhcnNlcl90ZXN0X3NwbGl0IChhZHRzX2ZyYW1lX21wZWc0LCBzaXplb2YgKGFkdHNfZnJhbWVfbXBlZzQpKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX2FkdHNfc2tpcF9nYXJiYWdlKQoreworICBnc3RfcGFyc2VyX3Rlc3Rfc2tpcF9nYXJiYWdlIChhZHRzX2ZyYW1lX21wZWc0LCBzaXplb2YgKGFkdHNfZnJhbWVfbXBlZzQpLAorICAgICAgZ2FyYmFnZV9mcmFtZSwgc2l6ZW9mIChnYXJiYWdlX2ZyYW1lKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCisvKgorICogVGVzdCBpZiB0aGUgc3JjIGNhcHMgYXJlIHNldCBhY2NvcmRpbmcgdG8gc3RyZWFtIGZvcm1hdCAoTVBFRyB2ZXJzaW9uKS4KKyAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2VfYWR0c19kZXRlY3RfbXBlZ192ZXJzaW9uKQoreworICBnc3RfcGFyc2VyX3Rlc3Rfb3V0cHV0X2NhcHMgKGFkdHNfZnJhbWVfbXBlZzIsIHNpemVvZiAoYWR0c19mcmFtZV9tcGVnMiksCisgICAgICBOVUxMLAorICAgICAgU0lOS19DQVBTX01QRUcyCisgICAgICAiLCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpYWR0cywgbGV2ZWw9KHN0cmluZykyLCBwcm9maWxlPShzdHJpbmcpbGMiKTsKK30KKworR1NUX0VORF9URVNUOworCisvKgorICogVGVzdCBpZiB0aGUgcGFyc2VyIGNvcnJlY3RseSBoYW5kbGVzIHNob3J0IHJhdyBmcmFtZXMgYW5kIGRvZXNuJ3QKKyAqIGNvbmNhdGVuYXRlIHRoZW0uCisgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX3Jhd19zaG9ydCkKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoImFhY3BhcnNlIik7CisgIEdzdEJ1ZmZlciAqaW5fYnVmOworCisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgImRpc2FibGUtcGFzc3Rocm91Z2giLCBUUlVFLCBOVUxMKTsKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzX3N0ciAoaCwgU1JDX0NBUFNfUkFXKTsKKworICBpbl9idWYgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkX2Z1bGwgKEdTVF9NRU1PUllfRkxBR19SRUFET05MWSwKKyAgICAgIHJhd19mcmFtZV9zaG9ydCwgc2l6ZW9mIHJhd19mcmFtZV9zaG9ydCwgMCwgc2l6ZW9mIHJhd19mcmFtZV9zaG9ydCwKKyAgICAgIE5VTEwsIE5VTEwpOworCisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdzdF9idWZmZXJfcmVmIChpbl9idWYpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2hhcm5lc3NfYnVmZmVyc19yZWNlaXZlZCAoaCksIDEpOworCisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGluX2J1Zik7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9oYXJuZXNzX2J1ZmZlcnNfcmVjZWl2ZWQgKGgpLCAyKTsKKworICBnc3RfaGFybmVzc19wdXNoX2V2ZW50IChoLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9oYXJuZXNzX2J1ZmZlcnNfcmVjZWl2ZWQgKGgpLCAyKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworI2RlZmluZSBzdHJ1Y3R1cmVfZ2V0X2ludChzLGYpIFwKKyAgICAoZ192YWx1ZV9nZXRfaW50KGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlKHMsZikpKQorI2RlZmluZSBmYWlsX3VubGVzc19zdHJ1Y3R1cmVfZmllbGRfaW50X2VxdWFscyhzLGZpZWxkLG51bSkgXAorICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHN0cnVjdHVyZV9nZXRfaW50KHMsZmllbGQpLCBudW0pCisvKgorICogVGVzdCBpZiB0aGUgcGFyc2VyIGhhbmRsZXMgcmF3IHN0cmVhbSBhbmQgY29kZWNfZGF0YSBpbmZvIHByb3Blcmx5LgorICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV9oYW5kbGVfY29kZWNfZGF0YSkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0U3RydWN0dXJlICpzOworICBjb25zdCBnY2hhciAqc3RyZWFtX2Zvcm1hdDsKKworICAvKiBQdXNoIHJhbmRvbSBkYXRhLiBJdCBzaG91bGQgZ2V0IHRocm91Z2ggc2luY2UgdGhlIHBhcnNlciBzaG91bGQgYmUKKyAgICogaW5pdGlhbGl6ZWQgYmVjYXVzZSBpdCBnb3QgY29kZWNfZGF0YSBpbiB0aGUgY2FwcyAqLworICBjYXBzID0gZ3N0X3BhcnNlcl90ZXN0X2dldF9vdXRwdXRfY2FwcyAoTlVMTCwgMTAwLCBTUkNfQ0FQU19DREFUQSk7CisgIGZhaWxfdW5sZXNzIChjYXBzICE9IE5VTEwpOworCisgIC8qIENoZWNrIHRoYXQgdGhlIG5lZ290aWF0ZWQgY2FwcyBhcmUgYXMgZXhwZWN0ZWQgKi8KKyAgLyogV2hlbiBjb2RlY19kYXRhIGlzIHByZXNlbnQsIHBhcnNlciBhc3N1bWVzIHRoYXQgZGF0YSBpcyB2ZXJzaW9uIDQgKi8KKyAgR1NUX0xPRyAoImFhYyBvdXRwdXQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGZhaWxfdW5sZXNzIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiYXVkaW8vbXBlZyIpKTsKKyAgZmFpbF91bmxlc3Nfc3RydWN0dXJlX2ZpZWxkX2ludF9lcXVhbHMgKHMsICJtcGVndmVyc2lvbiIsIDQpOworICBmYWlsX3VubGVzc19zdHJ1Y3R1cmVfZmllbGRfaW50X2VxdWFscyAocywgImNoYW5uZWxzIiwgMik7CisgIGZhaWxfdW5sZXNzX3N0cnVjdHVyZV9maWVsZF9pbnRfZXF1YWxzIChzLCAicmF0ZSIsIDQ4MDAwKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAiY29kZWNfZGF0YSIpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAic3RyZWFtLWZvcm1hdCIpKTsKKyAgc3RyZWFtX2Zvcm1hdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgInN0cmVhbS1mb3JtYXQiKTsKKyAgZmFpbF91bmxlc3MgKHN0cmNtcCAoc3RyZWFtX2Zvcm1hdCwgInJhdyIpID09IDApOworCisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV9wcm94eV9jb25zdHJhaW50cykKK3sKKyAgR3N0Q2FwcyAqY2FwcywgKnJlc3VsdGNhcHM7CisgIEdzdEVsZW1lbnQgKnBhcnNlLCAqZmlsdGVyOworICBHc3RQYWQgKnNpbmtwYWQ7CisgIEdzdFN0cnVjdHVyZSAqczsKKworICBwYXJzZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImFhY3BhcnNlIiwgTlVMTCk7CisgIGZpbHRlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImNhcHNmaWx0ZXIiLCBOVUxMKTsKKworICAvKiBjb25zdHJhaW50IG9uIHJhdGUgYW5kIHZlcnNpb24gKi8KKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nICgiYXVkaW8vbXBlZyxtcGVndmVyc2lvbj0yLHJhdGU9NDQxMDAiKTsKKyAgZ19vYmplY3Rfc2V0IChmaWx0ZXIsICJjYXBzIiwgY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBnc3RfZWxlbWVudF9saW5rIChwYXJzZSwgZmlsdGVyKTsKKworICBzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHBhcnNlLCAic2luayIpOworICBjYXBzID0gZ3N0X3BhZF9xdWVyeV9jYXBzIChzaW5rcGFkLCBOVUxMKTsKKyAgR1NUX0xPRyAoImNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19nZXRfc2l6ZSAoY2FwcykgPT0gMSk7CisKKyAgLyogZ2V0Y2FwcyBzaG91bGQgcHJveHkgdGhlIHJhdGUgY29uc3RyYWludCAqLworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGZhaWxfdW5sZXNzIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiYXVkaW8vbXBlZyIpKTsKKyAgZmFpbF91bmxlc3Nfc3RydWN0dXJlX2ZpZWxkX2ludF9lcXVhbHMgKHMsICJyYXRlIiwgNDQxMDApOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgLyogc2hvdWxkIGFjY2VwdCB3aXRob3V0IHRoZSBjb25zdHJhaW50ICovCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoImF1ZGlvL21wZWcsbXBlZ3ZlcnNpb249MiIpOworICByZXN1bHRjYXBzID0gZ3N0X3BhZF9xdWVyeV9jYXBzIChzaW5rcGFkLCBjYXBzKTsKKyAgZmFpbF9pZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKHJlc3VsdGNhcHMpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHJlc3VsdGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgLyogc2hvdWxkIG5vdCBhY2NlcHQgd2l0aCBjb25mbGljdGluZyB2ZXJzaW9uICovCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoImF1ZGlvL21wZWcsbXBlZ3ZlcnNpb249NCIpOworICByZXN1bHRjYXBzID0gZ3N0X3BhZF9xdWVyeV9jYXBzIChzaW5rcGFkLCBjYXBzKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2lzX2VtcHR5IChyZXN1bHRjYXBzKSk7CisgIGdzdF9jYXBzX3VucmVmIChyZXN1bHRjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKGZpbHRlcik7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBhcnNlKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorYWFjcGFyc2Vfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiYWFjcGFyc2UiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIC8qIGluaXQgdGVzdCBjb250ZXh0ICovCisgIGN0eF9mYWN0b3J5ID0gImFhY3BhcnNlIjsKKyAgY3R4X3NpbmtfdGVtcGxhdGUgPSAmc2lua3RlbXBsYXRlOworICBjdHhfc3JjX3RlbXBsYXRlID0gJnNyY3RlbXBsYXRlOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICAvKiBBRElGIHRlc3RzICovCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9hZGlmX25vcm1hbCk7CisKKyAgLyogQURUUyB0ZXN0cyAqLworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2VfYWR0c19ub3JtYWwpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2VfYWR0c19kcmFpbl9zaW5nbGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2VfYWR0c19kcmFpbl9nYXJiYWdlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX2FkdHNfc3BsaXQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2VfYWR0c19za2lwX2dhcmJhZ2UpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2VfYWR0c19kZXRlY3RfbXBlZ192ZXJzaW9uKTsKKworICAvKiBSYXcgdGVzdHMgKi8KKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX3Jhd19zaG9ydCk7CisKKyAgLyogT3RoZXIgdGVzdHMgKi8KKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX2hhbmRsZV9jb2RlY19kYXRhKTsKKworICAvKiBjYXBzIHRlc3RzICovCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9wcm94eV9jb25zdHJhaW50cyk7CisKKyAgcmV0dXJuIHM7Cit9CisKKworLyoKKyAqIFRPRE86CisgKiAgIC0gQm90aCBwdXNoLSBhbmQgcHVsbC1tb2RlcyBuZWVkIHRvIGJlIHRlc3RlZAorICogICAgICAqIFB1bGwtbW9kZSAmIEVPUworICovCitHU1RfQ0hFQ0tfTUFJTiAoYWFjcGFyc2UpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvYWMzcGFyc2UuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2FjM3BhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJiZTU5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2FjM3BhcnNlLmMKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIGFjM3BhcnNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnRhY3Q6IFN0ZWZhbiBLb3N0IDxzdGVmYW4ua29zdEBub2tpYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgInBhcnNlci5oIgorCisjZGVmaW5lIFNSQ19DQVBTX1RNUEwgICAiYXVkaW8veC1hYzMsIGZyYW1lZD0oYm9vbGVhbilmYWxzZSIKKyNkZWZpbmUgU0lOS19DQVBTX1RNUEwgICJhdWRpby94LWFjMywgZnJhbWVkPShib29sZWFuKXRydWUiCisKK0dzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoU0lOS19DQVBTX1RNUEwpCisgICAgKTsKKworR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChTUkNfQ0FQU19UTVBMKQorICAgICk7CisKKy8qIHNvbWUgZGF0YSAqLworCitzdGF0aWMgZ3VpbnQ4IGFjM19mcmFtZVs1MTJdID0geworICAweDBiLCAweDc3LCAweGI2LCAweGE4LCAweDEwLCAweDQwLCAweDJmLCAweDg0LAorICAweDI5LCAweGNiLCAweGZlLCAweDc1LCAweDdjLCAweGY5LCAweGYzLCAweGU3LAorICAweGNmLCAweDlmLCAweDNlLCAweDdjLCAweGY5LCAweGYzLCAweGU3LCAweGNmLAorICAweDlmLCAweDNlLCAweDdjLCAweGY5LCAweGYzLCAweGU3LCAweGNmLCAweDlmLAorICAweDNlLCAweDdjLCAweGY5LCAweGYzLCAweGU3LCAweGNmLCAweDlmLCAweDNlLAorICAweDdjLCAweGY5LCAweGYzLCAweGU3LCAweGNmLCAweDlmLCAweDNlLCAweDdjLAorICAweGY5LCAweGYzLCAweGU3LCAweGNmLCAweDlmLCAweDNlLCAweDdjLCAweGY5LAorICAweGYzLCAweGU3LCAweGNmLCAweDlmLCAweDNlLCAweDdjLCAweGY5LCAweGYzLAorICAweGU3LCAweGNmLCAweDlmLCAweDNlLCAweDdjLCAweGY5LCAweGYzLCAweGU3LAorICAweGNmLCAweDlmLCAweDNlLCAweDMyLCAweGQzLCAweGZmLCAweGMwLCAweDA2LAorICAweGU5LCAweDQwLCAweDAwLCAweDZlLCAweDk0LCAweDAwLCAweDA2LCAweGU5LAorICAweDQwLCAweDAwLCAweDZlLCAweDk0LCAweDAwLCAweDA2LCAweGU5LCAweDQwLAorICAweDAwLCAweDZlLCAweDkwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorfTsKKworc3RhdGljIGd1aW50OCBnYXJiYWdlX2ZyYW1lW10gPSB7CisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYKK307CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2Vfbm9ybWFsKQoreworICBnc3RfcGFyc2VyX3Rlc3Rfbm9ybWFsIChhYzNfZnJhbWUsIHNpemVvZiAoYWMzX2ZyYW1lKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV9kcmFpbl9zaW5nbGUpCit7CisgIGdzdF9wYXJzZXJfdGVzdF9kcmFpbl9zaW5nbGUgKGFjM19mcmFtZSwgc2l6ZW9mIChhYzNfZnJhbWUpKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX2RyYWluX2dhcmJhZ2UpCit7CisgIGdzdF9wYXJzZXJfdGVzdF9kcmFpbl9nYXJiYWdlIChhYzNfZnJhbWUsIHNpemVvZiAoYWMzX2ZyYW1lKSwKKyAgICAgIGdhcmJhZ2VfZnJhbWUsIHNpemVvZiAoZ2FyYmFnZV9mcmFtZSkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2Vfc3BsaXQpCit7CisgIGdzdF9wYXJzZXJfdGVzdF9zcGxpdCAoYWMzX2ZyYW1lLCBzaXplb2YgKGFjM19mcmFtZSkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2Vfc2tpcF9nYXJiYWdlKQoreworICBnc3RfcGFyc2VyX3Rlc3Rfc2tpcF9nYXJiYWdlIChhYzNfZnJhbWUsIHNpemVvZiAoYWMzX2ZyYW1lKSwKKyAgICAgIGdhcmJhZ2VfZnJhbWUsIHNpemVvZiAoZ2FyYmFnZV9mcmFtZSkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2VfZGV0ZWN0X3N0cmVhbSkKK3sKKyAgZ3N0X3BhcnNlcl90ZXN0X291dHB1dF9jYXBzIChhYzNfZnJhbWUsIHNpemVvZiAoYWMzX2ZyYW1lKSwKKyAgICAgIE5VTEwsIFNJTktfQ0FQU19UTVBMICIsY2hhbm5lbHM9MSxyYXRlPTQ4MDAwLGFsaWdubWVudD1mcmFtZSIpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworc3RhdGljIFN1aXRlICoKK2FjM3BhcnNlX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImFjM3BhcnNlIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICAvKiBpbml0IHRlc3QgY29udGV4dCAqLworICBjdHhfZmFjdG9yeSA9ICJhYzNwYXJzZSI7CisgIGN0eF9zaW5rX3RlbXBsYXRlID0gJnNpbmt0ZW1wbGF0ZTsKKyAgY3R4X3NyY190ZW1wbGF0ZSA9ICZzcmN0ZW1wbGF0ZTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX25vcm1hbCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9kcmFpbl9zaW5nbGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2VfZHJhaW5fZ2FyYmFnZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9zcGxpdCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9za2lwX2dhcmJhZ2UpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2VfZGV0ZWN0X3N0cmVhbSk7CisKKyAgcmV0dXJuIHM7Cit9CisKKworLyoKKyAqIFRPRE86CisgKiAgIC0gQm90aCBwdXNoLSBhbmQgcHVsbC1tb2RlcyBuZWVkIHRvIGJlIHRlc3RlZAorICogICAgICAqIFB1bGwtbW9kZSAmIEVPUworICovCitHU1RfQ0hFQ0tfTUFJTiAoYWMzcGFyc2UpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvYWxwaGEuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2FscGhhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MwM2JjMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2FscGhhLmMKQEAgLTAsMCArMSwyNjUgQEAKKy8qIEdTdHJlYW1lciB1bml0IHRlc3QgZm9yIHRoZSBhbHBoYSBlbGVtZW50CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworCitHc3RQYWQgKnNyY3BhZCwgKnNpbmtwYWQ7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJBWVVWIikpCisgICAgKTsKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IEFZVVYsICIKKyAgICAgICAgICAgICJBUkdCLCBCR1JBLCBBQkdSLCBSR0JBLCBZNDQ0LCB4UkdCLCBCR1J4LCB4QkdSLCAiCisgICAgICAgICAgICAiUkdCeCwgUkdCLCBCR1IsIFk0MkIsIFlVWTIsIFlWWVUsIFVZVlksIEk0MjAsIFlWMTIsIFk0MUIgfSAiKSkKKyAgICApOworCisKK3R5cGVkZWYgZW51bQoreworICBGSUxMX0dSRUVOLAorICBGSUxMX0JMVUUKK30KK0ZpbGxDb2xvcjsKKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfYWxwaGEgKHZvaWQpCit7CisgIEdzdEVsZW1lbnQgKmFscGhhOworCisgIGFscGhhID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJhbHBoYSIpOworICBzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAoYWxwaGEsICZzcmN0ZW1wbGF0ZSk7CisgIHNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKGFscGhhLCAmc2lua3RlbXBsYXRlKTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc2lua3BhZCwgVFJVRSk7CisKKyAgcmV0dXJuIGFscGhhOworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF9hbHBoYSAoR3N0RWxlbWVudCAqIGFscGhhKQoreworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNpbmtwYWQsIEZBTFNFKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKGFscGhhKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChhbHBoYSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChhbHBoYSk7Cit9CisKKyNkZWZpbmUgV0lEVEggMworI2RlZmluZSBIRUlHSFQgNAorCitzdGF0aWMgR3N0Q2FwcyAqCitjcmVhdGVfY2Fwc19yZ2JhMzIgKHZvaWQpCit7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LXJhdyIsCisgICAgICAid2lkdGgiLCBHX1RZUEVfSU5ULCBXSURUSCwKKyAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBIRUlHSFQsCisgICAgICAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT04sIDAsIDEsCisgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIlJHQkEiLCBOVUxMKTsKKworICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitjcmVhdGVfYnVmZmVyX3JnYmEzMiAoRmlsbENvbG9yIGNvbG9yKQoreworICBndWludDggcmdiYTMyX2ltZ1tIRUlHSFQgKiBXSURUSCAqIDRdOworICBndWludDMyICpyZ2JhMzIgPSAoZ3VpbnQzMiAqKSByZ2JhMzJfaW1nOworCisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQzMiByZ2JhX2NvbDsKKyAgaW50IGk7CisKKyAgaWYgKGNvbG9yID09IEZJTExfR1JFRU4pCisgICAgcmdiYV9jb2wgPSAweGZmMDBmZjAwOyAgICAgIC8qIEdSRUVOICovCisgIGVsc2UKKyAgICByZ2JhX2NvbCA9IDB4ZmZmZjAwMDA7ICAgICAgLyogQkxVRSAqLworCisgIGZvciAoaSA9IDA7IGkgPCBIRUlHSFQgKiBXSURUSDsgaSsrKQorICAgIHJnYmEzMltpXSA9IHJnYmFfY29sOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoSEVJR0hUICogV0lEVEggKiA0KTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEV1JJVEUpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChtYXAuc2l6ZSwgc2l6ZW9mIChyZ2JhMzJfaW1nKSk7CisgIG1lbWNweSAobWFwLmRhdGEsIHJnYmEzMl9pbWcsIHNpemVvZiAocmdiYTMyX2ltZykpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9jaHJvbWFrZXlpbmcpCit7CisgIEdzdEVsZW1lbnQgKmFscGhhOworICBHc3RCdWZmZXIgKmluYnVmZmVyOworICBHc3RCdWZmZXIgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqaW5jYXBzOworICBndWludDggKmF5dXY7CisgIGd1aW50IG91dGxlbmd0aDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGludCBpOworCisgIGluY2FwcyA9IGNyZWF0ZV9jYXBzX3JnYmEzMiAoKTsKKworICBhbHBoYSA9IHNldHVwX2FscGhhICgpOworCisgIGdfb2JqZWN0X3NldCAoYWxwaGEsICJtZXRob2QiLCAxLCBOVUxMKTsgICAgICAvKiBDaHJvbWEta2V5aW5nIEdSRUVOICovCisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhbHBoYSwgR1NUX1NUQVRFX1BMQVlJTkcpLAorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChzcmNwYWQsIGFscGhhLCBpbmNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisKKyAgaW5idWZmZXIgPSBjcmVhdGVfYnVmZmVyX3JnYmEzMiAoRklMTF9HUkVFTik7CisgIEdTVF9ERUJVRyAoIkNyZWF0ZWQgYnVmZmVyIG9mICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMiLAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoaW5idWZmZXIpKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9wYWRfcHVzaCAoc3JjcGFkLCBpbmJ1ZmZlciksIEdTVF9GTE9XX09LKTsKKworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPT0gMSk7CisgIG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YTsKKyAgZmFpbF9pZiAob3V0YnVmZmVyID09IE5VTEwpOworICBmYWlsX3VubGVzcyAoR1NUX0lTX0JVRkZFUiAob3V0YnVmZmVyKSk7CisKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAob3V0YnVmZmVyLCAib3V0YnVmZmVyIiwgMSk7CisgIG91dGxlbmd0aCA9IFdJRFRIICogSEVJR0hUICogNDsgICAgICAgLyogb3V0cHV0IGlzIEFZVVYgKi8KKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobWFwLnNpemUsIG91dGxlbmd0aCk7CisKKyAgYXl1diA9IG1hcC5kYXRhOworCisgIC8qIGNoZWNrIGNocm9tYSBrZXlpbmcgR1JFRU4gKi8KKyAgZm9yIChpID0gMDsgaSA8IEhFSUdIVCAqIFdJRFRIOyBpICs9IDQpCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoYXl1dltpXSwgMHgwMCk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICBidWZmZXJzID0gZ19saXN0X3JlbW92ZSAoYnVmZmVycywgb3V0YnVmZmVyKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmZmVyKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGFscGhhLCBHU1RfU1RBVEVfTlVMTCksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hbHBoYSAoYWxwaGEpOworICBBU1NFUlRfQ0FQU19SRUZDT1VOVCAoaW5jYXBzLCAiaW5jYXBzIiwgMSk7CisgIGdzdF9jYXBzX3VucmVmIChpbmNhcHMpOworCit9CisKK0dTVF9FTkRfVEVTVDsKKworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2FscGhhKQoreworICBHc3RFbGVtZW50ICphbHBoYTsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlcjsKKyAgR3N0QnVmZmVyICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmluY2FwczsKKyAgZ3VpbnQ4ICpheXV2OworICBndWludCBvdXRsZW5ndGg7CisgIEdzdE1hcEluZm8gbWFwOworICBpbnQgaTsKKworICBpbmNhcHMgPSBjcmVhdGVfY2Fwc19yZ2JhMzIgKCk7CisKKyAgYWxwaGEgPSBzZXR1cF9hbHBoYSAoKTsKKworICBnX29iamVjdF9zZXQgKGFscGhhLCAiYWxwaGEiLCAwLjUsIE5VTEwpOyAgICAgLyogQWxwaGEgdmFsdWUgMC41ICovCisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhbHBoYSwgR1NUX1NUQVRFX1BMQVlJTkcpLAorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChzcmNwYWQsIGFscGhhLCBpbmNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisKKyAgaW5idWZmZXIgPSBjcmVhdGVfYnVmZmVyX3JnYmEzMiAoRklMTF9CTFVFKTsKKyAgR1NUX0RFQlVHICgiQ3JlYXRlZCBidWZmZXIgb2YgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyIsCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChpbmJ1ZmZlcikpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IHJlZmVyZW5jZSAqLworICBHU1RfREVCVUcgKCJwdXNoIGl0Iik7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9wYWRfcHVzaCAoc3JjcGFkLCBpbmJ1ZmZlciksIEdTVF9GTE9XX09LKTsKKyAgR1NUX0RFQlVHICgicHVzaGVkIGl0Iik7CisKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID09IDEpOworICBvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGE7CisgIGZhaWxfaWYgKG91dGJ1ZmZlciA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9JU19CVUZGRVIgKG91dGJ1ZmZlcikpOworCisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKG91dGJ1ZmZlciwgIm91dGJ1ZmZlciIsIDEpOworICBvdXRsZW5ndGggPSBXSURUSCAqIEhFSUdIVCAqIDQ7ICAgICAgIC8qIG91dHB1dCBpcyBBWVVWICovCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG1hcC5zaXplLCBvdXRsZW5ndGgpOworCisgIGF5dXYgPSBtYXAuZGF0YTsKKworICBmb3IgKGkgPSAwOyBpIDwgSEVJR0hUICogV0lEVEg7IGkgKz0gNCkKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChheXV2W2ldLCAweDdGKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIGJ1ZmZlcnMgPSBnX2xpc3RfcmVtb3ZlIChidWZmZXJzLCBvdXRidWZmZXIpOworICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWZmZXIpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYWxwaGEsIEdTVF9TVEFURV9OVUxMKSwKKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgLyogY2xlYW51cCAqLworICBHU1RfREVCVUcgKCJjbGVhbnVwIGFscGhhIik7CisgIGNsZWFudXBfYWxwaGEgKGFscGhhKTsKKyAgR1NUX0RFQlVHICgiY2xlYW51cCwgdW5yZWYgaW5jYXBzIik7CisgIEFTU0VSVF9DQVBTX1JFRkNPVU5UIChpbmNhcHMsICJpbmNhcHMiLCAxKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGluY2Fwcyk7CisKK30KKworR1NUX0VORF9URVNUOworCisKK3N0YXRpYyBTdWl0ZSAqCithbHBoYV9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJhbHBoYSIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9hbHBoYSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9jaHJvbWFrZXlpbmcpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoYWxwaGEpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvYWxwaGFjb2xvci5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYWxwaGFjb2xvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NDk2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hbHBoYWNvbG9yLmMKQEAgLTAsMCArMSwyODggQEAKKy8qIEdTdHJlYW1lciB1bml0IHRlc3QgZm9yIHRoZSBhbHBoYWNvbG9yIGVsZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKy8qIEZvciBlYXNlIG9mIHByb2dyYW1taW5nIHdlIHVzZSBnbG9iYWxzIHRvIGtlZXAgcmVmcyBmb3Igb3VyIGZsb2F0aW5nCisgKiBzcmMgYW5kIHNpbmsgcGFkcyB3ZSBjcmVhdGU7IG90aGVyd2lzZSB3ZSBhbHdheXMgaGF2ZSB0byBkbyBnZXRfcGFkLAorICogZ2V0X3BlZXIsIGFuZCB0aGVuIHJlbW92ZSByZWZlcmVuY2VzIGluIGV2ZXJ5IHRlc3QgZnVuY3Rpb24gKi8KK0dzdFBhZCAqbXlzcmNwYWQsICpteXNpbmtwYWQ7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJBWVVWIikpCisgICAgKTsKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IFJHQkEsIFJHQiB9IikpCisgICAgKTsKKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfYWxwaGFjb2xvciAodm9pZCkKK3sKKyAgR3N0RWxlbWVudCAqYWxwaGFjb2xvcjsKKworICBhbHBoYWNvbG9yID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJhbHBoYWNvbG9yIik7CisgIG15c3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKGFscGhhY29sb3IsICZzcmN0ZW1wbGF0ZSk7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAoYWxwaGFjb2xvciwgJnNpbmt0ZW1wbGF0ZSk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICByZXR1cm4gYWxwaGFjb2xvcjsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfYWxwaGFjb2xvciAoR3N0RWxlbWVudCAqIGFscGhhY29sb3IpCit7CisgIEdTVF9ERUJVRyAoImNsZWFuaW5nIHVwIik7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAoYWxwaGFjb2xvcik7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAoYWxwaGFjb2xvcik7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChhbHBoYWNvbG9yKTsKK30KKworI2RlZmluZSBXSURUSCAzCisjZGVmaW5lIEhFSUdIVCA0CisKK3N0YXRpYyBHc3RDYXBzICoKK2NyZWF0ZV9jYXBzX3JnYjI0ICh2b2lkKQoreworICBHc3RDYXBzICpjYXBzOworCisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1yYXciLAorICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgMywKKyAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCA0LAorICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLCAwLCAxLAorICAgICAgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJSR0IiLCBOVUxMKTsKKworICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIEdzdENhcHMgKgorY3JlYXRlX2NhcHNfcmdiYTMyICh2b2lkKQoreworICBHc3RDYXBzICpjYXBzOworCisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1yYXciLAorICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgMywKKyAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCA0LAorICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLCAwLCAxLAorICAgICAgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJSR0JBIiwgTlVMTCk7CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorY3JlYXRlX2J1ZmZlcl9yZ2IyNF8zeDQgKHZvaWQpCit7CisgIC8qIHN0cmlkZSBpcyByb3VuZGVkIHVwIHRvIG11bHRpcGxlIG9mIDQsIHNvIDMgYnl0ZXMgcGFkZGluZyBmb3IgZWFjaCByb3cgKi8KKyAgY29uc3QgZ3VpbnQ4IHJnYjI0XzN4NF9pbWdbSEVJR0hUICogR1NUX1JPVU5EX1VQXzQgKFdJRFRIICogMyldID0geworICAgIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHhmZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweGZmLCAweDAwLCAweGZmLCAweDAwLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKyAgfTsKKyAgZ3VpbnQgcm93c3RyaWRlID0gR1NUX1JPVU5EX1VQXzQgKFdJRFRIICogMyk7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RNYXBJbmZvIGluZm87CisKKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChIRUlHSFQgKiByb3dzdHJpZGUpOworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmaW5mbywgR1NUX01BUF9SRUFEV1JJVEUpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChpbmZvLnNpemUsIHNpemVvZiAocmdiMjRfM3g0X2ltZykpOworICBtZW1jcHkgKGluZm8uZGF0YSwgcmdiMjRfM3g0X2ltZywgc2l6ZW9mIChyZ2IyNF8zeDRfaW1nKSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmaW5mbyk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitjcmVhdGVfYnVmZmVyX3JnYmEzMl8zeDQgKHZvaWQpCit7CisgIC8qIHN0cmlkZSBpcyByb3VuZGVkIHVwIHRvIG11bHRpcGxlIG9mIDQsIHNvIDMgYnl0ZXMgcGFkZGluZyBmb3IgZWFjaCByb3cgKi8KKyAgLyogc2hvdWxkIGJlOiAgUkVEICAgICBCTFVFICAgIFdISVRFICAgIHdoZXJlICdub3RoaW5nJyBpcyBmdWxseSB0cmFuc3BhcmVudAorICAgKiAgICAgICAgICAgICBHUkVFTiAgIFJFRCAgICAgQkxVRSAgICAgYW5kIGFsbCBvdGhlciBjb2xvdXJzIGFyZSBmdWxseQorICAgKiAgICAgICAgICAgICBOT1RISU5HIEdSRUVOICAgUkVEICAgICAgb3BhcXVlLgorICAgKiAgICAgICAgICAgICBCTEFDSyAgIE5PVEhJTkcgR1JFRU4KKyAgICovCisgIGNvbnN0IGd1aW50OCByZ2JhMzJfM3g0X2ltZ1tIRUlHSFQgKiBXSURUSCAqIDRdID0geworICAgIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHgwMCwgMHhmZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZiwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweDAwLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZmYKKyAgfTsKKyAgZ3VpbnQgcm93c3RyaWRlID0gV0lEVEggKiA0OworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChIRUlHSFQgKiByb3dzdHJpZGUpOworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQURXUklURSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG1hcC5zaXplLCBzaXplb2YgKHJnYmEzMl8zeDRfaW1nKSk7CisgIG1lbWNweSAobWFwLmRhdGEsIHJnYmEzMl8zeDRfaW1nLCBzaXplb2YgKHJnYmEzMl8zeDRfaW1nKSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICByZXR1cm4gYnVmOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9yZ2IyNCkKK3sKKyAgR3N0RWxlbWVudCAqYWxwaGFjb2xvcjsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlcjsKKyAgR3N0Q2FwcyAqaW5jYXBzOworCisgIGluY2FwcyA9IGNyZWF0ZV9jYXBzX3JnYjI0ICgpOworICBhbHBoYWNvbG9yID0gc2V0dXBfYWxwaGFjb2xvciAoKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGFscGhhY29sb3IsIEdTVF9TVEFURV9QTEFZSU5HKSwKKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGFscGhhY29sb3IsIGluY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKworICBpbmJ1ZmZlciA9IGNyZWF0ZV9idWZmZXJfcmdiMjRfM3g0ICgpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IHJlZmVyZW5jZTsgdGhpcyBzaG91bGQgZXJyb3Igb3V0IHdpdGggYSBub3QtbmVnb3RpYXRlZAorICAgKiBlcnJvciwgYWxwaGFjb2xvciBzaG91bGQgb25seSBhY2NlcHQgUkdCQSBjYXBzLCBub3QgYnV0IHBsYWluIFJHQjI0IGNhcHMgKi8KKyAgR1NUX0RFQlVHICgicHVzaCBpdCIpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlciksCisgICAgICBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRCk7CisgIEdTVF9ERUJVRyAoInB1c2hlZCBpdCIpOworCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA9PSAwKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGFscGhhY29sb3IsIEdTVF9TVEFURV9OVUxMKSwKKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgLyogY2xlYW51cCAqLworICBHU1RfREVCVUcgKCJjbGVhbnVwIGFscGhhY29sb3IiKTsKKyAgY2xlYW51cF9hbHBoYWNvbG9yIChhbHBoYWNvbG9yKTsKKyAgR1NUX0RFQlVHICgiY2xlYW51cCwgdW5yZWYgaW5jYXBzIik7CisgIEFTU0VSVF9DQVBTX1JFRkNPVU5UIChpbmNhcHMsICJpbmNhcHMiLCAxKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGluY2Fwcyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogdGhlc2UgbWFjcm9zIGFzc3VtZSBXSURUSCBhbmQgSEVJR0hUIGlzIGZpeGVkIHRvIHdoYXQncyBkZWZpbmVkIGFib3ZlICovCisjZGVmaW5lIGZhaWxfdW5sZXNzX2F5dXZfcGl4ZWxfaGFzX2FscGhhKGF5dXYseCx5LGEpIFwKKyAgICB7IFwKKyAgICAgICAgZ3VpbnQ4ICpwaXhlbDsgXAorICAgICAgICBwaXhlbCA9ICgoZ3VpbnQ4KikoYXl1dikgKyAoKFdJRFRIICogNCkgKiAoeSkpICsgKCh4KSAqIDQpKTsgXAorICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChwaXhlbFswXSwgYSk7IFwKKyAgICB9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3JnYmEzMikKK3sKKyAgR3N0RWxlbWVudCAqYWxwaGFjb2xvcjsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlcjsKKyAgR3N0QnVmZmVyICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmluY2FwczsKKyAgZ3VpbnQ4ICpheXV2OworICBndWludCBvdXRsZW5ndGg7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGluY2FwcyA9IGNyZWF0ZV9jYXBzX3JnYmEzMiAoKTsKKyAgYWxwaGFjb2xvciA9IHNldHVwX2FscGhhY29sb3IgKCk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhbHBoYWNvbG9yLCBHU1RfU1RBVEVfUExBWUlORyksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhbHBoYWNvbG9yLCBpbmNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisKKyAgaW5idWZmZXIgPSBjcmVhdGVfYnVmZmVyX3JnYmEzMl8zeDQgKCk7CisgIEdTVF9ERUJVRyAoIkNyZWF0ZWQgYnVmZmVyIG9mICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMiLAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoaW5idWZmZXIpKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSByZWZlcmVuY2UgKi8KKyAgR1NUX0RFQlVHICgicHVzaCBpdCIpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlciksIEdTVF9GTE9XX09LKTsKKyAgR1NUX0RFQlVHICgicHVzaGVkIGl0Iik7CisKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID09IDEpOworICBvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGE7CisgIGZhaWxfaWYgKG91dGJ1ZmZlciA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9JU19CVUZGRVIgKG91dGJ1ZmZlcikpOworCisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKG91dGJ1ZmZlciwgIm91dGJ1ZmZlciIsIDEpOworICBvdXRsZW5ndGggPSBXSURUSCAqIEhFSUdIVCAqIDQ7ICAgICAgIC8qIG91dHB1dCBpcyBBWVVWICovCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG1hcC5zaXplLCBvdXRsZW5ndGgpOworCisgIGF5dXYgPSBtYXAuZGF0YTsKKworICAvKiBjaGVjayBhbHBoYSB2YWx1ZXMgKDB4MDAgPSB0b3RhbGx5IHRyYW5zcGFyZW50LCAweGZmID0gdG90YWxseSBvcGFxdWUpICovCisgIGZhaWxfdW5sZXNzX2F5dXZfcGl4ZWxfaGFzX2FscGhhIChheXV2LCAwLCAwLCAweGZmKTsKKyAgZmFpbF91bmxlc3NfYXl1dl9waXhlbF9oYXNfYWxwaGEgKGF5dXYsIDEsIDAsIDB4ZmYpOworICBmYWlsX3VubGVzc19heXV2X3BpeGVsX2hhc19hbHBoYSAoYXl1diwgMiwgMCwgMHhmZik7CisgIGZhaWxfdW5sZXNzX2F5dXZfcGl4ZWxfaGFzX2FscGhhIChheXV2LCAwLCAxLCAweGZmKTsKKyAgZmFpbF91bmxlc3NfYXl1dl9waXhlbF9oYXNfYWxwaGEgKGF5dXYsIDEsIDEsIDB4ZmYpOworICBmYWlsX3VubGVzc19heXV2X3BpeGVsX2hhc19hbHBoYSAoYXl1diwgMiwgMSwgMHhmZik7CisgIGZhaWxfdW5sZXNzX2F5dXZfcGl4ZWxfaGFzX2FscGhhIChheXV2LCAwLCAyLCAweDAwKTsKKyAgZmFpbF91bmxlc3NfYXl1dl9waXhlbF9oYXNfYWxwaGEgKGF5dXYsIDEsIDIsIDB4ZmYpOworICBmYWlsX3VubGVzc19heXV2X3BpeGVsX2hhc19hbHBoYSAoYXl1diwgMiwgMiwgMHhmZik7CisgIGZhaWxfdW5sZXNzX2F5dXZfcGl4ZWxfaGFzX2FscGhhIChheXV2LCAwLCAzLCAweGZmKTsKKyAgZmFpbF91bmxlc3NfYXl1dl9waXhlbF9oYXNfYWxwaGEgKGF5dXYsIDEsIDMsIDB4MDApOworICBmYWlsX3VubGVzc19heXV2X3BpeGVsX2hhc19hbHBoYSAoYXl1diwgMiwgMywgMHhmZik7CisKKyAgLyogd2UgZG9uJ3QgY2hlY2sgdGhlIFlVViBkYXRhLCBiZWNhdXNlIGFwcGFyZW50bHkgcmVzdWx0cyBkaWZmZXIgc2xpZ2h0bHkKKyAgICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UgcnVuIGluIHZhbGdyaW5kIG9yIG5vdCAqLworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgYnVmZmVycyA9IGdfbGlzdF9yZW1vdmUgKGJ1ZmZlcnMsIG91dGJ1ZmZlcik7CisgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1ZmZlcik7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhbHBoYWNvbG9yLCBHU1RfU1RBVEVfTlVMTCksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIC8qIGNsZWFudXAgKi8KKyAgR1NUX0RFQlVHICgiY2xlYW51cCBhbHBoYWNvbG9yIik7CisgIGNsZWFudXBfYWxwaGFjb2xvciAoYWxwaGFjb2xvcik7CisgIEdTVF9ERUJVRyAoImNsZWFudXAsIHVucmVmIGluY2FwcyIpOworICBBU1NFUlRfQ0FQU19SRUZDT1VOVCAoaW5jYXBzLCAiaW5jYXBzIiwgMSk7CisgIGdzdF9jYXBzX3VucmVmIChpbmNhcHMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworc3RhdGljIFN1aXRlICoKK2FscGhhY29sb3Jfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiYWxwaGFjb2xvciIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9yZ2IyNCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9yZ2JhMzIpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoYWxwaGFjb2xvcik7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9hbXJwYXJzZS5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYW1ycGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWZmZmEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYW1ycGFyc2UuYwpAQCAtMCwwICsxLDMwNiBAQAorLyoKKyAqIEdTdHJlYW1lcgorICoKKyAqIHVuaXQgdGVzdCBmb3IgYW1ycGFyc2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdDogU3RlZmFuIEtvc3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSAicGFyc2VyLmgiCisKKyNkZWZpbmUgU1JDX0NBUFNfTkIgICJhdWRpby94LWFtci1uYi1zaCIKKyNkZWZpbmUgU1JDX0NBUFNfV0IgICJhdWRpby94LWFtci13Yi1zaCIKKyNkZWZpbmUgU1JDX0NBUFNfQU5ZICJBTlkiCisKKyNkZWZpbmUgU0lOS19DQVBTX05CICAiYXVkaW8vQU1SLCByYXRlPTgwMDAgLCBjaGFubmVscz0xIgorI2RlZmluZSBTSU5LX0NBUFNfV0IgICJhdWRpby9BTVItV0IsIHJhdGU9MTYwMDAgLCBjaGFubmVscz0xIgorI2RlZmluZSBTSU5LX0NBUFNfQU5ZICJBTlkiCisKKyNkZWZpbmUgQU1SX0ZSQU1FX0RVUkFUSU9OIChHU1RfU0VDT05ELzUwKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlX25iID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChTSU5LX0NBUFNfTkIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZV93YiA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoU0lOS19DQVBTX1dCKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZV9uYiA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFNSQ19DQVBTX05CKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZV93YiA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFNSQ19DQVBTX1dCKQorICAgICk7CisKK3N0YXRpYyBHc3RDYXBzICppbnB1dF9jYXBzID0gTlVMTDsKKworLyogc29tZSBkYXRhICovCisKK3N0YXRpYyBndWludDggZnJhbWVfZGF0YV9uYltdID0geworICAweDBjLCAweDU2LCAweDNjLCAweDUyLCAweGUwLCAweDYxLCAweGJjLCAweDQ1LAorICAweDBmLCAweDk4LCAweDJlLCAweDAxLCAweDQyLCAweDAyCit9OworCitzdGF0aWMgZ3VpbnQ4IGZyYW1lX2RhdGFfd2JbXSA9IHsKKyAgMHgwOCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwKKyAgMHgwNywgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwKKyAgMHgwZiwgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNgorfTsKKworc3RhdGljIGd1aW50OCBmcmFtZV9oZHJfbmJbXSA9IHsKKyAgJyMnLCAnIScsICdBJywgJ00nLCAnUicsICdcbicKK307CisKK3N0YXRpYyBndWludDggZnJhbWVfaGRyX3diW10gPSB7CisgICcjJywgJyEnLCAnQScsICdNJywgJ1InLCAnLScsICdXJywgJ0InLCAnXG4nCit9OworCitzdGF0aWMgZ3VpbnQ4IGdhcmJhZ2VfZnJhbWVbXSA9IHsKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZgorfTsKKworc3RhdGljIHZvaWQKK3NldHVwX2Ftcm5iICh2b2lkKQoreworICBjdHhfZmFjdG9yeSA9ICJhbXJwYXJzZSI7CisgIGN0eF9zaW5rX3RlbXBsYXRlID0gJnNpbmt0ZW1wbGF0ZV9uYjsKKyAgY3R4X3NyY190ZW1wbGF0ZSA9ICZzcmN0ZW1wbGF0ZV9uYjsKKyAgaW5wdXRfY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChTUkNfQ0FQU19OQik7CisgIGdfYXNzZXJ0IChpbnB1dF9jYXBzKTsKKyAgY3R4X2lucHV0X2NhcHMgPSBpbnB1dF9jYXBzOworfQorCitzdGF0aWMgdm9pZAorc2V0dXBfYW1yd2IgKHZvaWQpCit7CisgIGN0eF9mYWN0b3J5ID0gImFtcnBhcnNlIjsKKyAgY3R4X3NpbmtfdGVtcGxhdGUgPSAmc2lua3RlbXBsYXRlX3diOworICBjdHhfc3JjX3RlbXBsYXRlID0gJnNyY3RlbXBsYXRlX3diOworICBpbnB1dF9jYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKFNSQ19DQVBTX1dCKTsKKyAgZ19hc3NlcnQgKGlucHV0X2NhcHMpOworICBjdHhfaW5wdXRfY2FwcyA9IGlucHV0X2NhcHM7Cit9CisKK3N0YXRpYyB2b2lkCit0ZWFyZG93biAodm9pZCkKK3sKKyAgZ3N0X2NhcHNfdW5yZWYgKGlucHV0X2NhcHMpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV9uYl9ub3JtYWwpCit7CisgIGdzdF9wYXJzZXJfdGVzdF9ub3JtYWwgKGZyYW1lX2RhdGFfbmIsIHNpemVvZiAoZnJhbWVfZGF0YV9uYikpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2VfbmJfZHJhaW5fc2luZ2xlKQoreworICBnc3RfcGFyc2VyX3Rlc3RfZHJhaW5fc2luZ2xlIChmcmFtZV9kYXRhX25iLCBzaXplb2YgKGZyYW1lX2RhdGFfbmIpKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX25iX2RyYWluX2dhcmJhZ2UpCit7CisgIGdzdF9wYXJzZXJfdGVzdF9kcmFpbl9nYXJiYWdlIChmcmFtZV9kYXRhX25iLCBzaXplb2YgKGZyYW1lX2RhdGFfbmIpLAorICAgICAgZ2FyYmFnZV9mcmFtZSwgc2l6ZW9mIChnYXJiYWdlX2ZyYW1lKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV9uYl9zcGxpdCkKK3sKKyAgZ3N0X3BhcnNlcl90ZXN0X3NwbGl0IChmcmFtZV9kYXRhX25iLCBzaXplb2YgKGZyYW1lX2RhdGFfbmIpKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX25iX3NraXBfZ2FyYmFnZSkKK3sKKyAgZ3N0X3BhcnNlcl90ZXN0X3NraXBfZ2FyYmFnZSAoZnJhbWVfZGF0YV9uYiwgc2l6ZW9mIChmcmFtZV9kYXRhX25iKSwKKyAgICAgIGdhcmJhZ2VfZnJhbWUsIHNpemVvZiAoZ2FyYmFnZV9mcmFtZSkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2VfbmJfZGV0ZWN0X3N0cmVhbSkKK3sKKyAgR3N0UGFyc2VyVGVzdCBwdGVzdDsKKyAgR3N0Q2FwcyAqb2xkX2N0eF9jYXBzOworCisgIC8qIG5vIGlucHV0IGNhcHMsIG92ZXJyaWRlIGN0eCAqLworICBvbGRfY3R4X2NhcHMgPSBjdHhfaW5wdXRfY2FwczsKKyAgY3R4X2lucHV0X2NhcHMgPSBOVUxMOworCisgIC8qIEFNUi1OQiBoZWFkZXIgKi8KKyAgZ3N0X3BhcnNlcl90ZXN0X2luaXQgKCZwdGVzdCwgZnJhbWVfaGRyX25iLCBzaXplb2YgKGZyYW1lX2hkcl9uYiksIDEpOworICAvKiB3ZWxsLCBubyBnYXJiYWdlLCBmb2xsb3dlZCBieSByZWFsIGRhdGEgKi8KKyAgcHRlc3Quc2VyaWVzWzJdLmRhdGEgPSBmcmFtZV9kYXRhX25iOworICBwdGVzdC5zZXJpZXNbMl0uc2l6ZSA9IHNpemVvZiAoZnJhbWVfZGF0YV9uYik7CisgIHB0ZXN0LnNlcmllc1syXS5udW0gPSAxMDsKKyAgLyogaGVhZGVyIGdldHMgZHJvcHBlZCwgc28gLi4uICovCisgIC8qIGJ1ZmZlciBjb3VudCB3aWxsIG5vdCBtYXRjaCAqLworICBwdGVzdC5mcmFtZWQgPSBGQUxTRTsKKyAgLyogdG90YWwgc2l6ZSBhIGJpdCBsZXNzICovCisgIHB0ZXN0LmRyb3BwZWQgPSBzaXplb2YgKGZyYW1lX2hkcl9uYik7CisKKyAgLyogQ2hlY2sgdGhhdCB0aGUgbmVnb3RpYXRlZCBjYXBzIGFyZSBhcyBleHBlY3RlZCAqLworICBwdGVzdC5zaW5rX2NhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoU0lOS19DQVBTX05CKTsKKworICBnc3RfcGFyc2VyX3Rlc3RfcnVuICgmcHRlc3QsIE5VTEwpOworCisgIGdzdF9jYXBzX3VucmVmIChwdGVzdC5zaW5rX2NhcHMpOworCisgIGN0eF9pbnB1dF9jYXBzID0gb2xkX2N0eF9jYXBzOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2Vfd2Jfbm9ybWFsKQoreworICBnc3RfcGFyc2VyX3Rlc3Rfbm9ybWFsIChmcmFtZV9kYXRhX3diLCBzaXplb2YgKGZyYW1lX2RhdGFfd2IpKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX3diX2RyYWluX3NpbmdsZSkKK3sKKyAgZ3N0X3BhcnNlcl90ZXN0X2RyYWluX3NpbmdsZSAoZnJhbWVfZGF0YV93Yiwgc2l6ZW9mIChmcmFtZV9kYXRhX3diKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV93Yl9kcmFpbl9nYXJiYWdlKQoreworICBnc3RfcGFyc2VyX3Rlc3RfZHJhaW5fZ2FyYmFnZSAoZnJhbWVfZGF0YV93Yiwgc2l6ZW9mIChmcmFtZV9kYXRhX3diKSwKKyAgICAgIGdhcmJhZ2VfZnJhbWUsIHNpemVvZiAoZ2FyYmFnZV9mcmFtZSkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2Vfd2Jfc3BsaXQpCit7CisgIGdzdF9wYXJzZXJfdGVzdF9zcGxpdCAoZnJhbWVfZGF0YV93Yiwgc2l6ZW9mIChmcmFtZV9kYXRhX3diKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV93Yl9za2lwX2dhcmJhZ2UpCit7CisgIGdzdF9wYXJzZXJfdGVzdF9za2lwX2dhcmJhZ2UgKGZyYW1lX2RhdGFfd2IsIHNpemVvZiAoZnJhbWVfZGF0YV93YiksCisgICAgICBnYXJiYWdlX2ZyYW1lLCBzaXplb2YgKGdhcmJhZ2VfZnJhbWUpKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX3diX2RldGVjdF9zdHJlYW0pCit7CisgIEdzdFBhcnNlclRlc3QgcHRlc3Q7CisgIEdzdENhcHMgKm9sZF9jdHhfY2FwczsKKworICAvKiBubyBpbnB1dCBjYXBzLCBvdmVycmlkZSBjdHggKi8KKyAgb2xkX2N0eF9jYXBzID0gY3R4X2lucHV0X2NhcHM7CisgIGN0eF9pbnB1dF9jYXBzID0gTlVMTDsKKworICAvKiBBTVItV0IgaGVhZGVyICovCisgIGdzdF9wYXJzZXJfdGVzdF9pbml0ICgmcHRlc3QsIGZyYW1lX2hkcl93Yiwgc2l6ZW9mIChmcmFtZV9oZHJfd2IpLCAxKTsKKyAgLyogd2VsbCwgbm8gZ2FyYmFnZSwgZm9sbG93ZWQgYnkgcmVhbCBkYXRhICovCisgIHB0ZXN0LnNlcmllc1syXS5kYXRhID0gZnJhbWVfZGF0YV93YjsKKyAgcHRlc3Quc2VyaWVzWzJdLnNpemUgPSBzaXplb2YgKGZyYW1lX2RhdGFfd2IpOworICBwdGVzdC5zZXJpZXNbMl0ubnVtID0gMTA7CisgIC8qIGhlYWRlciBnZXRzIGRyb3BwZWQsIHNvIC4uLiAqLworICAvKiBidWZmZXIgY291bnQgd2lsbCBub3QgbWF0Y2ggKi8KKyAgcHRlc3QuZnJhbWVkID0gRkFMU0U7CisgIC8qIHRvdGFsIHNpemUgYSBiaXQgbGVzcyAqLworICBwdGVzdC5kcm9wcGVkID0gc2l6ZW9mIChmcmFtZV9oZHJfd2IpOworCisgIC8qIENoZWNrIHRoYXQgdGhlIG5lZ290aWF0ZWQgY2FwcyBhcmUgYXMgZXhwZWN0ZWQgKi8KKyAgcHRlc3Quc2lua19jYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKFNJTktfQ0FQU19XQik7CisKKyAgZ3N0X3BhcnNlcl90ZXN0X3J1biAoJnB0ZXN0LCBOVUxMKTsKKworICBnc3RfY2Fwc191bnJlZiAocHRlc3Quc2lua19jYXBzKTsKKworICBjdHhfaW5wdXRfY2FwcyA9IG9sZF9jdHhfY2FwczsKK30KKworR1NUX0VORF9URVNUOworCisvKgorICogVE9ETzoKKyAqICAgLSBCb3RoIHB1c2gtIGFuZCBwdWxsLW1vZGVzIG5lZWQgdG8gYmUgdGVzdGVkCisgKiAgICAgICogUHVsbC1tb2RlICYgRU9TCisgKi8KKworc3RhdGljIFN1aXRlICoKK2FtcnBhcnNlX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImFtcnBhcnNlIik7CisgIFRDYXNlICp0Y19jaGFpbjsKKworICAvKiBBTVItTkIgdGVzdHMgKi8KKyAgdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJhbXJuYiIpOworICB0Y2FzZV9hZGRfY2hlY2tlZF9maXh0dXJlICh0Y19jaGFpbiwgc2V0dXBfYW1ybmIsIHRlYXJkb3duKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX25iX25vcm1hbCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9uYl9kcmFpbl9zaW5nbGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2VfbmJfZHJhaW5fZ2FyYmFnZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9uYl9zcGxpdCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9uYl9kZXRlY3Rfc3RyZWFtKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX25iX3NraXBfZ2FyYmFnZSk7CisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworCisgIC8qIEFNUi1XQiB0ZXN0cyAqLworICB0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImFtcndiIik7CisgIHRjYXNlX2FkZF9jaGVja2VkX2ZpeHR1cmUgKHRjX2NoYWluLCBzZXR1cF9hbXJ3YiwgdGVhcmRvd24pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2Vfd2Jfbm9ybWFsKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX3diX2RyYWluX3NpbmdsZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV93Yl9kcmFpbl9nYXJiYWdlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX3diX3NwbGl0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX3diX2RldGVjdF9zdHJlYW0pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2Vfd2Jfc2tpcF9nYXJiYWdlKTsKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChhbXJwYXJzZSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2FwZXYybXV4LmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hcGV2Mm11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMTkwN2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hcGV2Mm11eC5jCkBAIC0wLDAgKzEsNDExIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIHRoZSB0YWdsaWItYmFzZWQgYXBldjJtdXggZWxlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIFRFU1RfQVJUSVNUICAgICAgICAgICAiQXIgVFwzMDNcMjU1c3QiCisjZGVmaW5lIFRFU1RfVElUTEUgICAgICAgICAgICAiTVwzMDNcMjc0bGxlcm1pbGNoISIKKyNkZWZpbmUgVEVTVF9BTEJVTSAgICAgICAgICAgICJCb29tIgorI2RlZmluZSBURVNUX0RBVEUgICAgICAgICAgICAgZ19kYXRlX25ld19kbXkoMSwxLDIwMDYpCisjZGVmaW5lIFRFU1RfVFJBQ0tfTlVNQkVSICAgICA3CisjZGVmaW5lIFRFU1RfVFJBQ0tfQ09VTlQgICAgICAxOQorI2RlZmluZSBURVNUX1RSQUNLX0dBSU4gICAgICAgMS40NQorI2RlZmluZSBURVNUX0FMQlVNX0dBSU4gICAgICAgMC43OAorCisvKiBmb3IgZHVtbXkgbXAzIGZyYW1lIHNpemVkIE1QM19GUkFNRV9TSVpFIGJ5dGVzLAorICogc3RhcnQ6IGZmIGZiIGIwIDQ0IDAwIDAwIDA4IDAwICAwMCA0YiAwMCAwMCAwMCAwMCAwMCAwMCAqLworc3RhdGljIGNvbnN0IGd1aW50OCBtcDNfZHVtbXloZHJbXSA9IHsgMHhmZiwgMHhmYiwgMHhiMCwgMHg0NCwgMHgwMCwgMHgwMCwKKyAgMHgwOCwgMHgwMCwgMHg0YiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMAorfTsKKworI2RlZmluZSBNUDNfRlJBTUVfU0laRSA2MjYKKworc3RhdGljIEdzdFRhZ0xpc3QgKgordGVzdF90YWdsaWJfYXBldjJtdXhfY3JlYXRlX3RhZ3MgKGd1aW50MzIgbWFzaykKK3sKKyAgR3N0VGFnTGlzdCAqdGFnczsKKworICB0YWdzID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKworICBpZiAobWFzayAmICgxIDw8IDApKSB7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFncywgR1NUX1RBR19NRVJHRV9LRUVQLAorICAgICAgICBHU1RfVEFHX0FSVElTVCwgVEVTVF9BUlRJU1QsIE5VTEwpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMSkpIHsKKyAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdzLCBHU1RfVEFHX01FUkdFX0tFRVAsCisgICAgICAgIEdTVF9UQUdfVElUTEUsIFRFU1RfVElUTEUsIE5VTEwpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMikpIHsKKyAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdzLCBHU1RfVEFHX01FUkdFX0tFRVAsCisgICAgICAgIEdTVF9UQUdfQUxCVU0sIFRFU1RfQUxCVU0sIE5VTEwpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMykpIHsKKyAgICBHRGF0ZSAqZGF0ZTsKKworICAgIGRhdGUgPSBURVNUX0RBVEU7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFncywgR1NUX1RBR19NRVJHRV9LRUVQLCBHU1RfVEFHX0RBVEUsIGRhdGUsIE5VTEwpOworICAgIGdfZGF0ZV9mcmVlIChkYXRlKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDQpKSB7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFncywgR1NUX1RBR19NRVJHRV9LRUVQLAorICAgICAgICBHU1RfVEFHX1RSQUNLX05VTUJFUiwgVEVTVF9UUkFDS19OVU1CRVIsIE5VTEwpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgNSkpIHsKKyAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdzLCBHU1RfVEFHX01FUkdFX0tFRVAsCisgICAgICAgIEdTVF9UQUdfVFJBQ0tfQ09VTlQsIFRFU1RfVFJBQ0tfQ09VTlQsIE5VTEwpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgNikpIHsKKyAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdzLCBHU1RfVEFHX01FUkdFX0tFRVAsCisgICAgICAgIEdTVF9UQUdfVFJBQ0tfR0FJTiwgVEVTVF9UUkFDS19HQUlOLCBOVUxMKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDcpKSB7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFncywgR1NUX1RBR19NRVJHRV9LRUVQLAorICAgICAgICBHU1RfVEFHX0FMQlVNX0dBSU4sIFRFU1RfQUxCVU1fR0FJTiwgTlVMTCk7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCA4KSkgeworICB9CisgIGlmIChtYXNrICYgKDEgPDwgOSkpIHsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDEwKSkgeworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMTEpKSB7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCAxMikpIHsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDEzKSkgeworICB9CisgIHJldHVybiB0YWdzOworfQorCitzdGF0aWMgdm9pZAordGVzdF90YWdsaWJfYXBldjJtdXhfY2hlY2tfdGFncyAoR3N0VGFnTGlzdCAqIHRhZ3MsIGd1aW50MzIgbWFzaykKK3sKKyAgaWYgKG1hc2sgJiAoMSA8PCAwKSkgeworICAgIGdjaGFyICpzID0gTlVMTDsKKworICAgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZyAodGFncywgR1NUX1RBR19BUlRJU1QsICZzKSk7CisgICAgZmFpbF91bmxlc3MgKGdfc3RyX2VxdWFsIChzLCBURVNUX0FSVElTVCkpOworICAgIGdfZnJlZSAocyk7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCAxKSkgeworICAgIGdjaGFyICpzID0gTlVMTDsKKworICAgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZyAodGFncywgR1NUX1RBR19USVRMRSwgJnMpKTsKKyAgICBmYWlsX3VubGVzcyAoZ19zdHJfZXF1YWwgKHMsIFRFU1RfVElUTEUpKTsKKyAgICBnX2ZyZWUgKHMpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMikpIHsKKyAgICBnY2hhciAqcyA9IE5VTEw7CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ3MsIEdTVF9UQUdfQUxCVU0sICZzKSk7CisgICAgZmFpbF91bmxlc3MgKGdfc3RyX2VxdWFsIChzLCBURVNUX0FMQlVNKSk7CisgICAgZ19mcmVlIChzKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDMpKSB7CisgICAgR0RhdGUgKnNob3VsZGJlLCAqZGF0ZSA9IE5VTEw7CisKKyAgICBzaG91bGRiZSA9IFRFU1RfREFURTsKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9kYXRlICh0YWdzLCBHU1RfVEFHX0RBVEUsICZkYXRlKSk7CisgICAgZmFpbF91bmxlc3MgKGdfZGF0ZV9jb21wYXJlIChzaG91bGRiZSwgZGF0ZSkgPT0gMCk7CisgICAgZ19kYXRlX2ZyZWUgKHNob3VsZGJlKTsKKyAgICBnX2RhdGVfZnJlZSAoZGF0ZSk7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCA0KSkgeworICAgIGd1aW50IG51bTsKKworICAgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X3VpbnQgKHRhZ3MsIEdTVF9UQUdfVFJBQ0tfTlVNQkVSLCAmbnVtKSk7CisgICAgZmFpbF91bmxlc3MgKG51bSA9PSBURVNUX1RSQUNLX05VTUJFUik7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCA1KSkgeworICAgIGd1aW50IGNvdW50OworCisgICAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfdWludCAodGFncywgR1NUX1RBR19UUkFDS19DT1VOVCwgJmNvdW50KSk7CisgICAgZmFpbF91bmxlc3MgKGNvdW50ID09IFRFU1RfVFJBQ0tfQ09VTlQpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgNikpIHsKKyAgICBnZG91YmxlIGdhaW47CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKHRhZ3MsIEdTVF9UQUdfVFJBQ0tfR0FJTiwgJmdhaW4pKTsKKyAgICBmYWlsX3VubGVzcyAoZ2FpbiA9PSBURVNUX1RSQUNLX0dBSU4pOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgNykpIHsKKyAgICBnZG91YmxlIGdhaW47CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKHRhZ3MsIEdTVF9UQUdfQUxCVU1fR0FJTiwgJmdhaW4pKTsKKyAgICBmYWlsX3VubGVzcyAoZ2FpbiA9PSBURVNUX0FMQlVNX0dBSU4pOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgOCkpIHsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDkpKSB7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCAxMCkpIHsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDExKSkgeworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMTIpKSB7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCAxMykpIHsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZmlsbF9tcDNfYnVmZmVyIChHc3RFbGVtZW50ICogZmFrZXNyYywgR3N0QnVmZmVyICogYnVmLCBHc3RQYWQgKiBwYWQsCisgICAgZ3VpbnQ2NCAqIHBfb2Zmc2V0KQoreworICBnc2l6ZSBzaXplOworCisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpOworCisgIGZhaWxfdW5sZXNzIChzaXplID09IE1QM19GUkFNRV9TSVpFKTsKKworICBHU1RfTE9HICgiZmlsbGluZyBidWZmZXIgd2l0aCBmYWtlIG1wMyBkYXRhLCBvZmZzZXQgPSAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgKnBfb2Zmc2V0KTsKKworICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgbXAzX2R1bW15aGRyLCBzaXplb2YgKG1wM19kdW1teWhkcikpOworCisjaWYgMAorICAvKiBjYW4ndCB1c2UgZ3N0X2J1ZmZlcl9zZXRfY2FwcygpIGhlcmUgYmVjYXVzZSB0aGUgbWV0YWRhdGEgaXNuJ3Qgd3JpdGFibGUKKyAgICogYmVjYXVzZSBvZiB0aGUgZXh0cmEgcmVmY291bnRzIHRha2VuIGJ5IHRoZSBzaWduYWwgZW1pc3Npb24gbWVjaGFuaXNtOworICAgKiB3ZSBrbm93IGl0J3MgZmluZSB0byB1c2UgR1NUX0JVRkZFUl9DQVBTKCkgaGVyZSB0aG91Z2ggKi8KKyAgR1NUX0JVRkZFUl9DQVBTIChidWYpID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL21wZWciLCAibXBlZ3ZlcnNpb24iLAorICAgICAgR19UWVBFX0lOVCwgMSwgImxheWVyIiwgR19UWVBFX0lOVCwgMywgTlVMTCk7CisjZW5kaWYKKworICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSA9ICpwX29mZnNldDsKKyAgKnBfb2Zmc2V0ICs9IHNpemU7Cit9CisKK3N0YXRpYyB2b2lkCitnb3RfYnVmZmVyIChHc3RFbGVtZW50ICogZmFrZXNpbmssIEdzdEJ1ZmZlciAqIGJ1ZiwgR3N0UGFkICogcGFkLAorICAgIEdzdEJ1ZmZlciAqKiBwX2J1ZikKK3sKKyAgZ2ludDY0IG9mZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgb2ZmID0gR1NUX0JVRkZFUl9PRkZTRVQgKGJ1Zik7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICBHU1RfTE9HICgic2l6ZT0lIiBHX0dTSVpFX0ZPUk1BVCAiLCBvZmZzZXQ9JSIgR19HSU5UNjRfRk9STUFULCBtYXAuc2l6ZSwgb2ZmKTsKKworICBmYWlsX3VubGVzcyAoR1NUX0JVRkZFUl9PRkZTRVRfSVNfVkFMSUQgKGJ1ZikpOworCisgIGlmICgqcF9idWYgPT0gTlVMTCB8fCAob2ZmICsgbWFwLnNpemUpID4gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoKnBfYnVmKSkgeworICAgIEdzdEJ1ZmZlciAqbmV3YnVmOworCisgICAgLyogbm90IHZlcnkgZWxlZ2FudCwgYnV0IHdobyBjYXJlcyAqLworICAgIG5ld2J1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAob2ZmICsgbWFwLnNpemUpOworICAgIGlmICgqcF9idWYpIHsKKyAgICAgIEdzdE1hcEluZm8gcG1hcDsKKworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKCpwX2J1ZiwgJnBtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICBnc3RfYnVmZmVyX2ZpbGwgKG5ld2J1ZiwgMCwgcG1hcC5kYXRhLCBwbWFwLnNpemUpOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoKnBfYnVmLCAmcG1hcCk7CisgICAgfQorICAgIGdzdF9idWZmZXJfZmlsbCAobmV3YnVmLCBvZmYsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgaWYgKCpwX2J1ZikKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKCpwX2J1Zik7CisgICAgKnBfYnVmID0gbmV3YnVmOworICB9IGVsc2UgeworICAgIGdzdF9idWZmZXJfZmlsbCAoKnBfYnVmLCBvZmYsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfdGFnbGliX2FwZXYybXV4X2NoZWNrX291dHB1dF9idWZmZXIgKEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50IG9mZjsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBnX2Fzc2VydCAobWFwLnNpemUgJSBNUDNfRlJBTUVfU0laRSA9PSAwKTsKKworICBmb3IgKG9mZiA9IDA7IG9mZiA8IG1hcC5zaXplOyBvZmYgKz0gTVAzX0ZSQU1FX1NJWkUpIHsKKyAgICBmYWlsX3VubGVzcyAobWVtY21wIChtYXAuZGF0YSArIG9mZiwgbXAzX2R1bW15aGRyLAorICAgICAgICAgICAgc2l6ZW9mIChtcDNfZHVtbXloZHIpKSA9PSAwKTsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworfQorCitzdGF0aWMgdm9pZAordGVzdF90YWdsaWJfYXBldjJtdXhfd2l0aF90YWdzIChHc3RUYWdMaXN0ICogdGFncywgZ3VpbnQzMiBtYXNrKQoreworICBHc3RNZXNzYWdlICptc2c7CisgIEdzdFRhZ0xpc3QgKnRhZ3NfcmVhZCA9IE5VTEw7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lLCAqYXBldjJtdXgsICphcGVkZW11eCwgKmZha2VzcmMsICpmYWtlc2luazsKKyAgR3N0QnVzICpidXM7CisgIGd1aW50NjQgb2Zmc2V0OworICBHc3RCdWZmZXIgKm91dGJ1ZiA9IE5VTEw7CisKKyAgcGlwZWxpbmUgPSBnc3RfcGlwZWxpbmVfbmV3ICgicGlwZWxpbmUiKTsKKyAgZ19hc3NlcnQgKHBpcGVsaW5lICE9IE5VTEwpOworCisgIGZha2VzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc3JjIiwgImZha2VzcmMiKTsKKyAgZ19hc3NlcnQgKGZha2VzcmMgIT0gTlVMTCk7CisKKyAgYXBldjJtdXggPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhcGV2Mm11eCIsICJhcGV2Mm11eCIpOworICBnX2Fzc2VydCAoYXBldjJtdXggIT0gTlVMTCk7CisKKyAgYXBlZGVtdXggPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhcGVkZW11eCIsICJhcGVkZW11eCIpOworICBnX2Fzc2VydCAoYXBlZGVtdXggIT0gTlVMTCk7CisKKyAgZmFrZXNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsICJmYWtlc2luayIpOworICBnX2Fzc2VydCAoZmFrZXNpbmsgIT0gTlVMTCk7CisKKyAgLyogc2V0IHVwIHNpbmsgKi8KKyAgb3V0YnVmID0gTlVMTDsKKyAgZ19vYmplY3Rfc2V0IChmYWtlc2luaywgInNpZ25hbC1oYW5kb2ZmcyIsIFRSVUUsIE5VTEwpOworICBnX3NpZ25hbF9jb25uZWN0IChmYWtlc2luaywgImhhbmRvZmYiLCBHX0NBTExCQUNLIChnb3RfYnVmZmVyKSwgJm91dGJ1Zik7CisKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgZmFrZXNyYyk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIGFwZXYybXV4KTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgYXBlZGVtdXgpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBmYWtlc2luayk7CisKKyAgZ3N0X3RhZ19zZXR0ZXJfbWVyZ2VfdGFncyAoR1NUX1RBR19TRVRURVIgKGFwZXYybXV4KSwgdGFncywKKyAgICAgIEdTVF9UQUdfTUVSR0VfQVBQRU5EKTsKKworICBnc3RfZWxlbWVudF9saW5rX21hbnkgKGZha2VzcmMsIGFwZXYybXV4LCBhcGVkZW11eCwgZmFrZXNpbmssIE5VTEwpOworCisgIC8qIHNldCB1cCBzb3VyY2UgKi8KKyAgZ19vYmplY3Rfc2V0IChmYWtlc3JjLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgImNhbi1hY3RpdmF0ZS1wdWxsIiwgRkFMU0UsCisgICAgICAiZmlsbHR5cGUiLCAyLCAic2l6ZXR5cGUiLCAyLCAic2l6ZW1heCIsIE1QM19GUkFNRV9TSVpFLAorICAgICAgIm51bS1idWZmZXJzIiwgMTYsIE5VTEwpOworCisgIG9mZnNldCA9IDA7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGZha2VzcmMsICJoYW5kb2ZmIiwgR19DQUxMQkFDSyAoZmlsbF9tcDNfYnVmZmVyKSwgJm9mZnNldCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChwaXBlbGluZSwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAtMSkgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBidXMgPSBnc3RfcGlwZWxpbmVfZ2V0X2J1cyAoR1NUX1BJUEVMSU5FIChwaXBlbGluZSkpOworCisgIEdTVF9MT0cgKCJXYWl0aW5nIGZvciB0YWcgLi4uIik7CisgIG1zZyA9CisgICAgICBnc3RfYnVzX3BvbGwgKGJ1cywgR1NUX01FU1NBR0VfVEFHIHwgR1NUX01FU1NBR0VfRU9TIHwgR1NUX01FU1NBR0VfRVJST1IsCisgICAgICAtMSk7CisgIGlmIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VSUk9SKSB7CisgICAgR0Vycm9yICplcnI7CisgICAgZ2NoYXIgKmRiZzsKKworICAgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChtc2csICZlcnIsICZkYmcpOworICAgIGdfcHJpbnRlcnIgKCJFUlJPUiBmcm9tIGVsZW1lbnQgJXM6ICVzXG4lc1xuIiwKKyAgICAgICAgR1NUX09CSkVDVF9OQU1FIChtc2ctPnNyYyksIGVyci0+bWVzc2FnZSwgR1NUX1NUUl9OVUxMIChkYmcpKTsKKyAgICBnX2Vycm9yX2ZyZWUgKGVycik7CisgICAgZ19mcmVlIChkYmcpOworICB9IGVsc2UgaWYgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRU9TKSB7CisgICAgZ19wcmludGVyciAoIkVPUyBtZXNzYWdlLCBidXQgd2VyZSB3YWl0aW5nIGZvciBUQUdTIVxuIik7CisgIH0KKyAgZmFpbF91bmxlc3MgKG1zZy0+dHlwZSA9PSBHU1RfTUVTU0FHRV9UQUcpOworCisgIGdzdF9tZXNzYWdlX3BhcnNlX3RhZyAobXNnLCAmdGFnc19yZWFkKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisKKyAgR1NUX0xPRyAoIkdvdCB0YWdzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgdGFnc19yZWFkKTsKKyAgdGVzdF90YWdsaWJfYXBldjJtdXhfY2hlY2tfdGFncyAodGFnc19yZWFkLCBtYXNrKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdzX3JlYWQpOworCisgIEdTVF9MT0cgKCJXYWl0aW5nIGZvciBFT1MgLi4uIik7CisgIG1zZyA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9FT1MgfCBHU1RfTUVTU0FHRV9FUlJPUiwgLTEpOworICBpZiAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSA9PSBHU1RfTUVTU0FHRV9FUlJPUikgeworICAgIEdFcnJvciAqZXJyOworICAgIGdjaGFyICpkYmc7CisKKyAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobXNnLCAmZXJyLCAmZGJnKTsKKyAgICBnX3ByaW50ZXJyICgiRVJST1IgZnJvbSBlbGVtZW50ICVzOiAlc1xuJXNcbiIsCisgICAgICAgIEdTVF9PQkpFQ1RfTkFNRSAobXNnLT5zcmMpLCBlcnItPm1lc3NhZ2UsIEdTVF9TVFJfTlVMTCAoZGJnKSk7CisgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICAgIGdfZnJlZSAoZGJnKTsKKyAgfQorICBmYWlsX3VubGVzcyAobXNnLT50eXBlID09IEdTVF9NRVNTQUdFX0VPUyk7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgR1NUX0xPRyAoIkdvdCBFT1MsIHNodXR0aW5nIGRvd24gLi4uIik7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworCisgIHRlc3RfdGFnbGliX2FwZXYybXV4X2NoZWNrX291dHB1dF9idWZmZXIgKG91dGJ1Zik7CisgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1Zik7CisKKyAgR1NUX0xPRyAoIkRvbmUiKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYXBldjJtdXgpCit7CisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisgIGdpbnQgaTsKKworICBnX3JhbmRvbV9zZXRfc2VlZCAoMjQ3MTY2Mjk1KTsKKworICAvKiBpbnRlcm5hbCBjb25zaXN0ZW5jeSBjaGVjayAqLworICB0YWdzID0gdGVzdF90YWdsaWJfYXBldjJtdXhfY3JlYXRlX3RhZ3MgKDB4RkZGRkZGRkYpOworICB0ZXN0X3RhZ2xpYl9hcGV2Mm11eF9jaGVja190YWdzICh0YWdzLCAweEZGRkZGRkZGKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdzKTsKKworICAvKiBub3cgdGhlIHJlYWwgdGVzdHMgKi8KKyAgZm9yIChpID0gMDsgaSA8IDUwOyArK2kpIHsKKyAgICBndWludDMyIG1hc2s7CisKKyAgICBtYXNrID0gZ19yYW5kb21faW50ICgpOworICAgIEdTVF9MT0cgKCJ0YWcgbWFzayA9ICUwOHggKGk9JWQpIiwgbWFzaywgaSk7CisKKyAgICBpZiAobWFzayA9PSAwKQorICAgICAgY29udGludWU7CisKKyAgICAvKiBjcmVhdGUgdGFncyAqLworICAgIHRhZ3MgPSB0ZXN0X3RhZ2xpYl9hcGV2Mm11eF9jcmVhdGVfdGFncyAobWFzayk7CisgICAgR1NUX0xPRyAoInRhZ3MgZm9yIG1hc2sgJTA4eCA9ICUiIEdTVF9QVFJfRk9STUFULCBtYXNrLCB0YWdzKTsKKworICAgIC8qIGRvdWJsZS1jaGVjayBmb3IgaW50ZXJuYWwgY29uc2lzdGVuY3kgKi8KKyAgICB0ZXN0X3RhZ2xpYl9hcGV2Mm11eF9jaGVja190YWdzICh0YWdzLCBtYXNrKTsKKworICAgIC8qIHRlc3Qgd2l0aCBwaXBlbGluZSAqLworICAgIHRlc3RfdGFnbGliX2FwZXYybXV4X3dpdGhfdGFncyAodGFncywgbWFzayk7CisKKyAgICAvKiBmcmVlIHRhZ3MgKi8KKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ3MpOworICB9Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK2FwZXYybXV4X3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImFwZXYybXV4Iik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2FwZXYybXV4KTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGFwZXYybXV4KTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2FzcGVjdHJhdGlvY3JvcC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYXNwZWN0cmF0aW9jcm9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNkNmZiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2FzcGVjdHJhdGlvY3JvcC5jCkBAIC0wLDAgKzEsMTc1IEBACisvKiBHU3RyZWFtZXIgdW5pdCB0ZXN0IGZvciB0aGUgYXNwZWN0cmF0aW9jcm9wIGVsZW1lbnQKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisKKyNkZWZpbmUgQVNQRUNUX1JBVElPX0NST1BfQ0FQUyAgICAgICAgICAgICAgICAgICAgICBcCisgIEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IFJHQngsIHhSR0IsIEJHUngsIHhCR1IsICIgXAorICAgICAgIlJHQkEsIEFSR0IsIEJHUkEsIEFCR1IsIFJHQiwgQkdSLCBBWVVWLCAiICAgIFwKKyAgICAgICJZVVkyLCBZVllVLCBVWVZZLCBHUkFZOCwgSTQyMCwgWVYxMiwgUkdCMTYsICIgXAorICAgICAgIlJHQjE1IH0iKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChBU1BFQ1RfUkFUSU9fQ1JPUF9DQVBTKQorICAgICk7CisKK3N0YXRpYyB2b2lkCitjaGVja19hc3BlY3RyYXRpb2Nyb3AgKGNvbnN0IGdjaGFyICogaW5fc3RyaW5nLCBjb25zdCBnY2hhciAqIG91dF9zdHJpbmcsCisgICAgZ2ludCBpbl9zaXplLCBnaW50IG91dF9zaXplLCBnaW50IGFyX24sIGdpbnQgYXJfZCkKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudDsKKyAgR3N0UGFkICpwYWRfcGVlcjsKKyAgR3N0UGFkICpzaW5rX3BhZCA9IE5VTEw7CisgIEdzdFBhZCAqc3JjX3BhZDsKKyAgR3N0QnVmZmVyICpuZXc7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBHc3RCdWZmZXIgKmJ1ZmZlcl9vdXQ7CisgIEdzdENhcHMgKmluY2FwczsKKyAgR3N0Q2FwcyAqb3V0Y2FwczsKKworICBpbmNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoaW5fc3RyaW5nKTsKKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChpbl9zaXplKTsKKyAgb3V0Y2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChvdXRfc3RyaW5nKTsKKyAgYnVmZmVyX291dCA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAob3V0X3NpemUpOworCisgIC8qIGNoZWNrIHRoYXQgdGhlcmUgYXJlIG5vIGJ1ZmZlcnMgd2FpdGluZyAqLworICBnc3RfY2hlY2tfZHJvcF9idWZmZXJzICgpOworCisgIC8qIGNyZWF0ZSB0aGUgZWxlbWVudCAqLworICBlbGVtZW50ID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJhc3BlY3RyYXRpb2Nyb3AiKTsKKworICAvKiBzZXQgdGhlIHJlcXVlc3RlZCBhc3BlY3QgcmF0aW8gKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZWxlbWVudCksICJhc3BlY3QtcmF0aW8iLCBhcl9uLCBhcl9kLCBOVUxMKTsKKworICAvKiBjcmVhdGUgdGhlIHNyYyBwYWQgKi8KKyAgc3JjX3BhZCA9IGdzdF9wYWRfbmV3IChOVUxMLCBHU1RfUEFEX1NSQyk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc3JjX3BhZCwgVFJVRSk7CisgIEdTVF9ERUJVRyAoInNldHRpbmcgY2FwcyAlcyAlIiBHU1RfUFRSX0ZPUk1BVCwgaW5fc3RyaW5nLCBpbmNhcHMpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChzcmNfcGFkLCBlbGVtZW50LCBpbmNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisKKyAgcGFkX3BlZXIgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoZWxlbWVudCwgInNpbmsiKTsKKyAgZmFpbF9pZiAocGFkX3BlZXIgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKHNyY19wYWQsIHBhZF9wZWVyKSA9PSBHU1RfUEFEX0xJTktfT0ssCisgICAgICAiQ291bGQgbm90IGxpbmsgc291cmNlIGFuZCAlcyBzaW5rIHBhZHMiLCBHU1RfRUxFTUVOVF9OQU1FIChlbGVtZW50KSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZF9wZWVyKTsKKworICAvKiBjcmVhdGUgdGhlIHNpbmsgcGFkICovCisgIHBhZF9wZWVyID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGVsZW1lbnQsICJzcmMiKTsKKyAgc2lua19wYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNpbmt0ZW1wbGF0ZSwgInNpbmsiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAocGFkX3BlZXIsIHNpbmtfcGFkKSA9PSBHU1RfUEFEX0xJTktfT0ssCisgICAgICAiQ291bGQgbm90IGxpbmsgc2luayBhbmQgJXMgc291cmNlIHBhZHMiLCBHU1RfRUxFTUVOVF9OQU1FIChlbGVtZW50KSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZF9wZWVyKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHNpbmtfcGFkLCBnc3RfY2hlY2tfY2hhaW5fZnVuYyk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc2lua19wYWQsIFRSVUUpOworCisgIC8qIGNvbmZpZ3VyZSB0aGUgc2luayBwYWQgKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKHNyY19wYWQsIGJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0ssCisgICAgICAiRmFpbGVkIHRvIHB1c2ggYnVmZmVyIik7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsCisgICAgICAgICAgR1NUX1NUQVRFX05VTEwpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywgImNvdWxkIG5vdCBzZXQgdG8gbnVsbCIpOworCisgIC8qIGNoZWNrIHRoZSByZXN1bHQgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID09IDEpOworICBuZXcgPSBHU1RfQlVGRkVSIChidWZmZXJzLT5kYXRhKTsKKyAgYnVmZmVycyA9IGdfbGlzdF9yZW1vdmUgKGJ1ZmZlcnMsIG5ldyk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXJfb3V0KSA9PSBnc3RfYnVmZmVyX2dldF9zaXplIChuZXcpLAorICAgICAgInNpemUgb2YgdGhlIGJ1ZmZlcnMgYXJlIG5vdCB0aGUgc2FtZSIpOworICB7CisgICAgR3N0Q2FwcyAqc2lua3BhZF9jYXBzOworCisgICAgc2lua3BhZF9jYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChzaW5rX3BhZCk7CisKKyAgICBnc3RfY2hlY2tfY2Fwc19lcXVhbCAoc2lua3BhZF9jYXBzLCBvdXRjYXBzKTsKKworICAgIGdzdF9jYXBzX3VucmVmIChzaW5rcGFkX2NhcHMpOworICB9CisgIGdzdF9idWZmZXJfdW5yZWYgKG5ldyk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcl9vdXQpOworICBnc3RfY2Fwc191bnJlZiAob3V0Y2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChpbmNhcHMpOworCisgIC8qIHRlYXJkb3duIHRoZSBlbGVtZW50IGFuZCBwYWRzICovCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc3JjX3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAoZWxlbWVudCk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc2lua19wYWQsIEZBTFNFKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChlbGVtZW50KTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGVsZW1lbnQpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ub19jcm9wcGluZykKK3sKKyAgY2hlY2tfYXNwZWN0cmF0aW9jcm9wCisgICAgICAoInZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylZVVkyLCB3aWR0aD0oaW50KTMyMCwgaGVpZ2h0PShpbnQpMjQwLCBmcmFtZXJhdGU9KGZyYWN0aW9uKTMwLzEiLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylZVVkyLCB3aWR0aD0oaW50KTMyMCwgaGVpZ2h0PShpbnQpMjQwLCBmcmFtZXJhdGU9KGZyYWN0aW9uKTMwLzEiLAorICAgICAgMTUzNjAwLCAxNTM2MDAsIDQsIDMpOworICBjaGVja19hc3BlY3RyYXRpb2Nyb3AKKyAgICAgICgidmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVlVWTIsIHdpZHRoPShpbnQpMzIwLCBoZWlnaHQ9KGludCkzMjAsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pMzAvMSwgcGl4ZWwtYXNwZWN0LXJhdGlvPShmcmFjdGlvbik0LzMiLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylZVVkyLCB3aWR0aD0oaW50KTMyMCwgaGVpZ2h0PShpbnQpMzIwLCBmcmFtZXJhdGU9KGZyYWN0aW9uKTMwLzEsIHBpeGVsLWFzcGVjdC1yYXRpbz0oZnJhY3Rpb24pNC8zIiwKKyAgICAgIDIwNDgwMCwgMjA0ODAwLCA0LCAzKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9hdXRvY3JvcHBpbmcpCit7CisgIGNoZWNrX2FzcGVjdHJhdGlvY3JvcAorICAgICAgKCJ2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpWVVZMiwgd2lkdGg9KGludCkzMjAsIGhlaWdodD0oaW50KTI0MCwgZnJhbWVyYXRlPShmcmFjdGlvbikzMC8xLCBwaXhlbC1hc3BlY3QtcmF0aW89KGZyYWN0aW9uKTQvMyIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVlVWTIsIHdpZHRoPShpbnQpMjQwLCBoZWlnaHQ9KGludCkyNDAsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pMzAvMSwgcGl4ZWwtYXNwZWN0LXJhdGlvPShmcmFjdGlvbik0LzMiLAorICAgICAgMTUzNjAwLCAxMTUyMDAsIDQsIDMpOworCisgIGNoZWNrX2FzcGVjdHJhdGlvY3JvcAorICAgICAgKCJ2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpWVVZMiwgd2lkdGg9KGludCkzMjAsIGhlaWdodD0oaW50KTI0MCwgZnJhbWVyYXRlPShmcmFjdGlvbikzMC8xLCBwaXhlbC1hc3BlY3QtcmF0aW89KGZyYWN0aW9uKTE2LzkiLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylZVVkyLCB3aWR0aD0oaW50KTE4MCwgaGVpZ2h0PShpbnQpMjQwLCBmcmFtZXJhdGU9KGZyYWN0aW9uKTMwLzEsIHBpeGVsLWFzcGVjdC1yYXRpbz0oZnJhY3Rpb24pMTYvOSIsCisgICAgICAxNTM2MDAsIDg2NDAwLCA0LCAzKTsKKworICBjaGVja19hc3BlY3RyYXRpb2Nyb3AKKyAgICAgICgidmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVlVWTIsIHdpZHRoPShpbnQpMzIwLCBoZWlnaHQ9KGludCkyNDAsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pMzAvMSwgcGl4ZWwtYXNwZWN0LXJhdGlvPShmcmFjdGlvbikxNi8xNSIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVlVWTIsIHdpZHRoPShpbnQpMzIwLCBoZWlnaHQ9KGludCkxOTIsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pMzAvMSwgcGl4ZWwtYXNwZWN0LXJhdGlvPShmcmFjdGlvbikxNi8xNSIsCisgICAgICAxNTM2MDAsIDEyMjg4MCwgMTYsIDkpOworCit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK2FzcGVjdHJhdGlvY3JvcF9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJhc3BlY3RyYXRpb2Nyb3AiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfbm9fY3JvcHBpbmcpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYXV0b2Nyb3BwaW5nKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGFzcGVjdHJhdGlvY3JvcCk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2FtcGxpZnkuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvYW1wbGlmeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZTNjMmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2FtcGxpZnkuYwpAQCAtMCwwICsxLDQ2NyBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciBhdWRpb2FtcGxpZnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIEdyZWF0bHkgYmFzZWQgb24gdGhlIGF1ZGlvcGFub3JhbWEgdW5pdCB0ZXN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworZ2Jvb2xlYW4gaGF2ZV9lb3MgPSBGQUxTRTsKKworLyogRm9yIGVhc2Ugb2YgcHJvZ3JhbW1pbmcgd2UgdXNlIGdsb2JhbHMgdG8ga2VlcCByZWZzIGZvciBvdXIgZmxvYXRpbmcKKyAqIHNyYyBhbmQgc2luayBwYWRzIHdlIGNyZWF0ZTsgb3RoZXJ3aXNlIHdlIGFsd2F5cyBoYXZlIHRvIGRvIGdldF9wYWQsCisgKiBnZXRfcGVlciwgYW5kIHRoZW4gcmVtb3ZlIHJlZmVyZW5jZXMgaW4gZXZlcnkgdGVzdCBmdW5jdGlvbiAqLworR3N0UGFkICpteXNyY3BhZCwgKm15c2lua3BhZDsKKworCisjZGVmaW5lIEFNUExJRllfQ0FQU19TVFJJTkcgICAgXAorICAgICJhdWRpby94LXJhdywgIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiICAgICAgICAgICAgICBcCisgICAgInJhdGUgPSAoaW50KSA0NDEwMCwgIiAgICAgICAgICAgICAgXAorICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiAgIFwKKyAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUoUzE2KQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgIE1BWCBdLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKFMxNikpKTsKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxLCAgTUFYIF0sICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoUzE2KSkpOworCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF9hbXBsaWZ5ICh2b2lkKQoreworICBHc3RFbGVtZW50ICphbXBsaWZ5OworCisgIEdTVF9ERUJVRyAoInNldHVwX2FtcGxpZnkiKTsKKyAgYW1wbGlmeSA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgiYXVkaW9hbXBsaWZ5Iik7CisgIG15c3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKGFtcGxpZnksICZzcmN0ZW1wbGF0ZSk7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAoYW1wbGlmeSwgJnNpbmt0ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgcmV0dXJuIGFtcGxpZnk7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX2FtcGxpZnkgKEdzdEVsZW1lbnQgKiBhbXBsaWZ5KQoreworICBHU1RfREVCVUcgKCJjbGVhbnVwX2FtcGxpZnkiKTsKKworICBnX2xpc3RfZm9yZWFjaCAoYnVmZmVycywgKEdGdW5jKSBnc3RfbWluaV9vYmplY3RfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIEZBTFNFKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKGFtcGxpZnkpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKGFtcGxpZnkpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAoYW1wbGlmeSk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3Bhc3N0aHJvdWdoKQoreworICBHc3RFbGVtZW50ICphbXBsaWZ5OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnaW50MTYgaW5bNl0gPSB7IDI0NTc2LCAtMTYzODQsIDI1NiwgLTEyOCwgMCwgLTI0NTc2IH07CisgIGdpbnQxNiByZXNbNl07CisKKyAgYW1wbGlmeSA9IHNldHVwX2FtcGxpZnkgKCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGFtcGxpZnksCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFNUExJRllfQ0FQU19TVFJJTkcpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYW1wbGlmeSwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGluYnVmZmVyID0KKyAgICAgIGdzdF9idWZmZXJfbmV3X3dyYXBwZWRfZnVsbCAoR1NUX01FTU9SWV9GTEFHX1JFQURPTkxZLCBpbiwgMTIsIDAsIDEyLAorICAgICAgTlVMTCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoaW5idWZmZXIsIDAsIGluLCAxMikgPT0gMCk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGJ1dCBpdCBlbmRzIHVwIGJlaW5nIGNvbGxlY3RlZCBvbiB0aGUgZ2xvYmFsIGJ1ZmZlciBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZXh0cmFjdCAob3V0YnVmZmVyLCAwLCByZXMsIDEyKSA9PSAxMik7CisgIEdTVF9JTkZPCisgICAgICAoImV4cGVjdGVkICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkIHJlYWwgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQiLAorICAgICAgaW5bMF0sIGluWzFdLCBpblsyXSwgaW5bM10sIGluWzRdLCBpbls1XSwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdLAorICAgICAgcmVzWzRdLCByZXNbNV0pOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgMCwgaW4sIDEyKSA9PSAwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYW1wbGlmeSAoYW1wbGlmeSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfemVybykKK3sKKyAgR3N0RWxlbWVudCAqYW1wbGlmeTsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2ludDE2IGluWzZdID0geyAyNDU3NiwgLTE2Mzg0LCAyNTYsIC0xMjgsIDAsIC0yNDU3NiB9OworICBnaW50MTYgb3V0WzZdID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisgIGdpbnQxNiByZXNbNl07CisKKyAgYW1wbGlmeSA9IHNldHVwX2FtcGxpZnkgKCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGFtcGxpZnkpLCAiYW1wbGlmaWNhdGlvbiIsIDAuMCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGFtcGxpZnksCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFNUExJRllfQ0FQU19TVFJJTkcpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYW1wbGlmeSwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGluYnVmZmVyID0KKyAgICAgIGdzdF9idWZmZXJfbmV3X3dyYXBwZWRfZnVsbCAoR1NUX01FTU9SWV9GTEFHX1JFQURPTkxZLCBpbiwgMTIsIDAsIDEyLAorICAgICAgTlVMTCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoaW5idWZmZXIsIDAsIGluLCAxMikgPT0gMCk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9leHRyYWN0IChvdXRidWZmZXIsIDAsIHJlcywgMTIpID09IDEyKTsKKyAgR1NUX0lORk8KKyAgICAgICgiZXhwZWN0ZWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQgcmVhbCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCIsCisgICAgICBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10sIG91dFs0XSwgb3V0WzVdLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLAorICAgICAgcmVzWzNdLCByZXNbNF0sIHJlc1s1XSk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAob3V0YnVmZmVyLCAwLCBvdXQsIDEyKSA9PSAwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYW1wbGlmeSAoYW1wbGlmeSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfMDUwX2NsaXApCit7CisgIEdzdEVsZW1lbnQgKmFtcGxpZnk7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdpbnQxNiBpbls2XSA9IHsgMjQ1NzYsIC0xNjM4NCwgMjU2LCAtMTI4LCAwLCAtMjQ1NzYgfTsKKyAgZ2ludDE2IG91dFs2XSA9IHsgMTIyODgsIC04MTkyLCAxMjgsIC02NCwgMCwgLTEyMjg4IH07CisgIGdpbnQxNiByZXNbNl07CisKKyAgYW1wbGlmeSA9IHNldHVwX2FtcGxpZnkgKCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGFtcGxpZnkpLCAiYW1wbGlmaWNhdGlvbiIsIDAuNSwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGFtcGxpZnksCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFNUExJRllfQ0FQU19TVFJJTkcpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYW1wbGlmeSwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGluYnVmZmVyID0KKyAgICAgIGdzdF9idWZmZXJfbmV3X3dyYXBwZWRfZnVsbCAoR1NUX01FTU9SWV9GTEFHX1JFQURPTkxZLCBpbiwgMTIsIDAsIDEyLAorICAgICAgTlVMTCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoaW5idWZmZXIsIDAsIGluLCAxMikgPT0gMCk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9leHRyYWN0IChvdXRidWZmZXIsIDAsIHJlcywgMTIpID09IDEyKTsKKyAgR1NUX0lORk8KKyAgICAgICgiZXhwZWN0ZWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQgcmVhbCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCIsCisgICAgICBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10sIG91dFs0XSwgb3V0WzVdLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLAorICAgICAgcmVzWzNdLCByZXNbNF0sIHJlc1s1XSk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAob3V0YnVmZmVyLCAwLCBvdXQsIDEyKSA9PSAwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYW1wbGlmeSAoYW1wbGlmeSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfMjAwX2NsaXApCit7CisgIEdzdEVsZW1lbnQgKmFtcGxpZnk7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdpbnQxNiBpbls2XSA9IHsgMjQ1NzYsIC0xNjM4NCwgMjU2LCAtMTI4LCAwLCAtMjQ1NzYgfTsKKyAgZ2ludDE2IG91dFs2XSA9IHsgR19NQVhJTlQxNiwgLTMyNzY4LCA1MTIsIC0yNTYsIDAsIEdfTUlOSU5UMTYgfTsKKyAgZ2ludDE2IHJlc1s2XTsKKworICBhbXBsaWZ5ID0gc2V0dXBfYW1wbGlmeSAoKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYW1wbGlmeSksICJhbXBsaWZpY2F0aW9uIiwgMi4wLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYW1wbGlmeSwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQU1QTElGWV9DQVBTX1NUUklORyk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhbXBsaWZ5LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgaW5idWZmZXIgPQorICAgICAgZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZF9mdWxsIChHU1RfTUVNT1JZX0ZMQUdfUkVBRE9OTFksIGluLCAxMiwgMCwgMTIsCisgICAgICBOVUxMLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChpbmJ1ZmZlciwgMCwgaW4sIDEyKSA9PSAwKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2V4dHJhY3QgKG91dGJ1ZmZlciwgMCwgcmVzLCAxMikgPT0gMTIpOworICBHU1RfSU5GTworICAgICAgKCJleHBlY3RlZCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCByZWFsICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkIiwKKyAgICAgIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSwgb3V0WzRdLCBvdXRbNV0sIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sCisgICAgICByZXNbM10sIHJlc1s0XSwgcmVzWzVdKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChvdXRidWZmZXIsIDAsIG91dCwgMTIpID09IDApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hbXBsaWZ5IChhbXBsaWZ5KTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF8wNTBfd3JhcF9uZWdhdGl2ZSkKK3sKKyAgR3N0RWxlbWVudCAqYW1wbGlmeTsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2ludDE2IGluWzZdID0geyAyNDU3NiwgLTE2Mzg0LCAyNTYsIC0xMjgsIDAsIC0yNDU3NiB9OworICBnaW50MTYgb3V0WzZdID0geyAxMjI4OCwgLTgxOTIsIDEyOCwgLTY0LCAwLCAtMTIyODggfTsKKyAgZ2ludDE2IHJlc1s2XTsKKworICBhbXBsaWZ5ID0gc2V0dXBfYW1wbGlmeSAoKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYW1wbGlmeSksICJhbXBsaWZpY2F0aW9uIiwgMC41LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYW1wbGlmeSksICJjbGlwcGluZy1tZXRob2QiLCAxLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYW1wbGlmeSwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQU1QTElGWV9DQVBTX1NUUklORyk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhbXBsaWZ5LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgaW5idWZmZXIgPQorICAgICAgZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZF9mdWxsIChHU1RfTUVNT1JZX0ZMQUdfUkVBRE9OTFksIGluLCAxMiwgMCwgMTIsCisgICAgICBOVUxMLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChpbmJ1ZmZlciwgMCwgaW4sIDEyKSA9PSAwKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2V4dHJhY3QgKG91dGJ1ZmZlciwgMCwgcmVzLCAxMikgPT0gMTIpOworICBHU1RfSU5GTworICAgICAgKCJleHBlY3RlZCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCByZWFsICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkIiwKKyAgICAgIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSwgb3V0WzRdLCBvdXRbNV0sIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sCisgICAgICByZXNbM10sIHJlc1s0XSwgcmVzWzVdKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChvdXRidWZmZXIsIDAsIG91dCwgMTIpID09IDApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hbXBsaWZ5IChhbXBsaWZ5KTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF8yMDBfd3JhcF9uZWdhdGl2ZSkKK3sKKyAgR3N0RWxlbWVudCAqYW1wbGlmeTsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2ludDE2IGluWzZdID0geyAyNDU3NiwgLTE2Mzg0LCAyNTYsIC0xMjgsIDAsIC0yNDU3NiB9OworICBnaW50MTYgb3V0WzZdID0geyAtMTYzODQsIC0zMjc2OCwgNTEyLCAtMjU2LCAwLCAxNjM4NCB9OworICBnaW50MTYgcmVzWzZdOworCisgIGFtcGxpZnkgPSBzZXR1cF9hbXBsaWZ5ICgpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhbXBsaWZ5KSwgImFtcGxpZmljYXRpb24iLCAyLjAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhbXBsaWZ5KSwgImNsaXBwaW5nLW1ldGhvZCIsIDEsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhbXBsaWZ5LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBTVBMSUZZX0NBUFNfU1RSSU5HKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGFtcGxpZnksIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBpbmJ1ZmZlciA9CisgICAgICBnc3RfYnVmZmVyX25ld193cmFwcGVkX2Z1bGwgKEdTVF9NRU1PUllfRkxBR19SRUFET05MWSwgaW4sIDEyLCAwLCAxMiwKKyAgICAgIE5VTEwsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKGluYnVmZmVyLCAwLCBpbiwgMTIpID09IDApOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZXh0cmFjdCAob3V0YnVmZmVyLCAwLCByZXMsIDEyKSA9PSAxMik7CisgIEdTVF9JTkZPCisgICAgICAoImV4cGVjdGVkICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkIHJlYWwgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQiLAorICAgICAgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdLCBvdXRbNF0sIG91dFs1XSwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwKKyAgICAgIHJlc1szXSwgcmVzWzRdLCByZXNbNV0pOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgMCwgb3V0LCAxMikgPT0gMCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2FtcGxpZnkgKGFtcGxpZnkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0XzA1MF93cmFwX3Bvc2l0aXZlKQoreworICBHc3RFbGVtZW50ICphbXBsaWZ5OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnaW50MTYgaW5bNl0gPSB7IDI0NTc2LCAtMTYzODQsIDI1NiwgLTEyOCwgMCwgLTI0NTc2IH07CisgIGdpbnQxNiBvdXRbNl0gPSB7IDEyMjg4LCAtODE5MiwgMTI4LCAtNjQsIDAsIC0xMjI4OCB9OworICBnaW50MTYgcmVzWzZdOworCisgIGFtcGxpZnkgPSBzZXR1cF9hbXBsaWZ5ICgpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhbXBsaWZ5KSwgImFtcGxpZmljYXRpb24iLCAwLjUsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhbXBsaWZ5KSwgImNsaXBwaW5nLW1ldGhvZCIsIDIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhbXBsaWZ5LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBTVBMSUZZX0NBUFNfU1RSSU5HKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGFtcGxpZnksIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBpbmJ1ZmZlciA9CisgICAgICBnc3RfYnVmZmVyX25ld193cmFwcGVkX2Z1bGwgKEdTVF9NRU1PUllfRkxBR19SRUFET05MWSwgaW4sIDEyLCAwLCAxMiwKKyAgICAgIE5VTEwsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKGluYnVmZmVyLCAwLCBpbiwgMTIpID09IDApOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZXh0cmFjdCAob3V0YnVmZmVyLCAwLCByZXMsIDEyKSA9PSAxMik7CisgIEdTVF9JTkZPCisgICAgICAoImV4cGVjdGVkICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkIHJlYWwgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQiLAorICAgICAgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdLCBvdXRbNF0sIG91dFs1XSwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwKKyAgICAgIHJlc1szXSwgcmVzWzRdLCByZXNbNV0pOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgMCwgb3V0LCAxMikgPT0gMCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2FtcGxpZnkgKGFtcGxpZnkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0XzIwMF93cmFwX3Bvc2l0aXZlKQoreworICBHc3RFbGVtZW50ICphbXBsaWZ5OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnaW50MTYgaW5bNl0gPSB7IDI0NTc2LCAtMTYzODQsIDI1NiwgLTEyOCwgMCwgLTI0NTc2IH07CisgIGdpbnQxNiBvdXRbNl0gPSB7IDE2MzgyLCAtMzI3NjgsIDUxMiwgLTI1NiwgMCwgLTE2Mzg0IH07CisgIGdpbnQxNiByZXNbNl07CisKKyAgYW1wbGlmeSA9IHNldHVwX2FtcGxpZnkgKCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGFtcGxpZnkpLCAiYW1wbGlmaWNhdGlvbiIsIDIuMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGFtcGxpZnkpLCAiY2xpcHBpbmctbWV0aG9kIiwgMiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGFtcGxpZnksCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFNUExJRllfQ0FQU19TVFJJTkcpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYW1wbGlmeSwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGluYnVmZmVyID0KKyAgICAgIGdzdF9idWZmZXJfbmV3X3dyYXBwZWRfZnVsbCAoR1NUX01FTU9SWV9GTEFHX1JFQURPTkxZLCBpbiwgMTIsIDAsIDEyLAorICAgICAgTlVMTCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoaW5idWZmZXIsIDAsIGluLCAxMikgPT0gMCk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9leHRyYWN0IChvdXRidWZmZXIsIDAsIHJlcywgMTIpID09IDEyKTsKKyAgR1NUX0lORk8KKyAgICAgICgiZXhwZWN0ZWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQgcmVhbCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCIsCisgICAgICBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10sIG91dFs0XSwgb3V0WzVdLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLAorICAgICAgcmVzWzNdLCByZXNbNF0sIHJlc1s1XSk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAob3V0YnVmZmVyLCAwLCBvdXQsIDEyKSA9PSAwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYW1wbGlmeSAoYW1wbGlmeSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK2FtcGxpZnlfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiYW1wbGlmeSIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXNzdGhyb3VnaCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF96ZXJvKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzA1MF9jbGlwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzIwMF9jbGlwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzA1MF93cmFwX25lZ2F0aXZlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzIwMF93cmFwX25lZ2F0aXZlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzA1MF93cmFwX3Bvc2l0aXZlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzIwMF93cmFwX3Bvc2l0aXZlKTsKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChhbXBsaWZ5KTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYmJhbmQuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYmJhbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjM2ZTIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9jaGViYmFuZC5jCkBAIC0wLDAgKzEsMTY3MCBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBhdWRpb2NoZWJiYW5kLmM6IFVuaXQgdGVzdCBmb3IgdGhlIGF1ZGlvY2hlYmJhbmQgZWxlbWVudAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCisjaW5jbHVkZSA8bWF0aC5oPgorCisvKiBGb3IgZWFzZSBvZiBwcm9ncmFtbWluZyB3ZSB1c2UgZ2xvYmFscyB0byBrZWVwIHJlZnMgZm9yIG91ciBmbG9hdGluZworICogc3JjIGFuZCBzaW5rIHBhZHMgd2UgY3JlYXRlOyBvdGhlcndpc2Ugd2UgYWx3YXlzIGhhdmUgdG8gZG8gZ2V0X3BhZCwKKyAqIGdldF9wZWVyLCBhbmQgdGhlbiByZW1vdmUgcmVmZXJlbmNlcyBpbiBldmVyeSB0ZXN0IGZ1bmN0aW9uICovCitHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworCisjZGVmaW5lIEJVRkZFUl9DQVBTX1NUUklOR18zMiAgICAgICAgICAgXAorICAgICJhdWRpby94LXJhdywgIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiICAgICAgICAgICAgICBcCisgICAgInJhdGUgPSAoaW50KSA0NDEwMCwgIiAgICAgICAgICAgICAgXAorICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiAgIFwKKyAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUoRjMyKQorCisjZGVmaW5lIEJVRkZFUl9DQVBTX1NUUklOR182NCAgICAgICAgICAgXAorICAgICJhdWRpby94LXJhdywgIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiICAgICAgICAgICAgICBcCisgICAgInJhdGUgPSAoaW50KSA0NDEwMCwgIiAgICAgICAgICAgICAgXAorICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiAgIFwKKyAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUoRjY0KQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIDQ0MTAwLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgeyAiCisgICAgICAgIEdTVF9BVURJT19ORSAoRjMyKSAiLCAiIEdTVF9BVURJT19ORSAoRjY0KSAiIH0iKSk7CitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIDQ0MTAwLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgeyAiCisgICAgICAgIEdTVF9BVURJT19ORSAoRjMyKSAiLCAiIEdTVF9BVURJT19ORSAoRjY0KSAiIH0iKSk7CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX2F1ZGlvY2hlYmJhbmQgKHZvaWQpCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmJhbmQ7CisKKyAgR1NUX0RFQlVHICgic2V0dXBfYXVkaW9jaGViYmFuZCIpOworICBhdWRpb2NoZWJiYW5kID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJhdWRpb2NoZWJiYW5kIik7CisgIG15c3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKGF1ZGlvY2hlYmJhbmQsICZzcmN0ZW1wbGF0ZSk7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAoYXVkaW9jaGViYmFuZCwgJnNpbmt0ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgcmV0dXJuIGF1ZGlvY2hlYmJhbmQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX2F1ZGlvY2hlYmJhbmQgKEdzdEVsZW1lbnQgKiBhdWRpb2NoZWJiYW5kKQoreworICBHU1RfREVCVUcgKCJjbGVhbnVwX2F1ZGlvY2hlYmJhbmQiKTsKKworICBnX2xpc3RfZm9yZWFjaCAoYnVmZmVycywgKEdGdW5jKSBnc3RfbWluaV9vYmplY3RfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIEZBTFNFKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKGF1ZGlvY2hlYmJhbmQpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKGF1ZGlvY2hlYmJhbmQpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAoYXVkaW9jaGViYmFuZCk7Cit9CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IDAgaXMgZXJhc2VkIHdpdGggYmFuZHBhc3MgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMV8zMl9icF8waHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmJhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJiYW5kID0gc2V0dXBfYXVkaW9jaGViYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidHlwZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInJpcHBsZSIsIDAuMjUsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmJhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCAxMDI0ICogc2l6ZW9mIChnZmxvYXQpLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIGluW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfMzIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGViYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTAyNC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA8PSAwLjEpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmJhbmQgKGF1ZGlvY2hlYmJhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IGJhbmQgY2VudGVyIGlzIHByZXNlcnZlZCB3aXRoIGJhbmRwYXNzIG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTFfMzJfYnBfMTEwMjVoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGViYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmJhbmQgPSBzZXR1cF9hdWRpb2NoZWJiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ0eXBlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicmlwcGxlIiwgMC4yNSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGViYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIDEwMjQgKiBzaXplb2YgKGdmbG9hdCksIE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpICs9IDQpIHsKKyAgICBpbltpXSA9IDAuMDsKKyAgICBpbltpICsgMV0gPSAxLjA7CisgICAgaW5baSArIDJdID0gMC4wOworICAgIGluW2kgKyAzXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzMyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmJhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEwMjQuMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPj0gMC42KTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJiYW5kIChhdWRpb2NoZWJiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCByYXRlLzIgaXMgZXJhc2VkIHdpdGggYmFuZHBhc3MgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMV8zMl9icF8yMjA1MGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGViYmFuZCA9IHNldHVwX2F1ZGlvY2hlYmJhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInR5cGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJyaXBwbGUiLCAwLjI1LCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgMTAyNCAqIHNpemVvZiAoZ2Zsb2F0KSwgTlVMTCk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkgKz0gMikgeworICAgIGluW2ldID0gMS4wOworICAgIGluW2kgKyAxXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzMyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmJhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEwMjQuMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPD0gMC4xKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJiYW5kIChhdWRpb2NoZWJiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCAwIGlzIHByZXNlcnZlZCB3aXRoIGJhbmRyZWplY3QgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMV8zMl9icl8waHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmJhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJiYW5kID0gc2V0dXBfYXVkaW9jaGViYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRyZWplY3QgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJtb2RlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ0eXBlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicmlwcGxlIiwgMC4yNSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGViYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIDEwMjQgKiBzaXplb2YgKGdmbG9hdCksIE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgaW5baV0gPSAxLjA7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMDI0LjApOworICBmYWlsX3VubGVzcyAocm1zID49IDAuOSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGViYmFuZCAoYXVkaW9jaGViYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgYmFuZCBjZW50ZXIgaXMgZXJhc2VkIHdpdGggYmFuZHJlamVjdCBtb2RlIGFuZCBhIAorICogMjAwMEh6IGZyZXF1ZW5jeSBiYW5kIGFyb3VuZCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUxXzMyX2JyXzExMDI1aHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmJhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJiYW5kID0gc2V0dXBfYXVkaW9jaGViYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRyZWplY3QgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJtb2RlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ0eXBlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicmlwcGxlIiwgMC4yNSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGViYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIDEwMjQgKiBzaXplb2YgKGdmbG9hdCksIE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpICs9IDQpIHsKKyAgICBpbltpXSA9IDAuMDsKKyAgICBpbltpICsgMV0gPSAxLjA7CisgICAgaW5baSArIDJdID0gMC4wOworICAgIGluW2kgKyAzXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzMyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmJhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEwMjQuMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPD0gMC4xKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJiYW5kIChhdWRpb2NoZWJiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCByYXRlLzIgaXMgcHJlc2VydmVkIHdpdGggYmFuZHJlamVjdCBtb2RlIGFuZCBhIAorICogMjAwMEh6IGZyZXF1ZW5jeSBiYW5kIGFyb3VuZCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUxXzMyX2JyXzIyMDUwaHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmJhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJiYW5kID0gc2V0dXBfYXVkaW9jaGViYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRyZWplY3QgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJtb2RlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ0eXBlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicmlwcGxlIiwgMC4yNSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGViYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIDEwMjQgKiBzaXplb2YgKGdmbG9hdCksIE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpICs9IDIpIHsKKyAgICBpbltpXSA9IDEuMDsKKyAgICBpbltpICsgMV0gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMDI0LjApOworICBmYWlsX3VubGVzcyAocm1zID49IDAuOSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGViYmFuZCAoYXVkaW9jaGViYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgMCBpcyBlcmFzZWQgd2l0aCBiYW5kcGFzcyBtb2RlIGFuZCBhIAorICogMjAwMEh6IGZyZXF1ZW5jeSBiYW5kIGFyb3VuZCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUxXzY0X2JwXzBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGViYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJiYW5kID0gc2V0dXBfYXVkaW9jaGViYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidHlwZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInJpcHBsZSIsIDAuMjUsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmJhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTAyNCAqIHNpemVvZiAoZ2RvdWJsZSkpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIGluW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGViYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEwMjQuMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPD0gMC4xKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJiYW5kIChhdWRpb2NoZWJiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCBiYW5kIGNlbnRlciBpcyBwcmVzZXJ2ZWQgd2l0aCBiYW5kcGFzcyBtb2RlIGFuZCBhIAorICogMjAwMEh6IGZyZXF1ZW5jeSBiYW5kIGFyb3VuZCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUxXzY0X2JwXzExMDI1aHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmJhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGViYmFuZCA9IHNldHVwX2F1ZGlvY2hlYmJhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInR5cGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJyaXBwbGUiLCAwLjI1LCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEwMjQgKiBzaXplb2YgKGdkb3VibGUpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkgKz0gNCkgeworICAgIGluW2ldID0gMC4wOworICAgIGluW2kgKyAxXSA9IDEuMDsKKyAgICBpbltpICsgMl0gPSAwLjA7CisgICAgaW5baSArIDNdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGViYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEwMjQuMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPj0gMC42KTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJiYW5kIChhdWRpb2NoZWJiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCByYXRlLzIgaXMgZXJhc2VkIHdpdGggYmFuZHBhc3MgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMV82NF9icF8yMjA1MGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmJhbmQgPSBzZXR1cF9hdWRpb2NoZWJiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ0eXBlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicmlwcGxlIiwgMC4yNSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGViYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMDI0ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpICs9IDIpIHsKKyAgICBpbltpXSA9IDEuMDsKKyAgICBpbltpICsgMV0gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR182NCk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTAyNC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA8PSAwLjEpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmJhbmQgKGF1ZGlvY2hlYmJhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IDAgaXMgcHJlc2VydmVkIHdpdGggYmFuZHJlamVjdCBtb2RlIGFuZCBhIAorICogMjAwMEh6IGZyZXF1ZW5jeSBiYW5kIGFyb3VuZCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUxXzY0X2JyXzBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGViYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJiYW5kID0gc2V0dXBfYXVkaW9jaGViYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRyZWplY3QgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJtb2RlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ0eXBlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicmlwcGxlIiwgMC4yNSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGViYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMDI0ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgaW5baV0gPSAxLjA7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR182NCk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTAyNC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjkpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmJhbmQgKGF1ZGlvY2hlYmJhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IGJhbmQgY2VudGVyIGlzIGVyYXNlZCB3aXRoIGJhbmRyZWplY3QgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMV82NF9icl8xMTAyNWh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmJhbmQgPSBzZXR1cF9hdWRpb2NoZWJiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHJlamVjdCAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInR5cGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJyaXBwbGUiLCAwLjI1LCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEwMjQgKiBzaXplb2YgKGdkb3VibGUpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkgKz0gNCkgeworICAgIGluW2ldID0gMC4wOworICAgIGluW2kgKyAxXSA9IDEuMDsKKyAgICBpbltpICsgMl0gPSAwLjA7CisgICAgaW5baSArIDNdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGViYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEwMjQuMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPD0gMC4xKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJiYW5kIChhdWRpb2NoZWJiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCByYXRlLzIgaXMgcHJlc2VydmVkIHdpdGggYmFuZHJlamVjdCBtb2RlIGFuZCBhIAorICogMjAwMEh6IGZyZXF1ZW5jeSBiYW5kIGFyb3VuZCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUxXzY0X2JyXzIyMDUwaHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmJhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGViYmFuZCA9IHNldHVwX2F1ZGlvY2hlYmJhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcmVqZWN0ICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidHlwZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInJpcHBsZSIsIDAuMjUsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmJhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTAyNCAqIHNpemVvZiAoZ2RvdWJsZSkpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSArPSAyKSB7CisgICAgaW5baV0gPSAxLjA7CisgICAgaW5baSArIDFdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGViYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEwMjQuMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPj0gMC45KTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJiYW5kIChhdWRpb2NoZWJiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCAwIGlzIGVyYXNlZCB3aXRoIGJhbmRwYXNzIG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTJfMzJfYnBfMGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGViYmFuZCA9IHNldHVwX2F1ZGlvY2hlYmJhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInR5cGUiLCAyLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJyaXBwbGUiLCA0MC4wLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgMTAyNCAqIHNpemVvZiAoZ2Zsb2F0KSwgTlVMTCk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBpbltpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzMyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmJhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEwMjQuMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPD0gMC4xKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJiYW5kIChhdWRpb2NoZWJiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCBiYW5kIGNlbnRlciBpcyBwcmVzZXJ2ZWQgd2l0aCBiYW5kcGFzcyBtb2RlIGFuZCBhIAorICogMjAwMEh6IGZyZXF1ZW5jeSBiYW5kIGFyb3VuZCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUyXzMyX2JwXzExMDI1aHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmJhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJiYW5kID0gc2V0dXBfYXVkaW9jaGViYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidHlwZSIsIDIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInJpcHBsZSIsIDQwLjAsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmJhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCAxMDI0ICogc2l6ZW9mIChnZmxvYXQpLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSArPSA0KSB7CisgICAgaW5baV0gPSAwLjA7CisgICAgaW5baSArIDFdID0gMS4wOworICAgIGluW2kgKyAyXSA9IDAuMDsKKyAgICBpbltpICsgM10gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMDI0LjApOworICBmYWlsX3VubGVzcyAocm1zID49IDAuNik7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGViYmFuZCAoYXVkaW9jaGViYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIGVyYXNlZCB3aXRoIGJhbmRwYXNzIG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTJfMzJfYnBfMjIwNTBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGViYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmJhbmQgPSBzZXR1cF9hdWRpb2NoZWJiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ0eXBlIiwgMiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicmlwcGxlIiwgNDAuMCwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGViYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIDEwMjQgKiBzaXplb2YgKGdmbG9hdCksIE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpICs9IDIpIHsKKyAgICBpbltpXSA9IDEuMDsKKyAgICBpbltpICsgMV0gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMDI0LjApOworICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGViYmFuZCAoYXVkaW9jaGViYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgMCBpcyBwcmVzZXJ2ZWQgd2l0aCBiYW5kcmVqZWN0IG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTJfMzJfYnJfMGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGViYmFuZCA9IHNldHVwX2F1ZGlvY2hlYmJhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcmVqZWN0ICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidHlwZSIsIDIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInJpcHBsZSIsIDQwLjAsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmJhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCAxMDI0ICogc2l6ZW9mIChnZmxvYXQpLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIGluW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfMzIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGViYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTAyNC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjkpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmJhbmQgKGF1ZGlvY2hlYmJhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IGJhbmQgY2VudGVyIGlzIGVyYXNlZCB3aXRoIGJhbmRyZWplY3QgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMl8zMl9icl8xMTAyNWh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGViYmFuZCA9IHNldHVwX2F1ZGlvY2hlYmJhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcmVqZWN0ICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidHlwZSIsIDIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInJpcHBsZSIsIDQwLjAsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmJhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCAxMDI0ICogc2l6ZW9mIChnZmxvYXQpLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSArPSA0KSB7CisgICAgaW5baV0gPSAwLjA7CisgICAgaW5baSArIDFdID0gMS4wOworICAgIGluW2kgKyAyXSA9IDAuMDsKKyAgICBpbltpICsgM10gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMDI0LjApOworICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGViYmFuZCAoYXVkaW9jaGViYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIHByZXNlcnZlZCB3aXRoIGJhbmRyZWplY3QgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMl8zMl9icl8yMjA1MGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGViYmFuZCA9IHNldHVwX2F1ZGlvY2hlYmJhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcmVqZWN0ICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidHlwZSIsIDIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInJpcHBsZSIsIDQwLjAsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmJhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCAxMDI0ICogc2l6ZW9mIChnZmxvYXQpLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSArPSAyKSB7CisgICAgaW5baV0gPSAxLjA7CisgICAgaW5baSArIDFdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfMzIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGViYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTAyNC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjkpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmJhbmQgKGF1ZGlvY2hlYmJhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IDAgaXMgZXJhc2VkIHdpdGggYmFuZHBhc3MgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMl82NF9icF8waHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmJhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGViYmFuZCA9IHNldHVwX2F1ZGlvY2hlYmJhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInR5cGUiLCAyLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJyaXBwbGUiLCA0MC4wLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEwMjQgKiBzaXplb2YgKGdkb3VibGUpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBpbltpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmJhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMDI0LjApOworICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGViYmFuZCAoYXVkaW9jaGViYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgYmFuZCBjZW50ZXIgaXMgcHJlc2VydmVkIHdpdGggYmFuZHBhc3MgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMl82NF9icF8xMTAyNWh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmJhbmQgPSBzZXR1cF9hdWRpb2NoZWJiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ0eXBlIiwgMiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicmlwcGxlIiwgNDAuMCwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGViYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMDI0ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpICs9IDQpIHsKKyAgICBpbltpXSA9IDAuMDsKKyAgICBpbltpICsgMV0gPSAxLjA7CisgICAgaW5baSArIDJdID0gMC4wOworICAgIGluW2kgKyAzXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmJhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMDI0LjApOworICBmYWlsX3VubGVzcyAocm1zID49IDAuNik7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGViYmFuZCAoYXVkaW9jaGViYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIGVyYXNlZCB3aXRoIGJhbmRwYXNzIG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTJfNjRfYnBfMjIwNTBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGViYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJiYW5kID0gc2V0dXBfYXVkaW9jaGViYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidHlwZSIsIDIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInJpcHBsZSIsIDQwLjAsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmJhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTAyNCAqIHNpemVvZiAoZ2RvdWJsZSkpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSArPSAyKSB7CisgICAgaW5baV0gPSAxLjA7CisgICAgaW5baSArIDFdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGViYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEwMjQuMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPD0gMC4xKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJiYW5kIChhdWRpb2NoZWJiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCAwIGlzIHByZXNlcnZlZCB3aXRoIGJhbmRyZWplY3QgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMl82NF9icl8waHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmJhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGViYmFuZCA9IHNldHVwX2F1ZGlvY2hlYmJhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcmVqZWN0ICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidHlwZSIsIDIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInJpcHBsZSIsIDQwLjAsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmJhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTAyNCAqIHNpemVvZiAoZ2RvdWJsZSkpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIGluW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGViYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEwMjQuMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPj0gMC45KTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJiYW5kIChhdWRpb2NoZWJiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCBiYW5kIGNlbnRlciBpcyBlcmFzZWQgd2l0aCBiYW5kcmVqZWN0IG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTJfNjRfYnJfMTEwMjVoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGViYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJiYW5kID0gc2V0dXBfYXVkaW9jaGViYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRyZWplY3QgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJtb2RlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ0eXBlIiwgMiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicmlwcGxlIiwgNDAuMCwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGViYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMDI0ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpICs9IDQpIHsKKyAgICBpbltpXSA9IDAuMDsKKyAgICBpbltpICsgMV0gPSAxLjA7CisgICAgaW5baSArIDJdID0gMC4wOworICAgIGluW2kgKyAzXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmJhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMDI0LjApOworICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGViYmFuZCAoYXVkaW9jaGViYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIHByZXNlcnZlZCB3aXRoIGJhbmRyZWplY3QgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMl82NF9icl8yMjA1MGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmJhbmQgPSBzZXR1cF9hdWRpb2NoZWJiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHJlamVjdCAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInR5cGUiLCAyLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJyaXBwbGUiLCA0MC4wLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEwMjQgKiBzaXplb2YgKGdkb3VibGUpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkgKz0gMikgeworICAgIGluW2ldID0gMS4wOworICAgIGluW2kgKyAxXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmJhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMDI0LjApOworICBmYWlsX3VubGVzcyAocm1zID49IDAuOSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGViYmFuZCAoYXVkaW9jaGViYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK2F1ZGlvY2hlYmJhbmRfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiYXVkaW9jaGViYmFuZCIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMV8zMl9icF8waHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTFfMzJfYnBfMTEwMjVoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMV8zMl9icF8yMjA1MGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUxXzMyX2JyXzBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMV8zMl9icl8xMTAyNWh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUxXzMyX2JyXzIyMDUwaHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTFfNjRfYnBfMGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUxXzY0X2JwXzExMDI1aHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTFfNjRfYnBfMjIwNTBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMV82NF9icl8waHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTFfNjRfYnJfMTEwMjVoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMV82NF9icl8yMjA1MGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUyXzMyX2JwXzBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMl8zMl9icF8xMTAyNWh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUyXzMyX2JwXzIyMDUwaHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTJfMzJfYnJfMGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUyXzMyX2JyXzExMDI1aHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTJfMzJfYnJfMjIwNTBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMl82NF9icF8waHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTJfNjRfYnBfMTEwMjVoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMl82NF9icF8yMjA1MGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUyXzY0X2JyXzBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMl82NF9icl8xMTAyNWh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUyXzY0X2JyXzIyMDUwaHopOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoYXVkaW9jaGViYmFuZCk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2NoZWJsaW1pdC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9jaGVibGltaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzllYWI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9jaGVibGltaXQuYwpAQCAtMCwwICsxLDEwODYgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKgorICogYXVkaW9jaGVibGltaXQuYzogVW5pdCB0ZXN0IGZvciB0aGUgYXVkaW9jaGVibGltaXQgZWxlbWVudAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCisjaW5jbHVkZSA8bWF0aC5oPgorCisvKiBGb3IgZWFzZSBvZiBwcm9ncmFtbWluZyB3ZSB1c2UgZ2xvYmFscyB0byBrZWVwIHJlZnMgZm9yIG91ciBmbG9hdGluZworICogc3JjIGFuZCBzaW5rIHBhZHMgd2UgY3JlYXRlOyBvdGhlcndpc2Ugd2UgYWx3YXlzIGhhdmUgdG8gZG8gZ2V0X3BhZCwKKyAqIGdldF9wZWVyLCBhbmQgdGhlbiByZW1vdmUgcmVmZXJlbmNlcyBpbiBldmVyeSB0ZXN0IGZ1bmN0aW9uICovCitHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworCisjZGVmaW5lIEJVRkZFUl9DQVBTX1NUUklOR18zMiAgICAgICAgICAgXAorICAgICJhdWRpby94LXJhdywgIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiICAgICAgICAgICAgICBcCisgICAgInJhdGUgPSAoaW50KSA0NDEwMCwgIiAgICAgICAgICAgICAgXAorICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiAgIFwKKyAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUoRjMyKQorCisjZGVmaW5lIEJVRkZFUl9DQVBTX1NUUklOR182NCAgICAgICAgICAgXAorICAgICJhdWRpby94LXJhdywgIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiICAgICAgICAgICAgICBcCisgICAgInJhdGUgPSAoaW50KSA0NDEwMCwgIiAgICAgICAgICAgICAgXAorICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiAgIFwKKyAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUoRjY0KQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIDQ0MTAwLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgeyAiCisgICAgICAgIEdTVF9BVURJT19ORSAoRjMyKSAiLCAiIEdTVF9BVURJT19ORSAoRjY0KSAiIH0iKSk7CitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIDQ0MTAwLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgeyAiCisgICAgICAgIEdTVF9BVURJT19ORSAoRjMyKSAiLCAiIEdTVF9BVURJT19ORSAoRjY0KSAiIH0iKSk7CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX2F1ZGlvY2hlYmxpbWl0ICh2b2lkKQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJsaW1pdDsKKworICBHU1RfREVCVUcgKCJzZXR1cF9hdWRpb2NoZWJsaW1pdCIpOworICBhdWRpb2NoZWJsaW1pdCA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgiYXVkaW9jaGVibGltaXQiKTsKKyAgbXlzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAoYXVkaW9jaGVibGltaXQsICZzcmN0ZW1wbGF0ZSk7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAoYXVkaW9jaGVibGltaXQsICZzaW5rdGVtcGxhdGUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIFRSVUUpOworCisgIHJldHVybiBhdWRpb2NoZWJsaW1pdDsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfYXVkaW9jaGVibGltaXQgKEdzdEVsZW1lbnQgKiBhdWRpb2NoZWJsaW1pdCkKK3sKKyAgR1NUX0RFQlVHICgiY2xlYW51cF9hdWRpb2NoZWJsaW1pdCIpOworCisgIGdfbGlzdF9mb3JlYWNoIChidWZmZXJzLCAoR0Z1bmMpIGdzdF9taW5pX29iamVjdF91bnJlZiwgTlVMTCk7CisgIGdfbGlzdF9mcmVlIChidWZmZXJzKTsKKyAgYnVmZmVycyA9IE5VTEw7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAoYXVkaW9jaGVibGltaXQpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKGF1ZGlvY2hlYmxpbWl0KTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGF1ZGlvY2hlYmxpbWl0KTsKK30KKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgMCBpcyBwcmVzZXJ2ZWQgd2l0aCBsb3dwYXNzIG1vZGUgYW5kIGEgY3V0b2ZmCisgKiBhdCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUxXzMyX2xwXzBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGVibGltaXQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJsaW1pdCA9IHNldHVwX2F1ZGlvY2hlYmxpbWl0ICgpOworICAvKiBTZXQgdG8gbG93cGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInR5cGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAicmlwcGxlIiwgMC4yNSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGVibGltaXQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJjdXRvZmYiLCA0NDEwMCAvIDQuMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIDEyOCAqIHNpemVvZiAoZ2Zsb2F0KSwgTlVMTCk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIGluW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfMzIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGVibGltaXQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTI4LjApOworICBmYWlsX3VubGVzcyAocm1zID49IDAuOSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGVibGltaXQgKGF1ZGlvY2hlYmxpbWl0KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCByYXRlLzIgaXMgZXJhc2VkIHdpdGggbG93cGFzcyBtb2RlIGFuZCBhIGN1dG9mZgorICogYXQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMV8zMl9scF8yMjA1MGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJsaW1pdDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmxpbWl0ID0gc2V0dXBfYXVkaW9jaGVibGltaXQgKCk7CisgIC8qIFNldCB0byBsb3dwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAidHlwZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJyaXBwbGUiLCAwLjI1LCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJsaW1pdCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgImN1dG9mZiIsIDQ0MTAwIC8gNC4wLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgMTI4ICogc2l6ZW9mIChnZmxvYXQpLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpICs9IDIpIHsKKyAgICBpbltpXSA9IDEuMDsKKyAgICBpbltpICsgMV0gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJsaW1pdCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMjguMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPD0gMC4xKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJsaW1pdCAoYXVkaW9jaGVibGltaXQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IDAgaXMgZXJhc2VkIHdpdGggaGlnaHBhc3MgbW9kZSBhbmQgYSBjdXRvZmYKKyAqIGF0IHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTFfMzJfaHBfMGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJsaW1pdDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmxpbWl0ID0gc2V0dXBfYXVkaW9jaGVibGltaXQgKCk7CisgIC8qIFNldCB0byBoaWdocGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJtb2RlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInR5cGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAicmlwcGxlIiwgMC4yNSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGVibGltaXQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJjdXRvZmYiLCA0NDEwMCAvIDQuMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIDEyOCAqIHNpemVvZiAoZ2Zsb2F0KSwgTlVMTCk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIGluW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfMzIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGVibGltaXQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTI4LjApOworICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGVibGltaXQgKGF1ZGlvY2hlYmxpbWl0KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCByYXRlLzIgaXMgcHJlc2VydmVkIHdpdGggaGlnaHBhc3MgbW9kZSBhbmQgYSBjdXRvZmYKKyAqIGF0IHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTFfMzJfaHBfMjIwNTBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGVibGltaXQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJsaW1pdCA9IHNldHVwX2F1ZGlvY2hlYmxpbWl0ICgpOworICAvKiBTZXQgdG8gaGlnaHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJ0eXBlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInJpcHBsZSIsIDAuMjUsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmxpbWl0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAiY3V0b2ZmIiwgNDQxMDAgLyA0LjAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCAxMjggKiBzaXplb2YgKGdmbG9hdCksIE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkgKz0gMikgeworICAgIGluW2ldID0gMS4wOworICAgIGluW2kgKyAxXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzMyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmxpbWl0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEyOC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjkpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmxpbWl0IChhdWRpb2NoZWJsaW1pdCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgMCBpcyBwcmVzZXJ2ZWQgd2l0aCBsb3dwYXNzIG1vZGUgYW5kIGEgY3V0b2ZmCisgKiBhdCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUxXzY0X2xwXzBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGVibGltaXQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGVibGltaXQgPSBzZXR1cF9hdWRpb2NoZWJsaW1pdCAoKTsKKyAgLyogU2V0IHRvIGxvd3Bhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJ0eXBlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInJpcHBsZSIsIDAuMjUsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmxpbWl0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAiY3V0b2ZmIiwgNDQxMDAgLyA0LjAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCAxMjggKiBzaXplb2YgKGdkb3VibGUpLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIGluW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGVibGltaXQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEyOC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjkpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmxpbWl0IChhdWRpb2NoZWJsaW1pdCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIGVyYXNlZCB3aXRoIGxvd3Bhc3MgbW9kZSBhbmQgYSBjdXRvZmYKKyAqIGF0IHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTFfNjRfbHBfMjIwNTBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGVibGltaXQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGVibGltaXQgPSBzZXR1cF9hdWRpb2NoZWJsaW1pdCAoKTsKKyAgLyogU2V0IHRvIGxvd3Bhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJ0eXBlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInJpcHBsZSIsIDAuMjUsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmxpbWl0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAiY3V0b2ZmIiwgNDQxMDAgLyA0LjAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCAxMjggKiBzaXplb2YgKGdkb3VibGUpLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSArPSAyKSB7CisgICAgaW5baV0gPSAxLjA7CisgICAgaW5baSArIDFdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGVibGltaXQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEyOC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA8PSAwLjEpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmxpbWl0IChhdWRpb2NoZWJsaW1pdCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgMCBpcyBlcmFzZWQgd2l0aCBoaWdocGFzcyBtb2RlIGFuZCBhIGN1dG9mZgorICogYXQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMV82NF9ocF8waHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmxpbWl0OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmxpbWl0ID0gc2V0dXBfYXVkaW9jaGVibGltaXQgKCk7CisgIC8qIFNldCB0byBoaWdocGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJtb2RlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInR5cGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAicmlwcGxlIiwgMC4yNSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGVibGltaXQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJjdXRvZmYiLCA0NDEwMCAvIDQuMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIDEyOCAqIHNpemVvZiAoZ2RvdWJsZSksIE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisgICAgaW5baV0gPSAxLjA7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR182NCk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJsaW1pdCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTI4LjApOworICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGVibGltaXQgKGF1ZGlvY2hlYmxpbWl0KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCByYXRlLzIgaXMgcHJlc2VydmVkIHdpdGggaGlnaHBhc3MgbW9kZSBhbmQgYSBjdXRvZmYKKyAqIGF0IHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTFfNjRfaHBfMjIwNTBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGVibGltaXQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGVibGltaXQgPSBzZXR1cF9hdWRpb2NoZWJsaW1pdCAoKTsKKyAgLyogU2V0IHRvIGhpZ2hwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAidHlwZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJyaXBwbGUiLCAwLjI1LCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJsaW1pdCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgImN1dG9mZiIsIDQ0MTAwIC8gNC4wLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgMTI4ICogc2l6ZW9mIChnZG91YmxlKSwgTlVMTCk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkgKz0gMikgeworICAgIGluW2ldID0gMS4wOworICAgIGluW2kgKyAxXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmxpbWl0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMjguMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPj0gMC45KTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJsaW1pdCAoYXVkaW9jaGVibGltaXQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IDAgaXMgcHJlc2VydmVkIHdpdGggbG93cGFzcyBtb2RlIGFuZCBhIGN1dG9mZgorICogYXQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMl8zMl9scF8waHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmxpbWl0OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGVibGltaXQgPSBzZXR1cF9hdWRpb2NoZWJsaW1pdCAoKTsKKyAgLyogU2V0IHRvIGxvd3Bhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJ0eXBlIiwgMiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInJpcHBsZSIsIDQwLjAsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmxpbWl0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAiY3V0b2ZmIiwgNDQxMDAgLyA0LjAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCAxMjggKiBzaXplb2YgKGdmbG9hdCksIE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBpbltpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzMyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmxpbWl0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEyOC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjkpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmxpbWl0IChhdWRpb2NoZWJsaW1pdCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIGVyYXNlZCB3aXRoIGxvd3Bhc3MgbW9kZSBhbmQgYSBjdXRvZmYKKyAqIGF0IHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTJfMzJfbHBfMjIwNTBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGVibGltaXQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJsaW1pdCA9IHNldHVwX2F1ZGlvY2hlYmxpbWl0ICgpOworICAvKiBTZXQgdG8gbG93cGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInR5cGUiLCAyLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAicmlwcGxlIiwgNDAuMCwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGVibGltaXQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJjdXRvZmYiLCA0NDEwMCAvIDQuMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIDEyOCAqIHNpemVvZiAoZ2Zsb2F0KSwgTlVMTCk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSArPSAyKSB7CisgICAgaW5baV0gPSAxLjA7CisgICAgaW5baSArIDFdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfMzIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGVibGltaXQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTI4LjApOworICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGVibGltaXQgKGF1ZGlvY2hlYmxpbWl0KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCAwIGlzIGVyYXNlZCB3aXRoIGhpZ2hwYXNzIG1vZGUgYW5kIGEgY3V0b2ZmCisgKiBhdCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUyXzMyX2hwXzBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGVibGltaXQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJsaW1pdCA9IHNldHVwX2F1ZGlvY2hlYmxpbWl0ICgpOworICAvKiBTZXQgdG8gaGlnaHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJ0eXBlIiwgMiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInJpcHBsZSIsIDQwLjAsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmxpbWl0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAiY3V0b2ZmIiwgNDQxMDAgLyA0LjAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCAxMjggKiBzaXplb2YgKGdmbG9hdCksIE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBpbltpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzMyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmxpbWl0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEyOC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA8PSAwLjEpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmxpbWl0IChhdWRpb2NoZWJsaW1pdCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIHByZXNlcnZlZCB3aXRoIGhpZ2hwYXNzIG1vZGUgYW5kIGEgY3V0b2ZmCisgKiBhdCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUyXzMyX2hwXzIyMDUwaHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmxpbWl0OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGVibGltaXQgPSBzZXR1cF9hdWRpb2NoZWJsaW1pdCAoKTsKKyAgLyogU2V0IHRvIGhpZ2hwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAidHlwZSIsIDIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJyaXBwbGUiLCA0MC4wLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJsaW1pdCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgImN1dG9mZiIsIDQ0MTAwIC8gNC4wLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgMTI4ICogc2l6ZW9mIChnZmxvYXQpLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpICs9IDIpIHsKKyAgICBpbltpXSA9IDEuMDsKKyAgICBpbltpICsgMV0gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJsaW1pdCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMjguMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPj0gMC45KTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJsaW1pdCAoYXVkaW9jaGVibGltaXQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IDAgaXMgcHJlc2VydmVkIHdpdGggbG93cGFzcyBtb2RlIGFuZCBhIGN1dG9mZgorICogYXQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMl82NF9scF8waHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmxpbWl0OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmxpbWl0ID0gc2V0dXBfYXVkaW9jaGVibGltaXQgKCk7CisgIC8qIFNldCB0byBsb3dwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAidHlwZSIsIDIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJyaXBwbGUiLCA0MC4wLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJsaW1pdCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgImN1dG9mZiIsIDQ0MTAwIC8gNC4wLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEyOCAqIHNpemVvZiAoZ2RvdWJsZSkpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisgICAgaW5baV0gPSAxLjA7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR182NCk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJsaW1pdCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTI4LjApOworICBmYWlsX3VubGVzcyAocm1zID49IDAuOSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGVibGltaXQgKGF1ZGlvY2hlYmxpbWl0KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCByYXRlLzIgaXMgZXJhc2VkIHdpdGggbG93cGFzcyBtb2RlIGFuZCBhIGN1dG9mZgorICogYXQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMl82NF9scF8yMjA1MGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJsaW1pdDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJsaW1pdCA9IHNldHVwX2F1ZGlvY2hlYmxpbWl0ICgpOworICAvKiBTZXQgdG8gbG93cGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInR5cGUiLCAyLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAicmlwcGxlIiwgNDAuMCwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGVibGltaXQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJjdXRvZmYiLCA0NDEwMCAvIDQuMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMjggKiBzaXplb2YgKGdkb3VibGUpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSArPSAyKSB7CisgICAgaW5baV0gPSAxLjA7CisgICAgaW5baSArIDFdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGVibGltaXQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEyOC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA8PSAwLjEpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmxpbWl0IChhdWRpb2NoZWJsaW1pdCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgMCBpcyBlcmFzZWQgd2l0aCBoaWdocGFzcyBtb2RlIGFuZCBhIGN1dG9mZgorICogYXQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMl82NF9ocF8waHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmxpbWl0OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmxpbWl0ID0gc2V0dXBfYXVkaW9jaGVibGltaXQgKCk7CisgIC8qIFNldCB0byBoaWdocGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJtb2RlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInR5cGUiLCAyLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAicmlwcGxlIiwgNDAuMCwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGVibGltaXQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJjdXRvZmYiLCA0NDEwMCAvIDQuMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMjggKiBzaXplb2YgKGdkb3VibGUpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIGluW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGVibGltaXQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEyOC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA8PSAwLjEpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmxpbWl0IChhdWRpb2NoZWJsaW1pdCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIHByZXNlcnZlZCB3aXRoIGhpZ2hwYXNzIG1vZGUgYW5kIGEgY3V0b2ZmCisgKiBhdCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUyXzY0X2hwXzIyMDUwaHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmxpbWl0OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmxpbWl0ID0gc2V0dXBfYXVkaW9jaGVibGltaXQgKCk7CisgIC8qIFNldCB0byBoaWdocGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJtb2RlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInR5cGUiLCAyLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAicmlwcGxlIiwgNDAuMCwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGVibGltaXQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJjdXRvZmYiLCA0NDEwMCAvIDQuMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMjggKiBzaXplb2YgKGdkb3VibGUpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSArPSAyKSB7CisgICAgaW5baV0gPSAxLjA7CisgICAgaW5baSArIDFdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGVibGltaXQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEyOC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjkpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmxpbWl0IChhdWRpb2NoZWJsaW1pdCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitzdGF0aWMgU3VpdGUgKgorYXVkaW9jaGVibGltaXRfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiYXVkaW9jaGVibGltaXQiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTFfMzJfbHBfMGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUxXzMyX2xwXzIyMDUwaHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTFfMzJfaHBfMGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUxXzMyX2hwXzIyMDUwaHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTFfNjRfbHBfMGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUxXzY0X2xwXzIyMDUwaHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTFfNjRfaHBfMGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUxXzY0X2hwXzIyMDUwaHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTJfMzJfbHBfMGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUyXzMyX2xwXzIyMDUwaHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTJfMzJfaHBfMGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUyXzMyX2hwXzIyMDUwaHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTJfNjRfbHBfMGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUyXzY0X2xwXzIyMDUwaHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTJfNjRfaHBfMGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUyXzY0X2hwXzIyMDUwaHopOworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGF1ZGlvY2hlYmxpbWl0KTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZHluYW1pYy5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9keW5hbWljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI4MmEwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZHluYW1pYy5jCkBAIC0wLDAgKzEsNDQyIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIGF1ZGlvZHluYW1pYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKgorICogR3JlYXRseSBiYXNlZCBvbiB0aGUgYXVkaW9wYW5vcmFtYSB1bml0IHRlc3QKKyAqIENvcHlyaWdodCAoQykgMjAwNiBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCitnYm9vbGVhbiBoYXZlX2VvcyA9IEZBTFNFOworCisvKiBGb3IgZWFzZSBvZiBwcm9ncmFtbWluZyB3ZSB1c2UgZ2xvYmFscyB0byBrZWVwIHJlZnMgZm9yIG91ciBmbG9hdGluZworICogc3JjIGFuZCBzaW5rIHBhZHMgd2UgY3JlYXRlOyBvdGhlcndpc2Ugd2UgYWx3YXlzIGhhdmUgdG8gZG8gZ2V0X3BhZCwKKyAqIGdldF9wZWVyLCBhbmQgdGhlbiByZW1vdmUgcmVmZXJlbmNlcyBpbiBldmVyeSB0ZXN0IGZ1bmN0aW9uICovCitHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworCisKKyNkZWZpbmUgRFlOQU1JQ19DQVBTX1NUUklORyAgICBcCisgICAgImF1ZGlvL3gtcmF3LCAiICAgICAgICAgICAgICAgICAgICAgXAorICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgICAgICAgICAgICAgIFwKKyAgICAicmF0ZSA9IChpbnQpIDQ0MTAwLCAiICAgICAgICAgICAgICBcCisgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiICAgXAorICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORShTMTYpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxLCAgTUFYIF0sICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSIgR1NUX0FVRElPX05FIChTMTYpKSk7CitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgIE1BWCBdLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKFMxNikpKTsKKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfZHluYW1pYyAodm9pZCkKK3sKKyAgR3N0RWxlbWVudCAqZHluYW1pYzsKKworICBHU1RfREVCVUcgKCJzZXR1cF9keW5hbWljIik7CisgIGR5bmFtaWMgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoImF1ZGlvZHluYW1pYyIpOworICBteXNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkIChkeW5hbWljLCAmc3JjdGVtcGxhdGUpOworICBteXNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKGR5bmFtaWMsICZzaW5rdGVtcGxhdGUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIFRSVUUpOworCisgIHJldHVybiBkeW5hbWljOworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF9keW5hbWljIChHc3RFbGVtZW50ICogZHluYW1pYykKK3sKKyAgR1NUX0RFQlVHICgiY2xlYW51cF9keW5hbWljIik7CisKKyAgZ19saXN0X2ZvcmVhY2ggKGJ1ZmZlcnMsIChHRnVuYykgZ3N0X21pbmlfb2JqZWN0X3VucmVmLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKGJ1ZmZlcnMpOworICBidWZmZXJzID0gTlVMTDsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBGQUxTRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBGQUxTRSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zcmNfcGFkIChkeW5hbWljKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChkeW5hbWljKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGR5bmFtaWMpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXNzdGhyb3VnaCkKK3sKKyAgR3N0RWxlbWVudCAqZHluYW1pYzsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2ludDE2IGluWzZdID0geyAyNDU3NiwgLTE2Mzg0LCAyNTYsIC0xMjgsIDAsIC0yNDU3NiB9OworICBnaW50MTYgcmVzWzZdOworCisgIGR5bmFtaWMgPSBzZXR1cF9keW5hbWljICgpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChkeW5hbWljLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgaW5idWZmZXIgPQorICAgICAgZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZF9mdWxsIChHU1RfTUVNT1JZX0ZMQUdfUkVBRE9OTFksIGluLCAxMiwgMCwgMTIsCisgICAgICBOVUxMLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChpbmJ1ZmZlciwgMCwgaW4sIDEyKSA9PSAwKTsKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChEWU5BTUlDX0NBUFNfU1RSSU5HKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGR5bmFtaWMsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYnV0IGl0IGVuZHMgdXAgYmVpbmcgY29sbGVjdGVkIG9uIHRoZSBnbG9iYWwgYnVmZmVyIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9leHRyYWN0IChvdXRidWZmZXIsIDAsIHJlcywgMTIpID09IDEyKTsKKyAgR1NUX0lORk8KKyAgICAgICgiZXhwZWN0ZWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQgcmVhbCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCIsCisgICAgICBpblswXSwgaW5bMV0sIGluWzJdLCBpblszXSwgaW5bNF0sIGluWzVdLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLCByZXNbM10sCisgICAgICByZXNbNF0sIHJlc1s1XSk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAob3V0YnVmZmVyLCAwLCBpbiwgMTIpID09IDApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9keW5hbWljIChkeW5hbWljKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9jb21wcmVzc19oYXJkXzUwXzUwKQoreworICBHc3RFbGVtZW50ICpkeW5hbWljOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnaW50MTYgaW5bOF0gPSB7IC0zMDAwMCwgMjQ1NzYsIC0xNjM4NCwgMjU2LCAtMTI4LCAwLCAtMjQ1NzYsIDMwMDAwIH07CisgIGdpbnQxNiByZXNbOF07CisKKyAgZHluYW1pYyA9IHNldHVwX2R5bmFtaWMgKCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGR5bmFtaWMpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChkeW5hbWljKSwgImNoYXJhY3RlcmlzdGljcyIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChkeW5hbWljKSwgInJhdGlvIiwgMC41LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZHluYW1pYyksICJ0aHJlc2hvbGQiLCAwLjUsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChkeW5hbWljLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDE2KTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChpbmJ1ZmZlciwgMCwgaW4sIDE2KTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChpbmJ1ZmZlciwgMCwgaW4sIDE2KSA9PSAwKTsKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChEWU5BTUlDX0NBUFNfU1RSSU5HKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGR5bmFtaWMsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2V4dHJhY3QgKG91dGJ1ZmZlciwgMCwgcmVzLCAxNikgPT0gMTYpOworCisgIGZhaWxfdW5sZXNzIChyZXNbMF0gPiBpblswXSk7CisgIGZhaWxfdW5sZXNzIChyZXNbMV0gPCBpblsxXSk7CisgIGZhaWxfdW5sZXNzIChyZXNbMl0gPT0gaW5bMl0pOworICBmYWlsX3VubGVzcyAocmVzWzNdID09IGluWzNdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1s0XSA9PSBpbls0XSk7CisgIGZhaWxfdW5sZXNzIChyZXNbNV0gPT0gaW5bNV0pOworICBmYWlsX3VubGVzcyAocmVzWzZdID4gaW5bNl0pOworICBmYWlsX3VubGVzcyAocmVzWzddIDwgaW5bN10pOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9keW5hbWljIChkeW5hbWljKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9jb21wcmVzc19zb2Z0XzUwXzUwKQoreworICBHc3RFbGVtZW50ICpkeW5hbWljOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnaW50MTYgaW5bOF0gPSB7IC0zMDAwMCwgMjQ1NzYsIC0xNjM4NCwgMjU2LCAtMTI4LCAwLCAtMjQ1NzYsIDMwMDAwIH07CisgIGdpbnQxNiByZXNbOF07CisKKyAgZHluYW1pYyA9IHNldHVwX2R5bmFtaWMgKCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGR5bmFtaWMpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChkeW5hbWljKSwgImNoYXJhY3RlcmlzdGljcyIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChkeW5hbWljKSwgInJhdGlvIiwgMC41LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZHluYW1pYyksICJ0aHJlc2hvbGQiLCAwLjUsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChkeW5hbWljLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDE2KTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChpbmJ1ZmZlciwgMCwgaW4sIDE2KTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChpbmJ1ZmZlciwgMCwgaW4sIDE2KSA9PSAwKTsKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChEWU5BTUlDX0NBUFNfU1RSSU5HKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGR5bmFtaWMsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2V4dHJhY3QgKG91dGJ1ZmZlciwgMCwgcmVzLCAxNikgPT0gMTYpOworCisgIGZhaWxfdW5sZXNzIChyZXNbMF0gPiBpblswXSk7CisgIGZhaWxfdW5sZXNzIChyZXNbMV0gPCBpblsxXSk7CisgIGZhaWxfdW5sZXNzIChyZXNbMl0gPT0gaW5bMl0pOworICBmYWlsX3VubGVzcyAocmVzWzNdID09IGluWzNdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1s0XSA9PSBpbls0XSk7CisgIGZhaWxfdW5sZXNzIChyZXNbNV0gPT0gaW5bNV0pOworICBmYWlsX3VubGVzcyAocmVzWzZdID4gaW5bNl0pOworICBmYWlsX3VubGVzcyAocmVzWzddIDwgaW5bN10pOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9keW5hbWljIChkeW5hbWljKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9jb21wcmVzc19oYXJkXzEwMF81MCkKK3sKKyAgR3N0RWxlbWVudCAqZHluYW1pYzsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2ludDE2IGluWzhdID0geyAtMzAwMDAsIDI0NTc2LCAtMTYzODQsIDI1NiwgLTEyOCwgMCwgLTI0NTc2LCAzMDAwMCB9OworICBnaW50MTYgcmVzWzhdOworCisgIGR5bmFtaWMgPSBzZXR1cF9keW5hbWljICgpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChkeW5hbWljKSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZHluYW1pYyksICJjaGFyYWN0ZXJpc3RpY3MiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZHluYW1pYyksICJyYXRpbyIsIDAuNSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGR5bmFtaWMpLCAidGhyZXNob2xkIiwgMS4wLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZHluYW1pYywKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxNik7CisgIGdzdF9idWZmZXJfZmlsbCAoaW5idWZmZXIsIDAsIGluLCAxNik7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoaW5idWZmZXIsIDAsIGluLCAxNikgPT0gMCk7CisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoRFlOQU1JQ19DQVBTX1NUUklORyk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBkeW5hbWljLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9leHRyYWN0IChvdXRidWZmZXIsIDAsIHJlcywgMTYpID09IDE2KTsKKworICBmYWlsX3VubGVzcyAocmVzWzBdID09IGluWzBdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1sxXSA9PSBpblsxXSk7CisgIGZhaWxfdW5sZXNzIChyZXNbMl0gPT0gaW5bMl0pOworICBmYWlsX3VubGVzcyAocmVzWzNdID09IGluWzNdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1s0XSA9PSBpbls0XSk7CisgIGZhaWxfdW5sZXNzIChyZXNbNV0gPT0gaW5bNV0pOworICBmYWlsX3VubGVzcyAocmVzWzZdID09IGluWzZdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1s3XSA9PSBpbls3XSk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2R5bmFtaWMgKGR5bmFtaWMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZXhwYW5kX2hhcmRfNTBfMjAwKQoreworICBHc3RFbGVtZW50ICpkeW5hbWljOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnaW50MTYgaW5bOF0gPSB7IC0zMDAwMCwgMjQ1NzYsIC0xNjM4MywgMjU2LCAtMTI4LCAwLCAtMjQ1NzYsIDMwMDAwIH07CisgIGdpbnQxNiByZXNbOF07CisKKyAgZHluYW1pYyA9IHNldHVwX2R5bmFtaWMgKCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGR5bmFtaWMpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChkeW5hbWljKSwgImNoYXJhY3RlcmlzdGljcyIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChkeW5hbWljKSwgInJhdGlvIiwgMi4wLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZHluYW1pYyksICJ0aHJlc2hvbGQiLCAwLjUsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChkeW5hbWljLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDE2KTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChpbmJ1ZmZlciwgMCwgaW4sIDE2KTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChpbmJ1ZmZlciwgMCwgaW4sIDE2KSA9PSAwKTsKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChEWU5BTUlDX0NBUFNfU1RSSU5HKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGR5bmFtaWMsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2V4dHJhY3QgKG91dGJ1ZmZlciwgMCwgcmVzLCAxNikgPT0gMTYpOworCisgIGZhaWxfdW5sZXNzIChyZXNbMF0gPT0gaW5bMF0pOworICBmYWlsX3VubGVzcyAocmVzWzFdID09IGluWzFdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1syXSA+IGluWzJdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1szXSA8IGluWzNdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1s0XSA+IGluWzRdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1s1XSA9PSBpbls1XSk7CisgIGZhaWxfdW5sZXNzIChyZXNbNl0gPT0gaW5bNl0pOworICBmYWlsX3VubGVzcyAocmVzWzddID09IGluWzddKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfZHluYW1pYyAoZHluYW1pYyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZXhwYW5kX3NvZnRfNTBfMjAwKQoreworICBHc3RFbGVtZW50ICpkeW5hbWljOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnaW50MTYgaW5bOF0gPSB7IC0zMDAwMCwgMjQ1NzYsIC0xNjM4MywgMjU2LCAtMTI4LCAwLCAtMjQ1NzYsIDMwMDAwIH07CisgIGdpbnQxNiByZXNbOF07CisKKyAgZHluYW1pYyA9IHNldHVwX2R5bmFtaWMgKCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGR5bmFtaWMpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChkeW5hbWljKSwgImNoYXJhY3RlcmlzdGljcyIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChkeW5hbWljKSwgInJhdGlvIiwgMi4wLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZHluYW1pYyksICJ0aHJlc2hvbGQiLCAwLjUsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChkeW5hbWljLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDE2KTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChpbmJ1ZmZlciwgMCwgaW4sIDE2KTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChpbmJ1ZmZlciwgMCwgaW4sIDE2KSA9PSAwKTsKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChEWU5BTUlDX0NBUFNfU1RSSU5HKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGR5bmFtaWMsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2V4dHJhY3QgKG91dGJ1ZmZlciwgMCwgcmVzLCAxNikgPT0gMTYpOworCisgIGZhaWxfdW5sZXNzIChyZXNbMF0gPT0gaW5bMF0pOworICBmYWlsX3VubGVzcyAocmVzWzFdID09IGluWzFdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1syXSA+IGluWzJdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1szXSA8IGluWzNdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1s0XSA+IGluWzRdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1s1XSA9PSBpbls1XSk7CisgIGZhaWxfdW5sZXNzIChyZXNbNl0gPT0gaW5bNl0pOworICBmYWlsX3VubGVzcyAocmVzWzddID09IGluWzddKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfZHluYW1pYyAoZHluYW1pYyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZXhwYW5kX2hhcmRfMF8yMDApCit7CisgIEdzdEVsZW1lbnQgKmR5bmFtaWM7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdpbnQxNiBpbls4XSA9IHsgLTMwMDAwLCAyNDU3NiwgLTE2MzgzLCAyNTYsIC0xMjgsIDAsIC0yNDU3NiwgMzAwMDAgfTsKKyAgZ2ludDE2IHJlc1s4XTsKKworICBkeW5hbWljID0gc2V0dXBfZHluYW1pYyAoKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZHluYW1pYyksICJtb2RlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGR5bmFtaWMpLCAiY2hhcmFjdGVyaXN0aWNzIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGR5bmFtaWMpLCAicmF0aW8iLCAyLjAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChkeW5hbWljKSwgInRocmVzaG9sZCIsIDAuMCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGR5bmFtaWMsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTYpOworICBnc3RfYnVmZmVyX2ZpbGwgKGluYnVmZmVyLCAwLCBpbiwgMTYpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKGluYnVmZmVyLCAwLCBpbiwgMTYpID09IDApOworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKERZTkFNSUNfQ0FQU19TVFJJTkcpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgZHluYW1pYywgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZXh0cmFjdCAob3V0YnVmZmVyLCAwLCByZXMsIDE2KSA9PSAxNik7CisKKyAgZmFpbF91bmxlc3MgKHJlc1swXSA9PSBpblswXSk7CisgIGZhaWxfdW5sZXNzIChyZXNbMV0gPT0gaW5bMV0pOworICBmYWlsX3VubGVzcyAocmVzWzJdID09IGluWzJdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1szXSA9PSBpblszXSk7CisgIGZhaWxfdW5sZXNzIChyZXNbNF0gPT0gaW5bNF0pOworICBmYWlsX3VubGVzcyAocmVzWzVdID09IGluWzVdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1s2XSA9PSBpbls2XSk7CisgIGZhaWxfdW5sZXNzIChyZXNbN10gPT0gaW5bN10pOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9keW5hbWljIChkeW5hbWljKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorZHluYW1pY19zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJkeW5hbWljIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3Bhc3N0aHJvdWdoKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2NvbXByZXNzX2hhcmRfNTBfNTApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfY29tcHJlc3Nfc29mdF81MF81MCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9jb21wcmVzc19oYXJkXzEwMF81MCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9leHBhbmRfaGFyZF81MF8yMDApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZXhwYW5kX3NvZnRfNTBfMjAwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2V4cGFuZF9oYXJkXzBfMjAwKTsKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChkeW5hbWljKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZWNoby5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9lY2hvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI1YjcxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZWNoby5jCkBAIC0wLDAgKzEsMjQwIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCitnYm9vbGVhbiBoYXZlX2VvcyA9IEZBTFNFOworCisvKiBGb3IgZWFzZSBvZiBwcm9ncmFtbWluZyB3ZSB1c2UgZ2xvYmFscyB0byBrZWVwIHJlZnMgZm9yIG91ciBmbG9hdGluZworICogc3JjIGFuZCBzaW5rIHBhZHMgd2UgY3JlYXRlOyBvdGhlcndpc2Ugd2UgYWx3YXlzIGhhdmUgdG8gZG8gZ2V0X3BhZCwKKyAqIGdldF9wZWVyLCBhbmQgdGhlbiByZW1vdmUgcmVmZXJlbmNlcyBpbiBldmVyeSB0ZXN0IGZ1bmN0aW9uICovCitHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworCisjZGVmaW5lIEVDSE9fQ0FQU19TVFJJTkcgICAgXAorICAgICJhdWRpby94LXJhdywgIiAgICAgICAgICAgICAgIFwKKyAgICAiY2hhbm5lbHMgPSAoaW50KSAyLCAiICAgICAgICAgICAgICBcCisgICAgImNoYW5uZWwtbWFzayA9IChiaXRtYXNrKSAzLCAiICAgICAgXAorICAgICJyYXRlID0gKGludCkgMTAwMDAwLCAiICAgICAgICAgICAgIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgICBcCisgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FKEY2NCkKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxLCAgTUFYIF0sICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgIgorICAgICAgICBHU1RfQVVESU9fTkUgKEYzMikgIiwgIiBHU1RfQVVESU9fTkUgKEY2NCkgIiB9IikpOworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxLCAgTUFYIF0sICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgIgorICAgICAgICBHU1RfQVVESU9fTkUgKEYzMikgIiwgIiBHU1RfQVVESU9fTkUgKEY2NCkgIiB9IikpOworCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF9lY2hvICh2b2lkKQoreworICBHc3RFbGVtZW50ICplY2hvOworCisgIEdTVF9ERUJVRyAoInNldHVwX2VjaG8iKTsKKyAgZWNobyA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgiYXVkaW9lY2hvIik7CisgIG15c3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKGVjaG8sICZzcmN0ZW1wbGF0ZSk7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAoZWNobywgJnNpbmt0ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgcmV0dXJuIGVjaG87Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX2VjaG8gKEdzdEVsZW1lbnQgKiBlY2hvKQoreworICBHU1RfREVCVUcgKCJjbGVhbnVwX2VjaG8iKTsKKworICBnX2xpc3RfZm9yZWFjaCAoYnVmZmVycywgKEdGdW5jKSBnc3RfbWluaV9vYmplY3RfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIEZBTFNFKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKGVjaG8pOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKGVjaG8pOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAoZWNobyk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3Bhc3N0aHJvdWdoKQoreworICBHc3RFbGVtZW50ICplY2hvOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlIGluW10gPSB7IDEuMCwgLTEuMCwgMC4wLCAwLjUsIC0wLjUsIDAuMCB9OworICBnZG91YmxlIHJlc1s2XTsKKworICBlY2hvID0gc2V0dXBfZWNobyAoKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZWNobyksICJkZWxheSIsIChHc3RDbG9ja1RpbWUpIDEsICJpbnRlbnNpdHkiLCAwLjAsCisgICAgICAiZmVlZGJhY2siLCAwLjAsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlY2hvLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChFQ0hPX0NBUFNfU1RSSU5HKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGVjaG8sIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBpbmJ1ZmZlciA9CisgICAgICBnc3RfYnVmZmVyX25ld193cmFwcGVkX2Z1bGwgKEdTVF9NRU1PUllfRkxBR19SRUFET05MWSwgaW4sIHNpemVvZiAoaW4pLCAwLAorICAgICAgc2l6ZW9mIChpbiksIE5VTEwsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKGluYnVmZmVyLCAwLCBpbiwgc2l6ZW9mIChpbikpID09IDApOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBidXQgaXQgZW5kcyB1cCBiZWluZyBjb2xsZWN0ZWQgb24gdGhlIGdsb2JhbCBidWZmZXIgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2V4dHJhY3QgKG91dGJ1ZmZlciwgMCwgcmVzLAorICAgICAgICAgIHNpemVvZiAocmVzKSkgPT0gc2l6ZW9mIChyZXMpKTsKKyAgR1NUX0lORk8KKyAgICAgICgiZXhwZWN0ZWQgJStsZiAlK2xmICUrbGYgJStsZiAlK2xmICUrbGYgcmVhbCAlK2xmICUrbGYgJStsZiAlK2xmICUrbGYgJStsZiIsCisgICAgICBpblswXSwgaW5bMV0sIGluWzJdLCBpblszXSwgaW5bNF0sIGluWzVdLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLCByZXNbM10sCisgICAgICByZXNbNF0sIHJlc1s1XSk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAob3V0YnVmZmVyLCAwLCBpbiwgc2l6ZW9mIChpbikpID09IDApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9lY2hvIChlY2hvKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9lY2hvKQoreworICBHc3RFbGVtZW50ICplY2hvOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlIGluW10gPSB7IDEuMCwgLTEuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIH07CisgIGdkb3VibGUgb3V0W10gPSB7IDEuMCwgLTEuMCwgMC4wLCAwLjAsIDEuMCwgLTEuMCwgMC4wLCAwLjAsIDAuMCwgMC4wIH07CisgIGdkb3VibGUgcmVzWzEwXTsKKworICBlY2hvID0gc2V0dXBfZWNobyAoKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZWNobyksICJkZWxheSIsIChHc3RDbG9ja1RpbWUpIDIwMDAwLCAiaW50ZW5zaXR5IiwKKyAgICAgIDEuMCwgImZlZWRiYWNrIiwgMC4wLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWNobywKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoRUNIT19DQVBTX1NUUklORyk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBlY2hvLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgaW5idWZmZXIgPQorICAgICAgZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZF9mdWxsIChHU1RfTUVNT1JZX0ZMQUdfUkVBRE9OTFksIGluLCBzaXplb2YgKGluKSwgMCwKKyAgICAgIHNpemVvZiAoaW4pLCBOVUxMLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChpbmJ1ZmZlciwgMCwgaW4sIHNpemVvZiAoaW4pKSA9PSAwKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYnV0IGl0IGVuZHMgdXAgYmVpbmcgY29sbGVjdGVkIG9uIHRoZSBnbG9iYWwgYnVmZmVyIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9leHRyYWN0IChvdXRidWZmZXIsIDAsIHJlcywKKyAgICAgICAgICBzaXplb2YgKHJlcykpID09IHNpemVvZiAocmVzKSk7CisgIEdTVF9JTkZPCisgICAgICAoImV4cGVjdGVkICUrbGYgJStsZiAlK2xmICUrbGYgJStsZiAlK2xmICUrbGYgJStsZiAlK2xmICUrbGYgcmVhbCAlK2xmICUrbGYgJStsZiAlK2xmICUrbGYgJStsZiAlK2xmICUrbGYgJStsZiAlK2xmIiwKKyAgICAgIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSwgb3V0WzRdLCBvdXRbNV0sIG91dFs2XSwgb3V0WzddLCBvdXRbOF0sCisgICAgICBvdXRbOV0sIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSwgcmVzWzRdLCByZXNbNV0sIHJlc1s2XSwgcmVzWzddLAorICAgICAgcmVzWzhdLCByZXNbOV0pOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgMCwgb3V0LCBzaXplb2YgKG91dCkpID09IDApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9lY2hvIChlY2hvKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mZWVkYmFjaykKK3sKKyAgR3N0RWxlbWVudCAqZWNobzsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSBpbltdID0geyAxLjAsIC0xLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCB9OworICBnZG91YmxlIG91dFtdID0geyAxLjAsIC0xLjAsIDAuMCwgMC4wLCAxLjAsIC0xLjAsIDAuMCwgMC4wLCAxLjAsIC0xLjAgfTsKKyAgZ2RvdWJsZSByZXNbMTBdOworCisgIGVjaG8gPSBzZXR1cF9lY2hvICgpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChlY2hvKSwgImRlbGF5IiwgKEdzdENsb2NrVGltZSkgMjAwMDAsICJpbnRlbnNpdHkiLAorICAgICAgMS4wLCAiZmVlZGJhY2siLCAxLjAsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlY2hvLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChFQ0hPX0NBUFNfU1RSSU5HKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGVjaG8sIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBpbmJ1ZmZlciA9CisgICAgICBnc3RfYnVmZmVyX25ld193cmFwcGVkX2Z1bGwgKEdTVF9NRU1PUllfRkxBR19SRUFET05MWSwgaW4sIHNpemVvZiAoaW4pLCAwLAorICAgICAgc2l6ZW9mIChpbiksIE5VTEwsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKGluYnVmZmVyLCAwLCBpbiwgc2l6ZW9mIChpbikpID09IDApOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBidXQgaXQgZW5kcyB1cCBiZWluZyBjb2xsZWN0ZWQgb24gdGhlIGdsb2JhbCBidWZmZXIgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2V4dHJhY3QgKG91dGJ1ZmZlciwgMCwgcmVzLAorICAgICAgICAgIHNpemVvZiAocmVzKSkgPT0gc2l6ZW9mIChyZXMpKTsKKyAgR1NUX0lORk8KKyAgICAgICgiZXhwZWN0ZWQgJStsZiAlK2xmICUrbGYgJStsZiAlK2xmICUrbGYgJStsZiAlK2xmICUrbGYgJStsZiByZWFsICUrbGYgJStsZiAlK2xmICUrbGYgJStsZiAlK2xmICUrbGYgJStsZiAlK2xmICUrbGYiLAorICAgICAgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdLCBvdXRbNF0sIG91dFs1XSwgb3V0WzZdLCBvdXRbN10sIG91dFs4XSwKKyAgICAgIG91dFs5XSwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdLCByZXNbNF0sIHJlc1s1XSwgcmVzWzZdLCByZXNbN10sCisgICAgICByZXNbOF0sIHJlc1s5XSk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAob3V0YnVmZmVyLCAwLCBvdXQsIHNpemVvZiAob3V0KSkgPT0gMCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2VjaG8gKGVjaG8pOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCithdWRpb2VjaG9fc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiYXVkaW9lY2hvIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3Bhc3N0aHJvdWdoKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2VjaG8pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZmVlZGJhY2spOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoYXVkaW9lY2hvKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZmlyZmlsdGVyLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2ZpcmZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YjQ1MmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2ZpcmZpbHRlci5jCkBAIC0wLDAgKzEsMTkzIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyogRklYTUUgMC4xMTogc3VwcHJlc3Mgd2FybmluZ3MgZm9yIGRlcHJlY2F0ZWQgQVBJIHN1Y2ggYXMgR1ZhbHVlQXJyYXkKKyAqIHdpdGggbmV3ZXIgR0xpYiB2ZXJzaW9ucyAoPj0gMi4zMS4wKSAqLworI2RlZmluZSBHTElCX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworc3RhdGljIGdib29sZWFuIGhhdmVfZW9zID0gRkFMU0U7CisKK3N0YXRpYyBnYm9vbGVhbgorb25fbWVzc2FnZSAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHTWFpbkxvb3AgKmxvb3AgPSAoR01haW5Mb29wICopIHVzZXJfZGF0YTsKKworICBzd2l0Y2ggKEdTVF9NRVNTQUdFX1RZUEUgKG1lc3NhZ2UpKSB7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FUlJPUjoKKyAgICBjYXNlIEdTVF9NRVNTQUdFX1dBUk5JTkc6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VPUzoKKyAgICAgIGhhdmVfZW9zID0gVFJVRTsKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9yYXRlX2NoYW5nZWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBnaW50IHJhdGUsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR1ZhbHVlQXJyYXkgKnZhOworICBHVmFsdWUgdiA9IHsgMCwgfTsKKworICBmYWlsX3VubGVzcyAocmF0ZSA+IDApOworCisgIHZhID0gZ192YWx1ZV9hcnJheV9uZXcgKDYpOworCisgIGdfdmFsdWVfaW5pdCAoJnYsIEdfVFlQRV9ET1VCTEUpOworICBnX3ZhbHVlX3NldF9kb3VibGUgKCZ2LCAwLjApOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAodmEsICZ2KTsKKyAgZ192YWx1ZV9yZXNldCAoJnYpOworICBnX3ZhbHVlX3NldF9kb3VibGUgKCZ2LCAwLjApOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAodmEsICZ2KTsKKyAgZ192YWx1ZV9yZXNldCAoJnYpOworICBnX3ZhbHVlX3NldF9kb3VibGUgKCZ2LCAwLjApOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAodmEsICZ2KTsKKyAgZ192YWx1ZV9yZXNldCAoJnYpOworICBnX3ZhbHVlX3NldF9kb3VibGUgKCZ2LCAwLjApOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAodmEsICZ2KTsKKyAgZ192YWx1ZV9yZXNldCAoJnYpOworICBnX3ZhbHVlX3NldF9kb3VibGUgKCZ2LCAwLjApOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAodmEsICZ2KTsKKyAgZ192YWx1ZV9yZXNldCAoJnYpOworICBnX3ZhbHVlX3NldF9kb3VibGUgKCZ2LCAxLjApOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAodmEsICZ2KTsKKyAgZ192YWx1ZV9yZXNldCAoJnYpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGVsZW1lbnQpLCAia2VybmVsIiwgdmEsIE5VTEwpOworCisgIGdfdmFsdWVfYXJyYXlfZnJlZSAodmEpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4gaGF2ZV9kYXRhID0gRkFMU0U7CisKK3N0YXRpYyB2b2lkCitvbl9oYW5kb2ZmIChHc3RFbGVtZW50ICogb2JqZWN0LCBHc3RCdWZmZXIgKiBidWZmZXIsIEdzdFBhZCAqIHBhZCwKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGlmICghaGF2ZV9kYXRhKSB7CisgICAgR3N0TWFwSW5mbyBtYXA7CisgICAgZ2RvdWJsZSAqZGF0YTsKKworICAgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgZGF0YSA9IChnZG91YmxlICopIG1hcC5kYXRhOworCisgICAgZmFpbF91bmxlc3MgKG1hcC5zaXplID4gNSAqIHNpemVvZiAoZ2RvdWJsZSkpOworICAgIGZhaWxfdW5sZXNzIChkYXRhWzBdID09IDAuMCk7CisgICAgZmFpbF91bmxlc3MgKGRhdGFbMV0gPT0gMC4wKTsKKyAgICBmYWlsX3VubGVzcyAoZGF0YVsyXSA9PSAwLjApOworICAgIGZhaWxfdW5sZXNzIChkYXRhWzNdID09IDAuMCk7CisgICAgZmFpbF91bmxlc3MgKGRhdGFbNF0gPT0gMC4wKTsKKyAgICBmYWlsX3VubGVzcyAoZGF0YVs1XSAhPSAwLjApOworCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBoYXZlX2RhdGEgPSBUUlVFOworICB9Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BpcGVsaW5lKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZSwgKnNyYywgKmNmaWx0ZXIsICpmaWx0ZXIsICpzaW5rOworICBHc3RDYXBzICpjYXBzOworICBHc3RCdXMgKmJ1czsKKyAgR01haW5Mb29wICpsb29wOworCisgIGhhdmVfZGF0YSA9IEZBTFNFOworICBoYXZlX2VvcyA9IEZBTFNFOworCisgIHBpcGVsaW5lID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicGlwZWxpbmUiLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHBpcGVsaW5lICE9IE5VTEwpOworCisgIHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvdGVzdHNyYyIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoc3JjICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzcmMpLCAibnVtLWJ1ZmZlcnMiLCAxMDAwLCBOVUxMKTsKKworICBjZmlsdGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiY2Fwc2ZpbHRlciIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoY2ZpbHRlciAhPSBOVUxMKTsKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19CSUdfRU5ESUFOCisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLAorICAgICAgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJGNjRCRSIsIE5VTEwpOworI2Vsc2UKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsCisgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIkY2NExFIiwgTlVMTCk7CisjZW5kaWYKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoY2ZpbHRlciksICJjYXBzIiwgY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBmaWx0ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb2ZpcmZpbHRlciIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZmlsdGVyICE9IE5VTEwpOworICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAoZmlsdGVyKSwgInJhdGUtY2hhbmdlZCIsCisgICAgICBHX0NBTExCQUNLIChvbl9yYXRlX2NoYW5nZWQpLCBOVUxMKTsKKworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHNpbmsgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHNpbmspLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChzaW5rKSwgImhhbmRvZmYiLCBHX0NBTExCQUNLIChvbl9oYW5kb2ZmKSwgTlVMTCk7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBzcmMsIGNmaWx0ZXIsIGZpbHRlciwgc2luaywgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rX21hbnkgKHNyYywgY2ZpbHRlciwgZmlsdGVyLCBzaW5rLCBOVUxMKSk7CisKKyAgbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgRkFMU0UpOworCisgIGJ1cyA9IGdzdF9waXBlbGluZV9nZXRfYnVzIChHU1RfUElQRUxJTkUgKHBpcGVsaW5lKSk7CisgIGdzdF9idXNfYWRkX3NpZ25hbF93YXRjaCAoYnVzKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoR19PQkpFQ1QgKGJ1cyksICJtZXNzYWdlIiwgR19DQUxMQkFDSyAob25fbWVzc2FnZSksIGxvb3ApOworCisgIGZhaWxfaWYgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgZ19tYWluX2xvb3BfcnVuIChsb29wKTsKKworICBmYWlsX3VubGVzcyAoaGF2ZV9kYXRhKTsKKyAgZmFpbF91bmxlc3MgKGhhdmVfZW9zKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwKKyAgICAgICAgICBHU1RfU1RBVEVfTlVMTCkgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBnc3RfYnVzX3JlbW92ZV9zaWduYWxfd2F0Y2ggKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1QgKGJ1cykpOworICBnX21haW5fbG9vcF91bnJlZiAobG9vcCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorYXVkaW9maXJmaWx0ZXJfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiYXVkaW9maXJmaWx0ZXIiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGlwZWxpbmUpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoYXVkaW9maXJmaWx0ZXIpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9paXJmaWx0ZXIuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvaWlyZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYyYzlkMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvaWlyZmlsdGVyLmMKQEAgLTAsMCArMSwxOTAgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKiBGSVhNRSAwLjExOiBzdXBwcmVzcyB3YXJuaW5ncyBmb3IgZGVwcmVjYXRlZCBBUEkgc3VjaCBhcyBHVmFsdWVBcnJheQorICogd2l0aCBuZXdlciBHTGliIHZlcnNpb25zICg+PSAyLjMxLjApICovCisjZGVmaW5lIEdMSUJfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCitzdGF0aWMgZ2Jvb2xlYW4gaGF2ZV9lb3MgPSBGQUxTRTsKKworc3RhdGljIGdib29sZWFuCitvbl9tZXNzYWdlIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdNYWluTG9vcCAqbG9vcCA9IChHTWFpbkxvb3AgKikgdXNlcl9kYXRhOworCisgIHN3aXRjaCAoR1NUX01FU1NBR0VfVFlQRSAobWVzc2FnZSkpIHsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VSUk9SOgorICAgIGNhc2UgR1NUX01FU1NBR0VfV0FSTklORzoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgR1NUX01FU1NBR0VfRU9TOgorICAgICAgaGF2ZV9lb3MgPSBUUlVFOworICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK29uX3JhdGVfY2hhbmdlZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIGdpbnQgcmF0ZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHVmFsdWVBcnJheSAqdmE7CisgIEdWYWx1ZSB2ID0geyAwLCB9OworCisgIGZhaWxfdW5sZXNzIChyYXRlID4gMCk7CisKKyAgdmEgPSBnX3ZhbHVlX2FycmF5X25ldyAoNik7CisKKyAgZ192YWx1ZV9pbml0ICgmdiwgR19UWVBFX0RPVUJMRSk7CisgIGdfdmFsdWVfc2V0X2RvdWJsZSAoJnYsIDAuMCk7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kICh2YSwgJnYpOworICBnX3ZhbHVlX3Jlc2V0ICgmdik7CisgIGdfdmFsdWVfc2V0X2RvdWJsZSAoJnYsIDAuMCk7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kICh2YSwgJnYpOworICBnX3ZhbHVlX3Jlc2V0ICgmdik7CisgIGdfdmFsdWVfc2V0X2RvdWJsZSAoJnYsIDAuMCk7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kICh2YSwgJnYpOworICBnX3ZhbHVlX3Jlc2V0ICgmdik7CisgIGdfdmFsdWVfc2V0X2RvdWJsZSAoJnYsIDAuMCk7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kICh2YSwgJnYpOworICBnX3ZhbHVlX3Jlc2V0ICgmdik7CisgIGdfdmFsdWVfc2V0X2RvdWJsZSAoJnYsIDAuMCk7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kICh2YSwgJnYpOworICBnX3ZhbHVlX3Jlc2V0ICgmdik7CisgIGdfdmFsdWVfc2V0X2RvdWJsZSAoJnYsIDEuMCk7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kICh2YSwgJnYpOworICBnX3ZhbHVlX3Jlc2V0ICgmdik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZWxlbWVudCksICJiIiwgdmEsIE5VTEwpOworCisgIGdfdmFsdWVfYXJyYXlfZnJlZSAodmEpOworCisgIHZhID0gZ192YWx1ZV9hcnJheV9uZXcgKDYpOworCisgIGdfdmFsdWVfc2V0X2RvdWJsZSAoJnYsIDEuMCk7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kICh2YSwgJnYpOworICBnX3ZhbHVlX3Jlc2V0ICgmdik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZWxlbWVudCksICJhIiwgdmEsIE5VTEwpOworCisgIGdfdmFsdWVfYXJyYXlfZnJlZSAodmEpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4gaGF2ZV9kYXRhID0gRkFMU0U7CisKK3N0YXRpYyB2b2lkCitvbl9oYW5kb2ZmIChHc3RFbGVtZW50ICogb2JqZWN0LCBHc3RCdWZmZXIgKiBidWZmZXIsIEdzdFBhZCAqIHBhZCwKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGlmICghaGF2ZV9kYXRhKSB7CisgICAgR3N0TWFwSW5mbyBtYXA7CisgICAgZ2Zsb2F0ICpkYXRhOworCisgICAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCkpOworICAgIGRhdGEgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworCisgICAgZmFpbF91bmxlc3MgKG1hcC5zaXplID4gNSAqIHNpemVvZiAoZ2RvdWJsZSkpOworICAgIGZhaWxfdW5sZXNzIChkYXRhWzBdID09IDAuMCk7CisgICAgZmFpbF91bmxlc3MgKGRhdGFbMV0gPT0gMC4wKTsKKyAgICBmYWlsX3VubGVzcyAoZGF0YVsyXSA9PSAwLjApOworICAgIGZhaWxfdW5sZXNzIChkYXRhWzNdID09IDAuMCk7CisgICAgZmFpbF91bmxlc3MgKGRhdGFbNF0gPT0gMC4wKTsKKyAgICBmYWlsX3VubGVzcyAoZGF0YVs1XSAhPSAwLjApOworCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBoYXZlX2RhdGEgPSBUUlVFOworICB9Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BpcGVsaW5lKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZSwgKnNyYywgKmZpbHRlciwgKnNpbms7CisgIEdzdEJ1cyAqYnVzOworICBHTWFpbkxvb3AgKmxvb3A7CisKKyAgaGF2ZV9kYXRhID0gRkFMU0U7CisgIGhhdmVfZW9zID0gRkFMU0U7CisKKyAgcGlwZWxpbmUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJwaXBlbGluZSIsIE5VTEwpOworICBmYWlsX3VubGVzcyAocGlwZWxpbmUgIT0gTlVMTCk7CisKKyAgc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW90ZXN0c3JjIiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChzcmMgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHNyYyksICJudW0tYnVmZmVycyIsIDEwMDAsIE5VTEwpOworCisgIGZpbHRlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvaWlyZmlsdGVyIiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChmaWx0ZXIgIT0gTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChmaWx0ZXIpLCAicmF0ZS1jaGFuZ2VkIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKG9uX3JhdGVfY2hhbmdlZCksIE5VTEwpOworCisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoc2luayAhPSBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc2luayksICJzaWduYWwtaGFuZG9mZnMiLCBUUlVFLCBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoR19PQkpFQ1QgKHNpbmspLCAiaGFuZG9mZiIsIEdfQ0FMTEJBQ0sgKG9uX2hhbmRvZmYpLCBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHNyYywgZmlsdGVyLCBzaW5rLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmtfbWFueSAoc3JjLCBmaWx0ZXIsIHNpbmssIE5VTEwpKTsKKworICBsb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisKKyAgYnVzID0gZ3N0X3BpcGVsaW5lX2dldF9idXMgKEdTVF9QSVBFTElORSAocGlwZWxpbmUpKTsKKyAgZ3N0X2J1c19hZGRfc2lnbmFsX3dhdGNoIChidXMpOworICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAoYnVzKSwgIm1lc3NhZ2UiLCBHX0NBTExCQUNLIChvbl9tZXNzYWdlKSwgbG9vcCk7CisKKyAgZmFpbF9pZiAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBnX21haW5fbG9vcF9ydW4gKGxvb3ApOworCisgIGZhaWxfdW5sZXNzIChoYXZlX2RhdGEpOworICBmYWlsX3VubGVzcyAoaGF2ZV9lb3MpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLAorICAgICAgICAgIEdTVF9TVEFURV9OVUxMKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGdzdF9idXNfcmVtb3ZlX3NpZ25hbF93YXRjaCAoYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoR1NUX09CSkVDVCAoYnVzKSk7CisgIGdfbWFpbl9sb29wX3VucmVmIChsb29wKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCithdWRpb2lpcmZpbHRlcl9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJhdWRpb2lpcmZpbHRlciIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9waXBlbGluZSk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChhdWRpb2lpcmZpbHRlcik7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2ludmVydC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9pbnZlcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTIxZmRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9pbnZlcnQuYwpAQCAtMCwwICsxLDI4NCBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciBhdWRpb2ludmVydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKgorICogR3JlYXRseSBiYXNlZCBvbiB0aGUgYXVkaW9wYW5vcmFtYSB1bml0IHRlc3QKKyAqIENvcHlyaWdodCAoQykgMjAwNiBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCitnYm9vbGVhbiBoYXZlX2VvcyA9IEZBTFNFOworCisvKiBGb3IgZWFzZSBvZiBwcm9ncmFtbWluZyB3ZSB1c2UgZ2xvYmFscyB0byBrZWVwIHJlZnMgZm9yIG91ciBmbG9hdGluZworICogc3JjIGFuZCBzaW5rIHBhZHMgd2UgY3JlYXRlOyBvdGhlcndpc2Ugd2UgYWx3YXlzIGhhdmUgdG8gZG8gZ2V0X3BhZCwKKyAqIGdldF9wZWVyLCBhbmQgdGhlbiByZW1vdmUgcmVmZXJlbmNlcyBpbiBldmVyeSB0ZXN0IGZ1bmN0aW9uICovCitHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworCisKKyNkZWZpbmUgSU5WRVJUX0NBUFNfU1RSSU5HICAgIFwKKyAgICAiYXVkaW8veC1yYXcsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiZm9ybWF0ID0gKHN0cmluZykgIkdTVF9BVURJT19ORShTMTYpIiwgIiAgIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgICAgICAgICAgIFwKKyAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicmF0ZSA9IChpbnQpIDQ0MTAwIgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChTMTYpICIsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgInJhdGUgPSAoaW50KSBbIDEsICBNQVggXSIpCisgICAgKTsKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKFMxNikgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAicmF0ZSA9IChpbnQpIFsgMSwgIE1BWCBdIikKKyAgICApOworCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF9pbnZlcnQgKHZvaWQpCit7CisgIEdzdEVsZW1lbnQgKmludmVydDsKKworICBHU1RfREVCVUcgKCJzZXR1cF9pbnZlcnQiKTsKKyAgaW52ZXJ0ID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJhdWRpb2ludmVydCIpOworICBteXNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkIChpbnZlcnQsICZzcmN0ZW1wbGF0ZSk7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAoaW52ZXJ0LCAmc2lua3RlbXBsYXRlKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICByZXR1cm4gaW52ZXJ0OworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF9pbnZlcnQgKEdzdEVsZW1lbnQgKiBpbnZlcnQpCit7CisgIEdTVF9ERUJVRyAoImNsZWFudXBfaW52ZXJ0Iik7CisKKyAgZ19saXN0X2ZvcmVhY2ggKGJ1ZmZlcnMsIChHRnVuYykgZ3N0X21pbmlfb2JqZWN0X3VucmVmLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKGJ1ZmZlcnMpOworICBidWZmZXJzID0gTlVMTDsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBGQUxTRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBGQUxTRSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zcmNfcGFkIChpbnZlcnQpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKGludmVydCk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChpbnZlcnQpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXNzdGhyb3VnaCkKK3sKKyAgR3N0RWxlbWVudCAqaW52ZXJ0OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnaW50MTYgaW5bNF0gPSB7IDE2Mzg0LCAtMjU2LCAxMjgsIC01MTIgfTsKKyAgZ2ludDE2ICpyZXM7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGludmVydCA9IHNldHVwX2ludmVydCAoKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoaW52ZXJ0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDgpOworICBnc3RfYnVmZmVyX2ZpbGwgKGluYnVmZmVyLCAwLCBpbiwgOCk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoaW5idWZmZXIsIDAsIGluLCA4KSA9PSAwKTsKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChJTlZFUlRfQ0FQU19TVFJJTkcpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgaW52ZXJ0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGJ1dCBpdCBlbmRzIHVwIGJlaW5nIGNvbGxlY3RlZCBvbiB0aGUgZ2xvYmFsIGJ1ZmZlciBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdpbnQxNiAqKSBtYXAuZGF0YTsKKyAgR1NUX0lORk8gKCJleHBlY3RlZCAlKzVkICUrNWQgJSs1ZCAlKzVkIHJlYWwgJSs1ZCAlKzVkICUrNWQgJSs1ZCIsCisgICAgICBpblswXSwgaW5bMV0sIGluWzJdLCBpblszXSwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgMCwgaW4sIDgpID09IDApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9pbnZlcnQgKGludmVydCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfemVybykKK3sKKyAgR3N0RWxlbWVudCAqaW52ZXJ0OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnaW50MTYgaW5bNF0gPSB7IDE2Mzg0LCAtMjU2LCAxMjgsIC01MTIgfTsKKyAgZ2ludDE2IG91dFs0XSA9IHsgMCwgMCwgMCwgMCB9OworICBnaW50MTYgKnJlczsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgaW52ZXJ0ID0gc2V0dXBfaW52ZXJ0ICgpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChpbnZlcnQpLCAiZGVncmVlIiwgMC41LCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoaW52ZXJ0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDgpOworICBnc3RfYnVmZmVyX2ZpbGwgKGluYnVmZmVyLCAwLCBpbiwgOCk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoaW5idWZmZXIsIDAsIGluLCA4KSA9PSAwKTsKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChJTlZFUlRfQ0FQU19TVFJJTkcpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgaW52ZXJ0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2ludDE2ICopIG1hcC5kYXRhOworICBHU1RfSU5GTyAoImV4cGVjdGVkICUrNWQgJSs1ZCAlKzVkICUrNWQgcmVhbCAlKzVkICUrNWQgJSs1ZCAlKzVkIiwKKyAgICAgIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgMCwgb3V0LCA4KSA9PSAwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfaW52ZXJ0IChpbnZlcnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2Z1bGxfaW52ZXJzZSkKK3sKKyAgR3N0RWxlbWVudCAqaW52ZXJ0OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnaW50MTYgaW5bNF0gPSB7IDE2Mzg0LCAtMjU2LCAxMjgsIC01MTIgfTsKKyAgZ2ludDE2IG91dFs0XSA9IHsgLTE2Mzg1LCAyNTUsIC0xMjksIDUxMSB9OworICBnaW50MTYgKnJlczsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgaW52ZXJ0ID0gc2V0dXBfaW52ZXJ0ICgpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChpbnZlcnQpLCAiZGVncmVlIiwgMS4wLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoaW52ZXJ0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDgpOworICBnc3RfYnVmZmVyX2ZpbGwgKGluYnVmZmVyLCAwLCBpbiwgOCk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoaW5idWZmZXIsIDAsIGluLCA4KSA9PSAwKTsKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChJTlZFUlRfQ0FQU19TVFJJTkcpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgaW52ZXJ0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2ludDE2ICopIG1hcC5kYXRhOworICBHU1RfSU5GTyAoImV4cGVjdGVkICUrNWQgJSs1ZCAlKzVkICUrNWQgcmVhbCAlKzVkICUrNWQgJSs1ZCAlKzVkIiwKKyAgICAgIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgMCwgb3V0LCA4KSA9PSAwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfaW52ZXJ0IChpbnZlcnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0XzI1X2ludmVyc2UpCit7CisgIEdzdEVsZW1lbnQgKmludmVydDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2ludDE2IGluWzRdID0geyAxNjM4NCwgLTI1NiwgMTI4LCAtNTEyIH07CisgIGdpbnQxNiBvdXRbNF0gPSB7IDgxOTEsIC0xMjgsIDYzLCAtMjU2IH07CisgIGdpbnQxNiAqcmVzOworICBHc3RNYXBJbmZvIG1hcDsKKworICBpbnZlcnQgPSBzZXR1cF9pbnZlcnQgKCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGludmVydCksICJkZWdyZWUiLCAwLjI1LCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoaW52ZXJ0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDgpOworICBnc3RfYnVmZmVyX2ZpbGwgKGluYnVmZmVyLCAwLCBpbiwgOCk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoaW5idWZmZXIsIDAsIGluLCA4KSA9PSAwKTsKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChJTlZFUlRfQ0FQU19TVFJJTkcpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgaW52ZXJ0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2ludDE2ICopIG1hcC5kYXRhOworICBHU1RfSU5GTyAoImV4cGVjdGVkICUrNWQgJSs1ZCAlKzVkICUrNWQgcmVhbCAlKzVkICUrNWQgJSs1ZCAlKzVkIiwKKyAgICAgIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgMCwgb3V0LCA4KSA9PSAwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfaW52ZXJ0IChpbnZlcnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitpbnZlcnRfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiaW52ZXJ0Iik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3Bhc3N0aHJvdWdoKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3plcm8pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZnVsbF9pbnZlcnNlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzI1X2ludmVyc2UpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoaW52ZXJ0KTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvcGFub3JhbWEuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvcGFub3JhbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODU3MTE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9wYW5vcmFtYS5jCkBAIC0wLDAgKzEsODE4IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIGF1ZGlvcGFub3JhbWEKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworZ2Jvb2xlYW4gaGF2ZV9lb3MgPSBGQUxTRTsKKworLyogRm9yIGVhc2Ugb2YgcHJvZ3JhbW1pbmcgd2UgdXNlIGdsb2JhbHMgdG8ga2VlcCByZWZzIGZvciBvdXIgZmxvYXRpbmcKKyAqIHNyYyBhbmQgc2luayBwYWRzIHdlIGNyZWF0ZTsgb3RoZXJ3aXNlIHdlIGFsd2F5cyBoYXZlIHRvIGRvIGdldF9wYWQsCisgKiBnZXRfcGVlciwgYW5kIHRoZW4gcmVtb3ZlIHJlZmVyZW5jZXMgaW4gZXZlcnkgdGVzdCBmdW5jdGlvbiAqLworR3N0UGFkICpteXNyY3BhZCwgKm15c2lua3BhZDsKKworCisjZGVmaW5lIFBBTk9SQU1BX1MxNl9NT05PX0NBUFNfU1RSSU5HICAgXAorICAgICJhdWRpby94LXJhdywgIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiICAgICAgICAgICAgICBcCisgICAgInJhdGUgPSAoaW50KSA0NDEwMCwgIiAgICAgICAgICAgICAgXAorICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiAgIFwKKyAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUoUzE2KQorCisjZGVmaW5lIFBBTk9SQU1BX1MxNl9TVEVSRU9fQ0FQU19TVFJJTkcgXAorICAgICJhdWRpby94LXJhdywgIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiY2hhbm5lbHMgPSAoaW50KSAyLCAiICAgICAgICAgICAgICBcCisgICAgImNoYW5uZWwtbWFzayA9IChiaXRtYXNrKSAzLCAiICAgICAgXAorICAgICJyYXRlID0gKGludCkgNDQxMDAsICIgICAgICAgICAgICAgIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgICBcCisgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FKFMxNikKKworI2RlZmluZSBQQU5PUkFNQV9GMzJfTU9OT19DQVBTX1NUUklORyAgIFwKKyAgICAiYXVkaW8veC1yYXcsICIgICAgICAgICAgICAgICAgICAgICBcCisgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAgICAgICAgICAgICAgXAorICAgICJyYXRlID0gKGludCkgNDQxMDAsICIgICAgICAgICAgICAgIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgICBcCisgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FKEYzMikKKworI2RlZmluZSBQQU5PUkFNQV9GMzJfU1RFUkVPX0NBUFNfU1RSSU5HIFwKKyAgICAiYXVkaW8veC1yYXcsICIgICAgICAgICAgICAgICAgICAgICBcCisgICAgImNoYW5uZWxzID0gKGludCkgMiwgIiAgICAgICAgICAgICAgXAorICAgICJjaGFubmVsLW1hc2sgPSAoYml0bWFzaykgMywgIiAgICAgIFwKKyAgICAicmF0ZSA9IChpbnQpIDQ0MTAwLCAiICAgICAgICAgICAgICBcCisgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiICAgXAorICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORShGMzIpCisKKyNkZWZpbmUgUEFOT1JBTUFfV1JPTkdfQ0FQU19TVFJJTkcgIFwKKyAgICAiYXVkaW8veC1yYXcsICIgICAgICAgICAgICAgICAgICAgICBcCisgICAgImNoYW5uZWxzID0gKGludCkgNSwgIiAgICAgICAgICAgICAgXAorICAgICJyYXRlID0gKGludCkgNDQxMDAsICIgICAgICAgICAgICAgIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgICBcCisgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FKFUxNikKKworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlWzJdID0geworICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgICAgR1NUX1BBRF9TSU5LLAorICAgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAgICJjaGFubmVscyA9IChpbnQpIDIsICIKKyAgICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgIE1BWCBdLCAiCisgICAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChTMTYpKQorICAgICAgKSwKKyAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICAgIEdTVF9QQURfU0lOSywKKyAgICAgIEdTVF9QQURfQUxXQVlTLAorICAgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAyLCAiCisgICAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsICBNQVggXSwgIgorICAgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoRjMyKSkKKyAgICAgICksCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgbXNyY3RlbXBsYXRlWzJdID0geworICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgICBHU1RfUEFEX1NSQywKKyAgICAgIEdTVF9QQURfQUxXQVlTLAorICAgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiCisgICAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsICBNQVggXSwgIgorICAgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoUzE2KSkKKyAgICAgICksCisgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICAgIEdTVF9QQURfU1JDLAorICAgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIKKyAgICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgIE1BWCBdLCAiCisgICAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChGMzIpKQorICAgICAgKSwKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzc3JjdGVtcGxhdGVbMl0gPSB7CisgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICAgIEdTVF9QQURfU1JDLAorICAgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAgICJjaGFubmVscyA9IChpbnQpIDIsICIKKyAgICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgIE1BWCBdLCAiCisgICAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChTMTYpKQorICAgICAgKSwKKyAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgICAgR1NUX1BBRF9TUkMsCisgICAgICBHU1RfUEFEX0FMV0FZUywKKyAgICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICAgImNoYW5uZWxzID0gKGludCkgMiwgIgorICAgICAgICAgICJyYXRlID0gKGludCkgWyAxLCAgTUFYIF0sICIKKyAgICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKEYzMikpCisgICAgICApLAorfTsKKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfcGFub3JhbWEgKEdzdFN0YXRpY1BhZFRlbXBsYXRlICogc3JjdGVtcGxhdGUsIGdpbnQgZm10LAorICAgIGNvbnN0IGdjaGFyICogY2Fwc19zdHIpCit7CisgIEdzdEVsZW1lbnQgKnBhbm9yYW1hOworCisgIEdTVF9ERUJVRyAoInNldHVwX3Bhbm9yYW1hIik7CisgIHBhbm9yYW1hID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJhdWRpb3Bhbm9yYW1hIik7CisgIG15c3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKHBhbm9yYW1hLCAmc3JjdGVtcGxhdGVbZm10XSk7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAocGFub3JhbWEsICZzaW5rdGVtcGxhdGVbZm10XSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgaWYgKGNhcHNfc3RyKSB7CisgICAgR3N0Q2FwcyAqY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChjYXBzX3N0cik7CisgICAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIHBhbm9yYW1hLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgfQorICByZXR1cm4gcGFub3JhbWE7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX3Bhbm9yYW1hX3MxNl9tIChnaW50IG1ldGhvZCwgZ2Zsb2F0IHBhbikKK3sKKyAgR3N0RWxlbWVudCAqcGFub3JhbWE7CisgIHBhbm9yYW1hID0gc2V0dXBfcGFub3JhbWEgKG1zcmN0ZW1wbGF0ZSwgMCwgUEFOT1JBTUFfUzE2X01PTk9fQ0FQU19TVFJJTkcpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChwYW5vcmFtYSksICJtZXRob2QiLCBtZXRob2QsICJwYW5vcmFtYSIsIHBhbiwgTlVMTCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGFub3JhbWEsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgR1NUX0RFQlVHICgicGFub3JhbWEobW9ubykgcmVhZHkiKTsKKworICByZXR1cm4gcGFub3JhbWE7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX3Bhbm9yYW1hX2YzMl9tIChnaW50IG1ldGhvZCwgZ2Zsb2F0IHBhbikKK3sKKyAgR3N0RWxlbWVudCAqcGFub3JhbWE7CisgIHBhbm9yYW1hID0gc2V0dXBfcGFub3JhbWEgKG1zcmN0ZW1wbGF0ZSwgMSwgUEFOT1JBTUFfRjMyX01PTk9fQ0FQU19TVFJJTkcpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChwYW5vcmFtYSksICJtZXRob2QiLCBtZXRob2QsICJwYW5vcmFtYSIsIHBhbiwgTlVMTCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGFub3JhbWEsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgR1NUX0RFQlVHICgicGFub3JhbWEobW9ubykgcmVhZHkiKTsKKworICByZXR1cm4gcGFub3JhbWE7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX3Bhbm9yYW1hX3MxNl9zIChnaW50IG1ldGhvZCwgZ2Zsb2F0IHBhbikKK3sKKyAgR3N0RWxlbWVudCAqcGFub3JhbWE7CisgIHBhbm9yYW1hID0gc2V0dXBfcGFub3JhbWEgKHNzcmN0ZW1wbGF0ZSwgMCwgUEFOT1JBTUFfUzE2X1NURVJFT19DQVBTX1NUUklORyk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHBhbm9yYW1hKSwgIm1ldGhvZCIsIG1ldGhvZCwgInBhbm9yYW1hIiwgcGFuLCBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwYW5vcmFtYSwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBHU1RfREVCVUcgKCJwYW5vcmFtYShzdGVyZW8pIHJlYWR5Iik7CisKKyAgcmV0dXJuIHBhbm9yYW1hOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF9wYW5vcmFtYV9mMzJfcyAoZ2ludCBtZXRob2QsIGdmbG9hdCBwYW4pCit7CisgIEdzdEVsZW1lbnQgKnBhbm9yYW1hOworICBwYW5vcmFtYSA9IHNldHVwX3Bhbm9yYW1hIChzc3JjdGVtcGxhdGUsIDEsIFBBTk9SQU1BX0YzMl9TVEVSRU9fQ0FQU19TVFJJTkcpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChwYW5vcmFtYSksICJtZXRob2QiLCBtZXRob2QsICJwYW5vcmFtYSIsIHBhbiwgTlVMTCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGFub3JhbWEsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgR1NUX0RFQlVHICgicGFub3JhbWEoc3RlcmVvKSByZWFkeSIpOworCisgIHJldHVybiBwYW5vcmFtYTsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfcGFub3JhbWEgKEdzdEVsZW1lbnQgKiBwYW5vcmFtYSkKK3sKKyAgR1NUX0RFQlVHICgiY2xlYW5pbmcgdXAiKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwYW5vcmFtYSwgR1NUX1NUQVRFX05VTEwpOworCisgIGdfbGlzdF9mb3JlYWNoIChidWZmZXJzLCAoR0Z1bmMpIGdzdF9taW5pX29iamVjdF91bnJlZiwgTlVMTCk7CisgIGdfbGlzdF9mcmVlIChidWZmZXJzKTsKKyAgYnVmZmVycyA9IE5VTEw7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAocGFub3JhbWEpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKHBhbm9yYW1hKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKHBhbm9yYW1hKTsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitzZXR1cF9idWZmZXIgKGdwb2ludGVyIGRhdGEsIGdzaXplIHNpemUpCit7CisgIHJldHVybiBnc3RfYnVmZmVyX25ld193cmFwcGVkX2Z1bGwgKEdTVF9NRU1PUllfRkxBR19SRUFET05MWSwgZGF0YSwgc2l6ZSwgMCwKKyAgICAgIHNpemUsIE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZAorZG9fcGFub3JhbWEgKGdwb2ludGVyIGluX2RhdGEsIGdzaXplIGluX3NpemUsIGdwb2ludGVyIG91dF9kYXRhLCBnc2l6ZSBvdXRfc2l6ZSkKK3sKKyAgR3N0QnVmZmVyICppbiwgKm91dDsKKworICBpbiA9IHNldHVwX2J1ZmZlciAoaW5fZGF0YSwgaW5fc2l6ZSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXQgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9leHRyYWN0IChvdXQsIDAsIG91dF9kYXRhLCBvdXRfc2l6ZSkgPT0gb3V0X3NpemUpOworfQorCisvKiB0aGUgdGVzdHMgKi8KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcmVmX2NvdW50cykKK3sKKyAgR3N0RWxlbWVudCAqcGFub3JhbWE7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIGdpbnQxNiBpblsyXSA9IHsgMTYzODQsIC0yNTYgfTsKKworICBwYW5vcmFtYSA9IHNldHVwX3Bhbm9yYW1hIChtc3JjdGVtcGxhdGUsIDAsIFBBTk9SQU1BX1MxNl9NT05PX0NBUFNfU1RSSU5HKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGFub3JhbWEsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBpbmJ1ZmZlciA9IHNldHVwX2J1ZmZlciAoaW4sIHNpemVvZiAoaW4pKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYnV0IGl0IGVuZHMgdXAgYmVpbmcgY29sbGVjdGVkIG9uIHRoZSBnbG9iYWwgYnVmZmVyIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKyAgZmFpbF9pZiAoaW5idWZmZXIgPT0gb3V0YnVmZmVyKTsKKworICAvKiBjbGVhbnVwICovCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBhbm9yYW1hLAorICAgICAgICAgIEdTVF9TVEFURV9OVUxMKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsICJjb3VsZCBub3Qgc2V0IHRvIG51bGwiKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAocGFub3JhbWEsICJwYW5vcmFtYSIsIDEpOworICBjbGVhbnVwX3Bhbm9yYW1hIChwYW5vcmFtYSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfd3JvbmdfY2FwcykKK3sKKyAgR3N0RWxlbWVudCAqcGFub3JhbWE7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXI7CisgIGdpbnQxNiBpblsyXSA9IHsgMTYzODQsIC0yNTYgfTsKKyAgR3N0QnVzICpidXM7CisgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYSAobXNyY3RlbXBsYXRlLCAwLCBOVUxMKTsKKyAgYnVzID0gZ3N0X2J1c19uZXcgKCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGFub3JhbWEsIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICBpbmJ1ZmZlciA9IHNldHVwX2J1ZmZlciAoaW4sIHNpemVvZiAoaW4pKTsKKyAgZ3N0X2J1ZmZlcl9yZWYgKGluYnVmZmVyKTsKKworICAvKiBzZXQgYSBidXMgaGVyZSBzbyB3ZSBhdm9pZCBnZXR0aW5nIHN0YXRlIGNoYW5nZSBtZXNzYWdlcyAqLworICBnc3RfZWxlbWVudF9zZXRfYnVzIChwYW5vcmFtYSwgYnVzKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKFBBTk9SQU1BX1dST05HX0NBUFNfU1RSSU5HKTsKKyAgLyogdGhpcyBhY3R1YWxseSBzdWNjZWVkcywgYmVjYXVzZSB0aGUgY2FwcyBldmVudCBpcyBzdGlja3kgKi8KKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIHBhbm9yYW1hLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhbiBlcnJvciBiZWNhdXNlIGl0IGNhbid0IG5lZ290aWF0ZSB3aXRoIHdyb25nIGNhcHMgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpLAorICAgICAgR1NUX0ZMT1dfTk9UX05FR09USUFURUQpOworICAvKiAuLi4gYW5kIHRoZSBidWZmZXIgd291bGQgaGF2ZSBiZWVuIGxvc3QgaWYgd2UgZGlkbid0IHJlZiBpdCBvdXJzZWx2ZXMgKi8KKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworICBnc3RfYnVmZmVyX3VucmVmIChpbmJ1ZmZlcik7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAwKTsKKworICAvKiBwYW5vcmFtYV9zZXRfY2FwcyBzaG91bGQgbm90IGhhdmUgYmVlbiBjYWxsZWQgc2luY2UgYmFzZXRyYW5zZm9ybSBjYXVnaHQKKyAgICogdGhlIG5lZ290aWF0aW9uIHByb2JsZW0gKi8KKyAgZmFpbF9pZiAoKG1lc3NhZ2UgPSBnc3RfYnVzX3BvcCAoYnVzKSkgIT0gTlVMTCk7CisKKyAgLyogY2xlYW51cCAqLworICBnc3RfZWxlbWVudF9zZXRfYnVzIChwYW5vcmFtYSwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1QgKGJ1cykpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBhbm9yYW1hLCBHU1RfU1RBVEVfTlVMTCk7CisgIGNsZWFudXBfcGFub3JhbWEgKHBhbm9yYW1hKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBwcm9jZXNzaW5nIGZvciBtZXRob2Q9cHN5ICovCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3MxNl9tb25vX21pZGRsZSkKK3sKKyAgZ2ludDE2IGluWzJdID0geyAxNjM4NCwgLTI1NiB9OworICBnaW50MTYgb3V0WzRdID0geyA4MTkyLCA4MTkyLCAtMTI4LCAtMTI4IH07CisgIGdpbnQxNiByZXNbNF07CisgIEdzdEVsZW1lbnQgKnBhbm9yYW1hID0gc2V0dXBfcGFub3JhbWFfczE2X20gKDAsIDAuMCk7CisKKyAgZG9fcGFub3JhbWEgKGluLCBzaXplb2YgKGluKSwgcmVzLCBzaXplb2YgKHJlcykpOworCisgIEdTVF9JTkZPICgiZXhwLiAlKzVkICUrNWQgJSs1ZCAlKzVkIiwgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdKTsKKyAgR1NUX0lORk8gKCJyZWFsICUrNWQgJSs1ZCAlKzVkICUrNWQiLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLCByZXNbM10pOworICBmYWlsX3VubGVzcyAobWVtY21wIChyZXMsIG91dCwgc2l6ZW9mIChyZXMpKSA9PSAwKTsKKworICBjbGVhbnVwX3Bhbm9yYW1hIChwYW5vcmFtYSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfczE2X21vbm9fbGVmdCkKK3sKKyAgZ2ludDE2IGluWzJdID0geyAxNjM4NCwgLTI1NiB9OworICBnaW50MTYgb3V0WzRdID0geyAxNjM4NCwgMCwgLTI1NiwgMCB9OworICBnaW50MTYgcmVzWzRdOworICBHc3RFbGVtZW50ICpwYW5vcmFtYSA9IHNldHVwX3Bhbm9yYW1hX3MxNl9tICgwLCAtMS4wKTsKKworICBkb19wYW5vcmFtYSAoaW4sIHNpemVvZiAoaW4pLCByZXMsIHNpemVvZiAocmVzKSk7CisKKyAgR1NUX0lORk8gKCJleHAuICUrNWQgJSs1ZCAlKzVkICUrNWQiLCBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10pOworICBHU1RfSU5GTyAoInJlYWwgJSs1ZCAlKzVkICUrNWQgJSs1ZCIsIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGZhaWxfdW5sZXNzIChtZW1jbXAgKHJlcywgb3V0LCBzaXplb2YgKHJlcykpID09IDApOworCisgIGNsZWFudXBfcGFub3JhbWEgKHBhbm9yYW1hKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9zMTZfbW9ub19yaWdodCkKK3sKKyAgZ2ludDE2IGluWzJdID0geyAxNjM4NCwgLTI1NiB9OworICBnaW50MTYgb3V0WzRdID0geyAwLCAxNjM4NCwgMCwgLTI1NiB9OworICBnaW50MTYgcmVzWzRdOworICBHc3RFbGVtZW50ICpwYW5vcmFtYSA9IHNldHVwX3Bhbm9yYW1hX3MxNl9tICgwLCAxLjApOworCisgIGRvX3Bhbm9yYW1hIChpbiwgc2l6ZW9mIChpbiksIHJlcywgc2l6ZW9mIChyZXMpKTsKKworICBHU1RfSU5GTyAoImV4cC4gJSs1ZCAlKzVkICUrNWQgJSs1ZCIsIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSk7CisgIEdTVF9JTkZPICgicmVhbCAlKzVkICUrNWQgJSs1ZCAlKzVkIiwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdKTsKKyAgZmFpbF91bmxlc3MgKG1lbWNtcCAocmVzLCBvdXQsIHNpemVvZiAocmVzKSkgPT0gMCk7CisKKyAgY2xlYW51cF9wYW5vcmFtYSAocGFub3JhbWEpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3MxNl9zdGVyZW9fbWlkZGxlKQoreworICBnaW50MTYgaW5bNF0gPSB7IDE2Mzg0LCAtMjU2LCA4MTkyLCAxMjggfTsKKyAgZ2ludDE2IHJlc1s0XTsKKyAgR3N0RWxlbWVudCAqcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYV9zMTZfcyAoMCwgMC4wKTsKKworICBkb19wYW5vcmFtYSAoaW4sIHNpemVvZiAoaW4pLCByZXMsIHNpemVvZiAocmVzKSk7CisKKyAgR1NUX0lORk8gKCJleHAuICUrNWQgJSs1ZCAlKzVkICUrNWQiLCBpblswXSwgaW5bMV0sIGluWzJdLCBpblszXSk7CisgIEdTVF9JTkZPICgicmVhbCAlKzVkICUrNWQgJSs1ZCAlKzVkIiwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdKTsKKyAgZmFpbF91bmxlc3MgKG1lbWNtcCAocmVzLCBpbiwgc2l6ZW9mIChyZXMpKSA9PSAwKTsKKworICBjbGVhbnVwX3Bhbm9yYW1hIChwYW5vcmFtYSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfczE2X3N0ZXJlb19sZWZ0KQoreworICBnaW50MTYgaW5bNF0gPSB7IDE2Mzg0LCAtMjU2LCA4MTkyLCAxMjggfTsKKyAgZ2ludDE2IG91dFs0XSA9IHsgMTYzODQgLSAyNTYsIDAsIDgxOTIgKyAxMjgsIDAgfTsKKyAgZ2ludDE2IHJlc1s0XTsKKyAgR3N0RWxlbWVudCAqcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYV9zMTZfcyAoMCwgLTEuMCk7CisKKyAgZG9fcGFub3JhbWEgKGluLCBzaXplb2YgKGluKSwgcmVzLCBzaXplb2YgKHJlcykpOworCisgIEdTVF9JTkZPICgiZXhwLiAlKzVkICUrNWQgJSs1ZCAlKzVkIiwgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdKTsKKyAgR1NUX0lORk8gKCJyZWFsICUrNWQgJSs1ZCAlKzVkICUrNWQiLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLCByZXNbM10pOworICBmYWlsX3VubGVzcyAobWVtY21wIChyZXMsIG91dCwgc2l6ZW9mIChyZXMpKSA9PSAwKTsKKworICBjbGVhbnVwX3Bhbm9yYW1hIChwYW5vcmFtYSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfczE2X3N0ZXJlb19yaWdodCkKK3sKKyAgZ2ludDE2IGluWzRdID0geyAxNjM4NCwgLTI1NiwgODE5MiwgMTI4IH07CisgIGdpbnQxNiBvdXRbNF0gPSB7IDAsIC0yNTYgKyAxNjM4NCwgMCwgMTI4ICsgODE5MiB9OworICBnaW50MTYgcmVzWzRdOworICBHc3RFbGVtZW50ICpwYW5vcmFtYSA9IHNldHVwX3Bhbm9yYW1hX3MxNl9zICgwLCAxLjApOworCisgIGRvX3Bhbm9yYW1hIChpbiwgc2l6ZW9mIChpbiksIHJlcywgc2l6ZW9mIChyZXMpKTsKKworICBHU1RfSU5GTyAoImV4cC4gJSs1ZCAlKzVkICUrNWQgJSs1ZCIsIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSk7CisgIEdTVF9JTkZPICgicmVhbCAlKzVkICUrNWQgJSs1ZCAlKzVkIiwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdKTsKKyAgZmFpbF91bmxlc3MgKG1lbWNtcCAocmVzLCBvdXQsIHNpemVvZiAocmVzKSkgPT0gMCk7CisKKyAgY2xlYW51cF9wYW5vcmFtYSAocGFub3JhbWEpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2YzMl9tb25vX21pZGRsZSkKK3sKKyAgZ2Zsb2F0IGluWzJdID0geyAwLjUsIC0wLjIgfTsKKyAgZ2Zsb2F0IG91dFs0XSA9IHsgMC4yNSwgMC4yNSwgLTAuMSwgLTAuMSB9OworICBnZmxvYXQgcmVzWzRdOworICBHc3RFbGVtZW50ICpwYW5vcmFtYSA9IHNldHVwX3Bhbm9yYW1hX2YzMl9tICgwLCAwLjApOworICBnaW50IGk7CisKKyAgZG9fcGFub3JhbWEgKGluLCBzaXplb2YgKGluKSwgcmVzLCBzaXplb2YgKHJlcykpOworCisgIEdTVF9JTkZPICgiZXhwLiAlKzQuMmYgJSs0LjJmICUrNC4yZiAlKzQuMmYiLCBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10pOworICBHU1RfSU5GTyAoInJlYWwgJSs0LjJmICUrNC4yZiAlKzQuMmYgJSs0LjJmIiwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdKTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICBmYWlsX3VubGVzcyAocmVzW2ldID09IG91dFtpXSwgImRpZmZlcmVuY2UgYXQgcG9zPSVkIiwgaSk7CisKKyAgY2xlYW51cF9wYW5vcmFtYSAocGFub3JhbWEpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2YzMl9tb25vX2xlZnQpCit7CisgIGdmbG9hdCBpblsyXSA9IHsgMC41LCAtMC4yIH07CisgIGdmbG9hdCBvdXRbNF0gPSB7IDAuNSwgMC4wLCAtMC4yLCAwLjAgfTsKKyAgZ2Zsb2F0IHJlc1s0XTsKKyAgR3N0RWxlbWVudCAqcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYV9mMzJfbSAoMCwgLTEuMCk7CisgIGdpbnQgaTsKKworICBkb19wYW5vcmFtYSAoaW4sIHNpemVvZiAoaW4pLCByZXMsIHNpemVvZiAocmVzKSk7CisKKyAgR1NUX0lORk8gKCJleHAuICUrNC4yZiAlKzQuMmYgJSs0LjJmICUrNC4yZiIsIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSk7CisgIEdTVF9JTkZPICgicmVhbCAlKzQuMmYgJSs0LjJmICUrNC4yZiAlKzQuMmYiLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLCByZXNbM10pOworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIGZhaWxfdW5sZXNzIChyZXNbaV0gPT0gb3V0W2ldLCAiZGlmZmVyZW5jZSBhdCBwb3M9JWQiLCBpKTsKKworICBjbGVhbnVwX3Bhbm9yYW1hIChwYW5vcmFtYSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZjMyX21vbm9fcmlnaHQpCit7CisgIGdmbG9hdCBpblsyXSA9IHsgMC41LCAtMC4yIH07CisgIGdmbG9hdCBvdXRbNF0gPSB7IDAuMCwgMC41LCAwLjAsIC0wLjIgfTsKKyAgZ2Zsb2F0IHJlc1s0XTsKKyAgR3N0RWxlbWVudCAqcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYV9mMzJfbSAoMCwgMS4wKTsKKyAgZ2ludCBpOworCisgIGRvX3Bhbm9yYW1hIChpbiwgc2l6ZW9mIChpbiksIHJlcywgc2l6ZW9mIChyZXMpKTsKKworICBHU1RfSU5GTyAoImV4cC4gJSs0LjJmICUrNC4yZiAlKzQuMmYgJSs0LjJmIiwgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdKTsKKyAgR1NUX0lORk8gKCJyZWFsICUrNC4yZiAlKzQuMmYgJSs0LjJmICUrNC4yZiIsIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgZmFpbF91bmxlc3MgKHJlc1tpXSA9PSBvdXRbaV0sICJkaWZmZXJlbmNlIGF0IHBvcz0lZCIsIGkpOworCisgIGNsZWFudXBfcGFub3JhbWEgKHBhbm9yYW1hKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mMzJfc3RlcmVvX21pZGRsZSkKK3sKKyAgZ2Zsb2F0IGluWzRdID0geyAwLjUsIC0wLjIsIDAuMjUsIDAuMSB9OworICBnZmxvYXQgcmVzWzRdOworICBHc3RFbGVtZW50ICpwYW5vcmFtYSA9IHNldHVwX3Bhbm9yYW1hX2YzMl9zICgwLCAwLjApOworICBnaW50IGk7CisKKyAgZG9fcGFub3JhbWEgKGluLCBzaXplb2YgKGluKSwgcmVzLCBzaXplb2YgKHJlcykpOworCisgIEdTVF9JTkZPICgiZXhwLiAlKzQuMmYgJSs0LjJmICUrNC4yZiAlKzQuMmYiLCBpblswXSwgaW5bMV0sIGluWzJdLCBpblszXSk7CisgIEdTVF9JTkZPICgicmVhbCAlKzQuMmYgJSs0LjJmICUrNC4yZiAlKzQuMmYiLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLCByZXNbM10pOworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIGZhaWxfdW5sZXNzIChyZXNbaV0gPT0gaW5baV0sICJkaWZmZXJlbmNlIGF0IHBvcz0lZCIsIGkpOworCisgIGNsZWFudXBfcGFub3JhbWEgKHBhbm9yYW1hKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mMzJfc3RlcmVvX2xlZnQpCit7CisgIGdmbG9hdCBpbls0XSA9IHsgMC41LCAtMC4yLCAwLjI1LCAwLjEgfTsKKyAgZ2Zsb2F0IG91dFs0XSA9IHsgMC41IC0gMC4yLCAwLjAsIDAuMjUgKyAwLjEsIDAuMCB9OworICBnZmxvYXQgcmVzWzRdOworICBHc3RFbGVtZW50ICpwYW5vcmFtYSA9IHNldHVwX3Bhbm9yYW1hX2YzMl9zICgwLCAtMS4wKTsKKyAgZ2ludCBpOworCisgIGRvX3Bhbm9yYW1hIChpbiwgc2l6ZW9mIChpbiksIHJlcywgc2l6ZW9mIChyZXMpKTsKKworICBHU1RfSU5GTyAoImV4cC4gJSs0LjJmICUrNC4yZiAlKzQuMmYgJSs0LjJmIiwgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdKTsKKyAgR1NUX0lORk8gKCJyZWFsICUrNC4yZiAlKzQuMmYgJSs0LjJmICUrNC4yZiIsIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgZmFpbF91bmxlc3MgKHJlc1tpXSA9PSBvdXRbaV0sICJkaWZmZXJlbmNlIGF0IHBvcz0lZCIsIGkpOworCisgIGNsZWFudXBfcGFub3JhbWEgKHBhbm9yYW1hKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mMzJfc3RlcmVvX3JpZ2h0KQoreworICBnZmxvYXQgaW5bNF0gPSB7IDAuNSwgLTAuMiwgMC4yNSwgMC4xIH07CisgIGdmbG9hdCBvdXRbNF0gPSB7IDAuMCwgLTAuMiArIDAuNSwgMC4wLCAwLjEgKyAwLjI1IH07CisgIGdmbG9hdCByZXNbNF07CisgIEdzdEVsZW1lbnQgKnBhbm9yYW1hID0gc2V0dXBfcGFub3JhbWFfZjMyX3MgKDAsIDEuMCk7CisgIGdpbnQgaTsKKworICBkb19wYW5vcmFtYSAoaW4sIHNpemVvZiAoaW4pLCByZXMsIHNpemVvZiAocmVzKSk7CisKKyAgR1NUX0lORk8gKCJleHAuICUrNC4yZiAlKzQuMmYgJSs0LjJmICUrNC4yZiIsIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSk7CisgIEdTVF9JTkZPICgicmVhbCAlKzQuMmYgJSs0LjJmICUrNC4yZiAlKzQuMmYiLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLCByZXNbM10pOworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIGZhaWxfdW5sZXNzIChyZXNbaV0gPT0gb3V0W2ldLCAiZGlmZmVyZW5jZSBhdCBwb3M9JWQiLCBpKTsKKworICBjbGVhbnVwX3Bhbm9yYW1hIChwYW5vcmFtYSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogcHJvY2Vzc2luZyBmb3IgbWV0aG9kPXNpbXBsZSAqLworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9zMTZfbW9ub19taWRkbGVfc2ltcGxlKQoreworICBnaW50MTYgaW5bMl0gPSB7IDE2Mzg0LCAtMjU2IH07CisgIGdpbnQxNiBvdXRbNF0gPSB7IDE2Mzg0LCAxNjM4NCwgLTI1NiwgLTI1NiB9OworICBnaW50MTYgcmVzWzRdOworICBHc3RFbGVtZW50ICpwYW5vcmFtYSA9IHNldHVwX3Bhbm9yYW1hX3MxNl9tICgxLCAwLjApOworCisgIGRvX3Bhbm9yYW1hIChpbiwgc2l6ZW9mIChpbiksIHJlcywgc2l6ZW9mIChyZXMpKTsKKworICBHU1RfSU5GTyAoImV4cC4gJSs1ZCAlKzVkICUrNWQgJSs1ZCIsIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSk7CisgIEdTVF9JTkZPICgicmVhbCAlKzVkICUrNWQgJSs1ZCAlKzVkIiwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdKTsKKyAgZmFpbF91bmxlc3MgKG1lbWNtcCAocmVzLCBvdXQsIHNpemVvZiAocmVzKSkgPT0gMCk7CisKKyAgY2xlYW51cF9wYW5vcmFtYSAocGFub3JhbWEpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3MxNl9tb25vX2xlZnRfc2ltcGxlKQoreworICBnaW50MTYgaW5bMl0gPSB7IDE2Mzg0LCAtMjU2IH07CisgIGdpbnQxNiBvdXRbNF0gPSB7IDE2Mzg0LCAwLCAtMjU2LCAwIH07CisgIGdpbnQxNiByZXNbNF07CisgIEdzdEVsZW1lbnQgKnBhbm9yYW1hID0gc2V0dXBfcGFub3JhbWFfczE2X20gKDEsIC0xLjApOworCisgIGRvX3Bhbm9yYW1hIChpbiwgc2l6ZW9mIChpbiksIHJlcywgc2l6ZW9mIChyZXMpKTsKKworICBHU1RfSU5GTyAoImV4cC4gJSs1ZCAlKzVkICUrNWQgJSs1ZCIsIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSk7CisgIEdTVF9JTkZPICgicmVhbCAlKzVkICUrNWQgJSs1ZCAlKzVkIiwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdKTsKKyAgZmFpbF91bmxlc3MgKG1lbWNtcCAocmVzLCBvdXQsIHNpemVvZiAocmVzKSkgPT0gMCk7CisKKyAgY2xlYW51cF9wYW5vcmFtYSAocGFub3JhbWEpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3MxNl9tb25vX3JpZ2h0X3NpbXBsZSkKK3sKKyAgZ2ludDE2IGluWzJdID0geyAxNjM4NCwgLTI1NiB9OworICBnaW50MTYgb3V0WzRdID0geyAwLCAxNjM4NCwgMCwgLTI1NiB9OworICBnaW50MTYgcmVzWzRdOworICBHc3RFbGVtZW50ICpwYW5vcmFtYSA9IHNldHVwX3Bhbm9yYW1hX3MxNl9tICgxLCAxLjApOworCisgIGRvX3Bhbm9yYW1hIChpbiwgc2l6ZW9mIChpbiksIHJlcywgc2l6ZW9mIChyZXMpKTsKKworICBHU1RfSU5GTyAoImV4cC4gJSs1ZCAlKzVkICUrNWQgJSs1ZCIsIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSk7CisgIEdTVF9JTkZPICgicmVhbCAlKzVkICUrNWQgJSs1ZCAlKzVkIiwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdKTsKKyAgZmFpbF91bmxlc3MgKG1lbWNtcCAocmVzLCBvdXQsIHNpemVvZiAocmVzKSkgPT0gMCk7CisKKyAgY2xlYW51cF9wYW5vcmFtYSAocGFub3JhbWEpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3MxNl9zdGVyZW9fbWlkZGxlX3NpbXBsZSkKK3sKKyAgZ2ludDE2IGluWzRdID0geyAxNjM4NCwgLTI1NiwgODE5MiwgMTI4IH07CisgIGdpbnQxNiByZXNbNF07CisgIEdzdEVsZW1lbnQgKnBhbm9yYW1hID0gc2V0dXBfcGFub3JhbWFfczE2X3MgKDEsIDAuMCk7CisKKyAgZG9fcGFub3JhbWEgKGluLCBzaXplb2YgKGluKSwgcmVzLCBzaXplb2YgKHJlcykpOworCisgIEdTVF9JTkZPICgiZXhwLiAlKzVkICUrNWQgJSs1ZCAlKzVkIiwgaW5bMF0sIGluWzFdLCBpblsyXSwgaW5bM10pOworICBHU1RfSU5GTyAoInJlYWwgJSs1ZCAlKzVkICUrNWQgJSs1ZCIsIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGZhaWxfdW5sZXNzIChtZW1jbXAgKHJlcywgaW4sIHNpemVvZiAocmVzKSkgPT0gMCk7CisKKyAgY2xlYW51cF9wYW5vcmFtYSAocGFub3JhbWEpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3MxNl9zdGVyZW9fbGVmdF9zaW1wbGUpCit7CisgIGdpbnQxNiBpbls0XSA9IHsgMTYzODQsIC0yNTYsIDgxOTIsIDEyOCB9OworICBnaW50MTYgb3V0WzRdID0geyAxNjM4NCwgMCwgODE5MiwgMCB9OworICBnaW50MTYgcmVzWzRdOworICBHc3RFbGVtZW50ICpwYW5vcmFtYSA9IHNldHVwX3Bhbm9yYW1hX3MxNl9zICgxLCAtMS4wKTsKKworICBkb19wYW5vcmFtYSAoaW4sIHNpemVvZiAoaW4pLCByZXMsIHNpemVvZiAocmVzKSk7CisKKyAgR1NUX0lORk8gKCJleHAuICUrNWQgJSs1ZCAlKzVkICUrNWQiLCBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10pOworICBHU1RfSU5GTyAoInJlYWwgJSs1ZCAlKzVkICUrNWQgJSs1ZCIsIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGZhaWxfdW5sZXNzIChtZW1jbXAgKHJlcywgb3V0LCBzaXplb2YgKHJlcykpID09IDApOworCisgIGNsZWFudXBfcGFub3JhbWEgKHBhbm9yYW1hKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9zMTZfc3RlcmVvX3JpZ2h0X3NpbXBsZSkKK3sKKyAgZ2ludDE2IGluWzRdID0geyAxNjM4NCwgLTI1NiwgODE5MiwgMTI4IH07CisgIGdpbnQxNiBvdXRbNF0gPSB7IDAsIC0yNTYsIDAsIDEyOCB9OworICBnaW50MTYgcmVzWzRdOworICBHc3RFbGVtZW50ICpwYW5vcmFtYSA9IHNldHVwX3Bhbm9yYW1hX3MxNl9zICgxLCAxLjApOworCisgIGRvX3Bhbm9yYW1hIChpbiwgc2l6ZW9mIChpbiksIHJlcywgc2l6ZW9mIChyZXMpKTsKKworICBHU1RfSU5GTyAoImV4cC4gJSs1ZCAlKzVkICUrNWQgJSs1ZCIsIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSk7CisgIEdTVF9JTkZPICgicmVhbCAlKzVkICUrNWQgJSs1ZCAlKzVkIiwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdKTsKKyAgZmFpbF91bmxlc3MgKG1lbWNtcCAocmVzLCBvdXQsIHNpemVvZiAocmVzKSkgPT0gMCk7CisKKyAgY2xlYW51cF9wYW5vcmFtYSAocGFub3JhbWEpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZjMyX21vbm9fbWlkZGxlX3NpbXBsZSkKK3sKKyAgZ2Zsb2F0IGluWzJdID0geyAwLjUsIC0wLjIgfTsKKyAgZ2Zsb2F0IG91dFs0XSA9IHsgMC41LCAwLjUsIC0wLjIsIC0wLjIgfTsKKyAgZ2Zsb2F0IHJlc1s0XTsKKyAgR3N0RWxlbWVudCAqcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYV9mMzJfbSAoMSwgMC4wKTsKKyAgZ2ludCBpOworCisgIGRvX3Bhbm9yYW1hIChpbiwgc2l6ZW9mIChpbiksIHJlcywgc2l6ZW9mIChyZXMpKTsKKworICBHU1RfSU5GTyAoImV4cC4gJSs0LjJmICUrNC4yZiAlKzQuMmYgJSs0LjJmIiwgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdKTsKKyAgR1NUX0lORk8gKCJyZWFsICUrNC4yZiAlKzQuMmYgJSs0LjJmICUrNC4yZiIsIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgZmFpbF91bmxlc3MgKHJlc1tpXSA9PSBvdXRbaV0sICJkaWZmZXJlbmNlIGF0IHBvcz0lZCIsIGkpOworCisgIGNsZWFudXBfcGFub3JhbWEgKHBhbm9yYW1hKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mMzJfbW9ub19sZWZ0X3NpbXBsZSkKK3sKKyAgZ2Zsb2F0IGluWzJdID0geyAwLjUsIC0wLjIgfTsKKyAgZ2Zsb2F0IG91dFs0XSA9IHsgMC41LCAwLjAsIC0wLjIsIDAuMCB9OworICBnZmxvYXQgcmVzWzRdOworICBHc3RFbGVtZW50ICpwYW5vcmFtYSA9IHNldHVwX3Bhbm9yYW1hX2YzMl9tICgxLCAtMS4wKTsKKyAgZ2ludCBpOworCisgIGRvX3Bhbm9yYW1hIChpbiwgc2l6ZW9mIChpbiksIHJlcywgc2l6ZW9mIChyZXMpKTsKKworICBHU1RfSU5GTyAoImV4cC4gJSs0LjJmICUrNC4yZiAlKzQuMmYgJSs0LjJmIiwgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdKTsKKyAgR1NUX0lORk8gKCJyZWFsICUrNC4yZiAlKzQuMmYgJSs0LjJmICUrNC4yZiIsIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgZmFpbF91bmxlc3MgKHJlc1tpXSA9PSBvdXRbaV0sICJkaWZmZXJlbmNlIGF0IHBvcz0lZCIsIGkpOworCisgIGNsZWFudXBfcGFub3JhbWEgKHBhbm9yYW1hKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mMzJfbW9ub19yaWdodF9zaW1wbGUpCit7CisgIGdmbG9hdCBpblsyXSA9IHsgMC41LCAtMC4yIH07CisgIGdmbG9hdCBvdXRbNF0gPSB7IDAuMCwgMC41LCAwLjAsIC0wLjIgfTsKKyAgZ2Zsb2F0IHJlc1s0XTsKKyAgR3N0RWxlbWVudCAqcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYV9mMzJfbSAoMSwgMS4wKTsKKyAgZ2ludCBpOworCisgIGRvX3Bhbm9yYW1hIChpbiwgc2l6ZW9mIChpbiksIHJlcywgc2l6ZW9mIChyZXMpKTsKKworICBHU1RfSU5GTyAoImV4cC4gJSs0LjJmICUrNC4yZiAlKzQuMmYgJSs0LjJmIiwgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdKTsKKyAgR1NUX0lORk8gKCJyZWFsICUrNC4yZiAlKzQuMmYgJSs0LjJmICUrNC4yZiIsIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgZmFpbF91bmxlc3MgKHJlc1tpXSA9PSBvdXRbaV0sICJkaWZmZXJlbmNlIGF0IHBvcz0lZCIsIGkpOworCisgIGNsZWFudXBfcGFub3JhbWEgKHBhbm9yYW1hKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mMzJfc3RlcmVvX21pZGRsZV9zaW1wbGUpCit7CisgIGdmbG9hdCBpbls0XSA9IHsgMC41LCAtMC4yLCAwLjI1LCAwLjEgfTsKKyAgZ2Zsb2F0IHJlc1s0XTsKKyAgR3N0RWxlbWVudCAqcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYV9mMzJfcyAoMSwgMC4wKTsKKyAgZ2ludCBpOworCisgIGRvX3Bhbm9yYW1hIChpbiwgc2l6ZW9mIChpbiksIHJlcywgc2l6ZW9mIChyZXMpKTsKKworICBHU1RfSU5GTyAoImV4cC4gJSs0LjJmICUrNC4yZiAlKzQuMmYgJSs0LjJmIiwgaW5bMF0sIGluWzFdLCBpblsyXSwgaW5bM10pOworICBHU1RfSU5GTyAoInJlYWwgJSs0LjJmICUrNC4yZiAlKzQuMmYgJSs0LjJmIiwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdKTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICBmYWlsX3VubGVzcyAocmVzW2ldID09IGluW2ldLCAiZGlmZmVyZW5jZSBhdCBwb3M9JWQiLCBpKTsKKworICBjbGVhbnVwX3Bhbm9yYW1hIChwYW5vcmFtYSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZjMyX3N0ZXJlb19sZWZ0X3NpbXBsZSkKK3sKKyAgZ2Zsb2F0IGluWzRdID0geyAwLjUsIC0wLjIsIDAuMjUsIDAuMSB9OworICBnZmxvYXQgb3V0WzRdID0geyAwLjUsIDAuMCwgMC4yNSwgMC4wIH07CisgIGdmbG9hdCByZXNbNF07CisgIEdzdEVsZW1lbnQgKnBhbm9yYW1hID0gc2V0dXBfcGFub3JhbWFfZjMyX3MgKDEsIC0xLjApOworICBnaW50IGk7CisKKyAgZG9fcGFub3JhbWEgKGluLCBzaXplb2YgKGluKSwgcmVzLCBzaXplb2YgKHJlcykpOworCisgIEdTVF9JTkZPICgiZXhwLiAlKzQuMmYgJSs0LjJmICUrNC4yZiAlKzQuMmYiLCBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10pOworICBHU1RfSU5GTyAoInJlYWwgJSs0LjJmICUrNC4yZiAlKzQuMmYgJSs0LjJmIiwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdKTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICBmYWlsX3VubGVzcyAocmVzW2ldID09IG91dFtpXSwgImRpZmZlcmVuY2UgYXQgcG9zPSVkIiwgaSk7CisKKyAgY2xlYW51cF9wYW5vcmFtYSAocGFub3JhbWEpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2YzMl9zdGVyZW9fcmlnaHRfc2ltcGxlKQoreworICBnZmxvYXQgaW5bNF0gPSB7IDAuNSwgLTAuMiwgMC4yNSwgMC4xIH07CisgIGdmbG9hdCBvdXRbNF0gPSB7IDAuMCwgLTAuMiwgMC4wLCAwLjEgfTsKKyAgZ2Zsb2F0IHJlc1s0XTsKKyAgR3N0RWxlbWVudCAqcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYV9mMzJfcyAoMSwgMS4wKTsKKyAgZ2ludCBpOworCisgIGRvX3Bhbm9yYW1hIChpbiwgc2l6ZW9mIChpbiksIHJlcywgc2l6ZW9mIChyZXMpKTsKKworICBHU1RfSU5GTyAoImV4cC4gJSs0LjJmICUrNC4yZiAlKzQuMmYgJSs0LjJmIiwgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdKTsKKyAgR1NUX0lORk8gKCJyZWFsICUrNC4yZiAlKzQuMmYgJSs0LjJmICUrNC4yZiIsIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgZmFpbF91bmxlc3MgKHJlc1tpXSA9PSBvdXRbaV0sICJkaWZmZXJlbmNlIGF0IHBvcz0lZCIsIGkpOworCisgIGNsZWFudXBfcGFub3JhbWEgKHBhbm9yYW1hKTsKK30KKworR1NUX0VORF9URVNUOworCisKK3N0YXRpYyBTdWl0ZSAqCitwYW5vcmFtYV9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJwYW5vcmFtYSIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9yZWZfY291bnRzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3dyb25nX2NhcHMpOworICAvKiBwcm9jZXNzaW5nIGZvciBtZXRob2Q9cHN5ICovCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9zMTZfbW9ub19taWRkbGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfczE2X21vbm9fbGVmdCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9zMTZfbW9ub19yaWdodCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9zMTZfc3RlcmVvX21pZGRsZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9zMTZfc3RlcmVvX2xlZnQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfczE2X3N0ZXJlb19yaWdodCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9mMzJfbW9ub19taWRkbGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZjMyX21vbm9fbGVmdCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9mMzJfbW9ub19yaWdodCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9mMzJfc3RlcmVvX21pZGRsZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9mMzJfc3RlcmVvX2xlZnQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZjMyX3N0ZXJlb19yaWdodCk7CisgIC8qIHByb2Nlc3NpbmcgZm9yIG1ldGhvZD1zaW1wbGUgKi8KKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3MxNl9tb25vX21pZGRsZV9zaW1wbGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfczE2X21vbm9fbGVmdF9zaW1wbGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfczE2X21vbm9fcmlnaHRfc2ltcGxlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3MxNl9zdGVyZW9fbWlkZGxlX3NpbXBsZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9zMTZfc3RlcmVvX2xlZnRfc2ltcGxlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3MxNl9zdGVyZW9fcmlnaHRfc2ltcGxlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2YzMl9tb25vX21pZGRsZV9zaW1wbGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZjMyX21vbm9fbGVmdF9zaW1wbGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZjMyX21vbm9fcmlnaHRfc2ltcGxlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2YzMl9zdGVyZW9fbWlkZGxlX3NpbXBsZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9mMzJfc3RlcmVvX2xlZnRfc2ltcGxlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2YzMl9zdGVyZW9fcmlnaHRfc2ltcGxlKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHBhbm9yYW1hKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvd3NpbmNiYW5kLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jYmFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMzVhYmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jYmFuZC5jCkBAIC0wLDAgKzEsMTEzNyBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBhdWRpb3dzaW5jYmFuZC5jOiBVbml0IHRlc3QgZm9yIHRoZSBhdWRpb3dzaW5jYmFuZCBlbGVtZW50CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKy8qIEZvciBlYXNlIG9mIHByb2dyYW1taW5nIHdlIHVzZSBnbG9iYWxzIHRvIGtlZXAgcmVmcyBmb3Igb3VyIGZsb2F0aW5nCisgKiBzcmMgYW5kIHNpbmsgcGFkcyB3ZSBjcmVhdGU7IG90aGVyd2lzZSB3ZSBhbHdheXMgaGF2ZSB0byBkbyBnZXRfcGFkLAorICogZ2V0X3BlZXIsIGFuZCB0aGVuIHJlbW92ZSByZWZlcmVuY2VzIGluIGV2ZXJ5IHRlc3QgZnVuY3Rpb24gKi8KK0dzdFBhZCAqbXlzcmNwYWQsICpteXNpbmtwYWQ7CisKKyNkZWZpbmUgQVVESU9fV1NJTkNfQkFORF9DQVBTX1NUUklOR18zMiAgICAgICAgICBcCisgICAgImF1ZGlvL3gtcmF3LCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoRjMyKSAiLCAiIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgICAgICAgICAgICBcCisgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJyYXRlID0gKGludCkgNDQxMDAiCisKKyNkZWZpbmUgQVVESU9fV1NJTkNfQkFORF9DQVBTX1NUUklOR182NCAgICAgICAgICBcCisgICAgImF1ZGlvL3gtcmF3LCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoRjY0KSAiLCAiIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgICAgICAgICAgICBcCisgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJyYXRlID0gKGludCkgNDQxMDAiCisKKyNkZWZpbmUgRk9STUFUUyAieyAiR1NUX0FVRElPX05FIChGMzIpIiwiR1NUX0FVRElPX05FIChGNjQpIiB9IgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgRk9STUFUUyAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiICJyYXRlID0gKGludCkgNDQxMDAiKQorICAgICk7CitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgRk9STUFUUyAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiICJyYXRlID0gKGludCkgNDQxMDAiKQorICAgICk7CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX2F1ZGlvd3NpbmNiYW5kICh2b2lkKQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jYmFuZDsKKworICBHU1RfREVCVUcgKCJzZXR1cF9hdWRpb3dzaW5jYmFuZCIpOworICBhdWRpb3dzaW5jYmFuZCA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgiYXVkaW93c2luY2JhbmQiKTsKKyAgbXlzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAoYXVkaW93c2luY2JhbmQsICZzcmN0ZW1wbGF0ZSk7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAoYXVkaW93c2luY2JhbmQsICZzaW5rdGVtcGxhdGUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIFRSVUUpOworCisgIHJldHVybiBhdWRpb3dzaW5jYmFuZDsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfYXVkaW93c2luY2JhbmQgKEdzdEVsZW1lbnQgKiBhdWRpb3dzaW5jYmFuZCkKK3sKKyAgR1NUX0RFQlVHICgiY2xlYW51cF9hdWRpb3dzaW5jYmFuZCIpOworCisgIGdfbGlzdF9mb3JlYWNoIChidWZmZXJzLCAoR0Z1bmMpIGdzdF9taW5pX29iamVjdF91bnJlZiwgTlVMTCk7CisgIGdfbGlzdF9mcmVlIChidWZmZXJzKTsKKyAgYnVmZmVycyA9IE5VTEw7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAoYXVkaW93c2luY2JhbmQpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKGF1ZGlvd3NpbmNiYW5kKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGF1ZGlvd3NpbmNiYW5kKTsKK30KKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIGVyYXNlZCB3aXRoIGJhbmRwYXNzIG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfMzJfYnBfMGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworICBHTGlzdCAqbm9kZTsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGF1ZGlvd3NpbmNiYW5kID0gc2V0dXBfYXVkaW93c2luY2JhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgImxlbmd0aCIsIDMxLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb3dzaW5jYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEwMjQgKiBzaXplb2YgKGdmbG9hdCkpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgaW5baV0gPSAxLjA7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFVRElPX1dTSU5DX0JBTkRfQ0FQU19TVFJJTkdfMzIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW93c2luY2JhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIGVuc3VyZSBzZWdtZW50IChmb3JtYXQpIHByb3Blcmx5IHNldHVwICovCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKSk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA+PSAxKTsKKworICBmb3IgKG5vZGUgPSBidWZmZXJzOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgIGdpbnQgYnVmZmVyX2xlbmd0aDsKKworICAgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIG5vZGUtPmRhdGEpID09IE5VTEwpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICByZXMgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICAgIGJ1ZmZlcl9sZW5ndGggPSBtYXAuc2l6ZSAvIHNpemVvZiAoZ2Zsb2F0KTsKKworICAgIHJtcyA9IDAuMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVyX2xlbmd0aDsgaSsrKQorICAgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgICBybXMgPSBzcXJ0IChybXMgLyBidWZmZXJfbGVuZ3RoKTsKKyAgICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMSk7CisKKyAgICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworICB9CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvd3NpbmNiYW5kIChhdWRpb3dzaW5jYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgdGhlIGJhbmQgY2VudGVyIGlzIHByZXNlcnZlZCB3aXRoIGJhbmRyZWplY3QgbW9kZQorICogYW5kIGEgMjAwMEh6IGZyZXF1ZW5jeSBiYW5kIGFyb3VuZCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0XzMyX2JwXzExMDI1aHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvd3NpbmNiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdMaXN0ICpub2RlOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgYXVkaW93c2luY2JhbmQgPSBzZXR1cF9hdWRpb3dzaW5jYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibGVuZ3RoIiwgMzEsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvd3NpbmNiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTAyNCAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpICs9IDQpIHsKKyAgICBpbltpXSA9IDAuMDsKKyAgICBpbltpICsgMV0gPSAxLjA7CisgICAgaW5baSArIDJdID0gMC4wOworICAgIGluW2kgKyAzXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQVVESU9fV1NJTkNfQkFORF9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb3dzaW5jYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogZW5zdXJlIHNlZ21lbnQgKGZvcm1hdCkgcHJvcGVybHkgc2V0dXAgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID49IDEpOworCisgIGZvciAobm9kZSA9IGJ1ZmZlcnM7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KSB7CisgICAgZ2ludCBidWZmZXJfbGVuZ3RoOworCisgICAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgbm9kZS0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIHJlcyA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgICAgYnVmZmVyX2xlbmd0aCA9IG1hcC5zaXplIC8gc2l6ZW9mIChnZmxvYXQpOworICAgIHJtcyA9IDAuMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVyX2xlbmd0aDsgaSsrKQorICAgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgICBybXMgPSBzcXJ0IChybXMgLyBidWZmZXJfbGVuZ3RoKTsKKyAgICBmYWlsX3VubGVzcyAocm1zID49IDAuNCk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKyAgfQorCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb3dzaW5jYmFuZCAoYXVkaW93c2luY2JhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIGVyYXNlZCB3aXRoIGJhbmRyZWplY3QgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF8zMl9icF8yMjA1MGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworICBHTGlzdCAqbm9kZTsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGF1ZGlvd3NpbmNiYW5kID0gc2V0dXBfYXVkaW93c2luY2JhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgImxlbmd0aCIsIDMxLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb3dzaW5jYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEwMjQgKiBzaXplb2YgKGdmbG9hdCkpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSArPSAyKSB7CisgICAgaW5baV0gPSAxLjA7CisgICAgaW5baSArIDFdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBVURJT19XU0lOQ19CQU5EX0NBUFNfU1RSSU5HXzMyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvd3NpbmNiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBlbnN1cmUgc2VnbWVudCAoZm9ybWF0KSBwcm9wZXJseSBzZXR1cCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPj0gMSk7CisKKyAgZm9yIChub2RlID0gYnVmZmVyczsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICBnaW50IGJ1ZmZlcl9sZW5ndGg7CisKKyAgICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBub2RlLT5kYXRhKSA9PSBOVUxMKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgcmVzID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgICBidWZmZXJfbGVuZ3RoID0gbWFwLnNpemUgLyBzaXplb2YgKGdmbG9hdCk7CisgICAgcm1zID0gMC4wOworICAgIGZvciAoaSA9IDA7IGkgPCBidWZmZXJfbGVuZ3RoOyBpKyspCisgICAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICAgIHJtcyA9IHNxcnQgKHJtcyAvIGJ1ZmZlcl9sZW5ndGgpOworICAgIGZhaWxfdW5sZXNzIChybXMgPD0gMC4zKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworICB9CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvd3NpbmNiYW5kIChhdWRpb3dzaW5jYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIHByZXNlcnZlZCB3aXRoIGJhbmRyZWplY3QgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF8zMl9icl8waHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvd3NpbmNiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdMaXN0ICpub2RlOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgYXVkaW93c2luY2JhbmQgPSBzZXR1cF9hdWRpb3dzaW5jYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRyZWplY3QgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsZW5ndGgiLCAzMSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW93c2luY2JhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMDI0ICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBpbltpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQVVESU9fV1NJTkNfQkFORF9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb3dzaW5jYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogZW5zdXJlIHNlZ21lbnQgKGZvcm1hdCkgcHJvcGVybHkgc2V0dXAgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID49IDEpOworCisgIGZvciAobm9kZSA9IGJ1ZmZlcnM7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KSB7CisgICAgZ2ludCBidWZmZXJfbGVuZ3RoOworCisgICAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgbm9kZS0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIHJlcyA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgICAgYnVmZmVyX2xlbmd0aCA9IG1hcC5zaXplIC8gc2l6ZW9mIChnZmxvYXQpOworICAgIHJtcyA9IDAuMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVyX2xlbmd0aDsgaSsrKQorICAgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgICBybXMgPSBzcXJ0IChybXMgLyBidWZmZXJfbGVuZ3RoKTsKKyAgICBmYWlsX3VubGVzcyAocm1zID49IDAuOSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKyAgfQorCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb3dzaW5jYmFuZCAoYXVkaW93c2luY2JhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IHRoZSBiYW5kIGNlbnRlciBpcyBlcmFzZWQgd2l0aCBiYW5kcmVqZWN0IG1vZGUKKyAqIGFuZCBhIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF8zMl9icl8xMTAyNWh6KQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworICBHTGlzdCAqbm9kZTsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGF1ZGlvd3NpbmNiYW5kID0gc2V0dXBfYXVkaW93c2luY2JhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcmVqZWN0ICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibGVuZ3RoIiwgMzEsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvd3NpbmNiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTAyNCAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkgKz0gNCkgeworICAgIGluW2ldID0gMC4wOworICAgIGluW2kgKyAxXSA9IDEuMDsKKyAgICBpbltpICsgMl0gPSAwLjA7CisgICAgaW5baSArIDNdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBVURJT19XU0lOQ19CQU5EX0NBUFNfU1RSSU5HXzMyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvd3NpbmNiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBlbnN1cmUgc2VnbWVudCAoZm9ybWF0KSBwcm9wZXJseSBzZXR1cCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPj0gMSk7CisKKyAgZm9yIChub2RlID0gYnVmZmVyczsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICBnaW50IGJ1ZmZlcl9sZW5ndGg7CisKKyAgICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBub2RlLT5kYXRhKSA9PSBOVUxMKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgcmVzID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgICBidWZmZXJfbGVuZ3RoID0gbWFwLnNpemUgLyBzaXplb2YgKGdmbG9hdCk7CisgICAgcm1zID0gMC4wOworICAgIGZvciAoaSA9IDA7IGkgPCBidWZmZXJfbGVuZ3RoOyBpKyspCisgICAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICAgIHJtcyA9IHNxcnQgKHJtcyAvIGJ1ZmZlcl9sZW5ndGgpOworICAgIGZhaWxfdW5sZXNzIChybXMgPD0gMC4zNSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKyAgfQorCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb3dzaW5jYmFuZCAoYXVkaW93c2luY2JhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIHByZXNlcnZlZCB3aXRoIGJhbmRyZWplY3QgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF8zMl9icl8yMjA1MGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworICBHTGlzdCAqbm9kZTsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGF1ZGlvd3NpbmNiYW5kID0gc2V0dXBfYXVkaW93c2luY2JhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcmVqZWN0ICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibGVuZ3RoIiwgMzEsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvd3NpbmNiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTAyNCAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpICs9IDIpIHsKKyAgICBpbltpXSA9IDEuMDsKKyAgICBpbltpICsgMV0gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFVRElPX1dTSU5DX0JBTkRfQ0FQU19TVFJJTkdfMzIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW93c2luY2JhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIGVuc3VyZSBzZWdtZW50IChmb3JtYXQpIHByb3Blcmx5IHNldHVwICovCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKSk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA+PSAxKTsKKworICBmb3IgKG5vZGUgPSBidWZmZXJzOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgIGdpbnQgYnVmZmVyX2xlbmd0aDsKKworICAgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIG5vZGUtPmRhdGEpID09IE5VTEwpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICByZXMgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICAgIGJ1ZmZlcl9sZW5ndGggPSBtYXAuc2l6ZSAvIHNpemVvZiAoZ2Zsb2F0KTsKKyAgICBybXMgPSAwLjA7CisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlcl9sZW5ndGg7IGkrKykKKyAgICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgICAgcm1zID0gc3FydCAocm1zIC8gYnVmZmVyX2xlbmd0aCk7CisgICAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjkpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisgIH0KKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW93c2luY2JhbmQgKGF1ZGlvd3NpbmNiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGJ1ZmZlcnMgc21hbGxlciB0aGFuIHRoZSBrZXJuZWwgc2l6ZSBhcmUgaGFuZGxlZAorICogY29ycmVjdGx5IHdpdGhvdXQgYWNjZXNzaW5nIHdyb25nIG1lbW9yeSBhcmVhcyAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfMzJfc21hbGxfYnVmZmVyKQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbjsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGF1ZGlvd3NpbmNiYW5kID0gc2V0dXBfYXVkaW93c2luY2JhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgImxlbmd0aCIsIDEwMSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW93c2luY2JhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSA0NDEwMCAvIDE2LjAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyA0NDEwMCAvIDE2LjAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMjAgKiBzaXplb2YgKGdmbG9hdCkpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgICBpbltpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQVVESU9fV1NJTkNfQkFORF9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb3dzaW5jYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogZW5zdXJlIHNlZ21lbnQgKGZvcm1hdCkgcHJvcGVybHkgc2V0dXAgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID49IDEpOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb3dzaW5jYmFuZCAoYXVkaW93c2luY2JhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworCisKKworCisKKworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCByYXRlLzIgaXMgZXJhc2VkIHdpdGggYmFuZHBhc3MgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF82NF9icF8waHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvd3NpbmNiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworICBHTGlzdCAqbm9kZTsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGF1ZGlvd3NpbmNiYW5kID0gc2V0dXBfYXVkaW93c2luY2JhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgImxlbmd0aCIsIDMxLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb3dzaW5jYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEwMjQgKiBzaXplb2YgKGdkb3VibGUpKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgaW5baV0gPSAxLjA7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFVRElPX1dTSU5DX0JBTkRfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW93c2luY2JhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIGVuc3VyZSBzZWdtZW50IChmb3JtYXQpIHByb3Blcmx5IHNldHVwICovCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKSk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA+PSAxKTsKKworICBmb3IgKG5vZGUgPSBidWZmZXJzOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgIGdpbnQgYnVmZmVyX2xlbmd0aDsKKworICAgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIG5vZGUtPmRhdGEpID09IE5VTEwpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICByZXMgPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgICBidWZmZXJfbGVuZ3RoID0gbWFwLnNpemUgLyBzaXplb2YgKGdkb3VibGUpOworICAgIHJtcyA9IDAuMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVyX2xlbmd0aDsgaSsrKQorICAgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgICBybXMgPSBzcXJ0IChybXMgLyBidWZmZXJfbGVuZ3RoKTsKKyAgICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKyAgfQorCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb3dzaW5jYmFuZCAoYXVkaW93c2luY2JhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IHRoZSBiYW5kIGNlbnRlciBpcyBwcmVzZXJ2ZWQgd2l0aCBiYW5kcmVqZWN0IG1vZGUKKyAqIGFuZCBhIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF82NF9icF8xMTAyNWh6KQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR0xpc3QgKm5vZGU7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBhdWRpb3dzaW5jYmFuZCA9IHNldHVwX2F1ZGlvd3NpbmNiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsZW5ndGgiLCAzMSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW93c2luY2JhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMDI0ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSArPSA0KSB7CisgICAgaW5baV0gPSAwLjA7CisgICAgaW5baSArIDFdID0gMS4wOworICAgIGluW2kgKyAyXSA9IDAuMDsKKyAgICBpbltpICsgM10gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFVRElPX1dTSU5DX0JBTkRfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW93c2luY2JhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIGVuc3VyZSBzZWdtZW50IChmb3JtYXQpIHByb3Blcmx5IHNldHVwICovCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKSk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA+PSAxKTsKKworICBmb3IgKG5vZGUgPSBidWZmZXJzOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgIGdpbnQgYnVmZmVyX2xlbmd0aDsKKworICAgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIG5vZGUtPmRhdGEpID09IE5VTEwpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICByZXMgPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgICBidWZmZXJfbGVuZ3RoID0gbWFwLnNpemUgLyBzaXplb2YgKGdkb3VibGUpOworICAgIHJtcyA9IDAuMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVyX2xlbmd0aDsgaSsrKQorICAgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgICBybXMgPSBzcXJ0IChybXMgLyBidWZmZXJfbGVuZ3RoKTsKKyAgICBmYWlsX3VubGVzcyAocm1zID49IDAuNCk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKyAgfQorCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb3dzaW5jYmFuZCAoYXVkaW93c2luY2JhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIGVyYXNlZCB3aXRoIGJhbmRyZWplY3QgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF82NF9icF8yMjA1MGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR0xpc3QgKm5vZGU7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBhdWRpb3dzaW5jYmFuZCA9IHNldHVwX2F1ZGlvd3NpbmNiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsZW5ndGgiLCAzMSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW93c2luY2JhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMDI0ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSArPSAyKSB7CisgICAgaW5baV0gPSAxLjA7CisgICAgaW5baSArIDFdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBVURJT19XU0lOQ19CQU5EX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvd3NpbmNiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBlbnN1cmUgc2VnbWVudCAoZm9ybWF0KSBwcm9wZXJseSBzZXR1cCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPj0gMSk7CisKKyAgZm9yIChub2RlID0gYnVmZmVyczsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICBnaW50IGJ1ZmZlcl9sZW5ndGg7CisKKyAgICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBub2RlLT5kYXRhKSA9PSBOVUxMKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgICAgYnVmZmVyX2xlbmd0aCA9IG1hcC5zaXplIC8gc2l6ZW9mIChnZG91YmxlKTsKKyAgICBybXMgPSAwLjA7CisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlcl9sZW5ndGg7IGkrKykKKyAgICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgICAgcm1zID0gc3FydCAocm1zIC8gYnVmZmVyX2xlbmd0aCk7CisgICAgZmFpbF91bmxlc3MgKHJtcyA8PSAwLjMpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisgIH0KKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW93c2luY2JhbmQgKGF1ZGlvd3NpbmNiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCByYXRlLzIgaXMgcHJlc2VydmVkIHdpdGggYmFuZHJlamVjdCBtb2RlIGFuZCBhIAorICogMjAwMEh6IGZyZXF1ZW5jeSBiYW5kIGFyb3VuZCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0XzY0X2JyXzBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW93c2luY2JhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdMaXN0ICpub2RlOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgYXVkaW93c2luY2JhbmQgPSBzZXR1cF9hdWRpb3dzaW5jYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRyZWplY3QgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsZW5ndGgiLCAzMSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW93c2luY2JhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMDI0ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIGluW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBVURJT19XU0lOQ19CQU5EX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvd3NpbmNiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBlbnN1cmUgc2VnbWVudCAoZm9ybWF0KSBwcm9wZXJseSBzZXR1cCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPj0gMSk7CisKKyAgZm9yIChub2RlID0gYnVmZmVyczsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICBnaW50IGJ1ZmZlcl9sZW5ndGg7CisKKyAgICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBub2RlLT5kYXRhKSA9PSBOVUxMKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgICAgYnVmZmVyX2xlbmd0aCA9IG1hcC5zaXplIC8gc2l6ZW9mIChnZG91YmxlKTsKKyAgICBybXMgPSAwLjA7CisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlcl9sZW5ndGg7IGkrKykKKyAgICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgICAgcm1zID0gc3FydCAocm1zIC8gYnVmZmVyX2xlbmd0aCk7CisgICAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjkpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisgIH0KKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW93c2luY2JhbmQgKGF1ZGlvd3NpbmNiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCB0aGUgYmFuZCBjZW50ZXIgaXMgZXJhc2VkIHdpdGggYmFuZHJlamVjdCBtb2RlCisgKiBhbmQgYSAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfNjRfYnJfMTEwMjVoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW93c2luY2JhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdMaXN0ICpub2RlOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgYXVkaW93c2luY2JhbmQgPSBzZXR1cF9hdWRpb3dzaW5jYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRyZWplY3QgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsZW5ndGgiLCAzMSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW93c2luY2JhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMDI0ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworCisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpICs9IDQpIHsKKyAgICBpbltpXSA9IDAuMDsKKyAgICBpbltpICsgMV0gPSAxLjA7CisgICAgaW5baSArIDJdID0gMC4wOworICAgIGluW2kgKyAzXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQVVESU9fV1NJTkNfQkFORF9DQVBTX1NUUklOR182NCk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb3dzaW5jYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogZW5zdXJlIHNlZ21lbnQgKGZvcm1hdCkgcHJvcGVybHkgc2V0dXAgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID49IDEpOworCisgIGZvciAobm9kZSA9IGJ1ZmZlcnM7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KSB7CisgICAgZ2ludCBidWZmZXJfbGVuZ3RoOworCisgICAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgbm9kZS0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworICAgIGJ1ZmZlcl9sZW5ndGggPSBtYXAuc2l6ZSAvIHNpemVvZiAoZ2RvdWJsZSk7CisgICAgcm1zID0gMC4wOworICAgIGZvciAoaSA9IDA7IGkgPCBidWZmZXJfbGVuZ3RoOyBpKyspCisgICAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICAgIHJtcyA9IHNxcnQgKHJtcyAvIGJ1ZmZlcl9sZW5ndGgpOworICAgIGZhaWxfdW5sZXNzIChybXMgPD0gMC4zNSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKyAgfQorCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb3dzaW5jYmFuZCAoYXVkaW93c2luY2JhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIHByZXNlcnZlZCB3aXRoIGJhbmRyZWplY3QgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF82NF9icl8yMjA1MGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR0xpc3QgKm5vZGU7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBhdWRpb3dzaW5jYmFuZCA9IHNldHVwX2F1ZGlvd3NpbmNiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHJlamVjdCAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJtb2RlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgImxlbmd0aCIsIDMxLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb3dzaW5jYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEwMjQgKiBzaXplb2YgKGdkb3VibGUpKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpICs9IDIpIHsKKyAgICBpbltpXSA9IDEuMDsKKyAgICBpbltpICsgMV0gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFVRElPX1dTSU5DX0JBTkRfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW93c2luY2JhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIGVuc3VyZSBzZWdtZW50IChmb3JtYXQpIHByb3Blcmx5IHNldHVwICovCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKSk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA+PSAxKTsKKworICBmb3IgKG5vZGUgPSBidWZmZXJzOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgIGdpbnQgYnVmZmVyX2xlbmd0aDsKKworICAgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIG5vZGUtPmRhdGEpID09IE5VTEwpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICByZXMgPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgICBidWZmZXJfbGVuZ3RoID0gbWFwLnNpemUgLyBzaXplb2YgKGdkb3VibGUpOworICAgIHJtcyA9IDAuMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVyX2xlbmd0aDsgaSsrKQorICAgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgICBybXMgPSBzcXJ0IChybXMgLyBidWZmZXJfbGVuZ3RoKTsKKyAgICBmYWlsX3VubGVzcyAocm1zID49IDAuOSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKyAgfQorCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb3dzaW5jYmFuZCAoYXVkaW93c2luY2JhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgYnVmZmVycyBzbWFsbGVyIHRoYW4gdGhlIGtlcm5lbCBzaXplIGFyZSBoYW5kbGVkCisgKiBjb3JyZWN0bHkgd2l0aG91dCBhY2Nlc3Npbmcgd3JvbmcgbWVtb3J5IGFyZWFzICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF82NF9zbWFsbF9idWZmZXIpCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvd3NpbmNiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbjsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGF1ZGlvd3NpbmNiYW5kID0gc2V0dXBfYXVkaW93c2luY2JhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgImxlbmd0aCIsIDEwMSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW93c2luY2JhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSA0NDEwMCAvIDE2LjAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyA0NDEwMCAvIDE2LjAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMjAgKiBzaXplb2YgKGdkb3VibGUpKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKQorICAgIGluW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBVURJT19XU0lOQ19CQU5EX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvd3NpbmNiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBlbnN1cmUgc2VnbWVudCAoZm9ybWF0KSBwcm9wZXJseSBzZXR1cCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPj0gMSk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvd3NpbmNiYW5kIChhdWRpb3dzaW5jYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK2F1ZGlvd3NpbmNiYW5kX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImF1ZGlvd3NpbmNiYW5kIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzMyX2JwXzBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF8zMl9icF8xMTAyNWh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzMyX2JwXzIyMDUwaHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfMzJfYnJfMGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzMyX2JyXzExMDI1aHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfMzJfYnJfMjIwNTBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF8zMl9zbWFsbF9idWZmZXIpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfNjRfYnBfMGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzY0X2JwXzExMDI1aHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfNjRfYnBfMjIwNTBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF82NF9icl8waHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfNjRfYnJfMTEwMjVoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF82NF9icl8yMjA1MGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzY0X3NtYWxsX2J1ZmZlcik7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChhdWRpb3dzaW5jYmFuZCk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jbGltaXQuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvd3NpbmNsaW1pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNjNjZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jbGltaXQuYwpAQCAtMCwwICsxLDc4OCBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBhdWRpb3dzaW5jbGltaXQuYzogVW5pdCB0ZXN0IGZvciB0aGUgYXVkaW93c2luY2xpbWl0IGVsZW1lbnQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKy8qIEZvciBlYXNlIG9mIHByb2dyYW1taW5nIHdlIHVzZSBnbG9iYWxzIHRvIGtlZXAgcmVmcyBmb3Igb3VyIGZsb2F0aW5nCisgKiBzcmMgYW5kIHNpbmsgcGFkcyB3ZSBjcmVhdGU7IG90aGVyd2lzZSB3ZSBhbHdheXMgaGF2ZSB0byBkbyBnZXRfcGFkLAorICogZ2V0X3BlZXIsIGFuZCB0aGVuIHJlbW92ZSByZWZlcmVuY2VzIGluIGV2ZXJ5IHRlc3QgZnVuY3Rpb24gKi8KK0dzdFBhZCAqbXlzcmNwYWQsICpteXNpbmtwYWQ7CisKKyNkZWZpbmUgQVVESU9fV1NJTkNfTElNSVRfQ0FQU19TVFJJTkdfMzIgICAgICAgICAgIFwKKyAgICAiYXVkaW8veC1yYXcsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKEYzMikgIiwgIiAgIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgICAgICAgICAgICAgIFwKKyAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicmF0ZSA9IChpbnQpIDQ0MTAwIgorCisjZGVmaW5lIEFVRElPX1dTSU5DX0xJTUlUX0NBUFNfU1RSSU5HXzY0ICAgICAgICAgICBcCisgICAgImF1ZGlvL3gtcmF3LCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChGNjQpICIsICIgICBcCisgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiICAgICAgICAgICAgICBcCisgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJhdGUgPSAoaW50KSA0NDEwMCIKKworI2RlZmluZSBGT1JNQVRTICJ7ICJHU1RfQVVESU9fTkUgKEYzMikiLCJHU1RfQVVESU9fTkUgKEY2NCkiIH0iCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBGT1JNQVRTICIsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgInJhdGUgPSAoaW50KSA0NDEwMCIpCisgICAgKTsKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBGT1JNQVRTICIsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgInJhdGUgPSAoaW50KSA0NDEwMCIpCisgICAgKTsKKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfYXVkaW93c2luY2xpbWl0ICh2b2lkKQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jbGltaXQ7CisKKyAgR1NUX0RFQlVHICgic2V0dXBfYXVkaW93c2luY2xpbWl0Iik7CisgIGF1ZGlvd3NpbmNsaW1pdCA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgiYXVkaW93c2luY2xpbWl0Iik7CisgIG15c3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKGF1ZGlvd3NpbmNsaW1pdCwgJnNyY3RlbXBsYXRlKTsKKyAgbXlzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChhdWRpb3dzaW5jbGltaXQsICZzaW5rdGVtcGxhdGUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIFRSVUUpOworCisgIHJldHVybiBhdWRpb3dzaW5jbGltaXQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX2F1ZGlvd3NpbmNsaW1pdCAoR3N0RWxlbWVudCAqIGF1ZGlvd3NpbmNsaW1pdCkKK3sKKyAgR1NUX0RFQlVHICgiY2xlYW51cF9hdWRpb3dzaW5jbGltaXQiKTsKKworICBnX2xpc3RfZm9yZWFjaCAoYnVmZmVycywgKEdGdW5jKSBnc3RfbWluaV9vYmplY3RfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIEZBTFNFKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKGF1ZGlvd3NpbmNsaW1pdCk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAoYXVkaW93c2luY2xpbWl0KTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGF1ZGlvd3NpbmNsaW1pdCk7Cit9CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IDAgaXMgcHJlc2VydmVkIHdpdGggbG93cGFzcyBtb2RlIGFuZCBhIGN1dG9mZgorICogYXQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF8zMl9scF8waHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvd3NpbmNsaW1pdDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworICBHTGlzdCAqbm9kZTsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGF1ZGlvd3NpbmNsaW1pdCA9IHNldHVwX2F1ZGlvd3NpbmNsaW1pdCAoKTsKKyAgLyogU2V0IHRvIGxvd3Bhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2xpbWl0KSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2xpbWl0KSwgImxlbmd0aCIsIDIxLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb3dzaW5jbGltaXQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICAvKiBjdXRvZmYgPSBzYW1wbGluZyByYXRlIC8gNCwgZGF0YSA9IDAgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2xpbWl0KSwgImN1dG9mZiIsIDQ0MTAwIC8gNC4wLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEyOCAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBpbltpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQVVESU9fV1NJTkNfTElNSVRfQ0FQU19TVFJJTkdfMzIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW93c2luY2xpbWl0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBlbnN1cmUgc2VnbWVudCAoZm9ybWF0KSBwcm9wZXJseSBzZXR1cCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPj0gMSk7CisKKyAgZm9yIChub2RlID0gYnVmZmVyczsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICBnaW50IGJ1ZmZlcl9sZW5ndGg7CisKKyAgICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBub2RlLT5kYXRhKSA9PSBOVUxMKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgcmVzID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgICBidWZmZXJfbGVuZ3RoID0gbWFwLnNpemUgLyBzaXplb2YgKGdmbG9hdCk7CisgICAgcm1zID0gMC4wOworICAgIGZvciAoaSA9IDA7IGkgPCBidWZmZXJfbGVuZ3RoOyBpKyspCisgICAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICAgIHJtcyA9IHNxcnQgKHJtcyAvIGJ1ZmZlcl9sZW5ndGgpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisgICAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjkpOworICB9CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvd3NpbmNsaW1pdCAoYXVkaW93c2luY2xpbWl0KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCByYXRlLzIgaXMgZXJhc2VkIHdpdGggbG93cGFzcyBtb2RlIGFuZCBhIGN1dG9mZgorICogYXQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF8zMl9scF8yMjA1MGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jbGltaXQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR0xpc3QgKm5vZGU7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBhdWRpb3dzaW5jbGltaXQgPSBzZXR1cF9hdWRpb3dzaW5jbGltaXQgKCk7CisgIC8qIFNldCB0byBsb3dwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJsZW5ndGgiLCAyMSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW93c2luY2xpbWl0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2xpbWl0KSwgImN1dG9mZiIsIDQ0MTAwIC8gNC4wLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEyOCAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkgKz0gMikgeworICAgIGluW2ldID0gMS4wOworICAgIGluW2kgKyAxXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQVVESU9fV1NJTkNfTElNSVRfQ0FQU19TVFJJTkdfMzIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW93c2luY2xpbWl0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBlbnN1cmUgc2VnbWVudCAoZm9ybWF0KSBwcm9wZXJseSBzZXR1cCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPj0gMSk7CisKKyAgZm9yIChub2RlID0gYnVmZmVyczsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICBnaW50IGJ1ZmZlcl9sZW5ndGg7CisKKyAgICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBub2RlLT5kYXRhKSA9PSBOVUxMKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgcmVzID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgICBidWZmZXJfbGVuZ3RoID0gbWFwLnNpemUgLyBzaXplb2YgKGdmbG9hdCk7CisgICAgcm1zID0gMC4wOworICAgIGZvciAoaSA9IDA7IGkgPCBidWZmZXJfbGVuZ3RoOyBpKyspCisgICAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICAgIHJtcyA9IHNxcnQgKHJtcyAvIGJ1ZmZlcl9sZW5ndGgpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisgICAgZmFpbF91bmxlc3MgKHJtcyA8PSAwLjEpOworICB9CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvd3NpbmNsaW1pdCAoYXVkaW93c2luY2xpbWl0KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCAwIGlzIGVyYXNlZCB3aXRoIGhpZ2hwYXNzIG1vZGUgYW5kIGEgY3V0b2ZmCisgKiBhdCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0XzMyX2hwXzBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW93c2luY2xpbWl0OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdMaXN0ICpub2RlOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgYXVkaW93c2luY2xpbWl0ID0gc2V0dXBfYXVkaW93c2luY2xpbWl0ICgpOworICAvKiBTZXQgdG8gaGlnaHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2xpbWl0KSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2xpbWl0KSwgImxlbmd0aCIsIDIxLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb3dzaW5jbGltaXQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jbGltaXQpLCAiY3V0b2ZmIiwgNDQxMDAgLyA0LjAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTI4ICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIGluW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBVURJT19XU0lOQ19MSU1JVF9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb3dzaW5jbGltaXQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIGVuc3VyZSBzZWdtZW50IChmb3JtYXQpIHByb3Blcmx5IHNldHVwICovCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKSk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA+PSAxKTsKKworICBmb3IgKG5vZGUgPSBidWZmZXJzOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgIGdpbnQgYnVmZmVyX2xlbmd0aDsKKworICAgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIG5vZGUtPmRhdGEpID09IE5VTEwpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICByZXMgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICAgIGJ1ZmZlcl9sZW5ndGggPSBtYXAuc2l6ZSAvIHNpemVvZiAoZ2Zsb2F0KTsKKyAgICBybXMgPSAwLjA7CisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlcl9sZW5ndGg7IGkrKykKKyAgICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgICAgcm1zID0gc3FydCAocm1zIC8gYnVmZmVyX2xlbmd0aCk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKyAgICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMSk7CisgIH0KKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW93c2luY2xpbWl0IChhdWRpb3dzaW5jbGltaXQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IHJhdGUvMiBpcyBwcmVzZXJ2ZWQgd2l0aCBoaWdocGFzcyBtb2RlIGFuZCBhIGN1dG9mZgorICogYXQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF8zMl9ocF8yMjA1MGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jbGltaXQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR0xpc3QgKm5vZGU7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBhdWRpb3dzaW5jbGltaXQgPSBzZXR1cF9hdWRpb3dzaW5jbGltaXQgKCk7CisgIC8qIFNldCB0byBoaWdocGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jbGltaXQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jbGltaXQpLCAibGVuZ3RoIiwgMjEsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvd3NpbmNsaW1pdCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJjdXRvZmYiLCA0NDEwMCAvIDQuMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMjggKiBzaXplb2YgKGdmbG9hdCkpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpICs9IDIpIHsKKyAgICBpbltpXSA9IDEuMDsKKyAgICBpbltpICsgMV0gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFVRElPX1dTSU5DX0xJTUlUX0NBUFNfU1RSSU5HXzMyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvd3NpbmNsaW1pdCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogZW5zdXJlIHNlZ21lbnQgKGZvcm1hdCkgcHJvcGVybHkgc2V0dXAgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID49IDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBmb3IgKG5vZGUgPSBidWZmZXJzOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgIGdpbnQgYnVmZmVyX2xlbmd0aDsKKworICAgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIG5vZGUtPmRhdGEpID09IE5VTEwpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICByZXMgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICAgIGJ1ZmZlcl9sZW5ndGggPSBtYXAuc2l6ZSAvIHNpemVvZiAoZ2Zsb2F0KTsKKyAgICBybXMgPSAwLjA7CisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlcl9sZW5ndGg7IGkrKykKKyAgICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgICAgcm1zID0gc3FydCAocm1zIC8gYnVmZmVyX2xlbmd0aCk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKyAgICBmYWlsX3VubGVzcyAocm1zID49IDAuOSk7CisgIH0KKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW93c2luY2xpbWl0IChhdWRpb3dzaW5jbGltaXQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgYnVmZmVycyBzbWFsbGVyIHRoYW4gdGhlIGtlcm5lbCBzaXplIGFyZSBoYW5kbGVkCisgKiBjb3JyZWN0bHkgd2l0aG91dCBhY2Nlc3Npbmcgd3JvbmcgbWVtb3J5IGFyZWFzICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF8zMl9zbWFsbF9idWZmZXIpCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvd3NpbmNsaW1pdDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbjsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGF1ZGlvd3NpbmNsaW1pdCA9IHNldHVwX2F1ZGlvd3NpbmNsaW1pdCAoKTsKKyAgLyogU2V0IHRvIGxvd3Bhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2xpbWl0KSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2xpbWl0KSwgImxlbmd0aCIsIDEwMSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW93c2luY2xpbWl0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2xpbWl0KSwgImN1dG9mZiIsIDQ0MTAwIC8gNC4wLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDIwICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDIwOyBpKyspCisgICAgaW5baV0gPSAxLjA7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFVRElPX1dTSU5DX0xJTUlUX0NBUFNfU1RSSU5HXzMyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvd3NpbmNsaW1pdCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogZW5zdXJlIHNlZ21lbnQgKGZvcm1hdCkgcHJvcGVybHkgc2V0dXAgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID49IDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW93c2luY2xpbWl0IChhdWRpb3dzaW5jbGltaXQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IDAgaXMgcHJlc2VydmVkIHdpdGggbG93cGFzcyBtb2RlIGFuZCBhIGN1dG9mZgorICogYXQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF82NF9scF8waHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvd3NpbmNsaW1pdDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR0xpc3QgKm5vZGU7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBhdWRpb3dzaW5jbGltaXQgPSBzZXR1cF9hdWRpb3dzaW5jbGltaXQgKCk7CisgIC8qIFNldCB0byBsb3dwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJsZW5ndGgiLCAyMSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW93c2luY2xpbWl0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgLyogY3V0b2ZmID0gc2FtcGxpbmcgcmF0ZSAvIDQsIGRhdGEgPSAwICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJjdXRvZmYiLCA0NDEwMCAvIDQuMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMjggKiBzaXplb2YgKGdkb3VibGUpKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBpbltpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQVVESU9fV1NJTkNfTElNSVRfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW93c2luY2xpbWl0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBlbnN1cmUgc2VnbWVudCAoZm9ybWF0KSBwcm9wZXJseSBzZXR1cCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPj0gMSk7CisKKyAgZm9yIChub2RlID0gYnVmZmVyczsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICBnaW50IGJ1ZmZlcl9sZW5ndGg7CisKKyAgICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBub2RlLT5kYXRhKSA9PSBOVUxMKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgICAgYnVmZmVyX2xlbmd0aCA9IG1hcC5zaXplIC8gc2l6ZW9mIChnZG91YmxlKTsKKyAgICBybXMgPSAwLjA7CisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlcl9sZW5ndGg7IGkrKykKKyAgICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgICAgcm1zID0gc3FydCAocm1zIC8gYnVmZmVyX2xlbmd0aCk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKyAgICBmYWlsX3VubGVzcyAocm1zID49IDAuOSk7CisgIH0KKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW93c2luY2xpbWl0IChhdWRpb3dzaW5jbGltaXQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IHJhdGUvMiBpcyBlcmFzZWQgd2l0aCBsb3dwYXNzIG1vZGUgYW5kIGEgY3V0b2ZmCisgKiBhdCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0XzY0X2xwXzIyMDUwaHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvd3NpbmNsaW1pdDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR0xpc3QgKm5vZGU7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBhdWRpb3dzaW5jbGltaXQgPSBzZXR1cF9hdWRpb3dzaW5jbGltaXQgKCk7CisgIC8qIFNldCB0byBsb3dwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJsZW5ndGgiLCAyMSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW93c2luY2xpbWl0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2xpbWl0KSwgImN1dG9mZiIsIDQ0MTAwIC8gNC4wLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEyOCAqIHNpemVvZiAoZ2RvdWJsZSkpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSArPSAyKSB7CisgICAgaW5baV0gPSAxLjA7CisgICAgaW5baSArIDFdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBVURJT19XU0lOQ19MSU1JVF9DQVBTX1NUUklOR182NCk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb3dzaW5jbGltaXQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIGVuc3VyZSBzZWdtZW50IChmb3JtYXQpIHByb3Blcmx5IHNldHVwICovCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKSk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA+PSAxKTsKKworICBmb3IgKG5vZGUgPSBidWZmZXJzOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgIGdpbnQgYnVmZmVyX2xlbmd0aDsKKworICAgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIG5vZGUtPmRhdGEpID09IE5VTEwpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICByZXMgPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgICBidWZmZXJfbGVuZ3RoID0gbWFwLnNpemUgLyBzaXplb2YgKGdkb3VibGUpOworICAgIHJtcyA9IDAuMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVyX2xlbmd0aDsgaSsrKQorICAgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgICBybXMgPSBzcXJ0IChybXMgLyBidWZmZXJfbGVuZ3RoKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworICAgIGZhaWxfdW5sZXNzIChybXMgPD0gMC4xKTsKKyAgfQorCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb3dzaW5jbGltaXQgKGF1ZGlvd3NpbmNsaW1pdCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgMCBpcyBlcmFzZWQgd2l0aCBoaWdocGFzcyBtb2RlIGFuZCBhIGN1dG9mZgorICogYXQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF82NF9ocF8waHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvd3NpbmNsaW1pdDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR0xpc3QgKm5vZGU7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBhdWRpb3dzaW5jbGltaXQgPSBzZXR1cF9hdWRpb3dzaW5jbGltaXQgKCk7CisgIC8qIFNldCB0byBoaWdocGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jbGltaXQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jbGltaXQpLCAibGVuZ3RoIiwgMjEsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvd3NpbmNsaW1pdCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJjdXRvZmYiLCA0NDEwMCAvIDQuMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMjggKiBzaXplb2YgKGdkb3VibGUpKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBpbltpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQVVESU9fV1NJTkNfTElNSVRfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW93c2luY2xpbWl0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBlbnN1cmUgc2VnbWVudCAoZm9ybWF0KSBwcm9wZXJseSBzZXR1cCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPj0gMSk7CisKKyAgZm9yIChub2RlID0gYnVmZmVyczsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICBnaW50IGJ1ZmZlcl9sZW5ndGg7CisKKyAgICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBub2RlLT5kYXRhKSA9PSBOVUxMKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgICAgYnVmZmVyX2xlbmd0aCA9IG1hcC5zaXplIC8gc2l6ZW9mIChnZG91YmxlKTsKKyAgICBybXMgPSAwLjA7CisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlcl9sZW5ndGg7IGkrKykKKyAgICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgICAgcm1zID0gc3FydCAocm1zIC8gYnVmZmVyX2xlbmd0aCk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKyAgICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMSk7CisgIH0KKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW93c2luY2xpbWl0IChhdWRpb3dzaW5jbGltaXQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IHJhdGUvMiBpcyBwcmVzZXJ2ZWQgd2l0aCBoaWdocGFzcyBtb2RlIGFuZCBhIGN1dG9mZgorICogYXQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF82NF9ocF8yMjA1MGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jbGltaXQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdMaXN0ICpub2RlOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgYXVkaW93c2luY2xpbWl0ID0gc2V0dXBfYXVkaW93c2luY2xpbWl0ICgpOworICAvKiBTZXQgdG8gaGlnaHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2xpbWl0KSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2xpbWl0KSwgImxlbmd0aCIsIDIxLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb3dzaW5jbGltaXQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jbGltaXQpLCAiY3V0b2ZmIiwgNDQxMDAgLyA0LjAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTI4ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpICs9IDIpIHsKKyAgICBpbltpXSA9IDEuMDsKKyAgICBpbltpICsgMV0gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFVRElPX1dTSU5DX0xJTUlUX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvd3NpbmNsaW1pdCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogZW5zdXJlIHNlZ21lbnQgKGZvcm1hdCkgcHJvcGVybHkgc2V0dXAgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID49IDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBmb3IgKG5vZGUgPSBidWZmZXJzOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgIGdpbnQgYnVmZmVyX2xlbmd0aDsKKworICAgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIG5vZGUtPmRhdGEpID09IE5VTEwpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICByZXMgPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgICBidWZmZXJfbGVuZ3RoID0gbWFwLnNpemUgLyBzaXplb2YgKGdkb3VibGUpOworICAgIHJtcyA9IDAuMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVyX2xlbmd0aDsgaSsrKQorICAgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgICBybXMgPSBzcXJ0IChybXMgLyBidWZmZXJfbGVuZ3RoKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworICAgIGZhaWxfdW5sZXNzIChybXMgPj0gMC45KTsKKyAgfQorCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb3dzaW5jbGltaXQgKGF1ZGlvd3NpbmNsaW1pdCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBidWZmZXJzIHNtYWxsZXIgdGhhbiB0aGUga2VybmVsIHNpemUgYXJlIGhhbmRsZWQKKyAqIGNvcnJlY3RseSB3aXRob3V0IGFjY2Vzc2luZyB3cm9uZyBtZW1vcnkgYXJlYXMgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0XzY0X3NtYWxsX2J1ZmZlcikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW93c2luY2xpbWl0OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbjsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGF1ZGlvd3NpbmNsaW1pdCA9IHNldHVwX2F1ZGlvd3NpbmNsaW1pdCAoKTsKKyAgLyogU2V0IHRvIGxvd3Bhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2xpbWl0KSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2xpbWl0KSwgImxlbmd0aCIsIDEwMSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW93c2luY2xpbWl0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2xpbWl0KSwgImN1dG9mZiIsIDQ0MTAwIC8gNC4wLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDIwICogc2l6ZW9mIChnZG91YmxlKSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgICBpbltpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQVVESU9fV1NJTkNfTElNSVRfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW93c2luY2xpbWl0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBlbnN1cmUgc2VnbWVudCAoZm9ybWF0KSBwcm9wZXJseSBzZXR1cCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPj0gMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb3dzaW5jbGltaXQgKGF1ZGlvd3NpbmNsaW1pdCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK2F1ZGlvd3NpbmNsaW1pdF9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJhdWRpb3dzaW5jbGltaXQiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfMzJfbHBfMGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzMyX2xwXzIyMDUwaHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfMzJfaHBfMGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzMyX2hwXzIyMDUwaHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfMzJfc21hbGxfYnVmZmVyKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzY0X2xwXzBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF82NF9scF8yMjA1MGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzY0X2hwXzBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF82NF9ocF8yMjA1MGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzY0X3NtYWxsX2J1ZmZlcik7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChhdWRpb3dzaW5jbGltaXQpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvYXV0b2RldGVjdC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYXV0b2RldGVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMGYxYzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hdXRvZGV0ZWN0LmMKQEAgLTAsMCArMSwyMjYgQEAKKy8qIEdTdHJlYW1lciB1bml0IHRlc3QgZm9yIHRoZSBhdXRvZGV0ZWN0IGVsZW1lbnRzCisgKgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXNpbmsuaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworLyogZHVtbXkgc2luayBlbGVtZW50cyAqLworCisjZGVmaW5lIEdTVF9UWVBFX0ZBS0VfQVVESU9fU0lOSyAoZ3N0X2Zha2VfYXVkaW9fc2lua19nZXRfdHlwZSAoKSkKK3R5cGVkZWYgR3N0QmFzZVNpbmsgR3N0RmFrZUF1ZGlvU2luazsKK3R5cGVkZWYgR3N0QmFzZVNpbmtDbGFzcyBHc3RGYWtlQXVkaW9TaW5rQ2xhc3M7CitHVHlwZSBnc3RfZmFrZV9hdWRpb19zaW5rX2dldF90eXBlICh2b2lkKTsKK0dfREVGSU5FX1RZUEUgKEdzdEZha2VBdWRpb1NpbmssIGdzdF9mYWtlX2F1ZGlvX3NpbmssIEdTVF9UWVBFX0JBU0VfU0lOSyk7CisKK3N0YXRpYyB2b2lkCitnc3RfZmFrZV9hdWRpb19zaW5rX2NsYXNzX2luaXQgKEdzdEZha2VBdWRpb1NpbmtDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgcGFkX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICAgIEdTVF9QQURfU0lOSywgR1NUX1BBRF9BTFdBWVMsCisgICAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9BVURJT19DQVBTX01BS0UgKEdTVF9BVURJT19GT1JNQVRTX0FMTCkgIjsgIikpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJGYWtlIEF1ZGlvIFNpbmsiLAorICAgICAgIlNpbmsvQXVkaW8iLCAiQXVkaW8gc2luayBmYWtlIGZvciB0ZXN0aW5nIiwgIlN0ZWZhbiBTYXVlciIpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnBhZF90ZW1wbGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmFrZV9hdWRpb19zaW5rX2luaXQgKEdzdEZha2VBdWRpb1NpbmsgKiBzaW5rKQoreworfQorCisjZGVmaW5lIEdTVF9UWVBFX0ZBS0VfVklERU9fU0lOSyAoZ3N0X2Zha2VfdmlkZW9fc2lua19nZXRfdHlwZSAoKSkKK3R5cGVkZWYgR3N0QmFzZVNpbmsgR3N0RmFrZVZpZGVvU2luazsKK3R5cGVkZWYgR3N0QmFzZVNpbmtDbGFzcyBHc3RGYWtlVmlkZW9TaW5rQ2xhc3M7CitHVHlwZSBnc3RfZmFrZV92aWRlb19zaW5rX2dldF90eXBlICh2b2lkKTsKK0dfREVGSU5FX1RZUEUgKEdzdEZha2VWaWRlb1NpbmssIGdzdF9mYWtlX3ZpZGVvX3NpbmssIEdTVF9UWVBFX0JBU0VfU0lOSyk7CisKK3N0YXRpYyB2b2lkCitnc3RfZmFrZV92aWRlb19zaW5rX2NsYXNzX2luaXQgKEdzdEZha2VWaWRlb1NpbmtDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgcGFkX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICAgIEdTVF9QQURfU0lOSywgR1NUX1BBRF9BTFdBWVMsCisgICAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKEdTVF9WSURFT19GT1JNQVRTX0FMTCkgIjsgIikpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJGYWtlIFZpZGVvIFNpbmsiLAorICAgICAgIlNpbmsvVmlkZW8iLCAiVmlkZW8gc2luayBmYWtlIGZvciB0ZXN0aW5nIiwgIlN0ZWZhbiBTYXVlciIpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnBhZF90ZW1wbGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmFrZV92aWRlb19zaW5rX2luaXQgKEdzdEZha2VWaWRlb1NpbmsgKiBzaW5rKQoreworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImZha2VhdWRpb3NpbmsiLCBHX01BWElOVCwKKyAgICAgICAgICBHU1RfVFlQRV9GQUtFX0FVRElPX1NJTkspKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiZmFrZXZpZGVvc2luayIsIEdfTUFYSU5ULAorICAgICAgICAgIEdTVF9UWVBFX0ZBS0VfVklERU9fU0lOSykpCisgICAgcmV0dXJuIEZBTFNFOworICByZXR1cm4gVFJVRTsKK30KKworLyogdGVzdHMgKi8KKworc3RhdGljIHZvaWQKK3Rlc3RfcGx1Z3NfYmVzdCAoR3N0RWxlbWVudCAqIHNpbmssIEdUeXBlIGV4cGVjdGVkKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiBzdGF0ZV9yZXQ7CisgIEdMaXN0ICpjaGlsZDsKKworICBzdGF0ZV9yZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNpbmssIEdTVF9TVEFURV9SRUFEWSk7CisgIGZhaWxfdW5sZXNzIChzdGF0ZV9yZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLCBOVUxMKTsKKworICBjaGlsZCA9IEdTVF9CSU5fQ0hJTERSRU4gKHNpbmspOworICBmYWlsX3VubGVzcyAoY2hpbGQgIT0gTlVMTCwgIm5vIGVsZW1lbnRzIHBsdWdnZWQiKTsKKyAgY2tfYXNzZXJ0X2ludF9lcSAoZ19saXN0X2xlbmd0aCAoY2hpbGQpLCAxKTsKKyAgZmFpbF91bmxlc3MgKEdfT0JKRUNUX1RZUEUgKGNoaWxkKSwgZXhwZWN0ZWQpOworCisgIC8qIGNsZWFuIHVwICovCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc2luaywgR1NUX1NUQVRFX05VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYXV0b3ZpZGVvc2lua19wbHVnc19iZXN0KQoreworICBHc3RFbGVtZW50ICpzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXV0b3ZpZGVvc2luayIsIE5VTEwpOworCisgIHRlc3RfcGx1Z3NfYmVzdCAoc2luaywgR1NUX1RZUEVfRkFLRV9WSURFT19TSU5LKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9hdXRvYXVkaW9zaW5rX3BsdWdzX2Jlc3QpCit7CisgIEdzdEVsZW1lbnQgKnNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdXRvYXVkaW9zaW5rIiwgTlVMTCk7CisKKyAgdGVzdF9wbHVnc19iZXN0IChzaW5rLCBHU1RfVFlQRV9GQUtFX0FVRElPX1NJTkspOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyB2b2lkCit0ZXN0X2dob3N0cGFkX2Vycm9yX2Nhc2UgKEdzdENhcHMgKiBjYXBzLCBHc3RFbGVtZW50ICogc2luaywKKyAgICBjb25zdCBnY2hhciAqIGZha2Vfc2lua19uYW1lKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiBzdGF0ZV9yZXQ7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lLCAqc3JjLCAqZmlsdGVyLCAqZmFrZXNpbms7CisKKyAgcGlwZWxpbmUgPSBnc3RfcGlwZWxpbmVfbmV3ICgicGlwZWxpbmUiKTsKKyAgc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNyYyIsIE5VTEwpOworICBmaWx0ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJjYXBzZmlsdGVyIiwgTlVMTCk7CisKKyAgZ19vYmplY3Rfc2V0IChmaWx0ZXIsICJjYXBzIiwgY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHNyYywgZmlsdGVyLCBzaW5rLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGluayAoc3JjLCBmaWx0ZXIpLCAiRmFpbGVkIHRvIGxpbmsgc3JjIHRvIGZpbHRlciIpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGluayAoZmlsdGVyLCBzaW5rKSwKKyAgICAgICJGYWlsZWQgdG8gbGluayBmaWx0ZXIgdG8gc2luayIpOworCisgIC8qIHRoaXMgc2hvdWxkIGZhaWwsIHRoZXJlJ3Mgbm8gc3VjaCBmb3JtYXQgKi8KKyAgc3RhdGVfcmV0ID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BBVVNFRCk7CisgIGlmIChzdGF0ZV9yZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9BU1lOQykgeworICAgIC8qIG1ha2Ugc3VyZSB3ZSB3YWl0IGZvciB0aGUgYWN0dWFsIHN1Y2Nlc3MvZmFpbHVyZSB0byBoYXBwZW4gKi8KKyAgICBHc3RTdGF0ZSBzdGF0ZTsKKyAgICBzdGF0ZV9yZXQgPQorICAgICAgICBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKHBpcGVsaW5lLCAmc3RhdGUsICZzdGF0ZSwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgIH0KKyAgZmFrZXNpbmsgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChzaW5rKSwgZmFrZV9zaW5rX25hbWUpOworICBpZiAoZmFrZXNpbmsgIT0gTlVMTCkgeworICAgIC8qIG5vIHJlYWwgc2luayBhdmFpbGFibGUgKi8KKyAgICBmYWlsX3VubGVzcyAoc3RhdGVfcmV0ID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICAgInBpcGVsaW5lIF9zZXRfc3RhdGUoKSB0byBQQVVTRUQgZmFpbGVkIik7CisgICAgZ3N0X29iamVjdF91bnJlZiAoZmFrZXNpbmspOworICB9IGVsc2UgeworICAgIC8qIGF1dG92aWRlb3NpbmsgY29udGFpbnMgYSByZWFsIHZpZGVvIHNpbmsgKi8KKyAgICBmYWlsX3VubGVzcyAoc3RhdGVfcmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSwKKyAgICAgICAgInBpcGVsaW5lIF9zZXRfc3RhdGUoKSB0byBQQVVTRUQgc3VjY2VlZGVkIGJ1dCBzaG91bGQgaGF2ZSBmYWlsZWQiKTsKKworICAgIC8qIHNvLCB3ZSBoaXQgYW4gZXJyb3IgYW5kIHRyeSB0byBzaHV0IGRvd24gdGhlIHBpcGVsaW5lOyB0aGlzIHNob3VsZG4ndAorICAgICAqIGRlYWRsb2NrIG9yIGJsb2NrIGFueXdoZXJlIHdoZW4gYXV0b3ZpZGVvc2luayByZXNldHMgdGhlIGdob3N0cGFkCisgICAgICogdGFyZ2V0cyBldGMuICovCisgIH0KKyAgc3RhdGVfcmV0ID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworICBmYWlsX3VubGVzcyAoc3RhdGVfcmV0ID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJTdGF0ZSBjaGFuZ2Ugb24gcGlwZWxpbmUgZmFpbGVkIik7CisKKyAgLyogY2xlYW4gdXAgKi8KKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9hdXRvdmlkZW9zaW5rX2dob3N0cGFkX2Vycm9yX2Nhc2UpCit7CisgIEdzdEVsZW1lbnQgKnNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdXRvdmlkZW9zaW5rIiwgTlVMTCk7CisgIEdzdENhcHMgKmNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1yYXciLCAiZm9ybWF0IiwgR19UWVBFX1NUUklORywKKyAgICAgICJBQkNEIiwgTlVMTCk7CisKKyAgdGVzdF9naG9zdHBhZF9lcnJvcl9jYXNlIChjYXBzLCBzaW5rLCAiZmFrZS12aWRlby1zaW5rIik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYXV0b2F1ZGlvc2lua19naG9zdHBhZF9lcnJvcl9jYXNlKQoreworICBHc3RFbGVtZW50ICpzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXV0b2F1ZGlvc2luayIsIE5VTEwpOworICBHc3RDYXBzICpjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcmF3IiwgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAiQUJDRCIsIE5VTEwpOworCisgIHRlc3RfZ2hvc3RwYWRfZXJyb3JfY2FzZSAoY2Fwcywgc2luaywgImZha2UtYXVkaW8tc2luayIpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCithdXRvZGV0ZWN0X3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImF1dG9kZXRlY3QiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIGdzdF9wbHVnaW5fcmVnaXN0ZXJfc3RhdGljIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgICAgImF1dG9kZXRlY3QtdGVzdCIsCisgICAgICAiYXV0b2RldGVjdCB0ZXN0IGVsZW1lbnRzIiwKKyAgICAgIHBsdWdpbl9pbml0LAorICAgICAgVkVSU0lPTiwgIkxHUEwiLCBQQUNLQUdFLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYXV0b3ZpZGVvc2lua19wbHVnc19iZXN0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2F1dG9hdWRpb3NpbmtfcGx1Z3NfYmVzdCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9hdXRvdmlkZW9zaW5rX2dob3N0cGFkX2Vycm9yX2Nhc2UpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYXV0b2F1ZGlvc2lua19naG9zdHBhZF9lcnJvcl9jYXNlKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGF1dG9kZXRlY3QpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpbXV4LmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hdmltdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmQyN2ZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpbXV4LmMKQEAgLTAsMCArMSwyNjkgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIHVuaXQgdGVzdCBmb3IgYXZpbXV4CisgKgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3QHNreW5ldC5iZT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworLyogRm9yIGVhc2Ugb2YgcHJvZ3JhbW1pbmcgd2UgdXNlIGdsb2JhbHMgdG8ga2VlcCByZWZzIGZvciBvdXIgZmxvYXRpbmcKKyAqIHNyYyBhbmQgc2luayBwYWRzIHdlIGNyZWF0ZTsgb3RoZXJ3aXNlIHdlIGFsd2F5cyBoYXZlIHRvIGRvIGdldF9wYWQsCisgKiBnZXRfcGVlciwgYW5kIHRoZW4gcmVtb3ZlIHJlZmVyZW5jZXMgaW4gZXZlcnkgdGVzdCBmdW5jdGlvbiAqLworc3RhdGljIEdzdFBhZCAqbXlzcmNwYWQsICpteXNpbmtwYWQ7CisKKyNkZWZpbmUgQVVESU9fQ0FQU19TVFJJTkcgImF1ZGlvL3gtYWMzLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgInJhdGUgPSAoaW50KSA4MDAwIgorI2RlZmluZSBWSURFT19DQVBTX1NUUklORyAidmlkZW8vbXBlZywgbXBlZ3ZlcnNpb24gPSAoaW50KSA0LCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW1zdHJlYW0gPSAoYm9vbCkgZmFsc2UsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpZHRoID0gKGludCkgMzg0LCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWlnaHQgPSAoaW50KSAyODgsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyYW1lcmF0ZSA9IChmcmFjdGlvbikgMjUvMSIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtbXN2aWRlbyIpKTsKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN2aWRlb3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoVklERU9fQ0FQU19TVFJJTkcpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY2F1ZGlvdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChBVURJT19DQVBTX1NUUklORykpOworCisKKy8qIHNldHVwIGFuZCB0ZWFyZG93biBuZWVkcyBzb21lIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG11eGVyICovCitzdGF0aWMgR3N0UGFkICoKK3NldHVwX3NyY19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRpY1BhZFRlbXBsYXRlICogdGVtcGxhdGUsIEdzdENhcHMgKiBjYXBzLCBjb25zdCBnY2hhciAqIHNpbmtuYW1lKQoreworICBHc3RQYWQgKnNyY3BhZCwgKnNpbmtwYWQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZWxlbWVudCwgInNldHRpbmcgdXAgc2VuZGluZyBwYWQiKTsKKyAgLyogc2VuZGluZyBwYWQgKi8KKyAgc3JjcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKHRlbXBsYXRlLCAic3JjIik7CisgIGZhaWxfaWYgKHNyY3BhZCA9PSBOVUxMLCAiQ291bGQgbm90IGNyZWF0ZSBhIHNyY3BhZCIpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChzcmNwYWQsICJzcmNwYWQiLCAxKTsKKworICBpZiAoIShzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGVsZW1lbnQsIHNpbmtuYW1lKSkpCisgICAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoZWxlbWVudCwgc2lua25hbWUpOworICBmYWlsX2lmIChzaW5rcGFkID09IE5VTEwsICJDb3VsZCBub3QgZ2V0IHNpbmsgcGFkIGZyb20gJXMiLAorICAgICAgR1NUX0VMRU1FTlRfTkFNRSAoZWxlbWVudCkpOworICAvKiByZWZlcmVuY2VzIGFyZSBvd25lZCBieTogMSkgdXMsIDIpIGF2aW11eCwgMykgY29sbGVjdCBwYWRzICovCisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHNpbmtwYWQsICJzaW5rcGFkIiwgMyk7CisgIGlmIChjYXBzKQorICAgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3NldF9jYXBzIChzcmNwYWQsIGNhcHMpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAoc3JjcGFkLCBzaW5rcGFkKSA9PSBHU1RfUEFEX0xJTktfT0ssCisgICAgICAiQ291bGQgbm90IGxpbmsgc291cmNlIGFuZCAlcyBzaW5rIHBhZHMiLCBHU1RfRUxFTUVOVF9OQU1FIChlbGVtZW50KSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOyAgIC8qIGJlY2F1c2Ugd2UgZ290IGl0IGhpZ2hlciB1cCAqLworCisgIC8qIHJlZmVyZW5jZXMgYXJlIG93bmVkIGJ5OiAxKSBhdmltdXgsIDIpIGNvbGxlY3QgcGFkcyAqLworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChzaW5rcGFkLCAic2lua3BhZCIsIDIpOworCisgIHJldHVybiBzcmNwYWQ7Cit9CisKK3N0YXRpYyB2b2lkCit0ZWFyZG93bl9zcmNfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgY29uc3QgZ2NoYXIgKiBzaW5rbmFtZSkKK3sKKyAgR3N0UGFkICpzcmNwYWQsICpzaW5rcGFkOworICBnY2hhciAqcGFkbmFtZTsKKworICAvKiBjbGVhbiB1cCBmbG9hdGluZyBzcmMgcGFkICovCisgIHBhZG5hbWUgPSBnX3N0cmR1cCAoc2lua25hbWUpOworICBtZW1jcHkgKHN0cmNociAocGFkbmFtZSwgJyUnKSwgIjAiLCAyKTsKKyAgaWYgKCEoc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChlbGVtZW50LCBwYWRuYW1lKSkpCisgICAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoZWxlbWVudCwgcGFkbmFtZSk7CisgIGdfZnJlZSAocGFkbmFtZSk7CisgIC8qIHBhZCByZWZzIGhlbGQgYnkgMSkgYXZpbXV4IDIpIGNvbGxlY3RwYWRzIGFuZCAzKSB1cyAodGhyb3VnaCBfZ2V0KSAqLworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChzaW5rcGFkLCAic2lua3BhZCIsIDMpOworICBzcmNwYWQgPSBnc3RfcGFkX2dldF9wZWVyIChzaW5rcGFkKTsKKworICBnc3RfcGFkX3VubGluayAoc3JjcGFkLCBzaW5rcGFkKTsKKworICAvKiBhZnRlciB1bmxpbmtpbmcsIHBhZCByZWZzIHN0aWxsIGhlbGQgYnkKKyAgICogMSkgYXZpbXV4IGFuZCAyKSBjb2xsZWN0cGFkcyBhbmQgMykgdXMgKHRocm91Z2ggX2dldCkgKi8KKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoc2lua3BhZCwgInNpbmtwYWQiLCAzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZCk7CisgIC8qIG9uZSBtb3JlIHJlZiBpcyBoZWxkIGJ5IGVsZW1lbnQgaXRzZWxmICovCisKKyAgLyogcGFkIHJlZnMgaGVsZCBieSBib3RoIGNyZWF0b3IgYW5kIHRoaXMgZnVuY3Rpb24gKHRocm91Z2ggX2dldF9wZWVyKSAqLworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChzcmNwYWQsICJzcmNwYWQiLCAyKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF9hdmltdXggKEdzdFN0YXRpY1BhZFRlbXBsYXRlICogc3JjdGVtcGxhdGUsIGNvbnN0IGdjaGFyICogc2lua25hbWUpCit7CisgIEdzdEVsZW1lbnQgKmF2aW11eDsKKworICBHU1RfREVCVUcgKCJzZXR1cF9hdmltdXgiKTsKKyAgYXZpbXV4ID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJhdmltdXgiKTsKKyAgbXlzcmNwYWQgPSBzZXR1cF9zcmNfcGFkIChhdmltdXgsIHNyY3RlbXBsYXRlLCBOVUxMLCBzaW5rbmFtZSk7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAoYXZpbXV4LCAmc2lua3RlbXBsYXRlKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICByZXR1cm4gYXZpbXV4OworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF9hdmltdXggKEdzdEVsZW1lbnQgKiBhdmltdXgsIGNvbnN0IGdjaGFyICogc2lua25hbWUpCit7CisgIEdTVF9ERUJVRyAoImNsZWFudXBfYXZpbXV4Iik7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXZpbXV4LCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICB0ZWFyZG93bl9zcmNfcGFkIChhdmltdXgsIHNpbmtuYW1lKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChhdmltdXgpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAoYXZpbXV4KTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2F2aW11eF9wYWQgKEdzdFN0YXRpY1BhZFRlbXBsYXRlICogc3JjdGVtcGxhdGUsCisgICAgY29uc3QgZ2NoYXIgKiBzcmNfY2Fwc19zdHJpbmcsIGNvbnN0IGdjaGFyICogY2h1bmtfaWQsCisgICAgY29uc3QgZ2NoYXIgKiBzaW5rbmFtZSkKK3sKKyAgR3N0RWxlbWVudCAqYXZpbXV4OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBpbnQgbnVtX2J1ZmZlcnM7CisgIGludCBpOworICBndWludDggZGF0YTBbNF0gPSAiUklGRiI7CisgIGd1aW50OCBkYXRhMVs4XSA9ICJBVkkgTElTVCI7CisgIGd1aW50OCBkYXRhMls4XSA9ICJoZHJsYXZpaCI7CisgIGd1aW50OCBkYXRhM1s0XSA9ICJMSVNUIjsKKyAgZ3VpbnQ4IGRhdGE0WzhdID0gInN0cmxzdHJoIjsKKyAgZ3VpbnQ4IGRhdGE1WzRdID0gInN0cmYiOworICBndWludDggZGF0YTZbNF0gPSAiTElTVCI7CisgIGd1aW50OCBkYXRhN1s0XSA9ICJtb3ZpIjsKKworICBhdmltdXggPSBzZXR1cF9hdmltdXggKHNyY3RlbXBsYXRlLCBzaW5rbmFtZSk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF2aW11eCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxKTsKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChzcmNfY2Fwc19zdHJpbmcpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXZpbXV4LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIG51bV9idWZmZXJzID0gZ19saXN0X2xlbmd0aCAoYnVmZmVycyk7CisgIC8qIGF0IGxlYXN0IGV4cGVjdCBhdmkgaGVhZGVyLCBjaHVuayBoZWFkZXIsIGNodW5rIGFuZCBwYWRkaW5nICovCisgIGZhaWxfdW5sZXNzIChudW1fYnVmZmVycyA+PSA0KTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2J1ZmZlcnM7ICsraSkgeworICAgIG91dGJ1ZmZlciA9IEdTVF9CVUZGRVIgKGJ1ZmZlcnMtPmRhdGEpOworICAgIGZhaWxfaWYgKG91dGJ1ZmZlciA9PSBOVUxMKTsKKyAgICBidWZmZXJzID0gZ19saXN0X3JlbW92ZSAoYnVmZmVycywgb3V0YnVmZmVyKTsKKworICAgIHN3aXRjaCAoaSkgeworICAgICAgY2FzZSAwOnsgICAgICAgICAgICAgICAgIC8qIGNoZWNrIHJpZmYgaGVhZGVyICovCisgICAgICAgIC8qIGF2aSBoZWFkZXIgKi8KKyAgICAgICAgR3N0TWFwSW5mbyBtYXA7CisgICAgICAgIGdzaXplIHNpemU7CisgICAgICAgIGd1aW50OCAqZGF0YTsKKworICAgICAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgICBkYXRhID0gbWFwLmRhdGE7CisgICAgICAgIHNpemUgPSBtYXAuc2l6ZTsKKworICAgICAgICBmYWlsX3VubGVzcyAobWVtY21wIChkYXRhLCBkYXRhMCwgc2l6ZW9mIChkYXRhMCkpID09IDApOworICAgICAgICBmYWlsX3VubGVzcyAobWVtY21wIChkYXRhICsgOCwgZGF0YTEsIHNpemVvZiAoZGF0YTEpKSA9PSAwKTsKKyAgICAgICAgZmFpbF91bmxlc3MgKG1lbWNtcCAoZGF0YSArIDIwLCBkYXRhMiwgc2l6ZW9mIChkYXRhMikpID09IDApOworICAgICAgICAvKiB2aWRlbyBvciBhdWRpbyBoZWFkZXIgKi8KKyAgICAgICAgZGF0YSArPSAzMiArIDU2OworICAgICAgICBmYWlsX3VubGVzcyAobWVtY21wIChkYXRhLCBkYXRhMywgc2l6ZW9mIChkYXRhMykpID09IDApOworICAgICAgICBmYWlsX3VubGVzcyAobWVtY21wIChkYXRhICsgOCwgZGF0YTQsIHNpemVvZiAoZGF0YTQpKSA9PSAwKTsKKyAgICAgICAgZmFpbF91bmxlc3MgKG1lbWNtcCAoZGF0YSArIDc2LCBkYXRhNSwgc2l6ZW9mIChkYXRhNSkpID09IDApOworICAgICAgICAvKiBhdmkgZGF0YSBoZWFkZXIgKi8KKyAgICAgICAgZGF0YSA9IG1hcC5kYXRhOworICAgICAgICBkYXRhICs9IHNpemUgLSAxMjsKKyAgICAgICAgZmFpbF91bmxlc3MgKG1lbWNtcCAoZGF0YSwgZGF0YTYsIHNpemVvZiAoZGF0YTYpKSA9PSAwKTsKKyAgICAgICAgZGF0YSArPSA4OworICAgICAgICBmYWlsX3VubGVzcyAobWVtY21wIChkYXRhLCBkYXRhNywgc2l6ZW9mIChkYXRhNykpID09IDApOworICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAvKiBjaHVuayBoZWFkZXIgKi8KKyAgICAgICAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZmZlcikgPT0gOCk7CisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAob3V0YnVmZmVyLCAwLCBjaHVua19pZCwgNCkgPT0gMCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAob3V0YnVmZmVyKSA9PSAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgLyogYnVmZmVyIHdlIHB1dCBpbiwgbXVzdCBiZSBwYWRkZWQgdG8gZXZlbiBzaXplICovCisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWZmZXIpID09IDEpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKG91dGJ1ZmZlciwgIm91dGJ1ZmZlciIsIDEpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1ZmZlcik7CisgICAgb3V0YnVmZmVyID0gTlVMTDsKKyAgfQorCisgIGNsZWFudXBfYXZpbXV4IChhdmltdXgsIHNpbmtuYW1lKTsKKyAgZ19saXN0X2ZyZWUgKGJ1ZmZlcnMpOworICBidWZmZXJzID0gTlVMTDsKK30KKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF92aWRlb19wYWQpCit7CisgIGNoZWNrX2F2aW11eF9wYWQgKCZzcmN2aWRlb3RlbXBsYXRlLCBWSURFT19DQVBTX1NUUklORywgIjAwZGIiLCAidmlkZW9fJXUiKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2F1ZGlvX3BhZCkKK3sKKyAgY2hlY2tfYXZpbXV4X3BhZCAoJnNyY2F1ZGlvdGVtcGxhdGUsIEFVRElPX0NBUFNfU1RSSU5HLCAiMDB3YiIsICJhdWRpb18ldSIpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworc3RhdGljIFN1aXRlICoKK2F2aW11eF9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJhdmltdXgiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdmlkZW9fcGFkKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2F1ZGlvX3BhZCk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChhdmltdXgpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpc3VidGl0bGUuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aXN1YnRpdGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIwMGIxNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aXN1YnRpdGxlLmMKQEAgLTAsMCArMSwyNjMgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIHVuaXQgdGVzdCBmb3IgYXZpc3VidGl0bGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKiBFbGVtZW50LUNoZWNrbGlzdC1WZXJzaW9uOiA1ICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworR3N0UGFkICpteXNpbmtwYWQ7CitHc3RQYWQgKm15c3JjcGFkOworCitndWludDggYXZpc3ViX3V0Zl84X3dpdGhfYm9tW10gPSB7CisgIDB4NDcsIDB4NDEsIDB4NDIsIDB4MzIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MTAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDUsIDB4MDAsIDB4NmUsIDB4MDAsIDB4NjcsCisgIDB4MDAsIDB4NmMsIDB4MDAsIDB4NjksIDB4MDAsIDB4NzMsIDB4MDAsIDB4NjgsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4OGUsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4ZWYsIDB4YmIsIDB4YmYsIDB4MzEsIDB4MGQsIDB4MGEsIDB4MzAsCisgIDB4MzAsIDB4M2EsIDB4MzAsIDB4MzAsIDB4M2EsIDB4MzAsIDB4MzAsIDB4MmMsCisgIDB4MzEsIDB4MzAsIDB4MzAsIDB4MjAsIDB4MmQsIDB4MmQsIDB4M2UsIDB4MjAsCisgIDB4MzAsIDB4MzAsIDB4M2EsIDB4MzAsIDB4MzAsIDB4M2EsIDB4MzAsIDB4MzIsCisgIDB4MmMsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MGQsIDB4MGEsIDB4M2MsIDB4NjIsCisgIDB4M2UsIDB4NDEsIDB4NmUsIDB4MjAsIDB4NTUsIDB4NTQsIDB4NDYsIDB4MzgsCisgIDB4MjAsIDB4NTMsIDB4NzUsIDB4NjIsIDB4NzQsIDB4NjksIDB4NzQsIDB4NmMsCisgIDB4NjUsIDB4MjAsIDB4NzcsIDB4NjksIDB4NzQsIDB4NjgsIDB4MjAsIDB4NDIsCisgIDB4NGYsIDB4NGQsIDB4M2MsIDB4MmYsIDB4NjIsIDB4M2UsIDB4MGQsIDB4MGEsCisgIDB4MGQsIDB4MGEsIDB4MzIsIDB4MGQsIDB4MGEsIDB4MzAsIDB4MzAsIDB4M2EsCisgIDB4MzAsIDB4MzAsIDB4M2EsIDB4MzAsIDB4MzIsIDB4MmMsIDB4MzEsIDB4MzAsCisgIDB4MzAsIDB4MjAsIDB4MmQsIDB4MmQsIDB4M2UsIDB4MjAsIDB4MzAsIDB4MzAsCisgIDB4M2EsIDB4MzAsIDB4MzAsIDB4M2EsIDB4MzAsIDB4MzQsIDB4MmMsIDB4MzAsCisgIDB4MzAsIDB4MzAsIDB4MGQsIDB4MGEsIDB4NTMsIDB4NmYsIDB4NmQsIDB4NjUsCisgIDB4NzQsIDB4NjgsIDB4NjksIDB4NmUsIDB4NjcsIDB4MjAsIDB4NmUsIDB4NmYsCisgIDB4NmUsIDB4NDEsIDB4NTMsIDB4NDMsIDB4NDksIDB4NDksIDB4MjAsIDB4MmQsCisgIDB4MjAsIDB4YzIsIDB4YjUsIDB4YzMsIDB4YjYsIDB4YzMsIDB4YTQsIDB4YzMsCisgIDB4YmMsIDB4YzMsIDB4OWYsIDB4MGQsIDB4MGEsIDB4MGQsIDB4MGEKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1zdWJ0aXRsZSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXN1YnRpdGxlLWF2aSIpCisgICAgKTsKKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfYXZpc3VidGl0bGUgKHZvaWQpCit7CisgIEdzdEVsZW1lbnQgKmF2aXN1YnRpdGxlOworICBHc3RDYXBzICpzcmNjYXBzOworCisgIEdTVF9ERUJVRyAoInNldHVwX2F2aXN1YnRpdGxlIik7CisgIGF2aXN1YnRpdGxlID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJhdmlzdWJ0aXRsZSIpOworICBteXNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKGF2aXN1YnRpdGxlLCAmc2lua190ZW1wbGF0ZSk7CisgIG15c3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKGF2aXN1YnRpdGxlLCAmc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBUUlVFKTsKKyAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXN1YnRpdGxlLWF2aSIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXZpc3VidGl0bGUsIHNyY2NhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKyAgcmV0dXJuIGF2aXN1YnRpdGxlOworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF9hdmlzdWJ0aXRsZSAoR3N0RWxlbWVudCAqIGF2aXN1YnRpdGxlKQoreworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBGQUxTRSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAoYXZpc3VidGl0bGUpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAoYXZpc3VidGl0bGUpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAoYXZpc3VidGl0bGUpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfd3JvbmdfYnVmZmVyIChndWludDggKiBkYXRhLCBndWludCBsZW5ndGgpCit7CisgIEdzdEJ1ZmZlciAqYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIGxlbmd0aCwgMCk7CisgIEdzdEVsZW1lbnQgKmF2aXN1YnRpdGxlID0gc2V0dXBfYXZpc3VidGl0bGUgKCk7CisKKyAgZ3N0X2J1ZmZlcl9maWxsIChidWZmZXIsIDAsIGRhdGEsIGxlbmd0aCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF2aXN1YnRpdGxlLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisgIGdzdF9idWZmZXJfcmVmIChidWZmZXIpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChidWZmZXIsICJpbmJ1ZmZlciIsIDIpOworICAvKiBwdXNoIHRoZSBicm9rZW4gYnVmZmVyICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBidWZmZXIpID09IEdTVF9GTE9XX0VSUk9SLAorICAgICAgImFjY2VwdGVkIGEgYnJva2VuIGJ1ZmZlciIpOworICAvKiBjaGVjayBpZiB3ZSBoYXZlIHVucmVmZmVkIHRoaXMgYnVmZmVyIG9uIGZhaWx1cmUgKi8KKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXZpc3VidGl0bGUsCisgICAgICAgICAgR1NUX1NUQVRFX05VTEwpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywgImNvdWxkIG5vdCBzZXQgdG8gbnVsbCIpOworICBjbGVhbnVwX2F2aXN1YnRpdGxlIChhdmlzdWJ0aXRsZSk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19jb3JyZWN0X2J1ZmZlciAoZ3VpbnQ4ICogc3JjX2RhdGEsIGd1aW50IHNyY19zaXplLCBndWludDggKiBkc3RfZGF0YSwKKyAgICBndWludCBkc3Rfc2l6ZSkKK3sKKyAgR3N0QnVmZmVyICpidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgc3JjX3NpemUsIDApOworICBHc3RCdWZmZXIgKm5ld0J1ZmZlcjsKKyAgR3N0RWxlbWVudCAqYXZpc3VidGl0bGUgPSBzZXR1cF9hdmlzdWJ0aXRsZSAoKTsKKyAgR3N0RXZlbnQgKmV2ZW50OworCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA9PSAwLCAiQnVmZmVycyBsaXN0IG5lZWRzIHRvIGJlIGVtcHR5Iik7CisgIGdzdF9idWZmZXJfZmlsbCAoYnVmZmVyLCAwLCBzcmNfZGF0YSwgc3JjX3NpemUpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdmlzdWJ0aXRsZSwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChidWZmZXIsICJpbmJ1ZmZlciIsIDEpOworICBldmVudCA9IGdzdF9ldmVudF9uZXdfc2VlayAoMS4wLCBHU1RfRk9STUFUX1RJTUUsIEdTVF9TRUVLX0ZMQUdfRkxVU0gsCisgICAgICBHU1RfU0VFS19UWVBFX1NFVCwgMiAqIEdTVF9TRUNPTkQsIEdTVF9TRUVLX1RZUEVfU0VULCA1ICogR1NUX1NFQ09ORCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZW5kX2V2ZW50IChhdmlzdWJ0aXRsZSwgZXZlbnQpID09IEZBTFNFLAorICAgICAgIlNlZWtpbmcgaXMgbm90IHBvc3NpYmxlIHdoZW4gdGhlcmUgaXMgbm8gYnVmZmVyIHlldCIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgYnVmZmVyKSA9PSBHU1RfRkxPV19PSywKKyAgICAgICJub3QgYWNjZXB0ZWQgYSBjb3JyZWN0IGJ1ZmZlciIpOworICAvKiB3ZSBnYXZlIGF3YXkgb3VyIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyLCBkb24ndCBhc3N1bWUgYW55dGhpbmcgKi8KKyAgYnVmZmVyID0gTlVMTDsKKyAgLyogYSBuZXcgYnVmZmVyIGlzIGNyZWF0ZWQgaW4gdGhlIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID09IDEsCisgICAgICAiTm8gbmV3IGJ1ZmZlciBpbiB0aGUgYnVmZmVycyBsaXN0Iik7CisgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWVrICgxLjAsIEdTVF9GT1JNQVRfVElNRSwgR1NUX1NFRUtfRkxBR19GTFVTSCwKKyAgICAgIEdTVF9TRUVLX1RZUEVfU0VULCAyICogR1NUX1NFQ09ORCwgR1NUX1NFRUtfVFlQRV9TRVQsIDUgKiBHU1RfU0VDT05EKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NlbmRfZXZlbnQgKGF2aXN1YnRpdGxlLCBldmVudCkgPT0gVFJVRSwKKyAgICAgICJzZWVraW5nIHNob3VsZCBiZSB3b3JraW5nIG5vdyIpOworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPT0gMiwKKyAgICAgICJBZnRlciBzZWVraW5nIHdlIG5lZWQgYW5vdGhlciBidWZmZXIgaW4gdGhlIGJ1ZmZlcnMiKTsKKyAgbmV3QnVmZmVyID0gR1NUX0JVRkZFUiAoYnVmZmVycy0+ZGF0YSk7CisgIGJ1ZmZlcnMgPSBnX2xpc3RfcmVtb3ZlIChidWZmZXJzLCBuZXdCdWZmZXIpOworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPT0gMSwgIkJ1ZmZlcnMgbGlzdCBuZWVkcyB0byBiZSBlbXB0eSIpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAobmV3QnVmZmVyKSA9PSBkc3Rfc2l6ZSwKKyAgICAgICJzaXplIG9mIHRoZSBuZXcgYnVmZmVyIGlzIHdyb25nICggJWQgIT0gJWQpIiwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKG5ld0J1ZmZlciksIGRzdF9zaXplKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChuZXdCdWZmZXIsIDAsIGRzdF9kYXRhLCBkc3Rfc2l6ZSkgPT0gMCwKKyAgICAgICJkYXRhIG9mIHRoZSBidWZmZXIgaXMgbm90IGNvcnJlY3QiKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAobmV3QnVmZmVyKTsKKyAgLyogZnJlZSB0aGUgYnVmZmVyIGZyb20gc2Vla2luZyAqLworICBnc3RfYnVmZmVyX3VucmVmIChHU1RfQlVGRkVSIChidWZmZXJzLT5kYXRhKSk7CisgIGJ1ZmZlcnMgPSBnX2xpc3RfcmVtb3ZlIChidWZmZXJzLCBidWZmZXJzLT5kYXRhKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXZpc3VidGl0bGUsCisgICAgICAgICAgR1NUX1NUQVRFX05VTEwpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywgImNvdWxkIG5vdCBzZXQgdG8gbnVsbCIpOworICBjbGVhbnVwX2F2aXN1YnRpdGxlIChhdmlzdWJ0aXRsZSk7Cit9CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYXZpc3VidGl0bGVfbmVnYXRpdmUpCit7CisgIGd1aW50OCB3cm9uZ19tYWdpY1tdID0KKyAgICAgIHsgMHg0NywgMHg0MSwgMHg0MSwgMHgzMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwCisgIH07CisgIGd1aW50OCB3cm9uZ19maXhlZF93b3JkXzJbXSA9IHsKKyAgICAweDQ3LCAweDQxLCAweDQyLCAweDMyLCAweDAwLCAweDAyLCAweDAxLCAweDEwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDUsIDB4MDAsIDB4NmUsIDB4MDAsIDB4NjcsCisgICAgMHgwMCwgMHg2YywgMHgwMCwgMHg2OSwgMHgwMCwgMHg3MywgMHgwMCwgMHg2OAorICB9OworICBndWludDggd3JvbmdfbGVuZ3RoX2FmdGVyX25hbWVbXSA9IHsKKyAgICAweDQ3LCAweDQxLCAweDQyLCAweDMyLCAweDAwLCAweDAyLCAweDAwLCAweDEwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDUsIDB4MDAsIDB4NmUsIDB4MDAsIDB4NjcsCisgICAgMHgwMCwgMHg2YywgMHgwMCwgMHg2OSwgMHgwMCwgMHg3MywgMHgwMCwgMHg2OAorICB9OworICBndWludDggd3JvbmdfZml4ZWRfd29yZF80W10gPSB7CisgICAgMHg0NywgMHg0MSwgMHg0MiwgMHgzMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgxMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDQ1LCAweDAwLCAweDZlLCAweDAwLCAweDY3LAorICAgIDB4MDAsIDB4NmMsIDB4MDAsIDB4NjksIDB4MDAsIDB4NzMsIDB4MDAsIDB4NjgsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMSwgMHg4ZSwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweGVmLCAweGJiLCAweGJmLCAweDMxLCAweDBkLCAweDBhLCAweDMwCisgIH07CisgIGd1aW50OCB3cm9uZ190b3RhbF9sZW5ndGhbXSA9IHsKKyAgICAweDQ3LCAweDQxLCAweDQyLCAweDMyLCAweDAwLCAweDAyLCAweDAwLCAweDEwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDUsIDB4MDAsIDB4NmUsIDB4MDAsIDB4NjcsCisgICAgMHgwMCwgMHg2YywgMHgwMCwgMHg2OSwgMHgwMCwgMHg3MywgMHgwMCwgMHg2OCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDhlLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4ZWYsIDB4YmIsIDB4YmYsIDB4MzEsIDB4MGQsIDB4MGEsIDB4MzAKKyAgfTsKKyAgLyogc2l6ZSBvZiB0aGUgYnVmZmVyIG11c3QgYmUgbGFyZ2VyIHRoYW4gMTEgKi8KKyAgY2hlY2tfd3JvbmdfYnVmZmVyIChhdmlzdWJfdXRmXzhfd2l0aF9ib20sIDExKTsKKyAgLyogYnVmZmVyIG11c3Qgc3RhcnQgd2l0aCAnR0FCMlwwJyAqLworICBjaGVja193cm9uZ19idWZmZXIgKHdyb25nX21hZ2ljLCAxNCk7CisgIC8qIG5leHQgd29yZCBtdXN0IGJlIDIgKi8KKyAgY2hlY2tfd3JvbmdfYnVmZmVyICh3cm9uZ19maXhlZF93b3JkXzIsIDI0KTsKKyAgLyogbGVuZ3RoIG11c3QgYmUgbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgbmFtZSArIDE3ICovCisgIGNoZWNrX3dyb25nX2J1ZmZlciAod3JvbmdfbGVuZ3RoX2FmdGVyX25hbWUsIDI0KTsKKyAgLyogbmV4dCB3b3JkIG11c3QgYmUgNCAqLworICBjaGVja193cm9uZ19idWZmZXIgKHdyb25nX2ZpeGVkX3dvcmRfNCwgMzYpOworICAvKiBjaGVjayB3cm9uZyB0b3RhbCBsZW5ndGggKi8KKyAgY2hlY2tfd3JvbmdfYnVmZmVyICh3cm9uZ190b3RhbF9sZW5ndGgsIDM2KTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9hdmlzdWJ0aXRsZV9wb3NpdGl2ZSkKK3sKKyAgZ3VpbnQ4IGF2aXN1Yl91dGZfOF93aXRob3V0X2JvbVtdID0geworICAgIDB4NDcsIDB4NDEsIDB4NDIsIDB4MzIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MTAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NSwgMHgwMCwgMHg2ZSwgMHgwMCwgMHg2NywKKyAgICAweDAwLCAweDZjLCAweDAwLCAweDY5LCAweDAwLCAweDczLCAweDAwLCAweDY4LAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4OGIsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgzMSwgMHgwZCwgMHgwYSwgMHgzMCwKKyAgICAweDMwLCAweDNhLCAweDMwLCAweDMwLCAweDNhLCAweDMwLCAweDMwLCAweDJjLAorICAgIDB4MzEsIDB4MzAsIDB4MzAsIDB4MjAsIDB4MmQsIDB4MmQsIDB4M2UsIDB4MjAsCisgICAgMHgzMCwgMHgzMCwgMHgzYSwgMHgzMCwgMHgzMCwgMHgzYSwgMHgzMCwgMHgzMiwKKyAgICAweDJjLCAweDMwLCAweDMwLCAweDMwLCAweDBkLCAweDBhLCAweDNjLCAweDYyLAorICAgIDB4M2UsIDB4NDEsIDB4NmUsIDB4MjAsIDB4NTUsIDB4NTQsIDB4NDYsIDB4MzgsCisgICAgMHgyMCwgMHg1MywgMHg3NSwgMHg2MiwgMHg3NCwgMHg2OSwgMHg3NCwgMHg2YywKKyAgICAweDY1LCAweDIwLCAweDc3LCAweDY5LCAweDc0LCAweDY4LCAweDIwLCAweDQyLAorICAgIDB4NGYsIDB4NGQsIDB4M2MsIDB4MmYsIDB4NjIsIDB4M2UsIDB4MGQsIDB4MGEsCisgICAgMHgwZCwgMHgwYSwgMHgzMiwgMHgwZCwgMHgwYSwgMHgzMCwgMHgzMCwgMHgzYSwKKyAgICAweDMwLCAweDMwLCAweDNhLCAweDMwLCAweDMyLCAweDJjLCAweDMxLCAweDMwLAorICAgIDB4MzAsIDB4MjAsIDB4MmQsIDB4MmQsIDB4M2UsIDB4MjAsIDB4MzAsIDB4MzAsCisgICAgMHgzYSwgMHgzMCwgMHgzMCwgMHgzYSwgMHgzMCwgMHgzNCwgMHgyYywgMHgzMCwKKyAgICAweDMwLCAweDMwLCAweDBkLCAweDBhLCAweDUzLCAweDZmLCAweDZkLCAweDY1LAorICAgIDB4NzQsIDB4NjgsIDB4NjksIDB4NmUsIDB4NjcsIDB4MjAsIDB4NmUsIDB4NmYsCisgICAgMHg2ZSwgMHg0MSwgMHg1MywgMHg0MywgMHg0OSwgMHg0OSwgMHgyMCwgMHgyZCwKKyAgICAweDIwLCAweGMyLCAweGI1LCAweGMzLCAweGI2LCAweGMzLCAweGE0LCAweGMzLAorICAgIDB4YmMsIDB4YzMsIDB4OWYsIDB4MGQsIDB4MGEsIDB4MGQsIDB4MGEKKyAgfTsKKyAgY2hlY2tfY29ycmVjdF9idWZmZXIgKGF2aXN1Yl91dGZfOF93aXRoX2JvbSwgMTc1LCBhdmlzdWJfdXRmXzhfd2l0aF9ib20gKyAzNiwKKyAgICAgIDEzOSk7CisgIGNoZWNrX2NvcnJlY3RfYnVmZmVyIChhdmlzdWJfdXRmXzhfd2l0aG91dF9ib20sIDE3MiwKKyAgICAgIGF2aXN1Yl91dGZfOF93aXRob3V0X2JvbSArIDMzLCAxMzkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCithdmlzdWJ0aXRsZV9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJhdmlzdWJ0aXRsZSIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9hdmlzdWJ0aXRsZV9uZWdhdGl2ZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9hdmlzdWJ0aXRsZV9wb3NpdGl2ZSk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChhdmlzdWJ0aXRsZSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9jYXBzc2V0dGVyLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9jYXBzc2V0dGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhYWQ0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2NhcHNzZXR0ZXIuYwpAQCAtMCwwICsxLDIzMiBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciBjYXBzc2V0dGVyCisgKgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCisKKy8qIEZvciBlYXNlIG9mIHByb2dyYW1taW5nIHdlIHVzZSBnbG9iYWxzIHRvIGtlZXAgcmVmcyBmb3Igb3VyIGZsb2F0aW5nCisgKiBzcmMgYW5kIHNpbmsgcGFkcyB3ZSBjcmVhdGU7IG90aGVyd2lzZSB3ZSBhbHdheXMgaGF2ZSB0byBkbyBnZXRfcGFkLAorICogZ2V0X3BlZXIsIGFuZCB0aGVuIHJlbW92ZSByZWZlcmVuY2VzIGluIGV2ZXJ5IHRlc3QgZnVuY3Rpb24gKi8KK3N0YXRpYyBHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfY2Fwc3NldHRlciAodm9pZCkKK3sKKyAgR3N0RWxlbWVudCAqY2Fwc3NldHRlcjsKKworICBHU1RfREVCVUcgKCJzZXR1cF9jYXBzc2V0dGVyIik7CisKKyAgY2Fwc3NldHRlciA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgiY2Fwc3NldHRlciIpOworICBteXNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkIChjYXBzc2V0dGVyLCAmc3JjdGVtcGxhdGUpOworICBteXNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKGNhcHNzZXR0ZXIsICZzaW5rdGVtcGxhdGUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIFRSVUUpOworCisgIHJldHVybiBjYXBzc2V0dGVyOworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF9jYXBzc2V0dGVyIChHc3RFbGVtZW50ICogY2Fwc3NldHRlcikKK3sKKyAgR1NUX0RFQlVHICgiY2xlYW51cF9jYXBzc2V0dGVyIik7CisKKyAgZ3N0X2NoZWNrX2Ryb3BfYnVmZmVycyAoKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAoY2Fwc3NldHRlcik7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAoY2Fwc3NldHRlcik7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChjYXBzc2V0dGVyKTsKK30KKworc3RhdGljIHZvaWQKK3B1c2hfYW5kX3Rlc3QgKEdzdENhcHMgKiBwcm9wX2NhcHMsIGdib29sZWFuIGpvaW4sIGdib29sZWFuIHJlcGxhY2UsCisgICAgR3N0Q2FwcyAqIGluX2NhcHMsIEdzdENhcHMgKiBvdXRfY2FwcykKK3sKKyAgR3N0RWxlbWVudCAqY2Fwc3NldHRlcjsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIEdzdENhcHMgKmN1cnJlbnRfb3V0OworCisgIGNhcHNzZXR0ZXIgPSBzZXR1cF9jYXBzc2V0dGVyICgpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChjYXBzc2V0dGVyLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChjYXBzc2V0dGVyLCAiam9pbiIsIGpvaW4sIE5VTEwpOworICBnX29iamVjdF9zZXQgKGNhcHNzZXR0ZXIsICJyZXBsYWNlIiwgcmVwbGFjZSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoY2Fwc3NldHRlciwgImNhcHMiLCBwcm9wX2NhcHMsIE5VTEwpOworICBnc3RfY2Fwc191bnJlZiAocHJvcF9jYXBzKTsKKworICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDQpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChidWZmZXIsICJidWZmZXIiLCAxKTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChidWZmZXIsIDAsICJkYXRhIiwgNCk7CisKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGNhcHNzZXR0ZXIsIGluX2NhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChpbl9jYXBzKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgYnVmZmVyKSA9PSBHU1RfRkxPV19PSywKKyAgICAgICJGYWlsZWQgcHVzaGluZyBidWZmZXIgdG8gY2Fwc3NldHRlciIpOworCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkgPT0gVFJVRSk7CisKKyAgLyogLi4uIGJ1dCBpdCBzaG91bGQgZW5kIHVwIGJlaW5nIGNvbGxlY3RlZCBvbiB0aGUgZ2xvYmFsIGJ1ZmZlciBsaXN0ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA9PSAxKTsKKyAgYnVmZmVyID0gZ19saXN0X2ZpcnN0IChidWZmZXJzKS0+ZGF0YTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoYnVmZmVyLCAiYnVmZmVyIiwgMSk7CisKKyAgY3VycmVudF9vdXQgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKG15c2lua3BhZCk7CisgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19pc19lcXVhbCAob3V0X2NhcHMsIGN1cnJlbnRfb3V0KSk7CisgIGdzdF9jYXBzX3VucmVmIChjdXJyZW50X291dCk7CisgIGdzdF9jYXBzX3VucmVmIChvdXRfY2Fwcyk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2NhcHNzZXR0ZXIgKGNhcHNzZXR0ZXIpOworfQorCisjZGVmaW5lIFNSQ19XSURUSCAgIDgKKyNkZWZpbmUgU1JDX0hFSUdIVCAxMgorCitzdGF0aWMgR3N0Q2FwcyAqCittYWtlX3NyY19jYXBzICh2b2lkKQoreworICByZXR1cm4gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtZm9vIiwgIndpZHRoIiwgR19UWVBFX0lOVCwgU1JDX1dJRFRILAorICAgICAgImhlaWdodCIsIEdfVFlQRV9JTlQsIFNSQ19IRUlHSFQsIE5VTEwpOworfQorCisvKiBkb24ndCB0cnkgdGhlc2UgY2FwcyBtdXRhdGlvbnMgYXQgaG9tZSwgZm9sa3MgKi8KKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfbl9qb2luX25fcmVwbGFjZSkKK3sKKyAgR3N0Q2FwcyAqaW5fY2FwcywgKnByb3BfY2FwcywgKm91dF9jYXBzOworCisgIGluX2NhcHMgPSBtYWtlX3NyY19jYXBzICgpOworICBwcm9wX2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1iYXIiLAorICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgMiAqIFNSQ19XSURUSCwgTlVMTCk7CisgIG91dF9jYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtYmFyIiwKKyAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIDIgKiBTUkNfV0lEVEgsCisgICAgICAiaGVpZ2h0IiwgR19UWVBFX0lOVCwgU1JDX0hFSUdIVCwgTlVMTCk7CisgIHB1c2hfYW5kX3Rlc3QgKHByb3BfY2FwcywgRkFMU0UsIEZBTFNFLCBpbl9jYXBzLCBvdXRfY2Fwcyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfbl9qb2luX3JlcGxhY2UpCit7CisgIEdzdENhcHMgKmluX2NhcHMsICpwcm9wX2NhcHMsICpvdXRfY2FwczsKKworICBpbl9jYXBzID0gbWFrZV9zcmNfY2FwcyAoKTsKKyAgcHJvcF9jYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtYmFyIiwKKyAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIDIgKiBTUkNfV0lEVEgsIE5VTEwpOworICBvdXRfY2FwcyA9IGdzdF9jYXBzX2NvcHkgKHByb3BfY2Fwcyk7CisgIHB1c2hfYW5kX3Rlc3QgKHByb3BfY2FwcywgRkFMU0UsIFRSVUUsIGluX2NhcHMsIG91dF9jYXBzKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9qb2luX25fcmVwbGFjZV9uX21hdGNoKQoreworICBHc3RDYXBzICppbl9jYXBzLCAqcHJvcF9jYXBzLCAqb3V0X2NhcHM7CisKKyAgLyogbm9uIGpvaW5pbmcgY2FwcyAqLworICBpbl9jYXBzID0gbWFrZV9zcmNfY2FwcyAoKTsKKyAgcHJvcF9jYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtYmFyIiwKKyAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIDIgKiBTUkNfV0lEVEgsIE5VTEwpOworICBvdXRfY2FwcyA9IGdzdF9jYXBzX2NvcHkgKGluX2NhcHMpOworICBwdXNoX2FuZF90ZXN0IChwcm9wX2NhcHMsIFRSVUUsIEZBTFNFLCBpbl9jYXBzLCBvdXRfY2Fwcyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfam9pbl9uX3JlcGxhY2VfbWF0Y2gpCit7CisgIEdzdENhcHMgKmluX2NhcHMsICpwcm9wX2NhcHMsICpvdXRfY2FwczsKKworICAvKiBqb2luaW5nIGNhcHMgKi8KKyAgaW5fY2FwcyA9IG1ha2Vfc3JjX2NhcHMgKCk7CisgIHByb3BfY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWZvbyIsCisgICAgICAid2lkdGgiLCBHX1RZUEVfSU5ULCAyICogU1JDX1dJRFRILCBOVUxMKTsKKyAgb3V0X2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1mb28iLAorICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgMiAqIFNSQ19XSURUSCwKKyAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBTUkNfSEVJR0hULCBOVUxMKTsKKyAgcHVzaF9hbmRfdGVzdCAocHJvcF9jYXBzLCBUUlVFLCBGQUxTRSwgaW5fY2Fwcywgb3V0X2NhcHMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2pvaW5fcmVwbGFjZV9uX21hdGNoKQoreworICBHc3RDYXBzICppbl9jYXBzLCAqcHJvcF9jYXBzLCAqb3V0X2NhcHM7CisKKyAgLyogbm9uIGpvaW5pbmcgY2FwcyAqLworICBpbl9jYXBzID0gbWFrZV9zcmNfY2FwcyAoKTsKKyAgcHJvcF9jYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtYmFyIiwKKyAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIDIgKiBTUkNfV0lEVEgsIE5VTEwpOworICBvdXRfY2FwcyA9IGdzdF9jYXBzX2NvcHkgKGluX2NhcHMpOworICBwdXNoX2FuZF90ZXN0IChwcm9wX2NhcHMsIFRSVUUsIFRSVUUsIGluX2NhcHMsIG91dF9jYXBzKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9qb2luX3JlcGxhY2VfbWF0Y2gpCit7CisgIEdzdENhcHMgKmluX2NhcHMsICpwcm9wX2NhcHMsICpvdXRfY2FwczsKKworICAvKiBqb2luaW5nIGNhcHMgKi8KKyAgaW5fY2FwcyA9IG1ha2Vfc3JjX2NhcHMgKCk7CisgIHByb3BfY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWZvbyIsCisgICAgICAid2lkdGgiLCBHX1RZUEVfSU5ULCAyICogU1JDX1dJRFRILCBOVUxMKTsKKyAgb3V0X2NhcHMgPSBnc3RfY2Fwc19jb3B5IChwcm9wX2NhcHMpOworICBwdXNoX2FuZF90ZXN0IChwcm9wX2NhcHMsIFRSVUUsIFRSVUUsIGluX2NhcHMsIG91dF9jYXBzKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorY2Fwc3NldHRlcl9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJjYXBzc2V0dGVyIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X25fam9pbl9uX3JlcGxhY2UpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfbl9qb2luX3JlcGxhY2UpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfam9pbl9uX3JlcGxhY2Vfbl9tYXRjaCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9qb2luX25fcmVwbGFjZV9tYXRjaCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9qb2luX3JlcGxhY2Vfbl9tYXRjaCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9qb2luX3JlcGxhY2VfbWF0Y2gpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoY2Fwc3NldHRlcik7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGFjZS5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvZGVpbnRlcmxhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmRiMWE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvZGVpbnRlcmxhY2UuYwpAQCAtMCwwICsxLDEwNTIgQEAKKy8qIEdTdHJlYW1lciB1bml0IHRlc3RzIGZvciB0aGUgZGVpbnRlcmxhY2UgZWxlbWVudAorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9jYXBzX2lzX2ludGVybGFjZWQgKEdzdENhcHMgKiBjYXBzKQoreworICBHc3RWaWRlb0luZm8gaW5mbzsKKworICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfaXNfZml4ZWQgKGNhcHMpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF92aWRlb19pbmZvX2Zyb21fY2FwcyAoJmluZm8sIGNhcHMpKTsKKworICByZXR1cm4gR1NUX1ZJREVPX0lORk9fSVNfSU5URVJMQUNFRCAoJmluZm8pOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9jcmVhdGVfYW5kX3VucmVmKQoreworICBHc3RFbGVtZW50ICpkZWludGVybGFjZTsKKworICBkZWludGVybGFjZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImRlaW50ZXJsYWNlIiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChkZWludGVybGFjZSAhPSBOVUxMKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGRlaW50ZXJsYWNlLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGRlaW50ZXJsYWNlKTsKK30KKworR1NUX0VORF9URVNUOworCisjZGVmaW5lIENBUFNfVklERU9fQ09NTU9OIFwKKyAgICAid2lkdGg9KGludCk4MDAsIGhlaWdodD0oaW50KTYwMCwgZnJhbWVyYXRlPShmcmFjdGlvbikxNS8xIgorCisjZGVmaW5lIENBUFNfSU1BR0VfQ09NTU9OIFwKKyAgICAid2lkdGg9KGludCkzMjAwLCBoZWlnaHQ9KGludCkzNDAwLCBmcmFtZXJhdGU9KGZyYWN0aW9uKTAvMSIKKworI2RlZmluZSBDQVBTX1lVWTIgXAorICAgICJ2aWRlby94LXJhdywgIiBcCisgICAgQ0FQU19WSURFT19DT01NT04gIiwgIiBcCisgICAgImZvcm1hdD0oc3RyaW5nKVlVWTIiCisKKyNkZWZpbmUgQ0FQU19ZVVkyX0lOVEVSTEFDRUQgXAorICAgIENBUFNfWVVZMiAiLCAiIFwKKyAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQiCisKKyNkZWZpbmUgQ0FQU19ZVllVIFwKKyAgICAidmlkZW8veC1yYXcsICIgXAorICAgIENBUFNfVklERU9fQ09NTU9OICIsICIgXAorICAgICJmb3JtYXQ9KHN0cmluZylZVllVIgorCisjZGVmaW5lIENBUFNfWVZZVV9JTlRFUkxBQ0VEIFwKKyAgICBDQVBTX1lWWVUgIiwgIiBcCisgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkIgorCisjZGVmaW5lIENBUFNfWVVZMl9JTUFHRSBcCisgICAgInZpZGVvL3gtcmF3LCAiIFwKKyAgICBDQVBTX0lNQUdFX0NPTU1PTiAiLCAiIFwKKyAgICAiZm9ybWF0PShzdHJpbmcpWVVZMiIKKworI2RlZmluZSBDQVBTX1lVWTJfSU5URVJMQUNFRF9JTUFHRSBcCisgICAgQ0FQU19ZVVkyX0lNQUdFICIsICIgXAorICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCIKKworI2RlZmluZSBDQVBTX1lWWVVfSU1BR0UgXAorICAgICJ2aWRlby94LXJhdywgIiBcCisgICAgQ0FQU19JTUFHRV9DT01NT04gIiwgIiBcCisgICAgImZvcm1hdD0oc3RyaW5nKVlWWVUiCisKKyNkZWZpbmUgQ0FQU19ZVllVX0lOVEVSTEFDRURfSU1BR0UgXAorICAgIENBUFNfWVZZVV9JTUFHRSAiLCAiIFwKKyAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQiCisKK3N0YXRpYyBHc3RFbGVtZW50ICpkZWludGVybGFjZTsKK3N0YXRpYyBHc3RQYWQgKnNyY3BhZDsKK3N0YXRpYyBHc3RQYWQgKnNpbmtwYWQ7CisKK3N0YXRpYyBHc3RFbGVtZW50ICpwaXBlbGluZTsKKworLyogc2V0cyB1cCBkZWludGVybGFjZSBhbmQgc2hvcnRjdXQgcG9pbnRlcnMgdG8gaXRzIHBhZHMgKi8KK3N0YXRpYyB2b2lkCitzZXR1cF9kZWludGVybGFjZSAodm9pZCkKK3sKKyAgZGVpbnRlcmxhY2UgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJkZWludGVybGFjZSIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZGVpbnRlcmxhY2UgIT0gTlVMTCk7CisKKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChkZWludGVybGFjZSwgInNpbmsiKTsKKyAgZmFpbF91bmxlc3MgKHNpbmtwYWQgIT0gTlVMTCk7CisgIHNyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChkZWludGVybGFjZSwgInNyYyIpOworICBmYWlsX3VubGVzcyAoc3JjcGFkICE9IE5VTEwpOworfQorCisvKiBzZXRzIHVwIGEgYmFzaWMgdGVzdCBwaXBlbGluZSBjb250YWluaW5nOgorICoKKyAqIHZpZGVvdGVzdHNyYyAhIGNhcHNmaWx0ZXIgISBkZWludGVybGFjZSAhIGZha2VzaW5rCisgKgorICogVGhlIHBhcmFtZXRlcnMgc2V0IHRoZSBjYXBzZmlsdGVyIGNhcHMgYW5kIHRoZSBudW0tYnVmZmVycworICogcHJvcGVydHkgb2YgdmlkZW90ZXN0c3JjCisgKgorICogSXQgaXMgdXNlZnVsIGZvciBhZGRpbmcgYnVmZmVyIHByb2JlcyB0byBkZWludGVybGFjZSBwYWRzCisgKiBhbmQgdmFsaWRhdGluZyBpbnB1dHMvb3V0cHV0cworICovCitzdGF0aWMgdm9pZAorc2V0dXBfdGVzdF9waXBlbGluZSAoZ2ludCBtb2RlLCBHc3RDYXBzICogaW5maWx0ZXJjYXBzLCBHc3RDYXBzICogb3V0ZmlsdGVyY2FwcywKKyAgICBnaW50IG51bWJ1ZmZlcnMpCit7CisgIEdzdEVsZW1lbnQgKnNyYzsKKyAgR3N0RWxlbWVudCAqaW5maWx0ZXI7CisgIEdzdEVsZW1lbnQgKm91dGZpbHRlcjsKKyAgR3N0RWxlbWVudCAqc2luazsKKworICBzZXR1cF9kZWludGVybGFjZSAoKTsKKworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCBOVUxMKTsKKyAgaW5maWx0ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJjYXBzZmlsdGVyIiwgImluZmlsdGVyIik7CisgIG91dGZpbHRlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImNhcHNmaWx0ZXIiLCAib3V0ZmlsdGVyIik7CisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsIE5VTEwpOworICBmYWlsX2lmIChzcmMgPT0gTlVMTCk7CisgIGZhaWxfaWYgKGluZmlsdGVyID09IE5VTEwpOworICBmYWlsX2lmIChvdXRmaWx0ZXIgPT0gTlVMTCk7CisgIGZhaWxfaWYgKHNpbmsgPT0gTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIHNyYykpOworICBmYWlsX3VubGVzcyAoZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgaW5maWx0ZXIpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIGRlaW50ZXJsYWNlKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBvdXRmaWx0ZXIpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIHNpbmspKTsKKworICAvKiBzZXQgdGhlIHByb3BlcnRpZXMgKi8KKyAgZ19vYmplY3Rfc2V0IChkZWludGVybGFjZSwgIm1vZGUiLCBtb2RlLCBOVUxMKTsKKyAgaWYgKG51bWJ1ZmZlcnMgPiAwKQorICAgIGdfb2JqZWN0X3NldCAoc3JjLCAibnVtLWJ1ZmZlcnMiLCBudW1idWZmZXJzLCBOVUxMKTsKKyAgaWYgKGluZmlsdGVyY2FwcykKKyAgICBnX29iamVjdF9zZXQgKGluZmlsdGVyLCAiY2FwcyIsIGluZmlsdGVyY2FwcywgTlVMTCk7CisgIGlmIChvdXRmaWx0ZXJjYXBzKQorICAgIGdfb2JqZWN0X3NldCAob3V0ZmlsdGVyLCAiY2FwcyIsIG91dGZpbHRlcmNhcHMsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rX21hbnkgKHNyYywgaW5maWx0ZXIsIGRlaW50ZXJsYWNlLCBvdXRmaWx0ZXIsCisgICAgICAgICAgc2luaywgTlVMTCkpOworICBpZiAoaW5maWx0ZXJjYXBzKQorICAgIGdzdF9jYXBzX3VucmVmIChpbmZpbHRlcmNhcHMpOworICBpZiAob3V0ZmlsdGVyY2FwcykKKyAgICBnc3RfY2Fwc191bnJlZiAob3V0ZmlsdGVyY2Fwcyk7Cit9CisKKy8qCisgKiBDaGVja3MgaWYgMiBidWZmZXJzIGFyZSBlcXVhbAorICoKKyAqIEVxdWFscyBtZWFucyBzYW1lIGRhdGEKKyAqLworc3RhdGljIGdib29sZWFuCit0ZXN0X2J1ZmZlcl9lcXVhbHMgKEdzdEJ1ZmZlciAqIGJ1Zl9hLCBHc3RCdWZmZXIgKiBidWZfYikKK3sKKyAgR3N0TWFwSW5mbyBtMSwgbTI7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIGdzdF9idWZmZXJfbWFwIChidWZfYSwgJm0xLCBHU1RfTUFQX1JFQUQpOworICBnc3RfYnVmZmVyX21hcCAoYnVmX2IsICZtMiwgR1NUX01BUF9SRUFEKTsKKworICBpZiAobTEuc2l6ZSA9PSBtMi5zaXplKSB7CisgICAgcmVzID0gbWVtY21wIChtMS5kYXRhLCBtMi5kYXRhLCBtMS5zaXplKSA9PSAwOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1Zl9hLCAmbTEpOworICBnc3RfYnVmZmVyX3VubWFwIChidWZfYiwgJm0yKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0UGFkUHJvYmVSZXR1cm4KK3NpbmtwYWRfZW5xdWV1ZV9idWZmZXIgKEdzdFBhZCAqIHBhZCwgR3N0UGFkUHJvYmVJbmZvICogaW5mbywgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR1F1ZXVlICpxdWV1ZSA9IChHUXVldWUgKikgZGF0YTsKKyAgR3N0QnVmZmVyICpidWYgPSBHU1RfUEFEX1BST0JFX0lORk9fQlVGRkVSIChpbmZvKTsKKworICAvKiBlbnF1ZXVlIGEgY29weSBmb3IgYmVpbmcgY29tcGFyZWQgbGF0ZXIgKi8KKyAgZ19xdWV1ZV9wdXNoX3RhaWwgKHF1ZXVlLCBnc3RfYnVmZmVyX2NvcHkgKGJ1ZikpOworCisgIHJldHVybiBHU1RfUEFEX1BST0JFX09LOworfQorCisvKgorICogcGFkIGJ1ZmZlciBwcm9iZSB0aGF0IGNvbXBhcmVzIHRoZSBidWZmZXIgd2l0aCB0aGUgdG9wIG9uZQorICogaW4gdGhlIEdRdWV1ZSBwYXNzZWQgYXMgdGhlIHVzZXIgZGF0YQorICovCitzdGF0aWMgR3N0UGFkUHJvYmVSZXR1cm4KK3NyY3BhZF9kZXF1ZXVlX2FuZF9jb21wYXJlX2J1ZmZlciAoR3N0UGFkICogcGFkLCBHc3RQYWRQcm9iZUluZm8gKiBpbmZvLAorICAgIGdwb2ludGVyIGRhdGEpCit7CisgIEdRdWV1ZSAqcXVldWUgPSAoR1F1ZXVlICopIGRhdGE7CisgIEdzdEJ1ZmZlciAqYnVmID0gR1NUX1BBRF9QUk9CRV9JTkZPX0JVRkZFUiAoaW5mbyk7CisgIEdzdEJ1ZmZlciAqcXVldWVfYnVmOworCisgIHF1ZXVlX2J1ZiA9IChHc3RCdWZmZXIgKikgZ19xdWV1ZV9wb3BfaGVhZCAocXVldWUpOworICBmYWlsX2lmIChxdWV1ZV9idWYgPT0gTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKHRlc3RfYnVmZmVyX2VxdWFscyAoYnVmLCBxdWV1ZV9idWYpKTsKKworICBnc3RfYnVmZmVyX3VucmVmIChxdWV1ZV9idWYpOworCisgIHJldHVybiBHU1RfUEFEX1BST0JFX09LOworfQorCisvKgorICogVXRpbGl0eSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgYSBwaXBlbGluZSB3aXRoIGRlaW50ZXJsYWNlIGZvcgorICogdmFsaWRhdGluZyB0aGF0IGl0IG9wZXJhdGVzIGluIHBhc3N0aHJvdWdoIG1vZGUgd2hlbiByZWNlaXZpbmcKKyAqIGRhdGEgd2l0aCAnaW5maWx0ZXJjYXBzJyBhcyB0aGUgaW5wdXQgY2FwcyBhbmQgb3BlcmF0aW5nIGluICdtb2RlJyBtb2RlCisgKi8KK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9jaGVja19wYXNzdGhyb3VnaCAoZ2ludCBtb2RlLCBjb25zdCBnY2hhciAqIGluZmlsdGVyY2FwcykKK3sKKyAgR3N0TWVzc2FnZSAqbXNnOworICBHUXVldWUgKnF1ZXVlOworICBHc3RDYXBzICppbmNhcHMgPSBOVUxMOworCisgIGlmIChpbmZpbHRlcmNhcHMpCisgICAgaW5jYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKGluZmlsdGVyY2Fwcyk7CisKKyAgc2V0dXBfdGVzdF9waXBlbGluZSAobW9kZSwgaW5jYXBzLCBOVUxMLCAyMCk7CisKKyAgcXVldWUgPSBnX3F1ZXVlX25ldyAoKTsKKworICAvKiBzZXQgdXAgcHJvYmVzIGZvciB0ZXN0aW5nICovCisgIGdzdF9wYWRfYWRkX3Byb2JlIChzaW5rcGFkLCBHU1RfUEFEX1BST0JFX1RZUEVfQlVGRkVSLCBzaW5rcGFkX2VucXVldWVfYnVmZmVyLAorICAgICAgcXVldWUsIE5VTEwpOworICBnc3RfcGFkX2FkZF9wcm9iZSAoc3JjcGFkLCBHU1RfUEFEX1BST0JFX1RZUEVfQlVGRkVSLAorICAgICAgc3JjcGFkX2RlcXVldWVfYW5kX2NvbXBhcmVfYnVmZmVyLCBxdWV1ZSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKSAhPQorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBtc2cgPSBnc3RfYnVzX3BvbGwgKEdTVF9FTEVNRU5UX0JVUyAocGlwZWxpbmUpLAorICAgICAgR1NUX01FU1NBR0VfRVJST1IgfCBHU1RfTUVTU0FHRV9FT1MsIC0xKTsKKyAgaWYgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRVJST1IpIHsKKyAgICBHU1RfRVJST1IgKCJFUlJPUjogJSIgR1NUX1BUUl9GT1JNQVQsIG1zZyk7CisgICAgZmFpbCAoIlVuZXhwZWN0ZWQgZXJyb3IgbWVzc2FnZSIpOworICB9CisgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworCisgIC8qIHF1ZXVlIHNob3VsZCBiZSBlbXB0eSAqLworICBmYWlsX3VubGVzcyAoZ19xdWV1ZV9pc19lbXB0eSAocXVldWUpKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpID09CisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworICBnX3F1ZXVlX2ZyZWUgKHF1ZXVlKTsKK30KKworLyoKKyAqIFNldHMgdGhlIGNhcHMgb24gZGVpbnRlcmxhY2Ugc2lua3BhZCBhbmQgdmFsaWRhdGVzIHRoZQorICogY2FwcyB0aGF0IGlzIHNldCBvbiB0aGUgc3JjcGFkCisgKi8KK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9zZXRfY2Fwc19hbmRfY2hlY2sgKEdzdENhcHMgKiBpbnB1dCwgZ2Jvb2xlYW4gbXVzdF9kZWludGVybGFjZSkKK3sKKyAgR3N0Q2FwcyAqb3RoZXJjYXBzID0gTlVMTDsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGdzdF9wYWRfc2VuZF9ldmVudCAoc2lua3BhZCwgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKCJ0ZXN0IikpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9zZXRfY2FwcyAoc2lua3BhZCwgaW5wdXQpKTsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9wYWRfc2VuZF9ldmVudCAoc2lua3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgIGdfb2JqZWN0X2dldCAoc3JjcGFkLCAiY2FwcyIsICZvdGhlcmNhcHMsIE5VTEwpOworCisgIGlmIChtdXN0X2RlaW50ZXJsYWNlKSB7CisgICAgZmFpbF9pZiAoZ3N0X2NhcHNfaXNfaW50ZXJsYWNlZCAob3RoZXJjYXBzKSk7CisgIH0gZWxzZSB7CisgICAgR3N0U3RydWN0dXJlICpzOworCisgICAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2lzX2ludGVybGFjZWQgKGlucHV0KSA9PQorICAgICAgICBnc3RfY2Fwc19pc19pbnRlcmxhY2VkIChvdGhlcmNhcHMpKTsKKworICAgIG90aGVyY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKG90aGVyY2Fwcyk7CisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKG90aGVyY2FwcywgMCk7CisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJpbnRlcmxhY2UtbW9kZSIpOworCisgICAgaW5wdXQgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChpbnB1dCk7CisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGlucHV0LCAwKTsKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAocywgImludGVybGFjZS1tb2RlIik7CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfaXNfZXF1YWwgKGlucHV0LCBvdGhlcmNhcHMpKTsKKyAgfQorICBnc3RfY2Fwc191bnJlZiAoaW5wdXQpOworICBnc3RfY2Fwc191bnJlZiAob3RoZXJjYXBzKTsKK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NldF9zdHJpbmdfY2Fwc19hbmRfY2hlY2sgKGNvbnN0IGdjaGFyICogaW5wdXQsCisgICAgZ2Jvb2xlYW4gbXVzdF9kZWludGVybGFjZSkKK3sKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfYW5kX2NoZWNrIChnc3RfY2Fwc19mcm9tX3N0cmluZyAoaW5wdXQpLAorICAgICAgbXVzdF9kZWludGVybGFjZSk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X21vZGVfYXV0b19hY2NlcHRfY2FwcykKK3sKKyAgc2V0dXBfZGVpbnRlcmxhY2UgKCk7CisKKyAgLyogYXV0byBtb2RlICovCisgIGdfb2JqZWN0X3NldCAoZGVpbnRlcmxhY2UsICJtb2RlIiwgMCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGRlaW50ZXJsYWNlLCBHU1RfU1RBVEVfUExBWUlORykgPT0KKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgLyogdHJ5IHRvIHNldCBub24gaW50ZXJsYWNlZCBjYXBzICovCisgIGRlaW50ZXJsYWNlX3NldF9zdHJpbmdfY2Fwc19hbmRfY2hlY2sgKENBUFNfWVZZVSwgRkFMU0UpOworICBkZWludGVybGFjZV9zZXRfc3RyaW5nX2NhcHNfYW5kX2NoZWNrIChDQVBTX1lVWTIsIEZBTFNFKTsKKyAgZGVpbnRlcmxhY2Vfc2V0X3N0cmluZ19jYXBzX2FuZF9jaGVjayAoQ0FQU19ZVllVX0lNQUdFLCBGQUxTRSk7CisgIGRlaW50ZXJsYWNlX3NldF9zdHJpbmdfY2Fwc19hbmRfY2hlY2sgKENBUFNfWVVZMl9JTUFHRSwgRkFMU0UpOworCisgIC8qIG5vdyB0cnkgdG8gc2V0IGludGVybGFjZWQgY2FwcyAqLworICBkZWludGVybGFjZV9zZXRfc3RyaW5nX2NhcHNfYW5kX2NoZWNrIChDQVBTX1lWWVVfSU5URVJMQUNFRCwgVFJVRSk7CisgIGRlaW50ZXJsYWNlX3NldF9zdHJpbmdfY2Fwc19hbmRfY2hlY2sgKENBUFNfWVVZMl9JTlRFUkxBQ0VELCBUUlVFKTsKKyAgZGVpbnRlcmxhY2Vfc2V0X3N0cmluZ19jYXBzX2FuZF9jaGVjayAoQ0FQU19ZVllVX0lOVEVSTEFDRURfSU1BR0UsIFRSVUUpOworICBkZWludGVybGFjZV9zZXRfc3RyaW5nX2NhcHNfYW5kX2NoZWNrIChDQVBTX1lVWTJfSU5URVJMQUNFRF9JTUFHRSwgVFJVRSk7CisKKyAgLyogY2xlYW51cCAqLworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZGVpbnRlcmxhY2UsIEdTVF9TVEFURV9OVUxMKSA9PQorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoZGVpbnRlcmxhY2UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X21vZGVfZm9yY2VkX2FjY2VwdF9jYXBzKQoreworICBzZXR1cF9kZWludGVybGFjZSAoKTsKKworICAvKiBmb3JjZWQgbW9kZSAqLworICBnX29iamVjdF9zZXQgKGRlaW50ZXJsYWNlLCAibW9kZSIsIDEsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChkZWludGVybGFjZSwgR1NUX1NUQVRFX1BMQVlJTkcpID09CisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIC8qIHRyeSB0byBzZXQgbm9uIGludGVybGFjZWQgY2FwcyAqLworICBkZWludGVybGFjZV9zZXRfc3RyaW5nX2NhcHNfYW5kX2NoZWNrIChDQVBTX1lWWVUsIFRSVUUpOworICBkZWludGVybGFjZV9zZXRfc3RyaW5nX2NhcHNfYW5kX2NoZWNrIChDQVBTX1lVWTIsIFRSVUUpOworICBkZWludGVybGFjZV9zZXRfc3RyaW5nX2NhcHNfYW5kX2NoZWNrIChDQVBTX1lWWVVfSU1BR0UsIFRSVUUpOworICBkZWludGVybGFjZV9zZXRfc3RyaW5nX2NhcHNfYW5kX2NoZWNrIChDQVBTX1lVWTJfSU1BR0UsIFRSVUUpOworCisgIC8qIG5vdyB0cnkgdG8gc2V0IGludGVybGFjZWQgY2FwcyAqLworICBkZWludGVybGFjZV9zZXRfc3RyaW5nX2NhcHNfYW5kX2NoZWNrIChDQVBTX1lWWVVfSU5URVJMQUNFRCwgVFJVRSk7CisgIGRlaW50ZXJsYWNlX3NldF9zdHJpbmdfY2Fwc19hbmRfY2hlY2sgKENBUFNfWVVZMl9JTlRFUkxBQ0VELCBUUlVFKTsKKyAgZGVpbnRlcmxhY2Vfc2V0X3N0cmluZ19jYXBzX2FuZF9jaGVjayAoQ0FQU19ZVllVX0lOVEVSTEFDRURfSU1BR0UsIFRSVUUpOworICBkZWludGVybGFjZV9zZXRfc3RyaW5nX2NhcHNfYW5kX2NoZWNrIChDQVBTX1lVWTJfSU5URVJMQUNFRF9JTUFHRSwgVFJVRSk7CisKKyAgLyogY2xlYW51cCAqLworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZGVpbnRlcmxhY2UsIEdTVF9TVEFURV9OVUxMKSA9PQorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoZGVpbnRlcmxhY2UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X21vZGVfZGlzYWJsZWRfYWNjZXB0X2NhcHMpCit7CisgIHNldHVwX2RlaW50ZXJsYWNlICgpOworCisgIC8qIGRpc2FibGVkIG1vZGUgKi8KKyAgZ19vYmplY3Rfc2V0IChkZWludGVybGFjZSwgIm1vZGUiLCAyLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZGVpbnRlcmxhY2UsIEdTVF9TVEFURV9QTEFZSU5HKSA9PQorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICAvKiB0cnkgdG8gc2V0IG5vbiBpbnRlcmxhY2VkIGNhcHMgKi8KKyAgZGVpbnRlcmxhY2Vfc2V0X3N0cmluZ19jYXBzX2FuZF9jaGVjayAoQ0FQU19ZVllVLCBGQUxTRSk7CisgIGRlaW50ZXJsYWNlX3NldF9zdHJpbmdfY2Fwc19hbmRfY2hlY2sgKENBUFNfWVVZMiwgRkFMU0UpOworICBkZWludGVybGFjZV9zZXRfc3RyaW5nX2NhcHNfYW5kX2NoZWNrIChDQVBTX1lWWVVfSU1BR0UsIEZBTFNFKTsKKyAgZGVpbnRlcmxhY2Vfc2V0X3N0cmluZ19jYXBzX2FuZF9jaGVjayAoQ0FQU19ZVVkyX0lNQUdFLCBGQUxTRSk7CisKKyAgLyogbm93IHRyeSB0byBzZXQgaW50ZXJsYWNlZCBjYXBzICovCisgIGRlaW50ZXJsYWNlX3NldF9zdHJpbmdfY2Fwc19hbmRfY2hlY2sgKENBUFNfWVZZVV9JTlRFUkxBQ0VELCBGQUxTRSk7CisgIGRlaW50ZXJsYWNlX3NldF9zdHJpbmdfY2Fwc19hbmRfY2hlY2sgKENBUFNfWVVZMl9JTlRFUkxBQ0VELCBGQUxTRSk7CisgIGRlaW50ZXJsYWNlX3NldF9zdHJpbmdfY2Fwc19hbmRfY2hlY2sgKENBUFNfWVZZVV9JTlRFUkxBQ0VEX0lNQUdFLCBGQUxTRSk7CisgIGRlaW50ZXJsYWNlX3NldF9zdHJpbmdfY2Fwc19hbmRfY2hlY2sgKENBUFNfWVVZMl9JTlRFUkxBQ0VEX0lNQUdFLCBGQUxTRSk7CisKKyAgLyogY2xlYW51cCAqLworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZGVpbnRlcmxhY2UsIEdTVF9TVEFURV9OVUxMKSA9PQorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoZGVpbnRlcmxhY2UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X21vZGVfZGlzYWJsZWRfcGFzc3Rocm91Z2gpCit7CisgIC8qIDIgaXMgZGlzYWJsZWQgbW9kZSAqLworICBkZWludGVybGFjZV9jaGVja19wYXNzdGhyb3VnaCAoMiwgQ0FQU19ZVVkyX0lOVEVSTEFDRUQpOworICBkZWludGVybGFjZV9jaGVja19wYXNzdGhyb3VnaCAoMiwgQ0FQU19ZVllVX0lOVEVSTEFDRUQpOworICBkZWludGVybGFjZV9jaGVja19wYXNzdGhyb3VnaCAoMiwgQ0FQU19ZVVkyKTsKKyAgZGVpbnRlcmxhY2VfY2hlY2tfcGFzc3Rocm91Z2ggKDIsIENBUFNfWVZZVSk7CisKKyAgZGVpbnRlcmxhY2VfY2hlY2tfcGFzc3Rocm91Z2ggKDIsIENBUFNfWVVZMl9JTlRFUkxBQ0VEX0lNQUdFKTsKKyAgZGVpbnRlcmxhY2VfY2hlY2tfcGFzc3Rocm91Z2ggKDIsIENBUFNfWVZZVV9JTlRFUkxBQ0VEX0lNQUdFKTsKKyAgZGVpbnRlcmxhY2VfY2hlY2tfcGFzc3Rocm91Z2ggKDIsIENBUFNfWVVZMl9JTUFHRSk7CisgIGRlaW50ZXJsYWNlX2NoZWNrX3Bhc3N0aHJvdWdoICgyLCBDQVBTX1lWWVVfSU1BR0UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X21vZGVfYXV0b19kZWludGVybGFjZWRfcGFzc3Rocm91Z2gpCit7CisgIC8qIDAgaXMgYXV0byBtb2RlICovCisgIGRlaW50ZXJsYWNlX2NoZWNrX3Bhc3N0aHJvdWdoICgwLCBDQVBTX1lVWTIpOworICBkZWludGVybGFjZV9jaGVja19wYXNzdGhyb3VnaCAoMCwgQ0FQU19ZVllVKTsKKyAgZGVpbnRlcmxhY2VfY2hlY2tfcGFzc3Rocm91Z2ggKDAsIENBUFNfWVVZMl9JTUFHRSk7CisgIGRlaW50ZXJsYWNlX2NoZWNrX3Bhc3N0aHJvdWdoICgwLCBDQVBTX1lWWVVfSU1BR0UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBHc3RQYWRQcm9iZVJldHVybgorY2F0Y2hfY2Fwc19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RQYWRQcm9iZUluZm8gKiBpbmZvLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdENhcHMgKipvdXRjYXBzID0gdXNlcl9kYXRhOworCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoaW5mby0+ZGF0YSkgPT0gR1NUX0VWRU5UX0NBUFMpIHsKKyAgICBnX2Fzc2VydCAoKm91dGNhcHMgPT0gTlVMTCk7CisKKyAgICBnc3RfZXZlbnRfcGFyc2VfY2FwcyAoR1NUX0VWRU5UIChpbmZvLT5kYXRhKSwgb3V0Y2Fwcyk7CisgICAgZ3N0X2NhcHNfcmVmICgqb3V0Y2Fwcyk7CisgIH0KKworICByZXR1cm4gR1NUX1BBRF9QUk9CRV9PSzsKK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKGdpbnQgbW9kZSwgZ2ludCBmaWVsZHMsCisgICAgY29uc3QgZ2NoYXIgKiBpbnB1dF9jYXBzLCBjb25zdCBnY2hhciAqIGZpbHRlcl9jYXBzLAorICAgIGNvbnN0IGdjaGFyICogb3V0cHV0X2NhcHMpCit7CisgIEdzdEVsZW1lbnQgKmRlaW50ZXJsYWNlLCAqY2Fwc2ZpbHRlcjsKKyAgR3N0UGFkICpzaW5rcGFkLCAqc3JjcGFkOworICBHc3RDYXBzICpjYXBzLCAqb3V0Y2Fwc19hY3R1YWwgPSBOVUxMOworICBHc3RDYXBzICpvdXRjYXBzX2V4cGVjdGVkID0gTlVMTDsKKworICBkZWludGVybGFjZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImRlaW50ZXJsYWNlIiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChkZWludGVybGFjZSAhPSBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChkZWludGVybGFjZSwgIm1vZGUiLCBtb2RlLCAiZmllbGRzIiwgZmllbGRzLCBOVUxMKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKGZpbHRlcl9jYXBzKTsKKyAgZmFpbF91bmxlc3MgKGNhcHMgIT0gTlVMTCk7CisgIGNhcHNmaWx0ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJjYXBzZmlsdGVyIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoY2Fwc2ZpbHRlciwgImNhcHMiLCBjYXBzLCBOVUxMKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rIChkZWludGVybGFjZSwgY2Fwc2ZpbHRlcikpOworCisgIHNpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoZGVpbnRlcmxhY2UsICJzaW5rIik7CisgIGZhaWxfdW5sZXNzIChzaW5rcGFkKTsKKworICBzcmNwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoY2Fwc2ZpbHRlciwgInNyYyIpOworICBmYWlsX3VubGVzcyAoc3JjcGFkKTsKKworICBnc3RfcGFkX2FkZF9wcm9iZSAoc3JjcGFkLCBHU1RfUEFEX1BST0JFX1RZUEVfRVZFTlRfRE9XTlNUUkVBTSwKKyAgICAgIGNhdGNoX2NhcHNfZXZlbnQsICZvdXRjYXBzX2FjdHVhbCwgTlVMTCk7CisKKyAgaWYgKG91dHB1dF9jYXBzKSB7CisgICAgb3V0Y2Fwc19leHBlY3RlZCA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChvdXRwdXRfY2Fwcyk7CisgICAgZmFpbF91bmxlc3MgKG91dGNhcHNfZXhwZWN0ZWQgIT0gTlVMTCk7CisgIH0KKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChkZWludGVybGFjZSwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoY2Fwc2ZpbHRlciwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKGlucHV0X2NhcHMpOworICBmYWlsX3VubGVzcyAoY2FwcyAhPSBOVUxMKTsKKyAgZ3N0X3BhZF9zZW5kX2V2ZW50IChzaW5rcGFkLCBnc3RfZXZlbnRfbmV3X2NhcHMgKGNhcHMpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGlmIChvdXRwdXRfY2FwcykgeworICAgIGdjaGFyICphY3R1YWw7CisKKyAgICBmYWlsX2lmIChvdXRjYXBzX2FjdHVhbCA9PSBOVUxMLCAiRXhwZWN0ZWQgJXMsIGdvdCBubyBjYXBzIiwgb3V0cHV0X2NhcHMpOworICAgIGFjdHVhbCA9IGdzdF9jYXBzX3RvX3N0cmluZyAob3V0Y2Fwc19hY3R1YWwpOworICAgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19pc19lcXVhbCAob3V0Y2Fwc19hY3R1YWwsIG91dGNhcHNfZXhwZWN0ZWQpLAorICAgICAgICAiRXhwZWN0ZWQgJXMsIGdvdCAlcyIsIG91dHB1dF9jYXBzLCBhY3R1YWwpOworICAgIGdfZnJlZSAoYWN0dWFsKTsKKyAgfSBlbHNlIHsKKyAgICBnY2hhciAqYWN0dWFsOworCisgICAgYWN0dWFsID0gZ3N0X2NhcHNfdG9fc3RyaW5nIChvdXRjYXBzX2FjdHVhbCk7CisgICAgZmFpbF9pZiAob3V0Y2Fwc19hY3R1YWwgIT0gTlVMTCwgIkV4cGVjdGVkIG5lZ290aWF0aW9uIGZhaWx1cmUsIGdvdCAlcyIsCisgICAgICAgIGFjdHVhbCk7CisgICAgZ19mcmVlIChhY3R1YWwpOworICB9CisKKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZGVpbnRlcmxhY2UsCisgICAgICAgICAgR1NUX1NUQVRFX05VTEwpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGNhcHNmaWx0ZXIsCisgICAgICAgICAgR1NUX1NUQVRFX05VTEwpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGRlaW50ZXJsYWNlKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoY2Fwc2ZpbHRlcik7CisKKyAgaWYgKG91dGNhcHNfZXhwZWN0ZWQpCisgICAgZ3N0X2NhcHNfdW5yZWYgKG91dGNhcHNfZXhwZWN0ZWQpOworICBpZiAob3V0Y2Fwc19hY3R1YWwpCisgICAgZ3N0X2NhcHNfdW5yZWYgKG91dGNhcHNfYWN0dWFsKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfbW9kZV9kaXNhYmxlZF9leHBlY3RlZF9jYXBzKQoreworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgyLCAwLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdyIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgyLCAwLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdyIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgyLCAxLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdyIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgyLCAxLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdyIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgyLCAwLAorICAgICAgInZpZGVvL3gtcmF3KG1lbW9yeTpTb21lTWVtb3J5KSwgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcoQU5ZKSIsCisgICAgICAidmlkZW8veC1yYXcobWVtb3J5OlNvbWVNZW1vcnkpLCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMiwgMCwKKyAgICAgICJ2aWRlby94LXJhdyhtZW1vcnk6U29tZU1lbW9yeSksIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3KEFOWSkiLAorICAgICAgInZpZGVvL3gtcmF3KG1lbW9yeTpTb21lTWVtb3J5KSwgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDIsIDEsCisgICAgICAidmlkZW8veC1yYXcobWVtb3J5OlNvbWVNZW1vcnkpLCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdyhBTlkpIiwKKyAgICAgICJ2aWRlby94LXJhdyhtZW1vcnk6U29tZU1lbW9yeSksIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgyLCAxLAorICAgICAgInZpZGVvL3gtcmF3KG1lbW9yeTpTb21lTWVtb3J5KSwgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcoQU5ZKSIsCisgICAgICAidmlkZW8veC1yYXcobWVtb3J5OlNvbWVNZW1vcnkpLCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMiwgMCwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXciLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9djIxMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMiwgMCwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXciLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9djIxMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMiwgMSwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXciLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9djIxMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMiwgMSwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXciLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9djIxMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMiwgMCwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcsIGludGVybGFjZS1tb2RlPWludGVybGVhdmVkIiwgTlVMTCk7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMiwgMCwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcsIGludGVybGFjZS1tb2RlPWludGVybGVhdmVkIiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDIsIDEsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3LCBpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCIsIE5VTEwpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDIsIDEsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3LCBpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tb2RlX2ludGVybGFjZWRfZXhwZWN0ZWRfY2FwcykKK3sKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMSwgMCwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXciLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT00MC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMSwgMCwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXciLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT00MC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMSwgMSwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXciLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMSwgMSwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXciLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMSwgMCwKKyAgICAgICJ2aWRlby94LXJhdyhtZW1vcnk6U29tZU1lbW9yeSksIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLCAidmlkZW8veC1yYXcoQU5ZKSIsIE5VTEwpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDEsIDAsCisgICAgICAidmlkZW8veC1yYXcobWVtb3J5OlNvbWVNZW1vcnkpLCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwgInZpZGVvL3gtcmF3KEFOWSkiLCBOVUxMKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgxLCAxLAorICAgICAgInZpZGVvL3gtcmF3KG1lbW9yeTpTb21lTWVtb3J5KSwgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsICJ2aWRlby94LXJhdyhBTlkpIiwgTlVMTCk7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMSwgMSwKKyAgICAgICJ2aWRlby94LXJhdyhtZW1vcnk6U29tZU1lbW9yeSksIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLCAidmlkZW8veC1yYXcoQU5ZKSIsIE5VTEwpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDEsIDAsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLCAidmlkZW8veC1yYXciLCBOVUxMKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgxLCAwLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9djIxMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwgInZpZGVvL3gtcmF3IiwgTlVMTCk7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMSwgMSwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsICJ2aWRlby94LXJhdyIsIE5VTEwpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDEsIDEsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLCAidmlkZW8veC1yYXciLCBOVUxMKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgxLCAwLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdywgaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQiLCBOVUxMKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgxLCAwLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdywgaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQiLCBOVUxMKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgxLCAxLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdywgaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQiLCBOVUxMKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgxLCAxLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdywgaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQiLCBOVUxMKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tb2RlX2F1dG9fZXhwZWN0ZWRfY2FwcykKK3sKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMCwgMCwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXciLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMCwgMCwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXciLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT00MC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMCwgMSwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXciLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMCwgMSwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXciLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMCwgMCwKKyAgICAgICJ2aWRlby94LXJhdyhtZW1vcnk6U29tZU1lbW9yeSksIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3KEFOWSkiLAorICAgICAgInZpZGVvL3gtcmF3KG1lbW9yeTpTb21lTWVtb3J5KSwgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDAsIDAsCisgICAgICAidmlkZW8veC1yYXcobWVtb3J5OlNvbWVNZW1vcnkpLCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdyhBTlkpIiwKKyAgICAgICJ2aWRlby94LXJhdyhtZW1vcnk6U29tZU1lbW9yeSksIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgwLCAxLAorICAgICAgInZpZGVvL3gtcmF3KG1lbW9yeTpTb21lTWVtb3J5KSwgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcoQU5ZKSIsCisgICAgICAidmlkZW8veC1yYXcobWVtb3J5OlNvbWVNZW1vcnkpLCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMCwgMSwKKyAgICAgICJ2aWRlby94LXJhdyhtZW1vcnk6U29tZU1lbW9yeSksIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3KEFOWSkiLAorICAgICAgInZpZGVvL3gtcmF3KG1lbW9yeTpTb21lTWVtb3J5KSwgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDAsIDAsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDAsIDAsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDAsIDEsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDAsIDEsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDAsIDAsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3LCBpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCIsIE5VTEwpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDAsIDAsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3LCBpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgwLCAxLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdywgaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQiLCBOVUxMKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgwLCAxLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdywgaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQiLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMCwgMCwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcsIGludGVybGFjZS1tb2RlPWludGVybGVhdmVkIiwgTlVMTCk7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMCwgMCwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcsIGludGVybGFjZS1tb2RlPWludGVybGVhdmVkIiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDAsIDEsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3LCBpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCIsIE5VTEwpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDAsIDEsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3LCBpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tb2RlX2F1dG9fc3RyaWN0X2V4cGVjdGVkX2NhcHMpCit7CisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDMsIDAsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDMsIDAsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9NDAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDMsIDEsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDMsIDEsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDMsIDAsCisgICAgICAidmlkZW8veC1yYXcobWVtb3J5OlNvbWVNZW1vcnkpLCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdyhBTlkpIiwKKyAgICAgICJ2aWRlby94LXJhdyhtZW1vcnk6U29tZU1lbW9yeSksIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgzLCAwLAorICAgICAgInZpZGVvL3gtcmF3KG1lbW9yeTpTb21lTWVtb3J5KSwgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsICJ2aWRlby94LXJhdyhBTlkpIiwgTlVMTCk7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMywgMSwKKyAgICAgICJ2aWRlby94LXJhdyhtZW1vcnk6U29tZU1lbW9yeSksIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3KEFOWSkiLAorICAgICAgInZpZGVvL3gtcmF3KG1lbW9yeTpTb21lTWVtb3J5KSwgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDMsIDEsCisgICAgICAidmlkZW8veC1yYXcobWVtb3J5OlNvbWVNZW1vcnkpLCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwgInZpZGVvL3gtcmF3KEFOWSkiLCBOVUxMKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgzLCAwLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9djIxMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdyIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgzLCAwLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9djIxMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwgInZpZGVvL3gtcmF3IiwgTlVMTCk7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMywgMSwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXciLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9djIxMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMywgMSwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsICJ2aWRlby94LXJhdyIsIE5VTEwpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDMsIDAsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3LCBpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCIsIE5VTEwpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDMsIDAsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3LCBpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgzLCAxLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdywgaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQiLCBOVUxMKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgzLCAxLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdywgaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQiLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMywgMCwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcsIGludGVybGFjZS1tb2RlPWludGVybGVhdmVkIiwgTlVMTCk7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMywgMCwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcsIGludGVybGFjZS1tb2RlPWludGVybGVhdmVkIiwgTlVMTCk7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMywgMSwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcsIGludGVybGFjZS1tb2RlPWludGVybGVhdmVkIiwgTlVMTCk7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMywgMSwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcsIGludGVybGFjZS1tb2RlPWludGVybGVhdmVkIiwgTlVMTCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZmllbGRzX2F1dG9fZXhwZWN0ZWRfY2FwcykKK3sKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMCwgMywKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcsIGludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgwLCAzLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdywgaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT00MC8xIiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9NDAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDAsIDMsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3LCBpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTQwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgwLCAzLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdywgaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0xNS8xIiwgTlVMTCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCisKK3N0YXRpYyBTdWl0ZSAqCitkZWludGVybGFjZV9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJkZWludGVybGFjZSIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX3NldF90aW1lb3V0ICh0Y19jaGFpbiwgMTgwKTsKKworICBpZiAoIWdzdF9yZWdpc3RyeV9jaGVja19mZWF0dXJlX3ZlcnNpb24gKGdzdF9yZWdpc3RyeV9nZXQgKCksICJkZWludGVybGFjZSIsCisgICAgICAgICAgR1NUX1ZFUlNJT05fTUFKT1IsIEdTVF9WRVJTSU9OX01JTk9SLCBHU1RfVkVSU0lPTl9NSUNSTykpIHsKKyAgICBHU1RfRVJST1IgKCJGSVhNRTogcG9ydCBkZWludGVybGFjZSBlbGVtZW50Iik7CisgICAgcmV0dXJuIHM7CisgIH0KKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfY3JlYXRlX2FuZF91bnJlZik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9tb2RlX2F1dG9fYWNjZXB0X2NhcHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbW9kZV9mb3JjZWRfYWNjZXB0X2NhcHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbW9kZV9kaXNhYmxlZF9hY2NlcHRfY2Fwcyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9tb2RlX2Rpc2FibGVkX3Bhc3N0aHJvdWdoKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X21vZGVfYXV0b19kZWludGVybGFjZWRfcGFzc3Rocm91Z2gpOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9tb2RlX2Rpc2FibGVkX2V4cGVjdGVkX2NhcHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbW9kZV9pbnRlcmxhY2VkX2V4cGVjdGVkX2NhcHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbW9kZV9hdXRvX2V4cGVjdGVkX2NhcHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbW9kZV9hdXRvX3N0cmljdF9leHBlY3RlZF9jYXBzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ZpZWxkc19hdXRvX2V4cGVjdGVkX2NhcHMpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoZGVpbnRlcmxhY2UpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvZGVpbnRlcmxlYXZlLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGVhdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjQ2MTA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvZGVpbnRlcmxlYXZlLmMKQEAgLTAsMCArMSw2NTcgQEAKKy8qIEdTdHJlYW1lciB1bml0IHRlc3RzIGZvciB0aGUgaW50ZXJsZWF2ZSBlbGVtZW50CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9jcmVhdGVfYW5kX3VucmVmKQoreworICBHc3RFbGVtZW50ICpkZWludGVybGVhdmU7CisKKyAgZGVpbnRlcmxlYXZlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZGVpbnRlcmxlYXZlIiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChkZWludGVybGVhdmUgIT0gTlVMTCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChkZWludGVybGVhdmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoZGVpbnRlcmxlYXZlKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgR3N0UGFkICpteXNyY3BhZCwgKipteXNpbmtwYWRzOworc3RhdGljIGdpbnQgbnNpbmtwYWRzOworc3RhdGljIEdzdEJ1cyAqYnVzOworc3RhdGljIEdzdEVsZW1lbnQgKmRlaW50ZXJsZWF2ZTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoRjMyKSAiLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsIGxheW91dCA9IChzdHJpbmcpIHtpbnRlcmxlYXZlZCwgbm9uLWludGVybGVhdmVkfSwgcmF0ZSA9IChpbnQpIHszMjAwMCwgNDgwMDB9IikpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChGMzIpICIsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgeyAyLCAzIH0sIGxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCByYXRlID0gKGludCkgezMyMDAwLCA0ODAwMH0iKSk7CisKKyNkZWZpbmUgQ0FQU18zMmtoeiBcCisgICAgICAgICJhdWRpby94LXJhdywgIiBcCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiR1NUX0FVRElPX05FIChGMzIpICIsICIgXAorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAyLCBsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiBcCisgICAgICAgICJyYXRlID0gKGludCkgMzIwMDAiCisKKyNkZWZpbmUgQ0FQU180OGtoeiBcCisgICAgICAgICJhdWRpby94LXJhdywgIiBcCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiR1NUX0FVRElPX05FIChGMzIpICIsICIgXAorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAyLCBsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiBcCisgICAgICAgICJyYXRlID0gKGludCkgNDgwMDAiCisKKyNkZWZpbmUgQ0FQU180OGtoel8zQ0ggXAorICAgICAgICAiYXVkaW8veC1yYXcsICIgXAorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIkdTVF9BVURJT19ORSAoRjMyKSAiLCAiIFwKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMywgbGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgXAorICAgICAgICAicmF0ZSA9IChpbnQpIDQ4MDAwIgorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZGVpbnRlcmxlYXZlX2NoYWluX2Z1bmMgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdmbG9hdCAqaW5kYXRhOworCisgIGZhaWxfdW5sZXNzIChHU1RfSVNfQlVGRkVSIChidWZmZXIpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgaW5kYXRhID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobWFwLnNpemUsIDQ4MDAwICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgZmFpbF91bmxlc3MgKGluZGF0YSAhPSBOVUxMKTsKKworICBpZiAoc3RyY21wIChHU1RfUEFEX05BTUUgKHBhZCksICJzaW5rMCIpID09IDApIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDgwMDA7IGkrKykKKyAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19mbG9hdCAoaW5kYXRhW2ldLCAtMS4wKTsKKyAgfSBlbHNlIGlmIChzdHJjbXAgKEdTVF9QQURfTkFNRSAocGFkKSwgInNpbmsxIikgPT0gMCkgeworICAgIGZvciAoaSA9IDA7IGkgPCA0ODAwMDsgaSsrKQorICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2Zsb2F0IChpbmRhdGFbaV0sIDEuMCk7CisgIH0gZWxzZSB7CisgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGVhdmVfcGFkX2FkZGVkIChHc3RFbGVtZW50ICogc3JjLCBHc3RQYWQgKiBwYWQsIGdwb2ludGVyIGRhdGEpCit7CisgIGdjaGFyICpuYW1lOworICBnaW50IGxpbmsgPSBHUE9JTlRFUl9UT19JTlQgKGRhdGEpOworCisgIGlmIChuc2lua3BhZHMgPj0gbGluaykKKyAgICByZXR1cm47CisKKyAgbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInNpbmslZCIsIG5zaW5rcGFkcyk7CisKKyAgbXlzaW5rcGFkc1tuc2lua3BhZHNdID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc2lua3RlbXBsYXRlLCBuYW1lKTsKKyAgZ19mcmVlIChuYW1lKTsKKyAgZmFpbF9pZiAobXlzaW5rcGFkc1tuc2lua3BhZHNdID09IE5VTEwpOworCisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChteXNpbmtwYWRzW25zaW5rcGFkc10sIGRlaW50ZXJsZWF2ZV9jaGFpbl9mdW5jKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAocGFkLCBteXNpbmtwYWRzW25zaW5rcGFkc10pID09IEdTVF9QQURfTElOS19PSyk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkc1tuc2lua3BhZHNdLCBUUlVFKTsKKyAgbnNpbmtwYWRzKys7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0XzJfY2hhbm5lbHMpCit7CisgIEdzdFBhZCAqc2lua3BhZDsKKyAgZ2ludCBpOworICBHc3RCdWZmZXIgKmluYnVmOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluZGF0YTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50NjQgY2hhbm5lbF9tYXNrID0gMDsKKworICBteXNpbmtwYWRzID0gZ19uZXcwIChHc3RQYWQgKiwgMik7CisgIG5zaW5rcGFkcyA9IDA7CisKKyAgZGVpbnRlcmxlYXZlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZGVpbnRlcmxlYXZlIiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChkZWludGVybGVhdmUgIT0gTlVMTCk7CisKKyAgbXlzcmNwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNyY3RlbXBsYXRlLCAic3JjIik7CisgIGZhaWxfdW5sZXNzIChteXNyY3BhZCAhPSBOVUxMKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChDQVBTXzQ4a2h6KTsKKyAgY2hhbm5lbF9tYXNrIHw9CisgICAgICBHX0dVSU5UNjRfQ09OU1RBTlQgKDEpIDw8IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQ7CisgIGNoYW5uZWxfbWFzayB8PQorICAgICAgR19HVUlOVDY0X0NPTlNUQU5UICgxKSA8PCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVDsKKyAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgImNoYW5uZWwtbWFzayIsIEdTVF9UWVBFX0JJVE1BU0ssIGNoYW5uZWxfbWFzaywKKyAgICAgIE5VTEwpOworCisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBkZWludGVybGVhdmUsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisKKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChkZWludGVybGVhdmUsICJzaW5rIik7CisgIGZhaWxfdW5sZXNzIChzaW5rcGFkICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rIChteXNyY3BhZCwgc2lua3BhZCkgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ19vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGRlaW50ZXJsZWF2ZSwgInBhZC1hZGRlZCIsCisgICAgICBHX0NBTExCQUNLIChkZWludGVybGVhdmVfcGFkX2FkZGVkKSwgR0lOVF9UT19QT0lOVEVSICgyKSk7CisKKyAgYnVzID0gZ3N0X2J1c19uZXcgKCk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKGRlaW50ZXJsZWF2ZSwgYnVzKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChkZWludGVybGVhdmUsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgaW5idWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDIgKiA0ODAwMCAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgIGluYnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChpbmJ1Zik7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluZGF0YSA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAyICogNDgwMDA7IGkgKz0gMikgeworICAgIGluZGF0YVtpXSA9IC0xLjA7CisgICAgaW5kYXRhW2kgKyAxXSA9IDEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZiwgJm1hcCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmKSA9PSBHU1RfRkxPV19PSyk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZGVpbnRlcmxlYXZlLAorICAgICAgICAgIEdTVF9TVEFURV9OVUxMKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGZvciAoaSA9IDA7IGkgPCBuc2lua3BhZHM7IGkrKykKKyAgICBnX29iamVjdF91bnJlZiAobXlzaW5rcGFkc1tpXSk7CisgIGdfZnJlZSAobXlzaW5rcGFkcyk7CisgIG15c2lua3BhZHMgPSBOVUxMOworCisgIGdfb2JqZWN0X3VucmVmIChkZWludGVybGVhdmUpOworICBnc3RfYnVzX3NldF9mbHVzaGluZyAoYnVzLCBUUlVFKTsKKyAgZ19vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAobXlzcmNwYWQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0XzJfY2hhbm5lbHNfMV9saW5rZWQpCit7CisgIEdzdFBhZCAqc2lua3BhZDsKKyAgZ2ludCBpOworICBHc3RCdWZmZXIgKmluYnVmOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluZGF0YTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50NjQgY2hhbm5lbF9tYXNrID0gMDsKKworICBuc2lua3BhZHMgPSAwOworICBteXNpbmtwYWRzID0gZ19uZXcwIChHc3RQYWQgKiwgMik7CisKKyAgZGVpbnRlcmxlYXZlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZGVpbnRlcmxlYXZlIiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChkZWludGVybGVhdmUgIT0gTlVMTCk7CisKKyAgbXlzcmNwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNyY3RlbXBsYXRlLCAic3JjIik7CisgIGZhaWxfdW5sZXNzIChteXNyY3BhZCAhPSBOVUxMKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChDQVBTXzQ4a2h6KTsKKyAgY2hhbm5lbF9tYXNrIHw9CisgICAgICBHX0dVSU5UNjRfQ09OU1RBTlQgKDEpIDw8IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQ7CisgIGNoYW5uZWxfbWFzayB8PQorICAgICAgR19HVUlOVDY0X0NPTlNUQU5UICgxKSA8PCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVDsKKyAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgImNoYW5uZWwtbWFzayIsIEdTVF9UWVBFX0JJVE1BU0ssIGNoYW5uZWxfbWFzaywKKyAgICAgIE5VTEwpOworCisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBkZWludGVybGVhdmUsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisKKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChkZWludGVybGVhdmUsICJzaW5rIik7CisgIGZhaWxfdW5sZXNzIChzaW5rcGFkICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rIChteXNyY3BhZCwgc2lua3BhZCkgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ19vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGRlaW50ZXJsZWF2ZSwgInBhZC1hZGRlZCIsCisgICAgICBHX0NBTExCQUNLIChkZWludGVybGVhdmVfcGFkX2FkZGVkKSwgR0lOVF9UT19QT0lOVEVSICgxKSk7CisKKyAgYnVzID0gZ3N0X2J1c19uZXcgKCk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKGRlaW50ZXJsZWF2ZSwgYnVzKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChkZWludGVybGVhdmUsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgaW5idWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDIgKiA0ODAwMCAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgIGluYnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChpbmJ1Zik7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluZGF0YSA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAyICogNDgwMDA7IGkgKz0gMikgeworICAgIGluZGF0YVtpXSA9IC0xLjA7CisgICAgaW5kYXRhW2kgKyAxXSA9IDEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZiwgJm1hcCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmKSA9PSBHU1RfRkxPV19PSyk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZGVpbnRlcmxlYXZlLAorICAgICAgICAgIEdTVF9TVEFURV9OVUxMKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGZvciAoaSA9IDA7IGkgPCBuc2lua3BhZHM7IGkrKykKKyAgICBnX29iamVjdF91bnJlZiAobXlzaW5rcGFkc1tpXSk7CisgIGdfZnJlZSAobXlzaW5rcGFkcyk7CisgIG15c2lua3BhZHMgPSBOVUxMOworCisgIGdfb2JqZWN0X3VucmVmIChkZWludGVybGVhdmUpOworICBnc3RfYnVzX3NldF9mbHVzaGluZyAoYnVzLCBUUlVFKTsKKyAgZ19vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAobXlzcmNwYWQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0XzJfY2hhbm5lbHNfY2Fwc19jaGFuZ2UpCit7CisgIEdzdFBhZCAqc2lua3BhZDsKKyAgR3N0Q2FwcyAqY2FwcywgKmNhcHMyOworICBHc3RDYXBzICpyZXRfY2FwczsKKyAgZ2ludCBpOworICBHc3RCdWZmZXIgKmluYnVmOworICBnZmxvYXQgKmluZGF0YTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50NjQgY2hhbm5lbF9tYXNrOworCisgIG5zaW5rcGFkcyA9IDA7CisgIG15c2lua3BhZHMgPSBnX25ldzAgKEdzdFBhZCAqLCAyKTsKKworICBkZWludGVybGVhdmUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJkZWludGVybGVhdmUiLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGRlaW50ZXJsZWF2ZSAhPSBOVUxMKTsKKworICBteXNyY3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc3JjdGVtcGxhdGUsICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKG15c3JjcGFkICE9IE5VTEwpOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQ0FQU180OGtoeik7CisgIGNoYW5uZWxfbWFzayA9IDA7CisgIGNoYW5uZWxfbWFzayB8PQorICAgICAgR19HVUlOVDY0X0NPTlNUQU5UICgxKSA8PCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUOworICBjaGFubmVsX21hc2sgfD0KKyAgICAgIEdfR1VJTlQ2NF9DT05TVEFOVCAoMSkgPDwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQ7CisgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJjaGFubmVsLW1hc2siLCBHU1RfVFlQRV9CSVRNQVNLLCBjaGFubmVsX21hc2ssCisgICAgICBOVUxMKTsKKworICBzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGRlaW50ZXJsZWF2ZSwgInNpbmsiKTsKKyAgZmFpbF91bmxlc3MgKHNpbmtwYWQgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKG15c3JjcGFkLCBzaW5rcGFkKSA9PSBHU1RfUEFEX0xJTktfT0spOworICBnX29iamVjdF91bnJlZiAoc2lua3BhZCk7CisKKyAgcmV0X2NhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAobXlzcmNwYWQsIGNhcHMpOworICBmYWlsX2lmIChnc3RfY2Fwc19pc19lbXB0eSAocmV0X2NhcHMpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcGVlcl9xdWVyeV9hY2NlcHRfY2FwcyAobXlzcmNwYWQsIGNhcHMpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHJldF9jYXBzKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGRlaW50ZXJsZWF2ZSwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChkZWludGVybGVhdmUsICJwYWQtYWRkZWQiLAorICAgICAgR19DQUxMQkFDSyAoZGVpbnRlcmxlYXZlX3BhZF9hZGRlZCksIEdJTlRfVE9fUE9JTlRFUiAoMikpOworCisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChkZWludGVybGVhdmUsIGJ1cyk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZGVpbnRlcmxlYXZlLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGluYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgyICogNDgwMDAgKiBzaXplb2YgKGdmbG9hdCkpOworICBpbmJ1ZiA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoaW5idWYpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbmRhdGEgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMiAqIDQ4MDAwOyBpICs9IDIpIHsKKyAgICBpbmRhdGFbaV0gPSAtMS4wOworICAgIGluZGF0YVtpICsgMV0gPSAxLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWYsICZtYXApOworCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZikgPT0gR1NUX0ZMT1dfT0spOworCisgIGNhcHMyID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKENBUFNfMzJraHopOworICBjaGFubmVsX21hc2sgPSAwOworICBjaGFubmVsX21hc2sgfD0KKyAgICAgIEdfR1VJTlQ2NF9DT05TVEFOVCAoMSkgPDwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVDsKKyAgY2hhbm5lbF9tYXNrIHw9CisgICAgICBHX0dVSU5UNjRfQ09OU1RBTlQgKDEpIDw8IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUOworICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzMiwgImNoYW5uZWwtbWFzayIsIEdTVF9UWVBFX0JJVE1BU0ssIGNoYW5uZWxfbWFzaywKKyAgICAgIE5VTEwpOworICByZXRfY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChteXNyY3BhZCwgY2FwczIpOworICBmYWlsX2lmIChnc3RfY2Fwc19pc19lbXB0eSAocmV0X2NhcHMpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcGVlcl9xdWVyeV9hY2NlcHRfY2FwcyAobXlzcmNwYWQsIGNhcHMyKSk7CisgIGdzdF9jYXBzX3VucmVmIChyZXRfY2Fwcyk7CisgIGdzdF9wYWRfc2V0X2NhcHMgKG15c3JjcGFkLCBjYXBzMik7CisKKyAgaW5idWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDIgKiA0ODAwMCAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgIGluYnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChpbmJ1Zik7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluZGF0YSA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAyICogNDgwMDA7IGkgKz0gMikgeworICAgIGluZGF0YVtpXSA9IC0xLjA7CisgICAgaW5kYXRhW2kgKyAxXSA9IDEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZiwgJm1hcCk7CisKKyAgLyogU2hvdWxkIHdvcmsgZmluZSBiZWNhdXNlIHRoZSBjYXBzIGNoYW5nZWQgaW4gYSBjb21wYXRpYmxlIHdheSAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWYpID09IEdTVF9GTE9XX09LKTsKKworICBnc3RfY2Fwc191bnJlZiAoY2FwczIpOworCisgIGNhcHMyID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKENBUFNfNDhraHpfM0NIKTsKKyAgY2hhbm5lbF9tYXNrID0gMDsKKyAgY2hhbm5lbF9tYXNrIHw9CisgICAgICBHX0dVSU5UNjRfQ09OU1RBTlQgKDEpIDw8IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQ7CisgIGNoYW5uZWxfbWFzayB8PQorICAgICAgR19HVUlOVDY0X0NPTlNUQU5UICgxKSA8PCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVDsKKyAgY2hhbm5lbF9tYXNrIHw9CisgICAgICBHX0dVSU5UNjRfQ09OU1RBTlQgKDEpIDw8IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUjsKKyAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwczIsICJjaGFubmVsLW1hc2siLCBHU1RfVFlQRV9CSVRNQVNLLCBjaGFubmVsX21hc2ssCisgICAgICBOVUxMKTsKKyAgcmV0X2NhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAobXlzcmNwYWQsIGNhcHMyKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2lzX2VtcHR5IChyZXRfY2FwcykpOworICBnc3RfY2Fwc191bnJlZiAocmV0X2NhcHMpOworICBmYWlsX2lmIChnc3RfcGFkX3BlZXJfcXVlcnlfYWNjZXB0X2NhcHMgKG15c3JjcGFkLCBjYXBzMikpOworICBnc3RfcGFkX3NldF9jYXBzIChteXNyY3BhZCwgY2FwczIpOworCisgIGluYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgzICogNDgwMDAgKiBzaXplb2YgKGdmbG9hdCkpOworICBpbmJ1ZiA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoaW5idWYpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbmRhdGEgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMyAqIDQ4MDAwOyBpICs9IDMpIHsKKyAgICBpbmRhdGFbaV0gPSAtMS4wOworICAgIGluZGF0YVtpICsgMV0gPSAxLjA7CisgICAgaW5kYXRhW2kgKyAyXSA9IDAuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZiwgJm1hcCk7CisKKyAgLyogU2hvdWxkIGJyZWFrIGJlY2F1c2UgdGhlIGNhcHMgY2hhbmdlZCBpbiBhbiBpbmNvbXBhdGlibGUgd2F5ICovCisgIGZhaWxfaWYgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmKSA9PSBHU1RfRkxPV19PSyk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZGVpbnRlcmxlYXZlLAorICAgICAgICAgIEdTVF9TVEFURV9OVUxMKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGZvciAoaSA9IDA7IGkgPCBuc2lua3BhZHM7IGkrKykKKyAgICBnX29iamVjdF91bnJlZiAobXlzaW5rcGFkc1tpXSk7CisgIGdfZnJlZSAobXlzaW5rcGFkcyk7CisgIG15c2lua3BhZHMgPSBOVUxMOworCisgIGdfb2JqZWN0X3VucmVmIChkZWludGVybGVhdmUpOworICBnc3RfYnVzX3NldF9mbHVzaGluZyAoYnVzLCBUUlVFKTsKKyAgZ19vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMyKTsKKyAgZ3N0X29iamVjdF91bnJlZiAobXlzcmNwYWQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworI2RlZmluZSBTQU1QTEVTX1BFUl9CVUZGRVIgIDEwCisjZGVmaW5lIE5VTV9DSEFOTkVMUyAgICAgICAgOAorI2RlZmluZSBTQU1QTEVfUkFURSAgICAgICAgIDQ0MTAwCisKK3N0YXRpYyBndWludCBwYWRzX2NyZWF0ZWQ7CisKK3N0YXRpYyB2b2lkCitzZXRfY2hhbm5lbF9wb3NpdGlvbnMgKEdzdENhcHMgKiBjYXBzLCBpbnQgY2hhbm5lbHMsCisgICAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gKiBjaGFubmVscG9zaXRpb25zKQoreworICBpbnQgYzsKKyAgZ3VpbnQ2NCBjaGFubmVsX21hc2sgPSAwOworCisgIGZvciAoYyA9IDA7IGMgPCBjaGFubmVsczsgYysrKQorICAgIGNoYW5uZWxfbWFzayB8PSBHX0dVSU5UNjRfQ09OU1RBTlQgKDEpIDw8IGNoYW5uZWxwb3NpdGlvbnNbY107CisKKyAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgImNoYW5uZWwtbWFzayIsIEdTVF9UWVBFX0JJVE1BU0ssIGNoYW5uZWxfbWFzaywKKyAgICAgIE5VTEwpOworfQorCitzdGF0aWMgdm9pZAorc3JjX2hhbmRvZmZfZmxvYXQzMl84Y2ggKEdzdEVsZW1lbnQgKiBzcmMsIEdzdEJ1ZmZlciAqIGJ1ZiwgR3N0UGFkICogcGFkLAorICAgIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZ2Zsb2F0ICpkYXRhLCAqcDsKKyAgZ3VpbnQgc2l6ZSwgaSwgYzsKKworICBzaXplID0gc2l6ZW9mIChnZmxvYXQpICogU0FNUExFU19QRVJfQlVGRkVSICogTlVNX0NIQU5ORUxTOworICBkYXRhID0gcCA9IChnZmxvYXQgKikgZ19tYWxsb2MgKHNpemUpOworCisgIGZvciAoaSA9IDA7IGkgPCBTQU1QTEVTX1BFUl9CVUZGRVI7ICsraSkgeworICAgIGZvciAoYyA9IDA7IGMgPCBOVU1fQ0hBTk5FTFM7ICsrYykgeworICAgICAgKnAgPSAoZ2Zsb2F0KSAoKGkgKiBOVU1fQ0hBTk5FTFMpICsgYyk7CisgICAgICArK3A7CisgICAgfQorICB9CisKKyAgaWYgKGdzdF9idWZmZXJfbl9tZW1vcnkgKGJ1ZikpIHsKKyAgICBnc3RfYnVmZmVyX3JlcGxhY2VfbWVtb3J5X3JhbmdlIChidWYsIDAsIC0xLAorICAgICAgICBnc3RfbWVtb3J5X25ld193cmFwcGVkICgwLCBkYXRhLCBzaXplLCAwLCBzaXplLCBkYXRhLCBnX2ZyZWUpKTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfYnVmZmVyX2luc2VydF9tZW1vcnkgKGJ1ZiwgMCwKKyAgICAgICAgZ3N0X21lbW9yeV9uZXdfd3JhcHBlZCAoMCwgZGF0YSwgc2l6ZSwgMCwgc2l6ZSwgZGF0YSwgZ19mcmVlKSk7CisgIH0KKyAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikgPSAwOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKSA9IDA7Cit9CisKK3N0YXRpYyBHc3RQYWRQcm9iZVJldHVybgorc3JjX2V2ZW50X3Byb2JlIChHc3RQYWQgKiBwYWQsIEdzdFBhZFByb2JlSW5mbyAqIGluZm8sIGdwb2ludGVyIHVzZXJkYXRhKQoreworICBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBsYXlvdXRbTlVNX0NIQU5ORUxTXTsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ3VpbnQgaTsKKworICBpZiAoKGluZm8tPnR5cGUgJiBHU1RfUEFEX1BST0JFX1RZUEVfRVZFTlRfRE9XTlNUUkVBTSkKKyAgICAgICYmIEdTVF9FVkVOVF9UWVBFIChpbmZvLT5kYXRhKSA9PSBHU1RfRVZFTlRfU1RSRUFNX1NUQVJUKSB7CisgICAgZ3N0X3BhZF9yZW1vdmVfcHJvYmUgKHBhZCwgaW5mby0+aWQpOworCisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsCisgICAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCBHU1RfQVVESU9fTkUgKEYzMiksCisgICAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIE5VTV9DSEFOTkVMUywKKyAgICAgICAgImxheW91dCIsIEdfVFlQRV9TVFJJTkcsICJpbnRlcmxlYXZlZCIsCisgICAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgU0FNUExFX1JBVEUsIE5VTEwpOworCisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9DSEFOTkVMUzsgKytpKQorICAgICAgbGF5b3V0W2ldID0gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCArIGk7CisKKyAgICBzZXRfY2hhbm5lbF9wb3NpdGlvbnMgKGNhcHMsIE5VTV9DSEFOTkVMUywgbGF5b3V0KTsKKyAgICBnc3RfcGFkX3NldF9jYXBzIChwYWQsIGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgfQorCisgIHJldHVybiBHU1RfUEFEX1BST0JFX09LOworfQorCitzdGF0aWMgR3N0UGFkUHJvYmVSZXR1cm4KK2Zsb2F0X2J1ZmZlcl9jaGVja19wcm9iZSAoR3N0UGFkICogcGFkLCBHc3RQYWRQcm9iZUluZm8gKiBpbmZvLAorICAgIGdwb2ludGVyIHVzZXJkYXRhKQoreworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2Zsb2F0ICpkYXRhOworICBndWludCBwYWRudW0sIG51bXBhZHM7CisgIGd1aW50IG51bSwgaTsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0U3RydWN0dXJlICpzOworICBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiAqcG9zOworICBnaW50IGNoYW5uZWxzOworICBHc3RCdWZmZXIgKmJ1ZmZlciA9IEdTVF9QQURfUFJPQkVfSU5GT19CVUZGRVIgKGluZm8pOworICBHc3RBdWRpb0luZm8gYXVkaW9faW5mbzsKKyAgZ3VpbnQgcGFkX2lkID0gR1BPSU5URVJfVE9fVUlOVCAodXNlcmRhdGEpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHNzY2FuZiAoR1NUX1BBRF9OQU1FIChwYWQpLCAic3JjXyV1IiwgJnBhZG51bSksIDEpOworCisgIG51bXBhZHMgPSBwYWRzX2NyZWF0ZWQ7CisKKyAgLyogQ2hlY2sgY2FwcyAqLworICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChwYWQpOworICBmYWlsX3VubGVzcyAoY2FwcyAhPSBOVUxMKTsKKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzLCAiY2hhbm5lbHMiLCAmY2hhbm5lbHMpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoY2hhbm5lbHMsIDEpOworCisgIGdzdF9hdWRpb19pbmZvX2luaXQgKCZhdWRpb19pbmZvKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9hdWRpb19pbmZvX2Zyb21fY2FwcyAoJmF1ZGlvX2luZm8sIGNhcHMpKTsKKworICBwb3MgPSBhdWRpb19pbmZvLnBvc2l0aW9uOworICBmYWlsX3VubGVzcyAocG9zICE9IE5VTEwKKyAgICAgICYmIHBvc1swXSA9PSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUICsgcGFkX2lkKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRhdGEgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBudW0gPSBtYXAuc2l6ZSAvIHNpemVvZiAoZ2Zsb2F0KTsKKworICAvKiBDaGVjayBidWZmZXIgY29udGVudCAqLworICBmb3IgKGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKKyAgICBndWludCB2YWwsIHJlc3Q7CisKKyAgICB2YWwgPSAoZ3VpbnQpIGRhdGFbaV07CisgICAgR1NUX0xPRyAoIiVzWyV1XTogJThmIiwgR1NUX1BBRF9OQU1FIChwYWQpLCBpLCBkYXRhW2ldKTsKKyAgICAvKiBjYW4ndCB1c2UgdGhlIG1vZHVsbyBvcGVyYXRvciBpbiB0aGUgYXNzZXJ0aW9uIHN0YXRlbWVudCwgc2luY2UgZHVlIHRvCisgICAgICogdGhlIHdheSBpdCBnZXRzIGV4cGFuZGVkIGl0IHdvdWxkIGJlIGludGVycHJldGVkIGFzIGEgcHJpbnRmIG9wZXJhdG9yCisgICAgICogaW4gdGhlIGZhaWx1cmUgY2FzZSwgd2hpY2ggd2lsbCByZXN1bHQgaW4gc2VnZmF1bHRzICovCisgICAgcmVzdCA9IHZhbCAlIG51bXBhZHM7CisgICAgLyogY2hlY2sgdGhhdCB0aGUgZmlyc3QgY2hhbm5lbCBpcyBvbiBwYWQgc3JjMCwgdGhlIHNlY29uZCBvbiBzcmMxIGV0Yy4gKi8KKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChyZXN0LCBwYWRudW0pOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKKyAgcmV0dXJuIEdTVF9QQURfUFJPQkVfT0s7ICAgICAgLyogZG9uJ3QgZHJvcCBkYXRhICovCit9CisKK3N0YXRpYyB2b2lkCitwYWRfYWRkZWRfc2V0dXBfZGF0YV9jaGVja19mbG9hdDMyXzhjaF9jYiAoR3N0RWxlbWVudCAqIGRlaW50ZXJsZWF2ZSwKKyAgICBHc3RQYWQgKiBwYWQsIEdzdEVsZW1lbnQgKiBwaXBlbGluZSkKK3sKKyAgR3N0RWxlbWVudCAqcXVldWUsICpzaW5rOworICBHc3RQYWQgKnNpbmtwYWQ7CisKKyAgcXVldWUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJxdWV1ZSIsIE5VTEwpOworICBmYWlsX3VubGVzcyAocXVldWUgIT0gTlVMTCk7CisKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChzaW5rICE9IE5VTEwpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgcXVldWUsIHNpbmssIE5VTEwpOworICBnc3RfZWxlbWVudF9saW5rX3BhZHNfZnVsbCAocXVldWUsICJzcmMiLCBzaW5rLCAic2luayIsCisgICAgICBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisKKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChxdWV1ZSwgInNpbmsiKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcGFkX2xpbmsgKHBhZCwgc2lua3BhZCksIEdTVF9QQURfTElOS19PSyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworCisgIGdzdF9wYWRfYWRkX3Byb2JlIChwYWQsIEdTVF9QQURfUFJPQkVfVFlQRV9CVUZGRVIsIGZsb2F0X2J1ZmZlcl9jaGVja19wcm9iZSwKKyAgICAgIEdVSU5UX1RPX1BPSU5URVIgKHBhZHNfY3JlYXRlZCksIE5VTEwpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc2luaywgR1NUX1NUQVRFX1BMQVlJTkcpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHF1ZXVlLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgR1NUX0xPRyAoIm5ldyBwYWQ6ICVzIiwgR1NUX1BBRF9OQU1FIChwYWQpKTsKKyAgKytwYWRzX2NyZWF0ZWQ7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK21ha2VfZmFrZV9zcmNfOGNoYW5zX2Zsb2F0MzIgKHZvaWQpCit7CisgIEdzdEVsZW1lbnQgKnNyYzsKKyAgR3N0UGFkICpwYWQ7CisKKyAgc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNyYyIsICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKHNyYyAhPSBOVUxMLCAiZmFpbGVkIHRvIGNyZWF0ZSBmYWtlc3JjIGVsZW1lbnQiKTsKKworICBnX29iamVjdF9zZXQgKHNyYywgIm51bS1idWZmZXJzIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc3JjLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgTlVMTCk7CisKKyAgZ19zaWduYWxfY29ubmVjdCAoc3JjLCAiaGFuZG9mZiIsIEdfQ0FMTEJBQ0sgKHNyY19oYW5kb2ZmX2Zsb2F0MzJfOGNoKSwgTlVMTCk7CisKKyAgcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNyYywgInNyYyIpOworICBnc3RfcGFkX2FkZF9wcm9iZSAocGFkLCBHU1RfUEFEX1BST0JFX1RZUEVfRVZFTlRfRE9XTlNUUkVBTSwgc3JjX2V2ZW50X3Byb2JlLAorICAgICAgTlVMTCwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisKKyAgcmV0dXJuIHNyYzsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfOF9jaGFubmVsc19mbG9hdDMyKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZSwgKnNyYywgKmRlaW50ZXJsZWF2ZTsKKyAgR3N0TWVzc2FnZSAqbXNnOworCisgIHBpcGVsaW5lID0gKEdzdEVsZW1lbnQgKikgZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIGZhaWxfdW5sZXNzIChwaXBlbGluZSAhPSBOVUxMLCAiZmFpbGVkIHRvIGNyZWF0ZSBwaXBlbGluZSIpOworCisgIHNyYyA9IG1ha2VfZmFrZV9zcmNfOGNoYW5zX2Zsb2F0MzIgKCk7CisKKyAgZGVpbnRlcmxlYXZlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZGVpbnRlcmxlYXZlIiwgImRlaW50ZXJsZWF2ZSIpOworICBmYWlsX3VubGVzcyAoZGVpbnRlcmxlYXZlICE9IE5VTEwsICJmYWlsZWQgdG8gY3JlYXRlIGRlaW50ZXJsZWF2ZSBlbGVtZW50Iik7CisgIGdfb2JqZWN0X3NldCAoZGVpbnRlcmxlYXZlLCAia2VlcC1wb3NpdGlvbnMiLCBUUlVFLCBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHNyYywgZGVpbnRlcmxlYXZlLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGluayAoc3JjLCBkZWludGVybGVhdmUpLAorICAgICAgImZhaWxlZCB0byBsaW5rIHNyYyA8PT4gZGVpbnRlcmxlYXZlIik7CisKKyAgZ19zaWduYWxfY29ubmVjdCAoZGVpbnRlcmxlYXZlLCAicGFkLWFkZGVkIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKHBhZF9hZGRlZF9zZXR1cF9kYXRhX2NoZWNrX2Zsb2F0MzJfOGNoX2NiKSwgcGlwZWxpbmUpOworCisgIHBhZHNfY3JlYXRlZCA9IDA7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIG1zZyA9IGdzdF9idXNfcG9sbCAoR1NUX0VMRU1FTlRfQlVTIChwaXBlbGluZSksIEdTVF9NRVNTQUdFX0VPUywgLTEpOworICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChwYWRzX2NyZWF0ZWQsIE5VTV9DSEFOTkVMUyk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK2RlaW50ZXJsZWF2ZV9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJkZWludGVybGVhdmUiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9zZXRfdGltZW91dCAodGNfY2hhaW4sIDE4MCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9jcmVhdGVfYW5kX3VucmVmKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzJfY2hhbm5lbHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfMl9jaGFubmVsc18xX2xpbmtlZCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF8yX2NoYW5uZWxzX2NhcHNfY2hhbmdlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzhfY2hhbm5lbHNfZmxvYXQzMik7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChkZWludGVybGVhdmUpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvZHRtZi5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvZHRtZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYWUzNmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9kdG1mLmMKQEAgLTAsMCArMSw1ODggQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIHVuaXQgdGVzdCBmb3IgZHRtZiBlbGVtZW50cworICogQ29weXJpZ2h0IChDKSAyMDEzIENvbGxhYm9yYSBMdGQKKyAqICAgQGF1dGhvcjogT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0dGVzdGNsb2NrLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworCisvKiBJbmNsdWRlIHRoaXMgZnJvbSB0aGUgcGx1Z2luIHRvIGdldCB0aGUgZGVmaW5lcyAqLworCisjaW5jbHVkZSAiLi4vLi4vZ3N0L2R0bWYvZ3N0ZHRtZmNvbW1vbi5oIgorCisjZGVmaW5lIEVORF9CSVQgKDE8PDcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBhdWRpb19zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSBcIiIgR1NUX0FVRElPX05FIChTMTYpICJcIiwgIgorICAgICAgICAicmF0ZSA9ICIgR1NUX0FVRElPX1JBVEVfUkFOR0UgIiwgIiAiY2hhbm5lbHMgPSAoaW50KSAxIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgcnRwX2R0bWZfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgWyAwLCBNQVggXSwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiVEVMRVBIT05FLUVWRU5UXCIiKQorICAgICk7CisKKworc3RhdGljIHZvaWQKK2NoZWNrX2dldF9kdG1mX2V2ZW50X21lc3NhZ2UgKEdzdEJ1cyAqIGJ1cywgZ2ludCBudW1iZXIsIGdpbnQgdm9sdW1lKQoreworICBHc3RNZXNzYWdlICptZXNzYWdlOworICBnYm9vbGVhbiBoYXZlX21lc3NhZ2UgPSBGQUxTRTsKKworICB3aGlsZSAoIWhhdmVfbWVzc2FnZSAmJgorICAgICAgKG1lc3NhZ2UgPSBnc3RfYnVzX3BvcF9maWx0ZXJlZCAoYnVzLCBHU1RfTUVTU0FHRV9FTEVNRU5UKSkgIT0gTlVMTCkgeworICAgIGlmIChnc3RfbWVzc2FnZV9oYXNfbmFtZSAobWVzc2FnZSwgImR0bWYtZXZlbnQiKSkgeworICAgICAgY29uc3QgR3N0U3RydWN0dXJlICpzID0gZ3N0X21lc3NhZ2VfZ2V0X3N0cnVjdHVyZSAobWVzc2FnZSk7CisgICAgICBnaW50IHN0eXBlLCBzbnVtYmVyLCBzbWV0aG9kLCBzdm9sdW1lOworCisgICAgICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9nZXQgKHMsCisgICAgICAgICAgICAgICJ0eXBlIiwgR19UWVBFX0lOVCwgJnN0eXBlLAorICAgICAgICAgICAgICAibnVtYmVyIiwgR19UWVBFX0lOVCwgJnNudW1iZXIsCisgICAgICAgICAgICAgICJtZXRob2QiLCBHX1RZUEVfSU5ULCAmc21ldGhvZCwKKyAgICAgICAgICAgICAgInZvbHVtZSIsIEdfVFlQRV9JTlQsICZzdm9sdW1lLCBOVUxMKSk7CisKKyAgICAgIGZhaWxfdW5sZXNzIChzdHlwZSA9PSAxKTsKKyAgICAgIGZhaWxfdW5sZXNzIChzbWV0aG9kID09IDEpOworICAgICAgZmFpbF91bmxlc3MgKHNudW1iZXIgPT0gbnVtYmVyKTsKKyAgICAgIGZhaWxfdW5sZXNzIChzdm9sdW1lID09IHZvbHVtZSk7CisgICAgICBoYXZlX21lc3NhZ2UgPSBUUlVFOworICAgIH0KKyAgICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIH0KKworICBmYWlsX3VubGVzcyAoaGF2ZV9tZXNzYWdlKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX25vX2R0bWZfZXZlbnRfbWVzc2FnZSAoR3N0QnVzICogYnVzKQoreworICBHc3RNZXNzYWdlICptZXNzYWdlOworICBnYm9vbGVhbiBoYXZlX21lc3NhZ2UgPSBGQUxTRTsKKworICB3aGlsZSAoIWhhdmVfbWVzc2FnZSAmJgorICAgICAgKG1lc3NhZ2UgPSBnc3RfYnVzX3BvcF9maWx0ZXJlZCAoYnVzLCBHU1RfTUVTU0FHRV9FTEVNRU5UKSkgIT0gTlVMTCkgeworICAgIGlmIChnc3RfbWVzc2FnZV9oYXNfbmFtZSAobWVzc2FnZSwgImR0bWYtZXZlbnQiKSB8fAorICAgICAgICBnc3RfbWVzc2FnZV9oYXNfbmFtZSAobWVzc2FnZSwgImR0bWYtZXZlbnQtcHJvY2Vzc2VkIikgfHwKKyAgICAgICAgZ3N0X21lc3NhZ2VfaGFzX25hbWUgKG1lc3NhZ2UsICJkdG1mLWV2ZW50LWRyb3BwZWQiKSkgeworICAgICAgaGF2ZV9tZXNzYWdlID0gVFJVRTsKKyAgICB9CisgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICB9CisKKyAgZmFpbF91bmxlc3MgKCFoYXZlX21lc3NhZ2UpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfYnVmZmVyc19kdXJhdGlvbiAoR3N0Q2xvY2tUaW1lIGV4cGVjdGVkX2R1cmF0aW9uKQoreworICBHc3RDbG9ja1RpbWUgZHVyYXRpb24gPSAwOworCisgIHdoaWxlIChidWZmZXJzKSB7CisgICAgR3N0QnVmZmVyICpidWYgPSBidWZmZXJzLT5kYXRhOworCisgICAgYnVmZmVycyA9IGdfbGlzdF9kZWxldGVfbGluayAoYnVmZmVycywgYnVmZmVycyk7CisKKyAgICBmYWlsX3VubGVzcyAoR1NUX0JVRkZFUl9EVVJBVElPTl9JU19WQUxJRCAoYnVmKSk7CisgICAgZHVyYXRpb24gKz0gR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICB9CisKKyAgZmFpbF91bmxlc3MgKGR1cmF0aW9uID09IGV4cGVjdGVkX2R1cmF0aW9uKTsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfcnRwX3BhY2tldCAoR3N0UGFkICogc3JjLCBndWludCB0aW1lc3RhbXAsIGdib29sZWFuIG1hcmtlciwgZ2Jvb2xlYW4gZW5kLAorICAgIGd1aW50IG51bWJlciwgZ3VpbnQgdm9sdW1lLCBndWludCBkdXJhdGlvbikKK3sKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdFJUUEJ1ZmZlciBydHBidWYgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworICBnY2hhciAqcGF5bG9hZDsKKyAgc3RhdGljIGd1aW50IHNlcW51bSA9IDE7CisKKyAgYnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlICg0LCAwLCAwKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9ydHBfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1JFQURXUklURSwgJnJ0cGJ1ZikpOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfc2VxICgmcnRwYnVmLCBzZXFudW0rKyk7CisgIGdzdF9ydHBfYnVmZmVyX3NldF90aW1lc3RhbXAgKCZydHBidWYsIHRpbWVzdGFtcCk7CisgIGdzdF9ydHBfYnVmZmVyX3NldF9tYXJrZXIgKCZydHBidWYsIG1hcmtlcik7CisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cGJ1Zik7CisgIHBheWxvYWRbMF0gPSBudW1iZXI7CisgIHBheWxvYWRbMV0gPSB2b2x1bWUgfCAoZW5kID8gRU5EX0JJVCA6IDApOworICBHU1RfV1JJVEVfVUlOVDE2X0JFIChwYXlsb2FkICsgMiwgZHVyYXRpb24pOworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cGJ1Zik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKHNyYywgYnVmKSA9PSBHU1RfRkxPV19PSyk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3J0cGR0bWZkZXBheSkKK3sKKyAgR3N0RWxlbWVudCAqZHRtZmRlcGF5OworICBHc3RQYWQgKnNyYywgKnNpbms7CisgIEdzdEJ1cyAqYnVzOworICBHc3RDYXBzICpjYXBzX2luOworICBHc3RDYXBzICpleHBlY3RlZF9jYXBzX291dDsKKyAgR3N0Q2FwcyAqY2Fwc19vdXQ7CisKKyAgZHRtZmRlcGF5ID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJydHBkdG1mZGVwYXkiKTsKKyAgc2luayA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAoZHRtZmRlcGF5LCAmYXVkaW9fc2lua190ZW1wbGF0ZSk7CisgIHNyYyA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkIChkdG1mZGVwYXksICZydHBfZHRtZl9zcmNfdGVtcGxhdGUpOworCisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChkdG1mZGVwYXksIGJ1cyk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzcmMsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNpbmssIFRSVUUpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGR0bWZkZXBheSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisKKyAgY2Fwc19pbiA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXJ0cCIsCisgICAgICAiZW5jb2RpbmctbmFtZSIsIEdfVFlQRV9TVFJJTkcsICJURUxFUEhPTkUtRVZFTlQiLAorICAgICAgIm1lZGlhIiwgR19UWVBFX1NUUklORywgImF1ZGlvIiwKKyAgICAgICJjbG9jay1yYXRlIiwgR19UWVBFX0lOVCwgMTAwMCwgInBheWxvYWQiLCBHX1RZUEVfSU5ULCA5OSwgTlVMTCk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKHNyYywgZHRtZmRlcGF5LCBjYXBzX2luLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwc19pbik7CisKKyAgY2Fwc19vdXQgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHNpbmspOworICBleHBlY3RlZF9jYXBzX291dCA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsCisgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgR1NUX0FVRElPX05FIChTMTYpLAorICAgICAgInJhdGUiLCBHX1RZUEVfSU5ULCAxMDAwLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2lzX2VxdWFsX2ZpeGVkIChjYXBzX291dCwgZXhwZWN0ZWRfY2Fwc19vdXQpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGV4cGVjdGVkX2NhcHNfb3V0KTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHNfb3V0KTsKKworICAvKiBTaW5nbGUgcGFja2V0IERUTUYgKi8KKyAgc2VuZF9ydHBfcGFja2V0IChzcmMsIDIwMCwgVFJVRSwgVFJVRSwgMSwgNSwgMjUwKTsKKyAgY2hlY2tfZ2V0X2R0bWZfZXZlbnRfbWVzc2FnZSAoYnVzLCAxLCA1KTsKKyAgY2hlY2tfYnVmZmVyc19kdXJhdGlvbiAoMjUwICogR1NUX01TRUNPTkQpOworCisgIC8qIFR3byBwYWNrZXQgRFRNRiAqLworICBzZW5kX3J0cF9wYWNrZXQgKHNyYywgODAwLCBUUlVFLCBGQUxTRSwgMSwgNSwgMjAwKTsKKyAgc2VuZF9ydHBfcGFja2V0IChzcmMsIDgwMCwgRkFMU0UsIFRSVUUsIDEsIDUsIDQwMCk7CisgIGNoZWNrX2J1ZmZlcnNfZHVyYXRpb24gKDQwMCAqIEdTVF9NU0VDT05EKTsKKyAgY2hlY2tfZ2V0X2R0bWZfZXZlbnRfbWVzc2FnZSAoYnVzLCAxLCA1KTsKKworICAvKiBMb25nIERUTUYgKi8KKyAgc2VuZF9ydHBfcGFja2V0IChzcmMsIDMwMDAsIFRSVUUsIEZBTFNFLCAxLCA1LCAyMDApOworICBjaGVja19nZXRfZHRtZl9ldmVudF9tZXNzYWdlIChidXMsIDEsIDUpOworICBjaGVja19idWZmZXJzX2R1cmF0aW9uICgyMDAgKiBHU1RfTVNFQ09ORCk7CisgIHNlbmRfcnRwX3BhY2tldCAoc3JjLCAzMDAwLCBGQUxTRSwgRkFMU0UsIDEsIDUsIDQwMCk7CisgIGNoZWNrX25vX2R0bWZfZXZlbnRfbWVzc2FnZSAoYnVzKTsKKyAgY2hlY2tfYnVmZmVyc19kdXJhdGlvbiAoMjAwICogR1NUX01TRUNPTkQpOworICBzZW5kX3J0cF9wYWNrZXQgKHNyYywgMzAwMCwgRkFMU0UsIEZBTFNFLCAxLCA1LCA2MDApOworICBjaGVja19ub19kdG1mX2V2ZW50X21lc3NhZ2UgKGJ1cyk7CisgIGNoZWNrX2J1ZmZlcnNfZHVyYXRpb24gKDIwMCAqIEdTVF9NU0VDT05EKTsKKworICAvKiBOZXcgd2l0aG91dCBlbmQgdG8gbGFzdCAqLworICBzZW5kX3J0cF9wYWNrZXQgKHNyYywgNDAwMCwgVFJVRSwgVFJVRSwgMSwgNSwgMjUwKTsKKyAgY2hlY2tfZ2V0X2R0bWZfZXZlbnRfbWVzc2FnZSAoYnVzLCAxLCA1KTsKKyAgY2hlY2tfYnVmZmVyc19kdXJhdGlvbiAoMjUwICogR1NUX01TRUNPTkQpOworCisgIGNoZWNrX25vX2R0bWZfZXZlbnRfbWVzc2FnZSAoYnVzKTsKKyAgZmFpbF91bmxlc3MgKGJ1ZmZlcnMgPT0gTlVMTCk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKGR0bWZkZXBheSwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzcmMsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzaW5rLCBGQUxTRSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAoZHRtZmRlcGF5KTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKGR0bWZkZXBheSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChkdG1mZGVwYXkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHJ0cF9kdG1mX3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgOTksICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSAxMDAwLCAiCisgICAgICAgICJzZXFudW0tb2Zmc2V0ID0gKHVpbnQpIDMzMywgIgorICAgICAgICAidGltZXN0YW1wLW9mZnNldCA9ICh1aW50KSA2NjYsICIKKyAgICAgICAgInNzcmMgPSAodWludCkgOTk5LCAiCisgICAgICAgICJtYXhwdGltZSA9ICh1aW50KSAyMCwgZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiVEVMRVBIT05FLUVWRU5UXCIiKQorICAgICk7CisKK0dzdEVsZW1lbnQgKmR0bWZzcmM7CitHc3RQYWQgKnNpbms7CitHc3RDbG9jayAqdGVzdGNsb2NrOworR3N0QnVzICpidXM7CisKK3N0YXRpYyB2b2lkCitjaGVja19tZXNzYWdlX3N0cnVjdHVyZSAoR3N0U3RydWN0dXJlICogZXhwZWN0ZWRfcykKK3sKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKyAgZ2Jvb2xlYW4gaGF2ZV9tZXNzYWdlID0gRkFMU0U7CisKKyAgd2hpbGUgKCFoYXZlX21lc3NhZ2UgJiYKKyAgICAgIChtZXNzYWdlID0gZ3N0X2J1c190aW1lZF9wb3BfZmlsdGVyZWQgKGJ1cywgR1NUX0NMT0NLX1RJTUVfTk9ORSwKKyAgICAgICAgICAgICAgR1NUX01FU1NBR0VfRUxFTUVOVCkpICE9IE5VTEwpIHsKKyAgICBpZiAoZ3N0X21lc3NhZ2VfaGFzX25hbWUgKG1lc3NhZ2UsIGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKGV4cGVjdGVkX3MpKSkgeworICAgICAgY29uc3QgR3N0U3RydWN0dXJlICpzID0gZ3N0X21lc3NhZ2VfZ2V0X3N0cnVjdHVyZSAobWVzc2FnZSk7CisKKyAgICAgIGZhaWxfdW5sZXNzIChnc3Rfc3RydWN0dXJlX2lzX2VxdWFsIChzLCBleHBlY3RlZF9zKSk7CisgICAgICBoYXZlX21lc3NhZ2UgPSBUUlVFOworICAgIH0KKyAgICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIH0KKworICBmYWlsX3VubGVzcyAoaGF2ZV9tZXNzYWdlKTsKKworICBnc3Rfc3RydWN0dXJlX2ZyZWUgKGV4cGVjdGVkX3MpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfcnRwX2J1ZmZlciAoR3N0Q2xvY2tUaW1lIHRzLCBHc3RDbG9ja1RpbWUgZHVyYXRpb24sIGdib29sZWFuIHN0YXJ0LAorICAgIGdib29sZWFuIGVuZCwgZ3VpbnQgcnRwdHMsIGd1aW50IHNzcmMsIGd1aW50IHZvbHVtZSwgZ3VpbnQgbnVtYmVyLAorICAgIGd1aW50IHJ0cGR1cmF0aW9uKQoreworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0UlRQQnVmZmVyIHJ0cGJ1ZmZlciA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisgIGdjaGFyICpwYXlsb2FkOworCisgIGdfbXV0ZXhfbG9jayAoJmNoZWNrX211dGV4KTsKKyAgd2hpbGUgKGJ1ZmZlcnMgPT0gTlVMTCkKKyAgICBnX2NvbmRfd2FpdCAoJmNoZWNrX2NvbmQsICZjaGVja19tdXRleCk7CisgIGdfbXV0ZXhfdW5sb2NrICgmY2hlY2tfbXV0ZXgpOworICBmYWlsX3VubGVzcyAoYnVmZmVycyAhPSBOVUxMKTsKKworICBidWZmZXIgPSBidWZmZXJzLT5kYXRhOworICBidWZmZXJzID0gZ19saXN0X2RlbGV0ZV9saW5rIChidWZmZXJzLCBidWZmZXJzKTsKKworICBmYWlsX3VubGVzcyAoR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcikgPT0gdHMpOworICBmYWlsX3VubGVzcyAoR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSA9PSBkdXJhdGlvbik7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9ydHBfYnVmZmVyX21hcCAoYnVmZmVyLCBHU1RfTUFQX1JFQUQsICZydHBidWZmZXIpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKCZydHBidWZmZXIpID09IHN0YXJ0KTsKKyAgZmFpbF91bmxlc3MgKGdzdF9ydHBfYnVmZmVyX2dldF90aW1lc3RhbXAgKCZydHBidWZmZXIpID09IHJ0cHRzKTsKKyAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwYnVmZmVyKTsKKworICBmYWlsX3VubGVzcyAocGF5bG9hZFswXSA9PSBudW1iZXIpOworICBmYWlsX3VubGVzcyAoKHBheWxvYWRbMV0gJiAweDdGKSA9PSB2b2x1bWUpOworICBmYWlsX3VubGVzcyAoISAhKHBheWxvYWRbMV0gJiAweDgwKSA9PSBlbmQpOworICBmYWlsX3VubGVzcyAoR1NUX1JFQURfVUlOVDE2X0JFIChwYXlsb2FkICsgMikgPT0gcnRwZHVyYXRpb24pOworCisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwYnVmZmVyKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKK30KKworZ2ludCBtZXRob2Q7CisKK3N0YXRpYyB2b2lkCitzZXR1cF9ydHBkdG1mc3JjICh2b2lkKQoreworICB0ZXN0Y2xvY2sgPSBnc3RfdGVzdF9jbG9ja19uZXcgKCk7CisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworCisgIG1ldGhvZCA9IDE7CisgIGR0bWZzcmMgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoInJ0cGR0bWZzcmMiKTsKKyAgc2luayA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAoZHRtZnNyYywgJnJ0cF9kdG1mX3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChkdG1mc3JjLCBidXMpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X2Nsb2NrIChkdG1mc3JjLCB0ZXN0Y2xvY2spKTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNpbmssIFRSVUUpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChkdG1mc3JjLCBHU1RfU1RBVEVfUExBWUlORykgPT0KKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZWFyZG93bl9kdG1mc3JjICh2b2lkKQoreworICBnc3Rfb2JqZWN0X3VucmVmICh0ZXN0Y2xvY2spOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNpbmssIEZBTFNFKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAoZHRtZnNyYywgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAoZHRtZnNyYyk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChkdG1mc3JjKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZHRtZnNyY19pbnZhbGlkX2V2ZW50cykKK3sKKyAgR3N0U3RydWN0dXJlICpzOworCisgIC8qIE1pc3Npbmcgc3RhcnQgKi8KKyAgcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgiZHRtZi1ldmVudCIsCisgICAgICAidHlwZSIsIEdfVFlQRV9JTlQsIDEsICJudW1iZXIiLCBHX1RZUEVfSU5ULCAzLAorICAgICAgIm1ldGhvZCIsIEdfVFlQRV9JTlQsIG1ldGhvZCwgInZvbHVtZSIsIEdfVFlQRV9JTlQsIDgsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChzaW5rLAorICAgICAgICAgIGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNLCBzKSkgPT0gRkFMU0UpOworCisgIC8qIE1pc3Npbmcgdm9sdW1lICovCisgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAoImR0bWYtZXZlbnQiLAorICAgICAgInR5cGUiLCBHX1RZUEVfSU5ULCAxLCAibnVtYmVyIiwgR19UWVBFX0lOVCwgMywKKyAgICAgICJtZXRob2QiLCBHX1RZUEVfSU5ULCBtZXRob2QsICJzdGFydCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAoc2luaywKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwgcykpID09IEZBTFNFKTsKKworICAvKiBNaXNzaW5nIG51bWJlciAqLworICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJkdG1mLWV2ZW50IiwKKyAgICAgICJ0eXBlIiwgR19UWVBFX0lOVCwgMSwgIm1ldGhvZCIsIEdfVFlQRV9JTlQsIG1ldGhvZCwKKyAgICAgICJ2b2x1bWUiLCBHX1RZUEVfSU5ULCA4LCAic3RhcnQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKHNpbmssCisgICAgICAgICAgZ3N0X2V2ZW50X25ld19jdXN0b20gKEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU0sIHMpKSA9PSBGQUxTRSk7CisKKyAgLyogTWlzc2luZyB0eXBlICovCisgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAoImR0bWYtZXZlbnQiLAorICAgICAgIm51bWJlciIsIEdfVFlQRV9JTlQsIDMsICJtZXRob2QiLCBHX1RZUEVfSU5ULCBtZXRob2QsCisgICAgICAidm9sdW1lIiwgR19UWVBFX0lOVCwgOCwgInN0YXJ0IiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChzaW5rLAorICAgICAgICAgIGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNLCBzKSkgPT0gRkFMU0UpOworCisgIC8qIFN0b3AgYmVmb3JlIHN0YXJ0ICovCisgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAoImR0bWYtZXZlbnQiLAorICAgICAgInR5cGUiLCBHX1RZUEVfSU5ULCAxLCAibnVtYmVyIiwgR19UWVBFX0lOVCwgMywKKyAgICAgICJtZXRob2QiLCBHX1RZUEVfSU5ULCBtZXRob2QsICJ2b2x1bWUiLCBHX1RZUEVfSU5ULCA4LAorICAgICAgInN0YXJ0IiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAoc2luaywKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwgcykpID09IEZBTFNFKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGR0bWZzcmMsIEdTVF9TVEFURV9OVUxMKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ydHBkdG1mc3JjX21pbl9kdXJhdGlvbikKK3sKKyAgR3N0U3RydWN0dXJlICpzOworICBHc3RDbG9ja0lEIGlkOworICBndWludCB0aW1lc3RhbXAgPSAwOworICBHc3RDYXBzICpleHBlY3RlZF9jYXBzLCAqY2FwczsKKworICAvKiBNaW5pbXVtIGR1cmF0aW9uIGR0bWYgKi8KKworICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJkdG1mLWV2ZW50IiwKKyAgICAgICJ0eXBlIiwgR19UWVBFX0lOVCwgMSwgIm51bWJlciIsIEdfVFlQRV9JTlQsIDMsCisgICAgICAibWV0aG9kIiwgR19UWVBFX0lOVCwgMSwgInZvbHVtZSIsIEdfVFlQRV9JTlQsIDgsCisgICAgICAic3RhcnQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKHNpbmssCisgICAgICAgICAgZ3N0X2V2ZW50X25ld19jdXN0b20gKEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU0sCisgICAgICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfY29weSAocykpKSk7CisgIGNoZWNrX25vX2R0bWZfZXZlbnRfbWVzc2FnZSAoYnVzKTsKKyAgZ3N0X3Rlc3RfY2xvY2tfd2FpdF9mb3JfbmV4dF9wZW5kaW5nX2lkIChHU1RfVEVTVF9DTE9DSyAodGVzdGNsb2NrKSwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChidWZmZXJzID09IE5VTEwpOworICBpZCA9IGdzdF90ZXN0X2Nsb2NrX3Byb2Nlc3NfbmV4dF9jbG9ja19pZCAoR1NUX1RFU1RfQ0xPQ0sgKHRlc3RjbG9jaykpOworICBmYWlsX3VubGVzcyAoZ3N0X2Nsb2NrX2lkX2dldF90aW1lIChpZCkgPT0gMCk7CisgIGdzdF9jbG9ja19pZF91bnJlZiAoaWQpOworICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzLCAiZHRtZi1ldmVudC1wcm9jZXNzZWQiKTsKKyAgY2hlY2tfbWVzc2FnZV9zdHJ1Y3R1cmUgKHMpOworCisgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAoImR0bWYtZXZlbnQiLAorICAgICAgInR5cGUiLCBHX1RZUEVfSU5ULCAxLCAibWV0aG9kIiwgR19UWVBFX0lOVCwgMSwKKyAgICAgICJzdGFydCIsIEdfVFlQRV9CT09MRUFOLCBGQUxTRSwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKHNpbmssCisgICAgICAgICAgZ3N0X2V2ZW50X25ld19jdXN0b20gKEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU0sCisgICAgICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfY29weSAocykpKSk7CisKKyAgY2hlY2tfcnRwX2J1ZmZlciAoMCwgMjAgKiBHU1RfTVNFQ09ORCwgVFJVRSwgRkFMU0UsIDY2NiwgOTk5LCA4LCAzLCAyMCk7CisKKyAgZm9yICh0aW1lc3RhbXAgPSAyMDsgdGltZXN0YW1wIDwgTUlOX1BVTFNFX0RVUkFUSU9OICsgMjA7IHRpbWVzdGFtcCArPSAyMCkgeworICAgIGdzdF90ZXN0X2Nsb2NrX2FkdmFuY2VfdGltZSAoR1NUX1RFU1RfQ0xPQ0sgKHRlc3RjbG9jayksCisgICAgICAgIDIwICogR1NUX01TRUNPTkQgKyAxKTsKKyAgICBnc3RfdGVzdF9jbG9ja193YWl0X2Zvcl9uZXh0X3BlbmRpbmdfaWQgKEdTVF9URVNUX0NMT0NLICh0ZXN0Y2xvY2spLCBOVUxMKTsKKyAgICBmYWlsX3VubGVzcyAoYnVmZmVycyA9PSBOVUxMKTsKKyAgICBpZCA9IGdzdF90ZXN0X2Nsb2NrX3Byb2Nlc3NfbmV4dF9jbG9ja19pZCAoR1NUX1RFU1RfQ0xPQ0sgKHRlc3RjbG9jaykpOworICAgIGZhaWxfdW5sZXNzIChnc3RfY2xvY2tfaWRfZ2V0X3RpbWUgKGlkKSA9PSB0aW1lc3RhbXAgKiBHU1RfTVNFQ09ORCk7CisgICAgZ3N0X2Nsb2NrX2lkX3VucmVmIChpZCk7CisKKyAgICBpZiAodGltZXN0YW1wIDwgTUlOX1BVTFNFX0RVUkFUSU9OKSB7CisgICAgICBjaGVja19ydHBfYnVmZmVyICh0aW1lc3RhbXAgKiBHU1RfTVNFQ09ORCwgMjAgKiBHU1RfTVNFQ09ORCwgRkFMU0UsCisgICAgICAgICAgRkFMU0UsIDY2NiwgOTk5LCA4LCAzLCB0aW1lc3RhbXAgKyAyMCk7CisgICAgICBjaGVja19ub19kdG1mX2V2ZW50X21lc3NhZ2UgKGJ1cyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHMsICJkdG1mLWV2ZW50LXByb2Nlc3NlZCIpOworICAgICAgY2hlY2tfbWVzc2FnZV9zdHJ1Y3R1cmUgKHMpOworICAgICAgY2hlY2tfcnRwX2J1ZmZlciAodGltZXN0YW1wICogR1NUX01TRUNPTkQsCisgICAgICAgICAgKDIwICsgTUlOX0lOVEVSX0RJR0lUX0lOVEVSVkFMKSAqIEdTVF9NU0VDT05ELCBGQUxTRSwgVFJVRSwgNjY2LAorICAgICAgICAgIDk5OSwgOCwgMywgdGltZXN0YW1wICsgMjApOworICAgIH0KKworICAgIGZhaWxfdW5sZXNzIChidWZmZXJzID09IE5VTEwpOworICB9CisKKworICBmYWlsX3VubGVzcyAoZ3N0X3Rlc3RfY2xvY2tfcGVla19pZF9jb3VudCAoR1NUX1RFU1RfQ0xPQ0sgKHRlc3RjbG9jaykpID09IDApOworCisgIC8qIGNhcHMgY2hlY2sgKi8KKworICBleHBlY3RlZF9jYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtcnRwIiwKKyAgICAgICJlbmNvZGluZy1uYW1lIiwgR19UWVBFX1NUUklORywgIlRFTEVQSE9ORS1FVkVOVCIsCisgICAgICAibWVkaWEiLCBHX1RZUEVfU1RSSU5HLCAiYXVkaW8iLAorICAgICAgImNsb2NrLXJhdGUiLCBHX1RZUEVfSU5ULCAxMDAwLCAicGF5bG9hZCIsIEdfVFlQRV9JTlQsIDk5LAorICAgICAgInNlcW51bS1vZmZzZXQiLCBHX1RZUEVfVUlOVCwgMzMzLAorICAgICAgInRpbWVzdGFtcC1vZmZzZXQiLCBHX1RZUEVfVUlOVCwgNjY2LAorICAgICAgInNzcmMiLCBHX1RZUEVfVUlOVCwgOTk5LCAicHRpbWUiLCBHX1RZUEVfVUlOVCwgMjAsIE5VTEwpOworICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChzaW5rKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2Nhbl9pbnRlcnNlY3QgKGNhcHMsIGV4cGVjdGVkX2NhcHMpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoZXhwZWN0ZWRfY2Fwcyk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChkdG1mc3JjLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgY2hlY2tfbm9fZHRtZl9ldmVudF9tZXNzYWdlIChidXMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBhdWRpb19kdG1mc3JjX3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIFwiIiBHU1RfQVVESU9fTkUgKFMxNikgIlwiLCAiCisgICAgICAgICJyYXRlID0gKGludCkgODAwMywgIiAiY2hhbm5lbHMgPSAoaW50KSAxIikKKyAgICApOworc3RhdGljIHZvaWQKK3NldHVwX2R0bWZzcmMgKHZvaWQpCit7CisgIHRlc3RjbG9jayA9IGdzdF90ZXN0X2Nsb2NrX25ldyAoKTsKKyAgYnVzID0gZ3N0X2J1c19uZXcgKCk7CisKKyAgbWV0aG9kID0gMjsKKyAgZHRtZnNyYyA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgiZHRtZnNyYyIpOworICBzaW5rID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChkdG1mc3JjLCAmYXVkaW9fZHRtZnNyY19zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAoZHRtZnNyYywgYnVzKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9jbG9jayAoZHRtZnNyYywgdGVzdGNsb2NrKSk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzaW5rLCBUUlVFKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZHRtZnNyYywgR1NUX1NUQVRFX1BMQVlJTkcpID09CisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworfQorCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2R0bWZzcmNfbWluX2R1cmF0aW9uKQoreworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIEdzdENsb2NrSUQgaWQ7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAgPSAwOworICBHc3RDYXBzICpleHBlY3RlZF9jYXBzLCAqY2FwczsKKyAgZ3VpbnQgaW50ZXJ2YWw7CisKKyAgZ19vYmplY3RfZ2V0IChkdG1mc3JjLCAiaW50ZXJ2YWwiLCAmaW50ZXJ2YWwsIE5VTEwpOworICBmYWlsX3VubGVzcyAoaW50ZXJ2YWwgPT0gNTApOworCisgIC8qIE1pbmltdW0gZHVyYXRpb24gZHRtZiAqLworICBnc3RfdGVzdF9jbG9ja19zZXRfdGltZSAoR1NUX1RFU1RfQ0xPQ0sgKHRlc3RjbG9jayksIDApOworCisgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAoImR0bWYtZXZlbnQiLAorICAgICAgInR5cGUiLCBHX1RZUEVfSU5ULCAxLCAibnVtYmVyIiwgR19UWVBFX0lOVCwgMywKKyAgICAgICJtZXRob2QiLCBHX1RZUEVfSU5ULCAyLCAidm9sdW1lIiwgR19UWVBFX0lOVCwgOCwKKyAgICAgICJzdGFydCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAoc2luaywKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwKKyAgICAgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9jb3B5IChzKSkpKTsKKworICBnc3RfdGVzdF9jbG9ja193YWl0X2Zvcl9uZXh0X3BlbmRpbmdfaWQgKEdTVF9URVNUX0NMT0NLICh0ZXN0Y2xvY2spLCBOVUxMKTsKKyAgaWQgPSBnc3RfdGVzdF9jbG9ja19wcm9jZXNzX25leHRfY2xvY2tfaWQgKEdTVF9URVNUX0NMT0NLICh0ZXN0Y2xvY2spKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9jbG9ja19pZF9nZXRfdGltZSAoaWQpID09IDApOworICBnc3RfY2xvY2tfaWRfdW5yZWYgKGlkKTsKKworICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzLCAiZHRtZi1ldmVudC1wcm9jZXNzZWQiKTsKKyAgY2hlY2tfbWVzc2FnZV9zdHJ1Y3R1cmUgKHMpOworCisgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAoImR0bWYtZXZlbnQiLAorICAgICAgInR5cGUiLCBHX1RZUEVfSU5ULCAxLCAibWV0aG9kIiwgR19UWVBFX0lOVCwgMiwKKyAgICAgICJzdGFydCIsIEdfVFlQRV9CT09MRUFOLCBGQUxTRSwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKHNpbmssCisgICAgICAgICAgZ3N0X2V2ZW50X25ld19jdXN0b20gKEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU0sCisgICAgICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfY29weSAocykpKSk7CisKKyAgZm9yICh0aW1lc3RhbXAgPSBpbnRlcnZhbCAqIEdTVF9NU0VDT05EOworICAgICAgdGltZXN0YW1wIDwgKE1JTl9QVUxTRV9EVVJBVElPTiArIE1JTl9JTlRFUl9ESUdJVF9JTlRFUlZBTCkgKgorICAgICAgR1NUX01TRUNPTkQ7IHRpbWVzdGFtcCArPSBHU1RfTVNFQ09ORCAqIGludGVydmFsKSB7CisgICAgZ3N0X3Rlc3RfY2xvY2tfd2FpdF9mb3JfbmV4dF9wZW5kaW5nX2lkIChHU1RfVEVTVF9DTE9DSyAodGVzdGNsb2NrKSwgTlVMTCk7CisgICAgZ3N0X3Rlc3RfY2xvY2tfYWR2YW5jZV90aW1lIChHU1RfVEVTVF9DTE9DSyAodGVzdGNsb2NrKSwKKyAgICAgICAgaW50ZXJ2YWwgKiBHU1RfTVNFQ09ORCk7CisKKyAgICBpZCA9IGdzdF90ZXN0X2Nsb2NrX3Byb2Nlc3NfbmV4dF9jbG9ja19pZCAoR1NUX1RFU1RfQ0xPQ0sgKHRlc3RjbG9jaykpOworICAgIGZhaWxfdW5sZXNzIChnc3RfY2xvY2tfaWRfZ2V0X3RpbWUgKGlkKSA9PSB0aW1lc3RhbXApOworICAgIGdzdF9jbG9ja19pZF91bnJlZiAoaWQpOworICB9CisKKyAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAocywgImR0bWYtZXZlbnQtcHJvY2Vzc2VkIik7CisgIGNoZWNrX21lc3NhZ2Vfc3RydWN0dXJlIChzKTsKKworICBjaGVja19idWZmZXJzX2R1cmF0aW9uICgoTUlOX1BVTFNFX0RVUkFUSU9OICsgTUlOX0lOVEVSX0RJR0lUX0lOVEVSVkFMKSAqCisgICAgICBHU1RfTVNFQ09ORCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF90ZXN0X2Nsb2NrX3BlZWtfaWRfY291bnQgKEdTVF9URVNUX0NMT0NLICh0ZXN0Y2xvY2spKSA9PSAwKTsKKworICAvKiBjYXBzIGNoZWNrICovCisKKyAgZXhwZWN0ZWRfY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsCisgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgR1NUX0FVRElPX05FIChTMTYpLAorICAgICAgInJhdGUiLCBHX1RZUEVfSU5ULCA4MDAzLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoc2luayk7CisgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChjYXBzLCBleHBlY3RlZF9jYXBzKSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGV4cGVjdGVkX2NhcHMpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZHRtZnNyYywgR1NUX1NUQVRFX05VTEwpOworCisgIGNoZWNrX25vX2R0bWZfZXZlbnRfbWVzc2FnZSAoYnVzKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorZHRtZl9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJkdG1mIik7CisgIFRDYXNlICp0YzsKKworICB0YyA9IHRjYXNlX2NyZWF0ZSAoInJ0cGR0bWZkZXBheSIpOworICB0Y2FzZV9hZGRfdGVzdCAodGMsIHRlc3RfcnRwZHRtZmRlcGF5KTsKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Yyk7CisKKyAgdGMgPSB0Y2FzZV9jcmVhdGUgKCJydHBkdG1mc3JjIik7CisgIHRjYXNlX2FkZF9jaGVja2VkX2ZpeHR1cmUgKHRjLCBzZXR1cF9ydHBkdG1mc3JjLCB0ZWFyZG93bl9kdG1mc3JjKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjLCB0ZXN0X2R0bWZzcmNfaW52YWxpZF9ldmVudHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGMsIHRlc3RfcnRwZHRtZnNyY19taW5fZHVyYXRpb24pOworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjKTsKKworICB0YyA9IHRjYXNlX2NyZWF0ZSAoImR0bWZzcmMiKTsKKyAgdGNhc2VfYWRkX2NoZWNrZWRfZml4dHVyZSAodGMsIHNldHVwX2R0bWZzcmMsIHRlYXJkb3duX2R0bWZzcmMpOworICB0Y2FzZV9hZGRfdGVzdCAodGMsIHRlc3RfZHRtZnNyY19pbnZhbGlkX2V2ZW50cyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0YywgdGVzdF9kdG1mc3JjX21pbl9kdXJhdGlvbik7CisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGMpOworCisgIHJldHVybiBzOworfQorCisKK0dTVF9DSEVDS19NQUlOIChkdG1mKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2VxdWFsaXplci5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvZXF1YWxpemVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2OWJlYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2VxdWFsaXplci5jCkBAIC0wLDAgKzEsMzgwIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIGVxdWFsaXplci5jOiBVbml0IHRlc3QgZm9yIHRoZSBlcXVhbGl6ZXIgZWxlbWVudAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCisjaW5jbHVkZSA8bWF0aC5oPgorCisvKiBGb3IgZWFzZSBvZiBwcm9ncmFtbWluZyB3ZSB1c2UgZ2xvYmFscyB0byBrZWVwIHJlZnMgZm9yIG91ciBmbG9hdGluZworICogc3JjIGFuZCBzaW5rIHBhZHMgd2UgY3JlYXRlOyBvdGhlcndpc2Ugd2UgYWx3YXlzIGhhdmUgdG8gZG8gZ2V0X3BhZCwKKyAqIGdldF9wZWVyLCBhbmQgdGhlbiByZW1vdmUgcmVmZXJlbmNlcyBpbiBldmVyeSB0ZXN0IGZ1bmN0aW9uICovCitHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworCisjZGVmaW5lIEVRVUFMSVpFUl9DQVBTX1NUUklORyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiYXVkaW8veC1yYXcsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiR1NUX0FVRElPX05FIChGNjQpICIsICIgICBcCisgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiICAgICAgICAgICAgIFwKKyAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJyYXRlID0gKGludCkgNDgwMDAiCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKEY2NCkgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAicmF0ZSA9IChpbnQpIDQ4MDAwIikKKyAgICApOworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoRjY0KSAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiICJyYXRlID0gKGludCkgNDgwMDAiKQorICAgICk7CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX2VxdWFsaXplciAodm9pZCkKK3sKKyAgR3N0RWxlbWVudCAqZXF1YWxpemVyOworCisgIEdTVF9ERUJVRyAoInNldHVwX2VxdWFsaXplciIpOworICBlcXVhbGl6ZXIgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoImVxdWFsaXplci1uYmFuZHMiKTsKKyAgbXlzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAoZXF1YWxpemVyLCAmc3JjdGVtcGxhdGUpOworICBteXNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKGVxdWFsaXplciwgJnNpbmt0ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgcmV0dXJuIGVxdWFsaXplcjsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfZXF1YWxpemVyIChHc3RFbGVtZW50ICogZXF1YWxpemVyKQoreworICBHU1RfREVCVUcgKCJjbGVhbnVwX2VxdWFsaXplciIpOworCisgIGdfbGlzdF9mb3JlYWNoIChidWZmZXJzLCAoR0Z1bmMpIGdzdF9taW5pX29iamVjdF91bnJlZiwgTlVMTCk7CisgIGdfbGlzdF9mcmVlIChidWZmZXJzKTsKKyAgYnVmZmVycyA9IE5VTEw7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAoZXF1YWxpemVyKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChlcXVhbGl6ZXIpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAoZXF1YWxpemVyKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZXF1YWxpemVyXzViYW5kc19wYXNzdGhyb3VnaCkKK3sKKyAgR3N0RWxlbWVudCAqZXF1YWxpemVyOworICBHc3RCdWZmZXIgKmluYnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBlcXVhbGl6ZXIgPSBzZXR1cF9lcXVhbGl6ZXIgKCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGVxdWFsaXplciksICJudW0tYmFuZHMiLCA1LCBOVUxMKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfY2hpbGRfcHJveHlfZ2V0X2NoaWxkcmVuX2NvdW50IChHU1RfQ0hJTERfUFJPWFkKKyAgICAgICAgICAoZXF1YWxpemVyKSksIDUpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVxdWFsaXplciwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMDI0ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgaW5baV0gPSBnX3JhbmRvbV9kb3VibGVfcmFuZ2UgKC0xLjAsIDEuMCk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEVRVUFMSVpFUl9DQVBTX1NUUklORyk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBlcXVhbGl6ZXIsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID09IDEpOworCisgIGdzdF9idWZmZXJfbWFwIChHU1RfQlVGRkVSIChidWZmZXJzLT5kYXRhKSwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfZmxvYXQgKGluW2ldLCByZXNbaV0pOworICBnc3RfYnVmZmVyX3VubWFwIChHU1RfQlVGRkVSIChidWZmZXJzLT5kYXRhKSwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2VxdWFsaXplciAoZXF1YWxpemVyKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9lcXVhbGl6ZXJfNWJhbmRzX21pbnVzXzI0KQoreworICBHc3RFbGVtZW50ICplcXVhbGl6ZXI7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXNfaW4sIHJtc19vdXQ7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgZXF1YWxpemVyID0gc2V0dXBfZXF1YWxpemVyICgpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChlcXVhbGl6ZXIpLCAibnVtLWJhbmRzIiwgNSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2NoaWxkX3Byb3h5X2dldF9jaGlsZHJlbl9jb3VudCAoR1NUX0NISUxEX1BST1hZCisgICAgICAgICAgKGVxdWFsaXplcikpLCA1KTsKKworICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgR09iamVjdCAqYmFuZCA9CisgICAgICAgIGdzdF9jaGlsZF9wcm94eV9nZXRfY2hpbGRfYnlfaW5kZXggKEdTVF9DSElMRF9QUk9YWSAoZXF1YWxpemVyKSwgaSk7CisgICAgZmFpbF91bmxlc3MgKGJhbmQgIT0gTlVMTCk7CisKKyAgICBnX29iamVjdF9zZXQgKGJhbmQsICJnYWluIiwgLTI0LjAsIE5VTEwpOworICAgIGdfb2JqZWN0X3VucmVmIChiYW5kKTsKKyAgfQorCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVxdWFsaXplciwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMDI0ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgaW5baV0gPSBnX3JhbmRvbV9kb3VibGVfcmFuZ2UgKC0xLjAsIDEuMCk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBybXNfaW4gPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgcm1zX2luICs9IGluW2ldICogaW5baV07CisgIHJtc19pbiA9IHNxcnQgKHJtc19pbiAvIDEwMjQpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoRVFVQUxJWkVSX0NBUFNfU1RSSU5HKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGVxdWFsaXplciwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPT0gMSk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKEdTVF9CVUZGRVIgKGJ1ZmZlcnMtPmRhdGEpLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKworICBybXNfb3V0ID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIHJtc19vdXQgKz0gcmVzW2ldICogcmVzW2ldOworICBybXNfb3V0ID0gc3FydCAocm1zX291dCAvIDEwMjQpOworICBnc3RfYnVmZmVyX3VubWFwIChHU1RfQlVGRkVSIChidWZmZXJzLT5kYXRhKSwgJm1hcCk7CisKKyAgZmFpbF91bmxlc3MgKHJtc19pbiA+IHJtc19vdXQpOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9lcXVhbGl6ZXIgKGVxdWFsaXplcik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZXF1YWxpemVyXzViYW5kc19wbHVzXzEyKQoreworICBHc3RFbGVtZW50ICplcXVhbGl6ZXI7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXNfaW4sIHJtc19vdXQ7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgZXF1YWxpemVyID0gc2V0dXBfZXF1YWxpemVyICgpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChlcXVhbGl6ZXIpLCAibnVtLWJhbmRzIiwgNSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2NoaWxkX3Byb3h5X2dldF9jaGlsZHJlbl9jb3VudCAoR1NUX0NISUxEX1BST1hZCisgICAgICAgICAgKGVxdWFsaXplcikpLCA1KTsKKworICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgR09iamVjdCAqYmFuZCA9CisgICAgICAgIGdzdF9jaGlsZF9wcm94eV9nZXRfY2hpbGRfYnlfaW5kZXggKEdTVF9DSElMRF9QUk9YWSAoZXF1YWxpemVyKSwgaSk7CisgICAgZmFpbF91bmxlc3MgKGJhbmQgIT0gTlVMTCk7CisKKyAgICBnX29iamVjdF9zZXQgKGJhbmQsICJnYWluIiwgMTIuMCwgTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKGJhbmQpOworICB9CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZXF1YWxpemVyLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEwMjQgKiBzaXplb2YgKGdkb3VibGUpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBpbltpXSA9IGdfcmFuZG9tX2RvdWJsZV9yYW5nZSAoLTEuMCwgMS4wKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIHJtc19pbiA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBybXNfaW4gKz0gaW5baV0gKiBpbltpXTsKKyAgcm1zX2luID0gc3FydCAocm1zX2luIC8gMTAyNCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChFUVVBTElaRVJfQ0FQU19TVFJJTkcpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgZXF1YWxpemVyLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKSk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA9PSAxKTsKKworICBnc3RfYnVmZmVyX21hcCAoR1NUX0JVRkZFUiAoYnVmZmVycy0+ZGF0YSksICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworCisgIHJtc19vdXQgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgcm1zX291dCArPSByZXNbaV0gKiByZXNbaV07CisgIHJtc19vdXQgPSBzcXJ0IChybXNfb3V0IC8gMTAyNCk7CisgIGdzdF9idWZmZXJfdW5tYXAgKEdTVF9CVUZGRVIgKGJ1ZmZlcnMtPmRhdGEpLCAmbWFwKTsKKworICBmYWlsX3VubGVzcyAocm1zX2luIDwgcm1zX291dCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2VxdWFsaXplciAoZXF1YWxpemVyKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9lcXVhbGl6ZXJfYmFuZF9udW1iZXJfY2hhbmdpbmcpCit7CisgIEdzdEVsZW1lbnQgKmVxdWFsaXplcjsKKyAgZ2ludCBpOworCisgIGVxdWFsaXplciA9IHNldHVwX2VxdWFsaXplciAoKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChlcXVhbGl6ZXIpLCAibnVtLWJhbmRzIiwgNSwgTlVMTCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9jaGlsZF9wcm94eV9nZXRfY2hpbGRyZW5fY291bnQgKEdTVF9DSElMRF9QUk9YWQorICAgICAgICAgIChlcXVhbGl6ZXIpKSwgNSk7CisKKyAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworICAgIEdPYmplY3QgKmJhbmQ7CisKKyAgICBiYW5kID0gZ3N0X2NoaWxkX3Byb3h5X2dldF9jaGlsZF9ieV9pbmRleCAoR1NUX0NISUxEX1BST1hZIChlcXVhbGl6ZXIpLCBpKTsKKyAgICBmYWlsX3VubGVzcyAoYmFuZCAhPSBOVUxMKTsKKyAgICBnX29iamVjdF91bnJlZiAoYmFuZCk7CisgIH0KKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChlcXVhbGl6ZXIpLCAibnVtLWJhbmRzIiwgMTAsIE5VTEwpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfY2hpbGRfcHJveHlfZ2V0X2NoaWxkcmVuX2NvdW50IChHU1RfQ0hJTERfUFJPWFkKKyAgICAgICAgICAoZXF1YWxpemVyKSksIDEwKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIEdPYmplY3QgKmJhbmQ7CisKKyAgICBiYW5kID0gZ3N0X2NoaWxkX3Byb3h5X2dldF9jaGlsZF9ieV9pbmRleCAoR1NUX0NISUxEX1BST1hZIChlcXVhbGl6ZXIpLCBpKTsKKyAgICBmYWlsX3VubGVzcyAoYmFuZCAhPSBOVUxMKTsKKyAgICBnX29iamVjdF91bnJlZiAoYmFuZCk7CisgIH0KKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfZXF1YWxpemVyIChlcXVhbGl6ZXIpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2VxdWFsaXplcl9wcmVzZXRzKQoreworICBHc3RFbGVtZW50ICplcTEsICplcTI7CisgIGdpbnQgdHlwZTsKKyAgZ2RvdWJsZSBnYWluLCBmcmVxOworCisgIGVxMSA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgiZXF1YWxpemVyLW5iYW5kcyIpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChlcTEpLCAibnVtLWJhbmRzIiwgMywgTlVMTCk7CisKKyAgLyogc2V0IHByb3BlcnRpZXMgdG8gbm9uLWRlZmF1bHRzICovCisgIGdzdF9jaGlsZF9wcm94eV9zZXQgKChHc3RDaGlsZFByb3h5ICopIGVxMSwKKyAgICAgICJiYW5kMDo6dHlwZSIsIDAsICJiYW5kMDo6Z2FpbiIsIC0zLjAsICJiYW5kMDo6ZnJlcSIsIDEwMC4wLAorICAgICAgImJhbmQxOjp0eXBlIiwgMSwgImJhbmQxOjpnYWluIiwgKzMuMCwgImJhbmQxOjpmcmVxIiwgMTAwMC4wLAorICAgICAgImJhbmQyOjp0eXBlIiwgMiwgImJhbmQyOjpnYWluIiwgKzkuMCwgImJhbmQyOjpmcmVxIiwgMTAwMDAuMCwgTlVMTCk7CisKKyAgLyogc2F2ZSBwcmVzZXQgKi8KKyAgZ3N0X3ByZXNldF9zYXZlX3ByZXNldCAoKEdzdFByZXNldCAqKSBlcTEsICJfdGVzdHByZXNldF8iKTsKKyAgR1NUX0lORk9fT0JKRUNUIChlcTEsICJQcmVzZXQgc2F2ZWQiKTsKKworICBlcTIgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoImVxdWFsaXplci1uYmFuZHMiKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZXEyKSwgIm51bS1iYW5kcyIsIDMsIE5VTEwpOworCisgIC8qIGxvYWQgcHJlc2V0ICovCisgIGdzdF9wcmVzZXRfbG9hZF9wcmVzZXQgKChHc3RQcmVzZXQgKikgZXEyLCAiX3Rlc3RwcmVzZXRfIik7CisgIEdTVF9JTkZPX09CSkVDVCAoZXExLCAiUHJlc2V0IGxvYWRlZCIpOworCisgIC8qIGNvbXBhcmUgcHJvcGVydGllcyAqLworICBnc3RfY2hpbGRfcHJveHlfZ2V0ICgoR3N0Q2hpbGRQcm94eSAqKSBlcTIsCisgICAgICAiYmFuZDA6OnR5cGUiLCAmdHlwZSwgImJhbmQwOjpnYWluIiwgJmdhaW4sICJiYW5kMDo6ZnJlcSIsICZmcmVxLCBOVUxMKTsKKyAgY2tfYXNzZXJ0X2ludF9lcSAodHlwZSwgMCk7CisgIGZhaWxfdW5sZXNzIChnYWluID09IC0zLjAsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZnJlcSA9PSAxMDAuMCwgTlVMTCk7CisgIGdzdF9jaGlsZF9wcm94eV9nZXQgKChHc3RDaGlsZFByb3h5ICopIGVxMiwKKyAgICAgICJiYW5kMTo6dHlwZSIsICZ0eXBlLCAiYmFuZDE6OmdhaW4iLCAmZ2FpbiwgImJhbmQxOjpmcmVxIiwgJmZyZXEsIE5VTEwpOworICBja19hc3NlcnRfaW50X2VxICh0eXBlLCAxKTsKKyAgZmFpbF91bmxlc3MgKGdhaW4gPT0gKzMuMCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChmcmVxID09IDEwMDAuMCwgTlVMTCk7CisgIGdzdF9jaGlsZF9wcm94eV9nZXQgKChHc3RDaGlsZFByb3h5ICopIGVxMiwKKyAgICAgICJiYW5kMjo6dHlwZSIsICZ0eXBlLCAiYmFuZDI6OmdhaW4iLCAmZ2FpbiwgImJhbmQyOjpmcmVxIiwgJmZyZXEsIE5VTEwpOworICBja19hc3NlcnRfaW50X2VxICh0eXBlLCAyKTsKKyAgZmFpbF91bmxlc3MgKGdhaW4gPT0gKzkuMCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChmcmVxID09IDEwMDAwLjAsIE5VTEwpOworCisgIGdzdF9wcmVzZXRfZGVsZXRlX3ByZXNldCAoKEdzdFByZXNldCAqKSBlcTEsICJfdGVzdHByZXNldF8iKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGVxMSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChlcTIpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworc3RhdGljIFN1aXRlICoKK2VxdWFsaXplcl9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJlcXVhbGl6ZXIiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZXF1YWxpemVyXzViYW5kc19wYXNzdGhyb3VnaCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9lcXVhbGl6ZXJfNWJhbmRzX21pbnVzXzI0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2VxdWFsaXplcl81YmFuZHNfcGx1c18xMik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9lcXVhbGl6ZXJfYmFuZF9udW1iZXJfY2hhbmdpbmcpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZXF1YWxpemVyX3ByZXNldHMpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoZXF1YWxpemVyKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsYWNwYXJzZS5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvZmxhY3BhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZiNmMyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsYWNwYXJzZS5jCkBAIC0wLDAgKzEsMjg1IEBACisvKgorICogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciBmbGFjcGFyc2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdDogU3RlZmFuIEtvc3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSAicGFyc2VyLmgiCisKKyNkZWZpbmUgU1JDX0NBUFNfVE1QTCAgImF1ZGlvL3gtZmxhYywgZnJhbWVkPShib29sZWFuKWZhbHNlIgorI2RlZmluZSBTSU5LX0NBUFNfVE1QTCAgImF1ZGlvL3gtZmxhYywgZnJhbWVkPShib29sZWFuKXRydWUiCisKK0dzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoU0lOS19DQVBTX1RNUEwpCisgICAgKTsKKworR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChTUkNfQ0FQU19UTVBMKQorICAgICk7CisKKy8qIHNvbWUgZGF0YSAqLworc3RhdGljIGd1aW50OCBzdHJlYW1pbmZvX2hlYWRlcltdID0geworICAweDdmLCAweDQ2LCAweDRjLCAweDQxLCAweDQzLCAweDAxLCAweDAwLCAweDAwLAorICAweDAyLCAweDY2LCAweDRjLCAweDYxLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAorICAweDIyLCAweDEyLCAweDAwLCAweDEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDBhLCAweGM0LCAweDQwLCAweGYwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgZ3VpbnQ4IGNvbW1lbnRfaGVhZGVyW10gPSB7CisgIDB4ODQsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK3N0YXRpYyBndWludDggZmxhY19mcmFtZVtdID0geworICAweGZmLCAweGY4LCAweGE5LCAweDA4LCAweDAwLCAweDUwLCAweDE4LCAweDA2LAorICAweDZhLCAweDBjLCAweGNlLCAweDEzLCAweDI0LCAweDE5LCAweDY4LCAweDAwLAorICAweDQ2LCAweDIzLCAweDA4LCAweGNhLCAweGNiLCAweDU4LCAweDljLCAweDI2LAorICAweDkyLCAweDMwLCAweGE2LCAweDI5LCAweDhhLCAweGNhLCAweGQxLCAweDE4LAorICAweGFlLCAweDI2LCAweDVjLCAweDkwLCAweDYwLCAweGJmLCAweDExLCAweGFkLAorICAweDQzLCAweDAyLCAweDA2LCAweDI2LCAweGJkLCAweDM1LCAweGRkLCAweGEzLAorICAweDExLCAweGE2LCAweDRkLCAweDE4LCAweDhjLCAweDlhLCAweGU0LCAweDYyLAorICAweGQ5LCAweDIzLCAweDExLCAweDhiLCAweGNiLCAweDU2LCAweDU1LCAweDQ1LAorICAweGMyLCAweDE4LCAweDU2LCAweGEyLCAweGUyLCAweGUxLCAweDE4LCAweDk5LAorICAweDU0LCAweDk4LCAweDQ2LCAweDRkLCAweDA4LCAweDcwLCAweDlhLCAweDY0LAorICAweGM0LCAweDE4LCAweDRmLCAweDI3LCAweDY0LCAweDMxLCAweDY2LCAweDI3LAorICAweDc5LCAweDE5LCAweDNjLCAweDhjLCAweDhjLCAweGEzLCAweDQ0LCAweDE4LAorICAweDIzLCAweGQyLCAweDZiLCAweDhiLCAweDY0LCAweDhjLCAweDIxLCAweDg0LAorICAweGQ2LCAweDIzLCAweDEzLCAweDEzLCAweDJkLCAweDQ0LCAweGNhLCAweDVhLAorICAweDIzLCAweDA5LCAweDkzLCAweDI1LCAweDE4LCAweDEwLCAweDYxLCAweDM4LAorICAweGI0LCAweDYwLCAweDhmLCAweDJjLCAweDhkLCAweDI2LCAweGI0LCAweGM5LAorICAweGQ5LCAweDE5LCAweDE5LCAweDM0LCAweGQ3LCAweDMxLCAweDA2LCAweDEwLAorICAweGM0LCAweDMwLCAweDgzLCAweDE3LCAweGUyLCAweDBjLCAweDJjLCAweGM0LAorICAweGM4LCAweGM5LCAweDNjLCAweDVlLCAweDkzLCAweDExLCAweDhhLCAweDYyLAorICAweDY0LCAweDhjLCAweDI2LCAweDIzLCAweDIyLCAweDMwLCAweDlhLCAweDU4LAorICAweDg2LCAweDA0LCAweDE4LCAweDRjLCAweGFiLCAweDJiLCAweDI2LCAweDVjLAorICAweDQ2LCAweDg4LCAweGNiLCAweGIxLCAweDBkLCAweDI2LCAweGJiLCAweDVlLAorICAweDhjLCAweGE3LCAweDY0LCAweDMxLCAweDNkLCAweDMxLCAweDA2LCAweDI2LAorICAweDQzLCAweDE3LCAweGEzLCAweDA4LCAweDYxLCAweDA2LCAweDE3LCAweGM0LAorICAweDYyLCAweGVjLCAweDRkLCAweDRiLCAweDJlLCAweDJkLCAweDRhLCAweDk0LAorICAweGE0LCAweGMyLCAweDMxLCAweDRjLCAweDRjLCAweDIwLCAweGMwLCAweDgzLAorICAweDE0LCAweDhjLCAweDI3LCAweDhiLCAweDMxLCAweDIzLCAweDJmLCAweDIzLAorICAweDExLCAweDkxLCAweDk0LCAweDY1LCAweDFhLCAweDIwLCAweGMyLCAweDE4LAorICAweDg2LCAweDUxLCAweDg4LCAweDYyLCAweDdjLCAweDQzLCAweDJlLCAweGEzLAorICAweDA0LCAweDE4LCAweDhjLCAweDIwLCAweGMyLCAweGY1LCAweGFhLCAweDk0LAorICAweGMyLCAweDMxLCAweDMyLCAweGQyLCAweGIyLCAweGEyLCAweDMwLCAweGJhLAorICAweDEwLCAweGMyLCAweGI1LCAweDg5LCAweGE1LCAweDE4LCAweDEwLCAweDYyLAorICAweDlhLCAweDEwLCAweDYxLCAweDE5LCAweDcyLCAweDcxLCAweDFhLCAweGI5LAorICAweDBjLCAweDIzLCAweDQ2LCAweDEwLCAweDYyLCAweDc4LCAweDgxLCAweDgyLAorICAweDNkLCAweDc1LCAweGVhLCAweDZiLCAweDUxLCAweDhiLCAweDYxLCAweDA2LAorICAweDA4LCAweDYyLCAweDMyLCAweDVlLCAweDg0LCAweDE4LCAweDI3LCAweDI1LAorICAweGMyLCAweDZhLCAweDRiLCAweDUxLCAweDMxLCAweDM0LCAweDVlLCAweDI5LAorICAweGExLCAweDNjLCAweDRkLCAweDI2LCAweDIzLCAweDEwLCAweGMyLCAweDZiLAorICAweGIxLCAweDBkLCAweDExLCAweGFlLCAweDQ2LCAweDg4LCAweDMxLCAweDM1LAorICAweGIxLCAweDA2LCAweDA4LCAweDc5LCAweDdlLCAweDRmLCAweDUzLCAweDIzLAorICAweDI5LCAweGE0LCAweDMwLCAweDIwLCAweDMwLCAweDIzLCAweDVhLCAweGIyLAorICAweGM4LCAweDYwLCAweDljLCAweDkzLCAweDEzLCAweDE3LCAweDkyLCAweDk4LAorICAweDQ2LCAweDEzLCAweDU0LCAweDUzLCAweDA4LCAweGNiLCAweDEzLCAweGExLAorICAweDFhLCAweDg5LCAweGU1LCAweDQ2LCAweDA4LCAweDE4LCAweDEwLCAweDMwLAorICAweDlkLCAweDY4LCAweGMyLCAweDFjLCAweDQ2LCAweDQ2LCAweGFlLCAweDYyLAorICAweDFhLCAweDQ2LCAweDRlLCAweDRkLCAweDM0LCAweDhjLCAweGJkLCAweDI2LAorICAweGMwLCAweDQwLCAweDYyLCAweGM5LCAweGE5LCAweDMxLCAweDc0LCAweGE4LAorICAweDk5LCAweDUyLCAweGIwLCAweDhjLCAweGE5LCAweDI5LCAweDg0LCAweDYxLAorICAweDE5LCAweDU0LCAweDQzLCAweDAyLCAweDA2LCAweDA0LCAweDMyLCAweGU1LAorICAweDE4LCAweDIxLCAweDkxLCAweDhiLCAweGYyLCAweGNjLCAweDEwLCAweDMwLAorICAweDhlLCAweDIzLCAweGM0LCAweDc2LCAweDQzLCAweDA4LCAweDMwLCAweDgzLAorICAweDA4LCAweDYyLCAweDZjLCAweDRlLCAweGUyLCAweDM1LCAweDk2LCAweGQwLAorICAweDhlLCAweDg5LCAweDk3LCAweDQyLCAweDE4LCAweDkxLCAweDg0LCAweDYxLAorICAweDNjLCAweDI2LCAweGE1LCAweDJjLCAweDRlLCAweDE3LCAweDk0LCAweGI4LAorICAweGI1LCAweGE0LCAweGNiLCAweDg4LCAweGM5LCAweDg0LCAweDE4LCAweGI5LAorICAweDg0LCAweDE5LCAweDIzLCAweDJkLCAweGE0LCAweDY0LCAweDYyLCAweDE4LAorICAweDg2LCAweDUzLCAweDkzLCAweGNiLCAweDMwLCAweDhmLCAweDJmLCAweDkzLAorICAweDU1LCAweGM0LCAweGQ3LCAweDA4LCAweDYyLCAweGI4LCAweDQ2LCAweDg0LAorICAweDY4LCAweGEzLCAweDAyLCAweGFmLCAweDMzCit9OworCitzdGF0aWMgZ3VpbnQ4IGdhcmJhZ2VfZnJhbWVbXSA9IHsKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZgorfTsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV9mbGFjX25vcm1hbCkKK3sKKyAgZ3N0X3BhcnNlcl90ZXN0X25vcm1hbCAoZmxhY19mcmFtZSwgc2l6ZW9mIChmbGFjX2ZyYW1lKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV9mbGFjX2RyYWluX3NpbmdsZSkKK3sKKyAgZ3N0X3BhcnNlcl90ZXN0X2RyYWluX3NpbmdsZSAoZmxhY19mcmFtZSwgc2l6ZW9mIChmbGFjX2ZyYW1lKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV9mbGFjX2RyYWluX2dhcmJhZ2UpCit7CisgIC8qIFdlIGFsd2F5cyBvdXRwdXQgdGhlIGFmdGVyIGZyYW1lIGdhcmJhZ2UgdG9vIGJlY2F1c2Ugd2UKKyAgICogaGF2ZSBubyB3YXkgb2YgZGV0ZWN0aW5nIGl0CisgICAqLworI2lmIDAKKyAgZ3N0X3BhcnNlcl90ZXN0X2RyYWluX2dhcmJhZ2UgKGZsYWNfZnJhbWUsIHNpemVvZiAoZmxhY19mcmFtZSksCisgICAgICBnYXJiYWdlX2ZyYW1lLCBzaXplb2YgKGdhcmJhZ2VfZnJhbWUpKTsKKyNlbmRpZgorICBndWludDggZnJhbWVbc2l6ZW9mIChmbGFjX2ZyYW1lKSArIHNpemVvZiAoZ2FyYmFnZV9mcmFtZSldOworCisgIG1lbWNweSAoZnJhbWUsIGZsYWNfZnJhbWUsIHNpemVvZiAoZmxhY19mcmFtZSkpOworICBtZW1jcHkgKGZyYW1lICsgc2l6ZW9mIChmbGFjX2ZyYW1lKSwgZ2FyYmFnZV9mcmFtZSwgc2l6ZW9mIChnYXJiYWdlX2ZyYW1lKSk7CisKKyAgZ3N0X3BhcnNlcl90ZXN0X2RyYWluX3NpbmdsZSAoZnJhbWUsIHNpemVvZiAoZnJhbWUpKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX2ZsYWNfc3BsaXQpCit7CisgIGdzdF9wYXJzZXJfdGVzdF9zcGxpdCAoZmxhY19mcmFtZSwgc2l6ZW9mIChmbGFjX2ZyYW1lKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV9mbGFjX3NraXBfZ2FyYmFnZSkKK3sKKyAgLyogV2UgYWx3YXlzIGluY2x1ZGUgdGhlIGdhcmJhZ2UgaW50byB0aGUgZnJhbWUgYmVjYXVzZQorICAgKiB3ZSBoYXZlIG5vIGVhc3kgd2F5IGZvciBmaW5kaW5nIHRoZSByZWFsIGVuZCBvZiB0aGUKKyAgICogZnJhbWUuIFRoZSBkZWNvZGVyIHdpbGwgbGF0ZXIgc2tpcCB0aGUgZ2FyYmFnZQorICAgKi8KKyNpZiAwCisgIGdzdF9wYXJzZXJfdGVzdF9za2lwX2dhcmJhZ2UgKGZsYWNfZnJhbWUsIHNpemVvZiAoZmxhY19mcmFtZSksCisgICAgICBnYXJiYWdlX2ZyYW1lLCBzaXplb2YgKGdhcmJhZ2VfZnJhbWUpKTsKKyNlbmRpZgorICBndWludDggZnJhbWVbc2l6ZW9mIChmbGFjX2ZyYW1lKSArIHNpemVvZiAoZ2FyYmFnZV9mcmFtZSldOworCisgIG1lbWNweSAoZnJhbWUsIGZsYWNfZnJhbWUsIHNpemVvZiAoZmxhY19mcmFtZSkpOworICBtZW1jcHkgKGZyYW1lICsgc2l6ZW9mIChmbGFjX2ZyYW1lKSwgZ2FyYmFnZV9mcmFtZSwgc2l6ZW9mIChnYXJiYWdlX2ZyYW1lKSk7CisKKyAgZ3N0X3BhcnNlcl90ZXN0X25vcm1hbCAoZnJhbWUsIHNpemVvZiAoZnJhbWUpKTsKK30KKworR1NUX0VORF9URVNUOworCisKKyNkZWZpbmUgc3RydWN0dXJlX2dldF9pbnQocyxmKSBcCisgICAgKGdfdmFsdWVfZ2V0X2ludChnc3Rfc3RydWN0dXJlX2dldF92YWx1ZShzLGYpKSkKKyNkZWZpbmUgZmFpbF91bmxlc3Nfc3RydWN0dXJlX2ZpZWxkX2ludF9lcXVhbHMocyxmaWVsZCxudW0pIFwKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChzdHJ1Y3R1cmVfZ2V0X2ludChzLGZpZWxkKSwgbnVtKQorLyoKKyAqIFRlc3QgaWYgdGhlIHBhcnNlciBoYW5kbGVzIHJhdyBzdHJlYW0gYW5kIGNvZGVjX2RhdGEgaW5mbyBwcm9wZXJseS4KKyAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2VfZmxhY19kZXRlY3Rfc3RyZWFtKQoreworICBHc3RDYXBzICpjYXBzOworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIGNvbnN0IEdWYWx1ZSAqc3RyZWFtaGVhZGVyOworICBHQXJyYXkgKmJ1ZmFycjsKKyAgZ2ludCBpOworCisgIC8qIFB1c2ggcmFuZG9tIGRhdGEuIEl0IHNob3VsZCBnZXQgdGhyb3VnaCBzaW5jZSB0aGUgcGFyc2VyIHNob3VsZCBiZQorICAgKiBpbml0aWFsaXplZCBiZWNhdXNlIGl0IGdvdCBjb2RlY19kYXRhIGluIHRoZSBjYXBzICovCisgIGNhcHMgPSBnc3RfcGFyc2VyX3Rlc3RfZ2V0X291dHB1dF9jYXBzIChmbGFjX2ZyYW1lLCBzaXplb2YgKGZsYWNfZnJhbWUpLAorICAgICAgU1JDX0NBUFNfVE1QTCk7CisgIGZhaWxfdW5sZXNzIChjYXBzICE9IE5VTEwpOworCisgIC8qIENoZWNrIHRoYXQgdGhlIG5lZ290aWF0ZWQgY2FwcyBhcmUgYXMgZXhwZWN0ZWQgKi8KKyAgLyogV2hlbiBjb2RlY19kYXRhIGlzIHByZXNlbnQsIHBhcnNlciBhc3N1bWVzIHRoYXQgZGF0YSBpcyB2ZXJzaW9uIDQgKi8KKyAgR1NUX0xPRyAoImZsYWMgb3V0cHV0IGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgImF1ZGlvL3gtZmxhYyIpKTsKKyAgZmFpbF91bmxlc3Nfc3RydWN0dXJlX2ZpZWxkX2ludF9lcXVhbHMgKHMsICJjaGFubmVscyIsIDEpOworICBmYWlsX3VubGVzc19zdHJ1Y3R1cmVfZmllbGRfaW50X2VxdWFscyAocywgInJhdGUiLCA0NDEwMCk7CisgIGZhaWxfdW5sZXNzIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgInN0cmVhbWhlYWRlciIpKTsKKyAgc3RyZWFtaGVhZGVyID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJzdHJlYW1oZWFkZXIiKTsKKyAgZmFpbF91bmxlc3MgKEdfVkFMVUVfVFlQRSAoc3RyZWFtaGVhZGVyKSA9PSBHU1RfVFlQRV9BUlJBWSk7CisgIGJ1ZmFyciA9IGdfdmFsdWVfcGVla19wb2ludGVyIChzdHJlYW1oZWFkZXIpOworICBmYWlsX3VubGVzcyAoYnVmYXJyLT5sZW4gPT0gMik7CisgIGZvciAoaSA9IDA7IGkgPCBidWZhcnItPmxlbjsgaSsrKSB7CisgICAgR3N0QnVmZmVyICpidWY7CisgICAgR1ZhbHVlICpidWZ2YWwgPSAmZ19hcnJheV9pbmRleCAoYnVmYXJyLCBHVmFsdWUsIGkpOworCisgICAgZmFpbF91bmxlc3MgKEdfVkFMVUVfVFlQRSAoYnVmdmFsKSA9PSBHU1RfVFlQRV9CVUZGRVIpOworICAgIGJ1ZiA9IGdfdmFsdWVfcGVla19wb2ludGVyIChidWZ2YWwpOworICAgIGlmIChpID09IDApIHsKKyAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2dldF9zaXplIChidWYpID09IHNpemVvZiAoc3RyZWFtaW5mb19oZWFkZXIpKTsKKyAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoYnVmLCAwLCBzdHJlYW1pbmZvX2hlYWRlciwKKyAgICAgICAgICAgICAgc2l6ZW9mIChzdHJlYW1pbmZvX2hlYWRlcikpID09IDApOworICAgIH0gZWxzZSBpZiAoaSA9PSAxKSB7CisgICAgICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSA9PSBzaXplb2YgKGNvbW1lbnRfaGVhZGVyKSk7CisgICAgICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKGJ1ZiwgMCwgY29tbWVudF9oZWFkZXIsCisgICAgICAgICAgICAgIHNpemVvZiAoY29tbWVudF9oZWFkZXIpKSA9PSAwKTsKKyAgICB9CisgIH0KKworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK2ZsYWNwYXJzZV9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJmbGFjcGFyc2UiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisKKyAgLyogaW5pdCB0ZXN0IGNvbnRleHQgKi8KKyAgY3R4X2ZhY3RvcnkgPSAiZmxhY3BhcnNlIjsKKyAgY3R4X3NpbmtfdGVtcGxhdGUgPSAmc2lua3RlbXBsYXRlOworICBjdHhfc3JjX3RlbXBsYXRlID0gJnNyY3RlbXBsYXRlOworICBjdHhfZGlzY2FyZCA9IDM7CisgIGN0eF9oZWFkZXJzWzBdLmRhdGEgPSBzdHJlYW1pbmZvX2hlYWRlcjsKKyAgY3R4X2hlYWRlcnNbMF0uc2l6ZSA9IHNpemVvZiAoc3RyZWFtaW5mb19oZWFkZXIpOworICBjdHhfaGVhZGVyc1sxXS5kYXRhID0gY29tbWVudF9oZWFkZXI7CisgIGN0eF9oZWFkZXJzWzFdLnNpemUgPSBzaXplb2YgKGNvbW1lbnRfaGVhZGVyKTsKKworICAvKiBjdXN0b20gb2Zmc2V0cywgYW5kIHRzIGFsd2F5cyByZXBlYXRlZGx5IDAgKi8KKyAgY3R4X25vX21ldGFkYXRhID0gVFJVRTsKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9mbGFjX25vcm1hbCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9mbGFjX2RyYWluX3NpbmdsZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9mbGFjX2RyYWluX2dhcmJhZ2UpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2VfZmxhY19zcGxpdCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9mbGFjX3NraXBfZ2FyYmFnZSk7CisKKyAgLyogT3RoZXIgdGVzdHMgKi8KKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX2ZsYWNfZGV0ZWN0X3N0cmVhbSk7CisKKyAgcmV0dXJuIHM7Cit9CisKKworLyoKKyAqIFRPRE86CisgKiAgIC0gQm90aCBwdXNoLSBhbmQgcHVsbC1tb2RlcyBuZWVkIHRvIGJlIHRlc3RlZAorICogICAgICAqIFB1bGwtbW9kZSAmIEVPUworICovCitHU1RfQ0hFQ0tfTUFJTiAoZmxhY3BhcnNlKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsdmRlbXV4LmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9mbHZkZW11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OTU1YmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9mbHZkZW11eC5jCkBAIC0wLDAgKzEsNTQ0IEBACisvKiBHU3RyZWFtZXIgdW5pdCB0ZXN0cyBmb3IgZmx2ZGVtdXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSGF2YXJkIEdyYWZmICAgICAgICA8aGF2YXJkQHBleGlwLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGhhcm5lc3MuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorCitzdGF0aWMgdm9pZAorcGFkX2FkZGVkX2NiIChHc3RFbGVtZW50ICogZmx2ZGVtdXgsIEdzdFBhZCAqIHBhZCwgR3N0QmluICogcGlwZWxpbmUpCit7CisgIEdzdEVsZW1lbnQgKnNpbms7CisKKyAgc2luayA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKHBpcGVsaW5lLCAiZmFrZXNpbmsiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmsgKGZsdmRlbXV4LCBzaW5rKSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmspOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc2luaywgR1NUX1NUQVRFX1BBVVNFRCk7Cit9CisKK3N0YXRpYyBHc3RCdXNTeW5jUmVwbHkKK2Vycm9yX2NiIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtc2csIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgaWYgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRVJST1IpIHsKKyAgICBjb25zdCBnY2hhciAqZmlsZSA9IChjb25zdCBnY2hhciAqKSB1c2VyX2RhdGE7CisgICAgR0Vycm9yICplcnIgPSBOVUxMOworICAgIGdjaGFyICpkYmcgPSBOVUxMOworCisgICAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1zZywgJmVyciwgJmRiZyk7CisgICAgZ19lcnJvciAoIkVSUk9SIGZvciAlczogJXNcbiVzXG4iLCBmaWxlLCBlcnItPm1lc3NhZ2UsIGRiZyk7CisgIH0KKworICByZXR1cm4gR1NUX0JVU19QQVNTOworfQorCitzdGF0aWMgdm9pZAoraGFuZG9mZl9jYiAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEJ1ZmZlciAqIGJ1ZiwgR3N0UGFkICogcGFkLAorICAgIGdpbnQgKiBwX2NvdW50ZXIpCit7CisgICpwX2NvdW50ZXIgKz0gMTsKKyAgR1NUX0xPRyAoImNvdW50ZXIgPSAlZCIsICpwX2NvdW50ZXIpOworfQorCitzdGF0aWMgdm9pZAorcHJvY2Vzc19maWxlIChjb25zdCBnY2hhciAqIGZpbGUsIGdib29sZWFuIHB1c2hfbW9kZSwgZ2ludCByZXBlYXQsCisgICAgZ2ludCBudW1fYnVmZmVycykKK3sKKyAgR3N0RWxlbWVudCAqc3JjLCAqc2VwLCAqc2luaywgKmZsdmRlbXV4LCAqcGlwZWxpbmU7CisgIEdzdEJ1cyAqYnVzOworICBnY2hhciAqcGF0aDsKKyAgZ2ludCBjb3VudGVyOworCisgIHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIGZhaWxfdW5sZXNzIChwaXBlbGluZSAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSBwaXBlbGluZSEiKTsKKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChwaXBlbGluZSk7CisKKyAgLyoga2lkcywgZG9uJ3QgdXNlIGEgc3luYyBoYW5kbGVyIGZvciB0aGlzIGF0IGhvbWUsIHJlYWxseTsgd2UgZG8gYmVjYXVzZQorICAgKiB3ZSBqdXN0IHdhbnQgdG8gYWJvcnQgYW5kIG5vdGhpbmcgZWxzZSAqLworICBnc3RfYnVzX3NldF9zeW5jX2hhbmRsZXIgKGJ1cywgZXJyb3JfY2IsIChncG9pbnRlcikgZmlsZSwgTlVMTCk7CisKKyAgc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmlsZXNyYyIsICJmaWxlc3JjIik7CisgIGZhaWxfdW5sZXNzIChzcmMgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgJ2ZpbGVzcmMnIGVsZW1lbnQhIik7CisKKyAgaWYgKHB1c2hfbW9kZSkgeworICAgIHNlcCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInF1ZXVlIiwgInF1ZXVlIik7CisgICAgZmFpbF91bmxlc3MgKHNlcCAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSAncXVldWUnIGVsZW1lbnQiKTsKKyAgfSBlbHNlIHsKKyAgICBzZXAgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJpZGVudGl0eSIsICJpZGVudGl0eSIpOworICAgIGZhaWxfdW5sZXNzIChzZXAgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgJ2lkZW50aXR5JyBlbGVtZW50Iik7CisgIH0KKworICBmbHZkZW11eCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZsdmRlbXV4IiwgImZsdmRlbXV4Iik7CisgIGZhaWxfdW5sZXNzIChmbHZkZW11eCAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSAnZmx2ZGVtdXgnIGVsZW1lbnQhIik7CisKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgImZha2VzaW5rIik7CisgIGZhaWxfdW5sZXNzIChzaW5rICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlICdmYWtlc2luaycgZWxlbWVudCEiKTsKKworICBnX29iamVjdF9zZXQgKHNpbmssICJzaWduYWwtaGFuZG9mZnMiLCBUUlVFLCBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoc2luaywgImhhbmRvZmYiLCBHX0NBTExCQUNLIChoYW5kb2ZmX2NiKSwgJmNvdW50ZXIpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc3JjLCBzZXAsIGZsdmRlbXV4LCBzaW5rLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGluayAoc3JjLCBzZXApKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmsgKHNlcCwgZmx2ZGVtdXgpKTsKKworICAvKiBjYW4ndCBsaW5rIGZsdmRlbXV4IGFuZCBzaW5rIHlldCwgZG8gdGhhdCBsYXRlciAqLworICBnX3NpZ25hbF9jb25uZWN0IChmbHZkZW11eCwgInBhZC1hZGRlZCIsIEdfQ0FMTEJBQ0sgKHBhZF9hZGRlZF9jYiksIHBpcGVsaW5lKTsKKworICBwYXRoID0gZ19idWlsZF9maWxlbmFtZSAoR1NUX1RFU1RfRklMRVNfUEFUSCwgZmlsZSwgTlVMTCk7CisgIEdTVF9MT0cgKCJwcm9jZXNzaW5nIGZpbGUgJyVzJyIsIHBhdGgpOworICBnX29iamVjdF9zZXQgKHNyYywgImxvY2F0aW9uIiwgcGF0aCwgTlVMTCk7CisKKyAgZG8geworICAgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHN0YXRlX3JldDsKKyAgICBHc3RNZXNzYWdlICptc2c7CisKKyAgICBHU1RfTE9HICgicmVwZWF0PSVkIiwgcmVwZWF0KTsKKworICAgIGNvdW50ZXIgPSAwOworCisgICAgc3RhdGVfcmV0ID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BBVVNFRCk7CisgICAgZmFpbF91bmxlc3MgKHN0YXRlX3JldCAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgICAgaWYgKHN0YXRlX3JldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX0FTWU5DKSB7CisgICAgICBHU1RfTE9HICgid2FpdGluZyBmb3IgcGlwZWxpbmUgdG8gcmVhY2ggUEFVU0VEIHN0YXRlIik7CisgICAgICBzdGF0ZV9yZXQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKHBpcGVsaW5lLCBOVUxMLCBOVUxMLCAtMSk7CisgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChzdGF0ZV9yZXQsIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisgICAgfQorCisgICAgR1NUX0xPRyAoIlBBVVNFRCwgbGV0J3MgcmVhZCBhbGwgb2YgaXQiKTsKKworICAgIHN0YXRlX3JldCA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgICBmYWlsX3VubGVzcyAoc3RhdGVfcmV0ICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgICBtc2cgPSBnc3RfYnVzX3BvbGwgKGJ1cywgR1NUX01FU1NBR0VfRU9TLCAtMSk7CisgICAgZmFpbF91bmxlc3MgKG1zZyAhPSBOVUxMLCAiRXhwZWN0ZWQgRU9TIG1lc3NhZ2Ugb24gYnVzISAoJXMpIiwgZmlsZSk7CisKKyAgICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKworICAgIGlmIChudW1fYnVmZmVycyA+PSAwKSB7CisgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChjb3VudGVyLCBudW1fYnVmZmVycyk7CisgICAgfQorCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpLAorICAgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgICAgLS1yZXBlYXQ7CisgIH0gd2hpbGUgKHJlcGVhdCA+IDApOworCisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKworICBnX2ZyZWUgKHBhdGgpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9yZXVzZV9wdWxsKQoreworICBwcm9jZXNzX2ZpbGUgKCJwY20xNnNpbmUuZmx2IiwgRkFMU0UsIDMsIDEyOSk7CisgIGdzdF90YXNrX2NsZWFudXBfYWxsICgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3JldXNlX3B1c2gpCit7CisgIHByb2Nlc3NfZmlsZSAoInBjbTE2c2luZS5mbHYiLCBUUlVFLCAzLCAxMjkpOworICBnc3RfdGFza19jbGVhbnVwX2FsbCAoKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgR3N0QnVmZmVyICoKK2NyZWF0ZV9idWZmZXIgKGd1aW50OCAqIGRhdGEsIGdzaXplIHNpemUpCit7CisgIEdzdEJ1ZmZlciAqYnVmID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZF9mdWxsIChHU1RfTUVNT1JZX0ZMQUdfUkVBRE9OTFksCisgICAgICBkYXRhLCBzaXplLCAwLCBzaXplLCBOVUxMLCBOVUxMKTsKKyAgR1NUX0JVRkZFUl9QVFMgKGJ1ZikgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBHU1RfQlVGRkVSX0RUUyAoYnVmKSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSA9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkU7CisgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmKSA9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkU7CisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyB2b2lkCitmbHZkZW11eF9wYWRfYWRkZWQgKEdzdEVsZW1lbnQgKiBmbHZkZW11eCwgR3N0UGFkICogc3JjcGFkLCBHc3RIYXJuZXNzICogaCkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKyAgKHZvaWQpIGZsdmRlbXV4OworCisgIGNhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHNyY3BhZCk7CisgIGZhaWxfdW5sZXNzIChjYXBzICE9IE5VTEwpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9oYXJuZXNzX2FkZF9lbGVtZW50X3NyY19wYWQgKGgsIHNyY3BhZCk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3NwZWV4KQoreworICBndWludDggZmx2X2hlYWRlcjBbXSA9IHsKKyAgICAweDQ2LCAweDRjLCAweDU2LCAweDAxLCAweDA0LCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKyAgfTsKKworICBndWludDggZmx2X2hlYWRlcjFbXSA9IHsKKyAgICAweDEyLCAweDAwLCAweDAwLCAweDdjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MGEsIDB4NmYsIDB4NmUsCisgICAgMHg0ZCwgMHg2NSwgMHg3NCwgMHg2MSwgMHg0NCwgMHg2MSwgMHg3NCwgMHg2MSwKKyAgICAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDYxLAorICAgIDB4NzUsIDB4NjQsIDB4NjksIDB4NmYsIDB4NjMsIDB4NmYsIDB4NjQsIDB4NjUsCisgICAgMHg2MywgMHg2OSwgMHg2NCwgMHgwMCwgMHg0MCwgMHgyNiwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBmLCAweDZkLCAweDY1LAorICAgIDB4NzQsIDB4NjEsIDB4NjQsIDB4NjEsIDB4NzQsIDB4NjEsIDB4NjMsIDB4NzIsCisgICAgMHg2NSwgMHg2MSwgMHg3NCwgMHg2ZiwgMHg3MiwgMHgwMiwgMHgwMCwgMHgxMywKKyAgICAweDQ3LCAweDUzLCAweDc0LCAweDcyLCAweDY1LCAweDYxLCAweDZkLCAweDY1LAorICAgIDB4NzIsIDB4MjAsIDB4NDYsIDB4NGMsIDB4NTYsIDB4MjAsIDB4NmQsIDB4NzUsCisgICAgMHg3OCwgMHg2NSwgMHg3MiwgMHgwMCwgMHgwYywgMHg2MywgMHg3MiwgMHg2NSwKKyAgICAweDYxLCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDY0LCAweDYxLCAweDc0LAorICAgIDB4NjUsIDB4MDIsIDB4MDAsIDB4MTgsIDB4NTcsIDB4NjUsIDB4NjQsIDB4MjAsCisgICAgMHg1MywgMHg2NSwgMHg3MCwgMHgyMCwgMHgzMiwgMHgzMywgMHgyMCwgMHgzMSwKKyAgICAweDMwLCAweDNhLCAweDM0LCAweDM5LCAweDNhLCAweDM1LCAweDM2LCAweDIwLAorICAgIDB4MzIsIDB4MzAsIDB4MzEsIDB4MzUsIDB4MDAsIDB4MDAsIDB4MDksIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHg4NywKKyAgfTsKKworICBndWludDggc3BlZXhfaGVhZGVyMFtdID0geworICAgIDB4MDgsIDB4MDAsIDB4MDAsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMiwgMHg1MywgMHg3MCwgMHg2NSwgMHg2NSwKKyAgICAweDc4LCAweDIwLCAweDIwLCAweDIwLCAweDMxLCAweDJlLCAweDMyLCAweDcyLAorICAgIDB4NjMsIDB4MzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDUwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4ODAsIDB4M2UsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDQwLCAweDAxLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDVjLAorICB9OworCisgIGd1aW50OCBzcGVleF9oZWFkZXIxW10gPSB7CisgICAgMHgwOCwgMHgwMCwgMHgwMCwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweGIyLCAweDFmLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4NDUsIDB4NmUsIDB4NjMsIDB4NmYsIDB4NjQsIDB4NjUsIDB4NjQsIDB4MjAsCisgICAgMHg3NywgMHg2OSwgMHg3NCwgMHg2OCwgMHgyMCwgMHg0NywgMHg1MywgMHg3NCwKKyAgICAweDcyLCAweDY1LCAweDYxLCAweDZkLCAweDY1LCAweDcyLCAweDIwLCAweDUzLAorICAgIDB4NzAsIDB4NjUsIDB4NjUsIDB4NzgsIDB4NjUsIDB4NmUsIDB4NjMsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzNCwKKyAgfTsKKworICBndWludDggYnVmZmVyW10gPSB7CisgICAgMHgwOCwgMHgwMCwgMHgwMCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweGIyLCAweDM2LCAweDlkLCAweDFiLCAweDlhLAorICAgIDB4MjAsIDB4MDAsIDB4MDEsIDB4NjgsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsCisgICAgMHhlOCwgMHhlOCwgMHhlOCwgMHg4NCwgMHgwMCwgMHhiNCwgMHg3NCwgMHg3NCwKKyAgICAweDc0LCAweDc0LCAweDc0LCAweDc0LCAweDc0LCAweDQyLCAweDAwLCAweDVhLAorICAgIDB4M2EsIDB4M2EsIDB4M2EsIDB4M2EsIDB4M2EsIDB4M2EsIDB4M2EsIDB4MjEsCisgICAgMHgwMCwgMHgyZCwgMHgxZCwgMHgxZCwgMHgxZCwgMHgxZCwgMHgxZCwgMHgxZCwKKyAgICAweDFkLCAweDFiLCAweDNiLCAweDYwLCAweGFiLCAweGFiLCAweGFiLCAweGFiLAorICAgIDB4YWIsIDB4MGEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YjAsIDB4YWIsCisgICAgMHhhYiwgMHhhYiwgMHhhYiwgMHhhYiwgMHgwYSwgMHhiYSwgMHhiYSwgMHhiYSwKKyAgICAweGJhLCAweGI3LCAweDAwLCAweDAwLCAweDAwLCAweDUyLAorICB9OworCisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXdfd2l0aF9wYWRuYW1lcyAoImZsdmRlbXV4IiwgInNpbmsiLCBOVUxMKTsKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzX3N0ciAoaCwgInZpZGVvL3gtZmx2Iik7CisKKyAgZ19zaWduYWxfY29ubmVjdCAoaC0+ZWxlbWVudCwgInBhZC1hZGRlZCIsCisgICAgICBHX0NBTExCQUNLIChmbHZkZW11eF9wYWRfYWRkZWQpLCBoKTsKKworICBnc3RfaGFybmVzc19wdXNoIChoLCBjcmVhdGVfYnVmZmVyIChmbHZfaGVhZGVyMCwgc2l6ZW9mIChmbHZfaGVhZGVyMCkpKTsKKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgY3JlYXRlX2J1ZmZlciAoZmx2X2hlYWRlcjEsIHNpemVvZiAoZmx2X2hlYWRlcjEpKSk7CisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGNyZWF0ZV9idWZmZXIgKHNwZWV4X2hlYWRlcjAsIHNpemVvZiAoc3BlZXhfaGVhZGVyMCkpKTsKKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgY3JlYXRlX2J1ZmZlciAoc3BlZXhfaGVhZGVyMSwgc2l6ZW9mIChzcGVleF9oZWFkZXIxKSkpOworICBnc3RfaGFybmVzc19wdXNoIChoLCBjcmVhdGVfYnVmZmVyIChidWZmZXIsIHNpemVvZiAoYnVmZmVyKSkpOworCisgIHsKKyAgICBHc3RDYXBzICpjYXBzOworICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqczsKKyAgICBjb25zdCBHVmFsdWUgKnN0cmVhbWhlYWRlcjsKKyAgICBjb25zdCBHVmFsdWUgKmhlYWRlcjsKKyAgICBjb25zdCBHVmFsdWUgKnZvcmJpc2NvbW1lbnQ7CisgICAgR3N0QnVmZmVyICpidWY7CisgICAgR3N0VGFnTGlzdCAqbGlzdDsKKyAgICBnaW50IHJhdGU7CisgICAgZ2ludCBjaGFubmVsczsKKworICAgIGNhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKGgtPnNpbmtwYWQpOworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICAgIGZhaWxfdW5sZXNzIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiYXVkaW8veC1zcGVleCIpKTsKKworICAgIHN0cmVhbWhlYWRlciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAic3RyZWFtaGVhZGVyIik7CisgICAgZmFpbF91bmxlc3MgKHN0cmVhbWhlYWRlciAhPSBOVUxMKTsKKyAgICBmYWlsX3VubGVzcyAoR19WQUxVRV9IT0xEUyAoc3RyZWFtaGVhZGVyLCBHU1RfVFlQRV9BUlJBWSkpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDIsIGdzdF92YWx1ZV9hcnJheV9nZXRfc2l6ZSAoc3RyZWFtaGVhZGVyKSk7CisKKyAgICBoZWFkZXIgPSBnc3RfdmFsdWVfYXJyYXlfZ2V0X3ZhbHVlIChzdHJlYW1oZWFkZXIsIDApOworICAgIGZhaWxfdW5sZXNzIChoZWFkZXIgIT0gTlVMTCk7CisgICAgZmFpbF91bmxlc3MgKEdfVkFMVUVfSE9MRFMgKGhlYWRlciwgR1NUX1RZUEVfQlVGRkVSKSk7CisgICAgYnVmID0gZ3N0X3ZhbHVlX2dldF9idWZmZXIgKGhlYWRlcik7CisKKyAgICB2b3JiaXNjb21tZW50ID0gZ3N0X3ZhbHVlX2FycmF5X2dldF92YWx1ZSAoc3RyZWFtaGVhZGVyLCAxKTsKKyAgICBmYWlsX3VubGVzcyAoaGVhZGVyICE9IE5VTEwpOworICAgIGZhaWxfdW5sZXNzIChHX1ZBTFVFX0hPTERTIChoZWFkZXIsIEdTVF9UWVBFX0JVRkZFUikpOworICAgIGJ1ZiA9IGdzdF92YWx1ZV9nZXRfYnVmZmVyICh2b3JiaXNjb21tZW50KTsKKyAgICBsaXN0ID0gZ3N0X3RhZ19saXN0X2Zyb21fdm9yYmlzY29tbWVudF9idWZmZXIgKGJ1ZiwgTlVMTCwgMCwgTlVMTCk7CisgICAgZmFpbF91bmxlc3MgKGxpc3QgIT0gTlVMTCk7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmIChsaXN0KTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgInJhdGUiLCAmcmF0ZSk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMTYwMDAsIHJhdGUpOworCisgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzLCAiY2hhbm5lbHMiLCAmY2hhbm5lbHMpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDEsIGNoYW5uZWxzKTsKKworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgfQorCisgIC8qIHdlIHNob3VsZCBoYXZlIGdvdHRlbiAyeCBzcGVleC1oZWFkZXJzLCBhbmQgb25lIGVuY29kZWQgYnVmZmVyICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDMsIGdzdF9oYXJuZXNzX2J1ZmZlcnNfaW5fcXVldWUgKGgpKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9hYWMpCit7CisgIGd1aW50OCBmbHZfaGVhZGVyW10gPSB7CisgICAgMHg0NiwgMHg0YywgMHg1NiwgMHgwMSwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MTIsIDB4MDAsIDB4MDAsIDB4MmQsICAgICAvKiBzY3JpcHQgdGFnICovCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwKKyAgICAweDAwLCAweDBhLCAweDZmLCAweDZlLCAweDRkLCAweDY1LCAweDc0LCAweDYxLAorICAgIDB4NDQsIDB4NjEsIDB4NzQsIDB4NjEsIDB4MDMsIDB4MDAsIDB4MDYsIDB4NTMsCisgICAgMHg2NSwgMHg3MiwgMHg3NiwgMHg2NSwgMHg3MiwgMHgwMiwgMHgwMCwgMHgxMSwKKyAgICAweDUwLCAweDY1LCAweDc4LCAweDY5LCAweDcwLCAweDIwLCAweDUyLCAweDU0LAorICAgIDB4NGQsIDB4NTAsIDB4MjAsIDB4NTMsIDB4NjUsIDB4NzIsIDB4NzYsIDB4NjUsCisgICAgMHg3MiwgMHgwMCwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzOCwKKyAgfTsKKworICBndWludDggYWFjX2hlYWRlcltdID0geworICAgIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDQsICAgICAvKiBhdWRpbyB0YWcgKi8KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGFmLAorICAgIDB4MDAsIDB4MTMsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGYsCisgIH07CisKKyAgZ3VpbnQ4IGFhY19idWZmZXJbXSA9IHsKKyAgICAweDA4LCAweDAwLCAweDAxLCAweDU3LCAgICAgLyogYXVkaW8gdGFnICovCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhZiwKKyAgICAweDAxLCAweDIxLCAweDIxLCAweDQ1LCAweDAwLCAweDE0LCAweDUwLCAweDAxLAorICAgIDB4NDYsIDB4ZjAsIDB4NGQsIDB4ZmIsIDB4MDEsIDB4M2MsIDB4MDgsIDB4NDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDA3LCAweDBlLCAweDAwLCAweDBkLCAweGZmLCAweGUyLCAweDE0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YmIsIDB4YzYsIDB4ODQsIDB4MjksIDB4NjksCisgICAgMHg2OSwgMHg2OSwgMHg2OSwgMHg2OSwgMHg2OSwgMHg2OSwgMHg2OSwgMHg2OSwKKyAgICAweDY5LCAweDY5LCAweDY5LCAweDY5LCAweDY5LCAweDY5LCAweDY5LCAweDY5LAorICAgIDB4NjksIDB4NjksIDB4NjksIDB4NjksIDB4NjksIDB4NjksIDB4NjksIDB4NjksCisgICAgMHg2OSwgMHg2OSwgMHg2OSwgMHg2OSwgMHg2OSwgMHg2OSwgMHg2OSwgMHg2OSwKKyAgICAweDY5LCAweDY5LCAweDY5LCAweDY5LCAweDY5LCAweDc4LCAweDAwLCAweDAwLAorICAgIDB4MDEsIDB4NjIKKyAgfTsKKworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3X3dpdGhfcGFkbmFtZXMgKCJmbHZkZW11eCIsICJzaW5rIiwgTlVMTCk7CisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgsICJ2aWRlby94LWZsdiIpOworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGgtPmVsZW1lbnQsICJwYWQtYWRkZWQiLAorICAgICAgR19DQUxMQkFDSyAoZmx2ZGVtdXhfcGFkX2FkZGVkKSwgaCk7CisKKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgY3JlYXRlX2J1ZmZlciAoZmx2X2hlYWRlciwgc2l6ZW9mIChmbHZfaGVhZGVyKSkpOworICBnc3RfaGFybmVzc19wdXNoIChoLCBjcmVhdGVfYnVmZmVyIChhYWNfaGVhZGVyLCBzaXplb2YgKGFhY19oZWFkZXIpKSk7CisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGNyZWF0ZV9idWZmZXIgKGFhY19idWZmZXIsIHNpemVvZiAoYWFjX2J1ZmZlcikpKTsKKworICB7CisgICAgR3N0Q2FwcyAqY2FwczsKKyAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnM7CisgICAgZ2ludCBtcGVndmVyc2lvbjsKKyAgICBnYm9vbGVhbiBmcmFtZWQ7CisgICAgY29uc3QgZ2NoYXIgKnN0cmVhbV9mb3JtYXQ7CisgICAgZ2ludCByYXRlOworICAgIGdpbnQgY2hhbm5lbHM7CisgICAgY29uc3QgR1ZhbHVlICpjb2RlY19kYXRhOworCisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoaC0+c2lua3BhZCk7CisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgICAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJhdWRpby9tcGVnIikpOworCisgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzLCAibXBlZ3ZlcnNpb24iLCAmbXBlZ3ZlcnNpb24pOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDQsIG1wZWd2ZXJzaW9uKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2Jvb2xlYW4gKHMsICJmcmFtZWQiLCAmZnJhbWVkKTsKKyAgICBmYWlsX3VubGVzcyAoZnJhbWVkID09IFRSVUUpOworCisgICAgc3RyZWFtX2Zvcm1hdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgInN0cmVhbS1mb3JtYXQiKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nICgicmF3Iiwgc3RyZWFtX2Zvcm1hdCk7CisKKyAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJyYXRlIiwgJnJhdGUpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDI0MDAwLCByYXRlKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImNoYW5uZWxzIiwgJmNoYW5uZWxzKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgyLCBjaGFubmVscyk7CisKKyAgICBjb2RlY19kYXRhID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJjb2RlY19kYXRhIik7CisgICAgZmFpbF91bmxlc3MgKGNvZGVjX2RhdGEgIT0gTlVMTCk7CisgICAgZmFpbF91bmxlc3MgKEdfVkFMVUVfSE9MRFMgKGNvZGVjX2RhdGEsIEdTVF9UWVBFX0JVRkZFUikpOworCisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICB9CisKKyAgLyogd2Ugc2hvdWxkIGhhdmUgZ290dGVuIG9uZSBlbmNvZGVkIGJ1ZmZlciAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgxLCBnc3RfaGFybmVzc19idWZmZXJzX2luX3F1ZXVlIChoKSk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2gyNjQpCit7CisgIGd1aW50OCBmbHZfaGVhZGVyW10gPSB7CisgICAgMHg0NiwgMHg0YywgMHg1NiwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MTIsIDB4MDAsIDB4MDAsIDB4MmQsICAgICAvKiBzY3JpcHQgdGFnICovCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwKKyAgICAweDAwLCAweDBhLCAweDZmLCAweDZlLCAweDRkLCAweDY1LCAweDc0LCAweDYxLAorICAgIDB4NDQsIDB4NjEsIDB4NzQsIDB4NjEsIDB4MDMsIDB4MDAsIDB4MDYsIDB4NTMsCisgICAgMHg2NSwgMHg3MiwgMHg3NiwgMHg2NSwgMHg3MiwgMHgwMiwgMHgwMCwgMHgxMSwKKyAgICAweDUwLCAweDY1LCAweDc4LCAweDY5LCAweDcwLCAweDIwLCAweDUyLCAweDU0LAorICAgIDB4NGQsIDB4NTAsIDB4MjAsIDB4NTMsIDB4NjUsIDB4NzIsIDB4NzYsIDB4NjUsCisgICAgMHg3MiwgMHgwMCwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzOCwKKyAgfTsKKworICBndWludDggaDI2NF9wYWNrZXQwW10gPSB7CisgICAgMHgwOSwgMHgwMCwgMHgwMCwgMHgxZSwgICAgIC8qIHZpZGVvIHRhZyAqLworICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTcsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0MiwgMHhjMCwgMHgxZSwKKyAgICAweGZmLCAweGUxLCAweDAwLCAweDBhLCAweDY3LCAweDQyLCAweGMwLCAweDFlLAorICAgIDB4OTUsIDB4YTAsIDB4MjgsIDB4MGIsIDB4ZGUsIDB4NTQsIDB4MDEsIDB4MDAsCisgICAgMHgwNCwgMHg2OCwgMHhjZSwgMHgzYywgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDI5CisgIH07CisKKyAgZ3VpbnQ4IGgyNjRfcGFja2V0MVtdID0geworICAgIDB4MDksIDB4MDAsIDB4MDAsIDB4MWIsICAgICAvKiB2aWRlbyB0YWcgKi8KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDI3LAorICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGEsCisgICAgMHg2NywgMHg0MiwgMHhjMCwgMHgxZSwgMHg5NSwgMHhhMCwgMHgyOCwgMHgwYiwKKyAgICAweGRlLCAweDU0LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDY4LCAweGNlLAorICAgIDB4M2MsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjYKKyAgfTsKKworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3X3dpdGhfcGFkbmFtZXMgKCJmbHZkZW11eCIsICJzaW5rIiwgTlVMTCk7CisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgsICJ2aWRlby94LWZsdiIpOworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGgtPmVsZW1lbnQsICJwYWQtYWRkZWQiLAorICAgICAgR19DQUxMQkFDSyAoZmx2ZGVtdXhfcGFkX2FkZGVkKSwgaCk7CisKKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgY3JlYXRlX2J1ZmZlciAoZmx2X2hlYWRlciwgc2l6ZW9mIChmbHZfaGVhZGVyKSkpOworICBnc3RfaGFybmVzc19wdXNoIChoLCBjcmVhdGVfYnVmZmVyIChoMjY0X3BhY2tldDAsIHNpemVvZiAoaDI2NF9wYWNrZXQwKSkpOworICBnc3RfaGFybmVzc19wdXNoIChoLCBjcmVhdGVfYnVmZmVyIChoMjY0X3BhY2tldDEsIHNpemVvZiAoaDI2NF9wYWNrZXQxKSkpOworCisgIHsKKyAgICBHc3RDYXBzICpjYXBzOworICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqczsKKyAgICBjb25zdCBnY2hhciAqc3RyZWFtX2Zvcm1hdDsKKyAgICBjb25zdCBHVmFsdWUgKmNvZGVjX2RhdGE7CisKKyAgICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChoLT5zaW5rcGFkKTsKKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgInZpZGVvL3gtaDI2NCIpKTsKKworICAgIHN0cmVhbV9mb3JtYXQgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJzdHJlYW0tZm9ybWF0Iik7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoImF2YyIsIHN0cmVhbV9mb3JtYXQpOworCisgICAgY29kZWNfZGF0YSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAiY29kZWNfZGF0YSIpOworICAgIGZhaWxfdW5sZXNzIChjb2RlY19kYXRhICE9IE5VTEwpOworICAgIGZhaWxfdW5sZXNzIChHX1ZBTFVFX0hPTERTIChjb2RlY19kYXRhLCBHU1RfVFlQRV9CVUZGRVIpKTsKKworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgfQorCisgIC8qIHdlIHNob3VsZCBoYXZlIGdvdHRlbiBvbmUgZW5jb2RlZCBidWZmZXIgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMSwgZ3N0X2hhcm5lc3NfYnVmZmVyc19pbl9xdWV1ZSAoaCkpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCisKK3N0YXRpYyBTdWl0ZSAqCitmbHZkZW11eF9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJmbHZkZW11eCIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9yZXVzZV9wdXNoKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3JldXNlX3B1bGwpOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9zcGVleCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9hYWMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaDI2NCk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChmbHZkZW11eCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2Zsdm11eC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvZmx2bXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNmOWI5OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2Zsdm11eC5jCkBAIC0wLDAgKzEsNDQ4IEBACisvKiBHU3RyZWFtZXIgdW5pdCB0ZXN0cyBmb3IgZmx2bXV4CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICogQ29weXJpZ2h0IChDKSAyMDE2IEhhdmFyZCBHcmFmZiA8aGF2YXJkQHBleGlwLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxNiBEYXZpZCBCdWNobWFubiA8ZGF2aWRAcGV4aXAuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1ZBTEdSSU5ECisjIGluY2x1ZGUgPHZhbGdyaW5kL3ZhbGdyaW5kLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RoYXJuZXNzLmg+CisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK3N0YXRpYyBHc3RCdXNTeW5jUmVwbHkKK2Vycm9yX2NiIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtc2csIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgaWYgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRVJST1IpIHsKKyAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisgICAgZ2NoYXIgKmRiZyA9IE5VTEw7CisKKyAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobXNnLCAmZXJyLCAmZGJnKTsKKyAgICBnX2Vycm9yICgiRVJST1I6ICVzXG4lc1xuIiwgZXJyLT5tZXNzYWdlLCBkYmcpOworICB9CisKKyAgcmV0dXJuIEdTVF9CVVNfUEFTUzsKK30KKworc3RhdGljIHZvaWQKK2hhbmRvZmZfY2IgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RCdWZmZXIgKiBidWYsIEdzdFBhZCAqIHBhZCwKKyAgICBnaW50ICogcF9jb3VudGVyKQoreworICAqcF9jb3VudGVyICs9IDE7CisgIEdTVF9MT0cgKCJjb3VudGVyID0gJWQiLCAqcF9jb3VudGVyKTsKK30KKworc3RhdGljIHZvaWQKK211eF9wY21fYXVkaW8gKGd1aW50IG51bV9idWZmZXJzLCBndWludCByZXBlYXQpCit7CisgIEdzdEVsZW1lbnQgKnNyYywgKnNpbmssICpmbHZtdXgsICpjb252LCAqcGlwZWxpbmU7CisgIEdzdFBhZCAqc2lua3BhZCwgKnNyY3BhZDsKKyAgZ2ludCBjb3VudGVyOworCisgIEdTVF9MT0cgKCJudW1fYnVmZmVycyA9ICV1IiwgbnVtX2J1ZmZlcnMpOworCisgIHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIGZhaWxfdW5sZXNzIChwaXBlbGluZSAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSBwaXBlbGluZSEiKTsKKworICAvKiBraWRzLCBkb24ndCB1c2UgYSBzeW5jIGhhbmRsZXIgZm9yIHRoaXMgYXQgaG9tZSwgcmVhbGx5OyB3ZSBkbyBiZWNhdXNlCisgICAqIHdlIGp1c3Qgd2FudCB0byBhYm9ydCBhbmQgbm90aGluZyBlbHNlICovCisgIGdzdF9idXNfc2V0X3N5bmNfaGFuZGxlciAoR1NUX0VMRU1FTlRfQlVTIChwaXBlbGluZSksIGVycm9yX2NiLCBOVUxMLCBOVUxMKTsKKworICBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb3Rlc3RzcmMiLCAiYXVkaW90ZXN0c3JjIik7CisgIGZhaWxfdW5sZXNzIChzcmMgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgJ2F1ZGlvdGVzdHNyYycgZWxlbWVudCEiKTsKKworICBnX29iamVjdF9zZXQgKHNyYywgIm51bS1idWZmZXJzIiwgbnVtX2J1ZmZlcnMsIE5VTEwpOworCisgIGNvbnYgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb2NvbnZlcnQiLCAiYXVkaW9jb252ZXJ0Iik7CisgIGZhaWxfdW5sZXNzIChjb252ICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlICdhdWRpb2NvbnZlcnQnIGVsZW1lbnQhIik7CisKKyAgZmx2bXV4ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmx2bXV4IiwgImZsdm11eCIpOworICBmYWlsX3VubGVzcyAoZmx2bXV4ICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlICdmbHZtdXgnIGVsZW1lbnQhIik7CisKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgImZha2VzaW5rIik7CisgIGZhaWxfdW5sZXNzIChzaW5rICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlICdmYWtlc2luaycgZWxlbWVudCEiKTsKKworICBnX29iamVjdF9zZXQgKHNpbmssICJzaWduYWwtaGFuZG9mZnMiLCBUUlVFLCBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoc2luaywgImhhbmRvZmYiLCBHX0NBTExCQUNLIChoYW5kb2ZmX2NiKSwgJmNvdW50ZXIpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc3JjLCBjb252LCBmbHZtdXgsIHNpbmssIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rIChzcmMsIGNvbnYpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmsgKGZsdm11eCwgc2luaykpOworCisgIC8qIG5vdyBsaW5rIHRoZSBlbGVtZW50cyAqLworICBzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChmbHZtdXgsICJhdWRpbyIpOworICBmYWlsX3VubGVzcyAoc2lua3BhZCAhPSBOVUxMLCAiQ291bGQgbm90IGdldCBhdWRpbyByZXF1ZXN0IHBhZCIpOworCisgIHNyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChjb252LCAic3JjIik7CisgIGZhaWxfdW5sZXNzIChzcmNwYWQgIT0gTlVMTCwgIkNvdWxkIG5vdCBnZXQgYXVkaW9jb252ZXJ0J3Mgc291cmNlIHBhZCIpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9wYWRfbGluayAoc3JjcGFkLCBzaW5rcGFkKSwgR1NUX1BBRF9MSU5LX09LKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKworICBkbyB7CisgICAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3RhdGVfcmV0OworICAgIEdzdE1lc3NhZ2UgKm1zZzsKKworICAgIEdTVF9MT0cgKCJyZXBlYXQ9JWQiLCByZXBlYXQpOworCisgICAgY291bnRlciA9IDA7CisKKyAgICBzdGF0ZV9yZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgICBmYWlsX3VubGVzcyAoc3RhdGVfcmV0ICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgICBpZiAoc3RhdGVfcmV0ID09IEdTVF9TVEFURV9DSEFOR0VfQVNZTkMpIHsKKyAgICAgIEdTVF9MT0cgKCJ3YWl0aW5nIGZvciBwaXBlbGluZSB0byByZWFjaCBQQVVTRUQgc3RhdGUiKTsKKyAgICAgIHN0YXRlX3JldCA9IGdzdF9lbGVtZW50X2dldF9zdGF0ZSAocGlwZWxpbmUsIE5VTEwsIE5VTEwsIC0xKTsKKyAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHN0YXRlX3JldCwgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKyAgICB9CisKKyAgICBHU1RfTE9HICgiUEFVU0VELCBsZXQncyBkbyB0aGUgcmVzdCBvZiBpdCIpOworCisgICAgc3RhdGVfcmV0ID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworICAgIGZhaWxfdW5sZXNzIChzdGF0ZV9yZXQgIT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICAgIG1zZyA9IGdzdF9idXNfcG9sbCAoR1NUX0VMRU1FTlRfQlVTIChwaXBlbGluZSksIEdTVF9NRVNTQUdFX0VPUywgLTEpOworICAgIGZhaWxfdW5sZXNzIChtc2cgIT0gTlVMTCwgIkV4cGVjdGVkIEVPUyBtZXNzYWdlIG9uIGJ1cyEiKTsKKworICAgIEdTVF9MT0cgKCJFT1MiKTsKKyAgICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKworICAgIC8qIHNob3VsZCBoYXZlIHNvbWUgb3V0cHV0ICovCisgICAgZmFpbF91bmxlc3MgKGNvdW50ZXIgPiAyKTsKKworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKSwKKyAgICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICAgIC8qIHJlcGVhdCA9IHRlc3QgcmUtdXNhYmlsaXR5ICovCisgICAgLS1yZXBlYXQ7CisgIH0gd2hpbGUgKHJlcGVhdCA+IDApOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaW5kZXhfd3JpdGluZykKK3sKKyAgLyogbm90ZTogdGhlcmUncyBhIG1hZ2ljIDEyOCB2YWx1ZSBpbiBmbHZtdXggd2hlbiBkb2luZyBpbmRleCB3cml0aW5nICovCisgIGlmICgoX19pX18gJSAzMykgPT0gMSkKKyAgICBtdXhfcGNtX2F1ZGlvIChfX2lfXywgMik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIEdzdEJ1ZmZlciAqCitjcmVhdGVfYnVmZmVyIChndWludDggKiBkYXRhLCBnc2l6ZSBzaXplLAorICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIEdzdENsb2NrVGltZSBkdXJhdGlvbikKK3sKKyAgR3N0QnVmZmVyICpidWYgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkX2Z1bGwgKEdTVF9NRU1PUllfRkxBR19SRUFET05MWSwKKyAgICAgIGRhdGEsIHNpemUsIDAsIHNpemUsIE5VTEwsIE5VTEwpOworICBHU1RfQlVGRkVSX1BUUyAoYnVmKSA9IHRpbWVzdGFtcDsKKyAgR1NUX0JVRkZFUl9EVFMgKGJ1ZikgPSB0aW1lc3RhbXA7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikgPSBkdXJhdGlvbjsKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikgPSAwOworICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKGJ1ZikgPSAwOworICByZXR1cm4gYnVmOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9zcGVleF9zdHJlYW1hYmxlKQoreworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0TWFwSW5mbyBtYXAgPSBHU1RfTUFQX0lORk9fSU5JVDsKKworICBndWludDggaGVhZGVyMFtdID0geworICAgIDB4NTMsIDB4NzAsIDB4NjUsIDB4NjUsIDB4NzgsIDB4MjAsIDB4MjAsIDB4MjAsCisgICAgMHgzMSwgMHgyZSwgMHgzMiwgMHg3MiwgMHg2MywgMHgzMSwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgzZSwgMHgwMCwgMHgwMCwKKyAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHg0MCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKyAgfTsKKworICBndWludDggaGVhZGVyMVtdID0geworICAgIDB4MWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDUsIDB4NmUsIDB4NjMsIDB4NmYsCisgICAgMHg2NCwgMHg2NSwgMHg2NCwgMHgyMCwgMHg3NywgMHg2OSwgMHg3NCwgMHg2OCwKKyAgICAweDIwLCAweDQ3LCAweDUzLCAweDc0LCAweDcyLCAweDY1LCAweDYxLCAweDZkLAorICAgIDB4NjUsIDB4NzIsIDB4MjAsIDB4NTMsIDB4NzAsIDB4NjUsIDB4NjUsIDB4NzgsCisgICAgMHg2NSwgMHg2ZSwgMHg2MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMQorICB9OworCisgIGd1aW50OCBidWZmZXJbXSA9IHsKKyAgICAweDM2LCAweDlkLCAweDFiLCAweDlhLCAweDIwLCAweDAwLCAweDAxLCAweDY4LAorICAgIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ODQsCisgICAgMHgwMCwgMHhiNCwgMHg3NCwgMHg3NCwgMHg3NCwgMHg3NCwgMHg3NCwgMHg3NCwKKyAgICAweDc0LCAweDQyLCAweDAwLCAweDVhLCAweDNhLCAweDNhLCAweDNhLCAweDNhLAorICAgIDB4M2EsIDB4M2EsIDB4M2EsIDB4MjEsIDB4MDAsIDB4MmQsIDB4MWQsIDB4MWQsCisgICAgMHgxZCwgMHgxZCwgMHgxZCwgMHgxZCwgMHgxZCwgMHgxYiwgMHgzYiwgMHg2MCwKKyAgICAweGFiLCAweGFiLCAweGFiLCAweGFiLCAweGFiLCAweDBhLCAweGJhLCAweGJhLAorICAgIDB4YmEsIDB4YmEsIDB4YjAsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsCisgICAgMHgwYSwgMHhiYSwgMHhiYSwgMHhiYSwgMHhiYSwgMHhiNworICB9OworCisgIEdzdENhcHMgKmNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1zcGVleCIsCisgICAgICAicmF0ZSIsIEdfVFlQRV9JTlQsIDE2MDAwLAorICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMSwKKyAgICAgIE5VTEwpOworCisgIGNvbnN0IEdzdENsb2NrVGltZSBiYXNlX3RpbWUgPSAxMjM0NTY3ODk7CisgIGNvbnN0IEdzdENsb2NrVGltZSBkdXJhdGlvbl9tcyA9IDIwOworICBjb25zdCBHc3RDbG9ja1RpbWUgZHVyYXRpb24gPSBkdXJhdGlvbl9tcyAqIEdTVF9NU0VDT05EOworCisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXdfd2l0aF9wYWRuYW1lcyAoImZsdm11eCIsICJhdWRpbyIsICJzcmMiKTsKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzIChoLCBjYXBzKTsKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAic3RyZWFtYWJsZSIsIDEsIE5VTEwpOworCisgIC8qIHB1c2ggc3BlZXggaGVhZGVyMCAqLworICBnc3RfaGFybmVzc19wdXNoIChoLCBjcmVhdGVfYnVmZmVyIChoZWFkZXIwLCBzaXplb2YgKGhlYWRlcjApLCBiYXNlX3RpbWUsIDApKTsKKworICAvKiBwdXNoIHNwZWV4IGhlYWRlcjEgKi8KKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgY3JlYXRlX2J1ZmZlciAoaGVhZGVyMSwgc2l6ZW9mIChoZWFkZXIxKSwgYmFzZV90aW1lLCAwKSk7CisKKyAgLyogcHVzaCBzcGVleCBkYXRhICovCisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGNyZWF0ZV9idWZmZXIgKGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpLAorICAgICAgICAgIGJhc2VfdGltZSwgZHVyYXRpb24pKTsKKworICAvKiBwdXNoIHNwZWV4IGRhdGEgMiAqLworICBnc3RfaGFybmVzc19wdXNoIChoLCBjcmVhdGVfYnVmZmVyIChidWZmZXIsIHNpemVvZiAoYnVmZmVyKSwKKyAgICAgICAgICBiYXNlX3RpbWUgKyBkdXJhdGlvbiwgZHVyYXRpb24pKTsKKworICAvKiBwdWxsIG91dCBzdHJlYW0tc3RhcnQgZXZlbnQgKi8KKyAgZ3N0X2V2ZW50X3VucmVmIChnc3RfaGFybmVzc19wdWxsX2V2ZW50IChoKSk7CisKKyAgLyogcHVsbCBvdXQgY2FwcyBldmVudCAqLworICBnc3RfZXZlbnRfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGxfZXZlbnQgKGgpKTsKKworICAvKiBwdWxsIG91dCBzZWdtZW50IGV2ZW50IGFuZCB2ZXJpZnkgd2UgYXJlIHVzaW5nIEdTVF9GT1JNQVRfVElNRSAqLworICB7CisgICAgR3N0RXZlbnQgKmV2ZW50ID0gZ3N0X2hhcm5lc3NfcHVsbF9ldmVudCAoaCk7CisgICAgY29uc3QgR3N0U2VnbWVudCAqc2VnbWVudDsKKyAgICBnc3RfZXZlbnRfcGFyc2Vfc2VnbWVudCAoZXZlbnQsICZzZWdtZW50KTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRk9STUFUX1RJTUUsIHNlZ21lbnQtPmZvcm1hdCk7CisgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgIH0KKworICAvKiBwdWxsIEZMViBoZWFkZXIgYnVmZmVyICovCisgIGJ1ZiA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgIC8qIHB1bGwgTWV0YWRhdGEgYnVmZmVyICovCisgIGJ1ZiA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgIC8qIHB1bGwgaGVhZGVyMCAqLworICBidWYgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoYmFzZV90aW1lLCBHU1RfQlVGRkVSX1BUUyAoYnVmKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKGJhc2VfdGltZSwgR1NUX0JVRkZFUl9EVFMgKGJ1ZikpOworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAvKiAweDA4IG1lYW5zIGl0IGlzIGF1ZGlvICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDB4MDgsIG1hcC5kYXRhWzBdKTsKKyAgLyogdGltZXN0YW1wIHNob3VsZCBiZSBzdGFydGluZyBmcm9tIDAgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMHgwMCwgbWFwLmRhdGFbNl0pOworICAvKiAweGIyIG1lYW5zIFNwZWV4LCAxNjAwMEh6LCBNb25vICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDB4YjIsIG1hcC5kYXRhWzExXSk7CisgIC8qIHZlcmlmeSBjb250ZW50IGlzIGludGFjdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgwLCBtZW1jbXAgKCZtYXAuZGF0YVsxMl0sIGhlYWRlcjAsIHNpemVvZiAoaGVhZGVyMCkpKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAvKiBwdWxsIGhlYWRlcjEgKi8KKyAgYnVmID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKGJhc2VfdGltZSwgR1NUX0JVRkZFUl9QVFMgKGJ1ZikpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChiYXNlX3RpbWUsIEdTVF9CVUZGRVJfRFRTIChidWYpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoMCwgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKSk7CisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIC8qIDB4MDggbWVhbnMgaXQgaXMgYXVkaW8gKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMHgwOCwgbWFwLmRhdGFbMF0pOworICAvKiB0aW1lc3RhbXAgc2hvdWxkIGJlIHN0YXJ0aW5nIGZyb20gMCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgweDAwLCBtYXAuZGF0YVs2XSk7CisgIC8qIDB4YjIgbWVhbnMgU3BlZXgsIDE2MDAwSHosIE1vbm8gKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMHhiMiwgbWFwLmRhdGFbMTFdKTsKKyAgLyogdmVyaWZ5IGNvbnRlbnQgaXMgaW50YWN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDAsIG1lbWNtcCAoJm1hcC5kYXRhWzEyXSwgaGVhZGVyMSwgc2l6ZW9mIChoZWFkZXIxKSkpOworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgIC8qIHB1bGwgZGF0YSAqLworICBidWYgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoYmFzZV90aW1lLCBHU1RfQlVGRkVSX1BUUyAoYnVmKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKGJhc2VfdGltZSwgR1NUX0JVRkZFUl9EVFMgKGJ1ZikpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChkdXJhdGlvbiwgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKEdTVF9CVUZGRVJfT0ZGU0VUX05PTkUsIEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9PRkZTRVRfTk9ORSwKKyAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmKSk7CisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIC8qIDB4MDggbWVhbnMgaXQgaXMgYXVkaW8gKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMHgwOCwgbWFwLmRhdGFbMF0pOworICAvKiB0aW1lc3RhbXAgc2hvdWxkIGJlIHN0YXJ0aW5nIGZyb20gMCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgweDAwLCBtYXAuZGF0YVs2XSk7CisgIC8qIDB4YjIgbWVhbnMgU3BlZXgsIDE2MDAwSHosIE1vbm8gKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMHhiMiwgbWFwLmRhdGFbMTFdKTsKKyAgLyogdmVyaWZ5IGNvbnRlbnQgaXMgaW50YWN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDAsIG1lbWNtcCAoJm1hcC5kYXRhWzEyXSwgYnVmZmVyLCBzaXplb2YgKGJ1ZmZlcikpKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAvKiBwdWxsIGRhdGEgKi8KKyAgYnVmID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKGJhc2VfdGltZSArIGR1cmF0aW9uLCBHU1RfQlVGRkVSX1BUUyAoYnVmKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKGJhc2VfdGltZSArIGR1cmF0aW9uLCBHU1RfQlVGRkVSX0RUUyAoYnVmKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKGR1cmF0aW9uLCBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9PRkZTRVRfTk9ORSwgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChHU1RfQlVGRkVSX09GRlNFVF9OT05FLAorICAgICAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWYpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgLyogMHgwOCBtZWFucyBpdCBpcyBhdWRpbyAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgweDA4LCBtYXAuZGF0YVswXSk7CisgIC8qIHRpbWVzdGFtcCBzaG91bGQgcmVmbGVjdCB0aGUgZHVyYXRpb25fbXMgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZHVyYXRpb25fbXMsIG1hcC5kYXRhWzZdKTsKKyAgLyogMHhiMiBtZWFucyBTcGVleCwgMTYwMDBIeiwgTW9ubyAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgweGIyLCBtYXAuZGF0YVsxMV0pOworICAvKiB2ZXJpZnkgY29udGVudCBpcyBpbnRhY3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMCwgbWVtY21wICgmbWFwLmRhdGFbMTJdLCBidWZmZXIsIHNpemVvZiAoYnVmZmVyKSkpOworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgdm9pZAorY2hlY2tfYnVmX3R5cGVfdGltZXN0YW1wIChHc3RCdWZmZXIgKiBidWYsIGdpbnQgcGFja2V0X3R5cGUsIGdpbnQgdGltZXN0YW1wKQoreworICBHc3RNYXBJbmZvIG1hcCA9IEdTVF9NQVBfSU5GT19JTklUOworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChwYWNrZXRfdHlwZSwgbWFwLmRhdGFbMF0pOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICh0aW1lc3RhbXAsIG1hcC5kYXRhWzZdKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaW5jcmVhc2luZ190aW1lc3RhbXBfd2hlbl9wdHNfbm9uZSkKK3sKKyAgY29uc3QgZ2ludCBBVURJTyA9IDB4MDg7CisgIGNvbnN0IGdpbnQgVklERU8gPSAweDA5OworICBnaW50IHRpbWVzdGFtcCA9IDM7CisgIEdzdENsb2NrVGltZSBiYXNlX3RpbWUgPSA0MiAqIEdTVF9TRUNPTkQ7CisgIEdzdFBhZCAqYXVkaW9fc2luaywgKnZpZGVvX3NpbmssICphdWRpb19zcmMsICp2aWRlb19zcmM7CisgIEdzdEhhcm5lc3MgKmgsICphdWRpbywgKnZpZGVvLCAqYXVkaW9fcSwgKnZpZGVvX3E7CisgIEdzdENhcHMgKmF1ZGlvX2NhcHMsICp2aWRlb19jYXBzOworICBHc3RCdWZmZXIgKmJ1ZjsKKworICBoID0gZ3N0X2hhcm5lc3NfbmV3X3dpdGhfcGFkbmFtZXMgKCJmbHZtdXgiLCBOVUxMLCAic3JjIik7CisgIGF1ZGlvID0gZ3N0X2hhcm5lc3NfbmV3X3dpdGhfZWxlbWVudCAoaC0+ZWxlbWVudCwgImF1ZGlvIiwgTlVMTCk7CisgIHZpZGVvID0gZ3N0X2hhcm5lc3NfbmV3X3dpdGhfZWxlbWVudCAoaC0+ZWxlbWVudCwgInZpZGVvIiwgTlVMTCk7CisgIGF1ZGlvX3EgPSBnc3RfaGFybmVzc19uZXcgKCJxdWV1ZSIpOworICB2aWRlb19xID0gZ3N0X2hhcm5lc3NfbmV3ICgicXVldWUiKTsKKworICBhdWRpb19zaW5rID0gR1NUX1BBRF9QRUVSIChhdWRpby0+c3JjcGFkKTsKKyAgdmlkZW9fc2luayA9IEdTVF9QQURfUEVFUiAodmlkZW8tPnNyY3BhZCk7CisgIGF1ZGlvX3NyYyA9IEdTVF9QQURfUEVFUiAoYXVkaW9fcS0+c2lua3BhZCk7CisgIHZpZGVvX3NyYyA9IEdTVF9QQURfUEVFUiAodmlkZW9fcS0+c2lua3BhZCk7CisKKyAgZ3N0X3BhZF91bmxpbmsgKGF1ZGlvLT5zcmNwYWQsIGF1ZGlvX3NpbmspOworICBnc3RfcGFkX3VubGluayAodmlkZW8tPnNyY3BhZCwgdmlkZW9fc2luayk7CisgIGdzdF9wYWRfdW5saW5rIChhdWRpb19zcmMsIGF1ZGlvX3EtPnNpbmtwYWQpOworICBnc3RfcGFkX3VubGluayAodmlkZW9fc3JjLCB2aWRlb19xLT5zaW5rcGFkKTsKKyAgZ3N0X3BhZF9saW5rIChhdWRpb19zcmMsIGF1ZGlvX3NpbmspOworICBnc3RfcGFkX2xpbmsgKHZpZGVvX3NyYywgdmlkZW9fc2luayk7CisKKyAgYXVkaW9fY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXNwZWV4IiwKKyAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgMTYwMDAsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDEsIE5VTEwpOworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHMgKGF1ZGlvX3EsIGF1ZGlvX2NhcHMpOworICB2aWRlb19jYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtaDI2NCIsCisgICAgICAic3RyZWFtLWZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJhdmMiLCBOVUxMKTsKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzICh2aWRlb19xLCB2aWRlb19jYXBzKTsKKworICAvKiBQdXNoIGF1ZGlvICsgdmlkZW8gKyBhdWRpbyB3aXRoIGluY3JlYXNpbmcgRFRTLCBidXQgUFRTIGZvciB2aWRlbyBpcworICAgKiBHU1RfQ0xPQ0tfVElNRV9OT05FCisgICAqLworICBidWYgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgR1NUX0JVRkZFUl9EVFMgKGJ1ZikgPSB0aW1lc3RhbXAgKiBHU1RfTVNFQ09ORCArIGJhc2VfdGltZTsKKyAgR1NUX0JVRkZFUl9QVFMgKGJ1ZikgPSB0aW1lc3RhbXAgKiBHU1RfTVNFQ09ORCArIGJhc2VfdGltZTsKKyAgZ3N0X2hhcm5lc3NfcHVzaCAoYXVkaW9fcSwgYnVmKTsKKworICBidWYgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgR1NUX0JVRkZFUl9EVFMgKGJ1ZikgPSAodGltZXN0YW1wICsgMSkgKiBHU1RfTVNFQ09ORCArIGJhc2VfdGltZTsKKyAgR1NUX0JVRkZFUl9QVFMgKGJ1ZikgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBnc3RfaGFybmVzc19wdXNoICh2aWRlb19xLCBidWYpOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3ICgpOworICBHU1RfQlVGRkVSX0RUUyAoYnVmKSA9ICh0aW1lc3RhbXAgKyAyKSAqIEdTVF9NU0VDT05EICsgYmFzZV90aW1lOworICBHU1RfQlVGRkVSX1BUUyAoYnVmKSA9ICh0aW1lc3RhbXAgKyAyKSAqIEdTVF9NU0VDT05EICsgYmFzZV90aW1lOworICBnc3RfaGFybmVzc19wdXNoIChhdWRpb19xLCBidWYpOworCisgIC8qIFB1bGwgdHdvIG1ldGFkYXRhIHBhY2tldHMgb3V0ICovCisgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworCisgIC8qIENoZWNrIHRoYXQgd2UgcmVjZWl2ZSB0aGUgcGFja2V0cyBpbiBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgb3JkZXIgYW5kCisgICAqIHRoYXQgdGhlaXIgdGltZXN0YW1wcyBhcmUgY29ycmVjdCAoc2hvdWxkIHN0YXJ0IGF0IDApCisgICAqLworICBidWYgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgY2hlY2tfYnVmX3R5cGVfdGltZXN0YW1wIChidWYsIEFVRElPLCAwKTsKKyAgYnVmID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGNoZWNrX2J1Zl90eXBlX3RpbWVzdGFtcCAoYnVmLCBWSURFTywgMSk7CisKKyAgLyogdGVhcmRvd24gKi8KKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworICBnc3RfaGFybmVzc190ZWFyZG93biAoYXVkaW8pOworICBnc3RfaGFybmVzc190ZWFyZG93biAodmlkZW8pOworICBnc3RfaGFybmVzc190ZWFyZG93biAoYXVkaW9fcSk7CisgIGdzdF9oYXJuZXNzX3RlYXJkb3duICh2aWRlb19xKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorZmx2bXV4X3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImZsdm11eCIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisgIGdpbnQgbG9vcCA9IDQ5OTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKworI2lmZGVmIEhBVkVfVkFMR1JJTkQKKyAgaWYgKFJVTk5JTkdfT05fVkFMR1JJTkQpIHsKKyAgICBsb29wID0gMTQwOworICB9CisjZW5kaWYKKworICB0Y2FzZV9hZGRfbG9vcF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9pbmRleF93cml0aW5nLCAxLCBsb29wKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfc3BlZXhfc3RyZWFtYWJsZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9pbmNyZWFzaW5nX3RpbWVzdGFtcF93aGVuX3B0c19ub25lKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGZsdm11eCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2dka3BpeGJ1Zm92ZXJsYXkuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2dka3BpeGJ1Zm92ZXJsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzQ1NTU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvZ2RrcGl4YnVmb3ZlcmxheS5jCkBAIC0wLDAgKzEsODAgQEAKKy8qIEdTdHJlYW1lciB1bml0IHRlc3QgZm9yIHRoZSBnZGtwaXhidWZvdmVybGF5IGVsZW1lbnQKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfc2ltcGxlX292ZXJsYXkpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lLCAqc3JjLCAqb3ZlcmxheSwgKnNpbms7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKyAgR3N0QnVzICpidXM7CisKKyAgc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChzcmMgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc3JjLCAibnVtLWJ1ZmZlcnMiLCAzLCBOVUxMKTsKKworICBvdmVybGF5ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZ2RrcGl4YnVmb3ZlcmxheSIsIE5VTEwpOworICBmYWlsX3VubGVzcyAob3ZlcmxheSAhPSBOVUxMKTsKKworI2RlZmluZSBJTUFHRV9QQVRIIEdTVF9URVNUX0ZJTEVTX1BBVEggR19ESVJfU0VQQVJBVE9SX1MgImltYWdlLmpwZyIKKyAgZ19vYmplY3Rfc2V0IChvdmVybGF5LCAibG9jYXRpb24iLCBJTUFHRV9QQVRILCBOVUxMKTsKKworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHNpbmsgIT0gTlVMTCk7CisKKyAgcGlwZWxpbmUgPSBnc3RfcGlwZWxpbmVfbmV3IChOVUxMKTsKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBzcmMsIG92ZXJsYXksIHNpbmssIE5VTEwpOworICBnc3RfZWxlbWVudF9saW5rX21hbnkgKHNyYywgb3ZlcmxheSwgc2luaywgTlVMTCk7CisKKyAgLyogc3RhcnQgcHJlcm9sbGluZyAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX0FTWU5DKTsKKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChwaXBlbGluZSk7CisKKyAgLyogd2FpdCBmb3IgRU9TICovCisgIG1zZyA9IGdzdF9idXNfdGltZWRfcG9wX2ZpbHRlcmVkIChidXMsIEdTVF9DTE9DS19USU1FX05PTkUsIEdTVF9NRVNTQUdFX0VPUyk7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKSwKKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitnZGtwaXhidWZvdmVybGF5X3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImdka3BpeGJ1Zm92ZXJsYXkiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfc2ltcGxlX292ZXJsYXkpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoZ2RrcGl4YnVmb3ZlcmxheSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9nZGtwaXhidWZzaW5rLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9nZGtwaXhidWZzaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4M2NjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2dka3BpeGJ1ZnNpbmsuYwpAQCAtMCwwICsxLDI5MyBAQAorLyogR1N0cmVhbWVyIHVuaXQgdGVzdCBmb3IgdGhlIGdka3BpeGJ1ZnNpbmsgZWxlbWVudAorICogQ29weXJpZ2h0IChDKSAyMDA4IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSA8Z2RrLXBpeGJ1Zi9nZGstcGl4YnVmLmg+CisKKyNkZWZpbmUgQ0FQU19SR0IgInZpZGVvL3gtcmF3LCBmb3JtYXQ9UkdCIgorI2RlZmluZSBDQVBTX1JHQkEgInZpZGVvL3gtcmF3LCBmb3JtYXQ9UkdCQSIKKyNkZWZpbmUgV3hIICIsd2lkdGg9KGludCkzMTksaGVpZ2h0PShpbnQpMjQxIgorCisjZGVmaW5lIE5fQlVGRkVSUyA1CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEdzdEVsZW1lbnQgKnBpcGU7CisgIEdzdEVsZW1lbnQgKnNyYzsKKyAgR3N0RWxlbWVudCAqZmlsdGVyOworICBHc3RFbGVtZW50ICpzaW5rOworfSBHc3RHZGtQaXhidWZTaW5rVGVzdENvbnRleHQ7CisKK3N0YXRpYyB2b2lkCitnZGtwaXhidWZzaW5rX2luaXRfdGVzdF9jb250ZXh0IChHc3RHZGtQaXhidWZTaW5rVGVzdENvbnRleHQgKiBjdHgsCisgICAgY29uc3QgZ2NoYXIgKiBmaWx0ZXJfY2Fwc19zdHJpbmcsIGdpbnQgbnVtX2J1ZmZlcnMpCit7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgZmFpbF91bmxlc3MgKGN0eCAhPSBOVUxMKTsKKworICBjdHgtPnBpcGUgPSBnc3RfcGlwZWxpbmVfbmV3ICgicGlwZWxpbmUiKTsKKyAgZmFpbF91bmxlc3MgKGN0eC0+cGlwZSAhPSBOVUxMKTsKKyAgY3R4LT5zcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCAic3JjIik7CisgIGZhaWxfdW5sZXNzIChjdHgtPnNyYyAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSB2aWRlb3Rlc3RzcmMgZWxlbWVudCIpOworICBjdHgtPmZpbHRlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImNhcHNmaWx0ZXIiLCAiZmlsdGVyIik7CisgIGZhaWxfdW5sZXNzIChjdHgtPmZpbHRlciAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSBjYXBzZmlsdGVyIGVsZW1lbnQiKTsKKyAgY3R4LT5zaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZ2RrcGl4YnVmc2luayIsICJzaW5rIik7CisgIGZhaWxfdW5sZXNzIChjdHgtPnNpbmsgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgZ2RrcGl4YnVmc2luayBlbGVtZW50Iik7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChmaWx0ZXJfY2Fwc19zdHJpbmcpOworICBmYWlsX3VubGVzcyAoY2FwcyAhPSBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChjdHgtPmZpbHRlciwgImNhcHMiLCBjYXBzLCBOVUxMKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGlmIChudW1fYnVmZmVycyA+IDApCisgICAgZ19vYmplY3Rfc2V0IChjdHgtPnNyYywgIm51bS1idWZmZXJzIiwgbnVtX2J1ZmZlcnMsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfYmluX2FkZCAoR1NUX0JJTiAoY3R4LT5waXBlKSwgY3R4LT5zcmMpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9iaW5fYWRkIChHU1RfQklOIChjdHgtPnBpcGUpLCBjdHgtPmZpbHRlcikpOworICBmYWlsX3VubGVzcyAoZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKGN0eC0+cGlwZSksIGN0eC0+c2luaykpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGluayAoY3R4LT5zcmMsIGN0eC0+ZmlsdGVyKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rIChjdHgtPmZpbHRlciwgY3R4LT5zaW5rKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnZGtwaXhidWZzaW5rX3Vuc2V0X3Rlc3RfY29udGV4dCAoR3N0R2RrUGl4YnVmU2lua1Rlc3RDb250ZXh0ICogY3R4KQoreworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGN0eC0+cGlwZSwgR1NUX1NUQVRFX05VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChjdHgtPnBpcGUpOworICBtZW1zZXQgKGN0eCwgMCwgc2l6ZW9mIChHc3RHZGtQaXhidWZTaW5rVGVzdENvbnRleHQpKTsKK30KKworc3RhdGljIGdib29sZWFuCitjaGVja19sYXN0X3BpeGJ1ZiAoR3N0R2RrUGl4YnVmU2lua1Rlc3RDb250ZXh0ICogY3R4LCBncG9pbnRlciBwaXhidWYpCit7CisgIGdwb2ludGVyIGxhc3RfcGIgPSBOVUxMOworICBnYm9vbGVhbiByZXQ7CisKKyAgZ19vYmplY3RfZ2V0IChjdHgtPnNpbmssICJsYXN0LXBpeGJ1ZiIsICZsYXN0X3BiLCBOVUxMKTsKKworICByZXQgPSAobGFzdF9wYiA9PSBwaXhidWYpOworCisgIGlmIChsYXN0X3BiKQorICAgIGdfb2JqZWN0X3VucmVmIChsYXN0X3BiKTsKKworICByZXR1cm4gcmV0OworfQorCisvKiBkb2Vzbid0IHJldHVybiBhIHJlZiB0byB0aGUgcGl4YnVmICovCitzdGF0aWMgR2RrUGl4YnVmICoKK2NoZWNrX21lc3NhZ2VfcGl4YnVmIChHc3RNZXNzYWdlICogbXNnLCBjb25zdCBnY2hhciAqIG5hbWUsIGdpbnQgY2hhbm5lbHMsCisgICAgZ2Jvb2xlYW4gaGFzX2FscGhhKQoreworICBHZGtQaXhidWYgKnBpeGJ1ZjsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzOworCisgIGZhaWxfdW5sZXNzIChnc3RfbWVzc2FnZV9nZXRfc3RydWN0dXJlIChtc2cpICE9IE5VTEwpOworCisgIHMgPSBnc3RfbWVzc2FnZV9nZXRfc3RydWN0dXJlIChtc2cpOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nIChnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzKSwgbmFtZSk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAicGl4YnVmIikpOworICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGRfdHlwZWQgKHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iLAorICAgICAgICAgIEdTVF9UWVBFX0ZSQUNUSU9OKSk7CisgIHBpeGJ1ZiA9CisgICAgICBHREtfUElYQlVGIChnX3ZhbHVlX2dldF9vYmplY3QgKGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAicGl4YnVmIikpKTsKKyAgZmFpbF91bmxlc3MgKEdES19JU19QSVhCVUYgKHBpeGJ1ZikpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnZGtfcGl4YnVmX2dldF9uX2NoYW5uZWxzIChwaXhidWYpLCBjaGFubmVscyk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdka19waXhidWZfZ2V0X2hhc19hbHBoYSAocGl4YnVmKSwgaGFzX2FscGhhKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ2RrX3BpeGJ1Zl9nZXRfd2lkdGggKHBpeGJ1ZiksIDMxOSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdka19waXhidWZfZ2V0X2hlaWdodCAocGl4YnVmKSwgMjQxKTsKKworICByZXR1cm4gcGl4YnVmOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9yZ2IpCit7CisgIEdzdEdka1BpeGJ1ZlNpbmtUZXN0Q29udGV4dCBjdHg7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKyAgR2RrUGl4YnVmICpwaXhidWY7CisgIEdzdEJ1cyAqYnVzOworICBnaW50IGk7CisKKyAgZ2RrcGl4YnVmc2lua19pbml0X3Rlc3RfY29udGV4dCAoJmN0eCwgQ0FQU19SR0IgV3hILCBOX0JVRkZFUlMpOworCisgIGZhaWxfdW5sZXNzIChjaGVja19sYXN0X3BpeGJ1ZiAoJmN0eCwgTlVMTCkpOworCisgIC8qIHN0YXJ0IHByZXJvbGxpbmcgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChjdHgucGlwZSwgR1NUX1NUQVRFX1BBVVNFRCksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX0FTWU5DKTsKKworICAvKiB3YWl0IHVudGlsIHByZXJvbGxlZCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZWxlbWVudF9nZXRfc3RhdGUgKGN0eC5waXBlLCBOVUxMLCBOVUxMLCAtMSksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKGN0eC5waXBlKTsKKworICAvKiBmaW5kIGVsZW1lbnQgbWVzc2FnZSBmcm9tIG91ciBnZGtwaXhidWZzaW5rLCBpZ25vcmUgZWxlbWVudCBtZXNzYWdlcyBmcm9tCisgICAqIG90aGVyIGVsZW1lbWVudHMgKHdoaWNoIGp1c3Qgc2VlbXMgcHJ1ZGVudCB0byBkbywgd2UgZG9uJ3QgZXhwZWN0IGFueSkgKi8KKyAgd2hpbGUgKDEpIHsKKyAgICBtc2cgPSBnc3RfYnVzX3BvcF9maWx0ZXJlZCAoYnVzLCBHU1RfTUVTU0FHRV9FTEVNRU5UKTsKKyAgICBmYWlsX2lmIChtc2cgPT0gTlVMTCwgIkV4cGVjdGVkIGVsZW1lbnQgbWVzc2FnZSBmcm9tIGdka3BpeGJ1ZnNpbmsiKTsKKworICAgIGlmIChtc2ctPnNyYyA9PSBHU1RfT0JKRUNUIChjdHguc2luaykpCisgICAgICBicmVhazsKKyAgfQorCisgIHBpeGJ1ZiA9IGNoZWNrX21lc3NhZ2VfcGl4YnVmIChtc2csICJwcmVyb2xsLXBpeGJ1ZiIsIDMsIEZBTFNFKTsKKyAgZmFpbF91bmxlc3MgKGNoZWNrX2xhc3RfcGl4YnVmICgmY3R4LCBwaXhidWYpKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgIHBpeGJ1ZiA9IE5VTEw7CisKKyAgLyogYW5kIGdvISAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGN0eC5waXBlLCBHU1RfU1RBVEVfUExBWUlORyksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIC8qIFRoaXMgaXMgcmFjeSwgc3VwcG9zZWQgdG8gbWFrZSBzdXJlIGxvY2tpbmcgYW5kIHJlZmNvdW50aW5nIHdvcmtzIGF0CisgICAqIGxlYXN0IHRvIHNvbWUgZXh0ZW50ICovCisgIGZvciAoaSA9IDA7IGkgPCAxMDAwMDsgKytpKSB7CisgICAgZ3BvaW50ZXIgb2JqID0gTlVMTDsKKworICAgIGdfb2JqZWN0X2dldCAoY3R4LnNpbmssICJsYXN0LXBpeGJ1ZiIsICZvYmosIE5VTEwpOworICAgIGZhaWxfdW5sZXNzIChvYmogPT0gTlVMTCB8fCBHREtfSVNfUElYQlVGIChvYmopKTsKKyAgICBpZiAob2JqKQorICAgICAgZ19vYmplY3RfdW5yZWYgKG9iaik7CisgIH0KKworICAvKiB0aGVyZSBzaG91bGQgYmUgYXMgbWFueSBwaXhidWYgbWVzc2FnZXMgYXMgYnVmZmVycyAqLworICBmb3IgKGkgPSAwOyBpIDwgTl9CVUZGRVJTOyArK2kpIHsKKyAgICAvKiBmaW5kIGVsZW1lbnQgbWVzc2FnZSBmcm9tIG91ciBnZGtwaXhidWZzaW5rLCBpZ25vcmUgZWxlbWVudCBtZXNzYWdlcyBmcm9tCisgICAgICogb3RoZXIgZWxlbWVtZW50cyAod2hpY2gganVzdCBzZWVtcyBwcnVkZW50IHRvIGRvLCB3ZSBkb24ndCBleHBlY3QgYW55KSAqLworICAgIHdoaWxlICgxKSB7CisgICAgICBtc2cgPSBnc3RfYnVzX3RpbWVkX3BvcF9maWx0ZXJlZCAoYnVzLCAtMSwgR1NUX01FU1NBR0VfRUxFTUVOVCk7CisgICAgICBmYWlsX2lmIChtc2cgPT0gTlVMTCwgIkV4cGVjdGVkIGVsZW1lbnQgbWVzc2FnZSBmcm9tIGdka3BpeGJ1ZnNpbmsiKTsKKyAgICAgIGlmIChtc2ctPnNyYyA9PSBHU1RfT0JKRUNUIChjdHguc2luaykpCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHBpeGJ1ZiA9IGNoZWNrX21lc3NhZ2VfcGl4YnVmIChtc2csICJwaXhidWYiLCAzLCBGQUxTRSk7CisgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgIH0KKworICAvKiBub3RlOiB3ZSBkb24ndCBob2xkIGEgcmVmIHRvIHBpeGJ1ZiBhbnkgbG9uZ2VyIGhlcmUsIGJ1dCBpdCBzaG91bGQgYmUgb2sgKi8KKyAgZmFpbF91bmxlc3MgKGNoZWNrX2xhc3RfcGl4YnVmICgmY3R4LCBwaXhidWYpKTsKKyAgcGl4YnVmID0gTlVMTDsKKworICBnZGtwaXhidWZzaW5rX3Vuc2V0X3Rlc3RfY29udGV4dCAoJmN0eCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcmdiYSkKK3sKKyAgR3N0R2RrUGl4YnVmU2lua1Rlc3RDb250ZXh0IGN0eDsKKyAgR3N0TWVzc2FnZSAqbXNnOworICBHZGtQaXhidWYgKnBpeGJ1ZjsKKyAgR3N0QnVzICpidXM7CisgIGdpbnQgaTsKKworICBnZGtwaXhidWZzaW5rX2luaXRfdGVzdF9jb250ZXh0ICgmY3R4LCBDQVBTX1JHQkEgV3hILCBOX0JVRkZFUlMpOworCisgIGZhaWxfdW5sZXNzIChjaGVja19sYXN0X3BpeGJ1ZiAoJmN0eCwgTlVMTCkpOworCisgIC8qIHN0YXJ0IHByZXJvbGxpbmcgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChjdHgucGlwZSwgR1NUX1NUQVRFX1BBVVNFRCksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX0FTWU5DKTsKKworICAvKiB3YWl0IHVudGlsIHByZXJvbGxlZCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZWxlbWVudF9nZXRfc3RhdGUgKGN0eC5waXBlLCBOVUxMLCBOVUxMLCAtMSksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKGN0eC5waXBlKTsKKworICAvKiBmaW5kIGVsZW1lbnQgbWVzc2FnZSBmcm9tIG91ciBnZGtwaXhidWZzaW5rLCBpZ25vcmUgZWxlbWVudCBtZXNzYWdlcyBmcm9tCisgICAqIG90aGVyIGVsZW1lbWVudHMgKHdoaWNoIGp1c3Qgc2VlbXMgcHJ1ZGVudCB0byBkbywgd2UgZG9uJ3QgZXhwZWN0IGFueSkgKi8KKyAgd2hpbGUgKDEpIHsKKyAgICBtc2cgPSBnc3RfYnVzX3BvcF9maWx0ZXJlZCAoYnVzLCBHU1RfTUVTU0FHRV9FTEVNRU5UKTsKKyAgICBmYWlsX2lmIChtc2cgPT0gTlVMTCwgIkV4cGVjdGVkIGVsZW1lbnQgbWVzc2FnZSBmcm9tIGdka3BpeGJ1ZnNpbmsiKTsKKworICAgIGlmIChtc2ctPnNyYyA9PSBHU1RfT0JKRUNUIChjdHguc2luaykpCisgICAgICBicmVhazsKKyAgfQorCisgIHBpeGJ1ZiA9IGNoZWNrX21lc3NhZ2VfcGl4YnVmIChtc2csICJwcmVyb2xsLXBpeGJ1ZiIsIDQsIFRSVUUpOworICBmYWlsX3VubGVzcyAoY2hlY2tfbGFzdF9waXhidWYgKCZjdHgsIHBpeGJ1ZikpOworICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKyAgcGl4YnVmID0gTlVMTDsKKworICAvKiBhbmQgZ28hICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoY3R4LnBpcGUsIEdTVF9TVEFURV9QTEFZSU5HKSwKKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgLyogVGhpcyBpcyByYWN5LCBzdXBwb3NlZCB0byBtYWtlIHN1cmUgbG9ja2luZyBhbmQgcmVmY291bnRpbmcgd29ya3MgYXQKKyAgICogbGVhc3QgdG8gc29tZSBleHRlbnQgKi8KKyAgZm9yIChpID0gMDsgaSA8IDEwMDAwOyArK2kpIHsKKyAgICBncG9pbnRlciBvYmogPSBOVUxMOworCisgICAgZ19vYmplY3RfZ2V0IChjdHguc2luaywgImxhc3QtcGl4YnVmIiwgJm9iaiwgTlVMTCk7CisgICAgZmFpbF91bmxlc3MgKG9iaiA9PSBOVUxMIHx8IEdES19JU19QSVhCVUYgKG9iaikpOworICAgIGlmIChvYmopCisgICAgICBnX29iamVjdF91bnJlZiAob2JqKTsKKyAgfQorCisgIC8qIHRoZXJlIHNob3VsZCBiZSBhcyBtYW55IHBpeGJ1ZiBtZXNzYWdlcyBhcyBidWZmZXJzICovCisgIGZvciAoaSA9IDA7IGkgPCBOX0JVRkZFUlM7ICsraSkgeworICAgIC8qIGZpbmQgZWxlbWVudCBtZXNzYWdlIGZyb20gb3VyIGdka3BpeGJ1ZnNpbmssIGlnbm9yZSBlbGVtZW50IG1lc3NhZ2VzIGZyb20KKyAgICAgKiBvdGhlciBlbGVtZW1lbnRzICh3aGljaCBqdXN0IHNlZW1zIHBydWRlbnQgdG8gZG8sIHdlIGRvbid0IGV4cGVjdCBhbnkpICovCisgICAgd2hpbGUgKDEpIHsKKyAgICAgIG1zZyA9IGdzdF9idXNfdGltZWRfcG9wX2ZpbHRlcmVkIChidXMsIC0xLCBHU1RfTUVTU0FHRV9FTEVNRU5UKTsKKyAgICAgIGZhaWxfaWYgKG1zZyA9PSBOVUxMLCAiRXhwZWN0ZWQgZWxlbWVudCBtZXNzYWdlIGZyb20gZ2RrcGl4YnVmc2luayIpOworICAgICAgaWYgKG1zZy0+c3JjID09IEdTVF9PQkpFQ1QgKGN0eC5zaW5rKSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcGl4YnVmID0gY2hlY2tfbWVzc2FnZV9waXhidWYgKG1zZywgInBpeGJ1ZiIsIDQsIFRSVUUpOworICAgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworICB9CisKKyAgLyogbm90ZTogd2UgZG9uJ3QgaG9sZCBhIHJlZiB0byBwaXhidWYgYW55IGxvbmdlciBoZXJlLCBidXQgaXQgc2hvdWxkIGJlIG9rICovCisgIGZhaWxfdW5sZXNzIChjaGVja19sYXN0X3BpeGJ1ZiAoJmN0eCwgcGl4YnVmKSk7CisgIHBpeGJ1ZiA9IE5VTEw7CisKKyAgZ2RrcGl4YnVmc2lua191bnNldF90ZXN0X2NvbnRleHQgKCZjdHgpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitnZGtwaXhidWZzaW5rX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImdka3BpeGJ1ZnNpbmsiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcmdiKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3JnYmEpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoZ2RrcGl4YnVmc2luayk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9pY3lkZW11eC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvaWN5ZGVtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWU0M2I0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvaWN5ZGVtdXguYwpAQCAtMCwwICsxLDM3OCBAQAorLyoKKyAqIGljeWRlbXV4LmMgLSBUZXN0IGljeWRlbXV4IGVsZW1lbnQKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIFNtaXRoIDxtc21pdGhAZmx1ZW5kby5jb20+CisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworLyogQ2h1bmsgb2YgZGF0YTogOCBieXRlcywgZm9sbG93ZWQgYnkgYSBtZXRhZGF0YS1sZW5ndGggYnl0ZSBvZiAyLCBmb2xsb3dlZCBieQorICogc29tZSBtZXRhZGF0YSAoMzIgYnl0ZXMpLCB0aGVuIHNvbWUgbW9yZSBkYXRhLgorICovCisjZGVmaW5lIFRFU1RfTUVUQURBVEEgXAorICAgICJUZXN0IG1ldGFkYXRhIgorI2RlZmluZSBJQ1lfTUVUQURBVEEgXAorICAgICJTdHJlYW1UaXRsZT0nIiBURVNUX01FVEFEQVRBICInO1wwXDBcMFwwIgorCisjZGVmaW5lIEVNUFRZX0lDWV9TVFJFQU1fVElUTEVfTUVUQURBVEEgXAorICAgICJTdHJlYW1UaXRsZT0nJztcMCIKKworI2RlZmluZSBJQ1lfREFUQSBcCisgICAgImFhYWFhYWFhIiBcCisgICAgIlx4MDIiIFwKKyAgICBJQ1lfTUVUQURBVEEgXAorICAgICJiYmJiYmJiYiIKKworI2RlZmluZSBJQ1lfREFUQV9FTVBUWV9NRVRBREFUQSBcCisgICAgSUNZX0RBVEEgXAorICAgICJceDAwIiBcCisgICAgImRkZGRkZGRkIiBcCisgICAgIlx4MDEiIFwKKyAgICBFTVBUWV9JQ1lfU1RSRUFNX1RJVExFX01FVEFEQVRBIFwKKyAgICAiY2NjY2NjY2MiCisKKyNkZWZpbmUgSUNZQ0FQUyAiYXBwbGljYXRpb24veC1pY3ksIG1ldGFkYXRhLWludGVydmFsID0gKGludCk4IgorCisjZGVmaW5lIFNSQ19DQVBTICJhcHBsaWNhdGlvbi94LWljeSwgbWV0YWRhdGEtaW50ZXJ2YWwgPSAoaW50KVswLCBNQVhdIgorI2RlZmluZSBTSU5LX0NBUFMgICJBTlkiCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFNSQ19DQVBTKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFNJTktfQ0FQUykKKyAgICApOworCitzdGF0aWMgR3N0RWxlbWVudCAqaWN5ZGVtdXg7CitzdGF0aWMgR3N0QnVzICpidXM7CitHc3RQYWQgKnNyY3BhZCwgKnNpbmtwYWQ7CisKK3N0YXRpYyBHc3RTdGF0aWNDYXBzIHR5cGVmaW5kX2NhcHMgPQorR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisKK3N0YXRpYyBnYm9vbGVhbiBmYWtlX3R5cGVmaW5kX2NhcHM7ICAgICAvKiBGQUxTRSAqLworCitzdGF0aWMgdm9pZAordHlwZWZpbmRfc3VjY2VlZCAoR3N0VHlwZUZpbmQgKiB0ZiwgZ3BvaW50ZXIgcHJpdmF0ZSkKK3sKKyAgaWYgKGZha2VfdHlwZWZpbmRfY2FwcykgeworICAgIGdzdF90eXBlX2ZpbmRfc3VnZ2VzdCAodGYsIEdTVF9UWVBFX0ZJTkRfTUFYSU1VTSwKKyAgICAgICAgZ3N0X3N0YXRpY19jYXBzX2dldCAoJnR5cGVmaW5kX2NhcHMpKTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3Rlc3RfZXZlbnRfZnVuYyAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICIlcyBldmVudDogJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCksIGV2ZW50KTsKKworICAvKiBhIHNpbmsgd291bGQgcG9zdCB0YWcgZXZlbnRzIGFzIG1lc3NhZ2VzLCBzbyBkbyB0aGUgc2FtZSBoZXJlLAorICAgKiBlc3AuIHNpbmNlIHdlJ3JlIHBvbGxpbmcgb24gdGhlIGJ1cyB3YWl0aW5nIGZvciBUQUcgbWVzc2FnZXMuLiAqLworICBpZiAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSA9PSBHU1RfRVZFTlRfVEFHKSB7CisgICAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKworICAgIGdzdF9ldmVudF9wYXJzZV90YWcgKGV2ZW50LCAmdGFnbGlzdCk7CisKKyAgICBnc3RfYnVzX3Bvc3QgKGJ1cywgZ3N0X21lc3NhZ2VfbmV3X3RhZyAoR1NUX09CSkVDVCAocGFkKSwKKyAgICAgICAgICAgIGdzdF90YWdfbGlzdF9jb3B5ICh0YWdsaXN0KSkpOworICB9CisKKyAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAoraWN5ZGVtdXhfZm91bmRfcGFkIChHc3RFbGVtZW50ICogc3JjLCBHc3RQYWQgKiBwYWQsIGdwb2ludGVyIGRhdGEpCit7CisgIEdTVF9ERUJVRyAoImdvdCBuZXcgcGFkICUiIEdTVF9QVFJfRk9STUFULCBwYWQpOworCisgIC8qIFR1cm5zIG91dCB0aGF0IHRoaXMgYXNzZXJ0cyBhIHJlZmNvdW50IHdoaWNoIGlzIHdyb25nIGZvciB0aGlzCisgICAqIGNhc2UgKGFkZGluZyB0aGUgcGFkIGZyb20gYSBwYWQtYWRkZWQgY2FsbGJhY2spLCBzbyBqdXN0IGRvIHRoZSBzYW1lCisgICAqIHRoaW5nIGlubGluZS4uLiAqLworICAvKiBzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChpY3lkZW11eCwgJnNpbmt0ZW1wbGF0ZSwgTlVMTCk7ICovCisgIHNpbmtwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNpbmt0ZW1wbGF0ZSwgInNpbmsiKTsKKyAgZmFpbF9pZiAoc2lua3BhZCA9PSBOVUxMLCAiQ291bGRuJ3QgY3JlYXRlIHNpbmtwYWQiKTsKKyAgc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGljeWRlbXV4LCAic3JjIik7CisgIGZhaWxfaWYgKHNyY3BhZCA9PSBOVUxMLCAiRmFpbGVkIHRvIGdldCBzcmNwYWQgZnJvbSBpY3lkZW11eCIpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoc2lua3BhZCwgZ3N0X2NoZWNrX2NoYWluX2Z1bmMpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoc2lua3BhZCwgdGVzdF9ldmVudF9mdW5jKTsKKworICBHU1RfREVCVUcgKCJjaGVja2luZyBzcmNwYWQgJXAgcmVmY291bnQiLCBzcmNwYWQpOworICAvKiAxIGZyb20gZWxlbWVudCwgMSBmcm9tIHNpZ25hbCwgMSBmcm9tIHVzICovCisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHNyY3BhZCwgInNyY3BhZCIsIDMpOworCisgIEdTVF9ERUJVRyAoImxpbmtpbmcgc3JjcGFkIik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKHNyY3BhZCwgc2lua3BhZCkgPT0gR1NUX1BBRF9MSU5LX09LLAorICAgICAgIkZhaWxlZCB0byBsaW5rIHBhZHMiKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNpbmtwYWQsIFRSVUUpOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCitjcmVhdGVfaWN5ZGVtdXggKHZvaWQpCit7CisgIGljeWRlbXV4ID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJpY3lkZW11eCIpOworICBzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAoaWN5ZGVtdXgsICZzcmN0ZW1wbGF0ZSk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzcmNwYWQsIFRSVUUpOworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGljeWRlbXV4LCAicGFkLWFkZGVkIiwgR19DQUxMQkFDSyAoaWN5ZGVtdXhfZm91bmRfcGFkKSwKKyAgICAgIE5VTEwpOworCisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChpY3lkZW11eCwgYnVzKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChpY3lkZW11eCwgR1NUX1NUQVRFX1BMQVlJTkcpICE9CisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUsICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICByZXR1cm4gaWN5ZGVtdXg7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX2ljeWRlbXV4ICh2b2lkKQoreworICBnc3RfYnVzX3NldF9mbHVzaGluZyAoYnVzLCBUUlVFKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgYnVzID0gTlVMTDsKKworICBnc3RfY2hlY2tfZHJvcF9idWZmZXJzICgpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAoaWN5ZGVtdXgpOworICBpZiAoc2lua3BhZCkKKyAgICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKGljeWRlbXV4KTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGljeWRlbXV4KTsKKworICBzcmNwYWQgPSBOVUxMOworICBzaW5rcGFkID0gTlVMTDsKKyAgaWN5ZGVtdXggPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorcHVzaF9kYXRhIChjb25zdCBndWludDggKiBkYXRhLCBpbnQgbGVuLCBnaW50NjQgb2Zmc2V0KQoreworICBHc3RGbG93UmV0dXJuIHJlczsKKyAgR3N0QnVmZmVyICpidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGxlbik7CisKKyAgZ3N0X2J1ZmZlcl9maWxsIChidWZmZXIsIDAsIGRhdGEsIGxlbik7CisKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZmZlcikgPSBvZmZzZXQ7CisKKyAgcmVzID0gZ3N0X3BhZF9wdXNoIChzcmNwYWQsIGJ1ZmZlcik7CisKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBHU1RfRkxPV19PSywgIkZhaWxlZCBwdXNoaW5nIGJ1ZmZlcjogJWQiLCByZXMpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9kZW11eCkKK3sKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKyAgR3N0VGFnTGlzdCAqdGFnczsKKyAgY29uc3QgR1ZhbHVlICp0YWdfdmFsOworICBjb25zdCBnY2hhciAqdGFnOworICBHc3RDYXBzICpjYXBzOworCisgIGZhaWxfdW5sZXNzIChnc3RfdHlwZV9maW5kX3JlZ2lzdGVyIChOVUxMLCAic3VjY2VzcyIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICAgICAgdHlwZWZpbmRfc3VjY2VlZCwgTlVMTCwgZ3N0X3N0YXRpY19jYXBzX2dldCAoJnR5cGVmaW5kX2NhcHMpLCBOVUxMLAorICAgICAgICAgIE5VTEwpKTsKKworICBmYWtlX3R5cGVmaW5kX2NhcHMgPSBUUlVFOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoSUNZQ0FQUyk7CisKKyAgY3JlYXRlX2ljeWRlbXV4ICgpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChzcmNwYWQsIGljeWRlbXV4LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworCisgIHB1c2hfZGF0YSAoKGd1aW50OCAqKSBJQ1lfREFUQSwgc2l6ZW9mIChJQ1lfREFUQSksIC0xKTsKKworICBtZXNzYWdlID0gZ3N0X2J1c19wb2xsIChidXMsIEdTVF9NRVNTQUdFX1RBRywgLTEpOworICBmYWlsX3VubGVzcyAobWVzc2FnZSAhPSBOVUxMKTsKKworICBnc3RfbWVzc2FnZV9wYXJzZV90YWcgKG1lc3NhZ2UsICZ0YWdzKTsKKyAgZmFpbF91bmxlc3MgKHRhZ3MgIT0gTlVMTCk7CisKKyAgdGFnX3ZhbCA9IGdzdF90YWdfbGlzdF9nZXRfdmFsdWVfaW5kZXggKHRhZ3MsIEdTVF9UQUdfVElUTEUsIDApOworICBmYWlsX3VubGVzcyAodGFnX3ZhbCAhPSBOVUxMKTsKKworICB0YWcgPSBnX3ZhbHVlX2dldF9zdHJpbmcgKHRhZ192YWwpOworICBmYWlsX3VubGVzcyAodGFnICE9IE5VTEwpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKFRFU1RfTUVUQURBVEEsIChjaGFyICopIHRhZyk7CisKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdzKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgY2xlYW51cF9pY3lkZW11eCAoKTsKKworICBmYWtlX3R5cGVmaW5kX2NhcHMgPSBGQUxTRTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9kZW11eF9lbXB0eV9kYXRhKQoreworICBHc3RNZXNzYWdlICptZXNzYWdlOworICBHc3RUYWdMaXN0ICp0YWdzOworICBjb25zdCBHVmFsdWUgKnRhZ192YWw7CisgIGNvbnN0IGdjaGFyICp0YWc7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgZmFpbF91bmxlc3MgKGdzdF90eXBlX2ZpbmRfcmVnaXN0ZXIgKE5VTEwsICJzdWNjZXNzIiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgICAgICB0eXBlZmluZF9zdWNjZWVkLCBOVUxMLCBnc3Rfc3RhdGljX2NhcHNfZ2V0ICgmdHlwZWZpbmRfY2FwcyksIE5VTEwsCisgICAgICAgICAgTlVMTCkpOworCisgIGZha2VfdHlwZWZpbmRfY2FwcyA9IFRSVUU7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChJQ1lDQVBTKTsKKworICBjcmVhdGVfaWN5ZGVtdXggKCk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKHNyY3BhZCwgaWN5ZGVtdXgsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisKKyAgcHVzaF9kYXRhICgoZ3VpbnQ4ICopIElDWV9EQVRBX0VNUFRZX01FVEFEQVRBLAorICAgICAgc2l6ZW9mIChJQ1lfREFUQV9FTVBUWV9NRVRBREFUQSksIC0xKTsKKworICBtZXNzYWdlID0gZ3N0X2J1c19wb2xsIChidXMsIEdTVF9NRVNTQUdFX1RBRywgLTEpOworICBmYWlsX3VubGVzcyAobWVzc2FnZSAhPSBOVUxMKTsKKworICBnc3RfbWVzc2FnZV9wYXJzZV90YWcgKG1lc3NhZ2UsICZ0YWdzKTsKKyAgZmFpbF91bmxlc3MgKHRhZ3MgIT0gTlVMTCk7CisKKyAgdGFnX3ZhbCA9IGdzdF90YWdfbGlzdF9nZXRfdmFsdWVfaW5kZXggKHRhZ3MsIEdTVF9UQUdfVElUTEUsIDApOworICBmYWlsX3VubGVzcyAodGFnX3ZhbCAhPSBOVUxMKTsKKworICB0YWcgPSBnX3ZhbHVlX2dldF9zdHJpbmcgKHRhZ192YWwpOworICBmYWlsX3VubGVzcyAodGFnICE9IE5VTEwpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKFRFU1RfTUVUQURBVEEsIChjaGFyICopIHRhZyk7CisKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdzKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIG1lc3NhZ2UgPSBnc3RfYnVzX3BvbGwgKGJ1cywgR1NUX01FU1NBR0VfVEFHLCAtMSk7CisgIGZhaWxfdW5sZXNzIChtZXNzYWdlICE9IE5VTEwpOworCisgIGdzdF9tZXNzYWdlX3BhcnNlX3RhZyAobWVzc2FnZSwgJnRhZ3MpOworICBmYWlsX3VubGVzcyAodGFncyAhPSBOVUxMKTsKKworICB0YWdfdmFsID0gZ3N0X3RhZ19saXN0X2dldF92YWx1ZV9pbmRleCAodGFncywgR1NUX1RBR19USVRMRSwgMCk7CisgIGZhaWxfdW5sZXNzICh0YWdfdmFsID09IE5VTEwpOworCisgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICAvKiBFbnN1cmUgdGhhdCBubyBmdXJ0aGVyIHRhZyBtZXNzYWdlcyBhcmUgcmVjZWl2ZWQsIGkuZS4gdGhlIGVtcHR5IElDWSB0YWcKKyAgICogaXMgc2tpcHBlZCAqLworICBtZXNzYWdlID0gZ3N0X2J1c19wb2xsIChidXMsIEdTVF9NRVNTQUdFX1RBRywgMTAwMDAwMDAwKTsKKyAgZmFpbF91bmxlc3MgKG1lc3NhZ2UgPT0gTlVMTCk7CisKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGNsZWFudXBfaWN5ZGVtdXggKCk7CisKKyAgZmFrZV90eXBlZmluZF9jYXBzID0gRkFMU0U7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogcnVuIHRoaXMgdGVzdCBmaXJzdCBiZWZvcmUgdGhlIGN1c3RvbSB0eXBlZmluZCBmdW5jdGlvbiBpcyBzZXQgdXAgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ZpcnN0X2J1Zl9vZmZzZXRfd2hlbl9tZXJnZWRfZm9yX3R5cGVmaW5kaW5nKQoreworICBjb25zdCBndWludDggYnVmMVtdID0geyAnTScgfTsKKyAgY29uc3QgZ3VpbnQ4IGJ1ZjJbXSA9IHsgJ1AnLCAnKycsIDB4ZmYsIDB4ZmIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorICB9OworICBHc3RDYXBzICppY3lfY2FwczsKKyAgR3N0UGFkICppY3lfc3JjcGFkOworCisgIGZha2VfdHlwZWZpbmRfY2FwcyA9IEZBTFNFOworCisgIGNyZWF0ZV9pY3lkZW11eCAoKTsKKworICBpY3lfY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChJQ1lDQVBTKTsKKworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChzcmNwYWQsIGljeWRlbXV4LCBpY3lfY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKworICBwdXNoX2RhdGEgKGJ1ZjEsIEdfTl9FTEVNRU5UUyAoYnVmMSksIDApOworCisgIC8qIG9uZSBieXRlIGlzbid0IHJlYWxseSBlbm91Z2ggZm9yIHR5cGVmaW5kaW5nLCBjYW4ndCBoYXZlIGEgc3JjcGFkIHlldCAqLworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGljeWRlbXV4LCAic3JjIikgPT0gTlVMTCk7CisKKyAgcHVzaF9kYXRhIChidWYyLCBHX05fRUxFTUVOVFMgKGJ1ZjIpLCAtMSk7CisKKyAgLyogc2hvdWxkIGhhdmUgYmVlbiBlbm91Z2ggdG8gY3JlYXRlIGEgYXVkaW8veC1tdXNlcGFjayBzb3VyY2UgcGFkIC4uICovCisgIGljeV9zcmNwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoaWN5ZGVtdXgsICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKGljeV9zcmNwYWQgIT0gTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGljeV9zcmNwYWQpOworCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA+IDApOworCisgIC8qIGZpcnN0IGJ1ZmZlciBzaG91bGQgaGF2ZSBvZmZzZXQgMCBldmVuIGFmdGVyIGl0IHdhcyBtZXJnZWQgd2l0aCAybmQgYnVmICovCisgIGZhaWxfdW5sZXNzIChHU1RfQlVGRkVSX09GRlNFVCAoR1NUX0JVRkZFUl9DQVNUIChidWZmZXJzLT5kYXRhKSkgPT0gMCk7CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGljeV9jYXBzKTsKKworICBjbGVhbnVwX2ljeWRlbXV4ICgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X25vdF9uZWdvdGlhdGVkKQoreworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGNyZWF0ZV9pY3lkZW11eCAoKTsKKworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3JjcGFkLCBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoInRlc3QiKSk7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSk7CisKKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgwKTsKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikgPSAwOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9wYWRfcHVzaCAoc3JjcGFkLCBidWYpLCBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRCk7CisgIGJ1ZiA9IE5VTEw7CisKKyAgY2xlYW51cF9pY3lkZW11eCAoKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgoraWN5ZGVtdXhfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiaWN5ZGVtdXgiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZGVtdXgpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZGVtdXhfZW1wdHlfZGF0YSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9maXJzdF9idWZfb2Zmc2V0X3doZW5fbWVyZ2VkX2Zvcl90eXBlZmluZGluZyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ub3RfbmVnb3RpYXRlZCk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChpY3lkZW11eCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM2RlbXV4LmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9pZDNkZW11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YjUyNGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9pZDNkZW11eC5jCkBAIC0wLDAgKzEsMjgzIEBACisvKiBHU3RyZWFtZXIgdW5pdCB0ZXN0cyBmb3IgaWQzZGVtdXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCit0eXBlZGVmIHZvaWQgKENoZWNrVGFnc0Z1bmMpIChjb25zdCBHc3RUYWdMaXN0ICogdGFncywgY29uc3QgZ2NoYXIgKiBmaWxlKTsKKworc3RhdGljIEdzdEJ1c1N5bmNSZXBseQorZXJyb3JfY2IgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1zZywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBpZiAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSA9PSBHU1RfTUVTU0FHRV9FUlJPUikgeworICAgIGNvbnN0IGdjaGFyICpmaWxlID0gKGNvbnN0IGdjaGFyICopIHVzZXJfZGF0YTsKKyAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisgICAgZ2NoYXIgKmRiZyA9IE5VTEw7CisKKyAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobXNnLCAmZXJyLCAmZGJnKTsKKyAgICBnX2Vycm9yICgiRVJST1IgZm9yICVzOiAlc1xuJXNcbiIsIGZpbGUsIGVyci0+bWVzc2FnZSwgZGJnKTsKKyAgfQorCisgIHJldHVybiBHU1RfQlVTX1BBU1M7Cit9CisKK3N0YXRpYyBHc3RUYWdMaXN0ICoKK3JlYWRfdGFnc19mcm9tX2ZpbGUgKGNvbnN0IGdjaGFyICogZmlsZSwgZ2Jvb2xlYW4gcHVzaF9tb2RlKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiBzdGF0ZV9yZXQ7CisgIEdzdFRhZ0xpc3QgKnRhZ3MgPSBOVUxMOworICBHc3RNZXNzYWdlICptc2c7CisgIEdzdEVsZW1lbnQgKnNyYywgKnNlcCwgKnNpbmssICppZDNkZW11eCwgKnBpcGVsaW5lOworICBHc3RCdXMgKmJ1czsKKyAgZ2NoYXIgKnBhdGg7CisKKyAgcGlwZWxpbmUgPSBnc3RfcGlwZWxpbmVfbmV3ICgicGlwZWxpbmUiKTsKKyAgZmFpbF91bmxlc3MgKHBpcGVsaW5lICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIHBpcGVsaW5lISIpOworCisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKHBpcGVsaW5lKTsKKworICAvKiBraWRzLCBkb24ndCB1c2UgYSBzeW5jIGhhbmRsZXIgZm9yIHRoaXMgYXQgaG9tZSwgcmVhbGx5OyB3ZSBkbyBiZWNhdXNlCisgICAqIHdlIGp1c3Qgd2FudCB0byBhYm9ydCBhbmQgbm90aGluZyBlbHNlICovCisgIGdzdF9idXNfc2V0X3N5bmNfaGFuZGxlciAoYnVzLCBlcnJvcl9jYiwgKGdwb2ludGVyKSBmaWxlLCBOVUxMKTsKKworICBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmaWxlc3JjIiwgImZpbGVzcmMiKTsKKyAgZmFpbF91bmxlc3MgKHNyYyAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSAnZmlsZXNyYycgZWxlbWVudCEiKTsKKworICBpZiAocHVzaF9tb2RlKSB7CisgICAgc2VwID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicXVldWUiLCAicXVldWUiKTsKKyAgICBmYWlsX3VubGVzcyAoc2VwICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlICdxdWV1ZScgZWxlbWVudCIpOworICB9IGVsc2UgeworICAgIHNlcCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImlkZW50aXR5IiwgImlkZW50aXR5Iik7CisgICAgZmFpbF91bmxlc3MgKHNlcCAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSAnaWRlbnRpdHknIGVsZW1lbnQiKTsKKyAgfQorCisgIGlkM2RlbXV4ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiaWQzZGVtdXgiLCAiaWQzZGVtdXgiKTsKKyAgZmFpbF91bmxlc3MgKGlkM2RlbXV4ICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlICdpZDNkZW11eCcgZWxlbWVudCEiKTsKKworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAiZmFrZXNpbmsiKTsKKyAgZmFpbF91bmxlc3MgKHNpbmsgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgJ2Zha2VzaW5rJyBlbGVtZW50ISIpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc3JjLCBzZXAsIGlkM2RlbXV4LCBzaW5rLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGluayAoc3JjLCBzZXApKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmsgKHNlcCwgaWQzZGVtdXgpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmsgKGlkM2RlbXV4LCBzaW5rKSk7CisKKyAgcGF0aCA9IGdfYnVpbGRfZmlsZW5hbWUgKEdTVF9URVNUX0ZJTEVTX1BBVEgsIGZpbGUsIE5VTEwpOworICBHU1RfTE9HICgicmVhZGluZyBmaWxlICclcyciLCBwYXRoKTsKKyAgZ19vYmplY3Rfc2V0IChzcmMsICJsb2NhdGlvbiIsIHBhdGgsIE5VTEwpOworCisgIHN0YXRlX3JldCA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QQVVTRUQpOworICBmYWlsX3VubGVzcyAoc3RhdGVfcmV0ICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgaWYgKHN0YXRlX3JldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX0FTWU5DKSB7CisgICAgR1NUX0xPRyAoIndhaXRpbmcgZm9yIHBpcGVsaW5lIHRvIHJlYWNoIFBBVVNFRCBzdGF0ZSIpOworICAgIHN0YXRlX3JldCA9IGdzdF9lbGVtZW50X2dldF9zdGF0ZSAocGlwZWxpbmUsIE5VTEwsIE5VTEwsIC0xKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChzdGF0ZV9yZXQsIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisgIH0KKworICBHU1RfTE9HICgiUEFVU0VELCBsZXQncyByZXRyaWV2ZSBvdXIgdGFncyIpOworCisgIG1zZyA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9UQUcsIC0xKTsKKyAgZmFpbF91bmxlc3MgKG1zZyAhPSBOVUxMLCAiRXhwZWN0ZWQgVEFHIG1lc3NhZ2Ugb24gYnVzISAoJXMpIiwgZmlsZSk7CisKKyAgZ3N0X21lc3NhZ2VfcGFyc2VfdGFnIChtc2csICZ0YWdzKTsKKyAgZmFpbF91bmxlc3MgKHRhZ3MgIT0gTlVMTCwgIlRBRyBtZXNzYWdlIGRpZCBub3QgY29udGFpbiB0YWdsaXN0ISAoJXMpIiwgZmlsZSk7CisKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpLAorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworCisgIGdfZnJlZSAocGF0aCk7CisKKyAgR1NUX0lORk8gKCIlczogdGFncyA9ICUiIEdTVF9QVFJfRk9STUFULCBmaWxlLCB0YWdzKTsKKyAgcmV0dXJuIHRhZ3M7Cit9CisKK3N0YXRpYyB2b2lkCitydW5fY2hlY2tfZm9yX2ZpbGUgKGNvbnN0IGdjaGFyICogZmlsZW5hbWUsIENoZWNrVGFnc0Z1bmMgKiBjaGVja19mdW5jKQoreworICBHc3RUYWdMaXN0ICp0YWdzOworCisgIC8qIGZpcnN0LCBwdWxsLWJhc2VkICovCisgIHRhZ3MgPSByZWFkX3RhZ3NfZnJvbV9maWxlIChmaWxlbmFtZSwgRkFMU0UpOworICBmYWlsX3VubGVzcyAodGFncyAhPSBOVUxMLCAiRmFpbGVkIHRvIGV4dHJhY3QgdGFncyBmcm9tICclcyciLCBmaWxlbmFtZSk7CisgIGNoZWNrX2Z1bmMgKHRhZ3MsIGZpbGVuYW1lKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdzKTsKKworICAvKiBGSVhNRTogbmVlZCB0byBmaXggaWQzZGVtdXggZm9yIHNob3J0IGNvbnRlbnQgaW4gcHVzaCBtb2RlICovCisjaWYgMAorICAvKiBub3cgdHJ5IHB1c2gtYmFzZWQgKi8KKyAgdGFncyA9IHJlYWRfdGFnc19mcm9tX2ZpbGUgKGZpbGVuYW1lLCBUUlVFKTsKKyAgZmFpbF91bmxlc3MgKHRhZ3MgIT0gTlVMTCwgIkZhaWxlZCB0byBleHRyYWN0IHRhZ3MgZnJvbSAnJXMnIiwgZmlsZW5hbWUpOworICBjaGVja19mdW5jICh0YWdzLCBmaWxlbmFtZSk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFncyk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2RhdGVfMTk3N18wNl8yMyAoY29uc3QgR3N0VGFnTGlzdCAqIHRhZ3MsIGNvbnN0IGdjaGFyICogZmlsZSkKK3sKKyAgR3N0RGF0ZVRpbWUgKmRhdGUgPSBOVUxMOworCisgIGdzdF90YWdfbGlzdF9nZXRfZGF0ZV90aW1lICh0YWdzLCBHU1RfVEFHX0RBVEVfVElNRSwgJmRhdGUpOworICBmYWlsX3VubGVzcyAoZGF0ZSAhPSBOVUxMLAorICAgICAgIlRhZ3MgZnJvbSAlcyBzaG91bGQgY29udGFpbiBhIEdTVF9UQUdfREFURV9USU1FIHRhZyIpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZGF0ZV90aW1lX2dldF95ZWFyIChkYXRlKSwgMTk3Nyk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9kYXRlX3RpbWVfZ2V0X21vbnRoIChkYXRlKSwgNik7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9kYXRlX3RpbWVfZ2V0X2RheSAoZGF0ZSksIDIzKTsKKyAgZ3N0X2RhdGVfdGltZV91bnJlZiAoZGF0ZSk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3RkYXRfdHllcikKK3sKKyAgcnVuX2NoZWNrX2Zvcl9maWxlICgiaWQzLTQwNzM0OS0xLnRhZyIsIGNoZWNrX2RhdGVfMTk3N18wNl8yMyk7CisgIHJ1bl9jaGVja19mb3JfZmlsZSAoImlkMy00MDczNDktMi50YWciLCBjaGVja19kYXRlXzE5NzdfMDZfMjMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyB2b2lkCitjaGVja193Y29wIChjb25zdCBHc3RUYWdMaXN0ICogdGFncywgY29uc3QgZ2NoYXIgKiBmaWxlKQoreworICBnY2hhciAqY29weXJpZ2h0ID0gTlVMTDsKKyAgZ2NoYXIgKnVyaSA9IE5VTEw7CisKKyAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nICh0YWdzLCBHU1RfVEFHX0xJQ0VOU0VfVVJJLCAmdXJpKSk7CisgIGZhaWxfdW5sZXNzICh1cmkgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKHVyaSwKKyAgICAgICJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8zLjAvIik7CisgIGdfZnJlZSAodXJpKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ3MsIEdTVF9UQUdfQ09QWVJJR0hULCAmY29weXJpZ2h0KSk7CisgIGZhaWxfdW5sZXNzIChjb3B5cmlnaHQgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKGNvcHlyaWdodCwKKyAgICAgICIgU3RlYWRtYW4uIExpY2Vuc2VkIHRvIHRoZSBwdWJsaWMgdW5kZXIgaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLyB2ZXJpZnkgYXQgaHR0cDovL3Rlc3QuY29tIik7CisgIGdfZnJlZSAoY29weXJpZ2h0KTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfd2NvcCkKK3sKKyAgcnVuX2NoZWNrX2Zvcl9maWxlICgiaWQzLTQ0NzAwMC13Y29wLnRhZyIsIGNoZWNrX3djb3ApOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyB2b2lkCitjaGVja191bnN5bmNfdjIzIChjb25zdCBHc3RUYWdMaXN0ICogdGFncywgY29uc3QgZ2NoYXIgKiBmaWxlKQoreworICBnY2hhciAqYWxidW0gPSBOVUxMOworICBnY2hhciAqdGl0bGUgPSBOVUxMOworICBnY2hhciAqYXJ0aXN0ID0gTlVMTDsKKworICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ3MsIEdTVF9UQUdfVElUTEUsICZ0aXRsZSkpOworICBmYWlsX3VubGVzcyAodGl0bGUgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKHRpdGxlLCAiQVJUSVNUIik7ICAvKiBzaWMgKi8KKyAgZ19mcmVlICh0aXRsZSk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nICh0YWdzLCBHU1RfVEFHX0FMQlVNLCAmYWxidW0pKTsKKyAgZmFpbF91bmxlc3MgKGFsYnVtICE9IE5VTEwpOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nIChhbGJ1bSwgIkFsYnVtIik7CisgIGdfZnJlZSAoYWxidW0pOworCisgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZyAodGFncywgR1NUX1RBR19BUlRJU1QsICZhcnRpc3QpKTsKKyAgZmFpbF91bmxlc3MgKGFydGlzdCAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoYXJ0aXN0LCAi6Jed5Lq6Iik7CisgIGdfZnJlZSAoYXJ0aXN0KTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdW5zeW5jX3YyMykKK3sKKyAgcnVuX2NoZWNrX2Zvcl9maWxlICgiaWQzLTU3NzQ2OC11bnN5bmNlZC10YWcudGFnIiwgY2hlY2tfdW5zeW5jX3YyMyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIHZvaWQKK2NoZWNrX3Vuc3luY192MjQgKGNvbnN0IEdzdFRhZ0xpc3QgKiB0YWdzLCBjb25zdCBnY2hhciAqIGZpbGUpCit7CisgIGNvbnN0IEdWYWx1ZSAqdmFsOworICBHc3RTYW1wbGUgKnNhbXBsZTsKKyAgR3N0QnVmZmVyICpidWY7CisgIGdjaGFyICphbGJ1bSA9IE5VTEw7CisgIGdjaGFyICp0aXRsZSA9IE5VTEw7CisgIGdjaGFyICphcnRpc3QgPSBOVUxMOworICBHc3RNYXBJbmZvIG1hcDsKKworICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ3MsIEdTVF9UQUdfVElUTEUsICZ0aXRsZSkpOworICBmYWlsX3VubGVzcyAodGl0bGUgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKHRpdGxlLCAiU3RhcmxpZ2h0Iik7CisgIGdfZnJlZSAodGl0bGUpOworCisgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZyAodGFncywgR1NUX1RBR19BTEJVTSwgJmFsYnVtKSk7CisgIGZhaWxfdW5sZXNzIChhbGJ1bSAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoYWxidW0sICJMJ2FsYnVtUm9ja1ZvbC40IENEMSIpOworICBnX2ZyZWUgKGFsYnVtKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ3MsIEdTVF9UQUdfQVJUSVNULCAmYXJ0aXN0KSk7CisgIGZhaWxfdW5sZXNzIChhcnRpc3QgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKGFydGlzdCwgIk11c2UiKTsKKyAgZ19mcmVlIChhcnRpc3QpOworCisgIHZhbCA9IGdzdF90YWdfbGlzdF9nZXRfdmFsdWVfaW5kZXggKHRhZ3MsIEdTVF9UQUdfSU1BR0UsIDApOworICBmYWlsX3VubGVzcyAodmFsICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoR1NUX1ZBTFVFX0hPTERTX1NBTVBMRSAodmFsKSk7CisgIHNhbXBsZSA9IGdzdF92YWx1ZV9nZXRfc2FtcGxlICh2YWwpOworICBmYWlsX3VubGVzcyAoc2FtcGxlICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X3NhbXBsZV9nZXRfY2FwcyAoc2FtcGxlKSAhPSBOVUxMKTsKKyAgYnVmID0gZ3N0X3NhbXBsZV9nZXRfYnVmZmVyIChzYW1wbGUpOworICBmYWlsX3VubGVzcyAoYnVmICE9IE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChtYXAuc2l6ZSwgMzgwMjIpOworICAvKiBjaGVjayBmb3IganBlZyBzdGFydC9lbmQgbWFya2VycyAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChtYXAuZGF0YVswXSwgMHhmZik7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG1hcC5kYXRhWzFdLCAweGQ4KTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobWFwLmRhdGFbMzgwMjBdLCAweGZmKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobWFwLmRhdGFbMzgwMjFdLCAweGQ5KTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdW5zeW5jX3YyNCkKK3sKKyAgcnVuX2NoZWNrX2Zvcl9maWxlICgiaWQzLTU4ODE0OC11bnN5bmNlZC12MjQudGFnIiwgY2hlY2tfdW5zeW5jX3YyNCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK2lkM2RlbXV4X3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImlkM2RlbXV4Iik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3RkYXRfdHllcik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF93Y29wKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3Vuc3luY192MjMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdW5zeW5jX3YyNCk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChpZDNkZW11eCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM3YybXV4LmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9pZDN2Mm11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNDdmMWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9pZDN2Mm11eC5jCkBAIC0wLDAgKzEsNTIxIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIHRoZSB0YWdsaWItYmFzZWQgaWQzdjJtdXggZWxlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgVEVTVF9BUlRJU1QgICAgICAgICAgICJBciBUXDMwM1wyNTVzdCIKKyNkZWZpbmUgVEVTVF9USVRMRSAgICAgICAgICAgICJNXDMwM1wyNzRsbGVybWlsY2ghIgorI2RlZmluZSBURVNUX0FMQlVNICAgICAgICAgICAgIkJvb20iCisjZGVmaW5lIFRFU1RfREFURSAgICAgICAgICAgICBnX2RhdGVfbmV3X2RteSgxLDEsMjAwNikKKyNkZWZpbmUgVEVTVF9UUkFDS19OVU1CRVIgICAgIDcKKyNkZWZpbmUgVEVTVF9UUkFDS19DT1VOVCAgICAgIDE5CisjZGVmaW5lIFRFU1RfVk9MVU1FX05VTUJFUiAgICAyCisjZGVmaW5lIFRFU1RfVk9MVU1FX0NPVU5UICAgICAzCisjZGVmaW5lIFRFU1RfVFJBQ0tfR0FJTiAgICAgIDEuNDUKKyNkZWZpbmUgVEVTVF9BTEJVTV9HQUlOICAgICAgMC43OAorI2RlZmluZSBURVNUX1RSQUNLX1BFQUsgICAgICAwLjgzCisjZGVmaW5lIFRFU1RfQUxCVU1fUEVBSyAgICAgIDAuMTgKKyNkZWZpbmUgVEVTVF9CUE0gICAgICAgICAgICAgMTEzLjAKKworLyogZm9yIGR1bW15IG1wMyBmcmFtZSBzaXplZCBNUDNfRlJBTUVfU0laRSBieXRlcywKKyAqIHN0YXJ0OiBmZiBmYiBiMCA0NCAwMCAwMCAwOCAwMCAgMDAgNGIgMDAgMDAgMDAgMDAgMDAgMDAgKi8KK3N0YXRpYyBjb25zdCBndWludDggbXAzX2R1bW15aGRyW10gPSB7IDB4ZmYsIDB4ZmIsIDB4YjAsIDB4NDQsIDB4MDAsIDB4MDAsCisgIDB4MDgsIDB4MDAsIDB4NGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAKK307CisKKyNkZWZpbmUgTVAzX0ZSQU1FX1NJWkUgNjI2CisKKy8qIHRoZSBwZWFrIGFuZCBnYWluIHZhbHVlcyBhcmUgc3RvcmVkIHByZXR0eSByb3VnaGx5LCBzbyBjaGVjayB0aGF0IHRoZXkncmUKKyAqIHdpdGhpbiAyJSBvZiB0aGUgZXhwZWN0ZWQgdmFsdWUuCisgKi8KKyNkZWZpbmUgZmFpbF91bmxlc3Nfc29ydGFfZXF1YWxzX2Zsb2F0KGEsIGIpCQkJCVwKK0dfU1RNVF9TVEFSVCB7CQkJCQkJCQlcCisgIGRvdWJsZSBmaXJzdCA9IGE7CQkJCQkJCVwKKyAgZG91YmxlIHNlY29uZCA9IGI7CQkJCQkJCVwKKyAgZmFpbF91bmxlc3MoZmFicyAoZmlyc3QgLSBzZWNvbmQpIDwgKDAuMDIgKiBmYWJzIChmaXJzdCkpLAkJXAorICAgICAgIiciICNhICInICglZykgaXMgbm90IGVxdWFsIHRvICciICNiICInICglZykiLCBmaXJzdCwgc2Vjb25kKTsJXAorfSBHX1NUTVRfRU5EOworCisKK3N0YXRpYyBHc3RUYWdMaXN0ICoKK3Rlc3RfdGFnbGliX2lkM211eF9jcmVhdGVfdGFncyAoZ3VpbnQzMiBtYXNrKQoreworICBHc3RUYWdMaXN0ICp0YWdzOworCisgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgIGlmIChtYXNrICYgKDEgPDwgMCkpIHsKKyAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdzLCBHU1RfVEFHX01FUkdFX0tFRVAsCisgICAgICAgIEdTVF9UQUdfQVJUSVNULCBURVNUX0FSVElTVCwgTlVMTCk7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCAxKSkgeworICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ3MsIEdTVF9UQUdfTUVSR0VfS0VFUCwKKyAgICAgICAgR1NUX1RBR19USVRMRSwgVEVTVF9USVRMRSwgTlVMTCk7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCAyKSkgeworICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ3MsIEdTVF9UQUdfTUVSR0VfS0VFUCwKKyAgICAgICAgR1NUX1RBR19BTEJVTSwgVEVTVF9BTEJVTSwgTlVMTCk7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCAzKSkgeworICAgIEdEYXRlICpkYXRlOworCisgICAgZGF0ZSA9IFRFU1RfREFURTsKKyAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdzLCBHU1RfVEFHX01FUkdFX0tFRVAsIEdTVF9UQUdfREFURSwgZGF0ZSwgTlVMTCk7CisgICAgZ19kYXRlX2ZyZWUgKGRhdGUpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgNCkpIHsKKyAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdzLCBHU1RfVEFHX01FUkdFX0tFRVAsCisgICAgICAgIEdTVF9UQUdfVFJBQ0tfTlVNQkVSLCBURVNUX1RSQUNLX05VTUJFUiwgTlVMTCk7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCA1KSkgeworICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ3MsIEdTVF9UQUdfTUVSR0VfS0VFUCwKKyAgICAgICAgR1NUX1RBR19UUkFDS19DT1VOVCwgVEVTVF9UUkFDS19DT1VOVCwgTlVMTCk7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCA2KSkgeworICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ3MsIEdTVF9UQUdfTUVSR0VfS0VFUCwKKyAgICAgICAgR1NUX1RBR19BTEJVTV9WT0xVTUVfTlVNQkVSLCBURVNUX1ZPTFVNRV9OVU1CRVIsIE5VTEwpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgNykpIHsKKyAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdzLCBHU1RfVEFHX01FUkdFX0tFRVAsCisgICAgICAgIEdTVF9UQUdfQUxCVU1fVk9MVU1FX0NPVU5ULCBURVNUX1ZPTFVNRV9DT1VOVCwgTlVMTCk7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCA4KSkgeworICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ3MsIEdTVF9UQUdfTUVSR0VfS0VFUCwKKyAgICAgICAgR1NUX1RBR19UUkFDS19HQUlOLCBURVNUX1RSQUNLX0dBSU4sIE5VTEwpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgOSkpIHsKKyAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdzLCBHU1RfVEFHX01FUkdFX0tFRVAsCisgICAgICAgIEdTVF9UQUdfQUxCVU1fR0FJTiwgVEVTVF9BTEJVTV9HQUlOLCBOVUxMKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDEwKSkgeworICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ3MsIEdTVF9UQUdfTUVSR0VfS0VFUCwKKyAgICAgICAgR1NUX1RBR19UUkFDS19QRUFLLCBURVNUX1RSQUNLX1BFQUssIE5VTEwpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMTEpKSB7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFncywgR1NUX1RBR19NRVJHRV9LRUVQLAorICAgICAgICBHU1RfVEFHX0FMQlVNX1BFQUssIFRFU1RfQUxCVU1fUEVBSywgTlVMTCk7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCAxMikpIHsKKyAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdzLCBHU1RfVEFHX01FUkdFX0tFRVAsCisgICAgICAgIEdTVF9UQUdfQkVBVFNfUEVSX01JTlVURSwgVEVTVF9CUE0sIE5VTEwpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMTMpKSB7CisgIH0KKyAgcmV0dXJuIHRhZ3M7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgordXRmOF9zdHJpbmdfaW5fYnVmIChHc3RCdWZmZXIgKiBidWYsIGNvbnN0IGdjaGFyICogcykKK3sKKyAgZ2ludCBpLCBsZW47CisgIEdzdE1hcEluZm8gbWFwOworCisgIGxlbiA9IHN0cmxlbiAocyk7CisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGZvciAoaSA9IDA7IGkgPCAobWFwLnNpemUgLSBsZW4pOyArK2kpIHsKKyAgICBpZiAobWVtY21wIChtYXAuZGF0YSArIGksIHMsIGxlbikgPT0gMCkgeworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfdGFnbGliX2lkM211eF9jaGVja190YWdfYnVmZmVyIChHc3RCdWZmZXIgKiBidWYsIGd1aW50MzIgbWFzaykKK3sKKyAgLyogbWFrZSBzdXJlIG91ciBVVEYtOCBzdHJpbmcgaGFzbid0IGJlZW4gcHV0IGludG8gdGhlIHRhZyBhcyBJU08tODg1OS0xICovCisgIGlmIChtYXNrICYgKDEgPDwgMCkpIHsKKyAgICBmYWlsX3VubGVzcyAodXRmOF9zdHJpbmdfaW5fYnVmIChidWYsIFRFU1RfQVJUSVNUKSk7CisgIH0KKyAgLyogbWFrZSBzdXJlIG91ciBVVEYtOCBzdHJpbmcgaGFzbid0IGJlZW4gcHV0IGludG8gdGhlIHRhZyBhcyBJU08tODg1OS0xICovCisgIGlmIChtYXNrICYgKDEgPDwgMSkpIHsKKyAgICBmYWlsX3VubGVzcyAodXRmOF9zdHJpbmdfaW5fYnVmIChidWYsIFRFU1RfVElUTEUpKTsKKyAgfQorICAvKiBtYWtlIHN1cmUgb3VyIFVURi04IHN0cmluZyBoYXNuJ3QgYmVlbiBwdXQgaW50byB0aGUgdGFnIGFzIElTTy04ODU5LTEgKi8KKyAgaWYgKG1hc2sgJiAoMSA8PCAyKSkgeworICAgIGZhaWxfdW5sZXNzICh1dGY4X3N0cmluZ19pbl9idWYgKGJ1ZiwgVEVTVF9BTEJVTSkpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3RhZ2xpYl9pZDNtdXhfY2hlY2tfdGFncyAoR3N0VGFnTGlzdCAqIHRhZ3MsIGd1aW50MzIgbWFzaykKK3sKKyAgaWYgKG1hc2sgJiAoMSA8PCAwKSkgeworICAgIGdjaGFyICpzID0gTlVMTDsKKworICAgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZyAodGFncywgR1NUX1RBR19BUlRJU1QsICZzKSk7CisgICAgZmFpbF91bmxlc3MgKGdfc3RyX2VxdWFsIChzLCBURVNUX0FSVElTVCkpOworICAgIGdfZnJlZSAocyk7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCAxKSkgeworICAgIGdjaGFyICpzID0gTlVMTDsKKworICAgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZyAodGFncywgR1NUX1RBR19USVRMRSwgJnMpKTsKKyAgICBmYWlsX3VubGVzcyAoZ19zdHJfZXF1YWwgKHMsIFRFU1RfVElUTEUpKTsKKyAgICBnX2ZyZWUgKHMpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMikpIHsKKyAgICBnY2hhciAqcyA9IE5VTEw7CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ3MsIEdTVF9UQUdfQUxCVU0sICZzKSk7CisgICAgZmFpbF91bmxlc3MgKGdfc3RyX2VxdWFsIChzLCBURVNUX0FMQlVNKSk7CisgICAgZ19mcmVlIChzKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDMpKSB7CisgICAgR0RhdGUgKnNob3VsZGJlLCAqZGF0ZSA9IE5VTEw7CisKKyAgICBzaG91bGRiZSA9IFRFU1RfREFURTsKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9kYXRlICh0YWdzLCBHU1RfVEFHX0RBVEUsICZkYXRlKSk7CisgICAgZmFpbF91bmxlc3MgKGdfZGF0ZV9jb21wYXJlIChzaG91bGRiZSwgZGF0ZSkgPT0gMCk7CisgICAgZ19kYXRlX2ZyZWUgKHNob3VsZGJlKTsKKyAgICBnX2RhdGVfZnJlZSAoZGF0ZSk7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCA0KSkgeworICAgIGd1aW50IG51bTsKKworICAgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X3VpbnQgKHRhZ3MsIEdTVF9UQUdfVFJBQ0tfTlVNQkVSLCAmbnVtKSk7CisgICAgZmFpbF91bmxlc3MgKG51bSA9PSBURVNUX1RSQUNLX05VTUJFUik7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCA1KSkgeworICAgIGd1aW50IGNvdW50OworCisgICAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfdWludCAodGFncywgR1NUX1RBR19UUkFDS19DT1VOVCwgJmNvdW50KSk7CisgICAgZmFpbF91bmxlc3MgKGNvdW50ID09IFRFU1RfVFJBQ0tfQ09VTlQpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgNikpIHsKKyAgICBndWludCBudW07CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF91aW50ICh0YWdzLCBHU1RfVEFHX0FMQlVNX1ZPTFVNRV9OVU1CRVIsCisgICAgICAgICAgICAmbnVtKSk7CisgICAgZmFpbF91bmxlc3MgKG51bSA9PSBURVNUX1ZPTFVNRV9OVU1CRVIpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgNykpIHsKKyAgICBndWludCBjb3VudDsKKworICAgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X3VpbnQgKHRhZ3MsIEdTVF9UQUdfQUxCVU1fVk9MVU1FX0NPVU5ULAorICAgICAgICAgICAgJmNvdW50KSk7CisgICAgZmFpbF91bmxlc3MgKGNvdW50ID09IFRFU1RfVk9MVU1FX0NPVU5UKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDgpKSB7CisgICAgZ2RvdWJsZSBnYWluOworCisgICAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdzLCBHU1RfVEFHX1RSQUNLX0dBSU4sICZnYWluKSk7CisgICAgZmFpbF91bmxlc3Nfc29ydGFfZXF1YWxzX2Zsb2F0IChnYWluLCBURVNUX1RSQUNLX0dBSU4pOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgOSkpIHsKKyAgICBnZG91YmxlIGdhaW47CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKHRhZ3MsIEdTVF9UQUdfQUxCVU1fR0FJTiwgJmdhaW4pKTsKKyAgICBmYWlsX3VubGVzc19zb3J0YV9lcXVhbHNfZmxvYXQgKGdhaW4sIFRFU1RfQUxCVU1fR0FJTik7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCAxMCkpIHsKKyAgICBnZG91YmxlIHBlYWs7CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKHRhZ3MsIEdTVF9UQUdfVFJBQ0tfUEVBSywgJnBlYWspKTsKKyAgICBmYWlsX3VubGVzc19zb3J0YV9lcXVhbHNfZmxvYXQgKHBlYWssIFRFU1RfVFJBQ0tfUEVBSyk7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCAxMSkpIHsKKyAgICBnZG91YmxlIHBlYWs7CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKHRhZ3MsIEdTVF9UQUdfQUxCVU1fUEVBSywgJnBlYWspKTsKKyAgICBmYWlsX3VubGVzc19zb3J0YV9lcXVhbHNfZmxvYXQgKHBlYWssIFRFU1RfQUxCVU1fUEVBSyk7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCAxMikpIHsKKyAgICBnZG91YmxlIGJwbTsKKworICAgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZSAodGFncywgR1NUX1RBR19CRUFUU19QRVJfTUlOVVRFLAorICAgICAgICAgICAgJmJwbSkpOworICAgIGZhaWxfdW5sZXNzX3NvcnRhX2VxdWFsc19mbG9hdCAoYnBtLCBURVNUX0JQTSk7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCAxMykpIHsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZmlsbF9tcDNfYnVmZmVyIChHc3RFbGVtZW50ICogZmFrZXNyYywgR3N0QnVmZmVyICogYnVmLCBHc3RQYWQgKiBwYWQsCisgICAgZ3VpbnQ2NCAqIHBfb2Zmc2V0KQoreworICBnc2l6ZSBzaXplOworCisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpOworCisgIGZhaWxfdW5sZXNzIChzaXplID09IE1QM19GUkFNRV9TSVpFKTsKKworICBHU1RfTE9HICgiZmlsbGluZyBidWZmZXIgd2l0aCBmYWtlIG1wMyBkYXRhLCBvZmZzZXQgPSAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgKnBfb2Zmc2V0KTsKKworICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgbXAzX2R1bW15aGRyLCBzaXplb2YgKG1wM19kdW1teWhkcikpOworCisjaWYgMAorICAvKiBjYW4ndCB1c2UgZ3N0X2J1ZmZlcl9zZXRfY2FwcygpIGhlcmUgYmVjYXVzZSB0aGUgbWV0YWRhdGEgaXNuJ3Qgd3JpdGFibGUKKyAgICogYmVjYXVzZSBvZiB0aGUgZXh0cmEgcmVmY291bnRzIHRha2VuIGJ5IHRoZSBzaWduYWwgZW1pc3Npb24gbWVjaGFuaXNtOworICAgKiB3ZSBrbm93IGl0J3MgZmluZSB0byB1c2UgR1NUX0JVRkZFUl9DQVBTKCkgaGVyZSB0aG91Z2ggKi8KKyAgR1NUX0JVRkZFUl9DQVBTIChidWYpID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL21wZWciLCAibXBlZ3ZlcnNpb24iLAorICAgICAgR19UWVBFX0lOVCwgMSwgImxheWVyIiwgR19UWVBFX0lOVCwgMywgTlVMTCk7CisjZW5kaWYKKworICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSA9ICpwX29mZnNldDsKKyAgKnBfb2Zmc2V0ICs9IHNpemU7Cit9CisKK3N0YXRpYyB2b2lkCitnb3RfYnVmZmVyIChHc3RFbGVtZW50ICogZmFrZXNpbmssIEdzdEJ1ZmZlciAqIGJ1ZiwgR3N0UGFkICogcGFkLAorICAgIEdzdEJ1ZmZlciAqKiBwX2J1ZikKK3sKKyAgZ2ludDY0IG9mZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgb2ZmID0gR1NUX0JVRkZFUl9PRkZTRVQgKGJ1Zik7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICBHU1RfTE9HICgic2l6ZT0lIiBHX0dTSVpFX0ZPUk1BVCAiLCBvZmZzZXQ9JSIgR19HSU5UNjRfRk9STUFULCBtYXAuc2l6ZSwgb2ZmKTsKKworICBmYWlsX3VubGVzcyAoR1NUX0JVRkZFUl9PRkZTRVRfSVNfVkFMSUQgKGJ1ZikpOworCisgIGlmICgqcF9idWYgPT0gTlVMTCB8fCAob2ZmICsgbWFwLnNpemUpID4gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoKnBfYnVmKSkgeworICAgIEdzdEJ1ZmZlciAqbmV3YnVmOworCisgICAgLyogbm90IHZlcnkgZWxlZ2FudCwgYnV0IHdobyBjYXJlcyAqLworICAgIG5ld2J1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAob2ZmICsgbWFwLnNpemUpOworICAgIGlmICgqcF9idWYpIHsKKyAgICAgIEdzdE1hcEluZm8gcG1hcDsKKworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKCpwX2J1ZiwgJnBtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICBnc3RfYnVmZmVyX2ZpbGwgKG5ld2J1ZiwgMCwgcG1hcC5kYXRhLCBwbWFwLnNpemUpOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoKnBfYnVmLCAmcG1hcCk7CisgICAgfQorICAgIGdzdF9idWZmZXJfZmlsbCAobmV3YnVmLCBvZmYsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisKKyAgICBpZiAoKnBfYnVmKQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoKnBfYnVmKTsKKyAgICAqcF9idWYgPSBuZXdidWY7CisgIH0gZWxzZSB7CisgICAgZ3N0X2J1ZmZlcl9maWxsICgqcF9idWYsIG9mZiwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworfQorCitzdGF0aWMgdm9pZAordGVzdF90YWdsaWJfaWQzbXV4X2NoZWNrX291dHB1dF9idWZmZXIgKEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50IG9mZjsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBnX2Fzc2VydCAobWFwLnNpemUgJSBNUDNfRlJBTUVfU0laRSA9PSAwKTsKKworICBmb3IgKG9mZiA9IDA7IG9mZiA8IG1hcC5zaXplOyBvZmYgKz0gTVAzX0ZSQU1FX1NJWkUpIHsKKyAgICBmYWlsX3VubGVzcyAobWVtY21wIChtYXAuZGF0YSArIG9mZiwgbXAzX2R1bW15aGRyLAorICAgICAgICAgICAgc2l6ZW9mIChtcDNfZHVtbXloZHIpKSA9PSAwKTsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworfQorCitzdGF0aWMgdm9pZAoraWRlbnRpdHlfY2IgKEdzdEVsZW1lbnQgKiBpZGVudGl0eSwgR3N0QnVmZmVyICogYnVmLCBHc3RCdWZmZXIgKiogcF90YWdidWYpCit7CisgIGlmICgqcF90YWdidWYgPT0gTlVMTCkgeworICAgICpwX3RhZ2J1ZiA9IGdzdF9idWZmZXJfcmVmIChidWYpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3RhZ2xpYl9pZDNtdXhfd2l0aF90YWdzIChHc3RUYWdMaXN0ICogdGFncywgZ3VpbnQzMiBtYXNrKQoreworICBHc3RNZXNzYWdlICptc2c7CisgIEdzdFRhZ0xpc3QgKnRhZ3NfcmVhZCA9IE5VTEw7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lLCAqaWQzbXV4LCAqaWQzZGVtdXgsICpmYWtlc3JjLCAqaWRlbnRpdHksICpmYWtlc2luazsKKyAgR3N0QnVzICpidXM7CisgIGd1aW50NjQgb2Zmc2V0OworICBHc3RCdWZmZXIgKm91dGJ1ZiA9IE5VTEw7CisgIEdzdEJ1ZmZlciAqdGFnYnVmID0gTlVMTDsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3RhdGVfcmVzdWx0OworCisgIHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIGdfYXNzZXJ0IChwaXBlbGluZSAhPSBOVUxMKTsKKworICBmYWtlc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNyYyIsICJmYWtlc3JjIik7CisgIGdfYXNzZXJ0IChmYWtlc3JjICE9IE5VTEwpOworCisgIGlkM211eCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImlkM3YybXV4IiwgImlkM3YybXV4Iik7CisgIGdfYXNzZXJ0IChpZDNtdXggIT0gTlVMTCk7CisKKyAgaWRlbnRpdHkgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJpZGVudGl0eSIsICJpZGVudGl0eSIpOworICBnX2Fzc2VydCAoaWRlbnRpdHkgIT0gTlVMTCk7CisKKyAgaWQzZGVtdXggPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJpZDNkZW11eCIsICJpZDNkZW11eCIpOworICBnX2Fzc2VydCAoaWQzZGVtdXggIT0gTlVMTCk7CisKKyAgZmFrZXNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsICJmYWtlc2luayIpOworICBnX2Fzc2VydCAoZmFrZXNpbmsgIT0gTlVMTCk7CisKKyAgLyogc2V0IHVwIHNpbmsgKi8KKyAgb3V0YnVmID0gTlVMTDsKKyAgZ19vYmplY3Rfc2V0IChmYWtlc2luaywgInNpZ25hbC1oYW5kb2ZmcyIsIFRSVUUsIE5VTEwpOworICBnX3NpZ25hbF9jb25uZWN0IChmYWtlc2luaywgImhhbmRvZmYiLCBHX0NBTExCQUNLIChnb3RfYnVmZmVyKSwgJm91dGJ1Zik7CisKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgZmFrZXNyYyk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIGlkM211eCk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIGlkZW50aXR5KTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgaWQzZGVtdXgpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBmYWtlc2luayk7CisKKyAgZ3N0X3RhZ19zZXR0ZXJfbWVyZ2VfdGFncyAoR1NUX1RBR19TRVRURVIgKGlkM211eCksIHRhZ3MsCisgICAgICBHU1RfVEFHX01FUkdFX0FQUEVORCk7CisKKyAgZ3N0X2VsZW1lbnRfbGlua19tYW55IChmYWtlc3JjLCBpZDNtdXgsIGlkZW50aXR5LCBpZDNkZW11eCwgZmFrZXNpbmssIE5VTEwpOworCisgIC8qIHNldCB1cCBzb3VyY2UgKi8KKyAgZ19vYmplY3Rfc2V0IChmYWtlc3JjLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgImNhbi1hY3RpdmF0ZS1wdWxsIiwgRkFMU0UsCisgICAgICAiZmlsbHR5cGUiLCAyLCAic2l6ZXR5cGUiLCAyLCAic2l6ZW1heCIsIE1QM19GUkFNRV9TSVpFLAorICAgICAgIm51bS1idWZmZXJzIiwgMTYsIE5VTEwpOworCisgIG9mZnNldCA9IDA7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGZha2VzcmMsICJoYW5kb2ZmIiwgR19DQUxMQkFDSyAoZmlsbF9tcDNfYnVmZmVyKSwgJm9mZnNldCk7CisKKyAgLyogc2V0IHVwIGlkZW50aXR5IHRvIGNhdGNoIHRhZyBidWZmZXIgKi8KKyAgZ19zaWduYWxfY29ubmVjdCAoaWRlbnRpdHksICJoYW5kb2ZmIiwgR19DQUxMQkFDSyAoaWRlbnRpdHlfY2IpLCAmdGFnYnVmKTsKKworICBHU1RfTE9HICgic2V0dGluZyBhbmQgZ2V0dGluZyBzdGF0ZSAuLi4iKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBzdGF0ZV9yZXN1bHQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKHBpcGVsaW5lLCBOVUxMLCBOVUxMLCAtMSk7CisgIGZhaWxfdW5sZXNzIChzdGF0ZV9yZXN1bHQgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgIlVuZXhwZWN0ZWQgcmVzdWx0IGZyb20gZ2V0X3N0YXRlKCkuIEV4cGVjdGVkIHN1Y2Nlc3MsIGdvdCAlZCIsCisgICAgICBzdGF0ZV9yZXN1bHQpOworCisgIGJ1cyA9IGdzdF9waXBlbGluZV9nZXRfYnVzIChHU1RfUElQRUxJTkUgKHBpcGVsaW5lKSk7CisKKyAgR1NUX0xPRyAoIldhaXRpbmcgZm9yIHRhZyAuLi4iKTsKKyAgbXNnID0KKyAgICAgIGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9UQUcgfCBHU1RfTUVTU0FHRV9FT1MgfCBHU1RfTUVTU0FHRV9FUlJPUiwKKyAgICAgIC0xKTsKKyAgaWYgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRVJST1IpIHsKKyAgICBHRXJyb3IgKmVycjsKKyAgICBnY2hhciAqZGJnOworCisgICAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1zZywgJmVyciwgJmRiZyk7CisgICAgZ19wcmludGVyciAoIkVSUk9SIGZyb20gZWxlbWVudCAlczogJXNcbiVzXG4iLAorICAgICAgICBHU1RfT0JKRUNUX05BTUUgKG1zZy0+c3JjKSwgZXJyLT5tZXNzYWdlLCBHU1RfU1RSX05VTEwgKGRiZykpOworICAgIGdfZXJyb3JfZnJlZSAoZXJyKTsKKyAgICBnX2ZyZWUgKGRiZyk7CisgIH0gZWxzZSBpZiAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSA9PSBHU1RfTUVTU0FHRV9FT1MpIHsKKyAgICBnX3ByaW50ZXJyICgiRU9TIG1lc3NhZ2UsIGJ1dCB3ZXJlIHdhaXRpbmcgZm9yIFRBR1MhXG4iKTsKKyAgfQorICBmYWlsX3VubGVzcyAobXNnLT50eXBlID09IEdTVF9NRVNTQUdFX1RBRyk7CisKKyAgZ3N0X21lc3NhZ2VfcGFyc2VfdGFnIChtc2csICZ0YWdzX3JlYWQpOworICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKworICBHU1RfTE9HICgiR290IHRhZ3M6ICUiIEdTVF9QVFJfRk9STUFULCB0YWdzX3JlYWQpOworICB0ZXN0X3RhZ2xpYl9pZDNtdXhfY2hlY2tfdGFncyAodGFnc19yZWFkLCBtYXNrKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdzX3JlYWQpOworCisgIGZhaWxfdW5sZXNzICh0YWdidWYgIT0gTlVMTCk7CisgIHRlc3RfdGFnbGliX2lkM211eF9jaGVja190YWdfYnVmZmVyICh0YWdidWYsIG1hc2spOworICBnc3RfYnVmZmVyX3VucmVmICh0YWdidWYpOworCisgIEdTVF9MT0cgKCJXYWl0aW5nIGZvciBFT1MgLi4uIik7CisgIG1zZyA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9FT1MgfCBHU1RfTUVTU0FHRV9FUlJPUiwgLTEpOworICBpZiAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSA9PSBHU1RfTUVTU0FHRV9FUlJPUikgeworICAgIEdFcnJvciAqZXJyOworICAgIGdjaGFyICpkYmc7CisKKyAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobXNnLCAmZXJyLCAmZGJnKTsKKyAgICBnX3ByaW50ZXJyICgiRVJST1IgZnJvbSBlbGVtZW50ICVzOiAlc1xuJXNcbiIsCisgICAgICAgIEdTVF9PQkpFQ1RfTkFNRSAobXNnLT5zcmMpLCBlcnItPm1lc3NhZ2UsIEdTVF9TVFJfTlVMTCAoZGJnKSk7CisgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICAgIGdfZnJlZSAoZGJnKTsKKyAgfQorICBmYWlsX3VubGVzcyAobXNnLT50eXBlID09IEdTVF9NRVNTQUdFX0VPUyk7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgR1NUX0xPRyAoIkdvdCBFT1MsIHNodXR0aW5nIGRvd24gLi4uIik7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworCisgIHRlc3RfdGFnbGliX2lkM211eF9jaGVja19vdXRwdXRfYnVmZmVyIChvdXRidWYpOworICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWYpOworCisgIEdTVF9MT0cgKCJEb25lIik7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2lkM3YybXV4KQoreworICBHc3RUYWdMaXN0ICp0YWdzOworICBnaW50IGk7CisKKyAgZ19yYW5kb21fc2V0X3NlZWQgKDI0NzE2NjI5NSk7CisKKyAgLyogaW50ZXJuYWwgY29uc2lzdGVuY3kgY2hlY2sgKi8KKyAgdGFncyA9IHRlc3RfdGFnbGliX2lkM211eF9jcmVhdGVfdGFncyAoMHhGRkZGRkZGRik7CisgIHRlc3RfdGFnbGliX2lkM211eF9jaGVja190YWdzICh0YWdzLCAweEZGRkZGRkZGKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdzKTsKKworICAvKiBub3cgdGhlIHJlYWwgdGVzdHMgKi8KKyAgZm9yIChpID0gMDsgaSA8IDUwOyArK2kpIHsKKyAgICBndWludDMyIG1hc2s7CisKKyAgICBtYXNrID0gZ19yYW5kb21faW50ICgpOworICAgIEdTVF9MT0cgKCJ0YWcgbWFzayA9ICUwOHggKGk9JWQpIiwgbWFzaywgaSk7CisKKyAgICBpZiAobWFzayA9PSAwKQorICAgICAgY29udGludWU7CisKKyAgICAvKiBjcmVhdGUgdGFncyAqLworICAgIHRhZ3MgPSB0ZXN0X3RhZ2xpYl9pZDNtdXhfY3JlYXRlX3RhZ3MgKG1hc2spOworICAgIEdTVF9MT0cgKCJ0YWdzIGZvciBtYXNrICUwOHggPSAlIiBHU1RfUFRSX0ZPUk1BVCwgbWFzaywgdGFncyk7CisKKyAgICAvKiBkb3VibGUtY2hlY2sgZm9yIGludGVybmFsIGNvbnNpc3RlbmN5ICovCisgICAgdGVzdF90YWdsaWJfaWQzbXV4X2NoZWNrX3RhZ3MgKHRhZ3MsIG1hc2spOworCisgICAgLyogdGVzdCB3aXRoIHBpcGVsaW5lICovCisgICAgdGVzdF90YWdsaWJfaWQzbXV4X3dpdGhfdGFncyAodGFncywgbWFzayk7CisKKyAgICAvKiBmcmVlIHRhZ3MgKi8KKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ3MpOworICB9Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK2lkM3YybXV4X3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImlkM3YybXV4Iik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2lkM3YybXV4KTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGlkM3YybXV4KTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2ltYWdlZnJlZXplLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9pbWFnZWZyZWV6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZWZmMzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9pbWFnZWZyZWV6ZS5jCkBAIC0wLDAgKzEsNTg2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworc3RhdGljIGdib29sZWFuCitidXNfaGFuZGxlciAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR01haW5Mb29wICpsb29wID0gKEdNYWluTG9vcCAqKSBkYXRhOworCisgIHN3aXRjaCAobWVzc2FnZS0+dHlwZSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfRU9TOgorICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX1dBUk5JTkc6CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FUlJPUjp7CisgICAgICBHRXJyb3IgKmdlcnJvcjsKKyAgICAgIGdjaGFyICpkZWJ1ZzsKKworICAgICAgaWYgKG1lc3NhZ2UtPnR5cGUgPT0gR1NUX01FU1NBR0VfV0FSTklORykKKyAgICAgICAgZ3N0X21lc3NhZ2VfcGFyc2Vfd2FybmluZyAobWVzc2FnZSwgJmdlcnJvciwgJmRlYnVnKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1lc3NhZ2UsICZnZXJyb3IsICZkZWJ1Zyk7CisgICAgICBnX2Vycm9yICgiZXJyb3IgZnJvbSAlczogJXMgKCVzKVxuIiwKKyAgICAgICAgICBHU1RfRUxFTUVOVF9OQU1FIChHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpKSwgZ2Vycm9yLT5tZXNzYWdlLAorICAgICAgICAgIEdTVF9TVFJfTlVMTCAoZGVidWcpKTsKKyAgICAgIGdfZXJyb3JfZnJlZSAoZ2Vycm9yKTsKKyAgICAgIGdfZnJlZSAoZGVidWcpOworICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX2ltYWdlZnJlZXplIChjb25zdCBHc3RDYXBzICogY2FwczEsIGNvbnN0IEdzdENhcHMgKiBjYXBzMiwKKyAgICBHQ2FsbGJhY2sgc2lua19oYW5kb2ZmLCBncG9pbnRlciBzaW5rX2hhbmRvZmZfZGF0YSkKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdEVsZW1lbnQgKnZpZGVvdGVzdHNyYywgKmNhcHNmaWx0ZXIxLCAqaW1hZ2VmcmVlemUsICpjYXBzZmlsdGVyMiwgKmZha2VzaW5rOworCisgIHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIGZhaWxfdW5sZXNzIChwaXBlbGluZSAhPSBOVUxMKTsKKworICB2aWRlb3Rlc3RzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCAic3JjIik7CisgIGZhaWxfdW5sZXNzICh2aWRlb3Rlc3RzcmMgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAodmlkZW90ZXN0c3JjLCAibnVtLWJ1ZmZlcnMiLCAxLCBOVUxMKTsKKworICBjYXBzZmlsdGVyMSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImNhcHNmaWx0ZXIiLCAiZmlsdGVyMSIpOworICBmYWlsX3VubGVzcyAoY2Fwc2ZpbHRlcjEgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoY2Fwc2ZpbHRlcjEsICJjYXBzIiwgY2FwczEsIE5VTEwpOworCisgIGltYWdlZnJlZXplID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiaW1hZ2VmcmVlemUiLCAiZnJlZXplIik7CisgIGZhaWxfdW5sZXNzIChpbWFnZWZyZWV6ZSAhPSBOVUxMKTsKKworICBjYXBzZmlsdGVyMiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImNhcHNmaWx0ZXIiLCAiZmlsdGVyMiIpOworICBmYWlsX3VubGVzcyAoY2Fwc2ZpbHRlcjIgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoY2Fwc2ZpbHRlcjIsICJjYXBzIiwgY2FwczIsIE5VTEwpOworCisgIGZha2VzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAic2luayIpOworICBmYWlsX3VubGVzcyAoZmFrZXNpbmsgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoZmFrZXNpbmssICJzaWduYWwtaGFuZG9mZnMiLCBUUlVFLCAiYXN5bmMiLCBGQUxTRSwgTlVMTCk7CisKKyAgaWYgKHNpbmtfaGFuZG9mZikKKyAgICBnX3NpZ25hbF9jb25uZWN0IChmYWtlc2luaywgImhhbmRvZmYiLCBzaW5rX2hhbmRvZmYsIHNpbmtfaGFuZG9mZl9kYXRhKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHZpZGVvdGVzdHNyYywgY2Fwc2ZpbHRlcjEsIGltYWdlZnJlZXplLAorICAgICAgY2Fwc2ZpbHRlcjIsIGZha2VzaW5rLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGlua19wYWRzICh2aWRlb3Rlc3RzcmMsICJzcmMiLCBjYXBzZmlsdGVyMSwKKyAgICAgICAgICAic2luayIpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmtfcGFkcyAoY2Fwc2ZpbHRlcjEsICJzcmMiLCBpbWFnZWZyZWV6ZSwgInNpbmsiKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rX3BhZHMgKGltYWdlZnJlZXplLCAic3JjIiwgY2Fwc2ZpbHRlcjIsICJzaW5rIikpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGlua19wYWRzIChjYXBzZmlsdGVyMiwgInNyYyIsIGZha2VzaW5rLCAic2luayIpKTsKKworICByZXR1cm4gcGlwZWxpbmU7Cit9CisKK3N0YXRpYyB2b2lkCitzaW5rX2hhbmRvZmZfY2JfMF8xIChHc3RFbGVtZW50ICogb2JqZWN0LCBHc3RCdWZmZXIgKiBidWZmZXIsIEdzdFBhZCAqIHBhZCwKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGd1aW50ICpuX2J1ZmZlcnMgPSAoZ3VpbnQgKikgdXNlcl9kYXRhOworCisgIGlmICgqbl9idWZmZXJzID09IEdfTUFYVUlOVCkKKyAgICByZXR1cm47CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlciksIDApOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpLCBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZmZlciksIDApOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChHU1RfQlVGRkVSX09GRlNFVF9FTkQgKGJ1ZmZlciksIDEpOworCisgICpuX2J1ZmZlcnMgPSAqbl9idWZmZXJzICsgMTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaW1hZ2VmcmVlemVfMF8xKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0Q2FwcyAqY2FwczEsICpjYXBzMjsKKyAgR3N0QnVzICpidXM7CisgIEdNYWluTG9vcCAqbG9vcDsKKyAgZ3VpbnQgbl9idWZmZXJzID0gR19NQVhVSU5UOworICBndWludCBidXNfd2F0Y2ggPSAwOworICBHc3RWaWRlb0luZm8gaTEsIGkyOworCisgIGdzdF92aWRlb19pbmZvX2luaXQgKCZpMSk7CisgIGdzdF92aWRlb19pbmZvX3NldF9mb3JtYXQgKCZpMSwgR1NUX1ZJREVPX0ZPUk1BVF94UkdCLCA2NDAsIDQ4MCk7CisgIGkxLmZwc19uID0gMjU7CisgIGkxLmZwc19kID0gMTsKKyAgY2FwczEgPSBnc3RfdmlkZW9faW5mb190b19jYXBzICgmaTEpOworCisgIGdzdF92aWRlb19pbmZvX2luaXQgKCZpMik7CisgIGdzdF92aWRlb19pbmZvX3NldF9mb3JtYXQgKCZpMiwgR1NUX1ZJREVPX0ZPUk1BVF94UkdCLCA2NDAsIDQ4MCk7CisgIGNhcHMyID0gZ3N0X3ZpZGVvX2luZm9fdG9fY2FwcyAoJmkyKTsKKworICBwaXBlbGluZSA9CisgICAgICBzZXR1cF9pbWFnZWZyZWV6ZSAoY2FwczEsIGNhcHMyLCBHX0NBTExCQUNLIChzaW5rX2hhbmRvZmZfY2JfMF8xKSwKKyAgICAgICZuX2J1ZmZlcnMpOworCisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIFRSVUUpOworICBmYWlsX3VubGVzcyAobG9vcCAhPSBOVUxMKTsKKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChwaXBlbGluZSk7CisgIGZhaWxfdW5sZXNzIChidXMgIT0gTlVMTCk7CisgIGJ1c193YXRjaCA9IGdzdF9idXNfYWRkX3dhdGNoIChidXMsIGJ1c19oYW5kbGVyLCBsb29wKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKworICBuX2J1ZmZlcnMgPSAwOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobl9idWZmZXJzLCAxKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworICBnX21haW5fbG9vcF91bnJlZiAobG9vcCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzMSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzMik7CisgIGdfc291cmNlX3JlbW92ZSAoYnVzX3dhdGNoKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgdm9pZAorc2lua19oYW5kb2ZmX2NiXzI1XzFfMG1zXzQwMG1zIChHc3RFbGVtZW50ICogb2JqZWN0LCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgR3N0UGFkICogcGFkLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGd1aW50ICpuX2J1ZmZlcnMgPSAoZ3VpbnQgKikgdXNlcl9kYXRhOworCisgIGlmICgqbl9idWZmZXJzID09IEdfTUFYVUlOVCkKKyAgICByZXR1cm47CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlciksCisgICAgICAqbl9idWZmZXJzICogNDAgKiBHU1RfTVNFQ09ORCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlciksIDQwICogR1NUX01TRUNPTkQpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKSwgKm5fYnVmZmVycyk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmZmVyKSwgKm5fYnVmZmVycyArIDEpOworCisgICpuX2J1ZmZlcnMgPSAqbl9idWZmZXJzICsgMTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaW1hZ2VmcmVlemVfMjVfMV8wbXNfNDAwbXMpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RDYXBzICpjYXBzMSwgKmNhcHMyOworICBHc3RCdXMgKmJ1czsKKyAgR01haW5Mb29wICpsb29wOworICBndWludCBuX2J1ZmZlcnMgPSBHX01BWFVJTlQ7CisgIGd1aW50IGJ1c193YXRjaCA9IDA7CisgIEdzdFZpZGVvSW5mbyBpMSwgaTI7CisKKyAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoJmkxKTsKKyAgZ3N0X3ZpZGVvX2luZm9fc2V0X2Zvcm1hdCAoJmkxLCBHU1RfVklERU9fRk9STUFUX3hSR0IsIDY0MCwgNDgwKTsKKyAgaTEuZnBzX24gPSAyNTsKKyAgaTEuZnBzX2QgPSAxOworICBjYXBzMSA9IGdzdF92aWRlb19pbmZvX3RvX2NhcHMgKCZpMSk7CisKKyAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoJmkyKTsKKyAgZ3N0X3ZpZGVvX2luZm9fc2V0X2Zvcm1hdCAoJmkyLCBHU1RfVklERU9fRk9STUFUX3hSR0IsIDY0MCwgNDgwKTsKKyAgaTIuZnBzX24gPSAyNTsKKyAgaTIuZnBzX2QgPSAxOworICBjYXBzMiA9IGdzdF92aWRlb19pbmZvX3RvX2NhcHMgKCZpMik7CisKKyAgcGlwZWxpbmUgPQorICAgICAgc2V0dXBfaW1hZ2VmcmVlemUgKGNhcHMxLCBjYXBzMiwKKyAgICAgIEdfQ0FMTEJBQ0sgKHNpbmtfaGFuZG9mZl9jYl8yNV8xXzBtc180MDBtcyksICZuX2J1ZmZlcnMpOworCisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIFRSVUUpOworICBmYWlsX3VubGVzcyAobG9vcCAhPSBOVUxMKTsKKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChwaXBlbGluZSk7CisgIGZhaWxfdW5sZXNzIChidXMgIT0gTlVMTCk7CisgIGJ1c193YXRjaCA9IGdzdF9idXNfYWRkX3dhdGNoIChidXMsIGJ1c19oYW5kbGVyLCBsb29wKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUEFVU0VEKSwKKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NlZWsgKHBpcGVsaW5lLCAxLjAsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgICBHU1RfU0VFS19GTEFHX0ZMVVNILCBHU1RfU0VFS19UWVBFX1NFVCwgMCwgR1NUX1NFRUtfVFlQRV9TRVQsCisgICAgICAgICAgNDAwICogR1NUX01TRUNPTkQpKTsKKworICBuX2J1ZmZlcnMgPSAwOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKSwKKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgZ19tYWluX2xvb3BfcnVuIChsb29wKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChuX2J1ZmZlcnMsIDEwKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworICBnX21haW5fbG9vcF91bnJlZiAobG9vcCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzMSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzMik7CisgIGdfc291cmNlX3JlbW92ZSAoYnVzX3dhdGNoKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgdm9pZAorc2lua19oYW5kb2ZmX2NiXzI1XzFfMjAwbXNfNDAwbXMgKEdzdEVsZW1lbnQgKiBvYmplY3QsIEdzdEJ1ZmZlciAqIGJ1ZmZlciwKKyAgICBHc3RQYWQgKiBwYWQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZ3VpbnQgKm5fYnVmZmVycyA9IChndWludCAqKSB1c2VyX2RhdGE7CisKKyAgaWYgKCpuX2J1ZmZlcnMgPT0gR19NQVhVSU5UKQorICAgIHJldHVybjsKKworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSwKKyAgICAgIDIwMCAqIEdTVF9NU0VDT05EICsgKm5fYnVmZmVycyAqIDQwICogR1NUX01TRUNPTkQpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpLCA0MCAqIEdTVF9NU0VDT05EKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZmZlciksIDUgKyAqbl9idWZmZXJzKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWZmZXIpLAorICAgICAgNSArICpuX2J1ZmZlcnMgKyAxKTsKKworICAqbl9idWZmZXJzID0gKm5fYnVmZmVycyArIDE7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ltYWdlZnJlZXplXzI1XzFfMjAwbXNfNDAwbXMpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RDYXBzICpjYXBzMSwgKmNhcHMyOworICBHc3RCdXMgKmJ1czsKKyAgR01haW5Mb29wICpsb29wOworICBndWludCBuX2J1ZmZlcnMgPSBHX01BWFVJTlQ7CisgIGd1aW50IGJ1c193YXRjaCA9IDA7CisgIEdzdFZpZGVvSW5mbyBpMSwgaTI7CisKKyAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoJmkxKTsKKyAgZ3N0X3ZpZGVvX2luZm9fc2V0X2Zvcm1hdCAoJmkxLCBHU1RfVklERU9fRk9STUFUX3hSR0IsIDY0MCwgNDgwKTsKKyAgaTEuZnBzX24gPSAyNTsKKyAgaTEuZnBzX2QgPSAxOworICBjYXBzMSA9IGdzdF92aWRlb19pbmZvX3RvX2NhcHMgKCZpMSk7CisKKyAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoJmkyKTsKKyAgZ3N0X3ZpZGVvX2luZm9fc2V0X2Zvcm1hdCAoJmkyLCBHU1RfVklERU9fRk9STUFUX3hSR0IsIDY0MCwgNDgwKTsKKyAgaTIuZnBzX24gPSAyNTsKKyAgaTIuZnBzX2QgPSAxOworICBjYXBzMiA9IGdzdF92aWRlb19pbmZvX3RvX2NhcHMgKCZpMik7CisKKyAgcGlwZWxpbmUgPQorICAgICAgc2V0dXBfaW1hZ2VmcmVlemUgKGNhcHMxLCBjYXBzMiwKKyAgICAgIEdfQ0FMTEJBQ0sgKHNpbmtfaGFuZG9mZl9jYl8yNV8xXzIwMG1zXzQwMG1zKSwgJm5fYnVmZmVycyk7CisKKyAgbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgVFJVRSk7CisgIGZhaWxfdW5sZXNzIChsb29wICE9IE5VTEwpOworCisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKHBpcGVsaW5lKTsKKyAgZmFpbF91bmxlc3MgKGJ1cyAhPSBOVUxMKTsKKyAgYnVzX3dhdGNoID0gZ3N0X2J1c19hZGRfd2F0Y2ggKGJ1cywgYnVzX2hhbmRsZXIsIGxvb3ApOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QQVVTRUQpLAorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2VlayAocGlwZWxpbmUsIDEuMCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICAgIEdTVF9TRUVLX0ZMQUdfRkxVU0gsIEdTVF9TRUVLX1RZUEVfU0VULCAyMDAgKiBHU1RfTVNFQ09ORCwKKyAgICAgICAgICBHU1RfU0VFS19UWVBFX1NFVCwgNDAwICogR1NUX01TRUNPTkQpKTsKKworICBuX2J1ZmZlcnMgPSAwOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKSwKKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgZ19tYWluX2xvb3BfcnVuIChsb29wKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChuX2J1ZmZlcnMsIDUpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisgIGdfbWFpbl9sb29wX3VucmVmIChsb29wKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMxKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMyKTsKKyAgZ19zb3VyY2VfcmVtb3ZlIChidXNfd2F0Y2gpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyB2b2lkCitzaW5rX2hhbmRvZmZfY2JfMjVfMV80MDBtc18wbXMgKEdzdEVsZW1lbnQgKiBvYmplY3QsIEdzdEJ1ZmZlciAqIGJ1ZmZlciwKKyAgICBHc3RQYWQgKiBwYWQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZ3VpbnQgKm5fYnVmZmVycyA9IChndWludCAqKSB1c2VyX2RhdGE7CisKKyAgaWYgKCpuX2J1ZmZlcnMgPT0gR19NQVhVSU5UKQorICAgIHJldHVybjsKKworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSwKKyAgICAgIDQwMCAqIEdTVF9NU0VDT05EIC0gKCpuX2J1ZmZlcnMgKyAxKSAqIDQwICogR1NUX01TRUNPTkQpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpLCA0MCAqIEdTVF9NU0VDT05EKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZmZlciksIDEwIC0gKCpuX2J1ZmZlcnMgKyAxKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmZmVyKSwKKyAgICAgIDEwIC0gKCpuX2J1ZmZlcnMgKyAxKSArIDEpOworCisgICpuX2J1ZmZlcnMgPSAqbl9idWZmZXJzICsgMTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaW1hZ2VmcmVlemVfMjVfMV80MDBtc18wbXMpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RDYXBzICpjYXBzMSwgKmNhcHMyOworICBHc3RCdXMgKmJ1czsKKyAgR01haW5Mb29wICpsb29wOworICBndWludCBuX2J1ZmZlcnMgPSBHX01BWFVJTlQ7CisgIGd1aW50IGJ1c193YXRjaCA9IDA7CisgIEdzdFZpZGVvSW5mbyBpMSwgaTI7CisKKyAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoJmkxKTsKKyAgZ3N0X3ZpZGVvX2luZm9fc2V0X2Zvcm1hdCAoJmkxLCBHU1RfVklERU9fRk9STUFUX3hSR0IsIDY0MCwgNDgwKTsKKyAgaTEuZnBzX24gPSAyNTsKKyAgaTEuZnBzX2QgPSAxOworICBjYXBzMSA9IGdzdF92aWRlb19pbmZvX3RvX2NhcHMgKCZpMSk7CisKKyAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoJmkyKTsKKyAgZ3N0X3ZpZGVvX2luZm9fc2V0X2Zvcm1hdCAoJmkyLCBHU1RfVklERU9fRk9STUFUX3hSR0IsIDY0MCwgNDgwKTsKKyAgaTIuZnBzX24gPSAyNTsKKyAgaTIuZnBzX2QgPSAxOworICBjYXBzMiA9IGdzdF92aWRlb19pbmZvX3RvX2NhcHMgKCZpMik7CisKKyAgcGlwZWxpbmUgPQorICAgICAgc2V0dXBfaW1hZ2VmcmVlemUgKGNhcHMxLCBjYXBzMiwKKyAgICAgIEdfQ0FMTEJBQ0sgKHNpbmtfaGFuZG9mZl9jYl8yNV8xXzQwMG1zXzBtcyksICZuX2J1ZmZlcnMpOworCisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIFRSVUUpOworICBmYWlsX3VubGVzcyAobG9vcCAhPSBOVUxMKTsKKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChwaXBlbGluZSk7CisgIGZhaWxfdW5sZXNzIChidXMgIT0gTlVMTCk7CisgIGJ1c193YXRjaCA9IGdzdF9idXNfYWRkX3dhdGNoIChidXMsIGJ1c19oYW5kbGVyLCBsb29wKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUEFVU0VEKSwKKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NlZWsgKHBpcGVsaW5lLCAtMS4wLCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgR1NUX1NFRUtfRkxBR19GTFVTSCwgR1NUX1NFRUtfVFlQRV9TRVQsIDAsIEdTVF9TRUVLX1RZUEVfU0VULAorICAgICAgICAgIDQwMCAqIEdTVF9NU0VDT05EKSk7CisKKyAgbl9idWZmZXJzID0gMDsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobl9idWZmZXJzLCAxMCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKyAgZ19tYWluX2xvb3BfdW5yZWYgKGxvb3ApOworICBnc3RfY2Fwc191bnJlZiAoY2FwczEpOworICBnc3RfY2Fwc191bnJlZiAoY2FwczIpOworICBnX3NvdXJjZV9yZW1vdmUgKGJ1c193YXRjaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIHZvaWQKK3NpbmtfaGFuZG9mZl9jYl8yNV8xXzIyMG1zXzM4MG1zIChHc3RFbGVtZW50ICogb2JqZWN0LCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgR3N0UGFkICogcGFkLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGd1aW50ICpuX2J1ZmZlcnMgPSAoZ3VpbnQgKikgdXNlcl9kYXRhOworCisgIGlmICgqbl9idWZmZXJzID09IEdfTUFYVUlOVCkKKyAgICByZXR1cm47CisKKyAgaWYgKCpuX2J1ZmZlcnMgPT0gMCkgeworICAgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpLAorICAgICAgICAyMjAgKiBHU1RfTVNFQ09ORCk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSwgMjAgKiBHU1RfTVNFQ09ORCk7CisgIH0gZWxzZSBpZiAoKm5fYnVmZmVycyA9PSA0KSB7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlciksCisgICAgICAgIDM2MCAqIEdTVF9NU0VDT05EKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpLCAyMCAqIEdTVF9NU0VDT05EKTsKKyAgfSBlbHNlIHsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSwKKyAgICAgICAgMjAwICogR1NUX01TRUNPTkQgKyAqbl9idWZmZXJzICogNDAgKiBHU1RfTVNFQ09ORCk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSwgNDAgKiBHU1RfTVNFQ09ORCk7CisgIH0KKworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKSwgNSArICpuX2J1ZmZlcnMpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChHU1RfQlVGRkVSX09GRlNFVF9FTkQgKGJ1ZmZlciksCisgICAgICA1ICsgKm5fYnVmZmVycyArIDEpOworCisgICpuX2J1ZmZlcnMgPSAqbl9idWZmZXJzICsgMTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaW1hZ2VmcmVlemVfMjVfMV8yMjBtc18zODBtcykKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdENhcHMgKmNhcHMxLCAqY2FwczI7CisgIEdzdEJ1cyAqYnVzOworICBHTWFpbkxvb3AgKmxvb3A7CisgIGd1aW50IG5fYnVmZmVycyA9IEdfTUFYVUlOVDsKKyAgZ3VpbnQgYnVzX3dhdGNoID0gMDsKKyAgR3N0VmlkZW9JbmZvIGkxLCBpMjsKKworICBnc3RfdmlkZW9faW5mb19pbml0ICgmaTEpOworICBnc3RfdmlkZW9faW5mb19zZXRfZm9ybWF0ICgmaTEsIEdTVF9WSURFT19GT1JNQVRfeFJHQiwgNjQwLCA0ODApOworICBpMS5mcHNfbiA9IDI1OworICBpMS5mcHNfZCA9IDE7CisgIGNhcHMxID0gZ3N0X3ZpZGVvX2luZm9fdG9fY2FwcyAoJmkxKTsKKworICBnc3RfdmlkZW9faW5mb19pbml0ICgmaTIpOworICBnc3RfdmlkZW9faW5mb19zZXRfZm9ybWF0ICgmaTIsIEdTVF9WSURFT19GT1JNQVRfeFJHQiwgNjQwLCA0ODApOworICBpMi5mcHNfbiA9IDI1OworICBpMi5mcHNfZCA9IDE7CisgIGNhcHMyID0gZ3N0X3ZpZGVvX2luZm9fdG9fY2FwcyAoJmkyKTsKKworICBwaXBlbGluZSA9CisgICAgICBzZXR1cF9pbWFnZWZyZWV6ZSAoY2FwczEsIGNhcHMyLAorICAgICAgR19DQUxMQkFDSyAoc2lua19oYW5kb2ZmX2NiXzI1XzFfMjIwbXNfMzgwbXMpLCAmbl9idWZmZXJzKTsKKworICBsb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBUUlVFKTsKKyAgZmFpbF91bmxlc3MgKGxvb3AgIT0gTlVMTCk7CisKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAocGlwZWxpbmUpOworICBmYWlsX3VubGVzcyAoYnVzICE9IE5VTEwpOworICBidXNfd2F0Y2ggPSBnc3RfYnVzX2FkZF93YXRjaCAoYnVzLCBidXNfaGFuZGxlciwgbG9vcCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BBVVNFRCksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZWVrIChwaXBlbGluZSwgMS4wLCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgR1NUX1NFRUtfRkxBR19GTFVTSCwgR1NUX1NFRUtfVFlQRV9TRVQsIDIyMCAqIEdTVF9NU0VDT05ELAorICAgICAgICAgIEdTVF9TRUVLX1RZUEVfU0VULCAzODAgKiBHU1RfTVNFQ09ORCkpOworCisgIG5fYnVmZmVycyA9IDA7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpLAorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBnX21haW5fbG9vcF9ydW4gKGxvb3ApOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG5fYnVmZmVycywgNSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKyAgZ19tYWluX2xvb3BfdW5yZWYgKGxvb3ApOworICBnc3RfY2Fwc191bnJlZiAoY2FwczEpOworICBnc3RfY2Fwc191bnJlZiAoY2FwczIpOworICBnX3NvdXJjZV9yZW1vdmUgKGJ1c193YXRjaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaW1hZ2VmcmVlemVfZW9zKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0RWxlbWVudCAqc3JjOworICBHc3RDYXBzICpjYXBzMSwgKmNhcHMyOworICBHc3RCdXMgKmJ1czsKKyAgR01haW5Mb29wICpsb29wOworICBHc3RGb3JtYXQgZm10ID0gR1NUX0ZPUk1BVF9USU1FOworICBnaW50NjQgcG9zaXRpb247CisgIGd1aW50IGJ1c193YXRjaCA9IDA7CisgIEdzdFZpZGVvSW5mbyBpMSwgaTI7CisKKyAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoJmkxKTsKKyAgZ3N0X3ZpZGVvX2luZm9fc2V0X2Zvcm1hdCAoJmkxLCBHU1RfVklERU9fRk9STUFUX3hSR0IsIDY0MCwgNDgwKTsKKyAgaTEuZnBzX24gPSAyNTsKKyAgaTEuZnBzX2QgPSAxOworICBjYXBzMSA9IGdzdF92aWRlb19pbmZvX3RvX2NhcHMgKCZpMSk7CisKKyAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoJmkyKTsKKyAgZ3N0X3ZpZGVvX2luZm9fc2V0X2Zvcm1hdCAoJmkyLCBHU1RfVklERU9fRk9STUFUX3hSR0IsIDY0MCwgNDgwKTsKKyAgaTIuZnBzX24gPSAyNTsKKyAgaTIuZnBzX2QgPSAxOworICBjYXBzMiA9IGdzdF92aWRlb19pbmZvX3RvX2NhcHMgKCZpMik7CisKKyAgcGlwZWxpbmUgPSBzZXR1cF9pbWFnZWZyZWV6ZSAoY2FwczEsIGNhcHMyLCBOVUxMLCBOVUxMKTsKKworICBzcmMgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKHNyYyAhPSBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzcmMsICJudW0tYnVmZmVycyIsIDEwMCwgTlVMTCk7CisKKyAgbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgVFJVRSk7CisgIGZhaWxfdW5sZXNzIChsb29wICE9IE5VTEwpOworCisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKHBpcGVsaW5lKTsKKyAgZmFpbF91bmxlc3MgKGJ1cyAhPSBOVUxMKTsKKyAgYnVzX3dhdGNoID0gZ3N0X2J1c19hZGRfd2F0Y2ggKGJ1cywgYnVzX2hhbmRsZXIsIGxvb3ApOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QQVVTRUQpLAorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2VlayAocGlwZWxpbmUsIDEuMCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICAgIEdTVF9TRUVLX0ZMQUdfRkxVU0gsIEdTVF9TRUVLX1RZUEVfU0VULCAwLCBHU1RfU0VFS19UWVBFX1NFVCwKKyAgICAgICAgICA0MDAgKiBHU1RfTVNFQ09ORCkpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKSwKKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgZ19tYWluX2xvb3BfcnVuIChsb29wKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfcXVlcnlfcG9zaXRpb24gKHNyYywgZm10LCAmcG9zaXRpb24pKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAocG9zaXRpb24sIDQwICogR1NUX01TRUNPTkQpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChzcmMpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisgIGdfbWFpbl9sb29wX3VucmVmIChsb29wKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMxKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMyKTsKKyAgZ19zb3VyY2VfcmVtb3ZlIChidXNfd2F0Y2gpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitpbWFnZWZyZWV6ZV9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJpbWFnZWZyZWV6ZSIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJsaW5lYXIiKTsKKworICAvKiB0aW1lIG91dCBhZnRlciAxMjBzLCBub3QgdGhlIGRlZmF1bHQgMyAqLworICB0Y2FzZV9zZXRfdGltZW91dCAodGNfY2hhaW4sIDEyMCk7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9pbWFnZWZyZWV6ZV8wXzEpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaW1hZ2VmcmVlemVfMjVfMV8wbXNfNDAwbXMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaW1hZ2VmcmVlemVfMjVfMV8yMDBtc180MDBtcyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9pbWFnZWZyZWV6ZV8yNV8xXzQwMG1zXzBtcyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9pbWFnZWZyZWV6ZV8yNV8xXzIyMG1zXzM4MG1zKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaW1hZ2VmcmVlemVfZW9zKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGltYWdlZnJlZXplKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2ludGVybGVhdmUuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2ludGVybGVhdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDlkNTYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvaW50ZXJsZWF2ZS5jCkBAIC0wLDAgKzEsODI2IEBACisvKiBHU3RyZWFtZXIgdW5pdCB0ZXN0cyBmb3IgdGhlIGludGVybGVhdmUgZWxlbWVudAorICogQ29weXJpZ2h0IChDKSAyMDA3IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qIEZJWE1FIDAuMTE6IHN1cHByZXNzIHdhcm5pbmdzIGZvciBkZXByZWNhdGVkIEFQSSBzdWNoIGFzIEdWYWx1ZUFycmF5CisgKiB3aXRoIG5ld2VyIEdMaWIgdmVyc2lvbnMgKD49IDIuMzEuMCkgKi8KKyNkZWZpbmUgR0xJQl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1ZBTEdSSU5ECisjIGluY2x1ZGUgPHZhbGdyaW5kL3ZhbGdyaW5kLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby1lbnVtdHlwZXMuaD4KKworc3RhdGljIHZvaWQKK2dzdF9jaGVja19zZXR1cF9ldmVudHNfaW50ZXJsZWF2ZSAoR3N0UGFkICogc3JjcGFkLCBHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RDYXBzICogY2FwcywgR3N0Rm9ybWF0IGZvcm1hdCwgY29uc3QgZ2NoYXIgKiBzdHJlYW1faWQpCit7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgZm9ybWF0KTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChzcmNwYWQsCisgICAgICAgICAgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKHN0cmVhbV9pZCkpKTsKKyAgaWYgKGNhcHMpCisgICAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAoc3JjcGFkLCBnc3RfZXZlbnRfbmV3X2NhcHMgKGNhcHMpKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKHNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfY3JlYXRlX2FuZF91bnJlZikKK3sKKyAgR3N0RWxlbWVudCAqaW50ZXJsZWF2ZTsKKworICBpbnRlcmxlYXZlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiaW50ZXJsZWF2ZSIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoaW50ZXJsZWF2ZSAhPSBOVUxMKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGludGVybGVhdmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoaW50ZXJsZWF2ZSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcmVxdWVzdF9wYWRzKQoreworICBHc3RFbGVtZW50ICppbnRlcmxlYXZlOworICBHc3RQYWQgKnBhZDEsICpwYWQyOworCisgIGludGVybGVhdmUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJpbnRlcmxlYXZlIiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChpbnRlcmxlYXZlICE9IE5VTEwpOworCisgIHBhZDEgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKGludGVybGVhdmUsICJzaW5rXyV1Iik7CisgIGZhaWxfdW5sZXNzIChwYWQxICE9IE5VTEwpOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nIChHU1RfT0JKRUNUX05BTUUgKHBhZDEpLCAic2lua18wIik7CisKKyAgcGFkMiA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoaW50ZXJsZWF2ZSwgInNpbmtfJXUiKTsKKyAgZmFpbF91bmxlc3MgKHBhZDIgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKEdTVF9PQkpFQ1RfTkFNRSAocGFkMiksICJzaW5rXzEiKTsKKworICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkIChpbnRlcmxlYXZlLCBwYWQyKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGFkMik7CisgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKGludGVybGVhdmUsIHBhZDEpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWQxKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGludGVybGVhdmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoaW50ZXJsZWF2ZSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIEdzdFBhZCAqKm15c3JjcGFkcywgKm15c2lua3BhZDsKK3N0YXRpYyBHc3RCdXMgKmJ1czsKK3N0YXRpYyBHc3RFbGVtZW50ICppbnRlcmxlYXZlOworc3RhdGljIGdpbnQgaGF2ZV9kYXRhOworc3RhdGljIGdmbG9hdCBpbnB1dFsyXTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoRjMyKSAiLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDIsIGxheW91dCA9IChzdHJpbmcpIHtpbnRlcmxlYXZlZCwgbm9uLWludGVybGVhdmVkfSwgcmF0ZSA9IChpbnQpIDQ4MDAwIikpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChGMzIpICIsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgbGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsIHJhdGUgPSAoaW50KSA0ODAwMCIpKTsKKworI2RlZmluZSBDQVBTXzQ4a2h6IFwKKyAgICAgICAgImF1ZGlvL3gtcmF3LCAiIFwKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChGMzIpICIsICIgXAorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCBsYXlvdXQgPSAoc3RyaW5nKSBub24taW50ZXJsZWF2ZWQsIiBcCisgICAgICAgICJyYXRlID0gKGludCkgNDgwMDAiCisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitpbnRlcmxlYXZlX2NoYWluX2Z1bmMgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdE1hcEluZm8gbWFwOworICBnZmxvYXQgKm91dGRhdGE7CisgIGdpbnQgaTsKKworICBmYWlsX3VubGVzcyAoR1NUX0lTX0JVRkZFUiAoYnVmZmVyKSk7CisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIG91dGRhdGEgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChtYXAuc2l6ZSwgNDgwMDAgKiAyICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgZmFpbF91bmxlc3MgKG91dGRhdGEgIT0gTlVMTCk7CisKKyNpZmRlZiBIQVZFX1ZBTEdSSU5ECisgIGlmICghKFJVTk5JTkdfT05fVkFMR1JJTkQpKQorI2VuZGlmCisgICAgZm9yIChpID0gMDsgaSA8IDQ4MDAwICogMjsgaSArPSAyKSB7CisgICAgICBmYWlsX3VubGVzc19lcXVhbHNfZmxvYXQgKG91dGRhdGFbaV0sIGlucHV0WzBdKTsKKyAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19mbG9hdCAob3V0ZGF0YVtpICsgMV0sIGlucHV0WzFdKTsKKyAgICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgaGF2ZV9kYXRhKys7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9pbnRlcmxlYXZlXzJjaCkKK3sKKyAgR3N0RWxlbWVudCAqcXVldWU7CisgIEdzdFBhZCAqc2luazAsICpzaW5rMSwgKnNyYywgKnRtcDsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2ludCBpOworICBHc3RCdWZmZXIgKmluYnVmOworICBnZmxvYXQgKmluZGF0YTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgbXlzcmNwYWRzID0gZ19uZXcwIChHc3RQYWQgKiwgMik7CisKKyAgaGF2ZV9kYXRhID0gMDsKKworICBpbnRlcmxlYXZlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiaW50ZXJsZWF2ZSIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoaW50ZXJsZWF2ZSAhPSBOVUxMKTsKKworICBxdWV1ZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInF1ZXVlIiwgInF1ZXVlIik7CisgIGZhaWxfdW5sZXNzIChxdWV1ZSAhPSBOVUxMKTsKKworICBzaW5rMCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoaW50ZXJsZWF2ZSwgInNpbmtfJXUiKTsKKyAgZmFpbF91bmxlc3MgKHNpbmswICE9IE5VTEwpOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nIChHU1RfT0JKRUNUX05BTUUgKHNpbmswKSwgInNpbmtfMCIpOworCisgIHNpbmsxID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChpbnRlcmxlYXZlLCAic2lua18ldSIpOworICBmYWlsX3VubGVzcyAoc2luazEgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKEdTVF9PQkpFQ1RfTkFNRSAoc2luazEpLCAic2lua18xIik7CisKKyAgbXlzcmNwYWRzWzBdID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzcmN0ZW1wbGF0ZSwgInNyYzAiKTsKKyAgZmFpbF91bmxlc3MgKG15c3JjcGFkc1swXSAhPSBOVUxMKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKENBUFNfNDhraHopOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkc1swXSwgVFJVRSk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHNfaW50ZXJsZWF2ZSAobXlzcmNwYWRzWzBdLCBpbnRlcmxlYXZlLCBjYXBzLAorICAgICAgR1NUX0ZPUk1BVF9USU1FLCAiMCIpOworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChteXNyY3BhZHNbMF0pOworCisgIG15c3JjcGFkc1sxXSA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc3JjdGVtcGxhdGUsICJzcmMxIik7CisgIGZhaWxfdW5sZXNzIChteXNyY3BhZHNbMV0gIT0gTlVMTCk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZHNbMV0sIFRSVUUpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzX2ludGVybGVhdmUgKG15c3JjcGFkc1sxXSwgaW50ZXJsZWF2ZSwgY2FwcywKKyAgICAgIEdTVF9GT1JNQVRfVElNRSwgIjEiKTsKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAobXlzcmNwYWRzWzFdKTsKKworICB0bXAgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocXVldWUsICJzaW5rIik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKG15c3JjcGFkc1swXSwgdG1wKSA9PSBHU1RfUEFEX0xJTktfT0spOworICBnc3Rfb2JqZWN0X3VucmVmICh0bXApOworICB0bXAgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocXVldWUsICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAodG1wLCBzaW5rMCkgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodG1wKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rIChteXNyY3BhZHNbMV0sIHNpbmsxKSA9PSBHU1RfUEFEX0xJTktfT0spOworCisgIG15c2lua3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc2lua3RlbXBsYXRlLCAic2luayIpOworICBmYWlsX3VubGVzcyAobXlzaW5rcGFkICE9IE5VTEwpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAobXlzaW5rcGFkLCBpbnRlcmxlYXZlX2NoYWluX2Z1bmMpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgc3JjID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGludGVybGVhdmUsICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKHNyYyAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAoc3JjLCBteXNpbmtwYWQpID09IEdTVF9QQURfTElOS19PSyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyYyk7CisKKyAgYnVzID0gZ3N0X2J1c19uZXcgKCk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKGludGVybGVhdmUsIGJ1cyk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoaW50ZXJsZWF2ZSwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocXVldWUsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgaW5wdXRbMF0gPSAtMS4wOworICBpbmJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoNDgwMDAgKiBzaXplb2YgKGdmbG9hdCkpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbmRhdGEgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgNDgwMDA7IGkrKykKKyAgICBpbmRhdGFbaV0gPSAtMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZiwgJm1hcCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkc1swXSwgaW5idWYpID09IEdTVF9GTE9XX09LKTsKKworICBpbnB1dFsxXSA9IDEuMDsKKyAgaW5idWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDQ4MDAwICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW5kYXRhID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDQ4MDAwOyBpKyspCisgICAgaW5kYXRhW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZiwgJm1hcCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkc1sxXSwgaW5idWYpID09IEdTVF9GTE9XX09LKTsKKworICBpbmJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoNDgwMDAgKiBzaXplb2YgKGdmbG9hdCkpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbmRhdGEgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgNDgwMDA7IGkrKykKKyAgICBpbmRhdGFbaV0gPSAtMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZiwgJm1hcCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkc1swXSwgaW5idWYpID09IEdTVF9GTE9XX09LKTsKKworICBpbmJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoNDgwMDAgKiBzaXplb2YgKGdmbG9hdCkpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbmRhdGEgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgNDgwMDA7IGkrKykKKyAgICBpbmRhdGFbaV0gPSAxLjA7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmLCAmbWFwKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWRzWzFdLCBpbmJ1ZikgPT0gR1NUX0ZMT1dfT0spOworCisgIGZhaWxfdW5sZXNzIChoYXZlX2RhdGEgPT0gMik7CisKKyAgZ3N0X2J1c19zZXRfZmx1c2hpbmcgKGJ1cywgVFJVRSk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoaW50ZXJsZWF2ZSwgR1NUX1NUQVRFX05VTEwpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHF1ZXVlLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAobXlzcmNwYWRzWzBdKTsKKyAgZ3N0X29iamVjdF91bnJlZiAobXlzcmNwYWRzWzFdKTsKKyAgZ3N0X29iamVjdF91bnJlZiAobXlzaW5rcGFkKTsKKworICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkIChpbnRlcmxlYXZlLCBzaW5rMCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmswKTsKKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAoaW50ZXJsZWF2ZSwgc2luazEpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rMSk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoaW50ZXJsZWF2ZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHF1ZXVlKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGdfZnJlZSAobXlzcmNwYWRzKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9pbnRlcmxlYXZlXzJjaF8xZW9zKQoreworICBHc3RFbGVtZW50ICpxdWV1ZTsKKyAgR3N0UGFkICpzaW5rMCwgKnNpbmsxLCAqc3JjLCAqdG1wOworICBHc3RDYXBzICpjYXBzOworICBnaW50IGk7CisgIEdzdEJ1ZmZlciAqaW5idWY7CisgIGdmbG9hdCAqaW5kYXRhOworICBHc3RNYXBJbmZvIG1hcDsKKworICBteXNyY3BhZHMgPSBnX25ldzAgKEdzdFBhZCAqLCAyKTsKKworICBoYXZlX2RhdGEgPSAwOworCisgIGludGVybGVhdmUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJpbnRlcmxlYXZlIiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChpbnRlcmxlYXZlICE9IE5VTEwpOworCisgIHF1ZXVlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicXVldWUiLCAicXVldWUiKTsKKyAgZmFpbF91bmxlc3MgKHF1ZXVlICE9IE5VTEwpOworCisgIHNpbmswID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChpbnRlcmxlYXZlLCAic2lua18ldSIpOworICBmYWlsX3VubGVzcyAoc2luazAgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKEdTVF9PQkpFQ1RfTkFNRSAoc2luazApLCAic2lua18wIik7CisKKyAgc2luazEgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKGludGVybGVhdmUsICJzaW5rXyV1Iik7CisgIGZhaWxfdW5sZXNzIChzaW5rMSAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoR1NUX09CSkVDVF9OQU1FIChzaW5rMSksICJzaW5rXzEiKTsKKworICBteXNyY3BhZHNbMF0gPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNyY3RlbXBsYXRlLCAic3JjMCIpOworICBmYWlsX3VubGVzcyAobXlzcmNwYWRzWzBdICE9IE5VTEwpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQ0FQU180OGtoeik7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWRzWzBdLCBUUlVFKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50c19pbnRlcmxlYXZlIChteXNyY3BhZHNbMF0sIGludGVybGVhdmUsIGNhcHMsCisgICAgICBHU1RfRk9STUFUX1RJTUUsICIwIik7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKG15c3JjcGFkc1swXSk7CisKKyAgbXlzcmNwYWRzWzFdID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzcmN0ZW1wbGF0ZSwgInNyYzEiKTsKKyAgZmFpbF91bmxlc3MgKG15c3JjcGFkc1sxXSAhPSBOVUxMKTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkc1sxXSwgVFJVRSk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHNfaW50ZXJsZWF2ZSAobXlzcmNwYWRzWzFdLCBpbnRlcmxlYXZlLCBjYXBzLAorICAgICAgR1NUX0ZPUk1BVF9USU1FLCAiMSIpOworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChteXNyY3BhZHNbMV0pOworCisgIHRtcCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChxdWV1ZSwgInNpbmsiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAobXlzcmNwYWRzWzBdLCB0bXApID09IEdTVF9QQURfTElOS19PSyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHRtcCk7CisgIHRtcCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChxdWV1ZSwgInNyYyIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rICh0bXAsIHNpbmswKSA9PSBHU1RfUEFEX0xJTktfT0spOworICBnc3Rfb2JqZWN0X3VucmVmICh0bXApOworCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKG15c3JjcGFkc1sxXSwgc2luazEpID09IEdTVF9QQURfTElOS19PSyk7CisKKyAgbXlzaW5rcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzaW5rdGVtcGxhdGUsICJzaW5rIik7CisgIGZhaWxfdW5sZXNzIChteXNpbmtwYWQgIT0gTlVMTCk7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChteXNpbmtwYWQsIGludGVybGVhdmVfY2hhaW5fZnVuYyk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICBzcmMgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoaW50ZXJsZWF2ZSwgInNyYyIpOworICBmYWlsX3VubGVzcyAoc3JjICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rIChzcmMsIG15c2lua3BhZCkgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjKTsKKworICBidXMgPSBnc3RfYnVzX25ldyAoKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAoaW50ZXJsZWF2ZSwgYnVzKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChpbnRlcmxlYXZlLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChxdWV1ZSwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBpbnB1dFswXSA9IC0xLjA7CisgIGluYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg0ODAwMCAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluZGF0YSA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCA0ODAwMDsgaSsrKQorICAgIGluZGF0YVtpXSA9IC0xLjA7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmLCAmbWFwKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWRzWzBdLCBpbmJ1ZikgPT0gR1NUX0ZMT1dfT0spOworCisgIGlucHV0WzFdID0gMS4wOworICBpbmJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoNDgwMDAgKiBzaXplb2YgKGdmbG9hdCkpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbmRhdGEgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgNDgwMDA7IGkrKykKKyAgICBpbmRhdGFbaV0gPSAxLjA7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmLCAmbWFwKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWRzWzFdLCBpbmJ1ZikgPT0gR1NUX0ZMT1dfT0spOworCisgIGlucHV0WzBdID0gMC4wOworICBnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkc1swXSwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworCisgIGlucHV0WzFdID0gMS4wOworICBpbmJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoNDgwMDAgKiBzaXplb2YgKGdmbG9hdCkpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbmRhdGEgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgNDgwMDA7IGkrKykKKyAgICBpbmRhdGFbaV0gPSAxLjA7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmLCAmbWFwKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWRzWzFdLCBpbmJ1ZikgPT0gR1NUX0ZMT1dfT0spOworCisgIGZhaWxfdW5sZXNzIChoYXZlX2RhdGEgPT0gMik7CisKKyAgZ3N0X2J1c19zZXRfZmx1c2hpbmcgKGJ1cywgVFJVRSk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoaW50ZXJsZWF2ZSwgR1NUX1NUQVRFX05VTEwpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHF1ZXVlLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAobXlzcmNwYWRzWzBdKTsKKyAgZ3N0X29iamVjdF91bnJlZiAobXlzcmNwYWRzWzFdKTsKKyAgZ3N0X29iamVjdF91bnJlZiAobXlzaW5rcGFkKTsKKworICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkIChpbnRlcmxlYXZlLCBzaW5rMCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmswKTsKKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAoaW50ZXJsZWF2ZSwgc2luazEpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rMSk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoaW50ZXJsZWF2ZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHF1ZXVlKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGdfZnJlZSAobXlzcmNwYWRzKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgdm9pZAorc3JjX2hhbmRvZmZfZmxvYXQzMiAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEJ1ZmZlciAqIGJ1ZmZlciwgR3N0UGFkICogcGFkLAorICAgIGdib29sZWFuIGludGVybGVhdmVkLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGdpbnQgbiA9IEdQT0lOVEVSX1RPX0lOVCAodXNlcl9kYXRhKTsKKyAgZ2Zsb2F0ICpkYXRhOworICBnaW50IGk7CisgIGdzaXplIHNpemU7CisgIEdzdENhcHMgKmNhcHM7CisgIGd1aW50NjQgbWFzazsKKyAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zOworCisgIHN3aXRjaCAobikgeworICAgIGNhc2UgMDoKKyAgICBjYXNlIDE6CisgICAgY2FzZSAyOgorICAgICAgcG9zID0gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIHBvcyA9IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHBvcyA9IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0lOVkFMSUQ7CisgICAgICBicmVhazsKKyAgfQorCisgIG1hc2sgPSBHX0dVSU5UNjRfQ09OU1RBTlQgKDEpIDw8IHBvczsKKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcmF3IiwKKyAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCBHU1RfQVVESU9fTkUgKEYzMiksCisgICAgICAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAxLAorICAgICAgImxheW91dCIsIEdfVFlQRV9TVFJJTkcsIGludGVybGVhdmVkID8gImludGVybGVhdmVkIiA6ICJub24taW50ZXJsZWF2ZWQiLAorICAgICAgImNoYW5uZWwtbWFzayIsIEdTVF9UWVBFX0JJVE1BU0ssIG1hc2ssICJyYXRlIiwgR19UWVBFX0lOVCwgNDgwMDAsIE5VTEwpOworCisgIGdzdF9wYWRfc2V0X2NhcHMgKHBhZCwgY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBzaXplID0gNDgwMDAgKiBzaXplb2YgKGdmbG9hdCk7CisgIGRhdGEgPSBnX21hbGxvYyAoc2l6ZSk7CisgIGZvciAoaSA9IDA7IGkgPCA0ODAwMDsgaSsrKQorICAgIGRhdGFbaV0gPSAobiAlIDIgPT0gMCkgPyAtMS4wIDogMS4wOworCisgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAoYnVmZmVyLCBnc3RfbWVtb3J5X25ld193cmFwcGVkICgwLCBkYXRhLAorICAgICAgICAgIHNpemUsIDAsIHNpemUsIGRhdGEsIGdfZnJlZSkpOworCisgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpID0gR1NUX0JVRkZFUl9PRkZTRVRfTk9ORTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcikgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKGJ1ZmZlcikgPSBHU1RfQlVGRkVSX09GRlNFVF9OT05FOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpID0gR1NUX1NFQ09ORDsKK30KKworc3RhdGljIHZvaWQKK3NyY19oYW5kb2ZmX2Zsb2F0MzJfaW50ZXJsZWF2ZWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgR3N0UGFkICogcGFkLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIHNyY19oYW5kb2ZmX2Zsb2F0MzIgKGVsZW1lbnQsIGJ1ZmZlciwgcGFkLCBUUlVFLCB1c2VyX2RhdGEpOworfQorCitzdGF0aWMgdm9pZAorc3JjX2hhbmRvZmZfZmxvYXQzMl9ub25faW50ZXJsZWF2ZWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgR3N0UGFkICogcGFkLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIHNyY19oYW5kb2ZmX2Zsb2F0MzIgKGVsZW1lbnQsIGJ1ZmZlciwgcGFkLCBGQUxTRSwgdXNlcl9kYXRhKTsKK30KKworc3RhdGljIHZvaWQKK3NpbmtfaGFuZG9mZl9mbG9hdDMyIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0QnVmZmVyICogYnVmZmVyLCBHc3RQYWQgKiBwYWQsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworICBnZmxvYXQgKmRhdGE7CisgIEdzdENhcHMgKmNhcHMsICpjY2FwczsKKyAgZ2ludCBuID0gR1BPSU5URVJfVE9fSU5UICh1c2VyX2RhdGEpOworICBndWludDY0IG1hc2s7CisKKyAgZmFpbF91bmxlc3MgKEdTVF9JU19CVUZGRVIgKGJ1ZmZlcikpOworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBkYXRhID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChtYXAuc2l6ZSwgNDgwMDAgKiAyICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSwgR1NUX1NFQ09ORCk7CisKKyAgaWYgKG4gPT0gMCkgeworICAgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHBvc1syXSA9CisgICAgICAgIHsgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTk9ORSwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTk9ORSB9OworICAgIGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uc190b19tYXNrIChwb3MsIDIsIEZBTFNFLCAmbWFzayk7CisgIH0gZWxzZSBpZiAobiA9PSAxKSB7CisgICAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zWzJdID0geyBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQKKyAgICB9OworICAgIGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uc190b19tYXNrIChwb3MsIDIsIEZBTFNFLCAmbWFzayk7CisgIH0gZWxzZSBpZiAobiA9PSAyKSB7CisgICAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zWzJdID0geyBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIsCisgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0NFTlRFUgorICAgIH07CisgICAgZ3N0X2F1ZGlvX2NoYW5uZWxfcG9zaXRpb25zX3RvX21hc2sgKHBvcywgMiwgRkFMU0UsICZtYXNrKTsKKyAgfSBlbHNlIHsKKyAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgfQorCisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLAorICAgICAgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsIEdTVF9BVURJT19ORSAoRjMyKSwKKyAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDIsICJyYXRlIiwgR19UWVBFX0lOVCwgNDgwMDAsCisgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImludGVybGVhdmVkIiwKKyAgICAgICJjaGFubmVsLW1hc2siLCBHU1RfVFlQRV9CSVRNQVNLLCBtYXNrLCBOVUxMKTsKKworICBjY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAocGFkKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2lzX2VxdWFsIChjYXBzLCBjY2FwcykpOworICBnc3RfY2Fwc191bnJlZiAoY2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyNpZmRlZiBIQVZFX1ZBTEdSSU5ECisgIGlmICghKFJVTk5JTkdfT05fVkFMR1JJTkQpKQorI2VuZGlmCisgICAgZm9yIChpID0gMDsgaSA8IDQ4MDAwICogMjsgaSArPSAyKSB7CisgICAgICBmYWlsX3VubGVzc19lcXVhbHNfZmxvYXQgKGRhdGFbaV0sIC0xLjApOworICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2Zsb2F0IChkYXRhW2kgKyAxXSwgMS4wKTsKKyAgICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKKyAgaGF2ZV9kYXRhKys7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2ludGVybGVhdmVfMmNoX3BpcGVsaW5lIChnYm9vbGVhbiBpbnRlcmxlYXZlZCkKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmUsICpxdWV1ZSwgKnNyYzEsICpzcmMyLCAqaW50ZXJsZWF2ZSwgKnNpbms7CisgIEdzdFBhZCAqc2lua3BhZDAsICpzaW5rcGFkMSwgKnRtcCwgKnRtcDI7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKyAgdm9pZCAqc3JjX2hhbmRvZmZfZmxvYXQzMiA9CisgICAgICBpbnRlcmxlYXZlZCA/ICZzcmNfaGFuZG9mZl9mbG9hdDMyX2ludGVybGVhdmVkIDoKKyAgICAgICZzcmNfaGFuZG9mZl9mbG9hdDMyX25vbl9pbnRlcmxlYXZlZDsKKworICBoYXZlX2RhdGEgPSAwOworCisgIHBpcGVsaW5lID0gKEdzdEVsZW1lbnQgKikgZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIGZhaWxfdW5sZXNzIChwaXBlbGluZSAhPSBOVUxMKTsKKworICBzcmMxID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNyYyIsICJzcmMxIik7CisgIGZhaWxfdW5sZXNzIChzcmMxICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKHNyYzEsICJudW0tYnVmZmVycyIsIDQsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNyYzEsICJzaWduYWwtaGFuZG9mZnMiLCBUUlVFLCBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoc3JjMSwgImhhbmRvZmYiLCBHX0NBTExCQUNLIChzcmNfaGFuZG9mZl9mbG9hdDMyKSwKKyAgICAgIEdJTlRfVE9fUE9JTlRFUiAoMCkpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBzcmMxKTsKKworICBzcmMyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNyYyIsICJzcmMyIik7CisgIGZhaWxfdW5sZXNzIChzcmMyICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKHNyYzIsICJudW0tYnVmZmVycyIsIDQsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNyYzIsICJzaWduYWwtaGFuZG9mZnMiLCBUUlVFLCBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoc3JjMiwgImhhbmRvZmYiLCBHX0NBTExCQUNLIChzcmNfaGFuZG9mZl9mbG9hdDMyKSwKKyAgICAgIEdJTlRfVE9fUE9JTlRFUiAoMSkpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBzcmMyKTsKKworICBxdWV1ZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInF1ZXVlIiwgInF1ZXVlIik7CisgIGZhaWxfdW5sZXNzIChxdWV1ZSAhPSBOVUxMKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgcXVldWUpOworCisgIGludGVybGVhdmUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJpbnRlcmxlYXZlIiwgImludGVybGVhdmUiKTsKKyAgZmFpbF91bmxlc3MgKGludGVybGVhdmUgIT0gTlVMTCk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIGdzdF9vYmplY3RfcmVmIChpbnRlcmxlYXZlKSk7CisKKyAgc2lua3BhZDAgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKGludGVybGVhdmUsICJzaW5rXyV1Iik7CisgIGZhaWxfdW5sZXNzIChzaW5rcGFkMCAhPSBOVUxMKTsKKyAgdG1wID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNyYzEsICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAodG1wLCBzaW5rcGFkMCkgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodG1wKTsKKworICBzaW5rcGFkMSA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoaW50ZXJsZWF2ZSwgInNpbmtfJXUiKTsKKyAgZmFpbF91bmxlc3MgKHNpbmtwYWQxICE9IE5VTEwpOworICB0bXAgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc3JjMiwgInNyYyIpOworICB0bXAyID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHF1ZXVlLCAic2luayIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rICh0bXAsIHRtcDIpID09IEdTVF9QQURfTElOS19PSyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHRtcCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHRtcDIpOworICB0bXAgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocXVldWUsICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAodG1wLCBzaW5rcGFkMSkgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodG1wKTsKKworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAic2luayIpOworICBmYWlsX3VubGVzcyAoc2luayAhPSBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzaW5rLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNpbmssICJoYW5kb2ZmIiwgR19DQUxMQkFDSyAoc2lua19oYW5kb2ZmX2Zsb2F0MzIpLAorICAgICAgR0lOVF9UT19QT0lOVEVSICgwKSk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIHNpbmspOworICB0bXAgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoaW50ZXJsZWF2ZSwgInNyYyIpOworICB0bXAyID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNpbmssICJzaW5rIik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKHRtcCwgdG1wMikgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodG1wKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodG1wMik7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIG1zZyA9IGdzdF9idXNfcG9sbCAoR1NUX0VMRU1FTlRfQlVTIChwaXBlbGluZSksIEdTVF9NRVNTQUdFX0VPUywgLTEpOworICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKworICBmYWlsX3VubGVzcyAoaGF2ZV9kYXRhID09IDQpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAoaW50ZXJsZWF2ZSwgc2lua3BhZDApOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkMCk7CisgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKGludGVybGVhdmUsIHNpbmtwYWQxKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZDEpOworICBnc3Rfb2JqZWN0X3VucmVmIChpbnRlcmxlYXZlKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9pbnRlcmxlYXZlXzJjaF9waXBlbGluZV9pbnRlcmxlYXZlZCkKK3sKKyAgdGVzdF9pbnRlcmxlYXZlXzJjaF9waXBlbGluZSAoVFJVRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaW50ZXJsZWF2ZV8yY2hfcGlwZWxpbmVfbm9uX2ludGVybGVhdmVkKQoreworICB0ZXN0X2ludGVybGVhdmVfMmNoX3BpcGVsaW5lIChGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaW50ZXJsZWF2ZV8yY2hfcGlwZWxpbmVfaW5wdXRfY2hhbnBvcykKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmUsICpxdWV1ZSwgKnNyYzEsICpzcmMyLCAqaW50ZXJsZWF2ZSwgKnNpbms7CisgIEdzdFBhZCAqc2lua3BhZDAsICpzaW5rcGFkMSwgKnRtcCwgKnRtcDI7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKworICBoYXZlX2RhdGEgPSAwOworCisgIHBpcGVsaW5lID0gKEdzdEVsZW1lbnQgKikgZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIGZhaWxfdW5sZXNzIChwaXBlbGluZSAhPSBOVUxMKTsKKworICBzcmMxID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNyYyIsICJzcmMxIik7CisgIGZhaWxfdW5sZXNzIChzcmMxICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKHNyYzEsICJudW0tYnVmZmVycyIsIDQsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNyYzEsICJzaWduYWwtaGFuZG9mZnMiLCBUUlVFLCBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoc3JjMSwgImhhbmRvZmYiLAorICAgICAgR19DQUxMQkFDSyAoc3JjX2hhbmRvZmZfZmxvYXQzMl9pbnRlcmxlYXZlZCksIEdJTlRfVE9fUE9JTlRFUiAoMikpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBzcmMxKTsKKworICBzcmMyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNyYyIsICJzcmMyIik7CisgIGZhaWxfdW5sZXNzIChzcmMyICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKHNyYzIsICJudW0tYnVmZmVycyIsIDQsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNyYzIsICJzaWduYWwtaGFuZG9mZnMiLCBUUlVFLCBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoc3JjMiwgImhhbmRvZmYiLAorICAgICAgR19DQUxMQkFDSyAoc3JjX2hhbmRvZmZfZmxvYXQzMl9pbnRlcmxlYXZlZCksIEdJTlRfVE9fUE9JTlRFUiAoMykpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBzcmMyKTsKKworICBxdWV1ZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInF1ZXVlIiwgInF1ZXVlIik7CisgIGZhaWxfdW5sZXNzIChxdWV1ZSAhPSBOVUxMKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgcXVldWUpOworCisgIGludGVybGVhdmUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJpbnRlcmxlYXZlIiwgImludGVybGVhdmUiKTsKKyAgZmFpbF91bmxlc3MgKGludGVybGVhdmUgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoaW50ZXJsZWF2ZSwgImNoYW5uZWwtcG9zaXRpb25zLWZyb20taW5wdXQiLCBUUlVFLCBOVUxMKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgZ3N0X29iamVjdF9yZWYgKGludGVybGVhdmUpKTsKKworICBzaW5rcGFkMCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoaW50ZXJsZWF2ZSwgInNpbmtfJXUiKTsKKyAgZmFpbF91bmxlc3MgKHNpbmtwYWQwICE9IE5VTEwpOworICB0bXAgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc3JjMSwgInNyYyIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rICh0bXAsIHNpbmtwYWQwKSA9PSBHU1RfUEFEX0xJTktfT0spOworICBnc3Rfb2JqZWN0X3VucmVmICh0bXApOworCisgIHNpbmtwYWQxID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChpbnRlcmxlYXZlLCAic2lua18ldSIpOworICBmYWlsX3VubGVzcyAoc2lua3BhZDEgIT0gTlVMTCk7CisgIHRtcCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzcmMyLCAic3JjIik7CisgIHRtcDIgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocXVldWUsICJzaW5rIik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKHRtcCwgdG1wMikgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodG1wKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodG1wMik7CisgIHRtcCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChxdWV1ZSwgInNyYyIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rICh0bXAsIHNpbmtwYWQxKSA9PSBHU1RfUEFEX0xJTktfT0spOworICBnc3Rfb2JqZWN0X3VucmVmICh0bXApOworCisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsICJzaW5rIik7CisgIGZhaWxfdW5sZXNzIChzaW5rICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKHNpbmssICJzaWduYWwtaGFuZG9mZnMiLCBUUlVFLCBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoc2luaywgImhhbmRvZmYiLCBHX0NBTExCQUNLIChzaW5rX2hhbmRvZmZfZmxvYXQzMiksCisgICAgICBHSU5UX1RPX1BPSU5URVIgKDEpKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc2luayk7CisgIHRtcCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChpbnRlcmxlYXZlLCAic3JjIik7CisgIHRtcDIgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc2luaywgInNpbmsiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAodG1wLCB0bXAyKSA9PSBHU1RfUEFEX0xJTktfT0spOworICBnc3Rfb2JqZWN0X3VucmVmICh0bXApOworICBnc3Rfb2JqZWN0X3VucmVmICh0bXAyKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgbXNnID0gZ3N0X2J1c19wb2xsIChHU1RfRUxFTUVOVF9CVVMgKHBpcGVsaW5lKSwgR1NUX01FU1NBR0VfRU9TLCAtMSk7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworCisgIGZhaWxfdW5sZXNzIChoYXZlX2RhdGEgPT0gNCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkIChpbnRlcmxlYXZlLCBzaW5rcGFkMCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQwKTsKKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAoaW50ZXJsZWF2ZSwgc2lua3BhZDEpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkMSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGludGVybGVhdmUpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaW50ZXJsZWF2ZV8yY2hfcGlwZWxpbmVfY3VzdG9tX2NoYW5wb3MpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lLCAqcXVldWUsICpzcmMxLCAqc3JjMiwgKmludGVybGVhdmUsICpzaW5rOworICBHc3RQYWQgKnNpbmtwYWQwLCAqc2lua3BhZDEsICp0bXAsICp0bXAyOworICBHc3RNZXNzYWdlICptc2c7CisgIEdWYWx1ZUFycmF5ICphcnI7CisgIEdWYWx1ZSB2YWwgPSB7IDAsIH07CisKKyAgaGF2ZV9kYXRhID0gMDsKKworICBwaXBlbGluZSA9IChHc3RFbGVtZW50ICopIGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBmYWlsX3VubGVzcyAocGlwZWxpbmUgIT0gTlVMTCk7CisKKyAgc3JjMSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzcmMiLCAic3JjMSIpOworICBmYWlsX3VubGVzcyAoc3JjMSAhPSBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzcmMxLCAibnVtLWJ1ZmZlcnMiLCA0LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzcmMxLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNyYzEsICJoYW5kb2ZmIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKHNyY19oYW5kb2ZmX2Zsb2F0MzJfaW50ZXJsZWF2ZWQpLCBHSU5UX1RPX1BPSU5URVIgKDApKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc3JjMSk7CisKKyAgc3JjMiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzcmMiLCAic3JjMiIpOworICBmYWlsX3VubGVzcyAoc3JjMiAhPSBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzcmMyLCAibnVtLWJ1ZmZlcnMiLCA0LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzcmMyLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNyYzIsICJoYW5kb2ZmIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKHNyY19oYW5kb2ZmX2Zsb2F0MzJfaW50ZXJsZWF2ZWQpLCBHSU5UX1RPX1BPSU5URVIgKDEpKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc3JjMik7CisKKyAgcXVldWUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJxdWV1ZSIsICJxdWV1ZSIpOworICBmYWlsX3VubGVzcyAocXVldWUgIT0gTlVMTCk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIHF1ZXVlKTsKKworICBpbnRlcmxlYXZlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiaW50ZXJsZWF2ZSIsICJpbnRlcmxlYXZlIik7CisgIGZhaWxfdW5sZXNzIChpbnRlcmxlYXZlICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKGludGVybGVhdmUsICJjaGFubmVsLXBvc2l0aW9ucy1mcm9tLWlucHV0IiwgRkFMU0UsIE5VTEwpOworICBhcnIgPSBnX3ZhbHVlX2FycmF5X25ldyAoMik7CisKKyAgZ192YWx1ZV9pbml0ICgmdmFsLCBHU1RfVFlQRV9BVURJT19DSEFOTkVMX1BPU0lUSU9OKTsKKyAgZ192YWx1ZV9zZXRfZW51bSAoJnZhbCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSKTsKKyAgZ192YWx1ZV9hcnJheV9hcHBlbmQgKGFyciwgJnZhbCk7CisgIGdfdmFsdWVfcmVzZXQgKCZ2YWwpOworICBnX3ZhbHVlX3NldF9lbnVtICgmdmFsLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0NFTlRFUik7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kIChhcnIsICZ2YWwpOworICBnX3ZhbHVlX3Vuc2V0ICgmdmFsKTsKKworICBnX29iamVjdF9zZXQgKGludGVybGVhdmUsICJjaGFubmVsLXBvc2l0aW9ucyIsIGFyciwgTlVMTCk7CisgIGdfdmFsdWVfYXJyYXlfZnJlZSAoYXJyKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgZ3N0X29iamVjdF9yZWYgKGludGVybGVhdmUpKTsKKworICBzaW5rcGFkMCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoaW50ZXJsZWF2ZSwgInNpbmtfJXUiKTsKKyAgZmFpbF91bmxlc3MgKHNpbmtwYWQwICE9IE5VTEwpOworICB0bXAgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc3JjMSwgInNyYyIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rICh0bXAsIHNpbmtwYWQwKSA9PSBHU1RfUEFEX0xJTktfT0spOworICBnc3Rfb2JqZWN0X3VucmVmICh0bXApOworCisgIHNpbmtwYWQxID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChpbnRlcmxlYXZlLCAic2lua18ldSIpOworICBmYWlsX3VubGVzcyAoc2lua3BhZDEgIT0gTlVMTCk7CisgIHRtcCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzcmMyLCAic3JjIik7CisgIHRtcDIgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocXVldWUsICJzaW5rIik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKHRtcCwgdG1wMikgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodG1wKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodG1wMik7CisgIHRtcCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChxdWV1ZSwgInNyYyIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rICh0bXAsIHNpbmtwYWQxKSA9PSBHU1RfUEFEX0xJTktfT0spOworICBnc3Rfb2JqZWN0X3VucmVmICh0bXApOworCisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsICJzaW5rIik7CisgIGZhaWxfdW5sZXNzIChzaW5rICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKHNpbmssICJzaWduYWwtaGFuZG9mZnMiLCBUUlVFLCBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoc2luaywgImhhbmRvZmYiLCBHX0NBTExCQUNLIChzaW5rX2hhbmRvZmZfZmxvYXQzMiksCisgICAgICBHSU5UX1RPX1BPSU5URVIgKDIpKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc2luayk7CisgIHRtcCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChpbnRlcmxlYXZlLCAic3JjIik7CisgIHRtcDIgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc2luaywgInNpbmsiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAodG1wLCB0bXAyKSA9PSBHU1RfUEFEX0xJTktfT0spOworICBnc3Rfb2JqZWN0X3VucmVmICh0bXApOworICBnc3Rfb2JqZWN0X3VucmVmICh0bXAyKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgbXNnID0gZ3N0X2J1c19wb2xsIChHU1RfRUxFTUVOVF9CVVMgKHBpcGVsaW5lKSwgR1NUX01FU1NBR0VfRU9TLCAtMSk7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworCisgIGZhaWxfdW5sZXNzIChoYXZlX2RhdGEgPT0gNCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkIChpbnRlcmxlYXZlLCBzaW5rcGFkMCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQwKTsKKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAoaW50ZXJsZWF2ZSwgc2lua3BhZDEpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkMSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGludGVybGVhdmUpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK2ludGVybGVhdmVfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiaW50ZXJsZWF2ZSIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX3NldF90aW1lb3V0ICh0Y19jaGFpbiwgMTgwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2NyZWF0ZV9hbmRfdW5yZWYpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcmVxdWVzdF9wYWRzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ludGVybGVhdmVfMmNoKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ludGVybGVhdmVfMmNoXzFlb3MpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaW50ZXJsZWF2ZV8yY2hfcGlwZWxpbmVfaW50ZXJsZWF2ZWQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaW50ZXJsZWF2ZV8yY2hfcGlwZWxpbmVfbm9uX2ludGVybGVhdmVkKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ludGVybGVhdmVfMmNoX3BpcGVsaW5lX2lucHV0X2NoYW5wb3MpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaW50ZXJsZWF2ZV8yY2hfcGlwZWxpbmVfY3VzdG9tX2NoYW5wb3MpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoaW50ZXJsZWF2ZSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9qcGVnZGVjLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9qcGVnZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhYzUyMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2pwZWdkZWMuYwpAQCAtMCwwICsxLDE0MSBAQAorLyogR1N0cmVhbWVyCisgKiB1bml0IHRlc3QgZm9yIGpwZWdkZWMKKyAqIENvcHlyaWdodCAoQykgPDIwMTA+IFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSA8MjAxMj4gTWF0aGlhcyBIYXNzZWxtYW5uIDxtYXRoaWFzQG9wZW5pc211cy5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z2lvL2dpby5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC9hcHAvZ3N0YXBwc2luay5oPgorI2luY2x1ZGUgPGdzdC9wYnV0aWxzL2dzdGRpc2NvdmVyZXIuaD4KKworLyogVmVyaWZ5IGpwZWdkZWMgaXMgd29ya2luZyB3aGVuIGV4cGxpY3RseSByZXF1ZXN0ZWQgYnkgYSBwaXBlbGluZS4gKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X2pwZWdkZWNfZXhwbGljaXQpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lLCAqc291cmNlLCAqZGVjLCAqc2luazsKKyAgR3N0U2FtcGxlICpzYW1wbGU7CisKKyAgLyogY29uc3RydWN0IGEgcGlwZWxpbmUgdGhhdCBleHBsaWNpdGx5IHVzZXMganBlZ2RlYyAqLworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKE5VTEwpOworICBzb3VyY2UgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmaWxlc3JjIiwgTlVMTCk7CisgIGRlYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImpwZWdkZWMiLCBOVUxMKTsKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImFwcHNpbmsiLCBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHNvdXJjZSwgZGVjLCBzaW5rLCBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19tYW55IChzb3VyY2UsIGRlYywgc2luaywgTlVMTCk7CisKKyAgLyogcG9pbnQgdGhhdCBwaXBlbGluZSB0byBvdXIgdGVzdCBpbWFnZSAqLworICB7CisgICAgY2hhciAqZmlsZW5hbWUgPSBnX2J1aWxkX2ZpbGVuYW1lIChHU1RfVEVTVF9GSUxFU19QQVRILCAiaW1hZ2UuanBnIiwgTlVMTCk7CisgICAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc291cmNlKSwgImxvY2F0aW9uIiwgZmlsZW5hbWUsIE5VTEwpOworICAgIGdfZnJlZSAoZmlsZW5hbWUpOworICB9CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIHNhbXBsZSA9IGdzdF9hcHBfc2lua19wdWxsX3NhbXBsZSAoR1NUX0FQUF9TSU5LIChzaW5rKSk7CisgIGZhaWxfdW5sZXNzIChHU1RfSVNfU0FNUExFIChzYW1wbGUpKTsKKworICAvKiBkbyBzb21lIGJhc2ljIGNoZWNrcyB0byB2ZXJpZnkgaW1hZ2UgZGVjb2RpbmcgKi8KKyAgeworICAgIEdzdENhcHMgKmRlY29kZWQ7CisgICAgR3N0Q2FwcyAqZXhwZWN0ZWQ7CisKKyAgICBkZWNvZGVkID0gZ3N0X3NhbXBsZV9nZXRfY2FwcyAoc2FtcGxlKTsKKyAgICBleHBlY3RlZCA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nICgidmlkZW8veC1yYXcsIHdpZHRoPTEyMCwgaGVpZ2h0PTE2MCIpOworCisgICAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2lzX2Fsd2F5c19jb21wYXRpYmxlIChkZWNvZGVkLCBleHBlY3RlZCkpOworCisgICAgZ3N0X2NhcHNfdW5yZWYgKGV4cGVjdGVkKTsKKyAgfQorICBnc3Rfc2FtcGxlX3VucmVmIChzYW1wbGUpOworCisgIC8qIHdhaXQgZm9yIEVPUyAqLworICBzYW1wbGUgPSBnc3RfYXBwX3NpbmtfcHVsbF9zYW1wbGUgKEdTVF9BUFBfU0lOSyAoc2luaykpOworICBmYWlsX3VubGVzcyAoc2FtcGxlID09IE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2FwcF9zaW5rX2lzX2VvcyAoR1NUX0FQUF9TSU5LIChzaW5rKSkpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFZlcmlmeSBKUEVHIGRpc2NvdmVyeSBpcyB3b3JraW5nLiBSaWdodCBub3cganBlZ2RlYyB3b3VsZCBiZSB1c2VkLAorICogYnV0IEkgaGF2ZSBubyBpZGVhIGhvdyB0byBhY3R1YWxseSB2ZXJpZnkgdGhpcy4gKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X2pwZWdkZWNfZGlzY292ZXIpCit7CisgIEdzdERpc2NvdmVyZXIgKmRpc2NvOworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKyAgY2hhciAqdXJpOworICBHc3REaXNjb3ZlcmVySW5mbyAqaW5mbzsKKyAgR3N0RGlzY292ZXJlclZpZGVvSW5mbyAqdmlkZW87CisKKyAgZGlzY28gPSBnc3RfZGlzY292ZXJlcl9uZXcgKDUgKiBHU1RfU0VDT05ELCAmZXJyb3IpOworCisgIGZhaWxfdW5sZXNzIChHU1RfSVNfRElTQ09WRVJFUiAoZGlzY28pKTsKKyAgZmFpbF91bmxlc3MgKGVycm9yID09IE5VTEwsICIlcyIsIChlcnJvciA/IGVycm9yLT5tZXNzYWdlIDogIiIpKTsKKworICB7CisgICAgR0ZpbGUgKnRlc3RkaXIgPSBnX2ZpbGVfbmV3X2Zvcl9wYXRoIChHU1RfVEVTVF9GSUxFU19QQVRIKTsKKyAgICBHRmlsZSAqdGVzdGZpbGUgPSBnX2ZpbGVfcmVzb2x2ZV9yZWxhdGl2ZV9wYXRoICh0ZXN0ZGlyLCAiaW1hZ2UuanBnIik7CisgICAgdXJpID0gZ19maWxlX2dldF91cmkgKHRlc3RmaWxlKTsKKyAgICBnX29iamVjdF91bnJlZiAodGVzdGZpbGUpOworICAgIGdfb2JqZWN0X3VucmVmICh0ZXN0ZGlyKTsKKyAgfQorCisgIGluZm8gPSBnc3RfZGlzY292ZXJlcl9kaXNjb3Zlcl91cmkgKGRpc2NvLCB1cmksICZlcnJvcik7CisgIGZhaWxfdW5sZXNzIChHU1RfSVNfRElTQ09WRVJFUl9JTkZPIChpbmZvKSk7CisgIGZhaWxfdW5sZXNzIChlcnJvciA9PSBOVUxMLCAiJXM6ICVzIiwgdXJpLCAoZXJyb3IgPyBlcnJvci0+bWVzc2FnZSA6ICIiKSk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoZ3N0X2Rpc2NvdmVyZXJfaW5mb19nZXRfdXJpIChpbmZvKSwgdXJpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2Rpc2NvdmVyZXJfaW5mb19nZXRfcmVzdWx0IChpbmZvKSwKKyAgICAgIEdTVF9ESVNDT1ZFUkVSX09LKTsKKworICB2aWRlbyA9CisgICAgICBHU1RfRElTQ09WRVJFUl9WSURFT19JTkZPIChnc3RfZGlzY292ZXJlcl9pbmZvX2dldF9zdHJlYW1faW5mbyAoaW5mbykpOworICBmYWlsX3VubGVzcyAodmlkZW8gIT0gTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9kaXNjb3ZlcmVyX3ZpZGVvX2luZm9faXNfaW1hZ2UgKHZpZGVvKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9kaXNjb3ZlcmVyX3ZpZGVvX2luZm9fZ2V0X3dpZHRoICh2aWRlbyksIDEyMCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9kaXNjb3ZlcmVyX3ZpZGVvX2luZm9fZ2V0X2hlaWdodCAodmlkZW8pLCAxNjApOworCisgIGdzdF9kaXNjb3ZlcmVyX2luZm9fdW5yZWYgKHZpZGVvKTsKKyAgZ3N0X2Rpc2NvdmVyZXJfaW5mb191bnJlZiAoaW5mbyk7CisgIGdfZnJlZSAodXJpKTsKKyAgZ19vYmplY3RfdW5yZWYgKGRpc2NvKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgoranBlZ2RlY19zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJqcGVnZGVjIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2pwZWdkZWNfZXhwbGljaXQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfanBlZ2RlY19kaXNjb3Zlcik7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChqcGVnZGVjKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2pwZWdlbmMuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2pwZWdlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTkxYTdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvanBlZ2VuYy5jCkBAIC0wLDAgKzEsMjQwIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIGpwZWdlbmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDwyMDEwPiBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvYXBwL2dzdGFwcHNpbmsuaD4KKworLyogRm9yIGVhc2Ugb2YgcHJvZ3JhbW1pbmcgd2UgdXNlIGdsb2JhbHMgdG8ga2VlcCByZWZzIGZvciBvdXIgZmxvYXRpbmcKKyAqIHNpbmsgcGFkcyB3ZSBjcmVhdGU7IG90aGVyd2lzZSB3ZSBhbHdheXMgaGF2ZSB0byBkbyBnZXRfcGFkLAorICogZ2V0X3BlZXIsIGFuZCB0aGVuIHJlbW92ZSByZWZlcmVuY2VzIGluIGV2ZXJ5IHRlc3QgZnVuY3Rpb24gKi8KK3N0YXRpYyBHc3RQYWQgKm15c2lua3BhZDsKK3N0YXRpYyBHc3RQYWQgKm15c3JjcGFkOworCisjZGVmaW5lIEpQRUdfQ0FQU19TVFJJTkcgImltYWdlL2pwZWciCisKKyNkZWZpbmUgSlBFR19DQVBTX1JFU1RSSUNUSVZFICJpbWFnZS9qcGVnLCAiIFwKKyAgICAid2lkdGggPSAoaW50KSBbMTAwLCAyMDBdLCAiIFwKKyAgICAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSAyNS8xLCAiIFwKKyAgICAiZXh0cmFwYXJhbWV0ZXIgPSAoc3RyaW5nKSB7IGFiYywgZGVmIH0iCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBqcGVnX3Npbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoSlBFR19DQVBTX1NUUklORykpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgYW55X3Npbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUganBlZ19yZXN0cmljdGl2ZV9zaW5rdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChKUEVHX0NBUFNfUkVTVFJJQ1RJVkUpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGFueV9zcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKKworCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF9qcGVnZW5jIChHc3RTdGF0aWNQYWRUZW1wbGF0ZSAqIHNpbmt0ZW1wbGF0ZSkKK3sKKyAgR3N0RWxlbWVudCAqanBlZ2VuYzsKKworICBHU1RfREVCVUcgKCJzZXR1cF9qcGVnZW5jIik7CisgIGpwZWdlbmMgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoImpwZWdlbmMiKTsKKyAgbXlzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChqcGVnZW5jLCBzaW5rdGVtcGxhdGUpOworICBteXNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkIChqcGVnZW5jLCAmYW55X3NyY3RlbXBsYXRlKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICByZXR1cm4ganBlZ2VuYzsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfanBlZ2VuYyAoR3N0RWxlbWVudCAqIGpwZWdlbmMpCit7CisgIEdTVF9ERUJVRyAoImNsZWFudXBfanBlZ2VuYyIpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGpwZWdlbmMsIEdTVF9TVEFURV9OVUxMKTsKKworICBnc3RfY2hlY2tfZHJvcF9idWZmZXJzICgpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBGQUxTRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBGQUxTRSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAoanBlZ2VuYyk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zcmNfcGFkIChqcGVnZW5jKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGpwZWdlbmMpOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2NyZWF0ZV92aWRlb19idWZmZXIgKEdzdENhcHMgKiBjYXBzKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0RWxlbWVudCAqY2Y7CisgIEdzdEVsZW1lbnQgKnNpbms7CisgIEdzdFNhbXBsZSAqc2FtcGxlOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKworICBwaXBlbGluZSA9CisgICAgICBnc3RfcGFyc2VfbGF1bmNoCisgICAgICAoInZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz0xICEgY2Fwc2ZpbHRlciBuYW1lPWNmICEgYXBwc2luayBuYW1lPXNpbmsiLAorICAgICAgTlVMTCk7CisgIGdfYXNzZXJ0IChwaXBlbGluZSAhPSBOVUxMKTsKKworICBjZiA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgImNmIik7CisgIHNpbmsgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJzaW5rIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoY2YpLCAiY2FwcyIsIGNhcHMsIE5VTEwpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICBzYW1wbGUgPSBnc3RfYXBwX3NpbmtfcHVsbF9zYW1wbGUgKEdTVF9BUFBfU0lOSyAoc2luaykpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoY2YpOworCisgIGJ1ZmZlciA9IGdzdF9zYW1wbGVfZ2V0X2J1ZmZlciAoc2FtcGxlKTsKKyAgZ3N0X2J1ZmZlcl9yZWYgKGJ1ZmZlcik7CisKKyAgZ3N0X3NhbXBsZV91bnJlZiAoc2FtcGxlKTsKKworICByZXR1cm4gYnVmZmVyOworfQorCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2pwZWdlbmNfZ2V0Y2FwcykKK3sKKyAgR3N0RWxlbWVudCAqanBlZ2VuYzsKKyAgR3N0UGFkICpzaW5rcGFkOworICBHc3RDYXBzICpjYXBzOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2ludCBmcHNfbjsKKyAgZ2ludCBmcHNfZDsKKyAgY29uc3QgR1ZhbHVlICp2YWx1ZTsKKworICAvKiB3ZSBhcmUgZ29pbmcgdG8gZG8gc29tZSBnZXQgY2FwcyB0byBjb25maXJtIGl0IGRvZXNuJ3QgcmV0dXJuIG5vbi1zdWJzZXQKKyAgICogY2FwcyAqLworCisgIGpwZWdlbmMgPSBzZXR1cF9qcGVnZW5jICgmYW55X3Npbmt0ZW1wbGF0ZSk7CisgIHNpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoanBlZ2VuYywgInNpbmsiKTsKKyAgLyogdGhpcyBzaG91bGQgYXNzZXJ0IGlmIG5vbi1zdWJzZXQgKi8KKyAgY2FwcyA9IGdzdF9wYWRfcXVlcnlfY2FwcyAoc2lua3BhZCwgTlVMTCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZCk7CisgIGNsZWFudXBfanBlZ2VuYyAoanBlZ2VuYyk7CisKKyAganBlZ2VuYyA9IHNldHVwX2pwZWdlbmMgKCZqcGVnX3Npbmt0ZW1wbGF0ZSk7CisgIHNpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoanBlZ2VuYywgInNpbmsiKTsKKyAgLyogdGhpcyBzaG91bGQgYXNzZXJ0IGlmIG5vbi1zdWJzZXQgKi8KKyAgY2FwcyA9IGdzdF9wYWRfcXVlcnlfY2FwcyAoc2lua3BhZCwgTlVMTCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZCk7CisgIGNsZWFudXBfanBlZ2VuYyAoanBlZ2VuYyk7CisKKyAgLyogbm93IHVzZSBhIG1vcmUgcmVzdHJpY3RlZCBvbmUgYW5kIGNoZWNrIHRoZSByZXN1bHRpbmcgY2FwcyAqLworICBqcGVnZW5jID0gc2V0dXBfanBlZ2VuYyAoJmpwZWdfcmVzdHJpY3RpdmVfc2lua3RlbXBsYXRlKTsKKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChqcGVnZW5jLCAic2luayIpOworICAvKiB0aGlzIHNob3VsZCBhc3NlcnQgaWYgbm9uLXN1YnNldCAqLworICBjYXBzID0gZ3N0X3BhZF9xdWVyeV9jYXBzIChzaW5rcGFkLCBOVUxMKTsKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgLyogY2hlY2sgdGhlIHdpZHRoICovCisgIHZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgIndpZHRoIik7CisgIGZhaWxfdW5sZXNzIChnc3RfdmFsdWVfZ2V0X2ludF9yYW5nZV9taW4gKHZhbHVlKSA9PSAxMDApOworICBmYWlsX3VubGVzcyAoZ3N0X3ZhbHVlX2dldF9pbnRfcmFuZ2VfbWF4ICh2YWx1ZSkgPT0gMjAwKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9nZXRfZnJhY3Rpb24gKHN0cnVjdHVyZSwgImZyYW1lcmF0ZSIsICZmcHNfbiwKKyAgICAgICAgICAmZnBzX2QpKTsKKyAgZmFpbF91bmxlc3MgKGZwc19uID09IDI1KTsKKyAgZmFpbF91bmxlc3MgKGZwc19kID09IDEpOworCisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZCk7CisgIGNsZWFudXBfanBlZ2VuYyAoanBlZ2VuYyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9qcGVnZW5jX2RpZmZlcmVudF9jYXBzKQoreworICBHc3RFbGVtZW50ICpqcGVnZW5jOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0Q2FwcyAqYWxsb3dlZF9jYXBzOworCisgIC8qIG5vdyB1c2UgYSBtb3JlIHJlc3RyaWN0ZWQgb25lIGFuZCBjaGVjayB0aGUgcmVzdWx0aW5nIGNhcHMgKi8KKyAganBlZ2VuYyA9IHNldHVwX2pwZWdlbmMgKCZhbnlfc2lua3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChqcGVnZW5jLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgLyogcHVzaCBmaXJzdCBidWZmZXIgd2l0aCA4MDB4NjAwIHJlc29sdXRpb24gKi8KKyAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LXJhdyIsICJ3aWR0aCIsIEdfVFlQRV9JTlQsCisgICAgICA4MDAsICJoZWlnaHQiLCBHX1RZUEVfSU5ULCA2MDAsICJmcmFtZXJhdGUiLAorICAgICAgR1NUX1RZUEVfRlJBQ1RJT04sIDEsIDEsICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiSTQyMCIsIE5VTEwpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwganBlZ2VuYywgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKChidWZmZXIgPSBjcmVhdGVfdmlkZW9fYnVmZmVyIChjYXBzKSkgIT0gTlVMTCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworCisgIC8qIGNoZWNrIHRoZSBhbGxvd2VkIGNhcHMgdG8gc2VlIGlmIGEgc2Vjb25kIGJ1ZmZlciB3aXRoIGEgZGlmZmVyZW50CisgICAqIGNhcHMgY291bGQgYmUgbmVnb3RpYXRlZCAqLworICBhbGxvd2VkX2NhcHMgPSBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgKG15c3JjcGFkKTsKKworICAvKiB0aGUgY2FwcyB3ZSB3YW50IHRvIG5lZ290aWF0ZSB0byAqLworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcmF3IiwgIndpZHRoIiwgR19UWVBFX0lOVCwKKyAgICAgIDY0MCwgImhlaWdodCIsIEdfVFlQRV9JTlQsIDQ4MCwgImZyYW1lcmF0ZSIsCisgICAgICBHU1RfVFlQRV9GUkFDVElPTiwgMSwgMSwgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJJNDIwIiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChhbGxvd2VkX2NhcHMsIGNhcHMpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfc2V0X2NhcHMgKG15c3JjcGFkLCBjYXBzKSk7CisKKyAgLyogcHVzaCBzZWNvbmQgYnVmZmVyIHdpdGggNjQweDQ4MCByZXNvbHV0aW9uICovCisgIGJ1ZmZlciA9IGNyZWF0ZV92aWRlb19idWZmZXIgKGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBidWZmZXIpID09IEdTVF9GTE9XX09LKTsKKworICBnc3RfY2Fwc191bnJlZiAoYWxsb3dlZF9jYXBzKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChqcGVnZW5jLCBHU1RfU1RBVEVfTlVMTCk7CisgIGNsZWFudXBfanBlZ2VuYyAoanBlZ2VuYyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK2pwZWdlbmNfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgianBlZ2VuYyIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9qcGVnZW5jX2dldGNhcHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfanBlZ2VuY19kaWZmZXJlbnRfY2Fwcyk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChqcGVnZW5jKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZGUwZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jCkBAIC0wLDAgKzEsNjEyIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIGxldmVsCisgKgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLyogc3VwcHJlc3Mgd2FybmluZ3MgZm9yIGRlcHJlY2F0ZWQgQVBJIHN1Y2ggYXMgR1ZhbHVlQXJyYXkKKyAqIHdpdGggbmV3ZXIgR0xpYiB2ZXJzaW9ucyAoPj0gMi4zMS4wKSAqLworI2RlZmluZSBHTElCX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCisvKiBGb3IgZWFzZSBvZiBwcm9ncmFtbWluZyB3ZSB1c2UgZ2xvYmFscyB0byBrZWVwIHJlZnMgZm9yIG91ciBmbG9hdGluZworICogc3JjIGFuZCBzaW5rIHBhZHMgd2UgY3JlYXRlOyBvdGhlcndpc2Ugd2UgYWx3YXlzIGhhdmUgdG8gZG8gZ2V0X3BhZCwKKyAqIGdldF9wZWVyLCBhbmQgdGhlbiByZW1vdmUgcmVmZXJlbmNlcyBpbiBldmVyeSB0ZXN0IGZ1bmN0aW9uICovCitzdGF0aWMgR3N0UGFkICpteXNyY3BhZCwgKm15c2lua3BhZDsKKworI2RlZmluZSBMRVZFTF9DQVBTX1RFTVBMQVRFX1NUUklORyBcCisgICJhdWRpby94LXJhdywgIiBcCisgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgIkdTVF9BVURJT19ORShTMTYpIiwgIkdTVF9BVURJT19ORShGMzIpIiB9LCAiIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgXAorICAgICJyYXRlID0gKGludCkgWyAxLCBNQVggXSwgIiBcCisgICAgImNoYW5uZWxzID0gKGludCkgWyAxLCA4IF0iCisKKy8qIHdlIHVzZSByYXRlID0gMTAwMCBoZXJlIGZvciBlYXN5IGJ1ZmZlciBzaXplIGNhbGN1bGF0aW9ucyAqLworI2RlZmluZSBMRVZFTF9TMTZfQ0FQU19TVFJJTkcgXAorICAiYXVkaW8veC1yYXcsICIgXAorICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiR1NUX0FVRElPX05FKFMxNikiLCAiIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgXAorICAgICJyYXRlID0gKGludCkgMTAwMCwgIiBcCisgICAgImNoYW5uZWxzID0gKGludCkgMiwgIiAgXAorICAgICJjaGFubmVsLW1hc2sgPSAoYml0bWFzaykgMyIKKworI2RlZmluZSBMRVZFTF9GMzJfQ0FQU19TVFJJTkcgXAorICAiYXVkaW8veC1yYXcsICIgXAorICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiR1NUX0FVRElPX05FKEYzMikiLCAiIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgXAorICAgICJyYXRlID0gKGludCkgMTAwMCwgIiBcCisgICAgImNoYW5uZWxzID0gKGludCkgMiwgIiAgXAorICAgICJjaGFubmVsLW1hc2sgPSAoYml0bWFzaykgMyIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoTEVWRUxfQ0FQU19URU1QTEFURV9TVFJJTkcpCisgICAgKTsKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKExFVkVMX0NBUFNfVEVNUExBVEVfU1RSSU5HKQorICAgICk7CisKKy8qIHRha2VzIG92ZXIgcmVmZXJlbmNlIGZvciBvdXRjYXBzICovCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF9sZXZlbCAoY29uc3QgZ2NoYXIgKiBjYXBzX3N0cikKK3sKKyAgR3N0RWxlbWVudCAqbGV2ZWw7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgR1NUX0RFQlVHICgic2V0dXBfbGV2ZWwiKTsKKyAgbGV2ZWwgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoImxldmVsIik7CisgIG15c3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKGxldmVsLCAmc3JjdGVtcGxhdGUpOworICBteXNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKGxldmVsLCAmc2lua3RlbXBsYXRlKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKGNhcHNfc3RyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGxldmVsLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgcmV0dXJuIGxldmVsOworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF9sZXZlbCAoR3N0RWxlbWVudCAqIGxldmVsKQoreworICBHU1RfREVCVUcgKCJjbGVhbnVwX2xldmVsIik7CisKKyAgZ3N0X2NoZWNrX2Ryb3BfYnVmZmVycyAoKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAobGV2ZWwpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKGxldmVsKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGxldmVsKTsKK30KKworLyogY3JlYXRlIGEgMC4xIHNlYyBidWZmZXIgc3RlcmVvIGJ1ZmZlciAqLworc3RhdGljIEdzdEJ1ZmZlciAqCitjcmVhdGVfczE2X2J1ZmZlciAoZ2ludDE2IHZhbF9sLCBnaW50MTYgdmFsX3IpCit7CisgIEdzdEJ1ZmZlciAqYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgyICogMTAwICogc2l6ZW9mIChnaW50MTYpKTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdpbnQgajsKKyAgZ2ludDE2ICpkYXRhOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBkYXRhID0gKGdpbnQxNiAqKSBtYXAuZGF0YTsKKyAgZm9yIChqID0gMDsgaiA8IDEwMDsgKytqKSB7CisgICAgKihkYXRhKyspID0gdmFsX2w7CisgICAgKihkYXRhKyspID0gdmFsX3I7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikgPSBHX0dVSU5UNjRfQ09OU1RBTlQgKDApOworICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2NyZWF0ZV9mMzJfYnVmZmVyIChnZmxvYXQgdmFsX2wsIGdmbG9hdCB2YWxfcikKK3sKKyAgR3N0QnVmZmVyICpidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDIgKiAxMDAgKiBzaXplb2YgKGdmbG9hdCkpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2ludCBqOworICBnZmxvYXQgKmRhdGE7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGRhdGEgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGogPSAwOyBqIDwgMTAwOyArK2opIHsKKyAgICAqKGRhdGErKykgPSB2YWxfbDsKKyAgICAqKGRhdGErKykgPSB2YWxfcjsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKSA9IEdfR1VJTlQ2NF9DT05TVEFOVCAoMCk7CisgIHJldHVybiBidWY7Cit9CisKKy8qIHRlc3RzICovCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3JlZl9jb3VudHMpCit7CisgIEdzdEVsZW1lbnQgKmxldmVsOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RCdXMgKmJ1czsKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKworICBsZXZlbCA9IHNldHVwX2xldmVsIChMRVZFTF9TMTZfQ0FQU19TVFJJTkcpOworICBnX29iamVjdF9zZXQgKGxldmVsLCAicG9zdC1tZXNzYWdlcyIsIFRSVUUsCisgICAgICAiaW50ZXJ2YWwiLCAoZ3VpbnQ2NCkgR1NUX1NFQ09ORCAvIDEwLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAobGV2ZWwsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKyAgLyogY3JlYXRlIGEgYnVzIHRvIGdldCB0aGUgbGV2ZWwgbWVzc2FnZSBvbiAqLworICBidXMgPSBnc3RfYnVzX25ldyAoKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoYnVzLCAiYnVzIiwgMSk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKGxldmVsLCBidXMpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChidXMsICJidXMiLCAyKTsKKworICAvKiBjcmVhdGUgYSBmYWtlIDAuMSBzZWMgYnVmZmVyIHdpdGggYSBoYWxmLWFtcGxpdHVkZSBibG9jayBzaWduYWwgKi8KKyAgaW5idWZmZXIgPSBjcmVhdGVfczE2X2J1ZmZlciAoMTY1MzYsIDE2NTM2KTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYnV0IGl0IGVuZHMgdXAgYmVpbmcgY29sbGVjdGVkIG9uIHRoZSBnbG9iYWwgYnVmZmVyIGxpc3QgKi8KKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworICBmYWlsX3VubGVzcyAoaW5idWZmZXIgPT0gb3V0YnVmZmVyKTsKKworICBtZXNzYWdlID0gZ3N0X2J1c19wb2xsIChidXMsIEdTVF9NRVNTQUdFX0VMRU1FTlQsIC0xKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAobWVzc2FnZSwgIm1lc3NhZ2UiLCAxKTsKKworICBmYWlsX3VubGVzcyAobWVzc2FnZSAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSkgPT0gR1NUX09CSkVDVCAobGV2ZWwpKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9NRVNTQUdFX1RZUEUgKG1lc3NhZ2UpID09IEdTVF9NRVNTQUdFX0VMRU1FTlQpOworCisgIC8qIGNsZWFuIHVwICovCisgIC8qIGZsdXNoIGN1cnJlbnQgbWVzc2FnZXMsYW5kIGZ1dHVyZSBzdGF0ZSBjaGFuZ2UgbWVzc2FnZXMgKi8KKyAgZ3N0X2J1c19zZXRfZmx1c2hpbmcgKGJ1cywgVFJVRSk7CisKKyAgLyogbWVzc2FnZSBoYXMgYSByZWYgdG8gdGhlIGVsZW1lbnQgKi8KKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAobGV2ZWwsICJsZXZlbCIsIDIpOworICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKGxldmVsLCAibGV2ZWwiLCAxKTsKKworICBnc3RfZWxlbWVudF9zZXRfYnVzIChsZXZlbCwgTlVMTCk7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKGJ1cywgImJ1cyIsIDEpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChsZXZlbCwKKyAgICAgICAgICBHU1RfU1RBVEVfTlVMTCkgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLCAiY291bGQgbm90IHNldCB0byBudWxsIik7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKGxldmVsLCAibGV2ZWwiLCAxKTsKKyAgY2xlYW51cF9sZXZlbCAobGV2ZWwpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X21lc3NhZ2VfaXNfdmFsaWQpCit7CisgIEdzdEVsZW1lbnQgKmxldmVsOworICBHc3RCdWZmZXIgKmluYnVmZmVyOworICBHc3RCdXMgKmJ1czsKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdENsb2NrVGltZSBlbmR0aW1lLCB0cywgZHVyYXRpb247CisKKyAgbGV2ZWwgPSBzZXR1cF9sZXZlbCAoTEVWRUxfUzE2X0NBUFNfU1RSSU5HKTsKKyAgZ19vYmplY3Rfc2V0IChsZXZlbCwgInBvc3QtbWVzc2FnZXMiLCBUUlVFLAorICAgICAgImludGVydmFsIiwgKGd1aW50NjQpIEdTVF9TRUNPTkQgLyAxMCwgTlVMTCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAobGV2ZWwsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgLyogY3JlYXRlIGEgYnVzIHRvIGdldCB0aGUgbGV2ZWwgbWVzc2FnZSBvbiAqLworICBidXMgPSBnc3RfYnVzX25ldyAoKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAobGV2ZWwsIGJ1cyk7CisKKyAgLyogY3JlYXRlIGEgZmFrZSAwLjEgc2VjIGJ1ZmZlciB3aXRoIGEgaGFsZi1hbXBsaXR1ZGUgYmxvY2sgc2lnbmFsIGFuZCBwdXNoICovCisgIGluYnVmZmVyID0gY3JlYXRlX3MxNl9idWZmZXIgKDE2NTM2LCAxNjUzNik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworCisgIG1lc3NhZ2UgPSBnc3RfYnVzX3BvbGwgKGJ1cywgR1NUX01FU1NBR0VfRUxFTUVOVCwgLTEpOworICBmYWlsX3VubGVzcyAobWVzc2FnZSAhPSBOVUxMKTsKKyAgc3RydWN0dXJlID0gZ3N0X21lc3NhZ2VfZ2V0X3N0cnVjdHVyZSAobWVzc2FnZSk7CisgIGZhaWxfaWYgKHN0cnVjdHVyZSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAoc3RydWN0dXJlKSwgImxldmVsIik7CisgIGZhaWxfdW5sZXNzIChnc3Rfc3RydWN0dXJlX2dldF9jbG9ja190aW1lIChzdHJ1Y3R1cmUsICJlbmR0aW1lIiwgJmVuZHRpbWUpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2Nsb2NrX3RpbWUgKHN0cnVjdHVyZSwgInRpbWVzdGFtcCIsICZ0cykpOworICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9nZXRfY2xvY2tfdGltZSAoc3RydWN0dXJlLCAiZHVyYXRpb24iLCAmZHVyYXRpb24pKTsKKworICAvKiBjbGVhbiB1cCAqLworICAvKiBmbHVzaCBjdXJyZW50IG1lc3NhZ2VzLGFuZCBmdXR1cmUgc3RhdGUgY2hhbmdlIG1lc3NhZ2VzICovCisgIGdzdF9idXNfc2V0X2ZsdXNoaW5nIChidXMsIFRSVUUpOworICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKGxldmVsLCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChsZXZlbCwgR1NUX1NUQVRFX05VTEwpOworICBjbGVhbnVwX2xldmVsIChsZXZlbCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaW50MTYpCit7CisgIEdzdEVsZW1lbnQgKmxldmVsOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RCdXMgKmJ1czsKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGdpbnQgaSwgajsKKyAgY29uc3QgR1ZhbHVlICpsaXN0LCAqdmFsdWU7CisgIGdkb3VibGUgZEI7CisgIGNvbnN0IGdjaGFyICpmaWVsZHNbM10gPSB7ICJybXMiLCAicGVhayIsICJkZWNheSIgfTsKKworICBsZXZlbCA9IHNldHVwX2xldmVsIChMRVZFTF9TMTZfQ0FQU19TVFJJTkcpOworICBnX29iamVjdF9zZXQgKGxldmVsLCAicG9zdC1tZXNzYWdlcyIsIFRSVUUsCisgICAgICAiaW50ZXJ2YWwiLCAoZ3VpbnQ2NCkgR1NUX1NFQ09ORCAvIDEwLCBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChsZXZlbCwgR1NUX1NUQVRFX1BMQVlJTkcpOworICAvKiBjcmVhdGUgYSBidXMgdG8gZ2V0IHRoZSBsZXZlbCBtZXNzYWdlIG9uICovCisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChsZXZlbCwgYnVzKTsKKworICAvKiBjcmVhdGUgYSBmYWtlIDAuMSBzZWMgYnVmZmVyIHdpdGggYSBoYWxmLWFtcGxpdHVkZSBibG9jayBzaWduYWwgKi8KKyAgaW5idWZmZXIgPSBjcmVhdGVfczE2X2J1ZmZlciAoMTY1MzYsIDE2NTM2KTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGluYnVmZmVyID09IG91dGJ1ZmZlcik7CisKKyAgbWVzc2FnZSA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9FTEVNRU5ULCAtMSk7CisgIHN0cnVjdHVyZSA9IGdzdF9tZXNzYWdlX2dldF9zdHJ1Y3R1cmUgKG1lc3NhZ2UpOworCisgIC8qIGJsb2NrIHdhdmUgb2YgaGFsZiBhbXBsaXR1ZGUgaGFzIC01Ljk0IGRCIGZvciBybXMsIHBlYWsgYW5kIGRlY2F5ICovCisgIGZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBHVmFsdWVBcnJheSAqYXJyOworCisgICAgICBsaXN0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgZmllbGRzW2pdKTsKKyAgICAgIGFyciA9IGdfdmFsdWVfZ2V0X2JveGVkIChsaXN0KTsKKyAgICAgIHZhbHVlID0gZ192YWx1ZV9hcnJheV9nZXRfbnRoIChhcnIsIGkpOworICAgICAgZEIgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVRyAoIiVzIGlzICVsZiIsIGZpZWxkc1tqXSwgZEIpOworICAgICAgZmFpbF9pZiAoZEIgPCAtNi4xKTsKKyAgICAgIGZhaWxfaWYgKGRCID4gLTUuOSk7CisgICAgfQorICB9CisKKyAgLyogY2xlYW4gdXAgKi8KKyAgLyogZmx1c2ggY3VycmVudCBtZXNzYWdlcyxhbmQgZnV0dXJlIHN0YXRlIGNoYW5nZSBtZXNzYWdlcyAqLworICBnc3RfYnVzX3NldF9mbHVzaGluZyAoYnVzLCBUUlVFKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChsZXZlbCwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAobGV2ZWwsIEdTVF9TVEFURV9OVUxMKTsKKyAgY2xlYW51cF9sZXZlbCAobGV2ZWwpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ludDE2X3Bhbm5lZCkKK3sKKyAgR3N0RWxlbWVudCAqbGV2ZWw7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdEJ1cyAqYnVzOworICBHc3RNZXNzYWdlICptZXNzYWdlOworICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2ludCBpLCBqOworICBjb25zdCBHVmFsdWUgKmxpc3QsICp2YWx1ZTsKKyAgZ2RvdWJsZSBkQjsKKyAgY29uc3QgZ2NoYXIgKmZpZWxkc1szXSA9IHsgInJtcyIsICJwZWFrIiwgImRlY2F5IiB9OworCisgIGxldmVsID0gc2V0dXBfbGV2ZWwgKExFVkVMX1MxNl9DQVBTX1NUUklORyk7CisgIGdfb2JqZWN0X3NldCAobGV2ZWwsICJwb3N0LW1lc3NhZ2VzIiwgVFJVRSwKKyAgICAgICJpbnRlcnZhbCIsIChndWludDY0KSBHU1RfU0VDT05EIC8gMzAsIE5VTEwpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGxldmVsLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIC8qIGNyZWF0ZSBhIGJ1cyB0byBnZXQgdGhlIGxldmVsIG1lc3NhZ2Ugb24gKi8KKyAgYnVzID0gZ3N0X2J1c19uZXcgKCk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKGxldmVsLCBidXMpOworCisgIC8qIGNyZWF0ZSBhIGZha2UgMC4xIHNlYyBidWZmZXIgd2l0aCBhIGhhbGYtYW1wbGl0dWRlIGJsb2NrIHNpZ25hbCAqLworICBpbmJ1ZmZlciA9IGNyZWF0ZV9zMTZfYnVmZmVyICgwLCAxNjUzNik7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChpbmJ1ZmZlciA9PSBvdXRidWZmZXIpOworCisgIC8qIGRvIG11bHRpcGxlIG1lc3NhZ2VzIHBlciBidWZmZXIsIHRvIHZlcmlmeSB0aGF0IHRoZSBpbm5lciBsb29wIGluIGxldmVsCisgICAqIGFkdmFuY2VzIHRoZSByZWFkLWluZGV4IGNvcnJlY3RseSwgc2VlCisgICAqIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTQxNDQKKyAgICovCisgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICBHU1RfREVCVUcgKCJnZXQgbWVzc2FnZSBudW1iZXIgJWQiLCBpKTsKKyAgICBtZXNzYWdlID0gZ3N0X2J1c19wb2xsIChidXMsIEdTVF9NRVNTQUdFX0VMRU1FTlQsIC0xKTsKKyAgICBzdHJ1Y3R1cmUgPSBnc3RfbWVzc2FnZV9nZXRfc3RydWN0dXJlIChtZXNzYWdlKTsKKworICAgIC8qIHNpbGVuY2UgaGFzIDAgZEIgZm9yIHJtcywgcGVhayBhbmQgZGVjYXkgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBHVmFsdWVBcnJheSAqYXJyOworCisgICAgICBsaXN0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgZmllbGRzW2pdKTsKKyAgICAgIGFyciA9IGdfdmFsdWVfZ2V0X2JveGVkIChsaXN0KTsKKyAgICAgIHZhbHVlID0gZ192YWx1ZV9hcnJheV9nZXRfbnRoIChhcnIsIDApOworICAgICAgZEIgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVRyAoIiVzWzBdIGlzICVsZiIsIGZpZWxkc1tqXSwgZEIpOworI2lmZGVmIEhBVkVfSVNJTkYKKyAgICAgIGZhaWxfdW5sZXNzIChpc2luZiAoZEIpKTsKKyNlbGlmIGRlZmluZWQgKEhBVkVfRlBDTEFTUykKKyAgICAgIGZhaWxfdW5sZXNzIChmcGNsYXNzIChkQikgPT0gRlBfTklORik7CisjZW5kaWYKKyAgICB9CisgICAgLyogYmxvY2sgd2F2ZSBvZiBoYWxmIGFtcGxpdHVkZSBoYXMgLTUuOTQgZEIgZm9yIHJtcywgcGVhayBhbmQgZGVjYXkgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBHVmFsdWVBcnJheSAqYXJyOworCisgICAgICBsaXN0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgZmllbGRzW2pdKTsKKyAgICAgIGFyciA9IGdfdmFsdWVfZ2V0X2JveGVkIChsaXN0KTsKKyAgICAgIHZhbHVlID0gZ192YWx1ZV9hcnJheV9nZXRfbnRoIChhcnIsIDEpOworICAgICAgZEIgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVRyAoIiVzWzFdIGlzICVsZiIsIGZpZWxkc1tqXSwgZEIpOworICAgICAgZmFpbF9pZiAoZEIgPCAtNi4xKTsKKyAgICAgIGZhaWxfaWYgKGRCID4gLTUuOSk7CisgICAgfQorICAgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgfQorCisgIC8qIGNsZWFuIHVwICovCisgIC8qIGZsdXNoIGN1cnJlbnQgbWVzc2FnZXMsYW5kIGZ1dHVyZSBzdGF0ZSBjaGFuZ2UgbWVzc2FnZXMgKi8KKyAgZ3N0X2J1c19zZXRfZmx1c2hpbmcgKGJ1cywgVFJVRSk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKGxldmVsLCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChsZXZlbCwgR1NUX1NUQVRFX05VTEwpOworICBjbGVhbnVwX2xldmVsIChsZXZlbCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZmxvYXQpCit7CisgIEdzdEVsZW1lbnQgKmxldmVsOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RCdXMgKmJ1czsKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGdpbnQgaSwgajsKKyAgY29uc3QgR1ZhbHVlICpsaXN0LCAqdmFsdWU7CisgIGdkb3VibGUgZEI7CisgIGNvbnN0IGdjaGFyICpmaWVsZHNbM10gPSB7ICJybXMiLCAicGVhayIsICJkZWNheSIgfTsKKworICBsZXZlbCA9IHNldHVwX2xldmVsIChMRVZFTF9GMzJfQ0FQU19TVFJJTkcpOworICBnX29iamVjdF9zZXQgKGxldmVsLCAicG9zdC1tZXNzYWdlcyIsIFRSVUUsCisgICAgICAiaW50ZXJ2YWwiLCAoZ3VpbnQ2NCkgR1NUX1NFQ09ORCAvIDEwLCBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChsZXZlbCwgR1NUX1NUQVRFX1BMQVlJTkcpOworICAvKiBjcmVhdGUgYSBidXMgdG8gZ2V0IHRoZSBsZXZlbCBtZXNzYWdlIG9uICovCisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChsZXZlbCwgYnVzKTsKKworICAvKiBjcmVhdGUgYSBmYWtlIDAuMSBzZWMgYnVmZmVyIHdpdGggYSBoYWxmLWFtcGxpdHVkZSBibG9jayBzaWduYWwgKi8KKyAgaW5idWZmZXIgPSBjcmVhdGVfZjMyX2J1ZmZlciAoMC41LCAwLjUpOworCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworICBmYWlsX3VubGVzcyAoaW5idWZmZXIgPT0gb3V0YnVmZmVyKTsKKworICBtZXNzYWdlID0gZ3N0X2J1c19wb2xsIChidXMsIEdTVF9NRVNTQUdFX0VMRU1FTlQsIC0xKTsKKyAgc3RydWN0dXJlID0gZ3N0X21lc3NhZ2VfZ2V0X3N0cnVjdHVyZSAobWVzc2FnZSk7CisKKyAgLyogYmxvY2sgd2F2ZSBvZiBoYWxmIGFtcGxpdHVkZSBoYXMgLTUuOTQgZEIgZm9yIHJtcywgcGVhayBhbmQgZGVjYXkgKi8KKyAgZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIEdWYWx1ZUFycmF5ICphcnI7CisKKyAgICAgIGxpc3QgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCBmaWVsZHNbal0pOworICAgICAgYXJyID0gZ192YWx1ZV9nZXRfYm94ZWQgKGxpc3QpOworICAgICAgdmFsdWUgPSBnX3ZhbHVlX2FycmF5X2dldF9udGggKGFyciwgaSk7CisgICAgICBkQiA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworICAgICAgR1NUX0RFQlVHICgiJXMgaXMgJWxmIiwgZmllbGRzW2pdLCBkQik7CisgICAgICBmYWlsX2lmIChkQiA8IC02LjEpOworICAgICAgZmFpbF9pZiAoZEIgPiAtNS45KTsKKyAgICB9CisgIH0KKworICAvKiBjbGVhbiB1cCAqLworICAvKiBmbHVzaCBjdXJyZW50IG1lc3NhZ2VzLGFuZCBmdXR1cmUgc3RhdGUgY2hhbmdlIG1lc3NhZ2VzICovCisgIGdzdF9idXNfc2V0X2ZsdXNoaW5nIChidXMsIFRSVUUpOworICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKGxldmVsLCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChsZXZlbCwgR1NUX1NUQVRFX05VTEwpOworICBjbGVhbnVwX2xldmVsIChsZXZlbCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfbWVzc2FnZV9vbl9lb3MpCit7CisgIEdzdEVsZW1lbnQgKmxldmVsOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RFdmVudCAqZXZlbnQ7CisgIEdzdEJ1cyAqYnVzOworICBHc3RNZXNzYWdlICptZXNzYWdlOworICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2ludCBpLCBqOworICBjb25zdCBHVmFsdWUgKmxpc3QsICp2YWx1ZTsKKyAgZ2RvdWJsZSBkQjsKKworICBsZXZlbCA9IHNldHVwX2xldmVsIChMRVZFTF9TMTZfQ0FQU19TVFJJTkcpOworICBnX29iamVjdF9zZXQgKGxldmVsLCAicG9zdC1tZXNzYWdlcyIsIFRSVUUsCisgICAgICAiaW50ZXJ2YWwiLCAoZ3VpbnQ2NCkgR1NUX1NFQ09ORCAvIDUsIE5VTEwpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGxldmVsLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIC8qIGNyZWF0ZSBhIGJ1cyB0byBnZXQgdGhlIGxldmVsIG1lc3NhZ2Ugb24gKi8KKyAgYnVzID0gZ3N0X2J1c19uZXcgKCk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKGxldmVsLCBidXMpOworCisgIC8qIGNyZWF0ZSBhIGZha2UgMC4xIHNlYyBidWZmZXIgd2l0aCBhIGhhbGYtYW1wbGl0dWRlIGJsb2NrIHNpZ25hbCAqLworICBpbmJ1ZmZlciA9IGNyZWF0ZV9zMTZfYnVmZmVyICgxNjUzNiwgMTY1MzYpOworCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworICBmYWlsX3VubGVzcyAoaW5idWZmZXIgPT0gb3V0YnVmZmVyKTsKKworICBtZXNzYWdlID0gZ3N0X2J1c19wb2xsIChidXMsIEdTVF9NRVNTQUdFX0VMRU1FTlQsIDApOworCisgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19lb3MgKCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBldmVudCkgPT0gVFJVRSk7CisKKyAgbWVzc2FnZSA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9FTEVNRU5ULCAwKTsKKyAgZmFpbF91bmxlc3MgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIHN0cnVjdHVyZSA9IGdzdF9tZXNzYWdlX2dldF9zdHJ1Y3R1cmUgKG1lc3NhZ2UpOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nIChnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzdHJ1Y3R1cmUpLCAibGV2ZWwiKTsKKworICAvKiBibG9jayB3YXZlIG9mIGhhbGYgYW1wbGl0dWRlIGhhcyAtNS45NCBkQiBmb3Igcm1zLCBwZWFrIGFuZCBkZWNheSAqLworICBmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgY29uc3QgZ2NoYXIgKmZpZWxkc1szXSA9IHsgInJtcyIsICJwZWFrIiwgImRlY2F5IiB9OworICAgIGZvciAoaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIEdWYWx1ZUFycmF5ICphcnI7CisKKyAgICAgIGxpc3QgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCBmaWVsZHNbal0pOworICAgICAgYXJyID0gZ192YWx1ZV9nZXRfYm94ZWQgKGxpc3QpOworICAgICAgdmFsdWUgPSBnX3ZhbHVlX2FycmF5X2dldF9udGggKGFyciwgaSk7CisgICAgICBkQiA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworICAgICAgR1NUX0RFQlVHICgiJXMgaXMgJWxmIiwgZmllbGRzW2pdLCBkQik7CisgICAgICBmYWlsX2lmIChkQiA8IC02LjEpOworICAgICAgZmFpbF9pZiAoZEIgPiAtNS45KTsKKyAgICB9CisgIH0KKworICAvKiBjbGVhbiB1cCAqLworICAvKiBmbHVzaCBjdXJyZW50IG1lc3NhZ2VzLGFuZCBmdXR1cmUgc3RhdGUgY2hhbmdlIG1lc3NhZ2VzICovCisgIGdzdF9idXNfc2V0X2ZsdXNoaW5nIChidXMsIFRSVUUpOworICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKGxldmVsLCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChsZXZlbCwgR1NUX1NUQVRFX05VTEwpOworICBjbGVhbnVwX2xldmVsIChsZXZlbCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfbWVzc2FnZV9jb3VudCkKK3sKKyAgR3N0RWxlbWVudCAqbGV2ZWw7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdEJ1cyAqYnVzOworICBHc3RNZXNzYWdlICptZXNzYWdlOworCisgIGxldmVsID0gc2V0dXBfbGV2ZWwgKExFVkVMX1MxNl9DQVBTX1NUUklORyk7CisgIGdfb2JqZWN0X3NldCAobGV2ZWwsICJwb3N0LW1lc3NhZ2VzIiwgVFJVRSwKKyAgICAgICJpbnRlcnZhbCIsIChndWludDY0KSBHU1RfU0VDT05EIC8gMjAsIE5VTEwpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGxldmVsLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIC8qIGNyZWF0ZSBhIGJ1cyB0byBnZXQgdGhlIGxldmVsIG1lc3NhZ2Ugb24gKi8KKyAgYnVzID0gZ3N0X2J1c19uZXcgKCk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKGxldmVsLCBidXMpOworCisgIC8qIGNyZWF0ZSBhIGZha2UgMC4xIHNlYyBidWZmZXIgd2l0aCBhIGhhbGYtYW1wbGl0dWRlIGJsb2NrIHNpZ25hbCAqLworICBpbmJ1ZmZlciA9IGNyZWF0ZV9zMTZfYnVmZmVyICgxNjUzNiwgMTY1MzYpOworCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworICBmYWlsX3VubGVzcyAoaW5idWZmZXIgPT0gb3V0YnVmZmVyKTsKKworICAvKiB3ZSBzaG91bGQgZ2V0IHR3byBtZXNzYWdlcyBwZXIgYnVmZmVyICovCisgIG1lc3NhZ2UgPSBnc3RfYnVzX3BvbGwgKGJ1cywgR1NUX01FU1NBR0VfRUxFTUVOVCwgLTEpOworICBmYWlsX3VubGVzcyAobWVzc2FnZSAhPSBOVUxMKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gZ3N0X2J1c19wb2xsIChidXMsIEdTVF9NRVNTQUdFX0VMRU1FTlQsIC0xKTsKKyAgZmFpbF91bmxlc3MgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICBnc3RfZWxlbWVudF9zZXRfYnVzIChsZXZlbCwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAobGV2ZWwsIEdTVF9TVEFURV9OVUxMKTsKKyAgY2xlYW51cF9sZXZlbCAobGV2ZWwpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X21lc3NhZ2VfdGltZXN0YW1wcykKK3sKKyAgR3N0RWxlbWVudCAqbGV2ZWw7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdEJ1cyAqYnVzOworICBHc3RNZXNzYWdlICptZXNzYWdlOworICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgR3N0Q2xvY2tUaW1lIHRzMSwgZHVyMSwgdHMyOworCisgIGxldmVsID0gc2V0dXBfbGV2ZWwgKExFVkVMX1MxNl9DQVBTX1NUUklORyk7CisgIGdfb2JqZWN0X3NldCAobGV2ZWwsICJwb3N0LW1lc3NhZ2VzIiwgVFJVRSwKKyAgICAgICJpbnRlcnZhbCIsIChndWludDY0KSBHU1RfU0VDT05EIC8gMjAsIE5VTEwpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGxldmVsLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIC8qIGNyZWF0ZSBhIGJ1cyB0byBnZXQgdGhlIGxldmVsIG1lc3NhZ2Ugb24gKi8KKyAgYnVzID0gZ3N0X2J1c19uZXcgKCk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKGxldmVsLCBidXMpOworCisgIC8qIGNyZWF0ZSBhIGZha2UgMC4xIHNlYyBidWZmZXIgd2l0aCBhIGhhbGYtYW1wbGl0dWRlIGJsb2NrIHNpZ25hbCAqLworICBpbmJ1ZmZlciA9IGNyZWF0ZV9zMTZfYnVmZmVyICgxNjUzNiwgMTY1MzYpOworCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworICBmYWlsX3VubGVzcyAoaW5idWZmZXIgPT0gb3V0YnVmZmVyKTsKKworICAvKiBjaGVjayB0aGF0IHRpbWVzdGFtcCArIGR1cmF0aW9uIGlzIGNvbnRpZ291cyB0byB0aGUgbmV4dCB0aW1lc3RhbXAgKi8KKyAgbWVzc2FnZSA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9FTEVNRU5ULCAtMSk7CisgIHN0cnVjdHVyZSA9IGdzdF9tZXNzYWdlX2dldF9zdHJ1Y3R1cmUgKG1lc3NhZ2UpOworICBnc3Rfc3RydWN0dXJlX2dldF9jbG9ja190aW1lIChzdHJ1Y3R1cmUsICJ0aW1lc3RhbXAiLCAmdHMxKTsKKyAgZ3N0X3N0cnVjdHVyZV9nZXRfY2xvY2tfdGltZSAoc3RydWN0dXJlLCAiZHVyYXRpb24iLCAmZHVyMSk7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICBtZXNzYWdlID0gZ3N0X2J1c19wb2xsIChidXMsIEdTVF9NRVNTQUdFX0VMRU1FTlQsIC0xKTsKKyAgc3RydWN0dXJlID0gZ3N0X21lc3NhZ2VfZ2V0X3N0cnVjdHVyZSAobWVzc2FnZSk7CisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2Nsb2NrX3RpbWUgKHN0cnVjdHVyZSwgInRpbWVzdGFtcCIsICZ0czIpOworICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludDY0ICh0czEgKyBkdXIxLCB0czIpOworCisgIGdzdF9lbGVtZW50X3NldF9idXMgKGxldmVsLCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChsZXZlbCwgR1NUX1NUQVRFX05VTEwpOworICBjbGVhbnVwX2xldmVsIChsZXZlbCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK2xldmVsX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImxldmVsIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3JlZl9jb3VudHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbWVzc2FnZV9pc192YWxpZCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9pbnQxNik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9pbnQxNl9wYW5uZWQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZmxvYXQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbWVzc2FnZV9vbl9lb3MpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbWVzc2FnZV9jb3VudCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9tZXNzYWdlX3RpbWVzdGFtcHMpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAobGV2ZWwpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvbWF0cm9za2FkZW11eC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvbWF0cm9za2FkZW11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwODFjODQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYWRlbXV4LmMKQEAgLTAsMCArMSwzMjMgQEAKKy8qIEdTdHJlYW1lciB1bml0IHRlc3QgZm9yIG1hdHJvc2thZGVtdXgKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0aGFybmVzcy5oPgorCitjb25zdCBnY2hhciBta3Zfc3ViX2Jhc2U2NFtdID0KKyAgICAiR2tYZm93RUFBQUFBQUFBVVFvS0piV0YwY205emEyRUFRb2VCQWtLRmdRSVlVNEJuQVFBQUFBQUFBZzBSVFp0MEFRQUFBQUFBQUl4TiIKKyAgICAidXdFQUFBQUFBQUFTVTZ1RUZVbXBabE9zaUFBQUFBQUFBQUNZVGJzQkFBQUFBQUFBRWxPcmhCWlVybXRUcklnQUFBQUFBQUFCRXV5YSIKKyAgICAiQVFBQUFBQUFBQkpUcTRRUVE2ZHdVNnlJLy8vLy8vLy8vLy9zbWdFQUFBQUFBQUFTVTZ1RUhGTzdhMU9zaVAvLy8vLy8vLy8vVGJzQiIKKyAgICAiQUFBQUFBQUFFbE9yaEJKVXcyZFRySWdBQUFBQUFBQUI5eFZKcVdZQkFBQUFBQUFBYm5Pa2tEeWxRWkpsckx6aVFvOCtnc3JaVnRVcSIKKyAgICAiMTdHREQwSkFSSW1JUU5HVUFBQUFBQUJOZ0o5SFUzUnlaV0Z0WlhJZ2NHeDFaMmx1SUhabGNuTnBiMjRnTVM0MExqVUFWMEdaUjFOMCIKKyAgICAiY21WaGJXVnlJRTFoZEhKdmMydGhJRzExZUdWeUFFUmhpQVpmVTByY0V3Z0FGbFN1YXdFQUFBQUFBQUEwcmdFQUFBQUFBQUFyMTRFQiIKKyAgICAiZzRFUmM4V0lvV0Y4cFlsRUxpZFRib2xUZFdKMGFYUnNaUUNHakZOZlZFVllWQzlWVkVZNEFCOUR0blVCQUFBQUFBQUFtZWVDQStpZyIKKyAgICAiQVFBQUFBQUFBQTJiZ2dmUW9ZZUJBQUFBWm05dm9BRUFBQUFBQUFBVW00SUgwS0dPZ1F1NEFEeHBQbUpoY2p3dmFUNmdBUUFBQUFBQSIKKyAgICAiQUEyYmdnZlFvWWVCRjNBQVltRjZvQUVBQUFBQUFBQU9tNElIMEtHSWdTY1FBR2JEdGdDZ0FRQUFBQUFBQUJXYmdnZlFvWStCTXNnQSIKKyAgICAiUEdrK1ltRnlQQzlwUGdDZ0FRQUFBQUFBQUE2YmdnZlFvWWlCUG9BQVl1UjZBQkpVdzJjQkFBQUFBQUFBQ25OekFRQUFBQUFBQUFBPSI7CisKK2NvbnN0IGdjaGFyIG1rdl90b2NfYmFzZTY0W10gPQorICAgICJHa1hmb3dFQUFBQUFBQUFVUW9LSmJXRjBjbTl6YTJFQVFvZUJBVUtGZ1FFWVU0Qm5BUUFBQUFBQUJVb1JUWnQwQVFBQUFBQUFBSXhOIgorICAgICJ1d0VBQUFBQUFBQVNVNnVFRlVtcFpsT3NpQUFBQUFBQUFBQ1lUYnNCQUFBQUFBQUFFbE9yaEJaVXJtdFRySWdBQUFBQUFBQUJHazI3IgorICAgICJBUUFBQUFBQUFCSlRxNFFRUTZkd1U2eUlBQUFBQUFBQUFXRk51d0VBQUFBQUFBQVNVNnVFSEZPN2ExT3NpQUFBQUFBQUFBTnJUYnNCIgorICAgICJBQUFBQUFBQUVsT3JoQkpVdzJkVHJJZ0FBQUFBQUFBRGt4VkpxV1lCQUFBQUFBQUFkbk9ra0ZkSnJaQUg3WVk1TUN2SkdQd2w1RTRxIgorICAgICIxN0dERDBKQVJJbUlQL0FBQUFBQUFBQk5nS2RIVTNSeVpXRnRaWElnYldGMGNtOXphMkZ0ZFhnZ2RtVnljMmx2YmlBeExqRXpMakF1IgorICAgICJNUUJYUVpsSFUzUnlaV0Z0WlhJZ1RXRjBjbTl6YTJFZ2JYVjRaWElBUkdHSUIyaUgxMk41RGdBV1ZLNXJBUUFBQUFBQUFEdXVBUUFBIgorICAgICJBQUFBQURMWGdRR0RnUUp6eFlnSml4UWErWmh2UFNQamc0TVBRa0JUYm9aQmRXUnBid0RoQVFBQUFBQUFBQUNHaGtGZlFVTXpBQkJEIgorICAgICJwM0FCQUFBQUFBQUIzMFc1QVFBQUFBQUFBZFZGdklpM0R1UzRUV2VGWFVXOWdRQkYyNEVBUmQyQkFMWUJBQUFBQUFBQTFIUEVpT1YwIgorICAgICJMOGVldit3Z1ZsU0dkV2xrTGpFQWtZRUFrb01laElDWWdRQkZtSUVCZ0FFQUFBQUFBQUFRaFlkamFHRndMakVBUTN5RWRXNWtBTFlCIgorICAgICJBQUFBQUFBQVFuUEVpQ1c1YWpwSFJ6eXpWbFNJZFdsa0xqRXVNUUNSZ1FDU2d3OUNRSmlCQUVXWWdRR0FBUUFBQUFBQUFCU0ZpMjVsIgorICAgICJjM1JsWkM0eExqRUFRM3lFZFc1a0FMWUJBQUFBQUFBQVJIUEVpQTlrbEZxdEdrQm9WbFNJZFdsa0xqRXVNZ0NSZ3c5Q1FKS0RIb1NBIgorICAgICJtSUVBUlppQkFZQUJBQUFBQUFBQUZJV0xibVZ6ZEdWa0x6RXVNZ0JEZklSMWJtUUF0Z0VBQUFBQUFBRFljOFNJZXU0UVJyanNjZHRXIgorICAgICJWSVoxYVdRdU1nQ1JneDZFZ0pLRFBRa0FtSUVBUlppQkFZQUJBQUFBQUFBQUVJV0hZMmhoY0M0eUFFTjhoSFZ1WkFDMkFRQUFBQUFBIgorICAgICJBRVJ6eElpazc3RE1LcVJ5ekZaVWlIVnBaQzR5TGpFQWtZTWVoSUNTZ3kzR3dKaUJBRVdZZ1FHQUFRQUFBQUFBQUJTRmkyNWxjM1JsIgorICAgICJaQzR5TGpFQVEzeUVkVzVrQUxZQkFBQUFBQUFBUkhQRWlEdnd0KzUrVjFrdFZsU0lkV2xrTGpJdU1nQ1JneTNHd0pLRFBRa0FtSUVBIgorICAgICJSWmlCQVlBQkFBQUFBQUFBRklXTGJtVnpkR1ZrTHpJdU1nQkRmSVIxYm1RQUgwTzJkUUVBQUFBQUFBQVQ1NEVBb0FFQUFBQUFBQUFIIgorICAgICJvWVdCQUFBQUFCeFR1MnNCQUFBQUFBQUFITHNCQUFBQUFBQUFFN09CQUxjQkFBQUFBQUFBQi9lQkFmR0NBMHdTVk1ObkFRQUFBQUFBIgorICAgICJBYXR6Y3dFQUFBQUFBQUF4WThBQkFBQUFBQUFBQzJQSmlMY081TGhOWjRWZFo4Z0JBQUFBQUFBQUVrV2ppVU5QVFUxRlRsUlRBRVNIIgorICAgICJnMFZrQUhOekFRQUFBQUFBQURKandBRUFBQUFBQUFBTFk4U0k1WFF2eDU2LzdDQm55QUVBQUFBQUFBQVRSYU9IUVZKVVNWTlVBRVNIIgorICAgICJobUZ5ZEM0eEFITnpBUUFBQUFBQUFEUmp3QUVBQUFBQUFBQUxZOFNJSmJscU9rZEhQTE5ueUFFQUFBQUFBQUFWUmFPSFFWSlVTVk5VIgorICAgICJBRVNIaUdGeWRDNHhMakVBYzNNQkFBQUFBQUFBTkdQQUFRQUFBQUFBQUF0anhJZ1BaSlJhclJwQWFHZklBUUFBQUFBQUFCVkZvNGRCIgorICAgICJVbFJKVTFRQVJJZUlZWEowTGpFdU1nQnpjd0VBQUFBQUFBQXlZOEFCQUFBQUFBQUFDMlBFaUhydUVFYTQ3SEhiWjhnQkFBQUFBQUFBIgorICAgICJFMFdqaDBGU1ZFbFRWQUJFaDRaaGNuUXVNZ0J6Y3dFQUFBQUFBQUEwWThBQkFBQUFBQUFBQzJQRWlLVHZzTXdxcEhMTVo4Z0JBQUFBIgorICAgICJBQUFBRlVXamgwRlNWRWxUVkFCRWg0aGhjblF1TWk0eEFITnpBUUFBQUFBQUFEUmp3QUVBQUFBQUFBQUxZOFNJTy9DMzduNVhXUzFuIgorICAgICJ5QUVBQUFBQUFBQVZSYU9IUVZKVVNWTlVBRVNIaUdGeWRDNHlMaklBIjsKKworc3RhdGljIHZvaWQKK3BhZF9hZGRlZF9jYiAoR3N0RWxlbWVudCAqIG1hdHJvc2thZGVtdXgsIEdzdFBhZCAqIHBhZCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RIYXJuZXNzICpoID0gdXNlcl9kYXRhOworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJnb3QgbmV3IHNvdXJjZSBwYWQiKTsKKyAgZ3N0X2hhcm5lc3NfYWRkX2VsZW1lbnRfc3JjX3BhZCAoaCwgcGFkKTsKK30KKworc3RhdGljIHZvaWQKK3B1bGxfYW5kX2NoZWNrX2J1ZmZlciAoR3N0SGFybmVzcyAqIGgsIEdzdENsb2NrVGltZSBwdHMsIEdzdENsb2NrVGltZSBkdXJhdGlvbiwKKyAgICBjb25zdCBnY2hhciAqIG91dHB1dCkKK3sKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdEJ1ZmZlciAqYnVmOworCisgIC8qIHdhaXQgZm9yIGJ1ZmZlciAqLworICBidWYgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKworICAvKiBNYWtlIHN1cmUgdGhlcmUncyBubyAwLXRlcm1pbmF0b3IgaW4gdGhlcmUgKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCkpOworICBHU1RfTUVNRFVNUCAoInN1YnRpdGxlIGJ1ZmZlciIsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgIGZhaWxfdW5sZXNzIChtYXAuc2l6ZSA+IDApOworICBmYWlsX3VubGVzcyAobWFwLmRhdGFbbWFwLnNpemUgLSAxXSAhPSAnXDAnKTsKKyAgaWYgKG91dHB1dCAhPSBOVUxMICYmIG1lbWNtcCAobWFwLmRhdGEsIG91dHB1dCwgbWFwLnNpemUpICE9IDApIHsKKyAgICBnX3ByaW50ZXJyICgiR290OlxuIik7CisgICAgZ3N0X3V0aWxfZHVtcF9tZW0gKG1hcC5kYXRhLCBtYXAuc2l6ZSk7OworICAgIGdfcHJpbnRlcnIgKCJXYW50ZWQ6XG4iKTsKKyAgICBnc3RfdXRpbF9kdW1wX21lbSAoKGd1aW50OCAqKSBvdXRwdXQsIHN0cmxlbiAob3V0cHV0KSk7CisgICAgZ19lcnJvciAoIkRpZCBub3QgZ2V0IG91dHB1dCBleHBlY3RlZC4iKTsKKyAgfQorCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludDY0IChwdHMsIEdTVF9CVUZGRVJfUFRTIChidWYpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludDY0IChkdXJhdGlvbiwgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKSk7CisKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfc3ViX3Rlcm1pbmF0b3IpCit7CisgIEdzdEhhcm5lc3MgKmg7CisgIEdzdEJ1ZmZlciAqYnVmOworICBndWNoYXIgKm1rdl9kYXRhOworICBnc2l6ZSBta3Zfc2l6ZTsKKworICBoID0gZ3N0X2hhcm5lc3NfbmV3X3dpdGhfcGFkbmFtZXMgKCJtYXRyb3NrYWRlbXV4IiwgInNpbmsiLCBOVUxMKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChoLT5lbGVtZW50LCAicGFkLWFkZGVkIiwgR19DQUxMQkFDSyAocGFkX2FkZGVkX2NiKSwgaCk7CisKKyAgbWt2X2RhdGEgPSBnX2Jhc2U2NF9kZWNvZGUgKG1rdl9zdWJfYmFzZTY0LCAmbWt2X3NpemUpOworICBmYWlsX3VubGVzcyAobWt2X2RhdGEgIT0gTlVMTCk7CisKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzX3N0ciAoaCwgInZpZGVvL3gtbWF0cm9za2EiKTsKKworICBidWYgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChta3ZfZGF0YSwgbWt2X3NpemUpOworICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSA9IDA7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGJ1ZikpOworICBnc3RfaGFybmVzc19wdXNoX2V2ZW50IChoLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisKKyAgcHVsbF9hbmRfY2hlY2tfYnVmZmVyIChoLCAxICogR1NUX1NFQ09ORCwgMiAqIEdTVF9TRUNPTkQsICJmb28iKTsKKyAgcHVsbF9hbmRfY2hlY2tfYnVmZmVyIChoLCA0ICogR1NUX1NFQ09ORCwgMiAqIEdTVF9TRUNPTkQsICI8aT5iYXI8L2k+Iik7CisgIHB1bGxfYW5kX2NoZWNrX2J1ZmZlciAoaCwgNyAqIEdTVF9TRUNPTkQsIDIgKiBHU1RfU0VDT05ELCAiYmF6Iik7CisgIHB1bGxfYW5kX2NoZWNrX2J1ZmZlciAoaCwgMTEgKiBHU1RfU0VDT05ELCAyICogR1NUX1NFQ09ORCwgImZcMzAzXDI2NiIpOworICBwdWxsX2FuZF9jaGVja19idWZmZXIgKGgsIDE0ICogR1NUX1NFQ09ORCwgMiAqIEdTVF9TRUNPTkQsICI8aT5iYXI8L2k+Iik7CisgIC8qIFRoZSBpbnB1dCBpcyBpbnZhbGlkIFVURi04IGhlcmUsIHdoYXQgaGFwcGVucyBtaWdodCBkZXBlbmQgb24gbG9jYWxlICovCisgIHB1bGxfYW5kX2NoZWNrX2J1ZmZlciAoaCwgMTcgKiBHU1RfU0VDT05ELCAyICogR1NUX1NFQ09ORCwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9oYXJuZXNzX3RyeV9wdWxsIChoKSA9PSBOVUxMKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogUmVjdXJzaXZlbHkgY29tcGFyZSAyIHRvYyBlbnRyaWVzICovCitzdGF0aWMgdm9pZAorY2hlY2tfdG9jX2VudHJpZXMgKGNvbnN0IEdzdFRvY0VudHJ5ICogb3JpZ2luYWwsIGNvbnN0IEdzdFRvY0VudHJ5ICogb3RoZXIpCit7CisgIGdpbnQ2NCBzdGFydCwgc3RvcCwgb3RoZXJfc3RhcnQsIG90aGVyX3N0b3A7CisgIEdzdFRvY0VudHJ5VHlwZSBvcmlnaW5hbF90eXBlLCBvdGhlcl90eXBlOworICBjb25zdCBnY2hhciAqb3JpZ2luYWxfc3RyaW5nX3VpZCA9IE5VTEwsICpvdGhlcl9zdHJpbmdfdWlkID0gTlVMTDsKKyAgR3N0VGFnTGlzdCAqb3JpZ2luYWxfdGFncywgKm90aGVyX3RhZ3M7CisgIEdMaXN0ICpjdXIsICpvdGhlcl9jdXI7CisKKyAgb3JpZ2luYWxfdHlwZSA9IGdzdF90b2NfZW50cnlfZ2V0X2VudHJ5X3R5cGUgKG9yaWdpbmFsKTsKKyAgb3RoZXJfdHlwZSA9IGdzdF90b2NfZW50cnlfZ2V0X2VudHJ5X3R5cGUgKG90aGVyKTsKKyAgZmFpbF91bmxlc3MgKG9yaWdpbmFsX3R5cGUgPT0gb3RoZXJfdHlwZSk7CisKKyAgaWYgKG9yaWdpbmFsX3R5cGUgIT0gR1NUX1RPQ19FTlRSWV9UWVBFX0VESVRJT04pIHsKKyAgICBvcmlnaW5hbF9zdHJpbmdfdWlkID0gZ3N0X3RvY19lbnRyeV9nZXRfdWlkIChvcmlnaW5hbCk7CisgICAgb3RoZXJfc3RyaW5nX3VpZCA9IGdzdF90b2NfZW50cnlfZ2V0X3VpZCAob3RoZXIpOworICAgIGZhaWxfdW5sZXNzIChnX3N0cmNtcDAgKG9yaWdpbmFsX3N0cmluZ191aWQsIG90aGVyX3N0cmluZ191aWQpID09IDApOworICB9CisKKyAgaWYgKG9yaWdpbmFsX3R5cGUgIT0gR1NUX1RPQ19FTlRSWV9UWVBFX0VESVRJT04pIHsKKyAgICBnc3RfdG9jX2VudHJ5X2dldF9zdGFydF9zdG9wX3RpbWVzIChvcmlnaW5hbCwgJnN0YXJ0LCAmc3RvcCk7CisgICAgZ3N0X3RvY19lbnRyeV9nZXRfc3RhcnRfc3RvcF90aW1lcyAob3RoZXIsICZvdGhlcl9zdGFydCwgJm90aGVyX3N0b3ApOworCisgICAgZmFpbF91bmxlc3MgKHN0YXJ0ID09IG90aGVyX3N0YXJ0ICYmIHN0b3AgPT0gb3RoZXJfc3RvcCk7CisgIH0KKworICAvKiB0YWdzICovCisgIG9yaWdpbmFsX3RhZ3MgPSBnc3RfdG9jX2VudHJ5X2dldF90YWdzIChvcmlnaW5hbCk7CisgIG90aGVyX3RhZ3MgPSBnc3RfdG9jX2VudHJ5X2dldF90YWdzIChvdGhlcik7CisgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfaXNfZXF1YWwgKG9yaWdpbmFsX3RhZ3MsIG90aGVyX3RhZ3MpKTsKKworICBvdGhlcl9jdXIgPSBnc3RfdG9jX2VudHJ5X2dldF9zdWJfZW50cmllcyAob3RoZXIpOworICBmb3IgKGN1ciA9IGdzdF90b2NfZW50cnlfZ2V0X3N1Yl9lbnRyaWVzIChvcmlnaW5hbCk7IGN1ciAhPSBOVUxMOworICAgICAgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgZmFpbF91bmxlc3MgKG90aGVyX2N1ciAhPSBOVUxMKTsKKworICAgIGNoZWNrX3RvY19lbnRyaWVzIChjdXItPmRhdGEsIG90aGVyX2N1ci0+ZGF0YSk7CisKKyAgICBvdGhlcl9jdXIgPSBvdGhlcl9jdXItPm5leHQ7CisgIH0KK30KKworLyogQ3JlYXRlIGEgbmV3IGNoYXB0ZXIgKi8KK3N0YXRpYyBHc3RUb2NFbnRyeSAqCituZXdfY2hhcHRlciAoY29uc3QgZ3VpbnQgY2hhcHRlcl9uYiwgY29uc3QgZ2ludDY0IHN0YXJ0LCBjb25zdCBnaW50NjQgc3RvcCkKK3sKKyAgR3N0VG9jRW50cnkgKnRvY19lbnRyeSwgKnRvY19zdWJfZW50cnk7CisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisgIGdjaGFyIHRpdGxlWzMyXTsKKyAgZ2NoYXIgYXJ0aXN0WzMyXTsKKyAgZ2NoYXIgc3RyX3VpZFszMl07CisKKyAgZ19zbnByaW50ZiAoc3RyX3VpZCwgc2l6ZW9mIChzdHJfdWlkKSwgInVpZC4lZCIsIGNoYXB0ZXJfbmIpOworICB0b2NfZW50cnkgPSBnc3RfdG9jX2VudHJ5X25ldyAoR1NUX1RPQ19FTlRSWV9UWVBFX0NIQVBURVIsIHN0cl91aWQpOworICBnc3RfdG9jX2VudHJ5X3NldF9zdGFydF9zdG9wX3RpbWVzICh0b2NfZW50cnksIHN0YXJ0LCBzdG9wKTsKKworICBnX3NucHJpbnRmICh0aXRsZSwgc2l6ZW9mICh0aXRsZSksICJjaGFwLiVkIiwgY2hhcHRlcl9uYik7CisgIGdfc25wcmludGYgKGFydGlzdCwgc2l6ZW9mIChhcnRpc3QpLCAiYXJ0LiVkIiwgY2hhcHRlcl9uYik7CisgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3IChHU1RfVEFHX1RJVExFLCB0aXRsZSwgR1NUX1RBR19BUlRJU1QsIGFydGlzdCwgTlVMTCk7CisgIGdzdF90b2NfZW50cnlfc2V0X3RhZ3MgKHRvY19lbnRyeSwgdGFncyk7CisKKyAgZ19zbnByaW50ZiAoc3RyX3VpZCwgc2l6ZW9mIChzdHJfdWlkKSwgInVpZC4lZC4xIiwgY2hhcHRlcl9uYik7CisgIHRvY19zdWJfZW50cnkgPSBnc3RfdG9jX2VudHJ5X25ldyAoR1NUX1RPQ19FTlRSWV9UWVBFX0NIQVBURVIsIHN0cl91aWQpOworICBnc3RfdG9jX2VudHJ5X3NldF9zdGFydF9zdG9wX3RpbWVzICh0b2Nfc3ViX2VudHJ5LCBzdGFydCwgKHN0YXJ0ICsgc3RvcCkgLyAyKTsKKworICBnX3NucHJpbnRmICh0aXRsZSwgc2l6ZW9mICh0aXRsZSksICJuZXN0ZWQuJWQuMSIsIGNoYXB0ZXJfbmIpOworICBnX3NucHJpbnRmIChhcnRpc3QsIHNpemVvZiAoYXJ0aXN0KSwgImFydC4lZC4xIiwgY2hhcHRlcl9uYik7CisgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3IChHU1RfVEFHX1RJVExFLCB0aXRsZSwgR1NUX1RBR19BUlRJU1QsIGFydGlzdCwgTlVMTCk7CisgIGdzdF90b2NfZW50cnlfc2V0X3RhZ3MgKHRvY19zdWJfZW50cnksIHRhZ3MpOworCisgIGdzdF90b2NfZW50cnlfYXBwZW5kX3N1Yl9lbnRyeSAodG9jX2VudHJ5LCB0b2Nfc3ViX2VudHJ5KTsKKworICBnX3NucHJpbnRmIChzdHJfdWlkLCBzaXplb2YgKHN0cl91aWQpLCAidWlkLiVkLjIiLCBjaGFwdGVyX25iKTsKKyAgdG9jX3N1Yl9lbnRyeSA9IGdzdF90b2NfZW50cnlfbmV3IChHU1RfVE9DX0VOVFJZX1RZUEVfQ0hBUFRFUiwgc3RyX3VpZCk7CisgIGdzdF90b2NfZW50cnlfc2V0X3N0YXJ0X3N0b3BfdGltZXMgKHRvY19zdWJfZW50cnksIChzdGFydCArIHN0b3ApIC8gMiwgc3RvcCk7CisKKyAgZ19zbnByaW50ZiAodGl0bGUsIHNpemVvZiAodGl0bGUpLCAibmVzdGVkLyVkLjIiLCBjaGFwdGVyX25iKTsKKyAgZ19zbnByaW50ZiAoYXJ0aXN0LCBzaXplb2YgKGFydGlzdCksICJhcnQuJWQuMiIsIGNoYXB0ZXJfbmIpOworICB0YWdzID0gZ3N0X3RhZ19saXN0X25ldyAoR1NUX1RBR19USVRMRSwgdGl0bGUsIEdTVF9UQUdfQVJUSVNULCBhcnRpc3QsIE5VTEwpOworICBnc3RfdG9jX2VudHJ5X3NldF90YWdzICh0b2Nfc3ViX2VudHJ5LCB0YWdzKTsKKworICBnc3RfdG9jX2VudHJ5X2FwcGVuZF9zdWJfZW50cnkgKHRvY19lbnRyeSwgdG9jX3N1Yl9lbnRyeSk7CisKKyAgcmV0dXJuIHRvY19lbnRyeTsKK30KKworLyogQ3JlYXRlIGEgcmVmZXJlbmNlIHRvYyB3aGljaCBtYXRjaGVzIHdoYXQgaXMgZXhwZWN0ZWQgaW4gbWt2X3RvY19iYXNlNjQgKi8KK3N0YXRpYyBHc3RUb2MgKgorbmV3X3JlZmVyZW5jZV90b2MgKHZvaWQpCit7CisgIEdzdFRvYyAqcmVmX3RvYzsKKyAgR3N0VG9jRW50cnkgKnRvY19lZGl0aW9uX2VudHJ5LCAqdG9jX2VudHJ5OworICBHc3RUYWdMaXN0ICp0YWdzOworCisgIHJlZl90b2MgPSBnc3RfdG9jX25ldyAoR1NUX1RPQ19TQ09QRV9HTE9CQUwpOworCisgIHRvY19lZGl0aW9uX2VudHJ5ID0gZ3N0X3RvY19lbnRyeV9uZXcgKEdTVF9UT0NfRU5UUllfVFlQRV9FRElUSU9OLCAiMDAiKTsKKyAgdGFncyA9IGdzdF90YWdfbGlzdF9uZXcgKEdTVF9UQUdfQ09NTUVOVCwgIkVkIiwgTlVMTCk7CisgIGdzdF90b2NfZW50cnlfc2V0X3RhZ3MgKHRvY19lZGl0aW9uX2VudHJ5LCB0YWdzKTsKKworICB0b2NfZW50cnkgPSBuZXdfY2hhcHRlciAoMSwgMCAqIEdTVF9NU0VDT05ELCAyICogR1NUX01TRUNPTkQpOworICBnc3RfdG9jX2VudHJ5X2FwcGVuZF9zdWJfZW50cnkgKHRvY19lZGl0aW9uX2VudHJ5LCB0b2NfZW50cnkpOworCisgIHRvY19lbnRyeSA9IG5ld19jaGFwdGVyICgyLCAyICogR1NUX01TRUNPTkQsIDQgKiBHU1RfTVNFQ09ORCk7CisgIGdzdF90b2NfZW50cnlfYXBwZW5kX3N1Yl9lbnRyeSAodG9jX2VkaXRpb25fZW50cnksIHRvY19lbnRyeSk7CisKKyAgZ3N0X3RvY19hcHBlbmRfZW50cnkgKHJlZl90b2MsIHRvY19lZGl0aW9uX2VudHJ5KTsKKworICByZXR1cm4gcmVmX3RvYzsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdG9jX2RlbXV4KQoreworICBHc3RIYXJuZXNzICpoOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgZ3VjaGFyICpta3ZfZGF0YTsKKyAgZ3NpemUgbWt2X3NpemU7CisgIEdzdEV2ZW50ICpldmVudDsKKyAgZ2Jvb2xlYW4gdXBkYXRlOworICBHc3RUb2MgKnJlZl90b2MsICpkZW11eGVkX3RvYyA9IE5VTEw7CisgIEdMaXN0ICpyZWZfY3VyLCAqZGVtdXhlZF9jdXI7CisKKyAgaCA9IGdzdF9oYXJuZXNzX25ld193aXRoX3BhZG5hbWVzICgibWF0cm9za2FkZW11eCIsICJzaW5rIiwgTlVMTCk7CisKKyAgZ19zaWduYWxfY29ubmVjdCAoaC0+ZWxlbWVudCwgInBhZC1hZGRlZCIsIEdfQ0FMTEJBQ0sgKHBhZF9hZGRlZF9jYiksIGgpOworCisgIG1rdl9kYXRhID0gZ19iYXNlNjRfZGVjb2RlIChta3ZfdG9jX2Jhc2U2NCwgJm1rdl9zaXplKTsKKyAgZmFpbF91bmxlc3MgKG1rdl9kYXRhICE9IE5VTEwpOworCisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgsICJhdWRpby94LW1hdHJvc2thIik7CisKKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAobWt2X2RhdGEsIG1rdl9zaXplKTsKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikgPSAwOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLCBnc3RfaGFybmVzc19wdXNoIChoLCBidWYpKTsKKyAgZ3N0X2hhcm5lc3NfcHVzaF9ldmVudCAoaCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworCisgIGV2ZW50ID0gZ3N0X2hhcm5lc3NfdHJ5X3B1bGxfZXZlbnQgKGgpOworICBmYWlsX3VubGVzcyAoZXZlbnQgIT0gTlVMTCk7CisKKyAgd2hpbGUgKGV2ZW50ICE9IE5VTEwpIHsKKyAgICBpZiAoZXZlbnQtPnR5cGUgPT0gR1NUX0VWRU5UX1RPQykgeworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3RvYyAoZXZlbnQsICZkZW11eGVkX3RvYywgJnVwZGF0ZSk7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICBldmVudCA9IGdzdF9oYXJuZXNzX3RyeV9wdWxsX2V2ZW50IChoKTsKKyAgfQorCisgIGZhaWxfdW5sZXNzIChkZW11eGVkX3RvYyAhPSBOVUxMKTsKKyAgcmVmX3RvYyA9IG5ld19yZWZlcmVuY2VfdG9jICgpOworCisgIGRlbXV4ZWRfY3VyID0gZ3N0X3RvY19nZXRfZW50cmllcyAoZGVtdXhlZF90b2MpOworICBmb3IgKHJlZl9jdXIgPSBnc3RfdG9jX2dldF9lbnRyaWVzIChyZWZfdG9jKTsgcmVmX2N1ciAhPSBOVUxMOworICAgICAgcmVmX2N1ciA9IHJlZl9jdXItPm5leHQpIHsKKyAgICBmYWlsX3VubGVzcyAoZGVtdXhlZF9jdXIgIT0gTlVMTCk7CisKKyAgICBjaGVja190b2NfZW50cmllcyAocmVmX2N1ci0+ZGF0YSwgZGVtdXhlZF9jdXItPmRhdGEpOworICAgIGRlbXV4ZWRfY3VyID0gZGVtdXhlZF9jdXItPm5leHQ7CisgIH0KKworICBnc3RfdG9jX3VucmVmIChyZWZfdG9jKTsKKyAgZ3N0X3RvY191bnJlZiAoZGVtdXhlZF90b2MpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorbWF0cm9za2FkZW11eF9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJtYXRyb3NrYWRlbXV4Iik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3N1Yl90ZXJtaW5hdG9yKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3RvY19kZW11eCk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChtYXRyb3NrYWRlbXV4KTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmODA0YmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jCkBAIC0wLDAgKzEsMTAxOSBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciBtYXRyb3NrYW11eAorICoKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IE1pY2hhbCBCZW5lcyA8bWljaGFsLmJlbmVzQHhlcmlzLmN6PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0aGFybmVzcy5oPgorCisjZGVmaW5lIEFDM19DQVBTX1NUUklORyAiYXVkaW8veC1hYzMsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAicmF0ZSA9IChpbnQpIDgwMDAiCisjZGVmaW5lIFZPUkJJU19UTVBMX0NBUFNfU1RSSU5HICJhdWRpby94LXZvcmJpcywgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmF0ZSA9IChpbnQpIDgwMDAsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtaGVhZGVyPShidWZmZXIpPDEwLCAyMDIwLCAzMDMwMzA+IgorCitzdGF0aWMgR3N0SGFybmVzcyAqCitzZXR1cF9tYXRyb3NrYW11eF9oYXJuZXNzIChjb25zdCBnY2hhciAqIHNyY19wYWRfc3RyKQoreworICBHc3RIYXJuZXNzICpoOworCisgIGggPSBnc3RfaGFybmVzc19uZXdfd2l0aF9wYWRuYW1lcyAoIm1hdHJvc2thbXV4IiwgImF1ZGlvXyV1IiwgInNyYyIpOworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHNfc3RyIChoLCBzcmNfcGFkX3N0cik7CisgIGdzdF9oYXJuZXNzX3NldF9zaW5rX2NhcHNfc3RyIChoLCAidmlkZW8veC1tYXRyb3NrYTsgYXVkaW8veC1tYXRyb3NrYSIpOworCisgIHJldHVybiBoOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3NlZWthYmxlX3NpbmtwYWRfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBpZiAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSA9PSBHU1RfUVVFUllfU0VFS0lORykgeworICAgIGdzdF9xdWVyeV9zZXRfc2Vla2luZyAocXVlcnksIEdTVF9GT1JNQVRfQllURVMsIFRSVUUsIDAsIC0xKTsKKyAgICByZXQgPSBUUlVFOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBjb21wYXJlX2J1ZmZlcl90b19kYXRhKGJ1ZmZlciwgZGF0YSwgZGF0YV9zaXplKSAgICAgICAgICAgICBcCitHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFfc2l6ZSwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSk7ICAgXAorZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChidWZmZXIsIDAsIGRhdGEsIGRhdGFfc2l6ZSkgPT0gMCk7ICBcCit9IEdfU1RNVF9FTkQKKworc3RhdGljIHZvaWQKK3Rlc3RfZWJtbF9oZWFkZXJfd2l0aF92ZXJzaW9uIChnaW50IHZlcnNpb24sCisgICAgZ2NvbnN0cG9pbnRlciBkYXRhLCBnc2l6ZSBkYXRhX3NpemUpCit7CisgIEdzdEhhcm5lc3MgKmg7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisKKyAgaCA9IHNldHVwX21hdHJvc2thbXV4X2hhcm5lc3MgKEFDM19DQVBTX1NUUklORyk7CisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgInZlcnNpb24iLCB2ZXJzaW9uLCBOVUxMKTsKKworICBpbmJ1ZmZlciA9IGdzdF9oYXJuZXNzX2NyZWF0ZV9idWZmZXIgKGgsIDEpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgaW5idWZmZXIpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMiwgZ3N0X2hhcm5lc3NfYnVmZmVyc19yZWNlaXZlZCAoaCkpOworCisgIG91dGJ1ZmZlciA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBjb21wYXJlX2J1ZmZlcl90b19kYXRhIChvdXRidWZmZXIsIGRhdGEsIGRhdGFfc2l6ZSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1ZmZlcik7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9lYm1sX2hlYWRlcl92MSkKK3sKKyAgZ3VpbnQ4IGRhdGFfdjFbXSA9IHsKKyAgICAweDFhLCAweDQ1LCAweGRmLCAweGEzLCAgICAgLyogbWFzdGVyIElEICovCisgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwKKyAgICAweDQyLCAweDgyLCAgICAgICAgICAgICAgICAgLyogZG9jdHlwZSAqLworICAgIDB4ODksICAgICAgICAgICAgICAgICAgICAgICAvKiA5IGJ5dGVzICovCisgICAgMHg2ZCwgMHg2MSwgMHg3NCwgMHg3MiwgMHg2ZiwgMHg3MywgMHg2YiwgMHg2MSwgMHgwMCwgICAgICAgLyogIm1hdHJvc2thIiAqLworICAgIDB4NDIsIDB4ODcsICAgICAgICAgICAgICAgICAvKiBkb2N0eXBldmVyc2lvbiAqLworICAgIDB4ODEsICAgICAgICAgICAgICAgICAgICAgICAvKiAxIGJ5dGUgKi8KKyAgICAweDAxLCAgICAgICAgICAgICAgICAgICAgICAgLyogMSAqLworICAgIDB4NDIsIDB4ODUsICAgICAgICAgICAgICAgICAvKiBkb2N0eXBlcmVhZHZlcnNpb24gKi8KKyAgICAweDgxLCAgICAgICAgICAgICAgICAgICAgICAgLyogMSBieXRlICovCisgICAgMHgwMSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgKi8KKyAgfTsKKworICB0ZXN0X2VibWxfaGVhZGVyX3dpdGhfdmVyc2lvbiAoMSwgZGF0YV92MSwgc2l6ZW9mIChkYXRhX3YxKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZWJtbF9oZWFkZXJfdjIpCit7CisgIGd1aW50OCBkYXRhX3YyW10gPSB7CisgICAgMHgxYSwgMHg0NSwgMHhkZiwgMHhhMywgICAgIC8qIG1hc3RlciBJRCAqLworICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsCisgICAgMHg0MiwgMHg4MiwgICAgICAgICAgICAgICAgIC8qIGRvY3R5cGUgKi8KKyAgICAweDg5LCAgICAgICAgICAgICAgICAgICAgICAgLyogOSBieXRlcyAqLworICAgIDB4NmQsIDB4NjEsIDB4NzQsIDB4NzIsIDB4NmYsIDB4NzMsIDB4NmIsIDB4NjEsIDB4MDAsICAgICAgIC8qICJtYXRyb3NrYSIgKi8KKyAgICAweDQyLCAweDg3LCAgICAgICAgICAgICAgICAgLyogZG9jdHlwZXZlcnNpb24gKi8KKyAgICAweDgxLCAgICAgICAgICAgICAgICAgICAgICAgLyogMSBieXRlICovCisgICAgMHgwMiwgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgKi8KKyAgICAweDQyLCAweDg1LCAgICAgICAgICAgICAgICAgLyogZG9jdHlwZXJlYWR2ZXJzaW9uICovCisgICAgMHg4MSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgYnl0ZSAqLworICAgIDB4MDIsICAgICAgICAgICAgICAgICAgICAgICAvKiAyICovCisgIH07CisKKyAgdGVzdF9lYm1sX2hlYWRlcl93aXRoX3ZlcnNpb24gKDIsIGRhdGFfdjIsIHNpemVvZiAoZGF0YV92MikpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfdm9yYmlzX2hlYWRlcikKK3sKKyAgR3N0SGFybmVzcyAqaDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgZ2Jvb2xlYW4gdm9yYmlzX2hlYWRlcl9mb3VuZCA9IEZBTFNFOworICBnaW50IGo7CisgIGdzaXplIGJ1ZmZlcl9zaXplOworICBndWludDggZGF0YVtdID0KKyAgICAgIHsgMHg2MywgMHhhMiwgMHg4OSwgMHgwMiwgMHgwMSwgMHgwMiwgMHgxMCwgMHgyMCwgMHgyMCwgMHgzMCwgMHgzMCwKKyAgICAweDMwCisgIH07CisKKyAgaCA9IHNldHVwX21hdHJvc2thbXV4X2hhcm5lc3MgKFZPUkJJU19UTVBMX0NBUFNfU1RSSU5HKTsKKworICBpbmJ1ZmZlciA9IGdzdF9oYXJuZXNzX2NyZWF0ZV9idWZmZXIgKGgsIDEpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgaW5idWZmZXIpKTsKKworICBvdXRidWZmZXIgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgd2hpbGUgKG91dGJ1ZmZlciAhPSBOVUxMKSB7CisgICAgYnVmZmVyX3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWZmZXIpOworCisgICAgaWYgKCF2b3JiaXNfaGVhZGVyX2ZvdW5kICYmIGJ1ZmZlcl9zaXplID49IHNpemVvZiAoZGF0YSkpIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPD0gYnVmZmVyX3NpemUgLSBzaXplb2YgKGRhdGEpOyBqKyspIHsKKyAgICAgICAgaWYgKGdzdF9idWZmZXJfbWVtY21wIChvdXRidWZmZXIsIGosIGRhdGEsIHNpemVvZiAoZGF0YSkpID09IDApIHsKKyAgICAgICAgICB2b3JiaXNfaGVhZGVyX2ZvdW5kID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKG91dGJ1ZmZlciwgIm91dGJ1ZmZlciIsIDEpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1ZmZlcik7CisKKyAgICBvdXRidWZmZXIgPSBnc3RfaGFybmVzc190cnlfcHVsbCAoaCk7CisgIH0KKworICBmYWlsX3VubGVzcyAodm9yYmlzX2hlYWRlcl9mb3VuZCk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworc3RhdGljIHZvaWQKK3Rlc3RfYmxvY2tfZ3JvdXBfd2l0aF92ZXJzaW9uIChnaW50IHZlcnNpb24sCisgICAgZ2NvbnN0cG9pbnRlciBkYXRhMCwgZ3NpemUgZGF0YTBfc2l6ZSkKK3sKKyAgR3N0SGFybmVzcyAqaDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgZ3VpbnQ4IGRhdGExW10gPSB7IDB4NDIgfTsKKworICBoID0gc2V0dXBfbWF0cm9za2FtdXhfaGFybmVzcyAoQUMzX0NBUFNfU1RSSU5HKTsKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAidmVyc2lvbiIsIHZlcnNpb24sIE5VTEwpOworCisgIC8qIEdlbmVyYXRlIHRoZSBoZWFkZXIgKi8KKyAgaW5idWZmZXIgPSBnc3RfaGFybmVzc19jcmVhdGVfYnVmZmVyIChoLCAxKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLCBnc3RfaGFybmVzc19wdXNoIChoLCBpbmJ1ZmZlcikpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICg1LCBnc3RfaGFybmVzc19idWZmZXJzX3JlY2VpdmVkIChoKSk7CisKKyAgb3V0YnVmZmVyID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGZhaWxfdW5sZXNzIChvdXRidWZmZXIgIT0gTlVMTCk7CisgIHdoaWxlIChvdXRidWZmZXIgIT0gTlVMTCkgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1ZmZlcik7CisgICAgb3V0YnVmZmVyID0gZ3N0X2hhcm5lc3NfdHJ5X3B1bGwgKGgpOworICB9CisKKyAgLyogTm93IHB1c2ggYSBidWZmZXIgKi8KKyAgaW5idWZmZXIgPSBnc3RfaGFybmVzc19jcmVhdGVfYnVmZmVyIChoLCAxKTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChpbmJ1ZmZlciwgMCwgZGF0YTEsIHNpemVvZiAoZGF0YTEpKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDEwMDAwMDA7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGluYnVmZmVyKSk7CisKKyAgb3V0YnVmZmVyID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGNvbXBhcmVfYnVmZmVyX3RvX2RhdGEgKG91dGJ1ZmZlciwgZGF0YTAsIGRhdGEwX3NpemUpOworICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWZmZXIpOworCisgIG91dGJ1ZmZlciA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBjb21wYXJlX2J1ZmZlcl90b19kYXRhIChvdXRidWZmZXIsIGRhdGExLCBzaXplb2YgKGRhdGExKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1ZmZlcik7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ibG9ja19ncm91cF92MSkKK3sKKyAgZ3VpbnQ4IGRhdGEwX3YxW10gPSB7IDB4YTAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsCisgICAgMHhhMSwgMHg4NSwKKyAgICAweDgxLCAweDAwLCAweDAxLCAweDAwCisgIH07CisKKyAgdGVzdF9ibG9ja19ncm91cF93aXRoX3ZlcnNpb24gKDEsIGRhdGEwX3YxLCBzaXplb2YgKGRhdGEwX3YxKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYmxvY2tfZ3JvdXBfdjIpCit7CisgIGd1aW50OCBkYXRhMF92MltdID0geyAweGEzLCAweDg1LCAweDgxLCAweDAwLCAweDAxLCAweDAwIH07CisKKyAgdGVzdF9ibG9ja19ncm91cF93aXRoX3ZlcnNpb24gKDIsIGRhdGEwX3YyLCBzaXplb2YgKGRhdGEwX3YyKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcmVzZXQpCit7CisgIEdzdEhhcm5lc3MgKmg7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXI7CisgIEdzdEJ1ZmZlciAqb3V0YnVmZmVyOworCisgIGggPSBzZXR1cF9tYXRyb3NrYW11eF9oYXJuZXNzIChBQzNfQ0FQU19TVFJJTkcpOworCisgIGluYnVmZmVyID0gZ3N0X2hhcm5lc3NfY3JlYXRlX2J1ZmZlciAoaCwgMSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgaW5idWZmZXIpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoNSwgZ3N0X2hhcm5lc3NfYnVmZmVyc19yZWNlaXZlZCAoaCkpOworCisgIG91dGJ1ZmZlciA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBmYWlsX3VubGVzcyAob3V0YnVmZmVyICE9IE5VTEwpOworICB3aGlsZSAob3V0YnVmZmVyICE9IE5VTEwpIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWZmZXIpOworICAgIG91dGJ1ZmZlciA9IGdzdF9oYXJuZXNzX3RyeV9wdWxsIChoKTsKKyAgfQorCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoaC0+ZWxlbWVudCwgR1NUX1NUQVRFX05VTEwpKTsKKworICBnc3RfaGFybmVzc19wbGF5IChoKTsKKworICBpbmJ1ZmZlciA9IGdzdF9oYXJuZXNzX2NyZWF0ZV9idWZmZXIgKGgsIDEpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGluYnVmZmVyKSk7CisKKyAgb3V0YnVmZmVyID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGZhaWxfdW5sZXNzIChvdXRidWZmZXIgIT0gTlVMTCk7CisgIHdoaWxlIChvdXRidWZmZXIgIT0gTlVMTCkgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1ZmZlcik7CisgICAgb3V0YnVmZmVyID0gZ3N0X2hhcm5lc3NfdHJ5X3B1bGwgKGgpOworICB9CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2xpbmtfd2VibW11eF93ZWJtX3NpbmspCit7CisgIEdzdEhhcm5lc3MgKmg7CisKKyAgaCA9IGdzdF9oYXJuZXNzX25ld193aXRoX3BhZG5hbWVzICgid2VibW11eCIsICJhdWRpb18ldSIsICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKGggIT0gTlVMTCk7CisKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NpbmtfY2Fwc19zdHIgKGgsICJ2aWRlby93ZWJtOyBhdWRpby93ZWJtIik7CisKKyAgZ3N0X2hhcm5lc3NfcGxheSAoaCk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChoLT5lbGVtZW50LCBHU1RfU1RBVEVfTlVMTCkpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgZ2ludDY0IHRpbWVjb2Rlc2NhbGVzW10gPSB7CisgIEdTVF9VU0VDT05ELAorICBHU1RfTVNFQ09ORCwKKyAgR1NUX01TRUNPTkQgKiAxMCwKKyAgR1NUX01TRUNPTkQgKiAxMDAsCisgIEdTVF9NU0VDT05EICogNDAwLAorICAvKiBGQUlMUzogPyBHU1RfTVNFQ09ORCAqIDUwMCwgYSBidWc/ICovCit9OworCitHU1RfU1RBUlRfVEVTVCAodGVzdF90aW1lY29kZXNjYWxlKQoreworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBndWludDggZGF0YV9oMFtdID0geworICAgIDB4YTMsIDB4ODUsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MDAsCisgIH07CisgIGd1aW50OCBkYXRhX2gxW10gPSB7CisgICAgMHhhMywgMHg4NSwgMHg4MSwgMHgwMCwgMHgwMSwgMHgwMCwKKyAgfTsKKworICBHc3RIYXJuZXNzICpoID0gc2V0dXBfbWF0cm9za2FtdXhfaGFybmVzcyAoQUMzX0NBUFNfU1RSSU5HKTsKKyAgZ2ludDY0IHRpbWVjb2Rlc2NhbGUgPSB0aW1lY29kZXNjYWxlc1tfX2lfX107CisKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAidGltZWNvZGVzY2FsZSIsIHRpbWVjb2Rlc2NhbGUsIE5VTEwpOworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJ2ZXJzaW9uIiwgMiwgTlVMTCk7CisKKyAgLyogQnVmZmVyIDAgKi8KKyAgaW5idWZmZXIgPSBnc3RfaGFybmVzc19jcmVhdGVfYnVmZmVyIChoLCAxKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLCBnc3RfaGFybmVzc19wdXNoIChoLCBpbmJ1ZmZlcikpOworCisgIC8qIHB1bGwgb3V0IGhlYWRlcnMgKi8KKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworICBnc3RfYnVmZmVyX3VucmVmIChnc3RfaGFybmVzc19wdWxsIChoKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKworICAvKiB2ZXJpZnkgaGVhZGVyIGFuZCBkcm9wIHRoZSBkYXRhICovCisgIG91dGJ1ZmZlciA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBjb21wYXJlX2J1ZmZlcl90b19kYXRhIChvdXRidWZmZXIsIGRhdGFfaDAsIHNpemVvZiAoZGF0YV9oMCkpOworICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWZmZXIpOworICBnc3RfYnVmZmVyX3VucmVmIChnc3RfaGFybmVzc19wdWxsIChoKSk7CisKKyAgLyogQnVmZmVyIDEgKi8KKyAgaW5idWZmZXIgPSBnc3RfaGFybmVzc19jcmVhdGVfYnVmZmVyIChoLCAxKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IHRpbWVjb2Rlc2NhbGU7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLCBnc3RfaGFybmVzc19wdXNoIChoLCBpbmJ1ZmZlcikpOworCisgIC8qIHZlcmlmeSBoZWFkZXIgYW5kIGRyb3AgdGhlIGRhdGEgKi8KKyAgb3V0YnVmZmVyID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGNvbXBhcmVfYnVmZmVyX3RvX2RhdGEgKG91dGJ1ZmZlciwgZGF0YV9oMSwgc2l6ZW9mIChkYXRhX2gxKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1ZmZlcik7CisgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogQ3JlYXRlIGEgbmV3IGNoYXB0ZXIgKi8KK3N0YXRpYyBHc3RUb2NFbnRyeSAqCituZXdfY2hhcHRlciAoY29uc3QgZ3VpbnQgY2hhcHRlcl9uYiwgY29uc3QgZ2ludDY0IHN0YXJ0LCBjb25zdCBnaW50NjQgc3RvcCkKK3sKKyAgR3N0VG9jRW50cnkgKnRvY19lbnRyeSwgKnRvY19zdWJfZW50cnk7CisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisgIGdjaGFyIHRpdGxlWzMyXTsKKyAgZ2NoYXIgYXJ0aXN0WzMyXTsKKyAgZ2NoYXIgc3RyX3VpZFszMl07CisKKyAgZ19zbnByaW50ZiAoc3RyX3VpZCwgc2l6ZW9mIChzdHJfdWlkKSwgInVpZC4lZCIsIGNoYXB0ZXJfbmIpOworICB0b2NfZW50cnkgPSBnc3RfdG9jX2VudHJ5X25ldyAoR1NUX1RPQ19FTlRSWV9UWVBFX0NIQVBURVIsIHN0cl91aWQpOworICBnc3RfdG9jX2VudHJ5X3NldF9zdGFydF9zdG9wX3RpbWVzICh0b2NfZW50cnksIHN0YXJ0LCBzdG9wKTsKKworICBnX3NucHJpbnRmICh0aXRsZSwgc2l6ZW9mICh0aXRsZSksICJjaGFwLiVkIiwgY2hhcHRlcl9uYik7CisgIGdfc25wcmludGYgKGFydGlzdCwgc2l6ZW9mIChhcnRpc3QpLCAiYXJ0LiVkIiwgY2hhcHRlcl9uYik7CisgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3IChHU1RfVEFHX1RJVExFLCB0aXRsZSwgR1NUX1RBR19BUlRJU1QsIGFydGlzdCwgTlVMTCk7CisgIGdzdF90b2NfZW50cnlfc2V0X3RhZ3MgKHRvY19lbnRyeSwgdGFncyk7CisKKyAgZ19zbnByaW50ZiAoc3RyX3VpZCwgc2l6ZW9mIChzdHJfdWlkKSwgInVpZC4lZC4xIiwgY2hhcHRlcl9uYik7CisgIHRvY19zdWJfZW50cnkgPSBnc3RfdG9jX2VudHJ5X25ldyAoR1NUX1RPQ19FTlRSWV9UWVBFX0NIQVBURVIsIHN0cl91aWQpOworICBnc3RfdG9jX2VudHJ5X3NldF9zdGFydF9zdG9wX3RpbWVzICh0b2Nfc3ViX2VudHJ5LCBzdGFydCwgKHN0YXJ0ICsgc3RvcCkgLyAyKTsKKworICBnX3NucHJpbnRmICh0aXRsZSwgc2l6ZW9mICh0aXRsZSksICJuZXN0ZWQuJWQuMSIsIGNoYXB0ZXJfbmIpOworICBnX3NucHJpbnRmIChhcnRpc3QsIHNpemVvZiAoYXJ0aXN0KSwgImFydC4lZC4xIiwgY2hhcHRlcl9uYik7CisgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3IChHU1RfVEFHX1RJVExFLCB0aXRsZSwgR1NUX1RBR19BUlRJU1QsIGFydGlzdCwgTlVMTCk7CisgIGdzdF90b2NfZW50cnlfc2V0X3RhZ3MgKHRvY19zdWJfZW50cnksIHRhZ3MpOworCisgIGdzdF90b2NfZW50cnlfYXBwZW5kX3N1Yl9lbnRyeSAodG9jX2VudHJ5LCB0b2Nfc3ViX2VudHJ5KTsKKworICBnX3NucHJpbnRmIChzdHJfdWlkLCBzaXplb2YgKHN0cl91aWQpLCAidWlkLiVkLjIiLCBjaGFwdGVyX25iKTsKKyAgdG9jX3N1Yl9lbnRyeSA9IGdzdF90b2NfZW50cnlfbmV3IChHU1RfVE9DX0VOVFJZX1RZUEVfQ0hBUFRFUiwgc3RyX3VpZCk7CisgIGdzdF90b2NfZW50cnlfc2V0X3N0YXJ0X3N0b3BfdGltZXMgKHRvY19zdWJfZW50cnksIChzdGFydCArIHN0b3ApIC8gMiwgc3RvcCk7CisKKyAgZ19zbnByaW50ZiAodGl0bGUsIHNpemVvZiAodGl0bGUpLCAibmVzdGVkLyVkLjIiLCBjaGFwdGVyX25iKTsKKyAgZ19zbnByaW50ZiAoYXJ0aXN0LCBzaXplb2YgKGFydGlzdCksICJhcnQuJWQuMiIsIGNoYXB0ZXJfbmIpOworICB0YWdzID0gZ3N0X3RhZ19saXN0X25ldyAoR1NUX1RBR19USVRMRSwgdGl0bGUsIEdTVF9UQUdfQVJUSVNULCBhcnRpc3QsIE5VTEwpOworICBnc3RfdG9jX2VudHJ5X3NldF90YWdzICh0b2Nfc3ViX2VudHJ5LCB0YWdzKTsKKworICBnc3RfdG9jX2VudHJ5X2FwcGVuZF9zdWJfZW50cnkgKHRvY19lbnRyeSwgdG9jX3N1Yl9lbnRyeSk7CisKKyAgcmV0dXJuIHRvY19lbnRyeTsKK30KKworLyogQ3JlYXRlIGEgcmVmZXJlbmNlIHRvYyB3aGljaCBpbmNsdWRlcyBhIG1hc3RlciBlZGl0aW9uIGVudHJ5ICovCitzdGF0aWMgR3N0VG9jICoKK25ld19yZWZlcmVuY2VfdG9jICh2b2lkKQoreworICBHc3RUb2MgKnJlZl90b2M7CisgIEdzdFRvY0VudHJ5ICp0b2NfZWRpdGlvbl9lbnRyeSwgKnRvY19lbnRyeTsKKyAgR3N0VGFnTGlzdCAqdGFnczsKKworICByZWZfdG9jID0gZ3N0X3RvY19uZXcgKEdTVF9UT0NfU0NPUEVfR0xPQkFMKTsKKworICB0b2NfZWRpdGlvbl9lbnRyeSA9IGdzdF90b2NfZW50cnlfbmV3IChHU1RfVE9DX0VOVFJZX1RZUEVfRURJVElPTiwgIjAwIik7CisgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3IChHU1RfVEFHX0NPTU1FTlQsICJFZCIsIE5VTEwpOworICBnc3RfdG9jX2VudHJ5X3NldF90YWdzICh0b2NfZWRpdGlvbl9lbnRyeSwgdGFncyk7CisKKyAgdG9jX2VudHJ5ID0gbmV3X2NoYXB0ZXIgKDEsIDAgKiBHU1RfTVNFQ09ORCwgMiAqIEdTVF9NU0VDT05EKTsKKyAgZ3N0X3RvY19lbnRyeV9hcHBlbmRfc3ViX2VudHJ5ICh0b2NfZWRpdGlvbl9lbnRyeSwgdG9jX2VudHJ5KTsKKworICB0b2NfZW50cnkgPSBuZXdfY2hhcHRlciAoMiwgMiAqIEdTVF9NU0VDT05ELCA0ICogR1NUX01TRUNPTkQpOworICBnc3RfdG9jX2VudHJ5X2FwcGVuZF9zdWJfZW50cnkgKHRvY19lZGl0aW9uX2VudHJ5LCB0b2NfZW50cnkpOworCisgIGdzdF90b2NfYXBwZW5kX2VudHJ5IChyZWZfdG9jLCB0b2NfZWRpdGlvbl9lbnRyeSk7CisKKyAgcmV0dXJuIHJlZl90b2M7Cit9CisKKy8qIENyZWF0ZSBhIHRvYyB3aGljaCBpbmNsdWRlcyBjaGFwdGVycyB3aXRob3V0IGVkaXRpb24gZW50cnkgKi8KK3N0YXRpYyBHc3RUb2MgKgorbmV3X25vX2VkaXRpb25fdG9jICh2b2lkKQoreworICBHc3RUb2MgKnJlZl90b2M7CisgIEdzdFRvY0VudHJ5ICp0b2NfZW50cnk7CisKKyAgcmVmX3RvYyA9IGdzdF90b2NfbmV3IChHU1RfVE9DX1NDT1BFX0dMT0JBTCk7CisKKyAgdG9jX2VudHJ5ID0gbmV3X2NoYXB0ZXIgKDEsIDAgKiBHU1RfTVNFQ09ORCwgMiAqIEdTVF9NU0VDT05EKTsKKyAgZ3N0X3RvY19hcHBlbmRfZW50cnkgKHJlZl90b2MsIHRvY19lbnRyeSk7CisKKyAgdG9jX2VudHJ5ID0gbmV3X2NoYXB0ZXIgKDIsIDIgKiBHU1RfTVNFQ09ORCwgNCAqIEdTVF9NU0VDT05EKTsKKyAgZ3N0X3RvY19hcHBlbmRfZW50cnkgKHJlZl90b2MsIHRvY19lbnRyeSk7CisKKyAgcmV0dXJuIHJlZl90b2M7Cit9CisKK3N0YXRpYyBndWludDY0CityZWFkX2ludGVnZXIgKEdzdE1hcEluZm8gKiBpbmZvLCBnc2l6ZSAqIGluZGV4LCBndWludDY0IGxlbikKK3sKKyAgZ3VpbnQ2NCB0b3RhbCA9IDA7CisKKyAgZm9yICg7IGxlbiA+IDA7IC0tbGVuKSB7CisgICAgdG90YWwgPSAodG90YWwgPDwgOCkgfCBHU1RfUkVBRF9VSU5UOCAoaW5mby0+ZGF0YSArICppbmRleCk7CisgICAgKysoKmluZGV4KTsKKyAgfQorCisgIHJldHVybiB0b3RhbDsKK30KKworc3RhdGljIGd1aW50NjQKK3JlYWRfbGVuZ3RoIChHc3RNYXBJbmZvICogaW5mbywgZ3NpemUgKiBpbmRleCkKK3sKKyAgZ2ludCBsZW5fbWFzayA9IDB4ODAsIHJlYWQgPSAxOworICBndWludDY0IHRvdGFsOworICBndWludDggYjsKKworICBiID0gR1NUX1JFQURfVUlOVDggKGluZm8tPmRhdGEgKyAqaW5kZXgpOworICArKygqaW5kZXgpOworICB0b3RhbCA9IChndWludDY0KSBiOworICB3aGlsZSAocmVhZCA8PSA4ICYmICEodG90YWwgJiBsZW5fbWFzaykpIHsKKyAgICByZWFkKys7CisgICAgbGVuX21hc2sgPj49IDE7CisgIH0KKyAgdG90YWwgJj0gKGxlbl9tYXNrIC0gMSk7CisKKyAgZm9yICg7IHJlYWQgPiAxOyAtLXJlYWQpIHsKKyAgICB0b3RhbCA9ICh0b3RhbCA8PCA4KSB8IEdTVF9SRUFEX1VJTlQ4IChpbmZvLT5kYXRhICsgKmluZGV4KTsKKyAgICArKygqaW5kZXgpOworICB9CisKKyAgcmV0dXJuIHRvdGFsOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2NoZWNrX2lkIChHc3RNYXBJbmZvICogaW5mbywgZ3NpemUgKiBpbmRleCwKKyAgICBndWludDggKiB0YWcsIGdpbnQgdGFnX2xlbiwgZ3VpbnQ2NCAqIGxlbikKK3sKKyAgaWYgKG1lbWNtcCAoaW5mby0+ZGF0YSArICppbmRleCwgdGFnLCB0YWdfbGVuKSA9PSAwKSB7CisgICAgKmluZGV4ICs9IHRhZ19sZW47CisgICAgKmxlbiA9IHJlYWRfbGVuZ3RoIChpbmZvLCBpbmRleCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorY2hlY2tfaWRfcmVhZF9pbnQgKEdzdE1hcEluZm8gKiBpbmZvLCBnc2l6ZSAqIGluZGV4LAorICAgIGd1aW50OCAqIHRhZywgZ2ludCB0YWdfbGVuLCBndWludDY0ICogdmFsdWUpCit7CisgIGd1aW50NjQgbGVuOworCisgIGlmIChjaGVja19pZCAoaW5mbywgaW5kZXgsIHRhZywgdGFnX2xlbiwgJmxlbikpIHsKKyAgICAqdmFsdWUgPSByZWFkX2ludGVnZXIgKGluZm8sIGluZGV4LCBsZW4pOworICAgIHJldHVybiBUUlVFOworICB9IGVsc2UgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKiBDaGVjayB0aGUgdG9jIGVudHJ5IGFnYWluc3QgdGhlIG11eGVkIGJ1ZmZlcgorICogUmV0dXJucyB0aGUgaW50ZXJuYWwgVUlEICovCitzdGF0aWMgdm9pZAorY2hlY2tfY2hhcHRlciAoR3N0VG9jRW50cnkgKiB0b2NfZW50cnksIEdzdFRvY0VudHJ5ICogaW50ZXJuYWxfdG9jX2VudHJ5LAorICAgIEdzdE1hcEluZm8gKiBpbmZvLCBnc2l6ZSAqIGluZGV4LCBnaW50IGxhc3Rfb2Zmc2V0KQoreworICBndWludDY0IGxlbiwgdmFsdWUsIHVpZDsKKyAgZ2ludDY0IHN0YXJ0X3JlZiwgZW5kX3JlZjsKKyAgZ2NoYXIgc191aWRbMzJdOworICBjb25zdCBnY2hhciAqc3RyX3VpZDsKKyAgR3N0VG9jRW50cnkgKmludGVybmFsX2NoYXB0ZXI7CisgIEdMaXN0ICpjdXJfc3ViX2NoYXA7CisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisgIGdjaGFyICp0aXRsZTsKKworICBndWludDggY2hhcHRlcl9hdG9tW10gPSB7IDB4YjYgfTsKKyAgZ3VpbnQ4IGNoYXB0ZXJfdWlkW10gPSB7IDB4NzMsIDB4YzQgfTsKKyAgZ3VpbnQ4IGNoYXB0ZXJfc3RyX3VpZFtdID0geyAweDU2LCAweDU0IH07CisgIGd1aW50OCBjaGFwdGVyX3N0YXJ0W10gPSB7IDB4OTEgfTsKKyAgZ3VpbnQ4IGNoYXB0ZXJfZW5kW10gPSB7IDB4OTIgfTsKKyAgZ3VpbnQ4IGNoYXB0ZXJfZmxhZ19oaWRkZW5bXSA9IHsgMHg5OCB9OworICBndWludDggY2hhcHRlcl9mbGFnX2VuYWJsZWRbXSA9IHsgMHg0NSwgMHg5OCB9OworICBndWludDggY2hhcHRlcl9zZWdtZW50X3VpZFtdID0geyAweDZlLCAweDY3IH07CisgIGd1aW50OCBjaGFwdGVyX3NlZ21lbnRfZWRpdGlvbl91aWRbXSA9IHsgMHg2ZSwgMHhiYyB9OworICBndWludDggY2hhcHRlcl9waHlzaWNhbF9lcXVpdltdID0geyAweDYzLCAweGMzIH07CisgIGd1aW50OCBjaGFwdGVyX3RyYWNrW10gPSB7IDB4OGYgfTsKKyAgZ3VpbnQ4IGNoYXB0ZXJfdHJhY2tfbmJbXSA9IHsgMHg4OSB9OworICBndWludDggY2hhcHRlcl9kaXNwbGF5W10gPSB7IDB4ODAgfTsKKyAgZ3VpbnQ4IGNoYXB0ZXJfc3RyaW5nW10gPSB7IDB4ODUgfTsKKyAgZ3VpbnQ4IGNoYXB0ZXJfbGFuZ3VhZ2VbXSA9IHsgMHg0MywgMHg3YyB9OworCisgIGZhaWxfdW5sZXNzIChjaGVja19pZCAoaW5mbywgaW5kZXgsIGNoYXB0ZXJfYXRvbSwKKyAgICAgICAgICBzaXplb2YgKGNoYXB0ZXJfYXRvbSksICZsZW4pKTsKKworICBmYWlsX3VubGVzcyAoY2hlY2tfaWRfcmVhZF9pbnQgKGluZm8sIGluZGV4LCBjaGFwdGVyX3VpZCwKKyAgICAgICAgICBzaXplb2YgKGNoYXB0ZXJfdWlkKSwgJnVpZCkpOworCisgIC8qIG9wdGlvbmFsIFN0cmluZ1VJRCAqLworICBpZiAoY2hlY2tfaWQgKGluZm8sIGluZGV4LCBjaGFwdGVyX3N0cl91aWQsIHNpemVvZiAoY2hhcHRlcl9zdHJfdWlkKSwgJmxlbikpIHsKKyAgICBzdHJfdWlkID0gZ3N0X3RvY19lbnRyeV9nZXRfdWlkICh0b2NfZW50cnkpOworICAgIGZhaWxfdW5sZXNzIChtZW1jbXAgKGluZm8tPmRhdGEgKyAqaW5kZXgsIHN0cl91aWQsIHN0cmxlbiAoc3RyX3VpZCkpID09IDApOworICAgICppbmRleCArPSBsZW47CisgIH0KKworICBnc3RfdG9jX2VudHJ5X2dldF9zdGFydF9zdG9wX3RpbWVzICh0b2NfZW50cnksICZzdGFydF9yZWYsICZlbmRfcmVmKTsKKworICBmYWlsX3VubGVzcyAoY2hlY2tfaWRfcmVhZF9pbnQgKGluZm8sIGluZGV4LCBjaGFwdGVyX3N0YXJ0LAorICAgICAgICAgIHNpemVvZiAoY2hhcHRlcl9zdGFydCksICZ2YWx1ZSkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChzdGFydF9yZWYsIHZhbHVlKTsKKworICAvKiBvcHRpb25hbCBjaGFwdGVyIGVuZCAqLworICBpZiAoY2hlY2tfaWRfcmVhZF9pbnQgKGluZm8sIGluZGV4LCBjaGFwdGVyX2VuZCwKKyAgICAgICAgICBzaXplb2YgKGNoYXB0ZXJfZW5kKSwgJnZhbHVlKSkgeworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGVuZF9yZWYsIHZhbHVlKTsKKyAgfQorCisgIGZhaWxfdW5sZXNzIChjaGVja19pZF9yZWFkX2ludCAoaW5mbywgaW5kZXgsIGNoYXB0ZXJfZmxhZ19oaWRkZW4sCisgICAgICAgICAgc2l6ZW9mIChjaGFwdGVyX2ZsYWdfaGlkZGVuKSwgJnZhbHVlKSk7CisKKyAgZmFpbF91bmxlc3MgKGNoZWNrX2lkX3JlYWRfaW50IChpbmZvLCBpbmRleCwgY2hhcHRlcl9mbGFnX2VuYWJsZWQsCisgICAgICAgICAgc2l6ZW9mIChjaGFwdGVyX2ZsYWdfZW5hYmxlZCksICZ2YWx1ZSkpOworCisgIC8qIG9wdGlvbmFsIHNlZ21lbnQgVUlEICovCisgIGNoZWNrX2lkX3JlYWRfaW50IChpbmZvLCBpbmRleCwgY2hhcHRlcl9zZWdtZW50X3VpZCwKKyAgICAgIHNpemVvZiAoY2hhcHRlcl9zZWdtZW50X3VpZCksICZ2YWx1ZSk7CisKKyAgLyogb3B0aW9uYWwgc2VnbWVudCBlZGl0aW9uIFVJRCAqLworICBjaGVja19pZF9yZWFkX2ludCAoaW5mbywgaW5kZXgsIGNoYXB0ZXJfc2VnbWVudF9lZGl0aW9uX3VpZCwKKyAgICAgIHNpemVvZiAoY2hhcHRlcl9zZWdtZW50X2VkaXRpb25fdWlkKSwgJnZhbHVlKTsKKworICAvKiBvcHRpb25hbCBwaHlzaWNhbCBlcXVpdiAqLworICBjaGVja19pZF9yZWFkX2ludCAoaW5mbywgaW5kZXgsIGNoYXB0ZXJfcGh5c2ljYWxfZXF1aXYsCisgICAgICBzaXplb2YgKGNoYXB0ZXJfcGh5c2ljYWxfZXF1aXYpLCAmdmFsdWUpOworCisgIC8qIG9wdGlvbmFsIGNoYXB0ZXIgdHJhY2sgKi8KKyAgaWYgKGNoZWNrX2lkIChpbmZvLCBpbmRleCwgY2hhcHRlcl90cmFjaywgc2l6ZW9mIChjaGFwdGVyX3RyYWNrKSwgJmxlbikpIHsKKyAgICBmYWlsX3VubGVzcyAoY2hlY2tfaWRfcmVhZF9pbnQgKGluZm8sIGluZGV4LCBjaGFwdGVyX3RyYWNrX25iLAorICAgICAgICAgICAgc2l6ZW9mIChjaGFwdGVyX3RyYWNrX25iKSwgJnZhbHVlKSk7CisgIH0KKworICAvKiBGSVhNRTogdGhlcmUgY2FuIGJlIHNldmVyYWwgY2hhcHRlciBkaXNwbGF5cyAqLworICBpZiAoY2hlY2tfaWQgKGluZm8sIGluZGV4LCBjaGFwdGVyX2Rpc3BsYXksIHNpemVvZiAoY2hhcHRlcl9kaXNwbGF5KSwgJmxlbikpIHsKKyAgICAvKiBjaGFwdGVyIGRpc3BsYXkgKi8KKyAgICBmYWlsX3VubGVzcyAoY2hlY2tfaWQgKGluZm8sIGluZGV4LCBjaGFwdGVyX3N0cmluZywKKyAgICAgICAgICAgIHNpemVvZiAoY2hhcHRlcl9zdHJpbmcpLCAmbGVuKSk7CisKKyAgICB0YWdzID0gZ3N0X3RvY19lbnRyeV9nZXRfdGFncyAodG9jX2VudHJ5KTsKKyAgICBpZiAoZ3N0X3RhZ19saXN0X2dldF90YWdfc2l6ZSAodGFncywgR1NUX1RBR19USVRMRSkgPiAwKSB7CisgICAgICBnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZ19pbmRleCAodGFncywgR1NUX1RBR19USVRMRSwgMCwgJnRpdGxlKTsKKyAgICAgIGZhaWxfdW5sZXNzIChtZW1jbXAgKGluZm8tPmRhdGEgKyAqaW5kZXgsIHRpdGxlLCBzdHJsZW4gKHRpdGxlKSkgPT0gMCk7CisgICAgICBnX2ZyZWUgKHRpdGxlKTsKKyAgICB9CisgICAgKmluZGV4ICs9IGxlbjsKKworICAgIGZhaWxfdW5sZXNzIChjaGVja19pZCAoaW5mbywgaW5kZXgsIGNoYXB0ZXJfbGFuZ3VhZ2UsCisgICAgICAgICAgICBzaXplb2YgKGNoYXB0ZXJfbGFuZ3VhZ2UpLCAmbGVuKSk7CisgICAgLyogVE9ETzogZGVmaW5lIGxhbmd1YWdlIC0gYWx3YXlzICJ1bmQiIEFUTSAqLworICAgICppbmRleCArPSBsZW47CisgIH0KKworICAvKiBUT0RPOiBhZGQgcmVtYWluaW5nIGZpZWxkcyAobm90IHVzZWQgaW4gY3VycmVudCBtYXRyb3NrYS1tdXgpICovCisKKyAgZ19zbnByaW50ZiAoc191aWQsIHNpemVvZiAoc191aWQpLCAiJSIgR19HSU5UNjRfRk9STUFULCB1aWQpOworICBpbnRlcm5hbF9jaGFwdGVyID0gZ3N0X3RvY19lbnRyeV9uZXcgKEdTVF9UT0NfRU5UUllfVFlQRV9DSEFQVEVSLCBzX3VpZCk7CisgIGdzdF90b2NfZW50cnlfYXBwZW5kX3N1Yl9lbnRyeSAoaW50ZXJuYWxfdG9jX2VudHJ5LCBpbnRlcm5hbF9jaGFwdGVyKTsKKworICBjdXJfc3ViX2NoYXAgPSBnc3RfdG9jX2VudHJ5X2dldF9zdWJfZW50cmllcyAodG9jX2VudHJ5KTsKKyAgd2hpbGUgKGN1cl9zdWJfY2hhcCAhPSBOVUxMICYmICppbmRleCA8IGxhc3Rfb2Zmc2V0KSB7CisgICAgY2hlY2tfY2hhcHRlciAoY3VyX3N1Yl9jaGFwLT5kYXRhLCBpbnRlcm5hbF9jaGFwdGVyLCBpbmZvLAorICAgICAgICBpbmRleCwgbGFzdF9vZmZzZXQpOworICAgIGN1cl9zdWJfY2hhcCA9IGN1cl9zdWJfY2hhcC0+bmV4dDsKKyAgfQorCisgIGZhaWxfdW5sZXNzIChjdXJfc3ViX2NoYXAgPT0gTlVMTCk7Cit9CisKKy8qIENoZWNrIHRoZSByZWZlcmVuY2UgdG9jIGFnYWluc3QgdGhlIG11eGVkIGJ1ZmZlciAqLworc3RhdGljIHZvaWQKK2NoZWNrX3RvYyAoR3N0VG9jICogcmVmX3RvYywgR3N0VG9jICogaW50ZXJuYWxfdG9jLAorICAgIEdzdE1hcEluZm8gKiBpbmZvLCBnc2l6ZSAqIGluZGV4KQoreworICBndWludDY0IGxlbiwgdmFsdWUsIHVpZDsKKyAgZ2NoYXIgc191aWRbMzJdOworICBnaW50IGxhc3Rfb2Zmc2V0OworICBHTGlzdCAqY3VyX2VudHJ5LCAqY3VyX2NoYXB0ZXI7CisgIEdzdFRvY0VudHJ5ICppbnRlcm5hbF9lZGl0aW9uOworCisgIGd1aW50OCBlZGl0aW9uX2VudHJ5W10gPSB7IDB4NDUsIDB4YjkgfTsKKyAgZ3VpbnQ4IGVkaXRpb25fdWlkW10gPSB7IDB4NDUsIDB4YmMgfTsKKyAgZ3VpbnQ4IGVkaXRpb25fZmxhZ19oaWRkZW5bXSA9IHsgMHg0NSwgMHhiZCB9OworICBndWludDggZWRpdGlvbl9mbGFnX2RlZmF1bHRbXSA9IHsgMHg0NSwgMHhkYiB9OworICBndWludDggZWRpdGlvbl9mbGFnX29yZGVyZWRbXSA9IHsgMHg0NSwgMHhkZCB9OworCisgIC8qIGVkaXRpb24gZW50cnkgKi8KKyAgZmFpbF91bmxlc3MgKGNoZWNrX2lkIChpbmZvLCBpbmRleCwgZWRpdGlvbl9lbnRyeSwKKyAgICAgICAgICBzaXplb2YgKGVkaXRpb25fZW50cnkpLCAmbGVuKSk7CisgIGxhc3Rfb2Zmc2V0ID0gKmluZGV4ICsgKGdpbnQpIGxlbjsKKworICBjdXJfZW50cnkgPSBnc3RfdG9jX2dldF9lbnRyaWVzIChyZWZfdG9jKTsKKyAgd2hpbGUgKGN1cl9lbnRyeSAhPSBOVUxMICYmICppbmRleCA8IGxhc3Rfb2Zmc2V0KSB7CisgICAgdWlkID0gMDsKKyAgICBjaGVja19pZF9yZWFkX2ludCAoaW5mbywgaW5kZXgsIGVkaXRpb25fdWlkLCBzaXplb2YgKGVkaXRpb25fdWlkKSwgJnVpZCk7CisgICAgZ19zbnByaW50ZiAoc191aWQsIHNpemVvZiAoc191aWQpLCAiJSIgR19HSU5UNjRfRk9STUFULCB1aWQpOworICAgIGludGVybmFsX2VkaXRpb24gPSBnc3RfdG9jX2VudHJ5X25ldyAoR1NUX1RPQ19FTlRSWV9UWVBFX0VESVRJT04sIHNfdWlkKTsKKyAgICBnc3RfdG9jX2FwcGVuZF9lbnRyeSAoaW50ZXJuYWxfdG9jLCBpbnRlcm5hbF9lZGl0aW9uKTsKKworICAgIGZhaWxfdW5sZXNzIChjaGVja19pZF9yZWFkX2ludCAoaW5mbywgaW5kZXgsIGVkaXRpb25fZmxhZ19oaWRkZW4sCisgICAgICAgICAgICBzaXplb2YgKGVkaXRpb25fZmxhZ19oaWRkZW4pLCAmdmFsdWUpKTsKKworICAgIGZhaWxfdW5sZXNzIChjaGVja19pZF9yZWFkX2ludCAoaW5mbywgaW5kZXgsIGVkaXRpb25fZmxhZ19kZWZhdWx0LAorICAgICAgICAgICAgc2l6ZW9mIChlZGl0aW9uX2ZsYWdfZGVmYXVsdCksICZ2YWx1ZSkpOworCisgICAgLyogb3B0aW9uYWwgKi8KKyAgICBjaGVja19pZF9yZWFkX2ludCAoaW5mbywgaW5kZXgsIGVkaXRpb25fZmxhZ19vcmRlcmVkLAorICAgICAgICBzaXplb2YgKGVkaXRpb25fZmxhZ19vcmRlcmVkKSwgJnZhbHVlKTsKKworICAgIGN1cl9jaGFwdGVyID0gZ3N0X3RvY19lbnRyeV9nZXRfc3ViX2VudHJpZXMgKGN1cl9lbnRyeS0+ZGF0YSk7CisgICAgd2hpbGUgKGN1cl9jaGFwdGVyICE9IE5VTEwgJiYgKmluZGV4IDwgbGFzdF9vZmZzZXQpIHsKKyAgICAgIGNoZWNrX2NoYXB0ZXIgKGN1cl9jaGFwdGVyLT5kYXRhLCBpbnRlcm5hbF9lZGl0aW9uLCBpbmZvLAorICAgICAgICAgIGluZGV4LCBsYXN0X29mZnNldCk7CisgICAgICBjdXJfY2hhcHRlciA9IGN1cl9jaGFwdGVyLT5uZXh0OworICAgIH0KKyAgICBmYWlsX3VubGVzcyAoY3VyX2NoYXB0ZXIgPT0gTlVMTCk7CisKKyAgICBjdXJfZW50cnkgPSBjdXJfZW50cnktPm5leHQ7CisgIH0KKworICBmYWlsX3VubGVzcyAoY3VyX2VudHJ5ID09IE5VTEwgJiYgKmluZGV4ID09IGxhc3Rfb2Zmc2V0KTsKK30KKworc3RhdGljIEdzdFRvY0VudHJ5ICoKK2ZpbmRfdG9jX2VudHJ5IChHc3RUb2NFbnRyeSAqIHJlZl90b2NfZW50cnksIEdzdFRvY0VudHJ5ICogaW50ZXJuYWxfdG9jX2VudHJ5LAorICAgIGd1aW50NjQgdWlkKQoreworICBHTGlzdCAqY3VyX3JlZl9lbnRyeSwgKmN1cl9pbnRlcm5hbF9lbnRyeTsKKyAgZ3VpbnQ2NCBpbnRlcm5hbF91aWQ7CisgIEdzdFRvY0VudHJ5ICpyZXN1bHQgPSBOVUxMOworCisgIGludGVybmFsX3VpZCA9IGdfYXNjaWlfc3RydG91bGwgKGdzdF90b2NfZW50cnlfZ2V0X3VpZCAoaW50ZXJuYWxfdG9jX2VudHJ5KSwKKyAgICAgIE5VTEwsIDEwKTsKKyAgaWYgKHVpZCA9PSBpbnRlcm5hbF91aWQpIHsKKyAgICByZXN1bHQgPSByZWZfdG9jX2VudHJ5OworICB9IGVsc2UgeworICAgIGN1cl9yZWZfZW50cnkgPSBnc3RfdG9jX2VudHJ5X2dldF9zdWJfZW50cmllcyAocmVmX3RvY19lbnRyeSk7CisgICAgY3VyX2ludGVybmFsX2VudHJ5ID0gZ3N0X3RvY19lbnRyeV9nZXRfc3ViX2VudHJpZXMgKGludGVybmFsX3RvY19lbnRyeSk7CisgICAgd2hpbGUgKGN1cl9yZWZfZW50cnkgIT0gTlVMTCAmJiBjdXJfaW50ZXJuYWxfZW50cnkgIT0gTlVMTCkgeworICAgICAgcmVzdWx0ID0gZmluZF90b2NfZW50cnkgKGN1cl9yZWZfZW50cnktPmRhdGEsIGN1cl9pbnRlcm5hbF9lbnRyeS0+ZGF0YSwKKyAgICAgICAgICB1aWQpOworCisgICAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGN1cl9yZWZfZW50cnkgPSBjdXJfcmVmX2VudHJ5LT5uZXh0OworICAgICAgY3VyX2ludGVybmFsX2VudHJ5ID0gY3VyX2ludGVybmFsX2VudHJ5LT5uZXh0OworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitmaW5kX2FuZF9jaGVja190YWdzIChHc3RUb2MgKiByZWZfdG9jLCBHc3RUb2MgKiBpbnRlcm5hbF90b2MsIEdzdE1hcEluZm8gKiBpbmZvLAorICAgIGd1aW50NjQgdWlkLCBnY2hhciAqIHRhZ19uYW1lLCBnY2hhciAqIHRhZ19zdHJpbmcpCit7CisgIEdMaXN0ICpjdXJfcmVmX2VudHJ5LCAqY3VyX2ludGVybmFsX2VudHJ5OworICBHc3RUb2NFbnRyeSAqcmVmX3RvY19lbnRyeSA9IE5VTEw7CisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisgIGNvbnN0IGdjaGFyICp0YWdfdHlwZTsKKyAgZ2NoYXIgKmN1cl90YWdfc3RyaW5nOworCisgIC8qIGZpbmQgdGhlIHJlZmVyZW5jZSB0b2MgZW50cnkgbWF0Y2hpbmcgdGhlIFVJRCAqLworICBjdXJfcmVmX2VudHJ5ID0gZ3N0X3RvY19nZXRfZW50cmllcyAocmVmX3RvYyk7CisgIGN1cl9pbnRlcm5hbF9lbnRyeSA9IGdzdF90b2NfZ2V0X2VudHJpZXMgKGludGVybmFsX3RvYyk7CisgIHdoaWxlIChjdXJfcmVmX2VudHJ5ICE9IE5VTEwgJiYgY3VyX2ludGVybmFsX2VudHJ5ICE9IE5VTEwpIHsKKyAgICByZWZfdG9jX2VudHJ5ID0gZmluZF90b2NfZW50cnkgKGN1cl9yZWZfZW50cnktPmRhdGEsCisgICAgICAgIGN1cl9pbnRlcm5hbF9lbnRyeS0+ZGF0YSwgdWlkKTsKKworICAgIGlmIChyZWZfdG9jX2VudHJ5ICE9IE5VTEwpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGN1cl9yZWZfZW50cnkgPSBjdXJfcmVmX2VudHJ5LT5uZXh0OworICAgIGN1cl9pbnRlcm5hbF9lbnRyeSA9IGN1cl9pbnRlcm5hbF9lbnRyeS0+bmV4dDsKKyAgfQorCisgIGZhaWxfdW5sZXNzIChyZWZfdG9jX2VudHJ5ICE9IE5VTEwpOworCisgIGlmIChnX3N0cmNtcDAgKHRhZ19uYW1lLCAiQVJUSVNUIikgPT0gMCkgeworICAgIHRhZ190eXBlID0gR1NUX1RBR19BUlRJU1Q7CisgIH0gZWxzZSBpZiAoZ19zdHJjbXAwICh0YWdfbmFtZSwgIkNPTU1FTlRTIikgPT0gMCkgeworICAgIHRhZ190eXBlID0gR1NUX1RBR19DT01NRU5UOworICB9IGVsc2UgeworICAgIHRhZ190eXBlID0gTlVMTDsKKyAgfQorCisgIGZhaWxfdW5sZXNzICh0YWdfdHlwZSAhPSBOVUxMKTsKKworICB0YWdzID0gZ3N0X3RvY19lbnRyeV9nZXRfdGFncyAocmVmX3RvY19lbnRyeSk7CisgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X3RhZ19zaXplICh0YWdzLCB0YWdfdHlwZSkgPiAwKTsKKyAgZ3N0X3RhZ19saXN0X2dldF9zdHJpbmdfaW5kZXggKHRhZ3MsIHRhZ190eXBlLCAwLCAmY3VyX3RhZ19zdHJpbmcpOworICBmYWlsX3VubGVzcyAoZ19zdHJjbXAwIChjdXJfdGFnX3N0cmluZywgdGFnX3N0cmluZykgPT0gMCk7CisgIGdfZnJlZSAoY3VyX3RhZ19zdHJpbmcpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfdGFncyAoR3N0VG9jICogcmVmX3RvYywgR3N0VG9jICogaW50ZXJuYWxfdG9jLAorICAgIEdzdE1hcEluZm8gKiBpbmZvLCBnc2l6ZSAqIGluZGV4KQoreworICBnYm9vbGVhbiBmb3VuZF90YWdzID0gRkFMU0UsIG11c3RfY2hlY2tfdGFnID0gRkFMU0U7CisgIGd1aW50NjQgbGVuLCB2YWx1ZSwgdWlkOworICBnc2l6ZSBsYXN0X29mZnNldCwgbmV4dF90YWc7CisgIGdjaGFyICp0YWdfbmFtZV9zdHIsICp0YWdfc3RyaW5nX3N0cjsKKyAgZ3VpbnQ4IHRhZ3NbXSA9IHsgMHgxMiwgMHg1NCwgMHhjMywgMHg2NyB9OworICBndWludDggdGFnW10gPSB7IDB4NzMsIDB4NzMgfTsKKyAgZ3VpbnQ4IHRhZ190YXJnZXRzW10gPSB7IDB4NjMsIDB4YzAgfTsKKyAgZ3VpbnQ4IHRhZ190YXJnZXRfdHlwZV92YWx1ZVtdID0geyAweDY4LCAweGNhIH07CisgIGd1aW50OCB0YWdfdGFyZ2V0X3R5cGVbXSA9IHsgMHg2MywgMHhjYSB9OworICBndWludDggdGFnX2VkaXRpb25fdWlkW10gPSB7IDB4NjMsIDB4YzkgfTsKKyAgZ3VpbnQ4IHRhZ19jaGFwdGVyX3VpZFtdID0geyAweDYzLCAweGM0IH07CisgIGd1aW50OCBzaW1wbGVfdGFnW10gPSB7IDB4NjcsIDB4YzggfTsKKyAgZ3VpbnQ4IHRhZ19uYW1lW10gPSB7IDB4NDUsIDB4YTMgfTsKKyAgZ3VpbnQ4IHRhZ19zdHJpbmdbXSA9IHsgMHg0NCwgMHg4NyB9OworCisgIGlmIChpbmZvLT5zaXplID4gKmluZGV4ICsgc2l6ZW9mICh0YWdzKSkgeworICAgIGZvciAoOyAqaW5kZXggPCBpbmZvLT5zaXplIC0gc2l6ZW9mICh0YWdzKTsgKysoKmluZGV4KSkgeworICAgICAgaWYgKG1lbWNtcCAoaW5mby0+ZGF0YSArICppbmRleCwgdGFncywgc2l6ZW9mICh0YWdzKSkgPT0gMCkgeworICAgICAgICAqaW5kZXggKz0gc2l6ZW9mICh0YWdzKTsKKworICAgICAgICBsZW4gPSByZWFkX2xlbmd0aCAoaW5mbywgaW5kZXgpOworICAgICAgICBsYXN0X29mZnNldCA9ICppbmRleCArIGxlbjsKKworICAgICAgICBmb3VuZF90YWdzID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZmFpbF91bmxlc3MgKGZvdW5kX3RhZ3MpOworCisgIHdoaWxlICgqaW5kZXggPCBsYXN0X29mZnNldCkgeworICAgIGZhaWxfdW5sZXNzIChjaGVja19pZCAoaW5mbywgaW5kZXgsIHRhZywgc2l6ZW9mICh0YWcpLCAmbGVuKSk7CisgICAgbmV4dF90YWcgPSAqaW5kZXggKyBsZW47CisKKyAgICBmYWlsX3VubGVzcyAoY2hlY2tfaWQgKGluZm8sIGluZGV4LCB0YWdfdGFyZ2V0cywKKyAgICAgICAgICAgIHNpemVvZiAodGFnX3RhcmdldHMpLCAmbGVuKSk7CisKKyAgICBtdXN0X2NoZWNrX3RhZyA9IEZBTFNFOworICAgIGNoZWNrX2lkX3JlYWRfaW50IChpbmZvLCBpbmRleCwgdGFnX3RhcmdldF90eXBlX3ZhbHVlLAorICAgICAgICBzaXplb2YgKHRhZ190YXJnZXRfdHlwZV92YWx1ZSksICZ2YWx1ZSk7CisKKyAgICBpZiAoY2hlY2tfaWQgKGluZm8sIGluZGV4LCB0YWdfdGFyZ2V0X3R5cGUsIHNpemVvZiAodGFnX3RhcmdldF90eXBlKSwgJmxlbikpIHsKKyAgICAgICppbmRleCArPSBsZW47CisgICAgfQorCisgICAgaWYgKGNoZWNrX2lkX3JlYWRfaW50IChpbmZvLCBpbmRleCwgdGFnX2NoYXB0ZXJfdWlkLAorICAgICAgICAgICAgc2l6ZW9mICh0YWdfY2hhcHRlcl91aWQpLCAmdWlkKSkgeworICAgICAgbXVzdF9jaGVja190YWcgPSBUUlVFOworICAgIH0gZWxzZSBpZiAoY2hlY2tfaWRfcmVhZF9pbnQgKGluZm8sIGluZGV4LCB0YWdfZWRpdGlvbl91aWQsCisgICAgICAgICAgICBzaXplb2YgKHRhZ19lZGl0aW9uX3VpZCksICZ1aWQpKSB7CisgICAgICBtdXN0X2NoZWNrX3RhZyA9IFRSVUU7CisgICAgfQorCisgICAgaWYgKG11c3RfY2hlY2tfdGFnKSB7CisgICAgICBmYWlsX3VubGVzcyAoY2hlY2tfaWQgKGluZm8sIGluZGV4LCBzaW1wbGVfdGFnLAorICAgICAgICAgICAgICBzaXplb2YgKHNpbXBsZV90YWcpLCAmbGVuKSk7CisKKyAgICAgIGZhaWxfdW5sZXNzIChjaGVja19pZCAoaW5mbywgaW5kZXgsIHRhZ19uYW1lLCBzaXplb2YgKHRhZ19uYW1lKSwgJmxlbikpOworICAgICAgdGFnX25hbWVfc3RyID0gZ19zdHJuZHVwICgoZ2NoYXIgKikgaW5mby0+ZGF0YSArICppbmRleCwgbGVuKTsKKyAgICAgICppbmRleCArPSBsZW47CisKKyAgICAgIGZhaWxfdW5sZXNzIChjaGVja19pZCAoaW5mbywgaW5kZXgsIHRhZ19zdHJpbmcsIHNpemVvZiAodGFnX3N0cmluZyksCisgICAgICAgICAgICAgICZsZW4pKTsKKyAgICAgIHRhZ19zdHJpbmdfc3RyID0gZ19zdHJuZHVwICgoZ2NoYXIgKikgaW5mby0+ZGF0YSArICppbmRleCwgbGVuKTsKKyAgICAgICppbmRleCArPSBsZW47CisKKyAgICAgIGZpbmRfYW5kX2NoZWNrX3RhZ3MgKHJlZl90b2MsIGludGVybmFsX3RvYywgaW5mbywgdWlkLAorICAgICAgICAgIHRhZ19uYW1lX3N0ciwgdGFnX3N0cmluZ19zdHIpOworCisgICAgICBnX2ZyZWUgKHRhZ19uYW1lX3N0cik7CisgICAgICBnX2ZyZWUgKHRhZ19zdHJpbmdfc3RyKTsKKyAgICB9CisKKyAgICAqaW5kZXggPSBuZXh0X3RhZzsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorY2hlY2tfc2VnbWVudCAoR3N0VG9jICogcmVmX3RvYywgR3N0VG9jICogaW50ZXJuYWxfdG9jLAorICAgIEdzdE1hcEluZm8gKiBpbmZvLCBnc2l6ZSAqIGluZGV4KQoreworICBndWludDggbWF0cm9za2Ffc2VnbWVudFtdID0geyAweDE4LCAweDUzLCAweDgwLCAweDY3IH07CisgIGd1aW50OCBtYXRyb3NrYV9zZWVrX2lkX2NoYXB0ZXJzW10gPSB7IDB4NTMsIDB4YWIsIDB4ODQsCisgICAgMHgxMCwgMHg0MywgMHhBNywgMHg3MAorICB9OworICBndWludDggbWF0cm9za2Ffc2Vla19pZF90YWdzW10gPSB7IDB4NTMsIDB4YWIsIDB4ODQsCisgICAgMHgxMiwgMHg1NCwgMHhjMywgMHg2NworICB9OworICBndWludDggbWF0cm9za2Ffc2Vla19wb3NbXSA9IHsgMHg1MywgMHhhYyB9OworICBndWludDggbWF0cm9za2FfY2hhcHRlcnNbXSA9IHsgMHgxMCwgMHg0MywgMHhBNywgMHg3MCB9OworCisgIGd1aW50NjQgbGVuLCB2YWx1ZSwgc2VnbWVudF9vZmZzZXQsIGNoYXB0ZXJzX29mZnNldCwgdGFnc19vZmZzZXQ7CisgIGdib29sZWFuIGZvdW5kX2NoYXB0ZXJzX2RlY2xhcmF0aW9uID0gRkFMU0UsIGZvdW5kX3RhZ3NfZGVjbGFyYXRpb24gPSBGQUxTRTsKKworICAvKiBTZWdtZW50ICovCisgIGZhaWxfdW5sZXNzIChpbmZvLT5zaXplID4gc2l6ZW9mIChtYXRyb3NrYV9zZWdtZW50KSk7CisgIGZhaWxfdW5sZXNzIChjaGVja19pZCAoaW5mbywgaW5kZXgsIG1hdHJvc2thX3NlZ21lbnQsCisgICAgICAgICAgc2l6ZW9mIChtYXRyb3NrYV9zZWdtZW50KSwgJmxlbikpOworCisgIHNlZ21lbnRfb2Zmc2V0ID0gKmluZGV4OworCisgIC8qIFNlYXJjaCBjaGFwdGVyIGRlY2xhcmF0aW9uIGluIHNlZWsgaGVhZCAqLworICBmb3IgKDsgKmluZGV4IDwgbGVuIC0gc2l6ZW9mIChtYXRyb3NrYV9zZWVrX2lkX2NoYXB0ZXJzKTsgKysoKmluZGV4KSkgeworICAgIGlmIChtZW1jbXAgKGluZm8tPmRhdGEgKyAqaW5kZXgsIG1hdHJvc2thX3NlZWtfaWRfY2hhcHRlcnMsCisgICAgICAgICAgICBzaXplb2YgKG1hdHJvc2thX3NlZWtfaWRfY2hhcHRlcnMpKSA9PSAwKSB7CisgICAgICAqaW5kZXggKz0gc2l6ZW9mIChtYXRyb3NrYV9zZWVrX2lkX2NoYXB0ZXJzKTsKKworICAgICAgaWYgKGNoZWNrX2lkX3JlYWRfaW50IChpbmZvLCBpbmRleCwgbWF0cm9za2Ffc2Vla19wb3MsCisgICAgICAgICAgICAgIHNpemVvZiAobWF0cm9za2Ffc2Vla19wb3MpLCAmdmFsdWUpKSB7CisgICAgICAgIC8qIGZvdW5kIGNoYXB0ZXIgZGVjbGFyYXRpb24gKi8KKyAgICAgICAgZm91bmRfY2hhcHRlcnNfZGVjbGFyYXRpb24gPSBUUlVFOworICAgICAgICBjaGFwdGVyc19vZmZzZXQgPSBzZWdtZW50X29mZnNldCArIHZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmYWlsX3VubGVzcyAoZm91bmRfY2hhcHRlcnNfZGVjbGFyYXRpb24pOworCisgICppbmRleCA9IGNoYXB0ZXJzX29mZnNldDsKKyAgaWYgKGNoZWNrX2lkIChpbmZvLCBpbmRleCwgbWF0cm9za2FfY2hhcHRlcnMsCisgICAgICAgICAgc2l6ZW9mIChtYXRyb3NrYV9jaGFwdGVycyksICZsZW4pKSB7CisgICAgY2hlY2tfdG9jIChyZWZfdG9jLCBpbnRlcm5hbF90b2MsIGluZm8sIGluZGV4KTsKKyAgfQorCisgIC8qIFNlYXJjaCB0YWdzIGRlY2xhcmF0aW9uIGluIHNlZWsgaGVhZCAqLworICBmb3IgKCppbmRleCA9IHNlZ21lbnRfb2Zmc2V0OyAqaW5kZXggPCBsZW4gLSBzaXplb2YgKG1hdHJvc2thX3NlZWtfaWRfdGFncyk7CisgICAgICArKygqaW5kZXgpKSB7CisgICAgaWYgKG1lbWNtcCAoaW5mby0+ZGF0YSArICppbmRleCwgbWF0cm9za2Ffc2Vla19pZF90YWdzLAorICAgICAgICAgICAgc2l6ZW9mIChtYXRyb3NrYV9zZWVrX2lkX3RhZ3MpKSA9PSAwKSB7CisgICAgICAqaW5kZXggKz0gc2l6ZW9mIChtYXRyb3NrYV9zZWVrX2lkX3RhZ3MpOworCisgICAgICBpZiAoY2hlY2tfaWRfcmVhZF9pbnQgKGluZm8sIGluZGV4LCBtYXRyb3NrYV9zZWVrX3BvcywKKyAgICAgICAgICAgICAgc2l6ZW9mIChtYXRyb3NrYV9zZWVrX3BvcyksICZ2YWx1ZSkpIHsKKyAgICAgICAgLyogZm91bmQgdGFncyBkZWNsYXJhdGlvbiAqLworICAgICAgICBmb3VuZF90YWdzX2RlY2xhcmF0aW9uID0gVFJVRTsKKyAgICAgICAgdGFnc19vZmZzZXQgPSBzZWdtZW50X29mZnNldCArIHZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmYWlsX3VubGVzcyAoZm91bmRfdGFnc19kZWNsYXJhdGlvbik7CisKKyAgKmluZGV4ID0gdGFnc19vZmZzZXQ7CisgIGNoZWNrX3RhZ3MgKHJlZl90b2MsIGludGVybmFsX3RvYywgaW5mbywgaW5kZXgpOworfQorCitzdGF0aWMgdm9pZAordGVzdF90b2MgKGdib29sZWFuIHdpdGhfZWRpdGlvbikKK3sKKyAgR3N0SGFybmVzcyAqaDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlciwgKm1lcmdlZF9idWZmZXI7CisgIEdzdE1hcEluZm8gaW5mbzsKKyAgZ3VpbnQ2NCBsZW47CisgIGdzaXplIGluZGV4OworICBHc3RUb2NTZXR0ZXIgKnRvY19zZXR0ZXI7CisgIEdzdFRvYyAqdGVzdF90b2MsICpyZWZfdG9jLCAqaW50ZXJuYWxfdG9jOworCisgIGd1aW50OCBlYm1sX2hlYWRlcltdID0geyAweDFhLCAweDQ1LCAweGRmLCAweGEzIH07CisKKyAgaCA9IHNldHVwX21hdHJvc2thbXV4X2hhcm5lc3MgKEFDM19DQVBTX1NUUklORyk7CisKKyAgLyogTWFrZSBlbGVtZW50IHNlZWthYmxlICovCisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChoLT5zaW5rcGFkLCBzZWVrYWJsZV9zaW5rcGFkX3F1ZXJ5KTsKKworICB0b2Nfc2V0dGVyID0gR1NUX1RPQ19TRVRURVIgKGgtPmVsZW1lbnQpOworICBmYWlsX3VubGVzcyAodG9jX3NldHRlciAhPSBOVUxMKTsKKworICBpZiAod2l0aF9lZGl0aW9uKSB7CisgICAgdGVzdF90b2MgPSBuZXdfcmVmZXJlbmNlX3RvYyAoKTsKKyAgfSBlbHNlIHsKKyAgICB0ZXN0X3RvYyA9IG5ld19ub19lZGl0aW9uX3RvYyAoKTsKKyAgfQorICBnc3RfdG9jX3NldHRlcl9zZXRfdG9jICh0b2Nfc2V0dGVyLCB0ZXN0X3RvYyk7CisgIGdzdF90b2NfdW5yZWYgKHRlc3RfdG9jKTsKKworICBpbmJ1ZmZlciA9IGdzdF9oYXJuZXNzX2NyZWF0ZV9idWZmZXIgKGgsIDEpOworICBnc3RfYnVmZmVyX21lbXNldCAoaW5idWZmZXIsIDAsIDAsIDEpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAoaW5idWZmZXIpID0gMSAqIEdTVF9NU0VDT05EOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgaW5idWZmZXIpKTsKKworICAvKiBzZW5kIGVvcyB0byBlbnN1cmUgZXZlcnl0aGluZyBpcyB3cml0dGVuICovCisgIGZhaWxfdW5sZXNzIChnc3RfaGFybmVzc19wdXNoX2V2ZW50IChoLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworICBBU1NFUlRfTUlOSV9PQkpFQ1RfUkVGQ09VTlQgKHRlc3RfdG9jLCAidGVzdF90b2MiLCAxKTsKKworICBvdXRidWZmZXIgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgZmFpbF91bmxlc3MgKG91dGJ1ZmZlciAhPSBOVUxMKTsKKworICAvKiBNZXJnZSBidWZmZXJzICovCisgIG1lcmdlZF9idWZmZXIgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgd2hpbGUgKG91dGJ1ZmZlciAhPSBOVUxMKSB7CisgICAgaWYgKG91dGJ1ZmZlci0+b2Zmc2V0ID09IGdzdF9idWZmZXJfZ2V0X3NpemUgKG1lcmdlZF9idWZmZXIpKSB7CisgICAgICBnc3RfYnVmZmVyX2FwcGVuZF9tZW1vcnkgKG1lcmdlZF9idWZmZXIsCisgICAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfYWxsX21lbW9yeSAob3V0YnVmZmVyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmaW5mbywgR1NUX01BUF9SRUFEKSk7CisgICAgICBnc3RfYnVmZmVyX2ZpbGwgKG1lcmdlZF9idWZmZXIsIG91dGJ1ZmZlci0+b2Zmc2V0LCBpbmZvLmRhdGEsIGluZm8uc2l6ZSk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZpbmZvKTsKKyAgICB9CisKKyAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWZmZXIpOworICAgIG91dGJ1ZmZlciA9IGdzdF9oYXJuZXNzX3RyeV9wdWxsIChoKTsKKyAgfQorCisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21hcCAobWVyZ2VkX2J1ZmZlciwgJmluZm8sIEdTVF9NQVBfUkVBRCkpOworICBpbmRleCA9IDA7CisKKyAgZmFpbF91bmxlc3MgKGNoZWNrX2lkICgmaW5mbywgJmluZGV4LCBlYm1sX2hlYWRlciwKKyAgICAgICAgICBzaXplb2YgKGVibWxfaGVhZGVyKSwgJmxlbikpOworICAvKiBza2lwIGhlYWRlciAqLworICBpbmRleCArPSBsZW47CisKKyAgcmVmX3RvYyA9IG5ld19yZWZlcmVuY2VfdG9jICgpOworICBpbnRlcm5hbF90b2MgPSBnc3RfdG9jX25ldyAoR1NUX1RPQ19TQ09QRV9HTE9CQUwpOworICBjaGVja19zZWdtZW50IChyZWZfdG9jLCBpbnRlcm5hbF90b2MsICZpbmZvLCAmaW5kZXgpOworICBnc3RfdG9jX3VucmVmIChpbnRlcm5hbF90b2MpOworICBnc3RfdG9jX3VucmVmIChyZWZfdG9jKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChtZXJnZWRfYnVmZmVyLCAmaW5mbyk7CisgIGdzdF9idWZmZXJfdW5yZWYgKG1lcmdlZF9idWZmZXIpOworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3RvY193aXRoX2VkaXRpb24pCit7CisgIHRlc3RfdG9jIChUUlVFKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF90b2Nfd2l0aG91dF9lZGl0aW9uKQoreworICB0ZXN0X3RvYyAoRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCittYXRyb3NrYW11eF9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJtYXRyb3NrYW11eCIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9lYm1sX2hlYWRlcl92MSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9lYm1sX2hlYWRlcl92Mik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF92b3JiaXNfaGVhZGVyKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2Jsb2NrX2dyb3VwX3YxKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2Jsb2NrX2dyb3VwX3YyKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcmVzZXQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbGlua193ZWJtbXV4X3dlYm1fc2luayk7CisgIHRjYXNlX2FkZF9sb29wX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3RpbWVjb2Rlc2NhbGUsCisgICAgICAwLCBHX05fRUxFTUVOVFMgKHRpbWVjb2Rlc2NhbGVzKSk7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3RvY193aXRoX2VkaXRpb24pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdG9jX3dpdGhvdXRfZWRpdGlvbik7CisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAobWF0cm9za2FtdXgpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvbWF0cm9za2FwYXJzZS5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvbWF0cm9za2FwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZWY4ZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYXBhcnNlLmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qIEdTdHJlYW1lciB1bml0IHRlc3RzIGZvciBtYXRyb3NrYXBhcnNlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitzdGF0aWMgdm9pZAorcnVuX2NoZWNrX2Zvcl9maWxlIChjb25zdCBnY2hhciAqIGZpbGVfbmFtZSwgZ2Jvb2xlYW4gcHVzaF9tb2RlKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiBzdGF0ZV9yZXQ7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKyAgR3N0RWxlbWVudCAqc3JjLCAqc2VwLCAqc2luaywgKm1hdHJvc2thcGFyc2UsICpwaXBlbGluZTsKKyAgR3N0QnVzICpidXM7CisgIGdjaGFyICpwYXRoOworCisgIHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIGZhaWxfdW5sZXNzIChwaXBlbGluZSAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSBwaXBlbGluZSEiKTsKKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChwaXBlbGluZSk7CisKKyAgc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmlsZXNyYyIsICJmaWxlc3JjIik7CisgIGZhaWxfdW5sZXNzIChzcmMgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgJ2ZpbGVzcmMnIGVsZW1lbnQhIik7CisKKyAgaWYgKHB1c2hfbW9kZSkgeworICAgIHNlcCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInF1ZXVlIiwgInF1ZXVlIik7CisgICAgZmFpbF91bmxlc3MgKHNlcCAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSAncXVldWUnIGVsZW1lbnQiKTsKKyAgfSBlbHNlIHsKKyAgICBzZXAgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJpZGVudGl0eSIsICJpZGVudGl0eSIpOworICAgIGZhaWxfdW5sZXNzIChzZXAgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgJ2lkZW50aXR5JyBlbGVtZW50Iik7CisgIH0KKworICBtYXRyb3NrYXBhcnNlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgibWF0cm9za2FwYXJzZSIsICJtYXRyb3NrYXBhcnNlIik7CisgIGZhaWxfdW5sZXNzIChtYXRyb3NrYXBhcnNlICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIG1hdHJvc2thcGFyc2UgZWxlbWVudCIpOworCisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsICJmYWtlc2luayIpOworICBmYWlsX3VubGVzcyAoc2luayAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSAnZmFrZXNpbmsnIGVsZW1lbnQhIik7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBzcmMsIHNlcCwgbWF0cm9za2FwYXJzZSwgc2luaywgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmsgKHNyYywgc2VwKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rIChzZXAsIG1hdHJvc2thcGFyc2UpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmsgKG1hdHJvc2thcGFyc2UsIHNpbmspKTsKKworICBwYXRoID0gZ19idWlsZF9maWxlbmFtZSAoR1NUX1RFU1RfRklMRVNfUEFUSCwgZmlsZV9uYW1lLCBOVUxMKTsKKyAgR1NUX0xPRyAoInJlYWRpbmcgZmlsZSAnJXMnIiwgcGF0aCk7CisgIGdfb2JqZWN0X3NldCAoc3JjLCAibG9jYXRpb24iLCBwYXRoLCBOVUxMKTsKKworICBzdGF0ZV9yZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgZmFpbF91bmxlc3MgKHN0YXRlX3JldCAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIGlmIChzdGF0ZV9yZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9BU1lOQykgeworICAgIEdTVF9MT0cgKCJ3YWl0aW5nIGZvciBwaXBlbGluZSB0byByZWFjaCBQQVVTRUQgc3RhdGUiKTsKKyAgICBzdGF0ZV9yZXQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKHBpcGVsaW5lLCBOVUxMLCBOVUxMLCAtMSk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoc3RhdGVfcmV0LCBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworICB9CisKKyAgR1NUX0xPRyAoIlBBVVNFRCwgbGV0J3MgcGxheSBhIGxpdHRsZS4uIik7CisgIHN0YXRlX3JldCA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgZmFpbF91bmxlc3MgKHN0YXRlX3JldCAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIG1zZyA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9FT1MgfCBHU1RfTUVTU0FHRV9FUlJPUiwgLTEpOworICBpZiAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSA9PSBHU1RfTUVTU0FHRV9FUlJPUikgeworICAgIEdFcnJvciAqZXJyOworICAgIGdjaGFyICpkYmc7CisKKyAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobXNnLCAmZXJyLCAmZGJnKTsKKyAgICBnc3Rfb2JqZWN0X2RlZmF1bHRfZXJyb3IgKEdTVF9NRVNTQUdFX1NSQyAobXNnKSwgZXJyLCBkYmcpOworICAgIGdfZXJyb3IgKCIlcyAoJXMpIiwgZXJyLT5tZXNzYWdlLCBkYmcpOworICAgIGdfZXJyb3JfZnJlZSAoZXJyKTsKKyAgICBnX2ZyZWUgKGRiZyk7CisgIH0KKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpLAorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworCisgIGdfZnJlZSAocGF0aCk7Cit9CisKKyNpZiAwCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV9maWxlX3B1bGwpCit7CisgIHJ1bl9jaGVja19mb3JfZmlsZSAoInBpbmtub2lzZS12b3JiaXMubWt2IiwgVFJVRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKyNlbmRpZgorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV9maWxlX3B1c2gpCit7CisgIHJ1bl9jaGVja19mb3JfZmlsZSAoInBpbmtub2lzZS12b3JiaXMubWt2IiwgRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCittYXRyb3NrYXBhcnNlX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoIm1hdHJvc2thcGFyc2UiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworI2lmIDAKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX2ZpbGVfcHVsbCk7CisjZW5kaWYKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX2ZpbGVfcHVzaCk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChtYXRyb3NrYXBhcnNlKQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvbXBlZ2F1ZGlvcGFyc2UuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL21wZWdhdWRpb3BhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0NGU5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL21wZWdhdWRpb3BhcnNlLmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIGFhY3BhcnNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnRhY3Q6IFN0ZWZhbiBLb3N0IDxzdGVmYW4ua29zdEBub2tpYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgInBhcnNlci5oIgorCisjZGVmaW5lIFNSQ19DQVBTX1RNUEwgICAiYXVkaW8vbXBlZywgcGFyc2VkPShib29sZWFuKWZhbHNlLCBtcGVndmVyc2lvbj0oaW50KTEiCisjZGVmaW5lIFNJTktfQ0FQU19UTVBMICAiYXVkaW8vbXBlZywgcGFyc2VkPShib29sZWFuKXRydWUsIG1wZWd2ZXJzaW9uPShpbnQpMSIKKworR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChTSU5LX0NBUFNfVE1QTCkKKyAgICApOworCitHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFNSQ19DQVBTX1RNUEwpCisgICAgKTsKKworLyogc29tZSBkYXRhICovCitzdGF0aWMgZ3VpbnQ4IG1wM19mcmFtZVszODRdID0geworICAweGZmLCAweGZiLCAweDk0LCAweGM0LCAweGZmLCAweDgzLCAweGMwLCAweDAwLAorICAweDAxLCAweGE0LCAweDAwLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDAwLAorICAweDM0LCAweDgwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorfTsKKworc3RhdGljIGd1aW50OCBnYXJiYWdlX2ZyYW1lW10gPSB7CisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYKK307CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2Vfbm9ybWFsKQoreworICBnc3RfcGFyc2VyX3Rlc3Rfbm9ybWFsIChtcDNfZnJhbWUsIHNpemVvZiAobXAzX2ZyYW1lKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV9kcmFpbl9zaW5nbGUpCit7CisgIGdzdF9wYXJzZXJfdGVzdF9kcmFpbl9zaW5nbGUgKG1wM19mcmFtZSwgc2l6ZW9mIChtcDNfZnJhbWUpKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX2RyYWluX2dhcmJhZ2UpCit7CisgIGdzdF9wYXJzZXJfdGVzdF9kcmFpbl9nYXJiYWdlIChtcDNfZnJhbWUsIHNpemVvZiAobXAzX2ZyYW1lKSwKKyAgICAgIGdhcmJhZ2VfZnJhbWUsIHNpemVvZiAoZ2FyYmFnZV9mcmFtZSkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2Vfc3BsaXQpCit7CisgIGdzdF9wYXJzZXJfdGVzdF9zcGxpdCAobXAzX2ZyYW1lLCBzaXplb2YgKG1wM19mcmFtZSkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2Vfc2tpcF9nYXJiYWdlKQoreworICBnc3RfcGFyc2VyX3Rlc3Rfc2tpcF9nYXJiYWdlIChtcDNfZnJhbWUsIHNpemVvZiAobXAzX2ZyYW1lKSwKKyAgICAgIGdhcmJhZ2VfZnJhbWUsIHNpemVvZiAoZ2FyYmFnZV9mcmFtZSkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworI2RlZmluZSBzdHJ1Y3R1cmVfZ2V0X2ludChzLGYpIFwKKyAgICAoZ192YWx1ZV9nZXRfaW50KGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlKHMsZikpKQorI2RlZmluZSBmYWlsX3VubGVzc19zdHJ1Y3R1cmVfZmllbGRfaW50X2VxdWFscyhzLGZpZWxkLG51bSkgXAorICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHN0cnVjdHVyZV9nZXRfaW50KHMsZmllbGQpLCBudW0pCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX2RldGVjdF9zdHJlYW0pCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBjYXBzID0gZ3N0X3BhcnNlcl90ZXN0X2dldF9vdXRwdXRfY2FwcyAobXAzX2ZyYW1lLCBzaXplb2YgKG1wM19mcmFtZSksIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChjYXBzICE9IE5VTEwpOworCisgIEdTVF9MT0cgKCJtcGVnYXVkaW8gb3V0cHV0IGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgImF1ZGlvL21wZWciKSk7CisgIGZhaWxfdW5sZXNzX3N0cnVjdHVyZV9maWVsZF9pbnRfZXF1YWxzIChzLCAibXBlZ3ZlcnNpb24iLCAxKTsKKyAgZmFpbF91bmxlc3Nfc3RydWN0dXJlX2ZpZWxkX2ludF9lcXVhbHMgKHMsICJsYXllciIsIDMpOworICBmYWlsX3VubGVzc19zdHJ1Y3R1cmVfZmllbGRfaW50X2VxdWFscyAocywgImNoYW5uZWxzIiwgMSk7CisgIGZhaWxfdW5sZXNzX3N0cnVjdHVyZV9maWVsZF9pbnRfZXF1YWxzIChzLCAicmF0ZSIsIDQ4MDAwKTsKKworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitzdGF0aWMgU3VpdGUgKgorbXBlZ2F1ZGlvcGFyc2Vfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgibXBlZ2F1ZGlvcGFyc2UiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisKKyAgLyogaW5pdCB0ZXN0IGNvbnRleHQgKi8KKyAgY3R4X2ZhY3RvcnkgPSAibXBlZ2F1ZGlvcGFyc2UiOworICBjdHhfc2lua190ZW1wbGF0ZSA9ICZzaW5rdGVtcGxhdGU7CisgIGN0eF9zcmNfdGVtcGxhdGUgPSAmc3JjdGVtcGxhdGU7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9ub3JtYWwpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2VfZHJhaW5fc2luZ2xlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX2RyYWluX2dhcmJhZ2UpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2Vfc3BsaXQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2Vfc2tpcF9nYXJiYWdlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX2RldGVjdF9zdHJlYW0pOworCisgIHJldHVybiBzOworfQorCisKKy8qCisgKiBUT0RPOgorICogICAtIEJvdGggcHVzaC0gYW5kIHB1bGwtbW9kZXMgbmVlZCB0byBiZSB0ZXN0ZWQKKyAqICAgICAgKiBQdWxsLW1vZGUgJiBFT1MKKyAqLworR1NUX0NIRUNLX01BSU4gKG1wZWdhdWRpb3BhcnNlKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL21wZzEyM2F1ZGlvZGVjLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9tcGcxMjNhdWRpb2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZDZlNzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9tcGcxMjNhdWRpb2RlYy5jCkBAIC0wLDAgKzEsNTM0IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIG1wZzEyM2F1ZGlvZGVjCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEyIENhcmxvcyBSYWZhZWwgR2lhbmkgPGR2QHBzZXVkb3Rlcm1pbmFsLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgPGdzdC9mZnQvZ3N0ZmZ0Lmg+CisjaW5jbHVkZSA8Z3N0L2ZmdC9nc3RmZnRzMTYuaD4KKyNpbmNsdWRlIDxnc3QvZmZ0L2dzdGZmdHMzMi5oPgorI2luY2x1ZGUgPGdzdC9mZnQvZ3N0ZmZ0ZjMyLmg+CisjaW5jbHVkZSA8Z3N0L2ZmdC9nc3RmZnRmNjQuaD4KKworI2luY2x1ZGUgPGdzdC9hcHAvZ3N0YXBwc2luay5oPgorCisvKiBGb3IgZWFzZSBvZiBwcm9ncmFtbWluZyB3ZSB1c2UgZ2xvYmFscyB0byBrZWVwIHJlZnMgZm9yIG91ciBmbG9hdGluZworICogc3JjIGFuZCBzaW5rIHBhZHMgd2UgY3JlYXRlOyBvdGhlcndpc2Ugd2UgYWx3YXlzIGhhdmUgdG8gZG8gZ2V0X3BhZCwKKyAqIGdldF9wZWVyLCBhbmQgdGhlbiByZW1vdmUgcmVmZXJlbmNlcyBpbiBldmVyeSB0ZXN0IGZ1bmN0aW9uICovCitzdGF0aWMgR3N0UGFkICpteXNyY3BhZCwgKm15c2lua3BhZDsKKworCisjZGVmaW5lIE1QMl9TVFJFQU1fRklMRU5BTUUgInN0cmVhbS5tcDIiCisjZGVmaW5lIE1QM19DQlJfU1RSRUFNX0ZJTEVOQU1FICJjYnJfc3RyZWFtLm1wMyIKKyNkZWZpbmUgTVAzX1ZCUl9TVFJFQU1fRklMRU5BTUUgInZicl9zdHJlYW0ubXAzIgorCisKKy8qIG1wZWcgMSBsYXllciAyIHN0cmVhbSBjcmVhdGVkIHdpdGg6CisgKiBnc3QtbGF1bmNoLTEuMCAtdiBhdWRpb3Rlc3RzcmMgd2F2ZT1zaW5lIGZyZXE9NDQwIHZvbHVtZT0xIG51bS1idWZmZXJzPTMyICEgXAorICogICAiYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVMxNkxFLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KTQ0MTAwLCBjaGFubmVscz0oaW50KTEiICEgXAorICogICBhdmVuY19tcDIgYml0cmF0ZT0zMjAwMCAhIHRlZSBuYW1lPXQgXAorICogICB0LiAhIHF1ZXVlICEgZmFrZXNpbmsgc2lsZW50PWZhbHNlIFwKKyAqICAgdC4gISBxdWV1ZSAhIGZpbGVzaW5rIGxvY2F0aW9uPXRlc3QubXAyCisgKgorICogbXBlZyAxIGxheWVyIDMgQ0JSIHN0cmVhbSBjcmVhdGVkIHdpdGg6CisgKiBnc3QtbGF1bmNoLTEuMCAtdiBhdWRpb3Rlc3RzcmMgd2F2ZT1zaW5lIGZyZXE9NDQwIHZvbHVtZT0xIG51bS1idWZmZXJzPTMyICEgXAorICogICAiYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVMxNkxFLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KTQ0MTAwLCBjaGFubmVscz0oaW50KTEiICEgXAorICogICBsYW1lbXAzZW5jIGVuY29kaW5nLWVuZ2luZS1xdWFsaXR5PWhpZ2ggY2JyPXRydWUgdGFyZ2V0PWJpdHJhdGUgYml0cmF0ZT0zMiAhIFwKKyAqICAgImF1ZGlvL21wZWcsIHJhdGU9KGludCk0NDEwMCwgY2hhbm5lbHM9KGludCkxIiAhIHRlZSBuYW1lPXQgXAorICogICB0LiAhIHF1ZXVlICEgZmFrZXNpbmsgc2lsZW50PWZhbHNlIFwKKyAqICAgdC4gISBxdWV1ZSAhIGZpbGVzaW5rIGxvY2F0aW9uPXRlc3QubXAzCisgKgorICogbXBlZyAxIGxheWVyIDMgVkJSIHN0cmVhbSBjcmVhdGVkIHdpdGg6CisgKiBnc3QtbGF1bmNoLTEuMCAtdiBhdWRpb3Rlc3RzcmMgd2F2ZT1zaW5lIGZyZXE9NDQwIHZvbHVtZT0xIG51bS1idWZmZXJzPTMyICEgXAorICogICAiYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVMxNkxFLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KTQ0MTAwLCBjaGFubmVscz0oaW50KTEiICEgXAorICogICBsYW1lbXAzZW5jIGVuY29kaW5nLWVuZ2luZS1xdWFsaXR5PWhpZ2ggY2JyPWZhbHNlIHRhcmdldD1xdWFsaXR5IHF1YWxpdHk9NyAhIFwKKyAqICAgImF1ZGlvL21wZWcsIHJhdGU9KGludCk0NDEwMCwgY2hhbm5lbHM9KGludCkxIiAhIHRlZSBuYW1lPXQgXAorICogICB0LiAhIHF1ZXVlICEgZmFrZXNpbmsgc2lsZW50PWZhbHNlIFwKKyAqICAgdC4gISBxdWV1ZSAhIGZpbGVzaW5rIGxvY2F0aW9uPXRlc3QubXAzCisgKi8KKworCisvKiBGRlQgdGVzdCBoZWxwZXJzIHRha2VuIGZyb20gZ3N0LXBsdWdpbnMtYmFzZSB0ZXN0cy9jaGVjay9hdWRpb3Jlc2FtcGxlLmMgKi8KKworI2RlZmluZSBGRlRfSEVMUEVSUyh0eXBlLGZmdHRhZyxmZnR0YWcyLHNjYWxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGdkb3VibGUgbWFnbml0dWRlIyNmZnR0YWcgKGNvbnN0IEdzdEZGVCMjZmZ0dGFnIyNDb21wbGV4ICpjKSAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnZG91YmxlIG1hZyA9IChnZG91YmxlKSBjLT5yICogKGdkb3VibGUpIGMtPnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtYWcgKz0gKGdkb3VibGUpIGMtPmkgKiAoZ2RvdWJsZSkgYy0+aTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtYWcgLz0gc2NhbGUgKiBzY2FsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtYWcgPSAxMC4wICogbG9nMTAgKG1hZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gbWFnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGdkb3VibGUgZmluZF9tYWluX2ZyZXF1ZW5jeV9zcG90XyMjZmZ0dGFnICggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IEdzdEZGVCMjZmZ0dGFnIyNDb21wbGV4ICp2LCBpbnQgZWxlbWVudHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnZG91YmxlIG1heG1hZyA9IC05OTk5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgbWF4aWR4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGk9MDsgaTxlbGVtZW50czsgKytpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdkb3VibGUgbWFnID0gbWFnbml0dWRlIyNmZnR0YWcgKHYraSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChtYWcgPiBtYXhtYWcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbWF4bWFnID0gbWFnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbWF4aWR4ID0gaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gbWF4aWR4IC8gKGdkb3VibGUpIGVsZW1lbnRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGdib29sZWFuIGlzX3plcm9fZXhjZXB0XyMjZmZ0dGFnIChjb25zdCBHc3RGRlQjI2ZmdHRhZyMjQ29tcGxleCAqdiwgICAgXAorICAgIGludCBlbGVtZW50cywgZ2RvdWJsZSBzcG90KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGk9MDsgaTxlbGVtZW50czsgKytpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdkb3VibGUgcG9zID0gaSAvIChnZG91YmxlKSBlbGVtZW50czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdkb3VibGUgbWFnID0gbWFnbml0dWRlIyNmZnR0YWcgKHYraSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmYWJzIChwb3MgLSBzcG90KSA+IDAuMDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKG1hZyA+IC0zNS4wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHU1RfTE9HKCJGb3VuZCBtYWduaXR1ZGUgYXQgJWYgOiAlZiAocGVhayBhdCAlZilcbiIsIHBvcywgbWFnLCBzcG90KTsgXAorICAgICAgICByZXR1cm4gRkFMU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gVFJVRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgY2hlY2tfbWFpbl9mcmVxdWVuY3lfc3BvdF8jI2ZmdHRhZyAoR3N0QnVmZmVyICpidWZmZXIsIGdkb3VibGUgICAgXAorICAgIGV4cGVjdGVkX3Nwb3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHc3RNYXBJbmZvIG1hcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgbnVtX3NhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnZG91YmxlIGFjdHVhbF9zcG90OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHc3RGRlQjI2ZmdHRhZyAqY3R4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHc3RGRlQjI2ZmdHRhZyMjQ29tcGxleCAqZmZ0ZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBudW1fc2FtcGxlcyA9IG1hcC5zaXplIC8gc2l6ZW9mKHR5cGUpICYgfjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjdHggPSBnc3RfZmZ0XyMjZmZ0dGFnMiMjX25ldyAobnVtX3NhbXBsZXMsIEZBTFNFKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmZnRkYXRhID0gZ19uZXcgKEdzdEZGVCMjZmZ0dGFnIyNDb21wbGV4LCBudW1fc2FtcGxlcyAvIDIgKyAxKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnc3RfZmZ0XyMjZmZ0dGFnMiMjX3dpbmRvdyAoY3R4LCAodHlwZSopbWFwLmRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdTVF9GRlRfV0lORE9XX0hBTU1JTkcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnc3RfZmZ0XyMjZmZ0dGFnMiMjX2ZmdCAoY3R4LCAodHlwZSopbWFwLmRhdGEsIGZmdGRhdGEpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhY3R1YWxfc3BvdCA9IGZpbmRfbWFpbl9mcmVxdWVuY3lfc3BvdF8jI2ZmdHRhZyAoZmZ0ZGF0YSwgICAgICAgICAgICAgICAgICAgXAorICAgIG51bV9zYW1wbGVzIC8gMiArIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHU1RfTE9HICgiRXhwZWN0ZWQgc3BvdDogJS4zZiBhY3R1YWw6ICUuM2YgJWYiLCBleHBlY3RlZF9zcG90LCBhY3R1YWxfc3BvdCwgXAorICAgIGZhYnMgKGV4cGVjdGVkX3Nwb3QgLSBhY3R1YWxfc3BvdCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmYWlsX3VubGVzcyAoZmFicyAoZXhwZWN0ZWRfc3BvdCAtIGFjdHVhbF9zcG90KSA8IDAuMDUsICAgICAgICAgICAgICAgICAgICAgXAorICAgICJBY3R1YWwgbWFpbiBmcmVxdWVuY3kgc3BvdCBpcyB0b28gZmFyIGF3YXkgZnJvbSBleHBlY3RlZCBvbmUiKTsgICAgICAgICAgXAorICBmYWlsX3VubGVzcyAoaXNfemVyb19leGNlcHRfIyNmZnR0YWcgKGZmdGRhdGEsIG51bV9zYW1wbGVzIC8gMiArIDEsICAgICAgICAgXAorICAgIGFjdHVhbF9zcG90KSwgIk9uZSBzZWNvbmRhcnkgcGVhayBpbiBzcGVjdHJ1bSBleGNlZWRzIHRocmVzaG9sZCIpOyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnc3RfZmZ0XyMjZmZ0dGFnMiMjX2ZyZWUgKGN0eCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnX2ZyZWUgKGZmdGRhdGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorRkZUX0hFTFBFUlMgKGdpbnQzMiwgUzMyLCBzMzIsIDIxNDc0ODM2NDcuMCk7CisKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCBmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoUzMyKSkKKyAgICApOworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGxheWVyMl9zcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBsYXllcjNfc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKKworc3RhdGljIHZvaWQKK3NldHVwX2lucHV0X3BpcGVsaW5lIChnY2hhciBjb25zdCAqc3RyZWFtX2ZpbGVuYW1lLCBHc3RFbGVtZW50ICoqIHBpcGVsaW5lLAorICAgIEdzdEVsZW1lbnQgKiogYXBwc2luaykKK3sKKyAgR3N0RWxlbWVudCAqc291cmNlLCAqcGFyc2VyOworCisgICpwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKE5VTEwpOworICBzb3VyY2UgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmaWxlc3JjIiwgTlVMTCk7CisgIHBhcnNlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoIm1wZWdhdWRpb3BhcnNlIiwgTlVMTCk7CisgICphcHBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXBwc2luayIsIE5VTEwpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKCpwaXBlbGluZSksIHNvdXJjZSwgcGFyc2VyLCAqYXBwc2luaywgTlVMTCk7CisgIGdzdF9lbGVtZW50X2xpbmtfbWFueSAoc291cmNlLCBwYXJzZXIsICphcHBzaW5rLCBOVUxMKTsKKworICB7CisgICAgY2hhciAqZnVsbF9maWxlbmFtZSA9CisgICAgICAgIGdfYnVpbGRfZmlsZW5hbWUgKEdTVF9URVNUX0ZJTEVTX1BBVEgsIHN0cmVhbV9maWxlbmFtZSwgTlVMTCk7CisgICAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc291cmNlKSwgImxvY2F0aW9uIiwgZnVsbF9maWxlbmFtZSwgTlVMTCk7CisgICAgZ19mcmVlIChmdWxsX2ZpbGVuYW1lKTsKKyAgfQorCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoKnBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX2lucHV0X3BpcGVsaW5lIChHc3RFbGVtZW50ICogcGlwZWxpbmUpCit7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF9tcGVnMWxheWVyMmRlYyAodm9pZCkKK3sKKyAgR3N0RWxlbWVudCAqbXBnMTIzYXVkaW9kZWM7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgR1NUX0RFQlVHICgic2V0dXBfbXBlZzFsYXllcjJkZWMiKTsKKyAgbXBnMTIzYXVkaW9kZWMgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoIm1wZzEyM2F1ZGlvZGVjIik7CisgIG15c3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKG1wZzEyM2F1ZGlvZGVjLCAmbGF5ZXIyX3NyY3RlbXBsYXRlKTsKKyAgbXlzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChtcGcxMjNhdWRpb2RlYywgJnNpbmt0ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgLyogVGhpcyBpcyBuZWNlc3NhcnkgdG8gdHJpZ2dlciBhIHNldF9mb3JtYXQgY2FsbCBpbiB0aGUgZGVjb2RlcjsKKyAgICogZml4ZWQgY2FwcyBkb24ndCB0cmlnZ2VyIGl0ICovCisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8vbXBlZyIsCisgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAxLAorICAgICAgImxheWVyIiwgR19UWVBFX0lOVCwgMiwKKyAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgNDQxMDAsCisgICAgICAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAxLCAicGFyc2VkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgbXBnMTIzYXVkaW9kZWMsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICByZXR1cm4gbXBnMTIzYXVkaW9kZWM7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX21wZWcxbGF5ZXIzZGVjICh2b2lkKQoreworICBHc3RFbGVtZW50ICptcGcxMjNhdWRpb2RlYzsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBHU1RfREVCVUcgKCJzZXR1cF9tcGVnMWxheWVyM2RlYyIpOworICBtcGcxMjNhdWRpb2RlYyA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgibXBnMTIzYXVkaW9kZWMiKTsKKyAgbXlzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAobXBnMTIzYXVkaW9kZWMsICZsYXllcjNfc3JjdGVtcGxhdGUpOworICBteXNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKG1wZzEyM2F1ZGlvZGVjLCAmc2lua3RlbXBsYXRlKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICAvKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byB0cmlnZ2VyIGEgc2V0X2Zvcm1hdCBjYWxsIGluIHRoZSBkZWNvZGVyOworICAgKiBmaXhlZCBjYXBzIGRvbid0IHRyaWdnZXIgaXQgKi8KKyAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby9tcGVnIiwKKyAgICAgICJtcGVndmVyc2lvbiIsIEdfVFlQRV9JTlQsIDEsCisgICAgICAibGF5ZXIiLCBHX1RZUEVfSU5ULCAzLAorICAgICAgInJhdGUiLCBHX1RZUEVfSU5ULCA0NDEwMCwKKyAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDEsICJwYXJzZWQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBtcGcxMjNhdWRpb2RlYywgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIHJldHVybiBtcGcxMjNhdWRpb2RlYzsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfbXBnMTIzYXVkaW9kZWMgKEdzdEVsZW1lbnQgKiBtcGcxMjNhdWRpb2RlYykKK3sKKyAgR1NUX0RFQlVHICgiY2xlYW51cF9tcGVnMWxheWVyMmRlYyIpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKG1wZzEyM2F1ZGlvZGVjLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAobXBnMTIzYXVkaW9kZWMpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKG1wZzEyM2F1ZGlvZGVjKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKG1wZzEyM2F1ZGlvZGVjKTsKK30KKworc3RhdGljIHZvaWQKK3J1bl9kZWNvZGluZ190ZXN0IChHc3RFbGVtZW50ICogbXBnMTIzYXVkaW9kZWMsIGdjaGFyIGNvbnN0ICpmaWxlbmFtZSkKK3sKKyAgR3N0QnVzICpidXM7CisgIHVuc2lnbmVkIGludCBudW1faW5wdXRfYnVmZmVycywgbnVtX2RlY29kZWRfYnVmZmVyczsKKyAgZ2ludCBleHBlY3RlZF9zaXplOworICBHc3RDYXBzICpvdXRfY2FwcywgKmNhcHM7CisgIEdzdEF1ZGlvSW5mbyBhdWRpb2luZm87CisgIEdzdEVsZW1lbnQgKmlucHV0X3BpcGVsaW5lLCAqaW5wdXRfYXBwc2luazsKKyAgaW50IGk7CisgIEdzdEJ1ZmZlciAqb3V0YnVmZmVyOworCisgIC8qIDQ0MCBIeiA9IGZyZXF1ZW5jeSBvZiBzaW5lIHdhdmUgaW4gYXVkaW8gZGF0YQorICAgKiA0NDEwMCBIeiA9IHNhbXBsZSByYXRlCisgICAqICg0NDEwMCAvIDIpIEh6ID0gTnlxdWlzdCBmcmVxdWVuY3kgKi8KKyAgc3RhdGljIGRvdWJsZSBjb25zdCBleHBlY3RlZF9mcmVxdWVuY3lfc3BvdCA9IDQ0MC4wIC8gKDQ0MTAwLjAgLyAyLjApOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKG1wZzEyM2F1ZGlvZGVjLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworCisgIGdzdF9lbGVtZW50X3NldF9idXMgKG1wZzEyM2F1ZGlvZGVjLCBidXMpOworCisgIHNldHVwX2lucHV0X3BpcGVsaW5lIChmaWxlbmFtZSwgJmlucHV0X3BpcGVsaW5lLCAmaW5wdXRfYXBwc2luayk7CisKKyAgbnVtX2lucHV0X2J1ZmZlcnMgPSAwOworICB3aGlsZSAoVFJVRSkgeworICAgIEdzdFNhbXBsZSAqc2FtcGxlOworICAgIEdzdEJ1ZmZlciAqaW5wdXRfYnVmZmVyOworCisgICAgc2FtcGxlID0gZ3N0X2FwcF9zaW5rX3B1bGxfc2FtcGxlIChHU1RfQVBQX1NJTksgKGlucHV0X2FwcHNpbmspKTsKKyAgICBpZiAoc2FtcGxlID09IE5VTEwpCisgICAgICBicmVhazsKKworICAgIGZhaWxfdW5sZXNzIChHU1RfSVNfU0FNUExFIChzYW1wbGUpKTsKKworICAgIGlucHV0X2J1ZmZlciA9IGdzdF9zYW1wbGVfZ2V0X2J1ZmZlciAoc2FtcGxlKTsKKyAgICBmYWlsX2lmIChpbnB1dF9idWZmZXIgPT0gTlVMTCk7CisKKyAgICAvKiBUaGlzIGlzIGRvbmUgdG8gYmUgb24gdGhlIHNhZmUgc2lkZSAtIGRvY3Mgc2F5IGxpZmV0aW1lIG9mIHRoZSBpbnB1dCBidWZmZXIKKyAgICAgKiBkZXBlbmRzICpzb2xlbHkqIG9uIHRoZSBzYW1wbGUgKi8KKyAgICBpbnB1dF9idWZmZXIgPSBnc3RfYnVmZmVyX2NvcHkgKGlucHV0X2J1ZmZlcik7CisKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbnB1dF9idWZmZXIpLCBHU1RfRkxPV19PSyk7CisKKyAgICArK251bV9pbnB1dF9idWZmZXJzOworCisgICAgZ3N0X3NhbXBsZV91bnJlZiAoc2FtcGxlKTsKKyAgfQorCisgIG51bV9kZWNvZGVkX2J1ZmZlcnMgPSBnX2xpc3RfbGVuZ3RoIChidWZmZXJzKTsKKworICAvKiBjaGVjayBudW1iZXIgb2YgZGVjb2RlZCBidWZmZXJzICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG51bV9kZWNvZGVkX2J1ZmZlcnMsIG51bV9pbnB1dF9idWZmZXJzIC0gMik7CisKKyAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAobXlzaW5rcGFkKTsKKyAgR1NUX0xPRyAoIm91dHB1dCBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9hdWRpb19pbmZvX2Zyb21fY2FwcyAoJmF1ZGlvaW5mbywgY2FwcyksCisgICAgICAiR2V0dGluZyBhdWRpbyBpbmZvIGZyb20gY2FwcyBmYWlsZWQiKTsKKworICAvKiBjaGVjayBjYXBzICovCisgIG91dF9jYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcmF3IiwKKyAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCBHU1RfQVVESU9fTkUgKFMzMiksCisgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImludGVybGVhdmVkIiwKKyAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgNDQxMDAsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDEsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19pc19lcXVhbF9maXhlZCAoY2Fwcywgb3V0X2NhcHMpLCAiSW5jb3JyZWN0IG91dCBjYXBzIik7CisKKyAgZ3N0X2NhcHNfdW5yZWYgKG91dF9jYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIC8qIGhlcmUsIHRlc3QgaWYgZGVjb2RlZCBkYXRhIGlzIGEgc2luZSB0b25lLCBhbmQgaWYgdGhlIHNpbmUgZnJlcXVlbmN5IGlzIGF0IHRoZQorICAgKiByaWdodCBzcG90IGluIHRoZSBzcGVjdHJ1bSAqLworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2RlY29kZWRfYnVmZmVyczsgKytpKSB7CisgICAgb3V0YnVmZmVyID0gR1NUX0JVRkZFUiAoYnVmZmVycy0+ZGF0YSk7CisgICAgZmFpbF9pZiAob3V0YnVmZmVyID09IE5VTEwsICJJbnZhbGlkIGJ1ZmZlciByZXRyaWV2ZWQiKTsKKworICAgIC8qIE1QRUcgMSBsYXllciAyIHVzZXMgMTE1MiBzYW1wbGVzIHBlciBmcmFtZSAqLworICAgIGV4cGVjdGVkX3NpemUgPSAxMTUyICogR1NUX0FVRElPX0lORk9fQlBGICgmYXVkaW9pbmZvKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWZmZXIpLCBleHBlY3RlZF9zaXplKTsKKworICAgIGNoZWNrX21haW5fZnJlcXVlbmN5X3Nwb3RfUzMyIChvdXRidWZmZXIsIGV4cGVjdGVkX2ZyZXF1ZW5jeV9zcG90KTsKKworICAgIGJ1ZmZlcnMgPSBnX2xpc3RfcmVtb3ZlIChidWZmZXJzLCBvdXRidWZmZXIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1ZmZlcik7CisgICAgb3V0YnVmZmVyID0gTlVMTDsKKyAgfQorCisgIGdfbGlzdF9mcmVlIChidWZmZXJzKTsKKyAgYnVmZmVycyA9IE5VTEw7CisKKyAgY2xlYW51cF9pbnB1dF9waXBlbGluZSAoaW5wdXRfcGlwZWxpbmUpOworICBnc3RfYnVzX3NldF9mbHVzaGluZyAoYnVzLCBUUlVFKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAobXBnMTIzYXVkaW9kZWMsIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChHU1RfT0JKRUNUIChidXMpKTsKK30KKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9kZWNvZGVfbXBlZzFsYXllcjIpCit7CisgIEdzdEVsZW1lbnQgKm1wZzEyM2F1ZGlvZGVjOworICBtcGcxMjNhdWRpb2RlYyA9IHNldHVwX21wZWcxbGF5ZXIyZGVjICgpOworICBydW5fZGVjb2RpbmdfdGVzdCAobXBnMTIzYXVkaW9kZWMsIE1QMl9TVFJFQU1fRklMRU5BTUUpOworICBjbGVhbnVwX21wZzEyM2F1ZGlvZGVjIChtcGcxMjNhdWRpb2RlYyk7CisgIG1wZzEyM2F1ZGlvZGVjID0gTlVMTDsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2RlY29kZV9tcGVnMWxheWVyM19jYnIpCit7CisgIEdzdEVsZW1lbnQgKm1wZzEyM2F1ZGlvZGVjOworICBtcGcxMjNhdWRpb2RlYyA9IHNldHVwX21wZWcxbGF5ZXIzZGVjICgpOworICBydW5fZGVjb2RpbmdfdGVzdCAobXBnMTIzYXVkaW9kZWMsIE1QM19DQlJfU1RSRUFNX0ZJTEVOQU1FKTsKKyAgY2xlYW51cF9tcGcxMjNhdWRpb2RlYyAobXBnMTIzYXVkaW9kZWMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZGVjb2RlX21wZWcxbGF5ZXIzX3ZicikKK3sKKyAgR3N0RWxlbWVudCAqbXBnMTIzYXVkaW9kZWM7CisgIG1wZzEyM2F1ZGlvZGVjID0gc2V0dXBfbXBlZzFsYXllcjNkZWMgKCk7CisgIHJ1bl9kZWNvZGluZ190ZXN0IChtcGcxMjNhdWRpb2RlYywgTVAzX1ZCUl9TVFJFQU1fRklMRU5BTUUpOworICBjbGVhbnVwX21wZzEyM2F1ZGlvZGVjIChtcGcxMjNhdWRpb2RlYyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9kZWNvZGVfZ2FyYmFnZV9tcGVnMWxheWVyMikKK3sKKyAgR3N0RWxlbWVudCAqbXBnMTIzYXVkaW9kZWM7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXI7CisgIEdzdEJ1cyAqYnVzOworICBpbnQgaSwgbnVtX2J1ZmZlcnM7CisgIGd1aW50MzIgKnRtcGJ1ZjsKKworICBtcGcxMjNhdWRpb2RlYyA9IHNldHVwX21wZWcxbGF5ZXIyZGVjICgpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKG1wZzEyM2F1ZGlvZGVjLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworCisgIC8qIGluaXRpYWxpemUgdGhlIGJ1ZmZlciB3aXRoIHNvbWV0aGluZyB0aGF0IGlzIG5vIG1wZWcyICovCisgIHRtcGJ1ZiA9IGdfbmV3IChndWludDMyLCA0MDk2KTsKKyAgZm9yIChpID0gMDsgaSA8IDQwOTY7IGkrKykgeworICAgIHRtcGJ1ZltpXSA9IGk7CisgIH0KKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkICh0bXBidWYsIDQwOTYgKiBzaXplb2YgKGd1aW50MzIpKTsKKworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAobXBnMTIzYXVkaW9kZWMsIGJ1cyk7CisKKyAgLyogc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHB1c2ggd2l0aG91dCBwcm9ibGVtcyBidXQgbm90aGluZyBnZXRzIGRlY29kZWQgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpLCBHU1RfRkxPV19PSyk7CisKKyAgbnVtX2J1ZmZlcnMgPSBnX2xpc3RfbGVuZ3RoIChidWZmZXJzKTsKKworICAvKiBzaG91bGQgYmUgMCBidWZmZXJzIGFzIGRlY29kaW5nIHNob3VsZCd2ZSBiZWVuIGltcG9zc2libGUgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobnVtX2J1ZmZlcnMsIDApOworCisgIGdfbGlzdF9mcmVlIChidWZmZXJzKTsKKyAgYnVmZmVycyA9IE5VTEw7CisKKyAgZ3N0X2J1c19zZXRfZmx1c2hpbmcgKGJ1cywgVFJVRSk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKG1wZzEyM2F1ZGlvZGVjLCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoR1NUX09CSkVDVCAoYnVzKSk7CisgIGNsZWFudXBfbXBnMTIzYXVkaW9kZWMgKG1wZzEyM2F1ZGlvZGVjKTsKKyAgbXBnMTIzYXVkaW9kZWMgPSBOVUxMOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZGVjb2RlX2dhcmJhZ2VfbXBlZzFsYXllcjMpCit7CisgIEdzdEVsZW1lbnQgKm1wZzEyM2F1ZGlvZGVjOworICBHc3RCdWZmZXIgKmluYnVmZmVyOworICBHc3RCdXMgKmJ1czsKKyAgaW50IGksIG51bV9idWZmZXJzOworICBndWludDMyICp0bXBidWY7CisKKyAgbXBnMTIzYXVkaW9kZWMgPSBzZXR1cF9tcGVnMWxheWVyM2RlYyAoKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChtcGcxMjNhdWRpb2RlYywKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworICBidXMgPSBnc3RfYnVzX25ldyAoKTsKKworICAvKiBpbml0aWFsaXplIHRoZSBidWZmZXIgd2l0aCBzb21ldGhpbmcgdGhhdCBpcyBubyBtcGVnMiAqLworICB0bXBidWYgPSBnX25ldyAoZ3VpbnQzMiwgNDA5Nik7CisgIGZvciAoaSA9IDA7IGkgPCA0MDk2OyBpKyspIHsKKyAgICB0bXBidWZbaV0gPSBpOworICB9CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAodG1wYnVmLCA0MDk2ICogc2l6ZW9mIChndWludDMyKSk7CisKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIGdzdF9lbGVtZW50X3NldF9idXMgKG1wZzEyM2F1ZGlvZGVjLCBidXMpOworCisgIC8qIHNob3VsZCBiZSBwb3NzaWJsZSB0byBwdXNoIHdpdGhvdXQgcHJvYmxlbXMgYnV0IG5vdGhpbmcgZ2V0cyBkZWNvZGVkICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSwgR1NUX0ZMT1dfT0spOworCisgIG51bV9idWZmZXJzID0gZ19saXN0X2xlbmd0aCAoYnVmZmVycyk7CisKKyAgLyogc2hvdWxkIGJlIDAgYnVmZmVycyBhcyBkZWNvZGluZyBzaG91bGQndmUgYmVlbiBpbXBvc3NpYmxlICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG51bV9idWZmZXJzLCAwKTsKKworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGdzdF9idXNfc2V0X2ZsdXNoaW5nIChidXMsIFRSVUUpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChtcGcxMjNhdWRpb2RlYywgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1QgKGJ1cykpOworICBjbGVhbnVwX21wZzEyM2F1ZGlvZGVjIChtcGcxMjNhdWRpb2RlYyk7CisgIG1wZzEyM2F1ZGlvZGVjID0gTlVMTDsKK30KKworR1NUX0VORF9URVNUOworCisKK3N0YXRpYyBnYm9vbGVhbgoraXNfdGVzdF9maWxlX2F2YWlsYWJsZSAoZ2NoYXIgY29uc3QgKmZpbGVuYW1lKQoreworICBnYm9vbGVhbiByZXQ7CisgIGdjaGFyICpmdWxsX2ZpbGVuYW1lOworICBnY2hhciAqY3dkOworCisgIGN3ZCA9IGdfZ2V0X2N1cnJlbnRfZGlyICgpOworICBmdWxsX2ZpbGVuYW1lID0gZ19idWlsZF9maWxlbmFtZSAoY3dkLCBHU1RfVEVTVF9GSUxFU19QQVRILCBmaWxlbmFtZSwgTlVMTCk7CisgIHJldCA9CisgICAgICBnX2ZpbGVfdGVzdCAoZnVsbF9maWxlbmFtZSwgR19GSUxFX1RFU1RfSVNfUkVHVUxBUiB8IEdfRklMRV9URVNUX0VYSVNUUyk7CisgIGdfZnJlZSAoZnVsbF9maWxlbmFtZSk7CisgIGdfZnJlZSAoY3dkKTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIFN1aXRlICoKK21wZzEyM2F1ZGlvZGVjX3N1aXRlICh2b2lkKQoreworICBHc3RSZWdpc3RyeSAqcmVnaXN0cnk7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgibXBnMTIzYXVkaW9kZWMiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHJlZ2lzdHJ5ID0gZ3N0X3JlZ2lzdHJ5X2dldCAoKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgaWYgKGdzdF9yZWdpc3RyeV9jaGVja19mZWF0dXJlX3ZlcnNpb24gKHJlZ2lzdHJ5LCAiZmlsZXNyYyIsCisgICAgICAgICAgR1NUX1ZFUlNJT05fTUFKT1IsIEdTVF9WRVJTSU9OX01JTk9SLCAwKSAmJgorICAgICAgZ3N0X3JlZ2lzdHJ5X2NoZWNrX2ZlYXR1cmVfdmVyc2lvbiAocmVnaXN0cnksICJtcGVnYXVkaW9wYXJzZSIsCisgICAgICAgICAgR1NUX1ZFUlNJT05fTUFKT1IsIEdTVF9WRVJTSU9OX01JTk9SLCAwKSAmJgorICAgICAgZ3N0X3JlZ2lzdHJ5X2NoZWNrX2ZlYXR1cmVfdmVyc2lvbiAocmVnaXN0cnksICJhcHBzcmMiLAorICAgICAgICAgIEdTVF9WRVJTSU9OX01BSk9SLCBHU1RfVkVSU0lPTl9NSU5PUiwgMCkpIHsKKyAgICBpZiAoaXNfdGVzdF9maWxlX2F2YWlsYWJsZSAoTVAyX1NUUkVBTV9GSUxFTkFNRSkpCisgICAgICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZGVjb2RlX21wZWcxbGF5ZXIyKTsKKyAgICBpZiAoaXNfdGVzdF9maWxlX2F2YWlsYWJsZSAoTVAzX0NCUl9TVFJFQU1fRklMRU5BTUUpKQorICAgICAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2RlY29kZV9tcGVnMWxheWVyM19jYnIpOworICAgIGlmIChpc190ZXN0X2ZpbGVfYXZhaWxhYmxlIChNUDNfVkJSX1NUUkVBTV9GSUxFTkFNRSkpCisgICAgICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZGVjb2RlX21wZWcxbGF5ZXIzX3Zicik7CisgIH0KKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2RlY29kZV9nYXJiYWdlX21wZWcxbGF5ZXIyKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2RlY29kZV9nYXJiYWdlX21wZWcxbGF5ZXIzKTsKKworICByZXR1cm4gczsKK30KKworCitHU1RfQ0hFQ0tfTUFJTiAobXBnMTIzYXVkaW9kZWMpCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9tdWxhd2RlYy5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsYXdkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjZmMDM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsYXdkZWMuYwpAQCAtMCwwICsxLDEyNiBAQAorLyogR1N0cmVhbWVyIE11bGF3RGVjIHVuaXQgdGVzdHMKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworc3RhdGljIEdzdEVsZW1lbnQgKm11bGF3ZGVjID0gTlVMTDsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChTMTYpICIsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSA4MDAwLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgImxheW91dCA9IChzdHJpbmcpaW50ZXJsZWF2ZWQiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LW11bGF3LCIgInJhdGUgPSAoaW50KSA4MDAwLCIgImNoYW5uZWxzID0gKGludCkgMSIpCisgICAgKTsKKworc3RhdGljIHZvaWQKK211bGF3ZGVjX3NldHVwICh2b2lkKQoreworICBHc3RDYXBzICpzcmNfY2FwczsKKworICBzcmNfY2FwcyA9CisgICAgICBnc3RfY2Fwc19mcm9tX3N0cmluZyAoImF1ZGlvL3gtbXVsYXcsIiAicmF0ZSA9IChpbnQpIDgwMDAsIgorICAgICAgImNoYW5uZWxzID0gKGludCkgMSIpOworCisgIEdTVF9ERUJVRyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKworICBtdWxhd2RlYyA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgibXVsYXdkZWMiKTsKKworICBteXNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkIChtdWxhd2RlYywgJnNyY3RlbXBsYXRlKTsKKyAgbXlzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChtdWxhd2RlYywgJnNpbmt0ZW1wbGF0ZSk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgbXVsYXdkZWMsIHNyY19jYXBzLCBHU1RfRk9STUFUX1RJTUUpOworCisgIGdzdF9jYXBzX3VucmVmIChzcmNfY2Fwcyk7Cit9CisKK3N0YXRpYyB2b2lkCitidWZmZXJfdW5yZWYgKHZvaWQgKmJ1ZmZlciwgdm9pZCAqdXNlcl9kYXRhKQoreworICBnc3RfYnVmZmVyX3VucmVmIChHU1RfQlVGRkVSIChidWZmZXIpKTsKK30KKworc3RhdGljIHZvaWQKK211bGF3ZGVjX3RlYXJkb3duICh2b2lkKQoreworICAvKiBmcmVlIGRlY29kZWQgYnVmZmVycyAqLworICBnX2xpc3RfZm9yZWFjaCAoYnVmZmVycywgYnVmZmVyX3VucmVmLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKGJ1ZmZlcnMpOworICBidWZmZXJzID0gTlVMTDsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBGQUxTRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBGQUxTRSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zcmNfcGFkIChtdWxhd2RlYyk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAobXVsYXdkZWMpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAobXVsYXdkZWMpOworICBtdWxhd2RlYyA9IE5VTEw7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X29uZV9idWZmZXIpCit7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBnaW50IGJ1Zl9zaXplID0gNDA5NjsKKyAgZ3VpbnQ4ICpkcDsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChtdWxhd2RlYywgR1NUX1NUQVRFX1BMQVlJTkcpID09CisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsICJjb3VsZCBub3QgY2hhbmdlIHN0YXRlIHRvIHBsYXlpbmciKTsKKworICBidWZmZXIgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgZHAgPSBnX21hbGxvYzAgKGJ1Zl9zaXplKTsKKyAgZ3N0X2J1ZmZlcl9hcHBlbmRfbWVtb3J5IChidWZmZXIsCisgICAgICBnc3RfbWVtb3J5X25ld193cmFwcGVkICgwLCBkcCwgYnVmX3NpemUsIDAsIGJ1Zl9zaXplLCBkcCwgZ19mcmVlKSk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGJ1ZmZlciwgImJ1ZmZlciIsIDEpOworCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBidWZmZXIpID09IEdTVF9GTE9XX09LKTsKKworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPT0gMSk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2dldF9zaXplIChHU1RfQlVGRkVSIChnX2xpc3RfZmlyc3QgKGJ1ZmZlcnMpLT5kYXRhKSkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCittdWxhd2RlY19zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJtdWxhd2RlYyIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJtdWxhd2RlYyIpOworCisgIHRjYXNlX2FkZF9jaGVja2VkX2ZpeHR1cmUgKHRjX2NoYWluLCBtdWxhd2RlY19zZXR1cCwgbXVsYXdkZWNfdGVhcmRvd24pOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfb25lX2J1ZmZlcik7CisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAobXVsYXdkZWMpCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9tdWxhd2VuYy5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsYXdlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTdmM2VlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsYXdlbmMuYwpAQCAtMCwwICsxLDE3NiBAQAorLyogR1N0cmVhbWVyIE11bGF3RW5jIHVuaXQgdGVzdHMKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworc3RhdGljIEdzdEVsZW1lbnQgKm11bGF3ZW5jID0gTlVMTDsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtbXVsYXcsIiAicmF0ZSA9IChpbnQpIDgwMDAsIiAiY2hhbm5lbHMgPSAoaW50KSAxIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKFMxNikgIiwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIDgwMDAsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAibGF5b3V0ID0gKHN0cmluZylpbnRlcmxlYXZlZCIpCisgICAgKTsKKworc3RhdGljIHZvaWQKK211bGF3ZW5jX3NldHVwICh2b2lkKQoreworICBHc3RDYXBzICpzcmNfY2FwczsKKworICBzcmNfY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nICgiYXVkaW8veC1yYXcsIgorICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChTMTYpICIsICIKKyAgICAgICJyYXRlID0gKGludCkgODAwMCwgIgorICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAibGF5b3V0ID0gKHN0cmluZylpbnRlcmxlYXZlZCIpOworCisgIEdTVF9ERUJVRyAoIiVzIiwgX19GVU5DVElPTl9fKTsKKworICBtdWxhd2VuYyA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgibXVsYXdlbmMiKTsKKworICBteXNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkIChtdWxhd2VuYywgJnNyY3RlbXBsYXRlKTsKKyAgbXlzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChtdWxhd2VuYywgJnNpbmt0ZW1wbGF0ZSk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgbXVsYXdlbmMsIHNyY19jYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoc3JjX2NhcHMpOworfQorCitzdGF0aWMgdm9pZAorYnVmZmVyX3VucmVmICh2b2lkICpidWZmZXIsIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoR1NUX0JVRkZFUiAoYnVmZmVyKSk7Cit9CisKK3N0YXRpYyB2b2lkCittdWxhd2VuY190ZWFyZG93biAodm9pZCkKK3sKKyAgLyogZnJlZSBlbmNvZGVkIGJ1ZmZlcnMgKi8KKyAgZ19saXN0X2ZvcmVhY2ggKGJ1ZmZlcnMsIGJ1ZmZlcl91bnJlZiwgTlVMTCk7CisgIGdfbGlzdF9mcmVlIChidWZmZXJzKTsKKyAgYnVmZmVycyA9IE5VTEw7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAobXVsYXdlbmMpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKG11bGF3ZW5jKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKG11bGF3ZW5jKTsKKyAgbXVsYXdlbmMgPSBOVUxMOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2NoZWNrX2Zvcl9tYXhpbXVtX2JpdHJhdGUgKEdzdFBhZCAqIHBhZCwgR3N0RXZlbnQgKiogZXZlbnRwLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGdib29sZWFuICpmb3VuZF9tYXhpbXVtX2JpdHJhdGUgPSAoZ2Jvb2xlYW4gKikgdXNlcl9kYXRhOworICBHc3RFdmVudCAqZXZlbnQgPSAqZXZlbnRwOworCisgIGlmIChldmVudC0+dHlwZSA9PSBHU1RfRVZFTlRfVEFHKSB7CisgICAgR3N0VGFnTGlzdCAqdGFnbGlzdCA9IE5VTEw7CisgICAgZ3VpbnQgdmFsdWUgPSAwOworICAgIGdzdF9ldmVudF9wYXJzZV90YWcgKGV2ZW50LCAmdGFnbGlzdCk7CisKKyAgICBmYWlsX3VubGVzcyAodGFnbGlzdCAhPSBOVUxMKTsKKworICAgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X3VpbnQgKHRhZ2xpc3QsIEdTVF9UQUdfTUFYSU1VTV9CSVRSQVRFLAorICAgICAgICAgICAgJnZhbHVlKSk7CisKKyAgICAvKiBiaXRyYXRlIG5lZWRzIHRvIGJlIGV4YWN0bHkgc2FtcGxlIHJhdGUgKiBjaGFubmVscyAqIDggKi8KKyAgICBmYWlsX3VubGVzcyAodmFsdWUgPT0gODAwMCAqIDEgKiA4KTsKKworICAgICpmb3VuZF9tYXhpbXVtX2JpdHJhdGUgPSBUUlVFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X29uZV9idWZmZXIpCit7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBnaW50IGJ1Zl9zaXplID0gNDA5NjsKKyAgZ3VpbnQ4ICpkcDsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChtdWxhd2VuYywgR1NUX1NUQVRFX1BMQVlJTkcpID09CisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsICJjb3VsZCBub3QgY2hhbmdlIHN0YXRlIHRvIHBsYXlpbmciKTsKKworICBidWZmZXIgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgZHAgPSBnX21hbGxvYzAgKGJ1Zl9zaXplKTsKKyAgZ3N0X2J1ZmZlcl9hcHBlbmRfbWVtb3J5IChidWZmZXIsCisgICAgICBnc3RfbWVtb3J5X25ld193cmFwcGVkICgwLCBkcCwgYnVmX3NpemUsIDAsIGJ1Zl9zaXplLCBkcCwgZ19mcmVlKSk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGJ1ZmZlciwgImJ1ZmZlciIsIDEpOworCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBidWZmZXIpID09IEdTVF9GTE9XX09LKTsKKworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPT0gMSk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2dldF9zaXplIChHU1RfQlVGRkVSIChnX2xpc3RfZmlyc3QgKGJ1ZmZlcnMpLT5kYXRhKSkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3RhZ3MpCit7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBnaW50IGJ1Zl9zaXplID0gNDA5NjsKKyAgZ3VpbnQ4ICpkcDsKKyAgZ2Jvb2xlYW4gZm91bmRfbWF4aW11bV9iaXRyYXRlID0gRkFMU0U7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAobXVsYXdlbmMsIEdTVF9TVEFURV9QTEFZSU5HKSA9PQorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLCAiY291bGQgbm90IGNoYW5nZSBzdGF0ZSB0byBwbGF5aW5nIik7CisKKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgIGRwID0gZ19tYWxsb2MwIChidWZfc2l6ZSk7CisgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAoYnVmZmVyLAorICAgICAgZ3N0X21lbW9yeV9uZXdfd3JhcHBlZCAoMCwgZHAsIGJ1Zl9zaXplLCAwLCBidWZfc2l6ZSwgZHAsIGdfZnJlZSkpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChidWZmZXIsICJidWZmZXIiLCAxKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGdzdF9wYWRfc3RpY2t5X2V2ZW50c19mb3JlYWNoIChteXNpbmtwYWQsIGNoZWNrX2Zvcl9tYXhpbXVtX2JpdHJhdGUsCisgICAgICAmZm91bmRfbWF4aW11bV9iaXRyYXRlKTsKKyAgZmFpbF91bmxlc3MgKGZvdW5kX21heGltdW1fYml0cmF0ZSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK211bGF3ZW5jX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoIm11bGF3ZW5jIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoIm11bGF3ZW5jIik7CisKKyAgdGNhc2VfYWRkX2NoZWNrZWRfZml4dHVyZSAodGNfY2hhaW4sIG11bGF3ZW5jX3NldHVwLCBtdWxhd2VuY190ZWFyZG93bik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9vbmVfYnVmZmVyKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3RhZ3MpOworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKG11bGF3ZW5jKQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsdGlmaWxlLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9tdWx0aWZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2FiZmZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsdGlmaWxlLmMKQEAgLTAsMCArMSwzOTkgQEAKKy8qIEdTdHJlYW1lciB1bml0IHRlc3QgZm9yIG11bHRpZmlsZSBwbHVnaW4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnbGliL2dzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK3N0YXRpYyBHTGlzdCAqbWZzX21lc3NhZ2VzID0gTlVMTDsKKworc3RhdGljIHZvaWQKK21mc19jaGVja19uZXh0X21lc3NhZ2UgKGNvbnN0IGdjaGFyICogZmlsZW5hbWUpCit7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKyAgY29uc3QgZ2NoYXIgKm1zZ19maWxlbmFtZTsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisKKyAgZmFpbF91bmxlc3MgKG1mc19tZXNzYWdlcyAhPSBOVUxMKTsKKworICBtc2cgPSBtZnNfbWVzc2FnZXMtPmRhdGE7CisgIG1mc19tZXNzYWdlcyA9IGdfbGlzdF9kZWxldGVfbGluayAobWZzX21lc3NhZ2VzLCBtZnNfbWVzc2FnZXMpOworCisgIHN0cnVjdHVyZSA9IGdzdF9tZXNzYWdlX2dldF9zdHJ1Y3R1cmUgKG1zZyk7CisKKyAgbXNnX2ZpbGVuYW1lID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJmaWxlbmFtZSIpOworCisgIGZhaWxfdW5sZXNzIChzdHJjbXAgKGZpbGVuYW1lLCBtc2dfZmlsZW5hbWUpID09IDApOworCisgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworfQorCitzdGF0aWMgdm9pZAorcnVuX3BpcGVsaW5lIChHc3RFbGVtZW50ICogcGlwZWxpbmUpCit7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKyAgR3N0QnVzICpidXM7CisKKyAgYnVzID0gZ3N0X3BpcGVsaW5lX2dldF9idXMgKEdTVF9QSVBFTElORSAocGlwZWxpbmUpKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChwaXBlbGluZSwgTlVMTCwgTlVMTCwgLTEpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgd2hpbGUgKDEpIHsKKyAgICBtc2cgPQorICAgICAgICBnc3RfYnVzX3RpbWVkX3BvcF9maWx0ZXJlZCAoYnVzLCBHU1RfQ0xPQ0tfVElNRV9OT05FLAorICAgICAgICBHU1RfTUVTU0FHRV9FT1MgfCBHU1RfTUVTU0FHRV9FUlJPUiB8IEdTVF9NRVNTQUdFX0VMRU1FTlQpOworCisgICAgZmFpbF91bmxlc3MgKG1zZyAhPSBOVUxMKTsKKyAgICBpZiAobXNnKSB7CisgICAgICBpZiAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSA9PSBHU1RfTUVTU0FHRV9FTEVNRU5UKSB7CisgICAgICAgIGlmIChnc3RfbWVzc2FnZV9oYXNfbmFtZSAobXNnLCAiR3N0TXVsdGlGaWxlU2luayIpKQorICAgICAgICAgIG1mc19tZXNzYWdlcyA9IGdfbGlzdF9hcHBlbmQgKG1mc19tZXNzYWdlcywgbXNnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBmYWlsX3VubGVzcyAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSA9PSBHU1RfTUVTU0FHRV9FT1MpOworICAgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgICAgfQorICAgIGJyZWFrOworICB9CisKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tdWx0aWZpbGVzaW5rX2tleV9mcmFtZSkKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdEVsZW1lbnQgKm1mczsKKyAgaW50IGk7CisgIGNvbnN0IGdjaGFyICp0bXBkaXI7CisgIGdjaGFyICpteV90bXBkaXI7CisgIGdjaGFyICp0ZW1wbGF0ZTsKKyAgZ2NoYXIgKm1mc19wYXR0ZXJuOworCisgIHRtcGRpciA9IGdfZ2V0X3RtcF9kaXIgKCk7CisgIHRlbXBsYXRlID0gZ19idWlsZF9maWxlbmFtZSAodG1wZGlyLCAibXVsdGlmaWxlLXRlc3QtWFhYWFhYIiwgTlVMTCk7CisgIG15X3RtcGRpciA9IGdfbWtkdGVtcCAodGVtcGxhdGUpOworICBmYWlsX2lmIChteV90bXBkaXIgPT0gTlVMTCk7CisKKyAgcGlwZWxpbmUgPQorICAgICAgZ3N0X3BhcnNlX2xhdW5jaAorICAgICAgKCJ2aWRlb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9MTAgISB2aWRlby94LXJhdyxmb3JtYXQ9KHN0cmluZylJNDIwLHdpZHRoPTMyMCxoZWlnaHQ9MjQwICEgbXVsdGlmaWxlc2luayBuYW1lPW1mcyIsCisgICAgICBOVUxMKTsKKyAgZmFpbF9pZiAocGlwZWxpbmUgPT0gTlVMTCk7CisgIG1mcyA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgIm1mcyIpOworICBmYWlsX2lmIChtZnMgPT0gTlVMTCk7CisgIG1mc19wYXR0ZXJuID0gZ19idWlsZF9maWxlbmFtZSAobXlfdG1wZGlyLCAiJTA1ZCIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChtZnMpLCAibG9jYXRpb24iLCBtZnNfcGF0dGVybiwgInBvc3QtbWVzc2FnZXMiLCBUUlVFLAorICAgICAgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChtZnMpOworICBydW5fcGlwZWxpbmUgKHBpcGVsaW5lKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworCisgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgY2hhciAqczsKKworICAgIHMgPSBnX3N0cmR1cF9wcmludGYgKG1mc19wYXR0ZXJuLCBpKTsKKyAgICBmYWlsX2lmIChnX3JlbW92ZSAocykgIT0gMCk7CisKKyAgICBtZnNfY2hlY2tfbmV4dF9tZXNzYWdlIChzKTsKKworICAgIGdfZnJlZSAocyk7CisgIH0KKyAgZmFpbF9pZiAoZ19yZW1vdmUgKG15X3RtcGRpcikgIT0gMCk7CisKKyAgZmFpbF91bmxlc3MgKG1mc19tZXNzYWdlcyA9PSBOVUxMKTsKKyAgZ19mcmVlIChtZnNfcGF0dGVybik7CisgIGdfZnJlZSAobXlfdG1wZGlyKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tdWx0aWZpbGVzaW5rX21heF9maWxlcykKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdEVsZW1lbnQgKm1mczsKKyAgaW50IGk7CisgIGNvbnN0IGdjaGFyICp0bXBkaXI7CisgIGdjaGFyICpteV90bXBkaXI7CisgIGdjaGFyICp0ZW1wbGF0ZTsKKyAgZ2NoYXIgKm1mc19wYXR0ZXJuOworCisgIHRtcGRpciA9IGdfZ2V0X3RtcF9kaXIgKCk7CisgIHRlbXBsYXRlID0gZ19idWlsZF9maWxlbmFtZSAodG1wZGlyLCAibXVsdGlmaWxlLXRlc3QtWFhYWFhYIiwgTlVMTCk7CisgIG15X3RtcGRpciA9IGdfbWtkdGVtcCAodGVtcGxhdGUpOworICBmYWlsX2lmIChteV90bXBkaXIgPT0gTlVMTCk7CisKKyAgcGlwZWxpbmUgPQorICAgICAgZ3N0X3BhcnNlX2xhdW5jaAorICAgICAgKCJ2aWRlb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9MTAgISB2aWRlby94LXJhdyxmb3JtYXQ9KHN0cmluZylJNDIwLHdpZHRoPTMyMCxoZWlnaHQ9MjQwICEgbXVsdGlmaWxlc2luayBuYW1lPW1mcyIsCisgICAgICBOVUxMKTsKKyAgZmFpbF9pZiAocGlwZWxpbmUgPT0gTlVMTCk7CisgIG1mcyA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgIm1mcyIpOworICBmYWlsX2lmIChtZnMgPT0gTlVMTCk7CisgIG1mc19wYXR0ZXJuID0gZ19idWlsZF9maWxlbmFtZSAobXlfdG1wZGlyLCAiJTA1ZCIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChtZnMpLCAibG9jYXRpb24iLCBtZnNfcGF0dGVybiwgIm1heC1maWxlcyIsIDMsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAobWZzKTsKKyAgcnVuX3BpcGVsaW5lIChwaXBlbGluZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKworICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisgICAgY2hhciAqczsKKworICAgIHMgPSBnX3N0cmR1cF9wcmludGYgKG1mc19wYXR0ZXJuLCBpKTsKKyAgICBmYWlsX3VubGVzcyAoZ19yZW1vdmUgKHMpICE9IDApOworICAgIGdfZnJlZSAocyk7CisgIH0KKyAgZm9yIChpID0gNzsgaSA8IDEwOyBpKyspIHsKKyAgICBjaGFyICpzOworCisgICAgcyA9IGdfc3RyZHVwX3ByaW50ZiAobWZzX3BhdHRlcm4sIGkpOworICAgIGZhaWxfaWYgKGdfcmVtb3ZlIChzKSAhPSAwKTsKKyAgICBnX2ZyZWUgKHMpOworICB9CisgIGZhaWxfaWYgKGdfcmVtb3ZlIChteV90bXBkaXIpICE9IDApOworCisgIGdfZnJlZSAobWZzX3BhdHRlcm4pOworICBnX2ZyZWUgKG15X3RtcGRpcik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfbXVsdGlmaWxlc2lua19rZXlfdW5pdCkKK3sKKyAgR3N0RWxlbWVudCAqbWZzOworICBpbnQgaTsKKyAgY29uc3QgZ2NoYXIgKnRtcGRpcjsKKyAgZ2NoYXIgKm15X3RtcGRpcjsKKyAgZ2NoYXIgKnRlbXBsYXRlOworICBnY2hhciAqbWZzX3BhdHRlcm47CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RQYWQgKnNpbms7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKyAgR3N0QnVzICpidXM7CisKKyAgdG1wZGlyID0gZ19nZXRfdG1wX2RpciAoKTsKKyAgdGVtcGxhdGUgPSBnX2J1aWxkX2ZpbGVuYW1lICh0bXBkaXIsICJtdWx0aWZpbGUtdGVzdC1YWFhYWFgiLCBOVUxMKTsKKyAgbXlfdG1wZGlyID0gZ19ta2R0ZW1wICh0ZW1wbGF0ZSk7CisgIGZhaWxfaWYgKG15X3RtcGRpciA9PSBOVUxMKTsKKworICBtZnMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJtdWx0aWZpbGVzaW5rIiwgTlVMTCk7CisgIGZhaWxfaWYgKG1mcyA9PSBOVUxMKTsKKyAgbWZzX3BhdHRlcm4gPSBnX2J1aWxkX2ZpbGVuYW1lIChteV90bXBkaXIsICIlMDVkIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKG1mcyksICJsb2NhdGlvbiIsIG1mc19wYXR0ZXJuLCAibmV4dC1maWxlIiwgMywKKyAgICAgICJwb3N0LW1lc3NhZ2VzIiwgVFJVRSwgTlVMTCk7CisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChtZnMsIGJ1cyk7CisgIGZhaWxfaWYgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAobWZzLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIHNpbmsgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAobWZzLCAic2luayIpOworCisgIGdzdF9wYWRfc2VuZF9ldmVudCAoc2luaywgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKCJ0ZXN0IikpOworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X3BhZF9zZW5kX2V2ZW50IChzaW5rLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSk7CisKKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg0KTsKKworICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgImZvbyIsIDQpOworICBmYWlsX2lmIChnc3RfcGFkX2NoYWluIChzaW5rLCBnc3RfYnVmZmVyX2NvcHkgKGJ1ZikpICE9IEdTVF9GTE9XX09LKTsKKworICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgImJhciIsIDQpOworICBmYWlsX2lmIChnc3RfcGFkX2NoYWluIChzaW5rLCBnc3RfYnVmZmVyX2NvcHkgKGJ1ZikpICE9IEdTVF9GTE9XX09LKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9zZW5kX2V2ZW50IChzaW5rLAorICAgICAgICAgIGdzdF92aWRlb19ldmVudF9uZXdfZG93bnN0cmVhbV9mb3JjZV9rZXlfdW5pdCAoR1NUX0NMT0NLX1RJTUVfTk9ORSwKKyAgICAgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSwgR1NUX0NMT0NLX1RJTUVfTk9ORSwgVFJVRSwgMSkpKTsKKworICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgImJheiIsIDQpOworICBmYWlsX2lmIChnc3RfcGFkX2NoYWluIChzaW5rLCBidWYpICE9IEdTVF9GTE9XX09LKTsKKworICBnc3RfcGFkX3NlbmRfZXZlbnQgKHNpbmssIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKworICBmYWlsX2lmIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKG1mcywKKyAgICAgICAgICBHU1RfU1RBVEVfTlVMTCkgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAobWZzLCBOVUxMKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgY2hhciAqczsKKyAgICBHc3RNZXNzYWdlICptc2c7CisKKyAgICBzID0gZ19zdHJkdXBfcHJpbnRmIChtZnNfcGF0dGVybiwgaSk7CisgICAgZmFpbF9pZiAoZ19yZW1vdmUgKHMpICE9IDApOworCisgICAgbXNnID0gZ3N0X2J1c19wb3BfZmlsdGVyZWQgKGJ1cywgR1NUX01FU1NBR0VfRUxFTUVOVCk7CisgICAgZmFpbF91bmxlc3MgKG1zZyAhPSBOVUxMKTsKKyAgICBmYWlsX3VubGVzcyAoZ3N0X21lc3NhZ2VfaGFzX25hbWUgKG1zZywgIkdzdE11bHRpRmlsZVNpbmsiKSk7CisgICAgZmFpbF91bmxlc3MgKHN0cmNtcCAocywKKyAgICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoZ3N0X21lc3NhZ2VfZ2V0X3N0cnVjdHVyZSAobXNnKSwKKyAgICAgICAgICAgICAgICAiZmlsZW5hbWUiKSkgPT0gMCk7CisKKyAgICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKyAgICBnX2ZyZWUgKHMpOworICB9CisgIGZhaWxfaWYgKGdfcmVtb3ZlIChteV90bXBkaXIpICE9IDApOworCisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdfZnJlZSAobWZzX3BhdHRlcm4pOworICBnX2ZyZWUgKG15X3RtcGRpcik7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmspOworICBnc3Rfb2JqZWN0X3VucmVmIChtZnMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X211bHRpZmlsZXNyYykKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdEVsZW1lbnQgKm1mczsKKyAgaW50IGk7CisgIGNvbnN0IGdjaGFyICp0bXBkaXI7CisgIGdjaGFyICpteV90bXBkaXI7CisgIGdjaGFyICp0ZW1wbGF0ZTsKKyAgZ2NoYXIgKm1mc19wYXR0ZXJuOworCisgIHRtcGRpciA9IGdfZ2V0X3RtcF9kaXIgKCk7CisgIHRlbXBsYXRlID0gZ19idWlsZF9maWxlbmFtZSAodG1wZGlyLCAibXVsdGlmaWxlLXRlc3QtWFhYWFhYIiwgTlVMTCk7CisgIG15X3RtcGRpciA9IGdfbWtkdGVtcCAodGVtcGxhdGUpOworICBmYWlsX2lmIChteV90bXBkaXIgPT0gTlVMTCk7CisKKyAgcGlwZWxpbmUgPQorICAgICAgZ3N0X3BhcnNlX2xhdW5jaAorICAgICAgKCJ2aWRlb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9MTAgISB2aWRlby94LXJhdyxmb3JtYXQ9KHN0cmluZylJNDIwLHdpZHRoPTMyMCxoZWlnaHQ9MjQwICEgbXVsdGlmaWxlc2luayBuYW1lPW1mcyIsCisgICAgICBOVUxMKTsKKyAgZmFpbF9pZiAocGlwZWxpbmUgPT0gTlVMTCk7CisgIG1mcyA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgIm1mcyIpOworICBmYWlsX2lmIChtZnMgPT0gTlVMTCk7CisgIG1mc19wYXR0ZXJuID0gZ19idWlsZF9maWxlbmFtZSAobXlfdG1wZGlyLCAiJTA1ZCIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChtZnMpLCAibG9jYXRpb24iLCBtZnNfcGF0dGVybiwgTlVMTCk7CisgIGdfZnJlZSAobWZzX3BhdHRlcm4pOworICBnX29iamVjdF91bnJlZiAobWZzKTsKKyAgcnVuX3BpcGVsaW5lIChwaXBlbGluZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKworICBwaXBlbGluZSA9CisgICAgICBnc3RfcGFyc2VfbGF1bmNoCisgICAgICAoIm11bHRpZmlsZXNyYyAhIHZpZGVvL3gtcmF3LGZvcm1hdD0oc3RyaW5nKUk0MjAsd2lkdGg9MzIwLGhlaWdodD0yNDAsZnJhbWVyYXRlPTEwLzEgISBmYWtlc2luayIsCisgICAgICBOVUxMKTsKKyAgZmFpbF9pZiAocGlwZWxpbmUgPT0gTlVMTCk7CisgIG1mcyA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgIm11bHRpZmlsZXNyYzAiKTsKKyAgZmFpbF9pZiAobWZzID09IE5VTEwpOworICBtZnNfcGF0dGVybiA9IGdfYnVpbGRfZmlsZW5hbWUgKG15X3RtcGRpciwgIiUwNWQiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAobWZzKSwgImxvY2F0aW9uIiwgbWZzX3BhdHRlcm4sIE5VTEwpOworICBnX29iamVjdF91bnJlZiAobWZzKTsKKyAgcnVuX3BpcGVsaW5lIChwaXBlbGluZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIGNoYXIgKnM7CisKKyAgICBzID0gZ19zdHJkdXBfcHJpbnRmIChtZnNfcGF0dGVybiwgaSk7CisgICAgZmFpbF9pZiAoZ19yZW1vdmUgKHMpICE9IDApOworICAgIGdfZnJlZSAocyk7CisgIH0KKyAgZmFpbF9pZiAoZ19yZW1vdmUgKG15X3RtcGRpcikgIT0gMCk7CisKKyAgZ19mcmVlIChtZnNfcGF0dGVybik7CisgIGdfZnJlZSAobXlfdG1wZGlyKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKKy8qIG1ha2Ugc3VyZSBzdG9wX2luZGV4IGlzIGhvbm91cmVkIGV2ZW4gaWYgdGhlIG5leHQgdGFyZ2V0IGZpbGUgZXhpc3RzICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tdWx0aWZpbGVzcmNfc3RvcF9pbmRleCkKK3sKKyAgR3N0RWxlbWVudCAqc3JjOworICBHc3RFdmVudCAqZXZlbnQ7CisgIEdzdFBhZCAqc2lua3BhZDsKKyAgZ2NoYXIgKmZuOworCisgIHNyYyA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgibXVsdGlmaWxlc3JjIik7CisgIGZhaWxfdW5sZXNzIChzcmMgIT0gTlVMTCk7CisKKyAgZm4gPSBnX2J1aWxkX2ZpbGVuYW1lIChHU1RfVEVTVF9GSUxFU19QQVRILCAiaW1hZ2UuanBnIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc3JjLCAibG9jYXRpb24iLCBmbiwgTlVMTCk7CisgIGdfZnJlZSAoZm4pOworCisgIGdfb2JqZWN0X3NldCAoc3JjLCAic3RvcC1pbmRleCIsIDUsIE5VTEwpOworCisgIHNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWRfYnlfbmFtZSAoc3JjLCAmc2lua3RlbXBsYXRlLCAic3JjIik7CisgIGZhaWxfdW5sZXNzIChzaW5rcGFkICE9IE5VTEwpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNpbmtwYWQsIFRSVUUpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc3JjLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChzcmMsIE5VTEwsIE5VTEwsIC0xKTsKKworICAvKiBidXN5LWxvb3AgZm9yIEVPUyAqLworICBkbyB7CisgICAgZ191c2xlZXAgKEdfVVNFQ19QRVJfU0VDIC8gMTApOworICAgIGV2ZW50ID0gZ3N0X3BhZF9nZXRfc3RpY2t5X2V2ZW50IChzaW5rcGFkLCBHU1RfRVZFTlRfRU9TLCAwKTsKKyAgfSB3aGlsZSAoZXZlbnQgPT0gTlVMTCk7CisgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworCisgIC8qIFJhbmdlIGFwcGVhcnMgdG8gYmUgWyBzdGFydCwgc3RvcCBdICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCA1ICsgMSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzcmMsIEdTVF9TVEFURV9OVUxMKTsKKworICBnc3RfY2hlY2tfZHJvcF9idWZmZXJzICgpOworICBnc3RfY2hlY2tfdGVhcmRvd25fcGFkX2J5X25hbWUgKHNyYywgInNyYyIpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAoc3JjKTsKK30KKworR1NUX0VORF9URVNUOworCisKK3N0YXRpYyBTdWl0ZSAqCittdWx0aWZpbGVfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgibXVsdGlmaWxlIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbXVsdGlmaWxlc2lua19rZXlfZnJhbWUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbXVsdGlmaWxlc2lua19tYXhfZmlsZXMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbXVsdGlmaWxlc2lua19rZXlfdW5pdCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9tdWx0aWZpbGVzcmMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbXVsdGlmaWxlc3JjX3N0b3BfaW5kZXgpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAobXVsdGlmaWxlKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3BhcnNlci5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJmZmVkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3BhcnNlci5jCkBAIC0wLDAgKzEsNDM1IEBACisvKgorICogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciAoYXVkaW8pIHBhcnNlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0OiBTdGVmYW4gS29zdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlICJlbGVtZW50cy9wYXJzZXIuaCIKKworCisvKiBjb250ZXh0IHN0YXRlIHZhcmlhYmxlcyAqLworY29uc3QgZ2NoYXIgKmN0eF9mYWN0b3J5OworR3N0U3RhdGljUGFkVGVtcGxhdGUgKmN0eF9zaW5rX3RlbXBsYXRlOworR3N0U3RhdGljUGFkVGVtcGxhdGUgKmN0eF9zcmNfdGVtcGxhdGU7CitHc3RDYXBzICpjdHhfaW5wdXRfY2FwczsKK0dzdENhcHMgKmN0eF9vdXRwdXRfY2FwczsKK2d1aW50IGN0eF9kaXNjYXJkID0gMDsKK2RhdGFibG9iIGN0eF9oZWFkZXJzW01BWF9IRUFERVJTXSA9IHsge05VTEwsIDB9LCB9OworCitnYm9vbGVhbiBjdHhfbm9fbWV0YWRhdGEgPSBGQUxTRTsKKworLyogaGVscGVyIHZhcmlhYmxlcyAqLworR0xpc3QgKmN1cnJlbnRfYnVmID0gTlVMTDsKKworR3N0UGFkICpzcmNwYWQsICpzaW5rcGFkOworZ3VpbnQgZGF0YW9mZnNldCA9IDA7CitHc3RDbG9ja1RpbWUgdHNfY291bnRlciA9IDA7CitnaW50NjQgb2Zmc2V0X2NvdW50ZXIgPSAwOworZ3VpbnQgYnVmZmVyX2NvdW50ZXIgPSAwOworCit0eXBlZGVmIHN0cnVjdAoreworICBndWludCBkaXNjYXJkOworICBndWludCBidWZmZXJzX2JlZm9yZV9vZmZzZXRfc2tpcDsKKyAgZ3VpbnQgb2Zmc2V0X3NraXBfYW1vdW50OworICBjb25zdCBndWludDggKmRhdGFfdG9fdmVyaWZ5OworICBndWludCBkYXRhX3RvX3ZlcmlmeV9zaXplOworICBHc3RDYXBzICpjYXBzOworICBnYm9vbGVhbiBub19tZXRhZGF0YTsKK30gYnVmZmVyX3ZlcmlmeV9kYXRhX3M7CisKKy8qIHRha2VzIGEgY29weSBvZiB0aGUgcGFzc2VkIGJ1ZmZlciBkYXRhICovCitzdGF0aWMgR3N0QnVmZmVyICoKK2J1ZmZlcl9uZXcgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcl9kYXRhLCBndWludCBzaXplKQoreworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKworICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHNpemUpOworICBpZiAoYnVmZmVyX2RhdGEpIHsKKyAgICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZmZlciwgMCwgYnVmZmVyX2RhdGEsIHNpemUpOworICB9IGVsc2UgeworICAgIGd1aW50IGk7CisgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICAvKiBDcmVhdGUgYSByZWNvZ25pemFibGUgcGF0dGVybiAobG9vcCAweDAwIC0+IDB4ZmYpIGluIHRoZSBkYXRhIGJsb2NrICovCisgICAgZm9yIChpID0gMDsgaSA8IG1hcC5zaXplOyBpKyspIHsKKyAgICAgIG1hcC5kYXRhW2ldID0gaSAlIDB4MTAwOworICAgIH0KKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICB9CisKKyAgLyogZ3N0X2J1ZmZlcl9zZXRfY2FwcyAoYnVmZmVyLCBHU1RfUEFEX0NBUFMgKHNyY3BhZCkpOyAqLworICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKSA9IGRhdGFvZmZzZXQ7CisgIGRhdGFvZmZzZXQgKz0gc2l6ZTsKKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKworLyoKKyAqIEFkZHMgYnVmZmVyIHNpemVzIHRvZ2V0aGVyLgorICovCitzdGF0aWMgdm9pZAorYnVmZmVyX2NvdW50X3NpemUgKHZvaWQgKmJ1ZmZlciwgdm9pZCAqdXNlcl9kYXRhKQoreworICBndWludCAqc3VtID0gKGd1aW50ICopIHVzZXJfZGF0YTsKKyAgKnN1bSArPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpOworfQorCisvKgorICogVmVyaWZ5IHRoYXQgZ2l2ZW4gYnVmZmVyIGNvbnRhaW5zIHByZWRlZmluZWQgQURUUyBmcmFtZS4KKyAqLworc3RhdGljIHZvaWQKK2J1ZmZlcl92ZXJpZnlfZGF0YSAodm9pZCAqYnVmZmVyLCB2b2lkICp1c2VyX2RhdGEpCit7CisgIGJ1ZmZlcl92ZXJpZnlfZGF0YV9zICp2ZGF0YTsKKworICBpZiAoIXVzZXJfZGF0YSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHZkYXRhID0gKGJ1ZmZlcl92ZXJpZnlfZGF0YV9zICopIHVzZXJfZGF0YTsKKworICBHU1RfREVCVUcgKCJkaXNjYXJkOiAlZCIsIHZkYXRhLT5kaXNjYXJkKTsKKyAgaWYgKHZkYXRhLT5kaXNjYXJkKSB7CisgICAgYnVmZmVyX2NvdW50ZXIrKzsKKyAgICBpZiAoYnVmZmVyX2NvdW50ZXIgPT0gdmRhdGEtPmRpc2NhcmQpIHsKKyAgICAgIGJ1ZmZlcl9jb3VudGVyID0gMDsKKyAgICAgIHZkYXRhLT5kaXNjYXJkID0gMDsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcikgPT0gdmRhdGEtPmRhdGFfdG9fdmVyaWZ5X3NpemUpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKGJ1ZmZlciwgMCwgdmRhdGEtPmRhdGFfdG9fdmVyaWZ5LAorICAgICAgICAgIHZkYXRhLT5kYXRhX3RvX3ZlcmlmeV9zaXplKSA9PSAwKTsKKworICBpZiAodmRhdGEtPmJ1ZmZlcnNfYmVmb3JlX29mZnNldF9za2lwKSB7CisgICAgLyogVGhpcyBpcyBmb3Igc2tpcHBpbmcgdGhlIGdhcmJhZ2UgaW4gc29tZSB0ZXN0IGNhc2VzICovCisgICAgaWYgKGJ1ZmZlcl9jb3VudGVyID09IHZkYXRhLT5idWZmZXJzX2JlZm9yZV9vZmZzZXRfc2tpcCkgeworICAgICAgb2Zmc2V0X2NvdW50ZXIgKz0gdmRhdGEtPm9mZnNldF9za2lwX2Ftb3VudDsKKyAgICB9CisgIH0KKyAgaWYgKCF2ZGF0YS0+bm9fbWV0YWRhdGEpIHsKKyAgICBmYWlsX3VubGVzcyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcikgPT0gdHNfY291bnRlcik7CisgICAgZmFpbF91bmxlc3MgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcikgIT0gMCk7CisgICAgZmFpbF91bmxlc3MgKEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpID09IG9mZnNldF9jb3VudGVyKTsKKyAgfQorCisgIHRzX2NvdW50ZXIgKz0gR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKTsKKyAgb2Zmc2V0X2NvdW50ZXIgKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKTsKKyAgYnVmZmVyX2NvdW50ZXIrKzsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfZWxlbWVudCAoY29uc3QgZ2NoYXIgKiBmYWN0b3J5LCBHc3RTdGF0aWNQYWRUZW1wbGF0ZSAqIHNpbmtfdGVtcGxhdGUsCisgICAgR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0U3RhdGljUGFkVGVtcGxhdGUgKiBzcmNfdGVtcGxhdGUsCisgICAgR3N0Q2FwcyAqIHNyY19jYXBzKQoreworICBHc3RFbGVtZW50ICplbGVtZW50OworICBHc3RCdXMgKmJ1czsKKyAgZ2NoYXIgKmNhcHNfc3RyID0gTlVMTDsKKworICBlbGVtZW50ID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKGZhY3RvcnkpOworICBzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAoZWxlbWVudCwgc3JjX3RlbXBsYXRlKTsKKyAgaWYgKHNpbmtfY2FwcykgeworICAgIGNhcHNfc3RyID0gZ3N0X2NhcHNfdG9fc3RyaW5nIChzaW5rX2NhcHMpOworICAgIHNpbmtfdGVtcGxhdGUtPnN0YXRpY19jYXBzLnN0cmluZyA9IGNhcHNfc3RyOworICB9CisgIHNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKGVsZW1lbnQsIHNpbmtfdGVtcGxhdGUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNyY3BhZCwgVFJVRSk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKHNyY3BhZCwgZWxlbWVudCwgc3JjX2NhcHMsIEdTVF9GT1JNQVRfQllURVMpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNpbmtwYWQsIFRSVUUpOworCisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChlbGVtZW50LCBidXMpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSwKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICB0c19jb3VudGVyID0gb2Zmc2V0X2NvdW50ZXIgPSBidWZmZXJfY291bnRlciA9IDA7CisgIGJ1ZmZlcnMgPSBOVUxMOworICBnX2ZyZWUgKGNhcHNfc3RyKTsKKyAgcmV0dXJuIGVsZW1lbnQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX2VsZW1lbnQgKEdzdEVsZW1lbnQgKiBlbGVtZW50KQoreworICBHc3RCdXMgKmJ1czsKKworICAvKiBGcmVlIHBhcnNlZCBidWZmZXJzICovCisgIGdzdF9jaGVja19kcm9wX2J1ZmZlcnMgKCk7CisKKyAgYnVzID0gR1NUX0VMRU1FTlRfQlVTIChlbGVtZW50KTsKKyAgZ3N0X2J1c19zZXRfZmx1c2hpbmcgKGJ1cywgVFJVRSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzaW5rcGFkLCBGQUxTRSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zcmNfcGFkIChlbGVtZW50KTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChlbGVtZW50KTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGVsZW1lbnQpOworfQorCisvKiBpbml0cyBhIHN0YW5kYXJkIHRlc3QgKi8KK3ZvaWQKK2dzdF9wYXJzZXJfdGVzdF9pbml0IChHc3RQYXJzZXJUZXN0ICogcHRlc3QsIGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsCisgICAgZ3VpbnQgbnVtKQoreworICAvKiBuZWVkIHRoZXNlICovCisgIGZhaWxfdW5sZXNzIChjdHhfZmFjdG9yeSAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGN0eF9zcmNfdGVtcGxhdGUgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChjdHhfc2lua190ZW1wbGF0ZSAhPSBOVUxMKTsKKworICAvKiBiYXNpY3MgKi8KKyAgbWVtc2V0IChwdGVzdCwgMCwgc2l6ZW9mICgqcHRlc3QpKTsKKyAgcHRlc3QtPmZhY3RvcnkgPSBjdHhfZmFjdG9yeTsKKyAgcHRlc3QtPnNpbmtfdGVtcGxhdGUgPSBjdHhfc2lua190ZW1wbGF0ZTsKKyAgcHRlc3QtPnNyY190ZW1wbGF0ZSA9IGN0eF9zcmNfdGVtcGxhdGU7CisgIHB0ZXN0LT5mcmFtZWQgPSBUUlVFOworICAvKiBjb3VsZCBiZSBOVUxMIGlmIG5vdCByZWxldmFudC9uZWVkZWQgKi8KKyAgcHRlc3QtPnNyY19jYXBzID0gY3R4X2lucHV0X2NhcHM7CisgIHB0ZXN0LT5zaW5rX2NhcHMgPSBjdHhfb3V0cHV0X2NhcHM7CisgIG1lbWNweSAocHRlc3QtPmhlYWRlcnMsIGN0eF9oZWFkZXJzLCBzaXplb2YgKHB0ZXN0LT5oZWFkZXJzKSk7CisgIHB0ZXN0LT5kaXNjYXJkID0gY3R4X2Rpc2NhcmQ7CisgIC8qIHNvbWUgZGF0YSB0aGF0IHBsZWFzZXMgY2FsbGVyICovCisgIHB0ZXN0LT5zZXJpZXNbMF0uZGF0YSA9IGRhdGE7CisgIHB0ZXN0LT5zZXJpZXNbMF0uc2l6ZSA9IHNpemU7CisgIHB0ZXN0LT5zZXJpZXNbMF0ubnVtID0gbnVtOworICBwdGVzdC0+c2VyaWVzWzBdLmZwYiA9IDE7CisgIHB0ZXN0LT5zZXJpZXNbMV0uZnBiID0gMTsKKyAgcHRlc3QtPnNlcmllc1syXS5mcGIgPSAxOworICBwdGVzdC0+bm9fbWV0YWRhdGEgPSBjdHhfbm9fbWV0YWRhdGE7Cit9CisKKy8qCisgKiBUZXN0IGlmIHRoZSBwYXJzZXIgcHVzaGVzIGNsZWFuIGRhdGEgcHJvcGVybHkuCisgKi8KK3ZvaWQKK2dzdF9wYXJzZXJfdGVzdF9ydW4gKEdzdFBhcnNlclRlc3QgKiB0ZXN0LCBHc3RDYXBzICoqIG91dF9jYXBzKQoreworICBidWZmZXJfdmVyaWZ5X2RhdGFfcyB2ZGF0YSA9IHsgMCwgMCwgMCwgTlVMTCwgMCwgTlVMTCwgRkFMU0UgfTsKKyAgR3N0RWxlbWVudCAqZWxlbWVudDsKKyAgR3N0QnVmZmVyICpidWZmZXIgPSBOVUxMOworICBHc3RDYXBzICpzcmNfY2FwczsKKyAgZ3VpbnQgaSwgaiwgazsKKyAgZ3VpbnQgZnJhbWVzID0gMCwgc2l6ZSA9IDA7CisKKyAgZWxlbWVudCA9IHNldHVwX2VsZW1lbnQgKHRlc3QtPmZhY3RvcnksIHRlc3QtPnNpbmtfdGVtcGxhdGUsIE5VTEwsCisgICAgICB0ZXN0LT5zcmNfdGVtcGxhdGUsIHRlc3QtPnNyY19jYXBzKTsKKworICAvKiBwdXNoIHNvbWUgc2V0dXAgaGVhZGVycyAqLworICBmb3IgKGogPSAwOyBqIDwgR19OX0VMRU1FTlRTICh0ZXN0LT5oZWFkZXJzKSAmJiB0ZXN0LT5oZWFkZXJzW2pdLmRhdGE7IGorKykgeworICAgIGJ1ZmZlciA9IGJ1ZmZlcl9uZXcgKHRlc3QtPmhlYWRlcnNbal0uZGF0YSwgdGVzdC0+aGVhZGVyc1tqXS5zaXplKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcGFkX3B1c2ggKHNyY3BhZCwgYnVmZmVyKSwgR1NUX0ZMT1dfT0spOworICB9CisKKyAgZm9yIChqID0gMDsgaiA8IDM7IGorKykgeworICAgIGZvciAoaSA9IDA7IGkgPCB0ZXN0LT5zZXJpZXNbal0ubnVtOyBpKyspIHsKKyAgICAgIC8qIHNhbml0eSBlbmZvcmNpbmcgKi8KKyAgICAgIGZvciAoayA9IDA7IGsgPCBNQVggKDEsIHRlc3QtPnNlcmllc1tqXS5mcGIpOyBrKyspIHsKKyAgICAgICAgaWYgKCFrKQorICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlcl9uZXcgKHRlc3QtPnNlcmllc1tqXS5kYXRhLCB0ZXN0LT5zZXJpZXNbal0uc2l6ZSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGJ1ZmZlciA9IGdzdF9idWZmZXJfYXBwZW5kIChidWZmZXIsCisgICAgICAgICAgICAgIGJ1ZmZlcl9uZXcgKHRlc3QtPnNlcmllc1tqXS5kYXRhLCB0ZXN0LT5zZXJpZXNbal0uc2l6ZSkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcGFkX3B1c2ggKHNyY3BhZCwgYnVmZmVyKSwgR1NUX0ZMT1dfT0spOworICAgICAgaWYgKGogPT0gMCkKKyAgICAgICAgdmRhdGEuYnVmZmVyc19iZWZvcmVfb2Zmc2V0X3NraXArKzsKKyAgICAgIGVsc2UgaWYgKGogPT0gMSkKKyAgICAgICAgdmRhdGEub2Zmc2V0X3NraXBfYW1vdW50ICs9IHRlc3QtPnNlcmllc1tqXS5zaXplICogdGVzdC0+c2VyaWVzW2pdLmZwYjsKKyAgICAgIGlmIChqICE9IDEpIHsKKyAgICAgICAgZnJhbWVzICs9IHRlc3QtPnNlcmllc1tqXS5mcGI7CisgICAgICAgIHNpemUgKz0gdGVzdC0+c2VyaWVzW2pdLnNpemUgKiB0ZXN0LT5zZXJpZXNbal0uZnBiOworICAgICAgfQorICAgIH0KKyAgfQorICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworCisgIGlmIChHX0xJS0VMWSAodGVzdC0+ZnJhbWVkKSkKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSAtIHRlc3QtPmRpc2NhcmQsIGZyYW1lcyk7CisKKyAgLyogaWYgYWxsIGZyYW1lcyBhcmUgaWRlbnRpY2FsLCBkbyBleHRlbmRlZCB0ZXN0LAorICAgKiBvdGhlcndpc2Ugb25seSB2ZXJpZnkgdG90YWwgZGF0YSBzaXplICovCisgIGlmICh0ZXN0LT5zZXJpZXNbMF0uZGF0YSAmJiAoIXRlc3QtPnNlcmllc1syXS5zaXplIHx8CisgICAgICAgICAgKHRlc3QtPnNlcmllc1swXS5zaXplID09IHRlc3QtPnNlcmllc1syXS5zaXplICYmIHRlc3QtPnNlcmllc1syXS5kYXRhCisgICAgICAgICAgICAgICYmICFtZW1jbXAgKHRlc3QtPnNlcmllc1swXS5kYXRhLCB0ZXN0LT5zZXJpZXNbMl0uZGF0YSwKKyAgICAgICAgICAgICAgICAgIHRlc3QtPnNlcmllc1swXS5zaXplKSkpKSB7CisgICAgdmRhdGEuZGF0YV90b192ZXJpZnkgPSB0ZXN0LT5zZXJpZXNbMF0uZGF0YTsKKyAgICB2ZGF0YS5kYXRhX3RvX3ZlcmlmeV9zaXplID0gdGVzdC0+c2VyaWVzWzBdLnNpemU7CisgICAgdmRhdGEuY2FwcyA9IHRlc3QtPnNpbmtfY2FwczsKKyAgICB2ZGF0YS5kaXNjYXJkID0gdGVzdC0+ZGlzY2FyZDsKKyAgICB2ZGF0YS5ub19tZXRhZGF0YSA9IHRlc3QtPm5vX21ldGFkYXRhOworICAgIGdfbGlzdF9mb3JlYWNoIChidWZmZXJzLCBidWZmZXJfdmVyaWZ5X2RhdGEsICZ2ZGF0YSk7CisgIH0gZWxzZSB7CisgICAgZ3VpbnQgZGF0YXN1bSA9IDA7CisKKyAgICBnX2xpc3RfZm9yZWFjaCAoYnVmZmVycywgYnVmZmVyX2NvdW50X3NpemUsICZkYXRhc3VtKTsKKyAgICBzaXplIC09IHRlc3QtPmRyb3BwZWQ7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YXN1bSwgc2l6ZSk7CisgIH0KKworICBzcmNfY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoc2lua3BhZCk7CisgIEdTVF9MT0cgKCJvdXRwdXQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIHNyY19jYXBzKTsKKworICBpZiAodGVzdC0+c2lua19jYXBzKSB7CisgICAgR1NUX0xPRyAoIiUiIEdTVF9QVFJfRk9STUFUICIgPSAlIiBHU1RfUFRSX0ZPUk1BVCAiID8iLCBzcmNfY2FwcywKKyAgICAgICAgdGVzdC0+c2lua19jYXBzKTsKKyAgICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfaXNfZXF1YWwgKHNyY19jYXBzLCB0ZXN0LT5zaW5rX2NhcHMpKTsKKyAgfQorCisgIGlmIChvdXRfY2FwcykKKyAgICAqb3V0X2NhcHMgPSBzcmNfY2FwczsKKyAgZWxzZQorICAgIGdzdF9jYXBzX3VucmVmIChzcmNfY2Fwcyk7CisKKyAgY2xlYW51cF9lbGVtZW50IChlbGVtZW50KTsKK30KKworLyoKKyAqIFRlc3QgaWYgdGhlIHBhcnNlciBwdXNoZXMgY2xlYW4gZGF0YSBwcm9wZXJseS4KKyAqLwordm9pZAorZ3N0X3BhcnNlcl90ZXN0X25vcm1hbCAoZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgc2l6ZSkKK3sKKyAgR3N0UGFyc2VyVGVzdCBwdGVzdDsKKworICBnc3RfcGFyc2VyX3Rlc3RfaW5pdCAoJnB0ZXN0LCBkYXRhLCBzaXplLCAxMCk7CisgIGdzdF9wYXJzZXJfdGVzdF9ydW4gKCZwdGVzdCwgTlVMTCk7Cit9CisKKy8qCisgKiBUZXN0IGlmIHBhcnNlciBkcmFpbnMgaXRzIGJ1ZmZlcnMgcHJvcGVybHkuIEV2ZW4gb25lIHNpbmdsZSBmcmFtZQorICogc2hvdWxkIGJlIGRyYWluZWQgYW5kIHB1c2hlZCBmb3J3YXJkIHdoZW4gRU9TIG9jY3Vycy4gVGhpcyBzaW5nbGUgZnJhbWUKKyAqIGNhc2UgaXMgc3BlY2lhbCwgc2luY2Ugbm9ybWFsbHkgdGhlIHBhcnNlciBuZWVkcyBtb3JlIGRhdGEgdG8gYmUgc3VyZQorICogYWJvdXQgc3RyZWFtIGZvcm1hdC4gQnV0IGl0IHNob3VsZCBzdGlsbCBwdXNoIHRoZSBmcmFtZSBmb3J3YXJkIGluIEVPUy4KKyAqLwordm9pZAorZ3N0X3BhcnNlcl90ZXN0X2RyYWluX3NpbmdsZSAoZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgc2l6ZSkKK3sKKyAgR3N0UGFyc2VyVGVzdCBwdGVzdDsKKworICBnc3RfcGFyc2VyX3Rlc3RfaW5pdCAoJnB0ZXN0LCBkYXRhLCBzaXplLCAxKTsKKyAgZ3N0X3BhcnNlcl90ZXN0X3J1biAoJnB0ZXN0LCBOVUxMKTsKK30KKworLyoKKyAqIE1ha2Ugc3VyZSB0aGF0IHBhcnNlciBkb2VzIG5vdCBkcmFpbiBnYXJiYWdlIHdoZW4gRU9TIG9jY3Vycy4KKyAqLwordm9pZAorZ3N0X3BhcnNlcl90ZXN0X2RyYWluX2dhcmJhZ2UgKGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsIGd1aW50OCAqIGdhcmJhZ2UsCisgICAgZ3VpbnQgZ3NpemUpCit7CisgIEdzdFBhcnNlclRlc3QgcHRlc3Q7CisKKyAgLyogcHJvdmlkZSBlbm91Z2ggaW5pdGlhbCBmcmFtZXMgc2luY2UgaXQgbWF5IHRha2Ugc29tZSBwYXJzZXJzIHNvbWUKKyAgICogdGltZSB0byBiZSBjb252aW5jZWQgb2YgcHJvcGVyIHN5bmMgKi8KKyAgZ3N0X3BhcnNlcl90ZXN0X2luaXQgKCZwdGVzdCwgZGF0YSwgc2l6ZSwgMTApOworICBwdGVzdC5zZXJpZXNbMV0uZGF0YSA9IGdhcmJhZ2U7CisgIHB0ZXN0LnNlcmllc1sxXS5zaXplID0gZ3NpemU7CisgIHB0ZXN0LnNlcmllc1sxXS5udW0gPSAxOworICBnc3RfcGFyc2VyX3Rlc3RfcnVuICgmcHRlc3QsIE5VTEwpOworfQorCisvKgorICogVGVzdCBpZiBwYXJzZXIgc3BsaXRzIGEgYnVmZmVyIHRoYXQgY29udGFpbnMgdHdvIGZyYW1lcyBpbnRvIHR3bworICogc2VwYXJhdGUgYnVmZmVycyBwcm9wZXJseS4KKyAqLwordm9pZAorZ3N0X3BhcnNlcl90ZXN0X3NwbGl0IChndWludDggKiBkYXRhLCBndWludCBzaXplKQoreworICBHc3RQYXJzZXJUZXN0IHB0ZXN0OworCisgIGdzdF9wYXJzZXJfdGVzdF9pbml0ICgmcHRlc3QsIGRhdGEsIHNpemUsIDEwKTsKKyAgcHRlc3Quc2VyaWVzWzBdLmZwYiA9IDI7CisgIGdzdF9wYXJzZXJfdGVzdF9ydW4gKCZwdGVzdCwgTlVMTCk7Cit9CisKKy8qCisgKiBUZXN0IGlmIHRoZSBwYXJzZXIgc2tpcHMgZ2FyYmFnZSBiZXR3ZWVuIGZyYW1lcyBwcm9wZXJseS4KKyAqLwordm9pZAorZ3N0X3BhcnNlcl90ZXN0X3NraXBfZ2FyYmFnZSAoZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgc2l6ZSwgZ3VpbnQ4ICogZ2FyYmFnZSwKKyAgICBndWludCBnc2l6ZSkKK3sKKyAgR3N0UGFyc2VyVGVzdCBwdGVzdDsKKworICBnc3RfcGFyc2VyX3Rlc3RfaW5pdCAoJnB0ZXN0LCBkYXRhLCBzaXplLCAxMCk7CisgIHB0ZXN0LnNlcmllc1sxXS5kYXRhID0gZ2FyYmFnZTsKKyAgcHRlc3Quc2VyaWVzWzFdLnNpemUgPSBnc2l6ZTsKKyAgcHRlc3Quc2VyaWVzWzFdLm51bSA9IDE7CisgIHB0ZXN0LnNlcmllc1syXS5kYXRhID0gZGF0YTsKKyAgcHRlc3Quc2VyaWVzWzJdLnNpemUgPSBzaXplOworICBwdGVzdC5zZXJpZXNbMl0ubnVtID0gMTA7CisgIGdzdF9wYXJzZXJfdGVzdF9ydW4gKCZwdGVzdCwgTlVMTCk7Cit9CisKKy8qCisgKiBUZXN0IGlmIHRoZSBzcmMgY2FwcyBhcmUgc2V0IGFjY29yZGluZyB0byBzdHJlYW0gZm9ybWF0LgorICovCit2b2lkCitnc3RfcGFyc2VyX3Rlc3Rfb3V0cHV0X2NhcHMgKGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsCisgICAgY29uc3QgZ2NoYXIgKiBpbnB1dF9jYXBzLCBjb25zdCBnY2hhciAqIG91dHB1dF9jYXBzKQoreworICBHc3RQYXJzZXJUZXN0IHB0ZXN0OworCisgIGdzdF9wYXJzZXJfdGVzdF9pbml0ICgmcHRlc3QsIGRhdGEsIHNpemUsIDEwKTsKKyAgaWYgKGlucHV0X2NhcHMpIHsKKyAgICBwdGVzdC5zcmNfY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChpbnB1dF9jYXBzKTsKKyAgICBmYWlsX3VubGVzcyAocHRlc3Quc3JjX2NhcHMgIT0gTlVMTCk7CisgIH0KKyAgaWYgKG91dHB1dF9jYXBzKSB7CisgICAgcHRlc3Quc2lua19jYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKG91dHB1dF9jYXBzKTsKKyAgICBmYWlsX3VubGVzcyAocHRlc3Quc2lua19jYXBzICE9IE5VTEwpOworICB9CisgIGdzdF9wYXJzZXJfdGVzdF9ydW4gKCZwdGVzdCwgTlVMTCk7CisgIGlmIChwdGVzdC5zaW5rX2NhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKHB0ZXN0LnNpbmtfY2Fwcyk7CisgIGlmIChwdGVzdC5zcmNfY2FwcykKKyAgICBnc3RfY2Fwc191bnJlZiAocHRlc3Quc3JjX2NhcHMpOworfQorCisvKgorICogVGVzdCBpZiB0aGUgc3JjIGNhcHMgYXJlIHNldCBhY2NvcmRpbmcgdG8gc3RyZWFtIGZvcm1hdC4KKyAqLworR3N0Q2FwcyAqCitnc3RfcGFyc2VyX3Rlc3RfZ2V0X291dHB1dF9jYXBzIChndWludDggKiBkYXRhLCBndWludCBzaXplLAorICAgIGNvbnN0IGdjaGFyICogaW5wdXRfY2FwcykKK3sKKyAgR3N0UGFyc2VyVGVzdCBwdGVzdDsKKyAgR3N0Q2FwcyAqb3V0X2NhcHM7CisKKyAgZ3N0X3BhcnNlcl90ZXN0X2luaXQgKCZwdGVzdCwgZGF0YSwgc2l6ZSwgMTApOworICBpZiAoaW5wdXRfY2FwcykgeworICAgIHB0ZXN0LnNyY19jYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKGlucHV0X2NhcHMpOworICAgIGZhaWxfdW5sZXNzIChwdGVzdC5zcmNfY2FwcyAhPSBOVUxMKTsKKyAgfQorICBnc3RfcGFyc2VyX3Rlc3RfcnVuICgmcHRlc3QsICZvdXRfY2Fwcyk7CisgIGlmIChwdGVzdC5zcmNfY2FwcykKKyAgICBnc3RfY2Fwc191bnJlZiAocHRlc3Quc3JjX2NhcHMpOworCisgIHJldHVybiBvdXRfY2FwczsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3BhcnNlci5oIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ4NjdjZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3BhcnNlci5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIChhdWRpbykgcGFyc2VyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnRhY3Q6IFN0ZWZhbiBLb3N0IDxzdGVmYW4ua29zdEBub2tpYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCisjZGVmaW5lIE1BWF9IRUFERVJTIDEwCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBndWludDggICAgICpkYXRhOworICAgIGd1aW50ICAgICAgIHNpemU7Cit9IGRhdGFibG9iOworCisvKiBjb250ZXh0IHN0YXRlIHZhcmlhYmxlczsgdG8gYmUgc2V0IGJ5IHRlc3QgdXNpbmcgdGhpcyBoZWxwZXIgKi8KKy8qIG1hbmRhdG9yeSAqLworZXh0ZXJuIGNvbnN0IGdjaGFyICpjdHhfZmFjdG9yeTsKK2V4dGVybiBHc3RTdGF0aWNQYWRUZW1wbGF0ZSAqY3R4X3NpbmtfdGVtcGxhdGU7CitleHRlcm4gR3N0U3RhdGljUGFkVGVtcGxhdGUgKmN0eF9zcmNfdGVtcGxhdGU7CisvKiBvcHRpb25hbCAqLworZXh0ZXJuIEdzdENhcHMgKmN0eF9pbnB1dF9jYXBzOworZXh0ZXJuIEdzdENhcHMgKmN0eF9vdXRwdXRfY2FwczsKK2V4dGVybiBndWludCBjdHhfZGlzY2FyZDsKK2V4dGVybiBkYXRhYmxvYiBjdHhfaGVhZGVyc1tNQVhfSEVBREVSU107CitleHRlcm4gZ2Jvb2xlYW4gY3R4X25vX21ldGFkYXRhOworCisvKiBubyByZWZzIHRha2VuL2tlcHQsIGFsbCB1cCB0byBjYWxsZXIgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IGdjaGFyICAgICAgICAgICpmYWN0b3J5OworICBHc3RTdGF0aWNQYWRUZW1wbGF0ZSAqc2lua190ZW1wbGF0ZTsKKyAgR3N0U3RhdGljUGFkVGVtcGxhdGUgKnNyY190ZW1wbGF0ZTsKKyAgLyogY2FwcyB0aGF0IGdvIGludG8gZWxlbWVudCAqLworICBHc3RDYXBzICAgICAgICAgICAgICAqc3JjX2NhcHM7CisgIC8qIG9wdGlvbmFsOiBvdXRwdXQgY2FwcyB0byB2ZXJpZnkgKi8KKyAgR3N0Q2FwcyAgICAgICAgICAgICAgKnNpbmtfY2FwczsKKyAgLyogaW5pdGlhbCBoZWFkZXJzICovCisgIGRhdGFibG9iICAgICAgICAgICAgICBoZWFkZXJzW01BWF9IRUFERVJTXTsKKyAgLyogaW5pdGlhbCAoaGVhZGVyKSBvdXRwdXQgdG8gZm9yZWdvIGNoZWNraW5nICovCisgIGd1aW50ICAgICAgICAgICAgICAgICBkaXNjYXJkOworICAvKiBzZXJpZXMgb2YgYnVmZmVyczsgbWlkZGxlIHNlcmllcyBjb25zaWRlcmVkIGdhcmJhZ2UgKi8KKyAgc3RydWN0IHsKKyAgICAvKiBkYXRhIGFuZCBzaXplICovCisgICAgZ3VpbnQ4ICAgICAqZGF0YTsKKyAgICBndWludCAgICAgIHNpemU7CisgICAgLyogbnVtIG9mIGZyYW1lcyB3aXRoIGFib3ZlIGRhdGEgcGVyIGJ1ZmZlciAqLworICAgIGd1aW50ICAgICAgZnBiOworICAgIC8qIG51bSBvZiBidWZmZXJzICovCisgICAgZ3VpbnQgICAgICBudW07CisgIH0gc2VyaWVzWzNdOworICAvKiBzaWdoLCB3ZWlyZCBjYXNlcyAqLworICBnYm9vbGVhbiAgICAgICAgICAgICAgZnJhbWVkOworICBndWludCAgICAgICAgICAgICAgICAgZHJvcHBlZDsKKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgIG5vX21ldGFkYXRhOworfSBHc3RQYXJzZXJUZXN0OworCit2b2lkIGdzdF9wYXJzZXJfdGVzdF9pbml0IChHc3RQYXJzZXJUZXN0ICogcHRlc3QsIGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsIGd1aW50IG51bSk7CisKK3ZvaWQgZ3N0X3BhcnNlcl90ZXN0X3J1biAoR3N0UGFyc2VyVGVzdCAqIHRlc3QsIEdzdENhcHMgKiogb3V0X2NhcHMpOworCit2b2lkIGdzdF9wYXJzZXJfdGVzdF9ub3JtYWwgKGd1aW50OCAqZGF0YSwgZ3VpbnQgc2l6ZSk7CisKK3ZvaWQgZ3N0X3BhcnNlcl90ZXN0X2RyYWluX3NpbmdsZSAoZ3VpbnQ4ICpkYXRhLCBndWludCBzaXplKTsKKwordm9pZCBnc3RfcGFyc2VyX3Rlc3RfZHJhaW5fZ2FyYmFnZSAoZ3VpbnQ4ICpkYXRhLCBndWludCBzaXplLCBndWludDggKmdhcmJhZ2UsIGd1aW50IGdzaXplKTsKKwordm9pZCBnc3RfcGFyc2VyX3Rlc3Rfc3BsaXQgKGd1aW50OCAqZGF0YSwgZ3VpbnQgc2l6ZSk7CisKK3ZvaWQgZ3N0X3BhcnNlcl90ZXN0X3NraXBfZ2FyYmFnZSAoZ3VpbnQ4ICpkYXRhLCBndWludCBzaXplLCBndWludDggKmdhcmJhZ2UsIGd1aW50IGdzaXplKTsKKwordm9pZCBnc3RfcGFyc2VyX3Rlc3Rfb3V0cHV0X2NhcHMgKGd1aW50OCAqZGF0YSwgZ3VpbnQgc2l6ZSwgY29uc3QgZ2NoYXIgKiBpbnB1dF9jYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICogb3V0cHV0X2NhcHMpOworCitHc3RDYXBzICpnc3RfcGFyc2VyX3Rlc3RfZ2V0X291dHB1dF9jYXBzIChndWludDggKmRhdGEsIGd1aW50IHNpemUsIGNvbnN0IGdjaGFyICogaW5wdXRfY2Fwcyk7CisKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3F0ZGVtdXguYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3F0ZGVtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmI2NjkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcXRkZW11eC5jCkBAIC0wLDAgKzEsMTU0IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIHF0ZGVtdXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDwyMDE2PiBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJxdGRlbXV4LmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEdzdFBhZCAqc3JjcGFkOworICBndWludCBleHBlY3RlZF9zaXplOworICBHc3RDbG9ja1RpbWUgZXhwZWN0ZWRfdGltZTsKK30gQ29tbW9uVGVzdERhdGE7CisKK3N0YXRpYyBHc3RQYWRQcm9iZVJldHVybgorcXRkZW11eF9wcm9iZSAoR3N0UGFkICogcGFkLCBHc3RQYWRQcm9iZUluZm8gKiBpbmZvLCBDb21tb25UZXN0RGF0YSAqIGRhdGEpCit7CisgIEdzdEJ1ZmZlciAqYnVmID0gR1NUX1BBRF9QUk9CRV9JTkZPX0JVRkZFUiAoaW5mbyk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSwgZGF0YS0+ZXhwZWN0ZWRfc2l6ZSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKEdTVF9CVUZGRVJfUFRTIChidWYpLCBkYXRhLT5leHBlY3RlZF90aW1lKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgcmV0dXJuIEdTVF9QQURfUFJPQkVfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQKK3F0ZGVtdXhfcGFkX2FkZGVkX2NiIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkLCBDb21tb25UZXN0RGF0YSAqIGRhdGEpCit7CisgIGRhdGEtPnNyY3BhZCA9IHBhZDsKKyAgZ3N0X3BhZF9hZGRfcHJvYmUgKHBhZCwgR1NUX1BBRF9QUk9CRV9UWVBFX0JVRkZFUiwKKyAgICAgIChHc3RQYWRQcm9iZUNhbGxiYWNrKSBxdGRlbXV4X3Byb2JlLCBkYXRhLCBOVUxMKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcXRkZW11eF9pbnB1dF9nYXApCit7CisgIEdzdEVsZW1lbnQgKnF0ZGVtdXg7CisgIEdzdFBhZCAqc2lua3BhZDsKKyAgQ29tbW9uVGVzdERhdGEgZGF0YSA9IHsgMCwgfTsKKyAgR3N0QnVmZmVyICppbmJ1ZjsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworICBHc3RFdmVudCAqZXZlbnQ7CisgIGd1aW50IGksIG9mZnNldDsKKyAgR3N0Q2xvY2tUaW1lIHB0czsKKworICAvKiBUaGUgZ29hbCBvZiB0aGlzIHRlc3QgaXMgdG8gY2hlY2sgdGhhdCBxdGRlbXV4IGNhbiBwcm9wZXJseSBoYW5kbGUKKyAgICogZnJhZ21lbnRlZCBpbnB1dCBmcm9tIGRhc2hkZW11eCwgd2l0aCBnYXBzIGluIGl0LgorICAgKgorICAgKiBJbnB1dCBzZWdtZW50IDoKKyAgICogICAtIFRJTUUKKyAgICogSW5wdXQgYnVmZmVycyA6CisgICAqICAgLSBUaGUgb2Zmc2V0IGlzIHNldCBvbiBidWZmZXJzLCBpdCBjb3JyZXNwb25kcyB0byB0aGUgb2Zmc2V0CisgICAqICAgICB3aXRoaW4gdGhlIGN1cnJlbnQgZnJhZ21lbnQuCisgICAqICAgLSBCdWZmZXIgb2YgdGhlIGJlZ2lubmluZyBvZiBhIGZyYWdtZW50IGhhcyB0aGUgUFRTIHNldCwgb3RoZXJzCisgICAqICAgICBkb24ndC4KKyAgICogICAtIEJ5IGV4dGVuc2lvbiwgdGhlIGJlZ2lubmluZyBvZiBhIGZyYWdtZW50IGFsc28gaGFzIGFuIG9mZnNldAorICAgKiAgICAgb2YgMC4KKyAgICovCisKKyAgcXRkZW11eCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInF0ZGVtdXgiLCBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChxdGRlbXV4LCBHU1RfU1RBVEVfUExBWUlORyk7CisgIHNpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocXRkZW11eCwgInNpbmsiKTsKKworICAvKiBXZSdsbCB3YW50IHRvIGtub3cgd2hlbiB0aGUgc291cmNlIHBhZCBpcyBhZGRlZCAqLworICBnX3NpZ25hbF9jb25uZWN0IChxdGRlbXV4LCAicGFkLWFkZGVkIiwgKEdDYWxsYmFjaykgcXRkZW11eF9wYWRfYWRkZWRfY2IsCisgICAgICAmZGF0YSk7CisKKyAgLyogU2VuZCB0aGUgaW5pdGlhbCBTVFJFQU1fU1RBUlQgYW5kIHNlZ21lbnQgKFRJTUUpIGV2ZW50ICovCisgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKCJURVNUIik7CisgIEdTVF9ERUJVRyAoIlB1c2hpbmcgc3RyZWFtLXN0YXJ0IGV2ZW50Iik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3NlbmRfZXZlbnQgKHNpbmtwYWQsIGV2ZW50KSA9PSBUUlVFKTsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCk7CisgIEdTVF9ERUJVRyAoIlB1c2hpbmcgc2VnbWVudCBldmVudCIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9zZW5kX2V2ZW50IChzaW5rcGFkLCBldmVudCkgPT0gVFJVRSk7CisKKyAgLyogRmVlZCB0aGUgaW5pdCBidWZmZXIsIHNob3VsZCBjcmVhdGUgdGhlIHNvdXJjZSBwYWQgKi8KKyAgaW5idWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGluaXRfbXA0X2xlbik7CisgIGdzdF9idWZmZXJfZmlsbCAoaW5idWYsIDAsIGluaXRfbXA0LCBpbml0X21wNF9sZW4pOworICBHU1RfQlVGRkVSX1BUUyAoaW5idWYpID0gMDsKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKGluYnVmKSA9IDA7CisgIEdTVF9ERUJVRyAoIlB1c2hpbmcgaGVhZGVyIGJ1ZmZlciIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9jaGFpbiAoc2lua3BhZCwgaW5idWYpID09IEdTVF9GTE9XX09LKTsKKworICAvKiBOb3cgc2VuZCB0aGUgdHJ1biBvZiB0aGUgZmlyc3QgZnJhZ21lbnQgKi8KKyAgaW5idWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHNlZ18xX21vb2Zfc2l6ZSk7CisgIGdzdF9idWZmZXJfZmlsbCAoaW5idWYsIDAsIHNlZ18xX200Ziwgc2VnXzFfbW9vZl9zaXplKTsKKyAgR1NUX0JVRkZFUl9QVFMgKGluYnVmKSA9IDA7CisgIEdTVF9CVUZGRVJfT0ZGU0VUIChpbmJ1ZikgPSAwOworICAvKiBXZSBhcmUgc2ltdWxhdGluZyB0aGF0IHRoaXMgZnJhZ21lbnQgY2FuIGhhcHBlbiBhdCBhbnkgcG9pbnQgKi8KKyAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoaW5idWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgR1NUX0RFQlVHICgiUHVzaGluZyB0cnVuIGJ1ZmZlciIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9jaGFpbiAoc2lua3BhZCwgaW5idWYpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF9pZiAoZGF0YS5zcmNwYWQgPT0gTlVMTCk7CisKKyAgLyogV2UgYXJlIG5vdyByZWFkeSB0byBzZW5kIHNvbWUgYnVmZmVycyB3aXRoIGdhcHMgKi8KKyAgb2Zmc2V0ID0gc2VnXzFfc2FtcGxlXzBfb2Zmc2V0OworICBwdHMgPSAwOworCisgIEdTVF9ERUJVRyAoIlB1c2hpbmcgZ2FwJ2VkIGJ1ZmZlcnMiKTsKKyAgZm9yIChpID0gMDsgaSA8IDEyOTsgaSsrKSB7CisgICAgLyogTGV0J3Mgc2VuZCBvbmUgZXZlcnkgMyAqLworICAgIGlmICgoaSAlIDMpID09IDApIHsKKyAgICAgIEdTVF9ERUJVRyAoIlB1c2hpbmcgYnVmZmVyICMlZCBvZmZzZXQ6JSIgR19HVUlOVDMyX0ZPUk1BVCwgaSwgb2Zmc2V0KTsKKyAgICAgIGluYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzZWdfMV9zYW1wbGVfc2l6ZXNbaV0pOworICAgICAgZ3N0X2J1ZmZlcl9maWxsIChpbmJ1ZiwgMCwgc2VnXzFfbTRmICsgb2Zmc2V0LCBzZWdfMV9zYW1wbGVfc2l6ZXNbaV0pOworICAgICAgR1NUX0JVRkZFUl9PRkZTRVQgKGluYnVmKSA9IG9mZnNldDsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGluYnVmLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgICBkYXRhLmV4cGVjdGVkX3RpbWUgPQorICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAocHRzLCBHU1RfU0VDT05ELCBzZWdfMV90aW1lc2NhbGUpOworICAgICAgZGF0YS5leHBlY3RlZF9zaXplID0gc2VnXzFfc2FtcGxlX3NpemVzW2ldOworICAgICAgZmFpbF91bmxlc3MgKGdzdF9wYWRfY2hhaW4gKHNpbmtwYWQsIGluYnVmKSA9PSBHU1RfRkxPV19PSyk7CisgICAgfQorICAgIC8qIEZpbmFsbHkgbW92ZSBvZmZzZXQgZm9yd2FyZCAqLworICAgIG9mZnNldCArPSBzZWdfMV9zYW1wbGVfc2l6ZXNbaV07CisgICAgcHRzICs9IHNlZ18xX3NhbXBsZV9kdXJhdGlvbjsKKyAgfQorCisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHF0ZGVtdXgsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocXRkZW11eCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK3F0ZGVtdXhfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgicXRkZW11eCIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9xdGRlbXV4X2lucHV0X2dhcCk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChxdGRlbXV4KQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvcXRkZW11eC5oIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcXRkZW11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NDI1ZjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9xdGRlbXV4LmgKQEAgLTAsMCArMSw0MjUxIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIHF0ZGVtdXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDwyMDE2PiBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z2xpYi9nc3RkaW8uaD4KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCisvKiBGcmFnbWVudHMgdGFrZW4gZnJvbSBodHRwOi8vd3d3LmJvay5uZXQvZGFzaC90ZWFyc19vZl9zdGVlbC9jbGVhcnRleHQvc3RyZWFtLm1wZAorICoKKyAqIEF1ZGlvIHN0cmVhbSAoYWFjKQorICogSGVhZGVyICsgZmlyc3QgZnJhZ21lbnQKKyAqLworCisvKiBodHRwOi8vd3d3LmJvay5uZXQvZGFzaC90ZWFyc19vZl9zdGVlbC9jbGVhcnRleHQvYXVkaW8vZW4vaW5pdC5tcDQgKi8KK3N0YXRpYyBndWludDggaW5pdF9tcDRbXSA9IHsKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHg2NiwgMHg3NCwgMHg3OSwgMHg3MCwgMHg2OSwgMHg3MywgMHg2ZiwgMHg2ZCwKKyAgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg2OSwgMHg3MywgMHg2ZiwgMHg2ZCwgMHg2OSwgMHg3MywgMHg2ZiwgMHgzMiwKKyAgMHg2MSwgMHg3NiwgMHg2MywgMHgzMSwgMHg2ZCwgMHg3MCwgMHgzNCwgMHgzMSwgMHgwMCwgMHgwMCwgMHgwMiwgMHg1MCwKKyAgMHg2ZCwgMHg2ZiwgMHg2ZiwgMHg3NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2YywgMHg2ZCwgMHg3NiwgMHg2OCwgMHg2NCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMywgMHhlOCwgMHgwMCwgMHgwYiwgMHgzMywgMHhkNywgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwKKyAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMSwgMHhhNCwgMHg3NCwgMHg3MiwgMHg2MSwgMHg2YiwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHg1YywgMHg3NCwgMHg2YiwgMHg2OCwgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYiwgMHgzMywgMHhiYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0MCwKKyAgMHg2ZCwgMHg2NCwgMHg2OSwgMHg2MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHg2ZCwgMHg2NCwgMHg2OCwgMHg2NCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHhhYywgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNSwgMHhjNywgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgzNSwgMHg2OCwgMHg2NCwgMHg2YywgMHg3MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MywgMHg2ZiwgMHg3NSwgMHg2ZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MiwgMHg2NSwgMHg2ZSwgMHg3NCwKKyAgMHg2ZiwgMHgzNCwgMHgyMCwgMHg1MywgMHg2ZiwgMHg3NSwgMHg2ZSwgMHg2NCwgMHgyMCwgMHg0OCwgMHg2MSwgMHg2ZSwKKyAgMHg2NCwgMHg2YywgMHg2NSwgMHg3MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhlMywgMHg2ZCwgMHg2OSwgMHg2ZSwKKyAgMHg2NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHg3MywgMHg2ZCwgMHg2OCwgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyNCwgMHg2NCwgMHg2OSwgMHg2ZSwKKyAgMHg2NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxYywgMHg2NCwgMHg3MiwgMHg2NSwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYywgMHg3NSwgMHg3MiwgMHg2YywKKyAgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNywgMHg3MywgMHg3NCwgMHg2MiwKKyAgMHg2YywgMHgwMCwgMHgwMCwgMHgwMCwgMHg1YiwgMHg3MywgMHg3NCwgMHg3MywgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0YiwgMHg2ZCwgMHg3MCwgMHgzNCwKKyAgMHg2MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHhhYywgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyNywgMHg2NSwgMHg3MywgMHg2NCwKKyAgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgxOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgxMSwKKyAgMHg0MCwgMHgxNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhmNCwgMHgwMSwgMHgwMCwgMHgwMSwgMHhmNCwKKyAgMHgwMSwgMHgwNSwgMHgwMiwgMHgxMiwgMHgxMCwgMHgwNiwgMHgwMSwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwKKyAgMHg3MywgMHg3NCwgMHg3MywgMHg3YSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHg3MywgMHg3NCwgMHg3MywgMHg2MywKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwKKyAgMHg3MywgMHg3NCwgMHg3NCwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHg3MywgMHg3NCwgMHg2MywgMHg2ZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzOCwgMHg2ZCwgMHg3NiwgMHg2NSwgMHg3OCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHg2ZCwgMHg2NSwgMHg2OCwgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwYiwgMHgzMywgMHhkNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHg3NCwgMHg3MiwgMHg2NSwgMHg3OCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKKworZ3VpbnQgaW5pdF9tcDRfbGVuID0gNjI0OworCisvKiBodHRwOi8vd3d3LmJvay5uZXQvZGFzaC90ZWFyc19vZl9zdGVlbC9jbGVhcnRleHQvYXVkaW8vZW4vc2VnLTEubTRmICovCitzdGF0aWMgY29uc3QgZ3VpbnQ4IHNlZ18xX200ZltdID0geworICAweDAwLCAweDAwLCAweDA0LCAweDYwLCAweDZkLCAweDZmLCAweDZmLCAweDY2LCAweDAwLCAweDAwLCAweDAwLCAweDEwLAorICAweDZkLCAweDY2LCAweDY4LCAweDY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLAorICAweDAwLCAweDAwLCAweDA0LCAweDQ4LCAweDc0LCAweDcyLCAweDYxLCAweDY2LCAweDAwLCAweDAwLCAweDAwLCAweDEwLAorICAweDc0LCAweDY2LCAweDY4LCAweDY0LCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLAorICAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDc0LCAweDY2LCAweDY0LCAweDc0LCAweDAxLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDFjLAorICAweDc0LCAweDcyLCAweDc1LCAweDZlLCAweDAwLCAweDAwLCAweDAzLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDgxLAorICAweDAwLCAweDAwLCAweDA0LCAweDY4LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDczLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDc0LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweGRkLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDEyLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweGU5LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweGNlLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweGI5LAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweGE1LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweGE0LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDlhLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDkyLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDhlLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDdkLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDdkLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDgyLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDgyLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDcxLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDcyLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDZhLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDVhLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDY1LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDYzLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDc4LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDUwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDU1LAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDY2LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDVlLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDZhLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDRkLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDlmLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDgyLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDZjLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDU4LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDgyLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDY2LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDZkLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDk0LAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDU2LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDY5LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDZlLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDY5LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDVlLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDg2LAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDVjLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDZlLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDY3LAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDY1LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDY4LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDVkLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDY0LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDZkLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDg5LAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDYxLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDgxLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDdkLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDVjLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDU5LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDllLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDc0LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDcxLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDkxLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDg3LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDRkLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDUzLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweGE3LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDU3LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweGJkLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweGE5LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweGE2LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDlmLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDk2LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDg1LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDhiLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDc3LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDY0LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweGJhLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweGIwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDg3LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDgxLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDUzLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDE1LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDI1LAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDNjLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDQ3LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDM1LAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDg1LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDY3LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweGFiLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDQ2LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweGE0LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDk3LAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDNjLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDZhLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweGEzLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDVkLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDgzLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDQ2LAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDQ4LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDZmLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDU4LAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweGE5LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDQ5LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDdiLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDkzLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDNhLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDhkLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDcwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDg1LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDdjLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDc1LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDU2LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDU3LAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDcwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweGI0LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDY3LAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDYwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDY5LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDZlLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDVlLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweGEzLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDRiLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweGFhLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDkxLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDdlLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDQ2LCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDliLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDZjLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDUyLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorICAweDAwLCAweDAwLCAweDAxLCAweDU5LCAweDAwLCAweDAwLCAweGJkLCAweDMyLCAweDZkLCAweDY0LCAweDYxLCAweDc0LAorICAweDIxLCAweDExLCAweDQ1LCAweDAwLCAweDE0LCAweDUwLCAweDAxLCAweDQ2LCAweGZmLCAweGYxLCAweDBhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVkLCAweGU5LCAweDgyLCAweDE0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGJjLCAweDIxLAorICAweDFhLCAweDkzLCAweGE5LCAweDA0LCAweDNlLCAweGEzLCAweDU5LCAweDQxLCAweDY3LCAweGE2LCAweDFjLCAweDAyLAorICAweDgxLCAweDRhLCAweDNkLCAweDNlLCAweDVkLCAweDMwLCAweDFmLCAweDViLCAweDU5LCAweDQxLCAweDQ5LCAweGRlLAorICAweDIyLCAweDFlLCAweDgxLCAweDBiLCAweDNmLCAweGY2LCAweGZmLCAweGYxLCAweDBhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLAorICAweDVkLCAweGU2LCAweGMyLCAweDE0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGJjLCAweDIxLAorICAweDFhLCAweDkzLCAweDg1LCAweDlhLCAweDkyLCAweGM2LCAweDQxLCAweDMwLCAweDkxLCAweDhjLCAweDQ1LCAweDA4LAorICAweGE0LCAweGM1LCAweDQ1LCAweDIwLCAweGNjLCAweGQ2LCAweDIyLCAweDg0LCAweGExLCAweDAyLCAweDUzLCAweDFhLAorICAweGM4LCAweDlhLCAweDUwLCAweDIxLCAweDg5LCAweGZlLCAweDcwLCAweDI0LCAweDc2LCAweDY0LCAweDVjLCAweGVlLAorICAweDFlLCAweDc2LCAweDIwLCAweDAzLCAweDkwLCAweDUyLCAweDg4LCAweDIwLCAweGI4LCAweGYwLCAweDU4LCAweGYwLAorICAweDFmLCAweGQ4LCAweGViLCAweDE0LCAweDliLCAweDFmLCAweGRmLCAweGYxLCAweGU4LCAweGNlLCAweGE4LCAweGYzLAorICAweDkzLCAweGE3LCAweDM0LCAweDlhLCAweDI2LCAweDkyLCAweDliLCAweGI3LCAweGJlLCAweDQwLCAweGNiLCAweGYwLAorICAweGNjLCAweDhmLCAweDM2LCAweDk4LCAweDQ4LCAweDE4LCAweGU2LCAweDE3LCAweDYxLCAweDU2LCAweDIzLCAweDBlLAorICAweDMzLCAweDJhLCAweGMyLCAweDMyLCAweDAxLCAweDU3LCAweGRiLCAweDZlLCAweDA1LCAweDIyLCAweDU2LCAweGNkLAorICAweDY5LCAweDliLCAweGI2LCAweDJlLCAweDEyLCAweGJmLCAweDRhLCAweDc2LCAweDI0LCAweDYwLCAweGMwLCAweGU4LAorICAweGRkLCAweDJiLCAweDU3LCAweDRkLCAweDJlLCAweGQzLCAweDE4LCAweDRlLCAweDEwLCAweDY0LCAweGNiLCAweGI2LAorICAweDc0LCAweGIwLCAweDliLCAweGQ0LCAweGQ5LCAweDgzLCAweDExLCAweGI2LCAweDE0LCAweGI4LCAweGVlLCAweGMwLAorICAweGRlLCAweDM1LCAweGM1LCAweGI0LCAweDFlLCAweDUyLCAweGEyLCAweGE2LCAweDc0LCAweDA3LCAweDI1LCAweDlkLAorICAweGE3LCAweDUyLCAweGE0LCAweGM2LCAweDQ1LCAweDAzLCAweGFkLCAweGI0LCAweDAzLCAweGQ0LCAweDBiLCAweGM2LAorICAweDEyLCAweDRiLCAweGRmLCAweDVkLCAweDY0LCAweGVhLCAweGVhLCAweGRhLCAweDg0LCAweDAwLCAweDZmLCAweDQ2LAorICAweGU0LCAweDM5LCAweDE2LCAweGYyLCAweGNhLCAweDhmLCAweGQwLCAweDI5LCAweDBkLCAweGVlLCAweDQ3LCAweDMyLAorICAweGJlLCAweDUxLCAweDZiLCAweGVmLCAweDU5LCAweDE1LCAweGU1LCAweDEzLCAweDBiLCAweDc3LCAweDkyLCAweDE1LAorICAweDdmLCAweDA0LCAweDVkLCAweGVhLCAweGNhLCAweGMwLCAweDQwLCAweDM5LCAweGE1LCAweDEyLCAweDE1LCAweDdkLAorICAweGVhLCAweDEyLCAweGU3LCAweDI1LCAweGYyLCAweDk0LCAweGIxLCAweDJlLCAweDdkLCAweDU3LCAweGRjLCAweDk5LAorICAweGFlLCAweGEyLCAweGVhLCAweDMzLCAweGJhLCAweGExLCAweGNiLCAweGMxLCAweDU0LCAweDNiLCAweDA2LCAweGUzLAorICAweDM0LCAweDUwLCAweGJhLCAweDg5LCAweGVjLCAweGFhLCAweGVjLCAweDQ3LCAweGU2LCAweGRjLCAweDNiLCAweGZhLAorICAweDFhLCAweGUxLCAweGU5LCAweGM3LCAweDQ2LCAweDQwLCAweDFjLCAweGExLCAweDg5LCAweDk4LCAweDIzLCAweDg0LAorICAweDZlLCAweGU4LCAweGJhLCAweDhjLCAweGNiLCAweDAxLCAweDQ4LCAweGE4LCAweDI4LCAweDE2LCAweGE4LCAweDZiLAorICAweDIyLCAweDY5LCAweDQwLCAweDg2LCAweDIwLCAweDc5LCAweDgzLCAweDIxLCAweDdiLCAweDZmLCAweDZkLCAweGI0LAorICAweGRhLCAweDZlLCAweDMxLCAweDJhLCAweDI2LCAweDEyLCAweGE1LCAweGI3LCAweDRhLCAweDkxLCAweDMwLCAweDU1LAorICAweGI0LCAweGU2LCAweDk5LCAweDZhLCAweGE2LCAweDEyLCAweDFmLCAweDcyLCAweGRiLCAweDY1LCAweGRjLCAweGJlLAorICAweDE3LCAweDE1LCAweDZiLCAweGMwLCAweDllLCAweDU1LCAweDIwLCAweDhjLCAweGY1LCAweDI3LCAweDNjLCAweDA5LAorICAweDQyLCAweGNjLCAweDc4LCAweDhkLCAweDI0LCAweDM3LCAweGI5LCAweDQ1LCAweGRkLCAweDE0LCAweGE1LCAweDk5LAorICAweGRlLCAweDE1LCAweGEwLCAweDVhLCAweDNlLCAweGZlLCAweDhjLCAweGQ3LCAweDJhLCAweDE0LCAweDUyLCAweGVmLAorICAweDZlLCAweDg3LCAweDljLCAweDIyLCAweDlkLCAweDA4LCAweDY1LCAweDU5LCAweGI1LCAweDYwLCAweDc4LCAweGZkLAorICAweGMzLCAweDJlLCAweDZhLCAweDg4LCAweDEzLCAweGMyLCAweDRmLCAweDcyLCAweDZjLCAweDkyLCAweDAyLCAweDRjLAorICAweDg4LCAweGQ0LCAweGM0LCAweDgwLCAweGMxLCAweDQ4LCAweDU2LCAweDRjLCAweDM5LCAweDk4LCAweDVkLCAweDlkLAorICAweDMxLCAweDM1LCAweDgxLCAweDQ3LCAweDcyLCAweDRkLCAweGU1LCAweDc3LCAweDU0LCAweGY4LCAweDg4LCAweGU0LAorICAweDA3LCAweGFkLCAweGExLCAweGE2LCAweGExLCAweGU5LCAweDY5LCAweDE2LCAweGFkLCAweDMzLCAweDg4LCAweDg2LAorICAweGVlLCAweDE4LCAweGVhLCAweDM3LCAweGNhLCAweDhkLCAweGQ4LCAweDVmLCAweDk1LCAweDA0LCAweGMzLCAweDU1LAorICAweDc2LCAweDQ1LCAweGY3LCAweGQ1LCAweDljLCAweDMyLCAweDRlLCAweDgwLCAweDgwLCAweGQwLCAweDljLCAweDQxLAorICAweGE3LCAweDU0LCAweGJjLCAweDM2LCAweDkwLCAweGIzLCAweGNmLCAweGMwLCAweDcwLCAweDQ2LCAweDQ1LCAweDM0LAorICAweGNhLCAweDkzLCAweDNjLCAweDZiLCAweGE2LCAweGVkLCAweDQwLCAweDhhLCAweDk4LCAweDI5LCAweDEyLCAweDc4LAorICAweGQ5LCAweDZjLCAweDM3LCAweDA0LCAweGFkLCAweGYzLCAweDA5LCAweDZlLCAweDZlLCAweGNlLCAweGU5LCAweDFjLAorICAweDI5LCAweDA1LCAweDA2LCAweDA4LCAweDYzLCAweDdlLCAweDQzLCAweDNhLCAweDJlLCAweDJlLCAweGVmLCAweDg1LAorICAweGI3LCAweDg5LCAweGMwLCAweGY1LCAweGY1LCAweDcyLCAweDkwLCAweDFjLCAweDIxLCAweDFhLCAweDg4LCAweDA3LAorICAweGZmLCAweGZmLCAweGZmLCAweGZlLCAweGVmLCAweDY2LCAweGEzLCAweDMxLCAweDExLCAweDZjLCAweDQ0LCAweDEzLAorICAweDEyLCAweDg4LCAweGUxLCAweDBlLCAweDE4LCAweGUzLCAweDcwLCAweGEwLCAweDE0LCAweDJhLCAweGU5LCAweDI4LAorICAweDgyLCAweDQ0LCAweGU0LCAweDY4LCAweDM4LCAweDIxLCAweDA4LCAweDJjLCAweGE0LCAweGQ5LCAweDFlLCAweGM0LAorICAweDc5LCAweDI4LCAweDEwLCAweDJlLCAweGU0LCAweDc4LCAweDUyLCAweDI0LCAweDIxLCAweDExLCAweDgzLCAweGY2LAorICAweGJhLCAweGQ1LCAweGE4LCAweGU0LCAweGJjLCAweGYxLCAweDNjLCAweDY1LCAweDI1LCAweDdhLCAweGI0LCAweDVjLAorICAweDg5LCAweGNlLCAweDE0LCAweGIyLCAweDhlLCAweDkzLCAweDUyLCAweGYzLCAweDgyLCAweDRjLCAweDRkLCAweDQyLAorICAweDY4LCAweGI1LCAweGM4LCAweDE1LCAweGVhLCAweGQxLCAweDFkLCAweGE2LCAweGYzLCAweDgzLCAweGY0LCAweDFmLAorICAweDE4LCAweDk3LCAweGI3LCAweDk4LCAweGZkLCAweDljLCAweDEzLCAweDVjLCAweDkwLCAweGUxLCAweDdkLCAweDg4LAorICAweGFmLCAweDRmLCAweDE2LCAweDhlLCAweDdlLCAweGZlLCAweDk5LCAweDc0LCAweDgwLCAweDI1LCAweGVhLCAweDk2LAorICAweDEzLCAweDIwLCAweDNkLCAweGRmLCAweDc5LCAweDNlLCAweDkzLCAweGRiLCAweDc0LCAweDlhLCAweDExLCAweDRlLAorICAweGU5LCAweGQ4LCAweDQwLCAweDFhLCAweDFjLCAweDBjLCAweDA0LCAweDQ0LCAweDhlLCAweDFlLCAweDg2LCAweDM0LAorICAweDQyLCAweDY4LCAweDY4LCAweDBlLCAweGY5LCAweGMyLCAweDEyLCAweDRiLCAweDBlLCAweDU3LCAweDEwLCAweGQ0LAorICAweDgwLCAweGMyLCAweGQwLCAweGU4LCAweDhjLCAweGMyLCAweGIyLCAweDk3LCAweDk5LCAweGRkLCAweGNkLCAweDA4LAorICAweGFhLCAweDZiLCAweDQ2LCAweGFiLCAweDZjLCAweGFmLCAweDk3LCAweDRiLCAweDZmLCAweDhiLCAweDYyLCAweDgxLAorICAweDI1LCAweGVkLCAweDQ0LCAweDkwLCAweDJiLCAweDcxLCAweGRiLCAweDEyLCAweDRjLCAweDZkLCAweDA4LCAweGI1LAorICAweDhiLCAweDRiLCAweDEyLCAweDkyLCAweDI4LCAweDgzLCAweGJiLCAweGI0LCAweDU0LCAweDJkLCAweDE3LCAweGJjLAorICAweDI1LCAweDY3LCAweGI1LCAweGYyLCAweDA2LCAweDIwLCAweDhkLCAweDQ3LCAweDdkLCAweDVkLCAweDIzLCAweDg5LAorICAweGE4LCAweDlkLCAweDk0LCAweDZlLCAweDNjLCAweGM5LCAweDQ2LCAweDEyLCAweDYwLCAweDQ2LCAweDJjLCAweDRjLAorICAweGI2LCAweGViLCAweDRiLCAweDUxLCAweGY2LCAweGQyLCAweDRkLCAweDdjLCAweDdkLCAweDA3LCAweDQ5LCAweGI1LAorICAweDMwLCAweGMwLCAweGMzLCAweDUzLCAweDYyLCAweDFmLCAweGY0LCAweGEyLCAweGI2LCAweDc2LCAweGQyLCAweDM1LAorICAweGQxLCAweGFhLCAweGIxLCAweGY1LCAweDlhLCAweDhjLCAweDgzLCAweGRlLCAweDZjLCAweGE5LCAweDM1LCAweGJjLAorICAweGNmLCAweDJkLCAweGFkLCAweDJiLCAweGYxLCAweGY3LCAweDc5LCAweGZmLCAweDQ4LCAweDFmLCAweGIxLCAweGZhLAorICAweDBlLCAweDJlLCAweDA3LCAweDU3LCAweDdjLCAweGVkLCAweDc2LCAweDcwLCAweGY5LCAweDdhLCAweGZjLCAweDllLAorICAweDE3LCAweDljLCAweDAxLCAweGRiLCAweGQwLCAweGM2LCAweDQ2LCAweGIwLCAweDUwLCAweDZjLCAweDE0LCAweDFiLAorICAweDBhLCAweDg4LCAweGUxLCAweGMwLCAweGE5LCAweDlhLCAweDMyLCAweDJhLCAweGFlLCAweGFhLCAweGQ1LCAweDUwLAorICAweDQ2LCAweDVjLCAweGMyLCAweDI1LCAweDViLCAweDA1LCAweDY3LCAweGQ4LCAweGQ3LCAweGNmLCAweGE5LCAweDQ5LAorICAweGE2LCAweDZiLCAweDkwLCAweDJmLCAweGI4LCAweGE3LCAweDE2LCAweDFjLCAweGFlLCAweDA1LCAweGJkLCAweDE0LAorICAweDZhLCAweGIyLCAweDY0LCAweDdjLCAweGQ4LCAweDFhLCAweGZmLCAweDY3LCAweGM0LCAweGI0LCAweDRmLCAweDNmLAorICAweDQ5LCAweGU0LCAweGRjLCAweDAyLCAweDY4LCAweDkwLCAweDE1LCAweDYyLCAweGRhLCAweDE3LCAweGFmLCAweDI0LAorICAweDE5LCAweGJiLCAweDhjLCAweDVkLCAweDE4LCAweDdjLCAweDlkLCAweDYzLCAweDg1LCAweGZhLCAweGFkLCAweGJhLAorICAweDEwLCAweGI2LCAweDA1LCAweDY0LCAweDAwLCAweDRmLCAweDhmLCAweDVjLCAweGNkLCAweGI4LCAweDRhLCAweGQ2LAorICAweDhlLCAweDJlLCAweDAyLCAweDNiLCAweGVlLCAweGU2LCAweDQzLCAweGNhLCAweGNhLCAweDI4LCAweDJkLCAweDI0LAorICAweDQ3LCAweDExLCAweGRhLCAweDFhLCAweDAzLCAweGRkLCAweGYyLCAweGJkLCAweDNiLCAweDg5LCAweDhkLCAweDU0LAorICAweDhlLCAweGIzLCAweGIxLCAweDIxLCAweDhkLCAweGZhLCAweGFkLCAweGE2LCAweDU4LCAweDVkLCAweDEzLCAweDM5LAorICAweDNkLCAweGM2LCAweGZlLCAweGQzLCAweGVjLCAweGYyLCAweDU1LCAweGY5LCAweDliLCAweDI1LCAweDIyLCAweDA2LAorICAweDgwLCAweGJjLCAweDkzLCAweDc3LCAweDdiLCAweDQ2LCAweGIzLCAweDMzLCAweGEzLCAweDdhLCAweGYyLCAweDgzLAorICAweGE0LCAweDE3LCAweDJiLCAweDE0LCAweDVhLCAweDc0LCAweGM0LCAweDYyLCAweGY0LCAweGJhLCAweDc4LCAweGE2LAorICAweGI2LCAweGJmLCAweDYyLCAweDAzLCAweGVkLCAweGMyLCAweDc1LCAweGE3LCAweGI3LCAweDhjLCAweDhmLCAweDAyLAorICAweDE0LCAweDcxLCAweDgxLCAweGFhLCAweGI3LCAweGFhLCAweGIwLCAweDc5LCAweDRlLCAweDFmLCAweDNkLCAweDQ3LAorICAweDU1LCAweGFhLCAweDQxLCAweDQ4LCAweDQyLCAweGM5LCAweDViLCAweGViLCAweGJhLCAweDdkLCAweDNkLCAweDRkLAorICAweDM1LCAweDcxLCAweDdhLCAweGQ2LCAweDRlLCAweDJjLCAweGFmLCAweDA0LCAweDQzLCAweGM4LCAweDYzLCAweDFlLAorICAweGYxLCAweGEwLCAweDFiLCAweDU3LCAweDA3LCAweDk1LCAweGE2LCAweGMzLCAweGUzLCAweDJlLCAweGE2LCAweDZlLAorICAweDQxLCAweDVhLCAweGFlLCAweDNjLCAweGNlLCAweGIwLCAweGJmLCAweGEzLCAweDcxLCAweGU4LCAweGJlLCAweGYzLAorICAweGVmLCAweDdkLCAweDVmLCAweDFmLCAweGEzLCAweGEzLCAweGI0LCAweGYzLCAweDAwLCAweDcwLCAweDIxLCAweDFhLAorICAweDkzLCAweDlkLCAweDg5LCAweDkwLCAweDlhLCAweDYxLCAweDUwLCAweGRjLCAweDIwLCAweGE1LCAweDQ2LCAweDEwLAorICAweGM4LCAweDRkLCAweGU4LCAweDA1LCAweDQwLCAweDRiLCAweGEwLCAweDEyLCAweDk5LCAweDhiLCAweDI3LCAweDA1LAorICAweGM0LCAweDk2LCAweDVmLCAweGMzLCAweDdhLCAweDg2LCAweGNjLCAweGVkLCAweDI1LCAweDhhLCAweDJhLCAweDkwLAorICAweDFlLCAweDk5LCAweGQwLCAweDQ2LCAweDJjLCAweDFmLCAweDJmLCAweDUzLCAweGVjLCAweDdkLCAweDAzLCAweGQ3LAorICAweGM3LCAweDZmLCAweGM5LCAweDY0LCAweDFjLCAweDhhLCAweGZkLCAweGI1LCAweDJiLCAweDYzLCAweDg5LCAweGY5LAorICAweDNlLCAweDE2LCAweGMwLCAweGIwLCAweGI3LCAweGJjLCAweDNiLCAweGE0LCAweGRhLCAweDZlLCAweGFiLCAweDQ2LAorICAweDdjLCAweGY3LCAweDkyLCAweDVmLCAweGYwLCAweGRhLCAweGU2LCAweGZjLCAweDU2LCAweDFhLCAweDI0LCAweGYwLAorICAweGNhLCAweGY3LCAweGE1LCAweGE1LCAweDdiLCAweDcwLCAweDcwLCAweGFmLCAweDhiLCAweGNkLCAweDE4LCAweGVkLAorICAweGMzLCAweDdhLCAweDRhLCAweDI2LCAweDdkLCAweGZiLCAweDIyLCAweDk0LCAweDkyLCAweGQ5LCAweGNkLCAweDk4LAorICAweGQzLCAweDNhLCAweDFlLCAweDQzLCAweDc0LCAweDJiLCAweGZkLCAweDA3LCAweDhkLCAweDJiLCAweGFkLCAweGZlLAorICAweGU5LCAweGFlLCAweGE0LCAweDFkLCAweGExLCAweDJmLCAweGE3LCAweGIzLCAweDU5LCAweGY0LCAweDVjLCAweDZlLAorICAweDNlLCAweGY4LCAweDgyLCAweDNiLCAweDQ5LCAweGViLCAweGE5LCAweGY1LCAweGY3LCAweGI3LCAweDgzLCAweDA1LAorICAweGFlLCAweDc1LCAweDU0LCAweDAxLCAweDcxLCAweGQ0LCAweGE1LCAweDAwLCAweDhhLCAweDg2LCAweDgxLCAweDdiLAorICAweGQwLCAweDA3LCAweDc3LCAweGJhLCAweDQ0LCAweGM0LCAweDk0LCAweDNlLCAweDZmLCAweDVkLCAweDJhLCAweDc1LAorICAweDJhLCAweDViLCAweDM5LCAweDRjLCAweDY4LCAweDMyLCAweDY1LCAweDgyLCAweDZlLCAweDljLCAweGZmLCAweDM1LAorICAweGQwLCAweDc4LCAweDczLCAweGIzLCAweGI3LCAweDdmLCAweGEyLCAweGMzLCAweDkwLCAweGNjLCAweDgzLCAweDkwLAorICAweDc4LCAweDY5LCAweGQ1LCAweGYyLCAweGJiLCAweDlkLCAweDc1LCAweDRmLCAweDFlLCAweGUzLCAweGIwLCAweDdiLAorICAweDgwLCAweGVmLCAweDYyLCAweDkyLCAweDMyLCAweGFlLCAweDAyLCAweGRhLCAweDkyLCAweDljLCAweDZiLCAweDFiLAorICAweDdmLCAweDBlLCAweGM3LCAweDRhLCAweGMzLCAweDRmLCAweDViLCAweDA4LCAweGQyLCAweGFjLCAweDIyLCAweDdiLAorICAweGE1LCAweDEwLCAweDkwLCAweGE5LCAweDU1LCAweDJiLCAweDg2LCAweGZjLCAweDNmLCAweGM0LCAweGY5LCAweDVmLAorICAweDdmLCAweGRlLCAweDcyLCAweGJmLCAweDlmLCAweGRhLCAweDAwLCAweDc0LCAweGIxLCAweDMyLCAweDkyLCAweGNjLAorICAweDRhLCAweDFjLCAweDg0LCAweDEwLCAweGU3LCAweDQwLCAweGEzLCAweDJjLCAweDAzLCAweDdhLCAweDAwLCAweGIwLAorICAweDJlLCAweGExLCAweDY5LCAweDNhLCAweDY5LCAweDZhLCAweDUyLCAweDAyLCAweDQyLCAweDllLCAweGRhLCAweDY3LAorICAweGYyLCAweGUyLCAweDExLCAweDNkLCAweDI3LCAweDY1LCAweDIxLCAweDcwLCAweDYxLCAweDkyLCAweGZlLCAweDMzLAorICAweGMzLCAweDlmLCAweDg3LCAweDg2LCAweGVmLCAweDEyLCAweDM1LCAweGM4LCAweDZiLCAweDIxLCAweGRlLCAweDcyLAorICAweGI0LCAweGU0LCAweGZmLCAweDg3LCAweDUyLCAweDJhLCAweGE0LCAweDgzLCAweDk5LCAweGQ0LCAweDZjLCAweDVmLAorICAweGFjLCAweDY3LCAweGI1LCAweDI3LCAweDJlLCAweGVkLCAweDU4LCAweDA4LCAweDAwLCAweGFmLCAweGMwLCAweDZiLAorICAweDhhLCAweGQ3LCAweGI3LCAweDgxLCAweGJjLCAweDViLCAweDRhLCAweDI3LCAweGNlLCAweDE1LCAweDcwLCAweGFjLAorICAweDlmLCAweGYyLCAweGJhLCAweDM5LCAweGQ0LCAweDlkLCAweGU3LCAweGI4LCAweGM0LCAweGQ5LCAweDM3LCAweDVlLAorICAweDliLCAweGFhLCAweGYwLCAweGY2LCAweDUxLCAweDliLCAweDUwLCAweGYxLCAweGI3LCAweDI3LCAweGJkLCAweGE3LAorICAweDc1LCAweDlmLCAweDkyLCAweDEwLCAweDNjLCAweGEzLCAweDdjLCAweDM4LCAweDJlLCAweDVmLCAweDk5LCAweGZjLAorICAweGJkLCAweDNmLCAweDAzLCAweDVhLCAweGNkLCAweGQ3LCAweGZlLCAweGMwLCAweDNlLCAweDM2LCAweDhkLCAweDczLAorICAweGRjLCAweGY2LCAweDgyLCAweDBkLCAweDcyLCAweDQyLCAweGI0LCAweGQzLCAweDM4LCAweGJhLCAweGE5LCAweDE2LAorICAweDBjLCAweDhjLCAweGFmLCAweDk1LCAweDAyLCAweGJiLCAweGU1LCAweDU0LCAweDdiLCAweGRjLCAweDVkLCAweGM5LAorICAweGQ0LCAweGRkLCAweDEyLCAweGQ2LCAweGJhLCAweDg5LCAweDZjLCAweGI1LCAweGZiLCAweDZmLCAweDljLCAweGFiLAorICAweDM4LCAweDdlLCAweGRhLCAweDU0LCAweDFkLCAweGJjLCAweDY3LCAweGViLCAweGYyLCAweGZkLCAweGFkLCAweDQ0LAorICAweGQyLCAweDlhLCAweDg2LCAweDZhLCAweDBjLCAweDM2LCAweDAwLCAweGNkLCAweDE4LCAweGVlLCAweDkwLCAweDVlLAorICAweDA1LCAweDMyLCAweDBjLCAweDliLCAweDM1LCAweDc4LCAweDg1LCAweDYyLCAweDIyLCAweDY1LCAweDA2LCAweDE3LAorICAweDA0LCAweGYwLCAweDg5LCAweDc5LCAweGQzLCAweDQxLCAweDliLCAweGM3LCAweDlmLCAweGJkLCAweDJiLCAweDY3LAorICAweDc1LCAweDdmLCAweDA2LCAweGY5LCAweGE1LCAweDZkLCAweDljLCAweGZmLCAweDA3LCAweGMzLCAweGU3LCAweDdmLAorICAweDFiLCAweGYzLCAweDJkLCAweDJmLCAweGE3LCAweDAwLCAweGUwLCAweDIxLCAweDFhLCAweDkzLCAweGE1LCAweDIxLAorICAweDkwLCAweDg1LCAweDIyLCAweGEyLCAweDU4LCAweDUwLCAweDQxLCAweDA5LCAweGFjLCAweGNkLCAweDY0LCAweDU0LAorICAweDAyLCAweGIxLCAweDdiLCAweDBiLCAweDUwLCAweDUyLCAweGM4LCAweDlmLCAweGIwLCAweDk4LCAweDNmLCAweGQ3LAorICAweGUzLCAweDc5LCAweDc2LCAweGQxLCAweDliLCAweGRlLCAweDk4LCAweDM4LCAweDYwLCAweDdiLCAweGE4LCAweGYxLAorICAweDA5LCAweDExLCAweDM2LCAweDhhLCAweDRhLCAweGUyLCAweGIzLCAweGE1LCAweDI5LCAweDc1LCAweDY2LCAweDkzLAorICAweGMxLCAweGE0LCAweGNkLCAweDZkLCAweDBjLCAweGQ5LCAweDAyLCAweDM1LCAweDQzLCAweGY1LCAweDYxLCAweGI2LAorICAweGE0LCAweDc2LCAweDI5LCAweDA2LCAweDcxLCAweDcwLCAweDhmLCAweGJmLCAweGU4LCAweDcwLCAweGM5LCAweDk1LAorICAweDllLCAweGZjLCAweGY4LCAweGMyLCAweDEzLCAweGUzLCAweDQ5LCAweDk1LCAweDYxLCAweDFiLCAweDc5LCAweDI0LAorICAweGUwLCAweDU4LCAweDgwLCAweDhhLCAweDgwLCAweGQxLCAweDU5LCAweGE3LCAweDkxLCAweDAyLCAweDExLCAweGQzLAorICAweDVkLCAweDJhLCAweDgwLCAweGFmLCAweGRmLCAweDkwLCAweGU4LCAweGU0LCAweGJjLCAweDQ3LCAweGJkLCAweDI4LAorICAweDgyLCAweDAyLCAweGQ0LCAweGJkLCAweGNlLCAweGFkLCAweDA4LCAweGYwLCAweDBiLCAweDRmLCAweGRjLCAweDM5LAorICAweDUwLCAweDE1LCAweGI3LCAweDZhLCAweGU1LCAweDRmLCAweDk0LCAweDdlLCAweDdhLCAweDQxLCAweGQ5LCAweGUyLAorICAweDFkLCAweDJiLCAweGQ3LCAweDgwLCAweGNmLCAweDhhLCAweDI4LCAweGJkLCAweDZjLCAweDk3LCAweGM4LCAweGUzLAorICAweDU2LCAweDdlLCAweGFiLCAweGI2LCAweDA5LCAweGQ3LCAweGI2LCAweDliLCAweGU5LCAweGNjLCAweDU5LCAweDczLAorICAweDk1LCAweDVlLCAweGE0LCAweDJkLCAweGVhLCAweDcwLCAweDE5LCAweGRkLCAweDY2LCAweDg3LCAweGEwLCAweGFiLAorICAweDFhLCAweGQxLCAweDM5LCAweDcwLCAweDI2LCAweGI3LCAweDNhLCAweDI3LCAweDg3LCAweDcwLCAweDNiLCAweDc3LAorICAweDQ3LCAweGNhLCAweDhlLCAweDM4LCAweGI4LCAweDk1LCAweGM3LCAweGI2LCAweDliLCAweDhhLCAweDI2LCAweDY4LAorICAweDhmLCAweGJiLCAweGRmLCAweDE5LCAweDE4LCAweGM4LCAweDc3LCAweGNhLCAweDk0LCAweDJjLCAweDk0LCAweDZlLAorICAweGE1LCAweDM4LCAweGRlLCAweGQ2LCAweDZmLCAweDc1LCAweDViLCAweDU5LCAweGJiLCAweGQ4LCAweGY1LCAweDY5LAorICAweDU0LCAweGQwLCAweGQ4LCAweGM3LCAweDU3LCAweDhiLCAweGIxLCAweGU3LCAweDY3LCAweGJkLCAweGY5LCAweDAzLAorICAweGJhLCAweDYwLCAweDhhLCAweDg3LCAweDgyLCAweGI4LCAweDRlLCAweDAwLCAweDI5LCAweDUwLCAweDAxLCAweDU4LAorICAweDIwLCAweDk0LCAweDkwLCAweDUwLCAweDVmLCAweGU3LCAweGZhLCAweDJmLCAweGViLCAweGRmLCAweDUxLCAweDA3LAorICAweGZlLCAweGI3LCAweGQ3LCAweDczLCAweDkxLCAweDFlLCAweDhmLCAweGE2LCAweDNmLCAweGI4LCAweGU5LCAweGE1LAorICAweDMxLCAweDFmLCAweDBmLCAweGMxLCAweDFjLCAweGYyLCAweDZmLCAweGY2LCAweDI4LCAweGI1LCAweDhjLCAweDljLAorICAweDgwLCAweDNhLCAweDFlLCAweDg3LCAweGY2LCAweDdlLCAweDIxLCAweDc1LCAweDgwLCAweDQzLCAweGI0LCAweDI4LAorICAweGZjLCAweDA3LCAweDhmLCAweDEwLCAweDAyLCAweDAwLCAweDQ1LCAweDZkLCAweGNkLCAweDdlLCAweDJiLCAweGFkLAorICAweGNmLCAweGIxLCAweDk1LCAweGRkLCAweGU1LCAweGIzLCAweDdhLCAweDRiLCAweGZmLCAweGNjLCAweGE3LCAweGFhLAorICAweDUxLCAweDRhLCAweGFiLCAweDliLCAweDFiLCAweDNjLCAweDZiLCAweGE1LCAweDU4LCAweGIwLCAweGFkLCAweDJiLAorICAweDYyLCAweDZkLCAweDdlLCAweDk4LCAweDQyLCAweDFhLCAweDg0LCAweGNmLCAweGY0LCAweDcxLCAweDU1LCAweDg5LAorICAweDQ4LCAweGFiLCAweGVhLCAweDAwLCAweDAwLCAweGEyLCAweDEwLCAweDZhLCAweDhkLCAweGU4LCAweGVkLCAweDM5LAorICAweDcwLCAweDY2LCAweGQ0LCAweDFiLCAweGNkLCAweDc3LCAweDMwLCAweDNmLCAweDljLCAweDc1LCAweDdmLCAweGQ2LAorICAweGZiLCAweDY2LCAweDI4LCAweDE2LCAweGJmLCAweDFlLCAweDhhLCAweDJiLCAweDQ0LCAweDQ4LCAweDU3LCAweGExLAorICAweDY3LCAweGJmLCAweDgwLCAweDc3LCAweGQ3LCAweDFjLCAweDYzLCAweDlkLCAweDYxLCAweDMwLCAweDg2LCAweDlkLAorICAweDE4LCAweDVmLCAweDFjLCAweGYyLCAweGMyLCAweGZkLCAweDM0LCAweGExLCAweDhkLCAweDFhLCAweGZkLCAweDU2LAorICAweDE0LCAweDYzLCAweDgyLCAweGExLCAweGVkLCAweDVjLCAweGQ5LCAweDQ1LCAweDA1LCAweDg2LCAweGNhLCAweDgxLAorICAweDFjLCAweDljLCAweDhkLCAweDFkLCAweDY3LCAweGJkLCAweDUxLCAweGEwLCAweGE3LCAweDY0LCAweDBkLCAweGY5LAorICAweDQ0LCAweDZkLCAweGE4LCAweDYyLCAweDIyLCAweDM3LCAweDUyLCAweGQyLCAweGQ2LCAweDMzLCAweGQyLCAweGM1LAorICAweGQyLCAweGI3LCAweDMzLCAweDdhLCAweDc2LCAweDM2LCAweGVlLCAweDM3LCAweDYzLCAweDlmLCAweDMzLCAweDFmLAorICAweDJlLCAweGFmLCAweGM2LCAweGViLCAweGY3LCAweDc2LCAweDVlLCAweDFmLCAweDJmLCAweDliLCAweGNjLCAweDAxLAorICAweGMwLCAweDIxLCAweDFhLCAweDkzLCAweDk1LCAweDE1LCAweDk0LCAweDhkLCAweDIyLCAweDIxLCAweDYwLCAweDgyLAorICAweDE0LCAweDZmLCAweDViLCAweDhkLCAweGM1LCAweGQzLCAweDc2LCAweGE1LCAweDAwLCAweDAyLCAweDExLCAweDUxLAorICAweGY2LCAweDFhLCAweDA1LCAweDBhLCAweDk2LCAweGI4LCAweGZiLCAweDNiLCAweGY3LCAweDNjLCAweGY5LCAweGIzLAorICAweGM3LCAweDRmLCAweGJlLCAweDljLCAweGI0LCAweDJkLCAweGJmLCAweDNlLCAweDM1LCAweGM0LCAweDBlLCAweDU0LAorICAweDY4LCAweGIwLCAweDY0LCAweGM2LCAweGE5LCAweGNkLCAweDBlLCAweGRhLCAweDA5LCAweDUwLCAweDUzLCAweGU2LAorICAweDY3LCAweGNiLCAweDQ2LCAweGJlLCAweDJkLCAweDQ4LCAweDJhLCAweDA2LCAweGIxLCAweDFmLCAweDY0LCAweDQ1LAorICAweDI1LCAweDIyLCAweDhlLCAweDI5LCAweGNkLCAweDYwLCAweDdhLCAweDhjLCAweGI0LCAweGZhLCAweGU1LCAweDU1LAorICAweDgyLCAweDk5LCAweDM3LCAweGIxLCAweGMyLCAweDJiLCAweGI5LCAweDQyLCAweDU3LCAweGRlLCAweDhiLCAweGRlLAorICAweDFkLCAweDY2LCAweDVkLCAweGY1LCAweGU3LCAweDkxLCAweDc4LCAweDYzLCAweDMxLCAweDNmLCAweDdhLCAweDJmLAorICAweGY1LCAweGJkLCAweDU2LCAweGY4LCAweGY2LCAweDk5LCAweGJmLCAweDVhLCAweGYwLCAweDE1LCAweGI2LCAweGJjLAorICAweDQ3LCAweGM5LCAweGNlLCAweDg0LCAweDY1LCAweDU3LCAweDU3LCAweDdhLCAweDk0LCAweDY0LCAweDNiLCAweDMxLAorICAweDVkLCAweGQ1LCAweDgxLCAweDlmLCAweDg3LCAweGYyLCAweDc5LCAweDdkLCAweDNlLCAweDc5LCAweDg1LCAweDg0LAorICAweDkzLCAweGQxLCAweDJmLCAweGMxLCAweGQxLCAweGZiLCAweDBlLCAweDhjLCAweDBjLCAweGRkLCAweDkxLCAweDU3LAorICAweGY4LCAweDhlLCAweDhkLCAweGFiLCAweGY0LCAweDVkLCAweDAzLCAweGEzLCAweDc3LCAweDM5LCAweGI2LCAweGQ2LAorICAweGU4LCAweDg2LCAweDQzLCAweDE4LCAweGYwLCAweGFkLCAweDUwLCAweDAxLCAweDk3LCAweGEyLCAweGRlLCAweGM4LAorICAweDk4LCAweDBhLCAweDhiLCAweDZkLCAweDQ3LCAweDEyLCAweDkyLCAweGUyLCAweDhlLCAweGMxLCAweGNiLCAweDZiLAorICAweDhmLCAweDA1LCAweDNhLCAweDg4LCAweGIyLCAweGU4LCAweDRmLCAweDZhLCAweGQ5LCAweDIwLCAweGY3LCAweGVlLAorICAweDNlLCAweDE1LCAweDZiLCAweGEzLCAweGJkLCAweDhkLCAweGJmLCAweDE0LCAweDgyLCAweDhkLCAweGE2LCAweGM2LAorICAweGUwLCAweGJlLCAweDUzLCAweDFhLCAweDNkLCAweGZjLCAweDlmLCAweDY3LCAweDhhLCAweDM5LCAweDAxLCAweGM5LAorICAweDhhLCAweDkxLCAweDIzLCAweDIyLCAweDE4LCAweDUwLCAweDM3LCAweDBiLCAweDIyLCAweGIyLCAweDVkLCAweDI5LAorICAweDU2LCAweDE0LCAweDJhLCAweDgwLCAweDEwLCAweDQyLCAweDUwLCAweGM3LCAweGYyLCAweDRlLCAweDViLCAweGU5LAorICAweGNjLCAweGFiLCAweGMzLCAweDlhLCAweGU5LCAweGVlLCAweDBiLCAweDkzLCAweDU5LCAweGM1LCAweGQ4LCAweDRkLAorICAweDcyLCAweGRkLCAweDgzLCAweGIzLCAweDBiLCAweGQ3LCAweGRiLCAweDlkLCAweDFhLCAweDc1LCAweDZjLCAweGZjLAorICAweDM5LCAweDc4LCAweDhjLCAweDk2LCAweDMyLCAweDY4LCAweGMxLCAweDBhLCAweDAwLCAweDIxLCAweDcyLCAweDE2LAorICAweDA0LCAweDdiLCAweGY2LCAweDU1LCAweDQ2LCAweDg1LCAweDc4LCAweDA2LCAweGQ0LCAweDgzLCAweDUxLCAweGUzLAorICAweGE0LCAweGRiLCAweDUwLCAweDk2LCAweDNlLCAweDE2LCAweDBjLCAweDE3LCAweGUwLCAweDk0LCAweGRkLCAweDY4LAorICAweGUxLCAweGY4LCAweGUxLCAweDg3LCAweDhmLCAweDIyLCAweGIzLCAweDY1LCAweDU3LCAweGE5LCAweDBhLCAweDIyLAorICAweDVjLCAweDY0LCAweGM5LCAweGEzLCAweGM5LCAweDZiLCAweGI1LCAweDYxLCAweDMxLCAweGI4LCAweGYwLCAweDZhLAorICAweDJhLCAweGJkLCAweDEzLCAweDJmLCAweGU3LCAweGRkLCAweDE4LCAweDBjLCAweDZhLCAweDlmLCAweDcxLCAweDc5LAorICAweDAwLCAweDExLCAweDU2LCAweDMxLCAweDBkLCAweGVlLCAweGI2LCAweDM0LCAweGQ1LCAweDgxLCAweGUzLCAweGU4LAorICAweDViLCAweGQ4LCAweDIwLCAweDFiLCAweDNkLCAweGU2LCAweDUzLCAweDFhLCAweGEyLCAweGIzLCAweDQ5LCAweDY1LAorICAweDM1LCAweDk1LCAweDhmLCAweDY0LCAweGMxLCAweDcyLCAweGVlLCAweDlkLCAweGZmLCAweDNhLCAweDJkLCAweGRmLAorICAweGI3LCAweDE3LCAweGViLCAweGRmLCAweDg1LCAweDBlLCAweDc1LCAweDdiLCAweDEyLCAweGU1LCAweGUwLCAweDlmLAorICAweDExLCAweGEzLCAweDE2LCAweDdlLCAweDlmLCAweDFkLCAweDcyLCAweDQ3LCAweDNjLCAweGFlLCAweDA2LCAweDQwLAorICAweDgxLCAweDYzLCAweDg1LCAweDA0LCAweDBkLCAweDFlLCAweDRiLCAweDdkLCAweDNlLCAweGE2LCAweDlhLCAweGM2LAorICAweDQ1LCAweDVmLCAweDkzLCAweGRlLCAweGY3LCAweDBiLCAweGMzLCAweGFmLCAweGQxLCAweDc4LCAweDdlLCAweGU0LAorICAweGFiLCAweGVhLCAweGY4LCAweDExLCAweGUxLCAweDc2LCAweGRhLCAweGRlLCAweGQwLCAweDA3LCAweDIxLCAweDFhLAorICAweDg4LCAweDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZlLCAweGVkLCAweDY1LCAweGEzLCAweDQxLCAweDQ5LCAweGU4LAorICAweDY4LCAweDIzLCAweDg1LCAweDJhLCAweGNjLCAweGRlLCAweGE0LCAweDBhLCAweGQ4LCAweDAyLCAweDAwLCAweDEyLAorICAweDUwLCAweDMwLCAweGZmLCAweDQ2LCAweDhjLCAweDY2LCAweGQ4LCAweGViLCAweGUyLCAweDI3LCAweGQxLCAweDU5LAorICAweDdkLCAweGQ3LCAweGM2LCAweDFkLCAweDI2LCAweDQzLCAweDM0LCAweGNhLCAweGYwLCAweDBhLCAweGVkLCAweDcxLAorICAweGJlLCAweDgyLCAweDAzLCAweDE4LCAweGUyLCAweDg4LCAweGI0LCAweGQzLCAweDJjLCAweDY4LCAweDFlLCAweDJiLAorICAweGQ0LCAweGM2LCAweGU3LCAweGI1LCAweDY1LCAweDAwLCAweDY1LCAweGJjLCAweGI1LCAweDg3LCAweGU1LCAweGYxLAorICAweDE2LCAweDcwLCAweGY0LCAweDI1LCAweGYzLCAweDNjLCAweDQ2LCAweDcyLCAweDRlLCAweDBiLCAweDczLCAweDEwLAorICAweDIwLCAweDE2LCAweGM3LCAweDdkLCAweGJlLCAweDk4LCAweDdiLCAweDFiLCAweGE1LCAweDI1LCAweDdhLCAweGZhLAorICAweDc3LCAweGU0LCAweDg3LCAweDIwLCAweGU5LCAweDRlLCAweDQ4LCAweGYxLCAweDNiLCAweDQyLCAweGNiLCAweDU3LAorICAweGMxLCAweDhiLCAweGE0LCAweGNjLCAweGFiLCAweGJhLCAweDdmLCAweDVlLCAweGZiLCAweDgxLCAweDkzLCAweGU0LAorICAweGE4LCAweGI1LCAweGIwLCAweGNjLCAweDRlLCAweDViLCAweGEyLCAweGQ3LCAweGI3LCAweDM4LCAweDA2LCAweDlhLAorICAweDY0LCAweDlkLCAweGZhLCAweDE1LCAweDMzLCAweDFmLCAweDQ2LCAweDUyLCAweGQxLCAweDExLCAweDBhLCAweDAyLAorICAweGJlLCAweDc0LCAweGFkLCAweDNhLCAweDAyLCAweDc4LCAweDA1LCAweGZhLCAweDVjLCAweGU0LCAweGE3LCAweDk3LAorICAweDRiLCAweDI2LCAweDAxLCAweDMzLCAweDA5LCAweGEwLCAweGM4LCAweGZlLCAweGFjLCAweGJhLCAweDhlLCAweDViLAorICAweDgzLCAweDAzLCAweGExLCAweDQ2LCAweGY4LCAweGNjLCAweDI5LCAweGQxLCAweGNiLCAweGIwLCAweDg2LCAweGQwLAorICAweGI4LCAweDVmLCAweDQ2LCAweGVmLCAweGExLCAweDQxLCAweDhkLCAweGFiLCAweDU2LCAweDgyLCAweDQ2LCAweDJhLAorICAweGExLCAweDQ0LCAweDQ0LCAweDBiLCAweDdhLCAweDE2LCAweDUwLCAweDdmLCAweDUwLCAweGZiLCAweDMzLCAweDg0LAorICAweGZiLCAweGVlLCAweDllLCAweDhjLCAweGY2LCAweDQ5LCAweGYxLCAweDU2LCAweDRlLCAweDk1LCAweDg1LCAweDgyLAorICAweDdlLCAweDdlLCAweDNmLCAweDk5LCAweGU4LCAweGZkLCAweDJmLCAweDU3LCAweDVjLCAweGMwLCAweDBmLCAweDNlLAorICAweGI2LCAweDFhLCAweDNjLCAweDhhLCAweDgzLCAweDYxLCAweDQwLCAweDhjLCAweDNiLCAweGJhLCAweGE5LCAweDRhLAorICAweDkyLCAweGJhLCAweGM4LCAweDBkLCAweGMwLCAweDAwLCAweDE1LCAweDY4LCAweGU0LCAweDM5LCAweDI3LCAweDI3LAorICAweDQ0LCAweGE4LCAweGEwLCAweDJhLCAweDM2LCAweGFhLCAweDM5LCAweDFmLCAweGI3LCAweGFjLCAweDUyLCAweDAzLAorICAweDQwLCAweDEzLCAweDYzLCAweDFlLCAweDJkLCAweDQ1LCAweDgyLCAweDdhLCAweDI2LCAweDhiLCAweDlhLCAweDA4LAorICAweGE1LCAweDdiLCAweGI2LCAweDM5LCAweDRlLCAweDk2LCAweDU2LCAweGE4LCAweDY1LCAweDEzLCAweGY3LCAweGM1LAorICAweGY0LCAweDRhLCAweDM4LCAweGFkLCAweDRkLCAweDI0LCAweDlkLCAweDZmLCAweDczLCAweDIzLCAweDYxLCAweDc0LAorICAweGRlLCAweDBiLCAweDJmLCAweDVjLCAweGIzLCAweDNiLCAweDM2LCAweGY2LCAweGRhLCAweDliLCAweGYzLCAweGU5LAorICAweGY4LCAweGFkLCAweGNlLCAweDRlLCAweGM1LCAweGM5LCAweDYzLCAweGVjLCAweGQxLCAweGQyLCAweGRiLCAweGYxLAorICAweGMyLCAweGU2LCAweDE0LCAweDlkLCAweDNkLCAweGRhLCAweDc4LCAweDVhLCAweDE5LCAweDZhLCAweGU0LCAweGVkLAorICAweDY5LCAweGY1LCAweDVkLCAweDFmLCAweDU2LCAweGJlLCAweDdjLCAweDkxLCAweDI4LCAweGRlLCAweDBmLCAweDU0LAorICAweGY3LCAweGQwLCAweDZhLCAweDFhLCAweDExLCAweDAyLCAweDA2LCAweGU4LCAweDE1LCAweDhlLCAweDIzLCAweDRmLAorICAweGM1LCAweDMzLCAweDU4LCAweDZjLCAweGEzLCAweDIxLCAweDgyLCAweDg3LCAweGMxLCAweGMzLCAweDJmLCAweDFiLAorICAweDEzLCAweDNkLCAweDg2LCAweDJkLCAweGVjLCAweGUyLCAweDM3LCAweDY1LCAweGU5LCAweDJkLCAweDkzLCAweGRjLAorICAweDVkLCAweDNiLCAweDdiLCAweDlhLCAweGY2LCAweDk4LCAweGM0LCAweDIyLCAweDlkLCAweDI0LCAweDEwLCAweDk5LAorICAweDkzLCAweDBkLCAweDVhLCAweDUxLCAweGY3LCAweDk3LCAweGIxLCAweDYyLCAweGE1LCAweDhhLCAweDkyLCAweDUwLAorICAweGI3LCAweGY3LCAweGFmLCAweDFlLCAweDVmLCAweGRiLCAweGJmLCAweGI0LCAweGZjLCAweGM4LCAweDcwLCAweDIxLAorICAweDFhLCAweDg4LCAweDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZlLCAweGYzLCAweDY1LCAweGE1LCAweGEwLCAweDg4LAorICAweGVhLCAweDQ0LCAweDIxLCAweDA5LCAweDA1LCAweDA0LCAweDEwLCAweGIzLCAweDg4LCAweDZlLCAweDU2LCAweGEwLAorICAweDA2LCAweGMwLCAweDA5LCAweDQyLCAweDU1LCAweGE1LCAweDdiLCAweDg5LCAweGI3LCAweDhiLCAweGUxLCAweGQzLAorICAweDIwLCAweDNiLCAweDE2LCAweDBlLCAweDkzLCAweGVmLCAweDdiLCAweGFhLCAweGUzLCAweGZhLCAweDlmLCAweGNhLAorICAweDkwLCAweGM1LCAweDZjLCAweDViLCAweDZlLCAweDRkLCAweDBkLCAweGQ3LCAweDc2LCAweGE0LCAweDY5LCAweDIzLAorICAweDkyLCAweDU2LCAweDY1LCAweDRiLCAweGU5LCAweDZhLCAweDBhLCAweDM2LCAweDI5LCAweDY1LCAweDg3LCAweGNmLAorICAweGJiLCAweDAwLCAweDA2LCAweDBjLCAweDRmLCAweDUyLCAweGRlLCAweGY0LCAweDRiLCAweDY3LCAweGNiLCAweDI1LAorICAweGZjLCAweGNkLCAweGFlLCAweGJiLCAweDM3LCAweDE5LCAweDkwLCAweDJiLCAweDAzLCAweDY5LCAweDZmLCAweGIyLAorICAweGExLCAweDJjLCAweDYzLCAweDExLCAweDJkLCAweGVmLCAweDI0LCAweDliLCAweDYxLCAweGNhLCAweDI0LCAweDg4LAorICAweGQyLCAweGU0LCAweDgzLCAweDYxLCAweDYyLCAweGE2LCAweDUzLCAweDAzLCAweDc1LCAweDEyLCAweGI3LCAweDMwLAorICAweGVhLCAweDRkLCAweDJhLCAweGE2LCAweDcxLCAweDY3LCAweDZhLCAweDI2LCAweDg4LCAweDZmLCAweDQ4LCAweDcyLAorICAweDRiLCAweDI1LCAweDhhLCAweGM4LCAweDlkLCAweGM1LCAweDBjLCAweDVkLCAweGQ1LCAweGQyLCAweDZmLCAweGM4LAorICAweDcyLCAweDk2LCAweDFjLCAweDRmLCAweGQ2LCAweGM5LCAweDU0LCAweDY4LCAweDJmLCAweDk5LCAweDMzLCAweDk5LAorICAweGIwLCAweGNiLCAweGIyLCAweDAyLCAweDFhLCAweGY0LCAweDBjLCAweGNlLCAweDg4LCAweGVlLCAweDZlLCAweGVmLAorICAweDY1LCAweGUwLCAweDQxLCAweDAyLCAweDJjLCAweDAxLCAweDM1LCAweGEyLCAweDYyLCAweDllLCAweDRjLCAweDMyLAorICAweDI0LCAweDQ2LCAweDYxLCAweDNiLCAweGQ2LCAweGYzLCAweDhiLCAweDg5LCAweDY0LCAweDRiLCAweGYyLCAweGE5LAorICAweDAwLCAweGYzLCAweGE5LCAweDNkLCAweGM2LCAweDE5LCAweDljLCAweDIzLCAweDRhLCAweGRmLCAweGMxLCAweDU1LAorICAweDQ2LCAweGQ4LCAweDliLCAweGQ4LCAweDJmLCAweGRiLCAweDQ2LCAweGJiLCAweDRhLCAweDkyLCAweDc1LCAweDQwLAorICAweGEyLCAweDNiLCAweDJkLCAweGViLCAweDcyLCAweDE3LCAweGRmLCAweDE3LCAweGM2LCAweDIwLCAweGYxLCAweGViLAorICAweDQ2LCAweDExLCAweDExLCAweDcwLCAweDM3LCAweDBlLCAweGQ1LCAweDAxLCAweDUzLCAweDhhLCAweDgzLCAweDY1LAorICAweDQ1LCAweDAwLCAweDQwLCAweDkwLCAweDA0LCAweGE3LCAweDhkLCAweDJmLCAweGZiLCAweGJmLCAweGFjLCAweGVjLAorICAweDVhLCAweDAxLCAweDJjLCAweGQxLCAweGY5LCAweDlhLCAweDhiLCAweDI1LCAweDRhLCAweDNlLCAweDdhLCAweGJhLAorICAweDc0LCAweDczLCAweGIwLCAweDRmLCAweDA5LCAweGUzLCAweGIzLCAweGE2LCAweDNjLCAweDhjLCAweDM4LCAweDRjLAorICAweDdkLCAweDQ4LCAweGRjLCAweDMyLCAweDA1LCAweGViLCAweDI3LCAweGNjLCAweGM2LCAweDAzLCAweGNiLCAweDg0LAorICAweDUwLCAweGYzLCAweDc1LCAweGUwLCAweGVhLCAweDM0LCAweGQ5LCAweDQxLCAweDBiLCAweDkxLCAweDk0LCAweGQ5LAorICAweGU3LCAweDU1LCAweGQzLCAweDQ2LCAweDI5LCAweDg4LCAweDZkLCAweDcyLCAweDU2LCAweDNkLCAweGRjLCAweDNhLAorICAweDBiLCAweDhhLCAweDk4LCAweDQ1LCAweGI1LCAweDE3LCAweDQ1LCAweDBkLCAweDczLCAweGU1LCAweGY1LCAweDAyLAorICAweDkxLCAweDU4LCAweDYyLCAweGQzLCAweGMwLCAweGQ0LCAweGU4LCAweDVjLCAweGY0LCAweDJhLCAweGU5LCAweDg5LAorICAweGYzLCAweDY4LCAweDk1LCAweGNiLCAweDEzLCAweGExLCAweGU0LCAweGNlLCAweDc4LCAweDg5LCAweDEyLCAweDQ3LAorICAweGZlLCAweGNmLCAweGIxLCAweDVmLCAweGYyLCAweDUyLCAweGY4LCAweGRlLCAweGVmLCAweGQyLCAweDdmLCAweDc1LAorICAweGI5LCAweGYwLCAweDA4LCAweDQwLCAweDM0LCAweDBlLCAweGU0LCAweGYxLCAweDFhLCAweDQyLCAweDgzLCAweGJkLAorICAweDVlLCAweGZjLCAweDQ5LCAweDM3LCAweDExLCAweDQ2LCAweDlhLCAweDZjLCAweDNkLCAweGQyLCAweDlhLCAweDE3LAorICAweDlhLCAweDczLCAweDU3LCAweGI2LCAweGY1LCAweDUzLCAweDg5LCAweDY3LCAweGMyLCAweGIyLCAweDZhLCAweGY0LAorICAweGFmLCAweGYwLCAweDA4LCAweGFlLCAweGQ4LCAweDZkLCAweGFjLCAweDcyLCAweGFjLCAweGVmLCAweGUyLCAweDhiLAorICAweGYzLCAweDc5LCAweDdjLCAweDFmLCAweDUzLCAweGQ2LCAweGZhLCAweGJmLCAweDEyLCAweDAwLCAweDM4LCAweDIxLAorICAweDFhLCAweDg4LCAweDAwLCAweDdmLCAweGZmLCAweGZmLCAweGZlLCAweGVkLCAweDZkLCAweDYxLCAweGExLCAweDg5LAorICAweGFjLCAweDQ4LCAweDEyLCAweDg0LCAweDAxLCAweDUxLCAweDk1LCAweDJhLCAweDAzLCAweDc3LCAweDAwLCAweDA4LAorICAweDI0LCAweGQ4LCAweDkzLCAweGMxLCAweDJhLCAweDg4LCAweDkxLCAweDU0LCAweDQyLCAweDI4LCAweDY0LCAweGUyLAorICAweDEwLCAweDRjLCAweDNhLCAweDhlLCAweDI2LCAweDA0LCAweDFlLCAweGU4LCAweGIzLCAweGMyLCAweDNlLCAweDBlLAorICAweDdlLCAweDZkLCAweGZkLCAweDFkLCAweDZiLCAweDRjLCAweDY5LCAweGVmLCAweGZlLCAweDQ2LCAweDUzLCAweDdjLAorICAweDNhLCAweGQyLCAweGM2LCAweGQ0LCAweGI4LCAweDM4LCAweDYxLCAweDA2LCAweGEzLCAweDVlLCAweDdlLCAweDBhLAorICAweDBiLCAweGQxLCAweDM0LCAweDVlLCAweDk2LCAweDhjLCAweDI4LCAweDEyLCAweDVhLCAweGM4LCAweDIwLCAweGE0LAorICAweGM2LCAweDJiLCAweDAwLCAweDhmLCAweDIzLCAweGI2LCAweDA2LCAweGU3LCAweGUzLCAweDgwLCAweDkxLCAweDg4LAorICAweGRmLCAweDMwLCAweGE1LCAweDhkLCAweDlhLCAweDU1LCAweDgyLCAweGYwLCAweDMxLCAweDhkLCAweDQ3LCAweDBiLAorICAweDE2LCAweGJmLCAweDQ1LCAweDkyLCAweDk0LCAweGM2LCAweDk4LCAweDIxLCAweGYzLCAweGQ1LCAweDA3LCAweGQ5LAorICAweGNjLCAweDcxLCAweGUzLCAweDI3LCAweDVhLCAweDVhLCAweGIxLCAweGYxLCAweDgxLCAweGZjLCAweDJhLCAweDA3LAorICAweGZkLCAweDQ1LCAweGY4LCAweDY1LCAweDM5LCAweDhlLCAweDg4LCAweDU0LCAweGZmLCAweDdkLCAweDc0LCAweDQ1LAorICAweDBmLCAweDhiLCAweDM1LCAweDIxLCAweGY0LCAweDU5LCAweGVkLCAweGZiLCAweGE2LCAweDc2LCAweDdjLCAweDhkLAorICAweDk1LCAweDE0LCAweGU5LCAweDkwLCAweDhhLCAweGYzLCAweDY4LCAweDI3LCAweDgwLCAweDM1LCAweDMwLCAweGEyLAorICAweDRjLCAweDhjLCAweDFhLCAweDEwLCAweGVhLCAweGM4LCAweDhjLCAweGM4LCAweGU1LCAweGI2LCAweDIyLCAweDFlLAorICAweGU2LCAweGIxLCAweDRiLCAweDEwLCAweDljLCAweGE0LCAweGRmLCAweGNjLCAweDAzLCAweGUwLCAweGQxLCAweDNlLAorICAweGZiLCAweDY1LCAweDNkLCAweDBkLCAweDIwLCAweDc4LCAweDk1LCAweDJlLCAweDhjLCAweDgzLCAweDMyLCAweGVmLAorICAweGNkLCAweDgzLCAweDA5LCAweDE0LCAweDIyLCAweDk3LCAweDhkLCAweDRiLCAweDIxLCAweDFkLCAweDZlLCAweDhlLAorICAweGYzLCAweDM1LCAweDEzLCAweGExLCAweDQ2LCAweDk1LCAweDg2LCAweDdmLCAweDdmLCAweDg3LCAweDFmLCAweDRlLAorICAweDczLCAweDAwLCAweDBmLCAweDNlLCAweGM1LCAweDI5LCAweDQ1LCAweDA2LCAweGMxLCAweDgxLCAweGI4LCAweDc2LAorICAweDAwLCAweGE0LCAweDU0LCAweDAwLCAweDAxLCAweDAwLCAweDU4LCAweDM2LCAweDc0LCAweDM0LCAweGQ2LCAweGI0LAorICAweGEyLCAweDI4LCAweDFmLCAweDRjLCAweGRkLCAweDcyLCAweGNlLCAweGFlLCAweGIwLCAweDc0LCAweDc2LCAweGVjLAorICAweDZiLCAweDUwLCAweGVmLCAweGE1LCAweDk5LCAweDExLCAweDY0LCAweDNlLCAweDRmLCAweGFlLCAweDc3LCAweDdiLAorICAweGZkLCAweGYxLCAweGJlLCAweDllLCAweGE2LCAweDY4LCAweDRmLCAweGI0LCAweDRhLCAweDJjLCAweDNiLCAweGNmLAorICAweDBkLCAweGQ4LCAweGE4LCAweGUyLCAweDg4LCAweDgzLCAweDE0LCAweDRiLCAweDMwLCAweGM2LCAweDk3LCAweDdiLAorICAweDYyLCAweGI4LCAweDAzLCAweDIxLCAweDU4LCAweDVkLCAweDczLCAweDhiLCAweDcxLCAweDAxLCAweGI1LCAweDc2LAorICAweDIzLCAweGU2LCAweGJjLCAweDc1LCAweGFmLCAweGExLCAweGNlLCAweDM3LCAweGVhLCAweGJkLCAweGUxLCAweDRjLAorICAweGY1LCAweDQyLCAweDBkLCAweDcxLCAweDViLCAweGMyLCAweGM2LCAweDNkLCAweGQ5LCAweGM1LCAweDFhLCAweDkzLAorICAweDczLCAweGZkLCAweDlmLCAweGQ4LCAweDMzLCAweGUyLCAweDI1LCAweDEwLCAweDdiLCAweGI0LCAweGJkLCAweDYwLAorICAweGY3LCAweDE5LCAweDMxLCAweGNhLCAweDg2LCAweDk3LCAweDcxLCAweGFhLCAweDZiLCAweDg5LCAweDQ1LCAweDg1LAorICAweDk2LCAweGQ1LCAweGVkLCAweDQxLCAweDMwLCAweDgwLCAweGEyLCAweDQyLCAweDg4LCAweGJiLCAweGM5LCAweGQ1LAorICAweGVkLCAweGNiLCAweDQ4LCAweDY0LCAweDYwLCAweDRlLCAweGE2LCAweGZkLCAweGEzLCAweGYyLCAweGY2LCAweDEzLAorICAweDc0LCAweDhkLCAweGU3LCAweDQxLCAweDUxLCAweDhmLCAweDc1LCAweDhkLCAweGFmLCAweGQ5LCAweDE2LCAweGIxLAorICAweGE3LCAweDU3LCAweGMwLCAweGZhLCAweGI5LCAweGYwLCAweGZjLCAweGZlLCAweGViLCAweDhkLCAweGI0LCAweDAzLAorICAweDA3LCAweDIxLCAweDFhLCAweDhjLCAweDAwLCAweDAxLCAweGZmLCAweGZmLCAweGZlLCAweGVkLCAweDZmLCAweDYyLAorICAweDhhLCAweDEwLCAweDg0LCAweDM0LCAweDE0LCAweDExLCAweDQyLCAweDYyLCAweGFhLCAweGYzLCAweDgxLCAweDg4LAorICAweDI4LCAweDUwLCAweDIwLCAweDA0LCAweDkxLCAweDgzLCAweDMyLCAweDMxLCAweDExLCAweDMwLCAweDI4LCAweDc4LAorICAweGRhLCAweDRiLCAweGZhLCAweGI2LCAweDcxLCAweDg5LCAweGE4LCAweDFlLCAweDkzLCAweDYxLCAweGNkLCAweDljLAorICAweDUzLCAweDcyLCAweDczLCAweDc5LCAweGY2LCAweDFmLCAweDI0LCAweDU4LCAweGYzLCAweDViLCAweDY1LCAweGE3LAorICAweDliLCAweDIzLCAweGM4LCAweDcyLCAweGI5LCAweDhlLCAweDg4LCAweDExLCAweDY1LCAweDQ3LCAweGE3LCAweDhmLAorICAweDg4LCAweDY4LCAweGY5LCAweDE1LCAweGM0LCAweDk1LCAweDI2LCAweGNkLCAweDBkLCAweGE4LCAweDVmLCAweDE2LAorICAweGQ4LCAweGVjLCAweGM2LCAweGE3LCAweDM4LCAweDBiLCAweDBjLCAweDBiLCAweDIzLCAweDBhLCAweDliLCAweGEyLAorICAweGNmLCAweGM3LCAweDBkLCAweDNkLCAweDM3LCAweDhmLCAweDdhLCAweDdkLCAweDU3LCAweGQ1LCAweDU5LCAweDM2LAorICAweDYyLCAweDg0LCAweGJhLCAweGRlLCAweGYyLCAweDY0LCAweDc3LCAweGU3LCAweGE2LCAweDk1LCAweDRkLCAweDczLAorICAweDNjLCAweDA3LCAweDlhLCAweGI5LCAweGU0LCAweDY2LCAweDIxLCAweGMxLCAweDFlLCAweDcxLCAweDEzLCAweDYwLAorICAweDdiLCAweDI0LCAweGFkLCAweDRiLCAweDYxLCAweDQ3LCAweDQwLCAweGY0LCAweGVhLCAweGYyLCAweGM2LCAweGNkLAorICAweDA1LCAweDVjLCAweDQyLCAweDllLCAweDZlLCAweGJlLCAweDFhLCAweDRiLCAweGFiLCAweDkwLCAweGI1LCAweDI5LAorICAweDg3LCAweDUxLCAweDllLCAweDY5LCAweDc3LCAweGVkLCAweDY4LCAweDMyLCAweGI2LCAweGJlLCAweGEzLCAweDkzLAorICAweDlhLCAweDY3LCAweGMyLCAweGQzLCAweGM3LCAweDE3LCAweDg0LCAweGYwLCAweDYxLCAweDg4LCAweDc0LCAweGQ2LAorICAweDUxLCAweDkwLCAweDViLCAweDQwLCAweDg0LCAweDM2LCAweDY3LCAweDQwLCAweGE0LCAweGNmLCAweDZlLCAweGRkLAorICAweDM2LCAweDViLCAweGE4LCAweGRlLCAweGE0LCAweDVjLCAweGZiLCAweGNmLCAweGY3LCAweGU1LCAweDI2LCAweDg0LAorICAweDVkLCAweDQ2LCAweGJhLCAweDY0LCAweDhkLCAweDgzLCAweDAwLCAweGE5LCAweGJhLCAweGQyLCAweGQ4LCAweGJjLAorICAweDhkLCAweGM2LCAweGJjLCAweGRkLCAweGFkLCAweDU5LCAweGZiLCAweDUyLCAweDdmLCAweGVkLCAweDIxLCAweGNkLAorICAweGRiLCAweGIxLCAweGQ5LCAweGZjLCAweGZkLCAweDNkLCAweDc4LCAweGY5LCAweDdiLCAweDc4LCAweDAwLCAweDNiLAorICAweGIwLCAweDdlLCAweDI1LCAweDE0LCAweDE0LCAweDExLCAweDQyLCAweGU2LCAweDI5LCAweDI1LCAweDU0LCAweGFiLAorICAweGFhLCAweDU4LCAweDMwLCAweDA4LCAweGExLCAweDExLCAweDE0LCAweDI5LCAweGJkLCAweGUzLCAweDdhLCAweDVhLAorICAweDEzLCAweDk5LCAweGFmLCAweDBlLCAweGM3LCAweDNhLCAweDY5LCAweDQwLCAweDY1LCAweDAyLCAweGIzLCAweDQxLAorICAweGRhLCAweGJmLCAweDUxLCAweGI5LCAweDI3LCAweGQwLCAweGMwLCAweDMwLCAweDY3LCAweDMwLCAweDM4LCAweGM4LAorICAweDBmLCAweDBhLCAweDA0LCAweDNjLCAweDk1LCAweDBmLCAweDkxLCAweDk2LCAweDI4LCAweDdlLCAweDVmLCAweDU0LAorICAweDQ5LCAweDEzLCAweDIwLCAweGQzLCAweGQwLCAweDQ4LCAweGJiLCAweGFlLCAweDEyLCAweDAyLCAweDk1LCAweGExLAorICAweGMxLCAweDVhLCAweDY3LCAweGQ5LCAweDRiLCAweDc5LCAweDUwLCAweDI4LCAweDUzLCAweGM5LCAweDAxLCAweDBiLAorICAweGFlLCAweGZiLCAweGYwLCAweDVkLCAweGExLCAweDY3LCAweGEzLCAweGMyLCAweDQ3LCAweDM2LCAweDlmLCAweDc3LAorICAweGE4LCAweDQyLCAweDRhLCAweGQ0LCAweGVkLCAweGRjLCAweDZkLCAweDJjLCAweDcwLCAweGM4LCAweDE5LCAweGMyLAorICAweDQyLCAweGRlLCAweDA0LCAweGQ4LCAweDg0LCAweDExLCAweDc4LCAweGYxLCAweGRhLCAweDllLCAweGJhLCAweDRlLAorICAweDQ5LCAweGNjLCAweDg5LCAweDAwLCAweGRjLCAweDM0LCAweDhhLCAweDEwLCAweGE2LCAweGNhLCAweDEyLCAweDA1LAorICAweDcxLCAweDU4LCAweDQ0LCAweDg4LCAweDUzLCAweDRmLCAweGJmLCAweDhlLCAweDgxLCAweGEzLCAweDFhLCAweDQ2LAorICAweGFhLCAweGZkLCAweGYxLCAweGQ5LCAweGM4LCAweDA0LCAweDhkLCAweDc2LCAweDY5LCAweDFmLCAweDc3LCAweGEzLAorICAweDlmLCAweGJmLCAweGYwLCAweGY0LCAweGU2LCAweDQwLCAweDM4LCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDNmLAorICAweGZmLCAweGZmLCAweGZlLCAweGZmLCAweDZjLCAweDgxLCAweGExLCAweDBhLCAweDA4LCAweDI2LCAweDE0LCAweDA5LAorICAweDQyLCAweGQwLCAweGI2LCAweDVhLCAweGU2LCAweGY0LCAweDAxLCAweDgwLCAweDQwLCAweDJhLCAweGVhLCAweGU4LAorICAweDJkLCAweDhlLCAweDJhLCAweGZhLCAweGFlLCAweDAxLCAweDFiLCAweDM2LCAweGMzLCAweGVkLCAweGQ2LCAweDY1LAorICAweDQwLCAweGMyLCAweGI5LCAweDI3LCAweDhjLCAweGYyLCAweDM2LCAweDQ5LCAweGMzLCAweGY1LCAweGE2LCAweDE5LAorICAweDdlLCAweGI4LCAweGY0LCAweDg1LCAweDMxLCAweDIzLCAweDlmLCAweDdlLCAweDJmLCAweGFhLCAweGUxLCAweGUxLAorICAweDA3LCAweDQwLCAweDUyLCAweGQxLCAweDI4LCAweGM4LCAweDA3LCAweGZlLCAweGM2LCAweDVjLCAweDdmLCAweDM0LAorICAweDcwLCAweGJhLCAweDc0LCAweGVjLCAweDg3LCAweGUxLCAweDg5LCAweDc0LCAweDA5LCAweDhmLCAweGU4LCAweDdlLAorICAweGZhLCAweGZjLCAweDRkLCAweGZjLCAweDY2LCAweDAyLCAweGY2LCAweGIyLCAweDYyLCAweDg2LCAweDM4LCAweGM5LAorICAweDhjLCAweDAzLCAweDIzLCAweDAyLCAweDQ4LCAweDA0LCAweDEyLCAweDU2LCAweDEyLCAweDc0LCAweDIwLCAweGQ5LAorICAweDBlLCAweGIzLCAweGJkLCAweDZhLCAweDI5LCAweDA4LCAweGYxLCAweGY2LCAweGM4LCAweDlhLCAweDI4LCAweGZjLAorICAweGRlLCAweDE0LCAweDYwLCAweGJlLCAweDY2LCAweDM5LCAweDY0LCAweDZhLCAweDM4LCAweGRkLCAweGQxLCAweDFlLAorICAweGJhLCAweGQ3LCAweDZhLCAweGYxLCAweDdhLCAweGE5LCAweDVmLCAweGIzLCAweDZmLCAweDM0LCAweDJhLCAweDJmLAorICAweDI3LCAweDc1LCAweGYwLCAweGVlLCAweDY5LCAweDJjLCAweGM4LCAweGZiLCAweGQyLCAweDFhLCAweGYxLCAweDdlLAorICAweGRhLCAweGY1LCAweGViLCAweDMwLCAweGUzLCAweGY5LCAweGNjLCAweDEzLCAweDhhLCAweGI1LCAweGNiLCAweDlkLAorICAweDRjLCAweDkwLCAweDJlLCAweDMxLCAweGIyLCAweDYxLCAweDJhLCAweDNkLCAweGRkLCAweDljLCAweGZiLCAweGViLAorICAweGM2LCAweDgxLCAweGExLCAweGE5LCAweDkyLCAweGViLCAweDZjLCAweDhjLCAweGE5LCAweDZjLCAweGNlLCAweGI5LAorICAweDJiLCAweDAyLCAweDE0LCAweDQzLCAweDg2LCAweDIyLCAweDI4LCAweDE0LCAweDljLCAweDQ5LCAweDc5LCAweDcyLAorICAweDllLCAweGIyLCAweDkxLCAweGEwLCAweDRhLCAweDY0LCAweDlkLCAweGJhLCAweDI1LCAweGQ2LCAweDdhLCAweGJkLAorICAweDFmLCAweDk3LCAweGNmLCAweGUxLCAweGM4LCAweDAxLCAweGUzLCAweGRhLCAweGE2LCAweDI4LCAweGEwLCAweGEwLAorICAweDZlLCAweDFkLCAweDgwLCAweDRhLCAweDg4LCAweDI4LCAweDAwLCAweDAwLCAweDQ0LCAweDYwLCAweDU2LCAweDllLAorICAweGVlLCAweGM1LCAweDU1LCAweGNkLCAweDI5LCAweDgyLCAweDU1LCAweDc4LCAweGVkLCAweGQ1LCAweGIzLCAweDI5LAorICAweDA5LCAweDNhLCAweGQ3LCAweDBjLCAweDA2LCAweDcyLCAweDE1LCAweDBmLCAweDllLCAweDA4LCAweGJjLCAweGU3LAorICAweGI1LCAweGQzLCAweDQ2LCAweDg0LCAweDQyLCAweDczLCAweGEyLCAweGRhLCAweDMxLCAweGE5LCAweDI3LCAweDZmLAorICAweDRiLCAweGY2LCAweGIzLCAweGFjLCAweGMzLCAweDllLCAweGI0LCAweGQ1LCAweGY4LCAweGJiLCAweDlmLCAweGJkLAorICAweDkxLCAweDIyLCAweGI1LCAweGZkLCAweGJhLCAweDkxLCAweGMxLCAweDZlLCAweGIwLCAweGQ1LCAweDcwLCAweDM4LAorICAweDYyLCAweDNiLCAweDA2LCAweDIwLCAweGRjLCAweDYyLCAweGNkLCAweDFmLCAweDY3LCAweGQ5LCAweGYxLCAweGYyLAorICAweGZhLCAweDAwLCAweGIyLCAweDMxLCAweDAyLCAweDFmLCAweDNlLCAweGRmLCAweDk3LCAweDI1LCAweGE2LCAweGUxLAorICAweDUxLCAweGJhLCAweDM3LCAweDRjLCAweDEyLCAweDFkLCAweDRjLCAweDNhLCAweGJlLCAweDQxLCAweGM0LCAweDNiLAorICAweDI0LCAweDlmLCAweDVmLCAweGY5LCAweGFhLCAweDdiLCAweGRkLCAweDVjLCAweGE4LCAweDQ2LCAweDc3LCAweGExLAorICAweDRhLCAweGY0LCAweDI0LCAweGQxLCAweGFjLCAweDQ2LCAweDRjLCAweGRiLCAweGViLCAweDgyLCAweDk4LCAweDMzLAorICAweDMzLCAweDhkLCAweDYyLCAweDQwLCAweDk4LCAweGMxLCAweDNhLCAweGUzLCAweDExLCAweGFjLCAweDJlLCAweDk3LAorICAweDZmLCAweDZkLCAweDkxLCAweGM2LCAweGM4LCAweDYyLCAweDk3LCAweDE5LCAweDg2LCAweGRkLCAweDdiLCAweDhkLAorICAweGFmLCAweGIzLCAweGRmLCAweGYwLCAweGY4LCAweDFkLCAweDQ4LCAweDAzLCAweDA3LCAweDIxLCAweDFhLCAweDg4LAorICAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweGZlLCAweGYxLCAweDZhLCAweGEzLCAweGExLCAweGMwLCAweDI0LCAweDg0LAorICAweDIzLCAweDA2LCAweDA2LCAweGExLCAweDAwLCAweDEwLCAweDE4LCAweDAwLCAweDEwLCAweDEyLCAweDU0LCAweGQ4LAorICAweGMwLCAweGM1LCAweGYyLCAweGE0LCAweDhhLCAweDc5LCAweDQwLCAweDg0LCAweDYzLCAweGI4LCAweDhhLCAweDFiLAorICAweDg0LCAweDExLCAweDMxLCAweDY3LCAweDc4LCAweDI0LCAweDhhLCAweDBjLCAweGFhLCAweDJjLCAweDg2LCAweDJiLAorICAweDcwLCAweDE0LCAweGI1LCAweGU1LCAweGI5LCAweGIwLCAweDliLCAweDJhLCAweDRmLCAweDE2LCAweDhkLCAweDhmLAorICAweDgwLCAweGE4LCAweGUzLCAweDBkLCAweDNjLCAweGFmLCAweDY3LCAweDBmLCAweGFhLCAweGU0LCAweDkyLCAweDI0LAorICAweDI4LCAweGZjLCAweDBmLCAweDNiLCAweDJjLCAweDc3LCAweDU1LCAweDczLCAweDIxLCAweDhiLCAweDJkLCAweDA3LAorICAweGMyLCAweDAyLCAweGE5LCAweDdlLCAweDQ3LCAweGVjLCAweGI4LCAweDI1LCAweGM4LCAweDIwLCAweDhkLCAweGIxLAorICAweDIyLCAweGMyLCAweGRhLCAweDkzLCAweDRkLCAweDNhLCAweGNhLCAweGJkLCAweDhjLCAweGQzLCAweDE0LCAweGVhLAorICAweDRjLCAweGQzLCAweDE2LCAweDI2LCAweDVjLCAweGE4LCAweDQxLCAweDliLCAweGE1LCAweDBjLCAweDViLCAweGQ2LAorICAweDA2LCAweDJhLCAweGRhLCAweDZiLCAweGFkLCAweDQ2LCAweDVhLCAweDQ0LCAweDY2LCAweDYwLCAweDQwLCAweDAwLAorICAweDNjLCAweDQxLCAweGQ1LCAweDQ1LCAweGQ2LCAweDVjLCAweDQ4LCAweGY2LCAweDVhLCAweGM4LCAweGEwLCAweGE1LAorICAweDE2LCAweDQ1LCAweDk2LCAweDMwLCAweDQ5LCAweDEwLCAweGQzLCAweGQzLCAweGQ0LCAweDk4LCAweDRkLCAweGI3LAorICAweGE0LCAweDg5LCAweDlhLCAweGRlLCAweGI3LCAweGM4LCAweDhiLCAweDY0LCAweDBkLCAweDU5LCAweDgxLCAweDA0LAorICAweDVlLCAweGVmLCAweDdlLCAweDYxLCAweDE0LCAweGMyLCAweGI1LCAweDcxLCAweGQxLCAweDE2LCAweDU0LCAweDlhLAorICAweDQ4LCAweDk3LCAweGNiLCAweDI1LCAweGJhLCAweGJhLCAweGVhLCAweGE2LCAweDgyLCAweDQ1LCAweDBlLCAweDM4LAorICAweDYyLCAweDRjLCAweDg2LCAweDgyLCAweGVkLCAweDUyLCAweDJkLCAweDE2LCAweDE1LCAweDZiLCAweDM0LCAweDk2LAorICAweDE4LCAweGIxLCAweDhlLCAweDA5LCAweDU4LCAweDg4LCAweDc4LCAweGE0LCAweDlhLCAweGQ3LCAweDJlLCAweDNiLAorICAweDM3LCAweDk2LCAweDg1LCAweDU1LCAweGVlLCAweGVlLCAweDhlLCAweDFjLCAweDNlLCAweDFmLCAweDFmLCAweGEyLAorICAweDAwLCAweDFlLCAweDdlLCAweDY1LCAweDI4LCAweDIyLCAweDg3LCAweDYwLCAweDBhLCAweDgxLCAweDU3LCAweDg4LAorICAweDUwLCAweDAwLCAweDJlLCAweDU1LCAweDA1LCAweDI4LCAweDYyLCAweDNhLCAweDBjLCAweGM1LCAweGFkLCAweGQzLAorICAweDM4LCAweDY3LCAweGFlLCAweDJkLCAweGE2LCAweDAwLCAweDMxLCAweDllLCAweGJjLCAweDZhLCAweDI0LCAweDE0LAorICAweGFlLCAweGIxLCAweDY0LCAweGVmLCAweDMzLCAweDE0LCAweGE4LCAweDBjLCAweDI5LCAweDMzLCAweDJkLCAweDIwLAorICAweGJlLCAweDUwLCAweDMzLCAweDZkLCAweDY3LCAweDAzLCAweGIyLCAweDM3LCAweDQyLCAweDkyLCAweDE3LCAweDQ5LAorICAweDQ4LCAweDRhLCAweDUyLCAweDQxLCAweGFkLCAweDRjLCAweDlkLCAweGI1LCAweDc5LCAweGRjLCAweDg1LCAweDA0LAorICAweDMyLCAweDBhLCAweDhjLCAweGE2LCAweDM3LCAweDMyLCAweDc4LCAweDc4LCAweDExLCAweDhmLCAweGQ0LCAweGMxLAorICAweDk5LCAweGY2LCAweDU5LCAweGEwLCAweGNkLCAweDA2LCAweGFmLCAweDdmLCAweGYyLCAweDlhLCAweGMwLCAweDM0LAorICAweDI2LCAweDAyLCAweDZhLCAweDY5LCAweDgxLCAweDAyLCAweDQwLCAweGYzLCAweDA4LCAweDY0LCAweGE0LCAweGY0LAorICAweGZiLCAweDM2LCAweDRiLCAweDk3LCAweGUyLCAweGE3LCAweDgxLCAweGI5LCAweDQyLCAweDk0LCAweGNhLCAweDUyLAorICAweDVlLCAweDVkLCAweDA3LCAweDAxLCAweDczLCAweDVjLCAweGRlLCAweGMxLCAweDI0LCAweGFkLCAweGUxLCAweDQ1LAorICAweDJjLCAweDBmLCAweGJmLCAweDE5LCAweGM5LCAweDFkLCAweDEyLCAweDVhLCAweDUyLCAweDg4LCAweGJmLCAweDU3LAorICAweDJmLCAweDhmLCAweDQ2LCAweGJlLCAweGYwLCAweDA3LCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweGZmLAorICAweGZmLCAweGZlLCAweGZkLCAweDZiLCAweGEyLCAweDMxLCAweDA1LCAweDQ0LCAweDY0LCAweDEzLCAweDExLCAweDQyLAorICAweDEwLCAweGUxLCAweDIyLCAweGE1LCAweDJhLCAweGE1LCAweDAwLCAweDgwLCAweDIyLCAweDI1LCAweDYwLCAweGZhLAorICAweDEyLCAweDAxLCAweDE1LCAweGYxLCAweGUzLCAweGJmLCAweGI5LCAweGMwLCAweDg1LCAweDNmLCAweDlmLCAweDIwLAorICAweDhmLCAweGYyLCAweDY3LCAweGJhLCAweGNiLCAweGUxLCAweDIzLCAweGZhLCAweDZiLCAweDM3LCAweDZiLCAweDljLAorICAweDZlLCAweDhhLCAweGE4LCAweDA3LCAweGEzLCAweDM3LCAweGFmLCAweDc4LCAweDdhLCAweDZiLCAweDU3LCAweDE3LAorICAweGI2LCAweDQ3LCAweDc0LCAweDg4LCAweDE4LCAweGU3LCAweGY4LCAweGQ1LCAweDA2LCAweDk5LCAweGM4LCAweGZjLAorICAweGZkLCAweDMzLCAweDg3LCAweDcyLCAweDZmLCAweGI2LCAweDUxLCAweDk3LCAweGJkLCAweDhjLCAweGFlLCAweDMwLAorICAweDk0LCAweDM0LCAweGQxLCAweDAyLCAweDNiLCAweGFiLCAweDNlLCAweGVlLCAweGQzLCAweGZmLCAweGI1LCAweDcwLAorICAweGM5LCAweDJjLCAweGI2LCAweDg1LCAweDliLCAweDU3LCAweDkxLCAweDAwLCAweDMwLCAweGQ1LCAweDhkLCAweDg2LAorICAweDRjLCAweGIzLCAweDc0LCAweDhlLCAweGM1LCAweGY0LCAweDU2LCAweGM2LCAweDk1LCAweDMzLCAweDRlLCAweDFiLAorICAweDZjLCAweDIzLCAweGNhLCAweDIyLCAweDcxLCAweDg0LCAweDBkLCAweDA2LCAweGJhLCAweDI0LCAweGY1LCAweDViLAorICAweDBjLCAweDgxLCAweDQ0LCAweDFiLCAweDU1LCAweDFkLCAweDg0LCAweDk0LCAweGI3LCAweGU4LCAweDNkLCAweDIxLAorICAweGNkLCAweGE3LCAweGZlLCAweDBlLCAweGNhLCAweDU4LCAweGIwLCAweGIzLCAweGRhLCAweGU0LCAweGIxLCAweGVjLAorICAweDBjLCAweDU2LCAweDI1LCAweDlkLCAweDJkLCAweGJmLCAweDdkLCAweGM3LCAweDAwLCAweDhiLCAweDEyLCAweDViLAorICAweGQzLCAweGYxLCAweGM0LCAweGIyLCAweGI2LCAweDg1LCAweDlmLCAweGMzLCAweDQ2LCAweGFkLCAweGRmLCAweDQ5LAorICAweGJlLCAweGRiLCAweGFlLCAweDljLCAweDhiLCAweGMzLCAweDBmLCAweDM2LCAweGY3LCAweGNiLCAweGJiLCAweDJhLAorICAweDdjLCAweDllLCAweGJmLCAweGY3LCAweGVmLCAweDhlLCAweGMyLCAweDY4LCAweGY2LCAweGRhLCAweDVhLCAweDZhLAorICAweGM1LCAweDExLCAweDc1LCAweDBlLCAweDdiLCAweGFlLCAweGY4LCAweGY2LCAweDYxLCAweGQ1LCAweGRkLCAweGRmLAorICAweGVjLCAweGZiLCAweGViLCAweGEyLCAweDQwLCAweDFlLCAweDdlLCAweDY0LCAweGQ0LCAweDE5LCAweDhhLCAweDA4LAorICAweGUxLCAweGQ4LCAweDAwLCAweGE4LCAweDg4LCAweDAwLCAweDAwLCAweDJkLCAweDAxLCAweGFkLCAweDBjLCAweDg5LAorICAweDgwLCAweDJlLCAweDMwLCAweDhhLCAweDAwLCAweGJjLCAweDIxLCAweDA3LCAweDBlLCAweDA1LCAweDVlLCAweDdiLAorICAweGY1LCAweDk1LCAweDY5LCAweDVmLCAweDZiLCAweDhjLCAweDQxLCAweDllLCAweDQzLCAweDgwLCAweDkxLCAweDcxLAorICAweDAwLCAweDMwLCAweDcwLCAweGM4LCAweDYwLCAweDVkLCAweDJhLCAweDgxLCAweGU4LCAweGMxLCAweGIwLCAweGVkLAorICAweDUxLCAweDFkLCAweDczLCAweGFjLCAweDNiLCAweGVhLCAweGE1LCAweDgzLCAweDY1LCAweDY1LCAweGYwLCAweDZjLAorICAweDI5LCAweGYzLCAweGY3LCAweDk2LCAweDg5LCAweGE3LCAweGFlLCAweGEwLCAweGRjLCAweDcxLCAweDUzLCAweDcyLAorICAweDNhLCAweDFjLCAweGViLCAweGI2LCAweDUwLCAweGMyLCAweDZiLCAweDRiLCAweGQzLCAweDM3LCAweDJmLCAweGI4LAorICAweGMyLCAweGM5LCAweDQ0LCAweGJlLCAweDQzLCAweGYwLCAweDBlLCAweGU5LCAweDBhLCAweGExLCAweDI0LCAweDQyLAorICAweGVmLCAweDI0LCAweDcyLCAweGVlLCAweGI4LCAweDhlLCAweGEwLCAweDBjLCAweDY1LCAweGQwLCAweGFhLCAweGJjLAorICAweDU3LCAweDFkLCAweDc5LCAweDcyLCAweDMwLCAweDM1LCAweDgyLCAweGMyLCAweDdkLCAweDk0LCAweGJlLCAweDFlLAorICAweDRkLCAweDNiLCAweDAwLCAweDEwLCAweGNjLCAweDhkLCAweDkxLCAweDRjLCAweGEwLCAweGQ0LCAweGZkLCAweDM2LAorICAweGMxLCAweDc2LCAweDVjLCAweDUyLCAweDI4LCAweDM5LCAweDdjLCAweGJmLCAweGYyLCAweDc1LCAweDFhLCAweDFlLAorICAweDI2LCAweGMwLCAweDBlLCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDNmLCAweGZmLCAweGZmLCAweGZlLCAweGZkLAorICAweDZjLCAweGEyLCAweGEyLCAweDA0LCAweGVhLCAweDY2LCAweDFhLCAweDg0LCAweDIxLCAweDY3LCAweDAwLCAweGE1LAorICAweDAwLCAweDAwLCAweDBiLCAweDI4LCAweDc3LCAweGJmLCAweGQ5LCAweGY5LCAweGU3LCAweGQwLCAweGZmLCAweGQwLAorICAweDQ4LCAweDAxLCAweDI2LCAweDQwLCAweDU0LCAweDA3LCAweGM3LCAweDNkLCAweGUxLCAweGRkLCAweDdiLCAweGY3LAorICAweGViLCAweGRhLCAweGVmLCAweDg3LCAweGNmLCAweDViLCAweDRiLCAweDU3LCAweGM5LCAweGEwLCAweGRlLCAweDFkLAorICAweGRiLCAweGI4LCAweDM5LCAweDI3LCAweGZmLCAweDNhLCAweDdmLCAweDc1LCAweGU4LCAweDMyLCAweDgwLCAweDJhLAorICAweGI4LCAweGRjLCAweDY0LCAweDgzLCAweGNhLCAweDUzLCAweDRlLCAweDdmLCAweDNiLCAweDdjLCAweDYxLCAweGYxLAorICAweDJiLCAweDE4LCAweDYwLCAweDk3LCAweDNiLCAweDcyLCAweGI5LCAweDM3LCAweDFjLCAweDJkLCAweGU5LCAweDk5LAorICAweDZkLCAweDk1LCAweDIxLCAweDNlLCAweGY4LCAweGUzLCAweDA2LCAweDc3LCAweGIxLCAweGFmLCAweGVkLCAweGFhLAorICAweGQyLCAweDA1LCAweDY2LCAweDEzLCAweDU5LCAweGE5LCAweGYwLCAweGFhLCAweGNkLCAweDE4LCAweGVhLCAweDllLAorICAweDMyLCAweGM3LCAweGNlLCAweDdlLCAweDk1LCAweDcwLCAweGM2LCAweGI1LCAweGE3LCAweGU5LCAweDA4LCAweDU3LAorICAweGI1LCAweGJjLCAweGI0LCAweDk2LCAweGYxLCAweDJmLCAweDFlLCAweDM4LCAweGFkLCAweGIzLCAweDU2LCAweDM3LAorICAweDJkLCAweGQzLCAweDZlLCAweDVlLCAweDEwLCAweGNlLCAweDM2LCAweGVjLCAweDgyLCAweDhkLCAweGMxLCAweDBkLAorICAweGQ1LCAweGM5LCAweGJkLCAweGFlLCAweGU4LCAweGEzLCAweDBhLCAweDI0LCAweGM0LCAweGU1LCAweDMzLCAweDUxLAorICAweDQ2LCAweGMyLCAweGUzLCAweDhlLCAweGRjLCAweGU4LCAweDRlLCAweDMzLCAweDFiLCAweDJhLCAweGYzLCAweDU1LAorICAweGQ1LCAweDdkLCAweGEyLCAweGVmLCAweDU3LCAweGRkLCAweGUxLCAweDI0LCAweDg3LCAweGUxLCAweGUxLCAweGEwLAorICAweGY5LCAweGQ5LCAweDE5LCAweGUyLCAweGQ2LCAweDFkLCAweGQ0LCAweDZkLCAweGVmLCAweDBhLCAweGYyLCAweGJiLAorICAweGVmLCAweGY3LCAweGY0LCAweGJjLCAweGY0LCAweDdjLCAweDU3LCAweDhkLCAweGVkLCAweDM1LCAweDk2LCAweGZkLAorICAweGU3LCAweDI3LCAweGIyLCAweDRlLCAweDczLCAweDcyLCAweGVkLCAweGQ3LCAweGViLCAweDhmLCAweDVlLCAweDdjLAorICAweDc5LCAweDAwLCAweDNjLCAweGZiLCAweDU0LCAweDYyLCAweGQyLCAweDNhLCAweDBhLCAweDA2LCAweGExLCAweGRjLAorICAweGEwLCAweDU0LCAweDAwLCAweDAwLCAweDAwLCAweDEyLCAweDI2LCAweDBjLCAweDU2LCAweDVlLCAweDU1LCAweGI5LAorICAweGJjLCAweDY0LCAweDYyLCAweDhkLCAweDc0LCAweGMxLCAweGE3LCAweGEyLCAweDM5LCAweDU1LCAweDZlLCAweGVjLAorICAweGMzLCAweDNiLCAweGM3LCAweDg0LCAweDY3LCAweDc1LCAweDU3LCAweGE0LCAweDc2LCAweDkzLCAweGZjLCAweGIzLAorICAweDc4LCAweDYxLCAweDgxLCAweGUzLCAweGNmLCAweGUzLCAweDQ0LCAweGRjLCAweGRjLCAweDZmLCAweGI1LCAweDlhLAorICAweDM5LCAweGRkLCAweGQxLCAweDAxLCAweGVhLCAweGVlLCAweGFkLCAweDE1LCAweDg2LCAweDQzLCAweDMwLCAweDM5LAorICAweDBhLCAweDUyLCAweDljLCAweDdkLCAweDJjLCAweDg2LCAweGMzLCAweGQwLCAweGIwLCAweDgxLCAweDRhLCAweGQyLAorICAweGM1LCAweDE4LCAweGRmLCAweDUxLCAweDUyLCAweDg0LCAweDlkLCAweGRlLCAweDE1LCAweDUxLCAweDMxLCAweDU0LAorICAweDBmLCAweDI5LCAweGZjLCAweGRmLCAweDBjLCAweGU3LCAweGQ3LCAweDQ4LCAweGI0LCAweDUwLCAweGVkLCAweGNiLAorICAweGVlLCAweGRiLCAweGM3LCAweDE5LCAweGMyLCAweDY0LCAweGMxLCAweGRjLCAweDk1LCAweDA1LCAweDFhLCAweDJjLAorICAweDU2LCAweGNkLCAweDIwLCAweGY0LCAweDBjLCAweDViLCAweDU0LCAweDhmLCAweDk2LCAweDg5LCAweDlkLCAweDViLAorICAweDAwLCAweDMwLCAweDhjLCAweDE3LCAweGQwLCAweDg2LCAweGQyLCAweDYyLCAweDc2LCAweDQyLCAweDM5LCAweDc2LAorICAweDUyLCAweGRhLCAweGEyLCAweGQ3LCAweDViLCAweDczLCAweDNmLCAweDFiLCAweGE3LCAweGNiLCAweDFmLCAweDU3LAorICAweDNlLCAweDVkLCAweDFjLCAweDAwLCAweDM4LCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAzLCAweGZmLCAweGZmLAorICAweGZlLCAweGZkLCAweDY4LCAweGE0LCAweDMwLCAweDkwLCAweDQ0LCAweGQ0LCAweDJjLCAweDBkLCAweGMyLCAweDAyLAorICAweDEyLCAweDRiLCAweGEyLCAweDg0LCAweDAwLCAweDAyLCAweDIxLCAweDQzLCAweGRiLCAweDQ4LCAweGE0LCAweGQ1LAorICAweGJiLCAweDg5LCAweDExLCAweDVmLCAweGM0LCAweGU2LCAweDcyLCAweDQ4LCAweDNmLCAweDNkLCAweGQ0LCAweGM1LAorICAweGUzLCAweDY5LCAweDk0LCAweDUwLCAweGZkLCAweDVkLCAweGQ5LCAweDNmLCAweDkwLCAweGE3LCAweDdjLCAweGFkLAorICAweDU3LCAweGUzLCAweDVhLCAweDVkLCAweGE4LCAweGVhLCAweGFjLCAweDczLCAweDY5LCAweDFkLCAweDJlLCAweGNmLAorICAweDM5LCAweDRkLCAweGFiLCAweGJmLCAweDJiLCAweDllLCAweDcwLCAweDU3LCAweDlhLCAweGQyLCAweDBkLCAweDdkLAorICAweGFhLCAweDNmLCAweGFmLCAweDQyLCAweDhhLCAweGZiLCAweDFjLCAweGViLCAweGJlLCAweDIxLCAweGY4LCAweDExLAorICAweDZkLCAweGJhLCAweDM4LCAweDhjLCAweGMzLCAweDNhLCAweDY2LCAweDY5LCAweGY2LCAweDViLCAweGVhLCAweGU4LAorICAweGE1LCAweDg3LCAweDhlLCAweGRlLCAweGUyLCAweDQ4LCAweDA3LCAweGU2LCAweDRhLCAweDA3LCAweDAzLCAweGE1LAorICAweDg1LCAweGM1LCAweDdjLCAweDA5LCAweDAxLCAweDhjLCAweDQwLCAweGU5LCAweDA3LCAweDQ0LCAweDk3LCAweGJjLAorICAweDQxLCAweDExLCAweDlkLCAweGRmLCAweDQzLCAweGE1LCAweDY0LCAweDAxLCAweDljLCAweDNmLCAweDZmLCAweDkyLAorICAweDU2LCAweGU3LCAweDAwLCAweDg3LCAweDE2LCAweDM3LCAweDIwLCAweGEyLCAweGIxLCAweGU4LCAweDRiLCAweDc3LAorICAweGE4LCAweDgwLCAweDMwLCAweDZhLCAweGJkLCAweDU2LCAweDA4LCAweDQyLCAweGJhLCAweGU5LCAweDcwLCAweGE2LAorICAweGE1LCAweDYwLCAweGZlLCAweDVkLCAweGVkLCAweDI3LCAweGRhLCAweGFiLCAweGQyLCAweDI1LCAweGExLCAweGNiLAorICAweDYxLCAweDUzLCAweDViLCAweDE1LCAweGY3LCAweGJmLCAweDIzLCAweGQxLCAweGNkLCAweDQ4LCAweGE5LCAweDAwLAorICAweDVhLCAweDQ2LCAweGRlLCAweGI4LCAweDIxLCAweDEyLCAweDI0LCAweGVkLCAweDA4LCAweDY0LCAweDI0LCAweDYzLAorICAweDAyLCAweDRkLCAweDg1LCAweDc0LCAweDM3LCAweGFmLCAweGMxLCAweGE3LCAweDRlLCAweDBkLCAweDc1LCAweGViLAorICAweGU1LCAweDVkLCAweDI5LCAweDhhLCAweDczLCAweGU1LCAweDEzLCAweDIxLCAweDk4LCAweGU3LCAweGRlLCAweGJkLAorICAweGQ2LCAweDdkLCAweGVjLCAweDM4LCAweGRkLCAweDNkLCAweDRjLCAweDAwLCAweDNkLCAweGZjLCAweDQ5LCAweDIyLAorICAweDUyLCAweDIyLCAweDBlLCAweDA2LCAweGUxLCAweGQ4LCAweDA5LCAweDQzLCAweDJkLCAweDU2LCAweDAyLCAweDgxLAorICAweDAzLCAweDM1LCAweDBhLCAweDEzLCAweDEwLCAweGRhLCAweDVjLCAweDYxLCAweDViLCAweDFkLCAweDgyLCAweDgzLAorICAweDNlLCAweDY3LCAweDE2LCAweDA5LCAweDhiLCAweDAwLCAweDgyLCAweGE3LCAweDNmLCAweDc3LCAweGVhLCAweDc1LAorICAweDczLCAweGE0LCAweDhmLCAweDZiLCAweGE1LCAweDNjLCAweGI3LCAweDQzLCAweDQ1LCAweDFhLCAweDViLCAweGJlLAorICAweDU0LCAweDRkLCAweDQxLCAweDEyLCAweDc4LCAweDZiLCAweDU5LCAweDU1LCAweDMzLCAweDMxLCAweDZkLCAweDMxLAorICAweGI2LCAweDk5LCAweDJkLCAweDIxLCAweDY5LCAweGUyLCAweGUzLCAweGQwLCAweGU3LCAweDNkLCAweDgxLCAweGQ5LAorICAweGUzLCAweGRlLCAweGE1LCAweDg2LCAweDRkLCAweDMxLCAweGRhLCAweGM2LCAweDFhLCAweDE4LCAweDc2LCAweGI3LAorICAweGUyLCAweDdhLCAweDJmLCAweDA1LCAweGY3LCAweDNlLCAweDNlLCAweDRkLCAweDdhLCAweDlhLCAweGJjLCAweGJmLAorICAweGI0LCAweGVhLCAweDNlLCAweGMzLCAweGZmLCAweGY5LCAweDBkLCAweGVhLCAweDBmLCAweDEzLCAweDJlLCAweGQwLAorICAweDlhLCAweGI4LCAweDFmLCAweGFjLCAweDBlLCAweGE0LCAweGI1LCAweDE0LCAweDkzLCAweDE1LCAweDAxLCAweDQyLAorICAweGQ1LCAweGM2LCAweDQyLCAweDM1LCAweGI2LCAweDBiLCAweGM4LCAweDgwLCAweGE4LCAweDZkLCAweGE0LCAweGRhLAorICAweDVkLCAweDVjLCAweGFkLCAweDEwLCAweDM1LCAweDJkLCAweDAzLCAweGQ3LCAweDdhLCAweDU5LCAweGZiLCAweGRlLAorICAweGFmLCAweGUyLCAweGI3LCAweGZiLCAweGU5LCAweDAwLCAweGUwLCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLAorICAweGZmLCAweGZmLCAweGZmLCAweDAxLCAweDZhLCAweGE0LCAweGEwLCAweDg1LCAweGM4LCAweDI2LCAweDBjLCAweDBjLAorICAweGMyLCAweDA1LCAweGU1LCAweGU5LCAweDJlLCAweGFiLCAweDU0LCAweDE4LCAweDAwLCAweDBiLCAweDI1LCAweDRlLAorICAweDQ1LCAweDc4LCAweDQwLCAweGM0LCAweGNhLCAweGUzLCAweDIxLCAweDJjLCAweGJiLCAweGViLCAweDlkLCAweDdhLAorICAweGU2LCAweDgzLCAweDFlLCAweDkzLCAweGY3LCAweGYyLCAweDBmLCAweDFiLCAweDM3LCAweGFjLCAweDlkLCAweDBkLAorICAweGFkLCAweGI3LCAweDczLCAweGJmLCAweGJmLCAweGZjLCAweDZmLCAweGEyLCAweGIzLCAweGRlLCAweGFiLCAweGY3LAorICAweDhlLCAweGRmLCAweDVlLCAweGQ1LCAweGU1LCAweDU1LCAweDk5LCAweDI2LCAweDUxLCAweDRhLCAweGQ0LCAweDlmLAorICAweGNlLCAweGQ2LCAweDFiLCAweGRlLCAweGVmLCAweDM0LCAweDEyLCAweDU0LCAweDhjLCAweDZhLCAweDE2LCAweDUwLAorICAweDg0LCAweDVjLCAweGEwLCAweGE0LCAweDgzLCAweGE5LCAweDhlLCAweDI0LCAweDIxLCAweDBlLCAweGZlLCAweGQ5LAorICAweGFjLCAweDY3LCAweGIwLCAweDFkLCAweDA5LCAweDVlLCAweGRkLCAweDNjLCAweGY1LCAweGM4LCAweDU2LCAweDM0LAorICAweGJjLCAweDJkLCAweDQ5LCAweGM0LCAweGE5LCAweDQ4LCAweGNkLCAweDNiLCAweDMwLCAweGFkLCAweDNjLCAweDkyLAorICAweDQyLCAweDM2LCAweGIwLCAweGE0LCAweDVkLCAweGI4LCAweDcyLCAweDk1LCAweGQ3LCAweGJhLCAweDMyLCAweDk3LAorICAweDg0LCAweDkyLCAweDkzLCAweGE0LCAweDBiLCAweDQ5LCAweDc5LCAweDVlLCAweGM3LCAweDc1LCAweDIzLCAweDdhLAorICAweGRhLCAweDU5LCAweGE1LCAweGYzLCAweDhjLCAweDNiLCAweDk5LCAweDEwLCAweDEwLCAweGY2LCAweDVjLCAweDdmLAorICAweDBhLCAweGVjLCAweDNjLCAweGJjLCAweDFiLCAweGU0LCAweGM1LCAweDIxLCAweDE5LCAweDkyLCAweGU1LCAweDUxLAorICAweDY5LCAweDJlLCAweDFkLCAweGY5LCAweGNjLCAweDY1LCAweGE2LCAweDMzLCAweDNmLCAweDQ0LCAweDc0LCAweGE4LAorICAweDA3LCAweDIyLCAweGQyLCAweGFlLCAweDk0LCAweDU4LCAweDJmLCAweDk0LCAweDhhLCAweDBkLCAweDkyLCAweDcxLAorICAweDI3LCAweDdiLCAweDVjLCAweDgxLCAweDI1LCAweGNmLCAweGFmLCAweGFhLCAweDA0LCAweDZjLCAweDMyLCAweDhmLAorICAweDgyLCAweDRkLCAweDA2LCAweDEyLCAweGJiLCAweDJkLCAweGRiLCAweDFmLCAweDRjLCAweGYzLCAweDlmLCAweGQwLAorICAweGYyLCAweDgxLCAweGViLCAweGU2LCAweDRmLCAweDMxLCAweGIwLCAweGUwLCAweDJhLCAweDFkLCAweDgyLCAweGEwLAorICAweGE4LCAweDJhLCAweDQ4LCAweDAwLCAweDAwLCAweDg0LCAweGQ4LCAweDNhLCAweDMzLCAweDU1LCAweGI3LCAweDliLAorICAweDJkLCAweDBhLCAweDEwLCAweDIxLCAweDYzLCAweGMxLCAweDc1LCAweGIxLCAweGY5LCAweDNhLCAweGQ3LCAweGU0LAorICAweDk2LCAweDAzLCAweDkyLCAweDE1LCAweGI1LCAweDY2LCAweDMxLCAweDlkLCAweDJlLCAweGYzLCAweDBiLCAweDYyLAorICAweDUxLCAweDE0LCAweDBhLCAweDZjLCAweGM5LCAweDYxLCAweGQ2LCAweDA3LCAweDg4LCAweDU2LCAweGYwLCAweDAxLAorICAweGEyLCAweDNiLCAweDg4LCAweDFkLCAweDRhLCAweGFiLCAweGQxLCAweGFiLCAweDM2LCAweGJmLCAweGRkLCAweDFhLAorICAweDUzLCAweDE5LCAweGZiLCAweDU1LCAweDI4LCAweDFmLCAweGFjLCAweDYzLCAweGNkLCAweDM0LCAweDY4LCAweDU2LAorICAweDE1LCAweDk3LCAweGExLCAweGViLCAweGJkLCAweDQ0LCAweDE5LCAweDc3LCAweDVkLCAweDEzLCAweDhjLCAweDc2LAorICAweGQyLCAweDcyLCAweGE1LCAweDMyLCAweDE5LCAweDQ5LCAweDczLCAweGJmLCAweDU2LCAweDc2LCAweDYwLCAweDY4LAorICAweGQ4LCAweGUzLCAweDMzLCAweDEwLCAweGQzLCAweGVkLCAweDkyLCAweGExLCAweDk3LCAweGI2LCAweDRiLCAweGU5LAorICAweDMzLCAweDBhLCAweDZkLCAweDkxLCAweGM0LCAweDRlLCAweGI2LCAweGU5LCAweGQzLCAweDg5LCAweGMyLCAweDZhLAorICAweGZjLCAweDZhLCAweDBjLCAweDExLCAweDA5LCAweDIwLCAweDdhLCAweGU3LCAweGVkLCAweGU3LCAweGNmLCAweGRiLAorICAweGFmLCAweGYxLCAweGEwLCAweDA3LCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweGZmLAorICAweDAzLCAweDZhLCAweGEyLCAweDU4LCAweGEwLCAweDY4LCAweDQyLCAweDZiLCAweDBlLCAweDA0LCAweDYxLCAweDEwLAorICAweGU4LCAweDM0LCAweGE0LCAweGE5LCAweDkyLCAweGEwLCAweDA0LCAweDBjLCAweGI0LCAweDM5LCAweDE5LCAweDcyLAorICAweGIzLCAweDM3LCAweGUxLCAweDcyLCAweDYwLCAweGZhLCAweDU3LCAweGE2LCAweDY5LCAweDdkLCAweGQ1LCAweGFiLAorICAweDNkLCAweGM3LCAweGM1LCAweDczLCAweDRkLCAweGRlLCAweGFmLCAweGE4LCAweDRlLCAweGVjLCAweGEyLCAweDRkLAorICAweDhmLCAweGNiLCAweGUzLCAweDkzLCAweGIxLCAweGFhLCAweDAwLCAweGViLCAweDE4LCAweDlkLCAweDI1LCAweDdmLAorICAweDQ4LCAweGZjLCAweGY1LCAweDNlLCAweDQ2LCAweDAxLCAweGEyLCAweGRjLCAweGM4LCAweDZjLCAweDZiLCAweDJiLAorICAweDJjLCAweGZlLCAweDA3LCAweDg2LCAweGI1LCAweGQ3LCAweDIzLCAweGYyLCAweDBlLCAweDc2LCAweGZlLCAweDEyLAorICAweGRiLCAweGI3LCAweDY3LCAweDE1LCAweGU2LCAweDA4LCAweDkxLCAweDVhLCAweGRhLCAweDllLCAweDU5LCAweDczLAorICAweGE1LCAweDg1LCAweGRmLCAweDU1LCAweGU5LCAweDhiLCAweDgwLCAweGJmLCAweDg3LCAweDRmLCAweDE2LCAweGIzLAorICAweDIzLCAweGNkLCAweGE0LCAweDM2LCAweDU0LCAweDI3LCAweDE0LCAweGU4LCAweDNkLCAweDhjLCAweDM1LCAweGMyLAorICAweGM1LCAweDYyLCAweDFmLCAweDUxLCAweGQwLCAweDJlLCAweDU4LCAweDdkLCAweDllLCAweDExLCAweGFlLCAweDEzLAorICAweGIwLCAweGUwLCAweDI1LCAweDBiLCAweDAzLCAweGU2LCAweDk0LCAweGFiLCAweGQxLCAweDczLCAweGY4LCAweGNiLAorICAweGYzLCAweDRlLCAweGY1LCAweGE5LCAweDdlLCAweDFkLCAweDEwLCAweDI5LCAweDY1LCAweDkwLCAweDE3LCAweDU0LAorICAweGRhLCAweDc5LCAweDk1LCAweDk5LCAweDY1LCAweGM3LCAweGRiLCAweDQ1LCAweDNlLCAweDlmLCAweDk3LCAweDVhLAorICAweDMxLCAweDg2LCAweGNkLCAweDE1LCAweDFjLCAweDAxLCAweGI4LCAweGMyLCAweGEwLCAweDFiLCAweDk0LCAweDRjLAorICAweDMzLCAweDkyLCAweGJiLCAweDYyLCAweGIwLCAweGE4LCAweGIyLCAweDc5LCAweGVhLCAweDg5LCAweGYzLCAweGMyLAorICAweGFkLCAweGJhLCAweDc1LCAweDYxLCAweDljLCAweGQzLCAweDEzLCAweDU1LCAweGZhLCAweGM2LCAweDZlLCAweGY1LAorICAweDM4LCAweGIzLCAweDY3LCAweGMyLCAweGQ2LCAweDhlLCAweDlhLCAweDQ4LCAweDEyLCAweGQ2LCAweDA4LCAweGU5LAorICAweGJlLCAweGMwLCAweGU0LCAweDk3LCAweGMyLCAweDE0LCAweDQyLCAweDRhLCAweDkxLCAweDYxLCAweDhiLCAweDE4LAorICAweDhmLCAweGZhLCAweGNmLCAweDdkLCAweGZmLCAweDViLCAweGVhLCAweGUwLCAweGY3LCAweGYzLCAweDE5LCAweDMwLAorICAweGUwLCAweDJlLCAweDFkLCAweDgwLCAweDBhLCAweDQyLCAweGFhLCAweDAwLCAweDAwLCAweDIzLCAweDM0LCAweDBhLAorICAweDVmLCAweDk0LCAweGE5LCAweDA2LCAweGU4LCAweDU3LCAweGY0LCAweDFlLCAweDY0LCAweDUwLCAweGNkLCAweDJjLAorICAweDc2LCAweDkyLCAweGYxLCAweDUxLCAweDc0LCAweGYwLCAweDZhLCAweDU1LCAweDllLCAweGU0LCAweDkxLCAweGQ1LAorICAweDJhLCAweDkxLCAweGVkLCAweDY4LCAweDkwLCAweDJiLCAweDA1LCAweGIyLCAweDU1LCAweGFhLCAweDEzLCAweDZiLAorICAweDkyLCAweGI4LCAweGUxLCAweDU5LCAweGU3LCAweDIyLCAweGJlLCAweGRlLCAweDQ1LCAweGUyLCAweGM5LCAweGY0LAorICAweDgxLCAweDBhLCAweDRiLCAweDMxLCAweDQyLCAweDI5LCAweDBmLCAweGU4LCAweDg5LCAweDE0LCAweDlhLCAweDFlLAorICAweGIwLCAweGI3LCAweDg4LCAweGFlLCAweDRlLCAweGJmLCAweDRkLCAweDM0LCAweDZmLCAweGIyLCAweGY5LCAweDQ0LAorICAweDAyLCAweGVhLCAweDE5LCAweGE4LCAweGQzLCAweDY4LCAweDk1LCAweDFhLCAweDZjLCAweGRlLCAweGEwLCAweDAwLAorICAweDYyLCAweDBkLCAweDdhLCAweDAzLCAweGI3LCAweDUzLCAweDA2LCAweDMxLCAweDJmLCAweDAyLCAweDU3LCAweDBmLAorICAweDhmLCAweDEzLCAweDQ5LCAweDk3LCAweGE5LCAweGE5LCAweGM2LCAweGYwLCAweGIzLCAweGU5LCAweGVjLCAweDI0LAorICAweDAzLCAweDA3LCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDFmLCAweGZmLCAweGZmLCAweDA3LCAweDZhLAorICAweGE0LCAweDMxLCAweDEwLCAweDQ0LCAweDk0LCAweDJjLCAweDBkLCAweDQyLCAweDAxLCAweDVjLCAweDRiLCAweGQ1LAorICAweDJlLCAweGFlLCAweGFmLCAweDIxLCAweDQwLCAweDAyLCAweDUyLCAweGQ4LCAweDM1LCAweGY3LCAweGE3LCAweGY4LAorICAweDE5LCAweDE0LCAweDBmLCAweGVmLCAweGI5LCAweDRlLCAweGU5LCAweDFkLCAweGE2LCAweDJlLCAweGZlLCAweDk4LAorICAweGZkLCAweDEzLCAweGI4LCAweDIyLCAweGJhLCAweGI5LCAweGY5LCAweDFhLCAweGUyLCAweDUxLCAweDRlLCAweDViLAorICAweGVkLCAweGRiLCAweDhmLCAweDViLCAweGJjLCAweGYwLCAweDM5LCAweGU2LCAweDc1LCAweDRiLCAweGU4LCAweDFlLAorICAweGY4LCAweDdiLCAweDJmLCAweDI3LCAweGIxLCAweGM3LCAweDk5LCAweGM3LCAweGZmLCAweDFjLCAweDhhLCAweGMwLAorICAweGU5LCAweDliLCAweDU2LCAweGQ0LCAweDJhLCAweDU3LCAweDdiLCAweDM0LCAweGZiLCAweDY1LCAweDA5LCAweDM0LAorICAweGI1LCAweDk1LCAweDdkLCAweDIwLCAweDk2LCAweDFkLCAweDcxLCAweGIyLCAweDY4LCAweDcxLCAweGFlLCAweGI2LAorICAweDViLCAweDJjLCAweDMxLCAweGJhLCAweDI1LCAweDVjLCAweDJjLCAweGY4LCAweDI1LCAweDAwLCAweDk2LCAweGEzLAorICAweDQ5LCAweDFhLCAweDM5LCAweGQzLCAweGExLCAweDA3LCAweDUyLCAweGQzLCAweDNhLCAweGQ2LCAweGIxLCAweDU0LAorICAweGUxLCAweDcxLCAweDI0LCAweDA4LCAweDk0LCAweDE1LCAweGUyLCAweDdjLCAweDI2LCAweGI1LCAweGM2LCAweDEzLAorICAweDA5LCAweDU4LCAweGM4LCAweGI3LCAweDhjLCAweDQ4LCAweDAzLCAweDZhLCAweGNjLCAweGQ1LCAweDEzLCAweDQ3LAorICAweGM2LCAweGI3LCAweDc5LCAweDcwLCAweDYyLCAweDQxLCAweDBhLCAweGIxLCAweGQ3LCAweGYwLCAweDhiLCAweGU1LAorICAweDZiLCAweGQwLCAweGM5LCAweGUxLCAweDczLCAweDhjLCAweDY3LCAweDA2LCAweDc1LCAweDFjLCAweDFkLCAweGFjLAorICAweGEyLCAweGE5LCAweGE3LCAweGQzLCAweGE3LCAweDBjLCAweDBkLCAweGVlLCAweDg2LCAweDVmLCAweGQzLCAweDk1LAorICAweDc4LCAweGMxLCAweGFlLCAweDAwLCAweDIzLCAweDUzLCAweDlkLCAweDk4LCAweDJjLCAweGRiLCAweDY1LCAweDg2LAorICAweGQwLCAweDBiLCAweDZlLCAweDcwLCAweGFiLCAweGE3LCAweGQ4LCAweGNhLCAweDY1LCAweGQ2LCAweDM0LCAweDI2LAorICAweDI3LCAweDI4LCAweGY1LCAweDU1LCAweDNhLCAweDBhLCAweDU4LCAweDUyLCAweDI4LCAweDZkLCAweDE1LCAweDg0LAorICAweDg3LCAweDEwLCAweDk1LCAweGZjLCAweGExLCAweDY2LCAweDRkLCAweDJkLCAweDNmLCAweGFmLCAweGFhLCAweGYxLAorICAweGYyLCAweGVlLCAweGZhLCAweDY0LCAweDAxLCAweGVmLCAweGVjLCAweDJmLCAweDYyLCAweDI4LCAweDc2LCAweDAwLAorICAweDA1LCAweDQ0LCAweDk1LCAweDUwLCAweDAwLCAweDA4LCAweGFhLCAweDA5LCAweGVlLCAweDk5LCAweGZiLCAweDdmLAorICAweDY5LCAweDlhLCAweDZjLCAweDgyLCAweDZkLCAweDc0LCAweDFkLCAweGU0LCAweGIxLCAweGM2LCAweDQxLCAweGE1LAorICAweDZlLCAweDAyLCAweDEzLCAweDIxLCAweDJkLCAweDU5LCAweGM0LCAweGYwLCAweGRhLCAweGQ2LCAweDQ5LCAweGU4LAorICAweGFjLCAweGY2LCAweGE3LCAweGVhLCAweGZkLCAweDU5LCAweDM3LCAweGUwLCAweDJiLCAweGU2LCAweGJlLCAweDE1LAorICAweGY5LCAweGJkLCAweGZmLCAweGI1LCAweGU3LCAweDZlLCAweGEzLCAweGVlLCAweGI5LCAweDlkLCAweDZiLCAweDVhLAorICAweGRmLCAweGFkLCAweGMwLCAweDAwLCAweDlhLCAweDhlLCAweDY4LCAweGQ5LCAweGVhLCAweDk2LCAweGM4LCAweGVlLAorICAweGExLCAweDEzLCAweGM2LCAweGI0LCAweGFlLCAweGFiLCAweGY4LCAweDMzLCAweGQ3LCAweDM0LCAweGZiLCAweGRlLAorICAweDlhLCAweDU4LCAweDM3LCAweDAyLCAweDg4LCAweDgwLCAweDI4LCAweDY4LCAweDNhLCAweDg3LCAweDllLCAweDcwLAorICAweGUyLCAweDdiLCAweDY5LCAweGJlLCAweGUwLCAweDA2LCAweDhjLCAweGJkLCAweDNmLCAweDNlLCAweGRjLCAweGY2LAorICAweGM2LCAweDI0LCAweDAzLCAweDA3LCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweGZmLAorICAweDA5LCAweDZmLCAweDgyLCAweDIxLCAweDQ1LCAweDg4LCAweDE2LCAweDFjLCAweDA1LCAweDQyLCAweDIyLCAweDRjLAorICAweDNkLCAweDhiLCAweDgyLCAweDUwLCAweGE1LCAweDEwLCAweDA0LCAweDk1LCAweDI2LCAweDBiLCAweGY1LCAweDk4LAorICAweDNmLCAweDFiLCAweGYxLCAweDQyLCAweDYwLCAweDA1LCAweDc2LCAweDRmLCAweDI2LCAweGU5LCAweGJkLCAweDA5LAorICAweGZmLCAweGZiLCAweDc3LCAweDk4LCAweDNiLCAweGMyLCAweDkwLCAweGNhLCAweDZlLCAweDhiLCAweGMyLCAweDBkLAorICAweGEyLCAweDBlLCAweGYzLCAweDZlLCAweGJhLCAweGVkLCAweDdlLCAweDRhLCAweGNiLCAweDU1LCAweDUyLCAweDhkLAorICAweDI1LCAweGJkLCAweDU0LCAweDFhLCAweDVkLCAweDJiLCAweGExLCAweDU0LCAweGNiLCAweDU0LCAweGEyLCAweDZhLAorICAweGIzLCAweDQyLCAweDNhLCAweGRiLCAweGRmLCAweDRhLCAweDU2LCAweGQ1LCAweDBmLCAweDMyLCAweDA4LCAweDcyLAorICAweDJiLCAweDJjLCAweDQ5LCAweDQ2LCAweDI2LCAweGU1LCAweDkwLCAweDI4LCAweGFlLCAweDAyLCAweDFkLCAweDIyLAorICAweDU2LCAweDMxLCAweDQ4LCAweDdmLCAweGRjLCAweGM4LCAweDc2LCAweGE3LCAweDRiLCAweGFmLCAweDM2LCAweGExLAorICAweDIyLCAweGUxLCAweGFiLCAweDU3LCAweDcyLCAweGY1LCAweDQ2LCAweGIyLCAweDU2LCAweDQ1LCAweDAwLCAweDJlLAorICAweGM3LCAweDdkLCAweDk0LCAweDUyLCAweDUzLCAweDk0LCAweGViLCAweDdjLCAweGY0LCAweDU1LCAweDVjLCAweGE3LAorICAweGI5LCAweDU0LCAweDBjLCAweDNmLCAweDBhLCAweGRlLCAweDllLCAweDhiLCAweGRkLCAweDkyLCAweDcyLCAweGFkLAorICAweGE5LCAweDhmLCAweDY1LCAweDJkLCAweGQyLCAweGFjLCAweGEyLCAweGVhLCAweDQyLCAweDk1LCAweDk2LCAweDU1LAorICAweDAzLCAweGQ0LCAweDM4LCAweDQzLCAweGEwLCAweDhhLCAweGNkLCAweDhhLCAweGJiLCAweGUxLCAweDM5LCAweGEwLAorICAweGE2LCAweDhkLCAweDUxLCAweDYzLCAweDY5LCAweDJhLCAweDg2LCAweDU5LCAweGFlLCAweDk3LCAweGYwLCAweGRkLAorICAweDU2LCAweDRmLCAweDUzLCAweDMxLCAweGUyLCAweDA2LCAweDVjLCAweDZiLCAweGEzLCAweDYxLCAweGM5LCAweGFjLAorICAweDQyLCAweGRhLCAweDJhLCAweDIyLCAweGI2LCAweDgxLCAweDJiLCAweGJiLCAweDlmLCAweDUzLCAweDUyLCAweGNhLAorICAweDRkLCAweDExLCAweGFhLCAweGIzLCAweDYzLCAweGU3LCAweGY1LCAweDc0LCAweGQ3LCAweDY3LCAweGQ1LCAweDllLAorICAweDAwLCAweDBmLCAweDVmLCAweDMzLCAweDgxLCAweDA5LCAweDg4LCAweGUxLCAweGQ4LCAweDAwLCAweDU0LCAweDk1LAorICAweDU2LCAweDA1LCAweGIwLCAweDAxLCAweDEwLCAweDAzLCAweDQwLCAweGI5LCAweDI4LCAweDY4LCAweDBjLCAweGUwLAorICAweGJjLCAweDRiLCAweGZjLCAweDFiLCAweGEzLCAweDIyLCAweDRhLCAweGFiLCAweDY5LCAweDA1LCAweDEzLCAweDVlLAorICAweDRlLCAweGQxLCAweGI3LCAweDEyLCAweGYyLCAweDI4LCAweDgyLCAweGQxLCAweDg4LCAweDUzLCAweDFiLCAweDBlLAorICAweDBlLCAweDFhLCAweDk5LCAweGE3LCAweGE4LCAweDExLCAweDk3LCAweDM4LCAweDFhLCAweDNkLCAweDU0LCAweGU5LAorICAweDNiLCAweDU4LCAweGVmLCAweDQ4LCAweGVhLCAweGQ0LCAweDA1LCAweDlmLCAweDUzLCAweDZlLCAweDE4LCAweDIzLAorICAweDUwLCAweDgyLCAweDQ5LCAweDRiLCAweDMyLCAweDFiLCAweGVkLCAweDdhLCAweDAwLCAweDJjLCAweGJiLCAweGE5LAorICAweGFlLCAweGI3LCAweDQ2LCAweGJlLCAweGQ3LCAweDM2LCAweGZkLCAweDYwLCAweDM0LCAweGZmLCAweDUxLCAweDJjLAorICAweDc2LCAweGUwLCAweDA5LCAweGQ4LCAweGFiLCAweDY4LCAweGMyLCAweGRkLCAweDQ5LCAweGQyLCAweGRiLCAweGE2LAorICAweDU0LCAweGJhLCAweDhhLCAweGJhLCAweGJhLCAweGZlLCAweDRmLCAweDU3LCAweGQ3LCAweGI4LCAweGJhLCAweDNlLAorICAweDcwLCAweDBlLCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDdmLCAweGZmLCAweGZmLCAweDExLCAweDZmLAorICAweGExLCAweGIxLCAweDEwLCAweDYyLCAweGM2LCAweDIwLCAweDg1LCAweGFkLCAweGU5LCAweDY3LCAweGMwLCAweGI1LAorICAweDJkLCAweGJiLCAweDAzLCAweDAyLCAweDAyLCAweDQzLCAweGIwLCAweGM1LCAweGRmLCAweGQzLCAweDFmLCAweDYzLAorICAweGYxLCAweDUyLCAweDFiLCAweDJmLCAweDFmLCAweDgyLCAweDgzLCAweDE1LCAweDA4LCAweDMyLCAweGY4LCAweGFiLAorICAweDFjLCAweGZkLCAweDRmLCAweGNlLCAweDM0LCAweDg3LCAweDhhLCAweGM2LCAweGI5LCAweDBlLCAweDM3LCAweGYxLAorICAweGE1LCAweDMxLCAweDdmLCAweDdhLCAweDNjLCAweDlhLCAweDNhLCAweDU2LCAweDYwLCAweDdlLCAweGFmLCAweDE4LAorICAweDczLCAweDZmLCAweDkwLCAweDM0LCAweGY1LCAweDhlLCAweDYzLCAweDhmLCAweDM1LCAweGRkLCAweDc2LCAweDE3LAorICAweGUyLCAweDhkLCAweDUxLCAweDhjLCAweDlmLCAweDU4LCAweGIzLCAweDE5LCAweDg0LCAweGNhLCAweDljLCAweGM5LAorICAweGJjLCAweGMwLCAweDU2LCAweGNhLCAweDEyLCAweDZmLCAweDhjLCAweGVlLCAweGEzLCAweDdkLCAweDk3LCAweDQ1LAorICAweDU5LCAweDMyLCAweDlhLCAweGM1LCAweDJmLCAweDViLCAweDM5LCAweDU3LCAweDQwLCAweGY3LCAweGMxLCAweGZkLAorICAweGZkLCAweDEzLCAweDE5LCAweGI4LCAweGVlLCAweDhhLCAweGFiLCAweGQ0LCAweGNjLCAweDYzLCAweGJkLCAweDM4LAorICAweGVhLCAweDhkLCAweDcwLCAweGE0LCAweDQwLCAweDhjLCAweGUxLCAweDg5LCAweGQ0LCAweDUwLCAweDIzLCAweDdjLAorICAweDg4LCAweDhjLCAweGUxLCAweDYyLCAweDhiLCAweDJjLCAweGI2LCAweGNhLCAweDRkLCAweDgxLCAweGY2LCAweDY2LAorICAweGI2LCAweGFjLCAweGRiLCAweGU4LCAweGVmLCAweGFhLCAweGZlLCAweDhhLCAweDNhLCAweDc5LCAweDYyLCAweDg2LAorICAweDRhLCAweGZlLCAweGQ5LCAweGRkLCAweGViLCAweGMxLCAweGQ5LCAweGE1LCAweDAxLCAweDAyLCAweDg0LCAweDk2LAorICAweDhiLCAweDE0LCAweDQxLCAweDljLCAweDlhLCAweDhmLCAweDI2LCAweDNkLCAweGFlLCAweGRjLCAweGFjLCAweGVlLAorICAweDhiLCAweDE3LCAweGRlLCAweGJmLCAweGE5LCAweDRjLCAweGVjLCAweGMzLCAweGRkLCAweDNmLCAweGUwLCAweDI0LAorICAweDk3LCAweDRjLCAweGIxLCAweDBiLCAweDUzLCAweDYyLCAweGZlLCAweDVlLCAweDEzLCAweDQ4LCAweDQyLCAweDc4LAorICAweGZjLCAweGE3LCAweDlmLCAweGNlLCAweDdmLCAweGJmLCAweDlmLCAweGYzLCAweGM4LCAweDBmLCAweDVmLCAweDQ0LAorICAweDIwLCAweGIxLCAweDA0LCAweGMyLCAweDgwLCAweGI4LCAweDc2LCAweDAwLCAweDA1LCAweDJmLCAweDJlLCAweGMwLAorICAweDYwLCAweDAyLCAweGVhLCAweGYwLCAweDU4LCAweDc1LCAweDdlLCAweGMzLCAweDU0LCAweGQyLCAweDgwLCAweDlhLAorICAweDcxLCAweDY4LCAweDcwLCAweDU1LCAweGY4LCAweDRjLCAweGY1LCAweDM4LCAweDVhLCAweGQyLCAweGFlLCAweDQ4LAorICAweDg1LCAweDE2LCAweGI3LCAweDc5LCAweGQxLCAweDY5LCAweDk1LCAweGNhLCAweDIxLCAweDIzLCAweDc0LCAweDYyLAorICAweGJjLCAweGYzLCAweDI4LCAweGE0LCAweDMwLCAweGQwLCAweGE3LCAweGQ5LCAweGZhLCAweGMxLCAweDAyLCAweDM2LAorICAweGQ3LCAweDdiLCAweDdjLCAweDhiLCAweDYxLCAweGJmLCAweGFhLCAweDgwLCAweGMwLCAweGE3LCAweDgxLCAweDE3LAorICAweDdjLCAweGFhLCAweDJhLCAweGQzLCAweDVhLCAweGY5LCAweGM3LCAweDg4LCAweDI2LCAweDA3LCAweGNhLCAweGY0LAorICAweDBlLCAweGFlLCAweDk4LCAweDIzLCAweGIxLCAweDM2LCAweGNlLCAweDNlLCAweGNiLCAweGJkLCAweDVjLCAweGU1LAorICAweDMzLCAweDEzLCAweGQwLCAweGZhLCAweGRkLCAweGMwLCAweDZjLCAweDk0LCAweDgxLCAweGIwLCAweGRiLCAweDg0LAorICAweDZhLCAweDhjLCAweDRkLCAweDljLCAweGQ5LCAweDFiLCAweDcwLCAweDhmLCAweDI3LCAweDM2LCAweDQxLCAweDBhLAorICAweGM5LCAweGNhLCAweGQ0LCAweGJlLCAweDU2LCAweDNlLCAweDI3LCAweGM3LCAweGUwLCAweDgwLCAweDM4LCAweDIxLAorICAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDBmLCAweGZmLCAweGZmLCAweDA1LCAweDZhLCAweGEyLCAweDU4LCAweDY4LAorICAweDhjLCAweDQyLCAweDExLCAweDk0LCAweDg4LCAweDg0LCAweDYxLCAweDQwLCAweDRjLCAweDIwLCAweDM4LCAweDE3LAorICAweDYwLCAweDAxLCAweDQ0LCAweDQwLCAweDEyLCAweGE3LCAweDYzLCAweDI2LCAweDBiLCAweDA1LCAweDk1LCAweGY0LAorICAweDcyLCAweGZjLCAweDBhLCAweDkwLCAweDU1LCAweGQzLCAweGZmLCAweDgyLCAweDQ5LCAweDY0LCAweDg0LCAweDVkLAorICAweDQwLCAweGU4LCAweGNhLCAweDEwLCAweDkyLCAweDc4LCAweDM5LCAweDhiLCAweGJmLCAweGJiLCAweDQ3LCAweDNjLAorICAweGZhLCAweGJkLCAweGJjLCAweGRhLCAweDE4LCAweGJkLCAweGQzLCAweGU1LCAweDc2LCAweDJhLCAweDE3LCAweGRlLAorICAweDhlLCAweGZmLCAweGRkLCAweDUzLCAweDZmLCAweDVmLCAweDBmLCAweGQyLCAweDYzLCAweDcyLCAweDcwLCAweGQ5LAorICAweDFlLCAweDk3LCAweGM0LCAweDMxLCAweDNhLCAweDQ0LCAweDVkLCAweDI3LCAweGY4LCAweDYxLCAweGRmLCAweGE2LAorICAweGU0LCAweGUxLCAweDE2LCAweDI3LCAweDA1LCAweGY5LCAweDcxLCAweGIwLCAweDZjLCAweDI2LCAweDhhLCAweDFjLAorICAweGI0LCAweDU5LCAweDlhLCAweDM4LCAweDk5LCAweDE1LCAweGIzLCAweDEyLCAweDQ2LCAweDI4LCAweDRhLCAweDhhLAorICAweDM1LCAweDg1LCAweGMxLCAweDdjLCAweGUwLCAweDhhLCAweGY1LCAweDcyLCAweGYxLCAweGQ4LCAweDdhLCAweGQ0LAorICAweGVhLCAweGQ0LCAweDU2LCAweGE0LCAweDExLCAweDI1LCAweDFjLCAweDIyLCAweGI0LCAweDRjLCAweGVkLCAweGZkLAorICAweDdhLCAweDVhLCAweDc1LCAweGQ1LCAweGI5LCAweGUzLCAweGE5LCAweDg3LCAweDIxLCAweDgyLCAweGExLCAweGYxLAorICAweDBiLCAweDVmLCAweDQwLCAweDFkLCAweGZjLCAweDJlLCAweDQyLCAweGZjLCAweDE4LCAweGI4LCAweDg5LCAweDdlLAorICAweGFjLCAweDM3LCAweGJhLCAweGYwLCAweGU1LCAweGFjLCAweDJkLCAweDU0LCAweDUyLCAweDQ4LCAweDgwLCAweDc2LAorICAweDQyLCAweDQzLCAweGNlLCAweDk0LCAweDEzLCAweDIzLCAweGRhLCAweDM2LCAweDYxLCAweDI5LCAweGU5LCAweGYyLAorICAweGZkLCAweDdkLCAweGRiLCAweGFiLCAweGM0LCAweGQ3LCAweDVmLCAweDQwLCAweDUyLCAweDI2LCAweGNiLCAweDY3LAorICAweDhkLCAweGM2LCAweGQ4LCAweGQ0LCAweGRjLCAweGYwLCAweGE5LCAweDM3LCAweGQyLCAweDdkLCAweGU2LCAweDYyLAorICAweDc2LCAweGRlLCAweDdjLCAweDQ3LCAweGI4LCAweGVhLCAweDE2LCAweDcxLCAweDA1LCAweGZhLCAweGY4LCAweDJiLAorICAweDFiLCAweGMwLCAweDViLCAweDFiLCAweDk4LCAweGYyLCAweDM4LCAweGJlLCAweGY0LCAweGYxLCAweDdjLCAweDg4LAorICAweDNkLCAweGZkLCAweGM1LCAweGE4LCAweDI2LCAweDFiLCAweDg3LCAweDYwLCAweDAwLCAweDA0LCAweDRhLCAweDY4LAorICAweDZjLCAweDE2LCAweDIyLCAweDgwLCAweDBmLCAweDM0LCAweDc3LCAweGNkLCAweDc5LCAweDg5LCAweDcyLCAweDQ4LAorICAweDQxLCAweDc5LCAweDcyLCAweDFhLCAweDhjLCAweDYyLCAweDliLCAweGE1LCAweDg1LCAweDI2LCAweGQxLCAweDY0LAorICAweGM2LCAweDM1LCAweGVhLCAweDlkLCAweDRiLCAweDYyLCAweDM1LCAweGE1LCAweDhmLCAweDIzLCAweDgyLCAweDI3LAorICAweDg4LCAweDU0LCAweDlhLCAweDlmLCAweGEyLCAweDg0LCAweDE0LCAweDliLCAweGEzLCAweDc0LCAweDQyLCAweGYwLAorICAweDFhLCAweGVkLCAweDlhLCAweGEyLCAweDkzLCAweDkwLCAweGY3LCAweGExLCAweDVkLCAweDEyLCAweDY2LCAweGU3LAorICAweGY5LCAweDU5LCAweDdiLCAweGYyLCAweGNiLCAweGMyLCAweDY5LCAweDgxLCAweDBmLCAweGYzLCAweDcyLCAweDY1LAorICAweGVkLCAweDIxLCAweDBmLCAweDgwLCAweGVjLCAweDQyLCAweDVhLCAweGU3LCAweDk2LCAweGEyLCAweGFmLCAweGJjLAorICAweDJmLCAweGM3LCAweDE1LCAweDMzLCAweGJmLCAweDNjLCAweGU0LCAweGViLCAweGQ1LCAweGU0LCAweGVhLCAweGU5LAorICAweGY5LCAweGZhLCAweGVlLCAweGNiLCAweDY4LCAweDA3LCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweGZmLAorICAweGZmLCAweGZmLCAweDA5LCAweDZmLCAweGEyLCAweDIxLCAweDQ5LCAweDg4LCAweDI2LCAweDFhLCAweDg0LCAweDBiLAorICAweDFkLCAweDJlLCAweGEyLCAweGQzLCAweDk5LCAweDU2LCAweDAwLCAweDBiLCAweGNkLCAweDUzLCAweDA3LCAweDJiLAorICAweDkyLCAweDMwLCAweDJlLCAweGIyLCAweDYzLCAweGMyLCAweDY0LCAweDIxLCAweDEyLCAweDNiLCAweGVjLCAweGM2LAorICAweGQ0LCAweDYwLCAweGU5LCAweDJmLCAweGY0LCAweGM2LCAweDU4LCAweDIxLCAweGI1LCAweDZlLCAweGY3LCAweGNlLAorICAweGM1LCAweGVhLCAweDhlLCAweGNlLCAweGM2LCAweDRhLCAweDYyLCAweGRjLCAweDVhLCAweDEzLCAweDgzLCAweDJmLAorICAweDkwLCAweDc4LCAweGE3LCAweDU3LCAweGU4LCAweDFhLCAweDIxLCAweGYxLCAweGE0LCAweDJmLCAweDk2LCAweDIyLAorICAweDliLCAweDc0LCAweGZjLCAweGY3LCAweGYzLCAweGZiLCAweDIyLCAweDZkLCAweGI5LCAweDYwLCAweGE1LCAweGFmLAorICAweGI0LCAweDc5LCAweGFmLCAweDZiLCAweGU5LCAweDE2LCAweGU4LCAweGEzLCAweDFlLCAweDFlLCAweDJhLCAweDBhLAorICAweGQzLCAweDVhLCAweDliLCAweDBlLCAweDFhLCAweGNmLCAweGIwLCAweGU2LCAweDcxLCAweGExLCAweDkwLCAweDY0LAorICAweDg4LCAweDM5LCAweGI2LCAweDM0LCAweGU0LCAweGZjLCAweDk0LCAweGZhLCAweDkxLCAweDIzLCAweDBiLCAweDQwLAorICAweGNjLCAweDUzLCAweDE0LCAweGQ5LCAweDAyLCAweDU0LCAweGE2LCAweDQwLCAweDYwLCAweDRjLCAweDMwLCAweDNkLAorICAweDZlLCAweDViLCAweDljLCAweGUxLCAweDU5LCAweDE2LCAweGEwLCAweGIxLCAweDdjLCAweDIyLCAweGIxLCAweDUwLAorICAweDFlLCAweDQyLCAweDkyLCAweDAyLCAweGYwLCAweDk4LCAweGQ0LCAweDcxLCAweGQwLCAweDljLCAweGM5LCAweDUzLAorICAweDE0LCAweGRmLCAweDgxLCAweGZkLCAweDA5LCAweDg5LCAweDEzLCAweDQ2LCAweDRhLCAweDk4LCAweDdhLCAweDJmLAorICAweGJiLCAweGM0LCAweDAwLCAweDljLCAweDI4LCAweDQ1LCAweDEwLCAweDg0LCAweDMyLCAweDcxLCAweDIxLCAweDAxLAorICAweDI3LCAweDUzLCAweGNmLCAweDFhLCAweDgzLCAweGJkLCAweDk0LCAweDdmLCAweGY0LCAweGVlLCAweGI5LCAweGI5LAorICAweGY1LCAweGM3LCAweGExLCAweDdmLCAweGRmLCAweGY5LCAweDZmLCAweGNiLCAweDg1LCAweDFiLCAweGYyLCAweDBlLAorICAweDM0LCAweDc0LCAweGJhLCAweGNiLCAweGU4LCAweGE2LCAweDZlLCAweGQzLCAweGM3LCAweDU0LCAweDgzLCAweDYyLAorICAweDg4LCAweGY3LCAweGJkLCAweDlkLCAweDhkLCAweDNiLCAweDViLCAweGRiLCAweDg5LCAweDY4LCAweGM3LCAweGQ5LAorICAweGJlLCAweGFmLCAweGU1LCAweGYwLCAweGIwLCAweDAzLCAweGQ3LCAweGNjLCAweGU0LCAweGMyLCAweDgxLCAweDI4LAorICAweDc2LCAweDAwLCAweGE4LCAweDA5LCAweDUwLCAweDAyLCAweDgwLCAweDIyLCAweGVhLCAweDg1LCAweDliLCAweDhkLAorICAweDY4LCAweGM3LCAweDliLCAweDlhLCAweGI0LCAweDk3LCAweGNjLCAweDNhLCAweDlkLCAweGI4LCAweDQyLCAweDMxLAorICAweDVlLCAweDg1LCAweDMwLCAweGYxLCAweDQwLCAweDJjLCAweGI0LCAweDY3LCAweDk4LCAweDBiLCAweGQ2LCAweDBkLAorICAweGNjLCAweDQ2LCAweDU4LCAweGE2LCAweGNjLCAweGJkLCAweGMwLCAweDM1LCAweDY5LCAweDQ0LCAweDA1LCAweDIzLAorICAweGJmLCAweDg5LCAweGExLCAweDhkLCAweDNlLCAweGFhLCAweGI0LCAweDllLCAweDFjLCAweDRhLCAweDZiLCAweGU1LAorICAweGYxLCAweGY4LCAweGE1LCAweGUzLCAweGFmLCAweGRiLCAweGU4LCAweGY1LCAweDMwLCAweDY4LCAweDcyLCAweDM1LAorICAweGI2LCAweDAwLCAweDJlLCAweDc3LCAweDgyLCAweDk1LCAweGQ2LCAweDNiLCAweGFjLCAweDVjLCAweGMzLCAweDdmLAorICAweDA5LCAweDNjLCAweGM5LCAweGJlLCAweDg4LCAweDllLCAweGRhLCAweDc3LCAweDZiLCAweDgwLCAweGI3LCAweGE1LAorICAweDE2LCAweDM0LCAweDRiLCAweGJhLCAweDA1LCAweDg2LCAweDA5LCAweDAwLCAweGQ5LCAweDk3LCAweGY4LCAweGY3LAorICAweGM3LCAweDY4LCAweGEwLCAweDA2LCAweGRlLCAweDhjLCAweGVjLCAweDk4LCAweDhkLCAweGNhLCAweDgwLCAweDg0LAorICAweDY0LCAweDczLCAweGZhLCAweGJjLCAweGJkLCAweGQ1LCAweGU3LCAweDVlLCAweDAwLCAweDFjLCAweDIxLCAweDFhLAorICAweDg4LCAweDAwLCAweDAwLCAweDBmLCAweGZmLCAweGZmLCAweDBiLCAweDZhLCAweGE0LCAweGIwLCAweGQwLCAweDQyLAorICAweGI0LCAweDFiLCAweDBkLCAweGMyLCAweDA4LCAweDc5LCAweDBiLCAweGE3LCAweDAyLCAweDk5LCAweDYwLCAweDAwLAorICAweDkxLCAweDQxLCAweDRjLCAweGQ0LCAweDQxLCAweGM3LCAweDg4LCAweGU1LCAweDRhLCAweGMwLCAweDc2LCAweDIwLAorICAweGE1LCAweGYzLCAweGM3LCAweDM5LCAweDRhLCAweDU0LCAweDBkLCAweGM5LCAweGQ5LCAweGZkLCAweDliLCAweDYxLAorICAweDQ0LCAweDM0LCAweGM0LCAweGFlLCAweGNiLCAweDdjLCAweDA0LCAweDBjLCAweDk5LCAweDU4LCAweDlmLCAweDYwLAorICAweDYzLCAweGVmLCAweDJlLCAweDU5LCAweGY0LCAweDhhLCAweGZlLCAweDBmLCAweGRjLCAweDE4LCAweGU5LCAweDRmLAorICAweGRiLCAweDUyLCAweDY4LCAweDFiLCAweDE3LCAweGNmLCAweGRlLCAweDY2LCAweGI1LCAweDRiLCAweDlhLCAweDg3LAorICAweDg0LCAweGEzLCAweGIxLCAweGQyLCAweGQ0LCAweDc3LCAweDA5LCAweDhkLCAweDgzLCAweDhkLCAweGIwLCAweDY5LAorICAweDViLCAweDQ4LCAweGE5LCAweDgwLCAweDExLCAweGUyLCAweDk5LCAweGY5LCAweGM5LCAweDJlLCAweDI4LCAweDhjLAorICAweDU5LCAweDBlLCAweDJlLCAweDc2LCAweDRiLCAweDQ2LCAweDVmLCAweGE0LCAweGFiLCAweDcwLCAweGEzLCAweDRiLAorICAweDcyLCAweGFjLCAweDNmLCAweGQ2LCAweDY1LCAweDM0LCAweGIyLCAweDQ1LCAweGQyLCAweDljLCAweDEyLCAweDA1LAorICAweDI1LCAweDZjLCAweGU4LCAweDlkLCAweDczLCAweGM1LCAweDgxLCAweDZmLCAweGQyLCAweDg2LCAweDFiLCAweDYxLAorICAweDY4LCAweGEyLCAweDMzLCAweGE0LCAweGYwLCAweGRlLCAweDhjLCAweDU3LCAweDNjLCAweDE5LCAweGZlLCAweDU5LAorICAweDBjLCAweDllLCAweDNlLCAweDU0LCAweGRjLCAweDg3LCAweDBlLCAweDUwLCAweDJkLCAweDYyLCAweDk3LCAweDFkLAorICAweDA5LCAweGYzLCAweGJkLCAweDJjLCAweDE0LCAweDFjLCAweGRkLCAweDg3LCAweDQ3LCAweGRiLCAweGNhLCAweGU4LAorICAweGRhLCAweDAwLCAweGM3LCAweDNkLCAweGNiLCAweDMyLCAweDAzLCAweDhkLCAweGI1LCAweDRjLCAweGFiLCAweDk1LAorICAweDQ3LCAweGVkLCAweGVhLCAweDA5LCAweDdmLCAweDMyLCAweDI2LCAweDE0LCAweGNkLCAweDY3LCAweDNhLCAweGVjLAorICAweGMzLCAweGE5LCAweDNhLCAweDdjLCAweGJmLCAweGIxLCAweGQxLCAweDY1LCAweDg1LCAweDRmLCAweDg1LCAweDJhLAorICAweDE4LCAweDIwLCAweDg3LCAweDNlLCAweDU3LCAweGM0LCAweGUzLCAweDYzLCAweGFiLCAweGUxLCAweGNmLCAweDM4LAorICAweDAzLCAweGU3LCAweGRjLCAweDVjLCAweGM0LCAweDAwLCAweGVjLCAweDAwLCAweDAyLCAweDI4LCAweDk2LCAweDMyLAorICAweGNhLCAweDA1LCAweGE4LCAweDI4LCAweDhkLCAweGY2LCAweDRhLCAweGQ2LCAweDk0LCAweGE2LCAweGE2LCAweGY4LAorICAweDY4LCAweDkyLCAweDMxLCAweGY4LCAweDhhLCAweDAwLCAweDliLCAweDUyLCAweDkzLCAweDEwLCAweDQ1LCAweDk3LAorICAweGQwLCAweDlkLCAweGU4LCAweDk4LCAweDI2LCAweGFjLCAweDE5LCAweDIxLCAweDZjLCAweGFlLCAweGRjLCAweDFiLAorICAweDJiLCAweDE0LCAweGUxLCAweDY2LCAweDk0LCAweDc1LCAweDA1LCAweDUyLCAweDMyLCAweGU2LCAweGZiLCAweGQyLAorICAweGRmLCAweDkwLCAweDcyLCAweGEwLCAweDQzLCAweDUyLCAweGM4LCAweDBlLCAweGI0LCAweDExLCAweDY1LCAweDk0LAorICAweGZlLCAweDFlLCAweGRhLCAweGExLCAweGNlLCAweGI5LCAweDdiLCAweDM5LCAweDE3LCAweDVlLCAweDk2LCAweGU4LAorICAweDU3LCAweGQ3LCAweDNjLCAweGU4LCAweDgyLCAweDE0LCAweGUyLCAweGMwLCAweGQ2LCAweGY2LCAweDc1LCAweDU2LAorICAweDI0LCAweDEzLCAweDY5LCAweGY4LCAweDg3LCAweGNlLCAweDQ3LCAweGRkLCAweDlkLCAweDVjLCAweDIxLCAweDFhLAorICAweDg4LCAweDAwLCAweDAwLCAweDAzLCAweGZmLCAweGZmLCAweDBmLCAweDZhLCAweGE0LCAweGIxLCAweDg1LCAweDI0LAorICAweDM2LCAweDIyLCAweDg0LCAweDVhLCAweGVhLCAweDJiLCAweGE2LCAweDk4LCAweGQ0LCAweDEwLCAweGEwLCAweDAwLAorICAweDkwLCAweGExLCAweDEwLCAweDIyLCAweGEwLCAweDdjLCAweDkxLCAweDA2LCAweDhiLCAweDUzLCAweDcyLCAweDRmLAorICAweGIwLCAweDY1LCAweDQyLCAweDY0LCAweDEwLCAweGZlLCAweDRmLCAweDcxLCAweDRkLCAweDM4LCAweDdlLCAweDdhLAorICAweGQ5LCAweDViLCAweGI3LCAweDNkLCAweDUyLCAweDcyLCAweDc4LCAweDIyLCAweGZlLCAweGM3LCAweGRjLCAweGFiLAorICAweGI1LCAweDhhLCAweDc2LCAweDM3LCAweDVlLCAweGYyLCAweGMzLCAweDgzLCAweGIwLCAweDUzLCAweGYwLCAweDVjLAorICAweDcyLCAweGU1LCAweDU2LCAweGY2LCAweDVlLCAweDViLCAweDkzLCAweDM0LCAweGYzLCAweDk2LCAweDhlLCAweGU2LAorICAweDM3LCAweDE5LCAweDVkLCAweDMxLCAweDAwLCAweDBkLCAweDJiLCAweGQ0LCAweDliLCAweGZiLCAweGNlLCAweDc0LAorICAweDk0LCAweDkzLCAweDIzLCAweGQyLCAweDc3LCAweDVmLCAweDY4LCAweDEwLCAweGE5LCAweDFlLCAweDk2LCAweGRkLAorICAweGEzLCAweDQ1LCAweDE4LCAweGNiLCAweGM0LCAweDE3LCAweDdmLCAweDJiLCAweDQwLCAweDJkLCAweGJlLCAweDMyLAorICAweDJhLCAweDFhLCAweGMxLCAweDQ0LCAweDUwLCAweDNiLCAweDkxLCAweDA0LCAweDExLCAweDNhLCAweDM4LCAweDY1LAorICAweGVhLCAweDhiLCAweDljLCAweDI3LCAweDFlLCAweDA2LCAweGM1LCAweDYyLCAweGFkLCAweDk0LCAweGI0LCAweDI3LAorICAweDVkLCAweDJhLCAweDc5LCAweDU0LCAweGU3LCAweDUzLCAweDA4LCAweDA1LCAweDU1LCAweDY4LCAweDVhLCAweGZmLAorICAweGExLCAweDI4LCAweGQzLCAweDYzLCAweGI0LCAweGEyLCAweGI1LCAweDdjLCAweDMwLCAweDM5LCAweGNjLCAweGI2LAorICAweDFlLCAweDY3LCAweDNjLCAweGM5LCAweDgwLCAweGFmLCAweDU0LCAweDU1LCAweGNjLCAweGQyLCAweDQxLCAweDRkLAorICAweDVlLCAweGU2LCAweGJhLCAweGM2LCAweDE2LCAweDZjLCAweGU4LCAweDNjLCAweDI5LCAweDk5LCAweDM2LCAweDU3LAorICAweDY2LCAweGYyLCAweDE5LCAweGZmLCAweDM4LCAweGY2LCAweDJlLCAweDc4LCAweDU1LCAweDNkLCAweDdhLCAweDI0LAorICAweDE3LCAweDlhLCAweGFiLCAweDVlLCAweGUwLCAweGVlLCAweDdkLCAweDU2LCAweDBmLCAweDUxLCAweGE2LCAweDFhLAorICAweGRjLCAweGViLCAweGNiLCAweDU0LCAweGYyLCAweGVkLCAweGYyLCAweGNmLCAweGMzLCAweDNlLCAweDhmLCAweGZhLAorICAweGJmLCAweGNjLCAweDAxLCAweGVmLCAweGYyLCAweDJiLCAweDQxLCAweDMwLCAweGNjLCAweDNiLCAweDAwLCAweDAwLAorICAweDEyLCAweGE0LCAweDU4LCAweDUwLCAweDRhLCAweDJhLCAweDAyLCAweDdkLCAweGQ5LCAweGUzLCAweDhmLCAweDZmLAorICAweDZiLCAweDVmLCAweGZhLCAweDkzLCAweDE2LCAweDEzLCAweGRiLCAweDEyLCAweDM1LCAweGZjLCAweDUyLCAweGI2LAorICAweDkxLCAweDA0LCAweGViLCAweDEwLCAweGE0LCAweGZkLCAweDY1LCAweGQ3LCAweDUzLCAweDhmLCAweDJhLCAweGU2LAorICAweDRmLCAweDQ2LCAweDBkLCAweGYxLCAweGVhLCAweGI2LCAweDA4LCAweGJmLCAweDk0LCAweGQyLCAweGIwLCAweGJiLAorICAweDM4LCAweDVjLCAweDdkLCAweGNlLCAweDg3LCAweDMzLCAweGMyLCAweDQ1LCAweDhlLCAweGZlLCAweDkxLCAweDFmLAorICAweGZmLCAweGU1LCAweGFlLCAweDU0LCAweDIyLCAweDg4LCAweGViLCAweGI2LCAweDk3LCAweGIxLCAweDQ1LCAweGM0LAorICAweGNlLCAweGNjLCAweDU2LCAweDYwLCAweDAwLCAweGIwLCAweDcyLCAweGEwLCAweDQwLCAweDExLCAweDkwLCAweGYzLAorICAweGMzLCAweDU2LCAweDljLCAweDRiLCAweDBhLCAweDMzLCAweGI0LCAweDMxLCAweGFmLCAweGRmLCAweDlmLCAweGQ0LAorICAweDdlLCAweGJjLCAweDM4LCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDA3LCAweGZmLCAweGZmLCAweDBmLAorICAweDcwLCAweGExLCAweGIxLCAweDQ4LCAweDYyLCAweDY0LCAweDA4LCAweDhkLCAweDg1LCAweDAyLCAweDUwLCAweDgyLAorICAweDQ3LCAweDkyLCAweGQ2LCAweDQ0LCAweDA5LCAweGIwLCAweDEwLCAweDE2LCAweDliLCAweDEyLCAweDcwLCAweGJjLAorICAweDcyLCAweGNmLCAweDA3LCAweDI4LCAweDU0LCAweGExLCAweGU3LCAweDRjLCAweGFhLCAweGM3LCAweGRlLCAweGM2LAorICAweDY4LCAweGJkLCAweGU3LCAweGFkLCAweDAzLCAweGMzLCAweGJhLCAweGM1LCAweGRjLCAweDQ5LCAweDQwLCAweGYyLAorICAweGJjLCAweGE4LCAweDBkLCAweDNmLCAweDU0LCAweGU2LCAweDk5LCAweDIxLCAweGQzLCAweDhhLCAweDc3LCAweDhlLAorICAweDlkLCAweDljLCAweDMxLCAweGQ2LCAweDYyLCAweDMxLCAweGRkLCAweDFmLCAweDQ4LCAweGQyLCAweDM0LCAweDc1LAorICAweDNiLCAweDgzLCAweGQ5LCAweDJmLCAweDE5LCAweDIyLCAweDkzLCAweGRiLCAweGQ2LCAweDA1LCAweDk1LCAweDAzLAorICAweDI3LCAweGQ1LCAweDg2LCAweDhjLCAweGU2LCAweDU3LCAweDRkLCAweGUwLCAweDk3LCAweGQyLCAweDcxLCAweGRiLAorICAweGY3LCAweGQzLCAweDA3LCAweDQwLCAweGY2LCAweDc2LCAweDNkLCAweGZkLCAweDFlLCAweDhiLCAweDI4LCAweGRhLAorICAweDc1LCAweGQ1LCAweGQ4LCAweGI4LCAweDU5LCAweDUxLCAweGI5LCAweGZmLCAweGQ4LCAweGU5LCAweDJjLCAweDVjLAorICAweDU5LCAweGQ5LCAweGQ3LCAweGRkLCAweDY2LCAweDVhLCAweDJlLCAweGZkLCAweGE2LCAweGM0LCAweGQ4LCAweDVkLAorICAweDZiLCAweDNiLCAweDBmLCAweDRkLCAweDJiLCAweDYyLCAweDA5LCAweDcyLCAweGY3LCAweDFkLCAweDk3LCAweGFmLAorICAweGY0LCAweDRlLCAweDY0LCAweGFjLCAweGEyLCAweGY3LCAweDZjLCAweGVjLCAweGRhLCAweGFhLCAweGFhLCAweDRhLAorICAweDNmLCAweDE5LCAweGRkLCAweDFkLCAweGRjLCAweGRlLCAweDZiLCAweDdjLCAweDZhLCAweDQ0LCAweDRkLCAweGUzLAorICAweDhhLCAweDQzLCAweDVmLCAweDgzLCAweGNiLCAweDJkLCAweDhkLCAweGIwLCAweDZmLCAweGM4LCAweDUzLCAweDJjLAorICAweDI3LCAweDZjLCAweDIyLCAweDZhLCAweDQyLCAweDg4LCAweDQ2LCAweGE0LCAweGM1LCAweGM4LCAweDhlLCAweDcxLAorICAweGM0LCAweGZiLCAweDc4LCAweGQ5LCAweDZjLCAweDkyLCAweDdiLCAweDg3LCAweDU2LCAweGRhLCAweGYyLCAweGMxLAorICAweDg2LCAweDVhLCAweDExLCAweGIxLCAweDA2LCAweDZkLCAweDRiLCAweGU4LCAweDFjLCAweDZkLCAweDkyLCAweDJhLAorICAweGJjLCAweGFhLCAweDE1LCAweDMxLCAweDI5LCAweDc4LCAweGQ5LCAweGQ5LCAweDRmLCAweDNhLCAweGFlLCAweDYzLAorICAweGU1LCAweDliLCAweDk3LCAweDY3LCAweDU1LCAweGUzLCAweGU1LCAweGUxLCAweGM4LCAweDAxLCAweGVmLCAweGYwLAorICAweDJjLCAweDQxLCAweDMwLCAweGQ0LCAweDNiLCAweDAwLCAweDAwLCAweDI2LCAweDQ4LCAweDgwLCAweGExLCAweDA1LAorICAweDliLCAweDFiLCAweGIwLCAweDA4LCAweDJlLCAweDljLCAweGQ0LCAweDZhLCAweDA0LCAweGE0LCAweGEyLCAweGY0LAorICAweDA2LCAweDJiLCAweGFmLCAweDQ4LCAweDRhLCAweDI0LCAweGVlLCAweDljLCAweDg3LCAweDE1LCAweDY4LCAweDU1LAorICAweDEyLCAweDg1LCAweDQ1LCAweDY2LCAweDg1LCAweDM4LCAweGVjLCAweGZiLCAweGVlLCAweGRiLCAweGE4LCAweGY5LAorICAweDJlLCAweGM2LCAweDdiLCAweDJkLCAweGJlLCAweGRjLCAweGExLCAweGU5LCAweDAwLCAweGZiLCAweDkxLCAweDJmLAorICAweGQ5LCAweDAxLCAweDVmLCAweDI4LCAweGIxLCAweGI3LCAweGJmLCAweDRkLCAweGJkLCAweDdkLCAweDEyLCAweGM1LAorICAweGM2LCAweGVlLCAweGVhLCAweDNhLCAweDc4LCAweDYzLCAweGJhLCAweGU2LCAweDdjLCAweGIyLCAweGUzLCAweGQxLAorICAweDNlLCAweDQ2LCAweDEwLCAweGJmLCAweGQ3LCAweDYzLCAweDlmLCAweDY3LCAweDdiLCAweGE3LCAweGY5LCAweGYyLAorICAweGU1LCAweDU1LCAweDdmLCAweDBkLCAweGJmLCAweDBlLCAweDUxLCAweDllLCAweGRmLCAweDU0LCAweGY0LCAweDQwLAorICAweDA3LCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDA3LCAweGZmLCAweGZmLCAweDBmLCAweDcwLCAweGEyLAorICAweDMwLCAweGNkLCAweGM4LCAweDE4LCAweDE5LCAweDg0LCAweDE3LCAweDcwLCAweGI5LCAweGEyLCAweGUyLCAweGE2LAorICAweDVkLCAweDUwLCAweDAyLCAweDA5LCAweDEzLCAweDkxLCAweGY0LCAweDhjLCAweGVjLCAweDJhLCAweDAwLCAweDE4LAorICAweDA0LCAweDMyLCAweDIzLCAweDA1LCAweGFjLCAweDMyLCAweDYzLCAweDhmLCAweGIzLCAweGJiLCAweDU5LCAweDViLAorICAweDIzLCAweDZlLCAweGJjLCAweDU3LCAweGQ3LCAweDI2LCAweDJkLCAweDU1LCAweDQ3LCAweGQ1LCAweDE5LCAweDBjLAorICAweGE4LCAweDM4LCAweGEyLCAweDIyLCAweGVmLCAweGY2LCAweGNlLCAweDI1LCAweGQwLCAweGI2LCAweDQ2LCAweGZjLAorICAweGQzLCAweDVhLCAweDRmLCAweDJkLCAweGUxLCAweGZiLCAweDVlLCAweDIzLCAweDcxLCAweDU1LCAweDVmLCAweGY1LAorICAweGYzLCAweDA4LCAweGFjLCAweDRjLCAweGU3LCAweDRmLCAweDlkLCAweDZiLCAweGM5LCAweGViLCAweGZiLCAweDZkLAorICAweDZmLCAweDE3LCAweDQxLCAweDFhLCAweGE0LCAweDZiLCAweDliLCAweDFjLCAweGRhLCAweDRkLCAweDlhLCAweDRiLAorICAweGEzLCAweDJjLCAweDgxLCAweDEwLCAweDgxLCAweDQwLCAweDYyLCAweDgxLCAweDE1LCAweDkzLCAweGViLCAweGJkLAorICAweGU2LCAweDk3LCAweDc4LCAweDQ5LCAweGE1LCAweDY4LCAweDBmLCAweDBiLCAweDM2LCAweDI3LCAweDllLCAweGJiLAorICAweDdiLCAweGI4LCAweGUzLCAweDJkLCAweDg0LCAweDgwLCAweGQ4LCAweDhiLCAweDE0LCAweDY5LCAweDk4LCAweDhkLAorICAweDEzLCAweDY0LCAweDlmLCAweDEwLCAweDFhLCAweDJiLCAweGQ2LCAweDA4LCAweDVkLCAweDY0LCAweDkxLCAweDVkLAorICAweDJlLCAweDFjLCAweGYwLCAweDljLCAweGVlLCAweGI1LCAweDczLCAweDY2LCAweGY4LCAweDMzLCAweGE2LCAweDQyLAorICAweDUwLCAweGQyLCAweGMyLCAweGExLCAweDA1LCAweDE1LCAweGQ4LCAweGM3LCAweDQ1LCAweDk5LCAweGI4LCAweGI1LAorICAweGIyLCAweGY2LCAweGJjLCAweDNjLCAweDVjLCAweDgzLCAweGJmLCAweDA2LCAweGY0LCAweDc2LCAweGFmLCAweGIxLAorICAweDgxLCAweGVhLCAweDA4LCAweDAyLCAweGZjLCAweDM2LCAweDI0LCAweDNkLCAweDNkLCAweDJiLCAweDNiLCAweGQ2LAorICAweGI3LCAweGQwLCAweDFiLCAweDQzLCAweDEyLCAweDZjLCAweDVmLCAweDdjLCAweGM5LCAweDU4LCAweDM3LCAweDQ4LAorICAweGI4LCAweDU3LCAweDg5LCAweDYxLCAweDE2LCAweDU1LCAweDZkLCAweDQ5LCAweGE2LCAweDY2LCAweDUxLCAweGIwLAorICAweGMwLCAweGQ1LCAweDNjLCAweGFkLCAweDlmLCAweGNlLCAweGZjLCAweGI3LCAweGJhLCAweDBmLCAweDdmLCAweDgxLAorICAweDZiLCAweDA2LCAweDA2LCAweGExLCAweGQ4LCAweDAwLCAweDAwLCAweDg1LCAweDQwLCAweGEwLCAweDg0LCAweDg2LAorICAweGM0LCAweDAwLCAweGMyLCAweGRkLCAweGMyLCAweDkwLCAweDNlLCAweGE2LCAweDU1LCAweDQ1LCAweGJjLCAweGU1LAorICAweDlhLCAweDgwLCAweDhhLCAweDhiLCAweDhiLCAweGFkLCAweGJkLCAweDk2LCAweGFhLCAweDMzLCAweGM5LCAweDM2LAorICAweDJlLCAweGYxLCAweDkxLCAweDk0LCAweGJjLCAweGZlLCAweDBmLCAweDZlLCAweDFlLCAweDE4LCAweDFiLCAweDg0LAorICAweDY5LCAweGEwLCAweGI0LCAweGIxLCAweDk4LCAweDcwLCAweDc4LCAweDQyLCAweDU4LCAweDBiLCAweDk0LCAweGRlLAorICAweGUzLCAweDczLCAweDk0LCAweGI0LCAweGNkLCAweDM4LCAweGVlLCAweDUwLCAweDM0LCAweDUxLCAweGFiLCAweDQyLAorICAweGM5LCAweDJiLCAweDk5LCAweGM2LCAweGZkLCAweGYxLCAweDhkLCAweDZjLCAweGJjLCAweDZkLCAweDQ5LCAweGFjLAorICAweDFmLCAweDUxLCAweDZkLCAweGIxLCAweDEwLCAweDdhLCAweDFjLCAweGJhLCAweDg4LCAweDcwLCAweDgxLCAweDgyLAorICAweDVhLCAweDg5LCAweDhhLCAweDMwLCAweDgyLCAweDU0LCAweDhmLCAweDRmLCAweDdkLCAweGViLCAweGYxLCAweGVmLAorICAweDllLCAweDQwLCAweDFjLCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDA3LCAweGZmLCAweGZmLCAweDA3LAorICAweDczLCAweDYyLCAweDk4LCAweDQ5LCAweDY4LCAweDI2LCAweDE5LCAweDg0LCAweDA2LCAweDk5LCAweDZkLCAweDA1LAorICAweGRiLCAweDIwLCAweDIwLCAweDI4LCAweDQ0LCAweGEwLCAweGU3LCAweGUyLCAweDYyLCAweGE3LCAweGY0LCAweGYyLAorICAweDIxLCAweDBlLCAweDU3LCAweDI1LCAweGJjLCAweGRhLCAweGM4LCAweDk0LCAweDU4LCAweGJlLCAweDAzLCAweDk4LAorICAweGZlLCAweDhmLCAweGMxLCAweDE1LCAweGZkLCAweGEzLCAweDQ0LCAweGNjLCAweDVlLCAweGUzLCAweDhlLCAweDNlLAorICAweGY4LCAweGExLCAweDUwLCAweDgzLCAweGIxLCAweGVmLCAweDJhLCAweDZmLCAweDY1LCAweDg5LCAweDRmLCAweDk5LAorICAweDM2LCAweDVjLCAweGYyLCAweDU0LCAweDZhLCAweGRmLCAweDkyLCAweDIzLCAweGQ2LCAweGZmLCAweDRkLCAweGYzLAorICAweDhjLCAweDVlLCAweDNlLCAweDk4LCAweDY2LCAweDI4LCAweDM0LCAweDRhLCAweDcyLCAweDk3LCAweDA4LCAweDE0LAorICAweGI4LCAweGNkLCAweDE0LCAweDNkLCAweDQ0LCAweGI3LCAweDZmLCAweDg1LCAweDczLCAweDk4LCAweDc1LCAweDQ1LAorICAweDc2LCAweDY2LCAweGUzLCAweDA5LCAweDg5LCAweGM1LCAweDIxLCAweGYzLCAweGJhLCAweDk4LCAweGQ2LCAweDg0LAorICAweGYzLCAweGUzLCAweDlkLCAweDMxLCAweGIzLCAweDljLCAweGI2LCAweGE4LCAweDUwLCAweDhjLCAweDQ1LCAweDhkLAorICAweDNmLCAweDQ2LCAweGRkLCAweDQ5LCAweDU2LCAweDRlLCAweGE0LCAweDBkLCAweGM2LCAweDE3LCAweDBlLCAweGM2LAorICAweGZiLCAweDI0LCAweDdlLCAweGNiLCAweDdjLCAweDFhLCAweDk0LCAweDIwLCAweDRmLCAweDU3LCAweDFhLCAweGM1LAorICAweGE2LCAweDAwLCAweGI5LCAweGI5LCAweGZjLCAweDU0LCAweDBlLCAweDEzLCAweGUwLCAweDc1LCAweDliLCAweDIyLAorICAweDc5LCAweDdlLCAweGJjLCAweDg1LCAweDFkLCAweGVhLCAweGE3LCAweGJmLCAweGQ1LCAweDhkLCAweGVjLCAweGFjLAorICAweDgyLCAweGE5LCAweDRjLCAweGEwLCAweGYzLCAweDBjLCAweDRmLCAweDNiLCAweGUxLCAweGU2LCAweDMxLCAweDgzLAorICAweDRlLCAweDU1LCAweGIxLCAweDFlLCAweDkzLCAweGQ5LCAweGUwLCAweGE0LCAweGNlLCAweDllLCAweGFmLCAweDBiLAorICAweDQ1LCAweGI3LCAweDcwLCAweDdhLCAweDU1LCAweDEyLCAweDE0LCAweGRiLCAweDE0LCAweDkyLCAweGE3LCAweDE4LAorICAweDFlLCAweDY5LCAweDdjLCAweDliLCAweDMyLCAweDAwLCAweDNmLCAweDdmLCAweDY2LCAweGE5LCAweGI4LCAweDdkLAorICAweDY5LCAweGQxLCAweGRmLCAweDQ2LCAweDk1LCAweGQ3LCAweDQ2LCAweGQ5LCAweGFiLCAweDdjLCAweGJlLCAweDlkLAorICAweGY5LCAweGI5LCAweGY3LCAweDc0LCAweDg4LCAweGZmLCAweGQ1LCAweDQwLCAweDFlLCAweGJmLCAweDAyLCAweGQ2LAorICAweDIyLCAweDg3LCAweDYwLCAweDAxLCAweDI4LCAweDJhLCAweDVkLCAweDEwLCAweDE0LCAweDA4LCAweDhjLCAweDAwLAorICAweDM0LCAweDRjLCAweDczLCAweGE0LCAweGZjLCAweDM3LCAweDkyLCAweDg0LCAweGUwLCAweGNlLCAweDc2LCAweGE0LAorICAweDMzLCAweGQ2LCAweGY0LCAweGQwLCAweDlmLCAweDhhLCAweGFhLCAweGVhLCAweDg2LCAweDg5LCAweDE2LCAweGJjLAorICAweDM0LCAweDZiLCAweDIzLCAweDA5LCAweGE1LCAweDJkLCAweGYzLCAweGI3LCAweGY5LCAweDQ3LCAweDJhLCAweGRmLAorICAweDVkLCAweDM5LCAweDVjLCAweDMwLCAweDUzLCAweDBhLCAweDY5LCAweDVkLCAweDRkLCAweDY3LCAweDc4LCAweGRhLAorICAweDNlLCAweDVkLCAweDY2LCAweDk0LCAweDhhLCAweDQzLCAweDYwLCAweDBiLCAweDk4LCAweGNkLCAweGFiLCAweDU0LAorICAweDA1LCAweDA2LCAweDgxLCAweDhkLCAweGI1LCAweGExLCAweDk5LCAweGJjLCAweDhkLCAweGExLCAweDY0LCAweGQxLAorICAweDc2LCAweDdkLCAweDI1LCAweGQzLCAweDQ3LCAweGEyLCAweGNhLCAweDY0LCAweGYyLCAweDUxLCAweGQzLCAweDdkLAorICAweDM2LCAweDc1LCAweDY5LCAweDliLCAweGMxLCAweDYyLCAweDIzLCAweDJjLCAweDQzLCAweGRkLCAweDliLCAweGU5LAorICAweGU4LCAweGRmLCAweGQyLCAweDAwLCAweGUwLCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAzLCAweGZmLAorICAweGZmLCAweDEzLCAweDZmLCAweGEyLCAweDMxLCAweDg1LCAweDhjLCAweDQzLCAweDA4LCAweDY4LCAweDlkLCAweDEyLAorICAweGUzLCAweDJlLCAweGNhLCAweDVlLCAweDVlLCAweDAwLCAweDA1LCAweGQ1LCAweGUwLCAweGQ2LCAweDVmLCAweDRjLAorICAweGJiLCAweGM2LCAweDQwLCAweDY1LCAweGZkLCAweDU2LCAweGRmLCAweGZhLCAweDc3LCAweDVkLCAweGUwLCAweDAwLAorICAweGQ2LCAweGVjLCAweDUzLCAweGEwLCAweDI3LCAweDhkLCAweDgzLCAweGMzLCAweGY3LCAweDFmLCAweGY1LCAweDc5LAorICAweGMzLCAweDNiLCAweGIzLCAweGNiLCAweDY2LCAweGY1LCAweDlhLCAweGJlLCAweDA4LCAweDgyLCAweDMzLCAweDg2LAorICAweDdmLCAweGY1LCAweDI0LCAweDkzLCAweDhlLCAweDU2LCAweGUyLCAweGI5LCAweGY5LCAweDMyLCAweDVhLCAweGVjLAorICAweDUyLCAweGM5LCAweGYxLCAweGMzLCAweDFlLCAweDgzLCAweGVkLCAweDVlLCAweDM1LCAweGJlLCAweGVmLCAweDAxLAorICAweGE1LCAweGQ1LCAweDM5LCAweDBjLCAweDc4LCAweDMxLCAweGE1LCAweDAwLCAweGRmLCAweGM1LCAweDU5LCAweDFmLAorICAweDBmLCAweDEyLCAweGZjLCAweGIzLCAweDY5LCAweGNlLCAweGI3LCAweDMwLCAweGIxLCAweDBmLCAweDkxLCAweDkzLAorICAweDE2LCAweDUzLCAweDZhLCAweGU1LCAweGI3LCAweDcxLCAweGQ4LCAweDM1LCAweDk2LCAweDhiLCAweGE4LCAweDExLAorICAweDNiLCAweDgxLCAweDJlLCAweGJjLCAweGExLCAweDJjLCAweDg5LCAweDU2LCAweDVjLCAweGI1LCAweGE2LCAweDc3LAorICAweDI5LCAweDdiLCAweGFjLCAweDA4LCAweDk2LCAweGYxLCAweDQyLCAweGRjLCAweDQ1LCAweDE2LCAweGY2LCAweDFkLAorICAweDVlLCAweDI0LCAweDE1LCAweGZkLCAweDBjLCAweDU5LCAweDQ0LCAweGExLCAweDZhLCAweGQ1LCAweGQyLCAweDUxLAorICAweDhlLCAweDMzLCAweGE0LCAweDQyLCAweGQ2LCAweDVkLCAweGQwLCAweGYyLCAweDk0LCAweGZhLCAweDRmLCAweDc2LAorICAweGZlLCAweDAzLCAweGRiLCAweDQ5LCAweDc4LCAweDdhLCAweGEyLCAweDliLCAweGEzLCAweDBkLCAweGE0LCAweGM1LAorICAweDQzLCAweGIyLCAweGFhLCAweDViLCAweDJkLCAweGFkLCAweDVmLCAweDFiLCAweGE1LCAweDZjLCAweGI1LCAweGQ5LAorICAweDMwLCAweGQwLCAweDk4LCAweGM5LCAweDkwLCAweGNmLCAweGE3LCAweDRhLCAweDg5LCAweDkxLCAweDliLCAweDA0LAorICAweDA1LCAweDM2LCAweGRiLCAweDg1LCAweDNkLCAweGY3LCAweDY3LCAweGU2LCAweGMzLCAweDZjLCAweDc4LCAweDY3LAorICAweGZmLCAweGZkLCAweGZkLCAweDViLCAweGU2LCAweGZmLCAweDUwLCAweDBmLCAweDlmLCAweDkzLCAweDYzLCAweDEwLAorICAweGMzLCAweGIwLCAweDAwLCAweDAyLCAweGFhLCAweGUxLCAweDYwLCAweGEwLCAweDQ4LCAweGFjLCAweDA2LCAweGRlLAorICAweDAyLCAweDE5LCAweDMwLCAweDE0LCAweGRiLCAweDY0LCAweGEyLCAweGY4LCAweDYyLCAweDZkLCAweGQ2LCAweDEyLAorICAweDEyLCAweDVjLCAweGE5LCAweDczLCAweDc0LCAweDU1LCAweDJhLCAweGM0LCAweGQ1LCAweGEzLCAweDcyLCAweGFkLAorICAweGQzLCAweGI2LCAweGZhLCAweDUwLCAweDRiLCAweGQ2LCAweDhkLCAweGQ3LCAweDY4LCAweDMyLCAweDg1LCAweGE5LAorICAweGNkLCAweDRmLCAweDYxLCAweDEwLCAweDAwLCAweDAyLCAweDNjLCAweGQ4LCAweGQ5LCAweDk4LCAweDI0LCAweDllLAorICAweDA0LCAweGQ0LCAweDQxLCAweDAxLCAweDI0LCAweGZhLCAweGQwLCAweDc2LCAweGVhLCAweDMzLCAweGYwLCAweGVlLAorICAweDExLCAweDA0LCAweDI2LCAweGEyLCAweDQ1LCAweGYzLCAweDFhLCAweGFhLCAweDg4LCAweGFhLCAweDhhLCAweDgyLAorICAweDQ0LCAweDdjLCAweGY0LCAweGM1LCAweGZkLCAweDUzLCAweGY2LCAweDdmLCAweGE5LCAweGVhLCAweDdkLCAweDVmLAorICAweDZjLCAweDM4LCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAzLCAweGZmLCAweGZmLCAweGZmLCAweDA5LCAweDczLAorICAweDYzLCAweDEyLCAweDEwLCAweDhjLCAweDI4LCAweDEyLCAweDg0LCAweDE2LCAweDQ1LCAweGU3LCAweDRlLCAweDVhLAorICAweGYzLCAweDU5LCAweDVhLCAweDUyLCAweDgwLCAweDU4LCAweDI1LCAweDA1LCAweGEwLCAweDZjLCAweDk4LCAweDFjLAorICAweDU0LCAweDgwLCAweDk1LCAweDI5LCAweDAwLCAweDgzLCAweGRkLCAweDgyLCAweDFmLCAweDFlLCAweDFlLCAweGM0LAorICAweDQ5LCAweDA0LCAweDhhLCAweGQ2LCAweDUxLCAweDMyLCAweGMzLCAweDk5LCAweDQ3LCAweGI1LCAweGJkLCAweDhiLAorICAweDEwLCAweGQxLCAweDFiLCAweGY3LCAweDIwLCAweDEyLCAweDVhLCAweDFmLCAweDMzLCAweDc1LCAweGJlLCAweGFhLAorICAweGRmLCAweDc4LCAweDg3LCAweDUyLCAweDQyLCAweDI3LCAweDlhLCAweDFjLCAweDhlLCAweGRkLCAweGY0LCAweGUxLAorICAweGU0LCAweDJlLCAweDI5LCAweDBlLCAweDRhLCAweGQ1LCAweGZlLCAweGUzLCAweDA0LCAweDU2LCAweDg4LCAweDY1LAorICAweGQzLCAweDU3LCAweDNhLCAweGQzLCAweDhhLCAweDdkLCAweGRkLCAweDE0LCAweGJmLCAweGJmLCAweDFhLCAweGRhLAorICAweGUyLCAweGZjLCAweGYzLCAweDcxLCAweGE5LCAweDllLCAweDI4LCAweDU2LCAweGNhLCAweDI1LCAweDYyLCAweDk1LAorICAweDkwLCAweDlkLCAweDNhLCAweDRiLCAweGU5LCAweDRjLCAweGU2LCAweDhjLCAweDkyLCAweDlkLCAweDRmLCAweDhmLAorICAweGJiLCAweGMzLCAweGY0LCAweDA5LCAweDJmLCAweDRiLCAweGRkLCAweDJhLCAweDg2LCAweGI5LCAweDQ5LCAweDY4LAorICAweDUyLCAweDExLCAweDQyLCAweDI3LCAweDhlLCAweDYwLCAweDU1LCAweDJjLCAweGFiLCAweDI1LCAweDAwLCAweDhlLAorICAweGMxLCAweDA1LCAweGFkLCAweDA4LCAweDEzLCAweGRhLCAweDEyLCAweDgzLCAweDI1LCAweDE3LCAweDYxLCAweDAyLAorICAweDdhLCAweGQ0LCAweDA3LCAweDQxLCAweGJhLCAweDAwLCAweDFhLCAweGMxLCAweDkyLCAweDIwLCAweDhhLCAweDA0LAorICAweDZhLCAweDRjLCAweDQzLCAweDIxLCAweGI4LCAweDkyLCAweDBkLCAweGQ3LCAweGUxLCAweGI0LCAweGM1LCAweDI0LAorICAweGM3LCAweGMwLCAweDlkLCAweDlhLCAweDk5LCAweDUwLCAweGE0LCAweDMyLCAweDQ0LCAweDM3LCAweDdkLCAweGIzLAorICAweGRjLCAweDcxLCAweGM3LCAweDljLCAweGJlLCAweDcyLCAweDEwLCAweDk0LCAweGYyLCAweGRjLCAweDk3LCAweDRkLAorICAweDAwLCAweGI2LCAweDRhLCAweGQ2LCAweDRkLCAweDg3LCAweGIxLCAweDA3LCAweDk0LCAweDRiLCAweDJhLCAweGUxLAorICAweGU3LCAweGE0LCAweGE3LCAweDE4LCAweGQ5LCAweGYyLCAweDVhLCAweDg1LCAweGFiLCAweDZhLCAweDQzLCAweDI5LAorICAweDYxLCAweDRkLCAweDgyLCAweDI4LCAweGE2LCAweDg0LCAweDNiLCAweGYyLCAweDk3LCAweDZjLCAweDA5LCAweDUzLAorICAweDY4LCAweDVmLCAweDA4LCAweDQ2LCAweDUzLCAweGZlLCAweGYzLCAweGU5LCAweGRmLCAweGQzLCAweGRmLCAweGY4LAorICAweDgwLCAweDNkLCAweDdjLCAweDU4LCAweDQ0LCAweDcxLCAweDRhLCAweDA5LCAweDg3LCAweDAxLCAweDcwLCAweGVjLAorICAweDAwLCAweDJhLCAweDI0LCAweGE0LCAweDA1LCAweDAwLCAweDJjLCAweDQwLCAweDY5LCAweDY4LCAweDk2LCAweDIzLAorICAweDJlLCAweDU3LCAweDQyLCAweDIyLCAweGQxLCAweGM5LCAweGE0LCAweDNiLCAweGUxLCAweDgxLCAweDczLCAweGQ2LAorICAweDIyLCAweDczLCAweDljLCAweDEyLCAweDI5LCAweDkwLCAweDMwLCAweDhhLCAweDEyLCAweGRlLCAweDQ0LCAweDQ0LAorICAweGUwLCAweDI1LCAweGExLCAweGVkLCAweDRkLCAweDY3LCAweGM2LCAweDkzLCAweGNlLCAweDhjLCAweDA4LCAweDk5LAorICAweGI0LCAweDRkLCAweDNhLCAweDVhLCAweGZlLCAweDUyLCAweDkwLCAweDVkLCAweDNmLCAweDFjLCAweDU2LCAweDY1LAorICAweGU3LCAweGFmLCAweDkxLCAweDBhLCAweGU4LCAweGNiLCAweDkzLCAweGU5LCAweDNiLCAweDcyLCAweDRhLCAweDc2LAorICAweGQxLCAweGEwLCAweGJjLCAweGIwLCAweGU1LCAweDBhLCAweDc3LCAweDBjLCAweDBjLCAweDg4LCAweDI2LCAweGMyLAorICAweGM0LCAweDkyLCAweGJkLCAweGQ2LCAweDEyLCAweDk1LCAweDM2LCAweDRhLCAweDk0LCAweGM1LCAweGU4LCAweGYyLAorICAweDhjLCAweGQ3LCAweGNhLCAweDkzLCAweGNmLCAweDU0LCAweDlkLCAweDVkLCAweGMyLCAweDc0LCAweGVmLCAweGJlLAorICAweGJjLCAweDJkLCAweDlmLCAweDlkLCAweGI3LCAweGMyLCAweGYzLCAweGRkLCAweGFlLCAweGQyLCAweDUwLCAweDZlLAorICAweDFjLCAweDI4LCAweGNmLCAweGM3LCAweDhjLCAweGM2LCAweDE5LCAweGY2LCAweGRhLCAweDlhLCAweGI2LCAweGJjLAorICAweDE3LCAweDJiLCAweGE4LCAweGYxLCAweGY2LCAweDcxLCAweGY2LCAweDgwLCAweDcwLCAweDIxLCAweDFhLCAweDg4LAorICAweDAwLCAweDAwLCAweDdmLCAweGZmLCAweGZmLCAweDBiLCAweDZmLCAweGExLCAweGQ4LCAweDU4LCAweGE4LCAweDIyLAorICAweDJhLCAweDE5LCAweDg1LCAweDAyLCAweDUwLCAweDgwLCAweDBmLCAweDY1LCAweDhkLCAweDJhLCAweDVkLCAweDRjLAorICAweDIwLCAweDAwLCAweDkzLCAweDYzLCAweDFmLCAweDg0LCAweDljLCAweDcxLCAweDExLCAweDQ1LCAweDMyLCAweDMwLAorICAweDQ3LCAweDQ1LCAweDEwLCAweDk4LCAweDQ5LCAweDViLCAweDMwLCAweDk4LCAweDAzLCAweDZlLCAweDgzLCAweGYzLAorICAweGQyLCAweGU4LCAweGM4LCAweDA0LCAweDFhLCAweDhlLCAweDU2LCAweDJmLCAweDI3LCAweDYxLCAweDkwLCAweDdlLAorICAweDc3LCAweGVkLCAweDNiLCAweDE0LCAweDExLCAweDlkLCAweDM3LCAweDA5LCAweGE2LCAweDJmLCAweDRjLCAweGZmLAorICAweGNiLCAweGQ5LCAweGQwLCAweDc2LCAweDU2LCAweDQ1LCAweGQ2LCAweDk1LCAweDQ0LCAweDNhLCAweDk5LCAweGM3LAorICAweDMwLCAweDdkLCAweGNmLCAweDJjLCAweDllLCAweDljLCAweGNhLCAweDdiLCAweDJjLCAweDk2LCAweDRhLCAweDdiLAorICAweDZhLCAweDg1LCAweDkwLCAweDZkLCAweDA3LCAweGQxLCAweGFkLCAweGZlLCAweDY5LCAweDA0LCAweDk1LCAweGI1LAorICAweGM3LCAweDgyLCAweGFjLCAweGE2LCAweDBmLCAweDJjLCAweGFmLCAweDhiLCAweGZmLCAweDVhLCAweDcyLCAweDUyLAorICAweGQ0LCAweGJiLCAweGY3LCAweDczLCAweDZlLCAweDk4LCAweDUzLCAweGZkLCAweDViLCAweGJiLCAweGVmLCAweDg2LAorICAweDdlLCAweGVhLCAweGY1LCAweGVjLCAweGYwLCAweGE3LCAweGE1LCAweGE2LCAweGI5LCAweDQ0LCAweGRlLCAweDljLAorICAweDAxLCAweDZmLCAweGQzLCAweDU5LCAweDUwLCAweDI4LCAweDYzLCAweDdjLCAweDU2LCAweDkzLCAweDE1LCAweDZhLAorICAweDI1LCAweDNlLCAweGFjLCAweDhmLCAweGYwLCAweDIxLCAweDU2LCAweGFiLCAweDFiLCAweDA5LCAweGE5LCAweGQ5LAorICAweGQ4LCAweDJjLCAweGY2LCAweDRmLCAweGZkLCAweDEyLCAweDM1LCAweDE1LCAweDFhLCAweDY5LCAweGE3LCAweDk2LAorICAweDQzLCAweDE1LCAweGM4LCAweDUxLCAweGU1LCAweDQ0LCAweDk4LCAweDJiLCAweDY3LCAweGYxLCAweDI2LCAweDY0LAorICAweGZkLCAweGQ5LCAweDFhLCAweDMyLCAweDM4LCAweDFhLCAweGIyLCAweDU0LCAweGViLCAweDhkLCAweDI2LCAweDAzLAorICAweDg4LCAweGQ4LCAweDYwLCAweDZkLCAweDAzLCAweGM1LCAweGQwLCAweGNlLCAweDNkLCAweDY4LCAweDMxLCAweDBhLAorICAweDBhLCAweGNjLCAweGY4LCAweDM2LCAweDE5LCAweGNlLCAweDAwLCAweDU1LCAweDQ2LCAweDExLCAweDg1LCAweDcyLAorICAweDRjLCAweDI3LCAweDkwLCAweGRkLCAweGQ1LCAweGJjLCAweGRiLCAweGMzLCAweDNkLCAweGI0LCAweDYzLCAweDU2LAorICAweGUwLCAweDUxLCAweDlmLCAweDI4LCAweDdjLCAweDQ1LCAweGQ2LCAweDg1LCAweGU5LCAweGYzLCAweDI2LCAweDNjLAorICAweDc4LCAweGYxLCAweDY5LCAweDZkLCAweDI5LCAweDZmLCAweGRjLCAweGQ3LCAweGRhLCAweGRkLCAweDVmLCAweDhiLAorICAweDlmLCAweDhmLCAweDhmLCAweDE4LCAweGRkLCAweDVmLCAweDRmLCAweGQ5LCAweGFmLCAweGY5LCAweGZiLCAweDNlLAorICAweDYwLCAweDA4LCAweDBmLCAweGEwLCAweGM5LCAweDA0LCAweGMxLCAweDEwLCAweGVjLCAweDAwLCAweDAwLCAweDFkLAorICAweDIxLCAweDMyLCAweGU4LCAweDMwLCAweDY1LCAweGYyLCAweDAwLCAweDI3LCAweDBkLCAweDVmLCAweGE3LCAweDA5LAorICAweDJmLCAweGY5LCAweGVmLCAweDQ1LCAweDZhLCAweGRlLCAweDMyLCAweDg4LCAweDJhLCAweDJjLCAweGE0LCAweDA5LAorICAweDg2LCAweDdkLCAweDE3LCAweGMxLCAweGMwLCAweGNlLCAweDM0LCAweDA1LCAweGQ1LCAweDhkLCAweGZlLCAweDVmLAorICAweGUzLCAweGI3LCAweDhmLCAweDEwLCAweDU0LCAweGJmLCAweGVlLCAweDk2LCAweGQzLCAweGI3LCAweDljLCAweDFmLAorICAweDlkLCAweDljLCAweDA1LCAweGUzLCAweDI4LCAweGE5LCAweGIzLCAweDY1LCAweGYxLCAweGYwLCAweGI3LCAweDRiLAorICAweGZiLCAweDc0LCAweGIxLCAweDc3LCAweDU5LCAweGZkLCAweGVmLCAweGFhLCAweGQ2LCAweDI2LCAweDRiLCAweGIyLAorICAweDMxLCAweGZlLCAweDZmLCAweDc1LCAweDljLCAweDdhLCAweDIwLCAweDE1LCAweDcyLCAweDg4LCAweDViLCAweDI0LAorICAweGY3LCAweDNkLCAweDQ0LCAweDIwLCAweDBmLCAweGQ1LCAweGMzLCAweDFmLCAweGI2LCAweDAxLCAweGMwLCAweDIxLAorICAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDExLCAweDcyLCAweDgzLCAweDIwLCAweGM5LAorICAweDRjLCAweDQ1LCAweDA4LCAweDAzLCAweDM1LCAweGYwLCAweDk1LCAweGEzLCAweDQwLCAweGEwLCAweDAwLCAweDk1LAorICAweDI2LCAweGM3LCAweGJjLCAweGZlLCAweGNlLCAweDc3LCAweDY3LCAweDE1LCAweGU3LCAweDUxLCAweGQwLCAweDIyLAorICAweDkzLCAweGM3LCAweGEwLCAweDU2LCAweDY4LCAweGZjLCAweDdkLCAweDc5LCAweGQxLCAweDVlLCAweGU1LCAweGVmLAorICAweDdmLCAweDNlLCAweGM1LCAweGExLCAweGExLCAweGZkLCAweGUxLCAweDlmLCAweDllLCAweDJmLCAweGY4LCAweDQ1LAorICAweDI3LCAweGI4LCAweDNkLCAweDcyLCAweDQ5LCAweGZjLCAweDk3LCAweGUzLCAweDUzLCAweGYwLCAweDc3LCAweDRmLAorICAweDI0LCAweDU1LCAweDE3LCAweDlhLCAweDlmLCAweDY5LCAweGNjLCAweDg1LCAweDg2LCAweGJhLCAweDYxLCAweDk1LAorICAweDVkLCAweDgzLCAweGE5LCAweGE5LCAweDg2LCAweGFjLCAweGQzLCAweDkxLCAweGU3LCAweDMyLCAweDNkLCAweGU0LAorICAweGI0LCAweGYxLCAweDE1LCAweGQzLCAweDcyLCAweGZmLCAweDBkLCAweDk2LCAweDRiLCAweDViLCAweGQzLCAweDc3LAorICAweGM5LCAweDIxLCAweDUxLCAweGYyLCAweDUzLCAweDJkLCAweDM5LCAweDQ5LCAweGFkLCAweDE5LCAweGNlLCAweDZlLAorICAweGVkLCAweDNhLCAweGIwLCAweDAxLCAweDMwLCAweGNmLCAweDk1LCAweDRlLCAweGFhLCAweGQ2LCAweGNhLCAweDdhLAorICAweDA5LCAweDM3LCAweDdlLCAweDM0LCAweDZmLCAweDk5LCAweDVkLCAweGRhLCAweDQ1LCAweDM1LCAweDZkLCAweDdkLAorICAweDkyLCAweDY4LCAweGQ1LCAweDcxLCAweDJmLCAweDU3LCAweGNlLCAweDEzLCAweDUyLCAweGI4LCAweDAzLCAweGNlLAorICAweDY5LCAweDY0LCAweGVhLCAweDZkLCAweDZhLCAweDU3LCAweGQwLCAweGU4LCAweDRlLCAweDYwLCAweDNjLCAweDg0LAorICAweGRjLCAweGMzLCAweDIyLCAweDZhLCAweDNkLCAweDIwLCAweDUyLCAweGZkLCAweDYwLCAweDI0LCAweDNhLCAweGVlLAorICAweGJmLCAweGMwLCAweGE2LCAweDAzLCAweDc3LCAweGJhLCAweDcyLCAweDY0LCAweDRkLCAweGE0LCAweGRmLCAweDNjLAorICAweDNhLCAweDczLCAweDk5LCAweDYzLCAweDQxLCAweGUyLCAweGY2LCAweGYxLCAweGZiLCAweDBlLCAweGRlLCAweDJlLAorICAweDZiLCAweDM0LCAweGYxLCAweGQ4LCAweDMwLCAweGUyLCAweDUzLCAweDRhLCAweGEwLCAweDRlLCAweDc5LCAweGQwLAorICAweDkwLCAweGY3LCAweDlhLCAweGNjLCAweDQzLCAweDllLCAweDE2LCAweDM0LCAweGU1LCAweDU5LCAweDZmLCAweGQwLAorICAweGQ4LCAweDBkLCAweGI2LCAweDhlLCAweDM2LCAweDc2LCAweDRhLCAweDljLCAweDZjLCAweDE4LCAweGJkLCAweGJkLAorICAweDNlLCAweDZkLCAweGNkLCAweDQ1LCAweDVlLCAweDZhLCAweGRhLCAweGJjLCAweDY2LCAweDJlLCAweGJjLCAweDdmLAorICAweDFlLCAweDNiLCAweGU5LCAweGQ3LCAweGQ5LCAweGUwLCAweDAwLCAweGY5LCAweGZiLCAweDE0LCAweGEwLCAweDk4LAorICAweDZhLCAweDFkLCAweDgwLCAweDAwLCAweDI0LCAweGE0LCAweGEyLCAweGI0LCAweDMwLCAweDA4LCAweDYwLCAweDg0LAorICAweDk2LCAweGFkLCAweDhkLCAweDhiLCAweDU1LCAweGVkLCAweGI5LCAweDVhLCAweGExLCAweDBlLCAweGQwLCAweDgwLAorICAweDEwLCAweDQxLCAweDAxLCAweGNjLCAweGFjLCAweDcxLCAweDE5LCAweGVkLCAweGJlLCAweDVjLCAweGQxLCAweGE2LAorICAweDMyLCAweDlhLCAweGM1LCAweGE2LCAweDljLCAweGE1LCAweDQyLCAweDk5LCAweDYwLCAweDE1LCAweDM1LCAweDc0LAorICAweGNmLCAweDFlLCAweDY0LCAweDA5LCAweDdlLCAweDM4LCAweDJlLCAweGE4LCAweGE0LCAweDBiLCAweDJlLCAweDA5LAorICAweDY4LCAweDlmLCAweDZjLCAweGY4LCAweGUzLCAweGQ3LCAweGQ1LCAweDM0LCAweDkwLCAweDZhLCAweDA5LCAweDVlLAorICAweDAzLCAweGRmLCAweGI2LCAweGFiLCAweGIwLCAweGMxLCAweGNhLCAweGVhLCAweGU1LCAweDUxLCAweGFhLCAweDc5LAorICAweDgwLCAweDc0LCAweDZlLCAweGNhLCAweGNjLCAweGE2LCAweGY1LCAweDdjLCAweDdjLCAweGYzLCAweGVhLCAweGM3LAorICAweGJmLCAweDgwLCAweDA3LCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDA3LCAweGZmLCAweGZmLCAweDBmLAorICAweDcwLCAweGEyLCAweDMxLCAweDBkLCAweDA0LCAweDU2LCAweDIxLCAweDg0LCAweDAyLCAweDNhLCAweDVlLCAweDgxLAorICAweGE1LCAweDRhLCAweGMwLCAweDQwLCAweDIyLCAweDM2LCAweDM5LCAweDEwLCAweDgyLCAweGEwLCAweDZkLCAweDJhLAorICAweGQwLCAweGQyLCAweGZiLCAweDcwLCAweDU4LCAweDU3LCAweDcyLCAweGFiLCAweDA2LCAweGZmLCAweDFmLCAweGQ0LAorICAweDNiLCAweDNhLCAweGI1LCAweDIxLCAweDZhLCAweDNjLCAweDZmLCAweDVlLCAweDFkLCAweGQ2LCAweDNkLCAweGM3LAorICAweDYxLCAweGNjLCAweGM4LCAweGQ2LCAweGZjLCAweGM3LCAweGU4LCAweDM5LCAweGE3LCAweGFhLCAweDdhLCAweDAyLAorICAweDUzLCAweDA0LCAweDhiLCAweDhiLCAweGM0LCAweDZlLCAweDU2LCAweGRkLCAweDc4LCAweGFlLCAweGY5LCAweGE2LAorICAweGFiLCAweDE4LCAweDM3LCAweDg3LCAweDgxLCAweDZlLCAweDA4LCAweDFmLCAweGJkLCAweGFhLCAweDE4LCAweDczLAorICAweGQwLCAweDBiLCAweDJjLCAweDNkLCAweGJlLCAweDAwLCAweGQ1LCAweDkwLCAweDhkLCAweDE3LCAweDAwLCAweGZjLAorICAweGYwLCAweDg5LCAweDQ5LCAweDkyLCAweGYzLCAweGNmLCAweDc3LCAweGNhLCAweGJkLCAweDliLCAweDM3LCAweDIzLAorICAweGNiLCAweDM4LCAweGY5LCAweDEyLCAweGE1LCAweGQzLCAweGY2LCAweDliLCAweGQ5LCAweGEzLCAweGYxLCAweGRmLAorICAweDhjLCAweDU0LCAweGY4LCAweGQzLCAweGM1LCAweGFhLCAweGQ1LCAweDBkLCAweDU3LCAweDc2LCAweDNkLCAweGEyLAorICAweDVjLCAweGNkLCAweDNhLCAweGNjLCAweGI4LCAweDRlLCAweDUxLCAweGQ1LCAweDIwLCAweDQ3LCAweDQ0LCAweDA0LAorICAweDIzLCAweGIwLCAweDc2LCAweGQxLCAweDhkLCAweGFiLCAweDNhLCAweDRkLCAweDE1LCAweGE5LCAweDc1LCAweGM1LAorICAweDAzLCAweDUzLCAweDZlLCAweDkwLCAweDM5LCAweDUwLCAweDk4LCAweDY3LCAweDAwLCAweDg5LCAweDNjLCAweGM0LAorICAweDY0LCAweDMxLCAweDczLCAweGIwLCAweGY1LCAweDE4LCAweDdhLCAweDM4LCAweGM0LCAweGEzLCAweDg2LCAweDc4LAorICAweGMzLCAweDU4LCAweGM0LCAweGVhLCAweDAwLCAweDYxLCAweDMyLCAweDE4LCAweDY2LCAweDQ1LCAweDI1LCAweGY0LAorICAweDgyLCAweGY3LCAweGFkLCAweDI2LCAweGVlLCAweGRiLCAweDljLCAweDZjLCAweGMyLCAweGEwLCAweDhlLCAweDU0LAorICAweDVkLCAweGFhLCAweGE4LCAweGI2LCAweDljLCAweGZiLCAweGE1LCAweGMzLCAweGRmLCAweGJlLCAweDBiLCAweGNjLAorICAweDRhLCAweDQ3LCAweDc3LCAweDg3LCAweDY2LCAweGU1LCAweGM3LCAweGUzLCAweGZlLCAweDkxLCAweGVhLCAweGRmLAorICAweDNhLCAweDBmLCAweDdmLCAweDgxLCAweDYyLCAweDA5LCAweDg2LCAweGExLCAweGQ4LCAweDI1LCAweDAwLCAweDExLAorICAweDUyLCAweGFjLCAweDAwLCAweDEyLCAweDAwLCAweDA1LCAweDIwLCAweDQ1LCAweDI3LCAweDMyLCAweDEwLCAweDRmLAorICAweDgwLCAweDEzLCAweDlhLCAweDEzLCAweGIzLCAweDQ4LCAweDU2LCAweDUzLCAweDU2LCAweDExLCAweDRiLCAweDY1LAorICAweGMyLCAweDJiLCAweGM0LCAweDQ2LCAweDhiLCAweGZkLCAweDNmLCAweGMxLCAweDdlLCAweDYyLCAweDhjLCAweDcyLAorICAweDAwLCAweDc3LCAweGIzLCAweGQ5LCAweDQ4LCAweDI0LCAweDIyLCAweDAxLCAweGI2LCAweDc0LCAweGYyLCAweGVlLAorICAweDQ2LCAweDgzLCAweGJlLCAweGYzLCAweDQwLCAweDIyLCAweDUwLCAweDkxLCAweGRkLCAweDZlLCAweDQ4LCAweDU0LAorICAweDQ5LCAweDcwLCAweDYzLCAweGY3LCAweGE4LCAweDIyLCAweDEwLCAweGFhLCAweGJmLCAweGNhLCAweDIwLCAweDU4LAorICAweDU3LCAweDlmLCAweDdjLCAweGQ1LCAweGVkLCAweGUxLCAweGU4LCAweGE2LCAweGY5LCAweDI3LCAweDc2LCAweGNiLAorICAweDdlLCAweGVlLCAweGZmLCAweDNmLCAweGYxLCAweDhjLCAweGZkLCAweDljLCAweGY4LCAweDAwLCAweDcwLCAweDIxLAorICAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDdmLCAweGZmLCAweGZmLCAweDEzLCAweDczLCAweDYyLCAweDkyLCAweGQwLAorICAweDRjLCAweDI4LCAweDExLCAweDg0LCAweDFjLCAweDBiLCAweDY5LCAweGQwLCAweDU5LCAweDQ5LCAweDgwLCAweDgwLAorICAweDQyLCAweDZjLCAweDc5LCAweDNlLCAweDA2LCAweDVhLCAweDg0LCAweDQ0LCAweDY5LCAweDk3LCAweDdiLCAweDdiLAorICAweDljLCAweDlhLCAweDcyLCAweDY2LCAweDE0LCAweDBiLCAweGU0LCAweDNhLCAweDE3LCAweDY4LCAweGYwLCAweDQ5LAorICAweGQ0LCAweDNlLCAweGZjLCAweGU3LCAweDEwLCAweDkwLCAweDc2LCAweDI1LCAweGE0LCAweDVlLCAweDZjLCAweDhhLAorICAweGVkLCAweGUxLCAweDcyLCAweDJmLCAweGE0LCAweGJlLCAweDJlLCAweDkwLCAweDc1LCAweDliLCAweGZmLCAweDgzLAorICAweDM3LCAweDJmLCAweDM4LCAweDk2LCAweDdjLCAweGQ4LCAweDllLCAweDJkLCAweDZhLCAweDQyLCAweGY2LCAweDg5LAorICAweDYwLCAweDE3LCAweDk3LCAweDQyLCAweDc1LCAweDRlLCAweDY5LCAweDczLCAweGQzLCAweGVmLCAweGY3LCAweGM4LAorICAweGNiLCAweDM4LCAweDliLCAweGIwLCAweGUzLCAweGU5LCAweDM2LCAweDUzLCAweDdlLCAweGM0LCAweDFkLCAweGU3LAorICAweGIyLCAweGYzLCAweDFkLCAweDZkLCAweGM3LCAweDY0LCAweDRmLCAweDdlLCAweDhmLCAweDMxLCAweDg2LCAweDllLAorICAweDU5LCAweDE1LCAweDQ3LCAweGMzLCAweGRjLCAweDNlLCAweDdiLCAweGU5LCAweGI2LCAweDRiLCAweGI5LCAweDFmLAorICAweDZkLCAweDI0LCAweDJjLCAweGMzLCAweGE3LCAweGMyLCAweDQwLCAweDNhLCAweDUwLCAweGIyLCAweDAzLCAweGMxLAorICAweDIzLCAweDA0LCAweDJhLCAweDUwLCAweDdhLCAweGJlLCAweDc2LCAweDg1LCAweDQ0LCAweDk1LCAweGM4LCAweGMwLAorICAweGFiLCAweGM1LCAweDhlLCAweDFjLCAweDFjLCAweDE1LCAweGQ0LCAweGY0LCAweDQyLCAweGQxLCAweDg0LCAweGU3LAorICAweGM5LCAweGE1LCAweDdmLCAweGFkLCAweDNkLCAweDZiLCAweDAxLCAweDc2LCAweDAzLCAweDk0LCAweGM4LCAweGVlLAorICAweDE2LCAweDZhLCAweGRkLCAweDFlLCAweDFiLCAweDM3LCAweDQyLCAweDk0LCAweDFkLCAweGZkLCAweGFhLCAweDYyLAorICAweGUxLCAweGNhLCAweDJiLCAweDI4LCAweDljLCAweDE4LCAweDJhLCAweGVhLCAweDZjLCAweDcyLCAweDZiLCAweGVlLAorICAweDgzLCAweDI2LCAweGE4LCAweDhiLCAweDBhLCAweDExLCAweDk0LCAweDg4LCAweGE4LCAweGUwLCAweDAwLCAweGY0LAorICAweGNmLCAweGE1LCAweDRhLCAweGU0LCAweGJhLCAweDk2LCAweDViLCAweDUxLCAweDIxLCAweDcwLCAweGQyLCAweDlkLAorICAweDcyLCAweDM3LCAweDlkLCAweGUyLCAweGMyLCAweDMxLCAweGU2LCAweDk4LCAweDUyLCAweDRhLCAweDNhLCAweDA4LAorICAweDkyLCAweDAzLCAweGM1LCAweDkyLCAweGQzLCAweDNmLCAweDNkLCAweGZkLCAweDdmLCAweGM0LCAweDdmLCAweGY3LAorICAweDAzLCAweGU3LCAweGQxLCAweDA4LCAweDI4LCAweDIyLCAweGEwLCAweDYwLCAweDZhLCAweDFkLCAweDgwLCAweDAwLAorICAweGE4LCAweGFkLCAweDAwLCAweGMxLCAweDAxLCAweDY3LCAweDIxLCAweDZiLCAweDQ5LCAweDc3LCAweDk1LCAweDk3LAorICAweDY1LCAweDE1LCAweGE5LCAweGExLCAweGJmLCAweDg2LCAweDU3LCAweDJhLCAweDgyLCAweGVlLCAweDMzLCAweGEyLAorICAweGQ3LCAweDk3LCAweGUwLCAweDllLCAweGFiLCAweGIwLCAweDQ2LCAweGI1LCAweGM4LCAweDEzLCAweDcxLCAweDEzLAorICAweDAzLCAweDU0LCAweGYyLCAweDkxLCAweDIzLCAweDQxLCAweDFlLCAweDc3LCAweDJmLCAweGU5LCAweDUwLCAweDg2LAorICAweGMzLCAweDEzLCAweDFkLCAweDU1LCAweGEyLCAweDU5LCAweDRlLCAweDk1LCAweGIxLCAweDU0LCAweDg2LCAweDAzLAorICAweDI2LCAweDhjLCAweDJiLCAweGUzLCAweDUyLCAweDU4LCAweDdlLCAweDdmLCAweDkzLCAweDFjLCAweDNhLCAweDUxLAorICAweDFiLCAweDYxLCAweGRjLCAweGYyLCAweDcyLCAweDk4LCAweGE5LCAweGE5LCAweDA5LCAweGQ3LCAweDIyLCAweGM5LAorICAweGYzLCAweDMzLCAweDkzLCAweGM1LCAweDUxLCAweDUzLCAweDA1LCAweDQ0LCAweGJhLCAweDczLCAweDk4LCAweDAwLAorICAweGFkLCAweDhjLCAweDY3LCAweDQyLCAweGZjLCAweDlhLCAweGI0LCAweDhhLCAweDc0LCAweDhkLCAweGYxLCAweDgwLAorICAweDRhLCAweDJjLCAweGIyLCAweDNjLCAweDY4LCAweGNkLCAweGQ2LCAweGIzLCAweDVkLCAweDc1LCAweGU3LCAweDAwLAorICAweDFjLCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDdmLCAweGZmLCAweDBkLCAweDZmLCAweGEyLAorICAweDQxLCAweDE4LCAweDQ4LCAweDMxLCAweDRiLCAweDExLCAweGMyLCAweDAwLCAweGJiLCAweDU4LCAweGUwLCAweDQ1LAorICAweGQ2LCAweDJmLCAweDA4LCAweDA0LCAweDI2LCAweDBiLCAweDQwLCAweDI0LCAweDY0LCAweGQwLCAweDI2LCAweDY4LAorICAweGE0LCAweDJkLCAweGMxLCAweDI0LCAweGM5LCAweGU0LCAweDA1LCAweDIwLCAweDg4LCAweDAxLCAweGZiLCAweGI5LAorICAweDdkLCAweDUzLCAweDMwLCAweDdlLCAweGQ5LCAweGZiLCAweGUyLCAweDAyLCAweDA2LCAweGYyLCAweGYyLCAweDdjLAorICAweDE0LCAweDNmLCAweDVmLCAweDQ1LCAweDc3LCAweDg2LCAweGMwLCAweDkwLCAweDcyLCAweDRmLCAweDMxLCAweGMyLAorICAweDc3LCAweDFjLCAweDk3LCAweGI3LCAweDI3LCAweDQyLCAweDc1LCAweDFhLCAweDNkLCAweGQ5LCAweDk0LCAweGYxLAorICAweGFmLCAweGU4LCAweDlkLCAweDNiLCAweDRmLCAweDU2LCAweDA1LCAweDc1LCAweGI0LCAweGMxLCAweGVlLCAweGZhLAorICAweDQyLCAweGJkLCAweDFlLCAweDdiLCAweGVjLCAweDM5LCAweDk1LCAweDQxLCAweGYzLCAweDBmLCAweDRkLCAweDU3LAorICAweDUzLCAweDZhLCAweGQ3LCAweDJjLCAweGUwLCAweDIxLCAweDMwLCAweGQ5LCAweDRmLCAweDljLCAweGM3LCAweGJlLAorICAweDU5LCAweDA1LCAweDA2LCAweDAwLCAweDQxLCAweDk4LCAweGM4LCAweGE4LCAweDQyLCAweDA2LCAweDUwLCAweGFjLAorICAweDkxLCAweDUxLCAweGI0LCAweGQyLCAweDQ0LCAweDNkLCAweGNmLCAweGRkLCAweGU2LCAweDBiLCAweDBjLCAweDQxLAorICAweGFhLCAweDM3LCAweDkxLCAweGUwLCAweDA5LCAweDE0LCAweGMwLCAweDVkLCAweGI1LCAweGViLCAweGNmLCAweDY2LAorICAweGZhLCAweDBkLCAweDkxLCAweGY2LCAweDE3LCAweDY4LCAweDRhLCAweDg2LCAweDQ4LCAweGE0LCAweGI3LCAweGIxLAorICAweDgxLCAweDY5LCAweDMyLCAweGY2LCAweGQ5LCAweGJmLCAweDQ0LCAweGVjLCAweDMzLCAweGExLCAweGM5LCAweDRjLAorICAweGRkLCAweGFmLCAweDA0LCAweGUzLCAweGY2LCAweGUxLCAweDU5LCAweGI5LCAweGQ3LCAweDJjLCAweDJmLCAweGEzLAorICAweDVkLCAweGIzLCAweGM4LCAweDk2LCAweDI1LCAweDY0LCAweGFjLCAweDc4LCAweDUzLCAweGU3LCAweDJmLCAweDEzLAorICAweDhlLCAweGQ2LCAweDgwLCAweDQ3LCAweDQwLCAweDhhLCAweDRlLCAweDZhLCAweGQ0LCAweGVjLCAweGVmLCAweGQ4LAorICAweGFmLCAweDk1LCAweDk2LCAweDBkLCAweDQ1LCAweDM1LCAweGU4LCAweDA3LCAweDBkLCAweDI5LCAweDVlLCAweGU3LAorICAweGFiLCAweDhhLCAweDg5LCAweDNkLCAweGEyLCAweGMxLCAweDQ4LCAweGE2LCAweDAzLCAweDk1LCAweDEyLCAweDBlLAorICAweDc5LCAweGYwLCAweGFiLCAweGY5LCAweGRiLCAweDdmLCAweGQ3LCAweGFhLCAweGViLCAweDM0LCAweGZhLCAweDdjLAorICAweGJhLCAweDdhLCAweGQyLCAweDAwLCAweGY5LCAweGZjLCAweDE0LCAweGIxLCAweDE0LCAweDNiLCAweDAwLCAweDAxLAorICAweDJhLCAweDU0LCAweGExLCAweDEzLCAweDQ1LCAweDYwLCAweDU5LCAweDMwLCAweDZkLCAweDhmLCAweDM4LCAweDU1LAorICAweDMzLCAweDY0LCAweDNhLCAweDQzLCAweDVkLCAweDZiLCAweDYyLCAweGZmLCAweDQ4LCAweGM2LCAweDM0LCAweDRmLAorICAweGU4LCAweGU3LCAweGY4LCAweGM2LCAweDI5LCAweDQwLCAweDUyLCAweGJiLCAweDk0LCAweDAxLCAweDJiLCAweDhmLAorICAweGYyLCAweGFlLCAweGYyLCAweDUyLCAweDk3LCAweGRhLCAweDUzLCAweDQ3LCAweDNhLCAweGIzLCAweGMyLCAweDM0LAorICAweDEzLCAweDBjLCAweGUwLCAweDQxLCAweDcyLCAweDgwLCAweDUxLCAweDgyLCAweGNhLCAweDM0LCAweDJjLCAweGQ1LAorICAweGQ0LCAweGViLCAweDQ3LCAweDViLCAweDRhLCAweDU3LCAweDk0LCAweGRjLCAweDIyLCAweDgwLCAweDI1LCAweGEwLAorICAweGE1LCAweGM2LCAweGE4LCAweGUxLCAweGZiLCAweGIwLCAweGI1LCAweDlkLCAweDMyLCAweGQ5LCAweDM3LCAweGViLAorICAweGE2LCAweDNmLCAweDJkLCAweGZiLCAweDc4LCAweDdhLCAweGY3LCAweDE4LCAweGU0LCAweDAxLCAweGMwLCAweDIxLAorICAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDEzLCAweDcyLCAweDgzLCAweDIxLCAweDQ5LAorICAweDBjLCAweDQ1LCAweDA4LCAweDEzLCAweDUwLCAweGUxLCAweDE1LCAweGMxLCAweGEyLCAweDk0LCAweDAwLCAweDEwLAorICAweDliLCAweDE1LCAweGExLCAweGM4LCAweDEwLCAweGJkLCAweGRhLCAweDQyLCAweDkwLCAweGU4LCAweDAxLCAweGUzLAorICAweGMyLCAweGYzLCAweDMxLCAweDIzLCAweDhhLCAweGQxLCAweDM3LCAweGQ0LCAweDMxLCAweDlmLCAweDNlLCAweGQ4LAorICAweGE0LCAweDMzLCAweDU3LCAweGIwLCAweGZkLCAweGZkLCAweDUwLCAweDgwLCAweGM5LCAweGFhLCAweDIwLCAweDlmLAorICAweDAzLCAweDRiLCAweGQ5LCAweDMwLCAweDRmLCAweDRiLCAweGUzLCAweDc5LCAweGY4LCAweGFlLCAweDVkLCAweDBmLAorICAweDEyLCAweGNkLCAweGFkLCAweDc2LCAweDFlLCAweDkxLCAweDgyLCAweDU5LCAweDU0LCAweDIxLCAweGE3LCAweDI3LAorICAweDJjLCAweDI0LCAweDU3LCAweDEzLCAweDkxLCAweDI0LCAweDk3LCAweDRhLCAweGFhLCAweDJhLCAweGE1LCAweGUzLAorICAweDc4LCAweGY5LCAweGI0LCAweGRmLCAweDZmLCAweDc3LCAweDhmLCAweGZlLCAweDhjLCAweDdmLCAweGQ3LCAweDNiLAorICAweGM0LCAweDRkLCAweDAyLCAweGIzLCAweDViLCAweDJjLCAweGEyLCAweGYyLCAweGY4LCAweDY0LCAweGQzLCAweGI4LAorICAweDZiLCAweGIzLCAweGEwLCAweDEzLCAweGQ4LCAweDUxLCAweDNkLCAweGMyLCAweDEyLCAweGEyLCAweGQyLCAweDcyLAorICAweDMzLCAweGVlLCAweDZiLCAweDIwLCAweDI5LCAweDY1LCAweDAxLCAweDQ5LCAweDNhLCAweDJlLCAweGM4LCAweDJlLAorICAweDBkLCAweDI5LCAweDVhLCAweDZiLCAweGU4LCAweGQ3LCAweDU5LCAweGEzLCAweDU1LCAweGRlLCAweGQ1LCAweGQzLAorICAweDkxLCAweDg0LCAweDc5LCAweDcyLCAweDRhLCAweDRlLCAweDExLCAweDFkLCAweGEyLCAweDkwLCAweGNjLCAweDU0LAorICAweGM2LCAweDkyLCAweDkxLCAweGIyLCAweGQzLCAweGE4LCAweGMzLCAweGIyLCAweDE0LCAweDk4LCAweGMzLCAweDc0LAorICAweGVhLCAweDMyLCAweGRmLCAweDkzLCAweDgwLCAweDkxLCAweDc1LCAweDQyLCAweDg0LCAweGE1LCAweDY5LCAweGQ0LAorICAweDAxLCAweDQ2LCAweDI4LCAweGJiLCAweGY4LCAweDU1LCAweDI0LCAweGUzLCAweDk4LCAweGVlLCAweGM5LCAweGM2LAorICAweGY3LCAweDlhLCAweDZlLCAweDA5LCAweDlkLCAweGUwLCAweDJhLCAweDU3LCAweDVhLCAweDZkLCAweGJhLCAweDcyLAorICAweDkwLCAweDY2LCAweDhhLCAweDJjLCAweDc5LCAweGIyLCAweDZhLCAweDg2LCAweDExLCAweDJjLCAweGMxLCAweGY0LAorICAweDQ3LCAweDZlLCAweDBiLCAweDcyLCAweGQ5LCAweDZiLCAweDAxLCAweGRhLCAweGU4LCAweDAwLCAweDE4LCAweGU3LAorICAweDgzLCAweDc5LCAweDVlLCAweDM2LCAweDQ5LCAweDRlLCAweDFmLCAweGQ3LCAweDFmLCAweDdjLCAweGUzLCAweDdjLAorICAweDdhLCAweDQwLCAweDBmLCAweDdmLCAweGIxLCAweDUyLCAweDBhLCAweDA0LCAweGUxLCAweGQ4LCAweDAwLCAweDA5LAorICAweDQ2LCAweDVjLCAweDU0LCAweDkwLCAweDUwLCAweDBiLCAweGEwLCAweDhkLCAweGFiLCAweGE0LCAweGMzLCAweDM0LAorICAweDE0LCAweDk1LCAweGViLCAweDg2LCAweGZjLCAweGU2LCAweGE0LCAweDQ0LCAweDJhLCAweGEyLCAweDgyLCAweGM5LAorICAweGVjLCAweDE5LCAweDMzLCAweDNiLCAweGYwLCAweGZjLCAweDVhLCAweDViLCAweGI5LCAweDc5LCAweDlmLCAweDVlLAorICAweGI3LCAweDc3LCAweGMzLCAweDRiLCAweGVhLCAweDI5LCAweDY5LCAweDcxLCAweDhmLCAweDFhLCAweDg4LCAweDdjLAorICAweDczLCAweDNkLCAweDc2LCAweDRlLCAweGYyLCAweDgzLCAweDMwLCAweDExLCAweGUxLCAweDQ5LCAweGY2LCAweDdkLAorICAweDE1LCAweDBlLCAweDhmLCAweDcwLCAweGMxLCAweGRlLCAweGMzLCAweDNlLCAweDk0LCAweGU4LCAweDVkLCAweDAwLAorICAweGRlLCAweGJmLCAweGJlLCAweGQxLCAweGJjLCAweDRkLCAweDBjLCAweDZiLCAweDk4LCAweDM5LCAweDQ4LCAweGUxLAorICAweDRlLCAweDM0LCAweDYxLCAweDQyLCAweGYwLCAweDdjLCAweDRmLCAweDFiLCAweDRmLCAweDU3LCAweGM0LCAweGQxLAorICAweGQyLCAweGQ4LCAweDAxLCAweGMwLCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDdmLCAweGZmLCAweGZmLAorICAweDExLCAweDZmLCAweGEyLCAweGMxLCAweDA4LCAweGM4LCAweDUxLCAweDBiLCAweDEyLCAweDAyLCAweGExLCAweDAwLAorICAweDlhLCAweDRkLCAweDQ1LCAweGFmLCAweDM4LCAweGE0LCAweGFhLCAweDU1LCAweDgwLCAweDI1LCAweDQ5LCAweDgyLAorICAweGEyLCAweDA1LCAweDA1LCAweDUyLCAweDZmLCAweDIyLCAweDcwLCAweDEwLCAweDIxLCAweDY3LCAweGU0LCAweDkwLAorICAweDg3LCAweDBlLCAweDhiLCAweDVmLCAweDU5LCAweDZhLCAweGQ5LCAweDcwLCAweDFiLCAweGMyLCAweGE3LCAweDFlLAorICAweGUyLCAweGU2LCAweDhiLCAweGFjLCAweDViLCAweDRkLCAweGQ2LCAweDRkLCAweDA2LCAweGI0LCAweGNkLCAweDE4LAorICAweGYyLCAweGVlLCAweDcxLCAweGMxLCAweDg5LCAweDM1LCAweDkyLCAweDMzLCAweDg2LCAweDczLCAweDczLCAweGJiLAorICAweDc2LCAweDNhLCAweDFjLCAweGI5LCAweDcyLCAweGNkLCAweDM1LCAweDJlLCAweGU2LCAweDk5LCAweDRkLCAweGVmLAorICAweDJiLCAweGNmLCAweDhlLCAweGRhLCAweDY3LCAweGIxLCAweDYyLCAweGQ1LCAweGJiLCAweDFkLCAweDRkLCAweDZkLAorICAweDk2LCAweGExLCAweGJjLCAweGQ1LCAweDMzLCAweGI1LCAweGRiLCAweDQzLCAweGJhLCAweGMzLCAweDkwLCAweGUwLAorICAweDU5LCAweDhhLCAweDZhLCAweGUwLCAweDQ1LCAweDI4LCAweDU0LCAweGE4LCAweGUzLCAweDE0LCAweDY4LCAweDkyLAorICAweGE2LCAweDQ3LCAweDJhLCAweDA2LCAweGVhLCAweDNmLCAweDJkLCAweDFiLCAweDBjLCAweDdlLCAweDYyLCAweDE4LAorICAweGUyLCAweDNiLCAweDcwLCAweDMzLCAweDA4LCAweGQ5LCAweDBkLCAweDUwLCAweGFiLCAweGIzLCAweDMzLCAweGNhLAorICAweDI2LCAweGVmLCAweGYzLCAweGM1LCAweDc4LCAweGExLCAweDY5LCAweDgwLCAweDhlLCAweDdhLCAweDkwLCAweGMwLAorICAweDhjLCAweDE4LCAweDZlLCAweDllLCAweDc1LCAweDNhLCAweGM0LCAweDMxLCAweGJiLCAweDBkLCAweDllLCAweGQ4LAorICAweDUyLCAweGNiLCAweGY2LCAweDFmLCAweGM1LCAweDg2LCAweDRiLCAweGNmLCAweDM4LCAweGU0LCAweDE0LCAweGIwLAorICAweDY4LCAweGJlLCAweDBhLCAweDYwLCAweDQ1LCAweGYxLCAweDEwLCAweGIwLCAweGM5LCAweDc3LCAweDNlLCAweDY5LAorICAweDY4LCAweDIwLCAweDM4LCAweGE2LCAweDYzLCAweGIzLCAweDMyLCAweDBkLCAweGM3LCAweDc2LCAweDcyLCAweDQwLAorICAweDI3LCAweDIyLCAweDY3LCAweDMxLCAweGE0LCAweDExLCAweGE5LCAweDdhLCAweDJiLCAweDQ2LCAweGU2LCAweGViLAorICAweDJiLCAweDRhLCAweDM2LCAweDk4LCAweGQyLCAweGQyLCAweGQ4LCAweDBkLCAweDk1LCAweDU0LCAweDM2LCAweDNjLAorICAweDJmLCAweGVhLCAweDk3LCAweGIyLCAweDgzLCAweGI4LCAweGQ1LCAweGU4LCAweGM0LCAweDI0LCAweDM5LCAweDdiLAorICAweDFlLCAweDg4LCAweDkzLCAweGIyLCAweDA2LCAweDQ1LCAweGNmLCAweDdlLCAweGU1LCAweDk5LCAweDUyLCAweDI2LAorICAweDM3LCAweDZiLCAweDE5LCAweGVhLCAweGZhLCAweDc5LCAweDdiLCAweDJiLCAweGE3LCAweGQ5LCAweDAwLCAweDBmLAorICAweDdmLCAweDQwLCAweDBhLCAweDEwLCAweDU2LCAweGEzLCAweDgxLCAweDM4LCAweDc2LCAweDAwLCAweDAyLCAweDU1LAorICAweDQ0LCAweDAwLCAweDAwLCAweDkwLCAweDIyLCAweDIwLCAweGM0LCAweGQwLCAweDZhLCAweDUwLCAweDNkLCAweGEyLAorICAweDcwLCAweGZhLCAweDM4LCAweDhkLCAweDc3LCAweDk5LCAweDk4LCAweDAwLCAweDU1LCAweGY5LCAweGY4LCAweGU3LAorICAweDQyLCAweDkwLCAweDJiLCAweDhkLCAweGNhLCAweDZiLCAweGRkLCAweDNhLCAweGNhLCAweGJlLCAweDYyLCAweGQ0LAorICAweDI0LCAweDRlLCAweDhmLCAweGM1LCAweGZiLCAweDUyLCAweGQwLCAweGRiLCAweDc5LCAweGVlLCAweDY5LCAweGE2LAorICAweGVlLCAweGRkLCAweDhiLCAweDU0LCAweGVmLCAweGM1LCAweGY4LCAweGVmLCAweDQ1LCAweDEzLCAweDNkLCAweDZiLAorICAweGE2LCAweGVlLCAweDNiLCAweDBiLCAweDExLCAweDk4LCAweGFiLCAweDk0LCAweDRjLCAweDc3LCAweGFiLCAweGEyLAorICAweGFmLCAweDM3LCAweDZlLCAweGRhLCAweDkzLCAweGVkLCAweDgxLCAweGM3LCAweGNiLCAweGFhLCAweDc1LCAweGFiLAorICAweDhhLCAweDI0LCAweDg0LCAweGM2LCAweDNhLCAweGQ2LCAweGI3LCAweDM5LCAweGU4LCAweDI1LCAweGUzLCAweGIyLAorICAweGM1LCAweDllLCAweDVkLCAweDE2LCAweDY0LCAweDY2LCAweDM0LCAweGRkLCAweDU0LCAweGQzLCAweDVjLCAweDQzLAorICAweDJhLCAweGY3LCAweDFiLCAweDkzLCAweGY3LCAweGRjLCAweDhkLCAweDFlLCAweGE3LCAweDhiLCAweDAwLCAweDFjLAorICAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDdmLCAweGZmLCAweDE1LCAweDZmLCAweGEyLCAweDQxLAorICAweDUwLCAweDgyLCAweDk2LCAweDIyLCAweDg0LCAweDFkLCAweDA0LCAweDcwLCAweDJjLCAweGJiLCAweGFhLCAweGJhLAorICAweGEwLCAweDE0LCAweDVhLCAweDZlLCAweGMzLCAweDc4LCAweGM5LCAweGUyLCAweGYwLCAweGZiLCAweDM2LCAweDMxLAorICAweDE3LCAweDgyLCAweGRlLCAweDMxLCAweDM5LCAweDAxLCAweGUxLCAweDYwLCAweGQ0LCAweDgwLCAweGY0LCAweDM5LAorICAweGY4LCAweDM0LCAweDMyLCAweGJiLCAweDBlLCAweGNlLCAweDQ1LCAweGQ0LCAweDJlLCAweDc2LCAweGYxLCAweDQ2LAorICAweGFhLCAweDkwLCAweDU4LCAweDc3LCAweDMyLCAweGY0LCAweDU2LCAweDZhLCAweGM5LCAweDcxLCAweDhmLCAweGExLAorICAweDQzLCAweGZjLCAweDJjLCAweGYzLCAweDkxLCAweDkyLCAweGU1LCAweDFhLCAweDMyLCAweDExLCAweDVmLCAweGIxLAorICAweGRhLCAweDQwLCAweGExLCAweDA4LCAweDkzLCAweDJmLCAweGVmLCAweGRjLCAweDYzLCAweDI2LCAweDQ2LCAweDkzLAorICAweDVmLCAweGI4LCAweDVkLCAweGJjLCAweDUwLCAweGNjLCAweDdlLCAweDE5LCAweGY1LCAweDc3LCAweDIzLCAweDRjLAorICAweDk4LCAweGMyLCAweDJmLCAweDFhLCAweGYzLCAweGM0LCAweDI2LCAweDFlLCAweDBjLCAweDZiLCAweDc0LCAweDgzLAorICAweDE3LCAweDQ5LCAweDI1LCAweDExLCAweDNjLCAweDE3LCAweDhkLCAweDZjLCAweDhkLCAweGU3LCAweDZlLCAweDIwLAorICAweDMzLCAweGQ0LCAweDIyLCAweDNkLCAweDI0LCAweGI4LCAweGVmLCAweDQyLCAweDU3LCAweGY1LCAweDlmLCAweDA3LAorICAweDhiLCAweDljLCAweDM1LCAweDQzLCAweGRlLCAweDlhLCAweDg1LCAweDQ4LCAweDk3LCAweDg0LCAweDYxLCAweDI2LAorICAweDRlLCAweGQ1LCAweGNlLCAweGJkLCAweGE0LCAweGE3LCAweDg1LCAweDA2LCAweDk0LCAweDNjLCAweGM5LCAweGEzLAorICAweDYyLCAweDNlLCAweDRhLCAweGZhLCAweGYyLCAweDc2LCAweDVlLCAweDc3LCAweDMyLCAweGZhLCAweGFiLCAweDA1LAorICAweGU2LCAweGUxLCAweDc5LCAweGZlLCAweDM0LCAweDg4LCAweDYwLCAweDY0LCAweDEzLCAweGRhLCAweDc1LCAweDA4LAorICAweDQ5LCAweDZmLCAweDE2LCAweDQ5LCAweDRhLCAweDU5LCAweDYzLCAweGQ5LCAweGQ4LCAweGQxLCAweDRlLCAweDE5LAorICAweDhjLCAweGQ2LCAweDY4LCAweDAzLCAweDBiLCAweGE5LCAweDVhLCAweDkzLCAweGMzLCAweDY4LCAweGI1LCAweDI0LAorICAweDE3LCAweGJhLCAweDgyLCAweDRhLCAweDRlLCAweDIwLCAweGE4LCAweGY0LCAweDAwLCAweGQ4LCAweDY4LCAweDE0LAorICAweGFjLCAweDUzLCAweDg0LCAweDVhLCAweDkxLCAweDUzLCAweDQ0LCAweGIxLCAweDNlLCAweDdhLCAweGJhLCAweGFiLAorICAweGE3LCAweGRmLCAweGYxLCAweDAwLCAweDNlLCAweDdmLCAweDA1LCAweDI4LCAweDI2LCAweDEyLCAweDg3LCAweDYwLAorICAweDAwLCAweDAyLCAweDUyLCAweDI5LCAweDJjLCAweDE4LCAweDQ0LCAweDUwLCAweGM1LCAweDgwLCAweGI1LCAweDM4LAorICAweDUzLCAweDk3LCAweDNhLCAweDVhLCAweDM3LCAweDlhLCAweGI2LCAweGM5LCAweDQ3LCAweDQ4LCAweGFiLCAweGZkLAorICAweDI5LCAweDllLCAweGI2LCAweDQ1LCAweGE5LCAweDBiLCAweDU4LCAweDJhLCAweDliLCAweGYwLCAweDYwLCAweDAwLAorICAweDk5LCAweDZmLCAweGQ5LCAweGNmLCAweDdhLCAweGIwLCAweDdjLCAweGNhLCAweDVlLCAweDQ5LCAweDRmLCAweGE0LAorICAweGQwLCAweDlhLCAweDUyLCAweDhlLCAweGFlLCAweDQ3LCAweGU5LCAweGQyLCAweDQ5LCAweGZjLCAweDU4LCAweGQwLAorICAweDE0LCAweGVkLCAweDc4LCAweDFhLCAweDc3LCAweDYzLCAweDJmLCAweDJkLCAweGI0LCAweDRmLCAweDc2LCAweGJiLAorICAweGFjLCAweGViLCAweGIzLCAweDA5LCAweGFjLCAweDlmLCAweDA1LCAweGEyLCAweGRiLCAweDZlLCAweGY1LCAweGYzLAorICAweGVjLCAweGY4LCAweDZmLCAweDY4LCAweDAwLCAweGUwLCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAwLAorICAweGZmLCAweGZmLCAweDExLCAweDZmLCAweGE0LCAweGEwLCAweGM5LCAweDRjLCAweDQzLCAweDA4LCAweDA1LCAweGI0LAorICAweDk3LCAweDZkLCAweGY1LCAweDUxLCAweDY5LCAweDgwLCAweDRhLCAweDA4LCAweGE5LCAweGIxLCAweDVhLCAweDM0LAorICAweDgxLCAweDAwLCAweDRjLCAweGIxLCAweDY1LCAweDM5LCAweGU0LCAweDQ4LCAweDFhLCAweDBjLCAweDMzLCAweDM0LAorICAweDRmLCAweGIxLCAweDdkLCAweDgxLCAweGQzLCAweDY3LCAweGEzLCAweGIwLCAweDdhLCAweDRmLCAweDU3LCAweGNhLAorICAweDgzLCAweGRkLCAweDdjLCAweDk3LCAweDQ2LCAweDEzLCAweDIwLCAweDI1LCAweDExLCAweGJlLCAweGIyLCAweGI4LAorICAweGI2LCAweDc3LCAweGU1LCAweGM0LCAweGJjLCAweGFmLCAweDJkLCAweGUxLCAweDk4LCAweDlhLCAweGVmLCAweGVmLAorICAweGQ3LCAweGE1LCAweDk3LCAweGE1LCAweDRmLCAweDA2LCAweGFjLCAweDUwLCAweGE5LCAweGY4LCAweDBiLCAweDA3LAorICAweGI2LCAweDU1LCAweDIwLCAweGY0LCAweDkxLCAweGFlLCAweDI5LCAweGY1LCAweGQ4LCAweGViLCAweDRkLCAweDFlLAorICAweDkwLCAweDkzLCAweDQ5LCAweGUzLCAweDA2LCAweGVlLCAweDk1LCAweDNiLCAweDRlLCAweGJhLCAweGYyLCAweDgxLAorICAweDBmLCAweDhiLCAweDE0LCAweDA2LCAweDc4LCAweDY3LCAweGE0LCAweDcwLCAweDY5LCAweDYyLCAweGNjLCAweDU0LAorICAweGE1LCAweGYxLCAweGIzLCAweGFiLCAweDk5LCAweDZhLCAweGNkLCAweDAzLCAweDkxLCAweGJhLCAweDUyLCAweGY2LAorICAweGFkLCAweGZjLCAweDc2LCAweDY2LCAweDFlLCAweGMzLCAweGZlLCAweGFmLCAweGEyLCAweGVlLCAweDZhLCAweDIzLAorICAweDQ4LCAweDcwLCAweDNmLCAweDQ1LCAweDM3LCAweDY1LCAweGUzLCAweDQzLCAweDEwLCAweDBkLCAweDE5LCAweDg2LAorICAweDU4LCAweGM5LCAweDM3LCAweDE4LCAweDBhLCAweGNkLCAweGE1LCAweDI1LCAweDhhLCAweGQ2LCAweDA2LCAweGYzLAorICAweDJjLCAweDFjLCAweGMwLCAweDgxLCAweGRkLCAweDkzLCAweDg3LCAweDU0LCAweDE3LCAweGZkLCAweGM5LCAweDM3LAorICAweDA1LCAweDI0LCAweDE4LCAweDI4LCAweDk2LCAweGNjLCAweGU3LCAweDNjLCAweDA3LCAweDk0LCAweGM2LCAweGI4LAorICAweGMyLCAweDVhLCAweGVlLCAweDc3LCAweGU2LCAweDUyLCAweGExLCAweDIxLCAweGVkLCAweDI3LCAweGY5LCAweDNlLAorICAweDY3LCAweDU2LCAweGEzLCAweDJhLCAweDJiLCAweDk0LCAweDQ1LCAweDM5LCAweDBiLCAweDliLCAweDM4LCAweGQ3LAorICAweDQwLCAweGQ3LCAweDVlLCAweDBkLCAweDUyLCAweGQxLCAweDFjLCAweDU2LCAweDQ1LCAweDJhLCAweDgyLCAweGM5LAorICAweDI2LCAweDI4LCAweDY2LCAweGIxLCAweDhhLCAweDZkLCAweDlkLCAweDE0LCAweDY3LCAweGIyLCAweDgwLCAweDIxLAorICAweDc5LCAweDgzLCAweDgyLCAweGVlLCAweGRlLCAweGRmLCAweGZmLCAweDdiLCAweGZmLCAweGI5LCAweGYyLCAweDIwLAorICAweGY5LCAweGZiLCAweDE1LCAweDIwLCAweDU4LCAweDY2LCAweDFkLCAweDgwLCAweDk0LCAweDAwLCAweDE1LCAweDc1LAorICAweDJhLCAweDAwLCAweDEyLCAweDU2LCAweDAyLCAweDc1LCAweGExLCAweDM2LCAweDg3LCAweDMyLCAweDMxLCAweDQ4LAorICAweDlhLCAweGMzLCAweDMyLCAweGYyLCAweDBiLCAweGMwLCAweGE1LCAweDlkLCAweDc4LCAweDYyLCAweGFlLCAweDhjLAorICAweGQ3LCAweDRhLCAweGViLCAweDE2LCAweDZlLCAweGZkLCAweDY1LCAweDBlLCAweDU2LCAweGJjLCAweDY1LCAweDM4LAorICAweGY1LCAweDZiLCAweGYxLCAweGI3LCAweGQ3LCAweDBhLCAweDU0LCAweDNhLCAweGYzLCAweGFhLCAweDQ0LCAweDRmLAorICAweDE5LCAweDA1LCAweGVjLCAweGUwLCAweGRkLCAweGQ5LCAweGNmLCAweDU4LCAweDYyLCAweDFiLCAweDBhLCAweGQ4LAorICAweGJhLCAweGJjLCAweDc4LCAweGYwLCAweGUxLCAweDYyLCAweGU3LCAweDJjLCAweGJhLCAweDNhLCAweGE4LCAweGE3LAorICAweDMwLCAweDA5LCAweDRiLCAweGMxLCAweDI2LCAweDUwLCAweDkyLCAweGNhLCAweDQ3LCAweDFhLCAweDY3LCAweGZmLAorICAweGFjLCAweGZmLCAweDdiLCAweGQxLCAweGI2LCAweDAzLCAweDA3LCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLAorICAweDA3LCAweGZmLCAweGZmLCAweDE3LCAweDczLCAweDgyLCAweGEwLCAweDQ5LCAweDZjLCAweDU0LCAweDA4LCAweDBkLAorICAweDJlLCAweDViLCAweGE1LCAweDM4LCAweDJkLCAweDRhLCAweDA1LCAweDAyLCAweGM1LCAweDUwLCAweDkxLCAweDJlLAorICAweGU4LCAweDdkLCAweDYzLCAweDk1LCAweDFhLCAweDQxLCAweDQ4LCAweGYxLCAweGViLCAweGUyLCAweDY1LCAweDRkLAorICAweDg4LCAweDJlLCAweGQ0LCAweGQ5LCAweDM5LCAweDA4LCAweDJlLCAweDRlLCAweGQ5LCAweGM4LCAweGZmLCAweDQ3LAorICAweGUxLCAweGQ5LCAweDg2LCAweGNjLCAweDI1LCAweDM5LCAweDU1LCAweGQyLCAweDNiLCAweDgyLCAweDhkLCAweDQzLAorICAweGU5LCAweGU5LCAweGE0LCAweGUxLCAweDZhLCAweDQ4LCAweGU2LCAweDljLCAweDU4LCAweGQ1LCAweGRjLCAweDUxLAorICAweGJkLCAweGZjLCAweDMzLCAweDJkLCAweDRiLCAweGFlLCAweGY2LCAweDJmLCAweGI0LCAweGViLCAweGJkLCAweDcxLAorICAweGIwLCAweDcwLCAweGE5LCAweDBhLCAweGE4LCAweGNmLCAweGI5LCAweGVkLCAweGZjLCAweGU4LCAweDhkLCAweGQ1LAorICAweDk2LCAweGUyLCAweGI3LCAweDM2LCAweDliLCAweGNkLCAweGQ5LCAweGVhLCAweDE0LCAweGExLCAweDViLCAweDAwLAorICAweDViLCAweDY0LCAweDZkLCAweDcyLCAweDBhLCAweGQzLCAweDQ4LCAweGM0LCAweGI3LCAweGJiLCAweGNjLCAweGJhLAorICAweGFjLCAweGRhLCAweDE3LCAweDg5LCAweDRiLCAweDk1LCAweDU3LCAweDA1LCAweDYzLCAweDdlLCAweDNjLCAweGFhLAorICAweDc1LCAweGI4LCAweDEyLCAweDQ0LCAweGJhLCAweGM2LCAweGQ5LCAweDM2LCAweGI5LCAweGZiLCAweDE0LCAweDc4LAorICAweDRlLCAweDg1LCAweDJiLCAweDczLCAweGZjLCAweGY2LCAweDI1LCAweGRlLCAweDUyLCAweDdiLCAweDc1LCAweDUxLAorICAweGI1LCAweDNmLCAweGViLCAweGQ0LCAweDBlLCAweDg4LCAweDIyLCAweDQyLCAweDAxLCAweGU5LCAweGQwLCAweDU2LAorICAweGE5LCAweDA5LCAweDMxLCAweDg0LCAweDlkLCAweDY3LCAweGJkLCAweDg3LCAweDA4LCAweDMyLCAweDUwLCAweGI5LAorICAweGIxLCAweDM4LCAweDEwLCAweDEwLCAweGViLCAweDc1LCAweDQwLCAweDQ0LCAweDNkLCAweDI5LCAweGZkLCAweGI0LAorICAweDZiLCAweGQ1LCAweDdhLCAweDU1LCAweDJjLCAweGU2LCAweDdkLCAweDEwLCAweDlkLCAweDBjLCAweDRjLCAweGQwLAorICAweDZiLCAweDMyLCAweDg2LCAweDQwLCAweDA1LCAweGFhLCAweGQzLCAweDEwLCAweDk5LCAweDgyLCAweDE4LCAweDFiLAorICAweGE5LCAweGRmLCAweDJiLCAweDJhLCAweDA0LCAweDg5LCAweDQ1LCAweGU2LCAweDIzLCAweDQyLCAweDkyLCAweGFlLAorICAweGE0LCAweGE2LCAweDUzLCAweGI4LCAweGU1LCAweDk4LCAweDhjLCAweGI5LCAweGRkLCAweDlhLCAweDYwLCAweDQ1LAorICAweDZkLCAweDA4LCAweDUyLCAweDY1LCAweDIzLCAweDE5LCAweDk2LCAweGViLCAweGIwLCAweGZmLCAweGU4LCAweDlmLAorICAweGZlLCAweDUxLCAweGE3LCAweDc3LCAweDc3LCAweGNmLCAweGMwLCAweDA4LCAweDU2LCAweDgxLCAweDYxLCAweDk4LAorICAweDc2LCAweDAwLCAweDAwLCAweDhhLCAweDI1LCAweDgwLCAweGMyLCAweDQ0LCAweGMxLCAweGY5LCAweDc3LCAweGI2LAorICAweGE2LCAweGY1LCAweGQxLCAweDg2LCAweGUxLCAweDU2LCAweDgwLCAweGQwLCAweGEyLCAweGE4LCAweDI3LCAweGY0LAorICAweGFjLCAweDVjLCAweDQyLCAweDMyLCAweDhjLCAweGNhLCAweDdhLCAweDMzLCAweGVjLCAweGYzLCAweDZjLCAweGQwLAorICAweDJkLCAweDM5LCAweGNhLCAweDY2LCAweDg0LCAweDQzLCAweDFkLCAweDNmLCAweDAzLCAweDJkLCAweGM1LCAweGEyLAorICAweDNlLCAweDM2LCAweDJmLCAweGU4LCAweGMzLCAweDM3LCAweDA0LCAweGUyLCAweDc0LCAweDUzLCAweGFlLCAweDJkLAorICAweDRkLCAweDU5LCAweDRiLCAweDZjLCAweGFkLCAweDA5LCAweGE5LCAweDAyLCAweGZiLCAweDVkLCAweDU2LCAweGUxLAorICAweDZjLCAweDc3LCAweGU0LCAweGZkLCAweDlkLCAweDJjLCAweGEzLCAweGEyLCAweDAyLCAweGUxLCAweGViLCAweDgwLAorICAweDZlLCAweDUzLCAweDUzLCAweGYzLCAweGZiLCAweGE3LCAweGZmLCAweGZhLCAweGZjLCAweDlmLCAweGZiLCAweDEwLAorICAweGUwLCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDA3LCAweGZmLCAweGZmLCAweDE1LCAweDczLCAweDgyLAorICAweGFhLCAweDA4LCAweGFjLCAweDQzLCAweDA4LCAweDBiLCAweGIzLCAweDRiLCAweDg5LCAweGM1LCAweDQ4LCAweGFiLAorICAweGFjLCAweDAwLCAweDg0LCAweDRjLCAweGQ4LCAweDI2LCAweDM4LCAweDE3LCAweDRjLCAweDBiLCAweGE0LCAweDE2LAorICAweGU0LCAweDlhLCAweDIwLCAweDlmLCAweDY3LCAweGMxLCAweGNmLCAweDUxLCAweDhiLCAweGIyLCAweGFlLCAweDgyLAorICAweDdhLCAweDk2LCAweDQ2LCAweGM0LCAweDc4LCAweDdlLCAweDFmLCAweDI4LCAweDg3LCAweDhjLCAweGI3LCAweGI0LAorICAweGFlLCAweDNmLCAweGM0LCAweDJkLCAweDc0LCAweGUyLCAweGI2LCAweGM3LCAweGVjLCAweDdlLCAweDQ4LCAweDk4LAorICAweDc4LCAweGFmLCAweDQ2LCAweDM4LCAweGQzLCAweGExLCAweGFmLCAweDVkLCAweDc5LCAweDhlLCAweDNiLCAweDkxLAorICAweDI4LCAweDQ1LCAweDM3LCAweDc2LCAweDNlLCAweDhiLCAweGEzLCAweDI5LCAweGM0LCAweGFkLCAweGE3LCAweDZkLAorICAweGU0LCAweDg5LCAweGIxLCAweDEwLCAweDY4LCAweDliLCAweGRkLCAweGIzLCAweGNjLCAweDY5LCAweGZkLCAweDBkLAorICAweDRlLCAweGI2LCAweGQ5LCAweDBmLCAweGVmLCAweDU5LCAweDJjLCAweDM0LCAweGI3LCAweGE4LCAweGIyLCAweGNlLAorICAweDZkLCAweGNkLCAweDBkLCAweDk0LCAweDU4LCAweGY4LCAweGI3LCAweDk1LCAweGNiLCAweGJhLCAweDU0LCAweDU1LAorICAweDI1LCAweDlmLCAweDUxLCAweDIwLCAweGNkLCAweGQ0LCAweDcwLCAweDhiLCAweGM1LCAweGZkLCAweDY0LCAweGM0LAorICAweDRlLCAweGQ3LCAweGEzLCAweGI1LCAweGQ5LCAweGQ3LCAweGMyLCAweDY1LCAweDI5LCAweGUxLCAweDU5LCAweDFhLAorICAweGQ5LCAweDY5LCAweGIyLCAweDJlLCAweDU4LCAweDRiLCAweDE3LCAweDRjLCAweDM3LCAweDRiLCAweDQ2LCAweGQ2LAorICAweGFkLCAweGFlLCAweDgyLCAweGM5LCAweDQwLCAweDUyLCAweDk3LCAweDQ4LCAweDY0LCAweDk1LCAweDk1LCAweDUwLAorICAweDBkLCAweDQyLCAweDE4LCAweDZlLCAweGIxLCAweDc4LCAweDczLCAweDI0LCAweGNlLCAweGIwLCAweDEwLCAweDBjLAorICAweDE0LCAweGMwLCAweDVjLCAweGFhLCAweDNkLCAweGI4LCAweGFlLCAweDU0LCAweDE5LCAweDUzLCAweDY3LCAweGVkLAorICAweDFjLCAweDI5LCAweDE3LCAweDhjLCAweDZkLCAweDBjLCAweDhhLCAweDJkLCAweDEyLCAweDE0LCAweDNjLCAweGIyLAorICAweGIxLCAweDMzLCAweDk1LCAweDRhLCAweDA4LCAweGI2LCAweGQ2LCAweGNlLCAweGUyLCAweDExLCAweDdmLCAweDBiLAorICAweDE2LCAweDg2LCAweGM3LCAweDViLCAweGVhLCAweGFmLCAweDA1LCAweGZkLCAweGU1LCAweDQ5LCAweDNlLCAweDEzLAorICAweDRiLCAweGRlLCAweGE5LCAweDk1LCAweDBhLCAweDczLCAweGQyLCAweDI3LCAweDEyLCAweDQ3LCAweDM3LCAweGMwLAorICAweGUyLCAweDVmLCAweGViLCAweDM2LCAweDNlLCAweDA1LCAweGMxLCAweGY3LCAweGYwLCAweDJiLCAweDIxLCAweGIwLAorICAweGNjLCAweDNiLCAweDAwLCAweDAwLCAweDJhLCAweDBiLCAweDAwLCAweDAyLCAweGI1LCAweGM4LCAweGUxLCAweDM5LAorICAweDMwLCAweGZiLCAweDkxLCAweDg1LCAweDhiLCAweGEzLCAweGJlLCAweDhlLCAweGY2LCAweDIwLCAweDc3LCAweGE2LAorICAweDc2LCAweGYyLCAweDYyLCAweDQyLCAweDJkLCAweDc2LCAweDlkLCAweDgwLCAweDVlLCAweGIwLCAweDZmLCAweGQ4LAorICAweGJkLCAweDJiLCAweGM4LCAweDBlLCAweDk2LCAweGJkLCAweDA0LCAweDY5LCAweGYyLCAweGQ0LCAweDkwLCAweDgyLAorICAweDE3LCAweDhiLCAweGVkLCAweDM5LCAweDA1LCAweGZiLCAweDZkLCAweGQyLCAweDgxLCAweGQzLCAweGI3LCAweGUxLAorICAweGI1LCAweDI5LCAweDgwLCAweGMyLCAweGQ5LCAweDI4LCAweDJiLCAweDUxLCAweDQwLCAweGFjLCAweDI0LCAweDUzLAorICAweDc5LCAweGEwLCAweDg5LCAweDIyLCAweGE3LCAweDM0LCAweDUyLCAweGYwLCAweGQ1LCAweGY3LCAweGNhLCAweDI2LAorICAweGQ2LCAweGZjLCAweDY2LCAweGNiLCAweGYxLCAweGZhLCAweGMyLCAweGVjLCAweDc2LCAweGZlLCAweGU3LCAweGZhLAorICAweDIwLCAweGUwLCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAxLCAweGZmLCAweGZmLCAweDE5LCAweDZmLAorICAweGExLCAweGMxLCAweGQwLCAweDQ0LCAweDQ1LCAweDA5LCAweDE1LCAweDg4LCAweDYxLCAweDA0LCAweDk2LCAweDcwLAorICAweDk1LCAweDczLCAweDUzLCAweDM4LCAweGFiLCAweDE0LCAweDAwLCAweDEwLCAweGMxLCAweDgyLCAweDkyLCAweDVjLAorICAweDc3LCAweDMxLCAweDczLCAweDA2LCAweDRlLCAweDExLCAweDE3LCAweGIyLCAweGNmLCAweDM3LCAweGU3LCAweDMwLAorICAweDMwLCAweDdlLCAweDAyLCAweGY1LCAweGUyLCAweDM3LCAweGJlLCAweDMzLCAweGVkLCAweDNmLCAweDFhLCAweGI1LAorICAweGIyLCAweDZhLCAweDQwLCAweDc5LCAweDg0LCAweGJhLCAweDRiLCAweDZlLCAweGYzLCAweGRhLCAweGY2LCAweDBiLAorICAweDVlLCAweGFmLCAweGNjLCAweDM4LCAweGUxLCAweGI4LCAweGVlLCAweGFiLCAweGUwLCAweDBmLCAweGU1LCAweDJhLAorICAweDRiLCAweDQ1LCAweDRiLCAweDIzLCAweDUzLCAweDgwLCAweGNlLCAweDk5LCAweGFiLCAweGJlLCAweDI2LCAweGVhLAorICAweDM5LCAweDhiLCAweDM3LCAweGJjLCAweDZhLCAweDRlLCAweDFiLCAweDIzLCAweDAwLCAweGNmLCAweDc2LCAweDVmLAorICAweDE0LCAweDY2LCAweGViLCAweGY4LCAweDJmLCAweGVjLCAweGM4LCAweDlkLCAweDIzLCAweDBjLCAweDdhLCAweGYyLAorICAweGQ3LCAweDZmLCAweDQyLCAweDdmLCAweDhlLCAweDdjLCAweGRiLCAweDE4LCAweDllLCAweDM2LCAweGIyLCAweDM4LAorICAweGFlLCAweDY3LCAweDAwLCAweDc0LCAweDBiLCAweDY0LCAweDhjLCAweGQwLCAweDYzLCAweGQxLCAweDJlLCAweDc1LAorICAweGI5LCAweDQ1LCAweDAxLCAweGY4LCAweGUwLCAweDMzLCAweGNiLCAweDJlLCAweDkzLCAweDYzLCAweGExLCAweDE0LAorICAweDg5LCAweDE5LCAweDNlLCAweGFmLCAweDM2LCAweGMzLCAweGY5LCAweDAyLCAweGYzLCAweGUwLCAweDk1LCAweDc3LAorICAweGFiLCAweDk5LCAweGE2LCAweGM3LCAweDU0LCAweGUwLCAweDU4LCAweGI4LCAweGEwLCAweDgzLCAweDIyLCAweGQwLAorICAweGE1LCAweDgyLCAweDViLCAweDI4LCAweDQ0LCAweGFmLCAweGEyLCAweGM5LCAweGZmLCAweDU2LCAweDczLCAweGE5LAorICAweDE0LCAweGNjLCAweDNkLCAweDQ1LCAweDgwLCAweGUzLCAweGE0LCAweDZkLCAweDM2LCAweDI2LCAweDE3LCAweGE4LAorICAweDA1LCAweDUyLCAweGEzLCAweGY0LCAweGE2LCAweDc0LCAweGRjLCAweGE1LCAweDFjLCAweDc0LCAweDgzLCAweDIwLAorICAweDIxLCAweDMzLCAweDhhLCAweDFlLCAweDIwLCAweDE2LCAweDE5LCAweDg5LCAweDI2LCAweDA1LCAweGNhLCAweGViLAorICAweDZjLCAweDZkLCAweDUyLCAweGY1LCAweDFiLCAweDVkLCAweGNmLCAweGFhLCAweDQ4LCAweDk2LCAweDhiLCAweDEyLAorICAweDZhLCAweDgwLCAweGFlLCAweGVlLCAweGIyLCAweDk3LCAweDUzLCAweDY0LCAweDEwLCAweGMyLCAweDFhLCAweGM5LAorICAweDlhLCAweGFjLCAweGZlLCAweDE3LCAweGUwLCAweDNhLCAweDllLCAweGUwLCAweDNmLCAweDdlLCAweDg1LCAweDY4LAorICAweDQzLCAweDBlLCAweGMwLCAweDAyLCAweDUxLCAweDJhLCAweGEwLCAweDkzLCAweDQwLCAweDI4LCAweDMyLCAweDA2LAorICAweGQ2LCAweDg1LCAweGE5LCAweDQxLCAweDQxLCAweDIxLCAweDFiLCAweDU3LCAweDdhLCAweGYyLCAweDkwLCAweGEzLAorICAweDNhLCAweDhkLCAweDUxLCAweGFiLCAweDUyLCAweGIwLCAweDc4LCAweDI5LCAweGQ4LCAweDRlLCAweDg3LCAweDVjLAorICAweDk4LCAweDY5LCAweDU1LCAweDk2LCAweGNkLCAweDU4LCAweDk2LCAweDMzLCAweDI5LCAweGZiLCAweDM3LCAweGQzLAorICAweDkxLCAweDhkLCAweGUyLCAweGE2LCAweGY3LCAweDFlLCAweDI4LCAweGI4LCAweGE3LCAweDFhLCAweGI3LCAweDNkLAorICAweDIzLCAweGY3LCAweGVmLCAweDhhLCAweDgyLCAweGM3LCAweDE2LCAweGM3LCAweGM0LCAweDExLCAweGQ0LCAweDA2LAorICAweDUzLCAweGRhLCAweDkzLCAweDJmLCAweDliLCAweGY2LCAweDRhLCAweDRlLCAweDJjLCAweDJmLCAweDRiLCAweGUzLAorICAweDNmLCAweDNmLCAweDUwLCAweGUwLCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDNmLCAweGZmLCAweGZmLAorICAweDFkLCAweDczLCAweDgyLCAweGEwLCAweGM5LCAweDI4LCAweDI2LCAweDFhLCAweDg0LCAweDJlLCAweGQzLCAweGFiLAorICAweDIxLCAweDFjLCAweDI1LCAweGQ0LCAweDliLCAweDAwLCAweDA1LCAweGFiLCAweDA3LCAweGRjLCAweGM5LCAweDQyLAorICAweDJkLCAweDQwLCAweDFhLCAweDA0LCAweDkyLCAweGZhLCAweDM5LCAweDdlLCAweDU1LCAweDEzLCAweDhiLCAweDQzLAorICAweDU4LCAweDgzLCAweGUxLCAweGQ4LCAweDIwLCAweGVjLCAweDBmLCAweGQ0LCAweGM5LCAweDVkLCAweDJiLCAweGQyLAorICAweDNmLCAweDk0LCAweDI3LCAweDM4LCAweGQ5LCAweGQ1LCAweDEyLCAweDBlLCAweGI3LCAweGVkLCAweDViLCAweDI1LAorICAweGY1LCAweGFiLCAweGEyLCAweDViLCAweGEzLCAweGJkLCAweGEzLCAweDFjLCAweGU1LCAweDkxLCAweGRiLCAweGY4LAorICAweDViLCAweGI2LCAweDhjLCAweDliLCAweGE2LCAweDUyLCAweDM5LCAweGEzLCAweDk2LCAweDI4LCAweDY0LCAweGM1LAorICAweDY1LCAweDY4LCAweDBkLCAweDVhLCAweDMyLCAweDMwLCAweGM5LCAweDM0LCAweGMwLCAweDhlLCAweDg1LCAweGFiLAorICAweGVlLCAweGU3LCAweGYwLCAweGM4LCAweDkxLCAweGM3LCAweDAzLCAweDc5LCAweGJkLCAweGZiLCAweDNiLCAweDcyLAorICAweGI4LCAweGQwLCAweGQyLCAweDRmLCAweGRlLCAweGU5LCAweDVkLCAweGM5LCAweGFhLCAweDdkLCAweGI5LCAweDgzLAorICAweDVlLCAweGEyLCAweDUxLCAweDE1LCAweDZkLCAweGVhLCAweDZiLCAweGIyLCAweDNiLCAweGJlLCAweGM2LCAweGJmLAorICAweDZiLCAweDU0LCAweGQ2LCAweGQzLCAweDIyLCAweDQ4LCAweDExLCAweGQ2LCAweDNiLCAweGQ2LCAweDFhLCAweGViLAorICAweGJjLCAweGMzLCAweDliLCAweDA3LCAweDA1LCAweGQzLCAweGNjLCAweDc4LCAweDY2LCAweDMwLCAweDVlLCAweDZiLAorICAweGMwLCAweDE4LCAweDE4LCAweGNkLCAweGRlLCAweDI2LCAweDFiLCAweDU2LCAweDE3LCAweGVlLCAweDBmLCAweDE5LAorICAweDFjLCAweGU3LCAweGE1LCAweGNiLCAweDE4LCAweDQ3LCAweDYxLCAweGIwLCAweDY1LCAweGJhLCAweDRlLCAweDRlLAorICAweDIxLCAweDVmLCAweDdlLCAweGYyLCAweDZlLCAweGFmLCAweDMwLCAweDEzLCAweDJmLCAweDkwLCAweGVlLCAweGIxLAorICAweDk5LCAweGNkLCAweDZhLCAweDBmLCAweGNlLCAweDBkLCAweGQ0LCAweDgwLCAweDEwLCAweDAyLCAweGFiLCAweGM2LAorICAweDU4LCAweDdiLCAweGJhLCAweDMyLCAweDg2LCAweDc5LCAweDJjLCAweDU1LCAweGYzLCAweGZlLCAweDk5LCAweDAzLAorICAweDc5LCAweDdhLCAweDQ4LCAweDU3LCAweDdjLCAweGM3LCAweGEwLCAweDUyLCAweGVkLCAweDJmLCAweDg3LCAweDlhLAorICAweGM2LCAweGYzLCAweDBkLCAweGE1LCAweDJjLCAweGQ5LCAweGM5LCAweDlmLCAweGI5LCAweGZmLCAweDU4LCAweDg3LAorICAweDY2LCAweDIyLCAweDIxLCAweDMyLCAweDQ4LCAweDNhLCAweDNlLCAweDlhLCAweDY5LCAweDk1LCAweGFlLCAweGQ3LAorICAweDVjLCAweGUzLCAweDk3LCAweDRmLCAweDY4LCAweDAxLCAweGVmLCAweGVhLCAweDgzLCAweDE2LCAweGIxLCAweDFjLAorICAweDNiLCAweDAwLCAweDAwLCAweGE4LCAweGEwLCAweDAwLCAweDEwLCAweDhhLCAweDE3LCAweGEzLCAweDYyLCAweGNjLAorICAweDhiLCAweGYyLCAweDZkLCAweDI3LCAweGM5LCAweGM5LCAweDQwLCAweDJmLCAweDJiLCAweDI3LCAweGM4LCAweGJhLAorICAweDMyLCAweDkwLCAweDFiLCAweDk2LCAweDhhLCAweGQ4LCAweDZjLCAweGE1LCAweGNhLCAweDJmLCAweDdhLCAweDQ0LAorICAweDFkLCAweDkzLCAweDlhLCAweDRhLCAweDhkLCAweDBkLCAweDZlLCAweDcxLCAweDkyLCAweGM1LCAweDNjLCAweDFhLAorICAweDg5LCAweGZhLCAweGExLCAweDA4LCAweGRmLCAweDc2LCAweDhkLCAweDU5LCAweGI0LCAweDdkLCAweDgzLCAweDFhLAorICAweDM5LCAweDZkLCAweDlmLCAweGQ3LCAweGJiLCAweGY2LCAweDQxLCAweGE2LCAweDA0LCAweDI2LCAweDcxLCAweDM4LAorICAweDVmLCAweDNkLCAweDQ2LCAweDMzLCAweGI5LCAweDNjLCAweGMyLCAweDViLCAweDIwLCAweGNjLCAweGVjLCAweGZjLAorICAweDUzLCAweDViLCAweDU5LCAweGE4LCAweGE2LCAweGM3LCAweGM5LCAweDI2LCAweDJmLCAweDc2LCAweDBiLCAweDQ1LAorICAweDkyLCAweGM5LCAweGZjLCAweGE2LCAweDQyLCAweDE5LCAweDc0LCAweGE2LCAweDI1LCAweDNlLCAweGUxLCAweGJmLAorICAweDY3LCAweDZmLCAweDZiLCAweGU4LCAweDZiLCAweDViLCAweDRlLCAweDMzLCAweDgwLCAweDBlLCAweDIxLCAweDFhLAorICAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDdmLCAweGZmLCAweDE5LCAweDczLCAweDgyLCAweDMwLCAweGQwLCAweDY2LAorICAweDIyLCAweDMyLCAweDA1LCAweDg2LCAweGExLCAweDA1LCAweDY5LCAweDRiLCAweGY4LCAweDE0LCAweGUxLCAweDY4LAorICAweDI4LCAweDAwLCAweDIyLCAweDA0LCAweGZhLCAweGI5LCAweGZjLCAweGRjLCAweGVmLCAweGY5LCAweGZjLCAweDFkLAorICAweGFkLCAweDY0LCAweGExLCAweDFiLCAweGMwLCAweDM2LCAweDQ1LCAweDFmLCAweDRkLCAweGNiLCAweDYyLCAweGE3LAorICAweDczLCAweGEwLCAweDJjLCAweDFmLCAweDg0LCAweGQ1LCAweDk0LCAweGVmLCAweDc0LCAweDZhLCAweDFjLCAweGU1LAorICAweGNjLCAweGZiLCAweDBjLCAweDU5LCAweGIyLCAweGU4LCAweDA1LCAweDBhLCAweDBhLCAweDg5LCAweDllLCAweDgzLAorICAweGIxLCAweDY1LCAweDMyLCAweDI4LCAweDUzLCAweDFhLCAweDQxLCAweDQ5LCAweGFiLCAweGI4LCAweGFjLCAweDQ1LAorICAweGNkLCAweGJmLCAweDk5LCAweGE2LCAweDJjLCAweGJkLCAweDQ4LCAweGUyLCAweGM2LCAweDI2LCAweDVjLCAweDAzLAorICAweGI0LCAweGE3LCAweDczLCAweGI1LCAweGVlLCAweGNhLCAweDZiLCAweDljLCAweGUxLCAweDZjLCAweDRhLCAweDkzLAorICAweDRhLCAweDgyLCAweDkzLCAweGIyLCAweDY2LCAweGQ4LCAweDY2LCAweDBjLCAweDg2LCAweGRlLCAweDZiLCAweDM3LAorICAweDE3LCAweDRlLCAweDk0LCAweDcxLCAweGE3LCAweDFlLCAweGVmLCAweDUzLCAweDg2LCAweDY1LCAweDRkLCAweDUwLAorICAweDk3LCAweGFhLCAweDZlLCAweDRmLCAweDVkLCAweGJjLCAweDFhLCAweDc3LCAweGI2LCAweGRhLCAweDMxLCAweDRhLAorICAweDFkLCAweGE3LCAweDllLCAweGQwLCAweDIyLCAweDM4LCAweDU4LCAweDY4LCAweDdhLCAweDAxLCAweDE1LCAweDk1LAorICAweDVjLCAweGM1LCAweDlkLCAweGQyLCAweGFlLCAweGRiLCAweGIxLCAweDU0LCAweDllLCAweGNiLCAweDJlLCAweDIzLAorICAweGI1LCAweDk2LCAweGQ1LCAweGQyLCAweDVhLCAweDkxLCAweGVhLCAweGNmLCAweDIzLCAweDQ2LCAweDg1LCAweGViLAorICAweGQxLCAweGJjLCAweDY3LCAweGJmLCAweDE0LCAweDdhLCAweDlmLCAweGFjLCAweGE1LCAweDMxLCAweDgwLCAweDNlLAorICAweDEwLCAweDdjLCAweDc2LCAweDIxLCAweGU5LCAweDU1LCAweDAyLCAweDBkLCAweDIyLCAweGQ0LCAweDgwLCAweGFjLAorICAweDAwLCAweDhiLCAweDFhLCAweDkyLCAweDg0LCAweGUxLCAweGI1LCAweDM5LCAweDhjLCAweGM5LCAweDZmLCAweDAwLAorICAweDdmLCAweDYxLCAweGJlLCAweGI2LCAweDFjLCAweGMyLCAweDBkLCAweGY0LCAweDAyLCAweGFjLCAweGNjLCAweDAwLAorICAweDVjLCAweDE4LCAweDJhLCAweDYwLCAweDQyLCAweDdiLCAweDJjLCAweDExLCAweGM3LCAweGYwLCAweDQ0LCAweDU2LAorICAweDM3LCAweDNlLCAweGE5LCAweGY5LCAweDUxLCAweGMzLCAweDY2LCAweGI5LCAweDgzLCAweGI3LCAweDFlLCAweDlmLAorICAweDlhLCAweDI0LCAweDAwLCAweGZiLCAweGZjLCAweDE0LCAweGEwLCAweDU4LCAweDY2LCAweDFkLCAweDgwLCAweDAwLAorICAweDU0LCAweGE5LCAweDJhLCAweDU0LCAweDk5LCAweDYxLCAweDgyLCAweGMwLCAweDJiLCAweDFhLCAweDdlLCAweGJhLAorICAweGE5LCAweDdiLCAweDQ0LCAweDVkLCAweDE1LCAweDIxLCAweGFlLCAweDRiLCAweDQxLCAweDI1LCAweGI0LCAweDQ4LAorICAweDcwLCAweGU4LCAweDcyLCAweDk5LCAweDdiLCAweDJhLCAweDQxLCAweDcyLCAweDQ5LCAweDNjLCAweDMyLCAweGI4LAorICAweDg3LCAweDgwLCAweDVhLCAweDQ4LCAweGUzLCAweDBjLCAweDc0LCAweGI3LCAweGYyLCAweDA2LCAweGM5LCAweDQ0LAorICAweDNkLCAweDJjLCAweGQ1LCAweDhkLCAweDA2LCAweDM4LCAweGM0LCAweDUzLCAweDQyLCAweGE1LCAweGQ3LCAweGRhLAorICAweDJlLCAweDE2LCAweDQ1LCAweDhhLCAweGYyLCAweGIwLCAweGQyLCAweDk3LCAweDY0LCAweDY2LCAweDE4LCAweGEzLAorICAweGMwLCAweDZhLCAweDA5LCAweGMzLCAweGVmLCAweGRkLCAweDVjLCAweDNjLCAweDgwLCAweGUwLCAweDIxLCAweDFhLAorICAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDE5LCAweDZmLCAweGE0LCAweGExLCAweDA5LCAweDJjLAorICAweDQzLCAweDA5LCAweDFjLCAweGYwLCAweDU0LCAweGVhLCAweDVhLCAweGQyLCAweGRhLCAweDU0LCAweDk0LCAweDI4LAorICAweDEwLCAweDI1LCAweDYwLCAweGRkLCAweDM1LCAweDg0LCAweDlmLCAweGJmLCAweGUyLCAweGQ3LCAweDM1LCAweDU3LAorICAweDJiLCAweDljLCAweDhjLCAweDM1LCAweDVlLCAweDUzLCAweGQ0LCAweGIyLCAweDIyLCAweDIwLCAweDBlLCAweDI5LAorICAweGQ1LCAweDc1LCAweGI4LCAweGZmLCAweDA3LCAweGYwLCAweGFmLCAweDdjLCAweDBkLCAweGIzLCAweGNiLCAweDVlLAorICAweDdkLCAweGMzLCAweGRhLCAweDczLCAweGUzLCAweDkzLCAweGM4LCAweDc5LCAweGJmLCAweGQ4LCAweDY2LCAweDI5LAorICAweDFhLCAweGZmLCAweGE0LCAweGQyLCAweGM3LCAweGQ3LCAweGQ3LCAweGU1LCAweGFjLCAweGQ1LCAweGJkLCAweGU2LAorICAweDdjLCAweGFmLCAweDE1LCAweGY3LCAweDkzLCAweGI3LCAweDI4LCAweDJlLCAweGNmLCAweDAxLCAweDQzLCAweDI2LAorICAweGEzLCAweDhlLCAweGYwLCAweDM4LCAweGFhLCAweGRmLCAweGM0LCAweDI0LCAweDFlLCAweDcyLCAweGZkLCAweDhiLAorICAweDI1LCAweDIwLCAweDgxLCAweDdmLCAweDNhLCAweGMyLCAweGFmLCAweDMyLCAweDMwLCAweGIxLCAweDEzLCAweDkzLAorICAweDQ5LCAweDFiLCAweDdiLCAweDhhLCAweDYxLCAweDBiLCAweDI4LCAweGE0LCAweDQ5LCAweDIyLCAweDFkLCAweGE0LAorICAweDNkLCAweDQ4LCAweGQzLCAweDdhLCAweGQzLCAweDIwLCAweGFmLCAweDg0LCAweDMzLCAweGEwLCAweDM3LCAweDlmLAorICAweDQ0LCAweDRlLCAweGIzLCAweGQ0LCAweDdlLCAweGVkLCAweDYyLCAweDhiLCAweGE5LCAweGQwLCAweDdmLCAweGI3LAorICAweGM4LCAweGFmLCAweGEwLCAweGI2LCAweGM5LCAweDA1LCAweGUwLCAweDY5LCAweDNkLCAweDQwLCAweDBlLCAweDgyLAorICAweDQxLCAweDUwLCAweGMyLCAweDM3LCAweDA3LCAweDMwLCAweGE5LCAweGZmLCAweDQ3LCAweGQ2LCAweDc1LCAweDMzLAorICAweGY3LCAweDY3LCAweDVjLCAweDM3LCAweDE4LCAweDBhLCAweGRlLCAweDg0LCAweDk5LCAweDdkLCAweDI5LCAweDA4LAorICAweDMzLCAweGMwLCAweGNmLCAweDA5LCAweGJmLCAweDNhLCAweDIyLCAweDNiLCAweDVhLCAweGYzLCAweGZhLCAweDAzLAorICAweGRlLCAweGM3LCAweGE0LCAweGQ1LCAweDNmLCAweDM0LCAweGJkLCAweDZhLCAweGZlLCAweGZlLCAweGJiLCAweDM1LAorICAweDEwLCAweDU4LCAweDA0LCAweDI1LCAweDAwLCAweDIyLCAweGNlLCAweDZkLCAweGI1LCAweGMwLCAweDIzLCAweGJlLAorICAweDk0LCAweGRmLCAweGE4LCAweDBhLCAweGNhLCAweDE1LCAweDJhLCAweDI3LCAweGU3LCAweGRlLCAweDk5LCAweDYxLAorICAweDMxLCAweDM1LCAweGU5LCAweGRhLCAweDE1LCAweGQ4LCAweGY4LCAweDMxLCAweGQ4LCAweDVjLCAweGYyLCAweGMwLAorICAweGI2LCAweGNiLCAweDE4LCAweDg2LCAweDE5LCAweDNjLCAweGE3LCAweGM3LCAweGJkLCAweDAwLCAweDNmLCAweDdlLAorICAweGM1LCAweDA0LCAweDM2LCAweDE4LCAweDg3LCAweDYwLCAweDAwLCAweDA0LCAweGExLCAweDZjLCAweGQwLCAweDAxLAorICAweDBlLCAweDQyLCAweDNkLCAweDQwLCAweDY2LCAweDk1LCAweGQ0LCAweGI4LCAweDExLCAweGIxLCAweGJmLCAweGJiLAorICAweGEyLCAweGNjLCAweDFjLCAweGFiLCAweGQxLCAweDJiLCAweGExLCAweGYzLCAweDEzLCAweDIyLCAweGNkLCAweGRiLAorICAweDE0LCAweDc3LCAweDVkLCAweDdkLCAweDhlLCAweDgxLCAweDdmLCAweDQxLCAweGJjLCAweDYxLCAweGU1LCAweGZlLAorICAweDM5LCAweGQ3LCAweGNmLCAweDBiLCAweGJlLCAweDRmLCAweDcyLCAweGZhLCAweDhmLCAweGYxLCAweGJhLCAweDU5LAorICAweGRlLCAweGNhLCAweGJjLCAweGIzLCAweDJiLCAweDdhLCAweGE3LCAweDhhLCAweGFkLCAweDkyLCAweDU0LCAweDQ4LAorICAweDRiLCAweGI3LCAweGY4LCAweDM1LCAweDcxLCAweGFmLCAweDY3LCAweDc2LCAweGNjLCAweDJmLCAweDdiLCAweDNiLAorICAweGE3LCAweDA3LCAweDBkLCAweDk0LCAweDQ5LCAweDVjLCAweGU5LCAweDhmLCAweGYzLCAweGFlLCAweDI3LCAweGZkLAorICAweGJmLCAweDg2LCAweDEwLCAweGUwLCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAxLCAweGZmLCAweGZmLAorICAweDE5LCAweDZmLCAweGE0LCAweGIwLCAweDg4LCAweGU4LCAweDQ2LCAweDIxLCAweDg0LCAweDA0LCAweGFmLCAweDI2LAorICAweDcwLCAweGE5LCAweGQzLCAweGE1LCAweDU0LCAweDQwLCAweGExLCAweDI5LCAweDZhLCAweDliLCAweDE2LCAweDgxLAorICAweDJlLCAweGE1LCAweGNiLCAweDgxLCAweDIwLCAweDk0LCAweGU3LCAweDY1LCAweDVkLCAweGMxLCAweDlkLCAweDExLAorICAweDcyLCAweDdkLCAweDEzLCAweDlhLCAweDI1LCAweDY4LCAweDBiLCAweDkxLCAweGI4LCAweDc2LCAweDdiLCAweDY4LAorICAweGI2LCAweGU5LCAweDEyLCAweDAxLCAweDNjLCAweGNlLCAweDNlLCAweDM1LCAweGM1LCAweDdjLCAweDhiLCAweDU1LAorICAweGQ4LCAweDFhLCAweDQyLCAweDk5LCAweGUxLCAweGIxLCAweGMzLCAweDg1LCAweGRmLCAweDIwLCAweGRlLCAweDY5LAorICAweDVjLCAweGIxLCAweGQ2LCAweDdhLCAweDk3LCAweDAyLCAweGFlLCAweGM2LCAweGMzLCAweDRlLCAweGZkLCAweGFjLAorICAweDU5LCAweDRjLCAweGMwLCAweDYyLCAweDM5LCAweDVlLCAweGRkLCAweDIwLCAweGRlLCAweGRmLCAweDVmLCAweDYxLAorICAweGQ1LCAweGQ2LCAweGJlLCAweDFhLCAweDE1LCAweDJlLCAweDhhLCAweGMwLCAweGU5LCAweGE0LCAweGY4LCAweGFjLAorICAweDlhLCAweDVhLCAweDhkLCAweDQyLCAweDNiLCAweDFlLCAweGQwLCAweGMxLCAweDViLCAweGEyLCAweDk0LCAweDVjLAorICAweGFjLCAweDUyLCAweDJmLCAweDMxLCAweDg1LCAweDRkLCAweDEzLCAweDQ1LCAweDA3LCAweDM5LCAweDk0LCAweDg0LAorICAweDI2LCAweDlkLCAweGZjLCAweDY3LCAweDE4LCAweDFjLCAweGRhLCAweDUyLCAweDZiLCAweDg5LCAweDVmLCAweGExLAorICAweDUyLCAweDBhLCAweDJmLCAweDljLCAweGE5LCAweDU1LCAweDVkLCAweGZmLCAweDI5LCAweDYwLCAweDJiLCAweDI4LAorICAweGY1LCAweDJiLCAweDYwLCAweDcyLCAweDljLCAweDIyLCAweGFlLCAweDZhLCAweGU4LCAweGExLCAweDgyLCAweGJhLAorICAweDJiLCAweDZiLCAweGZkLCAweGMwLCAweDNjLCAweGNhLCAweDk0LCAweGExLCAweGY1LCAweDczLCAweGVmLCAweGVjLAorICAweDhmLCAweDU3LCAweDI4LCAweGJkLCAweGFiLCAweDBiLCAweDNmLCAweDMzLCAweDAzLCAweGY3LCAweDc4LCAweDBjLAorICAweGExLCAweDE1LCAweGM0LCAweDMxLCAweDQ2LCAweGQ4LCAweDgyLCAweDJlLCAweDFmLCAweDBkLCAweDNiLCAweDFiLAorICAweDJjLCAweGUzLCAweDUxLCAweGYzLCAweGY1LCAweGRkLCAweDc2LCAweGM1LCAweGEzLCAweGFkLCAweDY4LCAweGY5LAorICAweDg2LCAweGU4LCAweDBhLCAweGE0LCAweDBiLCAweGU1LCAweGE4LCAweDFiLCAweDM1LCAweGEyLCAweDdiLCAweGFkLAorICAweGFkLCAweDg2LCAweDk1LCAweDlhLCAweDU2LCAweGUxLCAweGQ4LCAweDEyLCAweGYzLCAweGVkLCAweDRjLCAweGY0LAorICAweDYxLCAweDY1LCAweDM2LCAweDE4LCAweDE1LCAweGQzLCAweGFjLCAweGI0LCAweDQxLCAweGFlLCAweDQ5LCAweDRmLAorICAweDg1LCAweDM3LCAweDI2LCAweDQzLCAweDRkLCAweDllLCAweDY5LCAweGYyLCAweGZlLCAweGY1LCAweGQzLCAweGJmLAorICAweGMxLCAweGU1LCAweDgxLCAweGZmLCAweGY0LCAweDAzLCAweDE0LCAweDIwLCAweDU4LCAweDY2LCAweDFkLCAweDgwLAorICAweDAwLCAweDA5LCAweDQ4LCAweDcwLCAweDYwLCAweDQxLCAweGIwLCAweGJkLCAweDU1LCAweDJhLCAweGIxLCAweDI5LAorICAweDdhLCAweGJmLCAweGNiLCAweGJjLCAweGFiLCAweGI0LCAweDBlLCAweDhhLCAweDUwLCAweDk0LCAweDM4LCAweDBjLAorICAweGYwLCAweGIxLCAweDdjLCAweDMyLCAweGRhLCAweDAwLCAweDI5LCAweGFkLCAweDVlLCAweDYyLCAweDRiLCAweDc1LAorICAweDhlLCAweDVkLCAweDUyLCAweGYzLCAweGI3LCAweDAzLCAweGEyLCAweDAwLCAweDBmLCAweDRhLCAweGE4LCAweDVjLAorICAweGFhLCAweDFhLCAweGFjLCAweDFiLCAweDg1LCAweDI3LCAweDU5LCAweDNiLCAweDhhLCAweGFhLCAweDAwLCAweDMwLAorICAweDIxLCAweDMyLCAweGFlLCAweDUxLCAweDRhLCAweDA2LCAweDRiLCAweGE4LCAweGQwLCAweGY0LCAweDdkLCAweGNmLAorICAweGI5LCAweDY5LCAweDg3LCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDNmLCAweGZmLCAweDI1LAorICAweDczLCAweDgzLCAweDIxLCAweDQ4LCAweDg4LCAweDQ2LCAweDE5LCAweDg1LCAweDA0LCAweGU5LCAweDY3LCAweDRkLAorICAweDBiLCAweDVhLCAweGVhLCAweDRjLCAweDgwLCAweDA1LCAweDU5LCAweDQzLCAweDRiLCAweDYwLCAweGUwLCAweGY2LAorICAweDRlLCAweGI4LCAweGFlLCAweDg5LCAweGY4LCAweDRlLCAweDI1LCAweDUxLCAweDE0LCAweGVjLCAweDQ2LCAweDlmLAorICAweGI4LCAweDc3LCAweGFkLCAweDk0LCAweDQ5LCAweDAzLCAweGIwLCAweDdlLCAweGQxLCAweGQ3LCAweDVkLCAweDQ3LAorICAweDI4LCAweDg2LCAweDkzLCAweGVmLCAweGQ3LCAweDBkLCAweGI3LCAweGExLCAweDc0LCAweDZjLCAweDEzLCAweGNlLAorICAweDI0LCAweDI3LCAweGY2LCAweGVjLCAweDQ1LCAweDBlLCAweGIwLCAweDYyLCAweDUxLCAweDhmLCAweGMxLCAweDUwLAorICAweGFiLCAweGRjLCAweDkyLCAweDA2LCAweDQ2LCAweGM1LCAweGUxLCAweGY0LCAweGFkLCAweDM5LCAweDZkLCAweGU4LAorICAweGQ1LCAweDI4LCAweDA1LCAweGYzLCAweDQ5LCAweGMxLCAweDYzLCAweDBhLCAweGZlLCAweDIzLCAweDc4LCAweDI2LAorICAweDViLCAweDZmLCAweGE1LCAweGE4LCAweDkyLCAweGVjLCAweDc0LCAweGUwLCAweDQxLCAweGY2LCAweGI1LCAweDA5LAorICAweDIzLCAweDNjLCAweGRkLCAweDE3LCAweDk5LCAweGEzLCAweGFkLCAweGQzLCAweDc1LCAweDM4LCAweDViLCAweGU1LAorICAweDc5LCAweGRhLCAweDBlLCAweGNiLCAweDFhLCAweGNmLCAweGViLCAweDlmLCAweDI0LCAweDQ1LCAweGE1LCAweGM1LAorICAweDQ1LCAweGU5LCAweDM5LCAweDY0LCAweDVjLCAweGU1LCAweDBkLCAweGU0LCAweDg4LCAweDNmLCAweGU1LCAweDAwLAorICAweDJjLCAweGZiLCAweDQzLCAweDE1LCAweGE4LCAweDAxLCAweDhiLCAweGU1LCAweDRhLCAweGUzLCAweDc2LCAweGRmLAorICAweDFmLCAweGU0LCAweGVhLCAweGRmLCAweDgxLCAweDA2LCAweDY3LCAweDY1LCAweDg1LCAweDRlLCAweDlmLCAweGYwLAorICAweGVhLCAweDM2LCAweDRhLCAweDA1LCAweDk2LCAweDcyLCAweGYzLCAweDQ5LCAweDJlLCAweGVkLCAweDNmLCAweDM2LAorICAweGQwLCAweGZlLCAweGY1LCAweDYyLCAweGI0LCAweGVmLCAweDc0LCAweDdmLCAweGI3LCAweDRhLCAweDkyLCAweDM1LAorICAweDQ3LCAweGZiLCAweDRlLCAweDQzLCAweDkxLCAweGVjLCAweGE4LCAweGY4LCAweGRjLCAweGI3LCAweGQ5LCAweDZkLAorICAweDNhLCAweDM3LCAweDI3LCAweDdmLCAweDc4LCAweDM5LCAweDYwLCAweDlhLCAweDI4LCAweDk2LCAweDIzLCAweGQ4LAorICAweGIyLCAweDk2LCAweDBhLCAweDgwLCAweDI4LCAweDUyLCAweDcwLCAweDNlLCAweDY2LCAweDJkLCAweGQ0LCAweDY0LAorICAweGEyLCAweGJlLCAweGI2LCAweGE4LCAweDVhLCAweGRkLCAweDM4LCAweDU1LCAweDliLCAweGVmLCAweDQ5LCAweDI3LAorICAweGVkLCAweGNkLCAweGM5LCAweDUyLCAweDgyLCAweDhkLCAweDg3LCAweDEzLCAweDc1LCAweGQ1LCAweDRkLCAweDE3LAorICAweDUxLCAweDI2LCAweDUzLCAweGU1LCAweDNiLCAweGQxLCAweDJmLCAweGQyLCAweGJmLCAweGZkLCAweGJmLCAweGRkLAorICAweDNjLCAweGQwLCAweDdkLCAweGZlLCAweDhhLCAweDEwLCAweDhhLCAweDFkLCAweDgwLCAweDA5LCAweDQxLCAweDMxLAorICAweDc4LCAweDg5LCAweDk3LCAweDYxLCAweDgwLCAweDAyLCAweDM0LCAweGRiLCAweGIzLCAweDQzLCAweDJhLCAweDA5LAorICAweDU4LCAweDhjLCAweGM5LCAweDE1LCAweGFkLCAweDE2LCAweDMxLCAweDBmLCAweDQxLCAweDY4LCAweDJhLCAweDAyLAorICAweGJhLCAweDc4LCAweDU1LCAweGMyLCAweDQ5LCAweDU0LCAweDQyLCAweDNkLCAweDJkLCAweDc2LCAweGM1LCAweGU2LAorICAweDA4LCAweDJjLCAweGIyLCAweDcxLCAweDQzLCAweGIxLCAweGZjLCAweDc3LCAweGFjLCAweDZkLCAweDdlLCAweDRlLAorICAweDExLCAweDU3LCAweGM2LCAweGQ0LCAweGRkLCAweDI4LCAweDU2LCAweDkyLCAweDA3LCAweGVjLCAweGVlLCAweDhmLAorICAweDBjLCAweGU1LCAweDAyLCAweDExLCAweDlkLCAweGNlLCAweDY3LCAweGRkLCAweGNmLCAweGFhLCAweDAwLCAweDFjLAorICAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDdmLCAweGZmLCAweDE5LCAweDZmLCAweGEyLCAweGMxLAorICAweDU4LCAweDY0LCAweDQ0LCAweDMzLCAweDBkLCAweDQyLCAweDA3LCAweDFiLCAweDk3LCAweDY2LCAweDk1LCAweGMxLAorICAweGFiLCAweGE5LCAweDJhLCAweDE0LCAweDAwLCAweDk1LCAweDAzLCAweDNmLCAweGQ0LCAweGM4LCAweGIxLCAweDljLAorICAweDRhLCAweDViLCAweDM2LCAweDY2LCAweDNjLCAweDIxLCAweDA5LCAweGU4LCAweGVkLCAweDllLCAweGFjLCAweGQ4LAorICAweGRhLCAweDliLCAweDQ1LCAweGQ5LCAweDdlLCAweDE2LCAweGNlLCAweDBjLCAweGIyLCAweDE2LCAweGM0LCAweGNhLAorICAweDBiLCAweDMwLCAweDE5LCAweDE3LCAweDM0LCAweGU1LCAweGVkLCAweGRmLCAweDdjLCAweDc2LCAweDVmLCAweDM0LAorICAweDY2LCAweGE4LCAweDk0LCAweDAxLCAweDQyLCAweGU2LCAweGE0LCAweDZmLCAweDljLCAweDJkLCAweGZjLCAweDhmLAorICAweGU3LCAweGE4LCAweDEzLCAweDJiLCAweDI4LCAweGM4LCAweDcyLCAweDYzLCAweDY5LCAweGFiLCAweGI5LCAweDBiLAorICAweDI0LCAweGY2LCAweDdkLCAweDQzLCAweDIxLCAweDg0LCAweGFlLCAweDU0LCAweDM1LCAweDVjLCAweGZjLCAweGMwLAorICAweDFhLCAweDcyLCAweDU5LCAweDQ4LCAweDhjLCAweGQ1LCAweDM2LCAweDUxLCAweGQwLCAweDlkLCAweDRjLCAweDRmLAorICAweDVhLCAweGRhLCAweGQ1LCAweDRiLCAweDQ1LCAweDc1LCAweDAxLCAweDExLCAweDFhLCAweDc4LCAweGVkLCAweGVkLAorICAweDNiLCAweGE1LCAweGFiLCAweDgxLCAweDRiLCAweDYyLCAweGZjLCAweDhhLCAweDViLCAweGFjLCAweDQ1LCAweDBmLAorICAweDQ0LCAweDNlLCAweDM2LCAweDRhLCAweDRjLCAweDA5LCAweDA4LCAweGNlLCAweGY3LCAweGVhLCAweDFjLCAweDJiLAorICAweGIzLCAweDIwLCAweGE0LCAweGM0LCAweGU1LCAweGI1LCAweDZkLCAweDhiLCAweDJhLCAweGFjLCAweGFjLCAweDI1LAorICAweDUzLCAweDNiLCAweDJjLCAweDlhLCAweDg4LCAweGNkLCAweGMwLCAweDhmLCAweGUzLCAweDUzLCAweGY1LCAweDkzLAorICAweDA2LCAweDNmLCAweDY0LCAweGZkLCAweDY0LCAweDQ1LCAweGFlLCAweDdmLCAweGQ5LCAweDM2LCAweGEzLCAweGYxLAorICAweDFkLCAweGNlLCAweGE3LCAweDNiLCAweGExLCAweDY1LCAweDgzLCAweGYxLCAweGMyLCAweDQwLCAweGQwLCAweGE3LAorICAweDEwLCAweGUzLCAweDZhLCAweDgwLCAweDQ0LCAweDc1LCAweDQ2LCAweGNhLCAweDBmLCAweDNlLCAweDRhLCAweDViLAorICAweDMyLCAweGE2LCAweDYyLCAweDEwLCAweDY1LCAweDYwLCAweDQ3LCAweDFjLCAweDk0LCAweGNjLCAweGE5LCAweDQzLAorICAweDliLCAweGJlLCAweGIxLCAweGM2LCAweDU1LCAweDA5LCAweDMwLCAweGZjLCAweDNlLCAweDJjLCAweGRkLCAweDk0LAorICAweDVmLCAweGQ1LCAweDY2LCAweDM4LCAweDQyLCAweGQ1LCAweDQzLCAweGNlLCAweDAyLCAweGY3LCAweGI4LCAweDk1LAorICAweGNlLCAweGY0LCAweGMxLCAweDBjLCAweDhmLCAweDZiLCAweDVlLCAweDg1LCAweDNkLCAweGI2LCAweGM4LCAweGIzLAorICAweGQyLCAweGFkLCAweDU3LCAweDg0LCAweGI5LCAweDc0LCAweGY1LCAweGYzLCAweGZiLCAweDM4LCAweGVmLCAweDdlLAorICAweDAwLCAweDEwLCAweDFmLCAweGMxLCAweDRhLCAweDA5LCAweDQ3LCAweGIwLCAweDAwLCAweDk0LCAweDJhLCAweGU4LAorICAweDI1LCAweDFkLCAweDE4LCAweDAxLCAweGIwLCAweDAyLCAweDMyLCAweGVhLCAweDllLCAweDc3LCAweGUxLCAweGFmLAorICAweDI5LCAweDNjLCAweDQyLCAweDk0LCAweGI0LCAweGQ2LCAweGIxLCAweDAxLCAweDUyLCAweGU0LCAweGIxLCAweDJmLAorICAweDE2LCAweDdiLCAweDkyLCAweDY2LCAweDI3LCAweDI4LCAweDJiLCAweDEzLCAweDgyLCAweGI1LCAweDIwLCAweDUwLAorICAweGNkLCAweGI5LCAweDk3LCAweGFmLCAweGRjLCAweDBiLCAweDYzLCAweGM0LCAweGNmLCAweDdiLCAweDQ0LCAweDdkLAorICAweDc1LCAweDM3LCAweDdmLCAweDcyLCAweGU2LCAweGVlLCAweDI1LCAweGQ4LCAweGM1LCAweDFiLCAweGQ2LCAweGJlLAorICAweDUxLCAweDBlLCAweGNlLCAweGJiLCAweDllLCAweDlkLCAweDRkLCAweDczLCAweDk4LCAweDk4LCAweDgwLCAweDBlLAorICAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAxLCAweGZmLCAweGZmLCAweDE1LCAweDZmLCAweGEyLCAweDQxLAorICAweGM4LCAweGM4LCAweDExLCAweDIzLCAweDA1LCAweDA0LCAweGEyLCAweDAwLCAweDM4LCAweDNhLCAweGRlLCAweDk2LAorICAweGJiLCAweGEyLCAweGVhLCAweDgwLCAweDE1LCAweDc4LCAweDk4LCAweDI0LCAweGY0LCAweGU0LCAweGVhLCAweDkzLAorICAweGY0LCAweGRiLCAweDFhLCAweDExLCAweDEwLCAweDlmLCAweDJhLCAweDg2LCAweDgyLCAweDgxLCAweGJjLCAweGJjLAorICAweDkzLCAweGY4LCAweDhlLCAweGNiLCAweDEwLCAweDlkLCAweGEzLCAweDkwLCAweGM3LCAweDQ0LCAweDFiLCAweGJiLAorICAweDc5LCAweDhiLCAweDM4LCAweDkzLCAweDE4LCAweDdiLCAweDAyLCAweGQwLCAweDBmLCAweDUwLCAweDRmLCAweDUxLAorICAweGM1LCAweGNiLCAweGE5LCAweGUyLCAweGZkLCAweDk3LCAweDlhLCAweDYzLCAweGFhLCAweDQ1LCAweDUyLCAweGYzLAorICAweGE2LCAweGUwLCAweGQ3LCAweGFmLCAweDBlLCAweDk2LCAweDA2LCAweGVkLCAweDRmLCAweGU5LCAweDFmLCAweDQ3LAorICAweDg2LCAweDE4LCAweDI5LCAweGNmLCAweGFlLCAweGUzLCAweGI5LCAweGNkLCAweDE3LCAweGM3LCAweGMxLCAweDQ2LAorICAweDQ3LCAweDcyLCAweDE1LCAweDRlLCAweGRkLCAweDI2LCAweDcxLCAweDE4LCAweDQ5LCAweDMyLCAweGFjLCAweGE1LAorICAweGU2LCAweDQ4LCAweDY4LCAweGY4LCAweDhjLCAweGM1LCAweGJiLCAweDg1LCAweDhhLCAweGY5LCAweDdiLCAweDJlLAorICAweDBiLCAweGNhLCAweGVkLCAweDYyLCAweDVhLCAweGUyLCAweDcyLCAweGE2LCAweDU2LCAweDVkLCAweGRkLCAweDRjLAorICAweGRlLCAweGJmLCAweDFlLCAweDVkLCAweDg0LCAweGY0LCAweGIzLCAweDI3LCAweDFjLCAweGEyLCAweDA1LCAweDAzLAorICAweDk0LCAweDA1LCAweDE2LCAweGQzLCAweDhiLCAweDRjLCAweDY4LCAweDgzLCAweGI5LCAweDJhLCAweDM5LCAweGViLAorICAweDg0LCAweGM4LCAweGNiLCAweDg0LCAweGJlLCAweDRjLCAweGU2LCAweDU5LCAweDA1LCAweGVkLCAweGJiLCAweGIzLAorICAweDU5LCAweDVlLCAweDdlLCAweGU3LCAweGRkLCAweGY5LCAweGQwLCAweGRlLCAweDMyLCAweDU1LCAweDQ2LCAweDQ4LAorICAweGMxLCAweDRkLCAweDQzLCAweGYyLCAweGUzLCAweGU4LCAweDY1LCAweDkxLCAweGI3LCAweDRmLCAweDRkLCAweDI3LAorICAweDNhLCAweDYzLCAweGQzLCAweGMzLCAweGQzLCAweDBlLCAweGE4LCAweGMyLCAweGVhLCAweDY2LCAweGE2LCAweDZjLAorICAweDllLCAweDVmLCAweDZlLCAweGMzLCAweDgyLCAweDg3LCAweDIzLCAweDIxLCAweDY0LCAweDM0LCAweDE0LCAweDk0LAorICAweGY1LCAweGJhLCAweGM5LCAweDY3LCAweDRjLCAweDM2LCAweDljLCAweGU0LCAweDZiLCAweGFmLCAweDZlLCAweGU5LAorICAweDc0LCAweGY1LCAweDIyLCAweDc5LCAweGM1LCAweGZiLCAweDQwLCAweDkxLCAweGNhLCAweGZkLCAweDU4LCAweDlmLAorICAweDhmLCAweDQ1LCAweGZhLCAweDYwLCAweGQyLCAweDdiLCAweGFiLCAweDFiLCAweGVkLCAweDgwLCAweDA4LCAweDBmLAorICAweGQwLCAweDA4LCAweDUyLCAweDgxLCAweDYxLCAweDk4LCAweDc2LCAweDAwLCAweDAwLCAweDQyLCAweDkxLCAweGMwLAorICAweDIyLCAweDkwLCAweGVjLCAweDI4LCAweDIzLCAweDlhLCAweDQxLCAweDc5LCAweGMwLCAweDQ1LCAweDNiLCAweGNjLAorICAweDIxLCAweDM1LCAweDk5LCAweDBiLCAweDljLCAweDUyLCAweDBhLCAweGQyLCAweDM2LCAweGY3LCAweGVkLCAweGNiLAorICAweDFiLCAweDgyLCAweDEwLCAweDRjLCAweDkyLCAweDk1LCAweDdiLCAweDI2LCAweDc4LCAweDQ0LCAweGNlLCAweGNmLAorICAweGI0LCAweDE2LCAweDY4LCAweDZjLCAweGFmLCAweDk0LCAweDQ1LCAweDY4LCAweDE1LCAweGEyLCAweGU2LCAweGEyLAorICAweGNiLCAweGQ4LCAweDFlLCAweDY0LCAweGFmLCAweDQyLCAweDU0LCAweDkzLCAweGU1LCAweDU0LCAweDlkLCAweGMyLAorICAweDAwLCAweDc1LCAweDllLCAweGVhLCAweDkyLCAweDBmLCAweGJhLCAweDc3LCAweGRlLCAweGM3LCAweGY0LCAweGU4LAorICAweDg3LCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDdmLCAweGZmLCAweDE3LCAweDZmLCAweGE0LAorICAweGIwLCAweDkwLCAweGU0LCAweDQ0LCAweDEzLCAweDA4LCAweDQyLCAweDAxLCAweDY5LCAweDdjLCAweDBkLCAweDMzLAorICAweDU3LCAweDUxLCAweDFjLCAweGU4LCAweDAwLCAweDg3LCAweDIyLCAweGQ1LCAweDBkLCAweGE2LCAweGYyLCAweDA5LAorICAweDY1LCAweDRmLCAweDE4LCAweDk4LCAweDIwLCAweDEyLCAweDhmLCAweDAyLCAweGEyLCAweDkzLCAweDU5LCAweDk0LAorICAweDgyLCAweDQ1LCAweDkwLCAweDVkLCAweGM2LCAweGZjLCAweDlkLCAweGU1LCAweGI1LCAweDAwLCAweDI2LCAweDI5LAorICAweDUwLCAweDM1LCAweDRlLCAweDE3LCAweGQ4LCAweDBmLCAweDFlLCAweGFmLCAweDliLCAweDliLCAweGJmLCAweGNmLAorICAweDkyLCAweGI2LCAweDY2LCAweDhlLCAweGRkLCAweDMyLCAweDM1LCAweGM5LCAweDk4LCAweDJlLCAweDNhLCAweGI2LAorICAweGFhLCAweDhkLCAweDI0LCAweDFkLCAweGQxLCAweDJlLCAweDk2LCAweDIyLCAweGI1LCAweGM2LCAweDY0LCAweDcwLAorICAweGY5LCAweDM3LCAweDlmLCAweDhkLCAweGU0LCAweDBmLCAweGI4LCAweGE2LCAweGFmLCAweGY1LCAweDg5LCAweDFlLAorICAweDJlLCAweDNhLCAweGJlLCAweDUzLCAweDU2LCAweDAxLCAweGQ0LCAweDgwLCAweDE2LCAweDA5LCAweDUwLCAweGNhLAorICAweGU5LCAweDA4LCAweDNlLCAweDA0LCAweGMyLCAweDg2LCAweGQ0LCAweDgwLCAweDY5LCAweGU2LCAweDg4LCAweGRkLAorICAweGUwLCAweDdiLCAweGJjLCAweDYwLCAweDJjLCAweGUwLCAweDhiLCAweDM5LCAweDdiLCAweGQwLCAweGYxLCAweGY0LAorICAweDI3LCAweDE5LCAweDBjLCAweGJkLCAweDE4LCAweDlkLCAweDM4LCAweDIxLCAweGRhLCAweGZkLCAweGY0LCAweGUyLAorICAweGVkLCAweDBhLCAweDc0LCAweDNhLCAweDhjLCAweDNkLCAweDk5LCAweGUyLCAweDVlLCAweDcyLCAweGUwLCAweDAyLAorICAweGM2LCAweDUzLCAweDQ5LCAweDU2LCAweDY5LCAweGFmLCAweDJmLCAweDM0LCAweGIzLCAweDU1LCAweDk1LCAweDg3LAorICAweDU2LCAweDEwLCAweGU1LCAweDUwLCAweDJmLCAweDJhLCAweDRhLCAweDc4LCAweDc0LCAweDM4LCAweDVkLCAweGRiLAorICAweDQ3LCAweDU4LCAweGFjLCAweGFlLCAweDc5LCAweDU2LCAweDFjLCAweGMyLCAweDZjLCAweDZjLCAweGE3LCAweDRhLAorICAweGU0LCAweDUzLCAweGU4LCAweDdkLCAweDM0LCAweDU1LCAweDlhLCAweDYwLCAweDgyLCAweGZlLCAweDRjLCAweDRmLAorICAweDQ0LCAweDM5LCAweDhjLCAweGMwLCAweDFkLCAweDZiLCAweGM2LCAweDU3LCAweGNjLCAweDYzLCAweDE3LCAweDBkLAorICAweDE5LCAweGRhLCAweDY3LCAweGFkLCAweDA2LCAweDdlLCAweDUzLCAweGU4LCAweDUwLCAweDhiLCAweGQxLCAweGVkLAorICAweGY0LCAweDQwLCAweDA3LCAweGE2LCAweGQ5LCAweDMwLCAweDFiLCAweGVhLCAweGQ5LCAweDI4LCAweGRjLCAweDNjLAorICAweDJhLCAweDllLCAweGQ0LCAweDE0LCAweDUzLCAweGMyLCAweDhiLCAweGVjLCAweDFiLCAweGFlLCAweGJiLCAweDVmLAorICAweDZmLCAweDk2LCAweDEwLCAweDdmLCAweGZlLCAweDBhLCAweDk4LCAweDY2LCAweDFkLCAweDgwLCAweDA1LCAweDQwLAorICAweDJhLCAweDJhLCAweDRjLCAweGVhLCAweGIwLCAweDA2LCAweGE5LCAweGM4LCAweGZiLCAweGFiLCAweGZkLCAweDM0LAorICAweGU1LCAweGQwLCAweDkxLCAweGIyLCAweDRhLCAweGFiLCAweGQ4LCAweDVhLCAweDA4LCAweGE3LCAweDcyLCAweGYxLAorICAweDIwLCAweDAyLCAweGM1LCAweDVkLCAweDA1LCAweGUwLCAweGFlLCAweGQ4LCAweDVhLCAweDIzLCAweDQxLCAweDYxLAorICAweDY0LCAweGI2LCAweGNhLCAweDc4LCAweGZmLCAweGE2LCAweDdhLCAweGVkLCAweGEwLCAweGI2LCAweDRkLCAweDVhLAorICAweDc3LCAweDg1LCAweGQ5LCAweDc3LCAweGU0LCAweGI5LCAweGUzLCAweDY5LCAweDBjLCAweDViLCAweDQ0LCAweGQ0LAorICAweDRlLCAweDA0LCAweDk1LCAweDVjLCAweDMyLCAweDlkLCAweDBmLCAweDc4LCAweGU0LCAweDE5LCAweDA4LCAweGViLAorICAweGE2LCAweGI1LCAweDIxLCAweGY2LCAweGRkLCAweDEyLCAweDE4LCAweDQzLCAweDA3LCAweDIxLCAweDFhLCAweDg4LAorICAweDAwLCAweDAwLCAweDAwLCAweDNmLCAweGZmLCAweDFkLCAweDZmLCAweGE0LCAweGIxLCAweDEwLCAweGEyLCAweDM0LAorICAweDEzLCAweDBjLCAweGMyLCAweDA2LCAweDkyLCAweDNhLCAweDBlLCAweDIyLCAweDU5LCAweDc0LCAweDI4LCAweDI4LAorICAweGI0LCAweDM2LCAweDJhLCAweDA4LCAweDY0LCAweDYwLCAweDgyLCAweDM5LCAweDc1LCAweDY1LCAweDczLCAweGZjLAorICAweDI3LCAweDJjLCAweDU2LCAweGUxLCAweGZlLCAweGRkLCAweDU1LCAweDBlLCAweGU2LCAweDdlLCAweDZiLCAweDQ3LAorICAweDg0LCAweDc2LCAweDZkLCAweDYwLCAweDM5LCAweGI0LCAweDk4LCAweDA3LCAweGNlLCAweDE3LCAweDA1LCAweGM5LAorICAweDE5LCAweGU4LCAweGFmLCAweGM1LCAweDZlLCAweDlkLCAweDgxLCAweGVjLCAweDNjLCAweGFkLCAweDk2LCAweDY0LAorICAweDdjLCAweGU1LCAweGMxLCAweDllLCAweDc1LCAweDhjLCAweGQ5LCAweGNjLCAweGQ2LCAweGE5LCAweDFmLCAweDE5LAorICAweDY4LCAweDRjLCAweGZiLCAweDYzLCAweGE1LCAweGQ3LCAweDMzLCAweDhkLCAweDE1LCAweDdiLCAweDk4LCAweGQwLAorICAweGE0LCAweGE4LCAweDczLCAweDY3LCAweGY2LCAweDNmLCAweDIyLCAweGE5LCAweDM1LCAweDIzLCAweDM3LCAweGY3LAorICAweDZhLCAweDZmLCAweGI0LCAweGVkLCAweGQ0LCAweDI4LCAweDdjLCAweDE5LCAweDFkLCAweDMzLCAweGY2LCAweDExLAorICAweGU2LCAweDBkLCAweDhhLCAweGRkLCAweGRkLCAweGFiLCAweDljLCAweDNhLCAweGM5LCAweGRhLCAweDk0LCAweDk1LAorICAweDZkLCAweDUzLCAweGY1LCAweGZiLCAweDVhLCAweDczLCAweDlkLCAweDQ4LCAweDM2LCAweDVhLCAweDJjLCAweGY2LAorICAweGZhLCAweDBhLCAweGVlLCAweDM5LCAweDlmLCAweDE0LCAweDlkLCAweGVmLCAweGQzLCAweDgwLCAweDRmLCAweDI0LAorICAweDM5LCAweGUzLCAweDNjLCAweDJhLCAweGQ1LCAweDczLCAweDk1LCAweDYwLCAweDA4LCAweDk4LCAweGFhLCAweGRkLAorICAweDc4LCAweDhiLCAweDNkLCAweDA2LCAweGFmLCAweGFlLCAweDY1LCAweGI2LCAweGE1LCAweGY1LCAweGNlLCAweDEyLAorICAweDhiLCAweDA3LCAweGFkLCAweDRmLCAweDA4LCAweDEzLCAweDc0LCAweDk3LCAweDcxLCAweDI2LCAweGYyLCAweDU1LAorICAweDdhLCAweGFiLCAweGFiLCAweDg5LCAweDc1LCAweDE4LCAweDAwLCAweDUxLCAweGU2LCAweDcyLCAweDY1LCAweDc3LAorICAweDEyLCAweGJlLCAweGI4LCAweGQ5LCAweGRjLCAweDY2LCAweDYwLCAweGUxLCAweGE2LCAweGYyLCAweDNjLCAweGVkLAorICAweGI5LCAweDBjLCAweDcwLCAweDBmLCAweDhmLCAweGZiLCAweDFjLCAweDQ4LCAweDQwLCAweDI1LCAweDBlLCAweDM4LAorICAweGZkLCAweGJmLCAweGNkLCAweDRiLCAweDQxLCAweDlkLCAweDM4LCAweDk2LCAweDg3LCAweGVjLCAweGY5LCAweDYwLAorICAweGU3LCAweDM0LCAweGY0LCAweDZmLCAweDIwLCAweDM1LCAweDZiLCAweDE5LCAweDlkLCAweDgzLCAweDBiLCAweDg2LAorICAweGZhLCAweDJlLCAweDJmLCAweDZhLCAweGNmLCAweDRkLCAweDFhLCAweDdhLCAweGI1LCAweGRiLCAweGIzLCAweDhiLAorICAweDVkLCAweGQ5LCAweGE3LCAweGZlLCAweGEzLCAweGIxLCAweGY5LCAweDRmLCAweDU3LCAweDA3LCAweGRmLCAweGU4LAorICAweGE1LCAweDg2LCAweDYxLCAweGQ4LCAweDAwLCAweDE1LCAweDAyLCAweGE1LCAweDEyLCAweDJjLCAweGMxLCAweDJhLAorICAweGMwLCAweGUxLCAweDVhLCAweGExLCAweGY5LCAweDFjLCAweGJhLCAweGNlLCAweDk3LCAweDg3LCAweDAwLCAweDlkLAorICAweDY1LCAweDNiLCAweDBkLCAweGNhLCAweGUxLCAweDA1LCAweDEzLCAweGEwLCAweDMzLCAweDMxLCAweDhiLCAweDczLAorICAweDMwLCAweDU5LCAweDFkLCAweDNiLCAweGExLCAweGViLCAweGY1LCAweDUzLCAweDlmLCAweDM2LCAweDNmLCAweGFkLAorICAweGE2LCAweGFjLCAweDc1LCAweGI0LCAweGFjLCAweGNiLCAweDNlLCAweDc5LCAweDMwLCAweGUwLCAweDE4LCAweGM0LAorICAweGM5LCAweDY4LCAweGRiLCAweDdjLCAweGM4LCAweDE1LCAweDBmLCAweDM5LCAweDllLCAweDQ2LCAweDNiLCAweDkxLAorICAweDJmLCAweGFjLCAweGNlLCAweGNiLCAweGZhLCAweDY4LCAweGM1LCAweGJiLCAweDlmLCAweDg2LCAweGZjLCAweGU3LAorICAweDIwLCAweDM4LCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAxLCAweGZmLCAweGZmLCAweDE3LCAweDcwLAorICAweGE0LCAweGEzLCAweDE4LCAweDg2LCAweDEwLCAweDBiLCAweDM4LCAweDY4LCAweGQ1LCAweDNhLCAweDRhLCAweDU1LAorICAweDU4LCAweDAyLCAweDk2LCAweDYwLCAweDI0LCAweDEwLCAweDEyLCAweDhjLCAweGIyLCAweDRhLCAweDI5LCAweDJjLAorICAweDFiLCAweGM4LCAweDIxLCAweDM3LCAweDdjLCAweGJiLCAweDQyLCAweDhlLCAweDA0LCAweDNmLCAweGQzLCAweDdlLAorICAweDkzLCAweDk4LCAweDZiLCAweDQwLCAweDY4LCAweGZlLCAweGY3LCAweGQ0LCAweDNiLCAweDllLCAweDhiLCAweDJkLAorICAweGQ2LCAweDc5LCAweDcwLCAweGJkLCAweGM1LCAweGUyLCAweDdiLCAweDY3LCAweGJkLCAweDliLCAweGI2LCAweGZjLAorICAweDM1LCAweDk3LCAweDQ5LCAweDQ2LCAweDFjLCAweGQ1LCAweGM3LCAweGQwLCAweGFkLCAweDk5LCAweDM5LCAweDcyLAorICAweDQzLCAweDJhLCAweDI0LCAweDUxLCAweDJiLCAweGVkLCAweGRkLCAweDZlLCAweDM1LCAweGUxLCAweGM1LCAweDdkLAorICAweGJiLCAweGFiLCAweDU2LCAweGFiLCAweGJiLCAweDU3LCAweDkzLCAweDk3LCAweDZkLCAweDBlLCAweGFmLCAweDliLAorICAweGM5LCAweDdmLCAweDJkLCAweGE5LCAweDhlLCAweDhjLCAweDVjLCAweDNlLCAweGJlLCAweGU5LCAweDYyLCAweGNiLAorICAweDg1LCAweDZkLCAweDIyLCAweDk5LCAweDJiLCAweDNjLCAweDg5LCAweDM5LCAweDk0LCAweDBkLCAweDYyLCAweDU0LAorICAweDM0LCAweDZhLCAweDU4LCAweDg2LCAweGJiLCAweDRmLCAweDdkLCAweDg3LCAweDdjLCAweDYzLCAweDY1LCAweDVmLAorICAweDhjLCAweDljLCAweDlmLCAweDg3LCAweDNhLCAweDZjLCAweDI4LCAweDJkLCAweGNlLCAweDNlLCAweDUwLCAweGU3LAorICAweDA0LCAweGUxLCAweGQ0LCAweGNkLCAweDQwLCAweDE4LCAweDgwLCAweDBkLCAweGExLCAweDNlLCAweDBlLCAweDE3LAorICAweGVkLCAweDU1LCAweDIzLCAweGUzLCAweGE1LCAweDM4LCAweDBmLCAweGFkLCAweDY5LCAweDU3LCAweGJlLCAweDgzLAorICAweDY4LCAweDQwLCAweDk2LCAweGNlLCAweGI3LCAweDA2LCAweDY4LCAweDNjLCAweDcyLCAweDFlLCAweDUxLCAweGYzLAorICAweDkxLCAweDVhLCAweGQxLCAweDMwLCAweGZhLCAweGUwLCAweDJiLCAweDNhLCAweGMwLCAweDhiLCAweDBkLCAweDc2LAorICAweGExLCAweDY3LCAweDUxLCAweDU1LCAweDdjLCAweGJkLCAweGUyLCAweDc4LCAweDljLCAweDkwLCAweDY1LCAweDBiLAorICAweDdhLCAweGI1LCAweDAyLCAweDMwLCAweDVlLCAweGRiLCAweDM5LCAweDk1LCAweGVhLCAweDMwLCAweDc0LCAweDIxLAorICAweGQ5LCAweGRlLCAweGIwLCAweDAzLCAweDEzLCAweGQ3LCAweDE4LCAweGQxLCAweDFjLCAweGI5LCAweDBkLCAweGEwLAorICAweDAwLCAweGFjLCAweDA4LCAweDEyLCAweDI0LCAweDkxLCAweDdlLCAweDg2LCAweDNkLCAweGVkLCAweDJjLCAweDYxLAorICAweDNhLCAweDYyLCAweDIwLCAweDBmLCAweDEyLCAweDliLCAweGU3LCAweDk4LCAweDllLCAweGMwLCAweDM2LCAweGQ3LAorICAweDUzLCAweDdmLCAweDkzLCAweDRjLCAweDU3LCAweGRmLCAweGY1LCAweDhiLCAweGFjLCAweDliLCAweDJhLCAweGE4LAorICAweDZhLCAweDI2LCAweDkyLCAweDNjLCAweDI1LCAweGZmLCAweGVkLCAweDNiLCAweDZmLCAweGQzLCAweGZmLCAweGVlLAorICAweDA3LCAweGZmLCAweGQwLCAweDkwLCAweDhlLCAweGM0LCAweDEwLCAweGVjLCAweDAwLCAweDJhLCAweDUyLCAweDA5LAorICAweDQ1LCAweDM0LCAweDA0LCAweDEwLCAweGVjLCAweDAxLCAweDU1LCAweGNlLCAweGE4LCAweDIxLCAweDM0LCAweGEyLAorICAweDAwLCAweDc0LCAweDgyLCAweGMxLCAweDBhLCAweDQ5LCAweGM4LCAweDQ0LCAweDE2LCAweDdjLCAweDEyLCAweGUyLAorICAweDQyLCAweDE4LCAweGRjLCAweDY5LCAweDcwLCAweDA1LCAweDgyLCAweGFjLCAweGVhLCAweDNhLCAweDkzLCAweGQ4LAorICAweDFmLCAweGQzLCAweGQyLCAweGZlLCAweGE5LCAweGE3LCAweDZjLCAweGQyLCAweDMzLCAweGYxLCAweDhhLCAweDYwLAorICAweGIxLCAweDYwLCAweDY4LCAweDA4LCAweDRkLCAweDUwLCAweDM1LCAweDA2LCAweDc3LCAweDBkLCAweGUzLCAweDljLAorICAweGFkLCAweDM0LCAweDQ1LCAweGIzLCAweDMzLCAweDA1LCAweDM0LCAweDI2LCAweDJhLCAweGVhLCAweDU4LCAweDRjLAorICAweGU1LCAweDVkLCAweDBhLCAweDc3LCAweDA1LCAweGVlLCAweGIzLCAweDI0LCAweGJmLCAweDhjLCAweDY0LCAweDdkLAorICAweDA5LCAweDJhLCAweDZhLCAweGIzLCAweGNiLCAweDNmLCAweDVmLCAweGNiLCAweGRkLCAweDAwLCAweGUwLCAweDIxLAorICAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweGZmLCAweDIxLCAweDczLCAweDgyLCAweGEyLCAweGM0LAorICAweDI4LCAweDI2LCAweDFhLCAweDg0LCAweDFjLCAweDJjLCAweGI3LCAweDBhLCAweDcxLCAweDUyLCAweGVjLCAweDUyLAorICAweDQxLCAweDE4LCAweDEwLCAweGMxLCAweDVjLCAweDhhLCAweDY2LCAweDg3LCAweDk0LCAweDMxLCAweGY4LCAweDZkLAorICAweGJjLCAweDE4LCAweGRjLCAweDRjLCAweDk5LCAweGM3LCAweGRiLCAweDVlLCAweGYzLCAweDZmLCAweGUwLCAweGE3LAorICAweGYyLCAweDY5LCAweDY0LCAweDE4LCAweGVmLCAweDJiLCAweDBiLCAweDQzLCAweDdlLCAweDA4LCAweDlhLCAweDE5LAorICAweGY5LCAweDRkLCAweGRkLCAweGNkLCAweDE5LCAweDJlLCAweGU2LCAweDgxLCAweGUyLCAweGZhLCAweGFiLCAweGI0LAorICAweGZjLCAweDBiLCAweGM4LCAweGJhLCAweGUyLCAweDBmLCAweDExLCAweDNhLCAweDViLCAweGZiLCAweGNkLCAweGE4LAorICAweDUzLCAweGIzLCAweDkyLCAweGRjLCAweDVjLCAweDY4LCAweGQ1LCAweDE1LCAweDdkLCAweGM4LCAweDFjLCAweDg5LAorICAweDRlLCAweGQzLCAweDkzLCAweDczLCAweDA0LCAweDQ5LCAweDBiLCAweDhlLCAweDkwLCAweGQ0LCAweDA3LCAweGQyLAorICAweGI5LCAweDhhLCAweGRhLCAweDYwLCAweDA0LCAweDE2LCAweDA2LCAweGVlLCAweDAxLCAweDU0LCAweGJlLCAweGU2LAorICAweDk1LCAweGFiLCAweDVkLCAweDE4LCAweDM0LCAweDA0LCAweDk5LCAweDFkLCAweGNjLCAweGNiLCAweDEwLCAweDdjLAorICAweGRjLCAweDZkLCAweDhmLCAweDgzLCAweGNmLCAweDBkLCAweDNjLCAweDhjLCAweDAwLCAweDQ2LCAweGZhLCAweDgxLAorICAweDM1LCAweDc1LCAweGMzLCAweGY0LCAweGMyLCAweGE5LCAweDA2LCAweDUzLCAweGQxLCAweDE3LCAweDEyLCAweDQ3LAorICAweDViLCAweDU2LCAweDBkLCAweDk0LCAweGYzLCAweDdlLCAweDI1LCAweDRlLCAweDRmLCAweGY3LCAweDMwLCAweDllLAorICAweGZmLCAweDllLCAweDBlLCAweGY1LCAweDVjLCAweDNhLCAweDg3LCAweDIxLCAweGJhLCAweGY2LCAweGFhLCAweDRiLAorICAweDNhLCAweGI4LCAweDFlLCAweGFmLCAweDI2LCAweGEwLCAweDAzLCAweDZiLCAweDdlLCAweGU5LCAweDQ0LCAweGZjLAorICAweGYwLCAweDE2LCAweDVkLCAweDc4LCAweDgzLCAweDViLCAweDdkLCAweDFiLCAweDlkLCAweGYxLCAweGI0LCAweDc3LAorICAweDAyLCAweDNlLCAweGQwLCAweDFhLCAweGM0LCAweDJiLCAweDlhLCAweDkwLCAweGU5LCAweGRlLCAweGE1LCAweGQwLAorICAweDg4LCAweGQ3LCAweDllLCAweDJiLCAweGYyLCAweDk2LCAweGQ4LCAweDJiLCAweGQ1LCAweDlhLCAweDMxLCAweGMzLAorICAweGYwLCAweGI1LCAweDExLCAweGE4LCAweDEzLCAweDRlLCAweGFkLCAweDg3LCAweDkxLCAweGIzLCAweDY0LCAweDZjLAorICAweDBjLCAweDZhLCAweGE4LCAweDBiLCAweDU5LCAweDYwLCAweGQ0LCAweGMyLCAweGFjLCAweDhiLCAweDNhLCAweDI5LAorICAweDU4LCAweDE4LCAweGRhLCAweDAxLCAweDIxLCAweDIyLCAweDU3LCAweDVkLCAweGRiLCAweDUxLCAweGEwLCAweDVlLAorICAweDczLCAweGM3LCAweDFjLCAweDM5LCAweDc3LCAweGY2LCAweDAwLCAweDFmLCAweDdmLCAweGUyLCAweDExLCAweGEwLAorICAweGQ4LCAweDQ2LCAweDFkLCAweDgwLCAweDA0LCAweGEyLCAweGEyLCAweGEyLCAweGFlLCAweGE1LCAweDRhLCAweDQ5LAorICAweDE0LCAweDJkLCAweDgwLCAweDg0LCAweGQ1LCAweDY0LCAweDhmLCAweDFiLCAweGM4LCAweDRiLCAweDg1LCAweGQ3LAorICAweGUxLCAweDA2LCAweGVjLCAweDZjLCAweDU1LCAweGQ4LCAweDkwLCAweDMxLCAweDFjLCAweGVjLCAweGQ0LCAweDZmLAorICAweDhlLCAweGUyLCAweGM0LCAweDliLCAweGFmLCAweDQxLCAweGE5LCAweGNiLCAweDJkLCAweDk0LCAweGY5LCAweGQ0LAorICAweGFhLCAweDA2LCAweGRiLCAweDk2LCAweDllLCAweDhmLCAweDQ2LCAweDU0LCAweGYyLCAweGViLCAweGFlLCAweDYzLAorICAweDllLCAweDlkLCAweGQyLCAweDc2LCAweDYxLCAweDE0LCAweDFiLCAweGU3LCAweDIzLCAweGUzLCAweGNkLCAweGU0LAorICAweDYyLCAweGYyLCAweGUxLCAweGMwLCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDdmLCAweGZmLAorICAweDFmLCAweDczLCAweDgzLCAweDIzLCAweDU4LCAweDY2LCAweDEwLCAweDQ3LCAweDFkLCAweGQ3LCAweGUwLCAweGVhLAorICAweDk2LCAweGFiLCAweGI1LCAweDViLCAweDJjLCAweDRhLCAweGM4LCAweDRhLCAweGJjLCAweDk0LCAweDM1LCAweGZlLAorICAweDQxLCAweDFjLCAweDk4LCAweDc5LCAweDNjLCAweDU5LCAweDA5LCAweGE0LCAweDRhLCAweDRmLCAweGRhLCAweGQ4LAorICAweGNiLCAweGFkLCAweDg3LCAweGY2LCAweDliLCAweGRiLCAweGE3LCAweGVlLCAweDE5LCAweDA3LCAweDk4LCAweDNlLAorICAweGExLCAweDhlLCAweGU2LCAweDFjLCAweGUyLCAweGU3LCAweGQ3LCAweGQ3LCAweDBmLCAweGE2LCAweDcwLCAweGRjLAorICAweDQ3LCAweGE4LCAweGVkLCAweDYxLCAweDdiLCAweDZjLCAweDhkLCAweDEzLCAweGE3LCAweGY2LCAweDI2LCAweDJmLAorICAweGY5LCAweGNlLCAweGEyLCAweGYxLCAweGE5LCAweDMwLCAweDMyLCAweGNjLCAweDQ5LCAweGE2LCAweDhmLCAweDdkLAorICAweDcyLCAweGZiLCAweGZhLCAweDZlLCAweDhlLCAweGJiLCAweDBmLCAweDU1LCAweDU1LCAweGYyLCAweDA0LCAweDYyLAorICAweGFiLCAweGExLCAweGU5LCAweGU3LCAweGYyLCAweGQ3LCAweGExLCAweGE4LCAweDQwLCAweDljLCAweDI3LCAweDI0LAorICAweGU1LCAweDVjLCAweGQ4LCAweDEyLCAweGQ3LCAweGEwLCAweDY3LCAweDkxLCAweGI5LCAweGIwLCAweDQwLCAweGJlLAorICAweDRmLCAweDQ0LCAweDdlLCAweDQ4LCAweDQ5LCAweGVkLCAweGJiLCAweDljLCAweDczLCAweDRkLCAweGYxLCAweDZkLAorICAweDVhLCAweGQyLCAweDU1LCAweDY1LCAweDZmLCAweGU5LCAweDUwLCAweDQ2LCAweGUyLCAweDc0LCAweDU3LCAweGFjLAorICAweDlkLCAweDFlLCAweDMyLCAweDU3LCAweDg3LCAweDA5LCAweDY3LCAweDhkLCAweDM2LCAweGZhLCAweDkzLCAweDI5LAorICAweDM2LCAweGNmLCAweDJiLCAweGViLCAweGRiLCAweDlmLCAweGIzLCAweGJlLCAweGU2LCAweDc3LCAweGMzLCAweDc0LAorICAweDUwLCAweDQwLCAweDM1LCAweGUyLCAweGIyLCAweDk0LCAweGY4LCAweDIyLCAweGQ0LCAweDY5LCAweGFlLCAweDM3LAorICAweGU0LCAweDE3LCAweDRmLCAweDRhLCAweDRlLCAweDI1LCAweGRkLCAweDdkLCAweDcwLCAweDEzLCAweGY4LCAweGMxLAorICAweGJmLCAweDEwLCAweGY3LCAweDFhLCAweDJjLCAweGM5LCAweGEzLCAweDVlLCAweDgzLCAweDAxLCAweDY3LCAweDJmLAorICAweGRiLCAweDJkLCAweDI3LCAweGIyLCAweDc0LCAweDc1LCAweGYyLCAweDVjLCAweDAwLCAweDkxLCAweGY1LCAweGNjLAorICAweDcxLCAweGQzLCAweDQxLCAweGYzLCAweGU2LCAweGUzLCAweGIzLCAweGIxLCAweDUxLCAweDg0LCAweGUxLCAweDM2LAorICAweDU0LCAweDBhLCAweGU4LCAweGRkLCAweDcyLCAweGY0LCAweDRkLCAweDY4LCAweGQzLCAweDUyLCAweGViLCAweDk0LAorICAweGIwLCAweDc0LCAweDIzLCAweGI0LCAweDI4LCAweDc4LCAweDkxLCAweGEyLCAweDRjLCAweDcxLCAweGIzLCAweDA5LAorICAweDk2LCAweDg5LCAweGY3LCAweGEwLCAweDE4LCAweGNhLCAweDEyLCAweDM1LCAweGY2LCAweDUwLCAweDk2LCAweDYwLAorICAweDczLCAweDUwLCAweGI3LCAweGRjLCAweGY0LCAweGJjLCAweGYyLCAweGQ3LCAweDMzLCAweGZkLCAweGE4LCAweGU1LAorICAweDRmLCAweGZmLCAweDI3LCAweDA3LCAweDQyLCAweGYyLCAweGUwLCAweGY5LCAweGZjLCAweDE0LCAweDIxLCAweDE4LAorICAweDJhLCAweDFkLCAweDgwLCAweDU0LCAweDBhLCAweDk1LCAweDAwLCAweGJjLCAweDgwLCAweDA0LCAweDQwLCAweDExLAorICAweGYxLCAweDAwLCAweDE1LCAweDMyLCAweDQ1LCAweDYyLCAweDcwLCAweGI1LCAweDA4LCAweGVjLCAweDk0LCAweGFiLAorICAweGZiLCAweDQyLCAweDlkLCAweGU3LCAweDE0LCAweGVlLCAweGMxLCAweDM0LCAweGYyLCAweDVmLCAweGMyLCAweDlhLAorICAweGJjLCAweDJkLCAweGRlLCAweDM4LCAweGM3LCAweGFjLCAweDcyLCAweDk3LCAweGFlLCAweDY3LCAweDg1LCAweGI1LAorICAweGU5LCAweDE1LCAweGExLCAweDBmLCAweGJhLCAweGM3LCAweGEyLCAweDcxLCAweGZlLCAweGE1LCAweGFiLCAweGY5LAorICAweGY4LCAweDE1LCAweDI5LCAweGJhLCAweDBmLCAweDFkLCAweDFlLCAweDQ1LCAweDdiLCAweDNmLCAweDg1LCAweDEyLAorICAweGUzLCAweDRhLCAweDRiLCAweDEwLCAweGFiLCAweDk0LCAweGQ4LCAweGM2LCAweDJkLCAweGVmLCAweGUzLCAweGFjLAorICAweDdkLCAweGZkLCAweDZlLCAweDAwLCAweDFjLCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAzLCAweGZmLAorICAweGZmLCAweDIxLCAweDczLCAweGEzLCAweDIzLCAweDk4LCAweDQ2LCAweDEwLCAweDM0LCAweGQzLCAweDg2LCAweDZiLAorICAweDRkLCAweDFhLCAweDUyLCAweGU2LCAweDU0LCAweDA4LCAweGE0LCAweDBjLCAweDEzLCAweGU5LCAweDQ4LCAweDI0LAorICAweGY1LCAweGE0LCAweDdmLCAweGQyLCAweGUzLCAweGQyLCAweGZjLCAweDg2LCAweGI2LCAweGIzLCAweDk5LCAweGZhLAorICAweGVjLCAweDZkLCAweDI1LCAweGJjLCAweDJlLCAweDVjLCAweDcxLCAweGY2LCAweDJkLCAweDFmLCAweDE2LCAweDRiLAorICAweDQ1LCAweDlkLCAweGNmLCAweGFlLCAweGE2LCAweDczLCAweDc5LCAweGM2LCAweGI2LCAweGM4LCAweGYwLCAweDBiLAorICAweDJiLCAweGIwLCAweDM5LCAweDVkLCAweGIzLCAweDRiLCAweGI5LCAweDU1LCAweDFjLCAweDk4LCAweGNjLCAweGMxLAorICAweGVhLCAweDEyLCAweGEzLCAweGI1LCAweDIyLCAweGRlLCAweGU2LCAweGQwLCAweGVlLCAweDI2LCAweGM0LCAweGUzLAorICAweDljLCAweDlhLCAweDVjLCAweGRhLCAweGYyLCAweDZjLCAweDU2LCAweGM3LCAweDMxLCAweDFiLCAweDBiLCAweDJlLAorICAweDc4LCAweDYxLCAweDUwLCAweDk2LCAweDM1LCAweGYzLCAweGY2LCAweDczLCAweDc2LCAweGYwLCAweDY2LCAweDA0LAorICAweGNlLCAweGYyLCAweDUxLCAweDRkLCAweDhjLCAweDUwLCAweDZhLCAweGFhLCAweGFlLCAweDE0LCAweGM4LCAweGNmLAorICAweDU0LCAweDMxLCAweDdiLCAweDA2LCAweDNkLCAweDZkLCAweDYxLCAweGVjLCAweDdmLCAweDJhLCAweDdkLCAweDY3LAorICAweDBkLCAweDk1LCAweDRlLCAweDE5LCAweDg0LCAweDUwLCAweGI4LCAweGQyLCAweGI1LCAweDhmLCAweGYwLCAweGIyLAorICAweGQ5LCAweDRjLCAweDI0LCAweDI4LCAweDdjLCAweGQwLCAweDEwLCAweGMzLCAweDBhLCAweDAwLCAweGYwLCAweDg1LAorICAweDBhLCAweDQ5LCAweDUyLCAweGFjLCAweGY3LCAweDNhLCAweDIzLCAweGU3LCAweDIxLCAweDE4LCAweDJiLCAweDk1LAorICAweDkyLCAweGJkLCAweDA4LCAweGE5LCAweGQ2LCAweDQ5LCAweDdkLCAweDQzLCAweGYzLCAweDNmLCAweDRhLCAweDI0LAorICAweDAwLCAweDE2LCAweDU3LCAweDhlLCAweGNmLCAweGM4LCAweDE0LCAweDQ1LCAweDE1LCAweGJhLCAweDE3LCAweDVmLAorICAweDc4LCAweGQxLCAweDFiLCAweDYzLCAweDQ2LCAweGU1LCAweGQzLCAweGM5LCAweDZhLCAweDYwLCAweDlkLCAweGEzLAorICAweGMyLCAweDg3LCAweGViLCAweDJkLCAweGE5LCAweGM3LCAweDlkLCAweDgzLCAweDg2LCAweDg2LCAweGI1LCAweGJlLAorICAweDRjLCAweDA4LCAweGQ3LCAweDc1LCAweGY0LCAweDNjLCAweDFlLCAweDM1LCAweGZlLCAweGRjLCAweDQ3LCAweDQ0LAorICAweDQ0LCAweDRjLCAweDBlLCAweDcyLCAweDlkLCAweGM2LCAweGUxLCAweDhhLCAweDViLCAweDhmLCAweGRlLCAweDI4LAorICAweDY5LCAweDNmLCAweDkwLCAweDc0LCAweDdmLCAweDgzLCAweGQyLCAweDI4LCAweDEyLCAweDUyLCAweDIxLCAweDk1LAorICAweGVjLCAweDc1LCAweGNkLCAweGRmLCAweDVjLCAweGZjLCAweDMwLCAweGIxLCAweDJiLCAweGRiLCAweDQ1LCAweGM0LAorICAweDI1LCAweDYyLCAweDcxLCAweDFlLCAweDg1LCAweGQyLCAweGJmLCAweDYzLCAweDk2LCAweDBmLCAweGJmLCAweDkxLAorICAweDVhLCAweDA5LCAweDg2LCAweDYxLCAweGQ4LCAweDAwLCAweDE0LCAweDJkLCAweDUyLCAweDgwLCAweDQwLCAweDU1LAorICAweGE2LCAweGMzLCAweGY3LCAweDU4LCAweDBiLCAweDZkLCAweDI5LCAweDdhLCAweDlhLCAweGMxLCAweGI5LCAweDU0LAorICAweDUwLCAweDAwLCAweDEzLCAweDBiLCAweDZmLCAweGJhLCAweDEwLCAweGI3LCAweDJlLCAweDk0LCAweDVhLCAweDcwLAorICAweGJjLCAweGZjLCAweGMzLCAweGY1LCAweDlhLCAweDM0LCAweDg5LCAweDBkLCAweGNmLCAweDRjLCAweDc3LCAweDE2LAorICAweGFmLCAweDcyLCAweDk5LCAweDg4LCAweDVmLCAweDM3LCAweDhiLCAweDlhLCAweDU0LCAweDBiLCAweGE4LCAweDk4LAorICAweGUwLCAweGEwLCAweDVjLCAweDk1LCAweGQ0LCAweGNkLCAweDEyLCAweGEyLCAweDM3LCAweDA5LCAweDJiLCAweDQxLAorICAweDc2LCAweGFkLCAweDJjLCAweGFlLCAweDFjLCAweDhiLCAweDI4LCAweGNhLCAweDJjLCAweGRkLCAweDY3LCAweDA5LAorICAweDJhLCAweGJiLCAweDA0LCAweGUwLCAweGJkLCAweGY4LCAweDc1LCAweGQ5LCAweGM1LCAweGI5LCAweGQwLCAweGY0LAorICAweDYxLCAweGMwLCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweGZmLCAweDE5LCAweDZmLAorICAweGE0LCAweGIwLCAweGQxLCAweDAyLCAweDE0LCAweDIzLCAweDA0LCAweGMyLCAweDAyLCAweDUzLCAweGNjLCAweDBkLAorICAweDI2LCAweGEwLCAweDgwLCAweDBjLCAweDQyLCAweDRkLCAweDhkLCAweDc4LCAweDQ5LCAweDZiLCAweDk0LCAweDEyLAorICAweDQyLCAweGQ5LCAweDI1LCAweDM5LCAweDc0LCAweDFhLCAweDQ5LCAweDNjLCAweDA0LCAweDYzLCAweDg0LCAweDk4LAorICAweGRkLCAweGM1LCAweGY5LCAweDhlLCAweGM1LCAweDI2LCAweDg0LCAweGEwLCAweDg3LCAweGZhLCAweDFkLCAweDI3LAorICAweGE0LCAweGFlLCAweDNmLCAweGQ0LCAweDFmLCAweGM4LCAweGY5LCAweGZiLCAweGVmLCAweDMwLCAweDVlLCAweDBmLAorICAweDU1LCAweDczLCAweDRmLCAweDMwLCAweDY2LCAweDQ5LCAweDI3LCAweDc0LCAweDQzLCAweDk5LCAweDdlLCAweDZkLAorICAweDM0LCAweGQzLCAweDRmLCAweDUwLCAweDg2LCAweGE0LCAweDMzLCAweDJlLCAweDAyLCAweGM1LCAweGE0LCAweDk4LAorICAweGZhLCAweGJiLCAweDVkLCAweDhlLCAweDRlLCAweGM0LCAweGM5LCAweDNmLCAweDVhLCAweGI5LCAweDQ3LCAweDE3LAorICAweGU3LCAweDc1LCAweDU2LCAweGE2LCAweGMwLCAweDY0LCAweGFlLCAweDNkLCAweDcyLCAweDg5LCAweDE4LCAweDBiLAorICAweDMyLCAweGEyLCAweDAxLCAweDM2LCAweDY1LCAweGVlLCAweGUzLCAweDM0LCAweDE3LCAweDQ5LCAweGFhLCAweGI3LAorICAweGY3LCAweGMwLCAweDVmLCAweGExLCAweDg0LCAweDhmLCAweDM3LCAweDFkLCAweDc3LCAweDU5LCAweDQ4LCAweGM2LAorICAweDk2LCAweGEzLCAweDA4LCAweDljLCAweGRmLCAweGQzLCAweGFmLCAweDg1LCAweDU3LCAweDE0LCAweGIwLCAweDk0LAorICAweDJlLCAweDgyLCAweGNlLCAweDBjLCAweDZhLCAweGEyLCAweDIyLCAweGQ0LCAweDQ3LCAweDI3LCAweDNhLCAweDViLAorICAweDFhLCAweGU1LCAweDk3LCAweDY2LCAweGExLCAweDViLCAweDA2LCAweDAwLCAweDI4LCAweGZkLCAweGJiLCAweDhlLAorICAweDVjLCAweDgwLCAweDMwLCAweDVhLCAweDdiLCAweGJkLCAweGZkLCAweDQ3LCAweDJkLCAweDA5LCAweDhhLCAweGJmLAorICAweDVkLCAweGQxLCAweDcwLCAweGQ3LCAweDZkLCAweDUzLCAweDczLCAweDJjLCAweDE1LCAweGNjLCAweGI5LCAweDVhLAorICAweDczLCAweGMxLCAweGY3LCAweGJlLCAweDJjLCAweDE2LCAweDVmLCAweDQ3LCAweGRjLCAweGJmLCAweGMyLCAweGRmLAorICAweGExLCAweDc5LCAweDU5LCAweGQzLCAweDNiLCAweDA5LCAweDA2LCAweDIwLCAweDQzLCAweDhlLCAweDE5LCAweGJkLAorICAweGEwLCAweDk3LCAweGExLCAweDIzLCAweDI5LCAweDUwLCAweGQ3LCAweGFkLCAweDk2LCAweDMxLCAweDY0LCAweGNkLAorICAweDNmLCAweDY3LCAweGU5LCAweDEyLCAweDA4LCAweDYwLCAweDU4LCAweDAzLCAweDRjLCAweDZiLCAweDcwLCAweGMxLAorICAweGRlLCAweGJlLCAweDM3LCAweGE0LCAweDMyLCAweDVlLCAweGNjLCAweDRkLCAweDliLCAweDU3LCAweGQ1LCAweDEzLAorICAweGVhLCAweDM3LCAweGI4LCAweDc1LCAweDE3LCAweDU0LCAweGI2LCAweGY4LCAweDc1LCAweDNmLCAweGZmLCAweDU3LAorICAweDllLCAweDdiLCAweDIwLCAweDdlLCAweGZmLCAweDg4LCAweDQ0LCAweDQzLCAweDQwLCAweGIwLCAweDg0LCAweDNiLAorICAweDAwLCAweDAwLCAweDk0LCAweDUyLCAweDAyLCAweDU0LCAweGE0LCAweDA4LCAweGMwLCAweDAwLCAweGIyLCAweGI0LAorICAweDUwLCAweDgzLCAweGE3LCAweGI4LCAweGM2LCAweDg4LCAweDMzLCAweDQ2LCAweGVjLCAweDQ4LCAweDJkLCAweDJmLAorICAweGYyLCAweGMxLCAweDBmLCAweGQ1LCAweGMzLCAweDNkLCAweDE5LCAweGE5LCAweDc3LCAweDM0LCAweDBkLCAweGM2LAorICAweDI2LCAweDg0LCAweDI0LCAweDM3LCAweGM4LCAweDBhLCAweGMyLCAweDkzLCAweDlkLCAweGEzLCAweDJkLCAweDZhLAorICAweDExLCAweDM1LCAweDgzLCAweDEyLCAweDQ1LCAweGFhLCAweDk0LCAweDYzLCAweDk3LCAweGQzLCAweDM3LCAweDVjLAorICAweDIxLCAweGMwLCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDNmLCAweDMxLCAweDcyLAorICAweDg0LCAweDIzLCAweDE4LCAweDZhLCAweDE2LCAweGEyLCAweGVhLCAweGZhLCAweDNkLCAweDkxLCAweDhlLCAweDk1LAorICAweDcyLCAweDU0LCAweGQ1LCAweDA1LCAweDIwLCAweDA4LCAweDE4LCAweDlmLCAweDNlLCAweGU4LCAweGFkLCAweDE3LAorICAweGVmLCAweDZkLCAweGUwLCAweDdjLCAweGM0LCAweDM3LCAweDI1LCAweDczLCAweGNkLCAweGNkLCAweDliLCAweDIzLAorICAweDJiLCAweGRlLCAweDc2LCAweDI1LCAweGNkLCAweDJkLCAweDFhLCAweDYyLCAweGVlLCAweDNjLCAweDJiLCAweDFkLAorICAweGU1LCAweGJlLCAweDM1LCAweGQyLCAweDM3LCAweDQxLCAweDJkLCAweDMwLCAweGVlLCAweDFlLCAweGI2LCAweGJkLAorICAweDVmLCAweDk0LCAweDlkLCAweGYzLCAweGIxLCAweDM4LCAweDY1LCAweGZlLCAweDczLCAweGNiLCAweDFlLCAweGNiLAorICAweDdhLCAweGE2LCAweDViLCAweDcyLCAweGM5LCAweDY1LCAweDY0LCAweDdjLCAweGYxLCAweGE0LCAweGYzLCAweGU2LAorICAweDE1LCAweDcxLCAweDI4LCAweGQyLCAweGQxLCAweGViLCAweGM3LCAweDA3LCAweGRjLCAweGFjLCAweDVkLCAweGNhLAorICAweDc0LCAweDZkLCAweGExLCAweDc4LCAweDNiLCAweDk5LCAweGQzLCAweDcwLCAweDU3LCAweDhmLCAweDhjLCAweDI0LAorICAweDZiLCAweGM0LCAweGMzLCAweDQ3LCAweGIxLCAweGUyLCAweGFmLCAweDhkLCAweDE2LCAweGI2LCAweDVlLCAweDQ2LAorICAweGVlLCAweDVlLCAweDdmLCAweDk1LCAweDMwLCAweDc0LCAweDJjLCAweDM2LCAweDRjLCAweDFhLCAweGUxLCAweDM3LAorICAweGRhLCAweDA0LCAweGJjLCAweDJkLCAweDQwLCAweGZhLCAweGNmLCAweDQyLCAweDY4LCAweDU2LCAweGI0LCAweDVjLAorICAweDgyLCAweDk2LCAweDYwLCAweDRmLCAweGVmLCAweDdkLCAweDgzLCAweDI4LCAweGNiLCAweGIyLCAweDAwLCAweDJjLAorICAweDBiLCAweGYzLCAweGUzLCAweGM4LCAweGI4LCAweDVjLCAweDM1LCAweGJkLCAweDc1LCAweDZmLCAweDZjLCAweDA5LAorICAweDIzLCAweDQ1LCAweGVhLCAweGE4LCAweDA1LCAweDRlLCAweDQyLCAweDBjLCAweDk5LCAweDAwLCAweDVmLCAweDIxLAorICAweDA4LCAweGFmLCAweDhiLCAweDk3LCAweDMxLCAweDg0LCAweDFiLCAweGFmLCAweGVjLCAweDM2LCAweDcyLCAweDFiLAorICAweGVmLCAweGY3LCAweDg0LCAweDRiLCAweDQxLCAweDkzLCAweDg4LCAweDYyLCAweDhiLCAweGMxLCAweGVmLCAweGIxLAorICAweDk2LCAweGRmLCAweGM1LCAweDc3LCAweDM4LCAweDZhLCAweDBhLCAweDNhLCAweDc1LCAweGJiLCAweGI4LCAweDFmLAorICAweDg0LCAweGIwLCAweDYxLCAweDlkLCAweDYzLCAweGI2LCAweDQzLCAweDdmLCAweDllLCAweDhiLCAweGY1LCAweGRlLAorICAweDEyLCAweGIyLCAweDQ0LCAweGE4LCAweDg3LCAweDc1LCAweDI1LCAweDczLCAweDhkLCAweGFlLCAweDc1LCAweDRiLAorICAweDcwLCAweDk1LCAweGNiLCAweDFhLCAweDU2LCAweGM1LCAweDY2LCAweDBhLCAweGI0LCAweGQwLCAweGJhLCAweDU5LAorICAweGU4LCAweDlkLCAweGFjLCAweDhlLCAweDM5LCAweDU5LCAweDljLCAweGZkLCAweDc2LCAweDhhLCAweGQ1LCAweDM2LAorICAweDNiLCAweDU3LCAweDNjLCAweDdhLCAweDM3LCAweGM3LCAweGJmLCAweGZkLCAweDAwLCAweDBmLCAweDlmLCAweGYzLAorICAweDIwLCAweDU4LCAweDZhLCAweDFkLCAweDgwLCAweDBhLCAweDQwLCAweDAyLCAweDY1LCAweGQwLCAweDhhLCAweDk1LAorICAweDBhLCAweDBhLCAweDJmLCAweDg1LCAweGJkLCAweDQ4LCAweDU4LCAweDE1LCAweDBhLCAweGNjLCAweGM4LCAweDI4LAorICAweDg5LCAweGE3LCAweDBlLCAweDMwLCAweGQ4LCAweGQzLCAweDVhLCAweDVkLCAweDc3LCAweDZkLCAweDM1LCAweGQxLAorICAweDQ5LCAweDJkLCAweDc2LCAweDM1LCAweDU1LCAweGI0LCAweDA2LCAweGFhLCAweDQ2LCAweDA0LCAweDk4LCAweDk2LAorICAweDJiLCAweDQ5LCAweDk3LCAweGU1LCAweGE0LCAweDQ3LCAweGRkLCAweGYyLCAweGUwLCAweDAxLCAweGMwLCAweDIxLAorICAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDFkLCAweDcxLCAweGE0LCAweDMwLCAweDUwLAorICAweDhjLCAweDE0LCAweDMzLCAweDExLCAweDAyLCAweDA1LCAweGViLCAweDZlLCAweDlhLCAweGIxLCAweDFkLCAweDE1LAorICAweGEzLCAweDI2LCAweDU4LCAweDJhLCAweGNhLCAweGJlLCAweDQ1LCAweDYyLCAweDYyLCAweDEwLCAweDI1LCAweDkzLAorICAweDM4LCAweGJiLCAweDhhLCAweDU3LCAweDZmLCAweDllLCAweDEzLCAweDk3LCAweDM3LCAweGYxLCAweDVkLCAweDg1LAorICAweDkwLCAweDk5LCAweGFhLCAweDMwLCAweDIyLCAweDcwLCAweDgzLCAweGFmLCAweDk2LCAweGI0LCAweGM2LCAweGEzLAorICAweGM2LCAweDU0LCAweDg0LCAweDliLCAweGFhLCAweDhkLCAweDQzLCAweGRlLCAweGRjLCAweDNhLCAweDRhLCAweGU0LAorICAweGJlLCAweGJkLCAweDljLCAweDdhLCAweGNiLCAweGQ4LCAweDNjLCAweGUyLCAweGYwLCAweDliLCAweDIxLCAweGZiLAorICAweDQyLCAweDQ2LCAweDkzLCAweDBkLCAweDQ0LCAweGJiLCAweDgzLCAweDU3LCAweDAyLCAweGM2LCAweGVlLCAweGI5LAorICAweGU1LCAweGM1LCAweDhhLCAweGQyLCAweDdjLCAweDMxLCAweDhiLCAweDA4LCAweDM4LCAweGI3LCAweGY5LCAweDhkLAorICAweDQ5LCAweDM3LCAweDRmLCAweGFlLCAweGFiLCAweDk0LCAweDYyLCAweGE4LCAweGEwLCAweDMyLCAweGVjLCAweDEwLAorICAweDZmLCAweGY5LCAweDJhLCAweGMzLCAweDQ3LCAweGMxLCAweDcyLCAweGVlLCAweDM5LCAweGEwLCAweDNkLCAweDU0LAorICAweGYyLCAweDU3LCAweDAwLCAweDI0LCAweDMwLCAweDc5LCAweDI5LCAweDU3LCAweDM2LCAweDI1LCAweGQ1LCAweDNjLAorICAweGMxLCAweDQyLCAweGNkLCAweDVhLCAweDA0LCAweDlkLCAweDY2LCAweGNkLCAweDYyLCAweGRhLCAweDFkLCAweDE5LAorICAweDkyLCAweDY5LCAweDVkLCAweDQwLCAweGI2LCAweDQwLCAweDkwLCAweDZkLCAweDc3LCAweDliLCAweDRlLCAweGFiLAorICAweDJjLCAweDY2LCAweDM4LCAweGZmLCAweDA1LCAweDQ2LCAweGFkLCAweGJlLCAweDFhLCAweDQzLCAweDZjLCAweGQ3LAorICAweGY2LCAweDhmLCAweGViLCAweDhmLCAweGM3LCAweDQ3LCAweDc0LCAweDMxLCAweDAxLCAweGQxLCAweGRhLCAweDc2LAorICAweGI0LCAweDdkLCAweDA2LCAweDY5LCAweGI5LCAweGUzLCAweDliLCAweGE4LCAweGI4LCAweDk0LCAweDM5LCAweDQwLAorICAweDNmLCAweDY1LCAweDQ5LCAweDhkLCAweDhkLCAweDMxLCAweGQ2LCAweGQzLCAweDM2LCAweGM4LCAweDVmLCAweGM5LAorICAweGI2LCAweGNhLCAweDgyLCAweDM5LCAweDRmLCAweDU5LCAweDlkLCAweDUyLCAweGI5LCAweDhmLCAweGNhLCAweGY3LAorICAweDQ1LCAweGRlLCAweDZmLCAweDAxLCAweDUwLCAweGQ1LCAweDE1LCAweDQxLCAweDMzLCAweGFlLCAweDZlLCAweDE4LAorICAweDAxLCAweDRhLCAweDQ4LCAweDE3LCAweDZmLCAweDg4LCAweDFhLCAweGJlLCAweGJmLCAweDc4LCAweGRiLCAweGZjLAorICAweDE2LCAweDFjLCAweGY4LCAweDNiLCAweDM4LCAweDY3LCAweDdjLCAweDQ3LCAweDk2LCAweDg5LCAweDZlLCAweDg1LAorICAweDA5LCAweDJkLCAweDE1LCAweDkyLCAweDY2LCAweGMyLCAweGU4LCAweDdiLCAweDYyLCAweDFkLCAweGNlLCAweDYxLAorICAweDYxLCAweDM5LCAweDgwLCAweGFmLCAweGE0LCAweGE3LCAweDI5LCAweDBiLCAweDU2LCAweDJmLCAweDE3LCAweDY4LAorICAweGM3LCAweGM3LCAweGZhLCAweGYzLCAweGRkLCAweGRiLCAweDZmLCAweDdlLCAweGY5LCAweGYxLCAweDFmLCAweGFkLAorICAweDdkLCAweGQxLCAweGRkLCAweGRkLCAweGYzLCAweGY2LCAweDI5LCAweDQxLCAweDMwLCAweGQ0LCAweDNiLCAweDAwLAorICAweDBhLCAweDg0LCAweGM4LCAweGE5LCAweDUxLCAweDYwLCAweDA4LCAweDRhLCAweDBhLCAweDdkLCAweGEzLCAweDg1LAorICAweDMyLCAweDczLCAweGZiLCAweGQyLCAweDE1LCAweGI1LCAweDlkLCAweDYyLCAweDI1LCAweDVjLCAweDEzLCAweGM4LAorICAweGZkLCAweGRhLCAweGI4LCAweDEwLCAweDhlLCAweDRjLCAweGQ4LCAweGU4LCAweGFkLCAweGExLCAweDNhLCAweGJjLAorICAweDM3LCAweDZlLCAweGM5LCAweGMyLCAweDA4LCAweDE1LCAweDI2LCAweGM3LCAweDc4LCAweDRlLCAweGRlLCAweDkzLAorICAweGQ1LCAweGE0LCAweDg0LCAweDgwLCAweGQwLCAweGJhLCAweDBjLCAweGRmLCAweGE5LCAweGRlLCAweGIwLCAweDE1LAorICAweGIyLCAweGZkLCAweGM2LCAweDM0LCAweGQxLCAweDQzLCAweGM0LCAweDk1LCAweDg5LCAweGQyLCAweDQyLCAweGI0LAorICAweGFiLCAweDIxLCAweDU1LCAweDc0LCAweGY1LCAweGUyLCAweGNlLCAweDczLCAweDZiLCAweDhjLCAweGE2LCAweDAwLAorICAweDAxLCAweDk4LCAweGQyLCAweGMxLCAweDc5LCAweGU2LCAweGExLCAweDRkLCAweGZlLCAweGZmLCAweDY3LCAweDQ2LAorICAweDM5LCAweDcwLCAweGVkLCAweDgwLCAweDBlLCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweGZmLAorICAweGZmLCAweDFkLCAweDZjLCAweGE2LCAweDMwLCAweGQwLCAweGU0LCAweDM0LCAweDBiLCAweDBjLCAweGMyLCAweDAxLAorICAweGE1LCAweGRiLCAweDhmLCAweDU3LCAweGFlLCAweDFhLCAweDQ1LCAweGVlLCAweGYyLCAweDEyLCAweDkyLCAweDg5LAorICAweDJhLCAweDZjLCAweDVhLCAweDQ2LCAweDI0LCAweGQxLCAweDkxLCAweDRhLCAweGVjLCAweDQyLCAweDY1LCAweDY1LAorICAweDUwLCAweGE4LCAweDk5LCAweDQyLCAweDRkLCAweDUwLCAweDc4LCAweDFiLCAweGY3LCAweGI1LCAweDNlLCAweGEzLAorICAweGM1LCAweDdhLCAweGMyLCAweGEzLCAweDE3LCAweDQ0LCAweDY0LCAweDAwLCAweGI5LCAweDdmLCAweDNmLCAweDNkLAorICAweDQ3LCAweDdkLCAweDkzLCAweDU4LCAweDBlLCAweDk3LCAweGVhLCAweDI4LCAweGRmLCAweDEzLCAweGZmLCAweGI1LAorICAweDlmLCAweGQ0LCAweGZlLCAweDdlLCAweDhiLCAweGNmLCAweDc1LCAweGFjLCAweGY1LCAweGFjLCAweDk3LCAweGIwLAorICAweDU0LCAweDA5LCAweDliLCAweDkxLCAweGI3LCAweGNmLCAweDc0LCAweGRhLCAweGZlLCAweDIzLCAweDM3LCAweGQ4LAorICAweDdjLCAweDZkLCAweDllLCAweDFlLCAweDA1LCAweGU2LCAweDJmLCAweDM4LCAweGQ5LCAweDU5LCAweDQwLCAweDI2LAorICAweDI2LCAweGI5LCAweDAzLCAweDgxLCAweGE3LCAweGQxLCAweGM1LCAweDI1LCAweDVmLCAweDRlLCAweDJhLCAweGQwLAorICAweDFkLCAweGQ4LCAweDNjLCAweDc4LCAweDViLCAweDcwLCAweGY4LCAweGY5LCAweGU5LCAweGU4LCAweDJjLCAweGFlLAorICAweGU1LCAweDZlLCAweDQ5LCAweDEzLCAweGVkLCAweGZkLCAweDUyLCAweDlhLCAweDQxLCAweGUwLCAweGQwLCAweGI1LAorICAweGI2LCAweGYyLCAweDI1LCAweDgyLCAweDFjLCAweDgyLCAweDgzLCAweDI1LCAweDk4LCAweDJhLCAweGU3LCAweDhkLAorICAweDA4LCAweGQwLCAweDI0LCAweDhjLCAweDA0LCAweGE1LCAweDc0LCAweDRhLCAweDg0LCAweDZiLCAweDgyLCAweDI3LAorICAweDg0LCAweGViLCAweDQ1LCAweGIzLCAweDc5LCAweDVjLCAweDdlLCAweDU4LCAweDVjLCAweDVlLCAweDJmLCAweDFjLAorICAweDQ1LCAweDgwLCAweDM1LCAweDdlLCAweDA0LCAweDMxLCAweGVmLCAweDY3LCAweDgyLCAweDMwLCAweGZjLCAweGE1LAorICAweGJjLCAweGVlLCAweDJmLCAweDQ3LCAweDYzLCAweDQzLCAweDZkLCAweDM2LCAweDRlLCAweDU5LCAweGMwLCAweDIxLAorICAweGUxLCAweGJhLCAweDg0LCAweDc1LCAweDZjLCAweGE4LCAweDIxLCAweDIxLCAweDk2LCAweDI0LCAweDcwLCAweGRlLAorICAweDRmLCAweGI4LCAweDEwLCAweDg0LCAweDBjLCAweDE3LCAweDg3LCAweDA5LCAweDgyLCAweGNlLCAweDk5LCAweGVlLAorICAweGViLCAweDIxLCAweDdiLCAweGE1LCAweGFkLCAweGE4LCAweDY5LCAweDk2LCAweGYzLCAweDNiLCAweGU3LCAweDc5LAorICAweDg4LCAweDc4LCAweGI0LCAweDhjLCAweGYzLCAweDYzLCAweDM0LCAweGUwLCAweGZiLCAweDAzLCAweDczLCAweDE4LAorICAweGExLCAweDVjLCAweGQ3LCAweDE1LCAweGQyLCAweGY3LCAweDg2LCAweGJlLCAweGZlLCAweGRlLCAweDE3LCAweDExLAorICAweDdkLCAweDFlLCAweDFjLCAweGJlLCAweDc4LCAweDNlLCAweDdlLCAweGM1LCAweDI4LCAweDM2LCAweDEyLCAweDg3LAorICAweDYwLCAweDAwLCAweDU0LCAweDE1LCAweDE1LCAweDZjLCAweDAwLCAweDA0LCAweDBkLCAweDhiLCAweGQ4LCAweDk4LAorICAweDBiLCAweGE0LCAweDI5LCAweDZhLCAweDIyLCAweGFhLCAweGUwLCAweDA1LCAweDZkLCAweGFmLCAweDc3LCAweGJkLAorICAweDE5LCAweGY2LCAweGJjLCAweGE1LCAweDVkLCAweDJkLCAweGI2LCAweDBjLCAweDMzLCAweDliLCAweDE2LCAweGU3LAorICAweDBhLCAweGY0LCAweDVkLCAweGU3LCAweGMyLCAweDQ1LCAweDA0LCAweGNkLCAweDU2LCAweDNiLCAweGQ3LCAweDAzLAorICAweDU5LCAweGM3LCAweGZkLCAweDlhLCAweDc0LCAweDNmLCAweDdkLCAweDU3LCAweGY4LCAweDgwLCAweDZlLCAweDc4LAorICAweDRlLCAweGM2LCAweDMzLCAweDZmLCAweDVjLCAweDI4LCAweDViLCAweDI1LCAweGI3LCAweDRjLCAweGNkLCAweDIwLAorICAweGNlLCAweDY3LCAweDdlLCAweDUyLCAweDU5LCAweDE0LCAweGQzLCAweDZlLCAweGY4LCAweDZkLCAweGI5LCAweGNmLAorICAweDdmLCAweGI3LCAweGE3LCAweDgwLCAweDA3LCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDdmLAorICAweGZmLCAweDIxLCAweDZmLCAweGEzLCAweGMwLCAweGQ4LCAweDY4LCAweGE2LCAweDFhLCAweDg0LCAweDEzLCAweGM4LAorICAweDI3LCAweDE0LCAweGUxLCAweDVhLCAweDhhLCAweGQ0LCAweGE4LCAweGM0LCAweGM1LCAweDg0LCAweDMwLCAweDZiLAorICAweGYyLCAweDYxLCAweDk1LCAweDgzLCAweGI2LCAweGRlLCAweDI1LCAweDBjLCAweDBjLCAweGE4LCAweGFhLCAweDg0LAorICAweDRiLCAweDFjLCAweGRmLCAweGNiLCAweDM4LCAweDU3LCAweGY3LCAweDJjLCAweDIyLCAweDExLCAweDg3LCAweGY0LAorICAweDA0LCAweGQ0LCAweGFlLCAweGUyLCAweGZiLCAweDM2LCAweDAwLCAweDg5LCAweDY5LCAweDE3LCAweDg1LCAweDA4LAorICAweDFlLCAweDQ5LCAweDQzLCAweDk4LCAweGU3LCAweGI5LCAweDFiLCAweGE3LCAweGFmLCAweGI4LCAweGZhLCAweDQ0LAorICAweDZiLCAweGMyLCAweDM1LCAweGZlLCAweDhjLCAweGIwLCAweGY4LCAweDY1LCAweDAwLCAweGI4LCAweDY2LCAweDZmLAorICAweGQ4LCAweDdhLCAweDA1LCAweGQzLCAweGM2LCAweDYzLCAweGRjLCAweDNiLCAweDg0LCAweDc1LCAweGFhLCAweGEzLAorICAweDViLCAweGU4LCAweDVhLCAweGU2LCAweDM1LCAweGNmLCAweGY0LCAweGRlLCAweGQ3LCAweDFhLCAweDgxLCAweDZmLAorICAweDk2LCAweDRjLCAweDliLCAweDE5LCAweDUyLCAweGM1LCAweDNhLCAweDliLCAweDBjLCAweGY4LCAweGQxLCAweGEyLAorICAweGM3LCAweDBjLCAweDJjLCAweDk1LCAweGRjLCAweDI4LCAweGFmLCAweDY1LCAweDY2LCAweGU4LCAweDM0LCAweDFlLAorICAweDAyLCAweDlmLCAweDZhLCAweDBhLCAweDYwLCAweDRlLCAweDllLCAweDI2LCAweGIzLCAweDJiLCAweDY3LCAweDVjLAorICAweDE5LCAweGI2LCAweDAyLCAweDAyLCAweDRjLCAweDY4LCAweGQzLCAweDI0LCAweGYzLCAweGMyLCAweDg4LCAweDNhLAorICAweDgwLCAweGJmLCAweDBjLCAweDYzLCAweDgxLCAweDA5LCAweDZmLCAweGFhLCAweGEyLCAweDNhLCAweGI0LCAweDc0LAorICAweGVkLCAweDg4LCAweDBiLCAweDAyLCAweDliLCAweDc1LCAweDVkLCAweDJmLCAweDM3LCAweDhmLCAweDM3LCAweDAxLAorICAweDc1LCAweDJkLCAweGViLCAweDVhLCAweDg2LCAweGJiLCAweGI4LCAweGZlLCAweDliLCAweDEzLCAweDY2LCAweGQyLAorICAweDUyLCAweDA0LCAweDI2LCAweDZjLCAweDlkLCAweDJiLCAweDJmLCAweGE5LCAweDAzLCAweGQxLCAweGM3LCAweDFiLAorICAweDIzLCAweDc4LCAweDJiLCAweDg4LCAweDQ5LCAweDkwLCAweDAyLCAweDQ3LCAweGJkLCAweGRiLCAweGNkLCAweDVkLAorICAweDNlLCAweDIxLCAweGM0LCAweDQ3LCAweDkwLCAweDFmLCAweDk1LCAweDkxLCAweDUxLCAweGExLCAweGNkLCAweGY1LAorICAweGM3LCAweDgwLCAweDAyLCAweDA1LCAweDE4LCAweDZjLCAweDExLCAweGU3LCAweDU4LCAweGM0LCAweDBkLCAweDA3LAorICAweGViLCAweDBiLCAweGFmLCAweDdlLCAweDZmLCAweGM3LCAweDA5LCAweDk1LCAweDRhLCAweGYzLCAweDZiLCAweDhjLAorICAweDAwLCAweDA5LCAweDNiLCAweGM2LCAweDQ2LCAweDUwLCAweDlkLCAweGJkLCAweDcxLCAweGQ3LCAweGJiLCAweDhhLAorICAweDA5LCAweDYzLCAweDY3LCAweDc3LCAweDUwLCAweGUzLCAweGRmLCAweDg1LCAweDI1LCAweDEyLCAweDc0LCAweDYzLAorICAweDFjLCAweGZkLCAweDlkLCAweDk1LCAweDAwLCAweDBmLCAweDlmLCAweGMwLCAweDI4LCAweDkxLCAweDAyLCAweGMzLAorICAweDUwLCAweGVjLCAweGE5LCAweDUxLCAweDI4LCAweGE4LCAweDA1LCAweDQ5LCAweDQ5LCAweDgwLCAweDIwLCAweDM5LAorICAweDRjLCAweGRhLCAweGM5LCAweGI1LCAweDZhLCAweDk0LCAweDdmLCAweDNhLCAweDcyLCAweGJiLCAweDhkLCAweDZiLAorICAweGNhLCAweDhjLCAweDk5LCAweGE3LCAweGU1LCAweGMxLCAweDMyLCAweDAzLCAweDdiLCAweGQ2LCAweDhjLCAweDNjLAorICAweGNlLCAweDRkLCAweDI5LCAweGVjLCAweDllLCAweDYwLCAweDE1LCAweDE2LCAweDY0LCAweGJlLCAweDQwLCAweDAyLAorICAweDY5LCAweDQ1LCAweGU3LCAweDNjLCAweDZjLCAweGJiLCAweDJjLCAweDk2LCAweGMyLCAweDE3LCAweDYxLCAweGVhLAorICAweGI1LCAweDBmLCAweDg0LCAweDkxLCAweDRkLCAweGFkLCAweDM3LCAweDg3LCAweDczLCAweDk2LCAweGY1LCAweGVjLAorICAweDkwLCAweDBlLCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDFiLCAweDZmLAorICAweGE1LCAweDMwLCAweDkxLCAweDZjLCAweDMzLCAweDA4LCAweDA1LCAweGQ5LCAweGMxLCAweDFhLCAweDZhLCAweDkzLAorICAweDU0LCAweDA1LCAweDEwLCAweDQ4LCAweGMxLCAweDU4LCAweDFiLCAweGQ3LCAweGIyLCAweDFkLCAweDFjLCAweDdhLAorICAweGRlLCAweDkyLCAweDI2LCAweDQxLCAweDc5LCAweDE1LCAweDBmLCAweDc0LCAweDgwLCAweDkwLCAweDQ5LCAweDIwLAorICAweDk4LCAweDJlLCAweGY1LCAweGQ3LCAweDQzLCAweDk1LCAweDRkLCAweGQ0LCAweDdmLCAweGU4LCAweGUzLCAweGRjLAorICAweGEwLCAweDRkLCAweGE4LCAweDk3LCAweDUxLCAweGU3LCAweDdmLCAweGE0LCAweGZhLCAweDBmLCAweGNmLCAweGI4LAorICAweGYwLCAweDk5LCAweDFmLCAweDljLCAweGE5LCAweDVlLCAweGYzLCAweGVkLCAweDVkLCAweGZjLCAweGU4LCAweGY5LAorICAweDVjLCAweGY1LCAweGJmLCAweDMxLCAweDI5LCAweDUwLCAweGQxLCAweDVjLCAweDI3LCAweDYxLCAweGZmLCAweDczLAorICAweGNmLCAweDgyLCAweGRiLCAweGIzLCAweDZlLCAweDZkLCAweDdmLCAweGIxLCAweDZkLCAweDRmLCAweDhhLCAweGIyLAorICAweDU5LCAweDBkLCAweDUzLCAweGUyLCAweDMyLCAweDRkLCAweGNkLCAweDk4LCAweGEzLCAweGI4LCAweGQ4LCAweGI2LAorICAweDNkLCAweDNhLCAweGRiLCAweDA4LCAweDMwLCAweGIyLCAweDQwLCAweGFhLCAweDA0LCAweGZjLCAweDM1LCAweDlhLAorICAweDE2LCAweGExLCAweDgwLCAweDQ2LCAweGEzLCAweDFiLCAweGI3LCAweGFlLCAweGE5LCAweGQ0LCAweDVkLCAweGU2LAorICAweGQ1LCAweDU0LCAweGU5LCAweDY4LCAweGY1LCAweGU3LCAweDk5LCAweDZhLCAweGQ0LCAweGJjLCAweDNmLCAweGQxLAorICAweGJjLCAweDRjLCAweDRkLCAweDNlLCAweGY4LCAweDAyLCAweGU1LCAweDk3LCAweDFmLCAweGYzLCAweDVkLCAweDkzLAorICAweDk4LCAweDlkLCAweDMxLCAweDZjLCAweGE4LCAweDMxLCAweDJhLCAweGQ3LCAweDUwLCAweGQyLCAweGViLCAweDM4LAorICAweDU0LCAweDc1LCAweDVlLCAweGY2LCAweGMxLCAweDcwLCAweDU0LCAweDIxLCAweDkyLCAweDUxLCAweGU1LCAweDY2LAorICAweGFjLCAweDYzLCAweDNlLCAweDkwLCAweGI0LCAweDg2LCAweDY1LCAweGViLCAweDQzLCAweGM1LCAweGZmLCAweDdhLAorICAweDBjLCAweDM3LCAweDFjLCAweGYzLCAweGI3LCAweDIzLCAweDJiLCAweDU3LCAweDlkLCAweDVmLCAweDhiLCAweDEwLAorICAweGEyLCAweDQxLCAweDIyLCAweDAwLCAweDk5LCAweDBjLCAweDYyLCAweDA2LCAweDNlLCAweDViLCAweGUzLCAweDM0LAorICAweGEwLCAweDVhLCAweGVjLCAweDM4LCAweDA0LCAweDYxLCAweDI2LCAweDdkLCAweDlkLCAweGZkLCAweDY1LCAweGJjLAorICAweDliLCAweDdmLCAweDFjLCAweDBmLCAweDRjLCAweDlmLCAweGRmLCAweDZhLCAweGEwLCAweDc1LCAweDA2LCAweDc3LAorICAweDMzLCAweGI3LCAweDU2LCAweDY0LCAweGRhLCAweGFhLCAweDViLCAweDY0LCAweGFlLCAweGZlLCAweGYxLCAweGFlLAorICAweGU3LCAweDc3LCAweGJiLCAweDBkLCAweGUxLCAweGE2LCAweDI3LCAweGYyLCAweDNjLCAweGJlLCAweDEzLCAweGVjLAorICAweGEzLCAweGE3LCAweGE2LCAweGIyLCAweDU3LCAweGZlLCAweGJhLCAweGY3LCAweGVhLCAweGVhLCAweGQ5LCAweGQ1LAorICAweDVkLCAweGQ1LCAweDcxLCAweDVlLCAweGZkLCAweDc5LCAweDBmLCAweGQzLCAweDdjLCAweDlmLCAweGRjLCAweDlmLAorICAweDA0LCAweDFmLCAweDdmLCAweDYyLCAweDcyLCAweDFhLCAweDA5LCAweDg0LCAweGExLCAweGU2LCAweDBhLCAweDg5LAorICAweDQyLCAweGEwLCAweDE1LCAweDJhLCAweDIwLCAweDA4LCAweDEwLCAweDBmLCAweDBjLCAweDQwLCAweDM3LCAweDJlLAorICAweDAwLCAweGVmLCAweGE1LCAweGVhLCAweGFjLCAweGE3LCAweDIyLCAweGI1LCAweDFhLCAweDZiLCAweGI2LCAweDUwLAorICAweDhlLCAweGViLCAweGUwLCAweGQ2LCAweDJiLCAweGExLCAweGE5LCAweDgyLCAweDNiLCAweDg0LCAweGI1LCAweGE0LAorICAweGMyLCAweDYwLCAweDQ3LCAweGY0LCAweDcxLCAweDc1LCAweGVlLCAweDkwLCAweDdlLCAweGZmLCAweGYwLCAweDJlLAorICAweDhjLCAweGYxLCAweDI1LCAweGZlLCAweDMwLCAweDkxLCAweGI2LCAweDljLCAweGIzLCAweDY2LCAweGI4LCAweDAzLAorICAweGFhLCAweGE0LCAweDkzLCAweDM3LCAweDc3LCAweDAyLCAweGRhLCAweDhkLCAweDdiLCAweGNlLCAweGFiLCAweDNiLAorICAweDU3LCAweGRmLCAweDI0LCAweGRlLCAweDE0LCAweGE4LCAweDFlLCAweGNiLCAweGVhLCAweDlkLCAweGY1LCAweGQzLAorICAweDllLCAweGFmLCAweDlmLCAweGE3LCAweGJiLCAweDgwLCAweDA3LCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLAorICAweDAwLCAweGZmLCAweGZmLCAweDI3LCAweDZmLCAweGE1LCAweDMwLCAweDkwLCAweDZjLCAweDE0LCAweDNiLCAweDBkLAorICAweDQyLCAweDA0LCAweGQ1LCAweGFjLCAweGYzLCAweDk3LCAweDVhLCAweDljLCAweDVmLCAweDdhLCAweDZhLCAweDkwLAorICAweDUyLCAweDIzLCAweDdhLCAweDYwLCAweDRhLCAweDQwLCAweGNhLCAweGM2LCAweGI5LCAweDMwLCAweDUwLCAweDExLAorICAweDJhLCAweGJiLCAweDNmLCAweDNhLCAweDk3LCAweGVjLCAweGRlLCAweDIxLCAweGNkLCAweDM1LCAweDY3LCAweGU1LAorICAweDY2LCAweDBlLCAweDZiLCAweGZhLCAweDdjLCAweGY1LCAweGUwLCAweGJhLCAweDIyLCAweDU0LCAweDFlLCAweGVjLAorICAweGFlLCAweDQ2LCAweDNkLCAweDM1LCAweGQ2LCAweDQ5LCAweGIwLCAweDgyLCAweGY0LCAweGFjLCAweDNhLCAweDliLAorICAweGE3LCAweDIzLCAweDg5LCAweDhhLCAweGY5LCAweGQxLCAweDZkLCAweGE5LCAweGIyLCAweDU4LCAweDJlLCAweDg4LAorICAweGRhLCAweDExLCAweGJiLCAweDNiLCAweGU2LCAweGQ3LCAweDNkLCAweDZlLCAweGI4LCAweDFmLCAweGI1LCAweGJlLAorICAweGI1LCAweGQ3LCAweDlhLCAweDY1LCAweGI5LCAweDBlLCAweDg3LCAweDc2LCAweGZjLCAweGRhLCAweGYzLCAweDY1LAorICAweDdjLCAweGFkLCAweDlhLCAweGQxLCAweGMzLCAweGJjLCAweDQzLCAweDNjLCAweDQ3LCAweDQ5LCAweDBkLCAweDIwLAorICAweGI2LCAweDQxLCAweDc5LCAweDBlLCAweGY0LCAweDc0LCAweDkxLCAweDJjLCAweGQ1LCAweDMyLCAweDk5LCAweGRiLAorICAweDY2LCAweDk1LCAweDAzLCAweDQ3LCAweDVhLCAweDgyLCAweGE1LCAweDgzLCAweDE0LCAweDc0LCAweDU3LCAweDBiLAorICAweDNlLCAweDY4LCAweDZiLCAweDY1LCAweDQxLCAweGRjLCAweDQ5LCAweGM1LCAweDdlLCAweDk0LCAweDIxLCAweDYzLAorICAweDg1LCAweDQyLCAweDcyLCAweDljLCAweDk1LCAweDBjLCAweGI2LCAweGQwLCAweDk1LCAweDQxLCAweDU2LCAweGYxLAorICAweGQ1LCAweGU5LCAweDczLCAweDFlLCAweDI4LCAweDc3LCAweGEwLCAweGZlLCAweDgxLCAweDJiLCAweGUwLCAweGJhLAorICAweDdmLCAweDhkLCAweDg0LCAweDc3LCAweDEyLCAweGRhLCAweDRkLCAweDBlLCAweGE4LCAweDI3LCAweGE1LCAweGE5LAorICAweGE2LCAweDAxLCAweDVjLCAweGE5LCAweDNkLCAweGIzLCAweDI1LCAweDQ3LCAweDBhLCAweDFiLCAweGVlLCAweGYxLAorICAweDVhLCAweGNkLCAweDRjLCAweDIzLCAweDVjLCAweDQxLCAweDQ0LCAweDk1LCAweDYzLCAweDA1LCAweDM4LCAweGU3LAorICAweDY3LCAweGNiLCAweGIyLCAweGMwLCAweGU2LCAweGJiLCAweGJjLCAweGJlLCAweGZmLCAweDEwLCAweGIyLCAweDdjLAorICAweDdlLCAweGRiLCAweDg1LCAweDAwLCAweDM2LCAweGJkLCAweGFmLCAweDY3LCAweGFkLCAweGZlLCAweDI5LCAweGZlLAorICAweDI1LCAweGY2LCAweDlkLCAweDYzLCAweDc3LCAweDc5LCAweGU1LCAweDdmLCAweGJhLCAweDdkLCAweDU1LCAweGY1LAorICAweDBiLCAweGQ0LCAweDQzLCAweGVmLCAweDU3LCAweDQ2LCAweDIxLCAweDBkLCAweDc0LCAweDljLCAweDY5LCAweGQxLAorICAweDVkLCAweDMyLCAweGFmLCAweDNmLCAweDI0LCAweGU1LCAweDI1LCAweDM3LCAweDMxLCAweGU2LCAweGNjLCAweGIxLAorICAweDc0LCAweDgyLCAweGQyLCAweDY3LCAweDM1LCAweGQ0LCAweGMxLCAweDliLCAweDVjLCAweDY4LCAweGJhLCAweGRiLAorICAweGVmLCAweDhiLCAweDQ1LCAweGQ3LCAweDhmLCAweDQ3LCAweDNmLCAweDZlLCAweDdhLCAweGEwLCAweDAxLCAweGZiLAorICAweGY2LCAweDJiLCAweDYxLCAweGE4LCAweDc2LCAweDU0LCAweGE4LCAweDE1LCAweDJhLCAweDI5LCAweDEzLCAweDI1LAorICAweDI1LCAweDAwLCAweDEwLCAweGEwLCAweDAwLCAweGFjLCAweDE1LCAweDkwLCAweDAyLCAweDgwLCAweDg1LCAweDg1LAorICAweDA1LCAweDllLCAweDc0LCAweDBlLCAweDAyLCAweDA4LCAweGE5LCAweDE4LCAweGM1LCAweDU0LCAweGQwLCAweDg0LAorICAweDNmLCAweDVkLCAweGI1LCAweDkzLCAweDFjLCAweDU5LCAweGQ0LCAweDBmLCAweGNlLCAweDNjLCAweGRlLCAweDQ5LAorICAweDc4LCAweDQxLCAweGM5LCAweGU0LCAweDU5LCAweGYzLCAweGMwLCAweDFhLCAweDBkLCAweDEyLCAweGRiLCAweDhhLAorICAweDRiLCAweDk2LCAweDc4LCAweGI2LCAweGI3LCAweDEwLCAweGI5LCAweDI5LCAweDdhLCAweGQ0LCAweDExLCAweDlhLAorICAweGExLCAweDhhLCAweDQ5LCAweDZkLCAweDQwLCAweDllLCAweGZiLCAweDcxLCAweGVlLCAweGY4LCAweDVmLCAweDA4LAorICAweDAwLCAweGUwLCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDNmLCAweDIzLCAweDcxLAorICAweGExLCAweGMxLCAweDUyLCAweDAyLCAweDEwLCAweDEyLCAweGU0LCAweGI0LCAweDlhLCAweGIzLCAweDQ5LCAweDU3LAorICAweDI5LCAweDM5LCAweGUwLCAweDMyLCAweGQ0LCAweDhlLCAweDQ3LCAweDhjLCAweGU1LCAweDc2LCAweDdjLCAweGFlLAorICAweDNmLCAweDJlLCAweDNlLCAweDQ5LCAweDE2LCAweDEyLCAweGRlLCAweDI1LCAweDY0LCAweDRjLCAweDQzLCAweGE3LAorICAweGZlLCAweGJmLCAweDUxLCAweDFiLCAweGE0LCAweDM2LCAweGNkLCAweDRiLCAweGRkLCAweGJjLCAweDEzLCAweDQ3LAorICAweGZlLCAweGRmLCAweDRjLCAweGIxLCAweDcyLCAweGM3LCAweDFhLCAweDUzLCAweDAxLCAweGQ1LCAweDQ2LCAweDczLAorICAweDA0LCAweDRkLCAweGIxLCAweDU3LCAweDY3LCAweDFkLCAweDNlLCAweDk1LCAweDZhLCAweDhjLCAweGIwLCAweGJhLAorICAweDEwLCAweDk4LCAweGU1LCAweGY5LCAweDMxLCAweDIyLCAweDcyLCAweDcxLCAweDFhLCAweDdiLCAweGVhLCAweGY5LAorICAweDlkLCAweDY4LCAweGM3LCAweGQ2LCAweGYxLCAweGE3LCAweGUzLCAweGE5LCAweGJiLCAweDBmLCAweDU4LCAweGI1LAorICAweDBlLCAweDZjLCAweDAyLCAweDE2LCAweDMzLCAweGUwLCAweDljLCAweDU2LCAweDk0LCAweGY5LCAweGQxLCAweDc2LAorICAweGNhLCAweDM1LCAweGQ2LCAweDZmLCAweDY5LCAweDRiLCAweGIzLCAweDk5LCAweDgzLCAweDY3LCAweDJkLCAweDlkLAorICAweGZlLCAweDFmLCAweGUxLCAweDkzLCAweDJiLCAweGIyLCAweDZiLCAweDZjLCAweGRkLCAweDFiLCAweDI3LCAweGNiLAorICAweDk4LCAweGMyLCAweDc3LCAweDdiLCAweDkxLCAweGE0LCAweDE3LCAweDQ1LCAweDY2LCAweDNlLCAweGVmLCAweGRhLAorICAweDZlLCAweDQxLCAweGJmLCAweGI5LCAweDNjLCAweDViLCAweDEwLCAweGQ0LCAweGIxLCAweDY1LCAweDM2LCAweGIxLAorICAweDBjLCAweDAzLCAweDJhLCAweDNjLCAweDBlLCAweGQ3LCAweDdiLCAweDYxLCAweGM1LCAweDdjLCAweDQ4LCAweDEyLAorICAweDJkLCAweGY0LCAweDdiLCAweDE3LCAweGM1LCAweDhjLCAweGQyLCAweDgwLCAweGRjLCAweGQwLCAweDUwLCAweDJmLAorICAweDcxLCAweDVhLCAweDZhLCAweDNmLCAweGQ4LCAweDIxLCAweGJmLCAweDAyLCAweGYzLCAweDdlLCAweGY2LCAweGY4LAorICAweGJjLCAweGM0LCAweDA1LCAweGUzLCAweGI1LCAweGIyLCAweDIwLCAweDE2LCAweGNmLCAweDE4LCAweDU5LCAweDljLAorICAweGZmLCAweDBkLCAweDc2LCAweDVjLCAweDA2LCAweDY3LCAweDVjLCAweGJiLCAweDgzLCAweGQ0LCAweGQ5LCAweDg5LAorICAweDliLCAweDIwLCAweGZiLCAweDI4LCAweGNlLCAweGI1LCAweDJmLCAweDg5LCAweGMwLCAweDU1LCAweDIzLCAweGQ3LAorICAweDk4LCAweDc2LCAweDZiLCAweDQ4LCAweDJjLCAweDNjLCAweDM0LCAweGY1LCAweDkzLCAweDg2LCAweDAwLCAweDc3LAorICAweDM4LCAweGYxLCAweDBmLCAweDk2LCAweGI3LCAweDEyLCAweGI1LCAweDk2LCAweDk3LCAweDgzLCAweDVkLCAweDZkLAorICAweDlhLCAweDEyLCAweDVlLCAweDg0LCAweGNlLCAweGI0LCAweGY5LCAweDlmLCAweGZmLCAweDZmLCAweGRhLCAweGYwLAorICAweGM4LCAweDBmLCAweGZmLCAweGYzLCAweDIxLCAweDE0LCAweDNiLCAweDU0LCAweGE4LCAweGE0LCAweDU0LCAweDk5LAorICAweDI4LCAweDhhLCAweDQ0LCAweDk0LCAweGM4LCAweDk5LCAweDczLCAweDI1LCAweDU4LCAweDEwLCAweDNkLCAweGFmLAorICAweDA2LCAweDAwLCAweDkyLCAweDQ5LCAweDY2LCAweDMzLCAweDk4LCAweDQwLCAweDljLCAweDEzLCAweDFmLCAweDU0LAorICAweDM0LCAweGZkLCAweDE5LCAweGI0LCAweDYzLCAweDc2LCAweGZlLCAweGQ0LCAweGU3LCAweDQyLCAweGQzLCAweDNmLAorICAweDkyLCAweDAzLCAweGQzLCAweDdhLCAweGU5LCAweDlmLCAweDVlLCAweDZiLCAweDhjLCAweDgwLCAweDcwLCAweDIxLAorICAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDFmLCAweDFmLCAweDcwLCAweGEyLCAweDQxLCAweDU4LAorICAweDQ4LCAweGQ2LCAweDA4LCAweDg0LCAweDAwLCAweGUzLCAweDU2LCAweDQ0LCAweGJiLCAweGE4LCAweDk3LCAweDUwLAorICAweDAwLCAweGE5LCAweDUzLCAweGIxLCAweDgzLCAweDIyLCAweGRkLCAweDBlLCAweDU2LCAweDM1LCAweDE1LCAweDU4LAorICAweDgxLCAweDU1LCAweGU3LCAweDQ0LCAweDk4LCAweDNmLCAweDNmLCAweGY5LCAweDJhLCAweGM4LCAweDdmLCAweGEyLAorICAweDRjLCAweDAxLCAweDk5LCAweDAxLCAweDlhLCAweGZmLCAweDE1LCAweGU2LCAweGJjLCAweDZkLCAweDIwLCAweDczLAorICAweDAyLCAweDNjLCAweGNlLCAweGQyLCAweDM0LCAweGMxLCAweGFkLCAweDM0LCAweDZmLCAweGZiLCAweDVkLCAweDQyLAorICAweGViLCAweDVlLCAweDY1LCAweGU0LCAweGM2LCAweGQ0LCAweGYxLCAweGNmLCAweGIzLCAweGRkLCAweGYyLCAweGZmLAorICAweDk3LCAweDBiLCAweDU1LCAweGVjLCAweGE4LCAweDFiLCAweGIzLCAweGVmLCAweDRiLCAweGY0LCAweGFkLCAweDM3LAorICAweDUxLCAweDkzLCAweGE4LCAweGY0LCAweDFhLCAweDVjLCAweDUzLCAweDNhLCAweDgzLCAweDBlLCAweDU2LCAweGYxLAorICAweDhlLCAweDVlLCAweGZmLCAweDIyLCAweGYwLCAweGZmLCAweDVhLCAweGQzLCAweDUwLCAweDNkLCAweDYyLCAweDhiLAorICAweDBhLCAweDMzLCAweDFhLCAweDJlLCAweDhhLCAweDBmLCAweGQ0LCAweDY1LCAweDQ2LCAweDJiLCAweDJhLCAweGJmLAorICAweDVjLCAweDVmLCAweGUzLCAweDcxLCAweDc0LCAweDQ0LCAweDU5LCAweDdiLCAweDk5LCAweDQxLCAweDg5LCAweGExLAorICAweGMyLCAweDA2LCAweDU0LCAweDE0LCAweDJkLCAweGUxLCAweDY0LCAweDg3LCAweGVmLCAweDQ4LCAweDc3LCAweDQ4LAorICAweDcyLCAweDkyLCAweGIwLCAweDMxLCAweGJiLCAweDhkLCAweGE5LCAweDIwLCAweDA2LCAweGI0LCAweDkyLCAweDZkLAorICAweDFkLCAweDFmLCAweDJjLCAweDA2LCAweGQ2LCAweDNjLCAweDQzLCAweDNkLCAweGYzLCAweDg4LCAweGZlLCAweDEwLAorICAweDhkLCAweDZjLCAweGM4LCAweGMxLCAweDI2LCAweGFjLCAweGI4LCAweDQ1LCAweDFmLCAweDE1LCAweDQyLCAweDI4LAorICAweDNmLCAweDBmLCAweDFhLCAweGI1LCAweGYxLCAweGUxLCAweDBiLCAweGU4LCAweGJlLCAweDQ4LCAweDg2LCAweDAyLAorICAweDc2LCAweDZmLCAweGNiLCAweDdjLCAweDJmLCAweGQ1LCAweGYxLCAweGFkLCAweGJiLCAweGExLCAweDAwLCAweDdkLAorICAweDlhLCAweDE0LCAweDZkLCAweGMxLCAweDRhLCAweGVmLCAweGE3LCAweDdiLCAweGM4LCAweDY4LCAweDk3LCAweDFmLAorICAweDQ1LCAweGExLCAweDQ0LCAweDZjLCAweDA1LCAweDNlLCAweGQ2LCAweDJiLCAweGU3LCAweDQ0LCAweDhkLCAweDU3LAorICAweGQzLCAweDFmLCAweDZjLCAweDZmLCAweGI1LCAweDEzLCAweGEzLCAweGI1LCAweGNmLCAweGU0LCAweDRmLCAweDFjLAorICAweDNjLCAweDE4LCAweDM4LCAweDczLCAweDQ4LCAweDNiLCAweGExLCAweDIyLCAweGMyLCAweDc0LCAweGY3LCAweDQwLAorICAweGQwLCAweDVkLCAweGRkLCAweDZmLCAweGIxLCAweGNjLCAweDhiLCAweGE4LCAweGQyLCAweGQ2LCAweDdhLCAweDFkLAorICAweDFkLCAweDkyLCAweDVjLCAweDRjLCAweDU2LCAweGMxLCAweDNlLCAweDRkLCAweDNjLCAweDViLCAweDVjLCAweDlmLAorICAweDVmLCAweGNmLCAweDZkLCAweGMxLCAweGZiLCAweGZlLCAweDc0LCAweDI2LCAweGQxLCAweDU1LCAweDJhLCAweDJhLAorICAweDUxLCAweDAwLCAweDEwLCAweGExLCAweDUxLCAweDUyLCAweDQyLCAweDgxLCAweDZhLCAweGUzLCAweGI3LCAweGZlLAorICAweDMxLCAweGY3LCAweDAxLCAweDNmLCAweDIyLCAweDIwLCAweDYwLCAweDUyLCAweDk5LCAweDcwLCAweDA2LCAweDgwLAorICAweDQzLCAweGFkLCAweDZhLCAweDNkLCAweDM3LCAweDFlLCAweGMyLCAweDQ1LCAweDE3LCAweDBhLCAweDY5LCAweGRkLAorICAweGRmLCAweDA3LCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDA3LCAweGZmLCAweGZmLCAweDJiLCAweDZmLAorICAweGE1LCAweDMwLCAweDUwLCAweDhjLCAweDU0LCAweDFiLCAweDBkLCAweDQyLCAweDBlLCAweDM1LCAweDZkLCAweDJkLAorICAweDY5LCAweDc1LCAweGE5LCAweDYzLCAweDU1LCAweDQyLCAweDAzLCAweDJkLCAweDU3LCAweDQzLCAweGJmLCAweDcwLAorICAweDYyLCAweDUyLCAweGI1LCAweDkyLCAweGJlLCAweDgzLCAweGY0LCAweGIwLCAweDQ5LCAweDUwLCAweDNjLCAweGE5LAorICAweDcwLCAweGExLCAweGQ4LCAweDM1LCAweGVkLCAweGNiLCAweGRiLCAweGZlLCAweDA1LCAweGUzLCAweDNlLCAweDEwLAorICAweDk5LCAweDBiLCAweDMyLCAweDBmLCAweDRiLCAweGZlLCAweDhmLCAweGQyLCAweDc4LCAweGM3LCAweDQ4LCAweGUxLAorICAweDRjLCAweDVmLCAweDE3LCAweGFhLCAweDc5LCAweDk3LCAweDgzLCAweGM2LCAweDlkLCAweDMxLCAweGE0LCAweGEzLAorICAweDJhLCAweDViLCAweGI5LCAweGU1LCAweGM0LCAweGM4LCAweDJlLCAweDcwLCAweDUyLCAweGQ5LCAweDBlLCAweGNkLAorICAweDI3LCAweGZlLCAweDNlLCAweDQ4LCAweDY3LCAweDdhLCAweDZkLCAweDYyLCAweGMyLCAweGJmLCAweDQ1LCAweGVhLAorICAweDEyLCAweDBiLCAweGUzLCAweDc0LCAweDUwLCAweGQ3LCAweDNmLCAweDQzLCAweDAzLCAweDBmLCAweDM4LCAweDQxLAorICAweGI3LCAweDlkLCAweDFlLCAweDlhLCAweDEwLCAweDg4LCAweDRkLCAweGZiLCAweDk1LCAweDM0LCAweGFlLCAweDQyLAorICAweDQxLCAweDQ4LCAweDY3LCAweDNjLCAweDVkLCAweDI4LCAweDFkLCAweDRmLCAweDNlLCAweGM1LCAweDcwLCAweGIwLAorICAweGY3LCAweDJiLCAweGE5LCAweDY2LCAweDFkLCAweGFhLCAweDEyLCAweDAyLCAweGJjLCAweDY0LCAweGViLCAweDZiLAorICAweDY0LCAweDQ5LCAweDkyLCAweDQ2LCAweDEzLCAweDRkLCAweDY1LCAweGRjLCAweDUyLCAweDlkLCAweDg5LCAweDRjLAorICAweDRiLCAweDU2LCAweDMzLCAweDg0LCAweDgzLCAweDEzLCAweDg5LCAweGUyLCAweDQwLCAweDU5LCAweDRhLCAweDQ3LAorICAweGJkLCAweGQwLCAweGQ4LCAweDc5LCAweGU5LCAweGU5LCAweGZiLCAweGY3LCAweGMwLCAweDc2LCAweGViLCAweGI2LAorICAweDBiLCAweGFjLCAweDIyLCAweDgwLCAweGRkLCAweDc0LCAweGFlLCAweDU0LCAweDQ2LCAweDQzLCAweDczLCAweDIzLAorICAweGQ0LCAweGMyLCAweDBjLCAweDA5LCAweDdjLCAweDkxLCAweDUxLCAweDMzLCAweDgzLCAweDllLCAweDFjLCAweDU0LAorICAweDg2LCAweDUzLCAweDI5LCAweDZlLCAweDQ2LCAweGJkLCAweDA5LCAweDRhLCAweDQ0LCAweDY2LCAweDk2LCAweGIwLAorICAweGMxLCAweGM2LCAweDJkLCAweDNhLCAweGQ5LCAweGUwLCAweGI4LCAweDJjLCAweDAxLCAweGEzLCAweDA1LCAweDg2LAorICAweDEwLCAweGYxLCAweDdhLCAweDViLCAweDRkLCAweGYyLCAweGU0LCAweDUxLCAweDdkLCAweDdiLCAweDRjLCAweDM2LAorICAweGUwLCAweDY2LCAweDdiLCAweGIyLCAweDM4LCAweDEwLCAweGZjLCAweDE5LCAweGRlLCAweDVhLCAweDY2LCAweDhmLAorICAweGE2LCAweDQ0LCAweDUyLCAweGU4LCAweDcwLCAweDllLCAweDc0LCAweGFlLCAweGViLCAweDljLCAweGI5LCAweDAwLAorICAweDAzLCAweGI5LCAweDQ1LCAweDYyLCAweDZkLCAweDIwLCAweGE5LCAweDA5LCAweDVmLCAweDNlLCAweDFkLCAweGZmLAorICAweDVjLCAweDY3LCAweDJkLCAweDU4LCAweGNmLCAweDk0LCAweGIzLCAweDVmLCAweDdmLCAweGI3LCAweGVkLCAweGY0LAorICAweGM3LCAweGQxLCAweGRiLCAweGRiLCAweGUwLCAweDAwLCAweGZiLCAweGY4LCAweDM2LCAweDEwLCAweDk4LCAweDY2LAorICAweDFkLCAweDk0LCAweDg0LCAweGE1LCAweDQ1LCAweDVlLCAweDQyLCAweDkyLCAweDgwLCAweDQwLCAweDIyLCAweDZjLAorICAweDZkLCAweDRmLCAweDE0LCAweDkwLCAweDlkLCAweDYxLCAweDJkLCAweDgwLCAweDEyLCAweDgyLCAweDg0LCAweDAyLAorICAweGY2LCAweDQzLCAweDU0LCAweGJjLCAweDM0LCAweGVmLCAweDY2LCAweDM4LCAweGYzLCAweGVkLCAweDBkLCAweDhjLAorICAweDRlLCAweGFlLCAweGY0LCAweDY4LCAweDQ2LCAweGQ4LCAweDM2LCAweDJmLCAweGE5LCAweDM5LCAweGQ3LCAweDc2LAorICAweGI1LCAweGI3LCAweGI0LCAweGI2LCAweDNmLCAweGRjLCAweDViLCAweDZlLCAweDUzLCAweDc0LCAweGVjLCAweDY0LAorICAweGI4LCAweDUxLCAweGU5LCAweDg1LCAweGE3LCAweDNhLCAweGFjLCAweDQ1LCAweGQ1LCAweDcyLCAweDc4LCAweDI5LAorICAweGRlLCAweDdmLCAweDc5LCAweDRjLCAweDhlLCAweDQ0LCAweGJhLCAweDViLCAweDg1LCAweDRlLCAweDY2LCAweGU2LAorICAweDYwLCAweGQ2LCAweDkwLCAweDI3LCAweDFhLCAweDZhLCAweGE4LCAweGI3LCAweDY0LCAweGM4LCAweGQzLCAweDY1LAorICAweGNhLCAweDg5LCAweDRmLCAweDgzLCAweGNiLCAweDVlLCAweDc2LCAweDRjLCAweDUyLCAweDY5LCAweGZiLCAweDhmLAorICAweDlmLCAweGY0LCAweGRlLCAweDQ4LCAweDcwLCAweDIxLCAweDFhLCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAzLAorICAweGZmLCAweDIzLCAweDZmLCAweGE1LCAweDIyLCAweDA4LCAweDY4LCAweDYwLCAweDQzLCAweGFjLCAweGI3LCAweDAxLAorICAweGMyLCAweGQxLCAweDJlLCAweDkyLCAweDkxLCAweDQxLCAweDI5LCAweDMwLCAweDVhLCAweDRhLCAweDlkLCAweGQ3LAorICAweDc2LCAweDI4LCAweDkxLCAweGQzLCAweDVjLCAweDQzLCAweGM3LCAweGE3LCAweDlmLCAweDRmLCAweDU4LCAweDFhLAorICAweGQ0LCAweDQ2LCAweGY3LCAweDllLCAweGVkLCAweDIyLCAweDYzLCAweGE4LCAweGYzLCAweGE0LCAweDM0LCAweDI3LAorICAweDRkLCAweGQ4LCAweDFjLCAweDg5LCAweGNjLCAweDVhLCAweDg2LCAweDhlLCAweGVkLCAweGRlLCAweGIyLCAweDg1LAorICAweDU3LCAweGQ1LCAweDRjLCAweDczLCAweDQ2LCAweGY0LCAweDFjLCAweGY2LCAweGVmLCAweDgyLCAweDY2LCAweGJkLAorICAweGE5LCAweDY0LCAweDZjLCAweGZhLCAweDI0LCAweDliLCAweDYzLCAweDc2LCAweGZmLCAweDJhLCAweGJmLCAweGRhLAorICAweDZhLCAweDBmLCAweGI2LCAweGIyLCAweDVkLCAweDQ4LCAweGRmLCAweDBkLCAweGQ0LCAweDY5LCAweGU0LCAweGI4LAorICAweGRiLCAweDY5LCAweDhlLCAweDBhLCAweDMzLCAweDdhLCAweGE4LCAweDhkLCAweDVlLCAweDc1LCAweGE3LCAweDAxLAorICAweDgxLCAweGNhLCAweDRjLCAweDU1LCAweGQzLCAweGE1LCAweDkwLCAweDY1LCAweDVhLCAweGQzLCAweDBkLCAweDU0LAorICAweDg1LCAweDYyLCAweGMxLCAweDMzLCAweGQwLCAweDk4LCAweDg5LCAweGZjLCAweDMxLCAweDg2LCAweDYwLCAweDMxLAorICAweDVjLCAweDU5LCAweDJlLCAweDFhLCAweDQyLCAweDE4LCAweDJjLCAweDAzLCAweDlhLCAweGNjLCAweDE4LCAweDdkLAorICAweDdmLCAweGY1LCAweGJlLCAweDY1LCAweDhmLCAweGEyLCAweDkzLCAweDQ5LCAweGU4LCAweGI2LCAweDE1LCAweGVhLAorICAweGU3LCAweGI1LCAweDhiLCAweDdlLCAweDQxLCAweDNmLCAweDE0LCAweGY0LCAweDc0LCAweGMwLCAweDdmLCAweDk1LAorICAweDFhLCAweDBjLCAweGJjLCAweGMxLCAweDNjLCAweGUwLCAweDhkLCAweDRiLCAweDY3LCAweDQwLCAweDk4LCAweDJiLAorICAweDk2LCAweGU4LCAweDczLCAweDBhLCAweDA2LCAweGVjLCAweDAyLCAweGZiLCAweDliLCAweDg3LCAweDA0LCAweDA2LAorICAweGZkLCAweDUzLCAweDRiLCAweGY4LCAweDVmLCAweDA3LCAweGRkLCAweGQ5LCAweGJiLCAweDQ5LCAweGVhLCAweDg1LAorICAweGEwLCAweGYwLCAweGZlLCAweDFkLCAweDAzLCAweGE2LCAweGU4LCAweDA5LCAweGEzLCAweDI1LCAweDc3LCAweDE5LAorICAweGYxLCAweGEwLCAweGZlLCAweDgxLCAweDgwLCAweDgzLCAweDVlLCAweDI0LCAweDcxLCAweGQ5LCAweDYyLCAweGU1LAorICAweDIwLCAweDJhLCAweGU4LCAweGNlLCAweDhmLCAweGY0LCAweDhhLCAweGY4LCAweDY2LCAweGY3LCAweGQxLCAweGViLAorICAweDYyLCAweGQ0LCAweDBhLCAweGU1LCAweGUzLCAweDdkLCAweDhhLCAweGFkLCAweGVhLCAweGFhLCAweDFkLCAweGE1LAorICAweDQxLCAweGMxLCAweGEyLCAweDNiLCAweGM4LCAweDM3LCAweDhhLCAweDU3LCAweDEwLCAweDFkLCAweDc3LCAweDc3LAorICAweDdlLCAweGZmLCAweDg4LCAweDQ4LCAweDgyLCAweDYxLCAweDE4LCAweDc5LCAweGJhLCAweDA0LCAweDU1LCAweDI1LAorICAweDI1LCAweDQyLCAweGEyLCAweDU1LCAweDQ0LCAweGE1LCAweDgxLCAweDAxLCAweDNmLCAweGZkLCAweDVkLCAweDUyLAorICAweGM5LCAweDA1LCAweGVmLCAweDM1LCAweDlkLCAweDI4LCAweDhjLCAweGI5LCAweGEyLCAweGE4LCAweDAyLCAweGFhLAorICAweDYzLCAweDIxLCAweGFhLCAweGE1LCAweGEyLCAweGFkLCAweDBhLCAweDllLCAweDBlLCAweDNhLCAweDllLCAweDYxLAorICAweDIyLCAweDk1LCAweDQ1LCAweDg2LCAweGYzLCAweGRjLCAweDE1LCAweGIyLCAweDAzLCAweDk5LCAweDlkLCAweDg0LAorICAweDA0LCAweDc0LCAweGQ1LCAweDQxLCAweDBkLCAweGE5LCAweGU1LCAweDM2LCAweDNkLCAweDllLCAweGQwLCAweDcwLAorICAweDIxLCAweDFhLCAweDhmLCAweGZmLCAweGMwLCAweDdmLCAweGZmLCAweGZmLCAweDE5LCAweDZmLCAweGE0LCAweGIxLAorICAweDExLCAweDZjLCAweDI1LCAweDA4LCAweDE1LCAweDVkLCAweDI1LCAweGNhLCAweGFiLCAweDVkLCAweDcxLCAweDY1LAorICAweGE4LCAweDIyLCAweDgxLCAweDU3LCAweDU0LCAweDI4LCAweDk1LCAweDc3LCAweDg5LCAweDI1LCAweDI4LCAweDkyLAorICAweDQ2LCAweDRjLCAweDI0LCAweDIwLCAweDkxLCAweDVkLCAweDgzLCAweGUzLCAweGIzLCAweGJlLCAweGJiLCAweDY1LAorICAweGQ2LCAweDYxLCAweGZiLCAweDVmLCAweDY2LCAweDUxLCAweDllLCAweGU3LCAweDRkLCAweDNmLCAweGE1LCAweGMwLAorICAweDdmLCAweDZlLCAweDkwLCAweGNhLCAweDgxLCAweDhkLCAweDNlLCAweGUxLCAweDYxLCAweGUxLCAweDFjLCAweGE5LAorICAweDBkLCAweGY1LCAweDA4LCAweDk2LCAweDg0LCAweGZhLCAweGQ3LCAweDE3LCAweDY5LCAweDJjLCAweDI3LCAweDc4LAorICAweGJhLCAweGUzLCAweDlhLCAweGMwLCAweGNmLCAweGZjLCAweGU3LCAweDIxLCAweGJhLCAweGY1LCAweDllLCAweDM0LAorICAweGY1LCAweGI1LCAweGYxLCAweDk2LCAweGIzLCAweDlmLCAweDZlLCAweDA4LCAweGE5LCAweDM4LCAweDQxLCAweDdhLAorICAweDgzLCAweGY1LCAweDJhLCAweGQ4LCAweDQ5LCAweGYyLCAweGYyLCAweDU1LCAweDUyLCAweGFiLCAweGVhLCAweDVmLAorICAweDk1LCAweDMxLCAweDVmLCAweDRlLCAweDVkLCAweDM2LCAweDMyLCAweGJkLCAweDhmLCAweGFlLCAweDQ1LCAweDM4LAorICAweDc1LCAweGM5LCAweDU2LCAweGExLCAweGI0LCAweDUyLCAweGNlLCAweDQ3LCAweGMxLCAweDU3LCAweGRjLCAweGE3LAorICAweGIzLCAweDYwLCAweDFlLCAweDFiLCAweGM1LCAweDBiLCAweDk2LCAweGZkLCAweDA1LCAweGEyLCAweGNjLCAweGU1LAorICAweGRmLCAweDdmLCAweDNhLCAweDU4LCAweGIzLCAweDE3LCAweDg3LCAweDU3LCAweDU5LCAweDYxLCAweGQxLCAweDI5LAorICAweDcwLCAweDI0LCAweGI1LCAweDgxLCAweGMwLCAweDQxLCAweDU1LCAweGM4LCAweDNhLCAweGQ2LCAweGIyLCAweDBmLAorICAweDM3LCAweGYzLCAweGExLCAweGUwLCAweDc3LCAweGUwLCAweDA5LCAweDUzLCAweDg1LCAweGI5LCAweDFlLCAweGUyLAorICAweGJmLCAweDM3LCAweGU3LCAweDY0LCAweDZhLCAweGVhLCAweDNlLCAweDNkLCAweGVmLCAweGZkLCAweDFjLCAweDEzLAorICAweGU4LCAweDIyLCAweGMyLCAweGY0LCAweDA3LCAweDQxLCAweGQ0LCAweGJhLCAweGU3LCAweDU5LCAweDU0LCAweDViLAorICAweDc0LCAweGQ1LCAweDA4LCAweDZjLCAweGJkLCAweDU2LCAweDU5LCAweDY3LCAweGE5LCAweDY3LCAweGE5LCAweDMxLAorICAweDgxLCAweGRlLCAweGZjLCAweDIxLCAweDQ1LCAweDc1LCAweDU4LCAweGI1LCAweDYzLCAweDdlLCAweGU4LCAweDhlLAorICAweGMyLCAweDNlLCAweDMyLCAweDUzLCAweDE3LCAweDEwLCAweGFlLCAweGRhLCAweGRmLCAweDFiLCAweGY2LCAweDNjLAorICAweDc2LCAweGE3LCAweDUwLCAweDVmLCAweGQ1LCAweGEwLCAweDNiLCAweDgyLCAweDRlLCAweGY2LCAweGZhLCAweDdiLAorICAweDRlLCAweDEzLCAweGE5LCAweGNkLCAweDc1LCAweGQ0LCAweDUxLCAweDhiLCAweDAzLCAweGVjLCAweGMyLCAweDUyLAorICAweDQwLCAweDc2LCAweDE0LCAweGE2LCAweDUwLCAweGE1LCAweDAyLCAweGZiLCAweDUxLCAweDNhLCAweDdkLCAweDVmLAorICAweDNjLCAweGY3LCAweGVjLCAweDAwLCAweDhjLCAweGIyLCAweDUyLCAweGJjLCAweGM4LCAweDUzLCAweDczLCAweDA4LAorICAweGMyLCAweDAxLCAweGI0LCAweGY4LCAweGQzLCAweDk4LCAweDhjLCAweGI4LCAweDU4LCAweDAwLCAweDJiLCAweDU0LAorICAweDFiLCAweDI3LCAweDc0LCAweDdjLCAweDE0LCAweDdkLCAweGI4LCAweGYxLCAweDRlLCAweDY4LCAweGZhLCAweGNkLAorICAweDc0LCAweDg5LCAweDBjLCAweDVlLCAweDgxLCAweDVjLCAweGNiLCAweGRkLCAweDM5LCAweDk0LCAweDExLCAweGM2LAorICAweDAxLCAweDMwLCAweDE5LCAweDg4LCAweDU3LCAweDFhLCAweGEzLCAweDZhLCAweGE2LCAweGFkLCAweDI1LCAweDkyLAorICAweGJmLCAweGY1LCAweGYzLCAweGZhLCAweGI4LCAweGYzLCAweDEzLCAweGYxLCAweDJmLCAweGMyLCAweDAwLCAweDc5LAorICAweGQ1LCAweDM0LCAweDA5LCAweDliLCAweGEwLCAweGE1LCAweDBjLCAweGRkLCAweGI1LCAweGU5LCAweDJhLCAweGY2LAorICAweDhlLCAweDU5LCAweDkyLCAweDgzLCAweDg4LCAweDA1LCAweGU5LCAweDgxLCAweDBiLCAweGE3LCAweDU1LCAweGM2LAorICAweGRkLCAweDg5LCAweDBhLCAweDRkLCAweGQ5LCAweGM4LCAweDJkLCAweGIzLCAweDMwLCAweDA4LCAweDUyLCAweDAyLAorICAweDg1LCAweDEzLCAweGNiLCAweGM1LCAweDEyLCAweDEzLCAweDg3LCAweDYyLCAweDEwLCAweDRlLCAweGJhLCAweDZhLAorICAweGI4LCAweGIxLCAweGQyLCAweDNjLCAweGNjLCAweGVlLCAweDY2LCAweGE5LCAweGRmLCAweGU5LCAweGRhLCAweGZjLAorICAweGE0LCAweGIxLCAweDE4LCAweDZlLCAweDU4LCAweDQ0LCAweDZjLCAweDY3LCAweGE1LCAweDU0LCAweDQ1LCAweGU5LAorICAweDUzLCAweDRlLCAweGExLCAweDMyLCAweDgyLCAweDdjLCAweGQ3LCAweDgzLCAweGVjLCAweGZhLCAweDliLCAweDQxLAorICAweGMwLCAweDIxLCAweDFhLCAweDhmLCAweGYwLCAweDA3LCAweGZmLCAweGZmLCAweGZmLCAweDFkLCAweDZmLCAweGE0LAorICAweGIwLCAweGQxLCAweGFjLCAweDE3LCAweDA4LCAweDEyLCAweGE4LCAweGYyLCAweGI0LCAweDcwLCAweDk1LCAweDZkLAorICAweDI4LCAweDgyLCAweDkyLCAweDg5LCAweDUwLCAweDA5LCAweDA5LCAweDY0LCAweDljLCAweGRhLCAweDg5LCAweDg0LAorICAweDAyLCAweDMyLCAweDYxLCAweGFiLCAweDc3LCAweDg2LCAweGE0LCAweDQ5LCAweDBhLCAweDZlLCAweDI0LCAweDIxLAorICAweDcwLCAweDVjLCAweDRiLCAweGRiLCAweDNmLCAweDNmLCAweDg0LCAweGY1LCAweGFmLCAweGQ0LCAweDNiLCAweDIyLAorICAweDlmLCAweGYxLCAweDBiLCAweDkzLCAweGMwLCAweDcyLCAweDM2LCAweGJjLCAweDdjLCAweGZkLCAweGEzLCAweDliLAorICAweGQ1LCAweDIxLCAweDE3LCAweGFmLCAweDVlLCAweGQyLCAweDZkLCAweGRjLCAweGI5LCAweDMxLCAweDNjLCAweDRjLAorICAweDdjLCAweDhmLCAweDU4LCAweDI2LCAweGE4LCAweDcwLCAweDc2LCAweDJmLCAweDE2LCAweGJkLCAweDkzLCAweDdiLAorICAweDE2LCAweGMxLCAweDVkLCAweDYyLCAweGU5LCAweGE0LCAweDhlLCAweGY3LCAweDg5LCAweDU1LCAweGIyLCAweGMwLAorICAweDkyLCAweGE2LCAweGFiLCAweDFhLCAweGJlLCAweDMxLCAweDgwLCAweGUxLCAweGFjLCAweGI2LCAweDBhLCAweDY0LAorICAweDc0LCAweGY1LCAweDdiLCAweDFiLCAweGI2LCAweGYxLCAweDI4LCAweDc5LCAweGJlLCAweDk3LCAweDI0LCAweGZmLAorICAweDIzLCAweDU2LCAweGQxLCAweDNlLCAweDM4LCAweDg3LCAweDYzLCAweDM1LCAweGQ0LCAweGQ1LCAweDM1LCAweGE1LAorICAweDU1LCAweGJiLCAweDU2LCAweDcxLCAweDVlLCAweGZlLCAweGI5LCAweDM4LCAweDUxLCAweDFjLCAweGFmLCAweDI3LAorICAweDBjLCAweGNlLCAweDYyLCAweDM3LCAweGE5LCAweGMyLCAweDI0LCAweDczLCAweDk0LCAweGU5LCAweDZjLCAweGVkLAorICAweDRkLCAweGUwLCAweDMxLCAweDRmLCAweDUzLCAweGRkLCAweGFmLCAweDQzLCAweDUzLCAweDk3LCAweDBkLCAweGQ1LAorICAweDEyLCAweDgzLCAweDdlLCAweDk5LCAweDM5LCAweDk2LCAweDJlLCAweDQ5LCAweGExLCAweDVkLCAweGFlLCAweGRjLAorICAweDA2LCAweDNjLCAweDc3LCAweDgyLCAweGUzLCAweDA2LCAweGI0LCAweDgzLCAweDU4LCAweDZkLCAweDFlLCAweDkwLAorICAweDFmLCAweGQwLCAweGNkLCAweDIyLCAweDQ0LCAweDcyLCAweGRiLCAweDdkLCAweGY3LCAweGFhLCAweGZhLCAweGZiLAorICAweDBhLCAweDA0LCAweDI0LCAweDdmLCAweDVmLCAweGZlLCAweDIxLCAweDNkLCAweDI2LCAweDZmLCAweGE5LCAweGE1LAorICAweDhkLCAweDFkLCAweGY3LCAweGFhLCAweDkwLCAweDgwLCAweGM0LCAweDM5LCAweDAxLCAweDEyLCAweDM4LCAweDE5LAorICAweGQyLCAweGM4LCAweDY4LCAweDNjLCAweDhkLCAweDc3LCAweGEwLCAweGJiLCAweDNhLCAweGYzLCAweDE2LCAweDAzLAorICAweDdkLCAweGNmLCAweGY4LCAweDY3LCAweGQ5LCAweGRhLCAweDAwLCAweDM0LCAweDE3LCAweDQ2LCAweDc5LCAweGNjLAorICAweDljLCAweGFkLCAweDExLCAweDJhLCAweDA5LCAweDI3LCAweGIwLCAweGE1LCAweDQ3LCAweDVlLCAweDBmLCAweDBhLAorICAweGViLCAweDc4LCAweDFlLCAweDBlLCAweDhmLCAweDMwLCAweDA0LCAweDg1LCAweDlmLCAweGQyLCAweGM3LCAweDEyLAorICAweDgwLCAweDg1LCAweDA4LCAweDMxLCAweDA4LCAweDFlLCAweGRiLCAweDRhLCAweDQ1LCAweDY1LCAweGY1LCAweDU2LAorICAweDE2LCAweDA5LCAweDQxLCAweDZhLCAweGU0LCAweDViLCAweDViLCAweDNiLCAweDgyLCAweDQzLCAweDNlLCAweDdlLAorICAweDNmLCAweGUyLCAweDhhLCAweGMwLCAweDBlLCAweGU2LCAweDRmLCAweGFkLCAweDUzLCAweGM4LCAweGRmLCAweGQ5LAorICAweGFlLCAweGJiLCAweGRkLCAweGY1LCAweGZmLCAweGNmLCAweDE0LCAweGVkLCAweGNmLCAweDcxLCAweDVlLCAweDFiLAorICAweDI3LCAweGRkLCAweGM2LCAweGYxLCAweDU2LCAweDQ2LCAweDg2LCAweDk5LCAweDg2LCAweGI4LCAweDkxLCAweGU4LAorICAweDU4LCAweDY5LCAweGRlLCAweDgxLCAweDExLCAweDk1LCAweGYyLCAweDc4LCAweDdlLCAweDMwLCAweDg3LCAweGFhLAorICAweGE5LCAweGQ3LCAweDljLCAweDQ1LCAweDk5LCAweGEyLCAweGI2LCAweDQ5LCAweGI2LCAweDY5LCAweDY1LCAweDk1LAorICAweDk1LCAweDQ2LCAweDkxLCAweDIyLCAweGU5LCAweDY3LCAweGVmLCAweDM5LCAweDY1LCAweGI2LCAweDUwLCAweDEyLAorICAweGZkLCAweGMwLCAweDA0LCAweDc3LCAweDg5LCAweGE4LCAweDM0LCAweDJkLCAweDIzLCAweGZhLCAweGY0LCAweGRmLAorICAweGE3LCAweGZiLCAweGZkLCAweDk5LCAweGVhLCAweDUxLCAweDJmLCAweGY0LCAweDQ1LCAweDFhLCAweDEyLCAweDlmLAorICAweDkzLCAweDgyLCAweDdjLCAweGU0LCAweDI0LCAweGRmLCAweGNiLCAweGY0LCAweDdjLCAweGZkLCAweDgzLCAweDRmLAorICAweDZmLCAweDBkLCAweGQ0LCAweGYwLCAweDZhLCAweDA3LCAweDIxLCAweDFhLCAweDhmLCAweGUwLCAweDJmLCAweDdmLAorICAweGZmLCAweGZmLCAweDFkLCAweDZmLCAweGEyLCAweGMxLCAweDUyLCAweDA2LCAweDEwLCAweDA2LCAweDhkLCAweDJhLAorICAweGViLCAweDg5LCAweDc1LCAweDZiLCAweDU1LCAweDQyLCAweDU0LCAweDUwLCAweDQ1LCAweDAyLCAweDIyLCAweDU5LAorICAweDM4LCAweGE4LCAweGM4LCAweDQ1LCAweDI3LCAweDJlLCAweGJlLCAweDA2LCAweDU4LCAweDMxLCAweDAwLCAweDNhLAorICAweGRkLCAweDlmLCAweDVhLCAweDhlLCAweDVjLCAweDE2LCAweDA0LCAweDFjLCAweDA4LCAweDdkLCAweDczLCAweGZkLAorICAweDdjLCAweGFhLCAweDNmLCAweDlmLCAweGRhLCAweGI4LCAweDcxLCAweDMxLCAweDk3LCAweGYzLCAweDJjLCAweDBiLAorICAweDY2LCAweDEyLCAweGNiLCAweDg2LCAweGQ4LCAweDVkLCAweDAxLCAweDhiLCAweGRhLCAweGExLCAweDk4LCAweDI0LAorICAweDJkLCAweGJkLCAweDlmLCAweDI0LCAweDQ5LCAweDJhLCAweDZmLCAweGRkLCAweDcyLCAweGE4LCAweDY3LCAweDg4LAorICAweDE1LCAweDczLCAweDEzLCAweGFjLCAweDNkLCAweGU0LCAweDFiLCAweGNmLCAweGMwLCAweDZiLCAweDg0LCAweGEyLAorICAweDVmLCAweDI3LCAweDNlLCAweGYzLCAweGQ2LCAweDM5LCAweDNhLCAweDhiLCAweDA5LCAweDNkLCAweDM4LCAweGU0LAorICAweDI2LCAweDgzLCAweDc4LCAweDdhLCAweDVjLCAweGQxLCAweGI4LCAweGQ2LCAweDY0LCAweGRjLCAweGQxLCAweGJmLAorICAweGQ2LCAweDIwLCAweDZlLCAweGQyLCAweDQ3LCAweDQzLCAweDRjLCAweDM5LCAweDM4LCAweDM0LCAweDc0LCAweDYzLAorICAweDg3LCAweGYxLCAweDZlLCAweGVhLCAweGQzLCAweDBjLCAweGZiLCAweDcxLCAweDRlLCAweDJjLCAweDI0LCAweDI4LAorICAweDcwLCAweGIyLCAweGFmLCAweGQ3LCAweGE5LCAweDZmLCAweDU0LCAweDJlLCAweDFiLCAweGNhLCAweGI1LCAweDdiLAorICAweDZiLCAweDViLCAweDkwLCAweDExLCAweDk2LCAweDI4LCAweGQ0LCAweDVlLCAweGRjLCAweDNhLCAweGU2LCAweDU0LAorICAweDIzLCAweDFmLCAweDIxLCAweDhjLCAweDBjLCAweDk3LCAweGJhLCAweGIwLCAweDg0LCAweDNjLCAweDhhLCAweGRkLAorICAweDVlLCAweGQ0LCAweGQ5LCAweDBmLCAweDBlLCAweDlhLCAweGJiLCAweGU2LCAweDJhLCAweGIxLCAweDkwLCAweDNiLAorICAweDQ3LCAweGU4LCAweGYzLCAweDQxLCAweDBkLCAweGUzLCAweDU2LCAweDVkLCAweDk0LCAweDViLCAweGQ0LCAweDQzLAorICAweDczLCAweDNmLCAweDcxLCAweDc5LCAweGRhLCAweDFlLCAweGFiLCAweDZkLCAweDYxLCAweDU1LCAweGVjLCAweDc2LAorICAweDU0LCAweDZhLCAweGI3LCAweDYzLCAweDQxLCAweDNkLCAweDMwLCAweDcyLCAweGY3LCAweGE3LCAweDA1LCAweDhlLAorICAweDk5LCAweDlhLCAweGFkLCAweDcxLCAweDFkLCAweDI1LCAweGJmLCAweGQ0LCAweDg2LCAweDk5LCAweDZlLCAweDcwLAorICAweDEwLCAweDE1LCAweDM3LCAweDRiLCAweGQ2LCAweGRkLCAweDM1LCAweGYwLCAweDI0LCAweDljLCAweDViLCAweGI2LAorICAweGZlLCAweGZhLCAweDAyLCAweGRjLCAweGQ5LCAweGY3LCAweDllLCAweGQ2LCAweDAwLCAweDkzLCAweGIzLCAweGY5LAorICAweGE4LCAweDUwLCAweDc0LCAweDE4LCAweDg0LCAweDA0LCAweDJhLCAweDQxLCAweDg4LCAweDQzLCAweDQ2LCAweDRhLAorICAweGNhLCAweDlmLCAweDEwLCAweGI4LCAweGUwLCAweDQxLCAweDAzLCAweDZiLCAweDI1LCAweDA5LCAweDE2LCAweGU3LAorICAweDliLCAweGJkLCAweGJlLCAweDBlLCAweGRkLCAweDg0LCAweDYxLCAweGI3LCAweDJlLCAweDU4LCAweDc0LCAweDQzLAorICAweGJkLCAweGZjLCAweDU1LCAweGQ4LCAweDcyLCAweDE0LCAweDNiLCAweDVmLCAweGFhLCAweGYzLCAweGQ2LCAweGE4LAorICAweGQ1LCAweDQwLCAweDIxLCAweGNjLCAweDNkLCAweDIwLCAweGJhLCAweGMwLCAweDRmLCAweDFhLCAweDUwLCAweDRiLAorICAweDk4LCAweDVjLCAweDU0LCAweDNlLCAweDc4LCAweGQxLCAweGNjLCAweGU4LCAweDFhLCAweGRlLCAweDYyLCAweGI4LAorICAweGI2LCAweGM0LCAweDhiLCAweDA1LCAweDMyLCAweDFiLCAweGM1LCAweGY5LCAweDQ1LCAweGZiLCAweDkyLCAweDQ5LAorICAweDY2LCAweDRlLCAweDEwLCAweDNjLCAweGY4LCAweDVhLCAweGIyLCAweGFjLCAweGJhLCAweGI0LCAweDM3LCAweGQxLAorICAweDdlLCAweGQzLCAweDAwLCAweDg0LCAweGJjLCAweGZhLCAweDMzLCAweDg5LCAweDdlLCAweDY4LCAweDk2LCAweDAwLAorICAweDU3LCAweDgzLCAweDgxLCAweGQyLCAweDE4LCAweGJlLCAweDc0LCAweDRiLCAweDhiLCAweDhkLCAweDZlLCAweDAwLAorICAweDQ0LCAweDY5LCAweDYyLCAweGE2LCAweDNkLCAweGI5LCAweGIyLCAweGQwLCAweDUwLCAweGQ3LCAweDE1LCAweGM1LAorICAweDczLCAweDc3LCAweDcwLCAweDk1LCAweDNkLCAweGExLCAweGI3LCAweDA3LCAweDFlLCAweDM5LCAweGM0LCAweDg0LAorICAweDIwLCAweGY4LCAweDZhLCAweGI1LCAweGJmLCAweGFmLCAweGRjLCAweDM4LCAweDIxLCAweDFhLCAweDk0LCAweDc1LAorICAweGJlLCAweDkyLCAweGMxLCAweDQ0LCAweDExLCAweDEwLCAweGEwLCAweDQ3LCAweDA0LCAweDE3LCAweDEzLCAweDU1LAorICAweDVhLCAweDhjLCAweDg0LCAweDE0LCAweDgwLCAweGExLCAweDU5LCAweDBlLCAweDY2LCAweDFjLCAweDQ2LCAweGE3LAorICAweGFiLCAweDlkLCAweDIzLCAweDY1LCAweDY4LCAweDk2LCAweDhhLCAweGU4LCAweDIwLCAweGQ5LCAweGU1LCAweDlmLAorICAweGQ1LCAweDgzLCAweDk2LCAweDlmLCAweGNjLCAweDdmLCAweDdmLCAweGQ5LCAweDNiLCAweDI1LCAweDJkLCAweDlhLAorICAweDYyLCAweDEwLCAweDA5LCAweDk4LCAweGUyLCAweGZkLCAweGE1LCAweGFkLCAweDNhLCAweDFiLCAweGI4LCAweGU2LAorICAweDFjLCAweGY5LCAweGRmLCAweGY0LCAweGNhLCAweDc0LCAweGQwLCAweDZiLCAweGZkLCAweGIwLCAweGYxLCAweDhkLAorICAweGEzLCAweGU1LCAweDQwLCAweDNmLCAweGI0LCAweDNlLCAweDliLCAweDBmLCAweDQxLCAweDA3LCAweGFjLCAweGQ3LAorICAweDMxLCAweDU5LCAweDU1LCAweDY0LCAweGI5LCAweDlhLCAweDgxLCAweDFhLCAweDI5LCAweDU1LCAweGYxLCAweDhhLAorICAweDVjLCAweGRiLCAweDA2LCAweDkyLCAweDlkLCAweDY4LCAweGQwLCAweGFiLCAweDE4LCAweDEyLCAweDY0LCAweDE4LAorICAweDMxLCAweGE4LCAweGRmLCAweDE0LCAweDliLCAweDM2LCAweDYwLCAweDNiLCAweGEyLCAweGNjLCAweGE5LCAweGY1LAorICAweGQ5LCAweDBhLCAweDlkLCAweDVlLCAweDQ1LCAweDM4LCAweGEwLCAweGJjLCAweDFkLCAweDA2LCAweGE2LCAweDFjLAorICAweGRmLCAweGE5LCAweGJjLCAweDM5LCAweGQ2LCAweGVlLCAweDE3LCAweDlhLCAweDMwLCAweDYyLCAweGViLCAweDVkLAorICAweGRiLCAweGQwLCAweDg3LCAweDJkLCAweGQ5LCAweDljLCAweGM4LCAweGUxLCAweDI3LCAweDVhLCAweDBlLCAweDEyLAorICAweDA5LCAweDZkLCAweGI4LCAweGE5LCAweGEwLCAweDkwLCAweGIyLCAweDE1LCAweGI1LCAweGIyLCAweDdiLCAweGNjLAorICAweDY2LCAweDkxLCAweGIwLCAweDNhLCAweDI1LCAweDU0LCAweDgwLCAweGRhLCAweDg0LCAweGQ2LCAweGI5LCAweGE5LAorICAweGJiLCAweDcyLCAweGRhLCAweDc0LCAweDU1LCAweGVhLCAweGU3LCAweDYzLCAweDI3LCAweDQyLCAweGJjLCAweDAzLAorICAweDlmLCAweDZhLCAweDVlLCAweDgzLCAweDJiLCAweDc1LCAweDI0LCAweGM5LCAweGM4LCAweGFlLCAweGRlLCAweDZlLAorICAweDk3LCAweDA3LCAweDFiLCAweGM4LCAweGUzLCAweGIyLCAweGZlLCAweDUxLCAweDI1LCAweDhjLCAweDJkLCAweGViLAorICAweDFjLCAweDE5LCAweDRiLCAweGZiLCAweDU4LCAweDNlLCAweDFkLCAweGQ0LCAweDVhLCAweGQwLCAweDE5LCAweDI1LAorICAweDkwLCAweDNkLCAweDQ0LCAweDlkLCAweGQ3LCAweDZkLCAweGNkLCAweDhjLCAweDNmLCAweDZmLCAweGM4LCAweGI4LAorICAweDdmLCAweGVlLCAweDE2LCAweGU0LCAweDlhLCAweDlkLCAweDdhLCAweDZhLCAweGIzLCAweGJiLCAweGJjLCAweDhkLAorICAweDhlLCAweDk5LCAweDA4LCAweDEyLCAweDAxLCAweDA0LCAweGU4LCAweDMxLCAweDA4LCAweDE3LCAweDc1LCAweDM4LAorICAweDQxLCAweDIzLCAweGEyLCAweGExLCAweDAwLCAweDQyLCAweDgzLCAweGZhLCAweDk0LCAweDUwLCAweGU0LCAweGVlLAorICAweDBkLCAweGM3LCAweGQ5LCAweDE2LCAweDU3LCAweGJlLCAweDhiLCAweGRmLCAweGI0LCAweGFlLCAweGQwLCAweGEwLAorICAweGE3LCAweGQ1LCAweDE4LCAweDlhLCAweDQ0LCAweDRjLCAweDU4LCAweDFkLCAweGQ0LCAweGI0LCAweDJkLCAweDM5LAorICAweDMxLCAweGZhLCAweDlkLCAweDFhLCAweDdhLCAweGI0LCAweDk4LCAweGNiLCAweGQ5LCAweDI3LCAweGYyLCAweGM0LAorICAweGFjLCAweDVmLCAweDRjLCAweDUxLCAweDYzLCAweGJmLCAweDU2LCAweDFhLCAweGU0LCAweDc3LCAweDhjLCAweGZjLAorICAweGExLCAweDU3LCAweGI2LCAweDY4LCAweDY2LCAweGVhLCAweGIzLCAweGVhLCAweDZhLCAweGNiLCAweDhkLCAweDJmLAorICAweDdmLCAweDhlLCAweDQ0LCAweGUwLCAweDMyLCAweDQwLCAweDhjLCAweDVhLCAweDJhLCAweDJkLCAweGU1LCAweGI4LAorICAweGM5LCAweDIxLCAweDA5LCAweGZiLCAweGNhLCAweDc5LCAweDM0LCAweDQ3LCAweGIwLCAweDkwLCAweDk0LCAweDZmLAorICAweGRlLCAweDkxLCAweDEyLCAweDFlLCAweGQ1LCAweDE1LCAweDgyLCAweDY5LCAweDRlLCAweGYwLCAweDcwLCAweDBhLAorICAweGNjLCAweDQ3LCAweDUwLCAweDAyLCAweDRiLCAweGY4LCAweGFlLCAweGYxLCAweDEyLCAweGM1LCAweGM2LCAweGVlLAorICAweDczLCAweDIxLCAweDBkLCAweDNlLCAweGFmLCAweDMzLCAweDU5LCAweDQ0LCAweDViLCAweDMzLCAweGU3LCAweGRlLAorICAweGM1LCAweGRkLCAweDA1LCAweGZkLCAweDllLCAweDVkLCAweDFiLCAweDUyLCAweGJlLCAweGU5LCAweGUyLCAweGU2LAorICAweDkzLCAweDQ4LCAweDcwLCAweDIxLCAweDFhLCAweDk0LCAweDk1LCAweGJlLCAweDhiLCAweDA1LCAweDQxLCAweDkyLAorICAweGQ4LCAweDQ2LCAweDEwLCAweDVmLCAweDQxLCAweDcwLCAweDY4LCAweGUzLCAweDEyLCAweGMwLCAweDAwLCAweDJmLAorICAweDkxLCAweDkzLCAweDQyLCAweDQwLCAweDQ1LCAweGVlLCAweGQyLCAweDZmLCAweDgzLCAweGI0LCAweDJjLCAweGQxLAorICAweDEwLCAweDEwLCAweGZlLCAweGM1LCAweGE0LCAweDNmLCAweDFiLCAweDkyLCAweDMyLCAweDUxLCAweDI5LCAweDJhLAorICAweGJhLCAweDVkLCAweGZjLCAweDViLCAweDQ0LCAweDE2LCAweDZiLCAweGZmLCAweDM3LCAweDAzLCAweDMzLCAweGVlLAorICAweDM1LCAweGM1LCAweDc1LCAweGFlLCAweDE1LCAweGQyLCAweDMwLCAweGQ2LCAweDVkLCAweGUwLCAweGU2LCAweDhjLAorICAweDcyLCAweDJiLCAweDk5LCAweDU0LCAweDY2LCAweGE5LCAweGViLCAweDVmLCAweGNiLCAweDAyLCAweGM3LCAweDNiLAorICAweGExLCAweDFjLCAweDRhLCAweDg0LCAweGY2LCAweGZiLCAweDNhLCAweDRiLCAweDc2LCAweDgzLCAweDJmLCAweGE0LAorICAweDYwLCAweDgxLCAweDQ4LCAweDQ2LCAweDcxLCAweDkzLCAweDc0LCAweDUwLCAweGVjLCAweGE5LCAweGY4LCAweGU1LAorICAweDU2LCAweDA5LCAweGJiLCAweDdhLCAweDk0LCAweGMwLCAweDhjLCAweGY2LCAweDk5LCAweDdjLCAweGQ1LCAweDM1LAorICAweDA0LCAweDQ1LCAweDQ2LCAweDQwLCAweDM0LCAweDkyLCAweGM0LCAweGExLCAweGMxLCAweDMyLCAweDYxLCAweDUwLAorICAweDY3LCAweGRlLCAweGJjLCAweGRiLCAweGQyLCAweDg1LCAweDJlLCAweDAxLCAweDQyLCAweGEzLCAweDI5LCAweDc3LAorICAweGMxLCAweGE1LCAweDQyLCAweGU0LCAweDg0LCAweDg0LCAweDU1LCAweDM4LCAweDEwLCAweGRkLCAweDk4LCAweDZjLAorICAweGY1LCAweGFlLCAweGY5LCAweGU4LCAweDg0LCAweDcyLCAweDliLCAweGVjLCAweGI5LCAweDFmLCAweGEyLCAweDA3LAorICAweDQyLCAweGE1LCAweGJlLCAweDczLCAweDY5LCAweDdiLCAweDFjLCAweGQ0LCAweGY3LCAweDE5LCAweDRkLCAweDJiLAorICAweDYyLCAweDRiLCAweDQ0LCAweGU2LCAweGE1LCAweDY2LCAweGFiLCAweGZjLCAweGFhLCAweDYzLCAweDNjLCAweGIxLAorICAweGUyLCAweDYyLCAweGE0LCAweGQ3LCAweGNiLCAweDJlLCAweGU4LCAweDgwLCAweDdkLCAweDBjLCAweGI2LCAweDY4LAorICAweGMwLCAweGM3LCAweGY0LCAweGZiLCAweDgxLCAweDY1LCAweGI0LCAweDZmLCAweDU4LCAweGIyLCAweDExLCAweGQ4LAorICAweDdmLCAweDYzLCAweGRkLCAweDU3LCAweDEzLCAweGI0LCAweDIzLCAweDU4LCAweDQ0LCAweDM2LCAweDg4LCAweDkwLAorICAweGFlLCAweGMxLCAweDRjLCAweDBlLCAweGM3LCAweDEwLCAweDI1LCAweGMzLCAweDA3LCAweDY5LCAweDI1LCAweDBjLAorICAweDljLCAweDdjLCAweGRmLCAweDc0LCAweDI0LCAweDZkLCAweDEwLCAweGUxLCAweDkyLCAweDA0LCAweDQyLCAweDBhLAorICAweDkwLCAweGUzLCAweDgyLCAweDkzLCAweDRkLCAweDMxLCAweDA4LCAweGUzLCAweDk0LCAweDEwLCAweGM1LCAweGUwLAorICAweGE2LCAweDc0LCAweDQzLCAweGE3LCAweGJjLCAweGU3LCAweDhjLCAweDU1LCAweGQ5LCAweDhlLCAweGVkLCAweDg4LAorICAweGFmLCAweDZiLCAweDU4LCAweDgxLCAweGYyLCAweGRkLCAweDJiLCAweDExLCAweDY5LCAweGQ2LCAweDkzLCAweDZlLAorICAweGZjLCAweGRlLCAweDFkLCAweDRkLCAweDFlLCAweGFmLCAweDk1LCAweDQzLCAweDMyLCAweDRjLCAweDNjLCAweDNjLAorICAweGFlLCAweDVlLCAweGJmLCAweDVkLCAweGFiLCAweGNiLCAweGZiLCAweGE4LCAweGRkLCAweGFmLCAweDA0LCAweDZjLAorICAweGE1LCAweDU0LCAweGMyLCAweDllLCAweDhkLCAweDBlLCAweGVmLCAweDU3LCAweDJlLCAweDhkLCAweGQ5LCAweGI2LAorICAweDE0LCAweGRiLCAweDViLCAweDFhLCAweDBmLCAweDZlLCAweDc1LCAweGM4LCAweDk5LCAweGQ0LCAweDA4LCAweGI0LAorICAweDYyLCAweGMwLCAweDc2LCAweDBiLCAweDQxLCAweDQ3LCAweDMzLCAweDZmLCAweDY3LCAweGNmLCAweDU2LCAweDM2LAorICAweDhjLCAweDM3LCAweDAwLCAweDUwLCAweDRjLCAweDAyLCAweDVkLCAweDNiLCAweDY4LCAweGM2LCAweGQ2LCAweDA0LAorICAweDAwLCAweDE2LCAweDhjLCAweDk4LCAweDQzLCAweDNkLCAweGI4LCAweGY0LCAweGFjLCAweDg1LCAweDI5LCAweDBiLAorICAweGM0LCAweDlhLCAweGUwLCAweDI2LCAweDM0LCAweDFjLCAweGI5LCAweDdiLCAweGE2LCAweDYyLCAweGM5LCAweGQ1LAorICAweDgyLCAweDdmLCAweDNkLCAweDNlLCAweDM4LCAweDQ2LCAweDIyLCAweGRmLCAweDZkLCAweDZjLCAweDBmLCAweDNmLAorICAweGNjLCAweDNkLCAweDc1LCAweDdmLCAweDA0LCAweDkwLCAweDk2LCAweGI5LCAweGU0LCAweDNiLCAweGFkLCAweDEwLAorICAweDcwLCAweDIxLCAweDFhLCAweDk0LCAweGFkLCAweGJlLCAweDhjLCAweGM0LCAweDIyLCAweDk4LCAweDg5LCAweDQxLAorICAweDVkLCAweDFkLCAweDBlLCAweDgwLCAweGUxLCAweDU2LCAweDAwLCAweDAwLCAweDA2LCAweGJlLCAweGE5LCAweGM1LAorICAweGRkLCAweGI0LCAweDM5LCAweDY4LCAweDIzLCAweDU2LCAweGEzLCAweGVmLCAweDNjLCAweGZmLCAweGJkLCAweDc1LAorICAweDZjLCAweGY4LCAweGM4LCAweDI3LCAweGU1LCAweDIzLCAweDlmLCAweDIxLCAweDhlLCAweGVjLCAweGQxLCAweGVlLAorICAweDVkLCAweGViLCAweGQyLCAweDc4LCAweDVkLCAweDk3LCAweGQxLCAweDk2LCAweDE2LCAweDIxLCAweDk0LCAweDFlLAorICAweGIwLCAweGNhLCAweGMwLCAweDIyLCAweGU5LCAweDBmLCAweDBjLCAweGFhLCAweGIyLCAweGM0LCAweGMxLCAweGM3LAorICAweDkxLCAweGFjLCAweGIyLCAweDhiLCAweDA2LCAweDk0LCAweGU5LCAweDE3LCAweGJmLCAweDFhLCAweDliLCAweDhjLAorICAweDE5LCAweGFjLCAweGRlLCAweGE5LCAweDY0LCAweDI1LCAweGQ5LCAweDI4LCAweDE2LCAweDM2LCAweDJkLCAweDQ1LAorICAweDk2LCAweDE5LCAweGVmLCAweDBkLCAweGQwLCAweDVlLCAweDllLCAweDFmLCAweDc0LCAweGFkLCAweDAxLCAweDlkLAorICAweDJhLCAweDlhLCAweGJiLCAweGU1LCAweGI5LCAweGU5LCAweGVmLCAweGY3LCAweGJiLCAweGQ3LCAweGZjLCAweDNmLAorICAweDg3LCAweDE3LCAweGQ2LCAweGJkLCAweDk3LCAweGYyLCAweGVkLCAweGU3LCAweDljLCAweGY5LCAweDNjLCAweGM1LAorICAweDlhLCAweDM4LCAweDM5LCAweDliLCAweGFiLCAweGU0LCAweDFhLCAweDZjLCAweGNhLCAweGJkLCAweDg2LCAweDM4LAorICAweDkwLCAweGM3LCAweGM2LCAweDE1LCAweGUwLCAweDhmLCAweDI0LCAweDkzLCAweDY5LCAweDAyLCAweGJlLCAweDk0LAorICAweDIwLCAweGZiLCAweDgzLCAweGU4LCAweGNjLCAweDQ3LCAweGU2LCAweDJkLCAweDJhLCAweDIzLCAweDA1LCAweDg5LAorICAweDc2LCAweDVhLCAweDA5LCAweDk2LCAweDJkLCAweGE2LCAweDVkLCAweDI0LCAweDZhLCAweDVjLCAweDgxLCAweDhkLAorICAweDk5LCAweDU0LCAweDkxLCAweGQ2LCAweDYxLCAweDdhLCAweDYyLCAweDY4LCAweGMxLCAweDY0LCAweDUwLCAweDBhLAorICAweGU1LCAweDIzLCAweDNlLCAweGI0LCAweDZmLCAweDMzLCAweDNhLCAweDgwLCAweDAwLCAweDYwLCAweDMwLCAweDc2LAorICAweGRlLCAweGVmLCAweDQ0LCAweGMwLCAweDczLCAweGE5LCAweDMzLCAweGJlLCAweDY0LCAweGE2LCAweGFlLCAweDgyLAorICAweDZkLCAweDgwLCAweDAxLCAweDFmLCAweDY3LCAweGE0LCAweDQxLCAweGQ0LCAweDYzLCAweDEwLCAweDAyLCAweDQ5LAorICAweGE2LCAweDVkLCAweGI0LCAweGNiLCAweDVhLCAweDUyLCAweDIwLCAweGMxLCAweDk2LCAweDE3LCAweDM1LCAweDllLAorICAweDA2LCAweDc1LCAweDkxLCAweDI2LCAweDYxLCAweGZmLCAweDc2LCAweGM3LCAweDBlLCAweDdhLCAweGI4LCAweGVhLAorICAweDcwLCAweDEzLCAweDJiLCAweGM5LCAweDIwLCAweDM5LCAweDNjLCAweDNlLCAweDQ1LCAweDhjLCAweGIwLCAweGMyLAorICAweGQ1LCAweDRjLCAweDhmLCAweDAxLCAweGEwLCAweDRlLCAweGQ4LCAweGY0LCAweDNhLCAweDNlLCAweDFmLCAweDVmLAorICAweDNjLCAweDg1LCAweGVmLCAweGY3LCAweDViLCAweDVkLCAweGNmLCAweDRmLCAweGQ0LCAweGVhLCAweDg5LCAweGU3LAorICAweGMzLCAweDQ1LCAweDBmLCAweGMyLCAweGFlLCAweDcyLCAweDk4LCAweDU2LCAweDNjLCAweGZjLCAweDc1LCAweDBlLAorICAweGVmLCAweDc2LCAweGNkLCAweDUwLCAweDU4LCAweGRhLCAweGZkLCAweGVjLCAweDNiLCAweDc1LCAweDRkLCAweGUzLAorICAweDRhLCAweGI5LCAweDQ0LCAweDQyLCAweDU4LCAweGNhLCAweDYwLCAweDAwLCAweDcyLCAweGY5LCAweGU1LCAweDc3LAorICAweDRhLCAweDVmLCAweDJhLCAweDk2LCAweDg2LCAweGUzLCAweDAxLCAweDMyLCAweDBlLCAweDZiLCAweGRlLCAweGM5LAorICAweDE1LCAweDE1LCAweDQ1LCAweDU0LCAweDI2LCAweDJlLCAweDQ1LCAweDQwLCAweDVlLCAweGNiLCAweDI5LCAweGQ1LAorICAweDk1LCAweDRkLCAweDJhLCAweDA4LCAweDIyLCAweGY5LCAweDVlLCAweDc0LCAweGU4LCAweGUxLCAweDI1LCAweDI3LAorICAweGYwLCAweDYyLCAweDk1LCAweDkzLCAweDRhLCAweDBhLCAweDJjLCAweDI2LCAweGFjLCAweGQwLCAweDY4LCAweDYwLAorICAweDk1LCAweGQ5LCAweDFiLCAweDdmLCAweDNiLCAweGFjLCAweDBhLCAweDc3LCAweGYwLCAweDIxLCAweGU1LCAweGM2LAorICAweDdlLCAweDVkLCAweDdjLCAweDdlLCAweDcwLCAweGUwLCAweDIxLCAweDFhLCAweDhkLCAweGNmLCAweDkwLCAweDFmLAorICAweGZmLCAweGZmLCAweDJkLCAweDZmLCAweDgyLCAweDMxLCAweDUwLCAweDQ2LCAweGIyLCAweDFhLCAweDA0LCAweDQyLAorICAweDFlLCAweDYzLCAweDliLCAweGI2LCAweGEyLCAweGM5LCAweDY5LCAweGJlLCAweDEwLCAweDA0LCAweGExLCAweDAwLAorICAweDJhLCAweDQ5LCAweGUxLCAweDc0LCAweDdhLCAweGY3LCAweDcxLCAweGZkLCAweDI1LCAweGM1LCAweGY4LCAweDMyLAorICAweDAxLCAweDE3LCAweDYzLCAweGFjLCAweDQ5LCAweGE0LCAweGJlLCAweGU5LCAweGQ4LCAweDlmLCAweGYzLCAweGY1LAorICAweGE0LCAweGY1LCAweDg5LCAweGI5LCAweDcyLCAweGU1LCAweGIwLCAweGM1LCAweDg4LCAweDY5LCAweDE5LCAweGM0LAorICAweDQzLCAweDU3LCAweGM3LCAweDMzLCAweDhhLCAweGE2LCAweDcyLCAweGRhLCAweGI2LCAweDE1LCAweDljLCAweGIzLAorICAweDdjLCAweGIwLCAweDZjLCAweDI2LCAweDEwLCAweDg2LCAweDVlLCAweDc1LCAweDU2LCAweGEzLCAweDgwLCAweDRiLAorICAweGFmLCAweGNhLCAweGY5LCAweGEzLCAweGM0LCAweDlkLCAweDZmLCAweGVjLCAweDRlLCAweDY4LCAweDY4LCAweDU4LAorICAweGI5LCAweDQ0LCAweDM3LCAweDZjLCAweDc2LCAweDgwLCAweDA5LCAweDg0LCAweGExLCAweDdjLCAweGEzLCAweDFkLAorICAweGY0LCAweGQ2LCAweDgzLCAweDg1LCAweGQ3LCAweDc5LCAweDA0LCAweDczLCAweDgyLCAweDBkLCAweDA4LCAweGM2LAorICAweDk4LCAweDE1LCAweGIyLCAweGY5LCAweDk0LCAweDYzLCAweDA3LCAweGE1LCAweDZlLCAweDE5LCAweDM0LCAweGQ3LAorICAweDRjLCAweGJlLCAweDkxLCAweDZiLCAweGNlLCAweDMxLCAweDliLCAweDVhLCAweDEzLCAweGM4LCAweDE2LCAweDg0LAorICAweDZlLCAweGQxLCAweGQ2LCAweGI2LCAweGNkLCAweGEzLCAweDNiLCAweGM4LCAweGRkLCAweDY0LCAweGVmLCAweGY1LAorICAweDA4LCAweDc1LCAweDdhLCAweDUwLCAweGIxLCAweDc3LCAweDJlLCAweDkyLCAweGMxLCAweGQ4LCAweGFhLCAweDgzLAorICAweDE0LCAweDExLCAweDg4LCAweDViLCAweDQyLCAweDU3LCAweDUyLCAweDUyLCAweGY5LCAweGJhLCAweGE4LCAweDMxLAorICAweGViLCAweDgyLCAweDgxLCAweDNkLCAweDI5LCAweDM3LCAweDdkLCAweDM4LCAweDQ4LCAweGFiLCAweDBkLCAweGEzLAorICAweDUwLCAweDJiLCAweDI4LCAweGNkLCAweDI5LCAweGZjLCAweDQ2LCAweGYzLCAweDM5LCAweDY1LCAweDU4LCAweDI0LAorICAweDZjLCAweGY0LCAweDViLCAweDE1LCAweDIxLCAweDA0LCAweDJlLCAweDIyLCAweDAwLCAweDY4LCAweDgwLCAweGQ0LAorICAweDVjLCAweDY4LCAweGIxLCAweDQyLCAweDYxLCAweDAwLCAweDM5LCAweGJhLCAweGVmLCAweDRlLCAweGUyLCAweGVhLAorICAweGJlLCAweDYxLCAweGM3LCAweDVlLCAweDI2LCAweGRlLCAweGUyLCAweDgyLCAweDJlLCAweDQxLCAweDIyLCAweGE4LAorICAweDg5LCAweDkzLCAweGU1LCAweGNlLCAweGVmLCAweGU5LCAweDk0LCAweGQwLCAweGQwLCAweDM2LCAweDA5LCAweDc2LAorICAweDFlLCAweGQ5LCAweDlkLCAweGViLCAweGVjLCAweDY3LCAweGQxLCAweGViLCAweDljLCAweGJiLCAweDkyLCAweDM2LAorICAweDNmLCAweGEyLCAweDUzLCAweDcxLCAweDM0LCAweGU0LCAweDhkLCAweDJhLCAweGNjLCAweGVmLCAweGNmLCAweGI5LAorICAweDI0LCAweGQ2LCAweGNhLCAweDFjLCAweGNmLCAweGViLCAweGU1LCAweDcwLCAweDFmLCAweDRlLCAweGQ2LCAweGZkLAorICAweDRkLCAweGIwLCAweDZlLCAweGJhLCAweDM0LCAweGYyLCAweDMxLCAweGVmLCAweDFiLCAweDE0LCAweDI2LCAweDhhLAorICAweDNkLCAweGNhLCAweGFhLCAweDI3LCAweGY3LCAweGY1LCAweDA2LCAweDFlLCAweDRkLCAweDY2LCAweGFlLCAweGMxLAorICAweDQ4LCAweDA3LCAweDRlLCAweGI0LCAweDM3LCAweGMxLCAweDQwLCAweDMzLCAweDU1LCAweDNmLCAweDE0LCAweGRkLAorICAweDAyLCAweDhiLCAweDEzLCAweDliLCAweDk0LCAweDYwLCAweDA0LCAweDNjLCAweDE1LCAweGI4LCAweDlkLCAweDUwLAorICAweDhmLCAweDMxLCAweDdiLCAweDA1LCAweGEzLCAweDY4LCAweDI5LCAweGFhLCAweGJmLCAweDM5LCAweDdkLCAweGVkLAorICAweDI4LCAweDExLCAweDRiLCAweDNhLCAweGE3LCAweDBkLCAweDNjLCAweDdkLCAweGUzLCAweDdhLCAweDQ4LCAweGE2LAorICAweDE2LCAweGFhLCAweGU4LCAweDI1LCAweDExLCAweDdiLCAweDVhLCAweGFiLCAweDRkLCAweGVkLCAweDBjLCAweDVlLAorICAweDY3LCAweDZlLCAweDI4LCAweDg0LCAweGY0LCAweDJiLCAweDE4LCAweDM4LCAweDU2LCAweDIxLCAweGVhLCAweDM0LAorICAweDJkLCAweDU2LCAweGMwLCAweDAwLCAweGUwLCAweDIxLCAweDFhLCAweDhmLCAweGNlLCAweDE4LCAweDFmLCAweGZmLAorICAweGZmLCAweDJkLCAweDcwLCAweDgxLCAweGIxLCAweDg4LCAweDgyLCAweGEzLCAweDFiLCAweDU4LCAweGI4LCAweGQ0LAorICAweDJlLCAweGI4LCAweDExLCAweDJjLCAweGIwLCAweDAwLCAweDA1LCAweDA3LCAweDJmLCAweGE5LCAweDcxLCAweGZmLAorICAweGQ0LCAweDMxLCAweGY4LCAweGY3LCAweDlmLCAweDQyLCAweDcwLCAweDBiLCAweDllLCAweDk1LCAweGE0LCAweDMzLAorICAweDQ1LCAweGNiLCAweGRlLCAweDc4LCAweDRlLCAweDE3LCAweGVjLCAweGJjLCAweGRkLCAweGY4LCAweDhlLCAweDNmLAorICAweGIyLCAweGUyLCAweGYwLCAweGYzLCAweGZiLCAweDc3LCAweDM0LCAweGEyLCAweGE0LCAweDcxLCAweDhmLCAweGI2LAorICAweDM5LCAweGM2LCAweDk4LCAweDkxLCAweDFiLCAweGFmLCAweGZlLCAweDdiLCAweDk3LCAweDUwLCAweGUzLCAweGQwLAorICAweGIwLCAweDc4LCAweDNiLCAweDJiLCAweGNkLCAweGM0LCAweDVkLCAweGFiLCAweGU0LCAweGUzLCAweDU1LCAweDVkLAorICAweGNhLCAweGU5LCAweDZjLCAweGUzLCAweDQxLCAweDc5LCAweDg5LCAweGY2LCAweDU0LCAweDMyLCAweGIzLCAweGE0LAorICAweDYwLCAweDdiLCAweGU3LCAweDMyLCAweDc2LCAweGYyLCAweGQyLCAweDI1LCAweDU1LCAweGE1LCAweDYxLCAweGQ0LAorICAweDlhLCAweGU3LCAweGNhLCAweDRjLCAweGQ2LCAweGEyLCAweDA4LCAweGJhLCAweGY4LCAweDhhLCAweDJiLCAweGIwLAorICAweGM0LCAweDBhLCAweDQ4LCAweGUxLCAweGI5LCAweDQ0LCAweDVjLCAweDgxLCAweDkwLCAweGE0LCAweDIwLCAweDFkLAorICAweDQ3LCAweDJiLCAweDFjLCAweGNlLCAweDY1LCAweGEwLCAweDY1LCAweGY4LCAweGNjLCAweGUxLCAweDc3LCAweDllLAorICAweDZiLCAweDEyLCAweGFmLCAweGFkLCAweGI5LCAweDQ3LCAweGZlLCAweGNkLCAweDM4LCAweDdiLCAweGE3LCAweDYwLAorICAweDg2LCAweGU0LCAweGI3LCAweDY2LCAweDhjLCAweDYwLCAweDhhLCAweDQ4LCAweGExLCAweDk2LCAweDUzLCAweGM4LAorICAweDI3LCAweGI3LCAweGRmLCAweGE3LCAweDBhLCAweDVhLCAweDUxLCAweGE0LCAweGEwLCAweGUxLCAweDZlLCAweDcxLAorICAweDYzLCAweGJkLCAweGFiLCAweDVmLCAweGViLCAweGUxLCAweGEwLCAweDlhLCAweDU4LCAweGJiLCAweDI4LCAweDZlLAorICAweDM0LCAweDM2LCAweGViLCAweDM4LCAweDA0LCAweGI1LCAweGJhLCAweDkwLCAweDY2LCAweDE3LCAweDI0LCAweDFiLAorICAweGJiLCAweGQxLCAweDc2LCAweDg1LCAweDk2LCAweGI2LCAweGExLCAweDQ0LCAweGE1LCAweDAwLCAweDE0LCAweDZjLAorICAweDI2LCAweDE3LCAweDQ3LCAweDFiLCAweGMxLCAweGY0LCAweDkzLCAweDViLCAweGFhLCAweGE5LCAweGZkLCAweDQ0LAorICAweGFiLCAweDFhLCAweDVhLCAweDI2LCAweDI4LCAweDc0LCAweGYzLCAweGI4LCAweDQ3LCAweDY0LCAweDIyLCAweDI3LAorICAweGFmLCAweDU4LCAweGUzLCAweDhiLCAweDA3LCAweDlmLCAweDUwLCAweGU0LCAweDhlLCAweGU2LCAweGVkLCAweGU5LAorICAweDBkLCAweDdmLCAweGRlLCAweDVkLCAweGFlLCAweGQ5LCAweDAyLCAweDYxLCAweDE1LCAweDViLCAweDM0LCAweDZjLAorICAweDIwLCAweDJkLCAweDM5LCAweDM1LCAweDY5LCAweDNiLCAweGRlLCAweGUxLCAweDYxLCAweGM4LCAweGRjLCAweGIwLAorICAweDc1LCAweDM3LCAweDgyLCAweDRhLCAweDgyLCAweGRkLCAweGE4LCAweDM5LCAweDg1LCAweDQ3LCAweDgwLCAweDRiLAorICAweDQ4LCAweGJlLCAweGRhLCAweGY0LCAweGM1LCAweDc5LCAweDgyLCAweDkyLCAweGJmLCAweDBhLCAweDg0LCAweDlkLAorICAweDY2LCAweDU4LCAweDNmLCAweGQ2LCAweGMwLCAweGUzLCAweGQ3LCAweGUwLCAweGUxLCAweDFjLCAweDY2LCAweDA4LAorICAweGQ1LCAweDQ5LCAweDk0LCAweDY5LCAweDAwLCAweDJkLCAweDNjLCAweDYxLCAweDYxLCAweDIxLCAweDE0LCAweDRjLAorICAweGU5LCAweDJhLCAweDFkLCAweDRjLCAweGQ3LCAweGQ5LCAweDA3LCAweGQ0LCAweDQyLCAweDA5LCAweGI1LCAweDQ3LAorICAweGJhLCAweDc3LCAweDg2LCAweDUyLCAweGEyLCAweGE4LCAweDVlLCAweGE1LCAweDZiLCAweDQwLCAweDZhLCAweDczLAorICAweDQ3LCAweDJlLCAweDBjLCAweDJiLCAweDRiLCAweDg3LCAweGJmLCAweDY1LCAweDFmLCAweGQ2LCAweDQ0LCAweGY3LAorICAweDJiLCAweDRlLCAweDlmLCAweDY5LCAweGZmLCAweDBjLCAweDU3LCAweDBlLCAweDIxLCAweDJhLCAweDhmLCAweDg3LAorICAweDVkLCAweDNiLCAweGZmLCAweGZmLCAweDI1LCAweDY3LCAweGE2LCAweDQwLCAweGQ4LCAweDYyLCAweGIyLCAweDI4LAorICAweDg0LCAweDE5LCAweGE1LCAweGFmLCAweDNhLCAweDU1LCAweDZhLCAweDIyLCAweGM4LCAweDA0LCAweGExLCAweDAwLAorICAweDIxLCAweGQ1LCAweDAwLCAweDMzLCAweDAxLCAweDI4LCAweDQ2LCAweDI0LCAweDEzLCAweGRkLCAweDZlLCAweDk3LAorICAweDQ5LCAweGQwLCAweDk2LCAweDEzLCAweDRkLCAweDE5LCAweDRkLCAweGZiLCAweDhlLCAweDUwLCAweGI1LCAweDc0LAorICAweDU5LCAweDBmLCAweDk0LCAweGRlLCAweGRmLCAweDZjLCAweGQ4LCAweDllLCAweDViLCAweGJiLCAweDU0LCAweDgxLAorICAweDM0LCAweGY1LCAweDYwLCAweGIwLCAweGRiLCAweDZmLCAweGVkLCAweDcyLCAweDMzLCAweGY5LCAweGRmLCAweGYwLAorICAweGZiLCAweGU2LCAweDhiLCAweDYyLCAweDhiLCAweDJjLCAweDdlLCAweDc4LCAweDRjLCAweDZjLCAweDhiLCAweGE2LAorICAweDE1LCAweGI4LCAweDA5LCAweGY1LCAweDc0LCAweGVlLCAweGIzLCAweDQwLCAweDk0LCAweDlmLCAweDVkLCAweDExLAorICAweDAzLCAweDdjLCAweDRmLCAweDFkLCAweGIyLCAweGM5LCAweDY4LCAweDRiLCAweDVlLCAweGZlLCAweDFkLCAweDAwLAorICAweGU0LCAweDEzLCAweDczLCAweGFjLCAweGZiLCAweGU2LCAweGJlLCAweDc1LCAweDE0LCAweDdlLCAweGYyLCAweDljLAorICAweGU0LCAweDA5LCAweGU2LCAweDExLCAweDRiLCAweDY2LCAweDM0LCAweDRlLCAweGYwLCAweGZkLCAweDIyLCAweDhiLAorICAweGE2LCAweDdjLCAweDYwLCAweGY1LCAweGMyLCAweDVkLCAweGE2LCAweGU3LCAweDZiLCAweDRhLCAweDMxLCAweDQxLAorICAweGE2LCAweDZkLCAweDMyLCAweDkyLCAweDQyLCAweGRmLCAweDNiLCAweGQ1LCAweGRhLCAweDVkLCAweGJkLCAweGJjLAorICAweGU5LCAweGJkLCAweDA5LCAweDg3LCAweDZlLCAweDI4LCAweGIxLCAweDUyLCAweDE1LCAweGIyLCAweDk0LCAweGExLAorICAweDI0LCAweDQxLCAweGJjLCAweDVkLCAweDVlLCAweDZjLCAweDNmLCAweGEwLCAweGMwLCAweDRhLCAweGNiLCAweDljLAorICAweDUzLCAweDdjLCAweDkyLCAweDUzLCAweGU5LCAweDMxLCAweGJlLCAweDdmLCAweGU1LCAweDQ2LCAweGQ4LCAweDkxLAorICAweDViLCAweDZhLCAweGVhLCAweGNiLCAweDNmLCAweDExLCAweGU2LCAweDZiLCAweGUwLCAweDEyLCAweGY2LCAweDhhLAorICAweDY5LCAweDk4LCAweDA0LCAweDJkLCAweDMzLCAweDRlLCAweDg4LCAweGI1LCAweGQxLCAweDZiLCAweDRhLCAweGQyLAorICAweDM0LCAweDI4LCAweDhkLCAweGQ4LCAweDA2LCAweGFhLCAweDA5LCAweGFmLCAweGEwLCAweDVhLCAweDdjLCAweDkwLAorICAweGE5LCAweGJjLCAweDc1LCAweGRkLCAweGE2LCAweDljLCAweDBjLCAweGU0LCAweDI3LCAweDBlLCAweDVkLCAweDVlLAorICAweDg4LCAweGRmLCAweDJhLCAweDg5LCAweDVlLCAweDIzLCAweGQ0LCAweDlkLCAweGFhLCAweDk3LCAweGI3LCAweGU3LAorICAweGZjLCAweGZlLCAweDcxLCAweDFlLCAweGRlLCAweDRlLCAweDMyLCAweGNkLCAweDhkLCAweGY0LCAweDZmLCAweDM3LAorICAweDU3LCAweDhjLCAweDBhLCAweGFhLCAweGVhLCAweDE4LCAweGEzLCAweDcwLCAweDhlLCAweDE4LCAweDE3LCAweGM4LAorICAweDQxLCAweDRjLCAweGNjLCAweGE4LCAweDY4LCAweDE0LCAweGFiLCAweGNjLCAweDAxLCAweDMyLCAweDM1LCAweGYxLAorICAweGYxLCAweGJlLCAweDYxLCAweGEzLCAweDhlLCAweDgxLCAweGQzLCAweGJiLCAweDc2LCAweGVlLCAweDllLCAweGYzLAorICAweDZlLCAweDFjLCAweDZkLCAweGYwLCAweGM3LCAweDE2LCAweGRiLCAweDNjLCAweDQwLCAweDUyLCAweDJiLCAweGNkLAorICAweDQ4LCAweGI4LCAweGEwLCAweDMzLCAweDlkLCAweDgxLCAweDQ4LCAweGIxLCAweDI4LCAweDEwLCAweDU2LCAweGY3LAorICAweDJmLCAweDBiLCAweDgwLCAweDUyLCAweDA5LCAweDQxLCAweDkxLCAweDY1LCAweDZlLCAweDAwLCAweDBiLCAweDRiLAorICAweDFhLCAweGQ5LCAweGYxLCAweDQxLCAweDc0LCAweDU0LCAweGE3LCAweDkxLCAweGE3LCAweGRjLCAweDFhLCAweGY1LAorICAweGM5LCAweDNlLCAweDQxLCAweGMwLCAweDIxLCAweDRjLCAweGQ4LCAweGZiLCAweGZmLCAweDVmLCAweGZmLCAweGZmLAorICAweDAwLCAweGM2LCAweGRhLCAweGE0LCAweGM4LCAweDc1LCAweGI4LCAweDY4LCAweDhhLCAweDVjLCAweDQ0LCAweDNhLAorICAweGYwLCAweGU3LCAweGIzLCAweDg3LCAweDAwLCAweDdlLCAweDhlLCAweDNhLCAweGI2LCAweDkwLCAweGFmLCAweGUxLAorICAweGQ2LCAweDlhLCAweDE1LCAweGE3LCAweGI5LCAweGMxLCAweDYxLCAweDQyLCAweGQ1LCAweDNmLCAweDk4LCAweGYyLAorICAweDJmLCAweGMwLCAweDY1LCAweDcwLCAweGZkLCAweDc2LCAweDZjLCAweDZlLCAweGRkLCAweDg2LCAweGM3LCAweDdjLAorICAweDRmLCAweDhkLCAweDM2LCAweGY1LCAweDZjLCAweDBjLCAweDU5LCAweDFhLCAweGIyLCAweDBmLCAweDVmLCAweDFlLAorICAweDM5LCAweDI3LCAweDVjLCAweDA4LCAweGFkLCAweDMyLCAweDI4LCAweDE0LCAweDk0LCAweDBkLCAweDFmLCAweDMxLAorICAweDA2LCAweGY4LCAweDJlLCAweDg2LCAweDE5LCAweGRkLCAweDJmLCAweDRmLCAweGJhLCAweDZkLCAweDE1LCAweGE2LAorICAweDM4LCAweDJhLCAweDk0LCAweGVlLCAweDJhLCAweGFhLCAweDBiLCAweGVhLCAweDQyLCAweGMwLCAweDk5LCAweDZiLAorICAweDE2LCAweDczLCAweDdjLCAweGFhLCAweGE2LCAweDk1LCAweDJlLCAweDJiLCAweDAxLCAweDRmLCAweGFiLCAweGY3LAorICAweGI1LCAweDkxLCAweDc4LCAweDYyLCAweGJjLCAweDllLCAweGIzLCAweGQ1LCAweDIyLCAweDYyLCAweDAzLCAweDM4LAorICAweGEyLCAweGIzLCAweDY1LCAweGM5LCAweDJjLCAweDhhLCAweGNhLCAweDg2LCAweDgyLCAweGZjLCAweGU2LCAweGQyLAorICAweDZjLCAweDIyLCAweDdlLCAweDViLCAweDQ2LCAweDJlLCAweDdjLCAweGY4LCAweDVjLCAweGQ3LCAweDZiLCAweDY2LAorICAweDk5LCAweDg1LCAweDZjLCAweDljLCAweDVmLCAweDY2LCAweGQ3LCAweDBmLCAweDhjLCAweDU5LCAweDVlLCAweGVlLAorICAweDczLCAweDU3LCAweDEyLCAweGExLCAweGNmLCAweGQ2LCAweDhlLCAweGY2LCAweDViLCAweGVhLCAweGQ0LCAweDI5LAorICAweGY1LCAweDdlLCAweDU1LCAweGE2LCAweDUyLCAweDAzLCAweDZhLCAweGMwLCAweGU5LCAweDhjLCAweGMzLCAweGQ3LAorICAweDQ5LCAweDFjLCAweDNiLCAweDBkLCAweDQ3LCAweDA5LCAweDkwLCAweDk2LCAweGRjLCAweDNiLCAweDE3LCAweDNiLAorICAweGI3LCAweDAxLCAweDQ1LCAweDk1LCAweDU1LCAweDY0LCAweDdhLCAweDQ1LCAweDk1LCAweGU3LCAweDkzLCAweDdjLAorICAweDJlLCAweDMyLCAweGJjLCAweGE0LCAweDI2LCAweGVhLCAweDliLCAweDZkLCAweDhjLCAweGUwLCAweGVhLCAweGMwLAorICAweDU1LCAweDc5LCAweGM1LCAweDRlLCAweGY1LCAweDg2LCAweGI3LCAweGI5LCAweDNmLCAweGFmLCAweDE4LCAweGEyLAorICAweGFjLCAweGM0LCAweDUyLCAweDNhLCAweGNjLCAweDUzLCAweGQ3LCAweDA3LCAweDliLCAweGI1LCAweDhjLCAweGE0LAorICAweGYyLCAweGQzLCAweDQ2LCAweDNmLCAweGFiLCAweGFlLCAweDFmLCAweDU0LCAweDUyLCAweGZlLCAweDQwLCAweGZhLAorICAweGE2LCAweGRkLCAweDgzLCAweGNhLCAweDQxLCAweDAxLCAweDRhLCAweDY1LCAweDcyLCAweGUwLCAweDQxLCAweGRiLAorICAweGI0LCAweGJlLCAweGM3LCAweGZlLCAweDZhLCAweDU2LCAweDIyLCAweDk1LCAweDc3LCAweDFmLCAweDYyLCAweDQ0LAorICAweGM0LCAweDZkLCAweGNhLCAweDZjLCAweDMyLCAweDYwLCAweGMzLCAweDU2LCAweDQwLCAweDM1LCAweGM0LCAweDYwLAorICAweGI3LCAweDgyLCAweGY1LCAweDA4LCAweGVhLCAweDEyLCAweDA0LCAweDYyLCAweDA5LCAweDliLCAweGRjLCAweGQxLAorICAweDMwLCAweGE0LCAweGU1LCAweDQxLCAweDNhLCAweDgyLCAweGI0LCAweDJmLCAweDAxLCAweDI4LCAweGFjLCAweGFlLAorICAweDQzLCAweGQ0LCAweDVkLCAweDdlLCAweGMxLCAweGE3LCAweGE3LCAweDJkLCAweDM2LCAweDAyLCAweDQ1LCAweDU5LAorICAweDc2LCAweDRlLCAweGQzLCAweGI0LCAweDk3LCAweDY5LCAweDVkLCAweGQ3LCAweGQzLCAweGQ4LCAweDA0LCAweGUyLAorICAweDA4LCAweDk2LCAweGY4LCAweGRjLCAweDIxLCAweDM2LCAweDkyLCAweGFhLCAweGYxLCAweGYxLCAweGU1LCAweGM2LAorICAweDA4LCAweGRkLCAweGMxLCAweDg2LCAweDk4LCAweDgwLCAweDQ1LCAweDMwLCAweGIyLCAweDIxLCAweDU5LCAweGM3LAorICAweDI0LCAweDZlLCAweDViLCAweGYxLCAweDMxLCAweDc1LCAweGIzLCAweDM5LCAweDliLCAweDUxLCAweDY0LCAweDE5LAorICAweDc5LCAweGQ0LCAweDM2LCAweGQ2LCAweDVmLCAweDYxLCAweDZlLCAweDBhLCAweDhlLCAweDAwLCAweGEyLCAweGIyLAorICAweDY1LCAweDE0LCAweGIwLCAweGI1LCAweDQ0LCAweDQ5LCAweDJmLCAweDVhLCAweDRlLCAweGY3LCAweDhjLCAweGRhLAorICAweDVmLCAweDI5LCAweDgzLCAweDgzLCAweGExLCAweGJmLCAweGYxLCAweGI1LCAweDE4LCAweDUxLCAweGI4LCAweGU5LAorICAweDZhLCAweDFhLCAweDBhLCAweDgwLCAweGViLCAweGUyLCAweDMwLCAweGVlLCAweDdkLCAweGI4LCAweGQxLCAweDkzLAorICAweDg0LCAweDNiLCAweDFjLCAweGRiLCAweDM1LCAweDZhLCAweGQ3LCAweDFlLCAweGEzLCAweGVjLCAweGZmLCAweDFkLAorICAweGFiLCAweDA3LCAweDIxLCAweDRjLCAweDZjLCAweGMwLCAweDAwLCAweGJmLCAweGMwLCAweDA0LCAweDFmLCAweGM2LAorICAweGRjLCAweDQ2LCAweDM2LCAweGYxLCAweGViLCAweDUwLCAweDhkLCAweDhkLCAweGI2LCAweDUwLCAweDZiLCAweDQ4LAorICAweGQ3LCAweDkxLCAweDhmLCAweGRhLCAweGU5LCAweGVkLCAweDc5LCAweDJkLCAweDZmLCAweGViLCAweGM2LCAweGFkLAorICAweDc3LCAweGQzLCAweDMxLCAweGZiLCAweDZhLCAweDlmLCAweDBlLCAweDI3LCAweDAwLCAweDEwLCAweDIxLCAweDY0LAorICAweGU0LCAweGU2LCAweDM1LCAweDJkLCAweDNkLCAweGRlLCAweDg5LCAweDhlLCAweGFlLCAweGQ3LCAweDk3LCAweDViLAorICAweDk3LCAweDU1LCAweDNhLCAweGJjLCAweDcxLCAweDMzLCAweGM1LCAweDczLCAweGFhLCAweGY1LCAweGI3LCAweDE5LAorICAweDQ0LCAweGIyLCAweDA4LCAweDMzLCAweGMyLCAweDU5LCAweGU5LCAweDMzLCAweDkzLCAweDBiLCAweGVlLCAweDE3LAorICAweGE2LCAweDc2LCAweGUwLCAweDcxLCAweGUxLCAweDY5LCAweDFmLCAweDgyLCAweDcwLCAweGJhLCAweGFlLCAweGIyLAorICAweGY2LCAweDEzLCAweGIxLCAweGFkLCAweDIyLCAweDNjLCAweDlhLCAweDBlLCAweGNhLCAweDdjLCAweDM0LCAweGQyLAorICAweDQ5LCAweGU3LCAweDBhLCAweGI5LCAweDZmLCAweDcwLCAweDc3LCAweDNlLCAweDg1LCAweDNhLCAweDc5LCAweDY4LAorICAweGRmLCAweDFkLCAweGZhLCAweGQwLCAweDIwLCAweDQ5LCAweDEwLCAweDIyLCAweGQ0LCAweGViLCAweGI2LCAweGY3LAorICAweGEwLCAweDhlLCAweDkxLCAweDAyLCAweGY2LCAweDJlLCAweDAyLCAweDhlLCAweGI2LCAweDJkLCAweDhkLCAweGYzLAorICAweGY5LCAweDVhLCAweGEyLCAweGU0LCAweDlhLCAweDVlLCAweGFiLCAweGRjLCAweDA2LCAweGQwLCAweGE1LCAweGYzLAorICAweGEzLCAweDMyLCAweDdmLCAweDhhLCAweDcwLCAweDRlLCAweDQxLCAweDVkLCAweDgzLCAweDY3LCAweGE2LCAweDU3LAorICAweGUzLCAweGVmLCAweDE2LCAweDI1LCAweDg2LCAweDliLCAweGJhLCAweDY4LCAweGJmLCAweDI4LCAweGQyLCAweDNkLAorICAweDIzLCAweDNjLCAweGZhLCAweDAyLCAweGU2LCAweGRlLCAweGNhLCAweDA5LCAweDg3LCAweDMyLCAweDgyLCAweDEzLAorICAweDNmLCAweGIwLCAweGY5LCAweDg1LCAweDllLCAweDUyLCAweDNiLCAweDliLCAweGQxLCAweGYzLCAweDRlLCAweDY1LAorICAweDI4LCAweDg5LCAweGMyLCAweGJmLCAweGY3LCAweDVmLCAweGQ3LCAweGQyLCAweDQ5LCAweDVlLCAweDY0LCAweDUyLAorICAweGViLCAweDkwLCAweDQzLCAweDJlLCAweGIxLCAweDFkLCAweDc0LCAweDk4LCAweGMyLCAweDljLCAweDVkLCAweGYxLAorICAweDk2LCAweDdlLCAweDRmLCAweDM5LCAweGU3LCAweGQ5LCAweDFmLCAweGQwLCAweDljLCAweDY5LCAweGEwLCAweGZjLAorICAweDlkLCAweDFmLCAweDgyLCAweGQxLCAweGE1LCAweDA4LCAweDg1LCAweDI4LCAweGE2LCAweDkyLCAweDIxLCAweGRiLAorICAweDhiLCAweGUyLCAweDdkLCAweDA5LCAweGNhLCAweGE0LCAweGNjLCAweDlhLCAweGUwLCAweDk1LCAweGM4LCAweDM4LAorICAweDc1LCAweDI3LCAweDBkLCAweDdkLCAweDJmLCAweDU5LCAweGFmLCAweGNjLCAweGUzLCAweDJiLCAweDU3LCAweDQ0LAorICAweDFhLCAweGJlLCAweDNhLCAweDI1LCAweDQ5LCAweGQxLCAweDY4LCAweDE3LCAweDA4LCAweGRiLCAweGY2LCAweDUxLAorICAweGM5LCAweDhhLCAweGNiLCAweDI0LCAweDgwLCAweDBmLCAweGJjLCAweDkyLCAweDhkLCAweDBlLCAweGVlLCAweDZiLAorICAweDhiLCAweDUzLCAweDRmLCAweDI0LCAweDk4LCAweDdlLCAweGEyLCAweGQyLCAweDFlLCAweGMwLCAweGYxLCAweDczLAorICAweDQxLCAweGEwLCAweGFmLCAweDIyLCAweDhhLCAweDI0LCAweDkzLCAweGRiLCAweGI2LCAweGNiLCAweGI5LCAweDIwLAorICAweGJkLCAweGVlLCAweDQ3LCAweDZiLCAweDY0LCAweDA5LCAweDRmLCAweDA1LCAweDgxLCAweDViLCAweDIwLCAweDBhLAorICAweGMxLCAweDE0LCAweGM1LCAweGEwLCAweDQwLCAweDA2LCAweDFkLCAweGNhLCAweGQ4LCAweDg0LCAweDJhLCAweDMwLAorICAweGQxLCAweGViLCAweDA3LCAweDE2LCAweDExLCAweGNkLCAweGE0LCAweGMwLCAweDI1LCAweGM3LCAweDk4LCAweDlmLAorICAweDk2LCAweDgzLCAweGVlLCAweDkzLCAweDA4LCAweDdiLCAweDNmLCAweGU4LCAweDNkLCAweDYxLCAweGZiLCAweDY1LAorICAweGMzLCAweDU5LCAweDA4LCAweGZhLCAweDE2LCAweDNiLCAweDIzLCAweDAwLCAweGY4LCAweDUyLCAweDA3LCAweGFkLAorICAweGFlLCAweGE4LCAweDg2LCAweDBmLCAweDM1LCAweDBmLCAweDQ3LCAweGUyLCAweGE4LCAweGVmLCAweDdiLCAweGU4LAorICAweGY1LCAweGRjLCAweDg1LCAweGY4LCAweGRhLCAweGYwLCAweGE4LCAweDQ2LCAweDc1LCAweDk3LCAweDA1LCAweDhjLAorICAweDAyLCAweDYzLCAweDU2LCAweDRmLCAweDU2LCAweGZiLCAweDA4LCAweDkwLCAweDFlLCAweDFhLCAweGM0LCAweGRiLAorICAweDRhLCAweDNlLCAweDFiLCAweDM5LCAweGI5LCAweGUyLCAweDcxLCAweDM1LCAweDQxLCAweGEwLCAweGQxLCAweDM5LAorICAweDU4LCAweGUwLCAweDIxLCAweDRjLCAweGQ5LCAweDQ2LCAweDVjLCAweDQ0LCAweDNhLCAweGVhLCAweDIxLCAweGI3LAorICAweDI5LCAweGE0LCAweDAzLCAweDdhLCAweDkzLCAweDIzLCAweDQ3LCAweGIwLCAweGI1LCAweGEzLCAweGY4LCAweGQzLAorICAweDhlLCAweDAxLCAweDdkLCAweDdmLCAweDAxLCAweGM0LCAweDU0LCAweDdlLCAweDQ3LCAweGIxLCAweDczLCAweDYyLAorICAweDA1LCAweDI5LCAweDkyLCAweGM2LCAweDU3LCAweGE3LCAweDYzLCAweGUwLCAweGNiLCAweGM1LCAweDk1LCAweGNiLAorICAweDllLCAweDNmLCAweDc0LCAweDViLCAweGZkLCAweDhlLCAweDJhLCAweGE1LCAweGM2LCAweDY2LCAweGU4LCAweDg5LAorICAweDBhLCAweDllLCAweDgyLCAweDM5LCAweDJmLCAweGMzLCAweDMwLCAweGJiLCAweGU5LCAweDJkLCAweDk3LCAweGFhLAorICAweDA3LCAweDk5LCAweDc1LCAweDliLCAweDQ5LCAweGQzLCAweDQ5LCAweDUyLCAweDg1LCAweDg2LCAweDU0LCAweDk1LAorICAweGRkLCAweDY4LCAweDA1LCAweDU3LCAweDgxLCAweGRhLCAweDBlLCAweGU5LCAweGMxLCAweGE1LCAweDg0LCAweDIyLAorICAweDg4LCAweGYyLCAweGRkLCAweDFmLCAweGI3LCAweDZjLCAweGYwLCAweGRiLCAweGUzLCAweGM0LCAweGE5LCAweGI5LAorICAweDJmLCAweDc5LCAweDkzLCAweDEwLCAweGI0LCAweDY0LCAweGY3LCAweGE0LCAweGU3LCAweGJmLCAweGY4LCAweDdkLAorICAweGY5LCAweGZiLCAweGE2LCAweGQ2LCAweDM1LCAweDQ3LCAweGNkLCAweDU1LCAweDViLCAweDQzLCAweDkzLCAweDk2LAorICAweDEzLCAweDVmLCAweGVjLCAweDg1LCAweDg5LCAweDE4LCAweGE3LCAweDdlLCAweDBiLCAweGE4LCAweGJmLCAweDY4LAorICAweDQ4LCAweDIxLCAweDhjLCAweGRjLCAweGJkLCAweDNiLCAweDJlLCAweGIyLCAweDUwLCAweDQ4LCAweDQ4LCAweDBiLAorICAweDlmLCAweDEwLCAweDIxLCAweGYyLCAweDY1LCAweDAwLCAweDFkLCAweGJjLCAweDRlLCAweDVhLCAweDVmLCAweGJiLAorICAweDIyLCAweDIzLCAweGYwLCAweDA0LCAweDA4LCAweDljLCAweGQxLCAweDIwLCAweDQxLCAweDBhLCAweGVhLCAweDAyLAorICAweDQ5LCAweGNmLCAweGFlLCAweDk0LCAweDYxLCAweDRmLCAweDUwLCAweDAwLCAweGNkLCAweDlmLCAweGYwLCAweDAwLAorICAweDA2LCAweGFkLCAweGM5LCAweGY1LCAweGU1LCAweDlkLCAweGFlLCAweDRjLCAweGVmLCAweDI0LCAweDExLCAweGNhLAorICAweGFkLCAweDI2LCAweDc0LCAweGNiLCAweDZmLCAweGU1LCAweGNmLCAweGNmLCAweGUxLCAweGY1LCAweGIwLCAweGJkLAorICAweDc2LCAweDQ3LCAweDUwLCAweGY2LCAweGFhLCAweGQ4LCAweGU5LCAweDYxLCAweDg5LCAweDU0LCAweGE3LCAweDEzLAorICAweGEzLCAweDAxLCAweDY0LCAweGZiLCAweGRiLCAweGZkLCAweGQ3LCAweDk0LCAweDUwLCAweDhjLCAweGI1LCAweDA4LAorICAweGY5LCAweGJhLCAweDQ4LCAweDZkLCAweGE1LCAweGExLCAweDY5LCAweDg3LCAweDRkLCAweDM4LCAweDM0LCAweGIyLAorICAweGJmLCAweDZkLCAweDM4LCAweGI1LCAweGI0LCAweDlhLCAweGZlLCAweGMxLCAweGQzLCAweGQwLCAweDgxLCAweDRhLAorICAweDY0LCAweGQ3LCAweGYzLCAweGY5LCAweDM2LCAweDc0LCAweGJhLCAweGFmLCAweGE1LCAweDUzLCAweGY2LCAweDZhLAorICAweDU2LCAweDI5LCAweGQzLCAweGQyLCAweDAxLCAweGVkLCAweDViLCAweDA4LCAweDQzLCAweDI5LCAweGU2LCAweDc0LAorICAweDY4LCAweGQyLCAweDNmLCAweDliLCAweGQxLCAweDdlLCAweDA3LCAweGEyLCAweGY4LCAweDI4LCAweDYzLCAweDkzLAorICAweDU5LCAweDdhLCAweGRhLCAweGI1LCAweDAxLCAweDMwLCAweGI5LCAweDQxLCAweDY0LCAweDEzLCAweGE1LCAweDRiLAorICAweDA0LCAweDAyLCAweDI1LCAweDRhLCAweDUxLCAweGZkLCAweDhhLCAweDNhLCAweDdhLCAweDFmLCAweDM5LCAweGI3LAorICAweGQ1LCAweGI0LCAweDQxLCAweDAwLCAweDBmLCAweGUzLCAweGVhLCAweGRiLCAweDYxLCAweGYxLCAweGY2LCAweDdmLAorICAweGI0LCAweGI1LCAweDBhLCAweGRiLCAweDhiLCAweGZkLCAweGY3LCAweDFjLCAweGJkLCAweDUyLCAweDI5LCAweGM0LAorICAweDZjLCAweGM1LCAweGQxLCAweDM5LCAweDc3LCAweDhkLCAweGE1LCAweDcwLCAweGVlLCAweGVhLCAweGM4LCAweDEyLAorICAweGIwLCAweDI5LCAweGEwLCAweGJjLCAweGQzLCAweDQ2LCAweGU4LCAweDA0LCAweDRhLCAweDliLCAweDYyLCAweGVmLAorICAweDkyLCAweGUwLCAweDQ5LCAweDE1LCAweDMzLCAweGU2LCAweGQxLCAweGYxLCAweDVjLCAweGI3LCAweDNlLCAweDg1LAorICAweGIwLCAweGMyLCAweDBjLCAweGNiLCAweGU1LCAweGQyLCAweDIyLCAweDU4LCAweDFjLCAweDIxLCAweDRjLCAweDZkLAorICAweDQ5LCAweGRmLCAweDA4LCAweGM1LCAweDVkLCAweDgyLCAweDg4LCAweDY1LCAweGFhLCAweDZjLCAweDRhLCAweDBhLAorICAweGJhLCAweDhjLCAweDYyLCAweGY5LCAweDdkLCAweDcwLCAweDc0LCAweDNmLCAweDQ5LCAweDRlLCAweGJjLCAweGU5LAorICAweDU3LCAweGJkLCAweDdmLCAweDA2LCAweGI4LCAweGVhLCAweDI1LCAweGQ2LCAweGZkLCAweDA2LCAweGI0LCAweDU4LAorICAweDNiLCAweDczLCAweDYzLCAweGRkLCAweDYxLCAweGI2LCAweGExLCAweGJkLCAweGFiLCAweGZjLCAweDFkLCAweGM1LAorICAweGFhLCAweGIyLCAweDRiLCAweDc1LCAweGVmLCAweDNhLCAweDhiLCAweGFhLCAweDVmLCAweDI2LCAweGI5LCAweDk1LAorICAweGJmLCAweDFiLCAweDVhLCAweGRhLCAweDFhLCAweDcwLCAweDI5LCAweDJkLCAweGVlLCAweDg1LCAweDExLCAweDU0LAorICAweDA0LCAweDIwLCAweDQwLCAweGY0LCAweDRlLCAweGQ3LCAweDlmLCAweGMxLCAweGM4LCAweGQwLCAweDJjLCAweGY3LAorICAweGRkLCAweGQ0LCAweDZmLCAweDEzLCAweGQ2LCAweDdlLCAweDUyLCAweDQ1LCAweGFjLCAweGIwLCAweDYzLCAweGViLAorICAweDk0LCAweDg5LCAweDQxLCAweDYyLCAweDg3LCAweDY0LCAweGIxLCAweDY4LCAweGNmLCAweDU3LCAweGIyLCAweDZmLAorICAweDE1LCAweDZiLCAweDIwLCAweDY3LCAweGM4LCAweGQ5LCAweDM0LCAweGE5LCAweDNmLCAweDQ3LCAweDU1LCAweGY3LAorICAweDEzLCAweDY3LCAweDdiLCAweDc0LCAweDU3LCAweDQyLCAweGUzLCAweDc1LCAweGRiLCAweGU0LCAweGQzLCAweDkzLAorICAweDUyLCAweGM4LCAweDkzLCAweDIwLCAweDU0LCAweDg4LCAweDk0LCAweDNkLCAweGJkLCAweGQ5LCAweGJkLCAweGFjLAorICAweDM2LCAweDAwLCAweGFjLCAweDRlLCAweDE5LCAweGNlLCAweDFiLCAweDRmLCAweDllLCAweDczLCAweDY0LCAweDE0LAorICAweDU2LCAweDIxLCAweGY5LCAweDJkLCAweGY5LCAweGM4LCAweGJiLCAweDM3LCAweGFhLCAweDcxLCAweDE4LCAweDliLAorICAweGFmLCAweGRkLCAweGEzLCAweGZkLCAweGJmLCAweDgwLCAweDYzLCAweGQyLCAweDYxLCAweGFlLCAweGJmLCAweDNiLAorICAweDZiLCAweGY4LCAweDhiLCAweDM2LCAweGEzLCAweDU1LCAweDVmLCAweDdmLCAweGJjLCAweGFlLCAweGFmLCAweDk0LAorICAweDU1LCAweDIyLCAweDUyLCAweGI3LCAweDVkLCAweGM4LCAweGZiLCAweDY4LCAweGJlLCAweDRlLCAweDM1LCAweDA3LAorICAweDQ5LCAweDIxLCAweDg2LCAweDA3LCAweDYwLCAweGFlLCAweDQ4LCAweDczLCAweGUyLCAweGZlLCAweDc3LCAweDc5LAorICAweGQ3LCAweDU3LCAweDFkLCAweDIyLCAweDc3LCAweGRiLCAweDVjLCAweDk1LCAweDAwLCAweGE0LCAweDhiLCAweGJhLAorICAweDM3LCAweGY0LCAweDJlLCAweDZiLCAweDk3LCAweGE1LCAweDJlLCAweDY5LCAweDMxLCAweGI2LCAweDIyLCAweGY2LAorICAweGM0LCAweDlmLCAweDdlLCAweDUwLCAweGViLCAweGE1LCAweGE5LCAweDE2LCAweGQ3LCAweDNlLCAweDU5LCAweGU0LAorICAweDQ0LCAweDhiLCAweGE0LCAweDFjLCAweDhhLCAweGE4LCAweDNjLCAweGQxLCAweDVhLCAweDMwLCAweDE1LCAweDQwLAorICAweGMyLCAweDhmLCAweGMzLCAweGZiLCAweGQ5LCAweGQ2LCAweGJjLCAweGI0LCAweDNmLCAweGEwLCAweGYzLCAweGVjLAorICAweGIzLCAweGZiLCAweDcwLCAweDdmLCAweDIxLCAweGMwLCAweDdlLCAweDY5LCAweGY0LCAweDg4LCAweGMwLCAweGVlLAorICAweDZmLCAweDk2LCAweGYzLCAweDdiLCAweDYzLCAweDFhLCAweDM3LCAweDYxLCAweGI3LCAweGMwLCAweDY1LCAweGE0LAorICAweGIwLCAweDdjLCAweDhlLCAweDM0LCAweDc0LCAweDQzLCAweGRkLCAweDk0LCAweGIxLCAweDA3LCAweDdkLCAweGJkLAorICAweGQxLCAweDhhLCAweDJjLCAweDM1LCAweGYxLCAweDBkLCAweDc3LCAweDAzLCAweGU5LCAweGQyLCAweDcyLCAweGFhLAorICAweDE0LCAweGNmLCAweDM3LCAweGM4LCAweDE4LCAweDVlLCAweDU4LCAweDgyLCAweDU2LCAweDg4LCAweGEwLCAweGYwLAorICAweDFlLCAweGQ1LCAweDNiLCAweDQ5LCAweGM4LCAweGFiLCAweDQ0LCAweGYwLCAweDdjLCAweGY3LCAweGE3LCAweDVlLAorICAweGI1LCAweDFkLCAweGFhLCAweGY2LCAweDNkLCAweDRmLCAweGEyLCAweDFiLCAweDE4LCAweDYyLCAweDI2LCAweDM4LAorICAweDkxLCAweDczLCAweGYwLCAweGQ0LCAweGE0LCAweDAyLCAweDczLCAweDk5LCAweDY4LCAweDBiLCAweDg0LCAweGE2LAorICAweDE1LCAweGJjLCAweDQxLCAweDY0LCAweDFjLCAweGFjLCAweDg2LCAweGM1LCAweGMzLCAweDA3LCAweDIxLCAweDRjLAorICAweDM3LCAweDQ3LCAweDVkLCAweDY0LCAweDc2LCAweGU1LCAweDM1LCAweGI3LCAweDIxLCAweDMxLCAweDM4LCAweDA2LAorICAweGVjLCAweDIzLCAweGE0LCAweDQ4LCAweGI1LCAweGJhLCAweGZkLCAweDI4LCAweDQ5LCAweDlhLCAweDViLCAweGU0LAorICAweDU3LCAweDVhLCAweDlhLCAweDNlLCAweGMyLCAweGY1LCAweDdhLCAweDk0LCAweGU5LCAweGE1LCAweGIxLCAweDk0LAorICAweDkxLCAweDUyLCAweDU4LCAweDNmLCAweGJiLCAweGFjLCAweDE2LCAweDcwLCAweDk2LCAweGRjLCAweGNhLCAweDBmLAorICAweGM1LCAweDZmLCAweDFhLCAweDcyLCAweDBiLCAweGEyLCAweDVkLCAweDJlLCAweDM2LCAweGY5LCAweDY3LCAweGZlLAorICAweDA1LCAweDBlLCAweDlmLCAweGQzLCAweGY3LCAweDFjLCAweDhhLCAweGNkLCAweGRiLCAweDhlLCAweDg2LCAweGU4LAorICAweGNhLCAweDM3LCAweDBiLCAweDI2LCAweDY0LCAweGRhLCAweDE0LCAweDA4LCAweGM3LCAweDZkLCAweDhmLCAweDE3LAorICAweGExLCAweGI1LCAweDFiLCAweDE3LCAweGY1LCAweDc5LCAweGM2LCAweDZmLCAweGE3LCAweGFlLCAweGFhLCAweGUxLAorICAweGU3LCAweDIwLCAweGVhLCAweGFjLCAweGNmLCAweDc3LCAweGNhLCAweGY1LCAweGUzLCAweDU3LCAweDcwLCAweDQxLAorICAweDAyLCAweDlkLCAweDRkLCAweDA3LCAweGQzLCAweDE4LCAweGI3LCAweDE5LCAweDViLCAweGUwLCAweDg5LCAweDU3LAorICAweDAwLCAweGYzLCAweGFlLCAweGYyLCAweDk4LCAweDYzLCAweDllLCAweDNhLCAweDNkLCAweDY2LCAweGY5LCAweGIxLAorICAweGMxLCAweDU2LCAweDEwLCAweDEwLCAweGFjLCAweDYxLCAweDY2LCAweGJiLCAweDBhLCAweGE1LCAweDBlLCAweDliLAorICAweGVhLCAweGM1LCAweDdhLCAweGQ1LCAweDk3LCAweGY4LCAweDNiLCAweDk5LCAweDEyLCAweDlhLCAweDZiLCAweDZhLAorICAweDA1LCAweDM0LCAweDAxLCAweGZjLCAweDMyLCAweDRiLCAweGE4LCAweDQyLCAweDY4LCAweDgwLCAweDNmLCAweDRmLAorICAweGMyLCAweDhjLCAweDUwLCAweGNkLCAweGY3LCAweGU5LCAweGFhLCAweDY5LCAweGZjLCAweDUzLCAweGE1LCAweDdkLAorICAweDE2LCAweGNjLCAweGYxLCAweDNmLCAweDA1LCAweDljLCAweDI4LCAweDdjLCAweDU3LCAweDI2LCAweGVkLCAweGQ5LAorICAweDg3LCAweGVhLCAweDNiLCAweDEyLCAweGFmLCAweDQ5LCAweGI5LCAweGY5LCAweGU1LCAweGM5LCAweGMzLCAweGZjLAorICAweGM2LCAweDUxLCAweDBmLCAweGNjLCAweDU0LCAweGMzLCAweGU5LCAweGViLCAweDU0LCAweDMzLCAweDE1LCAweDA2LAorICAweDU5LCAweGY0LCAweGRjLCAweDVkLCAweGQzLCAweDVkLCAweGQzLCAweGUyLCAweDgzLCAweGE1LCAweDViLCAweDQ2LAorICAweGRhLCAweDNjLCAweDZmLCAweDZmLCAweGIxLCAweDkzLCAweDkzLCAweDVhLCAweDEyLCAweDlmLCAweDM4LCAweDY0LAorICAweGJmLCAweDA2LCAweDA0LCAweDQyLCAweDQ5LCAweDk2LCAweGU3LCAweDJiLCAweGU0LCAweGEzLCAweGQ1LCAweDQ3LAorICAweDY0LCAweGI1LCAweDgwLCAweGQ3LCAweGVhLCAweDdlLCAweDVkLCAweDk4LCAweDM2LCAweDAwLCAweDE0LCAweDE3LAorICAweDAyLCAweDNlLCAweDIwLCAweDczLCAweDEwLCAweDM5LCAweDg0LCAweDY4LCAweDM5LCAweDgyLCAweDZjLCAweDM4LAorICAweDEyLCAweDY2LCAweDVkLCAweGY3LCAweGMwLCAweGU0LCAweDNmLCAweGVhLCAweGQyLCAweGQ4LCAweGNhLCAweDQ4LAorICAweGE5LCAweDJjLCAweDFjLCAweDlmLCAweGRiLCAweDQ3LCAweDZjLCAweDkwLCAweGRjLCAweDRmLCAweGE5LCAweGRkLAorICAweDU3LCAweDE2LCAweGIwLCAweDJlLCAweGJlLCAweGFiLCAweGQxLCAweGIxLCAweGRkLCAweDc0LCAweGFlLCAweDVhLAorICAweDE5LCAweDIwLCAweDUxLCAweGM0LCAweGJhLCAweGRmLCAweDZmLCAweGEyLCAweDNlLCAweGZmLCAweDE2LCAweGI2LAorICAweGNmLCAweDcxLCAweGYwLCAweGVhLCAweDNhLCAweDQ3LCAweDFmLCAweGFlLCAweDFmLCAweDYxLCAweGU5LCAweGExLAorICAweGMwLCAweDIxLCAweDdhLCAweDk0LCAweGQ1LCAweDU1LCAweDg4LCAweDMxLCAweDUxLCAweDJhLCAweDcwLCAweGQ4LAorICAweGU1LCAweDQ3LCAweDBiLCAweDc1LCAweDJhLCAweGQzLCAweDhkLCAweDQ1LCAweDUwLCAweGUwLCAweDg1LCAweGIyLAorICAweDY2LCAweDZlLCAweDM5LCAweDZhLCAweDkzLCAweGJmLCAweDEzLCAweGUzLCAweGVlLCAweDM4LCAweGJmLCAweGY4LAorICAweGE0LCAweGJjLCAweDU2LCAweGFkLCAweDhiLCAweGYzLCAweDJlLCAweDliLCAweDYwLCAweGY2LCAweGNjLCAweDZlLAorICAweDhiLCAweDhjLCAweDAxLCAweDk0LCAweDRhLCAweDUxLCAweGIxLCAweGRiLCAweDc1LCAweDU3LCAweGVjLCAweGNiLAorICAweDg0LCAweGRhLCAweDM0LCAweGQzLCAweDdjLCAweGU4LCAweDU3LCAweDEyLCAweDE5LCAweDhiLCAweGUzLCAweDVhLAorICAweDMxLCAweGExLCAweGJhLCAweGVlLCAweDdkLCAweDczLCAweGU3LCAweDc4LCAweDM4LCAweGRmLCAweDdlLCAweGY0LAorICAweDBhLCAweDViLCAweGQyLCAweGZlLCAweGRkLCAweDg3LCAweGE5LCAweDdmLCAweDUzLCAweDY0LCAweGU1LCAweDEzLAorICAweGFjLCAweDkyLCAweGRmLCAweDQ4LCAweDJkLCAweGU0LCAweDkyLCAweGJkLCAweDNjLCAweGM5LCAweDY0LCAweDIxLAorICAweGEzLCAweDM2LCAweDU1LCAweGE3LCAweGIxLCAweDY3LCAweDlkLCAweDM3LCAweDY1LCAweDk2LCAweDVkLCAweDU0LAorICAweDI1LCAweGJkLCAweGY5LCAweDRlLCAweDc5LCAweGQ0LCAweGY3LCAweDBjLCAweGI1LCAweGFjLCAweGYwLCAweDIyLAorICAweGUyLCAweDI3LCAweDRmLCAweDZmLCAweGQ2LCAweGI1LCAweDk3LCAweDJlLCAweDkyLCAweGVlLCAweDk0LCAweDI0LAorICAweDA1LCAweDI2LCAweGE0LCAweGU3LCAweGQzLCAweDVmLCAweDIwLCAweDg1LCAweGU3LCAweDMwLCAweGM3LCAweDMyLAorICAweGYyLCAweDVkLCAweDdhLCAweDQ2LCAweDg1LCAweGM3LCAweDJhLCAweGQ1LCAweDAwLCAweDY0LCAweDk4LCAweGE3LAorICAweDBiLCAweDQwLCAweDI0LCAweGE4LCAweDZlLCAweGU1LCAweDRhLCAweDJlLCAweDQ4LCAweDg1LCAweDJmLCAweDhlLAorICAweDViLCAweDRhLCAweGFmLCAweGFkLCAweDgzLCAweGU5LCAweGNiLCAweDA0LCAweDc2LCAweDYzLCAweDZiLCAweDQ3LAorICAweDE4LCAweDRhLCAweGQ5LCAweGQ4LCAweDgwLCAweDdhLCAweDA4LCAweDMwLCAweDU2LCAweDAwLCAweDFmLCAweGM5LAorICAweDA4LCAweDBiLCAweDY1LCAweDhkLCAweGRmLCAweDgwLCAweDAwLCAweDAwLCAweGE5LCAweGM5LCAweGI3LCAweDY0LAorICAweGU4LCAweGVkLCAweDBhLCAweGZkLCAweGZhLCAweDc1LCAweGZmLCAweDBhLCAweDllLCAweDdlLCAweGY5LCAweGQ3LAorICAweDMyLCAweGQwLCAweDlkLCAweGQ4LCAweDk2LCAweDc0LCAweDZlLCAweGJlLCAweGI5LCAweDkyLCAweDAyLCAweDM5LAorICAweDAxLCAweDdkLCAweDc5LCAweDUzLCAweDdhLCAweDIwLCAweDE4LCAweDk4LCAweGU4LCAweDAxLCAweDQyLCAweGI5LAorICAweGEzLCAweDhmLCAweDE4LCAweDA5LCAweDVlLCAweDRiLCAweDhlLCAweDc1LCAweDE4LCAweDJmLCAweGU5LCAweDg5LAorICAweGFlLCAweGJjLCAweGVlLCAweDVjLCAweGE0LCAweDQwLCAweGJlLCAweGEzLCAweGE3LCAweGVmLCAweDI5LCAweDRjLAorICAweGM0LCAweDBlLCAweDIxLCAweDFhLCAweDk0LCAweGFkLCAweDk2LCAweDk1LCAweDYyLCAweGE0LCAweDExLCAweDA1LAorICAweGEwLCAweDM3LCAweDE1LCAweDgyLCAweDg1LCAweGRlLCAweGI1LCAweDU2LCAweGQ2LCAweDhlLCAweDJiLCAweDZkLAorICAweDAyLCAweGNiLCAweDY0LCAweDhiLCAweGM3LCAweGJhLCAweDYyLCAweGRiLCAweGY4LCAweDZmLCAweDU1LCAweGQyLAorICAweDNmLCAweDZlLCAweGM0LCAweDdmLCAweDViLCAweDYyLCAweDAyLCAweDNmLCAweGY3LCAweGZjLCAweGQzLCAweDk0LAorICAweGI3LCAweDU1LCAweDc1LCAweDRiLCAweDk2LCAweDY2LCAweDU0LCAweGI4LCAweDliLCAweDU4LCAweGRhLCAweGFjLAorICAweGNmLCAweGNkLCAweDU4LCAweDkyLCAweDZjLCAweGZjLCAweDc3LCAweDI5LCAweGRlLCAweDc4LCAweDk4LCAweDVjLAorICAweGMyLCAweGRkLCAweDk2LCAweDc0LCAweGVjLCAweDJkLCAweGM3LCAweDk4LCAweGI0LCAweDc3LCAweDE1LCAweGNiLAorICAweDQyLCAweGNiLCAweDVmLCAweDVmLCAweDlkLCAweDg1LCAweGNhLCAweDVjLCAweDMzLCAweGJmLCAweDY4LCAweGY2LAorICAweGVmLCAweGE5LCAweGU2LCAweDBhLCAweDMxLCAweDUwLCAweDVmLCAweGZmLCAweDNkLCAweDE3LCAweDkwLCAweDQ4LAorICAweGIxLCAweGVmLCAweDE0LCAweDMzLCAweDE2LCAweDBmLCAweGRkLCAweDU5LCAweGZlLCAweDRhLCAweDAyLCAweGFlLAorICAweGZiLCAweDcxLCAweDQ2LCAweDE2LCAweDQ2LCAweDM2LCAweDM0LCAweGM5LCAweDkyLCAweDQxLCAweDI0LCAweDkzLAorICAweDhlLCAweDA0LCAweDE0LCAweDQ3LCAweDYyLCAweDJhLCAweDU5LCAweGRjLCAweDRkLCAweGE1LCAweDhhLCAweGEyLAorICAweGM1LCAweDY1LCAweDExLCAweGUzLCAweDE1LCAweDZiLCAweDgzLCAweGUxLCAweDY3LCAweDRlLCAweDg3LCAweDdkLAorICAweGM0LCAweDNkLCAweGQyLCAweDUxLCAweDViLCAweDZlLCAweDVkLCAweDYxLCAweDA1LCAweGE5LCAweDNlLCAweDkwLAorICAweDExLCAweDFhLCAweDI2LCAweGJkLCAweDBiLCAweDkyLCAweDllLCAweDBiLCAweDY1LCAweDAyLCAweDhhLCAweGE4LAorICAweDRhLCAweDY1LCAweGQ1LCAweDNhLCAweDNmLCAweDZiLCAweGY3LCAweDE0LCAweDlkLCAweDEyLCAweGI0LCAweGUwLAorICAweGFjLCAweDBiLCAweDQ4LCAweGUxLCAweGJhLCAweDZlLCAweGQwLCAweDg5LCAweDczLCAweGE1LCAweGM5LCAweGRlLAorICAweDBjLCAweGIyLCAweGY0LCAweDY3LCAweDczLCAweDZkLCAweDhjLCAweGMyLCAweDRhLCAweGQ2LCAweDA3LCAweGIwLAorICAweDgyLCAweDg1LCAweGE3LCAweDM2LCAweGJhLCAweDA3LCAweGYyLCAweDBhLCAweDAxLCAweDZjLCAweDkxLCAweDc4LAorICAweGY3LCAweDQ4LCAweDRjLCAweDNiLCAweDFiLCAweDJmLCAweGNkLCAweDlhLCAweDJhLCAweDQ1LCAweGM0LCAweDFkLAorICAweGVmLCAweGZhLCAweDYzLCAweDliLCAweGYwLCAweDYwLCAweDJjLCAweGNjLCAweDZiLCAweDI3LCAweDJmLCAweGM3LAorICAweDFiLCAweDA1LCAweDFhLCAweDVhLCAweDgxLCAweDQwLCAweDIyLCAweGJlLCAweGIxLCAweGJmLCAweGMyLCAweDYxLAorICAweGQ4LCAweDAwLCAweGFhLCAweGMzLCAweDMxLCAweDllLCAweGUwLCAweDAwLCAweGJhLCAweDA2LCAweDVhLCAweGE0LAorICAweDhjLCAweDBhLCAweDEyLCAweGIyLCAweDUxLCAweGZjLCAweDhiLCAweGNjLCAweDRlLCAweDgyLCAweGE2LCAweDAwLAorICAweDQ5LCAweDcwLCAweDNkLCAweGI5LCAweDBhLCAweDAzLCAweDA3LCAweDIxLCAweDFhLCAweDk0LCAweGM1LCAweGIyLAorICAweDk0LCAweGM0LCAweDQxLCAweDA5LCAweDA4LCAweDQyLCAweDUyLCAweDEwLCAweDA1LCAweGI4LCAweGE5LCAweDJmLAorICAweDgxLCAweGUxLCAweDg0LCAweGFlLCAweGI1LCAweDc3LCAweDc3LCAweGFiLCAweDQxLCAweDI4LCAweDBiLCAweDFjLAorICAweGNkLCAweGM3LCAweGJkLCAweGJjLCAweDcyLCAweDYwLCAweGZiLCAweDlmLCAweDMxLCAweDJkLCAweGRjLCAweGIyLAorICAweDIzLCAweGViLCAweGE2LCAweDJiLCAweGU0LCAweGQ0LCAweDliLCAweDE0LCAweGY2LCAweDI2LCAweGMzLCAweGUzLAorICAweGRkLCAweGViLCAweGIzLCAweDI4LCAweGRiLCAweDY3LCAweGM0LCAweGJiLCAweDU2LCAweDY0LCAweDBlLCAweDU5LAorICAweDE3LCAweDY4LCAweGFlLCAweDdjLCAweGVkLCAweGRmLCAweGI0LCAweDY2LCAweDNiLCAweDZkLCAweDZlLCAweGEzLAorICAweGYyLCAweGY2LCAweGQ4LCAweDc3LCAweDhkLCAweGFiLCAweGM5LCAweDdlLCAweGUzLCAweDk0LCAweGYxLCAweDhhLAorICAweDg4LCAweDVjLCAweDFjLCAweDg2LCAweGRmLCAweGYyLCAweGQ0LCAweDE5LCAweGJmLCAweGQ0LCAweDM2LCAweGEwLAorICAweGM1LCAweGFkLCAweDYxLCAweDYxLCAweGNhLCAweDZmLCAweDU2LCAweGIwLCAweDcyLCAweGVhLCAweGFlLCAweGE5LAorICAweDNiLCAweGFiLCAweDEzLCAweDk3LCAweDU2LCAweDJmLCAweDBmLCAweDU3LCAweGVmLCAweGU2LCAweDQ0LCAweDllLAorICAweGM5LCAweGY5LCAweGNhLCAweGQ3LCAweDVkLCAweGM5LCAweDYzLCAweGU1LCAweDg3LCAweGRmLCAweDBhLCAweDUzLAorICAweGE5LCAweGViLCAweGY5LCAweDViLCAweGU2LCAweDlmLCAweDZhLCAweGJhLCAweGUzLCAweGE2LCAweDc5LCAweDYwLAorICAweDU2LCAweDA4LCAweDFkLCAweDAzLCAweDY4LCAweGIxLCAweDNkLCAweDM2LCAweDU3LCAweDVlLCAweDg1LCAweDAyLAorICAweDVhLCAweDRhLCAweGQ5LCAweGY4LCAweDY1LCAweDY0LCAweGIzLCAweDczLCAweGM3LCAweDI0LCAweDRlLCAweGQyLAorICAweDEzLCAweDJkLCAweDMzLCAweDNlLCAweDU0LCAweDY1LCAweGNjLCAweGI5LCAweDUyLCAweGNkLCAweDJiLCAweDU0LAorICAweGZiLCAweGQ0LCAweDczLCAweDFiLCAweGU0LCAweDhlLCAweDFjLCAweGFkLCAweDQwLCAweDY4LCAweDk0LCAweGVhLAorICAweDg5LCAweDBhLCAweGZlLCAweDkwLCAweGFkLCAweGVmLCAweDQ1LCAweDNlLCAweDFiLCAweGRiLCAweDViLCAweGY3LAorICAweDk0LCAweDg0LCAweGVkLCAweGY3LCAweDQyLCAweGQ2LCAweGQyLCAweDYyLCAweDEyLCAweDNmLCAweGRkLCAweGI2LAorICAweGM4LCAweGE2LCAweDNjLCAweGE1LCAweDlkLCAweDg4LCAweDA3LCAweDcwLCAweDgxLCAweGM2LCAweDAwLCAweDM3LAorICAweDZhLCAweGFmLCAweGYyLCAweGQ2LCAweDBiLCAweGRhLCAweGQ0LCAweGMwLCAweGQxLCAweDUxLCAweGNmLCAweGE3LAorICAweDMwLCAweGYxLCAweDQ3LCAweGFmLCAweGY4LCAweDkzLCAweDA1LCAweGU3LCAweDg3LCAweGUyLCAweDNkLCAweGEzLAorICAweDBmLCAweDg4LCAweGIyLCAweDUyLCAweGQxLCAweDIwLCAweGE2LCAweDEyLCAweDA3LCAweDViLCAweGVkLCAweGUyLAorICAweGQ0LCAweGZhLCAweDgwLCAweDI5LCAweGU1LCAweGI2LCAweDdiLCAweDNhLCAweDVhLCAweGNkLCAweDgwLCAweDgwLAorICAweDAxLCAweDE0LCAweDk0LCAweDRhLCAweDIxLCAweDY4LCAweGRlLCAweDkwLCAweGRiLCAweDRmLCAweDUwLCAweDQ4LAorICAweDQ4LCAweDkxLCAweDU1LCAweDY1LCAweGVmLCAweDIxLCAweGExLCAweGVhLCAweGYyLCAweDMxLCAweGM1LCAweDcxLAorICAweGI1LCAweGU0LCAweGMzLCAweDQxLCAweDRmLCAweGE0LCAweDVkLCAweDgwLCAweGI4LCAweDU0LCAweDFjLCAweDIxLAorICAweDFhLCAweDk0LCAweGI1LCAweGEyLCAweDljLCAweGM0LCAweDQxLCAweDEyLCAweDA0LCAweGMwLCAweDExLCAweDU1LAorICAweDU5LCAweDUxLCAweDRkLCAweDc1LCAweGM2LCAweGE5LCAweGMyLCAweGQ2LCAweDAxLCAweDQwLCAweDZiLCAweGM5LAorICAweDQ5LCAweGE0LCAweDAyLCAweDNhLCAweDdlLCAweGEzLCAweDFkLCAweDEyLCAweDhmLCAweGY5LCAweDdkLCAweGM0LAorICAweDNkLCAweGY1LCAweDM1LCAweDQzLCAweDhiLCAweGI0LCAweDFkLCAweDc3LCAweDFmLCAweDNkLCAweGU1LCAweDRiLAorICAweDNiLCAweDY2LCAweDA4LCAweGI3LCAweGRjLCAweDE1LCAweDU3LCAweDZjLCAweGU0LCAweGY0LCAweGFlLCAweGExLAorICAweDlhLCAweDU4LCAweGIxLCAweDczLCAweDA5LCAweGVhLCAweDA4LCAweGY0LCAweDdhLCAweGNlLCAweDIzLCAweDMwLAorICAweGU3LCAweGZlLCAweDg2LCAweDM3LCAweDYwLCAweGYzLCAweGJlLCAweGY5LCAweGM0LCAweDZhLCAweDQ2LCAweDAxLAorICAweDllLCAweDgyLCAweDM3LCAweDM5LCAweGM2LCAweDc4LCAweGJlLCAweDU1LCAweDllLCAweDY2LCAweDAxLCAweGJiLAorICAweDRiLCAweGM5LCAweDQ3LCAweDViLCAweGE4LCAweDc0LCAweGZhLCAweGNiLCAweDI1LCAweDM4LCAweDFhLCAweDM3LAorICAweDhiLCAweDNlLCAweDk4LCAweDU4LCAweDc2LCAweDhkLCAweDk3LCAweDMxLCAweGVmLCAweGQzLCAweDhmLCAweGRmLAorICAweGI4LCAweDZlLCAweGEyLCAweDk0LCAweGNjLCAweGVkLCAweGY4LCAweGU4LCAweGU5LCAweDg3LCAweGU4LCAweDcyLAorICAweGVlLCAweGJmLCAweGMxLCAweDI0LCAweDExLCAweDRjLCAweGE2LCAweGFkLCAweDZjLCAweGJlLCAweGM3LCAweDg4LAorICAweGExLCAweDIwLCAweDAwLCAweDhkLCAweGI0LCAweGMyLCAweDI4LCAweGRkLCAweGVlLCAweGVjLCAweDIzLCAweDUyLAorICAweDcyLCAweDJmLCAweGI1LCAweDc1LCAweDc5LCAweDU3LCAweDRkLCAweDkxLCAweGEwLCAweDFkLCAweDY5LCAweGIwLAorICAweGYzLCAweDYyLCAweDNkLCAweDllLCAweDQwLCAweDQzLCAweDRhLCAweGFiLCAweDYyLCAweGJjLCAweDViLCAweDM5LAorICAweDIyLCAweDk5LCAweGMwLCAweDc4LCAweDllLCAweDRhLCAweDYwLCAweGI3LCAweGMzLCAweDRlLCAweGY0LCAweDE4LAorICAweDYxLCAweGRjLCAweDhmLCAweDE2LCAweDMzLCAweGE4LCAweGMwLCAweGFlLCAweDg2LCAweDE3LCAweDJkLCAweDg4LAorICAweDljLCAweGJiLCAweDRkLCAweDViLCAweDQ5LCAweGIzLCAweGYwLCAweGQ0LCAweDRlLCAweDhhLCAweDI1LCAweDZjLAorICAweGU1LCAweDE4LCAweDM5LCAweDIxLCAweGMxLCAweGM3LCAweDVkLCAweDY2LCAweDEzLCAweDM0LCAweDk0LCAweDMwLAorICAweDBkLCAweGMyLCAweDAzLCAweDEwLCAweDgwLCAweGM0LCAweDIwLCAweDIxLCAweDZhLCAweDU4LCAweDJlLCAweDhhLAorICAweDYzLCAweGVmLCAweGU3LCAweDgyLCAweDg1LCAweDliLCAweGQwLCAweDI0LCAweGMzLCAweDcxLCAweDg2LCAweGZkLAorICAweGVlLCAweDMzLCAweGM5LCAweGUyLCAweGI4LCAweDY2LCAweDdmLCAweGUxLCAweGZkLCAweGVlLCAweGI3LCAweGRhLAorICAweDFkLCAweGRmLCAweGQzLCAweDAzLCAweGEwLCAweGJhLCAweDVkLCAweGM2LCAweGJlLCAweGI2LCAweGFiLCAweDZiLAorICAweGJmLCAweDg0LCAweGExLCAweDVlLCAweDkzLCAweGJmLCAweGFlLCAweGQxLCAweDU5LCAweGNhLCAweGRhLCAweGJjLAorICAweDY5LCAweGMwLCAweDQzLCAweGY3LCAweDAwLCAweDA0LCAweGI0LCAweDQ3LCAweDg3LCAweDM1LCAweDgyLCAweDc1LAorICAweDU0LCAweDQyLCAweGRjLCAweGEyLCAweDA5LCAweDQ0LCAweGI5LCAweDllLCAweDYwLCAweDA2LCAweDM3LCAweDRiLAorICAweGM2LCAweDczLCAweGExLCAweDcyLCAweGNjLCAweGMxLCAweDk3LCAweDM1LCAweDNmLCAweGJlLCAweGFlLCAweGIwLAorICAweGEwLCAweDA3LCAweDIxLCAweDJhLCAweDk0LCAweGFkLCAweGQ5LCAweDAzLCAweDAyLCAweDYxLCAweDIwLCAweDg1LAorICAweGEwLCAweDQ1LCAweGVjLCAweGM1LCAweDYyLCAweGViLCAweDVjLCAweDY5LCAweDc3LCAweDIwLCAweGIxLCAweDgzLAorICAweDRkLCAweDg2LCAweGM3LCAweGE4LCAweDRiLCAweDRkLCAweDU5LCAweGFkLCAweDI2LCAweDcxLCAweGZlLCAweDUyLAorICAweGI4LCAweDQ3LCAweDhmLCAweGUxLCAweDcyLCAweDk4LCAweDIxLCAweGQ3LCAweDQ4LCAweGI4LCAweGNmLCAweGMzLAorICAweGY4LCAweGZlLCAweDdiLCAweGMyLCAweDdhLCAweGMyLCAweDkyLCAweDY5LCAweDgxLCAweGU0LCAweDllLCAweGZlLAorICAweGRhLCAweDc3LCAweDBjLCAweDdiLCAweDk2LCAweGI5LCAweDBmLCAweDZhLCAweGU2LCAweDg3LCAweDE0LCAweDNiLAorICAweDhiLCAweGQ2LCAweGZiLCAweGE1LCAweGQxLCAweDk4LCAweDM0LCAweDc0LCAweDczLCAweGUyLCAweDdiLCAweDQ3LAorICAweDJmLCAweDYxLCAweDU5LCAweGI5LCAweDUzLCAweDdlLCAweGY2LCAweGFmLCAweGQ3LCAweGEwLCAweGRkLCAweDBiLAorICAweDRlLCAweDYwLCAweGMzLCAweGE3LCAweGM4LCAweDg4LCAweDMzLCAweDY3LCAweDY3LCAweDY1LCAweGJjLCAweGMxLAorICAweDRiLCAweGUxLCAweGJiLCAweDQ3LCAweGE3LCAweGFjLCAweGFiLCAweDhmLCAweDFjLCAweGMxLCAweGFkLCAweGJjLAorICAweGE3LCAweDRlLCAweDVlLCAweDU4LCAweGQ0LCAweDM5LCAweGFlLCAweDA3LCAweDE4LCAweGM0LCAweDE1LCAweGY0LAorICAweDEyLCAweDkyLCAweGYzLCAweDM5LCAweGRiLCAweDBhLCAweDEwLCAweDgxLCAweDUzLCAweDdhLCAweGUyLCAweGE4LAorICAweGQ0LCAweDZhLCAweDdhLCAweGJhLCAweDk2LCAweGJlLCAweGQ2LCAweDEwLCAweGMwLCAweDU1LCAweGNkLCAweGFlLAorICAweDdlLCAweDYyLCAweDZjLCAweDc4LCAweGVlLCAweGVkLCAweDE5LCAweDk4LCAweGU5LCAweGM0LCAweDMwLCAweDcwLAorICAweDAzLCAweGJkLCAweGE4LCAweDFiLCAweGVjLCAweGQ5LCAweGZmLCAweGE4LCAweDJkLCAweGQzLCAweDQxLCAweDc5LAorICAweDBkLCAweDdjLCAweGUyLCAweDZhLCAweDQwLCAweDNiLCAweDUyLCAweDI5LCAweDQyLCAweDU0LCAweDU0LCAweGRjLAorICAweGFhLCAweGNmLCAweGRmLCAweDNmLCAweGFhLCAweGIyLCAweDg1LCAweDE1LCAweGYzLCAweDQyLCAweDNjLCAweDYyLAorICAweGM4LCAweDJjLCAweDQ1LCAweDE4LCAweDI2LCAweDQ4LCAweDE3LCAweDRkLCAweDViLCAweDA0LCAweGYwLCAweDEyLAorICAweDliLCAweGQ4LCAweDY3LCAweDg1LCAweGQzLCAweDEyLCAweDI4LCAweGE1LCAweGFjLCAweDA0LCAweGE1LCAweGE1LAorICAweDA4LCAweDA1LCAweGEwLCAweDgwLCAweGM0LCAweDIwLCAweDYxLCAweDUwLCAweDBjLCAweDAxLCAweDgxLCAweGQ3LAorICAweGVlLCAweGEwLCAweDVlLCAweDA4LCAweGJmLCAweDMwLCAweGNmLCAweDVkLCAweDczLCAweGNlLCAweDdmLCAweDc0LAorICAweGY0LCAweGNmLCAweDI3LCAweGNlLCAweDUxLCAweGE3LCAweDgxLCAweGY3LCAweDk2LCAweDVkLCAweGRiLCAweGFkLAorICAweDI4LCAweGQ2LCAweDA2LCAweDAxLCAweGVlLCAweDEwLCAweDkxLCAweDJmLCAweGIwLCAweGRlLCAweDQwLCAweDAxLAorICAweDEyLCAweDc5LCAweGE0LCAweGJiLCAweDhiLCAweGM1LCAweDcwLCAweGRlLCAweGI2LCAweDRlLCAweGRjLCAweDMzLAorICAweDkyLCAweDQxLCAweGUxLCAweDQyLCAweDI4LCAweDJiLCAweDg4LCAweDg1LCAweGVhLCAweDcwLCAweDI2LCAweDg2LAorICAweGY1LCAweDgwLCAweDE4LCAweGVmLCAweDEwLCAweGI4LCAweDMzLCAweDM1LCAweDViLCAweDEwLCAweDBlLCAweDIxLAorICAweDRjLCAweGM3LCAweDQ3LCAweDVkLCAweDYyLCAweDNhLCAweGU0LCAweDQxLCAweDk3LCAweDlhLCAweDFhLCAweGJlLAorICAweDVkLCAweDg5LCAweDRjLCAweGI5LCAweGU3LCAweDU2LCAweDFmLCAweGMwLCAweDc5LCAweGYyLCAweDMyLCAweGZmLAorICAweDhhLCAweDNjLCAweDlkLCAweDRkLCAweDYzLCAweGY2LCAweDUyLCAweGZjLCAweGRlLCAweDk1LCAweGEyLCAweDA1LAorICAweDI1LCAweDRlLCAweGI4LCAweGIzLCAweDg1LCAweDgzLCAweDE3LCAweGZhLCAweDNlLCAweDUzLCAweGY2LCAweDRiLAorICAweGUzLCAweDg2LCAweDUyLCAweDMxLCAweDBhLCAweDNmLCAweGNmLCAweDFmLCAweGM3LCAweGYxLCAweDBhLCAweDgwLAorICAweDExLCAweGRjLCAweGFhLCAweDVhLCAweDZmLCAweDIyLCAweDc4LCAweDRhLCAweGI2LCAweDc0LCAweDE3LCAweGQzLAorICAweGE2LCAweDIwLCAweDdmLCAweGIyLCAweGEzLCAweDU5LCAweGU0LCAweGQzLCAweDU0LCAweGJjLCAweGU3LCAweDFkLAorICAweDU3LCAweDc3LCAweDRmLCAweDkyLCAweDFkLCAweDZmLCAweGM2LCAweDVhLCAweDIxLCAweGJjLCAweGIyLCAweDcxLAorICAweGEwLCAweDg2LCAweDQyLCAweDM3LCAweDljLCAweGE3LCAweGI3LCAweDY5LCAweDE5LCAweGJiLCAweDQ3LCAweDdhLAorICAweGMxLCAweDAzLCAweGYzLCAweDE2LCAweDYxLCAweDNkLCAweDVlLCAweGJkLCAweGJlLCAweGIyLCAweDQ3LCAweGUwLAorICAweDNlLCAweDYyLCAweDlmLCAweGUxLCAweDk1LCAweDY4LCAweDAzLCAweGQ1LCAweGZiLCAweDdiLCAweDc2LCAweGRmLAorICAweDAwLCAweDEwLCAweDcxLCAweDI3LCAweGUyLCAweDk4LCAweDg5LCAweGQ1LCAweGRmLCAweGY2LCAweGFmLCAweGUwLAorICAweGQ5LCAweGQxLCAweDU5LCAweGRjLCAweDZhLCAweDlkLCAweGNkLCAweDlmLCAweDIwLCAweDJiLCAweDk0LCAweGU5LAorICAweGRiLCAweDBmLCAweDYxLCAweDI1LCAweGJjLCAweDczLCAweDkxLCAweDAwLCAweDE2LCAweGRjLCAweDkzLCAweGM3LAorICAweGE3LCAweGEzLCAweGY2LCAweGJhLCAweGRmLCAweGE0LCAweDcyLCAweDQ4LCAweDE3LCAweGFlLCAweGNkLCAweGZhLAorICAweDRmLCAweDc5LCAweGY1LCAweDllLCAweGIzLCAweDFhLCAweDM1LCAweGYwLCAweDdmLCAweDI3LCAweDkyLCAweDdiLAorICAweGFhLCAweGEwLCAweDFlLCAweGVmLCAweGNhLCAweGMxLCAweGE5LCAweGMyLCAweGVlLCAweGY2LCAweGZhLCAweDkxLAorICAweGYzLCAweDNjLCAweDA5LCAweGY4LCAweGY2LCAweDcwLCAweDJjLCAweDE4LCAweGRmLCAweDA5LCAweGI5LCAweDM5LAorICAweGFhLCAweDk5LCAweDMxLCAweDRhLCAweGQxLCAweDA2LCAweGZhLCAweGRmLCAweGJkLCAweDgxLCAweDFiLCAweDQwLAorICAweDdiLCAweDI5LCAweDczLCAweGNhLCAweDhiLCAweDA5LCAweDU3LCAweDc5LCAweGI5LCAweGJlLCAweDM2LCAweGNkLAorICAweDM3LCAweDMzLCAweDY4LCAweGI0LCAweDIzLCAweDk0LCAweDU5LCAweDVhLCAweDc3LCAweGZkLCAweGU5LCAweDA0LAorICAweDhhLCAweGE4LCAweDE0LCAweDU5LCAweDBjLCAweDYwLCAweDE1LCAweDg0LCAweGQ1LCAweGRmLCAweGFiLCAweDUyLAorICAweGYxLCAweGViLCAweDQwLCAweGUwLCAweDc1LCAweDNhLCAweDNkLCAweDc3LCAweDU3LCAweGUwLCAweGM2LCAweDU5LAorICAweDRlLCAweGFlLCAweDg4LCAweDFmLCAweGVjLCAweGU1LCAweGY0LCAweGNjLCAweDMwLCAweGM4LCAweDAyLCAweDU4LAorICAweGJlLCAweDkxLCAweDUwLCAweDA0LCAweDk1LCAweDE0LCAweDUwLCAweDRmLCAweDAyLCAweGE0LCAweGU4LCAweDM5LAorICAweDk4LCAweDFjLCAweGQxLCAweDYyLCAweDA2LCAweDA4LCAweDIxLCAweDQxLCAweDA1LCAweGZjLCAweDNkLCAweGFkLAorICAweDVmLCAweGQ5LCAweGNkLCAweDg1LCAweDk3LCAweGU1LCAweDAyLCAweDkyLCAweGEzLCAweDFjLCAweGFmLCAweDNhLAorICAweDgwLCAweGRmLCAweDcxLCAweDdkLCAweDI2LCAweGY1LCAweGRkLCAweDY2LCAweGE2LCAweDk1LCAweDZmLCAweDBjLAorICAweDgwLCAweDY2LCAweGZjLCAweDJmLCAweDQ3LCAweDNjLCAweDY4LCAweGE4LCAweGU2LCAweGEyLCAweDIxLCAweDM0LAorICAweDgyLCAweDNhLCAweDc1LCAweDA4LCAweDRhLCAweDc2LCAweGM4LCAweDE5LCAweDBmLCAweGM4LCAweDE1LCAweDBiLAorICAweDNiLCAweDdmLCAweDRhLCAweGY0LCAweGQ5LCAweDZlLCAweDliLCAweGUyLCAweDY2LCAweDVmLCAweDlhLCAweGU1LAorICAweDNlLCAweDhiLCAweDc2LCAweDk4LCAweGQzLCAweDU0LCAweDRhLCAweDI0LCAweDYxLCAweDNlLCAweDcxLCAweGJhLAorICAweDExLCAweDA1LCAweDk4LCAweDA3LCAweDIxLCAweDdhLCAweDk0LCAweGM1LCAweGRhLCAweDA4LCAweDgzLCAweDE2LAorICAweGIzLCAweDgxLCAweDRlLCAweDEyLCAweDliLCAweDA5LCAweGEyLCAweGZjLCAweDhiLCAweDQwLCAweDAwLCAweDBlLAorICAweDdkLCAweDYxLCAweDllLCAweGZhLCAweDViLCAweDM0LCAweGZiLCAweGNiLCAweDhmLCAweDhkLCAweDJkLCAweDUwLAorICAweDZjLCAweDFjLCAweDViLCAweGNiLCAweGY5LCAweDRlLCAweDJkLCAweDBkLCAweDdjLCAweGZhLCAweDBmLCAweDgyLAorICAweGVlLCAweGJjLCAweDIzLCAweDMxLCAweDYzLCAweGE5LCAweDBjLCAweGU3LCAweDMzLCAweGQyLCAweDNjLCAweDZkLAorICAweGQ3LCAweDU5LCAweDkzLCAweGU4LCAweDMyLCAweDhlLCAweDczLCAweGM3LCAweDMzLCAweGMzLCAweGNlLCAweGU2LAorICAweGVjLCAweDNiLCAweDBiLCAweDczLCAweDU1LCAweDFlLCAweGYyLCAweDFiLCAweDY4LCAweDgzLCAweGVhLCAweDM1LAorICAweGE4LCAweGZkLCAweDMzLCAweGYwLCAweGRiLCAweDgxLCAweDhlLCAweDA5LCAweGExLCAweGFjLCAweDFkLCAweDlmLAorICAweDQ0LCAweDhiLCAweDUxLCAweGM4LCAweDM5LCAweGI2LCAweGU3LCAweGVlLCAweGJkLCAweDQ1LCAweGNjLCAweGYwLAorICAweDVhLCAweGEzLCAweGEwLCAweGY2LCAweDU1LCAweDVmLCAweDkxLCAweGE3LCAweGE5LCAweGM1LCAweDNiLCAweGQ4LAorICAweGIxLCAweGFlLCAweGNkLCAweDVhLCAweDg5LCAweDM4LCAweDlmLCAweDRhLCAweDBjLCAweDg0LCAweDI0LCAweDk1LAorICAweGI5LCAweDE1LCAweDk5LCAweGM5LCAweDVlLCAweDY2LCAweDUyLCAweDc1LCAweDdkLCAweGZjLCAweDVlLCAweDJiLAorICAweDM4LCAweGRiLCAweDFjLCAweDZhLCAweDg0LCAweDYzLCAweGU4LCAweDViLCAweDlkLCAweDIzLCAweDJkLCAweGY0LAorICAweDA2LCAweDI4LCAweDA2LCAweGIyLCAweDIxLCAweDA4LCAweDEzLCAweDgwLCAweDc2LCAweDVhLCAweDZmLCAweDBhLAorICAweDViLCAweGM4LCAweDllLCAweDk3LCAweDgyLCAweGJkLCAweGU3LCAweDMzLCAweDgxLCAweGI1LCAweDU0LCAweDM3LAorICAweGIyLCAweDUxLCAweGYwLCAweGM3LCAweDgxLCAweDkyLCAweDkzLCAweGJmLCAweDE4LCAweGQyLCAweGIzLCAweGFmLAorICAweDU2LCAweDViLCAweGUzLCAweDk3LCAweGIyLCAweDFmLCAweDNmLCAweGQ2LCAweGE5LCAweGM2LCAweDkxLCAweGIxLAorICAweGQyLCAweDM3LCAweGMzLCAweGM2LCAweDM2LCAweGUzLCAweGRkLCAweGNhLCAweDcwLCAweGFjLCAweGU5LCAweDlmLAorICAweGE0LCAweDYzLCAweGQ5LCAweDZhLCAweGQyLCAweGZiLCAweGQzLCAweDM0LCAweGRmLCAweDk0LCAweDYxLCAweDFjLAorICAweGFhLCAweDU1LCAweDRhLCAweGI0LCAweGVhLCAweDg0LCAweDExLCAweDVkLCAweGZjLCAweDlhLCAweDZkLCAweDE4LAorICAweGNhLCAweDA3LCAweGYwLCAweDA0LCAweGFkLCAweDllLCAweDA4LCAweDg0LCAweDExLCAweGQ4LCAweDhlLCAweGMxLAorICAweDkwLCAweGIxLCAweDgwLCAweDBmLCAweDg2LCAweDk2LCAweDU4LCAweDIxLCAweDYwLCAweDBlLCAweGVlLCAweDg4LAorICAweGU2LCAweDQxLCAweDFkLCAweDNhLCAweDdiLCAweDkxLCAweGI5LCAweDlmLCAweGI1LCAweDE2LCAweDIzLCAweGYyLAorICAweDhhLCAweDM3LCAweGE0LCAweDY4LCAweDFiLCAweGIxLCAweGE2LCAweDI4LCAweDRiLCAweDRlLCAweDYwLCAweDJjLAorICAweDg5LCAweDY2LCAweDUzLCAweDRjLCAweDU0LCAweDBlLCAweDFmLCAweGRmLCAweDk5LCAweDY5LCAweDg2LCAweDY1LAorICAweGI5LCAweGI0LCAweDJhLCAweGNhLCAweDUxLCAweDRhLCAweDI4LCAweDAwLCAweDRmLCAweDZhLCAweDUxLCAweDA2LAorICAweGY3LCAweDQ3LCAweGNhLCAweDc0LCAweDllLCAweGFmLCAweGQ0LCAweGI2LCAweDIwLCAweDI0LCAweGRkLCAweGY0LAorICAweDRkLCAweDEwLCAweDA3LCAweDEwLCAweDJkLCAweDUyLCAweDhjLCAweDBjLCAweGY1LCAweDAwLCAweDAyLCAweDdjLAorICAweDc2LCAweDg5LCAweDA0LCAweGVlLCAweDJkLCAweDEwLCAweDU4LCAweDkwLCAweDUxLCAweDUyLCAweGU0LCAweGIxLAorICAweDExLCAweGFjLCAweDE2LCAweDhkLCAweDUyLCAweDg0LCAweGYxLCAweDAwLCAweDAwLCAweDM5LCAweDBkLCAweGU5LAorICAweDZkLCAweDEwLCAweGUwLCAweDIxLCAweDFhLCAweDk0LCAweGQ1LCAweGNlLCAweDhiLCAweDYxLCAweDgxLCAweDMwLAorICAweDg4LCAweDY4LCAweDUxLCAweDE5LCAweDA0LCAweDAyLCAweDg1LCAweGEzLCAweDJlLCAweDBjLCAweDExLCAweGFlLAorICAweDJmLCAweDgwLCAweDJjLCAweDgzLCAweDFhLCAweDJkLCAweDk1LCAweGE5LCAweDUyLCAweDM4LCAweDAwLCAweDc0LAorICAweDk3LCAweGRmLCAweGZkLCAweGZiLCAweGE0LCAweGY3LCAweDQ2LCAweGVhLCAweDcxLCAweDc4LCAweGI3LCAweGQ0LAorICAweGJhLCAweDEzLCAweDUxLCAweDZkLCAweDFiLCAweGJjLCAweDU1LCAweGViLCAweGZmLCAweDQyLCAweDNhLCAweDI5LAorICAweGRiLCAweGRiLCAweGEwLCAweDI4LCAweDMwLCAweGY4LCAweDI1LCAweDY2LCAweDVmLCAweGMwLCAweDQ3LCAweGRiLAorICAweGY3LCAweDIyLCAweDI5LCAweGYzLCAweDc2LCAweDc5LCAweGJhLCAweDQyLCAweGQzLCAweGQ0LCAweDVmLCAweGQ2LAorICAweDY3LCAweGYwLCAweGFmLCAweDllLCAweDllLCAweGY5LCAweDk5LCAweGYwLCAweGY4LCAweDI4LCAweGM4LCAweDAwLAorICAweGY2LCAweDA3LCAweGQyLCAweDdlLCAweDZiLCAweGFkLCAweDczLCAweDAzLCAweGVhLCAweDk1LCAweGI4LCAweDI5LAorICAweGY5LCAweDM0LCAweDkxLCAweGNmLCAweGI3LCAweGU1LCAweGU5LCAweDdjLCAweDVhLCAweDJmLCAweDBiLCAweGI3LAorICAweGM3LCAweGQ5LCAweDRhLCAweGJiLCAweDc5LCAweDUxLCAweGRiLCAweDBlLCAweDY3LCAweDk1LCAweDdhLCAweDQ2LAorICAweDdkLCAweDRiLCAweDk4LCAweDFhLCAweGYzLCAweGQ5LCAweDM4LCAweDFiLCAweGI0LCAweGY1LCAweDU4LCAweGZiLAorICAweDBjLCAweDA3LCAweDA2LCAweGZiLCAweDhlLCAweDlkLCAweGEwLCAweDg2LCAweGI4LCAweGQ3LCAweDlmLCAweGIzLAorICAweDlhLCAweDg3LCAweDZlLCAweGZkLCAweDRmLCAweDUyLCAweGUxLCAweGFjLCAweGI2LCAweDlhLCAweDI4LCAweDFmLAorICAweGRkLCAweGE4LCAweDgzLCAweDUxLCAweDg3LCAweGVkLCAweDEyLCAweGYwLCAweDNkLCAweDg2LCAweDRhLCAweDZiLAorICAweDhjLCAweDcxLCAweDM1LCAweGRkLCAweDdlLCAweGUzLCAweGJmLCAweGMxLCAweDk0LCAweDE2LCAweGEyLCAweGUwLAorICAweDdmLCAweDM3LCAweGIyLCAweGIzLCAweDYwLCAweGI0LCAweGNkLCAweDAzLCAweGU0LCAweGE0LCAweDI3LCAweGEwLAorICAweDE0LCAweDVhLCAweDc3LCAweDMyLCAweDExLCAweDE3LCAweDMzLCAweDJkLCAweDYwLCAweGFlLCAweDhlLCAweDBlLAorICAweDQ2LCAweDFjLCAweGY5LCAweGE2LCAweDg1LCAweDYwLCAweDcyLCAweGZkLCAweGFjLCAweDEwLCAweDRiLCAweGFlLAorICAweGQ2LCAweDAzLCAweDQ2LCAweDliLCAweGIzLCAweGI3LCAweGVmLCAweGJhLCAweDY1LCAweGZkLCAweGRhLCAweGVlLAorICAweDE5LCAweDAzLCAweDU3LCAweDU5LCAweDJlLCAweGMxLCAweDZjLCAweGFlLCAweDBlLCAweDM5LCAweDgxLCAweDFjLAorICAweGM0LCAweDg1LCAweDgyLCAweDc3LCAweGJjLCAweDg0LCAweDY4LCAweDk4LCAweGRhLCAweGI2LCAweGIzLCAweGViLAorICAweDJhLCAweDQwLCAweGUzLCAweGIzLCAweGM4LCAweGRjLCAweDBjLCAweGMwLCAweDJjLCAweDI4LCAweDNlLCAweDNiLAorICAweDdmLCAweGE3LCAweGRjLCAweDdmLCAweGY3LCAweGVjLCAweGQ5LCAweDY5LCAweGFiLCAweGIyLCAweDYyLCAweDhlLAorICAweGM4LCAweDAxLCAweGM4LCAweDgwLCAweDYyLCAweDE2LCAweDE5LCAweDBjLCAweDQ2LCAweDAyLCAweDEzLCAweDk5LAorICAweDcwLCAweDIwLCAweDE3LCAweGVjLCAweGQwLCAweGQwLCAweDFjLCAweDYwLCAweGI2LCAweDUyLCAweGE3LCAweDQwLAorICAweDAwLCAweDEzLCAweGRlLCAweGFiLCAweDdmLCAweDk5LCAweDg1LCAweDQwLCAweDZhLCAweGI1LCAweDQxLCAweDIzLAorICAweGI2LCAweDA5LCAweGY3LCAweDk3LCAweDk5LCAweDA0LCAweGIzLCAweDk5LCAweDcyLCAweGJhLCAweDg1LCAweGEwLAorICAweGE5LCAweDk5LCAweDgyLCAweDA1LCAweDkyLCAweDg0LCAweDA5LCAweDRhLCAweDJhLCAweGIxLCAweGFmLCAweGNkLAorICAweGJkLCAweGY3LCAweDY2LCAweDljLCAweDI2LCAweGUzLCAweGYzLCAweDA3LCAweDZmLCAweDNmLCAweDJmLCAweGUzLAorICAweGZjLCAweGZlLCAweDM5LCAweGYxLCAweGMzLCAweGFmLCAweDY3LCAweDkyLCAweGY5LCAweGYwLCAweGQ3LCAweDNjLAorICAweDhjLCAweDhlLCAweDJkLCAweDZkLCAweDUzLCAweDU2LCAweDc0LCAweDAzLCAweGIzLCAweGNkLCAweDY1LCAweGU1LAorICAweDZiLCAweDhhLCAweDRlLCAweDllLCAweDhlLCAweDc4LCAweGMwLCAweDI0LCAweGVjLCAweDlhLCAweGE2LCAweDAxLAorICAweDc1LCAweDQxLCAweDlhLCAweDNiLCAweDNlLCAweDNjLCAweDI0LCAweGQxLCAweDY5LCAweDFlLCAweGNjLCAweGNjLAorICAweDJmLCAweDk0LCAweDI1LCAweGMxLCAweDZmLCAweDk1LCAweDliLCAweDZjLCAweDMzLCAweDAwLCAweDRhLCAweGMwLAorICAweGNiLCAweDJmLCAweDhhLCAweDNlLCAweDU4LCAweDA5LCAweDE1LCAweDc5LCAweDQwLCAweDFjLCAweDIxLCAweDFhLAorICAweDk0LCAweGNkLCAweDllLCAweDllLCAweGMzLCAweDQxLCAweDEyLCAweDA0LCAweGU2LCAweDQ4LCAweGQzLCAweDJjLAorICAweDUzLCAweDYzLCAweDhiLCAweGUyLCAweGY0LCAweDk2LCAweDVhLCAweDAwLCAweDU4LCAweDVmLCAweDc4LCAweGFjLAorICAweDA3LCAweDhhLCAweGY2LCAweGIzLCAweGFiLCAweDBjLCAweGYwLCAweDFlLCAweGY2LCAweGJjLCAweGFmLCAweGViLAorICAweDVjLCAweGJkLCAweDY1LCAweGYwLCAweGI2LCAweDdiLCAweGNhLCAweGJlLCAweDhlLCAweGJiLCAweDEzLCAweDdkLAorICAweGFmLCAweDBlLCAweGNmLCAweDMyLCAweGFmLCAweGU2LCAweGYyLCAweDBjLCAweGU5LCAweDMzLCAweGIwLCAweDc2LAorICAweDA4LCAweDVhLCAweGZmLCAweDk3LCAweDY2LCAweGRlLCAweGM5LCAweDQ1LCAweGM2LCAweGY3LCAweGFjLCAweDg3LAorICAweDkxLCAweGRmLCAweGZmLCAweDc3LCAweDljLCAweDdlLCAweDkzLCAweGFlLCAweGU0LCAweGU0LCAweGI5LCAweDA1LAorICAweDU3LCAweDdiLCAweGYzLCAweGIzLCAweDVhLCAweDIxLCAweGVmLCAweDRkLCAweGIxLCAweDE0LCAweDk3LCAweDFiLAorICAweDk5LCAweDM1LCAweDlkLCAweGI1LCAweGE2LCAweDZjLCAweGUxLCAweDZkLCAweDE5LCAweDU1LCAweDBhLCAweDQzLAorICAweDBjLCAweDhkLCAweDIwLCAweDRiLCAweGQ3LCAweDJjLCAweDY0LCAweDAyLCAweDU0LCAweDc3LCAweDRiLCAweDZmLAorICAweDU1LCAweDUxLCAweDc3LCAweGMwLCAweGZlLCAweGJkLCAweGRlLCAweGZkLCAweDJhLCAweGY2LCAweGNlLCAweDAzLAorICAweDc4LCAweDFkLCAweDc0LCAweDU0LCAweGNlLCAweDFhLCAweDc5LCAweDc3LCAweGEwLCAweGE2LCAweDcxLCAweDVkLAorICAweGQxLCAweGUyLCAweGE5LCAweDdkLCAweDMxLCAweDQ4LCAweDAwLCAweDI1LCAweDIyLCAweDUwLCAweDQ2LCAweDYzLAorICAweDRkLCAweDJkLCAweDU5LCAweGNlLCAweDcwLCAweGE1LCAweGQ0LCAweGIxLCAweDgzLCAweDc2LCAweDc0LCAweDE2LAorICAweDI5LCAweDVmLCAweDcwLCAweDJmLCAweGU3LCAweGRiLCAweGJhLCAweGU2LCAweGMzLCAweGUxLCAweDQ2LCAweGMwLAorICAweGI5LCAweGRhLCAweDNmLCAweDdkLCAweDhiLCAweGY0LCAweDY3LCAweDhiLCAweGQ2LCAweGYzLCAweDYyLCAweDhmLAorICAweDEzLCAweGU3LCAweGYyLCAweDAxLCAweGYyLCAweDlmLCAweGM3LCAweDk0LCAweDQxLCAweDQ2LCAweDc3LCAweGNiLAorICAweGI1LCAweDYzLCAweGYzLCAweDg3LCAweGUxLCAweGZkLCAweDcyLCAweDViLCAweDc1LCAweDQyLCAweDVhLCAweDk0LAorICAweDg1LCAweDAxLCAweGI4LCAweDg2LCAweDA4LCAweDEwLCAweDEwLCAweDhkLCAweDQxLCAweGJlLCAweGFhLCAweDZkLAorICAweDRiLCAweDcwLCAweDViLCAweDVhLCAweGI1LCAweGRjLCAweDA2LCAweDk4LCAweDE4LCAweDFhLCAweDQ5LCAweGJmLAorICAweGViLCAweGE2LCAweDhjLCAweGI2LCAweDZiLCAweGYwLCAweDU3LCAweDJjLCAweDJmLCAweGViLCAweGJiLCAweDJkLAorICAweDUxLCAweDQxLCAweDY1LCAweDRkLCAweDZlLCAweDZhLCAweDRiLCAweGUzLCAweGMyLCAweDhjLCAweGI0LCAweDgxLAorICAweDVjLCAweDAyLCAweDQ1LCAweDM3LCAweGU5LCAweGZlLCAweDRlLCAweDg1LCAweGIxLCAweDgwLCAweDIwLCAweDVjLAorICAweDAwLCAweDg4LCAweDIyLCAweGEyLCAweDQ5LCAweDUwLCAweDAyLCAweDgyLCAweGMyLCAweGU2LCAweDFhLCAweDQ3LAorICAweDdkLCAweDIyLCAweDU4LCAweDVhLCAweDFlLCAweDViLCAweGExLCAweDU5LCAweDI3LCAweDllLCAweGYwLCAweDA0LAorICAweDQ2LCAweDg4LCAweDA1LCAweGZhLCAweDY3LCAweDk4LCAweDE1LCAweDQzLCAweDUxLCAweDFmLCAweDU4LCAweDU2LAorICAweDY3LCAweGNiLCAweGY4LCAweGY4LCAweDQwLCAweDA3LCAweDdkLCAweGNhLCAweDU2LCAweDM5LCAweDgzLCAweDA3LAorICAweDIxLCAweDFhLCAweDk0LCAweGFkLCAweGM2LCAweDg5LCAweDA3LCAweDQ3LCAweDAwLCAweDE2LCAweDFiLCAweGE0LAorICAweGU5LCAweGFkLCAweDRjLCAweGVhLCAweDQ5LCAweDYwLCAweGE0LCAweDA1LCAweGIyLCAweDc3LCAweDEyLCAweDQ3LAorICAweGVjLCAweGJhLCAweDQwLCAweGNiLCAweGYzLCAweDcyLCAweDZkLCAweDNkLCAweDZjLCAweDlkLCAweDZkLCAweDJkLAorICAweGI2LCAweDRjLCAweDU3LCAweGZiLCAweGU3LCAweDg5LCAweGI3LCAweDRhLCAweGY4LCAweDNlLCAweDUwLCAweDYwLAorICAweDcxLCAweDY2LCAweGNiLCAweGY0LCAweDQyLCAweDMxLCAweGQwLCAweDMxLCAweDE3LCAweGVjLCAweDhkLCAweDkyLAorICAweDI5LCAweDU4LCAweGFlLCAweDdjLCAweDkwLCAweGJjLCAweGViLCAweDNmLCAweGU5LCAweGZkLCAweDViLCAweDg0LAorICAweGMwLCAweDI4LCAweDcxLCAweDcwLCAweGE3LCAweGFiLCAweGJlLCAweGQ5LCAweGQ2LCAweGZkLCAweDYzLCAweGUwLAorICAweGI0LCAweGM2LCAweDVjLCAweGQ1LCAweDU4LCAweDk2LCAweDJmLCAweGM1LCAweDE3LCAweGY5LCAweDhlLCAweDE2LAorICAweDMyLCAweGJmLCAweGQwLCAweGJkLCAweDhmLCAweDk1LCAweDUzLCAweDcyLCAweGE1LCAweGVmLCAweGZhLCAweDhkLAorICAweDVhLCAweDMzLCAweGExLCAweGVkLCAweDNhLCAweDc2LCAweDc5LCAweGJkLCAweDBkLCAweDdlLCAweDU1LCAweDE4LAorICAweDczLCAweDNiLCAweDJhLCAweGVjLCAweDYwLCAweDg1LCAweDEyLCAweDM3LCAweGU2LCAweDBjLCAweDc5LCAweDZmLAorICAweDI2LCAweGNjLCAweDJkLCAweGM2LCAweGEwLCAweDMyLCAweDBhLCAweDRmLCAweDc2LCAweDM4LCAweGI0LCAweGRmLAorICAweDYxLCAweDZmLCAweGE1LCAweDExLCAweDMxLCAweGQ0LCAweDQ1LCAweGM3LCAweDgxLCAweDgyLCAweGRiLCAweDQwLAorICAweDg0LCAweGRmLCAweDQwLCAweDg2LCAweGRmLCAweDAwLCAweDEzLCAweDI4LCAweDgwLCAweGE2LCAweGY5LCAweDA2LAorICAweDJjLCAweDQ4LCAweDIyLCAweGQ4LCAweDg4LCAweDA5LCAweDY4LCAweDI0LCAweGVlLCAweGM4LCAweDU4LCAweDY0LAorICAweGI0LCAweDk1LCAweDVmLCAweGM5LCAweDAyLCAweGM3LCAweDNjLCAweDFjLCAweDc2LCAweDNjLCAweGFhLCAweDBhLAorICAweDY1LCAweDc1LCAweDJiLCAweGNhLCAweDA4LCAweDRmLCAweDFiLCAweGQyLCAweGNmLCAweGVhLCAweGNjLCAweDBhLAorICAweDVlLCAweDZiLCAweDNmLCAweDUxLCAweDVmLCAweGVmLCAweDM3LCAweGNkLCAweDIyLCAweGU0LCAweDIwLCAweGVhLAorICAweGFmLCAweGNkLCAweDFjLCAweDgxLCAweGJiLCAweDUwLCAweDljLCAweGI3LCAweDliLCAweDYyLCAweDkwLCAweDhkLAorICAweDYwLCAweDU4LCAweDA1LCAweDg2LCAweDYxLCAweDlhLCAweDFiLCAweDMwLCAweDU2LCAweGE2LCAweDRlLCAweGQwLAorICAweDEwLCAweDNmLCAweDZlLCAweDBhLCAweDY5LCAweDcyLCAweGIzLCAweDg1LCAweGVjLCAweDJkLCAweDM1LCAweDk5LAorICAweDMxLCAweGZmLCAweDI1LCAweDg4LCAweGI2LCAweDM4LCAweDQ1LCAweDU1LCAweDU4LCAweGQ1LCAweDQ1LCAweDZlLAorICAweDcxLCAweDAwLCAweGEwLCAweGI1LCAweDllLCAweDRhLCAweDdlLCAweGEzLCAweGJiLCAweGJjLCAweGE1LCAweDlkLAorICAweDkwLCAweDAzLCAweDcyLCAweDgwLCAweDUwLCAweGEyLCAweDc0LCAweDA4LCAweDA4LCAweDQ2LCAweDAxLCAweDUyLAorICAweGE4LCAweDg1LCAweGJkLCAweDljLCAweDVhLCAweGUwLCAweDAwLCAweDIyLCAweDllLCAweGIxLCAweGNjLCAweGJjLAorICAweDU3LCAweGQzLCAweDU5LCAweDYzLCAweGM3LCAweGJjLCAweDYzLCAweDRjLCAweGU2LCAweDVhLCAweDczLCAweDNkLAorICAweGQ2LCAweDIwLCAweDQ5LCAweGY1LCAweDRiLCAweDA0LCAweDcwLCAweGIwLCAweGE4LCAweDYzLCAweDQ2LCAweGI0LAorICAweGM4LCAweDEwLCAweDkyLCAweDIxLCAweDM4LCAweDE4LCAweGQ1LCAweGNlLCAweDNmLCAweDM3LCAweGJkLCAweGM1LAorICAweDA5LCAweDAyLCAweDAwLCAweDI5LCAweDA0LCAweDk2LCAweGUwLCAweDM4LCAweDg5LCAweDZmLCAweGZmLCAweDdjLAorICAweGIzLCAweDRiLCAweGYyLCAweDBhLCAweGY1LCAweDM3LCAweDczLCAweDA3LCAweGZhLCAweDRjLCAweGNjLCAweDM3LAorICAweDkxLCAweDY2LCAweDBiLCAweDVkLCAweGIxLCAweDU1LCAweGIzLCAweGE1LCAweDZkLCAweGU3LCAweGNlLCAweDg0LAorICAweDZkLCAweDhjLCAweGM0LCAweGYxLCAweGFjLCAweDY0LCAweDcyLCAweDg1LCAweDMxLCAweGU4LCAweGJjLCAweDdlLAorICAweDkwLCAweGJiLCAweDA0LCAweDY3LCAweGEyLCAweDBiLCAweGJjLCAweDc0LCAweGEyLCAweDAwLCAweGZiLCAweDc5LAorICAweDNmLCAweDVlLCAweGJkLCAweGI5LCAweDNlLCAweGUyLCAweDliLCAweGVlLCAweDhlLCAweGU2LCAweGQyLCAweDljLAorICAweDg4LCAweGFlLCAweGJmLCAweDUwLCAweGE1LCAweGI5LCAweGZhLCAweGY5LCAweDY5LCAweGU5LCAweGIwLCAweDM4LAorICAweDIxLCAweDFhLCAweDk0LCAweGQ1LCAweDllLCAweGE2LCAweGMzLCAweDQ0LCAweDA5LCAweDU1LCAweDIyLCAweGE1LAorICAweGI1LCAweDU5LCAweDc5LCAweGM5LCAweDM1LCAweGE2LCAweGI4LCAweDk0LCAweDlhLCAweGI5LCAweDJhLCAweGFmLAorICAweDA4LCAweDUxLCAweGFjLCAweDlkLCAweDQyLCAweDkwLCAweDBhLCAweDA1LCAweDUzLCAweGMzLCAweGFlLCAweDZlLAorICAweGJkLCAweDk3LCAweDdhLCAweGUxLCAweGZiLCAweDk4LCAweDdmLCAweDBmLCAweDI0LCAweGM2LCAweDE4LCAweDk1LAorICAweDI3LCAweGE1LCAweDkzLCAweGQ3LCAweGZiLCAweDE2LCAweGNlLCAweGQ3LCAweDdiLCAweDdlLCAweGFiLCAweDY5LAorICAweDE5LCAweDViLCAweGVkLCAweDVlLCAweGMxLCAweDZlLCAweGJkLCAweDVjLCAweGJjLCAweGRiLCAweDk4LCAweDU2LAorICAweDI5LCAweGRmLCAweGZiLCAweGE3LCAweGIyLCAweDc4LCAweDM0LCAweGRiLCAweGU1LCAweDg2LCAweDE3LCAweDA1LAorICAweGViLCAweGU4LCAweGYyLCAweGU5LCAweGRjLCAweDg1LCAweDUwLCAweDFhLCAweGVkLCAweDFhLCAweGI5LCAweDE2LAorICAweGEyLCAweDc2LCAweDRmLCAweDUxLCAweGY2LCAweGJkLCAweDhkLCAweDVlLCAweDEwLCAweDFmLCAweGRiLCAweGQ1LAorICAweGQ1LCAweGM3LCAweGIyLCAweGIyLCAweDVlLCAweDJlLCAweDE2LCAweDA1LCAweDA1LCAweDU0LCAweDg4LCAweDVhLAorICAweGFjLCAweDM0LCAweDVkLCAweDA4LCAweDYyLCAweDA3LCAweDZiLCAweGRhLCAweGQwLCAweGUwLCAweDNhLCAweDA1LAorICAweDU2LCAweGE3LCAweGY5LCAweGJlLCAweGI3LCAweDUyLCAweGUzLCAweDk5LCAweDY0LCAweGFkLCAweDBmLCAweDk1LAorICAweGM1LCAweGY1LCAweDU2LCAweDVhLCAweGE3LCAweDQyLCAweGM4LCAweGRlLCAweDMyLCAweDUzLCAweDZjLCAweDI2LAorICAweDlmLCAweDllLCAweDVjLCAweDI2LCAweDA5LCAweDY4LCAweDA2LCAweDg3LCAweDlhLCAweDUwLCAweDgyLCAweDJhLAorICAweGE1LCAweDkyLCAweDI4LCAweDBiLCAweDg1LCAweDE2LCAweGU3LCAweDRkLCAweDcyLCAweDFjLCAweGY3LCAweDUwLAorICAweDg3LCAweDJlLCAweDY1LCAweDQ1LCAweGQzLCAweGU0LCAweGQ5LCAweGE5LCAweDgzLCAweGNkLCAweDBiLCAweGNkLAorICAweDc0LCAweDA2LCAweDAyLCAweDU1LCAweDVkLCAweDczLCAweGQwLCAweGI2LCAweDkyLCAweGU2LCAweGIzLCAweDFhLAorICAweGFmLCAweDBkLCAweDk5LCAweGU1LCAweGRjLCAweDU3LCAweGE3LCAweGVjLCAweGU0LCAweDA2LCAweGNiLCAweGQ5LAorICAweDc0LCAweGNhLCAweDdhLCAweGVlLCAweDgwLCAweDBjLCAweDFhLCAweGVjLCAweDg4LCAweGZjLCAweDdiLCAweDNkLAorICAweGU2LCAweDA2LCAweGUyLCAweDVjLCAweDUwLCAweGNhLCAweGE0LCAweGNiLCAweDExLCAweDZlLCAweDNlLCAweDI4LAorICAweDYxLCAweGI0LCAweGUxLCAweDkyLCAweGU0LCAweGVlLCAweDliLCAweDg4LCAweDAxLCAweDY4LCAweDNmLCAweDJiLAorICAweDQ1LCAweDQwLCAweDNkLCAweDFhLCAweGExLCAweDZiLCAweDgwLCAweDk2LCAweGEzLCAweGIyLCAweDAwLCAweDZhLAorICAweDIxLCAweDIzLCAweDEwLCAweDUyLCAweDAyLCAweDExLCAweGFiLCAweDJlLCAweDZmLCAweDRjLCAweGIxLCAweDQxLAorICAweGU2LCAweGQyLCAweDQzLCAweGNjLCAweGEwLCAweDU4LCAweGQ2LCAweDU4LCAweDkxLCAweDE3LCAweDI0LCAweDAwLAorICAweDNhLCAweDA1LCAweDUzLCAweGMzLCAweGIzLCAweDZlLCAweDA3LCAweDdkLCAweGYxLCAweDlhLCAweGQ2LCAweDMwLAorICAweGUzLCAweGJjLCAweDVhLCAweGQ4LCAweDc4LCAweDlhLCAweDgzLCAweDFjLCAweGY5LCAweDNiLCAweDBlLCAweGNiLAorICAweGQ4LCAweGEwLCAweDQ0LCAweDUyLCAweDI3LCAweDAzLCAweDU0LCAweGJkLCAweDU3LCAweDM3LCAweDQyLCAweGY1LAorICAweGZhLCAweGY1LCAweGNhLCAweDQwLCAweDdlLCAweDFjLCAweGY4LCAweDBhLCAweDdkLCAweGNmLCAweDg5LCAweGNiLAorICAweGI2LCAweGY5LCAweDllLCAweGFlLCAweGJiLCAweDcwLCAweGE3LCAweDhmLCAweDc0LCAweGJkLCAweDcxLCAweDg1LAorICAweDkzLCAweDViLCAweDgzLCAweDI1LCAweDZiLCAweDRhLCAweDNiLCAweGIyLCAweDNhLCAweDlhLCAweDEwLCAweGIyLAorICAweDNhLCAweGI0LCAweDM4LCAweDIxLCAweDA5LCAweDgwLCAweGY5LCAweGNlLCAweDYxLCAweDc0LCAweGNiLCAweDc2LAorICAweDBhLCAweDQxLCAweDQ5LCAweGEzLCAweGJiLCAweDM1LCAweGZmLCAweDhlLCAweGU5LCAweGZiLCAweGViLCAweDgxLAorICAweDk3LCAweDFhLCAweDg3LCAweDRmLCAweGE5LCAweGQzLCAweDA3LCAweDRmLCAweDc2LCAweDFmLCAweDQ3LCAweDRmLAorICAweDc0LCAweDg4LCAweDIyLCAweGQ1LCAweDAxLCAweDk0LCAweDAwLCAweDA1LCAweDdmLCAweDg4LCAweDM4LCAweDIxLAorICAweDFhLCAweDk0LCAweGM1LCAweGNlLCAweDhjLCAweGMzLCAweDI0LCAweDg5LCAweDQwLCAweDFhLCAweGNhLCAweDE0LAorICAweDEzLCAweGEwLCAweGJiLCAweDk3LCAweGFhLCAweGEwLCAweGI4LCAweGEzLCAweDU5LCAweDYyLCAweDkyLCAweDFjLAorICAweDczLCAweGM3LCAweDI4LCAweDExLCAweDJjLCAweGE2LCAweDc4LCAweGI3LCAweGM1LCAweDRkLCAweGJlLCAweGJlLAorICAweGQxLCAweGQ4LCAweGJlLCAweDI1LCAweDgzLCAweDk4LCAweGY3LCAweDI1LCAweGU5LCAweDgyLCAweDY3LCAweDFjLAorICAweDk4LCAweDBiLCAweGIwLCAweDliLCAweGI3LCAweDJiLCAweDgyLCAweDM0LCAweDhiLCAweGU3LCAweDBhLCAweGFiLAorICAweDg2LCAweDZkLCAweGQ4LCAweDdkLCAweDNkLCAweGZmLCAweDY5LCAweGU2LCAweGY1LCAweGYwLCAweDBkLCAweDI1LAorICAweDY1LCAweGI0LCAweGUyLCAweDM2LCAweGQ2LCAweGEzLCAweGIwLCAweDYxLCAweGQyLCAweDM3LCAweDMwLCAweDUyLAorICAweDhlLCAweDE2LCAweGJlLCAweGZiLCAweDZjLCAweGVjLCAweDdlLCAweDRhLCAweGNhLCAweDU5LCAweGNjLCAweGNlLAorICAweDIyLCAweGY5LCAweDhkLCAweGVlLCAweDFiLCAweDQ4LCAweDNlLCAweDJmLCAweGJhLCAweDk2LCAweDJmLCAweDBjLAorICAweDU4LCAweGFiLCAweDJhLCAweDM1LCAweGRhLCAweDdjLCAweDJiLCAweDE0LCAweGNjLCAweGQ5LCAweDJiLCAweDdkLAorICAweDExLCAweDZlLCAweGNkLCAweDczLCAweDg1LCAweGU1LCAweGVmLCAweDc1LCAweGE4LCAweDYxLCAweDhiLCAweDlkLAorICAweDYyLCAweDEyLCAweGFiLCAweDEyLCAweGJiLCAweGY5LCAweGQ3LCAweGQ0LCAweGQxLCAweGQ2LCAweDJiLCAweGY4LAorICAweGFiLCAweGFiLCAweDI2LCAweDNkLCAweGIyLCAweGE1LCAweGI1LCAweDQyLCAweDBhLCAweDU0LCAweGE2LCAweDZhLAorICAweDNlLCAweDMyLCAweDA2LCAweDg3LCAweDRhLCAweDhlLCAweGU3LCAweGE1LCAweDA2LCAweDc3LCAweDUxLCAweDFjLAorICAweDYyLCAweDU1LCAweDcxLCAweGEwLCAweGQ5LCAweGQ0LCAweDVkLCAweDZhLCAweGExLCAweDI5LCAweDUyLCAweDc3LAorICAweGRiLCAweDg2LCAweDdjLCAweDY5LCAweDY0LCAweDMxLCAweGNmLCAweDRiLCAweDE0LCAweDY2LCAweDM2LCAweDJiLAorICAweDU5LCAweDc2LCAweDYxLCAweDI4LCAweDQwLCAweDAzLCAweGNlLCAweGMwLCAweDhlLCAweDhjLCAweDcyLCAweGEzLAorICAweDM4LCAweDEzLCAweDA2LCAweDEwLCAweGEyLCAweDA4LCAweDc5LCAweDg3LCAweDM5LCAweGYwLCAweGY1LCAweDU4LAorICAweDc5LCAweDBkLCAweDc4LCAweGZkLCAweGNhLCAweDY2LCAweGQzLCAweDJiLCAweDVjLCAweGU0LCAweDE3LCAweDFmLAorICAweGJhLCAweDdiLCAweGY4LCAweDljLCAweDFmLCAweDIxLCAweDEyLCAweDM3LCAweGYxLCAweGJmLCAweDk2LCAweDRkLAorICAweDcyLCAweGQ3LCAweGYxLCAweDFkLCAweGNhLCAweGNkLCAweDEwLCAweDRjLCAweGQyLCAweDUwLCAweGMwLCAweDM0LAorICAweDEwLCAweDQ0LCAweDRhLCAweGJhLCAweDY2LCAweGU0LCAweGIwLCAweDBmLCAweGYxLCAweDM0LCAweDhkLCAweDY1LAorICAweDhhLCAweDQ4LCAweDcxLCAweGNmLCAweDFjLCAweGEwLCAweDQ0LCAweGIyLCAweDk3LCAweGQ2LCAweDM4LCAweGY2LAorICAweGIzLCAweDhjLCAweGYyLCAweDVlLCAweGE2LCAweGRiLCAweDdlLCAweGJkLCAweGJjLCAweDMzLCAweDNjLCAweGIyLAorICAweDQ3LCAweDFlLCAweGY2LCAweDNjLCAweDQwLCAweDBjLCAweDNjLCAweDAyLCAweGQ0LCAweGRmLCAweDNmLCAweGZlLAorICAweGZiLCAweGI4LCAweGZmLCAweGE3LCAweDg3LCAweGFkLCAweGUwLCAweDAwLCAweDM2LCAweDgwLCAweDk2LCAweDgwLAorICAweDAwLCAweDY5LCAweDBlLCAweDIxLCAweDJhLCAweDk0LCAweGI1LCAweGEyLCAweDhmLCAweDY0LCAweDgxLCAweGIxLAorICAweDg4LCAweDg4LCAweDIyLCAweDQwLCAweDBiLCAweDY1LCAweGVmLCAweDUyLCAweDg1LCAweGNkLCAweDM4LCAweDY3LAorICAweDEzLCAweDQwLCAweDAwLCAweDBkLCAweDI3LCAweGVhLCAweDFkLCAweDU3LCAweGM5LCAweDA0LCAweDUwLCAweDdlLAorICAweGViLCAweGE3LCAweDQ5LCAweDA5LCAweDEzLCAweGYxLCAweDljLCAweDljLCAweDUxLCAweGY2LCAweDZmLCAweDU4LAorICAweGU2LCAweDZmLCAweDc0LCAweGUyLCAweGFhLCAweGY0LCAweDFmLCAweDViLCAweDkxLCAweGRiLCAweDJhLCAweDIxLAorICAweDU4LCAweGQ5LCAweGViLCAweDU2LCAweGRjLCAweGRlLCAweDQ4LCAweDNhLCAweDA3LCAweDUxLCAweGRhLCAweDFlLAorICAweGZiLCAweDU4LCAweGJlLCAweGQyLCAweDI0LCAweDU0LCAweGVjLCAweGFkLCAweDliLCAweGM4LCAweDJjLCAweDJhLAorICAweDMzLCAweDQzLCAweGZhLCAweGFiLCAweDg3LCAweDBhLCAweGFhLCAweGEyLCAweDU2LCAweDFiLCAweDgyLCAweGZhLAorICAweDMxLCAweGYxLCAweDg0LCAweGVlLCAweDNjLCAweGQ0LCAweDk3LCAweGNlLCAweDY2LCAweGRiLCAweGRlLCAweDJkLAorICAweDliLCAweDRkLCAweDlmLCAweDZkLCAweDc4LCAweDU4LCAweDRmLCAweGYzLCAweDIzLCAweDQ4LCAweGQwLCAweDAwLAorICAweDk2LCAweGFlLCAweGU1LCAweGMwLCAweGJmLCAweDlmLCAweGIwLCAweGRlLCAweDdjLCAweDU3LCAweDdmLCAweDc1LAorICAweDVhLCAweGE1LCAweDkxLCAweGQyLCAweGYzLCAweDUyLCAweGFjLCAweGQwLCAweGU5LCAweGM3LCAweDE3LCAweDdiLAorICAweDI2LCAweDA3LCAweDEyLCAweGFlLCAweGI5LCAweDAxLCAweDAwLCAweDg4LCAweDhkLCAweDhkLCAweDk4LCAweGMyLAorICAweDBiLCAweDA3LCAweDYyLCAweDc4LCAweDE4LCAweDQzLCAweDllLCAweGRkLCAweGNmLCAweGNkLCAweGUwLCAweDQxLAorICAweGNmLCAweDE5LCAweDQyLCAweDQ4LCAweDM0LCAweGVhLCAweGE5LCAweGZmLCAweDE5LCAweDU5LCAweGY3LCAweDg3LAorICAweGQyLCAweDExLCAweDc4LCAweDQ3LCAweGJhLCAweDRkLCAweGVkLCAweDkyLCAweGE1LCAweDk2LCAweGNlLCAweGZkLAorICAweDMwLCAweDhhLCAweGY2LCAweDA0LCAweGFlLCAweDZmLCAweDg2LCAweDQ1LCAweGU0LCAweGIyLCAweGU3LCAweGZjLAorICAweDdiLCAweGMzLCAweDYxLCAweDAxLCAweDY2LCAweGIwLCAweGVkLCAweGRmLCAweDJlLCAweDBlLCAweGZjLCAweDAwLAorICAweGE0LCAweDYzLCAweDVjLCAweDJiLCAweGM3LCAweDYxLCAweDMwLCAweDAyLCAweGY1LCAweDY4LCAweDczLCAweDdhLAorICAweDFiLCAweDZiLCAweDZkLCAweDc0LCAweGY3LCAweGZkLCAweGI5LCAweDc1LCAweDk3LCAweGM2LCAweDZmLCAweGMzLAorICAweGEwLCAweDAwLCAweDI1LCAweDJjLCAweGQwLCAweDY0LCAweDE4LCAweGVjLCAweDAwLCAweDMyLCAweDAyLCAweGRlLAorICAweGQwLCAweDc0LCAweDU4LCAweDA4LCAweGEwLCAweDYxLCAweGZkLCAweGM0LCAweDgyLCAweGY1LCAweGRhLCAweGJkLAorICAweDA1LCAweDA1LCAweGY4LCAweDY3LCAweGY1LCAweGIzLCAweGY0LCAweGI5LCAweDM1LCAweDFlLCAweGRmLCAweGM1LAorICAweGM1LCAweDY3LCAweGJkLCAweDQxLCAweDI3LCAweDQ5LCAweDZjLCAweDQzLCAweGFkLCAweDdhLCAweGRjLCAweGZlLAorICAweGExLCAweDlhLCAweGFhLCAweGJmLCAweDlhLCAweDU0LCAweGYyLCAweDdlLCAweDMxLCAweGQ5LCAweGFlLCAweGY2LAorICAweGUzLCAweDA4LCAweGIwLCAweDFlLCAweDRmLCAweDE2LCAweGRmLCAweGJkLCAweGRlLCAweGU4LCAweDAxLCAweDkzLAorICAweDAwLCAweDA1LCAweDQ2LCAweGVlLCAweDIxLCAweDI4LCAweDAwLCAweDRhLCAweDlkLCAweDBjLCAweDA4LCAweDQwLAorICAweDExLCAweDVjLCAweDRhLCAweDU1LCAweGRiLCAweDZiLCAweDc4LCAweGIyLCAweDExLCAweDIyLCAweDdmLCAweGQwLAorICAweDBjLCAweDE5LCAweDEzLCAweGQxLCAweGE5LCAweDczLCAweDhjLCAweDMwLCAweGQyLCAweGI1LCAweDlmLCAweDA4LAorICAweDk0LCAweGZiLCAweGVkLCAweDg2LCAweGQ4LCAweDE1LCAweDI5LCAweDEzLCAweGM5LCAweDc1LCAweDQyLCAweGMzLAorICAweDJjLCAweDBhLCAweDdhLCAweGYwLCAweDA3LCAweDIxLCAweDRjLCAweGNkLCAweDQ2LCAweGRkLCAweDYyLCAweDNhLAorICAweGVhLCAweDMxLCAweDk2LCAweGFhLCAweDIzLCAweDE3LCAweDc4LCAweDcxLCAweDZlLCAweGI4LCAweDI1LCAweDFmLAorICAweGMyLCAweGRkLCAweDNhLCAweDIxLCAweGZkLCAweDI3LCAweGI1LCAweDc5LCAweGQ0LCAweDQxLCAweGZjLCAweDVkLAorICAweDllLCAweDY5LCAweDdhLCAweGIwLCAweGEyLCAweDQzLCAweGM4LCAweDZiLCAweDc3LCAweGQ4LCAweGU2LCAweDI0LAorICAweDI5LCAweDU2LCAweDkxLCAweDkxLCAweDYxLCAweGVhLCAweDM4LCAweDRkLCAweDVmLCAweDlmLCAweDY5LCAweGY1LAorICAweGE1LCAweDliLCAweDg2LCAweDk4LCAweGE1LCAweDU2LCAweDhmLCAweGYzLCAweDBiLCAweGVhLCAweDJmLCAweGYyLAorICAweGVjLCAweDJiLCAweDFjLCAweDQ2LCAweDNkLCAweGY1LCAweGY4LCAweDlhLCAweGNiLCAweDYzLCAweGNiLCAweDdmLAorICAweDA5LCAweDdlLCAweDNkLCAweDk1LCAweDAyLCAweDBjLCAweGRlLCAweGViLCAweDk0LCAweDJlLCAweDk0LCAweDY4LAorICAweGJkLCAweDNhLCAweGY1LCAweDIyLCAweDA5LCAweDU5LCAweDQwLCAweDMxLCAweDBkLCAweGEyLCAweDAzLCAweDA3LAorICAweDBlLCAweGM1LCAweGJlLCAweDNkLCAweGIzLCAweGNiLCAweDMyLCAweGRjLCAweDhhLCAweGQ1LCAweDlhLCAweGRjLAorICAweDVmLCAweDc2LCAweDc4LCAweDRhLCAweDI5LCAweDRjLCAweDk2LCAweDgzLCAweDgyLCAweGViLCAweDQwLCAweGUwLAorICAweGIxLCAweDY5LCAweGU0LCAweDk4LCAweGRkLCAweDNiLCAweDEyLCAweDgwLCAweDhkLCAweDY5LCAweDAyLCAweDc5LAorICAweGFjLCAweDQ4LCAweDlkLCAweDM1LCAweGZmLCAweDdlLCAweGZlLCAweGY3LCAweGViLCAweGFmLCAweGQyLCAweDcxLAorICAweDNjLCAweGFlLCAweDEzLCAweGEyLCAweGE5LCAweGNhLCAweGI2LCAweGVjLCAweGZlLCAweGJkLCAweDAyLCAweGZmLAorICAweGI3LCAweDJkLCAweDdkLCAweDQwLCAweGIwLCAweDRjLCAweDFhLCAweDRjLCAweGUyLCAweGVhLCAweDY1LCAweDY0LAorICAweDNkLCAweDJmLCAweGRlLCAweGZiLCAweGEzLCAweGJjLCAweDY5LCAweDU2LCAweGJiLCAweGQ0LCAweDMyLCAweGJlLAorICAweDdjLCAweDdkLCAweGI2LCAweDM5LCAweDIzLCAweDE3LCAweGM5LCAweGYyLCAweDZiLCAweGI0LCAweGFhLCAweGJjLAorICAweDI5LCAweDM2LCAweDNhLCAweDdhLCAweDI0LCAweDU4LCAweDVkLCAweDAwLCAweDEwLCAweDVjLCAweDQyLCAweDY4LAorICAweDI2LCAweDhhLCAweGIyLCAweDNhLCAweDUyLCAweDI1LCAweDkxLCAweDljLCAweDZiLCAweDRmLCAweDBmLCAweDI1LAorICAweDJmLCAweDJhLCAweDVhLCAweGM5LCAweDRkLCAweDE4LCAweGEzLCAweDNiLCAweDJjLCAweDQ3LCAweGRhLCAweDY2LAorICAweDM4LCAweDBkLCAweGUxLCAweGQ2LCAweGRhLCAweDBkLCAweGIzLCAweDUwLCAweDc4LCAweDQ1LCAweGYxLCAweGM1LAorICAweGYwLCAweDNmLCAweGIyLCAweDlmLCAweDcxLCAweGE2LCAweDlmLCAweGQ5LCAweGMzLCAweGFkLCAweDcxLCAweDRiLAorICAweDNmLCAweDYxLCAweGVjLCAweDc5LCAweDAxLCAweDE1LCAweGYyLCAweGRkLCAweGZiLCAweGU5LCAweDUyLCAweDcwLAorICAweDM4LCAweGNkLCAweGZlLCAweDNiLCAweDAxLCAweGY2LCAweGIwLCAweGUzLCAweDI4LCAweDhkLCAweDI4LCAweDYyLAorICAweDA4LCAweDMyLCAweGRlLCAweDRhLCAweGM4LCAweDljLCAweDA1LCAweDMzLCAweDkxLCAweDVkLCAweDI0LCAweDU0LAorICAweDQ2LCAweDFlLCAweDQ2LCAweGU1LCAweDZmLCAweGVmLCAweGQwLCAweGUyLCAweDY5LCAweDlkLCAweGE3LCAweDIyLAorICAweDZhLCAweGExLCAweGJlLCAweGNiLCAweGU3LCAweGNjLCAweDNmLCAweGVhLCAweGZjLCAweDk3LCAweDA4LCAweDdlLAorICAweDI3LCAweGQ4LCAweDhhLCAweGE3LCAweDRmLCAweDFkLCAweDJlLCAweDkyLCAweDQ2LCAweGQzLCAweDkwLCAweGNhLAorICAweDkwLCAweDNkLCAweGM3LCAweDQzLCAweDkwLCAweDNjLCAweDc5LCAweDFlLCAweDVmLCAweGEzLCAweDZlLCAweDhiLAorICAweDEyLCAweGEyLCAweDhjLCAweGRiLCAweDZhLCAweDVjLCAweGQzLCAweDRjLCAweGJhLCAweDBkLCAweDU4LCAweDM5LAorICAweGMxLCAweDgyLCAweDg2LCAweGQ0LCAweGRlLCAweGZkLCAweGJkLCAweDBjLCAweGY4LCAweGNjLCAweDZkLCAweDM4LAorICAweDg1LCAweDExLCAweDU5LCAweDljLCAweGQyLCAweDhkLCAweDM2LCAweDI1LCAweGU1LCAweDdkLCAweGM5LCAweDU0LAorICAweDM3LCAweDZiLCAweDk0LCAweGI4LCAweDVhLCAweGNlLCAweDg0LCAweDZhLCAweDVlLCAweGI4LCAweGU5LCAweGEyLAorICAweDMzLCAweDE0LCAweGRhLCAweDgwLCAweDQ0LCAweGE0LCAweDgwLCAweGJhLCAweDZiLCAweGRkLCAweDBkLCAweGQ3LAorICAweDU1LCAweDhhLCAweDMxLCAweDQyLCAweDBjLCAweGZkLCAweDBjLCAweDA0LCAweDc5LCAweGNkLCAweDViLCAweGEzLAorICAweDQ4LCAweDYzLCAweDY0LCAweDM4LCAweDIxLCAweDdhLCAweDhjLCAweDAwLCAweDdmLCAweGZmLCAweGZmLCAweGZmLAorICAweDJkLCAweDZkLCAweGE0LCAweGIwLCAweGM4LCAweDgyLCAweGQwLCAweDgyLCAweGEzLCAweDU1LCAweDkyLCAweGI3LAorICAweDdhLCAweDljLCAweDFhLCAweGFkLCAweDAwLCAweDQwLCAweDUwLCAweDEzLCAweDEyLCAweDMyLCAweDFhLCAweGIxLAorICAweGZhLCAweDQ4LCAweDA1LCAweGRmLCAweDViLCAweGZhLCAweGYxLCAweDIxLCAweDQzLCAweGY3LCAweDVhLCAweDg5LAorICAweDE1LCAweDEwLCAweGY3LCAweGQ0LCAweGFjLCAweDBjLCAweDM3LCAweGRjLCAweDFmLCAweDEyLCAweDU2LCAweGE2LAorICAweDhjLCAweGZiLCAweGZkLCAweGI3LCAweDcwLCAweGI3LCAweGRiLCAweDM5LCAweDg5LCAweGQ5LCAweDk4LCAweDVmLAorICAweGJhLCAweGMzLCAweDk0LCAweGI5LCAweDhmLCAweDg4LCAweGMxLCAweGY1LCAweDZlLCAweDQ3LCAweDU3LCAweGFlLAorICAweGQ3LCAweGU3LCAweDMzLCAweGJmLCAweDE3LCAweGQ3LCAweDU4LCAweDdlLCAweDhhLCAweDQ3LCAweGNhLCAweGVkLAorICAweDFkLCAweGU3LCAweDhkLCAweDYxLCAweDM5LCAweGU5LCAweDQ1LCAweDE4LCAweDY5LCAweGVmLCAweDcxLCAweGI2LAorICAweGY4LCAweGIwLCAweDE5LCAweDdmLCAweDJjLCAweGVhLCAweGI3LCAweDg3LCAweGVlLCAweDAzLCAweDE3LCAweGU0LAorICAweDQ5LCAweGRhLCAweDM3LCAweDJhLCAweGMzLCAweGU1LCAweDc3LCAweDA3LCAweDVkLCAweDZlLCAweGQxLCAweGZjLAorICAweDYyLCAweGVhLCAweDQzLCAweGQ5LCAweDBjLCAweDAwLCAweDJhLCAweGFkLCAweDQ5LCAweDQ1LCAweGViLCAweDkxLAorICAweGE2LCAweDU1LCAweDIxLCAweDQwLCAweDkwLCAweDRiLCAweDdhLCAweDRhLCAweDY0LCAweDdjLCAweDkyLCAweDk3LAorICAweGM5LCAweDk0LCAweGUwLCAweGFlLCAweDc4LCAweDQwLCAweDVkLCAweGYwLCAweDlkLCAweDQ1LCAweDdlLCAweDY5LAorICAweDQwLCAweDE1LCAweDY0LCAweDc2LCAweDViLCAweDdhLCAweGIyLCAweDQ5LCAweDY1LCAweGFlLCAweDU2LCAweGMxLAorICAweDExLCAweDk5LCAweDY2LCAweGRkLCAweGQxLCAweDkxLCAweDM4LCAweDAyLCAweGY2LCAweDE1LCAweDg0LCAweGUyLAorICAweDQ2LCAweDE2LCAweDhhLCAweDgwLCAweGY1LCAweDExLCAweGNjLCAweDRjLCAweDU2LCAweGYwLCAweGEyLCAweDYzLAorICAweDhkLCAweDQxLCAweDM3LCAweDZjLCAweDgyLCAweDEwLCAweGMwLCAweDI4LCAweDUxLCAweDhhLCAweDMwLCAweDI2LAorICAweDkxLCAweDZlLCAweGRhLCAweGFlLCAweGFmLCAweGM4LCAweDVkLCAweDhiLCAweDAwLCAweDA5LCAweGJlLCAweDE3LAorICAweGVmLCAweDc3LCAweDQ0LCAweGE1LCAweDBjLCAweDhjLCAweDk4LCAweDg0LCAweDlmLCAweDJjLCAweDk0LCAweDY4LAorICAweDNjLCAweDcxLCAweGRkLCAweDRmLCAweGZkLCAweGE5LCAweDUwLCAweDc1LCAweDMxLCAweDdkLCAweDA3LCAweGQ3LAorICAweGI1LCAweDhlLCAweGZjLCAweGU2LCAweGFmLCAweGE0LCAweGVjLCAweGNlLCAweGUyLCAweDliLCAweDc3LCAweGFlLAorICAweGIyLCAweGU2LCAweDJjLCAweGYzLCAweGFkLCAweDY0LCAweDhiLCAweDU2LCAweDI1LCAweDYwLCAweDI3LCAweDI2LAorICAweGE1LCAweGZiLCAweDY4LCAweDY2LCAweGQ2LCAweGE5LCAweGExLCAweDE5LCAweGEzLCAweDUxLCAweDk1LCAweDk1LAorICAweGNmLCAweGIyLCAweDk1LCAweDZjLCAweDgxLCAweDFhLCAweDJkLCAweDMxLCAweDRlLCAweDJhLCAweDZkLCAweDQwLAorICAweGQwLCAweGFmLCAweDBiLCAweGQ4LCAweDFhLCAweDI0LCAweGI2LCAweDk3LCAweDU4LCAweGIwLCAweDNhLCAweGMwLAorICAweDEwLCAweGFhLCAweDc1LCAweDIyLCAweDEzLCAweDg4LCAweDAwLCAweDBjLCAweDQ4LCAweGU1LCAweDM2LCAweDgxLAorICAweDI4LCAweDYxLCAweDQyLCAweDAxLCAweGMxLCAweDMwLCAweGFmLCAweDcyLCAweGY2LCAweGM5LCAweGE2LCAweDgwLAorICAweDgyLCAweGY2LCAweGEyLCAweDg5LCAweDRjLCAweDk2LCAweGJiLCAweDY3LCAweDQwLCAweDM0LCAweGFkLCAweDgyLAorICAweDAxLCAweDg3LCAweDI0LCAweDAzLCAweDA3LCAweDIxLCAweDFhLCAweDk0LCAweGI1LCAweGNlLCAweDhhLCAweGMyLAorICAweDIzLCAweDIwLCAweDQ4LCAweDY4LCAweDMyLCAweDE5LCAweDg1LCAweGY0LCAweDUxLCAweDBhLCAweDQ1LCAweGFmLAorICAweDg0LCAweGI4LCAweDQwLCAweDAxLCAweDgzLCAweDYwLCAweGRiLCAweDgxLCAweGQwLCAweGQzLCAweDFjLCAweGFlLAorICAweDIyLCAweDMwLCAweDUxLCAweDUwLCAweGMwLCAweDk5LCAweDE3LCAweDI2LCAweDk3LCAweGUwLCAweDI1LCAweDYxLAorICAweDdlLCAweGY0LCAweDk4LCAweDhiLCAweDUyLCAweGEzLCAweDkyLCAweGJlLCAweDVhLCAweDViLCAweDM3LCAweGRhLAorICAweGIzLCAweDY2LCAweDY4LCAweGJjLCAweGYzLCAweDJkLCAweDM3LCAweDdiLCAweGZmLCAweGRhLCAweDdiLCAweGU3LAorICAweGViLCAweDI2LCAweDM4LCAweDdlLCAweDY5LCAweDJlLCAweDFmLCAweGY4LCAweDVkLCAweDMxLCAweDVmLCAweGY3LAorICAweGU3LCAweDQ5LCAweDNhLCAweDc0LCAweDVlLCAweDliLCAweGM3LCAweDUyLCAweDk4LCAweDJlLCAweDFmLCAweDE4LAorICAweGExLCAweDBmLCAweDljLCAweDJjLCAweDcxLCAweDdjLCAweGQ3LCAweDc1LCAweGQ5LCAweDM2LCAweDk4LCAweGJhLAorICAweGQ3LCAweDE0LCAweGU2LCAweGZhLCAweDQ3LCAweDFjLCAweDY2LCAweGFmLCAweDk1LCAweDkwLCAweGI2LCAweDZmLAorICAweGY0LCAweGJkLCAweDdkLCAweDBmLCAweGFhLCAweGU4LCAweDNhLCAweGFmLCAweDM4LCAweGRhLCAweGNlLCAweGU4LAorICAweGMyLCAweGIyLCAweGYzLCAweGRhLCAweDc2LCAweGE1LCAweDQzLCAweGQzLCAweDBhLCAweDIxLCAweDg4LCAweDM0LAorICAweDQ0LCAweDAyLCAweDZiLCAweDkwLCAweDE1LCAweDI5LCAweDQ5LCAweDc2LCAweGNjLCAweGZhLCAweDYwLCAweDY4LAorICAweDg5LCAweGZkLCAweDdkLCAweGUzLCAweGFkLCAweGEwLCAweGFkLCAweDg1LCAweGEyLCAweDJiLCAweGIyLCAweDUyLAorICAweDM0LCAweDQyLCAweDc4LCAweGI5LCAweDM2LCAweDRkLCAweDAyLCAweDkwLCAweGNlLCAweGMzLCAweDk1LCAweGJkLAorICAweDc5LCAweDc1LCAweDllLCAweDFlLCAweGRkLCAweDk0LCAweDcyLCAweGQzLCAweDYxLCAweGNhLCAweDgxLCAweGU0LAorICAweGQ5LCAweDc2LCAweGQ2LCAweGQ5LCAweGQxLCAweGU0LCAweDY4LCAweGQxLCAweGZhLCAweDM0LCAweDQ5LCAweDZiLAorICAweGZkLCAweGFlLCAweDVhLCAweDk0LCAweGQ2LCAweDM2LCAweDk0LCAweGY0LCAweDIwLCAweDA2LCAweDQwLCAweDNlLAorICAweDZlLCAweDc1LCAweDg1LCAweDhjLCAweGFkLCAweGFhLCAweGM0LCAweDI2LCAweDMzLCAweGQ1LCAweDliLCAweDNmLAorICAweDUzLCAweDAyLCAweGU5LCAweGIyLCAweGMyLCAweGFjLCAweDA1LCAweGE1LCAweDhjLCAweDM5LCAweDRiLCAweDhhLAorICAweDkzLCAweGQyLCAweGMyLCAweGRmLCAweDI0LCAweDkyLCAweDJjLCAweDEyLCAweDVlLCAweDM1LCAweDc2LCAweGZiLAorICAweGExLCAweGU1LCAweDZjLCAweDJlLCAweDk2LCAweGJhLCAweDBlLCAweGJiLCAweDFkLCAweGRlLCAweDAwLCAweDEzLAorICAweDU2LCAweDg4LCAweDQyLCAweDE4LCAweDVlLCAweDAyLCAweDExLCAweGJhLCAweGEzLCAweDM4LCAweDY1LCAweGNhLAorICAweGFiLCAweDYwLCAweGUxLCAweDcxLCAweGQzLCAweDg0LCAweDE1LCAweDJhLCAweGFlLCAweDgwLCAweGMzLCAweDhjLAorICAweDgyLCAweDc0LCAweDg3LCAweGU0LCAweGIyLCAweDEzLCAweGU3LCAweGUxLCAweGViLCAweDdlLCAweDkyLCAweGNhLAorICAweDdjLCAweDA2LCAweDExLCAweGU5LCAweDk1LCAweDU3LCAweDU0LCAweGZjLCAweGFmLCAweDYzLCAweGJmLCAweDEzLAorICAweGExLCAweDg2LCAweGVlLCAweDZlLCAweDE0LCAweGUwLCAweDhhLCAweGIyLCAweDBjLCAweDlkLCAweGQzLCAweGVkLAorICAweDBjLCAweGY4LCAweDE5LCAweDZlLCAweDMxLCAweDlmLCAweDIwLCAweDAyLCAweDNkLCAweGQwLCAweGI3LCAweDM1LAorICAweGZjLCAweGYyLCAweGVmLCAweDFjLCAweGE4LCAweDEyLCAweDY5LCAweDFhLCAweDJmLCAweGNmLCAweDFmLCAweGE4LAorICAweGI4LCAweDU0LCAweGIwLCAweDY5LCAweDQ5LCAweDMxLCAweDUzLCAweDhmLCAweGM0LCAweGU4LCAweDAxLCAweGIxLAorICAweDk2LCAweGQwLCAweGQyLCAweGM3LCAweGQwLCAweGRhLCAweGIxLCAweDUyLCAweGI0LCAweDAwLCAweDIwLCAweDM2LAorICAweGQ1LCAweDM5LCAweDQ1LCAweDI4LCAweDg4LCAweGQ2LCAweGUwLCAweDg4LCAweDBhLCAweGZiLCAweGEzLCAweGE4LAorICAweDI1LCAweDExLCAweDY0LCAweDBhLCAweDVjLCAweDE0LCAweDcwLCAweDBlLCAweDIxLCAweDFhLCAweDk0LCAweGJkLAorICAweGQ2LCAweDA3LCAweDQxLCAweDIxLCAweDhiLCAweDgzLCAweDdiLCAweGVhLCAweGVmLCAweDdhLCAweDU0LCAweDY1LAorICAweDc0LCAweDI3LCAweDk2LCAweDk3LCAweDQwLCAweDAwLCAweDBjLCAweGUzLCAweDk1LCAweDg5LCAweGZhLCAweDlmLAorICAweGQ2LCAweGY1LCAweGZmLCAweDc3LCAweDhlLCAweGI1LCAweDBlLCAweDFkLCAweDFlLCAweGJkLCAweGU0LCAweDRhLAorICAweDcyLCAweGYyLCAweGRlLCAweDdkLCAweDY5LCAweDFkLCAweDcxLCAweDk2LCAweGE3LCAweGE3LCAweGE3LCAweGJjLAorICAweDQ1LCAweGQ5LCAweGQ2LCAweDEzLCAweGM1LCAweDUzLCAweDk4LCAweDkyLCAweDY0LCAweDk4LCAweGNmLCAweDdmLAorICAweGM2LCAweGVmLCAweDFkLCAweDExLCAweDk2LCAweGEwLCAweGJmLCAweDBmLCAweGEzLCAweDViLCAweGQxLCAweDFkLAorICAweGE5LCAweGExLCAweGY5LCAweDVlLCAweGRhLCAweGZiLCAweDhmLCAweDMwLCAweGI5LCAweDczLCAweDk0LCAweGRkLAorICAweDlhLCAweDMxLCAweDFkLCAweDZkLCAweDNhLCAweDEzLCAweDMwLCAweDkxLCAweDVhLCAweDdmLCAweDlkLCAweGY1LAorICAweDY0LCAweDc2LCAweDI0LCAweDJhLCAweDAzLCAweGIwLCAweGIxLCAweDZiLCAweDI1LCAweDNjLCAweDVmLCAweDQwLAorICAweDk4LCAweDI2LCAweDg3LCAweDE3LCAweGI0LCAweDMxLCAweGY4LCAweDk0LCAweGZjLCAweGM5LCAweGNhLCAweDU5LAorICAweDMzLCAweDUyLCAweDYxLCAweDg2LCAweGUyLCAweGE5LCAweGI2LCAweGQyLCAweDE0LCAweDUyLCAweDk3LCAweGFhLAorICAweDE2LCAweDRlLCAweDJkLCAweDVlLCAweGY5LCAweDVhLCAweDgzLCAweDY0LCAweDAxLCAweGIwLCAweDgyLCAweDQzLAorICAweDQ2LCAweDgyLCAweDYzLCAweDc4LCAweGY2LCAweGU3LCAweDgxLCAweDBlLCAweDRiLCAweDMxLCAweGQ2LCAweDc0LAorICAweGU4LCAweGY5LCAweGYyLCAweDZlLCAweDY5LCAweDlmLCAweDJhLCAweGQ4LCAweDBhLCAweDQzLCAweDM0LCAweDM5LAorICAweGMzLCAweDRiLCAweGJhLCAweDk4LCAweDQ4LCAweDQyLCAweDQ5LCAweDQzLCAweDNiLCAweDk4LCAweDQ3LCAweDZlLAorICAweDkxLCAweDMyLCAweDkyLCAweDQ1LCAweDI0LCAweGU0LCAweGJkLCAweGE2LCAweGI5LCAweDY1LCAweDU3LCAweDUxLAorICAweDNiLCAweDJhLCAweDRlLCAweGM3LCAweDBhLCAweDc5LCAweDM0LCAweDE1LCAweGM3LCAweGIxLCAweGI3LCAweDliLAorICAweDlhLCAweDE0LCAweDQ3LCAweDcwLCAweDRjLCAweDVhLCAweDE4LCAweGU2LCAweDgwLCAweDE4LCAweGMwLCAweDkyLAorICAweGExLCAweDQ1LCAweDVlLCAweGVjLCAweDg3LCAweDQ5LCAweGY4LCAweDE2LCAweDJkLCAweGM4LCAweDA0LCAweDYyLAorICAweGU2LCAweDc2LCAweGQzLCAweDVjLCAweDM2LCAweDRkLCAweDI2LCAweGU0LCAweGEzLCAweDZhLCAweGRlLCAweDY5LAorICAweGZjLCAweDk3LCAweGQ0LCAweDc5LCAweGUxLCAweGNhLCAweGFhLCAweGMzLCAweGQ2LCAweGIzLCAweDMwLCAweGNlLAorICAweGI4LCAweGQ1LCAweDA3LCAweGJlLCAweDgyLCAweDdhLCAweDYwLCAweDIwLCAweDM1LCAweGM4LCAweDZlLCAweDFkLAorICAweDhlLCAweGQ3LCAweGRmLCAweDVkLCAweGI1LCAweDEyLCAweDk1LCAweDcwLCAweDY1LCAweGU1LCAweDI5LCAweDMwLAorICAweDg3LCAweGUyLCAweGVmLCAweDUwLCAweDAyLCAweGViLCAweGM2LCAweGYwLCAweGRlLCAweDBiLCAweDNmLCAweGRjLAorICAweDY5LCAweDA4LCAweDZlLCAweGMwLCAweDAwLCAweDg0LCAweGIyLCAweDU2LCAweDc1LCAweGRmLCAweGE2LCAweGI1LAorICAweDgwLCAweGYxLCAweDNkLCAweGRjLCAweDdjLCAweDc5LCAweDJiLCAweDZhLCAweDgwLCAweDA3LCAweGI4LCAweDJhLAorICAweDA5LCAweGNiLCAweDYzLCAweDI4LCAweGRhLCAweDAwLCAweDE0LCAweGMyLCAweDAwLCAweDM4LCAweDIxLCAweDFhLAorICAweDk0LCAweGE1LCAweGQyLCAweDBhLCAweDgxLCAweDE4LCAweDAyLCAweGFhLCAweDI2LCAweDk1LCAweDg4LCAweDM4LAorICAweDVkLCAweGNkLCAweDAwLCAweDAwLCAweDA3LCAweGZmLCAweGM0LCAweGNkLCAweDNiLCAweDI3LCAweDhlLCAweGNkLAorICAweDQ5LCAweDMwLCAweDBmLCAweDFlLCAweDE2LCAweGQzLCAweDZmLCAweDEyLCAweGUxLCAweGZlLCAweDI1LCAweGI5LAorICAweGJlLCAweGU3LCAweDQwLCAweDExLCAweDJiLCAweGVkLCAweGE1LCAweGRiLCAweDczLCAweGQzLCAweDk5LCAweGJlLAorICAweDBkLCAweGEzLCAweDdkLCAweDcxLCAweDRhLCAweGQxLCAweDEzLCAweDVlLCAweDVjLCAweGE1LCAweDY2LCAweGZhLAorICAweGY2LCAweDk2LCAweDllLCAweGUwLCAweDZmLCAweDdkLCAweGE1LCAweDhlLCAweGY5LCAweDJmLCAweGI1LCAweDE4LAorICAweDEyLCAweDQxLCAweGE0LCAweDNlLCAweGVhLCAweGM1LCAweGE1LCAweGUxLCAweDc0LCAweDdmLCAweGQ1LCAweGZjLAorICAweDA3LCAweGQwLCAweDI0LCAweDU3LCAweDVjLCAweDY3LCAweDU3LCAweGNkLCAweDk4LCAweGI2LCAweGMzLCAweGQyLAorICAweDY3LCAweDY1LCAweDQwLCAweDU5LCAweDVjLCAweDE5LCAweDhhLCAweDc5LCAweDc3LCAweDVjLCAweGZiLCAweDFlLAorICAweDM3LCAweDM3LCAweGViLCAweDVmLCAweGIyLCAweDk2LCAweDM0LCAweDlmLCAweDY1LCAweGZmLCAweGQwLCAweGVmLAorICAweDhhLCAweDIxLCAweDRhLCAweDVjLCAweDc1LCAweDQ5LCAweDU5LCAweDc2LCAweGViLCAweDBkLCAweDM3LCAweGUzLAorICAweGRkLCAweGVmLCAweDE1LCAweDZjLCAweDgwLCAweGU4LCAweGQzLCAweDYxLCAweGM1LCAweGFlLCAweDBmLCAweGRmLAorICAweGQwLCAweDQxLCAweDhkLCAweDM5LCAweGJlLCAweDljLCAweDJkLCAweDdkLCAweDliLCAweDJmLCAweDFkLCAweDBhLAorICAweGQzLCAweGRlLCAweDlkLCAweGI5LCAweGNiLCAweDdlLCAweDk5LCAweDVlLCAweDNjLCAweGQxLCAweDFiLCAweDZkLAorICAweDZhLCAweDljLCAweGQ2LCAweDA3LCAweGU3LCAweDYzLCAweDQ1LCAweGYwLCAweDU0LCAweDc2LCAweDJiLCAweGJjLAorICAweDY1LCAweDRlLCAweDk2LCAweDJkLCAweDQzLCAweDM0LCAweDU3LCAweDllLCAweDc1LCAweDk5LCAweDI0LCAweGJkLAorICAweGVmLCAweDM4LCAweGVmLCAweDQyLCAweDFmLCAweDZlLCAweGFjLCAweDJkLCAweGRhLCAweDZmLCAweDllLCAweGYwLAorICAweGJkLCAweGQ3LCAweDhjLCAweDMxLCAweGUxLCAweDdjLCAweDI2LCAweDAxLCAweDMzLCAweDZiLCAweDYxLCAweGFhLAorICAweDgwLCAweDYyLCAweGQwLCAweDEyLCAweDU0LCAweGI4LCAweGI1LCAweDRhLCAweDZjLCAweDFjLCAweDNjLCAweDlmLAorICAweDAwLCAweGQzLCAweDI4LCAweDA4LCAweDM2LCAweDQ1LCAweGM0LCAweGUyLCAweDEwLCAweGY4LCAweGEzLCAweGU4LAorICAweGZjLCAweDQzLCAweDIzLCAweGQzLCAweDdlLCAweGQ5LCAweDc5LCAweDMxLCAweGM3LCAweDhkLCAweGFkLCAweGI2LAorICAweDcyLCAweGFhLCAweGM5LCAweDY5LCAweGYyLCAweGFhLCAweGM3LCAweDg0LCAweDkzLCAweGRiLCAweGIzLCAweDg5LAorICAweDU2LCAweGM0LCAweDM3LCAweGYxLCAweGYxLCAweGU0LCAweGQwLCAweDBiLCAweGNkLCAweDZlLCAweDI4LCAweDBhLAorICAweDY3LCAweDViLCAweDg5LCAweDkwLCAweGVlLCAweGJjLCAweDVlLCAweDVhLCAweGRjLCAweDkzLCAweDE3LCAweDI4LAorICAweDU4LCAweDBiLCAweDFjLCAweGQ5LCAweDk0LCAweGRjLCAweDg5LCAweDM4LCAweDIyLCAweDAyLCAweDE0LCAweDFjLAorICAweGRiLCAweGNiLCAweGM5LCAweDA5LCAweDQxLCAweDEwLCAweGJmLCAweDVkLCAweDk1LCAweGE3LCAweGU3LCAweDY1LAorICAweDkyLCAweGQ2LCAweGEwLCAweDU0LCAweGFhLCAweDk2LCAweDJkLCAweDYwLCAweDEwLCAweGIwLCAweDAwLCAweDFhLAorICAweGUwLCAweDcwLCAweDIxLCAweDFhLCAweDk0LCAweGQ1LCAweGNlLCAweDg3LCAweDAzLCAweDQwLCAweDkxLCAweDk0LAorICAweDgyLCAweDYxLCAweDVkLCAweDE2LCAweDlhLCAweDE1LCAweDQyLCAweDVkLCAweGRkLCAweGFkLCAweDAwLCAweDRjLAorICAweDBiLCAweDEyLCAweDc4LCAweGI2LCAweDI2LCAweGU3LCAweGNhLCAweGUzLCAweGQwLCAweDI2LCAweDNjLCAweGJmLAorICAweGE5LCAweDM0LCAweDM3LCAweGU0LCAweDMzLCAweGVjLCAweDg5LCAweDRkLCAweDNiLCAweDYyLCAweDM0LCAweGY3LAorICAweDI1LCAweGU2LCAweGRlLCAweGMyLCAweGQyLCAweDFkLCAweDkzLCAweGYzLCAweDUxLCAweGNmLCAweDk1LCAweDZjLAorICAweDllLCAweDliLCAweGZkLCAweDVmLCAweDgzLCAweDZiLCAweDZlLCAweDI4LCAweDZlLCAweDM4LCAweGY4LCAweDk1LAorICAweDdmLCAweDcyLCAweGE5LCAweGU2LCAweGJlLCAweGRkLCAweGYxLCAweDljLCAweDc3LCAweGQ4LCAweDE5LCAweDAwLAorICAweDNjLCAweGJkLCAweDRiLCAweDY1LCAweDUwLCAweDdlLCAweGQzLCAweDNjLCAweDZiLCAweDllLCAweDY3LCAweGUyLAorICAweGRlLCAweDc0LCAweGU2LCAweDlkLCAweDZkLCAweGU3LCAweDNlLCAweDIxLCAweDU0LCAweDVlLCAweDlmLCAweGEzLAorICAweDY0LCAweDZjLCAweGFmLCAweGUxLCAweGRiLCAweDBiLCAweGI1LCAweGQ5LCAweDM5LCAweGM0LCAweDlmLCAweDI5LAorICAweGRiLCAweGYyLCAweGRiLCAweGU5LCAweDM4LCAweGM4LCAweGVjLCAweDRlLCAweGQyLCAweDY1LCAweGQyLCAweGQzLAorICAweDUxLCAweGUwLCAweDlkLCAweDI0LCAweGM4LCAweGM2LCAweDQ0LCAweDAyLCAweDI5LCAweDhlLCAweDM4LCAweGVmLAorICAweGI1LCAweDg2LCAweDFjLCAweGYwLCAweDllLCAweDdhLCAweDY0LCAweDAwLCAweDkxLCAweDIzLCAweGY2LCAweDkwLAorICAweGFhLCAweDdjLCAweDk2LCAweGY2LCAweDMxLCAweDQ1LCAweGViLCAweDFkLCAweDRiLCAweGZiLCAweGU5LCAweDY2LAorICAweDNjLCAweGNmLCAweDQyLCAweGE2LCAweDk3LCAweDM5LCAweDliLCAweDU4LCAweDc5LCAweDY0LCAweDFkLCAweDAzLAorICAweDI5LCAweDViLCAweDY4LCAweGVkLCAweDEzLCAweDI0LCAweDFhLCAweGE1LCAweDdjLCAweDNiLCAweGNjLCAweGEzLAorICAweGEzLCAweDA4LCAweDUzLCAweDczLCAweDZiLCAweDI4LCAweDQ2LCAweGI3LCAweDkyLCAweDQ5LCAweDMwLCAweDYxLAorICAweDY4LCAweDI3LCAweDM0LCAweDk1LCAweDQ5LCAweDE5LCAweGNhLCAweDM2LCAweDg4LCAweGE1LCAweDEwLCAweDIxLAorICAweDM4LCAweGUwLCAweDU4LCAweGM3LCAweGY2LCAweDliLCAweGU0LCAweDc1LCAweDY2LCAweGE1LCAweDFkLCAweGFmLAorICAweDhmLCAweGFhLCAweDA4LCAweGVjLCAweGJlLCAweDBmLCAweDBkLCAweDNjLCAweGJmLCAweGVmLCAweDZlLCAweDgwLAorICAweDk5LCAweGE3LCAweDMwLCAweDkwLCAweGMyLCAweDIwLCAweDEwLCAweGMxLCAweDY4LCAweGRlLCAweGEyLCAweGI4LAorICAweGIzLCAweGMwLCAweDY5LCAweGQzLCAweDVkLCAweDBiLCAweDAyLCAweDgwLCAweDczLCAweGJiLCAweGVlLCAweGUzLAorICAweGVkLCAweDc1LCAweGUyLCAweDZkLCAweDU0LCAweDcyLCAweDdmLCAweDU3LCAweGNlLCAweDJmLCAweDM2LCAweGYzLAorICAweDNkLCAweDUyLCAweGE1LCAweDRhLCAweGYxLCAweDYzLCAweDMzLCAweDk3LCAweGQzLCAweDNhLCAweDdiLCAweDdmLAorICAweGQ4LCAweGJlLCAweGYzLCAweDc5LCAweGUyLCAweDc5LCAweDc3LCAweDFhLCAweGQ3LCAweDY4LCAweDZkLCAweGY2LAorICAweDYyLCAweDliLCAweDg1LCAweDRiLCAweDMzLCAweDJjLCAweDAyLCAweDUwLCAweDJmLCAweDg0LCAweGQwLCAweDU2LAorICAweGJjLCAweDI2LCAweGE1LCAweGYwLCAweDkyLCAweDZkLCAweDc0LCAweDc4LCAweGQ5LCAweDY1LCAweDE5LCAweDI2LAorICAweGI4LCAweGE0LCAweDdiLCAweGFkLCAweDE5LCAweDEwLCAweDk4LCAweDA0LCAweGMwLCAweDZhLCAweDE1LCAweDQzLAorICAweGY3LCAweDAwLCAweGEyLCAweDJlLCAweDcwLCAweDljLCAweGE4LCAweDBiLCAweGQyLCAweDBiLCAweDk1LCAweDIxLAorICAweDE0LCAweDRiLCAweGMxLCAweDQ4LCAweDVmLCAweDkyLCAweDdhLCAweDQyLCAweDcyLCAweGEyLCAweGIwLCAweDdhLAorICAweDI2LCAweDAyLCAweDkxLCAweDgwLCAweDE5LCAweDdlLCAweDY2LCAweDQwLCAweDM4LCAweDIxLCAweDFhLCAweDk0LAorICAweGI1LCAweGNlLCAweDg2LCAweGMzLCAweDQyLCAweDBiLCAweDQ4LCAweDE3LCAweDIyLCAweGE4LCAweDA5LCAweDdjLAorICAweDJlLCAweDY4LCAweDAwLCAweDAwLCAweDYzLCAweDhjLCAweDk4LCAweDJhLCAweGQ0LCAweGNlLCAweDZmLCAweGU4LAorICAweGUwLCAweGU4LCAweGMxLCAweDgzLCAweDQwLCAweDk5LCAweGJlLCAweGIzLCAweDdmLCAweGUyLCAweGJhLCAweGM0LAorICAweDExLCAweDdmLCAweGNlLCAweGQ4LCAweDc0LCAweDc3LCAweGI0LCAweGVjLCAweDhjLCAweGNkLCAweDk4LCAweGUyLAorICAweDVlLCAweDVlLCAweDFmLCAweDUxLCAweGYwLCAweDc1LCAweDZlLCAweGE4LCAweGQyLCAweGFlLCAweDQ4LCAweDI2LAorICAweGJiLCAweDU3LCAweDlkLCAweDAxLCAweDMxLCAweGZkLCAweDY3LCAweDJlLCAweGZkLCAweDI3LCAweGNjLCAweDljLAorICAweDVkLCAweGZiLCAweDMzLCAweDI3LCAweDE2LCAweGU5LCAweDljLCAweDgyLCAweDFmLCAweGIwLCAweDcwLCAweDRjLAorICAweGE1LCAweDkzLCAweDQ1LCAweGUxLCAweDU2LCAweDk2LCAweGI4LCAweDNiLCAweGYzLCAweDY0LCAweDdmLCAweDliLAorICAweGQyLCAweGZkLCAweDY3LCAweDMwLCAweGVjLCAweDBmLCAweDhhLCAweGI5LCAweDRlLCAweDdhLCAweDhlLCAweDdiLAorICAweGMxLCAweDczLCAweGY5LCAweGVlLCAweDRmLCAweDVkLCAweDgyLCAweDg3LCAweGFiLCAweGE5LCAweGQ3LCAweDMxLAorICAweGYyLCAweDUyLCAweDk0LCAweDI5LCAweDk3LCAweDFiLCAweGE4LCAweDAyLCAweDM5LCAweDk2LCAweGFiLCAweGE3LAorICAweDUwLCAweGYwLCAweDdmLCAweDQ3LCAweDg3LCAweDlmLCAweGE4LCAweDdmLCAweDM0LCAweGIyLCAweGMyLCAweDBmLAorICAweDE3LCAweGY4LCAweDRhLCAweDE1LCAweGI0LCAweDYzLCAweDQyLCAweGNlLCAweGVlLCAweGE2LCAweDIxLCAweGNiLAorICAweDIxLCAweDRmLCAweDJkLCAweGFjLCAweGE2LCAweGM4LCAweDg2LCAweDU2LCAweDY3LCAweGUxLCAweDcwLCAweGYxLAorICAweGIyLCAweDhmLCAweGY1LCAweGZlLCAweDZjLCAweDcwLCAweGYwLCAweGVkLCAweGNjLCAweGVlLCAweDI1LCAweDlhLAorICAweDU4LCAweDdiLCAweGMyLCAweGQ3LCAweDgxLCAweDM3LCAweDMxLCAweDFmLCAweGUzLCAweGJhLCAweDUxLCAweDcxLAorICAweGI1LCAweDE0LCAweDk2LCAweGRmLCAweDU2LCAweDYxLCAweDI3LCAweGIwLCAweDBhLCAweGIyLCAweDhkLCAweGI3LAorICAweGM5LCAweDc0LCAweDViLCAweGE1LCAweDQ5LCAweDJlLCAweGE2LCAweGJmLCAweDdjLCAweDIzLCAweGU4LCAweGE3LAorICAweGY2LCAweGE1LCAweGUzLCAweGI2LCAweDAxLCAweDJmLCAweDY4LCAweDgzLCAweDgxLCAweDA0LCAweDQ4LCAweDIxLAorICAweDA4LCAweDA4LCAweDYwLCAweGIyLCAweDBjLCAweDkyLCAweGEwLCAweDdiLCAweDViLCAweDhlLCAweDI4LCAweGFiLAorICAweDE4LCAweDIwLCAweDJhLCAweGIwLCAweDcwLCAweGQ3LCAweDEzLCAweDdlLCAweDM5LCAweGJlLCAweDNiLCAweDA2LAorICAweDZmLCAweGVhLCAweGUzLCAweGY3LCAweDQwLCAweGY4LCAweGNkLCAweDkzLCAweDE0LCAweDFjLCAweDMzLCAweGY3LAorICAweDBhLCAweGQxLCAweGE0LCAweGQ2LCAweGNlLCAweDE0LCAweDZjLCAweGIzLCAweGI2LCAweGQ1LCAweGVjLCAweDA2LAorICAweDI1LCAweDljLCAweDIyLCAweDI2LCAweDI4LCAweDgxLCAweDY5LCAweGZkLCAweDQ2LCAweDhjLCAweDA1LCAweGFmLAorICAweDVlLCAweDgxLCAweGZjLCAweGFhLCAweGViLCAweDI4LCAweDgxLCAweDE4LCAweDM4LCAweDNjLCAweDM0LCAweGMzLAorICAweGY5LCAweGVjLCAweDAyLCAweGQ4LCAweDgwLCAweDgwLCAweDU4LCAweDA1LCAweDRhLCAweGE1LCAweDAyLCAweGQwLAorICAweDRjLCAweDk0LCAweDEyLCAweDU2LCAweGI2LCAweDgyLCAweDIwLCAweDAxLCAweDFiLCAweDQwLCAweDQyLCAweDQxLAorICAweDQxLCAweDIzLCAweGY4LCAweGJjLCAweDkwLCAweDk0LCAweDZlLCAweDNmLCAweDdmLCAweGFjLCAweDZkLCAweGEzLAorICAweGMwLCAweDVhLCAweDc5LCAweDE1LCAweDBlLCAweDIxLCAweDFhLCAweDk0LCAweGRkLCAweGNlLCAweDg5LCAweDYzLAorICAweGExLCAweGExLCAweDk4LCAweDI0LCAweDYyLCAweDRiLCAweDU2LCAweDcwLCAweGI2LCAweDQ2LCAweGVjLCAweGQ1LAorICAweGY0LCAweGU5LCAweGFiLCAweDliLCAweGEwLCAweDkzLCAweDAwLCAweDFjLCAweDFlLCAweGIzLCAweGU5LCAweGI2LAorICAweGU4LCAweGI3LCAweDQ3LCAweGU3LCAweGZjLCAweDRiLCAweDBlLCAweGZhLCAweDg1LCAweDA2LCAweDFhLCAweDgwLAorICAweDNhLCAweGZmLCAweGYxLCAweDdmLCAweDZiLCAweDU4LCAweDg4LCAweGNjLCAweGUwLCAweDcxLCAweDQxLCAweGUxLAorICAweDU5LCAweDdhLCAweDg4LCAweDI3LCAweGE3LCAweGY2LCAweDA2LCAweDA2LCAweDBhLCAweDdhLCAweGMyLCAweGY3LAorICAweDZjLCAweDI2LCAweDUwLCAweDA3LCAweGEzLCAweGZkLCAweDkzLCAweGE3LCAweGZmLCAweDNkLCAweGY4LCAweDVmLAorICAweDFmLCAweGVlLCAweDhjLCAweGQxLCAweGNjLCAweGY5LCAweGZmLCAweDI0LCAweDY5LCAweGI5LCAweDE5LCAweDY0LAorICAweDg5LCAweDQ0LCAweDQ5LCAweDAxLCAweGMwLCAweDUxLCAweGY5LCAweDdmLCAweDVjLCAweGYyLCAweDNjLCAweGMyLAorICAweDhhLCAweDFmLCAweGU2LCAweDU5LCAweDczLCAweGFiLCAweGI5LCAweGIyLCAweDFiLCAweGFiLCAweGFlLCAweDdiLAorICAweGM3LCAweGU1LCAweDYxLCAweGIzLCAweGJkLCAweDQwLCAweGQyLCAweDk0LCAweDk4LCAweDllLCAweDg1LCAweDY1LAorICAweDQ3LCAweGU4LCAweGE0LCAweDM3LCAweDdmLCAweDYwLCAweGU1LCAweGZhLCAweDBkLCAweDVhLCAweDc2LCAweGJjLAorICAweGQ2LCAweDA4LCAweGI5LCAweDRiLCAweGFlLCAweDM2LCAweDJkLCAweGZhLCAweGVhLCAweDgwLCAweGU4LCAweDhlLAorICAweGUzLCAweGY0LCAweDBkLCAweDZmLCAweGZlLCAweGRkLCAweDZkLCAweGZlLCAweDVmLCAweGZmLCAweGIyLCAweGE4LAorICAweGJmLCAweDRkLCAweDY4LCAweDg3LCAweDhlLCAweDAzLCAweGE2LCAweGZiLCAweDUzLCAweGM1LCAweGZhLCAweGEzLAorICAweGEwLCAweGFhLCAweDUwLCAweDdlLCAweGRiLCAweGUwLCAweDdhLCAweDViLCAweGY2LCAweDc4LCAweDY2LCAweGM3LAorICAweGE0LCAweDM1LCAweDNlLCAweDg1LCAweGNkLCAweDU5LCAweDg3LCAweGUzLCAweGIzLCAweDVjLCAweDE2LCAweDFkLAorICAweGE1LCAweGViLCAweDFiLCAweGFmLCAweDZiLCAweGI5LCAweDk2LCAweDQ2LCAweGQ5LCAweGIxLCAweGU4LCAweDFhLAorICAweDlmLCAweGQyLCAweGVkLCAweGRiLCAweDZkLCAweDdhLCAweGEzLCAweDY0LCAweGM1LCAweGRjLCAweDIzLCAweGE0LAorICAweDZiLCAweGQzLCAweDUyLCAweDJiLCAweDUwLCAweGU0LCAweGM4LCAweGMxLCAweDkyLCAweDU5LCAweDBlLCAweDVjLAorICAweDIxLCAweGNkLCAweGFiLCAweDJkLCAweDUyLCAweDNkLCAweDJjLCAweGFmLCAweGVjLCAweGI1LCAweDg4LCAweGRkLAorICAweGNlLCAweDMyLCAweGY3LCAweDgzLCAweDFmLCAweGQyLCAweDhhLCAweGQ4LCAweGYyLCAweDIzLCAweGJjLCAweGQ4LAorICAweGNmLCAweDhjLCAweGJjLCAweGE5LCAweDgxLCAweGQxLCAweDM0LCAweDk3LCAweGQ3LCAweGUyLCAweGQ1LCAweDAyLAorICAweDdhLCAweGRmLCAweDU5LCAweDNmLCAweGExLCAweDgxLCAweDBiLCAweGZkLCAweDY2LCAweDlhLCAweGNlLCAweDc5LAorICAweDI5LCAweGYyLCAweDZiLCAweGFlLCAweGNkLCAweDE4LCAweDM1LCAweGI3LCAweGRjLCAweGZmLCAweGFhLCAweDhlLAorICAweDYxLCAweDIwLCAweDE3LCAweDFjLCAweGJlLCAweDQwLCAweDA2LCAweDgyLCAweDQ4LCAweGJjLCAweGUxLCAweGIzLAorICAweGQzLCAweDQyLCAweDAzLCAweGFiLCAweDdkLCAweDI2LCAweGJkLCAweDdlLCAweGUzLCAweDY5LCAweGU3LCAweGRiLAorICAweDU2LCAweDc0LCAweDAwLCAweDA0LCAweGM1LCAweGIxLCAweDg4LCAweDYzLCAweDQxLCAweDg4LCAweDgwLCAweDYyLAorICAweDEwLCAweDQwLCAweDk4LCAweDIzLCAweDczLCAweDUyLCAweDk4LCAweDgxLCAweDZmLCAweDJiLCAweGY2LCAweDU4LAorICAweDA1LCAweDhkLCAweDgzLCAweDRhLCAweGY2LCAweGVkLCAweDg1LCAweDE5LCAweGQzLCAweDRlLCAweGE4LCAweGRiLAorICAweGQyLCAweGZlLCAweDk3LCAweGNlLCAweDhjLCAweDExLCAweGEzLCAweGUxLCAweDBlLCAweDExLCAweDIwLCAweDI4LAorICAweGI5LCAweGUzLCAweGY5LCAweDFkLCAweDIyLCAweDJkLCAweGMwLCAweDBjLCAweGExLCAweDc2LCAweGZjLCAweDQyLAorICAweDU4LCAweDcyLCAweDg2LCAweGQyLCAweDIyLCAweGYwLCAweGM0LCAweDdmLCAweDZmLCAweGRhLCAweDAyLCAweDVjLAorICAweGZlLCAweDY2LCAweDMzLCAweDcwLCAweDg5LCAweGQ3LCAweDg4LCAweDE5LCAweGNiLCAweDJjLCAweDk1LCAweDQ0LAorICAweGYyLCAweDAxLCAweDRjLCAweGJlLCAweGU1LCAweGM1LCAweDQ1LCAweDM2LCAweGFjLCAweDI4LCAweDVmLCAweGVmLAorICAweDgzLCAweDJmLCAweGNmLCAweGFmLCAweGVmLCAweDdmLCAweDE1LCAweGU1LCAweDcwLCAweGUwLCAweDIxLCAweDFhLAorICAweDk0LCAweGI1LCAweGFhLCAweDk1LCAweDA1LCAweDQxLCAweDhiLCAweDgwLCAweDUyLCAweGYwLCAweGM1LCAweDU0LAorICAweDc5LCAweDRlLCAweDMyLCAweDVkLCAweDlhLCAweDE4LCAweDY4LCAweGExLCAweGFjLCAweDlkLCAweGEwLCAweDEyLAorICAweDBhLCAweDA1LCAweDY5LCAweGUwLCAweGFlLCAweGE3LCAweDU0LCAweDI2LCAweDk3LCAweGNkLCAweGZhLCAweGVkLAorICAweDhkLCAweDY5LCAweDljLCAweDkxLCAweGM5LCAweDFhLCAweDZkLCAweGNmLCAweDY4LCAweGEyLCAweDhmLCAweDk1LAorICAweDBiLCAweGZiLCAweGVlLCAweDRiLCAweGI2LCAweGZjLCAweDhiLCAweDViLCAweGFiLCAweDVlLCAweDljLCAweDVkLAorICAweGE1LCAweDNjLCAweDNhLCAweGFiLCAweDRlLCAweDVlLCAweGI3LCAweDllLCAweGQzLCAweGIwLCAweDNjLCAweDFhLAorICAweGZjLCAweDUwLCAweGVlLCAweDU4LCAweGVmLCAweDA5LCAweDI0LCAweDBlLCAweGE3LCAweDNmLCAweDJhLCAweGUzLAorICAweGJkLCAweDY5LCAweDE5LCAweGE1LCAweGMxLCAweDM2LCAweDY1LCAweGFkLCAweDJlLCAweGNkLCAweGYwLCAweGJhLAorICAweDkzLCAweGVkLCAweGNmLCAweDM5LCAweGMzLCAweGI5LCAweDcyLCAweGU1LCAweGZmLCAweDc1LCAweDgxLCAweGQwLAorICAweDM2LCAweDZiLCAweGZjLCAweDhmLCAweDE2LCAweDQ2LCAweGE1LCAweGE4LCAweGQ2LCAweGZhLCAweDdjLCAweGM1LAorICAweDMwLCAweDVhLCAweGNjLCAweDkzLCAweDRjLCAweGE2LCAweDk4LCAweDgxLCAweGI0LCAweDkwLCAweGMzLCAweGMzLAorICAweDRlLCAweDU5LCAweDZkLCAweGJlLCAweGIzLCAweGE2LCAweGYzLCAweDE0LCAweDI4LCAweDRjLCAweDQwLCAweGNlLAorICAweGQ3LCAweGZmLCAweGI3LCAweDNmLCAweDcwLCAweGM1LCAweGI2LCAweDY1LCAweDVlLCAweGJkLCAweDlhLCAweDQwLAorICAweGM1LCAweGExLCAweGViLCAweDgyLCAweDRiLCAweDYzLCAweDc1LCAweDAxLCAweGUwLCAweDlhLCAweGQ0LCAweGE4LAorICAweGFjLCAweDQ1LCAweGFkLCAweGQ5LCAweDk2LCAweGE4LCAweGVjLCAweGQ1LCAweDRiLCAweGE3LCAweDNmLCAweDUwLAorICAweGEwLCAweGE0LCAweGNiLCAweGQyLCAweDYwLCAweDkwLCAweDdmLCAweGZiLCAweDRmLCAweDkwLCAweGQ5LCAweDcwLAorICAweDZiLCAweGQ2LCAweDU5LCAweDUzLCAweGRjLCAweDZiLCAweDBjLCAweDRhLCAweDQ2LCAweDhjLCAweDIyLCAweDM3LAorICAweDg4LCAweDRhLCAweGQ5LCAweGU4LCAweGU4LCAweDgxLCAweDEwLCAweDE0LCAweDQ4LCAweDAyLCAweDEzLCAweDgwLAorICAweDExLCAweGUxLCAweDgwLCAweGY2LCAweDM1LCAweGY4LCAweGIzLCAweDE3LCAweDQxLCAweGFjLCAweDlkLCAweGEwLAorICAweDEyLCAweDBhLCAweDA1LCAweDY4LCAweGZjLCAweGJjLCAweDRhLCAweDhmLCAweGJjLCAweGZlLCAweGY1LCAweDFiLAorICAweGUyLCAweDdhLCAweDNmLCAweGNmLCAweDE2LCAweGZiLCAweDIzLCAweGIzLCAweDQ5LCAweDg4LCAweDczLCAweDI4LAorICAweDNhLCAweDMxLCAweGVmLCAweDA5LCAweDgwLCAweGJkLCAweGUzLCAweGMyLCAweGJiLCAweGM0LCAweGQ2LCAweGVlLAorICAweDNiLCAweGViLCAweDRlLCAweDdiLCAweDZlLCAweDE4LCAweDMzLCAweDIwLCAweDE5LCAweDA0LCAweGE1LCAweGRlLAorICAweDY5LCAweDkwLCAweGQwLCAweDM4LCAweDNjLCAweDRkLCAweDU1LCAweDRlLCAweDNhLCAweDY0LCAweGNmLCAweGFlLAorICAweGQ3LCAweGRhLCAweDIwLCAweDUxLCAweGRiLCAweGY2LCAweDM4LCAweDRmLCAweGU3LCAweDBiLCAweGYyLCAweDA5LAorICAweDVjLCAweDBmLCAweDA4LCAweDAwLCAweDhkLCAweGQ0LCAweDlkLCAweGFlLCAweDU2LCAweGU5LCAweDJiLCAweDIwLAorICAweDA2LCAweDQ2LCAweDAwLCAweDMxLCAweGMwLCAweDM0LCAweDMyLCAweGE1LCAweDYxLCAweDdhLCAweDQ1LCAweDkzLAorICAweDEwLCAweDAzLCAweDA3LCAweDIxLCAweDFhLCAweDk0LCAweGM1LCAweGJhLCAweDk2LCAweDgzLCAweDEzLCAweDkwLAorICAweDg0LCAweGEyLCAweDIzLCAweDc3LCAweDZiLCAweDM2LCAweGM5LCAweDFlLCAweDY1LCAweGFhLCAweGVjLCAweDgxLAorICAweDljLCAweDA2LCAweDA0LCAweDlhLCAweDAyLCAweDQzLCAweDNmLCAweGYwLCAweDdkLCAweDA3LCAweGZmLCAweDJiLAorICAweGE1LCAweDNlLCAweGI3LCAweDZjLCAweDdkLCAweGJmLCAweGI1LCAweDJkLCAweDI0LCAweDVkLCAweGMxLCAweGJlLAorICAweDJiLCAweDUwLCAweDY3LCAweGQ0LCAweGZiLCAweDI2LCAweDQ4LCAweGYzLCAweGI1LCAweGJlLCAweGViLCAweDk5LAorICAweDgxLCAweGE1LCAweGU3LCAweGYxLCAweGNjLCAweGUxLCAweGZhLCAweDk3LCAweDRkLCAweDU2LCAweGMzLCAweGM5LAorICAweDdlLCAweGVkLCAweGZmLCAweDk0LCAweDYxLCAweDFlLCAweDcxLCAweGZlLCAweDhmLCAweGIyLCAweGI5LCAweDM0LAorICAweGRlLCAweDIyLCAweDNlLCAweDdhLCAweGY3LCAweDUzLCAweGViLCAweDNiLCAweGNmLCAweGMyLCAweGZiLCAweGY3LAorICAweDVhLCAweGYyLCAweGFhLCAweDg1LCAweGRkLCAweDc5LCAweDM1LCAweDViLCAweGFhLCAweDdmLCAweGJhLCAweDdhLAorICAweGNkLCAweDU2LCAweDM3LCAweDdkLCAweDc3LCAweDY1LCAweGM2LCAweGUzLCAweDZiLCAweDNiLCAweDZlLCAweDI2LAorICAweDMzLCAweDI0LCAweGExLCAweDRiLCAweGI5LCAweGRhLCAweGNkLCAweGE2LCAweDE0LCAweDYyLCAweDk3LCAweDFlLAorICAweGU2LCAweDViLCAweDkwLCAweDU4LCAweGI1LCAweDZiLCAweDEyLCAweDY2LCAweGQ4LCAweGFjLCAweDU0LCAweDcwLAorICAweDY2LCAweDVhLCAweGQ5LCAweDQ5LCAweDZhLCAweGQ1LCAweDQ5LCAweDkwLCAweDg2LCAweDY0LCAweGE4LCAweGFkLAorICAweDE3LCAweGMwLCAweDgyLCAweDkzLCAweDdjLCAweGFkLCAweDg5LCAweGE4LCAweDQxLCAweDY4LCAweDZiLCAweGEzLAorICAweGI3LCAweGMxLCAweDRkLCAweDI2LCAweDZiLCAweDJmLCAweGJkLCAweDU0LCAweGRiLCAweDc3LCAweDQ4LCAweDljLAorICAweGU2LCAweDQyLCAweDVmLCAweGE5LCAweGIyLCAweDlhLCAweGUyLCAweDI1LCAweDU4LCAweDQ2LCAweGFiLCAweDk0LAorICAweDQ1LCAweDdkLCAweDUxLCAweGI0LCAweDE0LCAweDQ4LCAweDg5LCAweGQ2LCAweDY1LCAweDM0LCAweGUxLCAweDlkLAorICAweGE1LCAweDI1LCAweGNhLCAweDI4LCAweDk5LCAweDU1LCAweDllLCAweGE1LCAweDhiLCAweDk4LCAweGE0LCAweDlkLAorICAweDhiLCAweGQxLCAweDhhLCAweDMzLCAweDlhLCAweDExLCAweDQxLCAweDcyLCAweGQxLCAweDA0LCAweGQ1LCAweGJjLAorICAweGQyLCAweDQ0LCAweDE3LCAweDA0LCAweDZhLCAweGFhLCAweGVkLCAweDRhLCAweDU0LCAweDViLCAweDgxLCAweGFlLAorICAweDBlLCAweDAwLCAweDAxLCAweDZjLCAweGFkLCAweDU4LCAweDBlLCAweDc4LCAweDAwLCAweGEzLCAweDljLCAweDJhLAorICAweDIyLCAweGJmLCAweDRlLCAweGI4LCAweGRhLCAweDk0LCAweDJkLCAweGJhLCAweDRlLCAweDIyLCAweGQzLCAweDg3LAorICAweGZjLCAweDZlLCAweDUzLCAweDkxLCAweGUxLCAweDU0LCAweDdjLCAweDRlLCAweGU2LCAweGNjLCAweGRjLCAweDQ2LAorICAweDM4LCAweGZlLCAweDA0LCAweGIwLCAweDE2LCAweGNiLCAweGZlLCAweDQ1LCAweDFkLCAweGNhLCAweGVjLCAweDliLAorICAweGVhLCAweGZmLCAweDM4LCAweGU2LCAweGM5LCAweDgxLCAweGE5LCAweDUxLCAweDIyLCAweGExLCAweGZkLCAweDlmLAorICAweGFiLCAweGUzLCAweGU2LCAweGQ0LCAweDczLCAweDc3LCAweDliLCAweGJlLCAweDdmLCAweDBkLCAweGVkLCAweGJmLAorICAweDhmLCAweDRkLCAweGE4LCAweDAwLCAweGY3LCAweDg3LCAweGUzLCAweGUzLCAweGNmLCAweDQwLCAweDU4LCAweDAwLAorICAweDMxLCAweDM5LCAweGNiLCAweDI2LCAweDY3LCAweDdkLCAweGNiLCAweDI2LCAweDY4LCAweDdkLCAweDExLCAweDFkLAorICAweGQ0LCAweDU1LCAweDUyLCAweGJiLCAweDFlLCAweDE3LCAweGQ2LCAweDA5LCAweGRhLCAweDFmLCAweDhjLCAweDkwLAorICAweGI3LCAweGQ3LCAweGE3LCAweDZhLCAweGQ5LCAweDcxLCAweDkxLCAweDVlLCAweDllLCAweDJiLCAweGYxLCAweDljLAorICAweGExLCAweDRjLCAweDc5LCAweDQwLCAweDNjLCAweDVhLCAweDhiLCAweDU0LCAweGIxLCAweDQwLCAweDAwLCAweGVkLAorICAweDliLCAweDJhLCAweDgxLCAweDllLCAweDlhLCAweGQzLCAweDRhLCAweDBjLCAweGYwLCAweDBlLCAweDIxLCAweDFhLAorICAweDhlLCAweGNhLCAweDFmLCAweGZmLCAweDZmLCAweGZmLCAweDM1LCAweDY1LCAweGE4LCAweDQxLCAweDkwLCAweGE0LAorICAweDcxLCAweDE4LCAweDBhLCAweDU1LCAweDMzLCAweDQyLCAweGE1LCAweGRlLCAweGFjLCAweGQ3LCAweDE1LCAweGFhLAorICAweGIwLCAweDAwLCAweGQ2LCAweDQ4LCAweDg2LCAweDdhLCAweDA1LCAweDdiLCAweDIwLCAweGJiLCAweDhkLCAweGNhLAorICAweGU1LCAweDhkLCAweDZiLCAweDEyLCAweDkwLCAweDA4LCAweDA5LCAweDk0LCAweGI4LCAweGY0LCAweDNlLCAweDcxLAorICAweDZlLCAweDIzLCAweGQ1LCAweDM5LCAweDhiLCAweDc5LCAweDc2LCAweGNjLCAweDY0LCAweDFlLCAweDZiLCAweGFhLAorICAweGY0LCAweGFhLCAweGU2LCAweDIwLCAweGE2LCAweDhmLCAweDk1LCAweDY1LCAweDBlLCAweGNkLCAweDFjLCAweDY4LAorICAweDA5LCAweGFiLCAweDI3LCAweDJhLCAweDliLCAweDVlLCAweDY5LCAweGI4LCAweGU2LCAweDVjLCAweGI3LCAweDJlLAorICAweDgwLCAweDg3LCAweDRmLCAweGUzLCAweDVjLCAweDcxLCAweGRhLCAweGE0LCAweGE4LCAweGNiLCAweGMzLCAweGQ2LAorICAweDcxLCAweDViLCAweGM4LCAweDY1LCAweDJhLCAweDgwLCAweDJkLCAweGJiLCAweGRkLCAweDVkLCAweDQ0LCAweDUyLAorICAweDE5LCAweDljLCAweGUzLCAweDc2LCAweDRkLCAweDVkLCAweDcxLCAweDA0LCAweDIwLCAweDVhLCAweGQzLCAweDJkLAorICAweDA4LCAweDQ0LCAweDhhLCAweDQ4LCAweGI1LCAweDI2LCAweDM3LCAweDExLCAweDZjLCAweDJhLCAweDFjLCAweDE2LAorICAweDM1LCAweDUxLCAweDczLCAweDgyLCAweDkwLCAweDQ0LCAweDYzLCAweDg0LCAweDQwLCAweDZkLCAweDg4LCAweDUyLAorICAweDIwLCAweGI2LCAweDEzLCAweDgyLCAweDRjLCAweDBiLCAweDgyLCAweDE1LCAweDI4LCAweDI1LCAweDNkLCAweDNhLAorICAweGE1LCAweGFiLCAweGNkLCAweDY4LCAweDZlLCAweGE2LCAweGVmLCAweDU1LCAweGIzLCAweDM2LCAweDc4LCAweDMwLAorICAweDJhLCAweGJjLCAweDc1LCAweGY2LCAweDkxLCAweDI3LCAweDNkLCAweDZjLCAweGQ1LCAweGNiLCAweDJjLCAweDU1LAorICAweDZhLCAweGRkLCAweGQ2LCAweDRkLCAweGRmLCAweDE0LCAweGYyLCAweDM3LCAweDk1LCAweDRmLCAweDZmLCAweDFjLAorICAweGZjLCAweDhlLCAweDQ4LCAweDg0LCAweGZiLCAweDM4LCAweGQ3LCAweDlmLCAweGNlLCAweDFjLCAweDQwLCAweDVmLAorICAweGViLCAweGFiLCAweGU0LCAweGU0LCAweGZmLCAweGNlLCAweGVlLCAweGU2LCAweGU2LCAweGQzLCAweGZjLCAweDljLAorICAweGU3LCAweDVhLCAweGU4LCAweDZjLCAweDg3LCAweDIxLCAweGIzLCAweDU5LCAweGMxLCAweDhhLCAweGQ1LCAweDkyLAorICAweDE2LCAweDQ4LCAweDU5LCAweGNjLCAweGY1LCAweGQ1LCAweDk3LCAweDc1LCAweDBmLCAweGZmLCAweDc0LCAweDM5LAorICAweDcwLCAweDExLCAweGZhLCAweDg0LCAweGM1LCAweGFlLCAweDhhLCAweGM1LCAweDIyLCAweDAwLCAweDg1LCAweGUzLAorICAweDc0LCAweDU2LCAweGMyLCAweGQ5LCAweDQ5LCAweGFkLCAweDM0LCAweDcxLCAweGFkLCAweDUyLCAweGUyLCAweDIyLAorICAweDBiLCAweDY1LCAweDJmLCAweDdmLCAweDgyLCAweDA3LCAweDQ2LCAweDcxLCAweDU1LCAweDM4LCAweDBlLCAweGNkLAorICAweGViLCAweDA4LCAweDNmLCAweDNhLCAweDQ2LCAweDM4LCAweDE4LCAweDI2LCAweDQ0LCAweDdkLCAweDczLCAweGZhLAorICAweDFjLCAweDNkLCAweDIzLCAweDA1LCAweDgxLCAweGM4LCAweDU0LCAweDllLCAweGYzLCAweDhlLCAweDBlLCAweDBlLAorICAweGEzLCAweDIwLCAweGEwLCAweGZmLCAweDQzLCAweDg2LCAweGY4LCAweDhkLCAweGNmLCAweDYwLCAweDgzLCAweGIzLAorICAweDYyLCAweDU1LCAweDg5LCAweGY1LCAweGUzLCAweDFlLCAweDJmLCAweGUwLCAweDEyLCAweDk1LCAweDI5LCAweDdjLAorICAweDUxLCAweDcyLCAweDBjLCAweGU4LCAweDQ0LCAweDUzLCAweDlmLCAweDdiLCAweDU0LCAweDgxLCAweDdlLCAweDdkLAorICAweDA4LCAweGE3LCAweGJmLCAweDc1LCAweDM3LCAweDM0LCAweGJiLCAweDYzLCAweGFmLCAweDZmLCAweDUxLCAweDZjLAorICAweDNjLCAweDVkLCAweGMxLCAweGZlLCAweDJhLCAweDI1LCAweDJhLCAweDdmLCAweDZjLCAweDNkLCAweDVkLCAweGEzLAorICAweDFiLCAweDEwLCAweDRjLCAweGE1LCAweGE4LCAweGJkLCAweGNmLCAweDRlLCAweDdmLCAweGMzLCAweDNkLCAweGFmLAorICAweDJmLCAweGZhLCAweDA1LCAweDExLCAweDAwLCAweGNkLCAweDRjLCAweGMwLCAweDkwLCAweGExLCAweDc5LCAweGE3LAorICAweDExLCAweDQxLCAweDY5LCAweGE3LCAweDZlLCAweGJhLCAweDEzLCAweDAwLCAweDBiLCAweDZjLCAweDUwLCAweDRhLAorICAweGQ1LCAweDFiLCAweDYwLCAweDJjLCAweDFjLCAweDIxLCAweDFhLCAweDhkLCAweDA4LCAweDVmLCAweDM0LCAweDA3LAorICAweGZkLCAweDM3LCAweDU0LCAweDYxLCAweDBjLCAweDQwLCAweDZjLCAweGFlLCAweDBhLCAweDg1LCAweDU3LCAweDM0LAorICAweDFhLCAweDVjLCAweGIxLCAweGU2LCAweGRhLCAweDVlLCAweDExLCAweDVhLCAweDViLCAweDJhLCAweDQyLCAweGUwLAorICAweDcwLCAweDdmLCAweDdiLCAweDRlLCAweGIzLCAweDg3LCAweGJkLCAweDdlLCAweGVlLCAweGMxLCAweDk2LCAweDYyLAorICAweDdmLCAweDU1LCAweDU4LCAweDVkLCAweDZkLCAweGVjLCAweDBmLCAweDNlLCAweGQ5LCAweDFmLCAweDBlLCAweDZiLAorICAweDBmLCAweDE4LCAweGU1LCAweGFkLCAweGFlLCAweDM2LCAweDNhLCAweGI4LCAweGJjLCAweGY1LCAweGNiLCAweDViLAorICAweGJjLCAweDFiLCAweDg5LCAweDI5LCAweGEzLCAweGY4LCAweGM1LCAweDE4LCAweDZiLCAweGQ0LCAweDlkLCAweDkzLAorICAweDVlLCAweGRhLCAweGEyLCAweGFlLCAweGU2LCAweDVkLCAweGYzLCAweDc2LCAweDQ2LCAweGI2LCAweDFiLCAweDI3LAorICAweDJiLCAweDc1LCAweDdhLCAweDA0LCAweGEzLCAweDIzLCAweDE0LCAweGE0LCAweGEzLCAweDc4LCAweGI3LCAweDIzLAorICAweGY5LCAweGQzLCAweGIzLCAweDNjLCAweGFiLCAweDYwLCAweDg3LCAweDlmLCAweGZkLCAweDVhLCAweDI2LCAweGFlLAorICAweGIzLCAweDZmLCAweGI5LCAweDEwLCAweGI4LCAweDA5LCAweGE4LCAweDU0LCAweDEzLCAweGM1LCAweDVhLCAweDYyLAorICAweGI0LCAweDU3LCAweDAyLCAweDZjLCAweDMyLCAweDBiLCAweDUyLCAweDMyLCAweDhjLCAweDM0LCAweDI5LCAweDY4LAorICAweDMwLCAweDVmLCAweDdmLCAweDUyLCAweGQyLCAweDlkLCAweGUzLCAweDY0LCAweDliLCAweDY1LCAweDg1LCAweDc0LAorICAweDE2LCAweDQyLCAweGUxLCAweDcwLCAweDA5LCAweDI3LCAweDM4LCAweDZkLCAweDlkLCAweGI2LCAweDQyLCAweDg2LAorICAweDg2LCAweGViLCAweDMxLCAweGM2LCAweDcyLCAweGQ0LCAweDY4LCAweDBmLCAweDI1LCAweDg2LCAweDlhLCAweGI5LAorICAweDY4LCAweGIwLCAweDE2LCAweDQ0LCAweDQ2LCAweGU2LCAweDYzLCAweDczLCAweDRmLCAweDFjLCAweDE1LCAweGQ5LAorICAweDhiLCAweGI2LCAweGZmLCAweDA3LCAweGNlLCAweGFkLCAweDBlLCAweDM2LCAweGM0LCAweGMzLCAweDRmLCAweGE1LAorICAweDViLCAweGJlLCAweDhlLCAweDM2LCAweGU4LCAweDQwLCAweGUyLCAweDFlLCAweGYxLCAweDM5LCAweGYyLCAweDE0LAorICAweDIwLCAweGY4LCAweGNmLCAweDg2LCAweDgxLCAweDUzLCAweGNjLCAweDgwLCAweDBhLCAweDNhLCAweGNhLCAweDcxLAorICAweDA2LCAweDA5LCAweGExLCAweDA5LCAweDE1LCAweDJhLCAweDlmLCAweDQwLCAweDkyLCAweDAxLCAweGFhLCAweDI2LAorICAweGFiLCAweDlkLCAweDI1LCAweGU4LCAweGJkLCAweDg1LCAweGRjLCAweDRmLCAweGYzLCAweDhlLCAweDQxLCAweGVmLAorICAweDIzLCAweDAyLCAweDk2LCAweGJhLCAweGNjLCAweGE0LCAweDlmLCAweDlmLCAweDNhLCAweGZiLCAweDU4LCAweGRjLAorICAweDNkLCAweDU4LCAweGZmLCAweGNjLCAweDNlLCAweDVjLCAweDYwLCAweDRlLCAweGMyLCAweGZmLCAweDg0LCAweGU1LAorICAweDVlLCAweGE0LCAweDhkLCAweDNmLCAweGJiLCAweDY2LCAweDZiLCAweGMwLCAweDIwLCAweGRhLCAweDVlLCAweDRjLAorICAweGQzLCAweGNmLCAweGIyLCAweDc0LCAweDEzLCAweDA0LCAweGE3LCAweDMxLCAweGM5LCAweDdjLCAweDMwLCAweGQzLAorICAweDBhLCAweDE0LCAweGE1LCAweGIxLCAweDkyLCAweDNjLCAweDI1LCAweDJlLCAweDk4LCAweDZkLCAweDE0LCAweDVlLAorICAweDNjLCAweDNlLCAweDQwLCAweDE2LCAweDAyLCAweDYwLCAweDFjLCAweDIxLCAweDFhLCAweDhmLCAweDgwLCAweDFlLAorICAweDBjLCAweDAwLCAweDVmLCAweDNmLCAweDY3LCAweGE3LCAweGIwLCAweGM2LCAweDI0LCAweDljLCAweDMxLCAweDJhLAorICAweGE4LCAweDUyLCAweDRlLCAweDkyLCAweGQxLCAweGFiLCAweDM0LCAweDEyLCAweDg1LCAweDk2LCAweGM5LCAweDkyLAorICAweGIwLCAweDNjLCAweGUzLCAweDllLCAweDM1LCAweGZlLCAweDk0LCAweGY5LCAweGVlLCAweDZlLCAweDgxLCAweDNhLAorICAweGJiLCAweGJiLCAweDk5LCAweDMxLCAweDNjLCAweDNiLCAweDhjLCAweDFhLCAweGYyLCAweGQxLCAweGIzLCAweDg5LAorICAweDU1LCAweGNhLCAweDhkLCAweDgyLCAweDdkLCAweGMyLCAweDMyLCAweGUzLCAweGFiLCAweDhjLCAweGQ3LCAweDRhLAorICAweGI3LCAweDY0LCAweDYwLCAweGFlLCAweDg5LCAweDdlLCAweGFkLCAweGI4LCAweGU0LCAweDE1LCAweGVlLCAweGQ3LAorICAweDllLCAweDNmLCAweDM5LCAweGMwLCAweDQxLCAweDYzLCAweGI1LCAweGI5LCAweDI5LCAweDcyLCAweGI0LCAweGRiLAorICAweDBhLCAweGZiLCAweGQ0LCAweGU4LCAweGU0LCAweGM4LCAweDU1LCAweGI3LCAweGRjLCAweDE2LCAweDY3LCAweDA5LAorICAweDFkLCAweDNiLCAweDdjLCAweDQzLCAweDViLCAweDMwLCAweDYyLCAweDQ3LCAweDE5LCAweDQ5LCAweDExLCAweDg3LAorICAweDI0LCAweDhkLCAweDY4LCAweDgzLCAweGI0LCAweDQ4LCAweDkyLCAweDA1LCAweGQ1LCAweDcxLCAweGVlLCAweGIxLAorICAweGFiLCAweGM3LCAweGNmLCAweGI2LCAweDcxLCAweGEyLCAweGJiLCAweGUyLCAweDQ1LCAweGE2LCAweDEyLCAweDZjLAorICAweDA5LCAweGU0LCAweDhhLCAweDg5LCAweGE1LCAweDhiLCAweDc1LCAweDQ5LCAweDI4LCAweDhjLCAweDQwLCAweDYwLAorICAweDlhLCAweDJiLCAweDY4LCAweDE2LCAweDUwLCAweGQxLCAweDRmLCAweDQ1LCAweGUxLCAweDAxLCAweDE4LCAweDliLAorICAweGUxLCAweDhlLCAweDUwLCAweGY1LCAweDI4LCAweGU1LCAweDQ2LCAweDFhLCAweDE3LCAweGJiLCAweGYxLCAweGIyLAorICAweGYzLCAweDhkLCAweGE4LCAweDRjLCAweDRhLCAweGM1LCAweGExLCAweDQwLCAweDUxLCAweDcyLCAweDFiLCAweGViLAorICAweDZhLCAweGY0LCAweDgzLCAweGM3LCAweDA0LCAweDgxLCAweDNmLCAweDZkLCAweGE0LCAweGIwLCAweDkwLCAweGMyLAorICAweGM1LCAweDIwLCAweDAyLCAweDU4LCAweGU0LCAweGJkLCAweDdkLCAweDZmLCAweDY1LCAweDkyLCAweGUxLCAweGU3LAorICAweDdjLCAweDJlLCAweDgyLCAweDc0LCAweDRkLCAweGY1LCAweGNiLCAweDllLCAweDYyLCAweGQzLCAweDg5LCAweGU3LAorICAweDA2LCAweDU0LCAweDJjLCAweDhjLCAweDA4LCAweDVjLCAweDg5LCAweDk5LCAweDMwLCAweGE3LCAweGZmLCAweDMzLAorICAweGYzLCAweGU2LCAweDgxLCAweDc0LCAweDk3LCAweDk5LCAweGFiLCAweDcwLCAweDYzLCAweGQwLCAweDczLCAweDFmLAorICAweGVjLCAweDkwLCAweDEyLCAweDljLCAweGRmLCAweDhhLCAweGY0LCAweDlhLCAweDMzLCAweGNlLCAweGJlLCAweDk5LAorICAweDI1LCAweGNjLCAweGVhLCAweDc3LCAweGI2LCAweDE0LCAweDEzLCAweGVjLCAweDcyLCAweGM0LCAweDYwLCAweDg5LAorICAweDMwLCAweDQyLCAweGU3LCAweDgyLCAweDU2LCAweDMwLCAweDE5LCAweDgzLCAweDE1LCAweGY2LCAweGRlLCAweDU1LAorICAweDIwLCAweGY1LCAweDdiLCAweGMwLCAweGEyLCAweGVlLCAweDFlLCAweDI5LCAweGRiLCAweGU3LCAweDg3LCAweDkwLAorICAweDdjLCAweGQ4LCAweGFiLCAweGVjLCAweDk5LCAweDc0LCAweDA0LCAweGJlLCAweDJjLCAweDA4LCAweDk1LCAweDEwLAorICAweDAwLCAweDk4LCAweGU5LCAweDE4LCAweDFjLCAweDYzLCAweDJlLCAweDA2LCAweDE3LCAweDQzLCAweGJlLCAweGFkLAorICAweDFlLCAweDdiLCAweGFmLCAweDUwLCAweGEwLCAweGMwLCAweGFlLCAweDk2LCAweGJkLCAweDQ4LCAweDMyLCAweGIzLAorICAweGMxLCAweDVjLCAweGI5LCAweDIyLCAweDM4LCAweGEwLCAweGFjLCAweDExLCAweDUzLCAweGExLCAweGUyLCAweDAyLAorICAweGM1LCAweDZiLCAweDM2LCAweGFhLCAweGFjLCAweDYwLCAweGQyLCAweDQ1LCAweDE5LCAweDU3LCAweDNlLCAweDk3LAorICAweDMyLCAweDQ3LCAweGRhLCAweDNlLCAweDc0LCAweDExLCAweDdjLCAweDI4LCAweGJlLCAweGM1LCAweDM4LCAweGU5LAorICAweGQ0LCAweDlmLCAweGY5LCAweGI1LCAweDUxLCAweDVjLCAweDFiLCAweDZhLCAweDliLCAweDA1LCAweDY1LCAweDk3LAorICAweDU2LCAweDFkLCAweGYxLCAweGY2LCAweDUzLCAweDU4LCAweDc3LCAweDJjLCAweGEyLCAweDUwLCAweGE5LCAweGYwLAorICAweGEzLCAweDg3LCAweDNmLCAweDVlLCAweGRjLCAweDQ5LCAweDgxLCAweGMwLCAweDIxLCAweDJhLCAweDhlLCAweDgwLAorICAweDA0LCAweDAwLCAweDAwLCAweDFmLCAweDNiLCAweDY2LCAweGE3LCAweDMwLCAweDkwLCAweDYzLCAweDE1LCAweGMxLAorICAweDMyLCAweDE4LCAweDBlLCAweDExLCAweGFkLCAweDM0LCAweGIyLCAweDUwLCAweGI4LCAweDZjLCAweDBlLCAweDQ3LAorICAweDliLCAweGZlLCAweDM3LCAweGM1LCAweDZkLCAweDAwLCAweDEzLCAweDE4LCAweDMxLCAweGM0LCAweGI4LCAweDJjLAorICAweDIzLCAweDVkLCAweDZkLCAweDA4LCAweDZmLCAweDY1LCAweGMyLCAweGQxLCAweGYwLCAweDc5LCAweDA4LCAweGZjLAorICAweGVkLCAweGJjLCAweDdjLCAweDc1LCAweDgyLCAweDg5LCAweDRjLCAweDZjLCAweDhkLCAweDcwLCAweDA5LCAweGU3LAorICAweGU0LCAweDkxLCAweDU4LCAweDk3LCAweDliLCAweDYzLCAweDY5LCAweGJiLCAweDUyLCAweGRhLCAweDBlLCAweGM4LAorICAweGZhLCAweDVjLCAweGVlLCAweDE5LCAweDJjLCAweDBhLCAweDc1LCAweGMxLCAweGMzLCAweDAwLCAweDQ0LCAweDY0LAorICAweDZjLCAweGE5LCAweDc4LCAweDRhLCAweDFiLCAweGU0LCAweGM0LCAweGFmLCAweDIzLCAweDBjLCAweGIyLCAweGJhLAorICAweDg0LCAweDQ2LCAweGUzLCAweDA4LCAweDk3LCAweDg2LCAweDU1LCAweDEwLCAweDc2LCAweGM0LCAweGM2LCAweGIxLAorICAweDQ0LCAweDMxLCAweGJlLCAweDhiLCAweDQ0LCAweGFiLCAweGQ3LCAweDhhLCAweDk1LCAweGI2LCAweDQ1LCAweDQ1LAorICAweDI5LCAweDA4LCAweDU2LCAweGVlLCAweDA4LCAweDA1LCAweDZmLCAweDkwLCAweDg4LCAweDA0LCAweGUyLCAweDAzLAorICAweDNjLCAweDNkLCAweGRjLCAweDQ4LCAweDQ4LCAweDEyLCAweDBhLCAweGIzLCAweDZiLCAweDQ0LCAweDkyLCAweGQ0LAorICAweDljLCAweGNlLCAweDk4LCAweDI3LCAweGU1LCAweGEzLCAweDkwLCAweDMxLCAweGRiLCAweDc4LCAweGQyLCAweDIwLAorICAweDZiLCAweGY4LCAweGI2LCAweDVmLCAweDVmLCAweDZhLCAweDY2LCAweGQwLCAweGI1LCAweDAwLCAweDEzLCAweDk3LAorICAweDA4LCAweDMzLCAweDBkLCAweDBhLCAweDJjLCAweDJhLCAweDk4LCAweDY1LCAweDJkLCAweDEzLCAweDViLCAweDRjLAorICAweGQ3LCAweDA2LCAweDZhLCAweGFjLCAweDFhLCAweDI3LCAweDk4LCAweGQwLCAweGEzLCAweGQ4LCAweDVjLCAweGI2LAorICAweDBlLCAweDFjLCAweGY0LCAweGI3LCAweDE3LCAweGZiLCAweGE1LCAweDEyLCAweDhlLCAweDA3LCAweDNiLCAweDNlLAorICAweDUyLCAweDA2LCAweDNkLCAweDJlLCAweDA0LCAweDFlLCAweDlhLCAweGJjLCAweDIzLCAweDFjLCAweDI3LCAweGFlLAorICAweDc2LCAweDJkLCAweDY0LCAweDBjLCAweGY5LCAweDc1LCAweDBlLCAweDk5LCAweGE3LCAweGFlLCAweDkxLCAweDZkLAorICAweGJjLCAweDU2LCAweGZhLCAweDUwLCAweGUzLCAweDU5LCAweDhiLCAweDQzLCAweDQ2LCAweGI5LCAweDdiLCAweDU5LAorICAweGY1LCAweDM1LCAweDJmLCAweGE4LCAweDNiLCAweGFkLCAweDM3LCAweDc0LCAweDNhLCAweDI1LCAweDM0LCAweGY3LAorICAweDVhLCAweDE0LCAweGY2LCAweGIyLCAweGVkLCAweGIxLCAweDJjLCAweDFhLCAweGVlLCAweDI5LCAweGM4LCAweGZjLAorICAweDlhLCAweDRkLCAweDY1LCAweGQ1LCAweDI5LCAweDU3LCAweDAwLCAweDY3LCAweDg3LCAweDMyLCAweDZmLCAweGY2LAorICAweDRhLCAweGRhLCAweDgyLCAweDVjLCAweDZjLCAweGU5LCAweDEzLCAweGU4LCAweDJmLCAweDFkLCAweDI1LCAweGNhLAorICAweDlhLCAweGM5LCAweDBkLCAweDU5LCAweDg1LCAweGU2LCAweGE2LCAweDk0LCAweGIyLCAweGE2LCAweDk5LCAweDhhLAorICAweDJjLCAweGFiLCAweDY4LCAweGMzLCAweGI1LCAweDNjLCAweDZiLCAweGFiLCAweGNjLCAweGU5LCAweGY0LCAweDI5LAorICAweDI4LCAweGUwLCAweGNhLCAweGFiLCAweDVmLCAweDNhLCAweDZmLCAweGE1LCAweGNlLCAweGQ1LCAweGY5LCAweGNhLAorICAweDNjLCAweGJjLCAweDk5LCAweGIxLCAweDdkLCAweDM1LCAweGQ2LCAweDFiLCAweDA4LCAweDNjLCAweGQyLCAweDgyLAorICAweGMzLCAweDIwLCAweGU2LCAweDBiLCAweDBhLCAweGRhLCAweGYwLCAweGRhLCAweGZhLCAweGM2LCAweGE0LCAweDJjLAorICAweDAzLCAweDY4LCAweDBhLCAweDBiLCAweDBiLCAweDAxLCAweDQ5LCAweGQyLCAweDRiLCAweGMxLCAweGEyLCAweDcxLAorICAweDVhLCAweGQ4LCAweDAwLCAweDcwLCAweDIxLCAweDRjLCAweDM2LCAweDgwLCAweDBjLCAweGEwLCAweGRmLCAweGJmLAorICAweGZmLCAweGNhLCAweGQ1LCAweDQ0LCAweDM2LCAweGEzLCAweDMzLCAweGI3LCAweDIxLCAweDIyLCAweDE2LCAweDA2LAorICAweGVjLCAweDI0LCAweDIyLCAweGMwLCAweDg3LCAweDlkLCAweDdjLCAweDE4LCAweDdmLCAweDc1LCAweDRiLCAweGU4LAorICAweGZhLCAweGM3LCAweDVmLCAweGRkLCAweDJhLCAweDY5LCAweGExLCAweGUwLCAweDJlLCAweGMwLCAweDdjLCAweGVmLAorICAweDcwLCAweDVjLCAweGZjLCAweGFhLCAweGI3LCAweGEyLCAweDcwLCAweDMyLCAweGZlLCAweGZkLCAweDkwLCAweDNjLAorICAweGI5LCAweDEwLCAweDgyLCAweDU0LCAweGIxLCAweGNjLCAweDc2LCAweDRkLCAweGI5LCAweGMxLCAweGU2LCAweDI4LAorICAweDY3LCAweGM2LCAweDg2LCAweDk1LCAweDNiLCAweGZmLCAweGRjLCAweDkxLCAweDQzLCAweDllLCAweDRkLCAweDNlLAorICAweGIzLCAweGUyLCAweDE3LCAweDJlLCAweDNiLCAweDJiLCAweGM5LCAweDJlLCAweDBjLCAweGU4LCAweDZiLCAweGNmLAorICAweGVmLCAweDJhLCAweDRkLCAweDljLCAweDQxLCAweDU2LCAweGRhLCAweGFiLCAweGUwLCAweDVmLCAweGRkLCAweDk5LAorICAweDQ3LCAweGFhLCAweDcwLCAweGVmLCAweDYyLCAweDlkLCAweDg4LCAweDlmLCAweDI3LCAweDkxLCAweGQyLCAweGRkLAorICAweDk4LCAweGI0LCAweDdhLCAweDM4LCAweGYxLCAweDU5LCAweDRlLCAweDNiLCAweGRmLCAweGVhLCAweGNjLCAweDdiLAorICAweDBkLCAweDFjLCAweDkwLCAweDAyLCAweGZiLCAweGZiLCAweDM3LCAweDQzLCAweGZkLCAweDU1LCAweDI4LCAweDAyLAorICAweGJmLCAweDBlLCAweDQ1LCAweDBiLCAweDI3LCAweGQ0LCAweDc5LCAweGMwLCAweGE2LCAweDRmLCAweGVkLCAweDZjLAorICAweGI3LCAweDQzLCAweDVlLCAweDYwLCAweDY4LCAweDFmLCAweDNhLCAweDVhLCAweGMxLCAweGY5LCAweGQ4LCAweGI1LAorICAweDljLCAweDdkLCAweDM1LCAweGI1LCAweGJiLCAweDdiLCAweDE3LCAweGVjLCAweDRlLCAweGRmLCAweDg2LCAweGYxLAorICAweDVmLCAweDQ1LCAweDQzLCAweDVhLCAweGJiLCAweDRiLCAweGExLCAweDEzLCAweGQxLCAweDYwLCAweDYwLCAweGRlLAorICAweDdhLCAweGNkLCAweGMwLCAweGRhLCAweGJjLCAweGE0LCAweDM2LCAweGM0LCAweDExLCAweDg2LCAweGVhLCAweDc4LAorICAweDRjLCAweDY3LCAweDhmLCAweDJlLCAweDM1LCAweDExLCAweGM0LCAweDg4LCAweDgyLCAweDY0LCAweGE0LCAweDIyLAorICAweGQ5LCAweGM5LCAweDlhLCAweDY3LCAweDczLCAweGE1LCAweDI2LCAweGY1LCAweDNiLCAweDI2LCAweGI1LCAweDI0LAorICAweDFmLCAweDZmLCAweDY0LCAweGEzLCAweGI4LCAweDUwLCAweDk4LCAweDI1LCAweGVmLCAweDBlLCAweGJhLCAweDA1LAorICAweDEwLCAweGNiLCAweDU0LCAweDkwLCAweDhjLCAweDA3LCAweDY2LCAweDliLCAweDExLCAweDIxLCAweDg0LCAweDk2LAorICAweDNjLCAweGJlLCAweDNmLCAweGEwLCAweDRlLCAweDE3LCAweGFlLCAweGJmLCAweGI1LCAweDE1LCAweDdhLCAweDVmLAorICAweDZhLCAweGFiLCAweDM0LCAweGQ0LCAweDczLCAweDAwLCAweDcxLCAweGNjLCAweGYwLCAweDY1LCAweDQ0LCAweGZiLAorICAweGIzLCAweDg3LCAweDY5LCAweGVlLCAweDhmLCAweDQ4LCAweDhiLCAweDMyLCAweDQyLCAweDI5LCAweGQxLCAweDM1LAorICAweDc1LCAweGFhLCAweGE3LCAweGJiLCAweDQyLCAweGMyLCAweGU3LCAweDRjLCAweDQ3LCAweDcyLCAweDgzLCAweGVhLAorICAweDM2LCAweGNkLCAweDA4LCAweDk4LCAweGFhLCAweDcwLCAweDc3LCAweGZhLCAweGNlLCAweGNlLCAweGE5LCAweGM3LAorICAweDcwLCAweDU2LCAweDU3LCAweGZjLCAweGJiLCAweDg4LCAweDkyLCAweDU3LCAweDQyLCAweGJhLCAweGFhLCAweDMyLAorICAweDVjLCAweDdlLCAweDlkLCAweGI4LCAweDI4LCAweGExLCAweDNhLCAweDNlLCAweDIyLCAweGIyLCAweDE1LCAweGFkLAorICAweDA1LCAweDIyLCAweGJlLCAweDVlLCAweGZkLCAweDVkLCAweGVhLCAweGFmLCAweDI1LCAweDZkLCAweDBkLCAweDlkLAorICAweDMxLCAweGRhLCAweDc3LCAweGNjLCAweDBlLCAweGMwLCAweDc5LCAweGMwLCAweDBkLCAweDUzLCAweDQ2LCAweDE1LAorICAweDcwLCAweDc4LCAweDVkLCAweDNiLCAweDEwLCAweGQ2LCAweDU0LCAweDQ4LCAweGI5LCAweDIxLCAweDc1LCAweDFlLAorICAweDc5LCAweGFmLCAweDhhLCAweDE5LCAweDNjLCAweDBjLCAweDMzLCAweDJjLCAweGU1LCAweDY4LCAweDFhLCAweGUxLAorICAweGQ1LCAweDQzLCAweDU2LCAweGJiLCAweDRiLCAweDVjLCAweDE5LCAweDhhLCAweGYwLCAweDIxLCAweDdhLCAweDhkLAorICAweDg4LCAweDA1LCAweDNmLCAweDQxLCAweGJmLCAweDM5LCAweDY4LCAweDg2LCAweGExLCAweDQ2LCAweDA3LCAweDNjLAorICAweDE5LCAweDkyLCAweDJhLCAweDE0LCAweGNiLCAweGJiLCAweGNkLCAweDEyLCAweGJhLCAweDk3LCAweGQzLCAweDkxLAorICAweGE4LCAweDQzLCAweDU5LCAweDUyLCAweGI4LCAweDNmLCAweGYwLCAweDNhLCAweDAzLCAweDU4LCAweGU4LCAweDVmLAorICAweGQ0LCAweDJmLCAweGJjLCAweDNjLCAweDQ3LCAweDBmLCAweDkyLCAweGYzLCAweDJmLCAweDM3LCAweGUxLCAweGZhLAorICAweGViLCAweDQ0LCAweGQyLCAweGQyLCAweDJlLCAweDk5LCAweDU3LCAweDY3LCAweDQ5LCAweGJiLCAweGM3LCAweGQ1LAorICAweDJiLCAweGY0LCAweDhkLCAweGIwLCAweDkyLCAweGQ2LCAweDFjLCAweDA5LCAweDhhLCAweDQ1LCAweDNhLCAweGY2LAorICAweDZlLCAweDYwLCAweGQ2LCAweGVmLCAweGNlLCAweGRlLCAweDY3LCAweDg4LCAweDNjLCAweDIxLCAweGRiLCAweDY2LAorICAweDAwLCAweDg4LCAweDVlLCAweDg5LCAweDIyLCAweGViLCAweDY0LCAweDljLCAweDQ1LCAweDk5LCAweDQ4LCAweDFjLAorICAweGE0LCAweDAyLCAweDM4LCAweGVmLCAweDQyLCAweDAwLCAweDc3LCAweDFhLCAweGQ0LCAweDk3LCAweGFmLCAweDdiLAorICAweDAwLCAweGYzLCAweGU5LCAweDNkLCAweGRlLCAweDJiLCAweDY5LCAweDAyLCAweGJmLCAweDZhLCAweGYwLCAweDQ5LAorICAweGIzLCAweDVmLCAweGJmLCAweGMzLCAweGY4LCAweDBkLCAweDIwLCAweDgxLCAweDA5LCAweDNmLCAweDViLCAweDRhLAorICAweDIxLCAweGE3LCAweDU1LCAweDY2LCAweGJmLCAweGFhLCAweDczLCAweDA3LCAweDNkLCAweDIwLCAweGJkLCAweGE5LAorICAweGI1LCAweGE2LCAweGZiLCAweDQwLCAweDNiLCAweDhhLCAweDcwLCAweGJjLCAweDY4LCAweGJiLCAweDQ1LCAweDRiLAorICAweGQ4LCAweGRhLCAweGI0LCAweDkzLCAweGI4LCAweGExLCAweDM5LCAweDljLCAweGU5LCAweDQ0LCAweDFiLCAweGMwLAorICAweDM5LCAweDI0LCAweDRkLCAweDJkLCAweDczLCAweDBkLCAweDVmLCAweGMwLCAweDEzLCAweGI2LCAweGVhLCAweDNhLAorICAweDA0LCAweDRhLCAweDg3LCAweDE0LCAweDJjLCAweGVkLCAweGNmLCAweDFiLCAweDkyLCAweDM3LCAweGMyLCAweGEyLAorICAweGU0LCAweDE2LCAweGY2LCAweDJlLCAweDJmLCAweDZiLCAweDk3LCAweDI4LCAweDA3LCAweDcwLCAweDQxLCAweGUzLAorICAweGRiLCAweDllLCAweDA5LCAweDc5LCAweGI4LCAweGFkLCAweDEzLCAweGU2LCAweGFlLCAweDMzLCAweGY0LCAweDU0LAorICAweGY3LCAweDAzLCAweDg5LCAweDI1LCAweDQyLCAweDBmLCAweGZhLCAweDQ1LCAweDNjLCAweDVhLCAweGYyLCAweDZhLAorICAweDllLCAweGYyLCAweGQ0LCAweDBhLCAweGY2LCAweGQzLCAweDExLCAweDllLCAweDQyLCAweDBmLCAweDYyLCAweGQyLAorICAweGZlLCAweDY5LCAweGZhLCAweDdlLCAweDU3LCAweGU0LCAweDJmLCAweDE5LCAweGM2LCAweDNmLCAweDVkLCAweGFiLAorICAweGRmLCAweDU5LCAweGYxLCAweDk5LCAweDdiLCAweGRkLCAweDdiLCAweDA2LCAweDVlLCAweGJkLCAweGYyLCAweGJmLAorICAweDFlLCAweGE1LCAweGVmLCAweDY2LCAweDVhLCAweDk1LCAweGQ0LCAweDQyLCAweDAxLCAweDNiLCAweDZjLCAweGQ1LAorICAweDBkLCAweDUyLCAweDRiLCAweGE5LCAweGIzLCAweDc4LCAweDhmLCAweDUxLCAweGEyLCAweDE5LCAweGRhLCAweDc4LAorICAweGJkLCAweDQwLCAweDQxLCAweGM0LCAweGI3LCAweGYxLCAweGZlLCAweGY0LCAweDM2LCAweDUzLCAweGQ3LCAweDA4LAorICAweDg4LCAweGQxLCAweGFjLCAweGY3LCAweGMwLCAweGRlLCAweDhkLCAweGIyLCAweDg3LCAweGM1LCAweDgwLCAweDljLAorICAweDMwLCAweDViLCAweGUwLCAweDI1LCAweGExLCAweDE2LCAweGExLCAweDMxLCAweDVhLCAweDc5LCAweDJhLCAweGJmLAorICAweDdhLCAweGExLCAweDQyLCAweDRjLCAweDYwLCAweDE0LCAweDlhLCAweGFmLCAweDkyLCAweDJlLCAweGE1LCAweDRjLAorICAweDMzLCAweGFkLCAweDhjLCAweGUzLCAweGE3LCAweGMwLCAweDc3LCAweDBmLCAweDc5LCAweDExLCAweDUyLCAweDYwLAorICAweGE0LCAweDhhLCAweDBiLCAweDRkLCAweDY4LCAweDBiLCAweDNmLCAweGNlLCAweGJmLCAweDc3LCAweDVmLCAweDEzLAorICAweDVmLCAweDVjLCAweDgyLCAweDQ0LCAweGI5LCAweDVhLCAweDRlLCAweDEyLCAweGIyLCAweDI5LCAweDVhLCAweGEwLAorICAweDUyLCAweDgzLCAweDYxLCAweDYwLCAweGUwLCAweDIxLCAweDFhLCAweDhmLCAweGYwLCAweDAwLCAweDFmLCAweDY3LAorICAweDhiLCAweDM5LCAweDY5LCAweDg2LCAweGE5LCAweDRkLCAweGU1LCAweDU2LCAweDg0LCAweDJiLCAweDA2LCAweGY1LAorICAweGExLCAweDExLCAweDZiLCAweDllLCAweGQ1LCAweDk4LCAweDI3LCAweDlhLCAweDAzLCAweGIzLCAweDBlLCAweDg4LAorICAweDQwLCAweDc5LCAweDZlLCAweGUyLCAweGI5LCAweDk3LCAweDc5LCAweDJkLCAweDhlLCAweDY1LCAweDZmLCAweGQ1LAorICAweGY0LCAweDAzLCAweGNjLCAweDFiLCAweDVhLCAweGM2LCAweGI2LCAweDQ2LCAweGEzLCAweDVkLCAweDRhLCAweGNmLAorICAweDYzLCAweDU4LCAweDhkLCAweDc3LCAweDQ5LCAweDM1LCAweGU4LCAweDIwLCAweDk3LCAweDIwLCAweDg4LCAweGZiLAorICAweGE2LCAweDkzLCAweGRiLCAweDIwLCAweDVlLCAweGFhLCAweDI1LCAweGNjLCAweDY5LCAweDdkLCAweDVhLCAweDAxLAorICAweGQyLCAweDFhLCAweDBkLCAweGMxLCAweDE0LCAweGJmLCAweDQ5LCAweGYyLCAweGI0LCAweDQzLCAweDQyLCAweGJlLAorICAweDMxLCAweDE0LCAweGM0LCAweGE5LCAweGFiLCAweDRjLCAweGEwLCAweDlmLCAweDQ2LCAweDhhLCAweDllLCAweDMzLAorICAweDhkLCAweDdiLCAweGU5LCAweGE3LCAweDQzLCAweDhmLCAweDI3LCAweDE2LCAweGZiLCAweDYxLCAweGQ3LCAweDUzLAorICAweDhjLCAweGViLCAweDFkLCAweDBmLCAweDI4LCAweGQ2LCAweGNmLCAweDNlLCAweDljLCAweGZjLCAweGFjLCAweDljLAorICAweGYzLCAweGFkLCAweGUyLCAweDliLCAweDliLCAweGQ5LCAweGQ3LCAweGQ2LCAweDZiLCAweDkwLCAweDU3LCAweDQxLAorICAweDRkLCAweDMyLCAweDAwLCAweGJmLCAweDNlLCAweDQyLCAweDgxLCAweDU2LCAweDM0LCAweGI5LCAweDc5LCAweDJiLAorICAweGI4LCAweGQwLCAweGQ3LCAweGMxLCAweGIyLCAweDJlLCAweGJiLCAweGI2LCAweDI1LCAweDgzLCAweGJkLCAweGQ4LAorICAweDQ2LCAweDE3LCAweDhkLCAweGNjLCAweGEwLCAweGIwLCAweDJhLCAweDAxLCAweDQxLCAweDExLCAweGE1LCAweDExLAorICAweDE0LCAweDRkLCAweDcyLCAweDkwLCAweGM4LCAweDA0LCAweGY0LCAweDFlLCAweGNmLCAweDQ4LCAweDEyLCAweGEwLAorICAweDQ0LCAweDQ4LCAweDExLCAweDViLCAweDRhLCAweGU3LCAweDgzLCAweGQyLCAweDRiLCAweDE5LCAweDc2LCAweDRlLAorICAweDAzLCAweDU3LCAweDc0LCAweGQ1LCAweDk4LCAweDc5LCAweGQ4LCAweDE5LCAweDA4LCAweDJiLCAweGZjLCAweGJhLAorICAweDU2LCAweDNmLCAweGFiLCAweDc3LCAweGE3LCAweDdjLCAweDE5LCAweGZlLCAweDE5LCAweDI4LCAweDExLCAweGJjLAorICAweDQ3LCAweDJkLCAweGZjLCAweGFlLCAweDgxLCAweDkyLCAweDlkLCAweDMzLCAweGM5LCAweGY3LCAweGM2LCAweDUxLAorICAweDliLCAweDM0LCAweGU3LCAweDdjLCAweDZhLCAweGU0LCAweGQ5LCAweGRmLCAweDY3LCAweGMwLCAweDAxLCAweGM1LAorICAweGM0LCAweDk2LCAweDBhLCAweDkxLCAweGJlLCAweGM3LCAweGU0LCAweGY0LCAweDhlLCAweGM3LCAweDI3LCAweGMzLAorICAweDU5LCAweDJiLCAweGIwLCAweDcxLCAweGZhLCAweGJlLCAweDY1LCAweDY0LCAweGJiLCAweGNiLCAweDM1LCAweDJkLAorICAweDMzLCAweDFjLCAweGQyLCAweDI2LCAweGY0LCAweGZhLCAweGQ1LCAweDg3LCAweGEyLCAweDUxLCAweDFhLCAweGE5LAorICAweGM3LCAweGNjLCAweDU0LCAweDgzLCAweGIxLCAweDZjLCAweGM0LCAweDA0LCAweGFiLCAweDlmLCAweDA5LCAweGZlLAorICAweDg2LCAweDUxLCAweGJmLCAweGU1LCAweGQ3LCAweGRkLCAweDFlLCAweDE0LCAweGZmLCAweGFhLCAweGQyLCAweGQ0LAorICAweDU4LCAweDA5LCAweDg0LCAweDkzLCAweGYxLCAweDZkLCAweDczLCAweDVmLCAweGFhLCAweDM3LCAweDEyLCAweGNhLAorICAweDE2LCAweDk0LCAweDAwLCAweDA2LCAweDdmLCAweGRkLCAweDBjLCAweDZhLCAweDBjLCAweDEyLCAweGRiLCAweGE2LAorICAweGNjLCAweGI1LCAweGVmLCAweDM0LCAweDUzLCAweDkyLCAweDY1LCAweDc5LCAweGQ3LCAweDJkLCAweDYwLCAweDBjLAorICAweGY3LCAweGNiLCAweDBjLCAweDIwLCAweDEzLCAweGUzLCAweGFmLCAweDZhLCAweDllLCAweDRiLCAweGNmLCAweGRmLAorICAweDk2LCAweGYyLCAweGQ0LCAweDgyLCAweGJmLCAweGU2LCAweGZiLCAweDg4LCAweDE0LCAweDQ2LCAweGQ1LCAweDk0LAorICAweDdjLCAweDlkLCAweGQyLCAweDExLCAweDAxLCAweGMwLCAweDIxLCAweDFhLCAweDk0LCAweGVkLCAweGJhLCAweDk4LAorICAweGMzLCAweDMyLCAweGEwLCAweDg0LCAweGNiLCAweGE0LCAweDIwLCAweDJiLCAweDJkLCAweDFjLCAweDE5LCAweGMxLAorICAweDYyLCAweGU4LCAweDI2LCAweGFjLCAweDA5LCAweGFkLCAweDRhLCAweDBkLCAweGQ3LCAweGFkLCAweGZlLCAweGJmLAorICAweDM1LCAweDhmLCAweGI1LCAweDQ3LCAweDUyLCAweDc5LCAweDk2LCAweGFkLCAweGUzLCAweGE2LCAweGUyLCAweDhmLAorICAweDM5LCAweGZiLCAweDZlLCAweGM1LCAweDcyLCAweGY2LCAweDE0LCAweGQ2LCAweDkyLCAweDc2LCAweDlkLCAweDg1LAorICAweGU2LCAweGQ5LCAweGM0LCAweGU3LCAweDA4LCAweGRiLCAweDc1LCAweGI3LCAweDAzLCAweDRhLCAweDM1LCAweDgzLAorICAweDRlLCAweDVmLCAweDE4LCAweGY4LCAweDE1LCAweDBjLCAweGJmLCAweDk1LCAweDRlLCAweDM2LCAweDdlLCAweGFhLAorICAweDYxLCAweDdiLCAweGYzLCAweGU3LCAweGM2LCAweGM3LCAweDU2LCAweDM2LCAweDRjLCAweGI5LCAweGVmLCAweDc3LAorICAweGJhLCAweDk5LCAweDVjLCAweDllLCAweGFjLCAweGYzLCAweGJjLCAweGEyLCAweGZiLCAweGQ4LCAweDU5LCAweDZjLAorICAweDVhLCAweDA1LCAweDUyLCAweGJmLCAweDMzLCAweDQ4LCAweGQ1LCAweGYzLCAweDk3LCAweDg2LCAweGZkLCAweGQ3LAorICAweDE1LCAweDViLCAweGU1LCAweGU2LCAweDA0LCAweDA0LCAweGYxLCAweDhkLCAweGEzLCAweDEwLCAweDAxLCAweGJhLAorICAweGE3LCAweGEzLCAweDFiLCAweDRiLCAweDZlLCAweGFlLCAweGFmLCAweDJmLCAweDA1LCAweDA2LCAweGRmLCAweDJiLAorICAweGQyLCAweDFiLCAweDg5LCAweGM5LCAweDhlLCAweGNhLCAweDE5LCAweDJhLCAweGFhLCAweGQyLCAweDU4LCAweDc3LAorICAweDRiLCAweDIzLCAweDViLCAweDFjLCAweDYxLCAweDA0LCAweDdhLCAweGUxLCAweGJkLCAweDQ3LCAweDc4LCAweGNkLAorICAweDljLCAweGY2LCAweDU1LCAweGY1LCAweGE2LCAweGI2LCAweDYwLCAweDkyLCAweDJlLCAweDI2LCAweDA4LCAweDE1LAorICAweDgzLCAweDMwLCAweDE2LCAweDUwLCAweDIxLCAweDVjLCAweDBmLCAweGZkLCAweDA2LCAweGQ1LCAweDA4LCAweDgwLAorICAweDM0LCAweDQ0LCAweGQ1LCAweDU2LCAweDc5LCAweGFhLCAweDgyLCAweDE2LCAweDU3LCAweDZiLCAweDNlLCAweDNjLAorICAweGZhLCAweGVjLCAweDYwLCAweGJmLCAweDM2LCAweDM5LCAweDc4LCAweGM1LCAweGRjLCAweGRkLCAweDIzLCAweGU5LAorICAweDYyLCAweDc1LCAweDk3LCAweDc0LCAweDBkLCAweGViLCAweGUzLCAweDY4LCAweDk4LCAweDJkLCAweGMyLCAweDk3LAorICAweDVlLCAweDY5LCAweDcyLCAweGQxLCAweGIyLCAweDMzLCAweGE3LCAweDdjLCAweDdhLCAweDUxLCAweDk1LCAweDQxLAorICAweDM5LCAweDRkLCAweGIxLCAweDQxLCAweGMxLCAweDA0LCAweDEwLCAweDM4LCAweDg0LCAweDA0LCAweDIxLCAweDI1LAorICAweGQ1LCAweDQ1LCAweDk0LCAweGEwLCAweDQ4LCAweGZmLCAweDQwLCAweDE3LCAweGM4LCAweDZhLCAweDczLCAweGZjLAorICAweDVjLCAweDc1LCAweDRiLCAweDM5LCAweDc5LCAweDU2LCAweGFiLCAweGQ0LCAweDNkLCAweDhiLCAweGFkLCAweDU4LAorICAweGIxLCAweGQ5LCAweDgzLCAweGYzLCAweGNjLCAweGUxLCAweGI5LCAweGI2LCAweDQ1LCAweGM1LCAweGRkLCAweDMxLAorICAweDYzLCAweGM3LCAweDRjLCAweDFiLCAweDY3LCAweDkxLCAweDJlLCAweDdlLCAweDlmLCAweGE5LCAweDQ1LCAweDIzLAorICAweGYxLCAweDFjLCAweDcyLCAweDllLCAweDIzLCAweDZhLCAweGMzLCAweDEyLCAweDg4LCAweDczLCAweDIzLCAweDMzLAorICAweGUwLCAweGQ2LCAweDA4LCAweDg2LCAweDQwLCAweDNhLCAweDRlLCAweDhlLCAweGM0LCAweGJhLCAweDM1LCAweDIyLAorICAweDcyLCAweDlhLCAweDJhLCAweDU1LCAweDUwLCAweDU2LCAweDA2LCAweDQ5LCAweDIxLCAweDM3LCAweDJhLCAweDI1LAorICAweGY1LCAweDYxLCAweGMwLCAweGZkLCAweDllLCAweGVkLCAweDE3LCAweDVjLCAweDUxLCAweDFjLCAweDYxLCAweGMwLAorICAweDIxLCAweDFhLCAweDk0LCAweGNkLCAweGEyLCAweDg5LCAweDY5LCAweGEyLCAweGIwLCAweGQ0LCAweDQ4LCAweDYxLAorICAweDI4LCAweDYyLCAweDMyLCAweGU0LCAweDRhLCAweDQxLCAweGEyLCAweDI1LCAweDVkLCAweGEwLCAweGNiLCAweDJjLAorICAweDBjLCAweDRhLCAweDgwLCAweDI3LCAweDA2LCAweGMwLCAweDQ3LCAweDAxLCAweGNjLCAweDU1LCAweDEwLCAweDdkLAorICAweDRhLCAweGVhLCAweDY2LCAweDgwLCAweGU5LCAweGNhLCAweDgxLCAweDU0LCAweDg5LCAweDYyLCAweDkxLCAweDJhLAorICAweDRjLCAweDJmLCAweDA4LCAweGFhLCAweGU1LCAweDA1LCAweDBlLCAweDQ2LCAweDUzLCAweDU0LCAweDU3LCAweDE5LAorICAweGI5LCAweDY1LCAweDYxLCAweDY0LCAweGFkLCAweDYxLCAweDM4LCAweDcwLCAweGVkLCAweGVkLCAweDk1LCAweDFiLAorICAweDQ3LCAweGYwLCAweGM4LCAweGZiLCAweDM3LCAweDNiLCAweGE2LCAweDBhLCAweDk0LCAweDVkLCAweDk3LCAweDM0LAorICAweDk0LCAweGMxLCAweDg0LCAweGNmLCAweDFhLCAweGRkLCAweGJhLCAweDhlLCAweGIwLCAweDA0LCAweDAzLCAweDRiLAorICAweGQxLCAweDRiLCAweDc3LCAweDVmLCAweGI2LCAweDUyLCAweGJlLCAweGU4LCAweDkwLCAweGUwLCAweDcxLCAweGJjLAorICAweDgxLCAweDg0LCAweDY4LCAweDVmLCAweDk0LCAweGZjLCAweDQ3LCAweGU3LCAweDM5LCAweGIzLCAweDVhLCAweDY2LAorICAweDU1LCAweDJiLCAweDY2LCAweGEzLCAweGE1LCAweDcyLCAweDdhLCAweDEyLCAweGU0LCAweDI2LCAweDVkLCAweGE0LAorICAweDRiLCAweDM0LCAweGNhLCAweGFhLCAweDM3LCAweGI0LCAweGMyLCAweDhjLCAweGQwLCAweDBiLCAweDljLCAweDEzLAorICAweDRmLCAweDhmLCAweDlkLCAweDFiLCAweGQxLCAweDNiLCAweDM3LCAweDIzLCAweGM3LCAweGIwLCAweDU1LCAweDhjLAorICAweDllLCAweDVlLCAweGVkLCAweDgxLCAweGJlLCAweDBhLCAweGNkLCAweDUwLCAweDc5LCAweDJkLCAweDVhLCAweGMwLAorICAweGUwLCAweGQ3LCAweDY3LCAweDE2LCAweDkxLCAweDkzLCAweDRiLCAweDU2LCAweGE2LCAweGI5LCAweDgwLCAweDVlLAorICAweDJhLCAweGEwLCAweDJjLCAweDJiLCAweDU3LCAweDBiLCAweDRhLCAweDUxLCAweDkxLCAweDJkLCAweDUzLCAweDllLAorICAweDZjLCAweDcyLCAweGYyLCAweGJiLCAweGRlLCAweDgwLCAweDEwLCAweDAxLCAweDYwLCAweDNiLCAweDE2LCAweDNiLAorICAweDU1LCAweDZiLCAweGE4LCAweGIyLCAweDE2LCAweGVhLCAweDgxLCAweDNiLCAweDkxLCAweDRkLCAweDFjLCAweDBmLAorICAweDk0LCAweGU2LCAweDgxLCAweGQyLCAweDUxLCAweDkxLCAweDljLCAweDFhLCAweGQ1LCAweDA4LCAweGQzLCAweDc2LAorICAweDNkLCAweDA3LCAweGJmLCAweGFiLCAweDVjLCAweGI2LCAweDI1LCAweDIzLCAweDkwLCAweGY0LCAweDIzLCAweDY0LAorICAweDhkLCAweDEwLCAweDkyLCAweDE3LCAweDkwLCAweDIzLCAweDBiLCAweDZiLCAweDg4LCAweDZhLCAweGJkLCAweGY3LAorICAweDBhLCAweDQ2LCAweDYwLCAweDk5LCAweGE3LCAweGIxLCAweDI4LCAweDQ4LCAweDEwLCAweGExLCAweDJiLCAweDdhLAorICAweDRhLCAweDk2LCAweGRhLCAweDU1LCAweDEzLCAweGFlLCAweDQ1LCAweDE2LCAweDkyLCAweGVhLCAweGQzLCAweDA5LAorICAweDcyLCAweGFmLCAweDUwLCAweDY4LCAweGVmLCAweGYyLCAweDU4LCAweDFkLCAweGVhLCAweDYwLCAweGIwLCAweDg5LAorICAweDhiLCAweDVkLCAweDYzLCAweDA5LCAweGUyLCAweGQzLCAweDdmLCAweGI1LCAweGYxLCAweGY4LCAweDc5LCAweDMzLAorICAweDdhLCAweDIzLCAweDA2LCAweDJiLCAweDJjLCAweGJkLCAweDQ3LCAweDZkLCAweDkyLCAweDM1LCAweDMxLCAweDc0LAorICAweDhhLCAweDY5LCAweDc0LCAweDk0LCAweGM1LCAweDY5LCAweDEwLCAweDQ0LCAweGQxLCAweDcyLCAweDM1LCAweDYyLAorICAweDk2LCAweDZkLCAweDliLCAweDc5LCAweGZmLCAweGRiLCAweGZkLCAweGZmLCAweGRmLCAweGZlLCAweDZmLCAweGNmLAorICAweGYxLCAweGZhLCAweDNjLCAweDMzLCAweGI4LCAweDMxLCAweGMwLCAweDIxLCAweDFhLCAweDhmLCAweDc4LCAweDRlLAorICAweDBmLCAweGNmLCAweGZmLCAweDNiLCAweDRmLCAweGIwLCAweGQxLCAweDE4LCAweGM0LCAweDIxLCAweDcyLCAweDE5LAorICAweDllLCAweDcyLCAweDY1LCAweGU1LCAweDU1LCAweDkyLCAweGEyLCAweGU1LCAweDQ5LCAweDVhLCAweDZiLCAweGFkLAorICAweGUwLCAweDY5LCAweGQ1LCAweDg1LCAweDkzLCAweGZlLCAweDBmLCAweGYyLCAweDczLCAweDdmLCAweGEyLCAweGU5LAorICAweDVmLCAweGQwLCAweGZiLCAweGRmLCAweGZmLCAweGZhLCAweDI5LCAweGFlLCAweDQ3LCAweDViLCAweDgzLCAweGZlLAorICAweGJjLCAweDMyLCAweGY3LCAweGZhLCAweDc3LCAweDk2LCAweGM3LCAweGM5LCAweGJhLCAweGIwLCAweGE2LCAweDk2LAorICAweDU0LCAweDZkLCAweGFlLCAweDZhLCAweGY1LCAweDA2LCAweDZlLCAweDA1LCAweGM1LCAweDc0LCAweDViLCAweDg4LAorICAweGQ1LCAweGQ4LCAweGVlLCAweGYwLCAweDc1LCAweGUwLCAweGNjLCAweDJlLCAweDMxLCAweDM1LCAweDRkLCAweDI2LAorICAweDViLCAweDUwLCAweGEwLCAweGQ2LCAweGRlLCAweGVkLCAweDJjLCAweGU1LCAweDU1LCAweGVlLCAweGEyLCAweDk0LAorICAweDY5LCAweDc3LCAweGI5LCAweDgyLCAweGFiLCAweDY0LCAweDJjLCAweGU2LCAweGQyLCAweGYyLCAweDUwLCAweDA3LAorICAweDUzLCAweDE0LCAweDNjLCAweGNlLCAweDBjLCAweGFkLCAweDgzLCAweDA5LCAweGFjLCAweDkzLCAweGY3LCAweGQ3LAorICAweGY1LCAweDJmLCAweDBmLCAweDhmLCAweDliLCAweGJlLCAweGMzLCAweGRhLCAweDkxLCAweDYwLCAweDE0LCAweDEyLAorICAweDk4LCAweGZlLCAweDYwLCAweGJiLCAweGM5LCAweDI4LCAweDUzLCAweDViLCAweDU3LCAweGNhLCAweDMwLCAweGM3LAorICAweDFkLCAweGI5LCAweDc0LCAweDIzLCAweDM5LCAweDc4LCAweDQyLCAweDAwLCAweGE3LCAweGQzLCAweDQxLCAweDZiLAorICAweGZlLCAweGYyLCAweDhlLCAweDc3LCAweDM4LCAweDUwLCAweDU4LCAweDEwLCAweGU1LCAweGFkLCAweGZiLCAweGFhLAorICAweGVmLCAweDkxLCAweDM0LCAweGIzLCAweDU2LCAweDkxLCAweDk4LCAweGFhLCAweGY2LCAweDkwLCAweDExLCAweDAwLAorICAweDE0LCAweDQ0LCAweDMxLCAweDcyLCAweGRmLCAweGI3LCAweDk0LCAweDE4LCAweDZmLCAweDAwLCAweDk5LCAweGE0LAorICAweDU5LCAweGQ4LCAweDc2LCAweDQ0LCAweDA4LCAweDEwLCAweDgyLCAweDAxLCAweDQwLCAweDkwLCAweDgwLCAweDI0LAorICAweDEwLCAweDEwLCAweDk4LCAweDQ2LCAweDQ2LCAweDM3LCAweDdjLCAweGQ3LCAweGI3LCAweDY4LCAweDhkLCAweDU3LAorICAweGM1LCAweDNjLCAweDlhLCAweDY4LCAweDE2LCAweGNlLCAweDk5LCAweDcwLCAweGM3LCAweDZlLCAweDE5LCAweDJkLAorICAweGUzLCAweGJjLCAweGQ3LCAweGFjLCAweDllLCAweDJlLCAweGEyLCAweGFmLCAweDZjLCAweGMxLCAweDYxLCAweDNmLAorICAweDJmLCAweGYwLCAweGY2LCAweDM4LCAweDNlLCAweGM3LCAweDhiLCAweGQzLCAweDczLCAweDdiLCAweDJmLCAweGFlLAorICAweGM5LCAweDgwLCAweGY1LCAweGM3LCAweGMyLCAweDkyLCAweDA2LCAweDQzLCAweGE0LCAweDdjLCAweDU5LCAweDA4LAorICAweDZkLCAweGJlLCAweDdiLCAweGIyLCAweGM4LCAweDAwLCAweDFmLCAweDFjLCAweGI2LCAweGJjLCAweGY0LCAweDZjLAorICAweDQ5LCAweGY2LCAweDczLCAweDBiLCAweDM3LCAweGNjLCAweDE5LCAweDI5LCAweDYzLCAweGIxLCAweGRmLCAweDdmLAorICAweDk0LCAweGM0LCAweDM4LCAweGM3LCAweGZmLCAweDcyLCAweGMwLCAweDM1LCAweGQ3LCAweDY0LCAweDNiLCAweDEwLAorICAweGY0LCAweGM0LCAweDczLCAweGNjLCAweDcwLCAweDNjLCAweGMxLCAweGM4LCAweDI5LCAweGNjLCAweGMzLCAweDQ5LAorICAweGI5LCAweGI3LCAweGU2LCAweDExLCAweGEzLCAweGU5LCAweGE1LCAweGVhLCAweDhlLCAweDViLCAweGQ5LCAweGJjLAorICAweDc2LCAweDdjLCAweGUzLCAweDcwLCAweDYyLCAweDMzLCAweGVmLCAweDAzLCAweDE1LCAweDBkLCAweGY3LCAweDU3LAorICAweDcwLCAweDJiLCAweGQ1LCAweDc1LCAweDQ5LCAweDMwLCAweDA4LCAweDc4LCAweGRkLCAweDkyLCAweDIwLCAweDVkLAorICAweGZhLCAweGM2LCAweGUzLCAweDZhLCAweGUyLCAweDYwLCAweDAwLCAweDYyLCAweDAwLCAweGQ3LCAweGI1LCAweGE4LAorICAweGE0LCAweDAzLCAweDA3LCAweDIxLCAweDFhLCAweDhmLCAweGQwLCAweDA3LCAweDBhLCAweDAwLCAweDBmLCAweDQzLAorICAweDRiLCAweDgzLCAweGQwLCAweDk4LCAweGMzLCAweDA3LCAweDBhLCAweGU3LCAweDRiLCAweDhhLCAweDcyLCAweGI4LAorICAweDQ2LCAweDg1LCAweDVkLCAweGFkLCAweGU3LCAweDE4LCAweDNhLCAweDc0LCAweDBlLCAweDdiLCAweGNkLCAweDczLAorICAweDZmLCAweDJjLCAweGY1LCAweGQyLCAweDVkLCAweDc3LCAweGU4LCAweGJmLCAweDdiLCAweGM5LCAweDg1LCAweGRiLAorICAweDZkLCAweDIzLCAweDc1LCAweDQ3LCAweDU1LCAweDViLCAweDgwLCAweDkwLCAweGNiLCAweDVkLCAweDg1LCAweDQ4LAorICAweGRiLCAweGM5LCAweDhkLCAweDU1LCAweGM3LCAweDVkLCAweGEzLCAweGI3LCAweGE1LCAweGUwLCAweGMwLCAweGZjLAorICAweGViLCAweDA2LCAweGQxLCAweGVkLCAweDNmLCAweGVkLCAweDM2LCAweGRiLCAweGFmLCAweGJhLCAweGRmLCAweDQzLAorICAweDg3LCAweGI5LCAweGM1LCAweDdkLCAweGY0LCAweDA3LCAweDFkLCAweGM3LCAweDc5LCAweDRhLCAweDlkLCAweDI1LAorICAweDE4LCAweDhkLCAweDFkLCAweGQ3LCAweGE3LCAweDNkLCAweDkyLCAweDM3LCAweDc1LCAweDIwLCAweDlhLCAweDg1LAorICAweGQwLCAweGU5LCAweDk0LCAweDA2LCAweGU0LCAweGFjLCAweGU2LCAweGFlLCAweDk2LCAweGZkLCAweDU1LCAweDc3LAorICAweGYzLCAweDcxLCAweDBiLCAweDFjLCAweGU0LCAweDNhLCAweDFlLCAweGRmLCAweGVlLCAweGM2LCAweGQwLCAweDIwLAorICAweDFjLCAweDFlLCAweDBjLCAweDdhLCAweDdmLCAweDZjLCAweGZiLCAweGIzLCAweGYyLCAweDljLCAweGQ0LCAweGJkLAorICAweDg1LCAweDlmLCAweGNiLCAweDJmLCAweGRiLCAweDgxLCAweDEwLCAweDhkLCAweGQyLCAweDAwLCAweDRiLCAweDQ3LAorICAweDNkLCAweDJmLCAweGRlLCAweDNkLCAweDNhLCAweGRmLCAweDg4LCAweDE3LCAweDg1LCAweDY5LCAweGUyLCAweDMyLAorICAweGQ3LCAweGZkLCAweGI2LCAweDEwLCAweDU2LCAweDcwLCAweDQyLCAweGFiLCAweDQ1LCAweGQyLCAweGRjLCAweDA1LAorICAweGU2LCAweDAwLCAweDdjLCAweGI0LCAweDJmLCAweDY2LCAweGRmLCAweGJjLCAweDVmLCAweDJmLCAweGQ3LCAweGZjLAorICAweDQ0LCAweDAyLCAweDZhLCAweGUxLCAweDQ2LCAweDgxLCAweGIxLCAweDUwLCAweGMyLCAweDYxLCAweGI3LCAweDc2LAorICAweGM5LCAweDhiLCAweGM0LCAweDhiLCAweDVhLCAweDZiLCAweDI2LCAweDkwLCAweDAxLCAweGFmLCAweGE4LCAweDE5LAorICAweDEzLCAweDRhLCAweGMwLCAweGIxLCAweDAxLCAweDFkLCAweDY3LCAweGU2LCAweDM2LCAweGQ2LCAweDVmLCAweGQ4LAorICAweDdiLCAweGNlLCAweDkyLCAweDQ1LCAweGI3LCAweDMyLCAweGRjLCAweDY3LCAweDllLCAweGFjLCAweDk4LCAweGNkLAorICAweDk3LCAweGEyLCAweGQyLCAweDdmLCAweDNmLCAweGI2LCAweDIyLCAweDhhLCAweGI3LCAweGU2LCAweGU2LCAweGFiLAorICAweDhlLCAweDYzLCAweDRhLCAweGFmLCAweGY2LCAweGJmLCAweDEzLCAweGJjLCAweGU1LCAweDQyLCAweDZkLCAweGY4LAorICAweGRiLCAweGExLCAweGJhLCAweDg1LCAweDQxLCAweGFlLCAweGI0LCAweDQwLCAweDIzLCAweDAwLCAweDhhLCAweDYxLAorICAweDQ3LCAweDE4LCAweDcxLCAweDQwLCAweDllLCAweDI3LCAweDNhLCAweGZkLCAweDRmLCAweDVkLCAweGJjLCAweGVmLAorICAweDFjLCAweDdiLCAweDA5LCAweGM2LCAweGFlLCAweDZmLCAweDk4LCAweGFhLCAweGEzLCAweDAxLCAweGYwLCAweDlhLAorICAweDg2LCAweDgxLCAweDk1LCAweGIzLCAweGNhLCAweGQ2LCAweGIxLCAweDIyLCAweDg4LCAweDkwLCAweDI1LCAweGY2LAorICAweDViLCAweDBhLCAweDRiLCAweDcxLCAweDQwLCAweDIxLCAweGI1LCAweDZjLCAweGQyLCAweDkxLCAweDI3LCAweDhjLAorICAweDQ0LCAweGNlLCAweDVhLCAweDY0LCAweDgxLCAweDZkLCAweDA2LCAweDMwLCAweDBhLCAweDgxLCAweDk0LCAweDFmLAorICAweDc4LCAweDZjLCAweDdlLCAweDgxLCAweDNmLCAweGY0LCAweGI3LCAweDUzLCAweDUzLCAweGQzLCAweDJjLCAweDk3LAorICAweDk0LCAweGI2LCAweDE1LCAweGUxLCAweDg2LCAweGJjLCAweDNhLCAweDVmLCAweGMzLCAweDZmLCAweDhjLCAweGFkLAorICAweDY3LCAweGUzLCAweDhiLCAweDY5LCAweDllLCAweDdiLCAweDFkLCAweGRhLCAweDJjLCAweDBhLCAweDJjLCAweGFiLAorICAweGNhLCAweGFmLCAweGZkLCAweGYyLCAweGUzLCAweGY3LCAweGRkLCAweDM0LCAweGMzLCAweDc2LCAweGQ3LCAweGQ1LAorICAweGRmLCAweGUzLCAweDlkLCAweGJiLCAweGUyLCAweGM5LCAweDAyLCAweDNkLCAweGRhLCAweDU3LCAweGU4LCAweGQ5LAorICAweDQzLCAweDY0LCAweGY3LCAweDJjLCAweGVjLCAweDRlLCAweDdkLCAweDhjLCAweGMyLCAweGVlLCAweDU4LCAweDYwLAorICAweDMwLCAweDllLCAweDA3LCAweGVhLCAweDJkLCAweGE3LCAweDA5LCAweDdhLCAweGYxLCAweGI1LCAweDQ4LCAweDcwLAorICAweDVkLCAweGFiLCAweDZhLCAweDZkLCAweDYxLCAweGI3LCAweGZlLCAweGMwLCAweDA3LCAweGNlLCAweDAxLCAweGYyLAorICAweGZkLCAweDYyLCAweGY5LCAweGJmLCAweGEwLCAweDAzLCAweDA3LCAweDIxLCAweDFhLCAweDhiLCAweGM4LCAweDA3LAorICAweDBjLCAweDAwLCAweDAxLCAweDNkLCAweDY2LCAweGE2LCAweGE5LCAweDE4LCAweDQzLCAweDE1LCAweDU2LCAweGYzLAorICAweGU4LCAweDA2LCAweGU4LCAweDE2LCAweDQzLCAweDgxLCAweGZhLCAweGY2LCAweGEyLCAweGY0LCAweDY4LCAweDE2LAorICAweGI2LCAweDc2LCAweDE1LCAweGYzLCAweDM0LCAweGM0LCAweGUxLCAweDVlLCAweDc4LCAweGMzLCAweDEwLCAweDk5LAorICAweDNiLCAweDBhLCAweDE3LCAweDI4LCAweGQ1LCAweDIwLCAweGUzLCAweGIzLCAweGE1LCAweGM2LCAweDRkLCAweDFhLAorICAweDRkLCAweDRmLCAweDFiLCAweDAyLCAweDk4LCAweGIwLCAweDMyLCAweGMzLCAweDY1LCAweDYxLCAweGNjLCAweDNhLAorICAweGNmLCAweDkwLCAweDZmLCAweDJjLCAweDAwLCAweDM0LCAweGE1LCAweGViLCAweGI0LCAweGEzLCAweGYwLCAweDM3LAorICAweDQ5LCAweDE5LCAweDIwLCAweDJlLCAweGU3LCAweDc4LCAweDA2LCAweDE2LCAweDEwLCAweDI3LCAweDM1LCAweDRhLAorICAweGYzLCAweDg1LCAweGYyLCAweDc3LCAweDc0LCAweGIzLCAweDZmLCAweGFmLCAweDJjLCAweGNhLCAweGM4LCAweDk3LAorICAweDE4LCAweDRhLCAweDYxLCAweDVhLCAweDlmLCAweDUxLCAweDI1LCAweDk0LCAweGE5LCAweGM1LCAweDcyLCAweGJlLAorICAweDFhLCAweDgzLCAweDFlLCAweDdjLCAweGQ5LCAweDkxLCAweGI1LCAweGEyLCAweDQ3LCAweDIxLCAweDg2LCAweDQ5LAorICAweGQ4LCAweDI3LCAweDk1LCAweDEwLCAweDM4LCAweDhlLCAweDE4LCAweDk4LCAweDgyLCAweGY2LCAweDhjLCAweDc4LAorICAweGQ0LCAweGIyLCAweGM4LCAweGVlLCAweGE4LCAweDg0LCAweGJiLCAweGY2LCAweGQ2LCAweDlkLCAweDY1LCAweDQ5LAorICAweGY3LCAweDllLCAweDExLCAweDI3LCAweDgzLCAweDk0LCAweDE0LCAweDkyLCAweGI0LCAweDgwLCAweDAwLCAweDAwLAorICAweDkzLCAweDUxLCAweDU2LCAweDhjLCAweDBkLCAweGFkLCAweGJiLCAweDAyLCAweDZlLCAweGUwLCAweGMzLCAweDgyLAorICAweDAwLCAweDUwLCAweGE0LCAweDMxLCAweDUwLCAweDllLCAweDFjLCAweGQ4LCAweDRkLCAweGVhLCAweGIyLCAweGQwLAorICAweGJkLCAweDY0LCAweGIwLCAweDIyLCAweDY5LCAweGQwLCAweDFmLCAweDZlLCAweDQ5LCAweDJiLCAweDU0LCAweGM3LAorICAweDk4LCAweGRkLCAweDZiLCAweDRmLCAweGFhLCAweDYyLCAweDUyLCAweDg5LCAweGYzLCAweGIxLCAweGEwLCAweDM5LAorICAweGM4LCAweDQ1LCAweDQ1LCAweGJkLCAweDcyLCAweGM1LCAweDEwLCAweGJkLCAweGFkLCAweGJhLCAweDYzLCAweGJhLAorICAweGIwLCAweDUxLCAweDY3LCAweDk5LCAweGIxLCAweDM0LCAweDc3LCAweGU0LCAweGI2LCAweDc4LCAweDFjLCAweDM1LAorICAweDA4LCAweGZiLCAweGZhLCAweDAxLCAweDcyLCAweDYxLCAweDk1LCAweDM4LCAweDNjLCAweDViLCAweGMwLCAweDM0LAorICAweDM2LCAweGRhLCAweGZlLCAweDRiLCAweDg4LCAweGRlLCAweDk5LCAweDRhLCAweDZkLCAweDMwLCAweDBhLCAweDhkLAorICAweDY1LCAweDNmLCAweDdlLCAweGFhLCAweDRmLCAweDQzLCAweDBjLCAweDE4LCAweGIwLCAweDRjLCAweDMyLCAweDg0LAorICAweDcyLCAweDczLCAweGY2LCAweDAzLCAweGRjLCAweGY5LCAweDA4LCAweGIyLCAweDAzLCAweDIyLCAweGNjLCAweGExLAorICAweDA3LCAweDYzLCAweGIzLCAweDQ1LCAweDg1LCAweDM1LCAweGYxLCAweDNmLCAweGIxLCAweGExLCAweDUwLCAweDZiLAorICAweDc1LCAweDBmLCAweDBhLCAweDFhLCAweDg4LCAweDlmLCAweDViLCAweDRkLCAweGRhLCAweGUyLCAweDIyLCAweDc1LAorICAweGNlLCAweDA5LCAweGRmLCAweGFmLCAweDQwLCAweGI3LCAweGVmLCAweDQ3LCAweDZhLCAweDQ4LCAweDQzLCAweDdlLAorICAweGE3LCAweDBhLCAweGQxLCAweDUxLCAweGUzLCAweGE1LCAweGJjLCAweDhiLCAweDFiLCAweDlmLCAweDgyLCAweDg1LAorICAweGQwLCAweDQxLCAweDA1LCAweGIwLCAweDgzLCAweGEyLCAweDMwLCAweDczLCAweDAyLCAweDQ0LCAweDAwLCAweDhlLAorICAweDJiLCAweGYxLCAweGJjLCAweGNhLCAweDgyLCAweGQ4LCAweDc2LCAweGFkLCAweDExLCAweDRmLCAweDQ1LCAweGYxLAorICAweDdmLCAweDhmLCAweDQzLCAweGRjLCAweDAwLCAweGUwLCAweDIxLCAweDFhLCAweDhiLCAweGMwLCAweDBmLCAweDhmLAorICAweDQxLCAweGNmLCAweDQzLCAweDUyLCAweDY0LCAweDEwLCAweGM1LCAweGFhLCAweGUzLCAweDE2LCAweDI1LCAweDE1LAorICAweDA2LCAweDZhLCAweGMyLCAweGNiLCAweDNlLCAweGIzLCAweDA1LCAweGJhLCAweGMwLCAweDA3LCAweGNjLCAweGE4LAorICAweDMyLCAweDNjLCAweDBlLCAweGZlLCAweDM2LCAweGUzLCAweGQ4LCAweGI5LCAweDYyLCAweDRmLCAweDQxLCAweGMyLAorICAweDYwLCAweDk3LCAweDk5LCAweDkxLCAweGY0LCAweDJlLCAweDI3LCAweGEwLCAweGNiLCAweDQyLCAweGE4LCAweGM5LAorICAweGQzLCAweDMwLCAweGQ5LCAweGQzLCAweGNiLCAweDMzLCAweDAwLCAweDUzLCAweDNjLCAweDYzLCAweGM1LCAweDIxLAorICAweDBiLCAweGY4LCAweDNiLCAweDgwLCAweDU2LCAweDU5LCAweDA2LCAweDc2LCAweGFhLCAweDQ1LCAweDk3LCAweDA4LAorICAweGY2LCAweDZkLCAweGZjLCAweDg3LCAweDZmLCAweDZmLCAweGE1LCAweDFhLCAweGFjLCAweDdhLCAweDJjLCAweDcyLAorICAweGRkLCAweDU0LCAweDdhLCAweDcxLCAweGQwLCAweGY4LCAweDc4LCAweGNmLCAweDdkLCAweGFhLCAweDk3LCAweDlhLAorICAweGM4LCAweDA1LCAweGJjLCAweDBkLCAweDEwLCAweGU2LCAweDFhLCAweGVmLCAweDNlLCAweGNmLCAweGM1LCAweGIzLAorICAweGRjLCAweDMyLCAweGJiLCAweDYzLCAweGMwLCAweDA3LCAweDQxLCAweDRmLCAweGMwLCAweGVmLCAweDM4LCAweDY5LAorICAweDhkLCAweDU4LCAweDcyLCAweDZmLCAweGMwLCAweGNhLCAweDI0LCAweDAzLCAweGUwLCAweGEwLCAweDQ1LCAweDkyLAorICAweGQ0LCAweDQ5LCAweDI4LCAweGQ4LCAweDAwLCAweDE2LCAweDYxLCAweDk0LCAweDJjLCAweGNkLCAweDI0LCAweGZmLAorICAweDk0LCAweGZlLCAweDM5LCAweGE1LCAweDQyLCAweDIzLCAweGU3LCAweDJkLCAweDE2LCAweGI0LCAweGZmLCAweDU1LAorICAweDc3LCAweGZlLCAweGY3LCAweGMxLCAweGE2LCAweDhlLCAweDI2LCAweGYwLCAweDg1LCAweGU4LCAweDAwLCAweDA1LAorICAweGI5LCAweGU0LCAweDBlLCAweDNlLCAweDExLCAweDgwLCAweDUyLCAweGUwLCAweDRmLCAweGRjLCAweDEwLCAweDkwLAorICAweDMxLCAweDIyLCAweDA0LCAweDQ2LCAweDQyLCAweDE0LCAweDlhLCAweDczLCAweDlhLCAweDM3LCAweDc0LCAweDQzLAorICAweDc3LCAweGM1LCAweDIwLCAweGUwLCAweDU5LCAweDNhLCAweDBkLCAweDY4LCAweDE1LCAweDJkLCAweGE3LCAweGE0LAorICAweDU5LCAweGVjLCAweDc1LCAweGFhLCAweDczLCAweDc4LCAweDE3LCAweGRkLCAweDMxLCAweGQ3LCAweGM2LCAweGU5LAorICAweDA5LCAweGJkLCAweGY0LCAweDc5LCAweDYyLCAweDFmLCAweDcyLCAweDRlLCAweDZmLCAweGJiLCAweGEwLCAweDUzLAorICAweGM1LCAweDRjLCAweDY4LCAweDNkLCAweDZlLCAweDdkLCAweDU3LCAweDIzLCAweGM3LCAweDMyLCAweGI0LCAweDM2LAorICAweGVjLCAweDJmLCAweDBhLCAweGYxLCAweGRhLCAweDczLCAweDk5LCAweGJmLCAweGNkLCAweDE5LCAweDM5LCAweDhjLAorICAweDRjLCAweDIwLCAweGFlLCAweGY1LCAweDQwLCAweDg1LCAweGRhLCAweDMyLCAweGI3LCAweGY0LCAweDY4LCAweDNlLAorICAweDk4LCAweDk0LCAweDRjLCAweDEyLCAweDFmLCAweGE0LCAweGY2LCAweDA0LCAweDU3LCAweDQ3LCAweDFiLCAweGNhLAorICAweGZhLCAweGE4LCAweDhkLCAweDk4LCAweDRjLCAweDk5LCAweDkyLCAweGM5LCAweDkyLCAweDEwLCAweDBiLCAweDA5LAorICAweDBjLCAweGFiLCAweGU5LCAweDc1LCAweGQ3LCAweDk0LCAweDgxLCAweGFjLCAweDQ1LCAweDg3LCAweGYwLCAweGM0LAorICAweGFjLCAweDc1LCAweGI0LCAweGM1LCAweDNiLCAweDQ1LCAweDhlLCAweGRjLCAweDk0LCAweGU1LCAweGQyLCAweDY1LAorICAweGMzLCAweGU5LCAweGVlLCAweDljLCAweDQwLCAweDI1LCAweGI1LCAweDE5LCAweDEyLCAweDY4LCAweGQ4LCAweDlkLAorICAweGEyLCAweDQ1LCAweDg0LCAweDIyLCAweDE0LCAweDhkLCAweDQ3LCAweDI4LCAweGU5LCAweDdiLCAweGFhLCAweDZiLAorICAweDViLCAweGMyLCAweDM0LCAweDhjLCAweGUwLCAweDYwLCAweDBhLCAweDhjLCAweDc3LCAweDA3LCAweDIxLCAweDFhLAorICAweDhmLCAweGQ2LCAweDFmLCAweGNmLCAweGU3LCAweGZiLCAweDM3LCAweDY2LCAweGE1LCAweDU4LCAweDY4LCAweDUwLAorICAweDc0LCAweDExLCAweGI5LCAweDRhLCAweDczLCAweDNhLCAweGFkLCAweGRkLCAweGE5LCAweDBhLCAweGQ1LCAweDRiLAorICAweDU1LCAweGMyLCAweDE3LCAweDgzLCAweDRlLCAweGEwLCAweDZhLCAweGZjLCAweGJjLCAweGRhLCAweGUwLCAweGZlLAorICAweDk3LCAweGQ1LCAweDEyLCAweDY4LCAweDFjLCAweDFiLCAweGRmLCAweDlkLCAweDIxLCAweDE4LCAweDdkLCAweGE1LAorICAweDc1LCAweGM0LCAweDZhLCAweDJhLCAweDBhLCAweDc4LCAweDQzLCAweDBkLCAweGQxLCAweDkyLCAweDQ5LCAweDAwLAorICAweGIxLCAweDk0LCAweDZlLCAweGEwLCAweDRhLCAweDZkLCAweDg0LCAweDk0LCAweDliLCAweGZjLCAweGQzLCAweDUzLAorICAweGFmLCAweDFjLCAweGY0LCAweGVlLCAweDMyLCAweGU1LCAweDJjLCAweDAxLCAweDQxLCAweGM1LCAweDE5LCAweGJiLAorICAweDgwLCAweGFiLCAweGRiLCAweGIyLCAweDVlLCAweDczLCAweDBiLCAweDkxLCAweGI0LCAweDg4LCAweGM2LCAweGUxLAorICAweDU5LCAweDc1LCAweDc3LCAweDlkLCAweGIxLCAweDc0LCAweDRlLCAweGFiLCAweDY0LCAweDZhLCAweGQxLCAweDM3LAorICAweGFkLCAweDkwLCAweGMzLCAweDhiLCAweDI4LCAweDZjLCAweDJhLCAweDkwLCAweDlkLCAweGJjLCAweDQyLCAweDk0LAorICAweDIwLCAweGMwLCAweGE0LCAweGJjLCAweDY5LCAweGQwLCAweDllLCAweDk1LCAweGZkLCAweDFhLCAweDY0LCAweDI5LAorICAweGViLCAweGE0LCAweGM2LCAweDhiLCAweGYxLCAweDQzLCAweDEwLCAweDUwLCAweDExLCAweDc5LCAweDA3LCAweGRmLAorICAweGZiLCAweGU3LCAweDUzLCAweDdiLCAweDU4LCAweDI2LCAweDczLCAweDA4LCAweDYzLCAweGE3LCAweDFlLCAweDVlLAorICAweGU1LCAweDk4LCAweGQ1LCAweDk3LCAweGFmLCAweGRiLCAweGY2LCAweDFjLCAweGMwLCAweDAwLCAweDA1LCAweDQ2LAorICAweGRjLCAweGYwLCAweDRlLCAweGZiLCAweDdhLCAweDg1LCAweDExLCAweDA5LCAweDM5LCAweDc3LCAweDg2LCAweDA3LAorICAweDEzLCAweDhlLCAweDlkLCAweGFkLCAweGE5LCAweDUyLCAweDM1LCAweDQwLCAweDBhLCAweDAwLCAweDAzLCAweDM0LAorICAweDUyLCAweGM2LCAweDRmLCAweDBiLCAweGEzLCAweDcyLCAweGYyLCAweGUxLCAweDAwLCAweDRkLCAweGRiLCAweDk4LAorICAweGEwLCAweDE4LCAweDE5LCAweDEwLCAweDQ2LCAweDgxLCAweDExLCAweDgwLCAweGM0LCAweDYwLCAweDI1LCAweDUzLAorICAweDk1LCAweGE4LCAweDY4LCAweGE2LCAweDc0LCAweDhkLCAweDIxLCAweDdhLCAweDM0LCAweGQzLCAweDQxLCAweDRkLAorICAweDQxLCAweGU1LCAweGE1LCAweGE2LCAweDE5LCAweDhkLCAweGNlLCAweDUwLCAweDI1LCAweDNmLCAweDRlLCAweGJiLAorICAweGM4LCAweGRiLCAweDJlLCAweDBiLCAweDRjLCAweGFlLCAweDU5LCAweDM1LCAweDVhLCAweDYxLCAweGE3LCAweDY3LAorICAweDQwLCAweGZlLCAweGVkLCAweGM0LCAweDNkLCAweGRhLCAweDNhLCAweDBlLCAweDFkLCAweDI1LCAweGUyLCAweDM5LAorICAweDM0LCAweDNiLCAweDRiLCAweDBkLCAweGNjLCAweDNlLCAweDkzLCAweGE1LCAweGZhLCAweGZjLCAweDNhLCAweDUxLAorICAweDVjLCAweDliLCAweDFlLCAweGI1LCAweGE5LCAweDAyLCAweGQwLCAweDQyLCAweGIyLCAweGNjLCAweDVlLCAweDc4LAorICAweDQxLCAweDllLCAweDA4LCAweGM3LCAweDBjLCAweGNmLCAweGU1LCAweDQzLCAweGJkLCAweGE5LCAweGQ1LCAweDAzLAorICAweGE1LCAweGI2LCAweGQxLCAweDk0LCAweDE4LCAweDMwLCAweDE4LCAweGNkLCAweDlkLCAweGZjLCAweGY5LCAweDNlLAorICAweDE2LCAweGE2LCAweDk0LCAweGQyLCAweGRhLCAweDU4LCAweDIwLCAweDYyLCAweGU3LCAweDNlLCAweDhjLCAweDYwLAorICAweDYwLCAweDI4LCAweDg5LCAweDEzLCAweDA1LCAweGViLCAweDI1LCAweGRiLCAweDc2LCAweGM0LCAweGJhLCAweDEyLAorICAweGY0LCAweGY5LCAweDNiLCAweDVlLCAweGJhLCAweDY0LCAweGI5LCAweGM2LCAweGNkLCAweGIyLCAweGQ1LCAweGU4LAorICAweDk3LCAweDk5LCAweDEyLCAweDZmLCAweDFmLCAweGU4LCAweDAwLCAweDA0LCAweGI3LCAweDYwLCAweDBlLCAweDIxLAorICAweDFhLCAweDk0LCAweGNkLCAweGM2LCAweDhmLCAweDAzLCAweDQxLCAweDk5LCAweDEwLCAweDYyLCAweDUxLCAweGNlLAorICAweGQ2LCAweGI4LCAweDcxLCAweGM4LCAweGI0LCAweDVhLCAweGQyLCAweDJjLCAweGJjLCAweDE2LCAweGUwLCAweDBkLAorICAweGZiLCAweGYwLCAweGJiLCAweGFjLCAweDg4LCAweDAzLCAweGRlLCAweGI1LCAweGY3LCAweGUxLCAweGEwLCAweDFiLAorICAweGFlLCAweGYxLCAweDVhLCAweGVkLCAweGRkLCAweGJlLCAweDc2LCAweDljLCAweGUyLCAweGU4LCAweDY0LCAweGQ5LAorICAweDNjLCAweGY1LCAweGIwLCAweGVhLCAweDdlLCAweDdlLCAweDRlLCAweGIxLCAweDdjLCAweDNkLCAweGQ1LCAweDNlLAorICAweDAyLCAweDVlLCAweDlkLCAweGNhLCAweDVmLCAweGEzLCAweDVjLCAweDgzLCAweDdkLCAweGYzLCAweDMzLCAweDAzLAorICAweDU2LCAweGYyLCAweDljLCAweDBiLCAweGRjLCAweDcxLCAweDE1LCAweDdjLCAweGRmLCAweDA2LCAweGEzLCAweGJlLAorICAweDBkLCAweDhlLCAweDEzLCAweGEzLCAweGIzLCAweDJkLCAweDM1LCAweGNkLCAweDY3LCAweDZhLCAweGVjLCAweDMzLAorICAweGZiLCAweGVmLCAweDk4LCAweDUwLCAweDE4LCAweGZiLCAweDA0LCAweGIxLCAweDRjLCAweDgwLCAweGM0LCAweGRkLAorICAweGE1LCAweDdiLCAweGFiLCAweDgzLCAweGIwLCAweGMxLCAweDQwLCAweDFiLCAweGU5LCAweDhmLCAweGIwLCAweDM0LAorICAweGVhLCAweDA5LCAweDA2LCAweDU1LCAweDRjLCAweDkwLCAweGFmLCAweGNjLCAweDQ0LCAweDg4LCAweDYwLCAweDQ0LAorICAweGEwLCAweGFkLCAweDk4LCAweDk0LCAweDllLCAweDk5LCAweDQyLCAweGQ3LCAweGU4LCAweGJiLCAweDhlLCAweGJhLAorICAweDhhLCAweGNlLCAweGU5LCAweDgxLCAweDVhLCAweGQ4LCAweGNkLCAweGNkLCAweDY4LCAweGFkLCAweDliLCAweDZjLAorICAweDU3LCAweDVlLCAweDg2LCAweGQxLCAweDI1LCAweDNjLCAweDM2LCAweGEwLCAweDAzLCAweGQxLCAweDE0LCAweDU3LAorICAweDk3LCAweDg5LCAweGQyLCAweGE1LCAweDcyLCAweGY4LCAweDI3LCAweGQ0LCAweGJlLCAweGU3LCAweGU3LCAweGViLAorICAweDU3LCAweDQzLCAweGY4LCAweGJkLCAweDFmLCAweGI5LCAweGFiLCAweDExLCAweDMwLCAweDU4LCAweGUwLCAweGE5LAorICAweDZiLCAweDU2LCAweGJkLCAweDc0LCAweGZiLCAweDE5LCAweGY1LCAweDM0LCAweGY5LCAweGNkLCAweGJlLCAweDlmLAorICAweDliLCAweDAzLCAweDVhLCAweDU3LCAweDlkLCAweGEzLCAweGEwLCAweGIwLCAweGI1LCAweGM4LCAweDc4LCAweGQ4LAorICAweDVkLCAweGNlLCAweDQzLCAweDdlLCAweGNlLCAweDM4LCAweDgxLCAweGIzLCAweDczLCAweGFhLCAweGE4LCAweGUxLAorICAweDJjLCAweDA0LCAweDg1LCAweDRkLCAweDQyLCAweGYxLCAweDgyLCAweGExLCAweDI5LCAweGVkLCAweDBhLCAweDZmLAorICAweDBkLCAweDU5LCAweDhjLCAweGQ5LCAweGQ2LCAweDAwLCAweDI2LCAweDY5LCAweDM2LCAweDQ4LCAweDJhLCAweDk0LAorICAweDA2LCAweDQxLCAweDAxLCAweDg4LCAweDgwLCAweGMyLCAweDQ2LCAweGUzLCAweDZkLCAweDYzLCAweDhhLCAweDI4LAorICAweDA3LCAweDBlLCAweGJhLCAweDc0LCAweDA1LCAweGJkLCAweDNiLCAweDNiLCAweGNlLCAweDgzLCAweDZlLCAweDliLAorICAweGZjLCAweDU1LCAweDYyLCAweGI1LCAweGU2LCAweGZhLCAweDhhLCAweGI2LCAweDFjLCAweDc0LCAweGI0LCAweDcyLAorICAweGM3LCAweGQzLCAweDU2LCAweGUyLCAweDlkLCAweDExLCAweDc2LCAweDVkLCAweGVhLCAweGM3LCAweDJkLCAweGJlLAorICAweDJhLCAweDA2LCAweGE2LCAweDcxLCAweDU0LCAweGUwLCAweDlmLCAweDhkLCAweGM0LCAweDM5LCAweGI2LCAweDk0LAorICAweDFkLCAweGYwLCAweDIwLCAweDcwLCAweGVjLCAweDYzLCAweDlkLCAweDc1LCAweDQwLCAweDVjLCAweDMxLCAweDRlLAorICAweDY0LCAweGIyLCAweGQ1LCAweGEyLCAweDMzLCAweDgzLCAweDdhLCAweDRlLCAweGExLCAweDdkLCAweDMzLCAweDE1LAorICAweGNiLCAweGZkLCAweGUzLCAweGUxLCAweGQ1LCAweGIwLCAweDVlLCAweGQ0LCAweGEzLCAweGExLCAweDFlLCAweDM1LAorICAweDAxLCAweGJlLCAweDZhLCAweDExLCAweDIxLCAweGMzLCAweDU0LCAweDhiLCAweDBmLCAweGRmLCAweGJhLCAweGM1LAorICAweDJkLCAweDE0LCAweDEzLCAweDAwLCAweGUwLCAweDIxLCAweDFhLCAweDk0LCAweGRkLCAweGNhLCAweDEyLCAweDgzLAorICAweDExLCAweDExLCAweDA0LCAweGM0LCAweDZjLCAweGRmLCAweDE4LCAweGU5LCAweDUwLCAweDE1LCAweDcyLCAweGE2LAorICAweDlhLCAweDNhLCAweGU0LCAweGEzLCAweDUwLCAweDA2LCAweGFhLCAweDk4LCAweDcxLCAweDdmLCAweGFlLCAweDczLAorICAweDI3LCAweDc5LCAweGY3LCAweDU2LCAweGJkLCAweGI0LCAweDRjLCAweDc2LCAweDBkLCAweDZlLCAweDBmLCAweDk0LAorICAweDllLCAweDE4LCAweDM3LCAweDNiLCAweGJiLCAweDU1LCAweGI5LCAweGZkLCAweDM2LCAweGYzLCAweDVkLCAweDcyLAorICAweGU0LCAweDA4LCAweDViLCAweDFhLCAweDdiLCAweDg1LCAweDkwLCAweDA0LCAweDA4LCAweGUzLCAweDk3LCAweDVkLAorICAweDFlLCAweDFkLCAweGEzLCAweDYzLCAweDU5LCAweGU5LCAweDYyLCAweDBlLCAweGZjLCAweGMyLCAweDdjLCAweDYzLAorICAweDk2LCAweDVmLCAweDkyLCAweDVmLCAweDBkLCAweGVjLCAweGVlLCAweDM2LCAweGQ5LCAweGI4LCAweGJlLCAweGE4LAorICAweDhiLCAweGFjLCAweDM1LCAweDc0LCAweGE3LCAweGZiLCAweGZmLCAweGJlLCAweDlmLCAweDczLCAweGJiLCAweGU5LAorICAweDZlLCAweDZhLCAweGY0LCAweGNkLCAweGIxLCAweGU0LCAweDhkLCAweGQxLCAweDIyLCAweDJiLCAweGYwLCAweDBlLAorICAweGMzLCAweDkzLCAweDM3LCAweDEwLCAweGIyLCAweDdlLCAweDM1LCAweDI2LCAweGRjLCAweGQ5LCAweDcxLCAweGU2LAorICAweDhjLCAweGIwLCAweGE2LCAweDE0LCAweGMxLCAweDFhLCAweDJjLCAweGI0LCAweDM2LCAweGY0LCAweGY1LCAweGQ0LAorICAweDMyLCAweGYwLCAweDYxLCAweDYzLCAweDRmLCAweGEwLCAweDdhLCAweDcyLCAweDA4LCAweGM4LCAweDFkLCAweDdhLAorICAweDY1LCAweGM3LCAweGRhLCAweGNiLCAweDRhLCAweDNjLCAweDgyLCAweDY0LCAweDE4LCAweDY1LCAweGI5LCAweGM1LAorICAweGFkLCAweDVmLCAweGJlLCAweGQ4LCAweGI0LCAweDAxLCAweDU5LCAweGJiLCAweDZlLCAweGViLCAweGViLCAweDFmLAorICAweDRjLCAweDljLCAweGJhLCAweDExLCAweDYyLCAweGZmLCAweDNhLCAweDM4LCAweDFlLCAweDVjLCAweDlkLCAweGQ1LAorICAweDhlLCAweDcxLCAweDliLCAweDllLCAweDYwLCAweGY0LCAweGIxLCAweDVjLCAweDllLCAweGVlLCAweDc2LCAweDU3LAorICAweDk2LCAweDI4LCAweGI4LCAweDgyLCAweDYyLCAweDU0LCAweDAwLCAweGU2LCAweDkwLCAweGZmLCAweDVlLCAweDY3LAorICAweGQ0LCAweDhjLCAweDc1LCAweDMzLCAweGFiLCAweGFhLCAweDcwLCAweGM4LCAweDBiLCAweGRkLCAweDA5LCAweDRmLAorICAweDBkLCAweDkyLCAweDBjLCAweGUwLCAweDIwLCAweGQ2LCAweDU5LCAweDcwLCAweDk0LCAweGVjLCAweDEzLCAweGQ2LAorICAweGY3LCAweDIzLCAweDBjLCAweDgyLCAweDAyLCAweDExLCAweDAwLCAweGM0LCAweDIwLCAweDcxLCAweDIyLCAweDc1LAorICAweDhjLCAweDY1LCAweGMyLCAweDUwLCAweDA5LCAweDc3LCAweDNlLCAweDNhLCAweGFiLCAweDA1LCAweGQxLCAweGZhLAorICAweDliLCAweDkzLCAweDQ4LCAweDc1LCAweGY3LCAweGY2LCAweDk4LCAweGU3LCAweDNiLCAweDI4LCAweGE5LCAweGRjLAorICAweDJmLCAweGYyLCAweGQ0LCAweGI5LCAweDYxLCAweGExLCAweGMzLCAweDQ3LCAweDViLCAweGMzLCAweGU1LCAweDQ2LAorICAweGQ3LCAweDQ5LCAweDY0LCAweGY5LCAweGI2LCAweDRiLCAweDI4LCAweDY2LCAweDBlLCAweGI0LCAweDZlLCAweGU2LAorICAweGRmLCAweGY4LCAweDBjLCAweDIzLCAweGIzLCAweDE1LCAweDQ0LCAweDU5LCAweGU5LCAweGVjLCAweGJmLCAweDdkLAorICAweDJjLCAweDdiLCAweGM5LCAweDlmLCAweDI2LCAweDc3LCAweDFkLCAweDMzLCAweDUxLCAweDU0LCAweDMwLCAweGUyLAorICAweDRkLCAweDQyLCAweDIwLCAweGI4LCAweDUyLCAweDZjLCAweDRiLCAweDhmLCAweGU4LCAweGFlLCAweGEwLCAweDEyLAorICAweDMwLCAweGE1LCAweDEyLCAweDUyLCAweDAxLCAweDljLCAweDg5LCAweDIzLCAweDZiLCAweDIzLCAweDExLCAweDYxLAorICAweGM0LCAweGZjLCAweDczLCAweGE4LCAweDk0LCAweDAwLCAweDM4LCAweDIxLCAweDFhLCAweDhkLCAweDI0LCAweDBmLAorICAweGZmLCAweDg1LCAweGZmLCAweDM3LCAweDZiLCAweGEyLCAweDU4LCAweDY4LCAweGIwLCAweDQ2LCAweDE4LCAweGI4LAorICAweDZmLCAweDJkLCAweGM1LCAweDI0LCAweGRjLCAweDExLCAweGMwLCAweGE1LCAweGI0LCAweDc1LCAweDU5LCAweGIxLAorICAweGQ1LCAweDgxLCAweDY0LCAweGQzLCAweGZmLCAweDVkLCAweGRkLCAweDM5LCAweGEyLCAweDg2LCAweDA1LCAweDIzLAorICAweDBjLCAweDc0LCAweGM4LCAweDRjLCAweDc4LCAweDEwLCAweDIxLCAweDkwLCAweGM3LCAweDQ2LCAweDIzLCAweGE1LAorICAweDVhLCAweDE4LCAweDFkLCAweDA5LCAweGQ1LCAweGI2LCAweGE2LCAweGQxLCAweDM2LCAweDM0LCAweDI4LCAweDcxLAorICAweGViLCAweDFkLCAweDVlLCAweGQ0LCAweDMyLCAweGQ2LCAweGRhLCAweGQ5LCAweDNjLCAweGY2LCAweGM3LCAweDg3LAorICAweGU0LCAweDk2LCAweDRlLCAweGNhLCAweDI4LCAweDBmLCAweDFjLCAweDczLCAweDUxLCAweGViLCAweGY0LCAweGViLAorICAweDM2LCAweDViLCAweDVjLCAweGRmLCAweDQxLCAweGFjLCAweDk3LCAweGNiLCAweDNhLCAweDZkLCAweDZiLCAweDYzLAorICAweDIyLCAweDE1LCAweDNmLCAweGEzLCAweDMzLCAweGQwLCAweGRmLCAweDJhLCAweDk1LCAweDFkLCAweDY1LCAweGI1LAorICAweGVmLCAweDBlLCAweDI2LCAweGFkLCAweGI2LCAweGU4LCAweDRkLCAweGM3LCAweGI4LCAweDk5LCAweGE3LCAweDEwLAorICAweDdjLCAweDY2LCAweDE4LCAweGNhLCAweDQzLCAweDg4LCAweGYwLCAweDY0LCAweDE1LCAweDg1LCAweDg3LCAweGY0LAorICAweGViLCAweDg4LCAweDJhLCAweGUyLCAweGE2LCAweDY1LCAweGMxLCAweGQ5LCAweDkzLCAweGZiLCAweDFhLCAweDhmLAorICAweDY4LCAweGM2LCAweGU2LCAweGFlLCAweGIxLCAweDY5LCAweGQ2LCAweGQ5LCAweDhlLCAweGQwLCAweDI4LCAweDkxLAorICAweDIyLCAweDQxLCAweGE0LCAweGUxLCAweDU3LCAweDM0LCAweDU1LCAweDllLCAweDJmLCAweDVjLCAweGIwLCAweGY5LAorICAweDYzLCAweDhmLCAweDZjLCAweDYxLCAweDYxLCAweDE4LCAweDQzLCAweGQ0LCAweDRhLCAweGE1LCAweGZjLCAweDIyLAorICAweDM0LCAweGZjLCAweDczLCAweDZjLCAweGU3LCAweGJiLCAweGM5LCAweDk4LCAweDM5LCAweDA4LCAweDI3LCAweDkyLAorICAweGE4LCAweGNiLCAweGI2LCAweDBjLCAweDdmLCAweDM4LCAweGUwLCAweDRhLCAweDNhLCAweDA5LCAweDg5LCAweDVhLAorICAweGEwLCAweDlhLCAweGI1LCAweDI2LCAweGFhLCAweDEyLCAweGExLCAweDJhLCAweDU4LCAweDIxLCAweGI2LCAweGJlLAorICAweDNiLCAweDAyLCAweDZlLCAweGRmLCAweDAzLCAweDYyLCAweGEyLCAweDQ0LCAweDI4LCAweDExLCAweDQyLCAweDYzLAorICAweDAwLCAweDIwLCAweDg4LCAweGUxLCAweDRiLCAweDVhLCAweDRkLCAweDBiLCAweDJlLCAweDVlLCAweDA1LCAweDE0LAorICAweGRhLCAweDQ1LCAweGZlLCAweGJhLCAweDYyLCAweGMzLCAweGYwLCAweDcyLCAweGQwLCAweDAxLCAweGY4LCAweDA4LAorICAweGNiLCAweDZlLCAweGRhLCAweDgyLCAweDgyLCAweDY2LCAweGNhLCAweDkwLCAweDBmLCAweGM2LCAweGM3LCAweDRkLAorICAweGQ0LCAweDA1LCAweGQ5LCAweGQyLCAweDE0LCAweGEwLCAweDRiLCAweDRlLCAweDM2LCAweDI3LCAweDFkLCAweGZlLAorICAweDUyLCAweGQzLCAweDVkLCAweGE2LCAweDRmLCAweDE4LCAweGZiLCAweGMzLCAweDgyLCAweDdiLCAweDhjLCAweGJjLAorICAweGVlLCAweDkxLCAweGQwLCAweDlkLCAweGQzLCAweGJlLCAweGJkLCAweGU2LCAweGI4LCAweDhmLCAweGQ0LCAweGEzLAorICAweDhlLCAweDdjLCAweDQzLCAweDBmLCAweDU0LCAweDAxLCAweDlmLCAweGVkLCAweDQyLCAweDRmLCAweDc2LCAweDcwLAorICAweGIzLCAweGRhLCAweDcyLCAweDg1LCAweDBiLCAweDIxLCAweDAyLCAweGYyLCAweGZhLCAweDc0LCAweDJmLCAweDhlLAorICAweDhkLCAweDM2LCAweGY1LCAweDI4LCAweDkxLCAweGE4LCAweDI0LCAweDFlLCAweGU3LCAweGM0LCAweGI2LCAweDY0LAorICAweDQxLCAweDI0LCAweDdkLCAweDdjLCAweDczLCAweDJjLCAweDhkLCAweDJhLCAweDM4LCAweDFmLCAweDFmLCAweDU5LAorICAweGYwLCAweDc1LCAweDU4LCAweDhkLCAweDZlLCAweDFjLCAweDhmLCAweDRlLCAweDQ3LCAweGFhLCAweDc4LCAweGE0LAorICAweDY3LCAweDAzLCAweGFlLCAweGMxLCAweDhkLCAweDRhLCAweDUxLCAweGE0LCAweGFmLCAweDQ1LCAweDI0LCAweGI1LAorICAweDJiLCAweDgxLCAweGY1LCAweDQzLCAweGMwLCAweDQyLCAweDM0LCAweGIyLCAweDFhLCAweDQ1LCAweDc0LCAweDg5LAorICAweGE3LCAweGRiLCAweDgwLCAweDBlLCAweDQ2LCAweGU3LCAweDYwLCAweGE1LCAweDQ0LCAweDAzLCAweDRjLCAweGY2LAorICAweDNlLCAweGVmLCAweGNjLCAweDAwLCAweDkwLCAweDVkLCAweDQ0LCAweGM1LCAweDQ0LCAweGY2LCAweDgzLCAweGU3LAorICAweDBiLCAweGRmLCAweDEzLCAweDNkLCAweDgwLCAweDcwLCAweDIxLCAweDFhLCAweDhmLCAweGYwLCAweDA3LCAweGNmLAorICAweDFlLCAweGZmLCAweDNmLCAweDY2LCAweGE2LCAweGIxLCAweDg2LCAweDI2LCAweDU2LCAweDkzLCAweGFhLCAweDU1LAorICAweDI4LCAweDA0LCAweDgyLCAweGJhLCAweGQ1LCAweGRlLCAweGQwLCAweDk3LCAweGMwLCAweDViLCAweDJhLCAweDQ5LAorICAweDI0LCAweGZmLCAweGMxLCAweDNiLCAweGI2LCAweDBjLCAweDViLCAweDFjLCAweGMyLCAweGExLCAweGI5LCAweGE3LAorICAweDM0LCAweGRiLCAweGM3LCAweDZlLCAweDQ5LCAweDc5LCAweGQ0LCAweDZjLCAweDZjLCAweDBhLCAweGI3LCAweGViLAorICAweDU1LCAweDYyLCAweDdhLCAweGQxLCAweDU3LCAweDQyLCAweDFhLCAweDQ2LCAweGFhLCAweGY3LCAweDgxLCAweDU1LAorICAweGNkLCAweDE0LCAweGE5LCAweDE0LCAweGNiLCAweGZhLCAweDY1LCAweDE2LCAweDY1LCAweGU2LCAweDY0LCAweGNlLAorICAweDkxLCAweDc3LCAweDQ1LCAweGVjLCAweDliLCAweGVjLCAweDE3LCAweDRiLCAweGI4LCAweDMxLCAweDQ5LCAweDVhLAorICAweDUzLCAweDhlLCAweGFiLCAweGM5LCAweDQ5LCAweGQ3LCAweDFjLCAweDkzLCAweGY4LCAweDFmLCAweDI1LCAweDEyLAorICAweDM1LCAweDdiLCAweDM0LCAweDg5LCAweDVmLCAweDlmLCAweDI3LCAweDYxLCAweDBhLCAweGRjLCAweDJiLCAweDAwLAorICAweDc3LCAweDAyLCAweDY1LCAweDYyLCAweGE1LCAweGU4LCAweGEzLCAweGI3LCAweDBkLCAweGZjLCAweGVlLCAweGE2LAorICAweDc5LCAweDgyLCAweGM2LCAweDNmLCAweGE3LCAweDNjLCAweDU2LCAweGYwLCAweGQ2LCAweDgwLCAweGM4LCAweGRkLAorICAweDcxLCAweDMzLCAweDIzLCAweDZiLCAweDgyLCAweGQxLCAweDA1LCAweGM5LCAweDg0LCAweDgwLCAweDEzLCAweDg1LAorICAweGQ0LCAweGE4LCAweDg1LCAweDg1LCAweDIwLCAweDZhLCAweDI1LCAweDc1LCAweDNiLCAweDFhLCAweGRkLCAweGU1LAorICAweDRjLCAweDkwLCAweDJhLCAweDBiLCAweDg1LCAweGFkLCAweGIwLCAweDUwLCAweDJkLCAweDI5LCAweGJjLCAweDJiLAorICAweDQ1LCAweGFmLCAweDdkLCAweDNjLCAweDAwLCAweDljLCAweGI4LCAweDk5LCAweDE4LCAweDQzLCAweDMxLCAweDU1LAorICAweDk1LCAweDRiLCAweDAwLCAweDQ0LCAweGIxLCAweDY2LCAweGJkLCAweDkyLCAweGFhLCAweGU0LCAweDk3LCAweDUwLAorICAweDNkLCAweDU1LCAweGFlLCAweDY4LCAweDZlLCAweGRhLCAweDZiLCAweGRkLCAweGI1LCAweGU3LCAweGVlLCAweDdiLAorICAweDAzLCAweDVkLCAweDBhLCAweDlhLCAweDI1LCAweDkyLCAweGU3LCAweDJlLCAweGM2LCAweGU0LCAweGI4LCAweDQ4LAorICAweDJiLCAweDhiLCAweGM5LCAweGU1LCAweGFhLCAweDEyLCAweDMzLCAweDJkLCAweDIxLCAweDYzLCAweDQyLCAweDU0LAorICAweDc3LCAweDQxLCAweDdiLCAweGQ3LCAweGEzLCAweDI4LCAweDYwLCAweGUxLCAweDljLCAweGE4LCAweGJkLCAweGMxLAorICAweGRkLCAweDI5LCAweGRjLCAweDk4LCAweDU0LCAweDhlLCAweDg1LCAweDZjLCAweDQ3LCAweDgzLCAweDM3LCAweDc1LAorICAweGViLCAweGVmLCAweGMzLCAweGExLCAweGUzLCAweGYwLCAweGQwLCAweDc4LCAweGVlLCAweDM0LCAweGIzLCAweDYzLAorICAweDU1LCAweGIyLCAweGUyLCAweDAwLCAweDUyLCAweDcwLCAweDc1LCAweGQ1LCAweGZmLCAweGExLCAweDAwLCAweDIzLAorICAweDAwLCAweGQ5LCAweDdjLCAweGJlLCAweGNhLCAweGRhLCAweDkzLCAweDMyLCAweGE4LCAweGQ2LCAweDJlLCAweDg4LAorICAweDlhLCAweGViLCAweDI3LCAweDQwLCAweGEwLCAweDdiLCAweDY0LCAweDJkLCAweDEyLCAweDMzLCAweGIzLCAweGQ1LAorICAweGVkLCAweGVhLCAweGM1LCAweGU4LCAweDdiLCAweDFhLCAweDRjLCAweDAyLCAweDM1LCAweGE0LCAweDgwLCAweGI1LAorICAweGQwLCAweDk4LCAweDEwLCAweDJhLCAweGViLCAweDQyLCAweDhiLCAweGI3LCAweDJhLCAweDUyLCAweDRkLCAweDMwLAorICAweDBlLCAweDIxLCAweDFhLCAweDhmLCAweGMwLCAweDAwLCAweDA2LCAweDAwLCAweGZmLCAweDM1LCAweDZiLCAweGE1LAorICAweGIxLCAweDA2LCAweDAwLCAweDQ2LCAweDk0LCAweGRhLCAweDE3LCAweDk3LCAweGM1LCAweGEzLCAweDJlLCAweGRhLAorICAweDA0LCAweDQwLCAweDFmLCAweDc0LCAweGY0LCAweDRlLCAweDJlLCAweGY4LCAweDNhLCAweDU3LCAweDUyLCAweDc3LAorICAweGY1LCAweGE0LCAweDZhLCAweDljLCAweDUyLCAweGM5LCAweGY4LCAweDI3LCAweGU5LCAweGE3LCAweDk2LCAweDA3LAorICAweGZjLCAweDQyLCAweGU3LCAweDQyLCAweDczLCAweDNmLCAweDQ1LCAweDY5LCAweDVmLCAweGRlLCAweGVhLCAweGNkLAorICAweGViLCAweGVhLCAweGE5LCAweDdlLCAweDc2LCAweGMxLCAweDJmLCAweDU5LCAweDVjLCAweGZkLCAweDlhLCAweGQ1LAorICAweGIwLCAweDVjLCAweDI3LCAweGMxLCAweDVjLCAweDViLCAweDA5LCAweDNjLCAweGI3LCAweDZkLCAweGRhLCAweDczLAorICAweGZhLCAweGM2LCAweGM1LCAweDY1LCAweGM0LCAweDYwLCAweDc4LCAweGU2LCAweDJhLCAweDNlLCAweDVkLCAweGJhLAorICAweGI0LCAweDU0LCAweDJiLCAweDE4LCAweDE4LCAweGQ3LCAweDk1LCAweDIyLCAweGEwLCAweDlhLCAweDM4LCAweGQ0LAorICAweDMyLCAweGE0LCAweDA5LCAweDM2LCAweGYzLCAweDIyLCAweGUxLCAweDAzLCAweGMyLCAweDQwLCAweDg0LCAweDEzLAorICAweDQ3LCAweDM3LCAweDY1LCAweDM2LCAweGFmLCAweDc1LCAweDVkLCAweGQ4LCAweDdiLCAweDY2LCAweGZiLCAweGNkLAorICAweDhlLCAweDNhLCAweDNhLCAweGUxLCAweDhhLCAweGI5LCAweDMwLCAweDE5LCAweDA0LCAweDAwLCAweGQyLCAweDk4LAorICAweDY5LCAweGE1LCAweGNiLCAweGMyLCAweGYyLCAweDZmLCAweDhmLCAweDIwLCAweGJiLCAweDEzLCAweGVkLCAweGU1LAorICAweDBhLCAweDczLCAweDkwLCAweDRjLCAweDE3LCAweDUyLCAweDJkLCAweDM4LCAweDgzLCAweDdlLCAweGY4LCAweGQzLAorICAweDE0LCAweDcxLCAweDE3LCAweDg0LCAweDZkLCAweDZiLCAweGRlLCAweDAyLCAweDJmLCAweDM0LCAweDM3LCAweDY2LAorICAweDkzLCAweDkxLCAweDBhLCAweDI3LCAweDFlLCAweDM4LCAweDYyLCAweDg0LCAweDZjLCAweGEwLCAweDUyLCAweGQ3LAorICAweGE0LCAweGUyLCAweDk0LCAweGNlLCAweDgzLCAweDY5LCAweGI2LCAweDE4LCAweDAyLCAweDc2LCAweGU3LCAweDQzLAorICAweDYxLCAweDEwLCAweDk4LCAweDQ4LCAweDEyLCAweDMwLCAweDlkLCAweDYwLCAweDAwLCAweDIyLCAweGU2LCAweDRmLAorICAweDJiLCAweDQzLCAweDRhLCAweDNhLCAweGMyLCAweGUwLCAweDM3LCAweDEwLCAweDNmLCAweGU0LCAweDM2LCAweGI4LAorICAweDQ0LCAweDUzLCAweGIxLCAweGY5LCAweDUzLCAweDUxLCAweGQ2LCAweGE4LCAweDI1LCAweDA2LCAweDcwLCAweGJkLAorICAweDUwLCAweGVjLCAweGRlLCAweGZiLCAweGFmLCAweDgwLCAweGNhLCAweGMwLCAweGYzLCAweDljLCAweGQxLCAweGM5LAorICAweDMzLCAweDJkLCAweDAyLCAweDUyLCAweDgzLCAweGM1LCAweDdiLCAweDVhLCAweDY3LCAweDQzLCAweGY4LCAweGZmLAorICAweDUyLCAweDM2LCAweGFjLCAweGQyLCAweDY0LCAweGUxLCAweDkyLCAweDM4LCAweDdhLCAweGEyLCAweGVjLCAweDVkLAorICAweDhhLCAweDNjLCAweDA4LCAweDJlLCAweDhlLCAweDM2LCAweGVjLCAweDhlLCAweDYyLCAweDUxLCAweDgyLCAweGU2LAorICAweGNlLCAweDUzLCAweDg4LCAweGRiLCAweDcyLCAweGQwLCAweDNhLCAweDdiLCAweDhiLCAweGRlLCAweGJmLCAweDFmLAorICAweDBhLCAweDg5LCAweDFjLCAweGM1LCAweGFiLCAweGM4LCAweGE1LCAweDU5LCAweGJkLCAweDFiLCAweGI1LCAweGZjLAorICAweGE5LCAweDk5LCAweDIzLCAweGYxLCAweDE3LCAweDJkLCAweGJlLCAweGM0LCAweGY1LCAweDljLCAweDRkLCAweGUzLAorICAweDdiLCAweDJjLCAweDliLCAweDY1LCAweDhmLCAweDVmLCAweGUzLCAweDEzLCAweDkwLCAweDA4LCAweGFkLCAweDM4LAorICAweGFkLCAweGQ0LCAweGRlLCAweDViLCAweGJkLCAweGY5LCAweDMyLCAweDdjLCAweDEzLCAweGViLCAweGU2LCAweGU3LAorICAweGI2LCAweDFhLCAweDIxLCAweDY5LCAweGM2LCAweDJmLCAweDI0LCAweDZiLCAweDA4LCAweDI5LCAweGQxLCAweDRjLAorICAweDM0LCAweGQxLCAweDMxLCAweDg4LCAweDg0LCAweDNkLCAweGE5LCAweGYwLCAweGU5LCAweDU5LCAweGExLCAweDE5LAorICAweDk3LCAweDRlLCAweDc5LCAweGNkLCAweGViLCAweGNiLCAweDllLCAweDI3LCAweDRiLCAweDIzLCAweDMyLCAweDIzLAorICAweGE2LCAweDZkLCAweDA2LCAweDA4LCAweGIwLCAweGU4LCAweDUzLCAweDgyLCAweDcwLCAweGFhLCAweDMyLCAweDM5LAorICAweDgwLCAweGVmLCAweDE2LCAweDgyLCAweGRjLCAweGVlLCAweDdmLCAweDcwLCAweDcwLCAweDRhLCAweGQxLCAweGNiLAorICAweDRlLCAweDk0LCAweDJhLCAweDRiLCAweDJhLCAweDU3LCAweDA1LCAweDQ1LCAweDQ2LCAweDFjLCAweDY3LCAweDAyLAorICAweDJmLCAweGQzLCAweDE4LCAweGYyLCAweDkyLCAweDAzLCAweDA3LCAweDIxLCAweDFhLCAweDhkLCAweDAwLCAweDAwLAorICAweDBlLCAweDAxLCAweGZmLCAweDM3LCAweDY0LCAweGE3LCAweGIyLCAweDQ4LCAweDQyLCAweDQ0LCAweDEwLCAweDk4LAorICAweDI0LCAweDgzLCAweDI1LCAweDU4LCAweGJiLCAweGJhLCAweGI0LCAweDM0LCAweGI4LCAweDAwLCAweDU4LCAweDZjLAorICAweGVlLCAweGRmLCAweGZhLCAweDhkLCAweDEwLCAweDJmLCAweDFiLCAweGM0LCAweDQ5LCAweDgwLCAweGJhLCAweGVmLAorICAweGNlLCAweGRiLCAweGY4LCAweDdkLCAweDNiLCAweDFiLCAweDZhLCAweGNhLCAweGZkLCAweDkyLCAweDZiLCAweDVmLAorICAweDI1LCAweGFiLCAweDYyLCAweGYwLCAweDI2LCAweDE0LCAweDNjLCAweDQ3LCAweDk1LCAweDQ4LCAweDM2LCAweDhhLAorICAweDgyLCAweDc1LCAweDRjLCAweDZmLCAweDgxLCAweGU2LCAweGJkLCAweDIzLCAweDE3LCAweDMzLCAweDBmLCAweDRjLAorICAweGZiLCAweDI1LCAweDVjLCAweDI2LCAweDFlLCAweDJiLCAweGE3LCAweDg3LCAweGZjLCAweDk0LCAweGNkLCAweDJlLAorICAweDQzLCAweDYzLCAweDQwLCAweGQwLCAweGY0LCAweGFmLCAweGZlLCAweDBmLCAweGU2LCAweDRkLCAweDhkLCAweDY2LAorICAweDllLCAweGZjLCAweDczLCAweGFlLCAweGVhLCAweDNjLCAweDY0LCAweGEyLCAweGNhLCAweGE3LCAweDUxLCAweGE2LAorICAweGFlLCAweGFiLCAweDFmLCAweDY2LCAweDYxLCAweDYwLCAweGRkLCAweDljLCAweGJiLCAweGRiLCAweGIzLCAweDBmLAorICAweDhmLCAweDY3LCAweDdkLCAweDNjLCAweDM4LCAweGEyLCAweDY3LCAweDEyLCAweGVmLCAweGJlLCAweDQ5LCAweGYzLAorICAweDgwLCAweDhjLCAweGUxLCAweDlkLCAweDlkLCAweDI1LCAweDQwLCAweDM3LCAweDlkLCAweDYxLCAweDRhLCAweDk5LAorICAweDI3LCAweGNlLCAweDBjLCAweDgwLCAweDYwLCAweGY4LCAweGZlLCAweGRiLCAweDFjLCAweGFmLCAweGEzLCAweGZiLAorICAweDM0LCAweGU4LCAweDA0LCAweDBiLCAweDI5LCAweGY1LCAweDhhLCAweDc0LCAweDQzLCAweDg0LCAweDYyLCAweDUyLAorICAweDM5LCAweGY4LCAweDA1LCAweGEyLCAweGQ2LCAweDYxLCAweGQ3LCAweDE0LCAweDg3LCAweGU4LCAweGU1LCAweDUzLAorICAweDQ2LCAweDVlLCAweDFkLCAweDI5LCAweDFiLCAweDVlLCAweGE1LCAweDQ0LCAweDk2LCAweGVkLCAweGE3LCAweDM4LAorICAweDIxLCAweDQxLCAweGI1LCAweDQxLCAweDZiLCAweGQ4LCAweDJhLCAweDRkLCAweDQwLCAweGJmLCAweDlmLCAweDg5LAorICAweDJkLCAweDY1LCAweDZlLCAweDEzLCAweGY2LCAweGZhLCAweDNiLCAweDg1LCAweDBhLCAweDJlLCAweDcxLCAweDRjLAorICAweDAwLCAweDY0LCAweGIyLCAweGU1LCAweDNmLCAweDBiLCAweGYwLCAweDhlLCAweDA5LCAweGMxLCAweDYwLCAweDExLAorICAweDI5LCAweGQ1LCAweDNhLCAweDY1LCAweDRjLCAweGU2LCAweDJlLCAweGExLCAweDI2LCAweDkzLCAweDBiLCAweGI3LAorICAweGMxLCAweDNmLCAweDg2LCAweDZmLCAweGE4LCAweGNjLCAweDQ5LCAweDgwLCAweGQxLCAweDUwLCAweGFhLCAweGVjLAorICAweDVlLCAweDJkLCAweDNkLCAweDc4LCAweGM2LCAweDRmLCAweDNlLCAweGNjLCAweGM4LCAweGE0LCAweDAwLCAweGNmLAorICAweGY5LCAweDc4LCAweDc3LCAweGMwLCAweDQ2LCAweDhlLCAweDQ3LCAweGY2LCAweDllLCAweGY5LCAweDhkLCAweDQ2LAorICAweGI3LCAweDg3LCAweGNiLCAweDE2LCAweGNmLCAweDM1LCAweGVhLCAweGQ1LCAweDdiLCAweDA3LCAweDY0LCAweGFlLAorICAweDcwLCAweDE4LCAweGRkLCAweDU4LCAweGJjLCAweGYyLCAweGY3LCAweGE4LCAweDQ5LCAweDA3LCAweDI2LCAweDljLAorICAweGNiLCAweDQ0LCAweDVmLCAweDE1LCAweDczLCAweGYxLCAweGI2LCAweGNiLCAweDA1LCAweGU5LCAweGU2LCAweGJlLAorICAweDYwLCAweGRkLCAweGNlLCAweGQ5LCAweDA3LCAweDY1LCAweGQxLCAweGY0LCAweGM5LCAweDY5LCAweDJhLCAweDQyLAorICAweDliLCAweGYwLCAweGY0LCAweDg5LCAweDE0LCAweDQzLCAweDU2LCAweGY2LCAweGQ5LCAweDIzLCAweDQ2LCAweGIyLAorICAweGYzLCAweDgwLCAweGE3LCAweDJkLCAweDgxLCAweDc5LCAweDkyLCAweDRjLCAweGY3LCAweDE2LCAweDMyLCAweGYxLAorICAweGI2LCAweDJkLCAweDdiLCAweDEzLCAweDlmLCAweGRhLCAweGFiLCAweDVlLCAweDQxLCAweDM2LCAweGI1LCAweDU3LAorICAweDhjLCAweDEzLCAweGZmLCAweGRhLCAweGU3LCAweDdhLCAweDRhLCAweGQ1LCAweGFjLCAweGQwLCAweDQwLCAweGFiLAorICAweDg4LCAweGI0LCAweDExLCAweDBlLCAweDAwLCAweDAxLCAweDUyLCAweDQ1LCAweDFmLCAweGFkLCAweDgyLCAweDY1LAorICAweDI5LCAweDliLCAweGM5LCAweGVhLCAweGU0LCAweDliLCAweDlkLCAweDRlLCAweDc0LCAweDExLCAweDQ0LCAweDBlLAorICAweDIxLCAweDFhLCAweDhmLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweDMxLCAweDY4LCAweGEyLCAweGMxLAorICAweGQwLCAweGEzLCAweDEwLCAweDA5LCAweDU2LCAweDZmLCAweDRiLCAweDI1LCAweDZhLCAweDBkLCAweDU4LCAweGNkLAorICAweDVkLCAweDUzLCAweDdjLCAweDMyLCAweGM1LCAweDAwLCAweDA5LCAweDM0LCAweDdiLCAweGU2LCAweGEzLCAweDFmLAorICAweGM0LCAweDRhLCAweGMxLCAweGJhLCAweDE2LCAweGYxLCAweGZmLCAweDJjLCAweDc1LCAweDMwLCAweGYwLCAweDVlLAorICAweDY4LCAweGNmLCAweDdhLCAweGEyLCAweDIzLCAweDY5LCAweDcxLCAweDU5LCAweDViLCAweGY3LCAweGY0LCAweDM3LAorICAweDA2LCAweDc1LCAweGM4LCAweGE0LCAweDJjLCAweGNmLCAweGNkLCAweGU0LCAweDU5LCAweGRjLCAweGNkLCAweDU5LAorICAweGFlLCAweDM0LCAweDdjLCAweDJjLCAweDM2LCAweGJiLCAweDk0LCAweGMxLCAweGRiLCAweDcwLCAweGU2LCAweGYzLAorICAweDA0LCAweDliLCAweDA5LCAweDVlLCAweDk0LCAweGM5LCAweDJkLCAweGQ5LCAweDIzLCAweDc4LCAweGY3LCAweDlhLAorICAweDQ5LCAweGNkLCAweGEyLCAweDhkLCAweGY1LCAweGFiLCAweDVjLCAweDI3LCAweDVmLCAweDhjLCAweGFmLCAweGQzLAorICAweDRmLCAweDlhLCAweDAwLCAweGNhLCAweGY1LCAweDU1LCAweDc5LCAweDc3LCAweDg5LCAweDgwLCAweGE5LCAweDQ1LAorICAweGU5LCAweDAyLCAweDA1LCAweGMxLCAweDAyLCAweGI3LCAweDUxLCAweDQyLCAweDEwLCAweDAxLCAweDJiLCAweDdlLAorICAweGE2LCAweGExLCAweDQyLCAweGE5LCAweDk2LCAweDhjLCAweGE3LCAweDMyLCAweDUxLCAweDViLCAweDQwLCAweDM5LAorICAweDAwLCAweDA1LCAweDk1LCAweGYzLCAweDU2LCAweDdkLCAweDZhLCAweGM3LCAweDgxLCAweGNlLCAweDVkLCAweDgwLAorICAweDA5LCAweGQ1LCAweDIwLCAweDRkLCAweGRkLCAweGQwLCAweDRjLCAweDE0LCAweDIwLCAweGIxLCAweDJiLCAweDI5LAorICAweDk3LCAweDE0LCAweDljLCAweGYxLCAweDZiLCAweDBkLCAweDM4LCAweGI0LCAweDBiLCAweDNhLCAweDA4LCAweDBlLAorICAweGM2LCAweGZjLCAweDE2LCAweDYzLCAweGY3LCAweGE5LCAweDljLCAweDhhLCAweDdmLCAweDMxLCAweGQxLCAweGZmLAorICAweDY1LCAweGE5LCAweDg5LCAweGFjLCAweDJkLCAweGQ1LCAweDRjLCAweDMxLCAweDFlLCAweDkxLCAweGM3LCAweGNiLAorICAweGFhLCAweGE0LCAweDlhLCAweGNjLCAweDk4LCAweGVmLCAweDU0LCAweDkzLCAweDEwLCAweDcwLCAweDEzLCAweDcwLAorICAweDBkLCAweDkxLCAweDc3LCAweDliLCAweGI4LCAweGYxLCAweGQ3LCAweDI2LCAweDdmLCAweGYxLCAweDk3LCAweGFlLAorICAweGRiLCAweDU3LCAweGRmLCAweDhkLCAweGNhLCAweGEwLCAweGU2LCAweDZkLCAweGQxLCAweGIyLCAweGIxLCAweDVjLAorICAweDVmLCAweDJjLCAweDNiLCAweGI1LCAweGJlLCAweGIxLCAweGQ1LCAweDk0LCAweDE4LCAweDMxLCAweDNkLCAweGFkLAorICAweDRmLCAweDM2LCAweDNiLCAweDIzLCAweDE3LCAweGQwLCAweGFjLCAweGU2LCAweDI4LCAweGVlLCAweGUzLCAweGMzLAorICAweGEyLCAweGIxLCAweDRkLCAweGI5LCAweDM3LCAweGU0LCAweDU3LCAweDM0LCAweDMxLCAweDU2LCAweDI5LCAweDg5LAorICAweGU3LCAweGQ4LCAweDhiLCAweDY1LCAweGI1LCAweDcwLCAweGRiLCAweDM4LCAweDQ2LCAweDY1LCAweDU5LCAweGMyLAorICAweDkwLCAweDhhLCAweGJjLCAweGMyLCAweDhjLCAweDM1LCAweDNlLCAweDBlLCAweDVhLCAweDYxLCAweDFhLCAweGRiLAorICAweDMwLCAweGEyLCAweDUwLCAweDc3LCAweDNiLCAweDc1LCAweDJhLCAweDFiLCAweGFhLCAweGYyLCAweDMxLCAweGJhLAorICAweDgzLCAweDkzLCAweDhhLCAweGJhLCAweDgyLCAweDRlLCAweDZjLCAweDU3LCAweDg2LCAweDk2LCAweGQ5LCAweDU5LAorICAweGIyLCAweGM3LCAweDQ1LCAweGQxLCAweGViLCAweDUxLCAweDM5LCAweGU2LCAweGJkLCAweGRjLCAweDcwLCAweGQzLAorICAweGMyLCAweDE3LCAweGE1LCAweDI5LCAweGNmLCAweDE5LCAweGYxLCAweGYxLCAweDYyLCAweDhiLCAweDI1LCAweDdmLAorICAweGJjLCAweDBiLCAweDI5LCAweDc4LCAweGExLCAweGY2LCAweGM1LCAweGIyLCAweGY3LCAweDVmLCAweGNiLCAweDg0LAorICAweGI4LCAweGRjLCAweDFiLCAweDczLCAweDU4LCAweDFhLCAweDMzLCAweDRjLCAweGFhLCAweDU1LCAweDJjLCAweGFlLAorICAweDRhLCAweDMyLCAweDI1LCAweDE5LCAweDgzLCAweDgxLCAweGE3LCAweDJhLCAweDQwLCAweGUwLCAweDIxLCAweDFhLAorICAweDhmLCAweDgwLCAweDAwLCAweDAwLCAweDBmLCAweGZmLCAweDNmLCAweDZhLCAweDg0LCAweGEwLCAweDg2LCAweGE5LAorICAweGI3LCAweGMxLCAweDE1LCAweDJhLCAweDk1LCAweGExLCAweDVhLCAweDM4LCAweDY5LCAweGFiLCAweGEzLCAweDAzLAorICAweDgwLCAweDE5LCAweDZiLCAweDcyLCAweDdlLCAweDY1LCAweDdjLCAweGI2LCAweGUzLCAweGU4LCAweDljLCAweDY2LAorICAweGJjLCAweGUxLCAweDQxLCAweDczLCAweGVhLCAweDQyLCAweGRjLCAweDRmLCAweGRjLCAweDM1LCAweGZkLCAweDczLAorICAweGNmLCAweDQ4LCAweGViLCAweGZiLCAweGI3LCAweGUwLCAweDIyLCAweDhiLCAweDdmLCAweDliLCAweDQwLCAweDg5LAorICAweDM4LCAweDA5LCAweDRmLCAweDg2LCAweDFiLCAweDAyLCAweDlmLCAweDE3LCAweDg4LCAweDliLCAweDBkLCAweGE1LAorICAweGUwLCAweDM5LCAweDJiLCAweGM2LCAweDIyLCAweDQ1LCAweDYyLCAweDM3LCAweGU0LCAweDQzLCAweDJkLCAweGI4LAorICAweDhkLCAweGMwLCAweDZmLCAweDVmLCAweDZlLCAweGVjLCAweDdjLCAweGJiLCAweDk0LCAweDIwLCAweDhiLCAweGM5LAorICAweDlmLCAweDk0LCAweDJjLCAweDE1LCAweGFhLCAweGIxLCAweDAyLCAweDYyLCAweDI3LCAweDEyLCAweDc5LCAweGU0LAorICAweDA0LCAweDAwLCAweDlkLCAweDY2LCAweGNiLCAweDdhLCAweGZjLCAweDVlLCAweDk5LCAweGM0LCAweDRjLCAweDU5LAorICAweDE4LCAweGE4LCAweDgxLCAweGQ4LCAweDViLCAweGFhLCAweDgwLCAweDAwLCAweDU1LCAweDY0LCAweGY2LCAweDAxLAorICAweDk3LCAweDIxLCAweDBmLCAweDZhLCAweGY5LCAweDdlLCAweDc0LCAweDUwLCAweGM4LCAweGIyLCAweGUwLCAweDE0LAorICAweDE2LCAweGZhLCAweDM5LCAweDE0LCAweDVlLCAweDkwLCAweDFkLCAweGFkLCAweDFjLCAweDAxLCAweGFkLCAweGZiLAorICAweDIxLCAweDcxLCAweGQxLCAweDY4LCAweDhhLCAweDA3LCAweGE2LCAweDQyLCAweDNjLCAweDI0LCAweDZkLCAweDU1LAorICAweDJmLCAweDdmLCAweDcyLCAweGYxLCAweGFhLCAweGM4LCAweDNlLCAweGJmLCAweDQyLCAweDgwLCAweDk1LCAweDczLAorICAweDM3LCAweDNiLCAweGExLCAweGM3LCAweDA2LCAweGQ3LCAweDdjLCAweGFkLCAweGViLCAweGY5LCAweGRjLCAweDdkLAorICAweGYxLCAweDQxLCAweDAzLCAweDQ3LCAweGY3LCAweGY3LCAweDRmLCAweDcxLCAweGY3LCAweGU3LCAweDcyLCAweDllLAorICAweDkzLCAweGU1LCAweDhjLCAweDhkLCAweGI3LCAweDM3LCAweDNkLCAweGUzLCAweGNmLCAweDNjLCAweGFiLCAweDMzLAorICAweDA3LCAweGE4LCAweGY1LCAweGVlLCAweDM4LCAweGNlLCAweDNiLCAweGY5LCAweDNjLCAweGRhLCAweDczLCAweGUxLAorICAweGIxLCAweDJhLCAweDZhLCAweDU5LCAweDdiLCAweDBjLCAweGEyLCAweDQwLCAweDFhLCAweGI1LCAweGM1LCAweGJkLAorICAweGIyLCAweDdmLCAweDVkLCAweDM2LCAweGUwLCAweDlkLCAweDhjLCAweGFlLCAweDBhLCAweDMwLCAweGRjLCAweGI2LAorICAweDE3LCAweDRlLCAweGYxLCAweDZmLCAweGEyLCAweDUwLCAweGFhLCAweDIzLCAweGE4LCAweGUwLCAweDQ3LCAweDI3LAorICAweDBkLCAweGVmLCAweDQ5LCAweDRmLCAweGRmLCAweGI0LCAweGM5LCAweGQxLCAweDNhLCAweGJlLCAweDExLCAweDQyLAorICAweGE1LCAweDM4LCAweGFkLCAweGQ2LCAweGQwLCAweDhmLCAweGEwLCAweDkzLCAweDg5LCAweDBlLCAweGZkLCAweDE0LAorICAweGQ4LCAweDg2LCAweDA4LCAweGYwLCAweDgxLCAweGJhLCAweDk1LCAweDUyLCAweDZjLCAweGNjLCAweDhhLCAweDBiLAorICAweGRhLCAweDYyLCAweDEwLCAweDA0LCAweDUwLCAweDJiLCAweGRhLCAweGU0LCAweGNlLCAweDYyLCAweDEyLCAweGE0LAorICAweDAwLCAweDgzLCAweDcyLCAweDgxLCAweDAyLCAweDk2LCAweGIyLCAweGE5LCAweDIxLCAweDEwLCAweDAwLCAweDM4LAorICAweDIxLCAweDFhLCAweDhhLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweGZmLCAweDM3LCAweDY1LCAweGE0LCAweGQ4LAorICAweGU4LCAweDZjLCAweDNhLCAweDEzLCAweDA4LCAweDVlLCAweDBiLCAweGQ1LCAweDY0LCAweGFhLCAweGQ1LCAweDU0LAorICAweGQxLCAweDFhLCAweDVjLCAweDBiLCAweDAxLCAweDBlLCAweDAyLCAweDQ3LCAweGVmLCAweDBmLCAweDI2LCAweGM5LAorICAweGEwLCAweGMxLCAweDgxLCAweDM2LCAweDY1LCAweDczLCAweDUyLCAweGQ4LCAweGFjLCAweDQyLCAweDVmLCAweDhhLAorICAweGU2LCAweDNiLCAweDU3LCAweGVhLCAweGVmLCAweDM4LCAweDViLCAweDFkLCAweDYyLCAweDMzLCAweDQ1LCAweDI2LAorICAweDk1LCAweGEzLCAweGE1LCAweDk5LCAweDc2LCAweDRmLCAweGY3LCAweDdmLCAweDliLCAweGU2LCAweDU1LCAweGNhLAorICAweDI5LCAweGJlLCAweDBhLCAweGUxLCAweDhjLCAweDMxLCAweGEwLCAweDEyLCAweDM0LCAweDU4LCAweDU2LCAweDE3LAorICAweGE0LCAweGY1LCAweDY3LCAweDY2LCAweDY5LCAweDBjLCAweDU1LCAweDE1LCAweDlmLCAweDk4LCAweDUyLCAweGUzLAorICAweDZiLCAweGZjLCAweDNkLCAweDFkLCAweDg2LCAweGQxLCAweDg2LCAweGMyLCAweGZkLCAweGY2LCAweGYzLCAweDIwLAorICAweGE0LCAweDhhLCAweDFiLCAweDI1LCAweGY4LCAweDJmLCAweDc0LCAweGFkLCAweGRiLCAweGFlLCAweGU4LCAweDgzLAorICAweDViLCAweDFlLCAweDc5LCAweGRkLCAweDVhLCAweDNlLCAweDM0LCAweDIxLCAweDljLCAweGZiLCAweDcyLCAweGEwLAorICAweDFmLCAweDJjLCAweDA1LCAweGQ3LCAweGVjLCAweGY0LCAweGVhLCAweGM4LCAweDYwLCAweDkwLCAweGM2LCAweDljLAorICAweGM0LCAweGI5LCAweDUxLCAweDNkLCAweDc5LCAweGQzLCAweDZkLCAweGI0LCAweDI2LCAweDc5LCAweGQ4LCAweDQ1LAorICAweDA4LCAweDgyLCAweDE1LCAweGI3LCAweDM5LCAweDcyLCAweDRjLCAweDE4LCAweDkzLCAweGJjLCAweDUyLCAweDEyLAorICAweDVhLCAweDA1LCAweDJkLCAweDJiLCAweGNhLCAweGUxLCAweDIyLCAweDg0LCAweGFmLCAweDZiLCAweDI1LCAweDcxLAorICAweDlhLCAweDU3LCAweDVkLCAweGM3LCAweGQ3LCAweDc4LCAweGZmLCAweDQ1LCAweDQ4LCAweGQxLCAweDI4LCAweGRhLAorICAweDY5LCAweDk4LCAweDA3LCAweDUyLCAweGEwLCAweDAwLCAweDhmLCAweGU1LCAweDdiLCAweGVkLCAweDZlLCAweDY3LAorICAweDAwLCAweDliLCAweGI4LCAweGQxLCAweDU4LCAweGEyLCAweGY1LCAweDQ2LCAweGZjLCAweDJlLCAweGQ2LCAweGFhLAorICAweGViLCAweDM0LCAweDE3LCAweDc3LCAweDIyLCAweDFhLCAweGEzLCAweGEyLCAweGNiLCAweDA2LCAweGVjLCAweGYxLAorICAweDEyLCAweGIwLCAweDZlLCAweDY2LCAweGNlLCAweGQxLCAweGE3LCAweGE0LCAweGQyLCAweDRjLCAweDM0LCAweGI3LAorICAweDMyLCAweDZhLCAweDdkLCAweDQ3LCAweGQ2LCAweDVhLCAweDk3LCAweDA4LCAweDIwLCAweDMwLCAweGY0LCAweGQ3LAorICAweDliLCAweDRhLCAweDkxLCAweDM3LCAweDA3LCAweDEyLCAweGU2LCAweDBlLCAweDYyLCAweGYyLCAweGJlLCAweGIyLAorICAweGFiLCAweDNlLCAweDZlLCAweDA3LCAweGM3LCAweDlmLCAweDE5LCAweGViLCAweGM5LCAweDdjLCAweDhmLCAweDUyLAorICAweGM4LCAweDljLCAweGMzLCAweDk5LCAweDlmLCAweDczLCAweDE2LCAweGExLCAweDJhLCAweDlhLCAweGY4LCAweDVhLAorICAweDQ3LCAweGMzLCAweDIwLCAweDE3LCAweGJiLCAweDI3LCAweDZhLCAweDRmLCAweGU0LCAweGZjLCAweGFjLCAweDRkLAorICAweGFmLCAweGFhLCAweGJmLCAweGYyLCAweGM0LCAweGQyLCAweDJhLCAweGJjLCAweDZiLCAweDdlLCAweDlmLCAweDRkLAorICAweDk2LCAweGUwLCAweDBkLCAweGRjLCAweGIxLCAweGNmLCAweGIwLCAweDc4LCAweDNhLCAweGUzLCAweDU2LCAweDhlLAorICAweDkxLCAweDEzLCAweGQzLCAweGY2LCAweDU5LCAweDYxLCAweDAwLCAweGY4LCAweDRiLCAweGE0LCAweDcyLCAweGNiLAorICAweDI2LCAweGRiLCAweDY2LCAweDc0LCAweDY1LCAweGQ1LCAweGEyLCAweDcxLCAweGIxLCAweDQ0LCAweDY1LCAweDQ3LAorICAweDA2LCAweGM5LCAweDczLCAweDFiLCAweGEyLCAweDk2LCAweDAzLCAweGE0LCAweDYwLCAweGEwLCAweDg4LCAweGRlLAorICAweDM4LCAweDc1LCAweGY2LCAweGY2LCAweGU1LCAweGQ2LCAweGRhLCAweGUxLCAweDViLCAweGRhLCAweDk3LCAweDEwLAorICAweDRmLCAweGE2LCAweDZjLCAweDMxLCAweGRmLCAweDJjLCAweDFiLCAweDk3LCAweDUwLCAweGIxLCAweDc4LCAweGNkLAorICAweGJhLCAweGZkLCAweDEwLCAweGEzLCAweDkyLCAweDQzLCAweDFhLCAweDY2LCAweGEzLCAweDIxLCAweDExLCAweDEwLAorICAweDJhLCAweDhhLCAweDk0LCAweGQwLCAweDJkLCAweGQzLCAweDEyLCAweGViLCAweDgwLCAweDljLCAweDc3LCAweDM4LAorICAweGMxLCAweDMwLCAweDBlLCAweDIxLCAweDFhLCAweDhlLCAweDgwLCAweDA0LCAweDBmLCAweDAxLCAweGJmLCAweDMzLAorICAweDY3LCAweGEzLCAweGQ4LCAweDYwLCAweGE4LCAweDM2LCAweDE4LCAweGMwLCAweDExLCAweGUyLCAweDVjLCAweGM2LAorICAweGE1LCAweDYyLCAweGUyLCAweGQxLCAweDZiLCAweGQ2LCAweGExLCAweDg1LCAweGMwLCAweDFjLCAweDE4LCAweDg4LAorICAweDkxLCAweGE0LCAweDNlLCAweDNiLCAweDliLCAweGI5LCAweGQ3LCAweDIxLCAweDA3LCAweGJjLCAweDM0LCAweDQ3LAorICAweDhlLCAweGY2LCAweDU2LCAweDlkLCAweDg0LCAweDZjLCAweGZjLCAweDFiLCAweDE2LCAweDA1LCAweDcxLCAweGFhLAorICAweDEyLCAweDUzLCAweDNkLCAweDViLCAweGM0LCAweGE0LCAweDliLCAweGJiLCAweGI5LCAweGQ4LCAweDdmLCAweGQwLAorICAweDZjLCAweDhkLCAweDhiLCAweDg0LCAweGRmLCAweGYzLCAweGU3LCAweDViLCAweDY4LCAweDMzLCAweDRmLCAweDQxLAorICAweGFhLCAweGNhLCAweGJmLCAweDZmLCAweGJjLCAweDk1LCAweDFjLCAweDM3LCAweGEyLCAweGQ0LCAweGQwLCAweGNlLAorICAweDI1LCAweDU3LCAweDQzLCAweGI5LCAweDRmLCAweDUzLCAweGM1LCAweDkzLCAweDA0LCAweGUyLCAweGJhLCAweDM5LAorICAweDY4LCAweGQxLCAweGZlLCAweDBhLCAweGFhLCAweGIzLCAweGE4LCAweGQ5LCAweDMwLCAweGJkLCAweDlhLCAweDY3LAorICAweDBiLCAweDZjLCAweDI5LCAweGVmLCAweDA4LCAweDRkLCAweDUxLCAweDgyLCAweDkzLCAweDMyLCAweGNlLCAweDgyLAorICAweDAwLCAweGE4LCAweDA3LCAweDgzLCAweDc3LCAweDZhLCAweGMxLCAweDIzLCAweDUwLCAweDBiLCAweDQ1LCAweDI1LAorICAweDYwLCAweDFlLCAweDY4LCAweDAxLCAweDc1LCAweGE0LCAweDRiLCAweDMzLCAweGFkLCAweDFlLCAweDlmLCAweGQwLAorICAweDAxLCAweDZlLCAweGIxLCAweGJjLCAweDI3LCAweDQ0LCAweDViLCAweGFlLCAweDA4LCAweGRmLCAweDMyLCAweDRhLAorICAweGQyLCAweDNjLCAweGIwLCAweDAxLCAweDM4LCAweGVlLCAweDEzLCAweGE2LCAweDk5LCAweDJkLCAweDFkLCAweDgzLAorICAweDczLCAweDEzLCAweDc0LCAweDZhLCAweGRkLCAweGE4LCAweDI2LCAweGVkLCAweGQ0LCAweDg0LCAweDA4LCAweDBjLAorICAweDU0LCAweDQxLCAweDEyLCAweDk5LCAweDhkLCAweDg5LCAweDE2LCAweGE5LCAweDE1LCAweGM0LCAweDhlLCAweDg1LAorICAweGI4LCAweDk3LCAweDBiLCAweDRhLCAweDBkLCAweGM4LCAweGM1LCAweGQ5LCAweDFiLCAweGIzLCAweDJlLCAweDM0LAorICAweDhiLCAweGYzLCAweDY3LCAweGM3LCAweGQ2LCAweDgzLCAweGUxLCAweGRiLCAweDlhLCAweGI3LCAweDI3LCAweGQ0LAorICAweDc0LCAweDYzLCAweGUzLCAweDc1LCAweGY2LCAweDU0LCAweGNhLCAweDNlLCAweDY1LCAweGE3LCAweGRkLCAweDk4LAorICAweDZkLCAweGI1LCAweDhhLCAweDYxLCAweGFmLCAweGViLCAweDZiLCAweDlkLCAweGE1LCAweGQwLCAweGYzLCAweGZlLAorICAweGQxLCAweDhjLCAweGY3LCAweGU3LCAweGQ5LCAweGZkLCAweDMyLCAweGNiLCAweGY2LCAweDZiLCAweDZlLCAweGQ2LAorICAweDYxLCAweGVkLCAweGI2LCAweDAxLCAweDY5LCAweDFkLCAweGQxLCAweGYyLCAweDFjLCAweGM2LCAweGNhLCAweGFmLAorICAweDBkLCAweDFkLCAweGM2LCAweGFlLCAweDc4LCAweGY4LCAweGRjLCAweDNmLCAweDI5LCAweGMwLCAweGY5LCAweDE2LAorICAweDcwLCAweDVhLCAweGRjLCAweDNmLCAweDYzLCAweGFjLCAweGMwLCAweGQ5LCAweDk3LCAweDU3LCAweGYzLCAweDhjLAorICAweDRjLCAweDE2LCAweDcxLCAweDQyLCAweGI1LCAweDU3LCAweGMzLCAweDcwLCAweDg5LCAweDUyLCAweGU0LCAweDExLAorICAweGY1LCAweDVlLCAweGZmLCAweDg1LCAweDNmLCAweDdkLCAweGViLCAweGM3LCAweDI2LCAweGM5LCAweDk1LCAweDEyLAorICAweDJiLCAweDRlLCAweDMzLCAweDI2LCAweDAyLCAweDdkLCAweDQ4LCAweGJiLCAweDY0LCAweDdmLCAweDFlLCAweGQ2LAorICAweDE0LCAweGU5LCAweDQwLCAweDk0LCAweDkyLCAweDRhLCAweDQ1LCAweGVkLCAweDI0LCAweDM3LCAweDc2LCAweGI1LAorICAweGZlLCAweGM4LCAweGI5LCAweDkxLCAweDExLCAweGQzLCAweDY4LCAweDc0LCAweDZjLCAweDczLCAweDg4LCAweDQ2LAorICAweDRhLCAweDUwLCAweDhhLCAweGYzLCAweDgyLCAweGMwLCAweGUwLCAweDIxLCAweDFhLCAweDhlLCAweDAwLCAweDllLAorICAweDBmLCAweDFmLCAweGZmLCAweDMzLCAweDY1LCAweGE3LCAweDMxLCAweDg2LCAweDIwLCAweDU1LCAweGE5LCAweGNlLAorICAweDMyLCAweGQ5LCAweGQxLCAweDY4LCAweDRiLCAweGYzLCAweDcwLCAweDA5LCAweDZiLCAweDJkLCAweDk0LCAweDM4LAorICAweDAyLCAweDQ3LCAweDJlLCAweDY0LCAweDlkLCAweDAxLCAweGY1LCAweDZiLCAweDFjLCAweDc2LCAweDMxLCAweDQ4LAorICAweDMwLCAweGY5LCAweDdmLCAweDFlLCAweDliLCAweDAwLCAweDBhLCAweDQ5LCAweGI0LCAweGY4LCAweDZhLCAweDA3LAorICAweGRhLCAweGE1LCAweDZlLCAweDBlLCAweGYxLCAweDliLCAweGQ1LCAweDk3LCAweGVlLCAweDg2LCAweGUyLCAweDk2LAorICAweDM1LCAweDg2LCAweDIxLCAweGMwLCAweDZlLCAweDc4LCAweDRmLCAweDBkLCAweDIxLCAweDZhLCAweDc0LCAweGNlLAorICAweDc5LCAweGMwLCAweGRlLCAweDY4LCAweDhiLCAweGFhLCAweGVhLCAweGYxLCAweGUyLCAweDk0LCAweDE4LCAweGE4LAorICAweDNiLCAweDY1LCAweDU4LCAweDEwLCAweGNiLCAweGY4LCAweDdlLCAweDJhLCAweDEzLCAweGM1LCAweGY1LCAweGE0LAorICAweDY2LCAweGEzLCAweDNjLCAweGU2LCAweGEyLCAweDA0LCAweDg0LCAweDA0LCAweGE4LCAweDQ4LCAweDU3LCAweGI4LAorICAweDY0LCAweGE3LCAweDI2LCAweDU2LCAweGUzLCAweDIyLCAweGRjLCAweDAwLCAweGE1LCAweDAwLCAweDdmLCAweDdhLAorICAweGRjLCAweDQ2LCAweDUxLCAweDg1LCAweGVjLCAweDU2LCAweDY1LCAweDRkLCAweGE3LCAweGQ2LCAweGZmLCAweDg3LAorICAweGVmLCAweGEwLCAweGIwLCAweDg0LCAweDA0LCAweGQ1LCAweDI2LCAweDQ2LCAweDY5LCAweGI4LCAweDlmLCAweGRjLAorICAweGNjLCAweDIzLCAweDdhLCAweDQxLCAweDJkLCAweDI4LCAweDUzLCAweDM3LCAweGM5LCAweDllLCAweDhhLCAweDJkLAorICAweDI0LCAweGEwLCAweDY5LCAweDJjLCAweDI4LCAweDQ0LCAweGNhLCAweDBhLCAweDAyLCAweDJjLCAweDg4LCAweDY1LAorICAweGRiLCAweDQ0LCAweGU0LCAweGIwLCAweDUyLCAweDViLCAweGE5LCAweDBjLCAweDEwLCAweDIyLCAweDA4LCAweDVhLAorICAweGY2LCAweDNjLCAweDUwLCAweDVlLCAweDgxLCAweDM0LCAweDM1LCAweGU2LCAweGRhLCAweDg1LCAweDkwLCAweDgwLAorICAweDYwLCAweDMxLCAweDRkLCAweGY1LCAweDVmLCAweGUyLCAweDFkLCAweGVlLCAweDBlLCAweDMyLCAweGMzLCAweGJlLAorICAweGE3LCAweDc4LCAweGZhLCAweDY0LCAweGNjLCAweDE2LCAweDU0LCAweDliLCAweDhmLCAweGE5LCAweGYzLCAweDRkLAorICAweGIzLCAweDE0LCAweDU4LCAweDMyLCAweDFjLCAweGM5LCAweDI5LCAweGYzLCAweGRjLCAweDk1LCAweDAzLCAweDkyLAorICAweGI0LCAweDNjLCAweDVkLCAweGJkLCAweDExLCAweGZiLCAweDJiLCAweDYyLCAweGExLCAweDY2LCAweGJjLCAweGI4LAorICAweDcxLCAweDAyLCAweGUwLCAweDYyLCAweDgzLCAweDg5LCAweGM4LCAweGQxLCAweDE2LCAweDU1LCAweDBmLCAweGI4LAorICAweDdjLCAweDA0LCAweDZjLCAweGQ3LCAweGFlLCAweDAyLCAweDNlLCAweGIyLCAweDkzLCAweGFmLCAweDJmLCAweGNiLAorICAweDRjLCAweDM2LCAweDg1LCAweDMyLCAweGYxLCAweDBjLCAweGFjLCAweGIwLCAweDVhLCAweGQ1LCAweDVlLCAweDg3LAorICAweGUwLCAweGU1LCAweDI5LCAweDU2LCAweGM1LCAweGFiLCAweGMyLCAweDQzLCAweGY1LCAweDgxLCAweDNjLCAweDA3LAorICAweDg4LCAweDQ1LCAweDA1LCAweGI4LCAweDE4LCAweDY3LCAweGYwLCAweGZiLCAweGZlLCAweGJlLCAweDYwLCAweDhhLAorICAweDM1LCAweDQ0LCAweDUxLCAweGJjLCAweDVkLCAweDVhLCAweDU0LCAweDk4LCAweDk4LCAweDM5LCAweDRlLCAweDk2LAorICAweDVkLCAweDI0LCAweGU3LCAweDIzLCAweDE1LCAweDRhLCAweGMyLCAweDZhLCAweDI0LCAweDViLCAweDc0LCAweDgwLAorICAweDgwLCAweDIyLCAweDIzLCAweDE0LCAweDk3LCAweDc5LCAweGJmLCAweDUwLCAweDA3LCAweDIxLCAweDFhLCAweDhmLAorICAweGMwLCAweDNlLCAweDNmLCAweGZlLCAweGZmLCAweDNiLCAweDY4LCAweGEzLCAweDU4LCAweGUwLCAweGVjLCAweDI0LAorICAweDEwLCAweGI4LCAweGRmLCAweDE1LCAweDJlLCAweDc3LCAweGMyLCAweDI5LCAweDRiLCAweDJlLCAweDRhLCAweDU5LAorICAweDFjLCAweDIzLCAweDBlLCAweDBiLCAweDJkLCAweDk0LCAweGJjLCAweDAwLCAweDk3LCAweDFjLCAweGUyLCAweDdmLAorICAweDQ4LCAweDFmLCAweDIzLCAweDk4LCAweGU0LCAweDhmLCAweDViLCAweDcyLCAweDViLCAweDcyLCAweDAzLCAweDdiLAorICAweDQ3LCAweDJkLCAweDUzLCAweGI0LCAweGRmLCAweDk2LCAweDkwLCAweGJhLCAweGU1LCAweDAxLCAweDYyLCAweGQzLAorICAweDVhLCAweDk3LCAweDk1LCAweGFlLCAweGQzLCAweDJhLCAweDRiLCAweDc1LCAweDNiLCAweDM5LCAweGE0LCAweDMyLAorICAweGY1LCAweGJjLCAweGU2LCAweGU3LCAweGNhLCAweDRiLCAweDU2LCAweGUwLCAweDNiLCAweDc3LCAweDUyLCAweGI4LAorICAweGU2LCAweDY0LCAweGE5LCAweDc4LCAweGRlLCAweDg2LCAweDg3LCAweDRhLCAweGMyLCAweDdkLCAweDhmLCAweDIyLAorICAweDM3LCAweGJkLCAweGI5LCAweDc3LCAweGVjLCAweGQ3LCAweDZmLCAweDY1LCAweGQ0LCAweGVjLCAweGQ4LCAweDUwLAorICAweDkyLCAweDI4LCAweDE1LCAweDM1LCAweDkzLCAweDZkLCAweGY5LCAweGY1LCAweGQ3LCAweDkwLCAweGI0LCAweDI4LAorICAweGM2LCAweDI1LCAweGMzLCAweDNhLCAweGQ5LCAweDIxLCAweGViLCAweDY5LCAweGY3LCAweGVkLCAweDc2LCAweDk1LAorICAweGI2LCAweGQzLCAweGRmLCAweGMxLCAweDRlLCAweGIyLCAweGQzLCAweDYwLCAweDUxLCAweDVkLCAweDAwLCAweDU3LAorICAweDU1LCAweDk3LCAweDM2LCAweDVhLCAweGQ2LCAweDI3LCAweDIyLCAweGExLCAweDUxLCAweDgzLCAweGUxLCAweGM5LAorICAweDAyLCAweDBjLCAweDA2LCAweDkzLCAweGM5LCAweDFkLCAweGUyLCAweGY1LCAweDkwLCAweDAyLCAweDQ0LCAweDAwLAorICAweDhkLCAweGE1LCAweGY0LCAweDlkLCAweDMzLCAweDY0LCAweGM5LCAweGJlLCAweDIyLCAweGMxLCAweDViLCAweGY5LAorICAweDRjLCAweDMxLCAweDc3LCAweGRiLCAweDE4LCAweGNkLCAweDJiLCAweDhhLCAweGEwLCAweDA1LCAweDNiLCAweDJhLAorICAweDE3LCAweDJhLCAweDA1LCAweGU1LCAweGJlLCAweDUxLCAweGFiLCAweDlmLCAweDQ5LCAweDc0LCAweDZhLCAweGI4LAorICAweDRlLCAweDVhLCAweGE4LCAweDZjLCAweDVhLCAweDFhLCAweDA0LCAweDBjLCAweDIzLCAweDAxLCAweGEwLCAweDQwLAorICAweDYyLCAweDQyLCAweDliLCAweDUyLCAweGQ3LCAweDRhLCAweDM1LCAweDc1LCAweDZiLCAweGZjLCAweDIyLCAweGVjLAorICAweDViLCAweDI5LCAweDc4LCAweDAxLCAweDJlLCAweDM5LCAweDEyLCAweDI3LCAweDhhLCAweDc2LCAweDQ3LCAweDNmLAorICAweGFjLCAweDkxLCAweGRjLCAweDcwLCAweGVhLCAweDMzLCAweGNhLCAweDI2LCAweDYwLCAweGU2LCAweGVlLCAweDhhLAorICAweDc2LCAweGM5LCAweGExLCAweGE4LCAweDgzLCAweGRlLCAweDVjLCAweGMzLCAweDcxLCAweGRiLCAweDUyLCAweDZkLAorICAweDJmLCAweDlhLCAweDhmLCAweDBjLCAweDk2LCAweDkzLCAweDU5LCAweGQ0LCAweDMxLCAweDFlLCAweGExLCAweDc5LAorICAweDczLCAweDE0LCAweGNiLCAweDk1LCAweGM0LCAweGFhLCAweGY3LCAweDk0LCAweGQzLCAweDUyLCAweDdkLCAweGZlLAorICAweDhmLCAweDUwLCAweGYyLCAweDhlLCAweDM5LCAweDhjLCAweGFjLCAweDQwLCAweDQwLCAweDkyLCAweGVmLCAweDcyLAorICAweGU4LCAweDE5LCAweDcyLCAweDM2LCAweGI1LCAweDhjLCAweDZlLCAweDMwLCAweDNmLCAweDc5LCAweGVmLCAweDQ3LAorICAweGI1LCAweGU1LCAweGJmLCAweDU3LCAweGY4LCAweDk0LCAweDgwLCAweDExLCAweDEyLCAweDlkLCAweGEyLCAweGU0LAorICAweGJmLCAweDg0LCAweGEzLCAweGViLCAweDY4LCAweDNiLCAweDRmLCAweGFlLCAweDU4LCAweDczLCAweGY1LCAweDYzLAorICAweDBjLCAweDYwLCAweDExLCAweDk0LCAweDYwLCAweDFjCit9OworCitndWludCBzZWdfMV9tNGZfbGVuID0gNDk1NTQ7CitndWludCBzZWdfMV9tb29mX3NpemUgPSAxMTIwOworZ3VpbnQgc2VnXzFfc2FtcGxlXzBfb2Zmc2V0ID0gMTEyODsKKworc3RhdGljIGNvbnN0IGd1aW50IHNlZ18xX3NhbXBsZV9zaXplc1tdID0geworICAzNzEsIDM3MiwgNDc3LCA1MzAsIDQ4OSwgNDYyLCA0NDEsIDQyMSwgNDIwLCA0MTAsIDQwMiwgMzk4LCAzODEsIDM4MSwgMzg2LAorICAzODYsIDM2OSwgMzcwLCAzNjIsIDM0NiwgMzU3LCAzNTUsIDM3NiwgMzM2LCAzNDEsIDM1OCwgMzUwLCAzNjIsIDMzMywgNDE1LAorICAzODYsIDM2NCwgMzQ0LCAzODYsIDM1OCwgMzY1LCA0MDQsIDM0MiwgMzYxLCAzNjYsIDM2MSwgMzUwLCAzOTAsIDM0OCwgMzY2LAorICAzNTksIDM1NywgMzYwLCAzNDksIDM1NiwgMzY1LCAzOTMsIDM1MywgMzg1LCAzODEsIDM0OCwgMzQ1LCA0MTQsIDM3MiwgMzY5LAorICA0MDEsIDM5MSwgMzMzLCAzMzksIDQyMywgMzQzLCA0NDUsIDQyNSwgNDIyLCA0MTUsIDQwNiwgMzg5LCAzOTUsIDM3NSwgMzU2LAorICA0NDIsIDQzMiwgMzkxLCAzODUsIDMzOSwgMjc3LCAyOTMsIDMxNiwgMzI3LCAzMDksIDM4OSwgMzU5LCA0MjcsIDMyNiwgNDIwLAorICA0MDcsIDMxNiwgMzYyLCA0MTksIDM0OSwgMzg3LCAzMjYsIDMyOCwgMzY3LCAzNDQsIDQyNSwgMzI5LCAzNzksIDQwMywgMzE0LAorICAzOTcsIDM2OCwgMzg5LCAzODAsIDM3MywgMzQyLCAzNDMsIDM2OCwgNDM2LCAzNTksIDM1MiwgMzYxLCAzNjYsIDM1MCwgNDE5LAorICAzMzEsIDQyNiwgNDAxLCAzODIsIDMyNiwgNDExLCAzNjQsIDMzOCwgMzQ1Cit9OworCisvKiBpbiB0aW1lc2NhbGUgKi8KK0dzdENsb2NrVGltZSBzZWdfMV9zYW1wbGVfZHVyYXRpb24gPSAxMDI0OworZ3VpbnQzMiBzZWdfMV90aW1lc2NhbGUgPSA0NDEwMDsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MmI0MDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jCkBAIC0wLDAgKzEsMTYyOCBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciBxdG11eAorICoKKyAqIENvcHlyaWdodCAoQykgPDIwMDg+IE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNmLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdsaWIvZ3N0ZGlvLmg+CisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvcGJ1dGlscy9lbmNvZGluZy1wcm9maWxlLmg+CisKKy8qIEZvciBlYXNlIG9mIHByb2dyYW1taW5nIHdlIHVzZSBnbG9iYWxzIHRvIGtlZXAgcmVmcyBmb3Igb3VyIGZsb2F0aW5nCisgKiBzcmMgYW5kIHNpbmsgcGFkcyB3ZSBjcmVhdGU7IG90aGVyd2lzZSB3ZSBhbHdheXMgaGF2ZSB0byBkbyBnZXRfcGFkLAorICogZ2V0X3BlZXIsIGFuZCB0aGVuIHJlbW92ZSByZWZlcmVuY2VzIGluIGV2ZXJ5IHRlc3QgZnVuY3Rpb24gKi8KK3N0YXRpYyBHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworCisjZGVmaW5lIFZJREVPX1JBV19DQVBTX1NUUklORyAidmlkZW8veC1yYXciCisKKyNkZWZpbmUgQVVESU9fQ0FQU19TVFJJTkcgImF1ZGlvL21wZWcsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIm1wZWd2ZXJzaW9uID0gKGludCkgMSwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAibGF5ZXIgPSAoaW50KSAzLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjaGFubmVscyA9IChpbnQpIDIsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgInJhdGUgPSAoaW50KSA0ODAwMCIKKworI2RlZmluZSBBVURJT19BQUNfVE1QTF9DQVBTX1NUUklORyAiYXVkaW8vbXBlZywgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtcGVndmVyc2lvbj0oaW50KTQsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hhbm5lbHM9KGludCkxLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJhdGU9KGludCk0NDEwMCwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJlYW0tZm9ybWF0PShzdHJpbmcpcmF3LCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxldmVsPShzdHJpbmcpMiwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNlLXByb2ZpbGU9KHN0cmluZylsYywgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9maWxlPShzdHJpbmcpbGMiCisvKiBjb2RlY19kYXRhIHNob3VsZG4ndCBiZSBpbiB0aGUgdGVtcGxhdGUgY2Fwcywgb25seSBpbiB0aGUgYWN0dWFsIGNhcHMgKi8KKyNkZWZpbmUgQVVESU9fQUFDX0NBUFNfU1RSSU5HIEFVRElPX0FBQ19UTVBMX0NBUFNfU1RSSU5HIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGNvZGVjX2RhdGE9KGJ1ZmZlcikxMjA4IgorCisjZGVmaW5lIFZJREVPX0NBUFNfU1RSSU5HICJ2aWRlby9tcGVnLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJtcGVndmVyc2lvbiA9IChpbnQpIDQsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInN5c3RlbXN0cmVhbSA9IChib29sZWFuKSBmYWxzZSwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAid2lkdGggPSAoaW50KSAzODQsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlaWdodCA9IChpbnQpIDI4OCwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSAyNS8xIgorCisjZGVmaW5lIFZJREVPX1RNUExfQ0FQU19IMjY0X1NUUklORyAidmlkZW8veC1oMjY0LCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aD0oaW50KTMyMCwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0PShpbnQpMjQwLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmFtZXJhdGU9KGZyYWN0aW9uKTMwLzEsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBpeGVsLWFzcGVjdC1yYXRpbz0oZnJhY3Rpb24pMS8xLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJlYW0tZm9ybWF0PShzdHJpbmcpYXZjLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbGlnbm1lbnQ9KHN0cmluZylhdSwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGV2ZWw9KHN0cmluZykyLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9maWxlPShzdHJpbmcpaGlnaCIKKy8qIGNvZGVjX2RhdGEgc2hvdWxkbid0IGJlIGluIHRoZSB0ZW1wbGF0ZSBjYXBzLCBvbmx5IGluIHRoZSBhY3R1YWwgY2FwcyAqLworI2RlZmluZSBWSURFT19DQVBTX0gyNjRfU1RSSU5HIFZJREVPX1RNUExfQ0FQU19IMjY0X1NUUklORyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgY29kZWNfZGF0YT0oYnVmZmVyKTAxNjQwMDE0ZmZlMTAwMTg2NzY0MDAxNGEiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNkOTQxNDFmYjAxMTAwMDAwMDMwMDE3NzM1OTQwMDBmMTQyOTk2MDAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwMDA1NjhlYmVjYjIyYyIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3F1aWNrdGltZSIpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3ZpZGVvdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChWSURFT19DQVBTX1NUUklORykpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdmlkZW9oMjY0dGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoVklERU9fVE1QTF9DQVBTX0gyNjRfU1RSSU5HKSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN2aWRlb3Jhd3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFZJREVPX1JBV19DQVBTX1NUUklORykpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjYXVkaW90ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEFVRElPX0NBUFNfU1RSSU5HKSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNhdWRpb2FhY3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEFVRElPX0FBQ19UTVBMX0NBUFNfU1RSSU5HKSk7CisKKy8qIHNldHVwIGFuZCB0ZWFyZG93biBuZWVkcyBzb21lIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG11eGVyICovCitzdGF0aWMgR3N0UGFkICoKK3NldHVwX3NyY19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRpY1BhZFRlbXBsYXRlICogdGVtcGxhdGUsIGNvbnN0IGdjaGFyICogc2lua25hbWUpCit7CisgIEdzdFBhZCAqc3JjcGFkLCAqc2lua3BhZDsKKworICBHU1RfREVCVUdfT0JKRUNUIChlbGVtZW50LCAic2V0dGluZyB1cCBzZW5kaW5nIHBhZCIpOworICAvKiBzZW5kaW5nIHBhZCAqLworICBzcmNwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAodGVtcGxhdGUsICJzcmMiKTsKKyAgZmFpbF9pZiAoc3JjcGFkID09IE5VTEwsICJDb3VsZCBub3QgY3JlYXRlIGEgc3JjcGFkIik7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHNyY3BhZCwgInNyY3BhZCIsIDEpOworCisgIGlmICghKHNpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoZWxlbWVudCwgc2lua25hbWUpKSkKKyAgICBzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChlbGVtZW50LCBzaW5rbmFtZSk7CisgIGZhaWxfaWYgKHNpbmtwYWQgPT0gTlVMTCwgIkNvdWxkIG5vdCBnZXQgc2luayBwYWQgZnJvbSAlcyIsCisgICAgICBHU1RfRUxFTUVOVF9OQU1FIChlbGVtZW50KSk7CisgIC8qIHJlZmVyZW5jZXMgYXJlIG93bmVkIGJ5OiAxKSB1cywgMikgcXRtdXgsIDMpIGNvbGxlY3QgcGFkcyAqLworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChzaW5rcGFkLCAic2lua3BhZCIsIDMpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rIChzcmNwYWQsIHNpbmtwYWQpID09IEdTVF9QQURfTElOS19PSywKKyAgICAgICJDb3VsZCBub3QgbGluayBzb3VyY2UgYW5kICVzIHNpbmsgcGFkcyIsIEdTVF9FTEVNRU5UX05BTUUgKGVsZW1lbnQpKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZCk7ICAgLyogYmVjYXVzZSB3ZSBnb3QgaXQgaGlnaGVyIHVwICovCisKKyAgLyogcmVmZXJlbmNlcyBhcmUgb3duZWQgYnk6IDEpIHF0bXV4LCAyKSBjb2xsZWN0IHBhZHMgKi8KKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoc2lua3BhZCwgInNpbmtwYWQiLCAyKTsKKworICByZXR1cm4gc3JjcGFkOworfQorCitzdGF0aWMgdm9pZAordGVhcmRvd25fc3JjX3BhZCAoR3N0UGFkICogc3JjcGFkKQoreworICBHc3RQYWQgKnNpbmtwYWQ7CisKKyAgLyogY2xlYW4gdXAgZmxvYXRpbmcgc3JjIHBhZCAqLworICBzaW5rcGFkID0gZ3N0X3BhZF9nZXRfcGVlciAoc3JjcGFkKTsKKyAgZmFpbF9pZiAoc2lua3BhZCA9PSBOVUxMKTsKKyAgLyogcGFkIHJlZnMgaGVsZCBieSAxKSBxdG11eCAyKSBjb2xsZWN0cGFkcyBhbmQgMykgdXMgKHRocm91Z2ggX2dldF9wZWVyKSAqLworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChzaW5rcGFkLCAic2lua3BhZCIsIDMpOworCisgIGdzdF9wYWRfdW5saW5rIChzcmNwYWQsIHNpbmtwYWQpOworCisgIC8qIGFmdGVyIHVubGlua2luZywgcGFkIHJlZnMgc3RpbGwgaGVsZCBieQorICAgKiAxKSBxdG11eCBhbmQgMikgY29sbGVjdHBhZHMgYW5kIDMpIHVzICh0aHJvdWdoIF9nZXRfcGVlcikgKi8KKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoc2lua3BhZCwgInNpbmtwYWQiLCAzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZCk7CisgIC8qIG9uZSBtb3JlIHJlZiBpcyBoZWxkIGJ5IGVsZW1lbnQgaXRzZWxmICovCisKKyAgLyogcGFkIHJlZnMgaGVsZCBieSBjcmVhdG9yICovCisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHNyY3BhZCwgInNyY3BhZCIsIDEpOworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworfQorCitnYm9vbGVhbiBkb3duc3RyZWFtX2lzX3NlZWthYmxlOworc3RhdGljIGdib29sZWFuCitxdG11eF9zaW5rcGFkX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgaWYgKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkgPT0gR1NUX1FVRVJZX1NFRUtJTkcpIHsKKyAgICBnc3RfcXVlcnlfc2V0X3NlZWtpbmcgKHF1ZXJ5LCBHU1RfRk9STUFUX0JZVEVTLCBkb3duc3RyZWFtX2lzX3NlZWthYmxlLCAwLAorICAgICAgICAtMSk7CisgICAgcmV0ID0gVFJVRTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX3F0bXV4IChHc3RTdGF0aWNQYWRUZW1wbGF0ZSAqIHNyY3RlbXBsYXRlLCBjb25zdCBnY2hhciAqIHNpbmtuYW1lLAorICAgIGdib29sZWFuIHNlZWthYmxlKQoreworICBHc3RFbGVtZW50ICpxdG11eDsKKworICBHU1RfREVCVUcgKCJzZXR1cF9xdG11eCIpOworICBxdG11eCA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgicXRtdXgiKTsKKyAgbXlzcmNwYWQgPSBzZXR1cF9zcmNfcGFkIChxdG11eCwgc3JjdGVtcGxhdGUsIHNpbmtuYW1lKTsKKyAgbXlzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChxdG11eCwgJnNpbmt0ZW1wbGF0ZSk7CisKKyAgZG93bnN0cmVhbV9pc19zZWVrYWJsZSA9IHNlZWthYmxlOworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAobXlzaW5rcGFkLCBxdG11eF9zaW5rcGFkX3F1ZXJ5KTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIFRSVUUpOworCisgIHJldHVybiBxdG11eDsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfcXRtdXggKEdzdEVsZW1lbnQgKiBxdG11eCwgY29uc3QgZ2NoYXIgKiBzaW5rbmFtZSkKK3sKKyAgR1NUX0RFQlVHICgiY2xlYW51cF9xdG11eCIpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHF0bXV4LCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICB0ZWFyZG93bl9zcmNfcGFkIChteXNyY3BhZCk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAocXRtdXgpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAocXRtdXgpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfcXRtdXhfcGFkIChHc3RTdGF0aWNQYWRUZW1wbGF0ZSAqIHNyY3RlbXBsYXRlLCBjb25zdCBnY2hhciAqIHNpbmtuYW1lLAorICAgIGd1aW50MzIgZHRzX21ldGhvZCkKK3sKKyAgR3N0RWxlbWVudCAqcXRtdXg7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGludCBudW1fYnVmZmVyczsKKyAgaW50IGk7CisgIGd1aW50OCBkYXRhMFsxMl0gPSAiXDAwMFwwMDBcMDAwXDAyNGZ0eXBxdCAgIjsKKyAgZ3VpbnQ4IGRhdGExWzE2XSA9ICJcMDAwXDAwMFwwMDBcMDEwZnJlZVwwMDBcMDAwXDAwMFwwMDBtZGF0IjsKKyAgZ3VpbnQ4IGRhdGEyWzRdID0gIm1vb3YiOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgcXRtdXggPSBzZXR1cF9xdG11eCAoc3JjdGVtcGxhdGUsIHNpbmtuYW1lLCBUUlVFKTsKKyAgZ19vYmplY3Rfc2V0IChxdG11eCwgImR0cy1tZXRob2QiLCBkdHNfbWV0aG9kLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocXRtdXgsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoInRlc3QiKSk7CisKKyAgY2FwcyA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChteXNyY3BhZCk7CisgIGdzdF9wYWRfc2V0X2NhcHMgKG15c3JjcGFkLCBjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIC8qIGVuc3VyZSBzZWdtZW50IChmb3JtYXQpIHByb3Blcmx5IHNldHVwICovCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpKTsKKworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMSk7CisgIGdzdF9idWZmZXJfbWVtc2V0IChpbmJ1ZmZlciwgMCwgMCwgMSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChpbmJ1ZmZlcikgPSA0MCAqIEdTVF9NU0VDT05EOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworCisgIC8qIHNlbmQgZW9zIHRvIGhhdmUgbW9vdiB3cml0dGVuICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkgPT0gVFJVRSk7CisKKyAgbnVtX2J1ZmZlcnMgPSBnX2xpc3RfbGVuZ3RoIChidWZmZXJzKTsKKyAgLyogYXQgbGVhc3QgZXhwZWN0IGZ0eXAsIG1kYXQgaGVhZGVyLCBidWZmZXIgY2h1bmsgYW5kIG1vb3YgKi8KKyAgZmFpbF91bmxlc3MgKG51bV9idWZmZXJzID49IDQpOworCisgIC8qIGNsZWFuIHVwIGZpcnN0IHRvIGNsZWFyIGFueSBwZW5kaW5nIHJlZnMgaW4gc3RpY2t5IGNhcHMgKi8KKyAgY2xlYW51cF9xdG11eCAocXRtdXgsIHNpbmtuYW1lKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2J1ZmZlcnM7ICsraSkgeworICAgIG91dGJ1ZmZlciA9IEdTVF9CVUZGRVIgKGJ1ZmZlcnMtPmRhdGEpOworICAgIGZhaWxfaWYgKG91dGJ1ZmZlciA9PSBOVUxMKTsKKyAgICBidWZmZXJzID0gZ19saXN0X3JlbW92ZSAoYnVmZmVycywgb3V0YnVmZmVyKTsKKworICAgIHN3aXRjaCAoaSkgeworICAgICAgY2FzZSAwOgorICAgICAgeworICAgICAgICAvKiBmdHlwIGhlYWRlciAqLworICAgICAgICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAob3V0YnVmZmVyKSA+PSAyMCk7CisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAob3V0YnVmZmVyLCAwLCBkYXRhMCwKKyAgICAgICAgICAgICAgICBzaXplb2YgKGRhdGEwKSkgPT0gMCk7CisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAob3V0YnVmZmVyLCAxNiwgZGF0YTAgKyA4LCA0KSA9PSAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgLyogbWRhdCBoZWFkZXIgKi8KKyAgICAgICAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZmZlcikgPT0gMTYpOworICAgICAgICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgMCwgZGF0YTEsIHNpemVvZiAoZGF0YTEpKQorICAgICAgICAgICAgPT0gMCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgIC8qIGJ1ZmZlciB3ZSBwdXQgaW4gKi8KKyAgICAgICAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZmZlcikgPT0gMSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgIC8qIG1vb3YgKi8KKyAgICAgICAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZmZlcikgPiA4KTsKKyAgICAgICAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChvdXRidWZmZXIsIDQsIGRhdGEyLAorICAgICAgICAgICAgICAgIHNpemVvZiAoZGF0YTIpKSA9PSAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChvdXRidWZmZXIsICJvdXRidWZmZXIiLCAxKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWZmZXIpOworICAgIG91dGJ1ZmZlciA9IE5VTEw7CisgIH0KKworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfcXRtdXhfcGFkX2ZyYWdtZW50ZWQgKEdzdFN0YXRpY1BhZFRlbXBsYXRlICogc3JjdGVtcGxhdGUsCisgICAgY29uc3QgZ2NoYXIgKiBzaW5rbmFtZSwgZ3VpbnQzMiBkdHNfbWV0aG9kLCBnYm9vbGVhbiBzdHJlYW1hYmxlKQoreworICBHc3RFbGVtZW50ICpxdG11eDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgaW50IG51bV9idWZmZXJzOworICBpbnQgaTsKKyAgZ3VpbnQ4IGRhdGEwWzEyXSA9ICJcMDAwXDAwMFwwMDBcMDI0ZnR5cHF0ICAiOworICBndWludDggZGF0YTFbNF0gPSAibWRhdCI7CisgIGd1aW50OCBkYXRhMls0XSA9ICJtb292IjsKKyAgZ3VpbnQ4IGRhdGEzWzRdID0gIm1vb2YiOworICBndWludDggZGF0YTRbNF0gPSAibWZyYSI7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBxdG11eCA9IHNldHVwX3F0bXV4IChzcmN0ZW1wbGF0ZSwgc2lua25hbWUsICFzdHJlYW1hYmxlKTsKKyAgZ19vYmplY3Rfc2V0IChxdG11eCwgImR0cy1tZXRob2QiLCBkdHNfbWV0aG9kLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChxdG11eCwgImZyYWdtZW50LWR1cmF0aW9uIiwgMjAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAocXRtdXgsICJzdHJlYW1hYmxlIiwgc3RyZWFtYWJsZSwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHF0bXV4LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKCJ0ZXN0IikpOworCisgIGNhcHMgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAobXlzcmNwYWQpOworICBnc3RfcGFkX3NldF9jYXBzIChteXNyY3BhZCwgY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAvKiBlbnN1cmUgc2VnbWVudCAoZm9ybWF0KSBwcm9wZXJseSBzZXR1cCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEpOworICBnc3RfYnVmZmVyX21lbXNldCAoaW5idWZmZXIsIDAsIDAsIDEpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAoaW5idWZmZXIpID0gNDAgKiBHU1RfTVNFQ09ORDsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKworICAvKiBzZW5kIGVvcyB0byBoYXZlIGFsbCB3cml0dGVuICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkgPT0gVFJVRSk7CisKKyAgbnVtX2J1ZmZlcnMgPSBnX2xpc3RfbGVuZ3RoIChidWZmZXJzKTsKKyAgLyogYXQgbGVhc3QgZXhwZWN0IGZ0eXAsIG1vb3YsIG1vb2YsIG1kYXQgaGVhZGVyLCBidWZmZXIgY2h1bmsKKyAgICogYW5kIG9wdGlvbmFsbHkgbWZyYSAqLworICBmYWlsX3VubGVzcyAobnVtX2J1ZmZlcnMgPj0gNSk7CisKKyAgLyogY2xlYW4gdXAgZmlyc3QgdG8gY2xlYXIgYW55IHBlbmRpbmcgcmVmcyBpbiBzdGlja3kgY2FwcyAqLworICBjbGVhbnVwX3F0bXV4IChxdG11eCwgc2lua25hbWUpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fYnVmZmVyczsgKytpKSB7CisgICAgb3V0YnVmZmVyID0gR1NUX0JVRkZFUiAoYnVmZmVycy0+ZGF0YSk7CisgICAgZmFpbF9pZiAob3V0YnVmZmVyID09IE5VTEwpOworICAgIGJ1ZmZlcnMgPSBnX2xpc3RfcmVtb3ZlIChidWZmZXJzLCBvdXRidWZmZXIpOworCisgICAgc3dpdGNoIChpKSB7CisgICAgICBjYXNlIDA6CisgICAgICB7CisgICAgICAgIC8qIGZ0eXAgaGVhZGVyICovCisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWZmZXIpID49IDIwKTsKKyAgICAgICAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChvdXRidWZmZXIsIDAsIGRhdGEwLAorICAgICAgICAgICAgICAgIHNpemVvZiAoZGF0YTApKSA9PSAwKTsKKyAgICAgICAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChvdXRidWZmZXIsIDE2LCBkYXRhMCArIDgsIDQpID09IDApOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAvKiBtb292ICovCisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWZmZXIpID4gOCk7CisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAob3V0YnVmZmVyLCA0LCBkYXRhMiwKKyAgICAgICAgICAgICAgICBzaXplb2YgKGRhdGEyKSkgPT0gMCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgIC8qIG1vb2YgKi8KKyAgICAgICAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZmZlcikgPiA4KTsKKyAgICAgICAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChvdXRidWZmZXIsIDQsIGRhdGEzLAorICAgICAgICAgICAgICAgIHNpemVvZiAoZGF0YTMpKSA9PSAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgLyogbWRhdCBoZWFkZXIgKi8KKyAgICAgICAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZmZlcikgPT0gOCk7CisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAob3V0YnVmZmVyLCA0LCBkYXRhMSwKKyAgICAgICAgICAgICAgICBzaXplb2YgKGRhdGExKSkgPT0gMCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0OiAgICAgICAgICAgICAgICAgIC8qIGJ1ZmZlciB3ZSBwdXQgaW4gKi8KKyAgICAgICAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZmZlcikgPT0gMSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1OiAgICAgICAgICAgICAgICAgIC8qIG1mcmEgKi8KKyAgICAgICAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZmZlcikgPiA4KTsKKyAgICAgICAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChvdXRidWZmZXIsIDQsIGRhdGE0LAorICAgICAgICAgICAgICAgIHNpemVvZiAoZGF0YTQpKSA9PSAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChvdXRidWZmZXIsICJvdXRidWZmZXIiLCAxKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWZmZXIpOworICAgIG91dGJ1ZmZlciA9IE5VTEw7CisgIH0KKworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworfQorCisvKiBkdHMtbWV0aG9kIGRkICovCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3ZpZGVvX3BhZF9kZCkKK3sKKyAgY2hlY2tfcXRtdXhfcGFkICgmc3JjdmlkZW90ZW1wbGF0ZSwgInZpZGVvXyV1IiwgMCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYXVkaW9fcGFkX2RkKQoreworICBjaGVja19xdG11eF9wYWQgKCZzcmNhdWRpb3RlbXBsYXRlLCAiYXVkaW9fJXUiLCAwKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3ZpZGVvX3BhZF9mcmFnX2RkKQoreworICBjaGVja19xdG11eF9wYWRfZnJhZ21lbnRlZCAoJnNyY3ZpZGVvdGVtcGxhdGUsICJ2aWRlb18ldSIsIDAsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9hdWRpb19wYWRfZnJhZ19kZCkKK3sKKyAgY2hlY2tfcXRtdXhfcGFkX2ZyYWdtZW50ZWQgKCZzcmNhdWRpb3RlbXBsYXRlLCAiYXVkaW9fJXUiLCAwLCBGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF92aWRlb19wYWRfZnJhZ19kZF9zdHJlYW1hYmxlKQoreworICBjaGVja19xdG11eF9wYWRfZnJhZ21lbnRlZCAoJnNyY3ZpZGVvdGVtcGxhdGUsICJ2aWRlb18ldSIsIDAsIFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYXVkaW9fcGFkX2ZyYWdfZGRfc3RyZWFtYWJsZSkKK3sKKyAgY2hlY2tfcXRtdXhfcGFkX2ZyYWdtZW50ZWQgKCZzcmNhdWRpb3RlbXBsYXRlLCAiYXVkaW9fJXUiLCAwLCBUUlVFKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBkdHMtbWV0aG9kIHJlb3JkZXIgKi8KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdmlkZW9fcGFkX3Jlb3JkZXIpCit7CisgIGNoZWNrX3F0bXV4X3BhZCAoJnNyY3ZpZGVvdGVtcGxhdGUsICJ2aWRlb18ldSIsIDEpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2F1ZGlvX3BhZF9yZW9yZGVyKQoreworICBjaGVja19xdG11eF9wYWQgKCZzcmNhdWRpb3RlbXBsYXRlLCAiYXVkaW9fJXUiLCAxKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3ZpZGVvX3BhZF9mcmFnX3Jlb3JkZXIpCit7CisgIGNoZWNrX3F0bXV4X3BhZF9mcmFnbWVudGVkICgmc3JjdmlkZW90ZW1wbGF0ZSwgInZpZGVvXyV1IiwgMSwgRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2F1ZGlvX3BhZF9mcmFnX3Jlb3JkZXIpCit7CisgIGNoZWNrX3F0bXV4X3BhZF9mcmFnbWVudGVkICgmc3JjYXVkaW90ZW1wbGF0ZSwgImF1ZGlvXyV1IiwgMSwgRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdmlkZW9fcGFkX2ZyYWdfcmVvcmRlcl9zdHJlYW1hYmxlKQoreworICBjaGVja19xdG11eF9wYWRfZnJhZ21lbnRlZCAoJnNyY3ZpZGVvdGVtcGxhdGUsICJ2aWRlb18ldSIsIDEsIFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYXVkaW9fcGFkX2ZyYWdfcmVvcmRlcl9zdHJlYW1hYmxlKQoreworICBjaGVja19xdG11eF9wYWRfZnJhZ21lbnRlZCAoJnNyY2F1ZGlvdGVtcGxhdGUsICJhdWRpb18ldSIsIDEsIFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIGR0cy1tZXRob2QgYXNjICovCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3ZpZGVvX3BhZF9hc2MpCit7CisgIGNoZWNrX3F0bXV4X3BhZCAoJnNyY3ZpZGVvdGVtcGxhdGUsICJ2aWRlb18ldSIsIDIpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2F1ZGlvX3BhZF9hc2MpCit7CisgIGNoZWNrX3F0bXV4X3BhZCAoJnNyY2F1ZGlvdGVtcGxhdGUsICJhdWRpb18ldSIsIDIpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdmlkZW9fcGFkX2ZyYWdfYXNjKQoreworICBjaGVja19xdG11eF9wYWRfZnJhZ21lbnRlZCAoJnNyY3ZpZGVvdGVtcGxhdGUsICJ2aWRlb18ldSIsIDIsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9hdWRpb19wYWRfZnJhZ19hc2MpCit7CisgIGNoZWNrX3F0bXV4X3BhZF9mcmFnbWVudGVkICgmc3JjYXVkaW90ZW1wbGF0ZSwgImF1ZGlvXyV1IiwgMiwgRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdmlkZW9fcGFkX2ZyYWdfYXNjX3N0cmVhbWFibGUpCit7CisgIGNoZWNrX3F0bXV4X3BhZF9mcmFnbWVudGVkICgmc3JjdmlkZW90ZW1wbGF0ZSwgInZpZGVvXyV1IiwgMiwgVFJVRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9hdWRpb19wYWRfZnJhZ19hc2Nfc3RyZWFtYWJsZSkKK3sKKyAgY2hlY2tfcXRtdXhfcGFkX2ZyYWdtZW50ZWQgKCZzcmNhdWRpb3RlbXBsYXRlLCAiYXVkaW9fJXUiLCAyLCBUUlVFKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9yZXVzZSkKK3sKKyAgR3N0RWxlbWVudCAqcXRtdXggPSBzZXR1cF9xdG11eCAoJnNyY3ZpZGVvdGVtcGxhdGUsICJ2aWRlb18ldSIsIFRSVUUpOworICBHc3RCdWZmZXIgKmluYnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChxdG11eCwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHF0bXV4LCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocXRtdXgsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICBnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoInRlc3QiKSk7CisKKyAgY2FwcyA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChteXNyY3BhZCk7CisgIGdzdF9wYWRfc2V0X2NhcHMgKG15c3JjcGFkLCBjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIC8qIGVuc3VyZSBzZWdtZW50IChmb3JtYXQpIHByb3Blcmx5IHNldHVwICovCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpKTsKKworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMSk7CisgIGZhaWxfdW5sZXNzIChpbmJ1ZmZlciAhPSBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tZW1zZXQgKGluYnVmZmVyLCAwLCAwLCAxKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGluYnVmZmVyKSA9IDQwICogR1NUX01TRUNPTkQ7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisKKyAgLyogc2VuZCBlb3MgdG8gaGF2ZSBhbGwgd3JpdHRlbiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpID09IFRSVUUpOworCisgIGNsZWFudXBfcXRtdXggKHF0bXV4LCAidmlkZW9fJXUiKTsKKyAgZ3N0X2NoZWNrX2Ryb3BfYnVmZmVycyAoKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgR3N0RW5jb2RpbmdDb250YWluZXJQcm9maWxlICoKK2NyZWF0ZV9xdG11eF9wcm9maWxlIChjb25zdCBnY2hhciAqIHZhcmlhbnQpCit7CisgIEdzdEVuY29kaW5nQ29udGFpbmVyUHJvZmlsZSAqY3Byb2Y7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgaWYgKHZhcmlhbnQgPT0gTlVMTCkgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgidmlkZW8vcXVpY2t0aW1lIik7CisgIH0gZWxzZSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby9xdWlja3RpbWUiLAorICAgICAgICAidmFyaWFudCIsIEdfVFlQRV9TVFJJTkcsIHZhcmlhbnQsIE5VTEwpOworICB9CisKKyAgY3Byb2YgPSBnc3RfZW5jb2RpbmdfY29udGFpbmVyX3Byb2ZpbGVfbmV3ICgiTmFtZSIsICJibGFoIiwgY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcmF3IiwKKyAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiUzE2QkUiLAorICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMiwgInJhdGUiLCBHX1RZUEVfSU5ULCA0NDEwMCwgTlVMTCk7CisgIGdzdF9lbmNvZGluZ19jb250YWluZXJfcHJvZmlsZV9hZGRfcHJvZmlsZSAoY3Byb2YsCisgICAgICBHU1RfRU5DT0RJTkdfUFJPRklMRSAoZ3N0X2VuY29kaW5nX2F1ZGlvX3Byb2ZpbGVfbmV3IChjYXBzLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAxKSkpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgcmV0dXJuIGNwcm9mOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9lbmNvZGViaW5fcXRtdXgpCit7CisgIEdzdEVuY29kaW5nQ29udGFpbmVyUHJvZmlsZSAqY3Byb2Y7CisgIEdzdEVsZW1lbnQgKmVuYzsKKyAgR3N0UGFkICpwYWQ7CisKKyAgZW5jID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZW5jb2RlYmluIiwgTlVMTCk7CisgIGlmIChlbmMgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgLyogTWFrZSBzdXJlIGVuY29kZWJpbiBmaW5kcyBhIG11eGVyIGZvciBhIHByb2ZpbGUgd2l0aCBhIHZhcmlhbnQgZmllbGQgLi4gKi8KKyAgY3Byb2YgPSBjcmVhdGVfcXRtdXhfcHJvZmlsZSAoImFwcGxlIik7CisgIGdfb2JqZWN0X3NldCAoZW5jLCAicHJvZmlsZSIsIGNwcm9mLCBOVUxMKTsKKyAgZ3N0X2VuY29kaW5nX3Byb2ZpbGVfdW5yZWYgKGNwcm9mKTsKKworICAvKiBzaG91bGQgaGF2ZSBjcmVhdGVkIGEgcGFkIGFmdGVyIHNldHRpbmcgdGhlIHByb2ZpbGUgKi8KKyAgcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGVuYywgImF1ZGlvXzAiKTsKKyAgZmFpbF91bmxlc3MgKHBhZCAhPSBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoZW5jKTsKKworICAvKiAuLi4gYW5kIGZvciBhIHByb2ZpbGUgd2l0aG91dCBhIHZhcmlhbnQgZmllbGQgKi8KKyAgZW5jID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZW5jb2RlYmluIiwgTlVMTCk7CisgIGNwcm9mID0gY3JlYXRlX3F0bXV4X3Byb2ZpbGUgKE5VTEwpOworICBnX29iamVjdF9zZXQgKGVuYywgInByb2ZpbGUiLCBjcHJvZiwgTlVMTCk7CisgIGdzdF9lbmNvZGluZ19wcm9maWxlX3VucmVmIChjcHJvZik7CisKKyAgLyogc2hvdWxkIGhhdmUgY3JlYXRlZCBhIHBhZCBhZnRlciBzZXR0aW5nIHRoZSBwcm9maWxlICovCisgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChlbmMsICJhdWRpb18wIik7CisgIGZhaWxfdW5sZXNzIChwYWQgIT0gTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGVuYyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogRmFrZSBtcDMgZW5jb2RlciBmb3IgdGVzdCAqLwordHlwZWRlZiBHc3RFbGVtZW50IFRlc3RNcDNFbmM7Cit0eXBlZGVmIEdzdEVsZW1lbnRDbGFzcyBUZXN0TXAzRW5jQ2xhc3M7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249MSwgbGF5ZXI9WzEsM10iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXciKQorICAgICk7CisKK3N0YXRpYyBHVHlwZSB0ZXN0X21wM19lbmNfZ2V0X3R5cGUgKHZvaWQpOworc3RhdGljIHZvaWQgdGVzdF9pbnB1dF9wdXNoX3NlZ21lbnRfc3RhcnQgKGdwb2ludGVyIHVzZXJfZGF0YSwKKyAgICBHc3RDbG9ja1RpbWUgc3RhcnQpOworCitHX0RFRklORV9UWVBFIChUZXN0TXAzRW5jLCB0ZXN0X21wM19lbmMsIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgdm9pZAordGVzdF9tcDNfZW5jX2NsYXNzX2luaXQgKFRlc3RNcDNFbmNDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJNUEVHMSBBdWRpbyBFbmNvZGVyIiwKKyAgICAgICJDb2RlYy9FbmNvZGVyL0F1ZGlvIiwgIlByZXRlbmRzIHRvIGVuY29kZSBtcDMiLCAiRm9vIEJhciA8Zm9vQGJhci5jb20+Iik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X21wM19lbmNfaW5pdCAoVGVzdE1wM0VuYyAqIG1wM2VuYykKK3sKKyAgR3N0UGFkICpwYWQ7CisKKyAgcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzaW5rX3RlbXBsYXRlLCAic2luayIpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChtcDNlbmMsIHBhZCk7CisKKyAgcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzcmNfdGVtcGxhdGUsICJzcmMiKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAobXAzZW5jLCBwYWQpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAidGVzdG1wM2VuYyIsIEdTVF9SQU5LX05PTkUsCisgICAgICB0ZXN0X21wM19lbmNfZ2V0X3R5cGUgKCkpOworfQorCitzdGF0aWMgR3N0RW5jb2RpbmdDb250YWluZXJQcm9maWxlICoKK2NyZWF0ZV9tcDRtdXhfcHJvZmlsZSAodm9pZCkKK3sKKyAgR3N0RW5jb2RpbmdDb250YWluZXJQcm9maWxlICpjcHJvZjsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3F1aWNrdGltZSIsCisgICAgICAidmFyaWFudCIsIEdfVFlQRV9TVFJJTkcsICJpc28iLCBOVUxMKTsKKworICBjcHJvZiA9IGdzdF9lbmNvZGluZ19jb250YWluZXJfcHJvZmlsZV9uZXcgKCJOYW1lIiwgImJsYWgiLCBjYXBzLCBOVUxMKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8vbXBlZyIsICJtcGVndmVyc2lvbiIsIEdfVFlQRV9JTlQsIDEsCisgICAgICAibGF5ZXIiLCBHX1RZUEVfSU5ULCAzLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAyLCAicmF0ZSIsIEdfVFlQRV9JTlQsCisgICAgICA0NDEwMCwgTlVMTCk7CisgIGdzdF9lbmNvZGluZ19jb250YWluZXJfcHJvZmlsZV9hZGRfcHJvZmlsZSAoY3Byb2YsCisgICAgICBHU1RfRU5DT0RJTkdfUFJPRklMRSAoZ3N0X2VuY29kaW5nX2F1ZGlvX3Byb2ZpbGVfbmV3IChjYXBzLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAxKSkpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgcmV0dXJuIGNwcm9mOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9lbmNvZGViaW5fbXA0bXV4KQoreworICBHc3RFbmNvZGluZ0NvbnRhaW5lclByb2ZpbGUgKmNwcm9mOworICBHc3RQbHVnaW5GZWF0dXJlICpmZWF0dXJlOworICBHc3RFbGVtZW50ICplbmMsICptdXg7CisgIEdzdFBhZCAqcGFkOworCisgIC8qIG5lZWQgYSBmYWtlIG1wMyBlbmNvZGVyIGJlY2F1c2UgbXA0IG9ubHkgYWNjZXB0cyBlbmNvZGVkIGZvcm1hdHMgKi8KKyAgZ3N0X3BsdWdpbl9yZWdpc3Rlcl9zdGF0aWMgKEdTVF9WRVJTSU9OX01BSk9SLCBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICAgICJmYWtlbXAzZW5jIiwgImZha2VtcDNlbmMiLCBwbHVnaW5faW5pdCwgVkVSU0lPTiwgIkxHUEwiLAorICAgICAgImdzdC1wbHVnaW5zLWdvb2QiLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pOworCisgIGZlYXR1cmUgPSBnc3RfcmVnaXN0cnlfZmluZF9mZWF0dXJlIChnc3RfcmVnaXN0cnlfZ2V0ICgpLCAidGVzdG1wM2VuYyIsCisgICAgICBHU1RfVFlQRV9FTEVNRU5UX0ZBQ1RPUlkpOworICBnc3RfcGx1Z2luX2ZlYXR1cmVfc2V0X3JhbmsgKGZlYXR1cmUsIEdTVF9SQU5LX1BSSU1BUlkgKyAxMDApOworCisgIGVuYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImVuY29kZWJpbiIsIE5VTEwpOworICBpZiAoZW5jID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIC8qIE1ha2Ugc3VyZSBlbmNvZGViaW4gZmluZHMgbXA0bXV4IGV2ZW4gdGhvdWdoIHF0bXV4IG91dHB1dHMgYSBzdXBlcnNldCAqLworICBjcHJvZiA9IGNyZWF0ZV9tcDRtdXhfcHJvZmlsZSAoKTsKKyAgZ19vYmplY3Rfc2V0IChlbmMsICJwcm9maWxlIiwgY3Byb2YsIE5VTEwpOworICBnc3RfZW5jb2RpbmdfcHJvZmlsZV91bnJlZiAoY3Byb2YpOworCisgIC8qIHNob3VsZCBoYXZlIGNyZWF0ZWQgYSBwYWQgYWZ0ZXIgc2V0dGluZyB0aGUgcHJvZmlsZSAqLworICBwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoZW5jLCAiYXVkaW9fMCIpOworICBmYWlsX3VubGVzcyAocGFkICE9IE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworCisgIG11eCA9IGdzdF9iaW5fZ2V0X2J5X2ludGVyZmFjZSAoR1NUX0JJTiAoZW5jKSwgR1NUX1RZUEVfVEFHX1NFVFRFUik7CisgIGZhaWxfdW5sZXNzIChtdXggIT0gTlVMTCk7CisgIHsKKyAgICBHc3RFbGVtZW50RmFjdG9yeSAqZiA9IGdzdF9lbGVtZW50X2dldF9mYWN0b3J5IChtdXgpOworCisgICAgLyogbWFrZSBzdXJlIHdlIGdvdCBtcDRtdXggZm9yIHZhcmlhbnQ9aXNvICovCisgICAgR1NUX0lORk8gKCJtdXhlcjogJXMiLCBHX09CSkVDVF9UWVBFX05BTUUgKG11eCkpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKEdTVF9PQkpFQ1RfTkFNRSAoZiksICJtcDRtdXgiKTsKKyAgfQorICBnc3Rfb2JqZWN0X3VucmVmIChtdXgpOworICBnc3Rfb2JqZWN0X3VucmVmIChlbmMpOworCisgIGdzdF9wbHVnaW5fZmVhdHVyZV9zZXRfcmFuayAoZmVhdHVyZSwgR1NUX1JBTktfTk9ORSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGZlYXR1cmUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBnYm9vbGVhbgorZXh0cmFjdF90YWdzIChjb25zdCBnY2hhciAqIGxvY2F0aW9uLCBHc3RUYWdMaXN0ICoqIHRhZ2xpc3QpCit7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIEdzdEVsZW1lbnQgKnNyYzsKKyAgR3N0QnVzICpidXM7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lID0KKyAgICAgIGdzdF9wYXJzZV9sYXVuY2ggKCJmaWxlc3JjIG5hbWU9c3JjICEgcXRkZW11eCAhIGZha2VzaW5rIiwgTlVMTCk7CisKKyAgc3JjID0gZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAocGlwZWxpbmUpLCAic3JjIik7CisgIGdfb2JqZWN0X3NldCAoc3JjLCAibG9jYXRpb24iLCBsb2NhdGlvbiwgTlVMTCk7CisKKyAgYnVzID0gZ3N0X3BpcGVsaW5lX2dldF9idXMgKEdTVF9QSVBFTElORSAocGlwZWxpbmUpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKQorICAgICAgIT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBpZiAoKnRhZ2xpc3QgPT0gTlVMTCkgeworICAgICp0YWdsaXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgfQorCisgIHdoaWxlICgxKSB7CisgICAgR3N0TWVzc2FnZSAqbXNnID0gZ3N0X2J1c190aW1lZF9wb3BfZmlsdGVyZWQgKGJ1cywgR1NUX0NMT0NLX1RJTUVfTk9ORSwKKyAgICAgICAgR1NUX01FU1NBR0VfVEFHIHwgR1NUX01FU1NBR0VfRVJST1IgfCBHU1RfTUVTU0FHRV9FT1MpOworCisgICAgaWYgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRU9TKSB7CisgICAgICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSBpZiAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSA9PSBHU1RfTUVTU0FHRV9FUlJPUikgeworICAgICAgcmV0ID0gRkFMU0U7CisgICAgICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSBpZiAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSA9PSBHU1RfTUVTU0FHRV9UQUcpIHsKKyAgICAgIEdzdFRhZ0xpc3QgKnRhZ3M7CisKKyAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX3RhZyAobXNnLCAmdGFncyk7CisgICAgICBnc3RfdGFnX2xpc3RfaW5zZXJ0ICgqdGFnbGlzdCwgdGFncywgR1NUX1RBR19NRVJHRV9SRVBMQUNFKTsKKyAgICAgIGdzdF90YWdfbGlzdF91bnJlZiAodGFncyk7CisgICAgfQorICAgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworICB9CisKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChzcmMpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2F2ZXJhZ2VfYml0cmF0ZV9jdXN0b20gKGNvbnN0IGdjaGFyICogZWxlbWVudG5hbWUsCisgICAgR3N0U3RhdGljUGFkVGVtcGxhdGUgKiB0bXBsLCBjb25zdCBnY2hhciAqIGNhcHNfc3RyLAorICAgIGNvbnN0IGdjaGFyICogc2lua3BhZG5hbWUpCit7CisgIGdjaGFyICpsb2NhdGlvbjsKKyAgR3N0RWxlbWVudCAqcXRtdXg7CisgIEdzdEVsZW1lbnQgKmZpbGVzaW5rOworICBHc3RCdWZmZXIgKmluYnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBpbnQgaTsKKyAgZ2ludCBieXRlc1tdID0geyAxNiwgMjIsIDEyIH07CisgIGdpbnQ2NCBkdXJhdGlvbnNbXSA9IHsgR1NUX1NFQ09ORCAqIDMsIEdTVF9TRUNPTkQgKiA1LCBHU1RfU0VDT05EICogMiB9OworICBnaW50NjQgdG90YWxfYnl0ZXMgPSAwOworICBHc3RDbG9ja1RpbWUgdG90YWxfZHVyYXRpb24gPSAwOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgbG9jYXRpb24gPSBnX3N0cmR1cF9wcmludGYgKCIlcy8lcy0lZCIsIGdfZ2V0X3RtcF9kaXIgKCksICJxdG11eHRlc3QiLAorICAgICAgZ19yYW5kb21faW50ICgpKTsKKyAgR1NUX0lORk8gKCJVc2luZyBsb2NhdGlvbiAlcyBmb3IgYml0cmF0ZSB0ZXN0IiwgbG9jYXRpb24pOworICBxdG11eCA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50IChlbGVtZW50bmFtZSk7CisgIGZpbGVzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmlsZXNpbmsiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChmaWxlc2luaywgImxvY2F0aW9uIiwgbG9jYXRpb24sIE5VTEwpOworICBnc3RfZWxlbWVudF9saW5rIChxdG11eCwgZmlsZXNpbmspOworICBteXNyY3BhZCA9IHNldHVwX3NyY19wYWQgKHF0bXV4LCB0bXBsLCBzaW5rcGFkbmFtZSk7CisgIGZhaWxfdW5sZXNzIChteXNyY3BhZCAhPSBOVUxMKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChmaWxlc2luaywKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgIT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFLAorICAgICAgImNvdWxkIG5vdCBzZXQgZmlsZXNpbmsgdG8gcGxheWluZyIpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChxdG11eCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgidGVzdCIpKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKGNhcHNfc3RyKTsKKyAgZ3N0X3BhZF9zZXRfY2FwcyAobXlzcmNwYWQsIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgLyogZW5zdXJlIHNlZ21lbnQgKGZvcm1hdCkgcHJvcGVybHkgc2V0dXAgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoYnl0ZXNbaV0pOworICAgIGdzdF9idWZmZXJfbWVtc2V0IChpbmJ1ZmZlciwgMCwgMCwgYnl0ZXNbaV0pOworICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSB0b3RhbF9kdXJhdGlvbjsKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChpbmJ1ZmZlcikgPSAoR3N0Q2xvY2tUaW1lKSBkdXJhdGlvbnNbaV07CisgICAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgICAgdG90YWxfYnl0ZXMgKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoaW5idWZmZXIpOworICAgIHRvdGFsX2R1cmF0aW9uICs9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGluYnVmZmVyKTsKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgfQorCisgIC8qIHNlbmQgZW9zIHRvIGhhdmUgbW9vdiB3cml0dGVuICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkgPT0gVFJVRSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChxdG11eCwgR1NUX1NUQVRFX05VTEwpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGZpbGVzaW5rLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X2NoZWNrX2Ryb3BfYnVmZmVycyAoKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICB0ZWFyZG93bl9zcmNfcGFkIChteXNyY3BhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGZpbGVzaW5rKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKHF0bXV4KTsKKworICAvKiBjaGVjayB0aGUgYml0cmF0ZSB0YWcgKi8KKyAgeworICAgIEdzdFRhZ0xpc3QgKnRhZ2xpc3QgPSBOVUxMOworICAgIGd1aW50IGJpdHJhdGUgPSAwOworICAgIGd1aW50IGV4cGVjdGVkOworCisgICAgZmFpbF91bmxlc3MgKGV4dHJhY3RfdGFncyAobG9jYXRpb24sICZ0YWdsaXN0KSk7CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF91aW50ICh0YWdsaXN0LCBHU1RfVEFHX0JJVFJBVEUsICZiaXRyYXRlKSk7CisKKyAgICBleHBlY3RlZCA9CisgICAgICAgIChndWludCkgZ3N0X3V0aWxfdWludDY0X3NjYWxlX3JvdW5kICgoZ3VpbnQ2NCkgdG90YWxfYnl0ZXMsCisgICAgICAgIChndWludDY0KSA4ICogR1NUX1NFQ09ORCwgKGd1aW50NjQpIHRvdGFsX2R1cmF0aW9uKTsKKyAgICBmYWlsX3VubGVzcyAoYml0cmF0ZSA9PSBleHBlY3RlZCk7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdsaXN0KTsKKyAgfQorCisgIC8qIGRlbGV0ZSBmaWxlICovCisgIGdfdW5saW5rIChsb2NhdGlvbik7CisgIGdfZnJlZSAobG9jYXRpb24pOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9hdmVyYWdlX2JpdHJhdGUpCit7CisgIHRlc3RfYXZlcmFnZV9iaXRyYXRlX2N1c3RvbSAoIm1wNG11eCIsICZzcmNhdWRpb2FhY3RlbXBsYXRlLAorICAgICAgQVVESU9fQUFDX0NBUFNfU1RSSU5HLCAiYXVkaW9fJXUiKTsKKyAgdGVzdF9hdmVyYWdlX2JpdHJhdGVfY3VzdG9tICgibXA0bXV4IiwgJnNyY3ZpZGVvaDI2NHRlbXBsYXRlLAorICAgICAgVklERU9fQ0FQU19IMjY0X1NUUklORywgInZpZGVvXyV1Iik7CisKKyAgdGVzdF9hdmVyYWdlX2JpdHJhdGVfY3VzdG9tICgicXRtdXgiLCAmc3JjYXVkaW9hYWN0ZW1wbGF0ZSwKKyAgICAgIEFVRElPX0FBQ19DQVBTX1NUUklORywgImF1ZGlvXyV1Iik7CisgIHRlc3RfYXZlcmFnZV9iaXRyYXRlX2N1c3RvbSAoInF0bXV4IiwgJnNyY3ZpZGVvaDI2NHRlbXBsYXRlLAorICAgICAgVklERU9fQ0FQU19IMjY0X1NUUklORywgInZpZGVvXyV1Iik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RydWN0IFRlc3RJbnB1dERhdGEKK3sKKyAgR3N0UGFkICpzcmNwYWQ7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKyAgR0xpc3QgKmlucHV0OworICBHVGhyZWFkICp0aHJlYWQ7CisKKyAgLyogV2hlbiBjb21wYXJpbmcgdHMsIHRoZSBpbnB1dCB3aWxsIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGlzICovCisgIGdpbnQ2NCB0c19vZmZzZXQ7CisgIC8qIER1ZSB0byBEVFMsIHRoZSBzZWdtZW50IHN0YXJ0IG1pZ2h0IGJlIHNoaWZ0ZWQgc28gdGhpcyBsaXN0CisgICAqIGlzIHVzZWQgdG8gdmVmaXR5IGVhY2ggcmVjZWl2ZWQgc2VnbWVudHMgKi8KKyAgR0xpc3QgKmV4cGVjdGVkX3NlZ21lbnRfc3RhcnQ7CisKKyAgR3N0Q2xvY2tUaW1lIGV4cGVjdGVkX2dhcF90czsKKyAgR3N0Q2xvY2tUaW1lIGV4cGVjdGVkX2dhcF9kdXJhdGlvbjsKKyAgZ2Jvb2xlYW4gZ2FwX3JlY2VpdmVkOworCisgIEdzdFBhZCAqc2lua3BhZDsKKworICBHTGlzdCAqb3V0cHV0X2l0ZXI7Cit9OworCitzdGF0aWMgdm9pZAordGVzdF9pbnB1dF9kYXRhX2luaXQgKHN0cnVjdCBUZXN0SW5wdXREYXRhICpkYXRhKQoreworICBkYXRhLT50c19vZmZzZXQgPSAwOworICBkYXRhLT5leHBlY3RlZF9zZWdtZW50X3N0YXJ0ID0gTlVMTDsKKyAgZGF0YS0+ZXhwZWN0ZWRfZ2FwX3RzID0gMDsKKyAgZGF0YS0+ZXhwZWN0ZWRfZ2FwX2R1cmF0aW9uID0gMDsKKyAgZGF0YS0+Z2FwX3JlY2VpdmVkID0gRkFMU0U7CisgIGRhdGEtPnNyY3BhZCA9IE5VTEw7CisgIGRhdGEtPnNpbmtwYWQgPSBOVUxMOworICBkYXRhLT5pbnB1dCA9IE5VTEw7CisgIGRhdGEtPnRocmVhZCA9IE5VTEw7CisKKyAgdGVzdF9pbnB1dF9wdXNoX3NlZ21lbnRfc3RhcnQgKGRhdGEsIDApOworfQorCitzdGF0aWMgdm9pZAordGVzdF9pbnB1dF9kYXRhX2NsZWFuIChzdHJ1Y3QgVGVzdElucHV0RGF0YSAqZGF0YSkKK3sKKyAgZ19saXN0X2ZyZWVfZnVsbCAoZGF0YS0+aW5wdXQsIChHRGVzdHJveU5vdGlmeSkgZ3N0X21pbmlfb2JqZWN0X3VucmVmKTsKKworICBpZiAoZGF0YS0+c2lua3BhZCkgeworICAgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoZGF0YS0+c2lua3BhZCwgRkFMU0UpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKGRhdGEtPnNpbmtwYWQpOworICB9CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChkYXRhLT5zcmNwYWQsIEZBTFNFKTsKKyAgdGVhcmRvd25fc3JjX3BhZCAoZGF0YS0+c3JjcGFkKTsKK30KKworc3RhdGljIGdwb2ludGVyCit0ZXN0X2lucHV0X3B1c2hfZGF0YSAoZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBzdHJ1Y3QgVGVzdElucHV0RGF0YSAqZGF0YSA9IHVzZXJfZGF0YTsKKyAgR0xpc3QgKml0ZXI7CisgIEdzdEZsb3dSZXR1cm4gZmxvdzsKKworICBmb3IgKGl0ZXIgPSBkYXRhLT5pbnB1dDsgaXRlcjsgaXRlciA9IGdfbGlzdF9uZXh0IChpdGVyKSkgeworICAgIGlmIChHU1RfSVNfQlVGRkVSIChpdGVyLT5kYXRhKSkgeworICAgICAgR1NUX0lORk8gKCJQdXNoaW5nIGJ1ZmZlciAlIiBHU1RfUFRSX0ZPUk1BVCAiIG9uIHBhZDogJXM6JXMiLCBpdGVyLT5kYXRhLAorICAgICAgICAgIEdTVF9ERUJVR19QQURfTkFNRSAoZGF0YS0+c3JjcGFkKSk7CisgICAgICBmbG93ID0KKyAgICAgICAgICBnc3RfcGFkX3B1c2ggKGRhdGEtPnNyY3BhZCwKKyAgICAgICAgICBnc3RfYnVmZmVyX3JlZiAoKEdzdEJ1ZmZlciAqKSBpdGVyLT5kYXRhKSk7CisgICAgICBmYWlsX3VubGVzcyAoZmxvdyA9PSBHU1RfRkxPV19PSyk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoZGF0YS0+c3JjcGFkLCAiUHVzaGluZyBldmVudDogJSIKKyAgICAgICAgICBHU1RfUFRSX0ZPUk1BVCwgaXRlci0+ZGF0YSk7CisgICAgICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChkYXRhLT5zcmNwYWQsCisgICAgICAgICAgICAgIGdzdF9ldmVudF9yZWYgKChHc3RFdmVudCAqKSBpdGVyLT5kYXRhKSkgPT0gVFJVRSk7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAordGVzdF9pbnB1dF9wdXNoX3NlZ21lbnRfc3RhcnQgKGdwb2ludGVyIHVzZXJfZGF0YSwgR3N0Q2xvY2tUaW1lIHN0YXJ0KQoreworICBzdHJ1Y3QgVGVzdElucHV0RGF0YSAqZGF0YSA9IHVzZXJfZGF0YTsKKyAgR3N0Q2xvY2tUaW1lICpzdGFydF9kYXRhID0gZ19tYWxsb2MgKHNpemVvZiAoR3N0Q2xvY2tUaW1lKSk7CisKKyAgKnN0YXJ0X2RhdGEgPSBzdGFydDsKKyAgZGF0YS0+ZXhwZWN0ZWRfc2VnbWVudF9zdGFydCA9IGdfbGlzdF9hcHBlbmQgKGRhdGEtPmV4cGVjdGVkX3NlZ21lbnRfc3RhcnQsCisgICAgICBzdGFydF9kYXRhKTsKK30KKworc3RhdGljIEdzdENsb2NrVGltZQordGVzdF9pbnB1dF9wb3Bfc2VnbWVudF9zdGFydCAoZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBzdHJ1Y3QgVGVzdElucHV0RGF0YSAqZGF0YSA9IHVzZXJfZGF0YTsKKyAgR3N0Q2xvY2tUaW1lIHN0YXJ0ID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgR3N0Q2xvY2tUaW1lICpzdGFydF9kYXRhOworCisgIGlmIChkYXRhLT5leHBlY3RlZF9zZWdtZW50X3N0YXJ0KSB7CisgICAgc3RhcnRfZGF0YSA9IGRhdGEtPmV4cGVjdGVkX3NlZ21lbnRfc3RhcnQtPmRhdGE7CisgICAgZGF0YS0+ZXhwZWN0ZWRfc2VnbWVudF9zdGFydCA9CisgICAgICAgIGdfbGlzdF9kZWxldGVfbGluayAoZGF0YS0+ZXhwZWN0ZWRfc2VnbWVudF9zdGFydCwKKyAgICAgICAgZGF0YS0+ZXhwZWN0ZWRfc2VnbWVudF9zdGFydCk7CisgICAgc3RhcnQgPSAqc3RhcnRfZGF0YTsKKyAgICBnX2ZyZWUgKHN0YXJ0X2RhdGEpOworICB9CisKKyAgcmV0dXJuIHN0YXJ0OworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2NyZWF0ZV9idWZmZXIgKEdzdENsb2NrVGltZSBwdHMsIEdzdENsb2NrVGltZSBkdHMsIEdzdENsb2NrVGltZSBkdXJhdGlvbiwKKyAgICBndWludCBieXRlcykKK3sKKyAgR3N0QnVmZmVyICpidWY7CisgIGd1aW50OCAqZGF0YTsKKworICBkYXRhID0gZ19tYWxsb2MwIChieXRlcyk7CisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGRhdGEsIGJ5dGVzKTsKKyAgR1NUX0JVRkZFUl9QVFMgKGJ1ZikgPSBwdHM7CisgIEdTVF9CVUZGRVJfRFRTIChidWYpID0gZHRzOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpID0gZHVyYXRpb247CisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitfdGVzdF9zaW5rX3BhZF9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgc3RydWN0IFRlc3RJbnB1dERhdGEgKnRlc3RfZGF0YSA9IGdfb2JqZWN0X2dldF9xZGF0YSAoR19PQkpFQ1QgKHBhZCksCisgICAgICBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyAoInRlc3QtbXV4LXBhZCIpKTsKKyAgR3N0QnVmZmVyICpleHBlY3RlZF9idWZmZXI7CisKKyAgZmFpbF91bmxlc3MgKHRlc3RfZGF0YS0+b3V0cHV0X2l0ZXIpOworICBmYWlsX3VubGVzcyAoR1NUX0lTX0JVRkZFUiAodGVzdF9kYXRhLT5vdXRwdXRfaXRlci0+ZGF0YSkpOworICBleHBlY3RlZF9idWZmZXIgPSB0ZXN0X2RhdGEtPm91dHB1dF9pdGVyLT5kYXRhOworCisgIGZhaWxfdW5sZXNzIChHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKSA9PQorICAgICAgKEdTVF9CVUZGRVJfUFRTX0lTX1ZBTElEIChleHBlY3RlZF9idWZmZXIpID8KKyAgICAgICAgICBHU1RfQlVGRkVSX1BUUyAoZXhwZWN0ZWRfYnVmZmVyKSAtCisgICAgICAgICAgdGVzdF9kYXRhLT50c19vZmZzZXQgOiBHU1RfQlVGRkVSX1BUUyAoZXhwZWN0ZWRfYnVmZmVyKSkpOworICBmYWlsX3VubGVzcyAoR1NUX0JVRkZFUl9EVFMgKGJ1ZmZlcikgPT0KKyAgICAgIChHU1RfQlVGRkVSX0RUU19JU19WQUxJRCAoZXhwZWN0ZWRfYnVmZmVyKSA/CisgICAgICAgICAgR1NUX0JVRkZFUl9EVFMgKGV4cGVjdGVkX2J1ZmZlcikgLQorICAgICAgICAgIHRlc3RfZGF0YS0+dHNfb2Zmc2V0IDogR1NUX0JVRkZFUl9EVFMgKGJ1ZmZlcikpKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcikgPT0KKyAgICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGV4cGVjdGVkX2J1ZmZlcikpOworCisgIHRlc3RfZGF0YS0+b3V0cHV0X2l0ZXIgPSBnX2xpc3RfbmV4dCAodGVzdF9kYXRhLT5vdXRwdXRfaXRlcik7CisKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgdm9pZAorY29tcGFyZV9ldmVudCAoR3N0RXZlbnQgKiBldmVudCwgR3N0RXZlbnQgKiBleHBlY3RlZCkKK3sKKyAgZmFpbF91bmxlc3MgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX1RZUEUgKGV4cGVjdGVkKSk7CisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6eworICAgICAgR3N0Q2FwcyAqY2FwcywgKmV4cGVjdGVkX2NhcHM7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9jYXBzIChldmVudCwgJmNhcHMpOworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV4cGVjdGVkLCAmZXhwZWN0ZWRfY2Fwcyk7CisgICAgICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfY2FuX2ludGVyc2VjdCAoY2FwcywgZXhwZWN0ZWRfY2FwcykpOworICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK190ZXN0X3NpbmtfcGFkX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgc3RydWN0IFRlc3RJbnB1dERhdGEgKnRlc3RfZGF0YSA9IGdfb2JqZWN0X2dldF9xZGF0YSAoR19PQkpFQ1QgKHBhZCksCisgICAgICBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyAoInRlc3QtbXV4LXBhZCIpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TVFJFQU1fU1RBUlQ6CisgICAgY2FzZSBHU1RfRVZFTlRfQ0FQUzoKKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgICBmYWlsX3VubGVzcyAodGVzdF9kYXRhLT5vdXRwdXRfaXRlcik7CisgICAgICBmYWlsX3VubGVzcyAoR1NUX0lTX0VWRU5UICh0ZXN0X2RhdGEtPm91dHB1dF9pdGVyLT5kYXRhKSk7CisgICAgICBjb21wYXJlX2V2ZW50IChldmVudCwgdGVzdF9kYXRhLT5vdXRwdXRfaXRlci0+ZGF0YSk7CisgICAgICB0ZXN0X2RhdGEtPm91dHB1dF9pdGVyID0gZ19saXN0X25leHQgKHRlc3RfZGF0YS0+b3V0cHV0X2l0ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDp7CisgICAgICBjb25zdCBHc3RTZWdtZW50ICpzZWdtZW50OworCisgICAgICBmYWlsX3VubGVzcyAodGVzdF9kYXRhLT5vdXRwdXRfaXRlcik7CisgICAgICBmYWlsX3VubGVzcyAoR1NUX0lTX0VWRU5UICh0ZXN0X2RhdGEtPm91dHB1dF9pdGVyLT5kYXRhKSk7CisgICAgICBnc3RfZXZlbnRfcGFyc2Vfc2VnbWVudCAoZXZlbnQsICZzZWdtZW50KTsKKyAgICAgIGZhaWxfdW5sZXNzIChzZWdtZW50LT5zdGFydCA9PSB0ZXN0X2lucHV0X3BvcF9zZWdtZW50X3N0YXJ0ICh0ZXN0X2RhdGEpKTsKKyAgICAgIHRlc3RfZGF0YS0+b3V0cHV0X2l0ZXIgPSBnX2xpc3RfbmV4dCAodGVzdF9kYXRhLT5vdXRwdXRfaXRlcik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfR0FQOnsKKyAgICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisgICAgICBHc3RDbG9ja1RpbWUgZHVyYXRpb247CisgICAgICBnc3RfZXZlbnRfcGFyc2VfZ2FwIChldmVudCwgJnRpbWVzdGFtcCwgJmR1cmF0aW9uKTsKKyAgICAgIGZhaWxfdW5sZXNzICh0aW1lc3RhbXAgPT0gdGVzdF9kYXRhLT5leHBlY3RlZF9nYXBfdHMpOworICAgICAgZmFpbF91bmxlc3MgKGR1cmF0aW9uID09IHRlc3RfZGF0YS0+ZXhwZWN0ZWRfZ2FwX2R1cmF0aW9uKTsKKyAgICAgIHRlc3RfZGF0YS0+Z2FwX3JlY2VpdmVkID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9UQUc6CisgICAgICAvKiBpZ25vcmUgdGhpcyBldmVudCAqLworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBhZCwgIlVuZXhwZWN0ZWQgZXZlbnQ6ICUiIEdTVF9QVFJfRk9STUFULCBldmVudCk7CisgICAgICBmYWlsICgiVW5leHBlY3RlZCBldmVudCByZWNlaXZlZCAlcyIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisgICAgICBicmVhazsKKyAgfQorCisgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK190ZXN0X3BhZF9hZGRlZF9jYiAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZCAqIHBhZCwgZ3BvaW50ZXIgdWRhdGEpCit7CisgIEdzdENhcHMgKmNhcHM7CisgIHN0cnVjdCBUZXN0SW5wdXREYXRhICoqaW5wdXRzID0gdWRhdGE7CisgIGdpbnQgaSA9IC0xOworICBjb25zdCBnY2hhciAqbmFtZTsKKyAgY29uc3QgZ2NoYXIgKnN0cm5hbWU7CisKKyAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAocGFkKTsKKyAgc3RybmFtZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApKTsKKyAgaWYgKGdfc3RyX2hhc19wcmVmaXggKHN0cm5hbWUsICJ2aWRlby8iKSkgeworICAgIGkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiB2aWRlbyBpcyAwLCBhdWRpbyBpcyAxICovCisgICAgbmFtZSA9ICJ2aWRlb3NpbmsiOworICB9IGVsc2UgeworICAgIGkgPSAxOworICAgIG5hbWUgPSAiYXVkaW9zaW5rIjsKKyAgfQorICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgZmFpbF91bmxlc3MgKGkgIT0gLTEpOworICBmYWlsX3VubGVzcyAoaW5wdXRzW2ldLT5zaW5rcGFkID09IE5VTEwpOworICBpbnB1dHNbaV0tPnNpbmtwYWQgPSBnc3RfcGFkX25ldyAobmFtZSwgR1NUX1BBRF9TSU5LKTsKKyAgaW5wdXRzW2ldLT5vdXRwdXRfaXRlciA9IGlucHV0c1tpXS0+aW5wdXQ7CisgIGdfb2JqZWN0X3NldF9xZGF0YSAoR19PQkpFQ1QgKGlucHV0c1tpXS0+c2lua3BhZCksCisgICAgICBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyAoInRlc3QtbXV4LXBhZCIpLCBpbnB1dHNbaV0pOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoaW5wdXRzW2ldLT5zaW5rcGFkLCBfdGVzdF9zaW5rX3BhZF9jaGFpbik7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChpbnB1dHNbaV0tPnNpbmtwYWQsIF90ZXN0X3NpbmtfcGFkX2V2ZW50KTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChpbnB1dHNbaV0tPnNpbmtwYWQsIFRSVUUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rIChwYWQsIGlucHV0c1tpXS0+c2lua3BhZCkgPT0gR1NUX1BBRF9MSU5LX09LKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX291dHB1dCAoY29uc3QgZ2NoYXIgKiBsb2NhdGlvbiwgc3RydWN0IFRlc3RJbnB1dERhdGEgKmlucHV0MSwKKyAgICBzdHJ1Y3QgVGVzdElucHV0RGF0YSAqaW5wdXQyKQoreworICBHc3RFbGVtZW50ICpmaWxlc3JjOworICBHc3RFbGVtZW50ICpkZW11eDsKKyAgc3RydWN0IFRlc3RJbnB1dERhdGEgKmlucHV0c1syXSA9IHsgaW5wdXQxLCBpbnB1dDIgfTsKKworICBmaWxlc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmlsZXNyYyIsIE5VTEwpOworICBkZW11eCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInF0ZGVtdXgiLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGluayAoZmlsZXNyYywgZGVtdXgpKTsKKworICBnX29iamVjdF9zZXQgKGZpbGVzcmMsICJsb2NhdGlvbiIsIGxvY2F0aW9uLCBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoZGVtdXgsICJwYWQtYWRkZWQiLCAoR0NhbGxiYWNrKSBfdGVzdF9wYWRfYWRkZWRfY2IsIGlucHV0cyk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZGVtdXgsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGZpbGVzcmMsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgLyogRklYTUUgdXNlIGEgbWFpbiBsb29wICovCisgIGdfdXNsZWVwICgyICogR19VU0VDX1BFUl9TRUMpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGRlbXV4LAorICAgICAgICAgIEdTVF9TVEFURV9OVUxMKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChmaWxlc3JjLAorICAgICAgICAgIEdTVF9TVEFURV9OVUxMKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworICBnc3Rfb2JqZWN0X3VucmVmIChmaWxlc3JjKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoZGVtdXgpOworfQorCisvKiBNdXhlcyBhIGZpbGUgd2l0aCBxdG11eCB1c2luZyB0aGUgaW5wdXRzIHByb3ZpZGVkIGFuZAorICogdGhlbiB2ZXJpZmllcyB0aGF0IHRoZSBnZW5lcmF0ZWQgZmlsZSBjb3JyZXNwb25kcyB0byB0aGUKKyAqIGRhdGEgaW4gdGhlIGlucHV0cyAqLworc3RhdGljIHZvaWQKK3J1bl9tdXhpbmdfdGVzdCAoc3RydWN0IFRlc3RJbnB1dERhdGEgKmlucHV0MSwgc3RydWN0IFRlc3RJbnB1dERhdGEgKmlucHV0MikKK3sKKyAgZ2NoYXIgKmxvY2F0aW9uOworICBHc3RFbGVtZW50ICpxdG11eDsKKyAgR3N0RWxlbWVudCAqZmlsZXNpbms7CisKKyAgbG9jYXRpb24gPSBnX3N0cmR1cF9wcmludGYgKCIlcy8lcy0lZCIsIGdfZ2V0X3RtcF9kaXIgKCksICJxdG11eHRlc3QiLAorICAgICAgZ19yYW5kb21faW50ICgpKTsKKyAgcXRtdXggPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoInF0bXV4Iik7CisgIGZpbGVzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmlsZXNpbmsiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChmaWxlc2luaywgImxvY2F0aW9uIiwgbG9jYXRpb24sIE5VTEwpOworICBnc3RfZWxlbWVudF9saW5rIChxdG11eCwgZmlsZXNpbmspOworCisgIGlucHV0MS0+c3JjcGFkID0gc2V0dXBfc3JjX3BhZCAocXRtdXgsICZzcmN2aWRlb3Jhd3RlbXBsYXRlLCAidmlkZW9fJXUiKTsKKyAgZmFpbF91bmxlc3MgKGlucHV0MS0+c3JjcGFkICE9IE5VTEwpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKGlucHV0MS0+c3JjcGFkLCBUUlVFKTsKKworICBpbnB1dDItPnNyY3BhZCA9IHNldHVwX3NyY19wYWQgKHF0bXV4LCAmc3JjYXVkaW9hYWN0ZW1wbGF0ZSwgImF1ZGlvXyV1Iik7CisgIGZhaWxfdW5sZXNzIChpbnB1dDItPnNyY3BhZCAhPSBOVUxMKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChpbnB1dDItPnNyY3BhZCwgVFJVRSk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZmlsZXNpbmssCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSwKKyAgICAgICJjb3VsZCBub3Qgc2V0IGZpbGVzaW5rIHRvIHBsYXlpbmciKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocXRtdXgsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBpbnB1dDEtPnRocmVhZCA9CisgICAgICBnX3RocmVhZF9uZXcgKCJ0ZXN0LXB1c2gtZGF0YS0xIiwgdGVzdF9pbnB1dF9wdXNoX2RhdGEsIGlucHV0MSk7CisgIGlucHV0Mi0+dGhyZWFkID0KKyAgICAgIGdfdGhyZWFkX25ldyAoInRlc3QtcHVzaC1kYXRhLTIiLCB0ZXN0X2lucHV0X3B1c2hfZGF0YSwgaW5wdXQyKTsKKworICAvKiBGSVhNRSBzZXQgYSBtYWlubG9vcCBhbmQgd2FpdCBmb3IgRU9TICovCisKKyAgZ190aHJlYWRfam9pbiAoaW5wdXQxLT50aHJlYWQpOworICBnX3RocmVhZF9qb2luIChpbnB1dDItPnRocmVhZCk7CisgIGlucHV0MS0+dGhyZWFkID0gTlVMTDsKKyAgaW5wdXQyLT50aHJlYWQgPSBOVUxMOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocXRtdXgsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChmaWxlc2luaywgR1NUX1NUQVRFX05VTEwpOworCisgIGNoZWNrX291dHB1dCAobG9jYXRpb24sIGlucHV0MSwgaW5wdXQyKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChmaWxlc2luayk7CisgIHRlc3RfaW5wdXRfZGF0YV9jbGVhbiAoaW5wdXQxKTsKKyAgdGVzdF9pbnB1dF9kYXRhX2NsZWFuIChpbnB1dDIpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAocXRtdXgpOworCisgIC8qIGRlbGV0ZSBmaWxlICovCisgIGdfdW5saW5rIChsb2NhdGlvbik7CisgIGdfZnJlZSAobG9jYXRpb24pOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tdXhpbmcpCit7CisgIHN0cnVjdCBUZXN0SW5wdXREYXRhIGlucHV0MSwgaW5wdXQyOworICBHc3RDYXBzICpjYXBzOworCisgIHRlc3RfaW5wdXRfZGF0YV9pbml0ICgmaW5wdXQxKTsKKyAgdGVzdF9pbnB1dF9kYXRhX2luaXQgKCZpbnB1dDIpOworCisgIC8qIENyZWF0ZSB0aGUgaW5wdXRzLCBhZnRlciBjYWxsaW5nIHRoZSBydW4gYmVsb3csIGFsbCB0aGlzIGRhdGEgaXMKKyAgICogdHJhbnNmZXJlZCB0byBpdCBhbmQgd2UgaGF2ZSBubyBuZWVkIHRvIGNsZWFuIHVwICovCisgIGlucHV0MS5pbnB1dCA9IE5VTEw7CisgIGlucHV0MS5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgidGVzdC0xIikpOworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcKKyAgICAgICgidmlkZW8veC1yYXcsIHdpZHRoPShpbnQpODAwLCBoZWlnaHQ9KGludCk2MDAsICIKKyAgICAgICJmcmFtZXJhdGU9KGZyYWN0aW9uKTEvMSwgZm9ybWF0PShzdHJpbmcpUkdCIik7CisgIGlucHV0MS5pbnB1dCA9IGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJmlucHV0MS5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBpbnB1dDEuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZpbnB1dDEuc2VnbWVudCkpOworICBpbnB1dDEuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBjcmVhdGVfYnVmZmVyICgwLCBHU1RfQ0xPQ0tfVElNRV9OT05FLAorICAgICAgICAgIEdTVF9TRUNPTkQsIDgwMCAqIDYwMCAqIDMpKTsKKyAgaW5wdXQxLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgY3JlYXRlX2J1ZmZlciAoMSAqIEdTVF9TRUNPTkQsCisgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSwgR1NUX1NFQ09ORCwgODAwICogNjAwICogMykpOworICBpbnB1dDEuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBjcmVhdGVfYnVmZmVyICgyICogR1NUX1NFQ09ORCwKKyAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FLCBHU1RfU0VDT05ELCA4MDAgKiA2MDAgKiAzKSk7CisgIGlucHV0MS5pbnB1dCA9IGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworCisgIGlucHV0Mi5pbnB1dCA9IE5VTEw7CisgIGlucHV0Mi5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgidGVzdC0yIikpOworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFVRElPX0FBQ19DQVBTX1NUUklORyk7CisgIGlucHV0Mi5pbnB1dCA9IGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJmlucHV0Mi5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBpbnB1dDIuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZpbnB1dDIuc2VnbWVudCkpOworICBpbnB1dDIuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBjcmVhdGVfYnVmZmVyICgwLCAwLCBHU1RfU0VDT05ELCA0MDk2KSk7CisgIGlucHV0Mi5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGNyZWF0ZV9idWZmZXIgKDEgKiBHU1RfU0VDT05ELAorICAgICAgICAgIDEgKiBHU1RfU0VDT05ELCBHU1RfU0VDT05ELCA0MDk2KSk7CisgIGlucHV0Mi5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGNyZWF0ZV9idWZmZXIgKDIgKiBHU1RfU0VDT05ELAorICAgICAgICAgIDIgKiBHU1RfU0VDT05ELCBHU1RfU0VDT05ELCA0MDk2KSk7CisgIGlucHV0Mi5pbnB1dCA9IGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworCisgIHJ1bl9tdXhpbmdfdGVzdCAoJmlucHV0MSwgJmlucHV0Mik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tdXhpbmdfbm9uX3plcm9fc2VnbWVudCkKK3sKKyAgc3RydWN0IFRlc3RJbnB1dERhdGEgaW5wdXQxLCBpbnB1dDI7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgdGVzdF9pbnB1dF9kYXRhX2luaXQgKCZpbnB1dDEpOworICB0ZXN0X2lucHV0X2RhdGFfaW5pdCAoJmlucHV0Mik7CisKKyAgLyogQ3JlYXRlIHRoZSBpbnB1dHMsIGFmdGVyIGNhbGxpbmcgdGhlIHJ1biBiZWxvdywgYWxsIHRoaXMgZGF0YSBpcworICAgKiB0cmFuc2ZlcmVkIHRvIGl0IGFuZCB3ZSBoYXZlIG5vIG5lZWQgdG8gY2xlYW4gdXAgKi8KKyAgaW5wdXQxLmlucHV0ID0gTlVMTDsKKyAgaW5wdXQxLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKCJ0ZXN0LTEiKSk7CisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZworICAgICAgKCJ2aWRlby94LXJhdywgd2lkdGg9KGludCk4MDAsIGhlaWdodD0oaW50KTYwMCwgIgorICAgICAgImZyYW1lcmF0ZT0oZnJhY3Rpb24pMS8xLCBmb3JtYXQ9KHN0cmluZylSR0IiKTsKKyAgaW5wdXQxLmlucHV0ID0gZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBnc3RfZXZlbnRfbmV3X2NhcHMgKGNhcHMpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBnc3Rfc2VnbWVudF9pbml0ICgmaW5wdXQxLnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGlucHV0MS5zZWdtZW50LnN0YXJ0ID0gMTAgKiBHU1RfU0VDT05EOworICBpbnB1dDEuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZpbnB1dDEuc2VnbWVudCkpOworICBpbnB1dDEuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBjcmVhdGVfYnVmZmVyICgxMCAqIEdTVF9TRUNPTkQsCisgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSwgR1NUX1NFQ09ORCwgODAwICogNjAwICogMykpOworICBpbnB1dDEuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBjcmVhdGVfYnVmZmVyICgxMSAqIEdTVF9TRUNPTkQsCisgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSwgR1NUX1NFQ09ORCwgODAwICogNjAwICogMykpOworICBpbnB1dDEuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBjcmVhdGVfYnVmZmVyICgxMiAqIEdTVF9TRUNPTkQsCisgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSwgR1NUX1NFQ09ORCwgODAwICogNjAwICogMykpOworICBpbnB1dDEuaW5wdXQgPSBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKyAgaW5wdXQxLnRzX29mZnNldCA9IEdTVF9TRUNPTkQgKiAxMDsKKworICBpbnB1dDIuaW5wdXQgPSBOVUxMOworICBpbnB1dDIuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoInRlc3QtMiIpKTsKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBVURJT19BQUNfQ0FQU19TVFJJTkcpOworICBpbnB1dDIuaW5wdXQgPSBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGdzdF9ldmVudF9uZXdfY2FwcyAoY2FwcykpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9zZWdtZW50X2luaXQgKCZpbnB1dDIuc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgaW5wdXQyLnNlZ21lbnQuc3RhcnQgPSAxMCAqIEdTVF9TRUNPTkQ7CisgIGlucHV0Mi5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJmlucHV0Mi5zZWdtZW50KSk7CisgIGlucHV0Mi5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGNyZWF0ZV9idWZmZXIgKDEwICogR1NUX1NFQ09ORCwKKyAgICAgICAgICAxMCAqIEdTVF9TRUNPTkQsIEdTVF9TRUNPTkQsIDQwOTYpKTsKKyAgaW5wdXQyLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgY3JlYXRlX2J1ZmZlciAoMTEgKiBHU1RfU0VDT05ELAorICAgICAgICAgIDExICogR1NUX1NFQ09ORCwgR1NUX1NFQ09ORCwgNDA5NikpOworICBpbnB1dDIuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBjcmVhdGVfYnVmZmVyICgxMiAqIEdTVF9TRUNPTkQsCisgICAgICAgICAgMTIgKiBHU1RfU0VDT05ELCBHU1RfU0VDT05ELCA0MDk2KSk7CisgIGlucHV0Mi5pbnB1dCA9IGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworICBpbnB1dDIudHNfb2Zmc2V0ID0gR1NUX1NFQ09ORCAqIDEwOworCisgIHJ1bl9tdXhpbmdfdGVzdCAoJmlucHV0MSwgJmlucHV0Mik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tdXhpbmdfbm9uX3plcm9fc2VnbWVudF9kaWZmZXJlbnQpCit7CisgIHN0cnVjdCBUZXN0SW5wdXREYXRhIGlucHV0MSwgaW5wdXQyOworICBHc3RDYXBzICpjYXBzOworCisgIHRlc3RfaW5wdXRfZGF0YV9pbml0ICgmaW5wdXQxKTsKKyAgdGVzdF9pbnB1dF9kYXRhX2luaXQgKCZpbnB1dDIpOworCisgIC8qIENyZWF0ZSB0aGUgaW5wdXRzLCBhZnRlciBjYWxsaW5nIHRoZSBydW4gYmVsb3csIGFsbCB0aGlzIGRhdGEgaXMKKyAgICogdHJhbnNmZXJlZCB0byBpdCBhbmQgd2UgaGF2ZSBubyBuZWVkIHRvIGNsZWFuIHVwICovCisgIGlucHV0MS5pbnB1dCA9IE5VTEw7CisgIGlucHV0MS5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgidGVzdC0xIikpOworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcKKyAgICAgICgidmlkZW8veC1yYXcsIHdpZHRoPShpbnQpODAwLCBoZWlnaHQ9KGludCk2MDAsICIKKyAgICAgICJmcmFtZXJhdGU9KGZyYWN0aW9uKTEvMSwgZm9ybWF0PShzdHJpbmcpUkdCIik7CisgIGlucHV0MS5pbnB1dCA9IGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJmlucHV0MS5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBpbnB1dDEuc2VnbWVudC5zdGFydCA9IDUgKiBHU1RfU0VDT05EOworICBpbnB1dDEuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZpbnB1dDEuc2VnbWVudCkpOworICBpbnB1dDEuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBjcmVhdGVfYnVmZmVyICg1ICogR1NUX1NFQ09ORCwKKyAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FLCBHU1RfU0VDT05ELCA4MDAgKiA2MDAgKiAzKSk7CisgIGlucHV0MS5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGNyZWF0ZV9idWZmZXIgKDYgKiBHU1RfU0VDT05ELAorICAgICAgICAgIEdTVF9DTE9DS19USU1FX05PTkUsIEdTVF9TRUNPTkQsIDgwMCAqIDYwMCAqIDMpKTsKKyAgaW5wdXQxLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgY3JlYXRlX2J1ZmZlciAoNyAqIEdTVF9TRUNPTkQsCisgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSwgR1NUX1NFQ09ORCwgODAwICogNjAwICogMykpOworICBpbnB1dDEuaW5wdXQgPSBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKyAgaW5wdXQxLnRzX29mZnNldCA9IEdTVF9TRUNPTkQgKiA1OworCisgIGlucHV0Mi5pbnB1dCA9IE5VTEw7CisgIGlucHV0Mi5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgidGVzdC0yIikpOworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFVRElPX0FBQ19DQVBTX1NUUklORyk7CisgIGlucHV0Mi5pbnB1dCA9IGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJmlucHV0Mi5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBpbnB1dDIuc2VnbWVudC5zdGFydCA9IDEwICogR1NUX1NFQ09ORDsKKyAgaW5wdXQyLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmaW5wdXQyLnNlZ21lbnQpKTsKKyAgaW5wdXQyLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgY3JlYXRlX2J1ZmZlciAoMTAgKiBHU1RfU0VDT05ELAorICAgICAgICAgIDEwICogR1NUX1NFQ09ORCwgR1NUX1NFQ09ORCwgNDA5NikpOworICBpbnB1dDIuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBjcmVhdGVfYnVmZmVyICgxMSAqIEdTVF9TRUNPTkQsCisgICAgICAgICAgMTEgKiBHU1RfU0VDT05ELCBHU1RfU0VDT05ELCA0MDk2KSk7CisgIGlucHV0Mi5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGNyZWF0ZV9idWZmZXIgKDEyICogR1NUX1NFQ09ORCwKKyAgICAgICAgICAxMiAqIEdTVF9TRUNPTkQsIEdTVF9TRUNPTkQsIDQwOTYpKTsKKyAgaW5wdXQyLmlucHV0ID0gZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisgIGlucHV0Mi50c19vZmZzZXQgPSBHU1RfU0VDT05EICogMTA7CisKKyAgcnVuX211eGluZ190ZXN0ICgmaW5wdXQxLCAmaW5wdXQyKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tdXhpbmdfZHRzX291dHNpZGVfc2VnbWVudCkKK3sKKyAgc3RydWN0IFRlc3RJbnB1dERhdGEgaW5wdXQxLCBpbnB1dDI7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgdGVzdF9pbnB1dF9kYXRhX2luaXQgKCZpbnB1dDEpOworICB0ZXN0X2lucHV0X2RhdGFfaW5pdCAoJmlucHV0Mik7CisKKyAgLyogQ3JlYXRlIHRoZSBpbnB1dHMsIGFmdGVyIGNhbGxpbmcgdGhlIHJ1biBiZWxvdywgYWxsIHRoaXMgZGF0YSBpcworICAgKiB0cmFuc2ZlcmVkIHRvIGl0IGFuZCB3ZSBoYXZlIG5vIG5lZWQgdG8gY2xlYW4gdXAgKi8KKyAgaW5wdXQxLmlucHV0ID0gTlVMTDsKKyAgaW5wdXQxLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKCJ0ZXN0LTEiKSk7CisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZworICAgICAgKCJ2aWRlby94LWgyNjQsIHdpZHRoPShpbnQpODAwLCBoZWlnaHQ9KGludCk2MDAsICIKKyAgICAgICJmcmFtZXJhdGU9KGZyYWN0aW9uKTEvMSwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKWF2YywgY29kZWNfZGF0YT0oYnVmZmVyKTAwMDAsIgorICAgICAgIiBhbGlnbm1lbnQ9KHN0cmluZylhdSwgbGV2ZWw9KGludCkyLCBwcm9maWxlPShzdHJpbmcpaGlnaCIpOworICBpbnB1dDEuaW5wdXQgPSBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGdzdF9ldmVudF9uZXdfY2FwcyAoY2FwcykpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9zZWdtZW50X2luaXQgKCZpbnB1dDEuc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgaW5wdXQxLnNlZ21lbnQuc3RhcnQgPSAxICogR1NUX1NFQ09ORDsKKyAgaW5wdXQxLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmaW5wdXQxLnNlZ21lbnQpKTsKKyAgaW5wdXQxLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgY3JlYXRlX2J1ZmZlciAoMSAqIEdTVF9TRUNPTkQsCisgICAgICAgICAgMCwgR1NUX1NFQ09ORCwgNDA5NikpOworICBpbnB1dDEuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBjcmVhdGVfYnVmZmVyICgyICogR1NUX1NFQ09ORCwKKyAgICAgICAgICAxICogR1NUX1NFQ09ORCwgR1NUX1NFQ09ORCwgNDA5NikpOworICBpbnB1dDEuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBjcmVhdGVfYnVmZmVyICgzICogR1NUX1NFQ09ORCwKKyAgICAgICAgICAyICogR1NUX1NFQ09ORCwgR1NUX1NFQ09ORCwgNDA5NikpOworICBpbnB1dDEuaW5wdXQgPSBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKyAgLyogRmlyc3QgRFRTIGlzIDAsIGZpcnN0IFBUUyBpcyAxcy4gVGhlIHNlZ21lbnQgc3RhcnQgYmVpbmcgMSwgdGhpcyBtZWFucworICAgKiBydW5uaW5nIHRpbWUgLTFzIGFuZCAwLiBTbyB0aGUgb3V0cHV0IHNlZ21lbnQgc2hvdWxkIHN0YXJ0IGZyb20gMXMgdG8ga2VlcAorICAgKiB0aGUgc2FtZSBydW5uaW5nIHRpbWUgKi8KKyAgdGVzdF9pbnB1dF9wb3Bfc2VnbWVudF9zdGFydCAoJmlucHV0MSk7CisgIHRlc3RfaW5wdXRfcHVzaF9zZWdtZW50X3N0YXJ0ICgmaW5wdXQxLCBHU1RfU0VDT05EKTsKKworICBpbnB1dDIuaW5wdXQgPSBOVUxMOworICBpbnB1dDIuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoInRlc3QtMiIpKTsKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBVURJT19BQUNfQ0FQU19TVFJJTkcpOworICBpbnB1dDIuaW5wdXQgPSBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGdzdF9ldmVudF9uZXdfY2FwcyAoY2FwcykpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9zZWdtZW50X2luaXQgKCZpbnB1dDIuc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgaW5wdXQyLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmaW5wdXQyLnNlZ21lbnQpKTsKKyAgaW5wdXQyLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgY3JlYXRlX2J1ZmZlciAoMCwgMCwgR1NUX1NFQ09ORCwKKyAgICAgICAgICA0NDEwMCAqIDQgKiAyKSk7CisgIGlucHV0Mi5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGNyZWF0ZV9idWZmZXIgKEdTVF9TRUNPTkQsIEdTVF9TRUNPTkQsCisgICAgICAgICAgR1NUX1NFQ09ORCwgNDQxMDAgKiA0ICogMikpOworICBpbnB1dDIuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBjcmVhdGVfYnVmZmVyICgyICogR1NUX1NFQ09ORCwKKyAgICAgICAgICAyICogR1NUX1NFQ09ORCwgR1NUX1NFQ09ORCwgNDQxMDAgKiA0ICogMikpOworICBpbnB1dDIuaW5wdXQgPSBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKworICBydW5fbXV4aW5nX3Rlc3QgKCZpbnB1dDEsICZpbnB1dDIpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X211eGluZ19pbml0aWFsX2dhcCkKK3sKKyAgc3RydWN0IFRlc3RJbnB1dERhdGEgaW5wdXQxLCBpbnB1dDI7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgdGVzdF9pbnB1dF9kYXRhX2luaXQgKCZpbnB1dDEpOworICB0ZXN0X2lucHV0X2RhdGFfaW5pdCAoJmlucHV0Mik7CisKKyAgLyogQ3JlYXRlIHRoZSBpbnB1dHMsIGFmdGVyIGNhbGxpbmcgdGhlIHJ1biBiZWxvdywgYWxsIHRoaXMgZGF0YSBpcworICAgKiB0cmFuc2ZlcmVkIHRvIGl0IGFuZCB3ZSBoYXZlIG5vIG5lZWQgdG8gY2xlYW4gdXAgKi8KKyAgaW5wdXQxLmlucHV0ID0gTlVMTDsKKyAgaW5wdXQxLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKCJ0ZXN0LTEiKSk7CisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZworICAgICAgKCJ2aWRlby94LWgyNjQsIHdpZHRoPShpbnQpODAwLCBoZWlnaHQ9KGludCk2MDAsICIKKyAgICAgICJmcmFtZXJhdGU9KGZyYWN0aW9uKTEvMSwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKWF2YywgY29kZWNfZGF0YT0oYnVmZmVyKTAwMDAsIgorICAgICAgIiBhbGlnbm1lbnQ9KHN0cmluZylhdSwgbGV2ZWw9KGludCkyLCBwcm9maWxlPShzdHJpbmcpaGlnaCIpOworICBpbnB1dDEuaW5wdXQgPSBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGdzdF9ldmVudF9uZXdfY2FwcyAoY2FwcykpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9zZWdtZW50X2luaXQgKCZpbnB1dDEuc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgaW5wdXQxLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmaW5wdXQxLnNlZ21lbnQpKTsKKyAgLyogRHVwbGljYXRlIHRoZSBzZWdtZW50IHRvIHBsZWFzZSB0aGUgaGFybmVzcyAqLworICBpbnB1dDEuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZpbnB1dDEuc2VnbWVudCkpOworICBpbnB1dDEuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBjcmVhdGVfYnVmZmVyICgxICogR1NUX1NFQ09ORCwKKyAgICAgICAgICAwLCBHU1RfU0VDT05ELCA0MDk2KSk7CisgIGlucHV0MS5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGNyZWF0ZV9idWZmZXIgKDIgKiBHU1RfU0VDT05ELAorICAgICAgICAgIDEgKiBHU1RfU0VDT05ELCBHU1RfU0VDT05ELCA0MDk2KSk7CisgIGlucHV0MS5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGNyZWF0ZV9idWZmZXIgKDMgKiBHU1RfU0VDT05ELAorICAgICAgICAgIDIgKiBHU1RfU0VDT05ELCBHU1RfU0VDT05ELCA0MDk2KSk7CisgIGlucHV0MS5pbnB1dCA9IGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworCisgIC8qIFdlIGV4cGVjdCBhIDFzIGdhcCBhdCB0aGUgc3RhcnQgKi8KKyAgaW5wdXQxLmV4cGVjdGVkX2dhcF9kdXJhdGlvbiA9IEdTVF9TRUNPTkQ7CisgIC8qIFRoZXJlIHdpbGwgYmUgdHdvIHNlZ21lbnRzLCBmaXJzdCBpcyAwLCBzbyBsZWF2ZSBpdCB0aGVyZSwgc2Vjb25kIHNob3VsZAorICAgKiBtYXRjaCB0aGUgZmlyc3QgQ1RUUyAoUFRTIC0gRFRTKSAqLworICB0ZXN0X2lucHV0X3B1c2hfc2VnbWVudF9zdGFydCAoJmlucHV0MSwgR1NUX1NFQ09ORCk7CisKKyAgaW5wdXQyLmlucHV0ID0gTlVMTDsKKyAgaW5wdXQyLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKCJ0ZXN0LTIiKSk7CisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQVVESU9fQUFDX0NBUFNfU1RSSU5HKTsKKyAgaW5wdXQyLmlucHV0ID0gZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBnc3RfZXZlbnRfbmV3X2NhcHMgKGNhcHMpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBnc3Rfc2VnbWVudF9pbml0ICgmaW5wdXQyLnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGlucHV0Mi5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJmlucHV0Mi5zZWdtZW50KSk7CisgIGlucHV0Mi5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGNyZWF0ZV9idWZmZXIgKDAsIDAsIEdTVF9TRUNPTkQsCisgICAgICAgICAgNDQxMDAgKiA0ICogMikpOworICBpbnB1dDIuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBjcmVhdGVfYnVmZmVyIChHU1RfU0VDT05ELCBHU1RfU0VDT05ELAorICAgICAgICAgIEdTVF9TRUNPTkQsIDQ0MTAwICogNCAqIDIpKTsKKyAgaW5wdXQyLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgY3JlYXRlX2J1ZmZlciAoMiAqIEdTVF9TRUNPTkQsCisgICAgICAgICAgMiAqIEdTVF9TRUNPTkQsIEdTVF9TRUNPTkQsIDQ0MTAwICogNCAqIDIpKTsKKyAgaW5wdXQyLmlucHV0ID0gZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisKKyAgcnVuX211eGluZ190ZXN0ICgmaW5wdXQxLCAmaW5wdXQyKTsKKworICBmYWlsX3VubGVzcyAoaW5wdXQxLmdhcF9yZWNlaXZlZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK3F0bXV4X3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoInF0bXV4Iik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICAvKiBhdm9pZCBnbGliIHdhcm5pbmdzIHdoZW4gc2V0dGluZyBkZXByZWNhdGVkIGR0cy1tZXRob2QgcHJvcGVydHkgKi8KKyAgZ19zZXRlbnYgKCJHX0VOQUJMRV9ESUFHTk9TVElDIiwgIjAiLCBUUlVFKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3ZpZGVvX3BhZF9kZCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9hdWRpb19wYWRfZGQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdmlkZW9fcGFkX2ZyYWdfZGQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYXVkaW9fcGFkX2ZyYWdfZGQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdmlkZW9fcGFkX2ZyYWdfZGRfc3RyZWFtYWJsZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9hdWRpb19wYWRfZnJhZ19kZF9zdHJlYW1hYmxlKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdmlkZW9fcGFkX3Jlb3JkZXIpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYXVkaW9fcGFkX3Jlb3JkZXIpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdmlkZW9fcGFkX2ZyYWdfcmVvcmRlcik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9hdWRpb19wYWRfZnJhZ19yZW9yZGVyKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3ZpZGVvX3BhZF9mcmFnX3Jlb3JkZXJfc3RyZWFtYWJsZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9hdWRpb19wYWRfZnJhZ19yZW9yZGVyX3N0cmVhbWFibGUpOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF92aWRlb19wYWRfYXNjKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2F1ZGlvX3BhZF9hc2MpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdmlkZW9fcGFkX2ZyYWdfYXNjKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2F1ZGlvX3BhZF9mcmFnX2FzYyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF92aWRlb19wYWRfZnJhZ19hc2Nfc3RyZWFtYWJsZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9hdWRpb19wYWRfZnJhZ19hc2Nfc3RyZWFtYWJsZSk7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2F2ZXJhZ2VfYml0cmF0ZSk7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3JldXNlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2VuY29kZWJpbl9xdG11eCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9lbmNvZGViaW5fbXA0bXV4KTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbXV4aW5nKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X211eGluZ19ub25femVyb19zZWdtZW50KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X211eGluZ19ub25femVyb19zZWdtZW50X2RpZmZlcmVudCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9tdXhpbmdfZHRzX291dHNpZGVfc2VnbWVudCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9tdXhpbmdfaW5pdGlhbF9nYXApOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAocXRtdXgpCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWViYmJhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYwpAQCAtMCwwICsxLDE5NzkgQEAKKy8qIEdTdHJlYW1lciBSZXBsYXlHYWluIGFuYWx5c2lzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFJlbmUgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKyAqCisgKiByZ2FuYWx5c2lzLmM6IFVuaXQgdGVzdCBmb3IgdGhlIHJnYW5hbHlzaXMgZWxlbWVudAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKy8qIFNvbWUgdGhpbmdzIHRvIG5vdGUgYWJvdXQgdGhlIFJNUyB3aW5kb3cgbGVuZ3RoIG9mIHRoZSBhbmFseXNpcyBhbGdvcml0aG0gYW5kCisgKiB0aHVzIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VkIGluIHRoZSBlbGVtZW50OiBQcm9jZXNzaW5nIGRpdmlkZXMgaW5wdXQgZGF0YQorICogaW50byA1MG1zIHdpbmRvd3MgYXQgc29tZSBwb2ludC4gIFNvbWUgZGV0YWlscyBhYm91dCB0aGlzIHRoYXQgbm9ybWFsbHkgZG8KKyAqIG5vdCBtYXR0ZXI6CisgKgorICogIDEuIEF0IHRoZSBlbmQgb2YgYSBzdHJlYW0sIHRoZSByZW1haW5kZXIgb2YgZGF0YSB0aGF0IGRpZCBub3QgZmlsbCB1cCB0aGUKKyAqICAgICBsYXN0IDUwbXMgd2luZG93IGlzIHNpbXBseSBkaXNjYXJkZWQuCisgKgorICogIDIuIElmIHRoZSBzYW1wbGUgcmF0ZSBjaGFuZ2VzIGR1cmluZyBhIHN0cmVhbSwgdGhlIGN1cnJlbnRseSBydW5uaW5nIHdpbmRvdworICogICAgIGlzIGRpc2NhcmRlZCBhbmQgdGhlIGVxdWFsIGxvdWRuZXNzIGZpbHRlciBnZXRzIHJlc2V0IGFzIGlmIGEgbmV3IHN0cmVhbQorICogICAgIHN0YXJ0ZWQuCisgKgorICogIDMuIEZvciB0aGUgYWxidW0gZ2FpbiwgaXQgaXMgbm90IGVudGlyZWx5IGNvcnJlY3QgdG8gdGhpbmsgb2Ygb2J0YWluaW5nIGl0CisgKiAgICAgbGlrZSAiYXMgaWYgYWxsIHRoZSB0cmFja3MgYXJlIGFuYWx5emVkIGFzIG9uZSB0cmFjayIuICBUaGVyZSBpc24ndCBhCisgKiAgICAgc2VwYXJhdGUgd2luZG93IGJlaW5nIHRyYWNrZWQgZm9yIGFsYnVtIHByb2Nlc3NpbmcsIHNvIGF0IHN0cmVhbSAodHJhY2spCisgKiAgICAgZW5kLCB0aGUgcmVtYWluaW5nIHVuZmlsbGVkIHdpbmRvdyBkb2VzIG5vdCBjb250cmlidXRlIHRvIHRoZSBhbGJ1bSBnYWluCisgKiAgICAgZWl0aGVyLgorICoKKyAqICA0LiBJZiBhIHdhdmVmb3JtIHdpdGggYSByZXN1bHQgZ2FpbiBHIGlzIGNvbmNhdGVuYXRlZCB0byBpdHNlbGYgYW5kIHRoZQorICogICAgIHJlc3VsdCBwcm9jZXNzZWQgYXMgYSB0cmFjaywgdGhlIGdhaW4gY2FuIGJlIGRpZmZlcmVudCBmcm9tIEcgaWYgYW5kIG9ubHkKKyAqICAgICBpZiB0aGUgZHVyYXRpb24gb2YgdGhlIG9yaWdpbmFsIHdhdmVmb3JtIGlzIG5vdCBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mCisgKiAgICAgNTBtcy4gIElmIHRoZSBvcmlnaW5hbCB3YXZlZm9ybSBnZXRzIHByb2Nlc3NlZCBhcyBhIHNpbmdsZSB0cmFjayBhbmQgdGhlbgorICogICAgIHRoZSBzYW1lIGRhdGEgYWdhaW4gYXMgYSBzdWJzZXF1ZW50IHRyYWNrLCB0aGUgYWxidW0gcmVzdWx0IGdhaW4gd2lsbAorICogICAgIGFsd2F5cyBtYXRjaCBHICh0aGlzIGlzIGltcGxpZWQgYnkgMy4pLgorICoKKyAqICA1LiBBIHN0cmVhbSBzaG9ydGVyIHRoYW4gNTBtcyBjYW5ub3QgYmUgYW5hbHl6ZWQuICBBdCA4MDAwIGFuZCA0ODAwMCBIeiwKKyAqICAgICB0aGlzIGNvcnJlc3BvbmRzIHRvIDQwMCByZXNwLiAyNDAwIGZyYW1lcy4gIElmIGEgc3RyZWFtIGlzIHNob3J0ZXIgdGhhbgorICogICAgIDUwbXMsIHRoZSBlbGVtZW50IHdpbGwgbm90IGdlbmVyYXRlIHRhZ3MgYXQgRU9TIChvbmx5IGlmIGFuIGFsYnVtCisgKiAgICAgZmluaXNoZWQsIGJ1dCBvbmx5IGFsYnVtIHRhZ3MgYXJlIGdlbmVyYXRlZCB0aGVuKS4gIFRoaXMgaXMgbm90IGFuCisgKiAgICAgZXJyb25lb3VzIGNvbmRpdGlvbiwgdGhlIGVsZW1lbnQgc2hvdWxkIGJlaGF2ZSBub3JtYWxseS4KKyAqCisgKiBUaGUgbGltaXRhdGlvbnMgb3V0bGluZWQgaW4gMS4tNC4gZG8gbm90IGFwcGx5IHRvIHRoZSBwZWFrIHZhbHVlcy4gIEV2ZXJ5CisgKiBzaW5nbGUgc2FtcGxlIGlzIGFjY291bnRlZCBmb3Igd2hlbiBsb29raW5nIGZvciB0aGUgcGVhay4gIFRodXMgdGhlIGFsYnVtCisgKiBwZWFrIGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIG1heGltdW0gdmFsdWUgb2YgYWxsIHRyYWNrIHBlYWtzLgorICoKKyAqIEluIG5vcm1hbCBkYXktdG8tZGF5IHVzZSwgdGhlc2UgbGl0dGxlIGZhY3RzIGFyZSB1bmxpa2VseSB0byBiZSByZWxldmFudCwgYnV0CisgKiB0aGV5IGhhdmUgdG8gYmUga2VwdCBpbiBtaW5kIGZvciB3cml0aW5nIHRoZSB0ZXN0cyBoZXJlLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworLyogRm9yIGVhc2Ugb2YgcHJvZ3JhbW1pbmcgd2UgdXNlIGdsb2JhbHMgdG8ga2VlcCByZWZzIGZvciBvdXIgZmxvYXRpbmcgc3JjIGFuZAorICogc2luayBwYWRzIHdlIGNyZWF0ZTsgb3RoZXJ3aXNlIHdlIGFsd2F5cyBoYXZlIHRvIGRvIGdldF9wYWQsIGdldF9wZWVyLCBhbmQKKyAqIHRoZW4gcmVtb3ZlIHJlZmVyZW5jZXMgaW4gZXZlcnkgdGVzdCBmdW5jdGlvbiAqLworc3RhdGljIEdzdFBhZCAqbXlzcmNwYWQsICpteXNpbmtwYWQ7CitzdGF0aWMgR3N0QnVzICpteWJ1czsKKworLyogTWFwcGluZyBmcm9tIHN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgdG8gdGhlIGNvcnJlY3QgcmVzdWx0IGdhaW4gZm9yIHRoZQorICogZm9sbG93aW5nIHRlc3Qgd2F2ZWZvcm06IDIwICogNTEyIHNhbXBsZXMgd2l0aCBhIHF1YXJ0ZXItZnVsbCBhbXBsaXR1ZGUgb2YKKyAqIHRvZ2dsaW5nIHNpZ24sIGNoYW5naW5nIGV2ZXJ5IDQ4IHNhbXBsZXMgYW5kIHN0YXJ0aW5nIHdpdGggdGhlIHBvc2l0aXZlCisgKiB2YWx1ZS4KKyAqCisgKiBFdmVuIGlmIHdlIHdvdWxkIGdlbmVyYXRlIGEgd2F2ZSBkZXNjcmliaW5nIGEgc2lnbmFsIHdpdGggdGhlIHNhbWUgZnJlcXVlbmN5CisgKiBhdCBlYWNoIHNhbXBsaW5nIHJhdGUsIHRoZSByZXN1bHRzIHdvdWxkIHZhcnkgKHNsaWdodGx5KS4gIEhlbmNlIHRoZSBzaW1wbGUKKyAqIGdlbmVyYXRpb24gbWV0aG9kLCBzaW5jZSB3ZSBjYW5ub3QgdXNlIGEgY29uc3RhbnQgdmFsdWUgYXMgZXhwZWN0ZWQgcmVzdWx0CisgKiBhbnl3YXlzLiAgRm9yIGFsbCBzYW1wbGUgcmF0ZXMsIGNoYW5naW5nIHRoZSBzaWduIGV2ZXJ5IDQ4IGZyYW1lcyBnaXZlcyBhCisgKiBzYW5lIGZyZXF1ZW5jeS4gIEJ1ZmZlcnMgY29udGFpbmluZyBkYXRhIHRoYXQgZm9ybXMgc3VjaCBhIHdhdmVmb3JtIGlzCisgKiBjcmVhdGVkIHVzaW5nIHRoZSB0ZXN0X2J1ZmZlcl9zcXVhcmVfe2Zsb2F0LGludDE2fV97bW9ubyxzdGVyZW99IGZ1bmN0aW9ucworICogYmVsb3cuCisgKgorICogVGhlIHJlc3VsdHMgaGF2ZSBiZWVuIGNoZWNrZWQgYWdhaW5zdCB3aGF0IHRoZSBtZXRhZmxhYyBhbmQgd2F2ZWdhaW4gcHJvZ3JhbXMKKyAqIGdlbmVyYXRlIGZvciBzdWNoIGEgc3RyZWFtLiAgSWYgeW91IHdhbnQgdG8gdmVyaWZ5IHRoZXNlLCBiZSBzdXJlIHRoYXQgdGhlCisgKiBtZXRhZmxhYyBwcm9ncmFtIGRvZXMgbm90IHByb2R1Y2UgaW5jb3JyZWN0IHJlc3VsdHMgaW4geW91ciBlbnZpcm9ubWVudDogSQorICogZm91bmQgYSBzdHJhbmdlIGJ1ZyBpbiB0aGUgKGRlZmFjdG8pIHJlZmVyZW5jZSBjb2RlIGZvciB0aGUgYW5hbHlzaXMgdGhhdAorICogc29tZXRpbWVzIGxlYWRzIHRvIGluY29ycmVjdCBSTVMgd2luZG93IGxlbmd0aHMuICovCisKK3N0cnVjdCByYXRlX3Rlc3QKK3sKKyAgZ3VpbnQgc2FtcGxlX3JhdGU7CisgIGdkb3VibGUgZ2FpbjsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmF0ZV90ZXN0IHN1cHBvcnRlZF9yYXRlc1tdID0geworICB7ODAwMCwgLTAuOTF9LAorICB7MTEwMjUsIC0yLjgwfSwKKyAgezEyMDAwLCAtMy4xM30sCisgIHsxNjAwMCwgLTQuMjZ9LAorICB7MjIwNTAsIC01LjY0fSwKKyAgezI0MDAwLCAtNS44N30sCisgIHszMjAwMCwgLTYuMDN9LAorICB7NDQxMDAsIC02LjIwfSwKKyAgezQ4MDAwLCAtNi4xNH0KK307CisKKy8qIExvb2t1cCB0aGUgY29ycmVjdCBnYWluIGFkanVzdG1lbnQgcmVzdWx0IGluIGFib3ZlIGFycmF5LiAqLworCitzdGF0aWMgZ2RvdWJsZQorZ2V0X2V4cGVjdGVkX2dhaW4gKGd1aW50IHNhbXBsZV9yYXRlKQoreworICBnaW50IGk7CisKKyAgZm9yIChpID0gR19OX0VMRU1FTlRTIChzdXBwb3J0ZWRfcmF0ZXMpOyBpLS07KQorICAgIGlmIChzdXBwb3J0ZWRfcmF0ZXNbaV0uc2FtcGxlX3JhdGUgPT0gc2FtcGxlX3JhdGUpCisgICAgICByZXR1cm4gc3VwcG9ydGVkX3JhdGVzW2ldLmdhaW47CisgIGdfcmV0dXJuX3ZhbF9pZl9yZWFjaGVkICgwLjApOworfQorCisjZGVmaW5lIFNJTEVOQ0VfR0FJTiA2NC44MgorCisjZGVmaW5lIFJFUExBWV9HQUlOX0NBUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImNoYW5uZWxzID0gKGludCkgeyAxLCAyIH0sICIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAicmF0ZSA9IChpbnQpIHsgODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsICIgICBcCisgICIyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9IgorCisjZGVmaW5lIFJHX0FOQUxZU0lTX0NBUFNfVEVNUExBVEVfU1RSSU5HICAgICAgXAorICAiYXVkaW8veC1yYXcsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImZvcm1hdCA9IChzdHJpbmcpICJHU1RfQVVESU9fTkUgKEYzMikgIiwgIiBcCisgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiAgICAgICAgICAgXAorICBSRVBMQVlfR0FJTl9DQVBTICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIjsgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhdWRpby94LXJhdywgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZm9ybWF0ID0gKHN0cmluZykgIkdTVF9BVURJT19ORSAoUzE2KSAiLCAiIFwKKyAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiICAgICAgICAgICBcCisgIFJFUExBWV9HQUlOX0NBUFMKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoUkdfQU5BTFlTSVNfQ0FQU19URU1QTEFURV9TVFJJTkcpCisgICAgKTsKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFJHX0FOQUxZU0lTX0NBUFNfVEVNUExBVEVfU1RSSU5HKQorICAgICk7CisKK3N0YXRpYyBnYm9vbGVhbgorbXlzaW5rX2V2ZW50X2Z1bmMgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiJXMgZXZlbnQ6ICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpLCBldmVudCk7CisKKyAgLyogYSBzaW5rIHdvdWxkIHBvc3QgdGFnIGV2ZW50cyBhcyBtZXNzYWdlcywgc28gZG8gdGhlIHNhbWUgaGVyZSwKKyAgICogZXNwLiBzaW5jZSB3ZSdyZSBwb2xsaW5nIG9uIHRoZSBidXMgd2FpdGluZyBmb3IgVEFHIG1lc3NhZ2VzLi4gKi8KKyAgaWYgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX1RBRykgeworICAgIEdzdFRhZ0xpc3QgKnRhZ2xpc3Q7CisKKyAgICBnc3RfZXZlbnRfcGFyc2VfdGFnIChldmVudCwgJnRhZ2xpc3QpOworCisgICAgZ3N0X2J1c19wb3N0IChteWJ1cywgZ3N0X21lc3NhZ2VfbmV3X3RhZyAoR1NUX09CSkVDVCAobXlzaW5rcGFkKSwKKyAgICAgICAgICAgIGdzdF90YWdfbGlzdF9jb3B5ICh0YWdsaXN0KSkpOworICB9CisKKyAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF9yZ2FuYWx5c2lzICh2b2lkKQoreworICBHc3RFbGVtZW50ICphbmFseXNpczsKKyAgR3N0QnVzICpidXM7CisKKyAgR1NUX0RFQlVHICgic2V0dXBfcmdhbmFseXNpcyIpOworICBhbmFseXNpcyA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgicmdhbmFseXNpcyIpOworICBteXNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkIChhbmFseXNpcywgJnNyY3RlbXBsYXRlKTsKKyAgbXlzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChhbmFseXNpcywgJnNpbmt0ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChteXNpbmtwYWQsIG15c2lua19ldmVudF9mdW5jKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICBidXMgPSBnc3RfYnVzX25ldyAoKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAoYW5hbHlzaXMsIGJ1cyk7CisKKyAgbXlidXMgPSBidXM7ICAgICAgICAgICAgICAgICAgLyoga2VlcCByZWYgKi8KKworICByZXR1cm4gYW5hbHlzaXM7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX3JnYW5hbHlzaXMgKEdzdEVsZW1lbnQgKiBlbGVtZW50KQoreworICBHU1RfREVCVUcgKCJjbGVhbnVwX3JnYW5hbHlzaXMiKTsKKworICBnX2xpc3RfZm9yZWFjaCAoYnVmZmVycywgKEdGdW5jKSBnc3RfbWluaV9vYmplY3RfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGdzdF9vYmplY3RfdW5yZWYgKG15YnVzKTsKKyAgbXlidXMgPSBOVUxMOworCisgIC8qIFRoZSBidXMgb3ducyByZWZlcmVuY2VzIHRvIHRoZSBlbGVtZW50OiAqLworICBnc3RfZWxlbWVudF9zZXRfYnVzIChlbGVtZW50LCBOVUxMKTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBGQUxTRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBGQUxTRSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zcmNfcGFkIChlbGVtZW50KTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChlbGVtZW50KTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGVsZW1lbnQpOworfQorCitzdGF0aWMgdm9pZAorc2V0X3BsYXlpbmdfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50KQoreworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiQ291bGQgbm90IHNldCBzdGF0ZSB0byBQTEFZSU5HIik7Cit9CisKK3N0YXRpYyB2b2lkCitzZW5kX2ZsdXNoX2V2ZW50cyAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIGdib29sZWFuIHJlczsKKyAgR3N0UGFkICpwYWQ7CisKKyAgcGFkID0gbXlzcmNwYWQ7CisgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAocGFkLCBnc3RfZXZlbnRfbmV3X2ZsdXNoX3N0YXJ0ICgpKTsKKyAgZmFpbF91bmxlc3MgKHJlcywgImZsdXNoLXN0YXJ0IGV2ZW4gbm90IGhhbmRsZWR0Iik7CisgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAocGFkLCBnc3RfZXZlbnRfbmV3X2ZsdXNoX3N0b3AgKFRSVUUpKTsKKyAgZmFpbF91bmxlc3MgKHJlcywgImZsdXNoLXN0b3AgZXZlbnQgbm90IGhhbmRsZWQiKTsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfc3RyZWFtX3N0YXJ0X2V2ZW50IChHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RQYWQgKnBhZDsKKworICBwYWQgPSBteXNyY3BhZDsKKyAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChwYWQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgidGVzdCIpKTsKKyAgZmFpbF91bmxlc3MgKHJlcywgIlNUUkVBTV9TVEFSVCBldmVudCBub3QgaGFuZGxlZCIpOworfQorCitzdGF0aWMgdm9pZAorc2VuZF9jYXBzX2V2ZW50IChjb25zdCBnY2hhciAqIGZvcm1hdCwgZ2ludCBzYW1wbGVfcmF0ZSwgZ2ludCBjaGFubmVscykKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcmF3IiwKKyAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCBmb3JtYXQsCisgICAgICAicmF0ZSIsIEdfVFlQRV9JTlQsIHNhbXBsZV9yYXRlLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBjaGFubmVscywKKyAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCAiaW50ZXJsZWF2ZWQiLCBOVUxMKTsKKyAgaWYgKGNoYW5uZWxzID09IDIpIHsKKyAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLAorICAgICAgICAiY2hhbm5lbC1tYXNrIiwgR1NUX1RZUEVfQklUTUFTSywKKyAgICAgICAgR19HVUlOVDY0X0NPTlNUQU5UICgweDAwMDAwMDAwMDAwMDAwMDMpLCBOVUxMKTsKKyAgfQorICBnc3RfcGFkX3NldF9jYXBzIChteXNyY3BhZCwgY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfc2VnbWVudF9ldmVudCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RQYWQgKnBhZDsKKworICBwYWQgPSBteXNyY3BhZDsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAocGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSk7CisgIGZhaWxfdW5sZXNzIChyZXMsICJTRUdNRU5UIGV2ZW50IG5vdCBoYW5kbGVkIik7Cit9CisKK3N0YXRpYyB2b2lkCitzZW5kX2Vvc19ldmVudCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdEJ1cyAqYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAoZWxlbWVudCk7CisgIEdzdFBhZCAqcGFkID0gbXlzcmNwYWQ7CisgIGdib29sZWFuIHJlczsKKworICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHBhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworICBmYWlsX3VubGVzcyAocmVzLCAiRU9TIGV2ZW50IG5vdCBoYW5kbGVkIik7CisKKyAgLyogVGhlcmUgaXMgbm8gc2luayBlbGVtZW50LCBzbyBfd2VfIHBvc3QgdGhlIEVPUyBtZXNzYWdlIG9uIHRoZSBidXMgaGVyZS4gIE9mCisgICAqIGNvdXJzZSB3ZSBnZW5lcmF0ZSBhbnkgRU9TIG91cnNlbHZlcywgYnV0IHRoaXMgYWxsb3dzIHVzIHRvIHBvbGwgZm9yIHRoZQorICAgKiBFT1MgbWVzc2FnZSBpbiBwb2xsX2VvcyBpZiB3ZSBleHBlY3QgdGhlIGVsZW1lbnQgdG8gX25vdF8gZ2VuZXJhdGUgYSBUQUcKKyAgICogbWVzc2FnZS4gIFRoYXQncyBiZXR0ZXIgdGhhbiB3YWl0aW5nIGZvciBhIHRpbWVvdXQgdG8gbGFwc2UuICovCisgIGZhaWxfdW5sZXNzIChnc3RfYnVzX3Bvc3QgKGJ1cywgZ3N0X21lc3NhZ2VfbmV3X2VvcyAoTlVMTCkpKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworfQorCitzdGF0aWMgdm9pZAorc2VuZF90YWdfZXZlbnQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RUYWdMaXN0ICogdGFnX2xpc3QpCit7CisgIEdzdFBhZCAqcGFkID0gbXlzcmNwYWQ7CisgIEdzdEV2ZW50ICpldmVudCA9IGdzdF9ldmVudF9uZXdfdGFnICh0YWdfbGlzdCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAocGFkLCBldmVudCksCisgICAgICAiQ2Fubm90IHNlbmQgVEFHIGV2ZW50OiBOb3QgaGFuZGxlZC4iKTsKK30KKworc3RhdGljIHZvaWQKK3BvbGxfZW9zIChHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgR3N0QnVzICpidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChlbGVtZW50KTsKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKworICBtZXNzYWdlID0gZ3N0X2J1c19wb2xsIChidXMsIEdTVF9NRVNTQUdFX0VPUyB8IEdTVF9NRVNTQUdFX1RBRywgR1NUX1NFQ09ORCk7CisgIGZhaWxfdW5sZXNzIChtZXNzYWdlICE9IE5VTEwsICJDb3VsZCBub3QgcG9sbCBmb3IgRU9TIG1lc3NhZ2U6IFRpbWVkIG91dCIpOworICBmYWlsX3VubGVzcyAobWVzc2FnZS0+dHlwZSA9PSBHU1RfTUVTU0FHRV9FT1MsCisgICAgICAiQ291bGQgbm90IHBvbGwgZm9yIGVvcyBtZXNzYWdlOiBnb3QgbWVzc2FnZSBvZiB0eXBlICVzIGluc3RlYWQiLAorICAgICAgZ3N0X21lc3NhZ2VfdHlwZV9nZXRfbmFtZSAobWVzc2FnZS0+dHlwZSkpOworCisgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKK30KKworc3RhdGljIEdzdFRhZ0xpc3QgKgorcG9sbF90YWdzX29ubHkgKEdzdEVsZW1lbnQgKiBlbGVtZW50KQoreworICBHc3RCdXMgKmJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKGVsZW1lbnQpOworICBHc3RUYWdMaXN0ICp0YWdfbGlzdDsKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKworICBtZXNzYWdlID0gZ3N0X2J1c19wb2xsIChidXMsIEdTVF9NRVNTQUdFX1RBRywgR1NUX1NFQ09ORCk7CisgIGZhaWxfdW5sZXNzIChtZXNzYWdlICE9IE5VTEwsICJDb3VsZCBub3QgcG9sbCBmb3IgVEFHIG1lc3NhZ2U6IFRpbWVkIG91dCIpOworCisgIGdzdF9tZXNzYWdlX3BhcnNlX3RhZyAobWVzc2FnZSwgJnRhZ19saXN0KTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIHJldHVybiB0YWdfbGlzdDsKK30KKworLyogVGhpcyBhbHNvIHBvbGxzIGZvciBFT1Mgc2luY2UgdGhlIFRBRyBtZXNzYWdlIGNvbWVzIHJpZ2h0IGJlZm9yZSB0aGUgZW5kIG9mCisgKiBzdHJlYW1zLiAqLworCitzdGF0aWMgR3N0VGFnTGlzdCAqCitwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3QgPSBwb2xsX3RhZ3Nfb25seSAoZWxlbWVudCk7CisKKyAgcG9sbF9lb3MgKGVsZW1lbnQpOworCisgIHJldHVybiB0YWdfbGlzdDsKK30KKworI2RlZmluZSBNQVRDSF9QRUFLKHAxLCBwMikgKChwMSA8IHAyICsgMWUtNikgJiYgKHAyIDwgcDEgKyAxZS02KSkKKyNkZWZpbmUgTUFUQ0hfR0FJTihnMSwgZzIpICgoZzEgPCBnMiArIDFlLTEzKSAmJiAoZzIgPCBnMSArIDFlLTEzKSkKKworc3RhdGljIHZvaWQKK2ZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKGNvbnN0IEdzdFRhZ0xpc3QgKiB0YWdfbGlzdCwgZ2RvdWJsZSBnYWluKQoreworICBnZG91YmxlIHJlc3VsdDsKKworICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKHRhZ19saXN0LCBHU1RfVEFHX1RSQUNLX0dBSU4sICZyZXN1bHQpLAorICAgICAgIlRhZyBsaXN0IGNvbnRhaW5zIG5vIHRyYWNrIGdhaW4gdmFsdWUiKTsKKyAgZmFpbF91bmxlc3MgKE1BVENIX0dBSU4gKGdhaW4sIHJlc3VsdCksCisgICAgICAiVHJhY2sgZ2FpbiAlKy4yZiBkb2VzIG5vdCBtYXRjaCwgZXhwZWN0ZWQgJSsuMmYiLCByZXN1bHQsIGdhaW4pOworfQorCitzdGF0aWMgdm9pZAorZmFpbF91bmxlc3NfdHJhY2tfcGVhayAoY29uc3QgR3N0VGFnTGlzdCAqIHRhZ19saXN0LCBnZG91YmxlIHBlYWspCit7CisgIGdkb3VibGUgcmVzdWx0OworCisgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZSAodGFnX2xpc3QsIEdTVF9UQUdfVFJBQ0tfUEVBSywgJnJlc3VsdCksCisgICAgICAiVGFnIGxpc3QgY29udGFpbnMgbm8gdHJhY2sgcGVhayB2YWx1ZSIpOworICBmYWlsX3VubGVzcyAoTUFUQ0hfUEVBSyAocGVhaywgcmVzdWx0KSwKKyAgICAgICJUcmFjayBwZWFrICVmIGRvZXMgbm90IG1hdGNoLCBleHBlY3RlZCAlZiIsIHJlc3VsdCwgcGVhayk7Cit9CisKK3N0YXRpYyB2b2lkCitmYWlsX3VubGVzc19hbGJ1bV9nYWluIChjb25zdCBHc3RUYWdMaXN0ICogdGFnX2xpc3QsIGdkb3VibGUgZ2FpbikKK3sKKyAgZ2RvdWJsZSByZXN1bHQ7CisKKyAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwgR1NUX1RBR19BTEJVTV9HQUlOLCAmcmVzdWx0KSwKKyAgICAgICJUYWcgbGlzdCBjb250YWlucyBubyBhbGJ1bSBnYWluIHZhbHVlIik7CisgIGZhaWxfdW5sZXNzIChNQVRDSF9HQUlOIChyZXN1bHQsIGdhaW4pLAorICAgICAgIkFsYnVtIGdhaW4gJSsuMmYgZG9lcyBub3QgbWF0Y2gsIGV4cGVjdGVkICUrLjJmIiwgcmVzdWx0LCBnYWluKTsKK30KKworc3RhdGljIHZvaWQKK2ZhaWxfdW5sZXNzX2FsYnVtX3BlYWsgKGNvbnN0IEdzdFRhZ0xpc3QgKiB0YWdfbGlzdCwgZ2RvdWJsZSBwZWFrKQoreworICBnZG91YmxlIHJlc3VsdDsKKworICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKHRhZ19saXN0LCBHU1RfVEFHX0FMQlVNX1BFQUssICZyZXN1bHQpLAorICAgICAgIlRhZyBsaXN0IGNvbnRhaW5zIG5vIGFsYnVtIHBlYWsgdmFsdWUiKTsKKyAgZmFpbF91bmxlc3MgKE1BVENIX1BFQUsgKHBlYWssIHJlc3VsdCksCisgICAgICAiQWxidW0gcGVhayAlZiBkb2VzIG5vdCBtYXRjaCwgZXhwZWN0ZWQgJWYiLCByZXN1bHQsIHBlYWspOworfQorCitzdGF0aWMgdm9pZAorZmFpbF9pZl90cmFja190YWdzIChjb25zdCBHc3RUYWdMaXN0ICogdGFnX2xpc3QpCit7CisgIGdkb3VibGUgcmVzdWx0OworCisgIGZhaWxfaWYgKGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwgR1NUX1RBR19UUkFDS19HQUlOLCAmcmVzdWx0KSwKKyAgICAgICJUYWcgbGlzdCBjb250YWlucyB0cmFjayBnYWluIHZhbHVlIChidXQgc2hvdWxkIG5vdCkiKTsKKyAgZmFpbF9pZiAoZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKHRhZ19saXN0LCBHU1RfVEFHX1RSQUNLX1BFQUssICZyZXN1bHQpLAorICAgICAgIlRhZyBsaXN0IGNvbnRhaW5zIHRyYWNrIHBlYWsgdmFsdWUgKGJ1dCBzaG91bGQgbm90KSIpOworfQorCitzdGF0aWMgdm9pZAorZmFpbF9pZl9hbGJ1bV90YWdzIChjb25zdCBHc3RUYWdMaXN0ICogdGFnX2xpc3QpCit7CisgIGdkb3VibGUgcmVzdWx0OworCisgIGZhaWxfaWYgKGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwgR1NUX1RBR19BTEJVTV9HQUlOLCAmcmVzdWx0KSwKKyAgICAgICJUYWcgbGlzdCBjb250YWlucyBhbGJ1bSBnYWluIHZhbHVlIChidXQgc2hvdWxkIG5vdCkiKTsKKyAgZmFpbF9pZiAoZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKHRhZ19saXN0LCBHU1RfVEFHX0FMQlVNX1BFQUssICZyZXN1bHQpLAorICAgICAgIlRhZyBsaXN0IGNvbnRhaW5zIGFsYnVtIHBlYWsgdmFsdWUgKGJ1dCBzaG91bGQgbm90KSIpOworfQorCitzdGF0aWMgdm9pZAorZmFpbF91bmxlc3NfbnVtX3RyYWNrcyAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIGd1aW50IG51bV90cmFja3MpCit7CisgIGd1aW50IGN1cnJlbnQ7CisKKyAgZ19vYmplY3RfZ2V0IChlbGVtZW50LCAibnVtLXRyYWNrcyIsICZjdXJyZW50LCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGN1cnJlbnQgPT0gbnVtX3RyYWNrcywKKyAgICAgICJudW0tdHJhY2tzIHByb3BlcnR5IGhhcyBpbmNvcnJlY3QgdmFsdWUgJXUsIGV4cGVjdGVkICV1IiwKKyAgICAgIGN1cnJlbnQsIG51bV90cmFja3MpOworfQorCisvKiBGdW5jdGlvbnMgdGhhdCBjcmVhdGUgYnVmZmVycyB3aXRoIGNvbnN0YW50IHNhbXBsZSB2YWx1ZXMsIGZvciBwZWFrCisgKiB0ZXN0cy4gKi8KKworc3RhdGljIEdzdEJ1ZmZlciAqCit0ZXN0X2J1ZmZlcl9jb25zdF9mbG9hdF9tb25vIChnaW50IHNhbXBsZV9yYXRlLCBnc2l6ZSBuX2ZyYW1lcywgZ2Zsb2F0IHZhbHVlKQoreworICBHc3RCdWZmZXIgKmJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobl9mcmFtZXMgKiBzaXplb2YgKGdmbG9hdCkpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2Zsb2F0ICpkYXRhOworICBnaW50IGk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGRhdGEgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSBuX2ZyYW1lczsgaS0tOykKKyAgICAqZGF0YSsrID0gdmFsdWU7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoYnVmLCAiYnVmIiwgMSk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCit0ZXN0X2J1ZmZlcl9jb25zdF9mbG9hdF9zdGVyZW8gKGdpbnQgc2FtcGxlX3JhdGUsIGdzaXplIG5fZnJhbWVzLAorICAgIGdmbG9hdCB2YWx1ZV9sLCBnZmxvYXQgdmFsdWVfcikKK3sKKyAgR3N0QnVmZmVyICpidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG5fZnJhbWVzICogc2l6ZW9mIChnZmxvYXQpICogMik7CisgIEdzdE1hcEluZm8gbWFwOworICBnZmxvYXQgKmRhdGE7CisgIGdpbnQgaTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgZGF0YSA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IG5fZnJhbWVzOyBpLS07KSB7CisgICAgKmRhdGErKyA9IHZhbHVlX2w7CisgICAgKmRhdGErKyA9IHZhbHVlX3I7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChidWYsICJidWYiLCAxKTsKKworICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK3Rlc3RfYnVmZmVyX2NvbnN0X2ludDE2X21vbm8gKGdpbnQgc2FtcGxlX3JhdGUsIGdpbnQgZGVwdGgsIGdzaXplIG5fZnJhbWVzLAorICAgIGdpbnQxNiB2YWx1ZSkKK3sKKyAgR3N0QnVmZmVyICpidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG5fZnJhbWVzICogc2l6ZW9mIChnaW50MTYpKTsKKyAgZ2ludDE2ICpkYXRhOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2ludCBpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBkYXRhID0gKGdpbnQxNiAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gbl9mcmFtZXM7IGktLTspCisgICAgKmRhdGErKyA9IHZhbHVlOworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGJ1ZiwgImJ1ZiIsIDEpOworCisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgordGVzdF9idWZmZXJfY29uc3RfaW50MTZfc3RlcmVvIChnaW50IHNhbXBsZV9yYXRlLCBnaW50IGRlcHRoLCBnc2l6ZSBuX2ZyYW1lcywKKyAgICBnaW50MTYgdmFsdWVfbCwgZ2ludDE2IHZhbHVlX3IpCit7CisgIEdzdEJ1ZmZlciAqYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChuX2ZyYW1lcyAqIHNpemVvZiAoZ2ludDE2KSAqIDIpOworICBnaW50MTYgKmRhdGE7CisgIEdzdE1hcEluZm8gbWFwOworICBnaW50IGk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGRhdGEgPSAoZ2ludDE2ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSBuX2ZyYW1lczsgaS0tOykgeworICAgICpkYXRhKysgPSB2YWx1ZV9sOworICAgICpkYXRhKysgPSB2YWx1ZV9yOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoYnVmLCAiYnVmIiwgMSk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworLyogRnVuY3Rpb25zIHRoYXQgY3JlYXRlIGRhdGEgYnVmZmVycyBjb250YWluaW5nIHNxdWFyZSBzaWduYWwKKyAqIHdhdmVmb3Jtcy4gKi8KKworc3RhdGljIEdzdEJ1ZmZlciAqCit0ZXN0X2J1ZmZlcl9zcXVhcmVfZmxvYXRfbW9ubyAoZ2ludCAqIGFjY3VtdWxhdG9yLCBnaW50IHNhbXBsZV9yYXRlLAorICAgIGdzaXplIG5fZnJhbWVzLCBnZmxvYXQgdmFsdWUpCit7CisgIEdzdEJ1ZmZlciAqYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChuX2ZyYW1lcyAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgIGdmbG9hdCAqZGF0YTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdpbnQgaTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgZGF0YSA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IG5fZnJhbWVzOyBpLS07KSB7CisgICAgKmFjY3VtdWxhdG9yICs9IDE7CisgICAgKmFjY3VtdWxhdG9yICU9IDk2OworCisgICAgaWYgKCphY2N1bXVsYXRvciA8IDQ4KQorICAgICAgKmRhdGErKyA9IHZhbHVlOworICAgIGVsc2UKKyAgICAgICpkYXRhKysgPSAtdmFsdWU7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChidWYsICJidWYiLCAxKTsKKworICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK3Rlc3RfYnVmZmVyX3NxdWFyZV9mbG9hdF9zdGVyZW8gKGdpbnQgKiBhY2N1bXVsYXRvciwgZ2ludCBzYW1wbGVfcmF0ZSwKKyAgICBnc2l6ZSBuX2ZyYW1lcywgZ2Zsb2F0IHZhbHVlX2wsIGdmbG9hdCB2YWx1ZV9yKQoreworICBHc3RCdWZmZXIgKmJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobl9mcmFtZXMgKiBzaXplb2YgKGdmbG9hdCkgKiAyKTsKKyAgZ2Zsb2F0ICpkYXRhOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2ludCBpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBkYXRhID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gbl9mcmFtZXM7IGktLTspIHsKKyAgICAqYWNjdW11bGF0b3IgKz0gMTsKKyAgICAqYWNjdW11bGF0b3IgJT0gOTY7CisKKyAgICBpZiAoKmFjY3VtdWxhdG9yIDwgNDgpIHsKKyAgICAgICpkYXRhKysgPSB2YWx1ZV9sOworICAgICAgKmRhdGErKyA9IHZhbHVlX3I7CisgICAgfSBlbHNlIHsKKyAgICAgICpkYXRhKysgPSAtdmFsdWVfbDsKKyAgICAgICpkYXRhKysgPSAtdmFsdWVfcjsKKyAgICB9CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChidWYsICJidWYiLCAxKTsKKworICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK3Rlc3RfYnVmZmVyX3NxdWFyZV9pbnQxNl9tb25vIChnaW50ICogYWNjdW11bGF0b3IsIGdpbnQgc2FtcGxlX3JhdGUsCisgICAgZ2ludCBkZXB0aCwgZ3NpemUgbl9mcmFtZXMsIGdpbnQxNiB2YWx1ZSkKK3sKKyAgR3N0QnVmZmVyICpidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG5fZnJhbWVzICogc2l6ZW9mIChnaW50MTYpKTsKKyAgZ2ludDE2ICpkYXRhOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2ludCBpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBkYXRhID0gKGdpbnQxNiAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gbl9mcmFtZXM7IGktLTspIHsKKyAgICAqYWNjdW11bGF0b3IgKz0gMTsKKyAgICAqYWNjdW11bGF0b3IgJT0gOTY7CisKKyAgICBpZiAoKmFjY3VtdWxhdG9yIDwgNDgpCisgICAgICAqZGF0YSsrID0gdmFsdWU7CisgICAgZWxzZQorICAgICAgKmRhdGErKyA9IC1NQVggKHZhbHVlLCAtMzI3NjcpOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoYnVmLCAiYnVmIiwgMSk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCit0ZXN0X2J1ZmZlcl9zcXVhcmVfaW50MTZfc3RlcmVvIChnaW50ICogYWNjdW11bGF0b3IsIGdpbnQgc2FtcGxlX3JhdGUsCisgICAgZ2ludCBkZXB0aCwgZ3NpemUgbl9mcmFtZXMsIGdpbnQxNiB2YWx1ZV9sLCBnaW50MTYgdmFsdWVfcikKK3sKKyAgR3N0QnVmZmVyICpidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG5fZnJhbWVzICogc2l6ZW9mIChnaW50MTYpICogMik7CisgIGdpbnQxNiAqZGF0YTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdpbnQgaTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgZGF0YSA9IChnaW50MTYgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IG5fZnJhbWVzOyBpLS07KSB7CisgICAgKmFjY3VtdWxhdG9yICs9IDE7CisgICAgKmFjY3VtdWxhdG9yICU9IDk2OworCisgICAgaWYgKCphY2N1bXVsYXRvciA8IDQ4KSB7CisgICAgICAqZGF0YSsrID0gdmFsdWVfbDsKKyAgICAgICpkYXRhKysgPSB2YWx1ZV9yOworICAgIH0gZWxzZSB7CisgICAgICAqZGF0YSsrID0gLU1BWCAodmFsdWVfbCwgLTMyNzY3KTsKKyAgICAgICpkYXRhKysgPSAtTUFYICh2YWx1ZV9yLCAtMzI3NjcpOworICAgIH0KKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGJ1ZiwgImJ1ZiIsIDEpOworCisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyB2b2lkCitwdXNoX2J1ZmZlciAoR3N0QnVmZmVyICogYnVmKQoreworICAvKiBnc3RfcGFkX3B1c2ggc3RlYWxzIGEgcmVmZXJlbmNlLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgYnVmKSA9PSBHU1RfRkxPV19PSyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGJ1ZiwgImJ1ZiIsIDEpOworfQorCisvKioqIFN0YXJ0IG9mIHRoZSB0ZXN0cy4gKioqLworCisvKiBUaGlzIHRlc3QgbG9va3MgcmVkdW5kYW50LCBidXQgZWFybHkgdmVyc2lvbnMgb2YgdGhlIGVsZW1lbnQKKyAqIGNyYXNoZWQgd2hlbiBkb2luZywgd2VsbCwgbm90aGluZzogKi8KKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfbm9fYnVmZmVyKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmdhbmFseXNpcyAoKTsKKworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgcG9sbF9lb3MgKGVsZW1lbnQpOworCisgIGNsZWFudXBfcmdhbmFseXNpcyAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfbm9fYnVmZmVyX2FsYnVtXzEpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ2FuYWx5c2lzICgpOworCisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKworICAvKiBTaW5nbGUgdHJhY2s6ICovCisgIHNlbmRfc3RyZWFtX3N0YXJ0X2V2ZW50IChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICBwb2xsX2VvcyAoZWxlbWVudCk7CisKKyAgLyogRmlyc3QgYWxidW06ICovCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgIm51bS10cmFja3MiLCAzLCBOVUxMKTsKKworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgcG9sbF9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc19udW1fdHJhY2tzIChlbGVtZW50LCAyKTsKKworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgcG9sbF9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc19udW1fdHJhY2tzIChlbGVtZW50LCAxKTsKKworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgcG9sbF9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc19udW1fdHJhY2tzIChlbGVtZW50LCAwKTsKKworICAvKiBTZWNvbmQgYWxidW06ICovCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgIm51bS10cmFja3MiLCAyLCBOVUxMKTsKKworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgcG9sbF9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc19udW1fdHJhY2tzIChlbGVtZW50LCAxKTsKKworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgcG9sbF9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc19udW1fdHJhY2tzIChlbGVtZW50LCAwKTsKKworICAvKiBTaW5nbGUgdHJhY2s6ICovCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICBwb2xsX2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX251bV90cmFja3MgKGVsZW1lbnQsIDApOworCisgIGNsZWFudXBfcmdhbmFseXNpcyAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfbm9fYnVmZmVyX2FsYnVtXzIpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ2FuYWx5c2lzICgpOworICBHc3RUYWdMaXN0ICp0YWdfbGlzdDsKKyAgZ2ludCBhY2N1bXVsYXRvciA9IDA7CisgIGdpbnQgaTsKKworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJudW0tdHJhY2tzIiwgMywgTlVMTCk7CisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKworICAvKiBObyBidWZmZXIgZm9yIHRoZSBmaXJzdCB0cmFjay4gKi8KKyAgc2VuZF9zdHJlYW1fc3RhcnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIC8qIE5vIHRhZ3Mgc2hvdWxkIGJlIHBvc3RlZCwgdGhlcmUgd2FzIG5vdGhpbmcgdG8gYW5hbHl6ZTogKi8KKyAgcG9sbF9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc19udW1fdHJhY2tzIChlbGVtZW50LCAyKTsKKworICAvKiBBIHRlc3Qgd2F2ZWZvcm0gd2l0aCBrbm93biBnYWluIHJlc3VsdCBhcyBzZWNvbmQgdHJhY2s6ICovCisKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoRjMyKSwgNDQxMDAsIDEpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBmb3IgKGkgPSAyMDsgaS0tOykKKyAgICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfc3F1YXJlX2Zsb2F0X21vbm8gKCZhY2N1bXVsYXRvciwgNDQxMDAsIDUxMiwKKyAgICAgICAgICAgIDAuMjUpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC4yNSk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKHRhZ19saXN0LCAtNi4yMCk7CisgIC8qIEFsYnVtIGlzIG5vdCBmaW5pc2hlZCB5ZXQ6ICovCisgIGZhaWxfaWZfYWxidW1fdGFncyAodGFnX2xpc3QpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKyAgZmFpbF91bmxlc3NfbnVtX3RyYWNrcyAoZWxlbWVudCwgMSk7CisKKyAgLyogTm8gYnVmZmVyIGZvciB0aGUgbGFzdCB0cmFjay4gKi8KKworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc19hbGJ1bV9wZWFrICh0YWdfbGlzdCwgMC4yNSk7CisgIGZhaWxfdW5sZXNzX2FsYnVtX2dhaW4gKHRhZ19saXN0LCAtNi4yMCk7CisgIC8qIE5vIHRyYWNrIHRhZ3Mgc2hvdWxkIGJlIHBvc3RlZCwgYXMgdGhlcmUgd2FzIG5vIGRhdGEgZm9yIGl0OiAqLworICBmYWlsX2lmX3RyYWNrX3RhZ3MgKHRhZ19saXN0KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisgIGZhaWxfdW5sZXNzX251bV90cmFja3MgKGVsZW1lbnQsIDApOworCisgIGNsZWFudXBfcmdhbmFseXNpcyAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZW1wdHlfYnVmZmVycykKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3JnYW5hbHlzaXMgKCk7CisKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOworCisgIC8qIFNpbmdsZSB0cmFjazogKi8KKyAgc2VuZF9zdHJlYW1fc3RhcnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoRjMyKSwgNDQxMDAsIDIpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfc3RlcmVvICg0NDEwMCwgMCwgMC4wLCAwLjApKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICBwb2xsX2VvcyAoZWxlbWVudCk7CisKKyAgLyogRmlyc3QgYWxidW06ICovCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgIm51bS10cmFja3MiLCAyLCBOVUxMKTsKKworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9mbG9hdF9zdGVyZW8gKDQ0MTAwLCAwLCAwLjAsIDAuMCkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHBvbGxfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfbnVtX3RyYWNrcyAoZWxlbWVudCwgMSk7CisKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfc3RlcmVvICg0NDEwMCwgMCwgMC4wLCAwLjApKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICBwb2xsX2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX251bV90cmFja3MgKGVsZW1lbnQsIDApOworCisgIC8qIFNlY29uZCBhbGJ1bSwgd2l0aCBhIHNpbmdsZSB0cmFjazogKi8KKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAibnVtLXRyYWNrcyIsIDEsIE5VTEwpOworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9mbG9hdF9zdGVyZW8gKDQ0MTAwLCAwLCAwLjAsIDAuMCkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHBvbGxfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfbnVtX3RyYWNrcyAoZWxlbWVudCwgMCk7CisKKyAgLyogU2luZ2xlIHRyYWNrOiAqLworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9mbG9hdF9zdGVyZW8gKDQ0MTAwLCAwLCAwLjAsIDAuMCkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHBvbGxfZW9zIChlbGVtZW50KTsKKworICBjbGVhbnVwX3JnYW5hbHlzaXMgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3RzIGZvciBjb3JyZWN0bmVzcyBvZiB0aGUgcGVhayB2YWx1ZXMuICovCisKKy8qIEZsb2F0IHBlYWsgdGVzdC4gIEZvciBzdGVyZW8sIG9uZSBjaGFubmVsIGhhcyB0aGUgY29uc3RhbnQgdmFsdWUgb2YgLTEuMzY5LAorICogdGhlIG90aGVyIG9uZSAwLjAuICBUaGlzIHRlc3RzIG1hbnkgdGhpbmdzOiBUaGUgcmVzdWx0IHBlYWsgdmFsdWUgc2hvdWxkCisgKiBvY2N1ciBvbiBhbnkgY2hhbm5lbC4gIFRoZSBwZWFrIGlzIG9mIGNvdXJzZSB0aGUgYWJzb2x1dGUgYW1wbGl0dWRlLCBzbyAxLjM2OQorICogc2hvdWxkIGJlIHRoZSByZXN1bHQuICBUaGlzIHdpbGwgYWxzbyBkZXRlY3QgaWYgdGhlIGNvZGUgdXNlcyB0aGUgYWJzb2x1dGUKKyAqIHZhbHVlIGR1cmluZyB0aGUgY29tcGFyaXNvbi4gIElmIGl0IGlzIGJ1Z2d5IGl0IHdpbGwgcmV0dXJuIDAuMCBzaW5jZSAwLjAgPgorICogLTEuMzY5LiAgRnVydGhlcm1vcmUsIHRoaXMgbWFrZXMgc3VyZSB0aGF0IHRoZXJlIGlzIG5vIHByb2JsZW0gd2l0aCBoZWFkcm9vbQorICogKGV4Y2VlZGluZyAwZEJGUykuICBJbiB0aGUgd2lsZCB5b3UgZ2V0IGZsb2F0IHNhbXBsZXMgPiAxLjAgZnJvbSBzdHVmZiBsaWtlCisgKiB2b3JiaXMuICovCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BlYWtfZmxvYXQpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ2FuYWx5c2lzICgpOworICBHc3RUYWdMaXN0ICp0YWdfbGlzdDsKKworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisgIHNlbmRfc3RyZWFtX3N0YXJ0X2V2ZW50IChlbGVtZW50KTsKKyAgc2VuZF9jYXBzX2V2ZW50IChHU1RfQVVESU9fTkUgKEYzMiksIDgwMDAsIDIpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfc3RlcmVvICg4MDAwLCA1MTIsIC0xLjM2OSwgMC4wKSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDEuMzY5KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgLyogU3dhcHBlZCBjaGFubmVscy4gKi8KKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfc3RlcmVvICg4MDAwLCA1MTIsIDAuMCwgLTEuMzY5KSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDEuMzY5KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgLyogTW9uby4gKi8KKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoRjMyKSwgODAwMCwgMSk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9mbG9hdF9tb25vICg4MDAwLCA1MTIsIC0xLjM2OSkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAxLjM2OSk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIGNsZWFudXBfcmdhbmFseXNpcyAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGVha19pbnQxNl8xNikKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3JnYW5hbHlzaXMgKCk7CisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OworCisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKworICAvKiBIYWxmIGFtcGxpdHVkZS4gKi8KKyAgc2VuZF9zdHJlYW1fc3RhcnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoUzE2KSwgODAwMCwgMik7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9pbnQxNl9zdGVyZW8gKDgwMDAsIDE2LCA1MTIsIDEgPDwgMTQsIDApKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC41KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgLyogU3dhcHBlZCBjaGFubmVscy4gKi8KKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoUzE2KSwgODAwMCwgMik7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9pbnQxNl9zdGVyZW8gKDgwMDAsIDE2LCA1MTIsIDAsIDEgPDwgMTQpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC41KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgLyogTW9uby4gKi8KKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoUzE2KSwgODAwMCwgMSk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9pbnQxNl9tb25vICg4MDAwLCAxNiwgNTEyLCAxIDw8IDE0KSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuNSk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIC8qIEhhbGYgYW1wbGl0dWRlLCBuZWdhdGl2ZSB2YXJpYW50LiAqLworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChTMTYpLCA4MDAwLCAyKTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2ludDE2X3N0ZXJlbyAoODAwMCwgMTYsIDUxMiwgLSgxIDw8IDE0KSwgMCkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjUpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICAvKiBTd2FwcGVkIGNoYW5uZWxzLiAqLworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChTMTYpLCA4MDAwLCAyKTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2ludDE2X3N0ZXJlbyAoODAwMCwgMTYsIDUxMiwgMCwgLSgxIDw8IDE0KSkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjUpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICAvKiBNb25vLiAqLworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChTMTYpLCA4MDAwLCAxKTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2ludDE2X21vbm8gKDgwMDAsIDE2LCA1MTIsIC0oMSA8PCAxNCkpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC41KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKworICAvKiBOb3cgY2hlY2sgZm9yIGNvcnJlY3Qgbm9ybWFsaXphdGlvbiBvZiB0aGUgcGVhayB2YWx1ZTogU2FtcGxlCisgICAqIHZhbHVlcyBvZiB0aGlzIGZvcm1hdCByYW5nZSBmcm9tIC0zMjc2OCB0byAzMjc2Ny4gIFNvIGZvciB0aGUKKyAgICogaGlnaGVzdCBwb3NpdGl2ZSBhbXBsaXR1ZGUgd2UgZG8gbm90IHJlYWNoIDEuMCwgb25seSBmb3IKKyAgICogLTMyNzY4ISAqLworCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9jYXBzX2V2ZW50IChHU1RfQVVESU9fTkUgKFMxNiksIDgwMDAsIDIpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfaW50MTZfc3RlcmVvICg4MDAwLCAxNiwgNTEyLCAzMjc2NywgMCkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAzMjc2Ny4gLyAzMjc2OC4pOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICAvKiBTd2FwcGVkIGNoYW5uZWxzLiAqLworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChTMTYpLCA4MDAwLCAyKTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2ludDE2X3N0ZXJlbyAoODAwMCwgMTYsIDUxMiwgMCwgMzI3NjcpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMzI3NjcuIC8gMzI3NjguKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgLyogTW9uby4gKi8KKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoUzE2KSwgODAwMCwgMSk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9pbnQxNl9tb25vICg4MDAwLCAxNiwgNTEyLCAzMjc2NykpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAzMjc2Ny4gLyAzMjc2OC4pOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworCisgIC8qIE5lZ2F0aXZlIHZhcmlhbnQsIHJlYWNoaW5nIDEuMC4gKi8KKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoUzE2KSwgODAwMCwgMik7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9pbnQxNl9zdGVyZW8gKDgwMDAsIDE2LCA1MTIsIC0zMjc2OCwgMCkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAxLjApOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICAvKiBTd2FwcGVkIGNoYW5uZWxzLiAqLworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChTMTYpLCA4MDAwLCAyKTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2ludDE2X3N0ZXJlbyAoODAwMCwgMTYsIDUxMiwgMCwgLTMyNzY4KSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDEuMCk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIC8qIE1vbm8uICovCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9jYXBzX2V2ZW50IChHU1RfQVVESU9fTkUgKFMxNiksIDgwMDAsIDEpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfaW50MTZfbW9ubyAoODAwMCwgMTYsIDUxMiwgLTMyNzY4KSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDEuMCk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIGNsZWFudXBfcmdhbmFseXNpcyAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGVha19hbGJ1bSkKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3JnYW5hbHlzaXMgKCk7CisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OworCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgIm51bS10cmFja3MiLCAyLCBOVUxMKTsKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOworCisgIHNlbmRfc3RyZWFtX3N0YXJ0X2V2ZW50IChlbGVtZW50KTsKKyAgc2VuZF9jYXBzX2V2ZW50IChHU1RfQVVESU9fTkUgKEYzMiksIDgwMDAsIDIpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfc3RlcmVvICg4MDAwLCAxMDI0LCAxLjAsIDAuMCkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAxLjApOworICBmYWlsX2lmX2FsYnVtX3RhZ3MgKHRhZ19saXN0KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisgIGZhaWxfdW5sZXNzX251bV90cmFja3MgKGVsZW1lbnQsIDEpOworCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2Zsb2F0X3N0ZXJlbyAoODAwMCwgMTAyNCwgMC4wLCAwLjUpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC41KTsKKyAgZmFpbF91bmxlc3NfYWxidW1fcGVhayAodGFnX2xpc3QsIDEuMCk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworICBmYWlsX3VubGVzc19udW1fdHJhY2tzIChlbGVtZW50LCAwKTsKKworICAvKiBUcnkgYSBzZWNvbmQgYWxidW06ICovCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgIm51bS10cmFja3MiLCAzLCBOVUxMKTsKKworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9mbG9hdF9zdGVyZW8gKDgwMDAsIDEwMjQsIDAuNCwgMC40KSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuNCk7CisgIGZhaWxfaWZfYWxidW1fdGFncyAodGFnX2xpc3QpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKyAgZmFpbF91bmxlc3NfbnVtX3RyYWNrcyAoZWxlbWVudCwgMik7CisKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfc3RlcmVvICg4MDAwLCAxMDI0LCAwLjQ1LCAwLjQ1KSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuNDUpOworICBmYWlsX2lmX2FsYnVtX3RhZ3MgKHRhZ19saXN0KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisgIGZhaWxfdW5sZXNzX251bV90cmFja3MgKGVsZW1lbnQsIDEpOworCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2Zsb2F0X3N0ZXJlbyAoODAwMCwgMTAyNCwgMC4yLCAwLjIpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC4yKTsKKyAgZmFpbF91bmxlc3NfYWxidW1fcGVhayAodGFnX2xpc3QsIDAuNDUpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKyAgZmFpbF91bmxlc3NfbnVtX3RyYWNrcyAoZWxlbWVudCwgMCk7CisKKyAgLyogQW5kIG5vdyBhIHNpbmdsZSB0cmFjaywgbm90IGluIGFsYnVtIG1vZGUgKG51bS10cmFja3MgaXMgMAorICAgKiBub3cpOiAqLworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9mbG9hdF9zdGVyZW8gKDgwMDAsIDEwMjQsIDAuMSwgMC4xKSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuMSk7CisgIGZhaWxfaWZfYWxidW1fdGFncyAodGFnX2xpc3QpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICBjbGVhbnVwX3JnYW5hbHlzaXMgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFN3aXRjaGluZyBmcm9tIHRyYWNrIHRvIGFsYnVtIG1vZGUuICovCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BlYWtfdHJhY2tfYWxidW0pCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ2FuYWx5c2lzICgpOworICBHc3RUYWdMaXN0ICp0YWdfbGlzdDsKKworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisKKyAgc2VuZF9zdHJlYW1fc3RhcnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoRjMyKSwgODAwMCwgMSk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9mbG9hdF9tb25vICg4MDAwLCAxMDI0LCAxLjApKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMS4wKTsKKyAgZmFpbF9pZl9hbGJ1bV90YWdzICh0YWdfbGlzdCk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgIm51bS10cmFja3MiLCAxLCBOVUxMKTsKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfbW9ubyAoODAwMCwgMTAyNCwgMC41KSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuNSk7CisgIGZhaWxfdW5sZXNzX2FsYnVtX3BlYWsgKHRhZ19saXN0LCAwLjUpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKyAgZmFpbF91bmxlc3NfbnVtX3RyYWNrcyAoZWxlbWVudCwgMCk7CisKKyAgY2xlYW51cF9yZ2FuYWx5c2lzIChlbGVtZW50KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBEaXNhYmxpbmcgYWxidW0gcHJvY2Vzc2luZyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgYWxidW0uICBQcm9iYWJseSBhIHJhcmUgZWRnZQorICogY2FzZSBhbmQgYXBwbGljYXRpb25zIHNob3VsZCBub3QgcmVseSBvbiB0aGlzIHRvIHdvcmsuICBUaGV5IG5lZWQgdG8gc2VuZCB0aGUKKyAqIGVsZW1lbnQgdG8gdGhlIFJFQURZIHN0YXRlIHRvIGNsZWFyIHVwIGFmdGVyIGFuIGFib3J0ZWQgYWxidW0gYW55d2F5IHNpbmNlCisgKiB0aGV5IG1pZ2h0IG5lZWQgdG8gcHJvY2VzcyBhbm90aGVyIGFsYnVtIGFmdGVyd2FyZHMuICovCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BlYWtfYWxidW1fYWJvcnRfdG9fdHJhY2spCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ2FuYWx5c2lzICgpOworICBHc3RUYWdMaXN0ICp0YWdfbGlzdDsKKworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJudW0tdHJhY2tzIiwgMiwgTlVMTCk7CisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKworICBzZW5kX3N0cmVhbV9zdGFydF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChGMzIpLCA4MDAwLCAyKTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2Zsb2F0X3N0ZXJlbyAoODAwMCwgMTAyNCwgMS4wLCAwLjApKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMS4wKTsKKyAgZmFpbF9pZl9hbGJ1bV90YWdzICh0YWdfbGlzdCk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworICBmYWlsX3VubGVzc19udW1fdHJhY2tzIChlbGVtZW50LCAxKTsKKworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJudW0tdHJhY2tzIiwgMCwgTlVMTCk7CisKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfc3RlcmVvICg4MDAwLCAxMDI0LCAwLjAsIDAuNSkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjUpOworICBmYWlsX2lmX2FsYnVtX3RhZ3MgKHRhZ19saXN0KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgY2xlYW51cF9yZ2FuYWx5c2lzIChlbGVtZW50KTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9nYWluX2FsYnVtKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmdhbmFseXNpcyAoKTsKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisgIGdpbnQgYWNjdW11bGF0b3I7CisgIGdpbnQgaTsKKworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJudW0tdHJhY2tzIiwgMywgTlVMTCk7CisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKworICAvKiBUaGUgdGhyZWUgdHJhY2tzIGFyZSBjb25zdHJ1Y3RlZCBzdWNoIHRoYXQgaWYgYW55IG9mIHRoZXNlIGlzIGluIGZhY3QKKyAgICogaWdub3JlZCBmb3IgdGhlIGFsYnVtIGdhaW4sIHRoZSBhbGJ1bSBnYWluIHdpbGwgZGlmZmVyLiAqLworICBzZW5kX3N0cmVhbV9zdGFydF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChGMzIpLCA0NDEwMCwgMik7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIGFjY3VtdWxhdG9yID0gMDsKKyAgZm9yIChpID0gODsgaS0tOykKKyAgICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfc3F1YXJlX2Zsb2F0X3N0ZXJlbyAoJmFjY3VtdWxhdG9yLCA0NDEwMCwgNTEyLAorICAgICAgICAgICAgMC43NSwgMC43NSkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjc1KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfZ2FpbiAodGFnX2xpc3QsIC0xNS43MCk7CisgIGZhaWxfaWZfYWxidW1fdGFncyAodGFnX2xpc3QpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIGFjY3VtdWxhdG9yID0gMDsKKyAgZm9yIChpID0gMTI7IGktLTspCisgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX3NxdWFyZV9mbG9hdF9zdGVyZW8gKCZhY2N1bXVsYXRvciwgNDQxMDAsIDUxMiwKKyAgICAgICAgICAgIDAuNSwgMC41KSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuNSk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKHRhZ19saXN0LCAtMTIuMjIpOworICBmYWlsX2lmX2FsYnVtX3RhZ3MgKHRhZ19saXN0KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBhY2N1bXVsYXRvciA9IDA7CisgIGZvciAoaSA9IDE4MDsgaS0tOykKKyAgICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfc3F1YXJlX2Zsb2F0X3N0ZXJlbyAoJmFjY3VtdWxhdG9yLCA0NDEwMCwgNTEyLAorICAgICAgICAgICAgMC4yNSwgMC4yNSkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuMjUpOworICBmYWlsX3VubGVzc190cmFja19nYWluICh0YWdfbGlzdCwgLTYuMjApOworICBmYWlsX3VubGVzc19hbGJ1bV9wZWFrICh0YWdfbGlzdCwgMC43NSk7CisgIC8qIFN0cmFuZ2VseSwgd2F2ZWdhaW4gcmVwb3J0cyAtMTIuMTcgZm9yIHRoZSBhbGJ1bSwgYnV0IHRoZSBmaXhlZAorICAgKiBtZXRhZmxhYyBhZ3JlZXMgdG8gdXMuICBDb3VsZCBiZSBhIDMyNzY3IHZzLiAzMjc2OCBpc3N1ZS4gKi8KKyAgZmFpbF91bmxlc3NfYWxidW1fZ2FpbiAodGFnX2xpc3QsIC0xMi4xOCk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIGNsZWFudXBfcmdhbmFseXNpcyAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogQ2hlY2tzIGVuc3VyaW5nIHRoYXQgdGhlICJmb3JjZWQiIHByb3BlcnR5IHdvcmtzIGFzIGFkdmVydGlzZWQuICovCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ZvcmNlZCkKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3JnYW5hbHlzaXMgKCk7CisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OworICBnaW50IGFjY3VtdWxhdG9yID0gMDsKKyAgZ2ludCBpOworCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgImZvcmNlZCIsIEZBTFNFLCBOVUxMKTsKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOworCisgIHNlbmRfc3RyZWFtX3N0YXJ0X2V2ZW50IChlbGVtZW50KTsKKyAgc2VuZF9jYXBzX2V2ZW50IChHU1RfQVVESU9fTkUgKEYzMiksIDQ0MTAwLCAyKTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAvKiBQcm92aWRlZCB2YWx1ZXMgYXJlIHRvdGFsbHkgYXJiaXRyYXJ5LiAqLworICBnc3RfdGFnX2xpc3RfYWRkICh0YWdfbGlzdCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsCisgICAgICBHU1RfVEFHX1RSQUNLX1BFQUssIDEuMCwgR1NUX1RBR19UUkFDS19HQUlOLCAyLjIxLCBOVUxMKTsKKyAgc2VuZF90YWdfZXZlbnQgKGVsZW1lbnQsIHRhZ19saXN0KTsKKworICBmb3IgKGkgPSAyMDsgaS0tOykKKyAgICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfc3RlcmVvICg0NDEwMCwgNTEyLCAwLjUsIDAuNSkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisKKyAgLyogVGhpcyBmYWlscyBpZiBhIHRhZyBtZXNzYWdlIGlzIGdlbmVyYXRlZDogKi8KKyAgLyogU2FtZSB2YWx1ZXMgYXMgYWJvdmUgKi8KKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfZ2FpbiAodGFnX2xpc3QsIDIuMjEpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMS4wKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgLyogTm93IGJhY2sgdG8gYSB0cmFjayB3aXRob3V0IHRhZ3MuICovCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgZm9yIChpID0gMjA7IGktLTspCisgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX3NxdWFyZV9mbG9hdF9zdGVyZW8gKCZhY2N1bXVsYXRvciwgNDQxMDAsIDUxMiwKKyAgICAgICAgICAgIDAuMjUsIDAuMjUpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC4yNSk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKHRhZ19saXN0LCBnZXRfZXhwZWN0ZWRfZ2FpbiAoNDQxMDApKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgY2xlYW51cF9yZ2FuYWx5c2lzIChlbGVtZW50KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBTZW5kaW5nIHRyYWNrIGdhaW4gYW5kIHBlYWsgaW4gc2VwYXJhdGUgdGFnIGxpc3RzLiAqLworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mb3JjZWRfc2VwYXJhdGUpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ2FuYWx5c2lzICgpOworICBHc3RUYWdMaXN0ICp0YWdfbGlzdDsKKyAgZ2ludCBhY2N1bXVsYXRvciA9IDA7CisgIGdpbnQgaTsKKworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJmb3JjZWQiLCBGQUxTRSwgTlVMTCk7CisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKworICBzZW5kX3N0cmVhbV9zdGFydF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChGMzIpLCA0NDEwMCwgMik7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZ3N0X3RhZ19saXN0X2FkZCAodGFnX2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELCBHU1RfVEFHX1RSQUNLX0dBSU4sIDIuMjEsCisgICAgICBOVUxMKTsKKyAgc2VuZF90YWdfZXZlbnQgKGVsZW1lbnQsIHRhZ19saXN0KTsKKworICB0YWdfbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ19saXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwgR1NUX1RBR19UUkFDS19QRUFLLCAxLjAsCisgICAgICBOVUxMKTsKKyAgc2VuZF90YWdfZXZlbnQgKGVsZW1lbnQsIHRhZ19saXN0KTsKKworICBmb3IgKGkgPSAyMDsgaS0tOykKKyAgICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfc3F1YXJlX2Zsb2F0X3N0ZXJlbyAoJmFjY3VtdWxhdG9yLCA0NDEwMCwgNTEyLAorICAgICAgICAgICAgMC41LCAwLjUpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworCisgIC8qIFNhbWUgdmFsdWVzIGFzIGFib3ZlICovCisgIHRhZ19saXN0ID0gcG9sbF90YWdzX29ubHkgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19nYWluICh0YWdfbGlzdCwgMi4yMSk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAxLjApOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICAvKiBOb3cgYSB0cmFjayB3aXRob3V0IHRhZ3MuICovCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgYWNjdW11bGF0b3IgPSAwOworICBmb3IgKGkgPSAyMDsgaS0tOykKKyAgICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfc3F1YXJlX2Zsb2F0X3N0ZXJlbyAoJmFjY3VtdWxhdG9yLCA0NDEwMCwgNTEyLAorICAgICAgICAgICAgMC4yNSwgMC4yNSkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjI1KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfZ2FpbiAodGFnX2xpc3QsIGdldF9leHBlY3RlZF9nYWluICg0NDEwMCkpOworICBmYWlsX2lmX2FsYnVtX3RhZ3MgKHRhZ19saXN0KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgY2xlYW51cF9yZ2FuYWx5c2lzIChlbGVtZW50KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBBIFRBRyBldmVudCBpcyBzZW50IF9hZnRlcl8gZGF0YSBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZC4gIEluIHJlYWwKKyAqIHBpcGVsaW5lcywgdGhpcyBjb3VsZCBoYXBwZW4gaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSByZ2FuYWx5c2lzIGVsZW1lbnQgKGJ5CisgKiBhY2NpZGVudCkuICBXaGlsZSBpdCB3b3VsZCBoYXZlIGFuYWx5emVkIGFsbCB0aGUgZGF0YSBwcmlvciB0byByZWNlaXZpbmcgdGhlCisgKiBldmVudCwgSSBleHBlY3QgaXQgdG8gbm90IHBvc3QgaXRzIHJlc3VsdHMgaWYgbm90IGZvcmNlZC4gIFRoaXMgdGVzdCBpcworICogYWxtb3N0IGVxdWl2YWxlbnQgdG8gdGVzdF9mb3JjZWQuICovCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ZvcmNlZF9hZnRlcl9kYXRhKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmdhbmFseXNpcyAoKTsKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisgIGdpbnQgYWNjdW11bGF0b3IgPSAwOworICBnaW50IGk7CisKKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAiZm9yY2VkIiwgRkFMU0UsIE5VTEwpOworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisKKyAgc2VuZF9zdHJlYW1fc3RhcnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoRjMyKSwgODAwMCwgMik7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIGZvciAoaSA9IDIwOyBpLS07KQorICAgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9mbG9hdF9zdGVyZW8gKDgwMDAsIDUxMiwgMC41LCAwLjUpKTsKKworICB0YWdfbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ19saXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgIEdTVF9UQUdfVFJBQ0tfUEVBSywgMS4wLCBHU1RfVEFHX1RSQUNLX0dBSU4sIDIuMjEsIE5VTEwpOworICBzZW5kX3RhZ19ldmVudCAoZWxlbWVudCwgdGFnX2xpc3QpOworCisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKworICAvKiBTYW1lIHZhbHVlcyBhcyBhYm92ZSAqLworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19nYWluICh0YWdfbGlzdCwgMi4yMSk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAxLjApOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIC8qIE5vdyBiYWNrIHRvIGEgbm9ybWFsIHRyYWNrLCB0aGlzIG9uZSBoYXMgbm8gdGFnczogKi8KKyAgZm9yIChpID0gMjA7IGktLTspCisgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX3NxdWFyZV9mbG9hdF9zdGVyZW8gKCZhY2N1bXVsYXRvciwgODAwMCwgNTEyLCAwLjI1LAorICAgICAgICAgICAgMC4yNSkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjI1KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfZ2FpbiAodGFnX2xpc3QsIGdldF9leHBlY3RlZF9nYWluICg4MDAwKSk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIGNsZWFudXBfcmdhbmFseXNpcyAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogTGlrZSB0ZXN0X2ZvcmNlZCwgYnV0ICphbmFseXplKiBhbiBhbGJ1bSBhZnRlcndhcmRzLiAgVGhlIHR3byB0ZXN0cyBmb2xsb3dpbmcKKyAqIHRoaXMgb25lIGNoZWNrIHRoZSAqc2tpcHBpbmcqIG9mIGFsYnVtcy4gKi8KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZm9yY2VkX2FsYnVtKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmdhbmFseXNpcyAoKTsKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisgIGdpbnQgYWNjdW11bGF0b3I7CisgIGdpbnQgaTsKKworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJmb3JjZWQiLCBGQUxTRSwgTlVMTCk7CisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKworICBzZW5kX3N0cmVhbV9zdGFydF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChGMzIpLCA0NDEwMCwgMik7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgLyogUHJvdmlkZWQgdmFsdWVzIGFyZSB0b3RhbGx5IGFyYml0cmFyeS4gKi8KKyAgZ3N0X3RhZ19saXN0X2FkZCAodGFnX2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAorICAgICAgR1NUX1RBR19UUkFDS19QRUFLLCAxLjAsIEdTVF9UQUdfVFJBQ0tfR0FJTiwgMi4yMSwgTlVMTCk7CisgIHNlbmRfdGFnX2V2ZW50IChlbGVtZW50LCB0YWdfbGlzdCk7CisKKyAgYWNjdW11bGF0b3IgPSAwOworICBmb3IgKGkgPSAyMDsgaS0tOykKKyAgICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfc3F1YXJlX2Zsb2F0X3N0ZXJlbyAoJmFjY3VtdWxhdG9yLCA0NDEwMCwgNTEyLAorICAgICAgICAgICAgMC41LCAwLjUpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworCisgIC8qIFNhbWUgdmFsdWVzIGFzIGFib3ZlICovCisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKHRhZ19saXN0LCAyLjIxKTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDEuMCk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIC8qIE5vdyBhbiBhbGJ1bSB3aXRob3V0IHRhZ3MuICovCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgIm51bS10cmFja3MiLCAyLCBOVUxMKTsKKworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIGFjY3VtdWxhdG9yID0gMDsKKyAgZm9yIChpID0gMjA7IGktLTspCisgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX3NxdWFyZV9mbG9hdF9zdGVyZW8gKCZhY2N1bXVsYXRvciwgNDQxMDAsIDUxMiwKKyAgICAgICAgICAgIDAuMjUsIDAuMjUpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC4yNSk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKHRhZ19saXN0LCBnZXRfZXhwZWN0ZWRfZ2FpbiAoNDQxMDApKTsKKyAgZmFpbF9pZl9hbGJ1bV90YWdzICh0YWdfbGlzdCk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworICBmYWlsX3VubGVzc19udW1fdHJhY2tzIChlbGVtZW50LCAxKTsKKworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIGFjY3VtdWxhdG9yID0gMDsKKyAgZm9yIChpID0gMjA7IGktLTspCisgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX3NxdWFyZV9mbG9hdF9zdGVyZW8gKCZhY2N1bXVsYXRvciwgNDQxMDAsIDUxMiwKKyAgICAgICAgICAgIDAuMjUsIDAuMjUpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC4yNSk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKHRhZ19saXN0LCBnZXRfZXhwZWN0ZWRfZ2FpbiAoNDQxMDApKTsKKyAgZmFpbF91bmxlc3NfYWxidW1fcGVhayAodGFnX2xpc3QsIDAuMjUpOworICBmYWlsX3VubGVzc19hbGJ1bV9nYWluICh0YWdfbGlzdCwgZ2V0X2V4cGVjdGVkX2dhaW4gKDQ0MTAwKSk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworICBmYWlsX3VubGVzc19udW1fdHJhY2tzIChlbGVtZW50LCAwKTsKKworICBjbGVhbnVwX3JnYW5hbHlzaXMgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ZvcmNlZF9hbGJ1bV9za2lwKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmdhbmFseXNpcyAoKTsKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisgIGdpbnQgYWNjdW11bGF0b3IgPSAwOworICBnaW50IGk7CisKKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAiZm9yY2VkIiwgRkFMU0UsICJudW0tdHJhY2tzIiwgMiwgTlVMTCk7CisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKworICBzZW5kX3N0cmVhbV9zdGFydF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChGMzIpLCA4MDAwLCAyKTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAvKiBQcm92aWRlZCB2YWx1ZXMgYXJlIHRvdGFsbHkgYXJiaXRyYXJ5LiAqLworICBnc3RfdGFnX2xpc3RfYWRkICh0YWdfbGlzdCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsCisgICAgICBHU1RfVEFHX1RSQUNLX1BFQUssIDAuNzUsIEdTVF9UQUdfVFJBQ0tfR0FJTiwgMi4yMSwKKyAgICAgIEdTVF9UQUdfQUxCVU1fUEVBSywgMC44MCwgR1NUX1RBR19BTEJVTV9HQUlOLCAtMC4xMSwgTlVMTCk7CisgIHNlbmRfdGFnX2V2ZW50IChlbGVtZW50LCB0YWdfbGlzdCk7CisKKyAgZm9yIChpID0gMjA7IGktLTspCisgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX3NxdWFyZV9mbG9hdF9zdGVyZW8gKCZhY2N1bXVsYXRvciwgODAwMCwgNTEyLCAwLjI1LAorICAgICAgICAgICAgMC4yNSkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisKKyAgLyogU2FtZSB2YWx1ZXMgYXMgYWJvdmUgKi8KKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfZ2FpbiAodGFnX2xpc3QsIDIuMjEpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC43NSk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIGZhaWxfdW5sZXNzX251bV90cmFja3MgKGVsZW1lbnQsIDEpOworCisgIC8qIFRoaXMgdHJhY2sgaGFzIG5vIHRhZ3MsIGJ1dCBuZWVkcyB0byBiZSBza2lwcGVkIGFueXdheXMgc2luY2Ugd2UKKyAgICogYXJlIGluIGFsYnVtIHByb2Nlc3NpbmcgbW9kZS4gKi8KKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBmb3IgKGkgPSAyMDsgaS0tOykKKyAgICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfc3RlcmVvICg4MDAwLCA1MTIsIDAuMCwgMC4wKSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgcG9sbF9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc19udW1fdHJhY2tzIChlbGVtZW50LCAwKTsKKworICAvKiBOb3JtYWwgdHJhY2sgYWZ0ZXIgdGhlIGFsYnVtLiAgT2YgY291cnNlIG5vdCB0byBiZSBza2lwcGVkLiAqLworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIGFjY3VtdWxhdG9yID0gMDsKKyAgZm9yIChpID0gMjA7IGktLTspCisgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX3NxdWFyZV9mbG9hdF9zdGVyZW8gKCZhY2N1bXVsYXRvciwgODAwMCwgNTEyLCAwLjI1LAorICAgICAgICAgICAgMC4yNSkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjI1KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfZ2FpbiAodGFnX2xpc3QsIGdldF9leHBlY3RlZF9nYWluICg4MDAwKSk7CisgIGZhaWxfaWZfYWxidW1fdGFncyAodGFnX2xpc3QpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICBjbGVhbnVwX3JnYW5hbHlzaXMgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ZvcmNlZF9hbGJ1bV9ub19za2lwKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmdhbmFseXNpcyAoKTsKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisgIGdpbnQgYWNjdW11bGF0b3IgPSAwOworICBnaW50IGk7CisKKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAiZm9yY2VkIiwgRkFMU0UsICJudW0tdHJhY2tzIiwgMiwgTlVMTCk7CisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKworICBzZW5kX3N0cmVhbV9zdGFydF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChGMzIpLCA4MDAwLCAyKTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgZm9yIChpID0gMjA7IGktLTspCisgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX3NxdWFyZV9mbG9hdF9zdGVyZW8gKCZhY2N1bXVsYXRvciwgODAwMCwgNTEyLCAwLjI1LAorICAgICAgICAgICAgMC4yNSkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjI1KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfZ2FpbiAodGFnX2xpc3QsIGdldF9leHBlY3RlZF9nYWluICg4MDAwKSk7CisgIGZhaWxfaWZfYWxidW1fdGFncyAodGFnX2xpc3QpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKyAgZmFpbF91bmxlc3NfbnVtX3RyYWNrcyAoZWxlbWVudCwgMSk7CisKKyAgLyogVGhlIHNlY29uZCB0cmFjayBoYXMgaW5kZWVkIGZ1bGwgdGFncywgYnV0IGFsdGhvdWdoIGJlaW5nIG5vdCBmb3JjZWQsIHRoaXMKKyAgICogb25lIGhhcyB0byBiZSBwcm9jZXNzZWQgYmVjYXVzZSBhbGJ1bSBwcm9jZXNzaW5nIGlzIG9uLiAqLworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgLyogUHJvdmlkZWQgdmFsdWVzIGFyZSB0b3RhbGx5IGFyYml0cmFyeS4gKi8KKyAgZ3N0X3RhZ19saXN0X2FkZCAodGFnX2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAorICAgICAgR1NUX1RBR19UUkFDS19QRUFLLCAwLjc1LCBHU1RfVEFHX1RSQUNLX0dBSU4sIDIuMjEsCisgICAgICBHU1RfVEFHX0FMQlVNX1BFQUssIDAuODAsIEdTVF9UQUdfQUxCVU1fR0FJTiwgLTAuMTEsIE5VTEwpOworICBzZW5kX3RhZ19ldmVudCAoZWxlbWVudCwgdGFnX2xpc3QpOworICBmb3IgKGkgPSAyMDsgaS0tOykKKyAgICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfc3RlcmVvICg4MDAwLCA1MTIsIDAuMCwgMC4wKSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKworICAvKiB0aGUgZmlyc3QgYmF0Y2ggZnJvbSB0aGUgdGFncyAqLworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19vbmx5IChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuNzUpOworICBmYWlsX3VubGVzc190cmFja19nYWluICh0YWdfbGlzdCwgMi4yMSk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIC8qIHRoZSBzZWNvbmQgZnJvbSB0aGUgcHJvY2Vzc2luZyAqLworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC4wKTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfZ2FpbiAodGFnX2xpc3QsIFNJTEVOQ0VfR0FJTik7CisgIC8qIFNlY29uZCB0cmFjayB3YXMganVzdCBzaWxlbmNlIHNvIHRoZSBhbGJ1bSBwZWFrIGVxdWFscyB0aGUgZmlyc3QKKyAgICogdHJhY2sncyBwZWFrLiAqLworICBmYWlsX3VubGVzc19hbGJ1bV9wZWFrICh0YWdfbGlzdCwgMC4yNSk7CisgIC8qIFN0YXRpc3RpY2FsIHByb2Nlc3NpbmcgbGVhZHMgdG8gdGhlIHNlY29uZCB0cmFjayBiZWluZworICAgKiBpZ25vcmVkIGZvciB0aGUgZ2FpbiAoYmVjYXVzZSBpdCBpcyBzbyBzaG9ydCk6ICovCisgIGZhaWxfdW5sZXNzX2FsYnVtX2dhaW4gKHRhZ19saXN0LCBnZXRfZXhwZWN0ZWRfZ2FpbiAoODAwMCkpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKyAgZmFpbF91bmxlc3NfbnVtX3RyYWNrcyAoZWxlbWVudCwgMCk7CisKKyAgY2xlYW51cF9yZ2FuYWx5c2lzIChlbGVtZW50KTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mb3JjZWRfYWJvcnRfYWxidW1fbm9fc2tpcCkKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3JnYW5hbHlzaXMgKCk7CisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OworICBnaW50IGFjY3VtdWxhdG9yID0gMDsKKyAgZ2ludCBpOworCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgImZvcmNlZCIsIEZBTFNFLCAibnVtLXRyYWNrcyIsIDIsIE5VTEwpOworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisKKyAgc2VuZF9zdHJlYW1fc3RhcnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoRjMyKSwgODAwMCwgMik7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIGZvciAoaSA9IDIwOyBpLS07KQorICAgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9zcXVhcmVfZmxvYXRfc3RlcmVvICgmYWNjdW11bGF0b3IsIDgwMDAsIDUxMiwgMC4yNSwKKyAgICAgICAgICAgIDAuMjUpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC4yNSk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKHRhZ19saXN0LCBnZXRfZXhwZWN0ZWRfZ2FpbiAoODAwMCkpOworICBmYWlsX2lmX2FsYnVtX3RhZ3MgKHRhZ19saXN0KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisgIGZhaWxfdW5sZXNzX251bV90cmFja3MgKGVsZW1lbnQsIDEpOworCisgIC8qIERpc2FibGluZyBhbGJ1bSBwcm9jZXNzaW5nIGJlZm9yZSBlbmQgb2YgYWxidW06ICovCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgIm51bS10cmFja3MiLCAwLCBOVUxMKTsKKworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisKKyAgLyogUHJvY2Vzc2luZyBhIHRyYWNrIHRoYXQgaGFzIHRvIGJlIHNraXBwZWQuICovCisgIHRhZ19saXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgLyogUHJvdmlkZWQgdmFsdWVzIGFyZSB0b3RhbGx5IGFyYml0cmFyeS4gKi8KKyAgZ3N0X3RhZ19saXN0X2FkZCAodGFnX2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAorICAgICAgR1NUX1RBR19UUkFDS19QRUFLLCAwLjc1LCBHU1RfVEFHX1RSQUNLX0dBSU4sIDIuMjEsCisgICAgICBHU1RfVEFHX0FMQlVNX1BFQUssIDAuODAsIEdTVF9UQUdfQUxCVU1fR0FJTiwgLTAuMTEsIE5VTEwpOworICBzZW5kX3RhZ19ldmVudCAoZWxlbWVudCwgdGFnX2xpc3QpOworICBmb3IgKGkgPSAyMDsgaS0tOykKKyAgICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfc3RlcmVvICg4MDAwLCA1MTIsIDAuMCwgMC4wKSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC43NSk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKHRhZ19saXN0LCAyLjIxKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgY2xlYW51cF9yZ2FuYWx5c2lzIChlbGVtZW50KTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9yZWZlcmVuY2VfbGV2ZWwpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ2FuYWx5c2lzICgpOworICBHc3RUYWdMaXN0ICp0YWdfbGlzdDsKKyAgZ2RvdWJsZSByZWZfbGV2ZWw7CisgIGdpbnQgYWNjdW11bGF0b3IgPSAwOworICBnaW50IGk7CisKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOworCisgIHNlbmRfc3RyZWFtX3N0YXJ0X2V2ZW50IChlbGVtZW50KTsKKyAgc2VuZF9jYXBzX2V2ZW50IChHU1RfQVVESU9fTkUgKEYzMiksIDQ0MTAwLCAyKTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgZm9yIChpID0gMjA7IGktLTspCisgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX3NxdWFyZV9mbG9hdF9zdGVyZW8gKCZhY2N1bXVsYXRvciwgNDQxMDAsIDUxMiwKKyAgICAgICAgICAgIDAuMjUsIDAuMjUpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC4yNSk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKHRhZ19saXN0LCBnZXRfZXhwZWN0ZWRfZ2FpbiAoNDQxMDApKTsKKyAgZmFpbF9pZl9hbGJ1bV90YWdzICh0YWdfbGlzdCk7CisgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZSAodGFnX2xpc3QsIEdTVF9UQUdfUkVGRVJFTkNFX0xFVkVMLAorICAgICAgICAgICZyZWZfbGV2ZWwpICYmIE1BVENIX0dBSU4gKHJlZl9sZXZlbCwgODkuKSwKKyAgICAgICJJbmNvcnJlY3QgcmVmZXJlbmNlIGxldmVsIHRhZyIpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJyZWZlcmVuY2UtbGV2ZWwiLCA4My4sICJudW0tdHJhY2tzIiwgMiwgTlVMTCk7CisKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBmb3IgKGkgPSAyMDsgaS0tOykKKyAgICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfc3F1YXJlX2Zsb2F0X3N0ZXJlbyAoJmFjY3VtdWxhdG9yLCA0NDEwMCwgNTEyLAorICAgICAgICAgICAgMC4yNSwgMC4yNSkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjI1KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfZ2FpbiAodGFnX2xpc3QsIGdldF9leHBlY3RlZF9nYWluICg0NDEwMCkgLSA2Lik7CisgIGZhaWxfaWZfYWxidW1fdGFncyAodGFnX2xpc3QpOworICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKHRhZ19saXN0LCBHU1RfVEFHX1JFRkVSRU5DRV9MRVZFTCwKKyAgICAgICAgICAmcmVmX2xldmVsKSAmJiBNQVRDSF9HQUlOIChyZWZfbGV2ZWwsIDgzLiksCisgICAgICAiSW5jb3JyZWN0IHJlZmVyZW5jZSBsZXZlbCB0YWciKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBhY2N1bXVsYXRvciA9IDA7CisgIGZvciAoaSA9IDIwOyBpLS07KQorICAgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9zcXVhcmVfZmxvYXRfc3RlcmVvICgmYWNjdW11bGF0b3IsIDQ0MTAwLCA1MTIsCisgICAgICAgICAgICAwLjI1LCAwLjI1KSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuMjUpOworICBmYWlsX3VubGVzc190cmFja19nYWluICh0YWdfbGlzdCwgZ2V0X2V4cGVjdGVkX2dhaW4gKDQ0MTAwKSAtIDYuKTsKKyAgZmFpbF91bmxlc3NfYWxidW1fcGVhayAodGFnX2xpc3QsIDAuMjUpOworICAvKiBXZSBwcm92aWRlZCB0aGUgc2FtZSB3YXZlZm9ybSB0d2ljZSwgd2l0aCBhIHJlc2V0IHNlcGFyYXRpbmcKKyAgICogdGhlbS4gIFRoZXJlZm9yZSwgdGhlIGFsYnVtIGdhaW4gbWF0Y2hlcyB0aGUgdHJhY2sgZ2Fpbi4gKi8KKyAgZmFpbF91bmxlc3NfYWxidW1fZ2FpbiAodGFnX2xpc3QsIGdldF9leHBlY3RlZF9nYWluICg0NDEwMCkgLSA2Lik7CisgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZSAodGFnX2xpc3QsIEdTVF9UQUdfUkVGRVJFTkNFX0xFVkVMLAorICAgICAgICAgICZyZWZfbGV2ZWwpICYmIE1BVENIX0dBSU4gKHJlZl9sZXZlbCwgODMuKSwKKyAgICAgICJJbmNvcnJlY3QgcmVmZXJlbmNlIGxldmVsIHRhZyIpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICBjbGVhbnVwX3JnYW5hbHlzaXMgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2FsbF9mb3JtYXRzKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmdhbmFseXNpcyAoKTsKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisgIGdpbnQgYWNjdW11bGF0b3IgPSAwOworICBnaW50IGksIGo7CisKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOworICBzZW5kX3N0cmVhbV9zdGFydF9ldmVudCAoZWxlbWVudCk7CisgIGZvciAoaSA9IEdfTl9FTEVNRU5UUyAoc3VwcG9ydGVkX3JhdGVzKTsgaS0tOykgeworICAgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoRjMyKSwgc3VwcG9ydGVkX3JhdGVzW2ldLnNhbXBsZV9yYXRlLCAyKTsKKyAgICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICAgIGFjY3VtdWxhdG9yID0gMDsKKyAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX3NxdWFyZV9mbG9hdF9zdGVyZW8gKCZhY2N1bXVsYXRvciwKKyAgICAgICAgICAgICAgc3VwcG9ydGVkX3JhdGVzW2ldLnNhbXBsZV9yYXRlLCA1MTIsIDAuMjUsIDAuMjUpKTsKKyAgICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoRjMyKSwgc3VwcG9ydGVkX3JhdGVzW2ldLnNhbXBsZV9yYXRlLCAxKTsKKyAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQorICAgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX3NxdWFyZV9mbG9hdF9tb25vICgmYWNjdW11bGF0b3IsCisgICAgICAgICAgICAgIHN1cHBvcnRlZF9yYXRlc1tpXS5zYW1wbGVfcmF0ZSwgNTEyLCAwLjI1KSk7CisgICAgc2VuZF9jYXBzX2V2ZW50IChHU1RfQVVESU9fTkUgKFMxNiksIHN1cHBvcnRlZF9yYXRlc1tpXS5zYW1wbGVfcmF0ZSwgMik7CisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9zcXVhcmVfaW50MTZfc3RlcmVvICgmYWNjdW11bGF0b3IsCisgICAgICAgICAgICAgIHN1cHBvcnRlZF9yYXRlc1tpXS5zYW1wbGVfcmF0ZSwgMTYsIDUxMiwgMSA8PCAxMywgMSA8PCAxMykpOworICAgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChTMTYpLCBzdXBwb3J0ZWRfcmF0ZXNbaV0uc2FtcGxlX3JhdGUsIDEpOworICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspCisgICAgICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfc3F1YXJlX2ludDE2X21vbm8gKCZhY2N1bXVsYXRvciwKKyAgICAgICAgICAgICAgc3VwcG9ydGVkX3JhdGVzW2ldLnNhbXBsZV9yYXRlLCAxNiwgNTEyLCAxIDw8IDEzKSk7CisgICAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICAgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgICAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuMjUpOworICAgIGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKHRhZ19saXN0LCBzdXBwb3J0ZWRfcmF0ZXNbaV0uZ2Fpbik7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisgIH0KKworICBjbGVhbnVwX3JnYW5hbHlzaXMgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIENoZWNrcyBlbnN1cmluZyBhbGwgYWR2ZXJ0aXNlZCBzdXBwb3J0ZWQgc2FtcGxlIHJhdGVzIGFyZSByZWFsbHkKKyAqIGFjY2VwdGVkLCBmb3IgaW50ZWdlciBhbmQgZmxvYXQsIG1vbm8gYW5kIHN0ZXJlby4gIFRoaXMgYWxzbworICogdmVyaWZpZXMgdGhhdCB0aGUgY29ycmVjdCBnYWluIGlzIGNvbXB1dGVkIGZvciBhbGwgZm9ybWF0cyAoZXhjZXB0CisgKiBvZGQgYml0IGRlcHRocykuICovCisKKyNkZWZpbmUgTUFLRV9HQUlOX1RFU1RfRkxPQVRfTU9OTyhzYW1wbGVfcmF0ZSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdTVF9TVEFSVF9URVNUICh0ZXN0X2dhaW5fZmxvYXRfbW9ub18jI3NhbXBsZV9yYXRlKSAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3JnYW5hbHlzaXMgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnaW50IGFjY3VtdWxhdG9yID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ2ludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2VuZF9zdHJlYW1fc3RhcnRfZXZlbnQgKGVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChGMzIpLCBzYW1wbGVfcmF0ZSwgMSk7ICAgICAgICAgICAgICAgXAorICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9zcXVhcmVfZmxvYXRfbW9ubyAoJmFjY3VtdWxhdG9yLCAgICAgICAgIFwKKyAgICAgICAgICAgIHNhbXBsZV9yYXRlLCA1MTIsIDAuMjUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjI1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmYWlsX3VubGVzc190cmFja19nYWluICh0YWdfbGlzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGdldF9leHBlY3RlZF9nYWluIChzYW1wbGVfcmF0ZSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsZWFudXBfcmdhbmFseXNpcyAoZWxlbWVudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitHU1RfRU5EX1RFU1Q7CisKKyNkZWZpbmUgTUFLRV9HQUlOX1RFU1RfRkxPQVRfU1RFUkVPKHNhbXBsZV9yYXRlKSAgICAgICAgICAgICAgICAgICAgICBcCisgIEdTVF9TVEFSVF9URVNUICh0ZXN0X2dhaW5fZmxvYXRfc3RlcmVvXyMjc2FtcGxlX3JhdGUpICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3JnYW5hbHlzaXMgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnaW50IGFjY3VtdWxhdG9yID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ2ludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2VuZF9zdHJlYW1fc3RhcnRfZXZlbnQgKGVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChGMzIpLCBzYW1wbGVfcmF0ZSwgMik7ICAgICAgICAgICAgICAgXAorICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9zcXVhcmVfZmxvYXRfc3RlcmVvICgmYWNjdW11bGF0b3IsICAgICAgIFwKKyAgICAgICAgICAgIHNhbXBsZV9yYXRlLCA1MTIsIDAuMjUsIDAuMjUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjI1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmYWlsX3VubGVzc190cmFja19nYWluICh0YWdfbGlzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGdldF9leHBlY3RlZF9nYWluIChzYW1wbGVfcmF0ZSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsZWFudXBfcmdhbmFseXNpcyAoZWxlbWVudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitHU1RfRU5EX1RFU1Q7CisKKyNkZWZpbmUgTUFLRV9HQUlOX1RFU1RfSU5UMTZfTU9OTyhzYW1wbGVfcmF0ZSwgZGVwdGgpICAgICAgICAgICAgICAgICBcCisgIEdTVF9TVEFSVF9URVNUICh0ZXN0X2dhaW5faW50MTZfIyNkZXB0aCMjX21vbm9fIyNzYW1wbGVfcmF0ZSkgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3JnYW5hbHlzaXMgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnaW50IGFjY3VtdWxhdG9yID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ2ludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2VuZF9zdHJlYW1fc3RhcnRfZXZlbnQgKGVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChTMTYpLCBzYW1wbGVfcmF0ZSwgMSk7ICAgICAgICAgICAgICAgXAorICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9zcXVhcmVfaW50MTZfbW9ubyAoJmFjY3VtdWxhdG9yLCAgICAgICAgIFwKKyAgICAgICAgICAgIHNhbXBsZV9yYXRlLCBkZXB0aCwgNTEyLCAxIDw8ICgxMyArIGRlcHRoIC0gMTYpKSk7ICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC4yNSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZmFpbF91bmxlc3NfdHJhY2tfZ2FpbiAodGFnX2xpc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBnZXRfZXhwZWN0ZWRfZ2FpbiAoc2FtcGxlX3JhdGUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjbGVhbnVwX3JnYW5hbHlzaXMgKGVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorR1NUX0VORF9URVNUOworCisjZGVmaW5lIE1BS0VfR0FJTl9URVNUX0lOVDE2X1NURVJFTyhzYW1wbGVfcmF0ZSwgZGVwdGgpICAgICAgICAgICAgICAgXAorICBHU1RfU1RBUlRfVEVTVCAodGVzdF9nYWluX2ludDE2XyMjZGVwdGgjI19zdGVyZW9fIyNzYW1wbGVfcmF0ZSkgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ2FuYWx5c2lzICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHc3RUYWdMaXN0ICp0YWdfbGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ2ludCBhY2N1bXVsYXRvciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNlbmRfc3RyZWFtX3N0YXJ0X2V2ZW50IChlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoUzE2KSwgc2FtcGxlX3JhdGUsIDIpOyAgICAgICAgICAgICAgIFwKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfc3F1YXJlX2ludDE2X3N0ZXJlbyAoJmFjY3VtdWxhdG9yLCAgICAgICBcCisgICAgICAgICAgICBzYW1wbGVfcmF0ZSwgZGVwdGgsIDUxMiwgMSA8PCAoMTMgKyBkZXB0aCAtIDE2KSwgICAgICAgICAgXAorICAgICAgICAgICAgMSA8PCAoMTMgKyBkZXB0aCAtIDE2KSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuMjUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKHRhZ19saXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZ2V0X2V4cGVjdGVkX2dhaW4gKHNhbXBsZV9yYXRlKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2xlYW51cF9yZ2FuYWx5c2lzIChlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0dTVF9FTkRfVEVTVDsKKworTUFLRV9HQUlOX1RFU1RfRkxPQVRfTU9OTyAoODAwMCk7CitNQUtFX0dBSU5fVEVTVF9GTE9BVF9NT05PICgxMTAyNSk7CitNQUtFX0dBSU5fVEVTVF9GTE9BVF9NT05PICgxMjAwMCk7CitNQUtFX0dBSU5fVEVTVF9GTE9BVF9NT05PICgxNjAwMCk7CitNQUtFX0dBSU5fVEVTVF9GTE9BVF9NT05PICgyMjA1MCk7CitNQUtFX0dBSU5fVEVTVF9GTE9BVF9NT05PICgyNDAwMCk7CitNQUtFX0dBSU5fVEVTVF9GTE9BVF9NT05PICgzMjAwMCk7CitNQUtFX0dBSU5fVEVTVF9GTE9BVF9NT05PICg0NDEwMCk7CitNQUtFX0dBSU5fVEVTVF9GTE9BVF9NT05PICg0ODAwMCk7CisKK01BS0VfR0FJTl9URVNUX0ZMT0FUX1NURVJFTyAoODAwMCk7CitNQUtFX0dBSU5fVEVTVF9GTE9BVF9TVEVSRU8gKDExMDI1KTsKK01BS0VfR0FJTl9URVNUX0ZMT0FUX1NURVJFTyAoMTIwMDApOworTUFLRV9HQUlOX1RFU1RfRkxPQVRfU1RFUkVPICgxNjAwMCk7CitNQUtFX0dBSU5fVEVTVF9GTE9BVF9TVEVSRU8gKDIyMDUwKTsKK01BS0VfR0FJTl9URVNUX0ZMT0FUX1NURVJFTyAoMjQwMDApOworTUFLRV9HQUlOX1RFU1RfRkxPQVRfU1RFUkVPICgzMjAwMCk7CitNQUtFX0dBSU5fVEVTVF9GTE9BVF9TVEVSRU8gKDQ0MTAwKTsKK01BS0VfR0FJTl9URVNUX0ZMT0FUX1NURVJFTyAoNDgwMDApOworCitNQUtFX0dBSU5fVEVTVF9JTlQxNl9NT05PICg4MDAwLCAxNik7CitNQUtFX0dBSU5fVEVTVF9JTlQxNl9NT05PICgxMTAyNSwgMTYpOworTUFLRV9HQUlOX1RFU1RfSU5UMTZfTU9OTyAoMTIwMDAsIDE2KTsKK01BS0VfR0FJTl9URVNUX0lOVDE2X01PTk8gKDE2MDAwLCAxNik7CitNQUtFX0dBSU5fVEVTVF9JTlQxNl9NT05PICgyMjA1MCwgMTYpOworTUFLRV9HQUlOX1RFU1RfSU5UMTZfTU9OTyAoMjQwMDAsIDE2KTsKK01BS0VfR0FJTl9URVNUX0lOVDE2X01PTk8gKDMyMDAwLCAxNik7CitNQUtFX0dBSU5fVEVTVF9JTlQxNl9NT05PICg0NDEwMCwgMTYpOworTUFLRV9HQUlOX1RFU1RfSU5UMTZfTU9OTyAoNDgwMDAsIDE2KTsKKworTUFLRV9HQUlOX1RFU1RfSU5UMTZfU1RFUkVPICg4MDAwLCAxNik7CitNQUtFX0dBSU5fVEVTVF9JTlQxNl9TVEVSRU8gKDExMDI1LCAxNik7CitNQUtFX0dBSU5fVEVTVF9JTlQxNl9TVEVSRU8gKDEyMDAwLCAxNik7CitNQUtFX0dBSU5fVEVTVF9JTlQxNl9TVEVSRU8gKDE2MDAwLCAxNik7CitNQUtFX0dBSU5fVEVTVF9JTlQxNl9TVEVSRU8gKDIyMDUwLCAxNik7CitNQUtFX0dBSU5fVEVTVF9JTlQxNl9TVEVSRU8gKDI0MDAwLCAxNik7CitNQUtFX0dBSU5fVEVTVF9JTlQxNl9TVEVSRU8gKDMyMDAwLCAxNik7CitNQUtFX0dBSU5fVEVTVF9JTlQxNl9TVEVSRU8gKDQ0MTAwLCAxNik7CitNQUtFX0dBSU5fVEVTVF9JTlQxNl9TVEVSRU8gKDQ4MDAwLCAxNik7CisKK3N0YXRpYyBTdWl0ZSAqCityZ2FuYWx5c2lzX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoInJnYW5hbHlzaXMiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ub19idWZmZXIpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfbm9fYnVmZmVyX2FsYnVtXzEpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfbm9fYnVmZmVyX2FsYnVtXzIpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZW1wdHlfYnVmZmVycyk7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BlYWtfZmxvYXQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGVha19pbnQxNl8xNik7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BlYWtfYWxidW0pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGVha190cmFja19hbGJ1bSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wZWFrX2FsYnVtX2Fib3J0X3RvX3RyYWNrKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9hbGJ1bSk7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ZvcmNlZCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9mb3JjZWRfc2VwYXJhdGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZm9yY2VkX2FmdGVyX2RhdGEpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZm9yY2VkX2FsYnVtKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ZvcmNlZF9hbGJ1bV9za2lwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ZvcmNlZF9hbGJ1bV9ub19za2lwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ZvcmNlZF9hYm9ydF9hbGJ1bV9ub19za2lwKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcmVmZXJlbmNlX2xldmVsKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYWxsX2Zvcm1hdHMpOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2Zsb2F0X21vbm9fODAwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2Zsb2F0X21vbm9fMTEwMjUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9mbG9hdF9tb25vXzEyMDAwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhaW5fZmxvYXRfbW9ub18xNjAwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2Zsb2F0X21vbm9fMjIwNTApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9mbG9hdF9tb25vXzI0MDAwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhaW5fZmxvYXRfbW9ub18zMjAwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2Zsb2F0X21vbm9fNDQxMDApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9mbG9hdF9tb25vXzQ4MDAwKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9mbG9hdF9zdGVyZW9fODAwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2Zsb2F0X3N0ZXJlb18xMTAyNSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2Zsb2F0X3N0ZXJlb18xMjAwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2Zsb2F0X3N0ZXJlb18xNjAwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2Zsb2F0X3N0ZXJlb18yMjA1MCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2Zsb2F0X3N0ZXJlb18yNDAwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2Zsb2F0X3N0ZXJlb18zMjAwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2Zsb2F0X3N0ZXJlb180NDEwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2Zsb2F0X3N0ZXJlb180ODAwMCk7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhaW5faW50MTZfMTZfbW9ub184MDAwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhaW5faW50MTZfMTZfbW9ub18xMTAyNSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2ludDE2XzE2X21vbm9fMTIwMDApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9pbnQxNl8xNl9tb25vXzE2MDAwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhaW5faW50MTZfMTZfbW9ub18yMjA1MCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2ludDE2XzE2X21vbm9fMjQwMDApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9pbnQxNl8xNl9tb25vXzMyMDAwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhaW5faW50MTZfMTZfbW9ub180NDEwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2ludDE2XzE2X21vbm9fNDgwMDApOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2ludDE2XzE2X3N0ZXJlb184MDAwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhaW5faW50MTZfMTZfc3RlcmVvXzExMDI1KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhaW5faW50MTZfMTZfc3RlcmVvXzEyMDAwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhaW5faW50MTZfMTZfc3RlcmVvXzE2MDAwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhaW5faW50MTZfMTZfc3RlcmVvXzIyMDUwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhaW5faW50MTZfMTZfc3RlcmVvXzI0MDAwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhaW5faW50MTZfMTZfc3RlcmVvXzMyMDAwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhaW5faW50MTZfMTZfc3RlcmVvXzQ0MTAwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhaW5faW50MTZfMTZfc3RlcmVvXzQ4MDAwKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHJnYW5hbHlzaXMpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvcmdsaW1pdGVyLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2xpbWl0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmNlMjI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcmdsaW1pdGVyLmMKQEAgLTAsMCArMSwyNzUgQEAKKy8qIEdTdHJlYW1lciBSZXBsYXlHYWluIGxpbWl0ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVuZSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorICoKKyAqIHJnbGltaXRlci5jOiBVbml0IHRlc3QgZm9yIHRoZSByZ2xpbWl0ZXIgZWxlbWVudAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworLyogRm9yIGVhc2Ugb2YgcHJvZ3JhbW1pbmcgd2UgdXNlIGdsb2JhbHMgdG8ga2VlcCByZWZzIGZvciBvdXIgZmxvYXRpbmcKKyAqIHNyYyBhbmQgc2luayBwYWRzIHdlIGNyZWF0ZTsgb3RoZXJ3aXNlIHdlIGFsd2F5cyBoYXZlIHRvIGRvIGdldF9wYWQsCisgKiBnZXRfcGVlciwgYW5kIHRoZW4gcmVtb3ZlIHJlZmVyZW5jZXMgaW4gZXZlcnkgdGVzdCBmdW5jdGlvbiAqLworc3RhdGljIEdzdFBhZCAqbXlzcmNwYWQsICpteXNpbmtwYWQ7CisKKyNkZWZpbmUgUkdfTElNSVRFUl9DQVBTX1RFTVBMQVRFX1NUUklORyAgICAgICBcCisgICJhdWRpby94LXJhdywgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZm9ybWF0ID0gKHN0cmluZykgIkdTVF9BVURJT19ORSAoRjMyKSAiLCAiIFwKKyAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiICAgICAgICAgICBcCisgICJjaGFubmVscyA9IChpbnQpIFsgMSwgTUFYIF0sICIgICAgICAgICAgICAgXAorICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0iCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFJHX0xJTUlURVJfQ0FQU19URU1QTEFURV9TVFJJTkcpCisgICAgKTsKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFJHX0xJTUlURVJfQ0FQU19URU1QTEFURV9TVFJJTkcpCisgICAgKTsKKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfcmdsaW1pdGVyICh2b2lkKQoreworICBHc3RFbGVtZW50ICplbGVtZW50OworCisgIEdTVF9ERUJVRyAoInNldHVwX3JnbGltaXRlciIpOworICBlbGVtZW50ID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJyZ2xpbWl0ZXIiKTsKKyAgbXlzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAoZWxlbWVudCwgJnNyY3RlbXBsYXRlKTsKKyAgbXlzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChlbGVtZW50LCAmc2lua3RlbXBsYXRlKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICByZXR1cm4gZWxlbWVudDsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfcmdsaW1pdGVyIChHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgR1NUX0RFQlVHICgiY2xlYW51cF9yZ2xpbWl0ZXIiKTsKKworICBnX2xpc3RfZm9yZWFjaCAoYnVmZmVycywgKEdGdW5jKSBnc3RfbWluaV9vYmplY3RfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGdzdF9jaGVja190ZWFyZG93bl9zcmNfcGFkIChlbGVtZW50KTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChlbGVtZW50KTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGVsZW1lbnQpOworfQorCitzdGF0aWMgdm9pZAorc2V0X3BsYXlpbmdfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50KQoreworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiQ291bGQgbm90IHNldCBzdGF0ZSB0byBQTEFZSU5HIik7Cit9CisKK3N0YXRpYyBjb25zdCBnZmxvYXQgdGVzdF9pbnB1dFtdID0geworICAtMi4wLCAtMS4wLCAtMC43NSwgLTAuNSwgLTAuMjUsIDAuMCwgMC4yNSwgMC41LCAwLjc1LCAxLjAsIDIuMAorfTsKKworc3RhdGljIGNvbnN0IGdmbG9hdCB0ZXN0X291dHB1dFtdID0geworICAtMC45OTc1MjczNzY4NDMzNjUyMywgICAgICAgICAvKiAtMi4wICAqLworICAtMC44ODA3OTcwNzc5Nzc4ODI0MywgICAgICAgICAvKiAtMS4wICAqLworICAtMC43MzEwNTg1Nzg2MzAwMDQ5LCAgICAgICAgICAvKiAtMC43NSAqLworICAtMC41LCAtMC4yNSwgMC4wLCAwLjI1LCAwLjUsCisgIDAuNzMxMDU4NTc4NjMwMDA0OSwgICAgICAgICAgIC8qIDAuNzUgKi8KKyAgMC44ODA3OTcwNzc5Nzc4ODI0MywgICAgICAgICAgLyogMS4wICAqLworICAwLjk5NzUyNzM3Njg0MzM2NTIzLCAgICAgICAgICAvKiAyLjAgICovCit9OworCitzdGF0aWMgdm9pZAorc2V0dXBfZXZlbnRzIChHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcmF3IiwKKyAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgNDQxMDAsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDEsCisgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgR1NUX0FVRElPX05FIChGMzIpLAorICAgICAgImxheW91dCIsIEdfVFlQRV9TVFJJTkcsICJpbnRlcmxlYXZlZCIsIE5VTEwpOworCisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBlbGVtZW50LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorY3JlYXRlX3Rlc3RfYnVmZmVyICh2b2lkKQoreworICBHc3RCdWZmZXIgKmJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZW9mICh0ZXN0X2lucHV0KSk7CisKKyAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsIHRlc3RfaW5wdXQsIHNpemVvZiAodGVzdF9pbnB1dCkpOworCisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGJ1ZiwgImJ1ZiIsIDEpOworCisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyB2b2lkCit2ZXJpZnlfdGVzdF9idWZmZXIgKEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdmbG9hdCAqb3V0cHV0OworICBnaW50IGk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgb3V0cHV0ID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZmFpbF91bmxlc3MgKG1hcC5zaXplID09IHNpemVvZiAodGVzdF9vdXRwdXQpKTsKKworICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTICh0ZXN0X2lucHV0KTsgaSsrKQorICAgIGZhaWxfdW5sZXNzIChBQlMgKG91dHB1dFtpXSAtIHRlc3Rfb3V0cHV0W2ldKSA8IDEuZS02LAorICAgICAgICAiSW5jb3JyZWN0IG91dHB1dCB2YWx1ZSAlLjZmIGZvciBpbnB1dCAlLjJmLCBleHBlY3RlZCAlLjZmIiwKKyAgICAgICAgb3V0cHV0W2ldLCB0ZXN0X2lucHV0W2ldLCB0ZXN0X291dHB1dFtpXSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKK30KKworLyogU3RhcnQgb2YgdGVzdHMuICovCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X25vX2J1ZmZlcikKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3JnbGltaXRlciAoKTsKKworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisKKyAgY2xlYW51cF9yZ2xpbWl0ZXIgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2Rpc2FibGVkKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmdsaW1pdGVyICgpOworICBHc3RCdWZmZXIgKmJ1ZiwgKm91dF9idWY7CisKKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAiZW5hYmxlZCIsIEZBTFNFLCBOVUxMKTsKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOworICBzZXR1cF9ldmVudHMgKGVsZW1lbnQpOworCisgIGJ1ZiA9IGNyZWF0ZV90ZXN0X2J1ZmZlciAoKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGJ1ZikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPT0gMSk7CisgIG91dF9idWYgPSBidWZmZXJzLT5kYXRhOworICBmYWlsX2lmIChvdXRfYnVmID09IE5VTEwpOworICBidWZmZXJzID0gZ19saXN0X3JlbW92ZSAoYnVmZmVycywgb3V0X2J1Zik7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKG91dF9idWYsICJvdXRfYnVmIiwgMSk7CisgIGZhaWxfdW5sZXNzIChidWYgPT0gb3V0X2J1Zik7CisgIGdzdF9idWZmZXJfdW5yZWYgKG91dF9idWYpOworCisgIGNsZWFudXBfcmdsaW1pdGVyIChlbGVtZW50KTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9saW1pdGluZykKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3JnbGltaXRlciAoKTsKKyAgR3N0QnVmZmVyICpidWYsICpvdXRfYnVmOworCisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKyAgc2V0dXBfZXZlbnRzIChlbGVtZW50KTsKKworICAvKiBNdXRhYmxlIHZhcmlhbnQuICovCisgIGJ1ZiA9IGNyZWF0ZV90ZXN0X2J1ZmZlciAoKTsKKyAgR1NUX0RFQlVHICgicHVzaCBtdXRhYmxlIGJ1ZmZlciIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgYnVmKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA9PSAxKTsKKyAgb3V0X2J1ZiA9IGJ1ZmZlcnMtPmRhdGE7CisgIGZhaWxfaWYgKG91dF9idWYgPT0gTlVMTCk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKG91dF9idWYsICJvdXRfYnVmIiwgMSk7CisgIHZlcmlmeV90ZXN0X2J1ZmZlciAob3V0X2J1Zik7CisKKyAgLyogSW1tdXRhYmxlIHZhcmlhbnQuICovCisgIGJ1ZiA9IGNyZWF0ZV90ZXN0X2J1ZmZlciAoKTsKKyAgLyogRXh0cmEgcmVmOiAqLworICBnc3RfYnVmZmVyX3JlZiAoYnVmKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoYnVmLCAiYnVmIiwgMik7CisgIEdTVF9ERUJVRyAoInB1c2ggaW1tdXRhYmxlIGJ1ZmZlciIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgYnVmKSA9PSBHU1RfRkxPV19PSyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGJ1ZiwgImJ1ZiIsIDEpOworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPT0gMik7CisgIG91dF9idWYgPSBnX2xpc3RfbGFzdCAoYnVmZmVycyktPmRhdGE7CisgIGZhaWxfaWYgKG91dF9idWYgPT0gTlVMTCk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKG91dF9idWYsICJvdXRfYnVmIiwgMSk7CisgIGZhaWxfdW5sZXNzIChidWYgIT0gb3V0X2J1Zik7CisgIC8qIERyb3Agb3VyIGV4dHJhIHJlZjogKi8KKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgdmVyaWZ5X3Rlc3RfYnVmZmVyIChvdXRfYnVmKTsKKworICBjbGVhbnVwX3JnbGltaXRlciAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZ2FwKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmdsaW1pdGVyICgpOworICBHc3RCdWZmZXIgKmJ1ZiwgKm91dF9idWY7CisgIEdzdE1hcEluZm8gbTEsIG0yOworCisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKyAgc2V0dXBfZXZlbnRzIChlbGVtZW50KTsKKworICBidWYgPSBjcmVhdGVfdGVzdF9idWZmZXIgKCk7CisgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0dBUCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBidWYpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID09IDEpOworICBvdXRfYnVmID0gYnVmZmVycy0+ZGF0YTsKKyAgZmFpbF9pZiAob3V0X2J1ZiA9PSBOVUxMKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAob3V0X2J1ZiwgIm91dF9idWYiLCAxKTsKKworICAvKiBWZXJpZnkgdGhhdCB0aGUgYmFzZWNsYXNzIGRvZXMgbm90IGxpZnQgdGhlIEdBUCBmbGFnOiAqLworICBmYWlsX3VubGVzcyAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAob3V0X2J1ZiwgR1NUX0JVRkZFUl9GTEFHX0dBUCkpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRfYnVmLCAmbTEsIEdTVF9NQVBfUkVBRCk7CisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtMiwgR1NUX01BUF9SRUFEKTsKKworICBnX2Fzc2VydCAobTEuc2l6ZSA9PSBtMi5zaXplKTsKKyAgLyogV2UgY2hlYXRlZCBieSBwYXNzaW5nIGFuIGlucHV0IGJ1ZmZlciB3aXRoIG5vbi1zaWxlbmNlIHRoYXQgaGFzIHRoZSBHQVAKKyAgICogZmxhZyBzZXQuICBUaGUgZWxlbWVudCBjYW5ub3Qga25vdyB0aGF0IGhvd2V2ZXIgYW5kIG11c3QgaGF2ZSBza2lwcGVkCisgICAqIGFkanVzdGluZyB0aGUgYnVmZmVyIGJlY2F1c2Ugb2YgdGhlIGZsYWcsIHdoaWNoIHdlIGNhbiBlYXNpbHkgdmVyaWZ5OiAqLworICBmYWlsX2lmIChtZW1jbXAgKG0xLmRhdGEsIG0yLmRhdGEsIG0xLnNpemUpICE9IDApOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dF9idWYsICZtMSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm0yKTsKKworICBjbGVhbnVwX3JnbGltaXRlciAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK3JnbGltaXRlcl9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJyZ2xpbWl0ZXIiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ub19idWZmZXIpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZGlzYWJsZWQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbGltaXRpbmcpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2FwKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHJnbGltaXRlcik7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9yZ3ZvbHVtZS5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcmd2b2x1bWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGFlOGJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcmd2b2x1bWUuYwpAQCAtMCwwICsxLDY3OCBAQAorLyogR1N0cmVhbWVyIFJlcGxheUdhaW4gdm9sdW1lIGFkanVzdG1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVuZSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorICoKKyAqIHJndm9sdW1lLmM6IFVuaXQgdGVzdCBmb3IgdGhlIHJndm9sdW1lIGVsZW1lbnQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlIDxtYXRoLmg+CisKK3N0YXRpYyBHTGlzdCAqZXZlbnRzID0gTlVMTDsKKworLyogRm9yIGVhc2Ugb2YgcHJvZ3JhbW1pbmcgd2UgdXNlIGdsb2JhbHMgdG8ga2VlcCByZWZzIGZvciBvdXIgZmxvYXRpbmcgc3JjIGFuZAorICogc2luayBwYWRzIHdlIGNyZWF0ZTsgb3RoZXJ3aXNlIHdlIGFsd2F5cyBoYXZlIHRvIGRvIGdldF9wYWQsIGdldF9wZWVyLCBhbmQKKyAqIHRoZW4gcmVtb3ZlIHJlZmVyZW5jZXMgaW4gZXZlcnkgdGVzdCBmdW5jdGlvbiAqLworc3RhdGljIEdzdFBhZCAqbXlzcmNwYWQsICpteXNpbmtwYWQ7CisKKyNkZWZpbmUgUkdfVk9MVU1FX0NBUFNfVEVNUExBVEVfU1RSSU5HICAgICAgICBcCisgICJhdWRpby94LXJhdywgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZm9ybWF0ID0gKHN0cmluZykgIkdTVF9BVURJT19ORSAoRjMyKSAiLCAiIFwKKyAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiICAgICAgICAgICBcCisgICJjaGFubmVscyA9IChpbnQpIFsgMSwgTUFYIF0sICIgICAgICAgICAgICAgXAorICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0iCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFJHX1ZPTFVNRV9DQVBTX1RFTVBMQVRFX1NUUklORykKKyAgICApOworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoUkdfVk9MVU1FX0NBUFNfVEVNUExBVEVfU1RSSU5HKQorICAgICk7CisKK3N0YXRpYyBHc3RCdWZmZXIgKnRlc3RfYnVmZmVyX25ldyAoZ2Zsb2F0IHZhbHVlKTsKKworLyogZ3N0Y2hlY2sgc2V0cyB1cCBhIGNoYWluIGZ1bmN0aW9uIHRoYXQgYXBwZW5kcyBidWZmZXJzIHRvIGEgZ2xvYmFsIGxpc3QuCisgKiBUaGlzIGlzIG91ciBlcXVpdmFsZW50IG9mIHRoYXQgZm9yIGV2ZW50IGhhbmRsaW5nLiAqLworc3RhdGljIGdib29sZWFuCitldmVudF9mdW5jIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR1NUX0RFQlVHICgicmVjZWl2ZWQgZXZlbnQgJXAgKCVzKSIsIGV2ZW50LCBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworICBldmVudHMgPSBnX2xpc3RfYXBwZW5kIChldmVudHMsIGV2ZW50KTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfcmd2b2x1bWUgKHZvaWQpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQ7CisKKyAgR1NUX0RFQlVHICgic2V0dXBfcmd2b2x1bWUiKTsKKyAgZWxlbWVudCA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgicmd2b2x1bWUiKTsKKyAgbXlzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAoZWxlbWVudCwgJnNyY3RlbXBsYXRlKTsKKyAgbXlzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChlbGVtZW50LCAmc2lua3RlbXBsYXRlKTsKKworICAvKiBDYXB0dXJlIGV2ZW50cywgdG8gdGVzdCB0YWcgZmlsdGVyaW5nIGJlaGF2aW9yOiAqLworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAobXlzaW5rcGFkLCBldmVudF9mdW5jKTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIFRSVUUpOworCisgIHJldHVybiBlbGVtZW50OworfQorCitzdGF0aWMgdm9pZAorc2VuZF9lbXB0eV9idWZmZXIgKHZvaWQpCit7CisgIEdzdEJ1ZmZlciAqYnVmOworCisgIGJ1ZiA9IHRlc3RfYnVmZmVyX25ldyAoMC4wKTsKKyAgZ3N0X2J1ZmZlcl9yZXNpemUgKGJ1ZiwgMCwgMCk7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikgPSAwOworICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKGJ1ZikgPSBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGJ1ZikgPT0gR1NUX0ZMT1dfT0spOworCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA9PSAxKTsKKyAgZmFpbF91bmxlc3MgKGJ1ZmZlcnMtPmRhdGEgPT0gYnVmKTsKKyAgZ3N0X21pbmlfb2JqZWN0X3VucmVmICgoR3N0TWluaU9iamVjdCAqKSBidWZmZXJzLT5kYXRhKTsKKyAgYnVmZmVycyA9IGdfbGlzdF9yZW1vdmUgKGJ1ZmZlcnMsIGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX3Jndm9sdW1lIChHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgR1NUX0RFQlVHICgiY2xlYW51cF9yZ3ZvbHVtZSIpOworCisgIGdfbGlzdF9mb3JlYWNoIChidWZmZXJzLCAoR0Z1bmMpIGdzdF9taW5pX29iamVjdF91bnJlZiwgTlVMTCk7CisgIGdfbGlzdF9mcmVlIChidWZmZXJzKTsKKyAgYnVmZmVycyA9IE5VTEw7CisKKyAgZ19saXN0X2ZvcmVhY2ggKGV2ZW50cywgKEdGdW5jKSBnc3RfbWluaV9vYmplY3RfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoZXZlbnRzKTsKKyAgZXZlbnRzID0gTlVMTDsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBGQUxTRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBGQUxTRSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zcmNfcGFkIChlbGVtZW50KTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChlbGVtZW50KTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGVsZW1lbnQpOworfQorCitzdGF0aWMgdm9pZAorc2V0X3BsYXlpbmdfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50KQoreworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiQ291bGQgbm90IHNldCBzdGF0ZSB0byBQTEFZSU5HIik7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfbnVsbF9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsCisgICAgICAgICAgR1NUX1NUQVRFX05VTEwpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJDb3VsZCBub3Qgc2V0IHN0YXRlIHRvIE5VTEwiKTsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfZmx1c2hfZXZlbnRzIChHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfZmx1c2hfc3RhcnQgKCkpOworICBmYWlsX3VubGVzcyAocmVzLCAiZmx1c2gtc3RhcnQgZXZlbiBub3QgaGFuZGxlZCIpOworCisgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfZmx1c2hfc3RvcCAoVFJVRSkpOworICBmYWlsX3VubGVzcyAocmVzLCAiZmx1c2gtc3RvcCBldmVudCBub3QgaGFuZGxlZCIpOworfQorCitzdGF0aWMgdm9pZAorc2VuZF9zdHJlYW1fc3RhcnRfZXZlbnQgKEdzdEVsZW1lbnQgKiBlbGVtZW50KQoreworICBnYm9vbGVhbiByZXM7CisKKyAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKCJ0ZXN0IikpOworICBmYWlsX3VubGVzcyAocmVzLCAiU1RSRUFNX1NUQVJUIGV2ZW50IG5vdCBoYW5kbGVkIik7Cit9CisKK3N0YXRpYyB2b2lkCitzZW5kX2NhcHNfZXZlbnQgKEdzdEVsZW1lbnQgKiBlbGVtZW50KQoreworICBHc3RDYXBzICpjYXBzOworICBnYm9vbGVhbiByZXM7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nICgiYXVkaW8veC1yYXcsIGZvcm1hdCA9ICIgR1NUX0FVRElPX05FIChGMzIpICIsICIKKyAgICAgICJsYXlvdXQgPSBpbnRlcmxlYXZlZCwgcmF0ZSA9IDgwMDAsIGNoYW5uZWxzID0gMSIpOworICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2NhcHMgKGNhcHMpKTsKKyAgZmFpbF91bmxlc3MgKHJlcywgIkNBUFMgZXZlbnQgbm90IGhhbmRsZWQiKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworfQorCitzdGF0aWMgdm9pZAorc2VuZF9zZWdtZW50X2V2ZW50IChHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgR3N0U2VnbWVudCBzZWdtZW50OworICBnYm9vbGVhbiByZXM7CisKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKyAgZmFpbF91bmxlc3MgKHJlcywgIlNFR01FTlQgZXZlbnQgbm90IGhhbmRsZWQiKTsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfZW9zX2V2ZW50IChHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgR3N0RXZlbnQgKmV2ZW50ID0gZ3N0X2V2ZW50X25ld19lb3MgKCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGV2ZW50KSwKKyAgICAgICJQdXNoaW5nIEVPUyBldmVudCBmYWlsZWQiKTsKK30KKworc3RhdGljIEdzdEV2ZW50ICoKK3NlbmRfdGFnX2V2ZW50IChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR0xpc3QgKmw7CisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OworICBnZG91YmxlIGR1bW15OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChldmVudC0+dHlwZSA9PSBHU1RfRVZFTlRfVEFHLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZXZlbnQpLAorICAgICAgIlB1c2hpbmcgdGFnIGV2ZW50IGZhaWxlZCIpOworCisgIGV2ZW50ID0gTlVMTDsKKworICBmb3IgKGwgPSBnX2xpc3RfbGFzdCAoZXZlbnRzKTsgbDsgbCA9IGwtPnByZXYpIHsKKyAgICBpZiAoR1NUX0VWRU5UX1RZUEUgKGwtPmRhdGEpID09IEdTVF9FVkVOVF9UQUcpIHsKKyAgICAgIGV2ZW50ID0gbC0+ZGF0YTsKKyAgICAgIGV2ZW50cyA9IGdfbGlzdF9kZWxldGVfbGluayAoZXZlbnRzLCBsKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8qIEV2ZW50IGdvdCBmaWx0ZXJlZCBvdXQgKi8KKyAgaWYgKGV2ZW50ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZmFpbF91bmxlc3MgKGV2ZW50LT50eXBlID09IEdTVF9FVkVOVF9UQUcpOworICBnc3RfZXZlbnRfcGFyc2VfdGFnIChldmVudCwgJnRhZ19saXN0KTsKKworICAvKiBUaGUgZWxlbWVudCBpcyBzdXBwb3NlZCB0byBmaWx0ZXIgb3V0IFJlcGxheUdhaW4gcmVsYXRlZCB0YWdzLiAqLworICBmYWlsX2lmIChnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZSAodGFnX2xpc3QsIEdTVF9UQUdfVFJBQ0tfR0FJTiwgJmR1bW15KSwKKyAgICAgICJ0YWcgZXZlbnQgc3RpbGwgY29udGFpbnMgdHJhY2sgZ2FpbiB0YWciKTsKKyAgZmFpbF9pZiAoZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKHRhZ19saXN0LCBHU1RfVEFHX1RSQUNLX1BFQUssICZkdW1teSksCisgICAgICAidGFnIGV2ZW50IHN0aWxsIGNvbnRhaW5zIHRyYWNrIHBlYWsgdGFnIik7CisgIGZhaWxfaWYgKGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwgR1NUX1RBR19BTEJVTV9HQUlOLCAmZHVtbXkpLAorICAgICAgInRhZyBldmVudCBzdGlsbCBjb250YWlucyBhbGJ1bSBnYWluIHRhZyIpOworICBmYWlsX2lmIChnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZSAodGFnX2xpc3QsIEdTVF9UQUdfQUxCVU1fUEVBSywgJmR1bW15KSwKKyAgICAgICJ0YWcgZXZlbnQgc3RpbGwgY29udGFpbnMgYWxidW0gcGVhayB0YWciKTsKKworICByZXR1cm4gZXZlbnQ7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgordGVzdF9idWZmZXJfbmV3IChnZmxvYXQgdmFsdWUpCit7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2Zsb2F0ICpkYXRhOworICBnaW50IGk7CisKKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg4ICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGRhdGEgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgIGRhdGFbaV0gPSB2YWx1ZTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworCisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGJ1ZiwgImJ1ZiIsIDEpOworCisgIHJldHVybiBidWY7Cit9CisKKyNkZWZpbmUgTUFUQ0hfR0FJTihnMSwgZzIpICgoZzEgPCBnMiArIDFlLTYpICYmIChnMiA8IGcxICsgMWUtNikpCisKK3N0YXRpYyB2b2lkCitmYWlsX3VubGVzc190YXJnZXRfZ2FpbiAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIGdkb3VibGUgZXhwZWN0ZWRfZ2FpbikKK3sKKyAgZ2RvdWJsZSBwcm9wX2dhaW47CisKKyAgZ19vYmplY3RfZ2V0IChlbGVtZW50LCAidGFyZ2V0LWdhaW4iLCAmcHJvcF9nYWluLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoTUFUQ0hfR0FJTiAocHJvcF9nYWluLCBleHBlY3RlZF9nYWluKSwKKyAgICAgICJUYXJnZXQgZ2FpbiBpcyAlLjJmIGRCLCBleHBlY3RlZCAlLjJmIGRCIiwgcHJvcF9nYWluLCBleHBlY3RlZF9nYWluKTsKK30KKworc3RhdGljIHZvaWQKK2ZhaWxfdW5sZXNzX3Jlc3VsdF9nYWluIChHc3RFbGVtZW50ICogZWxlbWVudCwgZ2RvdWJsZSBleHBlY3RlZF9nYWluKQoreworICBHc3RCdWZmZXIgKmlucHV0X2J1ZiwgKm91dHB1dF9idWY7CisgIGdmbG9hdCAqZGF0YTsKKyAgZ2Zsb2F0IGlucHV0X3NhbXBsZSwgb3V0cHV0X3NhbXBsZTsKKyAgZ2RvdWJsZSBnYWluLCBwcm9wX2dhaW47CisgIGdib29sZWFuIGlzX3Bhc3N0aHJvdWdoLCBleHBlY3RfcGFzc3Rocm91Z2g7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID09IDApOworCisgIGlucHV0X3NhbXBsZSA9IDEuMDsKKyAgaW5wdXRfYnVmID0gdGVzdF9idWZmZXJfbmV3IChpbnB1dF9zYW1wbGUpOworCisgIC8qIFdlIGtlZXAgYW4gZXh0cmEgcmVmZXJlbmNlIHRvIGRldGVjdCBwYXNzdGhyb3VnaCBtb2RlLiAqLworICBnc3RfYnVmZmVyX3JlZiAoaW5wdXRfYnVmKTsKKyAgLyogUHVzaGluZyBzdGVhbHMgYSByZWZlcmVuY2UuICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbnB1dF9idWYpID09IEdTVF9GTE9XX09LKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoaW5wdXRfYnVmKTsKKworICAvKiBUaGUgb3V0cHV0IGJ1ZmZlciBlbmRzIHVwIG9uIHRoZSBnbG9iYWwgYnVmZmVyIGxpc3QuICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA9PSAxKTsKKyAgb3V0cHV0X2J1ZiA9IGJ1ZmZlcnMtPmRhdGE7CisgIGZhaWxfaWYgKG91dHB1dF9idWYgPT0gTlVMTCk7CisKKyAgYnVmZmVycyA9IGdfbGlzdF9yZW1vdmUgKGJ1ZmZlcnMsIG91dHB1dF9idWYpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChvdXRwdXRfYnVmLCAib3V0cHV0X2J1ZiIsIDEpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dHB1dF9idWYpLAorICAgICAgOCAqIHNpemVvZiAoZ2Zsb2F0KSk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dHB1dF9idWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRhdGEgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworCisgIG91dHB1dF9zYW1wbGUgPSAqZGF0YTsKKyAgZmFpbF9pZiAob3V0cHV0X3NhbXBsZSA9PSAwLjAsICJGaXJzdCBvdXRwdXQgc2FtcGxlIGlzIHplcm8iKTsKKyAgZm9yIChpID0gMTsgaSA8IDg7IGkrKykgeworICAgIGZhaWxfdW5sZXNzIChvdXRwdXRfc2FtcGxlID09IGRhdGFbaV0sICJPdXRwdXQgc2FtcGxlcyBub3QgdW5pZm9ybSIpOworICB9OworICBnc3RfYnVmZmVyX3VubWFwIChvdXRwdXRfYnVmLCAmbWFwKTsKKworICBnYWluID0gMjAuICogbG9nMTAgKG91dHB1dF9zYW1wbGUgLyBpbnB1dF9zYW1wbGUpOworICBmYWlsX3VubGVzcyAoTUFUQ0hfR0FJTiAoZ2FpbiwgZXhwZWN0ZWRfZ2FpbiksCisgICAgICAiQXBwbGllZCBnYWluIGlzICUuMmYgZEIsIGV4cGVjdGVkICUuMmYgZEIiLCBnYWluLCBleHBlY3RlZF9nYWluKTsKKyAgZ19vYmplY3RfZ2V0IChlbGVtZW50LCAicmVzdWx0LWdhaW4iLCAmcHJvcF9nYWluLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKE1BVENIX0dBSU4gKHByb3BfZ2FpbiwgZXhwZWN0ZWRfZ2FpbiksCisgICAgICAiUmVzdWx0IGdhaW4gaXMgJS4yZiBkQiwgZXhwZWN0ZWQgJS4yZiBkQiIsIHByb3BfZ2FpbiwgZXhwZWN0ZWRfZ2Fpbik7CisKKyAgaXNfcGFzc3Rocm91Z2ggPSAob3V0cHV0X2J1ZiA9PSBpbnB1dF9idWYpOworICBleHBlY3RfcGFzc3Rocm91Z2ggPSBNQVRDSF9HQUlOIChleHBlY3RlZF9nYWluLCArMC4wMCk7CisgIGZhaWxfdW5sZXNzIChpc19wYXNzdGhyb3VnaCA9PSBleHBlY3RfcGFzc3Rocm91Z2gsCisgICAgICBleHBlY3RfcGFzc3Rocm91Z2gKKyAgICAgID8gIkV4cGVjdGVkIG9wZXJhdGlvbiBpbiBwYXNzdGhyb3VnaCBtb2RlIgorICAgICAgOiAiSW5jb3JyZWN0IHBhc3N0aHJvdWdoIGJlaGF2aW91ciIpOworCisgIGdzdF9idWZmZXJfdW5yZWYgKG91dHB1dF9idWYpOworfQorCitzdGF0aWMgdm9pZAorZmFpbF91bmxlc3NfZ2FpbiAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIGdkb3VibGUgZXhwZWN0ZWRfZ2FpbikKK3sKKyAgZmFpbF91bmxlc3NfdGFyZ2V0X2dhaW4gKGVsZW1lbnQsIGV4cGVjdGVkX2dhaW4pOworICBmYWlsX3VubGVzc19yZXN1bHRfZ2FpbiAoZWxlbWVudCwgZXhwZWN0ZWRfZ2Fpbik7Cit9CisKKy8qIFN0YXJ0IG9mIHRlc3RzLiAqLworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ub19idWZmZXIpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ3ZvbHVtZSAoKTsKKworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisgIHNldF9udWxsX3N0YXRlIChlbGVtZW50KTsKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisKKyAgY2xlYW51cF9yZ3ZvbHVtZSAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZXZlbnRzKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmd2b2x1bWUgKCk7CisgIEdzdEV2ZW50ICpldmVudDsKKyAgR3N0RXZlbnQgKm5ld19ldmVudDsKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisgIGdjaGFyICphcnRpc3Q7CisKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOworICBzZW5kX3N0cmVhbV9zdGFydF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisKKyAgc2VuZF9lbXB0eV9idWZmZXIgKCk7CisKKyAgdGFnX2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBnc3RfdGFnX2xpc3RfYWRkICh0YWdfbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgR1NUX1RBR19UUkFDS19HQUlOLCArNC45NSwgR1NUX1RBR19UUkFDS19QRUFLLCAwLjU5NDYzLAorICAgICAgR1NUX1RBR19BTEJVTV9HQUlOLCAtMS41NCwgR1NUX1RBR19BTEJVTV9QRUFLLCAwLjY5MzQxNSwKKyAgICAgIEdTVF9UQUdfQVJUSVNULCAiRm9vYmFyIiwgTlVMTCk7CisgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld190YWcgKHRhZ19saXN0KTsKKyAgbmV3X2V2ZW50ID0gc2VuZF90YWdfZXZlbnQgKGVsZW1lbnQsIGV2ZW50KTsKKyAgZ3N0X2V2ZW50X3BhcnNlX3RhZyAobmV3X2V2ZW50LCAmdGFnX2xpc3QpOworICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ19saXN0LCBHU1RfVEFHX0FSVElTVCwgJmFydGlzdCkpOworICBmYWlsX3VubGVzcyAoZ19zdHJfZXF1YWwgKGFydGlzdCwgIkZvb2JhciIpKTsKKyAgZ19mcmVlIChhcnRpc3QpOworICBnc3RfZXZlbnRfdW5yZWYgKG5ld19ldmVudCk7CisKKyAgLyogU2FtZSBhcyBhYm92ZSwgYnV0IHdpdGggYSBub24td3JpdGFibGUgZXZlbnQuICovCisKKyAgdGFnX2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBnc3RfdGFnX2xpc3RfYWRkICh0YWdfbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgR1NUX1RBR19UUkFDS19HQUlOLCArNC45NSwgR1NUX1RBR19UUkFDS19QRUFLLCAwLjU5NDYzLAorICAgICAgR1NUX1RBR19BTEJVTV9HQUlOLCAtMS41NCwgR1NUX1RBR19BTEJVTV9QRUFLLCAwLjY5MzQxNSwKKyAgICAgIEdTVF9UQUdfQVJUSVNULCAiRm9vYmFyIiwgTlVMTCk7CisgIGdzdF90YWdfbGlzdF9yZWYgKHRhZ19saXN0KTsKKyAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3RhZyAodGFnX2xpc3QpOworICBuZXdfZXZlbnQgPSBzZW5kX3RhZ19ldmVudCAoZWxlbWVudCwgZXZlbnQpOworCisgIC8qIE1ha2Ugc3VyZSBvdXIgdGFncyB3ZXJlbid0IG1vZGlmaWVkIGluIHBsYWNlIHdoaWxlIHdlIHN0aWxsIGdvdCBhIHJlZiAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICg1LCBnc3RfdGFnX2xpc3Rfbl90YWdzICh0YWdfbGlzdCkpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICBnc3RfZXZlbnRfcGFyc2VfdGFnIChuZXdfZXZlbnQsICZ0YWdfbGlzdCk7CisgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZyAodGFnX2xpc3QsIEdTVF9UQUdfQVJUSVNULCAmYXJ0aXN0KSk7CisgIGZhaWxfdW5sZXNzIChnX3N0cl9lcXVhbCAoYXJ0aXN0LCAiRm9vYmFyIikpOworICBnX2ZyZWUgKGFydGlzdCk7CisgIGdzdF9ldmVudF91bnJlZiAobmV3X2V2ZW50KTsKKworICBjbGVhbnVwX3Jndm9sdW1lIChlbGVtZW50KTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9zaW1wbGUpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ3ZvbHVtZSAoKTsKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisKKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAiYWxidW0tbW9kZSIsIEZBTFNFLCAiaGVhZHJvb20iLCArMC4wMCwKKyAgICAgICJwcmUtYW1wIiwgLTYuMDAsICJmYWxsYmFjay1nYWluIiwgKzEuMjMsIE5VTEwpOworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisgIHNlbmRfc3RyZWFtX3N0YXJ0X2V2ZW50IChlbGVtZW50KTsKKyAgc2VuZF9jYXBzX2V2ZW50IChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKworICBzZW5kX2VtcHR5X2J1ZmZlciAoKTsKKworICB0YWdfbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ19saXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICBHU1RfVEFHX1RSQUNLX0dBSU4sIC0zLjQ1LCBHU1RfVEFHX1RSQUNLX1BFQUssIDEuMCwKKyAgICAgIEdTVF9UQUdfQUxCVU1fR0FJTiwgKzIuMDksIEdTVF9UQUdfQUxCVU1fUEVBSywgMS4wLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHNlbmRfdGFnX2V2ZW50IChlbGVtZW50LCBnc3RfZXZlbnRfbmV3X3RhZyAodGFnX2xpc3QpKSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZ2FpbiAoZWxlbWVudCwgLTkuNDUpOyAgICAvKiBwcmUtYW1wICsgdHJhY2sgZ2FpbiAqLworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisKKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAiYWxidW0tbW9kZSIsIFRSVUUsIE5VTEwpOworCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKworICB0YWdfbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ19saXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICBHU1RfVEFHX1RSQUNLX0dBSU4sIC0zLjQ1LCBHU1RfVEFHX1RSQUNLX1BFQUssIDEuMCwKKyAgICAgIEdTVF9UQUdfQUxCVU1fR0FJTiwgKzIuMDksIEdTVF9UQUdfQUxCVU1fUEVBSywgMS4wLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHNlbmRfdGFnX2V2ZW50IChlbGVtZW50LCBnc3RfZXZlbnRfbmV3X3RhZyAodGFnX2xpc3QpKSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZ2FpbiAoZWxlbWVudCwgLTMuOTEpOyAgICAvKiBwcmUtYW1wICsgYWxidW0gZ2FpbiAqLworCisgIC8qIFN3aXRjaGluZyBiYWNrIHRvIHRyYWNrIG1vZGUgaW4gdGhlIG1pZGRsZSBvZiBhIHN0cmVhbTogKi8KKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAiYWxidW0tbW9kZSIsIEZBTFNFLCBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZ2FpbiAoZWxlbWVudCwgLTkuNDUpOyAgICAvKiBwcmUtYW1wICsgdHJhY2sgZ2FpbiAqLworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisKKyAgY2xlYW51cF9yZ3ZvbHVtZSAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogSWYgdGhlcmUgYXJlIG5vIGdhaW4gdGFncyBhdCBhbGwsIHRoZSBmYWxsYmFjayBnYWluIGlzIHVzZWQuICovCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ZhbGxiYWNrX2dhaW4pCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ3ZvbHVtZSAoKTsKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisKKyAgLyogRmlyc3Qgc29tZSB0cmFjayB3aGVyZSBmYWxsYmFjayBkb2VzIF9ub3RfIGFwcGx5LiAqLworCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgImFsYnVtLW1vZGUiLCBGQUxTRSwgImhlYWRyb29tIiwgMTAuMDAsCisgICAgICAicHJlLWFtcCIsIC02LjAwLCAiZmFsbGJhY2stZ2FpbiIsIC0zLjAwLCBOVUxMKTsKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOworICBzZW5kX3N0cmVhbV9zdGFydF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisKKyAgc2VuZF9lbXB0eV9idWZmZXIgKCk7CisKKyAgdGFnX2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBnc3RfdGFnX2xpc3RfYWRkICh0YWdfbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgR1NUX1RBR19UUkFDS19HQUlOLCArMy41LCBHU1RfVEFHX1RSQUNLX1BFQUssIDEuMCwKKyAgICAgIEdTVF9UQUdfQUxCVU1fR0FJTiwgLTAuNSwgR1NUX1RBR19BTEJVTV9QRUFLLCAxLjAsIE5VTEwpOworICBmYWlsX3VubGVzcyAoc2VuZF90YWdfZXZlbnQgKGVsZW1lbnQsIGdzdF9ldmVudF9uZXdfdGFnICh0YWdfbGlzdCkpID09IE5VTEwpOworICBmYWlsX3VubGVzc19nYWluIChlbGVtZW50LCAtMi41MCk7ICAgIC8qIHByZS1hbXAgKyB0cmFjayBnYWluICovCisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKworICAvKiBOb3cgYSB0cmFjayBjb21wbGV0ZWx5IG1pc3NpbmcgdGFncy4gKi8KKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworCisgIGZhaWxfdW5sZXNzX2dhaW4gKGVsZW1lbnQsIC05LjAwKTsgICAgLyogcHJlLWFtcCArIGZhbGxiYWNrLWdhaW4gKi8KKworICAvKiBDaGFuZ2luZyB0aGUgZmFsbGJhY2sgZ2FpbiBpbiB0aGUgbWlkZGxlIG9mIGEgc3RyZWFtLCBnb2luZyB0byBwYXNzLXRocm91Z2gKKyAgICogbW9kZTogKi8KKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAiZmFsbGJhY2stZ2FpbiIsICs2LjAwLCBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZ2FpbiAoZWxlbWVudCwgKzAuMDApOyAgICAvKiBwcmUtYW1wICsgZmFsbGJhY2stZ2FpbiAqLworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisKKyAgLyogVmVyaWZ5IHRoYXQgcmVzdWx0IGdhaW4gaXMgc2V0IHRvICswLjAwIHdpdGggcHJlLWFtcCArIGZhbGxiYWNrLWdhaW4gPgorICAgKiArMC4wMCBhbmQgbm8gaGVhZHJvb20uICovCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJmYWxsYmFjay1nYWluIiwgKzEyLjAwLCAiaGVhZHJvb20iLCArMC4wMCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzX3RhcmdldF9nYWluIChlbGVtZW50LCArNi4wMCk7ICAgICAvKiBwcmUtYW1wICsgZmFsbGJhY2stZ2FpbiAqLworICBmYWlsX3VubGVzc19yZXN1bHRfZ2FpbiAoZWxlbWVudCwgKzAuMDApOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisKKyAgY2xlYW51cF9yZ3ZvbHVtZSAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogSWYgYWxidW0gZ2FpbiBpcyB0byBiZSBwcmVmZXJyZWQgYnV0IG5vdCBhdmFpbGFibGUsIHRoZSB0cmFjayBnYWluIGlzIHRvIGJlCisgKiB0YWtlbiBpbnN0ZWFkLiAqLworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mYWxsYmFja190cmFjaykKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3Jndm9sdW1lICgpOworICBHc3RUYWdMaXN0ICp0YWdfbGlzdDsKKworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJhbGJ1bS1tb2RlIiwgVFJVRSwgImhlYWRyb29tIiwgKzAuMDAsCisgICAgICAicHJlLWFtcCIsIC02LjAwLCAiZmFsbGJhY2stZ2FpbiIsICsxLjIzLCBOVUxMKTsKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOworICBzZW5kX3N0cmVhbV9zdGFydF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisKKyAgc2VuZF9lbXB0eV9idWZmZXIgKCk7CisKKyAgdGFnX2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBnc3RfdGFnX2xpc3RfYWRkICh0YWdfbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgR1NUX1RBR19UUkFDS19HQUlOLCArMi4xMSwgR1NUX1RBR19UUkFDS19QRUFLLCAxLjAsIE5VTEwpOworICBmYWlsX3VubGVzcyAoc2VuZF90YWdfZXZlbnQgKGVsZW1lbnQsIGdzdF9ldmVudF9uZXdfdGFnICh0YWdfbGlzdCkpID09IE5VTEwpOworICBmYWlsX3VubGVzc19nYWluIChlbGVtZW50LCAtMy44OSk7ICAgIC8qIHByZS1hbXAgKyB0cmFjayBnYWluICovCisKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworCisgIGNsZWFudXBfcmd2b2x1bWUgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIElmIHRyYWNrIGdhaW4gaXMgdG8gYmUgcHJlZmVycmVkIGJ1dCBub3QgYXZhaWxhYmxlLCB0aGUgYWxidW0gZ2FpbiBpcyB0byBiZQorICogdGFrZW4gaW5zdGVhZC4gKi8KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZmFsbGJhY2tfYWxidW0pCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ3ZvbHVtZSAoKTsKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisKKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAiYWxidW0tbW9kZSIsIEZBTFNFLCAiaGVhZHJvb20iLCArMC4wMCwKKyAgICAgICJwcmUtYW1wIiwgLTYuMDAsICJmYWxsYmFjay1nYWluIiwgKzEuMjMsIE5VTEwpOworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisgIHNlbmRfc3RyZWFtX3N0YXJ0X2V2ZW50IChlbGVtZW50KTsKKyAgc2VuZF9jYXBzX2V2ZW50IChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKworICBzZW5kX2VtcHR5X2J1ZmZlciAoKTsKKworICB0YWdfbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ19saXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICBHU1RfVEFHX0FMQlVNX0dBSU4sICszLjczLCBHU1RfVEFHX0FMQlVNX1BFQUssIDEuMCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChzZW5kX3RhZ19ldmVudCAoZWxlbWVudCwgZ3N0X2V2ZW50X25ld190YWcgKHRhZ19saXN0KSkgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2dhaW4gKGVsZW1lbnQsIC0yLjI3KTsgICAgLyogcHJlLWFtcCArIGFsYnVtIGdhaW4gKi8KKworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisKKyAgY2xlYW51cF9yZ3ZvbHVtZSAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaGVhZHJvb20pCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ3ZvbHVtZSAoKTsKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisKKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAiYWxidW0tbW9kZSIsIEZBTFNFLCAiaGVhZHJvb20iLCArMC4wMCwKKyAgICAgICJwcmUtYW1wIiwgKzAuMDAsICJmYWxsYmFjay1nYWluIiwgKzEuMjMsIE5VTEwpOworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisgIHNlbmRfc3RyZWFtX3N0YXJ0X2V2ZW50IChlbGVtZW50KTsKKyAgc2VuZF9jYXBzX2V2ZW50IChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKworICBzZW5kX2VtcHR5X2J1ZmZlciAoKTsKKworICB0YWdfbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ19saXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICBHU1RfVEFHX1RSQUNLX0dBSU4sICszLjUwLCBHU1RfVEFHX1RSQUNLX1BFQUssIDEuMCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChzZW5kX3RhZ19ldmVudCAoZWxlbWVudCwgZ3N0X2V2ZW50X25ld190YWcgKHRhZ19saXN0KSkgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX3RhcmdldF9nYWluIChlbGVtZW50LCArMy41MCk7ICAgICAvKiBwcmUtYW1wICsgdHJhY2sgZ2FpbiAqLworICBmYWlsX3VubGVzc19yZXN1bHRfZ2FpbiAoZWxlbWVudCwgKzAuMDApOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgImhlYWRyb29tIiwgKzIuMDAsIE5VTEwpOworICB0YWdfbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ19saXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICBHU1RfVEFHX1RSQUNLX0dBSU4sICs5LjE4LCBHU1RfVEFHX1RSQUNLX1BFQUssIDAuNjg3MTQ5LCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHNlbmRfdGFnX2V2ZW50IChlbGVtZW50LCBnc3RfZXZlbnRfbmV3X3RhZyAodGFnX2xpc3QpKSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfdGFyZ2V0X2dhaW4gKGVsZW1lbnQsICs5LjE4KTsgICAgIC8qIHByZS1hbXAgKyB0cmFjayBnYWluICovCisgIC8qIFJlc3VsdCBpcyAyMC4gKiBsb2cxMCAoMS4gLyBwZWFrKSArIGhlYWRyb29tLiAqLworICBmYWlsX3VubGVzc19yZXN1bHRfZ2FpbiAoZWxlbWVudCwgNS4yNTg5ODE2MjM4MzAzMzM1KTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJhbGJ1bS1tb2RlIiwgVFJVRSwgTlVMTCk7CisgIHRhZ19saXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZ3N0X3RhZ19saXN0X2FkZCAodGFnX2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgIEdTVF9UQUdfQUxCVU1fR0FJTiwgKzUuNTAsIEdTVF9UQUdfQUxCVU1fUEVBSywgMS4wLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHNlbmRfdGFnX2V2ZW50IChlbGVtZW50LCBnc3RfZXZlbnRfbmV3X3RhZyAodGFnX2xpc3QpKSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfdGFyZ2V0X2dhaW4gKGVsZW1lbnQsICs1LjUwKTsgICAgIC8qIHByZS1hbXAgKyBhbGJ1bSBnYWluICovCisgIGZhaWxfdW5sZXNzX3Jlc3VsdF9nYWluIChlbGVtZW50LCArMi4wMCk7ICAgICAvKiBoZWFkcm9vbSAqLworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisKKyAgY2xlYW51cF9yZ3ZvbHVtZSAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcmVmZXJlbmNlX2xldmVsKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmd2b2x1bWUgKCk7CisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OworCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwKKyAgICAgICJhbGJ1bS1tb2RlIiwgRkFMU0UsCisgICAgICAiaGVhZHJvb20iLCArMC4wMCwgInByZS1hbXAiLCArMC4wMCwgImZhbGxiYWNrLWdhaW4iLCArMS4yMywgTlVMTCk7CisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKworICBzZW5kX3N0cmVhbV9zdGFydF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisKKyAgc2VuZF9lbXB0eV9idWZmZXIgKCk7CisKKyAgdGFnX2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBnc3RfdGFnX2xpc3RfYWRkICh0YWdfbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgR1NUX1RBR19UUkFDS19HQUlOLCAwLjAwLCBHU1RfVEFHX1RSQUNLX1BFQUssIDAuMiwKKyAgICAgIEdTVF9UQUdfUkVGRVJFTkNFX0xFVkVMLCA4My4sIE5VTEwpOworICBmYWlsX3VubGVzcyAoc2VuZF90YWdfZXZlbnQgKGVsZW1lbnQsIGdzdF9ldmVudF9uZXdfdGFnICh0YWdfbGlzdCkpID09IE5VTEwpOworICAvKiBCZWNhdXNlIG91ciBhdXRob3JhdGl2ZSByZWZlcmVuY2UgaXMgODkgZEIsIHdlIGJ1bXAgaXQgdXAgYnkgKzYgZEIuICovCisgIGZhaWxfdW5sZXNzX2dhaW4gKGVsZW1lbnQsICs2LjAwKTsgICAgLyogcHJlLWFtcCArIHRyYWNrIGdhaW4gKi8KKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgImFsYnVtLW1vZGUiLCBUUlVFLCBOVUxMKTsKKworICAvKiBTYW1lIGFzIGFib3ZlLCBidXQgd2l0aCBhbGJ1bSBnYWluLiAqLworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisKKyAgdGFnX2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBnc3RfdGFnX2xpc3RfYWRkICh0YWdfbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgR1NUX1RBR19UUkFDS19HQUlOLCAxLjIzLCBHU1RfVEFHX1RSQUNLX1BFQUssIDAuMSwKKyAgICAgIEdTVF9UQUdfQUxCVU1fR0FJTiwgMC4wMCwgR1NUX1RBR19BTEJVTV9QRUFLLCAwLjIsCisgICAgICBHU1RfVEFHX1JFRkVSRU5DRV9MRVZFTCwgODMuLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHNlbmRfdGFnX2V2ZW50IChlbGVtZW50LCBnc3RfZXZlbnRfbmV3X3RhZyAodGFnX2xpc3QpKSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZ2FpbiAoZWxlbWVudCwgKzYuMDApOyAgICAvKiBwcmUtYW1wICsgYWxidW0gZ2FpbiAqLworCisgIGNsZWFudXBfcmd2b2x1bWUgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCityZ3ZvbHVtZV9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJyZ3ZvbHVtZSIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X25vX2J1ZmZlcik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ldmVudHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfc2ltcGxlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ZhbGxiYWNrX2dhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZmFsbGJhY2tfdHJhY2spOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZmFsbGJhY2tfYWxidW0pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaGVhZHJvb20pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcmVmZXJlbmNlX2xldmVsKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHJndm9sdW1lKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NTIyMDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jCkBAIC0wLDAgKzEsMTY4MiBAQAorLyogR1N0cmVhbWVyIFJUUCBwYXlsb2FkZXIgdW5pdCB0ZXN0cworICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uIGFuZCBpdHMgc3Vic2lkYXJ5KC1pZXMpCisgKiAgICAgICAgICAgICAgIGNvbnRhY3Q6IDxzdGVmYW4ua29zdEBub2tpYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0aGFybmVzcy5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2Jhc2UuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBSRUxFQVNFX0VMRU1FTlQoeCkgaWYoeCkge2dzdF9vYmplY3RfdW5yZWYoeCk7IHggPSBOVUxMO30KKworI2RlZmluZSBMT09QX0NPVU5UIDEKKworLyoKKyAqIFJUUCBwaXBlbGluZSBzdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIHJlcXVpcmVkIGVsZW1lbnRzLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0RWxlbWVudCAqYXBwc3JjOworICBHc3RFbGVtZW50ICpydHBwYXk7CisgIEdzdEVsZW1lbnQgKnJ0cGRlcGF5OworICBHc3RFbGVtZW50ICpmYWtlc2luazsKKyAgY29uc3QgZ3VpbnQ4ICpmcmFtZV9kYXRhOworICBpbnQgZnJhbWVfZGF0YV9zaXplOworICBpbnQgZnJhbWVfY291bnQ7CisgIEdzdEV2ZW50ICpjdXN0b21fZXZlbnQ7Cit9IHJ0cF9waXBlbGluZTsKKworLyoKKyAqIE51bWJlciBvZiBieXRlcyByZWNlaXZlZCBpbiB0aGUgY2hhaW4gbGlzdCBmdW5jdGlvbiB3aGVuIHVzaW5nIGJ1ZmZlciBsaXN0cworICovCitzdGF0aWMgZ3VpbnQgY2hhaW5fbGlzdF9ieXRlc19yZWNlaXZlZDsKKworLyoKKyAqIENoYWluIGxpc3QgZnVuY3Rpb24gZm9yIHRlc3RpbmcgYnVmZmVyIGxpc3RzCisgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitydHBfcGlwZWxpbmVfY2hhaW5fbGlzdCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlckxpc3QgKiBsaXN0KQoreworICBndWludCBpLCBsZW47CisKKyAgZmFpbF9pZiAoIWxpc3QpOworICAvKgorICAgKiBDb3VudCB0aGUgc2l6ZSBvZiB0aGUgcGF5bG9hZCBpbiB0aGUgYnVmZmVyIGxpc3QuCisgICAqLworICBsZW4gPSBnc3RfYnVmZmVyX2xpc3RfbGVuZ3RoIChsaXN0KTsKKyAgR1NUX0xPRyAoImxpc3QgbGVuZ3RoICV1IiwgbGVuKTsKKworICAvKiBMb29wIHRocm91Z2ggYWxsIGdyb3VwcyAqLworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBHc3RCdWZmZXIgKnBheWJ1ZjsKKyAgICBHc3RNZW1vcnkgKm1lbTsKKyAgICBnaW50IHNpemU7CisKKyAgICBwYXlidWYgPSBnc3RfYnVmZmVyX2xpc3RfZ2V0IChsaXN0LCBpKTsKKyAgICAvKiBvbmx5IGNvdW50IHJlYWwgZGF0YSB3aGljaCBpcyBleHBlY3RlZCBpbiBsYXN0IG1lbW9yeSBibG9jayAqLworICAgIEdTVF9MT0cgKCJuX21lbW9yeSAlZCIsIGdzdF9idWZmZXJfbl9tZW1vcnkgKHBheWJ1ZikpOworICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX25fbWVtb3J5IChwYXlidWYpID4gMSk7CisgICAgbWVtID0gZ3N0X2J1ZmZlcl9nZXRfbWVtb3J5X3JhbmdlIChwYXlidWYsIGdzdF9idWZmZXJfbl9tZW1vcnkgKHBheWJ1ZikgLSAxLAorICAgICAgICAxKTsKKyAgICBzaXplID0gZ3N0X21lbW9yeV9nZXRfc2l6ZXMgKG1lbSwgTlVMTCwgTlVMTCk7CisgICAgZ3N0X21lbW9yeV91bnJlZiAobWVtKTsKKyAgICBjaGFpbl9saXN0X2J5dGVzX3JlY2VpdmVkICs9IHNpemU7CisgICAgR1NUX0xPRyAoInNpemUgJWQsIHRvdGFsICV1Iiwgc2l6ZSwgY2hhaW5fbGlzdF9ieXRlc19yZWNlaXZlZCk7CisgIH0KKyAgZ3N0X2J1ZmZlcl9saXN0X3VucmVmIChsaXN0KTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitydHBfcGlwZWxpbmVfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdEJ1ZmZlckxpc3QgKmxpc3Q7CisKKyAgbGlzdCA9IGdzdF9idWZmZXJfbGlzdF9uZXdfc2l6ZWQgKDEpOworICBnc3RfYnVmZmVyX2xpc3RfYWRkIChsaXN0LCBidWYpOworICByZXR1cm4gcnRwX3BpcGVsaW5lX2NoYWluX2xpc3QgKHBhZCwgcGFyZW50LCBsaXN0KTsKK30KKworLyoKKyAqIFJUUCBidXMgY2FsbGJhY2suCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorcnRwX2J1c19jYWxsYmFjayAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR01haW5Mb29wICptYWlubG9vcCA9IChHTWFpbkxvb3AgKikgZGF0YTsKKworICBzd2l0Y2ggKEdTVF9NRVNTQUdFX1RZUEUgKG1lc3NhZ2UpKSB7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FUlJPUjoKKyAgICB7CisgICAgICBHRXJyb3IgKmVycjsKKworICAgICAgZ2NoYXIgKmRlYnVnOworCisgICAgICBnY2hhciAqZWxlbWVudF9uYW1lOworCisgICAgICBlbGVtZW50X25hbWUgPSAobWVzc2FnZS0+c3JjKSA/IGdzdF9vYmplY3RfZ2V0X25hbWUgKG1lc3NhZ2UtPnNyYykgOiBOVUxMOworICAgICAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1lc3NhZ2UsICZlcnIsICZkZWJ1Zyk7CisgICAgICBnX3ByaW50ICgiXG5FcnJvciBmcm9tIGVsZW1lbnQgJXM6ICVzXG4lc1xuXG4iLAorICAgICAgICAgIEdTVF9TVFJfTlVMTCAoZWxlbWVudF9uYW1lKSwgZXJyLT5tZXNzYWdlLCAoZGVidWcpID8gZGVidWcgOiAiIik7CisgICAgICBnX2Vycm9yX2ZyZWUgKGVycik7CisgICAgICBnX2ZyZWUgKGRlYnVnKTsKKyAgICAgIGdfZnJlZSAoZWxlbWVudF9uYW1lKTsKKworICAgICAgZmFpbF9pZiAoR1NUX01FU1NBR0VfVFlQRSAobWVzc2FnZSkgPT0gR1NUX01FU1NBR0VfRVJST1IpOworCisgICAgICBnX21haW5fbG9vcF9xdWl0IChtYWlubG9vcCk7CisgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VPUzoKKyAgICB7CisgICAgICBnX21haW5fbG9vcF9xdWl0IChtYWlubG9vcCk7CisgICAgfQorICAgICAgYnJlYWs7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgeworICAgIH0KKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBDcmVhdGVzIGEgUlRQIHBpcGVsaW5lIGZvciBvbmUgdGVzdC4KKyAqIEBwYXJhbSBmcmFtZV9kYXRhIFBvaW50ZXIgdG8gdGhlIGZyYW1lIGRhdGEgd2hpY2ggaXMgdXNlZCB0byBwYXNzIHRocnUgcGF5L2RlcGF5bG9hZGVycy4KKyAqIEBwYXJhbSBmcmFtZV9kYXRhX3NpemUgRnJhbWUgZGF0YSBzaXplIGluIGJ5dGVzLgorICogQHBhcmFtIGZyYW1lX2NvdW50IEZyYW1lIGNvdW50LgorICogQHBhcmFtIGZpbHRlcmNhcHMgQ2FwcyBmaWx0ZXJzLgorICogQHBhcmFtIHBheSBQYXlsb2FkZXIgbmFtZS4KKyAqIEBwYXJhbSBkZXBheSBEZXBheWxvYWRlciBuYW1lLgorICogQHJldHVybgorICogUmV0dXJucyBwb2ludGVyIHRvIHRoZSBSVFAgcGlwZWxpbmUuCisgKiBUaGUgdXNlciBtdXN0IGZyZWUgdGhlIFJUUCBwaXBlbGluZSB3aGVuIGl0J3Mgbm90IHVzZWQgYW55bW9yZS4KKyAqLworc3RhdGljIHJ0cF9waXBlbGluZSAqCitydHBfcGlwZWxpbmVfY3JlYXRlIChjb25zdCBndWludDggKiBmcmFtZV9kYXRhLCBpbnQgZnJhbWVfZGF0YV9zaXplLAorICAgIGludCBmcmFtZV9jb3VudCwgY29uc3QgY2hhciAqZmlsdGVyY2FwcywgY29uc3QgY2hhciAqcGF5LCBjb25zdCBjaGFyICpkZXBheSkKK3sKKyAgZ2NoYXIgKnBpcGVsaW5lX25hbWU7CisgIHJ0cF9waXBlbGluZSAqcDsKKyAgR3N0Q2FwcyAqY2FwczsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzLiAqLworICBpZiAoIWZyYW1lX2RhdGEgfHwgIXBheSB8fCAhZGVwYXkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIFJUUCBwaXBlbGluZS4gKi8KKyAgcCA9IChydHBfcGlwZWxpbmUgKikgbWFsbG9jIChzaXplb2YgKHJ0cF9waXBlbGluZSkpOworCisgIHAtPmZyYW1lX2RhdGEgPSBmcmFtZV9kYXRhOworICBwLT5mcmFtZV9kYXRhX3NpemUgPSBmcmFtZV9kYXRhX3NpemU7CisgIHAtPmZyYW1lX2NvdW50ID0gZnJhbWVfY291bnQ7CisgIHAtPmN1c3RvbV9ldmVudCA9IE5VTEw7CisKKyAgLyogQ3JlYXRlIGVsZW1lbnRzLiAqLworICBwaXBlbGluZV9uYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiJXMtJXMtcGlwZWxpbmUiLCBwYXksIGRlcGF5KTsKKyAgcC0+cGlwZWxpbmUgPSBnc3RfcGlwZWxpbmVfbmV3IChwaXBlbGluZV9uYW1lKTsKKyAgZ19mcmVlIChwaXBlbGluZV9uYW1lKTsKKyAgcC0+YXBwc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXBwc3JjIiwgTlVMTCk7CisgIHAtPnJ0cHBheSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAocGF5LCBOVUxMKTsKKyAgcC0+cnRwZGVwYXkgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKGRlcGF5LCBOVUxMKTsKKyAgcC0+ZmFrZXNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsIE5VTEwpOworCisgIC8qIE9uZSBvciBtb3JlIGVsZW1lbnRzIGFyZSBub3QgY3JlYXRlZCBzdWNjZXNzZnVsbHkgb3IgZmFpbGVkIHRvIGNyZWF0ZSBwPyAqLworICBpZiAoIXAtPnBpcGVsaW5lIHx8ICFwLT5hcHBzcmMgfHwgIXAtPnJ0cHBheSB8fCAhcC0+cnRwZGVwYXkgfHwgIXAtPmZha2VzaW5rKSB7CisgICAgLyogUmVsZWFzZSBjcmVhdGVkIGVsZW1lbnRzLiAqLworICAgIFJFTEVBU0VfRUxFTUVOVCAocC0+cGlwZWxpbmUpOworICAgIFJFTEVBU0VfRUxFTUVOVCAocC0+YXBwc3JjKTsKKyAgICBSRUxFQVNFX0VMRU1FTlQgKHAtPnJ0cHBheSk7CisgICAgUkVMRUFTRV9FTEVNRU5UIChwLT5ydHBkZXBheSk7CisgICAgUkVMRUFTRV9FTEVNRU5UIChwLT5mYWtlc2luayk7CisKKyAgICAvKiBSZWxlYXNlIGFsbG9jYXRlZCBtZW1vcnkuICovCisgICAgZnJlZSAocCk7CisKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8qIFNldCBzcmMgcHJvcGVydGllcy4gKi8KKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChmaWx0ZXJjYXBzKTsKKyAgZ19vYmplY3Rfc2V0IChwLT5hcHBzcmMsICJkby10aW1lc3RhbXAiLCBUUlVFLCAiY2FwcyIsIGNhcHMsCisgICAgICAiZm9ybWF0IiwgR1NUX0ZPUk1BVF9USU1FLCBOVUxMKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIC8qIEFkZCBlbGVtZW50cyB0byB0aGUgcGlwZWxpbmUuICovCisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwLT5waXBlbGluZSksIHAtPmFwcHNyYyk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwLT5waXBlbGluZSksIHAtPnJ0cHBheSk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwLT5waXBlbGluZSksIHAtPnJ0cGRlcGF5KTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHAtPnBpcGVsaW5lKSwgcC0+ZmFrZXNpbmspOworCisgIC8qIExpbmsgZWxlbWVudHMuICovCisgIGdzdF9lbGVtZW50X2xpbmsgKHAtPmFwcHNyYywgcC0+cnRwcGF5KTsKKyAgZ3N0X2VsZW1lbnRfbGluayAocC0+cnRwcGF5LCBwLT5ydHBkZXBheSk7CisgIGdzdF9lbGVtZW50X2xpbmsgKHAtPnJ0cGRlcGF5LCBwLT5mYWtlc2luayk7CisKKyAgcmV0dXJuIHA7Cit9CisKKy8qCisgKiBEZXN0cm95cyB0aGUgUlRQIHBpcGVsaW5lLgorICogQHBhcmFtIHAgUG9pbnRlciB0byB0aGUgUlRQIHBpcGVsaW5lLgorICovCitzdGF0aWMgdm9pZAorcnRwX3BpcGVsaW5lX2Rlc3Ryb3kgKHJ0cF9waXBlbGluZSAqIHApCit7CisgIC8qIENoZWNrIHBhcmFtZXRlcnMuICovCisgIGlmIChwID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBSZWxlYXNlIHBpcGVsaW5lLiAqLworICBSRUxFQVNFX0VMRU1FTlQgKHAtPnBpcGVsaW5lKTsKKworICAvKiBSZWxlYXNlIGFsbG9jYXRlZCBtZW1vcnkuICovCisgIGZyZWUgKHApOworfQorCitzdGF0aWMgR3N0UGFkUHJvYmVSZXR1cm4KK3BheV9ldmVudF9wcm9iZV9jYiAoR3N0UGFkICogcGFkLCBHc3RQYWRQcm9iZUluZm8gKiBpbmZvLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIHJ0cF9waXBlbGluZSAqcCA9IChydHBfcGlwZWxpbmUgKikgdXNlcl9kYXRhOworICBHc3RFdmVudCAqZXZlbnQgPSBHU1RfUEFEX1BST0JFX0lORk9fREFUQSAoaW5mbyk7CisKKyAgaWYgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX0NVU1RPTV9ET1dOU1RSRUFNKSB7CisgICAgY29uc3QgR3N0U3RydWN0dXJlICpzMCA9IGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChwLT5jdXN0b21fZXZlbnQpOworICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqczEgPSBnc3RfZXZlbnRfZ2V0X3N0cnVjdHVyZSAoZXZlbnQpOworICAgIGlmIChnc3Rfc3RydWN0dXJlX2lzX2VxdWFsIChzMCwgczEpKSB7CisgICAgICByZXR1cm4gR1NUX1BBRF9QUk9CRV9EUk9QOworICAgIH0KKyAgfQorCisgIHJldHVybiBHU1RfUEFEX1BST0JFX09LOworfQorCitzdGF0aWMgR3N0UGFkUHJvYmVSZXR1cm4KK2RlcGF5X2V2ZW50X3Byb2JlX2NiIChHc3RQYWQgKiBwYWQsIEdzdFBhZFByb2JlSW5mbyAqIGluZm8sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgcnRwX3BpcGVsaW5lICpwID0gKHJ0cF9waXBlbGluZSAqKSB1c2VyX2RhdGE7CisgIEdzdEV2ZW50ICpldmVudCA9IEdTVF9QQURfUFJPQkVfSU5GT19EQVRBIChpbmZvKTsKKworICBpZiAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSA9PSBHU1RfRVZFTlRfQ1VTVE9NX0RPV05TVFJFQU0pIHsKKyAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnMwID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUgKHAtPmN1c3RvbV9ldmVudCk7CisgICAgY29uc3QgR3N0U3RydWN0dXJlICpzMSA9IGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChldmVudCk7CisgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfaXNfZXF1YWwgKHMwLCBzMSkpIHsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAocC0+Y3VzdG9tX2V2ZW50KTsKKyAgICAgIHAtPmN1c3RvbV9ldmVudCA9IE5VTEw7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEdTVF9QQURfUFJPQkVfT0s7Cit9CisKKy8qCisgKiBSdW5zIHRoZSBSVFAgcGlwZWxpbmUuCisgKiBAcGFyYW0gcCBQb2ludGVyIHRvIHRoZSBSVFAgcGlwZWxpbmUuCisgKi8KK3N0YXRpYyB2b2lkCitydHBfcGlwZWxpbmVfcnVuIChydHBfcGlwZWxpbmUgKiBwKQoreworICBHc3RGbG93UmV0dXJuIGZsb3dfcmV0OworICBHTWFpbkxvb3AgKm1haW5sb29wID0gTlVMTDsKKyAgR3N0QnVzICpidXM7CisgIGdpbnQgaSwgajsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzLiAqLworICBpZiAocCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogQ3JlYXRlIG1haW5sb29wLiAqLworICBtYWlubG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgRkFMU0UpOworICBpZiAoIW1haW5sb29wKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogQWRkIGJ1cyBjYWxsYmFjay4gKi8KKyAgYnVzID0gZ3N0X3BpcGVsaW5lX2dldF9idXMgKEdTVF9QSVBFTElORSAocC0+cGlwZWxpbmUpKTsKKworICBnc3RfYnVzX2FkZF93YXRjaCAoYnVzLCBydHBfYnVzX2NhbGxiYWNrLCAoZ3BvaW50ZXIpIG1haW5sb29wKTsKKworICAvKiBTZXQgcGlwZWxpbmUgdG8gUExBWUlORy4gKi8KKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwLT5waXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIC8qIFB1c2ggY3VzdG9tIGV2ZW50IGludG8gdGhlIHBpcGVsaW5lICovCisgIGlmIChwLT5jdXN0b21fZXZlbnQpIHsKKyAgICBHc3RQYWQgKnNyY3BhZDsKKworICAgIC8qIEluc3RhbGwgYSBwcm9iZSB0byBkcm9wIHRoZSBldmVudCBhZnRlciBpdCBiZWluZyBzZXJpYWxpemVkICovCisgICAgc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHAtPnJ0cHBheSwgInNyYyIpOworICAgIGdzdF9wYWRfYWRkX3Byb2JlIChzcmNwYWQsIEdTVF9QQURfUFJPQkVfVFlQRV9FVkVOVF9ET1dOU1RSRUFNLAorICAgICAgICBwYXlfZXZlbnRfcHJvYmVfY2IsIHAsIE5VTEwpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisKKyAgICAvKiBJbnN0YWxsIGEgcHJvYmUgdG8gdHJhY2UgdGhlIGRlc2VyaWFsaXplZCBldmVudCBhZnRlciBkZXBheWxvYWRpbmcgKi8KKyAgICBzcmNwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocC0+cnRwZGVwYXksICJzcmMiKTsKKyAgICBnc3RfcGFkX2FkZF9wcm9iZSAoc3JjcGFkLCBHU1RfUEFEX1BST0JFX1RZUEVfRVZFTlRfRE9XTlNUUkVBTSwKKyAgICAgICAgZGVwYXlfZXZlbnRfcHJvYmVfY2IsIHAsIE5VTEwpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisgICAgLyogU2VuZCB0aGUgZXZlbnQgKi8KKyAgICBnc3RfZWxlbWVudF9zZW5kX2V2ZW50IChwLT5hcHBzcmMsIGdzdF9ldmVudF9yZWYgKHAtPmN1c3RvbV9ldmVudCkpOworICB9CisKKyAgLyogUHVzaCBkYXRhIGludG8gdGhlIHBpcGVsaW5lICovCisgIGZvciAoaSA9IDA7IGkgPCBMT09QX0NPVU5UOyBpKyspIHsKKyAgICBjb25zdCBndWludDggKmRhdGEgPSBwLT5mcmFtZV9kYXRhOworCisgICAgZm9yIChqID0gMDsgaiA8IHAtPmZyYW1lX2NvdW50OyBqKyspIHsKKyAgICAgIEdzdEJ1ZmZlciAqYnVmOworCisgICAgICBidWYgPQorICAgICAgICAgIGdzdF9idWZmZXJfbmV3X3dyYXBwZWRfZnVsbCAoR1NUX01FTU9SWV9GTEFHX1JFQURPTkxZLAorICAgICAgICAgIChndWludDggKikgZGF0YSwgcC0+ZnJhbWVfZGF0YV9zaXplLCAwLCBwLT5mcmFtZV9kYXRhX3NpemUsIE5VTEwsCisgICAgICAgICAgTlVMTCk7CisKKyAgICAgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAocC0+YXBwc3JjLCAicHVzaC1idWZmZXIiLCBidWYsICZmbG93X3JldCk7CisgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChmbG93X3JldCwgR1NUX0ZMT1dfT0spOworICAgICAgZGF0YSArPSBwLT5mcmFtZV9kYXRhX3NpemU7CisKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgfQorICB9CisKKyAgZ19zaWduYWxfZW1pdF9ieV9uYW1lIChwLT5hcHBzcmMsICJlbmQtb2Ytc3RyZWFtIiwgJmZsb3dfcmV0KTsKKworICAvKiBSdW4gbWFpbmxvb3AuICovCisgIGdfbWFpbl9sb29wX3J1biAobWFpbmxvb3ApOworCisgIC8qIFNldCBwaXBlbGluZSB0byBOVUxMLiAqLworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHAtPnBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgLyogUmVsZWFzZSBtYWlubG9vcC4gKi8KKyAgZ19tYWluX2xvb3BfdW5yZWYgKG1haW5sb29wKTsKKworICBnc3RfYnVzX3JlbW92ZV93YXRjaCAoYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKworICBmYWlsX2lmIChwLT5jdXN0b21fZXZlbnQpOworfQorCisvKgorICogRW5hYmxlcyBidWZmZXIgbGlzdHMgYW5kIGFkZHMgYSBjaGFpbl9saXN0X2Z1bmN0aW9uIHRvIHRoZSBkZXBheWxvYWRlci4KKyAqIEBwYXJhbSBwIFBvaW50ZXIgdG8gdGhlIFJUUCBwaXBlbGluZS4KKyAqLworc3RhdGljIHZvaWQKK3J0cF9waXBlbGluZV9lbmFibGVfbGlzdHMgKHJ0cF9waXBlbGluZSAqIHApCit7CisgIEdzdFBhZCAqcGFkOworCisgIC8qIEFkZCBjaGFpbiBsaXN0IGZ1bmN0aW9uIGZvciB0aGUgYnVmZmVyIGxpc3QgdGVzdHMgKi8KKyAgcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHAtPnJ0cGRlcGF5LCAic2luayIpOworICBnc3RfcGFkX3NldF9jaGFpbl9saXN0X2Z1bmN0aW9uIChwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAocnRwX3BpcGVsaW5lX2NoYWluX2xpc3QpKTsKKyAgLyogLi4gdG8gc2F0aXNmeSB0aGlzIHNpbGx5IHRlc3QgY29kZSBpbiBjYXNlIHNvbWVvbmUgZGFyZXMgcHVzaCBhIGJ1ZmZlciAqLworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAocGFkLCBHU1RfREVCVUdfRlVOQ1BUUiAocnRwX3BpcGVsaW5lX2NoYWluKSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7Cit9CisKKy8qCisgKiBDcmVhdGVzIHRoZSBSVFAgcGlwZWxpbmUgYW5kIHJ1bnMgdGhlIHRlc3QgdXNpbmcgdGhlIHBpcGVsaW5lLgorICogQHBhcmFtIGZyYW1lX2RhdGEgUG9pbnRlciB0byB0aGUgZnJhbWUgZGF0YSB3aGljaCBpcyB1c2VkIHRvIHBhc3MgdGhydSBwYXkvZGVwYXlsb2FkZXJzLgorICogQHBhcmFtIGZyYW1lX2RhdGFfc2l6ZSBGcmFtZSBkYXRhIHNpemUgaW4gYnl0ZXMuCisgKiBAcGFyYW0gZnJhbWVfY291bnQgRnJhbWUgY291bnQuCisgKiBAcGFyYW0gZmlsdGVyY2FwcyBDYXBzIGZpbHRlcnMuCisgKiBAcGFyYW0gcGF5IFBheWxvYWRlciBuYW1lLgorICogQHBhcmFtIGRlcGF5IERlcGF5bG9hZGVyIG5hbWUuCisgKiBAYnl0ZXNfc2VudCBieXRlcyB0aGF0IHdpbGwgYmUgc2VudCwgdXNlZCB3aGVuIHRlc3RpbmcgYnVmZmVyIGxpc3RzCisgKiBAbXR1X3NpemUgc2V0IG10dSBzaXplIHdoZW4gdGVzdGluZyBsaXN0cworICogQHVzZV9saXN0cyBlbmFibGUgYnVmZmVyIGxpc3RzCisgKi8KK3N0YXRpYyB2b2lkCitydHBfcGlwZWxpbmVfdGVzdCAoY29uc3QgZ3VpbnQ4ICogZnJhbWVfZGF0YSwgaW50IGZyYW1lX2RhdGFfc2l6ZSwKKyAgICBpbnQgZnJhbWVfY291bnQsIGNvbnN0IGNoYXIgKmZpbHRlcmNhcHMsIGNvbnN0IGNoYXIgKnBheSwgY29uc3QgY2hhciAqZGVwYXksCisgICAgZ3VpbnQgYnl0ZXNfc2VudCwgZ3VpbnQgbXR1X3NpemUsIGdib29sZWFuIHVzZV9saXN0cykKK3sKKyAgLyogQ3JlYXRlIFJUUCBwaXBlbGluZS4gKi8KKyAgcnRwX3BpcGVsaW5lICpwID0KKyAgICAgIHJ0cF9waXBlbGluZV9jcmVhdGUgKGZyYW1lX2RhdGEsIGZyYW1lX2RhdGFfc2l6ZSwgZnJhbWVfY291bnQsIGZpbHRlcmNhcHMsCisgICAgICBwYXksIGRlcGF5KTsKKworICBpZiAocCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogc2V0IG10dSBzaXplIGlmIG5lZWRlZCAqLworICBpZiAobXR1X3NpemUgPiAwKSB7CisgICAgZ19vYmplY3Rfc2V0IChwLT5ydHBwYXksICJtdHUiLCBtdHVfc2l6ZSwgTlVMTCk7CisgIH0KKworICBpZiAodXNlX2xpc3RzKSB7CisgICAgcnRwX3BpcGVsaW5lX2VuYWJsZV9saXN0cyAocCk7CisgICAgY2hhaW5fbGlzdF9ieXRlc19yZWNlaXZlZCA9IDA7CisgIH0KKworICAvKiBSdW4gUlRQIHBpcGVsaW5lLiAqLworICBydHBfcGlwZWxpbmVfcnVuIChwKTsKKworICAvKiBEZXN0cm95IFJUUCBwaXBlbGluZS4gKi8KKyAgcnRwX3BpcGVsaW5lX2Rlc3Ryb3kgKHApOworCisgIGlmICh1c2VfbGlzdHMpIHsKKyAgICAvKiAnbmV4dCBOQUwnIGluZGljYXRvciBpcyA0IGJ5dGVzICovCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoY2hhaW5fbGlzdF9ieXRlc19yZWNlaXZlZCwgYnl0ZXNfc2VudCAqIExPT1BfQ09VTlQpOworICB9Cit9CisKK3N0YXRpYyBjb25zdCBndWludDggcnRwX2lsYmNfZnJhbWVfZGF0YVtdID0KKyAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK3N0YXRpYyBpbnQgcnRwX2lsYmNfZnJhbWVfZGF0YV9zaXplID0gMjA7CisKK3N0YXRpYyBpbnQgcnRwX2lsYmNfZnJhbWVfY291bnQgPSAxOworCitHU1RfU1RBUlRfVEVTVCAocnRwX2lsYmMpCit7CisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfaWxiY19mcmFtZV9kYXRhLCBydHBfaWxiY19mcmFtZV9kYXRhX3NpemUsCisgICAgICBydHBfaWxiY19mcmFtZV9jb3VudCwgImF1ZGlvL3gtaUxCQyxtb2RlPTIwIiwgInJ0cGlsYmNwYXkiLAorICAgICAgInJ0cGlsYmNkZXBheSIsIDAsIDAsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworc3RhdGljIGNvbnN0IGd1aW50OCBydHBfZ3NtX2ZyYW1lX2RhdGFbXSA9CisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgaW50IHJ0cF9nc21fZnJhbWVfZGF0YV9zaXplID0gMjA7CisKK3N0YXRpYyBpbnQgcnRwX2dzbV9mcmFtZV9jb3VudCA9IDE7CisKK0dTVF9TVEFSVF9URVNUIChydHBfZ3NtKQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2dzbV9mcmFtZV9kYXRhLCBydHBfZ3NtX2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9nc21fZnJhbWVfY291bnQsICJhdWRpby94LWdzbSxyYXRlPTgwMDAsY2hhbm5lbHM9MSIsICJydHBnc21wYXkiLAorICAgICAgInJ0cGdzbWRlcGF5IiwgMCwgMCwgRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9hbXJfZnJhbWVfZGF0YVtdID0KKyAgICB7IDB4M2MsIDB4MjQsIDB4MDMsIDB4YjMsIDB4NDgsIDB4MTAsIDB4NjgsIDB4NDYsIDB4NmMsIDB4ZWMsIDB4MDMsCisgIDB4N2EsIDB4MzcsIDB4MTYsIDB4NDEsIDB4NDEsIDB4YzAsIDB4MDAsIDB4MGQsIDB4Y2QsIDB4MTIsIDB4ZWQsCisgIDB4YWQsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MzEsIDB4MDAsIDB4MDAsIDB4MGQsIDB4YTAKK307CisKK3N0YXRpYyBpbnQgcnRwX2Ftcl9mcmFtZV9kYXRhX3NpemUgPSAzMjsKKworc3RhdGljIGludCBydHBfYW1yX2ZyYW1lX2NvdW50ID0gMTsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9hbXIpCit7CisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfYW1yX2ZyYW1lX2RhdGEsIHJ0cF9hbXJfZnJhbWVfZGF0YV9zaXplLAorICAgICAgcnRwX2Ftcl9mcmFtZV9jb3VudCwgImF1ZGlvL0FNUixjaGFubmVscz0xLHJhdGU9ODAwMCIsICJydHBhbXJwYXkiLAorICAgICAgInJ0cGFtcmRlcGF5IiwgMCwgMCwgRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9wY21hX2ZyYW1lX2RhdGFbXSA9CisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgaW50IHJ0cF9wY21hX2ZyYW1lX2RhdGFfc2l6ZSA9IDIwOworCitzdGF0aWMgaW50IHJ0cF9wY21hX2ZyYW1lX2NvdW50ID0gMTsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9wY21hKQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX3BjbWFfZnJhbWVfZGF0YSwgcnRwX3BjbWFfZnJhbWVfZGF0YV9zaXplLAorICAgICAgcnRwX3BjbWFfZnJhbWVfY291bnQsICJhdWRpby94LWFsYXcsY2hhbm5lbHM9MSxyYXRlPTgwMDAiLCAicnRwcGNtYXBheSIsCisgICAgICAicnRwcGNtYWRlcGF5IiwgMCwgMCwgRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9wY211X2ZyYW1lX2RhdGFbXSA9CisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgaW50IHJ0cF9wY211X2ZyYW1lX2RhdGFfc2l6ZSA9IDIwOworCitzdGF0aWMgaW50IHJ0cF9wY211X2ZyYW1lX2NvdW50ID0gMTsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9wY211KQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX3BjbXVfZnJhbWVfZGF0YSwgcnRwX3BjbXVfZnJhbWVfZGF0YV9zaXplLAorICAgICAgcnRwX3BjbXVfZnJhbWVfY291bnQsICJhdWRpby94LW11bGF3LGNoYW5uZWxzPTEscmF0ZT04MDAwIiwgInJ0cHBjbXVwYXkiLAorICAgICAgInJ0cHBjbXVkZXBheSIsIDAsIDAsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworc3RhdGljIGNvbnN0IGd1aW50OCBydHBfbXBhX2ZyYW1lX2RhdGFbXSA9CisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgaW50IHJ0cF9tcGFfZnJhbWVfZGF0YV9zaXplID0gMjA7CisKK3N0YXRpYyBpbnQgcnRwX21wYV9mcmFtZV9jb3VudCA9IDE7CisKK0dTVF9TVEFSVF9URVNUIChydHBfbXBhKQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX21wYV9mcmFtZV9kYXRhLCBydHBfbXBhX2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9tcGFfZnJhbWVfY291bnQsICJhdWRpby9tcGVnLG1wZWd2ZXJzaW9uPTEiLCAicnRwbXBhcGF5IiwKKyAgICAgICJydHBtcGFkZXBheSIsIDAsIDAsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9oMjYxX2ZyYW1lX2RhdGFbXSA9IHsKKyAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHg0YywgMHg0MCwgMHgwMCwKKyAgMHgxNSwgMHgxMCwKK307CisKK3N0YXRpYyBpbnQgcnRwX2gyNjFfZnJhbWVfZGF0YV9zaXplID0gMTQ7CitzdGF0aWMgaW50IHJ0cF9oMjYxX2ZyYW1lX2NvdW50ID0gMTsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9oMjYxKQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2gyNjFfZnJhbWVfZGF0YSwgcnRwX2gyNjFfZnJhbWVfZGF0YV9zaXplLAorICAgICAgcnRwX2gyNjFfZnJhbWVfY291bnQsICJ2aWRlby94LWgyNjEiLCAicnRwaDI2MXBheSIsICJydHBoMjYxZGVwYXkiLAorICAgICAgMCwgMCwgRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBjb25zdCBndWludDggcnRwX2gyNjNfZnJhbWVfZGF0YVtdID0KKyAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK3N0YXRpYyBpbnQgcnRwX2gyNjNfZnJhbWVfZGF0YV9zaXplID0gMjA7CisKK3N0YXRpYyBpbnQgcnRwX2gyNjNfZnJhbWVfY291bnQgPSAxOworCitHU1RfU1RBUlRfVEVTVCAocnRwX2gyNjMpCit7CisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfaDI2M19mcmFtZV9kYXRhLCBydHBfaDI2M19mcmFtZV9kYXRhX3NpemUsCisgICAgICBydHBfaDI2M19mcmFtZV9jb3VudCwKKyAgICAgICJ2aWRlby94LWgyNjMsdmFyaWFudD0oc3RyaW5nKWl0dSxoMjYzdmVyc2lvbj1oMjYzIiwKKyAgICAgICJydHBoMjYzcGF5IiwgInJ0cGgyNjNkZXBheSIsIDAsIDAsIEZBTFNFKTsKKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9oMjYzX2ZyYW1lX2RhdGEsIHJ0cF9oMjYzX2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9oMjYzX2ZyYW1lX2NvdW50LAorICAgICAgInZpZGVvL3gtaDI2Myx2YXJpYW50PShzdHJpbmcpaXR1LGgyNjN2ZXJzaW9uPWgyNjMsd2lkdGg9MTAsaGVpZ2h0PTIwIiwKKyAgICAgICJydHBoMjYzcGF5IiwgInJ0cGgyNjNkZXBheSIsIDAsIDAsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworc3RhdGljIGNvbnN0IGd1aW50OCBydHBfaDI2M3BfZnJhbWVfZGF0YVtdID0KKyAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK3N0YXRpYyBpbnQgcnRwX2gyNjNwX2ZyYW1lX2RhdGFfc2l6ZSA9IDIwOworCitzdGF0aWMgaW50IHJ0cF9oMjYzcF9mcmFtZV9jb3VudCA9IDE7CisKK0dTVF9TVEFSVF9URVNUIChydHBfaDI2M3ApCit7CisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfaDI2M3BfZnJhbWVfZGF0YSwgcnRwX2gyNjNwX2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9oMjYzcF9mcmFtZV9jb3VudCwgInZpZGVvL3gtaDI2Myx2YXJpYW50PShzdHJpbmcpaXR1LCIKKyAgICAgICJoMjYzdmVyc2lvbj0oc3RyaW5nKWgyNjMiLCAicnRwaDI2M3BwYXkiLCAicnRwaDI2M3BkZXBheSIsIDAsIDAsIEZBTFNFKTsKKworICAvKiBwYXlsb2FkZXIgc2hvdWxkIGFjY2VwdCBhbnkgaW5wdXQgdGhhdCBtYXRjaGVzIHRoZSB0ZW1wbGF0ZSBjYXBzCisgICAqIGlmIHRoZXJlJ3MganVzdCBhIHVkcHNpbmsgb3IgZmFrZXNpbmsgZG93bnN0cmVhbSAqLworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2gyNjNwX2ZyYW1lX2RhdGEsIHJ0cF9oMjYzcF9mcmFtZV9kYXRhX3NpemUsCisgICAgICBydHBfaDI2M3BfZnJhbWVfY291bnQsICJ2aWRlby94LWgyNjMsdmFyaWFudD0oc3RyaW5nKWl0dSwiCisgICAgICAiaDI2M3ZlcnNpb249KHN0cmluZyloMjYzIiwgInJ0cGgyNjNwcGF5IiwgImlkZW50aXR5IiwgMCwgMCwgRkFMU0UpOworCisgIC8qIGRlZmF1bHQgb3V0cHV0IG9mIGF2ZW5jX2gyNjNwICovCisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfaDI2M3BfZnJhbWVfZGF0YSwgcnRwX2gyNjNwX2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9oMjYzcF9mcmFtZV9jb3VudCwgInZpZGVvL3gtaDI2Myx2YXJpYW50PShzdHJpbmcpaXR1LCIKKyAgICAgICJoMjYzdmVyc2lvbj0oc3RyaW5nKWgyNjNwLCBhbm5leC1mPShib29sZWFuKXRydWUsICIKKyAgICAgICJhbm5leC1qPShib29sZWFuKXRydWUsIGFubmV4LWk9KGJvb2xlYW4pdHJ1ZSwgYW5uZXgtdD0oYm9vbGVhbil0cnVlIiwKKyAgICAgICJydHBoMjYzcHBheSIsICJpZGVudGl0eSIsIDAsIDAsIEZBTFNFKTsKKworICAvKiBwYXkgISBkZXBheSBzaG91bGQgYWxzbyB3b3JrIHdpdGggYW55IGlucHV0ICovCisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfaDI2M3BfZnJhbWVfZGF0YSwgcnRwX2gyNjNwX2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9oMjYzcF9mcmFtZV9jb3VudCwgInZpZGVvL3gtaDI2Myx2YXJpYW50PShzdHJpbmcpaXR1LCIKKyAgICAgICJoMjYzdmVyc2lvbj0oc3RyaW5nKWgyNjNwLCBhbm5leC1mPShib29sZWFuKXRydWUsICIKKyAgICAgICJhbm5leC1qPShib29sZWFuKXRydWUsIGFubmV4LWk9KGJvb2xlYW4pdHJ1ZSwgYW5uZXgtdD0oYm9vbGVhbil0cnVlIiwKKyAgICAgICJydHBoMjYzcHBheSIsICJydHBoMjYzcGRlcGF5IiwgMCwgMCwgRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9oMjY0X2ZyYW1lX2RhdGFbXSA9CisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgaW50IHJ0cF9oMjY0X2ZyYW1lX2RhdGFfc2l6ZSA9IDIwOworCitzdGF0aWMgaW50IHJ0cF9oMjY0X2ZyYW1lX2NvdW50ID0gMTsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9oMjY0KQoreworICAvKiBGSVhNRSAwLjExOiBmdWxseSBzcGVjaWZ5IGgyNjQgY2FwcyAoYW5kIG1ha2UgcGF5bG9hZGVyIGNoZWNrKSAqLworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2gyNjRfZnJhbWVfZGF0YSwgcnRwX2gyNjRfZnJhbWVfZGF0YV9zaXplLAorICAgICAgcnRwX2gyNjRfZnJhbWVfY291bnQsCisgICAgICAidmlkZW8veC1oMjY0LHN0cmVhbS1mb3JtYXQ9KHN0cmluZylieXRlLXN0cmVhbSxhbGlnbm1lbnQ9KHN0cmluZyluYWwiLAorICAgICAgInJ0cGgyNjRwYXkiLCAicnRwaDI2NGRlcGF5IiwgMCwgMCwgRkFMU0UpOworCisgIC8qIGNvbmZpZy1pbnRlcnZhbCBwcm9wZXJ0eSB1c2VkIHRvIGJlIG9mIHVpbnQgdHlwZSwgd2FzIGNoYW5nZWQgdG8gaW50LAorICAgKiBtYWtlIHN1cmUgb2xkIEdWYWx1ZSBzdHVmZiBzdGlsbCB3b3JrcyAqLworICB7CisgICAgR1ZhbHVlIHZhbCA9IEdfVkFMVUVfSU5JVDsKKyAgICBHc3RFbGVtZW50ICpydHBoMjY0cGF5OworICAgIEdQYXJhbVNwZWMgKnBzcGVjOworCisKKyAgICBydHBoMjY0cGF5ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwaDI2NHBheSIsIE5VTEwpOworICAgIHBzcGVjID0gZ19vYmplY3RfY2xhc3NfZmluZF9wcm9wZXJ0eSAoR19PQkpFQ1RfR0VUX0NMQVNTIChydHBoMjY0cGF5KSwKKyAgICAgICAgImNvbmZpZy1pbnRlcnZhbCIpOworICAgIGZhaWxfdW5sZXNzIChwc3BlYy0+dmFsdWVfdHlwZSA9PSBHX1RZUEVfSU5UKTsKKyAgICBnX3ZhbHVlX2luaXQgKCZ2YWwsIEdfVFlQRV9VSU5UKTsKKyAgICBnX3ZhbHVlX3NldF91aW50ICgmdmFsLCAxMCk7CisgICAgZ19vYmplY3Rfc2V0X3Byb3BlcnR5IChHX09CSkVDVCAocnRwaDI2NHBheSksICJjb25maWctaW50ZXJ2YWwiLCAmdmFsKTsKKyAgICBnX3ZhbHVlX3NldF91aW50ICgmdmFsLCAwKTsKKyAgICBnX29iamVjdF9nZXRfcHJvcGVydHkgKEdfT0JKRUNUIChydHBoMjY0cGF5KSwgImNvbmZpZy1pbnRlcnZhbCIsICZ2YWwpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDEwLCBnX3ZhbHVlX2dldF91aW50ICgmdmFsKSk7CisgICAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAocnRwaDI2NHBheSksICJjb25maWctaW50ZXJ2YWwiLCAtMSwgTlVMTCk7CisgICAgZ19vYmplY3RfZ2V0X3Byb3BlcnR5IChHX09CSkVDVCAocnRwaDI2NHBheSksICJjb25maWctaW50ZXJ2YWwiLCAmdmFsKTsKKyAgICBmYWlsX3VubGVzcyAoZ192YWx1ZV9nZXRfdWludCAoJnZhbCkgPT0gR19NQVhVSU5UKTsKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmdmFsKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChydHBoMjY0cGF5KTsKKyAgfQorfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIEgyNjQgZGF0YSBnZW5lcmF0ZWQgd2l0aDoKKyAqIHZpZGVvdGVzdHNyYyBwYXR0ZXJuPWJsYWNrICEgdmlkZW8veC1yYXcsd2lkdGg9MTYsaGVpZ2h0PTE2ICEgb3BlbmgyNjRlbmMgKi8KK3N0YXRpYyBjb25zdCBndWludDggaDI2NF8xNngxNl9ibGFja19ic1tdID0geworICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDY3LCAweDQyLCAweGQwLCAweDBiLAorICAweDhjLCAweDhkLCAweDRlLCAweDQwLCAweDNjLCAweDIyLCAweDExLCAweGE4LAorICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDY4LCAweGNlLCAweDNjLCAweDgwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDY1LCAweGI4LCAweDAwLCAweDA0LAorICAweDAwLCAweDAwLCAweDA5LCAweGU0LCAweGM1LCAweDAwLCAweDAxLCAweDE5LAorICAweGZjCit9OworCitzdGF0aWMgR3N0U2FtcGxlICoKK3J0cF9oMjY0ZGVwYXlfcnVuIChjb25zdCBnY2hhciAqIHN0cmVhbV9mb3JtYXQpCit7CisgIEdzdEhhcm5lc3MgKmg7CisgIEdzdFNhbXBsZSAqc2FtcGxlOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0RXZlbnQgKmU7CisgIEdzdENhcHMgKm91dF9jYXBzOworICBHc3RDYXBzICppbl9jYXBzOworICBnYm9vbGVhbiBzZWVuX2NhcHMgPSBGQUxTRTsKKyAgZ3NpemUgc2l6ZTsKKworICBoID0gZ3N0X2hhcm5lc3NfbmV3X3BhcnNlICgicnRwaDI2NHBheSAhIHJ0cGgyNjRkZXBheSIpOworCisgIC8qIE91ciBpbnB1dCBkYXRhIGlzIGluIGJ5dGUtc3RyZWFtIGZvcm1hdCAobm90IHRoYXQgaXQgbWF0dGVycykgKi8KKyAgaW5fY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWgyNjQiLAorICAgICAgInN0cmVhbS1mb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiYnl0ZS1zdHJlYW0iLAorICAgICAgImFsaWdubWVudCIsIEdfVFlQRV9TVFJJTkcsICJhdSIsCisgICAgICAicHJvZmlsZSIsIEdfVFlQRV9TVFJJTkcsICJiYXNlbGluZSIsCisgICAgICAid2lkdGgiLCBHX1RZUEVfSU5ULCAxNiwKKyAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCAxNiwgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLCAzMCwgMSwgTlVMTCk7CisKKyAgLyogRm9yY2UgcnRwaDI2NGRlcGF5IHRvIG91dHB1dCBmb3JtYXQgYXMgcmVxdWVzdGVkICovCisgIG91dF9jYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtaDI2NCIsCisgICAgICAic3RyZWFtLWZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsIHN0cmVhbV9mb3JtYXQsCisgICAgICAiYWxpZ25tZW50IiwgR19UWVBFX1NUUklORywgImF1IiwgTlVMTCk7CisKKyAgZ3N0X2hhcm5lc3Nfc2V0X2NhcHMgKGgsIGluX2NhcHMsIG91dF9jYXBzKTsKKyAgaW5fY2FwcyA9IE5VTEw7CisgIG91dF9jYXBzID0gTlVMTDsKKworICBnc3RfaGFybmVzc19wbGF5IChoKTsKKworICBzaXplID0gc2l6ZW9mIChoMjY0XzE2eDE2X2JsYWNrX2JzKTsKKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZ19tZW1kdXAgKGgyNjRfMTZ4MTZfYmxhY2tfYnMsIHNpemUpLCBzaXplKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2hhcm5lc3NfcHVzaCAoaCwgYnVmKSwgR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ3N0X2hhcm5lc3NfcHVzaF9ldmVudCAoaCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKworICB3aGlsZSAoKGUgPSBnc3RfaGFybmVzc190cnlfcHVsbF9ldmVudCAoaCkpKSB7CisgICAgaWYgKEdTVF9FVkVOVF9UWVBFIChlKSA9PSBHU1RfRVZFTlRfQ0FQUykgeworICAgICAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9jYXBzIChlLCAmY2Fwcyk7CisgICAgICBnc3RfY2Fwc19yZXBsYWNlICgmb3V0X2NhcHMsIGNhcHMpOworICAgICAgc2Vlbl9jYXBzID0gVFJVRTsKKyAgICB9CisgICAgZ3N0X2V2ZW50X3VucmVmIChlKTsKKyAgfQorICBmYWlsX3VubGVzcyAoc2Vlbl9jYXBzKTsKKworICBidWYgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgc2FtcGxlID0gZ3N0X3NhbXBsZV9uZXcgKGJ1Ziwgb3V0X2NhcHMsIE5VTEwsIE5VTEwpOworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICBnc3RfY2Fwc19yZXBsYWNlICgmb3V0X2NhcHMsIE5VTEwpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKKyAgcmV0dXJuIHNhbXBsZTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9oMjY0ZGVwYXlfYXZjKQoreworICBjb25zdCBHVmFsdWUgKnZhbDsKKyAgR3N0U3RydWN0dXJlICpzdDsKKyAgR3N0TWFwSW5mbyBtYXAgPSBHU1RfTUFQX0lORk9fSU5JVDsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdFNhbXBsZSAqczsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBzID0gcnRwX2gyNjRkZXBheV9ydW4gKCJhdmMiKTsKKworICAvKiBtdXN0IGhhdmUgY29kZWNfZGF0YSBpbiBvdXRwdXQgY2FwcyAqLworICBjYXBzID0gZ3N0X3NhbXBsZV9nZXRfY2FwcyAocyk7CisgIHN0ID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIEdTVF9MT0cgKCJjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisgIGZhaWxfdW5sZXNzIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAoc3QsICJzdHJlYW0tZm9ybWF0IikpOworICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHN0LCAiYWxpZ25tZW50IikpOworICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHN0LCAibGV2ZWwiKSk7CisgIGZhaWxfdW5sZXNzIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAoc3QsICJwcm9maWxlIikpOworICB2YWwgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3QsICJjb2RlY19kYXRhIik7CisgIGZhaWxfdW5sZXNzICh2YWwgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChHU1RfVkFMVUVfSE9MRFNfQlVGRkVSICh2YWwpKTsKKyAgLyogY2hlY2sgY29kZWNfZGF0YSwgc2hvdWxkbid0IGNvbnRhaW4gdHJhaWxpbmcgemVyb3MgKi8KKyAgYnVmID0gZ3N0X3ZhbHVlX2dldF9idWZmZXIgKHZhbCk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpKTsKKyAgeworICAgIGd1aW50IG51bV9zcHMsIG51bV9wcHMsIGxlbjsKKyAgICBndWludDggKmRhdGE7CisKKyAgICBHU1RfTUVNRFVNUCAoIkguMjY0IGNvZGVjX2RhdGEiLCBtYXAuZGF0YSwgbWFwLnNpemUpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG1hcC5kYXRhWzBdLCAxKTsKKyAgICBudW1fc3BzID0gbWFwLmRhdGFbNV0gJiAweDFmOworICAgIGRhdGEgPSBtYXAuZGF0YSArIDY7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobnVtX3NwcywgMSk7CisgICAgbGVuID0gR1NUX1JFQURfVUlOVDE2X0JFIChkYXRhKTsKKyAgICBkYXRhICs9IDI7CisgICAgLyogbWFrZSBzdXJlIHRoZXJlIGFyZSBubyB0cmFpbGluZyB6ZXJvcyBpbiB0aGUgU1BTICovCisgICAgZmFpbF91bmxlc3MgKGRhdGFbbGVuIC0gMV0gIT0gMCk7CisgICAgZGF0YSArPSBsZW47CisgICAgbnVtX3BwcyA9ICpkYXRhKys7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobnVtX3BwcywgMSk7CisgICAgbGVuID0gR1NUX1JFQURfVUlOVDE2X0JFIChkYXRhKTsKKyAgICBkYXRhICs9IDI7CisgICAgLyogbWFrZSBzdXJlIHRoZXJlIGFyZSBubyB0cmFpbGluZyB6ZXJvcyBpbiB0aGUgUFBTICovCisgICAgZmFpbF91bmxlc3MgKGRhdGFbbGVuIC0gMV0gIT0gMCk7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICBidWYgPSBnc3Rfc2FtcGxlX2dldF9idWZmZXIgKHMpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKSk7CisgIEdTVF9NRU1EVU1QICgiSC4yNjQgQVZDIGZyYW1lIiwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgZmFpbF91bmxlc3MgKG1hcC5zaXplID49IDQgKyAxMyk7CisgIC8qIFdhbnQgSURSIHNsaWNlIGFzIHZlcnkgZmlyc3QgdGhpbmcuCisgICAqIFdlIGFzc3VtZSBuYWwgc2l6ZSBtYXJrZXJzIGFyZSA0IGJ5dGVzIGhlcmUuICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG1hcC5kYXRhWzRdICYgMHgxZiwgNSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgZ3N0X3NhbXBsZV91bnJlZiAocyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9oMjY0ZGVwYXlfYnl0ZXN0cmVhbSkKK3sKKyAgR3N0Qnl0ZVJlYWRlciBicjsKKyAgR3N0U3RydWN0dXJlICpzdDsKKyAgR3N0TWFwSW5mbyBtYXAgPSBHU1RfTUFQX0lORk9fSU5JVDsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdFNhbXBsZSAqczsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ3VpbnQzMiBkdzsKKyAgZ3VpbnQ4IGI7CisgIGd1aW50IG9mZiwgbGVmdDsKKworICBzID0gcnRwX2gyNjRkZXBheV9ydW4gKCJieXRlLXN0cmVhbSIpOworCisgIC8qIG11c3Qgbm90IGhhdmUgY29kZWNfZGF0YSBpbiBvdXRwdXQgY2FwcyAqLworICBjYXBzID0gZ3N0X3NhbXBsZV9nZXRfY2FwcyAocyk7CisgIHN0ID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIEdTVF9MT0cgKCJjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisgIGZhaWxfaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzdCwgImNvZGVjX2RhdGEiKSk7CisKKyAgYnVmID0gZ3N0X3NhbXBsZV9nZXRfYnVmZmVyIChzKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCkpOworICBHU1RfTUVNRFVNUCAoIkguMjY0IGJ5dGUtc3RyZWFtIGZyYW1lIiwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgZmFpbF91bmxlc3MgKG1hcC5zaXplID4gNDApOworICBnc3RfYnl0ZV9yZWFkZXJfaW5pdCAoJmJyLCBtYXAuZGF0YSwgbWFwLnNpemUpOworICAvKiBXZSBhc3N1bWUgbmFsIHN5bmMgbWFya2VycyBhcmUgNCBieXRlcy4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZiciwgJmR3KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGR3LCAweDAwMDAwMDAxKTsKKyAgLyogV2FudCBTUFMgYXMgdmVyeSBmaXJzdCB0aGluZyAqLworICBmYWlsX3VubGVzcyAoZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAoJmJyLCAmYikpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChiICYgMHgxZiwgNyk7CisgIC8qIFRoZW4sIHdlIHdhbnQgdGhlIFBQUyAqLworICBsZWZ0ID0gZ3N0X2J5dGVfcmVhZGVyX2dldF9yZW1haW5pbmcgKCZicik7CisgIG9mZiA9IGdzdF9ieXRlX3JlYWRlcl9tYXNrZWRfc2Nhbl91aW50MzIgKCZiciwgMHhmZmZmZmZmZiwgMSwgMCwgbGVmdCk7CisgIGZhaWxfaWYgKG9mZiA9PSAoZ3VpbnQpIC0gMSk7CisgIGdzdF9ieXRlX3JlYWRlcl9za2lwICgmYnIsIG9mZiArIDQpOworICBmYWlsX3VubGVzcyAoZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAoJmJyLCAmYikpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChiICYgMHgxZiwgOCk7CisgIC8qIEZJWE1FOiBsb29rcyBsaWtlIHdlIGdldCB0d28gc2V0cyBvZiBTUFMvUFBTID8hICovCisgIGxlZnQgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3JlbWFpbmluZyAoJmJyKTsKKyAgb2ZmID0gZ3N0X2J5dGVfcmVhZGVyX21hc2tlZF9zY2FuX3VpbnQzMiAoJmJyLCAweGZmZmZmZmZmLCAxLCAwLCBsZWZ0KTsKKyAgZmFpbF9pZiAob2ZmID09IChndWludCkgLSAxKTsKKyAgZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZiciwgb2ZmICsgNCk7CisgIGxlZnQgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3JlbWFpbmluZyAoJmJyKTsKKyAgb2ZmID0gZ3N0X2J5dGVfcmVhZGVyX21hc2tlZF9zY2FuX3VpbnQzMiAoJmJyLCAweGZmZmZmZmZmLCAxLCAwLCBsZWZ0KTsKKyAgZmFpbF9pZiAob2ZmID09IChndWludCkgLSAxKTsKKyAgZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZiciwgb2ZmICsgNCk7CisgIC8qIEZpbmFsbHksIHdlIHdhbnQgYW4gSURSIHNsaWNlICovCisgIGxlZnQgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3JlbWFpbmluZyAoJmJyKTsKKyAgb2ZmID0gZ3N0X2J5dGVfcmVhZGVyX21hc2tlZF9zY2FuX3VpbnQzMiAoJmJyLCAweGZmZmZmZmZmLCAxLCAwLCBsZWZ0KTsKKyAgZmFpbF9pZiAob2ZmID09IChndWludCkgLSAxKTsKKyAgZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZiciwgb2ZmICsgNCk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQ4ICgmYnIsICZiKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGIgJiAweDFmLCA1KTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICBnc3Rfc2FtcGxlX3VucmVmIChzKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9oMjY0X2xpc3RfbHRfbXR1X2ZyYW1lX2RhdGFbXSA9CisgICAgLyogbm90IHBhY2tldGl6ZWQsIG5leHQgTkFMIHN0YXJ0cyB3aXRoIDAwMDEgKi8KK3sgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwKKyAgMHhhZCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwZCwgMHgxMAorfTsKKworc3RhdGljIGludCBydHBfaDI2NF9saXN0X2x0X210dV9mcmFtZV9kYXRhX3NpemUgPSAxNjsKKworc3RhdGljIGludCBydHBfaDI2NF9saXN0X2x0X210dV9mcmFtZV9jb3VudCA9IDI7CisKKy8qIE5BTCA9IDQgYnl0ZXMgKi8KKy8qIGFsc28gMiBieXRlcyBGVS1BIGhlYWRlciBlYWNoIHRpbWUgKi8KK3N0YXRpYyBpbnQgcnRwX2gyNjRfbGlzdF9sdF9tdHVfYnl0ZXNfc2VudCA9IDIgKiAoMTYgLSA0KTsKKworc3RhdGljIGludCBydHBfaDI2NF9saXN0X2x0X210dV9tdHVfc2l6ZSA9IDEwMjQ7CisKK0dTVF9TVEFSVF9URVNUIChydHBfaDI2NF9saXN0X2x0X210dSkKK3sKKyAgLyogRklYTUUgMC4xMTogZnVsbHkgc3BlY2lmeSBoMjY0IGNhcHMgKGFuZCBtYWtlIHBheWxvYWRlciBjaGVjaykgKi8KKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9oMjY0X2xpc3RfbHRfbXR1X2ZyYW1lX2RhdGEsCisgICAgICBydHBfaDI2NF9saXN0X2x0X210dV9mcmFtZV9kYXRhX3NpemUsIHJ0cF9oMjY0X2xpc3RfbHRfbXR1X2ZyYW1lX2NvdW50LAorICAgICAgInZpZGVvL3gtaDI2NCxzdHJlYW0tZm9ybWF0PShzdHJpbmcpYnl0ZS1zdHJlYW0sYWxpZ25tZW50PShzdHJpbmcpbmFsIiwKKyAgICAgICJydHBoMjY0cGF5IiwgInJ0cGgyNjRkZXBheSIsCisgICAgICBydHBfaDI2NF9saXN0X2x0X210dV9ieXRlc19zZW50LCBydHBfaDI2NF9saXN0X2x0X210dV9tdHVfc2l6ZSwgVFJVRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKK3N0YXRpYyBjb25zdCBndWludDggcnRwX2gyNjRfbGlzdF9sdF9tdHVfZnJhbWVfZGF0YV9hdmNbXSA9CisgICAgLyogcGFja2V0aXplZCBkYXRhICovCit7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsCisgIDB4YWQsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MGQsIDB4MDAKK307CisKKy8qIE5BTCA9IDQgYnl0ZXMgKi8KK3N0YXRpYyBpbnQgcnRwX2gyNjRfbGlzdF9sdF9tdHVfYnl0ZXNfc2VudF9hdmMgPSAyICogKDE2IC0gMiAqIDQpOworCisvL3N0YXRpYyBpbnQgcnRwX2gyNjRfbGlzdF9sdF9tdHVfbXR1X3NpemUgPSAxMDI0OworCitHU1RfU1RBUlRfVEVTVCAocnRwX2gyNjRfbGlzdF9sdF9tdHVfYXZjKQoreworICAvKiBGSVhNRSAwLjExOiBmdWxseSBzcGVjaWZ5IGgyNjQgY2FwcyAoYW5kIG1ha2UgcGF5bG9hZGVyIGNoZWNrKSAqLworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2gyNjRfbGlzdF9sdF9tdHVfZnJhbWVfZGF0YV9hdmMsCisgICAgICBydHBfaDI2NF9saXN0X2x0X210dV9mcmFtZV9kYXRhX3NpemUsIHJ0cF9oMjY0X2xpc3RfbHRfbXR1X2ZyYW1lX2NvdW50LAorICAgICAgInZpZGVvL3gtaDI2NCxzdHJlYW0tZm9ybWF0PShzdHJpbmcpYXZjLGFsaWdubWVudD0oc3RyaW5nKWF1LCIKKyAgICAgICJjb2RlY19kYXRhPShidWZmZXIpMDE2NDAwMTRmZmUxMDAxODY3NjQwMDE0YWNkOTQxNDFmYjAxMTAwMDAwMDMwMDE3NzM1OTQwMDBmMTQyOTk2MDAxMDAwNTY4ZWJlY2IyMmMiLAorICAgICAgInJ0cGgyNjRwYXkiLCAicnRwaDI2NGRlcGF5IiwKKyAgICAgIHJ0cF9oMjY0X2xpc3RfbHRfbXR1X2J5dGVzX3NlbnRfYXZjLCBydHBfaDI2NF9saXN0X2x0X210dV9tdHVfc2l6ZSwgVFJVRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKK3N0YXRpYyBjb25zdCBndWludDggcnRwX2gyNjRfbGlzdF9ndF9tdHVfZnJhbWVfZGF0YVtdID0KKyAgICAvKiBub3QgcGFja2V0aXplZCwgbmV4dCBOQUwgc3RhcnRzIHdpdGggMDAwMSAqLworeyAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwCit9OworCitzdGF0aWMgaW50IHJ0cF9oMjY0X2xpc3RfZ3RfbXR1X2ZyYW1lX2RhdGFfc2l6ZSA9IDY0OworCitzdGF0aWMgaW50IHJ0cF9oMjY0X2xpc3RfZ3RfbXR1X2ZyYW1lX2NvdW50ID0gMTsKKworLyogTkFMID0gNCBieXRlcy4gV2hlbiBkYXRhIGRvZXMgbm90IGZpdCBpbnRvIDEgbXR1LCAxIGJ5dGUgd2lsbCBiZSBza2lwcGVkICovCitzdGF0aWMgaW50IHJ0cF9oMjY0X2xpc3RfZ3RfbXR1X2J5dGVzX3NlbnQgPSAxICogKDY0IC0gNCkgLSAxOworCitzdGF0aWMgaW50IHJ0cF9oMjY0X2xpc3RfZ3RfbXR1X210eV9zaXplID0gMjg7CisKK0dTVF9TVEFSVF9URVNUIChydHBfaDI2NF9saXN0X2d0X210dSkKK3sKKyAgLyogRklYTUUgMC4xMTogZnVsbHkgc3BlY2lmeSBoMjY0IGNhcHMgKGFuZCBtYWtlIHBheWxvYWRlciBjaGVjaykgKi8KKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9oMjY0X2xpc3RfZ3RfbXR1X2ZyYW1lX2RhdGEsCisgICAgICBydHBfaDI2NF9saXN0X2d0X210dV9mcmFtZV9kYXRhX3NpemUsIHJ0cF9oMjY0X2xpc3RfZ3RfbXR1X2ZyYW1lX2NvdW50LAorICAgICAgInZpZGVvL3gtaDI2NCxzdHJlYW0tZm9ybWF0PShzdHJpbmcpYnl0ZS1zdHJlYW0sYWxpZ25tZW50PShzdHJpbmcpbmFsIiwKKyAgICAgICJydHBoMjY0cGF5IiwgInJ0cGgyNjRkZXBheSIsCisgICAgICBydHBfaDI2NF9saXN0X2d0X210dV9ieXRlc19zZW50LCBydHBfaDI2NF9saXN0X2d0X210dV9tdHlfc2l6ZSwgVFJVRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKK3N0YXRpYyBjb25zdCBndWludDggcnRwX2gyNjRfbGlzdF9ndF9tdHVfZnJhbWVfZGF0YV9hdmNbXSA9CisgICAgLyogcGFja2V0aXplZCBkYXRhICovCit7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKKy8qIE5BTCA9IDQgYnl0ZXMuIFdoZW4gZGF0YSBkb2VzIG5vdCBmaXQgaW50byAxIG10dSwgMSBieXRlIHdpbGwgYmUgc2tpcHBlZCAqLworc3RhdGljIGludCBydHBfaDI2NF9saXN0X2d0X210dV9ieXRlc19zZW50X2F2YyA9IDEgKiAoNjQgLSAyICogNCAtIDIgKiAxKTsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9oMjY0X2xpc3RfZ3RfbXR1X2F2YykKK3sKKyAgLyogRklYTUUgMC4xMTogZnVsbHkgc3BlY2lmeSBoMjY0IGNhcHMgKGFuZCBtYWtlIHBheWxvYWRlciBjaGVjaykgKi8KKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9oMjY0X2xpc3RfZ3RfbXR1X2ZyYW1lX2RhdGFfYXZjLAorICAgICAgcnRwX2gyNjRfbGlzdF9ndF9tdHVfZnJhbWVfZGF0YV9zaXplLCBydHBfaDI2NF9saXN0X2d0X210dV9mcmFtZV9jb3VudCwKKyAgICAgICJ2aWRlby94LWgyNjQsc3RyZWFtLWZvcm1hdD0oc3RyaW5nKWF2YyxhbGlnbm1lbnQ9KHN0cmluZylhdSwiCisgICAgICAiY29kZWNfZGF0YT0oYnVmZmVyKTAxNjQwMDE0ZmZlMTAwMTg2NzY0MDAxNGFjZDk0MTQxZmIwMTEwMDAwMDAzMDAxNzczNTk0MDAwZjE0Mjk5NjAwMTAwMDU2OGViZWNiMjJjIiwKKyAgICAgICJydHBoMjY0cGF5IiwgInJ0cGgyNjRkZXBheSIsCisgICAgICBydHBfaDI2NF9saXN0X2d0X210dV9ieXRlc19zZW50X2F2YywgcnRwX2gyNjRfbGlzdF9ndF9tdHVfbXR5X3NpemUsIFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBjb25zdCBndWludDggcnRwX2gyNjVfZnJhbWVfZGF0YVtdID0geworICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgaW50IHJ0cF9oMjY1X2ZyYW1lX2RhdGFfc2l6ZSA9IDIwOworCitzdGF0aWMgaW50IHJ0cF9oMjY1X2ZyYW1lX2NvdW50ID0gMTsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9oMjY1KQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2gyNjVfZnJhbWVfZGF0YSwgcnRwX2gyNjVfZnJhbWVfZGF0YV9zaXplLAorICAgICAgcnRwX2gyNjVfZnJhbWVfY291bnQsCisgICAgICAidmlkZW8veC1oMjY1LHN0cmVhbS1mb3JtYXQ9KHN0cmluZylieXRlLXN0cmVhbSxhbGlnbm1lbnQ9KHN0cmluZyluYWwiLAorICAgICAgInJ0cGgyNjVwYXkiLCAicnRwaDI2NWRlcGF5IiwgMCwgMCwgRkFMU0UpOworCisgIC8qIGNvbmZpZy1pbnRlcnZhbCBwcm9wZXJ0eSB1c2VkIHRvIGJlIG9mIHVpbnQgdHlwZSwgd2FzIGNoYW5nZWQgdG8gaW50LAorICAgKiBtYWtlIHN1cmUgb2xkIEdWYWx1ZSBzdHVmZiBzdGlsbCB3b3JrcyAqLworICB7CisgICAgR1ZhbHVlIHZhbCA9IEdfVkFMVUVfSU5JVDsKKyAgICBHc3RFbGVtZW50ICpydHBoMjY1cGF5OworICAgIEdQYXJhbVNwZWMgKnBzcGVjOworCisKKyAgICBydHBoMjY1cGF5ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwaDI2NXBheSIsIE5VTEwpOworICAgIHBzcGVjID0gZ19vYmplY3RfY2xhc3NfZmluZF9wcm9wZXJ0eSAoR19PQkpFQ1RfR0VUX0NMQVNTIChydHBoMjY1cGF5KSwKKyAgICAgICAgImNvbmZpZy1pbnRlcnZhbCIpOworICAgIGZhaWxfdW5sZXNzIChwc3BlYy0+dmFsdWVfdHlwZSA9PSBHX1RZUEVfSU5UKTsKKyAgICBnX3ZhbHVlX2luaXQgKCZ2YWwsIEdfVFlQRV9VSU5UKTsKKyAgICBnX3ZhbHVlX3NldF91aW50ICgmdmFsLCAxMCk7CisgICAgZ19vYmplY3Rfc2V0X3Byb3BlcnR5IChHX09CSkVDVCAocnRwaDI2NXBheSksICJjb25maWctaW50ZXJ2YWwiLCAmdmFsKTsKKyAgICBnX3ZhbHVlX3NldF91aW50ICgmdmFsLCAwKTsKKyAgICBnX29iamVjdF9nZXRfcHJvcGVydHkgKEdfT0JKRUNUIChydHBoMjY1cGF5KSwgImNvbmZpZy1pbnRlcnZhbCIsICZ2YWwpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDEwLCBnX3ZhbHVlX2dldF91aW50ICgmdmFsKSk7CisgICAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAocnRwaDI2NXBheSksICJjb25maWctaW50ZXJ2YWwiLCAtMSwgTlVMTCk7CisgICAgZ19vYmplY3RfZ2V0X3Byb3BlcnR5IChHX09CSkVDVCAocnRwaDI2NXBheSksICJjb25maWctaW50ZXJ2YWwiLCAmdmFsKTsKKyAgICBmYWlsX3VubGVzcyAoZ192YWx1ZV9nZXRfdWludCAoJnZhbCkgPT0gR19NQVhVSU5UKTsKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmdmFsKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChydHBoMjY1cGF5KTsKKyAgfQorfQorCitHU1RfRU5EX1RFU1Q7CitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9oMjY1X2xpc3RfbHRfbXR1X2ZyYW1lX2RhdGFbXSA9IHsKKyAgLyogbm90IHBhY2tldGl6ZWQsIG5leHQgTkFMVSBzdGFydHMgd2l0aCAweDAwMDAwMDAxICovCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAKK307CisKK3N0YXRpYyBpbnQgcnRwX2gyNjVfbGlzdF9sdF9tdHVfZnJhbWVfZGF0YV9zaXplID0gMTY7CisKK3N0YXRpYyBpbnQgcnRwX2gyNjVfbGlzdF9sdF9tdHVfZnJhbWVfY291bnQgPSAyOworCisvKiAzIGJ5dGVzIHN0YXJ0IGNvZGUgcHJlZml4ZWQgd2l0aCBvbmUgemVybyBieXRlLCBOQUxVIGhlYWRlciBpcyBpbiBwYXlsb2FkICovCitzdGF0aWMgaW50IHJ0cF9oMjY1X2xpc3RfbHRfbXR1X2J5dGVzX3NlbnQgPSAyICogKDE2IC0gMyAtIDEpOworCitzdGF0aWMgaW50IHJ0cF9oMjY1X2xpc3RfbHRfbXR1X210dV9zaXplID0gMTAyNDsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9oMjY1X2xpc3RfbHRfbXR1KQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2gyNjVfbGlzdF9sdF9tdHVfZnJhbWVfZGF0YSwKKyAgICAgIHJ0cF9oMjY1X2xpc3RfbHRfbXR1X2ZyYW1lX2RhdGFfc2l6ZSwgcnRwX2gyNjVfbGlzdF9sdF9tdHVfZnJhbWVfY291bnQsCisgICAgICAidmlkZW8veC1oMjY1LHN0cmVhbS1mb3JtYXQ9KHN0cmluZylieXRlLXN0cmVhbSxhbGlnbm1lbnQ9KHN0cmluZyluYWwiLAorICAgICAgInJ0cGgyNjVwYXkiLCAicnRwaDI2NWRlcGF5IiwgcnRwX2gyNjVfbGlzdF9sdF9tdHVfYnl0ZXNfc2VudCwKKyAgICAgIHJ0cF9oMjY1X2xpc3RfbHRfbXR1X210dV9zaXplLCBUUlVFKTsKK30KKworR1NUX0VORF9URVNUOworc3RhdGljIGNvbnN0IGd1aW50OCBydHBfaDI2NV9saXN0X2x0X210dV9mcmFtZV9kYXRhX2h2YzFbXSA9IHsKKyAgLyogcGFja2V0aXplZCBkYXRhICovCisgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCit9OworCisvKiBsZW5ndGggc2l6ZSBpcyAzIGJ5dGVzICovCitzdGF0aWMgaW50IHJ0cF9oMjY1X2xpc3RfbHRfbXR1X2J5dGVzX3NlbnRfaHZjMSA9IDIgKiAoMTYgLSAyICogMyk7CisKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9oMjY1X2xpc3RfbHRfbXR1X2h2YzEpCit7CisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfaDI2NV9saXN0X2x0X210dV9mcmFtZV9kYXRhX2h2YzEsCisgICAgICBydHBfaDI2NV9saXN0X2x0X210dV9mcmFtZV9kYXRhX3NpemUsIHJ0cF9oMjY1X2xpc3RfbHRfbXR1X2ZyYW1lX2NvdW50LAorICAgICAgInZpZGVvL3gtaDI2NSxzdHJlYW0tZm9ybWF0PShzdHJpbmcpaHZjMSxhbGlnbm1lbnQ9KHN0cmluZylhdSwiCisgICAgICAiY29kZWNfZGF0YT0oYnVmZmVyKTAxMDFjMDAwMDAwMDgwMDAwMDAwMDAwMDk5ZjAwMGZjZmRmOGY4MDAwMDAyMDNhMDAwMDEwIgorICAgICAgIjAxODQwMDEwYzAxZmZmZjAxYzAwMDAwMDMwMDgwMDAwMDAzMDAwMDAzMDA5OWFjMDkwMGExMDAwMTAwMzA0MjAxMDEwMWMwMCIKKyAgICAgICIwMDAwMzAwODAwMDAwMDMwMDAwMDMwMDk5YTAwYTA4MGYxZmUzNmJiYjUzNzc3MjVkNjAyZGMwNDA0MDQxMDAwMDAzMDAwMTAiCisgICAgICAiMDAwMDMwMDBhMDgwMGEyMDAwMTAwMDc0NDAxYzE3MmIwMjI0MCIsCisgICAgICAicnRwaDI2NXBheSIsICJydHBoMjY1ZGVwYXkiLCBydHBfaDI2NV9saXN0X2x0X210dV9ieXRlc19zZW50X2h2YzEsCisgICAgICBydHBfaDI2NV9saXN0X2x0X210dV9tdHVfc2l6ZSwgVFJVRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKK3N0YXRpYyBjb25zdCBndWludDggcnRwX2gyNjVfbGlzdF9ndF9tdHVfZnJhbWVfZGF0YVtdID0geworICAvKiBub3QgcGFja2V0aXplZCwgbmV4dCBOQUwgc3RhcnRzIHdpdGggMHgwMDAwMDEgKi8KKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgxMAorfTsKKworc3RhdGljIGNvbnN0IGludCBydHBfaDI2NV9saXN0X2d0X210dV9mcmFtZV9kYXRhX3NpemUgPSA2MjsKKworc3RhdGljIGNvbnN0IGludCBydHBfaDI2NV9saXN0X2d0X210dV9mcmFtZV9jb3VudCA9IDE7CisKKy8qIHN0YXJ0IGNvZGUgaXMgMyBieXRlcywgTkFMVSBoZWFkZXIgaXMgMiBieXRlcyAqLworc3RhdGljIGludCBydHBfaDI2NV9saXN0X2d0X210dV9ieXRlc19zZW50ID0gMSAqICg2MiAtIDMgLSAyKTsKKworc3RhdGljIGludCBydHBfaDI2NV9saXN0X2d0X210dV9tdHVfc2l6ZSA9IDI4OworCitHU1RfU1RBUlRfVEVTVCAocnRwX2gyNjVfbGlzdF9ndF9tdHUpCit7CisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfaDI2NV9saXN0X2d0X210dV9mcmFtZV9kYXRhLAorICAgICAgcnRwX2gyNjVfbGlzdF9ndF9tdHVfZnJhbWVfZGF0YV9zaXplLCBydHBfaDI2NV9saXN0X2d0X210dV9mcmFtZV9jb3VudCwKKyAgICAgICJ2aWRlby94LWgyNjUsc3RyZWFtLWZvcm1hdD0oc3RyaW5nKWJ5dGUtc3RyZWFtLGFsaWdubWVudD0oc3RyaW5nKW5hbCIsCisgICAgICAicnRwaDI2NXBheSIsICJydHBoMjY1ZGVwYXkiLCBydHBfaDI2NV9saXN0X2d0X210dV9ieXRlc19zZW50LAorICAgICAgcnRwX2gyNjVfbGlzdF9ndF9tdHVfbXR1X3NpemUsIFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9oMjY1X2xpc3RfZ3RfbXR1X2ZyYW1lX2RhdGFfaHZjMVtdID0geworICAvKiBwYWNrZXRpemVkIGRhdGEgKi8KKyAgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKKworLyogbGVuZ3RoIHNpemUgaXMgMyBieXRlcywgTkFMVSBoZWFkZXIgaXMgMiBieXRlcyAqLworc3RhdGljIGludCBydHBfaDI2NV9saXN0X2d0X210dV9ieXRlc19zZW50X2h2YzEgPSAxICogKDYyIC0gMiAqIDMgLSAyICogMik7CisKK0dTVF9TVEFSVF9URVNUIChydHBfaDI2NV9saXN0X2d0X210dV9odmMxKQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2gyNjVfbGlzdF9ndF9tdHVfZnJhbWVfZGF0YV9odmMxLAorICAgICAgcnRwX2gyNjVfbGlzdF9ndF9tdHVfZnJhbWVfZGF0YV9zaXplLCBydHBfaDI2NV9saXN0X2d0X210dV9mcmFtZV9jb3VudCwKKyAgICAgICJ2aWRlby94LWgyNjUsc3RyZWFtLWZvcm1hdD0oc3RyaW5nKWh2YzEsYWxpZ25tZW50PShzdHJpbmcpYXUsIgorICAgICAgImNvZGVjX2RhdGE9KGJ1ZmZlcikwMTAxYzAwMDAwMDA4MDAwMDAwMDAwMDA5OWYwMDBmY2ZkZjhmODAwMDAwMjAzYTAwMDAxMCIKKyAgICAgICIwMTg0MDAxMGMwMWZmZmYwMWMwMDAwMDAzMDA4MDAwMDAwMzAwMDAwMzAwOTlhYzA5MDBhMTAwMDEwMDMwNDIwMTAxMDFjMDAiCisgICAgICAiMDAwMDMwMDgwMDAwMDAzMDAwMDAzMDA5OWEwMGEwODBmMWZlMzZiYmI1Mzc3NzI1ZDYwMmRjMDQwNDA0MTAwMDAwMzAwMDEwIgorICAgICAgIjAwMDAzMDAwYTA4MDBhMjAwMDEwMDA3NDQwMWMxNzJiMDIyNDAiLAorICAgICAgInJ0cGgyNjVwYXkiLCAicnRwaDI2NWRlcGF5IiwgcnRwX2gyNjVfbGlzdF9ndF9tdHVfYnl0ZXNfc2VudF9odmMxLAorICAgICAgcnRwX2gyNjVfbGlzdF9ndF9tdHVfbXR1X3NpemUsIFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIEtMViBkYXRhIGZyb20gRGF5X0ZsaWdodC5tcGcgKi8KK3N0YXRpYyBjb25zdCBndWludDggcnRwX0tMVl9mcmFtZV9kYXRhW10gPSB7CisgIDB4MDYsIDB4MGUsIDB4MmIsIDB4MzQsIDB4MDIsIDB4MGIsIDB4MDEsIDB4MDEsCisgIDB4MGUsIDB4MDEsIDB4MDMsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4ODEsIDB4OTEsIDB4MDIsIDB4MDgsIDB4MDAsIDB4MDQsIDB4NmMsIDB4OGUsCisgIDB4MjAsIDB4MDMsIDB4ODMsIDB4ODUsIDB4NDEsIDB4MDEsIDB4MDEsIDB4MDUsCisgIDB4MDIsIDB4M2QsIDB4M2IsIDB4MDYsIDB4MDIsIDB4MTUsIDB4ODAsIDB4MDcsCisgIDB4MDIsIDB4MDEsIDB4NTIsIDB4MGIsIDB4MDMsIDB4NDUsIDB4NGYsIDB4NGUsCisgIDB4MGMsIDB4MGUsIDB4NDcsIDB4NjUsIDB4NmYsIDB4NjQsIDB4NjUsIDB4NzQsCisgIDB4NjksIDB4NjMsIDB4MjAsIDB4NTcsIDB4NDcsIDB4NTMsIDB4MzgsIDB4MzQsCisgIDB4MGQsIDB4MDQsIDB4NGQsIDB4YzQsIDB4ZGMsIDB4YmIsIDB4MGUsIDB4MDQsCisgIDB4YjEsIDB4YTgsIDB4NmMsIDB4ZmUsIDB4MGYsIDB4MDIsIDB4MWYsIDB4NGEsCisgIDB4MTAsIDB4MDIsIDB4MDAsIDB4ODUsIDB4MTEsIDB4MDIsIDB4MDAsIDB4NGIsCisgIDB4MTIsIDB4MDQsIDB4MjAsIDB4YzgsIDB4ZDIsIDB4N2QsIDB4MTMsIDB4MDQsCisgIDB4ZmMsIDB4ZGQsIDB4MDIsIDB4ZDgsIDB4MTQsIDB4MDQsIDB4ZmUsIDB4YjgsCisgIDB4Y2IsIDB4NjEsIDB4MTUsIDB4MDQsIDB4MDAsIDB4OGYsIDB4M2UsIDB4NjEsCisgIDB4MTYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDEsIDB4YzksIDB4MTcsIDB4MDQsCisgIDB4NGQsIDB4ZGQsIDB4OGMsIDB4MmEsIDB4MTgsIDB4MDQsIDB4YjEsIDB4YmUsCisgIDB4OWUsIDB4ZjQsIDB4MTksIDB4MDIsIDB4MGIsIDB4ODUsIDB4MjgsIDB4MDQsCisgIDB4NGQsIDB4ZGQsIDB4OGMsIDB4MmEsIDB4MjksIDB4MDQsIDB4YjEsIDB4YmUsCisgIDB4OWUsIDB4ZjQsIDB4MmEsIDB4MDIsIDB4MGIsIDB4ODUsIDB4MzgsIDB4MDEsCisgIDB4MmUsIDB4MzksIDB4MDQsIDB4MDAsIDB4OGQsIDB4ZDQsIDB4MjksIDB4MDEsCisgIDB4MDIsIDB4MWMsIDB4NWYKK307CisKK0dTVF9TVEFSVF9URVNUIChydHBfa2x2KQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX0tMVl9mcmFtZV9kYXRhLCBHX05fRUxFTUVOVFMgKHJ0cF9LTFZfZnJhbWVfZGF0YSksIDEsCisgICAgICAibWV0YS94LWtsdiwgcGFyc2VkPShib29sKXRydWUiLCAicnRwa2x2cGF5IiwgInJ0cGtsdmRlcGF5IiwgMCwgMCwgRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUIChydHBfa2x2X2ZyYWdtZW50ZWQpCit7CisgIC8qIGZvcmNlIHN1cGVyLXNtYWxsIG10dSBvZiA2MCB0byBmcmFnbWVudCBLTFYgdW5pdCAqLworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX0tMVl9mcmFtZV9kYXRhLCBzaXplb2YgKHJ0cF9LTFZfZnJhbWVfZGF0YSksIDEsCisgICAgICAibWV0YS94LWtsdiwgcGFyc2VkPShib29sKXRydWUiLCAicnRwa2x2cGF5IiwgInJ0cGtsdmRlcGF5IiwKKyAgICAgIHNpemVvZiAocnRwX0tMVl9mcmFtZV9kYXRhKSwgNjAsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9MMTZfZnJhbWVfZGF0YVtdID0KKyAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK3N0YXRpYyBpbnQgcnRwX0wxNl9mcmFtZV9kYXRhX3NpemUgPSAyMDsKKworc3RhdGljIGludCBydHBfTDE2X2ZyYW1lX2NvdW50ID0gMTsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9MMTYpCit7CisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfTDE2X2ZyYW1lX2RhdGEsIHJ0cF9MMTZfZnJhbWVfZGF0YV9zaXplLAorICAgICAgcnRwX0wxNl9mcmFtZV9jb3VudCwKKyAgICAgICJhdWRpby94LXJhdyxmb3JtYXQ9UzE2QkUscmF0ZT0xLGNoYW5uZWxzPTEsbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQiLAorICAgICAgInJ0cEwxNnBheSIsICJydHBMMTZkZXBheSIsIDAsIDAsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9MMjRfZnJhbWVfZGF0YVtdID0KKyAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK3N0YXRpYyBpbnQgcnRwX0wyNF9mcmFtZV9kYXRhX3NpemUgPSAyNDsKKworc3RhdGljIGludCBydHBfTDI0X2ZyYW1lX2NvdW50ID0gMTsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9MMjQpCit7CisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfTDI0X2ZyYW1lX2RhdGEsIHJ0cF9MMjRfZnJhbWVfZGF0YV9zaXplLAorICAgICAgcnRwX0wyNF9mcmFtZV9jb3VudCwKKyAgICAgICJhdWRpby94LXJhdyxmb3JtYXQ9UzI0QkUscmF0ZT0xLGNoYW5uZWxzPTEsbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQiLAorICAgICAgInJ0cEwyNHBheSIsICJydHBMMjRkZXBheSIsIDAsIDAsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworc3RhdGljIGNvbnN0IGd1aW50OCBydHBfbXAydF9mcmFtZV9kYXRhW10gPQorICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKKworc3RhdGljIGludCBydHBfbXAydF9mcmFtZV9kYXRhX3NpemUgPSAyMDsKKworc3RhdGljIGludCBydHBfbXAydF9mcmFtZV9jb3VudCA9IDE7CisKK0dTVF9TVEFSVF9URVNUIChydHBfbXAydCkKK3sKKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9tcDJ0X2ZyYW1lX2RhdGEsIHJ0cF9tcDJ0X2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9tcDJ0X2ZyYW1lX2NvdW50LCAidmlkZW8vbXBlZ3RzLHBhY2tldHNpemU9MTg4LHN5c3RlbXN0cmVhbT10cnVlIiwKKyAgICAgICJydHBtcDJ0cGF5IiwgInJ0cG1wMnRkZXBheSIsIDAsIDAsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworc3RhdGljIGNvbnN0IGd1aW50OCBydHBfbXA0dl9mcmFtZV9kYXRhW10gPQorICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKKworc3RhdGljIGludCBydHBfbXA0dl9mcmFtZV9kYXRhX3NpemUgPSAyMDsKKworc3RhdGljIGludCBydHBfbXA0dl9mcmFtZV9jb3VudCA9IDE7CisKK0dTVF9TVEFSVF9URVNUIChydHBfbXA0dikKK3sKKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9tcDR2X2ZyYW1lX2RhdGEsIHJ0cF9tcDR2X2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9tcDR2X2ZyYW1lX2NvdW50LCAidmlkZW8vbXBlZyxtcGVndmVyc2lvbj00LHN5c3RlbXN0cmVhbT1mYWxzZSIsCisgICAgICAicnRwbXA0dnBheSIsICJydHBtcDR2ZGVwYXkiLCAwLCAwLCBGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKK3N0YXRpYyBjb25zdCBndWludDggcnRwX21wNHZfbGlzdF9mcmFtZV9kYXRhW10gPQorICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKKworc3RhdGljIGludCBydHBfbXA0dl9saXN0X2ZyYW1lX2RhdGFfc2l6ZSA9IDIwOworCitzdGF0aWMgaW50IHJ0cF9tcDR2X2xpc3RfZnJhbWVfY291bnQgPSAxOworCitzdGF0aWMgaW50IHJ0cF9tcDR2X2xpc3RfYnl0ZXNfc2VudCA9IDEgKiAyMDsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9tcDR2X2xpc3QpCit7CisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfbXA0dl9saXN0X2ZyYW1lX2RhdGEsIHJ0cF9tcDR2X2xpc3RfZnJhbWVfZGF0YV9zaXplLAorICAgICAgcnRwX21wNHZfbGlzdF9mcmFtZV9jb3VudCwKKyAgICAgICJ2aWRlby9tcGVnLG1wZWd2ZXJzaW9uPTQsc3lzdGVtc3RyZWFtPWZhbHNlLGNvZGVjX2RhdGE9KGJ1ZmZlcikwMDAwMDFiMDAxIiwKKyAgICAgICJydHBtcDR2cGF5IiwgInJ0cG1wNHZkZXBheSIsIHJ0cF9tcDR2X2xpc3RfYnl0ZXNfc2VudCwgMCwgVFJVRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKK3N0YXRpYyBjb25zdCBndWludDggcnRwX21wNGdfZnJhbWVfZGF0YVtdID0KKyAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK3N0YXRpYyBpbnQgcnRwX21wNGdfZnJhbWVfZGF0YV9zaXplID0gMjA7CisKK3N0YXRpYyBpbnQgcnRwX21wNGdfZnJhbWVfY291bnQgPSAxOworCitHU1RfU1RBUlRfVEVTVCAocnRwX21wNGcpCit7CisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfbXA0Z19mcmFtZV9kYXRhLCBydHBfbXA0Z19mcmFtZV9kYXRhX3NpemUsCisgICAgICBydHBfbXA0Z19mcmFtZV9jb3VudCwKKyAgICAgICJ2aWRlby9tcGVnLG1wZWd2ZXJzaW9uPTQsc3lzdGVtc3RyZWFtPWZhbHNlLGNvZGVjX2RhdGE9KGJ1ZmZlcikwMDAwMDFiMDAxIiwKKyAgICAgICJydHBtcDRncGF5IiwgInJ0cG1wNGdkZXBheSIsIDAsIDAsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworc3RhdGljIGNvbnN0IGd1aW50OCBydHBfdGhlb3JhX2ZyYW1lX2RhdGFbXSA9CisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgaW50IHJ0cF90aGVvcmFfZnJhbWVfZGF0YV9zaXplID0gMjA7CisKK3N0YXRpYyBpbnQgcnRwX3RoZW9yYV9mcmFtZV9jb3VudCA9IDE7CisKK0dTVF9TVEFSVF9URVNUIChydHBfdGhlb3JhKQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX3RoZW9yYV9mcmFtZV9kYXRhLCBydHBfdGhlb3JhX2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF90aGVvcmFfZnJhbWVfY291bnQsICJ2aWRlby94LXRoZW9yYSIsICJydHB0aGVvcmFwYXkiLAorICAgICAgInJ0cHRoZW9yYWRlcGF5IiwgMCwgMCwgRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF92b3JiaXNfZnJhbWVfZGF0YVtdID0KKyAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK3N0YXRpYyBpbnQgcnRwX3ZvcmJpc19mcmFtZV9kYXRhX3NpemUgPSAyMDsKKworc3RhdGljIGludCBydHBfdm9yYmlzX2ZyYW1lX2NvdW50ID0gMTsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF92b3JiaXMpCit7CisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfdm9yYmlzX2ZyYW1lX2RhdGEsIHJ0cF92b3JiaXNfZnJhbWVfZGF0YV9zaXplLAorICAgICAgcnRwX3ZvcmJpc19mcmFtZV9jb3VudCwgImF1ZGlvL3gtdm9yYmlzIiwgInJ0cHZvcmJpc3BheSIsCisgICAgICAicnRwdm9yYmlzZGVwYXkiLCAwLCAwLCBGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKK3N0YXRpYyBjb25zdCBndWludDggcnRwX2pwZWdfZnJhbWVfZGF0YVtdID0KKyAgICB7IC8qIFNPRiAqLyAweEZGLCAweEMwLCAweDAwLCAweDExLCAweDA4LCAweDAwLCAweDA4LCAweDAwLCAweDA4LAorICAweDAzLCAweDAwLCAweDIxLCAweDA4LCAweDAxLCAweDExLCAweDA4LCAweDAyLCAweDExLCAweDA4LAorICAvKiBEUVQgKi8gMHhGRiwgMHhEQiwgMHgwMCwgMHg0MywgMHgwOCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgLyogREFUQSAqLyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgaW50IHJ0cF9qcGVnX2ZyYW1lX2RhdGFfc2l6ZSA9IHNpemVvZiAocnRwX2pwZWdfZnJhbWVfZGF0YSk7CisKK3N0YXRpYyBpbnQgcnRwX2pwZWdfZnJhbWVfY291bnQgPSAxOworCitHU1RfU1RBUlRfVEVTVCAocnRwX2pwZWcpCit7CisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfanBlZ19mcmFtZV9kYXRhLCBydHBfanBlZ19mcmFtZV9kYXRhX3NpemUsCisgICAgICBydHBfanBlZ19mcmFtZV9jb3VudCwgInZpZGVvL3gtanBlZyxoZWlnaHQ9NjQwLHdpZHRoPTQ4MCIsICJydHBqcGVncGF5IiwKKyAgICAgICJydHBqcGVnZGVwYXkiLCAwLCAwLCBGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9qcGVnX3dpZHRoX2dyZWF0ZXJfdGhhbl8yMDQwKQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2pwZWdfZnJhbWVfZGF0YSwgcnRwX2pwZWdfZnJhbWVfZGF0YV9zaXplLAorICAgICAgcnRwX2pwZWdfZnJhbWVfY291bnQsICJ2aWRlby94LWpwZWcsaGVpZ2h0PTIwNDgsd2lkdGg9NDgwIiwgInJ0cGpwZWdwYXkiLAorICAgICAgInJ0cGpwZWdkZXBheSIsIDAsIDAsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAocnRwX2pwZWdfaGVpZ2h0X2dyZWF0ZXJfdGhhbl8yMDQwKQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2pwZWdfZnJhbWVfZGF0YSwgcnRwX2pwZWdfZnJhbWVfZGF0YV9zaXplLAorICAgICAgcnRwX2pwZWdfZnJhbWVfY291bnQsICJ2aWRlby94LWpwZWcsaGVpZ2h0PTY0MCx3aWR0aD0yMDQ4IiwgInJ0cGpwZWdwYXkiLAorICAgICAgInJ0cGpwZWdkZXBheSIsIDAsIDAsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAocnRwX2pwZWdfd2lkdGhfYW5kX2hlaWdodF9ncmVhdGVyX3RoYW5fMjA0MCkKK3sKKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9qcGVnX2ZyYW1lX2RhdGEsIHJ0cF9qcGVnX2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9qcGVnX2ZyYW1lX2NvdW50LCAidmlkZW8veC1qcGVnLGhlaWdodD0yMDQ4LHdpZHRoPTIwNDgiLCAicnRwanBlZ3BheSIsCisgICAgICAicnRwanBlZ2RlcGF5IiwgMCwgMCwgRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBjb25zdCBndWludDggcnRwX2pwZWdfbGlzdF9mcmFtZV9kYXRhW10gPQorICAgIHsgLyogU09GICovIDB4RkYsIDB4QzAsIDB4MDAsIDB4MTEsIDB4MDgsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDgsCisgIDB4MDMsIDB4MDAsIDB4MjEsIDB4MDgsIDB4MDEsIDB4MTEsIDB4MDgsIDB4MDIsIDB4MTEsIDB4MDgsCisgIC8qIERRVCAqLyAweEZGLCAweERCLCAweDAwLCAweDQzLCAweDA4LAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAvKiBEQVRBICovIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK3N0YXRpYyBpbnQgcnRwX2pwZWdfbGlzdF9mcmFtZV9kYXRhX3NpemUgPSBzaXplb2YgKHJ0cF9qcGVnX2xpc3RfZnJhbWVfZGF0YSk7CisKK3N0YXRpYyBpbnQgcnRwX2pwZWdfbGlzdF9mcmFtZV9jb3VudCA9IDE7CisKK3N0YXRpYyBpbnQgcnRwX2pwZWdfbGlzdF9ieXRlc19zZW50ID0gMSAqIHNpemVvZiAocnRwX2pwZWdfbGlzdF9mcmFtZV9kYXRhKTsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9qcGVnX2xpc3QpCit7CisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfanBlZ19saXN0X2ZyYW1lX2RhdGEsIHJ0cF9qcGVnX2xpc3RfZnJhbWVfZGF0YV9zaXplLAorICAgICAgcnRwX2pwZWdfbGlzdF9mcmFtZV9jb3VudCwgInZpZGVvL3gtanBlZyxoZWlnaHQ9NjQwLHdpZHRoPTQ4MCIsCisgICAgICAicnRwanBlZ3BheSIsICJydHBqcGVnZGVwYXkiLCBydHBfanBlZ19saXN0X2J5dGVzX3NlbnQsIDAsIFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUIChydHBfanBlZ19saXN0X3dpZHRoX2dyZWF0ZXJfdGhhbl8yMDQwKQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2pwZWdfbGlzdF9mcmFtZV9kYXRhLCBydHBfanBlZ19saXN0X2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9qcGVnX2xpc3RfZnJhbWVfY291bnQsICJ2aWRlby94LWpwZWcsaGVpZ2h0PTIwNDgsd2lkdGg9NDgwIiwKKyAgICAgICJydHBqcGVncGF5IiwgInJ0cGpwZWdkZXBheSIsIHJ0cF9qcGVnX2xpc3RfYnl0ZXNfc2VudCwgMCwgVFJVRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9qcGVnX2xpc3RfaGVpZ2h0X2dyZWF0ZXJfdGhhbl8yMDQwKQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2pwZWdfbGlzdF9mcmFtZV9kYXRhLCBydHBfanBlZ19saXN0X2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9qcGVnX2xpc3RfZnJhbWVfY291bnQsICJ2aWRlby94LWpwZWcsaGVpZ2h0PTY0MCx3aWR0aD0yMDQ4IiwKKyAgICAgICJydHBqcGVncGF5IiwgInJ0cGpwZWdkZXBheSIsIHJ0cF9qcGVnX2xpc3RfYnl0ZXNfc2VudCwgMCwgVFJVRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9qcGVnX2xpc3Rfd2lkdGhfYW5kX2hlaWdodF9ncmVhdGVyX3RoYW5fMjA0MCkKK3sKKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9qcGVnX2xpc3RfZnJhbWVfZGF0YSwgcnRwX2pwZWdfbGlzdF9mcmFtZV9kYXRhX3NpemUsCisgICAgICBydHBfanBlZ19saXN0X2ZyYW1lX2NvdW50LCAidmlkZW8veC1qcGVnLGhlaWdodD0yMDQ4LHdpZHRoPTIwNDgiLAorICAgICAgInJ0cGpwZWdwYXkiLCAicnRwanBlZ2RlcGF5IiwgcnRwX2pwZWdfbGlzdF9ieXRlc19zZW50LCAwLCBUUlVFKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgdm9pZAorcnRwX2pwZWdfZG9fcGFja2V0X2xvc3MgKGdkb3VibGUgcHJvYiwgZ2ludCBudW1fZXhwZWN0ZWQpCit7CisgIEdzdEhhcm5lc3MgKmg7CisgIGdib29sZWFuIGVvcyA9IEZBTFNFOworICBnY2hhciAqczsKKyAgZ3VpbnQgaSwgYnVmZmVyX2NvdW50OworCisgIHMgPSBnX3N0cmR1cF9wcmludGYgKCJ2aWRlb3Rlc3RzcmMgcGF0dGVybj1iYWxsIG51bS1idWZmZXJzPTEwMCAhICIKKyAgICAgICJqcGVnZW5jIHF1YWxpdHk9NTAgISBydHBqcGVncGF5ICEgaWRlbnRpdHkgZHJvcC1wcm9iYWJpbGl0eT0lZyAhICIKKyAgICAgICJydHBqcGVnZGVwYXkiLCBwcm9iKTsKKyAgR1NUX0lORk8gKCJydW5uaW5nIHBpcGVsaW5lICVzIiwgcyk7CisgIGggPSBnc3RfaGFybmVzc19uZXdfcGFyc2UgKHMpOworICBnX2ZyZWUgKHMpOworCisgIGdzdF9oYXJuZXNzX3BsYXkgKGgpOworCisgIGRvIHsKKyAgICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgICBldmVudCA9IGdzdF9oYXJuZXNzX3B1bGxfZXZlbnQgKGgpOworICAgIGVvcyA9IChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID09IEdTVF9FVkVOVF9FT1MpOworICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICB9IHdoaWxlICghZW9zKTsKKworICBidWZmZXJfY291bnQgPSBnc3RfaGFybmVzc19idWZmZXJzX3JlY2VpdmVkIChoKTsKKyAgR1NUX0lORk8gKCJHb3QgJXUgYnVmZmVycyIsIGJ1ZmZlcl9jb3VudCk7CisKKyAgaWYgKG51bV9leHBlY3RlZCA+PSAwKSB7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobnVtX2V4cGVjdGVkLCBidWZmZXJfY291bnQpOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlcl9jb3VudDsgKytpKSB7CisgICAgR3N0QnVmZmVyICpidWY7CisgICAgR3N0TWFwSW5mbyBtYXA7CisgICAgZ3VpbnQxNiBzb2ksIGVvaTsKKworICAgIGJ1ZiA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICAgIGZhaWxfdW5sZXNzIChidWYgIT0gTlVMTCk7CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKSk7CisgICAgR1NUX01FTURVTVAgKCJqcGVnIGZyYW1lIiwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICBmYWlsX3VubGVzcyAobWFwLnNpemUgPiA0KTsKKyAgICBzb2kgPSBHU1RfUkVBRF9VSU5UMTZfQkUgKG1hcC5kYXRhKTsKKyAgICBmYWlsX3VubGVzcyAoc29pID09IDB4ZmZkOCwgImV4cGVjdGVkIEpQRUcgZnJhbWUgc3RhcnQgRkZEOCBub3QgJTAyWCIsIHNvaSk7CisgICAgZW9pID0gR1NUX1JFQURfVUlOVDE2X0JFIChtYXAuZGF0YSArIG1hcC5zaXplIC0gMik7CisgICAgZmFpbF91bmxlc3MgKGVvaSA9PSAweGZmZDksICJleHBlY3RlZCBKUEVHIGZyYW1lIGVuZCBGRkQ5IG5vdCAlMDJYIiwgZW9pKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIH0KKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9TVEFSVF9URVNUIChydHBfanBlZ19wYWNrZXRfbG9zcykKK3sKKyAgZ2RvdWJsZSBwcm9iYWJpbGl0aWVzW10gPSB7IDAuMCwgMC4wMDEsIDAuMDEsIDAuMSwgMC4yLCAwLjUsIDEuMCB9OworICBnaW50IG51bV9leHBlY3RlZFtdID0geyAxMDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMCB9OworCisgIEdTVF9JTkZPICgiU3RhcnQgaXRlcmF0aW9uICVkIiwgX19pX18pOworICBmYWlsX3VubGVzcyAoX19pX18gPCBHX05fRUxFTUVOVFMgKHByb2JhYmlsaXRpZXMpKTsKKyAgcnRwX2pwZWdfZG9fcGFja2V0X2xvc3MgKHByb2JhYmlsaXRpZXNbX19pX19dLCBudW1fZXhwZWN0ZWRbX19pX19dKTsKKyAgR1NUX0lORk8gKCJEb25lIHdpdGggaXRlcmF0aW9uICVkIiwgX19pX18pOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBjb25zdCBndWludDggcnRwX2c3MjlfZnJhbWVfZGF0YVtdID0KKyAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK3N0YXRpYyBpbnQgcnRwX2c3MjlfZnJhbWVfZGF0YV9zaXplID0gMjI7CisKK3N0YXRpYyBpbnQgcnRwX2c3MjlfZnJhbWVfY291bnQgPSAxOworCitHU1RfU1RBUlRfVEVTVCAocnRwX2c3MjkpCit7CisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfZzcyOV9mcmFtZV9kYXRhLCBydHBfZzcyOV9mcmFtZV9kYXRhX3NpemUsCisgICAgICBydHBfZzcyOV9mcmFtZV9jb3VudCwgImF1ZGlvL0c3MjkscmF0ZT04MDAwLGNoYW5uZWxzPTEiLCAicnRwZzcyOXBheSIsCisgICAgICAicnRwZzcyOWRlcGF5IiwgMCwgMCwgRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBjb25zdCBndWludDggcnRwX2dzdF9mcmFtZV9kYXRhW10gPQorICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKKworc3RhdGljIGludCBydHBfZ3N0X2ZyYW1lX2RhdGFfc2l6ZSA9IDIyOworCitzdGF0aWMgaW50IHJ0cF9nc3RfZnJhbWVfY291bnQgPSAxOworCitHU1RfU1RBUlRfVEVTVCAocnRwX2dzdF9jdXN0b21fZXZlbnQpCit7CisgIC8qIENyZWF0ZSBSVFAgcGlwZWxpbmUuICovCisgIHJ0cF9waXBlbGluZSAqcCA9CisgICAgICBydHBfcGlwZWxpbmVfY3JlYXRlIChydHBfZ3N0X2ZyYW1lX2RhdGEsIHJ0cF9nc3RfZnJhbWVfZGF0YV9zaXplLAorICAgICAgcnRwX2dzdF9mcmFtZV9jb3VudCwgImFwcGxpY2F0aW9uL3gtdGVzdCIsCisgICAgICAicnRwZ3N0cGF5IiwgInJ0cGdzdGRlcGF5Iik7CisKKyAgaWYgKHAgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorCisgIHAtPmN1c3RvbV9ldmVudCA9CisgICAgICBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9ET1dOU1RSRUFNLAorICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJ0ZXN0IiwgImZvbyIsIEdfVFlQRV9JTlQsIDEsIE5VTEwpKTsKKworICAvKiBSdW4gUlRQIHBpcGVsaW5lLiAqLworICBydHBfcGlwZWxpbmVfcnVuIChwKTsKKworICAvKiBEZXN0cm95IFJUUCBwaXBlbGluZS4gKi8KKyAgcnRwX3BpcGVsaW5lX2Rlc3Ryb3kgKHApOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUIChydHBfdm9yYmlzX3JlbmVnb3RpYXRlKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0RWxlbWVudCAqZW5jLCAqcGF5LCAqZGVwYXksICpkZWMsICpzaW5rOworICBHc3RQYWQgKnNpbmtwYWQsICpzcmNwYWQ7CisgIEdzdENhcHMgKnRlbXBsY2FwcywgKmNhcHMsICpmaWx0ZXIsICpzcmNjYXBzOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR3N0QXVkaW9JbmZvIGluZm87CisKKyAgcGlwZWxpbmUgPSBnc3RfcGlwZWxpbmVfbmV3IChOVUxMKTsKKyAgZW5jID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidm9yYmlzZW5jIiwgTlVMTCk7CisgIHBheSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cHZvcmJpc3BheSIsIE5VTEwpOworICBkZXBheSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cHZvcmJpc2RlcGF5IiwgTlVMTCk7CisgIGRlYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZvcmJpc2RlYyIsIE5VTEwpOworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzaW5rLCAiYXN5bmMiLCBGQUxTRSwgTlVMTCk7CisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgZW5jLCBwYXksIGRlcGF5LCBkZWMsIHNpbmssIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGlua19tYW55IChlbmMsIHBheSwgZGVwYXksIGRlYywgc2luaywgTlVMTCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIHNpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoZW5jLCAic2luayIpOworICBzcmNwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoZGVjLCAic3JjIik7CisKKyAgdGVtcGxjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHNpbmtwYWQpOworICBmaWx0ZXIgPQorICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcmF3IiwgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMiwgInJhdGUiLAorICAgICAgR19UWVBFX0lOVCwgNDQxMDAsIE5VTEwpOworICBjYXBzID0gZ3N0X2NhcHNfaW50ZXJzZWN0ICh0ZW1wbGNhcHMsIGZpbHRlcik7CisgIGNhcHMgPSBnc3RfY2Fwc19maXhhdGUgKGNhcHMpOworCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9zZW5kX2V2ZW50IChzaW5rcGFkLAorICAgICAgICAgIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgidGVzdCIpKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3NlbmRfZXZlbnQgKHNpbmtwYWQsIGdzdF9ldmVudF9uZXdfY2FwcyAoY2FwcykpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfc2VuZF9ldmVudCAoc2lua3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpKTsKKworICBnc3RfYXVkaW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBjYXBzKTsKKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg0NDEwMCAqIGluZm8uYnBmKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGdzdF9hdWRpb19mb3JtYXRfZmlsbF9zaWxlbmNlIChpbmZvLmZpbmZvLCBtYXAuZGF0YSwgbWFwLnNpemUpOworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKSA9IDA7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcikgPSAxICogR1NUX1NFQ09ORDsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcGFkX2NoYWluIChzaW5rcGFkLCBidWZmZXIpLCBHU1RfRkxPV19PSyk7CisKKyAgc3JjY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoc3JjcGFkKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2Nhbl9pbnRlcnNlY3QgKHNyY2NhcHMsIGNhcHMpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGZpbHRlcik7CisgIGZpbHRlciA9CisgICAgICBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAyLCAicmF0ZSIsCisgICAgICBHX1RZUEVfSU5ULCA0ODAwMCwgTlVMTCk7CisgIGNhcHMgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHRlbXBsY2FwcywgZmlsdGVyKTsKKyAgY2FwcyA9IGdzdF9jYXBzX2ZpeGF0ZSAoY2Fwcyk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfc2VuZF9ldmVudCAoc2lua3BhZCwgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSkpOworCisgIGdzdF9hdWRpb19pbmZvX2Zyb21fY2FwcyAoJmluZm8sIGNhcHMpOworICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDQ4MDAwICogaW5mby5icGYpOworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgZ3N0X2F1ZGlvX2Zvcm1hdF9maWxsX3NpbGVuY2UgKGluZm8uZmluZm8sIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIEdTVF9CVUZGRVJfUFRTIChidWZmZXIpID0gMDsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSA9IDEgKiBHU1RfU0VDT05EOworICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWZmZXIsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcGFkX2NoYWluIChzaW5rcGFkLCBidWZmZXIpLCBHU1RfRkxPV19PSyk7CisKKyAgc3JjY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoc3JjcGFkKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2Nhbl9pbnRlcnNlY3QgKHNyY2NhcHMsIGNhcHMpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGZpbHRlcik7CisgIGdzdF9jYXBzX3VucmVmICh0ZW1wbGNhcHMpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyoKKyAqIENyZWF0ZXMgdGhlIHRlc3Qgc3VpdGUuCisgKgorICogUmV0dXJuczogcG9pbnRlciB0byB0aGUgdGVzdCBzdWl0ZS4KKyAqLworc3RhdGljIFN1aXRlICoKK3J0cF9wYXlsb2FkaW5nX3N1aXRlICh2b2lkKQoreworICBHc3RSZWdpc3RyeSAqcmVnaXN0cnkgPSBnc3RfcmVnaXN0cnlfZ2V0ICgpOworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoInJ0cF9kYXRhX3Rlc3QiKTsKKworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJsaW5lYXIiKTsKKworICAvKiBTZXQgdGltZW91dCB0byA2MCBzZWNvbmRzLiAqLworICB0Y2FzZV9zZXRfdGltZW91dCAodGNfY2hhaW4sIDYwKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfaWxiYyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX2dzbSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX2Ftcik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX3BjbWEpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9wY211KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfbXBhKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfaDI2MSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX2gyNjMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9oMjYzcCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX2gyNjQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9oMjY0ZGVwYXlfYXZjKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfaDI2NGRlcGF5X2J5dGVzdHJlYW0pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9oMjY0X2xpc3RfbHRfbXR1KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfaDI2NF9saXN0X2x0X210dV9hdmMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9oMjY0X2xpc3RfZ3RfbXR1KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfaDI2NF9saXN0X2d0X210dV9hdmMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9oMjY1KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfaDI2NV9saXN0X2x0X210dSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX2gyNjVfbGlzdF9sdF9tdHVfaHZjMSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX2gyNjVfbGlzdF9ndF9tdHUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9oMjY1X2xpc3RfZ3RfbXR1X2h2YzEpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9rbHYpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9rbHZfZnJhZ21lbnRlZCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX0wxNik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX0wyNCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX21wMnQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9tcDR2KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfbXA0dl9saXN0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfbXA0Zyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX3RoZW9yYSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX3ZvcmJpcyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX2pwZWcpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9qcGVnX3dpZHRoX2dyZWF0ZXJfdGhhbl8yMDQwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfanBlZ19oZWlnaHRfZ3JlYXRlcl90aGFuXzIwNDApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9qcGVnX3dpZHRoX2FuZF9oZWlnaHRfZ3JlYXRlcl90aGFuXzIwNDApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9qcGVnX2xpc3QpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9qcGVnX2xpc3Rfd2lkdGhfZ3JlYXRlcl90aGFuXzIwNDApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9qcGVnX2xpc3RfaGVpZ2h0X2dyZWF0ZXJfdGhhbl8yMDQwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfanBlZ19saXN0X3dpZHRoX2FuZF9oZWlnaHRfZ3JlYXRlcl90aGFuXzIwNDApOworICBpZiAoZ3N0X3JlZ2lzdHJ5X2NoZWNrX2ZlYXR1cmVfdmVyc2lvbiAocmVnaXN0cnksICJqcGVnZW5jIiwgMSwgMCwgMCkKKyAgICAgICYmIGdzdF9yZWdpc3RyeV9jaGVja19mZWF0dXJlX3ZlcnNpb24gKHJlZ2lzdHJ5LCAidmlkZW90ZXN0c3JjIiwgMSwgMCwgMCkpCisgICAgdGNhc2VfYWRkX2xvb3BfdGVzdCAodGNfY2hhaW4sIHJ0cF9qcGVnX3BhY2tldF9sb3NzLCAwLCA3KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfZzcyOSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX2dzdF9jdXN0b21fZXZlbnQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF92b3JiaXNfcmVuZWdvdGlhdGUpOworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHJ0cF9wYXlsb2FkaW5nKQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYXV4LmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBhdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzZlMjc2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYXV4LmMKQEAgLTAsMCArMSw0MTggQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBDb2xsYWJvcmEgTHRkLgorICogICBAYXV0aG9yIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y29uc2lzdGVuY3ljaGVja2VyLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdHRlc3RjbG9jay5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKK3N0YXRpYyBnYm9vbGVhbiBzZW5kX3BpcGVsaW5lX2VvcyA9IEZBTFNFOworc3RhdGljIGdib29sZWFuIHJlY2VpdmVfcGlwZWxpbmVfZW9zID0gRkFMU0U7CisKK3N0YXRpYyB2b2lkCittZXNzYWdlX3JlY2VpdmVkIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBHc3RQaXBlbGluZSAqIGJpbikKK3sKKyAgR1NUX0lORk8gKCJidXMgbWVzc2FnZSBmcm9tIFwiJSIgR1NUX1BUUl9GT1JNQVQgIlwiOiAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSksIG1lc3NhZ2UpOworCisgIHN3aXRjaCAobWVzc2FnZS0+dHlwZSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfRU9TOgorICAgICAgaWYgKCFzdHJjbXAgKCJwaXBlbGluZV9zZW5kIiwKKyAgICAgICAgICAgICAgR1NUX09CSkVDVF9OQU1FIChHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpKSkpCisgICAgICAgIHNlbmRfcGlwZWxpbmVfZW9zID0gVFJVRTsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKCJwaXBlbGluZV9yZWNlaXZlIiwKKyAgICAgICAgICAgICAgR1NUX09CSkVDVF9OQU1FIChHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpKSkpCisgICAgICAgIHJlY2VpdmVfcGlwZWxpbmVfZW9zID0gVFJVRTsKKyAgICAgIGVsc2UKKyAgICAgICAgZmFpbCAoIlVua25vd24gcGlwZWxpbmU6ICVzIiwKKyAgICAgICAgICAgIEdTVF9PQkpFQ1RfTkFNRSAoR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9XQVJOSU5HOnsKKyAgICAgIEdFcnJvciAqZ2Vycm9yOworICAgICAgZ2NoYXIgKmRlYnVnOworCisgICAgICBnc3RfbWVzc2FnZV9wYXJzZV93YXJuaW5nIChtZXNzYWdlLCAmZ2Vycm9yLCAmZGVidWcpOworICAgICAgZ3N0X29iamVjdF9kZWZhdWx0X2Vycm9yIChHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpLCBnZXJyb3IsIGRlYnVnKTsKKyAgICAgIGdfZXJyb3JfZnJlZSAoZ2Vycm9yKTsKKyAgICAgIGdfZnJlZSAoZGVidWcpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX01FU1NBR0VfRVJST1I6eworICAgICAgR0Vycm9yICpnZXJyb3I7CisgICAgICBnY2hhciAqZGVidWc7CisKKyAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChtZXNzYWdlLCAmZ2Vycm9yLCAmZGVidWcpOworICAgICAgZ3N0X29iamVjdF9kZWZhdWx0X2Vycm9yIChHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpLCBnZXJyb3IsIGRlYnVnKTsKKyAgICAgIGdfZXJyb3JfZnJlZSAoZ2Vycm9yKTsKKyAgICAgIGdfZnJlZSAoZGVidWcpOworICAgICAgZmFpbCAoIkVycm9yISIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCit0eXBlZGVmIHN0cnVjdAoreworICBndWludCBjb3VudDsKKyAgZ3VpbnQgbmJfcGFja2V0czsKKyAgZ3VpbnQgZHJvcF9ldmVyeV9uX3BhY2tldHM7Cit9IFJUWFNlbmREYXRhOworCitzdGF0aWMgR3N0UGFkUHJvYmVSZXR1cm4KK3J0cHJ0eHNlbmRfc3JjcGFkX3Byb2JlIChHc3RQYWQgKiBwYWQsIEdzdFBhZFByb2JlSW5mbyAqIGluZm8sCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RQYWRQcm9iZVJldHVybiByZXQgPSBHU1RfUEFEX1BST0JFX09LOworCisgIGlmIChpbmZvLT50eXBlID09IChHU1RfUEFEX1BST0JFX1RZUEVfQlVGRkVSIHwgR1NUX1BBRF9QUk9CRV9UWVBFX1BVU0gpKSB7CisgICAgR3N0QnVmZmVyICpidWZmZXIgPSBHU1RfQlVGRkVSIChpbmZvLT5kYXRhKTsKKyAgICBSVFhTZW5kRGF0YSAqcnR4ZGF0YSA9IChSVFhTZW5kRGF0YSAqKSB1c2VyX2RhdGE7CisgICAgR3N0UlRQQnVmZmVyIHJ0cCA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisgICAgZ3VpbnQgcGF5bG9hZF90eXBlID0gMDsKKworICAgIGdzdF9ydHBfYnVmZmVyX21hcCAoYnVmZmVyLCBHU1RfTUFQX1JFQUQsICZydHApOworICAgIHBheWxvYWRfdHlwZSA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3R5cGUgKCZydHApOworCisgICAgLyogbWFpbiBzdHJlYW0gcGFja2V0cyAqLworICAgIGlmIChwYXlsb2FkX3R5cGUgPT0gOTYpIHsKKyAgICAgIC8qIGNvdW50IHBhY2tldHMgb2YgdGhlIG1haW4gc3RyZWFtICovCisgICAgICArK3J0eGRhdGEtPm5iX3BhY2tldHM7CisgICAgICAvKiBkcm9wIHNvbWUgcGFja2V0cyAqLworICAgICAgaWYgKHJ0eGRhdGEtPmNvdW50IDwgcnR4ZGF0YS0+ZHJvcF9ldmVyeV9uX3BhY2tldHMpIHsKKyAgICAgICAgKytydHhkYXRhLT5jb3VudDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGRyb3AgYSBwYWNrZXQgZXZlcnkgJ3J0eGRhdGEtPmNvdW50JyBwYWNrZXRzICovCisgICAgICAgIHJ0eGRhdGEtPmNvdW50ID0gMTsKKyAgICAgICAgcmV0ID0gR1NUX1BBRF9QUk9CRV9EUk9QOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiByZXRyYW5zbWlzc2lvbiBwYWNrZXRzICovCisgICAgfQorCisgICAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK29uX3J0cGJpbnJlY2VpdmVfcGFkX2FkZGVkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogbmV3UGFkLAorICAgIGdwb2ludGVyIGRhdGEpCit7CisgIEdzdEVsZW1lbnQgKnJ0cGRlcGF5bG9hZGVyID0gR1NUX0VMRU1FTlQgKGRhdGEpOworCisgIGdjaGFyICpwYWROYW1lID0gZ3N0X3BhZF9nZXRfbmFtZSAobmV3UGFkKTsKKyAgaWYgKGdfc3RyX2hhc19wcmVmaXggKHBhZE5hbWUsICJyZWN2X3J0cF9zcmNfIikpIHsKKyAgICBHc3RQYWQgKnNpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocnRwZGVwYXlsb2FkZXIsICJzaW5rIik7CisgICAgZ3N0X3BhZF9saW5rIChuZXdQYWQsIHNpbmtwYWQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworICB9CisgIGdfZnJlZSAocGFkTmFtZSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorb25fdGltZW91dCAoZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR3N0RXZlbnQgKmVvcyA9IGdzdF9ldmVudF9uZXdfZW9zICgpOworICBpZiAoIWdzdF9lbGVtZW50X3NlbmRfZXZlbnQgKEdTVF9FTEVNRU5UIChkYXRhKSwgZW9zKSkgeworICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBzZW5kIGVuZCBvZiBzdHJlYW0gZXZlbnQiKTsKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGVvcyk7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3JlcXVlc3RfYXV4X3JlY2VpdmUgKEdzdEVsZW1lbnQgKiBydHBiaW4sIGd1aW50IHNlc3NpZCwgR3N0RWxlbWVudCAqIHJlY2VpdmUpCit7CisgIEdzdEVsZW1lbnQgKmJpbjsKKyAgR3N0UGFkICpwYWQ7CisKKyAgR1NUX0lORk8gKCJjcmVhdGluZyBBVVggcmVjZWl2ZXIiKTsKKyAgYmluID0gZ3N0X2Jpbl9uZXcgKE5VTEwpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAoYmluKSwgcmVjZWl2ZSk7CisKKyAgcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHJlY2VpdmUsICJzcmMiKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoYmluLCBnc3RfZ2hvc3RfcGFkX25ldyAoInNyY18wIiwgcGFkKSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChyZWNlaXZlLCAic2luayIpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChiaW4sIGdzdF9naG9zdF9wYWRfbmV3ICgic2lua18wIiwgcGFkKSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisKKyAgcmV0dXJuIGJpbjsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorcmVxdWVzdF9hdXhfc2VuZCAoR3N0RWxlbWVudCAqIHJ0cGJpbiwgZ3VpbnQgc2Vzc2lkLCBHc3RFbGVtZW50ICogc2VuZCkKK3sKKyAgR3N0RWxlbWVudCAqYmluOworICBHc3RQYWQgKnBhZDsKKworICBHU1RfSU5GTyAoImNyZWF0aW5nIEFVWCBzZW5kZXIiKTsKKyAgYmluID0gZ3N0X2Jpbl9uZXcgKE5VTEwpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAoYmluKSwgc2VuZCk7CisKKyAgcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNlbmQsICJzcmMiKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoYmluLCBnc3RfZ2hvc3RfcGFkX25ldyAoInNyY18wIiwgcGFkKSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzZW5kLCAic2luayIpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChiaW4sIGdzdF9naG9zdF9wYWRfbmV3ICgic2lua18wIiwgcGFkKSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisKKyAgcmV0dXJuIGJpbjsKK30KKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9zaW1wbGVfcnRwYmluX2F1eCkKK3sKKyAgR3N0RWxlbWVudCAqYmluc2VuZCwgKnJ0cGJpbnNlbmQsICpzcmMsICplbmNvZGVyLCAqcnRwcGF5bG9hZGVyLAorICAgICAgKnJ0cHJ0eHNlbmQsICpzZW5kcnRwX3VkcHNpbmssICpzZW5kcnRjcF91ZHBzaW5rLCAqc2VuZHJ0Y3BfdWRwc3JjOworICBHc3RFbGVtZW50ICpiaW5yZWNlaXZlLCAqcnRwYmlucmVjZWl2ZSwgKnJlY3ZydHBfdWRwc3JjLCAqcmVjdnJ0Y3BfdWRwc3JjLAorICAgICAgKnJlY3ZydGNwX3VkcHNpbmssICpydHBydHhyZWNlaXZlLCAqcnRwZGVwYXlsb2FkZXIsICpkZWNvZGVyLCAqY29udmVydGVyLAorICAgICAgKnNpbms7CisgIEdzdEJ1cyAqYnVzc2VuZDsKKyAgR3N0QnVzICpidXNyZWNlaXZlOworICBnYm9vbGVhbiByZXM7CisgIEdzdENhcHMgKnJ0cGNhcHMgPSBOVUxMOworICBHc3RTdHJ1Y3R1cmUgKnB0X21hcDsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3RhdGVfcmVzID0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICBHc3RQYWQgKnNyY3BhZCA9IE5VTEw7CisgIGd1aW50IG5iX3J0eF9zZW5kX3BhY2tldHMgPSAwOworICBndWludCBuYl9ydHhfcmVjdl9wYWNrZXRzID0gMDsKKyAgUlRYU2VuZERhdGEgc2VuZF9ydHhkYXRhOworICBzZW5kX3J0eGRhdGEuY291bnQgPSAxOworICBzZW5kX3J0eGRhdGEubmJfcGFja2V0cyA9IDA7CisgIHNlbmRfcnR4ZGF0YS5kcm9wX2V2ZXJ5X25fcGFja2V0cyA9IDI1OworCisgIEdTVF9JTkZPICgicHJlcGFyaW5nIHRlc3QiKTsKKworICAvKiBidWlsZCBwaXBlbGluZSAqLworICBiaW5zZW5kID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lX3NlbmQiKTsKKyAgYnVzc2VuZCA9IGdzdF9lbGVtZW50X2dldF9idXMgKGJpbnNlbmQpOworICBnc3RfYnVzX2FkZF9zaWduYWxfd2F0Y2hfZnVsbCAoYnVzc2VuZCwgR19QUklPUklUWV9ISUdIKTsKKworICBiaW5yZWNlaXZlID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lX3JlY2VpdmUiKTsKKyAgYnVzcmVjZWl2ZSA9IGdzdF9lbGVtZW50X2dldF9idXMgKGJpbnJlY2VpdmUpOworICBnc3RfYnVzX2FkZF9zaWduYWxfd2F0Y2hfZnVsbCAoYnVzcmVjZWl2ZSwgR19QUklPUklUWV9ISUdIKTsKKworICBydHBiaW5zZW5kID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwYmluIiwgInJ0cGJpbnNlbmQiKTsKKyAgZ19vYmplY3Rfc2V0IChydHBiaW5zZW5kLCAibGF0ZW5jeSIsIDIwMCwgImRvLXJldHJhbnNtaXNzaW9uIiwgVFJVRSwgTlVMTCk7CisgIHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvdGVzdHNyYyIsICJzcmMiKTsKKyAgZW5jb2RlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImFsYXdlbmMiLCAiZW5jb2RlciIpOworICBydHBwYXlsb2FkZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBwY21hcGF5IiwgInJ0cHBheWxvYWRlciIpOworICBydHBydHhzZW5kID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwcnR4c2VuZCIsICJydHBydHhzZW5kIik7CisgIHNlbmRydHBfdWRwc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInVkcHNpbmsiLCAic2VuZHJ0cF91ZHBzaW5rIik7CisgIGdfb2JqZWN0X3NldCAoc2VuZHJ0cF91ZHBzaW5rLCAiaG9zdCIsICIxMjcuMC4wLjEiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzZW5kcnRwX3VkcHNpbmssICJwb3J0IiwgNTAwNiwgTlVMTCk7CisgIHNlbmRydGNwX3VkcHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1ZHBzaW5rIiwgInNlbmRydGNwX3VkcHNpbmsiKTsKKyAgZ19vYmplY3Rfc2V0IChzZW5kcnRjcF91ZHBzaW5rLCAiaG9zdCIsICIxMjcuMC4wLjEiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzZW5kcnRjcF91ZHBzaW5rLCAicG9ydCIsIDUwMDcsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNlbmRydGNwX3VkcHNpbmssICJzeW5jIiwgRkFMU0UsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNlbmRydGNwX3VkcHNpbmssICJhc3luYyIsIEZBTFNFLCBOVUxMKTsKKyAgc2VuZHJ0Y3BfdWRwc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidWRwc3JjIiwgInNlbmRydGNwX3VkcHNyYyIpOworICBnX29iamVjdF9zZXQgKHNlbmRydGNwX3VkcHNyYywgInBvcnQiLCA1MDA5LCBOVUxMKTsKKworICBydHBiaW5yZWNlaXZlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwYmluIiwgInJ0cGJpbnJlY2VpdmUiKTsKKyAgZ19vYmplY3Rfc2V0IChydHBiaW5yZWNlaXZlLCAibGF0ZW5jeSIsIDIwMCwgImRvLXJldHJhbnNtaXNzaW9uIiwgVFJVRSwgTlVMTCk7CisgIHJlY3ZydHBfdWRwc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidWRwc3JjIiwgInJlY3ZydHBfdWRwc3JjIik7CisgIGdfb2JqZWN0X3NldCAocmVjdnJ0cF91ZHBzcmMsICJwb3J0IiwgNTAwNiwgTlVMTCk7CisgIHJ0cGNhcHMgPQorICAgICAgZ3N0X2NhcHNfZnJvbV9zdHJpbmcKKyAgICAgICgiYXBwbGljYXRpb24veC1ydHAsbWVkaWE9KHN0cmluZylhdWRpbyxjbG9jay1yYXRlPShpbnQpODAwMCxlbmNvZGluZy1uYW1lPShzdHJpbmcpUENNQSxwYXlsb2FkPShpbnQpOTYiKTsKKyAgZ19vYmplY3Rfc2V0IChyZWN2cnRwX3VkcHNyYywgImNhcHMiLCBydHBjYXBzLCBOVUxMKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHJ0cGNhcHMpOworICByZWN2cnRjcF91ZHBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1ZHBzcmMiLCAicmVjdnJ0Y3BfdWRwc3JjIik7CisgIGdfb2JqZWN0X3NldCAocmVjdnJ0Y3BfdWRwc3JjLCAicG9ydCIsIDUwMDcsIE5VTEwpOworICByZWN2cnRjcF91ZHBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidWRwc2luayIsICJyZWN2cnRjcF91ZHBzaW5rIik7CisgIGdfb2JqZWN0X3NldCAocmVjdnJ0Y3BfdWRwc2luaywgImhvc3QiLCAiMTI3LjAuMC4xIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAocmVjdnJ0Y3BfdWRwc2luaywgInBvcnQiLCA1MDA5LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChyZWN2cnRjcF91ZHBzaW5rLCAic3luYyIsIEZBTFNFLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChyZWN2cnRjcF91ZHBzaW5rLCAiYXN5bmMiLCBGQUxTRSwgTlVMTCk7CisgIHJ0cHJ0eHJlY2VpdmUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBydHhyZWNlaXZlIiwgInJ0cHJ0eHJlY2VpdmUiKTsKKyAgcnRwZGVwYXlsb2FkZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBwY21hZGVwYXkiLCAicnRwZGVwYXlsb2FkZXIiKTsKKyAgZGVjb2RlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImFsYXdkZWMiLCAiZGVjb2RlciIpOworICBjb252ZXJ0ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJpZGVudGl0eSIsICJjb252ZXJ0ZXIiKTsKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgInNpbmsiKTsKKyAgZ19vYmplY3Rfc2V0IChzaW5rLCAic3luYyIsIFRSVUUsIE5VTEwpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKGJpbnNlbmQpLCBydHBiaW5zZW5kLCBzcmMsIGVuY29kZXIsIHJ0cHBheWxvYWRlciwKKyAgICAgIHNlbmRydHBfdWRwc2luaywgc2VuZHJ0Y3BfdWRwc2luaywgc2VuZHJ0Y3BfdWRwc3JjLCBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChiaW5yZWNlaXZlKSwgcnRwYmlucmVjZWl2ZSwKKyAgICAgIHJlY3ZydHBfdWRwc3JjLCByZWN2cnRjcF91ZHBzcmMsIHJlY3ZydGNwX3VkcHNpbmssCisgICAgICBydHBkZXBheWxvYWRlciwgZGVjb2RlciwgY29udmVydGVyLCBzaW5rLCBOVUxMKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChydHBiaW5yZWNlaXZlLCAicGFkLWFkZGVkIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKG9uX3J0cGJpbnJlY2VpdmVfcGFkX2FkZGVkKSwgcnRwZGVwYXlsb2FkZXIpOworCisgIHB0X21hcCA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1ydHAtcHQtbWFwIiwKKyAgICAgICI5NiIsIEdfVFlQRV9VSU5ULCA5OSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAocnRwcGF5bG9hZGVyLCAicHQiLCA5NiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAocnRwcGF5bG9hZGVyLCAic2VxbnVtLW9mZnNldCIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHJ0cHJ0eHNlbmQsICJwYXlsb2FkLXR5cGUtbWFwIiwgcHRfbWFwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChydHBydHhyZWNlaXZlLCAicGF5bG9hZC10eXBlLW1hcCIsIHB0X21hcCwgTlVMTCk7CisgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocHRfbWFwKTsKKworICAvKiBzZXQgcnRwIGF1eCByZWNlaXZlICovCisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cGJpbnJlY2VpdmUsICJyZXF1ZXN0LWF1eC1yZWNlaXZlciIsIChHQ2FsbGJhY2spCisgICAgICByZXF1ZXN0X2F1eF9yZWNlaXZlLCBydHBydHhyZWNlaXZlKTsKKyAgLyogc2V0IHJ0cCBhdXggc2VuZCAqLworICBnX3NpZ25hbF9jb25uZWN0IChydHBiaW5zZW5kLCAicmVxdWVzdC1hdXgtc2VuZGVyIiwgKEdDYWxsYmFjaykKKyAgICAgIHJlcXVlc3RfYXV4X3NlbmQsIHJ0cHJ0eHNlbmQpOworCisgIC8qIGdzdC1sYXVuY2gtMS4wIHJ0cGJpbiBuYW1lPXJ0cGJpbiBhdWRpb3Rlc3RzcmMgISBhbXJuYmVuYyAhIHJ0cGFtcnBheSAhIFwKKyAgICogcnRwYmluLnNlbmRfcnRwX3NpbmtfMSBydHBiaW4uc2VuZF9ydHBfc3JjXzEgISB1ZHBzaW5rIGhvc3Q9IjEyNy4wLjAuMSIgXAorICAgKiBwb3J0PTUwMDIgcnRwYmluLnNlbmRfcnRjcF9zcmNfMSAhIHVkcHNpbmsgaG9zdD0iMTI3LjAuMC4xIiBwb3J0PTUwMDMgXAorICAgKiBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlICB1ZHBzcmMgcG9ydD01MDA3ICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzEKKyAgICovCisKKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGluayAoc3JjLCBlbmNvZGVyKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGluayAoZW5jb2RlciwgcnRwcGF5bG9hZGVyKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0KKyAgICAgIGdzdF9lbGVtZW50X2xpbmtfcGFkc19mdWxsIChydHBwYXlsb2FkZXIsICJzcmMiLCBydHBiaW5zZW5kLAorICAgICAgInNlbmRfcnRwX3NpbmtfMCIsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0KKyAgICAgIGdzdF9lbGVtZW50X2xpbmtfcGFkc19mdWxsIChydHBiaW5zZW5kLCAic2VuZF9ydHBfc3JjXzAiLCBzZW5kcnRwX3VkcHNpbmssCisgICAgICAic2luayIsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0KKyAgICAgIGdzdF9lbGVtZW50X2xpbmtfcGFkc19mdWxsIChydHBiaW5zZW5kLCAic2VuZF9ydGNwX3NyY18wIiwKKyAgICAgIHNlbmRydGNwX3VkcHNpbmssICJzaW5rIiwgR1NUX1BBRF9MSU5LX0NIRUNLX05PVEhJTkcpOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworICByZXMgPQorICAgICAgZ3N0X2VsZW1lbnRfbGlua19wYWRzX2Z1bGwgKHNlbmRydGNwX3VkcHNyYywgInNyYyIsIHJ0cGJpbnNlbmQsCisgICAgICAicmVjdl9ydGNwX3NpbmtfMCIsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKworICBzcmNwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocnRwYmluc2VuZCwgInNlbmRfcnRwX3NyY18wIik7CisgIGdzdF9wYWRfYWRkX3Byb2JlIChzcmNwYWQsCisgICAgICAoR1NUX1BBRF9QUk9CRV9UWVBFX0JVRkZFUiB8IEdTVF9QQURfUFJPQkVfVFlQRV9QVVNIKSwKKyAgICAgIChHc3RQYWRQcm9iZUNhbGxiYWNrKSBydHBydHhzZW5kX3NyY3BhZF9wcm9iZSwgJnNlbmRfcnR4ZGF0YSwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisKKyAgLyogZ3N0LWxhdW5jaC0xLjAgcnRwYmluIG5hbWU9cnRwYmluIHVkcHNyYyBjYXBzPSJhcHBsaWNhdGlvbi94LXJ0cCxtZWRpYT0oc3RyaW5nKWF1ZGlvLCBcCisgICAqIGNsb2NrLXJhdGU9KGludCk4MDAwLGVuY29kaW5nLW5hbWU9KHN0cmluZylBTVIsZW5jb2RpbmctcGFyYW1zPShzdHJpbmcpMSxvCisgICAqIGN0ZXQtYWxpZ249KHN0cmluZykxIiBwb3J0PTUwMDIgISBydHBiaW4ucmVjdl9ydHBfc2lua18xIHJ0cGJpbi4gISBydHBhbXJkZXBheSAhIFwKKyAgICogYW1ybmJkZWMgISBmYWtlc2luayBzeW5jPVRydWUgIHVkcHNyYyBwb3J0PTUwMDMgISBydHBiaW4ucmVjdl9ydGNwX3NpbmtfMSBcCisgICAqIHJ0cGJpbi5zZW5kX3J0Y3Bfc3JjXzEgISB1ZHBzaW5rIGhvc3Q9IjEyNy4wLjAuMSIgcG9ydD01MDA3IHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UKKyAgICovCisKKyAgcmVzID0KKyAgICAgIGdzdF9lbGVtZW50X2xpbmtfcGFkc19mdWxsIChyZWN2cnRwX3VkcHNyYywgInNyYyIsIHJ0cGJpbnJlY2VpdmUsCisgICAgICAicmVjdl9ydHBfc2lua18wIiwgR1NUX1BBRF9MSU5LX0NIRUNLX05PVEhJTkcpOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworICByZXMgPQorICAgICAgZ3N0X2VsZW1lbnRfbGlua19wYWRzX2Z1bGwgKHJ0cGRlcGF5bG9hZGVyLCAic3JjIiwgZGVjb2RlciwgInNpbmsiLAorICAgICAgR1NUX1BBRF9MSU5LX0NIRUNLX05PVEhJTkcpOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworICByZXMgPSBnc3RfZWxlbWVudF9saW5rIChkZWNvZGVyLCBjb252ZXJ0ZXIpOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworICByZXMgPQorICAgICAgZ3N0X2VsZW1lbnRfbGlua19wYWRzX2Z1bGwgKGNvbnZlcnRlciwgInNyYyIsIHNpbmssICJzaW5rIiwKKyAgICAgIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0KKyAgICAgIGdzdF9lbGVtZW50X2xpbmtfcGFkc19mdWxsIChyZWN2cnRjcF91ZHBzcmMsICJzcmMiLCBydHBiaW5yZWNlaXZlLAorICAgICAgInJlY3ZfcnRjcF9zaW5rXzAiLCBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgIHJlcyA9CisgICAgICBnc3RfZWxlbWVudF9saW5rX3BhZHNfZnVsbCAocnRwYmlucmVjZWl2ZSwgInNlbmRfcnRjcF9zcmNfMCIsCisgICAgICByZWN2cnRjcF91ZHBzaW5rLCAic2luayIsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChidXNzZW5kLCAibWVzc2FnZTo6ZXJyb3IiLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLAorICAgICAgYmluc2VuZCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1c3NlbmQsICJtZXNzYWdlOjp3YXJuaW5nIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwKKyAgICAgIGJpbnNlbmQpOworICBnX3NpZ25hbF9jb25uZWN0IChidXNzZW5kLCAibWVzc2FnZTo6ZW9zIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwKKyAgICAgIGJpbnNlbmQpOworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1c3JlY2VpdmUsICJtZXNzYWdlOjplcnJvciIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsCisgICAgICBiaW5yZWNlaXZlKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzcmVjZWl2ZSwgIm1lc3NhZ2U6Ondhcm5pbmciLAorICAgICAgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwgYmlucmVjZWl2ZSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1c3JlY2VpdmUsICJtZXNzYWdlOjplb3MiLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLAorICAgICAgYmlucmVjZWl2ZSk7CisKKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW5yZWNlaXZlLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbnNlbmQsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIGdfdGltZW91dF9hZGQgKDUwMDAsIG9uX3RpbWVvdXQsIGJpbnNlbmQpOworICBnX3RpbWVvdXRfYWRkICg1MDAwLCBvbl90aW1lb3V0LCBiaW5yZWNlaXZlKTsKKworICBHU1RfSU5GTyAoImVudGVyIG1haW5sb29wIik7CisgIHdoaWxlICghc2VuZF9waXBlbGluZV9lb3MgJiYgIXJlY2VpdmVfcGlwZWxpbmVfZW9zKQorICAgIGdfbWFpbl9jb250ZXh0X2l0ZXJhdGlvbiAoTlVMTCwgVFJVRSk7CisgIEdTVF9JTkZPICgiZXhpdCBtYWlubG9vcCIpOworCisgIC8qIGNoZWNrIHRoYXQgRkIgTkFDSyBpcyB3b3JraW5nICovCisgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKHJ0cHJ0eHNlbmQpLCAibnVtLXJ0eC1yZXF1ZXN0cyIsICZuYl9ydHhfc2VuZF9wYWNrZXRzLAorICAgICAgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKHJ0cHJ0eHJlY2VpdmUpLCAibnVtLXJ0eC1yZXF1ZXN0cyIsCisgICAgICAmbmJfcnR4X3JlY3ZfcGFja2V0cywgTlVMTCk7CisKKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW5zZW5kLCBHU1RfU1RBVEVfTlVMTCk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbnJlY2VpdmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIEdTVF9JTkZPICgibmJfcnR4X3NlbmRfcGFja2V0cyAlZCIsIG5iX3J0eF9zZW5kX3BhY2tldHMpOworICBHU1RfSU5GTyAoIm5iX3J0eF9yZWN2X3BhY2tldHMgJWQiLCBuYl9ydHhfcmVjdl9wYWNrZXRzKTsKKyAgZmFpbF9pZiAobmJfcnR4X3NlbmRfcGFja2V0cyA8IDEpOworICBmYWlsX2lmIChuYl9ydHhfcmVjdl9wYWNrZXRzIDwgMSk7CisKKyAgLyogY2xlYW51cCAqLworICBnc3RfYnVzX3JlbW92ZV9zaWduYWxfd2F0Y2ggKGJ1c3NlbmQpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXNzZW5kKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYmluc2VuZCk7CisKKyAgZ3N0X2J1c19yZW1vdmVfc2lnbmFsX3dhdGNoIChidXNyZWNlaXZlKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzcmVjZWl2ZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJpbnJlY2VpdmUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitydHBhdXhfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgicnRwYXV4Iik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICB0Y2FzZV9zZXRfdGltZW91dCAodGNfY2hhaW4sIDEwMDAwKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfc2ltcGxlX3J0cGJpbl9hdXgpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAocnRwYXV4KTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbi5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxY2Q2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbi5jCkBAIC0wLDAgKzEsOTI0IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIGdzdHJ0cGJpbgorICoKKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3R0ZXN0Y2xvY2suaD4KKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydGNwYnVmZmVyLmg+CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhZHMpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQ7CisgIEdzdFBhZCAqcGFkOworCisgIGVsZW1lbnQgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBzZXNzaW9uIiwgTlVMTCk7CisKKyAgcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChlbGVtZW50LCAicmVjdl9ydGNwX3NpbmsiKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfY2xlYW51cF9zZW5kKQoreworICBHc3RFbGVtZW50ICpydHBiaW47CisgIEdzdFBhZCAqcnRwX3NpbmssICpydHBfc3JjLCAqcnRjcF9zcmM7CisgIEdPYmplY3QgKnNlc3Npb247CisgIGdpbnQgY291bnQgPSAyOworCisgIHJ0cGJpbiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cGJpbiIsICJydHBiaW4iKTsKKworICB3aGlsZSAoY291bnQtLSkgeworICAgIC8qIHJlcXVlc3Qgc2Vzc2lvbiAwICovCisgICAgcnRwX3NpbmsgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgInNlbmRfcnRwX3NpbmtfMCIpOworICAgIGZhaWxfdW5sZXNzIChydHBfc2luayAhPSBOVUxMKTsKKyAgICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChydHBfc2luaywgInJ0cF9zaW5rIiwgMik7CisKKyAgICAvKiB0aGlzIHN0YXRpYyBwYWQgc2hvdWxkIGJlIGNyZWF0ZWQgYXV0b21hdGljYWxseSBub3cgKi8KKyAgICBydHBfc3JjID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHJ0cGJpbiwgInNlbmRfcnRwX3NyY18wIik7CisgICAgZmFpbF91bmxlc3MgKHJ0cF9zcmMgIT0gTlVMTCk7CisgICAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAocnRwX3NyYywgInJ0cF9zcmMiLCAyKTsKKworICAgIC8qIHdlIHNob3VsZCBiZSBhYmxlIHRvIGdldCBhbiBpbnRlcm5hbCBzZXNzaW9uIDAgbm93ICovCisgICAgZ19zaWduYWxfZW1pdF9ieV9uYW1lIChydHBiaW4sICJnZXQtaW50ZXJuYWwtc2Vzc2lvbiIsIDAsICZzZXNzaW9uKTsKKyAgICBmYWlsX3VubGVzcyAoc2Vzc2lvbiAhPSBOVUxMKTsKKyAgICBnX29iamVjdF91bnJlZiAoc2Vzc2lvbik7CisKKyAgICAvKiBnZXQgdGhlIHNlbmQgUlRDUCBwYWQgdG9vICovCisgICAgcnRjcF9zcmMgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgInNlbmRfcnRjcF9zcmNfMCIpOworICAgIGZhaWxfdW5sZXNzIChydGNwX3NyYyAhPSBOVUxMKTsKKyAgICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChydGNwX3NyYywgInJ0Y3Bfc3JjIiwgMik7CisKKyAgICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkIChydHBiaW4sIHJ0cF9zaW5rKTsKKyAgICAvKiB3ZSBzaG91bGQgb25seSBoYXZlIG91ciByZWZzIHRvIHRoZSBwYWRzIG5vdyAqLworICAgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHJ0cF9zaW5rLCAicnRwX3NpbmsiLCAxKTsKKyAgICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChydHBfc3JjLCAicnRwX3NyYyIsIDEpOworICAgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHJ0Y3Bfc3JjLCAicnRwX3NyYyIsIDIpOworCisgICAgLyogdGhlIG90aGVyIHBhZCBzaG91bGQgYmUgZ29uZSBub3cgKi8KKyAgICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHJ0cGJpbiwgInNlbmRfcnRwX3NyY18wIikgPT0gTlVMTCk7CisKKyAgICAvKiBpbnRlcm5hbCBzZXNzaW9uIHNob3VsZCBzdGlsbCBiZSB0aGVyZSAqLworICAgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAocnRwYmluLCAiZ2V0LWludGVybmFsLXNlc3Npb24iLCAwLCAmc2Vzc2lvbik7CisgICAgZmFpbF91bmxlc3MgKHNlc3Npb24gIT0gTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHNlc3Npb24pOworCisgICAgLyogcmVsZWFzZSB0aGUgUlRDUCBwYWQgKi8KKyAgICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkIChydHBiaW4sIHJ0Y3Bfc3JjKTsKKyAgICAvKiB3ZSBzaG91bGQgb25seSBoYXZlIG91ciByZWZzIHRvIHRoZSBwYWRzIG5vdyAqLworICAgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHJ0cF9zaW5rLCAicnRwX3NpbmsiLCAxKTsKKyAgICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChydHBfc3JjLCAicnRwX3NyYyIsIDEpOworICAgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHJ0Y3Bfc3JjLCAicnRwX3NyYyIsIDEpOworCisgICAgLyogdGhlIHNlc3Npb24gc2hvdWxkIGJlIGdvbmUgbm93ICovCisgICAgZ19zaWduYWxfZW1pdF9ieV9uYW1lIChydHBiaW4sICJnZXQtaW50ZXJuYWwtc2Vzc2lvbiIsIDAsICZzZXNzaW9uKTsKKyAgICBmYWlsX3VubGVzcyAoc2Vzc2lvbiA9PSBOVUxMKTsKKworICAgIC8qIHVucmVmIHRoZSByZXF1ZXN0IHBhZCBhbmQgdGhlIHN0YXRpYyBwYWQgKi8KKyAgICBnc3Rfb2JqZWN0X3VucmVmIChydHBfc2luayk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocnRwX3NyYyk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocnRjcF9zcmMpOworICB9CisKKyAgZ3N0X29iamVjdF91bnJlZiAocnRwYmluKTsKK30KKworR1NUX0VORF9URVNUOworCit0eXBlZGVmIHN0cnVjdAoreworICBndWludDE2IHNlcW51bTsKKyAgZ2Jvb2xlYW4gcGFkX2FkZGVkOworICBHc3RQYWQgKnBhZDsKKyAgR011dGV4IGxvY2s7CisgIEdDb25kIGNvbmQ7CisgIEdzdFBhZCAqc2lua3BhZDsKKyAgR0xpc3QgKnBhZHM7CisgIEdzdENhcHMgKmNhcHM7Cit9IENsZWFudXBEYXRhOworCitzdGF0aWMgdm9pZAoraW5pdF9kYXRhIChDbGVhbnVwRGF0YSAqIGRhdGEpCit7CisgIGRhdGEtPnNlcW51bSA9IDEwOworICBkYXRhLT5wYWRfYWRkZWQgPSBGQUxTRTsKKyAgZ19tdXRleF9pbml0ICgmZGF0YS0+bG9jayk7CisgIGdfY29uZF9pbml0ICgmZGF0YS0+Y29uZCk7CisgIGRhdGEtPnBhZHMgPSBOVUxMOworICBkYXRhLT5jYXBzID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2NsZWFuX2RhdGEgKENsZWFudXBEYXRhICogZGF0YSkKK3sKKyAgZ19saXN0X2ZvcmVhY2ggKGRhdGEtPnBhZHMsIChHRnVuYykgZ3N0X29iamVjdF91bnJlZiwgTlVMTCk7CisgIGdfbGlzdF9mcmVlIChkYXRhLT5wYWRzKTsKKyAgZ19tdXRleF9jbGVhciAoJmRhdGEtPmxvY2spOworICBnX2NvbmRfY2xlYXIgKCZkYXRhLT5jb25kKTsKKyAgaWYgKGRhdGEtPmNhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKGRhdGEtPmNhcHMpOworfQorCitzdGF0aWMgZ3VpbnQ4IHJ0cF9wYWNrZXRbXSA9IHsgMHg4MCwgMHg2MCwgMHg5NCwgMHhiYywgMHg4ZiwgMHgzNywgMHg0ZSwgMHhiOCwKKyAgMHg0NCwgMHhhOCwgMHhmMywgMHg3YywgMHgwNiwgMHg2YSwgMHgwYywgMHhjZSwKKyAgMHgxMywgMHgyNSwgMHgxOSwgMHg2OSwgMHgxZiwgMHg5MywgMHgyNSwgMHg5ZCwKKyAgMHgyYiwgMHg4MiwgMHgzMSwgMHgzYiwgMHgzNiwgMHhjMSwgMHgzYywgMHgxMworfTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2NoYWluX3J0cF9wYWNrZXQgKEdzdFBhZCAqIHBhZCwgQ2xlYW51cERhdGEgKiBkYXRhKQoreworICBHc3RGbG93UmV0dXJuIHJlczsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgaWYgKGRhdGEtPmNhcHMgPT0gTlVMTCkgeworICAgIGRhdGEtPmNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoImFwcGxpY2F0aW9uL3gtcnRwLCIKKyAgICAgICAgIm1lZGlhPShzdHJpbmcpYXVkaW8sIGNsb2NrLXJhdGU9KGludCk0NDEwMCwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZT0oc3RyaW5nKUwxNiwgZW5jb2RpbmctcGFyYW1zPShzdHJpbmcpMSwgY2hhbm5lbHM9KGludCkxIik7CisgICAgZGF0YS0+c2VxbnVtID0gMDsKKyAgfQorCisgIGdzdF9wYWRfc2VuZF9ldmVudCAocGFkLCBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoR1NUX09CSkVDVF9OQU1FIChwYWQpKSk7CisgIGdzdF9wYWRfc2VuZF9ldmVudCAocGFkLCBnc3RfZXZlbnRfbmV3X2NhcHMgKGRhdGEtPmNhcHMpKTsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9wYWRfc2VuZF9ldmVudCAocGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSk7CisKKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzaXplb2YgKHJ0cF9wYWNrZXQpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIG1lbWNweSAobWFwLmRhdGEsIHJ0cF9wYWNrZXQsIHNpemVvZiAocnRwX3BhY2tldCkpOworCisgIG1hcC5kYXRhWzJdID0gKGRhdGEtPnNlcW51bSA+PiA4KSAmIDB4ZmY7CisgIG1hcC5kYXRhWzNdID0gZGF0YS0+c2VxbnVtICYgMHhmZjsKKworICBkYXRhLT5zZXFudW0rKzsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICByZXMgPSBnc3RfcGFkX2NoYWluIChwYWQsIGJ1ZmZlcik7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2R1bW15X2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwIikpOworCisKK3N0YXRpYyBHc3RQYWQgKgorbWFrZV9zaW5rcGFkIChDbGVhbnVwRGF0YSAqIGRhdGEpCit7CisgIEdzdFBhZCAqcGFkOworCisgIHBhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc2lua19mYWN0b3J5LCAic2luayIpOworCisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChwYWQsIGR1bW15X2NoYWluKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChwYWQsIFRSVUUpOworCisgIGRhdGEtPnBhZHMgPSBnX2xpc3RfcHJlcGVuZCAoZGF0YS0+cGFkcywgcGFkKTsKKworICByZXR1cm4gcGFkOworfQorCitzdGF0aWMgdm9pZAorcGFkX2FkZGVkX2NiIChHc3RFbGVtZW50ICogcnRwYmluLCBHc3RQYWQgKiBwYWQsIENsZWFudXBEYXRhICogZGF0YSkKK3sKKyAgR3N0UGFkICpzaW5rcGFkOworCisgIEdTVF9ERUJVRyAoInBhZCBhZGRlZCAlczolc1xuIiwgR1NUX0RFQlVHX1BBRF9OQU1FIChwYWQpKTsKKworICBpZiAoR1NUX1BBRF9JU19TSU5LIChwYWQpKQorICAgIHJldHVybjsKKworICBmYWlsX3VubGVzcyAoZGF0YS0+cGFkX2FkZGVkID09IEZBTFNFKTsKKworICBzaW5rcGFkID0gbWFrZV9zaW5rcGFkIChkYXRhKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAocGFkLCBzaW5rcGFkKSA9PSBHU1RfUEFEX0xJTktfT0spOworCisgIGdfbXV0ZXhfbG9jayAoJmRhdGEtPmxvY2spOworICBkYXRhLT5wYWRfYWRkZWQgPSBUUlVFOworICBkYXRhLT5wYWQgPSBwYWQ7CisgIGdfY29uZF9zaWduYWwgKCZkYXRhLT5jb25kKTsKKyAgZ19tdXRleF91bmxvY2sgKCZkYXRhLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK3BhZF9yZW1vdmVkX2NiIChHc3RFbGVtZW50ICogcnRwYmluLCBHc3RQYWQgKiBwYWQsIENsZWFudXBEYXRhICogZGF0YSkKK3sKKyAgR1NUX0RFQlVHICgicGFkIHJlbW92ZWQgJXM6JXNcbiIsIEdTVF9ERUJVR19QQURfTkFNRSAocGFkKSk7CisKKyAgaWYgKGRhdGEtPnBhZCAhPSBwYWQpCisgICAgcmV0dXJuOworCisgIGZhaWxfdW5sZXNzIChkYXRhLT5wYWRfYWRkZWQgPT0gVFJVRSk7CisKKyAgZ19tdXRleF9sb2NrICgmZGF0YS0+bG9jayk7CisgIGRhdGEtPnBhZF9hZGRlZCA9IEZBTFNFOworICBnX2NvbmRfc2lnbmFsICgmZGF0YS0+Y29uZCk7CisgIGdfbXV0ZXhfdW5sb2NrICgmZGF0YS0+bG9jayk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2NsZWFudXBfcmVjdikKK3sKKyAgR3N0RWxlbWVudCAqcnRwYmluOworICBHc3RQYWQgKnJ0cF9zaW5rOworICBDbGVhbnVwRGF0YSBkYXRhOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdEZsb3dSZXR1cm4gcmVzOworICBnaW50IGNvdW50ID0gMjsKKworICBpbml0X2RhdGEgKCZkYXRhKTsKKworICBydHBiaW4gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBiaW4iLCAicnRwYmluIik7CisKKyAgZ19zaWduYWxfY29ubmVjdCAocnRwYmluLCAicGFkLWFkZGVkIiwgKEdDYWxsYmFjaykgcGFkX2FkZGVkX2NiLCAmZGF0YSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cGJpbiwgInBhZC1yZW1vdmVkIiwgKEdDYWxsYmFjaykgcGFkX3JlbW92ZWRfY2IsICZkYXRhKTsKKworICByZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHJ0cGJpbiwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBmYWlsX3VubGVzcyAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgd2hpbGUgKGNvdW50LS0pIHsKKyAgICAvKiByZXF1ZXN0IHNlc3Npb24gMCAqLworICAgIHJ0cF9zaW5rID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBiaW4sICJyZWN2X3J0cF9zaW5rXzAiKTsKKyAgICBmYWlsX3VubGVzcyAocnRwX3NpbmsgIT0gTlVMTCk7CisgICAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAocnRwX3NpbmssICJydHBfc2luayIsIDIpOworCisgICAgLyogbm8gc291cmNlcGFkcyBhcmUgY3JlYXRlZCB5ZXQgKi8KKyAgICBmYWlsX3VubGVzcyAocnRwYmluLT5udW1zaW5rcGFkcyA9PSAxKTsKKyAgICBmYWlsX3VubGVzcyAocnRwYmluLT5udW1zcmNwYWRzID09IDApOworCisgICAgcmVzID0gY2hhaW5fcnRwX3BhY2tldCAocnRwX3NpbmssICZkYXRhKTsKKyAgICBHU1RfREVCVUcgKCJyZXMgJWQsICVzXG4iLCByZXMsIGdzdF9mbG93X2dldF9uYW1lIChyZXMpKTsKKyAgICBmYWlsX3VubGVzcyAocmVzID09IEdTVF9GTE9XX09LKTsKKworICAgIHJlcyA9IGNoYWluX3J0cF9wYWNrZXQgKHJ0cF9zaW5rLCAmZGF0YSk7CisgICAgR1NUX0RFQlVHICgicmVzICVkLCAlc1xuIiwgcmVzLCBnc3RfZmxvd19nZXRfbmFtZSAocmVzKSk7CisgICAgZmFpbF91bmxlc3MgKHJlcyA9PSBHU1RfRkxPV19PSyk7CisKKyAgICAvKiB3ZSB3YWl0IGZvciB0aGUgbmV3IHBhZCB0byBhcHBlYXIgbm93ICovCisgICAgZ19tdXRleF9sb2NrICgmZGF0YS5sb2NrKTsKKyAgICB3aGlsZSAoIWRhdGEucGFkX2FkZGVkKQorICAgICAgZ19jb25kX3dhaXQgKCZkYXRhLmNvbmQsICZkYXRhLmxvY2spOworICAgIGdfbXV0ZXhfdW5sb2NrICgmZGF0YS5sb2NrKTsKKworICAgIC8qIHNvdXJjZXBhZCBjcmVhdGVkIG5vdyAqLworICAgIGZhaWxfdW5sZXNzIChydHBiaW4tPm51bXNpbmtwYWRzID09IDEpOworICAgIGZhaWxfdW5sZXNzIChydHBiaW4tPm51bXNyY3BhZHMgPT0gMSk7CisKKyAgICAvKiByZW1vdmUgdGhlIHNlc3Npb24gKi8KKyAgICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkIChydHBiaW4sIHJ0cF9zaW5rKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChydHBfc2luayk7CisKKyAgICAvKiBwYWQgc2hvdWxkIGJlIGdvbmUgbm93ICovCisgICAgZ19tdXRleF9sb2NrICgmZGF0YS5sb2NrKTsKKyAgICB3aGlsZSAoZGF0YS5wYWRfYWRkZWQpCisgICAgICBnX2NvbmRfd2FpdCAoJmRhdGEuY29uZCwgJmRhdGEubG9jayk7CisgICAgZ19tdXRleF91bmxvY2sgKCZkYXRhLmxvY2spOworCisgICAgLyogbm90aGluZyBsZWZ0IGFueW1vcmUgbm93ICovCisgICAgZmFpbF91bmxlc3MgKHJ0cGJpbi0+bnVtc2lua3BhZHMgPT0gMCk7CisgICAgZmFpbF91bmxlc3MgKHJ0cGJpbi0+bnVtc3JjcGFkcyA9PSAwKTsKKyAgfQorCisgIHJldCA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocnRwYmluLCBHU1RfU1RBVEVfTlVMTCk7CisgIGZhaWxfdW5sZXNzIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChydHBiaW4pOworCisgIGNsZWFuX2RhdGEgKCZkYXRhKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9jbGVhbnVwX3JlY3YyKQoreworICBHc3RFbGVtZW50ICpydHBiaW47CisgIEdzdFBhZCAqcnRwX3Npbms7CisgIENsZWFudXBEYXRhIGRhdGE7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0Rmxvd1JldHVybiByZXM7CisgIGdpbnQgY291bnQgPSAyOworCisgIGluaXRfZGF0YSAoJmRhdGEpOworCisgIHJ0cGJpbiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cGJpbiIsICJydHBiaW4iKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChydHBiaW4sICJwYWQtYWRkZWQiLCAoR0NhbGxiYWNrKSBwYWRfYWRkZWRfY2IsICZkYXRhKTsKKyAgZ19zaWduYWxfY29ubmVjdCAocnRwYmluLCAicGFkLXJlbW92ZWQiLCAoR0NhbGxiYWNrKSBwYWRfcmVtb3ZlZF9jYiwgJmRhdGEpOworCisgIHJldCA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocnRwYmluLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGZhaWxfdW5sZXNzIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICAvKiByZXF1ZXN0IHNlc3Npb24gMCAqLworICBydHBfc2luayA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwYmluLCAicmVjdl9ydHBfc2lua18wIik7CisgIGZhaWxfdW5sZXNzIChydHBfc2luayAhPSBOVUxMKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAocnRwX3NpbmssICJydHBfc2luayIsIDIpOworCisgIHdoaWxlIChjb3VudC0tKSB7CisgICAgLyogbm8gc291cmNlcGFkcyBhcmUgY3JlYXRlZCB5ZXQgKi8KKyAgICBmYWlsX3VubGVzcyAocnRwYmluLT5udW1zaW5rcGFkcyA9PSAxKTsKKyAgICBmYWlsX3VubGVzcyAocnRwYmluLT5udW1zcmNwYWRzID09IDApOworCisgICAgcmVzID0gY2hhaW5fcnRwX3BhY2tldCAocnRwX3NpbmssICZkYXRhKTsKKyAgICBHU1RfREVCVUcgKCJyZXMgJWQsICVzXG4iLCByZXMsIGdzdF9mbG93X2dldF9uYW1lIChyZXMpKTsKKyAgICBmYWlsX3VubGVzcyAocmVzID09IEdTVF9GTE9XX09LKTsKKworICAgIHJlcyA9IGNoYWluX3J0cF9wYWNrZXQgKHJ0cF9zaW5rLCAmZGF0YSk7CisgICAgR1NUX0RFQlVHICgicmVzICVkLCAlc1xuIiwgcmVzLCBnc3RfZmxvd19nZXRfbmFtZSAocmVzKSk7CisgICAgZmFpbF91bmxlc3MgKHJlcyA9PSBHU1RfRkxPV19PSyk7CisKKyAgICAvKiB3ZSB3YWl0IGZvciB0aGUgbmV3IHBhZCB0byBhcHBlYXIgbm93ICovCisgICAgZ19tdXRleF9sb2NrICgmZGF0YS5sb2NrKTsKKyAgICB3aGlsZSAoIWRhdGEucGFkX2FkZGVkKQorICAgICAgZ19jb25kX3dhaXQgKCZkYXRhLmNvbmQsICZkYXRhLmxvY2spOworICAgIGdfbXV0ZXhfdW5sb2NrICgmZGF0YS5sb2NrKTsKKworICAgIC8qIHNvdXJjZXBhZCBjcmVhdGVkIG5vdyAqLworICAgIGZhaWxfdW5sZXNzIChydHBiaW4tPm51bXNpbmtwYWRzID09IDEpOworICAgIGZhaWxfdW5sZXNzIChydHBiaW4tPm51bXNyY3BhZHMgPT0gMSk7CisKKyAgICAvKiBjaGFuZ2Ugc3RhdGUgKi8KKyAgICByZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHJ0cGJpbiwgR1NUX1NUQVRFX05VTEwpOworICAgIGZhaWxfdW5sZXNzIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICAgIC8qIHBhZCBzaG91bGQgYmUgZ29uZSBub3cgKi8KKyAgICBnX211dGV4X2xvY2sgKCZkYXRhLmxvY2spOworICAgIHdoaWxlIChkYXRhLnBhZF9hZGRlZCkKKyAgICAgIGdfY29uZF93YWl0ICgmZGF0YS5jb25kLCAmZGF0YS5sb2NrKTsKKyAgICBnX211dGV4X3VubG9jayAoJmRhdGEubG9jayk7CisKKyAgICAvKiBiYWNrIHRvIHBsYXlpbmcgZm9yIHRoZSBuZXh0IHJvdW5kICovCisgICAgcmV0ID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChydHBiaW4sIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgICBmYWlsX3VubGVzcyAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisgIH0KKworICAvKiByZW1vdmUgdGhlIHNlc3Npb24gKi8KKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAocnRwYmluLCBydHBfc2luayk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cF9zaW5rKTsKKworICAvKiBub3RoaW5nIGxlZnQgYW55bW9yZSBub3cgKi8KKyAgZmFpbF91bmxlc3MgKHJ0cGJpbi0+bnVtc2lua3BhZHMgPT0gMCk7CisgIGZhaWxfdW5sZXNzIChydHBiaW4tPm51bXNyY3BhZHMgPT0gMCk7CisKKyAgcmV0ID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChydHBiaW4sIEdTVF9TVEFURV9OVUxMKTsKKyAgZmFpbF91bmxlc3MgKHJldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cGJpbik7CisKKyAgY2xlYW5fZGF0YSAoJmRhdGEpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3JlcXVlc3RfcGFkX2J5X3RlbXBsYXRlX25hbWUpCit7CisgIEdzdEVsZW1lbnQgKnJ0cGJpbjsKKyAgR3N0UGFkICpydHBfc2luazEsICpydHBfc2luazIsICpydHBfc2luazM7CisKKyAgcnRwYmluID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwYmluIiwgInJ0cGJpbiIpOworICBydHBfc2luazEgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgInJlY3ZfcnRwX3NpbmtfJXUiKTsKKyAgZmFpbF91bmxlc3MgKHJ0cF9zaW5rMSAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoR1NUX1BBRF9OQU1FIChydHBfc2luazEpLCAicmVjdl9ydHBfc2lua18wIik7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHJ0cF9zaW5rMSwgInJ0cF9zaW5rMSIsIDIpOworCisgIHJ0cF9zaW5rMiA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwYmluLCAicmVjdl9ydHBfc2lua18ldSIpOworICBmYWlsX3VubGVzcyAocnRwX3NpbmsyICE9IE5VTEwpOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nIChHU1RfUEFEX05BTUUgKHJ0cF9zaW5rMiksICJyZWN2X3J0cF9zaW5rXzEiKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAocnRwX3NpbmsyLCAicnRwX3NpbmsyIiwgMik7CisKKyAgcnRwX3NpbmszID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBiaW4sICJyZWN2X3J0cF9zaW5rXyV1Iik7CisgIGZhaWxfdW5sZXNzIChydHBfc2luazMgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKEdTVF9QQURfTkFNRSAocnRwX3NpbmszKSwgInJlY3ZfcnRwX3NpbmtfMiIpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChydHBfc2luazMsICJydHBfc2luazMiLCAyKTsKKworCisgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgcnRwX3NpbmsyKTsKKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAocnRwYmluLCBydHBfc2luazEpOworICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkIChydHBiaW4sIHJ0cF9zaW5rMyk7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHJ0cF9zaW5rMywgInJ0cF9zaW5rMyIsIDEpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChydHBfc2luazIsICJydHBfc2luazIiLCAxKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAocnRwX3NpbmsxLCAicnRwX3NpbmsiLCAxKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocnRwX3NpbmsxKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocnRwX3NpbmsyKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocnRwX3NpbmszKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChydHBiaW4pOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK2VuY29kZXJfY2IgKEdzdEVsZW1lbnQgKiBydHBiaW4sIGd1aW50IHNlc3NpZCwgR3N0RWxlbWVudCAqIGJpbikKK3sKKyAgR3N0UGFkICpzcmNwYWQsICpzaW5rcGFkOworCisgIGZhaWxfdW5sZXNzIChzZXNzaWQgPT0gMik7CisKKyAgR1NUX0RFQlVHICgibWFraW5nIGVuY29kZXIiKTsKKyAgc2lua3BhZCA9IGdzdF9naG9zdF9wYWRfbmV3X25vX3RhcmdldCAoInJ0cF9zaW5rXzIiLCBHU1RfUEFEX1NJTkspOworICBzcmNwYWQgPSBnc3RfZ2hvc3RfcGFkX25ld19ub190YXJnZXQgKCJydHBfc3JjXzIiLCBHU1RfUEFEX1NSQyk7CisKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoYmluLCBzaW5rcGFkKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoYmluLCBzcmNwYWQpOworCisgIHJldHVybiBnc3Rfb2JqZWN0X3JlZiAoYmluKTsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorZW5jb2Rlcl9jYjIgKEdzdEVsZW1lbnQgKiBydHBiaW4sIGd1aW50IHNlc3NpZCwgR3N0RWxlbWVudCAqIGJpbikKK3sKKyAgR3N0UGFkICpzcmNwYWQsICpzaW5rcGFkOworCisgIGZhaWxfdW5sZXNzIChzZXNzaWQgPT0gMyk7CisKKyAgR1NUX0RFQlVHICgibWFraW5nIGVuY29kZXIiKTsKKyAgc2lua3BhZCA9IGdzdF9naG9zdF9wYWRfbmV3X25vX3RhcmdldCAoInJ0cF9zaW5rXzMiLCBHU1RfUEFEX1NJTkspOworICBzcmNwYWQgPSBnc3RfZ2hvc3RfcGFkX25ld19ub190YXJnZXQgKCJydHBfc3JjXzMiLCBHU1RfUEFEX1NSQyk7CisKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoYmluLCBzaW5rcGFkKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoYmluLCBzcmNwYWQpOworCisgIHJldHVybiBnc3Rfb2JqZWN0X3JlZiAoYmluKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZW5jb2RlcikKK3sKKyAgR3N0RWxlbWVudCAqcnRwYmluLCAqYmluOworICBHc3RQYWQgKnJ0cF9zaW5rMSwgKnJ0cF9zaW5rMjsKKyAgZ3Vsb25nIGlkOworCisgIGJpbiA9IGdzdF9iaW5fbmV3ICgicnRwZW5jIik7CisKKyAgcnRwYmluID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwYmluIiwgInJ0cGJpbiIpOworCisgIGlkID0gZ19zaWduYWxfY29ubmVjdCAocnRwYmluLCAicmVxdWVzdC1ydHAtZW5jb2RlciIsIChHQ2FsbGJhY2spIGVuY29kZXJfY2IsCisgICAgICBiaW4pOworCisgIHJ0cF9zaW5rMSA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwYmluLCAic2VuZF9ydHBfc2lua18yIik7CisgIGZhaWxfdW5sZXNzIChydHBfc2luazEgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKEdTVF9QQURfTkFNRSAocnRwX3NpbmsxKSwgInNlbmRfcnRwX3NpbmtfMiIpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChydHBfc2luazEsICJydHBfc2luazEiLCAyKTsKKworICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QgKHJ0cGJpbiwgaWQpOworCisgIGlkID0gZ19zaWduYWxfY29ubmVjdCAocnRwYmluLCAicmVxdWVzdC1ydHAtZW5jb2RlciIsIChHQ2FsbGJhY2spIGVuY29kZXJfY2IyLAorICAgICAgYmluKTsKKworICBydHBfc2luazIgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgInNlbmRfcnRwX3NpbmtfMyIpOworICBmYWlsX3VubGVzcyAocnRwX3NpbmsyICE9IE5VTEwpOworCisgIC8qIHJlbW92ZSB0aGUgc2Vzc2lvbiAqLworICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkIChydHBiaW4sIHJ0cF9zaW5rMSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cF9zaW5rMSk7CisKKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAocnRwYmluLCBydHBfc2luazIpOworICBnc3Rfb2JqZWN0X3VucmVmIChydHBfc2luazIpOworCisgIC8qIG5vdGhpbmcgbGVmdCBhbnltb3JlIG5vdyAqLworICBmYWlsX3VubGVzcyAocnRwYmluLT5udW1zaW5rcGFkcyA9PSAwKTsKKyAgZmFpbF91bmxlc3MgKHJ0cGJpbi0+bnVtc3JjcGFkcyA9PSAwKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChydHBiaW4pOworICBnc3Rfb2JqZWN0X3VucmVmIChiaW4pOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK2RlY29kZXJfY2IgKEdzdEVsZW1lbnQgKiBydHBiaW4sIGd1aW50IHNlc3NpZCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RFbGVtZW50ICpiaW47CisgIEdzdFBhZCAqc3JjcGFkLCAqc2lua3BhZDsKKworICBiaW4gPSBnc3RfYmluX25ldyAoTlVMTCk7CisKKyAgR1NUX0RFQlVHICgibWFraW5nIGRlY29kZXIiKTsKKyAgc2lua3BhZCA9IGdzdF9naG9zdF9wYWRfbmV3X25vX3RhcmdldCAoInJ0cF9zaW5rIiwgR1NUX1BBRF9TSU5LKTsKKyAgc3JjcGFkID0gZ3N0X2dob3N0X3BhZF9uZXdfbm9fdGFyZ2V0ICgicnRwX3NyYyIsIEdTVF9QQURfU1JDKTsKKworICBnc3RfZWxlbWVudF9hZGRfcGFkIChiaW4sIHNpbmtwYWQpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChiaW4sIHNyY3BhZCk7CisKKyAgcmV0dXJuIGJpbjsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZGVjb2RlcikKK3sKKyAgR3N0RWxlbWVudCAqcnRwYmluOworICBHc3RQYWQgKnJ0cF9zaW5rMSwgKnJ0cF9zaW5rMjsKKyAgZ3Vsb25nIGlkOworCisKKyAgcnRwYmluID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwYmluIiwgInJ0cGJpbiIpOworCisgIGlkID0gZ19zaWduYWxfY29ubmVjdCAocnRwYmluLCAicmVxdWVzdC1ydHAtZGVjb2RlciIsIChHQ2FsbGJhY2spIGRlY29kZXJfY2IsCisgICAgICBOVUxMKTsKKworICBydHBfc2luazEgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgInJlY3ZfcnRwX3NpbmtfMiIpOworICBmYWlsX3VubGVzcyAocnRwX3NpbmsxICE9IE5VTEwpOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nIChHU1RfUEFEX05BTUUgKHJ0cF9zaW5rMSksICJyZWN2X3J0cF9zaW5rXzIiKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAocnRwX3NpbmsxLCAicnRwX3NpbmsxIiwgMik7CisKKyAgcnRwX3NpbmsyID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBiaW4sICJyZWN2X3J0cF9zaW5rXzMiKTsKKyAgZmFpbF91bmxlc3MgKHJ0cF9zaW5rMiAhPSBOVUxMKTsKKworICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QgKHJ0cGJpbiwgaWQpOworCisgIC8qIHJlbW92ZSB0aGUgc2Vzc2lvbiAqLworICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkIChydHBiaW4sIHJ0cF9zaW5rMSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cF9zaW5rMSk7CisKKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAocnRwYmluLCBydHBfc2luazIpOworICBnc3Rfb2JqZWN0X3VucmVmIChydHBfc2luazIpOworCisgIC8qIG5vdGhpbmcgbGVmdCBhbnltb3JlIG5vdyAqLworICBmYWlsX3VubGVzcyAocnRwYmluLT5udW1zaW5rcGFkcyA9PSAwKTsKKyAgZmFpbF91bmxlc3MgKHJ0cGJpbi0+bnVtc3JjcGFkcyA9PSAwKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChydHBiaW4pOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK2F1eF9zZW5kZXJfY2IgKEdzdEVsZW1lbnQgKiBydHBiaW4sIGd1aW50IHNlc3NpZCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RFbGVtZW50ICpiaW47CisgIEdzdFBhZCAqc3JjcGFkLCAqc2lua3BhZDsKKworICBiaW4gPSAoR3N0RWxlbWVudCAqKSB1c2VyX2RhdGE7CisKKyAgR1NUX0RFQlVHICgibWFraW5nIEFVWCBzZW5kZXIiKTsKKyAgc2lua3BhZCA9IGdzdF9naG9zdF9wYWRfbmV3X25vX3RhcmdldCAoInNpbmtfMiIsIEdTVF9QQURfU0lOSyk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGJpbiwgc2lua3BhZCk7CisKKyAgc3JjcGFkID0gZ3N0X2dob3N0X3BhZF9uZXdfbm9fdGFyZ2V0ICgic3JjXzIiLCBHU1RfUEFEX1NSQyk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGJpbiwgc3JjcGFkKTsKKyAgc3JjcGFkID0gZ3N0X2dob3N0X3BhZF9uZXdfbm9fdGFyZ2V0ICgic3JjXzEiLCBHU1RfUEFEX1NSQyk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGJpbiwgc3JjcGFkKTsKKyAgc3JjcGFkID0gZ3N0X2dob3N0X3BhZF9uZXdfbm9fdGFyZ2V0ICgic3JjXzMiLCBHU1RfUEFEX1NSQyk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGJpbiwgc3JjcGFkKTsKKworICByZXR1cm4gYmluOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9hdXhfc2VuZGVyKQoreworICBHc3RFbGVtZW50ICpydHBiaW47CisgIEdzdFBhZCAqcnRwX3NpbmsxLCAqcnRwX3NyYywgKnJ0Y3Bfc3JjOworICBndWxvbmcgaWQ7CisgIEdzdEVsZW1lbnQgKmF1eF9zZW5kZXIgPSBnc3Rfb2JqZWN0X3JlZl9zaW5rIChnc3RfYmluX25ldyAoImF1eC1zZW5kZXIiKSk7CisKKyAgZ3N0X29iamVjdF9yZWYgKGF1eF9zZW5kZXIpOworCisgIHJ0cGJpbiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cGJpbiIsICJydHBiaW4iKTsKKworICBpZCA9IGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cGJpbiwgInJlcXVlc3QtYXV4LXNlbmRlciIsCisgICAgICAoR0NhbGxiYWNrKSBhdXhfc2VuZGVyX2NiLCBhdXhfc2VuZGVyKTsKKworICBydHBfc2luazEgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgInNlbmRfcnRwX3NpbmtfMiIpOworICBmYWlsX3VubGVzcyAocnRwX3NpbmsxICE9IE5VTEwpOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nIChHU1RfUEFEX05BTUUgKHJ0cF9zaW5rMSksICJzZW5kX3J0cF9zaW5rXzIiKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAocnRwX3NpbmsxLCAicnRwX3NpbmsxIiwgMik7CisKKyAgZ19zaWduYWxfaGFuZGxlcl9kaXNjb25uZWN0IChydHBiaW4sIGlkKTsKKworICBydHBfc3JjID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHJ0cGJpbiwgInNlbmRfcnRwX3NyY18yIik7CisgIGZhaWxfdW5sZXNzIChydHBfc3JjICE9IE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChydHBfc3JjKTsKKworICBydHBfc3JjID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHJ0cGJpbiwgInNlbmRfcnRwX3NyY18xIik7CisgIGZhaWxfdW5sZXNzIChydHBfc3JjICE9IE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChydHBfc3JjKTsKKworICBydGNwX3NyYyA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwYmluLCAic2VuZF9ydGNwX3NyY18xIik7CisgIGZhaWxfdW5sZXNzIChydGNwX3NyYyAhPSBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAocnRwYmluLCBydGNwX3NyYyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHJ0Y3Bfc3JjKTsKKworICBydHBfc3JjID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHJ0cGJpbiwgInNlbmRfcnRwX3NyY18zIik7CisgIGZhaWxfdW5sZXNzIChydHBfc3JjICE9IE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChydHBfc3JjKTsKKworICAvKiByZW1vdmUgdGhlIHNlc3Npb24gKi8KKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAocnRwYmluLCBydHBfc2luazEpOworICBnc3Rfb2JqZWN0X3VucmVmIChydHBfc2luazEpOworCisgIC8qIFdlIGhhdmUgc2lua2VkIHRoZSBpbml0aWFsIHJlZmVyZW5jZSBiZWZvcmUgcmV0dXJuaW5nIGl0CisgICAqIGluIHRoZSByZXF1ZXN0IGNhbGxiYWNrLCB0aGUgcmVmIGNvdW50IHNob3VsZCBub3cgYmUgMSBiZWNhdXNlCisgICAqIHRoZSByZXR1cm4gb2YgdGhlIHNpZ25hbCBpcyB0cmFuc2ZlciBmdWxsLCBhbmQgcnRwYmluIHNob3VsZAorICAgKiBoYXZlIHJlbGVhc2VkIHRoYXQgcmVmZXJlbmNlIGJ5IG5vdywgYnV0IHdlIGhhZCB0YWtlbiBhbgorICAgKiBleHRyYSByZWZlcmVuY2UgdG8gcGVyZm9ybSB0aGlzIGNoZWNrCisgICAqLworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChhdXhfc2VuZGVyLCAiYXV4LXNlbmRlciIsIDEpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKGF1eF9zZW5kZXIpOworICBnc3Rfb2JqZWN0X3VucmVmIChydHBiaW4pOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK2F1eF9yZWNlaXZlcl9jYiAoR3N0RWxlbWVudCAqIHJ0cGJpbiwgZ3VpbnQgc2Vzc2lkLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdEVsZW1lbnQgKmJpbjsKKyAgR3N0UGFkICpzcmNwYWQsICpzaW5rcGFkOworCisgIGJpbiA9IGdzdF9iaW5fbmV3IChOVUxMKTsKKworICBHU1RfREVCVUcgKCJtYWtpbmcgQVVYIHJlY2VpdmVyIik7CisgIHNyY3BhZCA9IGdzdF9naG9zdF9wYWRfbmV3X25vX3RhcmdldCAoInNyY18yIiwgR1NUX1BBRF9TUkMpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChiaW4sIHNyY3BhZCk7CisKKyAgc2lua3BhZCA9IGdzdF9naG9zdF9wYWRfbmV3X25vX3RhcmdldCAoInNpbmtfMiIsIEdTVF9QQURfU0lOSyk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGJpbiwgc2lua3BhZCk7CisgIHNpbmtwYWQgPSBnc3RfZ2hvc3RfcGFkX25ld19ub190YXJnZXQgKCJzaW5rXzEiLCBHU1RfUEFEX1NJTkspOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChiaW4sIHNpbmtwYWQpOworICBzaW5rcGFkID0gZ3N0X2dob3N0X3BhZF9uZXdfbm9fdGFyZ2V0ICgic2lua18zIiwgR1NUX1BBRF9TSU5LKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoYmluLCBzaW5rcGFkKTsKKworICByZXR1cm4gYmluOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9hdXhfcmVjZWl2ZXIpCit7CisgIEdzdEVsZW1lbnQgKnJ0cGJpbjsKKyAgR3N0UGFkICpydHBfc2luazEsICpydHBfc2luazIsICpydGNwX3Npbms7CisgIGd1bG9uZyBpZDsKKworICBydHBiaW4gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBiaW4iLCAicnRwYmluIik7CisKKyAgaWQgPSBnX3NpZ25hbF9jb25uZWN0IChydHBiaW4sICJyZXF1ZXN0LWF1eC1yZWNlaXZlciIsCisgICAgICAoR0NhbGxiYWNrKSBhdXhfcmVjZWl2ZXJfY2IsIE5VTEwpOworCisgIHJ0cF9zaW5rMSA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwYmluLCAicmVjdl9ydHBfc2lua18yIik7CisgIGZhaWxfdW5sZXNzIChydHBfc2luazEgIT0gTlVMTCk7CisKKyAgcnRwX3NpbmsyID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBiaW4sICJyZWN2X3J0cF9zaW5rXzEiKTsKKyAgZmFpbF91bmxlc3MgKHJ0cF9zaW5rMiAhPSBOVUxMKTsKKworICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QgKHJ0cGJpbiwgaWQpOworCisgIHJ0Y3Bfc2luayA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwYmluLCAicmVjdl9ydGNwX3NpbmtfMSIpOworICBmYWlsX3VubGVzcyAocnRjcF9zaW5rICE9IE5VTEwpOworICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkIChydHBiaW4sIHJ0Y3Bfc2luayk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHJ0Y3Bfc2luayk7CisKKyAgLyogcmVtb3ZlIHRoZSBzZXNzaW9uICovCisgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgcnRwX3NpbmsxKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocnRwX3NpbmsxKTsKKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAocnRwYmluLCBydHBfc2luazIpOworICBnc3Rfb2JqZWN0X3VucmVmIChydHBfc2luazIpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cGJpbik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfc2VuZGVyX2VvcykKK3sKKyAgR3N0RWxlbWVudCAqcnRwc2Vzc2lvbjsKKyAgR3N0QnVmZmVyICpydHBfYnVmZmVyOworICBHc3RCdWZmZXIgKnJ0Y3BfYnVmZmVyOworICBHc3RSVFBCdWZmZXIgcnRwYnVmID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKyAgR3N0UlRDUEJ1ZmZlciBydGNwYnVmID0gR1NUX1JUQ1BfQlVGRkVSX0lOSVQ7CisgIEdzdFJUQ1BQYWNrZXQgcnRjcHBhY2tldDsKKyAgc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHJlY3ZfdG1wbCA9CisgICAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLCBHU1RfUEFEX1NJTkssIEdTVF9QQURfQUxXQVlTLAorICAgICAgR1NUX1NUQVRJQ19DQVBTICgiQU5ZIikpOworICBHc3RQYWQgKnNlbmRfcnRwX3Npbms7CisgIEdzdFBhZCAqcmVjdl9ydGNwX3Npbms7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKyAgR3N0UGFkICpydHBfc2luaywgKnJ0Y3Bfc2luazsKKyAgR3N0Q2xvY2sgKmNsb2NrOworICBHc3RUZXN0Q2xvY2sgKnRjbG9jazsKKyAgR3N0U3RydWN0dXJlICpzOworICBndWludCBzc3JjID0gMTsKKyAgZ3VpbnQzMiBzc3JjX2luLCBwYWNrZXRfY291bnQsIG9jdGV0X2NvdW50OworICBnYm9vbGVhbiBnb3RfYnllID0gRkFMU0U7CisKKyAgY2xvY2sgPSBnc3RfdGVzdF9jbG9ja19uZXcgKCk7CisgIGdzdF9zeXN0ZW1fY2xvY2tfc2V0X2RlZmF1bHQgKGNsb2NrKTsKKyAgdGNsb2NrID0gR1NUX1RFU1RfQ0xPQ0sgKGNsb2NrKTsKKyAgZ3N0X3Rlc3RfY2xvY2tfc2V0X3RpbWUgKHRjbG9jaywgMCk7CisKKyAgcnRwc2Vzc2lvbiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cHNlc3Npb24iLCBOVUxMKTsKKyAgc2VuZF9ydHBfc2luayA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwc2Vzc2lvbiwgInNlbmRfcnRwX3NpbmsiKTsKKyAgcmVjdl9ydGNwX3NpbmsgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHJ0cHNlc3Npb24sICJyZWN2X3J0Y3Bfc2luayIpOworCisKKyAgcnRwX3NpbmsgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWRfYnlfbmFtZSAocnRwc2Vzc2lvbiwgJnJlY3ZfdG1wbCwKKyAgICAgICJzZW5kX3J0cF9zcmMiKTsKKyAgcnRjcF9zaW5rID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkX2J5X25hbWUgKHJ0cHNlc3Npb24sICZyZWN2X3RtcGwsCisgICAgICAic2VuZF9ydGNwX3NyYyIpOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAocnRwX3NpbmssIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0Y3Bfc2luaywgVFJVRSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChydHBzZXNzaW9uLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgLyogU2VuZCBpbml0aWFsIGV2ZW50cyAqLworCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9zZW5kX2V2ZW50IChzZW5kX3J0cF9zaW5rLAorICAgICAgICAgIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgiaWQiKSkpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9zZW5kX2V2ZW50IChzZW5kX3J0cF9zaW5rLAorICAgICAgICAgIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfc2VuZF9ldmVudCAocmVjdl9ydGNwX3NpbmssCisgICAgICAgICAgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKCJpZCIpKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3NlbmRfZXZlbnQgKHJlY3ZfcnRjcF9zaW5rLAorICAgICAgICAgIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgLyogR2V0IHRoZSBzdWdnZXN0ZWQgU1NSQyBmcm9tIHRoZSBydHBzZXNzaW9uICovCisKKyAgY2FwcyA9IGdzdF9wYWRfcXVlcnlfY2FwcyAoc2VuZF9ydHBfc2luaywgTlVMTCk7CisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgZ3N0X3N0cnVjdHVyZV9nZXQgKHMsICJzc3JjIiwgR19UWVBFX1VJTlQsICZzc3JjLCBOVUxMKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIC8qIFNlbmQgYSBSVFAgcGFja2V0ICovCisKKyAgcnRwX2J1ZmZlciA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoMTAsIDAsIDApOworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKHJ0cF9idWZmZXIsIEdTVF9NQVBfUkVBRFdSSVRFLCAmcnRwYnVmKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3NzcmMgKCZydHBidWYsIDEpOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfc2VxICgmcnRwYnVmLCAwKTsKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHBidWYpOworCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2NoYWluIChzZW5kX3J0cF9zaW5rLCBydHBfYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisKKyAgLyogTWFrZSBzdXJlIGl0IHdlbnQgdGhyb3VnaCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19wb2ludGVyIChidWZmZXJzLT5kYXRhLCBydHBfYnVmZmVyKTsKKyAgZ3N0X2NoZWNrX2Ryb3BfYnVmZmVycyAoKTsKKworICAvKiBBZHZhbmNlIHRpbWUgYW5kIHNlbmQgYSBwYWNrZXQgdG8gcHJldmVudCBzb3VyY2Ugc2VuZGVyIHRpbWVvdXQgKi8KKyAgZ3N0X3Rlc3RfY2xvY2tfc2V0X3RpbWUgKHRjbG9jaywgMSAqIEdTVF9TRUNPTkQpOworCisgIC8qIEp1c3Qgc2VuZCBhIHNlbmQgcGFja2V0IHRvIHByZXZlbnQgdGltZW91dCAqLworICBydHBfYnVmZmVyID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlICgxMCwgMCwgMCk7CisgIGdzdF9ydHBfYnVmZmVyX21hcCAocnRwX2J1ZmZlciwgR1NUX01BUF9SRUFEV1JJVEUsICZydHBidWYpOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfc3NyYyAoJnJ0cGJ1ZiwgMSk7CisgIGdzdF9ydHBfYnVmZmVyX3NldF9zZXEgKCZydHBidWYsIDEpOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfdGltZXN0YW1wICgmcnRwYnVmLCAxMCk7CisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwYnVmKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9jaGFpbiAoc2VuZF9ydHBfc2luaywgcnRwX2J1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworCisgIC8qIE1ha2Ugc3VyZSBpdCB3ZW50IHRocm91Z2ggKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX3VubGVzc19lcXVhbHNfcG9pbnRlciAoYnVmZmVycy0+ZGF0YSwgcnRwX2J1ZmZlcik7CisgIGdzdF9jaGVja19kcm9wX2J1ZmZlcnMgKCk7CisKKyAgLyogQWR2YW5jZSBjbG9jayB0d2ljZSBhbmQgd2Ugc2hvdWRsIGhhdmUgb25lIFJUQ1AgcGFja2V0IGF0IGxlYXN0ICovCisgIGdzdF90ZXN0X2Nsb2NrX2NyYW5rICh0Y2xvY2spOworICBnc3RfdGVzdF9jbG9ja19jcmFuayAodGNsb2NrKTsKKworICBnX211dGV4X2xvY2sgKCZjaGVja19tdXRleCk7CisgIHdoaWxlIChidWZmZXJzID09IE5VTEwpCisgICAgZ19jb25kX3dhaXQgKCZjaGVja19jb25kLCAmY2hlY2tfbXV0ZXgpOworCisgIGZhaWxfdW5sZXNzIChnc3RfcnRjcF9idWZmZXJfbWFwIChidWZmZXJzLT5kYXRhLCBHU1RfTUFQX1JFQUQsICZydGNwYnVmKSk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9ydGNwX2J1ZmZlcl9nZXRfZmlyc3RfcGFja2V0ICgmcnRjcGJ1ZiwgJnJ0Y3BwYWNrZXQpKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcnRjcF9wYWNrZXRfZ2V0X3R5cGUgKCZydGNwcGFja2V0KSwKKyAgICAgIEdTVF9SVENQX1RZUEVfU1IpOworICBnc3RfcnRjcF9wYWNrZXRfc3JfZ2V0X3NlbmRlcl9pbmZvICgmcnRjcHBhY2tldCwgJnNzcmNfaW4sIE5VTEwsIE5VTEwsCisgICAgICAmcGFja2V0X2NvdW50LCAmb2N0ZXRfY291bnQpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChwYWNrZXRfY291bnQsIDIpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChvY3RldF9jb3VudCwgMjApOworCisgIGZhaWxfdW5sZXNzIChnc3RfcnRjcF9wYWNrZXRfbW92ZV90b19uZXh0ICgmcnRjcHBhY2tldCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcnRjcF9wYWNrZXRfZ2V0X3R5cGUgKCZydGNwcGFja2V0KSwKKyAgICAgIEdTVF9SVENQX1RZUEVfU0RFUyk7CisKKyAgZ3N0X3J0Y3BfYnVmZmVyX3VubWFwICgmcnRjcGJ1Zik7CisgIGdzdF9jaGVja19kcm9wX2J1ZmZlcnMgKCk7CisKKyAgZ19tdXRleF91bmxvY2sgKCZjaGVja19tdXRleCk7CisKKworICAvKiBDcmVhdGUgYW5kIHNlbmQgYSB2YWxpZCBSVENQIHJlcGx5IHBhY2tldCAqLworICBydGNwX2J1ZmZlciA9IGdzdF9ydGNwX2J1ZmZlcl9uZXcgKDE1MDApOworICBnc3RfcnRjcF9idWZmZXJfbWFwIChydGNwX2J1ZmZlciwgR1NUX01BUF9SRUFEV1JJVEUsICZydGNwYnVmKTsKKyAgZ3N0X3J0Y3BfYnVmZmVyX2FkZF9wYWNrZXQgKCZydGNwYnVmLCBHU1RfUlRDUF9UWVBFX1JSLCAmcnRjcHBhY2tldCk7CisgIGdzdF9ydGNwX3BhY2tldF9ycl9zZXRfc3NyYyAoJnJ0Y3BwYWNrZXQsIHNzcmMgKyAxKTsKKyAgZ3N0X3J0Y3BfcGFja2V0X2FkZF9yYiAoJnJ0Y3BwYWNrZXQsIHNzcmMsIDAsIDAsIDAsIDAsIDAsIDApOworICBnc3RfcnRjcF9idWZmZXJfYWRkX3BhY2tldCAoJnJ0Y3BidWYsIEdTVF9SVENQX1RZUEVfU0RFUywgJnJ0Y3BwYWNrZXQpOworICBnc3RfcnRjcF9wYWNrZXRfc2Rlc19hZGRfaXRlbSAoJnJ0Y3BwYWNrZXQsIHNzcmMgKyAxKTsKKyAgZ3N0X3J0Y3BfcGFja2V0X3NkZXNfYWRkX2VudHJ5ICgmcnRjcHBhY2tldCwgR1NUX1JUQ1BfU0RFU19DTkFNRSwgMywKKyAgICAgIChndWludDggKikgImFAYSIpOworICBnc3RfcnRjcF9wYWNrZXRfc2Rlc19hZGRfZW50cnkgKCZydGNwcGFja2V0LCBHU1RfUlRDUF9TREVTX05BTUUsIDIsCisgICAgICAoZ3VpbnQ4ICopICJhYSIpOworICBnc3RfcnRjcF9wYWNrZXRfc2Rlc19hZGRfZW50cnkgKCZydGNwcGFja2V0LCBHU1RfUlRDUF9TREVTX0VORCwgMCwKKyAgICAgIChndWludDggKikgIiIpOworICBnc3RfcnRjcF9idWZmZXJfdW5tYXAgKCZydGNwYnVmKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfY2hhaW4gKHJlY3ZfcnRjcF9zaW5rLCBydGNwX2J1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworCisKKyAgLyogU2VuZCBhIEVPUyB0byB0cmlnZ2VyIHNlbmRpbmcgYSBCWUUgbWVzc2FnZSAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9zZW5kX2V2ZW50IChzZW5kX3J0cF9zaW5rLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworCisgIC8qIENyYW5rIHRvIHByb2Nlc3MgRU9TIGFuZCB3YWl0IGZvciBCWUUgKi8KKyAgZm9yICg7OykgeworICAgIGdzdF90ZXN0X2Nsb2NrX2NyYW5rICh0Y2xvY2spOworICAgIGdfbXV0ZXhfbG9jayAoJmNoZWNrX211dGV4KTsKKyAgICB3aGlsZSAoYnVmZmVycyA9PSBOVUxMKQorICAgICAgZ19jb25kX3dhaXQgKCZjaGVja19jb25kLCAmY2hlY2tfbXV0ZXgpOworCisgICAgZmFpbF91bmxlc3MgKGdzdF9ydGNwX2J1ZmZlcl9tYXAgKGdfbGlzdF9sYXN0IChidWZmZXJzKS0+ZGF0YSwgR1NUX01BUF9SRUFELAorICAgICAgICAgICAgJnJ0Y3BidWYpKTsKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3J0Y3BfYnVmZmVyX2dldF9maXJzdF9wYWNrZXQgKCZydGNwYnVmLCAmcnRjcHBhY2tldCkpOworCisgICAgd2hpbGUgKGdzdF9ydGNwX3BhY2tldF9tb3ZlX3RvX25leHQgKCZydGNwcGFja2V0KSkgeworICAgICAgaWYgKGdzdF9ydGNwX3BhY2tldF9nZXRfdHlwZSAoJnJ0Y3BwYWNrZXQpID09IEdTVF9SVENQX1RZUEVfQllFKSB7CisgICAgICAgIGdvdF9ieWUgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgZ19tdXRleF91bmxvY2sgKCZjaGVja19tdXRleCk7CisgICAgZ3N0X3J0Y3BfYnVmZmVyX3VubWFwICgmcnRjcGJ1Zik7CisKKyAgICBpZiAoZ290X2J5ZSkKKyAgICAgIGJyZWFrOworICB9CisKKyAgZ3N0X2NoZWNrX2Ryb3BfYnVmZmVycyAoKTsKKworCisgIGZhaWxfdW5sZXNzIChHU1RfUEFEX0lTX0VPUyAocnRwX3NpbmspKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9QQURfSVNfRU9TIChydGNwX3NpbmspKTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0cF9zaW5rLCBGQUxTRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAocnRjcF9zaW5rLCBGQUxTRSk7CisKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3BhZF9ieV9uYW1lIChydHBzZXNzaW9uLCAic2VuZF9ydHBfc3JjIik7CisgIGdzdF9jaGVja190ZWFyZG93bl9wYWRfYnlfbmFtZSAocnRwc2Vzc2lvbiwgInNlbmRfcnRjcF9zcmMiKTsKKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAocnRwc2Vzc2lvbiwgc2VuZF9ydHBfc2luayk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNlbmRfcnRwX3NpbmspOworICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkIChydHBzZXNzaW9uLCByZWN2X3J0Y3Bfc2luayk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHJlY3ZfcnRjcF9zaW5rKTsKKworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAocnRwc2Vzc2lvbik7CisKKyAgZ3N0X3N5c3RlbV9jbG9ja19zZXRfZGVmYXVsdCAoTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGNsb2NrKTsKKworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitydHBiaW5fc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgicnRwYmluIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhZHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfY2xlYW51cF9zZW5kKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2NsZWFudXBfcmVjdik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9jbGVhbnVwX3JlY3YyKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3JlcXVlc3RfcGFkX2J5X3RlbXBsYXRlX25hbWUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZW5jb2Rlcik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9kZWNvZGVyKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2F1eF9zZW5kZXIpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYXV4X3JlY2VpdmVyKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3NlbmRlcl9lb3MpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAocnRwYmluKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbl9idWZmZXJfbGlzdC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluX2J1ZmZlcl9saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZhNzc5MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbl9idWZmZXJfbGlzdC5jCkBAIC0wLDAgKzEsMzM1IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBVbml0IHRlc3QgZm9yIGdzdHJ0cGJpbiBzZW5kaW5nIHJ0cCBwYWNrZXRzIHVzaW5nIEdzdEJ1ZmZlckxpc3QuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQnJhbmtvIFN1YmFzaWMgPGJyYW5rbyBkb3Qgc3ViYXNpYyBhdCBheGlzIGRvdCBjb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworCisjaWYgMAorCisvKiBUaGlzIHRlc3QgbWFrZXMgc3VyZSB0aGF0IFJUUCBwYWNrZXRzIHNlbnQgYXMgYnVmZmVyIGxpc3RzIGFyZSBzZW50IHRocm91Z2gKKyAqIHRoZSBydHBiaW4gYXMgdGhleSBhcmUgc3VwcG9zZWQgdG8sIGFuZCBub3QgY29ycnVwdGVkIGluIGFueSB3YXkuCisgKi8KKworCisjZGVmaW5lIFRFU1RfQ0FQUyBcCisgICJhcHBsaWNhdGlvbi94LXJ0cCwgIiAgICAgICAgICAgICAgICBcCisgICJtZWRpYT0oc3RyaW5nKXZpZGVvLCAiICAgICAgICAgICAgICBcCisgICJjbG9jay1yYXRlPShpbnQpOTAwMDAsICIgICAgICAgICAgICBcCisgICJlbmNvZGluZy1uYW1lPShzdHJpbmcpSDI2NCwgIiAgICAgICBcCisgICJwcm9maWxlLWxldmVsLWlkPShzdHJpbmcpNGQ0MDE1LCAiICBcCisgICJwYXlsb2FkPShpbnQpOTYsICIgICAgICAgICAgICAgICAgICBcCisgICJzc3JjPShndWludCkyNjMzMjM3NDMyLCAiICAgICAgICAgICBcCisgICJjbG9jay1iYXNlPShndWludCkxODY4MjY3MDE1LCAiICAgICBcCisgICJzZXFudW0tYmFzZT0oZ3VpbnQpNTQyMjkiCisKKworLyogUlRQIGhlYWRlcnMgYW5kIHRoZSBmaXJzdCAyIGJ5dGVzIG9mIHRoZSBwYXlsb2FkIChGVSBpbmRpY2F0b3IgYW5kIEZVIGhlYWRlcikKKyAqLworc3RhdGljIGNvbnN0IGd1aW50OCBydHBfaGVhZGVyWzJdWzE0XSA9IHsKKyAgezB4ODAsIDB4NjAsIDB4YmIsIDB4YjcsIDB4NWMsIDB4ZTksIDB4MDksCisgICAgICAweDBkLCAweGY1LCAweDljLCAweDQzLCAweDU1LCAweDFjLCAweDg2fSwKKyAgezB4ODAsIDB4NjAsIDB4YmIsIDB4YjgsIDB4NWMsIDB4ZTksIDB4MDksCisgICAgICAweDBkLCAweGY1LCAweDljLCAweDQzLCAweDU1LCAweDFjLCAweDQ2fQorfTsKKworc3RhdGljIGNvbnN0IGd1aW50IHJ0cF9oZWFkZXJfbGVuW10gPSB7CisgIHNpemVvZiBydHBfaGVhZGVyWzBdLAorICBzaXplb2YgcnRwX2hlYWRlclsxXQorfTsKKworc3RhdGljIEdzdEJ1ZmZlciAqaGVhZGVyX2J1ZmZlclsyXSA9IHsgTlVMTCwgTlVMTCB9OworCisKKy8qIFNvbWUgcGF5bG9hZC4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKnBheWxvYWQgPQorICAgICIwMTIzNDU2Nzg5QUJTREVGMDEyMzQ1Njc4OUFCU0RFRjAxMjM0NTY3ODlBQlNERUYwMTIzNDU2Nzg5QUJTREVGMDEyMzQ1Njc4OUFCU0RFRiIKKyAgICAiMDEyMzQ1Njc4OUFCU0RFRjAxMjM0NTY3ODlBQlNERUYwMTIzNDU2Nzg5QUJTREVGMDEyMzQ1Njc4OUFCU0RFRjAxMjM0NTY3ODlBQlNERUYiCisgICAgIjAxMjM0NTY3ODlBQlNERUYwMTIzNDU2Nzg5QUJTREVGMDEyMzQ1Njc4OUFCU0RFRjAxMjM0NTY3ODlBQlNERUYwMTIzNDU2Nzg5QUJTREVGIgorICAgICIwMTIzNDU2Nzg5QUJTREVGMDEyMzQ1Njc4OUFCU0RFRjAxMjM0NTY3ODlBQlNERUYwMTIzNDU2Nzg5QUJTREVGMDEyMzQ1Njc4OUFCU0RFRiIKKyAgICAiMDEyMzQ1Njc4OUFCU0RFRjAxMjM0NTY3ODlBQlNERUYwMTIzNDU2Nzg5QUJTREVGMDEyMzQ1Njc4OUFCU0RFRjAxMjM0NTY3ODlBQlNERUYiCisgICAgIjAxMjM0NTY3ODlBQlNERUYwMTIzNDU2Nzg5QUJTREVGMDEyMzQ1Njc4OUFCU0RFRjAxMjM0NTY3ODlBQlNERUYwMTIzNDU2Nzg5QUJTREVGIgorICAgICIwMTIzNDU2Nzg5QUJTREVGMDEyMzQ1NiI7CisKK3N0YXRpYyBjb25zdCBndWludCBwYXlsb2FkX29mZnNldFtdID0geworICAwLCA0OTgKK307CisKK3N0YXRpYyBjb25zdCBndWludCBwYXlsb2FkX2xlbltdID0geworICA0OTgsIDUKK307CisKKworc3RhdGljIEdzdEJ1ZmZlciAqb3JpZ2luYWxfYnVmZmVyID0gTlVMTDsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwIikpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAiKSk7CisKKworc3RhdGljIEdzdEJ1ZmZlciAqCitfY3JlYXRlX29yaWdpbmFsX2J1ZmZlciAodm9pZCkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKworICBpZiAob3JpZ2luYWxfYnVmZmVyICE9IE5VTEwpCisgICAgcmV0dXJuIG9yaWdpbmFsX2J1ZmZlcjsKKworICBvcmlnaW5hbF9idWZmZXIgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgZmFpbF91bmxlc3MgKG9yaWdpbmFsX2J1ZmZlciAhPSBOVUxMKTsKKworICBnc3RfYnVmZmVyX3NldF9kYXRhIChvcmlnaW5hbF9idWZmZXIsIChndWludDggKikgcGF5bG9hZCwgc3RybGVuIChwYXlsb2FkKSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChvcmlnaW5hbF9idWZmZXIpID0KKyAgICAgIGdzdF9jbG9ja19nZXRfaW50ZXJuYWxfdGltZSAoZ3N0X3N5c3RlbV9jbG9ja19vYnRhaW4gKCkpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoVEVTVF9DQVBTKTsKKyAgZmFpbF91bmxlc3MgKGNhcHMgIT0gTlVMTCk7CisgIGdzdF9idWZmZXJfc2V0X2NhcHMgKG9yaWdpbmFsX2J1ZmZlciwgY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICByZXR1cm4gb3JpZ2luYWxfYnVmZmVyOworfQorCitzdGF0aWMgR3N0QnVmZmVyTGlzdCAqCitfY3JlYXRlX2J1ZmZlcl9saXN0ICh2b2lkKQoreworICBHc3RCdWZmZXJMaXN0ICpsaXN0OworICBHc3RCdWZmZXJMaXN0SXRlcmF0b3IgKml0OworICBHc3RCdWZmZXIgKm9yaWdfYnVmZmVyOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKworICBvcmlnX2J1ZmZlciA9IF9jcmVhdGVfb3JpZ2luYWxfYnVmZmVyICgpOworICBmYWlsX2lmIChvcmlnX2J1ZmZlciA9PSBOVUxMKTsKKworICBsaXN0ID0gZ3N0X2J1ZmZlcl9saXN0X25ldyAoKTsKKyAgZmFpbF9pZiAobGlzdCA9PSBOVUxMKTsKKworICBpdCA9IGdzdF9idWZmZXJfbGlzdF9pdGVyYXRlIChsaXN0KTsKKyAgZmFpbF9pZiAoaXQgPT0gTlVMTCk7CisKKyAgLyoqKiBGaXJzdCBncm91cCwgaS5lLiBmaXJzdCBwYWNrZXQuICoqLworICBnc3RfYnVmZmVyX2xpc3RfaXRlcmF0b3JfYWRkX2dyb3VwIChpdCk7CisKKyAgLyogQ3JlYXRlIGJ1ZmZlciB3aXRoIFJUUCBoZWFkZXIgYW5kIGFkZCBpdCB0byB0aGUgMXN0IGdyb3VwICovCisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3ICgpOworICBHU1RfQlVGRkVSX01BTExPQ0RBVEEgKGJ1ZmZlcikgPSBnX21lbWR1cCAoJnJ0cF9oZWFkZXJbMF0sIHJ0cF9oZWFkZXJfbGVuWzBdKTsKKyAgR1NUX0JVRkZFUl9EQVRBIChidWZmZXIpID0gR1NUX0JVRkZFUl9NQUxMT0NEQVRBIChidWZmZXIpOworICBHU1RfQlVGRkVSX1NJWkUgKGJ1ZmZlcikgPSBydHBfaGVhZGVyX2xlblswXTsKKyAgZ3N0X2J1ZmZlcl9jb3B5X21ldGFkYXRhIChidWZmZXIsIG9yaWdfYnVmZmVyLCBHU1RfQlVGRkVSX0NPUFlfQUxMKTsKKyAgaGVhZGVyX2J1ZmZlclswXSA9IGJ1ZmZlcjsKKyAgZ3N0X2J1ZmZlcl9saXN0X2l0ZXJhdG9yX2FkZCAoaXQsIGJ1ZmZlcik7CisKKyAgLyogQ3JlYXRlIHRoZSBwYXlsb2FkIGJ1ZmZlciBhbmQgYWRkIGl0IHRvIHRoZSAxc3QgZ3JvdXAKKyAgICovCisgIGJ1ZmZlciA9CisgICAgICBnc3RfYnVmZmVyX2NyZWF0ZV9zdWIgKG9yaWdfYnVmZmVyLCBwYXlsb2FkX29mZnNldFswXSwgcGF5bG9hZF9sZW5bMF0pOworICBmYWlsX2lmIChidWZmZXIgPT0gTlVMTCk7CisgIGdzdF9idWZmZXJfbGlzdF9pdGVyYXRvcl9hZGQgKGl0LCBidWZmZXIpOworCisKKyAgLyoqKiAgU2Vjb25kIGdyb3VwLCBpLmUuIHNlY29uZCBwYWNrZXQuICoqKi8KKworICAvKiBDcmVhdGUgYSBuZXcgZ3JvdXAgdG8gaG9sZCB0aGUgcnRwIGhlYWRlciBhbmQgdGhlIHBheWxvYWQgKi8KKyAgZ3N0X2J1ZmZlcl9saXN0X2l0ZXJhdG9yX2FkZF9ncm91cCAoaXQpOworCisgIC8qIENyZWF0ZSBidWZmZXIgd2l0aCBSVFAgaGVhZGVyIGFuZCBhZGQgaXQgdG8gdGhlIDJuZCBncm91cCAqLworICBidWZmZXIgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgR1NUX0JVRkZFUl9NQUxMT0NEQVRBIChidWZmZXIpID0gZ19tZW1kdXAgKCZydHBfaGVhZGVyWzFdLCBydHBfaGVhZGVyX2xlblsxXSk7CisgIEdTVF9CVUZGRVJfREFUQSAoYnVmZmVyKSA9IEdTVF9CVUZGRVJfTUFMTE9DREFUQSAoYnVmZmVyKTsKKyAgR1NUX0JVRkZFUl9TSVpFIChidWZmZXIpID0gcnRwX2hlYWRlcl9sZW5bMV07CisgIGdzdF9idWZmZXJfY29weV9tZXRhZGF0YSAoYnVmZmVyLCBvcmlnX2J1ZmZlciwgR1NUX0JVRkZFUl9DT1BZX0FMTCk7CisgIGhlYWRlcl9idWZmZXJbMV0gPSBidWZmZXI7CisKKyAgLyogQWRkIHRoZSBydHAgaGVhZGVyIHRvIHRoZSBidWZmZXIgbGlzdCAqLworICBnc3RfYnVmZmVyX2xpc3RfaXRlcmF0b3JfYWRkIChpdCwgYnVmZmVyKTsKKworICAvKiBDcmVhdGUgdGhlIHBheWxvYWQgYnVmZmVyIGFuZCBhZGQgaXQgdG8gdGhlIDJkIGdyb3VwCisgICAqLworICBidWZmZXIgPQorICAgICAgZ3N0X2J1ZmZlcl9jcmVhdGVfc3ViIChvcmlnX2J1ZmZlciwgcGF5bG9hZF9vZmZzZXRbMV0sIHBheWxvYWRfbGVuWzFdKTsKKyAgZmFpbF9pZiAoYnVmZmVyID09IE5VTEwpOworICBnc3RfYnVmZmVyX2xpc3RfaXRlcmF0b3JfYWRkIChpdCwgYnVmZmVyKTsKKworICBnc3RfYnVmZmVyX2xpc3RfaXRlcmF0b3JfZnJlZSAoaXQpOworCisgIHJldHVybiBsaXN0OworfQorCisKK3N0YXRpYyB2b2lkCitfY2hlY2tfaGVhZGVyIChHc3RCdWZmZXIgKiBidWZmZXIsIGd1aW50IGluZGV4KQoreworICBndWludDggKmRhdGE7CisKKyAgZmFpbF9pZiAoYnVmZmVyID09IE5VTEwpOworICBmYWlsX3VubGVzcyAoaW5kZXggPCAyKTsKKworICBmYWlsX3VubGVzcyAoR1NUX0JVRkZFUl9TSVpFIChidWZmZXIpID09IHJ0cF9oZWFkZXJfbGVuW2luZGV4XSk7CisKKyAgLyogQ2FuJ3QgZG8gYSBtZW1jbXAoKSBvbiB0aGUgd2hvbGUgaGVhZGVyLCBjYXVzZSB0aGUgU1NSQyAoYnl0ZXMgOC0xMSkgd2lsbAorICAgKiBtb3N0IGxpa2VseSBiZSBjaGFuZ2VkIGluIGdzdHJ0cGJpbi4KKyAgICovCisgIGZhaWxfdW5sZXNzICgoZGF0YSA9IEdTVF9CVUZGRVJfREFUQSAoYnVmZmVyKSkgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKCooZ3VpbnQ2NCAqKSBkYXRhLCAqKGd1aW50NjQgKikgcnRwX2hlYWRlcltpbmRleF0pOworICBmYWlsX3VubGVzcyAoKihndWludDE2ICopIChkYXRhICsgMTIpID09CisgICAgICAqKGd1aW50MTYgKikgKHJ0cF9oZWFkZXJbaW5kZXhdICsgMTIpKTsKK30KKworCitzdGF0aWMgdm9pZAorX2NoZWNrX3BheWxvYWQgKEdzdEJ1ZmZlciAqIGJ1ZmZlciwgZ3VpbnQgaW5kZXgpCit7CisgIGZhaWxfaWYgKGJ1ZmZlciA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGluZGV4IDwgMik7CisKKyAgZmFpbF91bmxlc3MgKEdTVF9CVUZGRVJfU0laRSAoYnVmZmVyKSA9PSBwYXlsb2FkX2xlbltpbmRleF0pOworICBmYWlsX2lmIChHU1RfQlVGRkVSX0RBVEEgKGJ1ZmZlcikgIT0KKyAgICAgIChncG9pbnRlcikgKHBheWxvYWQgKyBwYXlsb2FkX29mZnNldFtpbmRleF0pKTsKKyAgZmFpbF9pZiAobWVtY21wIChHU1RfQlVGRkVSX0RBVEEgKGJ1ZmZlciksIHBheWxvYWQgKyBwYXlsb2FkX29mZnNldFtpbmRleF0sCisgICAgICAgICAgcGF5bG9hZF9sZW5baW5kZXhdKSk7Cit9CisKKworc3RhdGljIHZvaWQKK19jaGVja19ncm91cCAoR3N0QnVmZmVyTGlzdEl0ZXJhdG9yICogaXQsIGd1aW50IGluZGV4LCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgZmFpbF91bmxlc3MgKGl0ICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9saXN0X2l0ZXJhdG9yX25fYnVmZmVycyAoaXQpID09IDIpOworICBmYWlsX3VubGVzcyAoY2FwcyAhPSBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoKGJ1ZmZlciA9IGdzdF9idWZmZXJfbGlzdF9pdGVyYXRvcl9uZXh0IChpdCkpICE9IE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSA9PQorICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG9yaWdpbmFsX2J1ZmZlcikpOworCisgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19pc19lcXVhbCAoR1NUX0JVRkZFUl9DQVBTIChvcmlnaW5hbF9idWZmZXIpLAorICAgICAgICAgIEdTVF9CVUZGRVJfQ0FQUyAoYnVmZmVyKSkpOworCisgIF9jaGVja19oZWFkZXIgKGJ1ZmZlciwgaW5kZXgpOworCisgIGZhaWxfdW5sZXNzICgoYnVmZmVyID0gZ3N0X2J1ZmZlcl9saXN0X2l0ZXJhdG9yX25leHQgKGl0KSkgIT0gTlVMTCk7CisgIF9jaGVja19wYXlsb2FkIChidWZmZXIsIGluZGV4KTsKK30KKworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorX3NpbmtfY2hhaW5fbGlzdCAoR3N0UGFkICogcGFkLCBHc3RCdWZmZXJMaXN0ICogbGlzdCkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0QnVmZmVyTGlzdEl0ZXJhdG9yICppdDsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKFRFU1RfQ0FQUyk7CisgIGZhaWxfdW5sZXNzIChjYXBzICE9IE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChHU1RfSVNfQlVGRkVSX0xJU1QgKGxpc3QpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbGlzdF9uX2dyb3VwcyAobGlzdCkgPT0gMik7CisKKyAgaXQgPSBnc3RfYnVmZmVyX2xpc3RfaXRlcmF0ZSAobGlzdCk7CisgIGZhaWxfaWYgKGl0ID09IE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2xpc3RfaXRlcmF0b3JfbmV4dF9ncm91cCAoaXQpKTsKKyAgX2NoZWNrX2dyb3VwIChpdCwgMCwgY2Fwcyk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbGlzdF9pdGVyYXRvcl9uZXh0X2dyb3VwIChpdCkpOworICBfY2hlY2tfZ3JvdXAgKGl0LCAxLCBjYXBzKTsKKworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9idWZmZXJfbGlzdF9pdGVyYXRvcl9mcmVlIChpdCk7CisKKyAgZ3N0X2J1ZmZlcl9saXN0X3VucmVmIChsaXN0KTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKKworc3RhdGljIHZvaWQKK19zZXRfY2hhaW5fZnVuY3Rpb25zIChHc3RQYWQgKiBwYWQpCit7CisgIGdzdF9wYWRfc2V0X2NoYWluX2xpc3RfZnVuY3Rpb24gKHBhZCwgX3NpbmtfY2hhaW5fbGlzdCk7Cit9CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYnVmZmVybGlzdCkKK3sKKyAgR3N0RWxlbWVudCAqcnRwYmluOworICBHc3RQYWQgKnNpbmtwYWQ7CisgIEdzdFBhZCAqc3JjcGFkOworICBHc3RCdWZmZXJMaXN0ICpsaXN0OworCisgIGxpc3QgPSBfY3JlYXRlX2J1ZmZlcl9saXN0ICgpOworICBmYWlsX3VubGVzcyAobGlzdCAhPSBOVUxMKTsKKworICBydHBiaW4gPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoImdzdHJ0cGJpbiIpOworCisgIHNyY3BhZCA9CisgICAgICBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZF9ieV9uYW1lIChydHBiaW4sICZzcmN0ZW1wbGF0ZSwgInNlbmRfcnRwX3NpbmtfMCIpOworICBmYWlsX2lmIChzcmNwYWQgPT0gTlVMTCk7CisgIHNpbmtwYWQgPQorICAgICAgZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkX2J5X25hbWUgKHJ0cGJpbiwgJnNpbmt0ZW1wbGF0ZSwKKyAgICAgICJzZW5kX3J0cF9zcmNfMCIpOworICBmYWlsX2lmIChzaW5rcGFkID09IE5VTEwpOworCisgIF9zZXRfY2hhaW5fZnVuY3Rpb25zIChzaW5rcGFkKTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNpbmtwYWQsIFRSVUUpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHJ0cGJpbiwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2xpc3QgKHNyY3BhZCwgbGlzdCkgPT0gR1NUX0ZMT1dfT0spOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNpbmtwYWQsIEZBTFNFKTsKKworICBnc3RfY2hlY2tfdGVhcmRvd25fcGFkX2J5X25hbWUgKHJ0cGJpbiwgInNlbmRfcnRwX3NyY18wIik7CisgIGdzdF9jaGVja190ZWFyZG93bl9wYWRfYnlfbmFtZSAocnRwYmluLCAic2VuZF9ydHBfc2lua18wIik7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChydHBiaW4pOworfQorCitHU1RfRU5EX1RFU1Q7CisKKyNlbmRpZgorCisKK3N0YXRpYyBTdWl0ZSAqCitidWZmZXJsaXN0X3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoIkJ1ZmZlckxpc3QiKTsKKworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgLyogdGltZSBvdXQgYWZ0ZXIgMzBzLiAqLworICB0Y2FzZV9zZXRfdGltZW91dCAodGNfY2hhaW4sIDEwKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyNpZiAwCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9idWZmZXJsaXN0KTsKKyNlbmRpZgorCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoYnVmZmVybGlzdCk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBidW5kbGUuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJ1bmRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNDc3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBidW5kbGUuYwpAQCAtMCwwICsxLDM5MCBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IElnYWxpYSBTLkwuCisgKiAgIEBhdXRob3IgUGhpbGlwcGUgTm9ybWFuZCA8cGhpbG5AaWdhbGlhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNvbnNpc3RlbmN5Y2hlY2tlci5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3R0ZXN0Y2xvY2suaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCitzdGF0aWMgR01haW5Mb29wICptYWluX2xvb3A7CisKK3N0YXRpYyB2b2lkCittZXNzYWdlX3JlY2VpdmVkIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBHc3RQaXBlbGluZSAqIGJpbikKK3sKKyAgR1NUX0lORk8gKCJidXMgbWVzc2FnZSBmcm9tIFwiJSIgR1NUX1BUUl9GT1JNQVQgIlwiOiAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSksIG1lc3NhZ2UpOworCisgIHN3aXRjaCAobWVzc2FnZS0+dHlwZSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfRU9TOgorICAgICAgZ19tYWluX2xvb3BfcXVpdCAobWFpbl9sb29wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01FU1NBR0VfV0FSTklORzp7CisgICAgICBHRXJyb3IgKmdlcnJvcjsKKyAgICAgIGdjaGFyICpkZWJ1ZzsKKworICAgICAgZ3N0X21lc3NhZ2VfcGFyc2Vfd2FybmluZyAobWVzc2FnZSwgJmdlcnJvciwgJmRlYnVnKTsKKyAgICAgIGdzdF9vYmplY3RfZGVmYXVsdF9lcnJvciAoR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKSwgZ2Vycm9yLCBkZWJ1Zyk7CisgICAgICBnX2Vycm9yX2ZyZWUgKGdlcnJvcik7CisgICAgICBnX2ZyZWUgKGRlYnVnKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VSUk9SOnsKKyAgICAgIEdFcnJvciAqZ2Vycm9yOworICAgICAgZ2NoYXIgKmRlYnVnOworCisgICAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobWVzc2FnZSwgJmdlcnJvciwgJmRlYnVnKTsKKyAgICAgIGdzdF9vYmplY3RfZGVmYXVsdF9lcnJvciAoR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKSwgZ2Vycm9yLCBkZWJ1Zyk7CisgICAgICBnX2Vycm9yX2ZyZWUgKGdlcnJvcik7CisgICAgICBnX2ZyZWUgKGRlYnVnKTsKKyAgICAgIGZhaWwgKCJFcnJvciEiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK29uX3J0cGJpbnJlY2VpdmVfcGFkX2FkZGVkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogbmV3X3BhZCwKKyAgICBncG9pbnRlciBkYXRhKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZSA9IEdTVF9FTEVNRU5UIChkYXRhKTsKKyAgZ2NoYXIgKnBhZF9uYW1lID0gZ3N0X3BhZF9nZXRfbmFtZSAobmV3X3BhZCk7CisKKyAgaWYgKGdfc3RyX2hhc19wcmVmaXggKHBhZF9uYW1lLCAicmVjdl9ydHBfc3JjXyIpKSB7CisgICAgR3N0Q2FwcyAqY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAobmV3X3BhZCk7CisgICAgR3N0U3RydWN0dXJlICpzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgICAgY29uc3QgZ2NoYXIgKm1lZGlhX3R5cGUgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJtZWRpYSIpOworICAgIGdjaGFyICpkZXBheWxvYWRlcl9uYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiJXNfcnRwZGVwYXlsb2FkZXIiLCBtZWRpYV90eXBlKTsKKyAgICBHc3RFbGVtZW50ICpydHBkZXBheWxvYWRlciA9CisgICAgICAgIGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgZGVwYXlsb2FkZXJfbmFtZSk7CisgICAgR3N0UGFkICpzaW5rcGFkOworCisgICAgZ19mcmVlIChkZXBheWxvYWRlcl9uYW1lKTsKKyAgICBmYWlsX3VubGVzcyAocnRwZGVwYXlsb2FkZXIgIT0gTlVMTCwgTlVMTCk7CisKKyAgICBzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHJ0cGRlcGF5bG9hZGVyLCAic2luayIpOworICAgIGdzdF9wYWRfbGluayAobmV3X3BhZCwgc2lua3BhZCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocnRwZGVwYXlsb2FkZXIpOworCisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICB9CisgIGdfZnJlZSAocGFkX25hbWUpOworfQorCitzdGF0aWMgZ3VpbnQKK29uX2J1bmRsZWRfc3NyYyAoR3N0RWxlbWVudCAqIHJ0cGJpbiwgZ3VpbnQgc3NyYywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBzdGF0aWMgZ2Jvb2xlYW4gY3JlYXRlX3Nlc3Npb24gPSBGQUxTRTsKKyAgZ3VpbnQgc2Vzc2lvbl9pZCA9IDA7CisKKyAgaWYgKGNyZWF0ZV9zZXNzaW9uKSB7CisgICAgc2Vzc2lvbl9pZCA9IDE7CisgIH0gZWxzZSB7CisgICAgY3JlYXRlX3Nlc3Npb24gPSBUUlVFOworICAgIC8qIHVzZSBleGlzdGluZyBzZXNzaW9uIDAsIGEgbmV3IHNlc3Npb24gd2lsbCBiZSBjcmVhdGVkIGZvciB0aGUgbmV4dCBkaXNjb3ZlcmVkIGJ1bmRsZWQgU1NSQyAqLworICB9CisgIHJldHVybiBzZXNzaW9uX2lkOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitvbl9yZXF1ZXN0X3B0X21hcCAoR3N0RWxlbWVudCAqIHJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbl9pZCwgZ3VpbnQgcHQsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RDYXBzICpjYXBzID0gTlVMTDsKKyAgaWYgKHB0ID09IDk2KSB7CisgICAgY2FwcyA9CisgICAgICAgIGdzdF9jYXBzX2Zyb21fc3RyaW5nCisgICAgICAgICgiYXBwbGljYXRpb24veC1ydHAsbWVkaWE9KHN0cmluZylhdWRpbyxlbmNvZGluZy1uYW1lPShzdHJpbmcpUENNQSxjbG9jay1yYXRlPShpbnQpODAwMCIpOworICB9IGVsc2UgaWYgKHB0ID09IDEwMCkgeworICAgIGNhcHMgPQorICAgICAgICBnc3RfY2Fwc19mcm9tX3N0cmluZworICAgICAgICAoImFwcGxpY2F0aW9uL3gtcnRwLG1lZGlhPShzdHJpbmcpdmlkZW8sZW5jb2RpbmctbmFtZT0oc3RyaW5nKVJBVyxjbG9jay1yYXRlPShpbnQpOTAwMDAsc2FtcGxpbmc9KHN0cmluZylcIllDYkNyLTQ6MjowXCIsZGVwdGg9KHN0cmluZyk4LHdpZHRoPShzdHJpbmcpMzIwLGhlaWdodD0oc3RyaW5nKTI0MCIpOworICB9CisgIHJldHVybiBjYXBzOworfQorCisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK2NyZWF0ZV9waXBlbGluZSAoZ2Jvb2xlYW4gc2VuZCkKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmUsICpydHBiaW4sICphdWRpb3NyYywgKmF1ZGlvX2VuY29kZXIsCisgICAgICAqYXVkaW9fcnRwcGF5bG9hZGVyLCAqc2VuZHJ0cF91ZHBzaW5rLCAqcmVjdl9ydHBfdWRwc3JjLAorICAgICAgKnNlbmRfcnRjcF91ZHBzaW5rLCAqcmVjdl9ydGNwX3VkcHNyYywgKnNlbmRydGNwX2Z1bm5lbCwgKnNlbmRydHBfZnVubmVsOworICBHc3RFbGVtZW50ICphdWRpb19ydHBkZXBheWxvYWRlciwgKmF1ZGlvX2RlY29kZXIsICphdWRpb19zaW5rOworICBHc3RFbGVtZW50ICp2aWRlb3NyYywgKnZpZGVvX3J0cHBheWxvYWRlciwgKnZpZGVvX3J0cGRlcGF5bG9hZGVyLCAqdmlkZW9fc2luazsKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RQYWQgKmZ1bm5lbF9wYWQsICpydHBfc3JjX3BhZDsKKyAgR3N0Q2FwcyAqcnRwY2FwczsKKyAgZ2ludCBydHBfdWRwX3BvcnQgPSA1MDAxOworICBnaW50IHJ0Y3BfdWRwX3BvcnQgPSA1MDAyOworCisgIHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoc2VuZCA/ICJwaXBlbGluZV9zZW5kIiA6ICJwaXBlbGluZV9yZWNlaXZlIik7CisKKyAgcnRwYmluID0KKyAgICAgIGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cGJpbiIsCisgICAgICBzZW5kID8gInJ0cGJpbl9zZW5kIiA6ICJydHBiaW5fcmVjZWl2ZSIpOworICBnX29iamVjdF9zZXQgKHJ0cGJpbiwgImxhdGVuY3kiLCAyMDAsIE5VTEwpOworCisgIGlmICghc2VuZCkgeworICAgIGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cGJpbiwgIm9uLWJ1bmRsZWQtc3NyYyIsCisgICAgICAgIEdfQ0FMTEJBQ0sgKG9uX2J1bmRsZWRfc3NyYyksIE5VTEwpOworICAgIGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cGJpbiwgInJlcXVlc3QtcHQtbWFwIiwKKyAgICAgICAgR19DQUxMQkFDSyAob25fcmVxdWVzdF9wdF9tYXApLCBOVUxMKTsKKyAgfQorCisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cGJpbiwgInBhZC1hZGRlZCIsCisgICAgICBHX0NBTExCQUNLIChvbl9ydHBiaW5yZWNlaXZlX3BhZF9hZGRlZCksIHBpcGVsaW5lKTsKKworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBydHBiaW4pOworCisgIGlmIChzZW5kKSB7CisgICAgYXVkaW9zcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb3Rlc3RzcmMiLCBOVUxMKTsKKyAgICBhdWRpb19lbmNvZGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYWxhd2VuYyIsIE5VTEwpOworICAgIGF1ZGlvX3J0cHBheWxvYWRlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cHBjbWFwYXkiLCBOVUxMKTsKKyAgICBnX29iamVjdF9zZXQgKGF1ZGlvX3J0cHBheWxvYWRlciwgInB0IiwgOTYsIE5VTEwpOworICAgIGdfb2JqZWN0X3NldCAoYXVkaW9fcnRwcGF5bG9hZGVyLCAic2VxbnVtLW9mZnNldCIsIDEsIE5VTEwpOworCisgICAgdmlkZW9zcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCBOVUxMKTsKKyAgICB2aWRlb19ydHBwYXlsb2FkZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHB2cmF3cGF5IiwgTlVMTCk7CisgICAgZ19vYmplY3Rfc2V0ICh2aWRlb19ydHBwYXlsb2FkZXIsICJwdCIsIDEwMCwgInNlcW51bS1vZmZzZXQiLCAxLCBOVUxMKTsKKworICAgIGdfb2JqZWN0X3NldCAoYXVkaW9zcmMsICJudW0tYnVmZmVycyIsIDUsIE5VTEwpOworICAgIGdfb2JqZWN0X3NldCAodmlkZW9zcmMsICJudW0tYnVmZmVycyIsIDUsIE5VTEwpOworCisgICAgLyogbXV4ZWQgcnRjcCAqLworICAgIHNlbmRydGNwX2Z1bm5lbCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZ1bm5lbCIsICJzZW5kX3J0Y3BfZnVubmVsIik7CisgICAgc2VuZF9ydGNwX3VkcHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1ZHBzaW5rIiwgTlVMTCk7CisgICAgZ19vYmplY3Rfc2V0IChzZW5kX3J0Y3BfdWRwc2luaywgImhvc3QiLCAiMTI3LjAuMC4xIiwgTlVMTCk7CisgICAgZ19vYmplY3Rfc2V0IChzZW5kX3J0Y3BfdWRwc2luaywgInBvcnQiLCBydGNwX3VkcF9wb3J0LCBOVUxMKTsKKyAgICBnX29iamVjdF9zZXQgKHNlbmRfcnRjcF91ZHBzaW5rLCAic3luYyIsIEZBTFNFLCBOVUxMKTsKKyAgICBnX29iamVjdF9zZXQgKHNlbmRfcnRjcF91ZHBzaW5rLCAiYXN5bmMiLCBGQUxTRSwgTlVMTCk7CisKKyAgICAvKiBvdXRnb2luZyBidW5kbGVkIHN0cmVhbSAqLworICAgIHNlbmRydHBfZnVubmVsID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZnVubmVsIiwgInNlbmRfcnRwX2Z1bm5lbCIpOworICAgIHNlbmRydHBfdWRwc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInVkcHNpbmsiLCBOVUxMKTsKKyAgICBnX29iamVjdF9zZXQgKHNlbmRydHBfdWRwc2luaywgImhvc3QiLCAiMTI3LjAuMC4xIiwgTlVMTCk7CisgICAgZ19vYmplY3Rfc2V0IChzZW5kcnRwX3VkcHNpbmssICJwb3J0IiwgcnRwX3VkcF9wb3J0LCBOVUxMKTsKKworICAgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgYXVkaW9zcmMsIGF1ZGlvX2VuY29kZXIsCisgICAgICAgIGF1ZGlvX3J0cHBheWxvYWRlciwgc2VuZHJ0cF91ZHBzaW5rLCBzZW5kX3J0Y3BfdWRwc2luaywKKyAgICAgICAgc2VuZHJ0cF9mdW5uZWwsIHNlbmRydGNwX2Z1bm5lbCwgdmlkZW9zcmMsIHZpZGVvX3J0cHBheWxvYWRlciwgTlVMTCk7CisKKyAgICByZXMgPSBnc3RfZWxlbWVudF9saW5rIChhdWRpb3NyYywgYXVkaW9fZW5jb2Rlcik7CisgICAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgICByZXMgPSBnc3RfZWxlbWVudF9saW5rIChhdWRpb19lbmNvZGVyLCBhdWRpb19ydHBwYXlsb2FkZXIpOworICAgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgICAgcmVzID0KKyAgICAgICAgZ3N0X2VsZW1lbnRfbGlua19wYWRzX2Z1bGwgKGF1ZGlvX3J0cHBheWxvYWRlciwgInNyYyIsIHJ0cGJpbiwKKyAgICAgICAgInNlbmRfcnRwX3NpbmtfMCIsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworCisgICAgcmVzID0gZ3N0X2VsZW1lbnRfbGluayAodmlkZW9zcmMsIHZpZGVvX3J0cHBheWxvYWRlcik7CisgICAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgICByZXMgPQorICAgICAgICBnc3RfZWxlbWVudF9saW5rX3BhZHNfZnVsbCAodmlkZW9fcnRwcGF5bG9hZGVyLCAic3JjIiwgcnRwYmluLAorICAgICAgICAic2VuZF9ydHBfc2lua18xIiwgR1NUX1BBRF9MSU5LX0NIRUNLX05PVEhJTkcpOworICAgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisKKyAgICByZXMgPQorICAgICAgICBnc3RfZWxlbWVudF9saW5rX3BhZHNfZnVsbCAoc2VuZHJ0cF9mdW5uZWwsICJzcmMiLCBzZW5kcnRwX3VkcHNpbmssCisgICAgICAgICJzaW5rIiwgR1NUX1BBRF9MSU5LX0NIRUNLX05PVEhJTkcpOworICAgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisKKyAgICBmdW5uZWxfcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChzZW5kcnRwX2Z1bm5lbCwgInNpbmtfJXUiKTsKKyAgICBydHBfc3JjX3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChydHBiaW4sICJzZW5kX3J0cF9zcmNfMCIpOworICAgIHJlcyA9IGdzdF9wYWRfbGluayAocnRwX3NyY19wYWQsIGZ1bm5lbF9wYWQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKGZ1bm5lbF9wYWQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cF9zcmNfcGFkKTsKKworICAgIGZ1bm5lbF9wYWQgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHNlbmRydHBfZnVubmVsLCAic2lua18ldSIpOworICAgIHJ0cF9zcmNfcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHJ0cGJpbiwgInNlbmRfcnRwX3NyY18xIik7CisgICAgcmVzID0gZ3N0X3BhZF9saW5rIChydHBfc3JjX3BhZCwgZnVubmVsX3BhZCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAoZnVubmVsX3BhZCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocnRwX3NyY19wYWQpOworCisgICAgcmVzID0KKyAgICAgICAgZ3N0X2VsZW1lbnRfbGlua19wYWRzX2Z1bGwgKHNlbmRydGNwX2Z1bm5lbCwgInNyYyIsIHNlbmRfcnRjcF91ZHBzaW5rLAorICAgICAgICAic2luayIsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworCisgICAgZnVubmVsX3BhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoc2VuZHJ0Y3BfZnVubmVsLCAic2lua18ldSIpOworICAgIHJ0cF9zcmNfcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBiaW4sICJzZW5kX3J0Y3Bfc3JjXzAiKTsKKyAgICByZXMgPQorICAgICAgICBnc3RfcGFkX2xpbmtfZnVsbCAocnRwX3NyY19wYWQsIGZ1bm5lbF9wYWQsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChmdW5uZWxfcGFkKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChydHBfc3JjX3BhZCk7CisKKyAgICBmdW5uZWxfcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChzZW5kcnRjcF9mdW5uZWwsICJzaW5rXyV1Iik7CisgICAgcnRwX3NyY19wYWQgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgInNlbmRfcnRjcF9zcmNfMSIpOworICAgIHJlcyA9CisgICAgICAgIGdzdF9wYWRfbGlua19mdWxsIChydHBfc3JjX3BhZCwgZnVubmVsX3BhZCwgR1NUX1BBRF9MSU5LX0NIRUNLX05PVEhJTkcpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKGZ1bm5lbF9wYWQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cF9zcmNfcGFkKTsKKworICB9IGVsc2UgeworICAgIHJlY3ZfcnRwX3VkcHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInVkcHNyYyIsIE5VTEwpOworICAgIGdfb2JqZWN0X3NldCAocmVjdl9ydHBfdWRwc3JjLCAicG9ydCIsIHJ0cF91ZHBfcG9ydCwgTlVMTCk7CisgICAgcnRwY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nICgiYXBwbGljYXRpb24veC1ydHAiKTsKKyAgICBnX29iamVjdF9zZXQgKHJlY3ZfcnRwX3VkcHNyYywgImNhcHMiLCBydHBjYXBzLCBOVUxMKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocnRwY2Fwcyk7CisKKyAgICByZWN2X3J0Y3BfdWRwc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidWRwc3JjIiwgTlVMTCk7CisgICAgZ19vYmplY3Rfc2V0IChyZWN2X3J0Y3BfdWRwc3JjLCAicG9ydCIsIHJ0Y3BfdWRwX3BvcnQsIE5VTEwpOworCisgICAgYXVkaW9fcnRwZGVwYXlsb2FkZXIgPQorICAgICAgICBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBwY21hZGVwYXkiLCAiYXVkaW9fcnRwZGVwYXlsb2FkZXIiKTsKKyAgICBhdWRpb19kZWNvZGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYWxhd2RlYyIsIE5VTEwpOworICAgIGF1ZGlvX3NpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsIE5VTEwpOworICAgIGdfb2JqZWN0X3NldCAoYXVkaW9fc2luaywgInN5bmMiLCBUUlVFLCBOVUxMKTsKKworICAgIHZpZGVvX3J0cGRlcGF5bG9hZGVyID0KKyAgICAgICAgZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwdnJhd2RlcGF5IiwgInZpZGVvX3J0cGRlcGF5bG9hZGVyIik7CisgICAgdmlkZW9fc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgTlVMTCk7CisgICAgZ19vYmplY3Rfc2V0ICh2aWRlb19zaW5rLCAic3luYyIsIFRSVUUsIE5VTEwpOworCisgICAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCByZWN2X3J0cF91ZHBzcmMsIHJlY3ZfcnRjcF91ZHBzcmMsCisgICAgICAgIGF1ZGlvX3J0cGRlcGF5bG9hZGVyLCBhdWRpb19kZWNvZGVyLCBhdWRpb19zaW5rLCB2aWRlb19ydHBkZXBheWxvYWRlciwKKyAgICAgICAgdmlkZW9fc2luaywgTlVMTCk7CisKKyAgICByZXMgPQorICAgICAgICBnc3RfZWxlbWVudF9saW5rX3BhZHNfZnVsbCAoYXVkaW9fcnRwZGVwYXlsb2FkZXIsICJzcmMiLCBhdWRpb19kZWNvZGVyLAorICAgICAgICAic2luayIsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworICAgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmsgKGF1ZGlvX2RlY29kZXIsIGF1ZGlvX3NpbmspOworICAgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisKKyAgICByZXMgPQorICAgICAgICBnc3RfZWxlbWVudF9saW5rX3BhZHNfZnVsbCAodmlkZW9fcnRwZGVwYXlsb2FkZXIsICJzcmMiLCB2aWRlb19zaW5rLAorICAgICAgICAic2luayIsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworCisgICAgLyogcmVxdWVzdCBhIHNpbmdsZSByZWNlaXZpbmcgUlRQIHNlc3Npb24uICovCisgICAgcmVzID0KKyAgICAgICAgZ3N0X2VsZW1lbnRfbGlua19wYWRzX2Z1bGwgKHJlY3ZfcnRjcF91ZHBzcmMsICJzcmMiLCBydHBiaW4sCisgICAgICAgICJyZWN2X3J0Y3Bfc2lua18wIiwgR1NUX1BBRF9MSU5LX0NIRUNLX05PVEhJTkcpOworICAgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgICAgcmVzID0KKyAgICAgICAgZ3N0X2VsZW1lbnRfbGlua19wYWRzX2Z1bGwgKHJlY3ZfcnRwX3VkcHNyYywgInNyYyIsIHJ0cGJpbiwKKyAgICAgICAgInJlY3ZfcnRwX3NpbmtfMCIsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworICB9CisKKyAgcmV0dXJuIHBpcGVsaW5lOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9zaW1wbGVfcnRwYmluX2J1bmRsZSkKK3sKKyAgR3N0RWxlbWVudCAqc2VuZF9waXBlbGluZSwgKnJlY3ZfcGlwZWxpbmU7CisgIEdzdEJ1cyAqc2VuZF9idXMsICpyZWN2X2J1czsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3RhdGVfcmVzID0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICBHc3RFbGVtZW50ICpydHBiaW5fcmVjZWl2ZTsKKyAgR09iamVjdCAqcnRwX3Nlc3Npb247CisKKyAgbWFpbl9sb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisKKyAgc2VuZF9waXBlbGluZSA9IGNyZWF0ZV9waXBlbGluZSAoVFJVRSk7CisgIHJlY3ZfcGlwZWxpbmUgPSBjcmVhdGVfcGlwZWxpbmUgKEZBTFNFKTsKKworICBzZW5kX2J1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKHNlbmRfcGlwZWxpbmUpOworICBnc3RfYnVzX2FkZF9zaWduYWxfd2F0Y2hfZnVsbCAoc2VuZF9idXMsIEdfUFJJT1JJVFlfSElHSCk7CisKKyAgZ19zaWduYWxfY29ubmVjdCAoc2VuZF9idXMsICJtZXNzYWdlOjplcnJvciIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsCisgICAgICBzZW5kX3BpcGVsaW5lKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoc2VuZF9idXMsICJtZXNzYWdlOjp3YXJuaW5nIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwKKyAgICAgIHNlbmRfcGlwZWxpbmUpOworICBnX3NpZ25hbF9jb25uZWN0IChzZW5kX2J1cywgIm1lc3NhZ2U6OmVvcyIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsCisgICAgICBzZW5kX3BpcGVsaW5lKTsKKworICByZWN2X2J1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKHJlY3ZfcGlwZWxpbmUpOworICBnc3RfYnVzX2FkZF9zaWduYWxfd2F0Y2hfZnVsbCAocmVjdl9idXMsIEdfUFJJT1JJVFlfSElHSCk7CisKKyAgZ19zaWduYWxfY29ubmVjdCAocmVjdl9idXMsICJtZXNzYWdlOjplcnJvciIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsCisgICAgICByZWN2X3BpcGVsaW5lKTsKKyAgZ19zaWduYWxfY29ubmVjdCAocmVjdl9idXMsICJtZXNzYWdlOjp3YXJuaW5nIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwKKyAgICAgIHJlY3ZfcGlwZWxpbmUpOworICBnX3NpZ25hbF9jb25uZWN0IChyZWN2X2J1cywgIm1lc3NhZ2U6OmVvcyIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsCisgICAgICByZWN2X3BpcGVsaW5lKTsKKworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHJlY3ZfcGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc2VuZF9waXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgR1NUX0lORk8gKCJlbnRlciBtYWlubG9vcCIpOworICBnX21haW5fbG9vcF9ydW4gKG1haW5fbG9vcCk7CisgIEdTVF9JTkZPICgiZXhpdCBtYWlubG9vcCIpOworCisgIHJ0cGJpbl9yZWNlaXZlID0KKyAgICAgIGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHJlY3ZfcGlwZWxpbmUpLCAicnRwYmluX3JlY2VpdmUiKTsKKyAgZmFpbF9pZiAocnRwYmluX3JlY2VpdmUgPT0gTlVMTCwgTlVMTCk7CisKKyAgLyogQ2hlY2sgdGhhdCAyIFJUUCBzZXNzaW9ucyB3aGVyZSBjcmVhdGVkIHdoaWxlIG9ubHkgb25lIHdhcyBleHBsaWNpdGVseSByZXF1ZXN0ZWQuICovCisgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAocnRwYmluX3JlY2VpdmUsICJnZXQtaW50ZXJuYWwtc2Vzc2lvbiIsIDAsCisgICAgICAmcnRwX3Nlc3Npb24pOworICBmYWlsX2lmIChydHBfc2Vzc2lvbiA9PSBOVUxMLCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKHJ0cF9zZXNzaW9uKTsKKyAgZ19zaWduYWxfZW1pdF9ieV9uYW1lIChydHBiaW5fcmVjZWl2ZSwgImdldC1pbnRlcm5hbC1zZXNzaW9uIiwgMSwKKyAgICAgICZydHBfc2Vzc2lvbik7CisgIGZhaWxfaWYgKHJ0cF9zZXNzaW9uID09IE5VTEwsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAocnRwX3Nlc3Npb24pOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cGJpbl9yZWNlaXZlKTsKKworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNlbmRfcGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocmVjdl9waXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgLyogY2xlYW51cCAqLworICBnX21haW5fbG9vcF91bnJlZiAobWFpbl9sb29wKTsKKworICBnc3RfYnVzX3JlbW92ZV9zaWduYWxfd2F0Y2ggKHNlbmRfYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2VuZF9idXMpOworICBnc3Rfb2JqZWN0X3VucmVmIChzZW5kX3BpcGVsaW5lKTsKKworICBnc3RfYnVzX3JlbW92ZV9zaWduYWxfd2F0Y2ggKHJlY3ZfYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocmVjdl9idXMpOworICBnc3Rfb2JqZWN0X3VucmVmIChyZWN2X3BpcGVsaW5lKTsKKworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitydHBidW5kbGVfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgicnRwYnVuZGxlIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICB0Y2FzZV9zZXRfdGltZW91dCAodGNfY2hhaW4sIDEwMDAwKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfc2ltcGxlX3J0cGJpbl9idW5kbGUpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAocnRwYnVuZGxlKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGNvbGxpc2lvbi5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwY29sbGlzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmNjY1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGNvbGxpc2lvbi5jCkBAIC0wLDAgKzEsNDYyIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQ29sbGFib3JhIEx0ZC4KKyAqICAgQGF1dGhvciBKdWxpZW4gSXNvcmNlIDxqdWxpZW4uaXNvcmNlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L25ldC9nc3RuZXRhZGRyZXNzbWV0YS5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydGNwYnVmZmVyLmg+CisKK3N0YXRpYyBHTWFpbkxvb3AgKm1haW5fbG9vcDsKK3N0YXRpYyBHc3RQYWQgKnNyY3BhZDsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRjcCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRjcCIpCisgICAgKTsKKworc3RhdGljIHZvaWQKK21lc3NhZ2VfcmVjZWl2ZWQgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsIEdzdFBpcGVsaW5lICogYmluKQoreworICBHU1RfSU5GTyAoImJ1cyBtZXNzYWdlIGZyb20gXCIlIiBHU1RfUFRSX0ZPUk1BVCAiXCI6ICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKSwgbWVzc2FnZSk7CisKKyAgc3dpdGNoIChtZXNzYWdlLT50eXBlKSB7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FT1M6CisgICAgICBnX21haW5fbG9vcF9xdWl0IChtYWluX2xvb3ApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9XQVJOSU5HOnsKKyAgICAgIEdFcnJvciAqZ2Vycm9yOworICAgICAgZ2NoYXIgKmRlYnVnOworCisgICAgICBnc3RfbWVzc2FnZV9wYXJzZV93YXJuaW5nIChtZXNzYWdlLCAmZ2Vycm9yLCAmZGVidWcpOworICAgICAgZ3N0X29iamVjdF9kZWZhdWx0X2Vycm9yIChHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpLCBnZXJyb3IsIGRlYnVnKTsKKyAgICAgIGdfZXJyb3JfZnJlZSAoZ2Vycm9yKTsKKyAgICAgIGdfZnJlZSAoZGVidWcpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX01FU1NBR0VfRVJST1I6eworICAgICAgR0Vycm9yICpnZXJyb3I7CisgICAgICBnY2hhciAqZGVidWc7CisKKyAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChtZXNzYWdlLCAmZ2Vycm9yLCAmZGVidWcpOworICAgICAgZ3N0X29iamVjdF9kZWZhdWx0X2Vycm9yIChHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpLCBnZXJyb3IsIGRlYnVnKTsKKyAgICAgIGdfZXJyb3JfZnJlZSAoZ2Vycm9yKTsKKyAgICAgIGdfZnJlZSAoZGVidWcpOworICAgICAgZ19tYWluX2xvb3BfcXVpdCAobWFpbl9sb29wKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitjcmVhdGVfcnRjcF9hcHAgKGd1aW50MzIgc3NyYywgZ3VpbnQgY291bnQpCit7CisgIEdJbmV0QWRkcmVzcyAqaW5ldF9hZGRyXzA7CisgIGd1aW50MTYgcG9ydCA9IDU2NzggKyBjb3VudDsKKyAgR1NvY2tldEFkZHJlc3MgKnNvY2tldF9hZGRyXzA7CisgIEdzdEJ1ZmZlciAqcnRjcF9idWZmZXI7CisgIEdzdFJUQ1BQYWNrZXQgKnJ0Y3BfcGFja2V0ID0gTlVMTDsKKyAgR3N0UlRDUEJ1ZmZlciBydGNwID0gR1NUX1JUQ1BfQlVGRkVSX0lOSVQ7CisKKyAgaW5ldF9hZGRyXzAgPSBnX2luZXRfYWRkcmVzc19uZXdfZnJvbV9zdHJpbmcgKCIxOTIuMTY4LjEuMSIpOworICBzb2NrZXRfYWRkcl8wID0gZ19pbmV0X3NvY2tldF9hZGRyZXNzX25ldyAoaW5ldF9hZGRyXzAsIHBvcnQpOworICBnX29iamVjdF91bnJlZiAoaW5ldF9hZGRyXzApOworCisgIHJ0Y3BfYnVmZmVyID0gZ3N0X3J0Y3BfYnVmZmVyX25ldyAoMTQwMCk7CisgIGdzdF9idWZmZXJfYWRkX25ldF9hZGRyZXNzX21ldGEgKHJ0Y3BfYnVmZmVyLCBzb2NrZXRfYWRkcl8wKTsKKyAgZ19vYmplY3RfdW5yZWYgKHNvY2tldF9hZGRyXzApOworCisgIC8qIG5lZWQgdG8gYmVnaW4gd2l0aCByciAqLworICBnc3RfcnRjcF9idWZmZXJfbWFwIChydGNwX2J1ZmZlciwgR1NUX01BUF9SRUFEV1JJVEUsICZydGNwKTsKKyAgcnRjcF9wYWNrZXQgPSBnX3NsaWNlX25ldzAgKEdzdFJUQ1BQYWNrZXQpOworICBnc3RfcnRjcF9idWZmZXJfYWRkX3BhY2tldCAoJnJ0Y3AsIEdTVF9SVENQX1RZUEVfUlIsIHJ0Y3BfcGFja2V0KTsKKyAgZ3N0X3J0Y3BfcGFja2V0X3JyX3NldF9zc3JjIChydGNwX3BhY2tldCwgc3NyYyk7CisgIGdfc2xpY2VfZnJlZSAoR3N0UlRDUFBhY2tldCwgcnRjcF9wYWNrZXQpOworCisgIC8qIHVzZWZ1bCB0byBtYWtlIHRoZSBydGNwIGJ1ZmZlciB2YWxpZCAqLworICBydGNwX3BhY2tldCA9IGdfc2xpY2VfbmV3MCAoR3N0UlRDUFBhY2tldCk7CisgIGdzdF9ydGNwX2J1ZmZlcl9hZGRfcGFja2V0ICgmcnRjcCwgR1NUX1JUQ1BfVFlQRV9BUFAsIHJ0Y3BfcGFja2V0KTsKKyAgZ19zbGljZV9mcmVlIChHc3RSVENQUGFja2V0LCBydGNwX3BhY2tldCk7CisgIGdzdF9ydGNwX2J1ZmZlcl91bm1hcCAoJnJ0Y3ApOworCisgIHJldHVybiBydGNwX2J1ZmZlcjsKK30KKworc3RhdGljIGd1aW50IG5iX3NzcmNfY2hhbmdlczsKK3N0YXRpYyBndWludCBzc3JjX3ByZXY7CisKK3N0YXRpYyBHc3RQYWRQcm9iZVJldHVybgorcnRwc2Vzc2lvbl9zaW5rcGFkX3Byb2JlIChHc3RQYWQgKiBwYWQsIEdzdFBhZFByb2JlSW5mbyAqIGluZm8sCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RQYWRQcm9iZVJldHVybiByZXQgPSBHU1RfUEFEX1BST0JFX09LOworCisgIGlmIChpbmZvLT50eXBlID09IChHU1RfUEFEX1BST0JFX1RZUEVfQlVGRkVSIHwgR1NUX1BBRF9QUk9CRV9UWVBFX1BVU0gpKSB7CisgICAgR3N0QnVmZmVyICpidWZmZXIgPSBHU1RfQlVGRkVSIChpbmZvLT5kYXRhKTsKKyAgICBHc3RSVFBCdWZmZXIgcnRwID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKyAgICBHc3RCdWZmZXIgKnJ0Y3BfYnVmZmVyID0gMDsKKyAgICBndWludCBzc3JjID0gMDsKKworICAgIC8qIHJldHJpZXZlIGN1cnJlbnQgc3NyYyAqLworICAgIGdzdF9ydHBfYnVmZmVyX21hcCAoYnVmZmVyLCBHU1RfTUFQX1JFQUQsICZydHApOworICAgIHNzcmMgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfc3NyYyAoJnJ0cCk7CisgICAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgICAgLyogaWYgbm90IGZpcnN0IGJ1ZmZlciwgY2hlY2sgdGhhdCBvdXIgc3NyYyBoYXMgY2hhbmdlZCAqLworICAgIGlmIChzc3JjX3ByZXYgIT0gLTEgJiYgc3NyYyAhPSBzc3JjX3ByZXYpCisgICAgICArK25iX3NzcmNfY2hhbmdlczsKKworICAgIC8qIHVwZGF0ZSBwcmV2IHNzcmMgKi8KKyAgICBzc3JjX3ByZXYgPSBzc3JjOworCisgICAgLyogZmVpbnQgYSBjb2xsaXNpb24gb24gcmVjdl9ydGNwX3NpbmsgcGFkIG9mIGdzdHJ0cHNlc3Npb24KKyAgICAgKiAobm90ZSB0aGF0IGFmdGVyIGJlaW5nIG1hcmtlZCBhcyBjb2xsaWVkIHRoZSBydHBzZXNzaW9uIGlnbm9yZXMKKyAgICAgKiBhbGwgbm9uIGJ5ZSBwYWNrZXRzKQorICAgICAqLworICAgIHJ0Y3BfYnVmZmVyID0gY3JlYXRlX3J0Y3BfYXBwIChzc3JjLCBuYl9zc3JjX2NoYW5nZXMpOworCisgICAgLyogcHVzaCBjb2xsaWVkIHBhY2tldCBvbiByZWN2X3J0Y3Bfc2luayAqLworICAgIGdzdF9wYWRfcHVzaCAoc3JjcGFkLCBydGNwX2J1ZmZlcik7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZmFrZV91ZHBfc2lua19jaGFpbl9mdW5jIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKKy8qIFRoaXMgdGVzdCBidWlsZCB0aGUgcGlwZWxpbmUgYXVkaW90ZXN0c3JjICEgYWxhd2VuYyAhIHJ0cHBjbWFwYXkgISBcCisgKiBydHBzZXNzaW9uICEgZmFrZXNpbmsKKyAqIEl0IG1hbnVhbGx5IHB1c2hzIGJ1ZmZlciBpbnRvIHJ0cHNlc3Npb24gd2l0aCBzYW1lIHNzcmMgYnV0IGRpZmZlcmVudAorICogaXAgc28gdGhhdCBjb2xsaXNpb24gY2FuIGJlIGRldGVjdGVkCisgKiBUaGUgdGVzdCBjaGVja3MgdGhhdCB0aGUgcGF5bG9hZGVyIGNoYW5nZSB0aGVpciBzc3JjCisgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X21hc3Rlcl9zc3JjX2NvbGxpc2lvbikKK3sKKyAgR3N0RWxlbWVudCAqYmluLCAqc3JjLCAqZW5jb2RlciwgKnJ0cHBheWxvYWRlciwgKnJ0cHNlc3Npb24sICpzaW5rOworICBHc3RCdXMgKmJ1cyA9IE5VTEw7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgIEdzdFBhZCAqc2lua3BhZCA9IE5VTEw7CisgIEdzdFBhZCAqcnRjcF9zaW5rcGFkID0gTlVMTDsKKyAgR3N0UGFkICpmYWtlX3VkcF9zaW5rcGFkID0gTlVMTDsKKyAgR3N0UGFkICpydGNwX3NyY3BhZCA9IE5VTEw7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHN0YXRlX3JlcyA9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRTsKKworICBHU1RfSU5GTyAoInByZXBhcmluZyB0ZXN0Iik7CisKKyAgbmJfc3NyY19jaGFuZ2VzID0gMDsKKyAgc3NyY19wcmV2ID0gLTE7CisKKyAgLyogYnVpbGQgcGlwZWxpbmUgKi8KKyAgYmluID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKGJpbik7CisgIGdzdF9idXNfYWRkX3NpZ25hbF93YXRjaF9mdWxsIChidXMsIEdfUFJJT1JJVFlfSElHSCk7CisKKyAgc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW90ZXN0c3JjIiwgInNyYyIpOworICBnX29iamVjdF9zZXQgKHNyYywgIm51bS1idWZmZXJzIiwgNSwgTlVMTCk7CisgIGVuY29kZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhbGF3ZW5jIiwgTlVMTCk7CisgIHJ0cHBheWxvYWRlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cHBjbWFwYXkiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChydHBwYXlsb2FkZXIsICJwdCIsIDgsIE5VTEwpOworICBydHBzZXNzaW9uID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwc2Vzc2lvbiIsIE5VTEwpOworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAic2luayIpOworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChiaW4pLCBzcmMsIGVuY29kZXIsIHJ0cHBheWxvYWRlciwKKyAgICAgIHJ0cHNlc3Npb24sIHNpbmssIE5VTEwpOworCisgIC8qIGxpbmsgZWxlbWVudHMgKi8KKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGluayAoc3JjLCBlbmNvZGVyKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGluayAoZW5jb2RlciwgcnRwcGF5bG9hZGVyKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGlua19wYWRzX2Z1bGwgKHJ0cHBheWxvYWRlciwgInNyYyIsCisgICAgICBydHBzZXNzaW9uLCAic2VuZF9ydHBfc2luayIsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGlua19wYWRzX2Z1bGwgKHJ0cHNlc3Npb24sICJzZW5kX3J0cF9zcmMiLAorICAgICAgc2luaywgInNpbmsiLCBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisKKyAgLyogYWRkIHByb2JlIG9uIHJ0cHNlc3Npb24gc2luayBwYWQgdG8gaW5kdWNlIGNvbGxpc2lvbiAqLworICBzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHJ0cHNlc3Npb24sICJzZW5kX3J0cF9zaW5rIik7CisgIGdzdF9wYWRfYWRkX3Byb2JlIChzaW5rcGFkLAorICAgICAgKEdTVF9QQURfUFJPQkVfVFlQRV9CVUZGRVIgfCBHU1RfUEFEX1BST0JFX1RZUEVfUFVTSCksCisgICAgICAoR3N0UGFkUHJvYmVDYWxsYmFjaykgcnRwc2Vzc2lvbl9zaW5rcGFkX3Byb2JlLCBOVUxMLCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZCk7CisKKyAgLyogc2V0dXAgcnRjcCBsaW5rICovCisgIHNyY3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc3JjdGVtcGxhdGUsICJzcmMiKTsKKyAgcnRjcF9zaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBzZXNzaW9uLCAicmVjdl9ydGNwX3NpbmsiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAoc3JjcGFkLCBydGNwX3NpbmtwYWQpID09IEdTVF9QQURfTElOS19PSywgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHJ0Y3Bfc2lua3BhZCk7CisgIHJlcyA9IGdzdF9wYWRfc2V0X2FjdGl2ZSAoc3JjcGFkLCBUUlVFKTsKKyAgZmFpbF9pZiAocmVzID09IEZBTFNFKTsKKyAgcmVzID0KKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3JjcGFkLAorICAgICAgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKCJteV9ydGNwX3N0cmVhbV9pZCIpKTsKKyAgZmFpbF9pZiAocmVzID09IEZBTFNFKTsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAoc3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSk7CisgIGZhaWxfaWYgKHJlcyA9PSBGQUxTRSk7CisKKyAgZmFrZV91ZHBfc2lua3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc2lua3RlbXBsYXRlLCAic2luayIpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoZmFrZV91ZHBfc2lua3BhZCwgZmFrZV91ZHBfc2lua19jaGFpbl9mdW5jKTsKKyAgcnRjcF9zcmNwYWQgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHJ0cHNlc3Npb24sICJzZW5kX3J0Y3Bfc3JjIik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKHJ0Y3Bfc3JjcGFkLCBmYWtlX3VkcF9zaW5rcGFkKSA9PSBHU1RfUEFEX0xJTktfT0ssCisgICAgICBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocnRjcF9zcmNwYWQpOworICByZXMgPSBnc3RfcGFkX3NldF9hY3RpdmUgKGZha2VfdWRwX3NpbmtwYWQsIFRSVUUpOworICBmYWlsX2lmIChyZXMgPT0gRkFMU0UpOworCisgIC8qIGNvbm5lY3QgbWVzc2FnZXMgKi8KKyAgbWFpbl9sb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OmVycm9yIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwgYmluKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6d2FybmluZyIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsIGJpbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OmVvcyIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsIGJpbik7CisKKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIEdTVF9JTkZPICgicnVubmluZyBtYWluIGxvb3AiKTsKKyAgZ19tYWluX2xvb3BfcnVuIChtYWluX2xvb3ApOworCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfTlVMTCk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICAvKiBjbGVhbnVwICovCisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGZha2VfdWRwX3NpbmtwYWQpOworICBnX21haW5fbG9vcF91bnJlZiAobWFpbl9sb29wKTsKKyAgZ3N0X2J1c19yZW1vdmVfc2lnbmFsX3dhdGNoIChidXMpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworICBnc3Rfb2JqZWN0X3VucmVmIChiaW4pOworCisgIC8qIGNoZWNrIHJlc3VsdHMgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobmJfc3NyY19jaGFuZ2VzLCA0KTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgZ3VpbnQgc3NyY19iZWZvcmU7CitzdGF0aWMgZ3VpbnQgc3NyY19hZnRlcjsKK3N0YXRpYyBndWludCBydHhfc3NyY19iZWZvcmU7CitzdGF0aWMgZ3VpbnQgcnR4X3NzcmNfYWZ0ZXI7CisKK3N0YXRpYyBHc3RQYWRQcm9iZVJldHVybgorcnRwc2Vzc2lvbl9zaW5rcGFkX3Byb2JlMiAoR3N0UGFkICogcGFkLCBHc3RQYWRQcm9iZUluZm8gKiBpbmZvLAorICAgIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0UGFkUHJvYmVSZXR1cm4gcmV0ID0gR1NUX1BBRF9QUk9CRV9PSzsKKworICBpZiAoaW5mby0+dHlwZSA9PSAoR1NUX1BBRF9QUk9CRV9UWVBFX0JVRkZFUiB8IEdTVF9QQURfUFJPQkVfVFlQRV9QVVNIKSkgeworICAgIEdzdEJ1ZmZlciAqYnVmZmVyID0gR1NUX0JVRkZFUiAoaW5mby0+ZGF0YSk7CisgICAgR3N0UlRQQnVmZmVyIHJ0cCA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisgICAgZ3VpbnQgcGF5bG9hZF90eXBlID0gMDsKKworICAgIHN0YXRpYyBnaW50IGkgPSAwOworCisgICAgLyogcmV0cmlldmUgY3VycmVudCBzc3JjIGZvciByZXRyYW5zbWlzc2lvbiBzdHJlYW0gb25seSAqLworICAgIGdzdF9ydHBfYnVmZmVyX21hcCAoYnVmZmVyLCBHU1RfTUFQX1JFQUQsICZydHApOworICAgIHBheWxvYWRfdHlwZSA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3R5cGUgKCZydHApOworICAgIGlmIChwYXlsb2FkX3R5cGUgPT0gOTkpIHsKKyAgICAgIGlmIChpIDwgMykKKyAgICAgICAgcnR4X3NzcmNfYmVmb3JlID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3NzcmMgKCZydHApOworICAgICAgZWxzZQorICAgICAgICBydHhfc3NyY19hZnRlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9zc3JjICgmcnRwKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogYXNrIHRvIHJldHJhbnNtaXQgZXZlcnkgcGFja2V0ICovCisgICAgICBHc3RFdmVudCAqZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoIkdzdFJUUFJldHJhbnNtaXNzaW9uUmVxdWVzdCIsCisgICAgICAgICAgICAgICJzZXFudW0iLCBHX1RZUEVfVUlOVCwgZ3N0X3J0cF9idWZmZXJfZ2V0X3NlcSAoJnJ0cCksCisgICAgICAgICAgICAgICJzc3JjIiwgR19UWVBFX1VJTlQsIGdzdF9ydHBfYnVmZmVyX2dldF9zc3JjICgmcnRwKSwKKyAgICAgICAgICAgICAgTlVMTCkpOworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChwYWQsIGV2ZW50KTsKKworICAgICAgaWYgKGkgPCAzKQorICAgICAgICBzc3JjX2JlZm9yZSA9IGdzdF9ydHBfYnVmZmVyX2dldF9zc3JjICgmcnRwKTsKKyAgICAgIGVsc2UKKyAgICAgICAgc3NyY19hZnRlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9zc3JjICgmcnRwKTsKKyAgICB9CisgICAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgICAgLyogZmVpbnQgYSBjb2xsaXNpb24gb24gcmVjdl9ydGNwX3NpbmsgcGFkIG9mIGdzdHJ0cHNlc3Npb24KKyAgICAgKiAobm90ZSB0aGF0IGFmdGVyIGJlaW5nIG1hcmtlZCBhcyBjb2xsaWVkIHRoZSBydHBzZXNzaW9uIGlnbm9yZXMKKyAgICAgKiBhbGwgbm9uIGJ5ZSBwYWNrZXRzKQorICAgICAqLworICAgIGlmIChpID09IDIpIHsKKyAgICAgIEdzdEJ1ZmZlciAqcnRjcF9idWZmZXIgPSBjcmVhdGVfcnRjcF9hcHAgKHJ0eF9zc3JjX2JlZm9yZSwgMCk7CisKKyAgICAgIC8qIHB1c2ggY29sbGllZCBwYWNrZXQgb24gcmVjdl9ydGNwX3NpbmsgKi8KKyAgICAgIGdzdF9wYWRfcHVzaCAoc3JjcGFkLCBydGNwX2J1ZmZlcik7CisgICAgfQorCisgICAgKytpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogVGhpcyB0ZXN0IGJ1aWxkIHRoZSBwaXBlbGluZSBhdWRpb3Rlc3RzcmMgISBhbGF3ZW5jICEgcnRwcGNtYXBheSAhIFwKKyAqIHJ0cHJ0eHNlbmQgISBydHBzZXNzaW9uICEgZmFrZXNpbmsKKyAqIEl0IG1hbnVhbGx5IHB1c2hzIGJ1ZmZlciBpbnRvIHJ0cHNlc3Npb24gd2l0aCBzYW1lIHNzcmMgdGhhbiBydHggc3RyZWFtCisgKiBidXQgZGlmZmVyZW50IGlwIHNvIHRoYXQgY29sbGlzaW9uIGNhbiBiZSBkZXRlY3RlZAorICogVGhlIHRlc3QgY2hlY2tzIHRoYXQgdGhlIHJ0eCBlbGVtZW50cyBjaGFuZ2VzIGl0cyBzc3JjIHdoZXJlYXMKKyAqIHRoZSBwYXlsb2FkZXIga2VlcHMgaXRzIG1hc3RlciBzc3JjCisgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3J0eF9zc3JjX2NvbGxpc2lvbikKK3sKKyAgR3N0RWxlbWVudCAqYmluLCAqc3JjLCAqZW5jb2RlciwgKnJ0cHBheWxvYWRlciwgKnJ0cHJ0eHNlbmQsICpydHBzZXNzaW9uLAorICAgICAgKnNpbms7CisgIEdzdEJ1cyAqYnVzID0gTlVMTDsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKyAgR3N0UGFkICpzaW5rcGFkID0gTlVMTDsKKyAgR3N0UGFkICpydGNwX3NpbmtwYWQgPSBOVUxMOworICBHc3RQYWQgKmZha2VfdWRwX3NpbmtwYWQgPSBOVUxMOworICBHc3RQYWQgKnJ0Y3Bfc3JjcGFkID0gTlVMTDsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3RhdGVfcmVzID0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICBHc3RTdHJ1Y3R1cmUgKnB0X21hcDsKKworICBHU1RfSU5GTyAoInByZXBhcmluZyB0ZXN0Iik7CisKKyAgLyogYnVpbGQgcGlwZWxpbmUgKi8KKyAgYmluID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKGJpbik7CisgIGdzdF9idXNfYWRkX3NpZ25hbF93YXRjaF9mdWxsIChidXMsIEdfUFJJT1JJVFlfSElHSCk7CisKKyAgc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW90ZXN0c3JjIiwgInNyYyIpOworICBnX29iamVjdF9zZXQgKHNyYywgIm51bS1idWZmZXJzIiwgNSwgTlVMTCk7CisgIGVuY29kZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhbGF3ZW5jIiwgTlVMTCk7CisgIHJ0cHBheWxvYWRlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cHBjbWFwYXkiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChydHBwYXlsb2FkZXIsICJwdCIsIDgsIE5VTEwpOworICBydHBydHhzZW5kID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwcnR4c2VuZCIsIE5VTEwpOworICBwdF9tYXAgPSBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLXB0LW1hcCIsCisgICAgICAiOCIsIEdfVFlQRV9VSU5ULCA5OSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAocnRwcnR4c2VuZCwgInBheWxvYWQtdHlwZS1tYXAiLCBwdF9tYXAsIE5VTEwpOworICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHB0X21hcCk7CisgIHJ0cHNlc3Npb24gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBzZXNzaW9uIiwgTlVMTCk7CisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsICJzaW5rIik7CisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKGJpbiksIHNyYywgZW5jb2RlciwgcnRwcGF5bG9hZGVyLCBydHBydHhzZW5kLAorICAgICAgcnRwc2Vzc2lvbiwgc2luaywgTlVMTCk7CisKKyAgLyogbGluayBlbGVtZW50cyAqLworICByZXMgPSBnc3RfZWxlbWVudF9saW5rIChzcmMsIGVuY29kZXIpOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworICByZXMgPSBnc3RfZWxlbWVudF9saW5rIChlbmNvZGVyLCBydHBwYXlsb2FkZXIpOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworICByZXMgPSBnc3RfZWxlbWVudF9saW5rIChydHBwYXlsb2FkZXIsIHJ0cHJ0eHNlbmQpOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworICByZXMgPSBnc3RfZWxlbWVudF9saW5rX3BhZHNfZnVsbCAocnRwcnR4c2VuZCwgInNyYyIsCisgICAgICBydHBzZXNzaW9uLCAic2VuZF9ydHBfc2luayIsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGlua19wYWRzX2Z1bGwgKHJ0cHNlc3Npb24sICJzZW5kX3J0cF9zcmMiLAorICAgICAgc2luaywgInNpbmsiLCBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisKKyAgLyogYWRkIHByb2JlIG9uIHJ0cHNlc3Npb24gc2luayBwYWQgdG8gaW5kdWNlIGNvbGxpc2lvbiAqLworICBzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHJ0cHNlc3Npb24sICJzZW5kX3J0cF9zaW5rIik7CisgIGdzdF9wYWRfYWRkX3Byb2JlIChzaW5rcGFkLAorICAgICAgKEdTVF9QQURfUFJPQkVfVFlQRV9CVUZGRVIgfCBHU1RfUEFEX1BST0JFX1RZUEVfUFVTSCksCisgICAgICAoR3N0UGFkUHJvYmVDYWxsYmFjaykgcnRwc2Vzc2lvbl9zaW5rcGFkX3Byb2JlMiwgTlVMTCwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworCisgIC8qIHNldHVwIHJ0Y3AgbGluayAqLworICBzcmNwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNyY3RlbXBsYXRlLCAic3JjIik7CisgIHJ0Y3Bfc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwc2Vzc2lvbiwgInJlY3ZfcnRjcF9zaW5rIik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKHNyY3BhZCwgcnRjcF9zaW5rcGFkKSA9PSBHU1RfUEFEX0xJTktfT0ssIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChydGNwX3NpbmtwYWQpOworICByZXMgPSBnc3RfcGFkX3NldF9hY3RpdmUgKHNyY3BhZCwgVFJVRSk7CisgIGZhaWxfaWYgKHJlcyA9PSBGQUxTRSk7CisgIHJlcyA9CisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNyY3BhZCwKKyAgICAgIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgibXlfcnRjcF9zdHJlYW1faWQiKSk7CisgIGZhaWxfaWYgKHJlcyA9PSBGQUxTRSk7CisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworICBmYWlsX2lmIChyZXMgPT0gRkFMU0UpOworCisgIGZha2VfdWRwX3NpbmtwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNpbmt0ZW1wbGF0ZSwgInNpbmsiKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKGZha2VfdWRwX3NpbmtwYWQsIGZha2VfdWRwX3NpbmtfY2hhaW5fZnVuYyk7CisgIHJ0Y3Bfc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBzZXNzaW9uLCAic2VuZF9ydGNwX3NyYyIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rIChydGNwX3NyY3BhZCwgZmFrZV91ZHBfc2lua3BhZCkgPT0gR1NUX1BBRF9MSU5LX09LLAorICAgICAgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHJ0Y3Bfc3JjcGFkKTsKKyAgcmVzID0gZ3N0X3BhZF9zZXRfYWN0aXZlIChmYWtlX3VkcF9zaW5rcGFkLCBUUlVFKTsKKyAgZmFpbF9pZiAocmVzID09IEZBTFNFKTsKKworICAvKiBjb25uZWN0IG1lc3NhZ2VzICovCisgIG1haW5fbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgRkFMU0UpOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjplcnJvciIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsIGJpbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6Ondhcm5pbmciLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjplb3MiLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBHU1RfSU5GTyAoInJ1bm5pbmcgbWFpbiBsb29wIik7CisgIGdfbWFpbl9sb29wX3J1biAobWFpbl9sb29wKTsKKworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX05VTEwpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgLyogY2xlYW51cCAqLworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChmYWtlX3VkcF9zaW5rcGFkKTsKKyAgZ19tYWluX2xvb3BfdW5yZWYgKG1haW5fbG9vcCk7CisgIGdzdF9idXNfcmVtb3ZlX3NpZ25hbF93YXRjaCAoYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYmluKTsKKworICAvKiBjaGVjayByZXN1bHRzICovCisgIGZhaWxfaWYgKHJ0eF9zc3JjX2JlZm9yZSA9PSBydHhfc3NyY19hZnRlcik7CisgIGZhaWxfaWYgKHNzcmNfYmVmb3JlICE9IHNzcmNfYWZ0ZXIpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitydHBjb2xsaXNpb25fc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgicnRwY29sbGlzaW9uIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICB0Y2FzZV9zZXRfdGltZW91dCAodGNfY2hhaW4sIDEwKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbWFzdGVyX3NzcmNfY29sbGlzaW9uKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3J0eF9zc3JjX2NvbGxpc2lvbik7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChydHBjb2xsaXNpb24pOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaDI2MS5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaDI2MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMzRkMzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBoMjYxLmMKQEAgLTAsMCArMSwxNDIgQEAKKyNpbmNsdWRlIDxnc3QvY2hlY2svY2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0aGFybmVzcy5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKKyNkZWZpbmUgSDI2MV9SVFBfQ0FQU19TVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImFwcGxpY2F0aW9uL3gtcnRwLG1lZGlhPXZpZGVvLGVuY29kaW5nLW5hbWU9SDI2MSxjbG9jay1yYXRlPTkwMDAwLHBheWxvYWQ9MzEiCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBIMjYxUGF5SGVhZGVyCit7CisjaWYgR19CWVRFX09SREVSID09IEdfTElUVExFX0VORElBTgorICB1bnNpZ25lZCBpbnQgdjoxOyAgICAgICAgICAgICAvKiBNb3Rpb24gdmVjdG9yIGZsYWcgKi8KKyAgdW5zaWduZWQgaW50IGk6MTsgICAgICAgICAgICAgLyogSW50cmEgZW5jb2RlZCBkYXRhICovCisgIHVuc2lnbmVkIGludCBlYml0OjM7ICAgICAgICAgIC8qIEVuZCBwb3NpdGlvbiAqLworICB1bnNpZ25lZCBpbnQgc2JpdDozOyAgICAgICAgICAvKiBTdGFydCBwb3NpdGlvbiAqLworCisgIHVuc2lnbmVkIGludCBtYmFwMTo0OyAgICAgICAgIC8qIE1CIGFkZHJlc3MgcHJlZGljdG9yIC0gcGFydDEgKi8KKyAgdW5zaWduZWQgaW50IGdvYm46NDsgICAgICAgICAgLyogR09CIG51bWJlciAqLworCisgIHVuc2lnbmVkIGludCBobXZkMToyOyAgICAgICAgIC8qIEhvcml6b250YWwgbW90aW9uIHZlY3RvciBkYXRhIC0gcGFydDEgKi8KKyAgdW5zaWduZWQgaW50IHF1YW50OjU7ICAgICAgICAgLyogUXVhbnRpemVyICovCisgIHVuc2lnbmVkIGludCBtYmFwMjoxOyAgICAgICAgIC8qIE1CIGFkZHJlc3MgcHJlZGljdG9yIC0gcGFydDIgKi8KKworICB1bnNpZ25lZCBpbnQgdm12ZDo1OyAgICAgICAgICAvKiBIb3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgZGF0YSAtIHBhcnQxICovCisgIHVuc2lnbmVkIGludCBobXZkMjozOyAgICAgICAgIC8qIFZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgZGF0YSAqLworI2VsaWYgR19CWVRFX09SREVSID09IEdfQklHX0VORElBTgorICB1bnNpZ25lZCBpbnQgc2JpdDozOyAgICAgICAgICAvKiBTdGFydCBwb3NpdGlvbiAqLworICB1bnNpZ25lZCBpbnQgZWJpdDozOyAgICAgICAgICAvKiBFbmQgcG9zaXRpb24gKi8KKyAgdW5zaWduZWQgaW50IGk6MTsgICAgICAgICAgICAgLyogSW50cmEgZW5jb2RlZCBkYXRhICovCisgIHVuc2lnbmVkIGludCB2OjE7ICAgICAgICAgICAgIC8qIE1vdGlvbiB2ZWN0b3IgZmxhZyAqLworCisgIHVuc2lnbmVkIGludCBnb2JuOjQ7ICAgICAgICAgIC8qIEdPQiBudW1iZXIgKi8KKyAgdW5zaWduZWQgaW50IG1iYXAxOjQ7ICAgICAgICAgLyogTUIgYWRkcmVzcyBwcmVkaWN0b3IgLSBwYXJ0MSAqLworCisgIHVuc2lnbmVkIGludCBtYmFwMjoxOyAgICAgICAgIC8qIE1CIGFkZHJlc3MgcHJlZGljdG9yIC0gcGFydDIgKi8KKyAgdW5zaWduZWQgaW50IHF1YW50OjU7ICAgICAgICAgLyogUXVhbnRpemVyICovCisgIHVuc2lnbmVkIGludCBobXZkMToyOyAgICAgICAgIC8qIEhvcml6b250YWwgbW90aW9uIHZlY3RvciBkYXRhIC0gcGFydDEgKi8KKworICB1bnNpZ25lZCBpbnQgaG12ZDI6MzsgICAgICAgICAvKiBWZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGRhdGEgKi8KKyAgdW5zaWduZWQgaW50IHZtdmQ6NTsgICAgICAgICAgLyogSG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGRhdGEgLSBwYXJ0MSAqLworI2Vsc2UKKyNlcnJvciAiR19CWVRFX09SREVSIHNob3VsZCBiZSBiaWcgb3IgbGl0dGxlIGVuZGlhbi4iCisjZW5kaWYKK30gR3N0UnRwSDI2MVBheUhlYWRlcjsKKworI2RlZmluZSBHU1RfUlRQX0gyNjFfUEFZTE9BRF9IRUFERVJfTEVOIDQKKworc3RhdGljIGd1aW50OCAqCitjcmVhdGVfaDI2MV9wYXlsb2FkIChnaW50IHNiaXQsIGdpbnQgZWJpdCwgZ2ludCBwc2MsIGdzaXplIHNpemUpCit7CisgIEdzdFJ0cEgyNjFQYXlIZWFkZXIgaGVhZGVyOworICBjb25zdCBnaW50IGhlYWRlcl9sZW4gPSA0OworICBndWludDggKmRhdGEgPSBnX21hbGxvYzAgKHNpemUpOworCisgIG1lbXNldCAoJmhlYWRlciwgMHgwMCwgc2l6ZW9mIChoZWFkZXIpKTsKKworICBoZWFkZXIuc2JpdCA9IHNiaXQ7CisgIGhlYWRlci5lYml0ID0gZWJpdDsKKworICBtZW1zZXQgKGRhdGEsIDB4ZmYsIHNpemUpOworICBtZW1jcHkgKGRhdGEsICZoZWFkZXIsIGhlYWRlcl9sZW4pOworCisgIGlmIChwc2MpIHsKKyAgICBndWludDMyIHdvcmQgPSAweDAwMDEwMGZmID4+IHNiaXQ7CisgICAgZGF0YVtoZWFkZXJfbGVuICsgMF0gPSAod29yZCA+PiAyNCkgJiAweGZmOworICAgIGRhdGFbaGVhZGVyX2xlbiArIDFdID0gKHdvcmQgPj4gMTYpICYgMHhmZjsKKyAgICBkYXRhW2hlYWRlcl9sZW4gKyAyXSA9ICh3b3JkID4+IDgpICYgMHhmZjsKKyAgICBkYXRhW2hlYWRlcl9sZW4gKyAzXSA9ICh3b3JkID4+IDApICYgMHhmZjsKKyAgfQorCisgIHJldHVybiBkYXRhOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2NyZWF0ZV9ydHBfY29weV9wYXlsb2FkIChjb25zdCBndWludDggKiBkYXRhLCBnc2l6ZSBzaXplLCBndWludCB0cywgZ3VpbnQxNiBzZXEsCisgICAgZ2Jvb2xlYW4gbWFya2VyLCBndWludCBjc3JjcykKK3sKKyAgR3N0QnVmZmVyICpidWYgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKHNpemUsIDAsIGNzcmNzKTsKKyAgR3N0UlRQQnVmZmVyIHJ0cCA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisKKyAgZ3N0X3J0cF9idWZmZXJfbWFwIChidWYsIEdTVF9NQVBfV1JJVEUsICZydHApOworCisgIGdzdF9ydHBfYnVmZmVyX3NldF9zZXEgKCZydHAsIHNlcSk7CisgIGdzdF9ydHBfYnVmZmVyX3NldF9tYXJrZXIgKCZydHAsIG1hcmtlcik7CisgIG1lbWNweSAoZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHApLCBkYXRhLCBzaXplKTsKKworICBHU1RfQlVGRkVSX1BUUyAoYnVmKSA9ICh0cykgKiAoR1NUX1NFQ09ORCAvIDMwKTsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKSA9IChHU1RfU0VDT05EIC8gMzApOworCisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICByZXR1cm4gYnVmOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9oMjYzZGVwYXlfZW1wdHlfcGF5bG9hZCkKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGgyNjFkZXBheSIpOworICBnaW50IHNiaXQgPSA0OworICBnaW50IGViaXQgPSA0OworICBnc2l6ZSBzaXplOworICBndWludDggKnBheWxvYWQ7CisgIGd1aW50IHNlcSA9IDA7CisKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzX3N0ciAoaCwgSDI2MV9SVFBfQ0FQU19TVFIpOworCisgIC8qIEZpcnN0IHNlbmQgYSBwcm9wZXIgcGFja2V0IHdpdGggcGljdHVyZSBzdGFydCBjb2RlICovCisgIHNpemUgPSAxMDA7CisgIHBheWxvYWQgPSBjcmVhdGVfaDI2MV9wYXlsb2FkIChzYml0LCBlYml0LCBUUlVFLCBzaXplKTsKKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgY3JlYXRlX3J0cF9jb3B5X3BheWxvYWQgKHBheWxvYWQsIHNpemUsIDAsIHNlcSsrLCBGQUxTRSwKKyAgICAgICAgICAwKSk7CisgIGdfZnJlZSAocGF5bG9hZCk7CisKKyAgLyogTm90IGEgY29tcGxldGUgZnJhbWUgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2hhcm5lc3NfYnVmZmVyc19yZWNlaXZlZCAoaCksIDApOworCisgIC8qIFNlY29uZCBidWZmZXIgaGFzIGludmFsaWQgZW1wdHkgcGF5bG9hZCAqLworICBzaXplID0gR1NUX1JUUF9IMjYxX1BBWUxPQURfSEVBREVSX0xFTjsKKyAgcGF5bG9hZCA9IGNyZWF0ZV9oMjYxX3BheWxvYWQgKHNiaXQsIGViaXQsIEZBTFNFLCBzaXplKTsKKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgY3JlYXRlX3J0cF9jb3B5X3BheWxvYWQgKHBheWxvYWQsIHNpemUsIDAsIHNlcSsrLCBUUlVFLAorICAgICAgICAgIDApKTsKKyAgZ19mcmVlIChwYXlsb2FkKTsKKworICAvKiBJbnZhbGlkIHBheWxvYWQgc2hvdWxkIGJlIGRyb3BwZWQgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2hhcm5lc3NfYnVmZmVyc19yZWNlaXZlZCAoaCksIDApOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorcnRwaDI2MV9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJydHBoMjYxIik7CisgIFRDYXNlICp0Y19jaGFpbjsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsICh0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImgyNjFkZXBheSIpKSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9oMjYzZGVwYXlfZW1wdHlfcGF5bG9hZCk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChydHBoMjYxKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGgyNjMuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGgyNjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGMwMTk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaDI2My5jCkBAIC0wLDAgKzEsMzM4IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgUGV4aXAgQVMKKyAqICAgQGF1dGhvciBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2NoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGhhcm5lc3MuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCisjZGVmaW5lIFJUUF9IMjYzX0NBUFNfU1RSKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhcHBsaWNhdGlvbi94LXJ0cCxtZWRpYT12aWRlbyxlbmNvZGluZy1uYW1lPUgyNjMsY2xvY2stcmF0ZT05MDAwMCwiICBcCisgICJwYXlsb2FkPSIgR19TVFJJTkdJRlkocCkKKworI2RlZmluZSBIMjYzUF9SVFBfQ0FQU19TVFIocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYXBwbGljYXRpb24veC1ydHAsbWVkaWE9dmlkZW8sZW5jb2RpbmctbmFtZT1IMjYzLTE5OTgsY2xvY2stcmF0ZT05MDAwMCwiIFwKKyAgInBheWxvYWQ9IkdfU1RSSU5HSUZZKHApCisKK3N0YXRpYyBnYm9vbGVhbgoraGF2ZV9lbGVtZW50IChjb25zdCBnY2hhciAqIGVsZW1lbnRfbmFtZSkKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudDsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIGVsZW1lbnQgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKGVsZW1lbnRfbmFtZSwgTlVMTCk7CisgIHJldCA9IGVsZW1lbnQgIT0gTlVMTDsKKworICBpZiAoZWxlbWVudCkKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChlbGVtZW50KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2NyZWF0ZV9ydHBfYnVmZmVyIChndWludDggKiBkYXRhLCBnc2l6ZSBzaXplLCBndWludCB0cywgZ2ludCBzZXFudW0pCit7CisgIEdzdEJ1ZmZlciAqYnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2NvcHlfZGF0YSAoZGF0YSwgc2l6ZSk7CisgIEdzdFJUUEJ1ZmZlciBydHAgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworCisgIEdTVF9CVUZGRVJfUFRTIChidWYpID0gKHRzKSAqIChHU1RfU0VDT05EIC8gMzApOworCisgIGdzdF9ydHBfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3NlcSAoJnJ0cCwgc2VxbnVtKTsKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgIHJldHVybiBidWY7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2gyNjNkZXBheV9zdGFydF9wYWNrZXRfdG9vX3NtYWxsX21vZGVfYSkKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGgyNjNkZXBheSIpOworICBndWludDggcGFja2V0W10gPSB7CisgICAgMHg4MCwgMHhhMiwgMHgxNywgMHg2MiwgMHg1NywgMHhiYiwgMHg0OCwgMHg5OCwgMHg0YSwgMHg1OSwgMHhlOCwgMHhkYywKKyAgICAweDAwLCAweDAwLCAweDgwLCAweDAwCisgIH07CisKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzX3N0ciAoaCwgUlRQX0gyNjNfQ0FQU19TVFIgKDM0KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLAorICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgY3JlYXRlX3J0cF9idWZmZXIgKHBhY2tldCwgc2l6ZW9mIChwYWNrZXQpLCAwLCAwKSkpOworCisgIC8qIFBhY2tldCBzaG91bGQgYmUgZHJvcHBlZCBhbmQgZGVwYXlsb2FkZXIgbm90IGNyYXNoICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDAsIGdzdF9oYXJuZXNzX2J1ZmZlcnNfcmVjZWl2ZWQgKGgpKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaDI2M2RlcGF5X3N0YXJ0X3BhY2tldF90b29fc21hbGxfbW9kZV9iKQoreworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwaDI2M2RlcGF5Iik7CisgIGd1aW50OCBwYWNrZXRbXSA9IHsKKyAgICAweDgwLCAweGEyLCAweDE3LCAweDYyLCAweDU3LCAweGJiLCAweDQ4LCAweDk4LCAweDRhLCAweDU5LCAweGU4LCAweGRjLAorICAgIDB4ODAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKyAgfTsKKworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHNfc3RyIChoLCBSVFBfSDI2M19DQVBTX1NUUiAoMzQpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICBnc3RfaGFybmVzc19wdXNoIChoLCBjcmVhdGVfcnRwX2J1ZmZlciAocGFja2V0LCBzaXplb2YgKHBhY2tldCksIDAsIDApKSk7CisKKyAgLyogUGFja2V0IHNob3VsZCBiZSBkcm9wcGVkIGFuZCBkZXBheWxvYWRlciBub3QgY3Jhc2ggKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMCwgZ3N0X2hhcm5lc3NfYnVmZmVyc19yZWNlaXZlZCAoaCkpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9oMjYzZGVwYXlfc3RhcnRfcGFja2V0X3Rvb19zbWFsbF9tb2RlX2MpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBoMjYzZGVwYXkiKTsKKyAgZ3VpbnQ4IHBhY2tldFtdID0geworICAgIDB4ODAsIDB4YTIsIDB4MTcsIDB4NjIsIDB4NTcsIDB4YmIsIDB4NDgsIDB4OTgsIDB4NGEsIDB4NTksIDB4ZTgsIDB4ZGMsCisgICAgMHhjMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorICB9OworCisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgsIFJUUF9IMjYzX0NBUFNfU1RSICgzNCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywKKyAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGNyZWF0ZV9ydHBfYnVmZmVyIChwYWNrZXQsIHNpemVvZiAocGFja2V0KSwgMCwgMCkpKTsKKworICAvKiBQYWNrZXQgc2hvdWxkIGJlIGRyb3BwZWQgYW5kIGRlcGF5bG9hZGVyIG5vdCBjcmFzaCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgwLCBnc3RfaGFybmVzc19idWZmZXJzX3JlY2VpdmVkIChoKSk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2gyNjNwYXlfbW9kZV9iX3Nub3cpCit7CisgIC8qIFBheWxvYWRpbmcgb25lIGxhcmdlIGZyYW1lIChsaWtlIHNub3cpIGlzIG1vcmUgbGlrZWx5IHRvIHVzZSBtb2RlIGIgYW5kCisgICAqIHRyaWdnZXIgaXNzdWVzIGluIHZhbGdyaW5kIHNlZW4gcHJldmlvdXNseSBsaWtlIGRvdWJsZSBmcmVlLCBpbnZhbGlkIHJlYWQKKyAgICogZXRjLiAqLworICBHc3RIYXJuZXNzICpoOworICBndWludCBmcmFtZXMgPSAxOworICBndWludCBpOworCisgIGlmICghaGF2ZV9lbGVtZW50ICgiYXZlbmNfaDI2MyIpKQorICAgIHJldHVybjsKKworICBoID0gZ3N0X2hhcm5lc3NfbmV3X3BhcnNlCisgICAgICAoImF2ZW5jX2gyNjMgcnRwLXBheWxvYWQtc2l6ZT0xICEgcnRwaDI2M3BheSBtdHU9MTM1MCAiKTsKKyAgZ3N0X2hhcm5lc3NfYWRkX3NyY19wYXJzZSAoaCwKKyAgICAgICJ2aWRlb3Rlc3RzcmMgcGF0dGVybj1zbm93IGlzLWxpdmU9MSAhICIKKyAgICAgICJjYXBzZmlsdGVyIGNhcHM9XCJ2aWRlby94LXJhdyxmb3JtYXQ9STQyMCx3aWR0aD0xNzYsaGVpZ2h0PTE0NFwiIiwgVFJVRSk7CisKKyAgZm9yIChpID0gMDsgaSA8IGZyYW1lczsgaSsrKQorICAgIGdzdF9oYXJuZXNzX3B1c2hfZnJvbV9zcmMgKGgpOworICBmYWlsX3VubGVzcyAoZ3N0X2hhcm5lc3NfYnVmZmVyc19yZWNlaXZlZCAoaCkgPj0gZnJhbWVzKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQoKSBtYXkgcmV0dXJuIGEgY29weSBvZiB0aGUgcGF5bG9hZC4gVGhpcyB0ZXN0CisgKiBtYWtlcyBzdXJlIHRoYXQgdGhlIHJ0cGgyNjNwZGVwYXkgYWxzbyBwcm9kdWNlcyB0aGUgY29ycmVjdCBvdXRwdXQgaW4gdGhpcworICogY2FzZS4gKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X2gyNjNwZGVwYXlfZnJhZ21lbnRlZF9tZW1vcnlfbm9uX3dyaXRhYmxlX2J1ZmZlcikKK3sKKyAgR3N0SGFybmVzcyAqaDsKKyAgR3N0QnVmZmVyICpoZWFkZXJfYnVmLCAqcGF5bG9hZF9idWYsICpidWY7CisgIEdzdFJUUEJ1ZmZlciBydHAgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworICBndWludDggaGVhZGVyW10gPSB7CisgICAgMHgwNCwgMHgwMAorICB9OworICBndWludDggcGF5bG9hZFtdID0geworICAgIDB4ODAsIDB4MDIsIDB4MWMsIDB4YjgsIDB4MDEsIDB4MDAsIDB4MTEsIDB4ZTAsIDB4NDQsIDB4YzQKKyAgfTsKKyAgZ3VpbnQ4IGZyYW1lW10gPSB7CisgICAgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMiwgMHgxYywgMHhiOCwgMHgwMSwgMHgwMCwgMHgxMSwgMHhlMCwgMHg0NCwgMHhjNAorICB9OworCisgIGggPSBnc3RfaGFybmVzc19uZXcgKCJydHBoMjYzcGRlcGF5Iik7CisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgsICJhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9dmlkZW8sICIKKyAgICAgICJjbG9jay1yYXRlPTkwMDAwLCBlbmNvZGluZy1uYW1lPUgyNjMtMTk5OCIpOworCisgIC8qIFBhY2tldCB3aXRoIE09MSwgUD0xICovCisgIGhlYWRlcl9idWYgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKHNpemVvZiAoaGVhZGVyKSwgMCwgMCk7CisgIGdzdF9ydHBfYnVmZmVyX21hcCAoaGVhZGVyX2J1ZiwgR1NUX01BUF9XUklURSwgJnJ0cCk7CisgIGdzdF9ydHBfYnVmZmVyX3NldF9tYXJrZXIgKCZydHAsIFRSVUUpOworICBtZW1jcHkgKGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKSwgaGVhZGVyLCBzaXplb2YgKGhlYWRlcikpOworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgcGF5bG9hZF9idWYgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgc2l6ZW9mIChwYXlsb2FkKSwgTlVMTCk7CisgIGdzdF9idWZmZXJfZmlsbCAocGF5bG9hZF9idWYsIDAsIHBheWxvYWQsIHNpemVvZiAocGF5bG9hZCkpOworICBidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAoaGVhZGVyX2J1ZiwgcGF5bG9hZF9idWYpOworCisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdzdF9idWZmZXJfcmVmIChidWYpKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICBidWYgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChidWYsIDAsIGZyYW1lLCBzaXplb2YgKGZyYW1lKSkgPT0gMCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkKCkgbWF5IHJldHVybiBhIGNvcHkgb2YgdGhlIHBheWxvYWQuIFRoaXMgdGVzdAorICogbWFrZXMgc3VyZSB0aGF0IHRoZSBydHBoMjYzcGRlcGF5IGFsc28gcHJvZHVjZXMgdGhlIGNvcnJlY3Qgb3V0cHV0IGluIHRoaXMKKyAqIGNhc2UuICovCitHU1RfU1RBUlRfVEVTVAorICAgICh0ZXN0X2gyNjNwZGVwYXlfZnJhZ21lbnRlZF9tZW1vcnlfbm9uX3dyaXRhYmxlX2J1ZmZlcl9zcGxpdF9mcmFtZSkgeworICBHc3RIYXJuZXNzICpoOworICBHc3RCdWZmZXIgKmhlYWRlcl9idWYsICpwYXlsb2FkX2J1ZiwgKmJ1ZjsKKyAgR3N0UlRQQnVmZmVyIHJ0cCA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisgIGd1aW50OCBoZWFkZXJbXSA9IHsKKyAgICAweDA0LCAweDAwCisgIH07CisgIGd1aW50OCBwYXlsb2FkW10gPSB7CisgICAgMHg4MCwgMHgwMiwgMHgxYywgMHhiOCwgMHgwMSwgMHgwMCwgMHgxMSwgMHhlMCwgMHg0NCwgMHhjNAorICB9OworICBndWludDggZnJhbWVbXSA9IHsKKyAgICAweDAwLCAweDAwLCAweDgwLCAweDAyLCAweDFjLCAweGI4LCAweDAxLCAweDAwLCAweDExLCAweGUwLCAweDQ0LCAweGM0CisgIH07CisKKyAgaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGgyNjNwZGVwYXkiKTsKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzX3N0ciAoaCwgImFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT12aWRlbywgIgorICAgICAgImNsb2NrLXJhdGU9OTAwMDAsIGVuY29kaW5nLW5hbWU9SDI2My0xOTk4Iik7CisKKyAgLyogRmlyc3QgcGFja2V0LCBNPTAsIFA9MSAqLworICBoZWFkZXJfYnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChzaXplb2YgKGhlYWRlciksIDAsIDApOworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKGhlYWRlcl9idWYsIEdTVF9NQVBfV1JJVEUsICZydHApOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBGQUxTRSk7CisgIGdzdF9ydHBfYnVmZmVyX3NldF9zZXEgKCZydHAsIDApOworICBtZW1jcHkgKGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKSwgaGVhZGVyLCBzaXplb2YgKGhlYWRlcikpOworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgcGF5bG9hZF9idWYgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgc2l6ZW9mIChwYXlsb2FkKSwgTlVMTCk7CisgIGdzdF9idWZmZXJfZmlsbCAocGF5bG9hZF9idWYsIDAsIHBheWxvYWQsIHNpemVvZiAocGF5bG9hZCkpOworICBidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAoaGVhZGVyX2J1ZiwgcGF5bG9hZF9idWYpOworCisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdzdF9idWZmZXJfcmVmIChidWYpKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2hhcm5lc3NfYnVmZmVyc19yZWNlaXZlZCAoaCksIDApOworCisgIC8qIFNlY29uZCBwYWNrZXQsIE09MSwgUD0xICovCisgIGhlYWRlcl9idWYgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKHNpemVvZiAoaGVhZGVyKSwgMCwgMCk7CisgIGdzdF9ydHBfYnVmZmVyX21hcCAoaGVhZGVyX2J1ZiwgR1NUX01BUF9XUklURSwgJnJ0cCk7CisgIGdzdF9ydHBfYnVmZmVyX3NldF9tYXJrZXIgKCZydHAsIFRSVUUpOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfc2VxICgmcnRwLCAxKTsKKyAgbWVtY3B5IChnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCksIGhlYWRlciwgc2l6ZW9mIChoZWFkZXIpKTsKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgIHBheWxvYWRfYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIHNpemVvZiAocGF5bG9hZCksIE5VTEwpOworICBnc3RfYnVmZmVyX21lbXNldCAocGF5bG9hZF9idWYsIDAsIDAsIDEwKTsKKyAgYnVmID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKGhlYWRlcl9idWYsIHBheWxvYWRfYnVmKTsKKworICBnc3RfaGFybmVzc19wdXNoIChoLCBnc3RfYnVmZmVyX3JlZiAoYnVmKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9oYXJuZXNzX2J1ZmZlcnNfcmVjZWl2ZWQgKGgpLCAxKTsKKworICBidWYgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChidWYsIDAsIGZyYW1lLCBzaXplb2YgKGZyYW1lKSkgPT0gMCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2gyNjNwZGVwYXlfZG9udF9wdXNoX2VtcHR5X2ZyYW1lKQoreworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwaDI2M3BkZXBheSIpOworCisgIC8qIFBhY2tldCB0aGF0IG9ubHkgY29udGFpbnMgaGVhZGVyIGluZm9ybWF0aW9uIGFuZCBhbiBleHRyYSBwaWN0dXJlIGhlYWRlcgorICAgKiAoUExFTiA+IDApLiBQYXJ0bHkgaGFuZGNyYWZ0ZWQgcGFja2V0LiBPcmlnaW5hbGx5IHRoaXMgcGFja2V0IGRpZCBub3QKKyAgICogaGF2ZSBQPTEgKGhlbmNlIGl0IHdhcyBub3Qgc3RhcnQgb2YgYSBwaWN0dXJlKS4gV2l0aCBib3RoIFA9MSBhbmQgTT0xIHdlCisgICAqIG9ubHkgbmVlZCBvbmUgcGFja2V0IHRvIHJlcHJvZHVjZSB0aGUgaXNzdWUgd2hlcmUgdHJ5aW5nIHRvIHB1c2ggYW4gZW1wdHkKKyAgICogZnJhbWUgd2hlbiBQTEVOIGlzIHNldCAqLworICBndWludDggcGFja2V0W10gPSB7CisgICAgMHg4MCwgMHhlOCwgMHhiYywgMHhhYSwgMHgxNCwgMHgxMiwgMHgxNiwgMHg1YywgMHhiOCwgMHg0ZSwgMHgzOSwgMHgwNCwKKyAgICAweDI1LCAweDAwLCAweDU0LCAweDM5LCAweGQwLCAweDEyLCAweDA2LCAweDllLCAweGI1LCAweDBhLCAweGY1LCAweGU4LAorICAgIDB4MzIsIDB4ZWIsIDB4ZDAsIDB4NmIsIDB4ZDYsIDB4YTIsIDB4ZmEsIDB4ZDQsIDB4M2QsIDB4ZDcsIDB4YTAsIDB4MmIsCisgICAgMHgyNCwgMHg5NywgMHhjMywgMHhiZiwgMHhjMCwgMHhiYiwgMHhkNywgMHhhMCwKKyAgfTsKKworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHNfc3RyIChoLCBIMjYzUF9SVFBfQ0FQU19TVFIgKDEwMCkpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLCBnc3RfaGFybmVzc19wdXNoIChoLAorICAgICAgICAgIGNyZWF0ZV9ydHBfYnVmZmVyIChwYWNrZXQsIHNpemVvZiAocGFja2V0KSwgMCwgMCkpKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfaGFybmVzc19idWZmZXJzX3JlY2VpdmVkIChoKSwgMCk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2gyNjNwcGF5X25vbl9maXhlZF9jYXBzKQoreworICBHc3RIYXJuZXNzICpoOworICBndWludDggZnJhbWVbXSA9IHsKKyAgICAweDAwLCAweDAwLCAweDgwLCAweDA2LCAweDFjLCAweGE4LCAweDAxLCAweDA0LCAweDkxLCAweGUwLCAweDM3LCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgIH07CisKKyAgaCA9IGdzdF9oYXJuZXNzX25ld19wYXJzZSAoInJ0cGgyNjNwcGF5Iik7CisKKyAgLyogU2V0IG5vbi1maXhlZCBjYXBzIGFmdGVyIHBheWxvYWRlciAqLworICBnc3RfaGFybmVzc19zZXRfY2Fwc19zdHIgKGgsICJ2aWRlby94LWgyNjMsIHZhcmlhbnQ9KHN0cmluZylpdHUiLAorICAgICAgImFwcGxpY2F0aW9uL3gtcnRwLCBjbG9jay1yYXRlPVsxLCBNQVhdIik7CisKKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZF9mdWxsIChHU1RfTUVNT1JZX0ZMQUdfUkVBRE9OTFksCisgICAgICAgICAgZnJhbWUsIHNpemVvZiAoZnJhbWUpLCAwLCBzaXplb2YgKGZyYW1lKSwgTlVMTCwgTlVMTCkpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDEsIGdzdF9oYXJuZXNzX2J1ZmZlcnNfcmVjZWl2ZWQgKGgpKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK3J0cGgyNjNfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgicnRwaDI2MyIpOworICBUQ2FzZSAqdGNfY2hhaW47CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCAodGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJoMjYzZGVwYXkiKSkpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaDI2M2RlcGF5X3N0YXJ0X3BhY2tldF90b29fc21hbGxfbW9kZV9hKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2gyNjNkZXBheV9zdGFydF9wYWNrZXRfdG9vX3NtYWxsX21vZGVfYik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9oMjYzZGVwYXlfc3RhcnRfcGFja2V0X3Rvb19zbWFsbF9tb2RlX2MpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgKHRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiaDI2M3BheSIpKSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9oMjYzcGF5X21vZGVfYl9zbm93KTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsICh0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImgyNjNwZGVwYXkiKSkpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sCisgICAgICB0ZXN0X2gyNjNwZGVwYXlfZnJhZ21lbnRlZF9tZW1vcnlfbm9uX3dyaXRhYmxlX2J1ZmZlcik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwKKyAgICAgIHRlc3RfaDI2M3BkZXBheV9mcmFnbWVudGVkX21lbW9yeV9ub25fd3JpdGFibGVfYnVmZmVyX3NwbGl0X2ZyYW1lKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2gyNjNwZGVwYXlfZG9udF9wdXNoX2VtcHR5X2ZyYW1lKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsICh0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImgyNjNwcGF5IikpKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2gyNjNwcGF5X25vbl9maXhlZF9jYXBzKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHJ0cGgyNjMpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaDI2NC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaDI2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyM2UxYmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBoMjY0LmMKQEAgLTAsMCArMSwzMTEgQEAKKy8qIEdTdHJlYW1lciBSVFAgSC4yNjQgdW5pdCB0ZXN0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDE3IENlbnRyaWN1bGFyIEx0ZAorICogICBAYXV0aG9yOiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svY2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvYXBwL2FwcC5oPgorCisjZGVmaW5lIEFMTE9DQVRPUl9DVVNUT01fU1lTTUVNICJDdXN0b21TeXNNZW0iCisKK3N0YXRpYyBHc3RBbGxvY2F0b3IgKmN1c3RvbV9zeXNtZW1fYWxsb2NhdG9yOyAgIC8qIE5VTEwgKi8KKworLyogQ3VzdG9tIG1lbW9yeSAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RNZW1vcnkgbWVtOworICBndWludDggKmRhdGE7CisgIGd1aW50OCAqYWxsb2NkYXRhOworfSBDdXN0b21TeXNtZW07CisKK3N0YXRpYyBDdXN0b21TeXNtZW0gKgorY3VzdG9tX3N5c21lbV9uZXcgKEdzdE1lbW9yeUZsYWdzIGZsYWdzLCBnc2l6ZSBtYXhzaXplLCBnc2l6ZSBhbGlnbiwKKyAgICBnc2l6ZSBvZmZzZXQsIGdzaXplIHNpemUpCit7CisgIGdzaXplIGFvZmZzZXQsIHBhZGRpbmc7CisgIEN1c3RvbVN5c21lbSAqbWVtOworCisgIC8qIGVuc3VyZSBjb25maWd1cmVkIGFsaWdubWVudCAqLworICBhbGlnbiB8PSBnc3RfbWVtb3J5X2FsaWdubWVudDsKKyAgLyogYWxsb2NhdGUgbW9yZSB0byBjb21wZW5zYXRlIGZvciBhbGlnbm1lbnQgKi8KKyAgbWF4c2l6ZSArPSBhbGlnbjsKKworICBtZW0gPSBnX25ldzAgKEN1c3RvbVN5c21lbSwgMSk7CisKKyAgbWVtLT5hbGxvY2RhdGEgPSBnX21hbGxvYyAobWF4c2l6ZSk7CisKKyAgbWVtLT5kYXRhID0gbWVtLT5hbGxvY2RhdGE7CisKKyAgLyogZG8gYWxpZ25tZW50ICovCisgIGlmICgoYW9mZnNldCA9ICgoZ3VpbnRwdHIpIG1lbS0+ZGF0YSAmIGFsaWduKSkpIHsKKyAgICBhb2Zmc2V0ID0gKGFsaWduICsgMSkgLSBhb2Zmc2V0OworICAgIG1lbS0+ZGF0YSArPSBhb2Zmc2V0OworICAgIG1heHNpemUgLT0gYW9mZnNldDsKKyAgfQorCisgIGlmIChvZmZzZXQgJiYgKGZsYWdzICYgR1NUX01FTU9SWV9GTEFHX1pFUk9fUFJFRklYRUQpKQorICAgIG1lbXNldCAobWVtLT5kYXRhLCAwLCBvZmZzZXQpOworCisgIHBhZGRpbmcgPSBtYXhzaXplIC0gKG9mZnNldCArIHNpemUpOworICBpZiAocGFkZGluZyAmJiAoZmxhZ3MgJiBHU1RfTUVNT1JZX0ZMQUdfWkVST19QQURERUQpKQorICAgIG1lbXNldCAobWVtLT5kYXRhICsgb2Zmc2V0ICsgc2l6ZSwgMCwgcGFkZGluZyk7CisKKyAgZ3N0X21lbW9yeV9pbml0IChHU1RfTUVNT1JZX0NBU1QgKG1lbSksIGZsYWdzLCBjdXN0b21fc3lzbWVtX2FsbG9jYXRvciwKKyAgICAgIE5VTEwsIG1heHNpemUsIGFsaWduLCBvZmZzZXQsIHNpemUpOworCisgIHJldHVybiBtZW07Cit9CisKK3N0YXRpYyBncG9pbnRlcgorY3VzdG9tX3N5c21lbV9tYXAgKEN1c3RvbVN5c21lbSAqIG1lbSwgZ3NpemUgbWF4c2l6ZSwgR3N0TWFwRmxhZ3MgZmxhZ3MpCit7CisgIHJldHVybiBtZW0tPmRhdGE7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorY3VzdG9tX3N5c21lbV91bm1hcCAoQ3VzdG9tU3lzbWVtICogbWVtKQoreworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEN1c3RvbVN5c21lbSAqCitjdXN0b21fc3lzbWVtX2NvcHkgKEN1c3RvbVN5c21lbSAqIG1lbSwgZ3NzaXplIG9mZnNldCwgZ3NpemUgc2l6ZSkKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX3JlYWNoZWQgKE5VTEwpOworfQorCitzdGF0aWMgQ3VzdG9tU3lzbWVtICoKK2N1c3RvbV9zeXNtZW1fc2hhcmUgKEN1c3RvbVN5c21lbSAqIG1lbSwgZ3NzaXplIG9mZnNldCwgZ3NpemUgc2l6ZSkKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX3JlYWNoZWQgKE5VTEwpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2N1c3RvbV9zeXNtZW1faXNfc3BhbiAoQ3VzdG9tU3lzbWVtICogbWVtMSwgQ3VzdG9tU3lzbWVtICogbWVtMiwgZ3NpemUgKiBvZmZzZXQpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9yZWFjaGVkIChGQUxTRSk7Cit9CisKKy8qIEN1c3RvbSBhbGxvY2F0b3IgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0QWxsb2NhdG9yIGFsbG9jYXRvcjsKK30gQ3VzdG9tU3lzbWVtQWxsb2NhdG9yOworCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RBbGxvY2F0b3JDbGFzcyBhbGxvY2F0b3JfY2xhc3M7Cit9IEN1c3RvbVN5c21lbUFsbG9jYXRvckNsYXNzOworCitHVHlwZSBjdXN0b21fc3lzbWVtX2FsbG9jYXRvcl9nZXRfdHlwZSAodm9pZCk7CitHX0RFRklORV9UWVBFIChDdXN0b21TeXNtZW1BbGxvY2F0b3IsIGN1c3RvbV9zeXNtZW1fYWxsb2NhdG9yLAorICAgIEdTVF9UWVBFX0FMTE9DQVRPUik7CisKK3N0YXRpYyBHc3RNZW1vcnkgKgorY3VzdG9tX3N5c21lbV9hbGxvY2F0b3JfYWxsb2MgKEdzdEFsbG9jYXRvciAqIGFsbG9jYXRvciwgZ3NpemUgc2l6ZSwKKyAgICBHc3RBbGxvY2F0aW9uUGFyYW1zICogcGFyYW1zKQoreworICBnc2l6ZSBtYXhzaXplID0gc2l6ZSArIHBhcmFtcy0+cHJlZml4ICsgcGFyYW1zLT5wYWRkaW5nOworCisgIHJldHVybiAoR3N0TWVtb3J5ICopIGN1c3RvbV9zeXNtZW1fbmV3IChwYXJhbXMtPmZsYWdzLAorICAgICAgbWF4c2l6ZSwgcGFyYW1zLT5hbGlnbiwgcGFyYW1zLT5wcmVmaXgsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorY3VzdG9tX3N5c21lbV9hbGxvY2F0b3JfZnJlZSAoR3N0QWxsb2NhdG9yICogYWxsb2NhdG9yLCBHc3RNZW1vcnkgKiBtZW0pCit7CisgIEN1c3RvbVN5c21lbSAqY3NtZW0gPSAoQ3VzdG9tU3lzbWVtICopIG1lbTsKKworICBnX2ZyZWUgKGNzbWVtLT5hbGxvY2RhdGEpOworICBnX2ZyZWUgKGNzbWVtKTsKK30KKworc3RhdGljIHZvaWQKK2N1c3RvbV9zeXNtZW1fYWxsb2NhdG9yX2NsYXNzX2luaXQgKEN1c3RvbVN5c21lbUFsbG9jYXRvckNsYXNzICoga2xhc3MpCit7CisgIEdzdEFsbG9jYXRvckNsYXNzICphbGxvY2F0b3JfY2xhc3MgPSAoR3N0QWxsb2NhdG9yQ2xhc3MgKikga2xhc3M7CisKKyAgYWxsb2NhdG9yX2NsYXNzLT5hbGxvYyA9IGN1c3RvbV9zeXNtZW1fYWxsb2NhdG9yX2FsbG9jOworICBhbGxvY2F0b3JfY2xhc3MtPmZyZWUgPSBjdXN0b21fc3lzbWVtX2FsbG9jYXRvcl9mcmVlOworfQorCitzdGF0aWMgdm9pZAorY3VzdG9tX3N5c21lbV9hbGxvY2F0b3JfaW5pdCAoQ3VzdG9tU3lzbWVtQWxsb2NhdG9yICogYWxsb2NhdG9yKQoreworICBHc3RBbGxvY2F0b3IgKmFsbG9jID0gR1NUX0FMTE9DQVRPUl9DQVNUIChhbGxvY2F0b3IpOworCisgIGFsbG9jLT5tZW1fdHlwZSA9IEFMTE9DQVRPUl9DVVNUT01fU1lTTUVNOworICBhbGxvYy0+bWVtX21hcCA9IChHc3RNZW1vcnlNYXBGdW5jdGlvbikgY3VzdG9tX3N5c21lbV9tYXA7CisgIGFsbG9jLT5tZW1fdW5tYXAgPSAoR3N0TWVtb3J5VW5tYXBGdW5jdGlvbikgY3VzdG9tX3N5c21lbV91bm1hcDsKKyAgYWxsb2MtPm1lbV9jb3B5ID0gKEdzdE1lbW9yeUNvcHlGdW5jdGlvbikgY3VzdG9tX3N5c21lbV9jb3B5OworICBhbGxvYy0+bWVtX3NoYXJlID0gKEdzdE1lbW9yeVNoYXJlRnVuY3Rpb24pIGN1c3RvbV9zeXNtZW1fc2hhcmU7CisgIGFsbG9jLT5tZW1faXNfc3BhbiA9IChHc3RNZW1vcnlJc1NwYW5GdW5jdGlvbikgY3VzdG9tX3N5c21lbV9pc19zcGFuOworfQorCisvKiBBcHBTaW5rIHN1YmNsYXNzIHByb3Bvc2luZyBvdXIgY3VzdG9tIGFsbG9jYXRvciB0byB1cHN0cmVhbSAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RBcHBTaW5rIGFwcHNpbms7Cit9IENNZW1BcHBTaW5rOworCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RBcHBTaW5rQ2xhc3MgYXBwc2luazsKK30gQ01lbUFwcFNpbmtDbGFzczsKKworR1R5cGUgY19tZW1fYXBwX3NpbmtfZ2V0X3R5cGUgKHZvaWQpOworCitHX0RFRklORV9UWVBFIChDTWVtQXBwU2luaywgY19tZW1fYXBwX3NpbmssIEdTVF9UWVBFX0FQUF9TSU5LKTsKKworc3RhdGljIHZvaWQKK2NfbWVtX2FwcF9zaW5rX2luaXQgKENNZW1BcHBTaW5rICogY21lbXNpbmspCit7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorY19tZW1fYXBwX3NpbmtfcHJvcG9zZV9hbGxvY2F0aW9uIChHc3RCYXNlU2luayAqIHNpbmssIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIGdzdF9xdWVyeV9hZGRfYWxsb2NhdGlvbl9wYXJhbSAocXVlcnksIGN1c3RvbV9zeXNtZW1fYWxsb2NhdG9yLCBOVUxMKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitjX21lbV9hcHBfc2lua19jbGFzc19pbml0IChDTWVtQXBwU2lua0NsYXNzICoga2xhc3MpCit7CisgIEdzdEJhc2VTaW5rQ2xhc3MgKmJhc2VzaW5rX2NsYXNzID0gKEdzdEJhc2VTaW5rQ2xhc3MgKikga2xhc3M7CisKKyAgYmFzZXNpbmtfY2xhc3MtPnByb3Bvc2VfYWxsb2NhdGlvbiA9IGNfbWVtX2FwcF9zaW5rX3Byb3Bvc2VfYWxsb2NhdGlvbjsKK30KKworI2RlZmluZSBSVFBfSDI2NF9GSUxFIEdTVF9URVNUX0ZJTEVTX1BBVEggR19ESVJfU0VQQVJBVE9SX1MgImgyNjQucnRwIgorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ydHBoMjY0ZGVwYXlfd2l0aF9kb3duc3RyZWFtX2FsbG9jYXRvcikKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmUsICpzcmMsICpkZXBheSwgKnNpbms7CisgIEdzdE1lbW9yeSAqbWVtOworICBHc3RTYW1wbGUgKnNhbXBsZTsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgY3VzdG9tX3N5c21lbV9hbGxvY2F0b3IgPQorICAgICAgZ19vYmplY3RfbmV3IChjdXN0b21fc3lzbWVtX2FsbG9jYXRvcl9nZXRfdHlwZSAoKSwgTlVMTCk7CisKKyAgcGlwZWxpbmUgPSBnc3RfcGlwZWxpbmVfbmV3ICgicGlwZWxpbmUiKTsKKworICBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhcHBzcmMiLCBOVUxMKTsKKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtcnRwIiwKKyAgICAgICJtZWRpYSIsIEdfVFlQRV9TVFJJTkcsICJ2aWRlbyIsCisgICAgICAicGF5bG9hZCIsIEdfVFlQRV9JTlQsIDk2LAorICAgICAgImNsb2NrLXJhdGUiLCBHX1RZUEVfSU5ULCA5MDAwMCwKKyAgICAgICJlbmNvZGluZy1uYW1lIiwgR19UWVBFX1NUUklORywgIkgyNjQiLAorICAgICAgInNzcmMiLCBHX1RZUEVfVUlOVCwgMTk5MDY4MzgxMCwKKyAgICAgICJ0aW1lc3RhbXAtb2Zmc2V0IiwgR19UWVBFX1VJTlQsIDM2OTc1ODM0NDYsCisgICAgICAic2VxbnVtLW9mZnNldCIsIEdfVFlQRV9VSU5ULCAxNTU2OCwKKyAgICAgICJhLWZyYW1lcmF0ZSIsIEdfVFlQRV9TVFJJTkcsICIzMCIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNyYywgImZvcm1hdCIsIEdTVF9GT1JNQVRfVElNRSwgImNhcHMiLCBjYXBzLCBOVUxMKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc3JjKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGRlcGF5ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwaDI2NGRlcGF5IiwgTlVMTCk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIGRlcGF5KTsKKworICBzaW5rID0gZ19vYmplY3RfbmV3IChjX21lbV9hcHBfc2lua19nZXRfdHlwZSAoKSwgTlVMTCk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIHNpbmspOworCisgIGdzdF9lbGVtZW50X2xpbmtfbWFueSAoc3JjLCBkZXBheSwgc2luaywgTlVMTCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BBVVNFRCk7CisKKyAgeworICAgIGdjaGFyICpkYXRhLCAqcGRhdGE7CisgICAgZ3NpemUgbGVuOworCisgICAgZmFpbF91bmxlc3MgKGdfZmlsZV9nZXRfY29udGVudHMgKFJUUF9IMjY0X0ZJTEUsICZkYXRhLCAmbGVuLCBOVUxMKSk7CisgICAgZmFpbF91bmxlc3MgKGxlbiA+IDIpOworCisgICAgcGRhdGEgPSBkYXRhOworICAgIHdoaWxlIChsZW4gPiAyKSB7CisgICAgICBHc3RGbG93UmV0dXJuIGZsb3c7CisgICAgICBndWludDE2IHBhY2tldF9sZW47CisKKyAgICAgIHBhY2tldF9sZW4gPSBHU1RfUkVBRF9VSU5UMTZfQkUgKHBkYXRhKTsKKyAgICAgIEdTVF9JTkZPICgicnRwIHBhY2tldCBsZW5ndGg6ICV1IChieXRlcyBsZWZ0OiAldSkiLCBwYWNrZXRfbGVuLAorICAgICAgICAgIChndWludCkgbGVuKTsKKyAgICAgIGZhaWxfdW5sZXNzIChsZW4gPj0gMiArIHBhY2tldF9sZW4pOworCisgICAgICBmbG93ID0gZ3N0X2FwcF9zcmNfcHVzaF9idWZmZXIgKEdTVF9BUFBfU1JDIChzcmMpLAorICAgICAgICAgIGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGdfbWVtZHVwIChwZGF0YSArIDIsIHBhY2tldF9sZW4pLAorICAgICAgICAgICAgICBwYWNrZXRfbGVuKSk7CisKKyAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGZsb3csIEdTVF9GTE9XX09LKTsKKworICAgICAgcGRhdGEgKz0gMiArIHBhY2tldF9sZW47CisgICAgICBsZW4gLT0gMiArIHBhY2tldF9sZW47CisgICAgfQorCisgICAgZ19mcmVlIChkYXRhKTsKKyAgfQorCisgIGdzdF9hcHBfc3JjX2VuZF9vZl9zdHJlYW0gKEdTVF9BUFBfU1JDIChzcmMpKTsKKworICBzYW1wbGUgPSBnc3RfYXBwX3NpbmtfcHVsbF9wcmVyb2xsIChHU1RfQVBQX1NJTksgKHNpbmspKTsKKyAgZmFpbF91bmxlc3MgKHNhbXBsZSAhPSBOVUxMKTsKKworICBidWYgPSBnc3Rfc2FtcGxlX2dldF9idWZmZXIgKHNhbXBsZSk7CisKKyAgR1NUX0xPRyAoImJ1ZmZlciBoYXMgJXUgbWVtb3JpZXMiLCBnc3RfYnVmZmVyX25fbWVtb3J5IChidWYpKTsKKyAgR1NUX0xPRyAoImJ1ZmZlciBzaXplOiAldSIsIChndWludCkgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbl9tZW1vcnkgKGJ1ZikgPiAwKTsKKyAgbWVtID0gZ3N0X2J1ZmZlcl9wZWVrX21lbW9yeSAoYnVmLCAwKTsKKyAgZmFpbF91bmxlc3MgKG1lbSAhPSBOVUxMKTsKKworICBHU1RfTE9HICgiYnVmZmVyIG1lbW9yeSB0eXBlOiAlcyIsIG1lbS0+YWxsb2NhdG9yLT5tZW1fdHlwZSk7CisgIGZhaWxfdW5sZXNzIChnc3RfbWVtb3J5X2lzX3R5cGUgKG1lbSwgQUxMT0NBVE9SX0NVU1RPTV9TWVNNRU0pKTsKKworICBnc3Rfc2FtcGxlX3VucmVmIChzYW1wbGUpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGN1c3RvbV9zeXNtZW1fYWxsb2NhdG9yKTsKKyAgY3VzdG9tX3N5c21lbV9hbGxvY2F0b3IgPSBOVUxMOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitydHBoMjY0X3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoInJ0cGgyNjQiKTsKKyAgVENhc2UgKnRjX2NoYWluOworCisgIHRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgicnRwaDI2NGRlcGF5Iik7CisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcnRwaDI2NGRlcGF5X3dpdGhfZG93bnN0cmVhbV9hbGxvY2F0b3IpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAocnRwaDI2NCk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMTNhMGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYwpAQCAtMCwwICsxLDIxODUgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQgaXRzIHN1YnNpZGFyeSgtaWVzKQorICogICAgICAgICAgICAgICBjb250YWN0OiA8c3RlZmFuLmtvc3RAbm9raWEuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEyIENpc2NvIFN5c3RlbXMsIEluYworICogICAgICAgICAgICAgICBBdXRob3JzOiBLZWxsZXkgUm9nZXJzIDxrZWxyb0BjaXNjby5jb20+CisgKiAgICAgICAgICAgICAgIEhhdmFyZCBHcmFmZiA8aGdyYWZmQGNpc2NvLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE2IFBleGlwIEFTCisgKiAgICAgICAgICAgICAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXA+CisgKiAgICAgICAgICAgICAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkQHBleGlwPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0dGVzdGNsb2NrLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGhhcm5lc3MuaD4KKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKKy8qIEZvciBlYXNlIG9mIHByb2dyYW1taW5nIHdlIHVzZSBnbG9iYWxzIHRvIGtlZXAgcmVmcyBmb3Igb3VyIGZsb2F0aW5nCisgKiBzcmMgYW5kIHNpbmsgcGFkcyB3ZSBjcmVhdGU7IG90aGVyd2lzZSB3ZSBhbHdheXMgaGF2ZSB0byBkbyBnZXRfcGFkLAorICogZ2V0X3BlZXIsIGFuZCB0aGVuIHJlbW92ZSByZWZlcmVuY2VzIGluIGV2ZXJ5IHRlc3QgZnVuY3Rpb24gKi8KK3N0YXRpYyBHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworLyogd2UgYWxzbyBoYXZlIGEgbGlzdCBvZiBzcmMgYnVmZmVycyAqLworc3RhdGljIEdMaXN0ICppbmJ1ZmZlcnMgPSBOVUxMOworc3RhdGljIGdpbnQgbnVtX2Ryb3BwZWQgPSAwOworCisjZGVmaW5lIFJUUF9DQVBTX1NUUklORyAgICBcCisgICAgImFwcGxpY2F0aW9uL3gtcnRwLCAiICAgICAgICAgICAgICAgXAorICAgICJtZWRpYSA9IChzdHJpbmcpYXVkaW8sICIgICAgICAgICAgIFwKKyAgICAicGF5bG9hZCA9IChpbnQpIDAsICIgICAgICAgICAgICAgICBcCisgICAgImNsb2NrLXJhdGUgPSAoaW50KSA4MDAwLCAiICAgICAgICAgXAorICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZylQQ01VIgorCisjZGVmaW5lIFJUUF9GUkFNRV9TSVpFIDIwCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCIpCisgICAgKTsKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsgMSwgMjE0NzQ4MzY0NyBdIikKKyAgICApOworCitzdGF0aWMgdm9pZAorYnVmZmVyX2Ryb3BwZWQgKGdwb2ludGVyIGRhdGEsIEdzdE1pbmlPYmplY3QgKiBvYmopCit7CisgIEdTVF9ERUJVRyAoImRyb3BwaW5nIGJ1ZmZlciAlcCIsIG9iaik7CisgIG51bV9kcm9wcGVkKys7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX2ppdHRlcmJ1ZmZlciAoZ2ludCBudW1fYnVmZmVycykKK3sKKyAgR3N0RWxlbWVudCAqaml0dGVyYnVmZmVyOworICBHc3RDbG9jayAqY2xvY2s7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICAvKiBhIDIwIHNhbXBsZSBhdWRpbyBibG9jayAoMiw1IG1zKSBnZW5lcmF0ZWQgd2l0aAorICAgKiBnc3QtbGF1bmNoIGF1ZGlvdGVzdHNyYyB3YXZlPXNpbGVuY2UgYmxvY2tzaXplPTQwIG51bS1idWZmZXJzPTMgIQorICAgKiAgICAiYXVkaW8veC1yYXcsY2hhbm5lbHM9MSxyYXRlPTgwMDAiICEgbXVsYXdlbmMgISBydHBwY211cGF5ICEKKyAgICogICAgIGZha2VzaW5rIGR1bXA9MQorICAgKi8KKyAgZ3VpbnQ4IGluW10gPSB7CisgICAgLyogZmlyc3QgNCBieXRlcyBhcmUgcnRwLWhlYWRlciwgbmV4dCA0IGJ5dGVzIGFyZSB0aW1lc3RhbXAgKi8KKyAgICAweDgwLCAweDgwLCAweDFjLCAweDI0LCAweDQ2LCAweGNkLCAweGI3LCAweDExLCAweDNjLCAweDNhLCAweDdjLCAweDViLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZgorICB9OworICBHc3RDbG9ja1RpbWUgdHMgPSBHX0dVSU5UNjRfQ09OU1RBTlQgKDApOworICBHc3RDbG9ja1RpbWUgdHNvID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChSVFBfRlJBTUVfU0laRSwgR1NUX1NFQ09ORCwgODAwMCk7CisgIC8qZ3VpbnQgbGF0ZW5jeSA9IEdTVF9USU1FX0FTX01TRUNPTkRTIChudW1fYnVmZmVycyAqIHRzbyk7ICovCisgIGdpbnQgaTsKKworICBHU1RfREVCVUcgKCJzZXR1cF9qaXR0ZXJidWZmZXIiKTsKKyAgaml0dGVyYnVmZmVyID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJydHBqaXR0ZXJidWZmZXIiKTsKKyAgLyogd2UgbmVlZCBhIGNsb2NrIGhlcmUgKi8KKyAgY2xvY2sgPSBnc3Rfc3lzdGVtX2Nsb2NrX29idGFpbiAoKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2Nsb2NrIChqaXR0ZXJidWZmZXIsIGNsb2NrKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoY2xvY2spOworICAvKiBzZXR1cCBsYXRlbmN5ICovCisgIC8qIGxhdGVuY3kgd291bGQgYmUgNyBmb3IgMyBidWZmZXJzIGhlcmUsIGRlZmF1bHQgaXMgMjAwCisgICAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciksICJsYXRlbmN5IiwgbGF0ZW5jeSwgTlVMTCk7CisgICAgIEdTVF9JTkZPX09CSkVDVCAoaml0dGVyYnVmZmVyLCAic2V0IGxhdGVuY3kgdG8gJXUgbXMiLCBsYXRlbmN5KTsKKyAgICovCisKKyAgbXlzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAoaml0dGVyYnVmZmVyLCAmc3JjdGVtcGxhdGUpOworICBteXNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKGppdHRlcmJ1ZmZlciwgJnNpbmt0ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgLyogY3JlYXRlIG4gYnVmZmVycyAqLworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKFJUUF9DQVBTX1NUUklORyk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBqaXR0ZXJidWZmZXIsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2J1ZmZlcnM7IGkrKykgeworICAgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZW9mIChpbikpOworICAgIGdzdF9idWZmZXJfZmlsbCAoYnVmZmVyLCAwLCBpbiwgc2l6ZW9mIChpbikpOworICAgIEdTVF9CVUZGRVJfRFRTIChidWZmZXIpID0gdHM7CisgICAgR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcikgPSB0czsKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpID0gdHNvOworICAgIGdzdF9taW5pX29iamVjdF93ZWFrX3JlZiAoR1NUX01JTklfT0JKRUNUIChidWZmZXIpLCBidWZmZXJfZHJvcHBlZCwgTlVMTCk7CisgICAgR1NUX0RFQlVHICgiY3JlYXRlZCBidWZmZXI6ICVwIiwgYnVmZmVyKTsKKworICAgIGlmICghaSkKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworCisgICAgaW5idWZmZXJzID0gZ19saXN0X2FwcGVuZCAoaW5idWZmZXJzLCBidWZmZXIpOworCisgICAgLyogaGFja2lzaCB3YXkgdG8gdXBkYXRlIHRoZSBydHAgaGVhZGVyICovCisgICAgaW5bMV0gPSAweDAwOworICAgIGluWzNdKys7ICAgICAgICAgICAgICAgICAgICAvKiBzZXFudW1iZXIgKi8KKyAgICBpbls3XSArPSBSVFBfRlJBTUVfU0laRTsgICAgLyogaW5jLiB0aW1lc3RhbXAgd2l0aCBmcmFtZXNpemUgKi8KKyAgICB0cyArPSB0c287CisgIH0KKyAgbnVtX2Ryb3BwZWQgPSAwOworCisgIHJldHVybiBqaXR0ZXJidWZmZXI7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorc3RhcnRfaml0dGVyYnVmZmVyIChHc3RFbGVtZW50ICogaml0dGVyYnVmZmVyKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdENsb2NrVGltZSBub3c7CisgIEdzdENsb2NrICpjbG9jazsKKworICBjbG9jayA9IGdzdF9lbGVtZW50X2dldF9jbG9jayAoaml0dGVyYnVmZmVyKTsKKyAgbm93ID0gZ3N0X2Nsb2NrX2dldF90aW1lIChjbG9jayk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGNsb2NrKTsKKworICBnc3RfZWxlbWVudF9zZXRfYmFzZV90aW1lIChqaXR0ZXJidWZmZXIsIG5vdyk7CisgIHJldCA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoaml0dGVyYnVmZmVyLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfaml0dGVyYnVmZmVyIChHc3RFbGVtZW50ICogaml0dGVyYnVmZmVyKQoreworICBHU1RfREVCVUcgKCJjbGVhbnVwX2ppdHRlcmJ1ZmZlciIpOworCisgIGdfbGlzdF9mb3JlYWNoIChidWZmZXJzLCAoR0Z1bmMpIGdzdF9taW5pX29iamVjdF91bnJlZiwgTlVMTCk7CisgIGdfbGlzdF9mcmVlIChidWZmZXJzKTsKKyAgYnVmZmVycyA9IE5VTEw7CisKKyAgZ19saXN0X2ZyZWUgKGluYnVmZmVycyk7CisgIGluYnVmZmVycyA9IE5VTEw7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAoaml0dGVyYnVmZmVyKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChqaXR0ZXJidWZmZXIpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAoaml0dGVyYnVmZmVyKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2ppdHRlcmJ1ZmZlcl9yZXN1bHRzIChHc3RFbGVtZW50ICogaml0dGVyYnVmZmVyLCBnaW50IG51bV9idWZmZXJzKQoreworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR0xpc3QgKm5vZGU7CisgIEdzdENsb2NrVGltZSB0cyA9IEdfR1VJTlQ2NF9DT05TVEFOVCAoMCk7CisgIEdzdENsb2NrVGltZSB0c28gPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKFJUUF9GUkFNRV9TSVpFLCBHU1RfU0VDT05ELCA4MDAwKTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50MTYgcHJldl9zbiA9IDAsIGN1cl9zbjsKKyAgZ3VpbnQzMiBwcmV2X3RzID0gMCwgY3VyX3RzOworCisgIC8qIHNsZWVwIGZvciB0d2ljZSB0aGUgbGF0ZW5jeSAqLworICBnX3VzbGVlcCAoNDAwICogMTAwMCk7CisKKyAgR1NUX0lORk8gKCJvZiAlZCBidWZmZXIgJWQvJWQgcmVjZWl2ZWQvZHJvcHBlZCIsIG51bV9idWZmZXJzLAorICAgICAgZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIG51bV9kcm9wcGVkKTsKKyAgLyogaWYgdGhpcyBmYWlscywgbm90IGFsbCBidWZmZXJzIGhhdmUgYmVlbiBwcm9jZXNzZWQgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpICsgbnVtX2Ryb3BwZWQpLCBudW1fYnVmZmVycyk7CisKKyAgLyogY2hlY2sgdGhlIGJ1ZmZlciBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCBudW1fYnVmZmVycyk7CisgIGZvciAobm9kZSA9IGJ1ZmZlcnM7IG5vZGU7IG5vZGUgPSBnX2xpc3RfbmV4dCAobm9kZSkpIHsKKyAgICBmYWlsX2lmICgoYnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBub2RlLT5kYXRhKSA9PSBOVUxMKTsKKyAgICBmYWlsX2lmIChHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKSAhPSB0cyk7CisgICAgZmFpbF9pZiAoR1NUX0JVRkZFUl9EVFMgKGJ1ZmZlcikgIT0gdHMpOworICAgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgY3VyX3NuID0gKChndWludDE2KSBtYXAuZGF0YVsyXSA8PCA4KSB8IG1hcC5kYXRhWzNdOworICAgIGN1cl90cyA9ICgoZ3VpbnQzMikgbWFwLmRhdGFbNF0gPDwgMjQpIHwgKChndWludDMyKSBtYXAuZGF0YVs1XSA8PCAxNikgfAorICAgICAgICAoKGd1aW50MzIpIG1hcC5kYXRhWzZdIDw8IDgpIHwgbWFwLmRhdGFbN107CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICAgIGlmIChub2RlICE9IGJ1ZmZlcnMpIHsKKyAgICAgIGZhaWxfdW5sZXNzIChjdXJfc24gPiBwcmV2X3NuKTsKKyAgICAgIGZhaWxfdW5sZXNzIChjdXJfdHMgPiBwcmV2X3RzKTsKKworICAgICAgcHJldl9zbiA9IGN1cl9zbjsKKyAgICAgIHByZXZfdHMgPSBjdXJfdHM7CisgICAgfQorICAgIHRzICs9IHRzbzsKKyAgfQorfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wdXNoX2ZvcndhcmRfc2VxKQoreworICBHc3RFbGVtZW50ICpqaXR0ZXJidWZmZXI7CisgIGNvbnN0IGd1aW50IG51bV9idWZmZXJzID0gMzsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIEdMaXN0ICpub2RlOworCisgIGppdHRlcmJ1ZmZlciA9IHNldHVwX2ppdHRlcmJ1ZmZlciAobnVtX2J1ZmZlcnMpOworICBmYWlsX3VubGVzcyAoc3RhcnRfaml0dGVyYnVmZmVyIChqaXR0ZXJidWZmZXIpCisgICAgICA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICAvKiBwdXNoIGJ1ZmZlcnM6IDAsMSwyLCAqLworICBmb3IgKG5vZGUgPSBpbmJ1ZmZlcnM7IG5vZGU7IG5vZGUgPSBnX2xpc3RfbmV4dCAobm9kZSkpIHsKKyAgICBidWZmZXIgPSAoR3N0QnVmZmVyICopIG5vZGUtPmRhdGE7CisgICAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICB9CisKKyAgLyogY2hlY2sgdGhlIGJ1ZmZlciBsaXN0ICovCisgIGNoZWNrX2ppdHRlcmJ1ZmZlcl9yZXN1bHRzIChqaXR0ZXJidWZmZXIsIG51bV9idWZmZXJzKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfaml0dGVyYnVmZmVyIChqaXR0ZXJidWZmZXIpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3B1c2hfYmFja3dhcmRfc2VxKQoreworICBHc3RFbGVtZW50ICpqaXR0ZXJidWZmZXI7CisgIGNvbnN0IGd1aW50IG51bV9idWZmZXJzID0gNDsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIEdMaXN0ICpub2RlOworCisgIGppdHRlcmJ1ZmZlciA9IHNldHVwX2ppdHRlcmJ1ZmZlciAobnVtX2J1ZmZlcnMpOworICBmYWlsX3VubGVzcyAoc3RhcnRfaml0dGVyYnVmZmVyIChqaXR0ZXJidWZmZXIpCisgICAgICA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICAvKiBwdXNoIGJ1ZmZlcnM6IDAsMywyLDEgKi8KKyAgYnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBpbmJ1ZmZlcnMtPmRhdGE7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBidWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZm9yIChub2RlID0gZ19saXN0X2xhc3QgKGluYnVmZmVycyk7IG5vZGUgIT0gaW5idWZmZXJzOworICAgICAgbm9kZSA9IGdfbGlzdF9wcmV2aW91cyAobm9kZSkpIHsKKyAgICBidWZmZXIgPSAoR3N0QnVmZmVyICopIG5vZGUtPmRhdGE7CisgICAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICB9CisKKyAgLyogY2hlY2sgdGhlIGJ1ZmZlciBsaXN0ICovCisgIGNoZWNrX2ppdHRlcmJ1ZmZlcl9yZXN1bHRzIChqaXR0ZXJidWZmZXIsIG51bV9idWZmZXJzKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfaml0dGVyYnVmZmVyIChqaXR0ZXJidWZmZXIpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3B1c2hfdW5vcmRlcmVkKQoreworICBHc3RFbGVtZW50ICpqaXR0ZXJidWZmZXI7CisgIGNvbnN0IGd1aW50IG51bV9idWZmZXJzID0gNDsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgaml0dGVyYnVmZmVyID0gc2V0dXBfaml0dGVyYnVmZmVyIChudW1fYnVmZmVycyk7CisgIGZhaWxfdW5sZXNzIChzdGFydF9qaXR0ZXJidWZmZXIgKGppdHRlcmJ1ZmZlcikKKyAgICAgID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIC8qIHB1c2ggYnVmZmVyczsgMCwyLDEsMyAqLworICBidWZmZXIgPSAoR3N0QnVmZmVyICopIGluYnVmZmVycy0+ZGF0YTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBidWZmZXIgPSBnX2xpc3RfbnRoX2RhdGEgKGluYnVmZmVycywgMik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBidWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgYnVmZmVyID0gZ19saXN0X250aF9kYXRhIChpbmJ1ZmZlcnMsIDEpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGJ1ZmZlciA9IGdfbGlzdF9udGhfZGF0YSAoaW5idWZmZXJzLCAzKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworCisgIC8qIGNoZWNrIHRoZSBidWZmZXIgbGlzdCAqLworICBjaGVja19qaXR0ZXJidWZmZXJfcmVzdWx0cyAoaml0dGVyYnVmZmVyLCBudW1fYnVmZmVycyk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2ppdHRlcmJ1ZmZlciAoaml0dGVyYnVmZmVyKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9iYXNldGltZSkKK3sKKyAgR3N0RWxlbWVudCAqaml0dGVyYnVmZmVyOworICBjb25zdCBndWludCBudW1fYnVmZmVycyA9IDM7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBHTGlzdCAqbm9kZTsKKyAgR3N0Q2xvY2tUaW1lIHRzbyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoUlRQX0ZSQU1FX1NJWkUsIEdTVF9TRUNPTkQsIDgwMDApOworCisgIGppdHRlcmJ1ZmZlciA9IHNldHVwX2ppdHRlcmJ1ZmZlciAobnVtX2J1ZmZlcnMpOworICBmYWlsX3VubGVzcyAoc3RhcnRfaml0dGVyYnVmZmVyIChqaXR0ZXJidWZmZXIpCisgICAgICA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICAvKiBwdXNoIGJ1ZmZlcnM6IDIsMSwwICovCisgIGZvciAobm9kZSA9IGdfbGlzdF9sYXN0IChpbmJ1ZmZlcnMpOyBub2RlOyBub2RlID0gZ19saXN0X3ByZXZpb3VzIChub2RlKSkgeworICAgIGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgbm9kZS0+ZGF0YTsKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIH0KKworICAvKiBzbGVlcCBmb3IgdHdpY2UgdGhlIGxhdGVuY3kgKi8KKyAgZ191c2xlZXAgKDQwMCAqIDEwMDApOworCisgIC8qIGlmIHRoaXMgZmFpbHMsIG5vdCBhbGwgYnVmZmVycyBoYXZlIGJlZW4gcHJvY2Vzc2VkICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSArIG51bV9kcm9wcGVkKSwgbnVtX2J1ZmZlcnMpOworCisgIGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YTsKKyAgZmFpbF91bmxlc3MgKEdTVF9CVUZGRVJfRFRTIChidWZmZXIpICE9IChudW1fYnVmZmVycyAqIHRzbykpOworICBmYWlsX3VubGVzcyAoR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcikgIT0gKG51bV9idWZmZXJzICogdHNvKSk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2ppdHRlcmJ1ZmZlciAoaml0dGVyYnVmZmVyKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgR3N0Q2FwcyAqCityZXF1ZXN0X3B0X21hcCAoR3N0RWxlbWVudCAqIGppdHRlcmJ1ZmZlciwgZ3VpbnQgcHQpCit7CisgIGZhaWxfdW5sZXNzIChwdCA9PSAwKTsKKworICByZXR1cm4gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKFJUUF9DQVBTX1NUUklORyk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2NsZWFyX3B0X21hcCkKK3sKKyAgR3N0RWxlbWVudCAqaml0dGVyYnVmZmVyOworICBjb25zdCBndWludCBudW1fYnVmZmVycyA9IDEwOworICBnaW50IGk7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBHTGlzdCAqbm9kZTsKKworICBqaXR0ZXJidWZmZXIgPSBzZXR1cF9qaXR0ZXJidWZmZXIgKG51bV9idWZmZXJzKTsKKyAgZmFpbF91bmxlc3MgKHN0YXJ0X2ppdHRlcmJ1ZmZlciAoaml0dGVyYnVmZmVyKQorICAgICAgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLCAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19zaWduYWxfY29ubmVjdCAoaml0dGVyYnVmZmVyLCAicmVxdWVzdC1wdC1tYXAiLCAoR0NhbGxiYWNrKQorICAgICAgcmVxdWVzdF9wdF9tYXAsIE5VTEwpOworCisgIC8qIHB1c2ggYnVmZmVyczogMCwxLDIsICovCisgIGZvciAobm9kZSA9IGluYnVmZmVycywgaSA9IDA7IG5vZGUgJiYgaSA8IDM7IG5vZGUgPSBnX2xpc3RfbmV4dCAobm9kZSksIGkrKykgeworICAgIGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgbm9kZS0+ZGF0YTsKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIH0KKworICBnX3VzbGVlcCAoNDAwICogMTAwMCk7CisKKyAgZ19zaWduYWxfZW1pdF9ieV9uYW1lIChqaXR0ZXJidWZmZXIsICJjbGVhci1wdC1tYXAiLCBOVUxMKTsKKworICBmb3IgKDsgbm9kZSAmJiBpIDwgMTA7IG5vZGUgPSBnX2xpc3RfbmV4dCAobm9kZSksIGkrKykgeworICAgIGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgbm9kZS0+ZGF0YTsKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIH0KKworICAvKiBjaGVjayB0aGUgYnVmZmVyIGxpc3QgKi8KKyAgY2hlY2tfaml0dGVyYnVmZmVyX3Jlc3VsdHMgKGppdHRlcmJ1ZmZlciwgbnVtX2J1ZmZlcnMpOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9qaXR0ZXJidWZmZXIgKGppdHRlcmJ1ZmZlcik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworI2RlZmluZSBURVNUX0JVRl9DTE9DS19SQVRFIDgwMDAKKyNkZWZpbmUgVEVTVF9CVUZfUFQgMAorI2RlZmluZSBURVNUX0JVRl9TU1JDIDB4MDFCQURCQUQKKyNkZWZpbmUgVEVTVF9CVUZfTVMgIDIwCisjZGVmaW5lIFRFU1RfQlVGX0RVUkFUSU9OIChURVNUX0JVRl9NUyAqIEdTVF9NU0VDT05EKQorI2RlZmluZSBURVNUX0JVRl9TSVpFICg2NDAwMCAqIFRFU1RfQlVGX01TIC8gMTAwMCkKKyNkZWZpbmUgVEVTVF9SVFBfVFNfRFVSQVRJT04gKFRFU1RfQlVGX0NMT0NLX1JBVEUgKiBURVNUX0JVRl9NUyAvIDEwMDApCisKK3N0YXRpYyBHc3RDYXBzICoKK2dlbmVyYXRlX2NhcHMgKHZvaWQpCit7CisgIHJldHVybiBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXBwbGljYXRpb24veC1ydHAiLAorICAgICAgIm1lZGlhIiwgR19UWVBFX1NUUklORywgImF1ZGlvIiwKKyAgICAgICJjbG9jay1yYXRlIiwgR19UWVBFX0lOVCwgVEVTVF9CVUZfQ0xPQ0tfUkFURSwKKyAgICAgICJlbmNvZGluZy1uYW1lIiwgR19UWVBFX1NUUklORywgIlRFU1QiLAorICAgICAgInBheWxvYWQiLCBHX1RZUEVfSU5ULCBURVNUX0JVRl9QVCwKKyAgICAgICJzc3JjIiwgR19UWVBFX1VJTlQsIFRFU1RfQlVGX1NTUkMsIE5VTEwpOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKEdzdENsb2NrVGltZSBkdHMsIGd1aW50IHNlcV9udW0sIGd1aW50MzIgcnRwX3RzKQoreworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgZ3VpbnQ4ICpwYXlsb2FkOworICBndWludCBpOworICBHc3RSVFBCdWZmZXIgcnRwID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKworICBidWYgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKFRFU1RfQlVGX1NJWkUsIDAsIDApOworICBHU1RfQlVGRkVSX0RUUyAoYnVmKSA9IGR0czsKKworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKGJ1ZiwgR1NUX01BUF9SRUFEV1JJVEUsICZydHApOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfcGF5bG9hZF90eXBlICgmcnRwLCBURVNUX0JVRl9QVCk7CisgIGdzdF9ydHBfYnVmZmVyX3NldF9zZXEgKCZydHAsIHNlcV9udW0pOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfdGltZXN0YW1wICgmcnRwLCBydHBfdHMpOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfc3NyYyAoJnJ0cCwgVEVTVF9CVUZfU1NSQyk7CisKKyAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKTsKKyAgZm9yIChpID0gMDsgaSA8IFRFU1RfQlVGX1NJWkU7IGkrKykKKyAgICBwYXlsb2FkW2ldID0gMHhmZjsKKworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnZW5lcmF0ZV90ZXN0X2J1ZmZlciAoZ3VpbnQgc2VxX251bSkKK3sKKyAgcmV0dXJuIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKHNlcV9udW0gKiBURVNUX0JVRl9EVVJBVElPTiwKKyAgICAgIHNlcV9udW0sIHNlcV9udW0gKiBURVNUX1JUUF9UU19EVVJBVElPTik7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ2VuZXJhdGVfdGVzdF9idWZmZXJfcnR4IChHc3RDbG9ja1RpbWUgZHRzLCBndWludCBzZXFfbnVtKQoreworICBHc3RCdWZmZXIgKmJ1ZmZlciA9IGdlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKGR0cywgc2VxX251bSwKKyAgICAgIHNlcV9udW0gKiBURVNUX1JUUF9UU19EVVJBVElPTik7CisgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZmZlciwgR1NUX1JUUF9CVUZGRVJfRkxBR19SRVRSQU5TTUlTU0lPTik7CisgIHJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyB2b2lkCitwdXNoX3Rlc3RfYnVmZmVyIChHc3RIYXJuZXNzICogaCwgZ3VpbnQgc2VxX251bSkKK3sKKyAgZ3N0X2hhcm5lc3Nfc2V0X3RpbWUgKGgsIHNlcV9udW0gKiBURVNUX0JVRl9EVVJBVElPTik7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLCBnc3RfaGFybmVzc19wdXNoIChoLAorICAgICAgICAgIGdlbmVyYXRlX3Rlc3RfYnVmZmVyIChzZXFfbnVtKSkpOworfQorCitzdGF0aWMgZ2ludAorZ2V0X3J0cF9zZXFfbnVtIChHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFJUUEJ1ZmZlciBydHAgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworICBnaW50IHNlcTsKKyAgZ3N0X3J0cF9idWZmZXJfbWFwIChidWYsIEdTVF9NQVBfUkVBRCwgJnJ0cCk7CisgIHNlcSA9IGdzdF9ydHBfYnVmZmVyX2dldF9zZXEgKCZydHApOworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisgIHJldHVybiBzZXE7Cit9CisKKyNkZWZpbmUgdmVyaWZ5X2xvc3RfZXZlbnQoaCwgZXhwX3NlcSwgZXhwX3RzLCBleHBfZHVyKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdfU1RNVF9TVEFSVCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdzdEV2ZW50ICpfZXZlbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKl9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgR1ZhbHVlICpfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGd1aW50IF9zZXE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHc3RDbG9ja1RpbWUgX3RzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR3N0Q2xvY2tUaW1lIF9kdXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9ldmVudCA9IGdzdF9oYXJuZXNzX3B1bGxfZXZlbnQgKGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmYWlsX3VubGVzcyAoX2V2ZW50ICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3MgPSBnc3RfZXZlbnRfZ2V0X3N0cnVjdHVyZSAoX2V2ZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZhaWxfdW5sZXNzIChfcyAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAoX3MsICJzZXFudW0iLCAmX3NlcSkpOyAgICAgICAgICAgICAgICBcCisgICAgX3ZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKF9zLCAidGltZXN0YW1wIik7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZhaWxfdW5sZXNzIChfdmFsdWUgJiYgR19WQUxVRV9IT0xEU19VSU5UNjQgKF92YWx1ZSkpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfdHMgPSBnX3ZhbHVlX2dldF91aW50NjQgKF92YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3ZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKF9zLCAiZHVyYXRpb24iKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZhaWxfdW5sZXNzIChfdmFsdWUgJiYgR19WQUxVRV9IT0xEU19VSU5UNjQgKF92YWx1ZSkpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfZHVyID0gZ192YWx1ZV9nZXRfdWludDY0IChfdmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoKGd1aW50MTYpKGV4cF9zZXEpLCBfc2VxKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKGV4cF90cywgX3RzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChleHBfZHVyLCBfZHVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ3N0X2V2ZW50X3VucmVmIChfZXZlbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IEdfU1RNVF9FTkQKKworCisjZGVmaW5lIHZlcmlmeV9ydHhfZXZlbnQoaCwgZXhwX3NlcSwgZXhwX3RzLCBleHBfZGVsYXksIGV4cF9zcGFjaW5nKSAgICAgICAgICAgXAorICBHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHc3RFdmVudCAqX2V2ZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgR3N0U3RydWN0dXJlICpfczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IEdWYWx1ZSAqX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBndWludCBfc2VxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR3N0Q2xvY2tUaW1lIF90czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGd1aW50IF9kZWxheTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHc3RDbG9ja1RpbWUgX3NwYWNpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX2V2ZW50ID0gZ3N0X2hhcm5lc3NfcHVsbF91cHN0cmVhbV9ldmVudCAoaCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZhaWxfdW5sZXNzIChfZXZlbnQgIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfcyA9IGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChfZXZlbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmFpbF91bmxlc3MgKF9zICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZhaWxfdW5sZXNzIChnc3Rfc3RydWN0dXJlX2dldF91aW50IChfcywgInNlcW51bSIsICZfc2VxKSk7ICAgICAgICAgICAgICAgIFwKKyAgICBfdmFsdWUgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoX3MsICJydW5uaW5nLXRpbWUiKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmFpbF91bmxlc3MgKF92YWx1ZSAmJiBHX1ZBTFVFX0hPTERTX1VJTlQ2NCAoX3ZhbHVlKSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIF90cyA9IGdfdmFsdWVfZ2V0X3VpbnQ2NCAoX3ZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAoX3MsICJkZWxheSIsICZfZGVsYXkpKTsgICAgICAgICAgICAgICBcCisgICAgX3ZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKF9zLCAicGFja2V0LXNwYWNpbmciKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGZhaWxfdW5sZXNzIChfdmFsdWUgJiYgR19WQUxVRV9IT0xEU19VSU5UNjQgKF92YWx1ZSkpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfc3BhY2luZyA9IGdfdmFsdWVfZ2V0X3VpbnQ2NCAoX3ZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoKGd1aW50MTYpKGV4cF9zZXEpLCBfc2VxKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKGV4cF90cywgX3RzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChleHBfZGVsYXksIF9kZWxheSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoZXhwX3NwYWNpbmcsIF9zcGFjaW5nKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdzdF9ldmVudF91bnJlZiAoX2V2ZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBHX1NUTVRfRU5ECisKK3N0YXRpYyBnYm9vbGVhbgordmVyaWZ5X2piX3N0YXRzIChHc3RFbGVtZW50ICogamIsIEdzdFN0cnVjdHVyZSAqIGV4cGVjdGVkKQoreworICBnYm9vbGVhbiByZXQ7CisgIEdzdFN0cnVjdHVyZSAqYWN0dWFsOworICBnX29iamVjdF9nZXQgKGpiLCAic3RhdHMiLCAmYWN0dWFsLCBOVUxMKTsKKworICByZXQgPSBnc3Rfc3RydWN0dXJlX2lzX3N1YnNldCAoYWN0dWFsLCBleHBlY3RlZCk7CisKKyAgaWYgKCFyZXQpIHsKKyAgICBnY2hhciAqZV9zdHIgPSBnc3Rfc3RydWN0dXJlX3RvX3N0cmluZyAoZXhwZWN0ZWQpOworICAgIGdjaGFyICphX3N0ciA9IGdzdF9zdHJ1Y3R1cmVfdG9fc3RyaW5nIChhY3R1YWwpOworICAgIGZhaWxfdW5sZXNzIChyZXQsICIlcyBpcyBub3QgYSBzdWJzZXQgb2YgJXMiLCBlX3N0ciwgYV9zdHIpOworICAgIGdfZnJlZSAoZV9zdHIpOworICAgIGdfZnJlZSAoYV9zdHIpOworICB9CisKKyAgZ3N0X3N0cnVjdHVyZV9mcmVlIChleHBlY3RlZCk7CisgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoYWN0dWFsKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ3VpbnQKK2NvbnN0cnVjdF9kZXRlcm1pbmlzdGljX2luaXRpYWxfc3RhdGUgKEdzdEhhcm5lc3MgKiBoLCBnaW50IGxhdGVuY3lfbXMpCit7CisgIGd1aW50IG5leHRfc2VxbnVtID0gbGF0ZW5jeV9tcyAvIFRFU1RfQlVGX01TICsgMTsKKyAgZ3VpbnQgc2VxbnVtOworICBnaW50IGk7CisKKyAgZ19hc3NlcnQgKGxhdGVuY3lfbXMgJSBURVNUX0JVRl9NUyA9PSAwKTsKKworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHMgKGgsIGdlbmVyYXRlX2NhcHMgKCkpOworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJsYXRlbmN5IiwgbGF0ZW5jeV9tcywgTlVMTCk7CisKKyAgLyogV2hlbiB0aGUgZmlyc3QgcGFja2V0IGFycml2ZXMgaW4gdGhlIGppdHRlcmJ1ZmZlciwgaXQgd2lsbCBjcmVhdGUgYQorICAgKiB0aW1lb3V0IGZvciB0aGlzIHBhY2tldCBlcXVhbCB0byB0aGUgbGF0ZW5jeSBvZiB0aGUgaml0dGVyYnVmZmVyLgorICAgKiBUaGlzIGlzIGtub3duIGFzIERFQURMSU5FIGludGVybmFsbHksIGFuZCBpcyBtZWFudCB0byBhbGxvdyB0aGUgc3RyZWFtCisgICAqIHRvIGJ1ZmZlciBhIGJpdCBiZWZvcmUgc3RhcnRpbmcgdG8gcHVzaCBpdCBvdXQsIHRvIGdldCBzb21lIGlkZWFzIGFib3V0CisgICAqIHRoZSBuYXR1cmUgb2YgdGhlIHN0cmVhbS4gKHBhY2tldHNwYWNpbmcsIGppdHRlciBldGMuKQorICAgKgorICAgKiBXaGVuIHdyaXRpbmcgdGVzdHMgdXNpbmcgdGhlIHRlc3QtY2xvY2ssIGl0IGl0IGhlbmNlIGltcG9ydGFudCB0byBrbm93CisgICAqIHRoYXQgYnkgc2ltcGx5IGFkdmFuY2luZyB0aGUgY2xvY2sgdG8gdGhpcyB0aW1lb3V0LCB5b3UgYXJlIGJhc2ljYWxseQorICAgKiBkZXNjcmliaW5nIGEgc3RyZWFtIHRoYXQgaGFkIG9uZSBpbml0aWFsIHBhY2tldCwgYW5kIHRoZW4gbm90aGluZyBhdCBhbGwKKyAgICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgbGF0ZW5jeSAoMTAwbXMgaW4gdGhpcyB0ZXN0KSwgd2hpY2ggaXMgbm90IGEgdmVyeQorICAgKiB1c3VhbCBzY2VuYXJpby4KKyAgICoKKyAgICogSW5zdGVhZCwgYSBwYXR0ZXJuIHVzZWQgdGhyb3VnaG91dCB0aGlzIHRlc3Qtc3VpdGUsIGlzIHRvIGtlZXAgdGhlIGJ1ZmZlcnMKKyAgICogYXJyaXZpbmcgYXQgdGhlaXIgb3B0aW1hbCB0aW1lLCB1bnRpbCB0aGUgREVBRExJTkUgaXMgcmVhY2hlZCwgYW5kIHRoYXQKKyAgICogdGhlbiBiZWNvbWVzIHRoZSAic3RhcnRpbmctcG9pbnQiIGZvciB0aGUgdGVzdCwgYmVjYXVzZSBhdCB0aGlzIHRpbWUKKyAgICogdGhlcmUgc2hvdWxkIG5vdyBiZSBubyB3YWl0aW5nIHRpbWVycyAodW5sZXNzIHVzaW5nIHJ0eCkgYW5kIHdlIGhhdmUKKyAgICogYSAiY2xlYW4iIHN0YXRlIHRvIGNyYWZ0IHRoZSB0ZXN0IGZyb20uCisgICAqLworCisgIC8qIFBhY2tldCAwIGFycml2ZXMgYXQgdGltZSAwbXMsIFBhY2tldCA1IGFycml2ZXMgYXQgdGltZSAxMDBtcyAqLworICBmb3IgKHNlcW51bSA9IDA7IHNlcW51bSA8IG5leHRfc2VxbnVtOyBzZXFudW0rKykgeworICAgIHB1c2hfdGVzdF9idWZmZXIgKGgsIHNlcW51bSk7CisgICAgZ3N0X2hhcm5lc3Nfd2FpdF9mb3JfY2xvY2tfaWRfd2FpdHMgKGgsIDEsIDYwKTsKKyAgfQorCisgIC8qIFdlIHJlbGVhc2UgdGhlIERFQURMSU5FIHRpbWVyIGZvciBwYWNrZXQgMCwgdmVyaWZ5IHRoZSB0aW1lIGlzIGluZGVlZAorICAgKiBAbGF0ZW5jeV9tcyAoMTAwbXMpIGFuZCBwdWxsIG91dCBhbGwgdGhlIGJ1ZmZlcnMgdGhhdCBoYXZlIGJlZW4gcmVsZWFzZWQsCisgICAqIGFuZCB2ZXJpZnkgdGhlaXIgUFRTIGFuZCBzZXF1ZW5jZSBudW1iZXJzLgorICAgKi8KKyAgZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50NjQgKGxhdGVuY3lfbXMgKiBHU1RfTVNFQ09ORCwKKyAgICAgIGdzdF9jbG9ja19nZXRfdGltZSAoR1NUX0VMRU1FTlRfQ0xPQ0sgKGgtPmVsZW1lbnQpKSk7CisgIGZvciAoc2VxbnVtID0gMDsgc2VxbnVtIDwgbmV4dF9zZXFudW07IHNlcW51bSsrKSB7CisgICAgR3N0QnVmZmVyICpidWYgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChzZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiwKKyAgICAgICAgR1NUX0JVRkZFUl9QVFMgKGJ1ZikpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHNlcW51bSwgZ2V0X3J0cF9zZXFfbnVtIChidWYpKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICB9CisKKyAgLyogZHJvcCBHc3RFdmVudFN0cmVhbVN0YXJ0ICYgR3N0RXZlbnRDYXBzICYgR3N0RXZlbnRTZWdtZW50ICovCisgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgZ3N0X2V2ZW50X3VucmVmIChnc3RfaGFybmVzc19wdWxsX2V2ZW50IChoKSk7CisKKyAgLyogZHJvcCByZWNvbmZpZ3VyZSBldmVudCAqLworICBnc3RfZXZlbnRfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGxfdXBzdHJlYW1fZXZlbnQgKGgpKTsKKworICAvKiBWZXJpZnkgdGhhdCBhdCB0aGlzIHBvaW50IG91ciBxdWV1ZXMgYXJlIGVtcHR5ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDAsIGdzdF9oYXJuZXNzX2J1ZmZlcnNfaW5fcXVldWUgKGgpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMCwgZ3N0X2hhcm5lc3NfZXZlbnRzX2luX3F1ZXVlIChoKSk7CisKKyAgcmV0dXJuIG5leHRfc2VxbnVtOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9sb3N0X2V2ZW50KQoreworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwaml0dGVyYnVmZmVyIik7CisgIEdzdEJ1ZmZlciAqYnVmOworICBnaW50IGxhdGVuY3lfbXMgPSAxMDA7CisgIGd1aW50IG5leHRfc2VxbnVtOworICBndWludCBtaXNzaW5nX3NlcW51bTsKKworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkby1sb3N0IiwgVFJVRSwgTlVMTCk7CisgIG5leHRfc2VxbnVtID0gY29uc3RydWN0X2RldGVybWluaXN0aWNfaW5pdGlhbF9zdGF0ZSAoaCwgbGF0ZW5jeV9tcyk7CisKKyAgLyogV2Ugd2lsbCBub3cgY3JlYXRlIGEgZ2FwIGluIHRoZSBzdHJlYW0sIGJ5IHNraXBwaW5nIG9uZSBzZXF1ZW5jZS1udW1iZXIsCisgICAqIGFuZCBwdXNoIHRoZSBmb2xsb3dpbmcgcGFja2V0LgorICAgKi8KKyAgbWlzc2luZ19zZXFudW0gPSBuZXh0X3NlcW51bTsKKyAgbmV4dF9zZXFudW0gKz0gMTsKKyAgcHVzaF90ZXN0X2J1ZmZlciAoaCwgbmV4dF9zZXFudW0pOworCisgIC8qIFRoaXMgcGFja2V0IChAbmV4dF9zZXFudW0pIHdpbGwgbm93IGJlIGhlbGQgYmFjaywgYXdhaXRpbmcgdGhlIG1pc3Npbmcgb25lLAorICAgKiB2ZXJpZnkgdGhhdCB0aGlzIGlzIHRoZSBjYXNlOgorICAgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMCwgZ3N0X2hhcm5lc3NfYnVmZmVyc19pbl9xdWV1ZSAoaCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgwLCBnc3RfaGFybmVzc19ldmVudHNfaW5fcXVldWUgKGgpKTsKKworICAvKiBUaGUgbG9zdC10aW1lb3V0IGZvciB0aGUgbWlzc2luZyBwYWNrZXQgd2lsbCBub3cgYmUgaXRzIHB0cyArIGxhdGVuY3ksIHNvCisgICAqIG5vdyB3ZSB3aWxsIHNpbXBseSBjcmFuayB0aGUgY2xvY2sgdG8gYWR2YW5jZSB0byB0aGlzIHBvaW50IGluIHRpbWUsIGFuZAorICAgKiBjaGVjayB0aGF0IHdlIGdldCBhIGxvc3QtZXZlbnQsIGFzIHdlbGwgYXMgdGhlIGxhc3QgcGFja2V0IHdlIHB1c2hlZCBpbi4KKyAgICovCisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKyAgdmVyaWZ5X2xvc3RfZXZlbnQgKGgsIG1pc3Npbmdfc2VxbnVtLAorICAgICAgbWlzc2luZ19zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiwgVEVTVF9CVUZfRFVSQVRJT04pOworCisgIGJ1ZiA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChuZXh0X3NlcW51bSAqIFRFU1RfQlVGX0RVUkFUSU9OLAorICAgICAgR1NUX0JVRkZFUl9QVFMgKGJ1ZikpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChuZXh0X3NlcW51bSwgZ2V0X3J0cF9zZXFfbnVtIChidWYpKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICBmYWlsX3VubGVzcyAodmVyaWZ5X2piX3N0YXRzIChoLT5lbGVtZW50LAorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1ydHAtaml0dGVyYnVmZmVyLXN0YXRzIiwKKyAgICAgICAgICAgICAgIm51bS1wdXNoZWQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgbmV4dF9zZXFudW0sCisgICAgICAgICAgICAgICJudW0tbG9zdCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAxLCBOVUxMKSkpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9vbmx5X29uZV9sb3N0X2V2ZW50X29uX2xhcmdlX2dhcHMpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBqaXR0ZXJidWZmZXIiKTsKKyAgR3N0VGVzdENsb2NrICp0ZXN0Y2xvY2s7CisgIEdzdEJ1ZmZlciAqb3V0X2J1ZjsKKyAgZ3VpbnQgbmV4dF9zZXFudW07CisgIGdpbnQgbGF0ZW5jeV9tcyA9IDIwMDsKKyAgZ2ludCBudW1fbG9zdF9ldmVudHMgPSBsYXRlbmN5X21zIC8gVEVTVF9CVUZfTVM7CisgIGdpbnQgaTsKKworICB0ZXN0Y2xvY2sgPSBnc3RfaGFybmVzc19nZXRfdGVzdGNsb2NrIChoKTsKKyAgLyogTmVlZCB0byBzZXQgbWF4LW1pc29yZGVyLXRpbWUgYW5kIG1heC1kcm9wb3V0LXRpbWUgdG8gMCBzbyB0aGUKKyAgICogaml0dGVyYnVmZmVyIGRvZXMgbm90IGJhc2UgdGhlbSBvbiBwYWNrZXQgcmF0ZSBjYWxjdWxhdGlvbnMuCisgICAqIElmIGl0IGRvZXMsIG91dCBnYXAgaXMgYmlnIGVub3VnaCB0byBiZSBjb25zaWRlcmVkIGEgbmV3IHN0cmVhbSBhbmQKKyAgICogd2Ugd2FpdCBmb3IgYSBmZXcgY29uc2VjdXRpdmUgcGFja2V0cyBqdXN0IHRvIGJlIHN1cmUKKyAgICovCisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgImRvLWxvc3QiLCBUUlVFLAorICAgICAgIm1heC1taXNvcmRlci10aW1lIiwgMCwgIm1heC1kcm9wb3V0LXRpbWUiLCAwLCBOVUxMKTsKKyAgbmV4dF9zZXFudW0gPSBjb25zdHJ1Y3RfZGV0ZXJtaW5pc3RpY19pbml0aWFsX3N0YXRlIChoLCBsYXRlbmN5X21zKTsKKworICAvKiBtb3ZlIHRpbWUgYWhlYWQgdG8ganVzdCBiZWZvcmUgMTAgc2Vjb25kcyAqLworICBnc3RfaGFybmVzc19zZXRfdGltZSAoaCwgMTAgKiBHU1RfU0VDT05EIC0gMSk7CisKKyAgLyogY2hlY2sgdGhhdCB3ZSBoYXZlIG5vIHBlbmRpbmcgd2FpdHMgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMCwgZ3N0X3Rlc3RfY2xvY2tfcGVla19pZF9jb3VudCAodGVzdGNsb2NrKSk7CisKKyAgLyogYSBidWZmZXIgbm93IGFycml2ZXMgcGVyZmVjdGx5IG9uIHRpbWUgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICBnc3RfaGFybmVzc19wdXNoIChoLCBnZW5lcmF0ZV90ZXN0X2J1ZmZlciAoNTAwKSkpOworCisgIC8qIHJlbGVhc2UgdGhlIHdhaXQsIGFkdmFuY2luZyB0aGUgY2xvY2sgdG8gMTAgc2VjICovCisgIGZhaWxfdW5sZXNzIChnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCkpOworCisgIC8qIHdlIHNob3VsZCBub3cgcmVjZWl2ZSBhIHBhY2tldC1sb3N0LWV2ZW50IGZvciBidWZmZXJzIDExIHRocm91Z2ggNDg5IC4uLiAqLworICB2ZXJpZnlfbG9zdF9ldmVudCAoaCwgbmV4dF9zZXFudW0sCisgICAgICBuZXh0X3NlcW51bSAqIFRFU1RfQlVGX0RVUkFUSU9OLCBURVNUX0JVRl9EVVJBVElPTiAqICg0OTAgLSBuZXh0X3NlcW51bSkpOworCisgIC8qIC4uLiBhcyB3ZWxsIGFzIDQ5MCAoc2luY2UgYXQgMTAgc2VjIDQ5MCBpcyB0b28gbGF0ZSkgKi8KKyAgdmVyaWZ5X2xvc3RfZXZlbnQgKGgsIDQ5MCwgNDkwICogVEVTVF9CVUZfRFVSQVRJT04sIFRFU1RfQlVGX0RVUkFUSU9OKTsKKworICAvKiB3ZSBnZXQgYXMgbWFueSBsb3N0IGV2ZW50cyBhcyB0aGUgdGhlIG51bWJlciBvZiAqCisgICAqIGJ1ZmZlcnMgdGhlIGppdHRlcmJ1ZmZlciBpcyBhYmxlIHRvIHdhaXQgZm9yICovCisgIGZvciAoaSA9IDE7IGkgPCBudW1fbG9zdF9ldmVudHM7IGkrKykgeworICAgIGZhaWxfdW5sZXNzIChnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCkpOworICAgIHZlcmlmeV9sb3N0X2V2ZW50IChoLCA0OTAgKyBpLCAoNDkwICsgaSkgKiBURVNUX0JVRl9EVVJBVElPTiwKKyAgICAgICAgVEVTVF9CVUZfRFVSQVRJT04pOworICB9CisKKyAgLyogYW5kIHRoZW4gdGhlIGJ1ZmZlciBpcyByZWxlYXNlZCAqLworICBvdXRfYnVmID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGZhaWxfdW5sZXNzIChHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChvdXRfYnVmLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICg1MDAsIGdldF9ydHBfc2VxX251bSAob3V0X2J1ZikpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0ICgxMCAqIEdTVF9TRUNPTkQsIEdTVF9CVUZGRVJfRFRTIChvdXRfYnVmKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKDEwICogR1NUX1NFQ09ORCwgR1NUX0JVRkZFUl9QVFMgKG91dF9idWYpKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0X2J1Zik7CisKKyAgZmFpbF91bmxlc3MgKHZlcmlmeV9qYl9zdGF0cyAoaC0+ZWxlbWVudCwKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLWppdHRlcmJ1ZmZlci1zdGF0cyIsCisgICAgICAgICAgICAgICJudW0tbG9zdCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSA0ODksIE5VTEwpKSk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAodGVzdGNsb2NrKTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R3b19sb3N0X29uZV9hcnJpdmVzX2luX3RpbWUpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBqaXR0ZXJidWZmZXIiKTsKKyAgR3N0VGVzdENsb2NrICp0ZXN0Y2xvY2s7CisgIEdzdENsb2NrSUQgaWQ7CisgIEdzdEJ1ZmZlciAqYnVmOworICBnaW50IGxhdGVuY3lfbXMgPSAxMDA7CisgIGd1aW50IG5leHRfc2VxbnVtOworICBndWludCBmaXJzdF9taXNzaW5nOworICBndWludCBzZWNvbmRfbWlzc2luZzsKKyAgZ3VpbnQgY3VycmVudF9hcnJpdmVkOworCisgIHRlc3RjbG9jayA9IGdzdF9oYXJuZXNzX2dldF90ZXN0Y2xvY2sgKGgpOworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkby1sb3N0IiwgVFJVRSwgTlVMTCk7CisgIG5leHRfc2VxbnVtID0gY29uc3RydWN0X2RldGVybWluaXN0aWNfaW5pdGlhbF9zdGF0ZSAoaCwgbGF0ZW5jeV9tcyk7CisKKyAgLyogaG9wIG92ZXIgMiBwYWNrZXRzIGFuZCBtYWtlIGFub3RoZXIgb25lIChnYXAgb2YgMikgKi8KKyAgZmlyc3RfbWlzc2luZyA9IG5leHRfc2VxbnVtOworICBzZWNvbmRfbWlzc2luZyA9IG5leHRfc2VxbnVtICsgMTsKKyAgY3VycmVudF9hcnJpdmVkID0gbmV4dF9zZXFudW0gKyAyOworICBwdXNoX3Rlc3RfYnVmZmVyIChoLCBjdXJyZW50X2Fycml2ZWQpOworCisgIC8qIHZlcmlmeSB0aGF0IHRoZSBqaXR0ZXJidWZmZXIgbm93IHdhaXQgZm9yIHRoZSBsYXRlc3QgbW9tZW50IGl0IGNhbiBwdXNoIHRoZQorICAgKiBAZmlyc3RfbWlzc2luZyBwYWNrZXQgb3V0LgorICAgKi8KKyAgZ3N0X3Rlc3RfY2xvY2tfd2FpdF9mb3JfbmV4dF9wZW5kaW5nX2lkICh0ZXN0Y2xvY2ssICZpZCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKGZpcnN0X21pc3NpbmcgKiBURVNUX0JVRl9EVVJBVElPTiArCisgICAgICBsYXRlbmN5X21zICogR1NUX01TRUNPTkQsIGdzdF9jbG9ja19pZF9nZXRfdGltZSAoaWQpKTsKKyAgZ3N0X2Nsb2NrX2lkX3VucmVmIChpZCk7CisKKyAgLyogbGV0IHRoZSB0aW1lIGV4cGlyZS4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpKTsKKworICAvKiB3ZSBzaG91bGQgbm93IHJlY2VpdmUgYSBwYWNrZXQtbG9zdC1ldmVudCAqLworICB2ZXJpZnlfbG9zdF9ldmVudCAoaCwgZmlyc3RfbWlzc2luZywKKyAgICAgIGZpcnN0X21pc3NpbmcgKiBURVNUX0JVRl9EVVJBVElPTiwgVEVTVF9CVUZfRFVSQVRJT04pOworCisgIC8qIEBzZWNvbmRfbWlzc2luZyBub3cgYXJyaXZlcyBqdXN0IGluIHRpbWUgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICBnc3RfaGFybmVzc19wdXNoIChoLCBnZW5lcmF0ZV90ZXN0X2J1ZmZlciAoc2Vjb25kX21pc3NpbmcpKSk7CisKKyAgLyogdmVyaWZ5IHRoYXQgQHNlY29uZF9taXNzaW5nIG1hZGUgaXQgdGhyb3VnaCEgKi8KKyAgYnVmID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGZhaWxfdW5sZXNzIChHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHNlY29uZF9taXNzaW5nLCBnZXRfcnRwX3NlcV9udW0gKGJ1ZikpOworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgIC8qIGFuZCBzZWUgdGhhdCBAY3VycmVudF9hcnJpdmVkIG5vdyBhbHNvIGlzIHB1c2hlZCAqLworICBidWYgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgZmFpbF91bmxlc3MgKCFHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGN1cnJlbnRfYXJyaXZlZCwgZ2V0X3J0cF9zZXFfbnVtIChidWYpKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICBmYWlsX3VubGVzcyAodmVyaWZ5X2piX3N0YXRzIChoLT5lbGVtZW50LAorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1ydHAtaml0dGVyYnVmZmVyLXN0YXRzIiwKKyAgICAgICAgICAgICAgIm51bS1wdXNoZWQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgbmV4dF9zZXFudW0gKyAyLAorICAgICAgICAgICAgICAibnVtLWxvc3QiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMSwgTlVMTCkpKTsKKworICBnc3Rfb2JqZWN0X3VucmVmICh0ZXN0Y2xvY2spOworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfbGF0ZV9wYWNrZXRzX3N0aWxsX21ha2VzX2xvc3RfZXZlbnRzKQoreworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwaml0dGVyYnVmZmVyIik7CisgIEdzdEJ1ZmZlciAqb3V0X2J1ZjsKKyAgZ2ludCBsYXRlbmN5X21zID0gMTAwOworICBndWludCBuZXh0X3NlcW51bTsKKyAgZ3VpbnQgc2VxbnVtOworICBHc3RDbG9ja1RpbWUgbm93OworCisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgImRvLWxvc3QiLCBUUlVFLCBOVUxMKTsKKyAgbmV4dF9zZXFudW0gPSBjb25zdHJ1Y3RfZGV0ZXJtaW5pc3RpY19pbml0aWFsX3N0YXRlIChoLCBsYXRlbmN5X21zKTsKKworICAvKiBqdW1wIDEwIHNlY29uZHMgZm9yd2FyZCBpbiB0aW1lICovCisgIG5vdyA9IDEwICogR1NUX1NFQ09ORDsKKyAgZ3N0X2hhcm5lc3Nfc2V0X3RpbWUgKGgsIG5vdyk7CisKKyAgLyogcHVzaCBhIHBhY2tldCB3aXRoIGEgZ2FwIG9mIDIsIHRoYXQgbm93IGlzIHZlcnkgbGF0ZSAqLworICBzZXFudW0gPSBuZXh0X3NlcW51bSArIDI7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLCBnc3RfaGFybmVzc19wdXNoIChoLAorICAgICAgICAgIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKG5vdywKKyAgICAgICAgICAgICAgc2VxbnVtLCBzZXFudW0gKiBURVNUX1JUUF9UU19EVVJBVElPTikpKTsKKworICAvKiB3ZSBzaG91bGQgbm93IHJlY2VpdmUgcGFja2V0LWxvc3QtZXZlbnRzIGZvciB0aGUgZ2FwIAorICAgKiBGSVhNRTogVGhlIHRpbWVvdXQgYW5kIGR1cmF0aW9uIGhlcmUgYXJlIGEgYml0IGNyYXAuLi4KKyAgICovCisgIHZlcmlmeV9sb3N0X2V2ZW50IChoLCBuZXh0X3NlcW51bSwgMzQwMCAqIEdTVF9NU0VDT05ELCA2NTAwICogR1NUX01TRUNPTkQpOworICB2ZXJpZnlfbG9zdF9ldmVudCAoaCwgbmV4dF9zZXFudW0gKyAxLAorICAgICAgOTkwMCAqIEdTVF9NU0VDT05ELCAzMzAwICogR1NUX01TRUNPTkQpOworCisgIC8qIHZlcmlmeSB0aGF0IHBhY2tldCBAc2VxbnVtIG1hZGUgaXQgdGhyb3VnaCEgKi8KKyAgb3V0X2J1ZiA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBmYWlsX3VubGVzcyAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAob3V0X2J1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoc2VxbnVtLCBnZXRfcnRwX3NlcV9udW0gKG91dF9idWYpKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0X2J1Zik7CisKKyAgZmFpbF91bmxlc3MgKHZlcmlmeV9qYl9zdGF0cyAoaC0+ZWxlbWVudCwKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLWppdHRlcmJ1ZmZlci1zdGF0cyIsCisgICAgICAgICAgICAgICJudW0tcHVzaGVkIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIG5leHRfc2VxbnVtICsgMSwKKyAgICAgICAgICAgICAgIm51bS1sb3N0IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDIsIE5VTEwpKSk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfbnVtX2xhdGVfd2hlbl9jb25zaWRlcmVkX2xvc3RfYXJyaXZlcykKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGppdHRlcmJ1ZmZlciIpOworICBnYm9vbGVhbiBkb19sb3N0ID0gX19pX18gIT0gMDsKKyAgZ2ludCBsYXRlbmN5X21zID0gMTAwOworICBndWludCBuZXh0X3NlcW51bTsKKworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkby1sb3N0IiwgZG9fbG9zdCwgTlVMTCk7CisgIG5leHRfc2VxbnVtID0gY29uc3RydWN0X2RldGVybWluaXN0aWNfaW5pdGlhbF9zdGF0ZSAoaCwgbGF0ZW5jeV9tcyk7CisKKyAgLyogZ2FwIG9mIDEgKi8KKyAgcHVzaF90ZXN0X2J1ZmZlciAoaCwgbmV4dF9zZXFudW0gKyAxKTsKKworICAvKiBjcmFuayB0byB0cmlnZ2VyIGxvc3QtZXZlbnQgKi8KKyAgZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpOworCisgIGlmIChkb19sb3N0KSB7CisgICAgLyogd2Ugc2hvdWxkIG5vdyByZWNlaXZlIHBhY2tldC1sb3N0LWV2ZW50cyBmb3IgdGhlIG1pc3NpbmcgcGFja2V0ICovCisgICAgdmVyaWZ5X2xvc3RfZXZlbnQgKGgsIG5leHRfc2VxbnVtLAorICAgICAgICBuZXh0X3NlcW51bSAqIFRFU1RfQlVGX0RVUkFUSU9OLCBURVNUX0JVRl9EVVJBVElPTik7CisgIH0KKworICAvKiBwdWxsIG91dCB0aGUgcHVzaGVkIHBhY2tldCAqLworICBnc3RfYnVmZmVyX3VucmVmIChnc3RfaGFybmVzc19wdWxsIChoKSk7CisKKyAgLyogd2UgaGF2ZSBvbmUgbG9zdCBwYWNrZXQgaW4gdGhlIHN0YXRzICovCisgIGZhaWxfdW5sZXNzICh2ZXJpZnlfamJfc3RhdHMgKGgtPmVsZW1lbnQsCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1qaXR0ZXJidWZmZXItc3RhdHMiLAorICAgICAgICAgICAgICAibnVtLXB1c2hlZCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSBuZXh0X3NlcW51bSArIDEsCisgICAgICAgICAgICAgICJudW0tbG9zdCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAxLAorICAgICAgICAgICAgICAibnVtLWxhdGUiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMCwgTlVMTCkpKTsKKworICAvKiB0aGUgbWlzc2luZyBwYWNrZXQgbm93IGFycml2ZXMgKHRvbyBsYXRlKSAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywKKyAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyIChuZXh0X3NlcW51bSkpKTsKKworICAvKiBhbmQgdGhpcyBpbmNyZW1lbnRzIG51bS1sYXRlICovCisgIGZhaWxfdW5sZXNzICh2ZXJpZnlfamJfc3RhdHMgKGgtPmVsZW1lbnQsCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1qaXR0ZXJidWZmZXItc3RhdHMiLAorICAgICAgICAgICAgICAibnVtLXB1c2hlZCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSBuZXh0X3NlcW51bSArIDEsCisgICAgICAgICAgICAgICJudW0tbG9zdCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAxLAorICAgICAgICAgICAgICAibnVtLWxhdGUiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMSwgTlVMTCkpKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfbG9zdF9ldmVudF91c2VzX3B0cykKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGppdHRlcmJ1ZmZlciIpOworICBHc3RDbG9ja1RpbWUgbm93OworICBnaW50IGxhdGVuY3lfbXMgPSAxMDA7CisgIGd1aW50IG5leHRfc2VxbnVtOworICBndWludCBsb3N0X3NlcW51bTsKKworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkby1sb3N0IiwgVFJVRSwgTlVMTCk7CisgIG5leHRfc2VxbnVtID0gY29uc3RydWN0X2RldGVybWluaXN0aWNfaW5pdGlhbF9zdGF0ZSAoaCwgbGF0ZW5jeV9tcyk7CisKKyAgLyogaG9wIG92ZXIgMSBwYWNrZXRzIGFuZCBtYWtlIGFub3RoZXIgb25lIChnYXAgb2YgMSksIGJ1dCBkdWUgdG8KKyAgICAgbmV0d29yayBkZWxheXMsIHRoaXMgcGFja2V0cyBpcyBhbHNvIGdyb3NzbHkgbGF0ZSAqLworICBsb3N0X3NlcW51bSA9IG5leHRfc2VxbnVtOworICBuZXh0X3NlcW51bSArPSAxOworCisgIC8qIGFkdmFuY2UgdGhlIGNsb2NrIHRvIHRoZSBsYXRlc3QgdGltZSBwYWNrZXQgQG5leHRfc2VxbnVtIGNvdWxkIGFycml2ZSAqLworICBub3cgPSBuZXh0X3NlcW51bSAqIFRFU1RfQlVGX0RVUkFUSU9OICsgbGF0ZW5jeV9tcyAqIEdTVF9NU0VDT05EOworICBnc3RfaGFybmVzc19zZXRfdGltZSAoaCwgbm93KTsKKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgZ2VuZXJhdGVfdGVzdF9idWZmZXJfZnVsbCAobm93LCBuZXh0X3NlcW51bSwKKyAgICAgICAgICBuZXh0X3NlcW51bSAqIFRFU1RfUlRQX1RTX0RVUkFUSU9OKSk7CisKKyAgLyogd2Ugc2hvdWxkIG5vdyBoYXZlIHJlY2VpdmVkIGEgcGFja2V0LWxvc3QtZXZlbnQgZm9yIGJ1ZmZlciAzICovCisgIHZlcmlmeV9sb3N0X2V2ZW50IChoLCBsb3N0X3NlcW51bSwKKyAgICAgIGxvc3Rfc2VxbnVtICogVEVTVF9CVUZfRFVSQVRJT04sIFRFU1RfQlVGX0RVUkFUSU9OKTsKKworICAvKiBhbmQgcHVsbCBvdXQgcGFja2V0IDQgKi8KKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworCisgIGZhaWxfdW5sZXNzICh2ZXJpZnlfamJfc3RhdHMgKGgtPmVsZW1lbnQsCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1qaXR0ZXJidWZmZXItc3RhdHMiLAorICAgICAgICAgICAgICAibnVtLXB1c2hlZCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSBuZXh0X3NlcW51bSwKKyAgICAgICAgICAgICAgIm51bS1sb3N0IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDEsIE5VTEwpKSk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2xvc3RfZXZlbnRfd2l0aF9iYWNrd2FyZHNfcnRwdGltZSkKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGppdHRlcmJ1ZmZlciIpOworICBnaW50IGxhdGVuY3lfbXMgPSA0MDsKKworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkby1sb3N0IiwgVFJVRSwgTlVMTCk7CisgIGNvbnN0cnVjdF9kZXRlcm1pbmlzdGljX2luaXRpYWxfc3RhdGUgKGgsIGxhdGVuY3lfbXMpOworCisgIC8qCisgICAqIEZvciB2aWRlbyB1c2luZyBCLWZyYW1lcywgYW4gZXhwZWN0ZWQgc2VxdWVuY2UKKyAgICogY291bGQgYmUgbGlrZSB0aGlzOgorICAgKiAoSSA9IEktZnJhbWUsIFAgPSBQLWZyYW1lLCBCID0gQi1mcmFtZSkKKyAgICogICAgICAgICAgICAgICBfX18gICBfX18gICBfX18gICBfX18gICBfX18KKyAgICogICAgICAgICAgLi4uIHwgMyB8IHwgNCB8IHwgNSB8IHwgNiB8IHwgNyB8CisgICAqICAgICAgICAgICAgICAg4oCT4oCT4oCTICAg4oCT4oCT4oCTICAg4oCT4oCT4oCTICAg4oCT4oCT4oCTICAg4oCT4oCT4oCTCisgICAqIHJ0cHRpbWU6ICAgICAgIDMoSSkgIDUoUCkgIDUoUCkgIDQoQikgIDYoUCkKKyAgICogYXJyaXZhbChkdHMpOiAgMyAgICAgNSAgICAgNSAgICAgNSAgICAgNgorICAgKgorICAgKiBOb3RpY2UgaGVyZSB0aGF0IHBhY2tldCA2ICh0aGUgQiBmcmFtZSkgbWFrZQorICAgKiB0aGUgcnRwdGltZSBnbyBiYWNrd2FyZHMuCisgICAqCisgICAqIEJ1dCB3ZSBnZXQgdGhpczoKKyAgICogICAgICAgICAgICAgICBfX18gICBfX18gICBfIF8gICBfX18gICBfX18KKyAgICogICAgICAgICAgLi4uIHwgMyB8IHwgNCB8IHwgICB8IHwgNiB8IHwgNyB8CisgICAqICAgICAgICAgICAgICAg4oCT4oCT4oCTICAg4oCT4oCT4oCTICAgLSAtICAg4oCT4oCT4oCTICAg4oCT4oCT4oCTCisgICAqIHJ0cHRpbWU6ICAgICAgIDMoSSkgIDUoUCkgICAgICAgIDQoQikgIDYoUCkKKyAgICogYXJyaXZhbChkdHMpOiAgMyAgICAgNSAgICAgICAgICAgNSAgICAgNgorICAgKgorICAgKi8KKworICAvKiBzZXFudW0gMyAqLworICBwdXNoX3Rlc3RfYnVmZmVyIChoLCAzKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworCisgIC8qIHNlcW51bSA0LCBhcnJpdmluZyBhdCB0aW1lIDUgd2l0aCBydHB0aW1lIDUgKi8KKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwKKyAgICAgIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKDUgKiBURVNUX0JVRl9EVVJBVElPTiwKKyAgICAgICAgICA0LCA1ICogVEVTVF9SVFBfVFNfRFVSQVRJT04pKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworCisgIC8qIHNlcW51bSA2LCBhcnJpdmluZyBhdCB0aW1lIDUgd2l0aCBydHB0aW1lIDQsCisgICAgIG1ha2luZyBhIGdhcCBmb3IgbWlzc2luZyBzZXFudW0gNSAqLworICBnc3RfaGFybmVzc19wdXNoIChoLAorICAgICAgZ2VuZXJhdGVfdGVzdF9idWZmZXJfZnVsbCAoNSAqIFRFU1RfQlVGX0RVUkFUSU9OLAorICAgICAgICAgIDYsIDQgKiBURVNUX1JUUF9UU19EVVJBVElPTikpOworCisgIC8qIHNlcW51bSA3LCBhcnJpdmluZyBhdCB0aW1lIDYgd2l0aCBydHB0aW1lIDYgKi8KKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwKKyAgICAgIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKDYgKiBURVNUX0JVRl9EVVJBVElPTiwKKyAgICAgICAgICA3LCA2ICogVEVTVF9SVFBfVFNfRFVSQVRJT04pKTsKKworICAvKiB3ZSBzaG91bGQgbm93IGhhdmUgcmVjZWl2ZWQgYSBwYWNrZXQtbG9zdC1ldmVudCBmb3Igc2VxbnVtIDUsCisgICAgIHdpdGggdGltZSA1IGFuZCAwIGR1cmF0aW9uICovCisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKyAgdmVyaWZ5X2xvc3RfZXZlbnQgKGgsIDUsIDUgKiBURVNUX0JVRl9EVVJBVElPTiwgMCk7CisKKyAgLyogYW5kIHB1bGwgb3V0IDYgYW5kIDcgKi8KKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworICBnc3RfYnVmZmVyX3VucmVmIChnc3RfaGFybmVzc19wdWxsIChoKSk7CisKKyAgZmFpbF91bmxlc3MgKHZlcmlmeV9qYl9zdGF0cyAoaC0+ZWxlbWVudCwKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLWppdHRlcmJ1ZmZlci1zdGF0cyIsCisgICAgICAgICAgICAgICJudW0tcHVzaGVkIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDcsCisgICAgICAgICAgICAgICJudW0tbG9zdCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAxLCBOVUxMKSkpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9hbGxfcGFja2V0c19hcmVfdGltZXN0YW1wZWRfemVybykKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGppdHRlcmJ1ZmZlciIpOworICBHc3RCdWZmZXIgKm91dF9idWY7CisgIGdpbnQgamJfbGF0ZW5jeV9tcyA9IDEwMDsKKyAgZ2ludCBpLCBiOworCisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2FwcyAoaCwgZ2VuZXJhdGVfY2FwcyAoKSk7CisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgImRvLWxvc3QiLCBUUlVFLCAibGF0ZW5jeSIsIGpiX2xhdGVuY3lfbXMsIE5VTEwpOworCisgIC8qIGFkdmFuY2UgdGhlIGNsb2NrIHdpdGggMTAgc2Vjb25kcyAqLworICBnc3RfaGFybmVzc19zZXRfdGltZSAoaCwgMTAgKiBHU1RfU0VDT05EKTsKKworICAvKiBwdXNoIHRoZSBmaXJzdCBidWZmZXIgdGhyb3VnaCAqLworICBnc3RfYnVmZmVyX3VucmVmIChnc3RfaGFybmVzc19wdXNoX2FuZF9wdWxsIChoLCBnZW5lcmF0ZV90ZXN0X2J1ZmZlciAoMCkpKTsKKworICAvKiBwdXNoIHNvbWUgYnVmZmVycyBpbiwgYWxsIHRpbWVzdGFtcGVkIDAgKi8KKyAgZm9yIChiID0gMTsgYiA8IDM7IGIrKykgeworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLAorICAgICAgICBnc3RfaGFybmVzc19wdXNoIChoLAorICAgICAgICAgICAgZ2VuZXJhdGVfdGVzdF9idWZmZXJfZnVsbCAoMCAqIEdTVF9NU0VDT05ELCBiLCAwKSkpOworCisgICAgLyogY2hlY2sgZm9yIHRoZSBidWZmZXIgY29taW5nIG91dCB0aGF0IHdhcyBwdXNoZWQgaW4gKi8KKyAgICBvdXRfYnVmID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoMCwgR1NUX0JVRkZFUl9EVFMgKG91dF9idWYpKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0ICgwLCBHU1RfQlVGRkVSX1BUUyAob3V0X2J1ZikpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dF9idWYpOworICB9CisKKyAgLyogaG9wIG92ZXIgMiBwYWNrZXRzIGFuZCBtYWtlIGFub3RoZXIgb25lIChnYXAgb2YgMikgKi8KKyAgYiA9IDU7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLAorICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgZ2VuZXJhdGVfdGVzdF9idWZmZXJfZnVsbCAoMCAqIEdTVF9NU0VDT05ELCBiLCAwKSkpOworCisgIC8qIGRyb3AgR3N0RXZlbnRTdHJlYW1TdGFydCAmIEdzdEV2ZW50Q2FwcyAmIEdzdEV2ZW50U2VnbWVudCAqLworICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgIGdzdF9ldmVudF91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbF9ldmVudCAoaCkpOworCisgIC8qIHdlIHNob3VsZCBub3cgcmVjZWl2ZSBwYWNrZXQtbG9zdC1ldmVudHMgZm9yIGJ1ZmZlciAzIGFuZCA0ICovCisgIHZlcmlmeV9sb3N0X2V2ZW50IChoLCAzLCAwLCAwKTsKKyAgdmVyaWZ5X2xvc3RfZXZlbnQgKGgsIDQsIDAsIDApOworCisgIC8qIHZlcmlmeSB0aGF0IGJ1ZmZlciA1IG1hZGUgaXQgdGhyb3VnaCEgKi8KKyAgb3V0X2J1ZiA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBmYWlsX3VubGVzcyAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAob3V0X2J1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoNSwgZ2V0X3J0cF9zZXFfbnVtIChvdXRfYnVmKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKG91dF9idWYpOworCisgIGZhaWxfdW5sZXNzICh2ZXJpZnlfamJfc3RhdHMgKGgtPmVsZW1lbnQsCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1qaXR0ZXJidWZmZXItc3RhdHMiLAorICAgICAgICAgICAgICAibnVtLXB1c2hlZCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSA0LAorICAgICAgICAgICAgICAibnVtLWxvc3QiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMiwgTlVMTCkpKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcmVvcmRlcl9vZl9ub25fZXF1aWRpc3RhbnRfcGFja2V0cykKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGppdHRlcmJ1ZmZlciIpOworICBHc3RUZXN0Q2xvY2sgKnRlc3RjbG9jazsKKyAgZ2ludCBsYXRlbmN5X21zID0gNTsKKyAgR3N0Q2xvY2tJRCBwZW5kaW5nX2lkOworICBHc3RDbG9ja1RpbWUgdGltZTsKKyAgZ2ludCBzZXEsIGZyYW1lOworICBnaW50IG51bV9pbml0X2ZyYW1lcyA9IDE7CisgIGNvbnN0IEdzdENsb2NrVGltZSBmcmFtZV9kdXIgPSBURVNUX0JVRl9EVVJBVElPTjsKKyAgY29uc3QgZ3VpbnQzMiBmcmFtZV9ydHBfdHNfZHVyID0gVEVTVF9SVFBfVFNfRFVSQVRJT047CisKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzIChoLCBnZW5lcmF0ZV9jYXBzICgpKTsKKyAgdGVzdGNsb2NrID0gZ3N0X2hhcm5lc3NfZ2V0X3Rlc3RjbG9jayAoaCk7CisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgImRvLWxvc3QiLCBUUlVFLCAibGF0ZW5jeSIsIGxhdGVuY3lfbXMsIE5VTEwpOworCisgIGZvciAoZnJhbWUgPSAwLCBzZXEgPSAwOyBmcmFtZSA8IG51bV9pbml0X2ZyYW1lczsgZnJhbWUrKywgc2VxICs9IDIpIHsKKyAgICAvKiBQdXNoIGEgY291cGxlIG9mIHBhY2tldHMgd2l0aCBpZGVudGljYWwgdGltZXN0YW1wLCB0eXBpY2FsIGZvciBhIHZpZGVvCisgICAgICogc3RyZWFtIHdoZXJlIG9uZSBmcmFtZSBnZW5lcmF0ZXMgbXVsdGlwbGUgcGFja2V0cy4gKi8KKyAgICBnc3RfaGFybmVzc19zZXRfdGltZSAoaCwgZnJhbWUgKiBmcmFtZV9kdXIpOworICAgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKGZyYW1lICogZnJhbWVfZHVyLAorICAgICAgICAgICAgc2VxLCBmcmFtZSAqIGZyYW1lX3J0cF90c19kdXIpKTsKKyAgICBnc3RfaGFybmVzc19wdXNoIChoLCBnZW5lcmF0ZV90ZXN0X2J1ZmZlcl9mdWxsIChmcmFtZSAqIGZyYW1lX2R1ciwKKyAgICAgICAgICAgIHNlcSArIDEsIGZyYW1lICogZnJhbWVfcnRwX3RzX2R1cikpOworCisgICAgaWYgKGZyYW1lID09IDApCisgICAgICAvKiBkZWFkbGluZSBmb3IgYnVmZmVyIDAgZXhwaXJlcyAqLworICAgICAgZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpOworCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKyAgfQorCisgIC8qIEZpbmFsbHkgcHVzaCB0aGUgbGFzdCBmcmFtZSByZW9yZGVyZWQgKi8KKyAgZ3N0X2hhcm5lc3Nfc2V0X3RpbWUgKGgsIGZyYW1lICogZnJhbWVfZHVyKTsKKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgZ2VuZXJhdGVfdGVzdF9idWZmZXJfZnVsbCAoZnJhbWUgKiBmcmFtZV9kdXIsCisgICAgICAgICAgc2VxICsgMSwgZnJhbWUgKiBmcmFtZV9ydHBfdHNfZHVyKSk7CisKKyAgLyogQ2hlY2sgdGhlIHNjaGVkdWxlZCBsb3N0IHRpbWVyLiBUaGUgZXhwZWN0ZWQgYXJyaXZhbCBvZiB0aGlzIHBhY2tldAorICAgKiBzaG91bGQgYmUgYXNzdW1lZCB0byBiZSB0aGUgc2FtZSBhcyB0aGUgbGFzdCBwYWNrZXQgcmVjZWl2ZWQgc2luY2Ugd2UKKyAgICogZG9uJ3Qga25vdyB3ZXRoZXIgdGhlIG1pc3NpbmcgcGFja2V0IGJlbG9uZ2VkIHRvIHRoaXMgb3IgcHJldmlvdXMKKyAgICogZnJhbWUuICovCisgIGdzdF90ZXN0X2Nsb2NrX3dhaXRfZm9yX25leHRfcGVuZGluZ19pZCAodGVzdGNsb2NrLCAmcGVuZGluZ19pZCk7CisgIHRpbWUgPSBnc3RfY2xvY2tfaWRfZ2V0X3RpbWUgKHBlbmRpbmdfaWQpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50NjQgKHRpbWUsIGZyYW1lICogZnJhbWVfZHVyICsgbGF0ZW5jeV9tcyAqIEdTVF9NU0VDT05EKTsKKyAgZ3N0X2Nsb2NrX2lkX3VucmVmIChwZW5kaW5nX2lkKTsKKworICAvKiBBbmQgdGhlbiBtaXNzaW5nIHBhY2tldCBhcnJpdmVzIGp1c3QgaW4gdGltZSAqLworICBnc3RfaGFybmVzc19zZXRfdGltZSAoaCwgdGltZSAtIDEpOworICBnc3RfaGFybmVzc19wdXNoIChoLCBnZW5lcmF0ZV90ZXN0X2J1ZmZlcl9mdWxsICh0aW1lIC0gMSwgc2VxLAorICAgICAgICAgIGZyYW1lICogZnJhbWVfcnRwX3RzX2R1cikpOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHRlc3RjbG9jayk7CisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9sb3NzX2VxdWlkaXN0YW50X3NwYWNpbmdfd2l0aF9wYXJhbWV0ZXJfcGFja2V0cykKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGppdHRlcmJ1ZmZlciIpOworICBnaW50IGxhdGVuY3lfbXMgPSA1OworICBnaW50IHNlcSwgZnJhbWU7CisgIGdpbnQgbnVtX2luaXRfZnJhbWVzID0gMTA7CisgIGdpbnQgaTsKKworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHMgKGgsIGdlbmVyYXRlX2NhcHMgKCkpOworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkby1sb3N0IiwgVFJVRSwgImxhdGVuY3kiLCBsYXRlbmN5X21zLCBOVUxMKTsKKworICAvKiBkcm9wIHN0cmVhbS1zdGFydCwgY2Fwcywgc2VnbWVudCAqLworICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgIGdzdF9ldmVudF91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbF9ldmVudCAoaCkpOworCisgIGZvciAoZnJhbWUgPSAwLCBzZXEgPSAwOyBmcmFtZSA8IG51bV9pbml0X2ZyYW1lczsgZnJhbWUrKywgc2VxKyspIHsKKyAgICBnc3RfaGFybmVzc19zZXRfdGltZSAoaCwgZnJhbWUgKiBURVNUX0JVRl9EVVJBVElPTik7CisgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgZ2VuZXJhdGVfdGVzdF9idWZmZXJfZnVsbCAoZnJhbWUgKiBURVNUX0JVRl9EVVJBVElPTiwKKyAgICAgICAgICAgIHNlcSwgZnJhbWUgKiBURVNUX1JUUF9UU19EVVJBVElPTikpOworCisgICAgaWYgKGZyYW1lID09IDApCisgICAgICAvKiBkZWFkbGluZSBmb3IgYnVmZmVyIDAgZXhwaXJlcyAqLworICAgICAgZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpOworCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworICB9CisKKyAgLyogUHVzaCB0aHJlZSBwYWNrZXRzIHdpdGggc2FtZSBydHB0aW1lLCBzaW11bGF0aW5nIHBhcmFtZXRlciBwYWNrZXRzICsKKyAgICogZnJhbWUuIFRoaXMgc2hvdWxkIG5vdCBkaXNhYmxlIGVxdWlkaXN0YW50IG1vZGUgYXMgaXQgaXMgY29tbW9uIGZvcgorICAgKiBjZXJ0YWluIGF1ZGlvIGNvZGVjcy4gKi8KKyAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgIGdzdF9oYXJuZXNzX3NldF90aW1lIChoLCBmcmFtZSAqIFRFU1RfQlVGX0RVUkFUSU9OKTsKKyAgICBnc3RfaGFybmVzc19wdXNoIChoLCBnZW5lcmF0ZV90ZXN0X2J1ZmZlcl9mdWxsIChmcmFtZSAqIFRFU1RfQlVGX0RVUkFUSU9OLAorICAgICAgICAgICAgc2VxKyssIGZyYW1lICogVEVTVF9SVFBfVFNfRFVSQVRJT04pKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChnc3RfaGFybmVzc19wdWxsIChoKSk7CisgIH0KKyAgZnJhbWUrKzsKKworICAvKiBGaW5hbGx5IHB1c2ggdGhlIGxhc3QgcGFja2V0IGludHJvZHVjaW5nIGEgZ2FwICovCisgIGdzdF9oYXJuZXNzX3NldF90aW1lIChoLCBmcmFtZSAqIFRFU1RfQlVGX0RVUkFUSU9OKTsKKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgZ2VuZXJhdGVfdGVzdF9idWZmZXJfZnVsbCAoZnJhbWUgKiBURVNUX0JVRl9EVVJBVElPTiwKKyAgICAgICAgICBzZXEgKyAxLCBmcmFtZSAqIFRFU1RfUlRQX1RTX0RVUkFUSU9OKSk7CisKKyAgLyogQ2hlY2sgdGhhdCB0aGUgbG9zdCBldmVudCBoYXMgYmVlbiBnZW5lcmF0ZWQgYXNzdW1pbmcgZXF1aWRpc3RhbnQKKyAgICogc3BhY2luZy4gKi8KKyAgdmVyaWZ5X2xvc3RfZXZlbnQgKGgsIHNlcSwKKyAgICAgIGZyYW1lICogVEVTVF9CVUZfRFVSQVRJT04gLSBURVNUX0JVRl9EVVJBVElPTiAvIDIsIFRFU1RfQlVGX0RVUkFUSU9OIC8gMik7CisKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCisKK3N0YXRpYyB2b2lkCitnc3RfdGVzdF9jbG9ja19zZXRfdGltZV9hbmRfcHJvY2VzcyAoR3N0VGVzdENsb2NrICogdGVzdGNsb2NrLAorICAgIEdzdENsb2NrVGltZSB0aW1lKQoreworICBHc3RDbG9ja0lEIGlkLCB0aWQ7CisgIGdzdF90ZXN0X2Nsb2NrX3dhaXRfZm9yX25leHRfcGVuZGluZ19pZCAodGVzdGNsb2NrLCAmaWQpOworICBnc3RfdGVzdF9jbG9ja19zZXRfdGltZSAodGVzdGNsb2NrLCB0aW1lKTsKKyAgdGlkID0gZ3N0X3Rlc3RfY2xvY2tfcHJvY2Vzc19uZXh0X2Nsb2NrX2lkICh0ZXN0Y2xvY2spOworICBnX2Fzc2VydCAodGlkID09IGlkKTsKKyAgZ3N0X2Nsb2NrX2lkX3VucmVmICh0aWQpOworICBnc3RfY2xvY2tfaWRfdW5yZWYgKGlkKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnR4X2V4cGVjdGVkX25leHQpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBqaXR0ZXJidWZmZXIiKTsKKyAgZ2ludCBsYXRlbmN5X21zID0gMjAwOworICBndWludCBuZXh0X3NlcW51bTsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVvdXQ7CisgIGdpbnQgcnR4X2RlbGF5X21zOworICBjb25zdCBHc3RDbG9ja1RpbWUgcnR4X3JldHJ5X3RpbWVvdXRfbXMgPSA0MDsKKworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkby1sb3N0IiwgVFJVRSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgImRvLXJldHJhbnNtaXNzaW9uIiwgVFJVRSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgInJ0eC1yZXRyeS1wZXJpb2QiLCAxMjAsIE5VTEwpOworICBuZXh0X3NlcW51bSA9IGNvbnN0cnVjdF9kZXRlcm1pbmlzdGljX2luaXRpYWxfc3RhdGUgKGgsIGxhdGVuY3lfbXMpOworCisgIC8qIEF0IHRoaXMgcG9pbnQgdGhlcmUgaXMgYWxyZWFkeSBleGlzdGluZyBhIHJ0eC10aW1lciBmb3IgQG5leHRfc2VxbnVtLAorICAgKiB0aGF0IHdpbGwgaGF2ZSBhIHRpbWVvdXQgb2YgdGhlIGV4cGVjdGVkIGFycml2YWwtdGltZSBmb3IgdGhhdCBzZXFudW0sCisgICAqIGFuZCBhIGRlbGF5IGVxdWFsIHRvIDIqaml0dGVyPT0wIGFuZCAwLjUqcGFja2V0X3NwYWNpbmc9PTEwbXMgKi8KKyAgdGltZW91dCA9IG5leHRfc2VxbnVtICogVEVTVF9CVUZfRFVSQVRJT047CisgIHJ0eF9kZWxheV9tcyA9IDAuNSAqIFRFU1RfQlVGX01TOworCisgIC8qIFdlIGNyYW5rIHRoZSBjbG9jayB0byB0aW1lLW91dCB0aGUgbmV4dCBzY2hlZHVsZWQgdGltZXIgKi8KKyAgZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpOworICB2ZXJpZnlfcnR4X2V2ZW50IChoLCBuZXh0X3NlcW51bSwgdGltZW91dCwgcnR4X2RlbGF5X21zLCBURVNUX0JVRl9EVVJBVElPTik7CisKKyAgLyogbm93IHdlIHdhaXQgZm9yIHRoZSBuZXh0IHRpbWVvdXQsIGFsbCBmb2xsb3dpbmcgdGltZW91dHMgNDBtcyBpbiB0aGUKKyAgICogZnV0dXJlIGJlY2F1c2UgdGhpcyBpcyBydHgtcmV0cnktdGltZW91dCAqLworICBydHhfZGVsYXlfbXMgKz0gcnR4X3JldHJ5X3RpbWVvdXRfbXM7CisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKyAgdmVyaWZ5X3J0eF9ldmVudCAoaCwgbmV4dF9zZXFudW0sIHRpbWVvdXQsIHJ0eF9kZWxheV9tcywgVEVTVF9CVUZfRFVSQVRJT04pOworCisgIC8qIEFuZCBhIHRoaXJkIHRpbWUuLi4gKi8KKyAgcnR4X2RlbGF5X21zICs9IHJ0eF9yZXRyeV90aW1lb3V0X21zOworICBnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCk7CisgIHZlcmlmeV9ydHhfZXZlbnQgKGgsIG5leHRfc2VxbnVtLCB0aW1lb3V0LCBydHhfZGVsYXlfbXMsIFRFU1RfQlVGX0RVUkFUSU9OKTsKKworICAvKiB3ZSBzaG91bGQgbm93IHJlY2VpdmUgYSBwYWNrZXQtbG9zdC1ldmVudCBmb3IgcGFja2V0IEBuZXh0X3NlcW51bSAqLworICBnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCk7CisgIHZlcmlmeV9sb3N0X2V2ZW50IChoLCBuZXh0X3NlcW51bSwgdGltZW91dCwgVEVTVF9CVUZfRFVSQVRJT04pOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ydHhfdHdvX21pc3NpbmcpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBqaXR0ZXJidWZmZXIiKTsKKyAgZ2ludCBsYXRlbmN5X21zID0gMjAwOworICBndWludCBuZXh0X3NlcW51bTsKKyAgR3N0Q2xvY2tUaW1lIGxhc3RfcnR4X3JlcXVlc3QsIG5vdzsKKyAgZ2ludCBydHhfZGVsYXlfbXMgPSAwLjUgKiBURVNUX0JVRl9NUzsKKworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkby1yZXRyYW5zbWlzc2lvbiIsIFRSVUUsIE5VTEwpOworICBuZXh0X3NlcW51bSA9IGNvbnN0cnVjdF9kZXRlcm1pbmlzdGljX2luaXRpYWxfc3RhdGUgKGgsIGxhdGVuY3lfbXMpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgxMSwgbmV4dF9zZXFudW0pOworCisgIC8qCisgICAqIFRoZSBleHBlY3RlZCBzZXF1ZW5jZSBvZiBidWZmZXJzIGlzIHRoaXM6CisgICAqICAgICAgX19fXyAgIF9fX18gICBfX19fICAgX19fXworICAgKiAuLi4gfCAxMCB8IHwgMTEgfCB8IDEyIHwgfCAxMyB8CisgICAqICAgICAg4oCT4oCT4oCT4oCTICAg4oCT4oCT4oCT4oCTICAg4oCT4oCT4oCT4oCTICAg4oCT4oCT4oCT4oCTCisgICAqICAgICAgMjAwbXMgIDIyMG1zICAyNDBtcyAgMjYwbXMKKyAgICoKKyAgICogQnV0IGluc3RlYWQgd2UgZ2V0IHRoaXM6CisgICAqICAgICAgX19fXyAgICBfIF8gICAgXyBfICAgX19fXworICAgKiAuLi4gfCAxMCB8ICB8ICAgfCAgfCAgIHwgfCAxMyB8CisgICAqICAgICAg4oCT4oCT4oCT4oCTICAgIC0gLSAgICAtIC0gICDigJPigJPigJPigJMKKyAgICogICAgICAyMDBtcyAgICAgICAgICAgICAgICAyNjBtcworICAgKgorICAgKiBOb3cgaXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgbmV4dCB0aGluZyB0aGF0IGhhcHBlbnMgaXMgdGhhdAorICAgKiB0aGUgUlRYIHRpbWVvdXQgZm9yIHBhY2tldCAxMSB3aWxsIGhhcHBlbiBhdCB0aW1lIDIzMG1zLCBzbyB3ZSBjcmFuaworICAgKiB0aGUgdGltZXIgdGhyZWFkIHRvIGFkdmFuY2UgdGhlIHRpbWUgdG8gdGhpczoKKyAgICovCisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKyAgdmVyaWZ5X3J0eF9ldmVudCAoaCwgMTEsIDExICogVEVTVF9CVUZfRFVSQVRJT04sCisgICAgICBydHhfZGVsYXlfbXMsIFRFU1RfQlVGX0RVUkFUSU9OKTsKKyAgbGFzdF9ydHhfcmVxdWVzdCA9IGdzdF9jbG9ja19nZXRfdGltZSAoR1NUX0VMRU1FTlRfQ0xPQ0sgKGgtPmVsZW1lbnQpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludDY0IChsYXN0X3J0eF9yZXF1ZXN0LAorICAgICAgMTEgKiBURVNUX0JVRl9EVVJBVElPTiArIHJ0eF9kZWxheV9tcyAqIEdTVF9NU0VDT05EKTsKKyAgZ3N0X2hhcm5lc3Nfd2FpdF9mb3JfY2xvY2tfaWRfd2FpdHMgKGgsIDEsIDYwKTsKKworICAvKiBUaGUgbmV4dCBzY2hlZHVsZWQgUlRYIGZvciBwYWNrZXQgMTEgaXMgbm93IGF0IDIzMCArIDQwID0gMjcwbXMsCisgICAgIHNvIHRoZSBuZXh0IHRoaW5nIHRoYXQgaGFwcGVucyBpcyB0aGF0IGJ1ZmZlciAxMyBhcnJpdmVzIGluIHBlcmZlY3QgdGltZTogKi8KKyAgbm93ID0gMTMgKiBURVNUX0JVRl9EVVJBVElPTjsKKyAgZ3N0X2hhcm5lc3Nfc2V0X3RpbWUgKGgsIG5vdyk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLAorICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwKKyAgICAgICAgICBnZW5lcmF0ZV90ZXN0X2J1ZmZlcl9mdWxsIChub3csIDEzLCAxMyAqIFRFU1RfUlRQX1RTX0RVUkFUSU9OKSkpOworCisgIC8qCisgICAqCisgICAqIFRoaXMgd2lsbCBlc3RpbWF0ZSB0aGUgZHRzIG9uIHRoZSB0d28gbWlzc2luZyBwYWNrZXRzIHRvOgorICAgKiAgICAgIF9fX18gICBfX19fCisgICAqIC4uLiB8IDExIHwgfCAxMiB8IC4uLgorICAgKiAgICAgIOKAk+KAk+KAk+KAkyAgIOKAk+KAk+KAk+KAkworICAgKiAgICAgIDIyMG1zICAyNDBtcworICAgKgorICAgKiBBbmQgZ2l2ZW4gdGhlaXIgcmVndWxhciBpbnRlcnNwYWNpbmcgb2YgMjBtcywgaXQgd2lsbCBzY2hlZHVsZSB0d28gUlRYCisgICAqIHRpbWVycyBmb3IgdGhlbSBsaWtlIHNvOgorICAgKgorICAgKiAgICAgIF9fX18gICBfX19fCisgICAqIC4uLiB8IDExIHwgfCAxMiB8IC4uLgorICAgKiAgICAgIOKAk+KAk+KAk+KAkyAgIOKAk+KAk+KAk+KAkworICAgKiAgICAgIDIzMG1zICAyNTBtcworICAgKgorICAgKiBUaGVyZSBhcmUgaG93ZXZlciB0d28gcHJvYmxlbXMsIHBhY2tldCAxMSB3ZSBoYXZlIGFscmVhZHkgc2VudCBvbmUgUlRYIGZvcgorICAgKiBhbmQgaXRzIHRpbWVvdXQgaXMgY3VycmVudGx5IGF0IDI3MG1zLCBzbyB3ZSBzaG91bGQgbm90IHRhbXBlciB3aXRoIHRoYXQsCisgICAqIGFuZCBhcyBmb3IgcGFja2V0IDEyLCAyNTBtcyBoYXMgYWxyZWFkeSBleHBpcmVkLCBzbyB3ZSBub3cgZXhwZWN0IHRvIHNlZQorICAgKiBhbiBydHgtZXZlbnQgYmVpbmcgc2VudCBmb3IgcGFja2V0IDEyIGltbWVkaWF0ZWx5OgorICAgKi8KKyAgdmVyaWZ5X3J0eF9ldmVudCAoaCwgMTIsIDEyICogVEVTVF9CVUZfRFVSQVRJT04sCisgICAgICBydHhfZGVsYXlfbXMsIFRFU1RfQlVGX0RVUkFUSU9OKTsKKworICAvKiBhbmQgYW5vdGhlciBjcmFuayB3aWxsIHNlZSB0aGUgc2Vjb25kIFJUWCBldmVudCBiZWluZyBzZW50IGZvciBwYWNrZXQgMTEgKi8KKyAgZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpOworICBydHhfZGVsYXlfbXMgKz0gNDA7CisgIHZlcmlmeV9ydHhfZXZlbnQgKGgsIDExLCAxMSAqIFRFU1RfQlVGX0RVUkFUSU9OLAorICAgICAgcnR4X2RlbGF5X21zLCBURVNUX0JVRl9EVVJBVElPTik7CisgIGxhc3RfcnR4X3JlcXVlc3QgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKEdTVF9FTEVNRU5UX0NMT0NLIChoLT5lbGVtZW50KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQ2NCAobGFzdF9ydHhfcmVxdWVzdCwKKyAgICAgIDExICogVEVTVF9CVUZfRFVSQVRJT04gKyBydHhfZGVsYXlfbXMgKiBHU1RfTVNFQ09ORCk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3J0eF9idWZmZXJfYXJyaXZlc19qdXN0X2luX3RpbWUpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBqaXR0ZXJidWZmZXIiKTsKKyAgZ2ludCBsYXRlbmN5X21zID0gNSAqIFRFU1RfQlVGX01TOworICBnaW50IG5leHRfc2VxbnVtOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0Q2xvY2tUaW1lIG5vdywgbGFzdF9ydHhfcmVxdWVzdDsKKyAgZ2ludCBydHhfZGVsYXlfbXMgPSAwLjUgKiBURVNUX0JVRl9NUzsKKworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkby1yZXRyYW5zbWlzc2lvbiIsIFRSVUUsCisgICAgICAicnR4LW1heC1yZXRyaWVzIiwgMSwgTlVMTCk7CisgIG5leHRfc2VxbnVtID0gY29uc3RydWN0X2RldGVybWluaXN0aWNfaW5pdGlhbF9zdGF0ZSAoaCwgbGF0ZW5jeV9tcyk7CisKKyAgLyogQ3JhbmsgY2xvY2sgdG8gc2VuZCByZXRyYW5zbWlzc2lvbiBldmVudHMgcmVxdWVzdGluZyBzZXFudW0gNiB3aGljaCBoYXMKKyAgICogbm90IGFycml2ZWQgeWV0LiAqLworICBnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCk7CisgIHZlcmlmeV9ydHhfZXZlbnQgKGgsIG5leHRfc2VxbnVtLAorICAgICAgbmV4dF9zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiwgcnR4X2RlbGF5X21zLCBURVNUX0JVRl9EVVJBVElPTik7CisKKyAgbGFzdF9ydHhfcmVxdWVzdCA9IGdzdF9jbG9ja19nZXRfdGltZSAoR1NUX0VMRU1FTlRfQ0xPQ0sgKGgtPmVsZW1lbnQpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludDY0IChsYXN0X3J0eF9yZXF1ZXN0LAorICAgICAgbmV4dF9zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiArIHJ0eF9kZWxheV9tcyAqIEdTVF9NU0VDT05EKTsKKworICAvKiBzZXFudW0gNiBhcnJpdmVzIGp1c3QgYmVmb3JlIGl0IHRpbWVzIG91dCBhbmQgaXMgY29uc2lkZXJlZCBsb3N0ICovCisgIG5vdyA9IDIwMCAqIEdTVF9NU0VDT05EOworICBnc3RfaGFybmVzc19zZXRfdGltZSAoaCwgbm93KTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssIGdzdF9oYXJuZXNzX3B1c2ggKGgsCisgICAgICAgICAgZ2VuZXJhdGVfdGVzdF9idWZmZXJfcnR4IChub3csIG5leHRfc2VxbnVtKSkpOworICBidWZmZXIgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobmV4dF9zZXFudW0sIGdldF9ydHBfc2VxX251bSAoYnVmZmVyKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgZmFpbF91bmxlc3MgKHZlcmlmeV9qYl9zdGF0cyAoaC0+ZWxlbWVudCwKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLWppdHRlcmJ1ZmZlci1zdGF0cyIsCisgICAgICAgICAgICAgICJudW0tcHVzaGVkIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIG5leHRfc2VxbnVtICsgMSwKKyAgICAgICAgICAgICAgIm51bS1sb3N0IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsCisgICAgICAgICAgICAgICJydHgtY291bnQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMSwKKyAgICAgICAgICAgICAgInJ0eC1zdWNjZXNzLWNvdW50IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDEsCisgICAgICAgICAgICAgICJydHgtcGVyLXBhY2tldCIsIEdfVFlQRV9ET1VCTEUsIDEuMCwKKyAgICAgICAgICAgICAgInJ0eC1ydHQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgKG5vdyAtIGxhc3RfcnR4X3JlcXVlc3QpLAorICAgICAgICAgICAgICBOVUxMKSkpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ydHhfYnVmZmVyX2Fycml2ZXNfdG9vX2xhdGUpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBqaXR0ZXJidWZmZXIiKTsKKyAgZ2ludCBsYXRlbmN5X21zID0gNSAqIFRFU1RfQlVGX01TOworICBnaW50IG5leHRfc2VxbnVtOworICBHc3RDbG9ja1RpbWUgbm93LCBsYXN0X3J0eF9yZXF1ZXN0OworICBnaW50IHJ0eF9kZWxheV9tcyA9IDAuNSAqIFRFU1RfQlVGX01TOworCisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgImRvLXJldHJhbnNtaXNzaW9uIiwgVFJVRSwKKyAgICAgICJkby1sb3N0IiwgVFJVRSwgInJ0eC1tYXgtcmV0cmllcyIsIDEsIE5VTEwpOworICBuZXh0X3NlcW51bSA9IGNvbnN0cnVjdF9kZXRlcm1pbmlzdGljX2luaXRpYWxfc3RhdGUgKGgsIGxhdGVuY3lfbXMpOworCisgIC8qIENyYW5rIGNsb2NrIHRvIHNlbmQgcmV0cmFuc21pc3Npb24gZXZlbnRzIHJlcXVlc3Rpbmcgc2VxbnVtIDYgd2hpY2ggaGFzCisgICAqIG5vdCBhcnJpdmVkIHlldC4gKi8KKyAgZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpOworICB2ZXJpZnlfcnR4X2V2ZW50IChoLCBuZXh0X3NlcW51bSwKKyAgICAgIG5leHRfc2VxbnVtICogVEVTVF9CVUZfRFVSQVRJT04sIHJ0eF9kZWxheV9tcywgVEVTVF9CVUZfRFVSQVRJT04pOworCisgIGxhc3RfcnR4X3JlcXVlc3QgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKEdTVF9FTEVNRU5UX0NMT0NLIChoLT5lbGVtZW50KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQ2NCAobGFzdF9ydHhfcmVxdWVzdCwKKyAgICAgIG5leHRfc2VxbnVtICogVEVTVF9CVUZfRFVSQVRJT04gKyBydHhfZGVsYXlfbXMgKiBHU1RfTVNFQ09ORCk7CisKKyAgLyogcGFja2V0IEBuZXh0X3NlcW51bSBpcyBjb25zaWRlcmVkIGxvc3QgKi8KKyAgZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpOworICB2ZXJpZnlfbG9zdF9ldmVudCAoaCwgbmV4dF9zZXFudW0sCisgICAgICBuZXh0X3NlcW51bSAqIFRFU1RfQlVGX0RVUkFUSU9OLCBURVNUX0JVRl9EVVJBVElPTik7CisKKyAgLyogcGFja2V0IEBuZXh0X3NlcW51bSBhcnJpdmVzIHRvbyBsYXRlICovCisgIG5vdyA9IGdzdF9jbG9ja19nZXRfdGltZSAoR1NUX0VMRU1FTlRfQ0xPQ0sgKGgtPmVsZW1lbnQpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssIGdzdF9oYXJuZXNzX3B1c2ggKGgsCisgICAgICAgICAgZ2VuZXJhdGVfdGVzdF9idWZmZXJfcnR4IChub3csIG5leHRfc2VxbnVtKSkpOworCisgIGZhaWxfdW5sZXNzICh2ZXJpZnlfamJfc3RhdHMgKGgtPmVsZW1lbnQsCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1qaXR0ZXJidWZmZXItc3RhdHMiLAorICAgICAgICAgICAgICAibnVtLXB1c2hlZCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSBuZXh0X3NlcW51bSwKKyAgICAgICAgICAgICAgIm51bS1sb3N0IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDEsCisgICAgICAgICAgICAgICJudW0tbGF0ZSIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAxLAorICAgICAgICAgICAgICAibnVtLWR1cGxpY2F0ZXMiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMCwKKyAgICAgICAgICAgICAgInJ0eC1jb3VudCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAxLAorICAgICAgICAgICAgICAicnR4LXN1Y2Nlc3MtY291bnQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMCwKKyAgICAgICAgICAgICAgInJ0eC1wZXItcGFja2V0IiwgR19UWVBFX0RPVUJMRSwgMS4wLAorICAgICAgICAgICAgICAicnR4LXJ0dCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAobm93IC0gbGFzdF9ydHhfcmVxdWVzdCksCisgICAgICAgICAgICAgIE5VTEwpKSk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3J0eF9vcmlnaW5hbF9idWZmZXJfZG9lc19ub3RfdXBkYXRlX3J0eF9zdGF0cykKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGppdHRlcmJ1ZmZlciIpOworICBnaW50IGxhdGVuY3lfbXMgPSAxMDA7CisgIGdpbnQgbmV4dF9zZXFudW07CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBHc3RDbG9ja1RpbWUgbm93LCBsYXN0X3J0eF9yZXF1ZXN0OworICBnaW50IHJ0eF9kZWxheV9tcyA9IDAuNSAqIFRFU1RfQlVGX01TOworCisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgImRvLXJldHJhbnNtaXNzaW9uIiwgVFJVRSwKKyAgICAgICJydHgtbWF4LXJldHJpZXMiLCAxLCBOVUxMKTsKKyAgbmV4dF9zZXFudW0gPSBjb25zdHJ1Y3RfZGV0ZXJtaW5pc3RpY19pbml0aWFsX3N0YXRlIChoLCBsYXRlbmN5X21zKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoNiwgbmV4dF9zZXFudW0pOworCisgIC8qIENyYW5rIGNsb2NrIHRvIHNlbmQgcmV0cmFuc21pc3Npb24gZXZlbnRzIHJlcXVlc3RpbmcgQG5leHRfc2VxbnVtIHdoaWNoIGhhcworICAgKiBub3QgYXJyaXZlZCB5ZXQuICovCisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKyAgdmVyaWZ5X3J0eF9ldmVudCAoaCwgbmV4dF9zZXFudW0sCisgICAgICBuZXh0X3NlcW51bSAqIFRFU1RfQlVGX0RVUkFUSU9OLCBydHhfZGVsYXlfbXMsIFRFU1RfQlVGX0RVUkFUSU9OKTsKKworICBsYXN0X3J0eF9yZXF1ZXN0ID0gZ3N0X2Nsb2NrX2dldF90aW1lIChHU1RfRUxFTUVOVF9DTE9DSyAoaC0+ZWxlbWVudCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50NjQgKGxhc3RfcnR4X3JlcXVlc3QsCisgICAgICBuZXh0X3NlcW51bSAqIFRFU1RfQlVGX0RVUkFUSU9OICsgcnR4X2RlbGF5X21zICogR1NUX01TRUNPTkQpOworCisgIC8qIE9SSUdJTkFMIHNlcW51bSA2IGFycml2ZXMganVzdCBiZWZvcmUgaXQgdGltZXMgb3V0IGFuZCBpcyBjb25zaWRlcmVkCisgICAqIGxvc3QuICovCisgIG5vdyA9IDIwMCAqIEdTVF9NU0VDT05EOworICBnc3RfaGFybmVzc19zZXRfdGltZSAoaCwgbm93KTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssIGdzdF9oYXJuZXNzX3B1c2ggKGgsCisgICAgICAgICAgZ2VuZXJhdGVfdGVzdF9idWZmZXJfZnVsbCAobm93LAorICAgICAgICAgICAgICBuZXh0X3NlcW51bSwgbmV4dF9zZXFudW0gKiBURVNUX1JUUF9UU19EVVJBVElPTikpKTsKKyAgYnVmZmVyID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG5leHRfc2VxbnVtLCBnZXRfcnRwX3NlcV9udW0gKGJ1ZmZlcikpOworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgIC8qIGR1ZSB0byB0aGUgYWR2YW5jZSBpbiB0aW1lLCB3ZSB3aWxsIG5vdyBhbHNvIGhhdmUgc2VudAorICAgICBhbiBydHgtcmVxdWVzdCBmb3IgNyAqLworICBuZXh0X3NlcW51bSsrOworICB2ZXJpZnlfcnR4X2V2ZW50IChoLCBuZXh0X3NlcW51bSwKKyAgICAgIG5leHRfc2VxbnVtICogVEVTVF9CVUZfRFVSQVRJT04sIHJ0eF9kZWxheV9tcywgVEVTVF9CVUZfRFVSQVRJT04pOworCisgIC8qIFRoZSBvcmlnaW5hbCBidWZmZXIgZG9lcyBub3QgY291bnQgaW4gdGhlIFJUWCBzdGF0cy4gKi8KKyAgZmFpbF91bmxlc3MgKHZlcmlmeV9qYl9zdGF0cyAoaC0+ZWxlbWVudCwKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLWppdHRlcmJ1ZmZlci1zdGF0cyIsCisgICAgICAgICAgICAgICJudW0tcHVzaGVkIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIG5leHRfc2VxbnVtLAorICAgICAgICAgICAgICAibnVtLWxvc3QiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMCwKKyAgICAgICAgICAgICAgIm51bS1sYXRlIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsCisgICAgICAgICAgICAgICJudW0tZHVwbGljYXRlcyIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAwLAorICAgICAgICAgICAgICAicnR4LWNvdW50IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDIsCisgICAgICAgICAgICAgICJydHgtc3VjY2Vzcy1jb3VudCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAwLAorICAgICAgICAgICAgICAicnR4LXBlci1wYWNrZXQiLCBHX1RZUEVfRE9VQkxFLCAwLjAsCisgICAgICAgICAgICAgICJydHgtcnR0IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsIE5VTEwpKSk7CisKKyAgLyogTm93IHRoZSByZXRyYW5zbWl0dGVkIHBhY2tldCBhcnJpdmVzIGFuZCBzdGF0cyBzaG91bGQgYmUgdXBkYXRlZC4gTm90ZQorICAgKiB0aGF0IHRoZSBidWZmZXIgYXJyaXZlcyBpbiB0aW1lIGFuZCBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgbGF0ZSwgYnV0CisgICAqIGEgZHVwbGljYXRlLiAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywgZ3N0X2hhcm5lc3NfcHVzaCAoaCwKKyAgICAgICAgICBnZW5lcmF0ZV90ZXN0X2J1ZmZlcl9ydHggKG5vdywgNikpKTsKKworICBmYWlsX3VubGVzcyAodmVyaWZ5X2piX3N0YXRzIChoLT5lbGVtZW50LAorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1ydHAtaml0dGVyYnVmZmVyLXN0YXRzIiwKKyAgICAgICAgICAgICAgIm51bS1wdXNoZWQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgbmV4dF9zZXFudW0sCisgICAgICAgICAgICAgICJudW0tbG9zdCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAwLAorICAgICAgICAgICAgICAibnVtLWxhdGUiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMCwKKyAgICAgICAgICAgICAgIm51bS1kdXBsaWNhdGVzIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDEsCisgICAgICAgICAgICAgICJydHgtY291bnQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMiwKKyAgICAgICAgICAgICAgInJ0eC1zdWNjZXNzLWNvdW50IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsCisgICAgICAgICAgICAgICJydHgtcGVyLXBhY2tldCIsIEdfVFlQRV9ET1VCTEUsIDEuMCwKKyAgICAgICAgICAgICAgInJ0eC1ydHQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgKG5vdyAtIGxhc3RfcnR4X3JlcXVlc3QpLAorICAgICAgICAgICAgICBOVUxMKSkpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ydHhfZHVwbGljYXRlX3BhY2tldF91cGRhdGVzX3J0eF9zdGF0cykKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGppdHRlcmJ1ZmZlciIpOworICBnaW50IGxhdGVuY3lfbXMgPSAxMDA7CisgIGdpbnQgbmV4dF9zZXFudW07CisgIEdzdENsb2NrVGltZSBub3csIHJ0eF9yZXF1ZXN0XzYsIHJ0eF9yZXF1ZXN0Xzc7CisgIGdpbnQgcnR4X2RlbGF5X21zID0gMC41ICogVEVTVF9CVUZfTVM7CisgIGdpbnQgaTsKKworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkby1yZXRyYW5zbWlzc2lvbiIsIFRSVUUsIE5VTEwpOworICBuZXh0X3NlcW51bSA9IGNvbnN0cnVjdF9kZXRlcm1pbmlzdGljX2luaXRpYWxfc3RhdGUgKGgsIGxhdGVuY3lfbXMpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICg2LCBuZXh0X3NlcW51bSk7CisKKyAgLyogUHVzaCBwYWNrZXQgOCBzbyB0aGF0IDYgYW5kIDcgaXMgbWlzc2luZyAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywKKyAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyICg4KSkpOworCisgIC8qIFdhaXQgZm9yIE5BQ0tzIG9uIDYgYW5kIDcgKi8KKyAgZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpOworICB2ZXJpZnlfcnR4X2V2ZW50IChoLCA2LCA2ICogVEVTVF9CVUZfRFVSQVRJT04sCisgICAgICBydHhfZGVsYXlfbXMsIFRFU1RfQlVGX0RVUkFUSU9OKTsKKyAgcnR4X3JlcXVlc3RfNiA9IGdzdF9jbG9ja19nZXRfdGltZSAoR1NUX0VMRU1FTlRfQ0xPQ0sgKGgtPmVsZW1lbnQpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludDY0IChydHhfcmVxdWVzdF82LAorICAgICAgNiAqIFRFU1RfQlVGX0RVUkFUSU9OICsgcnR4X2RlbGF5X21zICogR1NUX01TRUNPTkQpOworCisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKyAgdmVyaWZ5X3J0eF9ldmVudCAoaCwKKyAgICAgIDcsIDcgKiBURVNUX0JVRl9EVVJBVElPTiwgcnR4X2RlbGF5X21zLCBURVNUX0JVRl9EVVJBVElPTik7CisgIHJ0eF9yZXF1ZXN0XzcgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKEdTVF9FTEVNRU5UX0NMT0NLIChoLT5lbGVtZW50KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQ2NCAocnR4X3JlcXVlc3RfNywKKyAgICAgIDcgKiBURVNUX0JVRl9EVVJBVElPTiArIHJ0eF9kZWxheV9tcyAqIEdTVF9NU0VDT05EKTsKKworICAvKiBPcmlnaW5hbCBwYWNrZXQgNyBhcnJpdmVzICovCisgIG5vdyA9IDE1MCAqIEdTVF9NU0VDT05EOworICBnc3RfaGFybmVzc19zZXRfdGltZSAoaCwgbm93KTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssIGdzdF9oYXJuZXNzX3B1c2ggKGgsCisgICAgICAgICAgZ2VuZXJhdGVfdGVzdF9idWZmZXJfZnVsbCAobm93LCA3LCA3ICogVEVTVF9SVFBfVFNfRFVSQVRJT04pKSk7CisKKyAgLyogV2UncmUgc3RpbGwgd2FpdGluZyBmb3IgcGFja2V0IDYsIHNvIDcgc2hvdWxkIG5vdCBiZSBwdXNoZWQgKi8KKyAgZ3N0X2hhcm5lc3Nfd2FpdF9mb3JfY2xvY2tfaWRfd2FpdHMgKGgsIDEsIDYwKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2hhcm5lc3NfYnVmZmVyc19pbl9xdWV1ZSAoaCksIDApOworCisgIC8qIFRoZSBvcmlnaW5hbCBidWZmZXIgZG9lcyBub3QgY291bnQgaW4gdGhlIFJUWCBzdGF0cy4gKi8KKyAgZmFpbF91bmxlc3MgKHZlcmlmeV9qYl9zdGF0cyAoaC0+ZWxlbWVudCwKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLWppdHRlcmJ1ZmZlci1zdGF0cyIsCisgICAgICAgICAgICAgICJudW0tbG9zdCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAwLAorICAgICAgICAgICAgICAibnVtLWxhdGUiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMCwKKyAgICAgICAgICAgICAgIm51bS1kdXBsaWNhdGVzIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsCisgICAgICAgICAgICAgICJydHgtY291bnQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMiwKKyAgICAgICAgICAgICAgInJ0eC1zdWNjZXNzLWNvdW50IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsCisgICAgICAgICAgICAgICJydHgtcGVyLXBhY2tldCIsIEdfVFlQRV9ET1VCTEUsIDAuMCwKKyAgICAgICAgICAgICAgInJ0eC1ydHQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMCwgTlVMTCkpKTsKKworICAvKiBQdXNoIFJUWCBwYWNrZXQgNy4gU2hvdWxkIGJlIGRyb3BwZWQgYXMgZHVwbGljYXRlIGJ1dCB1cGRhdGUgUlRYIHN0YXRzLiAqLworICBub3cgPSAxNjAgKiBHU1RfTVNFQ09ORDsKKyAgZ3N0X2hhcm5lc3Nfc2V0X3RpbWUgKGgsIG5vdyk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLCBnc3RfaGFybmVzc19wdXNoIChoLAorICAgICAgICAgIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX3J0eCAobm93LCA3KSkpOworICBnc3RfaGFybmVzc193YWl0X2Zvcl9jbG9ja19pZF93YWl0cyAoaCwgMSwgNjApOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfaGFybmVzc19idWZmZXJzX2luX3F1ZXVlIChoKSwgMCk7CisKKyAgLyogQ2hlY2sgUlRYIHN0YXRzIHdpdGggdXBkYXRlZCBudW0tZHVwbGljYXRlcyBhbmQgcnR4LXJ0dCBmaWVsZHMgKi8KKyAgZmFpbF91bmxlc3MgKHZlcmlmeV9qYl9zdGF0cyAoaC0+ZWxlbWVudCwKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLWppdHRlcmJ1ZmZlci1zdGF0cyIsCisgICAgICAgICAgICAgICJudW0tcHVzaGVkIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIG5leHRfc2VxbnVtLAorICAgICAgICAgICAgICAibnVtLWxvc3QiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMCwKKyAgICAgICAgICAgICAgIm51bS1sYXRlIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsCisgICAgICAgICAgICAgICJudW0tZHVwbGljYXRlcyIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAxLAorICAgICAgICAgICAgICAicnR4LWNvdW50IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDIsCisgICAgICAgICAgICAgICJydHgtc3VjY2Vzcy1jb3VudCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAwLAorICAgICAgICAgICAgICAicnR4LXBlci1wYWNrZXQiLCBHX1RZUEVfRE9VQkxFLCAxLjAsCisgICAgICAgICAgICAgICJydHgtcnR0IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIChub3cgLSBydHhfcmVxdWVzdF83KSwKKyAgICAgICAgICAgICAgTlVMTCkpKTsKKworICAvKiBSVFggcGFja2V0IDYgYXJyaXZlcywgYm90aCA2LCA3IGFuZCA4IGlzIHJlYWR5IHRvIGJlIHB1bGxlZCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywgZ3N0X2hhcm5lc3NfcHVzaCAoaCwKKyAgICAgICAgICBnZW5lcmF0ZV90ZXN0X2J1ZmZlcl9ydHggKG5vdywgNikpKTsKKworICBmb3IgKGkgPSA2OyBpIDw9IDg7IGkrKykgeworICAgIEdzdEJ1ZmZlciAqYnVmID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoaSwgZ2V0X3J0cF9zZXFfbnVtIChidWYpKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICB9CisKKyAgLyogUlRYIHN0YXRzIGlzIHVwZGF0ZWQgd2l0aCBzdWNjZXNzIGNvdW50IGluY3JlYXNlZC4gKi8KKyAgZmFpbF91bmxlc3MgKHZlcmlmeV9qYl9zdGF0cyAoaC0+ZWxlbWVudCwKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLWppdHRlcmJ1ZmZlci1zdGF0cyIsCisgICAgICAgICAgICAgICJudW0tcHVzaGVkIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIG5leHRfc2VxbnVtICsgMywKKyAgICAgICAgICAgICAgIm51bS1sb3N0IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsCisgICAgICAgICAgICAgICJudW0tbGF0ZSIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAwLAorICAgICAgICAgICAgICAibnVtLWR1cGxpY2F0ZXMiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMSwKKyAgICAgICAgICAgICAgInJ0eC1jb3VudCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAyLAorICAgICAgICAgICAgICAicnR4LXN1Y2Nlc3MtY291bnQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMSwKKyAgICAgICAgICAgICAgInJ0eC1wZXItcGFja2V0IiwgR19UWVBFX0RPVUJMRSwgMS4wLAorICAgICAgICAgICAgICAicnR4LXJ0dCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KQorICAgICAgICAgICAgICAvKiBVc2UgdGhlIHJ0eC1ydHQgZm9ybXVsYS4gQ2FuIGJlIHN1YmplY3QgdG8gY2hhbmdlIHRob3VnaC4gKi8KKyAgICAgICAgICAgICAgKChub3cgLSBydHhfcmVxdWVzdF82KSArIDQ3ICogKG5vdyAtIHJ0eF9yZXF1ZXN0XzcpKSAvIDQ4LAorICAgICAgICAgICAgICBOVUxMKSkpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ydHhfYnVmZmVyX2Fycml2ZXNfYWZ0ZXJfbG9zdF91cGRhdGVzX3J0eF9zdGF0cykKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGppdHRlcmJ1ZmZlciIpOworICBnaW50IGxhdGVuY3lfbXMgPSAxMDA7CisgIGdpbnQgbmV4dF9zZXFudW07CisgIEdzdENsb2NrVGltZSBub3csIGxhc3RfcnR4X3JlcXVlc3Q7CisgIGdpbnQgcnR4X2RlbGF5X21zID0gMC41ICogVEVTVF9CVUZfTVM7CisKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAiZG8tcmV0cmFuc21pc3Npb24iLCBUUlVFLAorICAgICAgImRvLWxvc3QiLCBUUlVFLCAicnR4LW1heC1yZXRyaWVzIiwgMSwgTlVMTCk7CisgIG5leHRfc2VxbnVtID0gY29uc3RydWN0X2RldGVybWluaXN0aWNfaW5pdGlhbF9zdGF0ZSAoaCwgbGF0ZW5jeV9tcyk7CisKKyAgLyogQ3JhbmsgY2xvY2sgdG8gc2VuZCByZXRyYW5zbWlzc2lvbiBldmVudHMgcmVxdWVzdGluZyBzZXFudW0gNiB3aGljaCBoYXMKKyAgICogbm90IGFycml2ZWQgeWV0LiAqLworICBnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCk7CisgIHZlcmlmeV9ydHhfZXZlbnQgKGgsIG5leHRfc2VxbnVtLAorICAgICAgbmV4dF9zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiwgcnR4X2RlbGF5X21zLCBURVNUX0JVRl9EVVJBVElPTik7CisKKyAgbGFzdF9ydHhfcmVxdWVzdCA9IGdzdF9jbG9ja19nZXRfdGltZSAoR1NUX0VMRU1FTlRfQ0xPQ0sgKGgtPmVsZW1lbnQpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludDY0IChsYXN0X3J0eF9yZXF1ZXN0LAorICAgICAgbmV4dF9zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiArIHJ0eF9kZWxheV9tcyAqIEdTVF9NU0VDT05EKTsKKworICAvKiBzZXFudW0gNiBpcyBjb25zaWRlcmVkIGxvc3QgKi8KKyAgZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpOworICB2ZXJpZnlfbG9zdF9ldmVudCAoaCwgbmV4dF9zZXFudW0sCisgICAgICBuZXh0X3NlcW51bSAqIFRFU1RfQlVGX0RVUkFUSU9OLCBURVNUX0JVRl9EVVJBVElPTik7CisKKyAgLyogc2VxbnVtIDYgYXJyaXZlcyB0b28gbGF0ZSAqLworICBub3cgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKEdTVF9FTEVNRU5UX0NMT0NLIChoLT5lbGVtZW50KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLCBnc3RfaGFybmVzc19wdXNoIChoLAorICAgICAgICAgIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX3J0eCAobm93LCBuZXh0X3NlcW51bSkpKTsKKworICBmYWlsX3VubGVzcyAodmVyaWZ5X2piX3N0YXRzIChoLT5lbGVtZW50LAorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1ydHAtaml0dGVyYnVmZmVyLXN0YXRzIiwKKyAgICAgICAgICAgICAgIm51bS1wdXNoZWQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgbmV4dF9zZXFudW0sCisgICAgICAgICAgICAgICJudW0tbG9zdCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAxLAorICAgICAgICAgICAgICAibnVtLWxhdGUiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMSwKKyAgICAgICAgICAgICAgIm51bS1kdXBsaWNhdGVzIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsCisgICAgICAgICAgICAgICJydHgtY291bnQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMSwKKyAgICAgICAgICAgICAgInJ0eC1zdWNjZXNzLWNvdW50IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsCisgICAgICAgICAgICAgICJydHgtcGVyLXBhY2tldCIsIEdfVFlQRV9ET1VCTEUsIDEuMCwKKyAgICAgICAgICAgICAgInJ0eC1ydHQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgKG5vdyAtIGxhc3RfcnR4X3JlcXVlc3QpLAorICAgICAgICAgICAgICBOVUxMKSkpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ydHhfcnR0X2xhcmdlcl90aGFuX3JldHJ5X3RpbWVvdXQpCit7CisgIC8qIFdoZW4gUlRUIGlzIGxhcmdlciB0aGFuIHJldHJ5IHBlcmlvZCB3ZSB3aWxsIHNlbmQgdHdvIG9yIG1vcmUgcmVxdWVzdHMKKyAgICogYmVmb3JlIHJlY2VpdmluZyBhbnkgcmV0cmFuc21pc3Npb24gcGFja2V0cyAqLworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwaml0dGVyYnVmZmVyIik7CisgIGdpbnQgbGF0ZW5jeV9tcyA9IDEwMDsKKyAgZ2ludCBuZXh0X3NlcW51bTsKKyAgZ2ludCBydHhfcmV0cnlfdGltZW91dF9tcyA9IDIwOworICBnaW50IHJ0eF9kZWxheV9tcyA9IDAuNSAqIFRFU1RfQlVGX01TOworICBnaW50IHJ0dCA9IHJ0eF9yZXRyeV90aW1lb3V0X21zICogR1NUX01TRUNPTkQgKyAxOworICBHc3RDbG9ja1RpbWUgbm93LCBmaXJzdF9yZXF1ZXN0LCBzZWNvbmRfcmVxdWVzdDsKKworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkby1yZXRyYW5zbWlzc2lvbiIsIFRSVUUsCisgICAgICAicnR4LXJldHJ5LXRpbWVvdXQiLCBydHhfcmV0cnlfdGltZW91dF9tcywgTlVMTCk7CisgIG5leHRfc2VxbnVtID0gY29uc3RydWN0X2RldGVybWluaXN0aWNfaW5pdGlhbF9zdGF0ZSAoaCwgbGF0ZW5jeV9tcyk7CisKKyAgLyogV2FpdCBmb3IgZmlyc3QgTkFDSyBvbiA2ICovCisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKyAgdmVyaWZ5X3J0eF9ldmVudCAoaCwgbmV4dF9zZXFudW0sCisgICAgICBuZXh0X3NlcW51bSAqIFRFU1RfQlVGX0RVUkFUSU9OLCBydHhfZGVsYXlfbXMsIFRFU1RfQlVGX0RVUkFUSU9OKTsKKyAgZmlyc3RfcmVxdWVzdCA9IGdzdF9jbG9ja19nZXRfdGltZSAoR1NUX0VMRU1FTlRfQ0xPQ0sgKGgtPmVsZW1lbnQpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludDY0IChmaXJzdF9yZXF1ZXN0LAorICAgICAgbmV4dF9zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiArIHJ0eF9kZWxheV9tcyAqIEdTVF9NU0VDT05EKTsKKworICAvKiBQYWNrZXQgQG5leHRfc2VxbnVtICsgMSBhcnJpdmVzIGluIHRpbWUgKHNvIHRoYXQgd2UgYXZvaWQgaXRzIEVYUEVDVEVECisgICAqIHRpbWVycyB0byBpbnRlcmZlciB3aXRoIG91ciB0ZXN0KSAqLworICBwdXNoX3Rlc3RfYnVmZmVyIChoLCBuZXh0X3NlcW51bSArIDEpOworCisgIC8qIFNpbXVsYXRpbmcgUlRUID4gcnR4LXJldHJ5LXRpbWVvdXQsIHdlIHNlbmQgYSBuZXcgTkFDSyBiZWZvcmUgcmVjZWl2aW5nCisgICAqIHRoZSBSVFggcGFja2V0LiBXYWl0IGZvciBzZWNvbmQgTkFDSyBvbiBAbmV4dF9zZXFudW0gKi8KKyAgZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpOworICBydHhfZGVsYXlfbXMgKz0gcnR4X3JldHJ5X3RpbWVvdXRfbXM7CisgIHZlcmlmeV9ydHhfZXZlbnQgKGgsIG5leHRfc2VxbnVtLAorICAgICAgbmV4dF9zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiwgcnR4X2RlbGF5X21zLCBURVNUX0JVRl9EVVJBVElPTik7CisgIHNlY29uZF9yZXF1ZXN0ID0gZ3N0X2Nsb2NrX2dldF90aW1lIChHU1RfRUxFTUVOVF9DTE9DSyAoaC0+ZWxlbWVudCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50NjQgKHNlY29uZF9yZXF1ZXN0LAorICAgICAgbmV4dF9zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiArIHJ0eF9kZWxheV9tcyAqIEdTVF9NU0VDT05EKTsKKworICAvKiBUaGUgZmlyc3QgcmV0cmFuc21pdHRlZCBwYWNrZXQgYXJyaXZlcyAqLworICBub3cgPSBmaXJzdF9yZXF1ZXN0ICsgcnR0OworICBnc3RfaGFybmVzc19zZXRfdGltZSAoaCwgbm93KTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssIGdzdF9oYXJuZXNzX3B1c2ggKGgsCisgICAgICAgICAgZ2VuZXJhdGVfdGVzdF9idWZmZXJfcnR4IChub3csIG5leHRfc2VxbnVtKSkpOworCisgIC8qIFB1bGwgcGFja2V0cyBAbmV4dF9zZXFudW0gYW5kIEBuZXh0X3NlcW51bSArIDEgKi8KKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworICBnc3RfYnVmZmVyX3VucmVmIChnc3RfaGFybmVzc19wdWxsIChoKSk7CisKKyAgLyogU3RhdHMgc2hvdWxkIGJlIHVwZGF0ZWQuIE5vdGUgdGhhdCBSVFQgaXMgbm90IHVwZGF0ZWQgc2luY2Ugd2UgY2Fubm90IGJlCisgICAqIHN1cmUgd2hldGhlciB0aGUgUlRYIHBhY2tldCBpcyBpbiByZXNwb25zZSB0byB0aGUgZmlyc3Qgb3Igc2Vjb25kIE5BQ0suICovCisgIGZhaWxfdW5sZXNzICh2ZXJpZnlfamJfc3RhdHMgKGgtPmVsZW1lbnQsCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1qaXR0ZXJidWZmZXItc3RhdHMiLAorICAgICAgICAgICAgICAibnVtLXB1c2hlZCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSBuZXh0X3NlcW51bSArIDIsCisgICAgICAgICAgICAgICJudW0tbG9zdCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAwLAorICAgICAgICAgICAgICAibnVtLWxhdGUiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMCwKKyAgICAgICAgICAgICAgIm51bS1kdXBsaWNhdGVzIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsCisgICAgICAgICAgICAgICJydHgtY291bnQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMiwKKyAgICAgICAgICAgICAgInJ0eC1zdWNjZXNzLWNvdW50IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDEsCisgICAgICAgICAgICAgICJydHgtcGVyLXBhY2tldCIsIEdfVFlQRV9ET1VCTEUsIDIuMCwKKyAgICAgICAgICAgICAgInJ0eC1ydHQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMCwgTlVMTCkpKTsKKworICAvKiBQYWNrZXQgQG5leHRfc2VxbnVtICsgMiBhcnJpdmVzIGluIHRpbWUgKi8KKyAgcHVzaF90ZXN0X2J1ZmZlciAoaCwgbmV4dF9zZXFudW0gKyAyKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworCisgIC8qIE5vdyB0aGUgc2Vjb25kIHJldHJhbnNtaXR0ZWQgcGFja2V0IGFycml2ZXMgKi8KKyAgbm93ID0gc2Vjb25kX3JlcXVlc3QgKyBydHQ7CisgIGdzdF9oYXJuZXNzX3NldF90aW1lIChoLCBub3cpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywgZ3N0X2hhcm5lc3NfcHVzaCAoaCwKKyAgICAgICAgICBnZW5lcmF0ZV90ZXN0X2J1ZmZlcl9ydHggKG5vdywgbmV4dF9zZXFudW0pKSk7CisKKyAgLyogVGhlIHN0YXRzIGlzIHVwZGF0ZWQgd2l0aCB0aGUgY29ycmVjdCBSVFQuICovCisgIGZhaWxfdW5sZXNzICh2ZXJpZnlfamJfc3RhdHMgKGgtPmVsZW1lbnQsCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1qaXR0ZXJidWZmZXItc3RhdHMiLAorICAgICAgICAgICAgICAibnVtLXB1c2hlZCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSBuZXh0X3NlcW51bSArIDMsCisgICAgICAgICAgICAgICJudW0tbG9zdCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAwLAorICAgICAgICAgICAgICAibnVtLWxhdGUiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMCwKKyAgICAgICAgICAgICAgIm51bS1kdXBsaWNhdGVzIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDEsCisgICAgICAgICAgICAgICJydHgtY291bnQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMiwKKyAgICAgICAgICAgICAgInJ0eC1zdWNjZXNzLWNvdW50IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDEsCisgICAgICAgICAgICAgICJydHgtcGVyLXBhY2tldCIsIEdfVFlQRV9ET1VCTEUsIDIuMCwKKyAgICAgICAgICAgICAgInJ0eC1ydHQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgcnR0LCBOVUxMKSkpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ydHhfbm9fcmVxdWVzdF9pZl90aW1lX3Bhc3RfcmV0cnlfcGVyaW9kKQoreworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwaml0dGVyYnVmZmVyIik7CisgIGNvbnN0IGdpbnQgbGF0ZW5jeV9tcyA9IDIwMDsKKyAgY29uc3QgZ2ludCByZXRyeV9wZXJpb2RfbXMgPSAxMjA7CisgIEdzdFRlc3RDbG9jayAqdGVzdGNsb2NrOworICBHc3RDbG9ja0lEIHBlbmRpbmdfaWQ7CisgIEdzdENsb2NrVGltZSB0aW1lOworICBnaW50IGk7CisKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzIChoLCBnZW5lcmF0ZV9jYXBzICgpKTsKKyAgdGVzdGNsb2NrID0gZ3N0X2hhcm5lc3NfZ2V0X3Rlc3RjbG9jayAoaCk7CisKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAiZG8tbG9zdCIsIFRSVUUsIE5VTEwpOworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkby1yZXRyYW5zbWlzc2lvbiIsIFRSVUUsIE5VTEwpOworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJsYXRlbmN5IiwgbGF0ZW5jeV9tcywgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgInJ0eC1yZXRyeS1wZXJpb2QiLCByZXRyeV9wZXJpb2RfbXMsIE5VTEwpOworCisgIC8qIHB1c2ggdGhlIGZpcnN0IGNvdXBsZSBvZiBidWZmZXJzICovCisgIHB1c2hfdGVzdF9idWZmZXIgKGgsIDApOworICBwdXNoX3Rlc3RfYnVmZmVyIChoLCAxKTsKKworICAvKiBkcm9wIHJlY29uZmlndXJlIGV2ZW50ICovCisgIGdzdF9ldmVudF91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbF91cHN0cmVhbV9ldmVudCAoaCkpOworICAvKiBkcm9wIEdzdEV2ZW50U3RyZWFtU3RhcnQgJiBHc3RFdmVudENhcHMgJiBHc3RFdmVudFNlZ21lbnQgKi8KKyAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGxfZXZlbnQgKGgpKTsKKworICAvKiBXYWl0IGZvciB0aGUgZmlyc3QgRVhQRUNURUQgdGltZXIgdG8gYmUgc2NoZWR1bGVkICovCisgIGdzdF90ZXN0X2Nsb2NrX3dhaXRfZm9yX25leHRfcGVuZGluZ19pZCAodGVzdGNsb2NrLCAmcGVuZGluZ19pZCk7CisgIHRpbWUgPSBnc3RfY2xvY2tfaWRfZ2V0X3RpbWUgKHBlbmRpbmdfaWQpOworICBnc3RfY2xvY2tfaWRfdW5yZWYgKHBlbmRpbmdfaWQpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50NjQgKHRpbWUsIDIgKiBURVNUX0JVRl9EVVJBVElPTiArIDEwICogR1NUX01TRUNPTkQpOworCisgIC8qIExldCB0aGUgZmlyc3QgRVhQRUNURUQgdGltZXIgdGltZSBvdXQgYW5kIGJlIHNlbnQuIEhvd2V2ZXIsIHNldCB0aGUgJ25vdycKKyAgICogdGltZSB0byBiZSBwYXN0IHRoZSByZXRyeS1wZXJpb2Qgc2ltdWxhdGluZyB0aGF0IHRoZSBqaXR0ZXJidWZmZXIgaGFzIHRvbworICAgKiBtdWNoIHRvIGRvIGFuZCBpcyBub3QgYWJsZSB0byBwcm9jZXNzIGFsbCB0aW1lcnMgaW4gcmVhbC10aW1lLiBJbiB0aGlzCisgICAqIGNhc2UgdGhlIGppdHRlcmJ1ZmZlciBzaG91bGQgbm90IHNjaGVkdWxlIGEgbmV3IEVYUEVDVEVEIHRpbWVyIGFzIHRoYXQKKyAgICogd291bGQganVzdCBtYWtlIG1hdHRlcnMgd29yc2UgKG1vcmUgdW5uZWNlc3NhcnkgcHJvY2Vzc2luZyBvZiBhIHJlcXVlc3QKKyAgICogdGhhdCBpcyBhbHJlYWR5IHRvbyBsYXRlIHRvIGJlIHZhbHVhYmxlKS4gSW4gcHJhY3RpY2UgdGhpcyB0eXBpY2FsbHkKKyAgICogaGFwcGVucyBmb3IgaGlnaCBsb3NzIG5ldHdvcmtzIHdpdGggbG93IFJUVC4gKi8KKyAgZ3N0X3Rlc3RfY2xvY2tfc2V0X3RpbWVfYW5kX3Byb2Nlc3MgKHRlc3RjbG9jaywKKyAgICAgIDIgKiBURVNUX0JVRl9EVVJBVElPTiArIHJldHJ5X3BlcmlvZF9tcyAqIEdTVF9NU0VDT05EICsgMSk7CisKKyAgLyogVmVyaWZ5IHRoZSBldmVudC4gSXQgY291bGQgYmUgYXJndWVkIHRoYXQgdGhpcyByZXF1ZXN0IGlzIGFscmVhZHkgdG9vCisgICAqIGxhdGUgYW5kIHVubmVjZXNzYXJ5LiBIb3dldmVyLCBpbiBvcmRlciB0byBrZWVwIHRoaW5ncyBzaW1wbGUgKGZvciBub3cpCisgICAqIHdlIGp1c3Qga2VlcCB0aGUgYWxyZWFkeSBzY2VoZHVsZWQgRVhQRUNURUQgdGltZXIsIGJ1dCByZWZyYWluIGZyb20KKyAgICogc2NoZWR1bGVkIGFub3RoZXIgRVhQRUNURUQgdGltZXIgKi8KKyAgdmVyaWZ5X3J0eF9ldmVudCAoaCwgMiwgMiAqIFRFU1RfQlVGX0RVUkFUSU9OLCAxMCwgVEVTVF9CVUZfRFVSQVRJT04pOworCisgIC8qICJjcmFuayIgdG8gcmVhY2ggdGhlIERFQURMSU5FIGZvciBwYWNrZXQgMCAqLworICBnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDAsIGdzdF9oYXJuZXNzX3Vwc3RyZWFtX2V2ZW50c19pbl9xdWV1ZSAoaCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgwLCBnc3RfaGFybmVzc19ldmVudHNfaW5fcXVldWUgKGgpKTsKKworICAvKiAiY3JhbmsiIHRvIHRpbWUgb3V0IHRoZSBMT1NUIGV2ZW50ICovCisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKyAgdmVyaWZ5X2xvc3RfZXZlbnQgKGgsIDIsIDIgKiBURVNUX0JVRl9EVVJBVElPTiwgVEVTVF9CVUZfRFVSQVRJT04pOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHRlc3RjbG9jayk7CisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ydHhfc2FtZV9kZWxheV9hbmRfcmV0cnlfdGltZW91dCkKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGppdHRlcmJ1ZmZlciIpOworICBnaW50IGxhdGVuY3lfbXMgPSA1ICogVEVTVF9CVUZfTVM7CisgIGdpbnQgbmV4dF9zZXFudW07CisgIGdpbnQgcnR4X2RlbGF5X21zID0gMjA7CisgIEdzdENsb2NrVGltZSBsYXN0X3J0eF9yZXF1ZXN0OworCisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgImRvLXJldHJhbnNtaXNzaW9uIiwgVFJVRSwKKyAgICAgICJydHgtbWF4LXJldHJpZXMiLCAzLCAicnR4LWRlbGF5IiwgcnR4X2RlbGF5X21zLAorICAgICAgInJ0eC1yZXRyeS10aW1lb3V0IiwgcnR4X2RlbGF5X21zLCBOVUxMKTsKKyAgbmV4dF9zZXFudW0gPSBjb25zdHJ1Y3RfZGV0ZXJtaW5pc3RpY19pbml0aWFsX3N0YXRlIChoLCBsYXRlbmN5X21zKTsKKworICAvKiBDcmFuayBjbG9jayB0byBzZW5kIHJldHJhbnNtaXNzaW9uIGV2ZW50cyByZXF1ZXN0aW5nIHNlcW51bSA2IHdoaWNoIGhhcworICAgKiBub3QgYXJyaXZlZCB5ZXQuICovCisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKyAgdmVyaWZ5X3J0eF9ldmVudCAoaCwgbmV4dF9zZXFudW0sCisgICAgICBuZXh0X3NlcW51bSAqIFRFU1RfQlVGX0RVUkFUSU9OLCBydHhfZGVsYXlfbXMsIFRFU1RfQlVGX0RVUkFUSU9OKTsKKyAgLyogZmlyc3QgcnR4IGZvciBwYWNrZXQgQG5leHRfc2VxbnVtIHNob3VsZCBhcnJpdmUgYXQgdGhlIHJpZ2h0IHRpbWUgKi8KKyAgbGFzdF9ydHhfcmVxdWVzdCA9IGdzdF9jbG9ja19nZXRfdGltZSAoR1NUX0VMRU1FTlRfQ0xPQ0sgKGgtPmVsZW1lbnQpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludDY0IChsYXN0X3J0eF9yZXF1ZXN0LAorICAgICAgbmV4dF9zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiArIHJ0eF9kZWxheV9tcyAqIEdTVF9NU0VDT05EKTsKKworICAvKiB2ZXJpZnkgd2UgaGF2ZSBwdWxsZWQgb3V0IGFsbCBydHgtZXZlbnRzICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDAsIGdzdF9oYXJuZXNzX3Vwc3RyZWFtX2V2ZW50c19pbl9xdWV1ZSAoaCkpOworCisgIC8qIG5vdyBjcmFuayB0byBnZXQgdGhlIHNlY29uZCBhdHRlbXB0IGF0IHBhY2tldCBAbmV4dF9zZXFudW0gKi8KKyAgZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpOworICB2ZXJpZnlfcnR4X2V2ZW50IChoLCBuZXh0X3NlcW51bSwKKyAgICAgIG5leHRfc2VxbnVtICogVEVTVF9CVUZfRFVSQVRJT04sIHJ0eF9kZWxheV9tcyAqIDIsIFRFU1RfQlVGX0RVUkFUSU9OKTsKKworICAvKiBzZWNvbmQgcnR4IGZvciBzZXFudW0gNiBzaG91bGQgYXJyaXZlIGF0IDE0MCArIDIwbXMgKi8KKyAgbGFzdF9ydHhfcmVxdWVzdCA9IGdzdF9jbG9ja19nZXRfdGltZSAoR1NUX0VMRU1FTlRfQ0xPQ0sgKGgtPmVsZW1lbnQpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludDY0IChsYXN0X3J0eF9yZXF1ZXN0LAorICAgICAgbmV4dF9zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiArIHJ0eF9kZWxheV9tcyAqIDIgKiBHU1RfTVNFQ09ORCk7CisKKyAgLyogdmVyaWZ5IHdlIGhhdmUgcHVsbGVkIG91dCBhbGwgcnR4LWV2ZW50cyAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgwLCBnc3RfaGFybmVzc191cHN0cmVhbV9ldmVudHNfaW5fcXVldWUgKGgpKTsKKworICBmYWlsX3VubGVzcyAodmVyaWZ5X2piX3N0YXRzIChoLT5lbGVtZW50LAorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1ydHAtaml0dGVyYnVmZmVyLXN0YXRzIiwKKyAgICAgICAgICAgICAgIm51bS1wdXNoZWQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgbmV4dF9zZXFudW0sCisgICAgICAgICAgICAgICJudW0tbG9zdCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAwLAorICAgICAgICAgICAgICAicnR4LWNvdW50IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDIsIE5VTEwpKSk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3J0eF93aXRoX2JhY2t3YXJkc19ydHB0aW1lKQoreworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwaml0dGVyYnVmZmVyIik7CisgIGdpbnQgbGF0ZW5jeV9tcyA9IDQwOworCisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgImRvLXJldHJhbnNtaXNzaW9uIiwgVFJVRSwgTlVMTCk7CisgIGNvbnN0cnVjdF9kZXRlcm1pbmlzdGljX2luaXRpYWxfc3RhdGUgKGgsIGxhdGVuY3lfbXMpOworCisgIC8qCisgICAqIEZvciB2aWRlbyB1c2luZyBCLWZyYW1lcywgYW4gZXhwZWN0ZWQgc2VxdWVuY2UKKyAgICogY291bGQgYmUgbGlrZSB0aGlzOgorICAgKiAoSSA9IEktZnJhbWUsIFAgPSBQLWZyYW1lLCBCID0gQi1mcmFtZSkKKyAgICogICAgICAgICAgICAgICBfX18gICBfX18gICBfX18KKyAgICogICAgICAgICAgLi4uIHwgMyB8IHwgNCB8IHwgNSB8CisgICAqICAgICAgICAgICAgICAg4oCT4oCT4oCTICAg4oCT4oCT4oCTICAg4oCT4oCT4oCTCisgICAqIHJ0cHRpbWU6ICAgICAgIDMoSSkgIDUoUCkgIDQoQikKKyAgICogYXJyaXZhbChkdHMpOiAgMyAgICAgNSAgICAgNQorICAgKgorICAgKiBOb3RpY2UgaGVyZSB0aGF0IHBhY2tldCA1ICh0aGUgQiBmcmFtZSkgbWFrZQorICAgKiB0aGUgcnRwdGltZSBnbyBiYWNrd2FyZHMuCisgICAqLworCisgIC8qIHNlcW51bSAzLCBhcnJpdmluZyBhdCB0aW1lIDMgd2l0aCBydHB0aW1lIDMgKi8KKyAgcHVzaF90ZXN0X2J1ZmZlciAoaCwgMyk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKworICAvKiBzZXFudW0gNCwgYXJyaXZpbmcgYXQgdGltZSA1IHdpdGggcnRwdGltZSA1ICovCisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKDUgKiBURVNUX0JVRl9EVVJBVElPTiwKKyAgICAgICAgICA0LCA1ICogVEVTVF9SVFBfVFNfRFVSQVRJT04pKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworCisgIC8qIHNlcW51bSA1LCBhcnJpdmluZyBhdCB0aW1lIDUgd2l0aCBydHB0aW1lIDQgKi8KKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgZ2VuZXJhdGVfdGVzdF9idWZmZXJfZnVsbCAoNSAqIFRFU1RfQlVGX0RVUkFUSU9OLAorICAgICAgICAgIDUsIDQgKiBURVNUX1JUUF9UU19EVVJBVElPTikpOworICBnc3RfYnVmZmVyX3VucmVmIChnc3RfaGFybmVzc19wdWxsIChoKSk7CisKKyAgLyogY3JhbmsgdG8gdGltZS1vdXQgdGhlIHJ0eC1yZXF1ZXN0IGZvciBzZXFudW0gNiwgdGhlIHBvaW50IGhlcmUKKyAgICAgYmVpbmcgdGhhdCB0aGUgYmFja3dhcmRzIHJ0cHRpbWUgZGlkIG5vdCBtZXNzIHVwIHRoZSB0aW1lb3V0IGZvcgorICAgICB0aGUgcnR4IGV2ZW50ICovCisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKyAgdmVyaWZ5X3J0eF9ldmVudCAoaCwgNiwgNSAqIFRFU1RfQlVGX0RVUkFUSU9OICsgMTUgKiBHU1RfTVNFQ09ORCwKKyAgICAgIDE3LCAzNSAqIEdTVF9NU0VDT05EKTsKKworICBmYWlsX3VubGVzcyAodmVyaWZ5X2piX3N0YXRzIChoLT5lbGVtZW50LAorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1ydHAtaml0dGVyYnVmZmVyLXN0YXRzIiwKKyAgICAgICAgICAgICAgIm51bS1wdXNoZWQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgNiwKKyAgICAgICAgICAgICAgInJ0eC1jb3VudCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAxLAorICAgICAgICAgICAgICAibnVtLWxvc3QiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMCwgTlVMTCkpKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnR4X3RpbWVyX3JldXNlKQoreworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwaml0dGVyYnVmZmVyIik7CisgIGdpbnQgbGF0ZW5jeV9tcyA9IDUgKiBURVNUX0JVRl9NUzsKKyAgZ2ludCBydHhfZGVsYXlfbXMgPSAwLjUgKiBURVNUX0JVRl9NUzsKKyAgZ3VpbnQgbmV4dF9zZXFudW07CisKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAiZG8tcmV0cmFuc21pc3Npb24iLCBUUlVFLAorICAgICAgImRvLWxvc3QiLCBUUlVFLCAicnR4LW1heC1yZXRyaWVzIiwgMSwgTlVMTCk7CisgIG5leHRfc2VxbnVtID0gY29uc3RydWN0X2RldGVybWluaXN0aWNfaW5pdGlhbF9zdGF0ZSAoaCwgbGF0ZW5jeV9tcyk7CisKKyAgLyogY3JhbmsgdG8gdGltZW91dCB0aGUgb25seSBydHgtcmVxdWVzdCwgYW5kIHRoZSB0aW1lciB3aWxsCisgICAqIG5vdyByZXNjaGVkdWxlIGFzIGEgbG9zdC10aW1lciBpbnRlcm5hbGx5ICovCisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKyAgdmVyaWZ5X3J0eF9ldmVudCAoaCwgbmV4dF9zZXFudW0sCisgICAgICBuZXh0X3NlcW51bSAqIFRFU1RfQlVGX0RVUkFUSU9OLCBydHhfZGVsYXlfbXMsIFRFU1RfQlVGX0RVUkFUSU9OKTsKKworICAvKiBidXQgbm93IGJ1ZmZlciA2IGFycml2ZXMsIGFuZCB0aGlzIHNob3VsZCBub3cgcmV1c2UgdGhlIGxvc3QtdGltZXIKKyAgICogZm9yIDYsIGFzIGFuIGV4cGVjdGVkLXRpbWVyIGZvciA3ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLAorICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgZ2VuZXJhdGVfdGVzdF9idWZmZXIgKG5leHRfc2VxbnVtKSkpOworCisgIC8qIG5vdyBjcmFuayB0byB0aW1lb3V0IHRoZSBleHBlY3RlZC10aW1lciBmb3IgNyBhbmQgdmVyaWZ5ICovCisgIG5leHRfc2VxbnVtKys7CisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKyAgdmVyaWZ5X3J0eF9ldmVudCAoaCwgbmV4dF9zZXFudW0sCisgICAgICBuZXh0X3NlcW51bSAqIFRFU1RfQlVGX0RVUkFUSU9OLCBydHhfZGVsYXlfbXMsIFRFU1RfQlVGX0RVUkFUSU9OKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZGVhZGxpbmVfdHNfb2Zmc2V0KQoreworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwaml0dGVyYnVmZmVyIik7CisgIEdzdFRlc3RDbG9jayAqdGVzdGNsb2NrOworICBHc3RDbG9ja0lEIGlkOworICBjb25zdCBnaW50IGpiX2xhdGVuY3lfbXMgPSAxMDsKKworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHMgKGgsIGdlbmVyYXRlX2NhcHMgKCkpOworICB0ZXN0Y2xvY2sgPSBnc3RfaGFybmVzc19nZXRfdGVzdGNsb2NrIChoKTsKKworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJsYXRlbmN5IiwgamJfbGF0ZW5jeV9tcywgTlVMTCk7CisKKyAgLyogcHVzaCB0aGUgZmlyc3QgYnVmZmVyIGluICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLAorICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgZ2VuZXJhdGVfdGVzdF9idWZmZXIgKDApKSk7CisKKyAgLyogd2FpdF9uZXh0X3RpbWVvdXQoKSBzeW5jcyBvbiB0aGUgZGVhZGxpbmUgdGltZXIgKi8KKyAgZ3N0X3Rlc3RfY2xvY2tfd2FpdF9mb3JfbmV4dF9wZW5kaW5nX2lkICh0ZXN0Y2xvY2ssICZpZCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKGpiX2xhdGVuY3lfbXMgKiBHU1RfTVNFQ09ORCwKKyAgICAgIGdzdF9jbG9ja19pZF9nZXRfdGltZSAoaWQpKTsKKyAgZ3N0X2Nsb2NrX2lkX3VucmVmIChpZCk7CisKKyAgLyogYWRkIHRzLW9mZnNldCB3aGlsZSB3YWl0aW5nICovCisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgInRzLW9mZnNldCIsIDIwICogR1NUX01TRUNPTkQsIE5VTEwpOworCisgIGdzdF90ZXN0X2Nsb2NrX3NldF90aW1lX2FuZF9wcm9jZXNzICh0ZXN0Y2xvY2ssIGpiX2xhdGVuY3lfbXMgKiBHU1RfTVNFQ09ORCk7CisKKyAgLyogd2FpdF9uZXh0X3RpbWVvdXQoKSBzeW5jcyBvbiB0aGUgbmV3IGRlYWRsaW5lIHRpbWVyICovCisgIGdzdF90ZXN0X2Nsb2NrX3dhaXRfZm9yX25leHRfcGVuZGluZ19pZCAodGVzdGNsb2NrLCAmaWQpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0ICgoMjAgKyBqYl9sYXRlbmN5X21zKSAqIEdTVF9NU0VDT05ELAorICAgICAgZ3N0X2Nsb2NrX2lkX2dldF90aW1lIChpZCkpOworICBnc3RfY2xvY2tfaWRfdW5yZWYgKGlkKTsKKworICAvKiBub3cgbWFrZSBkZWFkbGluZSB0aW1lciB0aW1lb3V0ICovCisgIGdzdF90ZXN0X2Nsb2NrX3NldF90aW1lX2FuZF9wcm9jZXNzICh0ZXN0Y2xvY2ssCisgICAgICAoMjAgKyBqYl9sYXRlbmN5X21zKSAqIEdTVF9NU0VDT05EKTsKKworICBnc3RfYnVmZmVyX3VucmVmIChnc3RfaGFybmVzc19wdWxsIChoKSk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAodGVzdGNsb2NrKTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3B1c2hfYmlnX2dhcCkKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGppdHRlcmJ1ZmZlciIpOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgY29uc3QgZ2ludCBudW1fY29uc2VjdXRpdmUgPSA1OworICBnaW50IGk7CisKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzIChoLCBnZW5lcmF0ZV9jYXBzICgpKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbnNlY3V0aXZlOyBpKyspCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyICgxMDAwICsgaSkpKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbnNlY3V0aXZlOyBpKyspIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZiA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDEwMDAgKyBpLCBnZXRfcnRwX3NlcV9udW0gKGJ1ZikpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIH0KKworICAvKiBQdXNoIG1vcmUgcGFja2V0cyBmcm9tIGEgZGlmZmVyZW50IHNlcXVlbmNlIG51bWJlciBkb21haW4KKyAgICogdG8gdHJpZ2dlciAiYmlnIGdhcCIgbG9naWMuICovCisgIGZvciAoaSA9IDA7IGkgPCBudW1fY29uc2VjdXRpdmU7IGkrKykKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywKKyAgICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgZ2VuZXJhdGVfdGVzdF9idWZmZXIgKDIwMDAwICsgaSkpKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbnNlY3V0aXZlOyBpKyspIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZiA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDIwMDAwICsgaSwgZ2V0X3J0cF9zZXFfbnVtIChidWYpKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICB9CisKKyAgLyogRmluYWwgYnVmZmVyIHNob3VsZCBiZSBwdXNoZWQgc3RyYWlnaHQgdGhyb3VnaCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywKKyAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyICgyMDAwMCArIG51bV9jb25zZWN1dGl2ZSkpKTsKKyAgYnVmID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDIwMDAwICsgbnVtX2NvbnNlY3V0aXZlLCBnZXRfcnRwX3NlcV9udW0gKGJ1ZikpOworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCit0eXBlZGVmIHN0cnVjdAoreworICBndWludCBzZXFudW1fb2Zmc2V0OworICBndWludCBsYXRlX2J1ZmZlcjsKK30gVGVzdExhdGVBcnJpdmFsSW5wdXQ7CisKK3N0YXRpYyBjb25zdCBUZXN0TGF0ZUFycml2YWxJbnB1dAorICAgIHRlc3RfY29uc2lkZXJlZF9sb3N0X3BhY2tldF9pbl9sYXJnZV9nYXBfYXJyaXZlc19pbnB1dFtdID0geworICB7MCwgMX0sIHswLCAyfSwgezY1NTM1LCAxfSwgezY1NTM1LCAyfSwgezY1NTM0LCAxfSwgezY1NTM0LCAyfQorfTsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfY29uc2lkZXJlZF9sb3N0X3BhY2tldF9pbl9sYXJnZV9nYXBfYXJyaXZlcykKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGppdHRlcmJ1ZmZlciIpOworICBHc3RUZXN0Q2xvY2sgKnRlc3RjbG9jazsKKyAgR3N0Q2xvY2tJRCBpZDsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIGdpbnQgamJfbGF0ZW5jeV9tcyA9IDIwOworICBjb25zdCBUZXN0TGF0ZUFycml2YWxJbnB1dCAqdGVzdF9pbnB1dCA9CisgICAgICAmdGVzdF9jb25zaWRlcmVkX2xvc3RfcGFja2V0X2luX2xhcmdlX2dhcF9hcnJpdmVzX2lucHV0W19faV9fXTsKKyAgZ3VpbnQgc2VxX29mZnNldCA9IHRlc3RfaW5wdXQtPnNlcW51bV9vZmZzZXQ7CisgIGd1aW50IGxhdGVfYnVmZmVyID0gdGVzdF9pbnB1dC0+bGF0ZV9idWZmZXI7CisgIGdpbnQgaTsKKworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHMgKGgsIGdlbmVyYXRlX2NhcHMgKCkpOworICB0ZXN0Y2xvY2sgPSBnc3RfaGFybmVzc19nZXRfdGVzdGNsb2NrIChoKTsKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAiZG8tbG9zdCIsIFRSVUUsICJsYXRlbmN5IiwgamJfbGF0ZW5jeV9tcywgTlVMTCk7CisKKyAgLyogZmlyc3QgcHVzaCBidWZmZXIgMCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywKKyAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKDAgKiBURVNUX0JVRl9EVVJBVElPTiwKKyAgICAgICAgICAgICAgMCArIHNlcV9vZmZzZXQsIDAgKiBURVNUX1JUUF9UU19EVVJBVElPTikpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKworICAvKiBkcm9wIEdzdEV2ZW50U3RyZWFtU3RhcnQgJiBHc3RFdmVudENhcHMgJiBHc3RFdmVudFNlZ21lbnQgKi8KKyAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGxfZXZlbnQgKGgpKTsKKworICAvKiBob3Agb3ZlciAzIHBhY2tldHMsIGFuZCBwdXNoIGJ1ZmZlciA0IChnYXAgb2YgMykgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICBnc3RfaGFybmVzc19wdXNoIChoLCBnZW5lcmF0ZV90ZXN0X2J1ZmZlcl9mdWxsICg0ICogVEVTVF9CVUZfRFVSQVRJT04sCisgICAgICAgICAgICAgIDQgKyBzZXFfb2Zmc2V0LCA0ICogVEVTVF9SVFBfVFNfRFVSQVRJT04pKSk7CisKKyAgLyogdGhlIGppdHRlcmJ1ZmZlciBzaG91bGQgYmUgd2FpdGluZyBmb3IgdGhlIHRpbWVvdXQgb2YgYSAibGFyZ2UgZ2FwIHRpbWVyIgorICAgKiBmb3IgYnVmZmVyIDEgYW5kIDIgKi8KKyAgZ3N0X3Rlc3RfY2xvY2tfd2FpdF9mb3JfbmV4dF9wZW5kaW5nX2lkICh0ZXN0Y2xvY2ssICZpZCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKDEgKiBURVNUX0JVRl9EVVJBVElPTiArCisgICAgICBqYl9sYXRlbmN5X21zICogR1NUX01TRUNPTkQsIGdzdF9jbG9ja19pZF9nZXRfdGltZSAoaWQpKTsKKyAgZ3N0X2Nsb2NrX2lkX3VucmVmIChpZCk7CisKKyAgLyogbm93IGJ1ZmZlciAxIHNuZWFrcyBpbiBiZWZvcmUgdGhlIGxvc3QgZXZlbnQgZm9yIGJ1ZmZlciAxIGFuZCAyIGlzCisgICAqIHByb2Nlc3NlZCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywKKyAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKGgsCisgICAgICAgICAgZ2VuZXJhdGVfdGVzdF9idWZmZXJfZnVsbCAobGF0ZV9idWZmZXIgKiBURVNUX0JVRl9EVVJBVElPTiwKKyAgICAgICAgICAgICAgbGF0ZV9idWZmZXIgKyBzZXFfb2Zmc2V0LCBsYXRlX2J1ZmZlciAqIFRFU1RfUlRQX1RTX0RVUkFUSU9OKSkpOworCisgIC8qIHRpbWUgb3V0IGZvciBsb3N0IHBhY2tldHMgMSBhbmQgMiAob25lIGV2ZW50LCBkb3VibGUgZHVyYXRpb24pICovCisgIGZhaWxfdW5sZXNzIChnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCkpOworICB2ZXJpZnlfbG9zdF9ldmVudCAoaCwgMSArIHNlcV9vZmZzZXQsIDEgKiBURVNUX0JVRl9EVVJBVElPTiwKKyAgICAgIDIgKiBURVNUX0JVRl9EVVJBVElPTik7CisKKyAgLyogdGltZSBvdXQgZm9yIGxvc3QgcGFja2V0cyAzICovCisgIGZhaWxfdW5sZXNzIChnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCkpOworICB2ZXJpZnlfbG9zdF9ldmVudCAoaCwgMyArIHNlcV9vZmZzZXQsIDMgKiBURVNUX0JVRl9EVVJBVElPTiwKKyAgICAgIDEgKiBURVNUX0JVRl9EVVJBVElPTik7CisKKyAgLyogYnVmZmVyIDQgaXMgcHVzaGVkIGFzIG5vcm1hbCAqLworICBidWZmZXIgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoKDQgKyBzZXFfb2Zmc2V0KSAmIDB4ZmZmZiwgZ2V0X3J0cF9zZXFfbnVtIChidWZmZXIpKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICAvKiB3ZSBoYXZlIGxvc3QgMywgYW5kIG9uZSBvZiB0aGVtIGFycml2ZWQgZXZlbnR1YWxseSwgYnV0IHRvbyBsYXRlICovCisgIGZhaWxfdW5sZXNzICh2ZXJpZnlfamJfc3RhdHMgKGgtPmVsZW1lbnQsCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1qaXR0ZXJidWZmZXItc3RhdHMiLAorICAgICAgICAgICAgICAibnVtLXB1c2hlZCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAyLAorICAgICAgICAgICAgICAibnVtLWxvc3QiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMywKKyAgICAgICAgICAgICAgIm51bS1sYXRlIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDEsIE5VTEwpKSk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAodGVzdGNsb2NrKTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BlcmZvcm1hbmNlKQoreworICBHc3RIYXJuZXNzICpoID0KKyAgICAgIGdzdF9oYXJuZXNzX25ld19wYXJzZQorICAgICAgKCJydHBqaXR0ZXJidWZmZXIgZG8tbG9zdD0xIGRvLXJldHJhbnNtaXNzaW9uPTEgbGF0ZW5jeT0xMDAwIik7CisgIEdUaW1lciAqdGltZXIgPSBnX3RpbWVyX25ldyAoKTsKKyAgY29uc3QgZ2RvdWJsZSB0ZXN0X2R1cmF0aW9uID0gMi4wOworICBndWludCBidWZmZXJzX3B1c2hlZCA9IDA7CisgIGd1aW50IGJ1ZmZlcnNfcmVjZWl2ZWQ7CisKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzIChoLCBnZW5lcmF0ZV9jYXBzICgpKTsKKyAgZ3N0X2hhcm5lc3NfdXNlX3N5c3RlbWNsb2NrIChoKTsKKworICB3aGlsZSAoZ190aW1lcl9lbGFwc2VkICh0aW1lciwgTlVMTCkgPCB0ZXN0X2R1cmF0aW9uKSB7CisgICAgLyogU2ltdWxhdGUgMW1zIHBhY2tldHMgKi8KKyAgICBndWludCBuID0gYnVmZmVyc19wdXNoZWQgKiAyOyAgICAgICAvLyBldmVyeSBwYWNrZXQgYWxzbyBwcm9kdWNlcyBhIGdhcAorICAgIGd1aW50MTYgc2VxbnVtID0gbiAmIDB4ZmZmZjsKKyAgICBndWludDMyIHJ0cF90cyA9IG4gKiA4OworICAgIEdzdENsb2NrVGltZSBkdHMgPSBuICogR1NUX01TRUNPTkQ7CisgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgZ2VuZXJhdGVfdGVzdF9idWZmZXJfZnVsbCAoZHRzLCBzZXFudW0sIHJ0cF90cykpOworICAgIGJ1ZmZlcnNfcHVzaGVkKys7CisgICAgZ191c2xlZXAgKEdfVVNFQ19QRVJfU0VDIC8gMTAwMDApOworICB9CisgIGdfdGltZXJfZGVzdHJveSAodGltZXIpOworCisgIGJ1ZmZlcnNfcmVjZWl2ZWQgPSBnc3RfaGFybmVzc19idWZmZXJzX3JlY2VpdmVkIChoKTsKKyAgR1NUX0lORk8gKCJQdXNoZWQgJWQsIHJlY2VpdmVkICVkICglLjFmJSUpIiwgYnVmZmVyc19wdXNoZWQsIGJ1ZmZlcnNfcmVjZWl2ZWQsCisgICAgICAxMDAuMCAqIGJ1ZmZlcnNfcmVjZWl2ZWQgLyBidWZmZXJzX3B1c2hlZCk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitydHBqaXR0ZXJidWZmZXJfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgicnRwaml0dGVyYnVmZmVyIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3B1c2hfZm9yd2FyZF9zZXEpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcHVzaF9iYWNrd2FyZF9zZXEpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcHVzaF91bm9yZGVyZWQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYmFzZXRpbWUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfY2xlYXJfcHRfbWFwKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbG9zdF9ldmVudCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9vbmx5X29uZV9sb3N0X2V2ZW50X29uX2xhcmdlX2dhcHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHdvX2xvc3Rfb25lX2Fycml2ZXNfaW5fdGltZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9sYXRlX3BhY2tldHNfc3RpbGxfbWFrZXNfbG9zdF9ldmVudHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbG9zdF9ldmVudF91c2VzX3B0cyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9sb3N0X2V2ZW50X3dpdGhfYmFja3dhcmRzX3J0cHRpbWUpOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9hbGxfcGFja2V0c19hcmVfdGltZXN0YW1wZWRfemVybyk7CisgIHRjYXNlX2FkZF9sb29wX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X251bV9sYXRlX3doZW5fY29uc2lkZXJlZF9sb3N0X2Fycml2ZXMsIDAsCisgICAgICAyKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3Jlb3JkZXJfb2Zfbm9uX2VxdWlkaXN0YW50X3BhY2tldHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sCisgICAgICB0ZXN0X2xvc3NfZXF1aWRpc3RhbnRfc3BhY2luZ193aXRoX3BhcmFtZXRlcl9wYWNrZXRzKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcnR4X2V4cGVjdGVkX25leHQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcnR4X3R3b19taXNzaW5nKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3J0eF9idWZmZXJfYXJyaXZlc19qdXN0X2luX3RpbWUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcnR4X2J1ZmZlcl9hcnJpdmVzX3Rvb19sYXRlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3J0eF9vcmlnaW5hbF9idWZmZXJfZG9lc19ub3RfdXBkYXRlX3J0eF9zdGF0cyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ydHhfZHVwbGljYXRlX3BhY2tldF91cGRhdGVzX3J0eF9zdGF0cyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwKKyAgICAgIHRlc3RfcnR4X2J1ZmZlcl9hcnJpdmVzX2FmdGVyX2xvc3RfdXBkYXRlc19ydHhfc3RhdHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcnR4X3J0dF9sYXJnZXJfdGhhbl9yZXRyeV90aW1lb3V0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3J0eF9ub19yZXF1ZXN0X2lmX3RpbWVfcGFzdF9yZXRyeV9wZXJpb2QpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcnR4X3NhbWVfZGVsYXlfYW5kX3JldHJ5X3RpbWVvdXQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcnR4X3dpdGhfYmFja3dhcmRzX3J0cHRpbWUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcnR4X3RpbWVyX3JldXNlKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZGVhZGxpbmVfdHNfb2Zmc2V0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3B1c2hfYmlnX2dhcCk7CisKKyAgdGNhc2VfYWRkX2xvb3BfdGVzdCAodGNfY2hhaW4sCisgICAgICB0ZXN0X2NvbnNpZGVyZWRfbG9zdF9wYWNrZXRfaW5fbGFyZ2VfZ2FwX2Fycml2ZXMsIDAsCisgICAgICBHX05fRUxFTUVOVFMgKHRlc3RfY29uc2lkZXJlZF9sb3N0X3BhY2tldF9pbl9sYXJnZV9nYXBfYXJyaXZlc19pbnB1dCkpOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wZXJmb3JtYW5jZSk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChydHBqaXR0ZXJidWZmZXIpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwbXV4LmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTAzODg3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwbXV4LmMKQEAgLTAsMCArMSw1NTIgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIHVuaXQgdGVzdCBmb3IgcnRwbXV4IGVsZW1lbnRzCisgKgorICogQ29weXJpZ2h0IDIwMDkgQ29sbGFib3JhIEx0ZC4KKyAqICBAYXV0aG9yOiBPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCAyMDA5IE5va2lhIENvcnAuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RoYXJuZXNzLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCIpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwIikpOworCit0eXBlZGVmIHZvaWQgKCpjaGVja19jYikgKEdzdFBhZCAqIHBhZCwgaW50IGkpOworCitzdGF0aWMgZ2Jvb2xlYW4KK3F1ZXJ5X2Z1bmMgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogbm9wYXJlbnQsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqKmNhcHMgPSBnX29iamVjdF9nZXRfZGF0YSAoR19PQkpFQ1QgKHBhZCksICJjYXBzIik7CisKKyAgICAgIGZhaWxfdW5sZXNzIChjYXBzICE9IE5VTEwgJiYgKmNhcHMgIT0gTlVMTCk7CisgICAgICBnc3RfcXVlcnlfc2V0X2NhcHNfcmVzdWx0IChxdWVyeSwgKmNhcHMpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX0FDQ0VQVF9DQVBTOgorICAgICAgZ3N0X3F1ZXJ5X3NldF9hY2NlcHRfY2Fwc19yZXN1bHQgKHF1ZXJ5LCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCityZW1vdmVfc3NyY19mcm9tX2NhcHMgKEdzdENhcHMgKiBjYXBzKQoreworICBHc3RDYXBzICpjb3B5ID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNvcHksIDApOworICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAocywgInNzcmMiKTsKKyAgcmV0dXJuIGNvcHk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZXZlbnRfZnVuYyAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBub3BhcmVudCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpjYXBzOworICAgICAgR3N0Q2FwcyAqKmNhcHMyID0gZ19vYmplY3RfZ2V0X2RhdGEgKEdfT0JKRUNUIChwYWQpLCAiY2FwcyIpOworICAgICAgR3N0Q2FwcyAqY2Fwc19ub19zc3JjOworICAgICAgR3N0Q2FwcyAqY2FwczJfbm9fc3NyYzsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICBjYXBzX25vX3NzcmMgPSByZW1vdmVfc3NyY19mcm9tX2NhcHMgKGNhcHMpOworICAgICAgY2FwczJfbm9fc3NyYyA9IHJlbW92ZV9zc3JjX2Zyb21fY2FwcyAoKmNhcHMyKTsKKworICAgICAgZmFpbF91bmxlc3MgKGNhcHMyICE9IE5VTEwgJiYgKmNhcHMyICE9IE5VTEwpOworICAgICAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2lzX2ZpeGVkIChjYXBzKSk7CisgICAgICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfaXNfZml4ZWQgKCpjYXBzMikpOworCisgICAgICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfaXNfZXF1YWxfZml4ZWQgKGNhcHNfbm9fc3NyYywgY2FwczJfbm9fc3NyYykpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHNfbm9fc3NyYyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2FwczJfbm9fc3NyYyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2Jhc2ljIChjb25zdCBnY2hhciAqIGVsZW1fbmFtZSwgY29uc3QgZ2NoYXIgKiBzaW5rMiwgaW50IGNvdW50LAorICAgIGNoZWNrX2NiIGNiKQoreworICBHc3RFbGVtZW50ICpydHBtdXggPSBOVUxMOworICBHc3RQYWQgKnJlcXBhZDEgPSBOVUxMOworICBHc3RQYWQgKnJlcXBhZDIgPSBOVUxMOworICBHc3RQYWQgKnNyYzEgPSBOVUxMOworICBHc3RQYWQgKnNyYzIgPSBOVUxMOworICBHc3RQYWQgKnNpbmsgPSBOVUxMOworICBHc3RCdWZmZXIgKmluYnVmID0gTlVMTDsKKyAgR3N0Q2FwcyAqc3JjMWNhcHMgPSBOVUxMOworICBHc3RDYXBzICpzcmMyY2FwcyA9IE5VTEw7CisgIEdzdENhcHMgKnNpbmtjYXBzID0gTlVMTDsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworICBpbnQgaTsKKworICBydHBtdXggPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoZWxlbV9uYW1lKTsKKworICByZXFwYWQxID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBtdXgsICJzaW5rXzEiKTsKKyAgZmFpbF91bmxlc3MgKHJlcXBhZDEgIT0gTlVMTCk7CisgIHJlcXBhZDIgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHJ0cG11eCwgc2luazIpOworICBmYWlsX3VubGVzcyAocmVxcGFkMiAhPSBOVUxMKTsKKyAgc2luayA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZF9ieV9uYW1lIChydHBtdXgsICZzaW5rdGVtcGxhdGUsICJzcmMiKTsKKworICBzcmMxID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzcmN0ZW1wbGF0ZSwgInNyYyIpOworICBzcmMyID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzcmN0ZW1wbGF0ZSwgInNyYyIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rIChzcmMxLCByZXFwYWQxKSA9PSBHU1RfUEFEX0xJTktfT0spOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rIChzcmMyLCByZXFwYWQyKSA9PSBHU1RfUEFEX0xJTktfT0spOworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAoc3JjMSwgcXVlcnlfZnVuYyk7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChzcmMyLCBxdWVyeV9mdW5jKTsKKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKHNpbmssIHF1ZXJ5X2Z1bmMpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoc2luaywgZXZlbnRfZnVuYyk7CisgIGdfb2JqZWN0X3NldF9kYXRhIChHX09CSkVDVCAoc3JjMSksICJjYXBzIiwgJnNyYzFjYXBzKTsKKyAgZ19vYmplY3Rfc2V0X2RhdGEgKEdfT0JKRUNUIChzcmMyKSwgImNhcHMiLCAmc3JjMmNhcHMpOworICBnX29iamVjdF9zZXRfZGF0YSAoR19PQkpFQ1QgKHNpbmspLCAiY2FwcyIsICZzaW5rY2Fwcyk7CisKKyAgc3JjMWNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXBwbGljYXRpb24veC1ydHAiLAorICAgICAgImNsb2NrLXJhdGUiLCBHX1RZUEVfSU5ULCAxLCAic3NyYyIsIEdfVFlQRV9VSU5ULCAxMSwgTlVMTCk7CisgIHNyYzJjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtcnRwIiwKKyAgICAgICJjbG9jay1yYXRlIiwgR19UWVBFX0lOVCwgMiwgInNzcmMiLCBHX1RZUEVfVUlOVCwgMTIsIE5VTEwpOworICBzaW5rY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXJ0cCIsCisgICAgICAiY2xvY2stcmF0ZSIsIEdfVFlQRV9JTlQsIDMsICJzc3JjIiwgR19UWVBFX1VJTlQsIDEzLCBOVUxMKTsKKworICBjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKHNyYzEsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfaXNfZW1wdHkgKGNhcHMpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGdzdF9jYXBzX3NldF9zaW1wbGUgKHNyYzJjYXBzLCAiY2xvY2stcmF0ZSIsIEdfVFlQRV9JTlQsIDMsIE5VTEwpOworICBjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKHNyYzEsIE5VTEwpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgZ19vYmplY3Rfc2V0IChydHBtdXgsICJzZXFudW0tb2Zmc2V0IiwgMTAwLCAidGltZXN0YW1wLW9mZnNldCIsIDEwMDAsCisgICAgICAic3NyYyIsIDU1LCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChydHBtdXgsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc2luaywgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc3JjMSwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc3JjMiwgVFJVRSk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAoc3JjMSwKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoInN0cmVhbTEiKSkpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChzcmMyLAorICAgICAgICAgIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgic3RyZWFtMiIpKSk7CisKKyAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoc2lua2NhcHMsCisgICAgICAicGF5bG9hZCIsIEdfVFlQRV9JTlQsIDk4LCAic2VxbnVtLW9mZnNldCIsIEdfVFlQRV9VSU5ULCAxMDAsCisgICAgICAidGltZXN0YW1wLW9mZnNldCIsIEdfVFlQRV9VSU5ULCAxMDAwLCAic3NyYyIsIEdfVFlQRV9VSU5ULCA2NiwgTlVMTCk7CisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXBwbGljYXRpb24veC1ydHAiLAorICAgICAgInBheWxvYWQiLCBHX1RZUEVfSU5ULCA5OCwgImNsb2NrLXJhdGUiLCBHX1RZUEVfSU5ULCAzLAorICAgICAgInNlcW51bS1vZmZzZXQiLCBHX1RZUEVfVUlOVCwgNTYsICJ0aW1lc3RhbXAtb2Zmc2V0IiwgR19UWVBFX1VJTlQsIDU3LAorICAgICAgInNzcmMiLCBHX1RZUEVfVUlOVCwgNjYsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9zZXRfY2FwcyAoc3JjMSwgY2FwcykpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChzaW5rLCBOVUxMKTsKKyAgZmFpbF9pZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKGNhcHMpKTsKKworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgc2VnbWVudC5zdGFydCA9IDEwMDAwMDsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAoc3JjMSwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpKTsKKyAgc2VnbWVudC5zdGFydCA9IDA7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKHNyYzIsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIEdzdFJUUEJ1ZmZlciBydHBidWZmZXIgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworCisgICAgaW5idWYgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKDEwLCAwLCAwKTsKKyAgICBHU1RfQlVGRkVSX1BUUyAoaW5idWYpID0gaSAqIDEwMDAgKyAxMDAwMDA7CisgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoaW5idWYpID0gMTAwMDsKKworICAgIGdzdF9ydHBfYnVmZmVyX21hcCAoaW5idWYsIEdTVF9NQVBfV1JJVEUsICZydHBidWZmZXIpOworCisgICAgZ3N0X3J0cF9idWZmZXJfc2V0X3ZlcnNpb24gKCZydHBidWZmZXIsIDIpOworICAgIGdzdF9ydHBfYnVmZmVyX3NldF9wYXlsb2FkX3R5cGUgKCZydHBidWZmZXIsIDk4KTsKKyAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfc3NyYyAoJnJ0cGJ1ZmZlciwgNDQpOworICAgIGdzdF9ydHBfYnVmZmVyX3NldF90aW1lc3RhbXAgKCZydHBidWZmZXIsIDIwMCArIGkpOworICAgIGdzdF9ydHBfYnVmZmVyX3NldF9zZXEgKCZydHBidWZmZXIsIDIwMDAgKyBpKTsKKyAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cGJ1ZmZlcik7CisgICAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAoc3JjMSwgaW5idWYpID09IEdTVF9GTE9XX09LKTsKKworICAgIGlmIChidWZmZXJzKQorICAgICAgZmFpbF91bmxlc3MgKEdTVF9CVUZGRVJfUFRTIChidWZmZXJzLT5kYXRhKSA9PSBpICogMTAwMCwgIiVsbGQiLAorICAgICAgICAgIEdTVF9CVUZGRVJfUFRTIChidWZmZXJzLT5kYXRhKSk7CisKKyAgICBjYiAoc3JjMiwgaSk7CisKKyAgICBnX2xpc3RfZm9yZWFjaCAoYnVmZmVycywgKEdGdW5jKSBnc3RfYnVmZmVyX3VucmVmLCBOVUxMKTsKKyAgICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgICAgYnVmZmVycyA9IE5VTEw7CisgIH0KKworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc2luaywgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNyYzEsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzcmMyLCBGQUxTRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHJ0cG11eCwKKyAgICAgICAgICBHU1RfU1RBVEVfTlVMTCkgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3BhZF9ieV9uYW1lIChydHBtdXgsICJzcmMiKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocmVxcGFkMSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHJlcXBhZDIpOworICBnc3RfY2hlY2tfdGVhcmRvd25fcGFkX2J5X25hbWUgKHJ0cG11eCwgInNpbmtfMSIpOworICBnc3RfY2hlY2tfdGVhcmRvd25fcGFkX2J5X25hbWUgKHJ0cG11eCwgc2luazIpOworICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkIChydHBtdXgsIHJlcXBhZDEpOworICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkIChydHBtdXgsIHJlcXBhZDIpOworCisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNyYzFjYXBzLCBOVUxMKTsKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNyYzJjYXBzLCBOVUxMKTsKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNpbmtjYXBzLCBOVUxMKTsKKworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAocnRwbXV4KTsKK30KKworc3RhdGljIHZvaWQKK2Jhc2ljX2NoZWNrX2NiIChHc3RQYWQgKiBwYWQsIGludCBpKQoreworICBHc3RSVFBCdWZmZXIgcnRwYnVmZmVyID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKyAgZmFpbF91bmxlc3MgKGJ1ZmZlcnMgJiYgZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPT0gMSk7CisKKyAgZ3N0X3J0cF9idWZmZXJfbWFwIChidWZmZXJzLT5kYXRhLCBHU1RfTUFQX1JFQUQsICZydHBidWZmZXIpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICg2NiwgZ3N0X3J0cF9idWZmZXJfZ2V0X3NzcmMgKCZydHBidWZmZXIpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludDY0ICgyMDAgLSA1NyArIDEwMDAgKyBpLAorICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X3RpbWVzdGFtcCAoJnJ0cGJ1ZmZlcikpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgxMDAgKyAxICsgaSwgZ3N0X3J0cF9idWZmZXJfZ2V0X3NlcSAoJnJ0cGJ1ZmZlcikpOworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cGJ1ZmZlcik7Cit9CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnRwbXV4X2Jhc2ljKQoreworICB0ZXN0X2Jhc2ljICgicnRwbXV4IiwgInNpbmtfMiIsIDEwLCBiYXNpY19jaGVja19jYik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnRwZHRtZm11eF9iYXNpYykKK3sKKyAgdGVzdF9iYXNpYyAoInJ0cGR0bWZtdXgiLCAic2lua18yIiwgMTAsIGJhc2ljX2NoZWNrX2NiKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgdm9pZAorbG9ja19jaGVja19jYiAoR3N0UGFkICogcGFkLCBpbnQgaSkKK3sKKyAgR3N0QnVmZmVyICppbmJ1ZjsKKworICBpZiAoaSAlIDIpIHsKKyAgICBmYWlsX3VubGVzcyAoYnVmZmVycyA9PSBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBHc3RSVFBCdWZmZXIgcnRwYnVmZmVyID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKworICAgIGZhaWxfdW5sZXNzIChidWZmZXJzICYmIGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID09IDEpOworICAgIGdzdF9ydHBfYnVmZmVyX21hcCAoYnVmZmVycy0+ZGF0YSwgR1NUX01BUF9SRUFELCAmcnRwYnVmZmVyKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICg2NiwgZ3N0X3J0cF9idWZmZXJfZ2V0X3NzcmMgKCZydHBidWZmZXIpKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50NjQgKDIwMCAtIDU3ICsgMTAwMCArIGksCisgICAgICAgIGdzdF9ydHBfYnVmZmVyX2dldF90aW1lc3RhbXAgKCZydHBidWZmZXIpKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgxMDAgKyAxICsgaSwgZ3N0X3J0cF9idWZmZXJfZ2V0X3NlcSAoJnJ0cGJ1ZmZlcikpOworICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwYnVmZmVyKTsKKworICAgIGluYnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlICgxMCwgMCwgMCk7CisgICAgR1NUX0JVRkZFUl9QVFMgKGluYnVmKSA9IGkgKiAxMDAwICsgNTAwOworICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGluYnVmKSA9IDEwMDA7CisgICAgZ3N0X3J0cF9idWZmZXJfbWFwIChpbmJ1ZiwgR1NUX01BUF9XUklURSwgJnJ0cGJ1ZmZlcik7CisgICAgZ3N0X3J0cF9idWZmZXJfc2V0X3ZlcnNpb24gKCZydHBidWZmZXIsIDIpOworICAgIGdzdF9ydHBfYnVmZmVyX3NldF9wYXlsb2FkX3R5cGUgKCZydHBidWZmZXIsIDk4KTsKKyAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfc3NyYyAoJnJ0cGJ1ZmZlciwgNDQpOworICAgIGdzdF9ydHBfYnVmZmVyX3NldF90aW1lc3RhbXAgKCZydHBidWZmZXIsIDIwMCArIGkpOworICAgIGdzdF9ydHBfYnVmZmVyX3NldF9zZXEgKCZydHBidWZmZXIsIDIwMDAgKyBpKTsKKyAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cGJ1ZmZlcik7CisgICAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAocGFkLCBpbmJ1ZikgPT0gR1NUX0ZMT1dfT0spOworCisKKyAgICBnX2xpc3RfZm9yZWFjaCAoYnVmZmVycywgKEdGdW5jKSBnc3RfYnVmZmVyX3VucmVmLCBOVUxMKTsKKyAgICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgICAgYnVmZmVycyA9IE5VTEw7CisgIH0KK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnRwZHRtZm11eF9sb2NrKQoreworICB0ZXN0X2Jhc2ljICgicnRwZHRtZm11eCIsICJwcmlvcml0eV9zaW5rXzIiLCAxMCwgbG9ja19jaGVja19jYik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIEdzdEJ1ZmZlciAqCitnZW5lcmF0ZV90ZXN0X2J1ZmZlciAoZ3VpbnQgc2VxX251bSwgZ3VpbnQgc3NyYykKK3sKKyAgR3N0QnVmZmVyICpidWY7CisgIGd1aW50OCAqcGF5bG9hZDsKKyAgZ3VpbnQgaTsKKyAgR3N0UlRQQnVmZmVyIHJ0cCA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisgIGdzaXplIHNpemUgPSAxMDsKKworICBidWYgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKHNpemUsIDAsIDApOworICBHU1RfQlVGRkVSX0RUUyAoYnVmKSA9IEdTVF9NU0VDT05EICogMjAgKiBzZXFfbnVtOworICBHU1RfQlVGRkVSX1BUUyAoYnVmKSA9IEdTVF9NU0VDT05EICogMjAgKiBzZXFfbnVtOworCisgIGdzdF9ydHBfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1JFQURXUklURSwgJnJ0cCk7CisgIGdzdF9ydHBfYnVmZmVyX3NldF9wYXlsb2FkX3R5cGUgKCZydHAsIDApOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfc2VxICgmcnRwLCBzZXFfbnVtKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3RpbWVzdGFtcCAoJnJ0cCwgMTYwICogc2VxX251bSk7CisgIGdzdF9ydHBfYnVmZmVyX3NldF9zc3JjICgmcnRwLCBzc3JjKTsKKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHApOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgIHBheWxvYWRbaV0gPSAweGZmOworCisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgZ3VpbnQzMgorX3J0cF9idWZmZXJfZ2V0X3NzcmMgKEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0UlRQQnVmZmVyIHJ0cCA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisgIGd1aW50MzIgcmV0OworICBnX2Fzc2VydCAoZ3N0X3J0cF9idWZmZXJfbWFwIChidWYsIEdTVF9NQVBfUkVBRCwgJnJ0cCkpOworICByZXQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfc3NyYyAoJnJ0cCk7CisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgcmV0dXJuIHJldDsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnRwbXV4X3NzcmNfcHJvcGVydHkpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXdfd2l0aF9wYWRuYW1lcyAoInJ0cG11eCIsIE5VTEwsICJzcmMiKTsKKyAgR3N0SGFybmVzcyAqaDAgPSBnc3RfaGFybmVzc19uZXdfd2l0aF9lbGVtZW50IChoLT5lbGVtZW50LCAic2lua18wIiwgTlVMTCk7CisgIEdzdEhhcm5lc3MgKmgxID0gZ3N0X2hhcm5lc3NfbmV3X3dpdGhfZWxlbWVudCAoaC0+ZWxlbWVudCwgInNpbmtfMSIsIE5VTEwpOworICBHc3RCdWZmZXIgKmJ1ZjA7CisgIEdzdEJ1ZmZlciAqYnVmMTsKKworICAvKiBzZXQgc3NyYyB0byAxMTExMTEgKi8KKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAic3NyYyIsIDExMTExMSwgTlVMTCk7CisKKyAgLyogYm90aCBzaW5rcGFkcyBoYXZlIHRoZWlyIG93biBpZGVhIG9mIHdoYXQgdGhlIHNzcmMgc2hvdWxkIGJlICovCisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgwLCAiYXBwbGljYXRpb24veC1ydHAsIHNzcmM9KHVpbnQpMjIyMjIyIik7CisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgxLCAiYXBwbGljYXRpb24veC1ydHAsIHNzcmM9KHVpbnQpMzMzMzMzIik7CisKKyAgLyogcHVzaCBvbiBib3RoIHNpbmtwYWRzIHdpdGggZGlmZmVyZW50IHNzcmMgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICBnc3RfaGFybmVzc19wdXNoIChoMCwgZ2VuZXJhdGVfdGVzdF9idWZmZXIgKDAsIDIyMjIyMikpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICBnc3RfaGFybmVzc19wdXNoIChoMSwgZ2VuZXJhdGVfdGVzdF9idWZmZXIgKDAsIDMzMzMzMykpKTsKKworICBidWYwID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGJ1ZjEgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKworICAvKiB3ZSBleHBlY3QgdGhlIHNzcmMgdG8gYmUgd2hhdCB3ZSBzcGVjaWZpZWQgaW4gdGhlIHByb3BlcnR5ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDExMTExMSwgX3J0cF9idWZmZXJfZ2V0X3NzcmMgKGJ1ZjApKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMTExMTExLCBfcnRwX2J1ZmZlcl9nZXRfc3NyYyAoYnVmMSkpOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZjApOworICBnc3RfYnVmZmVyX3VucmVmIChidWYxKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaDApOworICBnc3RfaGFybmVzc190ZWFyZG93biAoaDEpOworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnRwbXV4X3NzcmNfcHJvcGVydHlfbm90X3NldCkKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ld193aXRoX3BhZG5hbWVzICgicnRwbXV4IiwgTlVMTCwgInNyYyIpOworICBHc3RIYXJuZXNzICpoMCA9IGdzdF9oYXJuZXNzX25ld193aXRoX2VsZW1lbnQgKGgtPmVsZW1lbnQsICJzaW5rXzAiLCBOVUxMKTsKKyAgR3N0SGFybmVzcyAqaDEgPSBnc3RfaGFybmVzc19uZXdfd2l0aF9lbGVtZW50IChoLT5lbGVtZW50LCAic2lua18xIiwgTlVMTCk7CisgIEdzdEJ1ZmZlciAqYnVmMDsKKyAgR3N0QnVmZmVyICpidWYxOworCisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgwLCAiYXBwbGljYXRpb24veC1ydHAsIHNzcmM9KHVpbnQpMjIyMjIyIik7CisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgxLCAiYXBwbGljYXRpb24veC1ydHAsIHNzcmM9KHVpbnQpMzMzMzMzIik7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICBnc3RfaGFybmVzc19wdXNoIChoMCwgZ2VuZXJhdGVfdGVzdF9idWZmZXIgKDAsIDIyMjIyMikpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICBnc3RfaGFybmVzc19wdXNoIChoMSwgZ2VuZXJhdGVfdGVzdF9idWZmZXIgKDAsIDMzMzMzMykpKTsKKworICBidWYwID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGJ1ZjEgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKworICAvKiB3ZSBleHBlY3QgdGhlIHNzcmMgdG8gYmUgdGhlIGZpcnN0IHNzcmMgdGhhdCBjYW1lIGluICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDIyMjIyMiwgX3J0cF9idWZmZXJfZ2V0X3NzcmMgKGJ1ZjApKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMjIyMjIyLCBfcnRwX2J1ZmZlcl9nZXRfc3NyYyAoYnVmMSkpOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZjApOworICBnc3RfYnVmZmVyX3VucmVmIChidWYxKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaDApOworICBnc3RfaGFybmVzc190ZWFyZG93biAoaDEpOworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnRwbXV4X3NzcmNfZG93bnN0cmVhbV9jYW5fb3ZlcnJ1bGUpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXdfd2l0aF9wYWRuYW1lcyAoInJ0cG11eCIsIE5VTEwsICJzcmMiKTsKKyAgR3N0SGFybmVzcyAqaDAgPSBnc3RfaGFybmVzc19uZXdfd2l0aF9lbGVtZW50IChoLT5lbGVtZW50LCAic2lua18wIiwgTlVMTCk7CisgIEdzdEhhcm5lc3MgKmgxID0gZ3N0X2hhcm5lc3NfbmV3X3dpdGhfZWxlbWVudCAoaC0+ZWxlbWVudCwgInNpbmtfMSIsIE5VTEwpOworICBHc3RCdWZmZXIgKmJ1ZjA7CisgIEdzdEJ1ZmZlciAqYnVmMTsKKworICAvKiBkb3duc3RyZWFtIGlzIHNwZWNpZnlpbmcgNDQ0NDQ0IGFzIHNzcmMgKi8KKyAgZ3N0X2hhcm5lc3Nfc2V0X3NpbmtfY2Fwc19zdHIgKGgsICJhcHBsaWNhdGlvbi94LXJ0cCwgc3NyYz0odWludCk0NDQ0NDQiKTsKKworICAvKiBydHBtdXggc3NyYyBpcyBzZXQgdG8gMTExMTExICovCisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgInNzcmMiLCAxMTExMTEsIE5VTEwpOworCisgIC8qIHdoaWxlIHVwc3RyZWFtIHNzcmMgaXMgMjIyMjIyIGFuZCAzMzMzMzMgKi8KKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzX3N0ciAoaDAsICJhcHBsaWNhdGlvbi94LXJ0cCwgc3NyYz0odWludCkyMjIyMjIiKTsKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzX3N0ciAoaDEsICJhcHBsaWNhdGlvbi94LXJ0cCwgc3NyYz0odWludCkzMzMzMzMiKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywKKyAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKGgwLCBnZW5lcmF0ZV90ZXN0X2J1ZmZlciAoMCwgMjIyMjIyKSkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywKKyAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKGgxLCBnZW5lcmF0ZV90ZXN0X2J1ZmZlciAoMCwgMzMzMzMzKSkpOworCisgIGJ1ZjAgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgYnVmMSA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworCisgIC8qIHdlIGV4cGVjdCB0aGUgc3NyYyB0byBiZSBkb3duc3RyZWFtIHNzcmMgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoNDQ0NDQ0LCBfcnRwX2J1ZmZlcl9nZXRfc3NyYyAoYnVmMCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICg0NDQ0NDQsIF9ydHBfYnVmZmVyX2dldF9zc3JjIChidWYxKSk7CisKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmMCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZjEpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoMCk7CisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoMSk7CisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ydHBtdXhfc3NyY19kb3duc3RyZWFtX2R5bmFtaWMpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXdfcGFyc2UgKCJydHBtdXggISBjYXBzZmlsdGVyIik7CisgIEdzdEVsZW1lbnQgKnJ0cG11eCA9IGdzdF9oYXJuZXNzX2ZpbmRfZWxlbWVudCAoaCwgInJ0cG11eCIpOworICBHc3RFbGVtZW50ICpjYXBzZmlsdGVyID0gZ3N0X2hhcm5lc3NfZmluZF9lbGVtZW50IChoLCAiY2Fwc2ZpbHRlciIpOworCisgIEdzdEhhcm5lc3MgKmgwID0gZ3N0X2hhcm5lc3NfbmV3X3dpdGhfZWxlbWVudCAocnRwbXV4LCAic2lua18wIiwgTlVMTCk7CisgIEdzdEhhcm5lc3MgKmgxID0gZ3N0X2hhcm5lc3NfbmV3X3dpdGhfZWxlbWVudCAocnRwbXV4LCAic2lua18xIiwgTlVMTCk7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdEJ1ZmZlciAqYnVmMDsKKyAgR3N0QnVmZmVyICpidWYxOworCisgIGdzdF9oYXJuZXNzX3BsYXkgKGgpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoImFwcGxpY2F0aW9uL3gtcnRwLCBzc3JjPSh1aW50KTQ0NDQ0NCIpOworICBnX29iamVjdF9zZXQgKGNhcHNmaWx0ZXIsICJjYXBzIiwgY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAvKiB3aGlsZSB1cHN0cmVhbSBzc3JjIGlzIDIyMjIyMiBhbmQgMzMzMzMzICovCisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgwLCAiYXBwbGljYXRpb24veC1ydHAsIHNzcmM9KHVpbnQpMjIyMjIyIik7CisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgxLCAiYXBwbGljYXRpb24veC1ydHAsIHNzcmM9KHVpbnQpMzMzMzMzIik7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICBnc3RfaGFybmVzc19wdXNoIChoMCwgZ2VuZXJhdGVfdGVzdF9idWZmZXIgKDAsIDIyMjIyMikpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICBnc3RfaGFybmVzc19wdXNoIChoMSwgZ2VuZXJhdGVfdGVzdF9idWZmZXIgKDAsIDMzMzMzMykpKTsKKworICAvKiB3ZSBleHBlY3QgdGhlIHNzcmMgdG8gYmUgZG93bnN0cmVhbSBzc3JjICg0NDQ0NDQpICovCisgIGJ1ZjAgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgYnVmMSA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICg0NDQ0NDQsIF9ydHBfYnVmZmVyX2dldF9zc3JjIChidWYwKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDQ0NDQ0NCwgX3J0cF9idWZmZXJfZ2V0X3NzcmMgKGJ1ZjEpKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmMCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZjEpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoImFwcGxpY2F0aW9uL3gtcnRwLCBzc3JjPSh1aW50KTU1NTU1NSIpOworICBnX29iamVjdF9zZXQgKGNhcHNmaWx0ZXIsICJjYXBzIiwgY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywKKyAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKGgwLCBnZW5lcmF0ZV90ZXN0X2J1ZmZlciAoMCwgMjIyMjIyKSkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywKKyAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKGgxLCBnZW5lcmF0ZV90ZXN0X2J1ZmZlciAoMCwgMzMzMzMzKSkpOworCisgIC8qIHdlIGV4cGVjdCB0aGUgc3NyYyB0byBiZSB0aGUgbmV3IGRvd25zdHJlYW0gc3NyYyAoNTU1NTU1KSAqLworICBidWYwID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGJ1ZjEgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoNTU1NTU1LCBfcnRwX2J1ZmZlcl9nZXRfc3NyYyAoYnVmMCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICg1NTU1NTUsIF9ydHBfYnVmZmVyX2dldF9zc3JjIChidWYxKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZjApOworICBnc3RfYnVmZmVyX3VucmVmIChidWYxKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChydHBtdXgpOworICBnc3Rfb2JqZWN0X3VucmVmIChjYXBzZmlsdGVyKTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgwKTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgxKTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitydHBtdXhfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgicnRwbXV4Iik7CisgIFRDYXNlICp0Y19jaGFpbjsKKworICB0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoInJ0cG11eF9iYXNpYyIpOworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3J0cG11eF9iYXNpYyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ydHBtdXhfc3NyY19wcm9wZXJ0eSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ydHBtdXhfc3NyY19wcm9wZXJ0eV9ub3Rfc2V0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3J0cG11eF9zc3JjX2Rvd25zdHJlYW1fY2FuX292ZXJydWxlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3J0cG11eF9zc3JjX2Rvd25zdHJlYW1fZHluYW1pYyk7CisKKyAgdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJydHBkdG1mbXV4X2Jhc2ljIik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ydHBkdG1mbXV4X2Jhc2ljKTsKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisKKyAgdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJydHBkdG1mbXV4X2xvY2siKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3J0cGR0bWZtdXhfbG9jayk7CisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAocnRwbXV4KQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwcnR4LmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBydHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWQ0MWM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwcnR4LmMKQEAgLTAsMCArMSw2NzYgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBDb2xsYWJvcmEgTHRkLgorICogICBAYXV0aG9yIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGhhcm5lc3MuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCisjZGVmaW5lIHZlcmlmeV9idWYoYnVmLCBpc19ydHgsIGV4cGVjdGVkX3NzcmMsIGV4cHRlZF9wdCwgZXhwZWN0ZWRfc2VxbnVtKSAgICAgICBcCisgIEdfU1RNVF9TVEFSVCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR3N0UlRQQnVmZmVyIF9ydHAgPSBHU1RfUlRQX0JVRkZFUl9JTklUOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmFpbF91bmxlc3MgKGdzdF9ydHBfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1JFQUQsICZfcnRwKSk7ICAgICAgICAgICAgICAgICBcCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3J0cF9idWZmZXJfZ2V0X3NzcmMgKCZfcnRwKSwgZXhwZWN0ZWRfc3NyYyk7ICAgICBcCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfdHlwZSAoJl9ydHApLCBleHB0ZWRfcHQpOyBcCisgICAgaWYgKCEoaXNfcnR4KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcnRwX2J1ZmZlcl9nZXRfc2VxICgmX3J0cCksIGV4cGVjdGVkX3NlcW51bSk7ICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfUkVBRF9VSU5UMTZfQkUgKGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICAgICBcCisgICAgICAgICAgICAgICgmX3J0cCkpLCBleHBlY3RlZF9zZXFudW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZfcnRwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gR19TVE1UX0VORAorCisjZGVmaW5lIHB1bGxfYW5kX3ZlcmlmeShoLCBpc19ydHgsIGV4cGVjdGVkX3NzcmMsIGV4cHRlZF9wdCwgZXhwZWN0ZWRfc2VxbnVtKSBcCisgIEdfU1RNVF9TVEFSVCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR3N0QnVmZmVyICpfYnVmID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVyaWZ5X2J1ZiAoX2J1ZiwgaXNfcnR4LCBleHBlY3RlZF9zc3JjLCBleHB0ZWRfcHQsIGV4cGVjdGVkX3NlcW51bSk7ICAgICBcCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoX2J1Zik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gR19TVE1UX0VORAorCisjZGVmaW5lIHB1c2hfcHVsbF9hbmRfdmVyaWZ5KGgsIGJ1ZiwgaXNfcnR4LCBleHBlY3RlZF9zc3JjLCBleHB0ZWRfcHQsIGV4cGVjdGVkX3NlcW51bSkgXAorICBHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnc3RfaGFybmVzc19wdXNoIChoLCBidWYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHVsbF9hbmRfdmVyaWZ5IChoLCBpc19ydHgsIGV4cGVjdGVkX3NzcmMsIGV4cHRlZF9wdCwgZXhwZWN0ZWRfc2VxbnVtKTsgICAgICAgICAgICAgXAorICB9IEdfU1RNVF9FTkQKKworc3RhdGljIEdzdEV2ZW50ICoKK2NyZWF0ZV9ydHhfZXZlbnQgKGd1aW50MzIgc3NyYywgZ3VpbnQ4IHBheWxvYWRfdHlwZSwgZ3VpbnQxNiBzZXFudW0pCit7CisgIHJldHVybiBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiR3N0UlRQUmV0cmFuc21pc3Npb25SZXF1ZXN0IiwKKyAgICAgICAgICAic2VxbnVtIiwgR19UWVBFX1VJTlQsIHNlcW51bSwKKyAgICAgICAgICAic3NyYyIsIEdfVFlQRV9VSU5ULCBzc3JjLAorICAgICAgICAgICJwYXlsb2FkLXR5cGUiLCBHX1RZUEVfVUlOVCwgcGF5bG9hZF90eXBlLCBOVUxMKSk7Cit9CisKK3N0YXRpYyB2b2lkCitjb21wYXJlX3J0cF9wYWNrZXRzIChHc3RCdWZmZXIgKiBhLCBHc3RCdWZmZXIgKiBiKQoreworICBHc3RSVFBCdWZmZXIgcnRwX2EgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworICBHc3RSVFBCdWZmZXIgcnRwX2IgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworCisgIGdzdF9ydHBfYnVmZmVyX21hcCAoYSwgR1NUX01BUF9SRUFELCAmcnRwX2EpOworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKGIsIEdTVF9NQVBfUkVBRCwgJnJ0cF9iKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcnRwX2J1ZmZlcl9nZXRfaGVhZGVyX2xlbiAoJnJ0cF9hKSwKKyAgICAgIGdzdF9ydHBfYnVmZmVyX2dldF9oZWFkZXJfbGVuICgmcnRwX2IpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3J0cF9idWZmZXJfZ2V0X3ZlcnNpb24gKCZydHBfYSksCisgICAgICBnc3RfcnRwX2J1ZmZlcl9nZXRfdmVyc2lvbiAoJnJ0cF9iKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9ydHBfYnVmZmVyX2dldF9zc3JjICgmcnRwX2EpLAorICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X3NzcmMgKCZydHBfYikpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcnRwX2J1ZmZlcl9nZXRfc2VxICgmcnRwX2EpLAorICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X3NlcSAoJnJ0cF9iKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9ydHBfYnVmZmVyX2dldF9jc3JjX2NvdW50ICgmcnRwX2EpLAorICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X2NzcmNfY291bnQgKCZydHBfYikpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyICgmcnRwX2EpLAorICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAoJnJ0cF9iKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3R5cGUgKCZydHBfYSksCisgICAgICBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF90eXBlICgmcnRwX2IpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3J0cF9idWZmZXJfZ2V0X3RpbWVzdGFtcCAoJnJ0cF9hKSwKKyAgICAgIGdzdF9ydHBfYnVmZmVyX2dldF90aW1lc3RhbXAgKCZydHBfYikpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcnRwX2J1ZmZlcl9nZXRfZXh0ZW5zaW9uICgmcnRwX2EpLAorICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X2V4dGVuc2lvbiAoJnJ0cF9iKSk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuICgmcnRwX2EpLAorICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuICgmcnRwX2IpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobWVtY21wIChnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cF9hKSwKKyAgICAgICAgICBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cF9iKSwKKyAgICAgICAgICBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKCZydHBfYSkpLCAwKTsKKworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cF9hKTsKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHBfYik7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorY3JlYXRlX3J0cF9idWZmZXIgKGd1aW50MzIgc3NyYywgZ3VpbnQ4IHBheWxvYWRfdHlwZSwgZ3VpbnQxNiBzZXFudW0pCit7CisgIEdzdFJUUEJ1ZmZlciBydHBidWYgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworICBndWludCBwYXlsb2FkX3NpemUgPSAyOTsKKyAgZ3VpbnQ2NCB0aW1lc3RhbXAgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChzZXFudW0sIDkwMDAwLCAzMCk7CisgIEdzdEJ1ZmZlciAqYnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChwYXlsb2FkX3NpemUsIDAsIDApOworCisgIGdzdF9ydHBfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwYnVmKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3NzcmMgKCZydHBidWYsIHNzcmMpOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfcGF5bG9hZF90eXBlICgmcnRwYnVmLCBwYXlsb2FkX3R5cGUpOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfc2VxICgmcnRwYnVmLCBzZXFudW0pOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfdGltZXN0YW1wICgmcnRwYnVmLCAoZ3VpbnQzMikgdGltZXN0YW1wKTsKKyAgbWVtc2V0IChnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cGJ1ZiksIDB4MjksIHBheWxvYWRfc2l6ZSk7CisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwYnVmKTsKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitjcmVhdGVfcnRwX2J1ZmZlcl93aXRoX3RpbWVzdGFtcCAoZ3VpbnQzMiBzc3JjLCBndWludDggcGF5bG9hZF90eXBlLAorICAgIGd1aW50MTYgc2VxbnVtLCBndWludDMyIHRpbWVzdGFtcCkKK3sKKyAgR3N0UlRQQnVmZmVyIHJ0cGJ1ZiA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisgIEdzdEJ1ZmZlciAqYnVmID0gY3JlYXRlX3J0cF9idWZmZXIgKHNzcmMsIHBheWxvYWRfdHlwZSwgc2VxbnVtKTsKKyAgZ3N0X3J0cF9idWZmZXJfbWFwIChidWYsIEdTVF9NQVBfV1JJVEUsICZydHBidWYpOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfdGltZXN0YW1wICgmcnRwYnVmLCB0aW1lc3RhbXApOworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cGJ1Zik7CisgIHJldHVybiBidWY7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3J0eHNlbmRfcnR4cmVjZWl2ZSkKK3sKKyAgY29uc3QgZ3VpbnQgcGFja2V0c19udW0gPSA1OworICBndWludCBtYXN0ZXJfc3NyYyA9IDEyMzQ1Njc7CisgIGd1aW50IG1hc3Rlcl9wdCA9IDk2OworICBndWludCBydHhfcHQgPSA5OTsKKyAgR3N0U3RydWN0dXJlICpwdF9tYXA7CisgIEdzdEJ1ZmZlciAqaW5idWZzWzVdOworICBHc3RIYXJuZXNzICpocmVjdiA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cHJ0eHJlY2VpdmUiKTsKKyAgR3N0SGFybmVzcyAqaHNlbmQgPSBnc3RfaGFybmVzc19uZXcgKCJydHBydHhzZW5kIik7CisgIGdpbnQgaTsKKworICBwdF9tYXAgPSBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLXB0LW1hcCIsCisgICAgICAiOTYiLCBHX1RZUEVfVUlOVCwgcnR4X3B0LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChocmVjdi0+ZWxlbWVudCwgInBheWxvYWQtdHlwZS1tYXAiLCBwdF9tYXAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKGhzZW5kLT5lbGVtZW50LCAicGF5bG9hZC10eXBlLW1hcCIsIHB0X21hcCwgTlVMTCk7CisKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzX3N0ciAoaHNlbmQsICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgIm1lZGlhID0gKHN0cmluZyl2aWRlbywgcGF5bG9hZCA9IChpbnQpOTYsICIKKyAgICAgICJzc3JjID0gKHVpbnQpMTIzNDU2NywgY2xvY2stcmF0ZSA9IChpbnQpOTAwMDAsICIKKyAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZylSQVciKTsKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzX3N0ciAoaHJlY3YsICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgIm1lZGlhID0gKHN0cmluZyl2aWRlbywgcGF5bG9hZCA9IChpbnQpOTYsICIKKyAgICAgICJzc3JjID0gKHVpbnQpMTIzNDU2NywgY2xvY2stcmF0ZSA9IChpbnQpOTAwMDAsICIKKyAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZylSQVciKTsKKworICAvKiBQdXNoICdwYWNrZXRzX251bScgcGFja2V0cyB0aHJvdWdoIHJ0eHNlbmQgdG8gcnR4cmVjZWl2ZSAqLworICBmb3IgKGkgPSAwOyBpIDwgcGFja2V0c19udW07ICsraSkgeworICAgIGluYnVmc1tpXSA9IGNyZWF0ZV9ydHBfYnVmZmVyIChtYXN0ZXJfc3NyYywgbWFzdGVyX3B0LCAxMDAgKyBpKTsKKyAgICBnc3RfaGFybmVzc19wdXNoIChoc2VuZCwgZ3N0X2J1ZmZlcl9yZWYgKGluYnVmc1tpXSkpOworICAgIGdzdF9oYXJuZXNzX3B1c2ggKGhyZWN2LCBnc3RfaGFybmVzc19wdWxsIChoc2VuZCkpOworICAgIHB1bGxfYW5kX3ZlcmlmeSAoaHJlY3YsIEZBTFNFLCBtYXN0ZXJfc3NyYywgbWFzdGVyX3B0LCAxMDAgKyBpKTsKKyAgfQorCisgIC8qIEdldHRpbmcgcmlkIG9mIHJlY29uZmlndXJlIGV2ZW50LiBQcmVwYXJhdGlvbiBiZWZvcmUgdGhlIG5leHQgc3RlcCAqLworICBnc3RfZXZlbnRfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGxfdXBzdHJlYW1fZXZlbnQgKGhyZWN2KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9oYXJuZXNzX3Vwc3RyZWFtX2V2ZW50c19pbl9xdWV1ZSAoaHJlY3YpLCAwKTsKKworICAvKiBQdXNoICdwYWNrZXRzX251bScgUlRYIGV2ZW50cyB0aHJvdWdoIHJ0eHJlY2VpdmUgdG8gcnR4c2VuZC4KKyAgICAgUHVzaCBSVFggcGFja2V0cyBmcm9tIHJ0eHNlbmQgdG8gcnR4cmVjZWl2ZSBhbmQKKyAgICAgY2hlY2sgdGhhdCB0aGUgcGFja2V0IHByb2R1Y2VkIG91dCBvZiBSVFggcGFja2V0IGlzIHRoZSBzYW1lCisgICAgIGFzIGFuIG9yaWdpbmFsIHBhY2tldCAqLworICBmb3IgKGkgPSAwOyBpIDwgcGFja2V0c19udW07ICsraSkgeworICAgIEdzdEJ1ZmZlciAqb3V0YnVmOworICAgIGdzdF9oYXJuZXNzX3B1c2hfdXBzdHJlYW1fZXZlbnQgKGhyZWN2LAorICAgICAgICBjcmVhdGVfcnR4X2V2ZW50IChtYXN0ZXJfc3NyYywgbWFzdGVyX3B0LCAxMDAgKyBpKSk7CisgICAgZ3N0X2hhcm5lc3NfcHVzaF91cHN0cmVhbV9ldmVudCAoaHNlbmQsCisgICAgICAgIGdzdF9oYXJuZXNzX3B1bGxfdXBzdHJlYW1fZXZlbnQgKGhyZWN2KSk7CisgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaHJlY3YsIGdzdF9oYXJuZXNzX3B1bGwgKGhzZW5kKSk7CisKKyAgICBvdXRidWYgPSBnc3RfaGFybmVzc19wdWxsIChocmVjdik7CisgICAgY29tcGFyZV9ydHBfcGFja2V0cyAoaW5idWZzW2ldLCBvdXRidWYpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGluYnVmc1tpXSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmKTsKKyAgfQorCisgIC8qIENoZWNrIFJUWCBzdGF0cyAqLworICB7CisgICAgZ3VpbnQgcnR4X3JlcXVlc3RzOworICAgIGd1aW50IHJ0eF9wYWNrZXRzOworICAgIGd1aW50IHJ0eF9hc3NvY19wYWNrZXRzOworICAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKGhzZW5kLT5lbGVtZW50KSwKKyAgICAgICAgIm51bS1ydHgtcmVxdWVzdHMiLCAmcnR4X3JlcXVlc3RzLAorICAgICAgICAibnVtLXJ0eC1wYWNrZXRzIiwgJnJ0eF9wYWNrZXRzLCBOVUxMKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChydHhfcGFja2V0cywgcGFja2V0c19udW0pOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHJ0eF9yZXF1ZXN0cywgcGFja2V0c19udW0pOworCisgICAgZ19vYmplY3RfZ2V0IChHX09CSkVDVCAoaHJlY3YtPmVsZW1lbnQpLAorICAgICAgICAibnVtLXJ0eC1yZXF1ZXN0cyIsICZydHhfcmVxdWVzdHMsCisgICAgICAgICJudW0tcnR4LXBhY2tldHMiLCAmcnR4X3BhY2tldHMsCisgICAgICAgICJudW0tcnR4LWFzc29jLXBhY2tldHMiLCAmcnR4X2Fzc29jX3BhY2tldHMsIE5VTEwpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHJ0eF9wYWNrZXRzLCBwYWNrZXRzX251bSk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAocnR4X3JlcXVlc3RzLCBwYWNrZXRzX251bSk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAocnR4X2Fzc29jX3BhY2tldHMsIHBhY2tldHNfbnVtKTsKKyAgfQorCisgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocHRfbWFwKTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGhyZWN2KTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGhzZW5kKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ydHhzZW5kX3J0eHJlY2VpdmVfd2l0aF9wYWNrZXRfbG9zcykKK3sKKyAgZ3VpbnQgcGFja2V0c19udW0gPSAyMDsKKyAgZ3VpbnQgbWFzdGVyX3NzcmMgPSAxMjM0NTY3OworICBndWludCBtYXN0ZXJfcHQgPSA5NjsKKyAgZ3VpbnQgcnR4X3B0ID0gOTk7CisgIGd1aW50IHNlcW51bSA9IDEwMDsKKyAgZ3VpbnQgZXhwZWN0ZWRfcnR4X3BhY2tldHMgPSAwOworICBHc3RTdHJ1Y3R1cmUgKnB0X21hcDsKKyAgR3N0SGFybmVzcyAqaHJlY3YgPSBnc3RfaGFybmVzc19uZXcgKCJydHBydHhyZWNlaXZlIik7CisgIEdzdEhhcm5lc3MgKmhzZW5kID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwcnR4c2VuZCIpOworICBnaW50IGRyb3BfbnRoX3BhY2tldCwgaTsKKworICBwdF9tYXAgPSBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLXB0LW1hcCIsCisgICAgICAiOTYiLCBHX1RZUEVfVUlOVCwgcnR4X3B0LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChocmVjdi0+ZWxlbWVudCwgInBheWxvYWQtdHlwZS1tYXAiLCBwdF9tYXAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKGhzZW5kLT5lbGVtZW50LCAicGF5bG9hZC10eXBlLW1hcCIsIHB0X21hcCwgTlVMTCk7CisKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzX3N0ciAoaHNlbmQsICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgIm1lZGlhID0gKHN0cmluZyl2aWRlbywgcGF5bG9hZCA9IChpbnQpOTYsICIKKyAgICAgICJzc3JjID0gKHVpbnQpMTIzNDU2NywgY2xvY2stcmF0ZSA9IChpbnQpOTAwMDAsICIKKyAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZylSQVciKTsKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzX3N0ciAoaHJlY3YsICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgIm1lZGlhID0gKHN0cmluZyl2aWRlbywgcGF5bG9hZCA9IChpbnQpOTYsICIKKyAgICAgICJzc3JjID0gKHVpbnQpMTIzNDU2NywgY2xvY2stcmF0ZSA9IChpbnQpOTAwMDAsICIKKyAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZylSQVciKTsKKworICAvKiBHZXR0aW5nIHJpZCBvZiByZWNvbmZpZ3VyZSBldmVudC4gTWFraW5nIHN1cmUgdGhlcmUgaXMgbm8gdXBzdHJlYW0KKyAgICAgZXZlbnRzIGluIHRoZSBxdWV1ZS4gUHJlcGFyYXRpb24gc3RlcCBiZWZvcmUgdGhlIHRlc3QuICovCisgIGdzdF9ldmVudF91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbF91cHN0cmVhbV9ldmVudCAoaHJlY3YpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2hhcm5lc3NfdXBzdHJlYW1fZXZlbnRzX2luX3F1ZXVlIChocmVjdiksIDApOworCisgIC8qIFB1c2ggJ3BhY2tldHNfbnVtJyBwYWNrZXRzIHRocm91Z2ggcnR4c2VuZCB0byBydHhyZWNlaXZlIGxvb3NpbmcgZXZlcnkKKyAgICAgJ2Ryb3BfZXZlcnlfbl9wYWNrZXRzJyBwYWNrZXQuIFdoZW4gd2UgbG9vc2UgdGhlIHBhY2tldCB3ZSBzZW5kIFJUWCBldmVudAorICAgICB0aHJvdWdoIHJ0eHJlY2VpdmUgdG8gcnR4c2VuZCwgYW5kIHZlcmlmeSB0aGUgcGFja2V0IHdhcyByZXRyYW5zbWl0dGVkICovCisgIGZvciAoZHJvcF9udGhfcGFja2V0ID0gMjsgZHJvcF9udGhfcGFja2V0IDwgMTA7ICsrZHJvcF9udGhfcGFja2V0KSB7CisgICAgZm9yIChpID0gMDsgaSA8IHBhY2tldHNfbnVtOyArK2ksICsrc2VxbnVtKSB7CisgICAgICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgICAgIEdzdEJ1ZmZlciAqaW5idWYgPSBjcmVhdGVfcnRwX2J1ZmZlciAobWFzdGVyX3NzcmMsIG1hc3Rlcl9wdCwgc2VxbnVtKTsKKyAgICAgIGdib29sZWFuIGRyb3BfdGhpc19wYWNrZXQgPSAoKGkgKyAxKSAlIGRyb3BfbnRoX3BhY2tldCkgPT0gMDsKKworICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaHNlbmQsIGdzdF9idWZmZXJfcmVmIChpbmJ1ZikpOworICAgICAgaWYgKGRyb3BfdGhpc19wYWNrZXQpIHsKKyAgICAgICAgLyogRHJvcHBpbmcgb3JpZ2luYWwgcGFja2V0ICovCisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGhzZW5kKSk7CisgICAgICAgIC8qIFJlcXVlc3RpbmcgcmV0cmFuc21pc3Npb24gKi8KKyAgICAgICAgZ3N0X2hhcm5lc3NfcHVzaF91cHN0cmVhbV9ldmVudCAoaHJlY3YsCisgICAgICAgICAgICBjcmVhdGVfcnR4X2V2ZW50IChtYXN0ZXJfc3NyYywgbWFzdGVyX3B0LCBzZXFudW0pKTsKKyAgICAgICAgZ3N0X2hhcm5lc3NfcHVzaF91cHN0cmVhbV9ldmVudCAoaHNlbmQsCisgICAgICAgICAgICBnc3RfaGFybmVzc19wdWxsX3Vwc3RyZWFtX2V2ZW50IChocmVjdikpOworICAgICAgICAvKiBQdXNoaW5nIFJUWCBwYWNrZXQgdG8gcnR4cmVjZWl2ZSAqLworICAgICAgICBnc3RfaGFybmVzc19wdXNoIChocmVjdiwgZ3N0X2hhcm5lc3NfcHVsbCAoaHNlbmQpKTsKKyAgICAgICAgKytleHBlY3RlZF9ydHhfcGFja2V0czsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKGhyZWN2LCBnc3RfaGFybmVzc19wdWxsIChoc2VuZCkpOworICAgICAgfQorCisgICAgICAvKiBXZSBtYWtpbmcgc3VyZSBldmVyeSBidWZmZXIgd2UgcHVsbCBpcyB0aGUgc2FtZSBhcyBvcmlnaW5hbCBpbnB1dAorICAgICAgICAgYnVmZmVyICovCisgICAgICBvdXRidWYgPSBnc3RfaGFybmVzc19wdWxsIChocmVjdik7CisgICAgICBjb21wYXJlX3J0cF9wYWNrZXRzIChpbmJ1Ziwgb3V0YnVmKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGluYnVmKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1Zik7CisKKyAgICAgIC8qCisgICAgICAgICBXZSBzaG91bGQgbm90IGhhdmUgYW55IHBhY2tldHMgaW4gdGhlIGhhcm5lc3MgcXVldWUgYnkgdGhpcyBwb2ludC4gSXQKKyAgICAgICAgIG1lYW5zIHJ0eHNlbmQgZGlkbid0IHNlbmQgbW9yZSBwYWNrZXRzIHRoYW4gUlRYIGV2ZW50cyBhbmQgcnR4cmVjZWl2ZQorICAgICAgICAgZGlkbid0IHByb2R1Y2UgbW9yZSB0aGFuIG9uZSBwYWNrZXQgcGVyIFJUWCBwYWNrZXQuCisgICAgICAgKi8KKyAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9oYXJuZXNzX2J1ZmZlcnNfaW5fcXVldWUgKGhzZW5kKSwgMCk7CisgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfaGFybmVzc19idWZmZXJzX2luX3F1ZXVlIChocmVjdiksIDApOworICAgIH0KKyAgfQorCisgIC8qIENoZWNrIFJUWCBzdGF0cyAqLworICB7CisgICAgZ3VpbnQgcnR4X3JlcXVlc3RzOworICAgIGd1aW50IHJ0eF9wYWNrZXRzOworICAgIGd1aW50IHJ0eF9hc3NvY19wYWNrZXRzOworICAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKGhzZW5kLT5lbGVtZW50KSwKKyAgICAgICAgIm51bS1ydHgtcmVxdWVzdHMiLCAmcnR4X3JlcXVlc3RzLAorICAgICAgICAibnVtLXJ0eC1wYWNrZXRzIiwgJnJ0eF9wYWNrZXRzLCBOVUxMKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChydHhfcGFja2V0cywgZXhwZWN0ZWRfcnR4X3BhY2tldHMpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHJ0eF9yZXF1ZXN0cywgZXhwZWN0ZWRfcnR4X3BhY2tldHMpOworCisgICAgZ19vYmplY3RfZ2V0IChHX09CSkVDVCAoaHJlY3YtPmVsZW1lbnQpLAorICAgICAgICAibnVtLXJ0eC1yZXF1ZXN0cyIsICZydHhfcmVxdWVzdHMsCisgICAgICAgICJudW0tcnR4LXBhY2tldHMiLCAmcnR4X3BhY2tldHMsCisgICAgICAgICJudW0tcnR4LWFzc29jLXBhY2tldHMiLCAmcnR4X2Fzc29jX3BhY2tldHMsIE5VTEwpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHJ0eF9wYWNrZXRzLCBleHBlY3RlZF9ydHhfcGFja2V0cyk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAocnR4X3JlcXVlc3RzLCBleHBlY3RlZF9ydHhfcGFja2V0cyk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAocnR4X2Fzc29jX3BhY2tldHMsIGV4cGVjdGVkX3J0eF9wYWNrZXRzKTsKKyAgfQorCisgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocHRfbWFwKTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGhyZWN2KTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGhzZW5kKTsKK30KKworR1NUX0VORF9URVNUOworCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RIYXJuZXNzICpoOworICBndWludCBtYXN0ZXJfc3NyYzsKKyAgZ3VpbnQgbWFzdGVyX3B0OworICBndWludCBydHhfc3NyYzsKKyAgZ3VpbnQgcnR4X3B0OworICBndWludCBzZXFudW07CisgIGd1aW50IGV4cGVjdGVkX3J0eF9wYWNrZXRzOworfSBSdHhTZW5kZXI7CisKK3N0YXRpYyBHc3RTdHJ1Y3R1cmUgKgorY3JlYXRlX3J0eHNlbmRlcnMgKFJ0eFNlbmRlciAqIHNlbmRlcnMsIGd1aW50IHNlbmRlcnNfbnVtKQoreworICBHc3RTdHJ1Y3R1cmUgKnJlY3ZfcHRfbWFwID0KKyAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5ICgiYXBwbGljYXRpb24veC1ydHAtcHQtbWFwIik7CisgIGdpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2VuZGVyc19udW07ICsraSkgeworICAgIGdjaGFyICptYXN0ZXJfcHRfc3RyOworICAgIGdjaGFyICptYXN0ZXJfY2Fwc19zdHI7CisgICAgR3N0U3RydWN0dXJlICpzZW5kX3B0X21hcDsKKworICAgIHNlbmRlcnNbaV0uaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cHJ0eHNlbmQiKTsKKyAgICBzZW5kZXJzW2ldLm1hc3Rlcl9zc3JjID0gMTIzNDU2NyArIGk7CisgICAgc2VuZGVyc1tpXS5ydHhfc3NyYyA9IDc2NTQzMjEgKyBpOworICAgIHNlbmRlcnNbaV0ubWFzdGVyX3B0ID0gODAgKyBpOworICAgIHNlbmRlcnNbaV0ucnR4X3B0ID0gMjAgKyBpOworICAgIHNlbmRlcnNbaV0uc2VxbnVtID0gaSAqIDEwMDA7CisgICAgc2VuZGVyc1tpXS5leHBlY3RlZF9ydHhfcGFja2V0cyA9IDA7CisKKyAgICBtYXN0ZXJfcHRfc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiJXUiLCBzZW5kZXJzW2ldLm1hc3Rlcl9wdCk7CisgICAgbWFzdGVyX2NhcHNfc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZyl2aWRlbywgcGF5bG9hZCA9IChpbnQpJXUsICIKKyAgICAgICAgInNzcmMgPSAodWludCkldSwgY2xvY2stcmF0ZSA9IChpbnQpOTAwMDAsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKVJBVyIsCisgICAgICAgIHNlbmRlcnNbaV0ubWFzdGVyX3B0LCBzZW5kZXJzW2ldLm1hc3Rlcl9zc3JjKTsKKworICAgIHNlbmRfcHRfbWFwID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1wdC1tYXAiLAorICAgICAgICBtYXN0ZXJfcHRfc3RyLCBHX1RZUEVfVUlOVCwgc2VuZGVyc1tpXS5ydHhfcHQsIE5VTEwpOworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChyZWN2X3B0X21hcCwKKyAgICAgICAgbWFzdGVyX3B0X3N0ciwgR19UWVBFX1VJTlQsIHNlbmRlcnNbaV0ucnR4X3B0LCBOVUxMKTsKKworICAgIGdfb2JqZWN0X3NldCAoc2VuZGVyc1tpXS5oLT5lbGVtZW50LCAicGF5bG9hZC10eXBlLW1hcCIsIHNlbmRfcHRfbWFwLCBOVUxMKTsKKyAgICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHNfc3RyIChzZW5kZXJzW2ldLmgsIG1hc3Rlcl9jYXBzX3N0cik7CisKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHNlbmRfcHRfbWFwKTsKKyAgICBnX2ZyZWUgKG1hc3Rlcl9wdF9zdHIpOworICAgIGdfZnJlZSAobWFzdGVyX2NhcHNfc3RyKTsKKyAgfQorICByZXR1cm4gcmVjdl9wdF9tYXA7Cit9CisKK3N0YXRpYyBndWludAorY2hlY2tfcnR4c2VuZGVyc19zdGF0c19hbmRfdGVhcmRvd24gKFJ0eFNlbmRlciAqIHNlbmRlcnMsIGd1aW50IHNlbmRlcnNfbnVtKQoreworICBndWludCB0b3RhbF9wYWtldHNfbnVtID0gMDsKKyAgZ2ludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBzZW5kZXJzX251bTsgKytpKSB7CisgICAgZ3VpbnQgcnR4X3JlcXVlc3RzOworICAgIGd1aW50IHJ0eF9wYWNrZXRzOworICAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKHNlbmRlcnNbaV0uaC0+ZWxlbWVudCksCisgICAgICAgICJudW0tcnR4LXJlcXVlc3RzIiwgJnJ0eF9yZXF1ZXN0cywKKyAgICAgICAgIm51bS1ydHgtcGFja2V0cyIsICZydHhfcGFja2V0cywgTlVMTCk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAocnR4X3BhY2tldHMsIHNlbmRlcnNbaV0uZXhwZWN0ZWRfcnR4X3BhY2tldHMpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHJ0eF9yZXF1ZXN0cywgc2VuZGVyc1tpXS5leHBlY3RlZF9ydHhfcGFja2V0cyk7CisgICAgdG90YWxfcGFrZXRzX251bSArPSBydHhfcGFja2V0czsKKworICAgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChzZW5kZXJzW2ldLmgpOworICB9CisgIHJldHVybiB0b3RhbF9wYWtldHNfbnVtOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tdWx0aV9ydHhzZW5kX3J0eHJlY2VpdmVfd2l0aF9wYWNrZXRfbG9zcykKK3sKKyAgZ3VpbnQgc2VuZGVyc19udW0gPSA1OworICBndWludCBwYWNrZXRzX251bSA9IDEwOworICBndWludCB0b3RhbF9wYWtldHNfbnVtID0gc2VuZGVyc19udW0gKiBwYWNrZXRzX251bTsKKyAgZ3VpbnQgdG90YWxfZHJvcHBlZF9wYWNrZXRzID0gMDsKKyAgUnR4U2VuZGVyIHNlbmRlcnNbNV07CisgIEdzdFN0cnVjdHVyZSAqcHRfbWFwOworICBHc3RIYXJuZXNzICpocmVjdiA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cHJ0eHJlY2VpdmUiKTsKKyAgZ2ludCBkcm9wX250aF9wYWNrZXQsIGksIGo7CisKKyAgcHRfbWFwID0gY3JlYXRlX3J0eHNlbmRlcnMgKHNlbmRlcnMsIDUpOworICBnX29iamVjdF9zZXQgKGhyZWN2LT5lbGVtZW50LCAicGF5bG9hZC10eXBlLW1hcCIsIHB0X21hcCwgTlVMTCk7CisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGhyZWN2LCAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICJtZWRpYSA9IChzdHJpbmcpdmlkZW8sIHBheWxvYWQgPSAoaW50KTgwLCAiCisgICAgICAic3NyYyA9ICh1aW50KTEyMzQ1NjcsIGNsb2NrLXJhdGUgPSAoaW50KTkwMDAwLCAiCisgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpUkFXIik7CisKKyAgLyogR2V0dGluZyByaWQgb2YgcmVjb25maWd1cmUgZXZlbnQuIE1ha2luZyBzdXJlIHRoZXJlIGlzIG5vIHVwc3RyZWFtCisgICAgIGV2ZW50cyBpbiB0aGUgcXVldWUuIFByZXBhcmF0aW9uIHN0ZXAgYmVmb3JlIHRoZSB0ZXN0LiAqLworICBnc3RfZXZlbnRfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGxfdXBzdHJlYW1fZXZlbnQgKGhyZWN2KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9oYXJuZXNzX3Vwc3RyZWFtX2V2ZW50c19pbl9xdWV1ZSAoaHJlY3YpLCAwKTsKKworICAvKiBXZSBhcmUgZ29pbmcgdG8gcHVzaCB0aGUgMXN0IHBhY2tldCBmcm9tIHRoZSAxc3Qgc2VuZGVyLCAybmQgZnJvbSB0aGUgMm5kLAorICAgICAzcmQgZnJvbSB0aGUgM3JkLCBldGMuIHVudGlsIGFsbCB0aGUgc2VuZGVycyB3aWxsIHB1c2ggJ3BhY2tldHNfbnVtJyBwYWNrZXRzLgorICAgICBXZSB3aWxsIGRyb3AgZXZlcnkgJ2Ryb3BfbnRoX3BhY2tldCcgcGFja2V0IGFuZCByZXF1ZXN0IGl0cyByZXRyYW5zbWlzc2lvbgorICAgICBmcm9tIGFsbCB0aGUgc2VuZGVycy4gQmVjYXVzZSBvbmx5IG9uZSBvZiB0aGVtIGNhbiBwcm9kdWNlIFJUWCBwYWNrZXQuCisgICAgIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIG90aGVyIHNlbmRlcnMgd2lsbCBpZ25vcmUgdGhlIFJUWCBldmVudCB0aGV5CisgICAgIGNhbid0IGFjdCB1cG9uLgorICAgKi8KKyAgZm9yIChkcm9wX250aF9wYWNrZXQgPSAyOyBkcm9wX250aF9wYWNrZXQgPCA1OyArK2Ryb3BfbnRoX3BhY2tldCkgeworICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbF9wYWtldHNfbnVtOyArK2kpIHsKKyAgICAgIFJ0eFNlbmRlciAqc2VuZGVyID0gJnNlbmRlcnNbaSAlIHNlbmRlcnNfbnVtXTsKKyAgICAgIGdib29sZWFuIGRyb3BfdGhpc19wYWNrZXQgPSAoKGkgKyAxKSAlIGRyb3BfbnRoX3BhY2tldCkgPT0gMDsKKyAgICAgIEdzdEJ1ZmZlciAqb3V0YnVmLCAqaW5idWY7CisgICAgICBpbmJ1ZiA9CisgICAgICAgICAgY3JlYXRlX3J0cF9idWZmZXIgKHNlbmRlci0+bWFzdGVyX3NzcmMsIHNlbmRlci0+bWFzdGVyX3B0LAorICAgICAgICAgIHNlbmRlci0+c2VxbnVtKTsKKworICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoc2VuZGVyLT5oLCBnc3RfYnVmZmVyX3JlZiAoaW5idWYpKTsKKyAgICAgIGlmIChkcm9wX3RoaXNfcGFja2V0KSB7CisgICAgICAgIEdzdEV2ZW50ICpydHhldmVudDsKKyAgICAgICAgLyogRHJvcHBpbmcgb3JpZ2luYWwgcGFja2V0ICovCisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKHNlbmRlci0+aCkpOworCisgICAgICAgIC8qIFB1c2hpbmcgUlRYIGV2ZW50IHRocm91Z2ggcnR4cmVjZWl2ZSB0byBhbGwgdGhlIHNlbmRlcnMgKi8KKyAgICAgICAgZ3N0X2hhcm5lc3NfcHVzaF91cHN0cmVhbV9ldmVudCAoaHJlY3YsCisgICAgICAgICAgICBjcmVhdGVfcnR4X2V2ZW50IChzZW5kZXItPm1hc3Rlcl9zc3JjLCBzZW5kZXItPm1hc3Rlcl9wdCwKKyAgICAgICAgICAgICAgICBzZW5kZXItPnNlcW51bSkpOworICAgICAgICBydHhldmVudCA9IGdzdF9oYXJuZXNzX3B1bGxfdXBzdHJlYW1fZXZlbnQgKGhyZWN2KTsKKworICAgICAgICAvKiAuLi4gdG8gYWxsIHRoZSBzZW5kZXJzICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzZW5kZXJzX251bTsgKytqKQorICAgICAgICAgIGdzdF9oYXJuZXNzX3B1c2hfdXBzdHJlYW1fZXZlbnQgKHNlbmRlcnNbal0uaCwKKyAgICAgICAgICAgICAgZ3N0X2V2ZW50X3JlZiAocnR4ZXZlbnQpKTsKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChydHhldmVudCk7CisKKyAgICAgICAgLyogUHVzaGluZyBSVFggcGFja2V0IHRvIHJ0eHJlY2VpdmUgKi8KKyAgICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaHJlY3YsIGdzdF9oYXJuZXNzX3B1bGwgKHNlbmRlci0+aCkpOworICAgICAgICArK3NlbmRlci0+ZXhwZWN0ZWRfcnR4X3BhY2tldHM7CisgICAgICAgICsrdG90YWxfZHJvcHBlZF9wYWNrZXRzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaHJlY3YsIGdzdF9oYXJuZXNzX3B1bGwgKHNlbmRlci0+aCkpOworICAgICAgfQorCisgICAgICAvKiBJdCBzaG91bGQgbm90IG1hdHRlciB3aGV0aGVyIHRoZSBidWZmZXIgd2FzIGRyb3BwZWQgKGFuZCByZXRyYW5zbWl0dGVkKQorICAgICAgICAgb3IgaXQgd2VudCBzdHJhaWdodCB0aHJvdWdoIHJ0eHNlbmQgdG8gcnR4cmVjZWl2ZS4gV2Ugc2hvdWxkIGFsd2F5cyBwdWxsCisgICAgICAgICB0aGUgc2FtZSBidWZmZXIgdGhhdCB3YXMgcHVzaGVkICovCisgICAgICBvdXRidWYgPSBnc3RfaGFybmVzc19wdWxsIChocmVjdik7CisgICAgICBjb21wYXJlX3J0cF9wYWNrZXRzIChpbmJ1Ziwgb3V0YnVmKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGluYnVmKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1Zik7CisKKyAgICAgIC8qCisgICAgICAgICBXZSBzaG91bGQgbm90IGhhdmUgYW55IHBhY2tldHMgaW4gdGhlIGhhcm5lc3MgcXVldWUgYnkgdGhpcyBwb2ludC4gSXQKKyAgICAgICAgIG1lYW5zIG91ciBzZW5kZXJzIGRpZG4ndCBwcm9kdWNlIHRoZSBwYWNrZXRzIGZvciB0aGUgdW5rbm93biBSVFggZXZlbnQuCisgICAgICAgKi8KKyAgICAgIGZvciAoaiA9IDA7IGogPCBzZW5kZXJzX251bTsgKytqKQorICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfaGFybmVzc19idWZmZXJzX2luX3F1ZXVlIChzZW5kZXJzW2pdLmgpLCAwKTsKKworICAgICAgKytzZW5kZXItPnNlcW51bTsKKyAgICB9CisgIH0KKworICAvKiBDaGVjayBSVFggc3RhdHMgKi8KKyAgeworICAgIGd1aW50IHRvdGFsX3J0eF9wYWNrZXRzOworICAgIGd1aW50IHJ0eF9yZXF1ZXN0czsKKyAgICBndWludCBydHhfcGFja2V0czsKKyAgICBndWludCBydHhfYXNzb2NfcGFja2V0czsKKworICAgIHRvdGFsX3J0eF9wYWNrZXRzID0KKyAgICAgICAgY2hlY2tfcnR4c2VuZGVyc19zdGF0c19hbmRfdGVhcmRvd24gKHNlbmRlcnMsIHNlbmRlcnNfbnVtKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICh0b3RhbF9ydHhfcGFja2V0cywgdG90YWxfZHJvcHBlZF9wYWNrZXRzKTsKKworICAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKGhyZWN2LT5lbGVtZW50KSwKKyAgICAgICAgIm51bS1ydHgtcmVxdWVzdHMiLCAmcnR4X3JlcXVlc3RzLAorICAgICAgICAibnVtLXJ0eC1wYWNrZXRzIiwgJnJ0eF9wYWNrZXRzLAorICAgICAgICAibnVtLXJ0eC1hc3NvYy1wYWNrZXRzIiwgJnJ0eF9hc3NvY19wYWNrZXRzLCBOVUxMKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChydHhfcGFja2V0cywgdG90YWxfcnR4X3BhY2tldHMpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHJ0eF9yZXF1ZXN0cywgdG90YWxfcnR4X3BhY2tldHMpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHJ0eF9hc3NvY19wYWNrZXRzLCB0b3RhbF9ydHhfcGFja2V0cyk7CisgIH0KKworICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHB0X21hcCk7CisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChocmVjdik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIHZvaWQKK3Rlc3RfcnR4c2VuZGVyX3BhY2tldF9yZXRlbnRpb24gKGdib29sZWFuIHRlc3Rfd2l0aF90aW1lKQoreworICBndWludCBtYXN0ZXJfc3NyYyA9IDEyMzQ1Njc7CisgIGd1aW50IG1hc3Rlcl9wdCA9IDk2OworICBndWludCBydHhfc3NyYyA9IDc2NTQzMjE7CisgIGd1aW50IHJ0eF9wdCA9IDk5OworICBnaW50IG51bV9idWZmZXJzID0gdGVzdF93aXRoX3RpbWUgPyAzMCA6IDEwOworICBnaW50IGhhbGZfYnVmZmVycyA9IG51bV9idWZmZXJzIC8gMjsKKyAgZ3VpbnQgdGltZXN0YW1wX2RlbHRhID0gOTAwMDAgLyAzMDsKKyAgZ3VpbnQgdGltZXN0YW1wID0gR19NQVhVSU5UMzIgLSBoYWxmX2J1ZmZlcnMgKiB0aW1lc3RhbXBfZGVsdGE7CisgIEdzdEhhcm5lc3MgKmg7CisgIEdzdFN0cnVjdHVyZSAqcHRfbWFwID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1wdC1tYXAiLAorICAgICAgIjk2IiwgR19UWVBFX1VJTlQsIHJ0eF9wdCwgTlVMTCk7CisgIEdzdFN0cnVjdHVyZSAqc3NyY19tYXAgPSBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLXNzcmMtbWFwIiwKKyAgICAgICIxMjM0NTY3IiwgR19UWVBFX1VJTlQsIHJ0eF9zc3JjLCBOVUxMKTsKKyAgZ2ludCBpLCBqOworCisgIGggPSBnc3RfaGFybmVzc19uZXcgKCJydHBydHhzZW5kIik7CisKKyAgLyogSW4gYm90aCBjYXNlcyB3ZSB3YW50IHRoZSBydHhzZW5kIHF1ZXVlIHRvIHN0b3JlICdoYWxmX2J1ZmZlcnMnCisgICAgIGFtb3VudCBvZiBidWZmZXJzIGF0IG1vc3QuIEluIG1heC1zaXplLXBhY2tldHMgbW9kZSwgaXQncyB0cml2aWFsLgorICAgICBJbiBtYXgtc2l6ZS10aW1lIG1vZGUsIHdlIHNwZWNpZnkgYWxtb3N0IGhhbGYgYSBzZWNvbmQsIHdoaWNoIGlzCisgICAgIHRoZSBlcXVpdmFsZW50IG9mIDE1IGZyYW1lcyBpbiBhIDMwZnBzIHZpZGVvIHN0cmVhbS4KKyAgICovCisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwKKyAgICAgICJtYXgtc2l6ZS1wYWNrZXRzIiwgdGVzdF93aXRoX3RpbWUgPyAwIDogaGFsZl9idWZmZXJzLAorICAgICAgIm1heC1zaXplLXRpbWUiLCB0ZXN0X3dpdGhfdGltZSA/IDQ5OSA6IDAsCisgICAgICAicGF5bG9hZC10eXBlLW1hcCIsIHB0X21hcCwgInNzcmMtbWFwIiwgc3NyY19tYXAsIE5VTEwpOworCisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgsICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgIm1lZGlhID0gKHN0cmluZyl2aWRlbywgcGF5bG9hZCA9IChpbnQpOTYsICIKKyAgICAgICJzc3JjID0gKHVpbnQpMTIzNDU2NywgY2xvY2stcmF0ZSA9IChpbnQpOTAwMDAsICIKKyAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZylSQVciKTsKKworICAvKiBOb3cgcHVzaCBhbGwgYnVmZmVycyBhbmQgcmVxdWVzdCByZXRyYW5zbWlzc2lvbiBldmVyeSB0aW1lIGZvciBhbGwgb2YgdGhlbSAqLworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2J1ZmZlcnM7ICsraSwgdGltZXN0YW1wICs9IHRpbWVzdGFtcF9kZWx0YSkgeworICAgIC8qIFJlcXVlc3QgdG8gcmV0cmFuc21pdCBhbGwgdGhlIHByZXZpb3VzIG9uZXMgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgaTsgKytqKSB7CisgICAgICBndWludCBydHhfc2VxbnVtID0gMHgxMDAgKyBqOworICAgICAgZ3N0X2hhcm5lc3NfcHVzaF91cHN0cmVhbV9ldmVudCAoaCwKKyAgICAgICAgICBjcmVhdGVfcnR4X2V2ZW50IChtYXN0ZXJfc3NyYywgbWFzdGVyX3B0LCBydHhfc2VxbnVtKSk7CisKKyAgICAgIC8qIFB1bGwgb25seSB0aGUgb25lcyBzdXBwb3NlZCB0byBiZSByZXRyYW5zbWl0ZWQgKi8KKyAgICAgIGlmIChqID49IGkgLSBoYWxmX2J1ZmZlcnMpCisgICAgICAgIHB1bGxfYW5kX3ZlcmlmeSAoaCwgVFJVRSwgcnR4X3NzcmMsIHJ0eF9wdCwgcnR4X3NlcW51bSk7CisgICAgfQorICAgIC8qIENoZWNrIHRoZXJlIG5vIGV4dHJhIGJ1ZmZlcnMgaW4gdGhlIGhhcm5lc3MgcXVldWUgKi8KKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfaGFybmVzc19idWZmZXJzX2luX3F1ZXVlIChoKSwgMCk7CisKKyAgICAvKiBXZSBjcmVhdGUgUlRQIGJ1ZmZlcnMgd2l0aCB0aW1lc3RhbXBzIHRoYXQgd2lsbCBldmVudHVhbHkgd3JhcCBhcm91bmQgMAorICAgICAgIHRvIGJlIHN1cmUsIHJ0cHJ0eHNlbmQgY2FuIGhhbmRsZSBpdCBwcm9wZXJseSAqLworICAgIHB1c2hfcHVsbF9hbmRfdmVyaWZ5IChoLAorICAgICAgICBjcmVhdGVfcnRwX2J1ZmZlcl93aXRoX3RpbWVzdGFtcCAobWFzdGVyX3NzcmMsIG1hc3Rlcl9wdCwgMHgxMDAgKyBpLAorICAgICAgICAgICAgdGltZXN0YW1wKSwgRkFMU0UsIG1hc3Rlcl9zc3JjLCBtYXN0ZXJfcHQsIDB4MTAwICsgaSk7CisgIH0KKworICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHB0X21hcCk7CisgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoc3NyY19tYXApOworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3J0eHNlbmRlcl9tYXhfc2l6ZV9wYWNrZXRzKQoreworICB0ZXN0X3J0eHNlbmRlcl9wYWNrZXRfcmV0ZW50aW9uIChGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnR4c2VuZGVyX21heF9zaXplX3RpbWUpCit7CisgIHRlc3RfcnR4c2VuZGVyX3BhY2tldF9yZXRlbnRpb24gKFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyB2b2lkCit0ZXN0X3J0eHF1ZXVlX3BhY2tldF9yZXRlbnRpb24gKGdib29sZWFuIHRlc3Rfd2l0aF90aW1lKQoreworICBndWludCBzc3JjID0gMTIzNDU2NzsKKyAgZ3VpbnQgcHQgPSA5NjsKKyAgZ2ludCBudW1fYnVmZmVycyA9IHRlc3Rfd2l0aF90aW1lID8gMzAgOiAxMDsKKyAgZ2ludCBoYWxmX2J1ZmZlcnMgPSBudW1fYnVmZmVycyAvIDI7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXBfZGVsdGEgPSBHU1RfU0VDT05EIC8gMzA7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAgPSAwOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0SGFybmVzcyAqaDsKKyAgZ2ludCBpLCBqOworCisgIGggPSBnc3RfaGFybmVzc19uZXcgKCJydHBydHhxdWV1ZSIpOworCisgIC8qIEluIGJvdGggY2FzZXMgd2Ugd2FudCB0aGUgcnR4cXVldWUgdG8gc3RvcmUgJ2hhbGZfYnVmZmVycycKKyAgICAgYW1vdW50IG9mIGJ1ZmZlcnMgYXQgbW9zdC4gSW4gbWF4LXNpemUtcGFja2V0cyBtb2RlLCBpdCdzIHRyaXZpYWwuCisgICAgIEluIG1heC1zaXplLXRpbWUgbW9kZSwgd2Ugc3BlY2lmeSBhbG1vc3QgaGFsZiBhIHNlY29uZCwgd2hpY2ggaXMKKyAgICAgdGhlIGVxdWl2YWxlbnQgb2YgMTUgZnJhbWVzIGluIGEgMzBmcHMgdmlkZW8gc3RyZWFtLgorICAgKi8KKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LAorICAgICAgIm1heC1zaXplLXBhY2tldHMiLCB0ZXN0X3dpdGhfdGltZSA/IDAgOiBoYWxmX2J1ZmZlcnMsCisgICAgICAibWF4LXNpemUtdGltZSIsIHRlc3Rfd2l0aF90aW1lID8gNDk4IDogMCwgTlVMTCk7CisKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzX3N0ciAoaCwgImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAibWVkaWEgPSAoc3RyaW5nKXZpZGVvLCBwYXlsb2FkID0gKGludCk5NiwgIgorICAgICAgInNzcmMgPSAodWludCkxMjM0NTY3LCBjbG9jay1yYXRlID0gKGludCk5MDAwMCwgIgorICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKVJBVyIpOworCisgIC8qIE5vdyBwdXNoIGFsbCBidWZmZXJzIGFuZCByZXF1ZXN0IHJldHJhbnNtaXNzaW9uIGV2ZXJ5IHRpbWUgZm9yIGFsbCBvZiB0aGVtLgorICAgKiBOb3RlIHRoYXQgcnRwcnR4cXVldWUgc2VuZHMgcmV0cmFuc21pc3Npb25zIGluIGNoYWluKCksIGp1c3QgYmVmb3JlCisgICAqIHB1c2hpbmcgb3V0IHRoZSBjaGFpbmVkIGJ1ZmZlciwgYSBkaWZmZXJlbnRpYXRpb24gZnJvbSBydHBydHhzZW5kIGFib3ZlCisgICAqLworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2J1ZmZlcnM7ICsraSwgdGltZXN0YW1wICs9IHRpbWVzdGFtcF9kZWx0YSkgeworICAgIC8qIFJlcXVlc3QgdG8gcmV0cmFuc21pdCBhbGwgdGhlIHByZXZpb3VzIG9uZXMgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgaTsgKytqKSB7CisgICAgICBndWludCBydHhfc2VxbnVtID0gMHgxMDAgKyBqOworICAgICAgZ3N0X2hhcm5lc3NfcHVzaF91cHN0cmVhbV9ldmVudCAoaCwKKyAgICAgICAgICBjcmVhdGVfcnR4X2V2ZW50IChzc3JjLCBwdCwgcnR4X3NlcW51bSkpOworICAgIH0KKworICAgIC8qIHB1c2ggb25lIHBhY2tldCAqLworICAgIGJ1ZiA9IGNyZWF0ZV9ydHBfYnVmZmVyIChzc3JjLCBwdCwgMHgxMDAgKyBpKTsKKyAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKSA9IHRpbWVzdGFtcDsKKyAgICBnc3RfaGFybmVzc19wdXNoIChoLCBidWYpOworCisgICAgLyogUHVsbCB0aGUgb25lcyBzdXBwb3NlZCB0byBiZSByZXRyYW5zbWl0dGVkICovCisgICAgZm9yIChqID0gMDsgaiA8IGk7ICsraikgeworICAgICAgZ3VpbnQgcnR4X3NlcW51bSA9IDB4MTAwICsgajsKKyAgICAgIGlmIChqID49IGkgLSBoYWxmX2J1ZmZlcnMpCisgICAgICAgIHB1bGxfYW5kX3ZlcmlmeSAoaCwgRkFMU0UsIHNzcmMsIHB0LCBydHhfc2VxbnVtKTsKKyAgICB9CisKKyAgICAvKiBUaGVyZSBzaG91bGQgYmUgb25seSBvbmUgcGFja2V0IHJlbWFpbmluZyBpbiB0aGUgcXVldWUgbm93ICovCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2hhcm5lc3NfYnVmZmVyc19pbl9xdWV1ZSAoaCksIDEpOworCisgICAgLyogcHVsbCB0aGUgb25lIHRoYXQgd2UganVzdCBwdXNoZWQgKGNvbWVzIGFmdGVyIHRoZSByZXRyYW5zbWl0dGVkIG9uZXMpICovCisgICAgcHVsbF9hbmRfdmVyaWZ5IChoLCBGQUxTRSwgc3NyYywgcHQsIDB4MTAwICsgaSk7CisKKyAgICAvKiBDaGVjayB0aGVyZSBubyBleHRyYSBidWZmZXJzIGluIHRoZSBoYXJuZXNzIHF1ZXVlICovCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2hhcm5lc3NfYnVmZmVyc19pbl9xdWV1ZSAoaCksIDApOworICB9CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ydHhxdWV1ZV9tYXhfc2l6ZV9wYWNrZXRzKQoreworICB0ZXN0X3J0eHF1ZXVlX3BhY2tldF9yZXRlbnRpb24gKEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ydHhxdWV1ZV9tYXhfc2l6ZV90aW1lKQoreworICB0ZXN0X3J0eHF1ZXVlX3BhY2tldF9yZXRlbnRpb24gKFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitydHBydHhfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgicnRwcnR4Iik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICB0Y2FzZV9zZXRfdGltZW91dCAodGNfY2hhaW4sIDEyMCk7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3J0eHNlbmRfcnR4cmVjZWl2ZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ydHhzZW5kX3J0eHJlY2VpdmVfd2l0aF9wYWNrZXRfbG9zcyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9tdWx0aV9ydHhzZW5kX3J0eHJlY2VpdmVfd2l0aF9wYWNrZXRfbG9zcyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ydHhzZW5kZXJfbWF4X3NpemVfcGFja2V0cyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ydHhzZW5kZXJfbWF4X3NpemVfdGltZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ydHhxdWV1ZV9tYXhfc2l6ZV9wYWNrZXRzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3J0eHF1ZXVlX21heF9zaXplX3RpbWUpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAocnRwcnR4KTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHNlc3Npb24uYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHNlc3Npb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDkyNWVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwc2Vzc2lvbi5jCkBAIC0wLDAgKzEsNzI2IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIGdzdHJ0cHNlc3Npb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEzIENvbGxhYm9yYSBMdGQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNkZWZpbmUgR0xJQl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0aGFybmVzcy5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3R0ZXN0Y2xvY2suaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0aGFybmVzcy5oPgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0Y3BidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvbmV0L2dzdG5ldGFkZHJlc3NtZXRhLmg+CisKKyNkZWZpbmUgVEVTVF9CVUZfQ0xPQ0tfUkFURSA4MDAwCisjZGVmaW5lIFRFU1RfQlVGX1BUIDAKKyNkZWZpbmUgVEVTVF9CVUZfU1NSQyAweDAxQkFEQkFECisjZGVmaW5lIFRFU1RfQlVGX01TICAyMAorI2RlZmluZSBURVNUX0JVRl9EVVJBVElPTiAoVEVTVF9CVUZfTVMgKiBHU1RfTVNFQ09ORCkKKyNkZWZpbmUgVEVTVF9CVUZfU0laRSAoNjQwMDAgKiBURVNUX0JVRl9NUyAvIDEwMDApCisjZGVmaW5lIFRFU1RfUlRQX1RTX0RVUkFUSU9OIChURVNUX0JVRl9DTE9DS19SQVRFICogVEVTVF9CVUZfTVMgLyAxMDAwKQorCitzdGF0aWMgR3N0Q2FwcyAqCitnZW5lcmF0ZV9jYXBzICh2b2lkKQoreworICByZXR1cm4gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtcnRwIiwKKyAgICAgICJjbG9jay1yYXRlIiwgR19UWVBFX0lOVCwgVEVTVF9CVUZfQ0xPQ0tfUkFURSwKKyAgICAgICJwYXlsb2FkIiwgR19UWVBFX0lOVCwgVEVTVF9CVUZfUFQsCisgICAgICBOVUxMKTsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnZW5lcmF0ZV90ZXN0X2J1ZmZlcl9mdWxsIChHc3RDbG9ja1RpbWUgZHRzLAorICAgIGd1aW50IHNlcV9udW0sIGd1aW50MzIgcnRwX3RzLCBndWludCBzc3JjKQoreworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgZ3VpbnQ4ICpwYXlsb2FkOworICBndWludCBpOworICBHc3RSVFBCdWZmZXIgcnRwID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKworICBidWYgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKFRFU1RfQlVGX1NJWkUsIDAsIDApOworICBHU1RfQlVGRkVSX0RUUyAoYnVmKSA9IGR0czsKKworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKGJ1ZiwgR1NUX01BUF9SRUFEV1JJVEUsICZydHApOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfcGF5bG9hZF90eXBlICgmcnRwLCBURVNUX0JVRl9QVCk7CisgIGdzdF9ydHBfYnVmZmVyX3NldF9zZXEgKCZydHAsIHNlcV9udW0pOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfdGltZXN0YW1wICgmcnRwLCBydHBfdHMpOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfc3NyYyAoJnJ0cCwgc3NyYyk7CisKKyAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKTsKKyAgZm9yIChpID0gMDsgaSA8IFRFU1RfQlVGX1NJWkU7IGkrKykKKyAgICBwYXlsb2FkW2ldID0gMHhmZjsKKworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnZW5lcmF0ZV90ZXN0X2J1ZmZlciAoZ3VpbnQgc2VxX251bSwgZ3VpbnQgc3NyYykKK3sKKyAgcmV0dXJuIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKHNlcV9udW0gKiBURVNUX0JVRl9EVVJBVElPTiwKKyAgICAgIHNlcV9udW0sIHNlcV9udW0gKiBURVNUX1JUUF9UU19EVVJBVElPTiwgc3NyYyk7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEdzdEhhcm5lc3MgKnNlbmRfcnRwX2g7CisgIEdzdEhhcm5lc3MgKnJlY3ZfcnRwX2g7CisgIEdzdEhhcm5lc3MgKnJ0Y3BfaDsKKworICBHc3RFbGVtZW50ICpzZXNzaW9uOworICBHT2JqZWN0ICppbnRlcm5hbF9zZXNzaW9uOworICBHc3RUZXN0Q2xvY2sgKnRlc3RjbG9jazsKKyAgR3N0Q2FwcyAqY2FwczsKK30gU2Vzc2lvbkhhcm5lc3M7CisKK3N0YXRpYyBHc3RDYXBzICoKK19wdF9tYXBfcmVxdWVzdGVkIChHc3RFbGVtZW50ICogZWxlbWVudCwgZ3VpbnQgcHQsIGdwb2ludGVyIGRhdGEpCit7CisgIFNlc3Npb25IYXJuZXNzICpoID0gZGF0YTsKKyAgcmV0dXJuIGdzdF9jYXBzX2NvcHkgKGgtPmNhcHMpOworfQorCitzdGF0aWMgU2Vzc2lvbkhhcm5lc3MgKgorc2Vzc2lvbl9oYXJuZXNzX25ldyAodm9pZCkKK3sKKyAgU2Vzc2lvbkhhcm5lc3MgKmggPSBnX25ldzAgKFNlc3Npb25IYXJuZXNzLCAxKTsKKyAgaC0+Y2FwcyA9IGdlbmVyYXRlX2NhcHMgKCk7CisKKyAgaC0+dGVzdGNsb2NrID0gR1NUX1RFU1RfQ0xPQ0tfQ0FTVCAoZ3N0X3Rlc3RfY2xvY2tfbmV3ICgpKTsKKyAgZ3N0X3N5c3RlbV9jbG9ja19zZXRfZGVmYXVsdCAoR1NUX0NMT0NLX0NBU1QgKGgtPnRlc3RjbG9jaykpOworCisgIGgtPnNlc3Npb24gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBzZXNzaW9uIiwgTlVMTCk7CisgIGdzdF9lbGVtZW50X3NldF9jbG9jayAoaC0+c2Vzc2lvbiwgR1NUX0NMT0NLX0NBU1QgKGgtPnRlc3RjbG9jaykpOworCisgIGgtPnNlbmRfcnRwX2ggPSBnc3RfaGFybmVzc19uZXdfd2l0aF9lbGVtZW50IChoLT5zZXNzaW9uLAorICAgICAgInNlbmRfcnRwX3NpbmsiLCAic2VuZF9ydHBfc3JjIik7CisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2FwcyAoaC0+c2VuZF9ydHBfaCwgZ3N0X2NhcHNfY29weSAoaC0+Y2FwcykpOworCisgIGgtPnJlY3ZfcnRwX2ggPSBnc3RfaGFybmVzc19uZXdfd2l0aF9lbGVtZW50IChoLT5zZXNzaW9uLAorICAgICAgInJlY3ZfcnRwX3NpbmsiLCAicmVjdl9ydHBfc3JjIik7CisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2FwcyAoaC0+cmVjdl9ydHBfaCwgZ3N0X2NhcHNfY29weSAoaC0+Y2FwcykpOworCisgIGgtPnJ0Y3BfaCA9IGdzdF9oYXJuZXNzX25ld193aXRoX2VsZW1lbnQgKGgtPnNlc3Npb24sCisgICAgICAicmVjdl9ydGNwX3NpbmsiLCAic2VuZF9ydGNwX3NyYyIpOworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHNfc3RyIChoLT5ydGNwX2gsICJhcHBsaWNhdGlvbi94LXJ0Y3AiKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChoLT5zZXNzaW9uLCAicmVxdWVzdC1wdC1tYXAiLAorICAgICAgKEdDYWxsYmFjaykgX3B0X21hcF9yZXF1ZXN0ZWQsIGgpOworCisgIGdfb2JqZWN0X2dldCAoaC0+c2Vzc2lvbiwgImludGVybmFsLXNlc3Npb24iLCAmaC0+aW50ZXJuYWxfc2Vzc2lvbiwgTlVMTCk7CisKKyAgcmV0dXJuIGg7Cit9CisKK3N0YXRpYyB2b2lkCitzZXNzaW9uX2hhcm5lc3NfZnJlZSAoU2Vzc2lvbkhhcm5lc3MgKiBoKQoreworICBnc3Rfc3lzdGVtX2Nsb2NrX3NldF9kZWZhdWx0IChOVUxMKTsKKworICBnc3RfY2Fwc191bnJlZiAoaC0+Y2Fwcyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGgtPnRlc3RjbG9jayk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgtPnJ0Y3BfaCk7CisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoLT5yZWN2X3J0cF9oKTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgtPnNlbmRfcnRwX2gpOworCisgIGdfb2JqZWN0X3VucmVmIChoLT5pbnRlcm5hbF9zZXNzaW9uKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoaC0+c2Vzc2lvbik7CisgIGdfZnJlZSAoaCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitzZXNzaW9uX2hhcm5lc3Nfc2VuZF9ydHAgKFNlc3Npb25IYXJuZXNzICogaCwgR3N0QnVmZmVyICogYnVmKQoreworICByZXR1cm4gZ3N0X2hhcm5lc3NfcHVzaCAoaC0+c2VuZF9ydHBfaCwgYnVmKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK3Nlc3Npb25faGFybmVzc19yZWN2X3J0cCAoU2Vzc2lvbkhhcm5lc3MgKiBoLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIHJldHVybiBnc3RfaGFybmVzc19wdXNoIChoLT5yZWN2X3J0cF9oLCBidWYpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorc2Vzc2lvbl9oYXJuZXNzX3JlY3ZfcnRjcCAoU2Vzc2lvbkhhcm5lc3MgKiBoLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIHJldHVybiBnc3RfaGFybmVzc19wdXNoIChoLT5ydGNwX2gsIGJ1Zik7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorc2Vzc2lvbl9oYXJuZXNzX3B1bGxfcnRjcCAoU2Vzc2lvbkhhcm5lc3MgKiBoKQoreworICByZXR1cm4gZ3N0X2hhcm5lc3NfcHVsbCAoaC0+cnRjcF9oKTsKK30KKworc3RhdGljIHZvaWQKK3Nlc3Npb25faGFybmVzc19jcmFua19jbG9jayAoU2Vzc2lvbkhhcm5lc3MgKiBoKQoreworICBnc3RfdGVzdF9jbG9ja19jcmFuayAoaC0+dGVzdGNsb2NrKTsKK30KKworc3RhdGljIGdib29sZWFuCitzZXNzaW9uX2hhcm5lc3NfYWR2YW5jZV9hbmRfY3JhbmsgKFNlc3Npb25IYXJuZXNzICogaCwKKyAgICBHc3RDbG9ja1RpbWUgZGVsdGEpCit7CisgIEdzdENsb2NrSUQgcmVzLCBwZW5kaW5nOworICBnYm9vbGVhbiByZXN1bHQ7CisgIGdzdF90ZXN0X2Nsb2NrX3dhaXRfZm9yX25leHRfcGVuZGluZ19pZCAoaC0+dGVzdGNsb2NrLCAmcGVuZGluZyk7CisgIGdzdF90ZXN0X2Nsb2NrX2FkdmFuY2VfdGltZSAoaC0+dGVzdGNsb2NrLCBkZWx0YSk7CisgIHJlcyA9IGdzdF90ZXN0X2Nsb2NrX3Byb2Nlc3NfbmV4dF9jbG9ja19pZCAoaC0+dGVzdGNsb2NrKTsKKyAgaWYgKHJlcyA9PSBwZW5kaW5nKQorICAgIHJlc3VsdCA9IFRSVUU7CisgIGVsc2UKKyAgICByZXN1bHQgPSBGQUxTRTsKKyAgaWYgKHJlcykKKyAgICBnc3RfY2xvY2tfaWRfdW5yZWYgKHJlcyk7CisgIGdzdF9jbG9ja19pZF91bnJlZiAocGVuZGluZyk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitzZXNzaW9uX2hhcm5lc3NfcHJvZHVjZV9ydGNwIChTZXNzaW9uSGFybmVzcyAqIGgsIGdpbnQgbnVtX3J0Y3BfcGFja2V0cykKK3sKKyAgLyogZHVlIHRvIHJhbmRvbW5lc3MgaW4gcmVzY2hlZHVsaW5nIG9mIFJUQ1AgdGltZW91dCwgd2UgbmVlZCB0bworICAgICBrZWVwIGNyYW5raW5nIHVudGlsIHdlIGhhdmUgdGhlIGRlc2lyZWQgYW1vdW50IG9mIHBhY2tldHMgKi8KKyAgd2hpbGUgKGdzdF9oYXJuZXNzX2J1ZmZlcnNfaW5fcXVldWUgKGgtPnJ0Y3BfaCkgPCBudW1fcnRjcF9wYWNrZXRzKQorICAgIHNlc3Npb25faGFybmVzc19jcmFua19jbG9jayAoaCk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X211bHRpcGxlX3NzcmNfcnIpCit7CisgIFNlc3Npb25IYXJuZXNzICpoID0gc2Vzc2lvbl9oYXJuZXNzX25ldyAoKTsKKyAgR3N0Rmxvd1JldHVybiByZXM7CisgIEdzdEJ1ZmZlciAqaW5fYnVmLCAqb3V0X2J1ZjsKKyAgR3N0UlRDUEJ1ZmZlciBydGNwID0gR1NUX1JUQ1BfQlVGRkVSX0lOSVQ7CisgIEdzdFJUQ1BQYWNrZXQgcnRjcF9wYWNrZXQ7CisgIGdpbnQgaSwgajsKKworICBndWludCBzc3Jjc1tdID0geworICAgIDB4MDFCQURCQUQsCisgICAgMHhERUFEQkVFRiwKKyAgfTsKKworICAvKiByZWNlaXZlIGJ1ZmZlcnMgd2l0aCBtdWx0aXBsZSBzc3JjcyAqLworICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IEdfTl9FTEVNRU5UUyAoc3NyY3MpOyBqKyspIHsKKyAgICAgIGluX2J1ZiA9IGdlbmVyYXRlX3Rlc3RfYnVmZmVyIChpLCBzc3Jjc1tqXSk7CisgICAgICByZXMgPSBzZXNzaW9uX2hhcm5lc3NfcmVjdl9ydHAgKGgsIGluX2J1Zik7CisgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywgcmVzKTsKKyAgICB9CisgIH0KKworICAvKiBjcmFuayB0aGUgcnRjcC10aHJlYWQgYW5kIHB1bGwgb3V0IHRoZSBydGNwLXBhY2tldCB3ZSBoYXZlIGdlbmVyYXRlZCAqLworICBzZXNzaW9uX2hhcm5lc3NfY3JhbmtfY2xvY2sgKGgpOworICBvdXRfYnVmID0gc2Vzc2lvbl9oYXJuZXNzX3B1bGxfcnRjcCAoaCk7CisKKyAgLyogdmVyaWZ5IHdlIGhhdmUgcmVwb3J0IGJsb2NrcyBmb3IgYm90aCBzc3JjcyAqLworICBnX2Fzc2VydCAob3V0X2J1ZiAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9ydGNwX2J1ZmZlcl92YWxpZGF0ZSAob3V0X2J1ZikpOworICBnc3RfcnRjcF9idWZmZXJfbWFwIChvdXRfYnVmLCBHU1RfTUFQX1JFQUQsICZydGNwKTsKKyAgZ19hc3NlcnQgKGdzdF9ydGNwX2J1ZmZlcl9nZXRfZmlyc3RfcGFja2V0ICgmcnRjcCwgJnJ0Y3BfcGFja2V0KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9SVENQX1RZUEVfUlIsCisgICAgICBnc3RfcnRjcF9wYWNrZXRfZ2V0X3R5cGUgKCZydGNwX3BhY2tldCkpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdfTl9FTEVNRU5UUyAoc3NyY3MpLAorICAgICAgZ3N0X3J0Y3BfcGFja2V0X2dldF9yYl9jb3VudCAoJnJ0Y3BfcGFja2V0KSk7CisKKyAgZm9yIChqID0gMDsgaiA8IEdfTl9FTEVNRU5UUyAoc3NyY3MpOyBqKyspIHsKKyAgICBndWludDMyIHNzcmM7CisgICAgZ3N0X3J0Y3BfcGFja2V0X2dldF9yYiAoJnJ0Y3BfcGFja2V0LCBqLCAmc3NyYywKKyAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoc3NyY3Nbal0sIHNzcmMpOworICB9CisKKyAgZ3N0X3J0Y3BfYnVmZmVyX3VubWFwICgmcnRjcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKG91dF9idWYpOworCisgIHNlc3Npb25faGFybmVzc19mcmVlIChoKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUaGlzIHZlcmlmaWVzIHRoYXQgcnRwc2Vzc2lvbiB3aWxsIGNvcnJlY3RseSBwbGFjZSBSQnMgcm91bmQtcm9iaW4KKyAqIGFjcm9zcyBtdWx0aXBsZSBSUnMgd2hlbiB0aGVyZSBhcmUgdG9vIG1hbnkgc2VuZGVycyB0aGF0IHRoZWlyIFJCcworICogZG8gbm90IGZpdCBpbiBvbmUgUlIgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X211bHRpcGxlX3NlbmRlcnNfcm91bmRyb2Jpbl9yYnMpCit7CisgIFNlc3Npb25IYXJuZXNzICpoID0gc2Vzc2lvbl9oYXJuZXNzX25ldyAoKTsKKyAgR3N0Rmxvd1JldHVybiByZXM7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RSVENQQnVmZmVyIHJ0Y3AgPSBHU1RfUlRDUF9CVUZGRVJfSU5JVDsKKyAgR3N0UlRDUFBhY2tldCBydGNwX3BhY2tldDsKKyAgZ2ludCBpLCBqLCBrOworICBndWludDMyIHNzcmM7CisgIEdIYXNoVGFibGUgKnJiX3NzcmNzLCAqdG1wX3NldDsKKworICBnX29iamVjdF9zZXQgKGgtPmludGVybmFsX3Nlc3Npb24sICJpbnRlcm5hbC1zc3JjIiwgMHhERUFEQkVFRiwgTlVMTCk7CisKKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeyAgICAgLyogY3ljbGVzIGJldHdlZW4gUlIgcmVwb3J0cyAqLworICAgIGZvciAoaiA9IDA7IGogPCA1OyBqKyspIHsgICAvKiBwYWNrZXRzIHBlciBzc3JjICovCisgICAgICBnaW50IHNlcSA9IChpICogNSkgKyBqOworICAgICAgZm9yIChrID0gMDsgayA8IDM1OyBrKyspIHsgICAgICAgIC8qIG51bWJlciBvZiBzc3JjcyAqLworICAgICAgICBidWYgPSBnZW5lcmF0ZV90ZXN0X2J1ZmZlciAoc2VxLCAxMDAwMCArIGspOworICAgICAgICByZXMgPSBzZXNzaW9uX2hhcm5lc3NfcmVjdl9ydHAgKGgsIGJ1Zik7CisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLCByZXMpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJiX3NzcmNzID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX2RpcmVjdF9oYXNoLCBnX2RpcmVjdF9lcXVhbCwgTlVMTCwKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgZ19oYXNoX3RhYmxlX3VucmVmKTsKKworICAvKiB2ZXJpZnkgdGhlIHJ0Y3AgcGFja2V0cyAqLworICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgZ3VpbnQgZXhwZWN0ZWRfcmJfY291bnQgPSAoaSA8IDEpID8gR1NUX1JUQ1BfTUFYX1JCX0NPVU5UIDoKKyAgICAgICAgKDM1IC0gR1NUX1JUQ1BfTUFYX1JCX0NPVU5UKTsKKworICAgIHNlc3Npb25faGFybmVzc19wcm9kdWNlX3J0Y3AgKGgsIDEpOworICAgIGJ1ZiA9IHNlc3Npb25faGFybmVzc19wdWxsX3J0Y3AgKGgpOworICAgIGdfYXNzZXJ0IChidWYgIT0gTlVMTCk7CisgICAgZmFpbF91bmxlc3MgKGdzdF9ydGNwX2J1ZmZlcl92YWxpZGF0ZSAoYnVmKSk7CisKKyAgICBnc3RfcnRjcF9idWZmZXJfbWFwIChidWYsIEdTVF9NQVBfUkVBRCwgJnJ0Y3ApOworICAgIGZhaWxfdW5sZXNzIChnc3RfcnRjcF9idWZmZXJfZ2V0X2ZpcnN0X3BhY2tldCAoJnJ0Y3AsICZydGNwX3BhY2tldCkpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9SVENQX1RZUEVfUlIsCisgICAgICAgIGdzdF9ydGNwX3BhY2tldF9nZXRfdHlwZSAoJnJ0Y3BfcGFja2V0KSk7CisKKyAgICBzc3JjID0gZ3N0X3J0Y3BfcGFja2V0X3JyX2dldF9zc3JjICgmcnRjcF9wYWNrZXQpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDB4REVBREJFRUYsIHNzcmMpOworCisgICAgLyogaW5zcGVjdCB0aGUgUkJzICovCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZXhwZWN0ZWRfcmJfY291bnQsCisgICAgICAgIGdzdF9ydGNwX3BhY2tldF9nZXRfcmJfY291bnQgKCZydGNwX3BhY2tldCkpOworCisgICAgaWYgKGkgPT0gMCkgeworICAgICAgdG1wX3NldCA9IGdfaGFzaF90YWJsZV9uZXcgKGdfZGlyZWN0X2hhc2gsIGdfZGlyZWN0X2VxdWFsKTsKKyAgICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHJiX3NzcmNzLCBHVUlOVF9UT19QT0lOVEVSIChzc3JjKSwgdG1wX3NldCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRtcF9zZXQgPSBnX2hhc2hfdGFibGVfbG9va3VwIChyYl9zc3JjcywgR1VJTlRfVE9fUE9JTlRFUiAoc3NyYykpOworICAgICAgZ19hc3NlcnQgKHRtcF9zZXQpOworICAgIH0KKworICAgIGZvciAoaiA9IDA7IGogPCBleHBlY3RlZF9yYl9jb3VudDsgaisrKSB7CisgICAgICBnc3RfcnRjcF9wYWNrZXRfZ2V0X3JiICgmcnRjcF9wYWNrZXQsIGosICZzc3JjLCBOVUxMLCBOVUxMLAorICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgZ19hc3NlcnRfY21waW50IChzc3JjLCA+PSwgMTAwMDApOworICAgICAgZ19hc3NlcnRfY21waW50IChzc3JjLCA8PSwgMTAwMzUpOworICAgICAgZ19oYXNoX3RhYmxlX2FkZCAodG1wX3NldCwgR1VJTlRfVE9fUE9JTlRFUiAoc3NyYykpOworICAgIH0KKworICAgIGdzdF9ydGNwX2J1ZmZlcl91bm1hcCAoJnJ0Y3ApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIH0KKworICAvKiBub3cgdmVyaWZ5IGFsbCByZWNlaXZlZCBzc3JjcyBoYXZlIGJlZW4gcmVwb3J0ZWQgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMSwgZ19oYXNoX3RhYmxlX3NpemUgKHJiX3NzcmNzKSk7CisgIHRtcF9zZXQgPSBnX2hhc2hfdGFibGVfbG9va3VwIChyYl9zc3JjcywgR1VJTlRfVE9fUE9JTlRFUiAoMHhERUFEQkVFRikpOworICBnX2Fzc2VydCAodG1wX3NldCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDM1LCBnX2hhc2hfdGFibGVfc2l6ZSAodG1wX3NldCkpOworCisgIGdfaGFzaF90YWJsZV91bnJlZiAocmJfc3NyY3MpOworICBzZXNzaW9uX2hhcm5lc3NfZnJlZSAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaW50ZXJuYWxfc291cmNlc190aW1lb3V0KQoreworICBTZXNzaW9uSGFybmVzcyAqaCA9IHNlc3Npb25faGFybmVzc19uZXcgKCk7CisgIGd1aW50IGludGVybmFsX3NzcmM7CisgIGd1aW50MzIgc3NyYzsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdFJUQ1BCdWZmZXIgcnRjcCA9IEdTVF9SVENQX0JVRkZFUl9JTklUOworICBHc3RSVENQUGFja2V0IHJ0Y3BfcGFja2V0OworICBHc3RSVENQVHlwZSBydGNwX3R5cGU7CisgIEdzdEZsb3dSZXR1cm4gcmVzOworICBnaW50IGksIGo7CisgIEdzdENhcHMgKmNhcHM7CisgIGdib29sZWFuIHNlZW5fYnllOworCisgIGdfb2JqZWN0X3NldCAoaC0+aW50ZXJuYWxfc2Vzc2lvbiwgImludGVybmFsLXNzcmMiLCAweERFQURCRUVGLCBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChoLT5pbnRlcm5hbF9zZXNzaW9uLCAiaW50ZXJuYWwtc3NyYyIsICZpbnRlcm5hbF9zc3JjLCBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMHhERUFEQkVFRiwgaW50ZXJuYWxfc3NyYyk7CisKKyAgZm9yIChpID0gMTsgaSA8IDQ7IGkrKykgeworICAgIGJ1ZiA9IGdlbmVyYXRlX3Rlc3RfYnVmZmVyIChpLCAweEJFRUZERUFEKTsKKyAgICByZXMgPSBzZXNzaW9uX2hhcm5lc3NfcmVjdl9ydHAgKGgsIGJ1Zik7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssIHJlcyk7CisgIH0KKworICAvKiB2ZXJpZnkgdGhhdCBydHBzZXNzaW9uIGhhcyBzZW50IFJSIGZvciBhbiBpbnRlcm5hbGx5LWNyZWF0ZWQKKyAgICogUlRQU291cmNlIHRoYXQgaXMgdXNpbmcgdGhlIGludGVybmFsLXNzcmMgKi8KKyAgc2Vzc2lvbl9oYXJuZXNzX3Byb2R1Y2VfcnRjcCAoaCwgMSk7CisgIGJ1ZiA9IHNlc3Npb25faGFybmVzc19wdWxsX3J0Y3AgKGgpOworCisgIGZhaWxfdW5sZXNzIChidWYgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcnRjcF9idWZmZXJfdmFsaWRhdGUgKGJ1ZikpOworICBnc3RfcnRjcF9idWZmZXJfbWFwIChidWYsIEdTVF9NQVBfUkVBRCwgJnJ0Y3ApOworICBmYWlsX3VubGVzcyAoZ3N0X3J0Y3BfYnVmZmVyX2dldF9maXJzdF9wYWNrZXQgKCZydGNwLCAmcnRjcF9wYWNrZXQpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX1JUQ1BfVFlQRV9SUiwKKyAgICAgIGdzdF9ydGNwX3BhY2tldF9nZXRfdHlwZSAoJnJ0Y3BfcGFja2V0KSk7CisgIHNzcmMgPSBnc3RfcnRjcF9wYWNrZXRfcnJfZ2V0X3NzcmMgKCZydGNwX3BhY2tldCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHNzcmMsIGludGVybmFsX3NzcmMpOworICBnc3RfcnRjcF9idWZmZXJfdW5tYXAgKCZydGNwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAvKiBvaywgbm93IGxldCdzIHB1c2ggc29tZSBSVFAgcGFja2V0cyAqLworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtcnRwIiwKKyAgICAgICJzc3JjIiwgR19UWVBFX1VJTlQsIDB4MDFCQURCQUQsIE5VTEwpOworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHMgKGgtPnNlbmRfcnRwX2gsIGNhcHMpOworCisgIGZvciAoaSA9IDE7IGkgPCA0OyBpKyspIHsKKyAgICBidWYgPSBnZW5lcmF0ZV90ZXN0X2J1ZmZlciAoaSwgMHgwMUJBREJBRCk7CisgICAgcmVzID0gc2Vzc2lvbl9oYXJuZXNzX3NlbmRfcnRwIChoLCBidWYpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLCByZXMpOworICB9CisKKyAgLyogaW50ZXJuYWwgc3NyYyBtdXN0IGhhdmUgY2hhbmdlZCBhbHJlYWR5ICovCisgIGdfb2JqZWN0X2dldCAoaC0+aW50ZXJuYWxfc2Vzc2lvbiwgImludGVybmFsLXNzcmMiLCAmaW50ZXJuYWxfc3NyYywgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChpbnRlcm5hbF9zc3JjICE9IHNzcmMpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgweDAxQkFEQkFELCBpbnRlcm5hbF9zc3JjKTsKKworICAvKiB2ZXJpZnkgU1IgYW5kIFJSICovCisgIGogPSAwOworICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgc2Vzc2lvbl9oYXJuZXNzX3Byb2R1Y2VfcnRjcCAoaCwgMSk7CisgICAgYnVmID0gc2Vzc2lvbl9oYXJuZXNzX3B1bGxfcnRjcCAoaCk7CisgICAgZ19hc3NlcnQgKGJ1ZiAhPSBOVUxMKTsKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3J0Y3BfYnVmZmVyX3ZhbGlkYXRlIChidWYpKTsKKyAgICBnc3RfcnRjcF9idWZmZXJfbWFwIChidWYsIEdTVF9NQVBfUkVBRCwgJnJ0Y3ApOworICAgIGZhaWxfdW5sZXNzIChnc3RfcnRjcF9idWZmZXJfZ2V0X2ZpcnN0X3BhY2tldCAoJnJ0Y3AsICZydGNwX3BhY2tldCkpOworICAgIHJ0Y3BfdHlwZSA9IGdzdF9ydGNwX3BhY2tldF9nZXRfdHlwZSAoJnJ0Y3BfcGFja2V0KTsKKworICAgIGlmIChydGNwX3R5cGUgPT0gR1NUX1JUQ1BfVFlQRV9TUikgeworICAgICAgZ3N0X3J0Y3BfcGFja2V0X3NyX2dldF9zZW5kZXJfaW5mbyAoJnJ0Y3BfcGFja2V0LCAmc3NyYywgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICBOVUxMKTsKKyAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGludGVybmFsX3NzcmMsIHNzcmMpOworICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMHgwMUJBREJBRCwgc3NyYyk7CisgICAgICBqIHw9IDB4MTsKKyAgICB9IGVsc2UgaWYgKHJ0Y3BfdHlwZSA9PSBHU1RfUlRDUF9UWVBFX1JSKSB7CisgICAgICBzc3JjID0gZ3N0X3J0Y3BfcGFja2V0X3JyX2dldF9zc3JjICgmcnRjcF9wYWNrZXQpOworICAgICAgZmFpbF91bmxlc3MgKGludGVybmFsX3NzcmMgIT0gc3NyYyk7CisgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgweERFQURCRUVGLCBzc3JjKTsKKyAgICAgIGogfD0gMHgyOworICAgIH0KKyAgICBnc3RfcnRjcF9idWZmZXJfdW5tYXAgKCZydGNwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICB9CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDB4Mywgaik7IC8qIHZlcmlmeSB3ZSBnb3QgYm90aCBTUiBhbmQgUlIgKi8KKworICAvKiBnbyAzMCBzZWNvbmRzIGluIHRoZSBmdXR1cmUgYW5kIG9ic2VydmUgYm90aCBzb3VyY2VzIHRpbWluZyBvdXQ6CisgICAqIDB4REVBREJFRUYgLT4gQllFLCAweDAxQkFEQkFEIC0+IGJlY29tZXMgcmVjZWl2ZXIgb25seSAqLworICBmYWlsX3VubGVzcyAoc2Vzc2lvbl9oYXJuZXNzX2FkdmFuY2VfYW5kX2NyYW5rIChoLCAzMCAqIEdTVF9TRUNPTkQpKTsKKworICAvKiB2ZXJpZnkgQllFIGFuZCBSUiAqLworICBqID0gMDsKKyAgc2Vlbl9ieWUgPSBGQUxTRTsKKyAgd2hpbGUgKCFzZWVuX2J5ZSkgeworICAgIHNlc3Npb25faGFybmVzc19wcm9kdWNlX3J0Y3AgKGgsIDEpOworICAgIGJ1ZiA9IHNlc3Npb25faGFybmVzc19wdWxsX3J0Y3AgKGgpOworICAgIGZhaWxfdW5sZXNzIChidWYgIT0gTlVMTCk7CisgICAgZmFpbF91bmxlc3MgKGdzdF9ydGNwX2J1ZmZlcl92YWxpZGF0ZSAoYnVmKSk7CisgICAgZ3N0X3J0Y3BfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1JFQUQsICZydGNwKTsKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3J0Y3BfYnVmZmVyX2dldF9maXJzdF9wYWNrZXQgKCZydGNwLCAmcnRjcF9wYWNrZXQpKTsKKyAgICBydGNwX3R5cGUgPSBnc3RfcnRjcF9wYWNrZXRfZ2V0X3R5cGUgKCZydGNwX3BhY2tldCk7CisKKyAgICBpZiAocnRjcF90eXBlID09IEdTVF9SVENQX1RZUEVfUlIpIHsKKyAgICAgIHNzcmMgPSBnc3RfcnRjcF9wYWNrZXRfcnJfZ2V0X3NzcmMgKCZydGNwX3BhY2tldCk7CisgICAgICBpZiAoc3NyYyA9PSAweDAxQkFEQkFEKSB7CisgICAgICAgIGogfD0gMHgxOworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChpbnRlcm5hbF9zc3JjLCBzc3JjKTsKKyAgICAgICAgLyogMiA9PiBSUiwgU0RFUy4gVGhlcmUgaXMgbm8gQllFIGhlcmUgKi8KKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMiwgZ3N0X3J0Y3BfYnVmZmVyX2dldF9wYWNrZXRfY291bnQgKCZydGNwKSk7CisgICAgICB9IGVsc2UgaWYgKHNzcmMgPT0gMHhERUFEQkVFRikgeworICAgICAgICBqIHw9IDB4MjsKKyAgICAgICAgZ19hc3NlcnRfY21waW50IChzc3JjLCAhPSwgaW50ZXJuYWxfc3NyYyk7CisgICAgICAgIC8qIDMgPT4gUlIsIFNERVMsIEJZRSAqLworICAgICAgICBpZiAoZ3N0X3J0Y3BfYnVmZmVyX2dldF9wYWNrZXRfY291bnQgKCZydGNwKSA9PSAzKSB7CisgICAgICAgICAgZmFpbF91bmxlc3MgKGdzdF9ydGNwX3BhY2tldF9tb3ZlX3RvX25leHQgKCZydGNwX3BhY2tldCkpOworICAgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfcnRjcF9wYWNrZXRfbW92ZV90b19uZXh0ICgmcnRjcF9wYWNrZXQpKTsKKyAgICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfUlRDUF9UWVBFX0JZRSwKKyAgICAgICAgICAgICAgZ3N0X3J0Y3BfcGFja2V0X2dldF90eXBlICgmcnRjcF9wYWNrZXQpKTsKKyAgICAgICAgICBzZWVuX2J5ZSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZ3N0X3J0Y3BfYnVmZmVyX3VubWFwICgmcnRjcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgfQorICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgweDMsIGopOyAvKiB2ZXJpZnkgd2UgZ290IGJvdGggQllFIGFuZCBSUiAqLworCisgIHNlc3Npb25faGFybmVzc19mcmVlIChoKTsKK30KKworR1NUX0VORF9URVNUOworCit0eXBlZGVmIHN0cnVjdAoreworICBndWludDggc3VidHlwZTsKKyAgZ3VpbnQzMiBzc3JjOworICBnY2hhciAqbmFtZTsKKyAgR3N0QnVmZmVyICpkYXRhOworfSBSVENQQXBwUmVzdWx0OworCitzdGF0aWMgdm9pZAorb25fYXBwX3J0Y3BfY2IgKEdPYmplY3QgKiBzZXNzaW9uLCBndWludCBzdWJ0eXBlLCBndWludCBzc3JjLAorICAgIGNvbnN0IGdjaGFyICogbmFtZSwgR3N0QnVmZmVyICogZGF0YSwgUlRDUEFwcFJlc3VsdCAqIHJlc3VsdCkKK3sKKyAgcmVzdWx0LT5zdWJ0eXBlID0gc3VidHlwZTsKKyAgcmVzdWx0LT5zc3JjID0gc3NyYzsKKyAgcmVzdWx0LT5uYW1lID0gZ19zdHJkdXAgKG5hbWUpOworICByZXN1bHQtPmRhdGEgPSBkYXRhID8gZ3N0X2J1ZmZlcl9yZWYgKGRhdGEpIDogTlVMTDsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcmVjZWl2ZV9ydGNwX2FwcF9wYWNrZXQpCit7CisgIFNlc3Npb25IYXJuZXNzICpoID0gc2Vzc2lvbl9oYXJuZXNzX25ldyAoKTsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdFJUQ1BCdWZmZXIgcnRjcCA9IEdTVF9SVENQX0JVRkZFUl9JTklUOworICBHc3RSVENQUGFja2V0IHBhY2tldDsKKyAgUlRDUEFwcFJlc3VsdCByZXN1bHQgPSB7IDAgfTsKKyAgZ3VpbnQ4IGRhdGFbXSA9IHsgMHgxMSwgMHgyMiwgMHgzMywgMHg0NCB9OworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGgtPmludGVybmFsX3Nlc3Npb24sICJvbi1hcHAtcnRjcCIsCisgICAgICBHX0NBTExCQUNLIChvbl9hcHBfcnRjcF9jYiksICZyZXN1bHQpOworCisgIC8qIFB1c2ggQVBQIGJ1ZmZlciB3aXRoIG5vIGRhdGEgKi8KKyAgYnVmID0gZ3N0X3J0Y3BfYnVmZmVyX25ldyAoMTAwMCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcnRjcF9idWZmZXJfbWFwIChidWYsIEdTVF9NQVBfUkVBRFdSSVRFLCAmcnRjcCkpOworICBmYWlsX3VubGVzcyAoZ3N0X3J0Y3BfYnVmZmVyX2FkZF9wYWNrZXQgKCZydGNwLCBHU1RfUlRDUF9UWVBFX0FQUCwgJnBhY2tldCkpOworICBnc3RfcnRjcF9wYWNrZXRfYXBwX3NldF9zdWJ0eXBlICgmcGFja2V0LCAyMSk7CisgIGdzdF9ydGNwX3BhY2tldF9hcHBfc2V0X3NzcmMgKCZwYWNrZXQsIDB4MTExMTExMTEpOworICBnc3RfcnRjcF9wYWNrZXRfYXBwX3NldF9uYW1lICgmcGFja2V0LCAiVGVzdCIpOworICBnc3RfcnRjcF9idWZmZXJfdW5tYXAgKCZydGNwKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywgc2Vzc2lvbl9oYXJuZXNzX3JlY3ZfcnRjcCAoaCwgYnVmKSk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMjEsIHJlc3VsdC5zdWJ0eXBlKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMHgxMTExMTExMSwgcmVzdWx0LnNzcmMpOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nICgiVGVzdCIsIHJlc3VsdC5uYW1lKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3BvaW50ZXIgKE5VTEwsIHJlc3VsdC5kYXRhKTsKKworICBnX2ZyZWUgKHJlc3VsdC5uYW1lKTsKKworICAvKiBQdXNoIEFQUCBidWZmZXIgd2l0aCBkYXRhICovCisgIG1lbXNldCAoJnJlc3VsdCwgMCwgc2l6ZW9mIChyZXN1bHQpKTsKKyAgYnVmID0gZ3N0X3J0Y3BfYnVmZmVyX25ldyAoMTAwMCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcnRjcF9idWZmZXJfbWFwIChidWYsIEdTVF9NQVBfUkVBRFdSSVRFLCAmcnRjcCkpOworICBmYWlsX3VubGVzcyAoZ3N0X3J0Y3BfYnVmZmVyX2FkZF9wYWNrZXQgKCZydGNwLCBHU1RfUlRDUF9UWVBFX0FQUCwgJnBhY2tldCkpOworICBnc3RfcnRjcF9wYWNrZXRfYXBwX3NldF9zdWJ0eXBlICgmcGFja2V0LCAyMik7CisgIGdzdF9ydGNwX3BhY2tldF9hcHBfc2V0X3NzcmMgKCZwYWNrZXQsIDB4MjIyMjIyMjIpOworICBnc3RfcnRjcF9wYWNrZXRfYXBwX3NldF9uYW1lICgmcGFja2V0LCAiVGVzdCIpOworICBnc3RfcnRjcF9wYWNrZXRfYXBwX3NldF9kYXRhX2xlbmd0aCAoJnBhY2tldCwgc2l6ZW9mIChkYXRhKSAvIDQpOworICBtZW1jcHkgKGdzdF9ydGNwX3BhY2tldF9hcHBfZ2V0X2RhdGEgKCZwYWNrZXQpLCBkYXRhLCBzaXplb2YgKGRhdGEpKTsKKyAgZ3N0X3J0Y3BfYnVmZmVyX3VubWFwICgmcnRjcCk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssIHNlc3Npb25faGFybmVzc19yZWN2X3J0Y3AgKGgsIGJ1ZikpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDIyLCByZXN1bHQuc3VidHlwZSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDB4MjIyMjIyMjIsIHJlc3VsdC5zc3JjKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoIlRlc3QiLCByZXN1bHQubmFtZSk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAocmVzdWx0LmRhdGEsIDAsIGRhdGEsIHNpemVvZiAoZGF0YSkpID09IDApOworCisgIGdfZnJlZSAocmVzdWx0Lm5hbWUpOworICBnc3RfYnVmZmVyX3VucmVmIChyZXN1bHQuZGF0YSk7CisKKyAgc2Vzc2lvbl9oYXJuZXNzX2ZyZWUgKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyB2b2lkCitzdGF0c190ZXN0X2NiIChHT2JqZWN0ICogb2JqZWN0LCBHUGFyYW1TcGVjICogc3BlYywgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgZ3VpbnQgbnVtX3NvdXJjZXMgPSAwOworICBnYm9vbGVhbiAqY2JfY2FsbGVkID0gZGF0YTsKKyAgZ19hc3NlcnQgKCpjYl9jYWxsZWQgPT0gRkFMU0UpOworICAqY2JfY2FsbGVkID0gVFJVRTsKKworICAvKiBXZSBzaG91bGQgYmUgYWJsZSB0byBnZXQgYSBydHBzZXNzaW9uIHByb3BlcnR5CisgICAgIHdpdGhvdXQgaW50cm9kdWNpbmcgdGhlIGRlYWRsb2NrICovCisgIGdfb2JqZWN0X2dldCAob2JqZWN0LCAibnVtLXNvdXJjZXMiLCAmbnVtX3NvdXJjZXMsIE5VTEwpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9kb250X2xvY2tfb25fc3RhdHMpCit7CisgIEdzdEhhcm5lc3MgKmhfcnRjcDsKKyAgR3N0SGFybmVzcyAqaF9zZW5kOworICBHc3RDbG9jayAqY2xvY2sgPSBnc3RfdGVzdF9jbG9ja19uZXcgKCk7CisgIEdzdFRlc3RDbG9jayAqdGVzdGNsb2NrID0gR1NUX1RFU1RfQ0xPQ0sgKGNsb2NrKTsKKyAgZ2Jvb2xlYW4gY2JfY2FsbGVkID0gRkFMU0U7CisKKyAgLyogdXNlIHRlc3RjbG9jayBhcyB0aGUgc3lzdGVtY2xvY2sgdG8gY2FwdHVyZSB0aGUgcnRjcCB0aHJlYWQgd2FpdHMgKi8KKyAgZ3N0X3N5c3RlbV9jbG9ja19zZXRfZGVmYXVsdCAoR1NUX0NMT0NLICh0ZXN0Y2xvY2spKTsKKworICBoX3J0Y3AgPQorICAgICAgZ3N0X2hhcm5lc3NfbmV3X3dpdGhfcGFkbmFtZXMgKCJydHBzZXNzaW9uIiwgInJlY3ZfcnRjcF9zaW5rIiwKKyAgICAgICJzZW5kX3J0Y3Bfc3JjIik7CisgIGhfc2VuZCA9CisgICAgICBnc3RfaGFybmVzc19uZXdfd2l0aF9lbGVtZW50IChoX3J0Y3AtPmVsZW1lbnQsICJzZW5kX3J0cF9zaW5rIiwKKyAgICAgICJzZW5kX3J0cF9zcmMiKTsKKworICAvKiBjb25uZWN0IHRvIHRoZSBzdGF0cy1yZXBvcnRpbmcgKi8KKyAgZ19zaWduYWxfY29ubmVjdCAoaF9ydGNwLT5lbGVtZW50LCAibm90aWZ5OjpzdGF0cyIsCisgICAgICBHX0NBTExCQUNLIChzdGF0c190ZXN0X2NiKSwgJmNiX2NhbGxlZCk7CisKKyAgLyogImNyYW5rIiBhbmQgY2hlY2sgdGhlIHN0YXRzICovCisgIGdfYXNzZXJ0IChnc3RfdGVzdF9jbG9ja19jcmFuayAodGVzdGNsb2NrKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGhfcnRjcCkpOworICBmYWlsX3VubGVzcyAoY2JfY2FsbGVkKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaF9zZW5kKTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGhfcnRjcCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGNsb2NrKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgdm9pZAorc3VzcGljaW91c19ieWVfY2IgKEdPYmplY3QgKiBvYmplY3QsIEdQYXJhbVNwZWMgKiBzcGVjLCBncG9pbnRlciBkYXRhKQoreworICBHVmFsdWVBcnJheSAqc3RhdHNfYXJyOworICBHc3RTdHJ1Y3R1cmUgKnN0YXRzLCAqaW50ZXJuYWxfc3RhdHM7CisgIGdib29sZWFuICpjYl9jYWxsZWQgPSBkYXRhOworICBnYm9vbGVhbiBpbnRlcm5hbCA9IEZBTFNFLCBzZW50X2J5ZSA9IFRSVUU7CisgIGd1aW50IHNzcmMgPSAwOworICBndWludCBpOworCisgIGdfYXNzZXJ0ICgqY2JfY2FsbGVkID09IEZBTFNFKTsKKyAgKmNiX2NhbGxlZCA9IFRSVUU7CisKKyAgZ19vYmplY3RfZ2V0IChvYmplY3QsICJzdGF0cyIsICZzdGF0cywgTlVMTCk7CisgIHN0YXRzX2FyciA9CisgICAgICBnX3ZhbHVlX2dldF9ib3hlZCAoZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0YXRzLCAic291cmNlLXN0YXRzIikpOworICBnX2Fzc2VydCAoc3RhdHNfYXJyICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoc3RhdHNfYXJyLT5uX3ZhbHVlcyA+PSAxKTsKKworICBmb3IgKGkgPSAwOyBpIDwgc3RhdHNfYXJyLT5uX3ZhbHVlczsgaSsrKSB7CisgICAgaW50ZXJuYWxfc3RhdHMgPSBnX3ZhbHVlX2dldF9ib3hlZCAoZ192YWx1ZV9hcnJheV9nZXRfbnRoIChzdGF0c19hcnIsIGkpKTsKKyAgICBnX2Fzc2VydCAoaW50ZXJuYWxfc3RhdHMgIT0gTlVMTCk7CisKKyAgICBnc3Rfc3RydWN0dXJlX2dldCAoaW50ZXJuYWxfc3RhdHMsCisgICAgICAgICJzc3JjIiwgR19UWVBFX1VJTlQsICZzc3JjLAorICAgICAgICAiaW50ZXJuYWwiLCBHX1RZUEVfQk9PTEVBTiwgJmludGVybmFsLAorICAgICAgICAicmVjZWl2ZWQtYnllIiwgR19UWVBFX0JPT0xFQU4sICZzZW50X2J5ZSwgTlVMTCk7CisKKyAgICBpZiAoc3NyYyA9PSAweERFQURCRUVGKSB7CisgICAgICBmYWlsX3VubGVzcyAoaW50ZXJuYWwpOworICAgICAgZmFpbF91bmxlc3MgKCFzZW50X2J5ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoc3NyYywgMHhERUFEQkVFRik7CisKKyAgZ3N0X3N0cnVjdHVyZV9mcmVlIChzdGF0cyk7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorY3JlYXRlX2J5ZV9ydGNwIChndWludDMyIHNzcmMpCit7CisgIEdzdFJUQ1BQYWNrZXQgcGFja2V0OworICBHc3RSVENQQnVmZmVyIHJ0Y3AgPSBHU1RfUlRDUF9CVUZGRVJfSU5JVDsKKyAgR1NvY2tldEFkZHJlc3MgKnNhZGRyOworICBHc3RCdWZmZXIgKmJ1ZmZlciA9IGdzdF9ydGNwX2J1ZmZlcl9uZXcgKDEwMDApOworCisgIGZhaWxfdW5sZXNzIChnc3RfcnRjcF9idWZmZXJfbWFwIChidWZmZXIsIEdTVF9NQVBfUkVBRFdSSVRFLCAmcnRjcCkpOworICBmYWlsX3VubGVzcyAoZ3N0X3J0Y3BfYnVmZmVyX2FkZF9wYWNrZXQgKCZydGNwLCBHU1RfUlRDUF9UWVBFX0JZRSwgJnBhY2tldCkpOworICBnc3RfcnRjcF9wYWNrZXRfYnllX2FkZF9zc3JjICgmcGFja2V0LCBzc3JjKTsKKyAgZ3N0X3J0Y3BfYnVmZmVyX3VubWFwICgmcnRjcCk7CisKKyAgLyogTmVlZCB0byBhZGQgbWV0YSB0byB0cmlnZ2VyIGNvbGxpc2lvbiBkZXRlY3Rpb24gKi8KKyAgc2FkZHIgPSBnX2luZXRfc29ja2V0X2FkZHJlc3NfbmV3X2Zyb21fc3RyaW5nICgiMTI3LjAuMC4xIiwgMzQ5MCk7CisgIGdzdF9idWZmZXJfYWRkX25ldF9hZGRyZXNzX21ldGEgKGJ1ZmZlciwgc2FkZHIpOworICBnX29iamVjdF91bnJlZiAoc2FkZHIpOworICByZXR1cm4gYnVmZmVyOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9pZ25vcmVfc3VzcGljaW91c19ieWUpCit7CisgIFNlc3Npb25IYXJuZXNzICpoID0gc2Vzc2lvbl9oYXJuZXNzX25ldyAoKTsKKyAgZ2Jvb2xlYW4gY2JfY2FsbGVkID0gRkFMU0U7CisKKyAgLyogY29ubmVjdCB0byB0aGUgc3RhdHMtcmVwb3J0aW5nICovCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGgtPnNlc3Npb24sICJub3RpZnk6OnN0YXRzIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKHN1c3BpY2lvdXNfYnllX2NiKSwgJmNiX2NhbGxlZCk7CisKKyAgLyogUHVzaCBSVFAgYnVmZmVyIG1ha2luZyBvdXIgaW50ZXJuYWwgU1NSQz0weERFQURCRUVGICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLAorICAgICAgc2Vzc2lvbl9oYXJuZXNzX3NlbmRfcnRwIChoLCBnZW5lcmF0ZV90ZXN0X2J1ZmZlciAoMCwgMHhERUFEQkVFRikpKTsKKworICAvKiBSZWNlaXZlIEJZRSBSVENQIHJlZmVyZW5jaW5nIG91ciBpbnRlcm5hbCBTU1JDKCE/ISkgKDB4REVBREJFRUYpICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLAorICAgICAgc2Vzc2lvbl9oYXJuZXNzX3JlY3ZfcnRjcCAoaCwgY3JlYXRlX2J5ZV9ydGNwICgweERFQURCRUVGKSkpOworCisgIC8qICJjcmFuayIgYW5kIGNoZWNrIHRoZSBzdGF0cyAqLworICBzZXNzaW9uX2hhcm5lc3NfY3JhbmtfY2xvY2sgKGgpOworICBnc3RfYnVmZmVyX3VucmVmIChzZXNzaW9uX2hhcm5lc3NfcHVsbF9ydGNwIChoKSk7CisgIGZhaWxfdW5sZXNzIChjYl9jYWxsZWQpOworCisgIHNlc3Npb25faGFybmVzc19mcmVlIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9pbGxlZ2FsX3J0Y3BfZmJfcGFja2V0KQoreworICBTZXNzaW9uSGFybmVzcyAqaCA9IHNlc3Npb25faGFybmVzc19uZXcgKCk7CisgIEdzdEJ1ZmZlciAqYnVmOworICAvKiBaZXJvIGxlbmd0aCBSVENQIGZlZWRiYWNrIHBhY2tldCAocmVkdWNlZCBzaXplKSAqLworICBjb25zdCBndWludDggcnRjcF96ZXJvX2ZiX3BrdFtdID0geyAweDhmLCAweGNlLCAweDAwLCAweDAwIH07CisKKyAgZ19vYmplY3Rfc2V0IChoLT5pbnRlcm5hbF9zZXNzaW9uLCAiaW50ZXJuYWwtc3NyYyIsIDB4REVBREJFRUYsIE5VTEwpOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZW9mIChydGNwX3plcm9fZmJfcGt0KSk7CisgIGdzdF9idWZmZXJfZmlsbCAoYnVmLCAwLCBydGNwX3plcm9fZmJfcGt0LCBzaXplb2YgKHJ0Y3BfemVyb19mYl9wa3QpKTsKKyAgR1NUX0JVRkZFUl9EVFMgKGJ1ZikgPSBHU1RfQlVGRkVSX1BUUyAoYnVmKSA9IEdfR1VJTlQ2NF9DT05TVEFOVCAoMCk7CisKKyAgLyogUHVzaCB0aGUgcGFja2V0LCB0aGlzIGRpZCBwcmV2aW91c2x5IGNyYXNoIGJlY2F1c2UgbGVuZ3RoIG9mIHBhY2tldCB3YXMKKyAgICogbmV2ZXIgdmFsaWRhdGVkLiAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywgc2Vzc2lvbl9oYXJuZXNzX3JlY3ZfcnRjcCAoaCwgYnVmKSk7CisKKyAgc2Vzc2lvbl9oYXJuZXNzX2ZyZWUgKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitydHBzZXNzaW9uX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoInJ0cHNlc3Npb24iKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbXVsdGlwbGVfc3NyY19ycik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9tdWx0aXBsZV9zZW5kZXJzX3JvdW5kcm9iaW5fcmJzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ludGVybmFsX3NvdXJjZXNfdGltZW91dCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9yZWNlaXZlX3J0Y3BfYXBwX3BhY2tldCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9kb250X2xvY2tfb25fc3RhdHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaWdub3JlX3N1c3BpY2lvdXNfYnllKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaWxsZWdhbF9ydGNwX2ZiX3BhY2tldCk7CisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAocnRwc2Vzc2lvbik7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHB2cDkuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHZwOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMzA2OWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHB2cDkuYwpAQCAtMCwwICsxLDExNCBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFBleGlwIEFTCisgKiAgIEBhdXRob3IgU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9jaGVjay5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RoYXJuZXNzLmg+CisKKyNkZWZpbmUgUlRQX1ZQOV9DQVBTX1NUUiBcCisgICJhcHBsaWNhdGlvbi94LXJ0cCxtZWRpYT12aWRlbyxlbmNvZGluZy1uYW1lPVZQOSxjbG9jay1yYXRlPTkwMDAwLHBheWxvYWQ9OTYiCisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZGVwYXlfZmxleGlibGVfbW9kZSkKK3sKKyAgLyogYi1iaXQsIGUtYml0LCBmLWJpdCBhbmQgbWFya2VyIGJpdCBzZXQgKi8KKyAgLyogRmlyc3QgcGFja2V0IG9mIGZpcnN0IGZyYW1lLCBoYW5kY3JhZnRlZCB0byBhbHNvIHNldCB0aGUgZS1iaXQgYW5kIG1hcmtlcgorICAgKiBiaXQgaW4gYWRkaXRpb24gdG8gY2hhbmdpbmcgdGhlIHNlcW51bSAqLworICBndWludDggaW50cmFbXSA9IHsKKyAgICAweDgwLCAweGY0LCAweDAwLCAweDAwLCAweDQ5LCAweGI1LCAweGJlLCAweDMyLCAweGIxLCAweDAxLCAweDY0LCAweGQxLAorICAgIDB4YmMsIDB4OTgsIDB4YmYsIDB4MDAsIDB4ODMsIDB4NDksIDB4ODMsIDB4NDIsIDB4MDAsIDB4NzcsIDB4ZjAsIDB4NDMsCisgICAgMHg3MSwgMHhkOCwgMHhlMCwgMHg5MCwgMHg3MCwgMHg2NiwgMHg4MCwgMHg2MCwgMHgwZSwgMHhmMCwgMHg1ZiwgMHhmZCwKKyAgfTsKKyAgLyogYi1iaXQsIGUtYml0LCBwLWJpdCwgZi1iaXQgYW5kIG1hcmtlciBiaXQgc2V0ICovCisgIC8qIEZpcnN0IHBhY2tldCBvZiBzZWNvbmQgZnJhbWUsIGhhbmRjcmFmdGVkIHRvIGFsc28gc2V0IHRoZSBlLWJpdCBhbmQKKyAgICogbWFya2VyIGJpdCBpbiBhZGRpdGlvbiB0byBjaGFuZ2luZyB0aGUgc2VxbnVtICovCisgIGd1aW50OCBpbnRlcltdID0geworICAgIDB4ODAsIDB4ZjQsIDB4MDAsIDB4MDEsIDB4NDksIDB4YjYsIDB4MDIsIDB4YzAsIDB4YjEsIDB4MDEsIDB4NjQsIDB4ZDEsCisgICAgMHhmYywgMHg5OCwgMHhjMCwgMHgwMCwgMHgwMiwgMHg4NywgMHgwMSwgMHgwMCwgMHgwOSwgMHgzZiwgMHgxYywgMHgxMiwKKyAgICAweDBlLCAweDBjLCAweGQwLCAweDFiLCAweGE3LCAweDgwLCAweDgwLCAweGIwLCAweDE4LCAweDBmLCAweGRhLCAweDExLAorICB9OworCisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHB2cDlkZXBheSIpOworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHNfc3RyIChoLCBSVFBfVlA5X0NBUFNfU1RSKTsKKworICBnc3RfaGFybmVzc19wdXNoIChoLCBnc3RfYnVmZmVyX25ld193cmFwcGVkX2Z1bGwgKEdTVF9NRU1PUllfRkxBR19SRUFET05MWSwKKyAgICAgICAgICBpbnRyYSwgc2l6ZW9mIChpbnRyYSksIDAsIHNpemVvZiAoaW50cmEpLCBOVUxMLCBOVUxMKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDEsIGdzdF9oYXJuZXNzX2J1ZmZlcnNfcmVjZWl2ZWQgKGgpKTsKKworICBnc3RfaGFybmVzc19wdXNoIChoLCBnc3RfYnVmZmVyX25ld193cmFwcGVkX2Z1bGwgKEdTVF9NRU1PUllfRkxBR19SRUFET05MWSwKKyAgICAgICAgICBpbnRlciwgc2l6ZW9mIChpbnRlciksIDAsIHNpemVvZiAoaW50ZXIpLCBOVUxMLCBOVUxMKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDIsIGdzdF9oYXJuZXNzX2J1ZmZlcnNfcmVjZWl2ZWQgKGgpKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZGVwYXlfbm9uX2ZsZXhpYmxlX21vZGUpCit7CisgIC8qIGItYml0LCBlLWJpdCBhbmQgIG1hcmtlciBiaXQgc2V0LiBmLWJpdCBOT1Qgc2V0ICovCisgIC8qIEZpcnN0IHBhY2tldCBvZiBmaXJzdCBmcmFtZSwgaGFuZGNyYWZ0ZWQgdG8gYWxzbyBzZXQgdGhlIGUtYml0IGFuZCBtYXJrZXIKKyAgICogYml0IGluIGFkZGl0aW9uIHRvIGNoYW5naW5nIHRoZSBzZXFudW0gKi8KKyAgZ3VpbnQ4IGludHJhW10gPSB7CisgICAgMHg4MCwgMHhmNCwgMHgwMCwgMHgwMCwgMHg0OSwgMHg4OCwgMHhkOSwgMHhmOCwgMHhhMCwgMHg2YywgMHg2NSwgMHg2YywKKyAgICAweDhjLCAweDk4LCAweGMwLCAweDg3LCAweDAxLCAweDAyLCAweDQ5LCAweDNmLCAweDFjLCAweDEyLCAweDBlLCAweDBjLAorICAgIDB4ZDAsIDB4MWIsIDB4YjksIDB4ODAsIDB4ODAsIDB4YjAsIDB4MTgsIDB4MGYsIDB4YTYsIDB4NGQsIDB4MDEsIDB4YTUKKyAgfTsKKyAgLyogYi1iaXQsIGUtYml0LCBwLWJpdCAgYW5kIG1hcmtlciBiaXQgc2V0LiBmLWJpdCBOT1Qgc2V0ICovCisgIC8qIEZpcnN0IHBhY2tldCBvZiBzZWNvbmQgZnJhbWUsIGhhbmRjcmFmdGVkIHRvIGFsc28gc2V0IHRoZSBlLWJpdCBhbmQKKyAgICogbWFya2VyIGJpdCBpbiBhZGRpdGlvbiB0byBjaGFuZ2luZyB0aGUgc2VxbnVtICovCisgIGd1aW50OCBpbnRlcltdID0geworICAgIDB4ODAsIDB4ZjQsIDB4MDAsIDB4MDEsIDB4NDksIDB4ODgsIDB4ZTUsIDB4MzgsIDB4YTAsIDB4NmMsIDB4NjUsIDB4NmMsCisgICAgMHhjYywgMHg5OCwgMHhjMSwgMHg4NywgMHgwMSwgMHgwMiwgMHg0OSwgMHgzZiwgMHgxYywgMHgxMiwgMHgwZSwgMHgwYywKKyAgICAweGQwLCAweDFiLCAweDk3LCAweDgwLCAweDgwLCAweGIwLCAweDE4LCAweDBmLCAweDhhLCAweDlmLCAweDAxLCAweGJjCisgIH07CisKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cHZwOWRlcGF5Iik7CisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgsIFJUUF9WUDlfQ0FQU19TVFIpOworCisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdzdF9idWZmZXJfbmV3X3dyYXBwZWRfZnVsbCAoR1NUX01FTU9SWV9GTEFHX1JFQURPTkxZLAorICAgICAgICAgIGludHJhLCBzaXplb2YgKGludHJhKSwgMCwgc2l6ZW9mIChpbnRyYSksIE5VTEwsIE5VTEwpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMSwgZ3N0X2hhcm5lc3NfYnVmZmVyc19yZWNlaXZlZCAoaCkpOworCisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdzdF9idWZmZXJfbmV3X3dyYXBwZWRfZnVsbCAoR1NUX01FTU9SWV9GTEFHX1JFQURPTkxZLAorICAgICAgICAgIGludGVyLCBzaXplb2YgKGludGVyKSwgMCwgc2l6ZW9mIChpbnRlciksIE5VTEwsIE5VTEwpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMiwgZ3N0X2hhcm5lc3NfYnVmZmVyc19yZWNlaXZlZCAoaCkpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCisKKworc3RhdGljIFN1aXRlICoKK3J0cHZwOV9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJydHB2cDkiKTsKKyAgVENhc2UgKnRjX2NoYWluOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgKHRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgidnA5ZGVwYXkiKSkpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZGVwYXlfZmxleGlibGVfbW9kZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9kZXBheV9ub25fZmxleGlibGVfbW9kZSk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChydHB2cDkpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvc2hhcGV3aXBlLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9zaGFwZXdpcGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjkwMDg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvc2hhcGV3aXBlLmMKQEAgLTAsMCArMSwzMTYgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworZ2Jvb2xlYW4gaGF2ZV9lb3MgPSBGQUxTRTsKKworLyogRm9yIGVhc2Ugb2YgcHJvZ3JhbW1pbmcgd2UgdXNlIGdsb2JhbHMgdG8ga2VlcCByZWZzIGZvciBvdXIgZmxvYXRpbmcKKyAqIHNyYyBhbmQgc2luayBwYWRzIHdlIGNyZWF0ZTsgb3RoZXJ3aXNlIHdlIGFsd2F5cyBoYXZlIHRvIGRvIGdldF9wYWQsCisgKiBnZXRfcGVlciwgYW5kIHRoZW4gcmVtb3ZlIHJlZmVyZW5jZXMgaW4gZXZlcnkgdGVzdCBmdW5jdGlvbiAqLworR3N0UGFkICpteXZpZGVvc3JjcGFkLCAqbXltYXNrc3JjcGFkLCAqbXlzaW5rcGFkOworCisKKyNkZWZpbmUgU0hBUEVXSVBFX1ZJREVPX0NBUFNfU1RSSU5HICAgIFwKKyAgICAidmlkZW8veC1yYXcsICIgXAorICAgICJmb3JtYXQgPSAoc3RyaW5nKUFZVVYsICIgXAorICAgICJ3aWR0aCA9IDQwMCwgIiBcCisgICAgImhlaWdodCA9IDQwMCwgIiBcCisgICAgImZyYW1lcmF0ZSA9IDAvMSIKKworI2RlZmluZSBTSEFQRVdJUEVfTUFTS19DQVBTX1NUUklORyAgICBcCisgICAgInZpZGVvL3gtcmF3LCAiIFwKKyAgICAiZm9ybWF0ID0gKHN0cmluZylHUkFZOCwgIiBcCisgICAgIndpZHRoID0gNDAwLCAiIFwKKyAgICAiaGVpZ2h0ID0gNDAwLCAiIFwKKyAgICAiZnJhbWVyYXRlID0gMC8xIgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChTSEFQRVdJUEVfVklERU9fQ0FQU19TVFJJTkcpCisgICAgKTsKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSB2aWRlb3NyY3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgidmlkZW9zcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoU0hBUEVXSVBFX1ZJREVPX0NBUFNfU1RSSU5HKQorICAgICk7CitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgbWFza3NyY3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgibWFza3NyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChTSEFQRVdJUEVfTUFTS19DQVBTX1NUUklORykKKyAgICApOworCisKK3N0YXRpYyBHc3RCdWZmZXIgKm91dHB1dCA9IE5VTEw7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitvbl9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKG91dHB1dCA9PSBOVUxMLCBHU1RfRkxPV19FUlJPUik7CisKKyAgb3V0cHV0ID0gYnVmZmVyOworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2dlbmVyYWwpCit7CisgIEdzdEVsZW1lbnQgKnNoYXBld2lwZSwgKnZpZGVvc3JjLCAqbWFza3NyYywgKnNpbmssICpiaW47CisgIEdzdFBhZCAqcDsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0QnVmZmVyICptYXNrLCAqaW5wdXQ7CisgIGd1aW50IGksIGo7CisgIGd1aW50OCAqZGF0YTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYmluID0gZ3N0X2Jpbl9uZXcgKCJteXNoYXBld2lwZSIpOworICB2aWRlb3NyYyA9IGdzdF9iaW5fbmV3ICgibXl2aWRlb3NyYyIpOworICBtYXNrc3JjID0gZ3N0X2Jpbl9uZXcgKCJteW1hc2tzcmMiKTsKKyAgc2luayA9IGdzdF9iaW5fbmV3ICgibXlzaW5rIik7CisgIHNoYXBld2lwZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInNoYXBld2lwZSIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoc2hhcGV3aXBlICE9IE5VTEwpOworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChiaW4pLCB2aWRlb3NyYywgbWFza3NyYywgc2hhcGV3aXBlLCBzaW5rLCBOVUxMKTsKKworICBteXZpZGVvc3JjcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmdmlkZW9zcmN0ZW1wbGF0ZSwgInZpZGVvc3JjIik7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKHZpZGVvc3JjLCBteXZpZGVvc3JjcGFkKTsKKworICBteW1hc2tzcmNwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJm1hc2tzcmN0ZW1wbGF0ZSwgIm1hc2tzcmMiKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAobWFza3NyYywgbXltYXNrc3JjcGFkKTsKKworICBteXNpbmtwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNpbmt0ZW1wbGF0ZSwgInNpbmsiKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoc2luaywgbXlzaW5rcGFkKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKG15c2lua3BhZCwgb25fY2hhaW4pOworCisgIHAgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc2hhcGV3aXBlLCAidmlkZW9fc2luayIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rIChteXZpZGVvc3JjcGFkLCBwKSA9PSBHU1RfUEFEX0xJTktfT0spOworICBnc3Rfb2JqZWN0X3VucmVmIChwKTsKKyAgcCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzaGFwZXdpcGUsICJtYXNrX3NpbmsiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAobXltYXNrc3JjcGFkLCBwKSA9PSBHU1RfUEFEX0xJTktfT0spOworICBnc3Rfb2JqZWN0X3VucmVmIChwKTsKKyAgcCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzaGFwZXdpcGUsICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAocCwgbXlzaW5rcGFkKSA9PSBHU1RfUEFEX0xJTktfT0spOworICBnc3Rfb2JqZWN0X3VucmVmIChwKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChTSEFQRVdJUEVfTUFTS19DQVBTX1NUUklORyk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15bWFza3NyY3BhZCwgbWFza3NyYywgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoU0hBUEVXSVBFX1ZJREVPX0NBUFNfU1RSSU5HKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXl2aWRlb3NyY3BhZCwgdmlkZW9zcmMsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBtYXNrID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg0MDAgKiA0MDApOworICBnc3RfYnVmZmVyX21hcCAobWFzaywgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDQwMDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IDQwMDsgaisrKSB7CisgICAgICBpZiAoaSA8IDEwMCAmJiBqIDwgMTAwKQorICAgICAgICBkYXRhWzBdID0gMDsKKyAgICAgIGVsc2UgaWYgKGkgPCAyMDAgJiYgaiA8IDIwMCkKKyAgICAgICAgZGF0YVswXSA9IDg1OworICAgICAgZWxzZSBpZiAoaSA8IDMwMCAmJiBqIDwgMzAwKQorICAgICAgICBkYXRhWzBdID0gMTcwOworICAgICAgZWxzZQorICAgICAgICBkYXRhWzBdID0gMjU0OworICAgICAgZGF0YSsrOworICAgIH0KKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChtYXNrLCAmbWFwKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteW1hc2tzcmNwYWQsIG1hc2spID09IEdTVF9GTE9XX09LKTsKKworICBpbnB1dCA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoNDAwICogNDAwICogNCk7CisgIGdzdF9idWZmZXJfbWFwIChpbnB1dCwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDQwMDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IDQwMDsgaisrKSB7CisgICAgICAvKiBUaGlzIGlzIGdyZWVuICovCisgICAgICBkYXRhWzBdID0gMjU1OyAgICAgICAgICAgIC8qIEEgKi8KKyAgICAgIGRhdGFbMV0gPSAxNzM7ICAgICAgICAgICAgLyogWSAqLworICAgICAgZGF0YVsyXSA9IDQyOyAgICAgICAgICAgICAvKiBVICovCisgICAgICBkYXRhWzNdID0gMjY7ICAgICAgICAgICAgIC8qIFYgKi8KKyAgICAgIGRhdGEgKz0gNDsKKyAgICB9CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5wdXQsICZtYXApOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHNoYXBld2lwZSksICJwb3NpdGlvbiIsIDAuMCwgTlVMTCk7CisgIG91dHB1dCA9IE5VTEw7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15dmlkZW9zcmNwYWQsCisgICAgICAgICAgZ3N0X2J1ZmZlcl9yZWYgKGlucHV0KSkgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAob3V0cHV0ICE9IE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAob3V0cHV0LCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgNDAwOyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgNDAwOyBqKyspIHsKKyAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbMF0sIDI1NSk7ICAgIC8qIEEgKi8KKyAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbMV0sIDE3Myk7ICAgIC8qIFkgKi8KKyAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbMl0sIDQyKTsgICAgIC8qIFUgKi8KKyAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbM10sIDI2KTsgICAgIC8qIFYgKi8KKyAgICAgIGRhdGEgKz0gNDsKKyAgICB9CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0cHV0LCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0cHV0KTsKKyAgb3V0cHV0ID0gTlVMTDsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzaGFwZXdpcGUpLCAicG9zaXRpb24iLCAwLjEsIE5VTEwpOworICBvdXRwdXQgPSBOVUxMOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXZpZGVvc3JjcGFkLAorICAgICAgICAgIGdzdF9idWZmZXJfcmVmIChpbnB1dCkpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKG91dHB1dCAhPSBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dHB1dCwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgNDAwOyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgNDAwOyBqKyspIHsKKyAgICAgIGlmIChpIDwgMTAwICYmIGogPCAxMDApIHsKKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YVswXSwgMCk7ICAgIC8qIEEgKi8KKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YVsxXSwgMTczKTsgIC8qIFkgKi8KKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YVsyXSwgNDIpOyAgIC8qIFUgKi8KKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YVszXSwgMjYpOyAgIC8qIFYgKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbMF0sIDI1NSk7ICAvKiBBICovCisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbMV0sIDE3Myk7ICAvKiBZICovCisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbMl0sIDQyKTsgICAvKiBVICovCisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbM10sIDI2KTsgICAvKiBWICovCisgICAgICB9CisgICAgICBkYXRhICs9IDQ7CisgICAgfQorICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKG91dHB1dCwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKG91dHB1dCk7CisgIG91dHB1dCA9IE5VTEw7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc2hhcGV3aXBlKSwgInBvc2l0aW9uIiwgMC4zNCwgTlVMTCk7CisgIG91dHB1dCA9IE5VTEw7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15dmlkZW9zcmNwYWQsCisgICAgICAgICAgZ3N0X2J1ZmZlcl9yZWYgKGlucHV0KSkgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAob3V0cHV0ICE9IE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAob3V0cHV0LCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBkYXRhID0gbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCA0MDA7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCA0MDA7IGorKykgeworICAgICAgaWYgKGkgPCAyMDAgJiYgaiA8IDIwMCkgeworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhWzBdLCAwKTsgICAgLyogQSAqLworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhWzFdLCAxNzMpOyAgLyogWSAqLworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhWzJdLCA0Mik7ICAgLyogVSAqLworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhWzNdLCAyNik7ICAgLyogViAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YVswXSwgMjU1KTsgIC8qIEEgKi8KKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YVsxXSwgMTczKTsgIC8qIFkgKi8KKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YVsyXSwgNDIpOyAgIC8qIFUgKi8KKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YVszXSwgMjYpOyAgIC8qIFYgKi8KKyAgICAgIH0KKyAgICAgIGRhdGEgKz0gNDsKKyAgICB9CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0cHV0LCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0cHV0KTsKKyAgb3V0cHV0ID0gTlVMTDsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzaGFwZXdpcGUpLCAicG9zaXRpb24iLCAwLjY3LCBOVUxMKTsKKyAgb3V0cHV0ID0gTlVMTDsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXl2aWRlb3NyY3BhZCwKKyAgICAgICAgICBnc3RfYnVmZmVyX3JlZiAoaW5wdXQpKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChvdXRwdXQgIT0gTlVMTCk7CisgIGdzdF9idWZmZXJfbWFwIChvdXRwdXQsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDQwMDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IDQwMDsgaisrKSB7CisgICAgICBpZiAoaSA8IDMwMCAmJiBqIDwgMzAwKSB7CisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbMF0sIDApOyAgICAvKiBBICovCisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbMV0sIDE3Myk7ICAvKiBZICovCisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbMl0sIDQyKTsgICAvKiBVICovCisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbM10sIDI2KTsgICAvKiBWICovCisgICAgICB9IGVsc2UgeworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhWzBdLCAyNTUpOyAgLyogQSAqLworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhWzFdLCAxNzMpOyAgLyogWSAqLworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhWzJdLCA0Mik7ICAgLyogVSAqLworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhWzNdLCAyNik7ICAgLyogViAqLworICAgICAgfQorICAgICAgZGF0YSArPSA0OworICAgIH0KKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChvdXRwdXQsICZtYXApOworICBnc3RfYnVmZmVyX3VucmVmIChvdXRwdXQpOworICBvdXRwdXQgPSBOVUxMOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHNoYXBld2lwZSksICJwb3NpdGlvbiIsIDEuMCwgTlVMTCk7CisgIG91dHB1dCA9IE5VTEw7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15dmlkZW9zcmNwYWQsCisgICAgICAgICAgZ3N0X2J1ZmZlcl9yZWYgKGlucHV0KSkgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAob3V0cHV0ICE9IE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAob3V0cHV0LCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBkYXRhID0gbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCA0MDA7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCA0MDA7IGorKykgeworICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YVswXSwgMCk7ICAgICAgLyogQSAqLworICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YVsxXSwgMTczKTsgICAgLyogWSAqLworICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YVsyXSwgNDIpOyAgICAgLyogVSAqLworICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YVszXSwgMjYpOyAgICAgLyogViAqLworICAgICAgZGF0YSArPSA0OworICAgIH0KKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChvdXRwdXQsICZtYXApOworICBnc3RfYnVmZmVyX3VucmVmIChvdXRwdXQpOworICBvdXRwdXQgPSBOVUxMOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGlucHV0KTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sCisgICAgICAgICAgR1NUX1NUQVRFX05VTEwpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgcCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzaGFwZXdpcGUsICJ2aWRlb19zaW5rIik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3VubGluayAobXl2aWRlb3NyY3BhZCwgcCkpOworICBnc3Rfb2JqZWN0X3VucmVmIChwKTsKKyAgcCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzaGFwZXdpcGUsICJtYXNrX3NpbmsiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfdW5saW5rIChteW1hc2tzcmNwYWQsIHApKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocCk7CisgIHAgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc2hhcGV3aXBlLCAic3JjIik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3VubGluayAocCwgbXlzaW5rcGFkKSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHApOworCisgIGdzdF9vYmplY3RfdW5yZWYgKGJpbik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK3NoYXBld2lwZV9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJzaGFwZXdpcGUiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9zZXRfdGltZW91dCAodGNfY2hhaW4sIDE4MCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nZW5lcmFsKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHNoYXBld2lwZSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGQ0ZGJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYwpAQCAtMCwwICsxLDY4MSBAQAorLyogR1N0cmVhbWVyIHVuaXQgdGVzdHMgZm9yIHRoZSBzb3VwaHR0cHNyYyBlbGVtZW50CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA4IFdvdXRlciBDbG9ldGVucyA8d291dGVyQG1pbmQuYmU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMywgWGltaWFuLCBJbmMuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWIvZ3ByaW50Zi5oPgorCisjZGVmaW5lIFNPVVBfVkVSU0lPTl9NSU5fUkVRVUlSRUQgKFNPVVBfVkVSU0lPTl8yXzQwKQorI2luY2x1ZGUgPGxpYnNvdXAvc291cC5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCisjaWYgIWRlZmluZWQoU09VUF9NSU5PUl9WRVJTSU9OKSB8fCBTT1VQX01JTk9SX1ZFUlNJT04gPCA0NAorI2RlZmluZSBTb3VwU3RhdHVzIFNvdXBLbm93blN0YXR1c0NvZGUKKyNlbmRpZgorCisKK2dib29sZWFuIHJlZGlyZWN0ID0gVFJVRTsKKworc3RhdGljIGNvbnN0IGNoYXIgKipjb29raWVzID0gTlVMTDsKKworLyogVmFyaWFibGVzIGZvciBhdXRoZW50aWNhdGlvbiB0ZXN0cyAqLworc3RhdGljIGNvbnN0IGNoYXIgKnVzZXJfaWQgPSBOVUxMOworc3RhdGljIGNvbnN0IGNoYXIgKnVzZXJfcHcgPSBOVUxMOworc3RhdGljIGNvbnN0IGNoYXIgKmdvb2RfdXNlciA9ICJnb29kX3VzZXIiOworc3RhdGljIGNvbnN0IGNoYXIgKmJhZF91c2VyID0gImJhZF91c2VyIjsKK3N0YXRpYyBjb25zdCBjaGFyICpnb29kX3B3ID0gImdvb2RfcHciOworc3RhdGljIGNvbnN0IGNoYXIgKmJhZF9wdyA9ICJiYWRfcHciOworc3RhdGljIGNvbnN0IGNoYXIgKnJlYWxtID0gIlNPVVBIVFRQU1JDX1JFQUxNIjsKK3N0YXRpYyBjb25zdCBjaGFyICpiYXNpY19hdXRoX3BhdGggPSAiL2Jhc2ljX2F1dGgiOworc3RhdGljIGNvbnN0IGNoYXIgKmRpZ2VzdF9hdXRoX3BhdGggPSAiL2RpZ2VzdF9hdXRoIjsKKworc3RhdGljIGNvbnN0IGNoYXIgKnNzbF9jZXJ0X2ZpbGUgPSBHU1RfVEVTVF9GSUxFU19QQVRIICIvdGVzdC1jZXJ0LnBlbSI7CitzdGF0aWMgY29uc3QgY2hhciAqc3NsX2tleV9maWxlID0gR1NUX1RFU1RfRklMRVNfUEFUSCAiL3Rlc3Qta2V5LnBlbSI7CisKK3N0YXRpYyBndWludCBnZXRfcG9ydF9mcm9tX3NlcnZlciAoU291cFNlcnZlciAqIHNlcnZlcik7CitzdGF0aWMgU291cFNlcnZlciAqcnVuX3NlcnZlciAoZ2Jvb2xlYW4gdXNlX2h0dHBzKTsKKworc3RhdGljIHZvaWQKK2hhbmRvZmZfY2IgKEdzdEVsZW1lbnQgKiBmYWtlc2luaywgR3N0QnVmZmVyICogYnVmLCBHc3RQYWQgKiBwYWQsCisgICAgR3N0QnVmZmVyICoqIHBfb3V0YnVmKQoreworICBHU1RfTE9HICgiaGFuZG9mZiwgYnVmID0gJXAiLCBidWYpOworICBpZiAoKnBfb3V0YnVmID09IE5VTEwpCisgICAgKnBfb3V0YnVmID0gZ3N0X2J1ZmZlcl9yZWYgKGJ1Zik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorYmFzaWNfYXV0aF9jYiAoU291cEF1dGhEb21haW4gKiBkb21haW4sIFNvdXBNZXNzYWdlICogbXNnLAorICAgIGNvbnN0IGNoYXIgKnVzZXJuYW1lLCBjb25zdCBjaGFyICpwYXNzd29yZCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICAvKiBUaGVyZSBpcyBvbmx5IG9uZSBnb29kIGxvZ2luIGZvciB0ZXN0aW5nICovCisgIHJldHVybiAoc3RyY21wICh1c2VybmFtZSwgZ29vZF91c2VyKSA9PSAwKQorICAgICAgJiYgKHN0cmNtcCAocGFzc3dvcmQsIGdvb2RfcHcpID09IDApOworfQorCisKK3N0YXRpYyBjaGFyICoKK2RpZ2VzdF9hdXRoX2NiIChTb3VwQXV0aERvbWFpbiAqIGRvbWFpbiwgU291cE1lc3NhZ2UgKiBtc2csCisgICAgY29uc3QgY2hhciAqdXNlcm5hbWUsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgLyogVGhlcmUgaXMgb25seSBvbmUgZ29vZCBsb2dpbiBmb3IgdGVzdGluZyAqLworICBpZiAoc3RyY21wICh1c2VybmFtZSwgZ29vZF91c2VyKSA9PSAwKQorICAgIHJldHVybiBzb3VwX2F1dGhfZG9tYWluX2RpZ2VzdF9lbmNvZGVfcGFzc3dvcmQgKGdvb2RfdXNlciwgcmVhbG0sIGdvb2RfcHcpOworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGdib29sZWFuCitydW5fdGVzdCAoZ2Jvb2xlYW4gdXNlX2h0dHBzLCBjb25zdCBnY2hhciAqIHBhdGgsIGdpbnQgZXhwZWN0ZWQpCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0RWxlbWVudCAqcGlwZSwgKnNyYywgKnNpbms7CisgIEdzdEJ1ZmZlciAqYnVmID0gTlVMTDsKKyAgR3N0TWVzc2FnZSAqbXNnOworICBnY2hhciAqdXJsOworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKyAgU291cFNlcnZlciAqc2VydmVyOworICBndWludCBwb3J0OworCisgIHNlcnZlciA9IHJ1bl9zZXJ2ZXIgKHVzZV9odHRwcyk7CisgIGlmIChzZXJ2ZXIgPT0gTlVMTCkgeworICAgIGdfcHJpbnQgKCJGYWlsZWQgdG8gc3RhcnQgdXAgJXMgc2VydmVyIiwgdXNlX2h0dHBzID8gIkhUVFBTIiA6ICJIVFRQIik7CisgICAgLyogc2tpcCB0aGlzIHRlc3QgKi8KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHBpcGUgPSBnc3RfcGlwZWxpbmVfbmV3IChOVUxMKTsKKworICBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJzb3VwaHR0cHNyYyIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoc3JjICE9IE5VTEwpOworCisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoc2luayAhPSBOVUxMKTsKKworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZSksIHNyYyk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlKSwgc2luayk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rIChzcmMsIHNpbmspKTsKKworICBwb3J0ID0gZ2V0X3BvcnRfZnJvbV9zZXJ2ZXIgKHNlcnZlcik7CisgIHVybCA9IGdfc3RyZHVwX3ByaW50ZiAoIiVzOi8vMTI3LjAuMC4xOiV1JXMiLAorICAgICAgdXNlX2h0dHBzID8gImh0dHBzIiA6ICJodHRwIiwgcG9ydCwgcGF0aCk7CisgIGZhaWxfdW5sZXNzICh1cmwgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc3JjLCAibG9jYXRpb24iLCB1cmwsIE5VTEwpOworICBnX2ZyZWUgKHVybCk7CisKKyAgaWYgKHVzZV9odHRwcykgeworICAgIEdUbHNEYXRhYmFzZSAqdGxzZGI7CisgICAgR0Vycm9yICplcnJvciA9IE5VTEw7CisgICAgZ2NoYXIgKnBhdGg7CisKKyAgICAvKiBHVGxzRmlsZURhdGFiYXNlIG5lZWRzIGFuIGFic29sdXRlIHBhdGguIFVzaW5nIGEgcmVsYXRpdmUgb25lCisgICAgICogY2F1c2VzIGEgd2FybmluZyBmcm9tIEdMaWItTmV0IGZvbGxvd2VkIGJ5IGEgc2VnZmF1bHQgaW4gR251VExTICovCisgICAgaWYgKGdfcGF0aF9pc19hYnNvbHV0ZSAoc3NsX2NlcnRfZmlsZSkpIHsKKyAgICAgIHBhdGggPSBnX3N0cmR1cCAoc3NsX2NlcnRfZmlsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBhdGggPSBnX2J1aWxkX2ZpbGVuYW1lIChnX2dldF9jdXJyZW50X2RpciAoKSwgc3NsX2NlcnRfZmlsZSwgTlVMTCk7CisgICAgfQorCisgICAgdGxzZGIgPSBnX3Rsc19maWxlX2RhdGFiYXNlX25ldyAocGF0aCwgJmVycm9yKTsKKyAgICBmYWlsX3VubGVzcyAodGxzZGIsICJGYWlsZWQgdG8gbG9hZCBjZXJ0aWZpY2F0ZTogJXMiLCBlcnJvci0+bWVzc2FnZSk7CisKKyAgICBnX29iamVjdF9zZXQgKHNyYywgInRscy1kYXRhYmFzZSIsIHRsc2RiLCBOVUxMKTsKKworICAgIGdfb2JqZWN0X3VucmVmICh0bHNkYik7CisgICAgZ19mcmVlIChwYXRoKTsKKyAgfQorCisgIGdfb2JqZWN0X3NldCAoc3JjLCAiYXV0b21hdGljLXJlZGlyZWN0IiwgcmVkaXJlY3QsIE5VTEwpOworICBpZiAoY29va2llcyAhPSBOVUxMKQorICAgIGdfb2JqZWN0X3NldCAoc3JjLCAiY29va2llcyIsIGNvb2tpZXMsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNpbmssICJzaWduYWwtaGFuZG9mZnMiLCBUUlVFLCBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoc2luaywgInByZXJvbGwtaGFuZG9mZiIsIEdfQ0FMTEJBQ0sgKGhhbmRvZmZfY2IpLCAmYnVmKTsKKworICBpZiAodXNlcl9pZCAhPSBOVUxMKQorICAgIGdfb2JqZWN0X3NldCAoc3JjLCAidXNlci1pZCIsIHVzZXJfaWQsIE5VTEwpOworICBpZiAodXNlcl9wdyAhPSBOVUxMKQorICAgIGdfb2JqZWN0X3NldCAoc3JjLCAidXNlci1wdyIsIHVzZXJfcHcsIE5VTEwpOworCisgIHJldCA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZSwgR1NUX1NUQVRFX1BBVVNFRCk7CisgIGlmIChyZXQgIT0gR1NUX1NUQVRFX0NIQU5HRV9BU1lOQykgeworICAgIEdTVF9ERUJVRyAoImZhaWxlZCB0byBzdGFydCB1cCBzb3VwIGh0dHAgc3JjLCByZXQgPSAlZCIsIHJldCk7CisgICAgZ290byBkb25lOworICB9CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIG1zZyA9IGdzdF9idXNfcG9sbCAoR1NUX0VMRU1FTlRfQlVTIChwaXBlKSwKKyAgICAgIEdTVF9NRVNTQUdFX0VPUyB8IEdTVF9NRVNTQUdFX0VSUk9SLCAtMSk7CisgIGlmIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VSUk9SKSB7CisgICAgZ2NoYXIgKmRlYnVnID0gTlVMTDsKKyAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisgICAgZ2ludCByYyA9IC0xOworCisgICAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1zZywgJmVyciwgJmRlYnVnKTsKKyAgICBHU1RfSU5GTyAoImVycm9yOiAlcyIsIGVyci0+bWVzc2FnZSk7CisgICAgaWYgKGdfc3RyX2hhc19zdWZmaXggKGVyci0+bWVzc2FnZSwgIk5vdCBGb3VuZCIpKQorICAgICAgcmMgPSA0MDQ7CisgICAgZWxzZSBpZiAoZ19zdHJfaGFzX3N1ZmZpeCAoZXJyLT5tZXNzYWdlLCAiRm9yYmlkZGVuIikpCisgICAgICByYyA9IDQwMzsKKyAgICBlbHNlIGlmIChnX3N0cl9oYXNfc3VmZml4IChlcnItPm1lc3NhZ2UsICJVbmF1dGhvcml6ZWQiKSkKKyAgICAgIHJjID0gNDAxOworICAgIGVsc2UgaWYgKGdfc3RyX2hhc19zdWZmaXggKGVyci0+bWVzc2FnZSwgIkZvdW5kIikpCisgICAgICByYyA9IDMwMjsKKyAgICBHU1RfSU5GTyAoImRlYnVnOiAlcyIsIGRlYnVnKTsKKyAgICAvKiBzaG91bGQgbm90J3ZlIGdvdHRlbiBhbnkgb3V0cHV0IGluIGNhc2Ugb2YgYSA0MHggZXJyb3IuIFdhaXQgYSBiaXQKKyAgICAgKiB0byBnaXZlIHRoZSBzdHJlYW1pbmcgdGhyZWFkIGEgY2hhbmNlIHRvIHB1c2ggb3V0IGEgYnVmZmVyIGFuZCB0cmlnZ2VyCisgICAgICogb3VyIGNhbGxiYWNrIGJlZm9yZSBzaHV0dGluZyBkb3duIHRoZSBwaXBlbGluZSAqLworICAgIGdfdXNsZWVwIChHX1VTRUNfUEVSX1NFQyAvIDIpOworICAgIGZhaWxfdW5sZXNzIChidWYgPT0gTlVMTCk7CisgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICAgIGdfZnJlZSAoZGVidWcpOworICAgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworICAgIEdTVF9ERUJVRyAoIkdvdCBIVFRQIGVycm9yICV1LCBleHBlY3RlZCAldSIsIHJjLCBleHBlY3RlZCk7CisgICAgcmVzID0gKHJjID09IGV4cGVjdGVkKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisKKyAgLyogZG9uJ3Qgd2FpdCBmb3IgbW9yZSB0aGFuIDEwIHNlY29uZHMgKi8KKyAgcmV0ID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChwaXBlLCBOVUxMLCBOVUxMLCAxMCAqIEdTVF9TRUNPTkQpOworICBHU1RfTE9HICgicmV0ID0gJXUiLCByZXQpOworCisgIGlmIChidWYgPT0gTlVMTCkgeworICAgIC8qIHdlIHdhbnQgdG8gdGVzdCB0aGUgYnVmZmVyIG9mZnNldCwgbm90aGluZyBlbHNlOyBpZiB0aGVyZSdzIGEgZmFpbHVyZQorICAgICAqIGl0IG1pZ2h0IGJlIGZvciBsb3RzIG9mIHJlYXNvbnMgKG5vIG5ldHdvcmsgY29ubmVjdGlvbiwgd2hhdGV2ZXIpLCB3ZSdyZQorICAgICAqIG5vdCBpbnRlcmVzdGVkIGluIHRob3NlICovCisgICAgR1NUX0RFQlVHICgiZGlkbid0IG1hbmFnZSB0byBnZXQgZGF0YSB3aXRoaW4gMTAgc2Vjb25kcywgc2tpcHBpbmcgdGVzdCIpOworICAgIHJlcyA9IFRSVUU7CisgICAgZ290byBkb25lOworICB9CisKKyAgR1NUX0RFQlVHICgiYnVmZmVyIG9mZnNldCA9ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpKTsKKworICAvKiBmaXJzdCBidWZmZXIgc2hvdWxkIGhhdmUgYSAwIG9mZnNldCAqLworICBmYWlsX3VubGVzcyAoR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikgPT0gMCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIHJlcyA9IChleHBlY3RlZCA9PSAwKTsKKworZG9uZToKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNlcnZlcik7CisgIHJldHVybiByZXM7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ZpcnN0X2J1ZmZlcl9oYXNfb2Zmc2V0KQoreworICBmYWlsX3VubGVzcyAocnVuX3Rlc3QgKEZBTFNFLCAiLyIsIDApKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ub3RfZm91bmQpCit7CisgIGZhaWxfdW5sZXNzIChydW5fdGVzdCAoRkFMU0UsICIvNDA0IiwgNDA0KSk7CisgIGZhaWxfdW5sZXNzIChydW5fdGVzdCAoRkFMU0UsICIvNDA0LXdpdGgtZGF0YSIsIDQwNCkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ZvcmJpZGRlbikKK3sKKyAgZmFpbF91bmxlc3MgKHJ1bl90ZXN0IChGQUxTRSwgIi80MDMiLCA0MDMpKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9yZWRpcmVjdF9ubykKK3sKKyAgcmVkaXJlY3QgPSBGQUxTRTsKKyAgZmFpbF91bmxlc3MgKHJ1bl90ZXN0IChGQUxTRSwgIi8zMDIiLCAzMDIpKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9yZWRpcmVjdF95ZXMpCit7CisgIHJlZGlyZWN0ID0gVFJVRTsKKyAgZmFpbF91bmxlc3MgKHJ1bl90ZXN0IChGQUxTRSwgIi8zMDIiLCAwKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaHR0cHMpCit7CisgIGZhaWxfdW5sZXNzIChydW5fdGVzdCAoVFJVRSwgIi8iLCAwKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfY29va2llcykKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmJpc2NvdHRpW10gPSB7ICJkZWxhY3JlPXl1bW1pZSIsICJrb2VramU9bHUiLCBOVUxMIH07CisgIGdib29sZWFuIHJlczsKKworICBjb29raWVzID0gYmlzY290dGk7CisgIHJlcyA9IHJ1bl90ZXN0IChGQUxTRSwgIi8iLCAwKTsKKyAgY29va2llcyA9IE5VTEw7CisgIGZhaWxfdW5sZXNzIChyZXMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2dvb2RfdXNlcl9iYXNpY19hdXRoKQoreworICBnYm9vbGVhbiByZXM7CisKKyAgdXNlcl9pZCA9IGdvb2RfdXNlcjsKKyAgdXNlcl9wdyA9IGdvb2RfcHc7CisgIHJlcyA9IHJ1bl90ZXN0IChGQUxTRSwgYmFzaWNfYXV0aF9wYXRoLCAwKTsKKyAgR1NUX0RFQlVHICgiQmFzaWMgQXV0aCB1c2VyICVzIHBhc3N3b3JkICVzIHJlcyA9ICVkIiwgdXNlcl9pZCwgdXNlcl9wdywgcmVzKTsKKyAgdXNlcl9pZCA9IHVzZXJfcHcgPSBOVUxMOworICBmYWlsX3VubGVzcyAocmVzKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9iYWRfdXNlcl9iYXNpY19hdXRoKQoreworICBnYm9vbGVhbiByZXM7CisKKyAgdXNlcl9pZCA9IGJhZF91c2VyOworICB1c2VyX3B3ID0gZ29vZF9wdzsKKyAgcmVzID0gcnVuX3Rlc3QgKEZBTFNFLCBiYXNpY19hdXRoX3BhdGgsIDQwMSk7CisgIEdTVF9ERUJVRyAoIkJhc2ljIEF1dGggdXNlciAlcyBwYXNzd29yZCAlcyByZXMgPSAlZCIsIHVzZXJfaWQsIHVzZXJfcHcsIHJlcyk7CisgIHVzZXJfaWQgPSB1c2VyX3B3ID0gTlVMTDsKKyAgZmFpbF91bmxlc3MgKHJlcyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYmFkX3Bhc3N3b3JkX2Jhc2ljX2F1dGgpCit7CisgIGdib29sZWFuIHJlczsKKworICB1c2VyX2lkID0gZ29vZF91c2VyOworICB1c2VyX3B3ID0gYmFkX3B3OworICByZXMgPSBydW5fdGVzdCAoRkFMU0UsIGJhc2ljX2F1dGhfcGF0aCwgNDAxKTsKKyAgR1NUX0RFQlVHICgiQmFzaWMgQXV0aCB1c2VyICVzIHBhc3N3b3JkICVzIHJlcyA9ICVkIiwgdXNlcl9pZCwgdXNlcl9wdywgcmVzKTsKKyAgdXNlcl9pZCA9IHVzZXJfcHcgPSBOVUxMOworICBmYWlsX3VubGVzcyAocmVzKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9nb29kX3VzZXJfZGlnZXN0X2F1dGgpCit7CisgIGdib29sZWFuIHJlczsKKworICB1c2VyX2lkID0gZ29vZF91c2VyOworICB1c2VyX3B3ID0gZ29vZF9wdzsKKyAgcmVzID0gcnVuX3Rlc3QgKEZBTFNFLCBkaWdlc3RfYXV0aF9wYXRoLCAwKTsKKyAgR1NUX0RFQlVHICgiRGlnZXN0IEF1dGggdXNlciAlcyBwYXNzd29yZCAlcyByZXMgPSAlZCIsIHVzZXJfaWQsIHVzZXJfcHcsIHJlcyk7CisgIHVzZXJfaWQgPSB1c2VyX3B3ID0gTlVMTDsKKyAgZmFpbF91bmxlc3MgKHJlcyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYmFkX3VzZXJfZGlnZXN0X2F1dGgpCit7CisgIGdib29sZWFuIHJlczsKKworICB1c2VyX2lkID0gYmFkX3VzZXI7CisgIHVzZXJfcHcgPSBnb29kX3B3OworICByZXMgPSBydW5fdGVzdCAoRkFMU0UsIGRpZ2VzdF9hdXRoX3BhdGgsIDQwMSk7CisgIEdTVF9ERUJVRyAoIkRpZ2VzdCBBdXRoIHVzZXIgJXMgcGFzc3dvcmQgJXMgcmVzID0gJWQiLCB1c2VyX2lkLCB1c2VyX3B3LCByZXMpOworICB1c2VyX2lkID0gdXNlcl9wdyA9IE5VTEw7CisgIGZhaWxfdW5sZXNzIChyZXMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2JhZF9wYXNzd29yZF9kaWdlc3RfYXV0aCkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHVzZXJfaWQgPSBnb29kX3VzZXI7CisgIHVzZXJfcHcgPSBiYWRfcHc7CisgIHJlcyA9IHJ1bl90ZXN0IChGQUxTRSwgZGlnZXN0X2F1dGhfcGF0aCwgNDAxKTsKKyAgR1NUX0RFQlVHICgiRGlnZXN0IEF1dGggdXNlciAlcyBwYXNzd29yZCAlcyByZXMgPSAlZCIsIHVzZXJfaWQsIHVzZXJfcHcsIHJlcyk7CisgIHVzZXJfaWQgPSB1c2VyX3B3ID0gTlVMTDsKKyAgZmFpbF91bmxlc3MgKHJlcyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIGdib29sZWFuIGljeV9jYXBzID0gRkFMU0U7CisKK3N0YXRpYyB2b2lkCitnb3RfYnVmZmVyIChHc3RFbGVtZW50ICogZmFrZXNpbmssIEdzdEJ1ZmZlciAqIGJ1ZiwgR3N0UGFkICogcGFkLAorICAgIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0U3RydWN0dXJlICpzOworICBHc3RDYXBzICpjYXBzOworCisgIC8qIENhcHMgY2FuIGJlIGFueXRoaW5nIGlmIHdlIGRvbid0IGV4Y2VwdCBpY3kgY2FwcyAqLworICBpZiAoIWljeV9jYXBzKQorICAgIHJldHVybjsKKworICAvKiBPdGhlcndpc2UgdGhleSBfbXVzdF8gYmUgImFwcGxpY2F0aW9uL3gtaWN5IiAqLworICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChwYWQpOworICBmYWlsX3VubGVzcyAoY2FwcyAhPSBOVUxMKTsKKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nIChnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzKSwgImFwcGxpY2F0aW9uL3gtaWN5Iik7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaWN5X3N0cmVhbSkKK3sKKyAgR3N0RWxlbWVudCAqcGlwZSwgKnNyYywgKnNpbms7CisKKyAgR3N0TWVzc2FnZSAqbXNnOworCisgIHBpcGUgPSBnc3RfcGlwZWxpbmVfbmV3IChOVUxMKTsKKworICBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJzb3VwaHR0cHNyYyIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoc3JjICE9IE5VTEwpOworCisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoc2luayAhPSBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzaW5rLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNpbmssICJoYW5kb2ZmIiwgR19DQUxMQkFDSyAoZ290X2J1ZmZlciksIE5VTEwpOworCisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlKSwgc3JjKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGUpLCBzaW5rKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmsgKHNyYywgc2luaykpOworCisgIC8qIFJhZGlvbm9teSBIb3Q0ME11c2ljIHNob3V0Y2FzdCBzdHJlYW0gKi8KKyAgZ19vYmplY3Rfc2V0IChzcmMsICJsb2NhdGlvbiIsCisgICAgICAiaHR0cDovL3N0cmVhbWluZy5yYWRpb25vbXkuY29tOjgwL0hvdDQwTXVzaWMiLCBOVUxMKTsKKworICAvKiBFT1MgYWZ0ZXIgdGhlIGZpcnN0IGJ1ZmZlciAqLworICBnX29iamVjdF9zZXQgKHNyYywgIm51bS1idWZmZXJzIiwgMSwgTlVMTCk7CisgIGljeV9jYXBzID0gVFJVRTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIG1zZyA9IGdzdF9idXNfcG9sbCAoR1NUX0VMRU1FTlRfQlVTIChwaXBlKSwKKyAgICAgIEdTVF9NRVNTQUdFX0VPUyB8IEdTVF9NRVNTQUdFX0VSUk9SLCAtMSk7CisKKyAgc3dpdGNoIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpKSB7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FT1M6CisgICAgICBHU1RfREVCVUcgKCJzdWNjZXNzLCB3ZSdyZSBkb25lIGhlcmUiKTsKKyAgICAgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FUlJPUjp7CisgICAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChtc2csICZlcnIsIE5VTEwpOworICAgICAgR1NUX0lORk8gKCJFcnJvciB3aXRoIElDWSBtcDMgc2hvdXRjYXN0IHN0cmVhbTogJXMiLCBlcnItPm1lc3NhZ2UpOworICAgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgICAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBpY3lfY2FwcyA9IEZBTFNFOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZSwgR1NUX1NUQVRFX05VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorc291cGh0dHBzcmNfc3VpdGUgKHZvaWQpCit7CisgIFRDYXNlICp0Y19jaGFpbiwgKnRjX2ludGVybmV0OworICBTdWl0ZSAqczsKKworICAvKiB3ZSBkb24ndCBzdXBwb3J0IGV4Y2VwdGlvbnMgZnJvbSB0aGUgcHJveHksIHNvIGp1c3QgdW5zZXQgdGhlIGVudmlyb25tZW50CisgICAqIHZhcmlhYmxlIC0gaW4gY2FzZSBpdCdzIHNldCBpbiB0aGUgdGVzdCBlbnZpcm9ubWVudCBpdCB3b3VsZCBvdGhlcndpc2UKKyAgICogcHJldmVudCB1cyBmcm9tIGNvbm5lY3RpbmcgdG8gbG9jYWxob3N0IChsaWtlIGplbmtpbnMucWEudWJ1bnR1LmNvbSkgKi8KKyAgZ191bnNldGVudiAoImh0dHBfcHJveHkiKTsKKworICBzID0gc3VpdGVfY3JlYXRlICgic291cGh0dHBzcmMiKTsKKyAgdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisgIHRjX2ludGVybmV0ID0gdGNhc2VfY3JlYXRlICgiaW50ZXJuZXQiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ZpcnN0X2J1ZmZlcl9oYXNfb2Zmc2V0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3JlZGlyZWN0X3llcyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9yZWRpcmVjdF9ubyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ub3RfZm91bmQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZm9yYmlkZGVuKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2Nvb2tpZXMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ29vZF91c2VyX2Jhc2ljX2F1dGgpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYmFkX3VzZXJfYmFzaWNfYXV0aCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9iYWRfcGFzc3dvcmRfYmFzaWNfYXV0aCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nb29kX3VzZXJfZGlnZXN0X2F1dGgpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYmFkX3VzZXJfZGlnZXN0X2F1dGgpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYmFkX3Bhc3N3b3JkX2RpZ2VzdF9hdXRoKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2h0dHBzKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2ludGVybmV0KTsKKyAgdGNhc2Vfc2V0X3RpbWVvdXQgKHRjX2ludGVybmV0LCAyNTApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfaW50ZXJuZXQsIHRlc3RfaWN5X3N0cmVhbSk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChzb3VwaHR0cHNyYyk7CisKK3N0YXRpYyB2b2lkCitkb19nZXQgKFNvdXBNZXNzYWdlICogbXNnLCBjb25zdCBjaGFyICpwYXRoKQoreworICBnYm9vbGVhbiBzZW5kX2Vycm9yX2RvYyA9IEZBTFNFOworICBjaGFyICp1cmk7CisKKyAgaW50IGJ1ZmxlbiA9IDQwOTY7CisKKyAgU291cFN0YXR1cyBzdGF0dXMgPSBTT1VQX1NUQVRVU19PSzsKKworICB1cmkgPSBzb3VwX3VyaV90b19zdHJpbmcgKHNvdXBfbWVzc2FnZV9nZXRfdXJpIChtc2cpLCBGQUxTRSk7CisgIEdTVF9ERUJVRyAoInJlcXVlc3Q6IFwiJXNcIiIsIHVyaSk7CisKKyAgaWYgKCFzdHJjbXAgKHBhdGgsICIvMzAxIikpCisgICAgc3RhdHVzID0gU09VUF9TVEFUVVNfTU9WRURfUEVSTUFORU5UTFk7CisgIGVsc2UgaWYgKCFzdHJjbXAgKHBhdGgsICIvMzAyIikpCisgICAgc3RhdHVzID0gU09VUF9TVEFUVVNfTU9WRURfVEVNUE9SQVJJTFk7CisgIGVsc2UgaWYgKCFzdHJjbXAgKHBhdGgsICIvMzA3IikpCisgICAgc3RhdHVzID0gU09VUF9TVEFUVVNfVEVNUE9SQVJZX1JFRElSRUNUOworICBlbHNlIGlmICghc3RyY21wIChwYXRoLCAiLzQwMyIpKQorICAgIHN0YXR1cyA9IFNPVVBfU1RBVFVTX0ZPUkJJRERFTjsKKyAgZWxzZSBpZiAoIXN0cmNtcCAocGF0aCwgIi80MDQiKSkKKyAgICBzdGF0dXMgPSBTT1VQX1NUQVRVU19OT1RfRk9VTkQ7CisgIGVsc2UgaWYgKCFzdHJjbXAgKHBhdGgsICIvNDA0LXdpdGgtZGF0YSIpKSB7CisgICAgc3RhdHVzID0gU09VUF9TVEFUVVNfTk9UX0ZPVU5EOworICAgIHNlbmRfZXJyb3JfZG9jID0gVFJVRTsKKyAgfQorCisgIGlmIChTT1VQX1NUQVRVU19JU19SRURJUkVDVElPTiAoc3RhdHVzKSkgeworICAgIGNoYXIgKnJlZGlyX3VyaTsKKworICAgIHJlZGlyX3VyaSA9IGdfc3RyZHVwX3ByaW50ZiAoIiVzLXJlZGlyZWN0ZWQiLCB1cmkpOworICAgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2FwcGVuZCAobXNnLT5yZXNwb25zZV9oZWFkZXJzLCAiTG9jYXRpb24iLCByZWRpcl91cmkpOworICAgIGdfZnJlZSAocmVkaXJfdXJpKTsKKyAgfQorICBpZiAoc3RhdHVzICE9IChTb3VwU3RhdHVzKSBTT1VQX1NUQVRVU19PSyAmJiAhc2VuZF9lcnJvcl9kb2MpCisgICAgZ290byBsZWF2ZTsKKworICBpZiAobXNnLT5tZXRob2QgPT0gU09VUF9NRVRIT0RfR0VUKSB7CisgICAgY2hhciAqYnVmOworCisgICAgYnVmID0gZ19tYWxsb2MgKGJ1Zmxlbik7CisgICAgbWVtc2V0IChidWYsIDAsIGJ1Zmxlbik7CisgICAgc291cF9tZXNzYWdlX2JvZHlfYXBwZW5kIChtc2ctPnJlc3BvbnNlX2JvZHksIFNPVVBfTUVNT1JZX1RBS0UsCisgICAgICAgIGJ1ZiwgYnVmbGVuKTsKKyAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogbXNnLT5tZXRob2QgPT0gU09VUF9NRVRIT0RfSEVBRCAqLworCisgICAgY2hhciAqbGVuZ3RoOworCisgICAgLyogV2UgY291bGQganVzdCB1c2UgdGhlIHNhbWUgY29kZSBmb3IgYm90aCBHRVQgYW5kCisgICAgICogSEVBRC4gQnV0IHdlJ2xsIG9wdGltaXplIGFuZCBhdm9pZCB0aGUgZXh0cmEKKyAgICAgKiBtYWxsb2MuCisgICAgICovCisgICAgbGVuZ3RoID0gZ19zdHJkdXBfcHJpbnRmICgiJWx1IiwgKGd1bG9uZykgYnVmbGVuKTsKKyAgICBzb3VwX21lc3NhZ2VfaGVhZGVyc19hcHBlbmQgKG1zZy0+cmVzcG9uc2VfaGVhZGVycywKKyAgICAgICAgIkNvbnRlbnQtTGVuZ3RoIiwgbGVuZ3RoKTsKKyAgICBnX2ZyZWUgKGxlbmd0aCk7CisgIH0KKworbGVhdmU6CisgIHNvdXBfbWVzc2FnZV9zZXRfc3RhdHVzIChtc2csIHN0YXR1cyk7CisgIGdfZnJlZSAodXJpKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2hlYWRlciAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIGdwb2ludGVyIGRhdGEpCit7CisgIEdTVF9ERUJVRyAoImhlYWRlcjogJXM6ICVzIiwgbmFtZSwgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZAorc2VydmVyX2NhbGxiYWNrIChTb3VwU2VydmVyICogc2VydmVyLCBTb3VwTWVzc2FnZSAqIG1zZywKKyAgICBjb25zdCBjaGFyICpwYXRoLCBHSGFzaFRhYmxlICogcXVlcnksCisgICAgU291cENsaWVudENvbnRleHQgKiBjb250ZXh0LCBncG9pbnRlciBkYXRhKQoreworICBHU1RfREVCVUcgKCIlcyAlcyBIVFRQLzEuJWQiLCBtc2ctPm1ldGhvZCwgcGF0aCwKKyAgICAgIHNvdXBfbWVzc2FnZV9nZXRfaHR0cF92ZXJzaW9uIChtc2cpKTsKKyAgc291cF9tZXNzYWdlX2hlYWRlcnNfZm9yZWFjaCAobXNnLT5yZXF1ZXN0X2hlYWRlcnMsIHByaW50X2hlYWRlciwgTlVMTCk7CisgIGlmIChtc2ctPnJlcXVlc3RfYm9keS0+bGVuZ3RoKQorICAgIEdTVF9ERUJVRyAoIiVzIiwgbXNnLT5yZXF1ZXN0X2JvZHktPmRhdGEpOworCisgIGlmIChtc2ctPm1ldGhvZCA9PSBTT1VQX01FVEhPRF9HRVQgfHwgbXNnLT5tZXRob2QgPT0gU09VUF9NRVRIT0RfSEVBRCkKKyAgICBkb19nZXQgKG1zZywgcGF0aCk7CisgIGVsc2UKKyAgICBzb3VwX21lc3NhZ2Vfc2V0X3N0YXR1cyAobXNnLCBTT1VQX1NUQVRVU19OT1RfSU1QTEVNRU5URUQpOworCisgIEdTVF9ERUJVRyAoIiAgLT4gJWQgJXMiLCBtc2ctPnN0YXR1c19jb2RlLCBtc2ctPnJlYXNvbl9waHJhc2UpOworfQorCitzdGF0aWMgZ3VpbnQKK2dldF9wb3J0X2Zyb21fc2VydmVyIChTb3VwU2VydmVyICogc2VydmVyKQoreworICBHU0xpc3QgKnVyaXM7CisgIGd1aW50IHBvcnQ7CisKKyAgdXJpcyA9IHNvdXBfc2VydmVyX2dldF91cmlzIChzZXJ2ZXIpOworICBnX2Fzc2VydCAoZ19zbGlzdF9sZW5ndGggKHVyaXMpID09IDEpOworICBwb3J0ID0gc291cF91cmlfZ2V0X3BvcnQgKHVyaXMtPmRhdGEpOworICBnX3NsaXN0X2ZyZWVfZnVsbCAodXJpcywgKEdEZXN0cm95Tm90aWZ5KSBzb3VwX3VyaV9mcmVlKTsKKworICByZXR1cm4gcG9ydDsKK30KKworc3RhdGljIFNvdXBTZXJ2ZXIgKgorcnVuX3NlcnZlciAoZ2Jvb2xlYW4gdXNlX2h0dHBzKQoreworICBTb3VwU2VydmVyICpzZXJ2ZXIgPSBzb3VwX3NlcnZlcl9uZXcgKE5VTEwsIE5VTEwpOworICBTb3VwU2VydmVyTGlzdGVuT3B0aW9ucyBsaXN0ZW5fZmxhZ3MgPSAwOworICBndWludCBwb3J0OworCisKKyAgaWYgKHVzZV9odHRwcykgeworICAgIEdUbHNCYWNrZW5kICpiYWNrZW5kID0gZ190bHNfYmFja2VuZF9nZXRfZGVmYXVsdCAoKTsKKyAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgICBpZiAoYmFja2VuZCA9PSBOVUxMIHx8ICFnX3Rsc19iYWNrZW5kX3N1cHBvcnRzX3RscyAoYmFja2VuZCkpIHsKKyAgICAgIEdTVF9JTkZPICgiTm8gVExTIHN1cHBvcnQiKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKCFzb3VwX3NlcnZlcl9zZXRfc3NsX2NlcnRfZmlsZSAoc2VydmVyLCBzc2xfY2VydF9maWxlLCBzc2xfa2V5X2ZpbGUsCisgICAgICAgICAgJmVycikpIHsKKyAgICAgIEdTVF9JTkZPICgiRmFpbGVkIHRvIGxvYWQgY2VydGlmaWNhdGU6ICVzIiwgZXJyLT5tZXNzYWdlKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXIpOworICAgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbGlzdGVuX2ZsYWdzIHw9IFNPVVBfU0VSVkVSX0xJU1RFTl9IVFRQUzsKKyAgfQorCisgIHNvdXBfc2VydmVyX2FkZF9oYW5kbGVyIChzZXJ2ZXIsIE5VTEwsIHNlcnZlcl9jYWxsYmFjaywgTlVMTCwgTlVMTCk7CisKKyAgeworICAgIFNvdXBBdXRoRG9tYWluICpkb21haW47CisKKyAgICBkb21haW4gPSBzb3VwX2F1dGhfZG9tYWluX2Jhc2ljX25ldyAoU09VUF9BVVRIX0RPTUFJTl9SRUFMTSwgcmVhbG0sCisgICAgICAgIFNPVVBfQVVUSF9ET01BSU5fQkFTSUNfQVVUSF9DQUxMQkFDSywgYmFzaWNfYXV0aF9jYiwKKyAgICAgICAgU09VUF9BVVRIX0RPTUFJTl9BRERfUEFUSCwgYmFzaWNfYXV0aF9wYXRoLCBOVUxMKTsKKyAgICBzb3VwX3NlcnZlcl9hZGRfYXV0aF9kb21haW4gKHNlcnZlciwgZG9tYWluKTsKKyAgICBnX29iamVjdF91bnJlZiAoZG9tYWluKTsKKworICAgIGRvbWFpbiA9IHNvdXBfYXV0aF9kb21haW5fZGlnZXN0X25ldyAoU09VUF9BVVRIX0RPTUFJTl9SRUFMTSwgcmVhbG0sCisgICAgICAgIFNPVVBfQVVUSF9ET01BSU5fRElHRVNUX0FVVEhfQ0FMTEJBQ0ssIGRpZ2VzdF9hdXRoX2NiLAorICAgICAgICBTT1VQX0FVVEhfRE9NQUlOX0FERF9QQVRILCBkaWdlc3RfYXV0aF9wYXRoLCBOVUxMKTsKKyAgICBzb3VwX3NlcnZlcl9hZGRfYXV0aF9kb21haW4gKHNlcnZlciwgZG9tYWluKTsKKyAgICBnX29iamVjdF91bnJlZiAoZG9tYWluKTsKKyAgfQorCisgIHsKKyAgICBHU29ja2V0QWRkcmVzcyAqYWRkcmVzczsKKyAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgICBhZGRyZXNzID0KKyAgICAgICAgZ19pbmV0X3NvY2tldF9hZGRyZXNzX25ld19mcm9tX3N0cmluZyAoIjAuMC4wLjAiLAorICAgICAgICBTT1VQX0FERFJFU1NfQU5ZX1BPUlQpOworICAgIHNvdXBfc2VydmVyX2xpc3RlbiAoc2VydmVyLCBhZGRyZXNzLCBsaXN0ZW5fZmxhZ3MsICZlcnIpOworICAgIGdfb2JqZWN0X3VucmVmIChhZGRyZXNzKTsKKworICAgIGlmIChlcnIpIHsKKyAgICAgIEdTVF9FUlJPUiAoIkZhaWxlZCB0byBzdGFydCAlcyBzZXJ2ZXI6ICVzIiwKKyAgICAgICAgICB1c2VfaHR0cHMgPyAiSFRUUFMiIDogIkhUVFAiLCBlcnItPm1lc3NhZ2UpOworICAgICAgZ19vYmplY3RfdW5yZWYgKHNlcnZlcik7CisgICAgICBnX2Vycm9yX2ZyZWUgKGVycik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKworICBwb3J0ID0gZ2V0X3BvcnRfZnJvbV9zZXJ2ZXIgKHNlcnZlcik7CisgIEdTVF9ERUJVRyAoIiVzIHNlcnZlciBsaXN0ZW5pbmcgb24gcG9ydCAldSIsIHVzZV9odHRwcyA/ICJIVFRQUyIgOiAiSFRUUCIsCisgICAgICBwb3J0KTsKKworICAvKiBjaGVjayBpZiB3ZSBjYW4gY29ubmVjdCB0byBvdXIgbG9jYWwgaHR0cCBzZXJ2ZXIgKi8KKyAgeworICAgIEdTb2NrZXRDb25uZWN0aW9uICpjb25uOworICAgIEdTb2NrZXRDbGllbnQgKmNsaWVudDsKKworICAgIGNsaWVudCA9IGdfc29ja2V0X2NsaWVudF9uZXcgKCk7CisgICAgZ19zb2NrZXRfY2xpZW50X3NldF90aW1lb3V0IChjbGllbnQsIDIpOworICAgIGNvbm4gPQorICAgICAgICBnX3NvY2tldF9jbGllbnRfY29ubmVjdF90b19ob3N0IChjbGllbnQsICIxMjcuMC4wLjEiLCBwb3J0LCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoY29ubiA9PSBOVUxMKSB7CisgICAgICBHU1RfSU5GTyAoIkNvdWxkbid0IGNvbm5lY3QgdG8gMTI3LjAuMC4xOiV1IiwgcG9ydCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZ19vYmplY3RfdW5yZWYgKGNvbm4pOworICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICB9CisKKyAgcmV0dXJuIHNlcnZlcjsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3NwZWN0cnVtLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9zcGVjdHJ1bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5N2JlMDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9zcGVjdHJ1bS5jCkBAIC0wLDAgKzEsNTQxIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIHNwZWN0cnVtCisgKgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCitnYm9vbGVhbiBoYXZlX2VvcyA9IEZBTFNFOworCisvKiBGb3IgZWFzZSBvZiBwcm9ncmFtbWluZyB3ZSB1c2UgZ2xvYmFscyB0byBrZWVwIHJlZnMgZm9yIG91ciBmbG9hdGluZworICogc3JjIGFuZCBzaW5rIHBhZHMgd2UgY3JlYXRlOyBvdGhlcndpc2Ugd2UgYWx3YXlzIGhhdmUgdG8gZG8gZ2V0X3BhZCwKKyAqIGdldF9wZWVyLCBhbmQgdGhlbiByZW1vdmUgcmVmZXJlbmNlcyBpbiBldmVyeSB0ZXN0IGZ1bmN0aW9uICovCitHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworCisjZGVmaW5lIFNQRUNUX0NBUFNfVEVNUExBVEVfU1RSSU5HIFwKKyAgICAiYXVkaW8veC1yYXcsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiByYXRlID0gKGludCkgWyAxLCBNQVggXSwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICIgY2hhbm5lbHMgPSAoaW50KSBbIDEsIE1BWCBdLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIGxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBmb3JtYXQgPSAoc3RyaW5nKSB7ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdTVF9BVURJT19ORShTMTYpICIsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHU1RfQVVESU9fTkUoUzMyKSAiLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR1NUX0FVRElPX05FKEYzMikgIiwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdTVF9BVURJT19ORShGNjQpICIgfSIKKworI2RlZmluZSBTUEVDVF9DQVBTX1NUUklOR19TMTYgXAorICAiYXVkaW8veC1yYXcsICIgXAorICAgICJyYXRlID0gKGludCkgNDQxMDAsICIgXAorICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgXAorICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiBcCisgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FKFMxNikKKworI2RlZmluZSBTUEVDVF9DQVBTX1NUUklOR19TMzIgXAorICAiYXVkaW8veC1yYXcsICIgXAorICAgICJyYXRlID0gKGludCkgNDQxMDAsICIgXAorICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgXAorICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiBcCisgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FKFMzMikKKworI2RlZmluZSBTUEVDVF9DQVBTX1NUUklOR19GMzIgXAorICAgICJhdWRpby94LXJhdywgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIHJhdGUgPSAoaW50KSA0NDEwMCwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBjaGFubmVscyA9IChpbnQpIDEsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICIgbGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgXAorICAgICIgZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUoRjMyKQorCisjZGVmaW5lIFNQRUNUX0NBUFNfU1RSSU5HX0Y2NCBcCisgICAgImF1ZGlvL3gtcmF3LCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICIgcmF0ZSA9IChpbnQpIDQ0MTAwLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIGNoYW5uZWxzID0gKGludCkgMSwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiBcCisgICAgIiBmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORShGNjQpCisKKyNkZWZpbmUgU1BFQ1RfQkFORFMgMjU2CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFNQRUNUX0NBUFNfVEVNUExBVEVfU1RSSU5HKQorICAgICk7CitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChTUEVDVF9DQVBTX1RFTVBMQVRFX1NUUklORykKKyAgICApOworCisvKiB0YWtlcyBvdmVyIHJlZmVyZW5jZSBmb3Igb3V0Y2FwcyAqLworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfc3BlY3RydW0gKGNvbnN0IGdjaGFyICogY2Fwc19zdHIpCit7CisgIEdzdEVsZW1lbnQgKnNwZWN0cnVtOworICBHc3RDYXBzICpjYXBzOworCisgIEdTVF9ERUJVRyAoInNldHVwX3NwZWN0cnVtIik7CisgIHNwZWN0cnVtID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJzcGVjdHJ1bSIpOworICBteXNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkIChzcGVjdHJ1bSwgJnNyY3RlbXBsYXRlKTsKKyAgbXlzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChzcGVjdHJ1bSwgJnNpbmt0ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChjYXBzX3N0cik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBzcGVjdHJ1bSwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIHJldHVybiBzcGVjdHJ1bTsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfc3BlY3RydW0gKEdzdEVsZW1lbnQgKiBzcGVjdHJ1bSkKK3sKKyAgR1NUX0RFQlVHICgiY2xlYW51cF9zcGVjdHJ1bSIpOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIEZBTFNFKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKHNwZWN0cnVtKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChzcGVjdHJ1bSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChzcGVjdHJ1bSk7CisKKyAgZ19saXN0X2ZvcmVhY2ggKGJ1ZmZlcnMsIChHRnVuYykgZ3N0X21pbmlfb2JqZWN0X3VucmVmLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKGJ1ZmZlcnMpOworICBidWZmZXJzID0gTlVMTDsKK30KKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9pbnQxNikKK3sKKyAgR3N0RWxlbWVudCAqc3BlY3RydW07CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdEJ1cyAqYnVzOworICBHc3RNZXNzYWdlICptZXNzYWdlOworICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgaW50IGksIGo7CisgIGdpbnQxNiAqZGF0YTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGNvbnN0IEdWYWx1ZSAqbGlzdCwgKnZhbHVlOworICBHc3RDbG9ja1RpbWUgZW5kdGltZTsKKyAgZ2Zsb2F0IGxldmVsOworCisgIHNwZWN0cnVtID0gc2V0dXBfc3BlY3RydW0gKFNQRUNUX0NBUFNfU1RSSU5HX1MxNik7CisgIGdfb2JqZWN0X3NldCAoc3BlY3RydW0sICJwb3N0LW1lc3NhZ2VzIiwgVFJVRSwgImludGVydmFsIiwgR1NUX1NFQ09ORCAvIDEwMCwKKyAgICAgICJiYW5kcyIsIFNQRUNUX0JBTkRTLCAidGhyZXNob2xkIiwgLTgwLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzcGVjdHJ1bSwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIC8qIGNyZWF0ZSBhIDEgc2VjIGJ1ZmZlciB3aXRoIGFuIDExMDI1IEh6IHNpbmUgd2F2ZSAqLworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCA0NDEwMCAqIHNpemVvZiAoZ2ludDE2KSwgMCk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGRhdGEgPSAoZ2ludDE2ICopIG1hcC5kYXRhOworICBmb3IgKGogPSAwOyBqIDwgNDQxMDA7IGogKz0gNCkgeworICAgICpkYXRhID0gMDsKKyAgICArK2RhdGE7CisgICAgKmRhdGEgPSAzMjc2NzsKKyAgICArK2RhdGE7CisgICAgKmRhdGEgPSAwOworICAgICsrZGF0YTsKKyAgICAqZGF0YSA9IC0zMjc2NzsKKyAgICArK2RhdGE7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogY3JlYXRlIGEgYnVzIHRvIGdldCB0aGUgc3BlY3RydW0gbWVzc2FnZSBvbiAqLworICBidXMgPSBnc3RfYnVzX25ldyAoKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoYnVzLCAiYnVzIiwgMSk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKHNwZWN0cnVtLCBidXMpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChidXMsICJidXMiLCAyKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGJ1dCBpdCBlbmRzIHVwIGJlaW5nIGNvbGxlY3RlZCBvbiB0aGUgZ2xvYmFsIGJ1ZmZlciBsaXN0ICovCisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGluYnVmZmVyID09IG91dGJ1ZmZlcik7CisKKyAgbWVzc2FnZSA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9FTEVNRU5ULCAtMSk7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKG1lc3NhZ2UsICJtZXNzYWdlIiwgMSk7CisKKyAgZmFpbF91bmxlc3MgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpID09IEdTVF9PQkpFQ1QgKHNwZWN0cnVtKSk7CisgIGZhaWxfdW5sZXNzIChHU1RfTUVTU0FHRV9UWVBFIChtZXNzYWdlKSA9PSBHU1RfTUVTU0FHRV9FTEVNRU5UKTsKKyAgc3RydWN0dXJlID0gZ3N0X21lc3NhZ2VfZ2V0X3N0cnVjdHVyZSAobWVzc2FnZSk7CisgIGZhaWxfaWYgKHN0cnVjdHVyZSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoKGNoYXIgKikgZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAoc3RydWN0dXJlKSwKKyAgICAgICJzcGVjdHJ1bSIpOworICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9nZXRfY2xvY2tfdGltZSAoc3RydWN0dXJlLCAiZW5kdGltZSIsICZlbmR0aW1lKSk7CisKKyAgbGlzdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJtYWduaXR1ZGUiKTsKKyAgZm9yIChpID0gMDsgaSA8IFNQRUNUX0JBTkRTOyArK2kpIHsKKyAgICB2YWx1ZSA9IGdzdF92YWx1ZV9saXN0X2dldF92YWx1ZSAobGlzdCwgaSk7CisgICAgbGV2ZWwgPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgIEdTVF9ERUJVRyAoImJhbmRbJTNkXSBpcyAlLjJmIiwgaSwgbGV2ZWwpOworICAgIC8qIE9ubHkgdGhlIGJhbmRzIGluIHRoZSBtaWRkbGUgc2hvdWxkIGhhdmUgYSBsZXZlbCBhYm92ZSA2MCAqLworICAgIGZhaWxfaWYgKChpID09IFNQRUNUX0JBTkRTIC8gMiB8fCBpID09IFNQRUNUX0JBTkRTIC8gMiAtIDEpCisgICAgICAgICYmIGxldmVsIDwgLTIwLjApOworICAgIGZhaWxfaWYgKChpICE9IFNQRUNUX0JBTkRTIC8gMiAmJiBpICE9IFNQRUNUX0JBTkRTIC8gMiAtIDEpCisgICAgICAgICYmIGxldmVsID4gLTIwLjApOworICB9CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChpbmJ1ZmZlciA9PSBvdXRidWZmZXIpOworCisgIC8qIGNsZWFuIHVwICovCisgIC8qIGZsdXNoIGN1cnJlbnQgbWVzc2FnZXMsYW5kIGZ1dHVyZSBzdGF0ZSBjaGFuZ2UgbWVzc2FnZXMgKi8KKyAgZ3N0X2J1c19zZXRfZmx1c2hpbmcgKGJ1cywgVFJVRSk7CisKKyAgLyogbWVzc2FnZSBoYXMgYSByZWYgdG8gdGhlIGVsZW1lbnQgKi8KKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoc3BlY3RydW0sICJzcGVjdHJ1bSIsIDIpOworICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHNwZWN0cnVtLCAic3BlY3RydW0iLCAxKTsKKworICBnc3RfZWxlbWVudF9zZXRfYnVzIChzcGVjdHJ1bSwgTlVMTCk7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKGJ1cywgImJ1cyIsIDEpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzcGVjdHJ1bSwKKyAgICAgICAgICBHU1RfU1RBVEVfTlVMTCkgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLCAiY291bGQgbm90IHNldCB0byBudWxsIik7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHNwZWN0cnVtLCAic3BlY3RydW0iLCAxKTsKKyAgY2xlYW51cF9zcGVjdHJ1bSAoc3BlY3RydW0pOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ludDMyKQoreworICBHc3RFbGVtZW50ICpzcGVjdHJ1bTsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0QnVzICpidXM7CisgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisgIGNvbnN0IEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBpbnQgaSwgajsKKyAgZ2ludDMyICpkYXRhOworICBHc3RNYXBJbmZvIG1hcDsKKyAgY29uc3QgR1ZhbHVlICpsaXN0LCAqdmFsdWU7CisgIEdzdENsb2NrVGltZSBlbmR0aW1lOworICBnZmxvYXQgbGV2ZWw7CisKKyAgc3BlY3RydW0gPSBzZXR1cF9zcGVjdHJ1bSAoU1BFQ1RfQ0FQU19TVFJJTkdfUzMyKTsKKyAgZ19vYmplY3Rfc2V0IChzcGVjdHJ1bSwgInBvc3QtbWVzc2FnZXMiLCBUUlVFLCAiaW50ZXJ2YWwiLCBHU1RfU0VDT05EIC8gMTAwLAorICAgICAgImJhbmRzIiwgU1BFQ1RfQkFORFMsICJ0aHJlc2hvbGQiLCAtODAsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNwZWN0cnVtLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgLyogY3JlYXRlIGEgMSBzZWMgYnVmZmVyIHdpdGggYW4gMTEwMjUgSHogc2luZSB3YXZlICovCisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIDQ0MTAwICogc2l6ZW9mIChnaW50MzIpLCAwKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgZGF0YSA9IChnaW50MzIgKikgbWFwLmRhdGE7CisgIGZvciAoaiA9IDA7IGogPCA0NDEwMDsgaiArPSA0KSB7CisgICAgKmRhdGEgPSAwOworICAgICsrZGF0YTsKKyAgICAqZGF0YSA9IDIxNDc0ODM2NDc7CisgICAgKytkYXRhOworICAgICpkYXRhID0gMDsKKyAgICArK2RhdGE7CisgICAgKmRhdGEgPSAtMjE0NzQ4MzY0NzsKKyAgICArK2RhdGE7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogY3JlYXRlIGEgYnVzIHRvIGdldCB0aGUgc3BlY3RydW0gbWVzc2FnZSBvbiAqLworICBidXMgPSBnc3RfYnVzX25ldyAoKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoYnVzLCAiYnVzIiwgMSk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKHNwZWN0cnVtLCBidXMpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChidXMsICJidXMiLCAyKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGJ1dCBpdCBlbmRzIHVwIGJlaW5nIGNvbGxlY3RlZCBvbiB0aGUgZ2xvYmFsIGJ1ZmZlciBsaXN0ICovCisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGluYnVmZmVyID09IG91dGJ1ZmZlcik7CisKKyAgbWVzc2FnZSA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9FTEVNRU5ULCAtMSk7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKG1lc3NhZ2UsICJtZXNzYWdlIiwgMSk7CisKKyAgZmFpbF91bmxlc3MgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpID09IEdTVF9PQkpFQ1QgKHNwZWN0cnVtKSk7CisgIGZhaWxfdW5sZXNzIChHU1RfTUVTU0FHRV9UWVBFIChtZXNzYWdlKSA9PSBHU1RfTUVTU0FHRV9FTEVNRU5UKTsKKyAgc3RydWN0dXJlID0gZ3N0X21lc3NhZ2VfZ2V0X3N0cnVjdHVyZSAobWVzc2FnZSk7CisgIGZhaWxfaWYgKHN0cnVjdHVyZSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoKGNoYXIgKikgZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAoc3RydWN0dXJlKSwKKyAgICAgICJzcGVjdHJ1bSIpOworICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9nZXRfY2xvY2tfdGltZSAoc3RydWN0dXJlLCAiZW5kdGltZSIsICZlbmR0aW1lKSk7CisKKyAgbGlzdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJtYWduaXR1ZGUiKTsKKyAgZm9yIChpID0gMDsgaSA8IFNQRUNUX0JBTkRTOyArK2kpIHsKKyAgICB2YWx1ZSA9IGdzdF92YWx1ZV9saXN0X2dldF92YWx1ZSAobGlzdCwgaSk7CisgICAgbGV2ZWwgPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgIEdTVF9ERUJVRyAoImJhbmRbJTNkXSBpcyAlLjJmIiwgaSwgbGV2ZWwpOworICAgIC8qIE9ubHkgdGhlIGJhbmRzIGluIHRoZSBtaWRkbGUgc2hvdWxkIGhhdmUgYSBsZXZlbCBhYm92ZSA2MCAqLworICAgIGZhaWxfaWYgKChpID09IFNQRUNUX0JBTkRTIC8gMiB8fCBpID09IFNQRUNUX0JBTkRTIC8gMiAtIDEpCisgICAgICAgICYmIGxldmVsIDwgLTIwLjApOworICAgIGZhaWxfaWYgKChpICE9IFNQRUNUX0JBTkRTIC8gMiAmJiBpICE9IFNQRUNUX0JBTkRTIC8gMiAtIDEpCisgICAgICAgICYmIGxldmVsID4gLTIwLjApOworICB9CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChpbmJ1ZmZlciA9PSBvdXRidWZmZXIpOworCisgIC8qIGNsZWFuIHVwICovCisgIC8qIGZsdXNoIGN1cnJlbnQgbWVzc2FnZXMsYW5kIGZ1dHVyZSBzdGF0ZSBjaGFuZ2UgbWVzc2FnZXMgKi8KKyAgZ3N0X2J1c19zZXRfZmx1c2hpbmcgKGJ1cywgVFJVRSk7CisKKyAgLyogbWVzc2FnZSBoYXMgYSByZWYgdG8gdGhlIGVsZW1lbnQgKi8KKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoc3BlY3RydW0sICJzcGVjdHJ1bSIsIDIpOworICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHNwZWN0cnVtLCAic3BlY3RydW0iLCAxKTsKKworICBnc3RfZWxlbWVudF9zZXRfYnVzIChzcGVjdHJ1bSwgTlVMTCk7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKGJ1cywgImJ1cyIsIDEpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzcGVjdHJ1bSwKKyAgICAgICAgICBHU1RfU1RBVEVfTlVMTCkgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLCAiY291bGQgbm90IHNldCB0byBudWxsIik7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHNwZWN0cnVtLCAic3BlY3RydW0iLCAxKTsKKyAgY2xlYW51cF9zcGVjdHJ1bSAoc3BlY3RydW0pOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2Zsb2F0MzIpCit7CisgIEdzdEVsZW1lbnQgKnNwZWN0cnVtOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RCdXMgKmJ1czsKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGludCBpLCBqOworICBnZmxvYXQgKmRhdGE7CisgIEdzdE1hcEluZm8gbWFwOworICBjb25zdCBHVmFsdWUgKmxpc3QsICp2YWx1ZTsKKyAgR3N0Q2xvY2tUaW1lIGVuZHRpbWU7CisgIGdmbG9hdCBsZXZlbDsKKworICBzcGVjdHJ1bSA9IHNldHVwX3NwZWN0cnVtIChTUEVDVF9DQVBTX1NUUklOR19GMzIpOworICBnX29iamVjdF9zZXQgKHNwZWN0cnVtLCAicG9zdC1tZXNzYWdlcyIsIFRSVUUsICJpbnRlcnZhbCIsIEdTVF9TRUNPTkQgLyAxMDAsCisgICAgICAiYmFuZHMiLCBTUEVDVF9CQU5EUywgInRocmVzaG9sZCIsIC04MCwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc3BlY3RydW0sCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICAvKiBjcmVhdGUgYSAxIHNlYyBidWZmZXIgd2l0aCBhbiAxMTAyNSBIeiBzaW5lIHdhdmUgKi8KKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgNDQxMDAgKiBzaXplb2YgKGdmbG9hdCksIDApOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBkYXRhID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChqID0gMDsgaiA8IDQ0MTAwOyBqICs9IDQpIHsKKyAgICAqZGF0YSA9IDAuMDsKKyAgICArK2RhdGE7CisgICAgKmRhdGEgPSAxLjA7CisgICAgKytkYXRhOworICAgICpkYXRhID0gMC4wOworICAgICsrZGF0YTsKKyAgICAqZGF0YSA9IC0xLjA7CisgICAgKytkYXRhOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIGNyZWF0ZSBhIGJ1cyB0byBnZXQgdGhlIHNwZWN0cnVtIG1lc3NhZ2Ugb24gKi8KKyAgYnVzID0gZ3N0X2J1c19uZXcgKCk7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKGJ1cywgImJ1cyIsIDEpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChzcGVjdHJ1bSwgYnVzKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoYnVzLCAiYnVzIiwgMik7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBidXQgaXQgZW5kcyB1cCBiZWluZyBjb2xsZWN0ZWQgb24gdGhlIGdsb2JhbCBidWZmZXIgbGlzdCAqLworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChpbmJ1ZmZlciA9PSBvdXRidWZmZXIpOworCisgIG1lc3NhZ2UgPSBnc3RfYnVzX3BvbGwgKGJ1cywgR1NUX01FU1NBR0VfRUxFTUVOVCwgLTEpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChtZXNzYWdlLCAibWVzc2FnZSIsIDEpOworCisgIGZhaWxfdW5sZXNzIChtZXNzYWdlICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKSA9PSBHU1RfT0JKRUNUIChzcGVjdHJ1bSkpOworICBmYWlsX3VubGVzcyAoR1NUX01FU1NBR0VfVFlQRSAobWVzc2FnZSkgPT0gR1NUX01FU1NBR0VfRUxFTUVOVCk7CisgIHN0cnVjdHVyZSA9IGdzdF9tZXNzYWdlX2dldF9zdHJ1Y3R1cmUgKG1lc3NhZ2UpOworICBmYWlsX2lmIChzdHJ1Y3R1cmUgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKChjaGFyICopIGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHN0cnVjdHVyZSksCisgICAgICAic3BlY3RydW0iKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2Nsb2NrX3RpbWUgKHN0cnVjdHVyZSwgImVuZHRpbWUiLCAmZW5kdGltZSkpOworCisgIGxpc3QgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCAibWFnbml0dWRlIik7CisgIGZvciAoaSA9IDA7IGkgPCBTUEVDVF9CQU5EUzsgKytpKSB7CisgICAgdmFsdWUgPSBnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUgKGxpc3QsIGkpOworICAgIGxldmVsID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICBHU1RfREVCVUcgKCJiYW5kWyUzZF0gaXMgJS4yZiIsIGksIGxldmVsKTsKKyAgICAvKiBPbmx5IHRoZSBiYW5kcyBpbiB0aGUgbWlkZGxlIHNob3VsZCBoYXZlIGEgbGV2ZWwgYWJvdmUgNjAgKi8KKyAgICBmYWlsX2lmICgoaSA9PSBTUEVDVF9CQU5EUyAvIDIgfHwgaSA9PSBTUEVDVF9CQU5EUyAvIDIgLSAxKQorICAgICAgICAmJiBsZXZlbCA8IC0yMC4wKTsKKyAgICBmYWlsX2lmICgoaSAhPSBTUEVDVF9CQU5EUyAvIDIgJiYgaSAhPSBTUEVDVF9CQU5EUyAvIDIgLSAxKQorICAgICAgICAmJiBsZXZlbCA+IC0yMC4wKTsKKyAgfQorICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworICBmYWlsX3VubGVzcyAoaW5idWZmZXIgPT0gb3V0YnVmZmVyKTsKKworICAvKiBjbGVhbiB1cCAqLworICAvKiBmbHVzaCBjdXJyZW50IG1lc3NhZ2VzLGFuZCBmdXR1cmUgc3RhdGUgY2hhbmdlIG1lc3NhZ2VzICovCisgIGdzdF9idXNfc2V0X2ZsdXNoaW5nIChidXMsIFRSVUUpOworCisgIC8qIG1lc3NhZ2UgaGFzIGEgcmVmIHRvIHRoZSBlbGVtZW50ICovCisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHNwZWN0cnVtLCAic3BlY3RydW0iLCAyKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChzcGVjdHJ1bSwgInNwZWN0cnVtIiwgMSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAoc3BlY3RydW0sIE5VTEwpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChidXMsICJidXMiLCAxKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc3BlY3RydW0sCisgICAgICAgICAgR1NUX1NUQVRFX05VTEwpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywgImNvdWxkIG5vdCBzZXQgdG8gbnVsbCIpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChzcGVjdHJ1bSwgInNwZWN0cnVtIiwgMSk7CisgIGNsZWFudXBfc3BlY3RydW0gKHNwZWN0cnVtKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mbG9hdDY0KQoreworICBHc3RFbGVtZW50ICpzcGVjdHJ1bTsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0QnVzICpidXM7CisgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisgIGNvbnN0IEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBpbnQgaSwgajsKKyAgZ2RvdWJsZSAqZGF0YTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGNvbnN0IEdWYWx1ZSAqbGlzdCwgKnZhbHVlOworICBHc3RDbG9ja1RpbWUgZW5kdGltZTsKKyAgZ2Zsb2F0IGxldmVsOworCisgIHNwZWN0cnVtID0gc2V0dXBfc3BlY3RydW0gKFNQRUNUX0NBUFNfU1RSSU5HX0Y2NCk7CisgIGdfb2JqZWN0X3NldCAoc3BlY3RydW0sICJwb3N0LW1lc3NhZ2VzIiwgVFJVRSwgImludGVydmFsIiwgR1NUX1NFQ09ORCAvIDEwMCwKKyAgICAgICJiYW5kcyIsIFNQRUNUX0JBTkRTLCAidGhyZXNob2xkIiwgLTgwLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzcGVjdHJ1bSwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIC8qIGNyZWF0ZSBhIDEgc2VjIGJ1ZmZlciB3aXRoIGFuIDExMDI1IEh6IHNpbmUgd2F2ZSAqLworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCA0NDEwMCAqIHNpemVvZiAoZ2RvdWJsZSksIDApOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBkYXRhID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaiA9IDA7IGogPCA0NDEwMDsgaiArPSA0KSB7CisgICAgKmRhdGEgPSAwLjA7CisgICAgKytkYXRhOworICAgICpkYXRhID0gMS4wOworICAgICsrZGF0YTsKKyAgICAqZGF0YSA9IDAuMDsKKyAgICArK2RhdGE7CisgICAgKmRhdGEgPSAtMS4wOworICAgICsrZGF0YTsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBjcmVhdGUgYSBidXMgdG8gZ2V0IHRoZSBzcGVjdHJ1bSBtZXNzYWdlIG9uICovCisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChidXMsICJidXMiLCAxKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAoc3BlY3RydW0sIGJ1cyk7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKGJ1cywgImJ1cyIsIDIpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYnV0IGl0IGVuZHMgdXAgYmVpbmcgY29sbGVjdGVkIG9uIHRoZSBnbG9iYWwgYnVmZmVyIGxpc3QgKi8KKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworICBmYWlsX3VubGVzcyAoaW5idWZmZXIgPT0gb3V0YnVmZmVyKTsKKworICBtZXNzYWdlID0gZ3N0X2J1c19wb2xsIChidXMsIEdTVF9NRVNTQUdFX0VMRU1FTlQsIC0xKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAobWVzc2FnZSwgIm1lc3NhZ2UiLCAxKTsKKworICBmYWlsX3VubGVzcyAobWVzc2FnZSAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSkgPT0gR1NUX09CSkVDVCAoc3BlY3RydW0pKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9NRVNTQUdFX1RZUEUgKG1lc3NhZ2UpID09IEdTVF9NRVNTQUdFX0VMRU1FTlQpOworICBzdHJ1Y3R1cmUgPSBnc3RfbWVzc2FnZV9nZXRfc3RydWN0dXJlIChtZXNzYWdlKTsKKyAgZmFpbF9pZiAoc3RydWN0dXJlID09IE5VTEwpOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nICgoY2hhciAqKSBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzdHJ1Y3R1cmUpLAorICAgICAgInNwZWN0cnVtIik7CisgIGZhaWxfdW5sZXNzIChnc3Rfc3RydWN0dXJlX2dldF9jbG9ja190aW1lIChzdHJ1Y3R1cmUsICJlbmR0aW1lIiwgJmVuZHRpbWUpKTsKKworICBsaXN0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgIm1hZ25pdHVkZSIpOworICBmb3IgKGkgPSAwOyBpIDwgU1BFQ1RfQkFORFM7ICsraSkgeworICAgIHZhbHVlID0gZ3N0X3ZhbHVlX2xpc3RfZ2V0X3ZhbHVlIChsaXN0LCBpKTsKKyAgICBsZXZlbCA9IGdfdmFsdWVfZ2V0X2Zsb2F0ICh2YWx1ZSk7CisgICAgR1NUX0RFQlVHICgiYmFuZFslM2RdIGlzICUuMmYiLCBpLCBsZXZlbCk7CisgICAgLyogT25seSB0aGUgYmFuZHMgaW4gdGhlIG1pZGRsZSBzaG91bGQgaGF2ZSBhIGxldmVsIGFib3ZlIDYwICovCisgICAgZmFpbF9pZiAoKGkgPT0gU1BFQ1RfQkFORFMgLyAyIHx8IGkgPT0gU1BFQ1RfQkFORFMgLyAyIC0gMSkKKyAgICAgICAgJiYgbGV2ZWwgPCAtMjAuMCk7CisgICAgZmFpbF9pZiAoKGkgIT0gU1BFQ1RfQkFORFMgLyAyICYmIGkgIT0gU1BFQ1RfQkFORFMgLyAyIC0gMSkKKyAgICAgICAgJiYgbGV2ZWwgPiAtMjAuMCk7CisgIH0KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGluYnVmZmVyID09IG91dGJ1ZmZlcik7CisKKyAgLyogY2xlYW4gdXAgKi8KKyAgLyogZmx1c2ggY3VycmVudCBtZXNzYWdlcyxhbmQgZnV0dXJlIHN0YXRlIGNoYW5nZSBtZXNzYWdlcyAqLworICBnc3RfYnVzX3NldF9mbHVzaGluZyAoYnVzLCBUUlVFKTsKKworICAvKiBtZXNzYWdlIGhhcyBhIHJlZiB0byB0aGUgZWxlbWVudCAqLworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChzcGVjdHJ1bSwgInNwZWN0cnVtIiwgMik7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoc3BlY3RydW0sICJzcGVjdHJ1bSIsIDEpOworCisgIGdzdF9lbGVtZW50X3NldF9idXMgKHNwZWN0cnVtLCBOVUxMKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoYnVzLCAiYnVzIiwgMSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNwZWN0cnVtLAorICAgICAgICAgIEdTVF9TVEFURV9OVUxMKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsICJjb3VsZCBub3Qgc2V0IHRvIG51bGwiKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoc3BlY3RydW0sICJzcGVjdHJ1bSIsIDEpOworICBjbGVhbnVwX3NwZWN0cnVtIChzcGVjdHJ1bSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitzdGF0aWMgU3VpdGUgKgorc3BlY3RydW1fc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgic3BlY3RydW0iKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaW50MTYpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaW50MzIpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZmxvYXQzMik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9mbG9hdDY0KTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHNwZWN0cnVtKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3NwbGl0bXV4LmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9zcGxpdG11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYjc4ZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9zcGxpdG11eC5jCkBAIC0wLDAgKzEsNzkzIEBACisvKiBHU3RyZWFtZXIgdW5pdCB0ZXN0IGZvciBzcGxpdG11eHNyYy9zaW5rIGVsZW1lbnRzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDE1IEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z2xpYi9nc3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC9hcHAvYXBwLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK2djaGFyICp0bXBkaXIgPSBOVUxMOworR3N0Q2xvY2tUaW1lIGZpcnN0X3RzOworR3N0Q2xvY2tUaW1lIGxhc3RfdHM7CitnZG91YmxlIGN1cnJlbnRfcmF0ZTsKKworc3RhdGljIHZvaWQKK3RlbXBkaXJfc2V0dXAgKHZvaWQpCit7CisgIGNvbnN0IGdjaGFyICpzeXN0bXAgPSBnX2dldF90bXBfZGlyICgpOworICB0bXBkaXIgPSBnX2J1aWxkX2ZpbGVuYW1lIChzeXN0bXAsICJzcGxpdG11eC10ZXN0LVhYWFhYWCIsIE5VTEwpOworICAvKiBSZXdyaXRlcyB0bXBkaXIgdGVtcGxhdGUgaW5wdXQ6ICovCisgIHRtcGRpciA9IGdfbWtkdGVtcCAodG1wZGlyKTsKK30KKworc3RhdGljIHZvaWQKK3RlbXBkaXJfY2xlYW51cCAodm9pZCkKK3sKKyAgR0RpciAqZDsKKyAgY29uc3QgZ2NoYXIgKmY7CisKKyAgZmFpbF9pZiAodG1wZGlyID09IE5VTEwpOworCisgIGQgPSBnX2Rpcl9vcGVuICh0bXBkaXIsIDAsIE5VTEwpOworICBmYWlsX2lmIChkID09IE5VTEwpOworCisgIHdoaWxlICgoZiA9IGdfZGlyX3JlYWRfbmFtZSAoZCkpICE9IE5VTEwpIHsKKyAgICBnY2hhciAqZm5hbWUgPSBnX2J1aWxkX2ZpbGVuYW1lICh0bXBkaXIsIGYsIE5VTEwpOworICAgIGZhaWxfaWYgKGdfcmVtb3ZlIChmbmFtZSkgIT0gMCwgIkZhaWxlZCB0byByZW1vdmUgdG1wIGZpbGUgJXMiLCBmbmFtZSk7CisgICAgZ19mcmVlIChmbmFtZSk7CisgIH0KKyAgZ19kaXJfY2xvc2UgKGQpOworCisgIGZhaWxfaWYgKGdfcmVtb3ZlICh0bXBkaXIpICE9IDAsICJGYWlsZWQgdG8gZGVsZXRlIHRtcGRpciAlcyIsIHRtcGRpcik7CisKKyAgZ19mcmVlICh0bXBkaXIpOworICB0bXBkaXIgPSBOVUxMOworfQorCitzdGF0aWMgZ3VpbnQKK2NvdW50X2ZpbGVzIChjb25zdCBnY2hhciAqIHRhcmdldCkKK3sKKyAgR0RpciAqZDsKKyAgY29uc3QgZ2NoYXIgKmY7CisgIGd1aW50IHJldCA9IDA7CisKKyAgZCA9IGdfZGlyX29wZW4gKHRhcmdldCwgMCwgTlVMTCk7CisgIGZhaWxfaWYgKGQgPT0gTlVMTCk7CisKKyAgd2hpbGUgKChmID0gZ19kaXJfcmVhZF9uYW1lIChkKSkgIT0gTlVMTCkKKyAgICByZXQrKzsKKyAgZ19kaXJfY2xvc2UgKGQpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX2Vycm9yIChHc3RNZXNzYWdlICogbXNnKQoreworICBHRXJyb3IgKmVyciA9IE5VTEw7CisgIGdjaGFyICpkYmdfaW5mbzsKKworICBmYWlsX3VubGVzcyAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSA9PSBHU1RfTUVTU0FHRV9FUlJPUik7CisKKyAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1zZywgJmVyciwgJmRiZ19pbmZvKTsKKworICBnX3ByaW50ZXJyICgiRVJST1IgZnJvbSBlbGVtZW50ICVzOiAlc1xuIiwKKyAgICAgIEdTVF9PQkpFQ1RfTkFNRSAobXNnLT5zcmMpLCBlcnItPm1lc3NhZ2UpOworICBnX3ByaW50ZXJyICgiRGVidWdnaW5nIGluZm86ICVzXG4iLCAoZGJnX2luZm8pID8gZGJnX2luZm8gOiAibm9uZSIpOworICBnX2Vycm9yX2ZyZWUgKGVycik7CisgIGdfZnJlZSAoZGJnX2luZm8pOworfQorCitzdGF0aWMgR3N0TWVzc2FnZSAqCitydW5fcGlwZWxpbmUgKEdzdEVsZW1lbnQgKiBwaXBlbGluZSkKK3sKKyAgR3N0QnVzICpidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChHU1RfRUxFTUVOVCAocGlwZWxpbmUpKTsKKyAgR3N0TWVzc2FnZSAqbXNnOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgbXNnID0gZ3N0X2J1c19wb2xsIChidXMsIEdTVF9NRVNTQUdFX0VPUyB8IEdTVF9NRVNTQUdFX0VSUk9SLCAtMSk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIGlmIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VSUk9SKQorICAgIGR1bXBfZXJyb3IgKG1zZyk7CisKKyAgcmV0dXJuIG1zZzsKK30KKworc3RhdGljIHZvaWQKK3NlZWtfcGlwZWxpbmUgKEdzdEVsZW1lbnQgKiBwaXBlbGluZSwgZ2RvdWJsZSByYXRlLCBHc3RDbG9ja1RpbWUgc3RhcnQsCisgICAgR3N0Q2xvY2tUaW1lIGVuZCkKK3sKKyAgLyogUGF1c2UgdGhlIHBpcGVsaW5lLCBzZWVrIHRvIHRoZSBkZXNpcmVkIHJhbmdlIC8gcmF0ZSwgd2FpdCBmb3IgUEFVU0VEIGFnYWluLCB0aGVuCisgICAqIGNsZWFyIHRoZSB0cmFja2luZyB2YXJzIGZvciBzdGFydF90cyAvIGVuZF90cyAqLworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChwaXBlbGluZSwgTlVMTCwgTlVMTCwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisKKyAgLyogc3BlY2lmaWMgZW5kIHRpbWUgbm90IGltcGxlbWVudGVkOiAqLworICBmYWlsX3VubGVzcyAoZW5kID09IEdTVF9DTE9DS19USU1FX05PTkUpOworCisgIGdzdF9lbGVtZW50X3NlZWsgKHBpcGVsaW5lLCByYXRlLCBHU1RfRk9STUFUX1RJTUUsCisgICAgICBHU1RfU0VFS19GTEFHX0ZMVVNIIHwgR1NUX1NFRUtfRkxBR19BQ0NVUkFURSwgR1NUX1NFRUtfVFlQRV9TRVQsIHN0YXJ0LAorICAgICAgR1NUX1NFRUtfVFlQRV9FTkQsIDApOworCisgIC8qIFdhaXQgZm9yIHRoZSBwaXBlbGluZSB0byBwcmVyb2xsIGFnYWluICovCisgIGdzdF9lbGVtZW50X2dldF9zdGF0ZSAocGlwZWxpbmUsIE5VTEwsIE5VTEwsIEdTVF9DTE9DS19USU1FX05PTkUpOworCisgIEdTVF9MT0cgKCJTZWVrZWQgcGlwZWxpbmUuIFJhdGUgJWYgdGltZSByYW5nZSAlIiBHU1RfVElNRV9GT1JNQVQgIiB0byAlIgorICAgICAgR1NUX1RJTUVfRk9STUFULCByYXRlLCBHU1RfVElNRV9BUkdTIChzdGFydCksIEdTVF9USU1FX0FSR1MgKGVuZCkpOworCisgIC8qIENsZWFyIHRyYWNraW5nIHZhcmlhYmxlcyBub3cgdGhhdCB0aGUgc2VlayBpcyBjb21wbGV0ZSAqLworICBmaXJzdF90cyA9IGxhc3RfdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBjdXJyZW50X3JhdGUgPSByYXRlOworfTsKKworc3RhdGljIHZvaWQKK3JlY2VpdmVfaGFuZG9mZiAoR3N0RWxlbWVudCAqIG9iamVjdCBHX0dOVUNfVU5VU0VELCBHc3RCdWZmZXIgKiBidWYsCisgICAgR3N0UGFkICogYXJnMSBHX0dOVUNfVU5VU0VELCBncG9pbnRlciB1c2VyX2RhdGEgR19HTlVDX1VOVVNFRCkKK3sKKyAgR3N0Q2xvY2tUaW1lIHN0YXJ0ID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1Zik7CisgIEdzdENsb2NrVGltZSBlbmQgPSBzdGFydDsKKworICBpZiAoR1NUX0JVRkZFUl9EVVJBVElPTl9JU19WQUxJRCAoYnVmKSkKKyAgICBlbmQgKz0gR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKTsKKworICBHU1RfTE9HICgiR290IGJ1ZmZlciAlIiBHU1RfVElNRV9GT1JNQVQgIiB0byAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChzdGFydCksIEdTVF9USU1FX0FSR1MgKGVuZCkpOworCisgIC8qIENoZWNrIHRpbWUgaXMgbW92aW5nIGluIHRoZSByaWdodCBkaXJlY3Rpb24gKi8KKyAgaWYgKGN1cnJlbnRfcmF0ZSA+IDApIHsKKyAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGZpcnN0X3RzKSkKKyAgICAgIGZhaWxfdW5sZXNzIChzdGFydCA+PSBmaXJzdF90cywKKyAgICAgICAgICAiVGltZXN0YW1wcyB3ZW50IGJhY2t3YXJkIGR1cmluZyBmb3J3YXJkIHBsYXksICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAgICIgPCAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHN0YXJ0KSwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChmaXJzdF90cykpOworICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAobGFzdF90cykpCisgICAgICBmYWlsX3VubGVzcyAoZW5kID49IGxhc3RfdHMsCisgICAgICAgICAgIlRpbWVzdGFtcHMgd2VudCBiYWNrd2FyZCBkdXJpbmcgZm9yd2FyZCBwbGF5LCAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAiIDwgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChlbmQpLCBHU1RfVElNRV9BUkdTIChsYXN0X3RzKSk7CisgIH0gZWxzZSB7CisgICAgZmFpbF91bmxlc3MgKHN0YXJ0IDw9IGZpcnN0X3RzLAorICAgICAgICAiVGltZXN0YW1wcyB3ZW50IGZvcndhcmQgZHVyaW5nIHJldmVyc2UgcGxheSwgJSIgR1NUX1RJTUVfRk9STUFUICIgPiAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHN0YXJ0KSwgR1NUX1RJTUVfQVJHUyAoZmlyc3RfdHMpKTsKKyAgICBmYWlsX3VubGVzcyAoZW5kIDw9IGxhc3RfdHMsCisgICAgICAgICJUaW1lc3RhbXBzIHdlbnQgZm9yd2FyZCBkdXJpbmcgcmV2ZXJzZSBwbGF5LCAlIiBHU1RfVElNRV9GT1JNQVQgIiA+ICUiCisgICAgICAgIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAoZW5kKSwgR1NUX1RJTUVfQVJHUyAobGFzdF90cykpOworICB9CisKKyAgLyogdXBkYXRlIHRoZSByYW5nZSBvZiB0aW1lc3RhbXBzIHdlJ3ZlIGVuY291bnRlcmVkICovCisgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGZpcnN0X3RzKSB8fCBzdGFydCA8IGZpcnN0X3RzKQorICAgIGZpcnN0X3RzID0gc3RhcnQ7CisgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGxhc3RfdHMpIHx8IGVuZCA+IGxhc3RfdHMpCisgICAgbGFzdF90cyA9IGVuZDsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcGxheWJhY2sgKGNvbnN0IGdjaGFyICogaW5fcGF0dGVybiwgR3N0Q2xvY2tUaW1lIGV4cF9maXJzdF90aW1lLAorICAgIEdzdENsb2NrVGltZSBleHBfbGFzdF90aW1lKQoreworICBHc3RNZXNzYWdlICptc2c7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RFbGVtZW50ICpmYWtlc2luazsKKyAgZ2NoYXIgKnVyaTsKKworICBwaXBlbGluZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInBsYXliaW4iLCBOVUxMKTsKKyAgZmFpbF9pZiAocGlwZWxpbmUgPT0gTlVMTCk7CisKKyAgZmFrZXNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsIE5VTEwpOworICBmYWlsX2lmIChmYWtlc2luayA9PSBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAocGlwZWxpbmUpLCAidmlkZW8tc2luayIsIGZha2VzaW5rLCBOVUxMKTsKKworICB1cmkgPSBnX3N0cmR1cF9wcmludGYgKCJzcGxpdG11eDovLyVzIiwgaW5fcGF0dGVybik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAocGlwZWxpbmUpLCAidXJpIiwgdXJpLCBOVUxMKTsKKyAgZ19mcmVlICh1cmkpOworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGZha2VzaW5rLCAiaGFuZG9mZiIsIChHQ2FsbGJhY2spIHJlY2VpdmVfaGFuZG9mZiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGZha2VzaW5rKSwgInNpZ25hbC1oYW5kb2ZmcyIsIFRSVUUsIE5VTEwpOworCisgIC8qIHRlc3QgZm9yd2FyZHMgKi8KKyAgc2Vla19waXBlbGluZSAocGlwZWxpbmUsIDEuMCwgMCwgLTEpOworICBmYWlsX3VubGVzcyAoZmlyc3RfdHMgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgIG1zZyA9IHJ1bl9waXBlbGluZSAocGlwZWxpbmUpOworICBmYWlsX3VubGVzcyAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSA9PSBHU1RfTUVTU0FHRV9FT1MpOworICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKworICAvKiBDaGVjayB3ZSBzYXcgdGhlIGVudGlyZSByYW5nZSBvZiB2YWx1ZXMgKi8KKyAgZmFpbF91bmxlc3MgKGZpcnN0X3RzID09IGV4cF9maXJzdF90aW1lLAorICAgICAgIkV4cGVjdGVkIHN0YXJ0IG9mIHBsYXliYWNrIHJhbmdlIDAsIGdvdCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChmaXJzdF90cykpOworICBmYWlsX3VubGVzcyAobGFzdF90cyA9PSBleHBfbGFzdF90aW1lLAorICAgICAgIkV4cGVjdGVkIGVuZCBvZiBwbGF5YmFjayByYW5nZSAzcywgZ290ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKGxhc3RfdHMpKTsKKworICAvKiBUZXN0IGJhY2t3YXJkcyAqLworICBzZWVrX3BpcGVsaW5lIChwaXBlbGluZSwgLTEuMCwgMCwgLTEpOworICBtc2cgPSBydW5fcGlwZWxpbmUgKHBpcGVsaW5lKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRU9TKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgIC8qIENoZWNrIHdlIHNhdyB0aGUgZW50aXJlIHJhbmdlIG9mIHZhbHVlcyAqLworICBmYWlsX3VubGVzcyAoZmlyc3RfdHMgPT0gZXhwX2ZpcnN0X3RpbWUsCisgICAgICAiRXhwZWN0ZWQgc3RhcnQgb2YgcGxheWJhY2sgcmFuZ2UgJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAiLCBnb3QgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChleHBfZmlyc3RfdGltZSksCisgICAgICBHU1RfVElNRV9BUkdTIChmaXJzdF90cykpOworICBmYWlsX3VubGVzcyAobGFzdF90cyA9PSBleHBfbGFzdF90aW1lLAorICAgICAgIkV4cGVjdGVkIGVuZCBvZiBwbGF5YmFjayByYW5nZSAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIsIGdvdCAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGV4cF9sYXN0X3RpbWUpLAorICAgICAgR1NUX1RJTUVfQVJHUyAobGFzdF90cykpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfc3BsaXRtdXhzcmMpCit7CisgIGdjaGFyICppbl9wYXR0ZXJuID0KKyAgICAgIGdfYnVpbGRfZmlsZW5hbWUgKEdTVF9URVNUX0ZJTEVTX1BBVEgsICJzcGxpdHZpZGVvKi5vZ2ciLCBOVUxMKTsKKyAgdGVzdF9wbGF5YmFjayAoaW5fcGF0dGVybiwgMCwgMyAqIEdTVF9TRUNPTkQpOworICBnX2ZyZWUgKGluX3BhdHRlcm4pOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBnY2hhciAqKgorc3JjX2Zvcm1hdF9sb2NhdGlvbl9jYiAoR3N0RWxlbWVudCAqIHNwbGl0bXV4c3JjLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGdjaGFyICoqcmVzdWx0ID0gZ19tYWxsb2MwX24gKDQsIHNpemVvZiAoZ2NoYXIgKikpOworICByZXN1bHRbMF0gPSBnX2J1aWxkX2ZpbGVuYW1lIChHU1RfVEVTVF9GSUxFU19QQVRILCAic3BsaXR2aWRlbzAwLm9nZyIsIE5VTEwpOworICByZXN1bHRbMV0gPSBnX2J1aWxkX2ZpbGVuYW1lIChHU1RfVEVTVF9GSUxFU19QQVRILCAic3BsaXR2aWRlbzAxLm9nZyIsIE5VTEwpOworICByZXN1bHRbMl0gPSBnX2J1aWxkX2ZpbGVuYW1lIChHU1RfVEVTVF9GSUxFU19QQVRILCAic3BsaXR2aWRlbzAyLm9nZyIsIE5VTEwpOworICByZXR1cm4gcmVzdWx0OworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9zcGxpdG11eHNyY19mb3JtYXRfbG9jYXRpb24pCit7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdEVsZW1lbnQgKnNyYzsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisKKyAgcGlwZWxpbmUgPSBnc3RfcGFyc2VfbGF1bmNoICgic3BsaXRtdXhzcmMgbmFtZT1zcGxpdHNyYyAhIGRlY29kZWJpbiAiCisgICAgICAiISBmYWtlc2luayIsICZlcnJvcik7CisgIGdfYXNzZXJ0X25vX2Vycm9yIChlcnJvcik7CisgIGZhaWxfaWYgKHBpcGVsaW5lID09IE5VTEwpOworCisgIHNyYyA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgInNwbGl0c3JjIik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNyYywgImZvcm1hdC1sb2NhdGlvbiIsCisgICAgICAoR0NhbGxiYWNrKSBzcmNfZm9ybWF0X2xvY2F0aW9uX2NiLCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKHNyYyk7CisKKyAgbXNnID0gcnVuX3BpcGVsaW5lIChwaXBlbGluZSk7CisKKyAgaWYgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRVJST1IpCisgICAgZHVtcF9lcnJvciAobXNnKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRU9TKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgZ2NoYXIgKgorY2hlY2tfZm9ybWF0X2xvY2F0aW9uIChHc3RFbGVtZW50ICogb2JqZWN0LAorICAgIGd1aW50IGZyYWdtZW50X2lkLCBHc3RTYW1wbGUgKiBmaXJzdF9zYW1wbGUpCit7CisgIEdzdEJ1ZmZlciAqYnVmID0gZ3N0X3NhbXBsZV9nZXRfYnVmZmVyIChmaXJzdF9zYW1wbGUpOworCisgIC8qIE11c3QgaGF2ZSBhIGJ1ZmZlciAqLworICBmYWlsX2lmIChidWYgPT0gTlVMTCk7CisgIEdTVF9MT0cgKCJOZXcgZmlsZSAtIGZpcnN0IGJ1ZmZlciAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKSkpOworCisgIHJldHVybiBOVUxMOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9zcGxpdG11eHNpbmspCit7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdEVsZW1lbnQgKnNpbms7CisgIEdzdFBhZCAqc3BsaXRtdXhfc2lua19wYWQ7CisgIEdzdFBhZCAqZW5jX3NyY19wYWQ7CisgIGdjaGFyICpkZXN0X3BhdHRlcm47CisgIGd1aW50IGNvdW50OworICBnY2hhciAqaW5fcGF0dGVybjsKKworICAvKiBUaGlzIHBpcGVsaW5lIGhhcyBhIHNtYWxsIHRpbWUgY3V0b2ZmIC0gaXQgc2hvdWxkIHN0YXJ0IGEgbmV3IGZpbGUKKyAgICogZXZlcnkgR09QLCBpZSAxIHNlY29uZCAqLworICBwaXBlbGluZSA9CisgICAgICBnc3RfcGFyc2VfbGF1bmNoCisgICAgICAoInZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz0xNSAhIHZpZGVvL3gtcmF3LHdpZHRoPTgwLGhlaWdodD02NCxmcmFtZXJhdGU9NS8xICEgdmlkZW9jb252ZXJ0ICEiCisgICAgICAiIHF1ZXVlICEgdGhlb3JhZW5jIGtleWZyYW1lLWZvcmNlPTUgISBzcGxpdG11eHNpbmsgbmFtZT1zcGxpdHNpbmsgIgorICAgICAgIiBtYXgtc2l6ZS10aW1lPTEwMDAwMDAgbWF4LXNpemUtYnl0ZXM9MTAwMDAwMCBtdXhlcj1vZ2dtdXgiLCBOVUxMKTsKKyAgZmFpbF9pZiAocGlwZWxpbmUgPT0gTlVMTCk7CisgIHNpbmsgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJzcGxpdHNpbmsiKTsKKyAgZmFpbF9pZiAoc2luayA9PSBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoc2luaywgImZvcm1hdC1sb2NhdGlvbi1mdWxsIiwKKyAgICAgIChHQ2FsbGJhY2spIGNoZWNrX2Zvcm1hdF9sb2NhdGlvbiwgTlVMTCk7CisgIGRlc3RfcGF0dGVybiA9IGdfYnVpbGRfZmlsZW5hbWUgKHRtcGRpciwgIm91dCUwNWQub2dnIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHNpbmspLCAibG9jYXRpb24iLCBkZXN0X3BhdHRlcm4sIE5VTEwpOworICBnX2ZyZWUgKGRlc3RfcGF0dGVybik7CisgIGdfb2JqZWN0X3VucmVmIChzaW5rKTsKKworICBtc2cgPSBydW5fcGlwZWxpbmUgKHBpcGVsaW5lKTsKKworICBpZiAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSA9PSBHU1RfTUVTU0FHRV9FUlJPUikKKyAgICBkdW1wX2Vycm9yIChtc2cpOworICBmYWlsX3VubGVzcyAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSA9PSBHU1RfTUVTU0FHRV9FT1MpOworICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKworICAvKiB1bmxpbmsgbWFudWFsbHkgYW5kIHJlbGFzZSByZXF1ZXN0IHBhZCB0byBlbnN1cmUgdGhhdCB3ZSAqY2FuKiBkbyB0aGF0CisgICAqIC0gaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MzYyMiAqLworICBzaW5rID0gZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAocGlwZWxpbmUpLCAic3BsaXRzaW5rIik7CisgIGZhaWxfaWYgKHNpbmsgPT0gTlVMTCk7CisgIHNwbGl0bXV4X3NpbmtfcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNpbmssICJ2aWRlbyIpOworICBmYWlsX2lmIChzcGxpdG11eF9zaW5rX3BhZCA9PSBOVUxMKTsKKyAgZW5jX3NyY19wYWQgPSBnc3RfcGFkX2dldF9wZWVyIChzcGxpdG11eF9zaW5rX3BhZCk7CisgIGZhaWxfaWYgKGVuY19zcmNfcGFkID09IE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF91bmxpbmsgKGVuY19zcmNfcGFkLCBzcGxpdG11eF9zaW5rX3BhZCkpOworICBnc3Rfb2JqZWN0X3VucmVmIChlbmNfc3JjX3BhZCk7CisgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKHNpbmssIHNwbGl0bXV4X3NpbmtfcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3BsaXRtdXhfc2lua19wYWQpOworICAvKiBhdCB0aGlzIHBvaW50IHRoZSBwYWQgbXVzdCBiZSByZWxlYWFzZWQgLSB0cnkgdG8gZmluZCBpdCBhZ2FpbiB0byB2ZXJpZnkgKi8KKyAgc3BsaXRtdXhfc2lua19wYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc2luaywgInZpZGVvIik7CisgIGZhaWxfaWYgKHNwbGl0bXV4X3NpbmtfcGFkICE9IE5VTEwpOworICBnX29iamVjdF91bnJlZiAoc2luayk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworCisgIGNvdW50ID0gY291bnRfZmlsZXMgKHRtcGRpcik7CisgIGZhaWxfdW5sZXNzIChjb3VudCA9PSAzLCAiRXhwZWN0ZWQgMyBvdXRwdXQgZmlsZXMsIGdvdCAlZCIsIGNvdW50KTsKKworICBpbl9wYXR0ZXJuID0gZ19idWlsZF9maWxlbmFtZSAodG1wZGlyLCAib3V0Ki5vZ2ciLCBOVUxMKTsKKyAgdGVzdF9wbGF5YmFjayAoaW5fcGF0dGVybiwgMCwgMyAqIEdTVF9TRUNPTkQpOworICBnX2ZyZWUgKGluX3BhdHRlcm4pOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBHc3RQYWRQcm9iZVJldHVybgoraW50ZXJjZXB0X3N0cmVhbV9zdGFydCAoR3N0UGFkICogcGFkLCBHc3RQYWRQcm9iZUluZm8gKiBpbmZvLAorICAgIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0RXZlbnQgKmV2ZW50ID0gZ3N0X3BhZF9wcm9iZV9pbmZvX2dldF9ldmVudCAoaW5mbyk7CisKKyAgaWYgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX1NUUkVBTV9TVEFSVCkgeworICAgIEdzdFN0cmVhbUZsYWdzIGZsYWdzOworICAgIGV2ZW50ID0gZ3N0X2V2ZW50X21ha2Vfd3JpdGFibGUgKGV2ZW50KTsKKyAgICBnc3RfZXZlbnRfcGFyc2Vfc3RyZWFtX2ZsYWdzIChldmVudCwgJmZsYWdzKTsKKyAgICBnc3RfZXZlbnRfc2V0X3N0cmVhbV9mbGFncyAoZXZlbnQsIGZsYWdzIHwgR1NUX1NUUkVBTV9GTEFHX1NQQVJTRSk7CisgICAgR1NUX1BBRF9QUk9CRV9JTkZPX0RBVEEgKGluZm8pID0gZXZlbnQ7CisgIH0KKworICByZXR1cm4gR1NUX1BBRF9QUk9CRV9PSzsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK25ld19zYW1wbGVfdmVyaWZ5X2NvbnRpbnVvdXNfdGltZXN0YW1wcyAoR3N0QXBwU2luayAqIGFwcHNpbmssCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RTYW1wbGUgKnNhbXBsZTsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIEdzdENsb2NrVGltZSAqcHJldl90cyA9IHVzZXJfZGF0YTsKKyAgR3N0Q2xvY2tUaW1lIG5ld190czsKKworICBzYW1wbGUgPSBnc3RfYXBwX3NpbmtfcHVsbF9zYW1wbGUgKGFwcHNpbmspOworICBidWZmZXIgPSBnc3Rfc2FtcGxlX2dldF9idWZmZXIgKHNhbXBsZSk7CisKKyAgbmV3X3RzID0gR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcik7CisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoKnByZXZfdHMpKSB7CisgICAgZmFpbF91bmxlc3MgKCpwcmV2X3RzIDwgbmV3X3RzLAorICAgICAgICAiJXM6IHByZXZfdHMgKCUiIEdTVF9USU1FX0ZPUk1BVCAiKSA+PSBuZXdfdHMgKCUiIEdTVF9USU1FX0ZPUk1BVCAiKSIsCisgICAgICAgIEdTVF9PQkpFQ1RfTkFNRSAoYXBwc2luayksIEdTVF9USU1FX0FSR1MgKCpwcmV2X3RzKSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAobmV3X3RzKSk7CisgIH0KKworICAqcHJldl90cyA9IG5ld190czsKKyAgZ3N0X3NhbXBsZV91bnJlZiAoc2FtcGxlKTsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorbmV3X3NhbXBsZV92ZXJpZnlfMXNlY19vZmZzZXQgKEdzdEFwcFNpbmsgKiBhcHBzaW5rLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFNhbXBsZSAqc2FtcGxlOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0Q2xvY2tUaW1lICpwcmV2X3RzID0gdXNlcl9kYXRhOworICBHc3RDbG9ja1RpbWUgbmV3X3RzOworCisgIHNhbXBsZSA9IGdzdF9hcHBfc2lua19wdWxsX3NhbXBsZSAoYXBwc2luayk7CisgIGJ1ZmZlciA9IGdzdF9zYW1wbGVfZ2V0X2J1ZmZlciAoc2FtcGxlKTsKKworICBuZXdfdHMgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKTsKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEICgqcHJldl90cykpIHsKKyAgICBmYWlsX3VubGVzcyAobmV3X3RzID4gKCpwcmV2X3RzICsgOTAwICogR1NUX01TRUNPTkQpLAorICAgICAgICAiJXM6IHByZXZfdHMgKCUiIEdTVF9USU1FX0ZPUk1BVCAiKSArIDAuOXMgPj0gbmV3X3RzICglIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQgIikiLCBHU1RfT0JKRUNUX05BTUUgKGFwcHNpbmspLAorICAgICAgICBHU1RfVElNRV9BUkdTICgqcHJldl90cyksIEdTVF9USU1FX0FSR1MgKG5ld190cykpOworICB9CisKKyAgKnByZXZfdHMgPSBuZXdfdHM7CisgIGdzdF9zYW1wbGVfdW5yZWYgKHNhbXBsZSk7CisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworLyogaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MTA4NiAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfc3BsaXRtdXhzcmNfc3BhcnNlX3N0cmVhbXMpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RFbGVtZW50ICplbGVtZW50OworICBnY2hhciAqZGVzdF9wYXR0ZXJuOworICBHc3RFbGVtZW50ICphcHBzcmM7CisgIEdzdFBhZCAqYXBwc3JjX3NyYzsKKyAgR3N0QnVzICpidXM7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKyAgZ2ludCBpOworCisgIC8qIGdlbmVyYXRlIGZpbGVzICovCisKKyAgLyogaW4gdGhpcyB0ZXN0LCB3ZSBoYXZlIDVzZWMgb2YgZGF0YSB3aXRoIGZpbGVzIHNwbGl0IGF0IDFzZWMgaW50ZXJ2YWxzICovCisgIHBpcGVsaW5lID0KKyAgICAgIGdzdF9wYXJzZV9sYXVuY2gKKyAgICAgICgidmlkZW90ZXN0c3JjIG51bS1idWZmZXJzPTc1ICEiCisgICAgICAiICB2aWRlby94LXJhdyx3aWR0aD04MCxoZWlnaHQ9NjQsZnJhbWVyYXRlPTE1LzEgISIKKyAgICAgICIgIHRoZW9yYWVuYyBrZXlmcmFtZS1mb3JjZT01ICEgc3BsaXRtdXhzaW5rIG5hbWU9c3BsaXRzaW5rIgorICAgICAgIiAgICBtYXgtc2l6ZS10aW1lPTEwMDAwMDAwMDAgbXV4ZXI9bWF0cm9za2FtdXgiCisgICAgICAiIGF1ZGlvdGVzdHNyYyBudW0tYnVmZmVycz0xMDAgc2FtcGxlc3BlcmJ1ZmZlcj0xMDI0ICEiCisgICAgICAiICBhdWRpby94LXJhdyxyYXRlPTIwMDAwICEgdm9yYmlzZW5jICEgc3BsaXRzaW5rLmF1ZGlvXyV1IgorICAgICAgIiBhcHBzcmMgbmFtZT1hcHBzcmMgZm9ybWF0PXRpbWUgY2Fwcz10ZXh0L3gtcmF3LGZvcm1hdD11dGY4ICEiCisgICAgICAiICBzcGxpdHNpbmsuc3VidGl0bGVfJXUiLCBOVUxMKTsKKyAgZmFpbF9pZiAocGlwZWxpbmUgPT0gTlVMTCk7CisKKyAgZWxlbWVudCA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgInNwbGl0c2luayIpOworICBmYWlsX2lmIChlbGVtZW50ID09IE5VTEwpOworICBkZXN0X3BhdHRlcm4gPSBnX2J1aWxkX2ZpbGVuYW1lICh0bXBkaXIsICJvdXQlMDVkLm9nZyIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChlbGVtZW50KSwgImxvY2F0aW9uIiwgZGVzdF9wYXR0ZXJuLCBOVUxMKTsKKyAgZ19jbGVhcl9wb2ludGVyICgmZGVzdF9wYXR0ZXJuLCBnX2ZyZWUpOworICBnX2NsZWFyX29iamVjdCAoJmVsZW1lbnQpOworCisgIGFwcHNyYyA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgImFwcHNyYyIpOworICBmYWlsX2lmIChhcHBzcmMgPT0gTlVMTCk7CisKKyAgLyogYWRkIHRoZSBTUEFSU0UgZmxhZyBvbiB0aGUgc3RyZWFtLXN0YXJ0IGV2ZW50IG9mIHRoZSBzdWJ0aXRsZSBzdHJlYW0gKi8KKyAgYXBwc3JjX3NyYyA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChhcHBzcmMsICJzcmMiKTsKKyAgZmFpbF9pZiAoYXBwc3JjX3NyYyA9PSBOVUxMKTsKKyAgZ3N0X3BhZF9hZGRfcHJvYmUgKGFwcHNyY19zcmMsIEdTVF9QQURfUFJPQkVfVFlQRV9FVkVOVF9ET1dOU1RSRUFNLAorICAgICAgaW50ZXJjZXB0X3N0cmVhbV9zdGFydCwgTlVMTCwgTlVMTCk7CisgIGdfY2xlYXJfb2JqZWN0ICgmYXBwc3JjX3NyYyk7CisKKyAgYnVzID0gZ3N0X3BpcGVsaW5lX2dldF9idXMgKEdTVF9QSVBFTElORSAocGlwZWxpbmUpKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgLyogcHVzaCBzdWJ0aXRsZXMsIG9uZSBwZXIgc2Vjb25kLCBzdGFydGluZyBmcm9tIHQ9MTAwbXMgKi8KKyAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworICAgIEdzdEJ1ZmZlciAqYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIDUsIE5VTEwpOworICAgIEdzdE1hcEluZm8gaW5mbzsKKworICAgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZpbmZvLCBHU1RfTUFQX1dSSVRFKTsKKyAgICBzdHJjcHkgKChjaGFyICopIGluZm8uZGF0YSwgInRlc3QiKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZpbmZvKTsKKworICAgIEdTVF9CVUZGRVJfUFRTIChidWZmZXIpID0gaSAqIEdTVF9TRUNPTkQgKyAxMDAgKiBHU1RfTVNFQ09ORDsKKyAgICBHU1RfQlVGRkVSX0RUUyAoYnVmZmVyKSA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworCisgICAgZmFpbF9pZiAoZ3N0X2FwcF9zcmNfcHVzaF9idWZmZXIgKEdTVF9BUFBfU1JDIChhcHBzcmMpLCBidWZmZXIpCisgICAgICAgICE9IEdTVF9GTE9XX09LKTsKKyAgfQorICBmYWlsX2lmIChnc3RfYXBwX3NyY19lbmRfb2Zfc3RyZWFtIChHU1RfQVBQX1NSQyAoYXBwc3JjKSkgIT0gR1NUX0ZMT1dfT0spOworCisgIG1zZyA9IGdzdF9idXNfdGltZWRfcG9wX2ZpbHRlcmVkIChidXMsIDUgKiBHU1RfU0VDT05ELCBHU1RfTUVTU0FHRV9FT1MpOworICBnX2NsZWFyX3BvaW50ZXIgKCZtc2csIGdzdF9tZXNzYWdlX3VucmVmKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ19jbGVhcl9vYmplY3QgKCZhcHBzcmMpOworICBnX2NsZWFyX29iamVjdCAoJmJ1cyk7CisgIGdfY2xlYXJfb2JqZWN0ICgmcGlwZWxpbmUpOworCisgIC8qIHJlYWQgYW5kIHZlcmlmeSAqLworCisgIHBpcGVsaW5lID0KKyAgICAgIGdzdF9wYXJzZV9sYXVuY2gKKyAgICAgICgic3BsaXRtdXhzcmMgbmFtZT1zcGxpdHNyYyIKKyAgICAgICIgc3BsaXRzcmMuICEgdGhlb3JhZGVjICEgYXBwc2luayBuYW1lPXZzaW5rIHN5bmM9ZmFsc2UgZW1pdC1zaWduYWxzPXRydWUiCisgICAgICAiIHNwbGl0c3JjLiAhIHZvcmJpc2RlYyAhIGFwcHNpbmsgbmFtZT1hc2luayBzeW5jPWZhbHNlIGVtaXQtc2lnbmFscz10cnVlIgorICAgICAgIiBzcGxpdHNyYy4gISB0ZXh0L3gtcmF3ICEgYXBwc2luayBuYW1lPXRzaW5rIHN5bmM9ZmFsc2UgZW1pdC1zaWduYWxzPXRydWUiLAorICAgICAgTlVMTCk7CisgIGZhaWxfaWYgKHBpcGVsaW5lID09IE5VTEwpOworCisgIGVsZW1lbnQgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJzcGxpdHNyYyIpOworICBmYWlsX2lmIChlbGVtZW50ID09IE5VTEwpOworICBkZXN0X3BhdHRlcm4gPSBnX2J1aWxkX2ZpbGVuYW1lICh0bXBkaXIsICJvdXQqLm9nZyIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChlbGVtZW50KSwgImxvY2F0aW9uIiwgZGVzdF9wYXR0ZXJuLCBOVUxMKTsKKyAgZ19jbGVhcl9wb2ludGVyICgmZGVzdF9wYXR0ZXJuLCBnX2ZyZWUpOworICBnX2NsZWFyX29iamVjdCAoJmVsZW1lbnQpOworCisgIHsKKyAgICBHc3RDbG9ja1RpbWUgdnNpbmtfcHJldl90cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgR3N0Q2xvY2tUaW1lIGFzaW5rX3ByZXZfdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgIEdzdENsb2NrVGltZSB0c2lua19wcmV2X3RzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICAgIC8qIHZlcmlmeSB0aGF0IHRpbWVzdGFtcHMgYXJlIGNvbnRpbnVvdXNseSBpbmNyZWFzaW5nIGZvciBhdWRpbyArIHZpZGVvLgorICAgICAqIGlmIHdlIGhpdCBidWcgNzYxMDg2LCB0aW1lc3RhbXBzIHdpbGwganVtcCBhYm91dCAtOTAwbXMgYWZ0ZXIgc3dpdGNoaW5nCisgICAgICogdG8gYSBuZXcgcGFydCwgYmVjYXVzZSB0aGlzIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGxhc3Qgc3VidGl0bGUKKyAgICAgKiBwdHMgYW5kIHRoZSBsYXN0IGF1ZGlvL3ZpZGVvIHB0cyAqLworICAgIGVsZW1lbnQgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJ2c2luayIpOworICAgIGdfc2lnbmFsX2Nvbm5lY3QgKGVsZW1lbnQsICJuZXctc2FtcGxlIiwKKyAgICAgICAgKEdDYWxsYmFjaykgbmV3X3NhbXBsZV92ZXJpZnlfY29udGludW91c190aW1lc3RhbXBzLCAmdnNpbmtfcHJldl90cyk7CisgICAgZ19jbGVhcl9vYmplY3QgKCZlbGVtZW50KTsKKworICAgIGVsZW1lbnQgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJhc2luayIpOworICAgIGdfc2lnbmFsX2Nvbm5lY3QgKGVsZW1lbnQsICJuZXctc2FtcGxlIiwKKyAgICAgICAgKEdDYWxsYmFjaykgbmV3X3NhbXBsZV92ZXJpZnlfY29udGludW91c190aW1lc3RhbXBzLCAmYXNpbmtfcHJldl90cyk7CisgICAgZ19jbGVhcl9vYmplY3QgKCZlbGVtZW50KTsKKworICAgIC8qIGFsc28gdmVyaWZ5IHRoYXQgc3VidGl0bGUgdGltZXN0YW1wcyBhcmUgaW5jcmVhc2luZyBieSBhYm91dCAxcy4KKyAgICAgKiBpZiB3ZSBoaXQgYnVnIDc2MTA4NiwgdGltZXN0YW1wcyB3aWxsIGluY3JlYXNlIGJ5IGV4YWN0bHkgMTAwbXMgaW5zdGVhZCwKKyAgICAgKiBiZWNhdXNlIHRoaXMgaXMgdGhlIHJlbGF0aXZlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHBhcnQncyBzdGFydCB0aW1lCisgICAgICogKHJlbWVtYmVyIGEgbmV3IHBhcnQgc3RhcnRzIGV2ZXJ5IDFzZWMpIGFuZCB0aGUgc3VidGl0bGUncyBwdHMgaW4gdGhhdAorICAgICAqIHBhcnQsIHdoaWNoIHdpbGwgYmUgYWRkZWQgdG8gdGhlIG1heF90cyBvZiB0aGUgcHJldmlvdXMgcGFydCwgd2hpY2gKKyAgICAgKiBlcXVhbHMgdGhlIGxhc3Qgc3VidGl0bGUncyBwdHMgKGFuZCBzaG91bGQgbm90ISkgKi8KKyAgICBlbGVtZW50ID0gZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAocGlwZWxpbmUpLCAidHNpbmsiKTsKKyAgICBnX3NpZ25hbF9jb25uZWN0IChlbGVtZW50LCAibmV3LXNhbXBsZSIsCisgICAgICAgIChHQ2FsbGJhY2spIG5ld19zYW1wbGVfdmVyaWZ5XzFzZWNfb2Zmc2V0LCAmdHNpbmtfcHJldl90cyk7CisgICAgZ19jbGVhcl9vYmplY3QgKCZlbGVtZW50KTsKKworICAgIG1zZyA9IHJ1bl9waXBlbGluZSAocGlwZWxpbmUpOworICB9CisKKyAgaWYgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRVJST1IpCisgICAgZHVtcF9lcnJvciAobXNnKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRU9TKTsKKworICBnX2NsZWFyX3BvaW50ZXIgKCZtc2csIGdzdF9tZXNzYWdlX3VucmVmKTsKKyAgZ19jbGVhcl9vYmplY3QgKCZwaXBlbGluZSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RydWN0IENhcHNDaGFuZ2VEYXRhCit7CisgIGd1aW50IGNvdW50OworICBHc3RFbGVtZW50ICpjZjsKK307CisKK3N0YXRpYyBHc3RQYWRQcm9iZVJldHVybgorc3dpdGNoX2NhcHMgKEdzdFBhZCAqIHBhZCwgR3N0UGFkUHJvYmVJbmZvICogaW5mbywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBzdHJ1Y3QgQ2Fwc0NoYW5nZURhdGEgKmRhdGEgPSAoc3RydWN0IENhcHNDaGFuZ2VEYXRhICopICh1c2VyX2RhdGEpOworCisgIGlmIChkYXRhLT5jb3VudCA9PSA0KSB7CisgICAgR1NUX0lORk8gKCJTYXcgNSBidWZmZXJzIHRvIHRoZSBlbmNvZGVyLiBTd2l0Y2hpbmcgY2FwcyIpOworICAgIGdzdF91dGlsX3NldF9vYmplY3RfYXJnIChHX09CSkVDVCAoZGF0YS0+Y2YpLCAiY2FwcyIsCisgICAgICAgICJ2aWRlby94LXJhdyx3aWR0aD0xNjAsaGVpZ2h0PTEyOCxmcmFtZXJhdGU9MTAvMSIpOworICB9CisgIGRhdGEtPmNvdW50Kys7CisgIHJldHVybiBHU1RfUEFEX1BST0JFX09LOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9zcGxpdG11eHNyY19jYXBzX2NoYW5nZSkKK3sKKyAgR3N0TWVzc2FnZSAqbXNnOworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0RWxlbWVudCAqc2luazsKKyAgR3N0RWxlbWVudCAqY2Y7CisgIEdzdFBhZCAqc2lua3BhZDsKKyAgZ2NoYXIgKmRlc3RfcGF0dGVybjsKKyAgZ3VpbnQgY291bnQ7CisgIGdjaGFyICppbl9wYXR0ZXJuOworICBzdHJ1Y3QgQ2Fwc0NoYW5nZURhdGEgZGF0YTsKKworICAvKiBUaGlzIHRlc3QgY3JlYXRlcyBhIG5ldyBmaWxlIG9ubHkgYnkgY2hhbmdpbmcgdGhlIGNhcHMsIHdoaWNoCisgICAqIHF0bXV4IHdpbGwgcmVqZWN0IChmb3Igbm93IC0gaWYgcXRtdXggc3RhcnRzIHN1cHBvcnRpbmcgY2FwcworICAgKiBjaGFuZ2VzLCB0aGlzIHRlc3Qgd2lsbCBicmVhayBhbmQgbmVlZCBmaXhpbmcvZGlzYWJsaW5nICovCisgIHBpcGVsaW5lID0KKyAgICAgIGdzdF9wYXJzZV9sYXVuY2gKKyAgICAgICgidmlkZW90ZXN0c3JjIG51bS1idWZmZXJzPTEwICEiCisgICAgICAiICBjYXBzZmlsdGVyIG5hbWU9YyBjYXBzPXZpZGVvL3gtcmF3LHdpZHRoPTgwLGhlaWdodD02NCxmcmFtZXJhdGU9MTAvMSAhIgorICAgICAgIiAganBlZ2VuYyAhIHNwbGl0bXV4c2luayBuYW1lPXNwbGl0c2luayBtdXhlcj1xdG11eCIsIE5VTEwpOworICBmYWlsX2lmIChwaXBlbGluZSA9PSBOVUxMKTsKKyAgc2luayA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgInNwbGl0c2luayIpOworICBmYWlsX2lmIChzaW5rID09IE5VTEwpOworICBnX3NpZ25hbF9jb25uZWN0IChzaW5rLCAiZm9ybWF0LWxvY2F0aW9uLWZ1bGwiLAorICAgICAgKEdDYWxsYmFjaykgY2hlY2tfZm9ybWF0X2xvY2F0aW9uLCBOVUxMKTsKKyAgZGVzdF9wYXR0ZXJuID0gZ19idWlsZF9maWxlbmFtZSAodG1wZGlyLCAib3V0JTA1ZC5tcDQiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc2luayksICJsb2NhdGlvbiIsIGRlc3RfcGF0dGVybiwgTlVMTCk7CisgIGdfZnJlZSAoZGVzdF9wYXR0ZXJuKTsKKyAgZ19vYmplY3RfdW5yZWYgKHNpbmspOworCisgIGNmID0gZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAocGlwZWxpbmUpLCAiYyIpOworICBzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGNmLCAic2luayIpOworCisgIGRhdGEuY2YgPSBjZjsKKyAgZGF0YS5jb3VudCA9IDA7CisKKyAgZ3N0X3BhZF9hZGRfcHJvYmUgKHNpbmtwYWQsIEdTVF9QQURfUFJPQkVfVFlQRV9CVUZGRVIsCisgICAgICBzd2l0Y2hfY2FwcywgJmRhdGEsIE5VTEwpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChjZik7CisKKyAgbXNnID0gcnVuX3BpcGVsaW5lIChwaXBlbGluZSk7CisKKyAgaWYgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRVJST1IpCisgICAgZHVtcF9lcnJvciAobXNnKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRU9TKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworCisgIGNvdW50ID0gY291bnRfZmlsZXMgKHRtcGRpcik7CisgIGZhaWxfdW5sZXNzIChjb3VudCA9PSAyLCAiRXhwZWN0ZWQgMiBvdXRwdXQgZmlsZXMsIGdvdCAlZCIsIGNvdW50KTsKKworICBpbl9wYXR0ZXJuID0gZ19idWlsZF9maWxlbmFtZSAodG1wZGlyLCAib3V0Ki5tcDQiLCBOVUxMKTsKKyAgdGVzdF9wbGF5YmFjayAoaW5fcGF0dGVybiwgMCwgR1NUX1NFQ09ORCk7CisgIGdfZnJlZSAoaW5fcGF0dGVybik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfc3BsaXRtdXhzcmNfcm9idXN0X211eCkKK3sKKyAgR3N0TWVzc2FnZSAqbXNnOworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0RWxlbWVudCAqc2luazsKKyAgZ2NoYXIgKmRlc3RfcGF0dGVybjsKKyAgZ2NoYXIgKmluX3BhdHRlcm47CisKKyAgLyogVGhpcyB0ZXN0IGNyZWF0ZXMgYSBuZXcgZmlsZSBvbmx5IGJ5IGNoYW5naW5nIHRoZSBjYXBzLCB3aGljaAorICAgKiBxdG11eCB3aWxsIHJlamVjdCAoZm9yIG5vdyAtIGlmIHF0bXV4IHN0YXJ0cyBzdXBwb3J0aW5nIGNhcHMKKyAgICogY2hhbmdlcywgdGhpcyB0ZXN0IHdpbGwgYnJlYWsgYW5kIG5lZWQgZml4aW5nL2Rpc2FibGluZyAqLworICBwaXBlbGluZSA9CisgICAgICBnc3RfcGFyc2VfbGF1bmNoCisgICAgICAoInZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz0xMCAhIgorICAgICAgIiAgdmlkZW8veC1yYXcsd2lkdGg9ODAsaGVpZ2h0PTY0LGZyYW1lcmF0ZT0xMC8xICEiCisgICAgICAiICBqcGVnZW5jICEgc3BsaXRtdXhzaW5rIG5hbWU9c3BsaXRzaW5rIG11eGVyPVwicXRtdXggcmVzZXJ2ZWQtYnl0ZXMtcGVyLXNlYz0yMDAgcmVzZXJ2ZWQtbW9vdi11cGRhdGUtcGVyaW9kPTEwMDAwMDAwMCBcIiBtYXgtc2l6ZS10aW1lPTUwMDAwMDAwMCB1c2Utcm9idXN0LW11eGluZz10cnVlIiwKKyAgICAgIE5VTEwpOworICBmYWlsX2lmIChwaXBlbGluZSA9PSBOVUxMKTsKKyAgc2luayA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgInNwbGl0c2luayIpOworICBmYWlsX2lmIChzaW5rID09IE5VTEwpOworICBnX3NpZ25hbF9jb25uZWN0IChzaW5rLCAiZm9ybWF0LWxvY2F0aW9uLWZ1bGwiLAorICAgICAgKEdDYWxsYmFjaykgY2hlY2tfZm9ybWF0X2xvY2F0aW9uLCBOVUxMKTsKKyAgZGVzdF9wYXR0ZXJuID0gZ19idWlsZF9maWxlbmFtZSAodG1wZGlyLCAib3V0JTA1ZC5tcDQiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc2luayksICJsb2NhdGlvbiIsIGRlc3RfcGF0dGVybiwgTlVMTCk7CisgIGdfZnJlZSAoZGVzdF9wYXR0ZXJuKTsKKyAgZ19vYmplY3RfdW5yZWYgKHNpbmspOworCisgIG1zZyA9IHJ1bl9waXBlbGluZSAocGlwZWxpbmUpOworCisgIGlmIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VSUk9SKQorICAgIGR1bXBfZXJyb3IgKG1zZyk7CisgIGZhaWxfdW5sZXNzIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VPUyk7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKworICAvKiBVbmxpa2Ugb3RoZXIgdGVzdHMsIHdlIGRvbid0IGNoZWNrIGFuIGV4cGxpY2l0IGZpbGUgc2l6ZSwgYmVjYXVzZSB0aGUgb3ZlcmZsb3cgZGV0ZWN0aW9uCisgICAqIGNhbiBiZSByYWN5IChkZXBlbmRzIG9uIGV4YWN0bHkgd2hlbiBidWZmZXJzIGdldCBoYW5kZWQgdG8gdGhlIG11eGVyIGFuZCB3aGVuIGl0IHVwZGF0ZXMgdGhlCisgICAqIHJlc2VydmVkIGR1cmF0aW9uIHByb3BlcnR5LiBBbGwgd2UgY2FyZSBhYm91dCBpcyB0aGF0IHRoZSBtdXhpbmcgZGlkbid0IGZhaWwgYmVjYXVzZSBzcGFjZSByYW4gb3V0ICovCisKKyAgaW5fcGF0dGVybiA9IGdfYnVpbGRfZmlsZW5hbWUgKHRtcGRpciwgIm91dCoubXA0IiwgTlVMTCk7CisgIHRlc3RfcGxheWJhY2sgKGluX3BhdHRlcm4sIDAsIEdTVF9TRUNPTkQpOworICBnX2ZyZWUgKGluX3BhdHRlcm4pOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIEZvciB2ZXJpZnlpbmcgYnVnIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjI4OTMgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3NwbGl0bXV4c2lua19yZXVzZV9zaW1wbGUpCit7CisgIEdzdEVsZW1lbnQgKnNpbms7CisgIEdzdFBhZCAqcGFkOworCisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJzcGxpdG11eHNpbmsiLCBOVUxMKTsKKyAgcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChzaW5rLCAidmlkZW8iKTsKKyAgZmFpbF91bmxlc3MgKHBhZCAhPSBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzaW5rLCAibG9jYXRpb24iLCAiL2Rldi9udWxsIiwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc2luaywKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9BU1lOQyk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNpbmssCisgICAgICAgICAgR1NUX1NUQVRFX05VTEwpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNpbmssCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfQVNZTkMpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzaW5rLAorICAgICAgICAgIEdTVF9TVEFURV9OVUxMKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKHNpbmssIHBhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmspOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitzcGxpdG11eF9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJzcGxpdG11eCIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisgIFRDYXNlICp0Y19jaGFpbl9iYXNpYyA9IHRjYXNlX2NyZWF0ZSAoImJhc2ljIik7CisgIFRDYXNlICp0Y19jaGFpbl9jb21wbGV4ID0gdGNhc2VfY3JlYXRlICgiY29tcGxleCIpOworICBUQ2FzZSAqdGNfY2hhaW5fbXA0X2pwZWcgPSB0Y2FzZV9jcmVhdGUgKCJjYXBzX2NoYW5nZSIpOworICBnYm9vbGVhbiBoYXZlX3RoZW9yYSwgaGF2ZV9vZ2csIGhhdmVfdm9yYmlzLCBoYXZlX21hdHJvc2thLCBoYXZlX3F0bXV4LAorICAgICAgaGF2ZV9qcGVnOworCisgIC8qIHdlIGFzc3VtZSB0aGF0IGlmIGVuY29kZXIvbXV4ZXIgYXJlIHRoZXJlLCBkZWNvZGVyL2RlbXV4ZXIgd2lsbCBiZSBhIHdlbGwgKi8KKyAgaGF2ZV90aGVvcmEgPSBnc3RfcmVnaXN0cnlfY2hlY2tfZmVhdHVyZV92ZXJzaW9uIChnc3RfcmVnaXN0cnlfZ2V0ICgpLAorICAgICAgInRoZW9yYWVuYyIsIEdTVF9WRVJTSU9OX01BSk9SLCBHU1RfVkVSU0lPTl9NSU5PUiwgMCk7CisgIGhhdmVfb2dnID0gZ3N0X3JlZ2lzdHJ5X2NoZWNrX2ZlYXR1cmVfdmVyc2lvbiAoZ3N0X3JlZ2lzdHJ5X2dldCAoKSwKKyAgICAgICJvZ2dtdXgiLCBHU1RfVkVSU0lPTl9NQUpPUiwgR1NUX1ZFUlNJT05fTUlOT1IsIDApOworICBoYXZlX3ZvcmJpcyA9IGdzdF9yZWdpc3RyeV9jaGVja19mZWF0dXJlX3ZlcnNpb24gKGdzdF9yZWdpc3RyeV9nZXQgKCksCisgICAgICAidm9yYmlzZW5jIiwgR1NUX1ZFUlNJT05fTUFKT1IsIEdTVF9WRVJTSU9OX01JTk9SLCAwKTsKKyAgaGF2ZV9tYXRyb3NrYSA9IGdzdF9yZWdpc3RyeV9jaGVja19mZWF0dXJlX3ZlcnNpb24gKGdzdF9yZWdpc3RyeV9nZXQgKCksCisgICAgICAibWF0cm9za2FtdXgiLCBHU1RfVkVSU0lPTl9NQUpPUiwgR1NUX1ZFUlNJT05fTUlOT1IsIDApOworICBoYXZlX3F0bXV4ID0gZ3N0X3JlZ2lzdHJ5X2NoZWNrX2ZlYXR1cmVfdmVyc2lvbiAoZ3N0X3JlZ2lzdHJ5X2dldCAoKSwKKyAgICAgICJxdG11eCIsIEdTVF9WRVJTSU9OX01BSk9SLCBHU1RfVkVSU0lPTl9NSU5PUiwgMCk7CisgIGhhdmVfanBlZyA9IGdzdF9yZWdpc3RyeV9jaGVja19mZWF0dXJlX3ZlcnNpb24gKGdzdF9yZWdpc3RyeV9nZXQgKCksCisgICAgICAianBlZ2VuYyIsIEdTVF9WRVJTSU9OX01BSk9SLCBHU1RfVkVSU0lPTl9NSU5PUiwgMCk7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW5fYmFzaWMpOworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluX2NvbXBsZXgpOworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluX21wNF9qcGVnKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW5fYmFzaWMsIHRlc3Rfc3BsaXRtdXhzaW5rX3JldXNlX3NpbXBsZSk7CisKKyAgaWYgKGhhdmVfdGhlb3JhICYmIGhhdmVfb2dnKSB7CisgICAgdGNhc2VfYWRkX2NoZWNrZWRfZml4dHVyZSAodGNfY2hhaW4sIHRlbXBkaXJfc2V0dXAsIHRlbXBkaXJfY2xlYW51cCk7CisKKyAgICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfc3BsaXRtdXhzcmMpOworICAgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9zcGxpdG11eHNyY19mb3JtYXRfbG9jYXRpb24pOworICAgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9zcGxpdG11eHNpbmspOworCisgICAgaWYgKGhhdmVfbWF0cm9za2EgJiYgaGF2ZV92b3JiaXMpIHsKKyAgICAgIHRjYXNlX2FkZF9jaGVja2VkX2ZpeHR1cmUgKHRjX2NoYWluX2NvbXBsZXgsIHRlbXBkaXJfc2V0dXAsCisgICAgICAgICAgdGVtcGRpcl9jbGVhbnVwKTsKKworICAgICAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluX2NvbXBsZXgsIHRlc3Rfc3BsaXRtdXhzcmNfc3BhcnNlX3N0cmVhbXMpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfSU5GTyAoIlNraXBwaW5nIHRlc3RzLCBtaXNzaW5nIHBsdWdpbnM6IG1hdHJvc2thIGFuZC9vciB2b3JiaXMiKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgR1NUX0lORk8gKCJTa2lwcGluZyB0ZXN0cywgbWlzc2luZyBwbHVnaW5zOiB0aGVvcmEgYW5kL29yIG9nZyIpOworICB9CisKKworICBpZiAoaGF2ZV9xdG11eCAmJiBoYXZlX2pwZWcpIHsKKyAgICB0Y2FzZV9hZGRfY2hlY2tlZF9maXh0dXJlICh0Y19jaGFpbl9tcDRfanBlZywgdGVtcGRpcl9zZXR1cCwKKyAgICAgICAgdGVtcGRpcl9jbGVhbnVwKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW5fbXA0X2pwZWcsIHRlc3Rfc3BsaXRtdXhzcmNfY2Fwc19jaGFuZ2UpOworICAgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbl9tcDRfanBlZywgdGVzdF9zcGxpdG11eHNyY19yb2J1c3RfbXV4KTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfSU5GTyAoIlNraXBwaW5nIHRlc3RzLCBtaXNzaW5nIHBsdWdpbnM6IGpwZWdlbmMgb3IgbXA0bXV4Iik7CisgIH0KKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChzcGxpdG11eCk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy91ZHBzaW5rLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy91ZHBzaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E4YjcyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3VkcHNpbmsuYwpAQCAtMCwwICsxLDI1OCBAQAorLyogR1N0cmVhbWVyIHVkcHNpbmsgdW5pdCB0ZXN0cworICogQ29weXJpZ2h0IChDKSAyMDA5IEF4aXMgQ29tbXVuaWNhdGlvbnMgPGRldi1nc3RyZWFtZXJAYXhpcy5jb20+CisgKiBAYXV0aG9yIE9nbnlhbiBUb25jaGV2IDxvZ255YW5AYXhpcy5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNlc2luay5oPgorI2luY2x1ZGUgPGdpby9naW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCisjZGVmaW5lIFJUUF9IRUFERVJfU0laRSAxMgorI2RlZmluZSBSVFBfUEFZTE9BRF9TSVpFIDEwMjQKKworLyoKKyAqIE51bWJlciBvZiBieXRlcyByZWNlaXZlZCBpbiB0aGUgcmVuZGVyIGZ1bmN0aW9uIHdoZW4gdXNpbmcgYnVmZmVyIGxpc3RzCisgKi8KK3N0YXRpYyBndWludCByZW5kZXJfbGlzdF9ieXRlc19yZWNlaXZlZDsKKworLyoKKyAqIFJlbmRlciBmdW5jdGlvbiBmb3IgdGVzdGluZyB1ZHBzaW5rIHdpdGggYnVmZmVyIGxpc3RzCisgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCit1ZHBzaW5rX3JlbmRlcl9saXN0IChHc3RCYXNlU2luayAqIHNpbmssIEdzdEJ1ZmZlckxpc3QgKiBsaXN0KQoreworICBndWludCBpLCBudW07CisKKyAgbnVtID0gZ3N0X2J1ZmZlcl9saXN0X2xlbmd0aCAobGlzdCk7CisgIGZvciAoaSA9IDA7IGkgPCBudW07ICsraSkgeworICAgIEdzdEJ1ZmZlciAqYnVmID0gZ3N0X2J1ZmZlcl9saXN0X2dldCAobGlzdCwgaSk7CisgICAgZ3NpemUgc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisKKyAgICBHU1RfREVCVUcgKCJyZW5kZXJlZCAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIiwgc2l6ZSk7CisgICAgcmVuZGVyX2xpc3RfYnl0ZXNfcmVjZWl2ZWQgKz0gc2l6ZTsKKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK3NldF9yZW5kZXJfbGlzdF9mdW5jdGlvbiAoR3N0RWxlbWVudCAqIGJzaW5rKQoreworICBHc3RCYXNlU2lua0NsYXNzICpic2NsYXNzOworCisgIGJzY2xhc3MgPSBHU1RfQkFTRV9TSU5LX0dFVF9DTEFTUyAoKEdzdEJhc2VTaW5rICopIGJzaW5rKTsKKworICAvKiBBZGQgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSBidWZmZXIgbGlzdCB0ZXN0cyAqLworICBic2NsYXNzLT5yZW5kZXJfbGlzdCA9IHVkcHNpbmtfcmVuZGVyX2xpc3Q7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXJMaXN0ICoKK2NyZWF0ZV9idWZmZXJfbGlzdCAoZ3VpbnQgKiBkYXRhX3NpemUpCit7CisgIEdzdEJ1ZmZlckxpc3QgKmxpc3Q7CisgIEdzdEJ1ZmZlciAqcnRwX2J1ZmZlcjsKKyAgR3N0QnVmZmVyICpkYXRhX2J1ZmZlcjsKKworICBsaXN0ID0gZ3N0X2J1ZmZlcl9saXN0X25ldyAoKTsKKworICAvKioqIEZpcnN0IGdyb3VwLCBpLmUuIGZpcnN0IHBhY2tldC4gKiovCisKKyAgLyogQ3JlYXRlIHRoZSBSVFAgaGVhZGVyIGJ1ZmZlciAqLworICBydHBfYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIFJUUF9IRUFERVJfU0laRSwgTlVMTCk7CisgIGdzdF9idWZmZXJfbWVtc2V0IChydHBfYnVmZmVyLCAwLCAwLCBSVFBfSEVBREVSX1NJWkUpOworCisgIC8qIENyZWF0ZSB0aGUgYnVmZmVyIHRoYXQgaG9sZHMgdGhlIHBheWxvYWQgKi8KKyAgZGF0YV9idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgUlRQX1BBWUxPQURfU0laRSwgTlVMTCk7CisgIGdzdF9idWZmZXJfbWVtc2V0IChkYXRhX2J1ZmZlciwgMCwgMCwgUlRQX1BBWUxPQURfU0laRSk7CisKKyAgLyogQ3JlYXRlIGEgbmV3IGdyb3VwIHRvIGhvbGQgdGhlIHJ0cCBoZWFkZXIgYW5kIHRoZSBwYXlsb2FkICovCisgIGdzdF9idWZmZXJfbGlzdF9hZGQgKGxpc3QsIGdzdF9idWZmZXJfYXBwZW5kIChydHBfYnVmZmVyLCBkYXRhX2J1ZmZlcikpOworCisgIC8qKiogIFNlY29uZCBncm91cCwgaS5lLiBzZWNvbmQgcGFja2V0LiAqKiovCisKKyAgLyogQ3JlYXRlIHRoZSBSVFAgaGVhZGVyIGJ1ZmZlciAqLworICBydHBfYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIFJUUF9IRUFERVJfU0laRSwgTlVMTCk7CisgIGdzdF9idWZmZXJfbWVtc2V0IChydHBfYnVmZmVyLCAwLCAwLCBSVFBfSEVBREVSX1NJWkUpOworCisgIC8qIENyZWF0ZSB0aGUgYnVmZmVyIHRoYXQgaG9sZHMgdGhlIHBheWxvYWQgKi8KKyAgZGF0YV9idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgUlRQX1BBWUxPQURfU0laRSwgTlVMTCk7CisgIGdzdF9idWZmZXJfbWVtc2V0IChkYXRhX2J1ZmZlciwgMCwgMCwgUlRQX1BBWUxPQURfU0laRSk7CisKKyAgLyogQ3JlYXRlIGEgbmV3IGdyb3VwIHRvIGhvbGQgdGhlIHJ0cCBoZWFkZXIgYW5kIHRoZSBwYXlsb2FkICovCisgIGdzdF9idWZmZXJfbGlzdF9hZGQgKGxpc3QsIGdzdF9idWZmZXJfYXBwZW5kIChydHBfYnVmZmVyLCBkYXRhX2J1ZmZlcikpOworCisgIC8qIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSAqLworICAqZGF0YV9zaXplID0gMiAqIFJUUF9IRUFERVJfU0laRSArIDIgKiBSVFBfUEFZTE9BRF9TSVpFOworCisgIHJldHVybiBsaXN0OworfQorCitzdGF0aWMgdm9pZAordWRwc2lua190ZXN0IChnYm9vbGVhbiB1c2VfYnVmZmVyX2xpc3RzKQoreworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgIEdzdEVsZW1lbnQgKnVkcHNpbms7CisgIEdzdFBhZCAqc3JjcGFkOworICBHc3RCdWZmZXJMaXN0ICpsaXN0OworICBndWludCBkYXRhX3NpemU7CisKKyAgbGlzdCA9IGNyZWF0ZV9idWZmZXJfbGlzdCAoJmRhdGFfc2l6ZSk7CisKKyAgdWRwc2luayA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgidWRwc2luayIpOworICBpZiAodXNlX2J1ZmZlcl9saXN0cykKKyAgICBzZXRfcmVuZGVyX2xpc3RfZnVuY3Rpb24gKHVkcHNpbmspOworCisgIHNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkX2J5X25hbWUgKHVkcHNpbmssICZzcmN0ZW1wbGF0ZSwgInNpbmsiKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHVkcHNpbmssIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzcmNwYWQsIFRSVUUpOworCisgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3JjcGFkLCBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoImhleSB0aGVyZSEiKSk7CisKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3BhZF9wdXNoX2xpc3QgKHNyY3BhZCwgbGlzdCksIEdTVF9GTE9XX09LKTsKKworICBnc3RfY2hlY2tfdGVhcmRvd25fcGFkX2J5X25hbWUgKHVkcHNpbmssICJzaW5rIik7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50ICh1ZHBzaW5rKTsKKworICBpZiAodXNlX2J1ZmZlcl9saXN0cykKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhX3NpemUsIHJlbmRlcl9saXN0X2J5dGVzX3JlY2VpdmVkKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdWRwc2luaykKK3sKKyAgdWRwc2lua190ZXN0IChGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF91ZHBzaW5rX2J1ZmZlcmxpc3QpCit7CisgIHVkcHNpbmtfdGVzdCAoVFJVRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdWRwc2lua19jbGllbnRfYWRkX3JlbW92ZSkKK3sKKyAgR3N0RWxlbWVudCAqdWRwc2luazsKKworICAvKiBOb3RlOiBrZWVwIGluIG1pbmQgdGhhdCB0aGVzZSBhcmUgaW4gYWRkaXRpb24gdG8gdGhlIGNsaWVudCBhZGRlZCBieQorICAgKiB0aGUgaG9zdC9wb3J0IHByb3BlcnRpZXMgKGJ5IGRlZmF1bHQgJ2xvY2FsaG9zdDo1MDA0JyAqLworCisgIHVkcHNpbmsgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoInVkcHNpbmsiKTsKKyAgZ19zaWduYWxfZW1pdF9ieV9uYW1lICh1ZHBzaW5rLCAicmVtb3ZlIiwgImxvY2FsaG9zdCIsIDUwMDQsIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmICh1ZHBzaW5rKTsKKworICB1ZHBzaW5rID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJ1ZHBzaW5rIik7CisgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAodWRwc2luaywgImFkZCIsICIxMjcuMC4wLjEiLCA1NTU0LCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodWRwc2luayk7CisKKyAgdWRwc2luayA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgidWRwc2luayIpOworICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHVkcHNpbmssICJhZGQiLCAiMTI3LjAuMC4xIiwgNTU1NCwgTlVMTCk7CisgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAodWRwc2luaywgImFkZCIsICIxMjcuMC4wLjEiLCA1NTU0LCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodWRwc2luayk7CisKKyAgdWRwc2luayA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgidWRwc2luayIpOworICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHVkcHNpbmssICJhZGQiLCAiMTI3LjAuMC4xIiwgNTU1NCwgTlVMTCk7CisgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAodWRwc2luaywgInJlbW92ZSIsICIxMjcuMC4wLjEiLCA1NTU0LCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodWRwc2luayk7CisKKyAgdWRwc2luayA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgidWRwc2luayIpOworICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHVkcHNpbmssICJhZGQiLCAiMTI3LjAuMC4xIiwgNTU1NCwgTlVMTCk7CisgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAodWRwc2luaywgInJlbW92ZSIsICIxMjcuMC4wLjEiLCA1NTU1LCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodWRwc2luayk7CisKKyAgdWRwc2luayA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgidWRwc2luayIpOworICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHVkcHNpbmssICJhZGQiLCAiMTI3LjAuMC4xIiwgNTU1NCwgTlVMTCk7CisgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAodWRwc2luaywgImFkZCIsICIxMjcuMC4wLjEiLCA1NTU1LCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodWRwc2luayk7CisKKyAgdWRwc2luayA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgidWRwc2luayIpOworICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHVkcHNpbmssICJhZGQiLCAiMTI3LjAuMC4xIiwgNTU1NCwgTlVMTCk7CisgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAodWRwc2luaywgImFkZCIsICIxMC4yLjAuMSIsIDU1NTQsIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmICh1ZHBzaW5rKTsKKworICB1ZHBzaW5rID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJ1ZHBzaW5rIik7CisgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAodWRwc2luaywgImFkZCIsICIxMjcuMC4wLjEiLCA1NTU0LCBOVUxMKTsKKyAgZ19zaWduYWxfZW1pdF9ieV9uYW1lICh1ZHBzaW5rLCAiYWRkIiwgIjEwLjIuMC4xIiwgNTU1NCwgTlVMTCk7CisgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAodWRwc2luaywgInJlbW92ZSIsICIxMjcuMC4wLjEiLCA1NTU0LCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodWRwc2luayk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdWRwc2lua19kc2NwKQoreworICBHc3RFbGVtZW50ICp1ZHBzaW5rOworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKyAgR1NvY2tldCAqc29jazQsICpzb2NrNjsKKworICBzb2NrNCA9CisgICAgICBnX3NvY2tldF9uZXcgKEdfU09DS0VUX0ZBTUlMWV9JUFY0LCBHX1NPQ0tFVF9UWVBFX0RBVEFHUkFNLAorICAgICAgR19TT0NLRVRfUFJPVE9DT0xfVURQLCAmZXJyb3IpOworICBmYWlsX3VubGVzcyAoc29jazQgIT0gTlVMTCAmJiBlcnJvciA9PSBOVUxMKTsKKyAgc29jazYgPQorICAgICAgZ19zb2NrZXRfbmV3IChHX1NPQ0tFVF9GQU1JTFlfSVBWNiwgR19TT0NLRVRfVFlQRV9EQVRBR1JBTSwKKyAgICAgIEdfU09DS0VUX1BST1RPQ09MX1VEUCwgJmVycm9yKTsKKyAgZmFpbF91bmxlc3MgKHNvY2s2ICE9IE5VTEwgJiYgZXJyb3IgPT0gTlVMTCk7CisKKyAgdWRwc2luayA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgidWRwc2luayIpOworICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHVkcHNpbmssICJhZGQiLCAiMTI3LjAuMC4xIiwgNTU1NCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAodWRwc2luaywgInNvY2tldCIsIHNvY2s0LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0ICh1ZHBzaW5rLCAic29ja2V0LXY2Iiwgc29jazYsIE5VTEwpOworCisgIEFTU0VSVF9TRVRfU1RBVEUgKHVkcHNpbmssIEdTVF9TVEFURV9SRUFEWSwgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBnX29iamVjdF9zZXQgKHVkcHNpbmssICJxb3MtZHNjcCIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHVkcHNpbmssICJxb3MtZHNjcCIsIDYzLCBOVUxMKTsKKworICBBU1NFUlRfU0VUX1NUQVRFICh1ZHBzaW5rLCBHU1RfU1RBVEVfTlVMTCwgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBnc3Rfb2JqZWN0X3VucmVmICh1ZHBzaW5rKTsKKyAgZ19vYmplY3RfdW5yZWYgKHNvY2s0KTsKKyAgZ19vYmplY3RfdW5yZWYgKHNvY2s2KTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgordWRwc2lua19zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJ1ZHBzaW5rX3Rlc3QiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgibGluZWFyIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3VkcHNpbmspOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdWRwc2lua19idWZmZXJsaXN0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3VkcHNpbmtfY2xpZW50X2FkZF9yZW1vdmUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdWRwc2lua19kc2NwKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHVkcHNpbmspCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy91ZHBzcmMuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3VkcHNyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OWU4MjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy91ZHBzcmMuYwpAQCAtMCwwICsxLDI2MyBAQAorLyogR1N0cmVhbWVyIFVEUCBzb3VyY2UgdW5pdCB0ZXN0cworICogQ29weXJpZ2h0IChDKSAyMDExIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnaW8vZ2lvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKKworc3RhdGljIGdib29sZWFuCit1ZHBzcmNfc2V0dXAgKEdzdEVsZW1lbnQgKiogdWRwc3JjLCBHU29ja2V0ICoqIHNvY2tldCwKKyAgICBHc3RQYWQgKiogc2lua3BhZCwgR1NvY2tldEFkZHJlc3MgKiogc2EpCit7CisgIEdJbmV0QWRkcmVzcyAqaWE7CisgIGludCBwb3J0ID0gMDsKKyAgZ2NoYXIgKnM7CisKKyAgKnVkcHNyYyA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgidWRwc3JjIik7CisgIGZhaWxfdW5sZXNzICgqdWRwc3JjICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKCp1ZHBzcmMsICJwb3J0IiwgMCwgTlVMTCk7CisKKyAgKnNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWRfYnlfbmFtZSAoKnVkcHNyYywgJnNpbmt0ZW1wbGF0ZSwgInNyYyIpOworICBmYWlsX3VubGVzcyAoKnNpbmtwYWQgIT0gTlVMTCk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoKnNpbmtwYWQsIFRSVUUpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoKnVkcHNyYywgR1NUX1NUQVRFX1BMQVlJTkcpOworICBnX29iamVjdF9nZXQgKCp1ZHBzcmMsICJwb3J0IiwgJnBvcnQsIE5VTEwpOworICBHU1RfSU5GTyAoInVkcHNyYyBwb3J0ID0gJWQiLCBwb3J0KTsKKworICAqc29ja2V0ID0gZ19zb2NrZXRfbmV3IChHX1NPQ0tFVF9GQU1JTFlfSVBWNCwgR19TT0NLRVRfVFlQRV9EQVRBR1JBTSwKKyAgICAgIEdfU09DS0VUX1BST1RPQ09MX1VEUCwgTlVMTCk7CisKKyAgaWYgKCpzb2NrZXQgPT0gTlVMTCkgeworICAgIEdTVF9XQVJOSU5HICgiQ291bGQgbm90IGNyZWF0ZSBJUHY0IFVEUCBzb2NrZXQgZm9yIHVuaXQgdGVzdCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlhID0gZ19pbmV0X2FkZHJlc3NfbmV3X2xvb3BiYWNrIChHX1NPQ0tFVF9GQU1JTFlfSVBWNCk7CisgIHMgPSBnX2luZXRfYWRkcmVzc190b19zdHJpbmcgKGlhKTsKKyAgR1NUX0xPRyAoImluZXQgYWRkcmVzcyAlcyIsIHMpOworICBnX2ZyZWUgKHMpOworICAqc2EgPSBnX2luZXRfc29ja2V0X2FkZHJlc3NfbmV3IChpYSwgcG9ydCk7CisgIGdfb2JqZWN0X3VucmVmIChpYSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3VkcHNyY19lbXB0eV9wYWNrZXQpCit7CisgIEdTb2NrZXRBZGRyZXNzICpzYSA9IE5VTEw7CisgIEdzdEVsZW1lbnQgKnVkcHNyYyA9IE5VTEw7CisgIEdTb2NrZXQgKnNvY2tldCA9IE5VTEw7CisgIEdzdFBhZCAqc2lua3BhZCA9IE5VTEw7CisKKyAgaWYgKCF1ZHBzcmNfc2V0dXAgKCZ1ZHBzcmMsICZzb2NrZXQsICZzaW5rcGFkLCAmc2EpKQorICAgIGdvdG8gbm9fc29ja2V0OworCisgIGlmIChnX3NvY2tldF9zZW5kX3RvIChzb2NrZXQsIHNhLCAiSGVMTDAiLCAwLCBOVUxMLCBOVUxMKSA9PSAwKSB7CisgICAgR1NUX0lORk8gKCJzZW50IDAgYnl0ZXMiKTsKKyAgICBpZiAoZ19zb2NrZXRfc2VuZF90byAoc29ja2V0LCBzYSwgIkhlTEwwIiwgNiwgTlVMTCwgTlVMTCkgPT0gNikgeworICAgICAgR3N0TWFwSW5mbyBtYXA7CisgICAgICBHc3RCdWZmZXIgKmJ1ZjsKKyAgICAgIGd1aW50IGxlbiA9IDA7CisKKyAgICAgIEdTVF9JTkZPICgic2VudCA2IGJ5dGVzIik7CisKKyAgICAgIGdfbXV0ZXhfbG9jayAoJmNoZWNrX211dGV4KTsKKyAgICAgIGxlbiA9IGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpOworICAgICAgd2hpbGUgKGxlbiA8IDEpIHsKKyAgICAgICAgZ19jb25kX3dhaXQgKCZjaGVja19jb25kLCAmY2hlY2tfbXV0ZXgpOworICAgICAgICBsZW4gPSBnX2xpc3RfbGVuZ3RoIChidWZmZXJzKTsKKyAgICAgICAgR1NUX0lORk8gKCIldSBidWZmZXJzIiwgbGVuKTsKKyAgICAgIH0KKworICAgICAgLyogd2FpdCBhIGJpdCBtb3JlIGZvciBhIHNlY29uZCBidWZmZXIgKi8KKyAgICAgIGlmIChsZW4gPCAyKSB7CisgICAgICAgIGdfY29uZF93YWl0X3VudGlsICgmY2hlY2tfY29uZCwgJmNoZWNrX211dGV4LAorICAgICAgICAgICAgZ19nZXRfbW9ub3RvbmljX3RpbWUgKCkgKyBHX1RJTUVfU1BBTl9TRUNPTkQgLyAxMDApOworCisgICAgICAgIGxlbiA9IGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpOworICAgICAgICBHU1RfSU5GTyAoIiV1IGJ1ZmZlcnMiLCBsZW4pOworICAgICAgfQorCisgICAgICBmYWlsX3VubGVzcyAobGVuID09IDEgfHwgbGVuID09IDIpOworCisgICAgICAvKiBsYXN0IGJ1ZmZlciBzaG91bGQgYmUgb3VyIEhlTEwwIHN0cmluZyAqLworICAgICAgYnVmID0gR1NUX0JVRkZFUiAoZ19saXN0X250aF9kYXRhIChidWZmZXJzLCBsZW4gLSAxKSk7CisgICAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobWFwLnNpemUsIDYpOworICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoKGdjaGFyICopIG1hcC5kYXRhLCAiSGVMTDAiKTsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgICAgIC8qIGlmIHRoZXJlJ3MgYW5vdGhlciBidWZmZXIsIGl0IHNob3VsZCBiZSAwIGJ5dGVzICovCisgICAgICBpZiAobGVuID09IDIpIHsKKyAgICAgICAgYnVmID0gR1NUX0JVRkZFUiAoZ19saXN0X250aF9kYXRhIChidWZmZXJzLCAwKSk7CisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZiksIDApOworICAgICAgfQorICAgICAgZ19tdXRleF91bmxvY2sgKCZjaGVja19tdXRleCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9XQVJOSU5HICgic2VuZF90byg2IGJ5dGVzKSBmYWlsZWQiKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkcgKCJzZW5kX3RvKDAgYnl0ZXMpIGZhaWxlZCIpOworICB9CisKK25vX3NvY2tldDoKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHVkcHNyYywgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9jaGVja19kcm9wX2J1ZmZlcnMgKCk7CisgIGdzdF9jaGVja190ZWFyZG93bl9wYWRfYnlfbmFtZSAodWRwc3JjLCAic3JjIik7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50ICh1ZHBzcmMpOworCisgIGdfb2JqZWN0X3VucmVmIChzb2NrZXQpOworICBnX29iamVjdF91bnJlZiAoc2EpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3VkcHNyYykKK3sKKyAgR1NvY2tldEFkZHJlc3MgKnNhID0gTlVMTDsKKyAgR3N0RWxlbWVudCAqdWRwc3JjID0gTlVMTDsKKyAgR1NvY2tldCAqc29ja2V0ID0gTlVMTDsKKyAgR3N0UGFkICpzaW5rcGFkID0gTlVMTDsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdE1lbW9yeSAqbWVtOworICBnY2hhciBkYXRhWzQ4MDAwXTsKKyAgZ3NpemUgbWF4X3NpemU7CisgIGludCBpLCBsZW4gPSAwOworICBnc3NpemUgc2VudDsKKyAgR0Vycm9yICplcnIgPSBOVUxMOworCisgIGZvciAoaSA9IDA7IGkgPCBHX05fRUxFTUVOVFMgKGRhdGEpOyArK2kpCisgICAgZGF0YVtpXSA9IGkgJiAweGZmOworCisgIGlmICghdWRwc3JjX3NldHVwICgmdWRwc3JjLCAmc29ja2V0LCAmc2lua3BhZCwgJnNhKSkKKyAgICBnb3RvIG5vX3NvY2tldDsKKworICBpZiAoKHNlbnQgPSBnX3NvY2tldF9zZW5kX3RvIChzb2NrZXQsIHNhLCBkYXRhLCA0ODAwMCwgTlVMTCwgJmVycikpID09IC0xKQorICAgIGdvdG8gc2VuZF9mYWlsdXJlOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChzZW50LCA0ODAwMCk7CisKKyAgaWYgKChzZW50ID0gZ19zb2NrZXRfc2VuZF90byAoc29ja2V0LCBzYSwgZGF0YSwgMjEwMDAsIE5VTEwsICZlcnIpKSA9PSAtMSkKKyAgICBnb3RvIHNlbmRfZmFpbHVyZTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoc2VudCwgMjEwMDApOworCisgIGlmICgoc2VudCA9IGdfc29ja2V0X3NlbmRfdG8gKHNvY2tldCwgc2EsIGRhdGEsIDUwMCwgTlVMTCwgJmVycikpID09IC0xKQorICAgIGdvdG8gc2VuZF9mYWlsdXJlOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChzZW50LCA1MDApOworCisgIGlmICgoc2VudCA9IGdfc29ja2V0X3NlbmRfdG8gKHNvY2tldCwgc2EsIGRhdGEsIDE2MDAsIE5VTEwsICZlcnIpKSA9PSAtMSkKKyAgICBnb3RvIHNlbmRfZmFpbHVyZTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoc2VudCwgMTYwMCk7CisKKyAgaWYgKChzZW50ID0gZ19zb2NrZXRfc2VuZF90byAoc29ja2V0LCBzYSwgZGF0YSwgMTQwMCwgTlVMTCwgJmVycikpID09IC0xKQorICAgIGdvdG8gc2VuZF9mYWlsdXJlOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChzZW50LCAxNDAwKTsKKworICBHU1RfSU5GTyAoInNlbnQgc29tZSBwYWNrZXRzIik7CisKKyAgZ19tdXRleF9sb2NrICgmY2hlY2tfbXV0ZXgpOworICBsZW4gPSBnX2xpc3RfbGVuZ3RoIChidWZmZXJzKTsKKyAgd2hpbGUgKGxlbiA8IDUpIHsKKyAgICBnX2NvbmRfd2FpdCAoJmNoZWNrX2NvbmQsICZjaGVja19tdXRleCk7CisgICAgbGVuID0gZ19saXN0X2xlbmd0aCAoYnVmZmVycyk7CisgICAgR1NUX0lORk8gKCIldSBidWZmZXJzIiwgbGVuKTsKKyAgfQorCisgIC8qIGNoZWNrIHRoYXQgbGFyZ2UgcGFja2V0cyBhcmUgbWFkZSB1cCBvZiBtdWx0aXBsZSBtZW1vcnkgY2h1bmtzIGFuZCB0aGF0CisgICAqIHRoZSBmaXJzdCBvbmUgaXMgZmFpcmx5IHNtYWxsICovCisgIGJ1ZiA9IEdTVF9CVUZGRVIgKGdfbGlzdF9udGhfZGF0YSAoYnVmZmVycywgMCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfYnVmZmVyX2dldF9zaXplIChidWYpLCA0ODAwMCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9idWZmZXJfbl9tZW1vcnkgKGJ1ZiksIDIpOworICBtZW0gPSBnc3RfYnVmZmVyX3BlZWtfbWVtb3J5IChidWYsIDApOworICBnc3RfbWVtb3J5X2dldF9zaXplcyAobWVtLCBOVUxMLCAmbWF4X3NpemUpOworICBmYWlsX3VubGVzcyAobWF4X3NpemUgPD0gMjAwMCk7CisKKyAgYnVmID0gR1NUX0JVRkZFUiAoZ19saXN0X250aF9kYXRhIChidWZmZXJzLCAxKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZiksIDIxMDAwKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2J1ZmZlcl9uX21lbW9yeSAoYnVmKSwgMik7CisgIG1lbSA9IGdzdF9idWZmZXJfcGVla19tZW1vcnkgKGJ1ZiwgMCk7CisgIGdzdF9tZW1vcnlfZ2V0X3NpemVzIChtZW0sIE5VTEwsICZtYXhfc2l6ZSk7CisgIGZhaWxfdW5sZXNzIChtYXhfc2l6ZSA8PSAyMDAwKTsKKworICBidWYgPSBHU1RfQlVGRkVSIChnX2xpc3RfbnRoX2RhdGEgKGJ1ZmZlcnMsIDIpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSwgNTAwKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2J1ZmZlcl9uX21lbW9yeSAoYnVmKSwgMSk7CisgIG1lbSA9IGdzdF9idWZmZXJfcGVla19tZW1vcnkgKGJ1ZiwgMCk7CisgIGdzdF9tZW1vcnlfZ2V0X3NpemVzIChtZW0sIE5VTEwsICZtYXhfc2l6ZSk7CisgIGZhaWxfdW5sZXNzIChtYXhfc2l6ZSA8PSAyMDAwKTsKKworICBidWYgPSBHU1RfQlVGRkVSIChnX2xpc3RfbnRoX2RhdGEgKGJ1ZmZlcnMsIDMpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSwgMTYwMCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9idWZmZXJfbl9tZW1vcnkgKGJ1ZiksIDIpOworICBtZW0gPSBnc3RfYnVmZmVyX3BlZWtfbWVtb3J5IChidWYsIDApOworICBnc3RfbWVtb3J5X2dldF9zaXplcyAobWVtLCBOVUxMLCAmbWF4X3NpemUpOworICBmYWlsX3VubGVzcyAobWF4X3NpemUgPD0gMjAwMCk7CisKKyAgYnVmID0gR1NUX0JVRkZFUiAoZ19saXN0X250aF9kYXRhIChidWZmZXJzLCA0KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZiksIDE0MDApOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfYnVmZmVyX25fbWVtb3J5IChidWYpLCAxKTsKKyAgbWVtID0gZ3N0X2J1ZmZlcl9wZWVrX21lbW9yeSAoYnVmLCAwKTsKKyAgZ3N0X21lbW9yeV9nZXRfc2l6ZXMgKG1lbSwgTlVMTCwgJm1heF9zaXplKTsKKyAgZmFpbF91bmxlc3MgKG1heF9zaXplIDw9IDIwMDApOworCisgIGdfbGlzdF9mb3JlYWNoIChidWZmZXJzLCAoR0Z1bmMpIGdzdF9idWZmZXJfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGdfbXV0ZXhfdW5sb2NrICgmY2hlY2tfbXV0ZXgpOworCitub19zb2NrZXQ6CitzZW5kX2ZhaWx1cmU6CisgIGlmIChlcnIpIHsKKyAgICBHU1RfV0FSTklORyAoIlNvY2tldCBzZW5kIGVycm9yLCBza2lwcGluZyB0ZXN0OiAlcyIsIGVyci0+bWVzc2FnZSk7CisgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgIH0KKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHVkcHNyYywgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9jaGVja19kcm9wX2J1ZmZlcnMgKCk7CisgIGdzdF9jaGVja190ZWFyZG93bl9wYWRfYnlfbmFtZSAodWRwc3JjLCAic3JjIik7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50ICh1ZHBzcmMpOworCisgIGdfb2JqZWN0X3VucmVmIChzb2NrZXQpOworICBnX29iamVjdF91bnJlZiAoc2EpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCit1ZHBzcmNfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgidWRwc3JjIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoInVkcHNyYyIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdWRwc3JjX2VtcHR5X3BhY2tldCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF91ZHBzcmMpOworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHVkcHNyYykKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvYm94LmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2JveC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMjY1MzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2JveC5jCkBAIC0wLDAgKzEsMjI0IEBACisvKiBHU3RyZWFtZXIKKyAqIHVuaXQgdGVzdCBmb3IgdGhlIHZpZGVvYm94IGVsZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmF2aSBLaXJhbiBLIE4gPHJhdmkua2lyYW5Ac2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWaWRlb0JveFRlc3RDb250ZXh0Cit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RFbGVtZW50ICpzcmM7CisgIEdzdEVsZW1lbnQgKmZpbHRlcjsKKyAgR3N0RWxlbWVudCAqYm94OworICBHc3RFbGVtZW50ICpmaWx0ZXIyOworICBHc3RFbGVtZW50ICpzaW5rOworfSBHc3RWaWRlb0JveFRlc3RDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBfRm9ybWF0Q29udmVyc2lvbgoreworICBjb25zdCBnY2hhciAqaW5fY2FwczsKKyAgY29uc3QgZ2NoYXIgKm91dF9jYXBzOworICBnYm9vbGVhbiBleHBlY3RlZF9yZXN1bHQ7Cit9IEZvcm1hdENvbnZlcnNpb247CisKKworLyoKKyAqIFVwZGF0ZSB0aGlzIHRhYmxlIGFzIGFuZCB3aGVuIHRoZSBjb252ZXJzaW9uIGlzIHN1cHBvcnRlZChvciB1bnN1cHBvcnRlZCkgaW4gdmlkZW9ib3gKKyAqLworc3RhdGljIGNvbnN0IEZvcm1hdENvbnZlcnNpb24gY29udmVyc2lvbl90YWJsZVtdID0geworICB7InZpZGVvL3gtcmF3LGZvcm1hdD17UkdCQX0iLCAidmlkZW8veC1yYXcsZm9ybWF0PXtBWVVWfSIsIFRSVUV9LAorICB7InZpZGVvL3gtcmF3LGZvcm1hdD17QVlVVn0iLCAidmlkZW8veC1yYXcsZm9ybWF0PXtSR0JBfSIsIFRSVUV9LAorICB7InZpZGVvL3gtcmF3LGZvcm1hdD17STQyMH0iLCAidmlkZW8veC1yYXcsZm9ybWF0PXtBWVVWfSIsIFRSVUV9LAorICB7InZpZGVvL3gtcmF3LGZvcm1hdD17QVlVVn0iLCAidmlkZW8veC1yYXcsZm9ybWF0PXtJNDIwfSIsIFRSVUV9LAorICB7InZpZGVvL3gtcmF3LGZvcm1hdD17STQyMH0iLCAidmlkZW8veC1yYXcsZm9ybWF0PXtZVjEyfSIsIFRSVUV9LAorICB7InZpZGVvL3gtcmF3LGZvcm1hdD17WVYxMn0iLCAidmlkZW8veC1yYXcsZm9ybWF0PXtBWVVWfSIsIFRSVUV9LAorICB7InZpZGVvL3gtcmF3LGZvcm1hdD17WVYxMn0iLCAidmlkZW8veC1yYXcsZm9ybWF0PXtJNDIwfSIsIFRSVUV9LAorICB7InZpZGVvL3gtcmF3LGZvcm1hdD17QVlVVn0iLCAidmlkZW8veC1yYXcsZm9ybWF0PXtZVjEyfSIsIFRSVUV9LAorICB7InZpZGVvL3gtcmF3LGZvcm1hdD17QVlVVn0iLCAidmlkZW8veC1yYXcsZm9ybWF0PXt4UkdCfSIsIFRSVUV9LAorICB7InZpZGVvL3gtcmF3LGZvcm1hdD17eFJHQn0iLCAidmlkZW8veC1yYXcsZm9ybWF0PXt4UkdCfSIsIFRSVUV9LAorICB7InZpZGVvL3gtcmF3LGZvcm1hdD17eFJHQn0iLCAidmlkZW8veC1yYXcsZm9ybWF0PXtBWVVWfSIsIFRSVUV9LAorICB7InZpZGVvL3gtcmF3LGZvcm1hdD17R1JBWTh9IiwgInZpZGVvL3gtcmF3LGZvcm1hdD17R1JBWTE2X0xFfSIsIEZBTFNFfSwKKyAgeyJ2aWRlby94LXJhdyxmb3JtYXQ9e0dSQVk4fSIsICJ2aWRlby94LXJhdyxmb3JtYXQ9e0dSQVkxNl9CRX0iLCBGQUxTRX0sCisgIHsidmlkZW8veC1yYXcsZm9ybWF0PXtZNDQ0fSIsICJ2aWRlby94LXJhdyxmb3JtYXQ9e1k0MkJ9IiwgRkFMU0V9LAorICB7InZpZGVvL3gtcmF3LGZvcm1hdD17WTQ0NH0iLCAidmlkZW8veC1yYXcsZm9ybWF0PXtZNDFCfSIsIEZBTFNFfSwKKyAgeyJ2aWRlby94LXJhdyxmb3JtYXQ9e1k0MkJ9IiwgInZpZGVvL3gtcmF3LGZvcm1hdD17WTQxQn0iLCBGQUxTRX0KK307CisKKworc3RhdGljIGdib29sZWFuCitidXNfaGFuZGxlciAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR01haW5Mb29wICpsb29wID0gKEdNYWluTG9vcCAqKSBkYXRhOworCisgIHN3aXRjaCAobWVzc2FnZS0+dHlwZSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfRU9TOnsKKyAgICAgIEdTVF9MT0cgKCJFT1MgZXZlbnQgcmVjZWl2ZWQiKTsKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX01FU1NBR0VfRVJST1I6eworICAgICAgR0Vycm9yICpnZXJyb3I7CisgICAgICBnY2hhciAqZGVidWc7CisgICAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobWVzc2FnZSwgJmdlcnJvciwgJmRlYnVnKTsKKyAgICAgIGdfZXJyb3IgKCJFcnJvciBmcm9tICVzOiAlcyAoJXMpXG4iLAorICAgICAgICAgIEdTVF9FTEVNRU5UX05BTUUgKEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSkpLCBnZXJyb3ItPm1lc3NhZ2UsCisgICAgICAgICAgR1NUX1NUUl9OVUxMIChkZWJ1ZykpOworICAgICAgZ19lcnJvcl9mcmVlIChnZXJyb3IpOworICAgICAgZ19mcmVlIChkZWJ1Zyk7CisgICAgICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9NRVNTQUdFX1dBUk5JTkc6eworICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCit2aWRlb2JveF90ZXN0X2luaXRfY29udGV4dCAoR3N0VmlkZW9Cb3hUZXN0Q29udGV4dCAqIGN0eCkKK3sKKyAgZmFpbF91bmxlc3MgKGN0eCAhPSBOVUxMKTsKKworICBjdHgtPnBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIGZhaWxfdW5sZXNzIChjdHgtPnBpcGVsaW5lICE9IE5VTEwpOworICBjdHgtPnNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKGN0eC0+c3JjICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIHZpZGVvdGVzdHNyYyBlbGVtZW50Iik7CisgIGN0eC0+ZmlsdGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiY2Fwc2ZpbHRlciIsICJmaWx0ZXIiKTsKKyAgZmFpbF91bmxlc3MgKGN0eC0+ZmlsdGVyICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIGNhcHNmaWx0ZXIgZWxlbWVudCIpOworICBjdHgtPmJveCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvYm94IiwgImJveCIpOworICBmYWlsX3VubGVzcyAoY3R4LT5ib3ggIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgdmlkZW9ib3ggZWxlbWVudCIpOworICBjdHgtPmZpbHRlcjIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJjYXBzZmlsdGVyIiwgImZpbHRlcjIiKTsKKyAgZmFpbF91bmxlc3MgKGN0eC0+ZmlsdGVyMiAhPSBOVUxMLAorICAgICAgIkZhaWxlZCB0byBjcmVhdGUgc2Vjb25kIGNhcHNmaWx0ZXIgZWxlbWVudCIpOworICBjdHgtPnNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsICJzaW5rIik7CisgIGZhaWxfdW5sZXNzIChjdHgtPnNpbmsgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgZmFrZXNpbmsgZWxlbWVudCIpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKGN0eC0+cGlwZWxpbmUpLCBjdHgtPnNyYywgY3R4LT5maWx0ZXIsCisgICAgICBjdHgtPmJveCwgY3R4LT5maWx0ZXIyLCBjdHgtPnNpbmssIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGlua19tYW55IChjdHgtPnNyYywgY3R4LT5maWx0ZXIsIGN0eC0+Ym94LAorICAgICAgICAgIGN0eC0+ZmlsdGVyMiwgY3R4LT5zaW5rLCBOVUxMKSA9PSBUUlVFLCAiQ2FuIG5vdCBsaW5rIGVsZW1lbnRzIik7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoY3R4LT5waXBlbGluZSwKKyAgICAgICAgICBHU1RfU1RBVEVfUkVBRFkpICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSwKKyAgICAgICJjb3VsZG4ndCBzZXQgcGlwZWxpbmUgdG8gUkVBRFkgc3RhdGUiKTsKKworICBHU1RfTE9HICgidmlkZW9ib3ggY29udGV4dCBpbml0ZWQiKTsKK30KKworc3RhdGljIHZvaWQKK3ZpZGVvYm94X3Rlc3RfZGVpbml0X2NvbnRleHQgKEdzdFZpZGVvQm94VGVzdENvbnRleHQgKiBjdHgpCit7CisgIEdTVF9MT0cgKCJkZWluaXRpbmcgdmlkZW9ib3ggY29udGV4dCIpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoY3R4LT5waXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChjdHgtPnBpcGVsaW5lKTsKKyAgbWVtc2V0IChjdHgsIDB4MDAsIHNpemVvZiAoR3N0VmlkZW9Cb3hUZXN0Q29udGV4dCkpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9jYXBzX3RyYW5zZm9ybSkKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3RhdGVfcmV0OworICBHc3RWaWRlb0JveFRlc3RDb250ZXh0IGN0eDsKKyAgZ3VpbnQgY29udmVyc2lvbnNfdGVzdF9zaXplOworICBndWludCBpdHI7CisgIGdib29sZWFuIGxpbmtfcmVzOworICBHTWFpbkxvb3AgKmxvb3A7CisgIEdzdEJ1cyAqYnVzOworCisgIHZpZGVvYm94X3Rlc3RfaW5pdF9jb250ZXh0ICgmY3R4KTsKKyAgZ3N0X3V0aWxfc2V0X29iamVjdF9hcmcgKEdfT0JKRUNUIChjdHguc3JjKSwgIm51bS1idWZmZXJzIiwgIjEiKTsKKworICBsb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBUUlVFKTsKKyAgZmFpbF91bmxlc3MgKGxvb3AgIT0gTlVMTCk7CisKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAoY3R4LnBpcGVsaW5lKTsKKyAgZmFpbF91bmxlc3MgKGJ1cyAhPSBOVUxMKTsKKworICBnc3RfYnVzX2FkZF93YXRjaCAoYnVzLCBidXNfaGFuZGxlciwgbG9vcCk7CisKKyAgY29udmVyc2lvbnNfdGVzdF9zaXplID0gR19OX0VMRU1FTlRTIChjb252ZXJzaW9uX3RhYmxlKTsKKyAgZm9yIChpdHIgPSAwOyBpdHIgPCBjb252ZXJzaW9uc190ZXN0X3NpemU7IGl0cisrKSB7CisgICAgZ3N0X2VsZW1lbnRfdW5saW5rX21hbnkgKGN0eC5zcmMsIGN0eC5maWx0ZXIsIGN0eC5ib3gsIGN0eC5maWx0ZXIyLAorICAgICAgICBjdHguc2luaywgTlVMTCk7CisgICAgZ3N0X3V0aWxfc2V0X29iamVjdF9hcmcgKEdfT0JKRUNUIChjdHguZmlsdGVyKSwgImNhcHMiLAorICAgICAgICBjb252ZXJzaW9uX3RhYmxlW2l0cl0uaW5fY2Fwcyk7CisgICAgZ3N0X3V0aWxfc2V0X29iamVjdF9hcmcgKEdfT0JKRUNUIChjdHguZmlsdGVyMiksICJjYXBzIiwKKyAgICAgICAgY29udmVyc2lvbl90YWJsZVtpdHJdLm91dF9jYXBzKTsKKworICAgIC8qIExpbmsgd2l0aCBuZXcgaW5wdXQgYW5kIG91dHB1dCBmb3JtYXQgZnJvbSBjb252ZXJzaW9uIHRhYmxlICovCisgICAgbGlua19yZXMgPQorICAgICAgICBnc3RfZWxlbWVudF9saW5rX21hbnkgKGN0eC5zcmMsIGN0eC5maWx0ZXIsIGN0eC5ib3gsIGN0eC5maWx0ZXIyLAorICAgICAgICBjdHguc2luaywgTlVMTCk7CisKKyAgICAvKiBDaGVjayBpZiB0aGUgc3BlY2lmaWVkIGZvcm1hdCBjb252ZXJzaW9uIGlzIHN1cHBvcnRlZCBvciBub3QgYnkgdmlkZW9ib3ggKi8KKyAgICBmYWlsX3VubGVzcyAobGlua19yZXMgPT0gY29udmVyc2lvbl90YWJsZVtpdHJdLmV4cGVjdGVkX3Jlc3VsdCwKKyAgICAgICAgInZpZGVvYm94IGNhbiBub3QgY29udmVydCBmcm9tICclcycnIHRvICclcyciLAorICAgICAgICBjb252ZXJzaW9uX3RhYmxlW2l0cl0uaW5fY2FwcywgY29udmVyc2lvbl90YWJsZVtpdHJdLm91dF9jYXBzKTsKKworICAgIGlmIChsaW5rX3JlcyA9PSBGQUxTRSkgeworICAgICAgR1NUX0xPRyAoImVsZW1lbnRzIGxpbmtpbmcgZmFpbGVkIik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBzdGF0ZV9yZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGN0eC5waXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworICAgIGZhaWxfdW5sZXNzIChzdGF0ZV9yZXQgIT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFLAorICAgICAgICAiY291bGRuJ3Qgc2V0IHBpcGVsaW5lIHRvIFBMQVlJTkcgc3RhdGUiKTsKKworICAgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgICBzdGF0ZV9yZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGN0eC5waXBlbGluZSwgR1NUX1NUQVRFX1JFQURZKTsKKyAgICBmYWlsX3VubGVzcyAoc3RhdGVfcmV0ICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSwKKyAgICAgICAgImNvdWxkbid0IHNldCBwaXBlbGluZSB0byBSRUFEWSBzdGF0ZSIpOworICB9CisKKyAgZ3N0X2J1c19yZW1vdmVfd2F0Y2ggKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdfbWFpbl9sb29wX3VucmVmIChsb29wKTsKKworICB2aWRlb2JveF90ZXN0X2RlaW5pdF9jb250ZXh0ICgmY3R4KTsKK30KKworR1NUX0VORF9URVNUOworCisKK3N0YXRpYyBTdWl0ZSAqCit2aWRlb2JveF9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJ2aWRlb2JveCIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9jYXBzX3RyYW5zZm9ybSk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOICh2aWRlb2JveCk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2Nyb3AuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNzZlNWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2Nyb3AuYwpAQCAtMCwwICsxLDgxOSBAQAorLyogR1N0cmVhbWVyIHVuaXQgdGVzdCBmb3IgdGhlIHZpZGVvY3JvcCBlbGVtZW50CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9WQUxHUklORAorIyBpbmNsdWRlIDx2YWxncmluZC92YWxncmluZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKworLyogcmV0dXJuIGEgbGlzdCBvZiBjYXBzIHdoZXJlIHdlIG9ubHkgbmVlZCB0byBzZXQKKyAqIHdpZHRoIGFuZCBoZWlnaHQgdG8gZ2V0IGZpeGVkIGNhcHMgKi8KK3N0YXRpYyBHTGlzdCAqCit2aWRlb19jcm9wX2dldF90ZXN0X2NhcHMgKEdzdEVsZW1lbnQgKiB2aWRlb2Nyb3ApCit7CisgIEdzdENhcHMgKnRlbXBsLCAqYWxsb3dlZF9jYXBzOworICBHc3RQYWQgKnNyY3BhZDsKKyAgR0xpc3QgKmxpc3QgPSBOVUxMOworICBndWludCBpOworCisgIHNyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkICh2aWRlb2Nyb3AsICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKHNyY3BhZCAhPSBOVUxMKTsKKyAgdGVtcGwgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoc3JjcGFkKTsKKyAgZmFpbF91bmxlc3MgKHRlbXBsICE9IE5VTEwpOworCisgIGFsbG93ZWRfY2FwcyA9IGdzdF9jYXBzX25vcm1hbGl6ZSAodGVtcGwpOworCisgIGZvciAoaSA9IDA7IGkgPCBnc3RfY2Fwc19nZXRfc2l6ZSAoYWxsb3dlZF9jYXBzKTsgKytpKSB7CisgICAgR3N0U3RydWN0dXJlICpuZXdfc3RydWN0dXJlOworICAgIEdzdENhcHMgKnNpbmdsZV9jYXBzOworCisgICAgc2luZ2xlX2NhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHkgKCk7CisgICAgbmV3X3N0cnVjdHVyZSA9CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfY29weSAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoYWxsb3dlZF9jYXBzLCBpKSk7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG5ld19zdHJ1Y3R1cmUsICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTiwKKyAgICAgICAgMSwgMSwgTlVMTCk7CisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKG5ld19zdHJ1Y3R1cmUsICJ3aWR0aCIpOworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChuZXdfc3RydWN0dXJlLCAiaGVpZ2h0Iik7CisgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoc2luZ2xlX2NhcHMsIG5ld19zdHJ1Y3R1cmUpOworCisgICAgR1NUX0RFQlVHICgiaGF2ZSBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBzaW5nbGVfY2Fwcyk7CisgICAgLyogc2hvdWxkIGJlIGZpeGVkIHdpdGhvdXQgd2lkdGgvaGVpZ2h0ICovCisgICAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2lzX2ZpeGVkIChzaW5nbGVfY2FwcykpOworCisgICAgbGlzdCA9IGdfbGlzdF9wcmVwZW5kIChsaXN0LCBzaW5nbGVfY2Fwcyk7CisgIH0KKworICBnc3RfY2Fwc191bnJlZiAoYWxsb3dlZF9jYXBzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKworICByZXR1cm4gbGlzdDsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdW5pdF9zaXplcykKK3sKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzICpjc3Bfa2xhc3MsICp2Y3JvcF9rbGFzczsKKyAgR3N0RWxlbWVudCAqdmlkZW9jcm9wLCAqY3NwOworICBHTGlzdCAqY2Fwc19saXN0LCAqbDsKKworICB2aWRlb2Nyb3AgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb2Nyb3AiLCAidmlkZW9jcm9wIik7CisgIGZhaWxfdW5sZXNzICh2aWRlb2Nyb3AgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgdmlkZW9jcm9wIGVsZW1lbnQiKTsKKyAgdmNyb3Bfa2xhc3MgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fR0VUX0NMQVNTICh2aWRlb2Nyb3ApOworCisgIGNzcCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvY29udmVydCIsICJjc3AiKTsKKyAgZmFpbF91bmxlc3MgKGNzcCAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSB2aWRlb2NvbnZlcnQgZWxlbWVudCIpOworICBjc3Bfa2xhc3MgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fR0VUX0NMQVNTIChjc3ApOworCisgIGNhcHNfbGlzdCA9IHZpZGVvX2Nyb3BfZ2V0X3Rlc3RfY2FwcyAodmlkZW9jcm9wKTsKKworICBmb3IgKGwgPSBjYXBzX2xpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpIHsKKyAgICBjb25zdCBzdHJ1Y3QKKyAgICB7CisgICAgICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgfSBzaXplc190b190cnlbXSA9IHsKKyAgICAgIHsKKyAgICAgIDE2MCwgMTIwfSwgeworICAgICAgMTYxLCAxMjB9LCB7CisgICAgICAxNjAsIDEyMX0sIHsKKyAgICAgIDE2MSwgMTIxfSwgeworICAgICAgMTU5LCAxMjB9LCB7CisgICAgICAxNjAsIDExOX0sIHsKKyAgICAgIDE1OSwgMTE5fSwgeworICAgICAgMTU5LCAxMjF9CisgICAgfTsKKyAgICBHc3RTdHJ1Y3R1cmUgKnM7CisgICAgR3N0Q2FwcyAqY2FwczsKKyAgICBnaW50IGk7CisKKyAgICBjYXBzID0gZ3N0X2NhcHNfY29weSAoR1NUX0NBUFMgKGwtPmRhdGEpKTsKKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgICAgZmFpbF91bmxlc3MgKHMgIT0gTlVMTCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTIChzaXplc190b190cnkpOyArK2kpIHsKKyAgICAgIGdjaGFyICpjYXBzX3N0cjsKKyAgICAgIGdzaXplIGNzcF9zaXplID0gMDsKKyAgICAgIGdzaXplIHZjX3NpemUgPSAwOworCisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgIndpZHRoIiwgR19UWVBFX0lOVCwgc2l6ZXNfdG9fdHJ5W2ldLndpZHRoLAorICAgICAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBzaXplc190b190cnlbaV0uaGVpZ2h0LCBOVUxMKTsKKworICAgICAgY2Fwc19zdHIgPSBnc3RfY2Fwc190b19zdHJpbmcgKGNhcHMpOworICAgICAgR1NUX0lORk8gKCJUZXN0aW5nIHVuaXQgc2l6ZSBmb3IgJXMiLCBjYXBzX3N0cik7CisKKyAgICAgIC8qIHNraXAgaWYgdmlkZW9jb252ZXJ0IGRvZXNuJ3Qgc3VwcG9ydCB0aGVzZSBjYXBzCisgICAgICAgKiAob25seSB3b3JrcyB3aXRoIGdzdC1wbHVnaW5zLWJhc2UgMC4xMC45LjEgb3IgbGF0ZXIpICovCisgICAgICBpZiAoIWNzcF9rbGFzcy0+Z2V0X3VuaXRfc2l6ZSAoKEdzdEJhc2VUcmFuc2Zvcm0gKikgY3NwLCBjYXBzLCAmY3NwX3NpemUpKSB7CisgICAgICAgIEdTVF9JTkZPICgidmlkZW9jb252ZXJ0IGRvZXMgbm90IHN1cHBvcnQgZm9ybWF0ICVzIiwgY2Fwc19zdHIpOworICAgICAgICBnX2ZyZWUgKGNhcHNfc3RyKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGZhaWxfdW5sZXNzICh2Y3JvcF9rbGFzcy0+Z2V0X3VuaXRfc2l6ZSAoKEdzdEJhc2VUcmFuc2Zvcm0gKikgdmlkZW9jcm9wLAorICAgICAgICAgICAgICBjYXBzLCAmdmNfc2l6ZSkpOworCisgICAgICBmYWlsX3VubGVzcyAodmNfc2l6ZSA9PSBjc3Bfc2l6ZSwKKyAgICAgICAgICAidmlkZW9jcm9wIGFuZCB2aWRlb2NvbnZlcnQgcmV0dXJuIGRpZmZlcmVudCB1bml0IHNpemVzIGZvciAiCisgICAgICAgICAgImNhcHMgJXM6IHZjX3NpemU9JWQsIGNzcF9zaXplPSVkIiwgY2Fwc19zdHIsIHZjX3NpemUsIGNzcF9zaXplKTsKKworICAgICAgZ19mcmVlIChjYXBzX3N0cik7CisgICAgfQorCisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICB9CisKKyAgZ19saXN0X2ZvcmVhY2ggKGNhcHNfbGlzdCwgKEdGdW5jKSBnc3RfY2Fwc191bnJlZiwgTlVMTCk7CisgIGdfbGlzdF9mcmVlIChjYXBzX2xpc3QpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKGNzcCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHZpZGVvY3JvcCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdEVsZW1lbnQgKnNyYzsKKyAgR3N0RWxlbWVudCAqZmlsdGVyOworICBHc3RFbGVtZW50ICpjcm9wOworICBHc3RFbGVtZW50ICpmaWx0ZXIyOworICBHc3RFbGVtZW50ICpzaW5rOworICBHc3RCdWZmZXIgKmxhc3RfYnVmOworICBHc3RDYXBzICpsYXN0X2NhcHM7Cit9IEdzdFZpZGVvQ3JvcFRlc3RDb250ZXh0OworCitzdGF0aWMgdm9pZAoraGFuZG9mZl9jYiAoR3N0RWxlbWVudCAqIHNpbmssIEdzdEJ1ZmZlciAqIGJ1ZiwgR3N0UGFkICogcGFkLAorICAgIEdzdFZpZGVvQ3JvcFRlc3RDb250ZXh0ICogY3R4KQoreworICBHc3RDYXBzICpjYXBzOworCisgIGdzdF9idWZmZXJfcmVwbGFjZSAoJmN0eC0+bGFzdF9idWYsIGJ1Zik7CisgIGNhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHBhZCk7CisgIGdzdF9jYXBzX3JlcGxhY2UgKCZjdHgtPmxhc3RfY2FwcywgY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKK30KKworc3RhdGljIHZvaWQKK3ZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nX2luaXRfY29udGV4dCAoR3N0VmlkZW9Dcm9wVGVzdENvbnRleHQgKiBjdHgpCit7CisgIGZhaWxfdW5sZXNzIChjdHggIT0gTlVMTCk7CisKKyAgY3R4LT5waXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBmYWlsX3VubGVzcyAoY3R4LT5waXBlbGluZSAhPSBOVUxMKTsKKyAgY3R4LT5zcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCAic3JjIik7CisgIGZhaWxfdW5sZXNzIChjdHgtPnNyYyAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSB2aWRlb3Rlc3RzcmMgZWxlbWVudCIpOworICBjdHgtPmZpbHRlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImNhcHNmaWx0ZXIiLCAiZmlsdGVyIik7CisgIGZhaWxfdW5sZXNzIChjdHgtPmZpbHRlciAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSBjYXBzZmlsdGVyIGVsZW1lbnQiKTsKKyAgY3R4LT5jcm9wID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW9jcm9wIiwgImNyb3AiKTsKKyAgZmFpbF91bmxlc3MgKGN0eC0+Y3JvcCAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSB2aWRlb2Nyb3AgZWxlbWVudCIpOworICBjdHgtPmZpbHRlcjIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJjYXBzZmlsdGVyIiwgImZpbHRlcjIiKTsKKyAgZmFpbF91bmxlc3MgKGN0eC0+ZmlsdGVyMiAhPSBOVUxMLAorICAgICAgIkZhaWxlZCB0byBjcmVhdGUgc2Vjb25kIGNhcHNmaWx0ZXIgZWxlbWVudCIpOworICBjdHgtPnNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsICJzaW5rIik7CisgIGZhaWxfdW5sZXNzIChjdHgtPnNpbmsgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgZmFrZXNpbmsgZWxlbWVudCIpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKGN0eC0+cGlwZWxpbmUpLCBjdHgtPnNyYywgY3R4LT5maWx0ZXIsCisgICAgICBjdHgtPmNyb3AsIGN0eC0+ZmlsdGVyMiwgY3R4LT5zaW5rLCBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19tYW55IChjdHgtPnNyYywgY3R4LT5maWx0ZXIsIGN0eC0+Y3JvcCwgY3R4LT5maWx0ZXIyLAorICAgICAgY3R4LT5zaW5rLCBOVUxMKTsKKworICAvKiBzZXQgcGF0dGVybiB0byAncmVkJyAtIGZvciBvdXIgcHVycG9zZXMgaXQgZG9lc24ndCBtYXR0ZXIgYW55d2F5ICovCisgIGdfb2JqZWN0X3NldCAoY3R4LT5zcmMsICJwYXR0ZXJuIiwgNCwgTlVMTCk7CisKKyAgZ19vYmplY3Rfc2V0IChjdHgtPnNpbmssICJzaWduYWwtaGFuZG9mZnMiLCBUUlVFLCBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoY3R4LT5zaW5rLCAicHJlcm9sbC1oYW5kb2ZmIiwgR19DQUxMQkFDSyAoaGFuZG9mZl9jYiksIGN0eCk7CisKKyAgY3R4LT5sYXN0X2J1ZiA9IE5VTEw7CisgIGN0eC0+bGFzdF9jYXBzID0gTlVMTDsKKworICBHU1RfTE9HICgiY29udGV4dCBpbml0ZWQiKTsKK30KKworc3RhdGljIHZvaWQKK3ZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nX2RlaW5pdF9jb250ZXh0IChHc3RWaWRlb0Nyb3BUZXN0Q29udGV4dCAqIGN0eCkKK3sKKyAgR1NUX0xPRyAoImRlaW5pdGluZyBjb250ZXh0Iik7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChjdHgtPnBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGN0eC0+cGlwZWxpbmUpOworICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZjdHgtPmxhc3RfYnVmLCBOVUxMKTsKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJmN0eC0+bGFzdF9jYXBzLCBOVUxMKTsKKyAgbWVtc2V0IChjdHgsIDB4MDAsIHNpemVvZiAoR3N0VmlkZW9Dcm9wVGVzdENvbnRleHQpKTsKK30KKwordHlwZWRlZiB2b2lkICgqR3N0VmlkZW9Dcm9wVGVzdEJ1ZmZlckZ1bmMpIChHc3RCdWZmZXIgKiBidWZmZXIsIEdzdENhcHMgKiBjYXBzKTsKKworc3RhdGljIHZvaWQKK3ZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nIChHc3RWaWRlb0Nyb3BUZXN0Q29udGV4dCAqIGN0eCwgR3N0Q2FwcyAqIGluX2NhcHMsCisgICAgR3N0Q2FwcyAqIG91dF9jYXBzLCBnaW50IGxlZnQsIGdpbnQgcmlnaHQsIGdpbnQgdG9wLCBnaW50IGJvdHRvbSwKKyAgICBHc3RWaWRlb0Nyb3BUZXN0QnVmZmVyRnVuYyBmdW5jKQoreworICBHU1RfTE9HICgibHJ0YiA9ICUwM3UgJTAzdSAlMDN1ICUwM3UsIGluX2NhcHMgPSAlIiBHU1RfUFRSX0ZPUk1BVAorICAgICAgIiwgb3V0X2NhcHMgPSAlIiBHU1RfUFRSX0ZPUk1BVCwgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBpbl9jYXBzLAorICAgICAgb3V0X2NhcHMpOworCisgIGdfb2JqZWN0X3NldCAoY3R4LT5maWx0ZXIsICJjYXBzIiwgaW5fY2FwcywgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoY3R4LT5maWx0ZXIyLCAiY2FwcyIsIG91dF9jYXBzLCBOVUxMKTsKKworICBnX29iamVjdF9zZXQgKGN0eC0+Y3JvcCwgImxlZnQiLCBsZWZ0LCAicmlnaHQiLCByaWdodCwgInRvcCIsIHRvcCwKKyAgICAgICJib3R0b20iLCBib3R0b20sIE5VTEwpOworCisgIC8qIHRoaXMgd2lsbCBmYWlsIGlmIHZpZGVvdGVzdHNyYyBkb2Vzbid0IHN1cHBvcnQgb3VyIGZvcm1hdDsgd2UgbmVlZAorICAgKiB2aWRlb3Rlc3RzcmMgZnJvbSAtYmFzZSBDVlMgMC4xMC45LjEgd2l0aCBSR0JBIGFuZCBBWVVWIHN1cHBvcnQgKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoY3R4LT5waXBlbGluZSwKKyAgICAgICAgICBHU1RfU1RBVEVfUEFVU0VEKSAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChjdHgtPnBpcGVsaW5lLCBOVUxMLCBOVUxMLAorICAgICAgICAgIC0xKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGlmIChmdW5jICE9IE5VTEwpIHsKKyAgICBmdW5jIChjdHgtPmxhc3RfYnVmLCBjdHgtPmxhc3RfY2Fwcyk7CisgIH0KKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGN0eC0+cGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrXzF4MV9idWZmZXIgKEdzdEJ1ZmZlciAqIGJ1ZiwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFZpZGVvSW5mbyBpbmZvOworICBHc3RWaWRlb0ZyYW1lIGZyYW1lOworICAvKiB0aGUgZXhhY3QgdmFsdWVzIHdlIGNoZWNrIGZvciBjb21lIGZyb20gdmlkZW90ZXN0c3JjICovCisgIHN0YXRpYyBjb25zdCBndWludCB5dXZfdmFsdWVzW10gPSB7IDgxLCA5MCwgMjQwLCAyNTUgfTsKKyAgc3RhdGljIGNvbnN0IGd1aW50IHJnYl92YWx1ZXNbXSA9IHsgMHhmZiwgMCwgMCwgMjU1IH07CisgIHN0YXRpYyBjb25zdCBndWludCBncmF5OF92YWx1ZXNbXSA9IHsgMHg1MSB9OworICBzdGF0aWMgY29uc3QgZ3VpbnQgZ3JheTE2X3ZhbHVlc1tdID0geyAweDUxNTEgfTsKKyAgY29uc3QgZ3VpbnQgKnZhbHVlczsKKyAgZ3VpbnQgaTsKKyAgY29uc3QgR3N0VmlkZW9Gb3JtYXRJbmZvICpmaW5mbzsKKworICBmYWlsX3VubGVzcyAoYnVmICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoY2FwcyAhPSBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3ZpZGVvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgY2FwcykpOworICBmYWlsX3VubGVzcyAoZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJmZyYW1lLCAmaW5mbywgYnVmLCBHU1RfTUFQX1JFQUQpKTsKKworICBmaW5mbyA9IGluZm8uZmluZm87CisKKyAgaWYgKEdTVF9WSURFT19JTkZPX0lTX1lVViAoJmluZm8pKQorICAgIHZhbHVlcyA9IHl1dl92YWx1ZXM7CisgIGVsc2UgaWYgKEdTVF9WSURFT19JTkZPX0lTX0dSQVkgKCZpbmZvKSkKKyAgICBpZiAoR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX0JJVFMgKGZpbmZvKSA9PSA4KQorICAgICAgdmFsdWVzID0gZ3JheThfdmFsdWVzOworICAgIGVsc2UKKyAgICAgIHZhbHVlcyA9IGdyYXkxNl92YWx1ZXM7CisgIGVsc2UKKyAgICB2YWx1ZXMgPSByZ2JfdmFsdWVzOworCisgIEdTVF9NRU1EVU1QICgiYnVmZmVyIiwgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKCZmcmFtZSwgMCksIDgpOworCisgIGZvciAoaSA9IDA7IGkgPCBHU1RfVklERU9fRlJBTUVfTl9DT01QT05FTlRTICgmZnJhbWUpOyBpKyspIHsKKyAgICBndWludDggKmRhdGEgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBICgmZnJhbWUsIGkpOworCisgICAgR1NUX0RFQlVHICgiVzogJWQiLCBHU1RfVklERU9fRk9STUFUX0lORk9fV19TVUIgKGZpbmZvLCBpKSk7CisgICAgR1NUX0RFQlVHICgiSDogJWQiLCBHU1RfVklERU9fRk9STUFUX0lORk9fSF9TVUIgKGZpbmZvLCBpKSk7CisKKyAgICBpZiAoR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1dfU1VCIChmaW5mbywKKyAgICAgICAgICAgIGkpID49IEdTVF9WSURFT19GUkFNRV9XSURUSCAoJmZyYW1lKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChHU1RfVklERU9fRk9STUFUX0lORk9fSF9TVUIgKGZpbmZvLAorICAgICAgICAgICAgaSkgPj0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoJmZyYW1lKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKEdTVF9WSURFT19GT1JNQVRfSU5GT19CSVRTIChmaW5mbykgPT0gOCkgeworICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YVswXSwgdmFsdWVzW2ldKTsKKyAgICB9IGVsc2UgaWYgKEdTVF9WSURFT19GT1JNQVRfSU5GT19CSVRTIChmaW5mbykgPT0gMTYpIHsKKyAgICAgIGd1aW50MTYgcGl4ZWxzLCB2YWw7CisgICAgICBnaW50IGRlcHRoOworCisgICAgICBpZiAoR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX0lTX0xFIChmaW5mbykpCisgICAgICAgIHBpeGVscyA9IEdTVF9SRUFEX1VJTlQxNl9MRSAoZGF0YSk7CisgICAgICBlbHNlCisgICAgICAgIHBpeGVscyA9IEdTVF9SRUFEX1VJTlQxNl9CRSAoZGF0YSk7CisKKyAgICAgIGRlcHRoID0gR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX0RFUFRIIChmaW5mbywgaSk7CisgICAgICB2YWwgPSBwaXhlbHMgPj4gR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NISUZUIChmaW5mbywgaSk7CisgICAgICB2YWwgPSB2YWwgJiAoKDEgPDwgZGVwdGgpIC0gMSk7CisKKyAgICAgIEdTVF9ERUJVRyAoInZhbCAlMDh4ICVkIDogJWQiLCBwaXhlbHMsIGksIHZhbCk7CisgICAgICBpZiAoZGVwdGggPD0gOCkgeworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICh2YWwsIHZhbHVlc1tpXSA+PiAoOCAtIGRlcHRoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICh2YWwsIHZhbHVlc1tpXSA+PiAoMTYgLSBkZXB0aCkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgfQorICB9CisKKyAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmZnJhbWUpOworCisgIC8qCisgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKChwaXhlbCAmIHJtYXNrKSA+PiByc2hpZnQsIDB4ZmYpOworICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgocGl4ZWwgJiBnbWFzaykgPj4gZ3NoaWZ0LCAweDAwKTsKKyAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoKHBpeGVsICYgYm1hc2spID4+IGJzaGlmdCwgMHgwMCk7CisgICAqLworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9jcm9wX3RvXzF4MSkKK3sKKyAgR3N0VmlkZW9Dcm9wVGVzdENvbnRleHQgY3R4OworICBHTGlzdCAqY2Fwc19saXN0LCAqbm9kZTsKKworICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZ19pbml0X2NvbnRleHQgKCZjdHgpOworCisgIGNhcHNfbGlzdCA9IHZpZGVvX2Nyb3BfZ2V0X3Rlc3RfY2FwcyAoY3R4LmNyb3ApOworCisgIGZvciAobm9kZSA9IGNhcHNfbGlzdDsgbm9kZSAhPSBOVUxMOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgIEdzdFN0cnVjdHVyZSAqczsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgY2FwcyA9IGdzdF9jYXBzX2NvcHkgKEdTVF9DQVBTIChub2RlLT5kYXRhKSk7CisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICAgIGZhaWxfdW5sZXNzIChzICE9IE5VTEwpOworCisgICAgR1NUX0lORk8gKCJ0ZXN0aW5nIGZvcm1hdDogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJ3aWR0aCIsIEdfVFlQRV9JTlQsIDE2MCwKKyAgICAgICAgImhlaWdodCIsIEdfVFlQRV9JTlQsIDE2MCwgTlVMTCk7CisKKyAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgY2FwcywgTlVMTCwgMTU5LCAwLCAxNTksIDAsCisgICAgICAgIGNoZWNrXzF4MV9idWZmZXIpOworICAgIC8qIGNvbW1lbnRlZCBvdXQgYmVjYXVzZSB0aGV5IGRvbid0IHJlYWxseSBhZGQgYW55dGhpbmcgdXNlZnVsIGNoZWNrLXdpc2U6CisgICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGNhcHMsIE5VTEwsIDAsIDE1OSwgMCwgMTU5LCBjaGVja18xeDFfYnVmZmVyKTsKKyAgICAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgY2FwcywgTlVMTCwgMTU5LCAwLCAwLCAxNTksIGNoZWNrXzF4MV9idWZmZXIpOworICAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBjYXBzLCBOVUxMLCAwLCAxNTksIDE1OSwgMCwgY2hlY2tfMXgxX2J1ZmZlcik7CisgICAgICovCisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICB9CisgIGdfbGlzdF9mb3JlYWNoIChjYXBzX2xpc3QsIChHRnVuYykgZ3N0X2NhcHNfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoY2Fwc19saXN0KTsKKworICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZ19kZWluaXRfY29udGV4dCAoJmN0eCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfY3JvcHBpbmcpCit7CisgIEdzdFZpZGVvQ3JvcFRlc3RDb250ZXh0IGN0eDsKKyAgc3RydWN0CisgIHsKKyAgICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIH0gc2l6ZXNfdG9fdHJ5W10gPSB7CisgICAgeworICAgIDE2MCwgMTYwfSwgeworICAgIDE2MSwgMTYwfSwgeworICAgIDE2MCwgMTYxfSwgeworICAgIDE2MSwgMTYxfSwgeworICAgIDE1OSwgMTYwfSwgeworICAgIDE2MCwgMTU5fSwgeworICAgIDE1OSwgMTU5fSwgeworICAgIDE1OSwgMTYxfQorICB9OworICBHTGlzdCAqY2Fwc19saXN0LCAqbm9kZTsKKyAgZ2ludCBpOworCisgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nX2luaXRfY29udGV4dCAoJmN0eCk7CisKKyAgY2Fwc19saXN0ID0gdmlkZW9fY3JvcF9nZXRfdGVzdF9jYXBzIChjdHguY3JvcCk7CisgIG5vZGUgPSBnX2xpc3RfbnRoIChjYXBzX2xpc3QsIF9faV9fKTsKKworICBpZiAobm9kZSAhPSBOVUxMKSB7CisgICAgR3N0U3RydWN0dXJlICpzOworICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICBjYXBzID0gZ3N0X2NhcHNfY29weSAoR1NUX0NBUFMgKG5vZGUtPmRhdGEpKTsKKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgICAgZmFpbF91bmxlc3MgKHMgIT0gTlVMTCk7CisKKyAgICBHU1RfSU5GTyAoInRlc3RpbmcgZm9ybWF0OiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTIChzaXplc190b190cnkpOyArK2kpIHsKKyAgICAgIEdzdENhcHMgKmluX2NhcHMsICpvdXRfY2FwczsKKworICAgICAgR1NUX0lORk8gKCIgLSAlZCB4ICVkIiwgc2l6ZXNfdG9fdHJ5W2ldLndpZHRoLCBzaXplc190b190cnlbaV0uaGVpZ2h0KTsKKworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHNpemVzX3RvX3RyeVtpXS53aWR0aCwKKyAgICAgICAgICAiaGVpZ2h0IiwgR19UWVBFX0lOVCwgc2l6ZXNfdG9fdHJ5W2ldLmhlaWdodCwgTlVMTCk7CisgICAgICBpbl9jYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAid2lkdGgiLCBHX1RZUEVfSU5ULCAxLCAiaGVpZ2h0IiwgR19UWVBFX0lOVCwgMSwKKyAgICAgICAgICBOVUxMKTsKKyAgICAgIG91dF9jYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBOVUxMLCAwLCAwLCAwLCAwLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBOVUxMLCAxLCAwLCAwLCAwLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBOVUxMLCAwLCAxLCAwLCAwLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBOVUxMLCAwLCAwLCAxLCAwLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBOVUxMLCAwLCAwLCAwLCAxLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBOVUxMLCA2MywgMCwgMCwgMCwgTlVMTCk7CisgICAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgaW5fY2FwcywgTlVMTCwgMCwgNjMsIDAsIDAsIE5VTEwpOworICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGluX2NhcHMsIE5VTEwsIDAsIDAsIDYzLCAwLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBOVUxMLCAwLCAwLCAwLCA2MywgTlVMTCk7CisgICAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgaW5fY2FwcywgTlVMTCwgNjMsIDAsIDAsIDEsIE5VTEwpOworICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGluX2NhcHMsIE5VTEwsIDAsIDYzLCAxLCAwLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBOVUxMLCAwLCAxLCA2MywgMCwgTlVMTCk7CisgICAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgaW5fY2FwcywgTlVMTCwgMSwgMCwgMCwgNjMsIE5VTEwpOworICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGluX2NhcHMsIE5VTEwsIDAsIDAsIDAsIDAsIE5VTEwpOworICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGluX2NhcHMsIE5VTEwsIDMyLCAwLCAwLCAxMjgsIE5VTEwpOworICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGluX2NhcHMsIE5VTEwsIDAsIDMyLCAxMjgsIDAsIE5VTEwpOworICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGluX2NhcHMsIE5VTEwsIDAsIDEyOCwgMzIsIDAsIE5VTEwpOworICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGluX2NhcHMsIE5VTEwsIDEyOCwgMCwgMCwgMzIsIE5VTEwpOworICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGluX2NhcHMsIE5VTEwsIDEsIDEsIDEsIDEsIE5VTEwpOworICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGluX2NhcHMsIE5VTEwsIDYzLCA2MywgNjMsIDYzLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBOVUxMLCA2NCwgNjQsIDY0LCA2NCwgTlVMTCk7CisKKyAgICAgIC8qIER5bmFtaWMgY3JvcHBpbmcgKi8KKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBvdXRfY2FwcywgLTEsIC0xLCAtMSwgLTEsIE5VTEwpOworICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGluX2NhcHMsIG91dF9jYXBzLCAwLCAtMSwgLTEsIC0xLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBvdXRfY2FwcywgLTEsIDAsIC0xLCAtMSwgTlVMTCk7CisgICAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgaW5fY2Fwcywgb3V0X2NhcHMsIC0xLCAtMSwgMCwgLTEsIE5VTEwpOworICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGluX2NhcHMsIG91dF9jYXBzLCAtMSwgLTEsIC0xLCAwLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBvdXRfY2FwcywgMTAsIC0xLCAxMCwgLTEsIE5VTEwpOworICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGluX2NhcHMsIG91dF9jYXBzLCAtMSwgMTAsIC0xLCAxMCwgTlVMTCk7CisgICAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgaW5fY2Fwcywgb3V0X2NhcHMsCisgICAgICAgICAgc2l6ZXNfdG9fdHJ5W2ldLndpZHRoIC0gMSwgLTEsIC0xLCAtMSwgTlVMTCk7CisgICAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgaW5fY2Fwcywgb3V0X2NhcHMsIC0xLAorICAgICAgICAgIHNpemVzX3RvX3RyeVtpXS53aWR0aCAtIDEsIC0xLCAtMSwgTlVMTCk7CisgICAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgaW5fY2Fwcywgb3V0X2NhcHMsIC0xLCAtMSwKKyAgICAgICAgICBzaXplc190b190cnlbaV0uaGVpZ2h0IC0gMSwgLTEsIE5VTEwpOworICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGluX2NhcHMsIG91dF9jYXBzLCAtMSwgLTEsIC0xLAorICAgICAgICAgIHNpemVzX3RvX3RyeVtpXS5oZWlnaHQgLSAxLCBOVUxMKTsKKworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGluX2NhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKG91dF9jYXBzKTsKKyAgICB9CisKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIH0gZWxzZSB7CisgICAgR1NUX0lORk8gKCJubyBjYXBzICMlZCIsIF9faV9fKTsKKyAgfQorICBnX2xpc3RfZm9yZWFjaCAoY2Fwc19saXN0LCAoR0Z1bmMpIGdzdF9jYXBzX3VucmVmLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKGNhcHNfbGlzdCk7CisKKyAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmdfZGVpbml0X2NvbnRleHQgKCZjdHgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworc3RhdGljIEdzdFBhZFByb2JlUmV0dXJuCitidWZmZXJfcHJvYmVfY2IgKEdzdFBhZCAqIHBhZCwgR3N0UGFkUHJvYmVJbmZvICogaW5mbywgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR3N0QnVmZmVyICoqcF9idWYgPSBkYXRhOworICBHc3RCdWZmZXIgKmJ1ZiA9IEdTVF9QQURfUFJPQkVfSU5GT19CVUZGRVIgKGluZm8pOworCisgIGdzdF9idWZmZXJfcmVwbGFjZSAocF9idWYsIGJ1Zik7CisKKyAgcmV0dXJuIEdTVF9QQURfUFJPQkVfT0s7ICAgICAgLyoga2VlcCBkYXRhICovCit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3Bhc3N0aHJvdWdoKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiBzdGF0ZV9yZXQ7CisgIEdzdFZpZGVvQ3JvcFRlc3RDb250ZXh0IGN0eDsKKyAgR3N0UGFkICpzcmNwYWQ7CisgIEdzdEJ1ZmZlciAqZ2VuX2J1ZiA9IE5VTEw7ICAgIC8qIGJ1ZmZlciBnZW5lcmF0ZWQgYnkgdmlkZW90ZXN0c3JjICovCisKKyAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmdfaW5pdF9jb250ZXh0ICgmY3R4KTsKKworICBnX29iamVjdF9zZXQgKGN0eC5zcmMsICJudW0tYnVmZmVycyIsIDEsIE5VTEwpOworCisgIHNyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChjdHguc3JjLCAic3JjIik7CisgIGZhaWxfdW5sZXNzIChzcmNwYWQgIT0gTlVMTCk7CisgIGdzdF9wYWRfYWRkX3Byb2JlIChzcmNwYWQsIEdTVF9QQURfUFJPQkVfVFlQRV9CVUZGRVIsIGJ1ZmZlcl9wcm9iZV9jYiwKKyAgICAgICZnZW5fYnVmLCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKworICBnX29iamVjdF9zZXQgKGN0eC5jcm9wLCAibGVmdCIsIDAsICJyaWdodCIsIDAsICJ0b3AiLCAwLCAiYm90dG9tIiwgMCwgTlVMTCk7CisKKyAgc3RhdGVfcmV0ID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChjdHgucGlwZWxpbmUsIEdTVF9TVEFURV9QQVVTRUQpOworICBmYWlsX3VubGVzcyAoc3RhdGVfcmV0ICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSwKKyAgICAgICJjb3VsZG4ndCBzZXQgcGlwZWxpbmUgdG8gUEFVU0VEIHN0YXRlIik7CisKKyAgc3RhdGVfcmV0ID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChjdHgucGlwZWxpbmUsIE5VTEwsIE5VTEwsIC0xKTsKKyAgZmFpbF91bmxlc3MgKHN0YXRlX3JldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAicGlwZWxpbmUgZmFpbGVkIHRvIGdvIHRvIFBBVVNFRCBzdGF0ZSIpOworCisgIGZhaWxfdW5sZXNzIChnZW5fYnVmICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoY3R4Lmxhc3RfYnVmICE9IE5VTEwpOworCisgIC8qIHBhc3MgdGhyb3VnaCBzaG91bGQgZG8gbm90aGluZyAqLworICBmYWlsX3VubGVzcyAoZ2VuX2J1ZiA9PSBjdHgubGFzdF9idWYpOworCisgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nX2RlaW5pdF9jb250ZXh0ICgmY3R4KTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfTUlOSV9PQkpFQ1RfUkVGQ09VTlRfVkFMVUUgKGdlbl9idWYpLCAxKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZ2VuX2J1Zik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIGdpbnQKK25vdGdzdF92YWx1ZV9saXN0X2dldF9udGhfaW50IChjb25zdCBHVmFsdWUgKiBsaXN0X3ZhbCwgZ3VpbnQgbikKK3sKKyAgY29uc3QgR1ZhbHVlICp2OworCisgIGZhaWxfdW5sZXNzIChHU1RfVkFMVUVfSE9MRFNfTElTVCAobGlzdF92YWwpKTsKKyAgZmFpbF91bmxlc3MgKG4gPCBnc3RfdmFsdWVfbGlzdF9nZXRfc2l6ZSAobGlzdF92YWwpKTsKKworICB2ID0gZ3N0X3ZhbHVlX2xpc3RfZ2V0X3ZhbHVlIChsaXN0X3ZhbCwgbik7CisgIGZhaWxfdW5sZXNzIChHX1ZBTFVFX0hPTERTX0lOVCAodikpOworICByZXR1cm4gZ192YWx1ZV9nZXRfaW50ICh2KTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfY2Fwc190cmFuc2Zvcm0pCit7CisgIEdzdFZpZGVvQ3JvcFRlc3RDb250ZXh0IGN0eDsKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzICprbGFzczsKKyAgR3N0QmFzZVRyYW5zZm9ybSAqY3JvcDsKKyAgY29uc3QgR1ZhbHVlICp3X3ZhbDsKKyAgY29uc3QgR1ZhbHVlICpoX3ZhbDsKKyAgR3N0Q2FwcyAqY2FwcywgKmFkal9jYXBzOworCisgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nX2luaXRfY29udGV4dCAoJmN0eCk7CisKKyAgY3JvcCA9IEdTVF9CQVNFX1RSQU5TRk9STSAoY3R4LmNyb3ApOworICBrbGFzcyA9IEdTVF9CQVNFX1RSQU5TRk9STV9HRVRfQ0xBU1MgKGN0eC5jcm9wKTsKKyAgZmFpbF91bmxlc3MgKGtsYXNzICE9IE5VTEwpOworCisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1yYXciLAorICAgICAgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJJNDIwIiwKKyAgICAgICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTiwgMSwgMSwKKyAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIDIwMCwgImhlaWdodCIsIEdfVFlQRV9JTlQsIDEwMCwgTlVMTCk7CisKKyAgLyogYnkgZGVmYXVsdCwgaXQgc2hvdWxkIGJlIG5vIGNyb3BwaW5nIGFuZCBoZW5jZSBwYXNzdGhyb3VnaCAqLworICBhZGpfY2FwcyA9IGtsYXNzLT50cmFuc2Zvcm1fY2FwcyAoY3JvcCwgR1NUX1BBRF9TUkMsIGNhcHMsIE5VTEwpOworICBmYWlsX3VubGVzcyAoYWRqX2NhcHMgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19pc19lcXVhbCAoYWRqX2NhcHMsIGNhcHMpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGFkal9jYXBzKTsKKworICBhZGpfY2FwcyA9IGtsYXNzLT50cmFuc2Zvcm1fY2FwcyAoY3JvcCwgR1NUX1BBRF9TSU5LLCBjYXBzLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGFkal9jYXBzICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfaXNfZXF1YWwgKGFkal9jYXBzLCBjYXBzKSk7CisgIGdzdF9jYXBzX3VucmVmIChhZGpfY2Fwcyk7CisKKyAgLyogbWFrZSBzdXJlIHRoYXQncyBzdGlsbCB0cnVlIGFmdGVyIGNoYW5naW5nIHByb3BlcnRpZXMgYmFjayBhbmQgZm9ydGggKi8KKyAgZ19vYmplY3Rfc2V0IChjdHguY3JvcCwgImxlZnQiLCAxLCAicmlnaHQiLCAzLCAidG9wIiwgNSwgImJvdHRvbSIsIDcsIE5VTEwpOworICBnX29iamVjdF9zZXQgKGN0eC5jcm9wLCAibGVmdCIsIDAsICJyaWdodCIsIDAsICJ0b3AiLCAwLCAiYm90dG9tIiwgMCwgTlVMTCk7CisKKyAgYWRqX2NhcHMgPSBrbGFzcy0+dHJhbnNmb3JtX2NhcHMgKGNyb3AsIEdTVF9QQURfU1JDLCBjYXBzLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGFkal9jYXBzICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfaXNfZXF1YWwgKGFkal9jYXBzLCBjYXBzKSk7CisgIGdzdF9jYXBzX3VucmVmIChhZGpfY2Fwcyk7CisKKyAgYWRqX2NhcHMgPSBrbGFzcy0+dHJhbnNmb3JtX2NhcHMgKGNyb3AsIEdTVF9QQURfU0lOSywgY2FwcywgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChhZGpfY2FwcyAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2lzX2VxdWFsIChhZGpfY2FwcywgY2FwcykpOworICBnc3RfY2Fwc191bnJlZiAoYWRqX2NhcHMpOworCisgIC8qIG5vdyBjaGVjayBhZGp1c3RtZW50cyBtYWRlIC4uLiAqLworICBnX29iamVjdF9zZXQgKGN0eC5jcm9wLCAibGVmdCIsIDEsICJyaWdodCIsIDMsICJ0b3AiLCA1LCAiYm90dG9tIiwgNywgTlVMTCk7CisKKyAgLyogPT09PT09PT09ICgxKSBmaXhlZCB2YWx1ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAvKiBzaW5rID0+IHNvdXJjZSwgc291cmNlIG11c3QgYmUgYmlnZ2VyIGlmIHdlIGNyb3Agc3R1ZmYgb2ZmICovCisgIGFkal9jYXBzID0ga2xhc3MtPnRyYW5zZm9ybV9jYXBzIChjcm9wLCBHU1RfUEFEX1NSQywgY2FwcywgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChhZGpfY2FwcyAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2dldF9zaXplIChhZGpfY2FwcykgPT0gMSk7CisgIHdfdmFsID0KKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChhZGpfY2FwcywgMCksICJ3aWR0aCIpOworICBmYWlsX3VubGVzcyAod192YWwgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChHX1ZBTFVFX0hPTERTX0lOVCAod192YWwpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ192YWx1ZV9nZXRfaW50ICh3X3ZhbCksIDIwMCArICgxICsgMykpOworICBoX3ZhbCA9CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoYWRqX2NhcHMsIDApLCAiaGVpZ2h0Iik7CisgIGZhaWxfdW5sZXNzIChoX3ZhbCAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKEdfVkFMVUVfSE9MRFNfSU5UIChoX3ZhbCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX3ZhbHVlX2dldF9pbnQgKGhfdmFsKSwgMTAwICsgKDUgKyA3KSk7CisgIGdzdF9jYXBzX3VucmVmIChhZGpfY2Fwcyk7CisKKyAgLyogc291cmNlID0+IHNpbmsgYmVjb21lcyBzbWFsbGVyICovCisgIGFkal9jYXBzID0ga2xhc3MtPnRyYW5zZm9ybV9jYXBzIChjcm9wLCBHU1RfUEFEX1NJTkssIGNhcHMsIE5VTEwpOworICBmYWlsX3VubGVzcyAoYWRqX2NhcHMgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19nZXRfc2l6ZSAoYWRqX2NhcHMpID09IDEpOworICB3X3ZhbCA9CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoYWRqX2NhcHMsIDApLCAid2lkdGgiKTsKKyAgZmFpbF91bmxlc3MgKHdfdmFsICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoR19WQUxVRV9IT0xEU19JTlQgKHdfdmFsKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfdmFsdWVfZ2V0X2ludCAod192YWwpLCAyMDAgLSAoMSArIDMpKTsKKyAgaF92YWwgPQorICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGFkal9jYXBzLCAwKSwgImhlaWdodCIpOworICBmYWlsX3VubGVzcyAoaF92YWwgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChHX1ZBTFVFX0hPTERTX0lOVCAoaF92YWwpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ192YWx1ZV9nZXRfaW50IChoX3ZhbCksIDEwMCAtICg1ICsgNykpOworICBnc3RfY2Fwc191bnJlZiAoYWRqX2NhcHMpOworCisgIC8qID09PT09PT09PSAoMikgcmFuZ2UgKHNpbXBsZSBhZGp1c3RtZW50KSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgZ3N0X3N0cnVjdHVyZV9zZXQgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApLAorICAgICAgIndpZHRoIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxMDAwLCAyMDAwLAorICAgICAgImhlaWdodCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMzAwMCwgNDAwMCwgTlVMTCk7CisKKyAgLyogc2luayA9PiBzb3VyY2UsIHNvdXJjZSBtdXN0IGJlIGJpZ2dlciBpZiB3ZSBjcm9wIHN0dWZmIG9mZiAqLworICBhZGpfY2FwcyA9IGtsYXNzLT50cmFuc2Zvcm1fY2FwcyAoY3JvcCwgR1NUX1BBRF9TUkMsIGNhcHMsIE5VTEwpOworICBmYWlsX3VubGVzcyAoYWRqX2NhcHMgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19nZXRfc2l6ZSAoYWRqX2NhcHMpID09IDEpOworICB3X3ZhbCA9CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoYWRqX2NhcHMsIDApLCAid2lkdGgiKTsKKyAgZmFpbF91bmxlc3MgKHdfdmFsICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoR1NUX1ZBTFVFX0hPTERTX0lOVF9SQU5HRSAod192YWwpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3ZhbHVlX2dldF9pbnRfcmFuZ2VfbWluICh3X3ZhbCksIDEwMDAgKyAoMSArIDMpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3ZhbHVlX2dldF9pbnRfcmFuZ2VfbWF4ICh3X3ZhbCksIDIwMDAgKyAoMSArIDMpKTsKKyAgaF92YWwgPQorICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGFkal9jYXBzLCAwKSwgImhlaWdodCIpOworICBmYWlsX3VubGVzcyAoaF92YWwgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChHU1RfVkFMVUVfSE9MRFNfSU5UX1JBTkdFIChoX3ZhbCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfdmFsdWVfZ2V0X2ludF9yYW5nZV9taW4gKGhfdmFsKSwgMzAwMCArICg1ICsgNykpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfdmFsdWVfZ2V0X2ludF9yYW5nZV9tYXggKGhfdmFsKSwgNDAwMCArICg1ICsgNykpOworICBnc3RfY2Fwc191bnJlZiAoYWRqX2NhcHMpOworCisgIC8qIHNvdXJjZSA9PiBzaW5rIGJlY29tZXMgc21hbGxlciAqLworICBhZGpfY2FwcyA9IGtsYXNzLT50cmFuc2Zvcm1fY2FwcyAoY3JvcCwgR1NUX1BBRF9TSU5LLCBjYXBzLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGFkal9jYXBzICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfZ2V0X3NpemUgKGFkal9jYXBzKSA9PSAxKTsKKyAgd192YWwgPQorICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGFkal9jYXBzLCAwKSwgIndpZHRoIik7CisgIGZhaWxfdW5sZXNzICh3X3ZhbCAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9WQUxVRV9IT0xEU19JTlRfUkFOR0UgKHdfdmFsKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF92YWx1ZV9nZXRfaW50X3JhbmdlX21pbiAod192YWwpLCAxMDAwIC0gKDEgKyAzKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF92YWx1ZV9nZXRfaW50X3JhbmdlX21heCAod192YWwpLCAyMDAwIC0gKDEgKyAzKSk7CisgIGhfdmFsID0KKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChhZGpfY2FwcywgMCksICJoZWlnaHQiKTsKKyAgZmFpbF91bmxlc3MgKGhfdmFsICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoR1NUX1ZBTFVFX0hPTERTX0lOVF9SQU5HRSAoaF92YWwpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3ZhbHVlX2dldF9pbnRfcmFuZ2VfbWluIChoX3ZhbCksIDMwMDAgLSAoNSArIDcpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3ZhbHVlX2dldF9pbnRfcmFuZ2VfbWF4IChoX3ZhbCksIDQwMDAgLSAoNSArIDcpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGFkal9jYXBzKTsKKworICAvKiA9PT09PT09PT0gKDMpIHJhbmdlIChhZGp1c3RtZW50IGF0IGJvdW5kYXJ5KSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgIGdzdF9zdHJ1Y3R1cmVfc2V0IChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKSwKKyAgICAgICJ3aWR0aCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMiwgR19NQVhJTlQsCisgICAgICAiaGVpZ2h0IiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAyLCBHX01BWElOVCwgTlVMTCk7CisKKyAgLyogc2luayA9PiBzb3VyY2UsIHNvdXJjZSBtdXN0IGJlIGJpZ2dlciBpZiB3ZSBjcm9wIHN0dWZmIG9mZiAqLworICBhZGpfY2FwcyA9IGtsYXNzLT50cmFuc2Zvcm1fY2FwcyAoY3JvcCwgR1NUX1BBRF9TUkMsIGNhcHMsIE5VTEwpOworICBmYWlsX3VubGVzcyAoYWRqX2NhcHMgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19nZXRfc2l6ZSAoYWRqX2NhcHMpID09IDEpOworICB3X3ZhbCA9CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoYWRqX2NhcHMsIDApLCAid2lkdGgiKTsKKyAgZmFpbF91bmxlc3MgKHdfdmFsICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoR1NUX1ZBTFVFX0hPTERTX0lOVF9SQU5HRSAod192YWwpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3ZhbHVlX2dldF9pbnRfcmFuZ2VfbWluICh3X3ZhbCksIDIgKyAoMSArIDMpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3ZhbHVlX2dldF9pbnRfcmFuZ2VfbWF4ICh3X3ZhbCksIEdfTUFYSU5UKTsKKyAgaF92YWwgPQorICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGFkal9jYXBzLCAwKSwgImhlaWdodCIpOworICBmYWlsX3VubGVzcyAoaF92YWwgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChHU1RfVkFMVUVfSE9MRFNfSU5UX1JBTkdFIChoX3ZhbCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfdmFsdWVfZ2V0X2ludF9yYW5nZV9taW4gKGhfdmFsKSwgMiArICg1ICsgNykpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfdmFsdWVfZ2V0X2ludF9yYW5nZV9tYXggKGhfdmFsKSwgR19NQVhJTlQpOworICBnc3RfY2Fwc191bnJlZiAoYWRqX2NhcHMpOworCisgIC8qIHNvdXJjZSA9PiBzaW5rIGJlY29tZXMgc21hbGxlciAqLworICBhZGpfY2FwcyA9IGtsYXNzLT50cmFuc2Zvcm1fY2FwcyAoY3JvcCwgR1NUX1BBRF9TSU5LLCBjYXBzLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGFkal9jYXBzICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfZ2V0X3NpemUgKGFkal9jYXBzKSA9PSAxKTsKKyAgd192YWwgPQorICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGFkal9jYXBzLCAwKSwgIndpZHRoIik7CisgIGZhaWxfdW5sZXNzICh3X3ZhbCAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9WQUxVRV9IT0xEU19JTlRfUkFOR0UgKHdfdmFsKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF92YWx1ZV9nZXRfaW50X3JhbmdlX21pbiAod192YWwpLCAxKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3ZhbHVlX2dldF9pbnRfcmFuZ2VfbWF4ICh3X3ZhbCksCisgICAgICBHX01BWElOVCAtICgxICsgMykpOworICBoX3ZhbCA9CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoYWRqX2NhcHMsIDApLCAiaGVpZ2h0Iik7CisgIGZhaWxfdW5sZXNzIChoX3ZhbCAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9WQUxVRV9IT0xEU19JTlRfUkFOR0UgKGhfdmFsKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF92YWx1ZV9nZXRfaW50X3JhbmdlX21pbiAoaF92YWwpLCAxKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3ZhbHVlX2dldF9pbnRfcmFuZ2VfbWF4IChoX3ZhbCksCisgICAgICBHX01BWElOVCAtICg1ICsgNykpOworICBnc3RfY2Fwc191bnJlZiAoYWRqX2NhcHMpOworCisgIC8qID09PT09PT09PSAoNCkgbGlzdCBvZiB2YWx1ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgeworICAgIEdWYWx1ZSBsaXN0ID0geyAwLCB9OworICAgIEdWYWx1ZSBpdmFsID0geyAwLCB9OworCisgICAgZ192YWx1ZV9pbml0ICgmaXZhbCwgR19UWVBFX0lOVCk7CisgICAgZ192YWx1ZV9pbml0ICgmbGlzdCwgR1NUX1RZUEVfTElTVCk7CisgICAgZ192YWx1ZV9zZXRfaW50ICgmaXZhbCwgMik7CisgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmbGlzdCwgJml2YWwpOworICAgIGdfdmFsdWVfc2V0X2ludCAoJml2YWwsIEdfTUFYSU5UKTsKKyAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfdmFsdWUgKCZsaXN0LCAmaXZhbCk7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApLCAid2lkdGgiLCAmbGlzdCk7CisgICAgZ192YWx1ZV91bnNldCAoJmxpc3QpOworICAgIGdfdmFsdWVfdW5zZXQgKCZpdmFsKTsKKworICAgIGdfdmFsdWVfaW5pdCAoJml2YWwsIEdfVFlQRV9JTlQpOworICAgIGdfdmFsdWVfaW5pdCAoJmxpc3QsIEdTVF9UWVBFX0xJU1QpOworICAgIGdfdmFsdWVfc2V0X2ludCAoJml2YWwsIDUpOworICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJmxpc3QsICZpdmFsKTsKKyAgICBnX3ZhbHVlX3NldF9pbnQgKCZpdmFsLCAxMDAwKTsKKyAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfdmFsdWUgKCZsaXN0LCAmaXZhbCk7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApLCAiaGVpZ2h0IiwgJmxpc3QpOworICAgIGdfdmFsdWVfdW5zZXQgKCZsaXN0KTsKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmaXZhbCk7CisgIH0KKworICAvKiBzaW5rID0+IHNvdXJjZSwgc291cmNlIG11c3QgYmUgYmlnZ2VyIGlmIHdlIGNyb3Agc3R1ZmYgb2ZmICovCisgIGFkal9jYXBzID0ga2xhc3MtPnRyYW5zZm9ybV9jYXBzIChjcm9wLCBHU1RfUEFEX1NSQywgY2FwcywgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChhZGpfY2FwcyAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2dldF9zaXplIChhZGpfY2FwcykgPT0gMSk7CisgIHdfdmFsID0KKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChhZGpfY2FwcywgMCksICJ3aWR0aCIpOworICBmYWlsX3VubGVzcyAod192YWwgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChHU1RfVkFMVUVfSE9MRFNfTElTVCAod192YWwpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobm90Z3N0X3ZhbHVlX2xpc3RfZ2V0X250aF9pbnQgKHdfdmFsLCAwKSwKKyAgICAgIDIgKyAoMSArIDMpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobm90Z3N0X3ZhbHVlX2xpc3RfZ2V0X250aF9pbnQgKHdfdmFsLCAxKSwgR19NQVhJTlQpOworICBoX3ZhbCA9CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoYWRqX2NhcHMsIDApLCAiaGVpZ2h0Iik7CisgIGZhaWxfdW5sZXNzIChoX3ZhbCAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9WQUxVRV9IT0xEU19MSVNUIChoX3ZhbCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChub3Rnc3RfdmFsdWVfbGlzdF9nZXRfbnRoX2ludCAoaF92YWwsIDApLAorICAgICAgNSArICg1ICsgNykpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChub3Rnc3RfdmFsdWVfbGlzdF9nZXRfbnRoX2ludCAoaF92YWwsIDEpLAorICAgICAgMTAwMCArICg1ICsgNykpOworICBnc3RfY2Fwc191bnJlZiAoYWRqX2NhcHMpOworCisgIC8qIHNvdXJjZSA9PiBzaW5rIGJlY29tZXMgc21hbGxlciAqLworICBhZGpfY2FwcyA9IGtsYXNzLT50cmFuc2Zvcm1fY2FwcyAoY3JvcCwgR1NUX1BBRF9TSU5LLCBjYXBzLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGFkal9jYXBzICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfZ2V0X3NpemUgKGFkal9jYXBzKSA9PSAxKTsKKyAgd192YWwgPQorICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGFkal9jYXBzLCAwKSwgIndpZHRoIik7CisgIGZhaWxfdW5sZXNzICh3X3ZhbCAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9WQUxVRV9IT0xEU19MSVNUICh3X3ZhbCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChub3Rnc3RfdmFsdWVfbGlzdF9nZXRfbnRoX2ludCAod192YWwsIDApLCAxKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobm90Z3N0X3ZhbHVlX2xpc3RfZ2V0X250aF9pbnQgKHdfdmFsLCAxKSwKKyAgICAgIEdfTUFYSU5UIC0gKDEgKyAzKSk7CisgIGhfdmFsID0KKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChhZGpfY2FwcywgMCksICJoZWlnaHQiKTsKKyAgZmFpbF91bmxlc3MgKGhfdmFsICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoR1NUX1ZBTFVFX0hPTERTX0xJU1QgKGhfdmFsKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG5vdGdzdF92YWx1ZV9saXN0X2dldF9udGhfaW50IChoX3ZhbCwgMCksIDEpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChub3Rnc3RfdmFsdWVfbGlzdF9nZXRfbnRoX2ludCAoaF92YWwsIDEpLAorICAgICAgMTAwMCAtICg1ICsgNykpOworICBnc3RfY2Fwc191bnJlZiAoYWRqX2NhcHMpOworCisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmdfZGVpbml0X2NvbnRleHQgKCZjdHgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCit2aWRlb2Nyb3Bfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgidmlkZW9jcm9wIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworI2lmZGVmIEhBVkVfVkFMR1JJTkQKKyAgaWYgKFJVTk5JTkdfT05fVkFMR1JJTkQpIHsKKyAgICAvKiBvdXIgdGVzdHMgdGFrZSBxdWl0ZSBhIGxvbmcgdGltZSwgc28gaW5jcmVhc2UKKyAgICAgKiB0aW1lb3V0ICh+MjUgbWludXRlcyBvbiBteSAxLjZHSHogQU1EIEs3KSAqLworICAgIHRjYXNlX3NldF90aW1lb3V0ICh0Y19jaGFpbiwgMzAgKiA2MCk7CisgIH0gZWxzZQorI2VuZGlmCisgIHsKKyAgICAvKiBpbmNyZWFzZSB0aW1lb3V0LCB0aGVzZSB0ZXN0cyB0YWtlIGEgbG9uZyB0aW1lICg2MCBzZWNzIGhlcmUpICovCisgICAgdGNhc2Vfc2V0X3RpbWVvdXQgKHRjX2NoYWluLCAyICogNjApOworICB9CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9jcm9wX3RvXzF4MSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9jYXBzX3RyYW5zZm9ybSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXNzdGhyb3VnaCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF91bml0X3NpemVzKTsKKyAgdGNhc2VfYWRkX2xvb3BfdGVzdCAodGNfY2hhaW4sIHRlc3RfY3JvcHBpbmcsIDAsIDI1KTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHZpZGVvY3JvcCk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2ZpbHRlci5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9maWx0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2MwMmY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9maWx0ZXIuYwpAQCAtMCwwICsxLDI2NiBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciB2aWRlb2ZpbHRlciBlbGVtZW50cworICoKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IE1hcmsgTmF1d2VsYWVydHMgPG1hbmF1d0Bza3luZXQuYmU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisKK2dib29sZWFuIGhhdmVfZW9zID0gRkFMU0U7CisKKy8qIEZvciBlYXNlIG9mIHByb2dyYW1taW5nIHdlIHVzZSBnbG9iYWxzIHRvIGtlZXAgcmVmcyBmb3Igb3VyIGZsb2F0aW5nCisgKiBzcmMgYW5kIHNpbmsgcGFkcyB3ZSBjcmVhdGU7IG90aGVyd2lzZSB3ZSBhbHdheXMgaGF2ZSB0byBkbyBnZXRfcGFkLAorICogZ2V0X3BlZXIsIGFuZCB0aGVuIHJlbW92ZSByZWZlcmVuY2VzIGluIGV2ZXJ5IHRlc3QgZnVuY3Rpb24gKi8KK0dzdFBhZCAqbXlzcmNwYWQsICpteXNpbmtwYWQ7CisKKyNkZWZpbmUgVklERU9fQ0FQU19URU1QTEFURV9TVFJJTkcgXAorICBHU1RfVklERU9fQ0FQU19NQUtFICgieyBJNDIwLCBBWVVWLCBZVVkyLCBVWVZZLCBZVllVLCB4UkdCIH0iKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChWSURFT19DQVBTX1RFTVBMQVRFX1NUUklORykKKyAgICApOworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoVklERU9fQ0FQU19URU1QTEFURV9TVFJJTkcpCisgICAgKTsKKworLyogdGFrZXMgb3ZlciByZWZlcmVuY2UgZm9yIG91dGNhcHMgKi8KK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX2ZpbHRlciAoY29uc3QgZ2NoYXIgKiBuYW1lLCBjb25zdCBnY2hhciAqIHByb3AsIHZhX2xpc3QgdmFyX2FyZ3MpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQ7CisKKyAgR1NUX0RFQlVHICgic2V0dXBfZWxlbWVudCIpOworICBlbGVtZW50ID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKG5hbWUpOworICBnX29iamVjdF9zZXRfdmFsaXN0IChHX09CSkVDVCAoZWxlbWVudCksIHByb3AsIHZhcl9hcmdzKTsKKyAgbXlzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAoZWxlbWVudCwgJnNyY3RlbXBsYXRlKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAoZWxlbWVudCwgJnNpbmt0ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICByZXR1cm4gZWxlbWVudDsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfZmlsdGVyIChHc3RFbGVtZW50ICogZmlsdGVyKQoreworICBHU1RfREVCVUcgKCJjbGVhbnVwX2VsZW1lbnQiKTsKKworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAoZmlsdGVyKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChmaWx0ZXIpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAoZmlsdGVyKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2ZpbHRlcl9jYXBzIChjb25zdCBnY2hhciAqIG5hbWUsIEdzdEV2ZW50ICogZXZlbnQsIEdzdENhcHMgKiBjYXBzLAorICAgIGdpbnQgc2l6ZSwgZ2ludCBudW1fYnVmZmVycywgY29uc3QgZ2NoYXIgKiBwcm9wLCB2YV9saXN0IHZhcmFyZ3MpCit7CisgIEdzdEVsZW1lbnQgKmZpbHRlcjsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgZ2ludCBpOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgZmlsdGVyID0gc2V0dXBfZmlsdGVyIChuYW1lLCBwcm9wLCB2YXJhcmdzKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZmlsdGVyLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGZpbHRlciwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKworICAvKiBlbnN1cmUgc2VnbWVudCAoZm9ybWF0KSBwcm9wZXJseSBzZXR1cCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgaWYgKGV2ZW50KQorICAgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBldmVudCkpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fYnVmZmVyczsgKytpKSB7CisgICAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHNpemUpOworICAgIC8qIG1ha2VzIHZhbGdyaW5kJ3MgbWVtY2hlY2sgaGFwcGllciAqLworICAgIGdzdF9idWZmZXJfbWVtc2V0IChpbmJ1ZmZlciwgMCwgMCwgc2l6ZSk7CisgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisgICAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworICAgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICB9CisKKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID09IG51bV9idWZmZXJzKTsKKworICAvKiBjbGVhbiB1cCBidWZmZXJzICovCisgIGZvciAoaSA9IDA7IGkgPCBudW1fYnVmZmVyczsgKytpKSB7CisgICAgb3V0YnVmZmVyID0gR1NUX0JVRkZFUiAoYnVmZmVycy0+ZGF0YSk7CisgICAgZmFpbF9pZiAob3V0YnVmZmVyID09IE5VTEwpOworCisgICAgc3dpdGNoIChpKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWZmZXIpID09IHNpemUpOworICAgICAgICAvKiBubyBjaGVjayBvbiBmaWx0ZXIgb3BlcmF0aW9uIGl0c2VsZiAqLworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBidWZmZXJzID0gZ19saXN0X3JlbW92ZSAoYnVmZmVycywgb3V0YnVmZmVyKTsKKworICAgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKG91dGJ1ZmZlciwgIm91dGJ1ZmZlciIsIDEpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1ZmZlcik7CisgICAgb3V0YnVmZmVyID0gTlVMTDsKKyAgfQorCisgIGNsZWFudXBfZmlsdGVyIChmaWx0ZXIpOworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfZmlsdGVyX3ZhcmFyZ3MgKGNvbnN0IGdjaGFyICogbmFtZSwgR3N0RXZlbnQgKiBldmVudCwgZ2ludCBudW1fYnVmZmVycywKKyAgICBjb25zdCBnY2hhciAqIHByb3AsIHZhX2xpc3QgdmFyYXJncykKK3sKKyAgc3RhdGljIGNvbnN0IHN0cnVjdAorICB7CisgICAgY29uc3QgaW50IHdpZHRoLCBoZWlnaHQ7CisgIH0gcmVzb2x1dGlvbnNbXSA9IHsgeworICAzODQsIDI4OH0sIHsKKyAgMzg1LCAyODl9LCB7CisgIDM4NSwgMzg1fX07CisgIGdpbnQgaSwgbiwgcjsKKyAgZ2ludCBzaXplOworICBHc3RDYXBzICphbGxjYXBzLCAqdGVtcGwgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoVklERU9fQ0FQU19URU1QTEFURV9TVFJJTkcpOworCisgIGFsbGNhcHMgPSBnc3RfY2Fwc19ub3JtYWxpemUgKHRlbXBsKTsKKworICBuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKGFsbGNhcHMpOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChhbGxjYXBzLCBpKTsKKyAgICBHc3RDYXBzICpjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoY2FwcywgZ3N0X3N0cnVjdHVyZV9jb3B5IChzKSk7CisKKyAgICAvKiB0cnkgdmFyaW91cyByZXNvbHV0aW9ucyAqLworICAgIGZvciAociA9IDA7IHIgPCBHX05fRUxFTUVOVFMgKHJlc29sdXRpb25zKTsgKytyKSB7CisgICAgICBHc3RWaWRlb0luZm8gaW5mbzsKKyAgICAgIHZhX2xpc3QgYXJnc19jcDsKKworICAgICAgY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGNhcHMpOworICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgIndpZHRoIiwgR19UWVBFX0lOVCwgcmVzb2x1dGlvbnNbcl0ud2lkdGgsCisgICAgICAgICAgImhlaWdodCIsIEdfVFlQRV9JTlQsIHJlc29sdXRpb25zW3JdLmhlaWdodCwKKyAgICAgICAgICAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT04sIDI1LCAxLCBOVUxMKTsKKworICAgICAgR1NUX0RFQlVHICgiVGVzdGluZyB3aXRoIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKyAgICAgIGdzdF92aWRlb19pbmZvX2Zyb21fY2FwcyAoJmluZm8sIGNhcHMpOworICAgICAgc2l6ZSA9IEdTVF9WSURFT19JTkZPX1NJWkUgKCZpbmZvKTsKKworICAgICAgaWYgKGV2ZW50KQorICAgICAgICBnc3RfZXZlbnRfcmVmIChldmVudCk7CisKKyAgICAgIHZhX2NvcHkgKGFyZ3NfY3AsIHZhcmFyZ3MpOworICAgICAgY2hlY2tfZmlsdGVyX2NhcHMgKG5hbWUsIGV2ZW50LCBjYXBzLCBzaXplLCBudW1fYnVmZmVycywgcHJvcCwgYXJnc19jcCk7CisgICAgICB2YV9lbmQgKGFyZ3NfY3ApOworICAgIH0KKworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgfQorCisgIGdzdF9jYXBzX3VucmVmIChhbGxjYXBzKTsKKyAgaWYgKGV2ZW50KQorICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfZmlsdGVyIChjb25zdCBnY2hhciAqIG5hbWUsIGdpbnQgbnVtX2J1ZmZlcnMsIGNvbnN0IGdjaGFyICogcHJvcCwgLi4uKQoreworICB2YV9saXN0IHZhcmFyZ3M7CisgIHZhX3N0YXJ0ICh2YXJhcmdzLCBwcm9wKTsKKyAgY2hlY2tfZmlsdGVyX3ZhcmFyZ3MgKG5hbWUsIE5VTEwsIG51bV9idWZmZXJzLCBwcm9wLCB2YXJhcmdzKTsKKyAgdmFfZW5kICh2YXJhcmdzKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2ZpbHRlcl93aXRoX2V2ZW50IChjb25zdCBnY2hhciAqIG5hbWUsIEdzdEV2ZW50ICogZXZlbnQsCisgICAgZ2ludCBudW1fYnVmZmVycywgY29uc3QgZ2NoYXIgKiBwcm9wLCAuLi4pCit7CisgIHZhX2xpc3QgdmFyYXJnczsKKyAgdmFfc3RhcnQgKHZhcmFyZ3MsIHByb3ApOworICBjaGVja19maWx0ZXJfdmFyYXJncyAobmFtZSwgZXZlbnQsIG51bV9idWZmZXJzLCBwcm9wLCB2YXJhcmdzKTsKKyAgdmFfZW5kICh2YXJhcmdzKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdmlkZW9iYWxhbmNlKQoreworICBjaGVja19maWx0ZXIgKCJ2aWRlb2JhbGFuY2UiLCAyLCBOVUxMKTsKKyAgY2hlY2tfZmlsdGVyICgidmlkZW9iYWxhbmNlIiwgMiwgInNhdHVyYXRpb24iLCAwLjUsICJodWUiLCAwLjgsIE5VTEwpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdmlkZW9mbGlwKQoreworICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgLyogdGhlc2Ugd2UgY2FuIGhhbmRsZSB3aXRoIHRoZSBjYXBzICovCisgIGNoZWNrX2ZpbHRlciAoInZpZGVvZmxpcCIsIDIsICJtZXRob2QiLCAwLCBOVUxMKTsKKyAgY2hlY2tfZmlsdGVyICgidmlkZW9mbGlwIiwgMiwgIm1ldGhvZCIsIDIsIE5VTEwpOworICBjaGVja19maWx0ZXIgKCJ2aWRlb2ZsaXAiLCAyLCAibWV0aG9kIiwgNCwgTlVMTCk7CisgIGNoZWNrX2ZpbHRlciAoInZpZGVvZmxpcCIsIDIsICJtZXRob2QiLCA1LCBOVUxMKTsKKworICBldmVudCA9IGdzdF9ldmVudF9uZXdfdGFnIChnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpKTsKKyAgY2hlY2tfZmlsdGVyX3dpdGhfZXZlbnQgKCJ2aWRlb2ZsaXAiLCBldmVudCwgMiwgIm1ldGhvZCIsIDgsIE5VTEwpOworCisgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld190YWcgKGdzdF90YWdfbGlzdF9uZXcgKEdTVF9UQUdfSU1BR0VfT1JJRU5UQVRJT04sCisgICAgICAgICAgInJvdGF0ZS0xODAiLCBOVUxMKSk7CisgIGNoZWNrX2ZpbHRlcl93aXRoX2V2ZW50ICgidmlkZW9mbGlwIiwgZXZlbnQsIDIsICJtZXRob2QiLCA4LCBOVUxMKTsKKworICBldmVudCA9IGdzdF9ldmVudF9uZXdfdGFnIChnc3RfdGFnX2xpc3RfbmV3IChHU1RfVEFHX0lNQUdFX09SSUVOVEFUSU9OLAorICAgICAgICAgICJpbnZhbGlkIiwgTlVMTCkpOworICBjaGVja19maWx0ZXJfd2l0aF9ldmVudCAoInZpZGVvZmxpcCIsIGV2ZW50LCAyLCAibWV0aG9kIiwgOCwgTlVMTCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZ2FtbWEpCit7CisgIGNoZWNrX2ZpbHRlciAoImdhbW1hIiwgMiwgTlVMTCk7CisgIGNoZWNrX2ZpbHRlciAoImdhbW1hIiwgMiwgImdhbW1hIiwgMi4wLCBOVUxMKTsKK30KKworR1NUX0VORF9URVNUOworCisKK3N0YXRpYyBTdWl0ZSAqCit2aWRlb2ZpbHRlcl9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJ2aWRlb2ZpbHRlciIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF92aWRlb2JhbGFuY2UpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdmlkZW9mbGlwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhbW1hKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHZpZGVvZmlsdGVyKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvbWl4ZXIuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvbWl4ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjhkMWZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9taXhlci5jCkBAIC0wLDAgKzEsMTA3MSBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciB2aWRlbWl4ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDEzPiBUaGliYXVsdCBTYXVuaWVyIDx0aGliYXVsdC5zYXVuaWVyQGNvbGxhYm9yYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVkFMR1JJTkQKKyMgaW5jbHVkZSA8dmFsZ3JpbmQvdmFsZ3JpbmQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y29uc2lzdGVuY3ljaGVja2VyLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXNyYy5oPgorCisjZGVmaW5lIFZJREVPX0NBUFNfU1RSSU5HICAgICAgICAgICAgICAgXAorICAgICJ2aWRlby94LXJhdywgIiAgICAgICAgICAgICAgICAgXAorICAgICJ3aWR0aCA9IChpbnQpIDMyMCwgIiAgICAgICAgICAgICAgIFwKKyAgICAiaGVpZ2h0ID0gKGludCkgMjQwLCAiICAgICAgICAgICAgICBcCisgICAgImZyYW1lcmF0ZSA9IChmcmFjdGlvbikgMjUvMSAsICIgICAgXAorICAgICJmb3JtYXQgPSAoc3RyaW5nKSBJNDIwIgorCitzdGF0aWMgR01haW5Mb29wICptYWluX2xvb3A7CisKKy8qIG1ha2Ugc3VyZSBkb3duc3RyZWFtIGdldHMgYSBDQVBTIGV2ZW50IGJlZm9yZSBidWZmZXJzIGFyZSBzZW50ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF9jYXBzKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZSwgKnNyYywgKnZpZGVvbWl4ZXIsICpzaW5rOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiBzdGF0ZV9yZXM7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdFBhZCAqcGFkOworCisgIC8qIGJ1aWxkIHBpcGVsaW5lICovCisgIHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisKKyAgc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgInNyYzEiKTsKKyAgdmlkZW9taXhlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvbWl4ZXIiLCAidmlkZW9taXhlciIpOworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAic2luayIpOworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHNyYywgdmlkZW9taXhlciwgc2luaywgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmtfbWFueSAoc3JjLCB2aWRlb21peGVyLCBzaW5rLCBOVUxMKSk7CisKKyAgLyogcHJlcGFyZSBwbGF5aW5nICovCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QQVVTRUQpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfQVNZTkMpOworCisgIC8qIHdhaXQgZm9yIHByZXJvbGwgKi8KKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChwaXBlbGluZSwgTlVMTCwgTlVMTCwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICAvKiBjaGVjayBjYXBzIG9uIGZha2VzaW5rICovCisgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzaW5rLCAic2luayIpOworICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChwYWQpOworICBmYWlsX3VubGVzcyAoY2FwcyAhPSBOVUxMKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyB2b2lkCittZXNzYWdlX3JlY2VpdmVkIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBHc3RQaXBlbGluZSAqIGJpbikKK3sKKyAgR1NUX0lORk8gKCJidXMgbWVzc2FnZSBmcm9tIFwiJSIgR1NUX1BUUl9GT1JNQVQgIlwiOiAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSksIG1lc3NhZ2UpOworCisgIHN3aXRjaCAobWVzc2FnZS0+dHlwZSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfRU9TOgorICAgICAgZ19tYWluX2xvb3BfcXVpdCAobWFpbl9sb29wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01FU1NBR0VfV0FSTklORzp7CisgICAgICBHRXJyb3IgKmdlcnJvcjsKKyAgICAgIGdjaGFyICpkZWJ1ZzsKKworICAgICAgZ3N0X21lc3NhZ2VfcGFyc2Vfd2FybmluZyAobWVzc2FnZSwgJmdlcnJvciwgJmRlYnVnKTsKKyAgICAgIGdzdF9vYmplY3RfZGVmYXVsdF9lcnJvciAoR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKSwgZ2Vycm9yLCBkZWJ1Zyk7CisgICAgICBnX2Vycm9yX2ZyZWUgKGdlcnJvcik7CisgICAgICBnX2ZyZWUgKGRlYnVnKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VSUk9SOnsKKyAgICAgIEdFcnJvciAqZ2Vycm9yOworICAgICAgZ2NoYXIgKmRlYnVnOworCisgICAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobWVzc2FnZSwgJmdlcnJvciwgJmRlYnVnKTsKKyAgICAgIGdzdF9vYmplY3RfZGVmYXVsdF9lcnJvciAoR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKSwgZ2Vycm9yLCBkZWJ1Zyk7CisgICAgICBnX2Vycm9yX2ZyZWUgKGdlcnJvcik7CisgICAgICBnX2ZyZWUgKGRlYnVnKTsKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKG1haW5fbG9vcCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKKworc3RhdGljIEdzdEZvcm1hdCBmb3JtYXQgPSBHU1RfRk9STUFUX1VOREVGSU5FRDsKK3N0YXRpYyBnaW50NjQgcG9zaXRpb24gPSAtMTsKKworc3RhdGljIHZvaWQKK3Rlc3RfZXZlbnRfbWVzc2FnZV9yZWNlaXZlZCAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwKKyAgICBHc3RQaXBlbGluZSAqIGJpbikKK3sKKyAgR1NUX0lORk8gKCJidXMgbWVzc2FnZSBmcm9tIFwiJSIgR1NUX1BUUl9GT1JNQVQgIlwiOiAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSksIG1lc3NhZ2UpOworCisgIHN3aXRjaCAobWVzc2FnZS0+dHlwZSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfU0VHTUVOVF9ET05FOgorICAgICAgZ3N0X21lc3NhZ2VfcGFyc2Vfc2VnbWVudF9kb25lIChtZXNzYWdlLCAmZm9ybWF0LCAmcG9zaXRpb24pOworICAgICAgR1NUX0lORk8gKCJyZWNlaXZlZCBzZWdtZW50X2RvbmUgOiAlIiBHX0dJTlQ2NF9GT1JNQVQsIHBvc2l0aW9uKTsKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKG1haW5fbG9vcCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICBicmVhazsKKyAgfQorfQorCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2V2ZW50KQoreworICBHc3RFbGVtZW50ICpiaW4sICpzcmMxLCAqc3JjMiwgKnZpZGVvbWl4ZXIsICpzaW5rOworICBHc3RCdXMgKmJ1czsKKyAgR3N0RXZlbnQgKnNlZWtfZXZlbnQ7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHN0YXRlX3JlczsKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RQYWQgKnNyY3BhZCwgKnNpbmtwYWQ7CisgIEdzdFN0cmVhbUNvbnNpc3RlbmN5ICpjaGtfMSwgKmNoa18yLCAqY2hrXzM7CisKKyAgR1NUX0lORk8gKCJwcmVwYXJpbmcgdGVzdCIpOworCisgIC8qIGJ1aWxkIHBpcGVsaW5lICovCisgIGJpbiA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChiaW4pOworICBnc3RfYnVzX2FkZF9zaWduYWxfd2F0Y2hfZnVsbCAoYnVzLCBHX1BSSU9SSVRZX0hJR0gpOworCisgIHNyYzEgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCAic3JjMSIpOworICBzcmMyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgInNyYzIiKTsKKyAgdmlkZW9taXhlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvbWl4ZXIiLCAidmlkZW9taXhlciIpOworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAic2luayIpOworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChiaW4pLCBzcmMxLCBzcmMyLCB2aWRlb21peGVyLCBzaW5rLCBOVUxMKTsKKworICByZXMgPSBnc3RfZWxlbWVudF9saW5rIChzcmMxLCB2aWRlb21peGVyKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGluayAoc3JjMiwgdmlkZW9taXhlcik7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmsgKHZpZGVvbWl4ZXIsIHNpbmspOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworCisgIHNyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkICh2aWRlb21peGVyLCAic3JjIik7CisgIGNoa18zID0gZ3N0X2NvbnNpc3RlbmN5X2NoZWNrZXJfbmV3IChzcmNwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworCisgIC8qIGNyZWF0ZSBjb25zaXN0ZW5jeSBjaGVja2VycyBmb3IgdGhlIHBhZHMgKi8KKyAgc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNyYzEsICJzcmMiKTsKKyAgY2hrXzEgPSBnc3RfY29uc2lzdGVuY3lfY2hlY2tlcl9uZXcgKHNyY3BhZCk7CisgIHNpbmtwYWQgPSBnc3RfcGFkX2dldF9wZWVyIChzcmNwYWQpOworICBnc3RfY29uc2lzdGVuY3lfY2hlY2tlcl9hZGRfcGFkIChjaGtfMywgc2lua3BhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworCisgIHNyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzcmMyLCAic3JjIik7CisgIGNoa18yID0gZ3N0X2NvbnNpc3RlbmN5X2NoZWNrZXJfbmV3IChzcmNwYWQpOworICBzaW5rcGFkID0gZ3N0X3BhZF9nZXRfcGVlciAoc3JjcGFkKTsKKyAgZ3N0X2NvbnNpc3RlbmN5X2NoZWNrZXJfYWRkX3BhZCAoY2hrXzMsIHNpbmtwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKworICBzZWVrX2V2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWVrICgxLjAsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgIEdTVF9TRUVLX0ZMQUdfU0VHTUVOVCB8IEdTVF9TRUVLX0ZMQUdfRkxVU0gsCisgICAgICBHU1RfU0VFS19UWVBFX1NFVCwgKEdzdENsb2NrVGltZSkgMCwKKyAgICAgIEdTVF9TRUVLX1RZUEVfU0VULCAoR3N0Q2xvY2tUaW1lKSAyICogR1NUX1NFQ09ORCk7CisKKyAgZm9ybWF0ID0gR1NUX0ZPUk1BVF9VTkRFRklORUQ7CisgIHBvc2l0aW9uID0gLTE7CisKKyAgbWFpbl9sb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OnNlZ21lbnQtZG9uZSIsCisgICAgICAoR0NhbGxiYWNrKSB0ZXN0X2V2ZW50X21lc3NhZ2VfcmVjZWl2ZWQsIGJpbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OmVycm9yIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwgYmluKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6d2FybmluZyIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsIGJpbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OmVvcyIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsIGJpbik7CisKKyAgR1NUX0lORk8gKCJzdGFydGluZyB0ZXN0Iik7CisKKyAgLyogcHJlcGFyZSBwbGF5aW5nICovCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIC8qIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChiaW4sIE5VTEwsIE5VTEwsIEdTVF9DTE9DS19USU1FX05PTkUpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgcmVzID0gZ3N0X2VsZW1lbnRfc2VuZF9ldmVudCAoYmluLCBzZWVrX2V2ZW50KTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKworICAvKiBydW4gcGlwZWxpbmUgKi8KKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIEdTVF9JTkZPICgicnVubmluZyBtYWluIGxvb3AiKTsKKyAgZ19tYWluX2xvb3BfcnVuIChtYWluX2xvb3ApOworCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfTlVMTCk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBja19hc3NlcnRfaW50X2VxIChwb3NpdGlvbiwgMiAqIEdTVF9TRUNPTkQpOworCisgIC8qIGNsZWFudXAgKi8KKyAgZ19tYWluX2xvb3BfdW5yZWYgKG1haW5fbG9vcCk7CisgIGdzdF9jb25zaXN0ZW5jeV9jaGVja2VyX2ZyZWUgKGNoa18xKTsKKyAgZ3N0X2NvbnNpc3RlbmN5X2NoZWNrZXJfZnJlZSAoY2hrXzIpOworICBnc3RfY29uc2lzdGVuY3lfY2hlY2tlcl9mcmVlIChjaGtfMyk7CisgIGdzdF9idXNfcmVtb3ZlX3NpZ25hbF93YXRjaCAoYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYmluKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgZ3VpbnQgcGxheV9jb3VudCA9IDA7CitzdGF0aWMgR3N0RXZlbnQgKnBsYXlfc2Vla19ldmVudCA9IE5VTEw7CisKK3N0YXRpYyB2b2lkCit0ZXN0X3BsYXlfdHdpY2VfbWVzc2FnZV9yZWNlaXZlZCAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwKKyAgICBHc3RQaXBlbGluZSAqIGJpbikKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiBzdGF0ZV9yZXM7CisKKyAgR1NUX0lORk8gKCJidXMgbWVzc2FnZSBmcm9tIFwiJSIgR1NUX1BUUl9GT1JNQVQgIlwiOiAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSksIG1lc3NhZ2UpOworCisgIHN3aXRjaCAobWVzc2FnZS0+dHlwZSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfU0VHTUVOVF9ET05FOgorICAgICAgcGxheV9jb3VudCsrOworICAgICAgaWYgKHBsYXlfY291bnQgPT0gMSkgeworICAgICAgICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKEdTVF9FTEVNRU5UIChiaW4pLCBHU1RfU1RBVEVfUkVBRFkpOworICAgICAgICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgICAgICAgLyogcHJlcGFyZSBwbGF5aW5nIGFnYWluICovCisgICAgICAgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoR1NUX0VMRU1FTlQgKGJpbiksIEdTVF9TVEFURV9QQVVTRUQpOworICAgICAgICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgICAgICAgLyogd2FpdCBmb3IgY29tcGxldGlvbiAqLworICAgICAgICBzdGF0ZV9yZXMgPQorICAgICAgICAgICAgZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChHU1RfRUxFTUVOVCAoYmluKSwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgIEdTVF9DTE9DS19USU1FX05PTkUpOworICAgICAgICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgICAgICAgcmVzID0gZ3N0X2VsZW1lbnRfc2VuZF9ldmVudCAoR1NUX0VMRU1FTlQgKGJpbiksCisgICAgICAgICAgICBnc3RfZXZlbnRfcmVmIChwbGF5X3NlZWtfZXZlbnQpKTsKKyAgICAgICAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKworICAgICAgICBzdGF0ZV9yZXMgPQorICAgICAgICAgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChHU1RfRUxFTUVOVCAoYmluKSwgR1NUX1NUQVRFX1BMQVlJTkcpOworICAgICAgICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBnX21haW5fbG9vcF9xdWl0IChtYWluX2xvb3ApOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgYnJlYWs7CisgIH0KK30KKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wbGF5X3R3aWNlKQoreworICBHc3RFbGVtZW50ICpiaW4sICpzcmMxLCAqc3JjMiwgKnZpZGVvbWl4ZXIsICpzaW5rOworICBHc3RCdXMgKmJ1czsKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiBzdGF0ZV9yZXM7CisgIEdzdFBhZCAqc3JjcGFkOworICBHc3RTdHJlYW1Db25zaXN0ZW5jeSAqY29uc2lzdDsKKworICBHU1RfSU5GTyAoInByZXBhcmluZyB0ZXN0Iik7CisKKyAgLyogYnVpbGQgcGlwZWxpbmUgKi8KKyAgYmluID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKGJpbik7CisgIGdzdF9idXNfYWRkX3NpZ25hbF93YXRjaF9mdWxsIChidXMsIEdfUFJJT1JJVFlfSElHSCk7CisKKyAgc3JjMSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsICJzcmMxIik7CisgIHNyYzIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCAic3JjMiIpOworICB2aWRlb21peGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW9taXhlciIsICJ2aWRlb21peGVyIik7CisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsICJzaW5rIik7CisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKGJpbiksIHNyYzEsIHNyYzIsIHZpZGVvbWl4ZXIsIHNpbmssIE5VTEwpOworCisgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmsgKHNyYzEsIHZpZGVvbWl4ZXIpOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworICByZXMgPSBnc3RfZWxlbWVudF9saW5rIChzcmMyLCB2aWRlb21peGVyKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGluayAodmlkZW9taXhlciwgc2luayk7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisKKyAgc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHZpZGVvbWl4ZXIsICJzcmMiKTsKKyAgY29uc2lzdCA9IGdzdF9jb25zaXN0ZW5jeV9jaGVja2VyX25ldyAoc3JjcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKworICBwbGF5X3NlZWtfZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZWsgKDEuMCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgR1NUX1NFRUtfRkxBR19TRUdNRU5UIHwgR1NUX1NFRUtfRkxBR19GTFVTSCwKKyAgICAgIEdTVF9TRUVLX1RZUEVfU0VULCAoR3N0Q2xvY2tUaW1lKSAwLAorICAgICAgR1NUX1NFRUtfVFlQRV9TRVQsIChHc3RDbG9ja1RpbWUpIDIgKiBHU1RfU0VDT05EKTsKKworICBwbGF5X2NvdW50ID0gMDsKKworICBtYWluX2xvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIEZBTFNFKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6c2VnbWVudC1kb25lIiwKKyAgICAgIChHQ2FsbGJhY2spIHRlc3RfcGxheV90d2ljZV9tZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjplcnJvciIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsIGJpbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6Ondhcm5pbmciLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjplb3MiLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworCisgIEdTVF9JTkZPICgic3RhcnRpbmcgdGVzdCIpOworCisgIC8qIHByZXBhcmUgcGxheWluZyAqLworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX1BBVVNFRCk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICAvKiB3YWl0IGZvciBjb21wbGV0aW9uICovCisgIHN0YXRlX3JlcyA9CisgICAgICBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKEdTVF9FTEVNRU5UIChiaW4pLCBOVUxMLCBOVUxMLAorICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICByZXMgPSBnc3RfZWxlbWVudF9zZW5kX2V2ZW50IChiaW4sIGdzdF9ldmVudF9yZWYgKHBsYXlfc2Vla19ldmVudCkpOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworCisgIEdTVF9JTkZPICgic2Vla2VkIik7CisKKyAgLyogcnVuIHBpcGVsaW5lICovCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBnX21haW5fbG9vcF9ydW4gKG1haW5fbG9vcCk7CisKKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9OVUxMKTsKKyAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIGNrX2Fzc2VydF9pbnRfZXEgKHBsYXlfY291bnQsIDIpOworCisgIC8qIGNsZWFudXAgKi8KKyAgZ19tYWluX2xvb3BfdW5yZWYgKG1haW5fbG9vcCk7CisgIGdzdF9jb25zaXN0ZW5jeV9jaGVja2VyX2ZyZWUgKGNvbnNpc3QpOworICBnc3RfZXZlbnRfdW5yZWYgKHBsYXlfc2Vla19ldmVudCk7CisgIGdzdF9idXNfcmVtb3ZlX3NpZ25hbF93YXRjaCAoYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYmluKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wbGF5X3R3aWNlX3RoZW5fYWRkX2FuZF9wbGF5X2FnYWluKQoreworICBHc3RFbGVtZW50ICpiaW4sICpzcmMxLCAqc3JjMiwgKnNyYzMsICp2aWRlb21peGVyLCAqc2luazsKKyAgR3N0QnVzICpidXM7CisgIGdib29sZWFuIHJlczsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3RhdGVfcmVzOworICBnaW50IGk7CisgIEdzdFBhZCAqc3JjcGFkOworICBHc3RTdHJlYW1Db25zaXN0ZW5jeSAqY29uc2lzdDsKKworICBHU1RfSU5GTyAoInByZXBhcmluZyB0ZXN0Iik7CisKKyAgLyogYnVpbGQgcGlwZWxpbmUgKi8KKyAgYmluID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKGJpbik7CisgIGdzdF9idXNfYWRkX3NpZ25hbF93YXRjaF9mdWxsIChidXMsIEdfUFJJT1JJVFlfSElHSCk7CisKKyAgc3JjMSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsICJzcmMxIik7CisgIHNyYzIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCAic3JjMiIpOworICB2aWRlb21peGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW9taXhlciIsICJ2aWRlb21peGVyIik7CisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsICJzaW5rIik7CisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKGJpbiksIHNyYzEsIHNyYzIsIHZpZGVvbWl4ZXIsIHNpbmssIE5VTEwpOworCisgIHNyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkICh2aWRlb21peGVyLCAic3JjIik7CisgIGNvbnNpc3QgPSBnc3RfY29uc2lzdGVuY3lfY2hlY2tlcl9uZXcgKHNyY3BhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisKKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGluayAoc3JjMSwgdmlkZW9taXhlcik7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmsgKHNyYzIsIHZpZGVvbWl4ZXIpOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworICByZXMgPSBnc3RfZWxlbWVudF9saW5rICh2aWRlb21peGVyLCBzaW5rKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKworICBwbGF5X3NlZWtfZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZWsgKDEuMCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgR1NUX1NFRUtfRkxBR19TRUdNRU5UIHwgR1NUX1NFRUtfRkxBR19GTFVTSCwKKyAgICAgIEdTVF9TRUVLX1RZUEVfU0VULCAoR3N0Q2xvY2tUaW1lKSAwLAorICAgICAgR1NUX1NFRUtfVFlQRV9TRVQsIChHc3RDbG9ja1RpbWUpIDIgKiBHU1RfU0VDT05EKTsKKworICBtYWluX2xvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIEZBTFNFKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6c2VnbWVudC1kb25lIiwKKyAgICAgIChHQ2FsbGJhY2spIHRlc3RfcGxheV90d2ljZV9tZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjplcnJvciIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsIGJpbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6Ondhcm5pbmciLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjplb3MiLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworCisgIC8qIHJ1biBpdCB0d2ljZSAqLworICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgcGxheV9jb3VudCA9IDA7CisKKyAgICBHU1RfSU5GTyAoInN0YXJ0aW5nIHRlc3QtbG9vcCAlZCIsIGkpOworCisgICAgLyogcHJlcGFyZSBwbGF5aW5nICovCisgICAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9QQVVTRUQpOworICAgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICAgIC8qIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKyAgICBzdGF0ZV9yZXMgPQorICAgICAgICBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKEdTVF9FTEVNRU5UIChiaW4pLCBOVUxMLCBOVUxMLAorICAgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKyAgICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgICByZXMgPSBnc3RfZWxlbWVudF9zZW5kX2V2ZW50IChiaW4sIGdzdF9ldmVudF9yZWYgKHBsYXlfc2Vla19ldmVudCkpOworICAgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisKKyAgICBHU1RfSU5GTyAoInNlZWtlZCIpOworCisgICAgLyogcnVuIHBpcGVsaW5lICovCisgICAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgICBnX21haW5fbG9vcF9ydW4gKG1haW5fbG9vcCk7CisKKyAgICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX1JFQURZKTsKKyAgICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgICBja19hc3NlcnRfaW50X2VxIChwbGF5X2NvdW50LCAyKTsKKworICAgIC8qIHBsdWcgYW5vdGhlciBzb3VyY2UgKi8KKyAgICBpZiAoaSA9PSAwKSB7CisgICAgICBzcmMzID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgInNyYzMiKTsKKyAgICAgIGdzdF9iaW5fYWRkIChHU1RfQklOIChiaW4pLCBzcmMzKTsKKworICAgICAgcmVzID0gZ3N0X2VsZW1lbnRfbGluayAoc3JjMywgdmlkZW9taXhlcik7CisgICAgICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworICAgIH0KKworICAgIGdzdF9jb25zaXN0ZW5jeV9jaGVja2VyX3Jlc2V0IChjb25zaXN0KTsKKyAgfQorCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfTlVMTCk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICAvKiBjbGVhbnVwICovCisgIGdfbWFpbl9sb29wX3VucmVmIChtYWluX2xvb3ApOworICBnc3RfZXZlbnRfdW5yZWYgKHBsYXlfc2Vla19ldmVudCk7CisgIGdzdF9jb25zaXN0ZW5jeV9jaGVja2VyX2ZyZWUgKGNvbnNpc3QpOworICBnc3RfYnVzX3JlbW92ZV9zaWduYWxfd2F0Y2ggKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJpbik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogY2hlY2sgaWYgYWRkaW5nIHBhZHMgd29yayBhcyBleHBlY3RlZCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYWRkX3BhZCkKK3sKKyAgR3N0RWxlbWVudCAqYmluLCAqc3JjMSwgKnNyYzIsICp2aWRlb21peGVyLCAqc2luazsKKyAgR3N0QnVzICpidXM7CisgIEdzdFBhZCAqc3JjcGFkOworICBnYm9vbGVhbiByZXM7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHN0YXRlX3JlczsKKworICBHU1RfSU5GTyAoInByZXBhcmluZyB0ZXN0Iik7CisKKyAgLyogYnVpbGQgcGlwZWxpbmUgKi8KKyAgYmluID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKGJpbik7CisgIGdzdF9idXNfYWRkX3NpZ25hbF93YXRjaF9mdWxsIChidXMsIEdfUFJJT1JJVFlfSElHSCk7CisKKyAgc3JjMSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsICJzcmMxIik7CisgIGdfb2JqZWN0X3NldCAoc3JjMSwgIm51bS1idWZmZXJzIiwgNCwgTlVMTCk7CisgIHNyYzIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCAic3JjMiIpOworICAvKiBvbmUgYnVmZmVyIGxlc3MsIHdlIGNvbm5lY3Qgd2l0aCAxIGJ1ZmZlciBvZiBkZWxheSAqLworICBnX29iamVjdF9zZXQgKHNyYzIsICJudW0tYnVmZmVycyIsIDMsIE5VTEwpOworICB2aWRlb21peGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW9taXhlciIsICJ2aWRlb21peGVyIik7CisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsICJzaW5rIik7CisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKGJpbiksIHNyYzEsIHZpZGVvbWl4ZXIsIHNpbmssIE5VTEwpOworCisgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmsgKHNyYzEsIHZpZGVvbWl4ZXIpOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworICByZXMgPSBnc3RfZWxlbWVudF9saW5rICh2aWRlb21peGVyLCBzaW5rKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKworICBzcmNwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAodmlkZW9taXhlciwgInNyYyIpOworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworCisgIG1haW5fbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgRkFMU0UpOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjpzZWdtZW50LWRvbmUiLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLAorICAgICAgYmluKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6ZXJyb3IiLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjp3YXJuaW5nIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwgYmluKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6ZW9zIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwgYmluKTsKKworICBHU1RfSU5GTyAoInN0YXJ0aW5nIHRlc3QiKTsKKworICAvKiBwcmVwYXJlIHBsYXlpbmcgKi8KKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9QQVVTRUQpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgLyogd2FpdCBmb3IgY29tcGxldGlvbiAqLworICBzdGF0ZV9yZXMgPQorICAgICAgZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChHU1RfRUxFTUVOVCAoYmluKSwgTlVMTCwgTlVMTCwKKyAgICAgIEdTVF9DTE9DS19USU1FX05PTkUpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgLyogYWRkIG90aGVyIGVsZW1lbnQgKi8KKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAoYmluKSwgc3JjMiwgTlVMTCk7CisKKyAgLyogbm93IGxpbmsgdGhlIHNlY29uZCBlbGVtZW50ICovCisgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmsgKHNyYzIsIHZpZGVvbWl4ZXIpOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworCisgIC8qIHNldCB0byBQQVVTRUQgYXMgd2VsbCAqLworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNyYzIsIEdTVF9TVEFURV9QQVVTRUQpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgLyogbm93IHBsYXkgYWxsICovCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBnX21haW5fbG9vcF9ydW4gKG1haW5fbG9vcCk7CisKKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9OVUxMKTsKKyAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIC8qIGNsZWFudXAgKi8KKyAgZ19tYWluX2xvb3BfdW5yZWYgKG1haW5fbG9vcCk7CisgIGdzdF9idXNfcmVtb3ZlX3NpZ25hbF93YXRjaCAoYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYmluKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBjaGVjayBpZiByZW1vdmluZyBwYWRzIHdvcmsgYXMgZXhwZWN0ZWQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3JlbW92ZV9wYWQpCit7CisgIEdzdEVsZW1lbnQgKmJpbiwgKnNyYywgKnZpZGVvbWl4ZXIsICpzaW5rOworICBHc3RCdXMgKmJ1czsKKyAgR3N0UGFkICpwYWQsICpzcmNwYWQ7CisgIGdib29sZWFuIHJlczsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3RhdGVfcmVzOworCisgIEdTVF9JTkZPICgicHJlcGFyaW5nIHRlc3QiKTsKKworICAvKiBidWlsZCBwaXBlbGluZSAqLworICBiaW4gPSBnc3RfcGlwZWxpbmVfbmV3ICgicGlwZWxpbmUiKTsKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAoYmluKTsKKyAgZ3N0X2J1c19hZGRfc2lnbmFsX3dhdGNoX2Z1bGwgKGJ1cywgR19QUklPUklUWV9ISUdIKTsKKworICBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCAic3JjIik7CisgIGdfb2JqZWN0X3NldCAoc3JjLCAibnVtLWJ1ZmZlcnMiLCA0LCBOVUxMKTsKKyAgdmlkZW9taXhlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvbWl4ZXIiLCAidmlkZW9taXhlciIpOworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAic2luayIpOworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChiaW4pLCBzcmMsIHZpZGVvbWl4ZXIsIHNpbmssIE5VTEwpOworCisgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmsgKHNyYywgdmlkZW9taXhlcik7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmsgKHZpZGVvbWl4ZXIsIHNpbmspOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworCisgIC8qIGNyZWF0ZSBhbiB1bmNvbm5lY3RlZCBzaW5rcGFkIGluIHZpZGVvbWl4ZXIgKi8KKyAgcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkICh2aWRlb21peGVyLCAic2lua18ldSIpOworICBmYWlsX2lmIChwYWQgPT0gTlVMTCwgTlVMTCk7CisKKyAgc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHZpZGVvbWl4ZXIsICJzcmMiKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKworICBtYWluX2xvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIEZBTFNFKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6c2VnbWVudC1kb25lIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwKKyAgICAgIGJpbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OmVycm9yIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwgYmluKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6d2FybmluZyIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsIGJpbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OmVvcyIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsIGJpbik7CisKKyAgR1NUX0lORk8gKCJzdGFydGluZyB0ZXN0Iik7CisKKyAgLyogcHJlcGFyZSBwbGF5aW5nLCB0aGlzIHdpbGwgbm90IHByZXJvbGwgYXMgdmlkZW9taXhlciBpcyB3YWl0aW5nCisgICAqIG9uIHRoZSB1bmNvbm5lY3RlZCBzaW5rcGFkLiAqLworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX1BBVVNFRCk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICAvKiB3YWl0IGZvciBjb21wbGV0aW9uIGZvciBvbmUgc2Vjb25kLCB3aWxsIHJldHVybiBBU1lOQyAqLworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKEdTVF9FTEVNRU5UIChiaW4pLCBOVUxMLCBOVUxMLCBHU1RfU0VDT05EKTsKKyAgY2tfYXNzZXJ0X2ludF9lcSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0FTWU5DKTsKKworICAvKiBnZXQgcmlkIG9mIHRoZSBwYWQgbm93LCB2aWRlb21peGVyIHNob3VsZCBzdG9wIHdhaXRpbmcgb24gaXQgYW5kCisgICAqIGNvbnRpbnVlIHRoZSBwcmVyb2xsICovCisgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKHZpZGVvbWl4ZXIsIHBhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisKKyAgLyogd2FpdCBmb3IgY29tcGxldGlvbiwgc2hvdWxkIHdvcmsgbm93ICovCisgIHN0YXRlX3JlcyA9CisgICAgICBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKEdTVF9FTEVNRU5UIChiaW4pLCBOVUxMLCBOVUxMLAorICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICAvKiBub3cgcGxheSBhbGwgKi8KKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIGdfbWFpbl9sb29wX3J1biAobWFpbl9sb29wKTsKKworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX05VTEwpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgLyogY2xlYW51cCAqLworICBnX21haW5fbG9vcF91bnJlZiAobWFpbl9sb29wKTsKKyAgZ3N0X2J1c19yZW1vdmVfc2lnbmFsX3dhdGNoIChidXMpOworICBnc3Rfb2JqZWN0X3VucmVmIChHX09CSkVDVCAoYnVzKSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKEdfT0JKRUNUIChiaW4pKTsKK30KKworR1NUX0VORF9URVNUOworCisKK3N0YXRpYyBHc3RCdWZmZXIgKmhhbmRvZmZfYnVmZmVyID0gTlVMTDsKK3N0YXRpYyB2b2lkCitoYW5kb2ZmX2J1ZmZlcl9jYiAoR3N0RWxlbWVudCAqIGZha2VzaW5rLCBHc3RCdWZmZXIgKiBidWZmZXIsIEdzdFBhZCAqIHBhZCwKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdTVF9ERUJVRyAoImdvdCBidWZmZXIgJXAiLCBidWZmZXIpOworICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZoYW5kb2ZmX2J1ZmZlciwgYnVmZmVyKTsKK30KKworLyogY2hlY2sgaWYgY2xpcHBpbmcgd29ya3MgYXMgZXhwZWN0ZWQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X2NsaXApCit7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKyAgR3N0RWxlbWVudCAqYmluLCAqdmlkZW9taXhlciwgKnNpbms7CisgIEdzdEJ1cyAqYnVzOworICBHc3RQYWQgKnNpbmtwYWQ7CisgIGdib29sZWFuIHJlczsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3RhdGVfcmVzOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0RXZlbnQgKmV2ZW50OworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBHU1RfSU5GTyAoInByZXBhcmluZyB0ZXN0Iik7CisKKyAgLyogYnVpbGQgcGlwZWxpbmUgKi8KKyAgYmluID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKGJpbik7CisgIGdzdF9idXNfYWRkX3NpZ25hbF93YXRjaF9mdWxsIChidXMsIEdfUFJJT1JJVFlfSElHSCk7CisKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6ZXJyb3IiLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjp3YXJuaW5nIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwgYmluKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6ZW9zIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwgYmluKTsKKworICAvKiBqdXN0IGFuIHZpZGVvbWl4ZXIgYW5kIGEgZmFrZXNpbmsgKi8KKyAgdmlkZW9taXhlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvbWl4ZXIiLCAidmlkZW9taXhlciIpOworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAic2luayIpOworICBnX29iamVjdF9zZXQgKHNpbmssICJzaWduYWwtaGFuZG9mZnMiLCBUUlVFLCBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoc2luaywgImhhbmRvZmYiLCAoR0NhbGxiYWNrKSBoYW5kb2ZmX2J1ZmZlcl9jYiwgTlVMTCk7CisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKGJpbiksIHZpZGVvbWl4ZXIsIHNpbmssIE5VTEwpOworCisgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmsgKHZpZGVvbWl4ZXIsIHNpbmspOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworCisgIC8qIHNldCB0byBwbGF5aW5nICovCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICAvKiBjcmVhdGUgYW4gdW5jb25uZWN0ZWQgc2lua3BhZCBpbiB2aWRlb21peGVyLCBzaG91bGQgYWxzbyBhdXRvbWF0aWNhbGx5IGFjdGl2YXRlCisgICAqIHRoZSBwYWQgKi8KKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAodmlkZW9taXhlciwgInNpbmtfJXUiKTsKKyAgZmFpbF9pZiAoc2lua3BhZCA9PSBOVUxMLCBOVUxMKTsKKworICBnc3RfcGFkX3NlbmRfZXZlbnQgKHNpbmtwYWQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgidGVzdCIpKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKFZJREVPX0NBUFNfU1RSSU5HKTsKKworICBnc3RfcGFkX3NldF9jYXBzIChzaW5rcGFkLCBjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIC8qIHNlbmQgc2VnbWVudCB0byB2aWRlb21peGVyICovCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBzZWdtZW50LnN0YXJ0ID0gR1NUX1NFQ09ORDsKKyAgc2VnbWVudC5zdG9wID0gMiAqIEdTVF9TRUNPTkQ7CisgIHNlZ21lbnQudGltZSA9IDA7CisgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCk7CisgIGdzdF9wYWRfc2VuZF9ldmVudCAoc2lua3BhZCwgZXZlbnQpOworCisgIC8qIHNob3VsZCBiZSBjbGlwcGVkIGFuZCBvayAqLworICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDExNTIwMCk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpID0gMDsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSA9IDI1MCAqIEdTVF9NU0VDT05EOworICBHU1RfREVCVUcgKCJwdXNoaW5nIGJ1ZmZlciAlcCIsIGJ1ZmZlcik7CisgIHJldCA9IGdzdF9wYWRfY2hhaW4gKHNpbmtwYWQsIGJ1ZmZlcik7CisgIGNrX2Fzc2VydF9pbnRfZXEgKHJldCwgR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoaGFuZG9mZl9idWZmZXIgPT0gTlVMTCk7CisKKyAgLyogc2hvdWxkIGJlIHBhcnRpYWxseSBjbGlwcGVkICovCisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTE1MjAwKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcikgPSA5MDAgKiBHU1RfTVNFQ09ORDsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSA9IDI1MCAqIEdTVF9NU0VDT05EOworICBHU1RfREVCVUcgKCJwdXNoaW5nIGJ1ZmZlciAlcCIsIGJ1ZmZlcik7CisgIHJldCA9IGdzdF9wYWRfY2hhaW4gKHNpbmtwYWQsIGJ1ZmZlcik7CisgIGNrX2Fzc2VydF9pbnRfZXEgKHJldCwgR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoaGFuZG9mZl9idWZmZXIgIT0gTlVMTCk7CisgIGdzdF9idWZmZXJfcmVwbGFjZSAoJmhhbmRvZmZfYnVmZmVyLCBOVUxMKTsKKworICAvKiBzaG91bGQgbm90IGJlIGNsaXBwZWQgKi8KKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMTUyMDApOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSA9IDEgKiBHU1RfU0VDT05EOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpID0gMjUwICogR1NUX01TRUNPTkQ7CisgIEdTVF9ERUJVRyAoInB1c2hpbmcgYnVmZmVyICVwIiwgYnVmZmVyKTsKKyAgcmV0ID0gZ3N0X3BhZF9jaGFpbiAoc2lua3BhZCwgYnVmZmVyKTsKKyAgY2tfYXNzZXJ0X2ludF9lcSAocmV0LCBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChoYW5kb2ZmX2J1ZmZlciAhPSBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmaGFuZG9mZl9idWZmZXIsIE5VTEwpOworCisgIC8qIHNob3VsZCBiZSBjbGlwcGVkIGFuZCBvayAqLworICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDExNTIwMCk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpID0gMiAqIEdTVF9TRUNPTkQ7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcikgPSAyNTAgKiBHU1RfTVNFQ09ORDsKKyAgR1NUX0RFQlVHICgicHVzaGluZyBidWZmZXIgJXAiLCBidWZmZXIpOworICByZXQgPSBnc3RfcGFkX2NoYWluIChzaW5rcGFkLCBidWZmZXIpOworICBja19hc3NlcnRfaW50X2VxIChyZXQsIEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGhhbmRvZmZfYnVmZmVyID09IE5VTEwpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX05VTEwpOworICBnc3RfYnVzX3JlbW92ZV9zaWduYWxfd2F0Y2ggKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJpbik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZHVyYXRpb25faXNfbWF4KQoreworICBHc3RFbGVtZW50ICpiaW4sICpzcmNbM10sICp2aWRlb21peGVyLCAqc2luazsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3RhdGVfcmVzOworICBHc3RGb3JtYXQgZm9ybWF0ID0gR1NUX0ZPUk1BVF9USU1FOworICBnYm9vbGVhbiByZXM7CisgIGdpbnQ2NCBkdXJhdGlvbjsKKworICBHU1RfSU5GTyAoInByZXBhcmluZyB0ZXN0Iik7CisKKyAgLyogYnVpbGQgcGlwZWxpbmUgKi8KKyAgYmluID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisKKyAgLyogMyBzb3VyY2VzLCBhbiB2aWRlb21peGVyIGFuZCBhIGZha2VzaW5rICovCisgIHNyY1swXSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsIE5VTEwpOworICBzcmNbMV0gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCBOVUxMKTsKKyAgc3JjWzJdID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgTlVMTCk7CisgIHZpZGVvbWl4ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb21peGVyIiwgInZpZGVvbWl4ZXIiKTsKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgInNpbmsiKTsKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAoYmluKSwgc3JjWzBdLCBzcmNbMV0sIHNyY1syXSwgdmlkZW9taXhlciwgc2luaywKKyAgICAgIE5VTEwpOworCisgIGdzdF9lbGVtZW50X2xpbmsgKHNyY1swXSwgdmlkZW9taXhlcik7CisgIGdzdF9lbGVtZW50X2xpbmsgKHNyY1sxXSwgdmlkZW9taXhlcik7CisgIGdzdF9lbGVtZW50X2xpbmsgKHNyY1syXSwgdmlkZW9taXhlcik7CisgIGdzdF9lbGVtZW50X2xpbmsgKHZpZGVvbWl4ZXIsIHNpbmspOworCisgIC8qIGlya3MsIGR1cmF0aW9uIGlzIHJlc2V0IG9uIGJhc2VzcmMgKi8KKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9QQVVTRUQpOworICBmYWlsX3VubGVzcyAoc3RhdGVfcmVzICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSwgTlVMTCk7CisKKyAgLyogc2V0IGR1cmF0aW9ucyBvbiBzcmMgKi8KKyAgR1NUX0JBU0VfU1JDIChzcmNbMF0pLT5zZWdtZW50LmR1cmF0aW9uID0gMTAwMDsKKyAgR1NUX0JBU0VfU1JDIChzcmNbMV0pLT5zZWdtZW50LmR1cmF0aW9uID0gMzAwMDsKKyAgR1NUX0JBU0VfU1JDIChzcmNbMl0pLT5zZWdtZW50LmR1cmF0aW9uID0gMjAwMDsKKworICAvKiBzZXQgdG8gcGxheWluZyAqLworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBmYWlsX3VubGVzcyAoc3RhdGVfcmVzICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSwgTlVMTCk7CisKKyAgLyogd2FpdCBmb3IgY29tcGxldGlvbiAqLworICBzdGF0ZV9yZXMgPQorICAgICAgZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChHU1RfRUxFTUVOVCAoYmluKSwgTlVMTCwgTlVMTCwKKyAgICAgIEdTVF9DTE9DS19USU1FX05PTkUpOworICBmYWlsX3VubGVzcyAoc3RhdGVfcmVzICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSwgTlVMTCk7CisKKyAgcmVzID0gZ3N0X2VsZW1lbnRfcXVlcnlfZHVyYXRpb24gKEdTVF9FTEVNRU5UIChiaW4pLCBmb3JtYXQsICZkdXJhdGlvbik7CisgIGZhaWxfdW5sZXNzIChyZXMsIE5VTEwpOworCisgIGNrX2Fzc2VydF9pbnRfZXEgKGR1cmF0aW9uLCAzMDAwKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX05VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChiaW4pOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2R1cmF0aW9uX3Vua25vd25fb3ZlcnJpZGVzKQoreworICBHc3RFbGVtZW50ICpiaW4sICpzcmNbM10sICp2aWRlb21peGVyLCAqc2luazsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3RhdGVfcmVzOworICBHc3RGb3JtYXQgZm9ybWF0ID0gR1NUX0ZPUk1BVF9USU1FOworICBnYm9vbGVhbiByZXM7CisgIGdpbnQ2NCBkdXJhdGlvbjsKKworICBHU1RfSU5GTyAoInByZXBhcmluZyB0ZXN0Iik7CisKKyAgLyogYnVpbGQgcGlwZWxpbmUgKi8KKyAgYmluID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisKKyAgLyogMyBzb3VyY2VzLCBhbiB2aWRlb21peGVyIGFuZCBhIGZha2VzaW5rICovCisgIHNyY1swXSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsIE5VTEwpOworICBzcmNbMV0gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCBOVUxMKTsKKyAgc3JjWzJdID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgTlVMTCk7CisgIHZpZGVvbWl4ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb21peGVyIiwgInZpZGVvbWl4ZXIiKTsKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgInNpbmsiKTsKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAoYmluKSwgc3JjWzBdLCBzcmNbMV0sIHNyY1syXSwgdmlkZW9taXhlciwgc2luaywKKyAgICAgIE5VTEwpOworCisgIGdzdF9lbGVtZW50X2xpbmsgKHNyY1swXSwgdmlkZW9taXhlcik7CisgIGdzdF9lbGVtZW50X2xpbmsgKHNyY1sxXSwgdmlkZW9taXhlcik7CisgIGdzdF9lbGVtZW50X2xpbmsgKHNyY1syXSwgdmlkZW9taXhlcik7CisgIGdzdF9lbGVtZW50X2xpbmsgKHZpZGVvbWl4ZXIsIHNpbmspOworCisgIC8qIGlya3MsIGR1cmF0aW9uIGlzIHJlc2V0IG9uIGJhc2VzcmMgKi8KKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9QQVVTRUQpOworICBmYWlsX3VubGVzcyAoc3RhdGVfcmVzICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSwgTlVMTCk7CisKKyAgLyogc2V0IGR1cmF0aW9ucyBvbiBzcmMgKi8KKyAgR1NUX0JBU0VfU1JDIChzcmNbMF0pLT5zZWdtZW50LmR1cmF0aW9uID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgR1NUX0JBU0VfU1JDIChzcmNbMV0pLT5zZWdtZW50LmR1cmF0aW9uID0gMzAwMDsKKyAgR1NUX0JBU0VfU1JDIChzcmNbMl0pLT5zZWdtZW50LmR1cmF0aW9uID0gMjAwMDsKKworICAvKiBzZXQgdG8gcGxheWluZyAqLworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBmYWlsX3VubGVzcyAoc3RhdGVfcmVzICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSwgTlVMTCk7CisKKyAgLyogd2FpdCBmb3IgY29tcGxldGlvbiAqLworICBzdGF0ZV9yZXMgPQorICAgICAgZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChHU1RfRUxFTUVOVCAoYmluKSwgTlVMTCwgTlVMTCwKKyAgICAgIEdTVF9DTE9DS19USU1FX05PTkUpOworICBmYWlsX3VubGVzcyAoc3RhdGVfcmVzICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSwgTlVMTCk7CisKKyAgcmVzID0gZ3N0X2VsZW1lbnRfcXVlcnlfZHVyYXRpb24gKEdTVF9FTEVNRU5UIChiaW4pLCBmb3JtYXQsICZkdXJhdGlvbik7CisgIGZhaWxfdW5sZXNzIChyZXMsIE5VTEwpOworCisgIGNrX2Fzc2VydF9pbnRfZXEgKGR1cmF0aW9uLCBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX05VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChiaW4pOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworc3RhdGljIGdib29sZWFuIGxvb3BlZCA9IEZBTFNFOworCitzdGF0aWMgdm9pZAorbG9vcF9zZWdtZW50X2RvbmUgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsIEdzdEVsZW1lbnQgKiBiaW4pCit7CisgIEdTVF9JTkZPICgiYnVzIG1lc3NhZ2UgZnJvbSBcIiUiIEdTVF9QVFJfRk9STUFUICJcIjogJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpLCBtZXNzYWdlKTsKKworICBpZiAobG9vcGVkKSB7CisgICAgZ19tYWluX2xvb3BfcXVpdCAobWFpbl9sb29wKTsKKyAgfSBlbHNlIHsKKyAgICBHc3RFdmVudCAqc2Vla19ldmVudDsKKyAgICBnYm9vbGVhbiByZXM7CisKKyAgICBzZWVrX2V2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWVrICgxLjAsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgR1NUX1NFRUtfRkxBR19TRUdNRU5ULAorICAgICAgICBHU1RfU0VFS19UWVBFX1NFVCwgKEdzdENsb2NrVGltZSkgMCwKKyAgICAgICAgR1NUX1NFRUtfVFlQRV9TRVQsIChHc3RDbG9ja1RpbWUpIDEgKiBHU1RfU0VDT05EKTsKKworICAgIHJlcyA9IGdzdF9lbGVtZW50X3NlbmRfZXZlbnQgKGJpbiwgc2Vla19ldmVudCk7CisgICAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgICBsb29wZWQgPSBUUlVFOworICB9Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2xvb3ApCit7CisgIEdzdEVsZW1lbnQgKmJpbiwgKnNyYzEsICpzcmMyLCAqdmlkZW9taXhlciwgKnNpbms7CisgIEdzdEJ1cyAqYnVzOworICBHc3RFdmVudCAqc2Vla19ldmVudDsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3RhdGVfcmVzOworICBnYm9vbGVhbiByZXM7CisKKyAgR1NUX0lORk8gKCJwcmVwYXJpbmcgdGVzdCIpOworCisgIC8qIGJ1aWxkIHBpcGVsaW5lICovCisgIGJpbiA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChiaW4pOworICBnc3RfYnVzX2FkZF9zaWduYWxfd2F0Y2hfZnVsbCAoYnVzLCBHX1BSSU9SSVRZX0hJR0gpOworCisgIHNyYzEgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCAic3JjMSIpOworICBzcmMyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgInNyYzIiKTsKKyAgdmlkZW9taXhlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvbWl4ZXIiLCAidmlkZW9taXhlciIpOworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAic2luayIpOworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChiaW4pLCBzcmMxLCBzcmMyLCB2aWRlb21peGVyLCBzaW5rLCBOVUxMKTsKKworICByZXMgPSBnc3RfZWxlbWVudF9saW5rIChzcmMxLCB2aWRlb21peGVyKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGluayAoc3JjMiwgdmlkZW9taXhlcik7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmsgKHZpZGVvbWl4ZXIsIHNpbmspOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworCisgIHNlZWtfZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZWsgKDEuMCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgR1NUX1NFRUtfRkxBR19TRUdNRU5UIHwgR1NUX1NFRUtfRkxBR19GTFVTSCwKKyAgICAgIEdTVF9TRUVLX1RZUEVfU0VULCAoR3N0Q2xvY2tUaW1lKSAwLCBHU1RfU0VFS19UWVBFX1NFVCwKKyAgICAgIChHc3RDbG9ja1RpbWUpIDIgKiBHU1RfU0VDT05EKTsKKworICBtYWluX2xvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIEZBTFNFKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6c2VnbWVudC1kb25lIiwKKyAgICAgIChHQ2FsbGJhY2spIGxvb3Bfc2VnbWVudF9kb25lLCBiaW4pOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjplcnJvciIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsIGJpbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6Ondhcm5pbmciLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjplb3MiLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworCisgIEdTVF9JTkZPICgic3RhcnRpbmcgdGVzdCIpOworCisgIC8qIHByZXBhcmUgcGxheWluZyAqLworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX1BBVVNFRCk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICAvKiB3YWl0IGZvciBjb21wbGV0aW9uICovCisgIHN0YXRlX3JlcyA9CisgICAgICBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKEdTVF9FTEVNRU5UIChiaW4pLCBOVUxMLCBOVUxMLAorICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICByZXMgPSBnc3RfZWxlbWVudF9zZW5kX2V2ZW50IChiaW4sIHNlZWtfZXZlbnQpOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworCisgIC8qIHJ1biBwaXBlbGluZSAqLworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgR1NUX0lORk8gKCJydW5uaW5nIG1haW4gbG9vcCIpOworICBnX21haW5fbG9vcF9ydW4gKG1haW5fbG9vcCk7CisKKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9OVUxMKTsKKworICAvKiBjbGVhbnVwICovCisgIGdfbWFpbl9sb29wX3VucmVmIChtYWluX2xvb3ApOworICBnc3RfYnVzX3JlbW92ZV9zaWduYWxfd2F0Y2ggKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJpbik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworI2lmIDAKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ZsdXNoX3N0YXJ0X2ZsdXNoX3N0b3ApCit7CisgIEdzdFBhZFRlbXBsYXRlICpzaW5rX3RlbXBsYXRlOworICBHc3RQYWQgKnRtcHBhZCwgKnNpbmtwYWQxLCAqc2lua3BhZDIsICp2aWRlb21peGVyX3NyYzsKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmUsICpzcmMxLCAqc3JjMiwgKnZpZGVvbWl4ZXIsICpzaW5rOworCisgIEdTVF9JTkZPICgicHJlcGFyaW5nIHRlc3QiKTsKKworICAvKiBidWlsZCBwaXBlbGluZSAqLworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBzcmMxID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgInNyYzEiKTsKKyAgc3JjMiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsICJzcmMyIik7CisgIHZpZGVvbWl4ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb21peGVyIiwgInZpZGVvbWl4ZXIiKTsKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgInNpbmsiKTsKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBzcmMxLCBzcmMyLCB2aWRlb21peGVyLCBzaW5rLCBOVUxMKTsKKworICBzaW5rX3RlbXBsYXRlID0KKyAgICAgIGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKEdTVF9FTEVNRU5UX0dFVF9DTEFTUyAodmlkZW9taXhlciksCisgICAgICAic2lua18ldSIpOworICBmYWlsX3VubGVzcyAoR1NUX0lTX1BBRF9URU1QTEFURSAoc2lua190ZW1wbGF0ZSkpOworICBzaW5rcGFkMSA9IGdzdF9lbGVtZW50X3JlcXVlc3RfcGFkICh2aWRlb21peGVyLCBzaW5rX3RlbXBsYXRlLCBOVUxMLCBOVUxMKTsKKyAgdG1wcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNyYzEsICJzcmMiKTsKKyAgZ3N0X3BhZF9saW5rICh0bXBwYWQsIHNpbmtwYWQxKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodG1wcGFkKTsKKworICBzaW5rcGFkMiA9IGdzdF9lbGVtZW50X3JlcXVlc3RfcGFkICh2aWRlb21peGVyLCBzaW5rX3RlbXBsYXRlLCBOVUxMLCBOVUxMKTsKKyAgdG1wcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNyYzIsICJzcmMiKTsKKyAgZ3N0X3BhZF9saW5rICh0bXBwYWQsIHNpbmtwYWQyKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodG1wcGFkKTsKKworICBnc3RfZWxlbWVudF9saW5rICh2aWRlb21peGVyLCBzaW5rKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9nZXRfc3RhdGUgKHBpcGVsaW5lLCBOVUxMLCBOVUxMLAorICAgICAgICAgIEdTVF9DTE9DS19USU1FX05PTkUpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgdmlkZW9taXhlcl9zcmMgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAodmlkZW9taXhlciwgInNyYyIpOworICBmYWlsX2lmIChHU1RfUEFEX0lTX0ZMVVNISU5HICh2aWRlb21peGVyX3NyYykpOworICBnc3RfcGFkX3NlbmRfZXZlbnQgKHNpbmtwYWQxLCBnc3RfZXZlbnRfbmV3X2ZsdXNoX3N0YXJ0ICgpKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9QQURfSVNfRkxVU0hJTkcgKHZpZGVvbWl4ZXJfc3JjKSk7CisgIGdzdF9wYWRfc2VuZF9ldmVudCAoc2lua3BhZDEsIGdzdF9ldmVudF9uZXdfZmx1c2hfc3RvcCAoVFJVRSkpOworICBmYWlsX2lmIChHU1RfUEFEX0lTX0ZMVVNISU5HICh2aWRlb21peGVyX3NyYykpOworICBnc3Rfb2JqZWN0X3VucmVmICh2aWRlb21peGVyX3NyYyk7CisKKyAgLyogY2xlYW51cCAqLworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQxKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZDIpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKyNlbmRpZgorCitzdGF0aWMgU3VpdGUgKgordmlkZW9taXhlcl9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJ2aWRlb21peGVyIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2NhcHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZXZlbnQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGxheV90d2ljZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wbGF5X3R3aWNlX3RoZW5fYWRkX2FuZF9wbGF5X2FnYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2FkZF9wYWQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcmVtb3ZlX3BhZCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9jbGlwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2R1cmF0aW9uX2lzX21heCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9kdXJhdGlvbl91bmtub3duX292ZXJyaWRlcyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9sb29wKTsKKyAgLyogVGhpcyB0ZXN0IGlzIHJhY3kgYW5kIG9jY2FzaW9uYWxseSBmYWlscyBpbiBpbnRlcmVzdGluZyB3YXlzCisgICAqIGp1c3QgbGlrZSB0aGUgY29ycmVzcG9uZGluZyBhZGRlciB0ZXN0IGRvZXMvZGlkLCBzZWUKKyAgICogaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwODg5MQorICAgKiBJdCdzIHVubGlrZWx5IHRoYXQgaXQgd2lsbCBldmVyIGJlIGZpeGVkIGZvciB2aWRlb21peGVyL2NvbGxlY3RwYWRzLAorICAgKiBhcyBpdCB3b3JrcyBmaW5lIHdpdGggY29tcG9zaXRvciAqLworI2lmIDAKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ZsdXNoX3N0YXJ0X2ZsdXNoX3N0b3ApOworI2VuZGlmCisKKyAgLyogVXNlIGEgbG9uZ2VyIHRpbWVvdXQgKi8KKyNpZmRlZiBIQVZFX1ZBTEdSSU5ECisgIGlmIChSVU5OSU5HX09OX1ZBTEdSSU5EKSB7CisgICAgdGNhc2Vfc2V0X3RpbWVvdXQgKHRjX2NoYWluLCA1ICogNjApOworICB9IGVsc2UKKyNlbmRpZgorICB7CisgICAgLyogdGhpcyBpcyBzaG9ydGVyIHRoYW4gdGhlIGRlZmF1bHQgNjAgc2Vjb25kcz8hICh0cG0pICovCisgICAgLyogdGNhc2Vfc2V0X3RpbWVvdXQgKHRjX2NoYWluLCA2KTsgKi8KKyAgfQorCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAodmlkZW9taXhlcik7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy92cDhkZWMuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3ZwOGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYmQ3MGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy92cDhkZWMuYwpAQCAtMCwwICsxLDI2NiBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSBJNDIwLCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsxLCBNQVhdLCAiCisgICAgICAgICJoZWlnaHQgPSAoaW50KSBbMSwgTUFYXSwgIiAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSBbMCwgTUFYXSIpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSBJNDIwLCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsxLCBNQVhdLCAiCisgICAgICAgICJoZWlnaHQgPSAoaW50KSBbMSwgTUFYXSwgIiAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSBbMCwgTUFYXSIpKTsKKworc3RhdGljIEdzdFBhZCAqc2lua3BhZCwgKnNyY3BhZDsKKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfdnA4ZGVjIChjb25zdCBnY2hhciAqIHNyY19jYXBzX3N0cikKK3sKKyAgR3N0RWxlbWVudCAqYmluOworICBHc3RFbGVtZW50ICp2cDhlbmMsICp2cDhkZWM7CisgIEdzdENhcHMgKnNyY2NhcHMgPSBOVUxMOworICBHc3RCdXMgKmJ1czsKKyAgR3N0UGFkICpnaG9zdHBhZCwgKnRhcmdldHBhZDsKKworICBpZiAoc3JjX2NhcHNfc3RyKSB7CisgICAgc3JjY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChzcmNfY2Fwc19zdHIpOworICAgIGZhaWxfdW5sZXNzIChzcmNjYXBzICE9IE5VTEwpOworICB9CisKKyAgYmluID0gZ3N0X2Jpbl9uZXcgKCJiaW4iKTsKKworICB2cDhlbmMgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoInZwOGVuYyIpOworICBmYWlsX3VubGVzcyAodnA4ZW5jICE9IE5VTEwpOworICB2cDhkZWMgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoInZwOGRlYyIpOworICBmYWlsX3VubGVzcyAodnA4ZGVjICE9IE5VTEwpOworCisgIGdfb2JqZWN0X3NldCAodnA4ZW5jLCAibmFtZSIsICJlbmNvZGVyIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAodnA4ZGVjLCAibmFtZSIsICJkZWNvZGVyIiwgTlVMTCk7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAoYmluKSwgdnA4ZW5jLCB2cDhkZWMsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGlua19wYWRzICh2cDhlbmMsICJzcmMiLCB2cDhkZWMsICJzaW5rIikpOworCisgIHRhcmdldHBhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkICh2cDhlbmMsICJzaW5rIik7CisgIGZhaWxfdW5sZXNzICh0YXJnZXRwYWQgIT0gTlVMTCk7CisgIGdob3N0cGFkID0gZ3N0X2dob3N0X3BhZF9uZXcgKCJzaW5rIiwgdGFyZ2V0cGFkKTsKKyAgZmFpbF91bmxlc3MgKGdob3N0cGFkICE9IE5VTEwpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChiaW4sIGdob3N0cGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodGFyZ2V0cGFkKTsKKworICB0YXJnZXRwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAodnA4ZGVjLCAic3JjIik7CisgIGZhaWxfdW5sZXNzICh0YXJnZXRwYWQgIT0gTlVMTCk7CisgIGdob3N0cGFkID0gZ3N0X2dob3N0X3BhZF9uZXcgKCJzcmMiLCB0YXJnZXRwYWQpOworICBmYWlsX3VubGVzcyAoZ2hvc3RwYWQgIT0gTlVMTCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGJpbiwgZ2hvc3RwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmICh0YXJnZXRwYWQpOworCisgIHNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkIChiaW4sICZzcmN0ZW1wbGF0ZSk7CisgIHNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKGJpbiwgJnNpbmt0ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc3JjcGFkLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzaW5rcGFkLCBUUlVFKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAoc3JjcGFkLCBiaW4sIHNyY2NhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisKKyAgYnVzID0gZ3N0X2J1c19uZXcgKCk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKGJpbiwgYnVzKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSwKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBpZiAoc3JjY2FwcykKKyAgICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgYnVmZmVycyA9IE5VTEw7CisgIHJldHVybiBiaW47Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX3ZwOGRlYyAoR3N0RWxlbWVudCAqIGJpbikKK3sKKyAgR3N0QnVzICpidXM7CisKKyAgLyogRnJlZSBwYXJzZWQgYnVmZmVycyAqLworICBnc3RfY2hlY2tfZHJvcF9idWZmZXJzICgpOworCisgIGJ1cyA9IEdTVF9FTEVNRU5UX0JVUyAoYmluKTsKKyAgZ3N0X2J1c19zZXRfZmx1c2hpbmcgKGJ1cywgVFJVRSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzaW5rcGFkLCBGQUxTRSk7CisKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKGJpbik7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAoYmluKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGJpbik7Cit9CisKK3N0YXRpYyB2b2lkCitfZ3N0X3ZwOF90ZXN0X2NoZWNrX291dHB1dF9jYXBzIChnaW50IHdpZHRoLCBnaW50IGhlaWdodCwgZ2ludCBmcHNfbiwKKyAgICBnaW50IGZwc19kKQoreworICBHc3RDYXBzICpjYXBzOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2ludCBjYXBzX3csIGNhcHNfaCwgY2Fwc19mcHNuLCBjYXBzX2Zwc2Q7CisKKyAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoc2lua3BhZCk7CisgIGZhaWxfdW5sZXNzIChjYXBzICE9IE5VTEwpOworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJ3aWR0aCIsICZjYXBzX3cpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiaGVpZ2h0IiwgJmNhcHNfaCkpOworICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9nZXRfZnJhY3Rpb24gKHN0cnVjdHVyZSwgImZyYW1lcmF0ZSIsICZjYXBzX2Zwc24sCisgICAgICAgICAgJmNhcHNfZnBzZCkpOworCisgIGZhaWxfdW5sZXNzICh3aWR0aCA9PSBjYXBzX3cpOworICBmYWlsX3VubGVzcyAoaGVpZ2h0ID09IGNhcHNfaCk7CisgIGZhaWxfdW5sZXNzIChmcHNfbiA9PSBjYXBzX2Zwc24pOworICBmYWlsX3VubGVzcyAoZnBzX2QgPT0gY2Fwc19mcHNkKTsKKworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2RlY29kZV9zaW1wbGUpCit7CisgIEdzdEVsZW1lbnQgKmJpbjsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIGdpbnQgaTsKKyAgR0xpc3QgKmw7CisgIEdzdFNlZ21lbnQgc2VnOworCisgIGJpbiA9CisgICAgICBzZXR1cF92cDhkZWMKKyAgICAgICgidmlkZW8veC1yYXcsZm9ybWF0PShzdHJpbmcpSTQyMCx3aWR0aD0oaW50KTMyMCxoZWlnaHQ9KGludCkyNDAsZnJhbWVyYXRlPShmcmFjdGlvbikyNS8xIik7CisKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgc2VnLnN0b3AgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKDIwLCBHU1RfU0VDT05ELCAyNSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKHNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnKSkpOworCisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMzIwICogMjQwICsgMiAqIDE2MCAqIDEyMCk7CisgIGdzdF9idWZmZXJfbWVtc2V0IChidWZmZXIsIDAsIDAsIC0xKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChpLCBHU1RfU0VDT05ELCAyNSk7CisgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoMSwgR1NUX1NFQ09ORCwgMjUpOworICAgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKHNyY3BhZCwgZ3N0X2J1ZmZlcl9yZWYgKGJ1ZmZlcikpID09IEdTVF9GTE9XX09LKTsKKyAgfQorCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAoc3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworCisgIC8qIEFsbCBidWZmZXJzIG11c3QgYmUgdGhlcmUgbm93ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAyMCk7CisKKyAgZm9yIChsID0gYnVmZmVycywgaSA9IDA7IGw7IGwgPSBsLT5uZXh0LCBpKyspIHsKKyAgICBidWZmZXIgPSBsLT5kYXRhOworCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlciksCisgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoaSwgR1NUX1NFQ09ORCwgMjUpKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpLAorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKDEsIEdTVF9TRUNPTkQsIDI1KSk7CisgIH0KKworICBjbGVhbnVwX3ZwOGRlYyAoYmluKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2RlY29kZV9jYXBzX2NoYW5nZSkKK3sKKyAgR3N0RWxlbWVudCAqYmluOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0U2VnbWVudCBzZWc7CisgIEdzdEVsZW1lbnQgKmVuY29kZXI7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgYmluID0KKyAgICAgIHNldHVwX3ZwOGRlYworICAgICAgKCJ2aWRlby94LXJhdyxmb3JtYXQ9KHN0cmluZylJNDIwLHdpZHRoPShpbnQpMzIwLGhlaWdodD0oaW50KTI0MCxmcmFtZXJhdGU9KGZyYWN0aW9uKTI1LzEiKTsKKworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnLCBHU1RfRk9STUFUX1RJTUUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZykpKTsKKworICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDMyMCAqIDI0MCArIDIgKiAxNjAgKiAxMjApOworICBnc3RfYnVmZmVyX21lbXNldCAoYnVmZmVyLCAwLCAwLCAtMSk7CisKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcikgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKDAsIEdTVF9TRUNPTkQsIDI1KTsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoMSwgR1NUX1NFQ09ORCwgMjUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChzcmNwYWQsIGJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworCisgIC8qIGF0IHRoaXMgcG9pbnQsIHRoZSBvdXRwdXQgY2FwcyBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIGlucHV0ICovCisgIF9nc3RfdnA4X3Rlc3RfY2hlY2tfb3V0cHV0X2NhcHMgKDMyMCwgMjQwLCAyNSwgMSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZ19saXN0X2ZyZWVfZnVsbCAoYnVmZmVycywgKEdEZXN0cm95Tm90aWZ5KSBnc3RfYnVmZmVyX3VucmVmKTsKKyAgYnVmZmVycyA9IE5VTEw7CisKKyAgLyogbm93IGNoYW5nZSB0aGUgY2FwcyAqLworICBlbmNvZGVyID0gZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAoYmluKSwgImVuY29kZXIiKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbmNvZGVyLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9lbGVtZW50X3N5bmNfc3RhdGVfd2l0aF9wYXJlbnQgKGVuY29kZXIpOworICBnc3Rfb2JqZWN0X3VucmVmIChlbmNvZGVyKTsKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nCisgICAgICAoInZpZGVvL3gtcmF3LGZvcm1hdD0oc3RyaW5nKUk0MjAsd2lkdGg9KGludCk2NCwiCisgICAgICAiaGVpZ2h0PShpbnQpMzIsZnJhbWVyYXRlPShmcmFjdGlvbikzMC8xIik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKHNyY3BhZCwgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSkpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZykpKTsKKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg2NCAqIDMyICsgMiAqIDMyICogMTYpOworICBnc3RfYnVmZmVyX21lbXNldCAoYnVmZmVyLCAwLCAwLCAtMSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoMCwgR1NUX1NFQ09ORCwgMzApOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlICgxLCBHU1RfU0VDT05ELCAzMCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKHNyY3BhZCwgYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisKKyAgLyogYXQgdGhpcyBwb2ludCwgdGhlIG91dHB1dCBjYXBzIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgaW5wdXQgKi8KKyAgX2dzdF92cDhfdGVzdF9jaGVja19vdXRwdXRfY2FwcyAoNjQsIDMyLCAzMCwgMSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZ19saXN0X2ZyZWVfZnVsbCAoYnVmZmVycywgKEdEZXN0cm95Tm90aWZ5KSBnc3RfYnVmZmVyX3VucmVmKTsKKyAgYnVmZmVycyA9IE5VTEw7CisKKyAgY2xlYW51cF92cDhkZWMgKGJpbik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitzdGF0aWMgU3VpdGUgKgordnA4ZGVjX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoInZwOGRlYyIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2RlY29kZV9zaW1wbGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZGVjb2RlX2NhcHNfY2hhbmdlKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHZwOGRlYyk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy92cDhlbmMuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3ZwOGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YjFkOTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy92cDhlbmMuYwpAQCAtMCwwICsxLDE2OCBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtdnA4LCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsxLCBNQVhdLCAiCisgICAgICAgICJoZWlnaHQgPSAoaW50KSBbMSwgTUFYXSwgIiAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSBbMCwgTUFYXSIpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSBJNDIwLCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsxLCBNQVhdLCAiCisgICAgICAgICJoZWlnaHQgPSAoaW50KSBbMSwgTUFYXSwgIiAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSBbMCwgTUFYXSIpKTsKKworc3RhdGljIEdzdFBhZCAqc2lua3BhZCwgKnNyY3BhZDsKKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfdnA4ZW5jIChjb25zdCBnY2hhciAqIHNyY19jYXBzX3N0cikKK3sKKyAgR3N0RWxlbWVudCAqdnA4ZW5jOworICBHc3RDYXBzICpzcmNjYXBzID0gTlVMTDsKKyAgR3N0QnVzICpidXM7CisKKyAgaWYgKHNyY19jYXBzX3N0cikgeworICAgIHNyY2NhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoc3JjX2NhcHNfc3RyKTsKKyAgICBmYWlsX3VubGVzcyAoc3JjY2FwcyAhPSBOVUxMKTsKKyAgfQorCisgIHZwOGVuYyA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgidnA4ZW5jIik7CisgIGZhaWxfdW5sZXNzICh2cDhlbmMgIT0gTlVMTCk7CisgIHNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkICh2cDhlbmMsICZzcmN0ZW1wbGF0ZSk7CisgIHNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKHZwOGVuYywgJnNpbmt0ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc3JjcGFkLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzaW5rcGFkLCBUUlVFKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAoc3JjcGFkLCB2cDhlbmMsIHNyY2NhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisKKyAgYnVzID0gZ3N0X2J1c19uZXcgKCk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKHZwOGVuYywgYnVzKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlICh2cDhlbmMsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSwKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBpZiAoc3JjY2FwcykKKyAgICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgYnVmZmVycyA9IE5VTEw7CisgIHJldHVybiB2cDhlbmM7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX3ZwOGVuYyAoR3N0RWxlbWVudCAqIHZwOGVuYykKK3sKKyAgR3N0QnVzICpidXM7CisKKyAgLyogRnJlZSBwYXJzZWQgYnVmZmVycyAqLworICBnc3RfY2hlY2tfZHJvcF9idWZmZXJzICgpOworCisgIGJ1cyA9IEdTVF9FTEVNRU5UX0JVUyAodnA4ZW5jKTsKKyAgZ3N0X2J1c19zZXRfZmx1c2hpbmcgKGJ1cywgVFJVRSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzaW5rcGFkLCBGQUxTRSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zcmNfcGFkICh2cDhlbmMpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKHZwOGVuYyk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50ICh2cDhlbmMpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9lbmNvZGVfc2ltcGxlKQoreworICBHc3RFbGVtZW50ICp2cDhlbmM7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBnaW50IGk7CisgIEdMaXN0ICpsOworICBHc3RDYXBzICpvdXRjYXBzOworICBHc3RTZWdtZW50IHNlZzsKKworICB2cDhlbmMgPQorICAgICAgc2V0dXBfdnA4ZW5jCisgICAgICAoInZpZGVvL3gtcmF3LGZvcm1hdD0oc3RyaW5nKUk0MjAsd2lkdGg9KGludCkzMjAsaGVpZ2h0PShpbnQpMjQwLGZyYW1lcmF0ZT0oZnJhY3Rpb24pMjUvMSIpOworCisgIGdfb2JqZWN0X3NldCAodnA4ZW5jLCAibGFnLWluLWZyYW1lcyIsIDUsIE5VTEwpOworCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWcsIEdTVF9GT1JNQVRfVElNRSk7CisgIHNlZy5zdG9wID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlICgyMCwgR1NUX1NFQ09ORCwgMjUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZykpKTsKKworICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDMyMCAqIDI0MCArIDIgKiAxNjAgKiAxMjApOworICBnc3RfYnVmZmVyX21lbXNldCAoYnVmZmVyLCAwLCAwLCAtMSk7CisKKyAgZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoaSwgR1NUX1NFQ09ORCwgMjUpOworICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcikgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKDEsIEdTVF9TRUNPTkQsIDI1KTsKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChzcmNwYWQsIGdzdF9idWZmZXJfcmVmIChidWZmZXIpKSA9PSBHU1RfRkxPV19PSyk7CisgIH0KKworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgIC8qIE9ubHkgNSBidWZmZXJzIGFyZSBhbGxvd2VkIHRvIGJlIHF1ZXVlZCBub3cgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID4gMTUpOworCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKHNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKworCisgIC8qIEFsbCBidWZmZXJzIG11c3QgYmUgdGhlcmUgbm93ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAyMCk7CisKKyAgb3V0Y2FwcyA9CisgICAgICBnc3RfY2Fwc19mcm9tX3N0cmluZworICAgICAgKCJ2aWRlby94LXZwOCx3aWR0aD0oaW50KTMyMCxoZWlnaHQ9KGludCkyNDAsZnJhbWVyYXRlPShmcmFjdGlvbikyNS8xIik7CisKKyAgZm9yIChsID0gYnVmZmVycywgaSA9IDA7IGw7IGwgPSBsLT5uZXh0LCBpKyspIHsKKyAgICBidWZmZXIgPSBsLT5kYXRhOworCisgICAgaWYgKGkgPT0gMCkKKyAgICAgIGZhaWxfaWYgKEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpKTsKKworICAgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpLAorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGksIEdTVF9TRUNPTkQsIDI1KSk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSwKKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlICgxLCBHU1RfU0VDT05ELCAyNSkpOworICB9CisKKyAgZ3N0X2NhcHNfdW5yZWYgKG91dGNhcHMpOworCisgIGNsZWFudXBfdnA4ZW5jICh2cDhlbmMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCit2cDhlbmNfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgidnA4ZW5jIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZW5jb2RlX3NpbXBsZSk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOICh2cDhlbmMpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvdnA5ZW5jLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy92cDllbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2JlMGUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvdnA5ZW5jLmMKQEAgLTAsMCArMSw3OCBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGhhcm5lc3MuaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZW5jb2RlX2xhZ19pbl9mcmFtZXMpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXdfcGFyc2UgKCJ2cDllbmMgbGFnLWluLWZyYW1lcz01IGNwdS11c2VkPTggIgorICAgICAgImRlYWRsaW5lPTEiKTsKKyAgZ2ludCBpOworCisgIGdzdF9oYXJuZXNzX2FkZF9zcmNfcGFyc2UgKGgsICJ2aWRlb3Rlc3RzcmMgaXMtbGl2ZT10cnVlIHBhdHRlcm49YmxhY2sgISAiCisgICAgICAiY2Fwc2ZpbHRlciBjYXBzPVwidmlkZW8veC1yYXcsd2lkdGg9MzIwLGhlaWdodD0yNDAsZnJhbWVyYXRlPTI1LzFcIiIsCisgICAgICBUUlVFKTsKKworICAvKiBQdXNoIDIwIGJ1ZmZlcnMgaW50byB0aGUgZW5jb2RlciAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywKKyAgICAgIGdzdF9oYXJuZXNzX3NyY19jcmFua19hbmRfcHVzaF9tYW55IChoLCAyMCwgMjApKTsKKworICAvKiBPbmx5IDUgYnVmZmVycyBhcmUgYWxsb3dlZCB0byBiZSBxdWV1ZWQgbm93ICovCisgIGZhaWxfdW5sZXNzIChnc3RfaGFybmVzc19idWZmZXJzX3JlY2VpdmVkIChoKSA+IDE1KTsKKworICAvKiBFT1Mgd2lsbCBjYXVzZSB0aGUgcmVtYWluaW5nIGJ1ZmZlcnMgdG8gYmUgZHJhaW5lZCAqLworICBmYWlsX3VubGVzcyAoZ3N0X2hhcm5lc3NfcHVzaF9ldmVudCAoaCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2hhcm5lc3NfYnVmZmVyc19yZWNlaXZlZCAoaCksIDIwKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgIEdzdEJ1ZmZlciAqYnVmZmVyID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisKKyAgICBpZiAoaSA9PSAwKQorICAgICAgZmFpbF9pZiAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmZmVyLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCkpOworCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlciksCisgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoaSwgR1NUX1NFQ09ORCwgMjUpKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpLAorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKDEsIEdTVF9TRUNPTkQsIDI1KSk7CisKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICB9CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworc3RhdGljIFN1aXRlICoKK3ZwOWVuY19zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJ2cDllbmMiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9lbmNvZGVfbGFnX2luX2ZyYW1lcyk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOICh2cDllbmMpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFja2RlYy5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFja2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZWQwNWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZGVjLmMKQEAgLTAsMCArMSwyNDMgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIHVuaXQgdGVzdCBmb3Igd2F2cGFja2RlYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisKKy8qIEZvciBlYXNlIG9mIHByb2dyYW1taW5nIHdlIHVzZSBnbG9iYWxzIHRvIGtlZXAgcmVmcyBmb3Igb3VyIGZsb2F0aW5nCisgKiBzcmMgYW5kIHNpbmsgcGFkcyB3ZSBjcmVhdGU7IG90aGVyd2lzZSB3ZSBhbHdheXMgaGF2ZSB0byBkbyBnZXRfcGFkLAorICogZ2V0X3BlZXIsIGFuZCB0aGVuIHJlbW92ZSByZWZlcmVuY2VzIGluIGV2ZXJ5IHRlc3QgZnVuY3Rpb24gKi8KK3N0YXRpYyBHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworCisjaWYgR19CWVRFX09SREVSID09IEdfQklHX0VORElBTgorI2RlZmluZSBBVURJT19GT1JNQVQgIlMxNkJFIgorI2Vsc2UKKyNkZWZpbmUgQVVESU9fRk9STUFUICJTMTZMRSIKKyNlbmRpZgorCitndWludDggdGVzdF9mcmFtZVtdID0geworICAweDc3LCAweDc2LCAweDcwLCAweDZCLCAgICAgICAvKiAid3ZwayIgKi8KKyAgMHgyRSwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgLyogY2tTaXplICovCisgIDB4MDQsIDB4MDQsICAgICAgICAgICAgICAgICAgIC8qIHZlcnNpb24gKi8KKyAgMHgwMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHJhY2tfbm8gKi8KKyAgMHgwMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXhfbm8gKi8KKyAgMHgwMCwgMHg2NCwgMHgwMCwgMHgwMCwgICAgICAgLyogdG90YWxfc2FtcGxlcyAqLworICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAvKiBibG9ja19pbmRleCAqLworICAweDAwLCAweDY0LCAweDAwLCAweDAwLCAgICAgICAvKiBibG9ja19zYW1wbGVzICovCisgIDB4MDUsIDB4MTgsIDB4ODAsIDB4MDQsICAgICAgIC8qIGZsYWdzICovCisgIDB4RkYsIDB4QUYsIDB4ODAsIDB4NjAsICAgICAgIC8qIGNyYyAqLworICAweDAyLCAweDAwLCAweDAzLCAweDAwLCAgICAgICAvKiBkYXRhICovCisgIDB4MDQsIDB4MDAsIDB4MDUsIDB4MDMsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4OEEsIDB4MDIsCisgIDB4MDAsIDB4MDAsIDB4RkYsIDB4N0YsCisgIDB4MDAsIDB4RTQsCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgQVVESU9fRk9STUFUICIsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgInJhdGUgPSAoaW50KSA0NDEwMCIpCisgICAgKTsKKworI2RlZmluZSBXQVZQQUNLX0NBUFMgImF1ZGlvL3gtd2F2cGFjaywgIiBcCisgICAgICAgICJkZXB0aCA9IChpbnQpIDE2LCAiIFwKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAicmF0ZSA9IChpbnQpIDQ0MTAwLCAiICJmcmFtZWQgPSAoYm9vbGVhbikgdHJ1ZSIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoV0FWUEFDS19DQVBTKQorICAgICk7CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX3dhdnBhY2tkZWMgKHZvaWQpCit7CisgIEdzdEVsZW1lbnQgKndhdnBhY2tkZWM7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgR1NUX0RFQlVHICgic2V0dXBfd2F2cGFja2RlYyIpOworICB3YXZwYWNrZGVjID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJ3YXZwYWNrZGVjIik7CisgIG15c3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKHdhdnBhY2tkZWMsICZzcmN0ZW1wbGF0ZSk7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAod2F2cGFja2RlYywgJnNpbmt0ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChXQVZQQUNLX0NBUFMpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgd2F2cGFja2RlYywgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHdhdnBhY2tkZWMsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICByZXR1cm4gd2F2cGFja2RlYzsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfd2F2cGFja2RlYyAoR3N0RWxlbWVudCAqIHdhdnBhY2tkZWMpCit7CisgIEdTVF9ERUJVRyAoImNsZWFudXBfd2F2cGFja2RlYyIpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHdhdnBhY2tkZWMsIEdTVF9TVEFURV9OVUxMKTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBGQUxTRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBGQUxTRSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zcmNfcGFkICh3YXZwYWNrZGVjKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkICh3YXZwYWNrZGVjKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKHdhdnBhY2tkZWMpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9kZWNvZGVfZnJhbWUpCit7CisgIEdzdEVsZW1lbnQgKndhdnBhY2tkZWM7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdEJ1cyAqYnVzOworICBpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgd2F2cGFja2RlYyA9IHNldHVwX3dhdnBhY2tkZWMgKCk7CisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworCisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzaXplb2YgKHRlc3RfZnJhbWUpKTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChpbmJ1ZmZlciwgMCwgdGVzdF9mcmFtZSwgc2l6ZW9mICh0ZXN0X2ZyYW1lKSk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAod2F2cGFja2RlYywgYnVzKTsKKworICAvKiBzaG91bGQgZGVjb2RlIHRoZSBidWZmZXIgd2l0aG91dCBwcm9ibGVtcyAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlciksIEdTVF9GTE9XX09LKTsKKworICBvdXRidWZmZXIgPSBHU1RfQlVGRkVSIChidWZmZXJzLT5kYXRhKTsKKworICBmYWlsX2lmIChvdXRidWZmZXIgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICAvKiB1bmNvbXByZXNzZWQgZGF0YSBzaG91bGQgYmUgMTAyNDAwIGJ5dGVzICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG1hcC5zaXplLCA1MTIwMCk7CisKKyAgLyogYW5kIGFsbCBieXRlcyBtdXN0IGJlIDAsIGkuZS4gc2lsZW5jZSAqLworICBmb3IgKGkgPSAwOyBpIDwgNTEyMDA7IGkrKykKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChtYXAuZGF0YVtpXSwgMCk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChvdXRidWZmZXIsICJvdXRidWZmZXIiLCAxKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmZmVyKTsKKyAgb3V0YnVmZmVyID0gTlVMTDsKKworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGdzdF9idXNfc2V0X2ZsdXNoaW5nIChidXMsIFRSVUUpOworICBnc3RfZWxlbWVudF9zZXRfYnVzICh3YXZwYWNrZGVjLCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoR1NUX09CSkVDVCAoYnVzKSk7CisgIGNsZWFudXBfd2F2cGFja2RlYyAod2F2cGFja2RlYyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZGVjb2RlX2ZyYW1lX3dpdGhfYnJva2VuX2hlYWRlcikKK3sKKyAgR3N0RWxlbWVudCAqd2F2cGFja2RlYzsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlcjsKKyAgR3N0QnVzICpidXM7CisgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgd2F2cGFja2RlYyA9IHNldHVwX3dhdnBhY2tkZWMgKCk7CisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworCisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzaXplb2YgKHRlc3RfZnJhbWUpKTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChpbmJ1ZmZlciwgMCwgdGVzdF9mcmFtZSwgc2l6ZW9mICh0ZXN0X2ZyYW1lKSk7CisgIC8qIGJyZWFrIGhlYWRlciAqLworICBnc3RfYnVmZmVyX21lbXNldCAoaW5idWZmZXIsIDIsICdlJywgMSk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAod2F2cGFja2RlYywgYnVzKTsKKworICAvKiBzaG91bGQgZmFpbCBncmFjZWZ1bGx5ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSwgR1NUX0ZMT1dfRVJST1IpOworCisgIGZhaWxfaWYgKChtZXNzYWdlID0gZ3N0X2J1c19wb3AgKGJ1cykpID09IE5VTEwpOworICBmYWlsX3VubGVzc19tZXNzYWdlX2Vycm9yIChtZXNzYWdlLCBTVFJFQU0sIERFQ09ERSk7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICBnc3RfZWxlbWVudF9zZXRfYnVzICh3YXZwYWNrZGVjLCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoR1NUX09CSkVDVCAoYnVzKSk7CisgIGNsZWFudXBfd2F2cGFja2RlYyAod2F2cGFja2RlYyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZGVjb2RlX2ZyYW1lX3dpdGhfaW5jb21wbGV0ZV9mcmFtZSkKK3sKKyAgR3N0RWxlbWVudCAqd2F2cGFja2RlYzsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlcjsKKyAgR3N0QnVzICpidXM7CisgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgd2F2cGFja2RlYyA9IHNldHVwX3dhdnBhY2tkZWMgKCk7CisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworCisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzaXplb2YgKHRlc3RfZnJhbWUpIC0gMik7CisgIGdzdF9idWZmZXJfZmlsbCAoaW5idWZmZXIsIDAsIHRlc3RfZnJhbWUsIHNpemVvZiAodGVzdF9mcmFtZSkgLSAyKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKworICBnc3RfZWxlbWVudF9zZXRfYnVzICh3YXZwYWNrZGVjLCBidXMpOworCisgIC8qIHNob3VsZCBmYWlsIGdyYWNlZnVsbHkgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpLCBHU1RfRkxPV19FUlJPUik7CisKKyAgZmFpbF9pZiAoKG1lc3NhZ2UgPSBnc3RfYnVzX3BvcCAoYnVzKSkgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX21lc3NhZ2VfZXJyb3IgKG1lc3NhZ2UsIFNUUkVBTSwgREVDT0RFKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAod2F2cGFja2RlYywgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1QgKGJ1cykpOworICBjbGVhbnVwX3dhdnBhY2tkZWMgKHdhdnBhY2tkZWMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCit3YXZwYWNrZGVjX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoIndhdnBhY2tkZWMiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZGVjb2RlX2ZyYW1lKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2RlY29kZV9mcmFtZV93aXRoX2Jyb2tlbl9oZWFkZXIpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZGVjb2RlX2ZyYW1lX3dpdGhfaW5jb21wbGV0ZV9mcmFtZSk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOICh3YXZwYWNrZGVjKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tlbmMuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjJlZWE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFja2VuYy5jCkBAIC0wLDAgKzEsMTgyIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIHdhdnBhY2tlbmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCisvKiBGb3IgZWFzZSBvZiBwcm9ncmFtbWluZyB3ZSB1c2UgZ2xvYmFscyB0byBrZWVwIHJlZnMgZm9yIG91ciBmbG9hdGluZworICogc3JjIGFuZCBzaW5rIHBhZHMgd2UgY3JlYXRlOyBvdGhlcndpc2Ugd2UgYWx3YXlzIGhhdmUgdG8gZG8gZ2V0X3BhZCwKKyAqIGdldF9wZWVyLCBhbmQgdGhlbiByZW1vdmUgcmVmZXJlbmNlcyBpbiBldmVyeSB0ZXN0IGZ1bmN0aW9uICovCitzdGF0aWMgR3N0UGFkICpteXNyY3BhZCwgKm15c2lua3BhZDsKK3N0YXRpYyBHc3RCdXMgKmJ1czsKKworI2lmIEdfQllURV9PUkRFUiA9PSBHX0JJR19FTkRJQU4KKyNkZWZpbmUgQVVESU9fRk9STUFUICJTMzJCRSIKKyNlbHNlCisjZGVmaW5lIEFVRElPX0ZPUk1BVCAiUzMyTEUiCisjZW5kaWYKKworI2RlZmluZSBSQVdfQ0FQU19TVFJJTkcgImF1ZGlvL3gtcmF3LCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEFVRElPX0ZPUk1BVCAiLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyYXRlID0gKGludCkgNDQxMDAiCisKKyNkZWZpbmUgV0FWUEFDS19DQVBTX1NUUklORyAiYXVkaW8veC13YXZwYWNrLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVwdGggPSAoaW50KSAzMiwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJhdGUgPSAoaW50KSA0NDEwMCwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyYW1lZCA9IChib29sZWFuKSB0cnVlIgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC13YXZwYWNrLCAiCisgICAgICAgICJkZXB0aCA9IChpbnQpIDMyLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSA0NDEwMCwgIiAiZnJhbWVkID0gKGJvb2xlYW4pIHRydWUiKSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBBVURJT19GT1JNQVQgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAicmF0ZSA9IChpbnQpIDQ0MTAwIikpOworCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF93YXZwYWNrZW5jICh2b2lkKQoreworICBHc3RFbGVtZW50ICp3YXZwYWNrZW5jOworCisgIEdTVF9ERUJVRyAoInNldHVwX3dhdnBhY2tlbmMiKTsKKyAgd2F2cGFja2VuYyA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgid2F2cGFja2VuYyIpOworICBteXNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkICh3YXZwYWNrZW5jLCAmc3JjdGVtcGxhdGUpOworICBteXNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKHdhdnBhY2tlbmMsICZzaW5rdGVtcGxhdGUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIFRSVUUpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHdhdnBhY2tlbmMsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKyAgYnVzID0gZ3N0X2J1c19uZXcgKCk7CisKKyAgZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKCJ0ZXN0LXNpbGVuY2UiKSk7CisKKyAgcmV0dXJuIHdhdnBhY2tlbmM7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX3dhdnBhY2tlbmMgKEdzdEVsZW1lbnQgKiB3YXZwYWNrZW5jKQoreworICBHU1RfREVCVUcgKCJjbGVhbnVwX3dhdnBhY2tlbmMiKTsKKworICBnc3RfYnVzX3NldF9mbHVzaGluZyAoYnVzLCBUUlVFKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAod2F2cGFja2VuYywgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1QgKGJ1cykpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAod2F2cGFja2VuYywgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIEZBTFNFKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKHdhdnBhY2tlbmMpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKHdhdnBhY2tlbmMpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAod2F2cGFja2VuYyk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2VuY29kZV9zaWxlbmNlKQoreworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgIEdzdEVsZW1lbnQgKndhdnBhY2tlbmM7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdEV2ZW50ICplb3MgPSBnc3RfZXZlbnRfbmV3X2VvcyAoKTsKKyAgaW50IGksIG51bV9idWZmZXJzOworCisgIHdhdnBhY2tlbmMgPSBzZXR1cF93YXZwYWNrZW5jICgpOworCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworCisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMDAwKTsKKyAgZ3N0X2J1ZmZlcl9tZW1zZXQgKGluYnVmZmVyLCAwLCAwLCAxMDAwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKFJBV19DQVBTX1NUUklORyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3NldF9jYXBzIChteXNyY3BhZCwgY2FwcykpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAod2F2cGFja2VuYywgYnVzKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlciksIEdTVF9GTE9XX09LKTsKKworICBmYWlsX2lmIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBlb3MpICE9IFRSVUUpOworCisgIC8qIGNoZWNrIGZpcnN0IGJ1ZmZlciAqLworICBvdXRidWZmZXIgPSBHU1RfQlVGRkVSIChidWZmZXJzLT5kYXRhKTsKKworICBmYWlsX2lmIChvdXRidWZmZXIgPT0gTlVMTCk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZmZlciksIDApOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWZmZXIpLCA1NjY4OTM0KTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgMCwgInd2cGsiLCA0KSA9PSAwLAorICAgICAgIkZhaWxlZCB0byBlbmNvZGUgdG8gdmFsaWQgV2F2cGFjayBmcmFtZXMiKTsKKworICAvKiBmcmVlIGFsbCBidWZmZXJzICovCisgIG51bV9idWZmZXJzID0gZ19saXN0X2xlbmd0aCAoYnVmZmVycyk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9idWZmZXJzOyArK2kpIHsKKyAgICBvdXRidWZmZXIgPSBHU1RfQlVGRkVSIChidWZmZXJzLT5kYXRhKTsKKyAgICBmYWlsX2lmIChvdXRidWZmZXIgPT0gTlVMTCk7CisKKyAgICBidWZmZXJzID0gZ19saXN0X3JlbW92ZSAoYnVmZmVycywgb3V0YnVmZmVyKTsKKworICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1ZmZlcik7CisgICAgb3V0YnVmZmVyID0gTlVMTDsKKyAgfQorCisgIGdfbGlzdF9mcmVlIChidWZmZXJzKTsKKyAgYnVmZmVycyA9IE5VTEw7CisKKyAgY2xlYW51cF93YXZwYWNrZW5jICh3YXZwYWNrZW5jKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgord2F2cGFja2VuY19zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJ3YXZwYWNrZW5jIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2VuY29kZV9zaWxlbmNlKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHdhdnBhY2tlbmMpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFja3BhcnNlLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzY0ZGVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFja3BhcnNlLmMKQEAgLTAsMCArMSwyMzQgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIHVuaXQgdGVzdCBmb3Igd2F2cGFja3BhcnNlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworLyogRm9yIGVhc2Ugb2YgcHJvZ3JhbW1pbmcgd2UgdXNlIGdsb2JhbHMgdG8ga2VlcCByZWZzIGZvciBvdXIgZmxvYXRpbmcKKyAqIHNyYyBhbmQgc2luayBwYWRzIHdlIGNyZWF0ZTsgb3RoZXJ3aXNlIHdlIGFsd2F5cyBoYXZlIHRvIGRvIGdldF9wYWQsCisgKiBnZXRfcGVlciwgYW5kIHRoZW4gcmVtb3ZlIHJlZmVyZW5jZXMgaW4gZXZlcnkgdGVzdCBmdW5jdGlvbiAqLworc3RhdGljIEdzdFBhZCAqbXlzcmNwYWQsICpteXNpbmtwYWQ7CisKKy8qIFdhdnBhY2sgZmlsZSB3aXRoIDIgZnJhbWVzIG9mIHNpbGVuY2UgKi8KK2d1aW50OCB0ZXN0X2ZpbGVbXSA9IHsKKyAgMHg3NywgMHg3NiwgMHg3MCwgMHg2QiwgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgLyogZmlyc3QgZnJhbWUgKi8KKyAgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDOCwgMHgwMCwgMHgwMCwgICAgICAgLyogaW5jbHVkZSBSSUZGIGhlYWRlciAqLworICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDY0LCAweDAwLCAweDAwLAorICAweDA1LCAweDE4LCAweDgwLCAweDA0LCAweEZGLCAweEFGLCAweDgwLCAweDYwLAorICAweDIxLCAweDE2LCAweDUyLCAweDQ5LCAweDQ2LCAweDQ2LCAweDI0LCAweDkwLAorICAweDAxLCAweDAwLCAweDU3LCAweDQxLCAweDU2LCAweDQ1LCAweDY2LCAweDZELAorICAweDc0LCAweDIwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAorICAweDAxLCAweDAwLCAweDQ0LCAweEFDLCAweDAwLCAweDAwLCAweDg4LCAweDU4LAorICAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDEwLCAweDAwLCAweDY0LCAweDYxLAorICAweDc0LCAweDYxLCAweDAwLCAweDkwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLAorICAweDAzLCAweDAwLCAweDA0LCAweDAwLCAweDA1LCAweDAzLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDY1LCAweDAyLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDhBLCAweDAyLCAweDAwLCAweDAwLCAweEZGLCAweDdGLAorICAweDAwLCAweEU0LAorICAweDc3LCAweDc2LCAweDcwLCAweDZCLCAweDJFLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAvKiBzZWNvbmQgZnJhbWUgKi8KKyAgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgMHgwMCwgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMCwgMHgwMCwKKyAgMHgwNSwgMHgxOCwgMHg4MCwgMHgwNCwgMHhGRiwgMHhBRiwgMHg4MCwgMHg2MCwKKyAgMHgwMiwgMHgwMCwgMHgwMywgMHgwMCwgMHgwNCwgMHgwMCwgMHgwNSwgMHgwMywKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHgwMiwKKyAgMHgwMCwgMHgwMCwgMHhGRiwgMHg3RiwgMHgwMCwgMHhFNCwKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXdhdnBhY2ssICIKKyAgICAgICAgImRlcHRoID0gKGludCkgMTYsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIDQ0MTAwLCAiICJmcmFtZWQgPSAoYm9vbGVhbikgVFJVRSIpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtd2F2cGFjayIpKTsKKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfd2F2cGFja3BhcnNlICh2b2lkKQoreworICBHc3RFbGVtZW50ICp3YXZwYWNrcGFyc2U7CisKKyAgR1NUX0RFQlVHICgic2V0dXBfd2F2cGFja3BhcnNlIik7CisKKyAgd2F2cGFja3BhcnNlID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJ3YXZwYWNrcGFyc2UiKTsKKyAgbXlzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAod2F2cGFja3BhcnNlLCAmc3JjdGVtcGxhdGUpOworICBteXNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKHdhdnBhY2twYXJzZSwgJnNpbmt0ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCB3YXZwYWNrcGFyc2UsIE5VTEwsIEdTVF9GT1JNQVRfQllURVMpOworCisgIHJldHVybiB3YXZwYWNrcGFyc2U7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX3dhdnBhY2twYXJzZSAoR3N0RWxlbWVudCAqIHdhdnBhY2twYXJzZSkKK3sKKyAgR1NUX0RFQlVHICgiY2xlYW51cF93YXZwYWNrcGFyc2UiKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlICh3YXZwYWNrcGFyc2UsIEdTVF9TVEFURV9OVUxMKTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBGQUxTRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBGQUxTRSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zcmNfcGFkICh3YXZwYWNrcGFyc2UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKHdhdnBhY2twYXJzZSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50ICh3YXZwYWNrcGFyc2UpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzaW5nX3ZhbGlkX2ZyYW1lcykKK3sKKyAgR3N0RWxlbWVudCAqd2F2cGFja3BhcnNlOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBpbnQgaSwgbnVtX2J1ZmZlcnM7CisgIEdzdEZvcm1hdCBmb3JtYXQgPSBHU1RfRk9STUFUX1RJTUU7CisgIGdpbnQ2NCBwb3M7CisKKyAgd2F2cGFja3BhcnNlID0gc2V0dXBfd2F2cGFja3BhcnNlICgpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlICh3YXZwYWNrcGFyc2UsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZW9mICh0ZXN0X2ZpbGUpKTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChpbmJ1ZmZlciwgMCwgdGVzdF9maWxlLCBzaXplb2YgKHRlc3RfZmlsZSkpOworCisgIC8qIHNob3VsZCBkZWNvZGUgdGhlIGJ1ZmZlciB3aXRob3V0IHByb2JsZW1zICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSwgR1NUX0ZMT1dfT0spOworCisgIC8qIGluZm9ybSBvZiBubyBmdXJ0aGVyIGRhdGEgKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKSk7CisKKyAgbnVtX2J1ZmZlcnMgPSBnX2xpc3RfbGVuZ3RoIChidWZmZXJzKTsKKyAgLyogc2hvdWxkIGdldCAyIGJ1ZmZlcnMsIGVhY2ggb25lIGNvbXBsZXRlIHdhdnBhY2sgZnJhbWUgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobnVtX2J1ZmZlcnMsIDIpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fYnVmZmVyczsgKytpKSB7CisgICAgb3V0YnVmZmVyID0gR1NUX0JVRkZFUiAoYnVmZmVycy0+ZGF0YSk7CisgICAgZmFpbF9pZiAob3V0YnVmZmVyID09IE5VTEwpOworCisgICAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChvdXRidWZmZXIsIDAsICJ3dnBrIiwgNCkgPT0gMCwKKyAgICAgICAgIkJ1ZmZlciBjb250YWlucyBubyBXYXZwYWNrIGZyYW1lIik7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmZmVyKSwgNTgwNDk4ODY2KTsKKworICAgIHN3aXRjaCAoaSkgeworICAgICAgY2FzZSAwOnsKKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZmZlciksIDApOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgMTp7CisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWZmZXIpLCA1ODA0OTg4NjYpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBidWZmZXJzID0gZ19saXN0X3JlbW92ZSAoYnVmZmVycywgb3V0YnVmZmVyKTsKKworICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1ZmZlcik7CisgICAgb3V0YnVmZmVyID0gTlVMTDsKKyAgfQorCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9xdWVyeV9wb3NpdGlvbiAod2F2cGFja3BhcnNlLCBmb3JtYXQsICZwb3MpLAorICAgICAgIlBvc2l0aW9uIHF1ZXJ5IGZhaWxlZCIpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50NjQgKHBvcywgNTgwNDk4ODY2ICogMik7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9xdWVyeV9kdXJhdGlvbiAod2F2cGFja3BhcnNlLCBmb3JtYXQsIE5VTEwpLAorICAgICAgIkR1cmF0aW9uIHF1ZXJ5IGZhaWxlZCIpOworCisgIGdfbGlzdF9mcmVlIChidWZmZXJzKTsKKyAgYnVmZmVycyA9IE5VTEw7CisKKyAgY2xlYW51cF93YXZwYWNrcGFyc2UgKHdhdnBhY2twYXJzZSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2luZ19pbnZhbGlkX2ZpcnN0X2hlYWRlcikKK3sKKyAgR3N0RWxlbWVudCAqd2F2cGFja3BhcnNlOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBpbnQgaSwgbnVtX2J1ZmZlcnM7CisKKyAgd2F2cGFja3BhcnNlID0gc2V0dXBfd2F2cGFja3BhcnNlICgpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlICh3YXZwYWNrcGFyc2UsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZW9mICh0ZXN0X2ZpbGUpKTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChpbmJ1ZmZlciwgMCwgdGVzdF9maWxlLCBzaXplb2YgKHRlc3RfZmlsZSkpOworICBnc3RfYnVmZmVyX21lbXNldCAoaW5idWZmZXIsIDAsICdrJywgMSk7CisKKyAgLyogc2hvdWxkIGRlY29kZSB0aGUgYnVmZmVyIHdpdGhvdXQgcHJvYmxlbXMgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpLCBHU1RfRkxPV19PSyk7CisKKyAgLyogaW5mb3JtIG9mIG5vIGZ1cnRoZXIgZGF0YSAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKworICBudW1fYnVmZmVycyA9IGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpOworCisgIC8qIHNob3VsZCBnZXQgMSBidWZmZXJzLCB0aGUgc2Vjb25kIG5vbi1icm9rZW4gb25lICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG51bV9idWZmZXJzLCAxKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2J1ZmZlcnM7ICsraSkgeworICAgIG91dGJ1ZmZlciA9IEdTVF9CVUZGRVIgKGJ1ZmZlcnMtPmRhdGEpOworICAgIGZhaWxfaWYgKG91dGJ1ZmZlciA9PSBOVUxMKTsKKworICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAob3V0YnVmZmVyLCAwLCAid3ZwayIsIDQpID09IDAsCisgICAgICAgICJCdWZmZXIgY29udGFpbnMgbm8gV2F2cGFjayBmcmFtZSIpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZmZlciksIDU4MDQ5ODg2Nik7CisKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgIGNhc2UgMDp7CisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWZmZXIpLCA1ODA0OTg4NjYpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBidWZmZXJzID0gZ19saXN0X3JlbW92ZSAoYnVmZmVycywgb3V0YnVmZmVyKTsKKworICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1ZmZlcik7CisgICAgb3V0YnVmZmVyID0gTlVMTDsKKyAgfQorCisgIGdfbGlzdF9mcmVlIChidWZmZXJzKTsKKyAgYnVmZmVycyA9IE5VTEw7CisKKyAgY2xlYW51cF93YXZwYWNrcGFyc2UgKHdhdnBhY2twYXJzZSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitzdGF0aWMgU3VpdGUgKgord2F2cGFja3BhcnNlX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoIndhdnBhY2twYXJzZSIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzaW5nX3ZhbGlkX2ZyYW1lcyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzaW5nX2ludmFsaWRfZmlyc3RfaGVhZGVyKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHdhdnBhY2twYXJzZSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYXJzZS5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzkxMTA2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFyc2UuYwpAQCAtMCwwICsxLDE1MCBAQAorLyogR1N0cmVhbWVyIFdhdlBhcnNlIHVuaXQgdGVzdHMKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisKKyNkZWZpbmUgU0lNUExFX1dBVl9QQVRIIEdTVF9URVNUX0ZJTEVTX1BBVEggR19ESVJfU0VQQVJBVE9SX1MgImF1ZGlvdGVzdHNyYy53YXYiCisKK3N0YXRpYyB2b2lkCitkb190ZXN0X3NpbXBsZV9maWxlIChHc3RQYWRNb2RlIG1vZGUpCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdEVsZW1lbnQgKnNyYywgKnEgPSBOVUxMOworICBHc3RFbGVtZW50ICp3YXZwYXJzZTsKKyAgR3N0RWxlbWVudCAqZmFrZXNpbms7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKCJ0ZXN0cGlwZSIpOworICBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmaWxlc3JjIiwgTlVMTCk7CisgIGZhaWxfaWYgKHNyYyA9PSBOVUxMKTsKKyAgaWYgKG1vZGUgPT0gR1NUX1BBRF9NT0RFX1BVU0gpCisgICAgcSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInF1ZXVlIiwgTlVMTCk7CisgIHdhdnBhcnNlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgid2F2cGFyc2UiLCBOVUxMKTsKKyAgZmFpbF9pZiAod2F2cGFyc2UgPT0gTlVMTCk7CisgIGZha2VzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCBOVUxMKTsKKyAgZmFpbF9pZiAoZmFrZXNpbmsgPT0gTlVMTCk7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBzcmMsIHdhdnBhcnNlLCBmYWtlc2luaywgcSwgTlVMTCk7CisKKyAgZ19vYmplY3Rfc2V0IChzcmMsICJsb2NhdGlvbiIsIFNJTVBMRV9XQVZfUEFUSCwgTlVMTCk7CisKKyAgaWYgKG1vZGUgPT0gR1NUX1BBRF9NT0RFX1BVU0gpCisgICAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmtfbWFueSAoc3JjLCBxLCB3YXZwYXJzZSwgZmFrZXNpbmssIE5VTEwpKTsKKyAgZWxzZQorICAgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rX21hbnkgKHNyYywgd2F2cGFyc2UsIGZha2VzaW5rLCBOVUxMKSk7CisKKyAgcmV0ID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChyZXQsIEdTVF9TVEFURV9DSEFOR0VfQVNZTkMpOworCisgIHJldCA9IGdzdF9lbGVtZW50X2dldF9zdGF0ZSAocGlwZWxpbmUsIE5VTEwsIE5VTEwsIEdTVF9DTE9DS19USU1FX05PTkUpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChyZXQsIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgbXNnID0gZ3N0X2J1c190aW1lZF9wb3BfZmlsdGVyZWQgKEdTVF9FTEVNRU5UX0JVUyAocGlwZWxpbmUpLAorICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSwgR1NUX01FU1NBR0VfRU9TIHwgR1NUX01FU1NBR0VfRVJST1IpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKEdTVF9NRVNTQUdFX1RZUEVfTkFNRSAobXNnKSwgImVvcyIpOworCisgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfc2ltcGxlX2ZpbGVfcHVsbCkKK3sKKyAgZG9fdGVzdF9zaW1wbGVfZmlsZSAoVFJVRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfc2ltcGxlX2ZpbGVfcHVzaCkKK3sKKyAgZG9fdGVzdF9zaW1wbGVfZmlsZSAoRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyB2b2lkCitkb190ZXN0X2VtcHR5X2ZpbGUgKGdib29sZWFuIGNhbl9hY3RpdmF0ZV9wdWxsKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQxLCByZXQyOworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0RWxlbWVudCAqc3JjOworICBHc3RFbGVtZW50ICp3YXZwYXJzZTsKKyAgR3N0RWxlbWVudCAqZmFrZXNpbms7CisKKyAgLyogUHVsbCBtb2RlICovCisgIHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoInRlc3RwaXBlIik7CisgIHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzcmMiLCBOVUxMKTsKKyAgZmFpbF9pZiAoc3JjID09IE5VTEwpOworICB3YXZwYXJzZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoIndhdnBhcnNlIiwgTlVMTCk7CisgIGZhaWxfaWYgKHdhdnBhcnNlID09IE5VTEwpOworICBmYWtlc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgTlVMTCk7CisgIGZhaWxfaWYgKGZha2VzaW5rID09IE5VTEwpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc3JjLCB3YXZwYXJzZSwgZmFrZXNpbmssIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNyYywgIm51bS1idWZmZXJzIiwgMCwgImNhbi1hY3RpdmF0ZS1wdWxsIiwgY2FuX2FjdGl2YXRlX3B1bGwsCisgICAgICBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGlua19tYW55IChzcmMsIHdhdnBhcnNlLCBmYWtlc2luaywgTlVMTCkpOworCisgIHJldDEgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGlmIChyZXQxID09IEdTVF9TVEFURV9DSEFOR0VfQVNZTkMpCisgICAgcmV0MiA9IGdzdF9lbGVtZW50X2dldF9zdGF0ZSAocGlwZWxpbmUsIE5VTEwsIE5VTEwsIEdTVF9DTE9DS19USU1FX05PTkUpOworICBlbHNlCisgICAgcmV0MiA9IHJldDE7CisKKyAgLyogc2hvdWxkIGhhdmUgZ290dGVuIGFuIGVycm9yIG9uIHRoZSBidXMsIG5vIG91dHB1dCB0byBmYWtlc2luayAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChyZXQyLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9lbXB0eV9maWxlX3B1bGwpCit7CisgIGRvX3Rlc3RfZW1wdHlfZmlsZSAoVFJVRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZW1wdHlfZmlsZV9wdXNoKQoreworICBkb190ZXN0X2VtcHR5X2ZpbGUgKEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgord2F2cGFyc2Vfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgid2F2cGFyc2UiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgid2F2cGFyc2UiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2VtcHR5X2ZpbGVfcHVsbCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9lbXB0eV9maWxlX3B1c2gpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfc2ltcGxlX2ZpbGVfcHVsbCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9zaW1wbGVfZmlsZV9wdXNoKTsKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOICh3YXZwYXJzZSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3k0bWVuYy5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMveTRtZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZiZGIyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3k0bWVuYy5jCkBAIC0wLDAgKzEsMTY4IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIHk0bWVuYworICoKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IE1hcmsgTmF1d2VsYWVydHMgPG1hbmF1d0Bza3luZXQuYmU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisKKy8qIEZvciBlYXNlIG9mIHByb2dyYW1taW5nIHdlIHVzZSBnbG9iYWxzIHRvIGtlZXAgcmVmcyBmb3Igb3VyIGZsb2F0aW5nCisgKiBzcmMgYW5kIHNpbmsgcGFkcyB3ZSBjcmVhdGU7IG90aGVyd2lzZSB3ZSBhbHdheXMgaGF2ZSB0byBkbyBnZXRfcGFkLAorICogZ2V0X3BlZXIsIGFuZCB0aGVuIHJlbW92ZSByZWZlcmVuY2VzIGluIGV2ZXJ5IHRlc3QgZnVuY3Rpb24gKi8KK3N0YXRpYyBHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworCisjZGVmaW5lIFZJREVPX0NBUFNfU1RSSU5HICJ2aWRlby94LXJhdywgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgSTQyMCwgIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aCA9IChpbnQpIDM4NCwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0ID0gKGludCkgMjg4LCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIDI1LzEsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInBpeGVsLWFzcGVjdC1yYXRpbyA9IChmcmFjdGlvbikgMS8xIgorCisjZGVmaW5lIFk0TV9DQVBTX1NUUklORyAiYXBwbGljYXRpb24veC15dXY0bXBlZywgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAieTRtdmVyc2lvbiA9IChpbnQpIDIiCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFk0TV9DQVBTX1NUUklORykpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChWSURFT19DQVBTX1NUUklORykpOworCisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX3k0bWVuYyAodm9pZCkKK3sKKyAgR3N0RWxlbWVudCAqeTRtZW5jOworCisgIEdTVF9ERUJVRyAoInNldHVwX3k0bWVuYyIpOworICB5NG1lbmMgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoInk0bWVuYyIpOworICBteXNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkICh5NG1lbmMsICZzcmN0ZW1wbGF0ZSk7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAoeTRtZW5jLCAmc2lua3RlbXBsYXRlKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICByZXR1cm4geTRtZW5jOworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF95NG1lbmMgKEdzdEVsZW1lbnQgKiB5NG1lbmMpCit7CisgIEdTVF9ERUJVRyAoImNsZWFudXBfeTRtZW5jIik7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoeTRtZW5jLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAoeTRtZW5jKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkICh5NG1lbmMpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAoeTRtZW5jKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfeTRtKQoreworICBHc3RFbGVtZW50ICp5NG1lbmM7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGludCBpLCBudW1fYnVmZmVycywgc2l6ZTsKKyAgY29uc3QgZ2NoYXIgKmRhdGEwID0gIllVVjRNUEVHMiBXMzg0IEgyODggSXAgRjI1OjEgQTE6MVxuIjsKKyAgY29uc3QgZ2NoYXIgKmRhdGExID0gIllVVjRNUEVHMiBDNDIwIFczODQgSDI4OCBJcCBGMjU6MSBBMToxXG4iOworICBjb25zdCBnY2hhciAqZGF0YTIgPSAiRlJBTUVcbiI7CisKKyAgeTRtZW5jID0gc2V0dXBfeTRtZW5jICgpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlICh5NG1lbmMsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICAvKiBjb3JyZXNwb25kcyB0byBJNDIwIGJ1ZmZlciBmb3IgdGhlIHNpemUgbWVudGlvbmVkIGluIHRoZSBjYXBzICovCisgIHNpemUgPSAzODQgKiAyODggKiAzIC8gMjsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHNpemUpOworICAvKiBtYWtlcyB2YWxncmluZCdzIG1lbWNoZWNrIGhhcHBpZXIgKi8KKyAgZ3N0X2J1ZmZlcl9tZW1zZXQgKGluYnVmZmVyLCAwLCAwLCBzaXplKTsKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChWSURFT19DQVBTX1NUUklORyk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCB5NG1lbmMsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisKKyAgbnVtX2J1ZmZlcnMgPSBnX2xpc3RfbGVuZ3RoIChidWZmZXJzKTsKKyAgZmFpbF91bmxlc3MgKG51bV9idWZmZXJzID09IDEpOworCisgIC8qIGNsZWFuIHVwIGJ1ZmZlcnMgKi8KKyAgZm9yIChpID0gMDsgaSA8IG51bV9idWZmZXJzOyArK2kpIHsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBnY2hhciAqZGF0YTsKKyAgICBnc2l6ZSBvdXRzaXplOworCisgICAgb3V0YnVmZmVyID0gR1NUX0JVRkZFUiAoYnVmZmVycy0+ZGF0YSk7CisgICAgZmFpbF9pZiAob3V0YnVmZmVyID09IE5VTEwpOworCisgICAgc3dpdGNoIChpKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICAgIG91dHNpemUgPSBtYXAuc2l6ZTsKKyAgICAgICAgZGF0YSA9IChnY2hhciAqKSBtYXAuZGF0YTsKKworICAgICAgICBmYWlsX3VubGVzcyAob3V0c2l6ZSA+IHNpemUpOworICAgICAgICBmYWlsX3VubGVzcyAobWVtY21wIChkYXRhLCBkYXRhMCwgc3RybGVuIChkYXRhMCkpID09IDAgfHwKKyAgICAgICAgICAgIG1lbWNtcCAoZGF0YSwgZGF0YTEsIHN0cmxlbiAoZGF0YTEpKSA9PSAwKTsKKyAgICAgICAgLyogc28gd2Uga25vdyB0aGVyZSBpcyBhIG5ld2xpbmUgKi8KKyAgICAgICAgZGF0YSA9IHN0cmNociAoZGF0YSwgJ1xuJyk7CisgICAgICAgIGZhaWxfdW5sZXNzIChkYXRhICE9IE5VTEwpOworICAgICAgICBkYXRhKys7CisgICAgICAgIGZhaWxfdW5sZXNzIChtZW1jbXAgKGRhdGEyLCBkYXRhLCBzdHJsZW4gKGRhdGEyKSkgPT0gMCk7CisgICAgICAgIGRhdGEgKz0gc3RybGVuIChkYXRhMik7CisgICAgICAgIC8qIHJlbWFpbmRlciBtdXN0IGJlIGZyYW1lIGRhdGEgKi8KKyAgICAgICAgZmFpbF91bmxlc3MgKGRhdGEgLSAoZ2NoYXIgKikgbWFwLmRhdGEgKyBzaXplID09IG91dHNpemUpOworICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBidWZmZXJzID0gZ19saXN0X3JlbW92ZSAoYnVmZmVycywgb3V0YnVmZmVyKTsKKworICAgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKG91dGJ1ZmZlciwgIm91dGJ1ZmZlciIsIDEpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1ZmZlcik7CisgICAgb3V0YnVmZmVyID0gTlVMTDsKKyAgfQorCisgIGNsZWFudXBfeTRtZW5jICh5NG1lbmMpOworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCit5NG1lbmNfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgieTRtZW5jIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3k0bSk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOICh5NG1lbmMpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZ2VuZXJpYy8uZ2l0aWdub3JlIGIvdGVzdHMvY2hlY2svZ2VuZXJpYy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkOWJkMWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9nZW5lcmljLy5naXRpZ25vcmUKQEAgLTAsMCArMSwzIEBACisuZGlyc3RhbXAKK2luZGV4CitzdGF0ZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2dlbmVyaWMvc3RhdGVzLmMgYi90ZXN0cy9jaGVjay9nZW5lcmljL3N0YXRlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNzJlNjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9nZW5lcmljL3N0YXRlcy5jCkBAIC0wLDAgKzEsMjI1IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIHN0YXRlIGNoYW5nZXMgb24gYWxsIGVsZW1lbnRzCisgKgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworc3RhdGljIEdMaXN0ICplbGVtZW50cyA9IE5VTEw7CisKK3N0YXRpYyB2b2lkCitzZXR1cCAodm9pZCkKK3sKKyAgR0xpc3QgKmZlYXR1cmVzLCAqZjsKKyAgR0xpc3QgKnBsdWdpbnMsICpwOworICBnY2hhciAqKmlnbm9yZWxpc3QgPSBOVUxMOworICBjb25zdCBnY2hhciAqU1RBVEVfSUdOT1JFX0VMRU1FTlRTID0gTlVMTDsKKyAgR3N0UmVnaXN0cnkgKmRlZjsKKworICBHU1RfREVCVUcgKCJnZXR0aW5nIGVsZW1lbnRzIGZvciBwYWNrYWdlICVzIiwgUEFDS0FHRSk7CisgIFNUQVRFX0lHTk9SRV9FTEVNRU5UUyA9IGdfZ2V0ZW52ICgiR1NUX1NUQVRFX0lHTk9SRV9FTEVNRU5UUyIpOworICBpZiAoIWdfZ2V0ZW52ICgiR1NUX05PX1NUQVRFX0lHTk9SRV9FTEVNRU5UUyIpICYmIFNUQVRFX0lHTk9SRV9FTEVNRU5UUykgeworICAgIEdTVF9ERUJVRyAoIldpbGwgaWdub3JlIGVsZW1lbnQgZmFjdG9yaWVzOiAnJXMnIiwgU1RBVEVfSUdOT1JFX0VMRU1FTlRTKTsKKyAgICBpZ25vcmVsaXN0ID0gZ19zdHJzcGxpdCAoU1RBVEVfSUdOT1JFX0VMRU1FTlRTLCAiICIsIDApOworICB9CisKKyAgZGVmID0gZ3N0X3JlZ2lzdHJ5X2dldCAoKTsKKworICBwbHVnaW5zID0gZ3N0X3JlZ2lzdHJ5X2dldF9wbHVnaW5fbGlzdCAoZGVmKTsKKworICBmb3IgKHAgPSBwbHVnaW5zOyBwOyBwID0gcC0+bmV4dCkgeworICAgIEdzdFBsdWdpbiAqcGx1Z2luID0gcC0+ZGF0YTsKKworICAgIGlmIChzdHJjbXAgKGdzdF9wbHVnaW5fZ2V0X3NvdXJjZSAocGx1Z2luKSwgUEFDS0FHRSkgIT0gMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgZmVhdHVyZXMgPQorICAgICAgICBnc3RfcmVnaXN0cnlfZ2V0X2ZlYXR1cmVfbGlzdF9ieV9wbHVnaW4gKGRlZiwKKyAgICAgICAgZ3N0X3BsdWdpbl9nZXRfbmFtZSAocGx1Z2luKSk7CisKKyAgICBmb3IgKGYgPSBmZWF0dXJlczsgZjsgZiA9IGYtPm5leHQpIHsKKyAgICAgIEdzdFBsdWdpbkZlYXR1cmUgKmZlYXR1cmUgPSBmLT5kYXRhOworICAgICAgY29uc3QgZ2NoYXIgKm5hbWUgPSBnc3RfcGx1Z2luX2ZlYXR1cmVfZ2V0X25hbWUgKGZlYXR1cmUpOworICAgICAgZ2Jvb2xlYW4gaWdub3JlID0gRkFMU0U7CisKKyAgICAgIGlmICghR1NUX0lTX0VMRU1FTlRfRkFDVE9SWSAoZmVhdHVyZSkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAoaWdub3JlbGlzdCkgeworICAgICAgICBnY2hhciAqKnM7CisKKyAgICAgICAgZm9yIChzID0gaWdub3JlbGlzdDsgcyAmJiAqczsgKytzKSB7CisgICAgICAgICAgaWYgKGdfc3RyX2hhc19wcmVmaXggKG5hbWUsICpzKSkgeworICAgICAgICAgICAgR1NUX0RFQlVHICgiaWdub3JpbmcgZWxlbWVudCAlcyIsIG5hbWUpOworICAgICAgICAgICAgaWdub3JlID0gVFJVRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlnbm9yZSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgR1NUX0RFQlVHICgiYWRkaW5nIGVsZW1lbnQgJXMiLCBuYW1lKTsKKyAgICAgIGVsZW1lbnRzID0gZ19saXN0X3ByZXBlbmQgKGVsZW1lbnRzLCAoZ3BvaW50ZXIpIGdfc3RyZHVwIChuYW1lKSk7CisgICAgfQorICAgIGdzdF9wbHVnaW5fZmVhdHVyZV9saXN0X2ZyZWUgKGZlYXR1cmVzKTsKKyAgfQorICBnc3RfcGx1Z2luX2xpc3RfZnJlZSAocGx1Z2lucyk7CisgIGdfc3RyZnJlZXYgKGlnbm9yZWxpc3QpOworfQorCitzdGF0aWMgdm9pZAordGVhcmRvd24gKHZvaWQpCit7CisgIEdMaXN0ICplOworCisgIGZvciAoZSA9IGVsZW1lbnRzOyBlOyBlID0gZS0+bmV4dCkgeworICAgIGdfZnJlZSAoZS0+ZGF0YSk7CisgIH0KKyAgZ19saXN0X2ZyZWUgKGVsZW1lbnRzKTsKKyAgZWxlbWVudHMgPSBOVUxMOworfQorCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3N0YXRlX2NoYW5nZXNfdXBfYW5kX2Rvd25fc2VxKQoreworICBHc3RFbGVtZW50ICplbGVtZW50OworICBHTGlzdCAqZTsKKworICBmb3IgKGUgPSBlbGVtZW50czsgZTsgZSA9IGUtPm5leHQpIHsKKyAgICBjb25zdCBnY2hhciAqbmFtZSA9IGUtPmRhdGE7CisKKyAgICBHU1RfSU5GTyAoInRlc3RpbmcgZWxlbWVudCAlcyIsIG5hbWUpOworICAgIGVsZW1lbnQgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKG5hbWUsIG5hbWUpOworICAgIGZhaWxfaWYgKGVsZW1lbnQgPT0gTlVMTCwgIkNvdWxkIG5vdCBtYWtlIGVsZW1lbnQgZnJvbSBmYWN0b3J5ICVzIiwgbmFtZSk7CisKKyAgICBpZiAoR1NUX0lTX1BJUEVMSU5FIChlbGVtZW50KSkgeworICAgICAgR1NUX0RFQlVHICgiZWxlbWVudCAlcyBpcyBhIHBpcGVsaW5lIiwgbmFtZSk7CisgICAgfQorCisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfUkVBRFkpOworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX1BBVVNFRCk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfUExBWUlORyk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsIEdTVF9TVEFURV9SRUFEWSk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfTlVMTCk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsIEdTVF9TVEFURV9SRUFEWSk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfUExBWUlORyk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsIEdTVF9TVEFURV9OVUxMKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChHU1RfT0JKRUNUIChlbGVtZW50KSk7CisgIH0KK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9zdGF0ZV9jaGFuZ2VzX3VwX3NlcSkKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudDsKKyAgR0xpc3QgKmU7CisKKyAgZm9yIChlID0gZWxlbWVudHM7IGU7IGUgPSBlLT5uZXh0KSB7CisgICAgY29uc3QgZ2NoYXIgKm5hbWUgPSBlLT5kYXRhOworCisgICAgR1NUX0lORk8gKCJ0ZXN0aW5nIGVsZW1lbnQgJXMiLCBuYW1lKTsKKyAgICBlbGVtZW50ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlIChuYW1lLCBuYW1lKTsKKyAgICBmYWlsX2lmIChlbGVtZW50ID09IE5VTEwsICJDb3VsZCBub3QgbWFrZSBlbGVtZW50IGZyb20gZmFjdG9yeSAlcyIsIG5hbWUpOworCisgICAgaWYgKEdTVF9JU19QSVBFTElORSAoZWxlbWVudCkpIHsKKyAgICAgIEdTVF9ERUJVRyAoImVsZW1lbnQgJXMgaXMgYSBwaXBlbGluZSIsIG5hbWUpOworICAgIH0KKworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX1JFQURZKTsKKworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX1BBVVNFRCk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfUkVBRFkpOworCisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsIEdTVF9TVEFURV9QQVVTRUQpOworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX1JFQURZKTsKKworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX05VTEwpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1QgKGVsZW1lbnQpKTsKKyAgfQorfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3N0YXRlX2NoYW5nZXNfZG93bl9zZXEpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQ7CisgIEdMaXN0ICplOworCisgIGZvciAoZSA9IGVsZW1lbnRzOyBlOyBlID0gZS0+bmV4dCkgeworICAgIGNvbnN0IGdjaGFyICpuYW1lID0gZS0+ZGF0YTsKKworICAgIEdTVF9JTkZPICgidGVzdGluZyBlbGVtZW50ICVzIiwgbmFtZSk7CisgICAgZWxlbWVudCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAobmFtZSwgbmFtZSk7CisgICAgZmFpbF9pZiAoZWxlbWVudCA9PSBOVUxMLCAiQ291bGQgbm90IG1ha2UgZWxlbWVudCBmcm9tIGZhY3RvcnkgJXMiLCBuYW1lKTsKKworICAgIGlmIChHU1RfSVNfUElQRUxJTkUgKGVsZW1lbnQpKSB7CisgICAgICBHU1RfREVCVUcgKCJlbGVtZW50ICVzIGlzIGEgcGlwZWxpbmUiLCBuYW1lKTsKKyAgICB9CisKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsIEdTVF9TVEFURV9SRUFEWSk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX1BBVVNFRCk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsIEdTVF9TVEFURV9QQVVTRUQpOworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX1JFQURZKTsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsIEdTVF9TVEFURV9QQVVTRUQpOworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsIEdTVF9TVEFURV9SRUFEWSk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfTlVMTCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAoR1NUX09CSkVDVCAoZWxlbWVudCkpOworICB9Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitzdGF0aWMgU3VpdGUgKgorc3RhdGVzX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoInN0YXRlc19nb29kIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX2NoZWNrZWRfZml4dHVyZSAodGNfY2hhaW4sIHNldHVwLCB0ZWFyZG93bik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9zdGF0ZV9jaGFuZ2VzX3VwX2FuZF9kb3duX3NlcSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9zdGF0ZV9jaGFuZ2VzX3VwX3NlcSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9zdGF0ZV9jaGFuZ2VzX2Rvd25fc2VxKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHN0YXRlcyk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9nc3QtcGx1Z2lucy1nb29kLnN1cHAgYi90ZXN0cy9jaGVjay9nc3QtcGx1Z2lucy1nb29kLnN1cHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk1OTg4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2dzdC1wbHVnaW5zLWdvb2Quc3VwcApAQCAtMCwwICsxLDE2NSBAQAoreworICAgPHNldmVyYWwgdmFsZ3JpbmQgd2FybmluZ3MgYXMgZm91bmQgd2l0aCBsaWJqcGVnIDZiIG9uIERlYmlhbj4KKyAgIE1lbWNoZWNrOkNvbmQKKyAgIG9iajovdXNyL2xpYi9saWJqcGVnLnNvLioKKyAgIG9iajovdXNyL2xpYi9saWJqcGVnLnNvLioKKyAgIG9iajovdXNyL2xpYi9saWJqcGVnLnNvLioKKyAgIGZ1bjpqcGVnX2ZpbmlzaF9kZWNvbXByZXNzCit9CisKK3sKKyAgIDxzZXZlcmFsIHZhbGdyaW5kIHdhcm5pbmdzIGFzIGZvdW5kIHdpdGggbGlianBlZyA2YiBvbiBEZWJpYW4+CisgICBNZW1jaGVjazpDb25kCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBmdW46anBlZ19jb25zdW1lX2lucHV0CisgICBmdW46anBlZ19yZWFkX2hlYWRlcgorfQorCit7CisgICA8c2V2ZXJhbCB2YWxncmluZCB3YXJuaW5ncyBhcyBmb3VuZCB3aXRoIGxpYmpwZWcgNmIgb24gRGViaWFuPgorICAgTWVtY2hlY2s6Q29uZAorICAgZnVuOmpwZWdfZmlsbF9iaXRfYnVmZmVyCisgICBmdW46anBlZ19odWZmX2RlY29kZQorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgZnVuOmpwZWdfcmVhZF9yYXdfZGF0YQorfQorCit7CisgICA8c2V2ZXJhbCB2YWxncmluZCB3YXJuaW5ncyBhcyBmb3VuZCB3aXRoIGxpYmpwZWcgNmIgb24gRGViaWFuPgorICAgTWVtY2hlY2s6Q29uZAorICAgZnVuOmpwZWdfZmlsbF9iaXRfYnVmZmVyCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBmdW46anBlZ19yZWFkX3Jhd19kYXRhCit9CisKK3sKKyAgIDxzZXZlcmFsIHZhbGdyaW5kIHdhcm5pbmdzIGFzIGZvdW5kIHdpdGggbGlianBlZyA2YiBvbiBEZWJpYW4+CisgICBNZW1jaGVjazpDb25kCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBmdW46anBlZ19jb25zdW1lX2lucHV0CisgICBmdW46anBlZ19yZWFkX2hlYWRlcgorfQorCit7CisgICA8c2V2ZXJhbCB2YWxncmluZCB3YXJuaW5ncyBhcyBmb3VuZCB3aXRoIGxpYmpwZWcgNmIgb24gRGViaWFuPgorICAgTWVtY2hlY2s6Q29uZAorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgZnVuOmpwZWdfZmluaXNoX2NvbXByZXNzCit9CisKK3sKKyAgIDxzZXZlcmFsIHZhbGdyaW5kIHdhcm5pbmdzIGFzIGZvdW5kIHdpdGggbGlianBlZyA2YiBvbiBEZWJpYW4+CisgICBNZW1jaGVjazpDb25kCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBmdW46anBlZ19maW5pc2hfY29tcHJlc3MKK30KKworeworICAgPHNldmVyYWwgdmFsZ3JpbmQgd2FybmluZ3MgYXMgZm91bmQgd2l0aCBsaWJqcGVnIDZiIG9uIERlYmlhbj4KKyAgIE1lbWNoZWNrOkNvbmQKKyAgIG9iajovdXNyL2xpYi9saWJqcGVnLnNvLioKKyAgIG9iajovdXNyL2xpYi9saWJqcGVnLnNvLioKKyAgIG9iajovdXNyL2xpYi9saWJqcGVnLnNvLioKKyAgIGZ1bjpqcGVnX2ZpbmlzaF9jb21wcmVzcworfQorCit7CisgICA8c2V2ZXJhbCB2YWxncmluZCB3YXJuaW5ncyBhcyBmb3VuZCB3aXRoIGxpYmpwZWcgNmIgb24gRGViaWFuPgorICAgTWVtY2hlY2s6Q29uZAorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgZnVuOmpwZWdfd3JpdGVfcmF3X2RhdGEKK30KKworeworICAgPHNldmVyYWwgdmFsZ3JpbmQgd2FybmluZ3MgYXMgZm91bmQgd2l0aCBsaWJqcGVnIDZiIG9uIERlYmlhbj4KKyAgIE1lbWNoZWNrOkNvbmQKKyAgIG9iajovdXNyL2xpYi9saWJqcGVnLnNvLioKKyAgIG9iajovdXNyL2xpYi9saWJqcGVnLnNvLioKKyAgIG9iajovdXNyL2xpYi9saWJqcGVnLnNvLioKKyAgIGZ1bjpqcGVnX3dyaXRlX3Jhd19kYXRhCit9CisKK3sKKyAgIDxzZXZlcmFsIHZhbGdyaW5kIHdhcm5pbmdzIGFzIGZvdW5kIHdpdGggbGlianBlZyA2YiBvbiBEZWJpYW4+CisgICBNZW1jaGVjazpDb25kCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBmdW46anBlZ193cml0ZV9yYXdfZGF0YQorfQorCit7CisgICA8c2V2ZXJhbCB2YWxncmluZCB3YXJuaW5ncyBhcyBmb3VuZCB3aXRoIGxpYmpwZWcgNmIgb24gRGViaWFuPgorICAgTWVtY2hlY2s6Q29uZAorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgZnVuOmpwZWdfd3JpdGVfcmF3X2RhdGEKK30KKworeworICAgPHNldmVyYWwgdmFsZ3JpbmQgd2FybmluZ3MgYXMgZm91bmQgd2l0aCBsaWJqcGVnIDZiIG9uIERlYmlhbj4KKyAgIE1lbWNoZWNrOkNvbmQKKyAgIG9iajovdXNyL2xpYi9saWJqcGVnLnNvLioKKyAgIG9iajovdXNyL2xpYi9saWJqcGVnLnNvLioKKyAgIGZ1bjpqaW5pdF9jb21wcmVzc19tYXN0ZXIKKyAgIGZ1bjpqcGVnX3N0YXJ0X2NvbXByZXNzCit9CisKK3sKKyAgIDxzZXZlcmFsIHZhbGdyaW5kIHdhcm5pbmdzIGFzIGZvdW5kIHdpdGggbGlianBlZyA2YiBvbiBEZWJpYW4+CisgICBNZW1jaGVjazpDb25kCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBmdW46amluaXRfY29tcHJlc3NfbWFzdGVyCisgICBmdW46anBlZ19zdGFydF9jb21wcmVzcworfQorCit7CisgICA8d2VsbCBrbm93biB6bGliIGJ1Zz4KKyAgIE1lbWNoZWNrOkNvbmQKKyAgIGZ1bjppbmZsYXRlUmVzZXQyCisgICBmdW46aW5mbGF0ZUluaXQyXworICAgZnVuOnBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMgorICAgZnVuOnBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QKK30KKworeworICAgPGFwcGFyZW50IHN0cnRvZCBidWcgd2hlbiB0cnlpbmcgdG8gcGFyc2UgImluZmluaXR5IiBmcm9tICJpbnRlcmxlYXZlZCI+CisgICBNZW1jaGVjazpBZGRyOAorICAgZnVuOl9fR0lfX19zdHJuY2FzZWNtcF9sCisgICBmdW46X19fX3N0cnRvZF9sX2ludGVybmFsCisgICBmdW46Z3N0X3ZhbHVlX2Rlc2VyaWFsaXplX2RvdWJsZQorfQorCisjIyBsYW1lCisKK3sKKyAgIDxsYW1lIENvbmRpdGlvbmFsIGp1bXAgb3IgbW92ZSBkZXBlbmRzIG9uIHVuaW5pdGlhbGlzZWQgdmFsdWVzPgorICAgTWVtY2hlY2s6Q29uZAorICAgZnVuOkwzcHN5Y2hvX2FuYWxfdmJyCisgICBmdW46bGFtZV9lbmNvZGVfbXAzX2ZyYW1lCisgICAuLi4KKyAgIGZ1bjpsYW1lX2VuY29kZV9mbHVzaAorICAgZnVuOmdzdF9sYW1lbXAzZW5jX3NpbmtfZXZlbnQKK30KKworeworICAgPHR3b2xhbWUgQ29uZGl0aW9uYWwganVtcCBvciBtb3ZlIGRlcGVuZHMgb24gdW5pbml0aWFsaXNlZCB2YWx1ZXM+CisgICBNZW1jaGVjazpDb25kCisgICAuLi4KKyAgIGZ1bjpwc3ljaG9fMworICAgZnVuOmVuY29kZV9mcmFtZQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9tZXNvbi5idWlsZCBiL3Rlc3RzL2NoZWNrL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDUzMjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9tZXNvbi5idWlsZApAQCAtMCwwICsxLDIxNSBAQAorIyBGSVhNRTogdXNlIGRlcGVuZGVuY3koJ3ZhbGdyaW5kJykgb25jZSB3ZSBoYXZlIGEgbWV0aG9kIHRvIGdldCB0aGUgaW5jbHVkZXMKK2lmIGNjLmhhc19oZWFkZXIoJ3ZhbGdyaW5kL3ZhbGdyaW5kLmgnKQorICBjZGF0YS5zZXQoJ0hBVkVfVkFMR1JJTkQnLCAxKQorZW5kaWYKKworIyBpbnRlcm5hbCBoZWxwZXIgbGliIGZvciB1bml0IHRlc3RpbmcgYXVkaW8gcGFyc2VycworbGlicGFyc2VyID0gc3RhdGljX2xpYnJhcnkoJ2xpYnBhcnNlcicsICdlbGVtZW50cy9wYXJzZXIuYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncyArIFsnLURHU1RfVVNFX1VOU1RBQkxFX0FQSSddLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgIGRlcGVuZGVuY2llcyA6IFtnc3RjaGVja19kZXBdLAorICBpbnN0YWxsIDogZmFsc2UpCisKK2xpYnBhcnNlcl9kZXAgPSBkZWNsYXJlX2RlcGVuZGVuY3kobGlua193aXRoIDogbGlicGFyc2VyLAorICBkZXBlbmRlbmNpZXMgOiBnc3RjaGVja19kZXApCisKKyMgbmFtZSwgY29uZGl0aW9uIHdoZW4gdG8gc2tpcCB0aGUgdGVzdCBhbmQgZXh0cmEgZGVwZW5kZW5jaWVzCitnb29kX3Rlc3RzID0gWworICBbICdlbGVtZW50cy9hdWRpb2FtcGxpZnknIF0sCisgIFsgJ2VsZW1lbnRzL2F1ZGlvY2hlYmJhbmQnIF0sCisgIFsgJ2VsZW1lbnRzL2F1ZGlvY2hlYmxpbWl0JyBdLAorICBbICdlbGVtZW50cy9hdWRpb2R5bmFtaWMnIF0sCisgIFsgJ2VsZW1lbnRzL2F1ZGlvZWNobycgXSwKKyAgWyAnZWxlbWVudHMvYXVkaW9maXJmaWx0ZXInIF0sCisgIFsgJ2VsZW1lbnRzL2F1ZGlvaWlyZmlsdGVyJyBdLAorICBbICdlbGVtZW50cy9hdWRpb2ludmVydCcgXSwKKyAgWyAnZWxlbWVudHMvYXVkaW9wYW5vcmFtYScgXSwKKyAgWyAnZWxlbWVudHMvYXVkaW93c2luY2JhbmQnIF0sCisgIFsgJ2VsZW1lbnRzL2F1ZGlvd3NpbmNsaW1pdCcgXSwKKyAgWyAnZWxlbWVudHMvYWxwaGFjb2xvcicgXSwKKyAgWyAnZWxlbWVudHMvYWxwaGEnIF0sCisgIFsgJ2VsZW1lbnRzL2FhY3BhcnNlJywgZmFsc2UsIFtsaWJwYXJzZXJfZGVwXSBdLAorICBbICdlbGVtZW50cy9hYzNwYXJzZScsIGZhbHNlLCBbbGlicGFyc2VyX2RlcF0gXSwKKyAgWyAnZWxlbWVudHMvYW1ycGFyc2UnLCBmYWxzZSwgW2xpYnBhcnNlcl9kZXBdIF0sCisgIFsgJ2VsZW1lbnRzL2ZsYWNwYXJzZScsIGZhbHNlLCBbbGlicGFyc2VyX2RlcF0gXSwKKyAgWyAnZWxlbWVudHMvbXBlZ2F1ZGlvcGFyc2UnLCBmYWxzZSwgW2xpYnBhcnNlcl9kZXBdIF0sCisgIFsgJ2VsZW1lbnRzL3dhdnBhY2twYXJzZScgXSwKKyAgWyAnZWxlbWVudHMvYXV0b2RldGVjdCcgXSwKKyAgWyAnZWxlbWVudHMvYXZpbXV4JyBdLAorICBbICdlbGVtZW50cy9hdmlzdWJ0aXRsZScgXSwKKyAgWyAnZWxlbWVudHMvY2Fwc3NldHRlcicgXSwKKyAgWyAnZWxlbWVudHMvZGVpbnRlcmxhY2UnIF0sCisgIFsgJ2VsZW1lbnRzL2R0bWYnIF0sCisgIFsgJ3BpcGVsaW5lcy9mbGFjZGVjJywgbm90IGZsYWNfZGVwLmZvdW5kKCkgXSwKKyAgWyAnZWxlbWVudHMvZmx2ZGVtdXgnIF0sCisgIFsgJ2VsZW1lbnRzL2Zsdm11eCcgXSwKKyAgWyAnZWxlbWVudHMvcXRtdXgnIF0sCisgIFsgJ2VsZW1lbnRzL3F0ZGVtdXgnIF0sCisgIFsgJ2VsZW1lbnRzL211bGF3ZGVjJyBdLAorICBbICdlbGVtZW50cy9tdWxhd2VuYycgXSwKKyAgWyAnZWxlbWVudHMvZ2RrcGl4YnVmc2luaycsIG5vdCBnZGtwaXhidWZfZGVwLmZvdW5kKCksIFtnZGtwaXhidWZfZGVwXSBdLAorICBbICdlbGVtZW50cy9nZGtwaXhidWZvdmVybGF5Jywgbm90IGdka3BpeGJ1Zl9kZXAuZm91bmQoKSBdLAorICBbICdlbGVtZW50cy9pY3lkZW11eCcgXSwKKyAgWyAnZWxlbWVudHMvaWQzZGVtdXgnIF0sCisgIFsgJ2VsZW1lbnRzL2ltYWdlZnJlZXplJyBdLAorICBbICdlbGVtZW50cy9kZWludGVybGVhdmUnIF0sCisgIFsgJ2VsZW1lbnRzL2ludGVybGVhdmUnIF0sCisgIFsgJ2VsZW1lbnRzL2pwZWdkZWMnLCBub3QganBlZ2xpYi5mb3VuZCgpIF0sCisgIFsgJ2VsZW1lbnRzL2pwZWdlbmMnLCBub3QganBlZ2xpYi5mb3VuZCgpIF0sCisgIFsgJ2VsZW1lbnRzL2xldmVsJyBdLAorICBbICdlbGVtZW50cy9tYXRyb3NrYWRlbXV4JyBdLAorICBbICdlbGVtZW50cy9tYXRyb3NrYW11eCcgXSwKKyAgWyAnZWxlbWVudHMvbWF0cm9za2FwYXJzZScgXSwKKyAgWyAnZWxlbWVudHMvbXBnMTIzYXVkaW9kZWMnLCBub3QgbXBnMTIzX2RlcC5mb3VuZCgpLCAgW2dzdGZmdF9kZXBdXSwKKyAgWyAnZWxlbWVudHMvbXVsdGlmaWxlJyBdLAorICBbICdlbGVtZW50cy9zcGxpdG11eCcgXSwKKyAgWyAnZWxlbWVudHMvcmdhbmFseXNpcycgXSwKKyAgWyAnZWxlbWVudHMvcmdsaW1pdGVyJyBdLAorICBbICdlbGVtZW50cy9yZ3ZvbHVtZScgXSwKKyAgWyAnZWxlbWVudHMvcnRwLXBheWxvYWRpbmcnIF0sCisgIFsgJ2VsZW1lbnRzL3J0cGgyNjEnIF0sCisgIFsgJ2VsZW1lbnRzL3J0cGgyNjMnIF0sCisgIFsgJ2VsZW1lbnRzL3J0cHZwOScgXSwKKyAgWyAnZWxlbWVudHMvcnRwYXV4JyBdLAorICBbICdlbGVtZW50cy9ydHBiaW4nIF0sCisgIFsgJ2VsZW1lbnRzL3J0cGJpbl9idWZmZXJfbGlzdCcgXSwKKyAgWyAnZWxlbWVudHMvcnRwYnVuZGxlJyBdLAorICBbICdlbGVtZW50cy9ydHBjb2xsaXNpb24nIF0sCisgIFsgJ2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlcicgXSwKKyAgWyAnZWxlbWVudHMvcnRwbXV4JyBdLAorICBbICdlbGVtZW50cy9ydHBydHgnIF0sCisgIFsgJ2VsZW1lbnRzL3J0cHNlc3Npb24nIF0sCisgIFsgJ2VsZW1lbnRzL3NvdXBodHRwc3JjJywgbm90IGxpYnNvdXBfZGVwLmZvdW5kKCksIFtsaWJzb3VwX2RlcF0gXSwKKyAgWyAnZWxlbWVudHMvc3BlY3RydW0nIF0sCisgIFsgJ2VsZW1lbnRzL3NoYXBld2lwZScgXSwKKyAgWyAnZWxlbWVudHMvaWQzdjJtdXgnLCBub3QgdGFnbGliX2RlcC5mb3VuZCgpIF0sCisgIFsgJ2VsZW1lbnRzL2FwZXYybXV4Jywgbm90IHRhZ2xpYl9kZXAuZm91bmQoKSBdLAorICBbICdlbGVtZW50cy91ZHBzaW5rJyBdLAorICBbICdlbGVtZW50cy91ZHBzcmMnIF0sCisgIFsgJ2VsZW1lbnRzL3ZpZGVvYm94JyBdLAorICBbICdlbGVtZW50cy9hc3BlY3RyYXRpb2Nyb3AnIF0sCisgIFsgJ2VsZW1lbnRzL3ZpZGVvY3JvcCcgXSwKKyAgWyAnZWxlbWVudHMvdmlkZW9maWx0ZXInIF0sCisgIFsgJ2VsZW1lbnRzL3ZpZGVvbWl4ZXInIF0sCisgIFsgJ2VsZW1lbnRzL3ZwOGVuYycsIG5vdCB2cHhfZGVwLmZvdW5kKCkgb3Igbm90IGhhdmVfdnA4X2VuY29kZXIgXSwKKyAgWyAnZWxlbWVudHMvdnA4ZGVjJywgbm90IHZweF9kZXAuZm91bmQoKSBvciBub3QgaGF2ZV92cDhfZGVjb2RlciBdLAorICBbICdlbGVtZW50cy92cDllbmMnLCBub3QgdnB4X2RlcC5mb3VuZCgpIG9yIG5vdCBoYXZlX3ZwOV9lbmNvZGVyIF0sCisgIFsgJ3BpcGVsaW5lcy9sYW1lJywgbm90IGxhbWVfZGVwLmZvdW5kKCkgXSwKKyAgWyAncGlwZWxpbmVzL3dhdmVuYycgXSwKKyAgWyAnZWxlbWVudHMvd2F2cGFja2RlYycsIG5vdCB3YXZwYWNrX2RlcC5mb3VuZCgpIF0sCisgIFsgJ2VsZW1lbnRzL3dhdnBhY2tlbmMnLCBub3Qgd2F2cGFja19kZXAuZm91bmQoKSBdLAorICBbICdwaXBlbGluZXMvd2F2cGFjaycsIG5vdCB3YXZwYWNrX2RlcC5mb3VuZCgpIF0sCisgIFsgJ2VsZW1lbnRzL3dhdnBhcnNlJyBdLAorICBbICdlbGVtZW50cy95NG1lbmMnIF0sCisgIFsgJ3BpcGVsaW5lcy9lZmZlY3R2JyBdLAorICBbICdlbGVtZW50cy9lcXVhbGl6ZXInIF0sCisgIFsgJ2dlbmVyaWMvc3RhdGVzJyBdLAorICBbICdwaXBlbGluZXMvc2ltcGxlLWxhdW5jaC1saW5lcycgXSwKKyAgWyAncGlwZWxpbmVzL3RhZ3NjaGVja2luZycgXSwKK10KKworIyBGSVhNRTogdmFsZ3JpbmQgZWxlbWVudHMvcnRwLXBheWxvYWRpbmcgLSBuZWVkcyBmaXhpbmcKKyMgZWxlbWVudHMvdmlkZW9jcm9wIHNob3VsZCBiZSBkaXNhYmxlZCBzaW5jZSBpdCB0YWtlcyB3YXkgdG9vIGxvbmcgaW4gdmFsZ3JpbmQKKworZm9vPScnJworaWYgSEFWRV9PUkMKK2NoZWNrX29yYyA9IG9yYy9kZWludGVybGFjZSBvcmMvdmlkZW9taXhlciBvcmMvdmlkZW9ib3gKK2Vsc2UKK2NoZWNrX29yYyA9CitlbmRpZgorJycnCisKK3Rlc3RfZGVmaW5lcyA9IFsKKyAgJy1VR19ESVNBQkxFX0FTU0VSVCcsCisgICctVUdfRElTQUJMRV9DQVNUX0NIRUNLUycsCisgICctREdTVF9DSEVDS19URVNUX0VOVklST05NRU5UX0JFQUNPTj0iR1NUX1BMVUdJTl9MT0FESU5HX1dISVRFTElTVCInLAorICAnLURHU1RfVEVTVF9GSUxFU19QQVRIPSInICsgbWVzb24uY3VycmVudF9zb3VyY2VfZGlyKCkgKyAnLy4uL2ZpbGVzIicsCisgICctREdTVF9VU0VfVU5TVEFCTEVfQVBJJywKK10KKworcGx1Z2luc2RpcnMgPSBbXQoraWYgZ3N0X2RlcC50eXBlX25hbWUoKSA9PSAncGtnY29uZmlnJworICBwYmFzZSA9IGRlcGVuZGVuY3koJ2dzdHJlYW1lci1wbHVnaW5zLWJhc2UtJyArIGFwaV92ZXJzaW9uLCByZXF1aXJlZCA6IGZhbHNlKQorICBwbHVnaW5zZGlycyA9IFtnc3RfZGVwLmdldF9wa2djb25maWdfdmFyaWFibGUoJ3BsdWdpbnNkaXInKSwKKyAgICAgICAgICAgICAgICAgcGJhc2UuZ2V0X3BrZ2NvbmZpZ192YXJpYWJsZSgncGx1Z2luc2RpcicpXQorZW5kaWYKKworIyBmYWtlIGRldmljZSBkcml2ZXJzOiB3ZSBjb3VsZCBydW4gaGFyZHdhcmUgZWxlbWVudCB0ZXN0cyBhZ2FpbnN0IGR1bW15IGRyaXZlcnMKKyMgdjRsMjogdml2byAocGFydCBvZiBub3JtYWwga2VybmVsKQorIyAgIG1vZHByb2JlIHZpdm87CisjICAgZ3N0LWxhdW5jaCB2NGwyc3JjIGRldmljZT0iL2Rldi92aWRlbzEiICEgeHZpbWFnZXNpbms7CisjICAgcm1tb2Qgdml2bworIworIyBhbHNhOiBzbmQtZHVtbXkgKHBhcnQgb2Ygbm9ybWFsIGFsc2EsIG5vdCByZW1vdmFibGUpCisjICAgbW9kcHJvYmUgc25kLWR1bW15OworIyAgIGdzdC1sYXVuY2ggYWxzYXNyYyBkZXZpY2U9Imh3OjIiICEgZmFrZXNpbmsKKyMgICBnc3QtbGF1bmNoIGZha2VzcmMgISBhbHNhc2luayBkZXZpY2U9Imh3OjIiCisjCisjIG5lZWQgYSB3YXkgdG8gZmlndXJlIG91dCB2YWx1ZSBmb3IgdGhlIGRldmljZSBwcm9wZXJ0eQorc3RhdGVfaWdub3JlX2VsZW1lbnRzID0gJycnYWFzaW5rIGF1dG9hdWRpb3NyYyBhdXRvYXVkaW9zaW5rIGF1dG92aWRlb3NyYworIGF1dG92aWRlb3NpbmsgY2FjYXNpbmsgY2Fpcm90ZXh0b3ZlcmxheSBqYWNrYXVkaW9zcmMgamFja2F1ZGlvc2luaworIG9zc3NyYyBvc3NzaW5rIG9zeGF1ZGlvc2luayBvc3hhdWRpb3NyYyBvc3h2aWRlb3NyYyBvc3h2aWRlb3NpbmsKKyBwdWxzZXNpbmsgcHVsc2VzcmMgcHVsc2VtaXhlciB2NGwyc3JjJycnCisKKyMgRklYTUU6IGNoZWNrLCBhbHNvICsgUFRIUkVBRF9DRkxBR1MKK3Rlc3RfZGVwcyA9IFtnc3RfZGVwLCBnc3RiYXNlX2RlcCwgZ3N0bmV0X2RlcCwgZ3N0Y2hlY2tfZGVwLCBnc3RhdWRpb19kZXAsCisgIGdzdHZpZGVvX2RlcCwgZ3N0cGJ1dGlsc19kZXAsIGdzdHJ0cF9kZXAsIGdzdHJ0c3BfZGVwLCBnc3R0YWdfZGVwLAorICBnc3RhcHBfZGVwLCBnaW9fZGVwXSArIGdsaWJfZGVwcworCisjIEZJWE1FOiBhZGQgdmFsZ3JpbmQgc3VwcHJlc3Npb24gY29tbW9uL2dzdC5zdXBwIGdzdC1wbHVnaW5zLWdvb2Quc3VwcAorZm9yZWFjaCB0IDogZ29vZF90ZXN0cworICBmbmFtZSA9ICdAMEAuYycuZm9ybWF0KHQuZ2V0KDApKQorICB0ZXN0X25hbWUgPSB0LmdldCgwKS51bmRlcnNjb3JpZnkoKQorICBleHRyYV9kZXBzID0gWyBdCisgIGlmIHQubGVuZ3RoKCkgPT0gMworICAgIGV4dHJhX2RlcHMgPSB0LmdldCgyKQorICAgIHNraXBfdGVzdCA9IHQuZ2V0KDEpCisgIGVsaWYgdC5sZW5ndGgoKSA9PSAyCisgICAgc2tpcF90ZXN0ID0gdC5nZXQoMSkKKyAgZWxzZQorICAgIHNraXBfdGVzdCA9IGZhbHNlCisgIGVuZGlmCisgIGlmIG5vdCBza2lwX3Rlc3QKKyAgICBlbnYgPSBlbnZpcm9ubWVudCgpCisgICAgZW52LnNldCgnR1NUX1BMVUdJTl9TWVNURU1fUEFUSF8xXzAnLCAnJykKKyAgICBlbnYuc2V0KCdHU1RfU1RBVEVfSUdOT1JFX0VMRU1FTlRTJywgc3RhdGVfaWdub3JlX2VsZW1lbnRzKQorICAgIGVudi5zZXQoJ0NLX0RFRkFVTFRfVElNRU9VVCcsICcyMCcpCisgICAgZW52LnNldCgnR1NUX1BMVUdJTl9MT0FESU5HX1dISVRFTElTVCcsICdnc3RyZWFtZXInLCAnZ3N0LXBsdWdpbnMtYmFzZScsCisgICAgICAnZ3N0LXBsdWdpbnMtZ29vZEAnICsgbWVzb24uYnVpbGRfcm9vdCgpLCBzZXBhcmF0b3I6ICc6JykKKyAgICBlbnYuc2V0KCdHU1RfUExVR0lOX1BBVEhfMV8wJywgW21lc29uLmJ1aWxkX3Jvb3QoKV0gKyBwbHVnaW5zZGlycykKKyAgICBlbnYuc2V0KCdHU0VUVElOR1NfQkFDS0VORCcsICdtZW1vcnknKQorCisgICAgZW52LnNldCgnR1NUX1JFR0lTVFJZJywgJ0AwQC9AMUAucmVnaXN0cnknLmZvcm1hdChtZXNvbi5jdXJyZW50X2J1aWxkX2RpcigpLCB0ZXN0X25hbWUpKQorICAgIGV4ZSA9IGV4ZWN1dGFibGUodGVzdF9uYW1lLCBmbmFtZSwKKyAgICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgICAgIGNfYXJncyA6IFsnLURIQVZFX0NPTkZJR19IPTEnIF0gKyB0ZXN0X2RlZmluZXMsCisgICAgICBkZXBlbmRlbmNpZXMgOiBbbGlibV0gKyB0ZXN0X2RlcHMgKyBleHRyYV9kZXBzLAorICAgICkKKyAgICB0ZXN0KHRlc3RfbmFtZSwgZXhlLCBlbnY6IGVudiwgdGltZW91dDogMyAqIDYwKQorICBlbmRpZgorZW5kZm9yZWFjaAorCisjIEZJWE1FOiBvcmMgdGVzdHMKK2ZpeG1lX29yY190ZXN0cz0nJycKK29yY19kZWludGVybGFjZV9DRkxBR1MgPSAkKE9SQ19DRkxBR1MpCitvcmNfZGVpbnRlcmxhY2VfTERBREQgPSAkKE9SQ19MSUJTKSAtbG9yYy10ZXN0LTAuNAorbm9kaXN0X29yY19kZWludGVybGFjZV9TT1VSQ0VTID0gb3JjL2RlaW50ZXJsYWNlLmMKK29yY192aWRlb21peGVyX0NGTEFHUyA9ICQoT1JDX0NGTEFHUykKK29yY192aWRlb21peGVyX0xEQUREID0gJChPUkNfTElCUykgLWxvcmMtdGVzdC0wLjQKK25vZGlzdF9vcmNfdmlkZW9taXhlcl9TT1VSQ0VTID0gb3JjL3ZpZGVvbWl4ZXIuYworb3JjX3ZpZGVvYm94X0NGTEFHUyA9ICQoT1JDX0NGTEFHUykKK29yY192aWRlb2JveF9MREFERCA9ICQoT1JDX0xJQlMpIC1sb3JjLXRlc3QtMC40Citub2Rpc3Rfb3JjX3ZpZGVvYm94X1NPVVJDRVMgPSBvcmMvdmlkZW9ib3guYworCitvcmMvZGVpbnRlcmxhY2UuYzogJCh0b3Bfc3JjZGlyKS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLm9yYworCSQoTUtESVJfUCkgb3JjLworCSQoT1JDQykgLS10ZXN0IC1vICRAICQ8CisKK29yYy92aWRlb21peGVyLmM6ICQodG9wX3NyY2RpcikvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy5vcmMKKwkkKE1LRElSX1ApIG9yYy8KKwkkKE9SQ0MpIC0tdGVzdCAtbyAkQCAkPAorCitvcmMvdmlkZW9ib3guYzogJCh0b3Bfc3JjZGlyKS9nc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMub3JjCisJJChNS0RJUl9QKSBvcmMvCisJJChPUkNDKSAtLXRlc3QgLW8gJEAgJDwKKycnJwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svcGlwZWxpbmVzLy5naXRpZ25vcmUgYi90ZXN0cy9jaGVjay9waXBlbGluZXMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzcwZWRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svcGlwZWxpbmVzLy5naXRpZ25vcmUKQEAgLTAsMCArMSwxMCBAQAorLmRpcnN0YW1wCitlZmZlY3R2CitmbGFjZGVjCitsYW1lCit0d29sYW1lCitzaW1wbGUtbGF1bmNoLWxpbmVzCit0YWdzY2hlY2tpbmcKK3dhdmVuYword2F2cGFjaworKi5jaGVjay54bWwKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL3BpcGVsaW5lcy9lZmZlY3R2LmMgYi90ZXN0cy9jaGVjay9waXBlbGluZXMvZWZmZWN0di5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNDgwNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9waXBlbGluZXMvZWZmZWN0di5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEdNYWluTG9vcCAqbG9vcDsKKyAgZ2Jvb2xlYW4gZW9zOworfSBPbk1lc3NhZ2VVc2VyRGF0YTsKKworc3RhdGljIHZvaWQKK29uX21lc3NhZ2VfY2IgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgT25NZXNzYWdlVXNlckRhdGEgKmQgPSB1c2VyX2RhdGE7CisKKyAgc3dpdGNoIChHU1RfTUVTU0FHRV9UWVBFIChtZXNzYWdlKSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfRVJST1I6CisgICAgY2FzZSBHU1RfTUVTU0FHRV9XQVJOSU5HOgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VPUzoKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGQtPmxvb3ApOworICAgICAgZC0+ZW9zID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorcnVuX3Rlc3QgKGNvbnN0IGdjaGFyICogcGlwZWxpbmVfc3RyaW5nKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0QnVzICpidXM7CisgIEdNYWluTG9vcCAqbG9vcDsKKyAgT25NZXNzYWdlVXNlckRhdGEgb211ZCA9IHsgTlVMTCwgfTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIEdTVF9ERUJVRyAoIlRlc3RpbmcgcGlwZWxpbmUgJyVzJyIsIHBpcGVsaW5lX3N0cmluZyk7CisKKyAgcGlwZWxpbmUgPSBnc3RfcGFyc2VfbGF1bmNoIChwaXBlbGluZV9zdHJpbmcsIE5VTEwpOworICBmYWlsX3VubGVzcyAocGlwZWxpbmUgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHBpcGVsaW5lKSwgImFzeW5jLWhhbmRsaW5nIiwgVFJVRSwgTlVMTCk7CisKKyAgbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgRkFMU0UpOworCisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKHBpcGVsaW5lKTsKKyAgZmFpbF91bmxlc3MgKGJ1cyAhPSBOVUxMKTsKKyAgZ3N0X2J1c19hZGRfc2lnbmFsX3dhdGNoIChidXMpOworCisgIG9tdWQubG9vcCA9IGxvb3A7CisgIG9tdWQuZW9zID0gRkFMU0U7CisKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZSIsIChHQ2FsbGJhY2spIG9uX21lc3NhZ2VfY2IsICZvbXVkKTsKKworCisgIHJldCA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgZmFpbF91bmxlc3MgKHJldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MKKyAgICAgIHx8IHJldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX0FTWU5DKTsKKworICBnX21haW5fbG9vcF9ydW4gKGxvb3ApOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLAorICAgICAgICAgIEdTVF9TVEFURV9OVUxMKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGZhaWxfdW5sZXNzIChvbXVkLmVvcyA9PSBUUlVFKTsKKworICBnc3RfYnVzX3JlbW92ZV9zaWduYWxfd2F0Y2ggKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKyAgZ19tYWluX2xvb3BfdW5yZWYgKGxvb3ApOworfQorCisjZGVmaW5lIENSRUFURV9URVNUKGVsZW1lbnQpIFwKK0dTVF9TVEFSVF9URVNUICh0ZXN0XyMjZWxlbWVudCkgXAoreyBcCisgIGdjaGFyICpwaXBlbGluZTsgXAorICBcCisgIHBpcGVsaW5lID0gZ19zdHJkdXBfcHJpbnRmICgidmlkZW90ZXN0c3JjIG51bS1idWZmZXJzPTEwMCAhICIgXAorICAgICAgInZpZGVvY29udmVydCAhICIgXAorICAgICAgIiAlcyAhICIgXAorICAgICAgIiBmYWtlc2luayIsICNlbGVtZW50KTsgXAorICBcCisgIHJ1bl90ZXN0IChwaXBlbGluZSk7IFwKKyAgZ19mcmVlIChwaXBlbGluZSk7IFwKK30gXAorXAorR1NUX0VORF9URVNUOworCitDUkVBVEVfVEVTVCAoYWdpbmd0dik7CitDUkVBVEVfVEVTVCAoZGljZXR2KTsKK0NSRUFURV9URVNUIChlZGdldHYpOworQ1JFQVRFX1RFU1QgKG9wdHYpOworQ1JFQVRFX1RFU1QgKHF1YXJrdHYpOworQ1JFQVRFX1RFU1QgKHJhZGlvYWN0dik7CitDUkVBVEVfVEVTVCAocmV2dHYpOworQ1JFQVRFX1RFU1QgKHJpcHBsZXR2KTsKK0NSRUFURV9URVNUIChzaGFnYWRlbGljdHYpOworQ1JFQVRFX1RFU1QgKHN0cmVha3R2KTsKK0NSRUFURV9URVNUICh2ZXJ0aWdvdHYpOworQ1JFQVRFX1RFU1QgKHdhcnB0dik7CisKK3N0YXRpYyBTdWl0ZSAqCitlZmZlY3R2X3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImVmZmVjdHYiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9zZXRfdGltZW91dCAodGNfY2hhaW4sIDE4MCk7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2FnaW5ndHYpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZGljZXR2KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2VkZ2V0dik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9vcHR2KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3F1YXJrdHYpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcmFkaW9hY3R2KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3JldnR2KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3JpcHBsZXR2KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3NoYWdhZGVsaWN0dik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9zdHJlYWt0dik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF92ZXJ0aWdvdHYpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfd2FycHR2KTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGVmZmVjdHYpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svcGlwZWxpbmVzL2ZsYWNkZWMuYyBiL3Rlc3RzL2NoZWNrL3BpcGVsaW5lcy9mbGFjZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxZDc3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL3BpcGVsaW5lcy9mbGFjZGVjLmMKQEAgLTAsMCArMSwyNTYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z2xpYi9nc3RkaW8uaD4KKworc3RhdGljIGd1aW50MTYKK19nZXRfZmlyc3Rfc2FtcGxlIChHc3RTYW1wbGUgKiBzYW1wbGUpCit7CisgIEdzdEF1ZGlvSW5mbyBpbmZvOworICBHc3RDYXBzICpjYXBzOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50MTYgcmVzOworCisgIGZhaWxfdW5sZXNzIChzYW1wbGUgIT0gTlVMTCwgIk5VTEwgc2FtcGxlIik7CisKKyAgY2FwcyA9IGdzdF9zYW1wbGVfZ2V0X2NhcHMgKHNhbXBsZSk7CisgIGZhaWxfdW5sZXNzIChjYXBzICE9IE5VTEwsICJzYW1wbGUgd2l0aG91dCBjYXBzIik7CisKKyAgYnVmID0gZ3N0X3NhbXBsZV9nZXRfYnVmZmVyIChzYW1wbGUpOworICBHU1RfREVCVUcgKCJidWZmZXIgd2l0aCBzaXplPSUiIEdfR1NJWkVfRk9STUFUICIsIGNhcHM9JSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpLCBjYXBzKTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAvKiBsb2cgYnVmZmVyIGRldGFpbHMgKi8KKyAgR1NUX01FTURVTVAgKCJidWZmZXIgZGF0YSBmcm9tIGRlY29kZXIiLCBtYXAuZGF0YSwgbWFwLnNpemUpOworCisgIC8qIG1ha2Ugc3VyZSBpdCdzIHRoZSBmb3JtYXQgd2UgZXhwZWN0ICovCisgIGZhaWxfdW5sZXNzIChnc3RfYXVkaW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBjYXBzKSk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0FVRElPX0lORk9fV0lEVEggKCZpbmZvKSwgMTYpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfQVVESU9fSU5GT19ERVBUSCAoJmluZm8pLCAxNik7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9BVURJT19JTkZPX1JBVEUgKCZpbmZvKSwgNDQxMDApOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJmluZm8pLCAxKTsKKworICBpZiAoR1NUX0FVRElPX0lORk9fSVNfTElUVExFX0VORElBTiAoJmluZm8pKQorICAgIHJlcyA9IEdTVF9SRUFEX1VJTlQxNl9MRSAobWFwLmRhdGEpOworICBlbHNlCisgICAgcmVzID0gR1NUX1JFQURfVUlOVDE2X0JFIChtYXAuZGF0YSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICByZXR1cm4gcmVzOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9kZWNvZGUpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RFbGVtZW50ICphcHBzaW5rOworICBHc3RTYW1wbGUgKnNhbXBsZSA9IE5VTEw7CisgIGd1aW50MTYgZmlyc3Rfc2FtcGxlID0gMDsKKyAgZ3VpbnQgc2l6ZSA9IDA7CisgIGdjaGFyICpwYXRoID0KKyAgICAgIGdfYnVpbGRfZmlsZW5hbWUgKEdTVF9URVNUX0ZJTEVTX1BBVEgsICJhdWRpb3Rlc3RzcmMuZmxhYyIsIE5VTEwpOworICBnY2hhciAqcGlwZV9kZXNjID0KKyAgICAgIGdfc3RyZHVwX3ByaW50ZgorICAgICAgKCJmaWxlc3JjIGxvY2F0aW9uPVwiJXNcIiAhIGZsYWNwYXJzZSAhIGZsYWNkZWMgISBhcHBzaW5rIG5hbWU9c2luayIsCisgICAgICBwYXRoKTsKKworICBwaXBlbGluZSA9IGdzdF9wYXJzZV9sYXVuY2ggKHBpcGVfZGVzYywgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChwaXBlbGluZSAhPSBOVUxMKTsKKworICBnX2ZyZWUgKHBhdGgpOworICBnX2ZyZWUgKHBpcGVfZGVzYyk7CisKKyAgYXBwc2luayA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgInNpbmsiKTsKKyAgZmFpbF91bmxlc3MgKGFwcHNpbmsgIT0gTlVMTCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIGRvIHsKKyAgICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKGFwcHNpbmssICJwdWxsLXNhbXBsZSIsICZzYW1wbGUpOworICAgIGlmIChzYW1wbGUgPT0gTlVMTCkKKyAgICAgIGJyZWFrOworICAgIGlmIChmaXJzdF9zYW1wbGUgPT0gMCkKKyAgICAgIGZpcnN0X3NhbXBsZSA9IF9nZXRfZmlyc3Rfc2FtcGxlIChzYW1wbGUpOworCisgICAgc2l6ZSArPSBnc3RfYnVmZmVyX2dldF9zaXplIChnc3Rfc2FtcGxlX2dldF9idWZmZXIgKHNhbXBsZSkpOworCisgICAgZ3N0X3NhbXBsZV91bnJlZiAoc2FtcGxlKTsKKyAgICBzYW1wbGUgPSBOVUxMOworICB9CisgIHdoaWxlIChUUlVFKTsKKworICAvKiBhdWRpb3Rlc3RzcmMgd2l0aCBzYW1wbGVzcGVyYnVmZmVyIDEwMjQgYW5kIDEwIG51bS1idWZmZXJzICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHNpemUsIDIwNDgwKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZmlyc3Rfc2FtcGxlLCAweDA2NmEpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKyAgZ19vYmplY3RfdW5yZWYgKGFwcHNpbmspOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2RlY29kZV9zZWVrX2Z1bGwpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RFbGVtZW50ICphcHBzaW5rOworICBHc3RFdmVudCAqZXZlbnQ7CisgIEdzdFNhbXBsZSAqc2FtcGxlID0gTlVMTDsKKyAgZ3VpbnQxNiBmaXJzdF9zYW1wbGUgPSAwOworICBndWludCBzaXplID0gMDsKKyAgZ2NoYXIgKnBhdGggPQorICAgICAgZ19idWlsZF9maWxlbmFtZSAoR1NUX1RFU1RfRklMRVNfUEFUSCwgImF1ZGlvdGVzdHNyYy5mbGFjIiwgTlVMTCk7CisgIGdjaGFyICpwaXBlX2Rlc2MgPQorICAgICAgZ19zdHJkdXBfcHJpbnRmCisgICAgICAoImZpbGVzcmMgbG9jYXRpb249XCIlc1wiICEgZmxhY3BhcnNlICEgZmxhY2RlYyAhIGFwcHNpbmsgbmFtZT1zaW5rIiwKKyAgICAgIHBhdGgpOworCisgIHBpcGVsaW5lID0gZ3N0X3BhcnNlX2xhdW5jaCAocGlwZV9kZXNjLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHBpcGVsaW5lICE9IE5VTEwpOworCisgIGdfZnJlZSAocGlwZV9kZXNjKTsKKyAgZ19mcmVlIChwYXRoKTsKKworICBhcHBzaW5rID0gZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAocGlwZWxpbmUpLCAic2luayIpOworICBmYWlsX3VubGVzcyAoYXBwc2luayAhPSBOVUxMKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChwaXBlbGluZSwgTlVMTCwgTlVMTCwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisKKyAgLyogZG8gYSBzZWVrIHRoYXQgc2hvdWxkIGdpdmUgdXMgdGhlIGNvbXBsZXRlIG91dHB1dCAqLworICBldmVudCA9IGdzdF9ldmVudF9uZXdfc2VlayAoMS4wLCBHU1RfRk9STUFUX0RFRkFVTFQsIEdTVF9TRUVLX0ZMQUdfRkxVU0gsCisgICAgICBHU1RfU0VFS19UWVBFX1NFVCwgMCwgR1NUX1NFRUtfVFlQRV9TRVQsIDIwNDgwKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NlbmRfZXZlbnQgKGFwcHNpbmssIGV2ZW50KSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIGRvIHsKKyAgICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKGFwcHNpbmssICJwdWxsLXNhbXBsZSIsICZzYW1wbGUpOworICAgIGlmIChzYW1wbGUgPT0gTlVMTCkKKyAgICAgIGJyZWFrOworICAgIGlmIChmaXJzdF9zYW1wbGUgPT0gMCkKKyAgICAgIGZpcnN0X3NhbXBsZSA9IF9nZXRfZmlyc3Rfc2FtcGxlIChzYW1wbGUpOworICAgIHNpemUgKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZ3N0X3NhbXBsZV9nZXRfYnVmZmVyIChzYW1wbGUpKTsKKworICAgIGdzdF9zYW1wbGVfdW5yZWYgKHNhbXBsZSk7CisgICAgc2FtcGxlID0gTlVMTDsKKyAgfQorICB3aGlsZSAoVFJVRSk7CisKKyAgLyogZmlsZSB3YXMgZ2VuZXJhdGVkIHdpdGggYXVkaW90ZXN0c3JjCisgICAqIHdpdGggMTAyNCBzYW1wbGVzcGVyYnVmZmVyIGFuZCAxMCBudW0tYnVmZmVycyBpbiAxNiBiaXQgYXVkaW8gKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoc2l6ZSwgMjA0ODApOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChmaXJzdF9zYW1wbGUsIDB4MDY2YSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworCisgIGdfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisgIGdfb2JqZWN0X3VucmVmIChhcHBzaW5rKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9kZWNvZGVfc2Vla19wYXJ0aWFsKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0RWxlbWVudCAqYXBwc2luazsKKyAgR3N0RXZlbnQgKmV2ZW50OworICBHc3RTYW1wbGUgKnNhbXBsZSA9IE5VTEw7CisgIGd1aW50IHNpemUgPSAwOworICBndWludDE2IGZpcnN0X3NhbXBsZSA9IDA7CisgIGdjaGFyICpwYXRoID0KKyAgICAgIGdfYnVpbGRfZmlsZW5hbWUgKEdTVF9URVNUX0ZJTEVTX1BBVEgsICJhdWRpb3Rlc3RzcmMuZmxhYyIsIE5VTEwpOworICBnY2hhciAqcGlwZV9kZXNjID0KKyAgICAgIGdfc3RyZHVwX3ByaW50ZgorICAgICAgKCJmaWxlc3JjIGxvY2F0aW9uPVwiJXNcIiAhIGZsYWNwYXJzZSAhIGZsYWNkZWMgISBhcHBzaW5rIG5hbWU9c2luayIsCisgICAgICBwYXRoKTsKKworICBwaXBlbGluZSA9IGdzdF9wYXJzZV9sYXVuY2ggKHBpcGVfZGVzYywgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChwaXBlbGluZSAhPSBOVUxMKTsKKworICBnX2ZyZWUgKHBhdGgpOworICBnX2ZyZWUgKHBpcGVfZGVzYyk7CisKKyAgYXBwc2luayA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgInNpbmsiKTsKKyAgZmFpbF91bmxlc3MgKGFwcHNpbmsgIT0gTlVMTCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BBVVNFRCk7CisgIGdzdF9lbGVtZW50X2dldF9zdGF0ZSAocGlwZWxpbmUsIE5VTEwsIE5VTEwsIEdTVF9DTE9DS19USU1FX05PTkUpOworCisgIC8qIGRvIGEgcGFydGlhbCBzZWVrIHRvIGdldCB0aGUgZmlyc3QgMTAyNCBzYW1wbGVzIG9yIDIwNDggYnl0ZXMgKi8KKyAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZWsgKDEuMCwgR1NUX0ZPUk1BVF9ERUZBVUxULCBHU1RfU0VFS19GTEFHX0ZMVVNILAorICAgICAgR1NUX1NFRUtfVFlQRV9TRVQsIDAsIEdTVF9TRUVLX1RZUEVfU0VULCAxMDI0KTsKKyAgR1NUX0RFQlVHICgic2Vla2luZyIpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2VuZF9ldmVudCAoYXBwc2luaywgZXZlbnQpKTsKKyAgR1NUX0RFQlVHICgic2Vla2VkIik7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIGRvIHsKKyAgICBHU1RfREVCVUcgKCJwdWxsaW5nIHNhbXBsZSIpOworICAgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAoYXBwc2luaywgInB1bGwtc2FtcGxlIiwgJnNhbXBsZSk7CisgICAgR1NUX0RFQlVHICgicHVsbGVkIHNhbXBsZSAlcCIsIHNhbXBsZSk7CisgICAgaWYgKHNhbXBsZSA9PSBOVUxMKQorICAgICAgYnJlYWs7CisgICAgaWYgKGZpcnN0X3NhbXBsZSA9PSAwKSB7CisgICAgICBmaXJzdF9zYW1wbGUgPSBfZ2V0X2ZpcnN0X3NhbXBsZSAoc2FtcGxlKTsKKyAgICB9CisgICAgc2l6ZSArPSBnc3RfYnVmZmVyX2dldF9zaXplIChnc3Rfc2FtcGxlX2dldF9idWZmZXIgKHNhbXBsZSkpOworCisgICAgZ3N0X3NhbXBsZV91bnJlZiAoc2FtcGxlKTsKKyAgICBzYW1wbGUgPSBOVUxMOworICB9CisgIHdoaWxlIChUUlVFKTsKKworICAvKiBhbGxvdyBmb3Igc2FtcGxlIHJvdW5kLXVwIGNsaXBwaW5nIGVmZmVjdCAqLworICBmYWlsX3VubGVzcyAoc2l6ZSA9PSAyMDQ4IHx8IHNpemUgPT0gMjA1MCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGZpcnN0X3NhbXBsZSwgMHgwNjZhKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKyAgZ19vYmplY3RfdW5yZWYgKGFwcHNpbmspOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitmbGFjZGVjX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImZsYWNkZWMiKTsKKworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJsaW5lYXIiKTsKKworICAvKiB0aW1lIG91dCBhZnRlciA2MHMsIG5vdCB0aGUgZGVmYXVsdCAzICovCisgIHRjYXNlX3NldF90aW1lb3V0ICh0Y19jaGFpbiwgNjApOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZGVjb2RlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2RlY29kZV9zZWVrX2Z1bGwpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZGVjb2RlX3NlZWtfcGFydGlhbCk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChmbGFjZGVjKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL3BpcGVsaW5lcy9sYW1lLmMgYi90ZXN0cy9jaGVjay9waXBlbGluZXMvbGFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYmE2NmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9waXBlbGluZXMvbGFtZS5jCkBAIC0wLDAgKzEsMTMxIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIGxhbWUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0YnVmZmVyc3RyYXcuaD4KKworI2lmbmRlZiBFTkNPREVSCisjZGVmaW5lIEVOQ09ERVIgImxhbWVtcDNlbmMiCisjZW5kaWYKKworI2lmbmRlZiBHU1RfRElTQUJMRV9QQVJTRQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mb3JtYXQpCit7CisgIEdzdEVsZW1lbnQgKmJpbjsKKyAgR3N0UGFkICpwYWQ7CisgIGdjaGFyICpwaXBlX3N0cjsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworCisgIHBpcGVfc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiYXVkaW90ZXN0c3JjIG51bS1idWZmZXJzPTEgIgorICAgICAgIiEgYXVkaW8veC1yYXcsIHJhdGU9MjIwNTAsIGNoYW5uZWxzPTEgIgorICAgICAgIiEgIiBFTkNPREVSICIgYml0cmF0ZT0yNCAhIGF1ZGlvL21wZWcscmF0ZT0yMjA1MCAhIGZha2VzaW5rIik7CisKKyAgYmluID0gZ3N0X3BhcnNlX2xhdW5jaCAocGlwZV9zdHIsICZlcnJvcik7CisgIGZhaWxfdW5sZXNzIChiaW4gIT0gTlVMTCwgIkVycm9yIHBhcnNpbmcgcGlwZWxpbmU6ICVzIiwKKyAgICAgIGVycm9yID8gZXJyb3ItPm1lc3NhZ2UgOiAiKGludmFsaWQgZXJyb3IpIik7CisgIGdfZnJlZSAocGlwZV9zdHIpOworCisgIC8qIGdldCB0aGUgcGFkICovCisgIHsKKyAgICBHc3RFbGVtZW50ICpzaW5rID0gZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAoYmluKSwgImZha2VzaW5rMCIpOworCisgICAgZmFpbF91bmxlc3MgKHNpbmsgIT0gTlVMTCwgIkNvdWxkIG5vdCBnZXQgZmFrZXNpbmsgb3V0IG9mIGJpbiIpOworICAgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzaW5rLCAic2luayIpOworICAgIGZhaWxfdW5sZXNzIChwYWQgIT0gTlVMTCwgIkNvdWxkIG5vdCBnZXQgcGFkIG91dCBvZiBmYWtlc2luayIpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmspOworICB9CisKKyAgZ3N0X2J1ZmZlcl9zdHJhd19zdGFydF9waXBlbGluZSAoYmluLCBwYWQpOworCisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfc3RyYXdfZ2V0X2J1ZmZlciAoYmluLCBwYWQpOworCisgIGdzdF9idWZmZXJfc3RyYXdfc3RvcF9waXBlbGluZSAoYmluLCBwYWQpOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJpbik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfY2Fwc19wcm94eSkKK3sKKyAgR3N0RWxlbWVudCAqYmluOworICBHc3RQYWQgKnBhZDsKKyAgZ2NoYXIgKnBpcGVfc3RyOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisKKyAgcGlwZV9zdHIgPSBnX3N0cmR1cF9wcmludGYgKCJhdWRpb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9MSAiCisgICAgICAiISBhdWRpby94LXJhdyxyYXRlPTQ4MDAwLGNoYW5uZWxzPTEgIgorICAgICAgIiEgYXVkaW9yZXNhbXBsZSAiCisgICAgICAiISAiIEVOQ09ERVIgIiAhIGF1ZGlvL21wZWcscmF0ZT0oaW50KXsyMjA1MCw0NDEwMH0gISBmYWtlc2luayIpOworCisgIGJpbiA9IGdzdF9wYXJzZV9sYXVuY2ggKHBpcGVfc3RyLCAmZXJyb3IpOworICBmYWlsX3VubGVzcyAoYmluICE9IE5VTEwsICJFcnJvciBwYXJzaW5nIHBpcGVsaW5lOiAlcyIsCisgICAgICBlcnJvciA/IGVycm9yLT5tZXNzYWdlIDogIihpbnZhbGlkIGVycm9yKSIpOworICBnX2ZyZWUgKHBpcGVfc3RyKTsKKworICAvKiBnZXQgdGhlIHBhZCAqLworICB7CisgICAgR3N0RWxlbWVudCAqc2luayA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKGJpbiksICJmYWtlc2luazAiKTsKKworICAgIGZhaWxfdW5sZXNzIChzaW5rICE9IE5VTEwsICJDb3VsZCBub3QgZ2V0IGZha2VzaW5rIG91dCBvZiBiaW4iKTsKKyAgICBwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc2luaywgInNpbmsiKTsKKyAgICBmYWlsX3VubGVzcyAocGFkICE9IE5VTEwsICJDb3VsZCBub3QgZ2V0IHBhZCBvdXQgb2YgZmFrZXNpbmsiKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rKTsKKyAgfQorCisgIGdzdF9idWZmZXJfc3RyYXdfc3RhcnRfcGlwZWxpbmUgKGJpbiwgcGFkKTsKKworICBidWZmZXIgPSBnc3RfYnVmZmVyX3N0cmF3X2dldF9idWZmZXIgKGJpbiwgcGFkKTsKKworICBnc3RfYnVmZmVyX3N0cmF3X3N0b3BfcGlwZWxpbmUgKGJpbiwgcGFkKTsKKworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChiaW4pOworfQorCitHU1RfRU5EX1RFU1Q7CisKKyNlbmRpZiAvKiAjaWZuZGVmIEdTVF9ESVNBQkxFX1BBUlNFICovCisKK3N0YXRpYyBTdWl0ZSAqCitsYW1lX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoRU5DT0RFUik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKworI2lmbmRlZiBHU1RfRElTQUJMRV9QQVJTRQorICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZm9ybWF0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2NhcHNfcHJveHkpOworI2VuZGlmCisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChsYW1lKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL3BpcGVsaW5lcy9zaW1wbGUtbGF1bmNoLWxpbmVzLmMgYi90ZXN0cy9jaGVjay9waXBlbGluZXMvc2ltcGxlLWxhdW5jaC1saW5lcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkODM1MTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9waXBlbGluZXMvc2ltcGxlLWxhdW5jaC1saW5lcy5jCkBAIC0wLDAgKzEsMzMyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNSBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisgKgorICogc2ltcGxlX2xhdW5jaF9saW5lcy5jOiBVbml0IHRlc3QgZm9yIHNpbXBsZSBwaXBlbGluZXMKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisKKyNpZm5kZWYgR1NUX0RJU0FCTEVfUEFSU0UKKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfcGlwZWxpbmUgKGNvbnN0IGdjaGFyICogcGlwZV9kZXNjcikKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisKKyAgcGlwZWxpbmUgPSBnc3RfcGFyc2VfbGF1bmNoIChwaXBlX2Rlc2NyLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9JU19QSVBFTElORSAocGlwZWxpbmUpLCBOVUxMKTsKKyAgcmV0dXJuIHBpcGVsaW5lOworfQorCisvKiAKKyAqIHJ1bl9waXBlbGluZToKKyAqIEBwaXBlOiB0aGUgcGlwZWxpbmUgdG8gcnVuCisgKiBAZGVzYzogdGhlIGRlc2NyaXB0aW9uIGZvciB1c2UgaW4gbWVzc2FnZXMKKyAqIEBldmVudHM6IGlzIGEgbWFzayBvZiBleHBlY3RlZCBldmVudHMKKyAqIEB0ZXZlbnQ6IGlzIHRoZSBleHBlY3RlZCB0ZXJtaW5hbCBldmVudC4KKyAqCisgKiB0aGUgcG9sbCBjYWxsIHdpbGwgdGltZSBvdXQgYWZ0ZXIgaGFsZiBhIHNlY29uZC4KKyAqLworc3RhdGljIHZvaWQKK3J1bl9waXBlbGluZSAoR3N0RWxlbWVudCAqIHBpcGUsIGNvbnN0IGdjaGFyICogZGVzY3IsCisgICAgR3N0TWVzc2FnZVR5cGUgZXZlbnRzLCBHc3RNZXNzYWdlVHlwZSB0ZXZlbnQsIEdzdFN0YXRlIHRhcmdldF9zdGF0ZSkKK3sKKyAgR3N0QnVzICpidXM7CisgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisgIEdzdE1lc3NhZ2VUeXBlIHJldmVudDsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIGdfYXNzZXJ0IChwaXBlKTsKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAocGlwZSk7CisgIGdfYXNzZXJ0IChidXMpOworCisgIGZhaWxfaWYgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZSwgdGFyZ2V0X3N0YXRlKSA9PQorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFLCAiQ291bGQgbm90IHNldCBwaXBlbGluZSAlcyB0byBwbGF5aW5nIiwgZGVzY3IpOworICByZXQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKHBpcGUsIE5VTEwsIE5VTEwsIDEwICogR1NUX1NFQ09ORCk7CisgIGlmIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9BU1lOQykgeworICAgIGdfY3JpdGljYWwgKCJQaXBlbGluZSAnJXMnIGZhaWxlZCB0byBnbyB0byBQQVVTRUQgZmFzdCBlbm91Z2giLCBkZXNjcik7CisgICAgZ290byBkb25lOworICB9IGVsc2UgaWYgKChyZXQgIT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKQorICAgICAgJiYgKHJldCAhPSBHU1RfU1RBVEVfQ0hBTkdFX05PX1BSRVJPTEwpKSB7CisgICAgZ19jcml0aWNhbCAoIlBpcGVsaW5lICclcycgZmFpbGVkIHRvIGdvIGludG8gUEFVU0VEIHN0YXRlICglcykiLCBkZXNjciwKKyAgICAgICAgZ3N0X2VsZW1lbnRfc3RhdGVfY2hhbmdlX3JldHVybl9nZXRfbmFtZSAocmV0KSk7CisgICAgZ290byBkb25lOworICB9CisKKyAgd2hpbGUgKDEpIHsKKyAgICBtZXNzYWdlID0gZ3N0X2J1c19wb2xsIChidXMsIEdTVF9NRVNTQUdFX0FOWSwgR1NUX1NFQ09ORCAvIDIpOworCisgICAgLyogYWx3YXlzIGhhdmUgdG8gcG9wIHRoZSBtZXNzYWdlIGJlZm9yZSBnZXR0aW5nIGJhY2sgaW50byBwb2xsICovCisgICAgaWYgKG1lc3NhZ2UpIHsKKyAgICAgIHJldmVudCA9IEdTVF9NRVNTQUdFX1RZUEUgKG1lc3NhZ2UpOworICAgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgIH0gZWxzZSB7CisgICAgICByZXZlbnQgPSBHU1RfTUVTU0FHRV9VTktOT1dOOworICAgIH0KKworICAgIGlmIChyZXZlbnQgPT0gdGV2ZW50KSB7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKHJldmVudCA9PSBHU1RfTUVTU0FHRV9VTktOT1dOKSB7CisgICAgICBnX2NyaXRpY2FsICgiVW5leHBlY3RlZCB0aW1lb3V0IGluIGdzdF9idXNfcG9sbCwgbG9va2luZyBmb3IgJWQ6ICVzIiwKKyAgICAgICAgICB0ZXZlbnQsIGRlc2NyKTsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSBpZiAocmV2ZW50ICYgZXZlbnRzKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgZ19jcml0aWNhbAorICAgICAgICAoIlVuZXhwZWN0ZWQgbWVzc2FnZSByZWNlaXZlZCBvZiB0eXBlICVkLCAnJXMnLCBsb29raW5nIGZvciAlZDogJXMiLAorICAgICAgICByZXZlbnQsIGdzdF9tZXNzYWdlX3R5cGVfZ2V0X25hbWUgKHJldmVudCksIHRldmVudCwgZGVzY3IpOworICB9CisKK2RvbmU6CisgIGZhaWxfaWYgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZSwgR1NUX1NUQVRFX05VTEwpID09CisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUsICJDb3VsZCBub3Qgc2V0IHBpcGVsaW5lICVzIHRvIE5VTEwiLCBkZXNjcik7CisgIGdzdF9lbGVtZW50X2dldF9zdGF0ZSAocGlwZSwgTlVMTCwgTlVMTCwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGUpOworCisgIGdzdF9idXNfc2V0X2ZsdXNoaW5nIChidXMsIFRSVUUpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ydHBfcGF5bG9hZGVycykKK3sKKyAgY29uc3QgZ2NoYXIgKnM7CisKKyAgLyogRklYTUU6IGdvaW5nIHRvIHBsYXlpbmcgd291bGQgYmUgbmljZSwgYnV0IHRoZXQgbGVhZHMgdG8gbG90IG9mIGZhaWx1cmUgKi8KKyAgR3N0U3RhdGUgdGFyZ2V0X3N0YXRlID0gR1NUX1NUQVRFX1BBVVNFRDsKKworICAvKiB3ZSB1c2UgaXMtbGl2ZSBoZXJlIHRvIGF2b2lkIHByZXJvbGwgKi8KKyNkZWZpbmUgUElQRUxJTkVfU1RSSU5HKGJ1ZmNvdW50LCBidWZzaXplLCBwbCwgZHBsKSAiZmFrZXNyYyBpcy1saXZlPXRydWUgbnVtLWJ1ZmZlcnM9IiBidWZjb3VudCAiIGZpbGx0eXBlPTIgc2l6ZXR5cGU9MiBzaXplbWF4PSIgYnVmc2l6ZSAiICEgIiBwbCAiICEgIiBkcGwgIiAhIGZha2VzaW5rIgorI2RlZmluZSBERUZBVUxUX0JVRkNPVU5UICI1IgorI2RlZmluZSBERUZBVUxUX0JVRlNJWkUgIjE2IgorCisgIHMgPSBQSVBFTElORV9TVFJJTkcgKERFRkFVTFRfQlVGQ09VTlQsIERFRkFVTFRfQlVGU0laRSwgInJ0cGlsYmNwYXkiLAorICAgICAgInJ0cGlsYmNkZXBheSIpOworICBydW5fcGlwZWxpbmUgKHNldHVwX3BpcGVsaW5lIChzKSwgcywKKyAgICAgIEdTVF9NRVNTQUdFX0FOWSAmIH4oR1NUX01FU1NBR0VfRVJST1IgfCBHU1RfTUVTU0FHRV9XQVJOSU5HKSwKKyAgICAgIEdTVF9NRVNTQUdFX1VOS05PV04sIHRhcmdldF9zdGF0ZSk7CisKKyAgcyA9IFBJUEVMSU5FX1NUUklORyAoREVGQVVMVF9CVUZDT1VOVCwgREVGQVVMVF9CVUZTSVpFLCAicnRwZ3NtcGF5IiwKKyAgICAgICJydHBnc21kZXBheSIpOworICBydW5fcGlwZWxpbmUgKHNldHVwX3BpcGVsaW5lIChzKSwgcywKKyAgICAgIEdTVF9NRVNTQUdFX0FOWSAmIH4oR1NUX01FU1NBR0VfRVJST1IgfCBHU1RfTUVTU0FHRV9XQVJOSU5HKSwKKyAgICAgIEdTVF9NRVNTQUdFX1VOS05PV04sIHRhcmdldF9zdGF0ZSk7CisKKyAgLyogVGhpcyBvbmUgbmVlZHMgYSBiaXQgZGlmZmVyZW50IGJ1ZmZlciBzaXplIHRoYW4gb3RoZXJzIG9yIGl0IGRvZXNuJ3Qgd29yay4gKi8KKyAgcyA9IFBJUEVMSU5FX1NUUklORyAoREVGQVVMVF9CVUZDT1VOVCwgIjUyIiwgInJ0cGFtcnBheSIsICJydHBhbXJkZXBheSIpOworICBydW5fcGlwZWxpbmUgKHNldHVwX3BpcGVsaW5lIChzKSwgcywKKyAgICAgIEdTVF9NRVNTQUdFX0FOWSAmIH4oR1NUX01FU1NBR0VfRVJST1IgfCBHU1RfTUVTU0FHRV9XQVJOSU5HKSwKKyAgICAgIEdTVF9NRVNTQUdFX1VOS05PV04sIHRhcmdldF9zdGF0ZSk7CisKKyAgcyA9IFBJUEVMSU5FX1NUUklORyAoREVGQVVMVF9CVUZDT1VOVCwgREVGQVVMVF9CVUZTSVpFLCAicnRwcGNtYXBheSIsCisgICAgICAicnRwcGNtYWRlcGF5Iik7CisgIHJ1bl9waXBlbGluZSAoc2V0dXBfcGlwZWxpbmUgKHMpLCBzLAorICAgICAgR1NUX01FU1NBR0VfQU5ZICYgfihHU1RfTUVTU0FHRV9FUlJPUiB8IEdTVF9NRVNTQUdFX1dBUk5JTkcpLAorICAgICAgR1NUX01FU1NBR0VfVU5LTk9XTiwgdGFyZ2V0X3N0YXRlKTsKKworICBzID0gUElQRUxJTkVfU1RSSU5HIChERUZBVUxUX0JVRkNPVU5ULCBERUZBVUxUX0JVRlNJWkUsICJydHBwY211cGF5IiwKKyAgICAgICJydHBwY211ZGVwYXkiKTsKKyAgcnVuX3BpcGVsaW5lIChzZXR1cF9waXBlbGluZSAocyksIHMsCisgICAgICBHU1RfTUVTU0FHRV9BTlkgJiB+KEdTVF9NRVNTQUdFX0VSUk9SIHwgR1NUX01FU1NBR0VfV0FSTklORyksCisgICAgICBHU1RfTUVTU0FHRV9VTktOT1dOLCB0YXJnZXRfc3RhdGUpOworCisgIHMgPSBQSVBFTElORV9TVFJJTkcgKERFRkFVTFRfQlVGQ09VTlQsIERFRkFVTFRfQlVGU0laRSwgInJ0cG1wYXBheSIsCisgICAgICAicnRwbXBhZGVwYXkiKTsKKyAgcnVuX3BpcGVsaW5lIChzZXR1cF9waXBlbGluZSAocyksIHMsCisgICAgICBHU1RfTUVTU0FHRV9BTlkgJiB+KEdTVF9NRVNTQUdFX0VSUk9SIHwgR1NUX01FU1NBR0VfV0FSTklORyksCisgICAgICBHU1RfTUVTU0FHRV9VTktOT1dOLCB0YXJnZXRfc3RhdGUpOworCisgIHMgPSBQSVBFTElORV9TVFJJTkcgKERFRkFVTFRfQlVGQ09VTlQsIERFRkFVTFRfQlVGU0laRSwgInJ0cGgyNjNwcGF5IiwKKyAgICAgICJydHBoMjYzcGRlcGF5Iik7CisgIHJ1bl9waXBlbGluZSAoc2V0dXBfcGlwZWxpbmUgKHMpLCBzLAorICAgICAgR1NUX01FU1NBR0VfQU5ZICYgfihHU1RfTUVTU0FHRV9FUlJPUiB8IEdTVF9NRVNTQUdFX1dBUk5JTkcpLAorICAgICAgR1NUX01FU1NBR0VfVU5LTk9XTiwgdGFyZ2V0X3N0YXRlKTsKKworICBzID0gUElQRUxJTkVfU1RSSU5HIChERUZBVUxUX0JVRkNPVU5ULCBERUZBVUxUX0JVRlNJWkUsICJydHBoMjYzcGF5IiwKKyAgICAgICJydHBoMjYzZGVwYXkiKTsKKyAgcnVuX3BpcGVsaW5lIChzZXR1cF9waXBlbGluZSAocyksIHMsCisgICAgICBHU1RfTUVTU0FHRV9BTlkgJiB+KEdTVF9NRVNTQUdFX0VSUk9SIHwgR1NUX01FU1NBR0VfV0FSTklORyksCisgICAgICBHU1RfTUVTU0FHRV9VTktOT1dOLCB0YXJnZXRfc3RhdGUpOworCisgIHMgPSBQSVBFTElORV9TVFJJTkcgKERFRkFVTFRfQlVGQ09VTlQsIERFRkFVTFRfQlVGU0laRSwgInJ0cGgyNjRwYXkiLAorICAgICAgInJ0cGgyNjRkZXBheSIpOworICBydW5fcGlwZWxpbmUgKHNldHVwX3BpcGVsaW5lIChzKSwgcywKKyAgICAgIEdTVF9NRVNTQUdFX0FOWSAmIH4oR1NUX01FU1NBR0VfRVJST1IgfCBHU1RfTUVTU0FHRV9XQVJOSU5HKSwKKyAgICAgIEdTVF9NRVNTQUdFX1VOS05PV04sIHRhcmdldF9zdGF0ZSk7CisKKyAgcyA9IFBJUEVMSU5FX1NUUklORyAoREVGQVVMVF9CVUZDT1VOVCwgREVGQVVMVF9CVUZTSVpFLCAicnRwTDE2cGF5IiwKKyAgICAgICJydHBMMTZkZXBheSIpOworICBydW5fcGlwZWxpbmUgKHNldHVwX3BpcGVsaW5lIChzKSwgcywKKyAgICAgIEdTVF9NRVNTQUdFX0FOWSAmIH4oR1NUX01FU1NBR0VfRVJST1IgfCBHU1RfTUVTU0FHRV9XQVJOSU5HKSwKKyAgICAgIEdTVF9NRVNTQUdFX1VOS05PV04sIHRhcmdldF9zdGF0ZSk7CisKKyAgcyA9IFBJUEVMSU5FX1NUUklORyAoREVGQVVMVF9CVUZDT1VOVCwgREVGQVVMVF9CVUZTSVpFLCAicnRwbXAydHBheSIsCisgICAgICAicnRwbXAydGRlcGF5Iik7CisgIHJ1bl9waXBlbGluZSAoc2V0dXBfcGlwZWxpbmUgKHMpLCBzLAorICAgICAgR1NUX01FU1NBR0VfQU5ZICYgfihHU1RfTUVTU0FHRV9FUlJPUiB8IEdTVF9NRVNTQUdFX1dBUk5JTkcpLAorICAgICAgR1NUX01FU1NBR0VfVU5LTk9XTiwgdGFyZ2V0X3N0YXRlKTsKKworICBzID0gUElQRUxJTkVfU1RSSU5HIChERUZBVUxUX0JVRkNPVU5ULCBERUZBVUxUX0JVRlNJWkUsICJydHBtcDR2cGF5IiwKKyAgICAgICJydHBtcDR2ZGVwYXkiKTsKKyAgcnVuX3BpcGVsaW5lIChzZXR1cF9waXBlbGluZSAocyksIHMsCisgICAgICBHU1RfTUVTU0FHRV9BTlkgJiB+KEdTVF9NRVNTQUdFX0VSUk9SIHwgR1NUX01FU1NBR0VfV0FSTklORyksCisgICAgICBHU1RfTUVTU0FHRV9VTktOT1dOLCB0YXJnZXRfc3RhdGUpOworCisgIHMgPSBQSVBFTElORV9TVFJJTkcgKERFRkFVTFRfQlVGQ09VTlQsIERFRkFVTFRfQlVGU0laRSwgInJ0cG1wNGdwYXkiLAorICAgICAgInJ0cG1wNGdkZXBheSIpOworICBydW5fcGlwZWxpbmUgKHNldHVwX3BpcGVsaW5lIChzKSwgcywKKyAgICAgIEdTVF9NRVNTQUdFX0FOWSAmIH4oR1NUX01FU1NBR0VfRVJST1IgfCBHU1RfTUVTU0FHRV9XQVJOSU5HKSwKKyAgICAgIEdTVF9NRVNTQUdFX1VOS05PV04sIHRhcmdldF9zdGF0ZSk7CisKKyAgLyogQ2Fubm90IGJlIHRlc3RlZCB3aXRoIGZha2VzcmMgYmVjb3VzZSBzcGVleCBwYXlsb2FkZXIgcmVxdWlyZXMgYSB2YWxpZCBoZWFkZXI/ISAqLworICAvKgorICAgICBzID0gUElQRUxJTkVfU1RSSU5HKERFRkFVTFRfQlVGQ09VTlQsIERFRkFVTFRfQlVGU0laRSwgInJ0cHNwZWV4cGF5IiwgInJ0cHNwZWV4ZGVwYXkiKTsKKyAgICAgcnVuX3BpcGVsaW5lIChzZXR1cF9waXBlbGluZSAocyksIHMsCisgICAgIEdTVF9NRVNTQUdFX0FOWSAmIH4oR1NUX01FU1NBR0VfRVJST1IgfCBHU1RfTUVTU0FHRV9XQVJOSU5HKSwKKyAgICAgR1NUX01FU1NBR0VfVU5LTk9XTiwgdGFyZ2V0X3N0YXRlKTsKKyAgICovCisKKyAgcyA9IFBJUEVMSU5FX1NUUklORyAoREVGQVVMVF9CVUZDT1VOVCwgREVGQVVMVF9CVUZTSVpFLCAicnRwdGhlb3JhcGF5IiwKKyAgICAgICJydHB0aGVvcmFkZXBheSIpOworICBydW5fcGlwZWxpbmUgKHNldHVwX3BpcGVsaW5lIChzKSwgcywKKyAgICAgIEdTVF9NRVNTQUdFX0FOWSAmIH4oR1NUX01FU1NBR0VfRVJST1IgfCBHU1RfTUVTU0FHRV9XQVJOSU5HKSwKKyAgICAgIEdTVF9NRVNTQUdFX1VOS05PV04sIHRhcmdldF9zdGF0ZSk7CisKKyAgcyA9IFBJUEVMSU5FX1NUUklORyAoREVGQVVMVF9CVUZDT1VOVCwgREVGQVVMVF9CVUZTSVpFLCAicnRwdm9yYmlzcGF5IiwKKyAgICAgICJydHB2b3JiaXNkZXBheSIpOworICBydW5fcGlwZWxpbmUgKHNldHVwX3BpcGVsaW5lIChzKSwgcywKKyAgICAgIEdTVF9NRVNTQUdFX0FOWSAmIH4oR1NUX01FU1NBR0VfRVJST1IgfCBHU1RfTUVTU0FHRV9XQVJOSU5HKSwKKyAgICAgIEdTVF9NRVNTQUdFX1VOS05PV04sIHRhcmdldF9zdGF0ZSk7CisKKyNkZWZpbmUgSjJLX1RFU1RfRklMRV9QQVRIIEdTVF9URVNUX0ZJTEVTX1BBVEggR19ESVJfU0VQQVJBVE9SX1MgImdyYWRpZW50LmoyayIKKyNkZWZpbmUgSjJLQ0FQUyAiaW1hZ2UveC1qcGMsc2FtcGxpbmc9WUNiQ3ItNDoyOjAsd2lkdGg9NzIwLGhlaWdodD01NzYscGl4ZWwtYXNwZWN0LXJhdGlvPTEvMSxmcmFtZXJhdGU9MzAvMSIKKyAgeworICAgIEdzdEVsZW1lbnQgKnBpcGVsaW5lLCAqc3JjOworICAgIEdzdEZsb3dSZXR1cm4gZmxvdyA9IEdTVF9GTE9XX09LOworICAgIEdzdEJ1ZmZlciAqYnVmOworICAgIGdjaGFyICpkYXRhOworICAgIGdzaXplIGxlbjsKKworICAgIHMgPSAiYXBwc3JjIGNhcHM9IiBKMktDQVBTICIgbmFtZT1zcmMgISBydHBqMmtwYXkgISBydHBqMmtkZXBheSAhIGZha2VzaW5rIjsKKworICAgIGZhaWxfdW5sZXNzIChnX2ZpbGVfZ2V0X2NvbnRlbnRzIChKMktfVEVTVF9GSUxFX1BBVEgsICZkYXRhLCAmbGVuLCBOVUxMKSk7CisgICAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZGF0YSwgbGVuKTsKKyAgICBwaXBlbGluZSA9IHNldHVwX3BpcGVsaW5lIChzKTsKKyAgICBzcmMgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJzcmMiKTsKKyAgICBnX29iamVjdF9zZXQgKHNyYywgImZvcm1hdCIsIEdTVF9GT1JNQVRfVElNRSwgTlVMTCk7CisgICAgZ19zaWduYWxfZW1pdF9ieV9uYW1lIChzcmMsICJwdXNoLWJ1ZmZlciIsIGJ1ZiwgJmZsb3cpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZmxvdywgR1NUX0ZMT1dfT0spOworICAgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAoc3JjLCAiZW5kLW9mLXN0cmVhbSIsICZmbG93KTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzcmMpOworICAgIHJ1bl9waXBlbGluZSAocGlwZWxpbmUsIHMsCisgICAgICAgIEdTVF9NRVNTQUdFX0FOWSAmIH4oR1NUX01FU1NBR0VfRVJST1IgfCBHU1RfTUVTU0FHRV9XQVJOSU5HKSwKKyAgICAgICAgR1NUX01FU1NBR0VfVU5LTk9XTiwgdGFyZ2V0X3N0YXRlKTsKKyAgfQorCisgIC8qcyA9IEZBS0VTUkMgIiAhICEgcnRwYWMzZGVwYXkgISAiIEZBS0VTSU5LICovCisgIC8qcyA9IEZBS0VTUkMgIiAhICEgYXN0ZXJpc2toMjYzICEgIiBGQUtFU0lOSzsgKi8KKyAgLypzID0gRkFLRVNSQyAiICEgISBydHBtcHZkZXBheSAhICIgRkFLRVNJTks7ICovCisgIC8qcyA9IEZBS0VTUkMgIiAhICEgcnRwbXA0YWRlcGF5ICEgIiBGQUtFU0lOSzsgKi8KKyAgLypzID0gRkFLRVNSQyAiICEgISBydHBzdjN2ZGVwYXkgISAiIEZBS0VTSU5LOyAqLworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBnYm9vbGVhbgoraGF2ZV9lbGVtZW50cyAoY29uc3QgZ2NoYXIgKiBlbGVtZW50MSwgY29uc3QgZ2NoYXIgKiBlbGVtZW50MikKK3sKKyAgcmV0dXJuIGdzdF9yZWdpc3RyeV9jaGVja19mZWF0dXJlX3ZlcnNpb24gKGdzdF9yZWdpc3RyeV9nZXQgKCksIGVsZW1lbnQxLAorICAgICAgR1NUX1ZFUlNJT05fTUFKT1IsIEdTVF9WRVJTSU9OX01JTk9SLCAwKSAmJgorICAgICAgZ3N0X3JlZ2lzdHJ5X2NoZWNrX2ZlYXR1cmVfdmVyc2lvbiAoZ3N0X3JlZ2lzdHJ5X2dldCAoKSwgZWxlbWVudDIsCisgICAgICBHU1RfVkVSU0lPTl9NQUpPUiwgR1NUX1ZFUlNJT05fTUlOT1IsIDApOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF92aWRlb19lbmNvZGVyc19kZWNvZGVycykKK3sKKyAgY29uc3QgZ2NoYXIgKnM7CisgIEdzdFN0YXRlIHRhcmdldF9zdGF0ZSA9IEdTVF9TVEFURV9QTEFZSU5HOworCisgIC8qIG5vIGlzLWxpdmUgb24gdGhlIHNvdXJjZSBiZWNhdXNlIHdlIGFjdHVhbGx5IHdhbnQgdG8gcHJlcm9sbCBzaW5jZQorICAgKiBydW5fcGlwZWxpbmUgb25seSBnb2VzIGludG8gUEFVU0VEICovCisjZGVmaW5lIEVOQ19ERUNfUElQRUxJTkVfU1RSSU5HKGJ1ZmNvdW50LCBlbmMsIGRlYykgInZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz0iIGJ1ZmNvdW50ICIgISAiIGVuYyAiICEgIiBkZWMgIiAhIGZha2VzaW5rIgorI2RlZmluZSBERUZBVUxUX0JVRkNPVU5UICI1IgorCisgIGlmIChoYXZlX2VsZW1lbnRzICgianBlZ2VuYyIsICJqcGVnZGVjIikpIHsKKyAgICBzID0gRU5DX0RFQ19QSVBFTElORV9TVFJJTkcgKERFRkFVTFRfQlVGQ09VTlQsICJqcGVnZW5jIiwgImpwZWdkZWMiKTsKKyAgICBydW5fcGlwZWxpbmUgKHNldHVwX3BpcGVsaW5lIChzKSwgcywKKyAgICAgICAgR1NUX01FU1NBR0VfQU5ZICYgfihHU1RfTUVTU0FHRV9FUlJPUiB8IEdTVF9NRVNTQUdFX1dBUk5JTkcpLAorICAgICAgICBHU1RfTUVTU0FHRV9VTktOT1dOLCB0YXJnZXRfc3RhdGUpOworICB9CisKKyAgaWYgKGhhdmVfZWxlbWVudHMgKCJwbmdlbmMiLCAicG5nZGVjIikpIHsKKyAgICBzID0gRU5DX0RFQ19QSVBFTElORV9TVFJJTkcgKERFRkFVTFRfQlVGQ09VTlQsICJwbmdlbmMiLCAicG5nZGVjIik7CisgICAgcnVuX3BpcGVsaW5lIChzZXR1cF9waXBlbGluZSAocyksIHMsCisgICAgICAgIEdTVF9NRVNTQUdFX0FOWSAmIH4oR1NUX01FU1NBR0VfRVJST1IgfCBHU1RfTUVTU0FHRV9XQVJOSU5HKSwKKyAgICAgICAgR1NUX01FU1NBR0VfVU5LTk9XTiwgdGFyZ2V0X3N0YXRlKTsKKyAgfQorCisgIGlmIChoYXZlX2VsZW1lbnRzICgic21va2VlbmMiLCAic21va2VkZWMiKSkgeworICAgIHMgPSBFTkNfREVDX1BJUEVMSU5FX1NUUklORyAoREVGQVVMVF9CVUZDT1VOVCwgInNtb2tlZW5jIiwgInNtb2tlZGVjIik7CisgICAgcnVuX3BpcGVsaW5lIChzZXR1cF9waXBlbGluZSAocyksIHMsCisgICAgICAgIEdTVF9NRVNTQUdFX0FOWSAmIH4oR1NUX01FU1NBR0VfRVJST1IgfCBHU1RfTUVTU0FHRV9XQVJOSU5HKSwKKyAgICAgICAgR1NUX01FU1NBR0VfVU5LTk9XTiwgdGFyZ2V0X3N0YXRlKTsKKyAgfQorfQorCitHU1RfRU5EX1RFU1Q7CisKKyNkZWZpbmUgVklERU9NSVhFUl9QSVBFTElORSBcCisgICAgInZpZGVvbWl4ZXIgbmFtZT1taXggIGJhY2tncm91bmQ9dHJhbnNwYXJlbnQgISBmYWtlc2luayAiIFwKKyAgICAidmlkZW90ZXN0c3JjIG51bS1idWZmZXJzPTUwICEgIiBcCisgICAgIiAgdmlkZW8veC1yYXcsZm9ybWF0PVJHQkEsIHdpZHRoPTIwMCxoZWlnaHQ9MjAwLGZyYW1lcmF0ZT0xMC8xICAhICIgXAorICAgICIgIHZpZGVvY29udmVydCAhIG1peC5zaW5rXzEgIiBcCisgICAgInZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz01MCBwYXR0ZXJuPXNtcHRlICEgIiBcCisgICAgIiAgdmlkZW8veC1yYXcsZm9ybWF0PVJHQkEsIHdpZHRoPTcyMCxoZWlnaHQ9NDgwLGZyYW1lcmF0ZT0xMC8xICAhICIgXAorICAgICIgIHZpZGVvY29udmVydCAhIG1peC5zaW5rXzAgIgorCitHU1RfU1RBUlRfVEVTVCAodGVzdF92aWRlb21peGVyKQoreworICBydW5fcGlwZWxpbmUgKHNldHVwX3BpcGVsaW5lIChWSURFT01JWEVSX1BJUEVMSU5FKSwgVklERU9NSVhFUl9QSVBFTElORSwKKyAgICAgIEdTVF9NRVNTQUdFX0FOWSAmIH4oR1NUX01FU1NBR0VfRVJST1IgfCBHU1RfTUVTU0FHRV9XQVJOSU5HKSwKKyAgICAgIEdTVF9NRVNTQUdFX1VOS05PV04sIEdTVF9TVEFURV9QTEFZSU5HKTsKK30KKworR1NUX0VORF9URVNUOworCisjZW5kaWYgLyogI2lmbmRlZiBHU1RfRElTQUJMRV9QQVJTRSAqLworc3RhdGljIFN1aXRlICoKK3NpbXBsZV9sYXVuY2hfbGluZXNfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiUGlwZWxpbmVzIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImxpbmVhciIpOworCisgIC8qIHRpbWUgb3V0IGFmdGVyIDYwcywgbm90IHRoZSBkZWZhdWx0IDMgKi8KKyAgdGNhc2Vfc2V0X3RpbWVvdXQgKHRjX2NoYWluLCA2MCk7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisjaWZuZGVmIEdTVF9ESVNBQkxFX1BBUlNFCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ydHBfcGF5bG9hZGVycyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF92aWRlb19lbmNvZGVyc19kZWNvZGVycyk7CisgIC8qIEZJWE1FOiB2ZXJ5IHJhcmVseSBmYWlscywgbWF5YmUgYmVjYXVzZSBvZiBuZWdvdGlhdGlvbiBpc3N1ZXM/ICovCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF92aWRlb21peGVyKTsKKyNlbmRpZgorICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHNpbXBsZV9sYXVuY2hfbGluZXMpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svcGlwZWxpbmVzL3RhZ3NjaGVja2luZy5jIGIvdGVzdHMvY2hlY2svcGlwZWxpbmVzL3RhZ3NjaGVja2luZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NzBiZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9waXBlbGluZXMvdGFnc2NoZWNraW5nLmMKQEAgLTAsMCArMSwzNjEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uLiAoY29udGFjdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPikKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z2xpYi9nc3RkaW8uaD4KKworc3RhdGljIEdzdFRhZ0xpc3QgKnJlY2VpdmVkX3RhZ3MgPSBOVUxMOworCitzdGF0aWMgZ2Jvb2xlYW4KK2J1c19oYW5kbGVyIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBncG9pbnRlciBkYXRhKQoreworICBHTWFpbkxvb3AgKmxvb3AgPSAoR01haW5Mb29wICopIGRhdGE7CisKKyAgc3dpdGNoIChtZXNzYWdlLT50eXBlKSB7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FT1M6CisgICAgICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01FU1NBR0VfV0FSTklORzoKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VSUk9SOnsKKyAgICAgIEdFcnJvciAqZ2Vycm9yOworCisgICAgICBnY2hhciAqZGVidWc7CisKKyAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChtZXNzYWdlLCAmZ2Vycm9yLCAmZGVidWcpOworICAgICAgZ3N0X29iamVjdF9kZWZhdWx0X2Vycm9yIChHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpLCBnZXJyb3IsIGRlYnVnKTsKKyAgICAgIGdfZXJyb3JfZnJlZSAoZ2Vycm9yKTsKKyAgICAgIGdfZnJlZSAoZGVidWcpOworICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfTUVTU0FHRV9UQUc6eworICAgICAgaWYgKHJlY2VpdmVkX3RhZ3MgPT0gTlVMTCkgeworICAgICAgICBnc3RfbWVzc2FnZV9wYXJzZV90YWcgKG1lc3NhZ2UsICZyZWNlaXZlZF90YWdzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdzdFRhZ0xpc3QgKnRsID0gTlVMTCwgKm50bCA9IE5VTEw7CisKKyAgICAgICAgZ3N0X21lc3NhZ2VfcGFyc2VfdGFnIChtZXNzYWdlLCAmdGwpOworICAgICAgICBpZiAodGwpIHsKKyAgICAgICAgICBudGwgPSBnc3RfdGFnX2xpc3RfbWVyZ2UgKHJlY2VpdmVkX3RhZ3MsIHRsLCBHU1RfVEFHX01FUkdFX1BSRVBFTkQpOworICAgICAgICAgIGlmIChudGwpIHsKKyAgICAgICAgICAgIEdTVF9MT0cgKCJ0YWdsaXN0cyBtZXJnZWQ6ICUiIEdTVF9QVFJfRk9STUFULCBudGwpOworICAgICAgICAgICAgZ3N0X3RhZ19saXN0X3VucmVmIChyZWNlaXZlZF90YWdzKTsKKyAgICAgICAgICAgIHJlY2VpdmVkX3RhZ3MgPSBudGw7CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF90YWdfbGlzdF91bnJlZiAodGwpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBDcmVhdGVzIGEgcGlwZWxpbmUgaW4gdGhlIGZvcm06CisgKiBmYWtlc3JjIG51bS1idWZmZXJzPTEgISBjYXBzICEgbXV4ZXIgISBmaWxlc2luayBsb2NhdGlvbj1maWxlCisgKgorICogQW5kIHNldHMgdGhlIHRhZ3MgaW4gdGFnX3N0ciBpbnRvIHRoZSBtdXhlciB2aWEgdGFnc2V0dGVyLgorICovCitzdGF0aWMgdm9pZAordGVzdF9tdXhfdGFncyAoY29uc3QgZ2NoYXIgKiB0YWdfc3RyLCBjb25zdCBnY2hhciAqIGNhcHMsCisgICAgY29uc3QgZ2NoYXIgKiBtdXhlciwgY29uc3QgZ2NoYXIgKiBmaWxlKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0QnVzICpidXM7CisgIEdNYWluTG9vcCAqbG9vcDsKKyAgR3N0VGFnTGlzdCAqc2VudF90YWdzOworICBHc3RFbGVtZW50ICptdXg7CisgIEdzdFRhZ1NldHRlciAqc2V0dGVyOworICBnY2hhciAqbGF1bmNoX3N0cjsKKyAgZ3VpbnQgYnVzX3dhdGNoID0gMDsKKworICBHU1RfREVCVUcgKCJ0ZXN0aW5nIHhtcCBtdXhpbmcgb24gOiAlcyIsIG11eGVyKTsKKworICBsYXVuY2hfc3RyID0KKyAgICAgIGdfc3RyZHVwX3ByaW50ZiAoImZha2VzcmMgbnVtLWJ1ZmZlcnM9MSBmb3JtYXQ9dGltZSBkYXRhcmF0ZT0xMDAgISAiCisgICAgICAiJXMgISAlcyBuYW1lPW11eCAhIGZpbGVzaW5rIGxvY2F0aW9uPSVzIG5hbWU9c2luayIsIGNhcHMsIG11eGVyLCBmaWxlKTsKKyAgcGlwZWxpbmUgPSBnc3RfcGFyc2VfbGF1bmNoIChsYXVuY2hfc3RyLCBOVUxMKTsKKyAgZ19mcmVlIChsYXVuY2hfc3RyKTsKKyAgZmFpbF91bmxlc3MgKHBpcGVsaW5lICE9IE5VTEwpOworCisgIG11eCA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgIm11eCIpOworICBmYWlsX3VubGVzcyAobXV4ICE9IE5VTEwpOworCisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIFRSVUUpOworICBmYWlsX3VubGVzcyAobG9vcCAhPSBOVUxMKTsKKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChwaXBlbGluZSk7CisgIGZhaWxfdW5sZXNzIChidXMgIT0gTlVMTCk7CisgIGJ1c193YXRjaCA9IGdzdF9idXNfYWRkX3dhdGNoIChidXMsIGJ1c19oYW5kbGVyLCBsb29wKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUkVBRFkpOworCisgIHNldHRlciA9IEdTVF9UQUdfU0VUVEVSIChtdXgpOworICBmYWlsX3VubGVzcyAoc2V0dGVyICE9IE5VTEwpOworICBzZW50X3RhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2Zyb21fc3RyaW5nICh0YWdfc3RyKTsKKyAgZmFpbF91bmxlc3MgKHNlbnRfdGFncyAhPSBOVUxMKTsKKyAgZ3N0X3RhZ19zZXR0ZXJfbWVyZ2VfdGFncyAoc2V0dGVyLCBzZW50X3RhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAoc2VudF90YWdzKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworCisgIGdfbWFpbl9sb29wX3VucmVmIChsb29wKTsKKyAgZ19vYmplY3RfdW5yZWYgKG11eCk7CisgIGdfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisgIGdfc291cmNlX3JlbW92ZSAoYnVzX3dhdGNoKTsKK30KKworLyoKKyAqIE1ha2VzIGEgcGlwZWxpbmUgaW4gdGhlIGZvcm06CisgKiBmaWxlc3JjIGxvY2F0aW9uPWZpbGUgISBkZW11eGVyICEgZmFrZXNpbmsKKyAqCisgKiBBbmQgZ2V0cyB0aGUgdGFncyB0aGF0IGFyZSBwb3N0ZWQgb24gdGhlIGJ1cyB0byBjb21wYXJlCisgKiB3aXRoIHRoZSB0YWdzIGluICd0YWdfc3RyJworICovCitzdGF0aWMgdm9pZAordGVzdF9kZW11eF90YWdzIChjb25zdCBnY2hhciAqIHRhZ19zdHIsIGNvbnN0IGdjaGFyICogZGVtdXhlciwKKyAgICBjb25zdCBnY2hhciAqIGZpbGUpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RCdXMgKmJ1czsKKyAgR01haW5Mb29wICpsb29wOworICBHc3RUYWdMaXN0ICpzZW50X3RhZ3M7CisgIGdpbnQgaSwgaiwgaywgbl9yZWN2LCBuX3NlbnQ7CisgIGNvbnN0IGdjaGFyICpuYW1lX3NlbnQsICpuYW1lX3JlY3Y7CisgIGNvbnN0IEdWYWx1ZSAqdmFsdWVfc2VudCwgKnZhbHVlX3JlY3Y7CisgIGdib29sZWFuIGZvdW5kOworICBnaW50IGNvbXBhcmlzb247CisgIEdzdEVsZW1lbnQgKmRlbXV4OworICBnY2hhciAqbGF1bmNoX3N0cjsKKyAgZ3VpbnQgYnVzX3dhdGNoID0gMDsKKworICBHU1RfREVCVUcgKCJ0ZXN0aW5nIHRhZ3MgOiAlcyIsIHRhZ19zdHIpOworCisgIGlmIChyZWNlaXZlZF90YWdzKSB7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmIChyZWNlaXZlZF90YWdzKTsKKyAgICByZWNlaXZlZF90YWdzID0gTlVMTDsKKyAgfQorCisgIGxhdW5jaF9zdHIgPSBnX3N0cmR1cF9wcmludGYgKCJmaWxlc3JjIGxvY2F0aW9uPSVzICEgJXMgbmFtZT1kZW11eCAhICIKKyAgICAgICJmYWtlc2luayIsIGZpbGUsIGRlbXV4ZXIpOworICBwaXBlbGluZSA9IGdzdF9wYXJzZV9sYXVuY2ggKGxhdW5jaF9zdHIsIE5VTEwpOworICBnX2ZyZWUgKGxhdW5jaF9zdHIpOworICBmYWlsX3VubGVzcyAocGlwZWxpbmUgIT0gTlVMTCk7CisKKyAgZGVtdXggPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJkZW11eCIpOworICBmYWlsX3VubGVzcyAoZGVtdXggIT0gTlVMTCk7CisKKyAgbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgVFJVRSk7CisgIGZhaWxfdW5sZXNzIChsb29wICE9IE5VTEwpOworCisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKHBpcGVsaW5lKTsKKyAgZmFpbF91bmxlc3MgKGJ1cyAhPSBOVUxMKTsKKyAgYnVzX3dhdGNoID0gZ3N0X2J1c19hZGRfd2F0Y2ggKGJ1cywgYnVzX2hhbmRsZXIsIGxvb3ApOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIHNlbnRfdGFncyA9IGdzdF90YWdfbGlzdF9uZXdfZnJvbV9zdHJpbmcgKHRhZ19zdHIpOworICBmYWlsX3VubGVzcyAoc2VudF90YWdzICE9IE5VTEwpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgZ19tYWluX2xvb3BfcnVuIChsb29wKTsKKworICBHU1RfREVCVUcgKCJtYWlubG9vcCBkb25lIDogJXAiLCByZWNlaXZlZF90YWdzKTsKKworICAvKiB2ZXJpZnkgdGFncyAqLworICBmYWlsX3VubGVzcyAocmVjZWl2ZWRfdGFncyAhPSBOVUxMKTsKKyAgbl9yZWN2ID0gZ3N0X3RhZ19saXN0X25fdGFncyAocmVjZWl2ZWRfdGFncyk7CisgIG5fc2VudCA9IGdzdF90YWdfbGlzdF9uX3RhZ3MgKHNlbnRfdGFncyk7CisgIGZhaWxfdW5sZXNzIChuX3JlY3YgPj0gbl9zZW50KTsKKyAgLyogRklYTUU6IGNvbXBhcmUgdGFnbGl0cyB2YWx1ZXMgKi8KKyAgZm9yIChpID0gMDsgaSA8IG5fc2VudDsgaSsrKSB7CisgICAgbmFtZV9zZW50ID0gZ3N0X3RhZ19saXN0X250aF90YWdfbmFtZSAoc2VudF90YWdzLCBpKTsKKworICAgIGZvdW5kID0gRkFMU0U7CisgICAgZm9yIChqID0gMDsgaiA8IG5fcmVjdjsgaisrKSB7CisgICAgICBuYW1lX3JlY3YgPSBnc3RfdGFnX2xpc3RfbnRoX3RhZ19uYW1lIChyZWNlaXZlZF90YWdzLCBqKTsKKworICAgICAgaWYgKCFzdHJjbXAgKG5hbWVfc2VudCwgbmFtZV9yZWN2KSkgeworICAgICAgICBndWludCBzZW50X2xlbiwgcmVjdl9sZW47CisKKyAgICAgICAgc2VudF9sZW4gPSBnc3RfdGFnX2xpc3RfZ2V0X3RhZ19zaXplIChzZW50X3RhZ3MsIG5hbWVfc2VudCk7CisgICAgICAgIHJlY3ZfbGVuID0gZ3N0X3RhZ19saXN0X2dldF90YWdfc2l6ZSAocmVjZWl2ZWRfdGFncywgbmFtZV9yZWN2KTsKKworICAgICAgICBmYWlsX3VubGVzcyAoc2VudF9sZW4gPT0gcmVjdl9sZW4sCisgICAgICAgICAgICAidGFnIGl0ZW0gJXMgaGFzIGJlZW4gcmVjZWl2ZWQgd2l0aCBkaWZmZXJlbnQgc2l6ZSIsIG5hbWVfc2VudCk7CisKKyAgICAgICAgZm9yIChrID0gMDsgayA8IHNlbnRfbGVuOyBrKyspIHsKKyAgICAgICAgICB2YWx1ZV9zZW50ID0gZ3N0X3RhZ19saXN0X2dldF92YWx1ZV9pbmRleCAoc2VudF90YWdzLCBuYW1lX3NlbnQsIGspOworICAgICAgICAgIHZhbHVlX3JlY3YgPQorICAgICAgICAgICAgICBnc3RfdGFnX2xpc3RfZ2V0X3ZhbHVlX2luZGV4IChyZWNlaXZlZF90YWdzLCBuYW1lX3JlY3YsIGspOworCisgICAgICAgICAgY29tcGFyaXNvbiA9IGdzdF92YWx1ZV9jb21wYXJlICh2YWx1ZV9zZW50LCB2YWx1ZV9yZWN2KTsKKyAgICAgICAgICBpZiAoY29tcGFyaXNvbiAhPSBHU1RfVkFMVUVfRVFVQUwpIHsKKyAgICAgICAgICAgIGdjaGFyICp2cyA9IGdfc3RyZHVwX3ZhbHVlX2NvbnRlbnRzICh2YWx1ZV9zZW50KTsKKyAgICAgICAgICAgIGdjaGFyICp2ciA9IGdfc3RyZHVwX3ZhbHVlX2NvbnRlbnRzICh2YWx1ZV9yZWN2KTsKKyAgICAgICAgICAgIEdTVF9ERUJVRyAoInNlbnQgPSAlczonJXMnLCByZWN2ID0gJXM6JyVzJyIsCisgICAgICAgICAgICAgICAgR19WQUxVRV9UWVBFX05BTUUgKHZhbHVlX3NlbnQpLCB2cywKKyAgICAgICAgICAgICAgICBHX1ZBTFVFX1RZUEVfTkFNRSAodmFsdWVfcmVjdiksIHZyKTsKKyAgICAgICAgICAgIGdfZnJlZSAodnMpOworICAgICAgICAgICAgZ19mcmVlICh2cik7CisgICAgICAgICAgfQorICAgICAgICAgIGZhaWxfdW5sZXNzIChjb21wYXJpc29uID09IEdTVF9WQUxVRV9FUVVBTCwKKyAgICAgICAgICAgICAgInRhZyBpdGVtICVzIGhhcyBiZWVuIHJlY2VpdmVkIHdpdGggZGlmZmVyZW50IHR5cGUgb3IgdmFsdWUiLAorICAgICAgICAgICAgICBuYW1lX3NlbnQpOworICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBmYWlsX3VubGVzcyAoZm91bmQsICJ0YWcgaXRlbSAlcyBpcyBsb3N0IiwgbmFtZV9zZW50KTsKKyAgfQorCisgIGdzdF90YWdfbGlzdF91bnJlZiAocmVjZWl2ZWRfdGFncyk7CisgIHJlY2VpdmVkX3RhZ3MgPSBOVUxMOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHNlbnRfdGFncyk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworCisgIGdfbWFpbl9sb29wX3VucmVmIChsb29wKTsKKyAgZ19vYmplY3RfdW5yZWYgKGRlbXV4KTsKKyAgZ19vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKyAgZ19zb3VyY2VfcmVtb3ZlIChidXNfd2F0Y2gpOworfQorCisvKgorICogVGVzdHMgaWYgdGhlIG11eGVyL2RlbXV4ZXIgcGFpciBjYW4gc2VyaWFsaXplIHRoZSB0YWdzIGluICd0YWdfc3RyJworICogdG8gYSBmaWxlIGFuZCByZWNvdmVyIHRoZW0gY29ycmVjdGx5LgorICoKKyAqICdjYXBzJyBhcmUgdXNlZCB0byBhc3N1cmUgdGhlIG11eGVyIGFjY2VwdHMgdGhlIGZha2UgYnVmZmVyIGZha2VzcmMKKyAqIHdpbGwgc2VuZCB0byBpdC4KKyAqLworc3RhdGljIHZvaWQKK3Rlc3RfdGFncyAoY29uc3QgZ2NoYXIgKiB0YWdfc3RyLCBjb25zdCBnY2hhciAqIGNhcHMsIGNvbnN0IGdjaGFyICogbXV4ZXIsCisgICAgY29uc3QgZ2NoYXIgKiBkZW11eGVyKQoreworICBnY2hhciAqdG1wZmlsZTsKKyAgZ2NoYXIgKnRtcGRpcjsKKworICB0bXBkaXIgPSBnX2Rpcl9tYWtlX3RtcCAoImdzdC1jaGVjay1nb29kLVhYWFhYWCIsIE5VTEwpOworICBmYWlsX3VubGVzcyAodG1wZGlyICE9IE5VTEwpOworICB0bXBmaWxlID0gZ19idWlsZF9maWxlbmFtZSAodG1wZGlyLCAidGFnc2NoZWNraW5nLXhtcCIsIE5VTEwpOworCisgIEdTVF9ERUJVRyAoInRlc3RpbmcgdGFncyA6ICVzIiwgdGFnX3N0cik7CisgIHRlc3RfbXV4X3RhZ3MgKHRhZ19zdHIsIGNhcHMsIG11eGVyLCB0bXBmaWxlKTsKKyAgdGVzdF9kZW11eF90YWdzICh0YWdfc3RyLCBkZW11eGVyLCB0bXBmaWxlKTsKKyAgZ191bmxpbmsgKHRtcGZpbGUpOworICBnX3JtZGlyICh0bXBkaXIpOworICBnX2ZyZWUgKHRtcGZpbGUpOworICBnX2ZyZWUgKHRtcGRpcik7Cit9CisKKyNkZWZpbmUgSDI2NF9DQVBTICJ2aWRlby94LWgyNjQsIHdpZHRoPShpbnQpMzIwLCBoZWlnaHQ9KGludCkyNDAsIiBcCisgICAgICAgICAgICAgICAgICAiIGZyYW1lcmF0ZT0oZnJhY3Rpb24pMzAvMSwgY29kZWNfZGF0YT0oYnVmZmVyKSIgXAorICAgICAgICAgICAgICAgICAgIjAxNDAxNTkyZmZlMTAwMTc2NzRkNDAxNTkyNTQwYTBmZDgwODgwMDAwMDAzMDAiIFwKKyAgICAgICAgICAgICAgICAgICI4MDAwMDAxZTQ3OGIxNzUwMDEwMDA0NjhlZTNjODAsICJcCisgICAgICAgICAgICAgICAgICAic3RyZWFtLWZvcm1hdD0oc3RyaW5nKWF2YywgYWxpZ25tZW50PShzdHJpbmcpYXUiCisKKyNkZWZpbmUgQ09NTU9OX1RBR1MgXAorICAgICJ0YWdsaXN0LHRpdGxlPXRlc3RfdGl0bGUsIiAgICBcCisgICAgImFydGlzdD10ZXN0X2FydGlzdCwiICAgICAgICAgIFwKKyAgICAia2V5d29yZHM9XCJrZXkxLGtleTJcIiwiICAgICAgXAorICAgICJkZXNjcmlwdGlvbj10ZXN0X2Rlc2MiCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2NvbW1vbl90YWdzKQoreworICBpZiAoIWdzdF9yZWdpc3RyeV9jaGVja19mZWF0dXJlX3ZlcnNpb24gKGdzdF9yZWdpc3RyeV9nZXQgKCksICJxdGRlbXV4IiwgMCwKKyAgICAgICAgICAxMCwgMjMpKSB7CisgICAgR1NUX0lORk8gKCJTa2lwcGluZyB0ZXN0LCBxdGRlbXV4IGVpdGhlciBub3QgYXZhaWxhYmxlIG9yIHRvbyBvbGQiKTsKKyAgICByZXR1cm47CisgIH0KKyAgdGVzdF90YWdzIChDT01NT05fVEFHUywgSDI2NF9DQVBTLCAicXRtdXgiLCAicXRkZW11eCIpOworICB0ZXN0X3RhZ3MgKENPTU1PTl9UQUdTLCBIMjY0X0NBUFMsICJtcDRtdXgiLCAicXRkZW11eCIpOworICB0ZXN0X3RhZ3MgKENPTU1PTl9UQUdTLCBIMjY0X0NBUFMsICIzZ3BwbXV4IiwgInF0ZGVtdXgiKTsKK30KKworR1NUX0VORF9URVNUOworCisjZGVmaW5lIEdFT19MT0NBVElPTl9UQUdTIFwKKyAgICAidGFnbGlzdCxnZW8tbG9jYXRpb24tY291bnRyeT1CcmF6aWwsIiAgICBcCisgICAgICAiZ2VvLWxvY2F0aW9uLWNpdHk9XCJDYW1waW5hIEdyYW5kZVwiLCIgXAorICAgICAgImdlby1sb2NhdGlvbi1zdWJsb2NhdGlvbj1Cb2RvY29uZ28sIiAgIFwKKyAgICAgICJnZW8tbG9jYXRpb24tbGF0aXR1ZGU9LTEyLjEyNSwiICAgICAgICBcCisgICAgICAiZ2VvLWxvY2F0aW9uLWxvbmdpdHVkZT01Ni43NSwiICAgICAgICAgXAorICAgICAgImdlby1sb2NhdGlvbi1lbGV2YXRpb249MzI3LjUiCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2dlb19sb2NhdGlvbl90YWdzKQoreworICBpZiAoIWdzdF9yZWdpc3RyeV9jaGVja19mZWF0dXJlX3ZlcnNpb24gKGdzdF9yZWdpc3RyeV9nZXQgKCksICJxdGRlbXV4IiwgMCwKKyAgICAgICAgICAxMCwgMjMpKSB7CisgICAgR1NUX0lORk8gKCJTa2lwcGluZyB0ZXN0LCBxdGRlbXV4IGVpdGhlciBub3QgYXZhaWxhYmxlIG9yIHRvbyBvbGQiKTsKKyAgICByZXR1cm47CisgIH0KKyAgdGVzdF90YWdzIChHRU9fTE9DQVRJT05fVEFHUywgSDI2NF9DQVBTLCAicXRtdXgiLCAicXRkZW11eCIpOworICB0ZXN0X3RhZ3MgKEdFT19MT0NBVElPTl9UQUdTLCBIMjY0X0NBUFMsICJtcDRtdXgiLCAicXRkZW11eCIpOworICB0ZXN0X3RhZ3MgKEdFT19MT0NBVElPTl9UQUdTLCBIMjY0X0NBUFMsICIzZ3BwbXV4IiwgInF0ZGVtdXgiKTsKK30KKworR1NUX0VORF9URVNUOworCisKKyNkZWZpbmUgVVNFUl9UQUdTIFwKKyAgICAidGFnbGlzdCx1c2VyLXJhdGluZz0odWludCk4NSIKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdXNlcl90YWdzKQoreworICBpZiAoIWdzdF9yZWdpc3RyeV9jaGVja19mZWF0dXJlX3ZlcnNpb24gKGdzdF9yZWdpc3RyeV9nZXQgKCksICJxdGRlbXV4IiwgMCwKKyAgICAgICAgICAxMCwgMjMpKSB7CisgICAgR1NUX0lORk8gKCJTa2lwcGluZyB0ZXN0LCBxdGRlbXV4IGVpdGhlciBub3QgYXZhaWxhYmxlIG9yIHRvbyBvbGQiKTsKKyAgICByZXR1cm47CisgIH0KKworICB0ZXN0X3RhZ3MgKFVTRVJfVEFHUywgSDI2NF9DQVBTLCAicXRtdXgiLCAicXRkZW11eCIpOworICB0ZXN0X3RhZ3MgKFVTRVJfVEFHUywgSDI2NF9DQVBTLCAibXA0bXV4IiwgInF0ZGVtdXgiKTsKKyAgdGVzdF90YWdzIChVU0VSX1RBR1MsIEgyNjRfQ0FQUywgIjNncHBtdXgiLCAicXRkZW11eCIpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCittZXRhZGF0YV9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJ0YWdzY2hlY2tpbmciKTsKKworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgLyogdGltZSBvdXQgYWZ0ZXIgNjBzLCBub3QgdGhlIGRlZmF1bHQgMyAqLworICB0Y2FzZV9zZXRfdGltZW91dCAodGNfY2hhaW4sIDYwKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2NvbW1vbl90YWdzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dlb19sb2NhdGlvbl90YWdzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3VzZXJfdGFncyk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChtZXRhZGF0YSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9waXBlbGluZXMvdHdvbGFtZS5jIGIvdGVzdHMvY2hlY2svcGlwZWxpbmVzL3R3b2xhbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTJkY2ZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svcGlwZWxpbmVzL3R3b2xhbWUuYwpAQCAtMCwwICsxLDIyIEBACisvKiBHU3RyZWFtZXIgdW5pdCB0ZXN0IGZvciB0d29sYW1lCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qIHByZXR0eSBsYW1lLCBJIGtub3cgKi8KKyNkZWZpbmUgRU5DT0RFUiAidHdvbGFtZW1wMmVuYyIKKyNpbmNsdWRlICJsYW1lLmMiCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9waXBlbGluZXMvd2F2ZW5jLmMgYi90ZXN0cy9jaGVjay9waXBlbGluZXMvd2F2ZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQwMmVhMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZlbmMuYwpAQCAtMCwwICsxLDIwNiBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciB3YXZlbmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDwyMDEwPiBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyogRklYTUUgMC4xMTogc3VwcHJlc3Mgd2FybmluZ3MgZm9yIGRlcHJlY2F0ZWQgQVBJIHN1Y2ggYXMgR1ZhbHVlQXJyYXkKKyAqIHdpdGggbmV3ZXIgR0xpYiB2ZXJzaW9ucyAoPj0gMi4zMS4wKSAqLworI2RlZmluZSBHTElCX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby1lbnVtdHlwZXMuaD4KKworc3RhdGljIGdib29sZWFuCitidXNfaGFuZGxlciAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR01haW5Mb29wICpsb29wID0gKEdNYWluTG9vcCAqKSBkYXRhOworCisgIHN3aXRjaCAobWVzc2FnZS0+dHlwZSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfRU9TOgorICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX1dBUk5JTkc6CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FUlJPUjp7CisgICAgICBHRXJyb3IgKmdlcnJvcjsKKyAgICAgIGdjaGFyICpkZWJ1ZzsKKworICAgICAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1lc3NhZ2UsICZnZXJyb3IsICZkZWJ1Zyk7CisgICAgICBnc3Rfb2JqZWN0X2RlZmF1bHRfZXJyb3IgKEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSksIGdlcnJvciwgZGVidWcpOworICAgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgZ19lcnJvcl9mcmVlIChnZXJyb3IpOworICAgICAgZ19mcmVlIChkZWJ1Zyk7CisgICAgICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIGdzdC1sYXVuY2gtMS4wIFwKKyAqIGF1ZGlvdGVzdHNyYyBmcmVxPTQ0MCBudW0tYnVmZmVycz0xMDAgISBpbnRlcmxlYXZlIG5hbWU9aSAhIGF1ZGlvY29udmVydCAhIHdhdmVuYyAhIGZpbGVzaW5rIGxvY2F0aW9uPS90bXAvbWMud2F2IFwKKyAqIGF1ZGlvdGVzdHNyYyBmcmVxPTg4MCBudW0tYnVmZmVycz0xMDAgISBpLgorICogLi4uCisgKgorICogaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3doZGMvZGV2aWNlL2F1ZGlvL211bHRpY2hhdWQubXNweAorICovCisKK3N0YXRpYyB2b2lkCittYWtlX25fY2hhbm5lbF93YXYgKGNvbnN0IGdpbnQgY2hhbm5lbHMsIGNvbnN0IEdWYWx1ZUFycmF5ICogYXJyKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0RWxlbWVudCAqKmF1ZGlvdGVzdHNyYywgKmludGVybGVhdmUsICp3YXZlbmMsICpjb252LCAqZmFrZXNpbms7CisgIEdzdEJ1cyAqYnVzOworICBHTWFpbkxvb3AgKmxvb3A7CisgIGd1aW50IGk7CisgIGd1aW50IGJ1c193YXRjaCA9IDA7CisKKyAgYXVkaW90ZXN0c3JjID0gZ19uZXcwIChHc3RFbGVtZW50ICosIGNoYW5uZWxzKTsKKworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBmYWlsX3VubGVzcyAocGlwZWxpbmUgIT0gTlVMTCk7CisKKyAgaW50ZXJsZWF2ZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImludGVybGVhdmUiLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGludGVybGVhdmUgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoaW50ZXJsZWF2ZSwgImNoYW5uZWwtcG9zaXRpb25zIiwgYXJyLCBOVUxMKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgaW50ZXJsZWF2ZSk7CisKKyAgaWYgKEdfQllURV9PUkRFUiA9PSBHX0JJR19FTkRJQU4pIHsKKyAgICAvKiB3ZSdyZSBub3QgaGVyZSB0byB0ZXN0IG9yYzsgYXVkaW9jb252ZXJ0IG1pc2JlaGF2ZXMgb24gcHBjMzIgKi8KKyAgICBnX3NldGVudiAoIk9SQ19DT0RFIiwgImJhY2t1cCIsIDEpOworICAgIGNvbnYgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb2NvbnZlcnQiLCBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBjb252ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiaWRlbnRpdHkiLCBOVUxMKTsKKyAgfQorICBmYWlsX3VubGVzcyAoY29udiAhPSBOVUxMKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgY29udik7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rIChpbnRlcmxlYXZlLCBjb252KSk7CisKKyAgd2F2ZW5jID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgid2F2ZW5jIiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzICh3YXZlbmMgIT0gTlVMTCk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIHdhdmVuYyk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rIChjb252LCB3YXZlbmMpKTsKKworICBmYWtlc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChmYWtlc2luayAhPSBOVUxMKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgZmFrZXNpbmspOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGluayAod2F2ZW5jLCBmYWtlc2luaykpOworCisgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CisgICAgYXVkaW90ZXN0c3JjW2ldID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW90ZXN0c3JjIiwgTlVMTCk7CisgICAgZmFpbF91bmxlc3MgKGF1ZGlvdGVzdHNyY1tpXSAhPSBOVUxMKTsKKyAgICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3Rlc3RzcmNbaV0pLCAid2F2ZSIsIDAsICJmcmVxIiwKKyAgICAgICAgNDQwLjAgKiAoaSArIDEpLCAibnVtLWJ1ZmZlcnMiLCAxMDAsIE5VTEwpOworICAgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIGF1ZGlvdGVzdHNyY1tpXSk7CisgICAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmsgKGF1ZGlvdGVzdHNyY1tpXSwgaW50ZXJsZWF2ZSkpOworICB9CisKKyAgbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgVFJVRSk7CisgIGZhaWxfdW5sZXNzIChsb29wICE9IE5VTEwpOworCisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKHBpcGVsaW5lKTsKKyAgZmFpbF91bmxlc3MgKGJ1cyAhPSBOVUxMKTsKKyAgYnVzX3dhdGNoID0gZ3N0X2J1c19hZGRfd2F0Y2ggKGJ1cywgYnVzX2hhbmRsZXIsIGxvb3ApOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgZ19tYWluX2xvb3BfcnVuIChsb29wKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKyAgZ19mcmVlIChhdWRpb3Rlc3RzcmMpOworCisgIGdfbWFpbl9sb29wX3VucmVmIChsb29wKTsKKyAgZ19zb3VyY2VfcmVtb3ZlIChidXNfd2F0Y2gpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9lbmNvZGVfc3RlcmVvKQoreworICBHVmFsdWVBcnJheSAqYXJyOworICBHVmFsdWUgdmFsID0geyAwLCB9OworCisgIGFyciA9IGdfdmFsdWVfYXJyYXlfbmV3ICgyKTsKKyAgZ192YWx1ZV9pbml0ICgmdmFsLCBHU1RfVFlQRV9BVURJT19DSEFOTkVMX1BPU0lUSU9OKTsKKyAgZ192YWx1ZV9zZXRfZW51bSAoJnZhbCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCk7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kIChhcnIsICZ2YWwpOworICBnX3ZhbHVlX3Jlc2V0ICgmdmFsKTsKKyAgZ192YWx1ZV9zZXRfZW51bSAoJnZhbCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQpOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAoYXJyLCAmdmFsKTsKKyAgZ192YWx1ZV91bnNldCAoJnZhbCk7CisKKyAgbWFrZV9uX2NoYW5uZWxfd2F2ICgyLCBhcnIpOworICBnX3ZhbHVlX2FycmF5X2ZyZWUgKGFycik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworI2lmIDAKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2VuY29kZV9tdWx0aWNoYW5uZWwpCit7CisgIEdWYWx1ZUFycmF5ICphcnI7CisgIEdWYWx1ZSB2YWwgPSB7IDAsIH07CisKKyAgYXJyID0gZ192YWx1ZV9hcnJheV9uZXcgKDYpOworICBnX3ZhbHVlX2luaXQgKCZ2YWwsIEdTVF9UWVBFX0FVRElPX0NIQU5ORUxfUE9TSVRJT04pOworICBnX3ZhbHVlX3NldF9lbnVtICgmdmFsLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUKTsKKyAgZ192YWx1ZV9hcnJheV9hcHBlbmQgKGFyciwgJnZhbCk7CisgIGdfdmFsdWVfcmVzZXQgKCZ2YWwpOworICBnX3ZhbHVlX3NldF9lbnVtICgmdmFsLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCk7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kIChhcnIsICZ2YWwpOworICBnX3ZhbHVlX3Jlc2V0ICgmdmFsKTsKKyAgZ192YWx1ZV9zZXRfZW51bSAoJnZhbCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSKTsKKyAgZ192YWx1ZV9hcnJheV9hcHBlbmQgKGFyciwgJnZhbCk7CisgIGdfdmFsdWVfcmVzZXQgKCZ2YWwpOworICBnX3ZhbHVlX3NldF9lbnVtICgmdmFsLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUpOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAoYXJyLCAmdmFsKTsKKyAgZ192YWx1ZV9yZXNldCAoJnZhbCk7CisgIGdfdmFsdWVfc2V0X2VudW0gKCZ2YWwsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCk7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kIChhcnIsICZ2YWwpOworICBnX3ZhbHVlX3Jlc2V0ICgmdmFsKTsKKyAgZ192YWx1ZV9zZXRfZW51bSAoJnZhbCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVCk7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kIChhcnIsICZ2YWwpOworICBnX3ZhbHVlX3Vuc2V0ICgmdmFsKTsKKworICBtYWtlX25fY2hhbm5lbF93YXYgKDYpOworfQorCitHU1RfRU5EX1RFU1Q7CisjZW5kaWYKKworc3RhdGljIFN1aXRlICoKK3dhdmVuY19zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJ3YXZlbmMiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZW5jb2RlX3N0ZXJlbyk7CisgIC8qIEZJWE1FOiBpbXByb3ZlIHdhdmVuYworICAgICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZW5jb2RlX211bHRpY2hhbm5lbCk7CisgICAqLworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAod2F2ZW5jKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZwYWNrLmMgYi90ZXN0cy9jaGVjay9waXBlbGluZXMvd2F2cGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMDg3YjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9waXBlbGluZXMvd2F2cGFjay5jCkBAIC0wLDAgKzEsMjA1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworc3RhdGljIGdib29sZWFuCitidXNfaGFuZGxlciAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR01haW5Mb29wICpsb29wID0gKEdNYWluTG9vcCAqKSBkYXRhOworCisgIHN3aXRjaCAobWVzc2FnZS0+dHlwZSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfRU9TOgorICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX1dBUk5JTkc6CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FUlJPUjp7CisgICAgICBHRXJyb3IgKmdlcnJvcjsKKyAgICAgIGdjaGFyICpkZWJ1ZzsKKworICAgICAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1lc3NhZ2UsICZnZXJyb3IsICZkZWJ1Zyk7CisgICAgICBnc3Rfb2JqZWN0X2RlZmF1bHRfZXJyb3IgKEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSksIGdlcnJvciwgZGVidWcpOworICAgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgZ19lcnJvcl9mcmVlIChnZXJyb3IpOworICAgICAgZ19mcmVlIChkZWJ1Zyk7CisgICAgICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VMRU1FTlQ6CisgICAgeworICAgICAgY29uc3QgR3N0U3RydWN0dXJlICpzID0gZ3N0X21lc3NhZ2VfZ2V0X3N0cnVjdHVyZSAobWVzc2FnZSk7CisKKyAgICAgIGNvbnN0IGdjaGFyICpuYW1lID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyk7CisKKyAgICAgIGZhaWxfdW5sZXNzIChzdHJjbXAgKG5hbWUsICJpbXBlcmZlY3QtdGltZXN0YW1wIikgIT0gMCk7CisgICAgICBmYWlsX3VubGVzcyAoc3RyY21wIChuYW1lLCAiaW1wZXJmZWN0LW9mZnNldCIpICE9IDApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4gaGFkX2ZpcnN0X2J1ZmZlciA9IEZBTFNFOworCitzdGF0aWMgdm9pZAoraWRlbnRpdHlfaGFuZG9mZiAoR3N0RWxlbWVudCAqIG9iamVjdCwgR3N0QnVmZmVyICogYnVmZmVyLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXIgPSBHU1RfQURBUFRFUiAodXNlcl9kYXRhKTsKKworICBnc3RfYWRhcHRlcl9wdXNoIChhZGFwdGVyLCBnc3RfYnVmZmVyX3JlZiAoYnVmZmVyKSk7Cit9CisKK3N0YXRpYyB2b2lkCitmYWtlc2lua19oYW5kb2ZmIChHc3RFbGVtZW50ICogb2JqZWN0LCBHc3RCdWZmZXIgKiBidWZmZXIsIEdzdFBhZCAqIHBhZCwKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXIgPSBHU1RfQURBUFRFUiAodXNlcl9kYXRhKTsKKworICAvKiBEb24ndCBhbGxvdyB0aGUgc2Vjb25kIGJ1ZmZlciB3aXRoIG9mZnNldD0wIGFzIGl0J3MgdGhlIGRlY29kZWQKKyAgICogcmV3cml0ZSBvZiB0aGUgZmlyc3QKKyAgICovCisgIGlmIChoYWRfZmlyc3RfYnVmZmVyID09IEZBTFNFICYmIEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpID09IDApCisgICAgaGFkX2ZpcnN0X2J1ZmZlciA9IFRSVUU7CisgIGVsc2UgaWYgKEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpID09IDApCisgICAgcmV0dXJuOworCisgIGdzdF9hZGFwdGVyX3B1c2ggKGFkYXB0ZXIsIGdzdF9idWZmZXJfcmVmIChidWZmZXIpKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZW5jb2RlX2RlY29kZSkKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdEVsZW1lbnQgKmF1ZGlvdGVzdHNyYywgKmlkZW50aXR5MSwgKndhdnBhY2tlbmMsICppZGVudGl0eTIsICp3YXZwYWNrZGVjLAorICAgICAgKmlkZW50aXR5MywgKmZha2VzaW5rOworICBHc3RBZGFwdGVyICpzcmNhZGFwdGVyLCAqc2lua2FkYXB0ZXI7CisgIEdzdEJ1cyAqYnVzOworICBHTWFpbkxvb3AgKmxvb3A7CisgIEdzdEJ1ZmZlciAqaW4sICpvdXQ7CisgIGd1aW50IGJ1c193YXRjaCA9IDA7CisgIEdzdE1hcEluZm8gbWFwOworCisgIHNyY2FkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgIGZhaWxfdW5sZXNzIChzcmNhZGFwdGVyICE9IE5VTEwpOworICBzaW5rYWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKKyAgZmFpbF91bmxlc3MgKHNpbmthZGFwdGVyICE9IE5VTEwpOworCisgIHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIGZhaWxfdW5sZXNzIChwaXBlbGluZSAhPSBOVUxMKTsKKworICBhdWRpb3Rlc3RzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb3Rlc3RzcmMiLCAic3JjIik7CisgIGZhaWxfdW5sZXNzIChhdWRpb3Rlc3RzcmMgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvdGVzdHNyYyksICJ3YXZlIiwgMCwgImZyZXEiLCA0NDAuMCwKKyAgICAgICJudW0tYnVmZmVycyIsIDIwMCwgTlVMTCk7CisKKyAgaWRlbnRpdHkxID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiaWRlbnRpdHkiLCAiaWRlbnRpdHkxIik7CisgIGZhaWxfdW5sZXNzIChpZGVudGl0eTEgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGlkZW50aXR5MSksICJzaWduYWwtaGFuZG9mZnMiLCBUUlVFLCBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoR19PQkpFQ1QgKGlkZW50aXR5MSksICJoYW5kb2ZmIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKGlkZW50aXR5X2hhbmRvZmYpLCBzcmNhZGFwdGVyKTsKKworICB3YXZwYWNrZW5jID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgid2F2cGFja2VuYyIsICJlbmMiKTsKKyAgZmFpbF91bmxlc3MgKHdhdnBhY2tlbmMgIT0gTlVMTCk7CisKKyAgaWRlbnRpdHkyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiaWRlbnRpdHkiLCAiaWRlbnRpdHkyIik7CisgIGZhaWxfdW5sZXNzIChpZGVudGl0eTIgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGlkZW50aXR5MiksICJjaGVjay1pbXBlcmZlY3QtdGltZXN0YW1wIiwgVFJVRSwKKyAgICAgICJjaGVjay1pbXBlcmZlY3Qtb2Zmc2V0IiwgVFJVRSwgTlVMTCk7CisKKyAgd2F2cGFja2RlYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoIndhdnBhY2tkZWMiLCAiZGVjIik7CisgIGZhaWxfdW5sZXNzICh3YXZwYWNrZGVjICE9IE5VTEwpOworCisgIGlkZW50aXR5MyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImlkZW50aXR5IiwgImlkZW50aXR5MyIpOworICBmYWlsX3VubGVzcyAoaWRlbnRpdHkzICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChpZGVudGl0eTMpLCAiY2hlY2staW1wZXJmZWN0LXRpbWVzdGFtcCIsIFRSVUUsCisgICAgICAiY2hlY2staW1wZXJmZWN0LW9mZnNldCIsIFRSVUUsIE5VTEwpOworCisgIGZha2VzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAic2luayIpOworICBmYWlsX3VubGVzcyAoZmFrZXNpbmsgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGZha2VzaW5rKSwgInNpZ25hbC1oYW5kb2ZmcyIsIFRSVUUsIE5VTEwpOworICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAoZmFrZXNpbmspLCAiaGFuZG9mZiIsCisgICAgICBHX0NBTExCQUNLIChmYWtlc2lua19oYW5kb2ZmKSwgc2lua2FkYXB0ZXIpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgYXVkaW90ZXN0c3JjLCBpZGVudGl0eTEsIHdhdnBhY2tlbmMsCisgICAgICBpZGVudGl0eTIsIHdhdnBhY2tkZWMsIGlkZW50aXR5MywgZmFrZXNpbmssIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rX21hbnkgKGF1ZGlvdGVzdHNyYywgaWRlbnRpdHkxLCB3YXZwYWNrZW5jLAorICAgICAgICAgIGlkZW50aXR5Miwgd2F2cGFja2RlYywgaWRlbnRpdHkzLCBmYWtlc2luaywgTlVMTCkpOworCisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIFRSVUUpOworICBmYWlsX3VubGVzcyAobG9vcCAhPSBOVUxMKTsKKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChwaXBlbGluZSk7CisgIGZhaWxfdW5sZXNzIChidXMgIT0gTlVMTCk7CisgIGJ1c193YXRjaCA9IGdzdF9idXNfYWRkX3dhdGNoIChidXMsIGJ1c19oYW5kbGVyLCBsb29wKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKworICBoYWRfZmlyc3RfYnVmZmVyID0gRkFMU0U7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgZ19tYWluX2xvb3BfcnVuIChsb29wKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworCisgIGZhaWxfdW5sZXNzIChoYWRfZmlyc3RfYnVmZmVyID09IFRSVUUpOworICBmYWlsX3VubGVzcyAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChzcmNhZGFwdGVyKSA+IDApOworICBmYWlsX3VubGVzcyAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChzaW5rYWRhcHRlcikgPiAwKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChzcmNhZGFwdGVyKSwKKyAgICAgIGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoc2lua2FkYXB0ZXIpKTsKKworICBpbiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChzcmNhZGFwdGVyLCBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHNyY2FkYXB0ZXIpKTsKKyAgZmFpbF91bmxlc3MgKGluICE9IE5VTEwpOworICBvdXQgPQorICAgICAgZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHNpbmthZGFwdGVyLAorICAgICAgZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChzaW5rYWRhcHRlcikpOworICBmYWlsX3VubGVzcyAob3V0ICE9IE5VTEwpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGluKSwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAob3V0KSk7CisgIGdzdF9idWZmZXJfbWFwIChvdXQsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoaW4sIDAsIG1hcC5kYXRhLCBtYXAuc2l6ZSkgPT0gMCk7CisgIGdzdF9idWZmZXJfdW5tYXAgKG91dCwgJm1hcCk7CisKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoaW4pOworICBnc3RfYnVmZmVyX3VucmVmIChvdXQpOworICBnX29iamVjdF91bnJlZiAocGlwZWxpbmUpOworICBnX21haW5fbG9vcF91bnJlZiAobG9vcCk7CisgIGdfb2JqZWN0X3VucmVmIChzcmNhZGFwdGVyKTsKKyAgZ19vYmplY3RfdW5yZWYgKHNpbmthZGFwdGVyKTsKKyAgZ19zb3VyY2VfcmVtb3ZlIChidXNfd2F0Y2gpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCit3YXZwYWNrX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoIldhdnBhY2siKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgibGluZWFyIik7CisKKyAgLyogdGltZSBvdXQgYWZ0ZXIgNjBzLCBub3QgdGhlIGRlZmF1bHQgMyAqLworICB0Y2FzZV9zZXRfdGltZW91dCAodGNfY2hhaW4sIDYwKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2VuY29kZV9kZWNvZGUpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAod2F2cGFjayk7CmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9NYWtlZmlsZS5hbSBiL3Rlc3RzL2V4YW1wbGVzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOWNlZTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI1IEBACitpZiBVU0VfR1RLMworR1RLX0RJUj1ndGsKK2Vsc2UKK0dUS19ESVI9CitlbmRpZgorCitpZiBVU0VfSkFDSworSkFDS19ESVI9amFjaworZWxzZQorSkFDS19ESVI9CitlbmRpZgorCitpZiBVU0VfQ0FJUk8KK0NBSVJPX0RJUj1jYWlybworZWxzZQorQ0FJUk9fRElSPQorZW5kaWYKKworU1VCRElSUyA9IGF1ZGlvZnggZXF1YWxpemVyICQoR1RLX0RJUikgJChKQUNLX0RJUikgbGV2ZWwgXAorCXJ0cCBzaGFwZXdpcGUgc3BlY3RydW0gdjRsMiAkKENBSVJPX0RJUikKKworRElTVF9TVUJESVJTID0gYXVkaW9meCBlcXVhbGl6ZXIgZ3RrIGphY2sgbGV2ZWwgXAorCXJ0cCBzaGFwZXdpcGUgc3BlY3RydW0gdjRsMiBjYWlybworCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29tbW9uL3BhcmFsbGVsLXN1YmRpcnMubWFrCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9hdWRpb2Z4Ly5naXRpZ25vcmUgYi90ZXN0cy9leGFtcGxlcy9hdWRpb2Z4Ly5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBkNTZkYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL2F1ZGlvZngvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIgQEAKK2ZpcmZpbHRlci1leGFtcGxlCitpaXJmaWx0ZXItZXhhbXBsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvYXVkaW9meC9NYWtlZmlsZS5hbSBiL3Rlc3RzL2V4YW1wbGVzL2F1ZGlvZngvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNjNDJjOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL2F1ZGlvZngvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMCBAQAorbm9pbnN0X1BST0dSQU1TID0gZmlyZmlsdGVyLWV4YW1wbGUgaWlyZmlsdGVyLWV4YW1wbGUKKworIyBGSVhNRSAwLjExOiBpZ25vcmUgR1ZhbHVlQXJyYXkgd2FybmluZ3MgZm9yIG5vdyB1bnRpbCB0aGlzIGlzIHNvcnRlZAorRVJST1JfQ0ZMQUdTPQorCitmaXJmaWx0ZXJfZXhhbXBsZV9DRkxBR1MgPSAkKEdTVF9DRkxBR1MpICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpCitmaXJmaWx0ZXJfZXhhbXBsZV9MREFERCA9ICQoR1NUX0xJQlMpICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGZmdC1AR1NUX0FQSV9WRVJTSU9OQCAkKExJQk0pCisKK2lpcmZpbHRlcl9leGFtcGxlX0NGTEFHUyA9ICQoR1NUX0NGTEFHUykKK2lpcmZpbHRlcl9leGFtcGxlX0xEQUREID0gJChHU1RfTElCUykgJChMSUJNKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvYXVkaW9meC9maXJmaWx0ZXItZXhhbXBsZS5jIGIvdGVzdHMvZXhhbXBsZXMvYXVkaW9meC9maXJmaWx0ZXItZXhhbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYTZjZmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L2ZpcmZpbHRlci1leGFtcGxlLmMKQEAgLTAsMCArMSwxNjUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA5IFNlYmFzdGlhbiBEcm9lZ2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qIFRoaXMgc21hbGwgc2FtcGxlIGFwcGxpY2F0aW9uIGNyZWF0ZXMgYSBiYW5kcGFzcyBGSVIgZmlsdGVyCisgKiBieSB0cmFuc2Zvcm1pbmcgdGhlIGZyZXF1ZW5jeSByZXNwb25zZSB0byB0aGUgZmlsdGVyIGtlcm5lbC4KKyAqLworCisvKiBGSVhNRSAwLjExOiBzdXBwcmVzcyB3YXJuaW5ncyBmb3IgZGVwcmVjYXRlZCBBUEkgc3VjaCBhcyBHVmFsdWVBcnJheQorICogd2l0aCBuZXdlciBHTGliIHZlcnNpb25zICg+PSAyLjMxLjApICovCisjZGVmaW5lIEdMSUJfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9mZnQvZ3N0ZmZ0ZjY0Lmg+CisKK3N0YXRpYyBnYm9vbGVhbgorb25fbWVzc2FnZSAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHTWFpbkxvb3AgKmxvb3AgPSAoR01haW5Mb29wICopIHVzZXJfZGF0YTsKKworICBzd2l0Y2ggKEdTVF9NRVNTQUdFX1RZUEUgKG1lc3NhZ2UpKSB7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FUlJPUjoKKyAgICAgIGdfZXJyb3IgKCJHb3QgRVJST1IiKTsKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9XQVJOSU5HOgorICAgICAgZ193YXJuaW5nICgiR290IFdBUk5JTkciKTsKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FT1M6CisgICAgICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorb25fcmF0ZV9jaGFuZ2VkIChHc3RFbGVtZW50ICogZWxlbWVudCwgZ2ludCByYXRlLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdWYWx1ZUFycmF5ICp2YTsKKyAgR1ZhbHVlIHYgPSB7IDAsIH07CisgIEdzdEZGVEY2NCAqZmZ0OworICBHc3RGRlRGNjRDb21wbGV4IGZyZXF1ZW5jeV9yZXNwb25zZVsxN107CisgIGdkb3VibGUgdG1wWzMyXTsKKyAgZ2RvdWJsZSBmaWx0ZXJfa2VybmVsWzMyXTsKKyAgZ3VpbnQgaTsKKworICAvKiBDcmVhdGUgdGhlIGZyZXF1ZW5jeSByZXNwb25zZTogemVybyBvdXRzaWRlCisgICAqIGEgc21hbGwgZnJlcXVlbmN5IGJhbmQgKi8KKyAgZm9yIChpID0gMDsgaSA8IDE3OyBpKyspIHsKKyAgICBpZiAoaSA8IDUgfHwgaSA+IDExKQorICAgICAgZnJlcXVlbmN5X3Jlc3BvbnNlW2ldLnIgPSAwLjA7CisgICAgZWxzZQorICAgICAgZnJlcXVlbmN5X3Jlc3BvbnNlW2ldLnIgPSAxLjA7CisKKyAgICBmcmVxdWVuY3lfcmVzcG9uc2VbaV0uaSA9IDAuMDsKKyAgfQorCisgIC8qIENhbGN1bGF0ZSB0aGUgaW52ZXJzZSBGVCBvZiB0aGUgZnJlcXVlbmN5IHJlc3BvbnNlICovCisgIGZmdCA9IGdzdF9mZnRfZjY0X25ldyAoMzIsIFRSVUUpOworICBnc3RfZmZ0X2Y2NF9pbnZlcnNlX2ZmdCAoZmZ0LCBmcmVxdWVuY3lfcmVzcG9uc2UsIHRtcCk7CisgIGdzdF9mZnRfZjY0X2ZyZWUgKGZmdCk7CisKKyAgLyogU2hpZnQgdGhlIGludmVyc2UgRlQgb2YgdGhlIGZyZXF1ZW5jeSByZXNwb25zZSBieSAxNiwKKyAgICogaS5lLiB0aGUgaGFsZiBvZiB0aGUga2VybmVsIGxlbmd0aCB0byBnZXQgdGhlCisgICAqIGltcHVsc2UgcmVzcG9uc2UuIFNlZSBodHRwOi8vd3d3LmRzcGd1aWRlLmNvbS9jaDE3LzEuaHRtCisgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisgICAgZmlsdGVyX2tlcm5lbFtpXSA9IHRtcFsoaSArIDE2KSAlIDMyXTsKKworICAvKiBBcHBseSB0aGUgaGFtbWluZyB3aW5kb3cgdG8gdGhlIGltcHVsc2UgcmVzcG9uc2UgdG8gZ2V0CisgICAqIGEgYmV0dGVyIHJlc3VsdCB0aGFuIGdpdmVuIGZyb20gdGhlIHJlY3Rhbmd1bGFyIHdpbmRvdworICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisgICAgZmlsdGVyX2tlcm5lbFtpXSAqPSAoMC41NCAtIDAuNDYgKiBjb3MgKDIgKiBHX1BJICogaSAvIDMyKSk7CisKKyAgdmEgPSBnX3ZhbHVlX2FycmF5X25ldyAoMSk7CisKKyAgZ192YWx1ZV9pbml0ICgmdiwgR19UWVBFX0RPVUJMRSk7CisgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisgICAgZ192YWx1ZV9zZXRfZG91YmxlICgmdiwgZmlsdGVyX2tlcm5lbFtpXSk7CisgICAgZ192YWx1ZV9hcnJheV9hcHBlbmQgKHZhLCAmdik7CisgICAgZ192YWx1ZV9yZXNldCAoJnYpOworICB9CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGVsZW1lbnQpLCAia2VybmVsIiwgdmEsIE5VTEwpOworICAvKiBMYXRlbmN5IGlzIDEvMiBvZiB0aGUga2VybmVsIGxlbmd0aCBmb3IgdGhpcyBtZXRob2Qgb2YKKyAgICogY2FsY3VsYXRpbmcgYSBmaWx0ZXIga2VybmVsIGZyb20gdGhlIGZyZXF1ZW5jeSByZXNwb25zZQorICAgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZWxlbWVudCksICJsYXRlbmN5IiwgKGdpbnQ2NCkgKDMyIC8gMiksIE5VTEwpOworICBnX3ZhbHVlX2FycmF5X2ZyZWUgKHZhKTsKK30KKworZ2ludAorbWFpbiAoZ2ludCBhcmdjLCBnY2hhciAqIGFyZ3ZbXSkKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmUsICpzcmMsICpmaWx0ZXIsICpjb252LCAqc2luazsKKyAgR3N0QnVzICpidXM7CisgIEdNYWluTG9vcCAqbG9vcDsKKworICBnc3RfaW5pdCAoTlVMTCwgTlVMTCk7CisKKyAgcGlwZWxpbmUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJwaXBlbGluZSIsIE5VTEwpOworCisgIHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvdGVzdHNyYyIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzcmMpLCAid2F2ZSIsIDUsIE5VTEwpOworCisgIGZpbHRlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvZmlyZmlsdGVyIiwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChmaWx0ZXIpLCAicmF0ZS1jaGFuZ2VkIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKG9uX3JhdGVfY2hhbmdlZCksIE5VTEwpOworCisgIGNvbnYgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb2NvbnZlcnQiLCBOVUxMKTsKKworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXV0b2F1ZGlvc2luayIsIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc2luayAhPSBOVUxMLCAtMSk7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBzcmMsIGZpbHRlciwgY29udiwgc2luaywgTlVMTCk7CisgIGlmICghZ3N0X2VsZW1lbnRfbGlua19tYW55IChzcmMsIGZpbHRlciwgY29udiwgc2luaywgTlVMTCkpIHsKKyAgICBnX2Vycm9yICgiRmFpbGVkIHRvIGxpbmsgZWxlbWVudHMiKTsKKyAgICByZXR1cm4gLTI7CisgIH0KKworICBsb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisKKyAgYnVzID0gZ3N0X3BpcGVsaW5lX2dldF9idXMgKEdTVF9QSVBFTElORSAocGlwZWxpbmUpKTsKKyAgZ3N0X2J1c19hZGRfc2lnbmFsX3dhdGNoIChidXMpOworICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAoYnVzKSwgIm1lc3NhZ2UiLCBHX0NBTExCQUNLIChvbl9tZXNzYWdlKSwgbG9vcCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1QgKGJ1cykpOworCisgIGlmIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpIHsKKyAgICBnX2Vycm9yICgiRmFpbGVkIHRvIGdvIGludG8gUExBWUlORyBzdGF0ZSIpOworICAgIHJldHVybiAtMzsKKyAgfQorCisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworCisgIGdfbWFpbl9sb29wX3VucmVmIChsb29wKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvYXVkaW9meC9paXJmaWx0ZXItZXhhbXBsZS5jIGIvdGVzdHMvZXhhbXBsZXMvYXVkaW9meC9paXJmaWx0ZXItZXhhbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNTUzZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L2lpcmZpbHRlci1leGFtcGxlLmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA5IFNlYmFzdGlhbiBEcm9lZ2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qIFRoaXMgc21hbGwgc2FtcGxlIGFwcGxpY2F0aW9uIGNyZWF0ZXMgYSBsb3dwYXNzIElJUiBmaWx0ZXIKKyAqIGFuZCBhcHBsaWVzIGl0IHRvIHdoaXRlIG5vaXNlLgorICogU2VlIGh0dHA6Ly93d3cuZHNwZ3VpZGUuY29tL2NoMTkvMi5odG0gZm9yIGEgZGVzY3JpcHRpb24KKyAqIG9mIHRoZSBJSVIgZmlsdGVyIHRoYXQgaXMgdXNlZC4KKyAqLworCisvKiBGSVhNRSAwLjExOiBzdXBwcmVzcyB3YXJuaW5ncyBmb3IgZGVwcmVjYXRlZCBBUEkgc3VjaCBhcyBHVmFsdWVBcnJheQorICogd2l0aCBuZXdlciBHTGliIHZlcnNpb25zICg+PSAyLjMxLjApICovCisjZGVmaW5lIEdMSUJfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisvKiBDdXRvZmYgb2YgNDAwMCBIeiAqLworI2RlZmluZSBDVVRPRkYgKDQwMDAuMCkKKworc3RhdGljIGdib29sZWFuCitvbl9tZXNzYWdlIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdNYWluTG9vcCAqbG9vcCA9IChHTWFpbkxvb3AgKikgdXNlcl9kYXRhOworCisgIHN3aXRjaCAoR1NUX01FU1NBR0VfVFlQRSAobWVzc2FnZSkpIHsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VSUk9SOgorICAgICAgZ19lcnJvciAoIkdvdCBFUlJPUiIpOworICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX1dBUk5JTkc6CisgICAgICBnX3dhcm5pbmcgKCJHb3QgV0FSTklORyIpOworICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VPUzoKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9yYXRlX2NoYW5nZWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBnaW50IHJhdGUsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR1ZhbHVlQXJyYXkgKnZhOworICBHVmFsdWUgdiA9IHsgMCwgfTsKKyAgZ2RvdWJsZSB4OworCisgIGlmIChyYXRlIC8gMi4wID4gQ1VUT0ZGKQorICAgIHggPSBleHAgKC0yLjAgKiBHX1BJICogKENVVE9GRiAvIHJhdGUpKTsKKyAgZWxzZQorICAgIHggPSAwLjA7CisKKyAgdmEgPSBnX3ZhbHVlX2FycmF5X25ldyAoMSk7CisKKyAgZ192YWx1ZV9pbml0ICgmdiwgR19UWVBFX0RPVUJMRSk7CisgIGdfdmFsdWVfc2V0X2RvdWJsZSAoJnYsIDEuMCAtIHgpOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAodmEsICZ2KTsKKyAgZ192YWx1ZV9yZXNldCAoJnYpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChlbGVtZW50KSwgImEiLCB2YSwgTlVMTCk7CisgIGdfdmFsdWVfYXJyYXlfZnJlZSAodmEpOworCisgIHZhID0gZ192YWx1ZV9hcnJheV9uZXcgKDEpOworICBnX3ZhbHVlX3NldF9kb3VibGUgKCZ2LCB4KTsKKyAgZ192YWx1ZV9hcnJheV9hcHBlbmQgKHZhLCAmdik7CisgIGdfdmFsdWVfcmVzZXQgKCZ2KTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZWxlbWVudCksICJiIiwgdmEsIE5VTEwpOworICBnX3ZhbHVlX2FycmF5X2ZyZWUgKHZhKTsKK30KKworZ2ludAorbWFpbiAoZ2ludCBhcmdjLCBnY2hhciAqIGFyZ3ZbXSkKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmUsICpzcmMsICpmaWx0ZXIsICpjb252LCAqc2luazsKKyAgR3N0QnVzICpidXM7CisgIEdNYWluTG9vcCAqbG9vcDsKKworICBnc3RfaW5pdCAoTlVMTCwgTlVMTCk7CisKKyAgcGlwZWxpbmUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJwaXBlbGluZSIsIE5VTEwpOworCisgIHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvdGVzdHNyYyIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzcmMpLCAid2F2ZSIsIDUsIE5VTEwpOworCisgIGZpbHRlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvaWlyZmlsdGVyIiwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChmaWx0ZXIpLCAicmF0ZS1jaGFuZ2VkIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKG9uX3JhdGVfY2hhbmdlZCksIE5VTEwpOworCisgIGNvbnYgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb2NvbnZlcnQiLCBOVUxMKTsKKworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXV0b2F1ZGlvc2luayIsIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc2luayAhPSBOVUxMLCAtMSk7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBzcmMsIGZpbHRlciwgY29udiwgc2luaywgTlVMTCk7CisgIGlmICghZ3N0X2VsZW1lbnRfbGlua19tYW55IChzcmMsIGZpbHRlciwgY29udiwgc2luaywgTlVMTCkpIHsKKyAgICBnX2Vycm9yICgiRmFpbGVkIHRvIGxpbmsgZWxlbWVudHMiKTsKKyAgICByZXR1cm4gLTI7CisgIH0KKworICBsb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisKKyAgYnVzID0gZ3N0X3BpcGVsaW5lX2dldF9idXMgKEdTVF9QSVBFTElORSAocGlwZWxpbmUpKTsKKyAgZ3N0X2J1c19hZGRfc2lnbmFsX3dhdGNoIChidXMpOworICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAoYnVzKSwgIm1lc3NhZ2UiLCBHX0NBTExCQUNLIChvbl9tZXNzYWdlKSwgbG9vcCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1QgKGJ1cykpOworCisgIGlmIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpIHsKKyAgICBnX2Vycm9yICgiRmFpbGVkIHRvIGdvIGludG8gUExBWUlORyBzdGF0ZSIpOworICAgIHJldHVybiAtMzsKKyAgfQorCisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworCisgIGdfbWFpbl9sb29wX3VucmVmIChsb29wKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvYXVkaW9meC9tZXNvbi5idWlsZCBiL3Rlc3RzL2V4YW1wbGVzL2F1ZGlvZngvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlMjZlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL2F1ZGlvZngvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxMiBAQAorZXhlY3V0YWJsZSgnZmlyZmlsdGVyLWV4YW1wbGUnLCAnZmlyZmlsdGVyLWV4YW1wbGUuYycsCisgIGRlcGVuZGVuY2llczogW2dzdGZmdF9kZXAsIGdzdF9kZXAsIGxpYm1dLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgaW5zdGFsbDogZmFsc2UpCisKK2V4ZWN1dGFibGUoJ2lpcmZpbHRlci1leGFtcGxlJywgJ2lpcmZpbHRlci1leGFtcGxlLmMnLAorICBkZXBlbmRlbmNpZXM6IFtnc3RfZGVwLCBsaWJtXSwKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgIGluc3RhbGw6IGZhbHNlKQorCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9jYWlyby8uZ2l0aWdub3JlIGIvdGVzdHMvZXhhbXBsZXMvY2Fpcm8vLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTA1ODVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvY2Fpcm8vLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACitjYWlyb19vdmVybGF5CmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9jYWlyby9NYWtlZmlsZS5hbSBiL3Rlc3RzL2V4YW1wbGVzL2NhaXJvL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlODMzY2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9jYWlyby9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDUgQEAKK25vaW5zdF9QUk9HUkFNUyA9IGNhaXJvX292ZXJsYXkKKworY2Fpcm9fb3ZlcmxheV9TT1VSQ0VTID0gY2Fpcm9fb3ZlcmxheS5jCitjYWlyb19vdmVybGF5X0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykgJChDQUlST19DRkxBR1MpCitjYWlyb19vdmVybGF5X0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0dmlkZW8tJChHU1RfQVBJX1ZFUlNJT04pICQoR1NUX0xJQlMpICQoQ0FJUk9fTElCUykKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL2NhaXJvL2NhaXJvX292ZXJsYXkuYyBiL3Rlc3RzL2V4YW1wbGVzL2NhaXJvL2NhaXJvX292ZXJsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTlmNzFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvY2Fpcm8vY2Fpcm9fb3ZlcmxheS5jCkBAIC0wLDAgKzEsMTgyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMSBKb24gTm9yZGJ5IDxqb25vbm9yQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKgorICogRXhhbXBsZSBzaG93aW5nIHVzYWdlIG9mIHRoZSBjYWlyb292ZXJsYXkgZWxlbWVudAorICovCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpbmNsdWRlIDxjYWlyby5oPgorI2luY2x1ZGUgPGNhaXJvLWdvYmplY3QuaD4KKworI2luY2x1ZGUgPGdsaWIuaD4KKworCitzdGF0aWMgZ2Jvb2xlYW4KK29uX21lc3NhZ2UgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR01haW5Mb29wICpsb29wID0gKEdNYWluTG9vcCAqKSB1c2VyX2RhdGE7CisKKyAgc3dpdGNoIChHU1RfTUVTU0FHRV9UWVBFIChtZXNzYWdlKSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfRVJST1I6eworICAgICAgR0Vycm9yICplcnIgPSBOVUxMOworICAgICAgZ2NoYXIgKmRlYnVnOworCisgICAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobWVzc2FnZSwgJmVyciwgJmRlYnVnKTsKKyAgICAgIGdfY3JpdGljYWwgKCJHb3QgRVJST1I6ICVzICglcykiLCBlcnItPm1lc3NhZ2UsIEdTVF9TVFJfTlVMTCAoZGVidWcpKTsKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX01FU1NBR0VfV0FSTklORzp7CisgICAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisgICAgICBnY2hhciAqZGVidWc7CisKKyAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX3dhcm5pbmcgKG1lc3NhZ2UsICZlcnIsICZkZWJ1Zyk7CisgICAgICBnX3dhcm5pbmcgKCJHb3QgV0FSTklORzogJXMgKCVzKSIsIGVyci0+bWVzc2FnZSwgR1NUX1NUUl9OVUxMIChkZWJ1ZykpOworICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FT1M6CisgICAgICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBEYXRhc3RydWN0dXJlIHRvIHNoYXJlIHRoZSBzdGF0ZSB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBiZXR3ZWVuCisgKiBwcmVwYXJlIGFuZCByZW5kZXIgZnVuY3Rpb24uICovCit0eXBlZGVmIHN0cnVjdAoreworICBnYm9vbGVhbiB2YWxpZDsKKyAgR3N0VmlkZW9JbmZvIHZpbmZvOworfSBDYWlyb092ZXJsYXlTdGF0ZTsKKworLyogU3RvcmUgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGNhcHMgdGhhdCB3ZSBhcmUgaW50ZXJlc3RlZCBpbi4gKi8KK3N0YXRpYyB2b2lkCitwcmVwYXJlX292ZXJsYXkgKEdzdEVsZW1lbnQgKiBvdmVybGF5LCBHc3RDYXBzICogY2FwcywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBDYWlyb092ZXJsYXlTdGF0ZSAqc3RhdGUgPSAoQ2Fpcm9PdmVybGF5U3RhdGUgKikgdXNlcl9kYXRhOworCisgIHN0YXRlLT52YWxpZCA9IGdzdF92aWRlb19pbmZvX2Zyb21fY2FwcyAoJnN0YXRlLT52aW5mbywgY2Fwcyk7Cit9CisKKy8qIERyYXcgdGhlIG92ZXJsYXkuIAorICogVGhpcyBmdW5jdGlvbiBkcmF3cyBhIGN1dGUgImJlYXRpbmciIGhlYXJ0LiAqLworc3RhdGljIHZvaWQKK2RyYXdfb3ZlcmxheSAoR3N0RWxlbWVudCAqIG92ZXJsYXksIGNhaXJvX3QgKiBjciwgZ3VpbnQ2NCB0aW1lc3RhbXAsCisgICAgZ3VpbnQ2NCBkdXJhdGlvbiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBDYWlyb092ZXJsYXlTdGF0ZSAqcyA9IChDYWlyb092ZXJsYXlTdGF0ZSAqKSB1c2VyX2RhdGE7CisgIGRvdWJsZSBzY2FsZTsKKyAgaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgaWYgKCFzLT52YWxpZCkKKyAgICByZXR1cm47CisKKyAgd2lkdGggPSBHU1RfVklERU9fSU5GT19XSURUSCAoJnMtPnZpbmZvKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUICgmcy0+dmluZm8pOworCisgIHNjYWxlID0gMiAqICgoKHRpbWVzdGFtcCAvIChpbnQpIDFlNykgJSA3MCkgKyAzMCkgLyAxMDAuMDsKKyAgY2Fpcm9fdHJhbnNsYXRlIChjciwgd2lkdGggLyAyLCAoaGVpZ2h0IC8gMikgLSAzMCk7CisKKyAgLyogRklYTUU6IHRoaXMgYXNzdW1lcyBhIHBpeGVsLWFzcGVjdC1yYXRpbyBvZiAxLzEgKi8KKyAgY2Fpcm9fc2NhbGUgKGNyLCBzY2FsZSwgc2NhbGUpOworCisgIGNhaXJvX21vdmVfdG8gKGNyLCAwLCAwKTsKKyAgY2Fpcm9fY3VydmVfdG8gKGNyLCAwLCAtMzAsIC01MCwgLTMwLCAtNTAsIDApOworICBjYWlyb19jdXJ2ZV90byAoY3IsIC01MCwgMzAsIDAsIDM1LCAwLCA2MCk7CisgIGNhaXJvX2N1cnZlX3RvIChjciwgMCwgMzUsIDUwLCAzMCwgNTAsIDApOworICBjYWlyb19jdXJ2ZV90byAoY3IsIDUwLCAtMzAsIDAsIC0zMCwgMCwgMCk7CisgIGNhaXJvX3NldF9zb3VyY2VfcmdiYSAoY3IsIDAuOSwgMC4wLCAwLjEsIDAuNyk7CisgIGNhaXJvX2ZpbGwgKGNyKTsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfZ3N0X3BpcGVsaW5lIChDYWlyb092ZXJsYXlTdGF0ZSAqIG92ZXJsYXlfc3RhdGUpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RFbGVtZW50ICpjYWlyb19vdmVybGF5OworICBHc3RFbGVtZW50ICpzb3VyY2UsICphZGFwdG9yMSwgKmFkYXB0b3IyLCAqc2luazsKKworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKCJjYWlyby1vdmVybGF5LWV4YW1wbGUiKTsKKworICAvKiBBZGFwdG9ycyBuZWVkZWQgYmVjYXVzZSBjYWlyb292ZXJsYXkgb25seSBzdXBwb3J0cyBBUkdCIGRhdGEgKi8KKyAgc291cmNlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgInNvdXJjZSIpOworICBhZGFwdG9yMSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvY29udmVydCIsICJhZGFwdG9yMSIpOworICBjYWlyb19vdmVybGF5ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiY2Fpcm9vdmVybGF5IiwgIm92ZXJsYXkiKTsKKyAgYWRhcHRvcjIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb2NvbnZlcnQiLCAiYWRhcHRvcjIiKTsKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInhpbWFnZXNpbmsiLCAic2luayIpOworICBpZiAoc2luayA9PSBOVUxMKQorICAgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdXRvdmlkZW9zaW5rIiwgInNpbmsiKTsKKworICAvKiBJZiBmYWlsaW5nLCB0aGUgZWxlbWVudCBjb3VsZCBub3QgYmUgY3JlYXRlZCAqLworICBnX2Fzc2VydCAoY2Fpcm9fb3ZlcmxheSk7CisKKyAgLyogSG9vayB1cCB0aGUgbmVjY2VzYXJ5IHNpZ25hbHMgZm9yIGNhaXJvb3ZlcmxheSAqLworICBnX3NpZ25hbF9jb25uZWN0IChjYWlyb19vdmVybGF5LCAiZHJhdyIsCisgICAgICBHX0NBTExCQUNLIChkcmF3X292ZXJsYXkpLCBvdmVybGF5X3N0YXRlKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoY2Fpcm9fb3ZlcmxheSwgImNhcHMtY2hhbmdlZCIsCisgICAgICBHX0NBTExCQUNLIChwcmVwYXJlX292ZXJsYXkpLCBvdmVybGF5X3N0YXRlKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHNvdXJjZSwgYWRhcHRvcjEsCisgICAgICBjYWlyb19vdmVybGF5LCBhZGFwdG9yMiwgc2luaywgTlVMTCk7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rX21hbnkgKHNvdXJjZSwgYWRhcHRvcjEsCisgICAgICAgICAgY2Fpcm9fb3ZlcmxheSwgYWRhcHRvcjIsIHNpbmssIE5VTEwpKSB7CisgICAgZ193YXJuaW5nICgiRmFpbGVkIHRvIGxpbmsgZWxlbWVudHMhIik7CisgIH0KKworICByZXR1cm4gcGlwZWxpbmU7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBHTWFpbkxvb3AgKmxvb3A7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RCdXMgKmJ1czsKKyAgQ2Fpcm9PdmVybGF5U3RhdGUgKm92ZXJsYXlfc3RhdGU7CisKKyAgZ3N0X2luaXQgKCZhcmdjLCAmYXJndik7CisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIEZBTFNFKTsKKworICAvKiBhbGxvY2F0ZSBvbiBoZWFwIGZvciBwZWRhZ29naWNhbCByZWFzb25zLCBtYWtlcyBjb2RlIGVhc2llciB0byB0cmFuc2ZlciAqLworICBvdmVybGF5X3N0YXRlID0gZ19uZXcwIChDYWlyb092ZXJsYXlTdGF0ZSwgMSk7CisKKyAgcGlwZWxpbmUgPSBzZXR1cF9nc3RfcGlwZWxpbmUgKG92ZXJsYXlfc3RhdGUpOworCisgIGJ1cyA9IGdzdF9waXBlbGluZV9nZXRfYnVzIChHU1RfUElQRUxJTkUgKHBpcGVsaW5lKSk7CisgIGdzdF9idXNfYWRkX3NpZ25hbF93YXRjaCAoYnVzKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoR19PQkpFQ1QgKGJ1cyksICJtZXNzYWdlIiwgR19DQUxMQkFDSyAob25fbWVzc2FnZSksIGxvb3ApOworICBnc3Rfb2JqZWN0X3VucmVmIChHU1RfT0JKRUNUIChidXMpKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisKKyAgZ19mcmVlIChvdmVybGF5X3N0YXRlKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9jYWlyby9tZXNvbi5idWlsZCBiL3Rlc3RzL2V4YW1wbGVzL2NhaXJvL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOGQyYzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9jYWlyby9tZXNvbi5idWlsZApAQCAtMCwwICsxLDcgQEAKK2lmIGNhaXJvX2RlcC5mb3VuZCgpCisgIGV4ZWN1dGFibGUoJ2NhaXJvX292ZXJsYXknLCAnY2Fpcm9fb3ZlcmxheS5jJywKKyAgICBkZXBlbmRlbmNpZXM6IFtnc3R2aWRlb19kZXAsIGdzdF9kZXAsIGNhaXJvX2RlcCwgbGlibV0sCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgICBpbnN0YWxsOiBmYWxzZSkKK2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvLmdpdGlnbm9yZSBiL3Rlc3RzL2V4YW1wbGVzL2VxdWFsaXplci8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NDliNjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACitkZW1vCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvTWFrZWZpbGUuYW0gYi90ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdmMmIyNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL2VxdWFsaXplci9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDggQEAKK2lmIEhBVkVfR1RLCitub2luc3RfUFJPR1JBTVMgPSBkZW1vCitlbmRpZgorCitkZW1vX1NPVVJDRVMgPSBkZW1vLmMKK2RlbW9fQ0ZMQUdTICA9ICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpICQoR1RLX0NGTEFHUykKK2RlbW9fTERBREQgPSAkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoR1RLX0xJQlMpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL2VxdWFsaXplci9kZW1vLmMgYi90ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMDAwZTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jCkBAIC0wLDAgKzEsMzI3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyogVE9ETzogV2UgdXNlIGdka19jYWlyb19jcmVhdGUoKSBhbmQgb3RoZXJzLCB3aGljaCBhcmUgZGVwcmVjYXRlZCAqLworI2RlZmluZSBHREtfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxndGsvZ3RrLmg+CisKKyNkZWZpbmUgTkJBTkRTIDEwCisKK3N0YXRpYyBHdGtXaWRnZXQgKmRyYXdpbmdhcmVhID0gTlVMTDsKK3N0YXRpYyBndWludCBzcGVjdF9oZWlnaHQgPSAxMjg7CitzdGF0aWMgZ3VpbnQgc3BlY3RfYmFuZHMgPSAyNTY7CitzdGF0aWMgZ2Zsb2F0IGhlaWdodF9zY2FsZSA9IDIuMDsKKworc3RhdGljIHZvaWQKK29uX3dpbmRvd19kZXN0cm95IChHT2JqZWN0ICogb2JqZWN0LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGRyYXdpbmdhcmVhID0gTlVMTDsKKyAgZ3RrX21haW5fcXVpdCAoKTsKK30KKworc3RhdGljIGdib29sZWFuCitvbl9jb25maWd1cmVfZXZlbnQgKEd0a1dpZGdldCAqIHdpZGdldCwgR2RrRXZlbnRDb25maWd1cmUgKiBldmVudCwKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdEVsZW1lbnQgKnNwZWN0cnVtID0gR1NUX0VMRU1FTlQgKHVzZXJfZGF0YSk7CisKKyAgLypHU1RfSU5GTyAoIiVkIHggJWQiLCBldmVudC0+d2lkdGgsIGV2ZW50LT5oZWlnaHQpOyAqLworICBzcGVjdF9oZWlnaHQgPSBldmVudC0+aGVpZ2h0OworICBoZWlnaHRfc2NhbGUgPSBldmVudC0+aGVpZ2h0IC8gNjQuMDsKKyAgc3BlY3RfYmFuZHMgPSBldmVudC0+d2lkdGg7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc3BlY3RydW0pLCAiYmFuZHMiLCBzcGVjdF9iYW5kcywgTlVMTCk7CisgIHJldHVybiBGQUxTRTsKK30KKworLyogY29udHJvbCBnYWlucyAqLworc3RhdGljIHZvaWQKK29uX2dhaW5fY2hhbmdlZCAoR3RrUmFuZ2UgKiByYW5nZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RPYmplY3QgKmJhbmQgPSBHU1RfT0JKRUNUICh1c2VyX2RhdGEpOworICBnZG91YmxlIHZhbHVlID0gZ3RrX3JhbmdlX2dldF92YWx1ZSAocmFuZ2UpOworCisgIGdfb2JqZWN0X3NldCAoYmFuZCwgImdhaW4iLCB2YWx1ZSwgTlVMTCk7Cit9CisKKy8qIGNvbnRyb2wgYmFuZHdpZHRocyAqLworc3RhdGljIHZvaWQKK29uX2JhbmR3aWR0aF9jaGFuZ2VkIChHdGtSYW5nZSAqIHJhbmdlLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdE9iamVjdCAqYmFuZCA9IEdTVF9PQkpFQ1QgKHVzZXJfZGF0YSk7CisgIGdkb3VibGUgdmFsdWUgPSBndGtfcmFuZ2VfZ2V0X3ZhbHVlIChyYW5nZSk7CisKKyAgZ19vYmplY3Rfc2V0IChiYW5kLCAiYmFuZHdpZHRoIiwgdmFsdWUsIE5VTEwpOworfQorCisvKiBjb250cm9sIGZyZXF1ZW5jeSAqLworc3RhdGljIHZvaWQKK29uX2ZyZXFfY2hhbmdlZCAoR3RrUmFuZ2UgKiByYW5nZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RPYmplY3QgKmJhbmQgPSBHU1RfT0JKRUNUICh1c2VyX2RhdGEpOworICBnZG91YmxlIHZhbHVlID0gZ3RrX3JhbmdlX2dldF92YWx1ZSAocmFuZ2UpOworCisgIC8qIGhib3ggKi8KKyAgR3RrV2lkZ2V0ICpwYXJlbnQgPSBndGtfd2lkZ2V0X2dldF9wYXJlbnQgKEdUS19XSURHRVQgKHJhbmdlKSk7CisKKyAgLyogZnJhbWUgKi8KKyAgR3RrV2lkZ2V0ICpwYXJlbnRfcGFyZW50ID0gZ3RrX3dpZGdldF9nZXRfcGFyZW50IChwYXJlbnQpOworICBnY2hhciAqbGFiZWwgPSBnX3N0cmR1cF9wcmludGYgKCIlZCBIeiIsIChpbnQpICh2YWx1ZSArIDAuNSkpOworCisgIGd0a19mcmFtZV9zZXRfbGFiZWwgKEdUS19GUkFNRSAocGFyZW50X3BhcmVudCksIGxhYmVsKTsKKyAgZ19mcmVlIChsYWJlbCk7CisKKyAgZ19vYmplY3Rfc2V0IChiYW5kLCAiZnJlcSIsIHZhbHVlLCBOVUxMKTsKK30KKworLyogZHJhdyBmcmVxdWVuY3kgc3BlY3RydW0gYXMgYSBidW5jaCBvZiBiYXJzICovCitzdGF0aWMgdm9pZAorZHJhd19zcGVjdHJ1bSAoZ2Zsb2F0ICogZGF0YSkKK3sKKyAgZ2ludCBpOworICBHZGtSZWN0YW5nbGUgcmVjdCA9IHsgMCwgMCwgc3BlY3RfYmFuZHMsIHNwZWN0X2hlaWdodCB9OworICBjYWlyb190ICpjcjsKKworICBpZiAoIWRyYXdpbmdhcmVhKQorICAgIHJldHVybjsKKworICBnZGtfd2luZG93X2JlZ2luX3BhaW50X3JlY3QgKGd0a193aWRnZXRfZ2V0X3dpbmRvdyAoZHJhd2luZ2FyZWEpLCAmcmVjdCk7CisgIGNyID0gZ2RrX2NhaXJvX2NyZWF0ZSAoZ3RrX3dpZGdldF9nZXRfd2luZG93IChkcmF3aW5nYXJlYSkpOworCisgIGNhaXJvX3NldF9zb3VyY2VfcmdiIChjciwgMCwgMCwgMCk7CisgIGNhaXJvX3JlY3RhbmdsZSAoY3IsIDAsIDAsIHNwZWN0X2JhbmRzLCBzcGVjdF9oZWlnaHQpOworICBjYWlyb19maWxsIChjcik7CisgIGZvciAoaSA9IDA7IGkgPCBzcGVjdF9iYW5kczsgaSsrKSB7CisgICAgY2Fpcm9fc2V0X3NvdXJjZV9yZ2IgKGNyLCAxLCAxLCAxKTsKKyAgICBjYWlyb19yZWN0YW5nbGUgKGNyLCBpLCAtZGF0YVtpXSwgMSwgc3BlY3RfaGVpZ2h0ICsgZGF0YVtpXSk7CisgICAgY2Fpcm9fZmlsbCAoY3IpOworICB9CisgIGNhaXJvX2Rlc3Ryb3kgKGNyKTsKKworICBnZGtfd2luZG93X2VuZF9wYWludCAoZ3RrX3dpZGdldF9nZXRfd2luZG93IChkcmF3aW5nYXJlYSkpOworfQorCitzdGF0aWMgdm9pZAorZHluYW1pY19saW5rIChHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLCBHc3RQYWQgKiBuZXdwYWQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0UGFkICp0YXJnZXQgPSBHU1RfUEFEICh1c2VyX2RhdGEpOworCisgIGdzdF9wYWRfbGluayAobmV3cGFkLCB0YXJnZXQpOworICBnc3Rfb2JqZWN0X3VucmVmICh0YXJnZXQpOworfQorCisvKiByZWNlaXZlIHNwZWN0cmFsIGRhdGEgZnJvbSBlbGVtZW50IG1lc3NhZ2UgKi8KK3N0YXRpYyBnYm9vbGVhbgorbWVzc2FnZV9oYW5kbGVyIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBncG9pbnRlciBkYXRhKQoreworICBpZiAobWVzc2FnZS0+dHlwZSA9PSBHU1RfTUVTU0FHRV9FTEVNRU5UKSB7CisgICAgY29uc3QgR3N0U3RydWN0dXJlICpzID0gZ3N0X21lc3NhZ2VfZ2V0X3N0cnVjdHVyZSAobWVzc2FnZSk7CisgICAgY29uc3QgZ2NoYXIgKm5hbWUgPSBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzKTsKKworICAgIGlmIChzdHJjbXAgKG5hbWUsICJzcGVjdHJ1bSIpID09IDApIHsKKyAgICAgIGdmbG9hdCAqc3BlY3QgPSBnX25ldyAoZ2Zsb2F0LCBzcGVjdF9iYW5kcyk7CisgICAgICBjb25zdCBHVmFsdWUgKmxpc3Q7CisgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlOworICAgICAgZ3VpbnQgaTsKKworICAgICAgbGlzdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAibWFnbml0dWRlIik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc3BlY3RfYmFuZHM7ICsraSkgeworICAgICAgICB2YWx1ZSA9IGdzdF92YWx1ZV9saXN0X2dldF92YWx1ZSAobGlzdCwgaSk7CisgICAgICAgIHNwZWN0W2ldID0gaGVpZ2h0X3NjYWxlICogZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGRyYXdfc3BlY3RydW0gKHNwZWN0KTsKKyAgICAgIGdfZnJlZSAoc3BlY3QpOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBHc3RFbGVtZW50ICpiaW47CisgIEdzdEVsZW1lbnQgKmRlY29kZWJpbiwgKmRlY2NvbnZlcnQ7CisgIEdzdEVsZW1lbnQgKmNhcHNmaWx0ZXIsICplcXVhbGl6ZXIsICpzcGVjdHJ1bSwgKnNpbmtjb252ZXJ0LCAqc2luazsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0QnVzICpidXM7CisgIEd0a1dpZGdldCAqYXBwd2luZG93LCAqdmJveCwgKmhib3gsICpzY2FsZTsKKyAgaW50IGksIG51bV9iYW5kcyA9IE5CQU5EUzsKKworICBHT3B0aW9uRW50cnkgb3B0aW9uc1tdID0geworICAgIHsiYmFuZHMiLCAnYicsIDAsIEdfT1BUSU9OX0FSR19JTlQsICZudW1fYmFuZHMsCisgICAgICAgICJOdW1iZXIgb2YgYmFuZHMiLCBOVUxMfSwKKyAgICB7TlVMTH0KKyAgfTsKKyAgR09wdGlvbkNvbnRleHQgKmN0eDsKKyAgR0Vycm9yICplcnIgPSBOVUxMOworCisgIGN0eCA9IGdfb3B0aW9uX2NvbnRleHRfbmV3ICgiLSBkZW1vIG9mIGF1ZGlvIGVxdWFsaXplciIpOworICBnX29wdGlvbl9jb250ZXh0X2FkZF9tYWluX2VudHJpZXMgKGN0eCwgb3B0aW9ucywgTlVMTCk7CisgIGdfb3B0aW9uX2NvbnRleHRfYWRkX2dyb3VwIChjdHgsIGdzdF9pbml0X2dldF9vcHRpb25fZ3JvdXAgKCkpOworICBnX29wdGlvbl9jb250ZXh0X2FkZF9ncm91cCAoY3R4LCBndGtfZ2V0X29wdGlvbl9ncm91cCAoVFJVRSkpOworCisgIGlmICghZ19vcHRpb25fY29udGV4dF9wYXJzZSAoY3R4LCAmYXJnYywgJmFyZ3YsICZlcnIpKSB7CisgICAgZ19wcmludCAoIkVycm9yIGluaXRpYWxpemluZzogJXNcbiIsIGVyci0+bWVzc2FnZSk7CisgICAgZ19vcHRpb25fY29udGV4dF9mcmVlIChjdHgpOworICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgIGV4aXQgKDEpOworICB9CisgIGdfb3B0aW9uX2NvbnRleHRfZnJlZSAoY3R4KTsKKworICBpZiAoYXJnYyA8IDIpIHsKKyAgICBnX3ByaW50ICgiVXNhZ2U6ICVzIDx1cmkgdG8gcGxheT5cbiIsIGFyZ3ZbMF0pOworICAgIGdfcHJpbnQgKCIgICAgRm9yIG9wdGlvbmFsIGFyZ3VtZW50czogLS1oZWxwXG4iKTsKKyAgICBleGl0ICgtMSk7CisgIH0KKworICBnc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKyAgZ3RrX2luaXQgKCZhcmdjLCAmYXJndik7CisKKyAgYmluID0gZ3N0X3BpcGVsaW5lX25ldyAoImJpbiIpOworCisgIC8qIFVyaSBkZWNvZGluZyAqLworICBkZWNvZGViaW4gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1cmlkZWNvZGViaW4iLCAiZGVjb2RlciIpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChkZWNvZGViaW4pLCAidXJpIiwgYXJndlsxXSwgTlVMTCk7CisKKyAgLyogRm9yY2UgZmxvYXQzMiBzYW1wbGVzICovCisgIGRlY2NvbnZlcnQgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb2NvbnZlcnQiLCAiZGVjY29udmVydCIpOworICBjYXBzZmlsdGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiY2Fwc2ZpbHRlciIsICJjYXBzZmlsdGVyIik7CisgIGNhcHMgPQorICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcmF3IiwgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJGMzJMRSIsCisgICAgICBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChjYXBzZmlsdGVyLCAiY2FwcyIsIGNhcHMsIE5VTEwpOworCisgIGVxdWFsaXplciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImVxdWFsaXplci1uYmFuZHMiLCAiZXF1YWxpemVyIik7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGVxdWFsaXplciksICJudW0tYmFuZHMiLCBudW1fYmFuZHMsIE5VTEwpOworCisgIHNwZWN0cnVtID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgic3BlY3RydW0iLCAic3BlY3RydW0iKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc3BlY3RydW0pLCAiYmFuZHMiLCBzcGVjdF9iYW5kcywgInRocmVzaG9sZCIsIC04MCwKKyAgICAgICJwb3N0LW1lc3NhZ2VzIiwgVFJVRSwgImludGVydmFsIiwgNTAwICogR1NUX01TRUNPTkQsIE5VTEwpOworCisgIHNpbmtjb252ZXJ0ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW9jb252ZXJ0IiwgInNpbmtjb252ZXJ0Iik7CisKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1dG9hdWRpb3NpbmsiLCAic2luayIpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKGJpbiksIGRlY29kZWJpbiwgZGVjY29udmVydCwgY2Fwc2ZpbHRlciwgZXF1YWxpemVyLAorICAgICAgc3BlY3RydW0sIHNpbmtjb252ZXJ0LCBzaW5rLCBOVUxMKTsKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rX21hbnkgKGRlY2NvbnZlcnQsIGNhcHNmaWx0ZXIsIGVxdWFsaXplciwgc3BlY3RydW0sCisgICAgICAgICAgc2lua2NvbnZlcnQsIHNpbmssIE5VTEwpKSB7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiY2FuJ3QgbGluayBlbGVtZW50c1xuIik7CisgICAgZXhpdCAoMSk7CisgIH0KKworICAvKiBIYW5kbGUgZHluYW1pYyBwYWRzICovCisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChkZWNvZGViaW4pLCAicGFkLWFkZGVkIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKGR5bmFtaWNfbGluayksIGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChkZWNjb252ZXJ0LAorICAgICAgICAgICJzaW5rIikpOworCisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKGJpbik7CisgIGdzdF9idXNfYWRkX3dhdGNoIChidXMsIG1lc3NhZ2VfaGFuZGxlciwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgYXBwd2luZG93ID0gZ3RrX3dpbmRvd19uZXcgKEdUS19XSU5ET1dfVE9QTEVWRUwpOworICBndGtfd2luZG93X3NldF90aXRsZSAoR1RLX1dJTkRPVyAoYXBwd2luZG93KSwgIkVxdWFsaXplciBEZW1vIik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChhcHB3aW5kb3cpLCAiZGVzdHJveSIsCisgICAgICBHX0NBTExCQUNLIChvbl93aW5kb3dfZGVzdHJveSksIE5VTEwpOworICB2Ym94ID0gZ3RrX2JveF9uZXcgKEdUS19PUklFTlRBVElPTl9WRVJUSUNBTCwgNik7CisKKyAgZHJhd2luZ2FyZWEgPSBndGtfZHJhd2luZ19hcmVhX25ldyAoKTsKKyAgZ3RrX3dpZGdldF9zZXRfc2l6ZV9yZXF1ZXN0IChkcmF3aW5nYXJlYSwgc3BlY3RfYmFuZHMsIHNwZWN0X2hlaWdodCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChkcmF3aW5nYXJlYSksICJjb25maWd1cmUtZXZlbnQiLAorICAgICAgR19DQUxMQkFDSyAob25fY29uZmlndXJlX2V2ZW50KSwgKGdwb2ludGVyKSBzcGVjdHJ1bSk7CisgIGd0a19ib3hfcGFja19zdGFydCAoR1RLX0JPWCAodmJveCksIGRyYXdpbmdhcmVhLCBUUlVFLCBUUlVFLCAwKTsKKworICBoYm94ID0gZ3RrX2JveF9uZXcgKEdUS19PUklFTlRBVElPTl9IT1JJWk9OVEFMLCAyMCk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9iYW5kczsgaSsrKSB7CisgICAgR09iamVjdCAqYmFuZDsKKyAgICBnZG91YmxlIGZyZXE7CisgICAgZ2RvdWJsZSBidzsKKyAgICBnZG91YmxlIGdhaW47CisgICAgZ2NoYXIgKmxhYmVsOworICAgIEd0a1dpZGdldCAqZnJhbWUsICpzY2FsZXNfaGJveDsKKworICAgIGJhbmQgPSBnc3RfY2hpbGRfcHJveHlfZ2V0X2NoaWxkX2J5X2luZGV4IChHU1RfQ0hJTERfUFJPWFkgKGVxdWFsaXplciksIGkpOworICAgIGdfYXNzZXJ0IChiYW5kICE9IE5VTEwpOworICAgIGdfb2JqZWN0X2dldCAoYmFuZCwgImZyZXEiLCAmZnJlcSwgTlVMTCk7CisgICAgZ19vYmplY3RfZ2V0IChiYW5kLCAiYmFuZHdpZHRoIiwgJmJ3LCBOVUxMKTsKKyAgICBnX29iamVjdF9nZXQgKGJhbmQsICJnYWluIiwgJmdhaW4sIE5VTEwpOworCisgICAgbGFiZWwgPSBnX3N0cmR1cF9wcmludGYgKCIlZCBIeiIsIChpbnQpIChmcmVxICsgMC41KSk7CisgICAgZnJhbWUgPSBndGtfZnJhbWVfbmV3IChsYWJlbCk7CisgICAgZ19mcmVlIChsYWJlbCk7CisKKyAgICBzY2FsZXNfaGJveCA9IGd0a19ib3hfbmV3IChHVEtfT1JJRU5UQVRJT05fSE9SSVpPTlRBTCwgNik7CisKKyAgICAvKiBDcmVhdGUgZ2FpbiBzY2FsZSAqLworICAgIHNjYWxlID0gZ3RrX3NjYWxlX25ld193aXRoX3JhbmdlIChHVEtfT1JJRU5UQVRJT05fVkVSVElDQUwsCisgICAgICAgIC0yNC4wLCAxMi4wLCAwLjUpOworICAgIGd0a19zY2FsZV9zZXRfZHJhd192YWx1ZSAoR1RLX1NDQUxFIChzY2FsZSksIFRSVUUpOworICAgIGd0a19zY2FsZV9zZXRfdmFsdWVfcG9zIChHVEtfU0NBTEUgKHNjYWxlKSwgR1RLX1BPU19UT1ApOworICAgIGd0a19yYW5nZV9zZXRfdmFsdWUgKEdUS19SQU5HRSAoc2NhbGUpLCBnYWluKTsKKyAgICBndGtfd2lkZ2V0X3NldF9zaXplX3JlcXVlc3QgKHNjYWxlLCAzNSwgMTUwKTsKKyAgICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAoc2NhbGUpLCAidmFsdWUtY2hhbmdlZCIsCisgICAgICAgIEdfQ0FMTEJBQ0sgKG9uX2dhaW5fY2hhbmdlZCksIChncG9pbnRlcikgYmFuZCk7CisgICAgZ3RrX2JveF9wYWNrX3N0YXJ0IChHVEtfQk9YIChzY2FsZXNfaGJveCksIHNjYWxlLCBGQUxTRSwgRkFMU0UsIDApOworCisgICAgLyogQ3JlYXRlIGJhbmR3aWR0aCBzY2FsZSAqLworICAgIHNjYWxlID0gZ3RrX3NjYWxlX25ld193aXRoX3JhbmdlIChHVEtfT1JJRU5UQVRJT05fVkVSVElDQUwsCisgICAgICAgIDAuMCwgMjAwMDAuMCwgNS4wKTsKKyAgICBndGtfc2NhbGVfc2V0X2RyYXdfdmFsdWUgKEdUS19TQ0FMRSAoc2NhbGUpLCBUUlVFKTsKKyAgICBndGtfc2NhbGVfc2V0X3ZhbHVlX3BvcyAoR1RLX1NDQUxFIChzY2FsZSksIEdUS19QT1NfVE9QKTsKKyAgICBndGtfcmFuZ2Vfc2V0X3ZhbHVlIChHVEtfUkFOR0UgKHNjYWxlKSwgYncpOworICAgIGd0a193aWRnZXRfc2V0X3NpemVfcmVxdWVzdCAoc2NhbGUsIDQ1LCAxNTApOworICAgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChzY2FsZSksICJ2YWx1ZS1jaGFuZ2VkIiwKKyAgICAgICAgR19DQUxMQkFDSyAob25fYmFuZHdpZHRoX2NoYW5nZWQpLCAoZ3BvaW50ZXIpIGJhbmQpOworICAgIGd0a19ib3hfcGFja19zdGFydCAoR1RLX0JPWCAoc2NhbGVzX2hib3gpLCBzY2FsZSwgVFJVRSwgVFJVRSwgMCk7CisKKyAgICAvKiBDcmVhdGUgZnJlcXVlbmN5IHNjYWxlICovCisgICAgc2NhbGUgPSBndGtfc2NhbGVfbmV3X3dpdGhfcmFuZ2UgKEdUS19PUklFTlRBVElPTl9WRVJUSUNBTCwKKyAgICAgICAgMjAuMCwgMjAwMDAuMCwgNS4wKTsKKyAgICBndGtfc2NhbGVfc2V0X2RyYXdfdmFsdWUgKEdUS19TQ0FMRSAoc2NhbGUpLCBUUlVFKTsKKyAgICBndGtfc2NhbGVfc2V0X3ZhbHVlX3BvcyAoR1RLX1NDQUxFIChzY2FsZSksIEdUS19QT1NfVE9QKTsKKyAgICBndGtfcmFuZ2Vfc2V0X3ZhbHVlIChHVEtfUkFOR0UgKHNjYWxlKSwgZnJlcSk7CisgICAgZ3RrX3dpZGdldF9zZXRfc2l6ZV9yZXF1ZXN0IChzY2FsZSwgNDUsIDE1MCk7CisgICAgZ19zaWduYWxfY29ubmVjdCAoR19PQkpFQ1QgKHNjYWxlKSwgInZhbHVlLWNoYW5nZWQiLAorICAgICAgICBHX0NBTExCQUNLIChvbl9mcmVxX2NoYW5nZWQpLCAoZ3BvaW50ZXIpIGJhbmQpOworICAgIGd0a19ib3hfcGFja19zdGFydCAoR1RLX0JPWCAoc2NhbGVzX2hib3gpLCBzY2FsZSwgVFJVRSwgVFJVRSwgMCk7CisKKyAgICBndGtfY29udGFpbmVyX2FkZCAoR1RLX0NPTlRBSU5FUiAoZnJhbWUpLCBzY2FsZXNfaGJveCk7CisKKyAgICBndGtfYm94X3BhY2tfc3RhcnQgKEdUS19CT1ggKGhib3gpLCBmcmFtZSwgVFJVRSwgVFJVRSwgMCk7CisgIH0KKworICBndGtfYm94X3BhY2tfc3RhcnQgKEdUS19CT1ggKHZib3gpLCBoYm94LCBUUlVFLCBUUlVFLCAwKTsKKworICBndGtfY29udGFpbmVyX2FkZCAoR1RLX0NPTlRBSU5FUiAoYXBwd2luZG93KSwgdmJveCk7CisgIGd0a193aWRnZXRfc2hvd19hbGwgKGFwcHdpbmRvdyk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgZ3RrX21haW4gKCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoYmluKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL2VxdWFsaXplci9tZXNvbi5idWlsZCBiL3Rlc3RzL2V4YW1wbGVzL2VxdWFsaXplci9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTY4MjMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvZXF1YWxpemVyL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsNiBAQAorZXhlY3V0YWJsZSgnZXF1YWxpemVyLWRlbW8nLCAnZGVtby5jJywKKyAgZGVwZW5kZW5jaWVzOiBbZ3N0X2RlcCwgZ3RrX2RlcF0sCisgIGNfYXJnczogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzOiBbY29uZmlnaW5jXSwKKyAgaW5zdGFsbDogZmFsc2UpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL2d0ay8uZ2l0aWdub3JlIGIvdGVzdHMvZXhhbXBsZXMvZ3RrLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM4NGExZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL2d0ay8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMyBAQAorZ2xsaXZlc2hhZGVyCitndGtnbHNpbmsKK2d0a3NpbmsKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL2d0ay9NYWtlZmlsZS5hbSBiL3Rlc3RzL2V4YW1wbGVzL2d0ay9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWVkNzM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvZ3RrL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzkgQEAKKworbm9pbnN0X1BST0dSQU1TID0gZ3Rrc2luaworCitndGtzaW5rX1NPVVJDRVMgPSBndGtzaW5rLmMKK2d0a3NpbmtfQ0ZMQUdTID0gJChHVEszX0NGTEFHUykgXAorCSQoR1NUX0NGTEFHUykKK2d0a3NpbmtfTERBREQgPSAkKEdUSzNfTElCUykgXAorCSQoR1NUX0xJQlMpCisKK2lmIFVTRV9HVEszX0dMCitub2luc3RfUFJPR1JBTVMgKz0gZ3RrZ2xzaW5rIGdsbGl2ZXNoYWRlcgorCitndGtnbHNpbmtfU09VUkNFUyA9IGd0a2dsc2luay5jCitndGtnbHNpbmtfQ0ZMQUdTID0gXAorCSQoR1NUX1BMVUdJTlNfQkFEX0NGTEFHUykgXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9HTF9DRkxBR1MpIFwKKwkkKEdTVF9DRkxBR1MpIFwKKwkkKEdMX0NGTEFHUykgXAorCSQoR1RLM19DRkxBR1MpCitndGtnbHNpbmtfTERBREQgPSBcCisJJChHU1RfR0xfTElCUykgXAorCSQoR1NUX0xJQlMpIFwKKwkkKEdUSzNfTElCUykgXAorCSQoWF9MSUJTKQorCitnbGxpdmVzaGFkZXJfU09VUkNFUyA9IGdsbGl2ZXNoYWRlci5jCitnbGxpdmVzaGFkZXJfQ0ZMQUdTID0gXAorCSQoR1NUX1BMVUdJTlNfQkFEX0NGTEFHUykgXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9HTF9DRkxBR1MpIFwKKwkkKEdTVF9DRkxBR1MpIFwKKwkkKEdUSzNfQ0ZMQUdTKQorZ2xsaXZlc2hhZGVyX0xEQUREID0gXAorCSQoR1NUX0dMX0xJQlMpIFwKKwkkKEdTVF9MSUJTKSBcCisJJChHVEszX0xJQlMpIFwKKwkkKFhfTElCUykKK2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9ndGsvZ2xsaXZlc2hhZGVyLmMgYi90ZXN0cy9leGFtcGxlcy9ndGsvZ2xsaXZlc2hhZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNlNzQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL2d0ay9nbGxpdmVzaGFkZXIuYwpAQCAtMCwwICsxLDM1MCBAQAorLyoKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDE1IE1hdHRoZXcgV2F0ZXJzIDxtYXR0aGV3QGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9nbC9nbC5oPgorI2luY2x1ZGUgPGdzdC9nbC9nc3RnbGZ1bmNzLmg+CisjaW5jbHVkZSA8Z3RrL2d0ay5oPgorI2lmIEdTVF9HTF9IQVZFX1dJTkRPV19YMTEKKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2VuZGlmCisKKyNpZm5kZWYgR0xfR0VPTUVUUllfU0hBREVSCisjZGVmaW5lIEdMX0dFT01FVFJZX1NIQURFUiAweDhERDkKKyNlbmRpZgorCitzdGF0aWMgR01haW5Mb29wICpsb29wOworCitzdGF0aWMgY29uc3QgZ2NoYXIgKnZlcnQgPSAiI3ZlcnNpb24gMzMwXG5cCitpbiB2ZWM0IGFfcG9zaXRpb247XG5cCitpbiB2ZWMyIGFfdGV4Y29vcmQ7XG5cCitvdXQgdmVjMiB2X3RleGNvb3JkO1xuXAordW5pZm9ybSBmbG9hdCB0aW1lO1xuXAordW5pZm9ybSBmbG9hdCB3aWR0aDtcblwKK3VuaWZvcm0gZmxvYXQgaGVpZ2h0O1xuXAordm9pZCBtYWluKClcblwKK3tcblwKKyAgZ2xfUG9zaXRpb24gPSBhX3Bvc2l0aW9uO1xuXAorICB2X3RleGNvb3JkID0gYV90ZXhjb29yZDtcblwKK31cbiI7CisKK3N0YXRpYyBjb25zdCBnY2hhciAqZ2VvbSA9ICIjdmVyc2lvbiAzMzBcblwKK1xuXAorbGF5b3V0KHRyaWFuZ2xlcykgaW47XG5cCitsYXlvdXQodHJpYW5nbGVfc3RyaXAsIG1heF92ZXJ0aWNlcyA9IDMpIG91dDtcblwKK2luIHZlYzIgdl90ZXhjb29yZFtdO1xuXAorb3V0IHZlYzIgZ190ZXhjb29yZDtcblwKK1xuXAordm9pZCBtYWluKCkge1xuXAorICBmb3IoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cCisgICAgZ2xfUG9zaXRpb24gPSBnbF9pbltpXS5nbF9Qb3NpdGlvbjtcblwKKyAgICBnX3RleGNvb3JkID0gdl90ZXhjb29yZFtpXTtcblwKKyAgICBFbWl0VmVydGV4KCk7XG5cCisgIH1cblwKKyAgRW5kUHJpbWl0aXZlKCk7XG5cCit9XG4iOworCitzdGF0aWMgY29uc3QgZ2NoYXIgKmZyYWcgPSAiI3ZlcnNpb24gMzMwXG5cCitpbiB2ZWMyIGdfdGV4Y29vcmQ7XG5cCit1bmlmb3JtIHNhbXBsZXIyRCB0ZXg7XG5cCit1bmlmb3JtIGZsb2F0IHRpbWU7XG5cCit1bmlmb3JtIGZsb2F0IHdpZHRoO1xuXAordW5pZm9ybSBmbG9hdCBoZWlnaHQ7XG5cCit2b2lkIG1haW4oKVxuXAore1xuXAorICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodGV4LCBnX3RleGNvb3JkKTtcblwKK31cbiI7CisKKyNkZWZpbmUgTUFYX1NIQURFUl9TVEFHRVMgOAorc3RydWN0IHNoYWRlcl9zdGF0ZTsKKworc3RydWN0IHRleHRfdmlld19zdGF0ZQoreworICBzdHJ1Y3Qgc2hhZGVyX3N0YXRlICpzdGF0ZTsKKworICBHTGVudW0gdHlwZTsKKyAgZ2NoYXIgKnN0cjsKK307CisKK3N0cnVjdCBzaGFkZXJfc3RhdGUKK3sKKyAgR3N0R0xDb250ZXh0ICpjb250ZXh0OworICBHc3RFbGVtZW50ICpzaGFkZXI7CisgIGdib29sZWFuIHNoYWRlcl9saW5rZWQ7CisgIEd0a1dpZGdldCAqbGFiZWw7CisgIHN0cnVjdCB0ZXh0X3ZpZXdfc3RhdGUgdGV4dF9zdGF0ZXNbTUFYX1NIQURFUl9TVEFHRVNdOworICBnaW50IG5fc3RhZ2VzOworfTsKKworc3RhdGljIGdib29sZWFuCitidXNfY2FsbCAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbXNnLCBncG9pbnRlciBkYXRhKQoreworICBzd2l0Y2ggKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykpIHsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VPUzoKKyAgICAgIGdfcHJpbnQgKCJFbmQgb2Ygc3RyZWFtXG4iKTsKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FUlJPUjp7CisgICAgICBnY2hhciAqZGVidWc7CisgICAgICBHRXJyb3IgKmVycm9yOworCisgICAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobXNnLCAmZXJyb3IsICZkZWJ1Zyk7CisgICAgICBnX2ZyZWUgKGRlYnVnKTsKKworICAgICAgZ19wcmludGVyciAoIkVycm9yOiAlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2NoYXIgKgorX2ZpbmRfc291cmNlX2Zvcl9zaGFkZXJfdHlwZSAoc3RydWN0IHNoYWRlcl9zdGF0ZSAqc3RhdGUsIEdMZW51bSB0eXBlKQoreworICBpbnQgaSA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IHN0YXRlLT5uX3N0YWdlczsgaSsrKSB7CisgICAgaWYgKHN0YXRlLT50ZXh0X3N0YXRlc1tpXS50eXBlID09IHR5cGUpCisgICAgICByZXR1cm4gc3RhdGUtPnRleHRfc3RhdGVzW2ldLnN0cjsKKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK19hZGRfc3RhZ2VfdG9fc2hhZGVyIChHc3RHTFNoYWRlciAqIHNoYWRlciwgc3RydWN0IHNoYWRlcl9zdGF0ZSAqc3RhdGUsCisgICAgR0xlbnVtIHR5cGUsIGNvbnN0IGdjaGFyICogZGVmYXVsdF9zcmMpCit7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICBHc3RHTFNMVmVyc2lvbiB2ZXJzaW9uOworICBHc3RHTFNMUHJvZmlsZSBwcm9maWxlOworICBHc3RHTFNMU3RhZ2UgKnN0YWdlOworICBjb25zdCBnY2hhciAqc3JjOworCisgIHNyYyA9IF9maW5kX3NvdXJjZV9mb3Jfc2hhZGVyX3R5cGUgKHN0YXRlLCB0eXBlKTsKKyAgaWYgKCFzcmMpCisgICAgc3JjID0gZGVmYXVsdF9zcmM7CisgIGlmICghc3JjKQorICAgIC8qIEZJWE1FOiBhc3N1bWUgdGhpcyBzdGFnZSBpcyBub3QgbmVlZGVkICovCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFnc3RfZ2xzbF9zdHJpbmdfZ2V0X3ZlcnNpb25fcHJvZmlsZSAoc3JjLCAmdmVyc2lvbiwgJnByb2ZpbGUpKSB7CisgICAgZ19wcmludCAoIldhcm5pbmc6IGZhaWxlZCB0byByZXRyZWl2ZSBHTFNMIHZlcnNpb24gYW5kIHByb2ZpbGUgZm9yICIKKyAgICAgICAgInNoYWRlciB0eXBlIDB4JXhcbnNyYzpcbiVzXG4iLCB0eXBlLCBzcmMpOworICB9CisKKyAgaWYgKCEoc3RhZ2UgPSBnc3RfZ2xzbF9zdGFnZV9uZXdfd2l0aF9zdHJpbmcgKHNoYWRlci0+Y29udGV4dCwgdHlwZSwKKyAgICAgICAgICAgICAgdmVyc2lvbiwgcHJvZmlsZSwgc3JjKSkpIHsKKyAgICBnX3ByaW50ICgiRXJyb3I6IEZhaWxlZCB0byBjcmVhdGUgR0xTTCBTdGFnZSBmcm9tIHNyYzpcbiVzXG4iLCBzcmMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmICghZ3N0X2dsX3NoYWRlcl9jb21waWxlX2F0dGFjaF9zdGFnZSAoc2hhZGVyLCBzdGFnZSwgJmVycm9yKSkgeworICAgIC8qIGlnbm9yZSBmYWlsZWQgc2hhZGVyIGNvbXBpbGF0aW9ucyAqLworICAgIGdfcHJpbnQgKCIlcyIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdEdMU2hhZGVyICoKK19uZXdfc2hhZGVyIChHc3RHTENvbnRleHQgKiBjb250ZXh0LCBzdHJ1Y3Qgc2hhZGVyX3N0YXRlICpzdGF0ZSkKK3sKKyAgR3N0R0xTaGFkZXIgKnNoYWRlciA9IGdzdF9nbF9zaGFkZXJfbmV3IChjb250ZXh0KTsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisKKyAgaWYgKCFfYWRkX3N0YWdlX3RvX3NoYWRlciAoc2hhZGVyLCBzdGF0ZSwgR0xfVkVSVEVYX1NIQURFUiwgdmVydCkpIHsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzaGFkZXIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmICghX2FkZF9zdGFnZV90b19zaGFkZXIgKHNoYWRlciwgc3RhdGUsIEdMX0dFT01FVFJZX1NIQURFUiwgZ2VvbSkpIHsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzaGFkZXIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmICghX2FkZF9zdGFnZV90b19zaGFkZXIgKHNoYWRlciwgc3RhdGUsIEdMX0ZSQUdNRU5UX1NIQURFUiwgZnJhZykpIHsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzaGFkZXIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKCFnc3RfZ2xfc2hhZGVyX2xpbmsgKHNoYWRlciwgJmVycm9yKSkgeworICAgIC8qIGlnbm9yZSBmYWlsZWQgc2hhZGVyIGNvbXBpbGF0aW9ucyAqLworICAgIGdfcHJpbnQgKCIlcyIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzaGFkZXIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIHNoYWRlcjsKK30KKworc3RhdGljIGdib29sZWFuCitfc2V0X2NvbXBpbGF0aW9uX3N0YXRlIChzdHJ1Y3Qgc2hhZGVyX3N0YXRlICpzdGF0ZSkKK3sKKyAgZ3RrX2xhYmVsX3NldF90ZXh0IChHVEtfTEFCRUwgKHN0YXRlLT5sYWJlbCksCisgICAgICBzdGF0ZS0+c2hhZGVyX2xpbmtlZCA/ICJTdWNjZXNzIiA6ICJGYWlsdXJlIik7CisKKyAgcmV0dXJuIEdfU09VUkNFX1JFTU9WRTsKK30KKworc3RhdGljIEdzdEdMU2hhZGVyICoKK19jcmVhdGVfc2hhZGVyIChHc3RFbGVtZW50ICogZWxlbWVudCwgc3RydWN0IHNoYWRlcl9zdGF0ZSAqc3RhdGUpCit7CisgIEdzdEdMQ29udGV4dCAqY29udGV4dDsKKyAgR3N0R0xTaGFkZXIgKnNoYWRlciwgKm5ld19zaGFkZXI7CisKKyAgZ19vYmplY3RfZ2V0IChHX09CSkVDVCAoZWxlbWVudCksICJjb250ZXh0IiwgJmNvbnRleHQsICJzaGFkZXIiLCAmc2hhZGVyLAorICAgICAgTlVMTCk7CisKKyAgbmV3X3NoYWRlciA9IF9uZXdfc2hhZGVyIChjb250ZXh0LCBzdGF0ZSk7CisgIGlmICghc2hhZGVyICYmICFuZXdfc2hhZGVyKQorICAgIGdfd2FybmluZyAoIkZhaWxlZCB0byBjcmVhdGUgYSBzaGFkZXIhIik7CisgIHN0YXRlLT5zaGFkZXJfbGlua2VkID0gbmV3X3NoYWRlciAhPSBOVUxMOworCisgIGlmIChzaGFkZXIpCisgICAgZ3N0X29iamVjdF91bnJlZiAoc2hhZGVyKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoY29udGV4dCk7CisKKyAgZ19tYWluX2NvbnRleHRfaW52b2tlIChOVUxMLCAoR1NvdXJjZUZ1bmMpIF9zZXRfY29tcGlsYXRpb25fc3RhdGUsIHN0YXRlKTsKKworICByZXR1cm4gbmV3X3NoYWRlcjsKK30KKworc3RhdGljIHZvaWQKK19vbl90ZXh0X2NoYW5nZWQgKEd0a1RleHRCdWZmZXIgKiB0ZXh0LCBzdHJ1Y3QgdGV4dF92aWV3X3N0YXRlICpzdGF0ZSkKK3sKKyAgR3RrVGV4dEl0ZXIgc3RhcnQsIGVuZDsKKworICBndGtfdGV4dF9idWZmZXJfZ2V0X2JvdW5kcyAodGV4dCwgJnN0YXJ0LCAmZW5kKTsKKyAgZ19mcmVlIChzdGF0ZS0+c3RyKTsKKyAgc3RhdGUtPnN0ciA9IGd0a190ZXh0X2J1ZmZlcl9nZXRfdGV4dCAodGV4dCwgJnN0YXJ0LCAmZW5kLCBGQUxTRSk7CisgIGdfb2JqZWN0X3NldCAoc3RhdGUtPnN0YXRlLT5zaGFkZXIsICJ1cGRhdGUtc2hhZGVyIiwgVFJVRSwgTlVMTCk7Cit9CisKK3N0YXRpYyBHdGtXaWRnZXQgKgorX25ld19zb3VyY2VfdmlldyAoc3RydWN0IHNoYWRlcl9zdGF0ZSAqc3RhdGUsIEdMZW51bSB0eXBlLCBjb25zdCBnY2hhciAqIHRlbXBsKQoreworICBzdGF0aWMgaW50IGkgPSAwOworICBHdGtXaWRnZXQgKnNjcm9sbCwgKnRleHRfdmlldzsKKyAgR3RrVGV4dEJ1ZmZlciAqdGV4dDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoaSA8IE1BWF9TSEFERVJfU1RBR0VTLCBOVUxMKTsKKworICBzdGF0ZS0+dGV4dF9zdGF0ZXNbaV0uc3RhdGUgPSBzdGF0ZTsKKyAgc3RhdGUtPnRleHRfc3RhdGVzW2ldLnR5cGUgPSB0eXBlOworICBzdGF0ZS0+dGV4dF9zdGF0ZXNbaV0uc3RyID0gZ19zdHJkdXAgKHRlbXBsKTsKKworICBzY3JvbGwgPSBndGtfc2Nyb2xsZWRfd2luZG93X25ldyAoTlVMTCwgTlVMTCk7CisgIGd0a193aWRnZXRfc2V0X3NpemVfcmVxdWVzdCAoc2Nyb2xsLCAyMCwgMjApOworICB0ZXh0X3ZpZXcgPSBndGtfdGV4dF92aWV3X25ldyAoKTsKKyAgZ3RrX2NvbnRhaW5lcl9hZGQgKEdUS19DT05UQUlORVIgKHNjcm9sbCksIHRleHRfdmlldyk7CisgIHRleHQgPSBndGtfdGV4dF92aWV3X2dldF9idWZmZXIgKEdUS19URVhUX1ZJRVcgKHRleHRfdmlldykpOworICBpZiAoc3RhdGUtPnRleHRfc3RhdGVzW2ldLnN0cikKKyAgICBndGtfdGV4dF9idWZmZXJfc2V0X3RleHQgKHRleHQsIHN0YXRlLT50ZXh0X3N0YXRlc1tpXS5zdHIsIC0xKTsKKyAgZ19zaWduYWxfY29ubmVjdCAodGV4dCwgImNoYW5nZWQiLCBHX0NBTExCQUNLIChfb25fdGV4dF9jaGFuZ2VkKSwKKyAgICAgICZzdGF0ZS0+dGV4dF9zdGF0ZXNbaV0pOworICBzdGF0ZS0+bl9zdGFnZXMrKzsKKyAgaSsrOworCisgIHJldHVybiBzY3JvbGw7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmUsICpzcmMsICp1cGxvYWQsICpzaGFkZXIsICpzaW5rOworICBHdGtXaWRnZXQgKndpbmRvdywgKnBhbmVkLCAqdmlkZW8sICpyaWdodF9ib3gsICpib29rOworICBzdHJ1Y3Qgc2hhZGVyX3N0YXRlIHN0YXRlID0geyAwLCB9OworICBHc3RCdXMgKmJ1czsKKworI2lmIEdTVF9HTF9IQVZFX1dJTkRPV19YMTEKKyAgWEluaXRUaHJlYWRzICgpOworI2VuZGlmCisKKyAgZ3N0X2luaXQgKCZhcmdjLCAmYXJndik7CisgIGd0a19pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIEZBTFNFKTsKKworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKE5VTEwpOworICBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCBOVUxMKTsKKyAgdXBsb2FkID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZ2x1cGxvYWQiLCBOVUxMKTsKKyAgc2hhZGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZ2xzaGFkZXIiLCBOVUxMKTsKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImd0a2dsc2luayIsIE5VTEwpOworICBnX29iamVjdF9nZXQgKHNpbmssICJ3aWRnZXQiLCAmdmlkZW8sIE5VTEwpOworCisgIGdfYXNzZXJ0IChzcmMgJiYgc2hhZGVyICYmIHNpbmspOworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHNyYywgdXBsb2FkLCBzaGFkZXIsIHNpbmssIE5VTEwpOworICBnX2Fzc2VydCAoZ3N0X2VsZW1lbnRfbGlua19tYW55IChzcmMsIHVwbG9hZCwgc2hhZGVyLCBzaW5rLCBOVUxMKSk7CisKKyAgYnVzID0gZ3N0X3BpcGVsaW5lX2dldF9idXMgKEdTVF9QSVBFTElORSAocGlwZWxpbmUpKTsKKyAgZ3N0X2J1c19hZGRfd2F0Y2ggKGJ1cywgYnVzX2NhbGwsIGxvb3ApOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIHN0YXRlLnNoYWRlciA9IGdzdF9vYmplY3RfcmVmIChzaGFkZXIpOworICBnX3NpZ25hbF9jb25uZWN0IChzaGFkZXIsICJjcmVhdGUtc2hhZGVyIiwgR19DQUxMQkFDSyAoX2NyZWF0ZV9zaGFkZXIpLAorICAgICAgJnN0YXRlKTsKKworICBib29rID0gZ3RrX25vdGVib29rX25ldyAoKTsKKyAgLyogdGV4dCB2aWV3IGluc2lkZSBhIHNjcm9sbCB2aWV3ICovCisgIGd0a19ub3RlYm9va19hcHBlbmRfcGFnZSAoR1RLX05PVEVCT09LIChib29rKSwgX25ld19zb3VyY2VfdmlldyAoJnN0YXRlLAorICAgICAgICAgIEdMX1ZFUlRFWF9TSEFERVIsIHZlcnQpLCBndGtfbGFiZWxfbmV3ICgiVmVydGV4IikpOworICBndGtfbm90ZWJvb2tfYXBwZW5kX3BhZ2UgKEdUS19OT1RFQk9PSyAoYm9vayksIF9uZXdfc291cmNlX3ZpZXcgKCZzdGF0ZSwKKyAgICAgICAgICBHTF9HRU9NRVRSWV9TSEFERVIsIGdlb20pLCBndGtfbGFiZWxfbmV3ICgiR2VvbWV0cnkiKSk7CisgIGd0a19ub3RlYm9va19hcHBlbmRfcGFnZSAoR1RLX05PVEVCT09LIChib29rKSwgX25ld19zb3VyY2VfdmlldyAoJnN0YXRlLAorICAgICAgICAgIEdMX0ZSQUdNRU5UX1NIQURFUiwgZnJhZyksIGd0a19sYWJlbF9uZXcgKCJGcmFnbWVudCIpKTsKKyAgLyogc3RhdHVzIGxhYmVsICovCisgIHN0YXRlLmxhYmVsID0gZ3RrX2xhYmVsX25ldyAoIlN1Y2Nlc3MiKTsKKworICAvKiByaWdodCBzaWRlIHNvdXJjZSBjb2RlIGVkaXRvciAqLworICByaWdodF9ib3ggPSBndGtfYm94X25ldyAoR1RLX09SSUVOVEFUSU9OX1ZFUlRJQ0FMLCAwKTsKKyAgZ3RrX2JveF9wYWNrX3N0YXJ0IChHVEtfQk9YIChyaWdodF9ib3gpLCBib29rLCBUUlVFLCBUUlVFLCAwKTsKKyAgZ3RrX2JveF9wYWNrX3N0YXJ0IChHVEtfQk9YIChyaWdodF9ib3gpLCBzdGF0ZS5sYWJlbCwgRkFMU0UsIFRSVUUsIDApOworCisgIHBhbmVkID0gZ3RrX3BhbmVkX25ldyAoR1RLX09SSUVOVEFUSU9OX0hPUklaT05UQUwpOworICBndGtfcGFuZWRfcGFjazEgKEdUS19QQU5FRCAocGFuZWQpLCB2aWRlbywgVFJVRSwgRkFMU0UpOworICBndGtfd2lkZ2V0X3NldF9zaXplX3JlcXVlc3QgKHZpZGVvLCAyMCwgMjApOworICBndGtfcGFuZWRfcGFjazIgKEdUS19QQU5FRCAocGFuZWQpLCByaWdodF9ib3gsIFRSVUUsIEZBTFNFKTsKKworICB3aW5kb3cgPSBndGtfd2luZG93X25ldyAoR1RLX1dJTkRPV19UT1BMRVZFTCk7CisgIGd0a193aW5kb3dfc2V0X2RlZmF1bHRfc2l6ZSAoR1RLX1dJTkRPVyAod2luZG93KSwgNjQwLCA0ODApOworICBndGtfY29udGFpbmVyX2FkZCAoR1RLX0NPTlRBSU5FUiAod2luZG93KSwgcGFuZWQpOworCisgIGd0a193aWRnZXRfc2hvd19hbGwgKHdpbmRvdyk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworCisgIC8qc2hhZGVyIHN0cmluZ3MgbGVha2VkIGhlcmUgKi8KKyAgLypnX2ZyZWUgKHN0YXRlLnN0cik7ICovCisgIGdzdF9vYmplY3RfdW5yZWYgKHN0YXRlLnNoYWRlcik7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvZ3RrL2d0a2dsc2luay5jIGIvdGVzdHMvZXhhbXBsZXMvZ3RrL2d0a2dsc2luay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzE5ODUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ndGsvZ3RrZ2xzaW5rLmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxNCBNYXR0aGV3IFdhdGVycyA8bWF0dGhld0BjZW50cmljdWxhci5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlIDxnc3QvZ2wvZ2wuaD4KKworI2lmIEdTVF9HTF9IQVZFX1dJTkRPV19YMTEgJiYgZGVmaW5lZCAoR0RLX1dJTkRPV0lOR19YMTEpCisjaW5jbHVkZSA8Z3N0L2dsL3gxMS9nc3RnbGRpc3BsYXlfeDExLmg+CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2J1dHRvbl9zdGF0ZV9udWxsX2NiIChHdGtXaWRnZXQgKiB3aWRnZXQsIEdzdEVsZW1lbnQgKiBwaXBlbGluZSkKK3sKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworICBnX3ByaW50ICgiR1NUX1NUQVRFX05VTExcbiIpOworfQorCitzdGF0aWMgdm9pZAorYnV0dG9uX3N0YXRlX3JlYWR5X2NiIChHdGtXaWRnZXQgKiB3aWRnZXQsIEdzdEVsZW1lbnQgKiBwaXBlbGluZSkKK3sKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1JFQURZKTsKKyAgZ19wcmludCAoIkdTVF9TVEFURV9SRUFEWVxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitidXR0b25fc3RhdGVfcGF1c2VkX2NiIChHdGtXaWRnZXQgKiB3aWRnZXQsIEdzdEVsZW1lbnQgKiBwaXBlbGluZSkKK3sKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BBVVNFRCk7CisgIGdfcHJpbnQgKCJHU1RfU1RBVEVfUEFVU0VEXG4iKTsKK30KKworc3RhdGljIHZvaWQKK2J1dHRvbl9zdGF0ZV9wbGF5aW5nX2NiIChHdGtXaWRnZXQgKiB3aWRnZXQsIEdzdEVsZW1lbnQgKiBwaXBlbGluZSkKK3sKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBnX3ByaW50ICgiR1NUX1NUQVRFX1BMQVlJTkdcbiIpOworfQorCitzdGF0aWMgdm9pZAorZW5kX3N0cmVhbV9jYiAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgR3N0RWxlbWVudCAqIHBpcGVsaW5lKQoreworICBnX3ByaW50ICgiRW5kIG9mIHN0cmVhbVxuIik7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisKKyAgZ3RrX21haW5fcXVpdCAoKTsKK30KKworc3RhdGljIHZvaWQKK2Rlc3Ryb3lfY2IgKEd0a1dpZGdldCAqIHdpZGdldCwgR2RrRXZlbnQgKiBldmVudCwgR3N0RWxlbWVudCAqIHBpcGVsaW5lKQoreworICBnX3ByaW50ICgiQ2xvc2VcbiIpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworCisgIGd0a19tYWluX3F1aXQgKCk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgR3RrV2lkZ2V0ICp3aW5kb3csICp3aW5kb3dfY29udHJvbDsKKyAgR3RrV2lkZ2V0ICpidXR0b25fc3RhdGVfbnVsbCwgKmJ1dHRvbl9zdGF0ZV9yZWFkeTsKKyAgR3RrV2lkZ2V0ICpidXR0b25fc3RhdGVfcGF1c2VkLCAqYnV0dG9uX3N0YXRlX3BsYXlpbmc7CisgIEd0a1dpZGdldCAqZ3JpZCwgKmFyZWE7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RFbGVtZW50ICp2aWRlb3NyYywgKnVwbG9hZCwgKmVmZmVjdCwgKnZpZGVvc2luazsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RDYXBzICpjYXBzOworICBHc3RCdXMgKmJ1czsKKworI2lmIEdTVF9HTF9IQVZFX1dJTkRPV19YMTEgJiYgZGVmaW5lZChHREtfV0lORE9XSU5HX1gxMSkKKyAgWEluaXRUaHJlYWRzICgpOworI2VuZGlmCisKKyAgZ3N0X2luaXQgKCZhcmdjLCAmYXJndik7CisgIGd0a19pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisKKyAgLy93aW5kb3cgdGhhdCBjb250YWlucyBhbiBhcmVhIHdoZXJlIHRoZSB2aWRlbyBpcyBkcmF3bgorICB3aW5kb3cgPSBndGtfd2luZG93X25ldyAoR1RLX1dJTkRPV19UT1BMRVZFTCk7CisgIGd0a193aW5kb3dfc2V0X2RlZmF1bHRfc2l6ZSAoR1RLX1dJTkRPVyAod2luZG93KSwgNjQwLCA0ODApOworICBndGtfd2luZG93X21vdmUgKEdUS19XSU5ET1cgKHdpbmRvdyksIDMwMCwgMTApOworICBndGtfd2luZG93X3NldF90aXRsZSAoR1RLX1dJTkRPVyAod2luZG93KSwgImd0a2dzdHdpZGdldCIpOworCisgIC8vd2luZG93IHRvIGNvbnRyb2wgdGhlIHN0YXRlcworICB3aW5kb3dfY29udHJvbCA9IGd0a193aW5kb3dfbmV3IChHVEtfV0lORE9XX1RPUExFVkVMKTsKKyAgZ3RrX3dpbmRvd19zZXRfcmVzaXphYmxlIChHVEtfV0lORE9XICh3aW5kb3dfY29udHJvbCksIEZBTFNFKTsKKyAgZ3RrX3dpbmRvd19tb3ZlIChHVEtfV0lORE9XICh3aW5kb3dfY29udHJvbCksIDEwLCAxMCk7CisgIGdyaWQgPSBndGtfZ3JpZF9uZXcgKCk7CisgIGd0a19jb250YWluZXJfYWRkIChHVEtfQ09OVEFJTkVSICh3aW5kb3dfY29udHJvbCksIGdyaWQpOworCisgIC8vY29udHJvbCBzdGF0ZSBudWxsCisgIGJ1dHRvbl9zdGF0ZV9udWxsID0gZ3RrX2J1dHRvbl9uZXdfd2l0aF9sYWJlbCAoIkdTVF9TVEFURV9OVUxMIik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChidXR0b25fc3RhdGVfbnVsbCksICJjbGlja2VkIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKGJ1dHRvbl9zdGF0ZV9udWxsX2NiKSwgcGlwZWxpbmUpOworICBndGtfZ3JpZF9hdHRhY2ggKEdUS19HUklEIChncmlkKSwgYnV0dG9uX3N0YXRlX251bGwsIDAsIDEsIDEsIDEpOworICBndGtfd2lkZ2V0X3Nob3cgKGJ1dHRvbl9zdGF0ZV9udWxsKTsKKworICAvL2NvbnRyb2wgc3RhdGUgcmVhZHkKKyAgYnV0dG9uX3N0YXRlX3JlYWR5ID0gZ3RrX2J1dHRvbl9uZXdfd2l0aF9sYWJlbCAoIkdTVF9TVEFURV9SRUFEWSIpOworICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAoYnV0dG9uX3N0YXRlX3JlYWR5KSwgImNsaWNrZWQiLAorICAgICAgR19DQUxMQkFDSyAoYnV0dG9uX3N0YXRlX3JlYWR5X2NiKSwgcGlwZWxpbmUpOworICBndGtfZ3JpZF9hdHRhY2ggKEdUS19HUklEIChncmlkKSwgYnV0dG9uX3N0YXRlX3JlYWR5LCAwLCAyLCAxLCAxKTsKKyAgZ3RrX3dpZGdldF9zaG93IChidXR0b25fc3RhdGVfcmVhZHkpOworCisgIC8vY29udHJvbCBzdGF0ZSBwYXVzZWQKKyAgYnV0dG9uX3N0YXRlX3BhdXNlZCA9IGd0a19idXR0b25fbmV3X3dpdGhfbGFiZWwgKCJHU1RfU1RBVEVfUEFVU0VEIik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChidXR0b25fc3RhdGVfcGF1c2VkKSwgImNsaWNrZWQiLAorICAgICAgR19DQUxMQkFDSyAoYnV0dG9uX3N0YXRlX3BhdXNlZF9jYiksIHBpcGVsaW5lKTsKKyAgZ3RrX2dyaWRfYXR0YWNoIChHVEtfR1JJRCAoZ3JpZCksIGJ1dHRvbl9zdGF0ZV9wYXVzZWQsIDAsIDMsIDEsIDEpOworICBndGtfd2lkZ2V0X3Nob3cgKGJ1dHRvbl9zdGF0ZV9wYXVzZWQpOworCisgIC8vY29udHJvbCBzdGF0ZSBwbGF5aW5nCisgIGJ1dHRvbl9zdGF0ZV9wbGF5aW5nID0gZ3RrX2J1dHRvbl9uZXdfd2l0aF9sYWJlbCAoIkdTVF9TVEFURV9QTEFZSU5HIik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChidXR0b25fc3RhdGVfcGxheWluZyksICJjbGlja2VkIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKGJ1dHRvbl9zdGF0ZV9wbGF5aW5nX2NiKSwgcGlwZWxpbmUpOworICBndGtfZ3JpZF9hdHRhY2ggKEdUS19HUklEIChncmlkKSwgYnV0dG9uX3N0YXRlX3BsYXlpbmcsIDAsIDQsIDEsIDEpOworICBndGtfd2lkZ2V0X3Nob3cgKGJ1dHRvbl9zdGF0ZV9wbGF5aW5nKTsKKworICBndGtfd2lkZ2V0X3Nob3cgKGdyaWQpOworICBndGtfd2lkZ2V0X3Nob3cgKHdpbmRvd19jb250cm9sKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAod2luZG93KSwgImRlbGV0ZS1ldmVudCIsIEdfQ0FMTEJBQ0sgKGRlc3Ryb3lfY2IpLAorICAgICAgcGlwZWxpbmUpOworCisgIC8vY29uZmlndXJlIHRoZSBwaXBlbGluZQorICB2aWRlb3NyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsICJ2aWRlb3Rlc3RzcmMiKTsKKyAgdXBsb2FkID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZ2x1cGxvYWQiLCAiZ2x1cGxvYWQiKTsKKyAgZWZmZWN0ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZ2xmaWx0ZXJjdWJlIiwgImdsZmlsdGVyY3ViZSIpOworICB2aWRlb3NpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJndGtnbHNpbmsiLCAiZ3Rrc2luayIpOworCisgIGdfb2JqZWN0X2dldCAodmlkZW9zaW5rLCAid2lkZ2V0IiwgJmFyZWEsIE5VTEwpOworICBndGtfY29udGFpbmVyX2FkZCAoR1RLX0NPTlRBSU5FUiAod2luZG93KSwgYXJlYSk7CisgIGdfb2JqZWN0X3VucmVmIChhcmVhKTsKKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcmF3IiwgIndpZHRoIiwgR19UWVBFX0lOVCwgNjQwLAorICAgICAgImhlaWdodCIsIEdfVFlQRV9JTlQsIDQ4MCwgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJSR0JBIiwKKyAgICAgICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTiwgMzAsIDEsIE5VTEwpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgdmlkZW9zcmMsIHVwbG9hZCwgZWZmZWN0LCB2aWRlb3NpbmssCisgICAgICBOVUxMKTsKKworICBpZiAoIWdzdF9lbGVtZW50X2xpbmtfZmlsdGVyZWQgKHZpZGVvc3JjLCB1cGxvYWQsIGNhcHMpKSB7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIGdfd2FybmluZyAoIkZhaWxlZCB0byBsaW5rIHZpZGVvc3JjIHRvIGdsZmlsdGVyY3ViZSFcbiIpOworICAgIHJldHVybiAtMTsKKyAgfQorICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rX21hbnkgKHVwbG9hZCwgZWZmZWN0LCB2aWRlb3NpbmssIE5VTEwpKSB7CisgICAgZ193YXJuaW5nICgiRmFpbGVkIHRvIGxpbmsgdmlkZW9zcmMgdG8gZ2xmaWx0ZXJjdWJlIVxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIC8vc2V0IHdpbmRvdyBpZCBvbiB0aGlzIGV2ZW50CisgIGJ1cyA9IGdzdF9waXBlbGluZV9nZXRfYnVzIChHU1RfUElQRUxJTkUgKHBpcGVsaW5lKSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OmVycm9yIiwgR19DQUxMQkFDSyAoZW5kX3N0cmVhbV9jYiksCisgICAgICBwaXBlbGluZSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6Ondhcm5pbmciLCBHX0NBTExCQUNLIChlbmRfc3RyZWFtX2NiKSwKKyAgICAgIHBpcGVsaW5lKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6ZW9zIiwgR19DQUxMQkFDSyAoZW5kX3N0cmVhbV9jYiksIHBpcGVsaW5lKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKworICAvL3N0YXJ0CisgIHJldCA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgaWYgKHJldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpIHsKKyAgICBnX3ByaW50ICgiRmFpbGVkIHRvIHN0YXJ0IHVwIHBpcGVsaW5lIVxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgZ3RrX3dpZGdldF9zaG93X2FsbCAod2luZG93KTsKKworICBndGtfbWFpbiAoKTsKKworICBnc3RfZGVpbml0ICgpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvZ3RrL2d0a3NpbmsuYyBiL3Rlc3RzL2V4YW1wbGVzL2d0ay9ndGtzaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2ZmQwOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL2d0ay9ndGtzaW5rLmMKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxNCBNYXR0aGV3IFdhdGVycyA8bWF0dGhld0BjZW50cmljdWxhci5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK3N0YXRpYyB2b2lkCitidXR0b25fc3RhdGVfbnVsbF9jYiAoR3RrV2lkZ2V0ICogd2lkZ2V0LCBHc3RFbGVtZW50ICogcGlwZWxpbmUpCit7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ19wcmludCAoIkdTVF9TVEFURV9OVUxMXG4iKTsKK30KKworc3RhdGljIHZvaWQKK2J1dHRvbl9zdGF0ZV9yZWFkeV9jYiAoR3RrV2lkZ2V0ICogd2lkZ2V0LCBHc3RFbGVtZW50ICogcGlwZWxpbmUpCit7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9SRUFEWSk7CisgIGdfcHJpbnQgKCJHU1RfU1RBVEVfUkVBRFlcbiIpOworfQorCitzdGF0aWMgdm9pZAorYnV0dG9uX3N0YXRlX3BhdXNlZF9jYiAoR3RrV2lkZ2V0ICogd2lkZ2V0LCBHc3RFbGVtZW50ICogcGlwZWxpbmUpCit7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QQVVTRUQpOworICBnX3ByaW50ICgiR1NUX1NUQVRFX1BBVVNFRFxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitidXR0b25fc3RhdGVfcGxheWluZ19jYiAoR3RrV2lkZ2V0ICogd2lkZ2V0LCBHc3RFbGVtZW50ICogcGlwZWxpbmUpCit7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgZ19wcmludCAoIkdTVF9TVEFURV9QTEFZSU5HXG4iKTsKK30KKworc3RhdGljIHZvaWQKK2VuZF9zdHJlYW1fY2IgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsIEdzdEVsZW1lbnQgKiBwaXBlbGluZSkKK3sKKyAgZ19wcmludCAoIkVuZCBvZiBzdHJlYW1cbiIpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworCisgIGd0a19tYWluX3F1aXQgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitkZXN0cm95X2NiIChHdGtXaWRnZXQgKiB3aWRnZXQsIEdka0V2ZW50ICogZXZlbnQsIEdzdEVsZW1lbnQgKiBwaXBlbGluZSkKK3sKKyAgZ19wcmludCAoIkNsb3NlXG4iKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKworICBndGtfbWFpbl9xdWl0ICgpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIEd0a1dpZGdldCAqd2luZG93LCAqd2luZG93X2NvbnRyb2w7CisgIEd0a1dpZGdldCAqYnV0dG9uX3N0YXRlX251bGwsICpidXR0b25fc3RhdGVfcmVhZHk7CisgIEd0a1dpZGdldCAqYnV0dG9uX3N0YXRlX3BhdXNlZCwgKmJ1dHRvbl9zdGF0ZV9wbGF5aW5nOworICBHdGtXaWRnZXQgKmdyaWQsICphcmVhOworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0RWxlbWVudCAqdmlkZW9zcmMsICp2aWRlb3Npbms7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0QnVzICpidXM7CisKKyAgZ3N0X2luaXQgKCZhcmdjLCAmYXJndik7CisgIGd0a19pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisKKyAgLy93aW5kb3cgdGhhdCBjb250YWlucyBhbiBhcmVhIHdoZXJlIHRoZSB2aWRlbyBpcyBkcmF3bgorICB3aW5kb3cgPSBndGtfd2luZG93X25ldyAoR1RLX1dJTkRPV19UT1BMRVZFTCk7CisgIGd0a193aW5kb3dfc2V0X2RlZmF1bHRfc2l6ZSAoR1RLX1dJTkRPVyAod2luZG93KSwgNjQwLCA0ODApOworICBndGtfd2luZG93X21vdmUgKEdUS19XSU5ET1cgKHdpbmRvdyksIDMwMCwgMTApOworICBndGtfd2luZG93X3NldF90aXRsZSAoR1RLX1dJTkRPVyAod2luZG93KSwgImd0a2dzdHdpZGdldCIpOworCisgIC8vd2luZG93IHRvIGNvbnRyb2wgdGhlIHN0YXRlcworICB3aW5kb3dfY29udHJvbCA9IGd0a193aW5kb3dfbmV3IChHVEtfV0lORE9XX1RPUExFVkVMKTsKKyAgZ3RrX3dpbmRvd19zZXRfcmVzaXphYmxlIChHVEtfV0lORE9XICh3aW5kb3dfY29udHJvbCksIEZBTFNFKTsKKyAgZ3RrX3dpbmRvd19tb3ZlIChHVEtfV0lORE9XICh3aW5kb3dfY29udHJvbCksIDEwLCAxMCk7CisgIGdyaWQgPSBndGtfZ3JpZF9uZXcgKCk7CisgIGd0a19jb250YWluZXJfYWRkIChHVEtfQ09OVEFJTkVSICh3aW5kb3dfY29udHJvbCksIGdyaWQpOworCisgIC8vY29udHJvbCBzdGF0ZSBudWxsCisgIGJ1dHRvbl9zdGF0ZV9udWxsID0gZ3RrX2J1dHRvbl9uZXdfd2l0aF9sYWJlbCAoIkdTVF9TVEFURV9OVUxMIik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChidXR0b25fc3RhdGVfbnVsbCksICJjbGlja2VkIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKGJ1dHRvbl9zdGF0ZV9udWxsX2NiKSwgcGlwZWxpbmUpOworICBndGtfZ3JpZF9hdHRhY2ggKEdUS19HUklEIChncmlkKSwgYnV0dG9uX3N0YXRlX251bGwsIDAsIDEsIDEsIDEpOworICBndGtfd2lkZ2V0X3Nob3cgKGJ1dHRvbl9zdGF0ZV9udWxsKTsKKworICAvL2NvbnRyb2wgc3RhdGUgcmVhZHkKKyAgYnV0dG9uX3N0YXRlX3JlYWR5ID0gZ3RrX2J1dHRvbl9uZXdfd2l0aF9sYWJlbCAoIkdTVF9TVEFURV9SRUFEWSIpOworICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAoYnV0dG9uX3N0YXRlX3JlYWR5KSwgImNsaWNrZWQiLAorICAgICAgR19DQUxMQkFDSyAoYnV0dG9uX3N0YXRlX3JlYWR5X2NiKSwgcGlwZWxpbmUpOworICBndGtfZ3JpZF9hdHRhY2ggKEdUS19HUklEIChncmlkKSwgYnV0dG9uX3N0YXRlX3JlYWR5LCAwLCAyLCAxLCAxKTsKKyAgZ3RrX3dpZGdldF9zaG93IChidXR0b25fc3RhdGVfcmVhZHkpOworCisgIC8vY29udHJvbCBzdGF0ZSBwYXVzZWQKKyAgYnV0dG9uX3N0YXRlX3BhdXNlZCA9IGd0a19idXR0b25fbmV3X3dpdGhfbGFiZWwgKCJHU1RfU1RBVEVfUEFVU0VEIik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChidXR0b25fc3RhdGVfcGF1c2VkKSwgImNsaWNrZWQiLAorICAgICAgR19DQUxMQkFDSyAoYnV0dG9uX3N0YXRlX3BhdXNlZF9jYiksIHBpcGVsaW5lKTsKKyAgZ3RrX2dyaWRfYXR0YWNoIChHVEtfR1JJRCAoZ3JpZCksIGJ1dHRvbl9zdGF0ZV9wYXVzZWQsIDAsIDMsIDEsIDEpOworICBndGtfd2lkZ2V0X3Nob3cgKGJ1dHRvbl9zdGF0ZV9wYXVzZWQpOworCisgIC8vY29udHJvbCBzdGF0ZSBwbGF5aW5nCisgIGJ1dHRvbl9zdGF0ZV9wbGF5aW5nID0gZ3RrX2J1dHRvbl9uZXdfd2l0aF9sYWJlbCAoIkdTVF9TVEFURV9QTEFZSU5HIik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChidXR0b25fc3RhdGVfcGxheWluZyksICJjbGlja2VkIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKGJ1dHRvbl9zdGF0ZV9wbGF5aW5nX2NiKSwgcGlwZWxpbmUpOworICBndGtfZ3JpZF9hdHRhY2ggKEdUS19HUklEIChncmlkKSwgYnV0dG9uX3N0YXRlX3BsYXlpbmcsIDAsIDQsIDEsIDEpOworICBndGtfd2lkZ2V0X3Nob3cgKGJ1dHRvbl9zdGF0ZV9wbGF5aW5nKTsKKworICBndGtfd2lkZ2V0X3Nob3cgKGdyaWQpOworICBndGtfd2lkZ2V0X3Nob3cgKHdpbmRvd19jb250cm9sKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAod2luZG93KSwgImRlbGV0ZS1ldmVudCIsIEdfQ0FMTEJBQ0sgKGRlc3Ryb3lfY2IpLAorICAgICAgcGlwZWxpbmUpOworCisgIC8vY29uZmlndXJlIHRoZSBwaXBlbGluZQorICB2aWRlb3NyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsICJ2aWRlb3Rlc3RzcmMiKTsKKyAgdmlkZW9zaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZ3Rrc2luayIsICJndGtzaW5rIik7CisKKyAgZ19vYmplY3RfZ2V0ICh2aWRlb3NpbmssICJ3aWRnZXQiLCAmYXJlYSwgTlVMTCk7CisgIGd0a19jb250YWluZXJfYWRkIChHVEtfQ09OVEFJTkVSICh3aW5kb3cpLCBhcmVhKTsKKyAgZ19vYmplY3RfdW5yZWYgKGFyZWEpOworCisgIGd0a193aWRnZXRfcmVhbGl6ZSAoYXJlYSk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LXJhdyIsCisgICAgICAid2lkdGgiLCBHX1RZUEVfSU5ULCA2NDAsCisgICAgICAiaGVpZ2h0IiwgR19UWVBFX0lOVCwgNDgwLCAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIkJHUkEiLCBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHZpZGVvc3JjLCB2aWRlb3NpbmssIE5VTEwpOworCisgIGlmICghZ3N0X2VsZW1lbnRfbGlua19maWx0ZXJlZCAodmlkZW9zcmMsIHZpZGVvc2luaywgY2FwcykpIHsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgZ193YXJuaW5nICgiRmFpbGVkIHRvIGxpbmsgdmlkZW9zcmMgdG8gZ2xmaWx0ZXJjdWJlIVxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAvL3NldCB3aW5kb3cgaWQgb24gdGhpcyBldmVudAorICBidXMgPSBnc3RfcGlwZWxpbmVfZ2V0X2J1cyAoR1NUX1BJUEVMSU5FIChwaXBlbGluZSkpOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjplcnJvciIsIEdfQ0FMTEJBQ0sgKGVuZF9zdHJlYW1fY2IpLAorICAgICAgcGlwZWxpbmUpOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjp3YXJuaW5nIiwgR19DQUxMQkFDSyAoZW5kX3N0cmVhbV9jYiksCisgICAgICBwaXBlbGluZSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OmVvcyIsIEdfQ0FMTEJBQ0sgKGVuZF9zdHJlYW1fY2IpLCBwaXBlbGluZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgLy9zdGFydAorICByZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGlmIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKSB7CisgICAgZ19wcmludCAoIkZhaWxlZCB0byBzdGFydCB1cCBwaXBlbGluZSFcbiIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGd0a193aWRnZXRfc2hvd19hbGwgKHdpbmRvdyk7CisKKyAgZ3RrX21haW4gKCk7CisKKyAgZ3N0X2RlaW5pdCAoKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL2phY2svTWFrZWZpbGUuYW0gYi90ZXN0cy9leGFtcGxlcy9qYWNrL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNjFjYmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9qYWNrL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTIgQEAKK2lmIEhBVkVfR1RLCitHVEtfRVhBTVBMRVM9amFja19jbGllbnQKK2Vsc2UKK0dUS19FWEFNUExFUz0KK2VuZGlmCisKK25vaW5zdF9QUk9HUkFNUyA9ICQoR1RLX0VYQU1QTEVTKQorCitqYWNrX2NsaWVudF9TT1VSQ0VTID0gamFja19jbGllbnQuYworamFja19jbGllbnRfQ0ZMQUdTID0gJChHU1RfQ0ZMQUdTKSAkKEdUS19DRkxBR1MpICQoSkFDS19DRkxBR1MpCitqYWNrX2NsaWVudF9MREZMQUdTID0gJChHU1RfTElCUykgJChHVEtfTElCUykgJChKQUNLX0xJQlMpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL2phY2svamFja19jbGllbnQuYyBiL3Rlc3RzL2V4YW1wbGVzL2phY2svamFja19jbGllbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjljZWRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvamFjay9qYWNrX2NsaWVudC5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qIFRoaXMgYXBwIGRlbW9uc3RyYXRlcyB0aGUgY3JlYXRpb24gYW5kIHVzZSBvZiBhIGphY2sgY2xpZW50IGluIGNvbmp1bmN0aW9uCisgKiB3aXRoIHRoZSBqYWNrIHBsdWdpbnMuIFRoaXMgd2F5LCBhbiBhcHBsaWNhdGlvbiBjYW4gY29udHJvbCB0aGUgamFjayBjbGllbnQKKyAqIGRpcmVjdGx5LgorICovCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3RrL2d0ay5oPgorI2luY2x1ZGUgPGphY2svamFjay5oPgorCitzdGF0aWMgZ2Jvb2xlYW4KK3F1aXRfY2IgKGdwb2ludGVyIGRhdGEpCit7CisgIGd0a19tYWluX3F1aXQgKCk7CisgIHJldHVybiBGQUxTRTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGphY2tfY2xpZW50X3QgKnNyY19jbGllbnQsICpzaW5rX2NsaWVudDsKKyAgamFja19zdGF0dXNfdCBzdGF0dXM7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lLCAqc3JjLCAqc2luazsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIGdzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIC8qIGNyZWF0ZSBqYWNrIGNsaWVudHMgKi8KKyAgc3JjX2NsaWVudCA9IGphY2tfY2xpZW50X29wZW4gKCJzcmNfY2xpZW50IiwgSmFja05vU3RhcnRTZXJ2ZXIsICZzdGF0dXMpOworICBpZiAoc3JjX2NsaWVudCA9PSBOVUxMKSB7CisgICAgaWYgKHN0YXR1cyAmIEphY2tTZXJ2ZXJGYWlsZWQpCisgICAgICBnX3ByaW50ICgiSkFDSyBzZXJ2ZXIgbm90IHJ1bm5pbmdcbiIpOworICAgIGVsc2UKKyAgICAgIGdfcHJpbnQgKCJqYWNrX2NsaWVudF9vcGVuKCkgZmFpbGVkLCBzdGF0dXMgPSAweCUyLjB4XG4iLCBzdGF0dXMpOworICAgIHJldHVybiAxOworICB9CisKKyAgc2lua19jbGllbnQgPSBqYWNrX2NsaWVudF9vcGVuICgic2lua19jbGllbnQiLCBKYWNrTm9TdGFydFNlcnZlciwgJnN0YXR1cyk7CisgIGlmIChzaW5rX2NsaWVudCA9PSBOVUxMKSB7CisgICAgaWYgKHN0YXR1cyAmIEphY2tTZXJ2ZXJGYWlsZWQpCisgICAgICBnX3ByaW50ICgiSkFDSyBzZXJ2ZXIgbm90IHJ1bm5pbmdcbiIpOworICAgIGVsc2UKKyAgICAgIGdfcHJpbnQgKCJqYWNrX2NsaWVudF9vcGVuKCkgZmFpbGVkLCBzdGF0dXMgPSAweCUyLjB4XG4iLCBzdGF0dXMpOworICAgIHJldHVybiAxOworICB9CisKKyAgLyogY3JlYXRlIGdzdCBlbGVtZW50cyAqLworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKCJteV9waXBlbGluZSIpOworCisgIHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImphY2thdWRpb3NyYyIsIE5VTEwpOworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiamFja2F1ZGlvc2luayIsIE5VTEwpOworCisgIGdfb2JqZWN0X3NldCAoc3JjLCAiY2xpZW50Iiwgc3JjX2NsaWVudCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc2luaywgImNsaWVudCIsIHNpbmtfY2xpZW50LCBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHNyYywgc2luaywgTlVMTCk7CisKKyAgLyogbGluayBldmVyeXRoaW5nIHRvZ2V0aGVyICovCisgIGlmICghZ3N0X2VsZW1lbnRfbGluayAoc3JjLCBzaW5rKSkgeworICAgIGdfcHJpbnQgKCJGYWlsZWQgdG8gbGluayBlbGVtZW50cyFcbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgLyogcnVuICovCisgIHJldCA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgaWYgKHJldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpIHsKKyAgICBnX3ByaW50ICgiRmFpbGVkIHRvIHN0YXJ0IHVwIHBpcGVsaW5lIVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvKiBxdWl0IGFmdGVyIDUgc2Vjb25kcyAqLworICBnX3RpbWVvdXRfYWRkX3NlY29uZHMgKDUsIChHU291cmNlRnVuYykgcXVpdF9jYiwgTlVMTCk7CisgIGd0a19tYWluICgpOworCisgIC8qIGNsZWFuIHVwICovCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvamFjay9tZXNvbi5idWlsZCBiL3Rlc3RzL2V4YW1wbGVzL2phY2svbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhYzhhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL2phY2svbWVzb24uYnVpbGQKQEAgLTAsMCArMSw3IEBACitpZiBsaWJqYWNrX2RlcC5mb3VuZCgpCisgIGV4ZWN1dGFibGUoJ2phY2tfY2xpZW50JywgJ2phY2tfY2xpZW50LmMnLAorICAgIGRlcGVuZGVuY2llczogW2dzdF9kZXAsIGd0a19kZXAsIGxpYmphY2tfZGVwXSwKKyAgICBjX2FyZ3M6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzOiBbY29uZmlnaW5jXSwKKyAgICBpbnN0YWxsOiBmYWxzZSkKK2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9sZXZlbC8uZ2l0aWdub3JlIGIvdGVzdHMvZXhhbXBsZXMvbGV2ZWwvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWVmZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvbGV2ZWwvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACitsZXZlbC1leGFtcGxlCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9sZXZlbC9NYWtlZmlsZS5hbSBiL3Rlc3RzL2V4YW1wbGVzL2xldmVsL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Y2E3MTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9sZXZlbC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQgQEAKK25vaW5zdF9QUk9HUkFNUyA9IGxldmVsLWV4YW1wbGUKK2xldmVsX2V4YW1wbGVfQ0ZMQUdTID0gJChHU1RfQ0ZMQUdTKQorbGV2ZWxfZXhhbXBsZV9MREFERCA9ICQoR1NUX0xJQlMpICQoTElCTSkKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvbGV2ZWwvbGV2ZWwtZXhhbXBsZS5jIGIvdGVzdHMvZXhhbXBsZXMvbGV2ZWwvbGV2ZWwtZXhhbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NTMxNzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9sZXZlbC9sZXZlbC1leGFtcGxlLmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEsMjAwMiwyMDAzLDIwMDUKKyAqICAgICAgICAgICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2RlZmluZSBHTElCX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworc3RhdGljIGdib29sZWFuCittZXNzYWdlX2hhbmRsZXIgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsIGdwb2ludGVyIGRhdGEpCit7CisKKyAgaWYgKG1lc3NhZ2UtPnR5cGUgPT0gR1NUX01FU1NBR0VfRUxFTUVOVCkgeworICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9tZXNzYWdlX2dldF9zdHJ1Y3R1cmUgKG1lc3NhZ2UpOworICAgIGNvbnN0IGdjaGFyICpuYW1lID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyk7CisKKyAgICBpZiAoc3RyY21wIChuYW1lLCAibGV2ZWwiKSA9PSAwKSB7CisgICAgICBnaW50IGNoYW5uZWxzOworICAgICAgR3N0Q2xvY2tUaW1lIGVuZHRpbWU7CisgICAgICBnZG91YmxlIHJtc19kQiwgcGVha19kQiwgZGVjYXlfZEI7CisgICAgICBnZG91YmxlIHJtczsKKyAgICAgIGNvbnN0IEdWYWx1ZSAqYXJyYXlfdmFsOworICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZTsKKyAgICAgIEdWYWx1ZUFycmF5ICpybXNfYXJyLCAqcGVha19hcnIsICpkZWNheV9hcnI7CisgICAgICBnaW50IGk7CisKKyAgICAgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfY2xvY2tfdGltZSAocywgImVuZHRpbWUiLCAmZW5kdGltZSkpCisgICAgICAgIGdfd2FybmluZyAoIkNvdWxkIG5vdCBwYXJzZSBlbmR0aW1lIik7CisKKyAgICAgIC8qIHRoZSB2YWx1ZXMgYXJlIHBhY2tlZCBpbnRvIEdWYWx1ZUFycmF5cyB3aXRoIHRoZSB2YWx1ZSBwZXIgY2hhbm5lbCAqLworICAgICAgYXJyYXlfdmFsID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJybXMiKTsKKyAgICAgIHJtc19hcnIgPSAoR1ZhbHVlQXJyYXkgKikgZ192YWx1ZV9nZXRfYm94ZWQgKGFycmF5X3ZhbCk7CisKKyAgICAgIGFycmF5X3ZhbCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAicGVhayIpOworICAgICAgcGVha19hcnIgPSAoR1ZhbHVlQXJyYXkgKikgZ192YWx1ZV9nZXRfYm94ZWQgKGFycmF5X3ZhbCk7CisKKyAgICAgIGFycmF5X3ZhbCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAiZGVjYXkiKTsKKyAgICAgIGRlY2F5X2FyciA9IChHVmFsdWVBcnJheSAqKSBnX3ZhbHVlX2dldF9ib3hlZCAoYXJyYXlfdmFsKTsKKworICAgICAgLyogd2UgY2FuIGdldCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGFzIHRoZSBsZW5ndGggb2YgYW55IG9mIHRoZSB2YWx1ZQorICAgICAgICogYXJyYXlzICovCisgICAgICBjaGFubmVscyA9IHJtc19hcnItPm5fdmFsdWVzOworICAgICAgZ19wcmludCAoImVuZHRpbWU6ICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBjaGFubmVsczogJWRcbiIsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZW5kdGltZSksIGNoYW5uZWxzKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgKytpKSB7CisKKyAgICAgICAgZ19wcmludCAoImNoYW5uZWwgJWRcbiIsIGkpOworICAgICAgICB2YWx1ZSA9IGdfdmFsdWVfYXJyYXlfZ2V0X250aCAocm1zX2FyciwgaSk7CisgICAgICAgIHJtc19kQiA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworCisgICAgICAgIHZhbHVlID0gZ192YWx1ZV9hcnJheV9nZXRfbnRoIChwZWFrX2FyciwgaSk7CisgICAgICAgIHBlYWtfZEIgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKworICAgICAgICB2YWx1ZSA9IGdfdmFsdWVfYXJyYXlfZ2V0X250aCAoZGVjYXlfYXJyLCBpKTsKKyAgICAgICAgZGVjYXlfZEIgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgICAgZ19wcmludCAoIiAgICBSTVM6ICVmIGRCLCBwZWFrOiAlZiBkQiwgZGVjYXk6ICVmIGRCXG4iLAorICAgICAgICAgICAgcm1zX2RCLCBwZWFrX2RCLCBkZWNheV9kQik7CisKKyAgICAgICAgLyogY29udmVydGluZyBmcm9tIGRCIHRvIG5vcm1hbCBnaXZlcyB1cyBhIHZhbHVlIGJldHdlZW4gMC4wIGFuZCAxLjAgKi8KKyAgICAgICAgcm1zID0gcG93ICgxMCwgcm1zX2RCIC8gMjApOworICAgICAgICBnX3ByaW50ICgiICAgIG5vcm1hbGl6ZWQgcm1zIHZhbHVlOiAlZlxuIiwgcm1zKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogd2UgaGFuZGxlZCB0aGUgbWVzc2FnZSB3ZSB3YW50LCBhbmQgaWdub3JlZCB0aGUgb25lcyB3ZSBkaWRuJ3Qgd2FudC4KKyAgICogc28gdGhlIGNvcmUgY2FuIHVucmVmIHRoZSBtZXNzYWdlIGZvciB1cyAqLworICByZXR1cm4gVFJVRTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBHc3RFbGVtZW50ICphdWRpb3Rlc3RzcmMsICphdWRpb2NvbnZlcnQsICpsZXZlbCwgKmZha2VzaW5rOworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0QnVzICpidXM7CisgIGd1aW50IHdhdGNoX2lkOworICBHTWFpbkxvb3AgKmxvb3A7CisKKyAgZ3N0X2luaXQgKCZhcmdjLCAmYXJndik7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nICgiYXVkaW8veC1yYXcsY2hhbm5lbHM9MiIpOworCisgIHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoTlVMTCk7CisgIGdfYXNzZXJ0IChwaXBlbGluZSk7CisgIGF1ZGlvdGVzdHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvdGVzdHNyYyIsIE5VTEwpOworICBnX2Fzc2VydCAoYXVkaW90ZXN0c3JjKTsKKyAgYXVkaW9jb252ZXJ0ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW9jb252ZXJ0IiwgTlVMTCk7CisgIGdfYXNzZXJ0IChhdWRpb2NvbnZlcnQpOworICBsZXZlbCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImxldmVsIiwgTlVMTCk7CisgIGdfYXNzZXJ0IChsZXZlbCk7CisgIGZha2VzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCBOVUxMKTsKKyAgZ19hc3NlcnQgKGZha2VzaW5rKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIGF1ZGlvdGVzdHNyYywgYXVkaW9jb252ZXJ0LCBsZXZlbCwKKyAgICAgIGZha2VzaW5rLCBOVUxMKTsKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rIChhdWRpb3Rlc3RzcmMsIGF1ZGlvY29udmVydCkpCisgICAgZ19lcnJvciAoIkZhaWxlZCB0byBsaW5rIGF1ZGlvdGVzdHNyYyBhbmQgYXVkaW9jb252ZXJ0Iik7CisgIGlmICghZ3N0X2VsZW1lbnRfbGlua19maWx0ZXJlZCAoYXVkaW9jb252ZXJ0LCBsZXZlbCwgY2FwcykpCisgICAgZ19lcnJvciAoIkZhaWxlZCB0byBsaW5rIGF1ZGlvY29udmVydCBhbmQgbGV2ZWwiKTsKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rIChsZXZlbCwgZmFrZXNpbmspKQorICAgIGdfZXJyb3IgKCJGYWlsZWQgdG8gbGluayBsZXZlbCBhbmQgZmFrZXNpbmsiKTsKKworICAvKiBtYWtlIHN1cmUgd2UnbGwgZ2V0IG1lc3NhZ2VzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGxldmVsKSwgInBvc3QtbWVzc2FnZXMiLCBUUlVFLCBOVUxMKTsKKyAgLyogcnVuIHN5bmNlZCBhbmQgbm90IGFzIGZhc3QgYXMgd2UgY2FuICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGZha2VzaW5rKSwgInN5bmMiLCBUUlVFLCBOVUxMKTsKKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChwaXBlbGluZSk7CisgIHdhdGNoX2lkID0gZ3N0X2J1c19hZGRfd2F0Y2ggKGJ1cywgbWVzc2FnZV9oYW5kbGVyLCBOVUxMKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgLyogd2UgbmVlZCB0byBydW4gYSBHTGliIG1haW4gbG9vcCB0byBnZXQgdGhlIG1lc3NhZ2VzICovCisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIEZBTFNFKTsKKyAgZ19tYWluX2xvb3BfcnVuIChsb29wKTsKKworICBnX3NvdXJjZV9yZW1vdmUgKHdhdGNoX2lkKTsKKyAgZ19tYWluX2xvb3BfdW5yZWYgKGxvb3ApOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL2xldmVsL21lc29uLmJ1aWxkIGIvdGVzdHMvZXhhbXBsZXMvbGV2ZWwvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlMzI0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL2xldmVsL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsNSBAQAorZXhlY3V0YWJsZSgnbGV2ZWwtZXhhbXBsZScsICdsZXZlbC1leGFtcGxlLmMnLAorICBkZXBlbmRlbmNpZXM6IFtnc3RfZGVwLCBsaWJtXSwKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgIGluc3RhbGw6IGZhbHNlKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvbWVzb24uYnVpbGQgYi90ZXN0cy9leGFtcGxlcy9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzY2YzU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxNCBAQAorc3ViZGlyKCdhdWRpb2Z4JykKK3N1YmRpcignY2Fpcm8nKQorI0ZJWE1FOiBzdWJkaXIoJ2d0aycpCitzdWJkaXIoJ2xldmVsJykKK3N1YmRpcigncnRwJykKK3N1YmRpcignc2hhcGV3aXBlJykKK3N1YmRpcigndjRsMicpCisKK2lmIGd0a19kZXAuZm91bmQoKQorICBzdWJkaXIoJ2VxdWFsaXplcicpCisgIHN1YmRpcignamFjaycpCisgIHN1YmRpcignc3BlY3RydW0nKQorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwLy5naXRpZ25vcmUgYi90ZXN0cy9leGFtcGxlcy9ydHAvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzNjNmQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvcnRwLy5naXRpZ25vcmUKQEAgLTAsMCArMSw2IEBACitjbGllbnQtUENNQQorc2VydmVyLWFsc2FzcmMtUENNQQorY2xpZW50LXJ0cGF1eAorc2VydmVyLXJ0cGF1eAorY2xpZW50LXJ0cGJ1bmRsZQorc2VydmVyLXJ0cGJ1bmRsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL01ha2VmaWxlLmFtIGIvdGVzdHMvZXhhbXBsZXMvcnRwL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkN2Y3YzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ydHAvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NCBAQAorbm9pbnN0X1BST0dSQU1TID0gc2VydmVyLWFsc2FzcmMtUENNQSBjbGllbnQtUENNQSBcCisJY2xpZW50LXJ0cGF1eCBzZXJ2ZXItcnRwYXV4IGNsaWVudC1ydHBidW5kbGUgc2VydmVyLXJ0cGJ1bmRsZQorCisjIEZJWE1FIDAuMTE6IGlnbm9yZSBHVmFsdWVBcnJheSB3YXJuaW5ncyBmb3Igbm93IHVudGlsIHRoaXMgaXMgc29ydGVkCitFUlJPUl9DRkxBR1M9CisKK3NlcnZlcl9ydHBhdXhfU09VUkNFUyA9IHNlcnZlci1ydHBhdXguYworc2VydmVyX3J0cGF1eF9DRkxBR1MgPSAkKEdTVF9DRkxBR1MpICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpCitzZXJ2ZXJfcnRwYXV4X0xEQUREID0gJChHU1RfTElCUykKKworY2xpZW50X3J0cGF1eF9TT1VSQ0VTID0gY2xpZW50LXJ0cGF1eC5jCitjbGllbnRfcnRwYXV4X0NGTEFHUyA9ICQoR1NUX0NGTEFHUykgJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykKK2NsaWVudF9ydHBhdXhfTERBREQgPSAkKEdTVF9MSUJTKQorCitzZXJ2ZXJfcnRwYnVuZGxlX1NPVVJDRVMgPSBzZXJ2ZXItcnRwYnVuZGxlLmMKK3NlcnZlcl9ydHBidW5kbGVfQ0ZMQUdTID0gJChHU1RfQ0ZMQUdTKSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKQorc2VydmVyX3J0cGJ1bmRsZV9MREFERCA9ICQoR1NUX0xJQlMpCisKK2NsaWVudF9ydHBidW5kbGVfU09VUkNFUyA9IGNsaWVudC1ydHBidW5kbGUuYworY2xpZW50X3J0cGJ1bmRsZV9DRkxBR1MgPSAkKEdTVF9DRkxBR1MpICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpCitjbGllbnRfcnRwYnVuZGxlX0xEQUREID0gJChHU1RfTElCUykKKworc2VydmVyX2Fsc2FzcmNfUENNQV9TT1VSQ0VTID0gc2VydmVyLWFsc2FzcmMtUENNQS5jCitzZXJ2ZXJfYWxzYXNyY19QQ01BX0NGTEFHUyA9ICQoR1NUX0NGTEFHUykKK3NlcnZlcl9hbHNhc3JjX1BDTUFfTERBREQgPSAkKEdTVF9MSUJTKSAkKExJQk0pCisKK2NsaWVudF9QQ01BX1NPVVJDRVMgPSBjbGllbnQtUENNQS5jCitjbGllbnRfUENNQV9DRkxBR1MgPSAkKEdTVF9DRkxBR1MpCitjbGllbnRfUENNQV9MREFERCA9ICQoR1NUX0xJQlMpICQoTElCTSkKKworbm9pbnN0X1NDUklQVFM9Y2xpZW50LUgyNjNwLUFNUi5zaCBcCisgICAgICAgICAgICAgICBjbGllbnQtSDI2M3AtUENNQS5zaCBcCisgICAgICAgICAgICAgICBjbGllbnQtSDI2NC1QQ01BLnNoIFwKKyAgICAgICAgICAgICAgIGNsaWVudC1WUDgtT1BVUy5zaCBcCisgICAgICAgICAgICAgICBjbGllbnQtUENNQS5zaCBcCisgICAgICAgICAgICAgICBzZXJ2ZXItYWxzYXNyYy1QQ01BLnNoIFwKKyAgICAgICAgICAgICAgIHNlcnZlci12NGwyLUgyNjNwLWFsc2FzcmMtQU1SLnNoIFwKKyAgICAgICAgICAgICAgIHNlcnZlci12NGwyLUgyNjQtYWxzYXNyYy1QQ01BLnNoIFwKKyAgICAgICAgICAgICAgIHNlcnZlci1WVFMtSDI2M3AtQVRTLVBDTUEuc2ggXAorICAgICAgICAgICAgICAgc2VydmVyLVZUUy1WUDgtQVRTLU9QVVMuc2gKKworRVhUUkFfRElTVD0gJChub2luc3RfU0NSSVBUUykgXAorCSAgICBjbGllbnQtSDI2M3AtUENNQS5zZHAgXAorICAgICAgICAgICAgY2xpZW50LUgyNjQtUENNQS5zZHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3AtQU1SLnNoIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC1BTVIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmJhNTE1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3AtQU1SLnNoCkBAIC0wLDAgKzEsMjMgQEAKKyMhL2Jpbi9zaAorIworIyBBIHNpbXBsZSBSVFAgcmVjZWl2ZXIgCisjCisKK1ZJREVPX0NBUFM9ImFwcGxpY2F0aW9uL3gtcnRwLG1lZGlhPShzdHJpbmcpdmlkZW8sY2xvY2stcmF0ZT0oaW50KTkwMDAwLGVuY29kaW5nLW5hbWU9KHN0cmluZylIMjYzLTE5OTgiCitBVURJT19DQVBTPSJhcHBsaWNhdGlvbi94LXJ0cCxtZWRpYT0oc3RyaW5nKWF1ZGlvLGNsb2NrLXJhdGU9KGludCk4MDAwLGVuY29kaW5nLW5hbWU9KHN0cmluZylBTVIsZW5jb2RpbmctcGFyYW1zPShzdHJpbmcpMSxvY3RldC1hbGlnbj0oc3RyaW5nKTEiCisKK1ZJREVPX0RFQz0icnRwaDI2M3BkZXBheSAhIGF2ZGVjX2gyNjMiCitBVURJT19ERUM9InJ0cGFtcmRlcGF5ICEgYW1ybmJkZWMiCisKK1ZJREVPX1NJTks9InZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsiCitBVURJT19TSU5LPSJhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgYXV0b2F1ZGlvc2luayIKKworZ3N0LWxhdW5jaC0xLjAgLXYgcnRwYmluIG5hbWU9cnRwYmluIGxhdGVuY3k9MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB1ZHBzcmMgY2Fwcz0kVklERU9fQ0FQUyBwb3J0PTUwMDAgISBydHBiaW4ucmVjdl9ydHBfc2lua18wICAgICAgICAgICAgICBcCisJICAgICAgICAgcnRwYmluLiAhICRWSURFT19ERUMgISAkVklERU9fU0lOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB1ZHBzcmMgcG9ydD01MDAxICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHJ0cGJpbi5zZW5kX3J0Y3Bfc3JjXzAgISB1ZHBzaW5rIHBvcnQ9NTAwNSBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlICAgICAgIFwKKwkgICB1ZHBzcmMgY2Fwcz0kQVVESU9fQ0FQUyBwb3J0PTUwMDIgISBydHBiaW4ucmVjdl9ydHBfc2lua18xICAgICAgICAgICAgICBcCisJICAgICAgICAgcnRwYmluLiAhICRBVURJT19ERUMgISAkQVVESU9fU0lOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB1ZHBzcmMgcG9ydD01MDAzICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHJ0cGJpbi5zZW5kX3J0Y3Bfc3JjXzEgISB1ZHBzaW5rIHBvcnQ9NTAwNyBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLVBDTUEuc2RwIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC1QQ01BLnNkcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDIyNjRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC1QQ01BLnNkcApAQCAtMCwwICsxLDEyIEBACit2PTAKK289LSAxMTg4MzQwNjU2MTgwODgzIDEgSU4gSVA0IDEyNy4wLjAuMQorcz1TZXNzaW9uIHN0cmVhbWVkIGJ5IEdTdHJlYW1lcgoraT1zZXJ2ZXIuc2gKK3Q9MCAwCithPXRvb2w6R1N0cmVhbWVyCithPXR5cGU6YnJvYWRjYXN0CittPXZpZGVvIDUwMDAgUlRQL0FWUCA5NgorYz1JTiBJUDQgMTI3LjAuMC4xCithPXJ0cG1hcDo5NiBIMjYzLTE5OTgvOTAwMDAKK209YXVkaW8gNTAwMiBSVFAvQVZQIDgKK2M9SU4gSVA0IDEyNy4wLjAuMQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC1QQ01BLnNoIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC1QQ01BLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU3OTQxOGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLVBDTUEuc2gKQEAgLTAsMCArMSwyOCBAQAorIyEvYmluL3NoCisjCisjIEEgc2ltcGxlIFJUUCByZWNlaXZlciAKKyMKKworVklERU9fQ0FQUz0iYXBwbGljYXRpb24veC1ydHAsbWVkaWE9KHN0cmluZyl2aWRlbyxjbG9jay1yYXRlPShpbnQpOTAwMDAsZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjMtMTk5OCIKK0FVRElPX0NBUFM9ImFwcGxpY2F0aW9uL3gtcnRwLG1lZGlhPShzdHJpbmcpYXVkaW8sY2xvY2stcmF0ZT0oaW50KTgwMDAsZW5jb2RpbmctbmFtZT0oc3RyaW5nKVBDTUEiCisKKyNERVNUPTE5Mi4xNjguMS4xMjYKK0RFU1Q9bG9jYWxob3N0CisKK1ZJREVPX0RFQz0icnRwaDI2M3BkZXBheSAhIGF2ZGVjX2gyNjMiCitBVURJT19ERUM9InJ0cHBjbWFkZXBheSAhIGFsYXdkZWMiCisKK1ZJREVPX1NJTks9InZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsiCitBVURJT19TSU5LPSJhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgYXV0b2F1ZGlvc2luayIKKworTEFURU5DWT0xMDAKKworZ3N0LWxhdW5jaC0xLjAgLXYgcnRwYmluIG5hbWU9cnRwYmluIGxhdGVuY3k9JExBVEVOQ1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHVkcHNyYyBjYXBzPSRWSURFT19DQVBTIHBvcnQ9NTAwMCAhIHJ0cGJpbi5yZWN2X3J0cF9zaW5rXzAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAgIHJ0cGJpbi4gISAkVklERU9fREVDICEgJFZJREVPX1NJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB1ZHBzcmMgcG9ydD01MDAxICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMCAhIHVkcHNpbmsgaG9zdD0kREVTVCBwb3J0PTUwMDUgc3luYz1mYWxzZSBhc3luYz1mYWxzZSBcCisJICAgdWRwc3JjIGNhcHM9JEFVRElPX0NBUFMgcG9ydD01MDAyICEgcnRwYmluLnJlY3ZfcnRwX3NpbmtfMSAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICAgcnRwYmluLiAhICRBVURJT19ERUMgISAkQVVESU9fU0lOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHVkcHNyYyBwb3J0PTUwMDMgISBydHBiaW4ucmVjdl9ydGNwX3NpbmtfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18xICEgdWRwc2luayBob3N0PSRERVNUIHBvcnQ9NTAwNyBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLnNkcCBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3Auc2RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZDQ3OWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLnNkcApAQCAtMCwwICsxLDEwIEBACit2PTAKK289LSAxMTg4MzQwNjU2MTgwODgzIDEgSU4gSVA0IDEyNy4wLjAuMQorcz1TZXNzaW9uIHN0cmVhbWVkIGJ5IEdTdHJlYW1lcgoraT1zZXJ2ZXIuc2gKK3Q9MCAwCithPXRvb2w6R1N0cmVhbWVyCithPXR5cGU6YnJvYWRjYXN0CittPXZpZGVvIDUwMDAgUlRQL0FWUCA5NgorYz1JTiBJUDQgMTI3LjAuMC4xCithPXJ0cG1hcDo5NiBIMjYzLTE5OTgvOTAwMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3Auc2ggYi90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYwMDI4NDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLnNoCkBAIC0wLDAgKzEsMjEgQEAKKyMhL2Jpbi9zaAorIworIyBBIHNpbXBsZSBSVFAgcmVjZWl2ZXIgCisjCisKK1ZJREVPX0NBUFM9ImFwcGxpY2F0aW9uL3gtcnRwLG1lZGlhPShzdHJpbmcpdmlkZW8sY2xvY2stcmF0ZT0oaW50KTkwMDAwLGVuY29kaW5nLW5hbWU9KHN0cmluZylIMjYzLTE5OTgiCisKKyNERVNUPTE5Mi4xNjguMS4xMjYKK0RFU1Q9bG9jYWxob3N0CisKK1ZJREVPX0RFQz0icnRwaDI2M3BkZXBheSAhIGF2ZGVjX2gyNjMiCisKK1ZJREVPX1NJTks9InZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsiCisKK0xBVEVOQ1k9MTAwCisKK2dzdC1sYXVuY2gtMS4wIC12IHJ0cGJpbiBuYW1lPXJ0cGJpbiBsYXRlbmN5PSRMQVRFTkNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB1ZHBzcmMgY2Fwcz0kVklERU9fQ0FQUyBwb3J0PTUwMDAgISBydHBiaW4ucmVjdl9ydHBfc2lua18wICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgICBydHBiaW4uICEgJFZJREVPX0RFQyAhICRWSURFT19TSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgdWRwc3JjIHBvcnQ9NTAwMSAhIHJ0cGJpbi5yZWN2X3J0Y3Bfc2lua18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHJ0cGJpbi5zZW5kX3J0Y3Bfc3JjXzAgISB1ZHBzaW5rIGhvc3Q9JERFU1QgcG9ydD01MDA1IHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2NC1QQ01BLnNkcCBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2NC1QQ01BLnNkcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWFhNzVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LVBDTUEuc2RwCkBAIC0wLDAgKzEsMTIgQEAKK3Y9MAorbz0tIDExODgzNDA2NTYxODA4ODMgMSBJTiBJUDQgMTI3LjAuMC4xCitzPVNlc3Npb24gc3RyZWFtZWQgYnkgR1N0cmVhbWVyCitpPXNlcnZlci5zaAordD0wIDAKK2E9dG9vbDpHU3RyZWFtZXIKK2E9dHlwZTpicm9hZGNhc3QKK209dmlkZW8gNTAwMCBSVFAvQVZQIDk2CitjPUlOIElQNCAxMjcuMC4wLjEKK2E9cnRwbWFwOjk2IEgyNjQvOTAwMDAKK209YXVkaW8gNTAwMiBSVFAvQVZQIDgKK2M9SU4gSVA0IDEyNy4wLjAuMQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LVBDTUEuc2ggYi90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjQtUENNQS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MjBkNGUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LVBDTUEuc2gKQEAgLTAsMCArMSw2NCBAQAorIyEvYmluL3NoCisjCisjIEEgc2ltcGxlIFJUUCByZWNlaXZlcgorIworIyAgcmVjZWl2ZXMgSDI2NCBlbmNvZGVkIFJUUCB2aWRlbyBvbiBwb3J0IDUwMDAsIFJUQ1AgaXMgcmVjZWl2ZWQgb24gIHBvcnQgNTAwMS4KKyMgIHRoZSByZWNlaXZlciBSVENQIHJlcG9ydHMgYXJlIHNlbnQgdG8gcG9ydCA1MDA1CisjICByZWNlaXZlcyBhbGF3IGVuY29kZWQgUlRQIGF1ZGlvIG9uIHBvcnQgNTAwMiwgUlRDUCBpcyByZWNlaXZlZCBvbiAgcG9ydCA1MDAzLgorIyAgdGhlIHJlY2VpdmVyIFJUQ1AgcmVwb3J0cyBhcmUgc2VudCB0byBwb3J0IDUwMDcKKyMKKyMgICAgICAgICAgICAgLi0tLS0tLS0uICAgICAgLi0tLS0tLS0tLS0uICAgICAuLS0tLS0tLS0tLiAgIC4tLS0tLS0tLiAgIC4tLS0tLS0tLS0tLS4KKyMgIFJUUCAgICAgICAgfHVkcHNyYyB8ICAgICAgfCBydHBiaW4gICB8ICAgICB8aDI2NGRlcGF5fCAgIHxoMjY0ZGVjfCAgIHx4dmltYWdlc2lua3wKKyMgIHBvcnQ9NTAwMCAgfCAgICAgIHNyYy0+cmVjdl9ydHAgcmVjdl9ydHAtPnNpbmsgICAgIHNyYy0+c2luayAgIHNyYy0+c2luayAgICAgICAgIHwKKyMgICAgICAgICAgICAgJy0tLS0tLS0nICAgICAgfCAgICAgICAgICB8ICAgICAnLS0tLS0tLS0tJyAgICctLS0tLS0tJyAgICctLS0tLS0tLS0tLScKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgLi0tLS0tLS0uCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgfHVkcHNpbmt8ICBSVENQCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgc2VuZF9ydGNwLT5zaW5rICAgICB8IHBvcnQ9NTAwNQorIyAgICAgICAgICAgICAuLS0tLS0tLS4gICAgICB8ICAgICAgICAgIHwgICAgICctLS0tLS0tJyBzeW5jPWZhbHNlCisjICBSVENQICAgICAgIHx1ZHBzcmMgfCAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgIGFzeW5jPWZhbHNlCisjICBwb3J0PTUwMDEgIHwgICAgIHNyYy0+cmVjdl9ydGNwICAgICAgfAorIyAgICAgICAgICAgICAnLS0tLS0tLScgICAgICB8ICAgICAgICAgIHwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8CisjICAgICAgICAgICAgIC4tLS0tLS0tLiAgICAgIHwgICAgICAgICAgfCAgICAgLi0tLS0tLS0tLS4gICAuLS0tLS0tLS4gICAuLS0tLS0tLS0tLS0tLS4KKyMgIFJUUCAgICAgICAgfHVkcHNyYyB8ICAgICAgfCBydHBiaW4gICB8ICAgICB8cGNtYWRlcGF5fCAgIHxhbGF3ZGVjfCAgIHxhdXRvYXVkaW9zaW5rfAorIyAgcG9ydD01MDAyICB8ICAgICAgc3JjLT5yZWN2X3J0cCByZWN2X3J0cC0+c2luayAgICAgc3JjLT5zaW5rICAgc3JjLT5zaW5rICAgICAgICAgICB8CisjICAgICAgICAgICAgICctLS0tLS0tJyAgICAgIHwgICAgICAgICAgfCAgICAgJy0tLS0tLS0tLScgICAnLS0tLS0tLScgICAnLS0tLS0tLS0tLS0tLScKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgLi0tLS0tLS0uCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgfHVkcHNpbmt8ICBSVENQCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgc2VuZF9ydGNwLT5zaW5rICAgICB8IHBvcnQ9NTAwNworIyAgICAgICAgICAgICAuLS0tLS0tLS4gICAgICB8ICAgICAgICAgIHwgICAgICctLS0tLS0tJyBzeW5jPWZhbHNlCisjICBSVENQICAgICAgIHx1ZHBzcmMgfCAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgIGFzeW5jPWZhbHNlCisjICBwb3J0PTUwMDMgIHwgICAgIHNyYy0+cmVjdl9ydGNwICAgICAgfAorIyAgICAgICAgICAgICAnLS0tLS0tLScgICAgICAnLS0tLS0tLS0tLScKKworIyB0aGUgZGVzdGluYXRpb24gbWFjaGluZSB0byBzZW5kIFJUQ1AgdG8uIFRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlbmRlciBhbmQKKyMgaXMgdXNlZCB0byBzZW5kIGJhY2sgdGhlIFJUQ1AgcmVwb3J0cyBvZiB0aGlzIHJlY2VpdmVyLiBJZiB0aGUgZGF0YSBpcyBzZW50CisjIGZyb20gYW5vdGhlciBtYWNoaW5lLCBjaGFuZ2UgdGhpcyBhZGRyZXNzLgorREVTVD0xMjcuMC4wLjEKKworIyB0aGlzIGFkanVzdHMgdGhlIGxhdGVuY3kgaW4gdGhlIHJlY2VpdmVyCitMQVRFTkNZPTIwMAorCisjIHRoZSBjYXBzIG9mIHRoZSBzZW5kZXIgUlRQIHN0cmVhbS4gVGhpcyBpcyB1c3VhbGx5IG5lZ290aWF0ZWQgb3V0IG9mIGJhbmQgd2l0aAorIyBTRFAgb3IgUlRTUC4gbm9ybWFsbHkgdGhlc2UgY2FwcyB3aWxsIGFsc28gaW5jbHVkZSBTUFMgYW5kIFBQUyBidXQgd2UgZG9uJ3QKKyMgaGF2ZSBhIG1lY2hhbmlzbSB0byBnZXQgdGhpcyBmcm9tIHRoZSBzZW5kZXIgd2l0aCBhIC1sYXVuY2ggbGluZS4KK1ZJREVPX0NBUFM9ImFwcGxpY2F0aW9uL3gtcnRwLG1lZGlhPShzdHJpbmcpdmlkZW8sY2xvY2stcmF0ZT0oaW50KTkwMDAwLGVuY29kaW5nLW5hbWU9KHN0cmluZylIMjY0IgorQVVESU9fQ0FQUz0iYXBwbGljYXRpb24veC1ydHAsbWVkaWE9KHN0cmluZylhdWRpbyxjbG9jay1yYXRlPShpbnQpODAwMCxlbmNvZGluZy1uYW1lPShzdHJpbmcpUENNQSIKKworVklERU9fREVDPSJydHBoMjY0ZGVwYXkgISBhdmRlY19oMjY0IgorQVVESU9fREVDPSJydHBwY21hZGVwYXkgISBhbGF3ZGVjIgorCitWSURFT19TSU5LPSJ2aWRlb2NvbnZlcnQgISBhdXRvdmlkZW9zaW5rIgorQVVESU9fU0lOSz0iYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIGF1dG9hdWRpb3NpbmsiCisKK2dzdC1sYXVuY2gtMS4wIC12IHJ0cGJpbiBuYW1lPXJ0cGJpbiBsYXRlbmN5PSRMQVRFTkNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgdWRwc3JjIGNhcHM9JFZJREVPX0NBUFMgcG9ydD01MDAwICEgcnRwYmluLnJlY3ZfcnRwX3NpbmtfMCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJ0cGJpbi4gISAkVklERU9fREVDICEgJFZJREVPX1NJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHVkcHNyYyBwb3J0PTUwMDEgISBydHBiaW4ucmVjdl9ydGNwX3NpbmtfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIHJ0cGJpbi5zZW5kX3J0Y3Bfc3JjXzAgISB1ZHBzaW5rIHBvcnQ9NTAwNSBob3N0PSRERVNUIHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UgXAorICAgICB1ZHBzcmMgY2Fwcz0kQVVESU9fQ0FQUyBwb3J0PTUwMDIgISBydHBiaW4ucmVjdl9ydHBfc2lua18xICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcnRwYmluLiAhICRBVURJT19ERUMgISAkQVVESU9fU0lOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgdWRwc3JjIHBvcnQ9NTAwMyAhIHJ0cGJpbi5yZWN2X3J0Y3Bfc2lua18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMSAhIHVkcHNpbmsgcG9ydD01MDA3IGhvc3Q9JERFU1Qgc3luYz1mYWxzZSBhc3luYz1mYWxzZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LXJ0eC5zaCBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2NC1ydHguc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmU1M2Y2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2NC1ydHguc2gKQEAgLTAsMCArMSw0MiBAQAorIyEvYmluL3NoCisjCisjIEEgc2ltcGxlIFJUUCByZWNlaXZlciB3aXRoIHJldHJhbnNtaXNzaW9uCisjCisjICByZWNlaXZlcyBIMjY0IGVuY29kZWQgUlRQIHZpZGVvIG9uIHBvcnQgNTAwMCwgUlRDUCBpcyByZWNlaXZlZCBvbiAgcG9ydCA1MDAxLgorIyAgdGhlIHJlY2VpdmVyIFJUQ1AgcmVwb3J0cyBhcmUgc2VudCB0byBwb3J0IDUwMDUKKyMKKyMgICAgICAgICAgICAgLi0tLS0tLS0uICAgICAgLi0tLS0tLS0tLS0uICAgICAuLS0tLS0tLS0tLiAgIC4tLS0tLS0tLiAgIC4tLS0tLS0tLS0tLS4KKyMgIFJUUCAgICAgICAgfHVkcHNyYyB8ICAgICAgfCBydHBiaW4gICB8ICAgICB8aDI2NGRlcGF5fCAgIHxoMjY0ZGVjfCAgIHx4dmltYWdlc2lua3wKKyMgIHBvcnQ9NTAwMCAgfCAgICAgIHNyYy0+cmVjdl9ydHAgcmVjdl9ydHAtPnNpbmsgICAgIHNyYy0+c2luayAgIHNyYy0+c2luayAgICAgICAgIHwKKyMgICAgICAgICAgICAgJy0tLS0tLS0nICAgICAgfCAgICAgICAgICB8ICAgICAnLS0tLS0tLS0tJyAgICctLS0tLS0tJyAgICctLS0tLS0tLS0tLScKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgLi0tLS0tLS0uCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgfHVkcHNpbmt8ICBSVENQCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgc2VuZF9ydGNwLT5zaW5rICAgICB8IHBvcnQ9NTAwNQorIyAgICAgICAgICAgICAuLS0tLS0tLS4gICAgICB8ICAgICAgICAgIHwgICAgICctLS0tLS0tJyBzeW5jPWZhbHNlCisjICBSVENQICAgICAgIHx1ZHBzcmMgfCAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgIGFzeW5jPWZhbHNlCisjICBwb3J0PTUwMDEgIHwgICAgIHNyYy0+cmVjdl9ydGNwICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgCisjICAgICAgICAgICAgICctLS0tLS0tJyAgICAgICctLS0tLS0tLS0tJyAgICAgICAgICAgICAgCisKKworIyB0aGUgY2FwcyBvZiB0aGUgc2VuZGVyIFJUUCBzdHJlYW0uIFRoaXMgaXMgdXN1YWxseSBuZWdvdGlhdGVkIG91dCBvZiBiYW5kIHdpdGgKKyMgU0RQIG9yIFJUU1AuIG5vcm1hbGx5IHRoZXNlIGNhcHMgd2lsbCBhbHNvIGluY2x1ZGUgU1BTIGFuZCBQUFMgYnV0IHdlIGRvbid0CisjIGhhdmUgYSBtZWNoYW5pc20gdG8gZ2V0IHRoaXMgZnJvbSB0aGUgc2VuZGVyIHdpdGggYSAtbGF1bmNoIGxpbmUuCitWSURFT19DQVBTPSJhcHBsaWNhdGlvbi94LXJ0cCxtZWRpYT0oc3RyaW5nKXZpZGVvLGNsb2NrLXJhdGU9KGludCk5MDAwMCxlbmNvZGluZy1uYW1lPShzdHJpbmcpSDI2NCIKKworVklERU9fREVDPSJydHBoMjY0ZGVwYXkgISBhdmRlY19oMjY0IgorCitWSURFT19TSU5LPSJ2aWRlb2NvbnZlcnQgISBhdXRvdmlkZW9zaW5rIgorCisjIHRoZSBkZXN0aW5hdGlvbiBtYWNoaW5lIHRvIHNlbmQgUlRDUCB0by4gVGhpcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgc2VuZGVyIGFuZAorIyBpcyB1c2VkIHRvIHNlbmQgYmFjayB0aGUgUlRDUCByZXBvcnRzIG9mIHRoaXMgcmVjZWl2ZXIuIElmIHRoZSBkYXRhIGlzIHNlbnQKKyMgZnJvbSBhbm90aGVyIG1hY2hpbmUsIGNoYW5nZSB0aGlzIGFkZHJlc3MuCitERVNUPTEyNy4wLjAuMQorCitMQVRFTkNZPTIwMAorCitnc3QtbGF1bmNoLTEuMCAtdiBydHBiaW4gbmFtZT1ydHBiaW4gcnRwLXByb2ZpbGU9YXZwZiBsYXRlbmN5PSRMQVRFTkNZIGRvLXJldHJhbnNtaXNzaW9uPTEgXAorICAgIHVkcHNyYyBjYXBzPSRWSURFT19DQVBTIHBvcnQ9NTAwMCAhIHJ0cGJpbi5yZWN2X3J0cF9zaW5rXzAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcnRwYmluLiAhICRWSURFT19ERUMgISAkVklERU9fU0lOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVkcHNyYyBwb3J0PTUwMDEgISBydHBiaW4ucmVjdl9ydGNwX3NpbmtfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMCAhIHVkcHNpbmsgcG9ydD01MDA1IGhvc3Q9JERFU1Qgc3luYz1mYWxzZSBhc3luYz1mYWxzZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LnNkcCBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2NC5zZHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU1OTNiOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2NC5zZHAKQEAgLTAsMCArMSwxMCBAQAordj0wCitvPS0gMTE4ODM0MDY1NjE4MDg4MyAxIElOIElQNCAxMjcuMC4wLjEKK3M9U2Vzc2lvbiBzdHJlYW1lZCBieSBHU3RyZWFtZXIKK2k9c2VydmVyLnNoCit0PTAgMAorYT10b29sOkdTdHJlYW1lcgorYT10eXBlOmJyb2FkY2FzdAorbT12aWRlbyA1MDAwIFJUUC9BVlAgOTYKK2M9SU4gSVA0IDEyNy4wLjAuMQorYT1ydHBtYXA6OTYgSDI2NC85MDAwMApkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LnNoIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ5MDFiNGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjQuc2gKQEAgLTAsMCArMSw0MiBAQAorIyEvYmluL3NoCisjCisjIEEgc2ltcGxlIFJUUCByZWNlaXZlciAKKyMKKyMgIHJlY2VpdmVzIEgyNjQgZW5jb2RlZCBSVFAgdmlkZW8gb24gcG9ydCA1MDAwLCBSVENQIGlzIHJlY2VpdmVkIG9uICBwb3J0IDUwMDEuCisjICB0aGUgcmVjZWl2ZXIgUlRDUCByZXBvcnRzIGFyZSBzZW50IHRvIHBvcnQgNTAwNQorIworIyAgICAgICAgICAgICAuLS0tLS0tLS4gICAgICAuLS0tLS0tLS0tLS4gICAgIC4tLS0tLS0tLS0uICAgLi0tLS0tLS0uICAgLi0tLS0tLS0tLS0tLgorIyAgUlRQICAgICAgICB8dWRwc3JjIHwgICAgICB8IHJ0cGJpbiAgIHwgICAgIHxoMjY0ZGVwYXl8ICAgfGgyNjRkZWN8ICAgfHh2aW1hZ2VzaW5rfAorIyAgcG9ydD01MDAwICB8ICAgICAgc3JjLT5yZWN2X3J0cCByZWN2X3J0cC0+c2luayAgICAgc3JjLT5zaW5rICAgc3JjLT5zaW5rICAgICAgICAgfAorIyAgICAgICAgICAgICAnLS0tLS0tLScgICAgICB8ICAgICAgICAgIHwgICAgICctLS0tLS0tLS0nICAgJy0tLS0tLS0nICAgJy0tLS0tLS0tLS0tJworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAuLS0tLS0tLS4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICB8dWRwc2lua3wgIFJUQ1AKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBzZW5kX3J0Y3AtPnNpbmsgICAgIHwgcG9ydD01MDA1CisjICAgICAgICAgICAgIC4tLS0tLS0tLiAgICAgIHwgICAgICAgICAgfCAgICAgJy0tLS0tLS0nIHN5bmM9ZmFsc2UKKyMgIFJUQ1AgICAgICAgfHVkcHNyYyB8ICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgYXN5bmM9ZmFsc2UKKyMgIHBvcnQ9NTAwMSAgfCAgICAgc3JjLT5yZWN2X3J0Y3AgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAKKyMgICAgICAgICAgICAgJy0tLS0tLS0nICAgICAgJy0tLS0tLS0tLS0nICAgICAgICAgICAgICAKKworCisjIHRoZSBjYXBzIG9mIHRoZSBzZW5kZXIgUlRQIHN0cmVhbS4gVGhpcyBpcyB1c3VhbGx5IG5lZ290aWF0ZWQgb3V0IG9mIGJhbmQgd2l0aAorIyBTRFAgb3IgUlRTUC4gbm9ybWFsbHkgdGhlc2UgY2FwcyB3aWxsIGFsc28gaW5jbHVkZSBTUFMgYW5kIFBQUyBidXQgd2UgZG9uJ3QKKyMgaGF2ZSBhIG1lY2hhbmlzbSB0byBnZXQgdGhpcyBmcm9tIHRoZSBzZW5kZXIgd2l0aCBhIC1sYXVuY2ggbGluZS4KK1ZJREVPX0NBUFM9ImFwcGxpY2F0aW9uL3gtcnRwLG1lZGlhPShzdHJpbmcpdmlkZW8sY2xvY2stcmF0ZT0oaW50KTkwMDAwLGVuY29kaW5nLW5hbWU9KHN0cmluZylIMjY0IgorCitWSURFT19ERUM9InJ0cGgyNjRkZXBheSAhIGF2ZGVjX2gyNjQiCisKK1ZJREVPX1NJTks9InZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsiCisKKyMgdGhlIGRlc3RpbmF0aW9uIG1hY2hpbmUgdG8gc2VuZCBSVENQIHRvLiBUaGlzIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzZW5kZXIgYW5kCisjIGlzIHVzZWQgdG8gc2VuZCBiYWNrIHRoZSBSVENQIHJlcG9ydHMgb2YgdGhpcyByZWNlaXZlci4gSWYgdGhlIGRhdGEgaXMgc2VudAorIyBmcm9tIGFub3RoZXIgbWFjaGluZSwgY2hhbmdlIHRoaXMgYWRkcmVzcy4KK0RFU1Q9MTI3LjAuMC4xCisKK0xBVEVOQ1k9MjAwCisKK2dzdC1sYXVuY2gtMS4wIC12IHJ0cGJpbiBuYW1lPXJ0cGJpbiBsYXRlbmN5PSRMQVRFTkNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWRwc3JjIGNhcHM9JFZJREVPX0NBUFMgcG9ydD01MDAwICEgcnRwYmluLnJlY3ZfcnRwX3NpbmtfMCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBydHBiaW4uICEgJFZJREVPX0RFQyAhICRWSURFT19TSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWRwc3JjIHBvcnQ9NTAwMSAhIHJ0cGJpbi5yZWN2X3J0Y3Bfc2lua18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18wICEgdWRwc2luayBwb3J0PTUwMDUgaG9zdD0kREVTVCBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEuYyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtUENNQS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYWE3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEuYwpAQCAtMCwwICsxLDI0MyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisvKgorICogQSBzaW1wbGUgUlRQIHJlY2VpdmVyIAorICoKKyAqICByZWNlaXZlcyBhbGF3IGVuY29kZWQgUlRQIGF1ZGlvIG9uIHBvcnQgNTAwMiwgUlRDUCBpcyByZWNlaXZlZCBvbiAgcG9ydCA1MDAzLgorICogIHRoZSByZWNlaXZlciBSVENQIHJlcG9ydHMgYXJlIHNlbnQgdG8gcG9ydCA1MDA3CisgKgorICogICAgICAgICAgICAgLi0tLS0tLS0uICAgICAgLi0tLS0tLS0tLS0uICAgICAuLS0tLS0tLS0tLiAgIC4tLS0tLS0tLiAgIC4tLS0tLS0tLS4KKyAqICBSVFAgICAgICAgIHx1ZHBzcmMgfCAgICAgIHwgcnRwYmluICAgfCAgICAgfHBjbWFkZXBheXwgICB8YWxhd2RlY3wgICB8YWxzYXNpbmt8CisgKiAgcG9ydD01MDAyICB8ICAgICAgc3JjLT5yZWN2X3J0cCByZWN2X3J0cC0+c2luayAgICAgc3JjLT5zaW5rICAgc3JjLT5zaW5rICAgICAgfAorICogICAgICAgICAgICAgJy0tLS0tLS0nICAgICAgfCAgICAgICAgICB8ICAgICAnLS0tLS0tLS0tJyAgICctLS0tLS0tJyAgICctLS0tLS0tLScKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAuLS0tLS0tLS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgfHVkcHNpbmt8ICBSVENQCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHNlbmRfcnRjcC0+c2luayAgICAgfCBwb3J0PTUwMDcKKyAqICAgICAgICAgICAgIC4tLS0tLS0tLiAgICAgIHwgICAgICAgICAgfCAgICAgJy0tLS0tLS0nIHN5bmM9ZmFsc2UKKyAqICBSVENQICAgICAgIHx1ZHBzcmMgfCAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgIGFzeW5jPWZhbHNlCisgKiAgcG9ydD01MDAzICB8ICAgICBzcmMtPnJlY3ZfcnRjcCAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgJy0tLS0tLS0nICAgICAgJy0tLS0tLS0tLS0nICAgICAgICAgICAgICAKKyAqLworCisvKiB0aGUgY2FwcyBvZiB0aGUgc2VuZGVyIFJUUCBzdHJlYW0uIFRoaXMgaXMgdXN1YWxseSBuZWdvdGlhdGVkIG91dCBvZiBiYW5kIHdpdGgKKyAqIFNEUCBvciBSVFNQLiAqLworI2RlZmluZSBBVURJT19DQVBTICJhcHBsaWNhdGlvbi94LXJ0cCxtZWRpYT0oc3RyaW5nKWF1ZGlvLGNsb2NrLXJhdGU9KGludCk4MDAwLGVuY29kaW5nLW5hbWU9KHN0cmluZylQQ01BIgorCisjZGVmaW5lIEFVRElPX0RFUEFZICJydHBwY21hZGVwYXkiCisjZGVmaW5lIEFVRElPX0RFQyAgICJhbGF3ZGVjIgorI2RlZmluZSBBVURJT19TSU5LICAiYXV0b2F1ZGlvc2luayIKKworLyogdGhlIGRlc3RpbmF0aW9uIG1hY2hpbmUgdG8gc2VuZCBSVENQIHRvLiBUaGlzIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzZW5kZXIgYW5kCisgKiBpcyB1c2VkIHRvIHNlbmQgYmFjayB0aGUgUlRDUCByZXBvcnRzIG9mIHRoaXMgcmVjZWl2ZXIuIElmIHRoZSBkYXRhIGlzIHNlbnQKKyAqIGZyb20gYW5vdGhlciBtYWNoaW5lLCBjaGFuZ2UgdGhpcyBhZGRyZXNzLiAqLworI2RlZmluZSBERVNUX0hPU1QgIjEyNy4wLjAuMSIKKworLyogcHJpbnQgdGhlIHN0YXRzIG9mIGEgc291cmNlICovCitzdGF0aWMgdm9pZAorcHJpbnRfc291cmNlX3N0YXRzIChHT2JqZWN0ICogc291cmNlKQoreworICBHc3RTdHJ1Y3R1cmUgKnN0YXRzOworICBnY2hhciAqc3RyOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKHNvdXJjZSAhPSBOVUxMKTsKKworICAvKiBnZXQgdGhlIHNvdXJjZSBzdGF0cyAqLworICBnX29iamVjdF9nZXQgKHNvdXJjZSwgInN0YXRzIiwgJnN0YXRzLCBOVUxMKTsKKworICAvKiBzaW1wbHkgZHVtcCB0aGUgc3RhdHMgc3RydWN0dXJlICovCisgIHN0ciA9IGdzdF9zdHJ1Y3R1cmVfdG9fc3RyaW5nIChzdGF0cyk7CisgIGdfcHJpbnQgKCJzb3VyY2Ugc3RhdHM6ICVzXG4iLCBzdHIpOworCisgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoc3RhdHMpOworICBnX2ZyZWUgKHN0cik7Cit9CisKKy8qIHdpbGwgYmUgY2FsbGVkIHdoZW4gcnRwYmluIHNpZ25hbHMgb24tc3NyYy1hY3RpdmUuIEl0IG1lYW5zIHRoYXQgYW4gUlRDUAorICogcGFja2V0IHdhcyByZWNlaXZlZCBmcm9tIGFub3RoZXIgc291cmNlLiAqLworc3RhdGljIHZvaWQKK29uX3NzcmNfYWN0aXZlX2NiIChHc3RFbGVtZW50ICogcnRwYmluLCBndWludCBzZXNzaWQsIGd1aW50IHNzcmMsCisgICAgR3N0RWxlbWVudCAqIGRlcGF5KQoreworICBHT2JqZWN0ICpzZXNzaW9uLCAqb3NyYzsKKworICBnX3ByaW50ICgiZ290IFJUQ1AgZnJvbSBzZXNzaW9uICV1LCBTU1JDICV1XG4iLCBzZXNzaWQsIHNzcmMpOworCisgIC8qIGdldCB0aGUgcmlnaHQgc2Vzc2lvbiAqLworICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHJ0cGJpbiwgImdldC1pbnRlcm5hbC1zZXNzaW9uIiwgc2Vzc2lkLCAmc2Vzc2lvbik7CisKKyNpZiAwCisgIC8qIEZJWE1FOiBUaGlzIGlzIGJyb2tlbiBpbiBydHBiaW4gKi8KKyAgLyogZ2V0IHRoZSBpbnRlcm5hbCBzb3VyY2UgKHRoZSBTU1JDIGFsbG9jYXRlZCB0byB1cywgdGhlIHJlY2VpdmVyICovCisgIGdfb2JqZWN0X2dldCAoc2Vzc2lvbiwgImludGVybmFsLXNvdXJjZSIsICZpc3JjLCBOVUxMKTsKKyAgcHJpbnRfc291cmNlX3N0YXRzIChpc3JjKTsKKyAgZ19vYmplY3RfdW5yZWYgKGlzcmMpOworI2VuZGlmCisKKyAgLyogZ2V0IHRoZSByZW1vdGUgc291cmNlIHRoYXQgc2VudCB1cyBSVENQICovCisgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAoc2Vzc2lvbiwgImdldC1zb3VyY2UtYnktc3NyYyIsIHNzcmMsICZvc3JjKTsKKyAgcHJpbnRfc291cmNlX3N0YXRzIChvc3JjKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9zcmMpOworICBnX29iamVjdF91bnJlZiAoc2Vzc2lvbik7Cit9CisKKy8qIHdpbGwgYmUgY2FsbGVkIHdoZW4gcnRwYmluIGhhcyB2YWxpZGF0ZWQgYSBwYXlsb2FkIHRoYXQgd2UgY2FuIGRlcGF5bG9hZCAqLworc3RhdGljIHZvaWQKK3BhZF9hZGRlZF9jYiAoR3N0RWxlbWVudCAqIHJ0cGJpbiwgR3N0UGFkICogbmV3X3BhZCwgR3N0RWxlbWVudCAqIGRlcGF5KQoreworICBHc3RQYWQgKnNpbmtwYWQ7CisgIEdzdFBhZExpbmtSZXR1cm4gbHJlczsKKworICBnX3ByaW50ICgibmV3IHBheWxvYWQgb24gcGFkOiAlc1xuIiwgR1NUX1BBRF9OQU1FIChuZXdfcGFkKSk7CisKKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChkZXBheSwgInNpbmsiKTsKKyAgZ19hc3NlcnQgKHNpbmtwYWQpOworCisgIGxyZXMgPSBnc3RfcGFkX2xpbmsgKG5ld19wYWQsIHNpbmtwYWQpOworICBnX2Fzc2VydCAobHJlcyA9PSBHU1RfUEFEX0xJTktfT0spOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKK30KKworLyogYnVpbGQgYSBwaXBlbGluZSBlcXVpdmFsZW50IHRvOgorICoKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHJ0cGJpbiBuYW1lPXJ0cGJpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAqICAgICAgdWRwc3JjIGNhcHM9JEFVRElPX0NBUFMgcG9ydD01MDAyICEgcnRwYmluLnJlY3ZfcnRwX3NpbmtfMCAgICAgICAgICAgICAgXAorICogICAgICAgIHJ0cGJpbi4gISBydHBwY21hZGVwYXkgISBhbGF3ZGVjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIGF1dG9hdWRpb3NpbmsgXAorICogICAgICB1ZHBzcmMgcG9ydD01MDAzICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgKiAgICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMCAhIHVkcHNpbmsgcG9ydD01MDA3IGhvc3Q9JERFU1Qgc3luYz1mYWxzZSBhc3luYz1mYWxzZQorICovCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIEdzdEVsZW1lbnQgKnJ0cGJpbiwgKnJ0cHNyYywgKnJ0Y3BzcmMsICpydGNwc2luazsKKyAgR3N0RWxlbWVudCAqYXVkaW9kZXBheSwgKmF1ZGlvZGVjLCAqYXVkaW9yZXMsICphdWRpb2NvbnYsICphdWRpb3Npbms7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHTWFpbkxvb3AgKmxvb3A7CisgIEdzdENhcHMgKmNhcHM7CisgIGdib29sZWFuIHJlczsKKyAgR3N0UGFkTGlua1JldHVybiBscmVzOworICBHc3RQYWQgKnNyY3BhZCwgKnNpbmtwYWQ7CisKKyAgLyogYWx3YXlzIGluaXQgZmlyc3QgKi8KKyAgZ3N0X2luaXQgKCZhcmdjLCAmYXJndik7CisKKyAgLyogdGhlIHBpcGVsaW5lIHRvIGhvbGQgZXZlcnl0aGluZyAqLworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKE5VTEwpOworICBnX2Fzc2VydCAocGlwZWxpbmUpOworCisgIC8qIHRoZSB1ZHAgc3JjIGFuZCBzb3VyY2Ugd2Ugd2lsbCB1c2UgZm9yIFJUUCBhbmQgUlRDUCAqLworICBydHBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1ZHBzcmMiLCAicnRwc3JjIik7CisgIGdfYXNzZXJ0IChydHBzcmMpOworICBnX29iamVjdF9zZXQgKHJ0cHNyYywgInBvcnQiLCA1MDAyLCBOVUxMKTsKKyAgLyogd2UgbmVlZCB0byBzZXQgY2FwcyBvbiB0aGUgdWRwc3JjIGZvciB0aGUgUlRQIGRhdGEgKi8KKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBVURJT19DQVBTKTsKKyAgZ19vYmplY3Rfc2V0IChydHBzcmMsICJjYXBzIiwgY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBydGNwc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidWRwc3JjIiwgInJ0Y3BzcmMiKTsKKyAgZ19hc3NlcnQgKHJ0Y3BzcmMpOworICBnX29iamVjdF9zZXQgKHJ0Y3BzcmMsICJwb3J0IiwgNTAwMywgTlVMTCk7CisKKyAgcnRjcHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1ZHBzaW5rIiwgInJ0Y3BzaW5rIik7CisgIGdfYXNzZXJ0IChydGNwc2luayk7CisgIGdfb2JqZWN0X3NldCAocnRjcHNpbmssICJwb3J0IiwgNTAwNywgImhvc3QiLCBERVNUX0hPU1QsIE5VTEwpOworICAvKiBubyBuZWVkIGZvciBzeW5jaHJvbmlzYXRpb24gb3IgcHJlcm9sbCBvbiB0aGUgUlRDUCBzaW5rICovCisgIGdfb2JqZWN0X3NldCAocnRjcHNpbmssICJhc3luYyIsIEZBTFNFLCAic3luYyIsIEZBTFNFLCBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHJ0cHNyYywgcnRjcHNyYywgcnRjcHNpbmssIE5VTEwpOworCisgIC8qIHRoZSBkZXBheWxvYWRpbmcgYW5kIGRlY29kaW5nICovCisgIGF1ZGlvZGVwYXkgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKEFVRElPX0RFUEFZLCAiYXVkaW9kZXBheSIpOworICBnX2Fzc2VydCAoYXVkaW9kZXBheSk7CisgIGF1ZGlvZGVjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlIChBVURJT19ERUMsICJhdWRpb2RlYyIpOworICBnX2Fzc2VydCAoYXVkaW9kZWMpOworICAvKiB0aGUgYXVkaW8gcGxheWJhY2sgYW5kIGZvcm1hdCBjb252ZXJzaW9uICovCisgIGF1ZGlvY29udiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvY29udmVydCIsICJhdWRpb2NvbnYiKTsKKyAgZ19hc3NlcnQgKGF1ZGlvY29udik7CisgIGF1ZGlvcmVzID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW9yZXNhbXBsZSIsICJhdWRpb3JlcyIpOworICBnX2Fzc2VydCAoYXVkaW9yZXMpOworICBhdWRpb3NpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKEFVRElPX1NJTkssICJhdWRpb3NpbmsiKTsKKyAgZ19hc3NlcnQgKGF1ZGlvc2luayk7CisKKyAgLyogYWRkIGRlcGF5bG9hZGluZyBhbmQgcGxheWJhY2sgdG8gdGhlIHBpcGVsaW5lIGFuZCBsaW5rICovCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgYXVkaW9kZXBheSwgYXVkaW9kZWMsIGF1ZGlvY29udiwKKyAgICAgIGF1ZGlvcmVzLCBhdWRpb3NpbmssIE5VTEwpOworCisgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmtfbWFueSAoYXVkaW9kZXBheSwgYXVkaW9kZWMsIGF1ZGlvY29udiwgYXVkaW9yZXMsCisgICAgICBhdWRpb3NpbmssIE5VTEwpOworICBnX2Fzc2VydCAocmVzID09IFRSVUUpOworCisgIC8qIHRoZSBydHBiaW4gZWxlbWVudCAqLworICBydHBiaW4gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBiaW4iLCAicnRwYmluIik7CisgIGdfYXNzZXJ0IChydHBiaW4pOworCisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIHJ0cGJpbik7CisKKyAgLyogbm93IGxpbmsgYWxsIHRvIHRoZSBydHBiaW4sIHN0YXJ0IGJ5IGdldHRpbmcgYW4gUlRQIHNpbmtwYWQgZm9yIHNlc3Npb24gMCAqLworICBzcmNwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocnRwc3JjLCAic3JjIik7CisgIHNpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgInJlY3ZfcnRwX3NpbmtfMCIpOworICBscmVzID0gZ3N0X3BhZF9saW5rIChzcmNwYWQsIHNpbmtwYWQpOworICBnX2Fzc2VydCAobHJlcyA9PSBHU1RfUEFEX0xJTktfT0spOworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworCisgIC8qIGdldCBhbiBSVENQIHNpbmtwYWQgaW4gc2Vzc2lvbiAwICovCisgIHNyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChydGNwc3JjLCAic3JjIik7CisgIHNpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgInJlY3ZfcnRjcF9zaW5rXzAiKTsKKyAgbHJlcyA9IGdzdF9wYWRfbGluayAoc3JjcGFkLCBzaW5rcGFkKTsKKyAgZ19hc3NlcnQgKGxyZXMgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZCk7CisKKyAgLyogZ2V0IGFuIFJUQ1Agc3JjcGFkIGZvciBzZW5kaW5nIFJUQ1AgYmFjayB0byB0aGUgc2VuZGVyICovCisgIHNyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwYmluLCAic2VuZF9ydGNwX3NyY18wIik7CisgIHNpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocnRjcHNpbmssICJzaW5rIik7CisgIGxyZXMgPSBnc3RfcGFkX2xpbmsgKHNyY3BhZCwgc2lua3BhZCk7CisgIGdfYXNzZXJ0IChscmVzID09IEdTVF9QQURfTElOS19PSyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworCisgIC8qIHRoZSBSVFAgcGFkIHRoYXQgd2UgaGF2ZSB0byBjb25uZWN0IHRvIHRoZSBkZXBheWxvYWRlciB3aWxsIGJlIGNyZWF0ZWQKKyAgICogZHluYW1pY2FsbHkgc28gd2UgY29ubmVjdCB0byB0aGUgcGFkLWFkZGVkIHNpZ25hbCwgcGFzcyB0aGUgZGVwYXlsb2FkZXIgYXMKKyAgICogdXNlcl9kYXRhIHNvIHRoYXQgd2UgY2FuIGxpbmsgdG8gaXQuICovCisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cGJpbiwgInBhZC1hZGRlZCIsIEdfQ0FMTEJBQ0sgKHBhZF9hZGRlZF9jYiksIGF1ZGlvZGVwYXkpOworCisgIC8qIGdpdmUgc29tZSBzdGF0cyB3aGVuIHdlIHJlY2VpdmUgUlRDUCAqLworICBnX3NpZ25hbF9jb25uZWN0IChydHBiaW4sICJvbi1zc3JjLWFjdGl2ZSIsIEdfQ0FMTEJBQ0sgKG9uX3NzcmNfYWN0aXZlX2NiKSwKKyAgICAgIGF1ZGlvZGVwYXkpOworCisgIC8qIHNldCB0aGUgcGlwZWxpbmUgdG8gcGxheWluZyAqLworICBnX3ByaW50ICgic3RhcnRpbmcgcmVjZWl2ZXIgcGlwZWxpbmVcbiIpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgLyogd2UgbmVlZCB0byBydW4gYSBHTGliIG1haW4gbG9vcCB0byBnZXQgdGhlIG1lc3NhZ2VzICovCisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIEZBTFNFKTsKKyAgZ19tYWluX2xvb3BfcnVuIChsb29wKTsKKworICBnX3ByaW50ICgic3RvcHBpbmcgcmVjZWl2ZXIgcGlwZWxpbmVcbiIpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLnB5IGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlkMmZkNDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEucHkKQEAgLTAsMCArMSwxMjAgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IGdpCitpbXBvcnQgc3lzCitnaS5yZXF1aXJlX3ZlcnNpb24oJ0dzdCcsICcxLjAnKQorZnJvbSBnaS5yZXBvc2l0b3J5IGltcG9ydCBHT2JqZWN0LCBHc3QKKworIworIyBBIHNpbXBsZSBSVFAgcmVjZWl2ZXIKKyMKKyMgIHJlY2VpdmVzIGFsYXcgZW5jb2RlZCBSVFAgYXVkaW8gb24gcG9ydCA1MDAyLCBSVENQIGlzIHJlY2VpdmVkIG9uICBwb3J0IDUwMDMuCisjICB0aGUgcmVjZWl2ZXIgUlRDUCByZXBvcnRzIGFyZSBzZW50IHRvIHBvcnQgNTAwNworIworIyAgICAgICAgICAgICAuLS0tLS0tLS4gICAgICAuLS0tLS0tLS0tLS4gICAgIC4tLS0tLS0tLS0uICAgLi0tLS0tLS0uICAgLi0tLS0tLS0tLgorIyAgUlRQICAgICAgICB8dWRwc3JjIHwgICAgICB8IHJ0cGJpbiAgIHwgICAgIHxwY21hZGVwYXl8ICAgfGFsYXdkZWN8ICAgfGFsc2FzaW5rfAorIyAgcG9ydD01MDAyICB8ICAgICAgc3JjLT5yZWN2X3J0cCByZWN2X3J0cC0+c2luayAgICAgc3JjLT5zaW5rICAgc3JjLT5zaW5rICAgICAgfAorIyAgICAgICAgICAgICAnLS0tLS0tLScgICAgICB8ICAgICAgICAgIHwgICAgICctLS0tLS0tLS0nICAgJy0tLS0tLS0nICAgJy0tLS0tLS0tJworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAuLS0tLS0tLS4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICB8dWRwc2lua3wgIFJUQ1AKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBzZW5kX3J0Y3AtPnNpbmsgICAgIHwgcG9ydD01MDA3CisjICAgICAgICAgICAgIC4tLS0tLS0tLiAgICAgIHwgICAgICAgICAgfCAgICAgJy0tLS0tLS0nIHN5bmM9ZmFsc2UKKyMgIFJUQ1AgICAgICAgfHVkcHNyYyB8ICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgYXN5bmM9ZmFsc2UKKyMgIHBvcnQ9NTAwMyAgfCAgICAgc3JjLT5yZWN2X3J0Y3AgICAgICB8CisjICAgICAgICAgICAgICctLS0tLS0tJyAgICAgICctLS0tLS0tLS0tJworCitBVURJT19DQVBTID0gJ2FwcGxpY2F0aW9uL3gtcnRwLG1lZGlhPShzdHJpbmcpYXVkaW8sY2xvY2stcmF0ZT0oaW50KTgwMDAsZW5jb2RpbmctbmFtZT0oc3RyaW5nKVBDTUEnCitBVURJT19ERVBBWSA9ICdydHBwY21hZGVwYXknCitBVURJT19ERUMgPSAnYWxhd2RlYycKK0FVRElPX1NJTksgPSAnYXV0b2F1ZGlvc2luaycKKworREVTVCA9ICcxMjcuMC4wLjEnCisKK1JUUF9SRUNWX1BPUlQgPSA1MDAyCitSVENQX1JFQ1ZfUE9SVCA9IDUwMDMKK1JUQ1BfU0VORF9QT1JUID0gNTAwNworCitHT2JqZWN0LnRocmVhZHNfaW5pdCgpCitHc3QuaW5pdChzeXMuYXJndikKKworI2dzdC1sYXVuY2ggLXYgcnRwYmluIG5hbWU9cnRwYmluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIyAgICAgICB1ZHBzcmMgY2Fwcz0kQVVESU9fQ0FQUyBwb3J0PSRSVFBfUkVDVl9QT1JUICEgcnRwYmluLnJlY3ZfcnRwX3NpbmtfMCAgICAgICAgICAgICAgXAorIyAgICAgICAgICAgICBydHBiaW4uICEgcnRwcGNtYWRlcGF5ICEgYWxhd2RlYyAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhdXRvYXVkaW9zaW5rIFwKKyMgICAgICAgICAgIHVkcHNyYyBwb3J0PSRSVENQX1JFQ1ZfUE9SVCAhIHJ0cGJpbi5yZWN2X3J0Y3Bfc2lua18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIyAgICAgICAgIHJ0cGJpbi5zZW5kX3J0Y3Bfc3JjXzAgISB1ZHBzaW5rIHBvcnQ9JFJUQ1BfU0VORF9QT1JUIGhvc3Q9JERFU1Qgc3luYz1mYWxzZSBhc3luYz1mYWxzZQorCitkZWYgcGFkX2FkZGVkX2NiKHJ0cGJpbiwgbmV3X3BhZCwgZGVwYXkpOgorICAgIHNpbmtwYWQgPSBHc3QuRWxlbWVudC5nZXRfc3RhdGljX3BhZChkZXBheSwgJ3NpbmsnKQorICAgIGxyZXMgPSBHc3QuUGFkLmxpbmsobmV3X3BhZCwgc2lua3BhZCkKKworIyB0aGUgcGlwZWxpbmUgdG8gaG9sZCBldmV5dGhpbmcKK3BpcGVsaW5lID0gR3N0LlBpcGVsaW5lKCdydHBfY2xpZW50JykKKworIyB0aGUgdWRwIHNyYyBhbmQgc291cmNlIHdlIHdpbGwgdXNlIGZvciBSVFAgYW5kIFJUQ1AKK3J0cHNyYyA9IEdzdC5FbGVtZW50RmFjdG9yeS5tYWtlKCd1ZHBzcmMnLCAncnRwc3JjJykKK3J0cHNyYy5zZXRfcHJvcGVydHkoJ3BvcnQnLCBSVFBfUkVDVl9QT1JUKQorCisjIHdlIG5lZWQgdG8gc2V0IGNhcHMgb24gdGhlIHVkcHNyYyBmb3IgdGhlIFJUUCBkYXRhCitjYXBzID0gR3N0LmNhcHNfZnJvbV9zdHJpbmcoQVVESU9fQ0FQUykKK3J0cHNyYy5zZXRfcHJvcGVydHkoJ2NhcHMnLCBjYXBzKQorCitydGNwc3JjID0gR3N0LkVsZW1lbnRGYWN0b3J5Lm1ha2UoJ3VkcHNyYycsICdydGNwc3JjJykKK3J0Y3BzcmMuc2V0X3Byb3BlcnR5KCdwb3J0JywgUlRDUF9SRUNWX1BPUlQpCisKK3J0Y3BzaW5rID0gR3N0LkVsZW1lbnRGYWN0b3J5Lm1ha2UoJ3VkcHNpbmsnLCAncnRjcHNpbmsnKQorcnRjcHNpbmsuc2V0X3Byb3BlcnR5KCdwb3J0JywgUlRDUF9TRU5EX1BPUlQpCitydGNwc2luay5zZXRfcHJvcGVydHkoJ2hvc3QnLCBERVNUKQorCisjIG5vIG5lZWQgZm9yIHN5bmNocm9uaXNhdGlvbiBvciBwcmVyb2xsIG9uIHRoZSBSVENQIHNpbmsKK3J0Y3BzaW5rLnNldF9wcm9wZXJ0eSgnYXN5bmMnLCBGYWxzZSkKK3J0Y3BzaW5rLnNldF9wcm9wZXJ0eSgnc3luYycsIEZhbHNlKQorCitwaXBlbGluZS5hZGQocnRwc3JjLCBydGNwc3JjLCBydGNwc2luaykKKworIyB0aGUgZGVwYXlsb2FkaW5nIGFuZCBkZWNvZGluZworYXVkaW9kZXBheSA9IEdzdC5FbGVtZW50RmFjdG9yeS5tYWtlKEFVRElPX0RFUEFZLCAnYXVkaW9kZXBheScpCithdWRpb2RlYyA9IEdzdC5FbGVtZW50RmFjdG9yeS5tYWtlKEFVRElPX0RFQywgJ2F1ZGlvZGVjJykKKworIyB0aGUgYXVkaW8gcGxheWJhY2sgYW5kIGZvcm1hdCBjb252ZXJzaW9uCithdWRpb2NvbnYgPSBHc3QuRWxlbWVudEZhY3RvcnkubWFrZSgnYXVkaW9jb252ZXJ0JywgJ2F1ZGlvY29udicpCithdWRpb3JlcyA9IEdzdC5FbGVtZW50RmFjdG9yeS5tYWtlKCdhdWRpb3Jlc2FtcGxlJywgJ2F1ZGlvcmVzJykKK2F1ZGlvc2luayA9IEdzdC5FbGVtZW50RmFjdG9yeS5tYWtlKEFVRElPX1NJTkssICdhdWRpb3NpbmsnKQorCisjIGFkZCBkZXBheWxvYWRpbmcgYW5kIHBsYXliYWNrIHRvIHRoZSBwaXBlbGluZSBhbmQgbGluaworcGlwZWxpbmUuYWRkKGF1ZGlvZGVwYXksIGF1ZGlvZGVjLCBhdWRpb2NvbnYsIGF1ZGlvcmVzLCBhdWRpb3NpbmspCisKK2F1ZGlvZGVwYXkubGluayhhdWRpb2RlYykKK2F1ZGlvZGVjLmxpbmsoYXVkaW9jb252KQorYXVkaW9jb252LmxpbmsoYXVkaW9yZXMpCithdWRpb3Jlcy5saW5rKGF1ZGlvc2luaykKKworIyB0aGUgcnRwYmluIGVsZW1lbnQKK3J0cGJpbiA9IEdzdC5FbGVtZW50RmFjdG9yeS5tYWtlKCdydHBiaW4nLCAncnRwYmluJykKKworcGlwZWxpbmUuYWRkKHJ0cGJpbikKKworIyBub3cgbGluayBhbGwgdG8gdGhlIHJ0cGJpbiwgc3RhcnQgYnkgZ2V0dGluZyBhbiBSVFAgc2lua3BhZCBmb3Igc2Vzc2lvbiAwCitzcmNwYWQgPSBHc3QuRWxlbWVudC5nZXRfc3RhdGljX3BhZChydHBzcmMsICdzcmMnKQorc2lua3BhZCA9IEdzdC5FbGVtZW50LmdldF9yZXF1ZXN0X3BhZChydHBiaW4sICdyZWN2X3J0cF9zaW5rXzAnKQorbHJlcyA9IEdzdC5QYWQubGluayhzcmNwYWQsIHNpbmtwYWQpCisKKyMgZ2V0IGFuIFJUQ1Agc2lua3BhZCBpbiBzZXNzaW9uIDAKK3NyY3BhZCA9IEdzdC5FbGVtZW50LmdldF9zdGF0aWNfcGFkKHJ0Y3BzcmMsICdzcmMnKQorc2lua3BhZCA9IEdzdC5FbGVtZW50LmdldF9yZXF1ZXN0X3BhZChydHBiaW4sICdyZWN2X3J0Y3Bfc2lua18wJykKK2xyZXMgPSBHc3QuUGFkLmxpbmsoc3JjcGFkLCBzaW5rcGFkKQorCisjIGdldCBhbiBSVENQIHNyY3BhZCBmb3Igc2VuZGluZyBSVENQIGJhY2sgdG8gdGhlIHNlbmRlcgorc3JjcGFkID0gR3N0LkVsZW1lbnQuZ2V0X3JlcXVlc3RfcGFkKHJ0cGJpbiwgJ3NlbmRfcnRjcF9zcmNfMCcpCitzaW5rcGFkID0gR3N0LkVsZW1lbnQuZ2V0X3N0YXRpY19wYWQocnRjcHNpbmssICdzaW5rJykKK2xyZXMgPSBHc3QuUGFkLmxpbmsoc3JjcGFkLCBzaW5rcGFkKQorCitydHBiaW4uY29ubmVjdCgncGFkLWFkZGVkJywgcGFkX2FkZGVkX2NiLCBhdWRpb2RlcGF5KQorCitHc3QuRWxlbWVudC5zZXRfc3RhdGUocGlwZWxpbmUsIEdzdC5TdGF0ZS5QTEFZSU5HKQorCittYWlubG9vcCA9IEdPYmplY3QuTWFpbkxvb3AoKQorbWFpbmxvb3AucnVuKCkKKworR3N0LkVsZW1lbnQuc2V0X3N0YXRlKHBpcGVsaW5lLCBHc3QuU3RhdGUuTlVMTCkKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLnNkcCBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtUENNQS5zZHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmOWQyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtUENNQS5zZHAKQEAgLTAsMCArMSw5IEBACit2PTAKK289LSAxMTg4MzQwNjU2MTgwODgzIDEgSU4gSVA0IDEyNy4wLjAuMQorcz1TZXNzaW9uIHN0cmVhbWVkIGJ5IEdTdHJlYW1lcgoraT1zZXJ2ZXIuc2gKK3Q9MCAwCithPXRvb2w6R1N0cmVhbWVyCithPXR5cGU6YnJvYWRjYXN0CittPWF1ZGlvIDUwMDIgUlRQL0FWUCA4CitjPUlOIElQNCAxMjcuMC4wLjEKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtUENNQS5zaCBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtUENNQS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZTk2OWIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLnNoCkBAIC0wLDAgKzEsMzkgQEAKKyMhL2Jpbi9zaAorIworIyBBIHNpbXBsZSBSVFAgcmVjZWl2ZXIKKyMKKyMgIHJlY2VpdmVzIGFsYXcgZW5jb2RlZCBSVFAgYXVkaW8gb24gcG9ydCA1MDAyLCBSVENQIGlzIHJlY2VpdmVkIG9uICBwb3J0IDUwMDMuCisjICB0aGUgcmVjZWl2ZXIgUlRDUCByZXBvcnRzIGFyZSBzZW50IHRvIHBvcnQgNTAwNworIworIyAgICAgICAgICAgICAuLS0tLS0tLS4gICAgICAuLS0tLS0tLS0tLS4gICAgIC4tLS0tLS0tLS0uICAgLi0tLS0tLS0uICAgLi0tLS0tLS0tLS0tLS0uCisjICBSVFAgICAgICAgIHx1ZHBzcmMgfCAgICAgIHwgcnRwYmluICAgfCAgICAgfHBjbWFkZXBheXwgICB8YWxhd2RlY3wgICB8YXV0b2F1ZGlvc2lua3wKKyMgIHBvcnQ9NTAwMiAgfCAgICAgIHNyYy0+cmVjdl9ydHAgcmVjdl9ydHAtPnNpbmsgICAgIHNyYy0+c2luayAgIHNyYy0+c2luayAgICAgICAgICAgfAorIyAgICAgICAgICAgICAnLS0tLS0tLScgICAgICB8ICAgICAgICAgIHwgICAgICctLS0tLS0tLS0nICAgJy0tLS0tLS0nICAgJy0tLS0tLS0tLS0tLS0nCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIC4tLS0tLS0tLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIHx1ZHBzaW5rfCAgUlRDUAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHNlbmRfcnRjcC0+c2luayAgICAgfCBwb3J0PTUwMDcKKyMgICAgICAgICAgICAgLi0tLS0tLS0uICAgICAgfCAgICAgICAgICB8ICAgICAnLS0tLS0tLScgc3luYz1mYWxzZQorIyAgUlRDUCAgICAgICB8dWRwc3JjIHwgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICBhc3luYz1mYWxzZQorIyAgcG9ydD01MDAzICB8ICAgICBzcmMtPnJlY3ZfcnRjcCAgICAgIHwKKyMgICAgICAgICAgICAgJy0tLS0tLS0nICAgICAgJy0tLS0tLS0tLS0nCisKKworIyB0aGUgY2FwcyBvZiB0aGUgc2VuZGVyIFJUUCBzdHJlYW0uIFRoaXMgaXMgdXN1YWxseSBuZWdvdGlhdGVkIG91dCBvZiBiYW5kIHdpdGgKKyMgU0RQIG9yIFJUU1AuCitBVURJT19DQVBTPSJhcHBsaWNhdGlvbi94LXJ0cCxtZWRpYT0oc3RyaW5nKWF1ZGlvLGNsb2NrLXJhdGU9KGludCk4MDAwLGVuY29kaW5nLW5hbWU9KHN0cmluZylQQ01BIgorCitBVURJT19ERUM9InJ0cHBjbWFkZXBheSAhIGFsYXdkZWMiCisKK0FVRElPX1NJTks9ImF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhdXRvYXVkaW9zaW5rIgorCisjIHRoZSBkZXN0aW5hdGlvbiBtYWNoaW5lIHRvIHNlbmQgUlRDUCB0by4gVGhpcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgc2VuZGVyIGFuZAorIyBpcyB1c2VkIHRvIHNlbmQgYmFjayB0aGUgUlRDUCByZXBvcnRzIG9mIHRoaXMgcmVjZWl2ZXIuIElmIHRoZSBkYXRhIGlzIHNlbnQKKyMgZnJvbSBhbm90aGVyIG1hY2hpbmUsIGNoYW5nZSB0aGlzIGFkZHJlc3MuCitERVNUPTEyNy4wLjAuMQorCitnc3QtbGF1bmNoLTEuMCAtdiBydHBiaW4gbmFtZT1ydHBiaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgdWRwc3JjIGNhcHM9JEFVRElPX0NBUFMgcG9ydD01MDAyICEgcnRwYmluLnJlY3ZfcnRwX3NpbmtfMCAgICAgICAgICAgICAgXAorCSAgICAgICAgIHJ0cGJpbi4gISAkQVVESU9fREVDICEgJEFVRElPX1NJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgdWRwc3JjIHBvcnQ9NTAwMyAhIHJ0cGJpbi5yZWN2X3J0Y3Bfc2lua18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMCAhIHVkcHNpbmsgcG9ydD01MDA3IGhvc3Q9JERFU1Qgc3luYz1mYWxzZSBhc3luYz1mYWxzZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1WUDgtT1BVUy5zaCBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtVlA4LU9QVVMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjIwYmU3MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtVlA4LU9QVVMuc2gKQEAgLTAsMCArMSwyOCBAQAorIyEvYmluL3NoCisjCisjIEEgc2ltcGxlIFJUUCByZWNlaXZlciAKKyMKKworVklERU9fQ0FQUz0iYXBwbGljYXRpb24veC1ydHAsbWVkaWE9KHN0cmluZyl2aWRlbyxjbG9jay1yYXRlPShpbnQpOTAwMDAsZW5jb2RpbmctbmFtZT0oc3RyaW5nKVZQOCIKK0FVRElPX0NBUFM9ImFwcGxpY2F0aW9uL3gtcnRwLG1lZGlhPShzdHJpbmcpYXVkaW8sY2xvY2stcmF0ZT0oaW50KTQ4MDAwLGVuY29kaW5nLW5hbWU9KHN0cmluZylPUFVTIgorCitTUkM9bG9jYWxob3N0CitERVNUPWxvY2FsaG9zdAorCitWSURFT19ERUM9InJ0cHZwOGRlcGF5ICEgdnA4ZGVjIgorQVVESU9fREVDPSJydHBvcHVzZGVwYXkgISBvcHVzZGVjIgorCitWSURFT19TSU5LPSJ2aWRlb2NvbnZlcnQgISBhdXRvdmlkZW9zaW5rIgorQVVESU9fU0lOSz0iYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIGF1dG9hdWRpb3NpbmsiCisKK0xBVEVOQ1k9MTAwCisKK2dzdC1sYXVuY2gtMS4wIC12IHJ0cGJpbiBuYW1lPXJ0cGJpbiBsYXRlbmN5PSRMQVRFTkNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB1ZHBzcmMgY2Fwcz0kVklERU9fQ0FQUyBhZGRyZXNzPSRTUkMgcG9ydD01MDAwICEgcnRwYmluLnJlY3ZfcnRwX3NpbmtfMCAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICAgcnRwYmluLiAhICRWSURFT19ERUMgISAkVklERU9fU0lOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHVkcHNyYyBhZGRyZXNzPSRTUkMgcG9ydD01MDAxICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMCAhIHVkcHNpbmsgaG9zdD0kREVTVCBwb3J0PTUwMDUgc3luYz1mYWxzZSBhc3luYz1mYWxzZSBcCisJICAgdWRwc3JjIGNhcHM9JEFVRElPX0NBUFMgYWRkcmVzcz0kU1JDIHBvcnQ9NTAwMiAhIHJ0cGJpbi5yZWN2X3J0cF9zaW5rXzEgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAgIHJ0cGJpbi4gISAkQVVESU9fREVDICEgJEFVRElPX1NJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB1ZHBzcmMgYWRkcmVzcz0kU1JDIHBvcnQ9NTAwMyAhIHJ0cGJpbi5yZWN2X3J0Y3Bfc2lua18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHJ0cGJpbi5zZW5kX3J0Y3Bfc3JjXzEgISB1ZHBzaW5rIGhvc3Q9JERFU1QgcG9ydD01MDA3IHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtcnRwYXV4LmMgYi90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LXJ0cGF1eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MGRjMWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LXJ0cGF1eC5jCkBAIC0wLDAgKzEsMzgwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMyBDb2xsYWJvcmEgTHRkLgorICogICBAYXV0aG9yIFRvcnJpZSBGaXNjaGVyIDx0b3JyaWUuZmlzY2hlckBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9ydHAuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyoKKyAqIFJUUCByZWNlaXZlciB3aXRoIFJGQzQ1ODggcmV0cmFuc21pc3Npb24gaGFuZGxpbmcgZW5hYmxlZAorICoKKyAqICBJbiB0aGlzIGV4YW1wbGUgd2UgaGF2ZSB0d28gUlRQIHNlc3Npb25zLCBvbmUgZm9yIHZpZGVvIGFuZCBvbmUgZm9yIGF1ZGlvLgorICogIFZpZGVvIGlzIHJlY2VpdmVkIG9uIHBvcnQgNTAwMCwgd2l0aCBpdHMgUlRDUCBzdHJlYW0gcmVjZWl2ZWQgb24gcG9ydCA1MDAxCisgKiAgYW5kIHNlbnQgb24gcG9ydCA1MDA1LiBBdWRpbyBpcyByZWNlaXZlZCBvbiBwb3J0IDUwMDUsIHdpdGggaXRzIFJUQ1Agc3RyZWFtCisgKiAgcmVjZWl2ZWQgb24gcG9ydCA1MDA2IGFuZCBzZW50IG9uIHBvcnQgNTAxMS4KKyAqCisgKiAgSW4gYm90aCBzZXNzaW9ucywgd2Ugc2V0ICJydHBydHhyZWNlaXZlIiBhcyB0aGUgc2Vzc2lvbidzICJhdXgiIGVsZW1lbnQKKyAqICBpbiBydHBiaW4sIHdoaWNoIGVuYWJsZXMgUkZDNDU4OCByZXRyYW5zbWlzc2lvbiBoYW5kbGluZyBmb3IgdGhhdCBzZXNzaW9uLgorICoKKyAqICAgICAgICAgICAgIC4tLS0tLS0tLiAgICAgIC4tLS0tLS0tLS0tLiAgICAgICAgLi0tLS0tLS0tLS0tLiAgIC4tLS0tLS0tLS0uICAgLi0tLS0tLS0tLS0tLS0uCisgKiAgUlRQICAgICAgICB8dWRwc3JjIHwgICAgICB8IHJ0cGJpbiAgIHwgICAgICAgIHx0aGVvcmFkZXBheXwgICB8dGhlb3JhZGVjfCAgIHxhdXRvdmlkZW9zaW5rfAorICogIHBvcnQ9NTAwMCAgfCAgICAgIHNyYy0+cmVjdl9ydHBfMCByZWN2X3J0cF8wLT5zaW5rICAgICAgIHNyYy0+c2luayAgICAgc3JjLT5zaW5rICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICctLS0tLS0tJyAgICAgIHwgICAgICAgICAgfCAgICAgICAgJy0tLS0tLS0tLS0tJyAgICctLS0tLS0tLS0nICAgJy0tLS0tLS0tLS0tLS0nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgLi0tLS0tLS0uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIHx1ZHBzaW5rfCAgUlRDUAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgc2VuZF9ydGNwXzAtPnNpbmsgICAgIHwgcG9ydD01MDA1CisgKiAgICAgICAgICAgICAuLS0tLS0tLS4gICAgICB8ICAgICAgICAgIHwgICAgICctLS0tLS0tJyBzeW5jPWZhbHNlCisgKiAgUlRDUCAgICAgICB8dWRwc3JjIHwgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICBhc3luYz1mYWxzZQorICogIHBvcnQ9NTAwMSAgfCAgICAgc3JjLT5yZWN2X3J0Y3BfMCAgICB8CisgKiAgICAgICAgICAgICAnLS0tLS0tLScgICAgICB8ICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfAorICogICAgICAgICAgICAgLi0tLS0tLS0uICAgICAgfCAgICAgICAgICB8ICAgICAgICAuLS0tLS0tLS0tLiAgIC4tLS0tLS0tLiAgIC4tLS0tLS0tLS0tLS0tLgorICogIFJUUCAgICAgICAgfHVkcHNyYyB8ICAgICAgfCAgICAgICAgICB8ICAgICAgICB8cGNtYWRlcGF5fCAgIHxhbGF3ZGVjfCAgIHxhdXRvYXVkaW9zaW5rfAorICogIHBvcnQ9NTAwNiAgfCAgICAgIHNyYy0+cmVjdl9ydHBfMSByZWN2X3J0cF8xLT5zaW5rICAgICBzcmMtPnNpbmsgICBzcmMtPnNpbmsgICAgICAgICAgfAorICogICAgICAgICAgICAgJy0tLS0tLS0nICAgICAgfCAgICAgICAgICB8ICAgICAgICAnLS0tLS0tLS0tJyAgICctLS0tLS0tJyAgICctLS0tLS0tLS0tLS0tJworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIC4tLS0tLS0tLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICB8dWRwc2lua3wgIFJUQ1AKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIHNlbmRfcnRjcF8xLT5zaW5rICAgICB8IHBvcnQ9NTAxMQorICogICAgICAgICAgICAgLi0tLS0tLS0uICAgICAgfCAgICAgICAgICB8ICAgICAnLS0tLS0tLScgc3luYz1mYWxzZQorICogIFJUQ1AgICAgICAgfHVkcHNyYyB8ICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgYXN5bmM9ZmFsc2UKKyAqICBwb3J0PTUwMDcgIHwgICAgIHNyYy0+cmVjdl9ydGNwXzEgICAgfAorICogICAgICAgICAgICAgJy0tLS0tLS0nICAgICAgJy0tLS0tLS0tLS0nCisgKgorICovCisKK0dNYWluTG9vcCAqbG9vcCA9IE5VTEw7CisKK3R5cGVkZWYgc3RydWN0IF9TZXNzaW9uRGF0YQoreworICBpbnQgcmVmOworICBHc3RFbGVtZW50ICpydHBiaW47CisgIGd1aW50IHNlc3Npb25OdW07CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdEVsZW1lbnQgKm91dHB1dDsKK30gU2Vzc2lvbkRhdGE7CisKK3N0YXRpYyBTZXNzaW9uRGF0YSAqCitzZXNzaW9uX3JlZiAoU2Vzc2lvbkRhdGEgKiBkYXRhKQoreworICBnX2F0b21pY19pbnRfaW5jICgmZGF0YS0+cmVmKTsKKyAgcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkCitzZXNzaW9uX3VucmVmIChncG9pbnRlciBkYXRhKQoreworICBTZXNzaW9uRGF0YSAqc2Vzc2lvbiA9IChTZXNzaW9uRGF0YSAqKSBkYXRhOworICBpZiAoZ19hdG9taWNfaW50X2RlY19hbmRfdGVzdCAoJnNlc3Npb24tPnJlZikpIHsKKyAgICBnX29iamVjdF91bnJlZiAoc2Vzc2lvbi0+cnRwYmluKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoc2Vzc2lvbi0+Y2Fwcyk7CisgICAgZ19mcmVlIChzZXNzaW9uKTsKKyAgfQorfQorCitzdGF0aWMgU2Vzc2lvbkRhdGEgKgorc2Vzc2lvbl9uZXcgKGd1aW50IHNlc3Npb25OdW0pCit7CisgIFNlc3Npb25EYXRhICpyZXQgPSBnX25ldzAgKFNlc3Npb25EYXRhLCAxKTsKKyAgcmV0LT5zZXNzaW9uTnVtID0gc2Vzc2lvbk51bTsKKyAgcmV0dXJuIHNlc3Npb25fcmVmIChyZXQpOworfQorCitzdGF0aWMgdm9pZAorc2V0dXBfZ2hvc3Rfc2luayAoR3N0RWxlbWVudCAqIHNpbmssIEdzdEJpbiAqIGJpbikKK3sKKyAgR3N0UGFkICpzaW5rUGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNpbmssICJzaW5rIik7CisgIEdzdFBhZCAqYmluUGFkID0gZ3N0X2dob3N0X3BhZF9uZXcgKCJzaW5rIiwgc2lua1BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChiaW4pLCBiaW5QYWQpOworfQorCitzdGF0aWMgU2Vzc2lvbkRhdGEgKgorbWFrZV9hdWRpb19zZXNzaW9uIChndWludCBzZXNzaW9uTnVtKQoreworICBTZXNzaW9uRGF0YSAqcmV0ID0gc2Vzc2lvbl9uZXcgKHNlc3Npb25OdW0pOworICBHc3RCaW4gKmJpbiA9IEdTVF9CSU4gKGdzdF9iaW5fbmV3ICgiYXVkaW8iKSk7CisgIEdzdEVsZW1lbnQgKnF1ZXVlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicXVldWUiLCBOVUxMKTsKKyAgR3N0RWxlbWVudCAqc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1dG9hdWRpb3NpbmsiLCBOVUxMKTsKKyAgR3N0RWxlbWVudCAqYXVkaW9jb252ZXJ0ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW9jb252ZXJ0IiwgTlVMTCk7CisgIEdzdEVsZW1lbnQgKmF1ZGlvcmVzYW1wbGUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb3Jlc2FtcGxlIiwgTlVMTCk7CisgIEdzdEVsZW1lbnQgKmRlcGF5bG9hZGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwcGNtYWRlcGF5IiwgTlVMTCk7CisgIEdzdEVsZW1lbnQgKmRlY29kZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhbGF3ZGVjIiwgTlVMTCk7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoYmluLCBxdWV1ZSwgZGVwYXlsb2FkZXIsIGRlY29kZXIsIGF1ZGlvY29udmVydCwKKyAgICAgIGF1ZGlvcmVzYW1wbGUsIHNpbmssIE5VTEwpOworICBnc3RfZWxlbWVudF9saW5rX21hbnkgKHF1ZXVlLCBkZXBheWxvYWRlciwgZGVjb2RlciwgYXVkaW9jb252ZXJ0LAorICAgICAgYXVkaW9yZXNhbXBsZSwgc2luaywgTlVMTCk7CisKKyAgc2V0dXBfZ2hvc3Rfc2luayAocXVldWUsIGJpbik7CisKKyAgcmV0LT5vdXRwdXQgPSBHU1RfRUxFTUVOVCAoYmluKTsKKyAgcmV0LT5jYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtcnRwIiwKKyAgICAgICJtZWRpYSIsIEdfVFlQRV9TVFJJTkcsICJhdWRpbyIsCisgICAgICAiY2xvY2stcmF0ZSIsIEdfVFlQRV9JTlQsIDgwMDAsCisgICAgICAiZW5jb2RpbmctbmFtZSIsIEdfVFlQRV9TVFJJTkcsICJQQ01BIiwgTlVMTCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIFNlc3Npb25EYXRhICoKK21ha2VfdmlkZW9fc2Vzc2lvbiAoZ3VpbnQgc2Vzc2lvbk51bSkKK3sKKyAgU2Vzc2lvbkRhdGEgKnJldCA9IHNlc3Npb25fbmV3IChzZXNzaW9uTnVtKTsKKyAgR3N0QmluICpiaW4gPSBHU1RfQklOIChnc3RfYmluX25ldyAoInZpZGVvIikpOworICBHc3RFbGVtZW50ICpxdWV1ZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInF1ZXVlIiwgTlVMTCk7CisgIEdzdEVsZW1lbnQgKmRlcGF5bG9hZGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwdGhlb3JhZGVwYXkiLCBOVUxMKTsKKyAgR3N0RWxlbWVudCAqZGVjb2RlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInRoZW9yYWRlYyIsIE5VTEwpOworICBHc3RFbGVtZW50ICpjb252ZXJ0ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb2NvbnZlcnQiLCBOVUxMKTsKKyAgR3N0RWxlbWVudCAqc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1dG92aWRlb3NpbmsiLCBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChiaW4sIGRlcGF5bG9hZGVyLCBkZWNvZGVyLCBjb252ZXJ0ZXIsIHF1ZXVlLCBzaW5rLCBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19tYW55IChxdWV1ZSwgZGVwYXlsb2FkZXIsIGRlY29kZXIsIGNvbnZlcnRlciwgc2luaywgTlVMTCk7CisKKyAgc2V0dXBfZ2hvc3Rfc2luayAocXVldWUsIGJpbik7CisKKyAgcmV0LT5vdXRwdXQgPSBHU1RfRUxFTUVOVCAoYmluKTsKKyAgcmV0LT5jYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtcnRwIiwKKyAgICAgICJtZWRpYSIsIEdfVFlQRV9TVFJJTkcsICJ2aWRlbyIsCisgICAgICAiY2xvY2stcmF0ZSIsIEdfVFlQRV9JTlQsIDkwMDAwLAorICAgICAgImVuY29kaW5nLW5hbWUiLCBHX1RZUEVfU1RSSU5HLCAiVEhFT1JBIiwgTlVMTCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdENhcHMgKgorcmVxdWVzdF9wdF9tYXAgKEdzdEVsZW1lbnQgKiBydHBiaW4sIGd1aW50IHNlc3Npb24sIGd1aW50IHB0LAorICAgIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgU2Vzc2lvbkRhdGEgKmRhdGEgPSAoU2Vzc2lvbkRhdGEgKikgdXNlcl9kYXRhOworICBnY2hhciAqY2Fwc19zdHI7CisgIGdfcHJpbnQgKCJMb29raW5nIGZvciBjYXBzIGZvciBwdCAldSBpbiBzZXNzaW9uICV1LCBoYXZlICV1XG4iLCBwdCwgc2Vzc2lvbiwKKyAgICAgIGRhdGEtPnNlc3Npb25OdW0pOworICBpZiAoc2Vzc2lvbiA9PSBkYXRhLT5zZXNzaW9uTnVtKSB7CisgICAgY2Fwc19zdHIgPSBnc3RfY2Fwc190b19zdHJpbmcgKGRhdGEtPmNhcHMpOworICAgIGdfcHJpbnQgKCJSZXR1cm5pbmcgJXNcbiIsIGNhcHNfc3RyKTsKKyAgICBnX2ZyZWUgKGNhcHNfc3RyKTsKKyAgICByZXR1cm4gZ3N0X2NhcHNfcmVmIChkYXRhLT5jYXBzKTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2NiX2VvcyAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgZ19wcmludCAoIkdvdCBFT1NcbiIpOworICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKK30KKworc3RhdGljIHZvaWQKK2NiX3N0YXRlIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBncG9pbnRlciBkYXRhKQoreworICBHc3RPYmplY3QgKnBpcGUgPSBHU1RfT0JKRUNUIChkYXRhKTsKKyAgR3N0U3RhdGUgb2xkLCBuZXcsIHBlbmRpbmc7CisgIGdzdF9tZXNzYWdlX3BhcnNlX3N0YXRlX2NoYW5nZWQgKG1lc3NhZ2UsICZvbGQsICZuZXcsICZwZW5kaW5nKTsKKyAgaWYgKG1lc3NhZ2UtPnNyYyA9PSBwaXBlKSB7CisgICAgZ19wcmludCAoIlBpcGVsaW5lICVzIGNoYW5nZWQgc3RhdGUgZnJvbSAlcyB0byAlc1xuIiwKKyAgICAgICAgR1NUX09CSkVDVF9OQU1FIChtZXNzYWdlLT5zcmMpLAorICAgICAgICBnc3RfZWxlbWVudF9zdGF0ZV9nZXRfbmFtZSAob2xkKSwgZ3N0X2VsZW1lbnRfc3RhdGVfZ2V0X25hbWUgKG5ldykpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjYl93YXJuaW5nIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBncG9pbnRlciBkYXRhKQoreworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKyAgZ3N0X21lc3NhZ2VfcGFyc2Vfd2FybmluZyAobWVzc2FnZSwgJmVycm9yLCBOVUxMKTsKKyAgZ19wcmludGVyciAoIkdvdCB3YXJuaW5nIGZyb20gJXM6ICVzXG4iLCBHU1RfT0JKRUNUX05BTUUgKG1lc3NhZ2UtPnNyYyksCisgICAgICBlcnJvci0+bWVzc2FnZSk7CisgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworfQorCitzdGF0aWMgdm9pZAorY2JfZXJyb3IgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsIGdwb2ludGVyIGRhdGEpCit7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobWVzc2FnZSwgJmVycm9yLCBOVUxMKTsKKyAgZ19wcmludGVyciAoIkdvdCBlcnJvciBmcm9tICVzOiAlc1xuIiwgR1NUX09CSkVDVF9OQU1FIChtZXNzYWdlLT5zcmMpLAorICAgICAgZXJyb3ItPm1lc3NhZ2UpOworICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfbmV3X3N0cmVhbSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZCAqIG5ld1BhZCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgU2Vzc2lvbkRhdGEgKnNlc3Npb24gPSAoU2Vzc2lvbkRhdGEgKikgZGF0YTsKKyAgZ2NoYXIgKnBhZE5hbWU7CisgIGdjaGFyICpteVByZWZpeDsKKworICBwYWROYW1lID0gZ3N0X3BhZF9nZXRfbmFtZSAobmV3UGFkKTsKKyAgbXlQcmVmaXggPSBnX3N0cmR1cF9wcmludGYgKCJyZWN2X3J0cF9zcmNfJXUiLCBzZXNzaW9uLT5zZXNzaW9uTnVtKTsKKworICBnX3ByaW50ICgiTmV3IHBhZDogJXMsIGxvb2tpbmcgZm9yICVzXypcbiIsIHBhZE5hbWUsIG15UHJlZml4KTsKKworICBpZiAoZ19zdHJfaGFzX3ByZWZpeCAocGFkTmFtZSwgbXlQcmVmaXgpKSB7CisgICAgR3N0UGFkICpvdXRwdXRTaW5rUGFkOworICAgIEdzdEVsZW1lbnQgKnBhcmVudDsKKworICAgIHBhcmVudCA9IEdTVF9FTEVNRU5UIChnc3RfZWxlbWVudF9nZXRfcGFyZW50IChzZXNzaW9uLT5ydHBiaW4pKTsKKyAgICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGFyZW50KSwgc2Vzc2lvbi0+b3V0cHV0KTsKKyAgICBnc3RfZWxlbWVudF9zeW5jX3N0YXRlX3dpdGhfcGFyZW50IChzZXNzaW9uLT5vdXRwdXQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHBhcmVudCk7CisKKyAgICBvdXRwdXRTaW5rUGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNlc3Npb24tPm91dHB1dCwgInNpbmsiKTsKKyAgICBnX2Fzc2VydF9jbXBpbnQgKGdzdF9wYWRfbGluayAobmV3UGFkLCBvdXRwdXRTaW5rUGFkKSwgPT0sIEdTVF9QQURfTElOS19PSyk7CisgICAgZ3N0X29iamVjdF91bnJlZiAob3V0cHV0U2lua1BhZCk7CisKKyAgICBnX3ByaW50ICgiTGlua2VkIVxuIik7CisgIH0KKyAgZ19mcmVlIChteVByZWZpeCk7CisgIGdfZnJlZSAocGFkTmFtZSk7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3JlcXVlc3RfYXV4X3JlY2VpdmVyIChHc3RFbGVtZW50ICogcnRwYmluLCBndWludCBzZXNzaWQsIFNlc3Npb25EYXRhICogc2Vzc2lvbikKK3sKKyAgR3N0RWxlbWVudCAqcnR4LCAqYmluOworICBHc3RQYWQgKnBhZDsKKyAgZ2NoYXIgKm5hbWU7CisgIEdzdFN0cnVjdHVyZSAqcHRfbWFwOworCisgIEdTVF9JTkZPICgiY3JlYXRpbmcgQVVYIHJlY2VpdmVyIik7CisgIGJpbiA9IGdzdF9iaW5fbmV3IChOVUxMKTsKKyAgcnR4ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwcnR4cmVjZWl2ZSIsIE5VTEwpOworICBwdF9tYXAgPSBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLXB0LW1hcCIsCisgICAgICAiOCIsIEdfVFlQRV9VSU5ULCA5OCwgIjk2IiwgR19UWVBFX1VJTlQsIDk5LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChydHgsICJwYXlsb2FkLXR5cGUtbWFwIiwgcHRfbWFwLCBOVUxMKTsKKyAgZ3N0X3N0cnVjdHVyZV9mcmVlIChwdF9tYXApOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAoYmluKSwgcnR4KTsKKworICBwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocnR4LCAic3JjIik7CisgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzcmNfJXUiLCBzZXNzaWQpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChiaW4sIGdzdF9naG9zdF9wYWRfbmV3IChuYW1lLCBwYWQpKTsKKyAgZ19mcmVlIChuYW1lKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGFkKTsKKworICBwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocnR4LCAic2luayIpOworICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgic2lua18ldSIsIHNlc3NpZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGJpbiwgZ3N0X2dob3N0X3BhZF9uZXcgKG5hbWUsIHBhZCkpOworICBnX2ZyZWUgKG5hbWUpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworCisgIHJldHVybiBiaW47Cit9CisKK3N0YXRpYyB2b2lkCitqb2luX3Nlc3Npb24gKEdzdEVsZW1lbnQgKiBwaXBlbGluZSwgR3N0RWxlbWVudCAqIHJ0cEJpbiwgU2Vzc2lvbkRhdGEgKiBzZXNzaW9uKQoreworICBHc3RFbGVtZW50ICpydHBTcmM7CisgIEdzdEVsZW1lbnQgKnJ0Y3BTcmM7CisgIEdzdEVsZW1lbnQgKnJ0Y3BTaW5rOworICBnY2hhciAqcGFkTmFtZTsKKyAgZ3VpbnQgYmFzZVBvcnQ7CisKKyAgZ19wcmludCAoIkpvaW5pbmcgc2Vzc2lvbiAlcFxuIiwgc2Vzc2lvbik7CisKKyAgc2Vzc2lvbi0+cnRwYmluID0gZ19vYmplY3RfcmVmIChydHBCaW4pOworCisgIGJhc2VQb3J0ID0gNTAwMCArIChzZXNzaW9uLT5zZXNzaW9uTnVtICogNik7CisKKyAgcnRwU3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidWRwc3JjIiwgTlVMTCk7CisgIHJ0Y3BTcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1ZHBzcmMiLCBOVUxMKTsKKyAgcnRjcFNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1ZHBzaW5rIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAocnRwU3JjLCAicG9ydCIsIGJhc2VQb3J0LCAiY2FwcyIsIHNlc3Npb24tPmNhcHMsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHJ0Y3BTaW5rLCAicG9ydCIsIGJhc2VQb3J0ICsgNSwgImhvc3QiLCAiMTI3LjAuMC4xIiwgInN5bmMiLAorICAgICAgRkFMU0UsICJhc3luYyIsIEZBTFNFLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChydGNwU3JjLCAicG9ydCIsIGJhc2VQb3J0ICsgMSwgTlVMTCk7CisKKyAgZ19wcmludCAoIkNvbm5lY3RpbmcgdG8gJWkvJWkvJWlcbiIsIGJhc2VQb3J0LCBiYXNlUG9ydCArIDEsIGJhc2VQb3J0ICsgNSk7CisKKyAgLyogZW5hYmxlIFJGQzQ1ODggcmV0cmFuc21pc3Npb24gaGFuZGxpbmcgYnkgc2V0dGluZyBydHBydHhyZWNlaXZlCisgICAqIGFzIHRoZSAiYXV4IiBlbGVtZW50IG9mIHJ0cGJpbiAqLworICBnX3NpZ25hbF9jb25uZWN0IChydHBCaW4sICJyZXF1ZXN0LWF1eC1yZWNlaXZlciIsCisgICAgICAoR0NhbGxiYWNrKSByZXF1ZXN0X2F1eF9yZWNlaXZlciwgc2Vzc2lvbik7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBydHBTcmMsIHJ0Y3BTcmMsIHJ0Y3BTaW5rLCBOVUxMKTsKKworICBnX3NpZ25hbF9jb25uZWN0X2RhdGEgKHJ0cEJpbiwgInBhZC1hZGRlZCIsIEdfQ0FMTEJBQ0sgKGhhbmRsZV9uZXdfc3RyZWFtKSwKKyAgICAgIHNlc3Npb25fcmVmIChzZXNzaW9uKSwgKEdDbG9zdXJlTm90aWZ5KSBzZXNzaW9uX3VucmVmLCAwKTsKKworICBnX3NpZ25hbF9jb25uZWN0X2RhdGEgKHJ0cEJpbiwgInJlcXVlc3QtcHQtbWFwIiwgR19DQUxMQkFDSyAocmVxdWVzdF9wdF9tYXApLAorICAgICAgc2Vzc2lvbl9yZWYgKHNlc3Npb24pLCAoR0Nsb3N1cmVOb3RpZnkpIHNlc3Npb25fdW5yZWYsIDApOworCisgIHBhZE5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJyZWN2X3J0cF9zaW5rXyV1Iiwgc2Vzc2lvbi0+c2Vzc2lvbk51bSk7CisgIGdzdF9lbGVtZW50X2xpbmtfcGFkcyAocnRwU3JjLCAic3JjIiwgcnRwQmluLCBwYWROYW1lKTsKKyAgZ19mcmVlIChwYWROYW1lKTsKKworICBwYWROYW1lID0gZ19zdHJkdXBfcHJpbnRmICgicmVjdl9ydGNwX3NpbmtfJXUiLCBzZXNzaW9uLT5zZXNzaW9uTnVtKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19wYWRzIChydGNwU3JjLCAic3JjIiwgcnRwQmluLCBwYWROYW1lKTsKKyAgZ19mcmVlIChwYWROYW1lKTsKKworICBwYWROYW1lID0gZ19zdHJkdXBfcHJpbnRmICgic2VuZF9ydGNwX3NyY18ldSIsIHNlc3Npb24tPnNlc3Npb25OdW0pOworICBnc3RfZWxlbWVudF9saW5rX3BhZHMgKHJ0cEJpbiwgcGFkTmFtZSwgcnRjcFNpbmssICJzaW5rIik7CisgIGdfZnJlZSAocGFkTmFtZSk7CisKKyAgc2Vzc2lvbl91bnJlZiAoc2Vzc2lvbik7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBHc3RQaXBlbGluZSAqcGlwZTsKKyAgU2Vzc2lvbkRhdGEgKnZpZGVvU2Vzc2lvbjsKKyAgU2Vzc2lvbkRhdGEgKmF1ZGlvU2Vzc2lvbjsKKyAgR3N0RWxlbWVudCAqcnRwQmluOworICBHc3RCdXMgKmJ1czsKKworICBnc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICBsb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisgIHBpcGUgPSBHU1RfUElQRUxJTkUgKGdzdF9waXBlbGluZV9uZXcgKE5VTEwpKTsKKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChHU1RfRUxFTUVOVCAocGlwZSkpOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjplcnJvciIsIEdfQ0FMTEJBQ0sgKGNiX2Vycm9yKSwgcGlwZSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6Ondhcm5pbmciLCBHX0NBTExCQUNLIChjYl93YXJuaW5nKSwgcGlwZSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OnN0YXRlLWNoYW5nZWQiLCBHX0NBTExCQUNLIChjYl9zdGF0ZSksIHBpcGUpOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjplb3MiLCBHX0NBTExCQUNLIChjYl9lb3MpLCBOVUxMKTsKKyAgZ3N0X2J1c19hZGRfc2lnbmFsX3dhdGNoIChidXMpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIHJ0cEJpbiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cGJpbiIsIE5VTEwpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZSksIHJ0cEJpbik7CisgIGdfb2JqZWN0X3NldCAocnRwQmluLCAibGF0ZW5jeSIsIDIwMCwgImRvLXJldHJhbnNtaXNzaW9uIiwgVFJVRSwKKyAgICAgICJydHAtcHJvZmlsZSIsIEdTVF9SVFBfUFJPRklMRV9BVlBGLCBOVUxMKTsKKworICB2aWRlb1Nlc3Npb24gPSBtYWtlX3ZpZGVvX3Nlc3Npb24gKDApOworICBhdWRpb1Nlc3Npb24gPSBtYWtlX2F1ZGlvX3Nlc3Npb24gKDEpOworCisgIGpvaW5fc2Vzc2lvbiAoR1NUX0VMRU1FTlQgKHBpcGUpLCBydHBCaW4sIHZpZGVvU2Vzc2lvbik7CisgIGpvaW5fc2Vzc2lvbiAoR1NUX0VMRU1FTlQgKHBpcGUpLCBydHBCaW4sIGF1ZGlvU2Vzc2lvbik7CisKKyAgZ19wcmludCAoInN0YXJ0aW5nIGNsaWVudCBwaXBlbGluZVxuIik7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoR1NUX0VMRU1FTlQgKHBpcGUpLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgZ19tYWluX2xvb3BfcnVuIChsb29wKTsKKworICBnX3ByaW50ICgic3RvcGluZyBjbGllbnQgcGlwZWxpbmVcbiIpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKEdTVF9FTEVNRU5UIChwaXBlKSwgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGUpOworICBnX21haW5fbG9vcF91bnJlZiAobG9vcCk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LXJ0cGJ1bmRsZS5jIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1ydHBidW5kbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDNhNzM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1ydHBidW5kbGUuYwpAQCAtMCwwICsxLDI2NiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSWdhbGlhIFMuTAorICogICBAYXV0aG9yIFBoaWxpcHBlIE5vcm1hbmQgPHBoaWxuQGlnYWxpYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworLyoKKyAqIFJUUCBidW5kbGUgcmVjZWl2ZXIKKyAqCisgKiBJbiB0aGlzIGV4YW1wbGUgd2UgaW5pdGlhbGx5IGNyZWF0ZSBvbmUgUlRQIHNlc3Npb24gYnV0IHRoZSBpbmNvbWluZyBSVFAKKyAqIGFuZCBSVENQIHN0cmVhbXMgYWN0dWFsbHkgYnVuZGxlIDIgZGlmZmVyZW50IG1lZGlhIHR5cGUsIG9uZSBhdWRpbyBzdHJlYW0KKyAqIGFuZCBvbmUgdmlkZW8gc3RyZWFtLiBXZSBhcmUgbm90aWZpZWQgb2YgdGhlIGRpc2NvdmVyeSBvZiB0aGUgc3RyZWFtcyBieQorICogdGhlIG9uLWJ1bmRsZWQtc3NyYyBydHBiaW4gc2lnbmFsLiBJbiB0aGUgaGFuZGxlciB3ZSBkZWNpZGUgdG8gYXNzaWduIHRoZQorICogZmlyc3QgU1NSQyB0byB0aGUgKGV4aXN0aW5nKSBhdWRpbyBzZXNzaW9uIGFuZCB0aGUgc2Vjb25kIFNTUkMgdG8gYSBuZXcKKyAqIHNlc3Npb24gKGlkOiAxKS4KKyAqCisgKiAgICAgICAgICAgICAuLS0tLS0tLS4gICAgICAuLS0tLS0tLS0tLS4gICAgICAgIC4tLS0tLS0tLS0tLS4gICAgLi0tLS0tLS0uICAgIC4tLS0tLS0tLS0tLS0tLgorICogIFJUUCAgICAgICAgfHVkcHNyYyB8ICAgICAgfCBydHBiaW4gICB8ICAgICAgICB8IHBjbWFkZXBheSB8ICAgIHxhbGF3ZGVjfCAgICB8YXV0b2F1ZGlvc2lua3wKKyAqICBwb3J0PTUwMDEgIHwgICAgICBzcmMtPnJlY3ZfcnRwXzAgcmVjdl9ydHBfMC0+c2luayAgICAgICBzcmMtPnNpbmsgICAgc3JjLT5zaW5rICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAnLS0tLS0tLScgICAgICB8ICAgICAgICAgIHwgICAgICAgICctLS0tLS0tLS0tLScgICAgJy0tLS0tLS0nICAgICctLS0tLS0tLS0tLS0tJworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIC4tLS0tLS0tLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICB8dWRwc2lua3wgIFJUQ1AKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIHNlbmRfcnRjcF8wLT5zaW5rICAgICB8IHBvcnQ9NTAwMworICogICAgICAgICAgICAgLi0tLS0tLS0uICAgICAgfCAgICAgICAgICB8ICAgICAnLS0tLS0tLScgc3luYz1mYWxzZQorICogIFJUQ1AgICAgICAgfHVkcHNyYyB8ICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgYXN5bmM9ZmFsc2UKKyAqICBwb3J0PTUwMDIgIHwgICAgIHNyYy0+cmVjdl9ydGNwXzAgICAgfAorICogICAgICAgICAgICAgJy0tLS0tLS0nICAgICAgfCAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgLi0tLS0tLS0tLS4gICAgLi0tLS0tLS0tLS0tLS0uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgIHx2cmF3ZGVwYXl8ICAgIHxhdXRvdmlkZW9zaW5rfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICByZWN2X3J0cF8xLT5zaW5rICAgICBzcmMtPnNpbmsgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgJy0tLS0tLS0tLScgICAgJy0tLS0tLS0tLS0tLS0nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgLi0tLS0tLS0uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIHx1ZHBzaW5rfCAgUlRDUAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgc2VuZF9ydGNwXzEtPnNpbmsgICAgIHwgcG9ydD01MDA0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICctLS0tLS0tJyBzeW5jPWZhbHNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICBhc3luYz1mYWxzZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS0tLS0tLS0tLScKKyAqCisgKi8KKworc3RhdGljIGdib29sZWFuCitwbHVnX3ZpZGVvX3J0Y3Bfc2VuZGVyIChncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGdpbnQgc2VuZF92aWRlb19ydGNwX3BvcnQgPSA1MDA0OworICBHc3RFbGVtZW50ICpydHBiaW4gPSBHU1RfRUxFTUVOVF9DQVNUICh1c2VyX2RhdGEpOworICBHc3RFbGVtZW50ICpzZW5kX3ZpZGVvX3J0Y3BfdWRwc2luazsKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmUgPQorICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAoZ3N0X29iamVjdF9nZXRfcGFyZW50IChHU1RfT0JKRUNUIChydHBiaW4pKSk7CisKKyAgc2VuZF92aWRlb19ydGNwX3VkcHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1ZHBzaW5rIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc2VuZF92aWRlb19ydGNwX3VkcHNpbmssICJob3N0IiwgIjEyNy4wLjAuMSIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNlbmRfdmlkZW9fcnRjcF91ZHBzaW5rLCAicG9ydCIsIHNlbmRfdmlkZW9fcnRjcF9wb3J0LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzZW5kX3ZpZGVvX3J0Y3BfdWRwc2luaywgInN5bmMiLCBGQUxTRSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc2VuZF92aWRlb19ydGNwX3VkcHNpbmssICJhc3luYyIsIEZBTFNFLCBOVUxMKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc2VuZF92aWRlb19ydGNwX3VkcHNpbmspOworICBnc3RfZWxlbWVudF9saW5rX3BhZHMgKHJ0cGJpbiwgInNlbmRfcnRjcF9zcmNfMSIsIHNlbmRfdmlkZW9fcnRjcF91ZHBzaW5rLAorICAgICAgInNpbmsiKTsKKyAgZ3N0X2VsZW1lbnRfc3luY19zdGF0ZV93aXRoX3BhcmVudCAoc2VuZF92aWRlb19ydGNwX3VkcHNpbmspOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocnRwYmluKTsKKyAgcmV0dXJuIEdfU09VUkNFX1JFTU9WRTsKK30KKworc3RhdGljIHZvaWQKK29uX3J0cGJpbnJlY2VpdmVfcGFkX2FkZGVkIChHc3RFbGVtZW50ICogcnRwYmluLCBHc3RQYWQgKiBuZXdfcGFkLAorICAgIGdwb2ludGVyIGRhdGEpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lID0gR1NUX0VMRU1FTlQgKGRhdGEpOworICBnY2hhciAqcGFkX25hbWUgPSBnc3RfcGFkX2dldF9uYW1lIChuZXdfcGFkKTsKKworICBpZiAoZ19zdHJfaGFzX3ByZWZpeCAocGFkX25hbWUsICJyZWN2X3J0cF9zcmNfIikpIHsKKyAgICBHc3RDYXBzICpjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChuZXdfcGFkKTsKKyAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgICBjb25zdCBnY2hhciAqbWVkaWFfdHlwZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgIm1lZGlhIik7CisgICAgZ2NoYXIgKmRlcGF5bG9hZGVyX25hbWUgPSBnX3N0cmR1cF9wcmludGYgKCIlc19ydHBkZXBheWxvYWRlciIsIG1lZGlhX3R5cGUpOworICAgIEdzdEVsZW1lbnQgKnJ0cGRlcGF5bG9hZGVyID0KKyAgICAgICAgZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAocGlwZWxpbmUpLCBkZXBheWxvYWRlcl9uYW1lKTsKKyAgICBHc3RQYWQgKnNpbmtwYWQ7CisKKyAgICBnX2ZyZWUgKGRlcGF5bG9hZGVyX25hbWUpOworCisgICAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChydHBkZXBheWxvYWRlciwgInNpbmsiKTsKKyAgICBnc3RfcGFkX2xpbmsgKG5ld19wYWQsIHNpbmtwYWQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cGRlcGF5bG9hZGVyKTsKKworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAgIGlmIChnX3N0cl9oYXNfcHJlZml4IChwYWRfbmFtZSwgInJlY3ZfcnRwX3NyY18xIikpIHsKKyAgICAgIGdfdGltZW91dF9hZGQgKDAsIHBsdWdfdmlkZW9fcnRjcF9zZW5kZXIsIGdzdF9vYmplY3RfcmVmIChydHBiaW4pKTsKKyAgICB9CisgIH0KKyAgZ19mcmVlIChwYWRfbmFtZSk7Cit9CisKK3N0YXRpYyBndWludAorb25fYnVuZGxlZF9zc3JjIChHc3RFbGVtZW50ICogcnRwYmluLCBndWludCBzc3JjLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIHN0YXRpYyBnYm9vbGVhbiBjcmVhdGVfc2Vzc2lvbiA9IEZBTFNFOworICBndWludCBzZXNzaW9uX2lkID0gMDsKKworICBpZiAoY3JlYXRlX3Nlc3Npb24pIHsKKyAgICBzZXNzaW9uX2lkID0gMTsKKyAgfSBlbHNlIHsKKyAgICBjcmVhdGVfc2Vzc2lvbiA9IFRSVUU7CisgICAgLyogdXNlIGV4aXN0aW5nIHNlc3Npb24gMCwgYSBuZXcgc2Vzc2lvbiB3aWxsIGJlIGNyZWF0ZWQgZm9yIHRoZSBuZXh0IGRpc2NvdmVyZWQgYnVuZGxlZCBTU1JDICovCisgIH0KKyAgcmV0dXJuIHNlc3Npb25faWQ7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK29uX3JlcXVlc3RfcHRfbWFwIChHc3RFbGVtZW50ICogcnRwYmluLCBndWludCBzZXNzaW9uX2lkLCBndWludCBwdCwKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworICBpZiAocHQgPT0gOTYpIHsKKyAgICBjYXBzID0KKyAgICAgICAgZ3N0X2NhcHNfZnJvbV9zdHJpbmcKKyAgICAgICAgKCJhcHBsaWNhdGlvbi94LXJ0cCxtZWRpYT0oc3RyaW5nKWF1ZGlvLGVuY29kaW5nLW5hbWU9KHN0cmluZylQQ01BLGNsb2NrLXJhdGU9KGludCk4MDAwIik7CisgIH0gZWxzZSBpZiAocHQgPT0gMTAwKSB7CisgICAgY2FwcyA9CisgICAgICAgIGdzdF9jYXBzX2Zyb21fc3RyaW5nCisgICAgICAgICgiYXBwbGljYXRpb24veC1ydHAsbWVkaWE9KHN0cmluZyl2aWRlbyxlbmNvZGluZy1uYW1lPShzdHJpbmcpUkFXLGNsb2NrLXJhdGU9KGludCk5MDAwMCxzYW1wbGluZz0oc3RyaW5nKVwiWUNiQ3ItNDoyOjBcIixkZXB0aD0oc3RyaW5nKTgsd2lkdGg9KHN0cmluZykzMjAsaGVpZ2h0PShzdHJpbmcpMjQwIik7CisgIH0KKyAgcmV0dXJuIGNhcHM7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK2NyZWF0ZV9waXBlbGluZSAodm9pZCkKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmUsICpydHBiaW4sICpyZWN2X3J0cF91ZHBzcmMsICpyZWN2X3J0Y3BfdWRwc3JjLAorICAgICAgKmF1ZGlvX3J0cGRlcGF5bG9hZGVyLCAqYXVkaW9fZGVjb2RlciwgKmF1ZGlvX3NpbmssICp2aWRlb19ydHBkZXBheWxvYWRlciwKKyAgICAgICp2aWRlb19zaW5rLCAqc2VuZF9hdWRpb19ydGNwX3VkcHNpbms7CisgIEdzdENhcHMgKnJ0cGNhcHM7CisgIGdpbnQgcnRwX3VkcF9wb3J0ID0gNTAwMTsKKyAgZ2ludCBydGNwX3VkcF9wb3J0ID0gNTAwMjsKKyAgZ2ludCBzZW5kX2F1ZGlvX3J0Y3BfcG9ydCA9IDUwMDM7CisKKyAgcGlwZWxpbmUgPSBnc3RfcGlwZWxpbmVfbmV3IChOVUxMKTsKKworICBydHBiaW4gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBiaW4iLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChydHBiaW4sICJsYXRlbmN5IiwgMjAwLCBOVUxMKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChydHBiaW4sICJvbi1idW5kbGVkLXNzcmMiLAorICAgICAgR19DQUxMQkFDSyAob25fYnVuZGxlZF9zc3JjKSwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cGJpbiwgInJlcXVlc3QtcHQtbWFwIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKG9uX3JlcXVlc3RfcHRfbWFwKSwgTlVMTCk7CisKKyAgZ19zaWduYWxfY29ubmVjdCAocnRwYmluLCAicGFkLWFkZGVkIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKG9uX3J0cGJpbnJlY2VpdmVfcGFkX2FkZGVkKSwgcGlwZWxpbmUpOworCisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIHJ0cGJpbik7CisKKyAgcmVjdl9ydHBfdWRwc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidWRwc3JjIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAocmVjdl9ydHBfdWRwc3JjLCAicG9ydCIsIHJ0cF91ZHBfcG9ydCwgTlVMTCk7CisgIHJ0cGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoImFwcGxpY2F0aW9uL3gtcnRwIik7CisgIGdfb2JqZWN0X3NldCAocmVjdl9ydHBfdWRwc3JjLCAiY2FwcyIsIHJ0cGNhcHMsIE5VTEwpOworICBnc3RfY2Fwc191bnJlZiAocnRwY2Fwcyk7CisKKyAgcmVjdl9ydGNwX3VkcHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInVkcHNyYyIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHJlY3ZfcnRjcF91ZHBzcmMsICJwb3J0IiwgcnRjcF91ZHBfcG9ydCwgTlVMTCk7CisKKyAgYXVkaW9fcnRwZGVwYXlsb2FkZXIgPQorICAgICAgZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwcGNtYWRlcGF5IiwgImF1ZGlvX3J0cGRlcGF5bG9hZGVyIik7CisgIGF1ZGlvX2RlY29kZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhbGF3ZGVjIiwgTlVMTCk7CisgIGF1ZGlvX3NpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdXRvYXVkaW9zaW5rIiwgTlVMTCk7CisKKyAgdmlkZW9fcnRwZGVwYXlsb2FkZXIgPQorICAgICAgZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwdnJhd2RlcGF5IiwgInZpZGVvX3J0cGRlcGF5bG9hZGVyIik7CisgIHZpZGVvX3NpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdXRvdmlkZW9zaW5rIiwgTlVMTCk7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCByZWN2X3J0cF91ZHBzcmMsIHJlY3ZfcnRjcF91ZHBzcmMsCisgICAgICBhdWRpb19ydHBkZXBheWxvYWRlciwgYXVkaW9fZGVjb2RlciwgYXVkaW9fc2luaywgdmlkZW9fcnRwZGVwYXlsb2FkZXIsCisgICAgICB2aWRlb19zaW5rLCBOVUxMKTsKKworICBnc3RfZWxlbWVudF9saW5rX3BhZHMgKGF1ZGlvX3J0cGRlcGF5bG9hZGVyLCAic3JjIiwgYXVkaW9fZGVjb2RlciwgInNpbmsiKTsKKyAgZ3N0X2VsZW1lbnRfbGluayAoYXVkaW9fZGVjb2RlciwgYXVkaW9fc2luayk7CisKKyAgZ3N0X2VsZW1lbnRfbGlua19wYWRzICh2aWRlb19ydHBkZXBheWxvYWRlciwgInNyYyIsIHZpZGVvX3NpbmssICJzaW5rIik7CisKKyAgLyogcmVxdWVzdCBhIHNpbmdsZSByZWNlaXZpbmcgUlRQIHNlc3Npb24uICovCisgIGdzdF9lbGVtZW50X2xpbmtfcGFkcyAocmVjdl9ydGNwX3VkcHNyYywgInNyYyIsIHJ0cGJpbiwgInJlY3ZfcnRjcF9zaW5rXzAiKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19wYWRzIChyZWN2X3J0cF91ZHBzcmMsICJzcmMiLCBydHBiaW4sICJyZWN2X3J0cF9zaW5rXzAiKTsKKworICBzZW5kX2F1ZGlvX3J0Y3BfdWRwc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInVkcHNpbmsiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzZW5kX2F1ZGlvX3J0Y3BfdWRwc2luaywgImhvc3QiLCAiMTI3LjAuMC4xIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc2VuZF9hdWRpb19ydGNwX3VkcHNpbmssICJwb3J0Iiwgc2VuZF9hdWRpb19ydGNwX3BvcnQsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNlbmRfYXVkaW9fcnRjcF91ZHBzaW5rLCAic3luYyIsIEZBTFNFLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzZW5kX2F1ZGlvX3J0Y3BfdWRwc2luaywgImFzeW5jIiwgRkFMU0UsIE5VTEwpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBzZW5kX2F1ZGlvX3J0Y3BfdWRwc2luayk7CisgIGdzdF9lbGVtZW50X2xpbmtfcGFkcyAocnRwYmluLCAic2VuZF9ydGNwX3NyY18wIiwgc2VuZF9hdWRpb19ydGNwX3VkcHNpbmssCisgICAgICAic2luayIpOworCisgIHJldHVybiBwaXBlbGluZTsKK30KKworLyoKKyAqIFVzZWQgdG8gZ2VuZXJhdGUgaW5mb3JtYXRpdmUgbWVzc2FnZXMgZHVyaW5nIHBpcGVsaW5lIHN0YXJ0dXAKKyAqLworc3RhdGljIHZvaWQKK2NiX3N0YXRlIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBncG9pbnRlciBkYXRhKQoreworICBHc3RPYmplY3QgKnBpcGUgPSBHU1RfT0JKRUNUIChkYXRhKTsKKyAgR3N0U3RhdGUgb2xkLCBuZXcsIHBlbmRpbmc7CisgIGdzdF9tZXNzYWdlX3BhcnNlX3N0YXRlX2NoYW5nZWQgKG1lc3NhZ2UsICZvbGQsICZuZXcsICZwZW5kaW5nKTsKKyAgaWYgKG1lc3NhZ2UtPnNyYyA9PSBwaXBlKSB7CisgICAgZ19wcmludCAoIlBpcGVsaW5lICVzIGNoYW5nZWQgc3RhdGUgZnJvbSAlcyB0byAlc1xuIiwKKyAgICAgICAgR1NUX09CSkVDVF9OQU1FIChtZXNzYWdlLT5zcmMpLAorICAgICAgICBnc3RfZWxlbWVudF9zdGF0ZV9nZXRfbmFtZSAob2xkKSwgZ3N0X2VsZW1lbnRfc3RhdGVfZ2V0X25hbWUgKG5ldykpOworICAgIGlmIChvbGQgPT0gR1NUX1NUQVRFX1BBVVNFRCAmJiBuZXcgPT0gR1NUX1NUQVRFX1BMQVlJTkcpCisgICAgICBHU1RfREVCVUdfQklOX1RPX0RPVF9GSUxFIChHU1RfQklOIChwaXBlKSwgR1NUX0RFQlVHX0dSQVBIX1NIT1dfQUxMLAorICAgICAgICAgIEdTVF9PQkpFQ1RfTkFNRSAobWVzc2FnZS0+c3JjKSk7CisgIH0KK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIEdzdEVsZW1lbnQgKnBpcGU7CisgIEdzdEJ1cyAqYnVzOworICBHTWFpbkxvb3AgKmxvb3A7CisKKyAgZ3N0X2luaXQgKCZhcmdjLCAmYXJndik7CisKKyAgbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgRkFMU0UpOworCisgIHBpcGUgPSBjcmVhdGVfcGlwZWxpbmUgKCk7CisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKHBpcGUpOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjpzdGF0ZS1jaGFuZ2VkIiwgR19DQUxMQkFDSyAoY2Jfc3RhdGUpLCBwaXBlKTsKKyAgZ3N0X2J1c19hZGRfc2lnbmFsX3dhdGNoIChidXMpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIGdfcHJpbnQgKCJzdGFydGluZyBzZXJ2ZXIgcGlwZWxpbmVcbiIpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICBnX21haW5fbG9vcF9ydW4gKGxvb3ApOworCisgIGdfcHJpbnQgKCJzdG9wcGluZyBzZXJ2ZXIgcGlwZWxpbmVcbiIpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGUsIEdTVF9TVEFURV9OVUxMKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlKTsKKyAgZ19tYWluX2xvb3BfdW5yZWYgKGxvb3ApOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL21lc29uLmJ1aWxkIGIvdGVzdHMvZXhhbXBsZXMvcnRwL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MjhhMTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ydHAvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxNiBAQAorcnRwX3Byb2dzID0gWworICAnc2VydmVyLWFsc2FzcmMtUENNQScsCisgICdjbGllbnQtUENNQScsCisgICdjbGllbnQtcnRwYXV4JywKKyAgJ3NlcnZlci1ydHBhdXgnLAorICAnY2xpZW50LXJ0cGJ1bmRsZScsCisgICdzZXJ2ZXItcnRwYnVuZGxlJywKK10KKworZm9yZWFjaCBwcm9nIDogcnRwX3Byb2dzCisgIGV4ZWN1dGFibGUocHJvZywgcHJvZyArICcuYycsCisgICAgZGVwZW5kZW5jaWVzOiBbZ3N0cnRwX2RlcCwgZ3N0X2RlcCwgbGlibV0sCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgICBpbnN0YWxsOiBmYWxzZSkKK2VuZGZvcmVhY2gKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItVlRTLUgyNjNwLUFUUy1QQ01BLnNoIGIvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1WVFMtSDI2M3AtQVRTLVBDTUEuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2M3MzZmYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItVlRTLUgyNjNwLUFUUy1QQ01BLnNoCkBAIC0wLDAgKzEsMTYgQEAKKyMhL2Jpbi9zaAorIworIyBBIHNpbXBsZSBSVFAgc2VydmVyIAorIworCitWQ0FQUz0idmlkZW8veC1yYXcsd2lkdGg9MzUyLGhlaWdodD0yODgsZnJhbWVyYXRlPTE1LzEiCisKK2dzdC1sYXVuY2gtMS4wIC12IHJ0cGJpbiBuYW1lPXJ0cGJpbiBcCisgICAgICAgICAgIHZpZGVvdGVzdHNyYyAhICRWQ0FQUyAhIGF2ZW5jX2gyNjNwICEgcnRwaDI2M3BwYXkgISBydHBiaW4uc2VuZF9ydHBfc2lua18wICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHJ0cGJpbi5zZW5kX3J0cF9zcmNfMCAhIHVkcHNpbmsgcG9ydD01MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMCAhIHVkcHNpbmsgcG9ydD01MDAxIHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICB1ZHBzcmMgcG9ydD01MDA1ICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgYXVkaW90ZXN0c3JjIHNhbXBsZXNwZXJidWZmZXI9MTAwMCAhIGFsYXdlbmMgISBydHBwY21hcGF5ICEgcnRwYmluLnNlbmRfcnRwX3NpbmtfMSAgXAorCSAgICAgICAgICAgICBydHBiaW4uc2VuZF9ydHBfc3JjXzEgISB1ZHBzaW5rIHBvcnQ9NTAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMSAhIHVkcHNpbmsgcG9ydD01MDAzIHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICB1ZHBzcmMgcG9ydD01MDA3ICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzEKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItVlRTLUgyNjNwLnNoIGIvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1WVFMtSDI2M3Auc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjJmOTg4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItVlRTLUgyNjNwLnNoCkBAIC0wLDAgKzEsNDkgQEAKKyMhL2Jpbi9zaAorIworIyBBIHNpbXBsZSBSVFAgc2VydmVyIAorIyAgc2VuZHMgdGhlIG91dHB1dCBvZiB2aWRlb3Rlc3RzcmMgYXMgaDI2MysgZW5jb2RlZCBSVFAgb24gcG9ydCA1MDAwLCBSVENQIGlzIHNlbnQgb24KKyMgIHBvcnQgNTAwMS4gVGhlIGRlc3RpbmF0aW9uIGlzIDEyNy4wLjAuMS4KKyMgIHRoZSB2aWRlbyByZWNlaXZlciBSVENQIHJlcG9ydHMgYXJlIHJlY2VpdmVkIG9uIHBvcnQgNTAwNQorIworIyAuLS0tLS0tLS4gICAgLi0tLS0tLS0uICAgIC4tLS0tLS0tLiAgICAgIC4tLS0tLS0tLS0tLiAgICAgLi0tLS0tLS0uCisjIHx2dHMgICAgfCAgICB8aDI2M2VuY3wgICAgfGgyNjNwYXl8ICAgICAgfCBydHBiaW4gICB8ICAgICB8dWRwc2lua3wgIFJUUAorIyB8ICAgICAgc3JjLT5zaW5rICAgIHNyYy0+c2luayAgICBzcmMtPnNlbmRfcnRwIHNlbmRfcnRwLT5zaW5rICAgICB8IHBvcnQ9NTAwMAorIyAnLS0tLS0tLScgICAgJy0tLS0tLS0nICAgICctLS0tLS0tJyAgICAgIHwgICAgICAgICAgfCAgICAgJy0tLS0tLS0nCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAuLS0tLS0tLS4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIHx1ZHBzaW5rfCAgUlRDUAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgc2VuZF9ydGNwLT5zaW5rICAgICB8IHBvcnQ9NTAwMQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgIC4tLS0tLS0tLiAgICAgIHwgICAgICAgICAgfCAgICAgJy0tLS0tLS0nIHN5bmM9ZmFsc2UKKyMgICAgICAgICAgICAgICAgUlRDUCAgICAgICB8dWRwc3JjIHwgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICBhc3luYz1mYWxzZQorIyAgICAgICAgICAgICAgcG9ydD01MDA1ICAgIHwgICAgIHNyYy0+cmVjdl9ydGNwICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tLS0tLS0nICAgICAgJy0tLS0tLS0tLS0nICAgICAgICAgICAgICAKKyMKKworIyBjaGFuZ2UgdGhpcyB0byBzZW5kIHRoZSBSVFAgZGF0YSBhbmQgUlRDUCB0byBhbm90aGVyIGhvc3QKK0RFU1Q9MTI3LjAuMC4xCisKKyMgdHVuaW5nIHBhcmFtZXRlcnMgdG8gbWFrZSB0aGUgc2VuZGVyIHNlbmQgdGhlIHN0cmVhbXMgb3V0IG9mIHN5bmMuIENhbiBiZSB1c2VkCisjIG90IHRlc3QgdGhlIGNsaWVudCBSVENQIHN5bmNocm9uaXNhdGlvbi4gCisjVk9GRlNFVD05MDAwMDAwMDAKK1ZPRkZTRVQ9MAorQU9GRlNFVD0wCisKKyMgSDI2MysgZW5jb2RlIGZyb20gdGhlIHNvdXJjZQorVkVMRU09InZpZGVvdGVzdHNyYyBpcy1saXZlPTEiCitWQ0FQUz0idmlkZW8veC1yYXcsd2lkdGg9MzUyLGhlaWdodD0yODgsZnJhbWVyYXRlPTE1LzEiCitWU09VUkNFPSIkVkVMRU0gISAkVkNBUFMiCitWRU5DPSJhdmVuY19oMjYzcCAhIHJ0cGgyNjNwcGF5IgorCitWUlRQU0lOSz0idWRwc2luayBwb3J0PTUwMDAgaG9zdD0kREVTVCB0cy1vZmZzZXQ9JFZPRkZTRVQgbmFtZT12cnRwc2luayIKK1ZSVENQU0lOSz0idWRwc2luayBwb3J0PTUwMDEgaG9zdD0kREVTVCBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlIG5hbWU9dnJ0Y3BzaW5rIgorVlJUQ1BTUkM9InVkcHNyYyBwb3J0PTUwMDUgbmFtZT12cnRwc3JjIgorCitQSVBFTElORT0icnRwYmluIG5hbWU9cnRwYmluCisgICAgICAgICAgICAkVlNPVVJDRSAhICRWRU5DICEgcnRwYmluLnNlbmRfcnRwX3NpbmtfMgorCSAgICAgIHJ0cGJpbi5zZW5kX3J0cF9zcmNfMiAhICRWUlRQU0lOSyAKKyAgICAgICAgICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMiAhICRWUlRDUFNJTksKKyAgICAgICAgICAgICRWUlRDUFNSQyAhIHJ0cGJpbi5yZWN2X3J0Y3Bfc2lua18yIgorCitlY2hvICRQSVBFTElORQorCitnc3QtbGF1bmNoLTEuMCAtdiAkUElQRUxJTkUKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItVlRTLUgyNjQtcnR4LnNoIGIvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1WVFMtSDI2NC1ydHguc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmRiM2QyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItVlRTLUgyNjQtcnR4LnNoCkBAIC0wLDAgKzEsNDcgQEAKKyMhL2Jpbi9zaAorIworIyBBIHNpbXBsZSBSVFAgc2VydmVyIHdpdGggcmV0cmFuc21pc3Npb24KKyMgIHNlbmRzIHRoZSBvdXRwdXQgb2YgdmlkZW90ZXN0c3JjIGFzIGgyNjQgZW5jb2RlZCBSVFAgb24gcG9ydCA1MDAwLCBSVENQIGlzIHNlbnQgb24KKyMgIHBvcnQgNTAwMS4gVGhlIGRlc3RpbmF0aW9uIGlzIDEyNy4wLjAuMS4KKyMgIHRoZSB2aWRlbyByZWNlaXZlciBSVENQIHJlcG9ydHMgYXJlIHJlY2VpdmVkIG9uIHBvcnQgNTAwNQorIworIyAgLi0tLS0tLS0uICAgIC4tLS0tLS0tLiAgICAuLS0tLS0tLS4gICAgICAuLS0tLS0tLS0tLS4gICAgIC4tLS0tLS0tLgorIyAgfHZpZGVvdHN8ICAgIHxoMjY0ZW5jfCAgICB8aDI2NHBheXwgICAgICB8IHJ0cGJpbiAgIHwgICAgIHx1ZHBzaW5rfCAgUlRQCisjICB8ICAgICAgc3JjLT5zaW5rICAgIHNyYy0+c2luayAgICBzcmMtPnNlbmRfcnRwIHNlbmRfcnRwLT5zaW5rICAgICB8IHBvcnQ9NTAwMAorIyAgJy0tLS0tLS0nICAgICctLS0tLS0tJyAgICAnLS0tLS0tLScgICAgICB8ICAgICAgICAgIHwgICAgICctLS0tLS0tJworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAuLS0tLS0tLS4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICB8dWRwc2lua3wgIFJUQ1AKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBzZW5kX3J0Y3AtPnNpbmsgICAgIHwgcG9ydD01MDAxCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4tLS0tLS0tLiAgICAgIHwgICAgICAgICAgfCAgICAgJy0tLS0tLS0nIHN5bmM9ZmFsc2UKKyMgICAgICAgICAgICAgICAgIFJUQ1AgICAgICAgfHVkcHNyYyB8ICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgYXN5bmM9ZmFsc2UKKyMgICAgICAgICAgICAgICBwb3J0PTUwMDUgICAgfCAgICAgc3JjLT5yZWN2X3J0Y3AgICAgICB8CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLS0tLS0tJyAgICAgICctLS0tLS0tLS0tJworIworIyBpZGVhbGx5IHdlIHNob3VsZCB0cmFuc3BvcnQgdGhlIHByb3BlcnRpZXMgb24gdGhlIFJUUCB1ZHBzaW5rIHBhZHMgdG8gdGhlCisjIHJlY2VpdmVyIGluIG9yZGVyIHRvIHRyYW5zbWl0IHRoZSBTUFMgYW5kIFBQUyBlYXJsaWVyLgorCisjIGNoYW5nZSB0aGlzIHRvIHNlbmQgdGhlIFJUUCBkYXRhIGFuZCBSVENQIHRvIGFub3RoZXIgaG9zdAorREVTVD0xMjcuMC4wLjEKKworIyB0dW5pbmcgcGFyYW1ldGVycyB0byBtYWtlIHRoZSBzZW5kZXIgc2VuZCB0aGUgc3RyZWFtcyBvdXQgb2Ygc3luYy4gQ2FuIGJlIHVzZWQKKyMgb3QgdGVzdCB0aGUgY2xpZW50IFJUQ1Agc3luY2hyb25pc2F0aW9uLgorI1ZPRkZTRVQ9OTAwMDAwMDAwCitWT0ZGU0VUPTAKK0FPRkZTRVQ9MAorCisjIEgyNjQgZW5jb2RlIGZyb20gdGhlIHNvdXJjZQorVkVMRU09InZpZGVvdGVzdHNyYyBpcy1saXZlPTEgaG9yaXpvbnRhbC1zcGVlZD0xIgorVkNBUFM9InZpZGVvL3gtcmF3LHdpZHRoPTM1MixoZWlnaHQ9Mjg4LGZyYW1lcmF0ZT0xNS8xIgorVlNPVVJDRT0iJFZFTEVNICEgJFZDQVBTIgorVkVOQz0ieDI2NGVuYyB0dW5lPXplcm9sYXRlbmN5IGJpdHJhdGU9MzAwICEgcnRwaDI2NHBheSBjb25maWctaW50ZXJ2YWw9MiIKKworVlJUUFNJTks9InVkcHNpbmsgcG9ydD01MDAwIGhvc3Q9JERFU1QgdHMtb2Zmc2V0PSRWT0ZGU0VUIG5hbWU9dnJ0cHNpbmsiCitWUlRDUFNJTks9InVkcHNpbmsgcG9ydD01MDAxIGhvc3Q9JERFU1Qgc3luYz1mYWxzZSBhc3luYz1mYWxzZSBuYW1lPXZydGNwc2luayIKK1ZSVENQU1JDPSJ1ZHBzcmMgcG9ydD01MDA1IG5hbWU9dnJ0cHNyYyIKKworZ3N0LWxhdW5jaC0xLjAgLXYgcnRwYmluIG5hbWU9cnRwYmluIHJ0cC1wcm9maWxlPWF2cGYgXAorICAgICRWU09VUkNFICEgJFZFTkMgISBydHBydHhxdWV1ZSAhIHJ0cGJpbi5zZW5kX3J0cF9zaW5rXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBydHBiaW4uc2VuZF9ydHBfc3JjXzAgISBpZGVudGl0eSBkcm9wLXByb2JhYmlsaXR5PTAuMSAhICRWUlRQU0lOSyAgICAgICAgICAgICAgICAgXAorICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18wICEgJFZSVENQU0lOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgJFZSVENQU1JDICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzAKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItVlRTLVZQOC1BVFMtT1BVUy5zaCBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItVlRTLVZQOC1BVFMtT1BVUy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZjg3MDA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1WVFMtVlA4LUFUUy1PUFVTLnNoCkBAIC0wLDAgKzEsMTggQEAKKyMhL2Jpbi9zaAorIworIyBBIHNpbXBsZSBSVFAgc2VydmVyIAorIworCitTUkM9bG9jYWxob3N0CitERVNUPWxvY2FsaG9zdAorVkNBUFM9InZpZGVvL3gtcmF3LHdpZHRoPTM1MixoZWlnaHQ9Mjg4LGZyYW1lcmF0ZT0xNS8xIgorCitnc3QtbGF1bmNoLTEuMCAtdiBydHBiaW4gbmFtZT1ydHBiaW4gXAorICAgICAgICAgICB2aWRlb3Rlc3RzcmMgISAkVkNBUFMgISB2cDhlbmMgISBydHB2cDhwYXkgISBydHBiaW4uc2VuZF9ydHBfc2lua18wICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHJ0cGJpbi5zZW5kX3J0cF9zcmNfMCAhIHVkcHNpbmsgaG9zdD0kREVTVCBwb3J0PTUwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18wICEgdWRwc2luayBob3N0PSRERVNUIHBvcnQ9NTAwMSBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgdWRwc3JjIGFkZHJlc3M9JFNSQyAgcG9ydD01MDA1ICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgYXVkaW90ZXN0c3JjICEgb3B1c2VuYyAhIHJ0cG9wdXNwYXkgISBydHBiaW4uc2VuZF9ydHBfc2lua18xICBcCisJICAgICAgICAgICAgIHJ0cGJpbi5zZW5kX3J0cF9zcmNfMSAhIHVkcHNpbmsgaG9zdD0kREVTVCBwb3J0PTUwMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICAgICAgIHJ0cGJpbi5zZW5kX3J0Y3Bfc3JjXzEgISB1ZHBzaW5rIGhvc3Q9JERFU1QgcG9ydD01MDAzIHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICB1ZHBzcmMgYWRkcmVzcz0kU1JDIHBvcnQ9NTAwNyAhIHJ0cGJpbi5yZWN2X3J0Y3Bfc2lua18xCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWFsc2FzcmMtUENNQS5jIGIvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1hbHNhc3JjLVBDTUEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjhmN2RlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1hbHNhc3JjLVBDTUEuYwpAQCAtMCwwICsxLDIyNSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKiBGSVhNRSAwLjExOiBzdXBwcmVzcyB3YXJuaW5ncyBmb3IgZGVwcmVjYXRlZCBBUEkgc3VjaCBhcyBHVmFsdWVBcnJheQorICogd2l0aCBuZXdlciBHTGliIHZlcnNpb25zICg+PSAyLjMxLjApICovCisjZGVmaW5lIEdMSUJfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisvKgorICogQSBzaW1wbGUgUlRQIHNlcnZlciAKKyAqICBzZW5kcyB0aGUgb3V0cHV0IG9mIGFsc2FzcmMgYXMgYWxhdyBlbmNvZGVkIFJUUCBvbiBwb3J0IDUwMDIsIFJUQ1AgaXMgc2VudCBvbgorICogIHBvcnQgNTAwMy4gVGhlIGRlc3RpbmF0aW9uIGlzIDEyNy4wLjAuMS4KKyAqICB0aGUgcmVjZWl2ZXIgUlRDUCByZXBvcnRzIGFyZSByZWNlaXZlZCBvbiBwb3J0IDUwMDcKKyAqCisgKiAuLS0tLS0tLS4gICAgLi0tLS0tLS0uICAgIC4tLS0tLS0tLiAgICAgIC4tLS0tLS0tLS0tLiAgICAgLi0tLS0tLS0uCisgKiB8YWxzYXNyY3wgICAgfGFsYXdlbmN8ICAgIHxwY21hcGF5fCAgICAgIHwgcnRwYmluICAgfCAgICAgfHVkcHNpbmt8ICBSVFAKKyAqIHwgICAgICBzcmMtPnNpbmsgICAgc3JjLT5zaW5rICAgIHNyYy0+c2VuZF9ydHAgc2VuZF9ydHAtPnNpbmsgICAgIHwgcG9ydD01MDAyCisgKiAnLS0tLS0tLScgICAgJy0tLS0tLS0nICAgICctLS0tLS0tJyAgICAgIHwgICAgICAgICAgfCAgICAgJy0tLS0tLS0nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIC4tLS0tLS0tLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIHx1ZHBzaW5rfCAgUlRDUAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHNlbmRfcnRjcC0+c2luayAgICAgfCBwb3J0PTUwMDMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgLi0tLS0tLS0uICAgICAgfCAgICAgICAgICB8ICAgICAnLS0tLS0tLScgc3luYz1mYWxzZQorICogICAgICAgICAgICAgICAgUlRDUCAgICAgICB8dWRwc3JjIHwgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICBhc3luYz1mYWxzZQorICogICAgICAgICAgICAgIHBvcnQ9NTAwNyAgICB8ICAgICBzcmMtPnJlY3ZfcnRjcCAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAnLS0tLS0tLScgICAgICAnLS0tLS0tLS0tLScgICAgICAgICAgICAgIAorICovCisKKy8qIGNoYW5nZSB0aGlzIHRvIHNlbmQgdGhlIFJUUCBkYXRhIGFuZCBSVENQIHRvIGFub3RoZXIgaG9zdCAqLworI2RlZmluZSBERVNUX0hPU1QgIjEyNy4wLjAuMSIKKworLyogI2RlZmluZSBBVURJT19TUkMgICJhbHNhc3JjIiAqLworI2RlZmluZSBBVURJT19TUkMgICJhdWRpb3Rlc3RzcmMiCisKKy8qIHRoZSBlbmNvZGVyIGFuZCBwYXlsb2FkZXIgZWxlbWVudHMgKi8KKyNkZWZpbmUgQVVESU9fRU5DICAiYWxhd2VuYyIKKyNkZWZpbmUgQVVESU9fUEFZICAicnRwcGNtYXBheSIKKworLyogcHJpbnQgdGhlIHN0YXRzIG9mIGEgc291cmNlICovCitzdGF0aWMgdm9pZAorcHJpbnRfc291cmNlX3N0YXRzIChHT2JqZWN0ICogc291cmNlKQoreworICBHc3RTdHJ1Y3R1cmUgKnN0YXRzOworICBnY2hhciAqc3RyOworCisgIC8qIGdldCB0aGUgc291cmNlIHN0YXRzICovCisgIGdfb2JqZWN0X2dldCAoc291cmNlLCAic3RhdHMiLCAmc3RhdHMsIE5VTEwpOworCisgIC8qIHNpbXBseSBkdW1wIHRoZSBzdGF0cyBzdHJ1Y3R1cmUgKi8KKyAgc3RyID0gZ3N0X3N0cnVjdHVyZV90b19zdHJpbmcgKHN0YXRzKTsKKyAgZ19wcmludCAoInNvdXJjZSBzdGF0czogJXNcbiIsIHN0cik7CisKKyAgZ3N0X3N0cnVjdHVyZV9mcmVlIChzdGF0cyk7CisgIGdfZnJlZSAoc3RyKTsKK30KKworLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZXZlcnkgc2Vjb25kIGFuZCBkdW1wcyB0aGUgUlRQIG1hbmFnZXIgc3RhdHMgKi8KK3N0YXRpYyBnYm9vbGVhbgorcHJpbnRfc3RhdHMgKEdzdEVsZW1lbnQgKiBydHBiaW4pCit7CisgIEdPYmplY3QgKnNlc3Npb247CisgIEdWYWx1ZUFycmF5ICphcnI7CisgIEdWYWx1ZSAqdmFsOworICBndWludCBpOworCisgIGdfcHJpbnQgKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisKKyAgLyogZ2V0IHNlc3Npb24gMCAqLworICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHJ0cGJpbiwgImdldC1pbnRlcm5hbC1zZXNzaW9uIiwgMCwgJnNlc3Npb24pOworCisgIC8qIHByaW50IGFsbCB0aGUgc291cmNlcyBpbiB0aGUgc2Vzc2lvbiwgdGhpcyBpbmNsdWRlcyB0aGUgaW50ZXJuYWwgc291cmNlICovCisgIGdfb2JqZWN0X2dldCAoc2Vzc2lvbiwgInNvdXJjZXMiLCAmYXJyLCBOVUxMKTsKKworICBmb3IgKGkgPSAwOyBpIDwgYXJyLT5uX3ZhbHVlczsgaSsrKSB7CisgICAgR09iamVjdCAqc291cmNlOworCisgICAgdmFsID0gZ192YWx1ZV9hcnJheV9nZXRfbnRoIChhcnIsIGkpOworICAgIHNvdXJjZSA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsKTsKKworICAgIHByaW50X3NvdXJjZV9zdGF0cyAoc291cmNlKTsKKyAgfQorICBnX3ZhbHVlX2FycmF5X2ZyZWUgKGFycik7CisKKyAgZ19vYmplY3RfdW5yZWYgKHNlc3Npb24pOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBidWlsZCBhIHBpcGVsaW5lIGVxdWl2YWxlbnQgdG86CisgKgorICogZ3N0LWxhdW5jaC0xLjAgLXYgcnRwYmluIG5hbWU9cnRwYmluIFwKKyAqICAgICRBVURJT19TUkMgISBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgJEFVRElPX0VOQyAhICRBVURJT19QQVkgISBydHBiaW4uc2VuZF9ydHBfc2lua18wICBcCisgKiAgICAgICAgICAgcnRwYmluLnNlbmRfcnRwX3NyY18wICEgdWRwc2luayBwb3J0PTUwMDIgaG9zdD0kREVTVCAgICAgICAgICAgICAgICAgICAgICBcCisgKiAgICAgICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMCAhIHVkcHNpbmsgcG9ydD01MDAzIGhvc3Q9JERFU1Qgc3luYz1mYWxzZSBhc3luYz1mYWxzZSBcCisgKiAgICAgICAgdWRwc3JjIHBvcnQ9NTAwNyAhIHJ0cGJpbi5yZWN2X3J0Y3Bfc2lua18wCisgKi8KK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9zcmMsICphdWRpb2NvbnYsICphdWRpb3JlcywgKmF1ZGlvZW5jLCAqYXVkaW9wYXk7CisgIEdzdEVsZW1lbnQgKnJ0cGJpbiwgKnJ0cHNpbmssICpydGNwc2luaywgKnJ0Y3BzcmM7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHTWFpbkxvb3AgKmxvb3A7CisgIEdzdFBhZCAqc3JjcGFkLCAqc2lua3BhZDsKKworICAvKiBhbHdheXMgaW5pdCBmaXJzdCAqLworICBnc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICAvKiB0aGUgcGlwZWxpbmUgdG8gaG9sZCBldmVyeXRoaW5nICovCisgIHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoTlVMTCk7CisgIGdfYXNzZXJ0IChwaXBlbGluZSk7CisKKyAgLyogdGhlIGF1ZGlvIGNhcHR1cmUgYW5kIGZvcm1hdCBjb252ZXJzaW9uICovCisgIGF1ZGlvc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlIChBVURJT19TUkMsICJhdWRpb3NyYyIpOworICBnX2Fzc2VydCAoYXVkaW9zcmMpOworICBhdWRpb2NvbnYgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb2NvbnZlcnQiLCAiYXVkaW9jb252Iik7CisgIGdfYXNzZXJ0IChhdWRpb2NvbnYpOworICBhdWRpb3JlcyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvcmVzYW1wbGUiLCAiYXVkaW9yZXMiKTsKKyAgZ19hc3NlcnQgKGF1ZGlvcmVzKTsKKyAgLyogdGhlIGVuY29kaW5nIGFuZCBwYXlsb2FkaW5nICovCisgIGF1ZGlvZW5jID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlIChBVURJT19FTkMsICJhdWRpb2VuYyIpOworICBnX2Fzc2VydCAoYXVkaW9lbmMpOworICBhdWRpb3BheSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoQVVESU9fUEFZLCAiYXVkaW9wYXkiKTsKKyAgZ19hc3NlcnQgKGF1ZGlvcGF5KTsKKworICAvKiBhZGQgY2FwdHVyZSBhbmQgcGF5bG9hZGluZyB0byB0aGUgcGlwZWxpbmUgYW5kIGxpbmsgKi8KKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBhdWRpb3NyYywgYXVkaW9jb252LCBhdWRpb3JlcywKKyAgICAgIGF1ZGlvZW5jLCBhdWRpb3BheSwgTlVMTCk7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rX21hbnkgKGF1ZGlvc3JjLCBhdWRpb2NvbnYsIGF1ZGlvcmVzLCBhdWRpb2VuYywKKyAgICAgICAgICBhdWRpb3BheSwgTlVMTCkpIHsKKyAgICBnX2Vycm9yICgiRmFpbGVkIHRvIGxpbmsgYXVkaW9zcmMsIGF1ZGlvY29udiwgYXVkaW9yZXNhbXBsZSwgIgorICAgICAgICAiYXVkaW8gZW5jb2RlciBhbmQgYXVkaW8gcGF5bG9hZGVyIik7CisgIH0KKworICAvKiB0aGUgcnRwYmluIGVsZW1lbnQgKi8KKyAgcnRwYmluID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwYmluIiwgInJ0cGJpbiIpOworICBnX2Fzc2VydCAocnRwYmluKTsKKworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBydHBiaW4pOworCisgIC8qIHRoZSB1ZHAgc2lua3MgYW5kIHNvdXJjZSB3ZSB3aWxsIHVzZSBmb3IgUlRQIGFuZCBSVENQICovCisgIHJ0cHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1ZHBzaW5rIiwgInJ0cHNpbmsiKTsKKyAgZ19hc3NlcnQgKHJ0cHNpbmspOworICBnX29iamVjdF9zZXQgKHJ0cHNpbmssICJwb3J0IiwgNTAwMiwgImhvc3QiLCBERVNUX0hPU1QsIE5VTEwpOworCisgIHJ0Y3BzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidWRwc2luayIsICJydGNwc2luayIpOworICBnX2Fzc2VydCAocnRjcHNpbmspOworICBnX29iamVjdF9zZXQgKHJ0Y3BzaW5rLCAicG9ydCIsIDUwMDMsICJob3N0IiwgREVTVF9IT1NULCBOVUxMKTsKKyAgLyogbm8gbmVlZCBmb3Igc3luY2hyb25pc2F0aW9uIG9yIHByZXJvbGwgb24gdGhlIFJUQ1Agc2luayAqLworICBnX29iamVjdF9zZXQgKHJ0Y3BzaW5rLCAiYXN5bmMiLCBGQUxTRSwgInN5bmMiLCBGQUxTRSwgTlVMTCk7CisKKyAgcnRjcHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInVkcHNyYyIsICJydGNwc3JjIik7CisgIGdfYXNzZXJ0IChydGNwc3JjKTsKKyAgZ19vYmplY3Rfc2V0IChydGNwc3JjLCAicG9ydCIsIDUwMDcsIE5VTEwpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgcnRwc2luaywgcnRjcHNpbmssIHJ0Y3BzcmMsIE5VTEwpOworCisgIC8qIG5vdyBsaW5rIGFsbCB0byB0aGUgcnRwYmluLCBzdGFydCBieSBnZXR0aW5nIGFuIFJUUCBzaW5rcGFkIGZvciBzZXNzaW9uIDAgKi8KKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwYmluLCAic2VuZF9ydHBfc2lua18wIik7CisgIHNyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChhdWRpb3BheSwgInNyYyIpOworICBpZiAoZ3N0X3BhZF9saW5rIChzcmNwYWQsIHNpbmtwYWQpICE9IEdTVF9QQURfTElOS19PSykKKyAgICBnX2Vycm9yICgiRmFpbGVkIHRvIGxpbmsgYXVkaW8gcGF5bG9hZGVyIHRvIHJ0cGJpbiIpOworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworCisgIC8qIGdldCB0aGUgUlRQIHNyY3BhZCB0aGF0IHdhcyBjcmVhdGVkIHdoZW4gd2UgcmVxdWVzdGVkIHRoZSBzaW5rcGFkIGFib3ZlIGFuZAorICAgKiBsaW5rIGl0IHRvIHRoZSBydHBzaW5rIHNpbmtwYWQqLworICBzcmNwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocnRwYmluLCAic2VuZF9ydHBfc3JjXzAiKTsKKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChydHBzaW5rLCAic2luayIpOworICBpZiAoZ3N0X3BhZF9saW5rIChzcmNwYWQsIHNpbmtwYWQpICE9IEdTVF9QQURfTElOS19PSykKKyAgICBnX2Vycm9yICgiRmFpbGVkIHRvIGxpbmsgcnRwYmluIHRvIHJ0cHNpbmsiKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZCk7CisKKyAgLyogZ2V0IGFuIFJUQ1Agc3JjcGFkIGZvciBzZW5kaW5nIFJUQ1AgdG8gdGhlIHJlY2VpdmVyICovCisgIHNyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwYmluLCAic2VuZF9ydGNwX3NyY18wIik7CisgIHNpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocnRjcHNpbmssICJzaW5rIik7CisgIGlmIChnc3RfcGFkX2xpbmsgKHNyY3BhZCwgc2lua3BhZCkgIT0gR1NUX1BBRF9MSU5LX09LKQorICAgIGdfZXJyb3IgKCJGYWlsZWQgdG8gbGluayBydHBiaW4gdG8gcnRjcHNpbmsiKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZCk7CisKKyAgLyogd2UgYWxzbyB3YW50IHRvIHJlY2VpdmUgUlRDUCwgcmVxdWVzdCBhbiBSVENQIHNpbmtwYWQgZm9yIHNlc3Npb24gMCBhbmQKKyAgICogbGluayBpdCB0byB0aGUgc3JjcGFkIG9mIHRoZSB1ZHBzcmMgZm9yIFJUQ1AgKi8KKyAgc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHJ0Y3BzcmMsICJzcmMiKTsKKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwYmluLCAicmVjdl9ydGNwX3NpbmtfMCIpOworICBpZiAoZ3N0X3BhZF9saW5rIChzcmNwYWQsIHNpbmtwYWQpICE9IEdTVF9QQURfTElOS19PSykKKyAgICBnX2Vycm9yICgiRmFpbGVkIHRvIGxpbmsgcnRjcHNyYyB0byBydHBiaW4iKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKworICAvKiBzZXQgdGhlIHBpcGVsaW5lIHRvIHBsYXlpbmcgKi8KKyAgZ19wcmludCAoInN0YXJ0aW5nIHNlbmRlciBwaXBlbGluZVxuIik7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICAvKiBwcmludCBzdGF0cyBldmVyeSBzZWNvbmQgKi8KKyAgZ190aW1lb3V0X2FkZF9zZWNvbmRzICgxLCAoR1NvdXJjZUZ1bmMpIHByaW50X3N0YXRzLCBydHBiaW4pOworCisgIC8qIHdlIG5lZWQgdG8gcnVuIGEgR0xpYiBtYWluIGxvb3AgdG8gZ2V0IHRoZSBtZXNzYWdlcyAqLworICBsb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgZ19wcmludCAoInN0b3BwaW5nIHNlbmRlciBwaXBlbGluZVxuIik7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLnB5IGIvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1hbHNhc3JjLVBDTUEucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzcyNzZhNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLnB5CkBAIC0wLDAgKzEsOTggQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IGdpCitpbXBvcnQgc3lzCitnaS5yZXF1aXJlX3ZlcnNpb24oJ0dzdCcsICcxLjAnKQorZnJvbSBnaS5yZXBvc2l0b3J5IGltcG9ydCBHT2JqZWN0LCBHc3QKKworCisjZ3N0LWxhdW5jaCAtdiBydHBiaW4gbmFtZT1ydHBiaW4gYXVkaW90ZXN0c3JjICEgYXVkaW9jb252ZXJ0ICEgYWxhd2VuYyAhIHJ0cHBjbWFwYXkgISBydHBiaW4uc2VuZF9ydHBfc2lua18wIFwKKyMgICAgICAgICAgICAgICAgcnRwYmluLnNlbmRfcnRwX3NyY18wICEgdWRwc2luayBwb3J0PTEwMDAwIGhvc3Q9eHh4Lnh4eC54eHgueHh4IFwKKyMgICAgICAgICAgICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMCAhIHVkcHNpbmsgcG9ydD0xMDAwMSBob3N0PXh4eC54eHgueHh4Lnh4eCBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlIFwKKyMgICAgICAgICAgICAgICAgdWRwc3JjIHBvcnQ9MTAwMDIgISBydHBiaW4ucmVjdl9ydGNwX3NpbmtfMAorCitERVNUX0hPU1QgPSAnMTI3LjAuMC4xJworCitBVURJT19TUkMgPSAnYXVkaW90ZXN0c3JjJworQVVESU9fRU5DID0gJ2FsYXdlbmMnCitBVURJT19QQVkgPSAncnRwcGNtYXBheScKKworUlRQX1NFTkRfUE9SVCA9IDUwMDIKK1JUQ1BfU0VORF9QT1JUID0gNTAwMworUlRDUF9SRUNWX1BPUlQgPSA1MDA3CisKK0dPYmplY3QudGhyZWFkc19pbml0KCkKK0dzdC5pbml0KHN5cy5hcmd2KQorCisjIHRoZSBwaXBlbGluZSB0byBob2xkIGV2ZXJ5dGhpbmcKK3BpcGVsaW5lID0gR3N0LlBpcGVsaW5lKCdydHBfc2VydmVyJykKKworIyB0aGUgcGlwZWxpbmUgdG8gaG9sZCBldmVyeXRoaW5nCithdWRpb3NyYyA9IEdzdC5FbGVtZW50RmFjdG9yeS5tYWtlKEFVRElPX1NSQywgJ2F1ZGlvc3JjJykKK2F1ZGlvY29udiA9IEdzdC5FbGVtZW50RmFjdG9yeS5tYWtlKCdhdWRpb2NvbnZlcnQnLCAnYXVkaW9jb252JykKK2F1ZGlvcmVzID0gR3N0LkVsZW1lbnRGYWN0b3J5Lm1ha2UoJ2F1ZGlvcmVzYW1wbGUnLCAnYXVkaW9yZXMnKQorCisjIHRoZSBwaXBlbGluZSB0byBob2xkIGV2ZXJ5dGhpbmcKK2F1ZGlvZW5jID0gR3N0LkVsZW1lbnRGYWN0b3J5Lm1ha2UoQVVESU9fRU5DLCAnYXVkaW9lbmMnKQorYXVkaW9wYXkgPSBHc3QuRWxlbWVudEZhY3RvcnkubWFrZShBVURJT19QQVksICdhdWRpb3BheScpCisKKyMgYWRkIGNhcHR1cmUgYW5kIHBheWxvYWRpbmcgdG8gdGhlIHBpcGVsaW5lIGFuZCBsaW5rCitwaXBlbGluZS5hZGQoYXVkaW9zcmMsIGF1ZGlvY29udiwgYXVkaW9yZXMsIGF1ZGlvZW5jLCBhdWRpb3BheSkKKworYXVkaW9zcmMubGluayhhdWRpb2NvbnYpCithdWRpb2NvbnYubGluayhhdWRpb3JlcykKK2F1ZGlvcmVzLmxpbmsoYXVkaW9lbmMpCithdWRpb2VuYy5saW5rKGF1ZGlvcGF5KQorCisjIHRoZSBydHBiaW4gZWxlbWVudAorcnRwYmluID0gR3N0LkVsZW1lbnRGYWN0b3J5Lm1ha2UoJ3J0cGJpbicsICdydHBiaW4nKQorCitwaXBlbGluZS5hZGQocnRwYmluKQorCisjIHRoZSB1ZHAgc2lua3MgYW5kIHNvdXJjZSB3ZSB3aWxsIHVzZSBmb3IgUlRQIGFuZCBSVENQCitydHBzaW5rID0gR3N0LkVsZW1lbnRGYWN0b3J5Lm1ha2UoJ3VkcHNpbmsnLCAncnRwc2luaycpCitydHBzaW5rLnNldF9wcm9wZXJ0eSgncG9ydCcsIFJUUF9TRU5EX1BPUlQpCitydHBzaW5rLnNldF9wcm9wZXJ0eSgnaG9zdCcsIERFU1RfSE9TVCkKKworcnRjcHNpbmsgPSBHc3QuRWxlbWVudEZhY3RvcnkubWFrZSgndWRwc2luaycsICdydGNwc2luaycpCitydGNwc2luay5zZXRfcHJvcGVydHkoJ3BvcnQnLCBSVENQX1NFTkRfUE9SVCkKK3J0Y3BzaW5rLnNldF9wcm9wZXJ0eSgnaG9zdCcsIERFU1RfSE9TVCkKKyMgbm8gbmVlZCBmb3Igc3luY2hyb25pc2F0aW9uIG9yIHByZXJvbGwgb24gdGhlIFJUQ1Agc2luaworcnRjcHNpbmsuc2V0X3Byb3BlcnR5KCdhc3luYycsIEZhbHNlKQorcnRjcHNpbmsuc2V0X3Byb3BlcnR5KCdzeW5jJywgRmFsc2UpCisKK3J0Y3BzcmMgPSBHc3QuRWxlbWVudEZhY3RvcnkubWFrZSgndWRwc3JjJywgJ3J0Y3BzcmMnKQorcnRjcHNyYy5zZXRfcHJvcGVydHkoJ3BvcnQnLCBSVENQX1JFQ1ZfUE9SVCkKKworcGlwZWxpbmUuYWRkKHJ0cHNpbmssIHJ0Y3BzaW5rLCBydGNwc3JjKQorCisjIG5vdyBsaW5rIGFsbCB0byB0aGUgcnRwYmluLCBzdGFydCBieSBnZXR0aW5nIGFuIFJUUCBzaW5rcGFkIGZvciBzZXNzaW9uIDAKK3NpbmtwYWQgPSBHc3QuRWxlbWVudC5nZXRfcmVxdWVzdF9wYWQocnRwYmluLCAnc2VuZF9ydHBfc2lua18wJykKK3NyY3BhZCA9IEdzdC5FbGVtZW50LmdldF9zdGF0aWNfcGFkKGF1ZGlvcGF5LCAnc3JjJykKK2xyZXMgPSBHc3QuUGFkLmxpbmsoc3JjcGFkLCBzaW5rcGFkKQorCisjIGdldCB0aGUgUlRQIHNyY3BhZCB0aGF0IHdhcyBjcmVhdGVkIHdoZW4gd2UgcmVxdWVzdGVkIHRoZSBzaW5rcGFkIGFib3ZlIGFuZAorIyBsaW5rIGl0IHRvIHRoZSBydHBzaW5rIHNpbmtwYWQKK3NyY3BhZCA9IEdzdC5FbGVtZW50LmdldF9zdGF0aWNfcGFkKHJ0cGJpbiwgJ3NlbmRfcnRwX3NyY18wJykKK3NpbmtwYWQgPSBHc3QuRWxlbWVudC5nZXRfc3RhdGljX3BhZChydHBzaW5rLCAnc2luaycpCitscmVzID0gR3N0LlBhZC5saW5rKHNyY3BhZCwgc2lua3BhZCkKKworIyBnZXQgYW4gUlRDUCBzcmNwYWQgZm9yIHNlbmRpbmcgUlRDUCB0byB0aGUgcmVjZWl2ZXIKK3NyY3BhZCA9IEdzdC5FbGVtZW50LmdldF9yZXF1ZXN0X3BhZChydHBiaW4sICdzZW5kX3J0Y3Bfc3JjXzAnKQorc2lua3BhZCA9IEdzdC5FbGVtZW50LmdldF9zdGF0aWNfcGFkKHJ0Y3BzaW5rLCAnc2luaycpCitscmVzID0gR3N0LlBhZC5saW5rKHNyY3BhZCwgc2lua3BhZCkKKworIyB3ZSBhbHNvIHdhbnQgdG8gcmVjZWl2ZSBSVENQLCByZXF1ZXN0IGFuIFJUQ1Agc2lua3BhZCBmb3Igc2Vzc2lvbiAwIGFuZAorIyBsaW5rIGl0IHRvIHRoZSBzcmNwYWQgb2YgdGhlIHVkcHNyYyBmb3IgUlRDUAorc3JjcGFkID0gR3N0LkVsZW1lbnQuZ2V0X3N0YXRpY19wYWQocnRjcHNyYywgJ3NyYycpCitzaW5rcGFkID0gR3N0LkVsZW1lbnQuZ2V0X3JlcXVlc3RfcGFkKHJ0cGJpbiwgJ3JlY3ZfcnRjcF9zaW5rXzAnKQorbHJlcyA9IEdzdC5QYWQubGluayhzcmNwYWQsIHNpbmtwYWQpCisKKyMgc2V0IHRoZSBwaXBlbGluZSB0byBwbGF5aW5nCitHc3QuRWxlbWVudC5zZXRfc3RhdGUocGlwZWxpbmUsIEdzdC5TdGF0ZS5QTEFZSU5HKQorCisjIHdlIG5lZWQgdG8gcnVuIGEgR0xpYiBtYWluIGxvb3AgdG8gZ2V0IHRoZSBtZXNzYWdlcworbWFpbmxvb3AgPSBHT2JqZWN0Lk1haW5Mb29wKCkKK21haW5sb29wLnJ1bigpCisKK0dzdC5FbGVtZW50LnNldF9zdGF0ZShwaXBlbGluZSwgR3N0LlN0YXRlLk5VTEwpCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWFsc2FzcmMtUENNQS5zaCBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFhZmUwOWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWFsc2FzcmMtUENNQS5zaApAQCAtMCwwICsxLDM1IEBACisjIS9iaW4vc2gKKyMKKyMgQSBzaW1wbGUgUlRQIHNlcnZlcgorIyAgc2VuZHMgdGhlIG91dHB1dCBvZiBhdXRvYXVkaW9zcmMgYXMgYWxhdyBlbmNvZGVkIFJUUCBvbiBwb3J0IDUwMDIsIFJUQ1AgaXMgc2VudCBvbgorIyAgcG9ydCA1MDAzLiBUaGUgZGVzdGluYXRpb24gaXMgMTI3LjAuMC4xLgorIyAgdGhlIHJlY2VpdmVyIFJUQ1AgcmVwb3J0cyBhcmUgcmVjZWl2ZWQgb24gcG9ydCA1MDA3CisjCisjIC4tLS0tLS0tLS4gICAgLi0tLS0tLS0uICAgIC4tLS0tLS0tLiAgICAgIC4tLS0tLS0tLS0tLiAgICAgLi0tLS0tLS0uCisjIHxhdWRpb3NyY3wgICAgfGFsYXdlbmN8ICAgIHxwY21hcGF5fCAgICAgIHwgcnRwYmluICAgfCAgICAgfHVkcHNpbmt8ICBSVFAKKyMgfCAgICAgICBzcmMtPnNpbmsgICAgc3JjLT5zaW5rICAgIHNyYy0+c2VuZF9ydHAgc2VuZF9ydHAtPnNpbmsgICAgIHwgcG9ydD01MDAyCisjICctLS0tLS0tLScgICAgJy0tLS0tLS0nICAgICctLS0tLS0tJyAgICAgIHwgICAgICAgICAgfCAgICAgJy0tLS0tLS0nCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIC4tLS0tLS0tLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIHx1ZHBzaW5rfCAgUlRDUAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHNlbmRfcnRjcC0+c2luayAgICAgfCBwb3J0PTUwMDMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi0tLS0tLS0uICAgICAgfCAgICAgICAgICB8ICAgICAnLS0tLS0tLScgc3luYz1mYWxzZQorIyAgICAgICAgICAgICAgICAgUlRDUCAgICAgICB8dWRwc3JjIHwgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICBhc3luYz1mYWxzZQorIyAgICAgICAgICAgICAgIHBvcnQ9NTAwNyAgICB8ICAgICBzcmMtPnJlY3ZfcnRjcCAgICAgIHwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tLS0tLS0nICAgICAgJy0tLS0tLS0tLS0nCisKKyMgY2hhbmdlIHRoaXMgdG8gc2VuZCB0aGUgUlRQIGRhdGEgYW5kIFJUQ1AgdG8gYW5vdGhlciBob3N0CitERVNUPTEyNy4wLjAuMQorCisjQUVMRU09YXV0b2F1ZGlvc3JjCitBRUxFTT1hdWRpb3Rlc3RzcmMKKworIyBQQ01BIGVuY29kZSBmcm9tIGFuIHRoZSBzb3VyY2UKK0FTT1VSQ0U9IiRBRUxFTSAhIGF1ZGlvY29udmVydCIKK0FFTkM9ImFsYXdlbmMgISBydHBwY21hcGF5IgorCitnc3QtbGF1bmNoLTEuMCAtdiBydHBiaW4gbmFtZT1ydHBiaW4gXAorICAgICAkQVNPVVJDRSAhICRBRU5DICEgcnRwYmluLnNlbmRfcnRwX3NpbmtfMCAgXAorICAgICAgICAgICAgcnRwYmluLnNlbmRfcnRwX3NyY18wICEgdWRwc2luayBwb3J0PTUwMDIgaG9zdD0kREVTVCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18wICEgdWRwc2luayBwb3J0PTUwMDMgaG9zdD0kREVTVCBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlIFwKKyAgICAgICAgIHVkcHNyYyBwb3J0PTUwMDcgISBydHBiaW4ucmVjdl9ydGNwX3NpbmtfMApkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1kZWNvZGViaW4tSDI2M3AtQU1SLnNoIGIvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1kZWNvZGViaW4tSDI2M3AtQU1SLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY3ZTk4MjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWRlY29kZWJpbi1IMjYzcC1BTVIuc2gKQEAgLTAsMCArMSw0NyBAQAorIyEvYmluL3NoCisjCisjIEEgc2ltcGxlIFJUUCBzZXJ2ZXIgCisjCisjIFRyYW5zY29kZXMgYW5kIHN0cmVhbXMgYXVkaW8gYW5kIHZpZGVvIHRvIEgyNjNwIGFuZCBBTVIgcmVzcGVjdGl2ZWx5IGZyb20gYW55CisjIGZpbGUgdGhhdCBpcyBkZWNvZGFibGUgYnkgZGVjb2RlYmluLgorIworIyB1c2UgLi9jbGllbnQtSDI2M3AtQU1SLnNoIHRvIHJlY2VpdmUgdGhlIFJUUCBzdHJlYW0uCisjCisKKyMgY2hhbmdlIHRoZXNlIHRvIGNoYW5nZSB0aGUgc2VydmVyIHN5bmMuIFRoaXMgY2F1c2VzIHRoZSBzZXJ2ZXIgdG8gc2VuZCB0aGUKKyMgcGFja2V0cyBsYXJnbHkgb3V0LW9mLXN5bmMsIHRoZSBjbGllbnQgc2hvdWxkIHVzZSB0aGUgUlRDUCBTUiBwYWNrZXRzIHRvCisjIHJlc3RvcmUgcHJvcGVyIGxpcC1zeW5jIGJldHdlZW4gdGhlIHN0cmVhbXMuCitBT0ZGU0VUPTAKK1ZPRkZTRVQ9MAorCisjIGVuY29kZXIgc2VlbXMgdG8gYmUgcGlja3kgYWJvdXQgUEFSLCBzbyBmb3JjZSBvbmUgdGhhdCBzaG91bGQgd29yaworVkNBUFM9InZpZGVvL3gtcmF3LHdpZHRoPTM1MixoZWlnaHQ9Mjg4LGZyYW1lcmF0ZT0xNS8xLHBpeGVsLWFzcGVjdC1yYXRpbz0xLzEiCisKKyMgdmlkZW8gYW5kIGF1ZGlvIGVuY29kaW5nIGFuZCBwYXlsb2FkaW5nCitWRU5DUEFZPSJhdmVuY19oMjYzcCAhIHJ0cGgyNjNwcGF5IgorQUVOQ1BBWT0iYW1ybmJlbmMgISBydHBhbXJwYXkiCisKKyMgdmlkZW8gY29udmVyc2lvbiAKK1ZDT05WPSJ2aWRlb2NvbnZlcnQgISB2aWRlb3NjYWxlICEgdmlkZW9yYXRlICEgJFZDQVBTICEgdmlkZW9jb252ZXJ0IgorCitBQ09OVj0iYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSIKKworI0hPU1Q9MTkyLjE2OC4xLjEyNgorSE9TVD0xMjcuMC4wLjEKKworaWYgdGVzdCAteiAiJDEiOyB0aGVuCisgIGVjaG8gIk5vIFVSSSBhcmd1bWVudC4iOworICBlY2hvICJVc2FnZTogJDAgZmlsZTovLy9wYXRoL3RvL3ZpZGVvLmZpbGUiOworICBleGl0IDE7CitmaQorCitnc3QtbGF1bmNoLTEuMCAtdiBydHBiaW4gbmFtZT1ydHBiaW4gXAorICAgICAgICAgICB1cmlkZWNvZGViaW4gdXJpPSIkMSIgbmFtZT1kZWNvZGUgXAorICAgICAgICAgICBkZWNvZGUuICEgJFZDT05WICEgJFZFTkNQQVkgISBydHBiaW4uc2VuZF9ydHBfc2lua18wICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgcnRwYmluLnNlbmRfcnRwX3NyY18wICEgcXVldWUgISB1ZHBzaW5rIGhvc3Q9JEhPU1QgcG9ydD01MDAwIHRzLW9mZnNldD0kQU9GRlNFVCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHJ0cGJpbi5zZW5kX3J0Y3Bfc3JjXzAgISB1ZHBzaW5rIGhvc3Q9JEhPU1QgcG9ydD01MDAxIHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICB1ZHBzcmMgcG9ydD01MDA1ICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBkZWNvZGUuICEgJEFDT05WICEgJEFFTkNQQVkgISBydHBiaW4uc2VuZF9ydHBfc2lua18xICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgICAgICAgcnRwYmluLnNlbmRfcnRwX3NyY18xICEgcXVldWUgISB1ZHBzaW5rIGhvc3Q9JEhPU1QgcG9ydD01MDAyIHRzLW9mZnNldD0kVk9GRlNFVCAgICAgIFwKKwkgICAgICAgICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMSAhIHVkcHNpbmsgaG9zdD0kSE9TVCBwb3J0PTUwMDMgc3luYz1mYWxzZSBhc3luYz1mYWxzZSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHVkcHNyYyBwb3J0PTUwMDcgISBydHBiaW4ucmVjdl9ydGNwX3NpbmtfMQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1ydHBhdXguYyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItcnRwYXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAyN2YyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItcnRwYXV4LmMKQEAgLTAsMCArMSwyOTcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDEzIENvbGxhYm9yYSBMdGQuCisgKiAgIEBhdXRob3IgVG9ycmllIEZpc2NoZXIgPHRvcnJpZS5maXNjaGVyQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL3J0cC5oPgorCisvKgorICogQW4gUlRQIHNlcnZlcgorICogIGNyZWF0ZXMgdHdvIHNlc3Npb25zIGFuZCBzdHJlYW1zIGF1ZGlvIG9uIG9uZSwgdmlkZW8gb24gdGhlIG90aGVyLCB3aXRoIFJUQ1AKKyAqICBvbiBib3RoIHNlc3Npb25zLiBUaGUgZGVzdGluYXRpb24gaXMgMTI3LjAuMC4xLgorICoKKyAqICBJbiBib3RoIHNlc3Npb25zLCB3ZSBzZXQgInJ0cHJ0eHNlbmQiIGFzIHRoZSBzZXNzaW9uJ3MgImF1eCIgZWxlbWVudAorICogIGluIHJ0cGJpbiwgd2hpY2ggZW5hYmxlcyBSRkM0NTg4IHJldHJhbnNtaXNzaW9uIGZvciB0aGF0IHNlc3Npb24uCisgKgorICogIC4tLS0tLS0tLiAgICAuLS0tLS0tLS4gICAgLi0tLS0tLS0uICAgICAgLi0tLS0tLS0tLS0tLS4gICAgICAgLi0tLS0tLS0uCisgKiAgfGF1ZGlvdHN8ICAgIHxhbGF3ZW5jfCAgICB8cGNtYXBheXwgICAgICB8IHJ0cGJpbiAgICAgfCAgICAgICB8dWRwc2lua3wKKyAqICB8ICAgICAgc3JjLT5zaW5rICAgIHNyYy0+c2luayAgICBzcmMtPnNlbmRfcnRwXzAgc2VuZF9ydHBfMC0+c2luayAgICAgfAorICogICctLS0tLS0tJyAgICAnLS0tLS0tLScgICAgJy0tLS0tLS0nICAgICAgfCAgICAgICAgICAgIHwgICAgICAgJy0tLS0tLS0nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgCisgKiAgLi0tLS0tLS0uICAgIC4tLS0tLS0tLS0uICAgIC4tLS0tLS0tLS0uICB8ICAgICAgICAgICAgfCAgICAgICAuLS0tLS0tLS4KKyAqICB8YXVkaW90c3wgICAgfHRoZW9yYWVuY3wgICAgfHRoZW9yYXBheXwgIHwgICAgICAgICAgICB8ICAgICAgIHx1ZHBzaW5rfAorICogIHwgICAgICBzcmMtPnNpbmsgICAgICBzcmMtPnNpbmsgIHNyYy0+c2VuZF9ydHBfMSBzZW5kX3J0cF8xLT5zaW5rICAgICB8CisgKiAgJy0tLS0tLS0nICAgICctLS0tLS0tLS0nICAgICctLS0tLS0tLS0nICB8ICAgICAgICAgICAgfCAgICAgICAnLS0tLS0tLScKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLS0tLS0tLiAgICB8ICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHVkcHNyY3wgICAgfCAgICAgICAgICAgIHwgICAgICAgLi0tLS0tLS0uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICBzcmMtPnJlY3ZfcnRjcF8wICAgfCAgICAgICB8dWRwc2lua3wKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLS0tLS0nICAgIHwgICAgICAgc2VuZF9ydGNwXzAtPnNpbmsgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgJy0tLS0tLS0nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLS0tLS0tLiAgICB8ICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHVkcHNyY3wgICAgfCAgICAgICAgICAgIHwgICAgICAgLi0tLS0tLS0uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICBzcmMtPnJlY3ZfcnRjcF8xICAgfCAgICAgICB8dWRwc2lua3wKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLS0tLS0nICAgIHwgICAgICAgc2VuZF9ydGNwXzEtPnNpbmsgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tLS0tLS0tLS0tLScgICAgICAgJy0tLS0tLS0nCisgKgorICogVG8ga2VlcCB0aGUgc2V0IG9mIHBvcnRzIGNvbnNpc3RlbnQgYWNyb3NzIGJvdGggdGhpcyBzZXJ2ZXIgYW5kIHRoZQorICogY29ycmVzcG9uZGluZyBjbGllbnQsIGEgU2Vzc2lvbkRhdGEgc3RydWN0IG1hcHMgYSBydHBiaW4gc2Vzc2lvbiBudW1iZXIgdG8KKyAqIGEgR3N0QmluIGFuZCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyB1ZHAgc2lua3Mgd2l0aCBjb3JyZWN0CisgKiBwb3J0cy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBfU2Vzc2lvbkRhdGEKK3sKKyAgaW50IHJlZjsKKyAgZ3VpbnQgc2Vzc2lvbk51bTsKKyAgR3N0RWxlbWVudCAqaW5wdXQ7Cit9IFNlc3Npb25EYXRhOworCitzdGF0aWMgU2Vzc2lvbkRhdGEgKgorc2Vzc2lvbl9yZWYgKFNlc3Npb25EYXRhICogZGF0YSkKK3sKKyAgZ19hdG9taWNfaW50X2luYyAoJmRhdGEtPnJlZik7CisgIHJldHVybiBkYXRhOworfQorCitzdGF0aWMgdm9pZAorc2Vzc2lvbl91bnJlZiAoZ3BvaW50ZXIgZGF0YSkKK3sKKyAgU2Vzc2lvbkRhdGEgKnNlc3Npb24gPSAoU2Vzc2lvbkRhdGEgKikgZGF0YTsKKyAgaWYgKGdfYXRvbWljX2ludF9kZWNfYW5kX3Rlc3QgKCZzZXNzaW9uLT5yZWYpKSB7CisgICAgZ19mcmVlIChzZXNzaW9uKTsKKyAgfQorfQorCitzdGF0aWMgU2Vzc2lvbkRhdGEgKgorc2Vzc2lvbl9uZXcgKGd1aW50IHNlc3Npb25OdW0pCit7CisgIFNlc3Npb25EYXRhICpyZXQgPSBnX25ldzAgKFNlc3Npb25EYXRhLCAxKTsKKyAgcmV0LT5zZXNzaW9uTnVtID0gc2Vzc2lvbk51bTsKKyAgcmV0dXJuIHNlc3Npb25fcmVmIChyZXQpOworfQorCisvKgorICogVXNlZCB0byBnZW5lcmF0ZSBpbmZvcm1hdGl2ZSBtZXNzYWdlcyBkdXJpbmcgcGlwZWxpbmUgc3RhcnR1cAorICovCitzdGF0aWMgdm9pZAorY2Jfc3RhdGUgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsIGdwb2ludGVyIGRhdGEpCit7CisgIEdzdE9iamVjdCAqcGlwZSA9IEdTVF9PQkpFQ1QgKGRhdGEpOworICBHc3RTdGF0ZSBvbGQsIG5ldywgcGVuZGluZzsKKyAgZ3N0X21lc3NhZ2VfcGFyc2Vfc3RhdGVfY2hhbmdlZCAobWVzc2FnZSwgJm9sZCwgJm5ldywgJnBlbmRpbmcpOworICBpZiAobWVzc2FnZS0+c3JjID09IHBpcGUpIHsKKyAgICBnX3ByaW50ICgiUGlwZWxpbmUgJXMgY2hhbmdlZCBzdGF0ZSBmcm9tICVzIHRvICVzXG4iLAorICAgICAgICBHU1RfT0JKRUNUX05BTUUgKG1lc3NhZ2UtPnNyYyksCisgICAgICAgIGdzdF9lbGVtZW50X3N0YXRlX2dldF9uYW1lIChvbGQpLCBnc3RfZWxlbWVudF9zdGF0ZV9nZXRfbmFtZSAobmV3KSk7CisgIH0KK30KKworLyoKKyAqIENyZWF0ZXMgYSBHc3RHaG9zdFBhZCBuYW1lZCAic3JjIiBvbiB0aGUgZ2l2ZW4gYmluLCBwb2ludGVkIGF0IHRoZSAic3JjIiBwYWQKKyAqIG9mIHRoZSBnaXZlbiBlbGVtZW50CisgKi8KK3N0YXRpYyB2b2lkCitzZXR1cF9naG9zdCAoR3N0RWxlbWVudCAqIHNyYywgR3N0QmluICogYmluKQoreworICBHc3RQYWQgKnNyY1BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzcmMsICJzcmMiKTsKKyAgR3N0UGFkICpiaW5QYWQgPSBnc3RfZ2hvc3RfcGFkX25ldyAoInNyYyIsIHNyY1BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChiaW4pLCBiaW5QYWQpOworfQorCitzdGF0aWMgU2Vzc2lvbkRhdGEgKgorbWFrZV9hdWRpb19zZXNzaW9uIChndWludCBzZXNzaW9uTnVtKQoreworICBTZXNzaW9uRGF0YSAqc2Vzc2lvbjsKKyAgR3N0QmluICphdWRpb0JpbiA9IEdTVF9CSU4gKGdzdF9iaW5fbmV3IChOVUxMKSk7CisgIEdzdEVsZW1lbnQgKmF1ZGlvU3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW90ZXN0c3JjIiwgTlVMTCk7CisgIEdzdEVsZW1lbnQgKmVuY29kZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhbGF3ZW5jIiwgTlVMTCk7CisgIEdzdEVsZW1lbnQgKnBheWxvYWRlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cHBjbWFwYXkiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChhdWRpb1NyYywgImlzLWxpdmUiLCBUUlVFLCBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChhdWRpb0JpbiwgYXVkaW9TcmMsIGVuY29kZXIsIHBheWxvYWRlciwgTlVMTCk7CisgIGdzdF9lbGVtZW50X2xpbmtfbWFueSAoYXVkaW9TcmMsIGVuY29kZXIsIHBheWxvYWRlciwgTlVMTCk7CisKKyAgc2V0dXBfZ2hvc3QgKHBheWxvYWRlciwgYXVkaW9CaW4pOworCisgIHNlc3Npb24gPSBzZXNzaW9uX25ldyAoc2Vzc2lvbk51bSk7CisgIHNlc3Npb24tPmlucHV0ID0gR1NUX0VMRU1FTlQgKGF1ZGlvQmluKTsKKworICByZXR1cm4gc2Vzc2lvbjsKK30KKworc3RhdGljIFNlc3Npb25EYXRhICoKK21ha2VfdmlkZW9fc2Vzc2lvbiAoZ3VpbnQgc2Vzc2lvbk51bSkKK3sKKyAgR3N0QmluICp2aWRlb0JpbiA9IEdTVF9CSU4gKGdzdF9iaW5fbmV3IChOVUxMKSk7CisgIEdzdEVsZW1lbnQgKnZpZGVvU3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgTlVMTCk7CisgIEdzdEVsZW1lbnQgKmVuY29kZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ0aGVvcmFlbmMiLCBOVUxMKTsKKyAgR3N0RWxlbWVudCAqcGF5bG9hZGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwdGhlb3JhcGF5IiwgTlVMTCk7CisgIEdzdENhcHMgKnZpZGVvQ2FwczsKKyAgU2Vzc2lvbkRhdGEgKnNlc3Npb247CisgIGdfb2JqZWN0X3NldCAodmlkZW9TcmMsICJpcy1saXZlIiwgVFJVRSwgImhvcml6b250YWwtc3BlZWQiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChwYXlsb2FkZXIsICJjb25maWctaW50ZXJ2YWwiLCAyLCBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55ICh2aWRlb0JpbiwgdmlkZW9TcmMsIGVuY29kZXIsIHBheWxvYWRlciwgTlVMTCk7CisgIHZpZGVvQ2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LXJhdyIsCisgICAgICAid2lkdGgiLCBHX1RZUEVfSU5ULCAzNTIsCisgICAgICAiaGVpZ2h0IiwgR19UWVBFX0lOVCwgMjg4LCAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT04sIDE1LCAxLCBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19maWx0ZXJlZCAodmlkZW9TcmMsIGVuY29kZXIsIHZpZGVvQ2Fwcyk7CisgIGdzdF9lbGVtZW50X2xpbmsgKGVuY29kZXIsIHBheWxvYWRlcik7CisKKyAgc2V0dXBfZ2hvc3QgKHBheWxvYWRlciwgdmlkZW9CaW4pOworCisgIHNlc3Npb24gPSBzZXNzaW9uX25ldyAoc2Vzc2lvbk51bSk7CisgIHNlc3Npb24tPmlucHV0ID0gR1NUX0VMRU1FTlQgKHZpZGVvQmluKTsKKworICByZXR1cm4gc2Vzc2lvbjsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorcmVxdWVzdF9hdXhfc2VuZGVyIChHc3RFbGVtZW50ICogcnRwYmluLCBndWludCBzZXNzaWQsIFNlc3Npb25EYXRhICogc2Vzc2lvbikKK3sKKyAgR3N0RWxlbWVudCAqcnR4LCAqYmluOworICBHc3RQYWQgKnBhZDsKKyAgZ2NoYXIgKm5hbWU7CisgIEdzdFN0cnVjdHVyZSAqcHRfbWFwOworCisgIEdTVF9JTkZPICgiY3JlYXRpbmcgQVVYIHNlbmRlciIpOworICBiaW4gPSBnc3RfYmluX25ldyAoTlVMTCk7CisgIHJ0eCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cHJ0eHNlbmQiLCBOVUxMKTsKKyAgcHRfbWFwID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1wdC1tYXAiLAorICAgICAgIjgiLCBHX1RZUEVfVUlOVCwgOTgsICI5NiIsIEdfVFlQRV9VSU5ULCA5OSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAocnR4LCAicGF5bG9hZC10eXBlLW1hcCIsIHB0X21hcCwgTlVMTCk7CisgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocHRfbWFwKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKGJpbiksIHJ0eCk7CisKKyAgcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHJ0eCwgInNyYyIpOworICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgic3JjXyV1Iiwgc2Vzc2lkKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoYmluLCBnc3RfZ2hvc3RfcGFkX25ldyAobmFtZSwgcGFkKSk7CisgIGdfZnJlZSAobmFtZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisKKyAgcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHJ0eCwgInNpbmsiKTsKKyAgbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInNpbmtfJXUiLCBzZXNzaWQpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChiaW4sIGdzdF9naG9zdF9wYWRfbmV3IChuYW1lLCBwYWQpKTsKKyAgZ19mcmVlIChuYW1lKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGFkKTsKKworICByZXR1cm4gYmluOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIHVwIHRoZSBVRFAgc2lua3MgYW5kIHNvdXJjZXMgZm9yIFJUUC9SVENQLCBhZGRzIHRoZQorICogZ2l2ZW4gc2Vzc2lvbidzIGJpbiBpbnRvIHRoZSBwaXBlbGluZSwgYW5kIGxpbmtzIGl0IHRvIHRoZSBwcm9wZXJseSBudW1iZXJlZAorICogcGFkcyBvbiB0aGUgcnRwYmluCisgKi8KK3N0YXRpYyB2b2lkCithZGRfc3RyZWFtIChHc3RQaXBlbGluZSAqIHBpcGUsIEdzdEVsZW1lbnQgKiBydHBCaW4sIFNlc3Npb25EYXRhICogc2Vzc2lvbikKK3sKKyAgR3N0RWxlbWVudCAqcnRwU2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInVkcHNpbmsiLCBOVUxMKTsKKyAgR3N0RWxlbWVudCAqcnRjcFNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1ZHBzaW5rIiwgTlVMTCk7CisgIEdzdEVsZW1lbnQgKnJ0Y3BTcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1ZHBzcmMiLCBOVUxMKTsKKyAgR3N0RWxlbWVudCAqaWRlbnRpdHkgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJpZGVudGl0eSIsIE5VTEwpOworICBpbnQgYmFzZVBvcnQ7CisgIGdjaGFyICpwYWROYW1lOworCisgIGJhc2VQb3J0ID0gNTAwMCArIChzZXNzaW9uLT5zZXNzaW9uTnVtICogNik7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZSksIHJ0cFNpbmssIHJ0Y3BTaW5rLCBydGNwU3JjLCBpZGVudGl0eSwKKyAgICAgIHNlc3Npb24tPmlucHV0LCBOVUxMKTsKKworICAvKiBlbmFibGUgcmV0cmFuc21pc3Npb24gYnkgc2V0dGluZyBydHBydHhzZW5kIGFzIHRoZSAiYXV4IiBlbGVtZW50IG9mIHJ0cGJpbiAqLworICBnX3NpZ25hbF9jb25uZWN0IChydHBCaW4sICJyZXF1ZXN0LWF1eC1zZW5kZXIiLAorICAgICAgKEdDYWxsYmFjaykgcmVxdWVzdF9hdXhfc2VuZGVyLCBzZXNzaW9uKTsKKworICBnX29iamVjdF9zZXQgKHJ0cFNpbmssICJwb3J0IiwgYmFzZVBvcnQsICJob3N0IiwgIjEyNy4wLjAuMSIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHJ0Y3BTaW5rLCAicG9ydCIsIGJhc2VQb3J0ICsgMSwgImhvc3QiLCAiMTI3LjAuMC4xIiwgInN5bmMiLAorICAgICAgRkFMU0UsICJhc3luYyIsIEZBTFNFLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChydGNwU3JjLCAicG9ydCIsIGJhc2VQb3J0ICsgNSwgTlVMTCk7CisKKyAgLyogdGhpcyBpcyBqdXN0IHRvIGRyb3Agc29tZSBydHAgcGFja2V0cyBhdCByYW5kb20sIHRvIGRlbW9uc3RyYXRlCisgICAqIHRoYXQgcnRwcnR4c2VuZCBhY3R1YWxseSB3b3JrcyAqLworICBnX29iamVjdF9zZXQgKGlkZW50aXR5LCAiZHJvcC1wcm9iYWJpbGl0eSIsIDAuMDEsIE5VTEwpOworCisgIHBhZE5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzZW5kX3J0cF9zaW5rXyV1Iiwgc2Vzc2lvbi0+c2Vzc2lvbk51bSk7CisgIGdzdF9lbGVtZW50X2xpbmtfcGFkcyAoc2Vzc2lvbi0+aW5wdXQsICJzcmMiLCBydHBCaW4sIHBhZE5hbWUpOworICBnX2ZyZWUgKHBhZE5hbWUpOworCisgIC8qIGxpbmsgcnRwYmluIHRvIHVkcHNpbmsgZGlyZWN0bHkgaGVyZSBpZiB5b3UgZG9uJ3Qgd2FudAorICAgKiBhcnRpZmljaWFsIHBhY2tldCBsb3NzICovCisgIHBhZE5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzZW5kX3J0cF9zcmNfJXUiLCBzZXNzaW9uLT5zZXNzaW9uTnVtKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19wYWRzIChydHBCaW4sIHBhZE5hbWUsIGlkZW50aXR5LCAic2luayIpOworICBnc3RfZWxlbWVudF9saW5rIChpZGVudGl0eSwgcnRwU2luayk7CisgIGdfZnJlZSAocGFkTmFtZSk7CisKKyAgcGFkTmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInNlbmRfcnRjcF9zcmNfJXUiLCBzZXNzaW9uLT5zZXNzaW9uTnVtKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19wYWRzIChydHBCaW4sIHBhZE5hbWUsIHJ0Y3BTaW5rLCAic2luayIpOworICBnX2ZyZWUgKHBhZE5hbWUpOworCisgIHBhZE5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJyZWN2X3J0Y3Bfc2lua18ldSIsIHNlc3Npb24tPnNlc3Npb25OdW0pOworICBnc3RfZWxlbWVudF9saW5rX3BhZHMgKHJ0Y3BTcmMsICJzcmMiLCBydHBCaW4sIHBhZE5hbWUpOworICBnX2ZyZWUgKHBhZE5hbWUpOworCisgIGdfcHJpbnQgKCJOZXcgUlRQIHN0cmVhbSBvbiAlaS8laS8laVxuIiwgYmFzZVBvcnQsIGJhc2VQb3J0ICsgMSwKKyAgICAgIGJhc2VQb3J0ICsgNSk7CisKKyAgc2Vzc2lvbl91bnJlZiAoc2Vzc2lvbik7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBHc3RQaXBlbGluZSAqcGlwZTsKKyAgR3N0QnVzICpidXM7CisgIFNlc3Npb25EYXRhICp2aWRlb1Nlc3Npb247CisgIFNlc3Npb25EYXRhICphdWRpb1Nlc3Npb247CisgIEdzdEVsZW1lbnQgKnJ0cEJpbjsKKyAgR01haW5Mb29wICpsb29wOworCisgIGdzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIEZBTFNFKTsKKworICBwaXBlID0gR1NUX1BJUEVMSU5FIChnc3RfcGlwZWxpbmVfbmV3IChOVUxMKSk7CisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKEdTVF9FTEVNRU5UIChwaXBlKSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OnN0YXRlLWNoYW5nZWQiLCBHX0NBTExCQUNLIChjYl9zdGF0ZSksIHBpcGUpOworICBnc3RfYnVzX2FkZF9zaWduYWxfd2F0Y2ggKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgcnRwQmluID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwYmluIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAocnRwQmluLCAicnRwLXByb2ZpbGUiLCBHU1RfUlRQX1BST0ZJTEVfQVZQRiwgTlVMTCk7CisKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGUpLCBydHBCaW4pOworCisgIHZpZGVvU2Vzc2lvbiA9IG1ha2VfdmlkZW9fc2Vzc2lvbiAoMCk7CisgIGF1ZGlvU2Vzc2lvbiA9IG1ha2VfYXVkaW9fc2Vzc2lvbiAoMSk7CisgIGFkZF9zdHJlYW0gKHBpcGUsIHJ0cEJpbiwgdmlkZW9TZXNzaW9uKTsKKyAgYWRkX3N0cmVhbSAocGlwZSwgcnRwQmluLCBhdWRpb1Nlc3Npb24pOworCisgIGdfcHJpbnQgKCJzdGFydGluZyBzZXJ2ZXIgcGlwZWxpbmVcbiIpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKEdTVF9FTEVNRU5UIChwaXBlKSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgZ19wcmludCAoInN0b3BwaW5nIHNlcnZlciBwaXBlbGluZVxuIik7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoR1NUX0VMRU1FTlQgKHBpcGUpLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZSk7CisgIGdfbWFpbl9sb29wX3VucmVmIChsb29wKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItcnRwYnVuZGxlLmMgYi90ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXJ0cGJ1bmRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNmQwMWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXJ0cGJ1bmRsZS5jCkBAIC0wLDAgKzEsMTc5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxNiBJZ2FsaWEgUy5MCisgKiAgIEBhdXRob3IgUGhpbGlwcGUgTm9ybWFuZCA8cGhpbG5AaWdhbGlhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworLyoKKyAqIEFuIGJ1bmRsaW5nIFJUUCBzZXJ2ZXIKKyAqICBjcmVhdGVzIHR3byBzZXNzaW9ucyBhbmQgc3RyZWFtcyBhdWRpbyBvbiBvbmUsIHZpZGVvIG9uIHRoZSBvdGhlciwgd2l0aCBSVENQCisgKiAgb24gYm90aCBzZXNzaW9ucy4gVGhlIGRlc3RpbmF0aW9uIGlzIDEyNy4wLjAuMS4KKyAqCisgKiAgVGhlIFJUUCBzdHJlYW1zIGFyZSBidW5kbGVkIHRvIGEgc2luZ2xlIG91dGdvaW5nIGNvbm5lY3Rpb24uIFNhbWUgZm9yIHRoZSBSVENQIHN0cmVhbXMuCisgKgorICogIC4tLS0tLS0tLiAgICAuLS0tLS0tLS4gICAgLi0tLS0tLS0uICAgICAgLi0tLS0tLS0tLS0tLS4gICAgICAgICAuLS0tLS0tLgorICogIHxhdWRpb3RzfCAgICB8YWxhd2VuY3wgICAgfHBjbWFwYXl8ICAgICAgfCBydHBiaW4gICAgIHwgICAgICAgICB8ZnVubmVsfAorICogIHwgICAgICBzcmMtPnNpbmsgICAgc3JjLT5zaW5rICAgIHNyYy0+c2VuZF9ydHBfMCBzZW5kX3J0cF8wLS0tPnNpbmtfMCAgfCAgICAuLS0tLS0tLS4KKyAqICAnLS0tLS0tLScgICAgJy0tLS0tLS0nICAgICctLS0tLS0tJyAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgIHwgICAgfHVkcHNpbmt8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgIHwgICAgIHNyYy0+c2luayAgICAgfAorICogIC4tLS0tLS0tLiAgICAgICAgICAgICAgIC4tLS0tLS0tLS0uICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgfCAgICAnLS0tLS0tLScKKyAqICB8dmlkZW90c3wgICAgICAgICAgICAgICB8IHZyYXdwYXkgfCAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgIHwKKyAqICB8ICAgICAgc3JjLS0tLS0tLS0tLS0tPnNpbmsgICAgICBzcmMtPnNlbmRfcnRwXzEgc2VuZF9ydHBfMS0tLT5zaW5rXzEgIHwKKyAqICAnLS0tLS0tLScgICAgICAgICAgICAgICAnLS0tLS0tLS0tJyAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgJy0tLS0tLScKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLS0tLS0tLiAgICB8ICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHVkcHNyY3wgICAgfCAgICAgICAgICAgIHwgICAgICAgICAuLS0tLS0tLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgc3JjLT5yZWN2X3J0Y3BfMCAgIHwgICAgICAgICB8ZnVubmVsfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tLS0tLScgICAgfCAgICAgICBzZW5kX3J0Y3BfMC0tPnNpbmtfMCAgfCAgIC4tLS0tLS0tLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgfCAgIHx1ZHBzaW5rfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi0tLS0tLS4gICAgfCAgICAgICAgICAgIHwgICAgICAgICB8ICAgIHNyYy0+c2luayAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHVkcHNyY3wgICAgfCAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgfCAgICctLS0tLS0tJworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgc3JjLT5yZWN2X3J0Y3BfMSAgIHwgICAgICAgICB8ICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tLS0tLScgICAgfCAgICAgICBzZW5kX3J0Y3BfMS0tPnNpbmtfMSAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tLS0tLS0tLS0tLScgICAgICAgICAnLS0tLS0tJworICoKKyAqLworCitzdGF0aWMgR3N0RWxlbWVudCAqCitjcmVhdGVfcGlwZWxpbmUgKHZvaWQpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lLCAqcnRwYmluLCAqYXVkaW9zcmMsICphdWRpb19lbmNvZGVyLAorICAgICAgKmF1ZGlvX3J0cHBheWxvYWRlciwgKnNlbmRydHBfdWRwc2luaywKKyAgICAgICpzZW5kX3J0Y3BfdWRwc2luaywgKnNlbmRydGNwX2Z1bm5lbCwgKnNlbmRydHBfZnVubmVsOworICBHc3RFbGVtZW50ICp2aWRlb3NyYywgKnZpZGVvX3J0cHBheWxvYWRlciwgKnRpbWVfb3ZlcmxheTsKKyAgZ2ludCBydHBfdWRwX3BvcnQgPSA1MDAxOworICBnaW50IHJ0Y3BfdWRwX3BvcnQgPSA1MDAyOworICBnaW50IHJlY3ZfYXVkaW9fcnRjcF9wb3J0ID0gNTAwMzsKKyAgZ2ludCByZWN2X3ZpZGVvX3J0Y3BfcG9ydCA9IDUwMDQ7CisgIEdzdEVsZW1lbnQgKmF1ZGlvX3J0Y3BfdWRwc3JjLCAqdmlkZW9fcnRjcF91ZHBzcmM7CisKKyAgcGlwZWxpbmUgPSBnc3RfcGlwZWxpbmVfbmV3IChOVUxMKTsKKworICBydHBiaW4gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBiaW4iLCBOVUxMKTsKKworICBhdWRpb3NyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvdGVzdHNyYyIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKGF1ZGlvc3JjLCAiaXMtbGl2ZSIsIFRSVUUsIE5VTEwpOworICBhdWRpb19lbmNvZGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYWxhd2VuYyIsIE5VTEwpOworICBhdWRpb19ydHBwYXlsb2FkZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBwY21hcGF5IiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoYXVkaW9fcnRwcGF5bG9hZGVyLCAicHQiLCA5NiwgTlVMTCk7CisKKyAgdmlkZW9zcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0ICh2aWRlb3NyYywgImlzLWxpdmUiLCBUUlVFLCBOVUxMKTsKKyAgdGltZV9vdmVybGF5ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidGltZW92ZXJsYXkiLCBOVUxMKTsKKyAgdmlkZW9fcnRwcGF5bG9hZGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwdnJhd3BheSIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHZpZGVvX3J0cHBheWxvYWRlciwgInB0IiwgMTAwLCBOVUxMKTsKKworICAvKiBtdXhlZCBydGNwICovCisgIHNlbmRydGNwX2Z1bm5lbCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZ1bm5lbCIsICJzZW5kX3J0Y3BfZnVubmVsIik7CisgIHNlbmRfcnRjcF91ZHBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidWRwc2luayIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNlbmRfcnRjcF91ZHBzaW5rLCAiaG9zdCIsICIxMjcuMC4wLjEiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzZW5kX3J0Y3BfdWRwc2luaywgInBvcnQiLCBydGNwX3VkcF9wb3J0LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzZW5kX3J0Y3BfdWRwc2luaywgInN5bmMiLCBGQUxTRSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc2VuZF9ydGNwX3VkcHNpbmssICJhc3luYyIsIEZBTFNFLCBOVUxMKTsKKworICAvKiBvdXRnb2luZyBidW5kbGVkIHN0cmVhbSAqLworICBzZW5kcnRwX2Z1bm5lbCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZ1bm5lbCIsICJzZW5kX3J0cF9mdW5uZWwiKTsKKyAgc2VuZHJ0cF91ZHBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidWRwc2luayIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNlbmRydHBfdWRwc2luaywgImhvc3QiLCAiMTI3LjAuMC4xIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc2VuZHJ0cF91ZHBzaW5rLCAicG9ydCIsIHJ0cF91ZHBfcG9ydCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc2VuZHJ0cF91ZHBzaW5rLCAic3luYyIsIEZBTFNFLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzZW5kcnRwX3VkcHNpbmssICJhc3luYyIsIEZBTFNFLCBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHJ0cGJpbiwgYXVkaW9zcmMsIGF1ZGlvX2VuY29kZXIsCisgICAgICBhdWRpb19ydHBwYXlsb2FkZXIsIHNlbmRydHBfdWRwc2luaywgc2VuZF9ydGNwX3VkcHNpbmssCisgICAgICBzZW5kcnRwX2Z1bm5lbCwgc2VuZHJ0Y3BfZnVubmVsLCB2aWRlb3NyYywgdmlkZW9fcnRwcGF5bG9hZGVyLCBOVUxMKTsKKworICBpZiAodGltZV9vdmVybGF5KQorICAgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIHRpbWVfb3ZlcmxheSk7CisKKyAgZ3N0X2VsZW1lbnRfbGlua19tYW55IChhdWRpb3NyYywgYXVkaW9fZW5jb2RlciwgYXVkaW9fcnRwcGF5bG9hZGVyLCBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19wYWRzIChhdWRpb19ydHBwYXlsb2FkZXIsICJzcmMiLCBydHBiaW4sICJzZW5kX3J0cF9zaW5rXzAiKTsKKworICBpZiAodGltZV9vdmVybGF5KSB7CisgICAgZ3N0X2VsZW1lbnRfbGlua19tYW55ICh2aWRlb3NyYywgdGltZV9vdmVybGF5LCB2aWRlb19ydHBwYXlsb2FkZXIsIE5VTEwpOworICB9IGVsc2UgeworICAgIGdzdF9lbGVtZW50X2xpbmsgKHZpZGVvc3JjLCB2aWRlb19ydHBwYXlsb2FkZXIpOworICB9CisKKyAgZ3N0X2VsZW1lbnRfbGlua19wYWRzICh2aWRlb19ydHBwYXlsb2FkZXIsICJzcmMiLCBydHBiaW4sICJzZW5kX3J0cF9zaW5rXzEiKTsKKworICBnc3RfZWxlbWVudF9saW5rX3BhZHMgKHNlbmRydHBfZnVubmVsLCAic3JjIiwgc2VuZHJ0cF91ZHBzaW5rLCAic2luayIpOworICBnc3RfZWxlbWVudF9saW5rX3BhZHMgKHJ0cGJpbiwgInNlbmRfcnRwX3NyY18wIiwgc2VuZHJ0cF9mdW5uZWwsICJzaW5rXyV1Iik7CisgIGdzdF9lbGVtZW50X2xpbmtfcGFkcyAocnRwYmluLCAic2VuZF9ydHBfc3JjXzEiLCBzZW5kcnRwX2Z1bm5lbCwgInNpbmtfJXUiKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19wYWRzIChzZW5kcnRjcF9mdW5uZWwsICJzcmMiLCBzZW5kX3J0Y3BfdWRwc2luaywgInNpbmsiKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19wYWRzIChydHBiaW4sICJzZW5kX3J0Y3Bfc3JjXzAiLCBzZW5kcnRjcF9mdW5uZWwsICJzaW5rXyV1Iik7CisgIGdzdF9lbGVtZW50X2xpbmtfcGFkcyAocnRwYmluLCAic2VuZF9ydGNwX3NyY18xIiwgc2VuZHJ0Y3BfZnVubmVsLCAic2lua18ldSIpOworCisgIGF1ZGlvX3J0Y3BfdWRwc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidWRwc3JjIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoYXVkaW9fcnRjcF91ZHBzcmMsICJwb3J0IiwgcmVjdl9hdWRpb19ydGNwX3BvcnQsIE5VTEwpOworICB2aWRlb19ydGNwX3VkcHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInVkcHNyYyIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHZpZGVvX3J0Y3BfdWRwc3JjLCAicG9ydCIsIHJlY3ZfdmlkZW9fcnRjcF9wb3J0LCBOVUxMKTsKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBhdWRpb19ydGNwX3VkcHNyYywgdmlkZW9fcnRjcF91ZHBzcmMsCisgICAgICBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19wYWRzIChhdWRpb19ydGNwX3VkcHNyYywgInNyYyIsIHJ0cGJpbiwgInJlY3ZfcnRjcF9zaW5rXzAiKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19wYWRzICh2aWRlb19ydGNwX3VkcHNyYywgInNyYyIsIHJ0cGJpbiwgInJlY3ZfcnRjcF9zaW5rXzEiKTsKKworICByZXR1cm4gcGlwZWxpbmU7Cit9CisKKy8qCisgKiBVc2VkIHRvIGdlbmVyYXRlIGluZm9ybWF0aXZlIG1lc3NhZ2VzIGR1cmluZyBwaXBlbGluZSBzdGFydHVwCisgKi8KK3N0YXRpYyB2b2lkCitjYl9zdGF0ZSAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR3N0T2JqZWN0ICpwaXBlID0gR1NUX09CSkVDVCAoZGF0YSk7CisgIEdzdFN0YXRlIG9sZCwgbmV3LCBwZW5kaW5nOworICBnc3RfbWVzc2FnZV9wYXJzZV9zdGF0ZV9jaGFuZ2VkIChtZXNzYWdlLCAmb2xkLCAmbmV3LCAmcGVuZGluZyk7CisgIGlmIChtZXNzYWdlLT5zcmMgPT0gcGlwZSkgeworICAgIGdfcHJpbnQgKCJQaXBlbGluZSAlcyBjaGFuZ2VkIHN0YXRlIGZyb20gJXMgdG8gJXNcbiIsCisgICAgICAgIEdTVF9PQkpFQ1RfTkFNRSAobWVzc2FnZS0+c3JjKSwKKyAgICAgICAgZ3N0X2VsZW1lbnRfc3RhdGVfZ2V0X25hbWUgKG9sZCksIGdzdF9lbGVtZW50X3N0YXRlX2dldF9uYW1lIChuZXcpKTsKKyAgfQorfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgR3N0RWxlbWVudCAqcGlwZTsKKyAgR3N0QnVzICpidXM7CisgIEdNYWluTG9vcCAqbG9vcDsKKworICBnc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICBsb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisKKyAgcGlwZSA9IGNyZWF0ZV9waXBlbGluZSAoKTsKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAocGlwZSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OnN0YXRlLWNoYW5nZWQiLCBHX0NBTExCQUNLIChjYl9zdGF0ZSksIHBpcGUpOworICBnc3RfYnVzX2FkZF9zaWduYWxfd2F0Y2ggKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgZ19wcmludCAoInN0YXJ0aW5nIHNlcnZlciBwaXBlbGluZVxuIik7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgZ19wcmludCAoInN0b3BwaW5nIHNlcnZlciBwaXBlbGluZVxuIik7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZSwgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGUpOworICBnX21haW5fbG9vcF91bnJlZiAobG9vcCk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXY0bDItSDI2M3AtYWxzYXNyYy1BTVIuc2ggYi90ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXY0bDItSDI2M3AtYWxzYXNyYy1BTVIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTNlZjVhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItdjRsMi1IMjYzcC1hbHNhc3JjLUFNUi5zaApAQCAtMCwwICsxLDI1IEBACisjIS9iaW4vc2gKKyMKKyMgQSBzaW1wbGUgUlRQIHNlcnZlcgorIworCisjIGNoYW5nZSB0aGVzZSB0byBjaGFuZ2UgdGhlIHNlcnZlciBzeW5jLiBUaGlzIGNhdXNlcyB0aGUgc2VydmVyIHRvIHNlbmQgdGhlCisjIHBhY2tldHMgbGFyZ2x5IG91dC1vZi1zeW5jLCB0aGUgY2xpZW50IHNob3VsZCB1c2UgdGhlIFJUQ1AgU1IgcGFja2V0cyB0bworIyByZXN0b3JlIHByb3BlciBsaXAtc3luYyBiZXR3ZWVuIHRoZSBzdHJlYW1zLgorQU9GRlNFVD0wCitWT0ZGU0VUPTAKKworVkNBUFM9InZpZGVvL3gtcmF3LHdpZHRoPTM1MixoZWlnaHQ9Mjg4LGZyYW1lcmF0ZT0xNS8xIgorCisjREVTVD0xOTIuMTY4LjEuMTI2CitERVNUPWxvY2FsaG9zdAorCitnc3QtbGF1bmNoLTEuMCAtdiBydHBiaW4gbmFtZT1ydHBiaW4gXAorICAgICAgICAgICB2NGwyc3JjICEgdmlkZW9yYXRlICEgdmlkZW9jb252ZXJ0ICEgJFZDQVBTICEgYXZlbmNfaDI2M3AgISBydHBoMjYzcHBheSAhIHJ0cGJpbi5zZW5kX3J0cF9zaW5rXzAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBydHBiaW4uc2VuZF9ydHBfc3JjXzAgISBxdWV1ZSAhIHVkcHNpbmsgaG9zdD0kREVTVCBwb3J0PTUwMDAgdHMtb2Zmc2V0PSRBT0ZGU0VUICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMCAhIHVkcHNpbmsgaG9zdD0kREVTVCBwb3J0PTUwMDEgc3luYz1mYWxzZSBhc3luYz1mYWxzZSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHVkcHNyYyBwb3J0PTUwMDUgISBydHBiaW4ucmVjdl9ydGNwX3NpbmtfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGF1dG9hdWRpb3NyYyAhIGF1ZGlvY29udmVydCAhIGFtcm5iZW5jICEgcnRwYW1ycGF5ICEgcnRwYmluLnNlbmRfcnRwX3NpbmtfMSAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICAgICAgIHJ0cGJpbi5zZW5kX3J0cF9zcmNfMSAhIHF1ZXVlICEgdWRwc2luayBob3N0PSRERVNUIHBvcnQ9NTAwMiB0cy1vZmZzZXQ9JFZPRkZTRVQgICAgICBcCisJICAgICAgICAgICAgIHJ0cGJpbi5zZW5kX3J0Y3Bfc3JjXzEgISB1ZHBzaW5rIGhvc3Q9JERFU1QgcG9ydD01MDAzIHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICB1ZHBzcmMgcG9ydD01MDA3ICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzEKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItdjRsMi1IMjY0LWFsc2FzcmMtUENNQS5zaCBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItdjRsMi1IMjY0LWFsc2FzcmMtUENNQS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYzcyN2E2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci12NGwyLUgyNjQtYWxzYXNyYy1QQ01BLnNoCkBAIC0wLDAgKzEsNzggQEAKKyMhL2Jpbi9zaAorIworIyBBIHNpbXBsZSBSVFAgc2VydmVyCisjICBzZW5kcyB0aGUgb3V0cHV0IG9mIHY0bDJzcmMgYXMgaDI2NCBlbmNvZGVkIFJUUCBvbiBwb3J0IDUwMDAsIFJUQ1AgaXMgc2VudCBvbgorIyAgcG9ydCA1MDAxLiBUaGUgZGVzdGluYXRpb24gaXMgMTI3LjAuMC4xLgorIyAgdGhlIHZpZGVvIHJlY2VpdmVyIFJUQ1AgcmVwb3J0cyBhcmUgcmVjZWl2ZWQgb24gcG9ydCA1MDA1CisjICBzZW5kcyB0aGUgb3V0cHV0IG9mIGF1dG9hdWRpb3NyYyBhcyBhbGF3IGVuY29kZWQgUlRQIG9uIHBvcnQgNTAwMiwgUlRDUCBpcyBzZW50IG9uCisjICBwb3J0IDUwMDMuIFRoZSBkZXN0aW5hdGlvbiBpcyAxMjcuMC4wLjEuCisjICB0aGUgcmVjZWl2ZXIgUlRDUCByZXBvcnRzIGFyZSByZWNlaXZlZCBvbiBwb3J0IDUwMDcKKyMKKyMgIC4tLS0tLS0tLiAgICAuLS0tLS0tLS4gICAgLi0tLS0tLS0uICAgICAgLi0tLS0tLS0tLS0uICAgICAuLS0tLS0tLS4KKyMgIHx2NGxzc3JjfCAgICB8aDI2NGVuY3wgICAgfGgyNjRwYXl8ICAgICAgfCBydHBiaW4gICB8ICAgICB8dWRwc2lua3wgIFJUUAorIyAgfCAgICAgIHNyYy0+c2luayAgICBzcmMtPnNpbmsgICAgc3JjLT5zZW5kX3J0cCBzZW5kX3J0cC0+c2luayAgICAgfCBwb3J0PTUwMDAKKyMgICctLS0tLS0tJyAgICAnLS0tLS0tLScgICAgJy0tLS0tLS0nICAgICAgfCAgICAgICAgICB8ICAgICAnLS0tLS0tLScKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgLi0tLS0tLS0uCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgfHVkcHNpbmt8ICBSVENQCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgc2VuZF9ydGNwLT5zaW5rICAgICB8IHBvcnQ9NTAwMQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLS0tLS0tLS4gICAgICB8ICAgICAgICAgIHwgICAgICctLS0tLS0tJyBzeW5jPWZhbHNlCisjICAgICAgICAgICAgICAgICBSVENQICAgICAgIHx1ZHBzcmMgfCAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgIGFzeW5jPWZhbHNlCisjICAgICAgICAgICAgICAgcG9ydD01MDA1ICAgIHwgICAgIHNyYy0+cmVjdl9ydGNwICAgICAgfAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS0tLS0tLScgICAgICB8ICAgICAgICAgIHwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8CisjIC4tLS0tLS0tLS4gICAgLi0tLS0tLS0uICAgIC4tLS0tLS0tLiAgICAgIHwgICAgICAgICAgfCAgICAgLi0tLS0tLS0uCisjIHxhdWRpb3NyY3wgICAgfGFsYXdlbmN8ICAgIHxwY21hcGF5fCAgICAgIHwgcnRwYmluICAgfCAgICAgfHVkcHNpbmt8ICBSVFAKKyMgfCAgICAgICBzcmMtPnNpbmsgICAgc3JjLT5zaW5rICAgIHNyYy0+c2VuZF9ydHAgc2VuZF9ydHAtPnNpbmsgICAgIHwgcG9ydD01MDAyCisjICctLS0tLS0tLScgICAgJy0tLS0tLS0nICAgICctLS0tLS0tJyAgICAgIHwgICAgICAgICAgfCAgICAgJy0tLS0tLS0nCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIC4tLS0tLS0tLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIHx1ZHBzaW5rfCAgUlRDUAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHNlbmRfcnRjcC0+c2luayAgICAgfCBwb3J0PTUwMDMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi0tLS0tLS0uICAgICAgfCAgICAgICAgICB8ICAgICAnLS0tLS0tLScgc3luYz1mYWxzZQorIyAgICAgICAgICAgICAgICAgUlRDUCAgICAgICB8dWRwc3JjIHwgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICBhc3luYz1mYWxzZQorIyAgICAgICAgICAgICAgIHBvcnQ9NTAwNyAgICB8ICAgICBzcmMtPnJlY3ZfcnRjcCAgICAgIHwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tLS0tLS0nICAgICAgJy0tLS0tLS0tLS0nCisjCisjIGlkZWFsbHkgd2Ugc2hvdWxkIHRyYW5zcG9ydCB0aGUgcHJvcGVydGllcyBvbiB0aGUgUlRQIHVkcHNpbmsgcGFkcyB0byB0aGUKKyMgcmVjZWl2ZXIgaW4gb3JkZXIgdG8gdHJhbnNtaXQgdGhlIFNQUyBhbmQgUFBTIGVhcmxpZXIuCisKKyMgY2hhbmdlIHRoaXMgdG8gc2VuZCB0aGUgUlRQIGRhdGEgYW5kIFJUQ1AgdG8gYW5vdGhlciBob3N0CitERVNUPTEyNy4wLjAuMQorCisjIHR1bmluZyBwYXJhbWV0ZXJzIHRvIG1ha2UgdGhlIHNlbmRlciBzZW5kIHRoZSBzdHJlYW1zIG91dCBvZiBzeW5jLiBDYW4gYmUgdXNlZAorIyBvdCB0ZXN0IHRoZSBjbGllbnQgUlRDUCBzeW5jaHJvbmlzYXRpb24uCisjVk9GRlNFVD05MDAwMDAwMDAKK1ZPRkZTRVQ9MAorQU9GRlNFVD0wCisKKyMgSDI2NCBlbmNvZGUgZnJvbSB0aGUgc291cmNlCitWRUxFTT0idjRsMnNyYyIKKyNWRUxFTT0idmlkZW90ZXN0c3JjIGlzLWxpdmU9MSIKK1ZDQVBTPSJ2aWRlby94LXJhdyx3aWR0aD0zNTIsaGVpZ2h0PTI4OCxmcmFtZXJhdGU9MTUvMSIKK1ZTT1VSQ0U9IiRWRUxFTSAhIHF1ZXVlICEgdmlkZW9yYXRlICEgdmlkZW9jb252ZXJ0ICEgJFZDQVBTIgorVkVOQz0ieDI2NGVuYyB0dW5lPXplcm9sYXRlbmN5IGJ5dGUtc3RyZWFtPXRydWUgYml0cmF0ZT0zMDAgISBydHBoMjY0cGF5IgorCitWUlRQU0lOSz0idWRwc2luayBwb3J0PTUwMDAgaG9zdD0kREVTVCB0cy1vZmZzZXQ9JFZPRkZTRVQgbmFtZT12cnRwc2luayIKK1ZSVENQU0lOSz0idWRwc2luayBwb3J0PTUwMDEgaG9zdD0kREVTVCBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlIG5hbWU9dnJ0Y3BzaW5rIgorVlJUQ1BTUkM9InVkcHNyYyBwb3J0PTUwMDUgbmFtZT12cnRwc3JjIgorCisjIFBDTUEgZW5jb2RlIGZyb20gdGhlIHNvdXJjZQorQUVMRU09ImF1dG9hdWRpb3NyYyIKKyNBRUxFTT0iYXVkaW90ZXN0c3JjIGlzLWxpdmU9MSIKK0FTT1VSQ0U9IiRBRUxFTSAhIHF1ZXVlICEgYXVkaW9yZXNhbXBsZSAhIGF1ZGlvY29udmVydCIKK0FFTkM9ImFsYXdlbmMgISBydHBwY21hcGF5IgorCitBUlRQU0lOSz0idWRwc2luayBwb3J0PTUwMDIgaG9zdD0kREVTVCB0cy1vZmZzZXQ9JEFPRkZTRVQgbmFtZT1hcnRwc2luayIKK0FSVENQU0lOSz0idWRwc2luayBwb3J0PTUwMDMgaG9zdD0kREVTVCBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlIG5hbWU9YXJ0Y3BzaW5rIgorQVJUQ1BTUkM9InVkcHNyYyBwb3J0PTUwMDcgbmFtZT1hcnRwc3JjIgorCitnc3QtbGF1bmNoLTEuMCAtdiBydHBiaW4gbmFtZT1ydHBiaW4gXAorICAgICRWU09VUkNFICEgJFZFTkMgISBydHBiaW4uc2VuZF9ydHBfc2lua18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBydHBiaW4uc2VuZF9ydHBfc3JjXzAgISAkVlJUUFNJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18wICEgJFZSVENQU0lOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgJFZSVENQU1JDICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICRBU09VUkNFICEgJEFFTkMgISBydHBiaW4uc2VuZF9ydHBfc2lua18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBydHBiaW4uc2VuZF9ydHBfc3JjXzEgISAkQVJUUFNJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18xICEgJEFSVENQU0lOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgJEFSVENQU1JDICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzEKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3NoYXBld2lwZS8uZ2l0aWdub3JlIGIvdGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ2YmM0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3NoYXBld2lwZS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKK3NoYXBld2lwZS1leGFtcGxlCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvTWFrZWZpbGUuYW0gYi90ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBlOTIxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3NoYXBld2lwZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDggQEAKK25vaW5zdF9QUk9HUkFNUyA9IHNoYXBld2lwZS1leGFtcGxlCisKK3NoYXBld2lwZV9leGFtcGxlX1NPVVJDRVMgPSBzaGFwZXdpcGUtZXhhbXBsZS5jCitzaGFwZXdpcGVfZXhhbXBsZV9DRkxBR1MgPSAkKEdTVF9DT05UUk9MTEVSX0NGTEFHUykgJChHU1RfQ0ZMQUdTKQorc2hhcGV3aXBlX2V4YW1wbGVfTERBREQgPSAkKEdTVF9DT05UUk9MTEVSX0xJQlMpICQoR1NUX0xJQlMpCisKK25vaW5zdF9IRUFERVJTID0gCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3NoYXBld2lwZS9tZXNvbi5idWlsZCBiL3Rlc3RzL2V4YW1wbGVzL3NoYXBld2lwZS9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGQ3NzVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsNSBAQAorZXhlY3V0YWJsZSgnc2hhcGV3aXBlLWV4YW1wbGUnLCAnc2hhcGV3aXBlLWV4YW1wbGUuYycsCisgIGRlcGVuZGVuY2llczogW2dzdGNvbnRyb2xsZXJfZGVwLCBnc3RfZGVwXSwKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgIGluc3RhbGw6IGZhbHNlKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlL3NoYXBld2lwZS1leGFtcGxlLmMgYi90ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGQ3MzRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlL3NoYXBld2lwZS1leGFtcGxlLmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA5IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2NvbnRyb2xsZXIvZ3N0bGZvY29udHJvbHNvdXJjZS5oPgorI2luY2x1ZGUgPGdzdC9jb250cm9sbGVyL2dzdGRpcmVjdGNvbnRyb2xiaW5kaW5nLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIGdib29sZWFuCitvbl9tZXNzYWdlIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdNYWluTG9vcCAqbG9vcCA9IChHTWFpbkxvb3AgKikgdXNlcl9kYXRhOworCisgIHN3aXRjaCAoR1NUX01FU1NBR0VfVFlQRSAobWVzc2FnZSkpIHsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VSUk9SOnsKKyAgICAgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgICAgIGdjaGFyICpkZWJ1ZyA9IE5VTEw7CisKKyAgICAgIGdfd2FybmluZyAoIkdvdCBFUlJPUiIpOworICAgICAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1lc3NhZ2UsICZlcnIsICZkZWJ1Zyk7CisgICAgICBnX3dhcm5pbmcgKCIlczogJXMiLCBlcnItPm1lc3NhZ2UsIGRlYnVnKTsKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX01FU1NBR0VfV0FSTklORzp7CisgICAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisgICAgICBnY2hhciAqZGVidWcgPSBOVUxMOworCisgICAgICBnX3dhcm5pbmcgKCJHb3QgV0FSTklORyIpOworICAgICAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1lc3NhZ2UsICZlcnIsICZkZWJ1Zyk7CisgICAgICBnX3dhcm5pbmcgKCIlczogJXMiLCBlcnItPm1lc3NhZ2UsIGRlYnVnKTsKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX01FU1NBR0VfRU9TOgorICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworZ2ludAorbWFpbiAoZ2ludCBhcmdjLCBnY2hhciAqKiBhcmd2KQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0RWxlbWVudCAqc2hhcGV3aXBlOworICBHc3RDb250cm9sU291cmNlICpjczsKKyAgR01haW5Mb29wICpsb29wOworICBHc3RCdXMgKmJ1czsKKyAgZ2NoYXIgKnBpcGVsaW5lX3N0cmluZzsKKyAgZ2Zsb2F0IGJvcmRlciA9IDAuMDU7CisKKyAgaWYgKGFyZ2MgPCAyKSB7CisgICAgZ19wcmludCAoIlVzYWdlOiBzaGFwZXdpcGUgbWFzay5wbmcgPGJvcmRlcj5cbiIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGdzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIGlmIChhcmdjID4gMikgeworICAgIGJvcmRlciA9IGF0b2YgKGFyZ3ZbMl0pOworICB9CisKKyAgcGlwZWxpbmVfc3RyaW5nID0KKyAgICAgIGdfc3RyZHVwX3ByaW50ZgorICAgICAgKCJ2aWRlb3Rlc3RzcmMgISB2aWRlby94LXJhdyxmb3JtYXQ9KHN0cmluZylBWVVWLHdpZHRoPTY0MCxoZWlnaHQ9NDgwICEgc2hhcGV3aXBlIG5hbWU9c2hhcGUgYm9yZGVyPSVmICEgdmlkZW9taXhlciBuYW1lPW1peGVyICEgdmlkZW9jb252ZXJ0ICEgYXV0b3ZpZGVvc2luayAgICAgZmlsZXNyYyBsb2NhdGlvbj0lcyAhIHR5cGVmaW5kICEgZGVjb2RlYmluICEgdmlkZW9jb252ZXJ0ICEgdmlkZW9zY2FsZSAhIHF1ZXVlICEgc2hhcGUubWFza19zaW5rICAgIHZpZGVvdGVzdHNyYyBwYXR0ZXJuPXNub3cgISB2aWRlby94LXJhdyxmb3JtYXQ9KHN0cmluZylBWVVWLHdpZHRoPTY0MCxoZWlnaHQ9NDgwICEgcXVldWUgISBtaXhlci4iLAorICAgICAgYm9yZGVyLCBhcmd2WzFdKTsKKworICBwaXBlbGluZSA9IGdzdF9wYXJzZV9sYXVuY2ggKHBpcGVsaW5lX3N0cmluZywgTlVMTCk7CisgIGdfZnJlZSAocGlwZWxpbmVfc3RyaW5nKTsKKworICBpZiAocGlwZWxpbmUgPT0gTlVMTCkgeworICAgIGdfcHJpbnQgKCJGYWlsZWQgdG8gY3JlYXRlIHBpcGVsaW5lXG4iKTsKKyAgICByZXR1cm4gLTI7CisgIH0KKworICBzaGFwZXdpcGUgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJzaGFwZSIpOworCisgIGNzID0gZ3N0X2xmb19jb250cm9sX3NvdXJjZV9uZXcgKCk7CisKKyAgZ3N0X29iamVjdF9hZGRfY29udHJvbF9iaW5kaW5nIChHU1RfT0JKRUNUX0NBU1QgKHNoYXBld2lwZSksCisgICAgICBnc3RfZGlyZWN0X2NvbnRyb2xfYmluZGluZ19uZXcgKEdTVF9PQkpFQ1RfQ0FTVCAoc2hhcGV3aXBlKSwgInBvc2l0aW9uIiwKKyAgICAgICAgICBjcykpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaGFwZXdpcGUpOworCisgIGdfb2JqZWN0X3NldCAoY3MsCisgICAgICAiYW1wbGl0dWRlIiwgMC41LAorICAgICAgIm9mZnNldCIsIDAuNSwgImZyZXF1ZW5jeSIsIDAuMjUsICJ0aW1lc2hpZnQiLCA1MDAgKiBHU1RfTVNFQ09ORCwgTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGNzKTsKKworICBsb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisKKyAgYnVzID0gZ3N0X3BpcGVsaW5lX2dldF9idXMgKEdTVF9QSVBFTElORSAocGlwZWxpbmUpKTsKKyAgZ3N0X2J1c19hZGRfc2lnbmFsX3dhdGNoIChidXMpOworICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAoYnVzKSwgIm1lc3NhZ2UiLCBHX0NBTExCQUNLIChvbl9tZXNzYWdlKSwgbG9vcCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1QgKGJ1cykpOworCisgIGlmIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpIHsKKyAgICBnX2Vycm9yICgiRmFpbGVkIHRvIGdvIGludG8gUExBWUlORyBzdGF0ZSIpOworICAgIHJldHVybiAtNDsKKyAgfQorCisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworCisgIGdfbWFpbl9sb29wX3VucmVmIChsb29wKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChHX09CSkVDVCAocGlwZWxpbmUpKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3NwZWN0cnVtLy5naXRpZ25vcmUgYi90ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNWEzY2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMyBAQAorZGVtby1hdWRpb3Rlc3QKK2RlbW8tb3Nzc3JjCitzcGVjdHJ1bS1leGFtcGxlCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9NYWtlZmlsZS5hbSBiL3Rlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZWQ1ZWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE4IEBACitpZiBIQVZFX0dUSworbm9pbnN0X1BST0dSQU1TID0gZGVtby1vc3NzcmMgZGVtby1hdWRpb3Rlc3Qgc3BlY3RydW0tZXhhbXBsZQorZW5kaWYKKworZGVtb19vc3NzcmNfU09VUkNFUyA9IGRlbW8tb3Nzc3JjLmMKK2RlbW9fb3Nzc3JjX0NGTEFHUyAgPSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKEdUS19DRkxBR1MpCitkZW1vX29zc3NyY19MREFERCA9ICQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykgJChHVEtfTElCUykKKworZGVtb19hdWRpb3Rlc3RfU09VUkNFUyA9IGRlbW8tYXVkaW90ZXN0LmMKK2RlbW9fYXVkaW90ZXN0X0NGTEFHUyAgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisgICAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKEdUS19DRkxBR1MpCitkZW1vX2F1ZGlvdGVzdF9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGZmdC0kKEdTVF9BUElfVkVSU0lPTikgXAorICAgJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKEdUS19MSUJTKQorCitzcGVjdHJ1bV9leGFtcGxlX1NPVVJDRVMgPSBzcGVjdHJ1bS1leGFtcGxlLmMKK3NwZWN0cnVtX2V4YW1wbGVfQ0ZMQUdTICA9ICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpICQoR1RLX0NGTEFHUykKK3NwZWN0cnVtX2V4YW1wbGVfTERBREQgPSAkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoR1RLX0xJQlMpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tYXVkaW90ZXN0LmMgYi90ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYTkwYzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jCkBAIC0wLDAgKzEsMjgzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qIFRPRE86IGFkZCB3YXZlIHNlbGVjdGlvbiAqLworLyogZmFzdCB2cy4gc2xvdyBtb2RlIC0gc2VlIHVwZGF0ZV9zcGVjdHJ1bV9iYW5kcygpCisgKiB3ZSBhcmUgc3RpbGwgY2hlYXRpbmcgYmVsb3csIHdlIG9ubHkgZHJhdyB0aGUgZmlyc3Qgc3BlY3RfYmFuZHMgYW5kIGlnbm9yZSBhIGZldyA6LworICoKKyAqIHh0aW1lIGdzdC1sYXVuY2gtMC4xMCAtcSBhdWRpb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9MTAwMDAgISBzcGVjdHJ1bSBiYW5kcz0xNDQxICEgZmFrZXNpbmsKKyAqIDIuMjl1IDAuMDJzIDIuMTRyIDI1NTA0a0IgZ3N0LWxhdW5jaC0wLjEwIC1xIGF1ZGlvdGVzdHNyYyBudW0tYnVmZmVycz0xMDAwMCAhIHNwZWN0cnVtIGJhbmRzPTE0NDEgISBmYWtlc2luaworICogMi4yMHUgMC4wNXMgMi4xMHIgMjU2NjRrQiBnc3QtbGF1bmNoLTAuMTAgLXEgYXVkaW90ZXN0c3JjIG51bS1idWZmZXJzPTEwMDAwICEgc3BlY3RydW0gYmFuZHM9MTQ0MSAhIGZha2VzaW5rCisgKiAyLjIzdSAwLjA0cyAyLjEwciAyNTY2NGtCIGdzdC1sYXVuY2gtMC4xMCAtcSBhdWRpb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9MTAwMDAgISBzcGVjdHJ1bSBiYW5kcz0xNDQxICEgZmFrZXNpbmsKKyAqIAorICogeHRpbWUgZ3N0LWxhdW5jaC0wLjEwIC1xIGF1ZGlvdGVzdHNyYyBudW0tYnVmZmVycz0xMDAwMCAhIHNwZWN0cnVtIGJhbmRzPTE0NDAgISBmYWtlc2luaworICogMjUuMDF1IDAuMDhzIDI1LjAwciAyNTU1MmtCIGdzdC1sYXVuY2gtMC4xMCAtcSBhdWRpb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9MTAwMDAgISBzcGVjdHJ1bSBiYW5kcz0xNDQwICEgZmFrZXNpbmsKKyAqIDI0Ljk2dSAwLjAzcyAyNC44OHIgMjU1NjhrQiBnc3QtbGF1bmNoLTAuMTAgLXEgYXVkaW90ZXN0c3JjIG51bS1idWZmZXJzPTEwMDAwICEgc3BlY3RydW0gYmFuZHM9MTQ0MCAhIGZha2VzaW5rCisgKiAyNS4xMXUgMC4wM3MgMjUuMDNyIDI1NTM2a0IgZ3N0LWxhdW5jaC0wLjEwIC1xIGF1ZGlvdGVzdHNyYyBudW0tYnVmZmVycz0xMDAwMCAhIHNwZWN0cnVtIGJhbmRzPTE0NDAgISBmYWtlc2luaworICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworLyogVE9ETzogV2UgdXNlIGdka19jYWlyb19jcmVhdGUoKSBhbmQgb3RoZXJzLCB3aGljaCBhcmUgZGVwcmVjYXRlZCAqLworI2RlZmluZSBHREtfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9mZnQvZ3N0ZmZ0Lmg+CisjaW5jbHVkZSA8Z3RrL2d0ay5oPgorCisjaWZuZGVmIERFRkFVTFRfQVVESU9TSU5LCisjZGVmaW5lIERFRkFVTFRfQVVESU9TSU5LICJhdXRvYXVkaW9zaW5rIgorI2VuZGlmCisKK3N0YXRpYyBndWludCBzcGVjdF9oZWlnaHQgPSA2NDsKK3N0YXRpYyBndWludCBzcGVjdF9iYW5kcyA9IDI1NjsKK3N0YXRpYyBnZmxvYXQgaGVpZ2h0X3NjYWxlID0gMS4wOworc3RhdGljIGdib29sZWFuIGZhc3QgPSBGQUxTRTsKKworc3RhdGljIEd0a1dpZGdldCAqZHJhd2luZ2FyZWEgPSBOVUxMOworc3RhdGljIEd0a1dpZGdldCAqYmFuZHNfdXNlZCA9IE5VTEw7CitzdGF0aWMgR3N0Q2xvY2sgKnN5bmNfY2xvY2sgPSBOVUxMOworCitzdGF0aWMgdm9pZAorb25fd2luZG93X2Rlc3Ryb3kgKEdPYmplY3QgKiBvYmplY3QsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZHJhd2luZ2FyZWEgPSBOVUxMOworICBndGtfbWFpbl9xdWl0ICgpOworfQorCisvKiBjb250cm9sIGF1ZGlvdGVzdHNyYyBmcmVxdWVuY3kgKi8KK3N0YXRpYyB2b2lkCitvbl9mcmVxdWVuY3lfY2hhbmdlZCAoR3RrUmFuZ2UgKiByYW5nZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RFbGVtZW50ICptYWNoaW5lID0gR1NUX0VMRU1FTlQgKHVzZXJfZGF0YSk7CisgIGdkb3VibGUgdmFsdWUgPSBndGtfcmFuZ2VfZ2V0X3ZhbHVlIChyYW5nZSk7CisKKyAgZ19vYmplY3Rfc2V0IChtYWNoaW5lLCAiZnJlcSIsIHZhbHVlLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK3VwZGF0ZV9zcGVjdHJ1bV9iYW5kcyAoR3N0RWxlbWVudCAqIHNwZWN0cnVtKQoreworICBndWludCBiYW5kcyA9IHNwZWN0X2JhbmRzOworICBnY2hhciBzdHJbNTBdOworCisgIGlmIChmYXN0KQorICAgIGJhbmRzID0gKChnc3RfZmZ0X25leHRfZmFzdF9sZW5ndGggKDIgKiBiYW5kcyAtIDIpICsgMikgLyAyKTsKKworICBzcHJpbnRmIChzdHIsICJ1c2luZyAldSBiYW5kcyIsIGJhbmRzKTsKKworICBnX29iamVjdF9zZXQgKGJhbmRzX3VzZWQsICJsYWJlbCIsIHN0ciwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHNwZWN0cnVtKSwgImJhbmRzIiwgYmFuZHMsIE5VTEwpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK29uX2NvbmZpZ3VyZV9ldmVudCAoR3RrV2lkZ2V0ICogd2lkZ2V0LCBHZGtFdmVudENvbmZpZ3VyZSAqIGV2ZW50LAorICAgIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgLypHU1RfSU5GTyAoIiVkIHggJWQiLCBldmVudC0+d2lkdGgsIGV2ZW50LT5oZWlnaHQpOyAqLworICBzcGVjdF9oZWlnaHQgPSBldmVudC0+aGVpZ2h0OworICBoZWlnaHRfc2NhbGUgPSBldmVudC0+aGVpZ2h0IC8gNjQuMDsKKyAgc3BlY3RfYmFuZHMgPSBldmVudC0+d2lkdGg7CisKKyAgdXBkYXRlX3NwZWN0cnVtX2JhbmRzIChHU1RfRUxFTUVOVCAodXNlcl9kYXRhKSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK29uX2Zhc3Rfc2xvd19tb2RlX2NoYW5nZWQgKEd0a1RvZ2dsZUJ1dHRvbiAqIHRvZ2dsZWJ1dHRvbiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBmYXN0ID0gZ3RrX3RvZ2dsZV9idXR0b25fZ2V0X2FjdGl2ZSAodG9nZ2xlYnV0dG9uKTsKKyAgdXBkYXRlX3NwZWN0cnVtX2JhbmRzIChHU1RfRUxFTUVOVCAodXNlcl9kYXRhKSk7Cit9CisKKy8qIGRyYXcgZnJlcXVlbmN5IHNwZWN0cnVtIGFzIGEgYnVuY2ggb2YgYmFycyAqLworc3RhdGljIHZvaWQKK2RyYXdfc3BlY3RydW0gKGdmbG9hdCAqIGRhdGEpCit7CisgIGdpbnQgaTsKKyAgR2RrUmVjdGFuZ2xlIHJlY3QgPSB7IDAsIDAsIHNwZWN0X2JhbmRzLCBzcGVjdF9oZWlnaHQgfTsKKyAgY2Fpcm9fdCAqY3I7CisKKyAgaWYgKCFkcmF3aW5nYXJlYSkKKyAgICByZXR1cm47CisKKyAgZ2RrX3dpbmRvd19iZWdpbl9wYWludF9yZWN0IChndGtfd2lkZ2V0X2dldF93aW5kb3cgKGRyYXdpbmdhcmVhKSwgJnJlY3QpOworICBjciA9IGdka19jYWlyb19jcmVhdGUgKGd0a193aWRnZXRfZ2V0X3dpbmRvdyAoZHJhd2luZ2FyZWEpKTsKKworICBjYWlyb19zZXRfc291cmNlX3JnYiAoY3IsIDAsIDAsIDApOworICBjYWlyb19yZWN0YW5nbGUgKGNyLCAwLCAwLCBzcGVjdF9iYW5kcywgc3BlY3RfaGVpZ2h0KTsKKyAgY2Fpcm9fZmlsbCAoY3IpOworICBjYWlyb19zZXRfc291cmNlX3JnYiAoY3IsIDEsIDEsIDEpOworICBmb3IgKGkgPSAwOyBpIDwgc3BlY3RfYmFuZHM7IGkrKykgeworICAgIGNhaXJvX3JlY3RhbmdsZSAoY3IsIGksIC1kYXRhW2ldLCAxLCBzcGVjdF9oZWlnaHQgKyBkYXRhW2ldKTsKKyAgICBjYWlyb19maWxsIChjcik7CisgIH0KKyAgY2Fpcm9fZGVzdHJveSAoY3IpOworCisgIGdka193aW5kb3dfZW5kX3BhaW50IChndGtfd2lkZ2V0X2dldF93aW5kb3cgKGRyYXdpbmdhcmVhKSk7Cit9CisKKy8qIHByb2Nlc3MgZGVsYXllZCBtZXNzYWdlICovCitzdGF0aWMgZ2Jvb2xlYW4KK2RlbGF5ZWRfaWRsZV9zcGVjdHJ1bV91cGRhdGUgKGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZHJhd19zcGVjdHJ1bSAoKGdmbG9hdCAqKSB1c2VyX2RhdGEpOworICBnX2ZyZWUgKHVzZXJfZGF0YSk7CisgIHJldHVybiAoRkFMU0UpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2RlbGF5ZWRfc3BlY3RydW1fdXBkYXRlIChHc3RDbG9jayAqIHN5bmNfY2xvY2ssIEdzdENsb2NrVGltZSB0aW1lLAorICAgIEdzdENsb2NrSUQgaWQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEICh0aW1lKSkKKyAgICBnX2lkbGVfYWRkIChkZWxheWVkX2lkbGVfc3BlY3RydW1fdXBkYXRlLCB1c2VyX2RhdGEpOworICBlbHNlCisgICAgZ19mcmVlICh1c2VyX2RhdGEpOworICByZXR1cm4gKFRSVUUpOworfQorCisvKiByZWNlaXZlIHNwZWN0cmFsIGRhdGEgZnJvbSBlbGVtZW50IG1lc3NhZ2UgKi8KK3N0YXRpYyBnYm9vbGVhbgorbWVzc2FnZV9oYW5kbGVyIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBncG9pbnRlciBkYXRhKQoreworICBpZiAobWVzc2FnZS0+dHlwZSA9PSBHU1RfTUVTU0FHRV9FTEVNRU5UKSB7CisgICAgY29uc3QgR3N0U3RydWN0dXJlICpzID0gZ3N0X21lc3NhZ2VfZ2V0X3N0cnVjdHVyZSAobWVzc2FnZSk7CisgICAgY29uc3QgZ2NoYXIgKm5hbWUgPSBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzKTsKKworICAgIGlmIChzdHJjbXAgKG5hbWUsICJzcGVjdHJ1bSIpID09IDApIHsKKyAgICAgIEdzdEVsZW1lbnQgKnNwZWN0cnVtID0gR1NUX0VMRU1FTlQgKEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSkpOworICAgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCwgZHVyYXRpb247CisgICAgICBHc3RDbG9ja1RpbWUgd2FpdHRpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfY2xvY2tfdGltZSAocywgInJ1bm5pbmctdGltZSIsICZ0aW1lc3RhbXApICYmCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfY2xvY2tfdGltZSAocywgImR1cmF0aW9uIiwgJmR1cmF0aW9uKSkgeworICAgICAgICAvKiB3YWl0IGZvciBtaWRkbGUgb2YgYnVmZmVyICovCisgICAgICAgIHdhaXR0aW1lID0gdGltZXN0YW1wICsgZHVyYXRpb24gLyAyOworICAgICAgfSBlbHNlIGlmIChnc3Rfc3RydWN0dXJlX2dldF9jbG9ja190aW1lIChzLCAiZW5kdGltZSIsICZ0aW1lc3RhbXApKSB7CisgICAgICAgIHdhaXR0aW1lID0gdGltZXN0YW1wOworICAgICAgfQorICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEICh3YWl0dGltZSkpIHsKKyAgICAgICAgR3N0Q2xvY2tJRCBjbG9ja19pZDsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIGJhc2V0aW1lID0gZ3N0X2VsZW1lbnRfZ2V0X2Jhc2VfdGltZSAoc3BlY3RydW0pOworICAgICAgICBnZmxvYXQgKnNwZWN0ID0gZ19uZXcgKGdmbG9hdCwgc3BlY3RfYmFuZHMpOworICAgICAgICBjb25zdCBHVmFsdWUgKmxpc3Q7CisgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWU7CisgICAgICAgIGd1aW50IGk7CisKKyAgICAgICAgbGlzdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAibWFnbml0dWRlIik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcGVjdF9iYW5kczsgKytpKSB7CisgICAgICAgICAgdmFsdWUgPSBnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUgKGxpc3QsIGkpOworICAgICAgICAgIHNwZWN0W2ldID0gaGVpZ2h0X3NjYWxlICogZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGNsb2NrX2lkID0KKyAgICAgICAgICAgIGdzdF9jbG9ja19uZXdfc2luZ2xlX3Nob3RfaWQgKHN5bmNfY2xvY2ssIHdhaXR0aW1lICsgYmFzZXRpbWUpOworICAgICAgICBnc3RfY2xvY2tfaWRfd2FpdF9hc3luYyAoY2xvY2tfaWQsIGRlbGF5ZWRfc3BlY3RydW1fdXBkYXRlLAorICAgICAgICAgICAgKGdwb2ludGVyKSBzcGVjdCwgTlVMTCk7CisgICAgICAgIGdzdF9jbG9ja19pZF91bnJlZiAoY2xvY2tfaWQpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBHc3RFbGVtZW50ICpiaW47CisgIEdzdEVsZW1lbnQgKnNyYywgKnNwZWN0cnVtLCAqYXVkaW9jb252ZXJ0LCAqc2luazsKKyAgR3N0QnVzICpidXM7CisgIEd0a1dpZGdldCAqYXBwd2luZG93LCAqdmJveCwgKmhib3gsICp3aWRnZXQ7CisKKyAgZ3N0X2luaXQgKCZhcmdjLCAmYXJndik7CisgIGd0a19pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIGJpbiA9IGdzdF9waXBlbGluZV9uZXcgKCJiaW4iKTsKKworICBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb3Rlc3RzcmMiLCAic3JjIik7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHNyYyksICJ3YXZlIiwgMCwgTlVMTCk7CisKKyAgc3BlY3RydW0gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJzcGVjdHJ1bSIsICJzcGVjdHJ1bSIpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzcGVjdHJ1bSksICJiYW5kcyIsIHNwZWN0X2JhbmRzLCAidGhyZXNob2xkIiwgLTgwLAorICAgICAgInBvc3QtbWVzc2FnZXMiLCBUUlVFLCBOVUxMKTsKKworICBhdWRpb2NvbnZlcnQgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb2NvbnZlcnQiLCAiYXVkaW9jb252ZXJ0Iik7CisKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoREVGQVVMVF9BVURJT1NJTkssICJzaW5rIik7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAoYmluKSwgc3JjLCBzcGVjdHJ1bSwgYXVkaW9jb252ZXJ0LCBzaW5rLCBOVUxMKTsKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rX21hbnkgKHNyYywgc3BlY3RydW0sIGF1ZGlvY29udmVydCwgc2luaywgTlVMTCkpIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJjYW4ndCBsaW5rIGVsZW1lbnRzXG4iKTsKKyAgICBleGl0ICgxKTsKKyAgfQorCisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKGJpbik7CisgIGdzdF9idXNfYWRkX3dhdGNoIChidXMsIG1lc3NhZ2VfaGFuZGxlciwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgc3luY19jbG9jayA9IGdzdF9waXBlbGluZV9nZXRfY2xvY2sgKEdTVF9QSVBFTElORSAoYmluKSk7CisKKyAgYXBwd2luZG93ID0gZ3RrX3dpbmRvd19uZXcgKEdUS19XSU5ET1dfVE9QTEVWRUwpOworICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAoYXBwd2luZG93KSwgImRlc3Ryb3kiLAorICAgICAgR19DQUxMQkFDSyAob25fd2luZG93X2Rlc3Ryb3kpLCBOVUxMKTsKKyAgdmJveCA9IGd0a19ib3hfbmV3IChHVEtfT1JJRU5UQVRJT05fVkVSVElDQUwsIDYpOworCisgIGhib3ggPSBndGtfYm94X25ldyAoR1RLX09SSUVOVEFUSU9OX0hPUklaT05UQUwsIDYpOworICB3aWRnZXQgPSBndGtfY2hlY2tfYnV0dG9uX25ld193aXRoX2xhYmVsICgiRmFzdCIpOworICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAod2lkZ2V0KSwgInRvZ2dsZWQiLAorICAgICAgR19DQUxMQkFDSyAob25fZmFzdF9zbG93X21vZGVfY2hhbmdlZCksIChncG9pbnRlcikgc3BlY3RydW0pOworICBndGtfYm94X3BhY2tfc3RhcnQgKEdUS19CT1ggKGhib3gpLCB3aWRnZXQsIEZBTFNFLCBGQUxTRSwgMCk7CisgIGJhbmRzX3VzZWQgPSBndGtfbGFiZWxfbmV3ICgiIik7CisgIGd0a19ib3hfcGFja19zdGFydCAoR1RLX0JPWCAoaGJveCksIGJhbmRzX3VzZWQsIEZBTFNFLCBGQUxTRSwgMCk7CisKKyAgZ3RrX2JveF9wYWNrX3N0YXJ0IChHVEtfQk9YICh2Ym94KSwgaGJveCwgRkFMU0UsIEZBTFNFLCAwKTsKKworICB3aWRnZXQgPSBndGtfc2NhbGVfbmV3X3dpdGhfcmFuZ2UgKEdUS19PUklFTlRBVElPTl9IT1JJWk9OVEFMLAorICAgICAgNTAuMCwgMjAwMDAuMCwgMTApOworICBndGtfc2NhbGVfc2V0X2RyYXdfdmFsdWUgKEdUS19TQ0FMRSAod2lkZ2V0KSwgVFJVRSk7CisgIGd0a19zY2FsZV9zZXRfdmFsdWVfcG9zIChHVEtfU0NBTEUgKHdpZGdldCksIEdUS19QT1NfVE9QKTsKKyAgZ3RrX3JhbmdlX3NldF92YWx1ZSAoR1RLX1JBTkdFICh3aWRnZXQpLCA0NDAuMCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUICh3aWRnZXQpLCAidmFsdWUtY2hhbmdlZCIsCisgICAgICBHX0NBTExCQUNLIChvbl9mcmVxdWVuY3lfY2hhbmdlZCksIChncG9pbnRlcikgc3JjKTsKKyAgZ3RrX2JveF9wYWNrX3N0YXJ0IChHVEtfQk9YICh2Ym94KSwgd2lkZ2V0LCBGQUxTRSwgRkFMU0UsIDApOworCisgIGRyYXdpbmdhcmVhID0gZ3RrX2RyYXdpbmdfYXJlYV9uZXcgKCk7CisgIGd0a193aWRnZXRfc2V0X3NpemVfcmVxdWVzdCAoZHJhd2luZ2FyZWEsIHNwZWN0X2JhbmRzLCBzcGVjdF9oZWlnaHQpOworICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAoZHJhd2luZ2FyZWEpLCAiY29uZmlndXJlLWV2ZW50IiwKKyAgICAgIEdfQ0FMTEJBQ0sgKG9uX2NvbmZpZ3VyZV9ldmVudCksIChncG9pbnRlcikgc3BlY3RydW0pOworICBndGtfYm94X3BhY2tfc3RhcnQgKEdUS19CT1ggKHZib3gpLCBkcmF3aW5nYXJlYSwgVFJVRSwgVFJVRSwgMCk7CisKKyAgZ3RrX2NvbnRhaW5lcl9hZGQgKEdUS19DT05UQUlORVIgKGFwcHdpbmRvdyksIHZib3gpOworICBndGtfd2lkZ2V0X3Nob3dfYWxsIChhcHB3aW5kb3cpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGd0a19tYWluICgpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHN5bmNfY2xvY2spOworICBnc3Rfb2JqZWN0X3VucmVmIChiaW4pOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1vc3NzcmMuYyBiL3Rlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tb3Nzc3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1YjE5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tb3Nzc3JjLmMKQEAgLTAsMCArMSwyMTEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA2IFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKy8qIFRPRE86IFdlIHVzZSBnZGtfY2Fpcm9fY3JlYXRlKCkgYW5kIG90aGVycywgd2hpY2ggYXJlIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgR0RLX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxndGsvZ3RrLmg+CisKKyNpZm5kZWYgREVGQVVMVF9BVURJT1NSQworI2RlZmluZSBERUZBVUxUX0FVRElPU1JDICJhbHNhc3JjIgorI2VuZGlmCisKK3N0YXRpYyBndWludCBzcGVjdF9oZWlnaHQgPSA2NDsKK3N0YXRpYyBndWludCBzcGVjdF9iYW5kcyA9IDI1NjsKK3N0YXRpYyBnZmxvYXQgaGVpZ2h0X3NjYWxlID0gMS4wOworCitzdGF0aWMgR3RrV2lkZ2V0ICpkcmF3aW5nYXJlYSA9IE5VTEw7CitzdGF0aWMgR3N0Q2xvY2sgKnN5bmNfY2xvY2sgPSBOVUxMOworCitzdGF0aWMgdm9pZAorb25fd2luZG93X2Rlc3Ryb3kgKEdPYmplY3QgKiBvYmplY3QsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZHJhd2luZ2FyZWEgPSBOVUxMOworICBndGtfbWFpbl9xdWl0ICgpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK29uX2NvbmZpZ3VyZV9ldmVudCAoR3RrV2lkZ2V0ICogd2lkZ2V0LCBHZGtFdmVudENvbmZpZ3VyZSAqIGV2ZW50LAorICAgIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0RWxlbWVudCAqc3BlY3RydW0gPSBHU1RfRUxFTUVOVCAodXNlcl9kYXRhKTsKKworICAvKkdTVF9JTkZPICgiJWQgeCAlZCIsIGV2ZW50LT53aWR0aCwgZXZlbnQtPmhlaWdodCk7ICovCisgIHNwZWN0X2hlaWdodCA9IGV2ZW50LT5oZWlnaHQ7CisgIGhlaWdodF9zY2FsZSA9IGV2ZW50LT5oZWlnaHQgLyA2NC4wOworICBzcGVjdF9iYW5kcyA9IGV2ZW50LT53aWR0aDsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzcGVjdHJ1bSksICJiYW5kcyIsIHNwZWN0X2JhbmRzLCBOVUxMKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiBkcmF3IGZyZXF1ZW5jeSBzcGVjdHJ1bSBhcyBhIGJ1bmNoIG9mIGJhcnMgKi8KK3N0YXRpYyB2b2lkCitkcmF3X3NwZWN0cnVtIChnZmxvYXQgKiBkYXRhKQoreworICBnaW50IGk7CisgIEdka1JlY3RhbmdsZSByZWN0ID0geyAwLCAwLCBzcGVjdF9iYW5kcywgc3BlY3RfaGVpZ2h0IH07CisgIGNhaXJvX3QgKmNyOworCisgIGlmICghZHJhd2luZ2FyZWEpCisgICAgcmV0dXJuOworCisgIGdka193aW5kb3dfYmVnaW5fcGFpbnRfcmVjdCAoZ3RrX3dpZGdldF9nZXRfd2luZG93IChkcmF3aW5nYXJlYSksICZyZWN0KTsKKyAgY3IgPSBnZGtfY2Fpcm9fY3JlYXRlIChndGtfd2lkZ2V0X2dldF93aW5kb3cgKGRyYXdpbmdhcmVhKSk7CisKKyAgY2Fpcm9fc2V0X3NvdXJjZV9yZ2IgKGNyLCAwLCAwLCAwKTsKKyAgY2Fpcm9fcmVjdGFuZ2xlIChjciwgMCwgMCwgc3BlY3RfYmFuZHMsIHNwZWN0X2hlaWdodCk7CisgIGNhaXJvX2ZpbGwgKGNyKTsKKyAgY2Fpcm9fc2V0X3NvdXJjZV9yZ2IgKGNyLCAxLCAxLCAxKTsKKyAgZm9yIChpID0gMDsgaSA8IHNwZWN0X2JhbmRzOyBpKyspIHsKKyAgICBjYWlyb19yZWN0YW5nbGUgKGNyLCBpLCAtZGF0YVtpXSwgMSwgc3BlY3RfaGVpZ2h0ICsgZGF0YVtpXSk7CisgICAgY2Fpcm9fZmlsbCAoY3IpOworICB9CisgIGNhaXJvX2Rlc3Ryb3kgKGNyKTsKKworICBnZGtfd2luZG93X2VuZF9wYWludCAoZ3RrX3dpZGdldF9nZXRfd2luZG93IChkcmF3aW5nYXJlYSkpOworfQorCisvKiBwcm9jZXNzIGRlbGF5ZWQgbWVzc2FnZSAqLworc3RhdGljIGdib29sZWFuCitkZWxheWVkX2lkbGVfc3BlY3RydW1fdXBkYXRlIChncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGRyYXdfc3BlY3RydW0gKChnZmxvYXQgKikgdXNlcl9kYXRhKTsKKyAgZ19mcmVlICh1c2VyX2RhdGEpOworICByZXR1cm4gKEZBTFNFKTsKK30KKworc3RhdGljIGdib29sZWFuCitkZWxheWVkX3NwZWN0cnVtX3VwZGF0ZSAoR3N0Q2xvY2sgKiBzeW5jX2Nsb2NrLCBHc3RDbG9ja1RpbWUgdGltZSwKKyAgICBHc3RDbG9ja0lEIGlkLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAodGltZSkpCisgICAgZ19pZGxlX2FkZCAoZGVsYXllZF9pZGxlX3NwZWN0cnVtX3VwZGF0ZSwgdXNlcl9kYXRhKTsKKyAgZWxzZQorICAgIGdfZnJlZSAodXNlcl9kYXRhKTsKKyAgcmV0dXJuIChUUlVFKTsKK30KKworLyogcmVjZWl2ZSBzcGVjdHJhbCBkYXRhIGZyb20gZWxlbWVudCBtZXNzYWdlICovCitzdGF0aWMgZ2Jvb2xlYW4KK21lc3NhZ2VfaGFuZGxlciAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgaWYgKG1lc3NhZ2UtPnR5cGUgPT0gR1NUX01FU1NBR0VfRUxFTUVOVCkgeworICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9tZXNzYWdlX2dldF9zdHJ1Y3R1cmUgKG1lc3NhZ2UpOworICAgIGNvbnN0IGdjaGFyICpuYW1lID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyk7CisKKyAgICBpZiAoc3RyY21wIChuYW1lLCAic3BlY3RydW0iKSA9PSAwKSB7CisgICAgICBHc3RFbGVtZW50ICpzcGVjdHJ1bSA9IEdTVF9FTEVNRU5UIChHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpKTsKKyAgICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIGR1cmF0aW9uOworICAgICAgR3N0Q2xvY2tUaW1lIHdhaXR0aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2Nsb2NrX3RpbWUgKHMsICJydW5uaW5nLXRpbWUiLCAmdGltZXN0YW1wKSAmJgorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2Nsb2NrX3RpbWUgKHMsICJkdXJhdGlvbiIsICZkdXJhdGlvbikpIHsKKyAgICAgICAgLyogd2FpdCBmb3IgbWlkZGxlIG9mIGJ1ZmZlciAqLworICAgICAgICB3YWl0dGltZSA9IHRpbWVzdGFtcCArIGR1cmF0aW9uIC8gMjsKKyAgICAgIH0gZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfY2xvY2tfdGltZSAocywgImVuZHRpbWUiLCAmdGltZXN0YW1wKSkgeworICAgICAgICB3YWl0dGltZSA9IHRpbWVzdGFtcDsKKyAgICAgIH0KKyAgICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAod2FpdHRpbWUpKSB7CisgICAgICAgIEdzdENsb2NrSUQgY2xvY2tfaWQ7CisgICAgICAgIEdzdENsb2NrVGltZSBiYXNldGltZSA9IGdzdF9lbGVtZW50X2dldF9iYXNlX3RpbWUgKHNwZWN0cnVtKTsKKyAgICAgICAgZ2Zsb2F0ICpzcGVjdCA9IGdfbmV3IChnZmxvYXQsIHNwZWN0X2JhbmRzKTsKKyAgICAgICAgY29uc3QgR1ZhbHVlICpsaXN0OworICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlOworICAgICAgICBndWludCBpOworCisgICAgICAgIGxpc3QgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgIm1hZ25pdHVkZSIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3BlY3RfYmFuZHM7ICsraSkgeworICAgICAgICAgIHZhbHVlID0gZ3N0X3ZhbHVlX2xpc3RfZ2V0X3ZhbHVlIChsaXN0LCBpKTsKKyAgICAgICAgICBzcGVjdFtpXSA9IGhlaWdodF9zY2FsZSAqIGdfdmFsdWVfZ2V0X2Zsb2F0ICh2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBjbG9ja19pZCA9CisgICAgICAgICAgICBnc3RfY2xvY2tfbmV3X3NpbmdsZV9zaG90X2lkIChzeW5jX2Nsb2NrLCB3YWl0dGltZSArIGJhc2V0aW1lKTsKKyAgICAgICAgZ3N0X2Nsb2NrX2lkX3dhaXRfYXN5bmMgKGNsb2NrX2lkLCBkZWxheWVkX3NwZWN0cnVtX3VwZGF0ZSwKKyAgICAgICAgICAgIChncG9pbnRlcikgc3BlY3QsIE5VTEwpOworICAgICAgICBnc3RfY2xvY2tfaWRfdW5yZWYgKGNsb2NrX2lkKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgR3N0RWxlbWVudCAqYmluOworICBHc3RFbGVtZW50ICpzcmMsICpzcGVjdHJ1bSwgKnNpbms7CisgIEdzdEJ1cyAqYnVzOworICBHdGtXaWRnZXQgKmFwcHdpbmRvdzsKKworICBnc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKyAgZ3RrX2luaXQgKCZhcmdjLCAmYXJndik7CisKKyAgYmluID0gZ3N0X3BpcGVsaW5lX25ldyAoImJpbiIpOworCisgIHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoREVGQVVMVF9BVURJT1NSQywgInNyYyIpOworCisgIHNwZWN0cnVtID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgic3BlY3RydW0iLCAic3BlY3RydW0iKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc3BlY3RydW0pLCAiYmFuZHMiLCBzcGVjdF9iYW5kcywgInRocmVzaG9sZCIsIC04MCwKKyAgICAgICJwb3N0LW1lc3NhZ2VzIiwgVFJVRSwgTlVMTCk7CisKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgInNpbmsiKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChiaW4pLCBzcmMsIHNwZWN0cnVtLCBzaW5rLCBOVUxMKTsKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rX21hbnkgKHNyYywgc3BlY3RydW0sIHNpbmssIE5VTEwpKSB7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiY2FuJ3QgbGluayBlbGVtZW50c1xuIik7CisgICAgZXhpdCAoMSk7CisgIH0KKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChiaW4pOworICBnc3RfYnVzX2FkZF93YXRjaCAoYnVzLCBtZXNzYWdlX2hhbmRsZXIsIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIHN5bmNfY2xvY2sgPSBnc3RfcGlwZWxpbmVfZ2V0X2Nsb2NrIChHU1RfUElQRUxJTkUgKGJpbikpOworCisgIGFwcHdpbmRvdyA9IGd0a193aW5kb3dfbmV3IChHVEtfV0lORE9XX1RPUExFVkVMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoR19PQkpFQ1QgKGFwcHdpbmRvdyksICJkZXN0cm95IiwKKyAgICAgIEdfQ0FMTEJBQ0sgKG9uX3dpbmRvd19kZXN0cm95KSwgTlVMTCk7CisKKyAgZHJhd2luZ2FyZWEgPSBndGtfZHJhd2luZ19hcmVhX25ldyAoKTsKKyAgZ3RrX3dpZGdldF9zZXRfc2l6ZV9yZXF1ZXN0IChkcmF3aW5nYXJlYSwgc3BlY3RfYmFuZHMsIHNwZWN0X2hlaWdodCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChkcmF3aW5nYXJlYSksICJjb25maWd1cmUtZXZlbnQiLAorICAgICAgR19DQUxMQkFDSyAob25fY29uZmlndXJlX2V2ZW50KSwgKGdwb2ludGVyKSBzcGVjdHJ1bSk7CisgIGd0a19jb250YWluZXJfYWRkIChHVEtfQ09OVEFJTkVSIChhcHB3aW5kb3cpLCBkcmF3aW5nYXJlYSk7CisgIGd0a193aWRnZXRfc2hvd19hbGwgKGFwcHdpbmRvdyk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgZ3RrX21haW4gKCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoc3luY19jbG9jayk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJpbik7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9tZXNvbi5idWlsZCBiL3Rlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZWVjZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDE3IEBACitleGVjdXRhYmxlKCdkZW1vLWF1ZGlvdGVzdCcsICdkZW1vLWF1ZGlvdGVzdC5jJywKKyAgZGVwZW5kZW5jaWVzOiBbZ3N0ZmZ0X2RlcCwgZ3N0X2RlcCwgZ3RrX2RlcF0sCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBpbnN0YWxsOiBmYWxzZSkKKworZXhlY3V0YWJsZSgnZGVtby1vc3NzcmMnLCAnZGVtby1vc3NzcmMuYycsCisgIGRlcGVuZGVuY2llczogW2dzdF9kZXAsIGd0a19kZXBdLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgaW5zdGFsbDogZmFsc2UpCisKK2V4ZWN1dGFibGUoJ3NwZWN0cnVtLWV4YW1wbGUnLCAnc3BlY3RydW0tZXhhbXBsZS5jJywKKyAgZGVwZW5kZW5jaWVzOiBbZ3N0X2RlcCwgZ3RrX2RlcF0sCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBpbnN0YWxsOiBmYWxzZSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL3NwZWN0cnVtLWV4YW1wbGUuYyBiL3Rlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL3NwZWN0cnVtLWV4YW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDUyYjRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vc3BlY3RydW0tZXhhbXBsZS5jCkBAIC0wLDAgKzEsMTI0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSmFuIFNjaG1pZHQgPGphbi5zY2htaWR0QHN1bi5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitzdGF0aWMgZ3VpbnQgc3BlY3RfYmFuZHMgPSAyMDsKKworI2RlZmluZSBBVURJT0ZSRVEgMzIwMDAKKworLyogcmVjZWl2ZSBzcGVjdHJhbCBkYXRhIGZyb20gZWxlbWVudCBtZXNzYWdlICovCitzdGF0aWMgZ2Jvb2xlYW4KK21lc3NhZ2VfaGFuZGxlciAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgaWYgKG1lc3NhZ2UtPnR5cGUgPT0gR1NUX01FU1NBR0VfRUxFTUVOVCkgeworICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9tZXNzYWdlX2dldF9zdHJ1Y3R1cmUgKG1lc3NhZ2UpOworICAgIGNvbnN0IGdjaGFyICpuYW1lID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyk7CisgICAgR3N0Q2xvY2tUaW1lIGVuZHRpbWU7CisKKyAgICBpZiAoc3RyY21wIChuYW1lLCAic3BlY3RydW0iKSA9PSAwKSB7CisgICAgICBjb25zdCBHVmFsdWUgKm1hZ25pdHVkZXM7CisgICAgICBjb25zdCBHVmFsdWUgKnBoYXNlczsKKyAgICAgIGNvbnN0IEdWYWx1ZSAqbWFnLCAqcGhhc2U7CisgICAgICBnZG91YmxlIGZyZXE7CisgICAgICBndWludCBpOworCisgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2Nsb2NrX3RpbWUgKHMsICJlbmR0aW1lIiwgJmVuZHRpbWUpKQorICAgICAgICBlbmR0aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICAgICAgZ19wcmludCAoIk5ldyBzcGVjdHJ1bSBtZXNzYWdlLCBlbmR0aW1lICUiIEdTVF9USU1FX0ZPUk1BVCAiXG4iLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGVuZHRpbWUpKTsKKworICAgICAgbWFnbml0dWRlcyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAibWFnbml0dWRlIik7CisgICAgICBwaGFzZXMgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgInBoYXNlIik7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzcGVjdF9iYW5kczsgKytpKSB7CisgICAgICAgIGZyZXEgPSAoZ2RvdWJsZSkgKChBVURJT0ZSRVEgLyAyKSAqIGkgKyBBVURJT0ZSRVEgLyA0KSAvIHNwZWN0X2JhbmRzOworICAgICAgICBtYWcgPSBnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUgKG1hZ25pdHVkZXMsIGkpOworICAgICAgICBwaGFzZSA9IGdzdF92YWx1ZV9saXN0X2dldF92YWx1ZSAocGhhc2VzLCBpKTsKKworICAgICAgICBpZiAobWFnICE9IE5VTEwgJiYgcGhhc2UgIT0gTlVMTCkgeworICAgICAgICAgIGdfcHJpbnQgKCJiYW5kICVkIChmcmVxICVnKTogbWFnbml0dWRlICVmIGRCIHBoYXNlICVmXG4iLCBpLCBmcmVxLAorICAgICAgICAgICAgICBnX3ZhbHVlX2dldF9mbG9hdCAobWFnKSwgZ192YWx1ZV9nZXRfZmxvYXQgKHBoYXNlKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdfcHJpbnQgKCJcbiIpOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBHc3RFbGVtZW50ICpiaW47CisgIEdzdEVsZW1lbnQgKnNyYywgKmF1ZGlvY29udmVydCwgKnNwZWN0cnVtLCAqc2luazsKKyAgR3N0QnVzICpidXM7CisgIEdzdENhcHMgKmNhcHM7CisgIEdNYWluTG9vcCAqbG9vcDsKKworICBnc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICBiaW4gPSBnc3RfcGlwZWxpbmVfbmV3ICgiYmluIik7CisKKyAgc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW90ZXN0c3JjIiwgInNyYyIpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzcmMpLCAid2F2ZSIsIDAsICJmcmVxIiwgNjAwMC4wLCBOVUxMKTsKKyAgYXVkaW9jb252ZXJ0ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW9jb252ZXJ0IiwgTlVMTCk7CisgIGdfYXNzZXJ0IChhdWRpb2NvbnZlcnQpOworCisgIHNwZWN0cnVtID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgic3BlY3RydW0iLCAic3BlY3RydW0iKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc3BlY3RydW0pLCAiYmFuZHMiLCBzcGVjdF9iYW5kcywgInRocmVzaG9sZCIsIC04MCwKKyAgICAgICJwb3N0LW1lc3NhZ2VzIiwgVFJVRSwgIm1lc3NhZ2UtcGhhc2UiLCBUUlVFLCBOVUxMKTsKKworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAic2luayIpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzaW5rKSwgInN5bmMiLCBUUlVFLCBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChiaW4pLCBzcmMsIGF1ZGlvY29udmVydCwgc3BlY3RydW0sIHNpbmssIE5VTEwpOworCisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLAorICAgICAgInJhdGUiLCBHX1RZUEVfSU5ULCBBVURJT0ZSRVEsIE5VTEwpOworCisgIGlmICghZ3N0X2VsZW1lbnRfbGluayAoc3JjLCBhdWRpb2NvbnZlcnQpIHx8CisgICAgICAhZ3N0X2VsZW1lbnRfbGlua19maWx0ZXJlZCAoYXVkaW9jb252ZXJ0LCBzcGVjdHJ1bSwgY2FwcykgfHwKKyAgICAgICFnc3RfZWxlbWVudF9saW5rIChzcGVjdHJ1bSwgc2luaykpIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJjYW4ndCBsaW5rIGVsZW1lbnRzXG4iKTsKKyAgICBleGl0ICgxKTsKKyAgfQorICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAoYmluKTsKKyAgZ3N0X2J1c19hZGRfd2F0Y2ggKGJ1cywgbWVzc2FnZV9oYW5kbGVyLCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIC8qIHdlIG5lZWQgdG8gcnVuIGEgR0xpYiBtYWluIGxvb3AgdG8gZ2V0IHRoZSBtZXNzYWdlcyAqLworICBsb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9OVUxMKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChiaW4pOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvdjRsMi8uZ2l0aWdub3JlIGIvdGVzdHMvZXhhbXBsZXMvdjRsMi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NGRiZmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy92NGwyLy5naXRpZ25vcmUKQEAgLTAsMCArMSwzIEBACitjYW1jdHJsCitwcm9iZQordjRsMnNyYy1yZW5lZ290aWF0ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvdjRsMi9NYWtlZmlsZS5hbSBiL3Rlc3RzL2V4YW1wbGVzL3Y0bDIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiNDE2NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3Y0bDIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw5IEBACitub2luc3RfUFJPR1JBTVMgPSBjYW1jdHJsIHY0bDJzcmMtcmVuZWdvdGlhdGUKKworY2FtY3RybF9TT1VSQ0VTID0gY2FtY3RybC5jCitjYW1jdHJsX0NGTEFHUyAgPSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ09OVFJPTExFUl9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2NhbWN0cmxfTERBREQgPSAkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0NPTlRST0xMRVJfTElCUykgJChHU1RfTElCUykKKwordjRsMnNyY19yZW5lZ290aWF0ZV9TT1VSQ0VTID0gdjRsMnNyYy1yZW5lZ290aWF0ZS5jCit2NGwyc3JjX3JlbmVnb3RpYXRlX0NGTEFHUyAgPSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKQordjRsMnNyY19yZW5lZ290aWF0ZV9MREFERCA9ICQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3Y0bDIvY2FtY3RybC5jIGIvdGVzdHMvZXhhbXBsZXMvdjRsMi9jYW1jdHJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2MTcyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3Y0bDIvY2FtY3RybC5jCkBAIC0wLDAgKzEsMjAxIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMCBTdGVmYW4gS29zdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKiBkZW1vIGZvciB1c2luZyBnc3Rjb250cm9sZXIgd2l0aCBjYW1lcmEgY2FwdHVyZSBmb3IgZS5nLiBicmFja2V0aW5nCisgKgorICogZ2NjIGBwa2ctY29uZmlnIC0tY2ZsYWdzIC0tbGlicyBnc3RyZWFtZXItMC4xMCBnc3RyZWFtZXItY29udHJvbGxlci0wLjEwYCBjYW1jdHJsLmMgLW8gY2FtY3RybAorICoKKyAqIFRPRE86CisgKiAtIGhhbmRsZSBzdHJlYW0gc3RhdHVzIGFuZCBzd2l0Y2ggY2FwdHVyZSB0aHJlYWQgdG8gU0NIRURfUlIvRklGTworICogLSB3ZSB3YW50IHNvbWUgZmVlZGJhY2sgYWJvdXQgaG93IHByZWNpc2VseSBhIHByb2dyYW0gY2FuIGJlIHJlYWxpemVkCisgKiAgIC0gd2UgbWlnaHQgd2FudCB0byBhZGp1c3QgdGhlIGZyYW1lcmF0ZSB0byBoYW5kbGUgaGFyZHdhcmUgbGltbWl0cworICogLSB3ZSBlLmcuIGNhbid0IGNoYW5nZSByZXNvbHV0aW9uIHBlciBmcmFtZSByaWdodCBub3cKKyAqLworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9jb250cm9sbGVyL2dzdGludGVycG9sYXRpb25jb250cm9sc291cmNlLmg+CisjaW5jbHVkZSA8Z3N0L2NvbnRyb2xsZXIvZ3N0ZGlyZWN0Y29udHJvbGJpbmRpbmcuaD4KKworc3RhdGljIHZvaWQKK2V2ZW50X2xvb3AgKEdzdEVsZW1lbnQgKiBiaW4pCit7CisgIEdzdEJ1cyAqYnVzOworICBHc3RNZXNzYWdlICptZXNzYWdlID0gTlVMTDsKKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChHU1RfRUxFTUVOVCAoYmluKSk7CisKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBtZXNzYWdlID0gZ3N0X2J1c19wb2xsIChidXMsIEdTVF9NRVNTQUdFX0FOWSwgLTEpOworCisgICAgc3dpdGNoIChtZXNzYWdlLT50eXBlKSB7CisgICAgICBjYXNlIEdTVF9NRVNTQUdFX0VPUzoKKyAgICAgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgICByZXR1cm47CisgICAgICBjYXNlIEdTVF9NRVNTQUdFX1dBUk5JTkc6CisgICAgICBjYXNlIEdTVF9NRVNTQUdFX0VSUk9SOnsKKyAgICAgICAgR0Vycm9yICpnZXJyb3I7CisgICAgICAgIGdjaGFyICpkZWJ1ZzsKKworICAgICAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobWVzc2FnZSwgJmdlcnJvciwgJmRlYnVnKTsKKyAgICAgICAgZ3N0X29iamVjdF9kZWZhdWx0X2Vycm9yIChHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpLCBnZXJyb3IsIGRlYnVnKTsKKyAgICAgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGdlcnJvcik7CisgICAgICAgIGdfZnJlZSAoZGVidWcpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorc2V0X3Byb2dyYW0gKEdzdE9iamVjdCAqIGVsZW0sIEdzdFN0cnVjdHVyZSAqIHByb2cpCit7CisgIGNvbnN0IEdzdFN0cnVjdHVyZSAqczsKKyAgR3N0Q29udHJvbFNvdXJjZSAqY3M7CisgIEdzdENsb2NrVGltZSB0cywgZHVyOworICBnZG91YmxlIHY7CisgIGNvbnN0IEdWYWx1ZSAqZnJhbWU7CisgIEdIYXNoVGFibGUgKmNzczsKKyAgZ2ludCBpLCBqOworICBjb25zdCBnY2hhciAqbmFtZTsKKworICBjc3MgPSBnX2hhc2hfdGFibGVfbmV3IChnX3N0cl9oYXNoLCBnX3N0cl9lcXVhbCk7CisKKyAgdHMgPSAwOworICBkdXIgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChHU1RfU0VDT05ELCAxLCAxNSk7CisKKyAgLyogbG9vcCBvdmVyIGVhY2ggaW1hZ2UgaW4gcHJvZyAqLworICBmb3IgKGkgPSAwOyBpIDwgZ3N0X3N0cnVjdHVyZV9uX2ZpZWxkcyAocHJvZyk7IGkrKykgeworICAgIEdTVF9ERUJVRyAoImN0cmwgb24gJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTICh0cykpOworCisgICAgZnJhbWUgPQorICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocHJvZywgZ3N0X3N0cnVjdHVyZV9udGhfZmllbGRfbmFtZSAocHJvZywgaSkpOworICAgIHMgPSBnc3RfdmFsdWVfZ2V0X3N0cnVjdHVyZSAoZnJhbWUpOworICAgIGZvciAoaiA9IDA7IGogPCBnc3Rfc3RydWN0dXJlX25fZmllbGRzIChzKTsgaisrKSB7CisgICAgICBuYW1lID0gZ3N0X3N0cnVjdHVyZV9udGhfZmllbGRfbmFtZSAocywgaik7CisgICAgICBjcyA9IGdfaGFzaF90YWJsZV9sb29rdXAgKGNzcywgbmFtZSk7CisgICAgICBpZiAoIWNzKSB7CisgICAgICAgIGNzID0gZ3N0X2ludGVycG9sYXRpb25fY29udHJvbF9zb3VyY2VfbmV3ICgpOworICAgICAgICBnc3Rfb2JqZWN0X2FkZF9jb250cm9sX2JpbmRpbmcgKGVsZW0sCisgICAgICAgICAgICBnc3RfZGlyZWN0X2NvbnRyb2xfYmluZGluZ19uZXcgKGVsZW0sIG5hbWUsIGNzKSk7CisgICAgICAgIGdfb2JqZWN0X3NldCAoY3MsICJtb2RlIiwgR1NUX0lOVEVSUE9MQVRJT05fTU9ERV9OT05FLCBOVUxMKTsKKyAgICAgICAgZ19oYXNoX3RhYmxlX2luc2VydCAoY3NzLCAoZ3BvaW50ZXIpIG5hbWUsIGNzKTsKKyAgICAgICAgZ3N0X29iamVjdF91bnJlZiAoY3MpOworICAgICAgfQorICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfZG91YmxlIChzLCBuYW1lLCAmdik7CisgICAgICBnc3RfdGltZWRfdmFsdWVfY29udHJvbF9zb3VyY2Vfc2V0ICgoR3N0VGltZWRWYWx1ZUNvbnRyb2xTb3VyY2UgKikgY3MsIHRzLAorICAgICAgICAgIHYpOworICAgICAgR1NUX0RFQlVHICgiICAlcyA9ICVsZiIsIG5hbWUsIHYpOworICAgIH0KKyAgICB0cyArPSBkdXI7CisgIH0KKworICBnX2hhc2hfdGFibGVfdW5yZWYgKGNzcyk7Cit9CisKK2dpbnQKK21haW4gKGdpbnQgYXJnYywgZ2NoYXIgKiogYXJndikKK3sKKyAgR3N0RWxlbWVudCAqYmluOworICBHc3RFbGVtZW50ICpzcmMsICpjdnQsICpmbXQsICplbmMsICpzaW5rOworICBHc3RDYXBzICpjYXBzOworICBHc3RTdHJ1Y3R1cmUgKnByb2c7CisKKyAgLyogaW5pdCBnc3RyZWFtZXIgKi8KKyAgZ3N0X2luaXQgKCZhcmdjLCAmYXJndik7CisKKyAgLyogY3JlYXRlIGEgbmV3IGJpbiB0byBob2xkIHRoZSBlbGVtZW50cyAqLworICBiaW4gPSBnc3RfcGlwZWxpbmVfbmV3ICgiY2FtZXJhIik7CisKKyAgLyogY3JlYXRlIGVsZW1lbnRzICovCisgIGlmICghKHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJtdWx0aWZpbGVzaW5rIiwgTlVMTCkpKSB7CisgICAgR1NUX1dBUk5JTkcgKCJDYW4ndCBjcmVhdGUgZWxlbWVudCBcIm11bHRpZmlsZXNpbmtcIiIpOworICAgIHJldHVybiAtMTsKKyAgfQorICBnX29iamVjdF9zZXQgKHNpbmssICJsb2NhdGlvbiIsICJpbWFnZSUwMmQuanBnIiwgTlVMTCk7CisKKyAgaWYgKCEoZW5jID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgianBlZ2VuYyIsIE5VTEwpKSkgeworICAgIEdTVF9XQVJOSU5HICgiQ2FuJ3QgY3JlYXRlIGVsZW1lbnQgXCJqcGVnZW5jXCIiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoIShmbXQgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJjYXBzZmlsdGVyIiwgTlVMTCkpKSB7CisgICAgR1NUX1dBUk5JTkcgKCJDYW4ndCBjcmVhdGUgZWxlbWVudCBcImNhcHNmaWx0ZXJcIiIpOworICAgIHJldHVybiAtMTsKKyAgfQorICBjYXBzID0KKyAgICAgIGdzdF9jYXBzX2Zyb21fc3RyaW5nCisgICAgICAoInZpZGVvL3gtcmF3LCB3aWR0aD02NDAsIGhlaWdodD00ODAsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pMTUvMSIpOworICBnX29iamVjdF9zZXQgKGZtdCwgImNhcHMiLCBjYXBzLCBOVUxMKTsKKworICBpZiAoIShjdnQgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb2NvbnZlcnQiLCBOVUxMKSkpIHsKKyAgICBHU1RfV0FSTklORyAoIkNhbid0IGNyZWF0ZSBlbGVtZW50IFwidmlkZW9jb252ZXJ0XCIiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoIShzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2NGwyc3JjIiwgTlVMTCkpKSB7CisgICAgR1NUX1dBUk5JTkcgKCJDYW4ndCBjcmVhdGUgZWxlbWVudCBcInY0bDJzcmNcIiIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIGFkZCBvYmplY3RzIHRvIHRoZSBtYWluIGJpbiAqLworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChiaW4pLCBzcmMsIGN2dCwgZm10LCBlbmMsIHNpbmssIE5VTEwpOworCisgIC8qIGxpbmsgZWxlbWVudHMgKi8KKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rX21hbnkgKHNyYywgY3Z0LCBmbXQsIGVuYywgc2luaywgTlVMTCkpIHsKKyAgICBHU1RfV0FSTklORyAoIkNhbid0IGxpbmsgZWxlbWVudHMiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBwcm9ncmFtbSBhIHBhdHRlcm4gb2YgZXZlbnRzICovCisjaWYgMAorICBwcm9nID0gZ3N0X3N0cnVjdHVyZV9mcm9tX3N0cmluZyAoInByb2dyYW0iCisgICAgICAiLCBpbWFnZTAwPShzdHJ1Y3R1cmUpXCJpbWFnZVxcLGNvbnRyYXN0XFw9MC4wXFw7XCIiCisgICAgICAiLCBpbWFnZTAxPShzdHJ1Y3R1cmUpXCJpbWFnZVxcLGNvbnRyYXN0XFw9MC4zXFw7XCIiCisgICAgICAiLCBpbWFnZTAyPShzdHJ1Y3R1cmUpXCJpbWFnZVxcLGNvbnRyYXN0XFw9MS4wXFw7XCIiCisgICAgICAiLCBpbWFnZTAzPShzdHJ1Y3R1cmUpXCJpbWFnZVxcLGNvbnRyYXN0XFw9MC4wNVxcO1wiOyIsIE5VTEwpOworI2VuZGlmCisjaWYgMQorICBwcm9nID0gZ3N0X3N0cnVjdHVyZV9mcm9tX3N0cmluZyAoInByb2dyYW0iCisgICAgICAiLCBpbWFnZTAwPShzdHJ1Y3R1cmUpXCJpbWFnZVxcLGJyaWdodG5lc3NcXD0xLjBcXCxjb250cmFzdFxcPTAuMFxcO1wiIgorICAgICAgIiwgaW1hZ2UwMT0oc3RydWN0dXJlKVwiaW1hZ2VcXCxicmlnaHRuZXNzXFw9MC41XFwsY29udHJhc3RcXD0wLjNcXDtcIiIKKyAgICAgICIsIGltYWdlMDI9KHN0cnVjdHVyZSlcImltYWdlXFwsYnJpZ2h0bmVzc1xcPTAuMjVcXCxjb250cmFzdFxcPTEuMFxcO1wiIgorICAgICAgIiwgaW1hZ2UwMz0oc3RydWN0dXJlKVwiaW1hZ2VcXCxicmlnaHRuZXNzXFw9MC4wXFwsY29udHJhc3RcXD0wLjA1XFw7XCI7IiwKKyAgICAgIE5VTEwpOworI2VuZGlmCisgIHNldF9wcm9ncmFtIChHU1RfT0JKRUNUIChzcmMpLCBwcm9nKTsKKyAgZ19vYmplY3Rfc2V0IChzcmMsICJudW0tYnVmZmVycyIsIGdzdF9zdHJ1Y3R1cmVfbl9maWVsZHMgKHByb2cpLAorICAgICAgImRldmljZSIsIGFyZ3ZbMV0gPyBhcmd2WzFdIDogIi9kZXYvdmlkZW8wIiwgTlVMTCk7CisKKyAgLyogcHJlcGFyZSBwbGF5YmFjayAqLworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX1BBVVNFRCk7CisKKyAgLyogcGxheSBhbmQgd2FpdCAqLworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIC8qIG1haW5sb29wIGFuZCB3YWl0IGZvciBlb3MgKi8KKyAgZXZlbnRfbG9vcCAoYmluKTsKKworICAvKiBzdG9wIGFuZCBjbGVhbnVwICovCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1QgKGJpbikpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3Y0bDIvbWVzb24uYnVpbGQgYi90ZXN0cy9leGFtcGxlcy92NGwyL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1OWQwMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy92NGwyL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMTEgQEAKK2V4ZWN1dGFibGUoJ2NhbWN0cmwnLCAnY2FtY3RybC5jJywKKyAgZGVwZW5kZW5jaWVzOiBbZ3N0Y29udHJvbGxlcl9kZXAsIGdzdF9kZXBdLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgaW5zdGFsbDogZmFsc2UpCisKK2V4ZWN1dGFibGUoJ3Y0bDJzcmMtcmVuZWdvdGlhdGUnLCAndjRsMnNyYy1yZW5lZ290aWF0ZS5jJywKKyAgZGVwZW5kZW5jaWVzOiBbZ3N0X2RlcF0sCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBpbnN0YWxsOiBmYWxzZSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3Y0bDIvdjRsMnNyYy1yZW5lZ290aWF0ZS5jIGIvdGVzdHMvZXhhbXBsZXMvdjRsMi92NGwyc3JjLXJlbmVnb3RpYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FlMjhkMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3Y0bDIvdjRsMnNyYy1yZW5lZ290aWF0ZS5jCkBAIC0wLDAgKzEsMTczIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgU2Ftc3VuZyBFbGVjdHJvbmljcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgQXV0aG9yOiBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qIGRlbW8gZm9yIHNob3dpbmcgdjRsMnNyYyByZW5lZ290aWF0aW5nICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworLyogT3B0aW9ucyAqLworc3RhdGljIGNvbnN0IGdjaGFyICpkZXZpY2UgPSAiL2Rldi92aWRlbzAiOworc3RhdGljIGNvbnN0IGdjaGFyICp2aWRlb3NpbmsgPSAiYXV0b3ZpZGVvc2luayI7CitzdGF0aWMgY29uc3QgZ2NoYXIgKmlvX21vZGUgPSAibW1hcCI7CitzdGF0aWMgY29uc3QgZ2NoYXIgKmRlZl9yZXNvbHV0aW9uc1tdID0geworICAiMzIweDI0MCIsCisgICIxMjgweDcyMCIsCisgICI2NDB4NDgwIiwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IGdjaGFyICoqcmVzb2x1dGlvbnMgPSBkZWZfcmVzb2x1dGlvbnM7CisKK3N0YXRpYyBHT3B0aW9uRW50cnkgZW50cmllc1tdID0geworICB7ImRldmljZSIsICdkJywgMCwgR19PUFRJT05fQVJHX1NUUklORywgJmRldmljZSwgIlY0TDIgQ2FtZXJhIERldmljZSIsCisgICAgICBOVUxMfSwKKyAgeyJ2aWRlb3NpbmsiLCAncycsIDAsIEdfT1BUSU9OX0FSR19TVFJJTkcsICZ2aWRlb3NpbmssICJWaWRlbyBTaW5rIHRvIHVzZSIsCisgICAgICBOVUxMfSwKKyAgeyJpby1tb2RlIiwgJ3onLCAwLCBHX09QVElPTl9BUkdfU1RSSU5HLCAmaW9fbW9kZSwKKyAgICAgICJDb25maWd1cmUgdGhlIFwiaW8tbW9kZVwiIHByb3BlcnR5IG9uIHY0bDJzY3IiLCBOVUxMfSwKKyAgeyJyZXNvbHV0aW9uIiwgJ3InLCAwLCBHX09QVElPTl9BUkdfU1RSSU5HX0FSUkFZLCAmcmVzb2x1dGlvbnMsCisgICAgICAiQWRkIGEgcmVzb2x1dGlvbiB0byB0aGUgbGlzdCIsIE5VTEx9LAorICB7TlVMTH0KK307CisKK3N0YXRpYyBHTWFpbkxvb3AgKmxvb3A7CitzdGF0aWMgR3N0RWxlbWVudCAqcGlwZWxpbmU7CitzdGF0aWMgR3N0RWxlbWVudCAqc3JjLCAqY2Fwc2ZpbHRlcjsKK3N0YXRpYyBnaW50IHJlc29sdXRpb25faW5kZXggPSAwOworCitzdGF0aWMgZ2Jvb2xlYW4KK2J1c19jYWxsYmFjayAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgc3dpdGNoIChtZXNzYWdlLT50eXBlKSB7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FT1M6CisgICAgICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01FU1NBR0VfRVJST1I6eworICAgICAgR0Vycm9yICpnZXJyb3I7CisgICAgICBnY2hhciAqZGVidWc7CisKKyAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChtZXNzYWdlLCAmZ2Vycm9yLCAmZGVidWcpOworICAgICAgZ3N0X29iamVjdF9kZWZhdWx0X2Vycm9yIChHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpLCBnZXJyb3IsIGRlYnVnKTsKKyAgICAgIGdfZXJyb3JfZnJlZSAoZ2Vycm9yKTsKKyAgICAgIGdfZnJlZSAoZGVidWcpOworICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorY2hhbmdlX2NhcHMgKGdwb2ludGVyIGRhdGEpCit7CisgIEdzdENhcHMgKmNhcHM7CisgIEdTdHJ2IHJlczsKKyAgZ2NoYXIgKmNhcHNfc3RyOworCisgIGlmICghcmVzb2x1dGlvbnNbcmVzb2x1dGlvbl9pbmRleF0pIHsKKyAgICBnc3RfZWxlbWVudF9zZW5kX2V2ZW50IChwaXBlbGluZSwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGdfcHJpbnQgKCJTZXR0aW5nIHJlc29sdXRpb24gdG8gJyVzJ1xuIiwgcmVzb2x1dGlvbnNbcmVzb2x1dGlvbl9pbmRleF0pOworCisgIHJlcyA9IGdfc3Ryc3BsaXQgKHJlc29sdXRpb25zW3Jlc29sdXRpb25faW5kZXgrK10sICJ4IiwgMik7CisgIGlmICghcmVzWzBdIHx8ICFyZXNbMV0pIHsKKyAgICBnX3dhcm5pbmcgKCJDYW4ndCBwYXJzZSByZXNvbHV0aW9uOiAlcyIsIHJlc29sdXRpb25zW3Jlc29sdXRpb25faW5kZXggLSAxXSk7CisgICAgZ19zdHJmcmVldiAocmVzKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGNhcHNfc3RyID0gZ19zdHJkdXBfcHJpbnRmICgidmlkZW8veC1yYXcsd2lkdGg9JXMsaGVpZ2h0PSVzIiwgcmVzWzBdLCByZXNbMV0pOworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKGNhcHNfc3RyKTsKKyAgZ19vYmplY3Rfc2V0IChjYXBzZmlsdGVyLCAiY2FwcyIsIGNhcHMsIE5VTEwpOworCisgIGdfc3RyZnJlZXYgKHJlcyk7CisgIGdfZnJlZSAoY2Fwc19zdHIpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dpbnQKK21haW4gKGdpbnQgYXJnYywgZ2NoYXIgKiogYXJndikKK3sKKyAgR3N0QnVzICpidXM7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICBHT3B0aW9uQ29udGV4dCAqY29udGV4dDsKKyAgZ2NoYXIgKmRlc2M7CisgIGdib29sZWFuIHJldDsKKworICBjb250ZXh0ID0gZ19vcHRpb25fY29udGV4dF9uZXcgKCItIHRlc3QgdjRsMnNyYyBsaXZlIHJlbmVnb3RpdGlvbiIpOworICBnX29wdGlvbl9jb250ZXh0X2FkZF9tYWluX2VudHJpZXMgKGNvbnRleHQsIGVudHJpZXMsIEdFVFRFWFRfUEFDS0FHRSk7CisgIGdfb3B0aW9uX2NvbnRleHRfYWRkX2dyb3VwIChjb250ZXh0LCBnc3RfaW5pdF9nZXRfb3B0aW9uX2dyb3VwICgpKTsKKyAgcmV0ID0gZ19vcHRpb25fY29udGV4dF9wYXJzZSAoY29udGV4dCwgJmFyZ2MsICZhcmd2LCAmZXJyb3IpOworICBnX29wdGlvbl9jb250ZXh0X2ZyZWUgKGNvbnRleHQpOworCisgIGlmICghcmV0KSB7CisgICAgZ19wcmludCAoIm9wdGlvbiBwYXJzaW5nIGZhaWxlZDogJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIEZBTFNFKTsKKworICBkZXNjID0gZ19zdHJkdXBfcHJpbnRmICgidjRsMnNyYyBuYW1lPXNyYyBkZXZpY2U9XCIlc1wiIGlvLW1vZGU9XCIlc1wiICIKKyAgICAgICIhIGNhcHNmaWx0ZXIgbmFtZT1jZiAhICVzIiwgZGV2aWNlLCBpb19tb2RlLCB2aWRlb3NpbmspOworICBwaXBlbGluZSA9IGdzdF9wYXJzZV9sYXVuY2ggKGRlc2MsICZlcnJvcik7CisgIGdfZnJlZSAoZGVzYyk7CisgIGlmICghcGlwZWxpbmUpIHsKKyAgICBnX3ByaW50ICgiZmFpbGVkIHRvIGNyZWF0ZSBwaXBlbGluZTogJXMiLCBlcnJvci0+bWVzc2FnZSk7CisgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBzcmMgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJzcmMiKTsKKyAgY2Fwc2ZpbHRlciA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgImNmIik7CisKKyAgYnVzID0gZ3N0X3BpcGVsaW5lX2dldF9idXMgKEdTVF9QSVBFTElORSAocGlwZWxpbmUpKTsKKyAgZ3N0X2J1c19hZGRfd2F0Y2ggKGJ1cywgYnVzX2NhbGxiYWNrLCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKworICBjaGFuZ2VfY2FwcyAoTlVMTCk7CisKKyAgLyogcGxheSBhbmQgd2FpdCAqLworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgZ190aW1lb3V0X2FkZF9zZWNvbmRzICgzLCBjaGFuZ2VfY2FwcywgTlVMTCk7CisKKyAgLyogbWFpbmxvb3AgYW5kIHdhaXQgZm9yIGVvcyAqLworICBnX21haW5fbG9vcF9ydW4gKGxvb3ApOworCisgIC8qIHN0b3AgYW5kIGNsZWFudXAgKi8KKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChzcmMpOworICBnc3Rfb2JqZWN0X3VucmVmIChjYXBzZmlsdGVyKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoR1NUX09CSkVDVCAocGlwZWxpbmUpKTsKKyAgZ19tYWluX2xvb3BfdW5yZWYgKGxvb3ApOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzL01ha2VmaWxlLmFtIGIvdGVzdHMvZmlsZXMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzYjRkYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZpbGVzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjEgQEAKKworRVhUUkFfRElTVCA9IFwKKwlhdWRpb3Rlc3RzcmMuZmxhYyBcCisJYXVkaW90ZXN0c3JjLndhdiBcCisJZ3JhZGllbnQuajJrIFwKKwloMjY0LnJ0cCBcCisJaWQzLTQwNzM0OS0xLnRhZyBcCisJaWQzLTQwNzM0OS0yLnRhZyBcCisJaWQzLTQ0NzAwMC13Y29wLnRhZyBcCisJaWQzLTU3NzQ2OC11bnN5bmNlZC10YWcudGFnIFwKKwlpZDMtNTg4MTQ4LXVuc3luY2VkLXYyNC50YWcgXAorCWltYWdlLmpwZyBcCisJcGNtMTZzaW5lLmZsdiBcCisJcGlua25vaXNlLXZvcmJpcy5ta3YgXAorCXN0cmVhbS5tcDIgXAorCWNicl9zdHJlYW0ubXAzIFwKKwl2YnJfc3RyZWFtLm1wMyBcCisJdGVzdC1jZXJ0LnBlbSBcCisJdGVzdC1rZXkucGVtIFwKKwlzcGxpdHZpZGVvMDAub2dnIHNwbGl0dmlkZW8wMS5vZ2cgXAorCXNwbGl0dmlkZW8wMi5vZ2cKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzL2F1ZGlvdGVzdHNyYy5mbGFjIGIvdGVzdHMvZmlsZXMvYXVkaW90ZXN0c3JjLmZsYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxMmMzZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZpbGVzL2F1ZGlvdGVzdHNyYy5mbGFjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzL2F1ZGlvdGVzdHNyYy53YXYgYi90ZXN0cy9maWxlcy9hdWRpb3Rlc3RzcmMud2F2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhN2YwMmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9maWxlcy9hdWRpb3Rlc3RzcmMud2F2CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzL2Nicl9zdHJlYW0ubXAzIGIvdGVzdHMvZmlsZXMvY2JyX3N0cmVhbS5tcDMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFhNWM0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZpbGVzL2Nicl9zdHJlYW0ubXAzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzL2dyYWRpZW50LmoyayBiL3Rlc3RzL2ZpbGVzL2dyYWRpZW50LmoyawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDJjOTRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmlsZXMvZ3JhZGllbnQuajJrCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzL2gyNjQucnRwIGIvdGVzdHMvZmlsZXMvaDI2NC5ydHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhZDk3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZpbGVzL2gyNjQucnRwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzL2lkMy00MDczNDktMS50YWcgYi90ZXN0cy9maWxlcy9pZDMtNDA3MzQ5LTEudGFnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1Y2Q0ZjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9maWxlcy9pZDMtNDA3MzQ5LTEudGFnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzL2lkMy00MDczNDktMi50YWcgYi90ZXN0cy9maWxlcy9pZDMtNDA3MzQ5LTIudGFnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNmE0MmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9maWxlcy9pZDMtNDA3MzQ5LTIudGFnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzL2lkMy00NDcwMDAtd2NvcC50YWcgYi90ZXN0cy9maWxlcy9pZDMtNDQ3MDAwLXdjb3AudGFnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MTA5Y2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9maWxlcy9pZDMtNDQ3MDAwLXdjb3AudGFnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzL2lkMy01Nzc0NjgtdW5zeW5jZWQtdGFnLnRhZyBiL3Rlc3RzL2ZpbGVzL2lkMy01Nzc0NjgtdW5zeW5jZWQtdGFnLnRhZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTg4MGU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmlsZXMvaWQzLTU3NzQ2OC11bnN5bmNlZC10YWcudGFnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzL2lkMy01ODgxNDgtdW5zeW5jZWQtdjI0LnRhZyBiL3Rlc3RzL2ZpbGVzL2lkMy01ODgxNDgtdW5zeW5jZWQtdjI0LnRhZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTlkOTMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmlsZXMvaWQzLTU4ODE0OC11bnN5bmNlZC12MjQudGFnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzL2ltYWdlLmpwZyBiL3Rlc3RzL2ZpbGVzL2ltYWdlLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTJmZDc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmlsZXMvaW1hZ2UuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzL3BjbTE2c2luZS5mbHYgYi90ZXN0cy9maWxlcy9wY20xNnNpbmUuZmx2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MjVhMmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9maWxlcy9wY20xNnNpbmUuZmx2CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzL3Bpbmtub2lzZS12b3JiaXMubWt2IGIvdGVzdHMvZmlsZXMvcGlua25vaXNlLXZvcmJpcy5ta3YKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgzMDA2YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZpbGVzL3Bpbmtub2lzZS12b3JiaXMubWt2CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzL3NwbGl0dmlkZW8wMC5vZ2cgYi90ZXN0cy9maWxlcy9zcGxpdHZpZGVvMDAub2dnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZWZiN2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9maWxlcy9zcGxpdHZpZGVvMDAub2dnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzL3NwbGl0dmlkZW8wMS5vZ2cgYi90ZXN0cy9maWxlcy9zcGxpdHZpZGVvMDEub2dnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MWY1MzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9maWxlcy9zcGxpdHZpZGVvMDEub2dnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzL3NwbGl0dmlkZW8wMi5vZ2cgYi90ZXN0cy9maWxlcy9zcGxpdHZpZGVvMDIub2dnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMjM1ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9maWxlcy9zcGxpdHZpZGVvMDIub2dnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzL3N0cmVhbS5tcDIgYi90ZXN0cy9maWxlcy9zdHJlYW0ubXAyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNmU5MDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9maWxlcy9zdHJlYW0ubXAyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzL3Rlc3QtY2VydC5wZW0gYi90ZXN0cy9maWxlcy90ZXN0LWNlcnQucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmODYzYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9maWxlcy90ZXN0LWNlcnQucGVtCkBAIC0wLDAgKzEsMTggQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQzJ6Q0NBY09nQXdJQkFnSUpBTFJiZzJXbnVBQXFNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1CUXhFakFRQmdOVgorQkFNTUNURXlOeTR3TGpBdU1UQWVGdzB4TnpBMk1qQXhOREkzTXpCYUZ3MHlOekEyTVRneE5ESTNNekJhTUJReAorRWpBUUJnTlZCQU1NQ1RFeU55NHdMakF1TVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQworZ2dFQkFLczRmdVJ1Vzc3bk9SaE9UOWtiYlU2QnNqS1czR0VzTWMrWlNtWGpJTlFXcGZrRVMyaFYrRFF5emhtNQorcWg0T0xpMXZZdFhvU2JkUU5EQ2JBOHliWkpxUjhtOUYzZWQ4dm9iZFNTUUd4V3BQZFhUZ3oyN3grVHBpQWM5UAordzgzVXVQdmx1LzBBeEhKQkZYVkFnK2lkMHlGdTN3bUdXWUpIb0F0dkZpMnhlUnRBWHVyTnVQdGpaeU8rZ2ZNOQorQktUUkNrR3NSU21QcEp5R2JVMlE5NmZqeG5WZlY5b1l2UVhldWdVY1N4L3BUVUNNL2tEZ0Q5UVpDeEcycmZsWAorTldjcURGWTN1TzZaUjY4UXdpL0tvdU9hOHJ6cmdBY3doRlVJNld6MFp3aTFyelJ0V0s1V3FDMjRhQlVZei90SworaGw4aTg4VURYU01oN3NwQ2hkWURCR0xoWnlVQ0F3RUFBYU13TUM0d0xBWURWUjBSQkNVd0k0SUpiRzlqWVd4bworYjNOMGh3Ui9BQUFCaHhBQUFBQUFBQUFBQUFBQUFBQUFBQUFCTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCagorK1U4dGVid2c1L3BvZjVSaHQ2VE1IcWVnNkZjcjRPSmtMMnBoMmcrVC9BTVRTN2tFR2VGSUtKTjVBWitTL3FJWQorY2RvREtId2M4K2JDSy9tRzZEUG1KNHovMkVhbWI4NVlocGxPTFZyTFJ3ZnhSZWJUSzlDdG5qY2puZmxBaVU5SAorN3ZQVndYSXZrd2ViaEJTUU5LVGRrQmxQWEthVE5XWHV5Z2VGRzJPVlFrUGYvS0F4U2R0ZzJSK293di9zODAyWgorSElTazI2d1k5b0ZJUXo2QWlYV2RyWTFRcU5PbHRaN3JsVTVpb2ZBSDdYKzlyeVpseFBXai9nSGcyWVFSdnZMbAorZHE2bkNGK0VEMGtlN2gwbGc1blUwYmVLRXlnd2xpOERsTFZidTBKSzBQa0FSRnA1dDd3VXR6QzlEQ2p6dmZPYworZ3hSNDRQeVpYNy8yb2FURG00UFMKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzL3Rlc3Qta2V5LnBlbSBiL3Rlc3RzL2ZpbGVzL3Rlc3Qta2V5LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmJiY2MyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmlsZXMvdGVzdC1rZXkucGVtCkBAIC0wLDAgKzEsMjcgQEAKKy0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KK01JSUVvd0lCQUFLQ0FRRUFxemgrNUc1YnZ1YzVHRTVQMlJ0dFRvR3lNcGJjWVN3eHo1bEtaZU1nMUJhbCtRUkwKK2FGWDRORExPR2JtcUhnNHVMVzlpMWVoSnQxQTBNSnNEekp0a21wSHliMFhkNTN5K2h0MUpKQWJGYWs5MWRPRFAKK2J2SDVPbUlCejAvRHpkUzQrK1c3L1FERWNrRVZkVUNENkozVElXN2ZDWVpaZ2tlZ0MyOFdMYkY1RzBCZTZzMjQKKysyTm5JNzZCOHowRXBORUtRYXhGS1kra25JWnRUWkQzcCtQR2RWOVgyaGk5QmQ2NkJSeExIK2xOUUl6K1FPQVAKKzFCa0xFYmF0K1ZjMVp5b01WamU0N3BsSHJ4RENMOHFpNDVyeXZPdUFCekNFVlFqcGJQUm5DTFd2TkcxWXJsYW8KK0xiaG9GUmpQKzBxR1h5THp4UU5kSXlIdXlrS0YxZ01FWXVGbkpRSURBUUFCQW9JQkFCaCtNWEM5OUxQZlljUi8KK1YxN0lWSitaWUFOcW4wWHJTNGpWOWRXVFl4dlR6WlJNci9qUjYzcVVGZldLSUxMQjlvc2JWdmtnaklNRG55T2cKKzJTOUl2MkI1SmtRU3E0YTB5cENDVVRjdEhNcHphV3I1eWRLbUhLL2tXenZydmlmUW1WRzNjR2ZsMXpRODZUUG4KK3NiYng5TVRnbGxsSGRjQjBQSW5HTDFjRC96NE5nRWJScjFCNmFCY3EwQUhxSkpJSUh2UU5QbUg2SEdBU2c0OGoKK2hWQVoyc1lqcDlEU0s5N0hLU0FCcEJDc1JOOFhyTWdZT0FzdTVhMXJ0WGhqdE1VWm82THBFd0V3SDk0ckRPZ3YKK1p2SkxHcnBTdktLV1BHY3lBTnlLMWE1bnpPOElOY1hZK1g1NGE4VkIxWUFqeW16RHkvV00xT1gvakJmWmVtNTMKK0h3QzdtNVVDZ1lFQTNjcmNCSTlmM2FEZ0NZRVVEV1o4aFRRVVZodk4zcGk4UVdyN1F1Yk1KbUl5eEJqMzk0d20KK2hUbzh3b1l4TnF5OVZrTzBYK2p4SEEwcnpOMUt2UzlqMkNBekordFlOaEVzUmM2b25qRVhLR0xoTy8xZ0hia1QKK3JSeDJKMXVBMkhRVGJaTkdod3M5UWRsM0E3c3l3NmZGdzlULzVyb29XYml2NVNEcVNDUkZ6bGNDZ1lFQXhhRGoKK0pZeUxMbCtKYnNsdGt2NzF0aDVUdkxpMTRxNktsWkpHRVVlU3N5bVV4OWV2QlM3cy9oNjJCb2U5LzdZNjNaa2wKK2RSM0l2eFg3SE5xVy9mR2p1UXI5alF2TU1kdWlsOEwyMThsQ2h1Ui80SEVzWHJTdnl3OE1JTWxEdGpUV2FqQjYKK2M4ZWlVK3ovNXpybGh6b29LazJMYVFIVFVycmJ4azlyTjByYUVPTUNnWUVBMktsejF3eU1WTC8wTzdTWmR5RzMKKzRKUG9qZG1wZVpyd3hHTVN3dDhkYlIyZWhBdjBLQ0lEK3ovUjNTRWo4RW84eDRscUtnc3ZoZnlqM2dRTEg5YXMKK2paT2ZCWThVNC9SUXNIemFJWGJKTFkyeWcxellTUkRrVk1hcDhYYWszazQrTUZ1Zm1RcDBzK0FSTUZidGwwNU0KK2xpcDhOZE9DMldyZWdWRnZMRHdxNlE4Q2dZQnkzZ3lvcW9QTE5HUmhMRnF2OGRsSFBXRldjOVhrSjZjTlFMUFIKK0gxUzVKaFlBQWZFTWhqWGhqbUFtYzRlUHRZK0pkWlk3K0UvU0lTaVBvTTNhVkRUaFBPNGFxUnpLYmVxWFl3NnUKK1phQnhYeWFrZ2FOVWVKa2s0VjRmUUZ4RzczY2d5WVNpL3dudTFmWDNwRmY4dldUVEViZFNGV21LMEdrbFhzdm0KK20yOGNHUUtCZ0d2Ry8vVzhOR2ZYV0wva29teUtYdzhHSjQxSXAwc2EyMEtOa05ad0FhQTFCVlRhSElZVCtyeG8KK1NnVlFQSG16UDhKOXA0VTBkOWxRNUJXMExXRVJWa0ZIT2c4azBldkRzU20zRlZiZVJDQmpsS3FWVU9Mb280SGsKK0ErZlNZV1dXbDFqOUU5dXJwaVQvZDRBUVkxYkZVeGNVZWJEU0s5WFQ2WlBPdXN5WDBmU2UKKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9maWxlcy92YnJfc3RyZWFtLm1wMyBiL3Rlc3RzL2ZpbGVzL3Zicl9zdHJlYW0ubXAzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZmMzOGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9maWxlcy92YnJfc3RyZWFtLm1wMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9pY2xlcy8uZ2l0aWdub3JlIGIvdGVzdHMvaWNsZXMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yzk3NWEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaWNsZXMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDEyIEBACitlcXVhbGl6ZXItdGVzdAorZ2RrcGl4YnVmc2luay10ZXN0Cit0ZXN0LWFjY3VyYXRlLXNlZWsKK2dka3BpeGJ1Zm92ZXJsYXktdGVzdAordGVzdC1zZWdtZW50LXNlZWtzCit0ZXN0LW9zczQKK3hpbWFnZXNyYy10ZXN0Cit2NGwyc3JjLXRlc3QKK3ZpZGVvYm94LXRlc3QKK3ZpZGVvY3JvcC10ZXN0Cit2aWRlb2Nyb3AyLXRlc3QKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvaWNsZXMvTWFrZWZpbGUuYW0gYi90ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWZlODQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaWNsZXMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw3NyBAQAoraWYgSEFWRV9HVEsKK0dUS19URVNUUyA9IGdka3BpeGJ1ZnNpbmstdGVzdCBnZGtwaXhidWZvdmVybGF5LXRlc3QKKworZ2RrcGl4YnVmc2lua190ZXN0X1NPVVJDRVMgPSBnZGtwaXhidWZzaW5rLXRlc3QuYworZ2RrcGl4YnVmc2lua190ZXN0X0NGTEFHUyAgPSAkKEdTVF9DRkxBR1MpICQoR1RLX0NGTEFHUykKK2dka3BpeGJ1ZnNpbmtfdGVzdF9MREFERCAgID0gJChHU1RfTElCUykgJChHVEtfTElCUykKKworZ2RrcGl4YnVmb3ZlcmxheV90ZXN0X1NPVVJDRVMgPSBnZGtwaXhidWZvdmVybGF5LXRlc3QuYworZ2RrcGl4YnVmb3ZlcmxheV90ZXN0X0NGTEFHUyAgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpIFwKKwkkKEdES19QSVhCVUZfQ0ZMQUdTKSAkKEdJT19DRkxBR1MpCitnZGtwaXhidWZvdmVybGF5X3Rlc3RfTERBREQgICA9ICQoR1NUX0xJQlMpICQoR0RLX1BJWEJVRl9MSUJTKSAkKEdJT19MSUJTKSBcCisJJChMSUJNKQorZWxzZQorR1RLX1RFU1RTID0KK2VuZGlmCisKK1Y0TDJfVEVTVFMgPSB2NGwyc3JjLXRlc3QKKwordjRsMnNyY190ZXN0X1NPVVJDRVMgPSB2NGwyc3JjLXRlc3QuYwordjRsMnNyY190ZXN0X0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK3Y0bDJzcmNfdGVzdF9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSBcCisJCSAgICAgLWxnc3R2aWRlby0kKEdTVF9BUElfVkVSU0lPTikKKworaWYgVVNFX09TUzQKK09TUzRfVEVTVFM9dGVzdC1vc3M0CisKK3Rlc3Rfb3NzNF9TT1VSQ0VTID0gdGVzdC1vc3M0LmMKK3Rlc3Rfb3NzNF9DRkxBR1MgID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKQordGVzdF9vc3M0X0xEQUREICAgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgJChHU1RfTElCUykKK3Rlc3Rfb3NzNF9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCitlbHNlCitPU1M0X1RFU1RTPQorZW5kaWYKKworaWYgVVNFX1gKK1hfVEVTVFMgPSB4aW1hZ2VzcmMtdGVzdAorCit4aW1hZ2VzcmNfdGVzdF9TT1VSQ0VTID0geGltYWdlc3JjLXRlc3QuYworeGltYWdlc3JjX3Rlc3RfQ0ZMQUdTID0gJChHU1RfQ0ZMQUdTKQoreGltYWdlc3JjX3Rlc3RfTERBREQgPSAkKEdTVF9MSUJTKQorZWxzZQorWF9URVNUUyA9CitlbmRpZgorCitlcXVhbGl6ZXJfdGVzdF9TT1VSQ0VTID0gZXF1YWxpemVyLXRlc3QuYworZXF1YWxpemVyX3Rlc3RfQ0ZMQUdTICA9ICQoR1NUX0NGTEFHUykKK2VxdWFsaXplcl90ZXN0X0xEQUREICAgPSAkKEdTVF9MSUJTKQorCit0ZXN0X2FjY3VyYXRlX3NlZWtfU09VUkNFUyA9IHRlc3QtYWNjdXJhdGUtc2Vlay5jCit0ZXN0X2FjY3VyYXRlX3NlZWtfQ0ZMQUdTICA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKQordGVzdF9hY2N1cmF0ZV9zZWVrX0xEQUREICAgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RhcHAtJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpCisKK3Rlc3Rfc2VnbWVudF9zZWVrc19TT1VSQ0VTID0gdGVzdC1zZWdtZW50LXNlZWtzLmMKK3Rlc3Rfc2VnbWVudF9zZWVrc19DRkxBR1MgID0gJChHU1RfQ0ZMQUdTKQordGVzdF9zZWdtZW50X3NlZWtzX0xEQUREICAgPSAkKEdTVF9MSUJTKQorCit2aWRlb2Nyb3BfdGVzdF9TT1VSQ0VTID0gdmlkZW9jcm9wLXRlc3QuYwordmlkZW9jcm9wX3Rlc3RfQ0ZMQUdTICA9ICQoR1NUX0NGTEFHUykKK3ZpZGVvY3JvcF90ZXN0X0xEQUREICAgPSAkKEdTVF9MSUJTKQorCit2aWRlb2JveF90ZXN0X1NPVVJDRVMgPSB2aWRlb2JveC10ZXN0LmMKK3ZpZGVvYm94X3Rlc3RfQ0ZMQUdTICA9ICQoR1NUX0NGTEFHUykKK3ZpZGVvYm94X3Rlc3RfTERBREQgICA9ICQoR1NUX0xJQlMpCisKK3ZpZGVvY3JvcDJfdGVzdF9TT1VSQ0VTID0gdmlkZW9jcm9wMi10ZXN0LmMKK3ZpZGVvY3JvcDJfdGVzdF9DRkxBR1MgID0gJChHU1RfQ0ZMQUdTKQordmlkZW9jcm9wMl90ZXN0X0xEQUREICAgPSAkKEdTVF9MSUJTKQorCitub2luc3RfUFJPR1JBTVMgPSAkKEdUS19URVNUUykgJChPU1M0X1RFU1RTKSAkKFY0TDJfVEVTVFMpICQoWF9URVNUUykgXAorCWVxdWFsaXplci10ZXN0IFwKKwl0ZXN0LWFjY3VyYXRlLXNlZWsgXAorCXRlc3Qtc2VnbWVudC1zZWVrcyBcCisJdmlkZW9jcm9wLXRlc3QgXAorCXZpZGVvYm94LXRlc3QgXAorCXZpZGVvY3JvcDItdGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvaWNsZXMvZXF1YWxpemVyLXRlc3QuYyBiL3Rlc3RzL2ljbGVzL2VxdWFsaXplci10ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgzYmEzMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ljbGVzL2VxdWFsaXplci10ZXN0LmMKQEAgLTAsMCArMSwyODkgQEAKKy8qIEdTdHJlYW1lciB0ZXN0IGZvciB0aGUgZXF1YWxpemVyIGVsZW1lbnQKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBXaWxsIHRlc3RzIHRoZSBlcXVhbGl6ZXIgYnkgZmFkaW5nIGFsbCBiYW5kcyBpbiBhbmQgb3V0IG9uZSBieSBvbmUgYW5kCisgKiBmaW5hbHkgYWxsIHRvZ2V0aGVyLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGVxdWFsaXplcl90ZXN0X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGVxdWFsaXplcl90ZXN0X2RlYnVnCisKK3N0YXRpYyBHc3RCdXMgKnBpcGVsaW5lX2J1czsKKworc3RhdGljIGdib29sZWFuCitjaGVja19idXMgKEdzdENsb2NrVGltZSBtYXhfd2FpdF90aW1lKQoreworICBHc3RNZXNzYWdlICptc2c7CisKKyAgbXNnID0gZ3N0X2J1c19wb2xsIChwaXBlbGluZV9idXMsIEdTVF9NRVNTQUdFX0VSUk9SIHwgR1NUX01FU1NBR0VfRU9TLAorICAgICAgbWF4X3dhaXRfdGltZSk7CisKKyAgaWYgKG1zZyA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSA9PSBHU1RfTUVTU0FHRV9FUlJPUikgeworICAgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgICBnY2hhciAqZGVidWcgPSBOVUxMOworCisgICAgZ19hc3NlcnQgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRVJST1IpOworICAgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChtc2csICZlcnIsICZkZWJ1Zyk7CisgICAgR1NUX0VSUk9SICgiRVJST1I6ICVzIFslc10iLCBlcnItPm1lc3NhZ2UsIGRlYnVnKTsKKyAgICBnX3ByaW50ICgiXG49PT09PT09PT09PT4gRVJST1I6ICVzXG4lc1xuXG4iLCBlcnItPm1lc3NhZ2UsIGRlYnVnKTsKKyAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICBnX2ZyZWUgKGRlYnVnKTsKKyAgfQorCisgIGlmIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VPUykgeworICAgIGdfcHJpbnQgKCJcbiA9PT0gRU9TID09PVxuXG4iKTsKKyAgfQorCisgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworICByZXR1cm4gVFJVRTsKK30KKworLy8gZml4IGJlbG93CisKK3N0YXRpYyB2b2lkCitlcXVhbGl6ZXJfc2V0X2JhbmRfdmFsdWUgKEdzdEVsZW1lbnQgKiBlcSwgZ3VpbnQgYmFuZCwgZ2RvdWJsZSB2YWwpCit7CisgIEdPYmplY3QgKmNoaWxkOworCisgIGNoaWxkID0gZ3N0X2NoaWxkX3Byb3h5X2dldF9jaGlsZF9ieV9pbmRleCAoR1NUX0NISUxEX1BST1hZIChlcSksIGJhbmQpOworICBnX29iamVjdF9zZXQgKGNoaWxkLCAiZ2FpbiIsIHZhbCwgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChjaGlsZCk7CisgIGdfcHJpbnQgKCJCYW5kICUyZDogJS4yZlxuIiwgYmFuZCwgdmFsKTsKK30KKworc3RhdGljIHZvaWQKK2VxdWFsaXplcl9zZXRfYWxsX2JhbmRfdmFsdWVzIChHc3RFbGVtZW50ICogZXEsIGd1aW50IG51bSwgZ2RvdWJsZSB2YWwpCit7CisgIGdpbnQgaTsKKyAgR09iamVjdCAqY2hpbGQ7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisgICAgY2hpbGQgPSBnc3RfY2hpbGRfcHJveHlfZ2V0X2NoaWxkX2J5X2luZGV4IChHU1RfQ0hJTERfUFJPWFkgKGVxKSwgaSk7CisgICAgZ19vYmplY3Rfc2V0IChjaGlsZCwgImdhaW4iLCB2YWwsIE5VTEwpOworICAgIGdfb2JqZWN0X3VucmVmIChjaGlsZCk7CisgIH0KKyAgZ19wcmludCAoIkFsbCBiYW5kczogJS4yZlxuIiwgdmFsKTsKK30KKworLy8gZml4IGFib3ZlCisKK3N0YXRpYyBnYm9vbGVhbgorZXF1YWxpemVyX3NldF9iYW5kX3ZhbHVlX2FuZF93YWl0IChHc3RFbGVtZW50ICogZXEsIGd1aW50IGJhbmQsIGdkb3VibGUgdmFsKQoreworICBlcXVhbGl6ZXJfc2V0X2JhbmRfdmFsdWUgKGVxLCBiYW5kLCB2YWwpOworICByZXR1cm4gY2hlY2tfYnVzICgxMDAgKiBHU1RfTVNFQ09ORCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZXF1YWxpemVyX3NldF9hbGxfYmFuZF92YWx1ZXNfYW5kX3dhaXQgKEdzdEVsZW1lbnQgKiBlcSwgZ3VpbnQgbnVtLCBnZG91YmxlIHZhbCkKK3sKKyAgZXF1YWxpemVyX3NldF9hbGxfYmFuZF92YWx1ZXMgKGVxLCBudW0sIHZhbCk7CisgIHJldHVybiBjaGVja19idXMgKDEwMCAqIEdTVF9NU0VDT05EKTsKK30KKworc3RhdGljIHZvaWQKK2RvX3NsaWRlcl9maWRkbGluZyAoR3N0RWxlbWVudCAqIHBsYXliaW4sIEdzdEVsZW1lbnQgKiBlcSkKK3sKKyAgZ2Jvb2xlYW4gc3RvcDsKKyAgZ3VpbnQgbnVtX2JhbmRzLCBpOworICBnZG91YmxlIGQsIHN0ZXAgPSAwLjU7CisKKyAgc3RvcCA9IEZBTFNFOworCisgIGdfb2JqZWN0X2dldCAoZXEsICJudW0tYmFuZHMiLCAmbnVtX2JhbmRzLCBOVUxMKTsKKworICBnX3ByaW50ICgiJXUgYmFuZHMuXG4iLCBudW1fYmFuZHMpOworCisgIHdoaWxlICghc3RvcCkgeworICAgIGZvciAoaSA9IDA7ICFzdG9wICYmIGkgPCBudW1fYmFuZHM7ICsraSkgeworICAgICAgZCA9IC0yNC4wOworICAgICAgd2hpbGUgKCFzdG9wICYmIGQgPD0gMTIuMCkgeworICAgICAgICBzdG9wID0gZXF1YWxpemVyX3NldF9iYW5kX3ZhbHVlX2FuZF93YWl0IChlcSwgaSwgZCk7CisgICAgICAgIGQgKz0gc3RlcDsKKyAgICAgIH0KKyAgICAgIGQgPSAxMi4wOworICAgICAgd2hpbGUgKCFzdG9wICYmIGQgPj0gLTI0LjApIHsKKyAgICAgICAgc3RvcCA9IGVxdWFsaXplcl9zZXRfYmFuZF92YWx1ZV9hbmRfd2FpdCAoZXEsIGksIGQpOworICAgICAgICBkIC09IHN0ZXA7CisgICAgICB9CisgICAgICBkID0gLTI0LjA7CisgICAgICB3aGlsZSAoIXN0b3AgJiYgZCA8PSAxMi4wKSB7CisgICAgICAgIHN0b3AgPSBlcXVhbGl6ZXJfc2V0X2JhbmRfdmFsdWVfYW5kX3dhaXQgKGVxLCBpLCBkKTsKKyAgICAgICAgZCArPSBzdGVwOworICAgICAgfQorICAgIH0KKworICAgIGQgPSAwLjA7CisgICAgd2hpbGUgKCFzdG9wICYmIGQgPD0gMTIuMCkgeworICAgICAgc3RvcCA9IGVxdWFsaXplcl9zZXRfYWxsX2JhbmRfdmFsdWVzX2FuZF93YWl0IChlcSwgbnVtX2JhbmRzLCBkKTsKKyAgICAgIGQgKz0gc3RlcDsKKyAgICB9CisgICAgZCA9IDEyLjA7CisgICAgd2hpbGUgKCFzdG9wICYmIGQgPj0gLTI0LjApIHsKKyAgICAgIHN0b3AgPSBlcXVhbGl6ZXJfc2V0X2FsbF9iYW5kX3ZhbHVlc19hbmRfd2FpdCAoZXEsIG51bV9iYW5kcywgZCk7CisgICAgICBkIC09IHN0ZXA7CisgICAgfQorICAgIGQgPSAtMjQuMDsKKyAgICB3aGlsZSAoIXN0b3AgJiYgZCA8PSAwLjApIHsKKyAgICAgIHN0b3AgPSBlcXVhbGl6ZXJfc2V0X2FsbF9iYW5kX3ZhbHVlc19hbmRfd2FpdCAoZXEsIG51bV9iYW5kcywgZCk7CisgICAgICBkICs9IHN0ZXA7CisgICAgfQorICB9Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBnY2hhciAqb3B0X2F1ZGlvc2lua19zdHIgPSBOVUxMOworICBnY2hhciAqKmZpbGVuYW1lcyA9IE5VTEw7CisgIGNvbnN0IEdPcHRpb25FbnRyeSB0ZXN0X2dvcHRpb25zW10gPSB7CisgICAgeyJhdWRpb3NpbmsiLCAnXDAnLCAwLCBHX09QVElPTl9BUkdfU1RSSU5HLCAmb3B0X2F1ZGlvc2lua19zdHIsCisgICAgICAgICJhdWRpb3NpbmsgdG8gdXNlIChkZWZhdWx0OiBhdXRvYXVkaW9zaW5rKSIsIE5VTEx9LAorICAgIHtHX09QVElPTl9SRU1BSU5JTkcsIDAsIDAsIEdfT1BUSU9OX0FSR19GSUxFTkFNRV9BUlJBWSwgJmZpbGVuYW1lcywgTlVMTH0sCisgICAge05VTEwsICdcMCcsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEx9CisgIH07CisgIEdPcHRpb25Db250ZXh0ICpjdHg7CisgIEdFcnJvciAqb3B0X2VyciA9IE5VTEw7CisKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RFbGVtZW50ICpwbGF5YmluLCAqc2luaywgKmJpbiwgKmVxLCAqYXVjb252OworICBHc3RQYWQgKmVxX3NpbmtwYWQ7CisgIGdjaGFyICp1cmk7CisKKyAgLyogY29tbWFuZCBsaW5lIG9wdGlvbiBwYXJzaW5nICovCisgIGN0eCA9IGdfb3B0aW9uX2NvbnRleHRfbmV3ICgiRklMRU5BTUUiKTsKKyAgZ19vcHRpb25fY29udGV4dF9hZGRfZ3JvdXAgKGN0eCwgZ3N0X2luaXRfZ2V0X29wdGlvbl9ncm91cCAoKSk7CisgIGdfb3B0aW9uX2NvbnRleHRfYWRkX21haW5fZW50cmllcyAoY3R4LCB0ZXN0X2dvcHRpb25zLCBOVUxMKTsKKworICBpZiAoIWdfb3B0aW9uX2NvbnRleHRfcGFyc2UgKGN0eCwgJmFyZ2MsICZhcmd2LCAmb3B0X2VycikpIHsKKyAgICBnX2Vycm9yICgiRXJyb3IgcGFyc2luZyBjb21tYW5kIGxpbmUgb3B0aW9uczogJXMiLCBvcHRfZXJyLT5tZXNzYWdlKTsKKyAgICBnX29wdGlvbl9jb250ZXh0X2ZyZWUgKGN0eCk7CisgICAgZ19jbGVhcl9lcnJvciAoJm9wdF9lcnIpOworICAgIHJldHVybiAtMTsKKyAgfQorICBnX29wdGlvbl9jb250ZXh0X2ZyZWUgKGN0eCk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGVxdWFsaXplcl90ZXN0X2RlYnVnLCAiZXF1YWxpemVydGVzdCIsIDAsICJlcXRlc3QiKTsKKworICBpZiAoZmlsZW5hbWVzID09IE5VTEwgfHwgKmZpbGVuYW1lcyA9PSBOVUxMKSB7CisgICAgZ19wcmludGVyciAoIlBsZWFzZSBzcGVjaWZ5IGEgZmlsZSB0byBwbGF5IGJhY2tcbiIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHBsYXliaW4gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJwbGF5YmluIiwgInBsYXliaW4iKTsKKyAgaWYgKHBsYXliaW4gPT0gTlVMTCkgeworICAgIGdfZXJyb3IgKCJDb3VsZG4ndCBjcmVhdGUgJ3BsYXliaW4nIGVsZW1lbnQiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAob3B0X2F1ZGlvc2lua19zdHIpIHsKKyAgICBnX3ByaW50ICgiVHJ5aW5nIGF1ZGlvc2luayAnJXMnIC4uLiIsIG9wdF9hdWRpb3Npbmtfc3RyKTsKKyAgICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlIChvcHRfYXVkaW9zaW5rX3N0ciwgInNpbmsiKTsKKyAgICBnX3ByaW50ICgiJXNcbiIsIChzaW5rKSA/ICJvayIgOiAiZWxlbWVudCBjb3VsZG4ndCBiZSBjcmVhdGVkIik7CisgIH0gZWxzZSB7CisgICAgc2luayA9IE5VTEw7CisgIH0KKyAgaWYgKHNpbmsgPT0gTlVMTCkgeworICAgIGdfcHJpbnQgKCJUcnlpbmcgYXVkaW9zaW5rICclcycgLi4uIiwgImF1dG9hdWRpb3NpbmsiKTsKKyAgICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXV0b2F1ZGlvc2luayIsICJzaW5rIik7CisgICAgZ19wcmludCAoIiVzXG4iLCAoc2luaykgPyAib2siIDogImVsZW1lbnQgY291bGRuJ3QgYmUgY3JlYXRlZCIpOworICB9CisgIGlmIChzaW5rID09IE5VTEwpIHsKKyAgICBnX3ByaW50ICgiVHJ5aW5nIGF1ZGlvc2luayAnJXMnIC4uLiIsICJhbHNhc2luayIpOworICAgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhbHNhc2luayIsICJzaW5rIik7CisgICAgZ19wcmludCAoIiVzXG4iLCAoc2luaykgPyAib2siIDogImVsZW1lbnQgY291bGRuJ3QgYmUgY3JlYXRlZCIpOworICB9CisgIGlmIChzaW5rID09IE5VTEwpIHsKKyAgICBnX3ByaW50ICgiVHJ5aW5nIGF1ZGlvc2luayAnJXMnIC4uLiIsICJvc3NzaW5rIik7CisgICAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoIm9zc3NpbmsiLCAic2luayIpOworICAgIGdfcHJpbnQgKCIlc1xuIiwgKHNpbmspID8gIm9rIiA6ICJlbGVtZW50IGNvdWxkbid0IGJlIGNyZWF0ZWQiKTsKKyAgfQorCisgIGdfYXNzZXJ0IChzaW5rICE9IE5VTEwpOworCisgIGJpbiA9IGdzdF9iaW5fbmV3ICgiYXVzaW5rYmluIik7CisgIGdfYXNzZXJ0IChiaW4gIT0gTlVMTCk7CisKKyAgZXEgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJlcXVhbGl6ZXItbmJhbmRzIiwgImVxdWFsaXplciIpOworICBnX2Fzc2VydCAoZXEgIT0gTlVMTCk7CisKKyAgYXVjb252ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW9jb252ZXJ0IiwgImVxYXVjb252Iik7CisgIGdfYXNzZXJ0IChhdWNvbnYgIT0gTlVMTCk7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAoYmluKSwgZXEsIGF1Y29udiwgc2luaywgTlVMTCk7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rIChlcSwgYXVjb252KSkKKyAgICBnX2Vycm9yICgiRmFpbGVkIHRvIGxpbmsgZXF1YWxpemVyIHRvIGF1ZGlvY29udmVydCIpOworCisgIGlmICghZ3N0X2VsZW1lbnRfbGluayAoYXVjb252LCBzaW5rKSkKKyAgICBnX2Vycm9yICgiRmFpbGVkIHRvIGxpbmsgYXVkaW9jb252ZXJ0IHRvIGF1ZGlvIHNpbmsiKTsKKworICBlcV9zaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGVxLCAic2luayIpOworICBnX2Fzc2VydCAoZXFfc2lua3BhZCAhPSBOVUxMKTsKKworICBnc3RfZWxlbWVudF9hZGRfcGFkIChiaW4sIGdzdF9naG9zdF9wYWRfbmV3IChOVUxMLCBlcV9zaW5rcGFkKSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGVxX3NpbmtwYWQpOworCisgIGdfb2JqZWN0X3NldCAocGxheWJpbiwgImF1ZGlvLXNpbmsiLCBiaW4sIE5VTEwpOworCisgIC8qIHdvbid0IHdvcms6IHVyaSA9IGdzdF91cmlfY29uc3RydWN0ICgiZmlsZSIsIGZpbGVuYW1lc1swXSk7ICovCisgIHVyaSA9IGdfc3RyZHVwX3ByaW50ZiAoImZpbGU6Ly8lcyIsIGZpbGVuYW1lc1swXSk7CisgIGdfb2JqZWN0X3NldCAocGxheWJpbiwgInVyaSIsIHVyaSwgTlVMTCk7CisgIGdfZnJlZSAodXJpKTsKKworICBwaXBlbGluZV9idXMgPSBHU1RfRUxFTUVOVF9CVVMgKHBsYXliaW4pOworCisgIHJldCA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGxheWJpbiwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkgeworICAgIGdfcHJpbnRlcnIgKCJGYWlsZWQgdG8gc2V0IHBsYXliaW4gdG8gUExBWUlOR1xuIik7CisgICAgY2hlY2tfYnVzICgxICogR1NUX1NFQ09ORCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0ID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChwbGF5YmluLCBOVUxMLCBOVUxMLCA1ICogR1NUX1NFQ09ORCk7CisgIGlmIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9BU1lOQykgeworICAgIGdfcHJpbnRlcnIgKCJGYWlsZWQgdG8gZ28gdG8gUExBWUlORyBpbiA1IHNlY29uZHMsIGJhaWxpbmcgb3V0XG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0gZWxzZSBpZiAocmV0ICE9IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUykgeworICAgIGdfcHJpbnRlcnIgKCJTdGF0ZSBjaGFuZ2UgdG8gUExBWUlORyBmYWlsZWRcbiIpOworICAgIGNoZWNrX2J1cyAoMSAqIEdTVF9TRUNPTkQpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGdfcHJpbnQgKCJQbGF5aW5nIC4uLlxuIik7CisgIGRvX3NsaWRlcl9maWRkbGluZyAocGxheWJpbiwgZXEpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGxheWJpbiwgR1NUX1NUQVRFX05VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChwbGF5YmluKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ljbGVzL2dka3BpeGJ1Zm92ZXJsYXktdGVzdC5jIGIvdGVzdHMvaWNsZXMvZ2RrcGl4YnVmb3ZlcmxheS10ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUyNzZlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ljbGVzL2dka3BpeGJ1Zm92ZXJsYXktdGVzdC5jCkBAIC0wLDAgKzEsMjc4IEBACisvKiBHU3RyZWFtZXIgZ2RrcGl4YnVmb3ZlcmxheSB0ZXN0IGFwcAorICogQ29weXJpZ2h0IChDKSAyMDE0IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBjb20+CisKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdpby9naW8uaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z2RrLXBpeGJ1Zi9nZGstcGl4YnVmLmg+CisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNkZWZpbmUgVklERU9fV0lEVEggNzIwCisjZGVmaW5lIFZJREVPX0hFSUdIVCA0ODAKKyNkZWZpbmUgVklERU9fRlBTIDUwCisKKy8qIEdka1BpeGJ1ZiBSR0JBIEMtU291cmNlIGltYWdlIGR1bXAgZnJvbSBnZGstcGl4YnVmLWNzb3VyY2UgLS1yYXcsCisgKiBnemlwcGVkIGFuZCB0aGVuIGJhc2U2NCBlbmNvZGVkICovCitjb25zdCBnY2hhciBnemlwcGVkX3BpeGRhdGFfYmFzZTY0W10gPQorICAgICJINHNJQ1BYL1oxUUFBMnh2WjI4dWNHbDRBTzJkc1pIck5oQ0crZXdLMklJNjRDbHlyaG1uVHRTQmg0a0xVT0xRQVV1d0VoU2dGdGlBIgorICAgICJBN2Fnd0Eyd0JUNUFYSjV3NFA1TGdLTEVPOTdlekRmMlNDQUlBZnRqRnd1UTcvYy8vL29qeS83Nys4ZVA3SmNzKy9XZkxNdit0L3pXIgorICAgICJkVjMycFNtSzNISzZzWFpiRk9YVjlQWmZXaXBMYldrc0hkSFFaeFZwWlArRWU3dTYyL2Q3cnQwZml2SXFpbUpuT1grdy96aGF1cTY4IgorICAgICJhV2pldmZkVVIxaDN2WHEvS01xenVmdWVGTjFKMUZFK3N0ZjhLZkN6b2JaM3EvZVBvanlUM3Y4Z0RTeUIwOUdGTkQ3Zy9OMDE0cnBsIgorICAgICI0MXhGK1d6MC9pODE3bndGamVwUCtSYjBQbkR3T1VPZWhlUHlRcTFldXJsclNrWFpPa1Z4N09ibGJHSzQzdXBmK3pjcXlsZGhPVDIyIgorICAgICI1R3ZWOXluS1hJcmlRRHBLeWUyNDJMZGN2ZTJLc2tYNmRlYVJXVmVlYm5wZHUzMktvcnljNHQvaWFLa3NtbTlWdmczVzNuZVdrK1ZzIgorICAgICJxUzJ0cFNPdTlObVp0TEc0ZjdSMTVwYVM3alhjdDFxN1h4VGwyWkRkMTU3ZHAxQS82cTlJKzFXZytRSDFnOHBtY2I3TTBzelVIc2VWIgorICAgICIvS1RUdEpnMzlYeXVkSC9OQVNtYmhmek9VdHFUTkhtaGV3MWNnbGhUOWFkOE8xNmt2N200ZUZUMy9wVk5RNzdJWDhzaExnVy9SbnNXIgorICAgICJMaTdWNXk0VUphRG85d25PVDlTanExZnpuNG9TUVhIZnQ0dFowMFZwcjVqSTN5aUt3bU8xc3kvNjNHWkt6TnBTK2RWeUxzYVluZVZrIgorICAgICJVZCtyYklxaTMyTS9rQzdEdGFYem42dnQ5Vm05NVpiUzBsZzY0cngybnluS2R5SFEzb0MrQTA2WnhkdGJrenRXdW5kcHFTMWZLbzVqIgorICAgICI5T2ZROCtqS0pOYlc5ODdleWU0N1FHTzVXRTZ1L0JQYWtKUDJydDQ5MjdYN0poYW5OYUJCelFVcEVNYm1VMmhKazY2TzJmdHQ3bHJTIgorICAgICJmOHZjNHlsKzBQN2xsc3B5V2FwT2wzdGg5SGRkZTR5Vno0bTE3ZU1EMnBQOFpCWGpJMGwzSjdvRzFSZjFEbEg3ZHlCT3BLdUIyK2RCIgorICAgICIyWnpLWFMzdWd3OStsbktaQjQ5b0gyYkwxb3dHSDlLNHZYNVA3WWcrMCtPMS9Vai9YU1JtOGVwOVdzNkxjbHJSZmUrTjEreFlJeGp6IgorICAgICI0OUpyaDZEK202OGluU3lwUGVRamE3cFhSWnAzL3oxUDZNN1hNK3hYKzdlem5FbEhjM0U2M0h2MnhXbW9vODlINHlMRW5wRGcrb3JxIgorICAgICJEc25KRnE3b1dxWXRMaGQ3c2JUZzNpM2RMMlZPMlhsdDVPbzdEelkxVWM4VnRPbmc5ZU1adFAwY3Rwbm1KYTc4N1RjbS9qYlV0bUhjIgorICAgICJ4Zm1HK3AwYnd6MFI5dDFoWXIzM1dUZ2ovWkVmZTFSN0hmbkozTk5DakliS29QOGYxU0JuMncyTnEzaHRZSTlvN3VCb3BuUkk5bm1PIgorICAgICJyTS9admVpamhXdWxlZStERnJ4MnhaU0hlMEdtbjk5aXg1c2Q5NkErMUU5N3c4OHBCOGJYMUFCdWJmWUs0RHhHK21zWVBiV1drc3FVIgorICAgICJndTVhMHUvTzY4UFEzdDk5aFdGOGtXOXZDMmdRYVdUeVd0RDJzQjVVVnpPaEdlUkxKUjJ5L3BCMGs5UkhnQ3F4WGFQMmtQNVFuOVRVIgorICAgICJuK0hlN3J1bXdPL2o1b1NyMEZhblFaZi9qSXAzMys2NTBxWFhqU2oyRlAyK3k1OEFiWVZyUHM1UGp1eU94c1R2cTVIK3lZYjhNb2ZnIgorICAgICJ1OHJnbUtiMnZxL0MrbFB0TUxqMktPakJieVBTcVRTM045VDJZL0Q1U2JBdGR0MXI0dWFwb1o5aWZlK1Zyb0h6bFFuMlpDZjBkdzdLIgorICAgICI3cmsyQ24yVk1vNnoxNXBQMUtQenQ1TjcyTFQrNC9RMzZodjdkK1I4SU5OL29SMnpkdW5aRWN5dkFOdUVQajNTTmxrTm12SGNJWTZ4IgorICAgICI0ZWVIV2JraVNmdWd2QlQzamVMWWlmS2RDZGFIZ2diQytRN1ZpK1lPcml6blc1UEc4QkVOQWozRzVGWVFUc3NsV3ZjeHVxcUFCa2U2IgorICAgICJvWHpvcUd5RWZjQzFrdW5uWFJSdmNmT20yTjltT280c3pYMWRmL0RuQjRQOUJic09NbUFOTlhmOEY5VGdhQjFwNUxscHBCZWhmcisvIgorICAgICIwUGl3dWhKK1kraGJwWHBiR3NOYkx0VGNjNjZMUHpQMzF1K3JEem5QZXNKUERublM1Tnkyb01HUm5TZG9FT1ZFUmpwRTJxVHZUbUFjIgorICAgICJwR3VRN1lnNUV5UDdRRFkzZ2pRb3pSRXpOSWhpTlhUdjFOaTFCZU9DeXZ2eE9KcXpVSnR6VUQ2TVdhWDF3S2Q0UDlIYmdtZmRoRndMIgorICAgICJwMEZPcjl4NkVPbmdtdEtIcHQ4VEdOVXhjUTJ5VFhHZU5MTC9sSHo0UXhvMDkvMHROTjhnSDR6YWluSWN5SzdadUY3UTRENmlEYWwxIgorICAgICIxa0U1WkQrYmZEK0RzQjQ4QnVYeTdMNy8vbUV2Z3VscktXZDNpeVVpN1pQelMrSjZDMXd6K1h5RmtmTVdCMEQwMnRIcmwyRmZNRFlYIgorICAgICJ5ZlV2aXRYZzJRdkJybEhNeU00SkVXM29xQys1L29yeW13YkVVV3RyNWNrNjVQS2lkVkNHeTRsZWg3MUFaZ3dsdjlKTjZWRFFzWlNQIgorICAgICJRZGRNK2lVdzduTTVCSFduN2pXS2JSZjZWc3JKY2pFRnRHdWcyZHI3SHZudE9ZUWE1T2FuVFQ4alkvLzJ0TWNYYXV4Q3VWQk9vKzluIgorICAgICJZWVJ4bk5JaHZON2cyQW5HSStpYW1ENHc2Ym53cU44MTBRY3RhVU02VjhMbERKRlBrOWE3cWZsbHptZFZFVzJZZzE4dm1rYy94VHJ3IgorICAgICJ5VHFVOXVERC9mZ0srYjlFSGNLMW5UREdjRjBIcm9rNkd5dTAwYzMzS0JabGlmenRZWTZmUGJjRzJwb1Vxd2wyTGVXWHVYdjRPVkVwIgorICAgICI5NVhVWC82WW9qNWJXeDh2MEY4T2ZOM2c3MnJTM1RGV2V3azZSSHVIWE93a2pvWGhmVm5zT2NkRmM1eFVKL0p0bzdnS2xFWDV4VWxOIgorICAgICJ4L1QvUk52RnZoQTBHRFhuQ2ZlZFBZOStaVWhqdnU0V2Z5NVAwQ0hLb1hHYUVNY2kxVFlqN3NmcUpiSSt1QmZ3U051RmVsUFBYa3ArIgorICAgICJrODIzQkdYUVd1R2gzQW1ZUnpmOXpwS01PZnZ5WUI4dUVpdUM4WlhPMDB6dVowMjBHODNyczhZL3hVOGdtd2NhUlBWS2ErdWsvTExoIgorICAgICI4eTFOVUViS2ZjK2F3dzNlUC94UzczeElCZXo1WGJLUHp3dVczSDRoNkVjM2o2RTliYTZQa1I5TUdndkJObVBiTGVYYTU4VGZLUnFNIgorICAgICJicnRKUEp1VG9tL3ZHbTRkd0oybFFYbXNXZS9jTTRsN21GdEJPQ2NqUFIrQjlpTUdXNExuR1dMSGE0YmR6TnFiajZ3ajJRWUVYWVgrIgorICAgICJKUFdNS2xjT3ZwZEVhSWNVdTBibFVBMWVYN0JuYng3b3MwMi9ONGlMUlNNWTdRdWFjV3dTYzI0WWpoWFFneFEvc1Q0czBRYlFzMmtPIgorICAgICJkbDFvK2hpWXMwOXAvOHgvN2tQYXF3LzNHWkdma1BibWthOUM1d2lRMzBSekpkcDNSMmNUaDNNS296azZ0YTFiZ2ZZR1V6VTQyc01YIgorICAgICJ4c1AxcTR0dHVMeGZjaTdQczE4L1J3ZlBJNmYyeDRRT0cwODcvbThhclJsTjJ2Tjl5UCtHNXlpVGNwRVRiVUJ4Q3BvN2tHWnpvZjNEIgorICAgICJPd0dHNTZjYTcvTndEa2Ryd2MxcVVOaVhUNEhyeDlobjFXTE9qMG43d0RGN1Zja2E5R3czOWx5TDlHejUxUDc4ZWJBdjFHOUJmV2l2IgorICAgICJBMmtRK21LaHpiUDJhRXo4czhEc21XR0RmYnhqYy8rT0VORGZpYjRiM3VOVWVqbVpxR2Q4Zy81RVkzazFDV3QyY3o5bk9OUjM4MFhNIgorICAgICIrSFB2SGxuaXZVL2NlMTlhQTk2RkEvVHNQMjk4NHE2amNwZWcvZjc1a1R5b3h3ZkZpU1c2WmtKTEhESHZ0OG5wOTNIdjN4bGlDTFQyIgorICAgICJPSUV4M09UZUlMTWYyRXp0Q1lLWU5jWUcyZk1RaXZLZFliUVVwWTFzL002WlRjYnBpdkpNTXY1WnBkaG43bWRwVjFHVU8xbC9OalRVIgorICAgICJVc3g3WjhJejNadU0weFhsRldUOHM0Q3NEa216SlpQRDBUaFVVV2FTeWU4VEhaNlJxT2ovdWYyTDFmNzlUMFhaQ3BuOHZKSjBQa2I5IgorICAgICJuNklzQ09Wb0JwL0h2Uyttb2U4MytUNGRSVkVVWlJteW4yRjlzd2w5eUFBQSI7CisKK3N0YXRpYyBHZGtQaXhidWYgKmxvZ29fcGl4YnVmOworCitzdGF0aWMgR01haW5Mb29wICptYWluX2xvb3A7CitzdGF0aWMgZ2ludCBjb3VudDsKKworc3RhdGljIEdka1BpeGJ1ZiAqCitjcmVhdGVfb3ZlcmxheV9waXhidWYgKHZvaWQpCit7CisgIEdabGliRGVjb21wcmVzc29yICpkZWNvbXByZXNzOworICBHQ29udmVydGVyUmVzdWx0IGRlY29tcF9yZXM7CisgIGd1Y2hhciAqZ3ppcHBlZF9waXhkYXRhLCAqcGl4ZGF0YSwgKnBpeGVsc19jb3B5OworICBnc2l6ZSBnemlwcGVkX3NpemUsIGJ5dGVzX3JlYWQsIHBpeGRhdGFfc2l6ZTsKKyAgZ3VpbnQgc3RyaWRlLCB3aWR0aCwgaGVpZ2h0OworICBHZGtQaXhidWYgKnBpeGJ1ZjsKKworICBnemlwcGVkX3BpeGRhdGEgPSBnX2Jhc2U2NF9kZWNvZGUgKGd6aXBwZWRfcGl4ZGF0YV9iYXNlNjQsICZnemlwcGVkX3NpemUpOworICBnX2Fzc2VydCAoZ3ppcHBlZF9waXhkYXRhICE9IE5VTEwpOworCisgIHBpeGRhdGEgPSBnX21hbGxvYyAoNjQgKiAxMDI0KTsKKworICBkZWNvbXByZXNzID0gZ196bGliX2RlY29tcHJlc3Nvcl9uZXcgKEdfWkxJQl9DT01QUkVTU09SX0ZPUk1BVF9HWklQKTsKKyAgZGVjb21wX3JlcyA9IGdfY29udmVydGVyX2NvbnZlcnQgKEdfQ09OVkVSVEVSIChkZWNvbXByZXNzKSwKKyAgICAgIGd6aXBwZWRfcGl4ZGF0YSwgZ3ppcHBlZF9zaXplLCBwaXhkYXRhLCA2NCAqIDEwMjQsCisgICAgICBHX0NPTlZFUlRFUl9JTlBVVF9BVF9FTkQsICZieXRlc19yZWFkLCAmcGl4ZGF0YV9zaXplLCBOVUxMKTsKKyAgZ19hc3NlcnQgKGRlY29tcF9yZXMgPT0gR19DT05WRVJURVJfRklOSVNIRUQpOworICBnX2Fzc2VydCAoYnl0ZXNfcmVhZCA9PSBnemlwcGVkX3NpemUpOworICBnX2ZyZWUgKGd6aXBwZWRfcGl4ZGF0YSk7CisgIGdfb2JqZWN0X3VucmVmIChkZWNvbXByZXNzKTsKKworICAvKiAwOiBQaXhidWYgbWFnaWMgKDB4NDc2NDZiNTApICovCisgIGdfYXNzZXJ0IChHU1RfUkVBRF9VSU5UMzJfQkUgKHBpeGRhdGEpID09IDB4NDc2NDZiNTApOworCisgIC8qIHBpeGRhdGEgbGVuZ3RoICovCisgIHBpeGRhdGFfc2l6ZSA9IEdTVF9SRUFEX1VJTlQzMl9CRSAocGl4ZGF0YSArIDQpOworICBnX2Fzc2VydCAocGl4ZGF0YV9zaXplID4gNCArIDQgKyA0ICsgNCArIDQgKyA0KTsKKworICAvKiByYXcsIDgtYml0IGRlcHRoLCBSR0JBICovCisgIGdfYXNzZXJ0IChHU1RfUkVBRF9VSU5UMzJfQkUgKHBpeGRhdGEgKyA4KSA9PSAweDAxMDEwMDAyKTsKKworICBzdHJpZGUgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKHBpeGRhdGEgKyAxMik7CisgIHdpZHRoID0gR1NUX1JFQURfVUlOVDMyX0JFIChwaXhkYXRhICsgMTYpOworICBoZWlnaHQgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKHBpeGRhdGEgKyAyMCk7CisKKyAgZ19hc3NlcnQgKHBpeGRhdGFfc2l6ZSA9PSAyNCArIGhlaWdodCAqIHN0cmlkZSk7CisKKyAgcGl4ZWxzX2NvcHkgPSBnX21lbWR1cCAocGl4ZGF0YSArIDI0LCBoZWlnaHQgKiBzdHJpZGUpOworCisgIHBpeGJ1ZiA9CisgICAgICBnZGtfcGl4YnVmX25ld19mcm9tX2RhdGEgKHBpeGVsc19jb3B5LCBHREtfQ09MT1JTUEFDRV9SR0IsIFRSVUUsIDgsCisgICAgICB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIChHZGtQaXhidWZEZXN0cm95Tm90aWZ5KSBnX2ZyZWUsIHBpeGVsc19jb3B5KTsKKworICBnX2Fzc2VydCAocGl4YnVmICE9IE5VTEwpOworCisgIGdfZnJlZSAocGl4ZGF0YSk7CisKKyAgcmV0dXJuIHBpeGJ1ZjsKK30KKworc3RhdGljIGdib29sZWFuCitidXNfY2IgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1zZywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHTWFpbkxvb3AgKmxvb3AgPSB1c2VyX2RhdGE7CisKKyAgc3dpdGNoIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpKSB7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FUlJPUjp7CisgICAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisgICAgICBnY2hhciAqZGJnOworCisgICAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobXNnLCAmZXJyLCAmZGJnKTsKKyAgICAgIGdzdF9vYmplY3RfZGVmYXVsdF9lcnJvciAobXNnLT5zcmMsIGVyciwgZGJnKTsKKyAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgZ19mcmVlIChkYmcpOworICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBUUlVFOworfQorCisjZGVmaW5lIFNQRUVEX1NDQUxFX0ZBQ1RPUiAoVklERU9fRlBTICogNCkKKworLyogbmlja2VkIGZyb20gdmlkZW90ZXN0c3JjJ3MgYmFsbCBwYXR0ZXJuIHJlbmRlcmVyICovCitzdGF0aWMgdm9pZAorY2FsY3VsYXRlX3Bvc2l0aW9uIChnaW50ICogeCwgZ2ludCAqIHksIGd1aW50IGxvZ29fdywgZ3VpbnQgbG9nb19oLCBndWludCBuKQoreworICBndWludCByX3ggPSBsb2dvX3cgLyAyOworICBndWludCByX3kgPSBsb2dvX2ggLyAyOworICBndWludCB3ID0gVklERU9fV0lEVEggKyBsb2dvX3c7CisgIGd1aW50IGggPSBWSURFT19IRUlHSFQgKyBsb2dvX2g7CisKKyAgKnggPSByX3ggKyAoMC41ICsgMC41ICogc2luICgyICogR19QSSAqIG4gLyBTUEVFRF9TQ0FMRV9GQUNUT1IpKQorICAgICAgKiAodyAtIDIgKiByX3gpOworICAqeSA9IHJfeSArICgwLjUgKyAwLjUgKiBzaW4gKDIgKiBHX1BJICogc3FydCAoMikgKiBuIC8gU1BFRURfU0NBTEVfRkFDVE9SKSkKKyAgICAgICogKGggLSAyICogcl95KTsKKworICAqeCAtPSBsb2dvX3c7CisgICp5IC09IGxvZ29faDsKK30KKworc3RhdGljIEdzdFBhZFByb2JlUmV0dXJuCitidWZmZXJfY2IgKEdzdFBhZCAqIHBhZCwgR3N0UGFkUHJvYmVJbmZvICogaW5mbywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RFbGVtZW50ICpvdmVybGF5ID0gR1NUX1BBRF9QQVJFTlQgKHBhZCk7CisgIGdpbnQgeCwgeSwgdywgaDsKKworICB3ID0gZ2RrX3BpeGJ1Zl9nZXRfd2lkdGggKGxvZ29fcGl4YnVmKTsKKyAgaCA9IGdka19waXhidWZfZ2V0X2hlaWdodCAobG9nb19waXhidWYpOworCisgIGNhbGN1bGF0ZV9wb3NpdGlvbiAoJngsICZ5LCB3LCBoLCArK2NvdW50KTsKKworICBHU1RfTE9HICgiJTNkLCAlM2QiLCB4LCB5KTsKKworICBnX29iamVjdF9zZXQgKG92ZXJsYXksICJvZmZzZXQteCIsIHgsICJvZmZzZXQteSIsIHksIE5VTEwpOworCisgIHJldHVybiBHU1RfUEFEX1BST0JFX09LOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgR09wdGlvbkVudHJ5IG9wdGlvbnNbXSA9IHsKKyAgICB7TlVMTH0KKyAgfTsKKyAgR09wdGlvbkNvbnRleHQgKmN0eDsKKyAgR0Vycm9yICplcnIgPSBOVUxMOworICBHc3RFbGVtZW50ICpzcmMsICpxLCAqY2Fwc2ZpbHRlciwgKm92ZXJsYXksICpzaW5rOworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0UGFkICpzaW5rX3BhZDsKKyAgR3N0Q2FwcyAqZmlsdGVyX2NhcHM7CisKKyAgY3R4ID0gZ19vcHRpb25fY29udGV4dF9uZXcgKCIiKTsKKyAgZ19vcHRpb25fY29udGV4dF9hZGRfbWFpbl9lbnRyaWVzIChjdHgsIG9wdGlvbnMsIEdFVFRFWFRfUEFDS0FHRSk7CisgIGdfb3B0aW9uX2NvbnRleHRfYWRkX2dyb3VwIChjdHgsIGdzdF9pbml0X2dldF9vcHRpb25fZ3JvdXAgKCkpOworICBpZiAoIWdfb3B0aW9uX2NvbnRleHRfcGFyc2UgKGN0eCwgJmFyZ2MsICZhcmd2LCAmZXJyKSkgeworICAgIGdfcHJpbnQgKCJFcnJvciBpbml0aWFsaXppbmc6ICVzXG4iLCBlcnItPm1lc3NhZ2UpOworICAgIGdfb3B0aW9uX2NvbnRleHRfZnJlZSAoY3R4KTsKKyAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBnX29wdGlvbl9jb250ZXh0X2ZyZWUgKGN0eCk7CisKKyAgbG9nb19waXhidWYgPSBjcmVhdGVfb3ZlcmxheV9waXhidWYgKCk7CisKKyAgbWFpbl9sb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisKKyAgcGlwZWxpbmUgPSBnc3RfcGlwZWxpbmVfbmV3ICgicGlwZWxpbmUiKTsKKworICBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCBOVUxMKTsKKyAgZ3N0X3V0aWxfc2V0X29iamVjdF9hcmcgKEdfT0JKRUNUIChzcmMpLCAicGF0dGVybiIsICJ3aGl0ZSIpOworCisgIG92ZXJsYXkgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJnZGtwaXhidWZvdmVybGF5IiwgTlVMTCk7CisKKyAgLyogc2V0IHBvc2l0aW9uaW5nLW1vZGUgdG8gYWJzb2x1dGUgc28gd2UgY2FuIHNldCBuZWdhdGl2ZSBwb3NpdGlvbnMgKi8KKyAgZ19vYmplY3Rfc2V0IChvdmVybGF5LCAicGl4YnVmIiwgbG9nb19waXhidWYsICJwb3NpdGlvbmluZy1tb2RlIiwgMSwgTlVMTCk7CisKKyAgc2lua19wYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAob3ZlcmxheSwgInNpbmsiKTsKKyAgZ3N0X3BhZF9hZGRfcHJvYmUgKHNpbmtfcGFkLCBHU1RfUEFEX1BST0JFX1RZUEVfQlVGRkVSLCBidWZmZXJfY2IsIE5VTEwsCisgICAgICBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua19wYWQpOworCisgIHEgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJxdWV1ZSIsIE5VTEwpOworCisgIGNhcHNmaWx0ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJjYXBzZmlsdGVyIiwgTlVMTCk7CisgIGZpbHRlcl9jYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKCJ2aWRlby94LXJhdywgZm9ybWF0ID0gIgorICAgICAgR1NUX1ZJREVPX09WRVJMQVlfQ09NUE9TSVRJT05fQkxFTkRfRk9STUFUUyk7CisgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGZpbHRlcl9jYXBzLAorICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgVklERU9fV0lEVEgsCisgICAgICAiaGVpZ2h0IiwgR19UWVBFX0lOVCwgVklERU9fSEVJR0hULAorICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLCBWSURFT19GUFMsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKGNhcHNmaWx0ZXIsICJjYXBzIiwgZmlsdGVyX2NhcHMsIE5VTEwpOworICBnc3RfY2Fwc191bnJlZiAoZmlsdGVyX2NhcHMpOworCisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ4aW1hZ2VzaW5rIiwgTlVMTCk7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBzcmMsIHEsIG92ZXJsYXksIGNhcHNmaWx0ZXIsIHNpbmssCisgICAgICBOVUxMKTsKKworICBnc3RfZWxlbWVudF9saW5rX21hbnkgKHNyYywgcSwgb3ZlcmxheSwgY2Fwc2ZpbHRlciwgc2luaywgTlVMTCk7CisKKyAgY291bnQgPSAwOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICBnc3RfYnVzX2FkZF93YXRjaCAoR1NUX0VMRU1FTlRfQlVTIChwaXBlbGluZSksIGJ1c19jYiwgbWFpbl9sb29wKTsKKworICBnX21haW5fbG9vcF9ydW4gKG1haW5fbG9vcCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisgIGdfb2JqZWN0X3VucmVmIChsb2dvX3BpeGJ1Zik7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pY2xlcy9nZGtwaXhidWZzaW5rLXRlc3QuYyBiL3Rlc3RzL2ljbGVzL2dka3BpeGJ1ZnNpbmstdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMjgyNWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pY2xlcy9nZGtwaXhidWZzaW5rLXRlc3QuYwpAQCAtMCwwICsxLDM2NCBAQAorLyogR1N0cmVhbWVyIGludGVyYWN0aXZlIHRlc3QgZm9yIHRoZSBnZGtwaXhidWZzaW5rIGVsZW1lbnQKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3RrL2d0ay5oPgorCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RFbGVtZW50ICpwaXBlOworICBHc3RFbGVtZW50ICpzaW5rOworICBnYm9vbGVhbiBnb3RfdmlkZW87CisKKyAgR3RrV2lkZ2V0ICp3aW47CisgIEd0a1dpZGdldCAqaW1nOworICBHdGtXaWRnZXQgKnNsaWRlcjsKKyAgR3RrV2lkZ2V0ICphY2N1cmF0ZV9jYjsKKworICBnYm9vbGVhbiBhY2N1cmF0ZTsgICAgICAgICAgICAvKiB3aGV0aGVyIHRvIHRyeSBhY2N1cmF0ZSBzZWVrcyAqLworCisgIGdpbnQ2NCBjdXJfcG9zOworICBnYm9vbGVhbiBwcmVyb2xsZWQ7Cit9IEFwcEluZm87CisKK3N0YXRpYyB2b2lkIHNlZWtfdG8gKEFwcEluZm8gKiBpbmZvLCBnZG91YmxlIHBlcmNlbnQpOworCitzdGF0aWMgR3N0RWxlbWVudCAqCitjcmVhdGVfZWxlbWVudCAoY29uc3QgZ2NoYXIgKiBmYWN0b3J5X25hbWUpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQ7CisKKyAgZWxlbWVudCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoZmFjdG9yeV9uYW1lLCBOVUxMKTsKKworICBpZiAoZWxlbWVudCA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJGYWlsZWQgdG8gY3JlYXRlICclcycgZWxlbWVudCIsIGZhY3RvcnlfbmFtZSk7CisKKyAgcmV0dXJuIGVsZW1lbnQ7Cit9CisKK3N0YXRpYyB2b2lkCituZXdfZGVjb2RlZF9wYWQgKEdzdEVsZW1lbnQgKiBkZWMsIEdzdFBhZCAqIG5ld19wYWQsIEFwcEluZm8gKiBpbmZvKQoreworICBjb25zdCBnY2hhciAqc25hbWU7CisgIEdzdEVsZW1lbnQgKmNzcCwgKnNjYWxlLCAqZmlsdGVyOworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdFBhZCAqc2lua3BhZDsKKworICAvKiBhbHJlYWR5IGZvdW5kIGEgdmlkZW8gc3RyZWFtPyAqLworICBpZiAoaW5mby0+Z290X3ZpZGVvKQorICAgIHJldHVybjsKKworICAvKiBGSVhNRTogaXMgdGhpcyByYWN5IG9yIGRvZXMgZGVjb2RlYmluIG1ha2Ugc3VyZSBjYXBzIGFyZSBhbHdheXMKKyAgICogbmVnb3RpYXRlZCBhdCB0aGlzIHBvaW50PyAqLworICBjYXBzID0gZ3N0X3BhZF9xdWVyeV9jYXBzIChuZXdfcGFkLCBOVUxMKTsKKyAgZ19yZXR1cm5faWZfZmFpbCAoY2FwcyAhPSBOVUxMKTsKKworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIHNuYW1lID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyk7CisgIGlmICghZ19zdHJfaGFzX3ByZWZpeCAoc25hbWUsICJ2aWRlby94LXJhdyIpKQorICAgIGdvdG8gbm90X3ZpZGVvOworCisgIGNzcCA9IGNyZWF0ZV9lbGVtZW50ICgidmlkZW9jb252ZXJ0Iik7CisgIHNjYWxlID0gY3JlYXRlX2VsZW1lbnQgKCJ2aWRlb3NjYWxlIik7CisgIGZpbHRlciA9IGNyZWF0ZV9lbGVtZW50ICgiY2Fwc2ZpbHRlciIpOworICBpbmZvLT5zaW5rID0gY3JlYXRlX2VsZW1lbnQgKCJnZGtwaXhidWZzaW5rIik7CisgIGdfb2JqZWN0X3NldCAoaW5mby0+c2luaywgInFvcyIsIEZBTFNFLCAibWF4LWxhdGVuZXNzIiwgKGdpbnQ2NCkgLSAxLCBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChpbmZvLT5waXBlKSwgY3NwLCBzY2FsZSwgZmlsdGVyLCBpbmZvLT5zaW5rLCBOVUxMKTsKKworICBzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGNzcCwgInNpbmsiKTsKKyAgaWYgKEdTVF9QQURfTElOS19GQUlMRUQgKGdzdF9wYWRfbGluayAobmV3X3BhZCwgc2lua3BhZCkpKQorICAgIGdfZXJyb3IgKCJDYW4ndCBsaW5rIG5ldyBkZWNvZGVkIHBhZCB0byB2aWRlb2NvbnZlcnQncyBzaW5rIHBhZCIpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKworICBpZiAoIWdzdF9lbGVtZW50X2xpbmsgKGNzcCwgc2NhbGUpKQorICAgIGdfZXJyb3IgKCJDYW4ndCBsaW5rIHZpZGVvY29udmVydCB0byB2aWRlb3NjYWxlIik7CisgIGlmICghZ3N0X2VsZW1lbnRfbGluayAoc2NhbGUsIGZpbHRlcikpCisgICAgZ19lcnJvciAoIkNhbid0IGxpbmsgdmlkZW9zY2FsZSB0byBjYXBzZmlsdGVyIik7CisgIGlmICghZ3N0X2VsZW1lbnRfbGluayAoZmlsdGVyLCBpbmZvLT5zaW5rKSkKKyAgICBnX2Vycm9yICgiQ2FuJ3QgbGluayBjYXBzZmlsdGVyIHRvIGdka3BpeGJ1ZnNpbmsiKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGluZm8tPnNpbmssIEdTVF9TVEFURV9QQVVTRUQpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGZpbHRlciwgR1NUX1NUQVRFX1BBVVNFRCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc2NhbGUsIEdTVF9TVEFURV9QQVVTRUQpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGNzcCwgR1NUX1NUQVRFX1BBVVNFRCk7CisKKyAgaW5mby0+Z290X3ZpZGVvID0gVFJVRTsKKyAgcmV0dXJuOworCitub3RfdmlkZW86CisgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK25vX21vcmVfcGFkcyAoR3N0RWxlbWVudCAqIGRlY29kZWJpbiwgQXBwSW5mbyAqIGluZm8pCit7CisgIGlmICghaW5mby0+Z290X3ZpZGVvKSB7CisgICAgZ19lcnJvciAoIlRoaXMgZmlsZSBkb2VzIG5vdCBjb250YWluIGEgdmlkZW8gdHJhY2ssIG9yIHlvdSBkbyBub3QgaGF2ZSAiCisgICAgICAgICJ0aGUgbmVjZXNzYXJ5IGRlY29kZXIocykgaW5zdGFsbGVkIik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2J1c19tZXNzYWdlX2NiIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtc2csIEFwcEluZm8gKiBpbmZvKQoreworICBzd2l0Y2ggKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykpIHsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0FTWU5DX0RPTkU6eworICAgICAgLyogb25seSBpbnRlcmVzdGVkIGluIGFzeW5jLWRvbmUgbWVzc2FnZXMgZnJvbSB0aGUgdG9wLWxldmVsIHBpcGVsaW5lICovCisgICAgICBpZiAobXNnLT5zcmMgIT0gR1NUX09CSkVDVF9DQVNUIChpbmZvLT5waXBlKSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGlmICghaW5mby0+cHJlcm9sbGVkKSB7CisgICAgICAgIC8qIG1ha2Ugc2xpZGVyIHZpc2libGUgaWYgaXQncyBub3QgdmlzaWJsZSBhbHJlYWR5ICovCisgICAgICAgIGd0a193aWRnZXRfc2hvdyAoaW5mby0+c2xpZGVyKTsKKworICAgICAgICAvKiBpbml0aWFsIGZyYW1lIGlzIG9mdGVuIGJsYWNrLCBzbyBzZWVrIHRvIGJlZ2lubmluZyBwbHVzIGEgYml0ICovCisgICAgICAgIHNlZWtfdG8gKGluZm8sIDAuMDAxKTsKKyAgICAgICAgaW5mby0+cHJlcm9sbGVkID0gVFJVRTsKKyAgICAgIH0KKworICAgICAgLyogdXBkYXRlIHBvc2l0aW9uICovCisgICAgICBpZiAoIWdzdF9lbGVtZW50X3F1ZXJ5X3Bvc2l0aW9uIChpbmZvLT5waXBlLCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgICAgICZpbmZvLT5jdXJfcG9zKSkKKyAgICAgICAgaW5mby0+Y3VyX3BvcyA9IC0xOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX01FU1NBR0VfRUxFTUVOVDp7CisgICAgICBjb25zdCBHVmFsdWUgKnZhbDsKKyAgICAgIEdka1BpeGJ1ZiAqcGl4YnVmID0gTlVMTDsKKyAgICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworCisgICAgICAvKiBvbmx5IGludGVyZXN0ZWQgaW4gZWxlbWVudCBtZXNzYWdlcyBmcm9tIG91ciBnZGtwaXhidWZzaW5rICovCisgICAgICBpZiAobXNnLT5zcmMgIT0gR1NUX09CSkVDVF9DQVNUIChpbmZvLT5zaW5rKSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGVzZSB0d28gbWVzc2FnZXMgKi8KKyAgICAgIGlmICghZ3N0X21lc3NhZ2VfaGFzX25hbWUgKG1zZywgInByZXJvbGwtcGl4YnVmIikgJiYKKyAgICAgICAgICAhZ3N0X21lc3NhZ2VfaGFzX25hbWUgKG1zZywgInBpeGJ1ZiIpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBnX3ByaW50ICgicGl4YnVmXG4iKTsKKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9tZXNzYWdlX2dldF9zdHJ1Y3R1cmUgKG1zZyk7CisgICAgICB2YWwgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCAicGl4YnVmIik7CisgICAgICBnX3JldHVybl9pZl9mYWlsICh2YWwgIT0gTlVMTCk7CisKKyAgICAgIHBpeGJ1ZiA9IEdES19QSVhCVUYgKGdfdmFsdWVfZHVwX29iamVjdCAodmFsKSk7CisgICAgICBndGtfaW1hZ2Vfc2V0X2Zyb21fcGl4YnVmIChHVEtfSU1BR0UgKGluZm8tPmltZyksIHBpeGJ1Zik7CisgICAgICBnX29iamVjdF91bnJlZiAocGl4YnVmKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VSUk9SOnsKKyAgICAgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgICAgIGdjaGFyICpkYmcgPSBOVUxMOworCisgICAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobXNnLCAmZXJyLCAmZGJnKTsKKyAgICAgIGdfZXJyb3IgKCJFcnJvcjogJXNcbiVzXG4iLCBlcnItPm1lc3NhZ2UsIChkYmcpID8gZGJnIDogIiIpOworICAgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgICBnX2ZyZWUgKGRiZyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorY3JlYXRlX3BpcGVsaW5lIChBcHBJbmZvICogaW5mbywgY29uc3QgZ2NoYXIgKiBmaWxlbmFtZSkKK3sKKyAgR3N0RWxlbWVudCAqc3JjLCAqZGVjOworICBHc3RCdXMgKmJ1czsKKworICBpbmZvLT5waXBlID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIHNyYyA9IGNyZWF0ZV9lbGVtZW50ICgiZmlsZXNyYyIpOworICBnX29iamVjdF9zZXQgKHNyYywgImxvY2F0aW9uIiwgZmlsZW5hbWUsIE5VTEwpOworCisgIGRlYyA9IGNyZWF0ZV9lbGVtZW50ICgiZGVjb2RlYmluIik7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAoaW5mby0+cGlwZSksIHNyYywgZGVjLCBOVUxMKTsKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rIChzcmMsIGRlYykpCisgICAgZ19lcnJvciAoIkNhbid0IGxpbmsgZmlsZXNyYyB0byBkZWNvZGViaW4iKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChkZWMsICJwYWQtYWRkZWQiLCBHX0NBTExCQUNLIChuZXdfZGVjb2RlZF9wYWQpLCBpbmZvKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChkZWMsICJuby1tb3JlLXBhZHMiLCBHX0NBTExCQUNLIChub19tb3JlX3BhZHMpLCBpbmZvKTsKKworICAvKiBzZXQgdXAgYnVzICovCisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKGluZm8tPnBpcGUpOworICBnc3RfYnVzX2FkZF9zaWduYWxfd2F0Y2ggKGJ1cyk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2UiLCBHX0NBTExCQUNLIChidXNfbWVzc2FnZV9jYiksIGluZm8pOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorc2Vla190byAoQXBwSW5mbyAqIGluZm8sIGdkb3VibGUgcGVyY2VudCkKK3sKKyAgR3N0U2Vla0ZsYWdzIHNlZWtfZmxhZ3M7CisgIGdpbnQ2NCBzZWVrX3BvcywgZHVyID0gLTE7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9xdWVyeV9kdXJhdGlvbiAoaW5mby0+cGlwZSwgR1NUX0ZPUk1BVF9USU1FLCAmZHVyKQorICAgICAgfHwgZHVyIDw9IDApIHsKKyAgICBnX3ByaW50ZXJyICgiQ291bGQgbm90IHF1ZXJ5IGR1cmF0aW9uXG4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBzZWVrX3BvcyA9IGdzdF9nZG91YmxlX3RvX2d1aW50NjQgKGdzdF9ndWludDY0X3RvX2dkb3VibGUgKGR1cikgKiBwZXJjZW50KTsKKyAgZ19wcmludCAoIlNlZWtpbmcgdG8gJSIgR1NUX1RJTUVfRk9STUFUICIsIGFjY3VyYXRlOiAlZFxuIiwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHNlZWtfcG9zKSwgaW5mby0+YWNjdXJhdGUpOworCisgIHNlZWtfZmxhZ3MgPSBHU1RfU0VFS19GTEFHX0ZMVVNIOworCisgIGlmIChpbmZvLT5hY2N1cmF0ZSkKKyAgICBzZWVrX2ZsYWdzIHw9IEdTVF9TRUVLX0ZMQUdfQUNDVVJBVEU7CisgIGVsc2UKKyAgICBzZWVrX2ZsYWdzIHw9IEdTVF9TRUVLX0ZMQUdfS0VZX1VOSVQ7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9zZWVrX3NpbXBsZSAoaW5mby0+cGlwZSwgR1NUX0ZPUk1BVF9USU1FLCBzZWVrX2ZsYWdzLAorICAgICAgICAgIHNlZWtfcG9zKSkgeworICAgIGdfcHJpbnRlcnIgKCJTZWVrIGZhaWxlZC5cbiIpOworICAgIHJldHVybjsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorc2xpZGVyX2NiIChHdGtSYW5nZSAqIHJhbmdlLCBBcHBJbmZvICogaW5mbykKK3sKKyAgZ2RvdWJsZSB2YWw7CisKKyAgdmFsID0gZ3RrX3JhbmdlX2dldF92YWx1ZSAocmFuZ2UpOworICBzZWVrX3RvIChpbmZvLCB2YWwpOworfQorCitzdGF0aWMgZ2NoYXIgKgorc2xpZGVyX2Zvcm1hdF92YWx1ZV9jYiAoR3RrU2NhbGUgKiBzY2FsZSwgZ2RvdWJsZSB2YWx1ZSwgQXBwSW5mbyAqIGluZm8pCit7CisgIGdjaGFyIHNbNjRdOworCisgIGlmIChpbmZvLT5jdXJfcG9zIDwgMCkKKyAgICByZXR1cm4gZ19zdHJkdXBfcHJpbnRmICgiJTAuMWclJSIsIHZhbHVlICogMTAwLjApOworCisgIGdfc25wcmludGYgKHMsIDY0LCAiJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChpbmZvLT5jdXJfcG9zKSk7CisgIHNbMTBdID0gJ1wwJzsKKyAgcmV0dXJuIGdfc3RyZHVwIChzKTsKK30KKworc3RhdGljIHZvaWQKK2FjY3VyYXRlX3RvZ2dsZWRfY2IgKEd0a1RvZ2dsZUJ1dHRvbiAqIHRvZ2dsZSwgQXBwSW5mbyAqIGluZm8pCit7CisgIGluZm8tPmFjY3VyYXRlID0gZ3RrX3RvZ2dsZV9idXR0b25fZ2V0X2FjdGl2ZSAodG9nZ2xlKTsKK30KKworc3RhdGljIHZvaWQKK3J1bl9ndWkgKGNvbnN0IGdjaGFyICogZmlsZW5hbWUpCit7CisgIEd0a1dpZGdldCAqdmJveCwgKmhib3g7CisgIEFwcEluZm8gKmluZm87CisKKyAgaW5mbyA9IGdfbmV3MCAoQXBwSW5mbywgMSk7CisKKyAgLyogY3JlYXRlIHBpcGVsaW5lICovCisgIGlmICghY3JlYXRlX3BpcGVsaW5lIChpbmZvLCBmaWxlbmFtZSkpCisgICAgZ290byBkb25lOworCisgIC8qIGNyZWF0ZSB3aW5kb3cgKi8KKyAgaW5mby0+d2luID0gZ3RrX3dpbmRvd19uZXcgKEdUS19XSU5ET1dfVE9QTEVWRUwpOworICBnX3NpZ25hbF9jb25uZWN0IChpbmZvLT53aW4sICJkZWxldGUtZXZlbnQiLCBHX0NBTExCQUNLIChndGtfbWFpbl9xdWl0KSwKKyAgICAgIE5VTEwpOworCisgIHZib3ggPSBndGtfYm94X25ldyAoR1RLX09SSUVOVEFUSU9OX1ZFUlRJQ0FMLCA2KTsKKyAgZ3RrX2NvbnRhaW5lcl9zZXRfYm9yZGVyX3dpZHRoIChHVEtfQ09OVEFJTkVSICh2Ym94KSwgMTIpOworICBndGtfY29udGFpbmVyX2FkZCAoR1RLX0NPTlRBSU5FUiAoaW5mby0+d2luKSwgdmJveCk7CisKKyAgaW5mby0+aW1nID0gZ3RrX2ltYWdlX25ldyAoKTsKKyAgZ3RrX2JveF9wYWNrX3N0YXJ0IChHVEtfQk9YICh2Ym94KSwgaW5mby0+aW1nLCBGQUxTRSwgRkFMU0UsIDYpOworCisgIGhib3ggPSBndGtfYm94X25ldyAoR1RLX09SSUVOVEFUSU9OX0hPUklaT05UQUwsIDYpOworICBndGtfYm94X3BhY2tfc3RhcnQgKEdUS19CT1ggKHZib3gpLCBoYm94LCBGQUxTRSwgRkFMU0UsIDYpOworCisgIGluZm8tPmFjY3VyYXRlX2NiID0gZ3RrX2NoZWNrX2J1dHRvbl9uZXdfd2l0aF9sYWJlbCAoImFjY3VyYXRlIHNlZWsgIgorICAgICAgIihtaWdodCBub3Qgd29yayByZWxpYWJseSB3aXRoIGFsbCBkZW11eGVycykiKTsKKyAgZ3RrX2JveF9wYWNrX3N0YXJ0IChHVEtfQk9YIChoYm94KSwgaW5mby0+YWNjdXJhdGVfY2IsIEZBTFNFLCBGQUxTRSwgNik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGluZm8tPmFjY3VyYXRlX2NiLCAidG9nZ2xlZCIsCisgICAgICBHX0NBTExCQUNLIChhY2N1cmF0ZV90b2dnbGVkX2NiKSwgaW5mbyk7CisKKyAgaW5mby0+c2xpZGVyID0gZ3RrX3NjYWxlX25ld193aXRoX3JhbmdlIChHVEtfT1JJRU5UQVRJT05fSE9SSVpPTlRBTCwKKyAgICAgIDAuMCwgMS4wLCAwLjAwMSk7CisgIGd0a19ib3hfcGFja19zdGFydCAoR1RLX0JPWCAodmJveCksIGluZm8tPnNsaWRlciwgRkFMU0UsIEZBTFNFLCA2KTsKKyAgZ19zaWduYWxfY29ubmVjdCAoaW5mby0+c2xpZGVyLCAidmFsdWUtY2hhbmdlZCIsCisgICAgICBHX0NBTExCQUNLIChzbGlkZXJfY2IpLCBpbmZvKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoaW5mby0+c2xpZGVyLCAiZm9ybWF0LXZhbHVlIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKHNsaWRlcl9mb3JtYXRfdmFsdWVfY2IpLCBpbmZvKTsKKworICAvKiBhbmQgZ28hICovCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoaW5mby0+cGlwZSwgR1NUX1NUQVRFX1BBVVNFRCk7CisKKyAgZ3RrX3dpZGdldF9zaG93X2FsbCAoaW5mby0+d2luKTsKKyAgZ3RrX3dpZGdldF9oaWRlIChpbmZvLT5zbGlkZXIpOyAgICAgICAvKiBoaWRlIHVudGlsIHdlJ3JlIHByZXJvbGxlZCAqLworICBndGtfbWFpbiAoKTsKKworZG9uZToKKworICBnX2ZyZWUgKGluZm8pOworfQorCitzdGF0aWMgZ2NoYXIgKipmaWxlbmFtZXMgPSBOVUxMOworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgc3RhdGljIGNvbnN0IEdPcHRpb25FbnRyeSB0ZXN0X2dvcHRpb25zW10gPSB7CisgICAge0dfT1BUSU9OX1JFTUFJTklORywgMCwgMCwgR19PUFRJT05fQVJHX0ZJTEVOQU1FX0FSUkFZLCAmZmlsZW5hbWVzLCBOVUxMfSwKKyAgICB7TlVMTCwgJ1wwJywgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTH0KKyAgfTsKKyAgR09wdGlvbkNvbnRleHQgKmN0eDsKKyAgR0Vycm9yICpvcHRfZXJyID0gTlVMTDsKKworICBndGtfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICAvKiBjb21tYW5kIGxpbmUgb3B0aW9uIHBhcnNpbmcgKi8KKyAgY3R4ID0gZ19vcHRpb25fY29udGV4dF9uZXcgKCIgVklERU9GSUxFIik7CisgIGdfb3B0aW9uX2NvbnRleHRfYWRkX2dyb3VwIChjdHgsIGdzdF9pbml0X2dldF9vcHRpb25fZ3JvdXAgKCkpOworICBnX29wdGlvbl9jb250ZXh0X2FkZF9tYWluX2VudHJpZXMgKGN0eCwgdGVzdF9nb3B0aW9ucywgTlVMTCk7CisKKyAgaWYgKCFnX29wdGlvbl9jb250ZXh0X3BhcnNlIChjdHgsICZhcmdjLCAmYXJndiwgJm9wdF9lcnIpKSB7CisgICAgZ19lcnJvciAoIkVycm9yIHBhcnNpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnM6ICVzIiwgb3B0X2Vyci0+bWVzc2FnZSk7CisgICAgZ19vcHRpb25fY29udGV4dF9mcmVlIChjdHgpOworICAgIGdfY2xlYXJfZXJyb3IgKCZvcHRfZXJyKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoZmlsZW5hbWVzID09IE5VTEwgfHwgZmlsZW5hbWVzWzBdID09IE5VTEwgfHwgZmlsZW5hbWVzWzBdWzBdID09ICdcMCcpIHsKKyAgICBnX3ByaW50ZXJyICgiUGxlYXNlIHNwZWNpZnkgYSBwYXRoIHRvIGEgdmlkZW8gZmlsZVxuXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBydW5fZ3VpIChmaWxlbmFtZXNbMF0pOworCisgIGdfZnJlZSAoZmlsZW5hbWVzKTsKKyAgZ19vcHRpb25fY29udGV4dF9mcmVlIChjdHgpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaWNsZXMvbWVzb24uYnVpbGQgYi90ZXN0cy9pY2xlcy9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzY5NzA2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaWNsZXMvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwzOCBAQAordGVzdHMgPSBbCisgIFsnZXF1YWxpemVyLXRlc3QnXSwKKyAgWyd0ZXN0LWFjY3VyYXRlLXNlZWsnLCBnc3RhcHBfZGVwXSwKKyAgWyd0ZXN0LXNlZ21lbnQtc2Vla3MnXSwKKyAgWyd2aWRlb2Nyb3AtdGVzdCddLAorICBbJ3ZpZGVvYm94LXRlc3QnXSwKKyAgWyd2aWRlb2Nyb3AyLXRlc3QnXSwKK10KKworZ3RrX2RlcCA9IGRlcGVuZGVuY3koJ2d0aystMy4wJywgdmVyc2lvbiA6ICc+PSAzLjAuMCcsIHJlcXVpcmVkIDogZmFsc2UpCitpZiBndGtfZGVwLmZvdW5kKCkKKyAgdGVzdHMgKz0gWworICAgIFsnZ2RrcGl4YnVmc2luay10ZXN0JywgZ3RrX2RlcF0sCisgICAgWydnZGtwaXhidWZvdmVybGF5LXRlc3QnLCBbZ3N0dmlkZW9fZGVwLCBndGtfZGVwXV0sCisgIF0KK2VuZGlmCisKK2lmIGNkYXRhLmhhcygnSEFWRV9HU1RfVjRMMicpCisgIHRlc3RzICs9IFtbJ3Y0bDJzcmMtdGVzdCcsIGdzdHZpZGVvX2RlcF1dCitlbmRpZgorCitpZiBnZXRfdmFyaWFibGUoJ2hhdmVfb3NzNCcsIGZhbHNlKQorICB0ZXN0cyArPSBbWyd0ZXN0LW9zczQnXV0KK2VuZGlmCisKK2lmIGdldF92YXJpYWJsZSgneDExX2RlcCcsIGRlcGVuZGVuY3koJycsIHJlcXVpcmVkOiBmYWxzZSkpLmZvdW5kKCkKKyAgdGVzdHMgKz0gW1sneGltYWdlc3JjLXRlc3QnXV0KK2VuZGlmCisKK2ZvcmVhY2ggdCA6IHRlc3RzCisgIHRlc3RfbmFtZSA9IHQuZ2V0KDApCisgIGV4dHJhX2RlcHMgPSB0LmdldCgxLCBbXSkKKyAgZXhlY3V0YWJsZSh0ZXN0X25hbWUsIHRlc3RfbmFtZSArICcuYycsCisgICAgZGVwZW5kZW5jaWVzOiBbZ3N0X2RlcCwgbGlibSwgZXh0cmFfZGVwc10sCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgICBpbnN0YWxsOiBmYWxzZSkKK2VuZGZvcmVhY2gKZGlmZiAtLWdpdCBhL3Rlc3RzL2ljbGVzL3Rlc3QtYWNjdXJhdGUtc2Vlay5jIGIvdGVzdHMvaWNsZXMvdGVzdC1hY2N1cmF0ZS1zZWVrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4OWQ1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ljbGVzL3Rlc3QtYWNjdXJhdGUtc2Vlay5jCkBAIC0wLDAgKzEsMjk5IEBACisvKiBHU3RyZWFtZXIgaW50ZXJhY3RpdmUgdGVzdCBmb3IgYWNjdXJhdGUgc2Vla2luZworICogQ29weXJpZ2h0IChDKSAyMDE0IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBjb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICogQmFzZWQgb24gcHl0aG9uIHNjcmlwdCBieSBLaWJlb20gS2ltIDxra2IxMTBAZ21haWwuY29tPgorICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvYmFzZS5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9hcHAvYXBwLmg+CisKKyNkZWZpbmUgU0FNUExFX0ZSRVEgNDQxMDAKKworc3RhdGljIGNvbnN0IGd1aW50OCAqCitfbWVtbWVtIChjb25zdCBndWludDggKiBoYXlzdGFjaywgZ3NpemUgaGxlbiwgY29uc3QgZ3VpbnQ4ICogbmVlZGxlLCBnc2l6ZSBubGVuKQoreworICBjb25zdCBndWludDggKnAgPSBoYXlzdGFjazsKKyAgaW50IG5lZWRsZV9maXJzdDsKKyAgZ3NpemUgcGxlbiA9IGhsZW47CisKKyAgaWYgKCFubGVuKQorICAgIHJldHVybiBOVUxMOworCisgIG5lZWRsZV9maXJzdCA9ICoodW5zaWduZWQgY2hhciAqKSBuZWVkbGU7CisKKyAgd2hpbGUgKHBsZW4gPj0gbmxlbiAmJiAocCA9IG1lbWNociAocCwgbmVlZGxlX2ZpcnN0LCBwbGVuIC0gbmxlbiArIDEpKSkgeworICAgIGlmICghbWVtY21wIChwLCBuZWVkbGUsIG5sZW4pKQorICAgICAgcmV0dXJuIChndWludDggKikgcDsKKworICAgIHArKzsKKyAgICBwbGVuID0gaGxlbiAtIChwIC0gaGF5c3RhY2spOworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUKK3NhbXBsZV90b19uYW5vdGltZSAoZ3VpbnQgc2FtcGxlKQoreworICByZXR1cm4gKGd1aW50NjQpICgoMS4wICogc2FtcGxlICogR1NUX1NFQ09ORCAvIFNBTVBMRV9GUkVRKSArIDAuNSk7Cit9CisKK3N0YXRpYyBndWludAorbmFub3RpbWVfdG9fc2FtcGxlIChHc3RDbG9ja1RpbWUgbmFub3RpbWUpCit7CisgIHJldHVybiBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKG5hbm90aW1lLCBTQU1QTEVfRlJFUSwgR1NUX1NFQ09ORCk7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ2VuZXJhdGVfdGVzdF9kYXRhIChndWludCBOKQoreworICBnaW50MTYgKmxlZnQsICpyaWdodCwgKnN0ZXJlbzsKKyAgZ3VpbnQgbGFyZ2VOLCBpLCBqOworCisgIC8qIDMyNzY3ID0gKDIgKiogMTUpIC0gMSAqLworICAvKiAzMjc2OCA9ICgyICoqIDE1KSAqLworICBsYXJnZU4gPSAoKE4gKyAzMjc2NykgLyAzMjc2OCkgKiAzMjc2ODsKKyAgbGVmdCA9IGdfbmV3MCAoZ2ludDE2LCBsYXJnZU4pOworICByaWdodCA9IGdfbmV3MCAoZ2ludDE2LCBsYXJnZU4pOworICBzdGVyZW8gPSBnX25ldzAgKGdpbnQxNiwgMiAqIGxhcmdlTik7CisKKyAgZm9yIChpID0gMDsgaSA8IChsYXJnZU4gLyAzMjc2OCk7ICsraSkgeworICAgIGdpbnQgYyA9IDA7CisKKyAgICBmb3IgKGogPSBpICogMzI3Njg7IGogPCAoKGkgKyAxKSAqIDMyNzY4KTsgKytqKSB7CisgICAgICBsZWZ0W2pdID0gaTsKKworICAgICAgaWYgKGkgJSAyID09IDApIHsKKyAgICAgICAgcmlnaHRbal0gPSBjOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmlnaHRbal0gPSAzMjc2NyAtIGM7CisgICAgICB9CisgICAgICArK2M7CisgICAgfQorICB9CisKKyAgLyogY291bGQganVzdCBmaWxsIHN0ZXJlbyBkaXJlY3RseSBmcm9tIHRoZSBzdGFydCwgYnV0IGtlZXBpbmcgb3JpZ2luYWwgY29kZSBmb3Igbm93ICovCisgIGZvciAoaSA9IDA7IGkgPCBsYXJnZU47ICsraSkgeworICAgIHN0ZXJlb1soMiAqIGkpICsgMF0gPSBsZWZ0W2ldOworICAgIHN0ZXJlb1soMiAqIGkpICsgMV0gPSByaWdodFtpXTsKKyAgfQorICBnX2ZyZWUgKGxlZnQpOworICBnX2ZyZWUgKHJpZ2h0KTsKKworICByZXR1cm4gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoc3RlcmVvLCAyICogbGFyZ2VOICogc2l6ZW9mIChnaW50MTYpKTsKK30KKworc3RhdGljIHZvaWQKK2dlbmVyYXRlX3Rlc3Rfc291bmQgKGNvbnN0IGdjaGFyICogZm4sIGNvbnN0IGdjaGFyICogbGF1bmNoX3N0cmluZywKKyAgICBndWludCBudW1fc2FtcGxlcykKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmUsICpzcmMsICpwYXJzZSwgKmVuY19iaW4sICpzaW5rOworICBHc3RGbG93UmV0dXJuIGZsb3c7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgcGlwZWxpbmUgPSBnc3RfcGlwZWxpbmVfbmV3IChOVUxMKTsKKworICBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhcHBzcmMiLCBOVUxMKTsKKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcmF3IiwKKyAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCBHU1RfQVVESU9fTkUgKFMxNiksCisgICAgICAicmF0ZSIsIEdfVFlQRV9JTlQsIFNBTVBMRV9GUkVRLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAyLAorICAgICAgImxheW91dCIsIEdfVFlQRV9TVFJJTkcsICJpbnRlcmxlYXZlZCIsCisgICAgICAiY2hhbm5lbC1tYXNrIiwgR1NUX1RZUEVfQklUTUFTSywgKGd1aW50NjQpIDMsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNyYywgImNhcHMiLCBjYXBzLCAiZm9ybWF0IiwgR1NUX0ZPUk1BVF9USU1FLCBOVUxMKTsKKyAgZ3N0X2Jhc2Vfc3JjX3NldF9mb3JtYXQgKEdTVF9CQVNFX1NSQyAoc3JjKSwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIC8qIGF1ZGlvcGFyc2UgdG8gcHV0IHByb3BlciB0aW1lc3RhbXBzIG9uIGJ1ZmZlcnMgZm9yIHVzLCB3aXRob3V0IHdoaWNoCisgICAqIHZvcmJpc2VuYyBpbiBwYXJ0aWN1bGFyIGlzIHVuaGFwcHkgKG9yIG9nZ211eCwgcmF0aGVyKSAqLworICBwYXJzZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvcGFyc2UiLCBOVUxMKTsKKyAgaWYgKHBhcnNlICE9IE5VTEwpIHsKKyAgICBnX29iamVjdF9zZXQgKHBhcnNlLCAidXNlLXNpbmstY2FwcyIsIFRSVUUsIE5VTEwpOworICB9IGVsc2UgeworICAgIHBhcnNlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiaWRlbnRpdHkiLCBOVUxMKTsKKyAgICBnX3dhcm5pbmcgKCJhdWRpb3BhcnNlIGVsZW1lbnQgbm90IGF2YWlsYWJsZSwgdm9yYmlzL29nZyBtaWdodCBub3Qgd29ya1xuIik7CisgIH0KKworICBlbmNfYmluID0gZ3N0X3BhcnNlX2Jpbl9mcm9tX2Rlc2NyaXB0aW9uIChsYXVuY2hfc3RyaW5nLCBUUlVFLCBOVUxMKTsKKworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmlsZXNpbmsiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzaW5rLCAibG9jYXRpb24iLCBmbiwgTlVMTCk7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBzcmMsIHBhcnNlLCBlbmNfYmluLCBzaW5rLCBOVUxMKTsKKworICBnc3RfZWxlbWVudF9saW5rX21hbnkgKHNyYywgcGFyc2UsIGVuY19iaW4sIHNpbmssIE5VTEwpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICBidWYgPSBnZW5lcmF0ZV90ZXN0X2RhdGEgKG51bV9zYW1wbGVzKTsKKyAgZmxvdyA9IGdzdF9hcHBfc3JjX3B1c2hfYnVmZmVyIChHU1RfQVBQX1NSQyAoc3JjKSwgYnVmKTsKKyAgZ19hc3NlcnQgKGZsb3cgPT0gR1NUX0ZMT1dfT0spOworCisgIGdzdF9hcHBfc3JjX2VuZF9vZl9zdHJlYW0gKEdTVF9BUFBfU1JDIChzcmMpKTsKKworICAvKmdfcHJpbnQgKCJnZW5lcmF0aW5nIHRlc3Qgc291bmQgJXMsIHdhaXRpbmcgZm9yIEVPUy4uXG4iLCBmbik7ICovCisKKyAgbXNnID0gZ3N0X2J1c190aW1lZF9wb3BfZmlsdGVyZWQgKEdTVF9FTEVNRU5UX0JVUyAocGlwZWxpbmUpLAorICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSwgR1NUX01FU1NBR0VfRU9TIHwgR1NUX01FU1NBR0VfRVJST1IpOworCisgIGdfYXNzZXJ0IChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VPUyk7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworCisgIC8qIGdfcHJpbnQgKCJEb25lICVzXG4iLCBmbik7ICovCit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3NlZWtfRk9STUFUX1RJTUVfYnlfc2FtcGxlIChjb25zdCBnY2hhciAqIGZuLCBHTGlzdCAqIHNlZWtfcG9zaXRpb25zKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZSwgKnNyYywgKnNpbms7CisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisgIEdzdFNhbXBsZSAqc2FtcGxlOworICBHc3RDYXBzICpjYXBzOworICBnY29uc3Rwb2ludGVyIGFuc3dlcjsKKyAgZ3VpbnQgYW5zd2VyX3NpemU7CisKKyAgcGlwZWxpbmUgPSBnc3RfcGFyc2VfbGF1bmNoICgiZmlsZXNyYyBuYW1lPXNyYyAhIGRlY29kZWJpbiAhICIKKyAgICAgICJhdWRpb2NvbnZlcnQgZGl0aGVyaW5nPTAgISBhcHBzaW5rIG5hbWU9c2luayIsIE5VTEwpOworCisgIHNyYyA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgInNyYyIpOworICBnX29iamVjdF9zZXQgKHNyYywgImxvY2F0aW9uIiwgZm4sIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChzcmMpOworCisgIHNpbmsgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJzaW5rIik7CisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLAorICAgICAgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsIEdTVF9BVURJT19ORSAoUzE2KSwKKyAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgU0FNUExFX0ZSRVEsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNpbmssICJjYXBzIiwgY2FwcywgInN5bmMiLCBGQUxTRSwgTlVMTCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgLyogd2FpdCBmb3IgcHJlcm9sbCwgc28gd2UgY2FuIHNlZWsgKi8KKyAgZ3N0X2J1c190aW1lZF9wb3BfZmlsdGVyZWQgKEdTVF9FTEVNRU5UX0JVUyAocGlwZWxpbmUpLCBHU1RfQ0xPQ0tfVElNRV9OT05FLAorICAgICAgR1NUX01FU1NBR0VfQVNZTkNfRE9ORSk7CisKKyAgLyogZmlyc3QsIHJlYWQgZW50aXJlIGZpbGUgdG8gZW5kICovCisgIGFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgIHdoaWxlICgoc2FtcGxlID0gZ3N0X2FwcF9zaW5rX3B1bGxfc2FtcGxlIChHU1RfQVBQX1NJTksgKHNpbmspKSkpIHsKKyAgICBnc3RfYWRhcHRlcl9wdXNoIChhZGFwdGVyLCBnc3RfYnVmZmVyX3JlZiAoZ3N0X3NhbXBsZV9nZXRfYnVmZmVyIChzYW1wbGUpKSk7CisgICAgZ3N0X3NhbXBsZV91bnJlZiAoc2FtcGxlKTsKKyAgfQorICBhbnN3ZXJfc2l6ZSA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoYWRhcHRlcik7CisgIGFuc3dlciA9IGdzdF9hZGFwdGVyX21hcCAoYWRhcHRlciwgYW5zd2VyX3NpemUpOworICAvKiBnX3ByaW50ICgiJXM6IHJlYWQgJXUgYnl0ZXNcbiIsIGZuLCBhbnN3ZXJfc2l6ZSk7ICovCisKKyAgZ19wcmludCAoIiUxMHNcdCUxMHNcdCUxMHNcbiIsICJyZXF1ZXN0ZWQiLCAic2FtcGxlIHBlciB0cyIsICJhY3R1YWwoZGF0YSkiKTsKKworICB3aGlsZSAoc2Vla19wb3NpdGlvbnMgIT0gTlVMTCkgeworICAgIGdjb25zdHBvaW50ZXIgZm91bmQ7CisgICAgR3N0TWFwSW5mbyBtYXA7CisgICAgR3N0QnVmZmVyICpidWY7CisgICAgZ2Jvb2xlYW4gcmV0OworICAgIGd1aW50IGFjdHVhbF9wb3NpdGlvbiwgYnVmZmVyX3RpbWVzdGFtcF9wb3NpdGlvbjsKKyAgICBndWludCBzZWVrX3NhbXBsZTsKKworICAgIHNlZWtfc2FtcGxlID0gR1BPSU5URVJfVE9fVUlOVCAoc2Vla19wb3NpdGlvbnMtPmRhdGEpOworCisgICAgcmV0ID0gZ3N0X2VsZW1lbnRfc2Vla19zaW1wbGUgKHBpcGVsaW5lLCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgIEdTVF9TRUVLX0ZMQUdfRkxVU0ggfCBHU1RfU0VFS19GTEFHX0FDQ1VSQVRFLAorICAgICAgICBzYW1wbGVfdG9fbmFub3RpbWUgKHNlZWtfc2FtcGxlKSk7CisKKyAgICBnX2Fzc2VydCAocmV0KTsKKworICAgIHNhbXBsZSA9IGdzdF9hcHBfc2lua19wdWxsX3NhbXBsZSAoR1NUX0FQUF9TSU5LIChzaW5rKSk7CisKKyAgICBidWYgPSBnc3Rfc2FtcGxlX2dldF9idWZmZXIgKHNhbXBsZSk7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBHU1RfTUVNRFVNUCAoImFuc3dlciIsIGFuc3dlciwgYW5zd2VyX3NpemUpOworICAgIEdTVF9NRU1EVU1QICgiYnVmZmVyIiwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICBmb3VuZCA9IF9tZW1tZW0gKGFuc3dlciwgYW5zd2VyX3NpemUsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICAgIGdfYXNzZXJ0IChmb3VuZCAhPSBOVUxMKTsKKyAgICBhY3R1YWxfcG9zaXRpb24gPSAoKGdvZmZzZXQpICgoZ3VpbnQ4ICopIGZvdW5kIC0gKGd1aW50OCAqKSBhbnN3ZXIpKSAvIDQ7CisgICAgYnVmZmVyX3RpbWVzdGFtcF9wb3NpdGlvbiA9IG5hbm90aW1lX3RvX3NhbXBsZSAoR1NUX0JVRkZFUl9QVFMgKGJ1ZikpOworICAgIGdfcHJpbnQgKCIlMTB1XHQlMTB1XHQlMTB1XG4iLCBzZWVrX3NhbXBsZSwgYnVmZmVyX3RpbWVzdGFtcF9wb3NpdGlvbiwKKyAgICAgICAgYWN0dWFsX3Bvc2l0aW9uKTsKKyAgICBnc3Rfc2FtcGxlX3VucmVmIChzYW1wbGUpOworCisgICAgc2Vla19wb3NpdGlvbnMgPSBzZWVrX3Bvc2l0aW9ucy0+bmV4dDsKKyAgfQorCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2luayk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKyAgZ19vYmplY3RfdW5yZWYgKGFkYXB0ZXIpOworfQorCitzdGF0aWMgR0xpc3QgKgorY3JlYXRlX3Rlc3Rfc2FtcGxlcyAoZ3VpbnQgZnJvbSwgZ3VpbnQgdG8sIGd1aW50IHN0ZXApCit7CisgIEdRdWV1ZSBxID0gR19RVUVVRV9JTklUOworICBndWludCBpOworCisgIGZvciAoaSA9IGZyb207IGkgPCB0bzsgaSArPSBzdGVwKQorICAgIGdfcXVldWVfcHVzaF90YWlsICgmcSwgR1VJTlRfVE9fUE9JTlRFUiAoaSkpOworCisgIHJldHVybiBxLmhlYWQ7Cit9CisKKyNkZWZpbmUgU0VDUyAxMAorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgR0xpc3QgKnRlc3Rfc2FtcGxlczsKKworICBnc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICB0ZXN0X3NhbXBsZXMgPSBjcmVhdGVfdGVzdF9zYW1wbGVzIChTQU1QTEVfRlJFUSwgU0FNUExFX0ZSRVEgKiAyLCA1MDAwKTsKKworICBnX3ByaW50ICgiXG53YXY6XG4iKTsKKyAgZ2VuZXJhdGVfdGVzdF9zb3VuZCAoInRlc3Qud2F2IiwgIndhdmVuYyIsIFNBTVBMRV9GUkVRICogU0VDUyk7CisgIHRlc3Rfc2Vla19GT1JNQVRfVElNRV9ieV9zYW1wbGUgKCJ0ZXN0LndhdiIsIHRlc3Rfc2FtcGxlcyk7CisKKyAgZ19wcmludCAoIlxuZmxhYzpcbiIpOworICBnZW5lcmF0ZV90ZXN0X3NvdW5kICgidGVzdC5mbGFjIiwgImZsYWNlbmMiLCBTQU1QTEVfRlJFUSAqIFNFQ1MpOworICB0ZXN0X3NlZWtfRk9STUFUX1RJTUVfYnlfc2FtcGxlICgidGVzdC5mbGFjIiwgdGVzdF9zYW1wbGVzKTsKKworICBnX3ByaW50ICgiXG5vZ2c6XG4iKTsKKyAgZ2VuZXJhdGVfdGVzdF9zb3VuZCAoInRlc3Qub2dnIiwKKyAgICAgICJhdWRpb2NvbnZlcnQgZGl0aGVyaW5nPTAgISB2b3JiaXNlbmMgcXVhbGl0eT0xICEgb2dnbXV4IiwKKyAgICAgIFNBTVBMRV9GUkVRICogU0VDUyk7CisgIHRlc3Rfc2Vla19GT1JNQVRfVElNRV9ieV9zYW1wbGUgKCJ0ZXN0Lm9nZyIsIHRlc3Rfc2FtcGxlcyk7CisKKyAgZ19wcmludCAoIlxubXAzOlxuIik7CisgIGdlbmVyYXRlX3Rlc3Rfc291bmQgKCJ0ZXN0Lm1wMyIsICJsYW1lbXAzZW5jIGJpdHJhdGU9MzIwIiwKKyAgICAgIFNBTVBMRV9GUkVRICogU0VDUyk7CisgIHRlc3Rfc2Vla19GT1JNQVRfVElNRV9ieV9zYW1wbGUgKCJ0ZXN0Lm1wMyIsIHRlc3Rfc2FtcGxlcyk7CisKKyAgZ19saXN0X2ZyZWUgKHRlc3Rfc2FtcGxlcyk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaWNsZXMvdGVzdC1vc3M0LmMgYi90ZXN0cy9pY2xlcy90ZXN0LW9zczQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGJlNDQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaWNsZXMvdGVzdC1vc3M0LmMKQEAgLTAsMCArMSwxMjggQEAKKy8qIEdTdHJlYW1lciBPU1M0IGF1ZGlvIHRlc3RzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qIEZJWE1FIDAuMTE6IHN1cHByZXNzIHdhcm5pbmdzIGZvciBkZXByZWNhdGVkIEFQSSBzdWNoIGFzIEdWYWx1ZUFycmF5CisgKiB3aXRoIG5ld2VyIEdMaWIgdmVyc2lvbnMgKD49IDIuMzEuMCkgKi8KKyNkZWZpbmUgR0xJQl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitzdGF0aWMgZ2Jvb2xlYW4gb3B0X3Nob3dfbWl4ZXJfbWVzc2FnZXMgPSBGQUxTRTsKKworI2RlZmluZSBXQUlUX1RJTUUgIDYwLjAgICAgICAgICAvKiBpbiBzZWNvbmRzICovCisKK3N0YXRpYyB2b2lkCitwcm9iZV9wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBjb25zdCBnY2hhciAqIHBhZF9uYW1lKQoreworICBHc3RDYXBzICpjYXBzID0gTlVMTDsKKyAgR3N0UGFkICpwYWQ7CisgIGd1aW50IGk7CisKKyAgcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGVsZW1lbnQsIHBhZF9uYW1lKTsKKyAgaWYgKHBhZCA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBjYXBzID0gZ3N0X3BhZF9xdWVyeV9jYXBzIChwYWQsIE5VTEwpOworICBnX3JldHVybl9pZl9mYWlsIChjYXBzICE9IE5VTEwpOworCisgIGZvciAoaSA9IDA7IGkgPCBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7ICsraSkgeworICAgIGdjaGFyICpzOworCisgICAgcyA9IGdzdF9zdHJ1Y3R1cmVfdG9fc3RyaW5nIChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCBpKSk7CisgICAgZ19wcmludCAoIiAgJTRzWyVkXTogJXNcbiIsIEdTVF9QQURfTkFNRSAocGFkKSwgaSwgcyk7CisgICAgZ19mcmVlIChzKTsKKyAgfQorICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7Cit9CisKK3N0YXRpYyB2b2lkCitwcm9iZV9kZXRhaWxzIChHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHJldCA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX1JFQURZKTsKKyAgaWYgKHJldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpIHsKKyAgICBnX3ByaW50ICgiQ291bGQgbm90IHNldCBlbGVtZW50ICVzIHRvIFJFQURZLiIsIEdTVF9FTEVNRU5UX05BTUUgKGVsZW1lbnQpKTsKKyAgICByZXR1cm47CisgIH0KKworICBwcm9iZV9wYWQgKGVsZW1lbnQsICJzaW5rIik7CisgIHByb2JlX3BhZCAoZWxlbWVudCwgInNyYyIpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX05VTEwpOworfQorCitzdGF0aWMgdm9pZAorcHJvYmVfZWxlbWVudCAoY29uc3QgZ2NoYXIgKiBuYW1lKQoreworICBHc3RFbGVtZW50ICplbGVtZW50OworICBnY2hhciAqZGV2bmFtZSA9IE5VTEw7CisKKyAgZWxlbWVudCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAobmFtZSwgbmFtZSk7CisKKyAgLyogbWFrZSBzdXJlIHdlIGRvbid0IGRlYWRsb2NrIG9uIEdTVF9FTEVNRU5UX0VSUk9SIG9yIGRvIG90aGVyIHNpbGx5IHRoaW5ncworICAgKiBpZiB3ZSB0cnkgdG8gcXVlcnkgdGhlICJkZXZpY2UtbmFtZSIgcHJvcGVydHkgd2hlbiB0aGUgZGV2aWNlIGlzbid0IG9wZW4gKi8KKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAiZGV2aWNlIiwgIi9kZXYvZG9lcy9ub3QvZXhpc3QiLCBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChlbGVtZW50LCAiZGV2aWNlLW5hbWUiLCAmZGV2bmFtZSwgTlVMTCk7CisgIEdTVF9MT0cgKCJkZXZuYW1lOiAnJXMnIiwgR1NUX1NUUl9OVUxMIChkZXZuYW1lKSk7CisgIGdfYXNzZXJ0IChkZXZuYW1lID09IE5VTEwgfHwgKmRldm5hbWUgPT0gJ1wwJyk7CisKKyAgLyogYW5kIG5vdyBmb3IgcmVhbCAqLworCisgIHByb2JlX2RldGFpbHMgKGVsZW1lbnQpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKGVsZW1lbnQpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgR09wdGlvbkVudHJ5IG9wdGlvbnNbXSA9IHsKKyAgICB7InNob3ctbWl4ZXItbWVzc2FnZXMiLCAnbScsIDAsIEdfT1BUSU9OX0FSR19OT05FLCAmb3B0X3Nob3dfbWl4ZXJfbWVzc2FnZXMsCisgICAgICAgICJGb3IgbWl4ZXIgZWxlbWVudHMsIHdhaXQgNjAgc2Vjb25kcyBhbmQgc2hvdyBhbnkgbWl4ZXIgbWVzc2FnZXMgIgorICAgICAgICAgICIoZm9yIGRlYnVnZ2luZyBhdXRvLW5vdGlmaWNhdGlvbnMpIiwgTlVMTH0sCisgICAge05VTEwsfQorICB9OworICBHT3B0aW9uQ29udGV4dCAqY3R4OworICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgY3R4ID0gZ19vcHRpb25fY29udGV4dF9uZXcgKCIiKTsKKyAgZ19vcHRpb25fY29udGV4dF9hZGRfbWFpbl9lbnRyaWVzIChjdHgsIG9wdGlvbnMsIE5VTEwpOworICBnX29wdGlvbl9jb250ZXh0X2FkZF9ncm91cCAoY3R4LCBnc3RfaW5pdF9nZXRfb3B0aW9uX2dyb3VwICgpKTsKKyAgaWYgKCFnX29wdGlvbl9jb250ZXh0X3BhcnNlIChjdHgsICZhcmdjLCAmYXJndiwgJmVycikpIHsKKyAgICBnX3ByaW50ICgiRXJyb3IgaW5pdGlhbGl6aW5nOiAlc1xuIiwgZXJyLT5tZXNzYWdlKTsKKyAgICBnX29wdGlvbl9jb250ZXh0X2ZyZWUgKGN0eCk7CisgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgZXhpdCAoMSk7CisgIH0KKyAgZ19vcHRpb25fY29udGV4dF9mcmVlIChjdHgpOworCisgIHByb2JlX2VsZW1lbnQgKCJvc3M0c2luayIpOworICBwcm9iZV9lbGVtZW50ICgib3NzNHNyYyIpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaWNsZXMvdGVzdC1zZWdtZW50LXNlZWtzLmMgYi90ZXN0cy9pY2xlcy90ZXN0LXNlZ21lbnQtc2Vla3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzliNjcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaWNsZXMvdGVzdC1zZWdtZW50LXNlZWtzLmMKQEAgLTAsMCArMSwxNDYgQEAKKy8qIEdTdHJlYW1lciBpbnRlcmFjdGl2ZSB0ZXN0IGZvciBhY2N1cmF0ZSBzZWdtZW50IHNlZWtpbmcKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisvKiBQbGF5cyB0aGUgcHJvdmlkZWQgZmlsZSBvbmUgc2Vjb25kIGF0IGEgdGltZSB1c2luZyBzZWdtZW50IHNlZWtzLgorICogVGhlb3JldGljYWxseSB0aGlzIHNob3VsZCBiZSBqdXN0IGFzIHNtb290aCBhcyBpZiB3ZSBwbGF5ZWQgdGhlCisgKiBmaWxlIGZyb20gc3RhcnQgdG8gc3RvcCBpbiBvbmUgZ28sIGNlcnRhaW5seSB3aXRob3V0IGhpY2t1cHMuCisgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNkZWZpbmUgU0VHTUVOVF9EVVJBVElPTiAoMSAqIEdTVF9TRUNPTkQpCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBHc3RFbGVtZW50ICpwbGF5YmluOworICBHc3RNZXNzYWdlICptc2c7CisgIGdjaGFyICp1cmk7CisgIGdpbnQ2NCBkdXIsIHN0YXJ0LCBzdG9wOworICBnYm9vbGVhbiBwcmVyb2xsZWQgPSBGQUxTRTsKKworICBpZiAoYXJnYyA8IDIpIHsKKyAgICBnX3ByaW50ZXJyICgiVXNhZ2U6ICVzIEZJTEVOQU1FXG4iLCBhcmd2WzBdKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBnc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICBpZiAoZ3N0X3VyaV9pc192YWxpZCAoYXJndlsxXSkpCisgICAgdXJpID0gZ19zdHJkdXAgKGFyZ3ZbMV0pOworICBlbHNlCisgICAgdXJpID0gZ3N0X2ZpbGVuYW1lX3RvX3VyaSAoYXJndlsxXSwgTlVMTCk7CisKKyAgZ19wcmludCAoInVyaTogJXNcbiIsIHVyaSk7CisKKyAgcGxheWJpbiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInBsYXliaW4iLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChwbGF5YmluLCAidXJpIiwgdXJpLCBOVUxMKTsKKworI2lmIDAKKyAgeworICAgIEdzdEVsZW1lbnQgKnNyYzsKKworICAgIHBsYXliaW4gPSBnc3RfcGFyc2VfbGF1bmNoICgidXJpZGVjb2RlYmluIG5hbWU9ZCAhIHF1ZXVlICEgIgorICAgICAgICAiZmlsZXNpbmsgbG9jYXRpb249L3RtcC9yYXcxLmRhdGEiLCBOVUxMKTsKKyAgICBzcmMgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwbGF5YmluKSwgImQiKTsKKyAgICBnX29iamVjdF9zZXQgKHNyYywgInVyaSIsIHVyaSwgTlVMTCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAoc3JjKTsKKyAgfQorI2VuZGlmCisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwbGF5YmluLCBHU1RfU1RBVEVfUEFVU0VEKTsKKworICAvKiB3YWl0IGZvciBwcmVyb2xsICovCisgIG1zZyA9IGdzdF9idXNfdGltZWRfcG9wX2ZpbHRlcmVkIChHU1RfRUxFTUVOVF9CVVMgKHBsYXliaW4pLAorICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSwgR1NUX01FU1NBR0VfQVNZTkNfRE9ORSB8IEdTVF9NRVNTQUdFX0VSUk9SKTsKKworICBnX2Fzc2VydCAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSAhPSBHU1RfTUVTU0FHRV9FUlJPUik7CisgIHByZXJvbGxlZCA9IFRSVUU7CisKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9xdWVyeV9kdXJhdGlvbiAocGxheWJpbiwgR1NUX0ZPUk1BVF9USU1FLCAmZHVyKSkKKyAgICBnX2Vycm9yICgiRmFpbGVkIHRvIHF1ZXJ5IGR1cmF0aW9uIVxuIik7CisKKyAgZ19wcmludCAoIkR1cmF0aW9uOiAlIiBHU1RfVElNRV9GT1JNQVQgIlxuIiwgR1NUX1RJTUVfQVJHUyAoZHVyKSk7CisKKyAgc3RhcnQgPSAwOworICBkbyB7CisgICAgR3N0U2Vla0ZsYWdzIHNlZWtfZmxhZ3M7CisgICAgZ2Jvb2xlYW4gcmV0OworICAgIGdib29sZWFuIHNlZ21lbnRfZG9uZSA9IEZBTFNFOworCisgICAgc2Vla19mbGFncyA9IEdTVF9TRUVLX0ZMQUdfQUNDVVJBVEUgfCBHU1RfU0VFS19GTEFHX1NFR01FTlQ7CisKKyAgICBpZiAoc3RhcnQgPT0gMCkgeworICAgICAgcHJlcm9sbGVkID0gRkFMU0U7CisgICAgICBzZWVrX2ZsYWdzIHw9IEdTVF9TRUVLX0ZMQUdfRkxVU0g7CisgICAgfQorCisgICAgc3RvcCA9IHN0YXJ0ICsgU0VHTUVOVF9EVVJBVElPTjsKKworICAgIGdfcHJpbnQgKCJTZWdtZW50OiAlIiBHU1RfVElNRV9GT1JNQVQgIi0lIiBHU1RfVElNRV9GT1JNQVQgIlxuIiwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoc3RhcnQpLCBHU1RfVElNRV9BUkdTIChzdG9wKSk7CisKKyAgICByZXQgPSBnc3RfZWxlbWVudF9zZWVrIChwbGF5YmluLCAxLjAsIEdTVF9GT1JNQVRfVElNRSwgc2Vla19mbGFncywKKyAgICAgICAgR1NUX1NFRUtfVFlQRV9TRVQsIHN0YXJ0LCBHU1RfU0VFS19UWVBFX1NFVCwgc3RvcCk7CisKKyAgICBnX2Fzc2VydCAocmV0KTsKKworICAgIGlmICghcHJlcm9sbGVkKSB7CisgICAgICB3aGlsZSAoIXByZXJvbGxlZCkgeworICAgICAgICAvKiB3YWl0IGZvciBwcmVyb2xsIGFnYWluICovCisgICAgICAgIG1zZyA9IGdzdF9idXNfdGltZWRfcG9wX2ZpbHRlcmVkIChHU1RfRUxFTUVOVF9CVVMgKHBsYXliaW4pLAorICAgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSwgR1NUX01FU1NBR0VfU0VHTUVOVF9ET05FIHwKKyAgICAgICAgICAgIEdTVF9NRVNTQUdFX0FTWU5DX0RPTkUgfCBHU1RfTUVTU0FHRV9FUlJPUik7CisKKyAgICAgICAgZ19hc3NlcnQgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgIT0gR1NUX01FU1NBR0VfRVJST1IpOworICAgICAgICBpZiAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSA9PSBHU1RfTUVTU0FHRV9TRUdNRU5UX0RPTkUpIHsKKyAgICAgICAgICBzZWdtZW50X2RvbmUgPSBUUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByZXJvbGxlZCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgICAgICB9CisKKyAgICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGxheWJpbiwgR1NUX1NUQVRFX1BMQVlJTkcpOworICAgIH0KKworICAgIC8qIHdhaXQgZm9yIGVuZCBvZiBzZWdtZW50IGlmIHdlIGRpZG4ndCBnZXQgaXQgYWJvdmUgYWxyZWFkeSAqLworICAgIGlmICghc2VnbWVudF9kb25lKSB7CisgICAgICBtc2cgPSBnc3RfYnVzX3RpbWVkX3BvcF9maWx0ZXJlZCAoR1NUX0VMRU1FTlRfQlVTIChwbGF5YmluKSwKKyAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FLCBHU1RfTUVTU0FHRV9TRUdNRU5UX0RPTkUgfCBHU1RfTUVTU0FHRV9FUlJPUik7CisKKyAgICAgIGdfYXNzZXJ0IChHU1RfTUVTU0FHRV9UWVBFIChtc2cpICE9IEdTVF9NRVNTQUdFX0VSUk9SKTsKKworICAgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgICAgfQorCisgICAgc3RhcnQgPSBzdG9wOworICB9CisgIHdoaWxlIChzdGFydCA8IGR1cik7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwbGF5YmluLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBsYXliaW4pOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ljbGVzL3Y0bDJzcmMtdGVzdC5jIGIvdGVzdHMvaWNsZXMvdjRsMnNyYy10ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2MmU1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ljbGVzL3Y0bDJzcmMtdGVzdC5jCkBAIC0wLDAgKzEsNTE0IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRWRnYXJkIExpbWEgPGVkZ2FyZCBkb3QgbGltYSBhdCBpbmR0IGRvdCBvcmcgZG90IGJyPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9jb2xvcmJhbGFuY2UuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW9vcmllbnRhdGlvbi5oPgorCitHc3RFbGVtZW50ICpwaXBlbGluZSwgKnNvdXJjZSwgKnNpbms7CitHTWFpbkxvb3AgKmxvb3A7Cit2b2xhdGlsZSBpbnQgZXhpdF9yZWFkID0gMDsKKworc3RhdGljIHZvaWQKK3ByaW50X29wdGlvbnMgKHZvaWQpCit7CisgIHByaW50ZiAoIlxuZiAtIHRvIGNoYW5nZSB0aGUgZmVxdWVuY3lcbiIpOworICBwcmludGYgKCJpIC0gdG8gY2hhbmdlIHRoZSBpbnB1dFxuIik7CisgIHByaW50ZiAoIm4gLSB0byBjaGFuZ2UgdGhlIG5vcm1cbiIpOworICBwcmludGYgKCJjIC0gbGlzdCBjb2xvciBiYWxhbmNlXG4iKTsKKyAgcHJpbnRmICgidiAtIGNoYW5nZSB2aWRlbyBvcmllbnRhcmlvblxuIik7CisgIHByaW50ZiAoImUgLSB0byBleGl0XG4iKTsKK30KKworc3RhdGljIHZvaWQKK3J1bl9vcHRpb25zIChjaGFyIG9wdCkKK3sKKyAgaW50IHJlczsKKworICBzd2l0Y2ggKG9wdCkgeworI2lmIDAKKyAgICBjYXNlICdmJzoKKyAgICB7CisgICAgICBHc3RUdW5lciAqdHVuZXIgPSBHU1RfVFVORVIgKHNvdXJjZSk7CisgICAgICBHc3RUdW5lckNoYW5uZWwgKmNoYW5uZWw7CisgICAgICBndWludCBmcmVxOworCisgICAgICBjaGFubmVsID0gZ3N0X3R1bmVyX2dldF9jaGFubmVsICh0dW5lcik7CisKKyAgICAgIGZyZXEgPSBnc3RfdHVuZXJfZ2V0X2ZyZXF1ZW5jeSAodHVuZXIsIGNoYW5uZWwpOworCisgICAgICBwcmludGYgKCJcbnR5cGUgdGhlIG5ldyBmcmVxdWVuY3kgKGN1cnJlbnQgPSAldSkgKC0xIHRvIGNhbmNlbCk6ICIsIGZyZXEpOworICAgICAgcmVzID0gc2NhbmYgKCIldSIsICZmcmVxKTsKKyAgICAgIGlmIChyZXMgIT0gMSB8fCBmcmVxICE9IC0xKQorICAgICAgICBnc3RfdHVuZXJfc2V0X2ZyZXF1ZW5jeSAodHVuZXIsIGNoYW5uZWwsIGZyZXEpOworICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ24nOgorICAgIHsKKyAgICAgIEdzdFR1bmVyICp0dW5lciA9IEdTVF9UVU5FUiAoc291cmNlKTsKKyAgICAgIGNvbnN0IEdMaXN0ICppdGVtLCAqbGlzdDsKKyAgICAgIGNvbnN0IEdzdFR1bmVyTm9ybSAqY3VycmVudF9ub3JtOworICAgICAgR3N0VHVuZXJOb3JtICpub3JtID0gTlVMTDsKKyAgICAgIGdpbnQgaW5kZXgsIG5leHRfbm9ybTsKKworCisgICAgICBsaXN0ID0gZ3N0X3R1bmVyX2xpc3Rfbm9ybXMgKHR1bmVyKTsKKworICAgICAgY3VycmVudF9ub3JtID0gZ3N0X3R1bmVyX2dldF9ub3JtICh0dW5lcik7CisKKyAgICAgIHByaW50ZiAoIlxubGlzdCBvZiBub3JtczpcbiIpOworICAgICAgZm9yIChpdGVtID0gbGlzdCwgaW5kZXggPSAwOyBpdGVtICE9IE5VTEw7IGl0ZW0gPSBpdGVtLT5uZXh0LCArK2luZGV4KSB7CisgICAgICAgIG5vcm0gPSBpdGVtLT5kYXRhOworICAgICAgICBpZiAoY3VycmVudF9ub3JtID09IG5vcm0pIHsKKyAgICAgICAgICBwcmludGYgKCIgKiAldSAtICVzXG4iLCBpbmRleCwgbm9ybS0+bGFiZWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByaW50ZiAoIiAgICV1IC0gJXNcbiIsIGluZGV4LCBub3JtLT5sYWJlbCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHByaW50ZiAoIlxudHlwZSB0aGUgbnVtYmVyIG9mIG5vcm0geW91IHdhbnQgKC0xIHRvIGNhbmNlbCk6ICIpOworICAgICAgcmVzID0gc2NhbmYgKCIlZCIsICZuZXh0X25vcm0pOworICAgICAgaWYgKHJlcyAhPSAxIHx8IG5leHRfbm9ybSA8IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoaW5kZXggPD0gbmV4dF9ub3JtKSB7CisgICAgICAgIHByaW50ZiAoIk5vcm0gJWQgbm90IGF2YWlsYWJsZVxuIiwgbmV4dF9ub3JtKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBmb3IgKGl0ZW0gPSBsaXN0LCBpbmRleCA9IDA7IGl0ZW0gIT0gTlVMTCAmJiBpbmRleCA8PSBuZXh0X25vcm07CisgICAgICAgICAgaXRlbSA9IGl0ZW0tPm5leHQsICsraW5kZXgpIHsKKyAgICAgICAgbm9ybSA9IGl0ZW0tPmRhdGE7CisgICAgICB9CisgICAgICBpZiAobm9ybSkKKyAgICAgICAgZ3N0X3R1bmVyX3NldF9ub3JtICh0dW5lciwgbm9ybSk7CisgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnaSc6CisgICAgeworICAgICAgR3N0VHVuZXIgKnR1bmVyID0gR1NUX1RVTkVSIChzb3VyY2UpOworICAgICAgY29uc3QgR0xpc3QgKml0ZW0sICpsaXN0OworICAgICAgY29uc3QgR3N0VHVuZXJDaGFubmVsICpjdXJyZW50X2NoYW5uZWw7CisgICAgICBHc3RUdW5lckNoYW5uZWwgKmNoYW5uZWwgPSBOVUxMOworICAgICAgZ2ludCBpbmRleCwgbmV4dF9jaGFubmVsOworCisKKyAgICAgIGxpc3QgPSBnc3RfdHVuZXJfbGlzdF9jaGFubmVscyAodHVuZXIpOworCisgICAgICBjdXJyZW50X2NoYW5uZWwgPSBnc3RfdHVuZXJfZ2V0X2NoYW5uZWwgKHR1bmVyKTsKKworICAgICAgcHJpbnRmICgiXG5saXN0IG9mIGlucHV0czpcbiIpOworICAgICAgZm9yIChpdGVtID0gbGlzdCwgaW5kZXggPSAwOyBpdGVtICE9IE5VTEw7IGl0ZW0gPSBpdGVtLT5uZXh0LCArK2luZGV4KSB7CisgICAgICAgIGNoYW5uZWwgPSBpdGVtLT5kYXRhOworICAgICAgICBpZiAoY3VycmVudF9jaGFubmVsID09IGNoYW5uZWwpIHsKKyAgICAgICAgICBwcmludGYgKCIgKiAldSAtICVzXG4iLCBpbmRleCwgY2hhbm5lbC0+bGFiZWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByaW50ZiAoIiAgICV1IC0gJXNcbiIsIGluZGV4LCBjaGFubmVsLT5sYWJlbCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHByaW50ZiAoIlxudHlwZSB0aGUgbnVtYmVyIG9mIGlucHV0IHlvdSB3YW50ICgtMSB0byBjYW5jZWwpOiAiKTsKKyAgICAgIHJlcyA9IHNjYW5mICgiJWQiLCAmbmV4dF9jaGFubmVsKTsKKyAgICAgIGlmIChyZXMgIT0gMSB8fCBuZXh0X2NoYW5uZWwgPCAwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGluZGV4IDw9IG5leHRfY2hhbm5lbCkgeworICAgICAgICBwcmludGYgKCJJbnB1dCAlZCBub3QgYXZhaWxhYmxlXG4iLCBuZXh0X2NoYW5uZWwpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGZvciAoaXRlbSA9IGxpc3QsIGluZGV4ID0gMDsgaXRlbSAhPSBOVUxMICYmIGluZGV4IDw9IG5leHRfY2hhbm5lbDsKKyAgICAgICAgICBpdGVtID0gaXRlbS0+bmV4dCwgKytpbmRleCkgeworICAgICAgICBjaGFubmVsID0gaXRlbS0+ZGF0YTsKKyAgICAgIH0KKyAgICAgIGlmIChjaGFubmVsKQorICAgICAgICBnc3RfdHVuZXJfc2V0X2NoYW5uZWwgKHR1bmVyLCBjaGFubmVsKTsKKyAgICB9CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgJ2UnOgorICAgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBwcmludGYgKCJCeWVcbiIpOworICAgICAgZ190aHJlYWRfZXhpdCAoMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdjJzoKKyAgICB7CisgICAgICBHc3RDb2xvckJhbGFuY2UgKmJhbGFuY2UgPSBHU1RfQ09MT1JfQkFMQU5DRSAoc291cmNlKTsKKyAgICAgIGNvbnN0IEdMaXN0ICpjb250cm9sczsKKyAgICAgIEdzdENvbG9yQmFsYW5jZUNoYW5uZWwgKmNoYW5uZWw7CisgICAgICBjb25zdCBHTGlzdCAqaXRlbTsKKyAgICAgIGdpbnQgaW5kZXgsIG5ld192YWx1ZTsKKworICAgICAgY29udHJvbHMgPSBnc3RfY29sb3JfYmFsYW5jZV9saXN0X2NoYW5uZWxzIChiYWxhbmNlKTsKKworICAgICAgcHJpbnRmICgiXG4iKTsKKworICAgICAgaWYgKGNvbnRyb2xzID09IE5VTEwpIHsKKyAgICAgICAgcHJpbnRmICgiVGhlcmUgaXMgbm8gbGlzdCBvZiBjb2xvcmJhbGFuY2UgY29udHJvbHNcbiIpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisKKyAgICAgIGlmIChjb250cm9scykgeworICAgICAgICBwcmludGYgKCJsaXN0IG9mIGNvbnRyb2xzOlxuIik7CisgICAgICAgIGZvciAoaXRlbSA9IGNvbnRyb2xzLCBpbmRleCA9IDA7IGl0ZW0gIT0gTlVMTDsKKyAgICAgICAgICAgIGl0ZW0gPSBpdGVtLT5uZXh0LCArK2luZGV4KSB7CisgICAgICAgICAgY2hhbm5lbCA9IGl0ZW0tPmRhdGE7CisgICAgICAgICAgcHJpbnRmICgiICAgJXUgLSAlcyAoJWQgLSAlZCkgPSAlZFxuIiwgaW5kZXgsIGNoYW5uZWwtPmxhYmVsLAorICAgICAgICAgICAgICBjaGFubmVsLT5taW5fdmFsdWUsIGNoYW5uZWwtPm1heF92YWx1ZSwKKyAgICAgICAgICAgICAgZ3N0X2NvbG9yX2JhbGFuY2VfZ2V0X3ZhbHVlIChiYWxhbmNlLCBjaGFubmVsKSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmICgiXG50eXBlIHRoZSBudW1iZXIgb2YgY29sb3IgY29udHJvbCB5b3Ugd2FudCAoLTEgdG8gY2FuY2VsKTogIik7CisgICAgICAgIHJlcyA9IHNjYW5mICgiJWQiLCAmbmV3X3ZhbHVlKTsKKyAgICAgICAgaWYgKHJlcyAhPSAxIHx8IG5ld192YWx1ZSA9PSAtMSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZm9yIChpdGVtID0gY29udHJvbHMsIGluZGV4ID0gMDsgaXRlbSAhPSBOVUxMICYmIGluZGV4IDw9IG5ld192YWx1ZTsKKyAgICAgICAgICAgIGl0ZW0gPSBpdGVtLT5uZXh0LCArK2luZGV4KSB7CisgICAgICAgICAgY2hhbm5lbCA9IGl0ZW0tPmRhdGE7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmICgiICAgJXUgLSAlcyAoJWQgLSAlZCkgPSAlZCwgdHlwZSB0aGUgbmV3IHZhbHVlOiAiLCBpbmRleCAtIDEsCisgICAgICAgICAgICBjaGFubmVsLT5sYWJlbCwgY2hhbm5lbC0+bWluX3ZhbHVlLCBjaGFubmVsLT5tYXhfdmFsdWUsCisgICAgICAgICAgICBnc3RfY29sb3JfYmFsYW5jZV9nZXRfdmFsdWUgKGJhbGFuY2UsIGNoYW5uZWwpKTsKKyAgICAgICAgcmVzID0gc2NhbmYgKCIlZCIsICZuZXdfdmFsdWUpOworICAgICAgICBpZiAocmVzICE9IDEgfHwgbmV3X3ZhbHVlID09IC0xKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBnc3RfY29sb3JfYmFsYW5jZV9zZXRfdmFsdWUgKGJhbGFuY2UsIGNoYW5uZWwsIG5ld192YWx1ZSk7CisgICAgICB9CisgICAgfQorICAgIGNhc2UgJ3YnOgorICAgIHsKKyAgICAgIEdzdFZpZGVvT3JpZW50YXRpb24gKnZpZG9yaWVudCA9IEdTVF9WSURFT19PUklFTlRBVElPTiAoc291cmNlKTsKKyAgICAgIGdib29sZWFuIGZsaXAgPSBGQUxTRTsKKyAgICAgIGdpbnQgY2VudGVyID0gMDsKKworICAgICAgcHJpbnRmICgiXG4iKTsKKworICAgICAgaWYgKGdzdF92aWRlb19vcmllbnRhdGlvbl9nZXRfaGZsaXAgKHZpZG9yaWVudCwgJmZsaXApKSB7CisgICAgICAgIGdpbnQgbmV3X3ZhbHVlOworCisgICAgICAgIHByaW50ZiAoIkhvcml6b250YWwgZmxpcCBpcyAlc1xuIiwgZmxpcCA/ICJvbiIgOiAib2ZmIik7CisgICAgICAgIHByaW50ZiAoIlxudHlwZSAxIHRvIHRvZ2dsZSAoLTEgdG8gY2FuY2VsKTogIik7CisgICAgICAgIHJlcyA9IHNjYW5mICgiJWQiLCAmbmV3X3ZhbHVlKTsKKyAgICAgICAgaWYgKHJlcyAhPSAxIHx8IG5ld192YWx1ZSA9PSAxKSB7CisgICAgICAgICAgZmxpcCA9ICFmbGlwOworICAgICAgICAgIGlmIChnc3RfdmlkZW9fb3JpZW50YXRpb25fc2V0X2hmbGlwICh2aWRvcmllbnQsIGZsaXApKSB7CisgICAgICAgICAgICBnc3RfdmlkZW9fb3JpZW50YXRpb25fZ2V0X2hmbGlwICh2aWRvcmllbnQsICZmbGlwKTsKKyAgICAgICAgICAgIHByaW50ZiAoIk5vdyBob3Jpem9udGFsIGZsaXAgaXMgJXNcbiIsIGZsaXAgPyAib24iIDogIm9mZiIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYgKCJFcnJvciB0b2dnbGluZyBob3Jpem9udGFsIGZsaXBcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiSG9yaXpvbnRhbCBmbGlwIGNvbnRyb2wgbm90IGF2YWlsYWJsZVxuIik7CisgICAgICB9CisKKyAgICAgIGlmIChnc3RfdmlkZW9fb3JpZW50YXRpb25fZ2V0X3ZmbGlwICh2aWRvcmllbnQsICZmbGlwKSkgeworICAgICAgICBnaW50IG5ld192YWx1ZTsKKworICAgICAgICBwcmludGYgKCJcblZlcnRpY2FsIGZsaXAgaXMgJXNcbiIsIGZsaXAgPyAib24iIDogIm9mZiIpOworICAgICAgICBwcmludGYgKCJcbnR5cGUgMSB0byB0b2dnbGUgKC0xIHRvIGNhbmNlbCk6ICIpOworICAgICAgICByZXMgPSBzY2FuZiAoIiVkIiwgJm5ld192YWx1ZSk7CisgICAgICAgIGlmIChyZXMgIT0gMSB8fCBuZXdfdmFsdWUgPT0gMSkgeworICAgICAgICAgIGZsaXAgPSAhZmxpcDsKKyAgICAgICAgICBpZiAoZ3N0X3ZpZGVvX29yaWVudGF0aW9uX3NldF92ZmxpcCAodmlkb3JpZW50LCBmbGlwKSkgeworICAgICAgICAgICAgZ3N0X3ZpZGVvX29yaWVudGF0aW9uX2dldF92ZmxpcCAodmlkb3JpZW50LCAmZmxpcCk7CisgICAgICAgICAgICBwcmludGYgKCJOb3cgdmVydGljYWwgZmxpcCBpcyAlc1xuIiwgZmxpcCA/ICJvbiIgOiAib2ZmIik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZiAoIkVycm9yIHRvZ2dsaW5nIHZlcnRpY2FsIGZsaXBcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiVmVydGljYWwgZmxpcCBjb250cm9sIG5vdCBhdmFpbGFibGVcbiIpOworICAgICAgfQorCisgICAgICBpZiAoZ3N0X3ZpZGVvX29yaWVudGF0aW9uX2dldF9oY2VudGVyICh2aWRvcmllbnQsICZjZW50ZXIpKSB7CisgICAgICAgIHByaW50ZiAoIkhvcml6b250YWwgY2VudGVyIGlzICVkXG4iLCBjZW50ZXIpOworICAgICAgICBwcmludGYgKCJcbnR5cGUgdGhlIG5ldyBob3Jpem9udGFsIGNlbnRlciB2YWx1ZSAoLTEgdG8gY2FuY2VsKTogIik7CisgICAgICAgIHJlcyA9IHNjYW5mICgiJWQiLCAmY2VudGVyKTsKKyAgICAgICAgaWYgKHJlcyAhPSAxIHx8IGNlbnRlciAhPSAtMSkgeworICAgICAgICAgIGlmIChnc3RfdmlkZW9fb3JpZW50YXRpb25fc2V0X2hjZW50ZXIgKHZpZG9yaWVudCwgY2VudGVyKSkgeworICAgICAgICAgICAgZ3N0X3ZpZGVvX29yaWVudGF0aW9uX2dldF9oY2VudGVyICh2aWRvcmllbnQsICZjZW50ZXIpOworICAgICAgICAgICAgcHJpbnRmICgiTm93IGhvcml6b250YWwgY2VudGVyIGlzICVkXG4iLCBjZW50ZXIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYgKCJFcnJvciBzZXR0aW5nIGhvcml6b250YWwgY2VudGVyXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZiAoIkhvcml6b250YWwgY2VudGVyIGNvbnRyb2wgbm90IGF2YWlsYWJsZVxuIik7CisgICAgICB9CisKKyAgICAgIGlmIChnc3RfdmlkZW9fb3JpZW50YXRpb25fZ2V0X3ZjZW50ZXIgKHZpZG9yaWVudCwgJmNlbnRlcikpIHsKKyAgICAgICAgcHJpbnRmICgiVmVydGljYWwgY2VudGVyIGlzICVkXG4iLCBjZW50ZXIpOworICAgICAgICBwcmludGYgKCJcbnR5cGUgdGhlIG5ldyB2ZXJ0aWNhbCBjZW50ZXIgdmFsdWUgKC0xIHRvIGNhbmNlbCk6ICIpOworICAgICAgICByZXMgPSBzY2FuZiAoIiVkIiwgJmNlbnRlcik7CisgICAgICAgIGlmIChyZXMgIT0gMSB8fCBjZW50ZXIgIT0gLTEpIHsKKyAgICAgICAgICBpZiAoZ3N0X3ZpZGVvX29yaWVudGF0aW9uX3NldF92Y2VudGVyICh2aWRvcmllbnQsIGNlbnRlcikpIHsKKyAgICAgICAgICAgIGdzdF92aWRlb19vcmllbnRhdGlvbl9nZXRfdmNlbnRlciAodmlkb3JpZW50LCAmY2VudGVyKTsKKyAgICAgICAgICAgIHByaW50ZiAoIk5vdyB2ZXJ0aWNhbCBjZW50ZXIgaXMgJWRcbiIsIGNlbnRlcik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZiAoIkVycm9yIHNldHRpbmcgdmVydGljYWwgY2VudGVyXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZiAoIlZlcnRpY2FsIGNlbnRlciBjb250cm9sIG5vdCBhdmFpbGFibGVcbiIpOworICAgICAgfQorCisgICAgfQorICAgICAgYnJlYWs7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKG9wdCAhPSAxMCkKKyAgICAgICAgcHJpbnRmICgiZXJyb3I6IGludmFsaWQgb3B0aW9uICVjIiwgb3B0KTsKKyAgICAgIGJyZWFrOworICB9CisKK2RvbmU6CisKKyAgcmV0dXJuOworCit9CisKK3N0YXRpYyBncG9pbnRlcgorcmVhZF91c2VyIChncG9pbnRlciBkYXRhKQoreworCisgIGNoYXIgb3B0OworCisgIHdoaWxlICghZXhpdF9yZWFkKSB7CisKKyAgICBwcmludF9vcHRpb25zICgpOworCisgICAgZG8geworICAgICAgb3B0ID0gZ2V0Y2hhciAoKTsKKyAgICAgIGlmIChleGl0X3JlYWQpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSB3aGlsZSAob3B0ID09ICdcbicpOworCisgICAgcnVuX29wdGlvbnMgKG9wdCk7CisKKyAgfQorCisgIHJldHVybiBOVUxMOworCit9CisKK3N0YXRpYyBnYm9vbGVhbgorbXlfYnVzX2NhbGxiYWNrIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBncG9pbnRlciBkYXRhKQoreworCisgIHN3aXRjaCAoR1NUX01FU1NBR0VfVFlQRSAobWVzc2FnZSkpIHsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VSUk9SOnsKKyAgICAgIEdFcnJvciAqZXJyOworICAgICAgZ2NoYXIgKmRlYnVnOworICAgICAgZ2NoYXIgKnN0cjsKKworICAgICAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1lc3NhZ2UsICZlcnIsICZkZWJ1Zyk7CisgICAgICBzdHIgPSBnc3RfZWxlbWVudF9nZXRfbmFtZSAobWVzc2FnZS0+c3JjKTsKKyAgICAgIGdfcHJpbnQgKCIlcyBlcnJvcjogJXNcbiIsIHN0ciwgZXJyLT5tZXNzYWdlKTsKKyAgICAgIGdfZnJlZSAoc3RyKTsKKyAgICAgIGdfcHJpbnQgKCJEZWJ1ZzogJXNcbiIsIGRlYnVnKTsKKworICAgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICAgICAgZ19mcmVlIChkZWJ1Zyk7CisKKyAgICAgIHByaW50ZiAoInByZXNzZSA8RU5URVI+IGtleSB0byBleGl0XG4iKTsKKyAgICAgIGV4aXRfcmVhZCA9IDE7CisgICAgICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01FU1NBR0VfRU9TOgorICAgICAgLyogZW5kLW9mLXN0cmVhbSAqLworICAgICAgcHJpbnRmICgicHJlc3NlIGFueSBrZXkgdG8gZXhpdFxuIik7CisgICAgICBleGl0X3JlYWQgPSAxOworICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisKKyAgR1RocmVhZCAqaW5wdXRfdGhyZWFkOworICBnaW50IG51bWJ1ZmZlcnMgPSAtMTsKKyAgZ2NoYXIgZGV2aWNlWzEyOF0gPSB7ICdcMCcgfTsKKyAgZ2NoYXIgaW5wdXRbMTI4XSA9IHsgJ1wwJyB9OworICBndWxvbmcgZnJlcXVlbmN5ID0gMDsKKyAgR3N0QnVzICpidXM7CisKKyAgLyogc2VlIGZvciBpbnB1dCBvcHRpb24gKi8KKworICBpbnQgYzsKKworICB3aGlsZSAoMSkgeworICAgIHN0YXRpYyBjaGFyIGxvbmdfb3B0aW9uc19kZXNjW11bNjRdID0geworICAgICAgeyJOdW1iZXIgb2YgYnVmZmVycyB0byBvdXRwdXQgYmVmb3JlIHNlbmRpbmcgRU9TIn0sCisgICAgICB7IkRldmljZSBsb2NhdGlvbi4gQ29tbW9uIGluIC9kZXYvdmlkZW8wIn0sCisgICAgICB7ImlucHV0L291dHB1dCAoY2hhbm5lbCkgdG8gc3dpdGNoIHRvIn0sCisgICAgICB7ImZyZXF1ZW5jeSB0byB0dW5lIHRvIChpbiBIeikifSwKKyAgICAgIHswLCAwLCAwLCAwfQorICAgIH07CisgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisgICAgICB7Im51bWJ1ZmZlcnMiLCAxLCAwLCAnbid9LAorICAgICAgeyJkZXZpY2UiLCAxLCAwLCAnZCd9LAorICAgICAgeyJpbnB1dCIsIDEsIDAsICdpJ30sCisgICAgICB7ImZyZXF1ZW5jeSIsIDEsIDAsICdmJ30sCisgICAgICB7MCwgMCwgMCwgMH0KKyAgICB9OworICAgIC8qIGdldG9wdF9sb25nIHN0b3JlcyB0aGUgb3B0aW9uIGluZGV4IGhlcmUuICovCisgICAgaW50IG9wdGlvbl9pbmRleCA9IDA7CisKKyAgICBjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJuOmQ6aTpmOmgiLCBsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOworCisgICAgLyogRGV0ZWN0IHRoZSBlbmQgb2YgdGhlIG9wdGlvbnMuICovCisgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgIHByaW50ZiAoInRpcDogdXNlIC1oIHRvIHNlZSBoZWxwIG1lc3NhZ2UuXG4iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAwOgorICAgICAgICAvKiBJZiB0aGlzIG9wdGlvbiBzZXQgYSBmbGFnLCBkbyBub3RoaW5nIGVsc2Ugbm93LiAqLworICAgICAgICBpZiAobG9uZ19vcHRpb25zW29wdGlvbl9pbmRleF0uZmxhZyAhPSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBwcmludGYgKCJvcHRpb24gJXMiLCBsb25nX29wdGlvbnNbb3B0aW9uX2luZGV4XS5uYW1lKTsKKyAgICAgICAgaWYgKG9wdGFyZykKKyAgICAgICAgICBwcmludGYgKCIgd2l0aCBhcmcgJXMiLCBvcHRhcmcpOworICAgICAgICBwcmludGYgKCJcbiIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAnbic6CisgICAgICAgIG51bWJ1ZmZlcnMgPSBhdG9pIChvcHRhcmcpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAnZCc6CisgICAgICAgIHN0cm5jcHkgKGRldmljZSwgb3B0YXJnLCBzaXplb2YgKGRldmljZSkgLyBzaXplb2YgKGRldmljZVswXSkpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAnaSc6CisgICAgICAgIHN0cm5jcHkgKGlucHV0LCBvcHRhcmcsIHNpemVvZiAoaW5wdXQpIC8gc2l6ZW9mIChpbnB1dFswXSkpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAnZic6CisgICAgICAgIGZyZXF1ZW5jeSA9IGF0b2wgKG9wdGFyZyk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdoJzoKKyAgICAgICAgcHJpbnRmICgiVXNhZ2U6IHY0bDJzcmMtdGVzdCBbT1BUSU9OXS4uLlxuIik7CisgICAgICAgIGZvciAoYyA9IDA7IGxvbmdfb3B0aW9uc1tjXS5uYW1lOyArK2MpIHsKKyAgICAgICAgICBwcmludGYgKCItJWMsIC0tJXNcclx0XHRcdFx0JXNcbiIsIGxvbmdfb3B0aW9uc1tjXS52YWwsCisgICAgICAgICAgICAgIGxvbmdfb3B0aW9uc1tjXS5uYW1lLCBsb25nX29wdGlvbnNfZGVzY1tjXSk7CisgICAgICAgIH0KKyAgICAgICAgZXhpdCAoMCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICc/JzoKKyAgICAgICAgLyogZ2V0b3B0X2xvbmcgYWxyZWFkeSBwcmludGVkIGFuIGVycm9yIG1lc3NhZ2UuICovCisgICAgICAgIHByaW50ZiAoIlVzZSAtaCB0byBzZWUgaGVscCBtZXNzYWdlLlxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBhYm9ydCAoKTsKKyAgICB9CisgIH0KKworICAvKiBQcmludCBhbnkgcmVtYWluaW5nIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgKG5vdCBvcHRpb25zKS4gKi8KKyAgaWYgKG9wdGluZCA8IGFyZ2MpIHsKKyAgICBwcmludGYgKCJVc2UgLWggdG8gc2VlIGhlbHAgbWVzc2FnZS5cbiIgIm5vbi1vcHRpb24gQVJHVi1lbGVtZW50czogIik7CisgICAgd2hpbGUgKG9wdGluZCA8IGFyZ2MpCisgICAgICBwcmludGYgKCIlcyAiLCBhcmd2W29wdGluZCsrXSk7CisgICAgcHV0Y2hhciAoJ1xuJyk7CisgIH0KKworICAvKiBpbml0ICovCisgIGdzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIC8qIGNyZWF0ZSBlbGVtZW50cyAqLworICBpZiAoIShwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKCJteV9waXBlbGluZSIpKSkgeworICAgIGZwcmludGYgKHN0ZGVyciwgImVycm9yOiBnc3RfcGlwZWxpbmVfbmV3IHJldHVybiBOVUxMIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKCEoc291cmNlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidjRsMnNyYyIsIE5VTEwpKSkgeworICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICAgImVycm9yOiBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKFwidjRsMnNyY1wiLCBOVUxMKSByZXR1cm4gTlVMTCIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmICghKHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ4dmltYWdlc2luayIsIE5VTEwpKSkgeworICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICAgImVycm9yOiBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKFwieHZpbWFnZXNpbmtcIiwgTlVMTCkgcmV0dXJuIE5VTEwiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAobnVtYnVmZmVycyA+IC0xKSB7CisgICAgZ19vYmplY3Rfc2V0IChzb3VyY2UsICJudW0tYnVmZmVycyIsIG51bWJ1ZmZlcnMsIE5VTEwpOworICB9CisgIGlmIChkZXZpY2VbMF0pIHsKKyAgICBnX29iamVjdF9zZXQgKHNvdXJjZSwgImRldmljZSIsIGRldmljZSwgTlVMTCk7CisgIH0KKyAgaWYgKGlucHV0WzBdKSB7CisgICAgZ19vYmplY3Rfc2V0IChzb3VyY2UsICJpbnB1dCIsIGlucHV0LCBOVUxMKTsKKyAgfQorICBpZiAoZnJlcXVlbmN5KSB7CisgICAgZ19vYmplY3Rfc2V0IChzb3VyY2UsICJmcmVxdWVuY3kiLCBmcmVxdWVuY3ksIE5VTEwpOworICB9CisKKyAgLyogeW91IHdvdWxkIG5vcm1hbGx5IGNoZWNrIHRoYXQgdGhlIGVsZW1lbnRzIHdlcmUgY3JlYXRlZCBwcm9wZXJseSAqLworICBidXMgPSBnc3RfcGlwZWxpbmVfZ2V0X2J1cyAoR1NUX1BJUEVMSU5FIChwaXBlbGluZSkpOworICBnc3RfYnVzX2FkZF93YXRjaCAoYnVzLCBteV9idXNfY2FsbGJhY2ssIE5VTEwpOworCisgIC8qIHB1dCB0b2dldGhlciBhIHBpcGVsaW5lICovCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc291cmNlLCBzaW5rLCBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19wYWRzIChzb3VyY2UsICJzcmMiLCBzaW5rLCAic2luayIpOworCisgIC8qIHN0YXJ0IHRoZSBwaXBlbGluZSAqLworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKEdTVF9FTEVNRU5UIChwaXBlbGluZSksIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgRkFMU0UpOworCisgIGlucHV0X3RocmVhZCA9IGdfdGhyZWFkX3RyeV9uZXcgKCJ2NGwyc3JjLXRlc3QiLCByZWFkX3VzZXIsIHNvdXJjZSwgTlVMTCk7CisKKyAgaWYgKGlucHV0X3RocmVhZCA9PSBOVUxMKSB7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiZXJyb3I6IGdfdGhyZWFkX3RyeV9uZXcoKSBmYWlsZWQiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBnX21haW5fbG9vcF9ydW4gKGxvb3ApOworICBnX3RocmVhZF9qb2luIChpbnB1dF90aHJlYWQpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoR1NUX0VMRU1FTlQgKHBpcGVsaW5lKSwgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKworICBnc3RfZGVpbml0ICgpOworCisgIHJldHVybiAwOworCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pY2xlcy92aWRlb2JveC10ZXN0LmMgYi90ZXN0cy9pY2xlcy92aWRlb2JveC10ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM4NWEzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ljbGVzL3ZpZGVvYm94LXRlc3QuYwpAQCAtMCwwICsxLDE0MSBAQAorLyogR1N0cmVhbWVyIGludGVyYWN0aXZlIHZpZGVvYm94IHRlc3QKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworc3RhdGljIEdzdEVsZW1lbnQgKgorbWFrZV9waXBlbGluZSAoZ2ludCB0eXBlKQoreworICBHc3RFbGVtZW50ICpyZXN1bHQ7CisgIGdjaGFyICpwc3RyOworCisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgMDoKKyAgICAgIHBzdHIgPSBnX3N0cmR1cF9wcmludGYgKCJ2aWRlb3Rlc3RzcmMgISB2aWRlb2JveCBuYW1lPWJveCAhICIKKyAgICAgICAgICAieHZpbWFnZXNpbmsiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJlc3VsdCA9IGdzdF9wYXJzZV9sYXVuY2hfZnVsbCAocHN0ciwgTlVMTCwgR1NUX1BBUlNFX0ZMQUdfTk9ORSwgTlVMTCk7CisgIGdfcHJpbnQgKCJjcmVhdGVkIHRlc3QgJWQ6IFwiJXNcIlxuIiwgdHlwZSwgcHN0cik7CisgIGdfZnJlZSAocHN0cik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworI2RlZmluZSBNQVhfUk9VTkQgNTAwCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBHc3RFbGVtZW50ICpwaXBlLCAqYm94OworICBnaW50IGxlZnQsIHJpZ2h0OworICBnaW50IHRvcCwgYm90dG9tOworICBnaW50IGxkaXIsIHJkaXI7CisgIGdpbnQgdGRpciwgYmRpcjsKKyAgZ2ludCByb3VuZCwgdHlwZSwgc3RvcDsKKworICBnc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICB0eXBlID0gMDsKKyAgc3RvcCA9IC0xOworCisgIGlmIChhcmdjID4gMSkgeworICAgIHR5cGUgPSBhdG9pIChhcmd2WzFdKTsKKyAgICBzdG9wID0gdHlwZSArIDE7CisgIH0KKworICB3aGlsZSAoVFJVRSkgeworICAgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgICBwaXBlID0gbWFrZV9waXBlbGluZSAodHlwZSk7CisgICAgaWYgKHBpcGUgPT0gTlVMTCkKKyAgICAgIGJyZWFrOworCisgICAgYm94ID0gZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAocGlwZSksICJib3giKTsKKyAgICBnX2Fzc2VydCAoYm94KTsKKworICAgIHRvcCA9IGJvdHRvbSA9IGxlZnQgPSByaWdodCA9IDA7CisgICAgdGRpciA9IGJkaXIgPSAtMTA7CisgICAgbGRpciA9IHJkaXIgPSAxMDsKKworICAgIGZvciAocm91bmQgPSAwOyByb3VuZCA8IE1BWF9ST1VORDsgcm91bmQrKykgeworICAgICAgZ19wcmludCAoImJveCB0byAlNGQgJTRkICU0ZCAlNGQgKCVkLyVkKSAgIFxyIiwgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0LAorICAgICAgICAgIHJvdW5kLCBNQVhfUk9VTkQpOworCisgICAgICBnX29iamVjdF9zZXQgKGJveCwgInRvcCIsIHRvcCwgImJvdHRvbSIsIGJvdHRvbSwgImxlZnQiLCBsZWZ0LCAicmlnaHQiLAorICAgICAgICAgIHJpZ2h0LCBOVUxMKTsKKworICAgICAgaWYgKHJvdW5kID09IDApCisgICAgICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgICAgICB0b3AgKz0gdGRpcjsKKyAgICAgIGlmICh0b3AgPj0gNTApCisgICAgICAgIHRkaXIgPSAtMTA7CisgICAgICBlbHNlIGlmICh0b3AgPCAtNTApCisgICAgICAgIHRkaXIgPSAxMDsKKworICAgICAgYm90dG9tICs9IGJkaXI7CisgICAgICBpZiAoYm90dG9tID49IDQwKQorICAgICAgICBiZGlyID0gLTEwOworICAgICAgZWxzZSBpZiAoYm90dG9tIDwgLTYwKQorICAgICAgICBiZGlyID0gMTA7CisKKyAgICAgIGxlZnQgKz0gbGRpcjsKKyAgICAgIGlmIChsZWZ0ID49IDYwKQorICAgICAgICBsZGlyID0gLTEwOworICAgICAgZWxzZSBpZiAobGVmdCA8IC04MCkKKyAgICAgICAgbGRpciA9IDEwOworCisgICAgICByaWdodCArPSByZGlyOworICAgICAgaWYgKHJpZ2h0ID49IDgwKQorICAgICAgICByZGlyID0gLTEwOworICAgICAgZWxzZSBpZiAocmlnaHQgPCAtOTApCisgICAgICAgIHJkaXIgPSAxMDsKKworICAgICAgbWVzc2FnZSA9CisgICAgICAgICAgZ3N0X2J1c19wb2xsIChHU1RfRUxFTUVOVF9CVVMgKHBpcGUpLCBHU1RfTUVTU0FHRV9FUlJPUiwKKyAgICAgICAgICA1MCAqIEdTVF9NU0VDT05EKTsKKyAgICAgIGlmIChtZXNzYWdlKSB7CisgICAgICAgIGdfcHJpbnQgKCJnb3QgZXJyb3IgICAgICAgICAgIFxuIik7CisKKyAgICAgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgfQorICAgIH0KKyAgICBnX3ByaW50ICgidGVzdCAlZCBkb25lICAgICAgICAgICAgICAgICAgICBcbiIsIHR5cGUpOworCisgICAgZ3N0X29iamVjdF91bnJlZiAoYm94KTsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGUsIEdTVF9TVEFURV9OVUxMKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlKTsKKworICAgIHR5cGUrKzsKKyAgICBpZiAodHlwZSA9PSBzdG9wKQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pY2xlcy92aWRlb2Nyb3AtdGVzdC5jIGIvdGVzdHMvaWNsZXMvdmlkZW9jcm9wLXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWNmYTMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaWNsZXMvdmlkZW9jcm9wLXRlc3QuYwpAQCAtMCwwICsxLDM1NiBAQAorLyogR1N0cmVhbWVyIGludGVyYWN0aXZlIHRlc3QgZm9yIHRoZSB2aWRlb2Nyb3AgZWxlbWVudAorICogQ29weXJpZ2h0IChDKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAodmlkZW9jcm9wX3Rlc3RfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgdmlkZW9jcm9wX3Rlc3RfZGVidWcKKworI2RlZmluZSBPVVRfV0lEVEggICAgICA2NDAKKyNkZWZpbmUgT1VUX0hFSUdIVCAgICAgNDgwCisjZGVmaW5lIFRJTUVfUEVSX1RFU1QgICAxMCAgICAgIC8qIHNlY29uZHMgZWFjaCBmb3JtYXQgaXMgdGVzdGVkICovCisjZGVmaW5lIEZSQU1FUkFURSAgICAgICAxNSAgICAgIC8qIGZyYW1lcyBwZXIgc2Vjb25kICAgICAgICAgICAgICovCisKKyNpZm5kZWYgREVGQVVMVF9WSURFT1NJTksKKyNkZWZpbmUgREVGQVVMVF9WSURFT1NJTksgInh2aW1hZ2VzaW5rIgorI2VuZGlmCisKK3N0YXRpYyBnYm9vbGVhbgorY2hlY2tfYnVzX2Zvcl9lcnJvcnMgKEdzdEJ1cyAqIGJ1cywgR3N0Q2xvY2tUaW1lIG1heF93YWl0X3RpbWUpCit7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKworICBtc2cgPSBnc3RfYnVzX3BvbGwgKGJ1cywgR1NUX01FU1NBR0VfRVJST1IsIG1heF93YWl0X3RpbWUpOworCisgIGlmIChtc2cpIHsKKyAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisgICAgZ2NoYXIgKmRlYnVnID0gTlVMTDsKKworICAgIGdfYXNzZXJ0IChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VSUk9SKTsKKyAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobXNnLCAmZXJyLCAmZGVidWcpOworICAgIEdTVF9FUlJPUiAoIkVSUk9SOiAlcyBbJXNdIiwgZXJyLT5tZXNzYWdlLCBkZWJ1Zyk7CisgICAgZ19wcmludCAoIlxuPT09PT09PT09PT0+IEVSUk9SOiAlc1xuJXNcblxuIiwgZXJyLT5tZXNzYWdlLCBkZWJ1Zyk7CisgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgZ19mcmVlIChkZWJ1Zyk7CisgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgIH0KKworICByZXR1cm4gKG1zZyAhPSBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfd2l0aF9jYXBzIChHc3RFbGVtZW50ICogc3JjLCBHc3RFbGVtZW50ICogdmlkZW9jcm9wLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0Q2xvY2tUaW1lIHRpbWVfcnVuOworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR1RpbWVyICp0aW1lcjsKKyAgR3N0QnVzICpidXM7CisgIEdzdFBhZCAqcGFkOworICBndWludCBoY3JvcDsKKyAgZ3VpbnQgdmNyb3A7CisKKyAgLyogY2FwcyBtdXN0IGJlIHdyaXRhYmxlLCB3ZSBjYW4ndCBjaGVjayB0aGF0IGhlcmUgdGhvdWdoICovCisgIGdfYXNzZXJ0IChHU1RfQ0FQU19SRUZDT1VOVF9WQUxVRSAoY2FwcykgPT0gMSk7CisKKyAgdGltZXIgPSBnX3RpbWVyX25ldyAoKTsKKyAgdmNyb3AgPSAwOworICBoY3JvcCA9IDA7CisKKyAgcGlwZWxpbmUgPSBHU1RfRUxFTUVOVCAoZ3N0X2VsZW1lbnRfZ2V0X3BhcmVudCAodmlkZW9jcm9wKSk7CisgIGdfYXNzZXJ0IChHU1RfSVNfUElQRUxJTkUgKHBpcGVsaW5lKSk7CisKKyAgLyogYXQgdGhpcyBwb2ludCB0aGUgcGlwZWxpbmUgaXMgaW4gUExBWUlORyBzdGF0ZTsgd2Ugb25seSB3YW50IHRvIGNhcHR1cmUKKyAgICogZXJyb3JzIHJlc3VsdGluZyBmcm9tIG91ciBvbi10aGUtZmx5IGNoYW5naW5nIG9mIHRoZSBmaWx0ZXJjYXBzICovCisgIGJ1cyA9IGdzdF9waXBlbGluZV9nZXRfYnVzIChHU1RfUElQRUxJTkUgKHBpcGVsaW5lKSk7CisKKyAgLyogcGFkIHRvIGJsb2NrICovCisgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzcmMsICJzcmMiKTsKKworICB0aW1lX3J1biA9IDA7CisgIGRvIHsKKyAgICBHc3RDbG9ja1RpbWUgd2FpdF90aW1lLCB3YWl0ZWRfZm9yX2Jsb2NrOworCisgICAgaWYgKGNoZWNrX2J1c19mb3JfZXJyb3JzIChidXMsIDApKQorICAgICAgYnJlYWs7CisKKyAgICB3YWl0X3RpbWUgPSBHU1RfU0VDT05EIC8gRlJBTUVSQVRFOworCisgICAgR1NUX0xPRyAoImhjcm9wID0gJTNkLCB2Y3JvcCA9ICUzZCIsIHZjcm9wLCBoY3JvcCk7CisKKyAgICBnX3RpbWVyX3Jlc2V0ICh0aW1lcik7CisKKyAgICAvKiBuZWVkIHRvIGJsb2NrIHRoZSBzdHJlYW1pbmcgdGhyZWFkIHdoaWxlIGNoYW5naW5nIHRoZXNlIHByb3BlcnRpZXMsCisgICAgICogb3RoZXJ3aXNlIHdlIG1pZ2h0IGdldCByYW5kb20gbm90LW5lZ290aWF0ZWQgZXJyb3JzICh3aGVuIGNhcHMgYXJlCisgICAgICogY2hhbmdlZCBpbiBiZXR3ZWVuIHVwc3RyZWFtIGNhbGxpbmcgcGFkX2FsbG9jX2J1ZmZlcigpIGFuZCBwdXNoaW5nCisgICAgICogdGhlIHByb2Nlc3NlZCBidWZmZXI/KSAgRklYTUUgc2hvdWxkIG5vdCBiZSBuZWVkZWQgKi8KKyAgICAvKiBnc3RfcGFkX3NldF9ibG9ja2VkIChwYWQsIFRSVUUpOyAqLworICAgIGdfb2JqZWN0X3NldCAodmlkZW9jcm9wLCAibGVmdCIsIGhjcm9wLCAidG9wIiwgdmNyb3AsIE5VTEwpOworICAgIC8qIGdzdF9wYWRfc2V0X2Jsb2NrZWQgKHBhZCwgRkFMU0UpOyAqLworCisgICAgd2FpdGVkX2Zvcl9ibG9jayA9IGdfdGltZXJfZWxhcHNlZCAodGltZXIsIE5VTEwpICogKGRvdWJsZSkgR1NUX1NFQ09ORDsKKyAgICAvKiBHU1RfTE9HICgid2FpdGVkOiAlIiBHU1RfVElNRV9GT1JNQVQgIiwgZnJhbWUgbGVuOiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgR1NUX1RJTUVfQVJHUyAod2FpdGVkX2Zvcl9ibG9jayksIEdTVF9USU1FX0FSR1MgKHdhaXRfdGltZSkpOyAqLworICAgICsrdmNyb3A7CisgICAgKytoY3JvcDsKKworICAgIGlmICh3YWl0X3RpbWUgPiB3YWl0ZWRfZm9yX2Jsb2NrKSB7CisgICAgICBnX3VzbGVlcCAoKHdhaXRfdGltZSAtIHdhaXRlZF9mb3JfYmxvY2spIC8gR1NUX01TRUNPTkQpOworICAgIH0KKworICAgIHRpbWVfcnVuICs9IHdhaXRfdGltZTsKKyAgfQorICB3aGlsZSAodGltZV9ydW4gPCAoVElNRV9QRVJfVEVTVCAqIEdTVF9TRUNPTkQpKTsKKworICBnX3RpbWVyX2Rlc3Ryb3kgKHRpbWVyKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworfQorCisvKiByZXR1cm4gYSBsaXN0IG9mIGNhcHMgd2hlcmUgd2Ugb25seSBuZWVkIHRvIHNldAorICogd2lkdGggYW5kIGhlaWdodCB0byBnZXQgZml4ZWQgY2FwcyAqLworc3RhdGljIEdMaXN0ICoKK3ZpZGVvX2Nyb3BfZ2V0X3Rlc3RfY2FwcyAoR3N0RWxlbWVudCAqIHZpZGVvY3JvcCkKK3sKKyAgY29uc3QgR3N0Q2FwcyAqYWxsb3dlZF9jYXBzOworICBHc3RQYWQgKnNyY3BhZDsKKyAgR0xpc3QgKmxpc3QgPSBOVUxMOworICBndWludCBpOworCisgIHNyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkICh2aWRlb2Nyb3AsICJzcmMiKTsKKyAgZ19hc3NlcnQgKHNyY3BhZCAhPSBOVUxMKTsKKyAgYWxsb3dlZF9jYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHNyY3BhZCk7CisgIGdfYXNzZXJ0IChhbGxvd2VkX2NhcHMgIT0gTlVMTCk7CisKKyAgZm9yIChpID0gMDsgaSA8IGdzdF9jYXBzX2dldF9zaXplIChhbGxvd2VkX2NhcHMpOyArK2kpIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKm5ld19zdHJ1Y3R1cmU7CisgICAgR3N0Q2FwcyAqc2luZ2xlX2NhcHM7CisKKyAgICBzaW5nbGVfY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKyAgICBuZXdfc3RydWN0dXJlID0KKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9jb3B5IChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChhbGxvd2VkX2NhcHMsIGkpKTsKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAobmV3X3N0cnVjdHVyZSwgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLAorICAgICAgICBGUkFNRVJBVEUsIDEsIE5VTEwpOworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChuZXdfc3RydWN0dXJlLCAid2lkdGgiKTsKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAobmV3X3N0cnVjdHVyZSwgImhlaWdodCIpOworICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKHNpbmdsZV9jYXBzLCBuZXdfc3RydWN0dXJlKTsKKworICAgIC8qIHNob3VsZCBiZSBmaXhlZCB3aXRob3V0IHdpZHRoL2hlaWdodCAqLworICAgIGdfYXNzZXJ0IChnc3RfY2Fwc19pc19maXhlZCAoc2luZ2xlX2NhcHMpKTsKKworICAgIGxpc3QgPSBnX2xpc3RfcHJlcGVuZCAobGlzdCwgc2luZ2xlX2NhcHMpOworICB9CisKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKworICByZXR1cm4gbGlzdDsKK30KKworc3RhdGljIGdjaGFyICpvcHRfdmlkZW9zaW5rX3N0cjsgICAgICAgIC8qIE5VTEwgKi8KK3N0YXRpYyBnY2hhciAqb3B0X2ZpbHRlcmNhcHNfc3RyOyAgICAgICAvKiBOVUxMICovCitzdGF0aWMgZ2Jvb2xlYW4gb3B0X3dpdGhfdmlkZW9jb252ZXJ0OyAgLyogRkFMU0UgKi8KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIHN0YXRpYyBjb25zdCBHT3B0aW9uRW50cnkgdGVzdF9nb3B0aW9uc1tdID0geworICAgIHsidmlkZW9zaW5rIiwgJ1wwJywgMCwgR19PUFRJT05fQVJHX1NUUklORywgJm9wdF92aWRlb3Npbmtfc3RyLAorICAgICAgICAidmlkZW9zaW5rIHRvIHVzZSAoZGVmYXVsdDogIiBERUZBVUxUX1ZJREVPU0lOSyAiKSIsIE5VTEx9LAorICAgIHsiY2FwcyIsICdcMCcsIDAsIEdfT1BUSU9OX0FSR19TVFJJTkcsICZvcHRfZmlsdGVyY2Fwc19zdHIsCisgICAgICAgICJmaWx0ZXIgY2FwcyB0byBuYXJyb3cgZG93biBmb3JtYXRzIHRvIHRlc3QiLCBOVUxMfSwKKyAgICB7IndpdGgtdmlkZW9jb252ZXJ0IiwgJ1wwJywgMCwgR19PUFRJT05fQVJHX05PTkUsCisgICAgICAgICAgJm9wdF93aXRoX3ZpZGVvY29udmVydCwKKyAgICAgICAgICAid2hldGhlciB0byBhZGQgYW4gdmlkZW9jb252ZXJ0IGVsZW1lbnQgaW4gZnJvbnQgb2YgdGhlIHNpbmsiLAorICAgICAgICBOVUxMfSwKKyAgICB7TlVMTCwgJ1wwJywgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTH0KKyAgfTsKKyAgR09wdGlvbkNvbnRleHQgKmN0eDsKKyAgR0Vycm9yICpvcHRfZXJyID0gTlVMTDsKKworICBHc3RFbGVtZW50ICpwaXBlbGluZSwgKnNyYywgKmZpbHRlcjEsICpjcm9wLCAqc2NhbGUsICpmaWx0ZXIyLCAqY3NwLCAqc2luazsKKyAgR3N0Q2FwcyAqZmlsdGVyX2NhcHMgPSBOVUxMOworICBHTGlzdCAqY2Fwc19saXN0LCAqbDsKKworICAvKiBjb21tYW5kIGxpbmUgb3B0aW9uIHBhcnNpbmcgKi8KKyAgY3R4ID0gZ19vcHRpb25fY29udGV4dF9uZXcgKCIiKTsKKyAgZ19vcHRpb25fY29udGV4dF9hZGRfZ3JvdXAgKGN0eCwgZ3N0X2luaXRfZ2V0X29wdGlvbl9ncm91cCAoKSk7CisgIGdfb3B0aW9uX2NvbnRleHRfYWRkX21haW5fZW50cmllcyAoY3R4LCB0ZXN0X2dvcHRpb25zLCBOVUxMKTsKKworICBpZiAoIWdfb3B0aW9uX2NvbnRleHRfcGFyc2UgKGN0eCwgJmFyZ2MsICZhcmd2LCAmb3B0X2VycikpIHsKKyAgICBnX2Vycm9yICgiRXJyb3IgcGFyc2luZyBjb21tYW5kIGxpbmUgb3B0aW9uczogJXMiLCBvcHRfZXJyLT5tZXNzYWdlKTsKKyAgICBnX29wdGlvbl9jb250ZXh0X2ZyZWUgKGN0eCk7CisgICAgZ19jbGVhcl9lcnJvciAoJm9wdF9lcnIpOworICAgIHJldHVybiAtMTsKKyAgfQorICBnX29wdGlvbl9jb250ZXh0X2ZyZWUgKGN0eCk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHZpZGVvY3JvcF90ZXN0X2RlYnVnLCAidmlkZW9jcm9wdGVzdCIsIDAsICJ2Y3Rlc3QiKTsKKworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCAidmlkZW90ZXN0c3JjIik7CisgIGdfYXNzZXJ0IChzcmMgIT0gTlVMTCk7CisgIGZpbHRlcjEgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJjYXBzZmlsdGVyIiwgImNhcHNmaWx0ZXIxIik7CisgIGdfYXNzZXJ0IChmaWx0ZXIxICE9IE5VTEwpOworICBjcm9wID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW9jcm9wIiwgInZpZGVvY3JvcCIpOworICBnX2Fzc2VydCAoY3JvcCAhPSBOVUxMKTsKKyAgc2NhbGUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3NjYWxlIiwgInZpZGVvc2NhbGUiKTsKKyAgZ19hc3NlcnQgKHNjYWxlICE9IE5VTEwpOworICBmaWx0ZXIyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiY2Fwc2ZpbHRlciIsICJjYXBzZmlsdGVyMiIpOworICBnX2Fzc2VydCAoZmlsdGVyMiAhPSBOVUxMKTsKKworICBpZiAob3B0X3dpdGhfdmlkZW9jb252ZXJ0KSB7CisgICAgZ19wcmludCAoIkFkZGluZyB2aWRlb2NvbnZlcnRcbiIpOworICAgIGNzcCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvY29udmVydCIsICJjb2xvcnNwYWNlIik7CisgIH0gZWxzZSB7CisgICAgY3NwID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiaWRlbnRpdHkiLCAiY29sb3JzcGFjZSIpOworICB9CisgIGdfYXNzZXJ0IChjc3AgIT0gTlVMTCk7CisKKyAgaWYgKG9wdF9maWx0ZXJjYXBzX3N0cikgeworICAgIGZpbHRlcl9jYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKG9wdF9maWx0ZXJjYXBzX3N0cik7CisgICAgaWYgKGZpbHRlcl9jYXBzID09IE5VTEwpIHsKKyAgICAgIGdfZXJyb3IgKCJJbnZhbGlkIGZpbHRlciBjYXBzIHN0cmluZyAnJXMnIiwgb3B0X2ZpbHRlcmNhcHNfc3RyKTsKKyAgICB9IGVsc2UgeworICAgICAgZ19wcmludCAoIlVzaW5nIGZpbHRlciBjYXBzICclcydcbiIsIG9wdF9maWx0ZXJjYXBzX3N0cik7CisgICAgfQorICB9CisKKyAgaWYgKG9wdF92aWRlb3Npbmtfc3RyKSB7CisgICAgZ19wcmludCAoIlRyeWluZyB2aWRlb3NpbmsgJyVzJyAuLi4iLCBvcHRfdmlkZW9zaW5rX3N0cik7CisgICAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAob3B0X3ZpZGVvc2lua19zdHIsICJzaW5rIik7CisgICAgZ19wcmludCAoIiVzXG4iLCAoc2luaykgPyAib2siIDogImVsZW1lbnQgY291bGRuJ3QgYmUgY3JlYXRlZCIpOworICB9IGVsc2UgeworICAgIHNpbmsgPSBOVUxMOworICB9CisKKyAgaWYgKHNpbmsgPT0gTlVMTCkgeworICAgIGdfcHJpbnQgKCJUcnlpbmcgdmlkZW9zaW5rICclcycgLi4uIiwgREVGQVVMVF9WSURFT1NJTkspOworICAgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKERFRkFVTFRfVklERU9TSU5LLCAic2luayIpOworICAgIGdfcHJpbnQgKCIlc1xuIiwgKHNpbmspID8gIm9rIiA6ICJlbGVtZW50IGNvdWxkbid0IGJlIGNyZWF0ZWQiKTsKKyAgfQorICBpZiAoc2luayA9PSBOVUxMKSB7CisgICAgZ19wcmludCAoIlRyeWluZyB2aWRlb3NpbmsgJyVzJyAuLi4iLCAieHZpbWFnZXNpbmsiKTsKKyAgICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgieHZpbWFnZXNpbmsiLCAic2luayIpOworICAgIGdfcHJpbnQgKCIlc1xuIiwgKHNpbmspID8gIm9rIiA6ICJlbGVtZW50IGNvdWxkbid0IGJlIGNyZWF0ZWQiKTsKKyAgfQorICBpZiAoc2luayA9PSBOVUxMKSB7CisgICAgZ19wcmludCAoIlRyeWluZyB2aWRlb3NpbmsgJyVzJyAuLi4iLCAieGltYWdlc2luayIpOworICAgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ4aW1hZ2VzaW5rIiwgInNpbmsiKTsKKyAgICBnX3ByaW50ICgiJXNcbiIsIChzaW5rKSA/ICJvayIgOiAiZWxlbWVudCBjb3VsZG4ndCBiZSBjcmVhdGVkIik7CisgIH0KKworICBnX2Fzc2VydCAoc2luayAhPSBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHNyYywgZmlsdGVyMSwgY3JvcCwgc2NhbGUsIGZpbHRlcjIsCisgICAgICBjc3AsIHNpbmssIE5VTEwpOworCisgIGlmICghZ3N0X2VsZW1lbnRfbGluayAoc3JjLCBmaWx0ZXIxKSkKKyAgICBnX2Vycm9yICgiRmFpbGVkIHRvIGxpbmsgdmlkZW90ZXN0c3JjIHRvIGNhcHNmaWx0ZXIxIik7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rIChmaWx0ZXIxLCBjcm9wKSkKKyAgICBnX2Vycm9yICgiRmFpbGVkIHRvIGxpbmsgY2Fwc2ZpbHRlcjEgdG8gdmlkZW9jcm9wIik7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rIChjcm9wLCBzY2FsZSkpCisgICAgZ19lcnJvciAoIkZhaWxlZCB0byBsaW5rIHZpZGVvY3JvcCB0byB2aWRlb3NjYWxlIik7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rIChzY2FsZSwgZmlsdGVyMikpCisgICAgZ19lcnJvciAoIkZhaWxlZCB0byBsaW5rIHZpZGVvc2NhbGUgdG8gY2Fwc2ZpbHRlcjIiKTsKKworICBpZiAoIWdzdF9lbGVtZW50X2xpbmsgKGZpbHRlcjIsIGNzcCkpCisgICAgZ19lcnJvciAoIkZhaWxlZCB0byBsaW5rIGNhcHNmaWx0ZXIyIHRvIHZpZGVvY29udmVydCIpOworCisgIGlmICghZ3N0X2VsZW1lbnRfbGluayAoY3NwLCBzaW5rKSkKKyAgICBnX2Vycm9yICgiRmFpbGVkIHRvIGxpbmsgdmlkZW9jb252ZXJ0IHRvIHZpZGVvIHNpbmsiKTsKKworICBjYXBzX2xpc3QgPSB2aWRlb19jcm9wX2dldF90ZXN0X2NhcHMgKGNyb3ApOworICBmb3IgKGwgPSBjYXBzX2xpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpIHsKKyAgICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgICAgR3N0Q2FwcyAqY2FwcywgKm91dF9jYXBzOworICAgIGdib29sZWFuIHNraXAgPSBGQUxTRTsKKyAgICBnY2hhciAqczsKKworICAgIGlmIChmaWx0ZXJfY2FwcykgeworICAgICAgR3N0Q2FwcyAqaWNhcHM7CisKKyAgICAgIGljYXBzID0gZ3N0X2NhcHNfaW50ZXJzZWN0IChmaWx0ZXJfY2FwcywgR1NUX0NBUFMgKGwtPmRhdGEpKTsKKyAgICAgIHNraXAgPSBnc3RfY2Fwc19pc19lbXB0eSAoaWNhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGljYXBzKTsKKyAgICB9CisKKyAgICAvKiB0aGlzIGlzIHRoZSBzaXplIG9mIG91ciB3aW5kb3cgKHN0YXlzIGZpeGVkKSAqLworICAgIG91dF9jYXBzID0gZ3N0X2NhcHNfY29weSAoR1NUX0NBUFMgKGwtPmRhdGEpKTsKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAob3V0X2NhcHMsIDApLCAid2lkdGgiLAorICAgICAgICBHX1RZUEVfSU5ULCBPVVRfV0lEVEgsICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBPVVRfSEVJR0hULCBOVUxMKTsKKworICAgIGdfb2JqZWN0X3NldCAoZmlsdGVyMiwgImNhcHMiLCBvdXRfY2FwcywgTlVMTCk7CisKKyAgICAvKiBmaWx0ZXIxIGdldHMgdGhlc2UgdG9vIHRvIHByZXZlbnQgdmlkZW90ZXN0c3JjIGZyb20gcmVuZWdvdGlhdGluZyAqLworICAgIGdfb2JqZWN0X3NldCAoZmlsdGVyMSwgImNhcHMiLCBvdXRfY2FwcywgTlVMTCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKG91dF9jYXBzKTsKKworICAgIGNhcHMgPSBnc3RfY2Fwc19jb3B5IChHU1RfQ0FQUyAobC0+ZGF0YSkpOworICAgIEdTVF9JTkZPICgidGVzdGluZyBmb3JtYXQ6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICAgIHMgPSBnc3RfY2Fwc190b19zdHJpbmcgKGNhcHMpOworCisgICAgaWYgKHNraXApIHsKKyAgICAgIGdfcHJpbnQgKCJTa2lwcGluZyBmb3JtYXQ6ICVzXG4iLCBzKTsKKyAgICAgIGdfZnJlZSAocyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBnX3ByaW50ICgiRm9ybWF0OiAlc1xuIiwgcyk7CisKKyAgICBjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoY2Fwcyk7CisKKyAgICAvKiBGSVhNRTogY2hlY2sgcmV0dXJuIHZhbHVlcyAqLworICAgIHJldCA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgICBpZiAocmV0ICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkgeworICAgICAgcmV0ID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChwaXBlbGluZSwgTlVMTCwgTlVMTCwgLTEpOworCisgICAgICBpZiAocmV0ICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkgeworICAgICAgICB0ZXN0X3dpdGhfY2FwcyAoc3JjLCBjcm9wLCBjYXBzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdfcHJpbnQgKCJGb3JtYXQ6ICVzIG5vdCBzdXBwb3J0ZWQgKGZhaWxlZCB0byBnbyB0byBQTEFZSU5HKVxuIiwgcyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGdfcHJpbnQgKCJGb3JtYXQ6ICVzIG5vdCBzdXBwb3J0ZWRcbiIsIHMpOworICAgIH0KKworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICBnX2ZyZWUgKHMpOworICB9CisKKyAgZ19saXN0X2ZvcmVhY2ggKGNhcHNfbGlzdCwgKEdGdW5jKSBnc3RfY2Fwc191bnJlZiwgTlVMTCk7CisgIGdfbGlzdF9mcmVlIChjYXBzX2xpc3QpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaWNsZXMvdmlkZW9jcm9wMi10ZXN0LmMgYi90ZXN0cy9pY2xlcy92aWRlb2Nyb3AyLXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzY4MDFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaWNsZXMvdmlkZW9jcm9wMi10ZXN0LmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qIEdTdHJlYW1lciBpbnRlcmFjdGl2ZSB2aWRlb2Nyb3AgdGVzdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitzdGF0aWMgR3N0RWxlbWVudCAqCittYWtlX3BpcGVsaW5lIChnaW50IHR5cGUpCit7CisgIEdzdEVsZW1lbnQgKnJlc3VsdDsKKyAgZ2NoYXIgKnBzdHI7CisKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSAwOgorICAgICAgcHN0ciA9IGdfc3RyZHVwX3ByaW50ZiAoInZpZGVvdGVzdHNyYyAhIHZpZGVvY3JvcCBuYW1lPWNyb3AgISAiCisgICAgICAgICAgInh2aW1hZ2VzaW5rIik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXN1bHQgPSBnc3RfcGFyc2VfbGF1bmNoX2Z1bGwgKHBzdHIsIE5VTEwsIEdTVF9QQVJTRV9GTEFHX05PTkUsIE5VTEwpOworICBnX3ByaW50ICgiY3JlYXRlZCB0ZXN0ICVkOiBcIiVzXCJcbiIsIHR5cGUsIHBzdHIpOworICBnX2ZyZWUgKHBzdHIpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKyNkZWZpbmUgTUFYX1JPVU5EIDUwMAorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgR3N0RWxlbWVudCAqcGlwZSwgKmNyb3A7CisgIGdpbnQgbGVmdCwgcmlnaHQ7CisgIGdpbnQgdG9wLCBib3R0b207CisgIGdpbnQgbGRpciwgcmRpcjsKKyAgZ2ludCB0ZGlyLCBiZGlyOworICBnaW50IHJvdW5kLCB0eXBlLCBzdG9wOworCisgIGdzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIHR5cGUgPSAwOworICBzdG9wID0gLTE7CisKKyAgaWYgKGFyZ2MgPiAxKSB7CisgICAgdHlwZSA9IGF0b2kgKGFyZ3ZbMV0pOworICAgIHN0b3AgPSB0eXBlICsgMTsKKyAgfQorCisgIHdoaWxlIChUUlVFKSB7CisgICAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKworICAgIHBpcGUgPSBtYWtlX3BpcGVsaW5lICh0eXBlKTsKKyAgICBpZiAocGlwZSA9PSBOVUxMKQorICAgICAgYnJlYWs7CisKKyAgICBjcm9wID0gZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAocGlwZSksICJjcm9wIik7CisgICAgZ19hc3NlcnQgKGNyb3ApOworCisgICAgdG9wID0gYm90dG9tID0gbGVmdCA9IHJpZ2h0ID0gMDsKKyAgICB0ZGlyID0gYmRpciA9IDEwOworICAgIGxkaXIgPSByZGlyID0gMTA7CisKKyAgICBmb3IgKHJvdW5kID0gMDsgcm91bmQgPCBNQVhfUk9VTkQ7IHJvdW5kKyspIHsKKyAgICAgIGdfcHJpbnQgKCJjcm9wIHRvICU0ZCAlNGQgJTRkICU0ZCAoJWQvJWQpICAgXHIiLCB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQsCisgICAgICAgICAgcm91bmQsIE1BWF9ST1VORCk7CisKKyAgICAgIGdfb2JqZWN0X3NldCAoY3JvcCwgInRvcCIsIHRvcCwgImJvdHRvbSIsIGJvdHRvbSwgImxlZnQiLCBsZWZ0LCAicmlnaHQiLAorICAgICAgICAgIHJpZ2h0LCBOVUxMKTsKKworICAgICAgaWYgKHJvdW5kID09IDApCisgICAgICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgICAgICB0b3AgKz0gdGRpcjsKKyAgICAgIGlmICh0b3AgPj0gODApCisgICAgICAgIHRkaXIgPSAtMTA7CisgICAgICBlbHNlIGlmICh0b3AgPCAxMCkKKyAgICAgICAgdGRpciA9IDEwOworCisgICAgICBib3R0b20gKz0gYmRpcjsKKyAgICAgIGlmIChib3R0b20gPj0gNjApCisgICAgICAgIGJkaXIgPSAtMTA7CisgICAgICBlbHNlIGlmIChib3R0b20gPCAxMCkKKyAgICAgICAgYmRpciA9IDEwOworCisgICAgICBsZWZ0ICs9IGxkaXI7CisgICAgICBpZiAobGVmdCA+PSAxMDApCisgICAgICAgIGxkaXIgPSAtMTA7CisgICAgICBlbHNlIGlmIChsZWZ0IDwgMTApCisgICAgICAgIGxkaXIgPSAxMDsKKworICAgICAgcmlnaHQgKz0gcmRpcjsKKyAgICAgIGlmIChyaWdodCA+PSA4MCkKKyAgICAgICAgcmRpciA9IC0xMDsKKyAgICAgIGVsc2UgaWYgKHJpZ2h0IDwgMTApCisgICAgICAgIHJkaXIgPSAxMDsKKworICAgICAgbWVzc2FnZSA9CisgICAgICAgICAgZ3N0X2J1c19wb2xsIChHU1RfRUxFTUVOVF9CVVMgKHBpcGUpLCBHU1RfTUVTU0FHRV9FUlJPUiwKKyAgICAgICAgICA1MCAqIEdTVF9NU0VDT05EKTsKKyAgICAgIGlmIChtZXNzYWdlKSB7CisgICAgICAgIGdfcHJpbnQgKCJnb3QgZXJyb3IgICAgICAgICAgIFxuIik7CisKKyAgICAgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgfQorICAgIH0KKyAgICBnX3ByaW50ICgidGVzdCAlZCBkb25lICAgICAgICAgICAgICAgICAgICBcbiIsIHR5cGUpOworCisgICAgZ3N0X29iamVjdF91bnJlZiAoY3JvcCk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlLCBHU1RfU1RBVEVfTlVMTCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocGlwZSk7CisKKyAgICB0eXBlKys7CisgICAgaWYgKHR5cGUgPT0gc3RvcCkKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaWNsZXMveGltYWdlc3JjLXRlc3QuYyBiL3Rlc3RzL2ljbGVzL3hpbWFnZXNyYy10ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjYzU4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ljbGVzL3hpbWFnZXNyYy10ZXN0LmMKQEAgLTAsMCArMSw3MCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK3N0YXRpYyBHTWFpbkxvb3AgKmxvb3A7CisKK3N0YXRpYyBnYm9vbGVhbgordGVybWluYXRlX3BsYXliYWNrIChHc3RFbGVtZW50ICogcGlwZWxpbmUpCit7CisgIGdfcHJpbnQgKCJUZXJtaW5hdGluZyBwbGF5YmFja1xuIik7CisgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICByZXR1cm4gRkFMU0U7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0U3RhdGUgc3RhdGU7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworCisgIGdzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIHBpcGVsaW5lID0gZ3N0X3BhcnNlX2xhdW5jaCAoInhpbWFnZXNyYyAhIGZha2VzaW5rIiwgJmVycm9yKTsKKyAgaWYgKGVycm9yKSB7CisgICAgZ19wcmludCAoIkVycm9yIHdoaWxlIHBhcnNpbmcgcGlwZWxpbmUgZGVzY3JpcHRpb246ICVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgRkFMU0UpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICAvKiBsZXRzIGNoZWNrIGl0IGdldHMgdG8gUExBWUlORyAqLworICBpZiAoZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChwaXBlbGluZSwgJnN0YXRlLCBOVUxMLAorICAgICAgICAgIEdTVF9DTE9DS19USU1FX05PTkUpID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSB8fAorICAgICAgc3RhdGUgIT0gR1NUX1NUQVRFX1BMQVlJTkcpIHsKKyAgICBnX3dhcm5pbmcgKCJTdGF0ZSBjaGFuZ2UgdG8gcGxheWluZyBmYWlsZWQiKTsKKyAgfQorCisgIC8qIFdlIHdhbnQgdG8gZ2V0IG91dCBhZnRlciA1IHNlY29uZHMgKi8KKyAgZ190aW1lb3V0X2FkZF9zZWNvbmRzICg1LCAoR1NvdXJjZUZ1bmMpIHRlcm1pbmF0ZV9wbGF5YmFjaywgcGlwZWxpbmUpOworCisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgZ19tYWluX2xvb3BfdW5yZWYgKGxvb3ApOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzb24uYnVpbGQgYi90ZXN0cy9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2YwZTViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVzb24uYnVpbGQKQEAgLTAsMCArMSw3IEBACisjIEZJWE1FOiBtYWtlIGNoZWNrIHdvcmsgb24gd2luZG93cworaWYgaG9zdF9tYWNoaW5lLnN5c3RlbSgpICE9ICd3aW5kb3dzJworc3ViZGlyKCdjaGVjaycpCitlbmRpZgorCitzdWJkaXIoJ2ljbGVzJykKK3N1YmRpcignZXhhbXBsZXMnKQo=